ZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L01PRFVMRV9MSUNFTlNFX0dQTCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L01PRFVMRV9MSUNFTlNFX0dQTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvTU9EVUxFX0xJQ0VOU0VfR1BMCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9OT1RJQ0UgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzYjYyNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L05PVElDRQpAQCAtMCwwICsxLDM0MCBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyICBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvUEFDS0FHRV9TT1VSQ0VTIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvUEFDS0FHRV9TT1VSQ0VTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZDcxZDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9QQUNLQUdFX1NPVVJDRVMKQEAgLTAsMCArMSw3OSBAQAorbGliYWNsMS1kZXZfMi4yLjUxLTV1YnVudHUxX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyYTUyNGQ0MmM5NTVmN2M5MDkzZDdlYmFmYjdjMmI5NzBiNGI1NzVlCitsaWJhY2wxLWRldl8yLjIuNTEtNXVidW50dTFfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA0ZDk2ZGZlMTI4NGY4YTA2MDE2ZDFkNWE3ODM3MmIyZTNkZjU3MjgKK2xpYmFjbDFfMi4yLjUxLTV1YnVudHUxX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ2NDJkY2I4MTVmMjIwZTk4Yzc1NjEyMzZiNzdiZThkMjIxOTlmNQorbGliYWNsMV8yLjIuNTEtNXVidW50dTFfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmMzliZGNhOWU1Y2Y3NjdhNWFmNmMzMTgwY2M5YjFlMDhmNGE2NDdkCitsaWJhc291bmQyLWRldl8xLjAuMjUtMXVidW50dTEwX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgIGM0NjU2YzczN2UzMDllMjk2YjQxMzBkZDM0ZDI5MTJjYzZhYWUzNjEKK2xpYmFzb3VuZDItZGV2XzEuMC4yNS0xdWJ1bnR1MTBfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgMGFiMTMxYWU5ZTA1YTZmYzU2NWRlNWQ4MTY1NTcxMzVlYTljYWU2YQorbGliYXNvdW5kMl8xLjAuMjUtMXVidW50dTEwX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjM2ZjMWFkNjEyMmU4ZmZlMDFmYTE4ZTczZDU2ZjkzYTRhMDI3YjE0CitsaWJhc291bmQyXzEuMC4yNS0xdWJ1bnR1MTBfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmMDA4YWRmYzAwNDU0YTI4N2U3MTU3YWE4Y2MyYmU3MTk4ZWZjYzQKK2xpYmF0dHIxLWRldl8yLjQuNDYtNXVidW50dTFfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgZjIyYzQ0MzZlYWIzMmE4ZTBjZWQ4NGM2NzU0ZWQyYmM5ZmFjYzc5ZQorbGliYXR0cjEtZGV2XzIuNC40Ni01dWJ1bnR1MV9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmIwMGY4NDQyM2E5MzI4MTAxZGNhOTBjNDMxNzYwODYxNzFhNTEyCitsaWJhdHRyMV8yLjQuNDYtNXVidW50dTFfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxN2NjOGUwYjU0Yjk4MjE2OTlhMzI0ZDViYzVlMjMyODllNDM0MzQKK2xpYmF0dHIxXzIuNC40Ni01dWJ1bnR1MV9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWViZTZkNjJiM2UyN2EwNTYyZWVkYjk5M2FhMmUxMjU3ZTIyYjg4NgorbGliYXVkaW9maWxlLWRldl8wLjMuMy0yX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZGM5YzYyNzYzNDgwMmJkZWQ2NzRlOTJlNDlmOGM5N2ZlNTc5ZGQzCitsaWJhdWRpb2ZpbGUtZGV2XzAuMy4zLTJfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA3ODMxNGNkZDE3NTE5ZWJkZjBmM2U1NDBhNjE5NjFkMTJlNWMwZDAKK2xpYmM2LWRldl8yLjE1LTB1YnVudHUxMF9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjBlYzRkMWFhNzZkZmYwMzFlM2MwZWNlMTljMWQ1Y2U4Y2M3ZTRkNQorbGliYzYtZGV2XzIuMTUtMHVidW50dTEwX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWIwODVhNzIyMDI5M2VkMjNhYzFiMDA5YjkwNzdhOWQ5NWIwNjI0CitsaWJjNl8yLjE1LTB1YnVudHUxMF9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY5ZTkyNGZkOGM3MjdlNmRkMWNkM2RkODk3YzFhYWQyMTcwNzFmNWIKK2xpYmM2XzIuMTUtMHVidW50dTEwX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjNiN2YxMDUxNWZjODk1MjY0NmIxMmQxNTM5MmE5ODg1YTU1ZDVjMQorbGliY2FwLWRldl8yLjIyLTF1YnVudHUzX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZDAyZTE3NzlmMDJkNDI2N2UwOTRmN2RmY2U3MWY1MWRjOTA2ZTFjCitsaWJjYXAtZGV2XzIuMjItMXVidW50dTNfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDZmMjU4NTI0MWIxMjY2ZWEwN2VkYzI5OTYwOTA0MjhiYjMyZGI4NTcKK2xpYmNhcDJfMi4yMi0xdWJ1bnR1M19hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTBkNjYyYWI3MmM3MWE4MjNkODVhMGFlZTE3ZDhiMzAyMWZhMzRiYgorbGliY2FwMl8yLjIyLTF1YnVudHUzX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjNmQzZTI2YTkyMDA5NWY5YTI3OTgzNGFiNGYwZGYwNmY0NDZjYTE3CitsaWJkcm0yXzIuNC4zMi0xdWJ1bnR1MV9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3ODA4MDA4NDI5NTJiYmViZjBmNGFkYWExYTdjMzQ3YmUzYzQwOTYKK2xpYmRybTJfMi40LjMyLTF1YnVudHUxX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMmU3NzE3OGU1OWFjOWY4MzdjYWQ1YzEwZTQ0YTc1ODJiZDk4MzI0YworbGliZXNkMC1kZXZfMC4yLjQxLTEwYnVpbGQzX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MjczMjQ1NmE4YTliNTQ2Y2MyMGNlZmZmNjE5MTQ2Zjk1YTBmODczCitsaWJlc2QwLWRldl8wLjIuNDEtMTBidWlsZDNfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM2ZDM1MjEwMjljZTZiMDgyZGZkNTdiNDk5ZWU4MjNhMmEzODM3NzAKK2xpYmdsMS1tZXNhLWRldl84LjAuMi0wdWJ1bnR1M19hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgN2I2MWQ0ZTI0NGU3Y2U0ZDkzY2QyMDZiYjA1MWExODFiNmY4OWQzNgorbGliZ2wxLW1lc2EtZGV2XzguMC4yLTB1YnVudHUzX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICBjMWMwZmUxYTgzY2M5Yjc3NmNlMGYzOGM1YzZiYjU1MjBlM2Y0MjliCitsaWJnbDEtbWVzYS1nbHhfOC4wLjItMHVidW50dTNfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgIGE0OTc4Y2ZiNWRmNTE3YTYxZTdiNWY1M2U0ZDUyMDJkNjViYmZkZjMKK2xpYmdsMS1tZXNhLWdseF84LjAuMi0wdWJ1bnR1M19pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgODQ0ODgxYjA5OWY5YzRiYmQ0ZjkzYmM0NzZhZTA5OGZlMmQ0YzljNworbGlibmN1cnNlczUtZGV2XzUuOS00X2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYzM0MTI2YmI3YmIwYmNhYjExNWUxODg5Y2MxNGFkZGY4MzJiNjMzCitsaWJuY3Vyc2VzNS1kZXZfNS45LTRfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiZDgzZmI0Mzk2ZDg0ZWJkZmZhYjQ1ZjgwNzhlODQxYzlkNzJjOTEKK2xpYm5jdXJzZXM1XzUuOS00X2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM5YzI1OTUzMzk4YTYyM2ViZDJhZTZjMmNkYTNmOTllZTdhNTRhMAorbGlibmN1cnNlczVfNS45LTRfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ZmJmYjc4MmYyYmM5ZTYzZmY3YWYwMDA3MGNhMTM2MzhlZjAyNDdlCitsaWJwdWxzZS1kZXZfMS4xLTB1YnVudHUxNV9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDNmMDA4ODdhODlhZGU4YTI4Y2Y2ZDQzODY0Nzg0OTllYzgyYTdlN2MKK2xpYnB1bHNlLWRldl8xLjEtMHVidW50dTE1X2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgN2E3ZjNhMGM0YmY1NmJiOTczZGFhYTMzMzA4YTdmODkwMGYxMzM0NQorbGlicHVsc2UwXzEuMS0wdWJ1bnR1MTVfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYjUzNTQ0ZGMwMGIzYjAxZDZmNDQzNjdjODk4M2IwY2ZkNDJjYjViCitsaWJwdWxzZTBfMS4xLTB1YnVudHUxNV9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUzMDI0ZjI4OThhN2EwM2VhMzNlNGRjOTBmZTBlYTRhYjI4MDk5ZjgKK2xpYnRpbmZvLWRldl81LjktNF9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMWRiNDU4MjBlZjU1Y2Y3ZDRhM2IxZGVlMTc3Y2E5OTgxMTVlMmEwMgorbGlidGluZm8tZGV2XzUuOS00X2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlNjk4ODIwYjMwODNmMTIzZjBjOGI1OTU1YjY0MDE2YTgzNDJkODlkCitsaWJ0aW5mbzVfNS45LTRfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYyODliZDBkZTgwYzc2NjY0MGYzNmE2YzllN2YxODU3N2YyNjg2NDAKK2xpYnRpbmZvNV81LjktNF9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgM2JlOWIzYjU0MDM3ODgxZjMzMzU3N2FmZTQ3OWJhNjEwYTcxZDQ5YgorbGlieDExLTZfMS40Ljk5LjEtMHVidW50dTJfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwY2M3Nzg3ZTg1NTJmNjc2ZTI5OTRkMGEyZTU3OWVlNTdhYmU1ZjhmCitsaWJ4MTEtNl8xLjQuOTkuMS0wdWJ1bnR1Ml9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1NGM0NTliYjE3OTI0MjU0NWJjNjhiMmY3ZDk1YWE2MGQyYmQ0ZWQKK2xpYngxMS1kZXZfMS40Ljk5LjEtMHVidW50dTJfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgMWU3MTcxYzBlN2RhYWZkMjYyYjgxNGExZmNiODNkNmVkZWQ2ZWYwZAorbGlieDExLWRldl8xLjQuOTkuMS0wdWJ1bnR1Ml9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NDkzZDA4NzBmYzAzNzJhYjQ5YzJjOWRkNDk2ZGJkNmFkMTMwZGNjCitsaWJ4YXU2XzEuMC42LTRfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5YjY1ZWEwNDBhNmJmMWRkZTJlMWU2MzQyMmNiMTU4MDk1YmYyYTIKK2xpYnhhdTZfMS4wLjYtNF9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNWQxOTQyYWM2OGIzYTMxZTBlZWFiNjZkZjA3ODRkYmFiZTk0MzZiNQorbGlieGNiMS1kZXZfMS44LjEtMV9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzIzZmFjYzg3NzZmNDliZDI3ZWI2YTRlZTMyMzUwMzcyYmE0ZjI4CitsaWJ4Y2IxLWRldl8xLjguMS0xX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjM2RiNDVkODcyNGE5OTc3NzA3ODI1OGZmOGNkNGU4ZmUzOGNhODMKK2xpYnhkYW1hZ2UxXzEuMS4zLTJidWlsZDFfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzUxNmY0MjNhMzg2NmVhNmE4ZTUwZDE3MTQ4OGE2ZmU1ZGY5ODIzZgorbGlieGRhbWFnZTFfMS4xLjMtMmJ1aWxkMV9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjNDk2Mjk5MmRiY2JkMGU0Njg5MGJhNzIzYWQ5N2JiNmY5YzMzYjY5CitsaWJ4ZG1jcDZfMS4xLjAtNF9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk1M2I2OGFlM2FjODRlYzRiNGRhMjgzZGI3MTZhN2U3MTNiZjM4ZDkKK2xpYnhkbWNwNl8xLjEuMC00X2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTdmZWRkOGVkMzg5ZGY2Yzk3Zjc1NDBmNzVlNzc2NjFmMTIzOTI5MQorbGlieGV4dC1kZXZfMS4zLjAtM2J1aWxkMV9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2YzdhZjc3YjEzYjJkY2ExNGVkNjk2NDk1ZGI3MmI1OGQ5OWIzZDVmCitsaWJ4ZXh0LWRldl8xLjMuMC0zYnVpbGQxX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhZWRlY2MxNDVjZTVmN2Y2MTA0NTlmNDIwOGZiMGY0NTg2MDEzZmEKK2xpYnhleHQ2XzEuMy4wLTNidWlsZDFfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzU4ZTQzY2ViOThhNGY5MjliYjNiOTIwMGYzNmYxMGRiYjRmYTBhZAorbGlieGV4dDZfMS4zLjAtM2J1aWxkMV9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MmIyMGZiNTc2M2I5ZDVmNGEyMzI2NDhhNTNkMzcxMWUzNDdlODg5CitsaWJ4Zml4ZXMtZGV2XzUuMC00dWJ1bnR1NF9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIyZTc0MmJmZDExNGNhNmJmYmUwZjcyMTJhY2JiMDA5ZTcyYzFkYWYKK2xpYnhmaXhlcy1kZXZfNS4wLTR1YnVudHU0X2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDcxN2VhYmRkOTBlMGZjNDQ0ZjEyYzYwYmM0NjQwODBkMmRkNzUzYQorbGlieGZpeGVzM181LjAtNHVidW50dTRfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzZGQ2ZTg0ZWM0OGEyMGNjOGY3YmFkMDA1NDM2ZTE3Y2I4YjI1ZGI2CitsaWJ4Zml4ZXMzXzUuMC00dWJ1bnR1NF9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDlkNjhkNTMxMWRlYWY2NmFkNjk3YmI5N2M3NTRkNGQ4MjZjNWU3NjEKK2xpYnhpLWRldl8xLjYuMC0wdWJ1bnR1Ml9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc2Y2M3Zjk5MjM5NDkzYmJhNGQ1YjZkMzFjZmVmODQzNzY5NDk5NQorbGlieGktZGV2XzEuNi4wLTB1YnVudHUyX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MmZlMGY0ZGRhMGEwNGFiNGMxMjdiODJmNThmZjRjZmY0OWQ1MzcxCitsaWJ4eGY4NnZtMV8xLjEuMS0yYnVpbGQxX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyNDlhY2MyNzk5ZTYxOGMyNGQ1ZDJiMjIzZmQzZGMwOTVlODRjZWQKK2xpYnh4Zjg2dm0xXzEuMS4xLTJidWlsZDFfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODE4NmRkZTgzOTU0YjNkZDVmZGI3M2JkMGFkNWFjZmMyN2NjNzE0YworbGludXgtbGliYy1kZXZfMy4yLjAtMjMuMzZfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjNzk2NWQ0MDA4YTJhMzNmYTM0YTJkYzc3MTJlYTFmMDY5ZDcxOThlCitsaW51eC1saWJjLWRldl8zLjIuMC0yMy4zNl9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNzYwNzM2ZGFiMGQ0YTkxNjc4ODQxNjA1NDExZDU5ZTc2MDAwNTAKK21lc2EtY29tbW9uLWRldl84LjAuMi0wdWJ1bnR1M19hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgNzIwODNiNGZlNDc4NDc3YTI1ZmQ0MmE2MGIwZTk2ODk1MTA3ZTM0OQorbWVzYS1jb21tb24tZGV2XzguMC4yLTB1YnVudHUzX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAyY2MyMmVhYjJkMWZjZDgyZDE1NTFmMTc1NGE2YjRiNTkzZGNjMGE5Cit4MTFwcm90by1jb3JlLWRldl83LjAuMjItMV9hbGwuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyYjA3Y2VhZjU1YTA3ZWMwMGQxMzgxYzBlYzI1Yjc2ZDZkY2YzN2MKK3gxMXByb3RvLWZpeGVzLWRldl81LjAtMnVidW50dTFfYWxsLmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgZWZlZjlkNWNjZTliOTFhMjM3YzgxYWU5MzA1MmQzNjI3ZGQwNzFiMgoreDExcHJvdG8taW5wdXQtZGV2XzIuMS45OS42LTFfYWxsLmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWQ0ZTFkYjJmYjRiZmQ3NjkyNGUzZWFjZjBkNjg5ZmVlYTI4ODcwCit4MTFwcm90by1rYi1kZXZfMS4wLjUtMl9hbGwuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk1ZTczMmQ2NjAyMWEwNWJhZTFlMDk5OTc3MTdhM2U3ZmY5ZWY4YjcKK3gxMXByb3RvLXhleHQtZGV2XzcuMi4wLTNfYWxsLmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjhkODQ3NmQ4NDUyM2NiM2M1NzRlYTQzMjM3OTQzYzNhZTEzODM2OAoremxpYjFnLWRldl8xLjIuMy40LmRmc2ctM3VidW50dTRfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICA4YjBlZDZhODc2YmU5YzI5MzljODQ2ODc3ZTZmY2YxNTJjYmFjN2IxCit6bGliMWctZGV2XzEuMi4zLjQuZGZzZy0zdWJ1bnR1NF9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgIGQzMjUzZWEzYTE5NTA3ZDRjYjY5ZGY2NDk1MmI5ZjFlOThjODJhYzEKK3psaWIxZ18xLjIuMy40LmRmc2ctM3VidW50dTRfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgYmJiODYyMDI5ZGIyZDFiOGZjNWZkY2MwZWRmNjFkZWYyNDA1OTBhZgoremxpYjFnXzEuMi4zLjQuZGZzZy0zdWJ1bnR1NF9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMDAwZThmNzAzOTgzZTQyOTlkMzJhNTk1MTIwMGUzZjk1MzFhZmU5CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9UT09MQ0hBSU5fU09VUkNFUyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L1RPT0xDSEFJTl9TT1VSQ0VTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZGE1MmEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9UT09MQ0hBSU5fU09VUkNFUwpAQCAtMCwwICsxLDEwIEBACit0b29sY2hhaW4vYmludXRpbHMuZ2l0OiAgICAgICAgICBjOGUxNjM2NDkzZjdkNDBiYjBiYTM3NTAxZTlhNmY2N2NkMDYyYTMxIFsyLjI0XSBDb3J0ZXgtQTUzIGVycmF0dW0gODM1NzY5IGxpbmtlciB3b3JrYXJvdW5kIFRoaXMgaXMgcG9ydGVkIGZyb20gdXBzdHJlYW0gYmludXRpbHMgMi4yNCBicmFuY2ggICBjb21taXQ6IGNkZTk4Zjg1NjZlMTRmNTJiODk2YWJjOTJjMzU3Y2RkMTQ3MTc1MDUKK3Rvb2xjaGFpbi9idWlsZC5naXQ6ICAgICAgICAgICAgIDc1NTQyZTc3YjU2NWMyYWY5NjhlNDhjMWIxMmIzMmYzNDNkOTEzYWUgRml4IGJpbnV0aWxzLTIuMjQgZGV0ZWN0aW9uCit0b29sY2hhaW4vZ2NjLmdpdDogICAgICAgICAgICAgICBiYTIxMTIyYzYzYjA2YTcwYjYyMGM4OTkwYzUxN2I4NzE5OGFkMDViIFs0LjldIFJlc3RvcmUgcmVjb2cgc3RhdGUgYWZ0ZXIgZmluZGluZyBwcmUtbWFkZCBpbnN0cnVjdGlvbi4gVGhpcyBwYXRjaCBiYWNrcG9ydHMgc3ZuIHIyMTY4NTMgZnJvbSB1cHN0ZWFtIGdjYy00LjkgYnJhbmNoIHRoYXQgZml4ZWQgYSBidWcgaW50cm9kdWNlZCBpbiBmaXhpbmcgY29ydGV4IGE1MyBlcnJhdHVtIDgzNTc2OS4KK3Rvb2xjaGFpbi9nZGIuZ2l0OiAgICAgICAgICAgICAgIDI0MjM3YmM4YmMzMDAxYTgyZDZjZDk2ODU3MTljNDY3OWY3MjE3OTIgZml4IHNvbWUgYnVpbGQgZXJyb3JzCit0b29sY2hhaW4vZ29sZC5naXQ6ICAgICAgICAgICAgICA4ZDQwMWNmNzExNTM5YWY1YTJmNzhkMTI0NDczNDFkNzc0ODkyNjE4IEVtcHR5IGluaXRpYWwgY29tbWl0LgordG9vbGNoYWluL2dtcC5naXQ6ICAgICAgICAgICAgICAgZTZiOTY2OWRhZmM2YTVmODNjODBiNGI0MTc2MzU5Yjc4YmNjZGM5MCBBZGQgZ21wLTUuMC41LnRhci5iejIKK3Rvb2xjaGFpbi9tcGZyLmdpdDogICAgICAgICAgICAgIGJmY2YxYmZhMzg0NjkyMDhhYWFkODg3M2NkNGM2ODc4MTA2MWQ5MGYgYWRkIG1wZnItMy4xLjEudGFyLmJ6MgordG9vbGNoYWluL21wYy5naXQ6ICAgICAgICAgICAgICAgODM1ZDE2ZTkyZWVkODc1NjM4YThiNWQ1NTIwMzRjM2IxYWFlMDQ1YiBhZGQgbXBjLTEuMC4xLnRhci5negordG9vbGNoYWluL2lzbC5naXQ6ICAgICAgICAgICAgICAgYjA1ZDQ1NzI5NThjNWQ0OTdkYTc5M2YzMzE3MDg0YmFiOTBjMzAzMyBhZGQgaXNsLTAuMTEuMS50YXIuYnoyIG5lZWRlZCBieSBHQ0MgNC44IHdpdGggZ3JhcGhpdGUKK3Rvb2xjaGFpbi9jbG9vZy5naXQ6ICAgICAgICAgICAgIDk4OTcyZDU0MzRmZmNiNGQxMWQyYzgxYTQ2NjAwZTlhMWNkYTkxMTAgTWluR1ctdzY0IGJ1aWxkIGZpeCAobGFja3MgZmZzIGRlY2xhcmF0aW9uKQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL2Nsb29nIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL2Nsb29nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIwYTZiMGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4vY2xvb2cKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1hZGRyMmxpbmUgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWFkZHIybGluZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MDIxYzA0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1hZGRyMmxpbmUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1hciBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2Jpbi94ODZfNjQtbGludXgtYXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDBhNDRiNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2Jpbi94ODZfNjQtbGludXgtYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1hcyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2Jpbi94ODZfNjQtbGludXgtYXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQ5NzNkYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2Jpbi94ODZfNjQtbGludXgtYXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1jKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWMrKwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZjQ4ZTM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1jKysKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1jKytmaWx0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1jKytmaWx0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2MGZkMGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWMrK2ZpbHQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1jcHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDk2MzNkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1jcHAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1lbGZlZGl0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1lbGZlZGl0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlNWRiMzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWVsZmVkaXQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWcrKwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZjQ4ZTM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nKysKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nY2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWdjYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZmIyZDFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nY2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nY2MtNC44IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nY2MtNC44Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmYjJkMWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWdjYy00LjgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nY2MtYXIgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWdjYy1hcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMjkwZTlhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nY2MtYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nY2Mtbm0gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWdjYy1ubQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMzkyMjMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nY2Mtbm0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nY2MtcmFubGliIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nY2MtcmFubGliCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkN2Q1YmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWdjYy1yYW5saWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nY292IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1nY292Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhmMTYwNGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWdjb3YKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1ncHJvZiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2Jpbi94ODZfNjQtbGludXgtZ3Byb2YKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjZkZWVlYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2Jpbi94ODZfNjQtbGludXgtZ3Byb2YKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1sZCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2Jpbi94ODZfNjQtbGludXgtbGQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWVhNWFhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2Jpbi94ODZfNjQtbGludXgtbGQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1sZC5iZmQgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWxkLmJmZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43OTdmYzBkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1sZC5iZmQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1sZC5nb2xkIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1sZC5nb2xkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlYTVhYTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LWxkLmdvbGQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1ubSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2Jpbi94ODZfNjQtbGludXgtbm0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjhlZDIyOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2Jpbi94ODZfNjQtbGludXgtbm0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1vYmpjb3B5IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1vYmpjb3B5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY0NWZmMzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LW9iamNvcHkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1vYmpkdW1wIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1vYmpkdW1wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIyNGZmOWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LW9iamR1bXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1yYW5saWIgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LXJhbmxpYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMmY3MmNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1yYW5saWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1yZWFkZWxmIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1yZWFkZWxmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRhMGY5ODYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LXJlYWRlbGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1zaXplIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1zaXplCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2Yjc5YzIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LXNpemUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1zdHJpbmdzIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1zdHJpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM1NjYyYWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9iaW4veDg2XzY0LWxpbnV4LXN0cmluZ3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYmluL3g4Nl82NC1saW51eC1zdHJpcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2Jpbi94ODZfNjQtbGludXgtc3RyaXAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjFmNWY3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2Jpbi94ODZfNjQtbGludXgtc3RyaXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYnVpbGQtcHJlY2lzZS1tdWx0aWxpYi10b29sY2hhaW4uc2ggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9idWlsZC1wcmVjaXNlLW11bHRpbGliLXRvb2xjaGFpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMmEyZWY0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvYnVpbGQtcHJlY2lzZS1tdWx0aWxpYi10b29sY2hhaW4uc2gKQEAgLTAsMCArMSwxODIwIEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIHJlYnVpbGQgdGhlIExpbnV4IDMyLWJpdCBjcm9zcy10b29sY2hhaW4KKyMgdGhhdCBhbGxvd3MgeW91IHRvIGdlbmVyYXRlIDMyLWJpdCBiaW5hcmllcyB0aGF0IHRhcmdldCBVYnVudHUgOC4wNAorIyAoYS5rLmEuIEhhcmR5IEhlcm9uKSBpbnN0ZWFkIG9mIHRoZSBob3N0IHN5c3RlbSAod2hpY2ggdXN1YWxseSBpcyAxMC4wNCwKKyMgYS5rLmEuIEx1Y2lkIEx5bngpCisjCisjIFVzZSAtLWhlbHAgZm9yIGNvbXBsZXRlIHVzYWdlIGluZm9ybWF0aW9uLgorIworIyBXQVJOSU5HOiBBdCB0aGlzIHRpbWUsIHRoZSBnZW5lcmF0ZWQgdG9vbGNoYWluIGJpbmFyaWVzIHdpbGwgKm5vdCogcnVuCisjICAgICAgICAgIHdpdGggR0xpYmMgMi4xNSwgb25seSB0aGUgbWFjaGluZSBjb2RlIGl0IGdlbmVyYXRlcy4KKyMKKworUFJPR05BTUU9ImBiYXNlbmFtZSBcIiQwXCJgIgorUEFUQ0hFU19ESVI9IiQoIGNkICIkKCBkaXJuYW1lICIkMCIgKSIgJiYgcHdkICkvdG9vbGNoYWluLXBhdGNoZXMiCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIworIyMjIyMgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4KKyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitwYW5pYyAoKQoreworICAgIGVjaG8gIkVSUk9SOiAkQCIKKyAgICBleGl0IDEKK30KKworZmFpbF9wYW5pYyAoKQoreworICAgIGlmIFsgJD8gIT0gMCBdIDsgdGhlbgorICAgICAgICBlY2hvICJFUlJPUjogJEAiCisgICAgICAgIGV4aXQgMQorICAgIGZpCit9CisKKworIyBXZSBvbmx5IHN1cHBvcnQgcnVubmluZyB0aGlzIHNjcmlwdCBvbiBMaW51eAorT1M9JCh1bmFtZSAtcykKK2lmIFsgIiRPUyIgIT0gTGludXggXTsgdGhlbgorICAgIHBhbmljICJUaGlzIHNjcmlwdCBjYW4gb25seSBydW4gb24gTGludXggbWFjaGluZXMhIgorZmkKKworVUJVTlRVX0FSQ0hTPSJpMzg2IGFtZDY0IgorCisjIFVzZWQgdG8gc2V0IHRoZSBob3N0IGJpdG5lc3Mgb2YgdGhlIGdlbmVydGVkIHRvb2xjaGFpbiBiaW5hcmllcworIyBGaXJzdCBjYWxsIHdpdGggdGhlIGJ1aWxkIG1hY2hpbmUncyBiaXRuZXNzLCBhbmQgbGF0ZXIgd2l0aCAzMgorIyBpZiAtLTMyLWJpdHMgb3B0aW9uIGlzIHVzZWQuCisjICQxOiAzMiBvciA2NAorc2V0X2hvc3RfYml0cyAoKQoreworICAgIEhPU1RfQklUUz0kMQorICAgIEdNUF9BQkk9JDEKKyAgICBjYXNlICQxIGluCisgICAgICAgIDMyKQorICAgICAgICAgICAgSE9TVF9BUkNIPWk2ODYKKyAgICAgICAgICAgIEdDQ19UQVJHRVQ9aTY4Ni1saW51eAorICAgICAgICAgICAgR01QX1RBUkdFVD1pMzg2LWxpbnV4CisgICAgICAgICAgICA7OworICAgICAgICA2NCkKKyAgICAgICAgICAgIEhPU1RfQVJDSD14ODZfNjQKKyAgICAgICAgICAgIEdDQ19UQVJHRVQ9eDg2XzY0LWxpbnV4CisgICAgICAgICAgICBHTVBfVEFSR0VUPXg4Nl82NC1saW51eAorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIHBhbmljICJJbnZhbGlkIGhvc3QgYml0bmVzcyAoMzIgb3IgNjQgZXhwZWN0ZWQpOiAkMSIKKyAgICBlc2FjCit9CisKKyMgRGV0ZXJtaW5lIGJ1aWxkIG1hY2hpbmUgYml0bmVzcworQlVJTERfQVJDSD0kKHVuYW1lIC1tKQorY2FzZSAiJEJVSUxEX0FSQ0giIGluCisgICAgeDg2XzY0fGFtZDY0KQorICAgICAgICBCVUlMRF9CSVRTPTY0CisgICAgICAgIEJVSUxEX0FSQ0g9eDg2XzY0CisgICAgICAgIEJVSUxEX0dDQ19UQVJHRVQ9eDg2XzY0LWxpbnV4CisgICAgICAgIHNldF9ob3N0X2JpdHMgNjQKKyAgICAgICAgOzsKKyAgICBpPzg2KQorICAgICAgICBCVUlMRF9CSVRTPTMyCisgICAgICAgIEJVSUxEX0FSQ0g9aTY4NgorICAgICAgICBCVUlMRF9HQ0NfVEFSR0VUPWk2ODYtbGludXgKKyAgICAgICAgc2V0X2hvc3RfYml0cyAzMgorICAgICAgICA7OworICAgICopCisgICAgICAgIHBhbmljICJVbmtub3duIGJ1aWxkIENQVSBhcmNoaXRlY3R1cmU6ICRCVUlMRF9BUkNIIgorZXNhYworCisjIFZlcnNpb25zIG9mIHZhcmlvdXMgdG9vbGNoYWluIGNvbXBvbmVudHMsIGRvIG5vdCB0b3VjaCB1bmxlc3MgeW91IGtub3cKKyMgd2hhdCB5b3UncmUgZG9pbmchCisKK0JJTlVUSUxTX1ZFUlNJT049Mi4yMworR01QX1ZFUlNJT049NS4wLjUKK01QRlJfVkVSU0lPTj0zLjEuMQorTVBDX1ZFUlNJT049MS4wLjEKK0dDQ19WRVJTSU9OPTQuOAorQ0xPT0dfVkVSU0lPTj0wLjE4LjAKK0lTTF9WRVJTSU9OPTAuMTEuMQorCitHTElCQ19WRVJTSU9OPTIuMTUKKworR0lUX0NNRD1naXQKK0dJVF9EQVRFPQorR0lUX0JSQU5DSD1tYXN0ZXIKK0dJVF9SRUZFUkVOQ0U9CitHSVRfQkFTRT0KK0dJVF9CQVNFX0RFRkFVTFQ9aHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vdG9vbGNoYWluCisKKyMgTG9jYXRpb24gd2hlcmUgd2UncmUgZ29pbmcgdG8gaW5zdGFsbCB0aGUgdG9vbGNoYWluIGR1cmluZyB0aGUgYnVpbGQKKyMgVGhpcyB3aWxsIGRlcGVuZCBvbiB0aGUgcGhhc2Ugb2YgdGhlIGJ1aWxkLgoraW5zdGFsbF9kaXIgKCkgeyBlY2hvICIkV09SS19ESVIvJFBIQVNFLyRUT09MQ0hBSU5fTkFNRSI7IH0KKworIyBHaXZlbiBhbiBpbnB1dCBzdHJpbmcgdGhhdCBsb29rcyBsaWtlIDxtYWpvcj4uPG1pbm9yPi48cGF0Y2g+CisjIFJldHVybiA8bWFqb3I+LjxtaW5vcj4gb25seS4KK21ham9yX21pbm9yX29ubHkgKCkgeworICAgbG9jYWwgTUFKT1I9JChlY2hvIC1uICIkMSIgfCBjdXQgLWYxIC1kLikKKyAgIGxvY2FsIE1JTk9SPSQoZWNobyAtbiAiJDEiIHwgY3V0IC1mMiAtZC4pCisgICBlY2hvICIkTUFKT1IuJE1JTk9SIgorfQorCisjIExvY2F0aW9uIHdoZXJlIHdlJ3JlIGdvaW5nIHRvIGluc3RhbGwgdGhlIGZpbmFsIGJpbmFyaWVzCisjIElmIGVtcHR5LCBUT09MQ0hBSU5fQVJDSElWRSB3aWxsIGJlIGdlbmVyYXRlZAorUFJFRklYX0RJUj0KKworIyBMb2NhdGlvbiBvZiB0aGUgZmluYWwgc3lzcm9vdC4gVGhpcyBtdXN0IGJlIGEgc3ViLWRpcmVjdG9yeSBvZiBJTlNUQUxMX0RJUgorIyB0byBlbnN1cmUgdGhhdCB0aGUgdG9vbGNoYWluIGJpbmFyaWVzIGFyZSBwcm9wZXJseSByZWxvY2F0YWJsZSAoaS5lLiBjYW4KKyMgYmUgdXNlZCB3aGVuIG1vdmVkIHRvIGFub3RoZXIgZGlyZWN0b3J5KS4KK3N5c3Jvb3RfZGlyICgpIHsgZWNobyAiJChpbnN0YWxsX2Rpcikvc3lzcm9vdCI7IH0KKworIyBUcnkgdG8gcGFyYWxsZWxpemUgdGhlIGJ1aWxkIGZvciBmYXN0ZXIgcGVyZm9ybWFuY2UuCitKT0JTPSQoY2F0IC9wcm9jL2NwdWluZm8gfCBncmVwIC1jIHByb2Nlc3NvcikKKworIyBUaGUgYmFzZSBVUkwgb2YgdGhlIFVidW50dSBtaXJyb3Igd2UncmUgZ29pbmcgdG8gdXNlLgorVUJVTlRVX01JUlJPUj1odHRwOi8vbWlycm9ycy51cy5rZXJuZWwub3JnCisKKyMgVWJ1bnR1IHJlbGVhc2UgbmFtZSB3ZSB3YW50IHBhY2thZ2VzIGZyb20uIENhbiBiZSBhIG5hbWUgb3IgYSBudW1iZXIKKyMgKGkuZS4gInByZWNpc2UiIG9yICIxMi4wNCIpCitVQlVOVFVfUkVMRUFTRT1wcmVjaXNlCisKKworIyBUaGUgbGlzdCBvZiBwYWNrYWdlcyB3ZSBuZWVkIHRvIGRvd25sb2FkIGZyb20gdGhlIFVidW50dSBzZXJ2ZXJzIGFuZAorIyBleHRyYWN0IGludG8gdGhlIG9yaWdpbmFsIHN5c3Jvb3QKKyMKKyMgQ2FsbCBhZGRfdWJ1bnR1X3BhY2thZ2UgPHBhY2thZ2UtbmFtZT4gdG8gYWRkIGEgcGFja2FnZSB0byB0aGUgbGlzdCwKKyMgd2hpY2ggd2lsbCBiZSBwcm9jZXNzZWQgbGF0ZXIuCisjCitVQlVOVFVfUEFDS0FHRVM9CisKK2FkZF91YnVudHVfcGFja2FnZSAoKQoreworICAgIFVCVU5UVV9QQUNLQUdFUz0iJFVCVU5UVV9QQUNLQUdFUyAkQCIKK30KKworIyBUaGUgcGFja2FnZSBmaWxlcyBjb250YWluaW5nIGtlcm5lbCBoZWFkZXJzIGZvciBIYXJkeSBhbmQgdGhlIEMKKyMgbGlicmFyeSBoZWFkZXJzIGFuZCBiaW5hcmllcworYWRkX3VidW50dV9wYWNrYWdlIFwKKyAgICBsaW51eC1saWJjLWRldiBcCisgICAgbGliYzYgXAorICAgIGxpYmM2LWRldiBcCisgICAgbGliY2FwMiBcCisgICAgbGliY2FwLWRldiBcCisgICAgbGliYXR0cjEgXAorICAgIGxpYmF0dHIxLWRldiBcCisgICAgbGliYWNsMSBcCisgICAgbGliYWNsMS1kZXYgXAorCisjIFRoZSBYMTEgaGVhZGVycyBhbmQgYmluYXJpZXMgKGZvciB0aGUgZW11bGF0b3IpCithZGRfdWJ1bnR1X3BhY2thZ2UgXAorICAgIGxpYngxMS02IFwKKyAgICBsaWJ4MTEtZGV2IFwKKyAgICBsaWJ4YXU2IFwKKyAgICBsaWJ4Y2IxLWRldiBcCisgICAgbGlieGRtY3A2IFwKKyAgICBsaWJ4ZXh0LWRldiBcCisgICAgbGlieGZpeGVzLWRldiBcCisgICAgbGlieGktZGV2IFwKKyAgICB4MTFwcm90by1jb3JlLWRldiBcCisgICAgeDExcHJvdG8tZml4ZXMtZGV2IFwKKyAgICB4MTFwcm90by14ZXh0LWRldiBcCisgICAgeDExcHJvdG8taW5wdXQtZGV2IFwKKyAgICB4MTFwcm90by1rYi1kZXYKKworIyBUaGUgT3BlbkdMLXJlbGF0ZWQgaGVhZGVycyBhbmQgbGlicmFyaWVzIChmb3IgR0xFUyBlbXVsYXRpb24pCithZGRfdWJ1bnR1X3BhY2thZ2UgXAorICAgIG1lc2EtY29tbW9uLWRldiBcCisgICAgbGliZ2wxLW1lc2EtZGV2IFwKKyAgICBsaWJnbDEtbWVzYS1nbHggXAorICAgIGxpYnh4Zjg2dm0xIFwKKyAgICBsaWJ4ZXh0NiBcCisgICAgbGlieGRhbWFnZTEgXAorICAgIGxpYnhmaXhlczMgXAorICAgIGxpYmRybTIKKworIyBBdWRpbyBsaWJyYXJpZXMgKHJlcXVpcmVkIGJ5IHRoZSBlbXVsYXRvcikKK2FkZF91YnVudHVfcGFja2FnZSBcCisgICAgbGliYXNvdW5kMiBcCisgICAgbGliYXNvdW5kMi1kZXYgXAorICAgIGxpYmVzZDAtZGV2IFwKKyAgICBsaWJhdWRpb2ZpbGUtZGV2IFwKKyAgICBsaWJwdWxzZTAgXAorICAgIGxpYnB1bHNlLWRldgorCisjIFpMaWIgYW5kIG90aGVycy4KK2FkZF91YnVudHVfcGFja2FnZSBcCisgICAgemxpYjFnIFwKKyAgICB6bGliMWctZGV2IFwKKyAgICBsaWJuY3Vyc2VzNSBcCisgICAgbGlibmN1cnNlczUtZGV2IFwKKyAgICBsaWJ0aW5mbzUgXAorICAgIGxpYnRpbmZvLWRldgorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjCisjIyMjIyAgRSBOIEQgICBPIEYgICBDIE8gTiBGIEkgRyBVIFIgQSBUIEkgTyBOCisjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBQYXJzZSBhbGwgb3B0aW9ucworT1BUSU9OX0hFTFA9bm8KK1ZFUkJPU0U9MAorRk9SQ0U9bm8KK09OTFlfU1lTUk9PVD1ubworT05MWV9UT09MQ0hBSU5fRElSPQorQk9PVFNUUkFQPQorUEFSQU1FVEVSUz0KK0ZPUkNFXzMyPQorTElTVF9UQVNLUz0KKworZm9yIG9wdCBkbworICBvcHRhcmc9JChleHByICJ4JG9wdCIgOiAneFtePV0qPVwoLipcKScpCisgIGNhc2UgJG9wdCBpbgorICAtLWhlbHB8LWh8LVw/KSBPUFRJT05fSEVMUD15ZXMKKyAgOzsKKyAgLS12ZXJib3NlKSBWRVJCT1NFPSQoKCAkVkVSQk9TRSArIDEgKSkKKyAgOzsKKyAgLS1mb3JjZSkgRk9SQ0U9InllcyIKKyAgOzsKKyAgLS0zMi1iaXRzKSBGT1JDRV8zMj10cnVlCisgIDs7CisgIC0tdWJ1bnR1LW1pcnJvcj0qKSBVQlVOVFVfTUlSUk9SPSRvcHRhcmcKKyAgOzsKKyAgLS11YnVudHUtcmVsZWFzZT0qKSBVQlVOVFVfUkVMRUFTRT0kb3B0YXJnCisgIDs7CisgIC0tcHJlZml4PSopIFBSRUZJWF9ESVI9JG9wdGFyZworICA7OworICAtLXdvcmstZGlyPSopIFdPUktfRElSPSRvcHRhcmcKKyAgOzsKKyAgLS1nY2MtdmVyc2lvbj0qKSBHQ0NfVkVSU0lPTj0kb3B0YXJnCisgIDs7CisgIC0tYmludXRpbHMtdmVyc2lvbj0qKSBCSU5VVElMU19WRVJTSU9OPSRvcHRhcmcKKyAgOzsKKyAgLS1nbXAtdmVyc2lvbj0qKSBHTVBfVkVSU0lPTj0kb3B0YXJnCisgIDs7CisgIC0tbXBmci12ZXJzaW9uPSopIE1QRlJfVkVSU0lPTj0kb3B0YXJnCisgIDs7CisgIC0tbXBjLXZlcnNpb249KikgTVBDX1ZFUlNJT049JG9wdGFyZworICA7OworICAtLWlzbC12ZXJzaW9uPSopIElTTF9WRVJTSU9OPSRvcHRhcmcKKyAgOzsKKyAgLS1jbG9vZy12ZXJzaW9uPSopIENMT09HX1ZFUlNJT049JG9wYXJnCisgIDs7CisgIC0tZ2l0PSopIEdJVF9DTUQ9JG9wdGFyZworICA7OworICAtLWdpdC1kYXRlPSopIEdJVF9EQVRFPSRvcHRhcmcKKyAgOzsKKyAgLS1naXQtYnJhbmNoPSopIEdJVF9CUkFOQ0g9JG9wdGFyZworICA7OworICAtLWdpdC1iYXNlPSopIEdJVF9CQVNFPSRvcHRhcmcKKyAgOzsKKyAgLS1naXQtcmVmZXJlbmNlPSopIEdJVF9SRUZFUkVOQ0U9JG9wdGFyZworICA7OworICAtLW91dC1kaXI9KikgT1BUSU9OX09VVF9ESVI9JG9wdGFyZworICA7OworICAtLWNjPSopIE9QVElPTl9DQz0kb3B0YXJnCisgIDs7CisgIC0tam9icz0qKSBKT0JTPSRvcHRhcmcKKyAgOzsKKyAgLWoqKSBKT0JTPSR7b3B0Iy1qfQorICA7OworICAtLW9ubHktc3lzcm9vdCkgT05MWV9TWVNST09UPXllcworICA7OworICAtLWJvb3RzdHJhcCkgQk9PVFNUUkFQPXllcworICA7OworICAtLWxpc3QtdGFza3MpIExJU1RfVEFTS1M9eWVzCisgIDs7CisgIC0qKQorICAgIGVjaG8gInVua25vd24gb3B0aW9uICckb3B0JywgdXNlIC0taGVscCIKKyAgICBleGl0IDEKKyAgICA7OworICAqKQorICAgIGlmIFsgLXogIiRQQVJBTUVURVJTIiBdOyB0aGVuCisgICAgICAgIFBBUkFNRVRFUlM9JG9wdAorICAgIGVsc2UKKyAgICAgICAgUEFSQU1FVEVSUz0iJFBBUkFNRVRFUlMgJG9wdCIKKyAgICBmaQorICBlc2FjCitkb25lCisKK2lmIFsgIiRPUFRJT05fSEVMUCIgPSAieWVzIiBdOyB0aGVuCisgICAgY2F0IDw8IEVPRgorCitVc2FnZTogJFBST0dOQU1FIFtvcHRpb25zXSBbPHBhdGgtdG8tdG9vbGNoYWluLXNvdXJjZXM+XQorCitUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIHJlYnVpbGQgYSBjdXN0b20gTGludXggaG9zdCB0b29sY2hhaW4gdGhhdCB0YXJnZXRzCitHTGliYyAkR0xJQkNfVkVSU0lPTiBvciBoaWdoZXIuIFRoZSBtYWNoaW5lIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoaXMgdG9vbGNoYWluCit3aWxsIHJ1biBwcm9wZXJseSBvbiBVYnVudHUgJFVCVU5UVV9SRUxFQVNFIG9yIGhpZ2hlci4KKworSWYgeW91J3JlIHJ1bm5pbmcgb24gYSAzMi1iaXQgc3lzdGVtLCBpdCB3aWxsIGdlbmVyYXRlIGEgMzItYml0IHRvb2xjaGFpbi4KK0lmIHlvdSdyZSBydW5uaW5nIG9uIGEgNjQtYml0IHN5c3RlbSwgaXQgd2lsbCBnZW5lcmF0ZSBhIDY0LWJpdCB0b29sY2hhaW4KK3VubGVzcyB5b3UgdXNlIHRoZSAtLTMyLWJpdHMgb3B0aW9uLgorCitZb3UgY2FuIHByb3ZpZGUgdGhlIHBhdGggdG8gYSBsb2NhbCBjb3B5IG9mIHRoZSB0b29sY2hhaW4gc291cmNlcyByZXBvc2l0b3J5CithcyBhIGZpcnN0IHBhcmFtZXRlci4gSWYgeW91IGRvbid0LCB0aGUgc291cmNlcyB3aWxsIGJlIGRvd25sb2FkZWQgYW5kCitleHRyYWN0ZWQgYXV0b21hdGljYWxseSBpbnRvIHlvdXIgd29yayBkaXJlY3RvcnkuCisKK05vdGUgdGhhdCB0aGlzIHNjcmlwdCB3aWxsIGRvd25sb2FkIHZhcmlvdXMgYmluYXJ5IHBhY2thZ2VzIGZyb20gVWJ1bnR1CitzZXJ2ZXJzIGluIG9yZGVyIHRvIHByZXBhcmUgYSBjb21wYXRpYmxlICJzeXNyb290Ii4KKworQnkgZGVmYXVsdCwgaXQgZ2VuZXJhdGVzIGEgcGFja2FnZSBhcmNoaXZlICgkVE9PTENIQUlOX0FSQ0hJVkUpIGJ1dCB5b3UgY2FuLAorYXMgYW4gYWx0ZXJuYXRpdmUsIGFzayBmb3IgZGlyZWN0IGluc3RhbGxhdGlvbiB3aXRoIC0tcHJlZml4PTxwYXRoPgorCitVc2UgdGhlIGJvb3RzdHJhcCBvcHRpb24gdG8gcmUtZ2VuZXJhdGUgdGhlIHRvb2xjaGFpbiB3aXRoIGl0c2VsZi4gVGhpcyBpcwordXNlZnVsIGlmIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBnZW5lcmF0ZWQgY29tcGlsZXIgYmluYXJpZXMgd2lsbCB3b3JrCitwcm9wZXJseSBvbiBVYnVudHUgOC4wNCBvciBoaWdoZXIuIEJ5IGRlZmF1bHQsIHRoZXkgd2lsbCBvbmx5IHJ1biBvbiBzeXN0ZW1zCit0aGF0IG1hdGNoIHlvdXIgYnVpbGQgc3lzdGVtJ3MgQyBsaWJyYXJ5IEFCSSwgb3IgaGlnaGVyLgorCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorRU9GCisgICAgZWNobyAiU3RhbmRhcmQgb3B0aW9uczoiCisgICAgZWNobyAiICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UiCisgICAgZWNobyAiICAtLWZvcmNlICAgICAgICAgICAgICAgICAgICAgICBGb3JjZS1yZWJ1aWxkIGV2ZXJ5dGhpbmciCisgICAgZWNobyAiICAtLXByZWZpeD1QQVRIICAgICAgICAgICAgICAgICBJbnN0YWxsYXRpb24gcGF0aCBbJFBSRUZJWF9ESVJdIgorICAgIGVjaG8gIiAgLS11YnVudHUtbWlycm9yPVVSTCAgICAgICAgICAgVWJ1bnR1IG1pcnJvciBVUkwgWyRVQlVOVFVfTUlSUk9SXSIKKyAgICBlY2hvICIgIC0tdWJ1bnR1LXJlbGVhc2U9TkFNRSAgICAgICAgIFVidW50dSByZWxlYXNlIG5hbWUgWyRVQlVOVFVfUkVMRUFTRV0iCisgICAgZWNobyAiICAtLXdvcmstZGlyPVBBVEggICAgICAgICAgICAgICBUZW1wb3Jhcnkgd29yayBkaXJlY3RvcnkgWy90bXAvZ2NjLjxyYW5kb20+XSIKKyAgICBlY2hvICIgIC0tb25seS1zeXNyb290ICAgICAgICAgICAgICAgIE9ubHkgZG93bmxvYWQgYW5kIGJ1aWxkIHN5c3Jvb3QgcGFja2FnZXMiCisgICAgZWNobyAiICAtLXZlcmJvc2UgICAgICAgICAgICAgICAgICAgICBWZXJib3NlIG91dHB1dC4gQ2FuIGJlIHVzZWQgdHdpY2UuIgorICAgIGVjaG8gIiAgLS1iaW51dGlscy12ZXJzaW9uPVZFUlNJT04gICAgQmludXRpbHMgdmVyc2lvbiBudW1iZXIgWyRCSU5VVElMU19WRVJTSU9OXSIKKyAgICBlY2hvICIgIC0tZ2NjLXZlcnNpb249VkVSU0lPTiAgICAgICAgIEdDQyB2ZXJzaW9uIG51bWJlciBbJEdDQ19WRVJTSU9OXSIKKyAgICBlY2hvICIgIC0tZ21wLXZlcnNpb249VkVSU0lPTiAgICAgICAgIEdNUCB2ZXJzaW9uIG51bWJlciBbJEdNUF9WRVJTSU9OXSIKKyAgICBlY2hvICIgIC0tbXBmci12ZXJzaW9uPVZFUlNJT04gICAgICAgIE1QRlIgdmVyc2lvbiBudW1uZXIgWyRNUEZSX1ZFUlNJT05dIgorICAgIGVjaG8gIiAgLS1tcGMtdmVyc2lvbj1WRVJTSU9OICAgICAgICAgTVBDIHZlcnNpb24gbnVtYmVyIFskTVBDX1ZFUlNJT05dIgorICAgIGVjaG8gIiAgLS1pc2wtdmVyc2lvbj1WRVJTSU9OICAgICAgICAgSVNMIHZlcnNpb24gbnVtYmVyIFskSVNMX1ZFUlNJT05dIgorICAgIGVjaG8gIiAgLS1jbG9vZy12ZXJzaW9uPVZFUlNJT04gICAgICAgQ2xvb2cgdmVyc2lvbiBudW1iZXIgWyRDTE9PR19WRVJTSU9OXSIKKyAgICBlY2hvICIgIC0tam9icz1DT1VOVCAgICAgICAgICAgICAgICAgIFJ1biBDT1VOVCBidWlsZCBqb2JzIGluIHBhcmFsbGVsIFskSk9CU10iCisgICAgZWNobyAiICAtajxDT1VOVD4gICAgICAgICAgICAgICAgICAgICBTYW1lIGFzIC0tam9icz1DT1VOVC4iCisgICAgZWNobyAiICAtLWdpdD08Y21kPiAgICAgICAgICAgICAgICAgICBVc2UgdGhpcyB2ZXJzaW9uIG9mIHRoZSBnaXQgdG9vbCBbJEdJVF9DTURdIgorICAgIGVjaG8gIiAgLS1naXQtZGF0ZT08ZGF0ZT4gICAgICAgICAgICAgU3BlY2lmeSBzcGVjaWZpYyBnaXQgZGF0ZSB3aGVuIGRvd25sb2FkIHNvdXJjZXMgW25vbmVdIgorICAgIGVjaG8gIiAgLS1naXQtYnJhbmNoPTxuYW1lPiAgICAgICAgICAgU3BlY2lmeSB3aGljaCBicmFuY2ggdG8gdXNlIHdoZW4gZG93bmxvYWRpbmcgdGhlIHNvdXJjZXMgWyRHSVRfQlJBTkNIXSIKKyAgICBlY2hvICIgIC0tZ2l0LXJlZmVyZW5jZT08cGF0aD4gICAgICAgIFVzZSBhIGdpdCByZWZlcmVuY2UgcmVwb3NpdG9yeSIKKyAgICBlY2hvICIgIC0tZ2l0LWJhc2U9PHVybD4gICAgICAgICAgICAgIFVzZSB0aGlzIGdpdCByZXBvc2l0b3J5IGJhc2UgWyRHSVRfQkFTRV0iCisgICAgZWNobyAiICAtLWJvb3RzdHJhcCAgICAgICAgICAgICAgICAgICBCb290c3RyYXAgdG9vbGNoYWluIChpLmUuIGNvbXBpbGUgaXQgd2l0aCBpdHNlbGYpIgorICAgIGVjaG8gIiAgLS0zMi1iaXRzICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgMzItYml0IHRvb2xjaGFpbiBvbiA2NC1iaXQgYnVpbGQgc3lzdGVtLiIKKyAgICBlY2hvICIiCisgICAgZXhpdCAxCitmaQorCitpZiBbICIkRk9SQ0VfMzIiIF07IHRoZW4KKyAgICBpZiBbICIkQlVJTERfQklUUyIgPSA2NCBdOyB0aGVuCisgICAgICAgIHNldF9ob3N0X2JpdHMgMzIKKyAgICBlbHNlCisgICAgICAgZWNobyAiV2FybmluZzogLS0zMi1iaXRzIG9wdGlvbiBpZ25vcmVkIG9uIDMyLWJpdCBidWlsZCBtYWNoaW5lLiIKKyAgICBmaQorZmkKKworIyBEZXRlcm1pbmUgcm9vdCB3b3JraW5nIGRpcmVjdG9yeSBmb3Igb3VyIHNjcmlwdAoraWYgWyAteiAiJFdPUktfRElSIiBdOyB0aGVuCisgICAgV09SS19ESVI9JChta3RlbXAgLWQgL3RtcC8kVVNFUi1nY2MtJEhPU1RfQklUUy1YWFhYWFgpCisgICAgV09SS19ESVJfQ0xFQU5VUD10cnVlCitlbHNlCisgICAgbWtkaXIgLXAgIiRXT1JLX0RJUiIKKyAgICBmYWlsX3BhbmljICJDb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeTogJFdPUktfRElSIgorICAgIFdPUktfRElSX0NMRUFOVVA9ZmFsc2UKK2ZpCisKK2lmIFsgLXogIiRQQVJBTUVURVJTIiBdIDsgdGhlbgorICAgIGlmIFsgLW4gIiRHSVRfUkVGRVJFTkNFIiBdIDsgdGhlbgorICAgICAgICBpZiBbICEgLWQgIiRHSVRfUkVGRVJFTkNFIiAtbyAhIC1kICIkR0lUX1JFRkVSRU5DRS9idWlsZCIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiRVJST1I6IEludmFsaWQgcmVmZXJlbmNlIHJlcG9zaXRvcnkgZGlyZWN0b3J5IHBhdGg6ICRHSVRfUkVGRVJFTkNFIgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisgICAgICAgIGlmIFsgLW4gIiRHSVRfQkFTRSIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiVXNpbmcgZ2l0IGNsb25lIHJlZmVyZW5jZTogJEdJVF9SRUZFUkVOQ0UiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICMgSWYgd2UgaGF2ZSBhIHJlZmVyZW5jZSB3aXRob3V0IGEgYmFzZSwgdXNlIGl0IGFzIGEgZG93bmxvYWQgYmFzZSBpbnN0ZWFkLgorICAgICAgICAgICAgR0lUX0JBU0U9JEdJVF9SRUZFUkVOQ0UKKyAgICAgICAgICAgIEdJVF9SRUZFUkVOQ0U9CisgICAgICAgICAgICBlY2hvICJVc2luZyBnaXQgY2xvbmUgYmFzZTogJEdJVF9CQVNFIgorICAgICAgICBmaQorICAgIGVsaWYgWyAteiAiJEdJVF9CQVNFIiBdOyB0aGVuCisgICAgICAgIEdJVF9CQVNFPSRHSVRfQkFTRV9ERUZBVUxUCisgICAgICAgIGVjaG8gIkF1dG8tY29uZmlnOiAtLWdpdC1iYXNlPSRHSVRfQkFTRSIKKyAgICBmaQorCisgICAgIyBMb2NhdGlvbiB3aGVyZSB3ZSB3aWxsIGRvd25sb2FkIHRoZSB0b29sY2hhaW4gc291cmNlcworICAgIFRPT0xDSEFJTl9TUkNfRElSPSRXT1JLX0RJUi90b29sY2hhaW4tc3JjCitlbHNlCisgICAgc2V0X3BhcmFtZXRlcnMgKCkgeworICAgICAgICBUT09MQ0hBSU5fU1JDX0RJUj0iJDEiCisgICAgICAgIGlmIFsgISAtZCAiJFRPT0xDSEFJTl9TUkNfRElSIiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJFUlJPUjogTm90IGEgZGlyZWN0b3J5OiAkMSIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgICAgICBpZiBbICEgLWQgIiRUT09MQ0hBSU5fU1JDX0RJUi9idWlsZCIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiRVJST1I6IE1pc3NpbmcgZGlyZWN0b3J5OiAkMS9idWlsZCIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgIH0KKworICAgIHNldF9wYXJhbWV0ZXJzICRQQVJBTUVURVJTCitmaQorCisjIExvY2F0aW9uIG9mIG9yaWdpbmFsIHN5c3Jvb3QuIFRoaXMgaXMgd2hlcmUgd2UncmUgZ29pbmcgdG8gZXh0cmFjdCBhbGwKKyMgYmluYXJ5IFVidW50dSBwYWNrYWdlcy4KK09SR19TWVNST09UX0RJUj0kV09SS19ESVIvc3lzcm9vdAorCisjIE5hbWUgb2YgdGhlIGZpbmFsIGdlbmVyYXRlZCB0b29sY2hhaW4KK1RPT0xDSEFJTl9OQU1FPSRHQ0NfVEFSR0VULWdsaWJjJEdMSUJDX1ZFUlNJT04tJChtYWpvcl9taW5vcl9vbmx5ICRHQ0NfVkVSU0lPTikKKworIyBOYW1lIG9mIHRoZSBmaW5hbCB0b29sY2hhaW4gYmluYXJ5IHRhcmJhbGwgdGhhdCB0aGlzIHNjcmlwdCB3aWxsIGNyZWF0ZQorVE9PTENIQUlOX0FSQ0hJVkU9L3RtcC8kVE9PTENIQUlOX05BTUUudGFyLmJ6MgorCisjIEEgZmlsZSB0aGF0IHdpbGwgY29udGFpbiBkZXRhaWxzIGFib3V0IGFsbCB0aGUgc291cmNlcyB1c2VkIHRvIGdlbmVyYXRlCisjIHRoZSBmaW5hbCB0b29sY2hhaW4uIFRoaXMgaW5jbHVkZXMgYm90aCBTSEEtMSBmb3IgdG9vbGNoYWluIGdpdCByZXBvc2l0b3JpZXMKKyMgYW5kIFNIQS0xIGhhc2hlcyBmb3IgZG93bmxvYWRlZCBVYnVudHUgcGFja2FnZXMuCitTT1VSQ0VTX0xJU1Q9JFdPUktfRElSL1NPVVJDRVMKKworIyBEZXRlcm1pbmUgTWFrZSBmbGFncworTUFLRV9GTEFHUz0iLWokSk9CUyIKKworIyBDcmVhdGUgdGhlIHdvcmsgZGlyZWN0b3J5Citta2RpciAtcCAiJFdPUktfRElSIgorbWtkaXIgLXAgIiRUT09MQ0hBSU5fU1JDX0RJUiIKKworIyBMb2NhdGlvbiB3aGVyZSB3ZSBkb3dubG9hZCBwYWNrYWdlcyBmcm9tIHRoZSBVYnVudHUgc2VydmVycworRE9XTkxPQURfRElSPSRXT1JLX0RJUi9kb3dubG9hZAorCisjIEVtcHR5IHRoZSBTT1VSQ0VTIGZpbGUKK3JtIC1mICIkU09VUkNFU19MSVNUIiAmJiB0b3VjaCAiJFNPVVJDRVNfTElTVCIKKworCitpZiBbICIkVkVSQk9TRSIgLWdlIDEgXSA7IHRoZW4KKyAgICBydW4gKCkgeworICAgICAgICBlY2hvICIjIyBDT01NQU5EOiAkQCIKKyAgICAgICAgJEAKKyAgICB9CisgICAgbG9nICgpIHsKKyAgICAgICAgZWNobyAiJEAiCisgICAgfQorICAgIGlmIFsgIiRWRVJCT1NFIiAtZ2UgMiBdIDsgdGhlbgorICAgICAgICBsb2cyICgpIHsKKyAgICAgICAgICAgIGVjaG8gIiRAIgorICAgICAgICB9CisgICAgZWxzZQorICAgICAgICBsb2cyICgpIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB9CisgICAgZmkKK2Vsc2UKKyAgICBydW4gKCkgeworICAgICAgICAiJEAiID4+JFRNUExPRyAyPiYxCisgICAgfQorICAgIGxvZyAoKSB7CisgICAgICAgIHJldHVybgorICAgIH0KKyAgICBsb2cyICgpIHsKKyAgICAgICAgcmV0dXJuCisgICAgfQorZmkKKworIyBTYW5pdGl6ZSBhIHBhdGggbGlzdCwgd2Ugd2FudCB0byByZW1vdmUgZW1wdHkgc3ViLWRpcnMgYW5kCisjIGxlYWRpbmcvdHJhaWxpbmcgY29sdW1ucy4KK3Nhbml0aXplX3BhdGhfbGlzdCAoKQoreworICBsb2NhbCBSRVNVTFQKKyAgUkVTVUxUPSQocHJpbnRmICIlc1xuIiAiJCoiIHwgdHIgJzonICdcbicgfCBhd2sgJyQxICE9ICIiICYmICQxICE9ICIuIiB7IHByaW50ICQwOyB9JyB8IHRyICdcbicgJzonKQorICBwcmludGYgIiVzIiAke1JFU1VMVCU6fQorfQorCitQQVRIPSQoc2FuaXRpemVfcGF0aF9saXN0ICRQQVRIKQorTERfTElCUkFSWV9QQVRIPSQoc2FuaXRpemVfcGF0aF9saXN0ICRMRF9MSUJSQVJZX1BBVEgpCisKK0JVSUxEX0RJUj0kV09SS19ESVIvYnVpbGQKK21rZGlyIC1wICRCVUlMRF9ESVIKKworVE1QTE9HPSRCVUlMRF9ESVIvYnVpbGQubG9nCitybSAtcmYgJFRNUExPRyAmJiB0b3VjaCAkVE1QTE9HCisKK2J1aWxkX2Rpcl9mb3IgKCkgeyBlY2hvICIkQlVJTERfRElSLyRQSEFTRS8kMSI7IH0KKworVElNRVNUQU1QU19ESVI9JEJVSUxEX0RJUi90aW1lc3RhbXBzCitta2RpciAtcCAkVElNRVNUQU1QU19ESVIKKworc3RhbXBfY2hlY2sgKCkgeworICAgIFsgLWYgIiRUSU1FU1RBTVBTX0RJUi8kMSIgXQorfQorCitzdGFtcF9jbGVhciAoKSB7CisgICAgcm0gLWYgIiRUSU1FU1RBTVBTX0RJUi8kMSIKK30KKworc3RhbXBfc2V0ICgpIHsKKyAgICB0b3VjaCAiJFRJTUVTVEFNUFNfRElSLyQxIgorfQorCitpZiBbICIkRk9SQ0UiID0gInllcyIgXSA7IHRoZW4KKyAgICBlY2hvICJDbGVhbmluZyB1cCB0aW1lc3RhbXBzIChmb3JjaW5nIHRoZSBidWlsZCkuIgorICAgIHJtIC1mICRUSU1FU1RBTVBTX0RJUi8qCitmaQorCitpZiBbICIkVkVSQk9TRSIgPSAwIF0gOyB0aGVuCisgICAgZWNobyAiVG8gZm9sbG93IGJ1aWxkLCBydW46IHRhaWwgLUYgJFRNUExPRyIKK2ZpCisKKyMgcmV0dXJucyAwIGlmZiB0aGUgc3RyaW5nIGluICQyIG1hdGNoZXMgdGhlIHBhdHRlcm4gaW4gJDEKKyMgJDE6IHBhdHRlcm4KKyMgJDI6IHN0cmluZworcGF0dGVybl9tYXRjaCAoKQoreworICAgIGVjaG8gIiQyIiB8IGdyZXAgLXEgLUUgLWUgIiQxIgorfQorCisjIEZpbmQgaWYgYSBnaXZlbiBzaGVsbCBwcm9ncmFtIGlzIGF2YWlsYWJsZS4KKyMgV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgdGhlIGZhY3QgdGhhdCB0aGUgJ3doaWNoIDxmb28+JyBjb21tYW5kCisjIG1heSByZXR1cm4gZWl0aGVyIGFuIGVtcHR5IHN0cmluZyAoTGludXgpIG9yIHNvbWV0aGluZyBsaWtlCisjICJubyA8Zm9vPiBpbiAuLi4iIChEYXJ3aW4pLiBBbHNvLCB3ZSBuZWVkIHRvIHJlZGlyZWN0IHN0ZGVycgorIyB0byAvZGV2L251bGwgZm9yIEN5Z3dpbgorIworIyAkMTogdmFyaWFibGUgbmFtZQorIyAkMjogcHJvZ3JhbSBuYW1lCisjCisjIFJlc3VsdDogc2V0ICQxIHRvIHRoZSBmdWxsIHBhdGggb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZAorIyAgICAgICAgIG9yIHRvIHRoZSBlbXB0eS91bmRlZmluZWQgc3RyaW5nIGlmIG5vdCBhdmFpbGFibGUKKyMKK2ZpbmRfcHJvZ3JhbSAoKQoreworICAgIGxvY2FsIFBST0cKKyAgICBQUk9HPWB3aGljaCAkMiAyPi9kZXYvbnVsbGAKKyAgICBpZiBbIC1uICIkUFJPRyIgXSA7IHRoZW4KKyAgICAgICAgaWYgcGF0dGVybl9tYXRjaCAnXm5vICcgIiRQUk9HIjsgdGhlbgorICAgICAgICAgICAgUFJPRz0KKyAgICAgICAgZmkKKyAgICBmaQorICAgIGV2YWwgJDE9IiRQUk9HIgorfQorCisjIENvcHkgYSBkaXJlY3RvcnksIGNyZWF0ZSB0YXJnZXQgbG9jYXRpb24gaWYgbmVlZGVkCisjCisjICQxOiBzb3VyY2UgZGlyZWN0b3J5CisjICQyOiB0YXJnZXQgZGlyZWN0b3J5IGxvY2F0aW9uCisjCitjb3B5X2RpcmVjdG9yeSAoKQoreworICAgIGxvY2FsIFNSQ0RJUj0iJDEiCisgICAgbG9jYWwgRFNURElSPSIkMiIKKyAgICBpZiBbICEgLWQgIiRTUkNESVIiIF0gOyB0aGVuCisgICAgICAgIHBhbmljICJDYW4ndCBjb3B5IGZyb20gbm9uLWRpcmVjdG9yeTogJFNSQ0RJUiIKKyAgICBmaQorICAgIGxvZzIgIkRpcmVjdG9yeSBjb3B5OiAkU1JDRElSIC0+ICREU1RESVIiCisgICAgbWtkaXIgLXAgIiREU1RESVIiICYmIChjZCAiJFNSQ0RJUiIgJiYgdGFyIGNmIC0gKikgfCAodGFyIHhmIC0gLUMgIiREU1RESVIiKQorICAgIGZhaWxfcGFuaWMgIkNhbm5vdCBjb3B5IHRvIGRpcmVjdG9yeTogJERTVERJUiIKK30KKworZmluZF9wcm9ncmFtIENNRF9XR0VUIHdnZXQKK2ZpbmRfcHJvZ3JhbSBDTURfQ1VSTCBjdXJsCitmaW5kX3Byb2dyYW0gQ01EX1NDUCAgc2NwCisKKyMgRG93bmxvYWQgYSBmaWxlIHdpdGggZWl0aGVyICdjdXJsJywgJ3dnZXQnIG9yICdzY3AnCisjCisjICQxOiBzb3VyY2UgVVJMIChlLmcuIGh0dHA6Ly9mb28uY29tLCBzc2g6Ly9ibGFoLCAvc29tZS9wYXRoKQorIyAkMjogdGFyZ2V0IGZpbGUKK2Rvd25sb2FkX2ZpbGUgKCkKK3sKKyAgICAjIElzIHRoaXMgSFRUUCwgSFRUUFMgb3IgRlRQID8KKyAgICBpZiBwYXR0ZXJuX21hdGNoICJeKGh0dHB8aHR0cHN8ZnRwKTouKiIgIiQxIjsgdGhlbgorICAgICAgICBpZiBbIC1uICIkQ01EX1dHRVQiIF0gOyB0aGVuCisgICAgICAgICAgICBydW4gJENNRF9XR0VUIC1PICQyICQxCisgICAgICAgIGVsaWYgWyAtbiAiJENNRF9DVVJMIiBdIDsgdGhlbgorICAgICAgICAgICAgcnVuICRDTURfQ1VSTCAtbyAkMiAkMQorICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJQbGVhc2UgaW5zdGFsbCB3Z2V0IG9yIGN1cmwgb24gdGhpcyBtYWNoaW5lIgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisgICAgICAgIHJldHVybgorICAgIGZpCisKKyAgICAjIElzIHRoaXMgU1NIID8KKyAgICAjIEFjY2VwdCBib3RoIHNzaDovLzxwYXRoPiBvciA8bWFjaGluZT46PHBhdGg+CisgICAgIworICAgIGlmIHBhdHRlcm5fbWF0Y2ggIl4oc3NofFteOl0rKTouKiIgIiQxIjsgdGhlbgorICAgICAgICBpZiBbIC1uICIkQ01EX1NDUCIgXSA7IHRoZW4KKyAgICAgICAgICAgIHNjcF9zcmM9YGVjaG8gJDEgfCBzZWQgLWUgcyVzc2g6Ly8lJWdgCisgICAgICAgICAgICBydW4gJENNRF9TQ1AgJHNjcF9zcmMgJDIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiUGxlYXNlIGluc3RhbGwgc2NwIG9uIHRoaXMgbWFjaGluZSIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgICAgICByZXR1cm4KKyAgICBmaQorCisgICAgIyBJcyB0aGlzIGEgZmlsZSBjb3B5ID8KKyAgICAjIEFjY2VwdCBib3RoIGZpbGU6Ly88cGF0aD4gb3IgLzxwYXRoPgorICAgICMKKyAgICBpZiBwYXR0ZXJuX21hdGNoICJeKGZpbGU6Ly98LykuKiIgIiQxIjsgdGhlbgorICAgICAgICBjcF9zcmM9YGVjaG8gJDEgfCBzZWQgLWUgcyVeZmlsZTovLyUlZ2AKKyAgICAgICAgcnVuIGNwIC1mICRjcF9zcmMgJDIKKyAgICAgICAgcmV0dXJuCisgICAgZmkKKworICAgICMgVW5rbm93biBzY2hlbWEKKyAgICBlY2hvICJFUlJPUjogVW5zdXBwb3J0ZWQgc291cmNlIFVSSTogJDEiCisgICAgZXhpdCAxCit9CisKKyMgQSB2YXJpYW50IG9mICdkb3dubG9hZF9maWxlJyB1c2VkIHRvIHNwZWNpZnkgdGhlIHRhcmdldCBkaXJlY3RvcnkKKyMgJDE6IHNvdXJjZSBVUkwKKyMgJDI6IHRhcmdldCBkaXJlY3RvcnkKK2Rvd25sb2FkX2ZpbGVfdG8gKCkKK3sKKyAgICBsb2NhbCBVUkw9IiQxIgorICAgIGxvY2FsIERJUj0iJDIiCisgICAgbG9jYWwgRFNUPSIkRElSL2BiYXNlbmFtZSAkVVJMYCIKKyAgICBta2RpciAtcCAkRElSCisgICAgZG93bmxvYWRfZmlsZSAiJFVSTCIgIiREU1QiCit9CisKKyMgUGFjayBhIGdpdmVuIGFyY2hpdmUKKyMKKyMgJDE6IGFyY2hpdmUgZmlsZSBwYXRoIChpbmNsdWRpbmcgZXh0ZW5zaW9uKQorIyAkMjogc291cmNlIGRpcmVjdG9yeSBmb3IgYXJjaGl2ZSBjb250ZW50CisjICQzKzogbGlzdCBvZiBmaWxlcyAoaW5jbHVkaW5nIHBhdHRlcm5zKSwgYWxsIGlmIGVtcHR5CitwYWNrX2FyY2hpdmUgKCkKK3sKKyAgICBsb2NhbCBBUkNISVZFPSIkMSIKKyAgICBsb2NhbCBTUkNESVI9IiQyIgorICAgIGxvY2FsIFNSQ0ZJTEVTCisgICAgbG9jYWwgVEFSRkxBR1MgWklQRkxBR1MKKyAgICBzaGlmdDsgc2hpZnQ7CisgICAgaWYgWyAteiAiJDEiIF0gOyB0aGVuCisgICAgICAgIFNSQ0ZJTEVTPSIqIgorICAgIGVsc2UKKyAgICAgICAgU1JDRklMRVM9IiRAIgorICAgIGZpCisgICAgaWYgWyAiYGJhc2VuYW1lICRBUkNISVZFYCIgPSAiJEFSQ0hJVkUiIF0gOyB0aGVuCisgICAgICAgIEFSQ0hJVkU9ImBwd2RgLyRBUkNISVZFIgorICAgIGZpCisgICAgbWtkaXIgLXAgYGRpcm5hbWUgJEFSQ0hJVkVgCisgICAgaWYgWyAiJFZFUkJPU0UiIC1nZSAyIF0gOyB0aGVuCisgICAgICAgIFRBUkZMQUdTPSJ2Y2YiCisgICAgICAgIFpJUEZMQUdTPSItOXIiCisgICAgZWxzZQorICAgICAgICBUQVJGTEFHUz0iY2YiCisgICAgICAgIFpJUEZMQUdTPSItOXFyIgorICAgIGZpCisgICAgY2FzZSAiJEFSQ0hJVkUiIGluCisgICAgICAgICouemlwKQorICAgICAgICAgICAgKGNkICRTUkNESVIgJiYgcnVuIHppcCAkWklQRkxBR1MgIiRBUkNISVZFIiAkU1JDRklMRVMpCisgICAgICAgICAgICA7OworICAgICAgICAqLnRhcikKKyAgICAgICAgICAgIChjZCAkU1JDRElSICYmIHJ1biB0YXIgJFRBUkZMQUdTICIkQVJDSElWRSIgJFNSQ0ZJTEVTKQorICAgICAgICAgICAgOzsKKyAgICAgICAgKi50YXIuZ3opCisgICAgICAgICAgICAoY2QgJFNSQ0RJUiAmJiBydW4gdGFyIHokVEFSRkxBR1MgIiRBUkNISVZFIiAkU1JDRklMRVMpCisgICAgICAgICAgICA7OworICAgICAgICAqLnRhci5iejIpCisgICAgICAgICAgICAoY2QgJFNSQ0RJUiAmJiBydW4gdGFyIGokVEFSRkxBR1MgIiRBUkNISVZFIiAkU1JDRklMRVMpCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgcGFuaWMgIlVuc3VwcG9ydGVkIGFyY2hpdmUgZm9ybWF0OiAkQVJDSElWRSIKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworfQorCitub190cmFpbGluZ19zbGFzaCAoKQoreworICAgIGVjaG8gJHsxIyMvfQorfQorCisjIExvYWQgdGhlIFVidW50dSBwYWNrYWdlcyBmaWxlLiBUaGlzIGlzIGEgbG9uZyB0ZXh0IGZpbGUgdGhhdCB3aWxsIGxpc3QKKyMgZWFjaCBwYWNrYWdlIGZvciBhIGdpdmVuIHJlbGVhc2UuCisjCisjICQxOiBVYnVudHUgbWlycm9yIGJhc2UgVVJMIChlLmcuIGh0dHA6Ly9taXJyb3JzLnVzLmtlcm5lbC5vcmcvKQorIyAkMjogUmVsZWFzZSBuYW1lCisjCitnZXRfdWJ1bnR1X3BhY2thZ2VzX2xpc3QgKCkKK3sKKyAgICBsb2NhbCBSRUxFQVNFPSQyCisgICAgbG9jYWwgQkFTRT0iYG5vX3RyYWlsaW5nX3NsYXNoIFwiJDFcImAiCisgICAgbG9jYWwgU1JDRklMRSBEU1RGSUxFCisgICAgZm9yIFVBIGluICRVQlVOVFVfQVJDSFM7IGRvCisgICAgICAgIFNSQ0ZJTEU9IiRCQVNFL3VidW50dS9kaXN0cy8kUkVMRUFTRS9tYWluL2JpbmFyeS0kVUEvUGFja2FnZXMuYnoyIgorICAgICAgICBEU1RGSUxFPSIkRE9XTkxPQURfRElSL1BhY2thZ2VzLSRVQS5iejIiCisgICAgICAgIGxvZyAiVHJ5aW5nIHRvIGxvYWQgJFNSQ0ZJTEUiCisgICAgICAgIGRvd25sb2FkX2ZpbGUgIiRTUkNGSUxFIiAiJERTVEZJTEUiCisgICAgICAgIGZhaWxfcGFuaWMgIkNvdWxkIG5vdCBkb3dubG9hZCAkU1JDRklMRSIKKyAgICAgICAgKGNkICRET1dOTE9BRF9ESVIgJiYgYnVuemlwMiAtY2YgUGFja2FnZXMtJFVBLmJ6MiA+IFBhY2thZ2VzLSRVQSkKKyAgICAgICAgZmFpbF9wYW5pYyAiQ291bGQgbm90IHVuY29tcHJlc3MgJERTVEZJTEUgdG8gUGFja2FnZXMtJFVBIgorICAgIGRvbmUKKworICAgICMgV3JpdGUgYSBzbWFsbCBhd2sgc2NyaXB0IHVzZWQgdG8gZXh0cmFjdCBmaWxlbmFtZXMgZm9yIGEgZ2l2ZW4gcGFja2FnZQorICAgIGNhdCA+ICRET1dOTE9BRF9ESVIvZXh0cmFjdC1maWxlbmFtZS5hd2sgPDxFT0YKK0JFR0lOIHsKKyAgICAjIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gcGFja2FnZSBuYW1lCisgICAgZ3N1YigiXFxcXC4iLCJcXFxcLiIsUEtHKQorICAgIGdzdWIoIlxcXFwrIiwiXFxcXCsiLFBLRykKKyAgICBGSUxFID0gIiIKKyAgICBQQUNLQUdFID0gIiIKK30KKworXCQxID09ICJQYWNrYWdlOiIgeworICAgIGlmIChcJDIgPT0gUEtHKSB7CisgICAgICAgIFBBQ0tBR0UgPSBcJDIKKyAgICB9IGVsc2UgeworICAgICAgICBQQUNLQUdFID0gIiIKKyAgICB9Cit9CisKK1wkMSA9PSAiRmlsZW5hbWU6IiAmJiBQQUNLQUdFID09IFBLRyB7CisgICAgRklMRSA9IFwkMgorfQorCitFTkQgeworICAgIHByaW50IEZJTEUKK30KK0VPRgorfQorCisjIENvbnZlcnQgYW4gdW52ZXJzaW9uZWQgcGFja2FnZSBuYW1lIGludG8gYSAuZGViIHBhY2thZ2UgVVJMCisjCisjICQxOiBQYWNrYWdlIG5hbWUgd2l0aG91dCB2ZXJzaW9uIGluZm9ybWF0aW9uIChlLmcuIGxpYmM2LWRldikKKyMgJDI6IFVidW50dSBtaXJyb3IgYmFzZSBVUkwKKyMgJDM6IFVidW50dSBhcmNoICgiaTM4NiIgb3IgImFtZDY0IikKKyMKK2dldF91YnVudHVfcGFja2FnZV9kZWJfdXJsICgpCit7CisgICAgIyBUaGUgZm9sbG93aW5nIGlzIGFuIGF3ayBjb21tYW5kIHRvIHBhcnNlIHRoZSBQYWNrYWdlcyBmaWxlIGFuZCBleHRyYWN0CisgICAgIyB0aGUgZmlsZW5hbWUgb2YgYSBnaXZlbiBwYWNrYWdlLgorICAgIGxvY2FsIEJBU0U9ImBub190cmFpbGluZ19zbGFzaCBcIiQxXCJgIgorICAgIGxvY2FsIEZJTEU9YGF3ayAtZiAiJERPV05MT0FEX0RJUi9leHRyYWN0LWZpbGVuYW1lLmF3ayIgLXYgUEtHPSQxICRET1dOTE9BRF9ESVIvUGFja2FnZXMtJDNgCisgICAgaWYgWyAteiAiJEZJTEUiIF07IHRoZW4KKyAgICAgICAgbG9nICJDb3VsZCBub3QgZmluZCBmaWxlbmFtZSBmb3IgcGFja2FnZSAkMSIKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKyAgICBlY2hvICIkMi91YnVudHUvJEZJTEUiCit9CisKKyMgRG9lcyB0aGUgaG9zdCBjb21waWxlciBnZW5lcmF0ZSAzMi1iaXQgbWFjaGluZSBjb2RlPworIyBJZiBub3QsIGFkZCB0aGUgLW0zMiBmbGFnIHRvIHRoZSBjb21waWxlciBuYW1lIHRvIGVuc3VyZSB0aGlzLgorIworY29tcHV0ZV9ob3N0X2ZsYWdzICgpCit7CisgICAgSE9TVF9DQz0ke0NDOi1nY2N9CisgICAgSE9TVF9DWFg9JHtDWFgtZysrfQorICAgIGlmIFsgLW4gIiRVU0VfQ0NBQ0hFIiBdOyB0aGVuCisgICAgICAgIGVjaG8gLW4gIkNoZWNraW5nIGZvciBjY2FjaGUuLi4iCisgICAgICAgIGZpbmRfcHJvZ3JhbSBDTURfQ0NBQ0hFIGNjYWNoZQorICAgICAgICBpZiBbIC1uICIkQ01EX0NDQUNIRSIgXSA7IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIiRIT1NUX0NDIiB8IHRyICcgJyAnXG4nIHwgZ3JlcCAtcSAtZSAiY2NhY2hlIgorICAgICAgICAgICAgaWYgWyAkPyA9IDAgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICJ5ZXMgKGlnbm9yZWQpIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVjaG8gInllcyIKKyAgICAgICAgICAgICAgICBIT1NUX0NDPSJjY2FjaGUgJEhPU1RfQ0MiCisgICAgICAgICAgICAgICAgSE9TVF9DWFg9ImNjYWNoZSAkSE9TVF9DWFgiCisgICAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJubyIKKyAgICAgICAgZmkKKyAgICBmaQorICAgIGVjaG8gLW4gIkNoZWNraW5nIGNvbXBpbGVyIGJpdG5lc3MuLi4gIgorICAgIGNhdCA+ICIkQlVJTERfRElSIi9jb25mdGVzdC5jIDw8IEVPRgorI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQgbWFpbih2b2lkKSB7CisgICAgcHJpbnRmKCIlZFxuIixzaXplb2Yodm9pZCopKjgpOworICAgIHJldHVybiAwOworfQorRU9GCisgICAgJEhPU1RfQ0MgLW8gIiRCVUlMRF9ESVIiL2NvbmZ0ZXN0ICIkQlVJTERfRElSIi9jb25mdGVzdC5jID4gIiRCVUlMRF9ESVIiL2NvbmZ0ZXN0LmxvZyAyPiYxCisgICAgaWYgWyAkPyAhPSAwIF0gOyB0aGVuCisgICAgICAgIGVjaG8gIkNvdWxkIG5vdCBjb21waWxlIHRlc3QgcHJvZ3JhbSEhIgorICAgICAgICBlY2hvICJFcnJvciBsb2cgaXM6IgorICAgICAgICBjYXQgIiRCVUlMRF9ESVIiL2NvbmZ0ZXN0LmxvZworICAgICAgICBybSAiJEJVSURfRElSIi9jb25mdGVzdC5sb2cKKyAgICAgICAgcGFuaWMgIk5lZWQgYSB3b3JraW5nIGJ1aWxkIHRvb2xjaGFpbiEiCisgICAgZmkKKyAgICBIT1NUX0NDX0JJVFM9JCgiJEJVSUxEX0RJUiIvY29uZnRlc3QpCisgICAgZWNobyAtbiAiJEhPU1RfQ0NfQklUUyIKKyAgICBjYXNlICRIT1NUX0NDX0JJVFMgaW4KKyAgICAgICAgMzIpICMgTm90aGluZyB0byBkbworICAgICAgICAgICAgOzsKKyAgICAgICAgNjQpICMgRG8gd2UgbmVlZCB0byBmb3JjZSAzMi1iaXRzCisgICAgICAgICAgICBpZiBbICIkRk9SQ0VfMzIiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICIgKGZvcmNpbmcgZ2VuZXJhdGlvbiBvZiAzMi1iaXQgYmluYXJpZXMpIgorICAgICAgICAgICAgICAgIEhPU1RfQ0M9JEhPU1RfQ0MiIC1tMzIiCisgICAgICAgICAgICAgICAgSE9TVF9DWFg9JEhPU1RfQ1hYIiAtbTMyIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBwYW5pYyAiVW5rbm93biBiaXRuZXNzICgzMiBvciA2NCBleHBlY3RlZCkgISEiCisgICAgZXNhYworICAgIGVjaG8gIiIKKyAgICBlY2hvICJVc2luZyBidWlsZCBDIGNvbXBpbGVyOiAkSE9TVF9DQyIKKyAgICBlY2hvICJVc2luZyBidWlsZCBDKysgY29tcGlsZXI6ICRIT1NUX0NYWCIKKyAgICBlY2hvICJHQ0MgdGFyZ2V0IG5hbWU6ICRHQ0NfVEFSR0VUIgorICAgIGVjaG8gIkdNUCB0YXJnZXQgbmFtZTogJEdNUF9UQVJHRVQiCisgICAgZWNobyAiR01QIEFCSTogJEdNUF9BQkkiCisgICAgZXhwb3J0IENDPSIkSE9TVF9DQyIKKyAgICBleHBvcnQgQ1hYPSIkSE9TVF9DWFgiCit9CisKK2NvbXB1dGVfaG9zdF9mbGFncworCisjIFJldHVybiB0aGUgdmFsdWUgb2YgYSBnaXZlbiBuYW1lZCB2YXJpYWJsZQorIyAkMTogdmFyaWFibGUgbmFtZQorIworIyBleGFtcGxlOgorIyAgICBGT089QkFSCisjICAgIEJBUj1aT08KKyMgICAgZWNobyBgdmFyX3ZhbHVlICRGT09gCisjICAgIHdpbGwgcHJpbnQgJ1pPTycKKyMKK3Zhcl92YWx1ZSAoKQoreworICAgIGV2YWwgZWNobyBcJCQxCit9CisKK3Zhcl9saXN0X2FwcGVuZCAoKQoreworICAgIGxvY2FsIFZBUk5BTUU9JDEKKyAgICBsb2NhbCBWQVJWQUw9YHZhcl92YWx1ZSAkVkFSTkFNRWAKKyAgICBzaGlmdAorICAgIGlmIFsgLXogIiRWQVJWQUwiIF0gOyB0aGVuCisgICAgICAgIGV2YWwgJFZBUk5BTUU9XCIkQFwiCisgICAgZWxzZQorICAgICAgICBldmFsICRWQVJOQU1FPVwiJFZBUlZBTCAkQFwiCisgICAgZmkKK30KKwordmFyX2xpc3RfcHJlcGVuZCAoKQoreworICAgIGxvY2FsIFZBUk5BTUU9JDEKKyAgICBsb2NhbCBWQVJWQUw9YHZhcl92YWx1ZSAkVkFSTkFNRWAKKyAgICBzaGlmdAorICAgIGlmIFsgLXogIiRWQVJWQUwiIF0gOyB0aGVuCisgICAgICAgIGV2YWwgJFZBUk5BTUU9XCIkQFwiCisgICAgZWxzZQorICAgICAgICBldmFsICRWQVJOQU1FPVwiJEAgJFZBUlZBTFwiCisgICAgZmkKK30KKworX2xpc3RfZmlyc3QgKCkKK3sKKyAgICBlY2hvICQxCit9CisKK19saXN0X3Jlc3QgKCkKK3sKKyAgICBzaGlmdAorICAgIGVjaG8gIiRAIgorfQorCitfbGlzdF9yZXZlcnNlICgpCit7CisgICAgbG9jYWwgSTEgSTIgSTMgSTQgSTUgSTYgSTcgSTggSTkgUkVTVCBSRVQKKyAgICBJMT0kMTsgSTI9JDI7IEkzPSQzOyBJND0kSTQ7IEk1PSRJNTsgSTY9JEk2OyBJNz0kSTc7IEk4PSRJODsgSTk9JEk5CisgICAgc2hpZnQgOQorICAgIFJFVD0kSTkke0k4OisiICJ9JEk4JHtJNzorIiAifSRJNyR7STY6KyIgIn0kSTYke0k1OisiICJ9JEk1JHtJNDorIiAifSRJNCR7STM6KyIgIn0kSTMke0kyOisiICJ9JEkyJHtJMTorIiAifSRJMQorICAgIFJFU1Q9IiQqIgorICAgIGlmIFsgIiRSRVNUIiBdOyB0aGVuCisgICAgICAgIFJFVD0kKF9saXN0X3JldmVyc2UgJFJFU1QpJFJFVAorICAgIGZpCisgICAgZWNobyAiJFJFVCIKK30KKwordmFyX2xpc3RfcG9wX2ZpcnN0ICgpCit7CisgICAgbG9jYWwgVkFSTkFNRT0kMQorICAgIGxvY2FsIFZBUlZBTD1gdmFyX3ZhbHVlICRWQVJOQU1FYAorICAgIGxvY2FsIEZJUlNUPWBfbGlzdF9maXJzdCAkVkFSVkFMYAorICAgIGV2YWwgJFZBUk5BTUU9XCJgX2xpc3RfcmVzdCAkVkFSVkFMYFwiCisgICAgZWNobyAiJEZJUlNUIgorfQorCitfbGlzdF9maXJzdCAoKQoreworICAgIGVjaG8gJDEKK30KKworX2xpc3RfcmVzdCAoKQoreworICAgIHNoaWZ0CisgICAgZWNobyAiJEAiCit9CisKK3Zhcl9saXN0X2ZpcnN0ICgpCit7CisgICAgbG9jYWwgVkFMPWB2YXJfdmFsdWUgJDFgCisgICAgX2xpc3RfZmlyc3QgJFZBTAorfQorCit2YXJfbGlzdF9yZXN0ICgpCit7CisgICAgbG9jYWwgVkFMPWB2YXJfdmFsdWUgJDFgCisgICAgX2xpc3RfcmVzdCAkVkFMCit9CisKK0FMTF9UQVNLUz0KKworIyBEZWZpbmUgYSBuZXcgdGFzayBmb3IgdGhpcyBidWlsZCBzY3JpcHQKKyMgJDE6IFRhc2sgbmFtZSAoZS5nLiBidWlsZF9zdHVmZikKKyMgJDI6IFRhc2sgZGVzY3JpcHRpb24KKyMgJDM6IE9wdGlvbmFsOiBjb21tYW5kIG5hbWUgKHdpbGwgYmUgY21kXyQxIGJ5IGRlZmF1bHQpCisjCit0YXNrX2RlZmluZSAoKQoreworICAgIGxvY2FsIFRBU0s9IiQxIgorICAgIGxvY2FsIERFU0NSPSIkMiIKKyAgICBsb2NhbCBDT01NQU5EPSIkezM6LWNtZF8kMX0iCisKKyAgICB2YXJfbGlzdF9hcHBlbmQgQUxMX1RBU0tTICRUQVNLCisgICAgdGFza19zZXQgJFRBU0sgbmFtZSAiJFRBU0siCisgICAgdGFza19zZXQgJFRBU0sgZGVzY3IgIiRERVNDUiIKKyAgICB0YXNrX3NldCAkVEFTSyBjbWQgIiRDT01NQU5EIgorICAgIHRhc2tfc2V0ICRUQVNLIGRlcHMgIiIKK30KKworIyBWYXJpYW50IG9mIHRhc2sgZGVmaW5lIGZvciBkdWFsIHRhc2tzCisjIFRoaXMgcmVhbGx5IGRlZmluZXMgdHdvIHRhc2tzIG5hbWVkICc8dGFzaz5fMScgYW5kICc8dGFzaz5fMiIKKyMgJDE6IFRhc2sgYmFzZSBuYW1lCisjICQyOiBUYXNrIGRlc2NyaXB0aW9uCisjICQzOiBPcHRpb25hbDogY29tbWFuZCBuYW1lICh3aWxsIGJlIGNtZF8kMSBieSBkZWZhdWx0KQordGFzazJfZGVmaW5lICgpCit7CisgICAgbG9jYWwgVEFTSz0iJDEiCisgICAgbG9jYWwgREVTQ1I9IiQyIgorICAgIGxvY2FsIENPTU1BTkQ9IiR7MzotY21kXyQxfSIKKworICAgIHRhc2tfZGVmaW5lICIke1RBU0t9XzEiICIkREVTQ1IgMS8yIiAicGhhc2VfMSAkQ09NTUFORCIKKyAgICB0YXNrX2RlZmluZSAiJHtUQVNLfV8yIiAiJERFU0NSIDIvMiIgInBoYXNlXzIgJENPTU1BTkQiCit9CisKK3Rhc2tfc2V0ICgpCit7CisgICAgbG9jYWwgVEFTSz0iJDEiCisgICAgbG9jYWwgRklFTEQ9IiQyIgorICAgIHNoaWZ0OyBzaGlmdDsKKyAgICBldmFsIFRBU0tfJHtUQVNLfV9fJHtGSUVMRH09XCIkQFwiCit9CisKK3Rhc2tfZ2V0ICgpCit7CisgICAgdmFyX3ZhbHVlIFRBU0tfJDFfXyQyCit9CisKKyMgcmV0dXJuIHRoZSBsaXN0IG9mIGRlcGVuZGVuY2llcyBmb3IgYSBnaXZlbiB0YXNrCit0YXNrX2dldF9kZXBzICgpCit7CisgICAgdGFza19nZXQgJDEgZGVwcworfQorCit0YXNrX2dldF9jbWQgKCkKK3sKKyAgICB0YXNrX2dldCAkMSBjbWQKK30KKwordGFza19nZXRfZGVzY3IgKCkKK3sKKyAgICB0YXNrX2dldCAkMSBkZXNjcgorfQorCisjICQxOiB0YXNrIG5hbWUKKyMgJDIrOiBvdGhlciB0YXNrcyB0aGlzIHRhc2sgZGVwZW5kcyBvbi4KK3Rhc2tfZGVwZW5kcyAoKQoreworICAgIGxvY2FsIFRBU0s9IiQxIgorICAgIHNoaWZ0OworICAgIHZhcl9saXN0X2FwcGVuZCBUQVNLXyR7VEFTS31fX2RlcHMgJEAKK30KKworIyAkMTogZHVhbCB0YXNrIG5hbWUKKyMgJDIrOiBvdGhlciBub24tZHVhbCB0YXNrcyB0aGlzIGR1YWwgdGFzayBkZXBlbmRzIG9uCit0YXNrMl9kZXBlbmRzMSAoKQoreworICAgIGxvY2FsIFRBU0s9IiQxIgorICAgIHNoaWZ0CisgICAgdmFyX2xpc3RfYXBwZW5kIFRBU0tfJHtUQVNLfV8xX19kZXBzICRACisgICAgdmFyX2xpc3RfYXBwZW5kIFRBU0tfJHtUQVNLfV8yX19kZXBzICRACit9CisKKyMgJDE6IGR1YWwgdGFzayBuYW1lCisjICQyKzogb3RoZXIgZHVhbCB0YXNrcyB0aGlzIGR1YWwgdGFzayBkZXBlbmRzIG9uCit0YXNrMl9kZXBlbmRzMiAoKQoreworICAgIGxvY2FsIFRBU0s9IiQxIgorICAgIGxvY2FsIERFUAorICAgIHNoaWZ0CisgICAgZm9yIERFUDsgZG8KKyAgICAgICAgdmFyX2xpc3RfYXBwZW5kIFRBU0tfJHtUQVNLfV8xX19kZXBzICR7REVQfV8xCisgICAgICAgIHZhcl9saXN0X2FwcGVuZCBUQVNLXyR7VEFTS31fMl9fZGVwcyAke0RFUH1fMgorICAgIGRvbmUKK30KKwordGFza19kdW1wICgpCit7CisgICAgbG9jYWwgVEFTSworICAgIGZvciBUQVNLIGluICRBTExfVEFTS1M7IGRvCisgICAgICAgIGxvY2FsIERFUFM9ImB0YXNrX2dldF9kZXBzICRUQVNLYCIKKyAgICAgICAgbG9jYWwgQ01EPSJgdGFza19nZXRfY21kICRUQVNLYCIKKyAgICAgICAgbG9jYWwgREVTQ1I9ImB0YXNrX2dldF9kZXNjciAkVEFTS2AiCisgICAgICAgIGVjaG8gIlRBU0sgJFRBU0s6ICRERVNDUjogJENNRCIKKyAgICAgICAgZWNobyAiPiAgJERFUFMiCisgICAgZG9uZQorfQorCit0YXNrX3Zpc2l0ICgpCit7CisgICAgdGFza19zZXQgJFRBU0sgdmlzaXQgMQorfQorCit0YXNrX3VudmlzaXQgKCkKK3sKKyAgICB0YXNrX3NldCAkVEFTSyB2aXNpdCAwCit9CisKK3Rhc2tfaXNfdmlzaXRlZCAoKQoreworICAgIFsgYHRhc2tfZ2V0ICRUQVNLIHZpc2l0YCA9IDEgXQorfQorCit0YXNrX3F1ZXVlX3Jlc2V0ICgpCit7CisgICAgVEFTS19RVUVVRT0KK30KKwordGFza19xdWV1ZV9wdXNoICgpCit7CisgICAgdmFyX2xpc3RfYXBwZW5kIFRBU0tfUVVFVUUgJDEKK30KKwordGFza19xdWV1ZV9wb3AgKCkKK3sKKyAgICBsb2NhbCBGSVJTVD1gdmFyX2xpc3RfZmlyc3QgVEFTS19RVUVVRWAKKyAgICBUQVNLX1FVRVVFPWB2YXJfbGlzdF9yZXN0IFRBU0tfUVVFVUVgCit9CisKK2RvX2FsbF90YXNrcyAoKQoreworICAgIGxvY2FsIFRBU0sKKyAgICBsb2NhbCBUQVNLX0xJU1Q9CisgICAgdGFza19xdWV1ZV9yZXNldAorICAgICMgQ2xlYXIgdmlzaXQgZmxhZ3MKKyAgICBmb3IgVEFTSyBpbiAkQUxMX1RBU0tTOyBkbworICAgICAgICB0YXNrX3VudmlzaXQgJFRBU0sKKyAgICBkb25lCisgICAgdGFza19xdWV1ZV9wdXNoICQxCisgICAgd2hpbGUgWyAtbiAiJFRBU0tfUVVFVUUiIF0gOyBkbworICAgICAgICBUQVNLPWB0YXNrX3F1ZXVlX3BvcGAKKyAgICAgICAgaWYgdGFza19pc192aXNpdGVkICRUQVNLOyB0aGVuCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmaQorICAgICAgICAjIFByZXBlbmQgdGhlIHRhc2sgdG8gdGhlIGxpc3QgaWYgaXRzIHRpbWVzdGFtcCBpcyBub3Qgc2V0CisgICAgICAgIGlmIHN0YW1wX2NoZWNrICRUQVNLOyB0aGVuCisgICAgICAgICAgICB2YXJfbGlzdF9wcmVwZW5kIFRBU0tfTElTVCAkVEFTSworICAgICAgICBmaQorICAgICAgICAjIEFkZCBhbGwgZGVwZW5kZW5jaWVzIHRvIHRoZSB3b3JrLXF1ZXVlCisgICAgICAgIGxvY2FsIFNVQlRBU0sKKyAgICAgICAgZm9yIFNVQlRBU0sgaW4gYHRhc2tfZ2V0X2RlcHMgJFRBU0tgOyBkbworICAgICAgICAgICAgdGFza19xdWV1ZV9wdXNoICRTVUJUQVNLCisgICAgICAgIGRvbmUKKyAgICAgICAgdGFza192aXNpdCAkVEFTSworICAgIGRvbmUKKworICAgICMgTm93LCBUQVNLX0xJU1QgY29udGFpbnMgdGhlCit9CisKKworIyBSZXR1cm4gdGhlIGZpcnN0IGl0ZW0gb2YgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdAorbGlzdF9maXJzdCAoKSB7CisgICAgc2V0IC0tICIkQCIKKyAgICBlY2hvICIkMSIKK30KKworIyBBcHBlbmQgYW4gaXRlbSB0byBhIGdpdmVuIGxpc3QKK2xpc3RfYXBwZW5kICgpIHsKKyAgICBsb2NhbCBJVEVNPSQxCisgICAgc2hpZnQ7CisgICAgZWNobyAkQCR7QDorIiAifSQxCit9CisKKyMgUmV0dXJuIHRoZSBzZWNvbmQtdG8tbGFzdCBpdGVtcyBvZiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0CitsaXN0X3Jlc3QgKCkgeworICAgIHNldCAtLSAiJEAiCisgICAgc2hpZnQKKyAgICBlY2hvICIkQCIKK30KKworIyBSZXZlcnNlIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3QKK2xpc3RfcmV2ZXJzZSAoKQoreworICAgIHNldCAtLSAiJEAiCisgICAgbG9jYWwgSTEgSTIgSTMgSTQgSTUgSTYgSTcgSTggSTkgUkVTVCBSRVQKKyAgICBJMT0kMTsgSTI9JDI7IEkzPSQzOyBJND0kNDsgSTU9JDU7IEk2PSQ2OyBJNz0kNzsgSTg9JDg7IEk5PSQ5CisgICAgc2hpZnQ7IHNoaWZ0OyBzaGlmdDsgc2hpZnQ7IHNoaWZ0OyBzaGlmdDsgc2hpZnQ7IHNoaWZ0OyBzaGlmdDsKKyAgICBSRVQ9JEk5JHtJOTorIiAifSRJOCR7STg6KyIgIn0kSTcke0k3OisiICJ9JEk2JHtJNjorIiAifSRJNSR7STU6KyIgIn0kSTQke0k0OisiICJ9JEkzJHtJMzorIiAifSRJMiR7STI6KyIgIn0kSTEKKyAgICBSRVNUPSIkKiIKKyAgICBpZiBbIC1uICIkUkVTVCIgXTsgdGhlbgorICAgICAgICBSRVQ9JChsaXN0X3JldmVyc2UgJFJFU1QpIiAiJFJFVAorICAgIGZpCisgICAgZWNobyAiJFJFVCIKK30KKworIyBVc2VkIHRvIGJ1aWxkIHRoZSBsaXN0IG9mIHRhc2tzIHdpdGggYSB0cmVlIHBvc3Qtb3JkZXIgdHJhdmVyc2FsLCBpLmUuCisjIHRoZSBsaXN0IHN0YXJ0cyBhdCB0aGUgbGVhdmVzIGFuZCBmaW5pc2hlcyB3aXRoIHRoZSB0b3AgbGV2ZWwgdGFzaywKKyMgc28gdGhhdCBpZiB0YXNrKEEpIGRlcGVuZHMgb24gdGFzayhCKSwgdGhlbiBBIHdpbGwgYWx3YXlzIGFwcGVhciBfYWZ0ZXJfCisjIEIgaW4gdGhlIHJlc3VsdC4KKyMKKyMgJDE6IHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHRhc2tzIHRvIHZpc2l0CisjIE91dDogbGlzdCBvZiBhbGwgdGFza3MgaW4gcG9zdC1vcmRlcgorIwordGFza19idWlsZF9wb3N0b3JkZXJfbGlzdCAoKQoreworICAgIGxvY2FsIFRBU0sKKyAgICBsb2NhbCBTVEFDSz0iJDEiCisgICAgbG9jYWwgUkVUPSIiCisgICAgZm9yIFRBU0sgaW4gJEFMTF9UQVNLUzsgZG8KKyAgICAgICAgc3RhbXBfY2xlYXIgJFRBU0sudmlzaXQKKyAgICBkb25lCisgICAgd2hpbGUgdHJ1ZTsgZG8KKyAgICAgICAgIyBQZWVrIGF0IHN0YWNrCisgICAgICAgIFRBU0s9JChsaXN0X2ZpcnN0ICRTVEFDSykKKyAgICAgICAgI2VjaG8gPiYyICJTVEFDSzogKCRUQVNLKSAnJFNUQUNLJyIKKyAgICAgICAgaWYgWyAteiAiJFRBU0siIF07IHRoZW4KKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICAgIEhBU19ERVBTPQorICAgICAgICBmb3IgREVQIGluICQodGFza19nZXRfZGVwcyAkVEFTSyk7IGRvCisgICAgICAgICAgICAjZWNobyA+JjIgIkNIRUNLOiAnJERFUCciCisgICAgICAgICAgICBpZiAhIHN0YW1wX2NoZWNrICRERVAudmlzaXQ7IHRoZW4KKyAgICAgICAgICAgICAgICBTVEFDSz0kREVQIiAiJFNUQUNLCisgICAgICAgICAgICAgICAgI2VjaG8gPiYyICJQVVNIOiAnJERFUCcgPT4gJyRTVEFDSyciCisgICAgICAgICAgICAgICAgSEFTX0RFUFM9MQorICAgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorCisgICAgICAgIGlmIFsgLXogIiRIQVNfREVQUyIgXTsgdGhlbgorICAgICAgICAgICAgI2VjaG8gPiYyICJBREQ6ICRUQVNLIC0+ICckUkVUJyIKKyAgICAgICAgICAgIFNUQUNLPSQobGlzdF9yZXN0ICRTVEFDSykKKyAgICAgICAgICAgIGlmICEgc3RhbXBfY2hlY2sgJFRBU0sudmlzaXQ7IHRoZW4KKyAgICAgICAgICAgICAgICBSRVQ9JFJFVCR7UkVUOisiICJ9JFRBU0sKKyAgICAgICAgICAgICAgICBzdGFtcF9zZXQgJFRBU0sudmlzaXQKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgZG9uZQorICAgIGZvciBUQVNLIGluICRBTExfVEFTS1M7IGRvCisgICAgICAgIHN0YW1wX2NsZWFyICRUQVNLLnZpc2l0CisgICAgZG9uZQorICAgIGVjaG8gIiRSRVQiCit9CisKK3J1bl90YXNrICgpCit7CisgICAgIyBCdWlsZCB0aGUgbGlzdCBvZiB0YXNrcywgaW4gcmV2ZXJzZSBvcmRlciAoZnJvbSBsZWFmcyB0byBsYXN0KQorICAgIGxvY2FsIFRBU0tTPSQodGFza19idWlsZF9wb3N0b3JkZXJfbGlzdCAkMSkKKyAgICAjIERvIGFsbCB0YXNrcworICAgIGxvY2FsIFRBU0sgREVQIERFU0NSCisKKyAgICAjIER1bXAgbGlzdCBvZiB0YXNrczoKKyMgICAgIGVjaG8gIkFMTCBUQVNLUzoiCisjICAgICBmb3IgVEFTSyBpbiAkVEFTS1M7IGRvCisjICAgICAgICAgZWNobyAiICAkVEFTSyIKKyMgICAgIGRvbmUKKworICAgICMgQ2xlYW4gdGltZXN0YW1wcyBvZiBhbnkgdGFza3Mgd2hvc2UgYW55IG9mIGl0cyBkZXBlbmRlbnRzIG5lZWRzCisgICAgIyB0byBiZSByZS1kb25lLgorICAgICMKKyAgICBmb3IgVEFTSyBpbiAkVEFTS1M7IGRvCisgICAgICAgZm9yIERFUCBpbiAkKHRhc2tfZ2V0X2RlcHMgJFRBU0spOyBkbworICAgICAgICAgICAgaWYgISBzdGFtcF9jaGVjayAkREVQOyB0aGVuCisgICAgICAgICAgICAgICAgI2VjaG8gIlJlZG86ICRUQVNLIGR1ZSB0byAkREVQIgorICAgICAgICAgICAgICAgIHN0YW1wX2NsZWFyICRUQVNLCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGZpCisgICAgICAgZG9uZQorICAgIGRvbmUKKworICAgIGZvciBUQVNLIGluICRUQVNLUzsgZG8KKyAgICAgICAgREVTQ1I9JCh0YXNrX2dldF9kZXNjciAkVEFTSykKKyAgICAgICAgaWYgc3RhbXBfY2hlY2sgJFRBU0s7IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlNraXBwaW5nOiAkREVTQ1IiCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmaQorICAgICAgICBlY2hvICJSdW5uaW5nOiAkREVTQ1IiCisgICAgICAgIGlmIFsgIiRWRVJCT1NFIiAtZ2UgMSBdIDsgdGhlbgorICAgICAgICAgICAgKGV2YWwgJCh0YXNrX2dldF9jbWQgJFRBU0spKQorICAgICAgICBlbHNlCisgICAgICAgICAgICAoZXZhbCAkKHRhc2tfZ2V0X2NtZCAkVEFTSykpID4+ICRUTVBMT0cgMj4mMQorICAgICAgICBmaQorICAgICAgICBpZiBbICQ/ICE9IDAgXSA7IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIkVSUk9SOiBDYW5ub3QgJERFU0NSIgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisKKyAgICAgICAgc3RhbXBfc2V0ICRUQVNLCisgICAgZG9uZQorfQorCisjIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjbG9uZSBhIHNvdXJjZSByZXBvc2l0b3J5IGVpdGhlciBmcm9tIGEgZ2l2ZW4KKyMgZ2l0IGJhc2Ugb3IgYSBnaXQgcmVmZXJlbmNlLgorIyAkMTogcHJvamVjdC9zdWJkaXIgbmFtZQorIyAkMjogcGF0aCB0byBTT1VSQ0VTIGZpbGUKK3Rvb2xjaGFpbl9jbG9uZSAoKQoreworICAgIGxvY2FsIEdJVEZMQUdTCisgICAgR0lURkxBR1M9CisgICAgaWYgWyAiJEdJVF9SRUZFUkVOQ0UiIF07IHRoZW4KKyAgICAgICAgR0lURkxBR1M9IiRHSVRGTEFHUyAtLXNoYXJlZCAtLXJlZmVyZW5jZSAkR0lUX1JFRkVSRU5DRS8kMSIKKyAgICBmaQorICAgIGVjaG8gImNsZWFuaW5nIHVwIHRvb2xjaGFpbi8kMSIKKyAgICBybSAtcmYgJDEKKyAgICBmYWlsX3BhbmljICJDb3VsZCBub3QgY2xlYW4gJChwd2QpLyQxIgorICAgIGVjaG8gImRvd25sb2FkaW5nIHNvdXJjZXMgZm9yIHRvb2xjaGFpbi8kMSIKKyAgICBpZiBbIC1kICIkR0lUX0JBU0UvJDEiIF07IHRoZW4KKyAgICAgICAgbG9nICJjbG9uaW5nICRHSVRfQkFTRS8kMSIKKyAgICAgICAgcnVuICRHSVRfQ01EIGNsb25lICRHSVRGTEFHUyAkR0lUX0JBU0UvJDEgJDEKKyAgICBlbHNlCisgICAgICAgIGxvZyAiY2xvbmluZyAkR0lUUFJFRklYLyQxLmdpdCIKKyAgICAgICAgcnVuICRHSVRfQ01EIGNsb25lICRHSVRGTEFHUyAkR0lUX0JBU0UvJDEuZ2l0ICQxCisgICAgZmkKKyAgICBmYWlsX3BhbmljICJDb3VsZCBub3QgY2xvbmUgJEdJVF9CQVNFLyQxLmdpdCA/IgorICAgIGNkICQxCisgICAgaWYgWyAiJEdJVF9CUkFOQ0giICE9ICJtYXN0ZXIiIF0gOyB0aGVuCisgICAgICAgIGxvZyAiY2hlY2tpbmcgb3V0ICRHSVRfQlJBTkNIIGJyYW5jaCBvZiAkMS5naXQiCisgICAgICAgIHJ1biAkR0lUX0NNRCBjaGVja291dCAtYiAkR0lUX0JSQU5DSCBvcmlnaW4vJEdJVF9CUkFOQ0gKKyAgICAgICAgZmFpbF9wYW5pYyAiQ291bGQgbm90IGNoZWNrb3V0ICQxID8iCisgICAgZmkKKyAgICAjIElmIC0tZ2l0LWRhdGUgaXMgdXNlZCwgb3Igd2UgaGF2ZSBhIGRlZmF1bHQKKyAgICBpZiBbIC1uICIkR0lUX0RBVEUiIF0gOyB0aGVuCisgICAgICAgIFJFVklTSU9OPWBnaXQgcmV2LWxpc3QgLW4gMSAtLXVudGlsPSIkR0lUX0RBVEUiIEhFQURgCisgICAgICAgIGVjaG8gIlVzaW5nIHNvdXJjZXMgZm9yIGRhdGUgJyRHSVRfREFURSc6IHRvb2xjaGFpbi8kMSByZXZpc2lvbiAkUkVWSVNJT04iCisgICAgICAgIHJ1biAkR0lUX0NNRCBjaGVja291dCAkUkVWSVNJT04KKyAgICAgICAgZmFpbF9wYW5pYyAiQ291bGQgbm90IGNoZWNrb3V0ICQxID8iCisgICAgZmkKKyAgICAocHJpbnRmICIlLTMycyAiICJ0b29sY2hhaW4vJDEuZ2l0OiAiICYmIGdpdCBsb2cgLTEgLS1mb3JtYXQ9b25lbGluZSkgPj4gJDIKKyAgICBjZCAuLgorfQorCit0YXNrX2RlZmluZSBkb3dubG9hZF90b29sY2hhaW5fc291cmNlcyAiRG93bmxvYWQgdG9vbGNoYWluIHNvdXJjZXMgZnJvbSAkR0lUX0JBU0UgIgorY21kX2Rvd25sb2FkX3Rvb2xjaGFpbl9zb3VyY2VzICgpCit7CisgICAgbG9jYWwgU1VCRElSUz0iYmludXRpbHMgYnVpbGQgZ2NjIGdkYiBnb2xkIGdtcCBtcGZyIG1wYyBpc2wgY2xvb2ciCisgICAgKG1rZGlyIC1wICRUT09MQ0hBSU5fU1JDX0RJUiAmJiBjZCAkVE9PTENIQUlOX1NSQ19ESVIgJiYKKyAgICAjIENyZWF0ZSBhIHRlbXBvcmFyeSBTT1VSQ0VTIGZpbGUgZm9yIHRoZSB0b29sY2hhaW4gc291cmNlcyBvbmx5CisgICAgIyBJdCdzIGNvbnRlbnQgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGZpbmFsIFNPVVJDRVMgZmlsZSBsYXRlci4KKyAgICBTT1VSQ0VTX0xJU1Q9JFRPT0xDSEFJTl9TUkNfRElSL1NPVVJDRVMKKyAgICBybSAtZiAkU09VUkNFU19MSVNUICYmIHRvdWNoICRTT1VSQ0VTX0xJU1QKKyAgICBmb3IgU1VCIGluICRTVUJESVJTOyBkbworICAgICAgICB0b29sY2hhaW5fY2xvbmUgJFNVQiAkU09VUkNFU19MSVNUCisgICAgZG9uZQorICAgICkKK30KKwordGFza19kZWZpbmUgZG93bmxvYWRfdWJ1bnR1X3BhY2thZ2VzX2xpc3QgIkRvd25sb2FkIFVidW50dSBwYWNrYWdlcyBsaXN0IgorY21kX2Rvd25sb2FkX3VidW50dV9wYWNrYWdlc19saXN0ICgpCit7CisgICAgbWtkaXIgLXAgJERPV05MT0FEX0RJUgorICAgIGdldF91YnVudHVfcGFja2FnZXNfbGlzdCAiJFVCVU5UVV9NSVJST1IiICIkVUJVTlRVX1JFTEVBU0UiCisgICAgZmFpbF9wYW5pYyAiVW5hYmxlIHRvIGRvd25sb2FkIHBhY2thZ2VzIGxpc3QsIHRyeSAtLXVidW50dS1taXJyb3I9PHVybD4gdG8gdXNlIGFub3RoZXIgYXJjaGl2ZSBtaXJyb3IiCit9CisKK3Rhc2tfZGVmaW5lIGRvd25sb2FkX3BhY2thZ2VzICJEb3dubG9hZCBVYnVudHUgcGFja2FnZXMiCit0YXNrX2RlcGVuZHMgZG93bmxvYWRfcGFja2FnZXMgZG93bmxvYWRfdWJ1bnR1X3BhY2thZ2VzX2xpc3QKK2NtZF9kb3dubG9hZF9wYWNrYWdlcyAoKQoreworICAgIGxvY2FsIFBBQ0tBR0UgUEtHVVJMCisKKyAgICBybSAtZiAkRE9XTkxPQURfRElSL1NPVVJDRVMgJiYgdG91Y2ggJERPV05MT0FEX0RJUi9TT1VSQ0VTCisgICAgZm9yIFBBQ0tBR0UgaW4gJFVCVU5UVV9QQUNLQUdFUzsgZG8KKyAgICAgICAgZWNobyAiRG93bmxvYWRpbmcgJFBBQ0tBR0UiCisJICAgIGZvciBVQSBpbiAkVUJVTlRVX0FSQ0hTOyBkbworICAgICAgICAgICAgUEtHVVJMPWBnZXRfdWJ1bnR1X3BhY2thZ2VfZGViX3VybCAkUEFDS0FHRSAkVUJVTlRVX01JUlJPUiAkVUFgCisgICAgICAgICAgICBlY2hvICJVUkw6ICRQS0dVUkwiCisgICAgICAgICAgICBkb3dubG9hZF9maWxlX3RvICRQS0dVUkwgJERPV05MT0FEX0RJUgorICAgICAgICAgICAgZmFpbF9wYW5pYyAiQ291bGQgbm90IGRvd25sb2FkICRQS0dVUkwiCisgICAgICAgIGRvbmUKKyAgICBkb25lCisgICAgc2hhMXN1bSAkRE9XTkxPQURfRElSLyouZGViIHwgd2hpbGUgcmVhZCBMSU5FOyBkbworICAgICAgICBQQUNLQUdFPSQoYmFzZW5hbWUgJChlY2hvICRMSU5FIHwgYXdrICd7IHByaW50ICQyO30nKSkKKyAgICAgICAgU0hBMT0kKGVjaG8gJExJTkUgfCBhd2sgJ3sgcHJpbnQgJDE7IH0nKQorICAgICAgICBwcmludGYgIiUtNjRzICVzXG4iICRQQUNLQUdFICRTSEExID4+ICRET1dOTE9BRF9ESVIvU09VUkNFUworICAgIGRvbmUKK30KKwordGFza19kZWZpbmUgYnVpbGRfc3lzcm9vdCAiQnVpbGQgc3lzcm9vdCIKK3Rhc2tfZGVwZW5kcyBidWlsZF9zeXNyb290IGRvd25sb2FkX3BhY2thZ2VzCisKK2NtZF9idWlsZF9zeXNyb290ICgpCit7CisgICAgbG9jYWwgUEFDS0FHRSBQS0dVUkwgU1JDX1BLRworICAgIG1rZGlyIC1wICRTUkNfUEtHICRPUkdfU1lTUk9PVF9ESVIKKyAgICBmb3IgUEFDS0FHRSBpbiAkVUJVTlRVX1BBQ0tBR0VTOyBkbworCSAgICBmb3IgVUEgaW4gJFVCVU5UVV9BUkNIUzsgZG8KKyAgICAgICAgICAgIFBLR1VSTD1gZ2V0X3VidW50dV9wYWNrYWdlX2RlYl91cmwgJFBBQ0tBR0UgJFVCVU5UVV9NSVJST1IgJFVBYAorICAgICAgICAgICAgU1JDX1BLRz0kRE9XTkxPQURfRElSL2BiYXNlbmFtZSAkUEtHVVJMYAorICAgICAgICAgICAgZWNobyAiRXh0cmFjdGluZyAkU1JDX1BLRyIKKyAgICAgICAgICAgIGRwa2cgLXggJFNSQ19QS0cgJE9SR19TWVNST09UX0RJUi8kVUEKKwkgICAgZG9uZQorICAgIGRvbmUKK30KKworIyBOb3csIHdlIG5lZWQgdG8gcGF0Y2ggbGliYy5zbyB3aGljaCBpcyBhY3R1YWxseSBhIGxpbmtlciBzY3JpcHQKKyMgcmVmZXJlbmNpbmcgL2xpYiogYW5kIC91c3IvbGliKi4gRG8gdGhlIHNhbWUgZm9yIGxpYnB0aHJlYWQuc28KK3BhdGNoX2xpYnJhcnkgKCkKK3sKKyAgICBlY2hvICJQYXRjaGluZyAkMSIKKyAgICBzZWQgLWkgLWUgInM6IC91c3IvbGliW14gXSovOiA6ZztzOiAvbGliW14gXSovOiA6ZyIgJDEKK30KKworIyBVc2VkIHRvIHNldHVwIHBoYXNlIDEgdGhlIHJ1biBhIGNvbW1hbmQKK3BoYXNlXzEgKCkKK3sKKyAgICBQSEFTRT0xCisgICAgJEAKK30KKworIyBVc2VkIHRvIHNldHVwIHBoYXNlIDIgdGhlbiBydW4gYSBjb21tYW5kCitwaGFzZV8yICgpCit7CisgICAgUEhBU0U9MQorICAgIEJJTlBSRUZJWD0kKGluc3RhbGxfZGlyKS9iaW4vJHtHQ0NfVEFSR0VUfS0KKyAgICBDQz0ke0JJTlBSRUZJWH1nY2MKKyAgICBDWFg9JHtCSU5QUkVGSVh9ZysrCisgICAgTEQ9JHtCSU5QUkVGSVh9bGQKKyAgICBBUj0ke0JJTlBSRUZJWH1hcgorICAgIEFTPSR7QklOUFJFRklYfWFzCisgICAgUkFOTElCPSR7QklOUFJFRklYfXJhbmxpYgorICAgIFNUUklQPSR7QklOUFJFRklYfXN0cmlwCisgICAgQ0NfRk9SX1RBUkdFVD0ke0JJTlBSRUZJWH1nY2MKKyAgICBleHBvcnQgQ0MgQ1hYIExEIEFSIEFTIFJBTkxJQiBTVFJJUCBDQ19GT1JfVEFSR0VUCisgICAgUEhBU0U9MgorICAgICRACit9CisKKyMgUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBzeW1ib2xpYyBsaW5rcyBpbiBhIGdpdmVuIGRpcmVjdG9yeSwgZXhjbHVkaW5nCisjIGFueSBsaW5rcyBpbiBpdHMgc3ViLWRpcmVjdG9yaWVzLgorIyAkMTogU3ViLWRpcmVjdG9yeSBwYXRoLgorZmluZF9zeW1saW5rc19pbiAoKSB7CisgICAgKGNkICQxICYmIGZpbmQgLiAtbWF4ZGVwdGggMSAtdHlwZSBsKSB8IHNlZCAtZSAnc3xeXC4vfHxnJworfQorCit0YXNrMl9kZWZpbmUgY29weV9zeXNyb290ICJGaXggYW5kIGNvcHkgc3lzcm9vdCIKK3Rhc2syX2RlcGVuZHMxIGNvcHlfc3lzcm9vdCBidWlsZF9zeXNyb290CitjbWRfY29weV9zeXNyb290ICgpCit7CisgICAgbG9jYWwgU0wKKworICAgICMgQ29weSB0aGUgY29udGVudCBvZiAkT1JHX1NZU1JPT1RfRElSLy4uLi9saWIgdG8gJChzeXNyb290X2RpcikvdXNyL2xpYjMyCisgICAgY29weV9kaXJlY3RvcnkgJE9SR19TWVNST09UX0RJUi9pMzg2L2xpYiAkKHN5c3Jvb3RfZGlyKS91c3IvbGliMzIKKyAgICBjb3B5X2RpcmVjdG9yeSAkT1JHX1NZU1JPT1RfRElSL2kzODYvdXNyL2xpYiAkKHN5c3Jvb3RfZGlyKS91c3IvbGliMzIKKyAgICBjb3B5X2RpcmVjdG9yeSAkT1JHX1NZU1JPT1RfRElSL2kzODYvdXNyL2luY2x1ZGUgJChzeXNyb290X2RpcikvdXNyL2luY2x1ZGUKKworICAgIGNvcHlfZGlyZWN0b3J5ICRPUkdfU1lTUk9PVF9ESVIvYW1kNjQvbGliICQoc3lzcm9vdF9kaXIpL3Vzci9saWIKKyAgICBjb3B5X2RpcmVjdG9yeSAkT1JHX1NZU1JPT1RfRElSL2FtZDY0L3Vzci9saWIgJChzeXNyb290X2RpcikvdXNyL2xpYgorICAgIGNvcHlfZGlyZWN0b3J5ICRPUkdfU1lTUk9PVF9ESVIvYW1kNjQvdXNyL2luY2x1ZGUgJChzeXNyb290X2RpcikvdXNyL2luY2x1ZGUKKworICAgICMgVWJ1bnR1IHByZWNpc2UgcmVsZWFzZSBoYXMgLnNvIGZpbGVzIGluCisgICAgIyAvdXNyL2xpYi94ODZfNjQtbGludXgtZ251IGFuZCAvdXNyL2xpYjMyL2kzODYtbGludXgtZ251LgorICAgIGZvciBMSUIgaW4gJChzeXNyb290X2RpcikvdXNyL2xpYi94ODZfNjQtbGludXgtZ251IFwKKyAgICAgICAgICAgICAgICQoc3lzcm9vdF9kaXIpL3Vzci9saWIzMi9pMzg2LWxpbnV4LWdudTsgZG8KKyAgICAgICAgbXYgJExJQi8qIGBkaXJuYW1lICRMSUJgICYmIHJtZGlyICRMSUIKKyAgICAgICAgZmFpbF9wYW5pYyAiQ2Fubm90IG1vdmUgZmlsZXMgaW4gJExJQiIKKyAgICBkb25lCisKKyAgICBmb3IgTElCIGluIGxpYiBsaWIzMjsgZG8KKyAgICAgICAgIyBXZSBuZWVkIHRvIGZpeCB0aGUgc3ltbGluayBsaWtlIGxpYnJ0LnNvIC0+IC9saWIqL2xpYnJ0LnNvLjEKKyAgICAgICAgIyBpbiAkKHN5c3Jvb3RfZGlyKS91c3IvJExJQiwgdGhleSBzaG91bGQgcG9pbnQgdG8gbGlicnQuc28uMSBpbnN0ZWFkIG5vdy4KKyAgICAgICAgU1lNTElOS1M9JChmaW5kX3N5bWxpbmtzX2luICQoc3lzcm9vdF9kaXIpL3Vzci8kTElCKQorICAgICAgICBjZCAkKHN5c3Jvb3RfZGlyKS91c3IvJExJQgorICAgICAgICBmb3IgU0wgaW4gJFNZTUxJTktTOyBkbworICAgICAgICAgICAgIyBjb252ZXJ0IC8kTElCL2xpYmZvby5zby48bj4gaW50byAnbGliZm9vLnNvLjxuPicgZm9yIHRoZSB0YXJnZXQKKyAgICAgICAgICAgIGxvY2FsIERTVD0kKHJlYWRsaW5rICRTTCAyPi9kZXYvbnVsbCkKKyAgICAgICAgICAgIGxvY2FsIERTVDI9YGJhc2VuYW1lICREU1RgCisgICAgICAgICAgICBpZiBbICIkRFNUMiIgIT0gIiREU1QiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICJGaXhpbmcgc3ltbGluayAkU0wgLS0+ICREU1QiCisgICAgICAgICAgICAgICAgcm0gJFNMICYmIGxuIC1zICREU1QyICRTTAorICAgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorICAgICAgICBwYXRjaF9saWJyYXJ5IGxpYmMuc28KKyAgICAgICAgcGF0Y2hfbGlicmFyeSBsaWJwdGhyZWFkLnNvCisgICAgZG9uZQorfQorCit0YXNrX2RlZmluZSBwYXRjaF90b29sY2hhaW5fc291cmNlcyAiUGF0Y2ggdG9vbGNoYWluIHNvdXJjZXMuIgordGFza19kZXBlbmRzIHBhdGNoX3Rvb2xjaGFpbl9zb3VyY2VzIGRvd25sb2FkX3Rvb2xjaGFpbl9zb3VyY2VzCitjbWRfcGF0Y2hfdG9vbGNoYWluX3NvdXJjZXMgKCkKK3sKKyAgICBsb2cgIlBBVENIRVNfRElSID0gJFBBVENIRVNfRElSIgorICAgIGlmIFsgISAtZCAiJFBBVENIRVNfRElSIiBdOyB0aGVuCisgICAgICAgIGxvZyAiJFBBVENIRVNfRElSIGRvZXNuJ3QgZXhpc3QiCisgICAgICAgIHJldHVybiAwCisgICAgZmkKKworICAgIGxvY2FsIFBBVENIRVM9YChjZCAkUEFUQ0hFU19ESVIgJiYgZmluZCAuIC1uYW1lICIqLnBhdGNoIiB8IHNvcnQgKSAyPiAvZGV2L251bGxgCisgICAgaWYgWyAteiAiJFBBVENIRVMiIF0gOyB0aGVuCisgICAgICAgIGxvZyAiTm8gcGF0Y2hlcyBmaWxlcyBpbiAkUEFUQ0hFU19ESVIiCisgICAgICAgIHJldHVybiAwCisgICAgZmkKKworICAgIFBBVENIRVM9YGVjaG8gJFBBVENIRVMgfCBzZWQgLWUgcyVeXC4vJSVnYAorICAgIGZvciBQQVRDSCBpbiAkUEFUQ0hFUzsgZG8KKyAgICAgICAgUEFUQ0hESVI9YGRpcm5hbWUgJFBBVENIYAorICAgICAgICBQQVRDSE5BTUU9YGJhc2VuYW1lICRQQVRDSGAKKyAgICAgICAgbG9nICJBcHBseWluZyAkUEFUQ0hOQU1FIGludG8gJFRPT0xDSEFJTl9TUkNfRElSLyRQQVRDSERJUiIKKyAgICAgICAgKGNkICRUT09MQ0hBSU5fU1JDX0RJUi8kUEFUQ0hESVIgJiYgcGF0Y2ggLXAxIDwgJFBBVENIRVNfRElSLyRQQVRDSCkKKyAgICAgICAgZmFpbF9wYW5pYyAiUGF0Y2ggZmFpbHVyZSEhIFBsZWFzZSBjaGVjayB5b3VyIHBhdGNoZXMgZGlyZWN0b3J5ISIKKyAgICBkb25lCisKKyAgICBsb2cgIkRvbmUgcGF0Y2hpbmcuIgorfQorCit0YXNrX2RlZmluZSBwcmVwYXJlX3Rvb2xjaGFpbl9zb3VyY2VzICJQcmVwYXJlIHRvb2xjaGFpbiBzb3VyY2VzLiIKK2lmIFsgLW4gIiRHSVRfQkFTRSIgLW8gLW4gIiRHSVRfUkVGRVJFTkNFIiBdOyB0aGVuCisgICAgdGFza19kZXBlbmRzIHByZXBhcmVfdG9vbGNoYWluX3NvdXJjZXMgcGF0Y2hfdG9vbGNoYWluX3NvdXJjZXMKK2ZpCitjbWRfcHJlcGFyZV90b29sY2hhaW5fc291cmNlcyAoKQoreworICAgIHJldHVybgorfQorCit0YXNrMl9kZWZpbmUgY29uZmlndXJlX2JpbnV0aWxzICJDb25maWd1cmUgYmludXRpbHMtJEJJTlVUSUxTX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMSBjb25maWd1cmVfYmludXRpbHMgcHJlcGFyZV90b29sY2hhaW5fc291cmNlcwordGFzazJfZGVwZW5kczIgY29uZmlndXJlX2JpbnV0aWxzIGNvcHlfc3lzcm9vdAorY21kX2NvbmZpZ3VyZV9iaW51dGlscyAoKQoreworICAgIE9VVF9ESVI9JChidWlsZF9kaXJfZm9yIGJpbnV0aWxzKQorICAgIG1rZGlyIC1wICRPVVRfRElSICYmIGNkICRPVVRfRElSICYmCisgICAgcnVuICRUT09MQ0hBSU5fU1JDX0RJUi9iaW51dGlscy9iaW51dGlscy0kQklOVVRJTFNfVkVSU0lPTi9jb25maWd1cmUgXAorICAgICAgICAtLXByZWZpeD0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0td2l0aC1zeXNyb290PSQoc3lzcm9vdF9kaXIpIFwKKyAgICAgICAgLS10YXJnZXQ9JEdDQ19UQVJHRVQgXAorICAgICAgICAtLWVuYWJsZS1nb2xkPWRlZmF1bHQgXAorICAgICAgICAtLXdpdGgtaG9zdC1saWJzdGRjeHg9Jy1zdGF0aWMtbGliZ2NjIC1XbCwtQnN0YXRpYywtbHN0ZGMrKywtQmR5bmFtaWMgLWxtJyBcCisgICAgICAgIC0td2l0aC1nb2xkLWxkZmxhZ3M9Jy1zdGF0aWMtbGliZ2NjIC1zdGF0aWMtbGlic3RkYysrJyBcCisgICAgICAgIC0td2l0aC1idWd1cmw9aHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9zb3VyY2UvcmVwb3J0LWJ1Z3MuaHRtbAorfQorCit0YXNrMl9kZWZpbmUgYnVpbGRfYmludXRpbHMgIkJ1aWxkIGJpbnV0aWxzLSRCSU5VVElMU19WRVJTSU9OIgordGFzazJfZGVwZW5kczIgYnVpbGRfYmludXRpbHMgY29uZmlndXJlX2JpbnV0aWxzCitjbWRfYnVpbGRfYmludXRpbHMgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX2Rpcl9mb3IgYmludXRpbHMpICYmCisgICAgbWFrZSAkTUFLRV9GTEFHUworfQorCit0YXNrMl9kZWZpbmUgaW5zdGFsbF9iaW51dGlscyAiSW5zdGFsbCBiaW51dGlscy0kQklOVVRJTFNfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGluc3RhbGxfYmludXRpbHMgYnVpbGRfYmludXRpbHMKK2NtZF9pbnN0YWxsX2JpbnV0aWxzICgpCit7CisgICAgY2QgJChidWlsZF9kaXJfZm9yIGJpbnV0aWxzKSAmJgorICAgIG1ha2UgaW5zdGFsbAorfQorCit0YXNrMl9kZWZpbmUgZXh0cmFjdF9nbXAgIkV4dHJhY3Qgc291cmNlcyBmb3IgZ21wLSRHTVBfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMxIGV4dHJhY3RfZ21wIHByZXBhcmVfdG9vbGNoYWluX3NvdXJjZXMKK2NtZF9leHRyYWN0X2dtcCAoKQoreworICAgIE9VVF9ESVI9JChidWlsZF9kaXJfZm9yIGdtcCkKKyAgICBHTVBfVEFSQkFMTD0kVE9PTENIQUlOX1NSQ19ESVIvZ21wL2dtcC0kR01QX1ZFUlNJT04udGFyLmJ6MgorICAgIGlmIFsgISAtZiAiJEdNUF9UQVJCQUxMIiBdOyB0aGVuCisgICAgICAgIEdNUF9UQVJCQUxMPSRUT09MQ0hBSU5fU1JDX0RJUi90YXJiYWxscy9nbXAtJEdNUF9WRVJTSU9OLnRhci5iejIKKyAgICAgICAgaWYgWyAhIC1mICIkR01QX1RBUkJBTEwiIF07IHRoZW4KKyAgICAgICAgICAgIHBhbmljICJDYW4ndCBmaW5kIGdtcC0kR01QX1ZFUlNJT04gc291cmNlcyEhIgorICAgICAgICBmaQorICAgIGZpCisgICAgbWtkaXIgLXAgJE9VVF9ESVIgJiYgY2QgJE9VVF9ESVIgJiYKKyAgICB0YXIgeGpmICIkR01QX1RBUkJBTEwiCit9CisKK3Rhc2syX2RlZmluZSBjb25maWd1cmVfZ21wICJDb25maWd1cmUgZ21wLSRHTVBfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGNvbmZpZ3VyZV9nbXAgZXh0cmFjdF9nbXAgaW5zdGFsbF9iaW51dGlscworY21kX2NvbmZpZ3VyZV9nbXAgKCkKK3sKKyAgICBleHBvcnQgQUJJPSRHTVBfQUJJICYmCisgICAgY2QgJChidWlsZF9kaXJfZm9yIGdtcCkgJiYgbWtkaXIgLXAgYnVpbGQgJiYgY2QgYnVpbGQgJiYKKyAgICAuLi9nbXAtJEdNUF9WRVJTSU9OL2NvbmZpZ3VyZSBcCisgICAgICAgIC0tcHJlZml4PSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS1ob3N0PSRHTVBfVEFSR0VUIFwKKyAgICAgICAgLS13aXRoLXN5c3Jvb3Q9JChpbnN0YWxsX2RpcikgXAorICAgICAgICAtLWRpc2FibGUtc2hhcmVkCit9CisKK3Rhc2syX2RlZmluZSBidWlsZF9nbXAgIkJ1aWxkIGdtcC0kR01QX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBidWlsZF9nbXAgY29uZmlndXJlX2dtcAorY21kX2J1aWxkX2dtcCAoKQoreworICAgIGV4cG9ydCBBQkk9JEdNUF9BQkkgJiYKKyAgICBjZCAkKGJ1aWxkX2Rpcl9mb3IgZ21wKS9idWlsZCAmJgorICAgIG1ha2UgJE1BS0VfRkxBR1MKK30KKwordGFzazJfZGVmaW5lIGluc3RhbGxfZ21wICJJbnN0YWxsIGdtcC0kR01QX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBpbnN0YWxsX2dtcCBidWlsZF9nbXAKK2NtZF9pbnN0YWxsX2dtcCAoKQoreworICAgIGNkICQoYnVpbGRfZGlyX2ZvciBnbXApL2J1aWxkICYmCisgICAgbWFrZSBpbnN0YWxsCit9CisKKyMgVGhpcmQsIGJ1aWxkIG1wZnIKK3Rhc2syX2RlZmluZSBleHRyYWN0X21wZnIgIkV4dHJhY3Qgc291cmNlcyBmcm9tIG1wZnItJE1QRlJfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMxIGV4dHJhY3RfbXBmciBwcmVwYXJlX3Rvb2xjaGFpbl9zb3VyY2VzCitjbWRfZXh0cmFjdF9tcGZyICgpCit7CisgICAgT1VUX0RJUj0kKGJ1aWxkX2Rpcl9mb3IgbXBmcikKKyAgICBNUEZSX1RBUkJBTEw9JFRPT0xDSEFJTl9TUkNfRElSL21wZnIvbXBmci0kTVBGUl9WRVJTSU9OLnRhci5iejIKKyAgICBpZiBbICEgLWYgIiRNUEZSX1RBUkJBTEwiIF07IHRoZW4KKyAgICAgICAgTVBGUl9UQVJCQUxMPSRUT09MQ0hBSU5fU1JDX0RJUi90YXJiYWxscy9tcGZyLSRNUEZSX1ZFUlNJT04udGFyLmJ6MgorICAgICAgICBpZiBbICEgLWYgIiRNUEZSX1RBUkJBTEwiIF07IHRoZW4KKyAgICAgICAgICAgIHBhbmljICJDYW4ndCBmaW5kIG1wZnItJE1QRlJfVkVSU0lPTiBzb3VyY2VzISEiCisgICAgICAgIGZpCisgICAgZmkKKyAgICBta2RpciAtcCAkT1VUX0RJUiAmJiBjZCAkT1VUX0RJUiAmJgorICAgIHRhciB4amYgIiRNUEZSX1RBUkJBTEwiCit9CisKK3Rhc2syX2RlZmluZSBjb25maWd1cmVfbXBmciAiQ29uZmlndXJlIG1wZnItJE1QRlJfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGNvbmZpZ3VyZV9tcGZyIGV4dHJhY3RfbXBmciBpbnN0YWxsX2dtcAorY21kX2NvbmZpZ3VyZV9tcGZyICgpCit7CisgICAgY2QgJChidWlsZF9kaXJfZm9yIG1wZnIpICYmIG1rZGlyIC1wIGJ1aWxkICYmIGNkIGJ1aWxkICYmCisgICAgcnVuIC4uL21wZnItJE1QRlJfVkVSU0lPTi9jb25maWd1cmUgXAorICAgICAgICAtLXByZWZpeD0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0taG9zdD0kR01QX1RBUkdFVCBcCisgICAgICAgIC0td2l0aC1nbXA9JChpbnN0YWxsX2RpcikgXAorICAgICAgICAtLXdpdGgtc3lzcm9vdD0kKHN5c3Jvb3RfZGlyKSBcCisgICAgICAgIC0tZGlzYWJsZS1zaGFyZWQKK30KKwordGFzazJfZGVmaW5lIGJ1aWxkX21wZnIgIkJ1aWxkIG1wZnItJE1QRlJfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGJ1aWxkX21wZnIgY29uZmlndXJlX21wZnIKK2NtZF9idWlsZF9tcGZyICgpCit7CisgICAgY2QgJChidWlsZF9kaXJfZm9yIG1wZnIpL2J1aWxkICYmCisgICAgcnVuIG1ha2UgJE1BS0VfRkxBR1MKK30KKwordGFzazJfZGVmaW5lIGluc3RhbGxfbXBmciAiSW5zdGFsbCBtcGZyLSRNUEZSX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBpbnN0YWxsX21wZnIgYnVpbGRfbXBmcgorY21kX2luc3RhbGxfbXBmciAoKQoreworICAgIGNkICQoYnVpbGRfZGlyX2ZvciBtcGZyKS9idWlsZCAmJgorICAgIHJ1biBtYWtlIGluc3RhbGwKK30KKwordGFzazJfZGVmaW5lIGV4dHJhY3RfbXBjICJFeHRyYWN0IHNvdXJjZXMgZm9yIG1wYy0kTVBDX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMSBleHRyYWN0X21wYyBwcmVwYXJlX3Rvb2xjaGFpbl9zb3VyY2VzCitjbWRfZXh0cmFjdF9tcGMgKCkKK3sKKyAgICBPVVRfRElSPSQoYnVpbGRfZGlyX2ZvciBtcGMpCisgICAgTVBDX1RBUkJBTEw9JFRPT0xDSEFJTl9TUkNfRElSL21wYy9tcGMtJE1QQ19WRVJTSU9OLnRhci5negorICAgIGlmIFsgISAtZiAiJE1QQ19UQVJCQUxMIiBdOyB0aGVuCisgICAgICAgIE1QQ19UQVJCQUxMPSRUT09MQ0hBSU5fU1JDX0RJUi90YXJiYWxscy9tcGMtJE1QQ19WRVJTSU9OLnRhci5negorICAgICAgICBpZiBbICEgLWYgIiRNUENfVEFSQkFMTCIgXTsgdGhlbgorICAgICAgICAgICAgcGFuaWMgIkNhbid0IGZpbmQgbXBjLSRNUENfVkVSU0lPTiBzb3VyY2VzISEiCisgICAgICAgIGZpCisgICAgZmkKKyAgICBta2RpciAtcCAkT1VUX0RJUiAmJiBjZCAkT1VUX0RJUiAmJgorICAgIHRhciB4emYgIiRNUENfVEFSQkFMTCIKK30KKwordGFzazJfZGVmaW5lIGNvbmZpZ3VyZV9tcGMgIkNvbmZpZ3VyZSBtcGMtJE1QQ19WRVJTSU9OIgordGFzazJfZGVwZW5kczIgY29uZmlndXJlX21wYyBleHRyYWN0X21wYyBpbnN0YWxsX21wZnIKK2NtZF9jb25maWd1cmVfbXBjICgpCit7CisgICAgY2QgJChidWlsZF9kaXJfZm9yIG1wYykgJiYgbWtkaXIgLXAgYnVpbGQgJiYgY2QgYnVpbGQgJiYKKyAgICBydW4gLi4vbXBjLSRNUENfVkVSU0lPTi9jb25maWd1cmUgXAorICAgICAgICAtLXByZWZpeD0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0taG9zdD0kR01QX1RBUkdFVCBcCisgICAgICAgIC0td2l0aC1nbXA9JChpbnN0YWxsX2RpcikgXAorICAgICAgICAtLXdpdGgtbXBmcj0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0tZGlzYWJsZS1zaGFyZWQKK30KKwordGFzazJfZGVmaW5lIGJ1aWxkX21wYyAiQnVpbGQgbXBjLSRNUENfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGJ1aWxkX21wYyBjb25maWd1cmVfbXBjCitjbWRfYnVpbGRfbXBjICgpCit7CisgICAgY2QgJChidWlsZF9kaXJfZm9yIG1wYykvYnVpbGQgJiYKKyAgICBydW4gbWFrZSAkTUFLRV9GTEFHUworfQorCit0YXNrMl9kZWZpbmUgaW5zdGFsbF9tcGMgIkluc3RhbGwgbXBjLSRNUENfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGluc3RhbGxfbXBjIGJ1aWxkX21wYworY21kX2luc3RhbGxfbXBjICgpCit7CisgICAgY2QgJChidWlsZF9kaXJfZm9yIG1wYykvYnVpbGQgJiYKKyAgICBydW4gbWFrZSBpbnN0YWxsCit9CisKK3Rhc2syX2RlZmluZSBleHRyYWN0X2lzbCAiRXh0cmFjdCBzb3VyY2VzIGZvciBpc2wtJElTTF9WRVJTSU9OIgordGFzazJfZGVwZW5kczIgZXh0cmFjdF9pc2wgcHJlcGFyZV90b29sY2hhaW5fc291cmNlcworY21kX2V4dHJhY3RfaXNsICgpCit7CisgICAgT1VUX0RJUj0kKGJ1aWxkX2Rpcl9mb3IgaXNsKQorICAgIElTTF9UQVJCQUxMPSRUT09MQ0hBSU5fU1JDX0RJUi9pc2wvaXNsLSRJU0xfVkVSU0lPTi50YXIuYnoyCisgICAgaWYgWyAhIC1mICIkSVNMX1RBUkJBTEwiIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIkNhbid0IGZpbmQgaXNsLSRJU0xfVkVSU0lPTiBzb3VyY2VzISEiCisgICAgZmkKKyAgICBta2RpciAtcCAkT1VUX0RJUiAmJiBjZCAkT1VUX0RJUiAmJgorICAgIHRhciB4ZiAiJElTTF9UQVJCQUxMIgorfQorCit0YXNrMl9kZWZpbmUgY29uZmlndXJlX2lzbCAiQ29uZmlndXJpbmcgaXNsLSRJU0xfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGNvbmZpZ3VyZV9pc2wgZXh0cmFjdF9pc2wgaW5zdGFsbF9nbXAKK2NtZF9jb25maWd1cmVfaXNsICgpCit7CisgICAgY2QgJChidWlsZF9kaXJfZm9yIGlzbCkgJiYgbWtkaXIgLXAgYnVpbGQgJiYgY2QgYnVpbGQgJiYKKyAgICBydW4gLi4vaXNsLSRJU0xfVkVSU0lPTi9jb25maWd1cmUgXAorICAgICAgICAtLXByZWZpeD0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0taG9zdD0kR01QX1RBUkdFVCBcCisgICAgICAgIC0td2l0aC1nbXAtcHJlZml4PSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS13aXRoLXN5c3Jvb3Q9JChzeXNyb290X2RpcikgXAorICAgICAgICAtLWRpc2FibGUtc2hhcmVkCit9CisKK3Rhc2syX2RlZmluZSBidWlsZF9pc2wgIkJ1aWxkaW5nIGlzbC0kSVNMX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBidWlsZF9pc2wgY29uZmlndXJlX2lzbAorY21kX2J1aWxkX2lzbCAoKQoreworICAgIGNkICQoYnVpbGRfZGlyX2ZvciBpc2wpL2J1aWxkICYmCisgICAgcnVuIG1ha2UgJE1BS0VfRkxBR1MKK30KKwordGFzazJfZGVmaW5lIGluc3RhbGxfaXNsICJJbnN0YWxsaW5nIGlzbC0kSVNMX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBpbnN0YWxsX2lzbCBidWlsZF9pc2wKK2NtZF9pbnN0YWxsX2lzbCAoKQoreworICAgIGNkICQoYnVpbGRfZGlyX2ZvciBpc2wpL2J1aWxkICYmCisgICAgbWFrZSBpbnN0YWxsCit9CisKK3Rhc2syX2RlZmluZSBjb25maWd1cmVfY2xvb2cgIkNvbmZpZ3VyZSBDbG9vZy0kQ0xPT0dfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGNvbmZpZ3VyZV9jbG9vZyBwcmVwYXJlX3Rvb2xjaGFpbl9zb3VyY2VzIGluc3RhbGxfZ21wIGluc3RhbGxfaXNsCitjbWRfY29uZmlndXJlX2Nsb29nICgpIHsKKyAgICBta2RpciAtcCAkKGJ1aWxkX2Rpcl9mb3IgY2xvb2cpL2J1aWxkICYmIGNkICQoYnVpbGRfZGlyX2ZvciBjbG9vZykvYnVpbGQgJiYKKyAgICBydW4gJFRPT0xDSEFJTl9TUkNfRElSL2Nsb29nL2Nsb29nLSRDTE9PR19WRVJTSU9OL2NvbmZpZ3VyZSBcCisgICAgICAgIC0tcHJlZml4PSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS1ob3N0PSRHTVBfVEFSR0VUIFwKKyAgICAgICAgLS13aXRoLWdtcC1wcmVmaXg9JChpbnN0YWxsX2RpcikgXAorICAgICAgICAtLXdpdGgtc3lzcm9vdD0kKHN5c3Jvb3RfZGlyKSBcCisgICAgICAgIC0tZGlzYWJsZS1zaGFyZWQKK30KKwordGFzazJfZGVmaW5lIGJ1aWxkX2Nsb29nICJCdWlsZGluZyBDbG9vZy0kQ0xPT0dfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGJ1aWxkX2Nsb29nIGNvbmZpZ3VyZV9jbG9vZworY21kX2J1aWxkX2Nsb29nICgpCit7CisgICAgY2QgJChidWlsZF9kaXJfZm9yIGNsb29nKS9idWlsZCAmJgorICAgIHJ1biBtYWtlICRNQUtFX0ZMQUdTCit9CisKK3Rhc2syX2RlZmluZSBpbnN0YWxsX2Nsb29nICJJbnN0YWxsaW5nIENsb29nLSRDTE9PR19WRVJTSU9OIgordGFzazJfZGVwZW5kczIgaW5zdGFsbF9jbG9vZyBidWlsZF9jbG9vZworY21kX2luc3RhbGxfY2xvb2cgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX2Rpcl9mb3IgY2xvb2cpL2J1aWxkICYmCisgICAgcnVuIG1ha2UgaW5zdGFsbAorfQorCisjIEZvdXJ0aCwgdGhlIGNvbXBpbGVyIGl0c2VsZgordGFzazJfZGVmaW5lIGNvbmZpZ3VyZV9nY2MgIkNvbmZpZ3VyZSBnY2MtJEdDQ19WRVJTSU9OIgordGFzazJfZGVwZW5kczEgY29uZmlndXJlX2djYyBwcmVwYXJlX3Rvb2xjaGFpbl9zb3VyY2VzCit0YXNrMl9kZXBlbmRzMiBjb25maWd1cmVfZ2NjIGluc3RhbGxfYmludXRpbHMgaW5zdGFsbF9nbXAgaW5zdGFsbF9tcGZyIGluc3RhbGxfbXBjIGluc3RhbGxfY2xvb2cKK2NtZF9jb25maWd1cmVfZ2NjICgpCit7CisgICAgbG9jYWwgRVhUUkFfQ09ORklHVVJFX0ZMQUdTPQorICAgIGlmIFsgIiRHQ0NfVkVSU0lPTiIgIT0gIjQuNiIgXTsgdGhlbgorICAgICAgICBFWFRSQV9DT05GSUdVUkVfRkxBR1M9Ii0td2l0aC1jbG9vZz0kKGluc3RhbGxfZGlyKSIKKyAgICBmaQorICAgIE9VVF9ESVI9JChidWlsZF9kaXJfZm9yIGdjYykKKyAgICBta2RpciAtcCAkT1VUX0RJUiAmJiBjZCAkT1VUX0RJUiAmJgorICAgIGV4cG9ydCBDQz0kSE9TVF9DQyAmJgorICAgIGV4cG9ydCBDQ19GT1JfVEFSR0VUPSIkSE9TVF9DQyIgJiYKKyAgICBydW4gJFRPT0xDSEFJTl9TUkNfRElSL2djYy9nY2MtJEdDQ19WRVJTSU9OL2NvbmZpZ3VyZSBcCisgICAgICAgIC0tZW5hYmxlLW11bHRpYXJjaCBcCisgICAgICAgIC0td2l0aC1hcmNoLTMyPWk2ODYgXAorICAgICAgICAtLXdpdGgtYWJpPW02NCBcCisgICAgICAgIC0tcHJlZml4PSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS13aXRoLXN5c3Jvb3Q9JChzeXNyb290X2RpcikgXAorICAgICAgICAtLWRpc2FibGUtbmxzIFwKKyAgICAgICAgLS13aXRoLWdtcD0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0td2l0aC1tcGZyPSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS13aXRoLW1wYz0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0tdGFyZ2V0PSRHQ0NfVEFSR0VUIFwKKyAgICAgICAgLS13aXRoLWFyY2g9eDg2LTY0IFwKKyAgICAgICAgLS13aXRoLW11bHRpbGliLWxpc3Q9bTMyLG02NCBcCisgICAgICAgIC0tZGlzYWJsZS1wbHVnaW4gXAorICAgICAgICAtLWRpc2FibGUtZG9jcyBcCisgICAgICAgIC0tZGlzYWJsZS1ib290c3RyYXAgXAorICAgICAgICAtLWRpc2FibGUtbGliZ29tcCBcCisgICAgICAgIC0tZGlzYWJsZS1saWJtdWRmbGFwIFwKKyAgICAgICAgLS1kaXNhYmxlLWxpYnF1YWRtYXRoIFwKKyAgICAgICAgLS1lbmFibGUtdGFyZ2V0LW9wdHNwYWNlIFwKKyAgICAgICAgLS1lbmFibGUtZ29sZD1kZWZhdWx0IFwKKyAgICAgICAgLS1lbmFibGUtbGFuZ3VhZ2VzPWMsYysrIFwKKyAgICAgICAgJEVYVFJBX0NPTkZJR1VSRV9GTEFHUworfQorCit0YXNrMl9kZWZpbmUgYnVpbGRfZ2NjICJCdWlsZCBnY2MtJEdDQ19WRVJTSU9OIgordGFzazJfZGVwZW5kczIgYnVpbGRfZ2NjIGNvbmZpZ3VyZV9nY2MKK2NtZF9idWlsZF9nY2MgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX2Rpcl9mb3IgZ2NjKSAmJgorICAgIG1ha2UgJE1BS0VfRkxBR1MKK30KKwordGFzazJfZGVmaW5lIGluc3RhbGxfZ2NjICJJbnN0YWxsIGdjYy0kR0NDX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBpbnN0YWxsX2djYyBidWlsZF9nY2MKK2NtZF9pbnN0YWxsX2djYyAoKQoreworICAgIGNkICQoYnVpbGRfZGlyX2ZvciBnY2MpICYmCisgICAgbWFrZSBpbnN0YWxsCit9CisKK3Rhc2syX2RlZmluZSBjbGVhbnVwX3Rvb2xjaGFpbiAiQ2xlYW51cCB0b29sY2hhaW4iCit0YXNrMl9kZXBlbmRzMiBjbGVhbnVwX3Rvb2xjaGFpbiBpbnN0YWxsX2djYworY21kX2NsZWFudXBfdG9vbGNoYWluICgpCit7CisgICAgIyBSZW1vdmUgdW4tbmVlZGVkIGRpcmVjdG9yaWVzIGFuZCBmaWxlcworICAgIHJtIC1yZiAkKGluc3RhbGxfZGlyKS9zaGFyZQorICAgIHJtIC1yZiAkKGluc3RhbGxfZGlyKS9tYW4KKyAgICBybSAtcmYgJChpbnN0YWxsX2RpcikvaW5mbworICAgIHJtIC1yZiAkKGluc3RhbGxfZGlyKS9saWJleGVjLyovKi9pbnN0YWxsLXRvb2xzCisgICAgI3JtIC1yZiAkKGluc3RhbGxfZGlyKS8kR0NDX1RBUkdFVC9iaW4KKyAgICBmaW5kICQoaW5zdGFsbF9kaXIpIC1uYW1lICIqLmxhIiAtZXhlYyBybSAtZiB7fSBcOworCisgICAgKHN0cmlwICQoaW5zdGFsbF9kaXIpL2Jpbi8qKQorICAgIChzdHJpcCAkKGluc3RhbGxfZGlyKS9saWJleGVjL2djYy8kR0NDX1RBUkdFVC8qLyopCisgICAgdHJ1ZQorfQorCit0YXNrMl9kZWZpbmUgcGFja2FnZV90b29sY2hhaW4gIlBhY2thZ2UgZmluYWwgdG9vbGNoYWluIgordGFzazJfZGVwZW5kczIgcGFja2FnZV90b29sY2hhaW4gY2xlYW51cF90b29sY2hhaW4KK2NtZF9wYWNrYWdlX3Rvb2xjaGFpbiAoKQoreworICAgICMgQ29weSB0aGlzIHNjcmlwdCB0byB0aGUgaW5zdGFsbCBkaXJlY3RvcnkKKyAgICBjcCAtZiAkMCAkKGluc3RhbGxfZGlyKQorICAgIGZhaWxfcGFuaWMgIkNvdWxkIG5vdCBjb3B5IGJ1aWxkIHNjcmlwdCB0byBpbnN0YWxsIGRpcmVjdG9yeSIKKworICAgIGlmIFsgLWQgIiRQQVRDSEVTX0RJUiIgXTsgdGhlbgorICAgICAgICAjIENvcHkgcGF0Y2hlcyB0byB0aGUgaW5zdGFsbCBkaXJlY3RvcnkKKyAgICAgICAgY3AgLXJmICIkUEFUQ0hFU19ESVIiICQoaW5zdGFsbF9kaXIpCisgICAgICAgIGZhaWxfcGFuaWMgIkNvdWxkIG5vdCBjb3B5IHBhdGNoIGRpcmVjdG9yeSB0byBpbnN0YWxsIGRpcmVjdG9yeSIKKyAgICBmaQorCisgICAgIyBDb3B5IHRoZSBTT1VSQ0VTIGZpbGUgYXMgd2VsbAorICAgIGNwICRET1dOTE9BRF9ESVIvU09VUkNFUyAkKGluc3RhbGxfZGlyKS9QQUNLQUdFX1NPVVJDRVMgJiYKKyAgICBjcCAkVE9PTENIQUlOX1NSQ19ESVIvU09VUkNFUyAkKGluc3RhbGxfZGlyKS9UT09MQ0hBSU5fU09VUkNFUworICAgIGZhaWxfcGFuaWMgIkNvdWxkIG5vdCBjb3B5IFNPVVJDRVMgZmlsZXMgdG8gaW5zdGFsbCBkaXJlY3RvcnkiCisKKyAgICAjIFBhY2thZ2UgZXZlcnl0aGluZworICAgIHBhY2tfYXJjaGl2ZSAkVE9PTENIQUlOX0FSQ0hJVkUgImBkaXJuYW1lICQoaW5zdGFsbF9kaXIpYCIgImBiYXNlbmFtZSAkKGluc3RhbGxfZGlyKWAiCit9CisKK3Rhc2syX2RlZmluZSBpbnN0YWxsX3Rvb2xjaGFpbiAiSW5zdGFsbCBmaW5hbCB0b29sY2hhaW4iCit0YXNrMl9kZXBlbmRzMiBpbnN0YWxsX3Rvb2xjaGFpbiBjbGVhbnVwX3Rvb2xjaGFpbgorY21kX2luc3RhbGxfdG9vbGNoYWluICgpCit7CisgICAgY29weV9kaXJlY3RvcnkgIiQoaW5zdGFsbF9kaXIpIiAiJFBSRUZJWF9ESVIvJFRPT0xDSEFJTl9OQU1FIgorICAgIGNwIC1mICQwICIkUFJFRklYX0RJUi8kVE9PTENIQUlOX05BTUUvIgorfQorCisjIE1ha2Ugc3VyZSB0aGF0IHRoZSBzZWNvbmQgdG9vbGNoYWluIGRlcGVuZHMgb24gdGhlIGZpcnN0IG9uZQordGFza19kZXBlbmRzIGNvbmZpZ3VyZV9iaW51dGlsc18yIGluc3RhbGxfZ2NjXzEKKworaWYgWyAiJE9OTFlfU1lTUk9PVCIgPSAieWVzIiBdOyB0aGVuCisgICAgTUFJTl9UQVNLPWNvcHlfc3lzcm9vdAorICAgIENPTVBMRVRJT05fVEVYVD0iRG9uZSwgc2VlIHN5c3Jvb3QgZmlsZXMgaW4gJChzeXNyb290X2RpcikiCitlbGlmIFsgLW4gIiRQUkVGSVhfRElSIiBdOyB0aGVuCisgICAgaWYgWyAteiAiJEJPT1RTVFJBUCIgXTsgdGhlbgorICAgICAgICBNQUlOX1RBU0s9aW5zdGFsbF90b29sY2hhaW5fMQorICAgIGVsc2UKKyAgICAgICAgTUFJTl9UQVNLPWluc3RhbGxfdG9vbGNoYWluXzIKKyAgICBmaQorICAgIENPTVBMRVRJT05fVEVYVD0iRG9uZSwgc2VlICRQUkVGSVhfRElSLyRUT09MQ0hBSU5fTkFNRSIKK2Vsc2UKKyAgICBpZiBbIC16ICIkQk9PVFNUUkFQIiBdOyB0aGVuCisgICAgICAgIE1BSU5fVEFTSz1wYWNrYWdlX3Rvb2xjaGFpbl8xCisgICAgZWxzZQorICAgICAgICBNQUlOX1RBU0s9cGFja2FnZV90b29sY2hhaW5fMgorICAgIGZpCisgICAgQ09NUExFVElPTl9URVhUPSJEb25lLCBzZWUgJFRPT0xDSEFJTl9BUkNISVZFIgorZmkKKworaWYgWyAiJExJU1RfVEFTS1MiIF07IHRoZW4KKyAgICB0YXNrX2R1bXAKK2Vsc2UKKyAgICBydW5fdGFzayAkTUFJTl9UQVNLCisgICAgZWNobyAiJENPTVBMRVRJT05fVEVYVCIKK2ZpCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2Jsb2NrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmMmE0NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvYmxvY2suaApAQCAtMCwwICsxLDExNyBAQAorCisgICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMb29HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICBGaXJzdCB2ZXJzaW9uOiBKdW5lIDExdGggMjAwNSAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICBDTG9vRyA6IHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgKGV4cGVyaW1lbnRhbCkgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgQ2VkcmljIEJhc3RvdWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAgICAgICAgICAgICAgKgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgICAgICAgKgorICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyICAgICAgICAgICAgICAgKgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgICAgICAgICAgKgorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgKgorICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ0xvb0csIHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogV3JpdHRlbiBieSBDZWRyaWMgQmFzdG91bCwgQ2VkcmljLkJhc3RvdWxAaW5yaWEuZnIgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIENMT09HX0JMT0NLX0gKKyNkZWZpbmUgQ0xPT0dfQkxPQ0tfSAorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIAorICB7CisjZW5kaWYgCisKKworLyoqCisgKiBDbG9vZ0Jsb2NrIHN0cnVjdHVyZToKKyAqIHRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbnMgb2YgYSBzdGF0ZW1lbnQgYmxvY2suIEl0IG1heSBoYXBwZW4KKyAqIHRoYXQgdXNlcnMgYXJlIGxhenkgZW5vdWdoIHRvIGFzayBDTG9vRyB0byBnZW5lcmF0ZSB0aGUgY29kZSBmb3Igc3RhdGVtZW50cworICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIGRvbWFpbi9zY2F0dGVyaW5nIHBhaXIgKHBvc3NpYmx5IGRpZmZlcmluZyBieSBvbmx5IG9uZQorICogY29uc3RhbnQpIGluc3RlYWQgb2YgZ2l2aW5nIG9ubHkgb25lIHBhaXIuIENMb29HIHByb3ZpZGVzIHRoZW0gYSBsYXN0IGNoYW5jZQorICogdG8gc2F2ZSB0aW1lIGFuZCBtZW1vcnkgYnkgdHJ5aW5nIHRvIGZpbmQgdGhlc2UgYmxvY2tzIGl0c2VsZi4gVGhlIGJsb2NrCisgKiBjb250YWlucyB0aGUgc3RhdGVtZW50IGxpc3QgYW5kIHRoZSBjb21tb24gaW5mb3JtYXRpb25zIG9mIHRoZSBzdGF0ZW1lbnRzLgorICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxzbyB0aGUgbnVtYmVyIG9mIGV4aXN0aW5nIGFjdGl2ZSByZWZlcmVuY2VzIHRvIGl0OgorICogYmVjYXVzZSBDTG9vRyB1c2VzIG1hbnkgY29waWVzIG9mIGJsb2NrcyB0aGVyZSBpcyBubyBuZWVkIHRvIGFjdHVhbGx5IGNvcHkKKyAqIHRoZXNlIGJsb2NrcyBidXQganVzdCB0byByZXR1cm4gYSBwb2ludGVyIHRvIHRoZW0gYW5kIHRvIGluY3JlbWVudCB0aGUgbnVtYmVyCisgKiBvZiBhY3RpdmUgcmVmZXJlbmNlcy4gRWFjaCB0aW1lIGEgQ2xvb2dCbG9jayB3aWxsIGJlIGZyZWVkLCB3ZSB3aWxsIGRlY3JlbWVudAorICogdGhlIGFjdGl2ZSByZWZlcmVuY2UgY291bnRlciBhbmQgYWN0dWFsbHkgZnJlZSBpdCBpZiBpdHMgdmFsdWUgaXMgemVyby4KKyAqLworc3RydWN0IGNsb29nYmxvY2sKK3sKKyAgQ2xvb2dTdGF0ZSAqc3RhdGU7ICAgICAgICAgICAgLyoqPCBTdGF0ZS4gKi8KKyAgQ2xvb2dTdGF0ZW1lbnQgKiBzdGF0ZW1lbnQgOyAgLyoqPCBUaGUgbGlzdCBvZiBzdGF0ZW1lbnRzIGluIHRoZSBibG9jay4gKi8KKyAgaW50ICBuYl9zY2FsZGltcyA7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2Ygc2NhbGFyIGRpbWVuc2lvbnMuICovCisgIGNsb29nX2ludF90ICpzY2FsZGltczsgICAgICAgIC8qKjwgU2NhbGFyIGRpbWVuc2lvbiB2YWx1ZXMuICovCisgIGludCBkZXB0aCA7ICAgICAgICAgICAgICAgICAgIC8qKjwgT3JpZ2luYWwgYmxvY2sgZGVwdGggKG91dGVyIGxvb3AgbnVtYmVyKS4qLworICBpbnQgcmVmZXJlbmNlcyA7ICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiByZWZlcmVuY2VzIHRvIHRoaXMgc3RydWN0dXJlLiAqLworICB2b2lkICogdXNyOwkJICAgICAgICAvKio8IFVzZXIgZmllbGQsIGZvciBsaWJyYXJ5IHVzZXIgY29udmVuaWVuY2UuCisJCQkJICogICBUaGlzIHBvaW50ZXIgaXMgbm90IGZyZWVkIHdoZW4gdGhlCisJCQkJICogICBDbG9vZ0Jsb2NrIHN0cnVjdHVyZSBpcyBmcmVlZC4KKwkJCSAgICAgICAgICovCit9IDsKK3R5cGVkZWYgc3RydWN0IGNsb29nYmxvY2sgQ2xvb2dCbG9jayA7CisKKworLyoqCisgKiBDbG9vZ0Jsb2NrTGlzdCBzdHJ1Y3R1cmU6CisgKiB0aGlzIHN0cnVjdHVyZSByZXByZW5zZW50cyBhIG5vZGUgb2YgYSBsaW5rZWQgbGlzdCBvZiBDbG9vZ0Jsb2NrIHN0cnVjdHVyZXMuCisgKi8KK3N0cnVjdCBjbG9vZ2Jsb2NrbGlzdAoreyBDbG9vZ0Jsb2NrICogYmxvY2sgOyAgICAgICAgICAvKio8IEFuIGVsZW1lbnQgb2YgdGhlIGxpc3QuICovCisgIHN0cnVjdCBjbG9vZ2Jsb2NrbGlzdCAqIG5leHQgOy8qKjwgUG9pbnRlciB0byB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0LiovCit9IDsKK3R5cGVkZWYgc3RydWN0IGNsb29nYmxvY2tsaXN0IENsb29nQmxvY2tMaXN0IDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlIGRpc3BsYXkgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjbG9vZ19ibG9ja19wcmludF9zdHJ1Y3R1cmUoRklMRSAqLCBDbG9vZ0Jsb2NrICosIGludCkgOwordm9pZCBjbG9vZ19ibG9ja19wcmludChGSUxFICosIENsb29nQmxvY2sgKikgOwordm9pZCBjbG9vZ19ibG9ja19saXN0X3ByaW50KEZJTEUgKiwgQ2xvb2dCbG9ja0xpc3QgKikgOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBkZWFsbG9jYXRpb24gZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNsb29nX2Jsb2NrX2ZyZWUoQ2xvb2dCbG9jayAqKSA7Cit2b2lkIGNsb29nX2Jsb2NrX2xpc3RfZnJlZShDbG9vZ0Jsb2NrTGlzdCAqKSA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc2luZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0Nsb29nQmxvY2sgICAgICogY2xvb2dfYmxvY2tfbWFsbG9jKENsb29nU3RhdGUgKnN0YXRlKTsKK0Nsb29nQmxvY2sgICAgICogY2xvb2dfYmxvY2tfYWxsb2MoQ2xvb2dTdGF0ZW1lbnQgKnN0YXRlbWVudCwgaW50IG5iX3NjYWxkaW1zLAorCQkJCSAgICBjbG9vZ19pbnRfdCAqc2NhbGRpbXMsIGludCBkZXB0aCk7CitDbG9vZ0Jsb2NrTGlzdCAqIGNsb29nX2Jsb2NrX2xpc3RfbWFsbG9jKHZvaWQpOworQ2xvb2dCbG9ja0xpc3QgKiBjbG9vZ19ibG9ja19saXN0X2FsbG9jKENsb29nQmxvY2sgKikgOworQ2xvb2dCbG9jayAgICAgKiBjbG9vZ19ibG9ja19jb3B5KENsb29nQmxvY2sgKiBibG9jaykgOwordm9pZCAgICAgICAgICAgICBjbG9vZ19ibG9ja19tZXJnZShDbG9vZ0Jsb2NrICosIENsb29nQmxvY2sgKikgOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyAgfQorI2VuZGlmIAorI2VuZGlmIC8qIGRlZmluZSBfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2NsYXN0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2NsYXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1NmRkNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvY2xhc3QuaApAQCAtMCwwICsxLDE3NiBAQAorI2lmbmRlZiBDTE9PR19DTEFTVF9ICisjZGVmaW5lIENMT09HX0NMQVNUX0gKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmIAorCitlbnVtIGNsYXN0X2V4cHJfdHlwZSB7CisgICAgY2xhc3RfZXhwcl9uYW1lLAorICAgIGNsYXN0X2V4cHJfdGVybSwKKyAgICBjbGFzdF9leHByX2JpbiwKKyAgICBjbGFzdF9leHByX3JlZAorfTsKK3N0cnVjdCBjbGFzdF9leHByIHsKKyAgICBlbnVtIGNsYXN0X2V4cHJfdHlwZSB0eXBlOworfTsKKworc3RydWN0IGNsYXN0X25hbWUgeworICAgIHN0cnVjdCBjbGFzdF9leHByCWV4cHI7CisgICAgY29uc3QgY2hhciAqCW5hbWU7Cit9OworCisvKiBSZXByZXNlbnRzIHRoZSB0ZXJtCisgKgl2YWwgKiB2YXIJKGlmIHZhciAhPSBOVUxMKQorICogb3IKKyAqCXZhbAkJKGlmIHZhciA9PSBOVUxMKQorICovCitzdHJ1Y3QgY2xhc3RfdGVybSB7CisgICAgc3RydWN0IGNsYXN0X2V4cHIJZXhwcjsKKyAgICBjbG9vZ19pbnRfdAkJdmFsOworICAgIHN0cnVjdCBjbGFzdF9leHByICAqdmFyOworfTsKKworI2RlZmluZSBDTEFTVF9QQVJBTExFTF9OT1QgMAorI2RlZmluZSBDTEFTVF9QQVJBTExFTF9PTVAgMQorI2RlZmluZSBDTEFTVF9QQVJBTExFTF9NUEkgMgorI2RlZmluZSBDTEFTVF9QQVJBTExFTF9WRUMgNAorCitlbnVtIGNsYXN0X3JlZF90eXBlIHsgY2xhc3RfcmVkX3N1bSwgY2xhc3RfcmVkX21pbiwgY2xhc3RfcmVkX21heCB9Oworc3RydWN0IGNsYXN0X3JlZHVjdGlvbiB7CisgICAgc3RydWN0IGNsYXN0X2V4cHIJZXhwcjsKKyAgICBlbnVtIGNsYXN0X3JlZF90eXBlCXR5cGU7CisgICAgaW50CQkJbjsKKyAgICBzdHJ1Y3QgY2xhc3RfZXhwcioJZWx0c1sxXTsKK307CisKK2VudW0gY2xhc3RfYmluX3R5cGUgeyBjbGFzdF9iaW5fZmRpdiwgY2xhc3RfYmluX2NkaXYsIAorCQkgICAgICBjbGFzdF9iaW5fZGl2LCBjbGFzdF9iaW5fbW9kIH07CitzdHJ1Y3QgY2xhc3RfYmluYXJ5IHsKKyAgICBzdHJ1Y3QgY2xhc3RfZXhwcglleHByOworICAgIGVudW0gY2xhc3RfYmluX3R5cGUgdHlwZTsKKyAgICBzdHJ1Y3QgY2xhc3RfZXhwcioJTEhTOworICAgIGNsb29nX2ludF90CQlSSFM7Cit9OworCitzdHJ1Y3QgY2xhc3Rfc3RtdDsKK3N0cnVjdCBjbGFzdF9zdG10X29wIHsKKyAgICB2b2lkICgqZnJlZSkoc3RydWN0IGNsYXN0X3N0bXQgKik7Cit9OworCisjZGVmaW5lIENMQVNUX1NUTVRfSVNfQShzdG10LCB0eXBlKSAoKHN0bXQpLT5vcCA9PSAmKHR5cGUpKQorCitleHRlcm4gY29uc3Qgc3RydWN0IGNsYXN0X3N0bXRfb3Agc3RtdF9yb290OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGFzdF9zdG10X29wIHN0bXRfYXNzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGFzdF9zdG10X29wIHN0bXRfdXNlcjsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY2xhc3Rfc3RtdF9vcCBzdG10X2Jsb2NrOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGFzdF9zdG10X29wIHN0bXRfZm9yOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGFzdF9zdG10X29wIHN0bXRfZ3VhcmQ7CisKK3N0cnVjdCBjbGFzdF9zdG10IHsKKyAgICBjb25zdCBzdHJ1Y3QgY2xhc3Rfc3RtdF9vcCAgICAqb3A7CisgICAgc3RydWN0IGNsYXN0X3N0bXQJKm5leHQ7Cit9OworCitzdHJ1Y3QgY2xhc3Rfcm9vdCB7CisgICAgc3RydWN0IGNsYXN0X3N0bXQJc3RtdDsKKyAgICBDbG9vZ05hbWVzICoJbmFtZXM7ICAgICAgIC8qKjwgTmFtZXMgb2YgaXRlcmF0b3JzIGFuZCBwYXJhbWV0ZXJzLiAqLworfTsKKworc3RydWN0IGNsYXN0X2Fzc2lnbm1lbnQgeworICAgIHN0cnVjdCBjbGFzdF9zdG10CXN0bXQ7CisgICAgY29uc3QgY2hhciAqCUxIUzsKKyAgICBzdHJ1Y3QgY2xhc3RfZXhwciAqCVJIUzsKK307CisKK3N0cnVjdCBjbGFzdF9ibG9jayB7CisgICAgc3RydWN0IGNsYXN0X3N0bXQJc3RtdDsKKyAgICBzdHJ1Y3QgY2xhc3Rfc3RtdCAqCWJvZHk7Cit9OworCitzdHJ1Y3QgY2xhc3RfdXNlcl9zdG10IHsKKyAgICBzdHJ1Y3QgY2xhc3Rfc3RtdAlzdG10OworICAgIENsb29nRG9tYWluICoJZG9tYWluOworICAgIENsb29nU3RhdGVtZW50ICoJc3RhdGVtZW50OworICAgIHN0cnVjdCBjbGFzdF9zdG10ICoJc3Vic3RpdHV0aW9uczsKK307CisKK3N0cnVjdCBjbGFzdF9mb3IgeworICAgIHN0cnVjdCBjbGFzdF9zdG10CXN0bXQ7CisgICAgQ2xvb2dEb21haW4gKglkb21haW47CisgICAgY29uc3QgY2hhciAqCWl0ZXJhdG9yOworICAgIHN0cnVjdCBjbGFzdF9leHByICoJTEI7CisgICAgc3RydWN0IGNsYXN0X2V4cHIgKglVQjsKKyAgICBjbG9vZ19pbnRfdAkJc3RyaWRlOworICAgIHN0cnVjdCBjbGFzdF9zdG10ICoJYm9keTsKKyAgICBpbnQgcGFyYWxsZWw7CisgICAgLyogQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbG9vcCBwcml2YXRlIHZhcmlhYmxlcyBmb3IgT3Blbk1QIHBhcmFsbGVsaXphdGlvbiAqLworICAgIGNoYXIgKnByaXZhdGVfdmFyczsKKyAgICAvKiBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiByZWR1Y3Rpb24gdmFyaWFibGUvb3BlcmF0b3JzIGZvciBPcGVuTVAgcGFyYWxsZWxpemF0aW9uICovCisgICAgY2hhciAqcmVkdWN0aW9uX3ZhcnM7Cit9OworCitzdHJ1Y3QgY2xhc3RfZXF1YXRpb24geworICAgIHN0cnVjdCBjbGFzdF9leHByICoJTEhTOworICAgIHN0cnVjdCBjbGFzdF9leHByICoJUkhTOworICAgIGludAkJCXNpZ247Cit9OworCitzdHJ1Y3QgY2xhc3RfZ3VhcmQgeworICAgIHN0cnVjdCBjbGFzdF9zdG10CXN0bXQ7CisgICAgc3RydWN0IGNsYXN0X3N0bXQgKgl0aGVuOworICAgIGludAkJCW47CisgICAgc3RydWN0IGNsYXN0X2VxdWF0aW9uCWVxWzFdOworfTsKKworCitzdHJ1Y3QgY2xhc3Rfc3RtdCAqY2xvb2dfY2xhc3RfY3JlYXRlX2Zyb21faW5wdXQoQ2xvb2dJbnB1dCAqaW5wdXQsCisJCQkJCQkgQ2xvb2dPcHRpb25zICpvcHRpb25zKTsKK3N0cnVjdCBjbGFzdF9zdG10ICpjbG9vZ19jbGFzdF9jcmVhdGUoQ2xvb2dQcm9ncmFtICpwcm9ncmFtLAorCQkJCSAgICAgIENsb29nT3B0aW9ucyAqb3B0aW9ucyk7Cit2b2lkIGNsb29nX2NsYXN0X2ZyZWUoc3RydWN0IGNsYXN0X3N0bXQgKnMpOworCitzdHJ1Y3QgY2xhc3RfbmFtZSAqbmV3X2NsYXN0X25hbWUoY29uc3QgY2hhciAqbmFtZSk7CitzdHJ1Y3QgY2xhc3RfdGVybSAqbmV3X2NsYXN0X3Rlcm0oY2xvb2dfaW50X3QgYywgc3RydWN0IGNsYXN0X2V4cHIgKnYpOworc3RydWN0IGNsYXN0X2JpbmFyeSAqbmV3X2NsYXN0X2JpbmFyeShlbnVtIGNsYXN0X2Jpbl90eXBlIHQsIAorCQkJCSAgICAgIHN0cnVjdCBjbGFzdF9leHByICpsaHMsIGNsb29nX2ludF90IHJocyk7CitzdHJ1Y3QgY2xhc3RfcmVkdWN0aW9uICpuZXdfY2xhc3RfcmVkdWN0aW9uKGVudW0gY2xhc3RfcmVkX3R5cGUgdCwgaW50IG4pOworc3RydWN0IGNsYXN0X3Jvb3QgKm5ld19jbGFzdF9yb290KENsb29nTmFtZXMgKm5hbWVzKTsKK3N0cnVjdCBjbGFzdF9hc3NpZ25tZW50ICpuZXdfY2xhc3RfYXNzaWdubWVudChjb25zdCBjaGFyICpsaHMsCisJCQkJCSAgICAgIHN0cnVjdCBjbGFzdF9leHByICpyaHMpOworc3RydWN0IGNsYXN0X3VzZXJfc3RtdCAqbmV3X2NsYXN0X3VzZXJfc3RtdChDbG9vZ0RvbWFpbiAqZG9tYWluLAorICAgIENsb29nU3RhdGVtZW50ICpzdG10LCBzdHJ1Y3QgY2xhc3Rfc3RtdCAqc3Vicyk7CitzdHJ1Y3QgY2xhc3RfYmxvY2sgKm5ld19jbGFzdF9ibG9jayh2b2lkKTsKK3N0cnVjdCBjbGFzdF9mb3IgKm5ld19jbGFzdF9mb3IoQ2xvb2dEb21haW4gKmRvbWFpbiwgY29uc3QgY2hhciAqaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjbGFzdF9leHByICpMQiwgc3RydWN0IGNsYXN0X2V4cHIgKlVCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9vZ1N0cmlkZSAqc3RyaWRlKTsKK3N0cnVjdCBjbGFzdF9ndWFyZCAqbmV3X2NsYXN0X2d1YXJkKGludCBuKTsKKwordm9pZCBmcmVlX2NsYXN0X25hbWUoc3RydWN0IGNsYXN0X25hbWUgKnQpOwordm9pZCBmcmVlX2NsYXN0X3Rlcm0oc3RydWN0IGNsYXN0X3Rlcm0gKnQpOwordm9pZCBmcmVlX2NsYXN0X2JpbmFyeShzdHJ1Y3QgY2xhc3RfYmluYXJ5ICpiKTsKK3ZvaWQgZnJlZV9jbGFzdF9yZWR1Y3Rpb24oc3RydWN0IGNsYXN0X3JlZHVjdGlvbiAqcik7Cit2b2lkIGZyZWVfY2xhc3RfZXhwcihzdHJ1Y3QgY2xhc3RfZXhwciAqZSk7Cit2b2lkIGZyZWVfY2xhc3Rfc3RtdChzdHJ1Y3QgY2xhc3Rfc3RtdCAqcyk7CisKK2ludCBjbGFzdF9leHByX2VxdWFsKHN0cnVjdCBjbGFzdF9leHByICplMSwgc3RydWN0IGNsYXN0X2V4cHIgKmUyKTsKKworc3RydWN0IGNsYXN0X2V4cHIgKmNsYXN0X2JvdW5kX2Zyb21fY29uc3RyYWludChDbG9vZ0NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJCQkJCSAgICAgICBpbnQgbGV2ZWwsIENsb29nTmFtZXMgKm5hbWVzKTsKKwordHlwZWRlZiBlbnVtIGZpbHRlclR5cGUge2V4YWN0LCBzdWJzZXR9IENsYXN0RmlsdGVyVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgY2xhc3RGaWx0ZXJ7CisgICAgY29uc3QgY2hhciAqaXRlcjsKKyAgICBjb25zdCBpbnQgKnN0bXRzX2ZpbHRlcjsKKyAgICBpbnQgbnN0bXRzX2ZpbHRlcjsKKyAgICBDbGFzdEZpbHRlclR5cGUgZmlsdGVyX3R5cGU7Cit9IENsYXN0RmlsdGVyOworCit2b2lkIGNsYXN0X2ZpbHRlcihzdHJ1Y3QgY2xhc3Rfc3RtdCAqbm9kZSwgQ2xhc3RGaWx0ZXIgZmlsdGVyLAorICAgICAgICBzdHJ1Y3QgY2xhc3RfZm9yICoqKmxvb3BzLCBpbnQgKm5sb29wcywgaW50ICoqc3RtdHMsIGludCAqbnN0bXRzKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgIH0KKyNlbmRpZiAKKyNlbmRpZiAvKiBkZWZpbmUgX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvY2xvb2cuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvY2xvb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGMzZjI4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9jbG9vZy5oCkBAIC0wLDAgKzEsNjIgQEAKKworICAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xvb0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvb2cuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICBGaXJzdCB2ZXJzaW9uOiBqdWx5IDI1dGggMjAwMiAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgQ0xvb0cgOiB0aGUgQ2h1bmt5IExvb3AgR2VuZXJhdG9yIChleHBlcmltZW50YWwpICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IENlZHJpYyBCYXN0b3VsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgICAgICAgICAgICAgICoKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgICAgICAgICAgICAgICAgICoKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciAgICAgICAgICAgICAgICoKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VICAgICAgICAgICoKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgICAgICAgICAgICoKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENMb29HLCB0aGUgQ2h1bmt5IExvb3AgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFdyaXR0ZW4gYnkgQ2VkcmljIEJhc3RvdWwsIENlZHJpYy5CYXN0b3VsQGlucmlhLmZyICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBUSElTIEZJTEUgSEFTIEJFRU4gQVVUT01BVElDQUxMWSBHRU5FUkFURUQgRlJPTSBjbG9vaC5oLmluIEJZIGNvbmZpZ3VyZSAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQ0xPT0dfSAorI2RlZmluZSBDTE9PR19ICisKKyNpbmNsdWRlIDxjbG9vZy92ZXJzaW9uLmg+CisjaW5jbHVkZSA8Y2xvb2cvaW50Lmg+CisjaW5jbHVkZSA8Y2xvb2cvbWF0cml4Lmg+CisjaW5jbHVkZSA8Y2xvb2cvc3RhdGUuaD4KKyNpbmNsdWRlIDxjbG9vZy9vcHRpb25zLmg+CisjaW5jbHVkZSA8Y2xvb2cvbmFtZXMuaD4KKyNpbmNsdWRlIDxjbG9vZy9jb25zdHJhaW50cy5oPgorI2luY2x1ZGUgPGNsb29nL3N0cmlkZS5oPgorI2luY2x1ZGUgPGNsb29nL2RvbWFpbi5oPgorI2luY2x1ZGUgPGNsb29nL3N0YXRlbWVudC5oPgorI2luY2x1ZGUgPGNsb29nL2Jsb2NrLmg+CisjaW5jbHVkZSA8Y2xvb2cvbG9vcC5oPgorI2luY2x1ZGUgPGNsb29nL3VuaW9uX2RvbWFpbi5oPgorI2luY2x1ZGUgPGNsb29nL2lucHV0Lmg+CisjaW5jbHVkZSA8Y2xvb2cvcHJvZ3JhbS5oPgorI2luY2x1ZGUgPGNsb29nL2NsYXN0Lmg+CisjaW5jbHVkZSA8Y2xvb2cvcHByaW50Lmg+CisKKyNlbmRpZiAvKiAhQ0xPT0dfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9jb25zdHJhaW50cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9jb25zdHJhaW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MThjNGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2NvbnN0cmFpbnRzLmgKQEAgLTAsMCArMSwxMjEgQEAKKworICAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xvb0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgRmlyc3QgdmVyc2lvbjogYXByaWwgMTd0aCAyMDA1ICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgQ0xvb0cgOiB0aGUgQ2h1bmt5IExvb3AgR2VuZXJhdG9yIChleHBlcmltZW50YWwpICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBDZWRyaWMgQmFzdG91bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgICAgICAgICAgICAgICoKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgICAgICAgICAgICAgICAgICoKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciAgICAgICAgICAgICAgICoKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VICAgICAgICAgICoKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgICAgICAgICAgICoKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENMb29HLCB0aGUgQ2h1bmt5IExvb3AgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFdyaXR0ZW4gYnkgQ2VkcmljIEJhc3RvdWwsIENlZHJpYy5CYXN0b3VsQGlucmlhLmZyICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBDTE9PR19DT05TVFJBSU5UU19ICisjZGVmaW5lIENMT09HX0NPTlNUUkFJTlRTX0gKKworc3RydWN0IGNsb29nY29uc3RyYWludDsKK3R5cGVkZWYgc3RydWN0IGNsb29nY29uc3RyYWludCBDbG9vZ0NvbnN0cmFpbnQ7CitzdHJ1Y3QgY2xvb2djb25zdHJhaW50c2V0OwordHlwZWRlZiBzdHJ1Y3QgY2xvb2djb25zdHJhaW50c2V0IENsb29nQ29uc3RyYWludFNldDsKK3N0cnVjdCBjbG9vZ2VxdWFsaXRpZXM7Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ2VxdWFsaXRpZXMgQ2xvb2dFcXVhbGl0aWVzOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgCisgIHsKKyNlbmRpZiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICBFcXVhbGl0aWVzIHNwcmVhZGluZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0Nsb29nRXF1YWxpdGllcyAqY2xvb2dfZXF1YWxfYWxsb2MoaW50IG4sIGludCBuYl9sZXZlbHMsCisJCQlpbnQgbmJfcGFyYW1ldGVycyk7Cit2b2lkCQkgY2xvb2dfZXF1YWxfZnJlZShDbG9vZ0VxdWFsaXRpZXMgKmVxdWFsKTsKK2ludCAgICAgICAgICAgICAgY2xvb2dfZXF1YWxfY291bnQoQ2xvb2dFcXVhbGl0aWVzICplcXVhbCk7CitpbnQgICAgICAgICAgICAgIGNsb29nX2VxdWFsX3R5cGUoQ2xvb2dFcXVhbGl0aWVzICplcXVhbCwgaW50IGxldmVsKTsKK3ZvaWQgICAgICAgICAgICAgY2xvb2dfZXF1YWxfZGVsKENsb29nRXF1YWxpdGllcyAqZXF1YWwsIGludCBsZXZlbCk7CitpbnQgICAgICAgICAgICAgIGNsb29nX2VxdWFsX3RvdGFsX2RpbWVuc2lvbihDbG9vZ0VxdWFsaXRpZXMgKmVxdWFsKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc2luZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgY2xvb2dfY29uc3RyYWludF9zZXRfbm9ybWFsaXplKENsb29nQ29uc3RyYWludFNldCAqLCBpbnQpOwordm9pZCAgICAgICAgICBjbG9vZ19jb25zdHJhaW50X3NldF9mcmVlKENsb29nQ29uc3RyYWludFNldCAqKTsKK2ludCAgICAgICAgICAgY2xvb2dfY29uc3RyYWludF9zZXRfY29udGFpbnNfbGV2ZWwoQ2xvb2dDb25zdHJhaW50U2V0ICpjb25zdHJhaW50cywKKwkJCWludCBsZXZlbCwgaW50IG5iX3BhcmFtZXRlcnMpOworaW50ICAgICAgICAgICBjbG9vZ19jb25zdHJhaW50X3NldF90b3RhbF9kaW1lbnNpb24oQ2xvb2dDb25zdHJhaW50U2V0ICpjb25zdHJhaW50cyk7CitpbnQgICAgICAgICAgIGNsb29nX2NvbnN0cmFpbnRfc2V0X25faXRlcmF0b3JzKENsb29nQ29uc3RyYWludFNldCAqY29uc3RyYWludHMsCisJCQlpbnQgbmJfcGFyYW1ldGVycyk7CitDbG9vZ0NvbnN0cmFpbnRTZXQgKmNsb29nX2NvbnN0cmFpbnRfc2V0X2NvcHkoQ2xvb2dDb25zdHJhaW50U2V0ICopOworQ2xvb2dDb25zdHJhaW50U2V0ICpjbG9vZ19jb25zdHJhaW50X3NldF9zaW1wbGlmeShDbG9vZ0NvbnN0cmFpbnRTZXQgKiwgQ2xvb2dFcXVhbGl0aWVzICosIGludCwgaW50KTsKKworaW50IGNsb29nX2NvbnN0cmFpbnRfbmVlZHNfcmVkdWN0aW9uKENsb29nQ29uc3RyYWludCAqdXBwZXIsIGludCBsZXZlbCk7CitDbG9vZ0NvbnN0cmFpbnRTZXQgKmNsb29nX2NvbnN0cmFpbnRfc2V0X2Zvcl9yZWR1Y3Rpb24oQ2xvb2dDb25zdHJhaW50ICp1cHBlciwKKwkgICAgICAgQ2xvb2dDb25zdHJhaW50ICpsb3dlcik7CitDbG9vZ0NvbnN0cmFpbnRTZXQgKmNsb29nX2NvbnN0cmFpbnRfc2V0X3JlZHVjZShDbG9vZ0NvbnN0cmFpbnRTZXQgKmNvbnN0cmFpbnRzLAorCWludCBsZXZlbCwgQ2xvb2dFcXVhbGl0aWVzICplcXVhbCwgaW50IG5iX3BhciwgY2xvb2dfaW50X3QgKmJvdW5kKTsKK2ludCBjbG9vZ19jb25zdHJhaW50X3NldF9mb3JlYWNoX2NvbnN0cmFpbnQoQ2xvb2dDb25zdHJhaW50U2V0ICpjb25zdHJhaW50cywKKwlpbnQgKCpmbikoQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50LCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CitpbnQgICAgICAgICAgICAgIGNsb29nX2NvbnN0cmFpbnRfaXNfdmFsaWQoQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50KTsKK0Nsb29nQ29uc3RyYWludCAqY2xvb2dfY29uc3RyYWludF9jb3B5KENsb29nQ29uc3RyYWludCAqY29uc3RyYWludCk7Cit2b2lkICAgICAgICAgICAgIGNsb29nX2NvbnN0cmFpbnRfcmVsZWFzZShDbG9vZ0NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOworQ2xvb2dDb25zdHJhaW50ICpjbG9vZ19jb25zdHJhaW50X2ludmFsaWQodm9pZCk7CitpbnQgICAgICAgICAgICAgIGNsb29nX2NvbnN0cmFpbnRfdG90YWxfZGltZW5zaW9uKENsb29nQ29uc3RyYWludCAqY29uc3RyYWludCk7CisKK0Nsb29nQ29uc3RyYWludCAqY2xvb2dfZXF1YWxfY29uc3RyYWludChDbG9vZ0VxdWFsaXRpZXMgKmVxdWFsLCBpbnQgaik7Cit2b2lkICAgICAgICAgICAgIGNsb29nX2VxdWFsX2FkZChDbG9vZ0VxdWFsaXRpZXMgKmVxdWFsLAorCQkJCSAgQ2xvb2dDb25zdHJhaW50U2V0ICpjb25zdHJhaW50cywKKwkJCQkgIGludCBsZXZlbCwgQ2xvb2dDb25zdHJhaW50ICpsaW5lLCBpbnQgbmJfcGFyKTsKKworQ2xvb2dDb25zdHJhaW50ICpjbG9vZ19jb25zdHJhaW50X3NldF9kZWZpbmluZ19lcXVhbGl0eSgKKwkJCUNsb29nQ29uc3RyYWludFNldCAqY29uc3RyYWludHMsIGludCBsZXZlbCk7CitDbG9vZ0NvbnN0cmFpbnQgKmNsb29nX2NvbnN0cmFpbnRfc2V0X2RlZmluaW5nX2luZXF1YWxpdGllcygKKwkJCUNsb29nQ29uc3RyYWludFNldCAqY29uc3RyYWludHMsCisJCQlpbnQgbGV2ZWwsIENsb29nQ29uc3RyYWludCAqKmxvd2VyLCBpbnQgbmJfcGFyYW1ldGVycyk7CitpbnQgICAgICAgICAgIGNsb29nX2NvbnN0cmFpbnRfaW52b2x2ZXMoQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50LCBpbnQgdik7CitpbnQgICAgICAgICAgIGNsb29nX2NvbnN0cmFpbnRfaXNfbG93ZXJfYm91bmQoQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50LCBpbnQgdik7CitpbnQgICAgICAgICAgIGNsb29nX2NvbnN0cmFpbnRfaXNfdXBwZXJfYm91bmQoQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50LCBpbnQgdik7CitpbnQgICAgICAgICAgIGNsb29nX2NvbnN0cmFpbnRfaXNfZXF1YWxpdHkoQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50KTsKK3ZvaWQgICAgICAgICAgY2xvb2dfY29uc3RyYWludF9jb25zdGFudF9nZXQoQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50LAorCQkJY2xvb2dfaW50X3QgKnZhbCk7Cit2b2lkICAgICAgICAgIGNsb29nX2NvbnN0cmFpbnRfY29lZmZpY2llbnRfZ2V0KENsb29nQ29uc3RyYWludCAqY29uc3RyYWludCwKKwkJCWludCB2YXIsIGNsb29nX2ludF90ICp2YWwpOwordm9pZCAgICAgICAgICBjbG9vZ19jb25zdHJhaW50X2NvZWZmaWNpZW50X3NldChDbG9vZ0NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJCQlpbnQgdmFyLCBjbG9vZ19pbnRfdCB2YWwpOwordm9pZCAgICAgICAgICBjbG9vZ19jb25zdHJhaW50X2NvcHlfY29lZmZpY2llbnRzKENsb29nQ29uc3RyYWludCAqY29uc3RyYWludCwKKwkJCWNsb29nX2ludF90ICpkc3QpOworQ2xvb2dDb25zdHJhaW50U2V0ICpjbG9vZ19jb25zdHJhaW50X3NldF9kcm9wX2NvbnN0cmFpbnQoCisJQ2xvb2dDb25zdHJhaW50U2V0ICpjb25zdHJhaW50cywgQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50KTsKKworc3RydWN0IGNsYXN0X2V4cHIgKmNsb29nX2NvbnN0cmFpbnRfdmFyaWFibGVfZXhwcihDbG9vZ0NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJCQlpbnQgbGV2ZWwsIENsb29nTmFtZXMgKm5hbWVzKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgIH0KKyNlbmRpZiAKKyNlbmRpZiAvKiBkZWZpbmUgX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvZG9tYWluLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2RvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Nzc3MWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2RvbWFpbi5oCkBAIC0wLDAgKzEsMTc3IEBACisKKyAgIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMb29HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICBGaXJzdCB2ZXJzaW9uOiBvY3RvYmVyIDI4dGggMjAwMSAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIENMb29HIDogdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAoZXhwZXJpbWVudGFsKSAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBDZWRyaWMgQmFzdG91bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yICAgICAgICAgICAgICAqCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgICAgICAgICAgICAgICAqCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSAgICAgICAgICAqCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDTG9vRywgdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBXcml0dGVuIGJ5IENlZHJpYyBCYXN0b3VsLCBDZWRyaWMuQmFzdG91bEBpbnJpYS5mciAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgQ0xPT0dfRE9NQUlOX0gKKyNkZWZpbmUgQ0xPT0dfRE9NQUlOX0gKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmIAorCisKK3N0cnVjdCBjbG9vZ2RvbWFpbjsKK3R5cGVkZWYgc3RydWN0IGNsb29nZG9tYWluIENsb29nRG9tYWluIDsKK3N0cnVjdCBjbG9vZ3NjYXR0ZXJpbmc7Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ3NjYXR0ZXJpbmcgQ2xvb2dTY2F0dGVyaW5nOworc3RydWN0IG9zbF9yZWxhdGlvbjsKKworCisvKioKKyAqIENsb29nRG9tYWluTGlzdCBzdHJ1Y3R1cmU6CisgKiB0aGlzIHN0cnVjdHVyZSByZXByZW5zZW50cyBhIG5vZGUgb2YgYSBsaW5rZWQgbGlzdCBvZiBDbG9vZ0RvbWFpbiBzdHJ1Y3R1cmVzLgorICovCitzdHJ1Y3QgY2xvb2dkb21haW5saXN0IHsKKyAgQ2xvb2dEb21haW4gKmRvbWFpbjsgICAgICAgICAvKio8IEFuIGVsZW1lbnQgb2YgdGhlIGxpc3QuICovCisgIHN0cnVjdCBjbG9vZ2RvbWFpbmxpc3QgKm5leHQ7LyoqPCBQb2ludGVyIHRvIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGxpc3QuKi8KK30gOwordHlwZWRlZiBzdHJ1Y3QgY2xvb2dkb21haW5saXN0IENsb29nRG9tYWluTGlzdDsKKworCisvKioKKyAqIENsb29nU2NhdHRlcmluZ0xpc3Qgc3RydWN0dXJlOgorICogdGhpcyBzdHJ1Y3R1cmUgcmVwcmVuc2VudHMgYSBub2RlIG9mIGEgbGlua2VkIGxpc3Qgb2YgQ2xvb2dTY2F0dGVyaW5nIHN0cnVjdHVyZXMuCisgKi8KK3N0cnVjdCBjbG9vZ3NjYXR0ZXJpbmdsaXN0IHsKKyAgQ2xvb2dTY2F0dGVyaW5nICpzY2F0dDsgICAgICAgICAgLyoqPCBBbiBlbGVtZW50IG9mIHRoZSBsaXN0LiAqLworICBzdHJ1Y3QgY2xvb2dzY2F0dGVyaW5nbGlzdCAqbmV4dDsvKio8IFBvaW50ZXIgdG8gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdC4qLworfSA7Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ3NjYXR0ZXJpbmdsaXN0IENsb29nU2NhdHRlcmluZ0xpc3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2x5TGliIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgY2xvb2dfZG9tYWluX3ByaW50X2NvbnN0cmFpbnRzKEZJTEUgKiwgQ2xvb2dEb21haW4gKiwKKwkJCQkJCWludCBwcmludF9udW1iZXIpOwordm9pZCAgICAgICAgICBjbG9vZ19zY2F0dGVyaW5nX3ByaW50X2NvbnN0cmFpbnRzKEZJTEUgKiwgQ2xvb2dTY2F0dGVyaW5nICopOwordm9pZCAgICAgICAgICBjbG9vZ19kb21haW5fZnJlZShDbG9vZ0RvbWFpbiAqKSA7Cit2b2lkICAgICAgICAgIGNsb29nX3NjYXR0ZXJpbmdfZnJlZShDbG9vZ1NjYXR0ZXJpbmcgKik7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9jb3B5KENsb29nRG9tYWluICopIDsKK0Nsb29nRG9tYWluICogY2xvb2dfZG9tYWluX2NvbnZleChDbG9vZ0RvbWFpbiAqIFBvbCkgOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fc2ltcGxlX2NvbnZleChDbG9vZ0RvbWFpbiAqIGRvbWFpbik7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9zaW1wbGlmeShDbG9vZ0RvbWFpbiAqLCBDbG9vZ0RvbWFpbiAqKSA7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl91bmlvbihDbG9vZ0RvbWFpbiAqLCBDbG9vZ0RvbWFpbiAqKSA7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9pbnRlcnNlY3Rpb24oQ2xvb2dEb21haW4gKiwgQ2xvb2dEb21haW4gKikgOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fZGlmZmVyZW5jZShDbG9vZ0RvbWFpbiAqLCBDbG9vZ0RvbWFpbiAqKSA7Cit2b2lkICAgICAgICAgIGNsb29nX2RvbWFpbl9zb3J0KENsb29nRG9tYWluKiosdW5zaWduZWQsdW5zaWduZWQsaW50ICopOworaW50IGNsb29nX2RvbWFpbl9mb2xsb3dzKENsb29nRG9tYWluICpkb20xLCBDbG9vZ0RvbWFpbiAqZG9tMiwgdW5zaWduZWQgbGV2ZWwpOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fZW1wdHkoQ2xvb2dEb21haW4gKm1vZGVsKTsKK2ludCBjbG9vZ19kb21haW5faXNfYm91bmRlZChDbG9vZ0RvbWFpbiAqZGltLCB1bnNpZ25lZCBsZXZlbCk7CitDbG9vZ0RvbWFpbiAqY2xvb2dfZG9tYWluX2JvdW5kX3NwbGl0dGVyKENsb29nRG9tYWluICpkb20sIGludCBsZXZlbCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZSBkaXNwbGF5IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2xvb2dfZG9tYWluX3ByaW50X3N0cnVjdHVyZShGSUxFICpmaWxlLCBDbG9vZ0RvbWFpbiAqZG9tYWluLCBpbnQgbGV2ZWwsCisJCQkJICBjb25zdCBjaGFyICpuYW1lKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnkgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjbG9vZ19kb21haW5fbGlzdF9mcmVlKENsb29nRG9tYWluTGlzdCAqKTsKK3ZvaWQgY2xvb2dfc2NhdHRlcmluZ19saXN0X2ZyZWUoQ2xvb2dTY2F0dGVyaW5nTGlzdCAqKTsKKworCisvKisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkaW5nIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fcmVhZF9jb250ZXh0KENsb29nU3RhdGUgKnN0YXRlLCBGSUxFICogZm9vKTsKK0Nsb29nRG9tYWluICogY2xvb2dfZG9tYWluX3VuaW9uX3JlYWQoQ2xvb2dTdGF0ZSAqc3RhdGUsIEZJTEUgKmZvbywgaW50IG5iX3Bhcik7CitDbG9vZ1NjYXR0ZXJpbmcgKmNsb29nX2RvbWFpbl9yZWFkX3NjYXR0ZXJpbmcoQ2xvb2dEb21haW4gKmRvbWFpbiwgRklMRSAqZm9vKTsKKworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fZnJvbV9jbG9vZ19tYXRyaXgoQ2xvb2dTdGF0ZSAqc3RhdGUsCisJCQkJQ2xvb2dNYXRyaXggKm1hdHJpeCwgaW50IG5iX3Bhcik7CitDbG9vZ1NjYXR0ZXJpbmcgKiBjbG9vZ19zY2F0dGVyaW5nX2Zyb21fY2xvb2dfbWF0cml4KENsb29nU3RhdGUgKnN0YXRlLAorCQkJCUNsb29nTWF0cml4ICptYXRyaXgsIGludCBuYl9zY2F0LCBpbnQgbmJfcGFyKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzaW5nIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ2xvb2dEb21haW4gKmNsb29nX2RvbWFpbl9mcm9tX29zbF9yZWxhdGlvbihDbG9vZ1N0YXRlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvc2xfcmVsYXRpb24gKik7CitDbG9vZ1NjYXR0ZXJpbmcgKmNsb29nX3NjYXR0ZXJpbmdfZnJvbV9vc2xfcmVsYXRpb24oQ2xvb2dTdGF0ZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvc2xfcmVsYXRpb24gKik7CitDbG9vZ0NvbnN0cmFpbnRTZXQgKmNsb29nX2RvbWFpbl9jb25zdHJhaW50cyhDbG9vZ0RvbWFpbiAqKTsKK2ludCAgICAgICAgICAgY2xvb2dfZG9tYWluX2lzZW1wdHkoQ2xvb2dEb21haW4gKikgOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fdW5pdmVyc2UoQ2xvb2dTdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGRpbSk7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9wcm9qZWN0KENsb29nRG9tYWluICosIGludCk7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9leHRlbmQoQ2xvb2dEb21haW4gKiwgaW50KTsKK2ludCAgICAgICAgICAgY2xvb2dfZG9tYWluX25ldmVyX2ludGVncmFsKENsb29nRG9tYWluICopIDsKK3ZvaWQgICAgICAgICAgY2xvb2dfZG9tYWluX3N0cmlkZShDbG9vZ0RvbWFpbiAqLCBpbnQsIGNsb29nX2ludF90ICosIGNsb29nX2ludF90ICopOworaW50ICAgICAgICAgICBjbG9vZ19kb21haW5fY2FuX3N0cmlkZShDbG9vZ0RvbWFpbiAqZG9tYWluLCBpbnQgbGV2ZWwpOworaW50ICAgICAgICAgICBjbG9vZ19kb21haW5faXNfb3RsKENsb29nRG9tYWluICpkb21haW4sIGludCBsZXZlbCk7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9zdHJpZGVfbG93ZXJfYm91bmQoQ2xvb2dEb21haW4gKmRvbWFpbiwgaW50IGxldmVsLAorCQkJCQlDbG9vZ1N0cmlkZSAqc3RyaWRlKTsKK0Nsb29nRG9tYWluICogY2xvb2dfZG9tYWluX2FkZF9zdHJpZGVfY29uc3RyYWludChDbG9vZ0RvbWFpbiAqZG9tYWluLAorCQkJCQlDbG9vZ1N0cmlkZSAqc3RyaWRlKTsKK2ludCAgICAgICAgICAgY2xvb2dfZG9tYWluX2Nhbl91bnJvbGwoQ2xvb2dEb21haW4gKmRvbWFpbiwgaW50IGxldmVsLAorCQkJCWNsb29nX2ludF90ICpuLCBDbG9vZ0NvbnN0cmFpbnQgKipsYik7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9maXhlZF9vZmZzZXQoQ2xvb2dEb21haW4gKmRvbWFpbiwgaW50IGxldmVsLAorCQkJCUNsb29nQ29uc3RyYWludCAqbGIsIGNsb29nX2ludF90IG9mZnNldCk7CitpbnQgICAgICAgICAgIGNsb29nX2RvbWFpbl9sYXp5X2Rpc2pvaW50KENsb29nRG9tYWluICosIENsb29nRG9tYWluICopIDsKK2ludCAgICAgICAgICAgY2xvb2dfZG9tYWluX2xhenlfZXF1YWwoQ2xvb2dEb21haW4gKiwgQ2xvb2dEb21haW4gKikgOworaW50ICAgICAgICAgICBjbG9vZ19zY2F0dGVyaW5nX2xhenlfYmxvY2soQ2xvb2dTY2F0dGVyaW5nICosIENsb29nU2NhdHRlcmluZyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9vZ1NjYXR0ZXJpbmdMaXN0ICosIGludCk7CitpbnQgICAgICAgICAgIGNsb29nX3NjYXR0ZXJpbmdfbGF6eV9pc3NjYWxhcihDbG9vZ1NjYXR0ZXJpbmcgKiwgaW50LAorCQkJCQkJCQljbG9vZ19pbnRfdCAqKTsKK2ludCAgICAgICAgICAgY2xvb2dfZG9tYWluX2xhenlfaXNjb25zdGFudChDbG9vZ0RvbWFpbiAqZG9tYWluLCBpbnQgZGltZW5zaW9uLAorCQkJCQkgICBjbG9vZ19pbnRfdCAqdmFsdWUpOworaW50ICAgICAgICAgICBjbG9vZ19zY2F0dGVyaW5nX2xpc3RfbGF6eV9zYW1lKENsb29nU2NhdHRlcmluZ0xpc3QgKik7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9jdXRfZmlyc3QoQ2xvb2dEb21haW4gKmRvbWFpbiwgQ2xvb2dEb21haW4gKipyZXN0KTsKK0Nsb29nRG9tYWluICogY2xvb2dfZG9tYWluX3NpbXBsaWZ5X3VuaW9uKENsb29nRG9tYWluICpkb21haW4pOworQ2xvb2dTY2F0dGVyaW5nICogY2xvb2dfc2NhdHRlcmluZ19lcmFzZV9kaW1lbnNpb24oQ2xvb2dTY2F0dGVyaW5nICosIGludCk7CisKK2ludCAgICAgICAgICAgY2xvb2dfZG9tYWluX2RpbWVuc2lvbihDbG9vZ0RvbWFpbiAqKSA7CitpbnQgICAgICAgICAgIGNsb29nX2RvbWFpbl9wYXJhbWV0ZXJfZGltZW5zaW9uKENsb29nRG9tYWluICpkb21haW4pOworaW50ICAgICAgICAgICBjbG9vZ19zY2F0dGVyaW5nX2RpbWVuc2lvbihDbG9vZ1NjYXR0ZXJpbmcgKiwgQ2xvb2dEb21haW4gKik7CitpbnQgICAgICAgICAgIGNsb29nX2RvbWFpbl9pc2NvbnZleChDbG9vZ0RvbWFpbiAqKSA7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9jdWJlKENsb29nU3RhdGUgKnN0YXRlLAorCQkJCWludCBkaW0sIGNsb29nX2ludF90IG1pbiwgY2xvb2dfaW50X3QgbWF4KTsKK0Nsb29nRG9tYWluICogY2xvb2dfZG9tYWluX2Zyb21fY29udGV4dChDbG9vZ0RvbWFpbiAqY29udGV4dCk7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9zY2F0dGVyKENsb29nRG9tYWluICpkb21haW4sIENsb29nU2NhdHRlcmluZyAqc2NhdHQpOworaW50ICAgICAgICAgICBjbG9vZ19zY2F0dGVyaW5nX2Z1bGx5X3NwZWNpZmllZChDbG9vZ1NjYXR0ZXJpbmcgKnNjYXR0ZXJpbmcsCisJCQkJCQlDbG9vZ0RvbWFpbiAqZG9tYWluKTsKKworQ2xvb2dTdHJpZGUgKmNsb29nX2RvbWFpbl9saXN0X3N0cmlkZShDbG9vZ0RvbWFpbkxpc3QgKmxpc3QsIGludCBsZXZlbCk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorICB9CisjZW5kaWYgCisjZW5kaWYgLyogZGVmaW5lIF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2lucHV0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2lucHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkM2M1MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvaW5wdXQuaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIENMT09HX0lOUFVUX0gKKyNkZWZpbmUgQ0xPT0dfSU5QVVRfSAorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmIAorCitzdHJ1Y3Qgb3NsX3Njb3A7CisKK3N0cnVjdCBjbG9vZ2lucHV0IHsKKwlDbG9vZ0RvbWFpbiAqY29udGV4dDsKKwlDbG9vZ1VuaW9uRG9tYWluICp1ZDsKK307Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ2lucHV0IENsb29nSW5wdXQ7CisKK0Nsb29nSW5wdXQgKmNsb29nX2lucHV0X2Zyb21fb3NsX3Njb3AoQ2xvb2dTdGF0ZSAqLCBzdHJ1Y3Qgb3NsX3Njb3AgKik7CitDbG9vZ0lucHV0ICpjbG9vZ19pbnB1dF9yZWFkKEZJTEUgKmZpbGUsIENsb29nT3B0aW9ucyAqb3B0aW9ucyk7CitDbG9vZ0lucHV0ICpjbG9vZ19pbnB1dF9hbGxvYyhDbG9vZ0RvbWFpbiAqY29udGV4dCwgQ2xvb2dVbmlvbkRvbWFpbiAqdWQpOwordm9pZCBjbG9vZ19pbnB1dF9mcmVlKENsb29nSW5wdXQgKmlucHV0KTsKKwordm9pZCBjbG9vZ19pbnB1dF9kdW1wX2Nsb29nKEZJTEUgKmZpbGUsIENsb29nSW5wdXQgKmlucHV0LCBDbG9vZ09wdGlvbnMgKm9wdCk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmIAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvaW50LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyM2ExY2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2ludC5oCkBAIC0wLDAgKzEsMTc0IEBACisjaWZuZGVmIENMT09HX0lOVF9ICisjZGVmaW5lIENMT09HX0lOVF9ICisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIGRlZmluZWQoQ0xPT0dfSU5UX0dNUCkKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnbXAuaD4KKyNpZm5kZWYgbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMKK3ZvaWQgbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMoCisJCXZvaWQgKigqKmFsbG9jX2Z1bmNfcHRyKSAoc2l6ZV90KSwKKwkJdm9pZCAqKCoqcmVhbGxvY19mdW5jX3B0cikgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QpLAorCQl2b2lkICgqKmZyZWVfZnVuY19wdHIpICh2b2lkICosIHNpemVfdCkpOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIAorICB7CisjZW5kaWYgCisKKyNpZiBkZWZpbmVkKENMT09HX0lOVF9JTlQpCit0eXBlZGVmIGludAkJY2xvb2dfaW50X3Q7CisjZGVmaW5lIENMT09HX0lOVF9GT1JNQVQJIiVkIgorI2VsaWYgZGVmaW5lZChDTE9PR19JTlRfTE9ORykKK3R5cGVkZWYgbG9uZwkJY2xvb2dfaW50X3Q7CisjZGVmaW5lIENMT09HX0lOVF9GT1JNQVQJIiVsZCIKKyNlbGlmIGRlZmluZWQoQ0xPT0dfSU5UX0xPTkdfTE9ORykKK3R5cGVkZWYgbG9uZyBsb25nCWNsb29nX2ludF90OworI2RlZmluZSBDTE9PR19JTlRfRk9STUFUCSIlbGxkIgorI2VsaWYgZGVmaW5lZChDTE9PR19JTlRfR01QKQordHlwZWRlZiBtcHpfdAkJY2xvb2dfaW50X3Q7CisjZWxzZQorI2Vycm9yICJObyBpbnRlZ2VyIHR5cGUgZGVmaW5lZCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDTE9PR19JTlRfR01QKQorCisjZGVmaW5lIGNsb29nX2ludF9pbml0KGkpCW1wel9pbml0KGkpCisjZGVmaW5lIGNsb29nX2ludF9jbGVhcihpKQltcHpfY2xlYXIoaSk7CisKKyNkZWZpbmUgY2xvb2dfaW50X3NldChyLGkpCW1wel9zZXQocixpKQorI2RlZmluZSBjbG9vZ19pbnRfc2V0X3NpKHIsaSkJbXB6X3NldF9zaShyLGkpCisjZGVmaW5lIGNsb29nX2ludF9hYnMocixpKQltcHpfYWJzKHIsaSkKKyNkZWZpbmUgY2xvb2dfaW50X25lZyhyLGkpCW1wel9uZWcocixpKQorI2RlZmluZSBjbG9vZ19pbnRfc3dhcChpLGopCW1wel9zd2FwKGksaikKKworI2RlZmluZSBjbG9vZ19pbnRfYWRkKHIsaSxqKQltcHpfYWRkKHIsaSxqKQorI2RlZmluZSBjbG9vZ19pbnRfYWRkX3VpKHIsaSxqKQltcHpfYWRkX3VpKHIsaSxqKQorI2RlZmluZSBjbG9vZ19pbnRfc3ViKHIsaSxqKQltcHpfc3ViKHIsaSxqKQorI2RlZmluZSBjbG9vZ19pbnRfc3ViX3VpKHIsaSxqKQltcHpfc3ViX3VpKHIsaSxqKQorI2RlZmluZSBjbG9vZ19pbnRfbXVsKHIsaSxqKQltcHpfbXVsKHIsaSxqKQorI2RlZmluZSBjbG9vZ19pbnRfYWRkbXVsKHIsaSxqKQltcHpfYWRkbXVsKHIsaSxqKQorI2RlZmluZSBjbG9vZ19pbnRfZGl2ZXhhY3QocixpLGopCW1wel9kaXZleGFjdChyLGksaikKKyNkZWZpbmUgY2xvb2dfaW50X3RkaXZfcShyLGksaikJbXB6X3RkaXZfcShyLGksaikKKyNkZWZpbmUgY2xvb2dfaW50X2ZkaXZfcShyLGksaikJbXB6X2ZkaXZfcShyLGksaikKKyNkZWZpbmUgY2xvb2dfaW50X2ZkaXZfcihyLGksaikJbXB6X2ZkaXZfcihyLGksaikKKyNkZWZpbmUgY2xvb2dfaW50X2NkaXZfcShyLGksaikJbXB6X2NkaXZfcShyLGksaikKKyNkZWZpbmUgY2xvb2dfaW50X2djZChyLGksaikJbXB6X2djZChyLGksaikKKworI2RlZmluZSBjbG9vZ19pbnRfc2duKGkpCW1wel9zZ24oaSkKKyNkZWZpbmUgY2xvb2dfaW50X2NtcChpLGopCW1wel9jbXAoaSxqKQorI2RlZmluZSBjbG9vZ19pbnRfYWJzX2NtcChpLGopCW1wel9jbXBhYnMoaSxqKQorI2RlZmluZSBjbG9vZ19pbnRfY21wX3NpKGksc2kpCW1wel9jbXBfc2koaSxzaSkKKyNkZWZpbmUgY2xvb2dfaW50X2VxKGksaikJKG1wel9jbXAoaSxqKSA9PSAwKQorI2RlZmluZSBjbG9vZ19pbnRfbmUoaSxqKQkobXB6X2NtcChpLGopICE9IDApCisjZGVmaW5lIGNsb29nX2ludF9ndChpLGopCShtcHpfY21wKGksaikgPiAwKQorCisjZGVmaW5lIGNsb29nX2ludF9pc19kaXZpc2libGVfYnkoaSxqKQltcHpfZGl2aXNpYmxlX3AoaSxqKQorCisjZGVmaW5lIGNsb29nX2ludF9yZWFkKHIscykJbXB6X3NldF9zdHIocixzLDEwKQordHlwZWRlZiB2b2lkICgqY2xvb2dfaW50X3ByaW50X2dtcF9mcmVlX3QpKHZvaWQgKiwgc2l6ZV90KTsKKyNkZWZpbmUgY2xvb2dfaW50X3ByaW50KG91dCxpKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgKnM7CQkJCQkJXAorCQljbG9vZ19pbnRfcHJpbnRfZ21wX2ZyZWVfdCBnbXBfZnJlZTsJCQlcCisJCXMgPSBtcHpfZ2V0X3N0cigwLCAxMCwgaSk7CQkJCVwKKwkJZnByaW50ZihvdXQsICIlcyIsIHMpOwkJCQkJXAorCQltcF9nZXRfbWVtb3J5X2Z1bmN0aW9ucyhOVUxMLCBOVUxMLCAmZ21wX2ZyZWUpOwkJXAorCQkoKmdtcF9mcmVlKShzLCBzdHJsZW4ocykrMSk7CQkJCVwKKwl9IHdoaWxlICgwKQorCisjZWxzZQorCisjZGVmaW5lIGNsb29nX2ludF9pbml0KGkpCSgoaSkgPSAwKQorI2RlZmluZSBjbG9vZ19pbnRfY2xlYXIoaSkJZG8geyB9IHdoaWxlICgwKQorCisjZGVmaW5lIGNsb29nX2ludF9zZXQocixpKQkoKHIpID0gKGkpKQorI2RlZmluZSBjbG9vZ19pbnRfc2V0X3NpKHIsaSkJKChyKSA9IChpKSkKKyNkZWZpbmUgY2xvb2dfaW50X2FicyhyLGkpCSgocikgPSAoaSkgPiAwID8gKGkpIDogLShpKSkKKyNkZWZpbmUgY2xvb2dfaW50X25lZyhyLGkpCSgocikgPSAtKGkpKQorI2RlZmluZSBjbG9vZ19pbnRfc3dhcChpLGopCWRvIHsJCQkJCVwKKwkJCQkJY2xvb2dfaW50X3QgX3QgPSBpOwkJXAorCQkJCQlpID0gajsJCQkJXAorCQkJCQlqID0gX3Q7CQkJCVwKKwkJCQl9IHdoaWxlICgwKQorCisjZGVmaW5lIGNsb29nX2ludF9hZGQocixpLGopCSgocikgPSAoaSkgKyAoaikpCisjZGVmaW5lIGNsb29nX2ludF9hZGRfdWkocixpLGopCSgocikgPSAoaSkgKyAoaikpCisjZGVmaW5lIGNsb29nX2ludF9zdWIocixpLGopCSgocikgPSAoaSkgLSAoaikpCisjZGVmaW5lIGNsb29nX2ludF9zdWJfdWkocixpLGopCSgocikgPSAoaSkgLSAoaikpCisjZGVmaW5lIGNsb29nX2ludF9tdWwocixpLGopCSgocikgPSAoaSkgKiAoaikpCisjZGVmaW5lIGNsb29nX2ludF9hZGRtdWwocixpLGopCSgocikgKz0gKGkpICogKGopKQorI2RlZmluZSBjbG9vZ19pbnRfZGl2ZXhhY3QocixpLGopCSgocikgPSAoaSkgLyAoaikpCisjZGVmaW5lIGNsb29nX2ludF90ZGl2X3EocixpLGopCSgocikgPSAoaSkgLyAoaikpCisjZGVmaW5lIGNsb29nX2ludF9mZGl2X3EocixpLGopCWRvIHsJCQkJCVwKKwkJCQkJYXNzZXJ0KChqKSA+IDApOwkJXAorCQkJCQkocikgPSAoaSkgPj0gMCA/IChpKSAvIChqKSA6CVwKKwkJCQkJICAgIC0oKC0oaSkrKGopLTEpLyhqKSk7CVwKKwkJCQl9IHdoaWxlICgwKQorI2RlZmluZSBjbG9vZ19pbnRfZmRpdl9yKHIsaSxqKQlkbyB7CQkJCQlcCisJCQkJCWFzc2VydCgoaikgPiAwKTsJCVwKKwkJCQkJKHIpID0gKGkpID49IDAgPyAoaSkgJSAoaikgOglcCisJCQkJCSAgICAoaiktMSAtICgoLShpKSsoaiktMSklKGopKTsJXAorCQkJCX0gd2hpbGUgKDApCisjZGVmaW5lIGNsb29nX2ludF9jZGl2X3EocixpLGopCWRvIHsJCQkJCVwKKwkJCQkJYXNzZXJ0KChqKSA+IDApOwkJXAorCQkJCQkocikgPSAoaSkgPj0gMCA/CQlcCisJCQkJCSAgICAoKGkpKyhqKS0xKSAvIChqKSA6CQlcCisJCQkJCSAgICAtKC0oaSkvKGopKTsJCVwKKwkJCQl9IHdoaWxlICgwKQorY2xvb2dfaW50X3QgY2xvb2dfZ2NkKGNsb29nX2ludF90IGEsIGNsb29nX2ludF90IGIpOworI2RlZmluZSBjbG9vZ19pbnRfZ2NkKHIsaSxqKQkocikgPSBjbG9vZ19nY2QoaSxqKQorCisjZGVmaW5lIGNsb29nX2ludF9zZ24oaSkJKChpKSA+IDAgPyAxIDogKGkpIDwgMCA/IC0xIDogMCkKKyNkZWZpbmUgY2xvb2dfaW50X2NtcChpLGopCShpIC0gaikKKyNkZWZpbmUgY2xvb2dfaW50X2Fic19jbXAoaSxqKQkoKChpKSA+IDAgPyAoaSkgOiAtKGkpKSAtICgoaikgPiAwID8gKGopIDogLShqKSkpCisjZGVmaW5lIGNsb29nX2ludF9jbXBfc2koaSxzaSkJKGkgLSBzaSkKKyNkZWZpbmUgY2xvb2dfaW50X2VxKGksaikJKChpKSA9PSAoaikpCisjZGVmaW5lIGNsb29nX2ludF9uZShpLGopCSgoaSkgIT0gKGopKQorI2RlZmluZSBjbG9vZ19pbnRfZ3QoaSxqKQkoKGkpID4gKGopKQorCisjZGVmaW5lIGNsb29nX2ludF9pc19kaXZpc2libGVfYnkoaSxqKQkoKGkpICUgKGopID09IDApCisKKyNkZWZpbmUgY2xvb2dfaW50X3JlYWQoaSxzKQlzc2NhbmYocywgQ0xPT0dfSU5UX0ZPUk1BVCwgJmkpCisjZGVmaW5lIGNsb29nX2ludF9wcmludChvdXQsaSkJZnByaW50ZihvdXQsIENMT09HX0lOVF9GT1JNQVQsIGkpCisKKyNlbmRpZgorCisjZGVmaW5lIGNsb29nX2ludF9pc19wb3MoaSkJKGNsb29nX2ludF9zZ24oaSkgPiAwKQorI2RlZmluZSBjbG9vZ19pbnRfaXNfbmVnKGkpCShjbG9vZ19pbnRfc2duKGkpIDwgMCkKKyNkZWZpbmUgY2xvb2dfaW50X2lzX3plcm8oaSkJKGNsb29nX2ludF9zZ24oaSkgPT0gMCkKKyNkZWZpbmUgY2xvb2dfaW50X2lzX29uZShpKQkoY2xvb2dfaW50X2NtcF9zaShpLDEpID09IDApCisjZGVmaW5lIGNsb29nX2ludF9pc19uZWdfb25lKGkpCShjbG9vZ19pbnRfY21wX3NpKGksLTEpID09IDApCisjZGVmaW5lIGNsb29nX2ludF9ndF9zaShpLHNpKQkoY2xvb2dfaW50X2NtcF9zaShpLHNpKSA+IDApCisjZGVmaW5lIGNsb29nX2ludF9uZV9zaShpLGopCShjbG9vZ19pbnRfY21wX3NpKGksaikgIT0gMCkKKyNkZWZpbmUgY2xvb2dfaW50X2x0KGksaikJKGNsb29nX2ludF9jbXAoaSxqKSA8IDApCisjZGVmaW5lIGNsb29nX2ludF9sZShpLGopCShjbG9vZ19pbnRfY21wKGksaikgPD0gMCkKKyNkZWZpbmUgY2xvb2dfaW50X2Fic19uZShpLGopCShjbG9vZ19pbnRfYWJzX2NtcChpLGopICE9IDApCisjZGVmaW5lIGNsb29nX2ludF9hYnNfZ2UoaSxqKQkoY2xvb2dfaW50X2Fic19jbXAoaSxqKSA+PSAwKQorI2RlZmluZSBjbG9vZ19pbnRfYWJzX2x0KGksaikJKGNsb29nX2ludF9hYnNfY21wKGksaikgPCAwKQorCitzdHJ1Y3QgY2xvb2dfdmVjIHsKKwl1bnNpZ25lZAlzaXplOworCWNsb29nX2ludF90CSpwOworfTsKKworc3RydWN0IGNsb29nX3ZlYyAqY2xvb2dfdmVjX2FsbG9jKHVuc2lnbmVkIHNpemUpOwordm9pZCBjbG9vZ192ZWNfZnJlZShzdHJ1Y3QgY2xvb2dfdmVjICp2ZWMpOworCitpbnQgY2xvb2dfc2VxX2ZpcnN0X25vbl96ZXJvKGNsb29nX2ludF90ICpwLCB1bnNpZ25lZCBsZW4pOwordm9pZCBjbG9vZ19zZXFfY3B5KGNsb29nX2ludF90ICpkc3QsIGNsb29nX2ludF90ICpzcmMsIHVuc2lnbmVkIGxlbik7Cit2b2lkIGNsb29nX3NlcV9uZWcoY2xvb2dfaW50X3QgKmRzdCwgY2xvb2dfaW50X3QgKnNyYywgdW5zaWduZWQgbGVuKTsKK3ZvaWQgY2xvb2dfc2VxX2NvbWJpbmUoY2xvb2dfaW50X3QgKmRzdCwgY2xvb2dfaW50X3QgbTEsIGNsb29nX2ludF90ICpzcmMxLAorCQkJY2xvb2dfaW50X3QgbTIsIGNsb29nX2ludF90ICpzcmMyLCB1bnNpZ25lZCBsZW4pOwordm9pZCBjbG9vZ19zZXFfZ2NkKGNsb29nX2ludF90ICpwLCB1bnNpZ25lZCBsZW4sIGNsb29nX2ludF90ICpnY2QpOworaW50IGNsb29nX3NlcV9pc19uZWcoY2xvb2dfaW50X3QgKnAxLCBjbG9vZ19pbnRfdCAqcDIsIHVuc2lnbmVkIGxlbik7Cit2b2lkIGNsb29nX3NlcV9ub3JtYWxpemUoY2xvb2dfaW50X3QgKnAsIHVuc2lnbmVkIGxlbik7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorICB9CisjZW5kaWYgCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9pc2wvYmFja2VuZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9pc2wvYmFja2VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NTc2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2lzbC9iYWNrZW5kLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBDTE9PR19JU0xfQkFDS0VORF9ICisjZGVmaW5lIENMT09HX0lTTF9CQUNLRU5EX0gKKworI2luY2x1ZGUgPGlzbC9jb25zdHJhaW50Lmg+CisKK3N0cnVjdCBjbG9vZ2JhY2tlbmQgeworCXN0cnVjdCBpc2xfY3R4CSpjdHg7CisJdW5zaWduZWQJY3R4X2FsbG9jYXRlZCA6IDE7Cit9OworCisjZW5kaWYgLyogZGVmaW5lIF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2lzbC9jbG9vZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9pc2wvY2xvb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzc5MDU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9pc2wvY2xvb2cuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIENMT09HX0lTTF9ICisjZGVmaW5lIENMT09HX0lTTF9ICisKKyNpZm5kZWYgQ0xPT0dfSU5UX0dNUAorI2RlZmluZSBDTE9PR19JTlRfR01QCisjZW5kaWYKKworI2luY2x1ZGUgPGNsb29nL2Nsb29nLmg+CisjaW5jbHVkZSA8Y2xvb2cvaXNsL2NvbnN0cmFpbnRzZXQuaD4KKyNpbmNsdWRlIDxjbG9vZy9pc2wvZG9tYWluLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYgCisKK0Nsb29nU3RhdGUgKmNsb29nX2lzbF9zdGF0ZV9tYWxsb2Moc3RydWN0IGlzbF9jdHggKmN0eCk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmIAorCisjZW5kaWYgLyogZGVmaW5lIF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2lzbC9jb25zdHJhaW50c2V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2lzbC9jb25zdHJhaW50c2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjMmVlZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvaXNsL2NvbnN0cmFpbnRzZXQuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIENMT09HX0lTTF9DT05TVFJBSU5UU0VUX0gKKyNkZWZpbmUgQ0xPT0dfSVNMX0NPTlNUUkFJTlRTRVRfSAorCisjaW5jbHVkZSA8Y2xvb2cvaXNsL2JhY2tlbmQuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIAorICB7CisjZW5kaWYgCisKK3N0cnVjdCBjbG9vZ2NvbnN0cmFpbnRzZXQgeworCWludCBkdW1teTsJLyogU29sYXJpcyBjYyBkb2Vzbid0IGxpa2UgemVyby1zaXplZCBzdHJ1Y3RzICovCit9OworCitzdHJ1Y3QgY2xvb2dlcXVhbGl0aWVzIHsKKwlpbnQJCQkgIG47CisJdW5zaWduZWQJCSAgdG90YWxfZGltOworCWlzbF9jb25zdHJhaW50CQkqKmNvbnN0cmFpbnRzOworCWludAkJCSAqdHlwZXM7Cit9OworCitzdHJ1Y3QgY2xvb2djb25zdHJhaW50IHsKKwlpbnQgZHVtbXk7CS8qIFNvbGFyaXMgY2MgZG9lc24ndCBsaWtlIHplcm8tc2l6ZWQgc3RydWN0cyAqLworfTsKKworQ2xvb2dDb25zdHJhaW50U2V0ICpjbG9vZ19jb25zdHJhaW50X3NldF9mcm9tX2lzbF9iYXNpY19zZXQoc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQpOworQ2xvb2dDb25zdHJhaW50ICpjbG9vZ19jb25zdHJhaW50X2Zyb21faXNsX2NvbnN0cmFpbnQoc3RydWN0IGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50KTsKK2lzbF9jb25zdHJhaW50ICpjbG9vZ19jb25zdHJhaW50X3RvX2lzbChDbG9vZ0NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyAgfQorI2VuZGlmIAorI2VuZGlmIC8qIGRlZmluZSBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9pc2wvZG9tYWluLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL2lzbC9kb21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWI0N2YyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9pc2wvZG9tYWluLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBDTE9PR19JU0xfRE9NQUlOX0gKKyNkZWZpbmUgQ0xPT0dfSVNMX0RPTUFJTl9ICisKKyNpbmNsdWRlIDxpc2wvbWFwLmg+CisjaW5jbHVkZSA8aXNsL3NldC5oPgorI2luY2x1ZGUgPGlzbC91bmlvbl9tYXAuaD4KKyNpbmNsdWRlIDxpc2wvdW5pb25fc2V0Lmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmIAorCisKK3N0cnVjdCBjbG9vZ2RvbWFpbiB7CisJaW50IGR1bW15OwkvKiBTb2xhcmlzIGNjIGRvZXNuJ3QgbGlrZSB6ZXJvLXNpemVkIHN0cnVjdHMgKi8KK307CisKK3N0cnVjdCBjbG9vZ3NjYXR0ZXJpbmcgeworCWludCBkdW1teTsJLyogU29sYXJpcyBjYyBkb2Vzbid0IGxpa2UgemVyby1zaXplZCBzdHJ1Y3RzICovCit9OworCitDbG9vZ0RvbWFpbiAqY2xvb2dfZG9tYWluX2Zyb21faXNsX3NldChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitDbG9vZ1NjYXR0ZXJpbmcgKmNsb29nX3NjYXR0ZXJpbmdfZnJvbV9pc2xfbWFwKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK0Nsb29nVW5pb25Eb21haW4gKmNsb29nX3VuaW9uX2RvbWFpbl9mcm9tX2lzbF91bmlvbl9tYXAoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKK0Nsb29nVW5pb25Eb21haW4gKmNsb29nX3VuaW9uX2RvbWFpbl9mcm9tX2lzbF9zZXQoCisJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworCitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZnJvbV9jbG9vZ19kb21haW4oQ2xvb2dEb21haW4gKmRvbWFpbik7CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgIH0KKyNlbmRpZiAKKyNlbmRpZiAvKiBkZWZpbmUgX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvbG9vcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9sb29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyYTI3NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvbG9vcC5oCkBAIC0wLDAgKzEsMTIwIEBACisKKyAgIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xvb0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgIEZpcnN0IHZlcnNpb246IG9jdG9iZXIgMjZ0aCAyMDAxICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIENMb29HIDogdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAoZXhwZXJpbWVudGFsKSAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBDZWRyaWMgQmFzdG91bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yICAgICAgICAgICAgICAqCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgICAgICAgICAgICAgICAqCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSAgICAgICAgICAqCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDTG9vRywgdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBXcml0dGVuIGJ5IENlZHJpYyBCYXN0b3VsLCBDZWRyaWMuQmFzdG91bEBpbnJpYS5mciAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgQ0xPT0dfTE9PUF9ICisjZGVmaW5lIENMT09HX0xPT1BfSAorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIAorICB7CisjZW5kaWYgCisKKy8qKgorICogQ2xvb2dMb29wIHN0cnVjdHVyZToKKyAqIHRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb25zIG9mIGEgbG9vcCBnZW5lcmF0ZWQgb3IgdG8gYmUKKyAqIGdlbmVyYXRlZC4KKyAqIC0gaWYgdGhlIGxvb3AgaGFzIG5vdCBiZWVuIHByb2Nlc3NlZCB5ZXQgKGl0IGlzIG5vdCBhIHJlc3VsdCBvZiBhIGNhbGwgdG8KKyAqICAgY2xvb2dfbG9vcF9nZW5lcmF0ZSksIHRoZSBkb21haW4gaXMgdGhlIHdob2xlIGl0ZXJhdGlvbiBkb21haW4gb2YgYSBnaXZlbgorICogICBibG9jaywgdGhlIHN0cmlkZSBpcyAxIChpLmUuIHRoZXJlIGlzIG5vIHN0cmlkZSksIGJsb2NrIGlzIG5lY2Vzc2FyaWx5IG5vdAorICogICBOVUxMIGFuZCBpbm5lciBpcyBOVUxMLgorICogLSBpZiB0aGUgbG9vcCBjb21lcyBhcyBhIHJlc3VsdCBvZiBhIGNsb29nX2xvb3BfZ2VuZXJhdGUgY2FsbCwgdGhlIGRvbWFpbgorICogICBkZXNjcmliZXMgdGhlIGNvbnN0cmFpbnRzIChndWFyZHMgYW5kIGxvb3AgYm91bmRzKSBmb3Igb25seSBvbmUgZGltZW5zaW9uCisgKiAgICh0aGUgbGFzdCBvbmU6IG91dGVyIGRpbWVuc2lvbnMgYmVpbmcgY29uc2lkZXJlZCBhcyBwYXJhbWV0ZXJzKSwgdGhlIHN0cmlkZQorICogICBtYXkgZGlmZmVyIGZyb20gb25lICh0aGlzIG1lYW5zIHRoYXQgb24gdGhlIGNvbnNpZGVyZWQgZGltZW5zaW9uLCBhIHN0ZXAgb2YKKyAqICAgJ3N0cmlkZScgbXVzdCBiZSBjb25zaWRlcmVkIGJldHdlZW4gaW50ZWdyYWwgcG9pbnQsIHRoZSBmaXJzdCBpbnRlZ3JhbAorICogICBwb2ludCB0byBiZSBjb25zaWRlcmVkIGJlaW5nIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgbG9vcCksIGlubmVyIG1heSBkaWZmZXIKKyAqICAgZnJvbSBOVUxMLCBtZWFuaW5nIHRoYXQgdGhlcmUgYXJlIGZ1cnRoZXIgZGltZW5zaW9ucyBhbmQgbmVzdGluZyBsZXZlbHMgaW4KKyAqICAgdGhlIGxvb3AuCisgKi8KK3N0cnVjdCBjbG9vZ2xvb3AKK3sKKyAgQ2xvb2dTdGF0ZSAqc3RhdGU7ICAgICAgICAgIC8qKjwgU3RhdGUuICovCisgIENsb29nRG9tYWluICogZG9tYWluIDsgICAgICAvKio8IFRoZSBpdGVyYXRpb24gZG9tYWluLiAqLworICBDbG9vZ0RvbWFpbiAqdW5zaW1wbGlmaWVkOyAgLyoqPCBVbnNpbXBsaWZpZWQgdmVyc2lvbiBvZiBkb21haW4uICovCisgIGludCBvdGw7ICAgICAgICAgICAgICAgICAgICAvKio8IExvb3AgaXMgZXhlY3V0ZWQgYXQgbW9zdCBvbmNlLiAqLworICBDbG9vZ1N0cmlkZSAqc3RyaWRlOyAgICAgICAgLyoqPCBJZiBub3QgTlVMTCwgc3RyaWRlIGluZm9ybWF0aW9uIG9uIGl0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIChmaWxsZWQgb25seSBhZnRlciBsb29wIGdlbmVyYXRpb24pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIENsb29nQmxvY2sgKiBibG9jayA7ICAgICAgICAvKio8IFRoZSBpbmNsdWRlZCBzdGF0ZW1lbnQgYmxvY2ssIE5VTEwgaWYgbm9uZS4qLworICB2b2lkICogdXNyOwkJICAgICAgLyoqPCBVc2VyIGZpZWxkLCBmb3IgbGlicmFyeSB1c2VyIGNvbnZlbmllbmNlLgorCQkJICAgICAgICogICBUaGlzIHBvaW50ZXIgaXMgbm90IGZyZWVkIHdoZW4gdGhlCisJCQkgICAgICAgKiAgIENsb29nTG9vcCBzdHJ1Y3R1cmUgaXMgZnJlZWQuCisJCQkgICAgICAgKi8KKyAgc3RydWN0IGNsb29nbG9vcCAqIGlubmVyIDsgIC8qKjwgTG9vcHMgYXQgdGhlIG5leHQgbGV2ZWwuICovCisgIHN0cnVjdCBjbG9vZ2xvb3AgKiBuZXh0IDsgICAvKio8IE5leHQgbG9vcCBhdCB0aGUgc2FtZSBsZXZlbC4gKi8KK30gOwordHlwZWRlZiBzdHJ1Y3QgY2xvb2dsb29wIENsb29nTG9vcCA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZSBkaXNwbGF5IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2xvb2dfbG9vcF9wcmludF9zdHJ1Y3R1cmUoRklMRSAqLCBDbG9vZ0xvb3AgKiwgaW50KSA7Cit2b2lkIGNsb29nX2xvb3BfcHJpbnQoRklMRSAqLCBDbG9vZ0xvb3AgKikgOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBkZWFsbG9jYXRpb24gZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNsb29nX2xvb3BfZnJlZShDbG9vZ0xvb3AgKikgOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGluZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDbG9vZ0xvb3AgKmNsb29nX2xvb3BfZnJvbV9kb21haW4oQ2xvb2dTdGF0ZSAqc3RhdGUsIENsb29nRG9tYWluICpkb21haW4sCisJCQkJICBpbnQgbnVtYmVyKTsKK0Nsb29nTG9vcCAqIGNsb29nX2xvb3BfcmVhZChDbG9vZ1N0YXRlICpzdGF0ZSwKKwkJCSAgICBGSUxFICogZm9vLCBpbnQgbnVtYmVyLCBpbnQgbmJfcGFyYW1ldGVycyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc2luZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0Nsb29nTG9vcCAqIGNsb29nX2xvb3BfYmxvY2soQ2xvb2dMb29wICpsb29wLCBpbnQgKnNjYWxkaW1zLCBpbnQgbmJfc2NhdHRkaW1zKTsKK0Nsb29nTG9vcCAqIGNsb29nX2xvb3BfbWFsbG9jKENsb29nU3RhdGUgKnN0YXRlKTsKK0Nsb29nTG9vcCAqY2xvb2dfbG9vcF9nZW5lcmF0ZShDbG9vZ0xvb3AgKmxvb3AsIENsb29nRG9tYWluICpjb250ZXh0LAorCWludCBsZXZlbCwgaW50IHNjYWxhciwgaW50ICpzY2FsZGltcywgaW50IG5iX3NjYXR0ZGltcywKKwlDbG9vZ09wdGlvbnMgKm9wdGlvbnMpOworQ2xvb2dMb29wICpjbG9vZ19sb29wX3NpbXBsaWZ5KENsb29nTG9vcCAqbG9vcCwgQ2xvb2dEb21haW4gKmNvbnRleHQsIGludCBsZXZlbCwKKwlpbnQgbmJfc2NhdHRkaW1zLCBDbG9vZ09wdGlvbnMgKm9wdGlvbnMpOwordm9pZCBjbG9vZ19sb29wX3NjYXR0ZXIoQ2xvb2dMb29wICosIENsb29nU2NhdHRlcmluZyAqKTsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyAgfQorI2VuZGlmIAorI2VuZGlmIC8qIGRlZmluZSBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9tYXRyaXguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvbWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3MzAzOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvbWF0cml4LmgKQEAgLTAsMCArMSw1OSBAQAorI2lmbmRlZiBDTE9PR19NQVRSSVhfSAorI2RlZmluZSBDTE9PR19NQVRSSVhfSAorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiCisgIHsKKyNlbmRpZgorCisvKiBUaGUgQ2xvb2dNYXRyaXggc3RydWN0dXJlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFBvbHlMaWIgTWF0cml4IGRhdGEgc3RydWN0dXJlCisgKiAoc2VlIFdpbDkzKS4gVGhpcyBzdHJ1Y3R1cmUgaXMgZGV2b3RlZCB0byByZXByZXNlbnQgYSBzZXQgb2YgY29uc3RyYWludHMuCisgKgorICogVGhlIHdob2xlIG1hdHJpeCBpcyBzdG9yZWQgaW4gbWVtb3J5IHJvdyBhZnRlciByb3cgYXQgdGhlIHBfSW5pdCBhZGRyZXNzLiBwCisgKiBpcyBhbiBhcnJheSBvZiBwb2ludGVycyB3aGVyZSBwW2ldIHBvaW50cyB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgaV57dGgKKyAqIHJvdy4gTmJSb3dzIGFuZCBOYkNvbHVtbnMgYXJlIHJlc3BlY3RpdmVseSB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgb2YKKyAqIHRoZSBtYXRyaXguIEVhY2ggcm93IGNvcnJlc3BvbmRzIHRvIGEgY29uc3RyYWludC4gVGhlIGZpcnN0IGVsZW1lbnQgb2YgZWFjaAorICogcm93IGlzIGFuIGVxdWFsaXR5L2luZXF1YWxpdHkgdGFnLiBUaGUgY29uc3RyYWludCBpcyBhbiBlcXVhbGl0eSBwKHgpID0gMCBpZgorICogdGhlIGZpcnN0IGVsZW1lbnQgaXMgMCwgYnV0IGl0IGlzIGFuIGluZXF1YWxpdHkgcCh4KSBcZ2VxIDAgaWYgdGhlIGZpcnN0CisgKiBlbGVtZW50IGlzIDEuIFRoZSBuZXh0IGVsZW1lbnRzIGFyZSB0aGUgdW5rbm93biBjb2VmZmljaWVudHMsIGZvbGxvd2VkIGJ5CisgKiB0aGUgcGFyYW1ldGVyIGNvZWZmaWNpZW50cywgdGhlbiB0aGUgY29uc3RhbnQgdGVybS4gRm9yIGluc3RhbmNlLCB0aGUKKyAqIGZvbGxvd2luZyB0aHJlZSBjb25zdHJhaW50czoKKyAqCisgKiAgICAgLWkgKyBtICA9IDAKKyAqICAgICAtaiArIG4gPj0gMAorICogIGkgKyBqIC0gayA+PSAwCisgKgorICogd291bGQgYmUgcmVwcmVzZW50ZWQgYnkgdGhlIGZvbGxvd2luZyByb3dzOgorICoKKyAqICMgZXEvaW4gIGkgICBqICAgayAgIG0gICBuICAgY3N0CisgKiAgICAgMCAgICAwICAtMSAgIDAgICAxICAgMCAgICAwCisgKiAgICAgMSAgIC0xICAgMCAgIDAgICAwICAgMSAgICAwCisgKiAgICAgMSAgICAxICAgMSAgLTEgICAwICAgMCAgICAwCisgKgorICogVG8gYmUgYWJsZSB0byBwcm92aWRlIGRpZmZlcmVudCBwcmVjaXNpb24gdmVyc2lvbiAoQ0xvb0cgc3VwcG9ydHMgMzIgYml0cywKKyAqIDY0IGJpdHMgYW5kIGFyYml0cmFyeSBwcmVjaXNpb24gdGhyb3VnaCB0aGUgR01QIGxpYnJhcnkpLCB0aGUgY2xvb2dfaW50X3QKKyAqIHR5cGUgZGVwZW5kcyBvbiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIChpdCBtYXkgYmUgbG9uZyBpbnQgZm9yIDMyIGJpdHMKKyAqIHZlcnNpb24sIGxvbmcgbG9uZyBpbnQgZm9yIDY0IGJpdHMgdmVyc2lvbiwgYW5kIG1wel90IGZvciBtdWx0aXBsZSBwcmVjaXNpb24KKyAqIHZlcnNpb24pLiAqLworCitzdHJ1Y3QgY2xvb2dtYXRyaXgKK3sgdW5zaWduZWQgTmJSb3dzOyAgICAvKiBOdW1iZXIgb2Ygcm93cy4gKi8KKyAgdW5zaWduZWQgTmJDb2x1bW5zOyAvKiBOdW1iZXIgb2YgY29sdW1ucy4gKi8KKyAgY2xvb2dfaW50X3QgKiogcDsgICAgICAgICAvKiBBcnJheSBvZiBwb2ludGVycyB0byB0aGUgbWF0cml4IHJvd3MuICovCisgIGNsb29nX2ludF90ICogcF9Jbml0OyAgICAgLyogTWF0cml4IHJvd3MgY29udGlndW91c2x5IGluIG1lbW9yeS4gKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGNsb29nbWF0cml4IENsb29nTWF0cml4OworCitDbG9vZ01hdHJpeCAqY2xvb2dfbWF0cml4X2FsbG9jICh1bnNpZ25lZCwgdW5zaWduZWQpOwordm9pZCBjbG9vZ19tYXRyaXhfZnJlZSAoQ2xvb2dNYXRyaXggKik7Cit2b2lkIGNsb29nX21hdHJpeF9wcmludF9zdHJ1Y3R1cmUoRklMRSAqZmlsZSwgQ2xvb2dNYXRyaXggKk0sCisJCWNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqc3VmZml4KTsKK0Nsb29nTWF0cml4ICpjbG9vZ19tYXRyaXhfcmVhZChGSUxFICppbnB1dCk7CitDbG9vZ01hdHJpeCAqY2xvb2dfbWF0cml4X3JlYWRfb2Zfc2l6ZShGSUxFICppbnB1dCwKKwkJdW5zaWduZWQgbl9yb3csIHVuc2lnbmVkIG5fY29sKTsKK3ZvaWQgY2xvb2dfbWF0cml4X3ByaW50KEZJTEUqLCBDbG9vZ01hdHJpeCopOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyAgfQorI2VuZGlmCisjZW5kaWYgLyogZGVmaW5lIF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL21hdHJpeC9jb25zdHJhaW50c2V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL21hdHJpeC9jb25zdHJhaW50c2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyMzE2MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvbWF0cml4L2NvbnN0cmFpbnRzZXQuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIENMT09HX01BVFJJWF9DT05TVFJBSU5UU0VUX0gKKyNkZWZpbmUgQ0xPT0dfTUFUUklYX0NPTlNUUkFJTlRTRVRfSAorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgCisgIHsKKyNlbmRpZiAKKworc3RydWN0IGNsb29nY29uc3RyYWludHNldCB7CisJQ2xvb2dNYXRyaXggTTsKK307CisKK3N0cnVjdCBjbG9vZ2VxdWFsaXRpZXMgeworCUNsb29nQ29uc3RyYWludFNldAkqY29uc3RyYWludHM7CisJaW50CQkJKnR5cGVzOworfTsKKworc3RydWN0IGNsb29nY29uc3RyYWludCB7CisJQ2xvb2dDb25zdHJhaW50U2V0CSpzZXQ7CisJY2xvb2dfaW50X3QJCSoqbGluZTsKK307CisKK0Nsb29nQ29uc3RyYWludFNldCAqY2xvb2dfY29uc3RyYWludF9zZXRfZnJvbV9jbG9vZ19tYXRyaXgoQ2xvb2dNYXRyaXggKk0pOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyAgfQorI2VuZGlmIAorI2VuZGlmIC8qIGRlZmluZSBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9uYW1lcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9uYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNTY2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL25hbWVzLmgKQEAgLTAsMCArMSwxMDMgQEAKKworICAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTG9vRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgIEZpcnN0IHZlcnNpb246IGF1Z3VzdCAxc3QgMjAwMiAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgQ0xvb0cgOiB0aGUgQ2h1bmt5IExvb3AgR2VuZXJhdG9yIChleHBlcmltZW50YWwpICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IENlZHJpYyBCYXN0b3VsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgICAgICAgICAgICAgICoKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgICAgICAgICAgICAgICAgICoKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciAgICAgICAgICAgICAgICoKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VICAgICAgICAgICoKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgICAgICAgICAgICoKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENMb29HLCB0aGUgQ2h1bmt5IExvb3AgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFdyaXR0ZW4gYnkgQ2VkcmljIEJhc3RvdWwsIENlZHJpYy5CYXN0b3VsQGlucmlhLmZyICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBDTE9PR19OQU1FU19ICisjZGVmaW5lIENMT09HX05BTUVTX0gKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmIAorCisKKyMgZGVmaW5lIE1BWF9OQU1FIDUwCisjIGRlZmluZSBGSVJTVF9QQVJBTUVURVIgJ00nCisjIGRlZmluZSBGSVJTVF9JVEVSQVRPUiAgJ2knCisKKworLyoqCisgKiBDbG9vZ05hbWVzIHN0cnVjdHVyZToKKyAqIHRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb25zIGFib3V0IHBhcmFtZXRlciBhbmQgaXRlcmF0b3IKKyAqIG5hbWVzIChhcyBzdHJpbmdzKS4KKyAqLworc3RydWN0IGNsb29nbmFtZXMKK3sgaW50IG5iX3NjYWxhcnMgOyAgICAgICAgIC8qKjwgU2NhbGFyIGRpbWVuc2lvbiBudW1iZXIuICovCisgIGludCBuYl9zY2F0dGVyaW5nIDsgICAgICAvKio8IFNjYXR0ZXJpbmcgaXRlcmF0b3IgbnVtYmVyLiAqLworICBpbnQgbmJfaXRlcmF0b3JzIDsgICAgICAgLyoqPCBJdGVyYXRvciBudW1iZXIuICovCisgIGludCBuYl9wYXJhbWV0ZXJzIDsgICAgICAvKio8IFBhcmFtZXRlciBudW1iZXIuICovCisgIGNoYXIgKiogc2NhbGFycyA7ICAgICAgICAvKio8IFRoZSBzY2FsYXIgbmFtZXMgICAgIChhbiBhcnJheSBvZiBzdHJpbmdzKS4gKi8KKyAgY2hhciAqKiBzY2F0dGVyaW5nIDsgICAgIC8qKjwgVGhlIHNjYXR0ZXJpbmcgbmFtZXMgKGFuIGFycmF5IG9mIHN0cmluZ3MpLiAqLworICBjaGFyICoqIGl0ZXJhdG9ycyA7ICAgICAgLyoqPCBUaGUgaXRlcmF0b3IgbmFtZXMgICAoYW4gYXJyYXkgb2Ygc3RyaW5ncykuICovCisgIGNoYXIgKiogcGFyYW1ldGVycyA7ICAgICAvKio8IFRoZSBwYXJhbWV0ZXIgbmFtZXMgIChhbiBhcnJheSBvZiBzdHJpbmdzKS4gKi8KKyAgaW50IHJlZmVyZW5jZXM7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHJlZmVyZW5jZXMgdG8gdGhpcyBzdHJ1Y3R1cmUuICovCit9IDsKK3R5cGVkZWYgc3RydWN0IGNsb29nbmFtZXMgQ2xvb2dOYW1lcyA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZSBkaXNwbGF5IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2xvb2dfbmFtZXNfcHJpbnRfc3RydWN0dXJlKEZJTEUgKiwgQ2xvb2dOYW1lcyAqLCBpbnQpIDsKK3ZvaWQgY2xvb2dfbmFtZXNfcHJpbnQoRklMRSAqLCBDbG9vZ05hbWVzICopIDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnkgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjbG9vZ19uYW1lc19mcmVlKENsb29nTmFtZXMgKikgOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGluZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyICoqIGNsb29nX25hbWVzX3JlYWRfc3RyaW5ncyhGSUxFICpmaWxlLCBpbnQgbmJfaXRlbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NpbmcgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDbG9vZ05hbWVzICogY2xvb2dfbmFtZXNfbWFsbG9jKHZvaWQpOworQ2xvb2dOYW1lcyAqIGNsb29nX25hbWVzX2NvcHkoQ2xvb2dOYW1lcyAqbmFtZXMpOworQ2xvb2dOYW1lcyAqIGNsb29nX25hbWVzX2FsbG9jKHZvaWQpOworY2hhciAqKiBjbG9vZ19uYW1lc19nZW5lcmF0ZV9pdGVtcyhpbnQsIGNoYXIgKiwgY2hhcikgOworQ2xvb2dOYW1lcyAqIGNsb29nX25hbWVzX2dlbmVyYXRlKGludCwgaW50LCBpbnQsIGludCwgY2hhciwgY2hhciwgY2hhciwgY2hhcikgOwordm9pZCBjbG9vZ19uYW1lc19zY2FsYXJpemUoQ2xvb2dOYW1lcyAqLCBpbnQsIGludCAqKSA7Citjb25zdCBjaGFyICogY2xvb2dfbmFtZXNfbmFtZV9hdF9sZXZlbChDbG9vZ05hbWVzICpuYW1lcywgaW50IGxldmVsKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgIH0KKyNlbmRpZiAKKyNlbmRpZiAvKiBkZWZpbmUgX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvb3B0aW9ucy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9vcHRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkZDcwZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvb3B0aW9ucy5oCkBAIC0wLDAgKzEsMTY5IEBACisKKyAgIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMb29HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICBGaXJzdCB2ZXJzaW9uOiBhcHJpbCAxOXRoIDIwMDMgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIENMb29HIDogdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAoZXhwZXJpbWVudGFsKSAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBDZWRyaWMgQmFzdG91bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yICAgICAgICAgICAgICAqCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgICAgICAgICAgICAgICAqCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSAgICAgICAgICAqCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDTG9vRywgdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBXcml0dGVuIGJ5IENlZHJpYyBCYXN0b3VsLCBDZWRyaWMuQmFzdG91bEBpbnJpYS5mciAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmbmRlZiBDTE9PR19PUFRJT05TX0gKKyNkZWZpbmUgQ0xPT0dfT1BUSU9OU19ICisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgCisgIHsKKyNlbmRpZiAKKworCisvKiBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHlvdSB3YW50IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQKKyAqIG1heGltdW0gdG90YWwgYWxsb2NhdGVkIG1lbW9yeSBmb3IgY29kZSBnZW5lcmF0aW9uLgorI2RlZmluZSBDTE9PR19NRU1PUlkgCisgKi8KKyNkZWZpbmUgQ0xPT0dfU0NBTEFSUworCitzdHJ1Y3Qgb3NsX3Njb3A7CisKK3N0cnVjdCBjbG9vZ29wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ29wdGlvbnMgQ2xvb2dPcHRpb25zOworc3RydWN0IG9zbF9zY29wOworCitzdHJ1Y3QgY2xvb2dvcHRpb25zCit7CisgIENsb29nU3RhdGUgKnN0YXRlOyAvKiBTdGF0ZS4gKi8KKyAgLyogT1BUSU9OUyBGT1IgTE9PUCBHRU5FUkFUSU9OICovCisgIGludCBsIDsgICAgICAgICAgIC8qIExhc3QgbGV2ZWwgdG8gb3B0aW1pemUuICovCisgIGludCBmIDsgICAgICAgICAgIC8qIEZpcnN0IGxldmVsIHRvIG9wdGltaXplLiAqLworCisgIGludCAqbHM7ICAgICAgICAgLyogTGFzdCBsZXZlbCB0byBvcHRpbWl6ZSAoc3RhdGVtZW50LXdpc2UpLiAqLworICBpbnQgKmZzOyAgICAgICAgIC8qIEZpcnN0IGxldmVsIHRvIG9wdGltaXplIChzdGF0ZW1lbnQtd2lzZSkuICovCisgIGludCBmc19sc19zaXplOyAgLyogU2l6ZSBvZiB0aGUgZnMgYW5kIGxzIGFycmF5cyAoc2FtZSBzaXplKSAqLworICBpbnQgc3RvcCA7ICAgICAgICAvKiBMZXZlbCB0byBzdG9wIGNvZGUgZ2VuZXJhdGlvbi4gKi8KKyAgaW50IHN0cmlkZXMgOyAgICAgLyogMSBpZiB1c2VyIHdhbnRzIHRvIGhhbmRsZSBub24tdW5pdCBzdHJpZGVzICh0aGVuIGxvb3AKKyAgICAgICAgICAgICAgICAgICAgICogaW5jcmVtZW50IGNhbiBiZSBzb21ldGhpbmcgZWxzZSB0aGFuIG9uZSksIDAgb3RoZXJ3aXNlLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IHNoOwkgICAgLyogMSBmb3IgY29tcHV0aW5nIHNpbXBsZSBodWxscyAqLworICBpbnQgZmlyc3RfdW5yb2xsOyAvKiBUaGUgZmlyc3QgZGltZW5zaW9uIHRvIHVucm9sbCAqLworCisgIC8qIE9QVElPTlMgRk9SIFBSRVRUWSBQUklOVElORyAqLworICBpbnQgZXNwIDsgICAgICAgLyogMSBpZiB1c2VyIHdhbnRzIHRvIHNwcmVhZCBhbGwgZXF1YWxpdGllcywgaS5lLiB3aGVuIHRoZXJlCisgICAgICAgICAgICAgICAgICAgKiBpcyBzb21ldGhpbmcgbGlrZSAiaSA9IDMqaiArIDEgOyBBW2ldID0gMCA7IiB0aGUgZ2VuZXJhdG9yCisgICAgICAgICAgICAgICAgICAgKiB3aWxsIHdyaXRlICJBWzMqaiArIDFdID0gMCA7IiwgMCBvdGhlcndpc2UuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IGZzcCA7ICAgICAgIC8qIFRoZSBpdGVyYXRpb24gbGV2ZWwgd2hlcmUgZXF1YWxpdGllcyBzcHJlYWRpbmcgY2FuIGJlZ2luCisgICAgICAgICAgICAgICAgICAgKiAoaXQgbWlnaHQgaGFwcGVuIHRoYXQgdGhlIHVzZXIgd2FudHMgbm90IHRvIHNwcmVhZCB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAqIG9mIHNjYXR0ZXJpbmcgaXRlcmF0b3JzKS4KKyAgICAgICAgICAgICAgICAgICAqLworICBpbnQgb3RsIDsgICAgICAgLyogMSBmb3IgZWxpbWluYXRlIGxvb3BzIHJ1bm5pbmcganVzdCBvbmUgdGltZSBhbmQgd3JpdGUgdGhlbQorICAgICAgICAgICAgICAgICAgICogYXMgYW4gYWZmZWN0YXRpb24gb2YgdGhlIGl0ZXJhdG9yLCAwIG90aGVyd2lzZS4KKyAgICAgICAgICAgICAgICAgICAqLworICBpbnQgYmxvY2sgOyAgICAgLyogMSB0byBtYWtlIG9uZSBuZXcgYmxvY2sgey4uLn0gcGVyIG5ldyBkaW1lbnNpb24sCisgICAgICAgICAgICAgICAgICAgKiAwIG90aGVyd2lzZS4KKyAgICAgICAgICAgICAgICAgICAqLworICBpbnQgY29tcGlsYWJsZTsgLyogMSB0byBnZW5lcmF0ZSBhIGNvbXBpbGFibGUgY29kZSBieSB1c2luZworICAgICAgICAgICAgICAgICAgICogcHJlcHJvY2Vzc2luZywgMCBvdGhlcndpc2UuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IGNhbGxhYmxlOyAgIC8qIDEgdG8gZ2VuZXJhdGUgY2FsbGFibGUgY29kZSBieSB1c2luZworICAgICAgICAgICAgICAgICAgICogcHJlcHJvY2Vzc2luZywgMCBvdGhlcndpc2UuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IGxhbmd1YWdlOyAgIC8qIDEgdG8gZ2VuZXJhdGUgRk9SVFJBTiwgMCBmb3IgQyBvdGhlcndpc2UuICovCisKKyAgaW50IHNhdmVfZG9tYWluczsvKiBTYXZlIHVuc2ltcGxpZmllZCBjb3B5IG9mIGRvbWFpbi4gKi8KKworICAvKiBNSVNDIE9QVElPTlMgKi8KKyAgY2hhciAqIG5hbWUgOyAgIC8qIE5hbWUgb2YgdGhlIGlucHV0IGZpbGUuICovCisgIGZsb2F0IHRpbWUgOyAgICAvKiBUaW1lIHNwZW50IGZvciBjb2RlIGdlbmVyYXRpb24gaW4gc2Vjb25kcy4gKi8KKyAgaW50IG9wZW5zY29wOyAgIC8qIDEgaWYgdGhlIGlucHV0IGZpbGUgaGFzIE9wZW5TY29wIGZvcm1hdCwgMCBvdGhlcndpc2UuICovCisgIHN0cnVjdCBvc2xfc2NvcCAqc2NvcDsgLyogSW5wdXQgT3BlblNjb3Agc2NvcCBpZiBhbnksIE5VTEwgb3RoZXJ3aXNlLiAqLworI2lmZGVmIENMT09HX01FTU9SWQorICBpbnQgbWVtb3J5IDsgICAgLyogTWVtb3J5IHNwZW50IGZvciBjb2RlIGdlbmVyYXRpb24gaW4ga2lsb2J5dGVzLiAqLworI2VuZGlmCisgIGludCBxdWlldDsgICAgICAvKiBEb24ndCBwcmludCBhbnkgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4gKi8KKyAgLyogVU5ET0NVTUVOVEVEIE9QVElPTlMgRk9SIFRIRSBBVVRIT1IgT05MWSAqLworICBpbnQgbGVha3MgOyAgICAgLyogMSBpZiBJIHdhbnQgdG8gcHJpbnQgdGhlIGFsbG9jYXRpb24gc3RhdGlzdGljcywKKyAgICAgICAgICAgICAgICAgICAqIDAgb3RoZXJ3aXNlLgorCQkgICAqLworICBpbnQgYmFja3RyYWNrOyAgLyogMSB0byBwZXJmb3JtIGJhY2t0cmFja2luZyBpbiAKKyAgICAgICAgICAgICAgICAgICAqIFF1aWxsZXJlJ3MgYWxnb3JpdGhtLCAwIG90aGVyd2lzZS4KKwkJICAgKi8KKyAgaW50IG92ZXJyaWRlIDsgIC8qIDEgaWYgSSB3YW50IHRvIGJ5cGFzcyBDTG9vRyBkZWNpc2lvbnMgb24gb3B0aW9uIGNvcnJlY3RuZXNzCisgICAgICAgICAgICAgICAgICAgKiAoZ2VuZXJhdGVkIGNvZGUgbWF5IGJlIGluY29ycmVjdCksIDAgb3RoZXJ3aXNlLgorCQkgICAqLworICBpbnQgc3RydWN0dXJlIDsgLyogMSBpZiBJIHdhbnQgdG8gcHJpbnQgdGhlIENsb29nUHJvZ3JhbSBzdHJ1Y3R1cmUgYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgICAgICogcHJldHR5IHByaW50ZWQgY29kZSwgMCBvdGhlcndpc2UuCisJCSAgICovCisgIGludCBub2Jsb2NrcyA7ICAvKiAxIGlmIEkgZG9uJ3Qgd2FudCB0byBtYWtlIHN0YXRlbWVudCBibG9ja3MsIDAgb3RoZXJ3aXNlLiAqLworICBpbnQgbm9zY2FsYXJzIDsgLyogMSBpZiBJIGRvbid0IHdhbnQgdG8gdXNlIHNjYWxhciBkaW1lbnNpb25zLCAwIG90aGVyd2lzZS4gKi8KKyAgaW50IG5vc2ltcGxpZnk7IC8qIDEgaWYgSSBkb24ndCB3YW50IHRvIHNpbXBsaWZ5IHBvbHloZWRyYSwgMCBvdGhlcndpc2UuICovCit9IDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgcmVwb3J0aW5nIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitlbnVtIGNsb29nX21zZ190eXBlIHsgQ0xPT0dfRVJST1IsIENMT09HX1dBUk5JTkcsIENMT09HX0lORk8gfTsKKwordm9pZCBjbG9vZ19tc2coQ2xvb2dPcHRpb25zICpvcHRpb25zLCBlbnVtIGNsb29nX21zZ190eXBlIHR5cGUsCisJCWNvbnN0IGNoYXIgKm1zZywgLi4uKTsKK3ZvaWQgY2xvb2dfZGllKGNvbnN0IGNoYXIgKm1zZywgLi4uKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlIGRpc3BsYXkgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjbG9vZ19vcHRpb25zX3ByaW50KEZJTEUgKiwgQ2xvb2dPcHRpb25zICopIDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnkgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjbG9vZ19vcHRpb25zX2ZyZWUoQ2xvb2dPcHRpb25zICopIDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkaW5nIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjbG9vZ19vcHRpb25zX3JlYWQoQ2xvb2dTdGF0ZSAqc3RhdGUsIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJCUZJTEUgKippbnB1dCwgRklMRSAqKm91dHB1dCwgQ2xvb2dPcHRpb25zICoqb3B0aW9ucyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc2luZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0Nsb29nT3B0aW9ucyAqY2xvb2dfb3B0aW9uc19tYWxsb2MoQ2xvb2dTdGF0ZSAqc3RhdGUpOwordm9pZCBjbG9vZ19vcHRpb25zX2NvcHlfZnJvbV9vc2xfc2NvcChzdHJ1Y3Qgb3NsX3Njb3AgKiwgQ2xvb2dPcHRpb25zICopOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorICB9CisjZW5kaWYgCisjZW5kaWYgLyogZGVmaW5lIF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL3BwcmludC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9wcHJpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWUyYjVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9wcHJpbnQuaApAQCAtMCwwICsxLDY3IEBACisKKyAgIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xvb0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHByaW50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgIEZpcnN0IHZlcnNpb246IG9jdG9iZXIgMjZ0aCAyMDAxICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIENMb29HIDogdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAoZXhwZXJpbWVudGFsKSAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBDZWRyaWMgQmFzdG91bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yICAgICAgICAgICAgICAqCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgICAgICAgICAgICAgICAqCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSAgICAgICAgICAqCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDTG9vRywgdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBXcml0dGVuIGJ5IENlZHJpYyBCYXN0b3VsLCBDZWRyaWMuQmFzdG91bEBpbnJpYS5mciAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgQ0xPT0dfUFBSSU5UX0gKKyNkZWZpbmUgQ0xPT0dfUFBSSU5UX0gKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmIAorCisKKyMgZGVmaW5lIE1BWF9TVFJJTkdfVkFMIDMyCisjIGRlZmluZSBJTkRFTlRfU1RFUCAyCisKKyMgZGVmaW5lIEVRVFlQRV9OT05FCSAwCisjIGRlZmluZSBFUVRZUEVfQ09OU1RBTlQgMQorIyBkZWZpbmUgRVFUWVBFX1BVUkVJVEVNIDIKKyMgZGVmaW5lIEVRVFlQRV9FWEFGRklORSAzCisKKyNkZWZpbmUgQ0xPT0dfTEFOR1VBR0VfQyAwCisjZGVmaW5lIENMT09HX0xBTkdVQUdFX0ZPUlRSQU4gMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlIGRpc3BsYXkgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjbGFzdF9wcHJpbnQoRklMRSAqZm9vLCBzdHJ1Y3QgY2xhc3Rfc3RtdCAqcm9vdCwgaW50IGluZGVudCwgCisJICAgIENsb29nT3B0aW9ucyAqb3B0aW9ucyk7CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgIH0KKyNlbmRpZiAKKyNlbmRpZiAvKiBkZWZpbmUgX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvcHJvZ3JhbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9wcm9ncmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwZDIxZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvcHJvZ3JhbS5oCkBAIC0wLDAgKzEsMTE2IEBACisKKyAgIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xvb0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgIEZpcnN0IHZlcnNpb246IG9jdG9iZXIgMjV0aCAyMDAxICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIENMb29HIDogdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAoZXhwZXJpbWVudGFsKSAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBDZWRyaWMgQmFzdG91bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yICAgICAgICAgICAgICAqCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgICAgICAgICAgICAgICAqCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSAgICAgICAgICAqCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDTG9vRywgdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBXcml0dGVuIGJ5IENlZHJpYyBCYXN0b3VsLCBDZWRyaWMuQmFzdG91bEBpbnJpYS5mciAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgQ0xPT0dfUFJPR1JBTV9ICisjZGVmaW5lIENMT09HX1BST0dSQU1fSAorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIAorICB7CisjZW5kaWYgCisKKworIyBkZWZpbmUgTUFYX1NUUklORyAxMDI0CisjIGRlZmluZSBNRUdBIDEwMDAwMDAgIC8qIE9uZSBtaWxsaW9uLiAqLworCisKKy8qKgorICogQ2xvb2dQcm9ncmFtIHN0cnVjdHVyZToKKyAqIHRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb25zIG9mIGEgcHJvZ3JhbSBnZW5lcmF0ZWQgb3IgdG8gYmUKKyAqIGdlbmVyYXRlZC4KKyAqLworc3RydWN0IGNsb29ncHJvZ3JhbQoreyAvKiBCYXNpYyBwcm9ncmFtIGRlc2NyaXB0aW9uIGZpZWxkcy4gKi8KKyAgY2hhciBsYW5ndWFnZSA7ICAgICAgICAgICAgICAvKio8IFRoZSBsYW5ndWFnZSBvZiB0aGUgcHJvZ3JhbS4gKi8KKyAgaW50ICBuYl9zY2F0dGRpbXMgOyAgICAgICAgICAvKio8IFNjYXR0ZXJpbmcgZGltZW5zaW9uIG51bWJlci4gKi8KKyAgQ2xvb2dEb21haW4gICAgKiBjb250ZXh0IDsgICAvKio8IFRoZSBjb250ZXh0IG9mIHRoZSBwcm9ncmFtLiAqLworICBDbG9vZ0xvb3AgICAgICAqIGxvb3AgOyAgICAgIC8qKjwgVGhlIGxvb3BzIG9mIHRoZSBwcm9ncmFtLiAqLworICBDbG9vZ05hbWVzICAgICAqIG5hbWVzIDsgICAgIC8qKjwgSXRlcmF0b3JzIGFuZCBwYXJhbWV0ZXJzIG5hbWVzLiAqLworICBDbG9vZ0Jsb2NrTGlzdCAqIGJsb2NrbGlzdCA7IC8qKjwgVGhlIHN0YXRlbWVudCBibG9jayBsaXN0LiAqLworICAKKyAgLyogSW50ZXJuYWwgc2VydmljZSBmaWVsZHMsIGZpbGxlZCB1cCBieSBjbG9vZ19wcm9ncmFtX3NjYXR0ZXIgZnVuY3Rpb24uICovCisgIGludCAqIHNjYWxkaW1zIDsgICAgICAgICAgICAgLyoqPCBCb29sZWFuIGFycmF5IHNheWluZyB3aGV0aGVyIGEgZ2l2ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHNjYXR0ZXJpbmcgZGltZW5zaW9uIGlzIHNjYWxhciBvciBub3QuCisJCQkJKi8KKyAgLyogTGlicmFyeSB1c2VyIHJlc2VydmVkIGZpZWxkLiAqLworICB2b2lkICogdXNyOwkJICAgICAgIC8qKjwgVXNlciBmaWVsZCwgZm9yIGxpYnJhcnkgdXNlciBjb252ZW5pZW5jZS4KKwkJCSAgICAgICAgKiAgIFRoaXMgcG9pbnRlciBpcyBub3QgZnJlZWQgd2hlbiB0aGUKKwkJCSAgICAgICAgKiAgIENsb29nUHJvZ3JhbSBzdHJ1Y3R1cmUgaXMgZnJlZWQuCisJCQkgICAgICAgICovCit9IDsKK3R5cGVkZWYgc3RydWN0IGNsb29ncHJvZ3JhbSBDbG9vZ1Byb2dyYW0gOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmUgZGlzcGxheSBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNsb29nX3Byb2dyYW1fcHJpbnRfc3RydWN0dXJlKEZJTEUgKiwgQ2xvb2dQcm9ncmFtICosIGludCkgOwordm9pZCBjbG9vZ19wcm9ncmFtX3ByaW50KEZJTEUgKiwgQ2xvb2dQcm9ncmFtICopIDsKK3ZvaWQgY2xvb2dfcHJvZ3JhbV9wcHJpbnQoRklMRSAqLCBDbG9vZ1Byb2dyYW0gKiwgQ2xvb2dPcHRpb25zICopIDsKK3ZvaWQgY2xvb2dfcHJvZ3JhbV9kdW1wX2Nsb29nKEZJTEUgKiwgQ2xvb2dQcm9ncmFtICosIENsb29nU2NhdHRlcmluZ0xpc3QgKik7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5IGRlYWxsb2NhdGlvbiBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2xvb2dfcHJvZ3JhbV9mcmVlKENsb29nUHJvZ3JhbSAqKSA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGluZyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0Nsb29nUHJvZ3JhbSAqIGNsb29nX3Byb2dyYW1fcmVhZChGSUxFICosIENsb29nT3B0aW9ucyAqKSA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc2luZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0Nsb29nUHJvZ3JhbSAqIGNsb29nX3Byb2dyYW1fbWFsbG9jKHZvaWQpOworQ2xvb2dQcm9ncmFtICogY2xvb2dfcHJvZ3JhbV9hbGxvYyhDbG9vZ0RvbWFpbiAqY29udGV4dCwgQ2xvb2dVbmlvbkRvbWFpbiAqdWQsCisJQ2xvb2dPcHRpb25zICpvcHRpb25zKTsKK0Nsb29nUHJvZ3JhbSAqIGNsb29nX3Byb2dyYW1fZ2VuZXJhdGUoQ2xvb2dQcm9ncmFtICosIENsb29nT3B0aW9ucyAqKSA7Cit2b2lkIGNsb29nX3Byb2dyYW1fYmxvY2soQ2xvb2dQcm9ncmFtICpwcm9ncmFtLAorCUNsb29nU2NhdHRlcmluZ0xpc3QgKnNjYXR0ZXJpbmcsIENsb29nT3B0aW9ucyAqb3B0aW9ucyk7Cit2b2lkIGNsb29nX3Byb2dyYW1fZXh0cmFjdF9zY2FsYXJzKENsb29nUHJvZ3JhbSAqcHJvZ3JhbSwKKwlDbG9vZ1NjYXR0ZXJpbmdMaXN0ICpzY2F0dGVyaW5nLCBDbG9vZ09wdGlvbnMgKm9wdGlvbnMpOwordm9pZCBjbG9vZ19wcm9ncmFtX3NjYXR0ZXIoQ2xvb2dQcm9ncmFtICpwcm9ncmFtLAorCQkJQ2xvb2dTY2F0dGVyaW5nTGlzdCAqc2NhdHRlcmluZywgQ2xvb2dPcHRpb25zICpvcHRpb25zKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgIH0KKyNlbmRpZiAKKyNlbmRpZiAvKiBkZWZpbmUgX0ggKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9zdGF0ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9zdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzMyNzIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL3N0YXRlLmgKQEAgLTAsMCArMSw0NiBAQAorI2lmbmRlZiBDTE9PR19TVEFURV9ICisjZGVmaW5lIENMT09HX1NUQVRFX0gKKworc3RydWN0IGNsb29nYmFja2VuZDsKK3R5cGVkZWYgc3RydWN0IGNsb29nYmFja2VuZCBDbG9vZ0JhY2tlbmQ7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYgCisKK3N0cnVjdCBjbG9vZ3N0YXRlIHsKKyAgQ2xvb2dCYWNrZW5kICpiYWNrZW5kOworCisgIGNsb29nX2ludF90IHplcm87CisgIGNsb29nX2ludF90IG9uZTsKKyAgY2xvb2dfaW50X3QgbmVnb25lOworCisgIGludCBibG9ja19hbGxvY2F0ZWQ7CisgIGludCBibG9ja19mcmVlZDsKKyAgaW50IGJsb2NrX21heDsKKworICBpbnQgZG9tYWluX2FsbG9jYXRlZDsKKyAgaW50IGRvbWFpbl9mcmVlZDsKKyAgaW50IGRvbWFpbl9tYXg7CisKKyAgaW50IGxvb3BfYWxsb2NhdGVkOworICBpbnQgbG9vcF9mcmVlZDsKKyAgaW50IGxvb3BfbWF4OworCisgIGludCBzdGF0ZW1lbnRfYWxsb2NhdGVkOworICBpbnQgc3RhdGVtZW50X2ZyZWVkOworICBpbnQgc3RhdGVtZW50X21heDsKK307Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ3N0YXRlIENsb29nU3RhdGU7CisKK0Nsb29nU3RhdGUgKmNsb29nX2NvcmVfc3RhdGVfbWFsbG9jKHZvaWQpOworQ2xvb2dTdGF0ZSAqY2xvb2dfc3RhdGVfbWFsbG9jKHZvaWQpOworCit2b2lkIGNsb29nX2NvcmVfc3RhdGVfZnJlZShDbG9vZ1N0YXRlICpzdGF0ZSk7Cit2b2lkIGNsb29nX3N0YXRlX2ZyZWUoQ2xvb2dTdGF0ZSAqc3RhdGUpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZiAKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL3N0YXRlbWVudC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9zdGF0ZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmM1MDVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9zdGF0ZW1lbnQuaApAQCAtMCwwICsxLDg1IEBACisKKyAgIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xvb0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICBGaXJzdCB2ZXJzaW9uOiBub3ZlbWJlciA0dGggMjAwMSAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIENMb29HIDogdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAoZXhwZXJpbWVudGFsKSAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBDZWRyaWMgQmFzdG91bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yICAgICAgICAgICAgICAqCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgICAgICAgICAgICAgICAqCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSAgICAgICAgICAqCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDTG9vRywgdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBXcml0dGVuIGJ5IENlZHJpYyBCYXN0b3VsLCBDZWRyaWMuQmFzdG91bEBpbnJpYS5mciAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgQ0xPT0dfU1RBVEVNRU5UX0gKKyNkZWZpbmUgQ0xPT0dfU1RBVEVNRU5UX0gKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmIAorCisKK3N0cnVjdCBjbG9vZ3N0YXRlbWVudAoreworICBDbG9vZ1N0YXRlICpzdGF0ZTsgICAgICAgICAgICAgLyogU3RhdGUuICovCisgIGNoYXIgKm5hbWU7CQkJIC8qIE5hbWUgb2YgdGhlIHN0YXRlbWVudC4gKi8KKyAgaW50IG51bWJlcjsgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBzdGF0ZW1lbnQgdW5pcXVlIG51bWJlci4gKi8KKyAgdm9pZCAqIHVzciA7ICAgICAgICAgICAgICAgICAgIC8qIEEgcG9pbnRlciBmb3IgbGlicmFyeSB1c2VycyBjb252ZW5pZW5jZS4gKi8KKyAgc3RydWN0IGNsb29nc3RhdGVtZW50ICogbmV4dCA7IC8qIFBvaW50ZXIgdG8gdGhlIG5leHQgc3RhdGVtZW50IHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzYW1lIG9yaWdpbmFsIGRvbWFpbiBhbmQgdGhlIHNhbWUKKwkJCQkgICogc2NhdHRlcmluZyBmdW5jdGlvbi4KKwkJCQkgICovCit9IDsKK3R5cGVkZWYgc3RydWN0IGNsb29nc3RhdGVtZW50IENsb29nU3RhdGVtZW50IDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlIGRpc3BsYXkgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjbG9vZ19zdGF0ZW1lbnRfcHJpbnRfc3RydWN0dXJlKEZJTEUgKiwgQ2xvb2dTdGF0ZW1lbnQgKiwgaW50KSA7Cit2b2lkIGNsb29nX3N0YXRlbWVudF9wcmludChGSUxFICosIENsb29nU3RhdGVtZW50ICopIDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnkgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjbG9vZ19zdGF0ZW1lbnRfZnJlZShDbG9vZ1N0YXRlbWVudCAqKSA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc2luZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0Nsb29nU3RhdGVtZW50ICogY2xvb2dfc3RhdGVtZW50X21hbGxvYyhDbG9vZ1N0YXRlICpzdGF0ZSk7CitDbG9vZ1N0YXRlbWVudCAqIGNsb29nX3N0YXRlbWVudF9hbGxvYyhDbG9vZ1N0YXRlICpzdGF0ZSwgaW50KTsKK0Nsb29nU3RhdGVtZW50ICogY2xvb2dfc3RhdGVtZW50X2NvcHkoQ2xvb2dTdGF0ZW1lbnQgKikgOwordm9pZCBjbG9vZ19zdGF0ZW1lbnRfYWRkKENsb29nU3RhdGVtZW50KiosIENsb29nU3RhdGVtZW50KiosIENsb29nU3RhdGVtZW50KikgOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyAgfQorI2VuZGlmIAorI2VuZGlmIC8qIGRlZmluZSBfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL3N0cmlkZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9zdHJpZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTNkYzRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy9zdHJpZGUuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIENMT09HX1NUUklERV9ICisjZGVmaW5lIENMT09HX1NUUklERV9ICisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYgCisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgc3RyaWRlcy4KKyAqLworc3RydWN0IGNsb29nc3RyaWRlIHsKKyAgaW50IHJlZmVyZW5jZXM7CisgIGNsb29nX2ludF90IHN0cmlkZTsgICAgICAgICAvKio8IFRoZSBhY3R1YWwgc3RyaWRlLiAqLworICBjbG9vZ19pbnRfdCBvZmZzZXQ7ICAgICAgICAgLyoqPCBPZmZzZXQgb2Ygc3RyaWRlZCBsb29wLiAqLworICBjbG9vZ19pbnRfdCBmYWN0b3I7CisgIENsb29nQ29uc3RyYWludCAqY29uc3RyYWludDsKK307Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ3N0cmlkZSBDbG9vZ1N0cmlkZTsKKworQ2xvb2dTdHJpZGUgKmNsb29nX3N0cmlkZV9hbGxvYyhjbG9vZ19pbnRfdCBzdHJpZGUsIGNsb29nX2ludF90IG9mZnNldCk7CitDbG9vZ1N0cmlkZSAqY2xvb2dfc3RyaWRlX2FsbG9jX2Zyb21fY29uc3RyYWludChjbG9vZ19pbnRfdCBzdHJpZGUsCisJQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50LCBjbG9vZ19pbnRfdCBmYWN0b3IpOworQ2xvb2dTdHJpZGUgKmNsb29nX3N0cmlkZV9jb3B5KENsb29nU3RyaWRlICpzdHJpZGUpOwordm9pZCBjbG9vZ19zdHJpZGVfZnJlZShDbG9vZ1N0cmlkZSAqc3RyaWRlKTsKKworQ2xvb2dDb25zdHJhaW50ICpjbG9vZ19jb25zdHJhaW50X3N0cmlkZV9sb3dlcl9ib3VuZChDbG9vZ0NvbnN0cmFpbnQgKmMsCisJaW50IGxldmVsLCBDbG9vZ1N0cmlkZSAqc3RyaWRlKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYgCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy91bmlvbl9kb21haW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvdW5pb25fZG9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2ZmY4NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvY2xvb2cvdW5pb25fZG9tYWluLmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZiBDTE9PR19VTklPTl9ET01BSU5fSAorI2RlZmluZSBDTE9PR19VTklPTl9ET01BSU5fSAorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmIAorCitzdHJ1Y3Qgb3NsX3Njb3A7CisKKy8qKgorICogQ2xvb2dOYW1lZERvbWFpbkxpc3Qgc3RydWN0dXJlOgorICogdGhpcyBzdHJ1Y3R1cmUgcmVwcmVuc2VudHMgYSBub2RlIG9mIGEgbGlua2VkIGxpc3Qgb2YgQ2xvb2dEb21haW4gc3RydWN0dXJlcy4KKyAqLworc3RydWN0IGNsb29nbmFtZWRkb21haW5saXN0IHsKKyAgQ2xvb2dEb21haW4gKmRvbWFpbjsgICAgICAgICAgICAgIC8qKjwgQW4gZWxlbWVudCBvZiB0aGUgbGlzdC4gKi8KKyAgQ2xvb2dTY2F0dGVyaW5nICpzY2F0dGVyaW5nOyAgICAgIC8qKjwgU2NhdHRlcmluZyBmdW5jdGlvbiBmb3IgZG9tYWluLiAqLworICBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoZSBkb21haW4uICovCisgIHZvaWQgKnVzcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEEgcG9pbnRlciBmb3IgbGlicmFyeSB1c2VyJ3MgY29udmVuaWVuY2UuICovCisgIHN0cnVjdCBjbG9vZ25hbWVkZG9tYWlubGlzdCAqbmV4dDsvKio8IFBvaW50ZXIgdG8gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdC4qLworfTsKK3R5cGVkZWYgc3RydWN0IGNsb29nbmFtZWRkb21haW5saXN0IENsb29nTmFtZWREb21haW5MaXN0OworCisvKioKKyAqIEEgc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgaW5wdXQgZG9tYWlucyBhbmQgc2NhdHRlcmluZyBmdW5jdGlvbnMuCisgKi8KK3N0cnVjdCBjbG9vZ3VuaW9uZG9tYWluIHsKKwlpbnQgbl9uYW1lWzNdOworCWNoYXIgKipuYW1lWzNdOworCUNsb29nTmFtZWREb21haW5MaXN0ICpkb21haW47CisJQ2xvb2dOYW1lZERvbWFpbkxpc3QgKipuZXh0X2RvbWFpbjsKK307Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ3VuaW9uZG9tYWluIENsb29nVW5pb25Eb21haW47CisKK2VudW0gY2xvb2dfZGltX3R5cGUgeyBDTE9PR19QQVJBTSwgQ0xPT0dfSVRFUiwgQ0xPT0dfU0NBVCB9OworCitDbG9vZ1VuaW9uRG9tYWluICpjbG9vZ191bmlvbl9kb21haW5fcmVhZChGSUxFICpmaWxlLCBpbnQgbmJfcGFyLAorCUNsb29nT3B0aW9ucyAqb3B0aW9ucyk7CitDbG9vZ1VuaW9uRG9tYWluICpjbG9vZ191bmlvbl9kb21haW5fYWxsb2MoaW50IG5iX3Bhcik7CitDbG9vZ1VuaW9uRG9tYWluICpjbG9vZ191bmlvbl9kb21haW5fYWRkX2RvbWFpbihDbG9vZ1VuaW9uRG9tYWluICp1ZCwKKwljb25zdCBjaGFyICpuYW1lLCBDbG9vZ0RvbWFpbiAqZG9tYWluLCBDbG9vZ1NjYXR0ZXJpbmcgKnNjYXR0ZXJpbmcsCisJdm9pZCAqdXNyKTsKK0Nsb29nVW5pb25Eb21haW4gKmNsb29nX3VuaW9uX2RvbWFpbl9zZXRfbmFtZShDbG9vZ1VuaW9uRG9tYWluICp1ZCwKKwllbnVtIGNsb29nX2RpbV90eXBlIHR5cGUsIGludCBpbmRleCwgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGNsb29nX3VuaW9uX2RvbWFpbl9mcmVlKENsb29nVW5pb25Eb21haW4gKnVkKTsKK0Nsb29nVW5pb25Eb21haW4gKmNsb29nX3VuaW9uX2RvbWFpbl9mcm9tX29zbF9zY29wKENsb29nU3RhdGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvc2xfc2NvcCAqKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYgCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy92ZXJzaW9uLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2Nsb29nL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjQzNTZjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9jbG9vZy92ZXJzaW9uLmgKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICBDTG9vRyA6IHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgKGV4cGVyaW1lbnRhbCkgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgQ2VkcmljIEJhc3RvdWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAgICAgICAgICAgICAgKgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgICAgICAgKgorICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyICAgICAgICAgICAgICAgKgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgICAgICAgICAgKgorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgKgorICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ0xvb0csIHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogV3JpdHRlbiBieSBDZWRyaWMgQmFzdG91bCwgQ2VkcmljLkJhc3RvdWxAaW5yaWEuZnIgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIENMT09HX1ZFUlNJT05fSAorI2RlZmluZSBDTE9PR19WRVJTSU9OX0gKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmIAorCisjZGVmaW5lIENMT09HX1ZFUlNJT05fTUFKT1IgMAorI2RlZmluZSBDTE9PR19WRVJTSU9OX01JTk9SIDE4CisjZGVmaW5lIENMT09HX1ZFUlNJT05fUkVWSVNJT04gMAorCitjb25zdCBjaGFyICpjbG9vZ192ZXJzaW9uKHZvaWQpOworCitpbnQgY2xvb2dfdmVyc2lvbl9tYWpvcih2b2lkKTsKKworaW50IGNsb29nX3ZlcnNpb25fbWlub3Iodm9pZCk7CisKK2ludCBjbG9vZ192ZXJzaW9uX3JldmlzaW9uKHZvaWQpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyAgfQorI2VuZGlmIAorI2VuZGlmIC8qIGRlZmluZSBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9nbXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvZ21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3M2MxNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvZ21wLmgKQEAgLTAsMCArMSwyMjc5IEBACisvKiBEZWZpbml0aW9ucyBmb3IgR05VIG11bHRpcGxlIHByZWNpc2lvbiBmdW5jdGlvbnMuICAgLSotIG1vZGU6IGMgLSotCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLAorMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCitJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK29wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpZm5kZWYgX19HTVBfSF9fCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyNpbmNsdWRlIDxpb3Nmd2Q+ICAgLyogZm9yIHN0ZDo6aXN0cmVhbSwgc3RkOjpvc3RyZWFtLCBzdGQ6OnN0cmluZyAqLworI2luY2x1ZGUgPGNzdGRpbz4KKyNlbmRpZgorCisKKy8qIEluc3RhbnRpYXRlZCBieSBjb25maWd1cmUuICovCisjaWYgISBkZWZpbmVkIChfX0dNUF9XSVRISU5fQ09ORklHVVJFKQorI2RlZmluZSBfX0dNUF9IQVZFX0hPU1RfQ1BVX0ZBTUlMWV9wb3dlciAgIDAKKyNkZWZpbmUgX19HTVBfSEFWRV9IT1NUX0NQVV9GQU1JTFlfcG93ZXJwYyAwCisjZGVmaW5lIEdNUF9MSU1CX0JJVFMgICAgICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgR01QX05BSUxfQklUUyAgICAgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKyNkZWZpbmUgR01QX05VTUJfQklUUyAgICAgKEdNUF9MSU1CX0JJVFMgLSBHTVBfTkFJTF9CSVRTKQorI2RlZmluZSBHTVBfTlVNQl9NQVNLICAgICAoKH4gX19HTVBfQ0FTVCAobXBfbGltYl90LCAwKSkgPj4gR01QX05BSUxfQklUUykKKyNkZWZpbmUgR01QX05VTUJfTUFYICAgICAgR01QX05VTUJfTUFTSworI2RlZmluZSBHTVBfTkFJTF9NQVNLICAgICAofiBHTVBfTlVNQl9NQVNLKQorCisKKy8qIFRoZSBmb2xsb3dpbmcgKGV2ZXJ5dGhpbmcgdW5kZXIgaWZuZGVmIF9fR05VX01QX18pIG11c3QgYmUgaWRlbnRpY2FsIGluCisgICBnbXAuaCBhbmQgbXAuaCB0byBhbGxvdyBib3RoIHRvIGJlIGluY2x1ZGVkIGluIGFuIGFwcGxpY2F0aW9uIG9yIGR1cmluZworICAgdGhlIGxpYnJhcnkgYnVpbGQuICAqLworI2lmbmRlZiBfX0dOVV9NUF9fCisjZGVmaW5lIF9fR05VX01QX18gNQorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QgIC8qIHRlbGwgZ2NjIHN0ZGRlZi5oIHdlIG9ubHkgd2FudCBzaXplX3QgKi8KKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyNpbmNsdWRlIDxjc3RkZGVmPiAgICAgLyogZm9yIHNpemVfdCAqLworI2Vsc2UKKyNpbmNsdWRlIDxzdGRkZWYuaD4gICAgLyogZm9yIHNpemVfdCAqLworI2VuZGlmCisjdW5kZWYgX19uZWVkX3NpemVfdAorCisvKiBJbnN0YW50aWF0ZWQgYnkgY29uZmlndXJlLiAqLworI2lmICEgZGVmaW5lZCAoX19HTVBfV0lUSElOX0NPTkZJR1VSRSkKKy8qICN1bmRlZiBfTE9OR19MT05HX0xJTUIgKi8KKyNkZWZpbmUgX19HTVBfTElCR01QX0RMTCAgMAorI2VuZGlmCisKKworLyogX19TVERDX18gLSBzb21lIEFOU0kgY29tcGlsZXJzIGRlZmluZSB0aGlzIG9ubHkgdG8gMCwgaGVuY2UgdGhlIHVzZSBvZgorICAgICAgICJkZWZpbmVkIiBhbmQgbm90ICJfX1NURENfXy0wIi4gIEluIHBhcnRpY3VsYXIgU3VuIHdvcmtzaG9wIEMgNS4wCisgICAgICAgc2V0cyBfX1NURENfXyB0byAwLCBidXQgcmVxdWlyZXMgIiMjIiBmb3IgdG9rZW4gcGFzdGluZy4KKworICAgX0FJWCAtIGdudSBhbnNpZGVjbC5oIGFzc2VydHMgdGhhdCBhbGwga25vd24gQUlYIGNvbXBpbGVycyBhcmUgQU5TSSBidXQKKyAgICAgICBkb24ndCBhbHdheXMgZGVmaW5lIF9fU1REQ19fLgorCisgICBfX0RFQ0MgLSBjdXJyZW50IHZlcnNpb25zIG9mIERFQyBDICg1LjkgZm9yIGluc3RhbmNlKSBmb3IgYWxwaGEgYXJlIEFOU0ksCisgICAgICAgYnV0IGRvbid0IGRlZmluZSBfX1NURENfXyBpbiB0aGVpciBkZWZhdWx0IG1vZGUuICBEb24ndCBrbm93IGlmIG9sZAorICAgICAgIHZlcnNpb25zIG1pZ2h0IGhhdmUgYmVlbiBLJlIsIGJ1dCBsZXQncyBub3Qgd29ycnkgYWJvdXQgdGhhdCB1bmxlc3MKKyAgICAgICBzb21lb25lIGlzIHN0aWxsIHVzaW5nIG9uZS4KKworICAgX21pcHMgLSBnbnUgYW5zaWRlY2wuaCBzYXlzIHRoZSBSSVNDL09TIE1JUFMgY29tcGlsZXIgaXMgQU5TSSBpbiBTVlI0CisgICAgICAgbW9kZSwgYnV0IGRvZXNuJ3QgZGVmaW5lIF9fU1REQ19fLgorCisgICBfTVNDX1ZFUiAtIE1pY3Jvc29mdCBDIGlzIEFOU0ksIGJ1dCBfX1NURENfXyBpcyB1bmRlZmluZWQgdW5sZXNzIHRoZSAvWmEKKyAgICAgICBvcHRpb24gaXMgZ2l2ZW4gKGluIHdoaWNoIGNhc2UgaXQncyAxKS4KKworICAgX1dJTjMyIC0gdGVzdGVkIGZvciBieSBnbnUgYW5zaWRlY2wuaCwgbm8gZG91YnQgb24gdGhlIGFzc3VtcHRpb24gdGhhdAorICAgICAgYWxsIHczMiBjb21waWxlcnMgYXJlIGFuc2kuCisKKyAgIE5vdGU6IFRoaXMgc2FtZSBzZXQgb2YgdGVzdHMgaXMgdXNlZCBieSBnZW4tcHNxci5jIGFuZAorICAgZGVtb3MvZXhwci9leHByLWltcGwuaCwgc28gaWYgYW55dGhpbmcgbmVlZHMgYWRkaW5nLCB0aGVuIGJlIHN1cmUgdG8KKyAgIHVwZGF0ZSB0aG9zZSB0b28uICAqLworCisjaWYgIGRlZmluZWQgKF9fU1REQ19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfQUlYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9fREVDQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfHwgKGRlZmluZWQgKF9fbWlwcykgJiYgZGVmaW5lZCAoX1NZU1RZUEVfU1ZSNCkpICAgICAgXAorICB8fCBkZWZpbmVkIChfTVNDX1ZFUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9XSU4zMikKKyNkZWZpbmUgX19HTVBfSEFWRV9DT05TVCAgICAgICAgMQorI2RlZmluZSBfX0dNUF9IQVZFX1BST1RPVFlQRVMgICAxCisjZGVmaW5lIF9fR01QX0hBVkVfVE9LRU5fUEFTVEUgIDEKKyNlbHNlCisjZGVmaW5lIF9fR01QX0hBVkVfQ09OU1QgICAgICAgIDAKKyNkZWZpbmUgX19HTVBfSEFWRV9QUk9UT1RZUEVTICAgMAorI2RlZmluZSBfX0dNUF9IQVZFX1RPS0VOX1BBU1RFICAwCisjZW5kaWYKKworCisjaWYgX19HTVBfSEFWRV9DT05TVAorI2RlZmluZSBfX2dtcF9jb25zdCAgIGNvbnN0CisjZGVmaW5lIF9fZ21wX3NpZ25lZCAgc2lnbmVkCisjZWxzZQorI2RlZmluZSBfX2dtcF9jb25zdAorI2RlZmluZSBfX2dtcF9zaWduZWQKKyNlbmRpZgorCisKKy8qIF9fR01QX0RFQ0xTUEVDIHN1cHBvcnRzIFdpbmRvd3MgRExMIHZlcnNpb25zIG9mIGxpYmdtcCwgYW5kIGlzIGVtcHR5IGluCisgICBhbGwgb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworICAgV2hlbiBjb21waWxpbmcgb2JqZWN0cyBmb3IgbGliZ21wLCBfX0dNUF9ERUNMU1BFQyBpcyBhbiBleHBvcnQgZGlyZWN0aXZlLAorICAgb3Igd2hlbiBjb21waWxpbmcgZm9yIGFuIGFwcGxpY2F0aW9uIGl0J3MgYW4gaW1wb3J0IGRpcmVjdGl2ZS4gIFRoZSB0d28KKyAgIGNhc2VzIGFyZSBkaWZmZXJlbnRpYXRlZCBieSBfX0dNUF9XSVRISU5fR01QIGRlZmluZWQgYnkgdGhlIEdNUCBNYWtlZmlsZXMKKyAgIChhbmQgbm90IGRlZmluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbikuCisKKyAgIF9fR01QX0RFQ0xTUEVDX1hYIGlzIHNpbWlsYXJseSB1c2VkIGZvciBsaWJnbXB4eC4gIF9fR01QX1dJVEhJTl9HTVBYWAorICAgaW5kaWNhdGVzIHdoZW4gYnVpbGRpbmcgbGliZ21weHgsIGFuZCBpbiB0aGF0IGNhc2UgbGliZ21weHggZnVuY3Rpb25zIGFyZQorICAgZXhwb3J0cywgYnV0IGxpYmdtcCBmdW5jdGlvbnMgd2hpY2ggbWlnaHQgZ2V0IGNhbGxlZCBhcmUgaW1wb3J0cy4KKworICAgTGlidG9vbCBETExfRVhQT1JUIGRlZmluZSBpcyBub3QgdXNlZC4KKworICAgVGhlcmUncyBubyBhdHRlbXB0IHRvIHN1cHBvcnQgR01QIGJ1aWx0IGJvdGggc3RhdGljIGFuZCBETEwuICBEb2luZyBzbworICAgd291bGQgbWVhbiBhcHBsaWNhdGlvbnMgd291bGQgaGF2ZSB0byB0ZWxsIHVzIHdoaWNoIG9mIHRoZSB0d28gaXMgZ29pbmcKKyAgIHRvIGJlIHVzZWQgd2hlbiBsaW5raW5nLCBhbmQgdGhhdCBzZWVtcyB2ZXJ5IHRlZGlvdXMgYW5kIGVycm9yIHByb25lIGlmCisgICB1c2luZyBHTVAgYnkgaGFuZCwgYW5kIGVxdWFsbHkgdGVkaW91cyBmcm9tIGEgcGFja2FnZSBzaW5jZSBhdXRvY29uZiBhbmQKKyAgIGF1dG9tYWtlIGRvbid0IGdpdmUgbXVjaCBoZWxwLgorCisgICBfX0dNUF9ERUNMU1BFQyBpcyByZXF1aXJlZCBvbiBhbGwgZG9jdW1lbnRlZCBnbG9iYWwgZnVuY3Rpb25zIGFuZAorICAgdmFyaWFibGVzLCB0aGUgdmFyaW91cyBpbnRlcm5hbHMgaW4gZ21wLWltcGwuaCBldGMgY2FuIGJlIGxlZnQgdW5hZG9ybmVkLgorICAgQnV0IGludGVybmFscyB1c2VkIGJ5IHRoZSB0ZXN0IHByb2dyYW1zIG9yIHNwZWVkIG1lYXN1cmluZyBwcm9ncmFtcworICAgc2hvdWxkIGhhdmUgX19HTVBfREVDTFNQRUMsIGFuZCBjZXJ0YWlubHkgY29uc3RhbnRzIG9yIHZhcmlhYmxlcyBtdXN0CisgICBoYXZlIGl0IG9yIHRoZSB3cm9uZyBhZGRyZXNzIHdpbGwgYmUgcmVzb2x2ZWQuCisKKyAgIEluIGdjYyBfX2RlY2xzcGVjIGNhbiBnbyBhdCBlaXRoZXIgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIHByb3RvdHlwZS4KKworICAgSW4gTWljcm9zb2Z0IEMgX19kZWNsc3BlYyBtdXN0IGdvIGF0IHRoZSBzdGFydCwgb3IgYWZ0ZXIgdGhlIHR5cGUgbGlrZQorICAgdm9pZCBfX2RlY2xzcGVjKC4uLikgKmZvbygpIi4gIFRoZXJlJ3Mgbm8gX19kbGxleHBvcnQgb3IgYW55dGhpbmcgdG8KKyAgIGd1YXJkIGFnYWluc3Qgc29tZW9uZSBmb29saXNoICNkZWZpbmluZyBkbGxleHBvcnQuICBfZXhwb3J0IHVzZWQgdG8gYmUKKyAgIGF2YWlsYWJsZSwgYnV0IG5vIGxvbmdlci4KKworICAgSW4gQm9ybGFuZCBDIF9leHBvcnQgc3RpbGwgZXhpc3RzLCBidXQgbmVlZHMgdG8gZ28gYWZ0ZXIgdGhlIHR5cGUsIGxpa2UKKyAgICJ2b2lkIF9leHBvcnQgZm9vKCk7Ii4gIFdvdWxkIGhhdmUgdG8gY2hhbmdlIHRoZSBfX0dNUF9ERUNMU1BFQyBzeW50YXggdG8KKyAgIG1ha2UgdXNlIG9mIHRoYXQuICBQcm9iYWJseSBtb3JlIHRyb3VibGUgdGhhbiBpdCdzIHdvcnRoLiAgKi8KKworI2lmIGRlZmluZWQgKF9fR05VQ19fKQorI2RlZmluZSBfX0dNUF9ERUNMU1BFQ19FWFBPUlQgIF9fZGVjbHNwZWMoX19kbGxleHBvcnRfXykKKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfSU1QT1JUICBfX2RlY2xzcGVjKF9fZGxsaW1wb3J0X18pCisjZW5kaWYKKyNpZiBkZWZpbmVkIChfTVNDX1ZFUikgfHwgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorI2RlZmluZSBfX0dNUF9ERUNMU1BFQ19FWFBPUlQgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorI2RlZmluZSBfX0dNUF9ERUNMU1BFQ19JTVBPUlQgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorI2VuZGlmCisjaWZkZWYgX19XQVRDT01DX18KKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfRVhQT1JUICBfX2V4cG9ydAorI2RlZmluZSBfX0dNUF9ERUNMU1BFQ19JTVBPUlQgIF9faW1wb3J0CisjZW5kaWYKKyNpZmRlZiBfX0lCTUNfXworI2RlZmluZSBfX0dNUF9ERUNMU1BFQ19FWFBPUlQgIF9FeHBvcnQKKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfSU1QT1JUICBfSW1wb3J0CisjZW5kaWYKKworI2lmIF9fR01QX0xJQkdNUF9ETEwKKyNpZiBfX0dNUF9XSVRISU5fR01QCisvKiBjb21waWxpbmcgdG8gZ28gaW50byBhIERMTCBsaWJnbXAgKi8KKyNkZWZpbmUgX19HTVBfREVDTFNQRUMgIF9fR01QX0RFQ0xTUEVDX0VYUE9SVAorI2Vsc2UKKy8qIGNvbXBpbGluZyB0byBnbyBpbnRvIGFuIGFwcGxpY2F0aW9uIHdoaWNoIHdpbGwgbGluayB0byBhIERMTCBsaWJnbXAgKi8KKyNkZWZpbmUgX19HTVBfREVDTFNQRUMgIF9fR01QX0RFQ0xTUEVDX0lNUE9SVAorI2VuZGlmCisjZWxzZQorLyogYWxsIG90aGVyIGNhc2VzICovCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDCisjZW5kaWYKKworCisjaWZkZWYgX19HTVBfU0hPUlRfTElNQgordHlwZWRlZiB1bnNpZ25lZCBpbnQJCW1wX2xpbWJfdDsKK3R5cGVkZWYgaW50CQkJbXBfbGltYl9zaWduZWRfdDsKKyNlbHNlCisjaWZkZWYgX0xPTkdfTE9OR19MSU1CCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJbXBfbGltYl90OwordHlwZWRlZiBsb25nIGxvbmcgaW50CQltcF9saW1iX3NpZ25lZF90OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJbXBfbGltYl90OwordHlwZWRlZiBsb25nIGludAkJbXBfbGltYl9zaWduZWRfdDsKKyNlbmRpZgorI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CW1wX2JpdGNudF90OworCisvKiBGb3IgcmVmZXJlbmNlLCBub3RlIHRoYXQgdGhlIG5hbWUgX19tcHpfc3RydWN0IGdldHMgaW50byBDKysgbWFuZ2xlZAorICAgZnVuY3Rpb24gbmFtZXMsIHdoaWNoIG1lYW5zIGFsdGhvdWdoIHRoZSAiX18iIHN1Z2dlc3RzIGFuIGludGVybmFsLCB3ZQorICAgbXVzdCBsZWF2ZSB0aGlzIG5hbWUgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5LiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBfbXBfYWxsb2M7CQkvKiBOdW1iZXIgb2YgKmxpbWJzKiBhbGxvY2F0ZWQgYW5kIHBvaW50ZWQKKwkJCQkgICB0byBieSB0aGUgX21wX2QgZmllbGQuICAqLworICBpbnQgX21wX3NpemU7CQkJLyogYWJzKF9tcF9zaXplKSBpcyB0aGUgbnVtYmVyIG9mIGxpbWJzIHRoZQorCQkJCSAgIGxhc3QgZmllbGQgcG9pbnRzIHRvLiAgSWYgX21wX3NpemUgaXMKKwkJCQkgICBuZWdhdGl2ZSB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLiAgKi8KKyAgbXBfbGltYl90ICpfbXBfZDsJCS8qIFBvaW50ZXIgdG8gdGhlIGxpbWJzLiAgKi8KK30gX19tcHpfc3RydWN0OworCisjZW5kaWYgLyogX19HTlVfTVBfXyAqLworCisKK3R5cGVkZWYgX19tcHpfc3RydWN0IE1QX0lOVDsgICAgLyogZ21wIDEgc291cmNlIGNvbXBhdGliaWxpdHkgKi8KK3R5cGVkZWYgX19tcHpfc3RydWN0IG1wel90WzFdOworCit0eXBlZGVmIG1wX2xpbWJfdCAqCQltcF9wdHI7Cit0eXBlZGVmIF9fZ21wX2NvbnN0IG1wX2xpbWJfdCAqCW1wX3NyY3B0cjsKKyNpZiBkZWZpbmVkIChfQ1JBWSkgJiYgISBkZWZpbmVkIChfQ1JBWU1QUCkKKy8qIHBsYWluIGBpbnQnIGlzIG11Y2ggZmFzdGVyICg0OCBiaXRzKSAqLworI2RlZmluZSBfX0dNUF9NUF9TSVpFX1RfSU5UICAgICAxCit0eXBlZGVmIGludAkJCW1wX3NpemVfdDsKK3R5cGVkZWYgaW50CQkJbXBfZXhwX3Q7CisjZWxzZQorI2RlZmluZSBfX0dNUF9NUF9TSVpFX1RfSU5UICAgICAwCit0eXBlZGVmIGxvbmcgaW50CQltcF9zaXplX3Q7Cit0eXBlZGVmIGxvbmcgaW50CQltcF9leHBfdDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdAoreworICBfX21wel9zdHJ1Y3QgX21wX251bTsKKyAgX19tcHpfc3RydWN0IF9tcF9kZW47Cit9IF9fbXBxX3N0cnVjdDsKKwordHlwZWRlZiBfX21wcV9zdHJ1Y3QgTVBfUkFUOyAgICAvKiBnbXAgMSBzb3VyY2UgY29tcGF0aWJpbGl0eSAqLwordHlwZWRlZiBfX21wcV9zdHJ1Y3QgbXBxX3RbMV07CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBfbXBfcHJlYzsJCQkvKiBNYXggcHJlY2lzaW9uLCBpbiBudW1iZXIgb2YgYG1wX2xpbWJfdCdzLgorCQkJCSAgIFNldCBieSBtcGZfaW5pdCBhbmQgbW9kaWZpZWQgYnkKKwkJCQkgICBtcGZfc2V0X3ByZWMuICBUaGUgYXJlYSBwb2ludGVkIHRvIGJ5IHRoZQorCQkJCSAgIF9tcF9kIGZpZWxkIGNvbnRhaW5zIGBwcmVjJyArIDEgbGltYnMuICAqLworICBpbnQgX21wX3NpemU7CQkJLyogYWJzKF9tcF9zaXplKSBpcyB0aGUgbnVtYmVyIG9mIGxpbWJzIHRoZQorCQkJCSAgIGxhc3QgZmllbGQgcG9pbnRzIHRvLiAgSWYgX21wX3NpemUgaXMKKwkJCQkgICBuZWdhdGl2ZSB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLiAgKi8KKyAgbXBfZXhwX3QgX21wX2V4cDsJCS8qIEV4cG9uZW50LCBpbiB0aGUgYmFzZSBvZiBgbXBfbGltYl90Jy4gICovCisgIG1wX2xpbWJfdCAqX21wX2Q7CQkvKiBQb2ludGVyIHRvIHRoZSBsaW1icy4gICovCit9IF9fbXBmX3N0cnVjdDsKKworLyogdHlwZWRlZiBfX21wZl9zdHJ1Y3QgTVBfRkxPQVQ7ICovCit0eXBlZGVmIF9fbXBmX3N0cnVjdCBtcGZfdFsxXTsKKworLyogQXZhaWxhYmxlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBhbGdvcml0aG1zLiAgKi8KK3R5cGVkZWYgZW51bQoreworICBHTVBfUkFORF9BTEdfREVGQVVMVCA9IDAsCisgIEdNUF9SQU5EX0FMR19MQyA9IEdNUF9SQU5EX0FMR19ERUZBVUxUIC8qIExpbmVhciBjb25ncnVlbnRpYWwuICAqLworfSBnbXBfcmFuZGFsZ190OworCisvKiBSYW5kb20gc3RhdGUgc3RydWN0LiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIG1wel90IF9tcF9zZWVkOwkgIC8qIF9tcF9kIG1lbWJlciBwb2ludHMgdG8gc3RhdGUgb2YgdGhlIGdlbmVyYXRvci4gKi8KKyAgZ21wX3JhbmRhbGdfdCBfbXBfYWxnOyAgLyogQ3VycmVudGx5IHVudXNlZC4gKi8KKyAgdW5pb24geworICAgIHZvaWQgKl9tcF9sYzsgICAgICAgICAvKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHBvaW50ZXJzIHN0cnVjdHVyZS4gICovCisgIH0gX21wX2FsZ2RhdGE7Cit9IF9fZ21wX3JhbmRzdGF0ZV9zdHJ1Y3Q7Cit0eXBlZGVmIF9fZ21wX3JhbmRzdGF0ZV9zdHJ1Y3QgZ21wX3JhbmRzdGF0ZV90WzFdOworCisvKiBUeXBlcyBmb3IgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGluIGdtcCBmaWxlcy4gICovCisvKiA/Pz8gU2hvdWxkIG5vdCBwb2xsdXRlIHVzZXIgbmFtZSBzcGFjZSB3aXRoIHRoZXNlID8/PyAqLwordHlwZWRlZiBfX2dtcF9jb25zdCBfX21wel9zdHJ1Y3QgKm1wel9zcmNwdHI7Cit0eXBlZGVmIF9fbXB6X3N0cnVjdCAqbXB6X3B0cjsKK3R5cGVkZWYgX19nbXBfY29uc3QgX19tcGZfc3RydWN0ICptcGZfc3JjcHRyOwordHlwZWRlZiBfX21wZl9zdHJ1Y3QgKm1wZl9wdHI7Cit0eXBlZGVmIF9fZ21wX2NvbnN0IF9fbXBxX3N0cnVjdCAqbXBxX3NyY3B0cjsKK3R5cGVkZWYgX19tcHFfc3RydWN0ICptcHFfcHRyOworCisKKy8qIFRoaXMgaXMgbm90IHdhbnRlZCBpbiBtcC5oLCBzbyBwdXQgaXQgb3V0c2lkZSB0aGUgX19HTlVfTVBfXyBjb21tb24KKyAgIHNlY3Rpb24uICovCisjaWYgX19HTVBfTElCR01QX0RMTAorI2lmIF9fR01QX1dJVEhJTl9HTVBYWAorLyogY29tcGlsaW5nIHRvIGdvIGludG8gYSBETEwgbGliZ21weHggKi8KKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfWFggIF9fR01QX0RFQ0xTUEVDX0VYUE9SVAorI2Vsc2UKKy8qIGNvbXBpbGluZyB0byBnbyBpbnRvIGEgYXBwbGljYXRpb24gd2hpY2ggd2lsbCBsaW5rIHRvIGEgRExMIGxpYmdtcHh4ICovCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX1hYICBfX0dNUF9ERUNMU1BFQ19JTVBPUlQKKyNlbmRpZgorI2Vsc2UKKy8qIGFsbCBvdGhlciBjYXNlcyAqLworI2RlZmluZSBfX0dNUF9ERUNMU1BFQ19YWAorI2VuZGlmCisKKworI2lmIF9fR01QX0hBVkVfUFJPVE9UWVBFUworI2RlZmluZSBfX0dNUF9QUk9UTyh4KSB4CisjZWxzZQorI2RlZmluZSBfX0dNUF9QUk9UTyh4KSAoKQorI2VuZGlmCisKKyNpZm5kZWYgX19NUE4KKyNpZiBfX0dNUF9IQVZFX1RPS0VOX1BBU1RFCisjZGVmaW5lIF9fTVBOKHgpIF9fZ21wbl8jI3gKKyNlbHNlCisjZGVmaW5lIF9fTVBOKHgpIF9fZ21wbl8vKioveAorI2VuZGlmCisjZW5kaWYKKworLyogRm9yIHJlZmVyZW5jZSwgImRlZmluZWQoRU9GKSIgY2Fubm90IGJlIHVzZWQgaGVyZS4gIEluIGcrKyAyLjk1LjQsCisgICA8aW9zdHJlYW0+IGRlZmluZXMgRU9GIGJ1dCBub3QgRklMRS4gICovCisjaWYgZGVmaW5lZCAoRklMRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChIX1NURElPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX0hfU1RESU8pICAgICAgICAgICAgICAgLyogQUlYICovICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9TVERJT19IKSAgICAgICAgICAgICAgIC8qIGdsaWJjLCBTdW4sIFNDTyAqLyAgICAgXAorICB8fCBkZWZpbmVkIChfU1RESU9fSF8pICAgICAgICAgICAgICAvKiBCU0QsIE9TRiAqLyAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX19TVERJT19IKSAgICAgICAgICAgICAgLyogQm9ybGFuZCAqLyAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9fU1RESU9fSF9fKSAgICAgICAgICAgIC8qIElSSVggKi8gICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfU1RESU9fSU5DTFVERUQpICAgICAgICAvKiBIUFVYICovICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX19kal9pbmNsdWRlX3N0ZGlvX2hfKSAgLyogREpHUFAgKi8gICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9GSUxFX0RFRklORUQpICAgICAgICAgIC8qIE1pY3Jvc29mdCAqLyAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfX1NURElPX18pICAgICAgICAgICAgICAvKiBBcHBsZSBNUFcgTXJDICovICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX01TTF9TVERJT19IKSAgICAgICAgICAgLyogTWV0cm93ZXJrcyAqLyAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9TVERJT19IX0lOQ0xVREVEKSAgICAgIC8qIFFOWDQgKi8JCVwKKyAgfHwgZGVmaW5lZCAoX0lTT19TVERJT19JU09fSCkgICAgICAgLyogU3VuIEMrKyAqLwkJXAorICB8fCBkZWZpbmVkIChfX1NURElPX0xPQURFRCkgICAgICAgICAvKiBWTVMgKi8KKyNkZWZpbmUgX0dNUF9IX0hBVkVfRklMRSAxCisjZW5kaWYKKworLyogSW4gSVNPIEMsIGlmIGEgcHJvdG90eXBlIGludm9sdmluZyAic3RydWN0IG9ic3RhY2sgKiIgaXMgZ2l2ZW4gd2l0aG91dAorICAgdGhhdCBzdHJ1Y3R1cmUgZGVmaW5lZCwgdGhlbiB0aGUgc3RydWN0IGlzIHNjb3BlZCBkb3duIHRvIGp1c3QgdGhlCisgICBwcm90b3R5cGUsIGNhdXNpbmcgYSBjb25mbGljdCBpZiBpdCdzIHN1YnNlcXVlbnRseSBkZWZpbmVkIGZvciByZWFsLiAgU28KKyAgIG9ubHkgZ2l2ZSBwcm90b3R5cGVzIGlmIHdlJ3ZlIGdvdCBvYnN0YWNrLmguICAqLworI2lmIGRlZmluZWQgKF9PQlNUQUNLX0gpICAgLyogZ2xpYmMgPG9ic3RhY2suaD4gKi8KKyNkZWZpbmUgX0dNUF9IX0hBVkVfT0JTVEFDSyAxCisjZW5kaWYKKworLyogVGhlIHByb3RvdHlwZXMgZm9yIGdtcF92cHJpbnRmIGV0YyBhcmUgcHJvdmlkZWQgb25seSBpZiB2YV9saXN0IGlzCisgICBhdmFpbGFibGUsIHZpYSBhbiBhcHBsaWNhdGlvbiBoYXZpbmcgaW5jbHVkZWQgPHN0ZGFyZy5oPiBvciA8dmFyYXJncy5oPi4KKyAgIFVzdWFsbHkgdmFfbGlzdCBpcyBhIHR5cGVkZWYgc28gY2FuJ3QgYmUgdGVzdGVkIGRpcmVjdGx5LCBidXQgQzk5CisgICBzcGVjaWZpZXMgdGhhdCB2YV9zdGFydCBpcyBhIG1hY3JvIChhbmQgaXQgd2FzIG5vcm1hbGx5IGEgbWFjcm8gb24gcGFzdAorICAgc3lzdGVtcyB0b28pLCBzbyBsb29rIGZvciB0aGF0LgorCisgICA8c3RkaW8uaD4gd2lsbCBkZWZpbmUgc29tZSBzb3J0IG9mIHZhX2xpc3QgZm9yIHZwcmludGYgYW5kIHZmcHJpbnRmLCBidXQKKyAgIGxldCdzIG5vdCBib3RoZXIgdHJ5aW5nIHRvIHVzZSB0aGF0IHNpbmNlIGl0J3Mgbm90IHN0YW5kYXJkIGFuZCBzaW5jZQorICAgYXBwbGljYXRpb24gdXNlcyBmb3IgZ21wX3ZwcmludGYgZXRjIHdpbGwgYWxtb3N0IGNlcnRhaW5seSByZXF1aXJlIHRoZQorICAgd2hvbGUgPHN0ZGFyZy5oPiBvciA8dmFyYXJncy5oPiBhbnl3YXkuICAqLworCisjaWZkZWYgdmFfc3RhcnQKKyNkZWZpbmUgX0dNUF9IX0hBVkVfVkFfTElTVCAxCisjZW5kaWYKKworLyogVGVzdCBmb3IgZ2NjID49IG1hai5taW4sIGFzIHBlciBfX0dOVUNfUFJFUkVRIGluIGdsaWJjICovCisjaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIGRlZmluZWQgKF9fR05VQ19NSU5PUl9fKQorI2RlZmluZSBfX0dNUF9HTlVDX1BSRVJFUShtYWosIG1pbikgXAorICAoKF9fR05VQ19fIDw8IDE2KSArIF9fR05VQ19NSU5PUl9fID49ICgobWFqKSA8PCAxNikgKyAobWluKSkKKyNlbHNlCisjZGVmaW5lIF9fR01QX0dOVUNfUFJFUkVRKG1haiwgbWluKSAgMAorI2VuZGlmCisKKy8qICJwdXJlIiBpcyBpbiBnY2MgMi45NiBhbmQgdXAsIHNlZSAiKGdjYylGdW5jdGlvbiBBdHRyaWJ1dGVzIi4gIEJhc2ljYWxseQorICAgaXQgbWVhbnMgYSBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgYnV0IGV4YW1pbmUgaXRzIGFyZ3VtZW50cyBhbmQgbWVtb3J5CisgICAoZ2xvYmFsIG9yIHZpYSBhcmd1bWVudHMpIHRvIGdlbmVyYXRlIGEgcmV0dXJuIHZhbHVlLCBidXQgY2hhbmdlcyBub3RoaW5nCisgICBhbmQgaGFzIG5vIHNpZGUtZWZmZWN0cy4gIF9fR01QX05PX0FUVFJJQlVURV9DT05TVF9QVVJFIGxldHMKKyAgIHR1bmUvY29tbW9uLmMgZXRjIHR1cm4gdGhpcyBvZmYgd2hlbiB0cnlpbmcgdG8gd3JpdGUgdGltaW5nIGxvb3BzLiAgKi8KKyNpZiBfX0dNUF9HTlVDX1BSRVJFUSAoMiw5NikgJiYgISBkZWZpbmVkIChfX0dNUF9OT19BVFRSSUJVVEVfQ09OU1RfUFVSRSkKKyNkZWZpbmUgX19HTVBfQVRUUklCVVRFX1BVUkUgICBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorI2Vsc2UKKyNkZWZpbmUgX19HTVBfQVRUUklCVVRFX1BVUkUKKyNlbmRpZgorCisKKy8qIF9fR01QX0NBU1QgYWxsb3dzIHVzIHRvIHVzZSBzdGF0aWNfY2FzdCBpbiBDKyssIHNvIG91ciBtYWNyb3MgYXJlIGNsZWFuCisgICB0byAiZysrIC1Xb2xkLXN0eWxlLWNhc3QiLgorCisgICBDYXN0cyBpbiAiZXh0ZXJuIGlubGluZSIgY29kZSB3aXRoaW4gYW4gZXh0ZXJuICJDIiBibG9jayBkb24ndCBpbmR1Y2UKKyAgIHRoZXNlIHdhcm5pbmdzLCBzbyBfX0dNUF9DQVNUIG9ubHkgbmVlZHMgdG8gYmUgdXNlZCBvbiBkb2N1bWVudGVkCisgICBtYWNyb3MuICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgX19HTVBfQ0FTVCh0eXBlLCBleHByKSAgKHN0YXRpY19jYXN0PHR5cGU+IChleHByKSkKKyNlbHNlCisjZGVmaW5lIF9fR01QX0NBU1QodHlwZSwgZXhwcikgICgodHlwZSkgKGV4cHIpKQorI2VuZGlmCisKKworLyogQW4gZW1wdHkgInRocm93ICgpIiBtZWFucyB0aGUgZnVuY3Rpb24gZG9lc24ndCB0aHJvdyBhbnkgQysrIGV4Y2VwdGlvbnMsCisgICB0aGlzIGNhbiBzYXZlIHNvbWUgc3RhY2sgZnJhbWUgaW5mbyBpbiBhcHBsaWNhdGlvbnMuCisKKyAgIEN1cnJlbnRseSBpdCdzIGdpdmVuIG9ubHkgb24gZnVuY3Rpb25zIHdoaWNoIG5ldmVyIGRpdmlkZS1ieS16ZXJvIGV0YywKKyAgIGRvbid0IGFsbG9jYXRlIG1lbW9yeSwgYW5kIGFyZSBleHBlY3RlZCB0byBuZXZlciBuZWVkIHRvIGFsbG9jYXRlIG1lbW9yeS4KKyAgIFRoaXMgbGVhdmVzIG9wZW4gdGhlIHBvc3NpYmlsaXR5IG9mIGEgQysrIHRocm93IGZyb20gYSBmdXR1cmUgR01QCisgICBleGNlcHRpb25zIHNjaGVtZS4KKworICAgbXB6X3NldF91aSBldGMgYXJlIG9taXR0ZWQgdG8gbGVhdmUgb3BlbiB0aGUgbGF6eSBhbGxvY2F0aW9uIHNjaGVtZQorICAgZGVzY3JpYmVkIGluIGRvYy90YXNrcy5odG1sLiAgbXB6X2dldF9kIGV0YyBhcmUgb21pdHRlZCB0byBsZWF2ZSBvcGVuCisgICBleGNlcHRpb25zIGZvciBmbG9hdCBvdmVyZmxvd3MuCisKKyAgIE5vdGUgdGhhdCBfX0dNUF9OT1RIUk9XIG11c3QgYmUgZ2l2ZW4gb24gYW55IGlubGluZXMgdGhlIHNhbWUgYXMgb24gdGhlaXIKKyAgIHByb3RvdHlwZXMgKGZvciBnKysgYXQgbGVhc3QsIHdoZXJlIHRoZXkncmUgdXNlZCB0b2dldGhlcikuICBOb3RlIGFsc28KKyAgIHRoYXQgZysrIDMuMCBkZW1hbmRzIHRoYXQgX19HTVBfTk9USFJPVyBpcyBiZWZvcmUgb3RoZXIgYXR0cmlidXRlcyBsaWtlCisgICBfX0dNUF9BVFRSSUJVVEVfUFVSRS4gICovCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyNkZWZpbmUgX19HTVBfTk9USFJPVyAgdGhyb3cgKCkKKyNlbHNlCisjZGVmaW5lIF9fR01QX05PVEhST1cKKyNlbmRpZgorCisKKy8qIFBPUlRNRTogV2hhdCBvdGhlciBjb21waWxlcnMgaGF2ZSBhIHVzZWZ1bCAiZXh0ZXJuIGlubGluZSI/ICAic3RhdGljCisgICBpbmxpbmUiIHdvdWxkIGJlIGFuIGFjY2VwdGFibGUgc3Vic3RpdHV0ZSBpZiB0aGUgY29tcGlsZXIgKG9yIGxpbmtlcikKKyAgIGRpc2NhcmRzIHVudXNlZCBzdGF0aWNzLiAgKi8KKworIC8qIGdjYyBoYXMgX19pbmxpbmVfXyBpbiBhbGwgbW9kZXMsIGluY2x1ZGluZyBzdHJpY3QgYW5zaS4gIEdpdmUgYSBwcm90b3R5cGUKKyAgICBmb3IgYW4gaW5saW5lIHRvbywgc28gYXMgdG8gY29ycmVjdGx5IHNwZWNpZnkgImRsbGltcG9ydCIgb24gd2luZG93cywgaW4KKyAgICBjYXNlIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgcmF0aGVyIHRoYW4gaW5saW5lZC4KKyAgICBHQ0MgNC4zIGFuZCBhYm92ZSB3aXRoIC1zdGQ9Yzk5IG9yIC1zdGQ9Z251OTkgaW1wbGVtZW50cyBJU08gQzk5CisgICAgaW5saW5lIHNlbWFudGljcywgdW5sZXNzIC1mZ251ODktaW5saW5lIGlzIHVzZWQuICAqLworI2lmZGVmIF9fR05VQ19fCisjaWYgKGRlZmluZWQgX19HTlVDX1NURENfSU5MSU5FX18pIHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIpCisjZGVmaW5lIF9fR01QX0VYVEVSTl9JTkxJTkUgZXh0ZXJuIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fKSkKKyNlbHNlCisjZGVmaW5lIF9fR01QX0VYVEVSTl9JTkxJTkUgICAgICBleHRlcm4gX19pbmxpbmVfXworI2VuZGlmCisjZGVmaW5lIF9fR01QX0lOTElORV9QUk9UT1RZUEVTICAxCisjZW5kaWYKKworLyogREVDIEMgKGVnLiB2ZXJzaW9uIDUuOSkgc3VwcG9ydHMgInN0YXRpYyBfX2lubGluZSBmb28oKSIsIGV2ZW4gaW4gLXN0ZDEKKyAgIHN0cmljdCBBTlNJIG1vZGUuICBJbmxpbmluZyBpcyBkb25lIGV2ZW4gd2hlbiBub3Qgb3B0aW1pemluZyAoaWUuIC1PMAorICAgbW9kZSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQpLCBidXQgYW4gdW5uZWNlc3NhcnkgbG9jYWwgY29weSBvZiBmb28gaXMKKyAgIGVtaXR0ZWQgdW5sZXNzIC1PIGlzIHVzZWQuICAiZXh0ZXJuIF9faW5saW5lIiBpcyBhY2NlcHRlZCwgYnV0IHRoZQorICAgImV4dGVybiIgYXBwZWFycyB0byBiZSBpZ25vcmVkLCBpZS4gaXQgYmVjb21lcyBhIHBsYWluIGdsb2JhbCBmdW5jdGlvbgorICAgYnV0IHdoaWNoIGlzIGlubGluZWQgd2l0aGluIGl0cyBmaWxlLiAgRG9uJ3Qga25vdyBpZiBhbGwgb2xkIHZlcnNpb25zIG9mCisgICBERUMgQyBzdXBwb3J0ZWQgX19pbmxpbmUsIGJ1dCBhcyBhIHN0YXJ0IGxldCdzIGRvIHRoZSByaWdodCB0aGluZyBmb3IKKyAgIGN1cnJlbnQgdmVyc2lvbnMuICAqLworI2lmZGVmIF9fREVDQworI2RlZmluZSBfX0dNUF9FWFRFUk5fSU5MSU5FICBzdGF0aWMgX19pbmxpbmUKKyNlbmRpZgorCisvKiBTQ08gT3BlblVOSVggOCBjYyBzdXBwb3J0cyAic3RhdGljIGlubGluZSBmb28oKSIgYnV0IG5vdCBpbiAtWGMgc3RyaWN0CisgICBBTlNJIG1vZGUgKF9fU1REQ19fIGlzIDEgaW4gdGhhdCBtb2RlKS4gIElubGluaW5nIG9ubHkgYWN0dWFsbHkgdGFrZXMKKyAgIHBsYWNlIHVuZGVyIC1PLiAgV2l0aG91dCAtTyAiZm9vIiBzZWVtcyB0byBiZSBlbWl0dGVkIHdoZXRoZXIgaXQncyB1c2VkCisgICBvciBub3QsIHdoaWNoIGlzIHdhc3RlZnVsLiAgImV4dGVybiBpbmxpbmUgZm9vKCkiIGlzbid0IHVzZWZ1bCwgdGhlCisgICAiZXh0ZXJuIiBpcyBhcHBhcmVudGx5IGlnbm9yZWQsIHNvIGZvbyBpcyBpbmxpbmVkIGlmIHBvc3NpYmxlIGJ1dCBhbHNvCisgICBlbWl0dGVkIGFzIGEgZ2xvYmFsLCB3aGljaCBjYXVzZXMgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvcnMgd2hlbgorICAgYnVpbGRpbmcgYSBzaGFyZWQgbGliZ21wLiAgKi8KKyNpZmRlZiBfX1NDT19WRVJTSU9OX18KKyNpZiBfX1NDT19WRVJTSU9OX18gPiA0MDAwMDAwMDAgJiYgX19TVERDX18gIT0gMSBcCisgICYmICEgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkKKyNkZWZpbmUgX19HTVBfRVhURVJOX0lOTElORSAgc3RhdGljIGlubGluZQorI2VuZGlmCisjZW5kaWYKKworLyogTWljcm9zb2Z0J3MgQyBjb21waWxlciBhY2NlcHRzIF9faW5saW5lICovCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgX19HTVBfRVhURVJOX0lOTElORSAgX19pbmxpbmUKKyNlbmRpZgorCisvKiBSZWNlbnQgZW5vdWdoIFN1biBDIGNvbXBpbGVycyB3YW50ICJpbmxpbmUiICovCisjaWYgZGVmaW5lZCAoX19TVU5QUk9fQykgJiYgX19TVU5QUk9fQyA+PSAweDU2MCBcCisgICYmICEgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkKKyNkZWZpbmUgX19HTVBfRVhURVJOX0lOTElORSAgaW5saW5lCisjZW5kaWYKKworLyogU29tZXdoYXQgb2xkZXIgU3VuIEMgY29tcGlsZXJzIHdhbnQgInN0YXRpYyBpbmxpbmUiICovCisjaWYgZGVmaW5lZCAoX19TVU5QUk9fQykgJiYgX19TVU5QUk9fQyA+PSAweDU0MCBcCisgICYmICEgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkKKyNkZWZpbmUgX19HTVBfRVhURVJOX0lOTElORSAgc3RhdGljIGlubGluZQorI2VuZGlmCisKKworLyogQysrIGFsd2F5cyBoYXMgImlubGluZSIgYW5kIHNpbmNlIGl0J3MgYSBub3JtYWwgZmVhdHVyZSB0aGUgbGlua2VyIHNob3VsZAorICAgZGlzY2FyZCBkdXBsaWNhdGUgbm9uLWlubGluZWQgY29waWVzLCBvciBpZiBpdCBkb2Vzbid0IHRoZW4gdGhhdCdzIGEKKyAgIHByb2JsZW0gZm9yIGV2ZXJ5b25lLCBub3QganVzdCBHTVAuICAqLworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKSAmJiAhIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpCisjZGVmaW5lIF9fR01QX0VYVEVSTl9JTkxJTkUgIGlubGluZQorI2VuZGlmCisKKy8qIERvbid0IGRvIGFueSBpbmxpbmluZyB3aXRoaW4gYSBjb25maWd1cmUgcnVuLCBzaW5jZSBpZiB0aGUgY29tcGlsZXIgZW5kcworICAgdXAgZW1pdHRpbmcgY29waWVzIG9mIHRoZSBjb2RlIGludG8gdGhlIG9iamVjdCBmaWxlIGl0IGNhbiBlbmQgdXAKKyAgIGRlbWFuZGluZyB0aGUgdmFyaW91cyBzdXBwb3J0IHJvdXRpbmVzIChsaWtlIG1wbl9wb3Bjb3VudCkgZm9yIGxpbmtpbmcsCisgICBtYWtpbmcgdGhlICJhbGxvY2EiIHRlc3QgYW5kIHBlcmhhcHMgb3RoZXJzIGZhaWwuICBBbmQgb24gaHBwYSBpYTY0IGEKKyAgIHByZS1yZWxlYXNlIGdjYyAzLjIgd2FzIHNlZW4gbm90IHJlc3BlY3RpbmcgdGhlICJleHRlcm4iIGluICJleHRlcm4KKyAgIF9faW5saW5lX18iLCB0cmlnZ2VyaW5nIHRoaXMgcHJvYmxlbSB0b28uICAqLworI2lmIGRlZmluZWQgKF9fR01QX1dJVEhJTl9DT05GSUdVUkUpICYmICEgX19HTVBfV0lUSElOX0NPTkZJR1VSRV9JTkxJTkUKKyN1bmRlZiBfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKKworLyogQnkgZGVmYXVsdCwgZG9uJ3QgZ2l2ZSBhIHByb3RvdHlwZSB3aGVuIHRoZXJlJ3MgZ29pbmcgdG8gYmUgYW4gaW5saW5lCisgICB2ZXJzaW9uLiAgTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgQ3JheSBDKysgb2JqZWN0cyB0byB0aGUgY29tYmluYXRpb24gb2YKKyAgIHByb3RvdHlwZSBhbmQgaW5saW5lLiAgKi8KKyNpZmRlZiBfX0dNUF9FWFRFUk5fSU5MSU5FCisjaWZuZGVmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTCisjZGVmaW5lIF9fR01QX0lOTElORV9QUk9UT1RZUEVTICAwCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9fR01QX0lOTElORV9QUk9UT1RZUEVTICAxCisjZW5kaWYKKworCisjZGVmaW5lIF9fR01QX0FCUyh4KSAgICgoeCkgPj0gMCA/ICh4KSA6IC0oeCkpCisjZGVmaW5lIF9fR01QX01BWChoLGkpICgoaCkgPiAoaSkgPyAoaCkgOiAoaSkpCisKKy8qIF9fR01QX1VTSFJUX01BWCBpcyBub3QgIn4gKHVuc2lnbmVkIHNob3J0KSAwIiBiZWNhdXNlIHNob3J0IGlzIHByb21vdGVkCisgICB0byBpbnQgYnkgIn4iLiAgKi8KKyNkZWZpbmUgX19HTVBfVUlOVF9NQVggICAofiAodW5zaWduZWQpIDApCisjZGVmaW5lIF9fR01QX1VMT05HX01BWCAgKH4gKHVuc2lnbmVkIGxvbmcpIDApCisjZGVmaW5lIF9fR01QX1VTSFJUX01BWCAgKCh1bnNpZ25lZCBzaG9ydCkgfjApCisKKworLyogX19idWlsdGluX2V4cGVjdCBpcyBpbiBnY2MgMy4wLCBhbmQgbm90IGluIDIuOTUuICovCisjaWYgX19HTVBfR05VQ19QUkVSRVEgKDMsMCkKKyNkZWZpbmUgX19HTVBfTElLRUxZKGNvbmQpICAgIF9fYnVpbHRpbl9leHBlY3QgKChjb25kKSAhPSAwLCAxKQorI2RlZmluZSBfX0dNUF9VTkxJS0VMWShjb25kKSAgX19idWlsdGluX2V4cGVjdCAoKGNvbmQpICE9IDAsIDApCisjZWxzZQorI2RlZmluZSBfX0dNUF9MSUtFTFkoY29uZCkgICAgKGNvbmQpCisjZGVmaW5lIF9fR01QX1VOTElLRUxZKGNvbmQpICAoY29uZCkKKyNlbmRpZgorCisjaWZkZWYgX0NSQVkKKyNkZWZpbmUgX19HTVBfQ1JBWV9QcmFnbWEoc3RyKSAgX1ByYWdtYSAoc3RyKQorI2Vsc2UKKyNkZWZpbmUgX19HTVBfQ1JBWV9QcmFnbWEoc3RyKQorI2VuZGlmCisKKworLyogQWxsb3cgZGlyZWN0IHVzZXIgYWNjZXNzIHRvIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3Igb2YgYSBtcHFfdCBvYmplY3QuICAqLworI2RlZmluZSBtcHFfbnVtcmVmKFEpICgmKChRKS0+X21wX251bSkpCisjZGVmaW5lIG1wcV9kZW5yZWYoUSkgKCYoKFEpLT5fbXBfZGVuKSkKKworCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKK3VzaW5nIHN0ZDo6RklMRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wX3NldF9tZW1vcnlfZnVuY3Rpb25zIF9fZ21wX3NldF9tZW1vcnlfZnVuY3Rpb25zCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wX3NldF9tZW1vcnlfZnVuY3Rpb25zIF9fR01QX1BST1RPICgodm9pZCAqKCopIChzaXplX3QpLAorCQkJCSAgICAgIHZvaWQgKigqKSAodm9pZCAqLCBzaXplX3QsIHNpemVfdCksCisJCQkJICAgICAgdm9pZCAoKikgKHZvaWQgKiwgc2l6ZV90KSkpIF9fR01QX05PVEhST1c7CisKKyNkZWZpbmUgbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMgX19nbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMgX19HTVBfUFJPVE8gKCh2b2lkICooKiopIChzaXplX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICooKiopICh2b2lkICosIHNpemVfdCwgc2l6ZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKiopICh2b2lkICosIHNpemVfdCkpKSBfX0dNUF9OT1RIUk9XOworCisjZGVmaW5lIG1wX2JpdHNfcGVyX2xpbWIgX19nbXBfYml0c19wZXJfbGltYgorX19HTVBfREVDTFNQRUMgZXh0ZXJuIF9fZ21wX2NvbnN0IGludCBtcF9iaXRzX3Blcl9saW1iOworCisjZGVmaW5lIGdtcF9lcnJubyBfX2dtcF9lcnJubworX19HTVBfREVDTFNQRUMgZXh0ZXJuIGludCBnbXBfZXJybm87CisKKyNkZWZpbmUgZ21wX3ZlcnNpb24gX19nbXBfdmVyc2lvbgorX19HTVBfREVDTFNQRUMgZXh0ZXJuIF9fZ21wX2NvbnN0IGNoYXIgKiBfX2dtcF9jb25zdCBnbXBfdmVyc2lvbjsKKworCisvKioqKioqKioqKioqKioqKiBSYW5kb20gbnVtYmVyIHJvdXRpbmVzLiAgKioqKioqKioqKioqKioqKi8KKworLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgZ21wX3JhbmRpbml0IF9fZ21wX3JhbmRpbml0CitfX0dNUF9ERUNMU1BFQyB2b2lkIGdtcF9yYW5kaW5pdCBfX0dNUF9QUk9UTyAoKGdtcF9yYW5kc3RhdGVfdCwgZ21wX3JhbmRhbGdfdCwgLi4uKSk7CisKKyNkZWZpbmUgZ21wX3JhbmRpbml0X2RlZmF1bHQgX19nbXBfcmFuZGluaXRfZGVmYXVsdAorX19HTVBfREVDTFNQRUMgdm9pZCBnbXBfcmFuZGluaXRfZGVmYXVsdCBfX0dNUF9QUk9UTyAoKGdtcF9yYW5kc3RhdGVfdCkpOworCisjZGVmaW5lIGdtcF9yYW5kaW5pdF9sY18yZXhwIF9fZ21wX3JhbmRpbml0X2xjXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgZ21wX3JhbmRpbml0X2xjXzJleHAgX19HTVBfUFJPVE8gKChnbXBfcmFuZHN0YXRlX3QsCisJCQkJCQkgICAgICAgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsCisJCQkJCQkgICAgICAgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBnbXBfcmFuZGluaXRfbGNfMmV4cF9zaXplIF9fZ21wX3JhbmRpbml0X2xjXzJleHBfc2l6ZQorX19HTVBfREVDTFNQRUMgaW50IGdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUgX19HTVBfUFJPVE8gKChnbXBfcmFuZHN0YXRlX3QsIG1wX2JpdGNudF90KSk7CisKKyNkZWZpbmUgZ21wX3JhbmRpbml0X210IF9fZ21wX3JhbmRpbml0X210CitfX0dNUF9ERUNMU1BFQyB2b2lkIGdtcF9yYW5kaW5pdF9tdCBfX0dNUF9QUk9UTyAoKGdtcF9yYW5kc3RhdGVfdCkpOworCisjZGVmaW5lIGdtcF9yYW5kaW5pdF9zZXQgX19nbXBfcmFuZGluaXRfc2V0CitfX0dNUF9ERUNMU1BFQyB2b2lkIGdtcF9yYW5kaW5pdF9zZXQgX19HTVBfUFJPVE8gKChnbXBfcmFuZHN0YXRlX3QsIF9fZ21wX2NvbnN0IF9fZ21wX3JhbmRzdGF0ZV9zdHJ1Y3QgKikpOworCisjZGVmaW5lIGdtcF9yYW5kc2VlZCBfX2dtcF9yYW5kc2VlZAorX19HTVBfREVDTFNQRUMgdm9pZCBnbXBfcmFuZHNlZWQgX19HTVBfUFJPVE8gKChnbXBfcmFuZHN0YXRlX3QsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBnbXBfcmFuZHNlZWRfdWkgX19nbXBfcmFuZHNlZWRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgZ21wX3JhbmRzZWVkX3VpIF9fR01QX1BST1RPICgoZ21wX3JhbmRzdGF0ZV90LCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIGdtcF9yYW5kY2xlYXIgX19nbXBfcmFuZGNsZWFyCitfX0dNUF9ERUNMU1BFQyB2b2lkIGdtcF9yYW5kY2xlYXIgX19HTVBfUFJPVE8gKChnbXBfcmFuZHN0YXRlX3QpKTsKKworI2RlZmluZSBnbXBfdXJhbmRvbWJfdWkgX19nbXBfdXJhbmRvbWJfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgZ21wX3VyYW5kb21iX3VpIF9fR01QX1BST1RPICgoZ21wX3JhbmRzdGF0ZV90LCB1bnNpZ25lZCBsb25nKSk7CisKKyNkZWZpbmUgZ21wX3VyYW5kb21tX3VpIF9fZ21wX3VyYW5kb21tX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGdtcF91cmFuZG9tbV91aSBfX0dNUF9QUk9UTyAoKGdtcF9yYW5kc3RhdGVfdCwgdW5zaWduZWQgbG9uZykpOworCisKKy8qKioqKioqKioqKioqKioqIEZvcm1hdHRlZCBvdXRwdXQgcm91dGluZXMuICAqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGdtcF9hc3ByaW50ZiBfX2dtcF9hc3ByaW50ZgorX19HTVBfREVDTFNQRUMgaW50IGdtcF9hc3ByaW50ZiBfX0dNUF9QUk9UTyAoKGNoYXIgKiosIF9fZ21wX2NvbnN0IGNoYXIgKiwgLi4uKSk7CisKKyNkZWZpbmUgZ21wX2ZwcmludGYgX19nbXBfZnByaW50ZgorI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfZnByaW50ZiBfX0dNUF9QUk9UTyAoKEZJTEUgKiwgX19nbXBfY29uc3QgY2hhciAqLCAuLi4pKTsKKyNlbmRpZgorCisjZGVmaW5lIGdtcF9vYnN0YWNrX3ByaW50ZiBfX2dtcF9vYnN0YWNrX3ByaW50ZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX09CU1RBQ0spCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX29ic3RhY2tfcHJpbnRmIF9fR01QX1BST1RPICgoc3RydWN0IG9ic3RhY2sgKiwgX19nbXBfY29uc3QgY2hhciAqLCAuLi4pKTsKKyNlbmRpZgorCisjZGVmaW5lIGdtcF9vYnN0YWNrX3ZwcmludGYgX19nbXBfb2JzdGFja192cHJpbnRmCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfT0JTVEFDSykgJiYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfVkFfTElTVCkKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfb2JzdGFja192cHJpbnRmIF9fR01QX1BST1RPICgoc3RydWN0IG9ic3RhY2sgKiwgX19nbXBfY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CisjZW5kaWYKKworI2RlZmluZSBnbXBfcHJpbnRmIF9fZ21wX3ByaW50ZgorX19HTVBfREVDTFNQRUMgaW50IGdtcF9wcmludGYgX19HTVBfUFJPVE8gKChfX2dtcF9jb25zdCBjaGFyICosIC4uLikpOworCisjZGVmaW5lIGdtcF9zbnByaW50ZiBfX2dtcF9zbnByaW50ZgorX19HTVBfREVDTFNQRUMgaW50IGdtcF9zbnByaW50ZiBfX0dNUF9QUk9UTyAoKGNoYXIgKiwgc2l6ZV90LCBfX2dtcF9jb25zdCBjaGFyICosIC4uLikpOworCisjZGVmaW5lIGdtcF9zcHJpbnRmIF9fZ21wX3NwcmludGYKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfc3ByaW50ZiBfX0dNUF9QUk9UTyAoKGNoYXIgKiwgX19nbXBfY29uc3QgY2hhciAqLCAuLi4pKTsKKworI2RlZmluZSBnbXBfdmFzcHJpbnRmIF9fZ21wX3Zhc3ByaW50ZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3Zhc3ByaW50ZiBfX0dNUF9QUk9UTyAoKGNoYXIgKiosIF9fZ21wX2NvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX3ZmcHJpbnRmIF9fZ21wX3ZmcHJpbnRmCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfRklMRSkgJiYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfVkFfTElTVCkKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfdmZwcmludGYgX19HTVBfUFJPVE8gKChGSUxFICosIF9fZ21wX2NvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX3ZwcmludGYgX19nbXBfdnByaW50ZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3ZwcmludGYgX19HTVBfUFJPVE8gKChfX2dtcF9jb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKyNlbmRpZgorCisjZGVmaW5lIGdtcF92c25wcmludGYgX19nbXBfdnNucHJpbnRmCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfVkFfTElTVCkKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfdnNucHJpbnRmIF9fR01QX1BST1RPICgoY2hhciAqLCBzaXplX3QsIF9fZ21wX2NvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX3ZzcHJpbnRmIF9fZ21wX3ZzcHJpbnRmCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfVkFfTElTVCkKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfdnNwcmludGYgX19HTVBfUFJPVE8gKChjaGFyICosIF9fZ21wX2NvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKiogRm9ybWF0dGVkIGlucHV0IHJvdXRpbmVzLiAgKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBnbXBfZnNjYW5mIF9fZ21wX2ZzY2FuZgorI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfZnNjYW5mIF9fR01QX1BST1RPICgoRklMRSAqLCBfX2dtcF9jb25zdCBjaGFyICosIC4uLikpOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX3NjYW5mIF9fZ21wX3NjYW5mCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3NjYW5mIF9fR01QX1BST1RPICgoX19nbXBfY29uc3QgY2hhciAqLCAuLi4pKTsKKworI2RlZmluZSBnbXBfc3NjYW5mIF9fZ21wX3NzY2FuZgorX19HTVBfREVDTFNQRUMgaW50IGdtcF9zc2NhbmYgX19HTVBfUFJPVE8gKChfX2dtcF9jb25zdCBjaGFyICosIF9fZ21wX2NvbnN0IGNoYXIgKiwgLi4uKSk7CisKKyNkZWZpbmUgZ21wX3Zmc2NhbmYgX19nbXBfdmZzY2FuZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX0ZJTEUpICYmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3Zmc2NhbmYgX19HTVBfUFJPVE8gKChGSUxFICosIF9fZ21wX2NvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX3ZzY2FuZiBfX2dtcF92c2NhbmYKKyNpZiBkZWZpbmVkIChfR01QX0hfSEFWRV9WQV9MSVNUKQorX19HTVBfREVDTFNQRUMgaW50IGdtcF92c2NhbmYgX19HTVBfUFJPVE8gKChfX2dtcF9jb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKyNlbmRpZgorCisjZGVmaW5lIGdtcF92c3NjYW5mIF9fZ21wX3Zzc2NhbmYKKyNpZiBkZWZpbmVkIChfR01QX0hfSEFWRV9WQV9MSVNUKQorX19HTVBfREVDTFNQRUMgaW50IGdtcF92c3NjYW5mIF9fR01QX1BST1RPICgoX19nbXBfY29uc3QgY2hhciAqLCBfX2dtcF9jb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqIEludGVnZXIgKGkuZS4gWikgcm91dGluZXMuICAqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIF9tcHpfcmVhbGxvYyBfX2dtcHpfcmVhbGxvYworI2RlZmluZSBtcHpfcmVhbGxvYyBfX2dtcHpfcmVhbGxvYworX19HTVBfREVDTFNQRUMgdm9pZCAqX21wel9yZWFsbG9jIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXB6X2FicyBfX2dtcHpfYWJzCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2FicykKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2FicyBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9hZGQgX19nbXB6X2FkZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfYWRkIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9hZGRfdWkgX19nbXB6X2FkZF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfYWRkX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfYWRkbXVsIF9fZ21wel9hZGRtdWwKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2FkZG11bCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfYWRkbXVsX3VpIF9fZ21wel9hZGRtdWxfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2FkZG11bF91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2FuZCBfX2dtcHpfYW5kCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9hbmQgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2FycmF5X2luaXQgX19nbXB6X2FycmF5X2luaXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2FycmF5X2luaXQgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcF9zaXplX3QsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wel9iaW5fdWkgX19nbXB6X2Jpbl91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfYmluX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfYmluX3VpdWkgX19nbXB6X2Jpbl91aXVpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9iaW5fdWl1aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9jZGl2X3EgX19nbXB6X2NkaXZfcQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2Rpdl9xIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9jZGl2X3FfMmV4cCBfX2dtcHpfY2Rpdl9xXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2NkaXZfcV8yZXhwIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcHpfY2Rpdl9xX3VpIF9fZ21wel9jZGl2X3FfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9jZGl2X3FfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9jZGl2X3FyIF9fZ21wel9jZGl2X3FyCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9jZGl2X3FyIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9jZGl2X3FyX3VpIF9fZ21wel9jZGl2X3FyX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfY2Rpdl9xcl91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2NkaXZfciBfX2dtcHpfY2Rpdl9yCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9jZGl2X3IgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2NkaXZfcl8yZXhwIF9fZ21wel9jZGl2X3JfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2Rpdl9yXzJleHAgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wel9jZGl2X3JfdWkgX19nbXB6X2NkaXZfcl91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X2NkaXZfcl91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2NkaXZfdWkgX19nbXB6X2NkaXZfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9jZGl2X3VpIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfY2xlYXIgX19nbXB6X2NsZWFyCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9jbGVhciBfX0dNUF9QUk9UTyAoKG1wel9wdHIpKTsKKworI2RlZmluZSBtcHpfY2xlYXJzIF9fZ21wel9jbGVhcnMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2NsZWFycyBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIC4uLikpOworCisjZGVmaW5lIG1wel9jbHJiaXQgX19nbXB6X2NscmJpdAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2xyYml0IF9fR01QX1BST1RPICgobXB6X3B0ciwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcHpfY21wIF9fZ21wel9jbXAKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfY21wIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2NtcF9kIF9fZ21wel9jbXBfZAorX19HTVBfREVDTFNQRUMgaW50IG1wel9jbXBfZCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIGRvdWJsZSkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIF9tcHpfY21wX3NpIF9fZ21wel9jbXBfc2kKK19fR01QX0RFQ0xTUEVDIGludCBfbXB6X2NtcF9zaSBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIHNpZ25lZCBsb25nIGludCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgX21wel9jbXBfdWkgX19nbXB6X2NtcF91aQorX19HTVBfREVDTFNQRUMgaW50IF9tcHpfY21wX3VpIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9jbXBhYnMgX19nbXB6X2NtcGFicworX19HTVBfREVDTFNQRUMgaW50IG1wel9jbXBhYnMgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfY21wYWJzX2QgX19nbXB6X2NtcGFic19kCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2NtcGFic19kIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgZG91YmxlKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2NtcGFic191aSBfX2dtcHpfY21wYWJzX3VpCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2NtcGFic191aSBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfY29tIF9fZ21wel9jb20KK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2NvbSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfY29tYml0IF9fZ21wel9jb21iaXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2NvbWJpdCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wX2JpdGNudF90KSk7CisKKyNkZWZpbmUgbXB6X2NvbmdydWVudF9wIF9fZ21wel9jb25ncnVlbnRfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9jb25ncnVlbnRfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfY29uZ3J1ZW50XzJleHBfcCBfX2dtcHpfY29uZ3J1ZW50XzJleHBfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9jb25ncnVlbnRfMmV4cF9wIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgbXB6X3NyY3B0ciwgbXBfYml0Y250X3QpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9jb25ncnVlbnRfdWlfcCBfX2dtcHpfY29uZ3J1ZW50X3VpX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfY29uZ3J1ZW50X3VpX3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2RpdmV4YWN0IF9fZ21wel9kaXZleGFjdAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZGl2ZXhhY3QgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2RpdmV4YWN0X3VpIF9fZ21wel9kaXZleGFjdF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZGl2ZXhhY3RfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nKSk7CisKKyNkZWZpbmUgbXB6X2RpdmlzaWJsZV9wIF9fZ21wel9kaXZpc2libGVfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9kaXZpc2libGVfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfZGl2aXNpYmxlX3VpX3AgX19nbXB6X2RpdmlzaWJsZV91aV9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2RpdmlzaWJsZV91aV9wIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZykpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9kaXZpc2libGVfMmV4cF9wIF9fZ21wel9kaXZpc2libGVfMmV4cF9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2RpdmlzaWJsZV8yZXhwX3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBtcF9iaXRjbnRfdCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2R1bXAgX19nbXB6X2R1bXAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2R1bXAgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2V4cG9ydCBfX2dtcHpfZXhwb3J0CitfX0dNUF9ERUNMU1BFQyB2b2lkICptcHpfZXhwb3J0IF9fR01QX1BST1RPICgodm9pZCAqLCBzaXplX3QgKiwgaW50LCBzaXplX3QsIGludCwgc2l6ZV90LCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2ZhY191aSBfX2dtcHpfZmFjX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9mYWNfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9mZGl2X3EgX19nbXB6X2ZkaXZfcQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZmRpdl9xIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9mZGl2X3FfMmV4cCBfX2dtcHpfZmRpdl9xXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2ZkaXZfcV8yZXhwIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcHpfZmRpdl9xX3VpIF9fZ21wel9mZGl2X3FfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9mZGl2X3FfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9mZGl2X3FyIF9fZ21wel9mZGl2X3FyCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9mZGl2X3FyIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9mZGl2X3FyX3VpIF9fZ21wel9mZGl2X3FyX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfZmRpdl9xcl91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2ZkaXZfciBfX2dtcHpfZmRpdl9yCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9mZGl2X3IgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2ZkaXZfcl8yZXhwIF9fZ21wel9mZGl2X3JfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZmRpdl9yXzJleHAgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wel9mZGl2X3JfdWkgX19nbXB6X2ZkaXZfcl91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X2ZkaXZfcl91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2ZkaXZfdWkgX19nbXB6X2ZkaXZfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9mZGl2X3VpIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfZmliX3VpIF9fZ21wel9maWJfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2ZpYl91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2ZpYjJfdWkgX19nbXB6X2ZpYjJfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2ZpYjJfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9maXRzX3NpbnRfcCBfX2dtcHpfZml0c19zaW50X3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfZml0c19zaW50X3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfZml0c19zbG9uZ19wIF9fZ21wel9maXRzX3Nsb25nX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfZml0c19zbG9uZ19wIF9fR01QX1BST1RPICgobXB6X3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2ZpdHNfc3Nob3J0X3AgX19nbXB6X2ZpdHNfc3Nob3J0X3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfZml0c19zc2hvcnRfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9maXRzX3VpbnRfcCBfX2dtcHpfZml0c191aW50X3AKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZml0c191aW50X3ApCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2ZpdHNfdWludF9wIF9fR01QX1BST1RPICgobXB6X3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZW5kaWYKKworI2RlZmluZSBtcHpfZml0c191bG9uZ19wIF9fZ21wel9maXRzX3Vsb25nX3AKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZml0c191bG9uZ19wKQorX19HTVBfREVDTFNQRUMgaW50IG1wel9maXRzX3Vsb25nX3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9maXRzX3VzaG9ydF9wIF9fZ21wel9maXRzX3VzaG9ydF9wCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdXNob3J0X3ApCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2ZpdHNfdXNob3J0X3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9nY2QgX19nbXB6X2djZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZ2NkIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9nY2RfdWkgX19nbXB6X2djZF91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X2djZF91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2djZGV4dCBfX2dtcHpfZ2NkZXh0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9nY2RleHQgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfcHRyLCBtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2dldF9kIF9fZ21wel9nZXRfZAorX19HTVBfREVDTFNQRUMgZG91YmxlIG1wel9nZXRfZCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfZ2V0X2RfMmV4cCBfX2dtcHpfZ2V0X2RfMmV4cAorX19HTVBfREVDTFNQRUMgZG91YmxlIG1wel9nZXRfZF8yZXhwIF9fR01QX1BST1RPICgoc2lnbmVkIGxvbmcgaW50ICosIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfZ2V0X3NpIF9fZ21wel9nZXRfc2kKK19fR01QX0RFQ0xTUEVDIC8qIHNpZ25lZCAqLyBsb25nIGludCBtcHpfZ2V0X3NpIF9fR01QX1BST1RPICgobXB6X3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2dldF9zdHIgX19nbXB6X2dldF9zdHIKK19fR01QX0RFQ0xTUEVDIGNoYXIgKm1wel9nZXRfc3RyIF9fR01QX1BST1RPICgoY2hhciAqLCBpbnQsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfZ2V0X3VpIF9fZ21wel9nZXRfdWkKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZ2V0X3VpKQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X2dldF91aSBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X2dldGxpbWJuIF9fZ21wel9nZXRsaW1ibgorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9nZXRsaW1ibikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcHpfZ2V0bGltYm4gX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBtcF9zaXplX3QpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X2hhbWRpc3QgX19nbXB6X2hhbWRpc3QKK19fR01QX0RFQ0xTUEVDIG1wX2JpdGNudF90IG1wel9oYW1kaXN0IF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2ltcG9ydCBfX2dtcHpfaW1wb3J0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9pbXBvcnQgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBzaXplX3QsIGludCwgc2l6ZV90LCBpbnQsIHNpemVfdCwgX19nbXBfY29uc3Qgdm9pZCAqKSk7CisKKyNkZWZpbmUgbXB6X2luaXQgX19nbXB6X2luaXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2luaXQgX19HTVBfUFJPVE8gKChtcHpfcHRyKSk7CisKKyNkZWZpbmUgbXB6X2luaXQyIF9fZ21wel9pbml0MgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfaW5pdDIgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wel9pbml0cyBfX2dtcHpfaW5pdHMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2luaXRzIF9fR01QX1BST1RPICgobXB6X3B0ciwgLi4uKSk7CisKKyNkZWZpbmUgbXB6X2luaXRfc2V0IF9fZ21wel9pbml0X3NldAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfaW5pdF9zZXQgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2luaXRfc2V0X2QgX19nbXB6X2luaXRfc2V0X2QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2luaXRfc2V0X2QgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBkb3VibGUpKTsKKworI2RlZmluZSBtcHpfaW5pdF9zZXRfc2kgX19nbXB6X2luaXRfc2V0X3NpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9pbml0X3NldF9zaSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9pbml0X3NldF9zdHIgX19nbXB6X2luaXRfc2V0X3N0cgorX19HTVBfREVDTFNQRUMgaW50IG1wel9pbml0X3NldF9zdHIgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBfX2dtcF9jb25zdCBjaGFyICosIGludCkpOworCisjZGVmaW5lIG1wel9pbml0X3NldF91aSBfX2dtcHpfaW5pdF9zZXRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2luaXRfc2V0X3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfaW5wX3JhdyBfX2dtcHpfaW5wX3JhdworI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcHpfaW5wX3JhdyBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIEZJTEUgKikpOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X2lucF9zdHIgX19nbXB6X2lucF9zdHIKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXB6X2lucF9zdHIgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBGSUxFICosIGludCkpOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X2ludmVydCBfX2dtcHpfaW52ZXJ0CitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2ludmVydCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfaW9yIF9fZ21wel9pb3IKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2lvciBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfamFjb2JpIF9fZ21wel9qYWNvYmkKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfamFjb2JpIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9rcm9uZWNrZXIgbXB6X2phY29iaSAgLyogYWxpYXMgKi8KKworI2RlZmluZSBtcHpfa3JvbmVja2VyX3NpIF9fZ21wel9rcm9uZWNrZXJfc2kKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfa3JvbmVja2VyX3NpIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgbG9uZykpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9rcm9uZWNrZXJfdWkgX19nbXB6X2tyb25lY2tlcl91aQorX19HTVBfREVDTFNQRUMgaW50IG1wel9rcm9uZWNrZXJfdWkgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3NpX2tyb25lY2tlciBfX2dtcHpfc2lfa3JvbmVja2VyCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X3NpX2tyb25lY2tlciBfX0dNUF9QUk9UTyAoKGxvbmcsIG1wel9zcmNwdHIpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfdWlfa3JvbmVja2VyIF9fZ21wel91aV9rcm9uZWNrZXIKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfdWlfa3JvbmVja2VyIF9fR01QX1BST1RPICgodW5zaWduZWQgbG9uZywgbXB6X3NyY3B0cikpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9sY20gX19nbXB6X2xjbQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbGNtIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9sY21fdWkgX19nbXB6X2xjbV91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbGNtX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZykpOworCisjZGVmaW5lIG1wel9sZWdlbmRyZSBtcHpfamFjb2JpICAvKiBhbGlhcyAqLworCisjZGVmaW5lIG1wel9sdWNudW1fdWkgX19nbXB6X2x1Y251bV91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbHVjbnVtX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfbHVjbnVtMl91aSBfX2dtcHpfbHVjbnVtMl91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbHVjbnVtMl91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X21pbGxlcnJhYmluIF9fZ21wel9taWxsZXJyYWJpbgorX19HTVBfREVDTFNQRUMgaW50IG1wel9taWxsZXJyYWJpbiBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIGludCkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9tb2QgX19nbXB6X21vZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbW9kIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9tb2RfdWkgbXB6X2ZkaXZfcl91aSAvKiBzYW1lIGFzIGZkaXZfciBiZWNhdXNlIGRpdmlzb3IgdW5zaWduZWQgKi8KKworI2RlZmluZSBtcHpfbXVsIF9fZ21wel9tdWwKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X211bCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfbXVsXzJleHAgX19nbXB6X211bF8yZXhwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9tdWxfMmV4cCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wX2JpdGNudF90KSk7CisKKyNkZWZpbmUgbXB6X211bF9zaSBfX2dtcHpfbXVsX3NpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9tdWxfc2kgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9tdWxfdWkgX19nbXB6X211bF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbXVsX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfbmVnIF9fZ21wel9uZWcKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfbmVnKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbmVnIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0cikpOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X25leHRwcmltZSBfX2dtcHpfbmV4dHByaW1lCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9uZXh0cHJpbWUgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X291dF9yYXcgX19nbXB6X291dF9yYXcKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXB6X291dF9yYXcgX19HTVBfUFJPVE8gKChGSUxFICosIG1wel9zcmNwdHIpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9vdXRfc3RyIF9fZ21wel9vdXRfc3RyCisjaWZkZWYgX0dNUF9IX0hBVkVfRklMRQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wel9vdXRfc3RyIF9fR01QX1BST1RPICgoRklMRSAqLCBpbnQsIG1wel9zcmNwdHIpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9wZXJmZWN0X3Bvd2VyX3AgX19nbXB6X3BlcmZlY3RfcG93ZXJfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9wZXJmZWN0X3Bvd2VyX3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3BlcmZlY3Rfc3F1YXJlX3AgX19nbXB6X3BlcmZlY3Rfc3F1YXJlX3AKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfcGVyZmVjdF9zcXVhcmVfcCkKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfcGVyZmVjdF9zcXVhcmVfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9wb3Bjb3VudCBfX2dtcHpfcG9wY291bnQKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfcG9wY291bnQpCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcHpfcG9wY291bnQgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9wb3dfdWkgX19nbXB6X3Bvd191aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfcG93X3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfcG93bSBfX2dtcHpfcG93bQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfcG93bSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfcG93bV9zZWMgX19nbXB6X3Bvd21fc2VjCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9wb3dtX3NlYyBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfcG93bV91aSBfX2dtcHpfcG93bV91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfcG93bV91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3Byb2JhYl9wcmltZV9wIF9fZ21wel9wcm9iYWJfcHJpbWVfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9wcm9iYWJfcHJpbWVfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIGludCkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9yYW5kb20gX19nbXB6X3JhbmRvbQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfcmFuZG9tIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXB6X3JhbmRvbTIgX19nbXB6X3JhbmRvbTIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3JhbmRvbTIgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcHpfcmVhbGxvYzIgX19nbXB6X3JlYWxsb2MyCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9yZWFsbG9jMiBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wX2JpdGNudF90KSk7CisKKyNkZWZpbmUgbXB6X3JlbW92ZSBfX2dtcHpfcmVtb3ZlCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcHpfcmVtb3ZlIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9yb290IF9fZ21wel9yb290CitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X3Jvb3QgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9yb290cmVtIF9fZ21wel9yb290cmVtCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9yb290cmVtIF9fR01QX1BST1RPICgobXB6X3B0cixtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9ycmFuZG9tYiBfX2dtcHpfcnJhbmRvbWIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3JyYW5kb21iIF9fR01QX1BST1RPICgobXB6X3B0ciwgZ21wX3JhbmRzdGF0ZV90LCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wel9zY2FuMCBfX2dtcHpfc2NhbjAKK19fR01QX0RFQ0xTUEVDIG1wX2JpdGNudF90IG1wel9zY2FuMCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIG1wX2JpdGNudF90KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfc2NhbjEgX19nbXB6X3NjYW4xCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcHpfc2NhbjEgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBtcF9iaXRjbnRfdCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3NldCBfX2dtcHpfc2V0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zZXQgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3NldF9kIF9fZ21wel9zZXRfZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc2V0X2QgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBkb3VibGUpKTsKKworI2RlZmluZSBtcHpfc2V0X2YgX19nbXB6X3NldF9mCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zZXRfZiBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfc2V0X3EgX19nbXB6X3NldF9xCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3NldF9xKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc2V0X3EgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHFfc3JjcHRyKSk7CisjZW5kaWYKKworI2RlZmluZSBtcHpfc2V0X3NpIF9fZ21wel9zZXRfc2kKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3NldF9zaSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9zZXRfc3RyIF9fZ21wel9zZXRfc3RyCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X3NldF9zdHIgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBfX2dtcF9jb25zdCBjaGFyICosIGludCkpOworCisjZGVmaW5lIG1wel9zZXRfdWkgX19nbXB6X3NldF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc2V0X3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfc2V0Yml0IF9fZ21wel9zZXRiaXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3NldGJpdCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wX2JpdGNudF90KSk7CisKKyNkZWZpbmUgbXB6X3NpemUgX19nbXB6X3NpemUKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfc2l6ZSkKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcHpfc2l6ZSBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X3NpemVpbmJhc2UgX19nbXB6X3NpemVpbmJhc2UKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcHpfc2l6ZWluYmFzZSBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIGludCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3NxcnQgX19nbXB6X3NxcnQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3NxcnQgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3NxcnRyZW0gX19nbXB6X3NxcnRyZW0KK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3NxcnRyZW0gX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3N1YiBfX2dtcHpfc3ViCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zdWIgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3N1Yl91aSBfX2dtcHpfc3ViX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zdWJfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel91aV9zdWIgX19nbXB6X3VpX3N1YgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfdWlfc3ViIF9fR01QX1BST1RPICgobXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfc3VibXVsIF9fZ21wel9zdWJtdWwKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3N1Ym11bCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfc3VibXVsX3VpIF9fZ21wel9zdWJtdWxfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3N1Ym11bF91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X3N3YXAgX19nbXB6X3N3YXAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3N3YXAgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfcHRyKSkgX19HTVBfTk9USFJPVzsKKworI2RlZmluZSBtcHpfdGRpdl91aSBfX2dtcHpfdGRpdl91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X3RkaXZfdWkgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel90ZGl2X3EgX19nbXB6X3RkaXZfcQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfdGRpdl9xIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel90ZGl2X3FfMmV4cCBfX2dtcHpfdGRpdl9xXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3RkaXZfcV8yZXhwIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcHpfdGRpdl9xX3VpIF9fZ21wel90ZGl2X3FfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel90ZGl2X3FfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel90ZGl2X3FyIF9fZ21wel90ZGl2X3FyCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel90ZGl2X3FyIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel90ZGl2X3FyX3VpIF9fZ21wel90ZGl2X3FyX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfdGRpdl9xcl91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X3RkaXZfciBfX2dtcHpfdGRpdl9yCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel90ZGl2X3IgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3RkaXZfcl8yZXhwIF9fZ21wel90ZGl2X3JfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfdGRpdl9yXzJleHAgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wel90ZGl2X3JfdWkgX19nbXB6X3RkaXZfcl91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X3RkaXZfcl91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X3RzdGJpdCBfX2dtcHpfdHN0Yml0CitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X3RzdGJpdCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIG1wX2JpdGNudF90KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfdWlfcG93X3VpIF9fZ21wel91aV9wb3dfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3VpX3Bvd191aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel91cmFuZG9tYiBfX2dtcHpfdXJhbmRvbWIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3VyYW5kb21iIF9fR01QX1BST1RPICgobXB6X3B0ciwgZ21wX3JhbmRzdGF0ZV90LCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wel91cmFuZG9tbSBfX2dtcHpfdXJhbmRvbW0KK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3VyYW5kb21tIF9fR01QX1BST1RPICgobXB6X3B0ciwgZ21wX3JhbmRzdGF0ZV90LCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3hvciBfX2dtcHpfeG9yCisjZGVmaW5lIG1wel9lb3IgX19nbXB6X3hvcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfeG9yIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisKKy8qKioqKioqKioqKioqKioqIFJhdGlvbmFsIChpLmUuIFEpIHJvdXRpbmVzLiAgKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBtcHFfYWJzIF9fZ21wcV9hYnMKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHFfYWJzKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfYWJzIF9fR01QX1BST1RPICgobXBxX3B0ciwgbXBxX3NyY3B0cikpOworI2VuZGlmCisKKyNkZWZpbmUgbXBxX2FkZCBfX2dtcHFfYWRkCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9hZGQgX19HTVBfUFJPVE8gKChtcHFfcHRyLCBtcHFfc3JjcHRyLCBtcHFfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBxX2Nhbm9uaWNhbGl6ZSBfX2dtcHFfY2Fub25pY2FsaXplCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9jYW5vbmljYWxpemUgX19HTVBfUFJPVE8gKChtcHFfcHRyKSk7CisKKyNkZWZpbmUgbXBxX2NsZWFyIF9fZ21wcV9jbGVhcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfY2xlYXIgX19HTVBfUFJPVE8gKChtcHFfcHRyKSk7CisKKyNkZWZpbmUgbXBxX2NsZWFycyBfX2dtcHFfY2xlYXJzCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9jbGVhcnMgX19HTVBfUFJPVE8gKChtcHFfcHRyLCAuLi4pKTsKKworI2RlZmluZSBtcHFfY21wIF9fZ21wcV9jbXAKK19fR01QX0RFQ0xTUEVDIGludCBtcHFfY21wIF9fR01QX1BST1RPICgobXBxX3NyY3B0ciwgbXBxX3NyY3B0cikpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIF9tcHFfY21wX3NpIF9fZ21wcV9jbXBfc2kKK19fR01QX0RFQ0xTUEVDIGludCBfbXBxX2NtcF9zaSBfX0dNUF9QUk9UTyAoKG1wcV9zcmNwdHIsIGxvbmcsIHVuc2lnbmVkIGxvbmcpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBfbXBxX2NtcF91aSBfX2dtcHFfY21wX3VpCitfX0dNUF9ERUNMU1BFQyBpbnQgX21wcV9jbXBfdWkgX19HTVBfUFJPVE8gKChtcHFfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCwgdW5zaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHFfZGl2IF9fZ21wcV9kaXYKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX2RpdiBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wcV9zcmNwdHIsIG1wcV9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfZGl2XzJleHAgX19nbXBxX2Rpdl8yZXhwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9kaXZfMmV4cCBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wcV9zcmNwdHIsIG1wX2JpdGNudF90KSk7CisKKyNkZWZpbmUgbXBxX2VxdWFsIF9fZ21wcV9lcXVhbAorX19HTVBfREVDTFNQRUMgaW50IG1wcV9lcXVhbCBfX0dNUF9QUk9UTyAoKG1wcV9zcmNwdHIsIG1wcV9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wcV9nZXRfbnVtIF9fZ21wcV9nZXRfbnVtCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9nZXRfbnVtIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXBxX3NyY3B0cikpOworCisjZGVmaW5lIG1wcV9nZXRfZGVuIF9fZ21wcV9nZXRfZGVuCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9nZXRfZGVuIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXBxX3NyY3B0cikpOworCisjZGVmaW5lIG1wcV9nZXRfZCBfX2dtcHFfZ2V0X2QKK19fR01QX0RFQ0xTUEVDIGRvdWJsZSBtcHFfZ2V0X2QgX19HTVBfUFJPVE8gKChtcHFfc3JjcHRyKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBxX2dldF9zdHIgX19nbXBxX2dldF9zdHIKK19fR01QX0RFQ0xTUEVDIGNoYXIgKm1wcV9nZXRfc3RyIF9fR01QX1BST1RPICgoY2hhciAqLCBpbnQsIG1wcV9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfaW5pdCBfX2dtcHFfaW5pdAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfaW5pdCBfX0dNUF9QUk9UTyAoKG1wcV9wdHIpKTsKKworI2RlZmluZSBtcHFfaW5pdHMgX19nbXBxX2luaXRzCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9pbml0cyBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIC4uLikpOworCisjZGVmaW5lIG1wcV9pbnBfc3RyIF9fZ21wcV9pbnBfc3RyCisjaWZkZWYgX0dNUF9IX0hBVkVfRklMRQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wcV9pbnBfc3RyIF9fR01QX1BST1RPICgobXBxX3B0ciwgRklMRSAqLCBpbnQpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wcV9pbnYgX19nbXBxX2ludgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfaW52IF9fR01QX1BST1RPICgobXBxX3B0ciwgbXBxX3NyY3B0cikpOworCisjZGVmaW5lIG1wcV9tdWwgX19nbXBxX211bAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfbXVsIF9fR01QX1BST1RPICgobXBxX3B0ciwgbXBxX3NyY3B0ciwgbXBxX3NyY3B0cikpOworCisjZGVmaW5lIG1wcV9tdWxfMmV4cCBfX2dtcHFfbXVsXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX211bF8yZXhwIF9fR01QX1BST1RPICgobXBxX3B0ciwgbXBxX3NyY3B0ciwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcHFfbmVnIF9fZ21wcV9uZWcKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHFfbmVnKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfbmVnIF9fR01QX1BST1RPICgobXBxX3B0ciwgbXBxX3NyY3B0cikpOworI2VuZGlmCisKKyNkZWZpbmUgbXBxX291dF9zdHIgX19nbXBxX291dF9zdHIKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXBxX291dF9zdHIgX19HTVBfUFJPVE8gKChGSUxFICosIGludCwgbXBxX3NyY3B0cikpOworI2VuZGlmCisKKyNkZWZpbmUgbXBxX3NldCBfX2dtcHFfc2V0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9zZXQgX19HTVBfUFJPVE8gKChtcHFfcHRyLCBtcHFfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBxX3NldF9kIF9fZ21wcV9zZXRfZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfc2V0X2QgX19HTVBfUFJPVE8gKChtcHFfcHRyLCBkb3VibGUpKTsKKworI2RlZmluZSBtcHFfc2V0X2RlbiBfX2dtcHFfc2V0X2RlbgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfc2V0X2RlbiBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfc2V0X2YgX19nbXBxX3NldF9mCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9zZXRfZiBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfc2V0X251bSBfX2dtcHFfc2V0X251bQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfc2V0X251bSBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfc2V0X3NpIF9fZ21wcV9zZXRfc2kKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3NldF9zaSBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIHNpZ25lZCBsb25nIGludCwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHFfc2V0X3N0ciBfX2dtcHFfc2V0X3N0cgorX19HTVBfREVDTFNQRUMgaW50IG1wcV9zZXRfc3RyIF9fR01QX1BST1RPICgobXBxX3B0ciwgX19nbXBfY29uc3QgY2hhciAqLCBpbnQpKTsKKworI2RlZmluZSBtcHFfc2V0X3VpIF9fZ21wcV9zZXRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3NldF91aSBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wcV9zZXRfeiBfX2dtcHFfc2V0X3oKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3NldF96IF9fR01QX1BST1RPICgobXBxX3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wcV9zdWIgX19nbXBxX3N1YgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfc3ViIF9fR01QX1BST1RPICgobXBxX3B0ciwgbXBxX3NyY3B0ciwgbXBxX3NyY3B0cikpOworCisjZGVmaW5lIG1wcV9zd2FwIF9fZ21wcV9zd2FwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9zd2FwIF9fR01QX1BST1RPICgobXBxX3B0ciwgbXBxX3B0cikpIF9fR01QX05PVEhST1c7CisKKworLyoqKioqKioqKioqKioqKiogRmxvYXQgKGkuZS4gRikgcm91dGluZXMuICAqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIG1wZl9hYnMgX19nbXBmX2FicworX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfYWJzIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9hZGQgX19nbXBmX2FkZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfYWRkIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9hZGRfdWkgX19nbXBmX2FkZF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfYWRkX3VpIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKyNkZWZpbmUgbXBmX2NlaWwgX19nbXBmX2NlaWwKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2NlaWwgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX2NsZWFyIF9fZ21wZl9jbGVhcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfY2xlYXIgX19HTVBfUFJPVE8gKChtcGZfcHRyKSk7CisKKyNkZWZpbmUgbXBmX2NsZWFycyBfX2dtcGZfY2xlYXJzCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9jbGVhcnMgX19HTVBfUFJPVE8gKChtcGZfcHRyLCAuLi4pKTsKKworI2RlZmluZSBtcGZfY21wIF9fZ21wZl9jbXAKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfY21wIF9fR01QX1BST1RPICgobXBmX3NyY3B0ciwgbXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2NtcF9kIF9fZ21wZl9jbXBfZAorX19HTVBfREVDTFNQRUMgaW50IG1wZl9jbXBfZCBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIsIGRvdWJsZSkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9jbXBfc2kgX19nbXBmX2NtcF9zaQorX19HTVBfREVDTFNQRUMgaW50IG1wZl9jbXBfc2kgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyLCBzaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9jbXBfdWkgX19nbXBmX2NtcF91aQorX19HTVBfREVDTFNQRUMgaW50IG1wZl9jbXBfdWkgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2RpdiBfX2dtcGZfZGl2CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9kaXYgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX2Rpdl8yZXhwIF9fZ21wZl9kaXZfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfZGl2XzJleHAgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyLCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wZl9kaXZfdWkgX19nbXBmX2Rpdl91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfZGl2X3VpIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfZHVtcCBfX2dtcGZfZHVtcAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfZHVtcCBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfZXEgX19nbXBmX2VxCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2VxIF9fR01QX1BST1RPICgobXBmX3NyY3B0ciwgbXBmX3NyY3B0ciwgbXBfYml0Y250X3QpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZml0c19zaW50X3AgX19nbXBmX2ZpdHNfc2ludF9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2ZpdHNfc2ludF9wIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2ZpdHNfc2xvbmdfcCBfX2dtcGZfZml0c19zbG9uZ19wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2ZpdHNfc2xvbmdfcCBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9maXRzX3NzaG9ydF9wIF9fZ21wZl9maXRzX3NzaG9ydF9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2ZpdHNfc3Nob3J0X3AgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZml0c191aW50X3AgX19nbXBmX2ZpdHNfdWludF9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2ZpdHNfdWludF9wIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2ZpdHNfdWxvbmdfcCBfX2dtcGZfZml0c191bG9uZ19wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2ZpdHNfdWxvbmdfcCBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9maXRzX3VzaG9ydF9wIF9fZ21wZl9maXRzX3VzaG9ydF9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2ZpdHNfdXNob3J0X3AgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZmxvb3IgX19nbXBmX2Zsb29yCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9mbG9vciBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfZ2V0X2QgX19nbXBmX2dldF9kCitfX0dNUF9ERUNMU1BFQyBkb3VibGUgbXBmX2dldF9kIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9nZXRfZF8yZXhwIF9fZ21wZl9nZXRfZF8yZXhwCitfX0dNUF9ERUNMU1BFQyBkb3VibGUgbXBmX2dldF9kXzJleHAgX19HTVBfUFJPVE8gKChzaWduZWQgbG9uZyBpbnQgKiwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9nZXRfZGVmYXVsdF9wcmVjIF9fZ21wZl9nZXRfZGVmYXVsdF9wcmVjCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcGZfZ2V0X2RlZmF1bHRfcHJlYyBfX0dNUF9QUk9UTyAoKHZvaWQpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9nZXRfcHJlYyBfX2dtcGZfZ2V0X3ByZWMKK19fR01QX0RFQ0xTUEVDIG1wX2JpdGNudF90IG1wZl9nZXRfcHJlYyBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9nZXRfc2kgX19nbXBmX2dldF9zaQorX19HTVBfREVDTFNQRUMgbG9uZyBtcGZfZ2V0X3NpIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2dldF9zdHIgX19nbXBmX2dldF9zdHIKK19fR01QX0RFQ0xTUEVDIGNoYXIgKm1wZl9nZXRfc3RyIF9fR01QX1BST1RPICgoY2hhciAqLCBtcF9leHBfdCAqLCBpbnQsIHNpemVfdCwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9nZXRfdWkgX19nbXBmX2dldF91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBtcGZfZ2V0X3VpIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2luaXQgX19nbXBmX2luaXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2luaXQgX19HTVBfUFJPVE8gKChtcGZfcHRyKSk7CisKKyNkZWZpbmUgbXBmX2luaXQyIF9fZ21wZl9pbml0MgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfaW5pdDIgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wZl9pbml0cyBfX2dtcGZfaW5pdHMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2luaXRzIF9fR01QX1BST1RPICgobXBmX3B0ciwgLi4uKSk7CisKKyNkZWZpbmUgbXBmX2luaXRfc2V0IF9fZ21wZl9pbml0X3NldAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfaW5pdF9zZXQgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX2luaXRfc2V0X2QgX19nbXBmX2luaXRfc2V0X2QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2luaXRfc2V0X2QgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBkb3VibGUpKTsKKworI2RlZmluZSBtcGZfaW5pdF9zZXRfc2kgX19nbXBmX2luaXRfc2V0X3NpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9pbml0X3NldF9zaSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIHNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wZl9pbml0X3NldF9zdHIgX19nbXBmX2luaXRfc2V0X3N0cgorX19HTVBfREVDTFNQRUMgaW50IG1wZl9pbml0X3NldF9zdHIgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBfX2dtcF9jb25zdCBjaGFyICosIGludCkpOworCisjZGVmaW5lIG1wZl9pbml0X3NldF91aSBfX2dtcGZfaW5pdF9zZXRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2luaXRfc2V0X3VpIF9fR01QX1BST1RPICgobXBmX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfaW5wX3N0ciBfX2dtcGZfaW5wX3N0cgorI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcGZfaW5wX3N0ciBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIEZJTEUgKiwgaW50KSk7CisjZW5kaWYKKworI2RlZmluZSBtcGZfaW50ZWdlcl9wIF9fZ21wZl9pbnRlZ2VyX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfaW50ZWdlcl9wIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX211bCBfX2dtcGZfbXVsCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9tdWwgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX211bF8yZXhwIF9fZ21wZl9tdWxfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfbXVsXzJleHAgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyLCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wZl9tdWxfdWkgX19nbXBmX211bF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfbXVsX3VpIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfbmVnIF9fZ21wZl9uZWcKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX25lZyBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfb3V0X3N0ciBfX2dtcGZfb3V0X3N0cgorI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcGZfb3V0X3N0ciBfX0dNUF9QUk9UTyAoKEZJTEUgKiwgaW50LCBzaXplX3QsIG1wZl9zcmNwdHIpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wZl9wb3dfdWkgX19nbXBmX3Bvd191aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfcG93X3VpIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfcmFuZG9tMiBfX2dtcGZfcmFuZG9tMgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfcmFuZG9tMiBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wX3NpemVfdCwgbXBfZXhwX3QpKTsKKworI2RlZmluZSBtcGZfcmVsZGlmZiBfX2dtcGZfcmVsZGlmZgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfcmVsZGlmZiBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfc2V0IF9fZ21wZl9zZXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NldCBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfc2V0X2QgX19nbXBmX3NldF9kCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zZXRfZCBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIGRvdWJsZSkpOworCisjZGVmaW5lIG1wZl9zZXRfZGVmYXVsdF9wcmVjIF9fZ21wZl9zZXRfZGVmYXVsdF9wcmVjCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zZXRfZGVmYXVsdF9wcmVjIF9fR01QX1BST1RPICgobXBfYml0Y250X3QpKSBfX0dNUF9OT1RIUk9XOworCisjZGVmaW5lIG1wZl9zZXRfcHJlYyBfX2dtcGZfc2V0X3ByZWMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NldF9wcmVjIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcGZfc2V0X3ByZWNfcmF3IF9fZ21wZl9zZXRfcHJlY19yYXcKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NldF9wcmVjX3JhdyBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wX2JpdGNudF90KSkgX19HTVBfTk9USFJPVzsKKworI2RlZmluZSBtcGZfc2V0X3EgX19nbXBmX3NldF9xCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zZXRfcSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wcV9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfc2V0X3NpIF9fZ21wZl9zZXRfc2kKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NldF9zaSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIHNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wZl9zZXRfc3RyIF9fZ21wZl9zZXRfc3RyCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX3NldF9zdHIgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBfX2dtcF9jb25zdCBjaGFyICosIGludCkpOworCisjZGVmaW5lIG1wZl9zZXRfdWkgX19nbXBmX3NldF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc2V0X3VpIF9fR01QX1BST1RPICgobXBmX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfc2V0X3ogX19nbXBmX3NldF96CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zZXRfeiBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfc2l6ZSBfX2dtcGZfc2l6ZQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wZl9zaXplIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX3NxcnQgX19nbXBmX3NxcnQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NxcnQgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX3NxcnRfdWkgX19nbXBmX3NxcnRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NxcnRfdWkgX19HTVBfUFJPVE8gKChtcGZfcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wZl9zdWIgX19nbXBmX3N1YgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc3ViIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9zdWJfdWkgX19nbXBmX3N1Yl91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc3ViX3VpIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfc3dhcCBfX2dtcGZfc3dhcAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc3dhcCBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9wdHIpKSBfX0dNUF9OT1RIUk9XOworCisjZGVmaW5lIG1wZl90cnVuYyBfX2dtcGZfdHJ1bmMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3RydW5jIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl91aV9kaXYgX19nbXBmX3VpX2RpdgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfdWlfZGl2IF9fR01QX1BST1RPICgobXBmX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfdWlfc3ViIF9fZ21wZl91aV9zdWIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3VpX3N1YiBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX3VyYW5kb21iIF9fZ21wZl91cmFuZG9tYgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfdXJhbmRvbWIgX19HTVBfUFJPVE8gKChtcGZfdCwgZ21wX3JhbmRzdGF0ZV90LCBtcF9iaXRjbnRfdCkpOworCisKKy8qKioqKioqKioqKiogTG93IGxldmVsIHBvc2l0aXZlLWludGVnZXIgKGkuZS4gTikgcm91dGluZXMuICAqKioqKioqKioqKiovCisKKy8qIFRoaXMgaXMgdWdseSwgYnV0IHdlIG5lZWQgdG8gbWFrZSB1c2VyIGNhbGxzIHJlYWNoIHRoZSBwcmVmaXhlZCBmdW5jdGlvbi4gKi8KKworI2RlZmluZSBtcG5fYWRkIF9fTVBOKGFkZCkKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fYWRkKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGQgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsbXBfc2l6ZV90KSk7CisjZW5kaWYKKworI2RlZmluZSBtcG5fYWRkXzEgX19NUE4oYWRkXzEpCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX2FkZF8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGRfMSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCkpIF9fR01QX05PVEhST1c7CisjZW5kaWYKKworI2RlZmluZSBtcG5fYWRkX24gX19NUE4oYWRkX24pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2FkZF9uIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXBuX2FkZG11bF8xIF9fTVBOKGFkZG11bF8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGRtdWxfMSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCkpOworCisjZGVmaW5lIG1wbl9jbXAgX19NUE4oY21wKQorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9jbXApCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBuX2NtcCBfX0dNUF9QUk9UTyAoKG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5Myhkc3Qsc3JjLHNpemUpIFwKKyAgbXBuX2RpdmV4YWN0X2J5M2MgKGRzdCwgc3JjLCBzaXplLCBfX0dNUF9DQVNUIChtcF9saW1iX3QsIDApKQorCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTNjIF9fTVBOKGRpdmV4YWN0X2J5M2MpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2RpdmV4YWN0X2J5M2MgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpKTsKKworI2RlZmluZSBtcG5fZGl2bW9kXzEocXAsbnAsbnNpemUsZGxpbWIpIFwKKyAgbXBuX2RpdnJlbV8xIChxcCwgX19HTVBfQ0FTVCAobXBfc2l6ZV90LCAwKSwgbnAsIG5zaXplLCBkbGltYikKKworI2RlZmluZSBtcG5fZGl2cmVtIF9fTVBOKGRpdnJlbSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fZGl2cmVtIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zaXplX3QsIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wbl9kaXZyZW1fMSBfX01QTihkaXZyZW1fMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fZGl2cmVtXzEgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCkpOworCisjZGVmaW5lIG1wbl9kaXZyZW1fMiBfX01QTihkaXZyZW1fMikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fZGl2cmVtXzIgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NpemVfdCwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cikpOworCisjZGVmaW5lIG1wbl9nY2QgX19NUE4oZ2NkKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9nY2QgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wbl9nY2RfMSBfX01QTihnY2RfMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fZ2NkXzEgX19HTVBfUFJPVE8gKChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX2djZGV4dF8xIF9fTVBOKGdjZGV4dF8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9nY2RleHRfMSBfX0dNUF9QUk9UTyAoKG1wX2xpbWJfc2lnbmVkX3QgKiwgbXBfbGltYl9zaWduZWRfdCAqLCBtcF9saW1iX3QsIG1wX2xpbWJfdCkpOworCisjZGVmaW5lIG1wbl9nY2RleHQgX19NUE4oZ2NkZXh0KQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9nY2RleHQgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90ICosIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wbl9nZXRfc3RyIF9fTVBOKGdldF9zdHIpCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXBuX2dldF9zdHIgX19HTVBfUFJPVE8gKCh1bnNpZ25lZCBjaGFyICosIGludCwgbXBfcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5faGFtZGlzdCBfX01QTihoYW1kaXN0KQorX19HTVBfREVDTFNQRUMgbXBfYml0Y250X3QgbXBuX2hhbWRpc3QgX19HTVBfUFJPVE8gKChtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fbHNoaWZ0IF9fTVBOKGxzaGlmdCkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbHNoaWZ0IF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQgaW50KSk7CisKKyNkZWZpbmUgbXBuX21vZF8xIF9fTVBOKG1vZF8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9tb2RfMSBfX0dNUF9QUk9UTyAoKG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fbXVsIF9fTVBOKG11bCkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbXVsIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fbXVsXzEgX19NUE4obXVsXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX211bF8xIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KSk7CisKKyNkZWZpbmUgbXBuX211bF9uIF9fTVBOKG11bF9uKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fbXVsX24gX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fc3FyIF9fTVBOKHNxcikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX3NxciBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fbmVnIF9fTVBOKG5lZykKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fbmVnKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9uZWcgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisjZW5kaWYKKworI2RlZmluZSBtcG5fY29tIF9fTVBOKGNvbSkKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fY29tKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fY29tIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCkpOworI2VuZGlmCisKKyNkZWZpbmUgbXBuX3BlcmZlY3Rfc3F1YXJlX3AgX19NUE4ocGVyZmVjdF9zcXVhcmVfcCkKK19fR01QX0RFQ0xTUEVDIGludCBtcG5fcGVyZmVjdF9zcXVhcmVfcCBfX0dNUF9QUk9UTyAoKG1wX3NyY3B0ciwgbXBfc2l6ZV90KSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX3BlcmZlY3RfcG93ZXJfcCBfX01QTihwZXJmZWN0X3Bvd2VyX3ApCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBuX3BlcmZlY3RfcG93ZXJfcCBfX0dNUF9QUk9UTyAoKG1wX3NyY3B0ciwgbXBfc2l6ZV90KSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX3BvcGNvdW50IF9fTVBOKHBvcGNvdW50KQorX19HTVBfREVDTFNQRUMgbXBfYml0Y250X3QgbXBuX3BvcGNvdW50IF9fR01QX1BST1RPICgobXBfc3JjcHRyLCBtcF9zaXplX3QpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wbl9wb3dfMSBfX01QTihwb3dfMSkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fcG93XzEgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX3B0cikpOworCisvKiB1bmRvY3VtZW50ZWQgbm93LCBidXQgcmV0YWluZWQgaGVyZSBmb3IgdXB3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgbXBuX3ByZWludl9tb2RfMSBfX01QTihwcmVpbnZfbW9kXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3ByZWludl9tb2RfMSBfX0dNUF9QUk9UTyAoKG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wbl9yYW5kb20gX19NUE4ocmFuZG9tKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fcmFuZG9tIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fcmFuZG9tMiBfX01QTihyYW5kb20yKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fcmFuZG9tMiBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXBuX3JzaGlmdCBfX01QTihyc2hpZnQpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3JzaGlmdCBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIHVuc2lnbmVkIGludCkpOworCisjZGVmaW5lIG1wbl9zY2FuMCBfX01QTihzY2FuMCkKK19fR01QX0RFQ0xTUEVDIG1wX2JpdGNudF90IG1wbl9zY2FuMCBfX0dNUF9QUk9UTyAoKG1wX3NyY3B0ciwgbXBfYml0Y250X3QpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fc2NhbjEgX19NUE4oc2NhbjEpCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcG5fc2NhbjEgX19HTVBfUFJPVE8gKChtcF9zcmNwdHIsIG1wX2JpdGNudF90KSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX3NldF9zdHIgX19NUE4oc2V0X3N0cikKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fc2V0X3N0ciBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgX19nbXBfY29uc3QgdW5zaWduZWQgY2hhciAqLCBzaXplX3QsIGludCkpOworCisjZGVmaW5lIG1wbl9zcXJ0cmVtIF9fTVBOKHNxcnRyZW0pCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXBuX3NxcnRyZW0gX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fc3ViIF9fTVBOKHN1YikKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fc3ViKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zdWIgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsbXBfc2l6ZV90KSk7CisjZW5kaWYKKworI2RlZmluZSBtcG5fc3ViXzEgX19NUE4oc3ViXzEpCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX3N1Yl8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zdWJfMSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCkpIF9fR01QX05PVEhST1c7CisjZW5kaWYKKworI2RlZmluZSBtcG5fc3ViX24gX19NUE4oc3ViX24pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3N1Yl9uIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXBuX3N1Ym11bF8xIF9fTVBOKHN1Ym11bF8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zdWJtdWxfMSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCkpOworCisjZGVmaW5lIG1wbl90ZGl2X3FyIF9fTVBOKHRkaXZfcXIpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl90ZGl2X3FyIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXBuX2FuZF9uIF9fTVBOKGFuZF9uKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fYW5kX24gX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKyNkZWZpbmUgbXBuX2FuZG5fbiBfX01QTihhbmRuX24pCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9hbmRuX24gX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKyNkZWZpbmUgbXBuX25hbmRfbiBfX01QTihuYW5kX24pCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9uYW5kX24gX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKyNkZWZpbmUgbXBuX2lvcl9uIF9fTVBOKGlvcl9uKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5faW9yX24gX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKyNkZWZpbmUgbXBuX2lvcm5fbiBfX01QTihpb3JuX24pCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9pb3JuX24gX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKyNkZWZpbmUgbXBuX25pb3JfbiBfX01QTihuaW9yX24pCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9uaW9yX24gX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKyNkZWZpbmUgbXBuX3hvcl9uIF9fTVBOKHhvcl9uKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5feG9yX24gX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKyNkZWZpbmUgbXBuX3hub3JfbiBfX01QTih4bm9yX24pCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl94bm9yX24gX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fY29weWkgX19NUE4oY29weWkpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9jb3B5aSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKyNkZWZpbmUgbXBuX2NvcHlkIF9fTVBOKGNvcHlkKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fY29weWQgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisjZGVmaW5lIG1wbl96ZXJvIF9fTVBOKHplcm8pCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl96ZXJvIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zaXplX3QpKTsKKworLyoqKioqKioqKioqKioqKiogbXB6IGlubGluZXMgKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGZvbGxvd2luZyBhcmUgcHJvdmlkZWQgYXMgaW5saW5lcyB3aGVyZSBwb3NzaWJsZSwgYnV0IGFsd2F5cyBleGlzdCBhcworICAgbGlicmFyeSBmdW5jdGlvbnMgdG9vLCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkuCisKKyAgIFdpdGhpbiBnbXAgaXRzZWxmIHRoaXMgaW5saW5pbmcgZ2VuZXJhbGx5IGlzbid0IHJlbGllZCBvbiwgc2luY2UgaXQKKyAgIGRvZXNuJ3QgZ2V0IGRvbmUgZm9yIGFsbCBjb21waWxlcnMsIHdoZXJlYXMgaWYgc29tZXRoaW5nIGlzIHdvcnRoCisgICBpbmxpbmluZyB0aGVuIGl0J3Mgd29ydGggYXJyYW5naW5nIGFsd2F5cy4KKworICAgVGhlcmUgYXJlIHR3byBzdHlsZXMgb2YgaW5saW5pbmcgaGVyZS4gIFdoZW4gdGhlIHNhbWUgYml0IG9mIGNvZGUgaXMKKyAgIHdhbnRlZCBmb3IgdGhlIGlubGluZSBhcyBmb3IgdGhlIGxpYnJhcnkgdmVyc2lvbiwgdGhlbiBfX0dNUF9GT1JDRV9mb28KKyAgIGFycmFuZ2VzIGZvciB0aGF0IGNvZGUgdG8gYmUgZW1pdHRlZCBhbmQgdGhlIF9fR01QX0VYVEVSTl9JTkxJTkUKKyAgIGRpcmVjdGl2ZSBzdXBwcmVzc2VkLCBlZy4gbXB6X2ZpdHNfdWludF9wLiAgV2hlbiBhIGRpZmZlcmVudCBiaXQgb2YgY29kZQorICAgaXMgd2FudGVkIGZvciB0aGUgaW5saW5lIHRoYW4gZm9yIHRoZSBsaWJyYXJ5IHZlcnNpb24sIHRoZW4KKyAgIF9fR01QX0ZPUkNFX2ZvbyBhcnJhbmdlcyB0aGUgaW5saW5lIHRvIGJlIHN1cHByZXNzZWQsIGVnLiBtcHpfYWJzLiAgKi8KKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpICYmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2FicykKK19fR01QX0VYVEVSTl9JTkxJTkUgdm9pZAorbXB6X2FicyAobXB6X3B0ciBfX2dtcF93LCBtcHpfc3JjcHRyIF9fZ21wX3UpCit7CisgIGlmIChfX2dtcF93ICE9IF9fZ21wX3UpCisgICAgbXB6X3NldCAoX19nbXBfdywgX19nbXBfdSk7CisgIF9fZ21wX3ctPl9tcF9zaXplID0gX19HTVBfQUJTIChfX2dtcF93LT5fbXBfc2l6ZSk7Cit9CisjZW5kaWYKKworI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorI2RlZmluZSBfX0dNUFpfRklUU19VVFlQRV9QKHosbWF4dmFsKQkJCQkJXAorICBtcF9zaXplX3QgIF9fZ21wX24gPSB6LT5fbXBfc2l6ZTsJCQkJCVwKKyAgbXBfcHRyICBfX2dtcF9wID0gei0+X21wX2Q7CQkJCQkJXAorICByZXR1cm4gKF9fZ21wX24gPT0gMCB8fCAoX19nbXBfbiA9PSAxICYmIF9fZ21wX3BbMF0gPD0gbWF4dmFsKSk7CisjZWxzZQorI2RlZmluZSBfX0dNUFpfRklUU19VVFlQRV9QKHosbWF4dmFsKQkJCQkJXAorICBtcF9zaXplX3QgIF9fZ21wX24gPSB6LT5fbXBfc2l6ZTsJCQkJCVwKKyAgbXBfcHRyICBfX2dtcF9wID0gei0+X21wX2Q7CQkJCQkJXAorICByZXR1cm4gKF9fZ21wX24gPT0gMCB8fCAoX19nbXBfbiA9PSAxICYmIF9fZ21wX3BbMF0gPD0gbWF4dmFsKQlcCisJICB8fCAoX19nbXBfbiA9PSAyICYmIF9fZ21wX3BbMV0gPD0gKChtcF9saW1iX3QpIG1heHZhbCA+PiBHTVBfTlVNQl9CSVRTKSkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZml0c191aW50X3ApCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZml0c191aW50X3ApCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK2ludAorbXB6X2ZpdHNfdWludF9wIChtcHpfc3JjcHRyIF9fZ21wX3opIF9fR01QX05PVEhST1cKK3sKKyAgX19HTVBaX0ZJVFNfVVRZUEVfUCAoX19nbXBfeiwgX19HTVBfVUlOVF9NQVgpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZml0c191bG9uZ19wKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdWxvbmdfcCkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgoraW50CittcHpfZml0c191bG9uZ19wIChtcHpfc3JjcHRyIF9fZ21wX3opIF9fR01QX05PVEhST1cKK3sKKyAgX19HTVBaX0ZJVFNfVVRZUEVfUCAoX19nbXBfeiwgX19HTVBfVUxPTkdfTUFYKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdXNob3J0X3ApCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZml0c191c2hvcnRfcCkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgoraW50CittcHpfZml0c191c2hvcnRfcCAobXB6X3NyY3B0ciBfX2dtcF96KSBfX0dNUF9OT1RIUk9XCit7CisgIF9fR01QWl9GSVRTX1VUWVBFX1AgKF9fZ21wX3osIF9fR01QX1VTSFJUX01BWCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9nZXRfdWkpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZ2V0X3VpKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCit1bnNpZ25lZCBsb25nCittcHpfZ2V0X3VpIChtcHpfc3JjcHRyIF9fZ21wX3opIF9fR01QX05PVEhST1cKK3sKKyAgbXBfcHRyIF9fZ21wX3AgPSBfX2dtcF96LT5fbXBfZDsKKyAgbXBfc2l6ZV90IF9fZ21wX24gPSBfX2dtcF96LT5fbXBfc2l6ZTsKKyAgbXBfbGltYl90IF9fZ21wX2wgPSBfX2dtcF9wWzBdOworICAvKiBUaGlzIGlzIGEgIiNpZiIgcmF0aGVyIHRoYW4gYSBwbGFpbiAiaWYiIHNvIGFzIHRvIGF2b2lkIGdjYyB3YXJuaW5ncworICAgICBhYm91dCAiPDwgR01QX05VTUJfQklUUyIgZXhjZWVkaW5nIHRoZSB0eXBlIHNpemUsIGFuZCB0byBhdm9pZCBCb3JsYW5kCisgICAgIEMrKyA2LjAgd2FybmluZ3MgYWJvdXQgY29uZGl0aW9uIGFsd2F5cyB0cnVlIGZvciBzb21ldGhpbmcgbGlrZQorICAgICAiX19HTVBfVUxPTkdfTUFYIDwgR01QX05VTUJfTUFTSyIuICAqLworI2lmIEdNUF9OQUlMX0JJVFMgPT0gMCB8fCBkZWZpbmVkIChfTE9OR19MT05HX0xJTUIpCisgIC8qIGxpbWI9PWxvbmcgYW5kIG5vIG5haWxzLCBvciBsaW1iPT1sb25nbG9uZywgb25lIGxpbWIgaXMgZW5vdWdoICovCisgIHJldHVybiAoX19nbXBfbiAhPSAwID8gX19nbXBfbCA6IDApOworI2Vsc2UKKyAgLyogbGltYj09bG9uZyBhbmQgbmFpbHMsIG5lZWQgdHdvIGxpbWJzIHdoZW4gYXZhaWxhYmxlICovCisgIF9fZ21wX24gPSBfX0dNUF9BQlMgKF9fZ21wX24pOworICBpZiAoX19nbXBfbiA8PSAxKQorICAgIHJldHVybiAoX19nbXBfbiAhPSAwID8gX19nbXBfbCA6IDApOworICBlbHNlCisgICAgcmV0dXJuIF9fZ21wX2wgKyAoX19nbXBfcFsxXSA8PCBHTVBfTlVNQl9CSVRTKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZ2V0bGltYm4pCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZ2V0bGltYm4pCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK21wX2xpbWJfdAorbXB6X2dldGxpbWJuIChtcHpfc3JjcHRyIF9fZ21wX3osIG1wX3NpemVfdCBfX2dtcF9uKSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX2xpbWJfdCAgX19nbXBfcmVzdWx0ID0gMDsKKyAgaWYgKF9fR01QX0xJS0VMWSAoX19nbXBfbiA+PSAwICYmIF9fZ21wX24gPCBfX0dNUF9BQlMgKF9fZ21wX3otPl9tcF9zaXplKSkpCisgICAgX19nbXBfcmVzdWx0ID0gX19nbXBfei0+X21wX2RbX19nbXBfbl07CisgIHJldHVybiBfX2dtcF9yZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpICYmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X25lZykKK19fR01QX0VYVEVSTl9JTkxJTkUgdm9pZAorbXB6X25lZyAobXB6X3B0ciBfX2dtcF93LCBtcHpfc3JjcHRyIF9fZ21wX3UpCit7CisgIGlmIChfX2dtcF93ICE9IF9fZ21wX3UpCisgICAgbXB6X3NldCAoX19nbXBfdywgX19nbXBfdSk7CisgIF9fZ21wX3ctPl9tcF9zaXplID0gLSBfX2dtcF93LT5fbXBfc2l6ZTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3BlcmZlY3Rfc3F1YXJlX3ApCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfcGVyZmVjdF9zcXVhcmVfcCkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgoraW50CittcHpfcGVyZmVjdF9zcXVhcmVfcCAobXB6X3NyY3B0ciBfX2dtcF9hKQoreworICBtcF9zaXplX3QgX19nbXBfYXNpemU7CisgIGludCAgICAgICBfX2dtcF9yZXN1bHQ7CisKKyAgX19nbXBfYXNpemUgPSBfX2dtcF9hLT5fbXBfc2l6ZTsKKyAgX19nbXBfcmVzdWx0ID0gKF9fZ21wX2FzaXplID49IDApOyAgLyogemVybyBpcyBhIHNxdWFyZSwgbmVnYXRpdmVzIGFyZSBub3QgKi8KKyAgaWYgKF9fR01QX0xJS0VMWSAoX19nbXBfYXNpemUgPiAwKSkKKyAgICBfX2dtcF9yZXN1bHQgPSBtcG5fcGVyZmVjdF9zcXVhcmVfcCAoX19nbXBfYS0+X21wX2QsIF9fZ21wX2FzaXplKTsKKyAgcmV0dXJuIF9fZ21wX3Jlc3VsdDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3BvcGNvdW50KQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3BvcGNvdW50KQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCittcF9iaXRjbnRfdAorbXB6X3BvcGNvdW50IChtcHpfc3JjcHRyIF9fZ21wX3UpIF9fR01QX05PVEhST1cKK3sKKyAgbXBfc2l6ZV90ICAgICAgX19nbXBfdXNpemU7CisgIG1wX2JpdGNudF90ICAgIF9fZ21wX3Jlc3VsdDsKKworICBfX2dtcF91c2l6ZSA9IF9fZ21wX3UtPl9tcF9zaXplOworICBfX2dtcF9yZXN1bHQgPSAoX19nbXBfdXNpemUgPCAwID8gX19HTVBfVUxPTkdfTUFYIDogMCk7CisgIGlmIChfX0dNUF9MSUtFTFkgKF9fZ21wX3VzaXplID4gMCkpCisgICAgX19nbXBfcmVzdWx0ID0gIG1wbl9wb3Bjb3VudCAoX19nbXBfdS0+X21wX2QsIF9fZ21wX3VzaXplKTsKKyAgcmV0dXJuIF9fZ21wX3Jlc3VsdDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3NldF9xKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3NldF9xKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCit2b2lkCittcHpfc2V0X3EgKG1wel9wdHIgX19nbXBfdywgbXBxX3NyY3B0ciBfX2dtcF91KQoreworICBtcHpfdGRpdl9xIChfX2dtcF93LCBtcHFfbnVtcmVmIChfX2dtcF91KSwgbXBxX2RlbnJlZiAoX19nbXBfdSkpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfc2l6ZSkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9zaXplKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCitzaXplX3QKK21wel9zaXplIChtcHpfc3JjcHRyIF9fZ21wX3opIF9fR01QX05PVEhST1cKK3sKKyAgcmV0dXJuIF9fR01QX0FCUyAoX19nbXBfei0+X21wX3NpemUpOworfQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKiogbXBxIGlubGluZXMgKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpICYmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBxX2FicykKK19fR01QX0VYVEVSTl9JTkxJTkUgdm9pZAorbXBxX2FicyAobXBxX3B0ciBfX2dtcF93LCBtcHFfc3JjcHRyIF9fZ21wX3UpCit7CisgIGlmIChfX2dtcF93ICE9IF9fZ21wX3UpCisgICAgbXBxX3NldCAoX19nbXBfdywgX19nbXBfdSk7CisgIF9fZ21wX3ctPl9tcF9udW0uX21wX3NpemUgPSBfX0dNUF9BQlMgKF9fZ21wX3ctPl9tcF9udW0uX21wX3NpemUpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSAmJiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wcV9uZWcpCitfX0dNUF9FWFRFUk5fSU5MSU5FIHZvaWQKK21wcV9uZWcgKG1wcV9wdHIgX19nbXBfdywgbXBxX3NyY3B0ciBfX2dtcF91KQoreworICBpZiAoX19nbXBfdyAhPSBfX2dtcF91KQorICAgIG1wcV9zZXQgKF9fZ21wX3csIF9fZ21wX3UpOworICBfX2dtcF93LT5fbXBfbnVtLl9tcF9zaXplID0gLSBfX2dtcF93LT5fbXBfbnVtLl9tcF9zaXplOworfQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKiogbXBuIGlubGluZXMgKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGNvbW1lbnRzIHdpdGggX19HTVBOX0FERF8xIGJlbG93IGFwcGx5IGhlcmUgdG9vLgorCisgICBUaGUgdGVzdCBmb3IgRlVOQ1RJT04gcmV0dXJuaW5nIDAgc2hvdWxkIHByZWRpY3Qgd2VsbC4gIElmIGl0J3MgYXNzdW1lZAorICAge3lwLHlzaXplfSB3aWxsIHVzdWFsbHkgaGF2ZSBhIHJhbmRvbSBudW1iZXIgb2YgYml0cyB0aGVuIHRoZSBoaWdoIGxpbWIKKyAgIHdvbid0IGJlIGZ1bGwgYW5kIGEgY2Fycnkgb3V0IHdpbGwgb2NjdXIgYSBnb29kIGRlYWwgbGVzcyB0aGFuIDUwJSBvZiB0aGUKKyAgIHRpbWUuCisKKyAgIHlzaXplPT0wIGlzbid0IGEgZG9jdW1lbnRlZCBmZWF0dXJlLCBidXQgaXMgdXNlZCBpbnRlcm5hbGx5IGluIGEgZmV3CisgICBwbGFjZXMuCisKKyAgIFByb2R1Y2luZyBjb3V0IGxhc3Qgc3RvcHMgaXQgdXNpbmcgdXAgYSByZWdpc3RlciBkdXJpbmcgdGhlIG1haW4gcGFydCBvZgorICAgdGhlIGNhbGN1bGF0aW9uLCB0aG91Z2ggZ2NjIChhcyBvZiAzLjApIG9uIGFuICJpZiAobXBuX2FkZCAoLi4uKSkiCisgICBkb2Vzbid0IHNlZW0gYWJsZSB0byBtb3ZlIHRoZSB0cnVlIGFuZCBmYWxzZSBsZWdzIG9mIHRoZSBjb25kaXRpb25hbCB1cAorICAgdG8gdGhlIHR3byBwbGFjZXMgY291dCBpcyBnZW5lcmF0ZWQuICAqLworCisjZGVmaW5lIF9fR01QTl9BT1JTKGNvdXQsIHdwLCB4cCwgeHNpemUsIHlwLCB5c2l6ZSwgRlVOQ1RJT04sIFRFU1QpICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfc2l6ZV90ICBfX2dtcF9pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfbGltYl90ICBfX2dtcF94OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQVNTRVJUICgoeXNpemUpID49IDApOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQVNTRVJUICgoeHNpemUpID49ICh5c2l6ZSkpOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURTJfUCAod3AsIHhzaXplLCB4cCwgeHNpemUpKTsgKi8gICAgICBcCisgICAgLyogQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURTJfUCAod3AsIHhzaXplLCB5cCwgeXNpemUpKTsgKi8gICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19nbXBfaSA9ICh5c2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fZ21wX2kgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChGVU5DVElPTiAod3AsIHhwLCB5cCwgX19nbXBfaSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKF9fZ21wX2kgPj0gKHhzaXplKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIChjb3V0KSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGdvdG8gX19nbXBfZG9uZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19nbXBfeCA9ICh4cClbX19nbXBfaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3aGlsZSAoVEVTVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCh3cCkgIT0gKHhwKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfX0dNUE5fQ09QWV9SRVNUICh3cCwgeHAsIHhzaXplLCBfX2dtcF9pKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGNvdXQpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fZ21wX2RvbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19HTVBOX0FERChjb3V0LCB3cCwgeHAsIHhzaXplLCB5cCwgeXNpemUpICAgICAgICAgICAgICBcCisgIF9fR01QTl9BT1JTIChjb3V0LCB3cCwgeHAsIHhzaXplLCB5cCwgeXNpemUsIG1wbl9hZGRfbiwgICAgICAgXAorICAgICAgICAgICAgICAgKCgod3ApW19fZ21wX2krK10gPSAoX19nbXBfeCArIDEpICYgR01QX05VTUJfTUFTSykgPT0gMCkpCisjZGVmaW5lIF9fR01QTl9TVUIoY291dCwgd3AsIHhwLCB4c2l6ZSwgeXAsIHlzaXplKSAgICAgICAgICAgICAgXAorICBfX0dNUE5fQU9SUyAoY291dCwgd3AsIHhwLCB4c2l6ZSwgeXAsIHlzaXplLCBtcG5fc3ViX24sICAgICAgIFwKKyAgICAgICAgICAgICAgICgoKHdwKVtfX2dtcF9pKytdID0gKF9fZ21wX3ggLSAxKSAmIEdNUF9OVU1CX01BU0spLCBfX2dtcF94ID09IDApKQorCisKKy8qIFRoZSB1c2Ugb2YgX19nbXBfaSBpbmRleGluZyBpcyBkZXNpZ25lZCB0byBlbnN1cmUgYSBjb21waWxlIHRpbWUgc3JjPT1kc3QKKyAgIHJlbWFpbnMgbmljZSBhbmQgY2xlYXIgdG8gdGhlIGNvbXBpbGVyLCBzbyB0aGF0IF9fR01QTl9DT1BZX1JFU1QgY2FuCisgICBkaXNhcHBlYXIsIGFuZCB0aGUgbG9hZC9hZGQvc3RvcmUgZ2V0cyBhIGNoYW5jZSB0byBiZWNvbWUgYQorICAgcmVhZC1tb2RpZnktd3JpdGUgb24gQ0lTQyBDUFVzLgorCisgICBBbHRlcm5hdGl2ZXM6CisKKyAgIFVzaW5nIGEgcGFpciBvZiBwb2ludGVycyBpbnN0ZWFkIG9mIGluZGV4aW5nIHdvdWxkIGJlIHBvc3NpYmxlLCBidXQgZ2NjCisgICBpc24ndCBhYmxlIHRvIHJlY29nbmlzZSBjb21waWxlLXRpbWUgc3JjPT1kc3QgaW4gdGhhdCBjYXNlLCBldmVuIHdoZW4gdGhlCisgICBwb2ludGVycyBhcmUgaW5jcmVtZW50ZWQgbW9yZSBvciBsZXNzIHRvZ2V0aGVyLiAgT3RoZXIgY29tcGlsZXJzIHdvdWxkCisgICB2ZXJ5IGxpa2VseSBoYXZlIHNpbWlsYXIgZGlmZmljdWx0eS4KKworICAgZ2NjIGNvdWxkIHVzZSAiaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNyYz09ZHN0KSAmJiBzcmM9PWRzdCkiIG9yCisgICBzaW1pbGFyIHRvIGRldGVjdCBhIGNvbXBpbGUtdGltZSBzcmM9PWRzdC4gIFRoaXMgd29ya3MgbmljZWx5IG9uIGdjYworICAgMi45NS54LCBpdCdzIG5vdCBnb29kIG9uIGdjYyAzLjAgd2hlcmUgX19idWlsdGluX2NvbnN0YW50X3AocD09cCkgc2VlbXMKKyAgIHRvIGJlIGFsd2F5cyBmYWxzZSwgZm9yIGEgcG9pbnRlciBwLiAgQnV0IHRoZSBjdXJyZW50IGNvZGUgZm9ybSBzZWVtcworICAgZ29vZCBlbm91Z2ggZm9yIHNyYz09ZHN0IGFueXdheS4KKworICAgZ2NjIG9uIHg4NiBhcyB1c3VhbCBkb2Vzbid0IGdpdmUgcGFydGljdWxhcmx5IGdvb2QgZmxhZ3MgaGFuZGxpbmcgZm9yIHRoZQorICAgY2FycnkvYm9ycm93IGRldGVjdGlvbi4gIEl0J3MgdGVtcHRpbmcgdG8gd2FudCBzb21lIG11bHRpIGluc3RydWN0aW9uIGFzbQorICAgYmxvY2tzIHRvIGhlbHAgaXQsIGFuZCB0aGlzIHdhcyB0cmllZCwgYnV0IGluIHRydXRoIHRoZXJlJ3Mgb25seSBhIGZldworICAgaW5zdHJ1Y3Rpb25zIHRvIHNhdmUgYW5kIGFueSBnYWluIGlzIGFsbCB0b28gZWFzaWx5IGxvc3QgYnkgcmVnaXN0ZXIKKyAgIGp1Z2dsaW5nIHNldHRpbmcgdXAgZm9yIHRoZSBhc20uICAqLworCisjaWYgR01QX05BSUxfQklUUyA9PSAwCisjZGVmaW5lIF9fR01QTl9BT1JTXzEoY291dCwgZHN0LCBzcmMsIG4sIHYsIE9QLCBDQikJCVwKKyAgZG8gewkJCQkJCQkJXAorICAgIG1wX3NpemVfdCAgX19nbXBfaTsJCQkJCQlcCisgICAgbXBfbGltYl90ICBfX2dtcF94LCBfX2dtcF9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQlcCisgICAgLyogQVNTRVJUICgobikgPj0gMSk7ICovCQkJCQlcCisgICAgLyogQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChkc3QsIHNyYywgbikpOyAqLwlcCisJCQkJCQkJCVwKKyAgICBfX2dtcF94ID0gKHNyYylbMF07CQkJCQkJXAorICAgIF9fZ21wX3IgPSBfX2dtcF94IE9QICh2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoZHN0KVswXSA9IF9fZ21wX3I7CQkJCQkJXAorICAgIGlmIChDQiAoX19nbXBfciwgX19nbXBfeCwgKHYpKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsJCQkJCQkJCVwKKwkoY291dCkgPSAxOwkJCQkJCVwKKwlmb3IgKF9fZ21wX2kgPSAxOyBfX2dtcF9pIDwgKG4pOykgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgIHsJCQkJCQkJXAorCSAgICBfX2dtcF94ID0gKHNyYylbX19nbXBfaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICBfX2dtcF9yID0gX19nbXBfeCBPUCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAoZHN0KVtfX2dtcF9pXSA9IF9fZ21wX3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICArK19fZ21wX2k7CQkJCQkJXAorCSAgICBpZiAoIUNCIChfX2dtcF9yLCBfX2dtcF94LCAxKSkgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgIHsJCQkJCQkJXAorCQlpZiAoKHNyYykgIT0gKGRzdCkpCQkJCVwKKwkJICBfX0dNUE5fQ09QWV9SRVNUIChkc3QsIHNyYywgbiwgX19nbXBfaSk7ICAgICAgXAorCQkoY291dCkgPSAwOwkJCQkJXAorCQlicmVhazsJCQkJCQlcCisJICAgICAgfQkJCQkJCQlcCisJICB9CQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCVwKKyAgICBlbHNlCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCVwKKwlpZiAoKHNyYykgIT0gKGRzdCkpCQkJCQlcCisJICBfX0dNUE5fQ09QWV9SRVNUIChkc3QsIHNyYywgbiwgMSk7CQkJXAorCShjb3V0KSA9IDA7CQkJCQkJXAorICAgICAgfQkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiBHTVBfTkFJTF9CSVRTID49IDEKKyNkZWZpbmUgX19HTVBOX0FPUlNfMShjb3V0LCBkc3QsIHNyYywgbiwgdiwgT1AsIENCKQkJXAorICBkbyB7CQkJCQkJCQlcCisgICAgbXBfc2l6ZV90ICBfX2dtcF9pOwkJCQkJCVwKKyAgICBtcF9saW1iX3QgIF9fZ21wX3gsIF9fZ21wX3I7CQkJCVwKKwkJCQkJCQkJXAorICAgIC8qIEFTU0VSVCAoKG4pID49IDEpOyAqLwkJCQkJXAorICAgIC8qIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAoZHN0LCBzcmMsIG4pKTsgKi8JXAorCQkJCQkJCQlcCisgICAgX19nbXBfeCA9IChzcmMpWzBdOwkJCQkJCVwKKyAgICBfX2dtcF9yID0gX19nbXBfeCBPUCAodik7CQkJCQlcCisgICAgKGRzdClbMF0gPSBfX2dtcF9yICYgR01QX05VTUJfTUFTSzsJCQkJXAorICAgIGlmIChfX2dtcF9yID4+IEdNUF9OVU1CX0JJVFMgIT0gMCkJCQkJXAorICAgICAgewkJCQkJCQkJXAorCShjb3V0KSA9IDE7CQkJCQkJXAorCWZvciAoX19nbXBfaSA9IDE7IF9fZ21wX2kgPCAobik7KQkJCVwKKwkgIHsJCQkJCQkJXAorCSAgICBfX2dtcF94ID0gKHNyYylbX19nbXBfaV07CQkJCVwKKwkgICAgX19nbXBfciA9IF9fZ21wX3ggT1AgMTsJCQkJXAorCSAgICAoZHN0KVtfX2dtcF9pXSA9IF9fZ21wX3IgJiBHTVBfTlVNQl9NQVNLOwkJXAorCSAgICArK19fZ21wX2k7CQkJCQkJXAorCSAgICBpZiAoX19nbXBfciA+PiBHTVBfTlVNQl9CSVRTID09IDApCQkJXAorCSAgICAgIHsJCQkJCQkJXAorCQlpZiAoKHNyYykgIT0gKGRzdCkpCQkJCVwKKwkJICBfX0dNUE5fQ09QWV9SRVNUIChkc3QsIHNyYywgbiwgX19nbXBfaSk7CVwKKwkJKGNvdXQpID0gMDsJCQkJCVwKKwkJYnJlYWs7CQkJCQkJXAorCSAgICAgIH0JCQkJCQkJXAorCSAgfQkJCQkJCQlcCisgICAgICB9CQkJCQkJCQlcCisgICAgZWxzZQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQlcCisJaWYgKChzcmMpICE9IChkc3QpKQkJCQkJXAorCSAgX19HTVBOX0NPUFlfUkVTVCAoZHN0LCBzcmMsIG4sIDEpOwkJCVwKKwkoY291dCkgPSAwOwkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIF9fR01QTl9BRERDQihyLHgseSkgKChyKSA8ICh5KSkKKyNkZWZpbmUgX19HTVBOX1NVQkNCKHIseCx5KSAoKHgpIDwgKHkpKQorCisjZGVmaW5lIF9fR01QTl9BRERfMShjb3V0LCBkc3QsIHNyYywgbiwgdikJICAgICBcCisgIF9fR01QTl9BT1JTXzEoY291dCwgZHN0LCBzcmMsIG4sIHYsICssIF9fR01QTl9BRERDQikKKyNkZWZpbmUgX19HTVBOX1NVQl8xKGNvdXQsIGRzdCwgc3JjLCBuLCB2KQkgICAgIFwKKyAgX19HTVBOX0FPUlNfMShjb3V0LCBkc3QsIHNyYywgbiwgdiwgLSwgX19HTVBOX1NVQkNCKQorCisKKy8qIENvbXBhcmUge3hwLHNpemV9IGFuZCB7eXAsc2l6ZX0sIHNldHRpbmcgInJlc3VsdCIgdG8gcG9zaXRpdmUsIHplcm8gb3IKKyAgIG5lZ2F0aXZlLiAgc2l6ZT09MCBpcyBhbGxvd2VkLiAgT24gcmFuZG9tIGRhdGEgdXN1YWxseSBvbmx5IG9uZSBsaW1iIHdpbGwKKyAgIG5lZWQgdG8gYmUgZXhhbWluZWQgdG8gZ2V0IGEgcmVzdWx0LCBzbyBpdCdzIHdvcnRoIGhhdmluZyBpdCBpbmxpbmUuICAqLworI2RlZmluZSBfX0dNUE5fQ01QKHJlc3VsdCwgeHAsIHlwLCBzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX3NpemVfdCAgX19nbXBfaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX2xpbWJfdCAgX19nbXBfeCwgX19nbXBfeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoKHNpemUpID49IDApOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChyZXN1bHQpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fZ21wX2kgPSAoc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlICgtLV9fZ21wX2kgPj0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2dtcF94ID0gKHhwKVtfX2dtcF9pXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2dtcF95ID0gKHlwKVtfX2dtcF9pXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoX19nbXBfeCAhPSBfX2dtcF95KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgLyogQ2Fubm90IHVzZSBfX2dtcF94IC0gX19nbXBfeSwgbWF5IG92ZXJmbG93IGFuICJpbnQiICovICAgXAorICAgICAgICAgICAgKHJlc3VsdCkgPSAoX19nbXBfeCA+IF9fZ21wX3kgPyAxIDogLTEpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisKKyNpZiBkZWZpbmVkIChfX0dNUE5fQ09QWSkgJiYgISBkZWZpbmVkIChfX0dNUE5fQ09QWV9SRVNUKQorI2RlZmluZSBfX0dNUE5fQ09QWV9SRVNUKGRzdCwgc3JjLCBzaXplLCBzdGFydCkgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQVNTRVJUICgoc3RhcnQpID49IDApOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoKHN0YXJ0KSA8PSAoc2l6ZSkpOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0dNUE5fQ09QWSAoKGRzdCkrKHN0YXJ0KSwgKHNyYykrKHN0YXJ0KSwgKHNpemUpLShzdGFydCkpOyBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogQ29weSB7c3JjLHNpemV9IHRvIHtkc3Qsc2l6ZX0sIHN0YXJ0aW5nIGF0ICJzdGFydCIuICBUaGlzIGlzIGRlc2lnbmVkIHRvCisgICBrZWVwIHRoZSBpbmRleGluZyBkc3Rbal0gYW5kIHNyY1tqXSBuaWNlIGFuZCBzaW1wbGUgZm9yIF9fR01QTl9BRERfMSwKKyAgIF9fR01QTl9BREQsIGV0Yy4gICovCisjaWYgISBkZWZpbmVkIChfX0dNUE5fQ09QWV9SRVNUKQorI2RlZmluZSBfX0dNUE5fQ09QWV9SRVNUKGRzdCwgc3JjLCBzaXplLCBzdGFydCkgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfc2l6ZV90IF9fZ21wX2o7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoKHNpemUpID49IDApOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKChzdGFydCkgPj0gMCk7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQVNTRVJUICgoc3RhcnQpIDw9IChzaXplKSk7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAoZHN0LCBzcmMsIHNpemUpKTsgKi8gICAgIFwKKyAgICBfX0dNUF9DUkFZX1ByYWdtYSAoIl9DUkkgaXZkZXAiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChfX2dtcF9qID0gKHN0YXJ0KTsgX19nbXBfaiA8IChzaXplKTsgX19nbXBfaisrKSAgICAgICAgXAorICAgICAgKGRzdClbX19nbXBfal0gPSAoc3JjKVtfX2dtcF9qXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBFbmhhbmNlbWVudDogVXNlIHNvbWUgb2YgdGhlIHNtYXJ0ZXIgY29kZSBmcm9tIGdtcC1pbXBsLmguICBNYXliZSB1c2UKKyAgIG1wbl9jb3B5aSBpZiB0aGVyZSdzIGEgbmF0aXZlIHZlcnNpb24sIGFuZCBpZiB3ZSBkb24ndCBtaW5kIGRlbWFuZGluZworICAgYmluYXJ5IGNvbXBhdGliaWxpdHkgZm9yIGl0IChvbiB0YXJnZXRzIHdoaWNoIHVzZSBpdCkuICAqLworCisjaWYgISBkZWZpbmVkIChfX0dNUE5fQ09QWSkKKyNkZWZpbmUgX19HTVBOX0NPUFkoZHN0LCBzcmMsIHNpemUpICAgX19HTVBOX0NPUFlfUkVTVCAoZHN0LCBzcmMsIHNpemUsIDApCisjZW5kaWYKKworCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX2FkZCkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9hZGQpCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK21wX2xpbWJfdAorbXBuX2FkZCAobXBfcHRyIF9fZ21wX3dwLCBtcF9zcmNwdHIgX19nbXBfeHAsIG1wX3NpemVfdCBfX2dtcF94c2l6ZSwgbXBfc3JjcHRyIF9fZ21wX3lwLCBtcF9zaXplX3QgX19nbXBfeXNpemUpCit7CisgIG1wX2xpbWJfdCAgX19nbXBfYzsKKyAgX19HTVBOX0FERCAoX19nbXBfYywgX19nbXBfd3AsIF9fZ21wX3hwLCBfX2dtcF94c2l6ZSwgX19nbXBfeXAsIF9fZ21wX3lzaXplKTsKKyAgcmV0dXJuIF9fZ21wX2M7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9hZGRfMSkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9hZGRfMSkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgorbXBfbGltYl90CittcG5fYWRkXzEgKG1wX3B0ciBfX2dtcF9kc3QsIG1wX3NyY3B0ciBfX2dtcF9zcmMsIG1wX3NpemVfdCBfX2dtcF9zaXplLCBtcF9saW1iX3QgX19nbXBfbikgX19HTVBfTk9USFJPVworeworICBtcF9saW1iX3QgIF9fZ21wX2M7CisgIF9fR01QTl9BRERfMSAoX19nbXBfYywgX19nbXBfZHN0LCBfX2dtcF9zcmMsIF9fZ21wX3NpemUsIF9fZ21wX24pOworICByZXR1cm4gX19nbXBfYzsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX2NtcCkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9jbXApCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK2ludAorbXBuX2NtcCAobXBfc3JjcHRyIF9fZ21wX3hwLCBtcF9zcmNwdHIgX19nbXBfeXAsIG1wX3NpemVfdCBfX2dtcF9zaXplKSBfX0dNUF9OT1RIUk9XCit7CisgIGludCBfX2dtcF9yZXN1bHQ7CisgIF9fR01QTl9DTVAgKF9fZ21wX3Jlc3VsdCwgX19nbXBfeHAsIF9fZ21wX3lwLCBfX2dtcF9zaXplKTsKKyAgcmV0dXJuIF9fZ21wX3Jlc3VsdDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX3N1YikKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9zdWIpCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK21wX2xpbWJfdAorbXBuX3N1YiAobXBfcHRyIF9fZ21wX3dwLCBtcF9zcmNwdHIgX19nbXBfeHAsIG1wX3NpemVfdCBfX2dtcF94c2l6ZSwgbXBfc3JjcHRyIF9fZ21wX3lwLCBtcF9zaXplX3QgX19nbXBfeXNpemUpCit7CisgIG1wX2xpbWJfdCAgX19nbXBfYzsKKyAgX19HTVBOX1NVQiAoX19nbXBfYywgX19nbXBfd3AsIF9fZ21wX3hwLCBfX2dtcF94c2l6ZSwgX19nbXBfeXAsIF9fZ21wX3lzaXplKTsKKyAgcmV0dXJuIF9fZ21wX2M7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9zdWJfMSkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9zdWJfMSkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgorbXBfbGltYl90CittcG5fc3ViXzEgKG1wX3B0ciBfX2dtcF9kc3QsIG1wX3NyY3B0ciBfX2dtcF9zcmMsIG1wX3NpemVfdCBfX2dtcF9zaXplLCBtcF9saW1iX3QgX19nbXBfbikgX19HTVBfTk9USFJPVworeworICBtcF9saW1iX3QgIF9fZ21wX2M7CisgIF9fR01QTl9TVUJfMSAoX19nbXBfYywgX19nbXBfZHN0LCBfX2dtcF9zcmMsIF9fZ21wX3NpemUsIF9fZ21wX24pOworICByZXR1cm4gX19nbXBfYzsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX25lZykKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9uZWcpCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK21wX2xpbWJfdAorbXBuX25lZyAobXBfcHRyIF9fZ21wX3JwLCBtcF9zcmNwdHIgX19nbXBfdXAsIG1wX3NpemVfdCBfX2dtcF9uKQoreworICBtcF9saW1iX3QgX19nbXBfdWwsIF9fZ21wX2N5OworICBfX2dtcF9jeSA9IDA7CisgIGRvIHsKKyAgICAgIF9fZ21wX3VsID0gKl9fZ21wX3VwKys7CisgICAgICAqX19nbXBfcnArKyA9IC1fX2dtcF91bCAtIF9fZ21wX2N5OworICAgICAgX19nbXBfY3kgfD0gX19nbXBfdWwgIT0gMDsKKyAgfSB3aGlsZSAoLS1fX2dtcF9uICE9IDApOworICByZXR1cm4gX19nbXBfY3k7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKworLyogQWxsb3cgZmFzdGVyIHRlc3RpbmcgZm9yIG5lZ2F0aXZlLCB6ZXJvLCBhbmQgcG9zaXRpdmUuICAqLworI2RlZmluZSBtcHpfc2duKFopICgoWiktPl9tcF9zaXplIDwgMCA/IC0xIDogKFopLT5fbXBfc2l6ZSA+IDApCisjZGVmaW5lIG1wZl9zZ24oRikgKChGKS0+X21wX3NpemUgPCAwID8gLTEgOiAoRiktPl9tcF9zaXplID4gMCkKKyNkZWZpbmUgbXBxX3NnbihRKSAoKFEpLT5fbXBfbnVtLl9tcF9zaXplIDwgMCA/IC0xIDogKFEpLT5fbXBfbnVtLl9tcF9zaXplID4gMCkKKworLyogV2hlbiB1c2luZyBHQ0MsIG9wdGltaXplIGNlcnRhaW4gY29tbW9uIGNvbXBhcmlzb25zLiAgKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gMgorI2RlZmluZSBtcHpfY21wX3VpKFosVUkpIFwKKyAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChVSSkgJiYgKFVJKSA9PSAwCQkJCVwKKyAgID8gbXB6X3NnbiAoWikgOiBfbXB6X2NtcF91aSAoWixVSSkpCisjZGVmaW5lIG1wel9jbXBfc2koWixTSSkgXAorICAoX19idWlsdGluX2NvbnN0YW50X3AgKFNJKSAmJiAoU0kpID09IDAgPyBtcHpfc2duIChaKQkJCVwKKyAgIDogX19idWlsdGluX2NvbnN0YW50X3AgKFNJKSAmJiAoU0kpID4gMAkJCQlcCisgICAgPyBfbXB6X2NtcF91aSAoWiwgX19HTVBfQ0FTVCAodW5zaWduZWQgbG9uZyBpbnQsIFNJKSkJCVwKKyAgIDogX21wel9jbXBfc2kgKFosU0kpKQorI2RlZmluZSBtcHFfY21wX3VpKFEsTlVJLERVSSkgXAorICAoX19idWlsdGluX2NvbnN0YW50X3AgKE5VSSkgJiYgKE5VSSkgPT0gMAkJCQlcCisgICA/IG1wcV9zZ24gKFEpIDogX21wcV9jbXBfdWkgKFEsTlVJLERVSSkpCisjZGVmaW5lIG1wcV9jbXBfc2kocSxuLGQpICAgICAgICAgICAgICAgICAgICAgICBcCisgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoKG4pID49IDApICYmIChuKSA+PSAwICBcCisgICA/IG1wcV9jbXBfdWkgKHEsIF9fR01QX0NBU1QgKHVuc2lnbmVkIGxvbmcsIG4pLCBkKSBcCisgICA6IF9tcHFfY21wX3NpIChxLCBuLCBkKSkKKyNlbHNlCisjZGVmaW5lIG1wel9jbXBfdWkoWixVSSkgX21wel9jbXBfdWkgKFosVUkpCisjZGVmaW5lIG1wel9jbXBfc2koWixVSSkgX21wel9jbXBfc2kgKFosVUkpCisjZGVmaW5lIG1wcV9jbXBfdWkoUSxOVUksRFVJKSBfbXBxX2NtcF91aSAoUSxOVUksRFVJKQorI2RlZmluZSBtcHFfY21wX3NpKHEsbixkKSAgX21wcV9jbXBfc2kocSxuLGQpCisjZW5kaWYKKworCisvKiBVc2luZyAiJiIgcmF0aGVyIHRoYW4gIiYmIiBtZWFucyB0aGVzZSBjYW4gY29tZSBvdXQgYnJhbmNoLWZyZWUuICBFdmVyeQorICAgbXB6X3QgaGFzIGF0IGxlYXN0IG9uZSBsaW1iIGFsbG9jYXRlZCwgc28gZmV0Y2hpbmcgdGhlIGxvdyBsaW1iIGlzIGFsd2F5cworICAgYWxsb3dlZC4gICovCisjZGVmaW5lIG1wel9vZGRfcCh6KSAgICgoKHopLT5fbXBfc2l6ZSAhPSAwKSAmIF9fR01QX0NBU1QgKGludCwgKHopLT5fbXBfZFswXSkpCisjZGVmaW5lIG1wel9ldmVuX3AoeikgICghIG1wel9vZGRfcCAoeikpCisKKworLyoqKioqKioqKioqKioqKiogQysrIHJvdXRpbmVzICoqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworX19HTVBfREVDTFNQRUNfWFggc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0gJiwgbXB6X3NyY3B0cik7CitfX0dNUF9ERUNMU1BFQ19YWCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgKHN0ZDo6b3N0cmVhbSAmLCBtcHFfc3JjcHRyKTsKK19fR01QX0RFQ0xTUEVDX1hYIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCAoc3RkOjpvc3RyZWFtICYsIG1wZl9zcmNwdHIpOworX19HTVBfREVDTFNQRUNfWFggc3RkOjppc3RyZWFtJiBvcGVyYXRvcj4+IChzdGQ6OmlzdHJlYW0gJiwgbXB6X3B0cik7CitfX0dNUF9ERUNMU1BFQ19YWCBzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yPj4gKHN0ZDo6aXN0cmVhbSAmLCBtcHFfcHRyKTsKK19fR01QX0RFQ0xTUEVDX1hYIHN0ZDo6aXN0cmVhbSYgb3BlcmF0b3I+PiAoc3RkOjppc3RyZWFtICYsIG1wZl9wdHIpOworI2VuZGlmCisKKworLyogU291cmNlLWxldmVsIGNvbXBhdGliaWxpdHkgd2l0aCBHTVAgMiBhbmQgZWFybGllci4gKi8KKyNkZWZpbmUgbXBuX2Rpdm1vZChxcCxucCxuc2l6ZSxkcCxkc2l6ZSkgXAorICBtcG5fZGl2cmVtIChxcCwgX19HTVBfQ0FTVCAobXBfc2l6ZV90LCAwKSwgbnAsIG5zaXplLCBkcCwgZHNpemUpCisKKy8qIFNvdXJjZS1sZXZlbCBjb21wYXRpYmlsaXR5IHdpdGggR01QIDEuICAqLworI2RlZmluZSBtcHpfbWRpdgltcHpfZmRpdl9xCisjZGVmaW5lIG1wel9tZGl2bW9kCW1wel9mZGl2X3FyCisjZGVmaW5lIG1wel9tbW9kCW1wel9mZGl2X3IKKyNkZWZpbmUgbXB6X21kaXZfdWkJbXB6X2ZkaXZfcV91aQorI2RlZmluZSBtcHpfbWRpdm1vZF91aShxLHIsbixkKSBcCisgICgoKHIpID09IDApID8gbXB6X2ZkaXZfcV91aSAocSxuLGQpIDogbXB6X2ZkaXZfcXJfdWkgKHEscixuLGQpKQorI2RlZmluZSBtcHpfbW1vZF91aShyLG4sZCkgXAorICAoKChyKSA9PSAwKSA/IG1wel9mZGl2X3VpIChuLGQpIDogbXB6X2ZkaXZfcl91aSAocixuLGQpKQorCisvKiBVc2VmdWwgc3lub255bXMsIGJ1dCBub3QgcXVpdGUgY29tcGF0aWJsZSB3aXRoIEdNUCAxLiAgKi8KKyNkZWZpbmUgbXB6X2RpdgkJbXB6X2ZkaXZfcQorI2RlZmluZSBtcHpfZGl2bW9kCW1wel9mZGl2X3FyCisjZGVmaW5lIG1wel9kaXZfdWkJbXB6X2ZkaXZfcV91aQorI2RlZmluZSBtcHpfZGl2bW9kX3VpCW1wel9mZGl2X3FyX3VpCisjZGVmaW5lIG1wel9kaXZfMmV4cAltcHpfZmRpdl9xXzJleHAKKyNkZWZpbmUgbXB6X21vZF8yZXhwCW1wel9mZGl2X3JfMmV4cAorCitlbnVtCit7CisgIEdNUF9FUlJPUl9OT05FID0gMCwKKyAgR01QX0VSUk9SX1VOU1VQUE9SVEVEX0FSR1VNRU5UID0gMSwKKyAgR01QX0VSUk9SX0RJVklTSU9OX0JZX1pFUk8gPSAyLAorICBHTVBfRVJST1JfU1FSVF9PRl9ORUdBVElWRSA9IDQsCisgIEdNUF9FUlJPUl9JTlZBTElEX0FSR1VNRU5UID0gOAorfTsKKworLyogRGVmaW5lIENDIGFuZCBDRkxBR1Mgd2hpY2ggd2VyZSB1c2VkIHRvIGJ1aWxkIHRoaXMgdmVyc2lvbiBvZiBHTVAgKi8KKyNkZWZpbmUgX19HTVBfQ0MgIi9kaXNrNC9jaGgvQU9TUC9tYXN0ZXIvcHJlYnVpbHRzL2djYy9saW51eC14ODYvaG9zdC94ODZfNjQtbGludXgtZ2xpYmMyLjExLTQuOC9iaW4veDg2XzY0LWxpbnV4LWdjYyAtc3RkPWdudTk5IgorI2RlZmluZSBfX0dNUF9DRkxBR1MgIi1PMiAtcGVkYW50aWMgLW02NCAtbXR1bmU9azggLW1hcmNoPWs4IgorCisvKiBNYWpvciB2ZXJzaW9uIG51bWJlciBpcyB0aGUgdmFsdWUgb2YgX19HTlVfTVBfXyB0b28sIGFib3ZlIGFuZCBpbiBtcC5oLiAqLworI2RlZmluZSBfX0dOVV9NUF9WRVJTSU9OIDUKKyNkZWZpbmUgX19HTlVfTVBfVkVSU0lPTl9NSU5PUiAwCisjZGVmaW5lIF9fR05VX01QX1ZFUlNJT05fUEFUQ0hMRVZFTCA1CisjZGVmaW5lIF9fR05VX01QX1JFTEVBU0UgKF9fR05VX01QX1ZFUlNJT04gKiAxMDAwMCArIF9fR05VX01QX1ZFUlNJT05fTUlOT1IgKiAxMDAgKyBfX0dOVV9NUF9WRVJTSU9OX1BBVENITEVWRUwpCisKKyNkZWZpbmUgX19HTVBfSF9fCisjZW5kaWYgLyogX19HTVBfSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9hZmYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2FmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTE2YzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9hZmYuaApAQCAtMCwwICsxLDU2NiBAQAorI2lmbmRlZiBJU0xfQUZGX0gKKyNkZWZpbmUgSVNMX0FGRl9ICisKKyNpbmNsdWRlIDxpc2wvbG9jYWxfc3BhY2UuaD4KKyNpbmNsdWRlIDxpc2wvcHJpbnRlci5oPgorI2luY2x1ZGUgPGlzbC9zZXRfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9hZmZfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9saXN0Lmg+CisjaW5jbHVkZSA8aXNsL211bHRpLmg+CisjaW5jbHVkZSA8aXNsL3VuaW9uX3NldF90eXBlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX3plcm9fb25fZG9tYWluKF9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpscyk7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfdmFyX29uX2RvbWFpbihfX2lzbF90YWtlIGlzbF9sb2NhbF9zcGFjZSAqbHMsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKKworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2NvcHkoX19pc2xfa2VlcCBpc2xfYWZmICphZmYpOwordm9pZCAqaXNsX2FmZl9mcmVlKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmKTsKKworaXNsX2N0eCAqaXNsX2FmZl9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmKTsKKworaW50IGlzbF9hZmZfZGltKF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK2ludCBpc2xfYWZmX2ludm9sdmVzX2RpbXMoX19pc2xfa2VlcCBpc2xfYWZmICphZmYsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2FmZl9nZXRfZG9tYWluX3NwYWNlKF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfYWZmX2dldF9zcGFjZShfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZik7CitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2FmZl9nZXRfZG9tYWluX2xvY2FsX3NwYWNlKAorCV9faXNsX2tlZXAgaXNsX2FmZiAqYWZmKTsKK19faXNsX2dpdmUgaXNsX2xvY2FsX3NwYWNlICppc2xfYWZmX2dldF9sb2NhbF9zcGFjZShfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZik7CisKK2NvbnN0IGNoYXIgKmlzbF9hZmZfZ2V0X2RpbV9uYW1lKF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitpbnQgaXNsX2FmZl9nZXRfY29uc3RhbnQoX19pc2xfa2VlcCBpc2xfYWZmICphZmYsIGlzbF9pbnQgKnYpOworaW50IGlzbF9hZmZfZ2V0X2NvZWZmaWNpZW50KF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGludCBwb3MsIGlzbF9pbnQgKnYpOworaW50IGlzbF9hZmZfZ2V0X2Rlbm9taW5hdG9yKF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmLCBpc2xfaW50ICp2KTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9zZXRfY29uc3RhbnQoX19pc2xfdGFrZSBpc2xfYWZmICphZmYsIGlzbF9pbnQgdik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfc2V0X2NvbnN0YW50X3NpKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLCBpbnQgdik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfc2V0X2NvZWZmaWNpZW50KF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGludCBwb3MsIGlzbF9pbnQgdik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfc2V0X2NvZWZmaWNpZW50X3NpKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGludCBwb3MsIGludCB2KTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9zZXRfZGVub21pbmF0b3IoX19pc2xfdGFrZSBpc2xfYWZmICphZmYsIGlzbF9pbnQgdik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfYWRkX2NvbnN0YW50KF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLCBpc2xfaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2FkZF9jb25zdGFudF9zaShfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwgaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2FkZF9jb25zdGFudF9udW0oX19pc2xfdGFrZSBpc2xfYWZmICphZmYsCisJaXNsX2ludCB2KTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9hZGRfY29uc3RhbnRfbnVtX3NpKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLCBpbnQgdik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfYWRkX2NvZWZmaWNpZW50KF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGludCBwb3MsIGlzbF9pbnQgdik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfYWRkX2NvZWZmaWNpZW50X3NpKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGludCBwb3MsIGludCB2KTsKKworaW50IGlzbF9hZmZfaXNfY3N0KF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmKTsKKworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX3NldF9kaW1fbmFtZShfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGNvbnN0IGNoYXIgKnMpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX3NldF9kaW1faWQoX19pc2xfdGFrZSBpc2xfYWZmICphZmYsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBfX2lzbF90YWtlIGlzbF9pZCAqaWQpOworCitpbnQgaXNsX2FmZl9wbGFpbl9pc19lcXVhbChfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZjEsIF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmMik7CitpbnQgaXNsX2FmZl9wbGFpbl9pc196ZXJvKF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmKTsKKworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2dldF9kaXYoX19pc2xfa2VlcCBpc2xfYWZmICphZmYsIGludCBwb3MpOworCitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfbmVnKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmKTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9jZWlsKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmKTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9mbG9vcihfX2lzbF90YWtlIGlzbF9hZmYgKmFmZik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfbW9kKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLCBpc2xfaW50IG1vZCk7CisKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9tdWwoX19pc2xfdGFrZSBpc2xfYWZmICphZmYxLAorCV9faXNsX3Rha2UgaXNsX2FmZiAqYWZmMik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfZGl2KF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmMSwKKwlfX2lzbF90YWtlIGlzbF9hZmYgKmFmZjIpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2FkZChfX2lzbF90YWtlIGlzbF9hZmYgKmFmZjEsCisJX19pc2xfdGFrZSBpc2xfYWZmICphZmYyKTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9zdWIoX19pc2xfdGFrZSBpc2xfYWZmICphZmYxLAorCV9faXNsX3Rha2UgaXNsX2FmZiAqYWZmMik7CisKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9zY2FsZShfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwgaXNsX2ludCBmKTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9zY2FsZV9kb3duKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLCBpc2xfaW50IGYpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX3NjYWxlX2Rvd25fdWkoX19pc2xfdGFrZSBpc2xfYWZmICphZmYsIHVuc2lnbmVkIGYpOworCitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfaW5zZXJ0X2RpbXMoX19pc2xfdGFrZSBpc2xfYWZmICphZmYsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2FkZF9kaW1zKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2Ryb3BfZGltcyhfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfcHJvamVjdF9kb21haW5fb25fcGFyYW1zKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmKTsKKworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2FsaWduX3BhcmFtcyhfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqbW9kZWwpOworCitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfZ2lzdChfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2dpc3RfcGFyYW1zKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLAorCV9faXNsX3Rha2UgaXNsX3NldCAqY29udGV4dCk7CisKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9wdWxsYmFja19tdWx0aV9hZmYoX19pc2xfdGFrZSBpc2xfYWZmICphZmYsCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYSk7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2FmZl96ZXJvX2Jhc2ljX3NldChfX2lzbF90YWtlIGlzbF9hZmYgKmFmZik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9hZmZfbmVnX2Jhc2ljX3NldChfX2lzbF90YWtlIGlzbF9hZmYgKmFmZik7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2FmZl9sZV9iYXNpY19zZXQoX19pc2xfdGFrZSBpc2xfYWZmICphZmYxLAorCV9faXNsX3Rha2UgaXNsX2FmZiAqYWZmMik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9hZmZfZ2VfYmFzaWNfc2V0KF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmMSwKKwlfX2lzbF90YWtlIGlzbF9hZmYgKmFmZjIpOworCitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfcmVhZF9mcm9tX3N0cihpc2xfY3R4ICpjdHgsIGNvbnN0IGNoYXIgKnN0cik7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9hZmYoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZik7Cit2b2lkIGlzbF9hZmZfZHVtcChfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZik7CisKK2lzbF9jdHggKmlzbF9wd19hZmZfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9wd19hZmYgKnB3YWZmKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfcHdfYWZmX2dldF9kb21haW5fc3BhY2UoX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwd2FmZik7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3B3X2FmZl9nZXRfc3BhY2UoX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwd2FmZik7CisKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9mcm9tX2FmZihfX2lzbF90YWtlIGlzbF9hZmYgKmFmZik7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfZW1wdHkoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfYWxsb2MoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJX19pc2xfdGFrZSBpc2xfYWZmICphZmYpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX3plcm9fb25fZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpscyk7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfdmFyX29uX2RvbWFpbihfX2lzbF90YWtlIGlzbF9sb2NhbF9zcGFjZSAqbHMsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfc2V0X2luZGljYXRvcl9mdW5jdGlvbihfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK2NvbnN0IGNoYXIgKmlzbF9wd19hZmZfZ2V0X2RpbV9uYW1lKF9faXNsX2tlZXAgaXNsX3B3X2FmZiAqcGEsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK2ludCBpc2xfcHdfYWZmX2hhc19kaW1faWQoX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9wd19hZmZfZ2V0X2RpbV9pZChfX2lzbF9rZWVwIGlzbF9wd19hZmYgKnBhLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfc2V0X2RpbV9pZChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnBtYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIF9faXNsX3Rha2UgaXNsX2lkICppZCk7CisKK2ludCBpc2xfcHdfYWZmX2lzX2VtcHR5KF9faXNsX2tlZXAgaXNsX3B3X2FmZiAqcHdhZmYpOworaW50IGlzbF9wd19hZmZfcGxhaW5faXNfZXF1YWwoX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwd2FmZjEsCisJX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwd2FmZjIpOworCitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfdW5pb25fbWluKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYxLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYyKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl91bmlvbl9tYXgoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjIpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX3VuaW9uX2FkZChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMik7CisKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9jb3B5KF9faXNsX2tlZXAgaXNsX3B3X2FmZiAqcHdhZmYpOwordm9pZCAqaXNsX3B3X2FmZl9mcmVlKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYpOworCit1bnNpZ25lZCBpc2xfcHdfYWZmX2RpbShfX2lzbF9rZWVwIGlzbF9wd19hZmYgKnB3YWZmLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK2ludCBpc2xfcHdfYWZmX2ludm9sdmVzX2RpbXMoX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwd2FmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CisKK2ludCBpc2xfcHdfYWZmX2lzX2NzdChfX2lzbF9rZWVwIGlzbF9wd19hZmYgKnB3YWZmKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX2FsaWduX3BhcmFtcyhfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmLAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICptb2RlbCk7CisKK19faXNsX2dpdmUgaXNsX2lkICppc2xfcHdfYWZmX2dldF90dXBsZV9pZChfX2lzbF9rZWVwIGlzbF9wd19hZmYgKnBhLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX3NldF90dXBsZV9pZChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIF9faXNsX3Rha2UgaXNsX2lkICppZCk7CisKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl9kb21haW4oX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZik7CisKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9taW4oX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjIpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX21heChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMik7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfbXVsKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYxLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYyKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9kaXYoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwYTEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwYTIpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX2FkZChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMik7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfc3ViKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYxLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYyKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9uZWcoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZik7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfY2VpbChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9mbG9vcihfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9tb2QoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZiwKKwlpc2xfaW50IG1vZCk7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfdGRpdl9xKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcGExLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcGEyKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl90ZGl2X3IoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwYTEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwYTIpOworCitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfaW50ZXJzZWN0X3BhcmFtcyhfX2lzbF90YWtlIGlzbF9wd19hZmYgKnBhLAorCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9pbnRlcnNlY3RfZG9tYWluKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcGEsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworCitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfY29uZChfX2lzbF90YWtlIGlzbF9wd19hZmYgKmNvbmQsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZl90cnVlLCBfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmX2ZhbHNlKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX3NjYWxlKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYsCisJaXNsX2ludCBmKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9zY2FsZV9kb3duKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYsCisJaXNsX2ludCBmKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX2luc2VydF9kaW1zKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX2FkZF9kaW1zKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfZHJvcF9kaW1zKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworCitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfY29hbGVzY2UoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd3FwKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9naXN0KF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpjb250ZXh0KTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9naXN0X3BhcmFtcyhfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmLAorCV9faXNsX3Rha2UgaXNsX3NldCAqY29udGV4dCk7CisKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9wdWxsYmFja19tdWx0aV9hZmYoCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwYSwgX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYSk7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfcHVsbGJhY2tfcHdfbXVsdGlfYWZmKAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcGEsIF9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hKTsKKworaW50IGlzbF9wd19hZmZfbl9waWVjZShfX2lzbF9rZWVwIGlzbF9wd19hZmYgKnB3YWZmKTsKK2ludCBpc2xfcHdfYWZmX2ZvcmVhY2hfcGllY2UoX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwd2FmZiwKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsIF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLAorCQkgICAgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworCitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZnJvbV9wd19hZmYoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZnJvbV9wd19hZmYoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZik7CisKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl9ub25uZWdfc2V0KF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfYWZmX3plcm9fc2V0KF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfYWZmX25vbl96ZXJvX3NldChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmKTsKKworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfYWZmX2VxX3NldChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9wd19hZmZfbmVfc2V0KF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYxLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYyKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl9sZV9zZXQoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjIpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfYWZmX2x0X3NldChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9wd19hZmZfZ2Vfc2V0KF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYxLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYyKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl9ndF9zZXQoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjIpOworCitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfcmVhZF9mcm9tX3N0cihpc2xfY3R4ICpjdHgsIGNvbnN0IGNoYXIgKnN0cik7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9wd19hZmYoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlfX2lzbF9rZWVwIGlzbF9wd19hZmYgKnB3YWZmKTsKK3ZvaWQgaXNsX3B3X2FmZl9kdW1wKF9faXNsX2tlZXAgaXNsX3B3X2FmZiAqcHdhZmYpOworCitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfbGlzdF9taW4oX19pc2xfdGFrZSBpc2xfcHdfYWZmX2xpc3QgKmxpc3QpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX2xpc3RfbWF4KF9faXNsX3Rha2UgaXNsX3B3X2FmZl9saXN0ICpsaXN0KTsKKworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfYWZmX2xpc3RfZXFfc2V0KF9faXNsX3Rha2UgaXNsX3B3X2FmZl9saXN0ICpsaXN0MSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmZfbGlzdCAqbGlzdDIpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfYWZmX2xpc3RfbmVfc2V0KF9faXNsX3Rha2UgaXNsX3B3X2FmZl9saXN0ICpsaXN0MSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmZfbGlzdCAqbGlzdDIpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfYWZmX2xpc3RfbGVfc2V0KF9faXNsX3Rha2UgaXNsX3B3X2FmZl9saXN0ICpsaXN0MSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmZfbGlzdCAqbGlzdDIpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfYWZmX2xpc3RfbHRfc2V0KF9faXNsX3Rha2UgaXNsX3B3X2FmZl9saXN0ICpsaXN0MSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmZfbGlzdCAqbGlzdDIpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfYWZmX2xpc3RfZ2Vfc2V0KF9faXNsX3Rha2UgaXNsX3B3X2FmZl9saXN0ICpsaXN0MSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmZfbGlzdCAqbGlzdDIpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfYWZmX2xpc3RfZ3Rfc2V0KF9faXNsX3Rha2UgaXNsX3B3X2FmZl9saXN0ICpsaXN0MSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmZfbGlzdCAqbGlzdDIpOworCitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfZnJvbV9hZmYoX19pc2xfdGFrZSBpc2xfYWZmICphZmYpOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX3plcm8oX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNwYWNlKTsKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9pZGVudGl0eShfX2lzbF90YWtlIGlzbF9zcGFjZSAqc3BhY2UpOworCitpc2xfY3R4ICppc2xfbXVsdGlfYWZmX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfbXVsdGlfYWZmICptYWZmKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfbXVsdGlfYWZmX2dldF9zcGFjZShfX2lzbF9rZWVwIGlzbF9tdWx0aV9hZmYgKm1hZmYpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9tdWx0aV9hZmZfZ2V0X2RvbWFpbl9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9tdWx0aV9hZmYgKm1hZmYpOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX3NldF90dXBsZV9uYW1lKAorCV9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWFmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBjb25zdCBjaGFyICpzKTsKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9zZXRfdHVwbGVfaWQoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIF9faXNsX3Rha2UgaXNsX2lkICppZCk7CitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfY29weShfX2lzbF9rZWVwIGlzbF9tdWx0aV9hZmYgKm1hZmYpOwordm9pZCAqaXNsX211bHRpX2FmZl9mcmVlKF9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWFmZik7CisKK3Vuc2lnbmVkIGlzbF9tdWx0aV9hZmZfZGltKF9faXNsX2tlZXAgaXNsX211bHRpX2FmZiAqbWFmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX211bHRpX2FmZl9nZXRfYWZmKF9faXNsX2tlZXAgaXNsX211bHRpX2FmZiAqbXVsdGksCisJaW50IHBvcyk7CisKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9pbnNlcnRfZGltcygKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9hZGRfZGltcyhfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX2Ryb3BfZGltcygKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hZmYsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworCitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfc2V0X2RpbV9uYW1lKAorCV9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWFmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGNvbnN0IGNoYXIgKnMpOworCitpbnQgaXNsX211bHRpX2FmZl9wbGFpbl9pc19lcXVhbChfX2lzbF9rZWVwIGlzbF9tdWx0aV9hZmYgKm1hZmYxLAorCV9faXNsX2tlZXAgaXNsX211bHRpX2FmZiAqbWFmZjIpOworCitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfYWRkKF9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWFmZjEsCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYWZmMik7CisKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9zY2FsZShfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hZmYsCisJaXNsX2ludCBmKTsKKworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX3JhbmdlX3NwbGljZSgKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hMSwgdW5zaWduZWQgcG9zLAorCV9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWEyKTsKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9zcGxpY2UoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTEsIHVuc2lnbmVkIGluX3BvcywgdW5zaWduZWQgb3V0X3BvcywKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hMik7CitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfcmFuZ2VfcHJvZHVjdCgKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hMSwgX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTIpOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX2ZsYXRfcmFuZ2VfcHJvZHVjdCgKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hMSwgX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTIpOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX3Byb2R1Y3QoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTEsIF9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWEyKTsKKworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX2FsaWduX3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm11bHRpLCBfX2lzbF90YWtlIGlzbF9zcGFjZSAqbW9kZWwpOworCitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfZ2lzdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYWZmLCBfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX2dpc3QoX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYWZmLAorCV9faXNsX3Rha2UgaXNsX3NldCAqY29udGV4dCk7CisKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9saWZ0KF9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWFmZiwKKwlfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqKmxzKTsKKworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX3B1bGxiYWNrX211bHRpX2FmZigKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hMSwgX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTIpOworCitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9tdWx0aV9hZmZfbGV4X2xlX3NldChfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hMSwKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hMik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9tdWx0aV9hZmZfbGV4X2dlX3NldChfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hMSwKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hMik7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X211bHRpX2FmZihfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCV9faXNsX2tlZXAgaXNsX211bHRpX2FmZiAqbWFmZik7CisKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9yZWFkX2Zyb21fc3RyKGlzbF9jdHggKmN0eCwKKwkJY29uc3QgY2hhciAqc3RyKTsKK3ZvaWQgaXNsX211bHRpX2FmZl9kdW1wKF9faXNsX2tlZXAgaXNsX211bHRpX2FmZiAqbWFmZik7CisKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9pZGVudGl0eSgKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqc3BhY2UpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX2Zyb21fbXVsdGlfYWZmKAorCV9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWEpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX2FsbG9jKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCV9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWFmZik7CitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfY29weSgKKwlfX2lzbF9rZWVwIGlzbF9wd19tdWx0aV9hZmYgKnBtYSk7Cit2b2lkICppc2xfcHdfbXVsdGlfYWZmX2ZyZWUoX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEpOworCit1bnNpZ25lZCBpc2xfcHdfbXVsdGlfYWZmX2RpbShfX2lzbF9rZWVwIGlzbF9wd19tdWx0aV9hZmYgKnBtYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X211bHRpX2FmZl9nZXRfcHdfYWZmKAorCV9faXNsX2tlZXAgaXNsX3B3X211bHRpX2FmZiAqcG1hLCBpbnQgcG9zKTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9zZXRfcHdfYWZmKAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hLCB1bnNpZ25lZCBwb3MsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwYSk7CisKK2lzbF9jdHggKmlzbF9wd19tdWx0aV9hZmZfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9wd19tdWx0aV9hZmYgKnBtYSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3B3X211bHRpX2FmZl9nZXRfZG9tYWluX3NwYWNlKAorCV9faXNsX2tlZXAgaXNsX3B3X211bHRpX2FmZiAqcG1hKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfcHdfbXVsdGlfYWZmX2dldF9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9wd19tdWx0aV9hZmYgKnBtYSk7CitpbnQgaXNsX3B3X211bHRpX2FmZl9oYXNfdHVwbGVfbmFtZShfX2lzbF9rZWVwIGlzbF9wd19tdWx0aV9hZmYgKnBtYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK2NvbnN0IGNoYXIgKmlzbF9wd19tdWx0aV9hZmZfZ2V0X3R1cGxlX25hbWUoX19pc2xfa2VlcCBpc2xfcHdfbXVsdGlfYWZmICpwbWEsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX3B3X211bHRpX2FmZl9nZXRfdHVwbGVfaWQoCisJX19pc2xfa2VlcCBpc2xfcHdfbXVsdGlfYWZmICpwbWEsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworaW50IGlzbF9wd19tdWx0aV9hZmZfaGFzX3R1cGxlX2lkKF9faXNsX2tlZXAgaXNsX3B3X211bHRpX2FmZiAqcG1hLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX3NldF90dXBsZV9pZCgKKwlfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBfX2lzbF90YWtlIGlzbF9pZCAqaWQpOworCitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfZHJvcF9kaW1zKAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKKworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfbXVsdGlfYWZmX2RvbWFpbihfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYSk7CisKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9lbXB0eShfX2lzbF90YWtlIGlzbF9zcGFjZSAqc3BhY2UpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX2Zyb21fZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworY29uc3QgY2hhciAqaXNsX3B3X211bHRpX2FmZl9nZXRfZGltX25hbWUoX19pc2xfa2VlcCBpc2xfcHdfbXVsdGlfYWZmICpwbWEsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX2lkICppc2xfcHdfbXVsdGlfYWZmX2dldF9kaW1faWQoCisJX19pc2xfa2VlcCBpc2xfcHdfbXVsdGlfYWZmICpwbWEsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsCisJdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9zZXRfZGltX2lkKAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgX19pc2xfdGFrZSBpc2xfaWQgKmlkKTsKKworaW50IGlzbF9wd19tdWx0aV9hZmZfcGxhaW5faXNfZXF1YWwoX19pc2xfa2VlcCBpc2xfcHdfbXVsdGlfYWZmICpwbWExLAorCV9faXNsX2tlZXAgaXNsX3B3X211bHRpX2FmZiAqcG1hMik7CisKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl91bmlvbl9hZGQoCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWExLCBfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYTIpOworCitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfYWRkKAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hMSwgX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX3VuaW9uX2xleG1pbigKKwlfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYTEsCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEyKTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl91bmlvbl9sZXhtYXgoCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWExLAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hMik7CisKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9yYW5nZV9wcm9kdWN0KAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hMSwgX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEyKTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9mbGF0X3JhbmdlX3Byb2R1Y3QoCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWExLCBfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYTIpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX3Byb2R1Y3QoCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWExLCBfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYTIpOworCitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfaW50ZXJzZWN0X3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYSwgX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX2ludGVyc2VjdF9kb21haW4oCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEsIF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX3Byb2plY3RfZG9tYWluX29uX3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYSk7CisKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9hbGlnbl9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEsIF9faXNsX3Rha2UgaXNsX3NwYWNlICptb2RlbCk7CisKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9jb2FsZXNjZSgKKwlfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYSk7CitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfZ2lzdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEsIF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9naXN0KAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hLCBfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9wdWxsYmFja19tdWx0aV9hZmYoCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEsIF9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWEpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX3B1bGxiYWNrX3B3X211bHRpX2FmZigKKwlfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYTEsIF9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hMik7CisKK2ludCBpc2xfcHdfbXVsdGlfYWZmX2ZvcmVhY2hfcGllY2UoX19pc2xfa2VlcCBpc2xfcHdfbXVsdGlfYWZmICpwbWEsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LCBfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hZmYsCisJCSAgICB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CisKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9mcm9tX3B3X211bHRpX2FmZihfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYSk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZnJvbV9wd19tdWx0aV9hZmYoX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEpOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9wd19tdWx0aV9hZmYoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlfX2lzbF9rZWVwIGlzbF9wd19tdWx0aV9hZmYgKnBtYSk7CisKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9mcm9tX3NldChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfZnJvbV9tYXAoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworCitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfcmVhZF9mcm9tX3N0cihpc2xfY3R4ICpjdHgsCisJY29uc3QgY2hhciAqc3RyKTsKK3ZvaWQgaXNsX3B3X211bHRpX2FmZl9kdW1wKF9faXNsX2tlZXAgaXNsX3B3X211bHRpX2FmZiAqcG1hKTsKKworCitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19tdWx0aV9hZmYgKmlzbF91bmlvbl9wd19tdWx0aV9hZmZfZW1wdHkoCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNwYWNlKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X211bHRpX2FmZiAqaXNsX3VuaW9uX3B3X211bHRpX2FmZl9mcm9tX2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICppc2xfdW5pb25fcHdfbXVsdGlfYWZmX2NvcHkoCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICp1cG1hKTsKK3ZvaWQgKmlzbF91bmlvbl9wd19tdWx0aV9hZmZfZnJlZShfX2lzbF90YWtlIGlzbF91bmlvbl9wd19tdWx0aV9hZmYgKnVwbWEpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19tdWx0aV9hZmYgKmlzbF91bmlvbl9wd19tdWx0aV9hZmZfYWRkX3B3X211bHRpX2FmZigKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19tdWx0aV9hZmYgKnVwbWEsCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEpOworCitpc2xfY3R4ICppc2xfdW5pb25fcHdfbXVsdGlfYWZmX2dldF9jdHgoCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICp1cG1hKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfdW5pb25fcHdfbXVsdGlfYWZmX2dldF9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9wd19tdWx0aV9hZmYgKnVwbWEpOworCitpbnQgaXNsX3VuaW9uX3B3X211bHRpX2FmZl9mb3JlYWNoX3B3X211bHRpX2FmZigKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9wd19tdWx0aV9hZmYgKnVwbWEsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hLCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3B3X211bHRpX2FmZl9kb21haW4oCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICp1cG1hKTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICppc2xfdW5pb25fcHdfbXVsdGlfYWZmX2FkZCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19tdWx0aV9hZmYgKnVwbWExLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X211bHRpX2FmZiAqdXBtYTIpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19tdWx0aV9hZmYgKmlzbF91bmlvbl9wd19tdWx0aV9hZmZfZmxhdF9yYW5nZV9wcm9kdWN0KAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X211bHRpX2FmZiAqdXBtYTEsCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICp1cG1hMik7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9mcm9tX3VuaW9uX3B3X211bHRpX2FmZigKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19tdWx0aV9hZmYgKnVwbWEpOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF91bmlvbl9wd19tdWx0aV9hZmYoCisJX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwgX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICp1cG1hKTsKKworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfcHdfYWZmICppc2xfbXVsdGlfcHdfYWZmX3plcm8oX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNwYWNlKTsKK19faXNsX2dpdmUgaXNsX211bHRpX3B3X2FmZiAqaXNsX211bHRpX3B3X2FmZl9pZGVudGl0eSgKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqc3BhY2UpOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfcHdfYWZmICppc2xfbXVsdGlfcHdfYWZmX2Zyb21fcHdfYWZmKAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcGEpOworCitpc2xfY3R4ICppc2xfbXVsdGlfcHdfYWZmX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfbXVsdGlfcHdfYWZmICptcGEpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9tdWx0aV9wd19hZmZfZ2V0X3NwYWNlKAorCV9faXNsX2tlZXAgaXNsX211bHRpX3B3X2FmZiAqbXBhKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfbXVsdGlfcHdfYWZmX2dldF9kb21haW5fc3BhY2UoCisJX19pc2xfa2VlcCBpc2xfbXVsdGlfcHdfYWZmICptcGEpOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfcHdfYWZmICppc2xfbXVsdGlfcHdfYWZmX3NldF90dXBsZV9uYW1lKAorCV9faXNsX3Rha2UgaXNsX211bHRpX3B3X2FmZiAqbXBhLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKnMpOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfcHdfYWZmICppc2xfbXVsdGlfcHdfYWZmX2NvcHkoCisJX19pc2xfa2VlcCBpc2xfbXVsdGlfcHdfYWZmICptcGEpOwordm9pZCAqaXNsX211bHRpX3B3X2FmZl9mcmVlKF9faXNsX3Rha2UgaXNsX211bHRpX3B3X2FmZiAqbXBhKTsKKwordW5zaWduZWQgaXNsX211bHRpX3B3X2FmZl9kaW0oX19pc2xfa2VlcCBpc2xfbXVsdGlfcHdfYWZmICptcGEsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9tdWx0aV9wd19hZmZfZ2V0X3B3X2FmZigKKwlfX2lzbF9rZWVwIGlzbF9tdWx0aV9wd19hZmYgKm1wYSwgaW50IHBvcyk7CisKK19faXNsX2dpdmUgaXNsX211bHRpX3B3X2FmZiAqaXNsX211bHRpX3B3X2FmZl9pbnNlcnRfZGltcygKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9wd19hZmYgKm1wYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tdWx0aV9wd19hZmYgKmlzbF9tdWx0aV9wd19hZmZfYWRkX2RpbXMoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfcHdfYWZmICptcGEsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIG4pOworCitfX2lzbF9naXZlIGlzbF9tdWx0aV9wd19hZmYgKmlzbF9tdWx0aV9wd19hZmZfc2V0X2RpbV9uYW1lKAorCV9faXNsX3Rha2UgaXNsX211bHRpX3B3X2FmZiAqbXBhLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgY29uc3QgY2hhciAqcyk7CisKK19faXNsX2dpdmUgaXNsX211bHRpX3B3X2FmZiAqaXNsX211bHRpX3B3X2FmZl9yYW5nZV9zcGxpY2UoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfcHdfYWZmICptcGExLCB1bnNpZ25lZCBwb3MsCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfcHdfYWZmICptcGEyKTsKK19faXNsX2dpdmUgaXNsX211bHRpX3B3X2FmZiAqaXNsX211bHRpX3B3X2FmZl9zcGxpY2UoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfcHdfYWZmICptcGExLCB1bnNpZ25lZCBpbl9wb3MsIHVuc2lnbmVkIG91dF9wb3MsCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfcHdfYWZmICptcGEyKTsKK19faXNsX2dpdmUgaXNsX211bHRpX3B3X2FmZiAqaXNsX211bHRpX3B3X2FmZl9mbGF0X3JhbmdlX3Byb2R1Y3QoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfcHdfYWZmICptcGExLCBfX2lzbF90YWtlIGlzbF9tdWx0aV9wd19hZmYgKm1wYTIpOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfcHdfYWZmICppc2xfbXVsdGlfcHdfYWZmX3JhbmdlX3Byb2R1Y3QoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfcHdfYWZmICptcGExLCBfX2lzbF90YWtlIGlzbF9tdWx0aV9wd19hZmYgKm1wYTIpOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9tdWx0aV9wd19hZmYoCisJX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwgX19pc2xfa2VlcCBpc2xfbXVsdGlfcHdfYWZmICptcGEpOwordm9pZCBpc2xfbXVsdGlfcHdfYWZmX2R1bXAoX19pc2xfa2VlcCBpc2xfbXVsdGlfcHdfYWZmICptcGEpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjaW5jbHVkZSA8aXNsL2RpbS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2FmZl90eXBlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9hZmZfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzA4YzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9hZmZfdHlwZS5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgSVNMX0FGRl9UWVBFX0gKKyNkZWZpbmUgSVNMX0FGRl9UWVBFX0gKKworc3RydWN0IGlzbF9hZmY7Cit0eXBlZGVmIHN0cnVjdCBpc2xfYWZmIGlzbF9hZmY7CisKK3N0cnVjdCBpc2xfcHdfYWZmOwordHlwZWRlZiBzdHJ1Y3QgaXNsX3B3X2FmZiBpc2xfcHdfYWZmOworCitzdHJ1Y3QgaXNsX211bHRpX2FmZjsKK3R5cGVkZWYgc3RydWN0IGlzbF9tdWx0aV9hZmYgaXNsX211bHRpX2FmZjsKKworc3RydWN0IGlzbF9wd19tdWx0aV9hZmY7Cit0eXBlZGVmIHN0cnVjdCBpc2xfcHdfbXVsdGlfYWZmIGlzbF9wd19tdWx0aV9hZmY7CisKK3N0cnVjdCBpc2xfdW5pb25fcHdfbXVsdGlfYWZmOwordHlwZWRlZiBzdHJ1Y3QgaXNsX3VuaW9uX3B3X211bHRpX2FmZiBpc2xfdW5pb25fcHdfbXVsdGlfYWZmOworCitzdHJ1Y3QgaXNsX211bHRpX3B3X2FmZjsKK3R5cGVkZWYgc3RydWN0IGlzbF9tdWx0aV9wd19hZmYgaXNsX211bHRpX3B3X2FmZjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9hcmcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2FyZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZWU0NGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9hcmcuaApAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgS2F0aG9saWVrZSBVbml2ZXJzaXRlaXQgTGV1dmVuCisgKgorICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIE1JVCBsaWNlbnNlCisgKgorICogV3JpdHRlbiBieSBTdmVuIFZlcmRvb2xhZWdlLCBLLlUuTGV1dmVuLCBEZXBhcnRlbWVudAorICogQ29tcHV0ZXJ3ZXRlbnNjaGFwcGVuLCBDZWxlc3Rpam5lbmxhYW4gMjAwQSwgQi0zMDAxIExldXZlbiwgQmVsZ2l1bQorICovCisKKyNpZm5kZWYgSVNMX0FSR19ICisjZGVmaW5lIElTTF9BUkdfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGlzbF9hcmdfY2hvaWNlIHsKKwljb25zdCBjaGFyCSpuYW1lOworCXVuc2lnbmVkCSB2YWx1ZTsKK307CisKK3N0cnVjdCBpc2xfYXJnX2ZsYWdzIHsKKwljb25zdCBjaGFyCSpuYW1lOworCXVuc2lnbmVkCSBtYXNrOworCXVuc2lnbmVkCSB2YWx1ZTsKK307CisKK2VudW0gaXNsX2FyZ190eXBlIHsKKwlpc2xfYXJnX2VuZCwKKwlpc2xfYXJnX2FsaWFzLAorCWlzbF9hcmdfYXJnLAorCWlzbF9hcmdfYm9vbCwKKwlpc2xfYXJnX2NoaWxkLAorCWlzbF9hcmdfY2hvaWNlLAorCWlzbF9hcmdfZmxhZ3MsCisJaXNsX2FyZ19mb290ZXIsCisJaXNsX2FyZ19pbnQsCisJaXNsX2FyZ191c2VyLAorCWlzbF9hcmdfbG9uZywKKwlpc2xfYXJnX3Vsb25nLAorCWlzbF9hcmdfc3RyLAorCWlzbF9hcmdfc3RyX2xpc3QsCisJaXNsX2FyZ192ZXJzaW9uCit9OworCitzdHJ1Y3QgaXNsX2FyZ3M7CisKK3N0cnVjdCBpc2xfYXJnIHsKKwllbnVtIGlzbF9hcmdfdHlwZQkgdHlwZTsKKwljaGFyCQkJIHNob3J0X25hbWU7CisJY29uc3QgY2hhcgkJKmxvbmdfbmFtZTsKKwljb25zdCBjaGFyCQkqYXJndW1lbnRfbmFtZTsKKwlzaXplX3QJCQkgb2Zmc2V0OworCWNvbnN0IGNoYXIJCSpoZWxwX21zZzsKKyNkZWZpbmUgSVNMX0FSR19TSU5HTEVfREFTSAkoMSA8PCAwKQorI2RlZmluZSBJU0xfQVJHX0JPT0xfQVJHCSgxIDw8IDEpCisjZGVmaW5lIElTTF9BUkdfSElEREVOCQkoMSA8PCAyKQorCXVuc2lnbmVkCQkgZmxhZ3M7CisJdW5pb24geworCXN0cnVjdCB7CisJCXN0cnVjdCBpc2xfYXJnX2Nob2ljZQkqY2hvaWNlOworCQl1bnNpZ25lZAkgCSBkZWZhdWx0X3ZhbHVlOworCQl1bnNpZ25lZAkgCSBkZWZhdWx0X3NlbGVjdGVkOworCQlpbnQgKCpzZXQpKHZvaWQgKm9wdCwgdW5zaWduZWQgdmFsKTsKKwl9IGNob2ljZTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaXNsX2FyZ19mbGFncwkqZmxhZ3M7CisJCXVuc2lnbmVkCSAJIGRlZmF1bHRfdmFsdWU7CisJfSBmbGFnczsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZAkJIGRlZmF1bHRfdmFsdWU7CisJCWludCAoKnNldCkodm9pZCAqb3B0LCB1bnNpZ25lZCB2YWwpOworCX0gYjsKKwlzdHJ1Y3QgeworCQlpbnQJCQlkZWZhdWx0X3ZhbHVlOworCX0gaTsKKwlzdHJ1Y3QgeworCQlsb25nCQkgCWRlZmF1bHRfdmFsdWU7CisJCWxvbmcJCSAJZGVmYXVsdF9zZWxlY3RlZDsKKwkJaW50ICgqc2V0KSh2b2lkICpvcHQsIGxvbmcgdmFsKTsKKwl9IGw7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZwkJZGVmYXVsdF92YWx1ZTsKKwl9IHVsOworCXN0cnVjdCB7CisJCWNvbnN0IGNoYXIJCSpkZWZhdWx0X3ZhbHVlOworCX0gc3RyOworCXN0cnVjdCB7CisJCXNpemVfdAkJCSBvZmZzZXRfbjsKKwl9IHN0cl9saXN0OworCXN0cnVjdCB7CisJCXN0cnVjdCBpc2xfYXJncwkJKmNoaWxkOworCX0gY2hpbGQ7CisJc3RydWN0IHsKKwkJdm9pZCAoKnByaW50X3ZlcnNpb24pKHZvaWQpOworCX0gdmVyc2lvbjsKKwlzdHJ1Y3QgeworCQlpbnQgKCppbml0KSh2b2lkKik7CisJCXZvaWQgKCpjbGVhcikodm9pZCopOworCX0gdXNlcjsKKwl9IHU7Cit9OworCitzdHJ1Y3QgaXNsX2FyZ3MgeworCXNpemVfdAkJCSBvcHRpb25zX3NpemU7CisJc3RydWN0IGlzbF9hcmcJCSphcmdzOworfTsKKworI2RlZmluZSBJU0xfQVJHU19TVEFSVChzLG5hbWUpCQkJCQkJXAorCXN0cnVjdCBpc2xfYXJnIG5hbWUgIyMgTElTVFtdOwkJCQkJXAorCXN0cnVjdCBpc2xfYXJncyBuYW1lID0geyBzaXplb2YocyksIG5hbWUgIyMgTElTVCB9OwkJXAorCXN0cnVjdCBpc2xfYXJnIG5hbWUgIyMgTElTVFtdID0geworI2RlZmluZSBJU0xfQVJHU19FTkQJCQkJCQkJXAorCXsgaXNsX2FyZ19lbmQgfSB9OworCisjZGVmaW5lIElTTF9BUkdfQUxJQVMobCkJewkJCQkJXAorCS50eXBlID0gaXNsX2FyZ19hbGlhcywJCQkJCQlcCisJLmxvbmdfbmFtZSA9IGwsCQkJCQkJCVwKK30sCisjZGVmaW5lIElTTF9BUkdfQVJHKHN0LGYsYSxkKQl7CQkJCQlcCisJLnR5cGUgPSBpc2xfYXJnX2FyZywJCQkJCQlcCisJLmFyZ3VtZW50X25hbWUgPSBhLAkJCQkJCVwKKwkub2Zmc2V0ID0gb2Zmc2V0b2Yoc3QsIGYpLAkJCQkJXAorCS51ID0geyAuc3RyID0geyAuZGVmYXVsdF92YWx1ZSA9IGQgfSB9CQkJCVwKK30sCisjZGVmaW5lIElTTF9BUkdfRk9PVEVSKGgpCXsJCQkJCVwKKwkudHlwZSA9IGlzbF9hcmdfZm9vdGVyLAkJCQkJCVwKKwkuaGVscF9tc2cgPSBoLAkJCQkJCQlcCit9LAorI2RlZmluZSBJU0xfQVJHX0NIT0lDRShzdCxmLHMsbCxjLGQsaCkJewkJCQlcCisJLnR5cGUgPSBpc2xfYXJnX2Nob2ljZSwJCQkJCQlcCisJLnNob3J0X25hbWUgPSBzLAkJCQkJCVwKKwkubG9uZ19uYW1lID0gbCwJCQkJCQkJXAorCS5vZmZzZXQgPSBvZmZzZXRvZihzdCwgZiksCQkJCQlcCisJLmhlbHBfbXNnID0gaCwJCQkJCQkJXAorCS51ID0geyAuY2hvaWNlID0geyAuY2hvaWNlID0gYywgLmRlZmF1bHRfdmFsdWUgPSBkLAkJXAorCQkJICAgIC5kZWZhdWx0X3NlbGVjdGVkID0gZCwgLnNldCA9IE5VTEwgfSB9CVwKK30sCisjZGVmaW5lIElTTF9BUkdfT1BUX0NIT0lDRShzdCxmLHMsbCxjLGQsZHMsaCkJewkJCVwKKwkudHlwZSA9IGlzbF9hcmdfY2hvaWNlLAkJCQkJCVwKKwkuc2hvcnRfbmFtZSA9IHMsCQkJCQkJXAorCS5sb25nX25hbWUgPSBsLAkJCQkJCQlcCisJLm9mZnNldCA9IG9mZnNldG9mKHN0LCBmKSwJCQkJCVwKKwkuaGVscF9tc2cgPSBoLAkJCQkJCQlcCisJLnUgPSB7IC5jaG9pY2UgPSB7IC5jaG9pY2UgPSBjLCAuZGVmYXVsdF92YWx1ZSA9IGQsCQlcCisJCQkgICAgLmRlZmF1bHRfc2VsZWN0ZWQgPSBkcywgLnNldCA9IE5VTEwgfSB9CVwKK30sCisjZGVmaW5lIElTTF9BUkdfVVNFUl9PUFRfQ0hPSUNFKHN0LGYscyxsLGMsc2V0dGVyLGQsZHMsaCkJewlcCisJLnR5cGUgPSBpc2xfYXJnX2Nob2ljZSwJCQkJCQlcCisJLnNob3J0X25hbWUgPSBzLAkJCQkJCVwKKwkubG9uZ19uYW1lID0gbCwJCQkJCQkJXAorCS5vZmZzZXQgPSBvZmZzZXRvZihzdCwgZiksCQkJCQlcCisJLmhlbHBfbXNnID0gaCwJCQkJCQkJXAorCS51ID0geyAuY2hvaWNlID0geyAuY2hvaWNlID0gYywgLmRlZmF1bHRfdmFsdWUgPSBkLAkJXAorCQkJICAgIC5kZWZhdWx0X3NlbGVjdGVkID0gZHMsIC5zZXQgPSBzZXR0ZXIgfSB9CVwKK30sCisjZGVmaW5lIF9JU0xfQVJHX0JPT0xfRihvLHMsbCxzZXR0ZXIsZCxoLGZsKQl7CQkJXAorCS50eXBlID0gaXNsX2FyZ19ib29sLAkJCQkJCVwKKwkuc2hvcnRfbmFtZSA9IHMsCQkJCQkJXAorCS5sb25nX25hbWUgPSBsLAkJCQkJCQlcCisJLm9mZnNldCA9IG8sCQkJCQkJCVwKKwkuaGVscF9tc2cgPSBoLAkJCQkJCQlcCisJLmZsYWdzID0gZmwsCQkJCQkJCVwKKwkudSA9IHsgLmIgPSB7IC5kZWZhdWx0X3ZhbHVlID0gZCwgLnNldCA9IHNldHRlciB9IH0JCVwKK30sCisjZGVmaW5lIElTTF9BUkdfQk9PTF9GKHN0LGYscyxsLGQsaCxmbCkJCQkJCVwKKwlfSVNMX0FSR19CT09MX0Yob2Zmc2V0b2Yoc3QsIGYpLHMsbCxOVUxMLGQsaCxmbCkKKyNkZWZpbmUgSVNMX0FSR19CT09MKHN0LGYscyxsLGQsaCkJCQkJCVwKKwlJU0xfQVJHX0JPT0xfRihzdCxmLHMsbCxkLGgsMCkKKyNkZWZpbmUgSVNMX0FSR19QSEFOVE9NX0JPT0xfRihzLGwsc2V0dGVyLGgsZmwpCQkJCVwKKwlfSVNMX0FSR19CT09MX0YoLTEscyxsLHNldHRlciwwLGgsZmwpCisjZGVmaW5lIElTTF9BUkdfUEhBTlRPTV9CT09MKHMsbCxzZXR0ZXIsaCkJCQkJXAorCUlTTF9BUkdfUEhBTlRPTV9CT09MX0YocyxsLHNldHRlcixoLDApCisjZGVmaW5lIElTTF9BUkdfSU5UX0Yoc3QsZixzLGwsYSxkLGgsZmwpCXsJCQlcCisJLnR5cGUgPSBpc2xfYXJnX2ludCwJCQkJCQlcCisJLnNob3J0X25hbWUgPSBzLAkJCQkJCVwKKwkubG9uZ19uYW1lID0gbCwJCQkJCQkJXAorCS5hcmd1bWVudF9uYW1lID0gYSwJCQkJCQlcCisJLm9mZnNldCA9IG9mZnNldG9mKHN0LCBmKSwJCQkJCVwKKwkuaGVscF9tc2cgPSBoLAkJCQkJCQlcCisJLmZsYWdzID0gZmwsCQkJCQkJCVwKKwkudSA9IHsgLnVsID0geyAuZGVmYXVsdF92YWx1ZSA9IGQgfSB9CQkJCVwKK30sCisjZGVmaW5lIElTTF9BUkdfSU5UKHN0LGYscyxsLGEsZCxoKQkJCQkJXAorCUlTTF9BUkdfSU5UX0Yoc3QsZixzLGwsYSxkLGgsMCkKKyNkZWZpbmUgSVNMX0FSR19MT05HKHN0LGYscyxsbyxkLGgpCXsJCQkJXAorCS50eXBlID0gaXNsX2FyZ19sb25nLAkJCQkJCVwKKwkuc2hvcnRfbmFtZSA9IHMsCQkJCQkJXAorCS5sb25nX25hbWUgPSBsbywJCQkJCQlcCisJLm9mZnNldCA9IG9mZnNldG9mKHN0LCBmKSwJCQkJCVwKKwkuaGVscF9tc2cgPSBoLAkJCQkJCQlcCisJLnUgPSB7IC5sID0geyAuZGVmYXVsdF92YWx1ZSA9IGQsIC5kZWZhdWx0X3NlbGVjdGVkID0gZCwJXAorCQkgICAgICAuc2V0ID0gTlVMTCB9IH0JCQkJCVwKK30sCisjZGVmaW5lIElTTF9BUkdfVVNFUl9MT05HKHN0LGYscyxsbyxzZXR0ZXIsZCxoKQl7CQkJXAorCS50eXBlID0gaXNsX2FyZ19sb25nLAkJCQkJCVwKKwkuc2hvcnRfbmFtZSA9IHMsCQkJCQkJXAorCS5sb25nX25hbWUgPSBsbywJCQkJCQlcCisJLm9mZnNldCA9IG9mZnNldG9mKHN0LCBmKSwJCQkJCVwKKwkuaGVscF9tc2cgPSBoLAkJCQkJCQlcCisJLnUgPSB7IC5sID0geyAuZGVmYXVsdF92YWx1ZSA9IGQsIC5kZWZhdWx0X3NlbGVjdGVkID0gZCwJXAorCQkgICAgICAuc2V0ID0gc2V0dGVyIH0gfQkJCQkJXAorfSwKKyNkZWZpbmUgSVNMX0FSR19PUFRfTE9ORyhzdCxmLHMsbG8sZCxkcyxoKQl7CQkJXAorCS50eXBlID0gaXNsX2FyZ19sb25nLAkJCQkJCVwKKwkuc2hvcnRfbmFtZSA9IHMsCQkJCQkJXAorCS5sb25nX25hbWUgPSBsbywJCQkJCQlcCisJLm9mZnNldCA9IG9mZnNldG9mKHN0LCBmKSwJCQkJCVwKKwkuaGVscF9tc2cgPSBoLAkJCQkJCQlcCisJLnUgPSB7IC5sID0geyAuZGVmYXVsdF92YWx1ZSA9IGQsIC5kZWZhdWx0X3NlbGVjdGVkID0gZHMsCVwKKwkJICAgICAgLnNldCA9IE5VTEwgfSB9CQkJCQlcCit9LAorI2RlZmluZSBJU0xfQVJHX1VMT05HKHN0LGYscyxsLGQsaCkJewkJCQlcCisJLnR5cGUgPSBpc2xfYXJnX3Vsb25nLAkJCQkJCVwKKwkuc2hvcnRfbmFtZSA9IHMsCQkJCQkJXAorCS5sb25nX25hbWUgPSBsLAkJCQkJCQlcCisJLm9mZnNldCA9IG9mZnNldG9mKHN0LCBmKSwJCQkJCVwKKwkuaGVscF9tc2cgPSBoLAkJCQkJCQlcCisJLnUgPSB7IC51bCA9IHsgLmRlZmF1bHRfdmFsdWUgPSBkIH0gfQkJCQlcCit9LAorI2RlZmluZSBJU0xfQVJHX1NUUl9GKHN0LGYscyxsLGEsZCxoLGZsKQl7CQkJXAorCS50eXBlID0gaXNsX2FyZ19zdHIsCQkJCQkJXAorCS5zaG9ydF9uYW1lID0gcywJCQkJCQlcCisJLmxvbmdfbmFtZSA9IGwsCQkJCQkJCVwKKwkuYXJndW1lbnRfbmFtZSA9IGEsCQkJCQkJXAorCS5vZmZzZXQgPSBvZmZzZXRvZihzdCwgZiksCQkJCQlcCisJLmhlbHBfbXNnID0gaCwJCQkJCQkJXAorCS5mbGFncyA9IGZsLAkJCQkJCQlcCisJLnUgPSB7IC5zdHIgPSB7IC5kZWZhdWx0X3ZhbHVlID0gZCB9IH0JCQkJXAorfSwKKyNkZWZpbmUgSVNMX0FSR19TVFIoc3QsZixzLGwsYSxkLGgpCQkJCQlcCisJSVNMX0FSR19TVFJfRihzdCxmLHMsbCxhLGQsaCwwKQorI2RlZmluZSBJU0xfQVJHX1NUUl9MSVNUKHN0LGZfbixmX2wscyxsLGEsaCkJewkJCVwKKwkudHlwZSA9IGlzbF9hcmdfc3RyX2xpc3QsCQkJCQlcCisJLnNob3J0X25hbWUgPSBzLAkJCQkJCVwKKwkubG9uZ19uYW1lID0gbCwJCQkJCQkJXAorCS5hcmd1bWVudF9uYW1lID0gYSwJCQkJCQlcCisJLm9mZnNldCA9IG9mZnNldG9mKHN0LCBmX2wpLAkJCQkJXAorCS5oZWxwX21zZyA9IGgsCQkJCQkJCVwKKwkudSA9IHsgLnN0cl9saXN0ID0geyAub2Zmc2V0X24gPSBvZmZzZXRvZihzdCwgZl9uKSB9IH0JCVwKK30sCisjZGVmaW5lIF9JU0xfQVJHX0NISUxEKG8sbCxjLGgsZmwpCXsJCQkJXAorCS50eXBlID0gaXNsX2FyZ19jaGlsZCwJCQkJCQlcCisJLmxvbmdfbmFtZSA9IGwsCQkJCQkJCVwKKwkub2Zmc2V0ID0gbywJCQkJCQkJXAorCS5oZWxwX21zZyA9IGgsCQkJCQkJCVwKKwkuZmxhZ3MgPSBmbCwJCQkJCQkJXAorCS51ID0geyAuY2hpbGQgPSB7IC5jaGlsZCA9IGMgfSB9CQkJCVwKK30sCisjZGVmaW5lIElTTF9BUkdfQ0hJTEQoc3QsZixsLGMsaCkJCQkJCVwKKwlfSVNMX0FSR19DSElMRChvZmZzZXRvZihzdCwgZiksbCxjLGgsMCkKKyNkZWZpbmUgSVNMX0FSR19HUk9VUF9GKGMsaCxmbCkJCQkJCQlcCisJX0lTTF9BUkdfQ0hJTEQoLTEsTlVMTCxjLGgsZmwpCisjZGVmaW5lIElTTF9BUkdfR1JPVVAoYyxoKQkJCQkJCVwKKwlJU0xfQVJHX0dST1VQX0YoYyxoLDApCisjZGVmaW5lIElTTF9BUkdfRkxBR1Moc3QsZixzLGwsYyxkLGgpCXsJCQkJXAorCS50eXBlID0gaXNsX2FyZ19mbGFncywJCQkJCQlcCisJLnNob3J0X25hbWUgPSBzLAkJCQkJCVwKKwkubG9uZ19uYW1lID0gbCwJCQkJCQkJXAorCS5vZmZzZXQgPSBvZmZzZXRvZihzdCwgZiksCQkJCQlcCisJLmhlbHBfbXNnID0gaCwJCQkJCQkJXAorCS51ID0geyAuZmxhZ3MgPSB7IC5mbGFncyA9IGMsIC5kZWZhdWx0X3ZhbHVlID0gZCB9IH0JCVwKK30sCisjZGVmaW5lIElTTF9BUkdfVVNFUihzdCxmLGksYykgewkJCQkJXAorCS50eXBlID0gaXNsX2FyZ191c2VyLAkJCQkJCVwKKwkub2Zmc2V0ID0gb2Zmc2V0b2Yoc3QsIGYpLAkJCQkJXAorCS51ID0geyAudXNlciA9IHsgLmluaXQgPSBpLCAuY2xlYXIgPSBjfSB9CQkJXAorfSwKKyNkZWZpbmUgSVNMX0FSR19WRVJTSU9OKHByaW50KSB7CQkJCQlcCisJLnR5cGUgPSBpc2xfYXJnX3ZlcnNpb24sCQkJCQlcCisJLnUgPSB7IC52ZXJzaW9uID0geyAucHJpbnRfdmVyc2lvbiA9IHByaW50IH0gfQkJCVwKK30sCisKKyNkZWZpbmUgSVNMX0FSR19BTEwJCSgxIDw8IDApCisjZGVmaW5lIElTTF9BUkdfU0tJUF9IRUxQCSgxIDw8IDEpCisKK3ZvaWQgaXNsX2FyZ3Nfc2V0X2RlZmF1bHRzKHN0cnVjdCBpc2xfYXJncyAqYXJncywgdm9pZCAqb3B0KTsKK3ZvaWQgaXNsX2FyZ3NfZnJlZShzdHJ1Y3QgaXNsX2FyZ3MgKmFyZ3MsIHZvaWQgKm9wdCk7CitpbnQgaXNsX2FyZ3NfcGFyc2Uoc3RydWN0IGlzbF9hcmdzICphcmdzLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHZvaWQgKm9wdCwKKwl1bnNpZ25lZCBmbGFncyk7CisKKyNkZWZpbmUgSVNMX0FSR19ERUNMKHByZWZpeCxzdCxhcmdzKQkJCQkJXAorZXh0ZXJuIHN0cnVjdCBpc2xfYXJncyBhcmdzOwkJCQkJCVwKK3N0ICpwcmVmaXggIyMgX25ld193aXRoX2RlZmF1bHRzKHZvaWQpOwkJCQkJXAordm9pZCBwcmVmaXggIyMgX2ZyZWUoc3QgKm9wdCk7CQkJCQkJXAoraW50IHByZWZpeCAjIyBfcGFyc2Uoc3QgKm9wdCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCB1bnNpZ25lZCBmbGFncyk7CisKKyNkZWZpbmUgSVNMX0FSR19ERUYocHJlZml4LHN0LGFyZ3MpCQkJCQlcCitzdCAqcHJlZml4ICMjIF9uZXdfd2l0aF9kZWZhdWx0cygpCQkJCQlcCit7CQkJCQkJCQkJXAorCXN0ICpvcHQgPSAoc3QgKiljYWxsb2MoMSwgc2l6ZW9mKHN0KSk7CQkJCVwKKwlpZiAob3B0KQkJCQkJCQlcCisJCWlzbF9hcmdzX3NldF9kZWZhdWx0cygmKGFyZ3MpLCBvcHQpOwkJCVwKKwlyZXR1cm4gb3B0OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAordm9pZCBwcmVmaXggIyMgX2ZyZWUoc3QgKm9wdCkJCQkJCQlcCit7CQkJCQkJCQkJXAorCWlzbF9hcmdzX2ZyZWUoJihhcmdzKSwgb3B0KTsJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitpbnQgcHJlZml4ICMjIF9wYXJzZShzdCAqb3B0LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHVuc2lnbmVkIGZsYWdzKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBpc2xfYXJnc19wYXJzZSgmKGFyZ3MpLCBhcmdjLCBhcmd2LCBvcHQsIGZsYWdzKTsJCVwKK30KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9hc3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2FzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZmU0NTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9hc3QuaApAQCAtMCwwICsxLDE4MyBAQAorI2lmbmRlZiBJU0xfQVNUX0gKKyNkZWZpbmUgSVNMX0FTVF9ICisKKyNpbmNsdWRlIDxpc2wvY3R4Lmg+CisjaW5jbHVkZSA8aXNsL2lkLmg+CisjaW5jbHVkZSA8aXNsL2xpc3QuaD4KKyNpbmNsdWRlIDxpc2wvcHJpbnRlci5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBpc2xfYXN0X2V4cHI7Cit0eXBlZGVmIHN0cnVjdCBpc2xfYXN0X2V4cHIgaXNsX2FzdF9leHByOworCitzdHJ1Y3QgaXNsX2FzdF9ub2RlOwordHlwZWRlZiBzdHJ1Y3QgaXNsX2FzdF9ub2RlIGlzbF9hc3Rfbm9kZTsKKworZW51bSBpc2xfYXN0X29wX3R5cGUgeworCWlzbF9hc3Rfb3BfZXJyb3IgPSAtMSwKKwlpc2xfYXN0X29wX2FuZCwKKwlpc2xfYXN0X29wX2FuZF90aGVuLAorCWlzbF9hc3Rfb3Bfb3IsCisJaXNsX2FzdF9vcF9vcl9lbHNlLAorCWlzbF9hc3Rfb3BfbWF4LAorCWlzbF9hc3Rfb3BfbWluLAorCWlzbF9hc3Rfb3BfbWludXMsCisJaXNsX2FzdF9vcF9hZGQsCisJaXNsX2FzdF9vcF9zdWIsCisJaXNsX2FzdF9vcF9tdWwsCisJaXNsX2FzdF9vcF9kaXYsCisJaXNsX2FzdF9vcF9mZGl2X3EsCS8qIFJvdW5kIHRvd2FyZHMgLWluZnR5ICovCisJaXNsX2FzdF9vcF9wZGl2X3EsCS8qIERpdmlkZW5kIGlzIG5vbi1uZWdhdGl2ZSAqLworCWlzbF9hc3Rfb3BfcGRpdl9yLAkvKiBEaXZpZGVuZCBpcyBub24tbmVnYXRpdmUgKi8KKwlpc2xfYXN0X29wX2NvbmQsCisJaXNsX2FzdF9vcF9zZWxlY3QsCisJaXNsX2FzdF9vcF9lcSwKKwlpc2xfYXN0X29wX2xlLAorCWlzbF9hc3Rfb3BfbHQsCisJaXNsX2FzdF9vcF9nZSwKKwlpc2xfYXN0X29wX2d0LAorCWlzbF9hc3Rfb3BfY2FsbAorfTsKKworZW51bSBpc2xfYXN0X2V4cHJfdHlwZSB7CisJaXNsX2FzdF9leHByX2Vycm9yID0gLTEsCisJaXNsX2FzdF9leHByX29wLAorCWlzbF9hc3RfZXhwcl9pZCwKKwlpc2xfYXN0X2V4cHJfaW50Cit9OworCitlbnVtIGlzbF9hc3Rfbm9kZV90eXBlIHsKKwlpc2xfYXN0X25vZGVfZXJyb3IgPSAtMSwKKwlpc2xfYXN0X25vZGVfZm9yID0gMSwKKwlpc2xfYXN0X25vZGVfaWYsCisJaXNsX2FzdF9ub2RlX2Jsb2NrLAorCWlzbF9hc3Rfbm9kZV91c2VyCit9OworCitzdHJ1Y3QgaXNsX2FzdF9wcmludF9vcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgaXNsX2FzdF9wcmludF9vcHRpb25zIGlzbF9hc3RfcHJpbnRfb3B0aW9uczsKKworSVNMX0RFQ0xBUkVfTElTVChhc3RfZXhwcikKK0lTTF9ERUNMQVJFX0xJU1QoYXN0X25vZGUpCisKK2ludCBpc2xfb3B0aW9uc19zZXRfYXN0X2l0ZXJhdG9yX3R5cGUoaXNsX2N0eCAqY3R4LCBjb25zdCBjaGFyICp2YWwpOworY29uc3QgY2hhciAqaXNsX29wdGlvbnNfZ2V0X2FzdF9pdGVyYXRvcl90eXBlKGlzbF9jdHggKmN0eCk7CisKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X2V4cHJfZnJvbV9pZChfX2lzbF90YWtlIGlzbF9pZCAqaWQpOworX19pc2xfZ2l2ZSBpc2xfYXN0X2V4cHIgKmlzbF9hc3RfZXhwcl9uZWcoX19pc2xfdGFrZSBpc2xfYXN0X2V4cHIgKmV4cHIpOworX19pc2xfZ2l2ZSBpc2xfYXN0X2V4cHIgKmlzbF9hc3RfZXhwcl9hZGQoX19pc2xfdGFrZSBpc2xfYXN0X2V4cHIgKmV4cHIxLAorCV9faXNsX3Rha2UgaXNsX2FzdF9leHByICpleHByMik7CitfX2lzbF9naXZlIGlzbF9hc3RfZXhwciAqaXNsX2FzdF9leHByX3N1YihfX2lzbF90YWtlIGlzbF9hc3RfZXhwciAqZXhwcjEsCisJX19pc2xfdGFrZSBpc2xfYXN0X2V4cHIgKmV4cHIyKTsKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X2V4cHJfbXVsKF9faXNsX3Rha2UgaXNsX2FzdF9leHByICpleHByMSwKKwlfX2lzbF90YWtlIGlzbF9hc3RfZXhwciAqZXhwcjIpOworX19pc2xfZ2l2ZSBpc2xfYXN0X2V4cHIgKmlzbF9hc3RfZXhwcl9kaXYoX19pc2xfdGFrZSBpc2xfYXN0X2V4cHIgKmV4cHIxLAorCV9faXNsX3Rha2UgaXNsX2FzdF9leHByICpleHByMik7CitfX2lzbF9naXZlIGlzbF9hc3RfZXhwciAqaXNsX2FzdF9leHByX2FuZChfX2lzbF90YWtlIGlzbF9hc3RfZXhwciAqZXhwcjEsCisJX19pc2xfdGFrZSBpc2xfYXN0X2V4cHIgKmV4cHIyKTsKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X2V4cHJfb3IoX19pc2xfdGFrZSBpc2xfYXN0X2V4cHIgKmV4cHIxLAorCV9faXNsX3Rha2UgaXNsX2FzdF9leHByICpleHByMik7CisKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X2V4cHJfY29weShfX2lzbF9rZWVwIGlzbF9hc3RfZXhwciAqZXhwcik7Cit2b2lkICppc2xfYXN0X2V4cHJfZnJlZShfX2lzbF90YWtlIGlzbF9hc3RfZXhwciAqZXhwcik7CisKK2lzbF9jdHggKmlzbF9hc3RfZXhwcl9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX2FzdF9leHByICpleHByKTsKK2VudW0gaXNsX2FzdF9leHByX3R5cGUgaXNsX2FzdF9leHByX2dldF90eXBlKF9faXNsX2tlZXAgaXNsX2FzdF9leHByICpleHByKTsKK2ludCBpc2xfYXN0X2V4cHJfZ2V0X2ludChfX2lzbF9rZWVwIGlzbF9hc3RfZXhwciAqZXhwciwgaXNsX2ludCAqdik7CitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX2FzdF9leHByX2dldF9pZChfX2lzbF9rZWVwIGlzbF9hc3RfZXhwciAqZXhwcik7CisKK2VudW0gaXNsX2FzdF9vcF90eXBlIGlzbF9hc3RfZXhwcl9nZXRfb3BfdHlwZShfX2lzbF9rZWVwIGlzbF9hc3RfZXhwciAqZXhwcik7CitpbnQgaXNsX2FzdF9leHByX2dldF9vcF9uX2FyZyhfX2lzbF9rZWVwIGlzbF9hc3RfZXhwciAqZXhwcik7CitfX2lzbF9naXZlIGlzbF9hc3RfZXhwciAqaXNsX2FzdF9leHByX2dldF9vcF9hcmcoX19pc2xfa2VlcCBpc2xfYXN0X2V4cHIgKmV4cHIsCisJaW50IHBvcyk7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X2FzdF9leHByKF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJX19pc2xfa2VlcCBpc2xfYXN0X2V4cHIgKmV4cHIpOwordm9pZCBpc2xfYXN0X2V4cHJfZHVtcChfX2lzbF9rZWVwIGlzbF9hc3RfZXhwciAqZXhwcik7CitfX2lzbF9naXZlIGNoYXIgKmlzbF9hc3RfZXhwcl90b19zdHIoX19pc2xfa2VlcCBpc2xfYXN0X2V4cHIgKmV4cHIpOworCitfX2lzbF9naXZlIGlzbF9hc3Rfbm9kZSAqaXNsX2FzdF9ub2RlX2FsbG9jX3VzZXIoX19pc2xfdGFrZSBpc2xfYXN0X2V4cHIgKmV4cHIpOworX19pc2xfZ2l2ZSBpc2xfYXN0X25vZGUgKmlzbF9hc3Rfbm9kZV9jb3B5KF9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKK3ZvaWQgKmlzbF9hc3Rfbm9kZV9mcmVlKF9faXNsX3Rha2UgaXNsX2FzdF9ub2RlICpub2RlKTsKKworaXNsX2N0eCAqaXNsX2FzdF9ub2RlX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUpOworZW51bSBpc2xfYXN0X25vZGVfdHlwZSBpc2xfYXN0X25vZGVfZ2V0X3R5cGUoX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUpOworCitfX2lzbF9naXZlIGlzbF9hc3Rfbm9kZSAqaXNsX2FzdF9ub2RlX3NldF9hbm5vdGF0aW9uKAorCV9faXNsX3Rha2UgaXNsX2FzdF9ub2RlICpub2RlLCBfX2lzbF90YWtlIGlzbF9pZCAqYW5ub3RhdGlvbik7CitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX2FzdF9ub2RlX2dldF9hbm5vdGF0aW9uKF9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKKworX19pc2xfZ2l2ZSBpc2xfYXN0X2V4cHIgKmlzbF9hc3Rfbm9kZV9mb3JfZ2V0X2l0ZXJhdG9yKAorCV9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X25vZGVfZm9yX2dldF9pbml0KAorCV9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X25vZGVfZm9yX2dldF9jb25kKAorCV9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X25vZGVfZm9yX2dldF9pbmMoCisJX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUpOworX19pc2xfZ2l2ZSBpc2xfYXN0X25vZGUgKmlzbF9hc3Rfbm9kZV9mb3JfZ2V0X2JvZHkoCisJX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUpOworaW50IGlzbF9hc3Rfbm9kZV9mb3JfaXNfZGVnZW5lcmF0ZShfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSk7CisKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X25vZGVfaWZfZ2V0X2NvbmQoCisJX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUpOworX19pc2xfZ2l2ZSBpc2xfYXN0X25vZGUgKmlzbF9hc3Rfbm9kZV9pZl9nZXRfdGhlbigKKwlfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSk7CitpbnQgaXNsX2FzdF9ub2RlX2lmX2hhc19lbHNlKF9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKK19faXNsX2dpdmUgaXNsX2FzdF9ub2RlICppc2xfYXN0X25vZGVfaWZfZ2V0X2Vsc2UoCisJX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUpOworCitfX2lzbF9naXZlIGlzbF9hc3Rfbm9kZV9saXN0ICppc2xfYXN0X25vZGVfYmxvY2tfZ2V0X2NoaWxkcmVuKAorCV9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKKworX19pc2xfZ2l2ZSBpc2xfYXN0X2V4cHIgKmlzbF9hc3Rfbm9kZV91c2VyX2dldF9leHByKAorCV9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKKworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfYXN0X25vZGUoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSk7Cit2b2lkIGlzbF9hc3Rfbm9kZV9kdW1wKF9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKKworX19pc2xfZ2l2ZSBpc2xfYXN0X3ByaW50X29wdGlvbnMgKmlzbF9hc3RfcHJpbnRfb3B0aW9uc19hbGxvYyhpc2xfY3R4ICpjdHgpOworX19pc2xfZ2l2ZSBpc2xfYXN0X3ByaW50X29wdGlvbnMgKmlzbF9hc3RfcHJpbnRfb3B0aW9uc19jb3B5KAorCV9faXNsX2tlZXAgaXNsX2FzdF9wcmludF9vcHRpb25zICpvcHRpb25zKTsKK3ZvaWQgKmlzbF9hc3RfcHJpbnRfb3B0aW9uc19mcmVlKF9faXNsX3Rha2UgaXNsX2FzdF9wcmludF9vcHRpb25zICpvcHRpb25zKTsKK2lzbF9jdHggKmlzbF9hc3RfcHJpbnRfb3B0aW9uc19nZXRfY3R4KAorCV9faXNsX2tlZXAgaXNsX2FzdF9wcmludF9vcHRpb25zICpvcHRpb25zKTsKKworX19pc2xfZ2l2ZSBpc2xfYXN0X3ByaW50X29wdGlvbnMgKmlzbF9hc3RfcHJpbnRfb3B0aW9uc19zZXRfcHJpbnRfdXNlcigKKwlfX2lzbF90YWtlIGlzbF9hc3RfcHJpbnRfb3B0aW9ucyAqb3B0aW9ucywKKwlfX2lzbF9naXZlIGlzbF9wcmludGVyICooKnByaW50X3VzZXIpKF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJCV9faXNsX3Rha2UgaXNsX2FzdF9wcmludF9vcHRpb25zICpvcHRpb25zLAorCQlfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSwgdm9pZCAqdXNlciksCisJdm9pZCAqdXNlcik7CitfX2lzbF9naXZlIGlzbF9hc3RfcHJpbnRfb3B0aW9ucyAqaXNsX2FzdF9wcmludF9vcHRpb25zX3NldF9wcmludF9mb3IoCisJX19pc2xfdGFrZSBpc2xfYXN0X3ByaW50X29wdGlvbnMgKm9wdGlvbnMsCisJX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqKCpwcmludF9mb3IpKF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJCV9faXNsX3Rha2UgaXNsX2FzdF9wcmludF9vcHRpb25zICpvcHRpb25zLAorCQlfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSwgdm9pZCAqdXNlciksCisJdm9pZCAqdXNlcik7CisKK2ludCBpc2xfYXN0X25vZGVfZm9yZWFjaF9hc3Rfb3BfdHlwZShfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSwKKwlpbnQgKCpmbikoZW51bSBpc2xfYXN0X29wX3R5cGUgdHlwZSwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX2FzdF9vcF90eXBlX3ByaW50X21hY3JvKAorCWVudW0gaXNsX2FzdF9vcF90eXBlIHR5cGUsIF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnApOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX2FzdF9ub2RlX3ByaW50X21hY3JvcygKKwlfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSwgX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfYXN0X25vZGVfcHJpbnQoX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUsCisJX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlfX2lzbF90YWtlIGlzbF9hc3RfcHJpbnRfb3B0aW9ucyAqb3B0aW9ucyk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfYXN0X25vZGVfZm9yX3ByaW50KF9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlLAorCV9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJX19pc2xfdGFrZSBpc2xfYXN0X3ByaW50X29wdGlvbnMgKm9wdGlvbnMpOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX2FzdF9ub2RlX2lmX3ByaW50KF9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlLAorCV9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJX19pc2xfdGFrZSBpc2xfYXN0X3ByaW50X29wdGlvbnMgKm9wdGlvbnMpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2FzdF9idWlsZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvYXN0X2J1aWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5NGVkNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2FzdF9idWlsZC5oCkBAIC0wLDAgKzEsOTAgQEAKKyNpZm5kZWYgSVNMX0FTVF9DT05URVhUX0gKKyNkZWZpbmUgSVNMX0FTVF9DT05URVhUX0gKKworI2luY2x1ZGUgPGlzbC9jdHguaD4KKyNpbmNsdWRlIDxpc2wvc2V0Lmg+CisjaW5jbHVkZSA8aXNsL2FzdC5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBpc2xfYXN0X2J1aWxkOwordHlwZWRlZiBzdHJ1Y3QgaXNsX2FzdF9idWlsZCBpc2xfYXN0X2J1aWxkOworCisKK2ludCBpc2xfb3B0aW9uc19zZXRfYXN0X2J1aWxkX2F0b21pY191cHBlcl9ib3VuZChpc2xfY3R4ICpjdHgsIGludCB2YWwpOworaW50IGlzbF9vcHRpb25zX2dldF9hc3RfYnVpbGRfYXRvbWljX3VwcGVyX2JvdW5kKGlzbF9jdHggKmN0eCk7CisKK2ludCBpc2xfb3B0aW9uc19zZXRfYXN0X2J1aWxkX3ByZWZlcl9wZGl2KGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X2FzdF9idWlsZF9wcmVmZXJfcGRpdihpc2xfY3R4ICpjdHgpOworCitpbnQgaXNsX29wdGlvbnNfc2V0X2FzdF9idWlsZF9leHBsb2l0X25lc3RlZF9ib3VuZHMoaXNsX2N0eCAqY3R4LCBpbnQgdmFsKTsKK2ludCBpc2xfb3B0aW9uc19nZXRfYXN0X2J1aWxkX2V4cGxvaXRfbmVzdGVkX2JvdW5kcyhpc2xfY3R4ICpjdHgpOworCitpbnQgaXNsX29wdGlvbnNfc2V0X2FzdF9idWlsZF9ncm91cF9jb3NjaGVkdWxlZChpc2xfY3R4ICpjdHgsIGludCB2YWwpOworaW50IGlzbF9vcHRpb25zX2dldF9hc3RfYnVpbGRfZ3JvdXBfY29zY2hlZHVsZWQoaXNsX2N0eCAqY3R4KTsKKworI2RlZmluZSBJU0xfQVNUX0JVSUxEX1NFUEFSQVRJT05fQk9VTkRTX0VYUExJQ0lUCQkwCisjZGVmaW5lIElTTF9BU1RfQlVJTERfU0VQQVJBVElPTl9CT1VORFNfSU1QTElDSVQJCTEKK2ludCBpc2xfb3B0aW9uc19zZXRfYXN0X2J1aWxkX3NlcGFyYXRpb25fYm91bmRzKGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X2FzdF9idWlsZF9zZXBhcmF0aW9uX2JvdW5kcyhpc2xfY3R4ICpjdHgpOworCitpbnQgaXNsX29wdGlvbnNfc2V0X2FzdF9idWlsZF9zY2FsZV9zdHJpZGVzKGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X2FzdF9idWlsZF9zY2FsZV9zdHJpZGVzKGlzbF9jdHggKmN0eCk7CisKK2ludCBpc2xfb3B0aW9uc19zZXRfYXN0X2J1aWxkX2FsbG93X2Vsc2UoaXNsX2N0eCAqY3R4LCBpbnQgdmFsKTsKK2ludCBpc2xfb3B0aW9uc19nZXRfYXN0X2J1aWxkX2FsbG93X2Vsc2UoaXNsX2N0eCAqY3R4KTsKKworaXNsX2N0eCAqaXNsX2FzdF9idWlsZF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX2FzdF9idWlsZCAqYnVpbGQpOworCitfX2lzbF9naXZlIGlzbF9hc3RfYnVpbGQgKmlzbF9hc3RfYnVpbGRfZnJvbV9jb250ZXh0KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9hc3RfYnVpbGRfZ2V0X3NjaGVkdWxlX3NwYWNlKAorCV9faXNsX2tlZXAgaXNsX2FzdF9idWlsZCAqYnVpbGQpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfYXN0X2J1aWxkX2dldF9zY2hlZHVsZSgKKwlfX2lzbF9rZWVwIGlzbF9hc3RfYnVpbGQgKmJ1aWxkKTsKKworX19pc2xfZ2l2ZSBpc2xfYXN0X2J1aWxkICppc2xfYXN0X2J1aWxkX3Jlc3RyaWN0KAorCV9faXNsX3Rha2UgaXNsX2FzdF9idWlsZCAqYnVpbGQsIF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworX19pc2xfZ2l2ZSBpc2xfYXN0X2J1aWxkICppc2xfYXN0X2J1aWxkX2NvcHkoCisJX19pc2xfa2VlcCBpc2xfYXN0X2J1aWxkICpidWlsZCk7Cit2b2lkICppc2xfYXN0X2J1aWxkX2ZyZWUoX19pc2xfdGFrZSBpc2xfYXN0X2J1aWxkICpidWlsZCk7CisKK19faXNsX2dpdmUgaXNsX2FzdF9idWlsZCAqaXNsX2FzdF9idWlsZF9zZXRfb3B0aW9ucygKKwlfX2lzbF90YWtlIGlzbF9hc3RfYnVpbGQgKmJ1aWxkLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqb3B0aW9ucyk7CitfX2lzbF9naXZlIGlzbF9hc3RfYnVpbGQgKmlzbF9hc3RfYnVpbGRfc2V0X2l0ZXJhdG9ycygKKwlfX2lzbF90YWtlIGlzbF9hc3RfYnVpbGQgKmJ1aWxkLAorCV9faXNsX3Rha2UgaXNsX2lkX2xpc3QgKml0ZXJhdG9ycyk7CitfX2lzbF9naXZlIGlzbF9hc3RfYnVpbGQgKmlzbF9hc3RfYnVpbGRfc2V0X2F0X2VhY2hfZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX2FzdF9idWlsZCAqYnVpbGQsCisJX19pc2xfZ2l2ZSBpc2xfYXN0X25vZGUgKigqZm4pKF9faXNsX3Rha2UgaXNsX2FzdF9ub2RlICpub2RlLAorCQlfX2lzbF9rZWVwIGlzbF9hc3RfYnVpbGQgKmJ1aWxkLCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CitfX2lzbF9naXZlIGlzbF9hc3RfYnVpbGQgKmlzbF9hc3RfYnVpbGRfc2V0X2JlZm9yZV9lYWNoX2ZvcigKKwlfX2lzbF90YWtlIGlzbF9hc3RfYnVpbGQgKmJ1aWxkLAorCV9faXNsX2dpdmUgaXNsX2lkICooKmZuKShfX2lzbF9rZWVwIGlzbF9hc3RfYnVpbGQgKmJ1aWxkLAorCQl2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CitfX2lzbF9naXZlIGlzbF9hc3RfYnVpbGQgKmlzbF9hc3RfYnVpbGRfc2V0X2FmdGVyX2VhY2hfZm9yKAorCV9faXNsX3Rha2UgaXNsX2FzdF9idWlsZCAqYnVpbGQsCisJX19pc2xfZ2l2ZSBpc2xfYXN0X25vZGUgKigqZm4pKF9faXNsX3Rha2UgaXNsX2FzdF9ub2RlICpub2RlLAorCQlfX2lzbF9rZWVwIGlzbF9hc3RfYnVpbGQgKmJ1aWxkLCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CitfX2lzbF9naXZlIGlzbF9hc3RfYnVpbGQgKmlzbF9hc3RfYnVpbGRfc2V0X2NyZWF0ZV9sZWFmKAorCV9faXNsX3Rha2UgaXNsX2FzdF9idWlsZCAqYnVpbGQsCisJX19pc2xfZ2l2ZSBpc2xfYXN0X25vZGUgKigqZm4pKF9faXNsX3Rha2UgaXNsX2FzdF9idWlsZCAqYnVpbGQsCisJCXZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKKworX19pc2xfZ2l2ZSBpc2xfYXN0X2V4cHIgKmlzbF9hc3RfYnVpbGRfZXhwcl9mcm9tX3B3X2FmZigKKwlfX2lzbF9rZWVwIGlzbF9hc3RfYnVpbGQgKmJ1aWxkLCBfX2lzbF90YWtlIGlzbF9wd19hZmYgKnBhKTsKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X2J1aWxkX2NhbGxfZnJvbV9wd19tdWx0aV9hZmYoCisJX19pc2xfa2VlcCBpc2xfYXN0X2J1aWxkICpidWlsZCwgX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEpOworCitfX2lzbF9naXZlIGlzbF9hc3Rfbm9kZSAqaXNsX2FzdF9idWlsZF9hc3RfZnJvbV9zY2hlZHVsZSgKKwlfX2lzbF9rZWVwIGlzbF9hc3RfYnVpbGQgKmJ1aWxkLCBfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnNjaGVkdWxlKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9iYW5kLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9iYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdiZjUxYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2JhbmQuaApAQCAtMCwwICsxLDUxIEBACisjaWZuZGVmIElTTF9CQU5EX0gKKyNkZWZpbmUgSVNMX0JBTkRfSAorCisjaW5jbHVkZSA8aXNsL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxpc2wvbGlzdC5oPgorI2luY2x1ZGUgPGlzbC91bmlvbl9tYXBfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC92ZWMuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaXNsX2JhbmQ7Cit0eXBlZGVmIHN0cnVjdCBpc2xfYmFuZCBpc2xfYmFuZDsKKworX19pc2xfZ2l2ZSBpc2xfYmFuZCAqaXNsX2JhbmRfY29weShfX2lzbF9rZWVwIGlzbF9iYW5kICpiYW5kKTsKK3ZvaWQgKmlzbF9iYW5kX2ZyZWUoX19pc2xfdGFrZSBpc2xfYmFuZCAqYmFuZCk7CisKK2lzbF9jdHggKmlzbF9iYW5kX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfYmFuZCAqYmFuZCk7CisKK2ludCBpc2xfYmFuZF9oYXNfY2hpbGRyZW4oX19pc2xfa2VlcCBpc2xfYmFuZCAqYmFuZCk7CitfX2lzbF9naXZlIGlzbF9iYW5kX2xpc3QgKmlzbF9iYW5kX2dldF9jaGlsZHJlbigKKwlfX2lzbF9rZWVwIGlzbF9iYW5kICpiYW5kKTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfYmFuZF9nZXRfcHJlZml4X3NjaGVkdWxlKAorCV9faXNsX2tlZXAgaXNsX2JhbmQgKmJhbmQpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfYmFuZF9nZXRfcGFydGlhbF9zY2hlZHVsZSgKKwlfX2lzbF9rZWVwIGlzbF9iYW5kICpiYW5kKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX2JhbmRfZ2V0X3N1ZmZpeF9zY2hlZHVsZSgKKwlfX2lzbF9rZWVwIGlzbF9iYW5kICpiYW5kKTsKKworaW50IGlzbF9vcHRpb25zX3NldF90aWxlX3NjYWxlX3RpbGVfbG9vcHMoaXNsX2N0eCAqY3R4LCBpbnQgdmFsKTsKK2ludCBpc2xfb3B0aW9uc19nZXRfdGlsZV9zY2FsZV90aWxlX2xvb3BzKGlzbF9jdHggKmN0eCk7CisKK2ludCBpc2xfYmFuZF90aWxlKF9faXNsX2tlZXAgaXNsX2JhbmQgKmJhbmQsIF9faXNsX3Rha2UgaXNsX3ZlYyAqc2l6ZXMpOworCitpbnQgaXNsX2JhbmRfbl9tZW1iZXIoX19pc2xfa2VlcCBpc2xfYmFuZCAqYmFuZCk7CitpbnQgaXNsX2JhbmRfbWVtYmVyX2lzX3plcm9fZGlzdGFuY2UoX19pc2xfa2VlcCBpc2xfYmFuZCAqYmFuZCwgaW50IHBvcyk7CisKK2ludCBpc2xfYmFuZF9saXN0X2ZvcmVhY2hfYmFuZChfX2lzbF9rZWVwIGlzbF9iYW5kX2xpc3QgKmxpc3QsCisJaW50ICgqZm4pKF9faXNsX2tlZXAgaXNsX2JhbmQgKmJhbmQsIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfYmFuZChfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCV9faXNsX2tlZXAgaXNsX2JhbmQgKmJhbmQpOwordm9pZCBpc2xfYmFuZF9kdW1wKF9faXNsX2tlZXAgaXNsX2JhbmQgKmJhbmQpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2Jsay5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvYmxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkOGNmNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2Jsay5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEthdGhvbGlla2UgVW5pdmVyc2l0ZWl0IExldXZlbgorICoKKyAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBNSVQgbGljZW5zZQorICoKKyAqIFdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZSwgSy5VLkxldXZlbiwgRGVwYXJ0ZW1lbnQKKyAqIENvbXB1dGVyd2V0ZW5zY2hhcHBlbiwgQ2VsZXN0aWpuZW5sYWFuIDIwMEEsIEItMzAwMSBMZXV2ZW4sIEJlbGdpdW0KKyAqLworCisjaWZuZGVmIElTTF9CTEtfSAorI2RlZmluZSBJU0xfQkxLX0gKKworI2luY2x1ZGUgPGlzbC9pbnQuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaXNsX2JsayB7CisJc2l6ZV90IHNpemU7CisJaXNsX2ludCAqZGF0YTsKK307CisKKyNkZWZpbmUgSVNMX0JMS19DQUNIRV9TSVpFCTIwCisKK3N0cnVjdCBpc2xfY3R4OworCitzdHJ1Y3QgaXNsX2JsayBpc2xfYmxrX2FsbG9jKHN0cnVjdCBpc2xfY3R4ICpjdHgsIHNpemVfdCBuKTsKK3N0cnVjdCBpc2xfYmxrIGlzbF9ibGtfZW1wdHkodm9pZCk7CitpbnQgaXNsX2Jsa19pc19lcnJvcihzdHJ1Y3QgaXNsX2JsayBibG9jayk7CitzdHJ1Y3QgaXNsX2JsayBpc2xfYmxrX2V4dGVuZChzdHJ1Y3QgaXNsX2N0eCAqY3R4LCBzdHJ1Y3QgaXNsX2JsayBibG9jaywKKwkJCQlzaXplX3QgbmV3X24pOwordm9pZCBpc2xfYmxrX2ZyZWUoc3RydWN0IGlzbF9jdHggKmN0eCwgc3RydWN0IGlzbF9ibGsgYmxvY2spOwordm9pZCBpc2xfYmxrX2NsZWFyX2NhY2hlKHN0cnVjdCBpc2xfY3R4ICpjdHgpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2NvbmZpZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2OWMyNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2NvbmZpZy5oCkBAIC0wLDAgKzEsNCBAQAorLyogaW5jbHVkZS9pc2wvY29uZmlnLmguICBHZW5lcmF0ZWQgZnJvbSBjb25maWcuaC5pbiBieSBjb25maWd1cmUuICAqLworI2RlZmluZSBHQ0NfV0FSTl9VTlVTRURfUkVTVUxUIF9fYXR0cmlidXRlX18oKF9fd2Fybl91bnVzZWRfcmVzdWx0X18pKQorCisvKiAjdW5kZWYgSVNMX1BJUExJQiAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvY29uc3RyYWludC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvY29uc3RyYWludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNGU0NGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9jb25zdHJhaW50LmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEthdGhvbGlla2UgVW5pdmVyc2l0ZWl0IExldXZlbgorICoKKyAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBNSVQgbGljZW5zZQorICoKKyAqIFdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZSwgSy5VLkxldXZlbiwgRGVwYXJ0ZW1lbnQKKyAqIENvbXB1dGVyd2V0ZW5zY2hhcHBlbiwgQ2VsZXN0aWpuZW5sYWFuIDIwMEEsIEItMzAwMSBMZXV2ZW4sIEJlbGdpdW0KKyAqLworCisjaWZuZGVmIElTTF9DT05TVFJBSU5UX0gKKyNkZWZpbmUgSVNMX0NPTlNUUkFJTlRfSAorCisjaW5jbHVkZSA8aXNsL2xvY2FsX3NwYWNlLmg+CisjaW5jbHVkZSA8aXNsL3NwYWNlLmg+CisjaW5jbHVkZSA8aXNsL2FmZl90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3NldF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3ByaW50ZXIuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaXNsX2NvbnN0cmFpbnQ7Cit0eXBlZGVmIHN0cnVjdCBpc2xfY29uc3RyYWludCBpc2xfY29uc3RyYWludDsKKworaXNsX2N0eCAqaXNsX2NvbnN0cmFpbnRfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9jb25zdHJhaW50ICpjKTsKKworX19pc2xfZ2l2ZSBpc2xfY29uc3RyYWludCAqaXNsX2VxdWFsaXR5X2FsbG9jKF9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpscyk7CitfX2lzbF9naXZlIGlzbF9jb25zdHJhaW50ICppc2xfaW5lcXVhbGl0eV9hbGxvYyhfX2lzbF90YWtlIGlzbF9sb2NhbF9zcGFjZSAqbHMpOworCitzdHJ1Y3QgaXNsX2NvbnN0cmFpbnQgKmlzbF9jb25zdHJhaW50X2NvdyhzdHJ1Y3QgaXNsX2NvbnN0cmFpbnQgKmMpOworc3RydWN0IGlzbF9jb25zdHJhaW50ICppc2xfY29uc3RyYWludF9jb3B5KHN0cnVjdCBpc2xfY29uc3RyYWludCAqYyk7Cit2b2lkICppc2xfY29uc3RyYWludF9mcmVlKF9faXNsX3Rha2UgaXNsX2NvbnN0cmFpbnQgKmMpOworCitpbnQgaXNsX2Jhc2ljX3NldF9uX2NvbnN0cmFpbnQoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK2ludCBpc2xfYmFzaWNfbWFwX2ZvcmVhY2hfY29uc3RyYWludChfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX2NvbnN0cmFpbnQgKmMsIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKK2ludCBpc2xfYmFzaWNfc2V0X2ZvcmVhY2hfY29uc3RyYWludChfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX2NvbnN0cmFpbnQgKmMsIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKK2ludCBpc2xfY29uc3RyYWludF9pc19lcXVhbChzdHJ1Y3QgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQxLAorCQkJICAgIHN0cnVjdCBpc2xfY29uc3RyYWludCAqY29uc3RyYWludDIpOworCitpbnQgaXNsX2Jhc2ljX3NldF9mb3JlYWNoX2JvdW5kX3BhaXIoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfY29uc3RyYWludCAqbG93ZXIsCisJCSAgX19pc2xfdGFrZSBpc2xfY29uc3RyYWludCAqdXBwZXIsCisJCSAgX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9hZGRfY29uc3RyYWludCgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsIF9faXNsX3Rha2UgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2FkZF9jb25zdHJhaW50KAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwgX19pc2xfdGFrZSBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfYWRkX2NvbnN0cmFpbnQoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJX19pc2xfdGFrZSBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfYWRkX2NvbnN0cmFpbnQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJX19pc2xfdGFrZSBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCk7CisKK2ludCBpc2xfYmFzaWNfbWFwX2hhc19kZWZpbmluZ19lcXVhbGl0eSgKKwlfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXAsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGludCBwb3MsCisJX19pc2xfZ2l2ZSBpc2xfY29uc3RyYWludCAqKmMpOworaW50IGlzbF9iYXNpY19zZXRfaGFzX2RlZmluaW5nX2VxdWFsaXR5KAorCXN0cnVjdCBpc2xfYmFzaWNfc2V0ICpic2V0LCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBpbnQgcG9zLAorCXN0cnVjdCBpc2xfY29uc3RyYWludCAqKmNvbnN0cmFpbnQpOworaW50IGlzbF9iYXNpY19zZXRfaGFzX2RlZmluaW5nX2luZXF1YWxpdGllcygKKwlzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqYnNldCwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgaW50IHBvcywKKwlzdHJ1Y3QgaXNsX2NvbnN0cmFpbnQgKipsb3dlciwKKwlzdHJ1Y3QgaXNsX2NvbnN0cmFpbnQgKip1cHBlcik7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfY29uc3RyYWludF9nZXRfc3BhY2UoCisJX19pc2xfa2VlcCBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCk7CitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2NvbnN0cmFpbnRfZ2V0X2xvY2FsX3NwYWNlKAorCV9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOworaW50IGlzbF9jb25zdHJhaW50X2RpbShzdHJ1Y3QgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CisKK2ludCBpc2xfY29uc3RyYWludF9pbnZvbHZlc19kaW1zKF9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworCitjb25zdCBjaGFyICppc2xfY29uc3RyYWludF9nZXRfZGltX25hbWUoX19pc2xfa2VlcCBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOwordm9pZCBpc2xfY29uc3RyYWludF9nZXRfY29uc3RhbnQoX19pc2xfa2VlcCBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCwKKwlpc2xfaW50ICp2KTsKK3ZvaWQgaXNsX2NvbnN0cmFpbnRfZ2V0X2NvZWZmaWNpZW50KF9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgaW50IHBvcywgaXNsX2ludCAqdik7CitfX2lzbF9naXZlIGlzbF9jb25zdHJhaW50ICppc2xfY29uc3RyYWludF9zZXRfY29uc3RhbnQoCisJX19pc2xfdGFrZSBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCwgaXNsX2ludCB2KTsKK19faXNsX2dpdmUgaXNsX2NvbnN0cmFpbnQgKmlzbF9jb25zdHJhaW50X3NldF9jb25zdGFudF9zaSgKKwlfX2lzbF90YWtlIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50LCBpbnQgdik7CitfX2lzbF9naXZlIGlzbF9jb25zdHJhaW50ICppc2xfY29uc3RyYWludF9zZXRfY29lZmZpY2llbnQoCisJX19pc2xfdGFrZSBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBpbnQgcG9zLCBpc2xfaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfY29uc3RyYWludCAqaXNsX2NvbnN0cmFpbnRfc2V0X2NvZWZmaWNpZW50X3NpKAorCV9faXNsX3Rha2UgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgaW50IHBvcywgaW50IHYpOworCitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9jb25zdHJhaW50X2dldF9kaXYoX19pc2xfa2VlcCBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCwKKwlpbnQgcG9zKTsKKworc3RydWN0IGlzbF9jb25zdHJhaW50ICppc2xfY29uc3RyYWludF9uZWdhdGUoc3RydWN0IGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50KTsKKworaW50IGlzbF9jb25zdHJhaW50X2lzX2VxdWFsaXR5KF9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOworaW50IGlzbF9jb25zdHJhaW50X2lzX2Rpdl9jb25zdHJhaW50KF9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOworCitpbnQgaXNsX2NvbnN0cmFpbnRfaXNfbG93ZXJfYm91bmQoX19pc2xfa2VlcCBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworaW50IGlzbF9jb25zdHJhaW50X2lzX3VwcGVyX2JvdW5kKF9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKKworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2Zyb21fY29uc3RyYWludCgKKwlfX2lzbF90YWtlIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50KTsKK3N0cnVjdCBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2Zyb21fY29uc3RyYWludCgKKwlzdHJ1Y3QgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOworCitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9jb25zdHJhaW50X2dldF9ib3VuZCgKKwlfX2lzbF9rZWVwIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50LCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBpbnQgcG9zKTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2NvbnN0cmFpbnRfZ2V0X2FmZigKKwlfX2lzbF9rZWVwIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50KTsKK19faXNsX2dpdmUgaXNsX2NvbnN0cmFpbnQgKmlzbF9lcXVhbGl0eV9mcm9tX2FmZihfX2lzbF90YWtlIGlzbF9hZmYgKmFmZik7CitfX2lzbF9naXZlIGlzbF9jb25zdHJhaW50ICppc2xfaW5lcXVhbGl0eV9mcm9tX2FmZihfX2lzbF90YWtlIGlzbF9hZmYgKmFmZik7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9kcm9wX2NvbnN0cmFpbnQoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LCBfX2lzbF90YWtlIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50KTsKKworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfY29uc3RyYWludChfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCV9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmMpOwordm9pZCBpc2xfY29uc3RyYWludF9kdW1wKF9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmMpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjaW5jbHVkZSA8aXNsL2RpbS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2N0eC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvY3R4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4ODY5NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2N0eC5oCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBLYXRob2xpZWtlIFVuaXZlcnNpdGVpdCBMZXV2ZW4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgTUlUIGxpY2Vuc2UKKyAqCisgKiBXcml0dGVuIGJ5IFN2ZW4gVmVyZG9vbGFlZ2UsIEsuVS5MZXV2ZW4sIERlcGFydGVtZW50CisgKiBDb21wdXRlcndldGVuc2NoYXBwZW4sIENlbGVzdGlqbmVubGFhbiAyMDBBLCBCLTMwMDEgTGV1dmVuLCBCZWxnaXVtCisgKi8KKworI2lmbmRlZiBJU0xfQ1RYX0gKKyNkZWZpbmUgSVNMX0NUWF9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8aXNsL2ludC5oPgorI2luY2x1ZGUgPGlzbC9ibGsuaD4KKyNpbmNsdWRlIDxpc2wvYXJnLmg+CisjaW5jbHVkZSA8aXNsL2hhc2guaD4KKyNpbmNsdWRlIDxpc2wvY29uZmlnLmg+CisKKyNpZm5kZWYgX19pc2xfZ2l2ZQorI2RlZmluZSBfX2lzbF9naXZlCisjZW5kaWYKKyNpZm5kZWYgX19pc2xfdGFrZQorI2RlZmluZSBfX2lzbF90YWtlCisjZW5kaWYKKyNpZm5kZWYgX19pc2xfa2VlcAorI2RlZmluZSBfX2lzbF9rZWVwCisjZW5kaWYKKyNpZm5kZWYgX19pc2xfZXhwb3J0CisjZGVmaW5lIF9faXNsX2V4cG9ydAorI2VuZGlmCisjaWZuZGVmIF9faXNsX2NvbnN0cnVjdG9yCisjZGVmaW5lIF9faXNsX2NvbnN0cnVjdG9yCisjZW5kaWYKKyNpZm5kZWYgX19pc2xfc3ViY2xhc3MKKyNkZWZpbmUgX19pc2xfc3ViY2xhc3Moc3VwZXIpCisjZW5kaWYKKworI2lmZGVmIEdDQ19XQVJOX1VOVVNFRF9SRVNVTFQKKyNkZWZpbmUJV0FSTl9VTlVTRUQJR0NDX1dBUk5fVU5VU0VEX1JFU1VMVAorI2Vsc2UKKyNkZWZpbmUgV0FSTl9VTlVTRUQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIE5lYXJseSBhbGwgaXNhIGZ1bmN0aW9ucyByZXF1aXJlIGEgc3RydWN0IGlzbF9jdHggYWxsb2NhdGVkIHVzaW5nCisgKiBpc2xfY3R4X2FsbG9jLiAgVGhpcyBjdHggY29udGFpbnMgKG9yIHdpbGwgY29udGFpbikgb3B0aW9ucyB0aGF0CisgKiBjb250cm9sIHRoZSBiZWhhdmlvciBvZiB0aGUgbGlicmFyeSBhbmQgc29tZSBjYWNoZXMuCisgKgorICogQW4gb2JqZWN0IGFsbG9jYXRlZCB3aXRoaW4gYSBnaXZlbiBjdHggc2hvdWxkIG5ldmVyIGJlIHVzZWQgaW5zaWRlCisgKiBhbm90aGVyIGN0eC4gIEZ1bmN0aW9ucyBmb3IgbW92aW5nIG9iamVjdHMgZnJvbSBvbmUgY3R4IHRvIGFub3RoZXIKKyAqIHdpbGwgYmUgYWRkZWQgYXMgdGhlIG5lZWQgYXJpc2VzLgorICoKKyAqIEEgZ2l2ZW4gY29udGV4dCBzaG91bGQgb25seSBiZSB1c2VkIGluc2lkZSBhIHNpbmdsZSB0aHJlYWQuCisgKiBBIGdsb2JhbCBjb250ZXh0IGZvciBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBkaWZmZXJlbnQgdGhyZWFkcworICogYXMgd2VsbCBhcyBmdW5jdGlvbnMgZm9yIG1vdmluZyBhIGNvbnRleHQgdG8gYSBkaWZmZXJlbnQgdGhyZWFkCisgKiB3aWxsIGJlIGFkZGVkIGFzIHRoZSBuZWVkIGFyaXNlcy4KKyAqCisgKiBJZiBhbnl0aGluZyBnb2VzIHdyb25nIChvdXQgb2YgbWVtb3J5LCBmYWlsZWQgYXNzZXJ0aW9uKSwgdGhlbgorICogdGhlIGxpYnJhcnkgd2lsbCBjdXJyZW50bHkgc2ltcGx5IGFib3J0LiAgVGhpcyB3aWxsIGJlIG1hZGUKKyAqIGNvbmZpZ3VyYWJsZSBpbiB0aGUgZnV0dXJlLgorICogVXNlcnMgb2YgdGhlIGxpYnJhcnkgc2hvdWxkIGV4cGVjdCBmdW5jdGlvbnMgdGhhdCByZXR1cm4KKyAqIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSwgdG8gcmV0dXJuIE5VTEwsIGluZGljYXRpbmcgZmFpbHVyZS4KKyAqIEFueSBmdW5jdGlvbiBhY2NlcHRpbmcgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIHdpbGwgdHJlYXQKKyAqIGEgTlVMTCBhcmd1bWVudCBhcyBhIGZhaWx1cmUsIHJlc3VsdGluZyBpbiB0aGUgZnVuY3Rpb24gZnJlZWluZworICogdGhlIHJlbWFpbmluZyBzdHJ1Y3R1cmVzIChpZiBhbnkpIGFuZCByZXR1cm5pbmcgTlVMTCBpdHNlbGYKKyAqIChpbiBjYXNlIG9mIHBvaW50ZXIgcmV0dXJuIHR5cGUpLgorICogVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHRoZSBpc2xfY3R4IGFyZ3VtZW50LCB3aGljaCBzaG91bGQgbmV2ZXIgYmUgTlVMTC4KKyAqLworc3RydWN0IGlzbF9zdGF0cyB7CisJbG9uZwlnYnJfc29sdmVkX2xwczsKK307CitlbnVtIGlzbF9lcnJvciB7CisJaXNsX2Vycm9yX25vbmUgPSAwLAorCWlzbF9lcnJvcl9hYm9ydCwKKwlpc2xfZXJyb3JfdW5rbm93biwKKwlpc2xfZXJyb3JfaW50ZXJuYWwsCisJaXNsX2Vycm9yX2ludmFsaWQsCisJaXNsX2Vycm9yX3Vuc3VwcG9ydGVkCit9Oworc3RydWN0IGlzbF9jdHg7Cit0eXBlZGVmIHN0cnVjdCBpc2xfY3R4IGlzbF9jdHg7CisKKy8qIFNvbWUgaGVscGVyIG1hY3JvcyAqLworCisjZGVmaW5lIElTTF9GTF9JTklUKGwsIGYpICAgKGwpID0gKGYpICAgICAgICAgICAgICAgLyogU3BlY2lmaWMgZmxhZ3MgbG9jYXRpb24uICovCisjZGVmaW5lIElTTF9GTF9TRVQobCwgZikgICAgKChsKSB8PSAoZikpCisjZGVmaW5lIElTTF9GTF9DTFIobCwgZikgICAgKChsKSAmPSB+KGYpKQorI2RlZmluZSBJU0xfRkxfSVNTRVQobCwgZikgICghISgobCkgJiAoZikpKQorCisjZGVmaW5lIElTTF9GX0lOSVQocCwgZikgICAgSVNMX0ZMX0lOSVQoKHApLT5mbGFncywgZikgIC8qIFN0cnVjdHVyZSBlbGVtZW50IGZsYWdzLiAqLworI2RlZmluZSBJU0xfRl9TRVQocCwgZikgICAgIElTTF9GTF9TRVQoKHApLT5mbGFncywgZikKKyNkZWZpbmUgSVNMX0ZfQ0xSKHAsIGYpICAgICBJU0xfRkxfQ0xSKChwKS0+ZmxhZ3MsIGYpCisjZGVmaW5lIElTTF9GX0lTU0VUKHAsIGYpICAgSVNMX0ZMX0lTU0VUKChwKS0+ZmxhZ3MsIGYpCisKKy8qIGlzbF9jaGVja19jdHgoKSBjaGVja3MgYXQgY29tcGlsZSB0aW1lIGlmICdjdHgnIGlzIG9mIHR5cGUgJ2lzbF9jdHggKicgYW5kCisgKiByZXR1cm5zIHRoZSB2YWx1ZSBvZiAnZXhwcicuIEl0IGlzIHVzZWQgdG8gZW5zdXJlLCB0aGF0IGFsd2F5cyBhbiBpc2xfY3R4IGlzCisgKiBwYXNzZWQgdG8gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGV2ZW4gaWYgdGhleSBjdXJyZW50bHkgZG8gbm90IHVzZSBpdC4KKyAqLworI2RlZmluZSBpc2xfY2hlY2tfY3R4KGN0eCwgZXhwcikJKChjdHggIT0gKGlzbF9jdHggKikgMCkgPyBleHByIDogZXhwcikKKworI2RlZmluZSBpc2xfYWxsb2MoY3R4LHR5cGUsc2l6ZSkJKCh0eXBlICopaXNsX2NoZWNrX2N0eChjdHgsXAorCQkJCQkJCW1hbGxvYyhzaXplKSkpCisjZGVmaW5lIGlzbF9jYWxsb2MoY3R4LHR5cGUsc2l6ZSkJKCh0eXBlICopaXNsX2NoZWNrX2N0eChjdHgsXAorCQkJCQkJCWNhbGxvYygxLCBzaXplKSkpCisjZGVmaW5lIGlzbF9yZWFsbG9jKGN0eCxwdHIsdHlwZSxzaXplKQkoKHR5cGUgKilpc2xfY2hlY2tfY3R4KGN0eCxcCisJCQkJCQkJcmVhbGxvYyhwdHIsc2l6ZSkpKQorI2RlZmluZSBpc2xfYWxsb2NfdHlwZShjdHgsdHlwZSkJaXNsX2FsbG9jKGN0eCx0eXBlLHNpemVvZih0eXBlKSkKKyNkZWZpbmUgaXNsX2NhbGxvY190eXBlKGN0eCx0eXBlKQlpc2xfY2FsbG9jKGN0eCx0eXBlLHNpemVvZih0eXBlKSkKKyNkZWZpbmUgaXNsX3JlYWxsb2NfdHlwZShjdHgscHRyLHR5cGUpCWlzbF9yZWFsbG9jKGN0eCxwdHIsdHlwZSxzaXplb2YodHlwZSkpCisjZGVmaW5lIGlzbF9hbGxvY19hcnJheShjdHgsdHlwZSxuKQlpc2xfYWxsb2MoY3R4LHR5cGUsKG4pKnNpemVvZih0eXBlKSkKKyNkZWZpbmUgaXNsX2NhbGxvY19hcnJheShjdHgsdHlwZSxuKQkoKHR5cGUgKilpc2xfY2hlY2tfY3R4KGN0eCxcCisJCQkJCQljYWxsb2Mobiwgc2l6ZW9mKHR5cGUpKSkpCisjZGVmaW5lIGlzbF9yZWFsbG9jX2FycmF5KGN0eCxwdHIsdHlwZSxuKSBcCisJCQkJICAgIGlzbF9yZWFsbG9jKGN0eCxwdHIsdHlwZSwobikqc2l6ZW9mKHR5cGUpKQorCisjZGVmaW5lIGlzbF9kaWUoY3R4LGVycm5vLG1zZyxjb2RlKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaXNsX2hhbmRsZV9lcnJvcihjdHgsIGVycm5vLCBtc2csIF9fRklMRV9fLCBfX0xJTkVfXyk7CVwKKwkJY29kZTsJCQkJCQkJXAorCX0gd2hpbGUgKDApCisKK3ZvaWQgaXNsX2hhbmRsZV9lcnJvcihpc2xfY3R4ICpjdHgsIGVudW0gaXNsX2Vycm9yIGVycm9yLCBjb25zdCBjaGFyICptc2csCisJY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOworCisjZGVmaW5lIGlzbF9hc3NlcnQ0KGN0eCx0ZXN0LGNvZGUsZXJybm8pCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmICh0ZXN0KQkJCQkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJaXNsX2RpZShjdHgsIGVycm5vLCAiQXNzZXJ0aW9uIFwiIiAjdGVzdCAiXCIgZmFpbGVkIiwgY29kZSk7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBpc2xfYXNzZXJ0KGN0eCx0ZXN0LGNvZGUpCQkJCQlcCisJaXNsX2Fzc2VydDQoY3R4LHRlc3QsY29kZSxpc2xfZXJyb3JfdW5rbm93bikKKworI2RlZmluZSBpc2xfbWluKGEsYikJCQkoKGEgPCBiKSA/IChhKSA6IChiKSkKKworLyogc3RydWN0IGlzbF9jdHggZnVuY3Rpb25zICovCisKK3N0cnVjdCBpc2xfb3B0aW9ucyAqaXNsX2N0eF9vcHRpb25zKGlzbF9jdHggKmN0eCk7CisKK2lzbF9jdHggKmlzbF9jdHhfYWxsb2Nfd2l0aF9vcHRpb25zKHN0cnVjdCBpc2xfYXJncyAqYXJncywKKwlfX2lzbF90YWtlIHZvaWQgKm9wdCk7Citpc2xfY3R4ICppc2xfY3R4X2FsbG9jKHZvaWQpOwordm9pZCAqaXNsX2N0eF9wZWVrX29wdGlvbnMoaXNsX2N0eCAqY3R4LCBzdHJ1Y3QgaXNsX2FyZ3MgKmFyZ3MpOworaW50IGlzbF9jdHhfcGFyc2Vfb3B0aW9ucyhpc2xfY3R4ICpjdHgsIGludCBhcmdjLCBjaGFyICoqYXJndiwgdW5zaWduZWQgZmxhZ3MpOwordm9pZCBpc2xfY3R4X3JlZihzdHJ1Y3QgaXNsX2N0eCAqY3R4KTsKK3ZvaWQgaXNsX2N0eF9kZXJlZihzdHJ1Y3QgaXNsX2N0eCAqY3R4KTsKK3ZvaWQgaXNsX2N0eF9mcmVlKGlzbF9jdHggKmN0eCk7CisKK3ZvaWQgaXNsX2N0eF9hYm9ydChpc2xfY3R4ICpjdHgpOwordm9pZCBpc2xfY3R4X3Jlc3VtZShpc2xfY3R4ICpjdHgpOworaW50IGlzbF9jdHhfYWJvcnRlZChpc2xfY3R4ICpjdHgpOworCisjZGVmaW5lIElTTF9BUkdfQ1RYX0RFQ0wocHJlZml4LHN0LGFyZ3MpCQkJCVwKK3N0ICppc2xfY3R4X3BlZWtfICMjIHByZWZpeChpc2xfY3R4ICpjdHgpOworCisjZGVmaW5lIElTTF9BUkdfQ1RYX0RFRihwcmVmaXgsc3QsYXJncykJCQkJCVwKK3N0ICppc2xfY3R4X3BlZWtfICMjIHByZWZpeChpc2xfY3R4ICpjdHgpCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIChzdCAqKWlzbF9jdHhfcGVla19vcHRpb25zKGN0eCwgJihhcmdzKSk7CQlcCit9CisKKyNkZWZpbmUgSVNMX0NUWF9HRVRfSU5UX0RFRihwcmVmaXgsc3QsYXJncyxmaWVsZCkJCQlcCitpbnQgcHJlZml4ICMjIF9nZXRfICMjIGZpZWxkKGlzbF9jdHggKmN0eCkJCQkJXAorewkJCQkJCQkJCVwKKwlzdCAqb3B0aW9uczsJCQkJCQkJXAorCW9wdGlvbnMgPSBpc2xfY3R4X3BlZWtfICMjIHByZWZpeChjdHgpOwkJCQlcCisJaWYgKCFvcHRpb25zKQkJCQkJCQlcCisJCWlzbF9kaWUoY3R4LCBpc2xfZXJyb3JfaW52YWxpZCwJCQkJXAorCQkJImlzbF9jdHggZG9lcyBub3QgcmVmZXJlbmNlICIgI3ByZWZpeCwJCVwKKwkJCXJldHVybiAtMSk7CQkJCQlcCisJcmV0dXJuIG9wdGlvbnMtPmZpZWxkOwkJCQkJCVwKK30KKworI2RlZmluZSBJU0xfQ1RYX1NFVF9JTlRfREVGKHByZWZpeCxzdCxhcmdzLGZpZWxkKQkJCVwKK2ludCBwcmVmaXggIyMgX3NldF8gIyMgZmllbGQoaXNsX2N0eCAqY3R4LCBpbnQgdmFsKQkJCVwKK3sJCQkJCQkJCQlcCisJc3QgKm9wdGlvbnM7CQkJCQkJCVwKKwlvcHRpb25zID0gaXNsX2N0eF9wZWVrXyAjIyBwcmVmaXgoY3R4KTsJCQkJXAorCWlmICghb3B0aW9ucykJCQkJCQkJXAorCQlpc2xfZGllKGN0eCwgaXNsX2Vycm9yX2ludmFsaWQsCQkJCVwKKwkJCSJpc2xfY3R4IGRvZXMgbm90IHJlZmVyZW5jZSAiICNwcmVmaXgsCQlcCisJCQlyZXR1cm4gLTEpOwkJCQkJXAorCW9wdGlvbnMtPmZpZWxkID0gdmFsOwkJCQkJCVwKKwlyZXR1cm4gMDsJCQkJCQkJXAorfQorCisjZGVmaW5lIElTTF9DVFhfR0VUX1NUUl9ERUYocHJlZml4LHN0LGFyZ3MsZmllbGQpCQkJXAorY29uc3QgY2hhciAqcHJlZml4ICMjIF9nZXRfICMjIGZpZWxkKGlzbF9jdHggKmN0eCkJCQlcCit7CQkJCQkJCQkJXAorCXN0ICpvcHRpb25zOwkJCQkJCQlcCisJb3B0aW9ucyA9IGlzbF9jdHhfcGVla18gIyMgcHJlZml4KGN0eCk7CQkJCVwKKwlpZiAoIW9wdGlvbnMpCQkJCQkJCVwKKwkJaXNsX2RpZShjdHgsIGlzbF9lcnJvcl9pbnZhbGlkLAkJCQlcCisJCQkiaXNsX2N0eCBkb2VzIG5vdCByZWZlcmVuY2UgIiAjcHJlZml4LAkJXAorCQkJcmV0dXJuIE5VTEwpOwkJCQkJXAorCXJldHVybiBvcHRpb25zLT5maWVsZDsJCQkJCQlcCit9CisKKyNkZWZpbmUgSVNMX0NUWF9TRVRfU1RSX0RFRihwcmVmaXgsc3QsYXJncyxmaWVsZCkJCQlcCitpbnQgcHJlZml4ICMjIF9zZXRfICMjIGZpZWxkKGlzbF9jdHggKmN0eCwgY29uc3QgY2hhciAqdmFsKQkJXAorewkJCQkJCQkJCVwKKwlzdCAqb3B0aW9uczsJCQkJCQkJXAorCW9wdGlvbnMgPSBpc2xfY3R4X3BlZWtfICMjIHByZWZpeChjdHgpOwkJCQlcCisJaWYgKCFvcHRpb25zKQkJCQkJCQlcCisJCWlzbF9kaWUoY3R4LCBpc2xfZXJyb3JfaW52YWxpZCwJCQkJXAorCQkJImlzbF9jdHggZG9lcyBub3QgcmVmZXJlbmNlICIgI3ByZWZpeCwJCVwKKwkJCXJldHVybiAtMSk7CQkJCQlcCisJaWYgKCF2YWwpCQkJCQkJCVwKKwkJcmV0dXJuIC0xOwkJCQkJCVwKKwlmcmVlKG9wdGlvbnMtPmZpZWxkKTsJCQkJCQlcCisJb3B0aW9ucy0+ZmllbGQgPSBzdHJkdXAodmFsKTsJCQkJCVwKKwlpZiAoIW9wdGlvbnMtPmZpZWxkKQkJCQkJCVwKKwkJcmV0dXJuIC0xOwkJCQkJCVwKKwlyZXR1cm4gMDsJCQkJCQkJXAorfQorCisjZGVmaW5lIElTTF9DVFhfR0VUX0JPT0xfREVGKHByZWZpeCxzdCxhcmdzLGZpZWxkKQkJCVwKKwlJU0xfQ1RYX0dFVF9JTlRfREVGKHByZWZpeCxzdCxhcmdzLGZpZWxkKQorCisjZGVmaW5lIElTTF9DVFhfU0VUX0JPT0xfREVGKHByZWZpeCxzdCxhcmdzLGZpZWxkKQkJCVwKKwlJU0xfQ1RYX1NFVF9JTlRfREVGKHByZWZpeCxzdCxhcmdzLGZpZWxkKQorCisjZGVmaW5lIElTTF9DVFhfR0VUX0NIT0lDRV9ERUYocHJlZml4LHN0LGFyZ3MsZmllbGQpCQkJXAorCUlTTF9DVFhfR0VUX0lOVF9ERUYocHJlZml4LHN0LGFyZ3MsZmllbGQpCisKKyNkZWZpbmUgSVNMX0NUWF9TRVRfQ0hPSUNFX0RFRihwcmVmaXgsc3QsYXJncyxmaWVsZCkJCQlcCisJSVNMX0NUWF9TRVRfSU5UX0RFRihwcmVmaXgsc3QsYXJncyxmaWVsZCkKKworZW51bSBpc2xfZXJyb3IgaXNsX2N0eF9sYXN0X2Vycm9yKGlzbF9jdHggKmN0eCk7Cit2b2lkIGlzbF9jdHhfcmVzZXRfZXJyb3IoaXNsX2N0eCAqY3R4KTsKK3ZvaWQgaXNsX2N0eF9zZXRfZXJyb3IoaXNsX2N0eCAqY3R4LCBlbnVtIGlzbF9lcnJvciBlcnJvcik7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvZGltLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9kaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzMxYzAyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvZGltLmgKQEAgLTAsMCArMSwxMjIgQEAKKyNpZm5kZWYgSVNMX0RJTV9ICisjZGVmaW5lIElTTF9ESU1fSAorCisjaW5jbHVkZSA8aXNsL3NwYWNlLmg+CisjaW5jbHVkZSA8aXNsL2xvY2FsX3NwYWNlLmg+CisjaW5jbHVkZSA8aXNsL2FmZl90eXBlLmg+CisjaW5jbHVkZSA8aXNsL2NvbnN0cmFpbnQuaD4KKyNpbmNsdWRlIDxpc2wvbWFwX3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvc2V0X3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvcG9pbnQuaD4KKyNpbmNsdWRlIDxpc2wvdW5pb25fbWFwLmg+CisjaW5jbHVkZSA8aXNsL3VuaW9uX3NldC5oPgorI2luY2x1ZGUgPGlzbC9wb2x5bm9taWFsX3R5cGUuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIGlzbF9kaW0gaXNsX3NwYWNlCisKK2lzbF9jdHggKmlzbF9kaW1fZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX2FsbG9jKGlzbF9jdHggKmN0eCwKKwkJCXVuc2lnbmVkIG5wYXJhbSwgdW5zaWduZWQgbl9pbiwgdW5zaWduZWQgbl9vdXQpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9kaW1fc2V0X2FsbG9jKGlzbF9jdHggKmN0eCwKKwkJCXVuc2lnbmVkIG5wYXJhbSwgdW5zaWduZWQgZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX2NvcHkoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSk7Cit2b2lkIGlzbF9kaW1fZnJlZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKKwordW5zaWduZWQgaXNsX2RpbV9zaXplKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0sIGVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9zZXRfZGltX2lkKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBfX2lzbF90YWtlIGlzbF9pZCAqaWQpOworaW50IGlzbF9kaW1faGFzX2RpbV9pZChfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX2RpbV9nZXRfZGltX2lkKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKKworaW50IGlzbF9kaW1fZmluZF9kaW1fYnlfaWQoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBfX2lzbF9rZWVwIGlzbF9pZCAqaWQpOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9zZXRfdHVwbGVfaWQoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBfX2lzbF90YWtlIGlzbF9pZCAqaWQpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9kaW1fcmVzZXRfdHVwbGVfaWQoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK2ludCBpc2xfZGltX2hhc190dXBsZV9pZChfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK19faXNsX2dpdmUgaXNsX2lkICppc2xfZGltX2dldF90dXBsZV9pZChfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9zZXRfbmFtZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgX19pc2xfa2VlcCBjb25zdCBjaGFyICpuYW1lKTsKK19faXNsX2tlZXAgY29uc3QgY2hhciAqaXNsX2RpbV9nZXRfbmFtZShfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX3NldF90dXBsZV9uYW1lKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqcyk7Citjb25zdCBjaGFyICppc2xfZGltX2dldF90dXBsZV9uYW1lKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0sCisJCQkJIGVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworCitpbnQgaXNsX2RpbV9pc193cmFwcGluZyhfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX3dyYXAoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV91bndyYXAoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX2RvbWFpbihfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX2Zyb21fZG9tYWluKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9kaW1fcmFuZ2UoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9mcm9tX3JhbmdlKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9kaW1fcmV2ZXJzZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX2pvaW4oX19pc2xfdGFrZSBpc2xfc3BhY2UgKmxlZnQsCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKnJpZ2h0KTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX2FsaWduX3BhcmFtcyhfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltMSwKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltMik7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9pbnNlcnQoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9kaW1fYWRkKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9kcm9wKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9kaW1fbW92ZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIGRzdF90eXBlLCB1bnNpZ25lZCBkc3RfcG9zLAorCWVudW0gaXNsX2RpbV90eXBlIHNyY190eXBlLCB1bnNpZ25lZCBzcmNfcG9zLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX21hcF9mcm9tX3NldCgKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX3ppcChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKKworX19pc2xfZ2l2ZSBpc2xfbG9jYWxfc3BhY2UgKmlzbF9sb2NhbF9zcGFjZV9mcm9tX2RpbSgKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfbG9jYWxfc3BhY2VfZ2V0X2RpbSgKKwlfX2lzbF9rZWVwIGlzbF9sb2NhbF9zcGFjZSAqbHMpOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2FmZl9nZXRfZGltKF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfcHdfYWZmX2dldF9kaW0oX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwd2FmZik7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfY29uc3RyYWludF9nZXRfZGltKAorCV9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2Jhc2ljX21hcF9nZXRfZGltKF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX21hcF9nZXRfZGltKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfdW5pb25fbWFwX2dldF9kaW0oX19pc2xfa2VlcCBpc2xfdW5pb25fbWFwICp1bWFwKTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9iYXNpY19zZXRfZ2V0X2RpbShfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zZXRfZ2V0X2RpbShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3VuaW9uX3NldF9nZXRfZGltKF9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldCk7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfcG9pbnRfZ2V0X2RpbShfX2lzbF9rZWVwIGlzbF9wb2ludCAqcG50KTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9xcG9seW5vbWlhbF9nZXRfZGltKF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3B3X3Fwb2x5bm9taWFsX2dldF9kaW0oCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9xcG9seW5vbWlhbF9mb2xkX2dldF9kaW0oCisJX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZ2V0X2RpbSgKKwlfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9nZXRfZGltKAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZ2V0X2RpbSgKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9mbG93LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9mbG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRhYTk0MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2Zsb3cuaApAQCAtMCwwICsxLDc1IEBACisjaWZuZGVmIElTTF9GTE9XX0gKKyNkZWZpbmUgSVNMX0ZMT1dfSAorCisjaW5jbHVkZSA8aXNsL3NldF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL21hcF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3VuaW9uX3NldF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3VuaW9uX21hcF90eXBlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogTGV0IG4gKD49IDApIGJlIHRoZSBudW1iZXIgb2YgaXRlcmF0b3JzIHNoYXJlZCBieSBmaXJzdCBhbmQgc2Vjb25kLgorICogSWYgZmlyc3QgcHJlY2VkZXMgc2Vjb25kIHRleHR1YWxseSByZXR1cm4gMiAqIG4gKyAxLAorICogb3RoZXJ3aXNlIHJldHVybiAyICogbi4KKyAqLwordHlwZWRlZiBpbnQgKCppc2xfYWNjZXNzX2xldmVsX2JlZm9yZSkodm9pZCAqZmlyc3QsIHZvaWQgKnNlY29uZCk7CisKK3N0cnVjdCBpc2xfcmVzdHJpY3Rpb247Cit0eXBlZGVmIHN0cnVjdCBpc2xfcmVzdHJpY3Rpb24gaXNsX3Jlc3RyaWN0aW9uOworCit2b2lkICppc2xfcmVzdHJpY3Rpb25fZnJlZShfX2lzbF90YWtlIGlzbF9yZXN0cmljdGlvbiAqcmVzdHIpOworX19pc2xfZ2l2ZSBpc2xfcmVzdHJpY3Rpb24gKmlzbF9yZXN0cmljdGlvbl9lbXB0eSgKKwlfX2lzbF90YWtlIGlzbF9tYXAgKnNvdXJjZV9tYXApOworX19pc2xfZ2l2ZSBpc2xfcmVzdHJpY3Rpb24gKmlzbF9yZXN0cmljdGlvbl9ub25lKAorCV9faXNsX3Rha2UgaXNsX21hcCAqc291cmNlX21hcCk7CitfX2lzbF9naXZlIGlzbF9yZXN0cmljdGlvbiAqaXNsX3Jlc3RyaWN0aW9uX2lucHV0KAorCV9faXNsX3Rha2UgaXNsX3NldCAqc291cmNlX3Jlc3RyLCBfX2lzbF90YWtlIGlzbF9zZXQgKnNpbmtfcmVzdHIpOworX19pc2xfZ2l2ZSBpc2xfcmVzdHJpY3Rpb24gKmlzbF9yZXN0cmljdGlvbl9vdXRwdXQoCisJX19pc2xfdGFrZSBpc2xfc2V0ICpzb3VyY2VfcmVzdHIpOworCitpc2xfY3R4ICppc2xfcmVzdHJpY3Rpb25fZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9yZXN0cmljdGlvbiAqcmVzdHIpOworCit0eXBlZGVmIF9faXNsX2dpdmUgaXNsX3Jlc3RyaWN0aW9uICooKmlzbF9hY2Nlc3NfcmVzdHJpY3QpKAorCV9faXNsX2tlZXAgaXNsX21hcCAqc291cmNlX21hcCwgX19pc2xfa2VlcCBpc2xfc2V0ICpzaW5rLAorCXZvaWQgKnNvdXJjZV91c2VyLCB2b2lkICp1c2VyKTsKKworc3RydWN0IGlzbF9hY2Nlc3NfaW5mbzsKK3R5cGVkZWYgc3RydWN0IGlzbF9hY2Nlc3NfaW5mbyBpc2xfYWNjZXNzX2luZm87CitzdHJ1Y3QgaXNsX2Zsb3c7Cit0eXBlZGVmIHN0cnVjdCBpc2xfZmxvdyBpc2xfZmxvdzsKKworX19pc2xfZ2l2ZSBpc2xfYWNjZXNzX2luZm8gKmlzbF9hY2Nlc3NfaW5mb19hbGxvYyhfX2lzbF90YWtlIGlzbF9tYXAgKnNpbmssCisJdm9pZCAqc2lua191c2VyLCBpc2xfYWNjZXNzX2xldmVsX2JlZm9yZSBmbiwgaW50IG1heF9zb3VyY2UpOworX19pc2xfZ2l2ZSBpc2xfYWNjZXNzX2luZm8gKmlzbF9hY2Nlc3NfaW5mb19zZXRfcmVzdHJpY3QoCisJX19pc2xfdGFrZSBpc2xfYWNjZXNzX2luZm8gKmFjYywgaXNsX2FjY2Vzc19yZXN0cmljdCBmbiwgdm9pZCAqdXNlcik7CitfX2lzbF9naXZlIGlzbF9hY2Nlc3NfaW5mbyAqaXNsX2FjY2Vzc19pbmZvX2FkZF9zb3VyY2UoCisJX19pc2xfdGFrZSBpc2xfYWNjZXNzX2luZm8gKmFjYywgX19pc2xfdGFrZSBpc2xfbWFwICpzb3VyY2UsCisJaW50IG11c3QsIHZvaWQgKnNvdXJjZV91c2VyKTsKK3ZvaWQgKmlzbF9hY2Nlc3NfaW5mb19mcmVlKF9faXNsX3Rha2UgaXNsX2FjY2Vzc19pbmZvICphY2MpOworCitpc2xfY3R4ICppc2xfYWNjZXNzX2luZm9fZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9hY2Nlc3NfaW5mbyAqYWNjKTsKKworX19pc2xfZ2l2ZSBpc2xfZmxvdyAqaXNsX2FjY2Vzc19pbmZvX2NvbXB1dGVfZmxvdyhfX2lzbF90YWtlIGlzbF9hY2Nlc3NfaW5mbyAqYWNjKTsKK2ludCBpc2xfZmxvd19mb3JlYWNoKF9faXNsX2tlZXAgaXNsX2Zsb3cgKmRlcHMsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX21hcCAqZGVwLCBpbnQgbXVzdCwgdm9pZCAqZGVwX3VzZXIsIHZvaWQgKnVzZXIpLAorCXZvaWQgKnVzZXIpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfZmxvd19nZXRfbm9fc291cmNlKF9faXNsX2tlZXAgaXNsX2Zsb3cgKmRlcHMsIGludCBtdXN0KTsKK3ZvaWQgaXNsX2Zsb3dfZnJlZShfX2lzbF90YWtlIGlzbF9mbG93ICpkZXBzKTsKKworaXNsX2N0eCAqaXNsX2Zsb3dfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9mbG93ICpkZXBzKTsKKworaW50IGlzbF91bmlvbl9tYXBfY29tcHV0ZV9mbG93KF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqc2luaywKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKm11c3Rfc291cmNlLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqbWF5X3NvdXJjZSwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnNjaGVkdWxlLAorCV9faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqKm11c3RfZGVwLCBfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKiptYXlfZGVwLAorCV9faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqKm11c3Rfbm9fc291cmNlLAorCV9faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqKm1heV9ub19zb3VyY2UpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2hhc2guaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzY0YTliCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvaGFzaC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEthdGhvbGlla2UgVW5pdmVyc2l0ZWl0IExldXZlbgorICoKKyAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBNSVQgbGljZW5zZQorICoKKyAqIFdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZSwgSy5VLkxldXZlbiwgRGVwYXJ0ZW1lbnQKKyAqIENvbXB1dGVyd2V0ZW5zY2hhcHBlbiwgQ2VsZXN0aWpuZW5sYWFuIDIwMEEsIEItMzAwMSBMZXV2ZW4sIEJlbGdpdW0KKyAqLworCisjaWZuZGVmIElTTF9IQVNIX0gKKyNkZWZpbmUgSVNMX0hBU0hfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8aXNsL3N0ZGludC5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgaXNsX2hhc2hfaW5pdCgpCQkoMjE2NjEzNjI2MXUpCisjZGVmaW5lIGlzbF9oYXNoX2J5dGUoaCxiKQlkbyB7CQkJCQlcCisJCQkJCWggKj0gMTY3Nzc2MTk7CQkJXAorCQkJCQloIF49IGI7CQkJCVwKKwkJCQl9IHdoaWxlKDApCisjZGVmaW5lIGlzbF9oYXNoX2hhc2goaCxoMikJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpc2xfaGFzaF9ieXRlKGgsIChoMikgJiAweEZGKTsJCQkJXAorCQlpc2xfaGFzaF9ieXRlKGgsICgoaDIpID4+IDgpICYgMHhGRik7CQkJXAorCQlpc2xfaGFzaF9ieXRlKGgsICgoaDIpID4+IDE2KSAmIDB4RkYpOwkJCVwKKwkJaXNsX2hhc2hfYnl0ZShoLCAoKGgyKSA+PiAyNCkgJiAweEZGKTsJCQlcCisJfSB3aGlsZSgwKQorI2RlZmluZSBpc2xfaGFzaF9iaXRzKGgsYml0cykJCQkJCQlcCisJKChiaXRzKSA9PSAzMikgPyAoaCkgOgkJCQkJCVwKKwkoKGJpdHMpID49IDE2KSA/CQkJCQkJXAorCSAgICAgICgoaCkgPj4gKGJpdHMpKSBeICgoaCkgJiAoKCh1aW50MzJfdCkxIDw8IChiaXRzKSkgLSAxKSkgOglcCisJICAgICAgKCgoaCkgPj4gKGJpdHMpKSBeIChoKSkgJiAoKCh1aW50MzJfdCkxIDw8IChiaXRzKSkgLSAxKQorCit1aW50MzJfdCBpc2xfaGFzaF9zdHJpbmcodWludDMyX3QgaGFzaCwgY29uc3QgY2hhciAqcyk7Cit1aW50MzJfdCBpc2xfaGFzaF9tZW0odWludDMyX3QgaGFzaCwgY29uc3Qgdm9pZCAqcCwgc2l6ZV90IGxlbik7CisKKyNkZWZpbmUgaXNsX2hhc2hfYnVpbHRpbihoLGwpCWlzbF9oYXNoX21lbShoLCAmbCwgc2l6ZW9mKGwpKQorCitzdHJ1Y3QgaXNsX2hhc2hfdGFibGVfZW50cnkKK3sKKwl1aW50MzJfdCAgaGFzaDsKKwl2b2lkICAgICAqZGF0YTsKK307CisKK3N0cnVjdCBpc2xfaGFzaF90YWJsZSB7CisJaW50ICAgIGJpdHM7CisJaW50ICAgIG47CisJc3RydWN0IGlzbF9oYXNoX3RhYmxlX2VudHJ5ICplbnRyaWVzOworfTsKKworc3RydWN0IGlzbF9jdHg7CisKK3N0cnVjdCBpc2xfaGFzaF90YWJsZSAqaXNsX2hhc2hfdGFibGVfYWxsb2Moc3RydWN0IGlzbF9jdHggKmN0eCwgaW50IG1pbl9zaXplKTsKK3ZvaWQgaXNsX2hhc2hfdGFibGVfZnJlZShzdHJ1Y3QgaXNsX2N0eCAqY3R4LCBzdHJ1Y3QgaXNsX2hhc2hfdGFibGUgKnRhYmxlKTsKKworaW50IGlzbF9oYXNoX3RhYmxlX2luaXQoc3RydWN0IGlzbF9jdHggKmN0eCwgc3RydWN0IGlzbF9oYXNoX3RhYmxlICp0YWJsZSwKKwkJCWludCBtaW5fc2l6ZSk7Cit2b2lkIGlzbF9oYXNoX3RhYmxlX2NsZWFyKHN0cnVjdCBpc2xfaGFzaF90YWJsZSAqdGFibGUpOworc3RydWN0IGlzbF9oYXNoX3RhYmxlX2VudHJ5ICppc2xfaGFzaF90YWJsZV9maW5kKHN0cnVjdCBpc2xfY3R4ICpjdHgsCisJCQkJc3RydWN0IGlzbF9oYXNoX3RhYmxlICp0YWJsZSwKKwkJCQl1aW50MzJfdCBrZXlfaGFzaCwKKwkJCQlpbnQgKCplcSkoY29uc3Qgdm9pZCAqZW50cnksIGNvbnN0IHZvaWQgKnZhbCksCisJCQkJY29uc3Qgdm9pZCAqdmFsLCBpbnQgcmVzZXJ2ZSk7CitpbnQgaXNsX2hhc2hfdGFibGVfZm9yZWFjaChzdHJ1Y3QgaXNsX2N0eCAqY3R4LAorCQkJICAgIHN0cnVjdCBpc2xfaGFzaF90YWJsZSAqdGFibGUsCisJCQkgICAgaW50ICgqZm4pKHZvaWQgKiplbnRyeSwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOwordm9pZCBpc2xfaGFzaF90YWJsZV9yZW1vdmUoc3RydWN0IGlzbF9jdHggKmN0eCwKKwkJCQlzdHJ1Y3QgaXNsX2hhc2hfdGFibGUgKnRhYmxlLAorCQkJCXN0cnVjdCBpc2xfaGFzaF90YWJsZV9lbnRyeSAqZW50cnkpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2lkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzdiMjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9pZC5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgSVNMX0lEX0gKKyNkZWZpbmUgSVNMX0lEX0gKKworI2luY2x1ZGUgPGlzbC9jdHguaD4KKyNpbmNsdWRlIDxpc2wvcHJpbnRlci5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBpc2xfaWQ7Cit0eXBlZGVmIHN0cnVjdCBpc2xfaWQgaXNsX2lkOworCitpc2xfY3R4ICppc2xfaWRfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9pZCAqaWQpOworCitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX2lkX2FsbG9jKGlzbF9jdHggKmN0eCwKKwlfX2lzbF9rZWVwIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnVzZXIpOworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9pZF9jb3B5KGlzbF9pZCAqaWQpOwordm9pZCAqaXNsX2lkX2ZyZWUoX19pc2xfdGFrZSBpc2xfaWQgKmlkKTsKKwordm9pZCAqaXNsX2lkX2dldF91c2VyKF9faXNsX2tlZXAgaXNsX2lkICppZCk7CitfX2lzbF9rZWVwIGNvbnN0IGNoYXIgKmlzbF9pZF9nZXRfbmFtZShfX2lzbF9rZWVwIGlzbF9pZCAqaWQpOworCitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX2lkX3NldF9mcmVlX3VzZXIoX19pc2xfdGFrZSBpc2xfaWQgKmlkLAorCV9faXNsX2dpdmUgdm9pZCAoKmZyZWVfdXNlcikodm9pZCAqdXNlcikpOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9pZChfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCV9faXNsX2tlZXAgaXNsX2lkICppZCk7Cit2b2lkIGlzbF9pZF9kdW1wKF9faXNsX2tlZXAgaXNsX2lkICppZCk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvaWxwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9pbHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdjM2JjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvaWxwLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgS2F0aG9saWVrZSBVbml2ZXJzaXRlaXQgTGV1dmVuCisgKgorICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIE1JVCBsaWNlbnNlCisgKgorICogV3JpdHRlbiBieSBTdmVuIFZlcmRvb2xhZWdlLCBLLlUuTGV1dmVuLCBEZXBhcnRlbWVudAorICogQ29tcHV0ZXJ3ZXRlbnNjaGFwcGVuLCBDZWxlc3Rpam5lbmxhYW4gMjAwQSwgQi0zMDAxIExldXZlbiwgQmVsZ2l1bQorICovCisKKyNpZm5kZWYgSVNMX0lMUF9ICisjZGVmaW5lIElTTF9JTFBfSAorCisjaW5jbHVkZSA8aXNsL2FmZl90eXBlLmg+CisjaW5jbHVkZSA8aXNsL2xwLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZW51bSBpc2xfbHBfcmVzdWx0IGlzbF9iYXNpY19zZXRfc29sdmVfaWxwKHN0cnVjdCBpc2xfYmFzaWNfc2V0ICpic2V0LCBpbnQgbWF4LAorCQkJCSAgICAgIGlzbF9pbnQgKmYsIGlzbF9pbnQgKm9wdCwKKwkJCQkgICAgICBzdHJ1Y3QgaXNsX3ZlYyAqKnNvbF9wKTsKK2VudW0gaXNsX2xwX3Jlc3VsdCBpc2xfYmFzaWNfc2V0X21heChfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJX19pc2xfa2VlcCBpc2xfYWZmICpvYmosIGlzbF9pbnQgKm9wdCk7CitlbnVtIGlzbF9scF9yZXN1bHQgaXNsX3NldF9taW4oX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJX19pc2xfa2VlcCBpc2xfYWZmICpvYmosIGlzbF9pbnQgKm9wdCk7CitlbnVtIGlzbF9scF9yZXN1bHQgaXNsX3NldF9tYXgoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJX19pc2xfa2VlcCBpc2xfYWZmICpvYmosIGlzbF9pbnQgKm9wdCk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvaW50LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzkxZGY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvaW50LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEthdGhvbGlla2UgVW5pdmVyc2l0ZWl0IExldXZlbgorICoKKyAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBNSVQgbGljZW5zZQorICoKKyAqIFdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZSwgSy5VLkxldXZlbiwgRGVwYXJ0ZW1lbnQKKyAqIENvbXB1dGVyd2V0ZW5zY2hhcHBlbiwgQ2VsZXN0aWpuZW5sYWFuIDIwMEEsIEItMzAwMSBMZXV2ZW4sIEJlbGdpdW0KKyAqLworCisjaWZuZGVmIElTTF9JTlRfSAorI2RlZmluZSBJU0xfSU5UX0gKKworI2luY2x1ZGUgPGlzbC9oYXNoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z21wLmg+CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMKK3ZvaWQgbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMoCisJCXZvaWQgKigqKmFsbG9jX2Z1bmNfcHRyKSAoc2l6ZV90KSwKKwkJdm9pZCAqKCoqcmVhbGxvY19mdW5jX3B0cikgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QpLAorCQl2b2lkICgqKmZyZWVfZnVuY19wdHIpICh2b2lkICosIHNpemVfdCkpOworI2VuZGlmCisKKy8qIGlzbF9pbnQgaXMgdGhlIGJhc2ljIGludGVnZXIgdHlwZS4gIEl0IGN1cnJlbnRseSBhbHdheXMgY29ycmVzcG9uZHMKKyAqIHRvIGEgZ21wIG1wel90LCBidXQgaW4gdGhlIGZ1dHVyZSwgZGlmZmVyZW50IHR5cGVzIHN1Y2ggYXMgbG9uZyBsb25nCisgKiBvciBjbG46OmNsX0kgd2lsbCBiZSBzdXBwb3J0ZWQuCisgKi8KK3R5cGVkZWYgbXB6X3QJaXNsX2ludDsKKworI2RlZmluZSBpc2xfaW50X2luaXQoaSkJCW1wel9pbml0KGkpCisjZGVmaW5lIGlzbF9pbnRfY2xlYXIoaSkJbXB6X2NsZWFyKGkpCisKKyNkZWZpbmUgaXNsX2ludF9zZXQocixpKQltcHpfc2V0KHIsaSkKKyNkZWZpbmUgaXNsX2ludF9zZXRfZ21wKHIsaSkJbXB6X3NldChyLGkpCisjZGVmaW5lIGlzbF9pbnRfc2V0X3NpKHIsaSkJbXB6X3NldF9zaShyLGkpCisjZGVmaW5lIGlzbF9pbnRfc2V0X3VpKHIsaSkJbXB6X3NldF91aShyLGkpCisjZGVmaW5lIGlzbF9pbnRfZ2V0X2dtcChpLGcpCW1wel9zZXQoZyxpKQorI2RlZmluZSBpc2xfaW50X2dldF9zaShyKQltcHpfZ2V0X3NpKHIpCisjZGVmaW5lIGlzbF9pbnRfZ2V0X3VpKHIpCW1wel9nZXRfdWkocikKKyNkZWZpbmUgaXNsX2ludF9nZXRfZChyKQltcHpfZ2V0X2QocikKKyNkZWZpbmUgaXNsX2ludF9nZXRfc3RyKHIpCW1wel9nZXRfc3RyKDAsIDEwLCByKQordHlwZWRlZiB2b2lkICgqaXNsX2ludF9wcmludF9nbXBfZnJlZV90KSh2b2lkICosIHNpemVfdCk7CisjZGVmaW5lIGlzbF9pbnRfZnJlZV9zdHIocykJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlzbF9pbnRfcHJpbnRfZ21wX2ZyZWVfdCBnbXBfZnJlZTsJCQlcCisJCW1wX2dldF9tZW1vcnlfZnVuY3Rpb25zKE5VTEwsIE5VTEwsICZnbXBfZnJlZSk7CQlcCisJCSgqZ21wX2ZyZWUpKHMsIHN0cmxlbihzKSArIDEpOwkJCQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgaXNsX2ludF9hYnMocixpKQltcHpfYWJzKHIsaSkKKyNkZWZpbmUgaXNsX2ludF9uZWcocixpKQltcHpfbmVnKHIsaSkKKyNkZWZpbmUgaXNsX2ludF9zd2FwKGksaikJbXB6X3N3YXAoaSxqKQorI2RlZmluZSBpc2xfaW50X3N3YXBfb3Jfc2V0KGksaikJbXB6X3N3YXAoaSxqKQorI2RlZmluZSBpc2xfaW50X2FkZF91aShyLGksaikJbXB6X2FkZF91aShyLGksaikKKyNkZWZpbmUgaXNsX2ludF9zdWJfdWkocixpLGopCW1wel9zdWJfdWkocixpLGopCisKKyNkZWZpbmUgaXNsX2ludF9hZGQocixpLGopCW1wel9hZGQocixpLGopCisjZGVmaW5lIGlzbF9pbnRfc3ViKHIsaSxqKQltcHpfc3ViKHIsaSxqKQorI2RlZmluZSBpc2xfaW50X211bChyLGksaikJbXB6X211bChyLGksaikKKyNkZWZpbmUgaXNsX2ludF9tdWxfMmV4cChyLGksaikJbXB6X211bF8yZXhwKHIsaSxqKQorI2RlZmluZSBpc2xfaW50X211bF91aShyLGksaikJbXB6X211bF91aShyLGksaikKKyNkZWZpbmUgaXNsX2ludF9wb3dfdWkocixpLGopCW1wel9wb3dfdWkocixpLGopCisjZGVmaW5lIGlzbF9pbnRfYWRkbXVsKHIsaSxqKQltcHpfYWRkbXVsKHIsaSxqKQorI2RlZmluZSBpc2xfaW50X3N1Ym11bChyLGksaikJbXB6X3N1Ym11bChyLGksaikKKworI2RlZmluZSBpc2xfaW50X2djZChyLGksaikJbXB6X2djZChyLGksaikKKyNkZWZpbmUgaXNsX2ludF9sY20ocixpLGopCW1wel9sY20ocixpLGopCisjZGVmaW5lIGlzbF9pbnRfZGl2ZXhhY3QocixpLGopCW1wel9kaXZleGFjdChyLGksaikKKyNkZWZpbmUgaXNsX2ludF9kaXZleGFjdF91aShyLGksaikJbXB6X2RpdmV4YWN0X3VpKHIsaSxqKQorI2RlZmluZSBpc2xfaW50X3RkaXZfcShyLGksaikJbXB6X3RkaXZfcShyLGksaikKKyNkZWZpbmUgaXNsX2ludF9jZGl2X3EocixpLGopCW1wel9jZGl2X3EocixpLGopCisjZGVmaW5lIGlzbF9pbnRfZmRpdl9xKHIsaSxqKQltcHpfZmRpdl9xKHIsaSxqKQorI2RlZmluZSBpc2xfaW50X2ZkaXZfcihyLGksaikJbXB6X2ZkaXZfcihyLGksaikKKyNkZWZpbmUgaXNsX2ludF9mZGl2X3FfdWkocixpLGopCW1wel9mZGl2X3FfdWkocixpLGopCisKKyNkZWZpbmUgaXNsX2ludF9yZWFkKHIscykJbXB6X3NldF9zdHIocixzLDEwKQorI2RlZmluZSBpc2xfaW50X3ByaW50KG91dCxpLHdpZHRoKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJY2hhciAqczsJCQkJCQlcCisJCXMgPSBtcHpfZ2V0X3N0cigwLCAxMCwgaSk7CQkJCVwKKwkJZnByaW50ZihvdXQsICIlKnMiLCB3aWR0aCwgcyk7CQkJCVwKKwkJaXNsX2ludF9mcmVlX3N0cihzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgaXNsX2ludF9zZ24oaSkJCW1wel9zZ24oaSkKKyNkZWZpbmUgaXNsX2ludF9jbXAoaSxqKQltcHpfY21wKGksaikKKyNkZWZpbmUgaXNsX2ludF9jbXBfc2koaSxzaSkJbXB6X2NtcF9zaShpLHNpKQorI2RlZmluZSBpc2xfaW50X2VxKGksaikJCShtcHpfY21wKGksaikgPT0gMCkKKyNkZWZpbmUgaXNsX2ludF9uZShpLGopCQkobXB6X2NtcChpLGopICE9IDApCisjZGVmaW5lIGlzbF9pbnRfbHQoaSxqKQkJKG1wel9jbXAoaSxqKSA8IDApCisjZGVmaW5lIGlzbF9pbnRfbGUoaSxqKQkJKG1wel9jbXAoaSxqKSA8PSAwKQorI2RlZmluZSBpc2xfaW50X2d0KGksaikJCShtcHpfY21wKGksaikgPiAwKQorI2RlZmluZSBpc2xfaW50X2dlKGksaikJCShtcHpfY21wKGksaikgPj0gMCkKKyNkZWZpbmUgaXNsX2ludF9hYnNfZXEoaSxqKQkobXB6X2NtcGFicyhpLGopID09IDApCisjZGVmaW5lIGlzbF9pbnRfYWJzX25lKGksaikJKG1wel9jbXBhYnMoaSxqKSAhPSAwKQorI2RlZmluZSBpc2xfaW50X2Fic19sdChpLGopCShtcHpfY21wYWJzKGksaikgPCAwKQorI2RlZmluZSBpc2xfaW50X2Fic19ndChpLGopCShtcHpfY21wYWJzKGksaikgPiAwKQorI2RlZmluZSBpc2xfaW50X2Fic19nZShpLGopCShtcHpfY21wYWJzKGksaikgPj0gMCkKKworCisjZGVmaW5lIGlzbF9pbnRfaXNfemVybyhpKQkoaXNsX2ludF9zZ24oaSkgPT0gMCkKKyNkZWZpbmUgaXNsX2ludF9pc19vbmUoaSkJKGlzbF9pbnRfY21wX3NpKGksMSkgPT0gMCkKKyNkZWZpbmUgaXNsX2ludF9pc19uZWdvbmUoaSkJKGlzbF9pbnRfY21wX3NpKGksLTEpID09IDApCisjZGVmaW5lIGlzbF9pbnRfaXNfcG9zKGkpCShpc2xfaW50X3NnbihpKSA+IDApCisjZGVmaW5lIGlzbF9pbnRfaXNfbmVnKGkpCShpc2xfaW50X3NnbihpKSA8IDApCisjZGVmaW5lIGlzbF9pbnRfaXNfbm9ucG9zKGkpCShpc2xfaW50X3NnbihpKSA8PSAwKQorI2RlZmluZSBpc2xfaW50X2lzX25vbm5lZyhpKQkoaXNsX2ludF9zZ24oaSkgPj0gMCkKKyNkZWZpbmUgaXNsX2ludF9pc19kaXZpc2libGVfYnkoaSxqKQltcHpfZGl2aXNpYmxlX3AoaSxqKQorCit1aW50MzJfdCBpc2xfZ21wX2hhc2gobXB6X3QgdiwgdWludDMyX3QgaGFzaCk7CisjZGVmaW5lIGlzbF9pbnRfaGFzaCh2LGgpCWlzbF9nbXBfaGFzaCh2LGgpCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7IHR5cGVkZWYgdm9pZCAoKmlzbF9nbXBfZnJlZV90KSh2b2lkICosIHNpemVfdCk7IH0KKworc3RhdGljIGlubGluZSBzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvcywgaXNsX2ludCBpKQoreworCWNoYXIgKnM7CisJcyA9IG1wel9nZXRfc3RyKDAsIDEwLCBpKTsKKwlvcyA8PCBzOworCWlzbF9pbnRfZnJlZV9zdHIocyk7CisJcmV0dXJuIG9zOworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvbGlzdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZTdkMWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9saXN0LmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgS2F0aG9saWVrZSBVbml2ZXJzaXRlaXQgTGV1dmVuCisgKgorICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIE1JVCBsaWNlbnNlCisgKgorICogV3JpdHRlbiBieSBTdmVuIFZlcmRvb2xhZWdlLCBLLlUuTGV1dmVuLCBEZXBhcnRlbWVudAorICogQ29tcHV0ZXJ3ZXRlbnNjaGFwcGVuLCBDZWxlc3Rpam5lbmxhYW4gMjAwQSwgQi0zMDAxIExldXZlbiwgQmVsZ2l1bQorICovCisKKyNpZm5kZWYgSVNMX0xJU1RfSAorI2RlZmluZSBJU0xfTElTVF9ICisKKyNpbmNsdWRlIDxpc2wvY3R4Lmg+CisjaW5jbHVkZSA8aXNsL3ByaW50ZXIuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIElTTF9ERUNMQVJFX0xJU1QoRUwpCQkJCQkJXAorc3RydWN0IGlzbF8jI0VMOwkJCQkJCQlcCitzdHJ1Y3QgaXNsXyMjRUwjI19saXN0OwkJCQkJCQlcCit0eXBlZGVmIHN0cnVjdCBpc2xfIyNFTCMjX2xpc3QgaXNsXyMjRUwjI19saXN0OwkJCQlcCitpc2xfY3R4ICppc2xfIyNFTCMjX2xpc3RfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF8jI0VMIyNfbGlzdCAqbGlzdCk7CVwKK19faXNsX2dpdmUgaXNsXyMjRUwjI19saXN0ICppc2xfIyNFTCMjX2xpc3RfZnJvbV8jI0VMKAkJCVwKKwlfX2lzbF90YWtlIHN0cnVjdCBpc2xfIyNFTCAqZWwpOwkJCQlcCitfX2lzbF9naXZlIGlzbF8jI0VMIyNfbGlzdCAqaXNsXyMjRUwjI19saXN0X2FsbG9jKGlzbF9jdHggKmN0eCwgaW50IG4pOwlcCitfX2lzbF9naXZlIGlzbF8jI0VMIyNfbGlzdCAqaXNsXyMjRUwjI19saXN0X2NvcHkoCQkJXAorCV9faXNsX2tlZXAgaXNsXyMjRUwjI19saXN0ICpsaXN0KTsJCQkJXAordm9pZCAqaXNsXyMjRUwjI19saXN0X2ZyZWUoX19pc2xfdGFrZSBpc2xfIyNFTCMjX2xpc3QgKmxpc3QpOwkJXAorX19pc2xfZ2l2ZSBpc2xfIyNFTCMjX2xpc3QgKmlzbF8jI0VMIyNfbGlzdF9hZGQoCQkJXAorCV9faXNsX3Rha2UgaXNsXyMjRUwjI19saXN0ICpsaXN0LAkJCQlcCisJX19pc2xfdGFrZSBzdHJ1Y3QgaXNsXyMjRUwgKmVsKTsJCQkJXAorX19pc2xfZ2l2ZSBpc2xfIyNFTCMjX2xpc3QgKmlzbF8jI0VMIyNfbGlzdF9pbnNlcnQoCQkJXAorCV9faXNsX3Rha2UgaXNsXyMjRUwjI19saXN0ICpsaXN0LCB1bnNpZ25lZCBwb3MsCQkJXAorCV9faXNsX3Rha2Ugc3RydWN0IGlzbF8jI0VMICplbCk7CQkJCVwKK19faXNsX2dpdmUgaXNsXyMjRUwjI19saXN0ICppc2xfIyNFTCMjX2xpc3RfZHJvcCgJCQlcCisJX19pc2xfdGFrZSBpc2xfIyNFTCMjX2xpc3QgKmxpc3QsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsJXAorX19pc2xfZ2l2ZSBpc2xfIyNFTCMjX2xpc3QgKmlzbF8jI0VMIyNfbGlzdF9jb25jYXQoCQkJXAorCV9faXNsX3Rha2UgaXNsXyMjRUwjI19saXN0ICpsaXN0MSwJCQkJXAorCV9faXNsX3Rha2UgaXNsXyMjRUwjI19saXN0ICpsaXN0Mik7CQkJCVwKK2ludCBpc2xfIyNFTCMjX2xpc3Rfbl8jI0VMKF9faXNsX2tlZXAgaXNsXyMjRUwjI19saXN0ICpsaXN0KTsJCVwKK19faXNsX2dpdmUgc3RydWN0IGlzbF8jI0VMICppc2xfIyNFTCMjX2xpc3RfZ2V0XyMjRUwoCQkJXAorCV9faXNsX2tlZXAgaXNsXyMjRUwjI19saXN0ICpsaXN0LCBpbnQgaW5kZXgpOwkJCVwKK19faXNsX2dpdmUgc3RydWN0IGlzbF8jI0VMIyNfbGlzdCAqaXNsXyMjRUwjI19saXN0X3NldF8jI0VMKAkJXAorCV9faXNsX3Rha2Ugc3RydWN0IGlzbF8jI0VMIyNfbGlzdCAqbGlzdCwgaW50IGluZGV4LAkJXAorCV9faXNsX3Rha2Ugc3RydWN0IGlzbF8jI0VMICplbCk7CQkJCVwKK2ludCBpc2xfIyNFTCMjX2xpc3RfZm9yZWFjaChfX2lzbF9rZWVwIGlzbF8jI0VMIyNfbGlzdCAqbGlzdCwJCVwKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBzdHJ1Y3QgaXNsXyMjRUwgKmVsLCB2b2lkICp1c2VyKSwJCVwKKwl2b2lkICp1c2VyKTsJCQkJCQkJXAorX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfIyNFTCMjX2xpc3QoCQkJXAorCV9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsIF9faXNsX2tlZXAgaXNsXyMjRUwjI19saXN0ICpsaXN0KTsJXAordm9pZCBpc2xfIyNFTCMjX2xpc3RfZHVtcChfX2lzbF9rZWVwIGlzbF8jI0VMIyNfbGlzdCAqbGlzdCk7CisKK0lTTF9ERUNMQVJFX0xJU1QoaWQpCitJU0xfREVDTEFSRV9MSVNUKGNvbnN0cmFpbnQpCitJU0xfREVDTEFSRV9MSVNUKGJhc2ljX3NldCkKK0lTTF9ERUNMQVJFX0xJU1Qoc2V0KQorSVNMX0RFQ0xBUkVfTElTVChhZmYpCitJU0xfREVDTEFSRV9MSVNUKHB3X2FmZikKK0lTTF9ERUNMQVJFX0xJU1QoYmFuZCkKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9sb2NhbF9zcGFjZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvbG9jYWxfc3BhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTU1MjYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvbG9jYWxfc3BhY2UuaApAQCAtMCwwICsxLDc4IEBACisjaWZuZGVmIElTTF9MT0NBTF9TUEFDRV9ICisjZGVmaW5lIElTTF9MT0NBTF9TUEFDRV9ICisKKyNpbmNsdWRlIDxpc2wvYWZmX3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvc3BhY2UuaD4KKyNpbmNsdWRlIDxpc2wvcHJpbnRlci5oPgorI2luY2x1ZGUgPGlzbC9tYXBfdHlwZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBpc2xfbG9jYWxfc3BhY2U7Cit0eXBlZGVmIHN0cnVjdCBpc2xfbG9jYWxfc3BhY2UgaXNsX2xvY2FsX3NwYWNlOworCitpc2xfY3R4ICppc2xfbG9jYWxfc3BhY2VfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9sb2NhbF9zcGFjZSAqbHMpOworCitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2xvY2FsX3NwYWNlX2Zyb21fc3BhY2UoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CisKK19faXNsX2dpdmUgaXNsX2xvY2FsX3NwYWNlICppc2xfbG9jYWxfc3BhY2VfY29weSgKKwlfX2lzbF9rZWVwIGlzbF9sb2NhbF9zcGFjZSAqbHMpOwordm9pZCAqaXNsX2xvY2FsX3NwYWNlX2ZyZWUoX19pc2xfdGFrZSBpc2xfbG9jYWxfc3BhY2UgKmxzKTsKKworaW50IGlzbF9sb2NhbF9zcGFjZV9pc19zZXQoX19pc2xfa2VlcCBpc2xfbG9jYWxfc3BhY2UgKmxzKTsKKworaW50IGlzbF9sb2NhbF9zcGFjZV9kaW0oX19pc2xfa2VlcCBpc2xfbG9jYWxfc3BhY2UgKmxzLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworaW50IGlzbF9sb2NhbF9zcGFjZV9oYXNfZGltX25hbWUoX19pc2xfa2VlcCBpc2xfbG9jYWxfc3BhY2UgKmxzLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7Citjb25zdCBjaGFyICppc2xfbG9jYWxfc3BhY2VfZ2V0X2RpbV9uYW1lKF9faXNsX2tlZXAgaXNsX2xvY2FsX3NwYWNlICpscywKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfbG9jYWxfc3BhY2UgKmlzbF9sb2NhbF9zcGFjZV9zZXRfZGltX25hbWUoCisJX19pc2xfdGFrZSBpc2xfbG9jYWxfc3BhY2UgKmxzLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgY29uc3QgY2hhciAqcyk7CitpbnQgaXNsX2xvY2FsX3NwYWNlX2hhc19kaW1faWQoX19pc2xfa2VlcCBpc2xfbG9jYWxfc3BhY2UgKmxzLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX2xvY2FsX3NwYWNlX2dldF9kaW1faWQoX19pc2xfa2VlcCBpc2xfbG9jYWxfc3BhY2UgKmxzLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2xvY2FsX3NwYWNlX3NldF9kaW1faWQoCisJX19pc2xfdGFrZSBpc2xfbG9jYWxfc3BhY2UgKmxzLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgX19pc2xfdGFrZSBpc2xfaWQgKmlkKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfbG9jYWxfc3BhY2VfZ2V0X3NwYWNlKF9faXNsX2tlZXAgaXNsX2xvY2FsX3NwYWNlICpscyk7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9sb2NhbF9zcGFjZV9nZXRfZGl2KF9faXNsX2tlZXAgaXNsX2xvY2FsX3NwYWNlICpscywKKwlpbnQgcG9zKTsKKworX19pc2xfZ2l2ZSBpc2xfbG9jYWxfc3BhY2UgKmlzbF9sb2NhbF9zcGFjZV9kb21haW4oCisJX19pc2xfdGFrZSBpc2xfbG9jYWxfc3BhY2UgKmxzKTsKK19faXNsX2dpdmUgaXNsX2xvY2FsX3NwYWNlICppc2xfbG9jYWxfc3BhY2VfcmFuZ2UoCisJX19pc2xfdGFrZSBpc2xfbG9jYWxfc3BhY2UgKmxzKTsKK19faXNsX2dpdmUgaXNsX2xvY2FsX3NwYWNlICppc2xfbG9jYWxfc3BhY2VfZnJvbV9kb21haW4oCisJX19pc2xfdGFrZSBpc2xfbG9jYWxfc3BhY2UgKmxzKTsKK19faXNsX2dpdmUgaXNsX2xvY2FsX3NwYWNlICppc2xfbG9jYWxfc3BhY2VfYWRkX2RpbXMoCisJX19pc2xfdGFrZSBpc2xfbG9jYWxfc3BhY2UgKmxzLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX2xvY2FsX3NwYWNlICppc2xfbG9jYWxfc3BhY2VfZHJvcF9kaW1zKAorCV9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpscywKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2xvY2FsX3NwYWNlX2luc2VydF9kaW1zKAorCV9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpscywKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CisKK19faXNsX2dpdmUgaXNsX2xvY2FsX3NwYWNlICppc2xfbG9jYWxfc3BhY2VfaW50ZXJzZWN0KAorCV9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpsczEsIF9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpsczIpOworCitpbnQgaXNsX2xvY2FsX3NwYWNlX2lzX2VxdWFsKF9faXNsX2tlZXAgaXNsX2xvY2FsX3NwYWNlICpsczEsCisJX19pc2xfa2VlcCBpc2xfbG9jYWxfc3BhY2UgKmxzMik7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2xvY2FsX3NwYWNlX2xpZnRpbmcoCisJX19pc2xfdGFrZSBpc2xfbG9jYWxfc3BhY2UgKmxzKTsKKworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfbG9jYWxfc3BhY2UoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlfX2lzbF9rZWVwIGlzbF9sb2NhbF9zcGFjZSAqbHMpOwordm9pZCBpc2xfbG9jYWxfc3BhY2VfZHVtcChfX2lzbF9rZWVwIGlzbF9sb2NhbF9zcGFjZSAqbHMpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL2xwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9scC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NTAzNzIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9scC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEthdGhvbGlla2UgVW5pdmVyc2l0ZWl0IExldXZlbgorICoKKyAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBNSVQgbGljZW5zZQorICoKKyAqIFdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZSwgSy5VLkxldXZlbiwgRGVwYXJ0ZW1lbnQKKyAqIENvbXB1dGVyd2V0ZW5zY2hhcHBlbiwgQ2VsZXN0aWpuZW5sYWFuIDIwMEEsIEItMzAwMSBMZXV2ZW4sIEJlbGdpdW0KKyAqLworCisjaWZuZGVmIElTTF9MUF9ICisjZGVmaW5lIElTTF9MUF9ICisKKyNpbmNsdWRlIDxpc2wvaW50Lmg+CisjaW5jbHVkZSA8aXNsL3ZlYy5oPgorI2luY2x1ZGUgPGlzbC9tYXBfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9zZXRfdHlwZS5oPgorCitlbnVtIGlzbF9scF9yZXN1bHQgeworCWlzbF9scF9lcnJvciA9IC0xLAorCWlzbF9scF9vayA9IDAsCisJaXNsX2xwX3VuYm91bmRlZCwKKwlpc2xfbHBfZW1wdHkKK307CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZW51bSBpc2xfbHBfcmVzdWx0IGlzbF9iYXNpY19tYXBfc29sdmVfbHAoc3RydWN0IGlzbF9iYXNpY19tYXAgKmJtYXAsIGludCBtYXgsCisJCQkJICAgICAgaXNsX2ludCAqZiwgaXNsX2ludCBkZW5vbSwgaXNsX2ludCAqb3B0LAorCQkJCSAgICAgIGlzbF9pbnQgKm9wdF9kZW5vbSwKKwkJCQkgICAgICBzdHJ1Y3QgaXNsX3ZlYyAqKnNvbCk7CitlbnVtIGlzbF9scF9yZXN1bHQgaXNsX2Jhc2ljX3NldF9zb2x2ZV9scChzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqYnNldCwgaW50IG1heCwKKwkJCQkgICAgICBpc2xfaW50ICpmLCBpc2xfaW50IGRlbm9tLCBpc2xfaW50ICpvcHQsCisJCQkJICAgICAgaXNsX2ludCAqb3B0X2Rlbm9tLAorCQkJCSAgICAgIHN0cnVjdCBpc2xfdmVjICoqc29sKTsKK2VudW0gaXNsX2xwX3Jlc3VsdCBpc2xfbWFwX3NvbHZlX2xwKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLCBpbnQgbWF4LAorCQkJCSAgICAgIGlzbF9pbnQgKmYsIGlzbF9pbnQgZGVub20sIGlzbF9pbnQgKm9wdCwKKwkJCQkgICAgICBpc2xfaW50ICpvcHRfZGVub20sCisJCQkJICAgICAgc3RydWN0IGlzbF92ZWMgKipzb2wpOworZW51bSBpc2xfbHBfcmVzdWx0IGlzbF9zZXRfc29sdmVfbHAoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsIGludCBtYXgsCisJCQkJICAgICAgaXNsX2ludCAqZiwgaXNsX2ludCBkZW5vbSwgaXNsX2ludCAqb3B0LAorCQkJCSAgICAgIGlzbF9pbnQgKm9wdF9kZW5vbSwKKwkJCQkgICAgICBzdHJ1Y3QgaXNsX3ZlYyAqKnNvbCk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvbWFwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzg2ZTM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvbWFwLmgKQEAgLTAsMCArMSw2NTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEthdGhvbGlla2UgVW5pdmVyc2l0ZWl0IExldXZlbgorICoKKyAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBNSVQgbGljZW5zZQorICoKKyAqIFdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZSwgSy5VLkxldXZlbiwgRGVwYXJ0ZW1lbnQKKyAqIENvbXB1dGVyd2V0ZW5zY2hhcHBlbiwgQ2VsZXN0aWpuZW5sYWFuIDIwMEEsIEItMzAwMSBMZXV2ZW4sIEJlbGdpdW0KKyAqLworCisjaWZuZGVmIElTTF9NQVBfSAorI2RlZmluZSBJU0xfTUFQX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxpc2wvaW50Lmg+CisjaW5jbHVkZSA8aXNsL2N0eC5oPgorI2luY2x1ZGUgPGlzbC9ibGsuaD4KKyNpbmNsdWRlIDxpc2wvc3BhY2UuaD4KKyNpbmNsdWRlIDxpc2wvdmVjLmg+CisjaW5jbHVkZSA8aXNsL21hdC5oPgorI2luY2x1ZGUgPGlzbC9wcmludGVyLmg+CisjaW5jbHVkZSA8aXNsL2xvY2FsX3NwYWNlLmg+CisjaW5jbHVkZSA8aXNsL2FmZl90eXBlLmg+CisjaW5jbHVkZSA8aXNsL2xpc3QuaD4KKyNpbmNsdWRlIDxpc2wvbWFwX3R5cGUuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBHZW5lcmFsIG5vdGVzOgorICoKKyAqIEFsbCBzdHJ1Y3R1cmVzIGFyZSByZWZlcmVuY2UgY291bnRlZCB0byBhbGxvdyByZXVzZSB3aXRob3V0IGR1cGxpY2F0aW9uLgorICogQSAqX2NvcHkgb3BlcmF0aW9uIHdpbGwgaW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCwgd2hpbGUgYSAqX2ZyZWUKKyAqIG9wZXJhdGlvbiB3aWxsIGRlY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgYW5kIG9ubHkgYWN0dWFsbHkgcmVsZWFzZQorICogdGhlIHN0cnVjdHVyZXMgd2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIHplcm8uCisgKgorICogRnVuY3Rpb25zIHRoYXQgcmV0dXJuIGFuIGlzYSBzdHJ1Y3R1cmUgd2lsbCBpbiBnZW5lcmFsIF9kZXN0cm95XworICogYWxsIGFyZ3VtZW50IGlzYSBzdHJ1Y3R1cmVzICh0aGUgb2J2aW91cyBleGVjcHRpb24gYmVnaW4gdGhlIF9jb3B5CisgKiBmdW5jdGlvbnMpLiAgQSBwb2ludGVyIHBhc3NlZCB0byBzdWNoIGEgZnVuY3Rpb24gbWF5IHRoZXJlZm9yZQorICogbmV2ZXIgYmUgdXNlZCBhZnRlciB0aGUgZnVuY3Rpb24gY2FsbC4gIElmIHlvdSB3YW50IHRvIGtlZXAgYQorICogcmVmZXJlbmNlIHRvIHRoZSBvbGQgc3RydWN0dXJlKHMpLCB1c2UgdGhlIGFwcHJvcHJpYXRlIF9jb3B5IGZ1bmN0aW9uLgorICovCisKK3Vuc2lnbmVkIGlzbF9iYXNpY19tYXBfbl9pbihjb25zdCBzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqYm1hcCk7Cit1bnNpZ25lZCBpc2xfYmFzaWNfbWFwX25fb3V0KGNvbnN0IHN0cnVjdCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK3Vuc2lnbmVkIGlzbF9iYXNpY19tYXBfbl9wYXJhbShjb25zdCBzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqYm1hcCk7Cit1bnNpZ25lZCBpc2xfYmFzaWNfbWFwX25fZGl2KGNvbnN0IHN0cnVjdCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK3Vuc2lnbmVkIGlzbF9iYXNpY19tYXBfdG90YWxfZGltKGNvbnN0IHN0cnVjdCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK3Vuc2lnbmVkIGlzbF9iYXNpY19tYXBfZGltKF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwkJCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKKwordW5zaWduZWQgaXNsX21hcF9uX2luKGNvbnN0IHN0cnVjdCBpc2xfbWFwICptYXApOwordW5zaWduZWQgaXNsX21hcF9uX291dChjb25zdCBzdHJ1Y3QgaXNsX21hcCAqbWFwKTsKK3Vuc2lnbmVkIGlzbF9tYXBfbl9wYXJhbShjb25zdCBzdHJ1Y3QgaXNsX21hcCAqbWFwKTsKK3Vuc2lnbmVkIGlzbF9tYXBfZGltKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKKworaXNsX2N0eCAqaXNsX2Jhc2ljX21hcF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCk7Citpc2xfY3R4ICppc2xfbWFwX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9iYXNpY19tYXBfZ2V0X3NwYWNlKF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX21hcF9nZXRfc3BhY2UoX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworCitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9iYXNpY19tYXBfZ2V0X2RpdihfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJaW50IHBvcyk7CisKK19faXNsX2dpdmUgaXNsX2xvY2FsX3NwYWNlICppc2xfYmFzaWNfbWFwX2dldF9sb2NhbF9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworCitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfc2V0X3R1cGxlX25hbWUoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBjb25zdCBjaGFyICpzKTsKK2NvbnN0IGNoYXIgKmlzbF9iYXNpY19tYXBfZ2V0X3R1cGxlX25hbWUoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworaW50IGlzbF9tYXBfaGFzX3R1cGxlX25hbWUoX19pc2xfa2VlcCBpc2xfbWFwICptYXAsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworY29uc3QgY2hhciAqaXNsX21hcF9nZXRfdHVwbGVfbmFtZShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9zZXRfdHVwbGVfbmFtZShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBjb25zdCBjaGFyICpzKTsKK2NvbnN0IGNoYXIgKmlzbF9iYXNpY19tYXBfZ2V0X2RpbV9uYW1lKF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworaW50IGlzbF9tYXBfaGFzX2RpbV9uYW1lKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7Citjb25zdCBjaGFyICppc2xfbWFwX2dldF9kaW1fbmFtZShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3NldF9kaW1fbmFtZSgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBjb25zdCBjaGFyICpzKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9zZXRfZGltX25hbWUoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBjb25zdCBjaGFyICpzKTsKKworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3NldF9kaW1faWQoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBfX2lzbF90YWtlIGlzbF9pZCAqaWQpOworaW50IGlzbF9iYXNpY19tYXBfaGFzX2RpbV9pZChfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK2ludCBpc2xfbWFwX2hhc19kaW1faWQoX19pc2xfa2VlcCBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX2lkICppc2xfbWFwX2dldF9kaW1faWQoX19pc2xfa2VlcCBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9zZXRfdHVwbGVfaWQoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgX19pc2xfdGFrZSBpc2xfaWQgKmlkKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9yZXNldF90dXBsZV9pZChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK2ludCBpc2xfbWFwX2hhc190dXBsZV9pZChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX21hcF9nZXRfdHVwbGVfaWQoX19pc2xfa2VlcCBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CisKK2ludCBpc2xfbWFwX2ZpbmRfZGltX2J5X2lkKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLAorCV9faXNsX2tlZXAgaXNsX2lkICppZCk7CitpbnQgaXNsX21hcF9maW5kX2RpbV9ieV9uYW1lKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLAorCWNvbnN0IGNoYXIgKm5hbWUpOworCitpbnQgaXNsX2Jhc2ljX21hcF9pc19yYXRpb25hbChfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworCitzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9hbGxvYyhzdHJ1Y3QgaXNsX2N0eCAqY3R4LAorCQl1bnNpZ25lZCBucGFyYW0sIHVuc2lnbmVkIGluLCB1bnNpZ25lZCBvdXQsIHVuc2lnbmVkIGV4dHJhLAorCQl1bnNpZ25lZCBuX2VxLCB1bnNpZ25lZCBuX2luZXEpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2lkZW50aXR5KF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworc3RydWN0IGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfaWRlbnRpdHlfbGlrZShzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqbW9kZWwpOworc3RydWN0IGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZmluYWxpemUoc3RydWN0IGlzbF9iYXNpY19tYXAgKmJtYXApOwordm9pZCAqaXNsX2Jhc2ljX21hcF9mcmVlKF9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfY29weShfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworc3RydWN0IGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZXh0ZW5kKHN0cnVjdCBpc2xfYmFzaWNfbWFwICpiYXNlLAorCQl1bnNpZ25lZCBucGFyYW0sIHVuc2lnbmVkIG5faW4sIHVuc2lnbmVkIG5fb3V0LCB1bnNpZ25lZCBleHRyYSwKKwkJdW5zaWduZWQgbl9lcSwgdW5zaWduZWQgbl9pbmVxKTsKK3N0cnVjdCBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2V4dGVuZF9jb25zdHJhaW50cygKKwkJc3RydWN0IGlzbF9iYXNpY19tYXAgKmJhc2UsIHVuc2lnbmVkIG5fZXEsIHVuc2lnbmVkIG5faW5lcSk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZXF1YWwoCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwgdW5zaWduZWQgbl9lcXVhbCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfbGVzc19hdChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCXVuc2lnbmVkIHBvcyk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfbW9yZV9hdChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCXVuc2lnbmVkIHBvcyk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZW1wdHkoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9lbXB0eV9saWtlKHN0cnVjdCBpc2xfYmFzaWNfbWFwICptb2RlbCk7CitzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9lbXB0eV9saWtlX21hcChzdHJ1Y3QgaXNsX21hcCAqbW9kZWwpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3VuaXZlcnNlKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX25hdF91bml2ZXJzZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF91bml2ZXJzZV9saWtlKAorCQlfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3JlbW92ZV9yZWR1bmRhbmNpZXMoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9yZW1vdmVfcmVkdW5kYW5jaWVzKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX21hcF9zaW1wbGVfaHVsbChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9tYXBfdW5zaGlmdGVkX3NpbXBsZV9odWxsKAorCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKKworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfaW50ZXJzZWN0X2RvbWFpbigKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfaW50ZXJzZWN0X3JhbmdlKAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9pbnRlcnNlY3QoCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcDEsCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9iYXNpY19tYXBfdW5pb24oCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcDEsCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfYXBwbHlfZG9tYWluKAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAxLAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2FwcGx5X3JhbmdlKAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAxLAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2FmZmluZV9odWxsKAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfcmV2ZXJzZShfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfbWFwX2RvbWFpbihfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfbWFwX3JhbmdlKF9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZG9tYWluX21hcCgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3JhbmdlX21hcCgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3JlbW92ZV9kaW1zKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZWxpbWluYXRlKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZnJvbV9iYXNpY19zZXQoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LCBfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK3N0cnVjdCBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2Zyb21fYmFzaWNfbWFwKHN0cnVjdCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3NhbXBsZShfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworc3RydWN0IGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfc2ltcGxpZnkoc3RydWN0IGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZGV0ZWN0X2VxdWFsaXRpZXMoCisJCQkJCQlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3JlYWRfZnJvbV9maWxlKGlzbF9jdHggKmN0eCwKKwlGSUxFICppbnB1dCk7CitfX2lzbF9jb25zdHJ1Y3RvcgorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3JlYWRfZnJvbV9zdHIoaXNsX2N0eCAqY3R4LAorCWNvbnN0IGNoYXIgKnN0cik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfcmVhZF9mcm9tX2ZpbGUoaXNsX2N0eCAqY3R4LCBGSUxFICppbnB1dCk7CitfX2lzbF9jb25zdHJ1Y3RvcgorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3JlYWRfZnJvbV9zdHIoaXNsX2N0eCAqY3R4LCBjb25zdCBjaGFyICpzdHIpOwordm9pZCBpc2xfYmFzaWNfbWFwX2R1bXAoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK3ZvaWQgaXNsX2Jhc2ljX21hcF9wcmludChfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXAsIEZJTEUgKm91dCwgaW50IGluZGVudCwKKwljb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnN1ZmZpeCwgdW5zaWduZWQgb3V0cHV0X2Zvcm1hdCk7Cit2b2lkIGlzbF9tYXBfZHVtcChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7Cit2b2lkIGlzbF9tYXBfcHJpbnQoX19pc2xfa2VlcCBpc2xfbWFwICptYXAsIEZJTEUgKm91dCwgaW50IGluZGVudCwKKwl1bnNpZ25lZCBvdXRwdXRfZm9ybWF0KTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X2Jhc2ljX21hcCgKKwlfX2lzbF90YWtlIGlzbF9wcmludGVyICpwcmludGVyLCBfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfbWFwKF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnByaW50ZXIsCisJX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2ZpeF9zaShfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgaW50IHZhbHVlKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9sb3dlcl9ib3VuZF9zaSgKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLAorCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGludCB2YWx1ZSk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfdXBwZXJfYm91bmRfc2koCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgaW50IHZhbHVlKTsKKworc3RydWN0IGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfc3VtKAorCQlzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqYm1hcDEsIHN0cnVjdCBpc2xfYmFzaWNfbWFwICpibWFwMik7CitzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9uZWcoc3RydWN0IGlzbF9iYXNpY19tYXAgKmJtYXApOworc3RydWN0IGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZmxvb3JkaXYoc3RydWN0IGlzbF9iYXNpY19tYXAgKmJtYXAsCisJCWlzbF9pbnQgZCk7CisKK3N0cnVjdCBpc2xfbWFwICppc2xfbWFwX3N1bShzdHJ1Y3QgaXNsX21hcCAqbWFwMSwgc3RydWN0IGlzbF9tYXAgKm1hcDIpOworc3RydWN0IGlzbF9tYXAgKmlzbF9tYXBfbmVnKHN0cnVjdCBpc2xfbWFwICptYXApOworc3RydWN0IGlzbF9tYXAgKmlzbF9tYXBfZmxvb3JkaXYoc3RydWN0IGlzbF9tYXAgKm1hcCwgaXNsX2ludCBkKTsKKworX19pc2xfZXhwb3J0CitpbnQgaXNsX2Jhc2ljX21hcF9pc19lcXVhbCgKKwkJX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwMSwKKwkJX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwMik7CisKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX2Jhc2ljX21hcF9wYXJ0aWFsX2xleG1heCgKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLCBfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmRvbSwKKwkJX19pc2xfZ2l2ZSBpc2xfc2V0ICoqZW1wdHkpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfYmFzaWNfbWFwX3BhcnRpYWxfbGV4bWluKAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsIF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqZG9tLAorCQlfX2lzbF9naXZlIGlzbF9zZXQgKiplbXB0eSk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfcGFydGlhbF9sZXhtYXgoCisJCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwLCBfX2lzbF90YWtlIGlzbF9zZXQgKmRvbSwKKwkJX19pc2xfZ2l2ZSBpc2xfc2V0ICoqZW1wdHkpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3BhcnRpYWxfbGV4bWluKAorCQlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwgX19pc2xfdGFrZSBpc2xfc2V0ICpkb20sCisJCV9faXNsX2dpdmUgaXNsX3NldCAqKmVtcHR5KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfYmFzaWNfbWFwX2xleG1pbihfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9iYXNpY19tYXBfbGV4bWF4KF9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9sZXhtaW4oX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfbGV4bWF4KF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX2Jhc2ljX21hcF9wYXJ0aWFsX2xleG1pbl9wd19tdWx0aV9hZmYoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLCBfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmRvbSwKKwlfX2lzbF9naXZlIGlzbF9zZXQgKiplbXB0eSk7CitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9iYXNpY19tYXBfcGFydGlhbF9sZXhtYXhfcHdfbXVsdGlfYWZmKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCwgX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpkb20sCisJX19pc2xfZ2l2ZSBpc2xfc2V0ICoqZW1wdHkpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfYmFzaWNfbWFwX2xleG1pbl9wd19tdWx0aV9hZmYoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX21hcF9sZXhtaW5fcHdfbXVsdGlfYWZmKAorCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX21hcF9sZXhtYXhfcHdfbXVsdGlfYWZmKAorCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKKwordm9pZCBpc2xfYmFzaWNfbWFwX3ByaW50X2ludGVybmFsKF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwlGSUxFICpvdXQsIGludCBpbmRlbnQpOworCitzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqaXNsX21hcF9jb3B5X2Jhc2ljX21hcChzdHJ1Y3QgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9kcm9wX2Jhc2ljX21hcChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwkJCQkJCV9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CisKK2ludCBpc2xfYmFzaWNfbWFwX3BsYWluX2lzX2ZpeGVkKF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGlzbF9pbnQgKnZhbCk7CisKK2ludCBpc2xfYmFzaWNfbWFwX2ltYWdlX2lzX2JvdW5kZWQoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK2ludCBpc2xfYmFzaWNfbWFwX2lzX3VuaXZlcnNlKF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitpbnQgaXNsX2Jhc2ljX21hcF9wbGFpbl9pc19lbXB0eShfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworaW50IGlzbF9iYXNpY19tYXBfZmFzdF9pc19lbXB0eShfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZXhwb3J0CitpbnQgaXNsX2Jhc2ljX21hcF9pc19lbXB0eShfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZXhwb3J0CitpbnQgaXNsX2Jhc2ljX21hcF9pc19zdWJzZXQoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwMSwKKwkJX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwMik7CitpbnQgaXNsX2Jhc2ljX21hcF9pc19zdHJpY3Rfc3Vic2V0KF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcDEsCisJCV9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcDIpOworCitzdHJ1Y3QgaXNsX21hcCAqaXNsX21hcF9hbGxvYyhzdHJ1Y3QgaXNsX2N0eCAqY3R4LAorCQl1bnNpZ25lZCBucGFyYW0sIHVuc2lnbmVkIGluLCB1bnNpZ25lZCBvdXQsIGludCBuLAorCQl1bnNpZ25lZCBmbGFncyk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfdW5pdmVyc2UoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfbmF0X3VuaXZlcnNlKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2VtcHR5KF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworc3RydWN0IGlzbF9tYXAgKmlzbF9tYXBfZW1wdHlfbGlrZShzdHJ1Y3QgaXNsX21hcCAqbW9kZWwpOworc3RydWN0IGlzbF9tYXAgKmlzbF9tYXBfZW1wdHlfbGlrZV9iYXNpY19tYXAoc3RydWN0IGlzbF9iYXNpY19tYXAgKm1vZGVsKTsKK3N0cnVjdCBpc2xfbWFwICppc2xfbWFwX2R1cChzdHJ1Y3QgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9hZGRfYmFzaWNfbWFwKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCQkJCQkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9pZGVudGl0eShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK3N0cnVjdCBpc2xfbWFwICppc2xfbWFwX2lkZW50aXR5X2xpa2Uoc3RydWN0IGlzbF9tYXAgKm1vZGVsKTsKK3N0cnVjdCBpc2xfbWFwICppc2xfbWFwX2lkZW50aXR5X2xpa2VfYmFzaWNfbWFwKHN0cnVjdCBpc2xfYmFzaWNfbWFwICptb2RlbCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfbGV4X2x0X2ZpcnN0KF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2xleF9sZV9maXJzdChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9sZXhfbHQoX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNldF9kaW0pOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2xleF9sZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqc2V0X2RpbSk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfbGV4X2d0X2ZpcnN0KF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2xleF9nZV9maXJzdChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9sZXhfZ3QoX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNldF9kaW0pOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2xleF9nZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqc2V0X2RpbSk7CitzdHJ1Y3QgaXNsX21hcCAqaXNsX21hcF9maW5hbGl6ZShzdHJ1Y3QgaXNsX21hcCAqbWFwKTsKK3ZvaWQgKmlzbF9tYXBfZnJlZShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfY29weShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7CitzdHJ1Y3QgaXNsX21hcCAqaXNsX21hcF9leHRlbmQoc3RydWN0IGlzbF9tYXAgKmJhc2UsCisJCXVuc2lnbmVkIG5wYXJhbSwgdW5zaWduZWQgbl9pbiwgdW5zaWduZWQgbl9vdXQpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfcmV2ZXJzZShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF91bmlvbigKKwkJX19pc2xfdGFrZSBpc2xfbWFwICptYXAxLAorCQlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDIpOworc3RydWN0IGlzbF9tYXAgKmlzbF9tYXBfdW5pb25fZGlzam9pbnQoCisJCQlzdHJ1Y3QgaXNsX21hcCAqbWFwMSwgc3RydWN0IGlzbF9tYXAgKm1hcDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfaW50ZXJzZWN0X2RvbWFpbigKKwkJX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2ludGVyc2VjdF9yYW5nZSgKKwkJX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2FwcGx5X2RvbWFpbigKKwkJX19pc2xfdGFrZSBpc2xfbWFwICptYXAxLAorCQlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfYXBwbHlfcmFuZ2UoCisJCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwMSwKKwkJX19pc2xfdGFrZSBpc2xfbWFwICptYXAyKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9wcm9kdWN0KAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcDEsIF9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcDIpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3Byb2R1Y3QoX19pc2xfdGFrZSBpc2xfbWFwICptYXAxLAorCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwMik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZG9tYWluX3Byb2R1Y3QoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwMSwgX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwMik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfcmFuZ2VfcHJvZHVjdCgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAxLCBfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9kb21haW5fcHJvZHVjdChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDEsCisJX19pc2xfdGFrZSBpc2xfbWFwICptYXAyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9yYW5nZV9wcm9kdWN0KF9faXNsX3Rha2UgaXNsX21hcCAqbWFwMSwKKwlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDIpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2ZsYXRfcHJvZHVjdCgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAxLCBfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9mbGF0X3Byb2R1Y3QoX19pc2xfdGFrZSBpc2xfbWFwICptYXAxLAorCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwMik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZmxhdF9yYW5nZV9wcm9kdWN0KAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcDEsIF9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcDIpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2ZsYXRfZG9tYWluX3Byb2R1Y3QoX19pc2xfdGFrZSBpc2xfbWFwICptYXAxLAorCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwMik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZmxhdF9yYW5nZV9wcm9kdWN0KF9faXNsX3Rha2UgaXNsX21hcCAqbWFwMSwKKwlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfaW50ZXJzZWN0KF9faXNsX3Rha2UgaXNsX21hcCAqbWFwMSwKKwkJCQkgICAgICBfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfaW50ZXJzZWN0X3BhcmFtcyhfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwkJX19pc2xfdGFrZSBpc2xfc2V0ICpwYXJhbXMpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfc3VidHJhY3QoCisJCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwMSwKKwkJX19pc2xfdGFrZSBpc2xfbWFwICptYXAyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9zdWJ0cmFjdF9kb21haW4oX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpkb20pOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3N1YnRyYWN0X3JhbmdlKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCV9faXNsX3Rha2UgaXNsX3NldCAqZG9tKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2NvbXBsZW1lbnQoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworc3RydWN0IGlzbF9tYXAgKmlzbF9tYXBfZml4X2lucHV0X3NpKHN0cnVjdCBpc2xfbWFwICptYXAsCisJCXVuc2lnbmVkIGlucHV0LCBpbnQgdmFsdWUpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2ZpeChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGlzbF9pbnQgdmFsdWUpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2ZpeF9zaShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpbnQgdmFsdWUpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2xvd2VyX2JvdW5kX3NpKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGludCB2YWx1ZSk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfdXBwZXJfYm91bmRfc2koX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpbnQgdmFsdWUpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19tYXBfZGVsdGFzKF9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX21hcF9kZWx0YXMoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2RlbHRhc19tYXAoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9kZWx0YXNfbWFwKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2RldGVjdF9lcXVhbGl0aWVzKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfbWFwX2FmZmluZV9odWxsKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX21hcF9jb252ZXhfaHVsbChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX21hcF9wb2x5aGVkcmFsX2h1bGwoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2FkZChfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2FkZF9kaW1zKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9pbnNlcnRfZGltcygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsCisJdW5zaWduZWQgcG9zLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9pbnNlcnRfZGltcyhfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9tb3ZlX2RpbXMoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLAorCWVudW0gaXNsX2RpbV90eXBlIGRzdF90eXBlLCB1bnNpZ25lZCBkc3RfcG9zLAorCWVudW0gaXNsX2RpbV90eXBlIHNyY190eXBlLCB1bnNpZ25lZCBzcmNfcG9zLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9tb3ZlX2RpbXMoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgZHN0X3R5cGUsIHVuc2lnbmVkIGRzdF9wb3MsCisJZW51bSBpc2xfZGltX3R5cGUgc3JjX3R5cGUsIHVuc2lnbmVkIHNyY19wb3MsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3Byb2plY3Rfb3V0KAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9wcm9qZWN0X291dChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3JlbW92ZV9kaXZzKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfcmVtb3ZlX3Vua25vd25fZGl2cyhfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfcmVtb3ZlX2RpdnMoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2VsaW1pbmF0ZShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfcmVtb3ZlX2RpbXMoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3JlbW92ZV9kaXZzX2ludm9sdmluZ19kaW1zKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfcmVtb3ZlX2RpdnNfaW52b2x2aW5nX2RpbXMoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworc3RydWN0IGlzbF9tYXAgKmlzbF9tYXBfcmVtb3ZlX2lucHV0cyhzdHJ1Y3QgaXNsX21hcCAqbWFwLAorCXVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKKworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2VxdWF0ZShfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZTEsIGludCBwb3MxLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlMiwgaW50IHBvczIpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX29yZGVyX2dlKF9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlMSwgaW50IHBvczEsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUyLCBpbnQgcG9zMik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZXF1YXRlKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUxLCBpbnQgcG9zMSwgZW51bSBpc2xfZGltX3R5cGUgdHlwZTIsIGludCBwb3MyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9vcHBvc2UoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZTEsIGludCBwb3MxLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlMiwgaW50IHBvczIpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX29yZGVyX2x0KF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUxLCBpbnQgcG9zMSwgZW51bSBpc2xfZGltX3R5cGUgdHlwZTIsIGludCBwb3MyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9vcmRlcl9ndChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlMSwgaW50IHBvczEsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUyLCBpbnQgcG9zMik7CisKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfc2V0X2lkZW50aXR5KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworX19pc2xfZXhwb3J0CitpbnQgaXNsX2Jhc2ljX3NldF9pc193cmFwcGluZyhfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX3NldF9pc193cmFwcGluZyhfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19tYXBfd3JhcChfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfbWFwX3dyYXAoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfc2V0X3Vud3JhcChfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfc2V0X3Vud3JhcChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9mbGF0dGVuKF9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9mbGF0dGVuKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2ZsYXR0ZW5fZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9mbGF0dGVuX3JhbmdlKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9mbGF0dGVuX2RvbWFpbihfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9mbGF0dGVuX3JhbmdlKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2ZsYXR0ZW4oX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2ZsYXR0ZW4oX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfc2V0X2ZsYXR0ZW5fbWFwKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX21hcF9wYXJhbXMoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfbWFwX2RvbWFpbihfX2lzbF90YWtlIGlzbF9tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfbWFwX3JhbmdlKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9kb21haW5fbWFwKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9yYW5nZV9tYXAoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfY29uc3RydWN0b3IKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9mcm9tX2Jhc2ljX21hcChfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2Zyb21fZG9tYWluKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9mcm9tX2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2Zyb21fcmFuZ2UoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK3N0cnVjdCBpc2xfbWFwICppc2xfbWFwX2Zyb21fcmFuZ2Uoc3RydWN0IGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZnJvbV9kb21haW5fYW5kX3JhbmdlKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqZG9tYWluLCBfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKnJhbmdlKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9mcm9tX2RvbWFpbl9hbmRfcmFuZ2UoX19pc2xfdGFrZSBpc2xfc2V0ICpkb21haW4sCisJX19pc2xfdGFrZSBpc2xfc2V0ICpyYW5nZSk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZnJvbV9zZXQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitzdHJ1Y3QgaXNsX3NldCAqaXNsX3NldF9mcm9tX21hcChzdHJ1Y3QgaXNsX21hcCAqbWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfbWFwX3NhbXBsZShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CisKK2ludCBpc2xfbWFwX3BsYWluX2lzX2VtcHR5KF9faXNsX2tlZXAgaXNsX21hcCAqbWFwKTsKK2ludCBpc2xfbWFwX2Zhc3RfaXNfZW1wdHkoX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworaW50IGlzbF9tYXBfcGxhaW5faXNfdW5pdmVyc2UoX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworX19pc2xfZXhwb3J0CitpbnQgaXNsX21hcF9pc19lbXB0eShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfbWFwX2lzX3N1YnNldChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcDEsIF9faXNsX2tlZXAgaXNsX21hcCAqbWFwMik7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfbWFwX2lzX3N0cmljdF9zdWJzZXQoX19pc2xfa2VlcCBpc2xfbWFwICptYXAxLCBfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcDIpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX21hcF9pc19lcXVhbChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcDEsIF9faXNsX2tlZXAgaXNsX21hcCAqbWFwMik7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfbWFwX2lzX2Rpc2pvaW50KF9faXNsX2tlZXAgaXNsX21hcCAqbWFwMSwgX19pc2xfa2VlcCBpc2xfbWFwICptYXAyKTsKK2ludCBpc2xfYmFzaWNfbWFwX2lzX3NpbmdsZV92YWx1ZWQoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK2ludCBpc2xfbWFwX3BsYWluX2lzX3NpbmdsZV92YWx1ZWQoX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworX19pc2xfZXhwb3J0CitpbnQgaXNsX21hcF9pc19zaW5nbGVfdmFsdWVkKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwKTsKK2ludCBpc2xfbWFwX3BsYWluX2lzX2luamVjdGl2ZShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfbWFwX2lzX2luamVjdGl2ZShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfbWFwX2lzX2JpamVjdGl2ZShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7CitpbnQgaXNsX21hcF9pc190cmFuc2xhdGlvbihfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7CitpbnQgaXNsX21hcF9oYXNfZXF1YWxfc3BhY2UoX19pc2xfa2VlcCBpc2xfbWFwICptYXAxLCBfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcDIpOworCitpbnQgaXNsX2Jhc2ljX21hcF9jYW5femlwKF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitpbnQgaXNsX21hcF9jYW5femlwKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF96aXAoX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF96aXAoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworCitpbnQgaXNsX2Jhc2ljX21hcF9jYW5fY3VycnkoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK2ludCBpc2xfbWFwX2Nhbl9jdXJyeShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfY3VycnkoX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9jdXJyeShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CisKK2ludCBpc2xfYmFzaWNfbWFwX2Nhbl91bmN1cnJ5KF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitpbnQgaXNsX21hcF9jYW5fdW5jdXJyeShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfdW5jdXJyeShfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3VuY3VycnkoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworCitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfbWFrZV9kaXNqb2ludChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9iYXNpY19tYXBfY29tcHV0ZV9kaXZzKF9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfY29tcHV0ZV9kaXZzKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9hbGlnbl9kaXZzKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKKworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2Ryb3BfY29uc3RyYWludHNfaW52b2x2aW5nX2RpbXMoCisJX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworCitpbnQgaXNsX2Jhc2ljX21hcF9pbnZvbHZlc19kaW1zKF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitpbnQgaXNsX21hcF9pbnZvbHZlc19kaW1zKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKKwordm9pZCBpc2xfbWFwX3ByaW50X2ludGVybmFsKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLCBGSUxFICpvdXQsIGludCBpbmRlbnQpOworCitpbnQgaXNsX21hcF9wbGFpbl9pbnB1dF9pc19maXhlZChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCwKKwkJdW5zaWduZWQgaW4sIGlzbF9pbnQgKnZhbCk7CitpbnQgaXNsX21hcF9wbGFpbl9pc19maXhlZChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGlzbF9pbnQgKnZhbCk7CitpbnQgaXNsX21hcF9mYXN0X2lzX2ZpeGVkKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgaXNsX2ludCAqdmFsKTsKKworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZ2lzdChfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpjb250ZXh0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2dpc3QoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJX19pc2xfdGFrZSBpc2xfbWFwICpjb250ZXh0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2dpc3RfZG9tYWluKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCV9faXNsX3Rha2UgaXNsX3NldCAqY29udGV4dCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZ2lzdF9yYW5nZShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2dpc3RfcGFyYW1zKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCV9faXNsX3Rha2UgaXNsX3NldCAqY29udGV4dCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZ2lzdF9iYXNpY19tYXAoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpjb250ZXh0KTsKKworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfY29hbGVzY2UoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworCitpbnQgaXNsX21hcF9wbGFpbl9pc19lcXVhbChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcDEsIF9faXNsX2tlZXAgaXNsX21hcCAqbWFwMik7CitpbnQgaXNsX21hcF9mYXN0X2lzX2VxdWFsKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwMSwgX19pc2xfa2VlcCBpc2xfbWFwICptYXAyKTsKKwordWludDMyX3QgaXNsX21hcF9nZXRfaGFzaChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7CisKK19faXNsX2V4cG9ydAoraW50IGlzbF9tYXBfZm9yZWFjaF9iYXNpY19tYXAoX19pc2xfa2VlcCBpc2xfbWFwICptYXAsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworCitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9zZXRfbGlmdGluZyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9maXhlZF9wb3dlcihfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwgaXNsX2ludCBleHApOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3Bvd2VyKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLCBpbnQgKmV4YWN0KTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9yZWFjaGluZ19wYXRoX2xlbmd0aHMoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJaW50ICpleGFjdCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfdHJhbnNpdGl2ZV9jbG9zdXJlKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCWludCAqZXhhY3QpOworCitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfbGV4X2xlX21hcChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDEsCisJX19pc2xfdGFrZSBpc2xfbWFwICptYXAyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9sZXhfbHRfbWFwKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwMSwKKwlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDIpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2xleF9nZV9tYXAoX19pc2xfdGFrZSBpc2xfbWFwICptYXAxLAorCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwMik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfbGV4X2d0X21hcChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDEsCisJX19pc2xfdGFrZSBpc2xfbWFwICptYXAyKTsKKworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2FsaWduX3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsIF9faXNsX3Rha2UgaXNsX3NwYWNlICptb2RlbCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfYWxpZ25fcGFyYW1zKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICptb2RlbCk7CisKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX2Jhc2ljX21hcF9lcXVhbGl0aWVzX21hdHJpeCgKKwkJX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwLCBlbnVtIGlzbF9kaW1fdHlwZSBjMSwKKwkJZW51bSBpc2xfZGltX3R5cGUgYzIsIGVudW0gaXNsX2RpbV90eXBlIGMzLAorCQllbnVtIGlzbF9kaW1fdHlwZSBjNCwgZW51bSBpc2xfZGltX3R5cGUgYzUpOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfYmFzaWNfbWFwX2luZXF1YWxpdGllc19tYXRyaXgoCisJCV9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCwgZW51bSBpc2xfZGltX3R5cGUgYzEsCisJCWVudW0gaXNsX2RpbV90eXBlIGMyLCBlbnVtIGlzbF9kaW1fdHlwZSBjMywKKwkJZW51bSBpc2xfZGltX3R5cGUgYzQsIGVudW0gaXNsX2RpbV90eXBlIGM1KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9mcm9tX2NvbnN0cmFpbnRfbWF0cmljZXMoCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwlfX2lzbF90YWtlIGlzbF9tYXQgKmVxLCBfX2lzbF90YWtlIGlzbF9tYXQgKmluZXEsIGVudW0gaXNsX2RpbV90eXBlIGMxLAorCWVudW0gaXNsX2RpbV90eXBlIGMyLCBlbnVtIGlzbF9kaW1fdHlwZSBjMywKKwllbnVtIGlzbF9kaW1fdHlwZSBjNCwgZW51bSBpc2xfZGltX3R5cGUgYzUpOworCitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZnJvbV9hZmYoX19pc2xfdGFrZSBpc2xfYWZmICphZmYpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2Zyb21fbXVsdGlfYWZmKAorCV9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWFmZik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZnJvbV9hZmZfbGlzdCgKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqZG9tYWluX2RpbSwgX19pc2xfdGFrZSBpc2xfYWZmX2xpc3QgKmxpc3QpOworCitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZnJvbV9hZmYoX19pc2xfdGFrZSBpc2xfYWZmICphZmYpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2Zyb21fbXVsdGlfYWZmKF9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWFmZik7CisKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX21hcF9kaW1fbWF4KF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLCBpbnQgcG9zKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2luY2x1ZGUgPGlzbC9kaW0uaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9tYXBfdHlwZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvbWFwX3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzA1N2U3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvbWFwX3R5cGUuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIElTTF9NQVBfVFlQRV9ICisjZGVmaW5lIElTTF9NQVBfVFlQRV9ICisKKyNpbmNsdWRlIDxpc2wvY3R4Lmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IF9faXNsX3N1YmNsYXNzKGlzbF9tYXApIGlzbF9iYXNpY19tYXA7Cit0eXBlZGVmIHN0cnVjdCBpc2xfYmFzaWNfbWFwIGlzbF9iYXNpY19tYXA7CitzdHJ1Y3QgX19pc2xfc3ViY2xhc3MoaXNsX3VuaW9uX21hcCkgaXNsX21hcDsKK3R5cGVkZWYgc3RydWN0IGlzbF9tYXAgaXNsX21hcDsKKworI2lmbmRlZiBpc2xfYmFzaWNfc2V0CitzdHJ1Y3QgX19pc2xfc3ViY2xhc3MoaXNsX3NldCkgaXNsX2Jhc2ljX3NldDsKK3R5cGVkZWYgc3RydWN0IGlzbF9iYXNpY19zZXQgaXNsX2Jhc2ljX3NldDsKKyNlbmRpZgorI2lmbmRlZiBpc2xfc2V0CitzdHJ1Y3QgX19pc2xfc3ViY2xhc3MoaXNsX3VuaW9uX3NldCkgaXNsX3NldDsKK3R5cGVkZWYgc3RydWN0IGlzbF9zZXQgaXNsX3NldDsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL21hdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvbWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3YjA3ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL21hdC5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBLYXRob2xpZWtlIFVuaXZlcnNpdGVpdCBMZXV2ZW4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgTUlUIGxpY2Vuc2UKKyAqCisgKiBXcml0dGVuIGJ5IFN2ZW4gVmVyZG9vbGFlZ2UsIEsuVS5MZXV2ZW4sIERlcGFydGVtZW50CisgKiBDb21wdXRlcndldGVuc2NoYXBwZW4sIENlbGVzdGlqbmVubGFhbiAyMDBBLCBCLTMwMDEgTGV1dmVuLCBCZWxnaXVtCisgKi8KKworI2lmbmRlZiBJU0xfTUFUX0gKKyNkZWZpbmUgSVNMX01BVF9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8aXNsL2ludC5oPgorI2luY2x1ZGUgPGlzbC9jdHguaD4KKyNpbmNsdWRlIDxpc2wvYmxrLmg+CisjaW5jbHVkZSA8aXNsL3ZlYy5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBpc2xfbWF0OwordHlwZWRlZiBzdHJ1Y3QgaXNsX21hdAlpc2xfbWF0OworCitpc2xfY3R4ICppc2xfbWF0X2dldF9jdHgoX19pc2xfa2VlcCBpc2xfbWF0ICptYXQpOworCitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9tYXRfYWxsb2MoaXNsX2N0eCAqY3R4LAorCXVuc2lnbmVkIG5fcm93LCB1bnNpZ25lZCBuX2NvbCk7CitzdHJ1Y3QgaXNsX21hdCAqaXNsX21hdF9kdXAoc3RydWN0IGlzbF9tYXQgKm1hdCk7CitzdHJ1Y3QgaXNsX21hdCAqaXNsX21hdF9leHRlbmQoc3RydWN0IGlzbF9tYXQgKm1hdCwKKwl1bnNpZ25lZCBuX3JvdywgdW5zaWduZWQgbl9jb2wpOworc3RydWN0IGlzbF9tYXQgKmlzbF9tYXRfaWRlbnRpdHkoc3RydWN0IGlzbF9jdHggKmN0eCwgdW5zaWduZWQgbl9yb3cpOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X2NvcHkoX19pc2xfa2VlcCBpc2xfbWF0ICptYXQpOworc3RydWN0IGlzbF9tYXQgKmlzbF9tYXRfY293KHN0cnVjdCBpc2xfbWF0ICptYXQpOwordm9pZCBpc2xfbWF0X2ZyZWUoX19pc2xfdGFrZSBpc2xfbWF0ICptYXQpOworCitpbnQgaXNsX21hdF9yb3dzKF9faXNsX2tlZXAgaXNsX21hdCAqbWF0KTsKK2ludCBpc2xfbWF0X2NvbHMoX19pc2xfa2VlcCBpc2xfbWF0ICptYXQpOworaW50IGlzbF9tYXRfZ2V0X2VsZW1lbnQoX19pc2xfa2VlcCBpc2xfbWF0ICptYXQsIGludCByb3csIGludCBjb2wsIGlzbF9pbnQgKnYpOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X3NldF9lbGVtZW50KF9faXNsX3Rha2UgaXNsX21hdCAqbWF0LAorCWludCByb3csIGludCBjb2wsIGlzbF9pbnQgdik7CitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9tYXRfc2V0X2VsZW1lbnRfc2koX19pc2xfdGFrZSBpc2xfbWF0ICptYXQsCisJaW50IHJvdywgaW50IGNvbCwgaW50IHYpOworCitzdHJ1Y3QgaXNsX21hdCAqaXNsX21hdF9zd2FwX2NvbHMoc3RydWN0IGlzbF9tYXQgKm1hdCwgdW5zaWduZWQgaSwgdW5zaWduZWQgaik7CitzdHJ1Y3QgaXNsX21hdCAqaXNsX21hdF9zd2FwX3Jvd3Moc3RydWN0IGlzbF9tYXQgKm1hdCwgdW5zaWduZWQgaSwgdW5zaWduZWQgaik7CisKK3N0cnVjdCBpc2xfdmVjICppc2xfbWF0X3ZlY19wcm9kdWN0KHN0cnVjdCBpc2xfbWF0ICptYXQsIHN0cnVjdCBpc2xfdmVjICp2ZWMpOworc3RydWN0IGlzbF92ZWMgKmlzbF92ZWNfbWF0X3Byb2R1Y3Qoc3RydWN0IGlzbF92ZWMgKnZlYywgc3RydWN0IGlzbF9tYXQgKm1hdCk7CitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF9tYXRfdmVjX2ludmVyc2VfcHJvZHVjdChfX2lzbF90YWtlIGlzbF9tYXQgKm1hdCwKKwkJCQkJCV9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjKTsKK3N0cnVjdCBpc2xfbWF0ICppc2xfbWF0X2FmZl9kaXJlY3Rfc3VtKHN0cnVjdCBpc2xfbWF0ICpsZWZ0LAorCQkJCQlzdHJ1Y3QgaXNsX21hdCAqcmlnaHQpOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X2RpYWdvbmFsKF9faXNsX3Rha2UgaXNsX21hdCAqbWF0MSwKKwlfX2lzbF90YWtlIGlzbF9tYXQgKm1hdDIpOworc3RydWN0IGlzbF9tYXQgKmlzbF9tYXRfbGVmdF9oZXJtaXRlKHN0cnVjdCBpc2xfbWF0ICpNLAorCWludCBuZWcsIHN0cnVjdCBpc2xfbWF0ICoqVSwgc3RydWN0IGlzbF9tYXQgKipRKTsKK3N0cnVjdCBpc2xfbWF0ICppc2xfbWF0X2xpbl90b19hZmYoc3RydWN0IGlzbF9tYXQgKm1hdCk7CitzdHJ1Y3QgaXNsX21hdCAqaXNsX21hdF9pbnZlcnNlX3Byb2R1Y3Qoc3RydWN0IGlzbF9tYXQgKmxlZnQsCisJc3RydWN0IGlzbF9tYXQgKnJpZ2h0KTsKK3N0cnVjdCBpc2xfbWF0ICppc2xfbWF0X3Byb2R1Y3Qoc3RydWN0IGlzbF9tYXQgKmxlZnQsIHN0cnVjdCBpc2xfbWF0ICpyaWdodCk7CitzdHJ1Y3QgaXNsX21hdCAqaXNsX21hdF90cmFuc3Bvc2Uoc3RydWN0IGlzbF9tYXQgKm1hdCk7CitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9tYXRfcmlnaHRfaW52ZXJzZShfX2lzbF90YWtlIGlzbF9tYXQgKm1hdCk7CitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9tYXRfcmlnaHRfa2VybmVsKF9faXNsX3Rha2UgaXNsX21hdCAqbWF0KTsKKworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X3NjYWxlX2Rvd25fcm93KF9faXNsX3Rha2UgaXNsX21hdCAqbWF0LCBpbnQgcm93LAorCWlzbF9pbnQgbSk7CisKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9ub3JtYWxpemUoX19pc2xfdGFrZSBpc2xfbWF0ICptYXQpOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X25vcm1hbGl6ZV9yb3coX19pc2xfdGFrZSBpc2xfbWF0ICptYXQsIGludCByb3cpOworCitzdHJ1Y3QgaXNsX21hdCAqaXNsX21hdF9kcm9wX2NvbHMoc3RydWN0IGlzbF9tYXQgKm1hdCwKKwkJCQl1bnNpZ25lZCBjb2wsIHVuc2lnbmVkIG4pOworc3RydWN0IGlzbF9tYXQgKmlzbF9tYXRfZHJvcF9yb3dzKHN0cnVjdCBpc2xfbWF0ICptYXQsCisJCQkJdW5zaWduZWQgcm93LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9pbnNlcnRfY29scyhfX2lzbF90YWtlIGlzbF9tYXQgKm1hdCwKKwkJCQl1bnNpZ25lZCBjb2wsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X2luc2VydF9yb3dzKF9faXNsX3Rha2UgaXNsX21hdCAqbWF0LAorCQkJCXVuc2lnbmVkIHJvdywgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9tYXRfbW92ZV9jb2xzKF9faXNsX3Rha2UgaXNsX21hdCAqbWF0LAorCXVuc2lnbmVkIGRzdF9jb2wsIHVuc2lnbmVkIHNyY19jb2wsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X2FkZF9yb3dzKF9faXNsX3Rha2UgaXNsX21hdCAqbWF0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9pbnNlcnRfemVyb19jb2xzKF9faXNsX3Rha2UgaXNsX21hdCAqbWF0LAorCXVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9hZGRfemVyb19jb2xzKF9faXNsX3Rha2UgaXNsX21hdCAqbWF0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9pbnNlcnRfemVyb19yb3dzKF9faXNsX3Rha2UgaXNsX21hdCAqbWF0LAorCXVuc2lnbmVkIHJvdywgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9tYXRfYWRkX3plcm9fcm93cyhfX2lzbF90YWtlIGlzbF9tYXQgKm1hdCwgdW5zaWduZWQgbik7CisKK3ZvaWQgaXNsX21hdF9jb2xfYWRkKF9faXNsX2tlZXAgaXNsX21hdCAqbWF0LCBpbnQgZHN0X2NvbCwgaW50IHNyY19jb2wpOwordm9pZCBpc2xfbWF0X2NvbF9tdWwoc3RydWN0IGlzbF9tYXQgKm1hdCwgaW50IGRzdF9jb2wsIGlzbF9pbnQgZiwgaW50IHNyY19jb2wpOwordm9pZCBpc2xfbWF0X2NvbF9zdWJtdWwoc3RydWN0IGlzbF9tYXQgKm1hdCwKKwkJCWludCBkc3RfY29sLCBpc2xfaW50IGYsIGludCBzcmNfY29sKTsKKworc3RydWN0IGlzbF9tYXQgKmlzbF9tYXRfdW5pbW9kdWxhcl9jb21wbGV0ZShzdHJ1Y3QgaXNsX21hdCAqTSwgaW50IHJvdyk7CisKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9mcm9tX3Jvd192ZWMoX19pc2xfdGFrZSBpc2xfdmVjICp2ZWMpOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X2NvbmNhdChfX2lzbF90YWtlIGlzbF9tYXQgKnRvcCwKKwlfX2lzbF90YWtlIGlzbF9tYXQgKmJvdCk7CitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9tYXRfdmVjX2NvbmNhdChfX2lzbF90YWtlIGlzbF9tYXQgKnRvcCwKKwlfX2lzbF90YWtlIGlzbF92ZWMgKmJvdCk7CisKK2ludCBpc2xfbWF0X2lzX2VxdWFsKF9faXNsX2tlZXAgaXNsX21hdCAqbWF0MSwgX19pc2xfa2VlcCBpc2xfbWF0ICptYXQyKTsKKworaW50IGlzbF9tYXRfaW5pdGlhbF9ub25femVyb19jb2xzKF9faXNsX2tlZXAgaXNsX21hdCAqbWF0KTsKKwordm9pZCBpc2xfbWF0X3ByaW50X2ludGVybmFsKF9faXNsX2tlZXAgaXNsX21hdCAqbWF0LCBGSUxFICpvdXQsIGludCBpbmRlbnQpOwordm9pZCBpc2xfbWF0X2R1bXAoX19pc2xfa2VlcCBpc2xfbWF0ICptYXQpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL211bHRpLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9tdWx0aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYjdhY2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9tdWx0aS5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgSVNMX01VTFRJX0gKKyNkZWZpbmUgSVNMX01VTFRJX0gKKworI2luY2x1ZGUgPGlzbC9saXN0Lmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBJU0xfREVDTEFSRV9NVUxUSShCQVNFKQkJCQkJCVwKK19faXNsX2dpdmUgaXNsX211bHRpXyMjQkFTRSAqaXNsX211bHRpXyMjQkFTRSMjX2Zyb21fIyNCQVNFIyNfbGlzdCgJXAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpzcGFjZSwgX19pc2xfdGFrZSBpc2xfIyNCQVNFIyNfbGlzdCAqbGlzdCk7IFwKK2NvbnN0IGNoYXIgKmlzbF9tdWx0aV8jI0JBU0UjI19nZXRfdHVwbGVfbmFtZSgJCQkJXAorCV9faXNsX2tlZXAgaXNsX211bHRpXyMjQkFTRSAqbXVsdGksIGVudW0gaXNsX2RpbV90eXBlIHR5cGUpOwlcCitfX2lzbF9naXZlIGlzbF9tdWx0aV8jI0JBU0UgKmlzbF9tdWx0aV8jI0JBU0UjI19zZXRfIyNCQVNFKAkJXAorCV9faXNsX3Rha2UgaXNsX211bHRpXyMjQkFTRSAqbXVsdGksIGludCBwb3MsCQkJXAorCV9faXNsX3Rha2UgaXNsXyMjQkFTRSAqZWwpOworCitJU0xfREVDTEFSRV9NVUxUSShhZmYpCitJU0xfREVDTEFSRV9NVUxUSShwd19hZmYpCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvb2JqLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9vYmouaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjI2YzBhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvb2JqLmgKQEAgLTAsMCArMSw2NCBAQAorI2lmbmRlZiBJU0xfT0JKX0gKKyNkZWZpbmUgSVNMX09CSl9ICisKKyNpbmNsdWRlIDxpc2wvc2V0X3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvbWFwX3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvdW5pb25fc2V0X3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvdW5pb25fbWFwX3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvcG9seW5vbWlhbF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3ByaW50ZXIuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaXNsX29ial92dGFibGUgeworCXZvaWQgKigqY29weSkodm9pZCAqdjEpOworCXZvaWQgKigqYWRkKSh2b2lkICp2MSwgdm9pZCAqdjIpOworCV9faXNsX2dpdmUgaXNsX3ByaW50ZXIgKigqcHJpbnQpKF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsIHZvaWQgKnYpOworCXZvaWQgKCpmcmVlKSh2b2lkICp2KTsKK307Cit0eXBlZGVmIHN0cnVjdCBpc2xfb2JqX3Z0YWJsZSAqaXNsX29ial90eXBlOworZXh0ZXJuIHN0cnVjdCBpc2xfb2JqX3Z0YWJsZSBpc2xfb2JqX25vbmVfdnRhYmxlOworI2RlZmluZSBpc2xfb2JqX25vbmUJCSgmaXNsX29ial9ub25lX3Z0YWJsZSkKK2V4dGVybiBzdHJ1Y3QgaXNsX29ial92dGFibGUgaXNsX29ial9pbnRfdnRhYmxlOworI2RlZmluZSBpc2xfb2JqX2ludAkJKCZpc2xfb2JqX2ludF92dGFibGUpCitleHRlcm4gc3RydWN0IGlzbF9vYmpfdnRhYmxlIGlzbF9vYmpfc2V0X3Z0YWJsZTsKKyNkZWZpbmUgaXNsX29ial9zZXQJCSgmaXNsX29ial9zZXRfdnRhYmxlKQorZXh0ZXJuIHN0cnVjdCBpc2xfb2JqX3Z0YWJsZSBpc2xfb2JqX3VuaW9uX3NldF92dGFibGU7CisjZGVmaW5lIGlzbF9vYmpfdW5pb25fc2V0CSgmaXNsX29ial91bmlvbl9zZXRfdnRhYmxlKQorZXh0ZXJuIHN0cnVjdCBpc2xfb2JqX3Z0YWJsZSBpc2xfb2JqX21hcF92dGFibGU7CisjZGVmaW5lIGlzbF9vYmpfbWFwCQkoJmlzbF9vYmpfbWFwX3Z0YWJsZSkKK2V4dGVybiBzdHJ1Y3QgaXNsX29ial92dGFibGUgaXNsX29ial91bmlvbl9tYXBfdnRhYmxlOworI2RlZmluZSBpc2xfb2JqX3VuaW9uX21hcAkoJmlzbF9vYmpfdW5pb25fbWFwX3Z0YWJsZSkKK2V4dGVybiBzdHJ1Y3QgaXNsX29ial92dGFibGUgaXNsX29ial9wd19xcG9seW5vbWlhbF92dGFibGU7CisjZGVmaW5lIGlzbF9vYmpfcHdfcXBvbHlub21pYWwJKCZpc2xfb2JqX3B3X3Fwb2x5bm9taWFsX3Z0YWJsZSkKK2V4dGVybiBzdHJ1Y3QgaXNsX29ial92dGFibGUgaXNsX29ial91bmlvbl9wd19xcG9seW5vbWlhbF92dGFibGU7CisjZGVmaW5lIGlzbF9vYmpfdW5pb25fcHdfcXBvbHlub21pYWwJKCZpc2xfb2JqX3VuaW9uX3B3X3Fwb2x5bm9taWFsX3Z0YWJsZSkKK2V4dGVybiBzdHJ1Y3QgaXNsX29ial92dGFibGUgaXNsX29ial9wd19xcG9seW5vbWlhbF9mb2xkX3Z0YWJsZTsKKyNkZWZpbmUgaXNsX29ial9wd19xcG9seW5vbWlhbF9mb2xkCSgmaXNsX29ial9wd19xcG9seW5vbWlhbF9mb2xkX3Z0YWJsZSkKK2V4dGVybiBzdHJ1Y3QgaXNsX29ial92dGFibGUgaXNsX29ial91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX3Z0YWJsZTsKKyNkZWZpbmUgaXNsX29ial91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkCSgmaXNsX29ial91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX3Z0YWJsZSkKK3N0cnVjdCBpc2xfb2JqIHsKKwlpc2xfb2JqX3R5cGUJdHlwZTsKKwl2b2lkCQkqdjsKK307CisKK3N0cnVjdCBpc2xfaW50X29iajsKK3R5cGVkZWYgc3RydWN0IGlzbF9pbnRfb2JqIGlzbF9pbnRfb2JqOworCitfX2lzbF9naXZlIGlzbF9pbnRfb2JqICppc2xfaW50X29ial9hbGxvYyhpc2xfY3R4ICpjdHgsIGlzbF9pbnQgdik7Cit2b2lkIGlzbF9pbnRfb2JqX2ZyZWUoX19pc2xfdGFrZSBpc2xfaW50X29iaiAqaSk7CitfX2lzbF9naXZlIGlzbF9pbnRfb2JqICppc2xfaW50X29ial9hZGQoX19pc2xfdGFrZSBpc2xfaW50X29iaiAqaTEsCisJX19pc2xfdGFrZSBpc2xfaW50X29iaiAqaTIpOworX19pc2xfZ2l2ZSBpc2xfaW50X29iaiAqaXNsX2ludF9vYmpfc3ViKF9faXNsX3Rha2UgaXNsX2ludF9vYmogKmkxLAorCV9faXNsX3Rha2UgaXNsX2ludF9vYmogKmkyKTsKK19faXNsX2dpdmUgaXNsX2ludF9vYmogKmlzbF9pbnRfb2JqX211bChfX2lzbF90YWtlIGlzbF9pbnRfb2JqICppMSwKKwlfX2lzbF90YWtlIGlzbF9pbnRfb2JqICppMik7Cit2b2lkIGlzbF9pbnRfb2JqX2dldF9pbnQoX19pc2xfa2VlcCBpc2xfaW50X29iaiAqaSwgaXNsX2ludCAqdik7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvb3B0aW9ucy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvb3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYzlhNDMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9vcHRpb25zLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgS2F0aG9saWVrZSBVbml2ZXJzaXRlaXQgTGV1dmVuCisgKgorICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIE1JVCBsaWNlbnNlCisgKgorICogV3JpdHRlbiBieSBTdmVuIFZlcmRvb2xhZWdlLCBLLlUuTGV1dmVuLCBEZXBhcnRlbWVudAorICogQ29tcHV0ZXJ3ZXRlbnNjaGFwcGVuLCBDZWxlc3Rpam5lbmxhYW4gMjAwQSwgQi0zMDAxIExldXZlbiwgQmVsZ2l1bQorICovCisKKyNpZm5kZWYgSVNMX09QVElPTlNfSAorI2RlZmluZSBJU0xfT1BUSU9OU19ICisKKyNpbmNsdWRlIDxpc2wvYXJnLmg+CisjaW5jbHVkZSA8aXNsL2N0eC5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBpc2xfb3B0aW9uczsKKworSVNMX0FSR19ERUNMKGlzbF9vcHRpb25zLCBzdHJ1Y3QgaXNsX29wdGlvbnMsIGlzbF9vcHRpb25zX2FyZ3MpCisKKyNkZWZpbmUJCQlJU0xfQk9VTkRfQkVSTlNURUlOCTAKKyNkZWZpbmUJCQlJU0xfQk9VTkRfUkFOR0UJCTEKK2ludCBpc2xfb3B0aW9uc19zZXRfYm91bmQoaXNsX2N0eCAqY3R4LCBpbnQgdmFsKTsKK2ludCBpc2xfb3B0aW9uc19nZXRfYm91bmQoaXNsX2N0eCAqY3R4KTsKKworI2RlZmluZQkJCUlTTF9PTl9FUlJPUl9XQVJOCTAKKyNkZWZpbmUJCQlJU0xfT05fRVJST1JfQ09OVElOVUUJMQorI2RlZmluZQkJCUlTTF9PTl9FUlJPUl9BQk9SVAkyCitpbnQgaXNsX29wdGlvbnNfc2V0X29uX2Vycm9yKGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X29uX2Vycm9yKGlzbF9jdHggKmN0eCk7CisKK2ludCBpc2xfb3B0aW9uc19zZXRfZ2JyX29ubHlfZmlyc3QoaXNsX2N0eCAqY3R4LCBpbnQgdmFsKTsKK2ludCBpc2xfb3B0aW9uc19nZXRfZ2JyX29ubHlfZmlyc3QoaXNsX2N0eCAqY3R4KTsKKworI2RlZmluZQkJSVNMX1NDSEVEVUxFX0FMR09SSVRITV9JU0wJCTAKKyNkZWZpbmUJCUlTTF9TQ0hFRFVMRV9BTEdPUklUSE1fRkVBVVRSSUVSCTEKK2ludCBpc2xfb3B0aW9uc19zZXRfc2NoZWR1bGVfYWxnb3JpdGhtKGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X3NjaGVkdWxlX2FsZ29yaXRobShpc2xfY3R4ICpjdHgpOworCitpbnQgaXNsX29wdGlvbnNfc2V0X2NvYWxlc2NlX2JvdW5kZWRfd3JhcHBpbmcoaXNsX2N0eCAqY3R4LCBpbnQgdmFsKTsKK2ludCBpc2xfb3B0aW9uc19nZXRfY29hbGVzY2VfYm91bmRlZF93cmFwcGluZyhpc2xfY3R4ICpjdHgpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3BvaW50LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9wb2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxN2U2MDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9wb2ludC5oCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgSVNMX1BPSU5UX0gKKyNkZWZpbmUgSVNMX1BPSU5UX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8aXNsL3NwYWNlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGlzbF9wb2ludDsKK3R5cGVkZWYgc3RydWN0IGlzbF9wb2ludCBpc2xfcG9pbnQ7CisKK2lzbF9jdHggKmlzbF9wb2ludF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX3BvaW50ICpwbnQpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9wb2ludF9nZXRfc3BhY2UoX19pc2xfa2VlcCBpc2xfcG9pbnQgKnBudCk7CisKK19faXNsX2dpdmUgaXNsX3BvaW50ICppc2xfcG9pbnRfemVybyhfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3BvaW50ICppc2xfcG9pbnRfY29weShfX2lzbF9rZWVwIGlzbF9wb2ludCAqcG50KTsKK3ZvaWQgaXNsX3BvaW50X2ZyZWUoX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudCk7CisKK2ludCBpc2xfcG9pbnRfZ2V0X2Nvb3JkaW5hdGUoX19pc2xfa2VlcCBpc2xfcG9pbnQgKnBudCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBpbnQgcG9zLCBpc2xfaW50ICp2KTsKK19faXNsX2dpdmUgaXNsX3BvaW50ICppc2xfcG9pbnRfc2V0X2Nvb3JkaW5hdGUoX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBpbnQgcG9zLCBpc2xfaW50IHYpOworCitfX2lzbF9naXZlIGlzbF9wb2ludCAqaXNsX3BvaW50X2FkZF91aShfX2lzbF90YWtlIGlzbF9wb2ludCAqcG50LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGludCBwb3MsIHVuc2lnbmVkIHZhbCk7CitfX2lzbF9naXZlIGlzbF9wb2ludCAqaXNsX3BvaW50X3N1Yl91aShfX2lzbF90YWtlIGlzbF9wb2ludCAqcG50LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGludCBwb3MsIHVuc2lnbmVkIHZhbCk7CisKK19faXNsX2dpdmUgaXNsX3BvaW50ICppc2xfcG9pbnRfdm9pZChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK2ludCBpc2xfcG9pbnRfaXNfdm9pZChfX2lzbF9rZWVwIGlzbF9wb2ludCAqcG50KTsKKworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfcG9pbnQoCisJX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcHJpbnRlciwgX19pc2xfa2VlcCBpc2xfcG9pbnQgKnBudCk7Cit2b2lkIGlzbF9wb2ludF9kdW1wKF9faXNsX2tlZXAgaXNsX3BvaW50ICpwbnQpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjaW5jbHVkZSA8aXNsL2RpbS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3BvbHlub21pYWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3BvbHlub21pYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzU0YzYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvcG9seW5vbWlhbC5oCkBAIC0wLDAgKzEsNTkzIEBACisjaWZuZGVmIElTTF9QT0xZTk9NSUFMX0gKKyNkZWZpbmUgSVNMX1BPTFlOT01JQUxfSAorCisjaW5jbHVkZSA8aXNsL2N0eC5oPgorI2luY2x1ZGUgPGlzbC9jb25zdHJhaW50Lmg+CisjaW5jbHVkZSA8aXNsL3NwYWNlLmg+CisjaW5jbHVkZSA8aXNsL3NldF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3BvaW50Lmg+CisjaW5jbHVkZSA8aXNsL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxpc2wvdW5pb25fc2V0X3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvYWZmX3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvcG9seW5vbWlhbF90eXBlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworaXNsX2N0eCAqaXNsX3Fwb2x5bm9taWFsX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWwgKnFwKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfcXBvbHlub21pYWxfZ2V0X2RvbWFpbl9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqcXApOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9xcG9seW5vbWlhbF9nZXRfc3BhY2UoX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWwgKnFwKTsKK3Vuc2lnbmVkIGlzbF9xcG9seW5vbWlhbF9kaW0oX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWwgKnFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworaW50IGlzbF9xcG9seW5vbWlhbF9pbnZvbHZlc19kaW1zKF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfc2V0X2RpbV9uYW1lKAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGNvbnN0IGNoYXIgKnMpOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX3plcm9fb25fZG9tYWluKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9vbmVfb25fZG9tYWluKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9pbmZ0eV9vbl9kb21haW4oX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX25lZ2luZnR5X29uX2RvbWFpbihfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfbmFuX29uX2RvbWFpbihfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfcmF0X2NzdF9vbl9kb21haW4oX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwljb25zdCBpc2xfaW50IG4sIGNvbnN0IGlzbF9pbnQgZCk7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX3Zhcl9vbl9kb21haW4oX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9jb3B5KF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCk7Cit2b2lkICppc2xfcXBvbHlub21pYWxfZnJlZShfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXApOworCitpbnQgaXNsX3Fwb2x5bm9taWFsX3BsYWluX2lzX2VxdWFsKF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcDEsCisJX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWwgKnFwMik7CitpbnQgaXNsX3Fwb2x5bm9taWFsX2lzX3plcm8oX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWwgKnFwKTsKK2ludCBpc2xfcXBvbHlub21pYWxfaXNfbmFuKF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCk7CitpbnQgaXNsX3Fwb2x5bm9taWFsX2lzX2luZnR5KF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCk7CitpbnQgaXNsX3Fwb2x5bm9taWFsX2lzX25lZ2luZnR5KF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCk7CitpbnQgaXNsX3Fwb2x5bm9taWFsX3NnbihfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqcXApOworaW50IGlzbF9xcG9seW5vbWlhbF9pc19jc3QoX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWwgKnFwLAorCWlzbF9pbnQgKm4sIGlzbF9pbnQgKmQpOwordm9pZCBpc2xfcXBvbHlub21pYWxfZ2V0X2RlbihfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqcXAsIGlzbF9pbnQgKmQpOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX25lZyhfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXApOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9hZGQoX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwMSwKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAyKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfc3ViKF9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcDEsCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwMik7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX211bChfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAxLAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcDIpOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9wb3coX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLAorCXVuc2lnbmVkIHBvd2VyKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfYWRkX2lzbF9pbnQoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLCBpc2xfaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9tdWxfaXNsX2ludCgKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAsIGlzbF9pbnQgdik7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX3NjYWxlKAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCwgaXNsX2ludCB2KTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9pbnNlcnRfZGltcygKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsCisJdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9hZGRfZGltcygKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9tb3ZlX2RpbXMoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLAorCWVudW0gaXNsX2RpbV90eXBlIGRzdF90eXBlLCB1bnNpZ25lZCBkc3RfcG9zLAorCWVudW0gaXNsX2RpbV90eXBlIHNyY190eXBlLCB1bnNpZ25lZCBzcmNfcG9zLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfcHJvamVjdF9kb21haW5fb25fcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCk7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX2Ryb3BfZGltcygKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX3N1YnN0aXR1dGUoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuLAorCV9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICoqc3Vicyk7CisKK2ludCBpc2xfcXBvbHlub21pYWxfYXNfcG9seW5vbWlhbF9vbl9kb21haW4oX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWwgKnFwLAorCV9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LAorCQkgIF9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpwb2x5LCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfaG9tb2dlbml6ZSgKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcG9seSk7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfYWxpZ25fcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCwgX19pc2xfdGFrZSBpc2xfc3BhY2UgKm1vZGVsKTsKKworaXNsX2N0eCAqaXNsX3Rlcm1fZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF90ZXJtICp0ZXJtKTsKKworX19pc2xfZ2l2ZSBpc2xfdGVybSAqaXNsX3Rlcm1fY29weShfX2lzbF9rZWVwIGlzbF90ZXJtICp0ZXJtKTsKK3ZvaWQgaXNsX3Rlcm1fZnJlZShfX2lzbF90YWtlIGlzbF90ZXJtICp0ZXJtKTsKKwordW5zaWduZWQgaXNsX3Rlcm1fZGltKF9faXNsX2tlZXAgaXNsX3Rlcm0gKnRlcm0sIGVudW0gaXNsX2RpbV90eXBlIHR5cGUpOwordm9pZCBpc2xfdGVybV9nZXRfbnVtKF9faXNsX2tlZXAgaXNsX3Rlcm0gKnRlcm0sIGlzbF9pbnQgKm4pOwordm9pZCBpc2xfdGVybV9nZXRfZGVuKF9faXNsX2tlZXAgaXNsX3Rlcm0gKnRlcm0sIGlzbF9pbnQgKmQpOworaW50IGlzbF90ZXJtX2dldF9leHAoX19pc2xfa2VlcCBpc2xfdGVybSAqdGVybSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfdGVybV9nZXRfZGl2KF9faXNsX2tlZXAgaXNsX3Rlcm0gKnRlcm0sIHVuc2lnbmVkIHBvcyk7CisKK2ludCBpc2xfcXBvbHlub21pYWxfZm9yZWFjaF90ZXJtKF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCwKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfdGVybSAqdGVybSwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX2V2YWwoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLCBfX2lzbF90YWtlIGlzbF9wb2ludCAqcG50KTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9naXN0X3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAsIF9faXNsX3Rha2UgaXNsX3NldCAqY29udGV4dCk7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX2dpc3QoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLCBfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX2Zyb21fY29uc3RyYWludCgKKwlfX2lzbF90YWtlIGlzbF9jb25zdHJhaW50ICpjLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9mcm9tX3Rlcm0oX19pc2xfdGFrZSBpc2xfdGVybSAqdGVybSk7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX2Zyb21fYWZmKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9mcm9tX3Fwb2x5bm9taWFsKAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCk7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X3Fwb2x5bm9taWFsKAorCV9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsIF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCk7Cit2b2lkIGlzbF9xcG9seW5vbWlhbF9wcmludChfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqcXAsIEZJTEUgKm91dCwKKwl1bnNpZ25lZCBvdXRwdXRfZm9ybWF0KTsKK3ZvaWQgaXNsX3Fwb2x5bm9taWFsX2R1bXAoX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWwgKnFwKTsKKworaXNsX2N0eCAqaXNsX3B3X3Fwb2x5bm9taWFsX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworCitpbnQgaXNsX3B3X3Fwb2x5bm9taWFsX3BsYWluX2lzX2VxdWFsKF9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwMSwKKwlfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcDIpOworCitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX3plcm8oX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX2FsbG9jKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCk7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX2Zyb21fcXBvbHlub21pYWwoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfY29weSgKKwlfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCk7Cit2b2lkICppc2xfcHdfcXBvbHlub21pYWxfZnJlZShfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCk7CisKK2ludCBpc2xfcHdfcXBvbHlub21pYWxfaXNfemVybyhfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCk7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfcHdfcXBvbHlub21pYWxfZ2V0X2RvbWFpbl9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3B3X3Fwb2x5bm9taWFsX2dldF9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCk7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX3Jlc2V0X2RvbWFpbl9zcGFjZSgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwgX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7Cit1bnNpZ25lZCBpc2xfcHdfcXBvbHlub21pYWxfZGltKF9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworaW50IGlzbF9wd19xcG9seW5vbWlhbF9pbnZvbHZlc19kaW1zKF9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK2ludCBpc2xfcHdfcXBvbHlub21pYWxfaGFzX2VxdWFsX3NwYWNlKF9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwMSwKKwlfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcDIpOworCitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX3NldF9kaW1fbmFtZSgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGNvbnN0IGNoYXIgKnMpOworCitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9wd19xcG9seW5vbWlhbF9kb21haW4oX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9pbnRlcnNlY3RfZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3BxLCBfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ludGVyc2VjdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cHEsIF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9wcm9qZWN0X2RvbWFpbl9vbl9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9kcm9wX2RpbXMoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9zcGxpdF9kaW1zKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9hZGQoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAxLAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwMik7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX3N1YigKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcDEsCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAyKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfYWRkX2Rpc2pvaW50KAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwMSwKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcDIpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9uZWcoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9tdWwoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAxLAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwMik7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX211bF9pc2xfaW50KAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLCBpc2xfaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9wb3coCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAsIHVuc2lnbmVkIGV4cG9uZW50KTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9pbnNlcnRfZGltcygKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSwKKwl1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX2FkZF9kaW1zKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9tb3ZlX2RpbXMoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAsCisJZW51bSBpc2xfZGltX3R5cGUgZHN0X3R5cGUsIHVuc2lnbmVkIGRzdF9wb3MsCisJZW51bSBpc2xfZGltX3R5cGUgc3JjX3R5cGUsIHVuc2lnbmVkIHNyY19wb3MsIHVuc2lnbmVkIG4pOworCitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZpeF9kaW0oCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgbiwgaXNsX2ludCB2KTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9ldmFsKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLCBfX2lzbF90YWtlIGlzbF9wb2ludCAqcG50KTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9tYXgoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9taW4oCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworCitpbnQgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvcmVhY2hfcGllY2UoX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LCBfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAsCisJCSAgICB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CitpbnQgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvcmVhY2hfbGlmdGVkX3BpZWNlKF9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwgX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLAorCQkgICAgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworCitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX2Zyb21fcHdfYWZmKAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYpOworCitfX2lzbF9jb25zdHJ1Y3RvcgorX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9yZWFkX2Zyb21fc3RyKGlzbF9jdHggKmN0eCwKKwkJY29uc3QgY2hhciAqc3RyKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfcmVhZF9mcm9tX2ZpbGUoaXNsX2N0eCAqY3R4LAorCQlGSUxFICppbnB1dCk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9wd19xcG9seW5vbWlhbCgKKwlfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLCBfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCk7Cit2b2lkIGlzbF9wd19xcG9seW5vbWlhbF9wcmludChfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwgRklMRSAqb3V0LAorCXVuc2lnbmVkIG91dHB1dF9mb3JtYXQpOwordm9pZCBpc2xfcHdfcXBvbHlub21pYWxfZHVtcChfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCk7CisKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfY29hbGVzY2UoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9naXN0KAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLCBfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9naXN0X3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwgX19pc2xfdGFrZSBpc2xfc2V0ICpjb250ZXh0KTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9zcGxpdF9wZXJpb2RzKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLCBpbnQgbWF4X3BlcmlvZHMpOworCitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX2Jhc2ljX3NldF9tdWx0aXBsaWNhdGl2ZV9jYWxsKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwlfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqKCpmbikoX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KSk7CisKK2lzbF9jdHggKmlzbF9xcG9seW5vbWlhbF9mb2xkX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZCk7CitlbnVtIGlzbF9mb2xkIGlzbF9xcG9seW5vbWlhbF9mb2xkX2dldF90eXBlKF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQpOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbF9mb2xkICppc2xfcXBvbHlub21pYWxfZm9sZF9lbXB0eShlbnVtIGlzbF9mb2xkIHR5cGUsCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbF9mb2xkICppc2xfcXBvbHlub21pYWxfZm9sZF9hbGxvYygKKwllbnVtIGlzbF9mb2xkIHR5cGUsIF9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCk7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbF9mb2xkICppc2xfcXBvbHlub21pYWxfZm9sZF9jb3B5KAorCV9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQpOwordm9pZCBpc2xfcXBvbHlub21pYWxfZm9sZF9mcmVlKF9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQpOworCitpbnQgaXNsX3Fwb2x5bm9taWFsX2ZvbGRfaXNfZW1wdHkoX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZCk7CitpbnQgaXNsX3Fwb2x5bm9taWFsX2ZvbGRfcGxhaW5faXNfZXF1YWwoX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZDEsCisJX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZDIpOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3Fwb2x5bm9taWFsX2ZvbGRfZ2V0X3NwYWNlKAorCV9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQpOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbF9mb2xkICppc2xfcXBvbHlub21pYWxfZm9sZF9mb2xkKAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQxLAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQyKTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqaXNsX3Fwb2x5bm9taWFsX2ZvbGRfbXVsX2lzbF9pbnQoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZCwgaXNsX2ludCB2KTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9xcG9seW5vbWlhbF9mb2xkX3NjYWxlKAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQsIGlzbF9pbnQgdik7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9xcG9seW5vbWlhbF9mb2xkX21vdmVfZGltcygKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkLAorCWVudW0gaXNsX2RpbV90eXBlIGRzdF90eXBlLCB1bnNpZ25lZCBkc3RfcG9zLAorCWVudW0gaXNsX2RpbV90eXBlIHNyY190eXBlLCB1bnNpZ25lZCBzcmNfcG9zLCB1bnNpZ25lZCBuKTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqaXNsX3Fwb2x5bm9taWFsX2ZvbGRfc3Vic3RpdHV0ZSgKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuLAorCV9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICoqc3Vicyk7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfZm9sZF9ldmFsKAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQsIF9faXNsX3Rha2UgaXNsX3BvaW50ICpwbnQpOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbF9mb2xkICppc2xfcXBvbHlub21pYWxfZm9sZF9naXN0X3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkLCBfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqaXNsX3Fwb2x5bm9taWFsX2ZvbGRfZ2lzdCgKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkLCBfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworCitpbnQgaXNsX3Fwb2x5bm9taWFsX2ZvbGRfZm9yZWFjaF9xcG9seW5vbWlhbCgKKwlfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkLAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAsIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfcXBvbHlub21pYWxfZm9sZCgKKwlfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLCBfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkKTsKK3ZvaWQgaXNsX3Fwb2x5bm9taWFsX2ZvbGRfcHJpbnQoX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZCwgRklMRSAqb3V0LAorCXVuc2lnbmVkIG91dHB1dF9mb3JtYXQpOwordm9pZCBpc2xfcXBvbHlub21pYWxfZm9sZF9kdW1wKF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQpOworCitpc2xfY3R4ICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3Zik7CisKK2ludCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZF9wbGFpbl9pc19lcXVhbCgKKwlfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YxLAorCV9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZjIpOworCitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9mcm9tX3B3X3Fwb2x5bm9taWFsKAorCWVudW0gaXNsX2ZvbGQgdHlwZSwgX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworCitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9hbGxvYygKKwllbnVtIGlzbF9mb2xkIHR5cGUsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsIF9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfY29weSgKKwlfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOwordm9pZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZnJlZShfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworCitpbnQgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfaXNfemVybyhfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZ2V0X2RvbWFpbl9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2dldF9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfcmVzZXRfc3BhY2UoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmLCBfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK3Vuc2lnbmVkIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2RpbShfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitpbnQgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfaGFzX2VxdWFsX3NwYWNlKAorCV9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZjEsCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmMik7CisKK3NpemVfdCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZF9zaXplKF9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3Zik7CisKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX3plcm8oCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwgZW51bSBpc2xfZm9sZCB0eXBlKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfc2V0X2RpbV9uYW1lKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGNvbnN0IGNoYXIgKnMpOworCitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfaW50ZXJzZWN0X2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YsIF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2ludGVyc2VjdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmLCBfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2FkZCgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YxLAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZjIpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZm9sZCgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YxLAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZjIpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfYWRkX2Rpc2pvaW50KAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZjEsCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmMik7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9tdWxfaXNsX2ludCgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YsIGlzbF9pbnQgdik7CisKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX3Byb2plY3RfZG9tYWluX29uX3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZHJvcF9kaW1zKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9tb3ZlX2RpbXMoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmLAorCWVudW0gaXNsX2RpbV90eXBlIGRzdF90eXBlLCB1bnNpZ25lZCBkc3RfcG9zLAorCWVudW0gaXNsX2RpbV90eXBlIHNyY190eXBlLCB1bnNpZ25lZCBzcmNfcG9zLCB1bnNpZ25lZCBuKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZml4X2RpbSgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgbiwgaXNsX2ludCB2KTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2V2YWwoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmLCBfX2lzbF90YWtlIGlzbF9wb2ludCAqcG50KTsKKworaW50IGlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2ZvcmVhY2hfcGllY2UoCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmLAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwgX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZCwKKwkJICAgIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKK2ludCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZF9mb3JlYWNoX2xpZnRlZF9waWVjZSgKKwlfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LCBfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkLAorCQkgICAgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9wd19xcG9seW5vbWlhbF9mb2xkKAorCV9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsIF9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3Zik7Cit2b2lkIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkX3ByaW50KF9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZiwKKwlGSUxFICpvdXQsIHVuc2lnbmVkIG91dHB1dF9mb3JtYXQpOwordm9pZCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZF9kdW1wKF9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3Zik7CisKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2NvYWxlc2NlKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3Zik7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9naXN0KAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZiwgX19pc2xfdGFrZSBpc2xfc2V0ICpjb250ZXh0KTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2dpc3RfcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZiwgX19pc2xfdGFrZSBpc2xfc2V0ICpjb250ZXh0KTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX21heCgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX21pbigKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworCitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfcHdfcXBvbHlub21pYWxfYm91bmQoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAsIGVudW0gaXNsX2ZvbGQgdHlwZSwgaW50ICp0aWdodCk7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9ib3VuZCgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YsIGludCAqdGlnaHQpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3NldF9hcHBseV9wd19xcG9seW5vbWlhbF9mb2xkKAorCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0LCBfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YsCisJaW50ICp0aWdodCk7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfbWFwX2FwcGx5X3B3X3Fwb2x5bm9taWFsX2ZvbGQoCisJX19pc2xfdGFrZSBpc2xfbWFwICptYXAsIF9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZiwKKwlpbnQgKnRpZ2h0KTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF90b19wb2x5bm9taWFsKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLCBpbnQgc2lnbik7CisKK2lzbF9jdHggKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9nZXRfY3R4KAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCk7CisKK2ludCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfcGxhaW5faXNfZXF1YWwoCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwMSwKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXAyKTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mcm9tX3B3X3Fwb2x5bm9taWFsKF9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfemVybygKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfYWRkX3B3X3Fwb2x5bm9taWFsKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCwKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2NvcHkoCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwKTsKK3ZvaWQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mcmVlKF9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCk7CisKK19faXNsX2NvbnN0cnVjdG9yCitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX3JlYWRfZnJvbV9zdHIoCisJaXNsX2N0eCAqY3R4LCBjb25zdCBjaGFyICpzdHIpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2FkZCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXAxLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcDIpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9zdWIoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwMSwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXAyKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfbXVsKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcDEsCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwMik7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX211bF9pc2xfaW50KAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCwgaXNsX2ludCB2KTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ludGVyc2VjdF9kb21haW4oCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3BxLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ludGVyc2VjdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3BxLAorCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9nZXRfc3BhY2UoCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwKTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9ldmFsKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCwgX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudCk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfY29hbGVzY2UoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZ2lzdCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXAsCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICpjb250ZXh0KTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZ2lzdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwLAorCV9faXNsX3Rha2UgaXNsX3NldCAqY29udGV4dCk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfYWxpZ25fcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCwKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqbW9kZWwpOworCitpbnQgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvcmVhY2hfcHdfcXBvbHlub21pYWwoCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwLAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9leHRyYWN0X3B3X3Fwb2x5bm9taWFsKAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCwgX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X3VuaW9uX3B3X3Fwb2x5bm9taWFsKAorCV9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsIF9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCk7CisKK2lzbF9jdHggKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2dldF9jdHgoCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3Zik7CisKK2ludCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF9wbGFpbl9pc19lcXVhbCgKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmMSwKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmMik7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2Zyb21fcHdfcXBvbHlub21pYWxfZm9sZChfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfemVybygKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLCBlbnVtIGlzbF9mb2xkIHR5cGUpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZm9sZF9wd19xcG9seW5vbWlhbF9mb2xkKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd3FwLAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3cXApOwordm9pZCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZnJlZSgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2NvcHkoCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3Zik7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2ZvbGQoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3ZjEsCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3ZjIpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfYWRkX3VuaW9uX3B3X3Fwb2x5bm9taWFsKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YsCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX211bF9pc2xfaW50KAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YsIGlzbF9pbnQgdik7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfaW50ZXJzZWN0X2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICoKK2lzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2ludGVyc2VjdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3ZiwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK2VudW0gaXNsX2ZvbGQgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZ2V0X3R5cGUoCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3Zik7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZ2V0X3NwYWNlKAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YpOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZXZhbCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmLAorCV9faXNsX3Rha2UgaXNsX3BvaW50ICpwbnQpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF9jb2FsZXNjZSgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2dpc3QoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3ZiwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKmNvbnRleHQpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqCitpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF9naXN0X3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmLAorCV9faXNsX3Rha2UgaXNsX3NldCAqY29udGV4dCk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2FsaWduX3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmLAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICptb2RlbCk7CisKK2ludCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF9mb3JlYWNoX3B3X3Fwb2x5bm9taWFsX2ZvbGQoCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3ZiwKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmLAorCQkgICAgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZXh0cmFjdF9wd19xcG9seW5vbWlhbF9mb2xkKAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YsIF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkKAorCV9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3Zik7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9ib3VuZCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXAsCisJZW51bSBpc2xfZm9sZCB0eXBlLCBpbnQgKnRpZ2h0KTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF91bmlvbl9zZXRfYXBwbHlfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQsCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3ZiwgaW50ICp0aWdodCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfdW5pb25fbWFwX2FwcGx5X3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YsIGludCAqdGlnaHQpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX3RvX3BvbHlub21pYWwoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwLCBpbnQgc2lnbik7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNpbmNsdWRlIDxpc2wvZGltLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvcG9seW5vbWlhbF90eXBlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9wb2x5bm9taWFsX3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQzMmJkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvcG9seW5vbWlhbF90eXBlLmgKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBJU0xfUE9MWU5PTUlBTF9UWVBFX0gKKyNkZWZpbmUgSVNMX1BPTFlOT01JQUxfVFlQRV9ICisKK3N0cnVjdCBpc2xfcXBvbHlub21pYWw7Cit0eXBlZGVmIHN0cnVjdCBpc2xfcXBvbHlub21pYWwgaXNsX3Fwb2x5bm9taWFsOworCitzdHJ1Y3QgaXNsX3Rlcm07Cit0eXBlZGVmIHN0cnVjdCBpc2xfdGVybSBpc2xfdGVybTsKKworc3RydWN0IF9faXNsX2V4cG9ydCBpc2xfcHdfcXBvbHlub21pYWw7Cit0eXBlZGVmIHN0cnVjdCBpc2xfcHdfcXBvbHlub21pYWwgaXNsX3B3X3Fwb2x5bm9taWFsOworCitlbnVtIGlzbF9mb2xkIHsKKwlpc2xfZm9sZF9taW4sCisJaXNsX2ZvbGRfbWF4LAorCWlzbF9mb2xkX2xpc3QKK307CisKK3N0cnVjdCBpc2xfcXBvbHlub21pYWxfZm9sZDsKK3R5cGVkZWYgc3RydWN0IGlzbF9xcG9seW5vbWlhbF9mb2xkIGlzbF9xcG9seW5vbWlhbF9mb2xkOworCitzdHJ1Y3QgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQ7Cit0eXBlZGVmIHN0cnVjdCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZDsKKworc3RydWN0IF9faXNsX2V4cG9ydCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWw7Cit0eXBlZGVmIHN0cnVjdCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsOworCitzdHJ1Y3QgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQ7Cit0eXBlZGVmIHN0cnVjdCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9wcmludGVyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9wcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3OWZjMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3ByaW50ZXIuaApAQCAtMCwwICsxLDYyIEBACisjaWZuZGVmIElTTF9QUklOVEVSX0gKKyNkZWZpbmUgSVNMX1BSSU5URVJfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxpc2wvY3R4Lmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGlzbF9wcmludGVyOwordHlwZWRlZiBzdHJ1Y3QgaXNsX3ByaW50ZXIgaXNsX3ByaW50ZXI7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3RvX2ZpbGUoaXNsX2N0eCAqY3R4LCBGSUxFICpmaWxlKTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3RvX3N0cihpc2xfY3R4ICpjdHgpOwordm9pZCAqaXNsX3ByaW50ZXJfZnJlZShfX2lzbF90YWtlIGlzbF9wcmludGVyICpwcmludGVyKTsKKworaXNsX2N0eCAqaXNsX3ByaW50ZXJfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9wcmludGVyICpwcmludGVyKTsKK0ZJTEUgKmlzbF9wcmludGVyX2dldF9maWxlKF9faXNsX2tlZXAgaXNsX3ByaW50ZXIgKnByaW50ZXIpOworCitfX2lzbF9naXZlIGNoYXIgKmlzbF9wcmludGVyX2dldF9zdHIoX19pc2xfa2VlcCBpc2xfcHJpbnRlciAqcHJpbnRlcik7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3NldF9pbmRlbnQoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlpbnQgaW5kZW50KTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX2luZGVudChfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCWludCBpbmRlbnQpOworCisjZGVmaW5lIElTTF9GT1JNQVRfSVNMCQkJMAorI2RlZmluZSBJU0xfRk9STUFUX1BPTFlMSUIJCTEKKyNkZWZpbmUgSVNMX0ZPUk1BVF9QT0xZTElCX0NPTlNUUkFJTlRTCTIKKyNkZWZpbmUgSVNMX0ZPUk1BVF9PTUVHQQkJMworI2RlZmluZSBJU0xfRk9STUFUX0MJCQk0CisjZGVmaW5lIElTTF9GT1JNQVRfTEFURVgJCTUKKyNkZWZpbmUgSVNMX0ZPUk1BVF9FWFRfUE9MWUxJQgkJNgorX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfc2V0X291dHB1dF9mb3JtYXQoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlpbnQgb3V0cHV0X2Zvcm1hdCk7CitpbnQgaXNsX3ByaW50ZXJfZ2V0X291dHB1dF9mb3JtYXQoX19pc2xfa2VlcCBpc2xfcHJpbnRlciAqcCk7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3NldF9wcmVmaXgoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwljb25zdCBjaGFyICpwcmVmaXgpOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfc2V0X3N1ZmZpeChfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCWNvbnN0IGNoYXIgKnN1ZmZpeCk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9zZXRfaXNsX2ludF93aWR0aChfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCWludCB3aWR0aCk7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3N0YXJ0X2xpbmUoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9lbmRfbGluZShfX2lzbF90YWtlIGlzbF9wcmludGVyICpwKTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X2RvdWJsZShfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCWRvdWJsZSBkKTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X2ludChfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLCBpbnQgaSk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9pc2xfaW50KF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJaXNsX2ludCBpKTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X3N0cihfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCWNvbnN0IGNoYXIgKnMpOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9mbHVzaChfX2lzbF90YWtlIGlzbF9wcmludGVyICpwKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9zY2hlZHVsZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvc2NoZWR1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODVjNmM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvc2NoZWR1bGUuaApAQCAtMCwwICsxLDYyIEBACisjaWZuZGVmIElTTF9TQ0hFRFVMRV9ICisjZGVmaW5lIElTTF9TQ0hFRFVMRV9ICisKKyNpbmNsdWRlIDxpc2wvdW5pb25fc2V0X3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvdW5pb25fbWFwX3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvYmFuZC5oPgorI2luY2x1ZGUgPGlzbC9saXN0Lmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGlzbF9zY2hlZHVsZTsKK3R5cGVkZWYgc3RydWN0IGlzbF9zY2hlZHVsZSBpc2xfc2NoZWR1bGU7CisKK2ludCBpc2xfb3B0aW9uc19zZXRfc2NoZWR1bGVfbWF4X2NvZWZmaWNpZW50KGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X3NjaGVkdWxlX21heF9jb2VmZmljaWVudChpc2xfY3R4ICpjdHgpOworCitpbnQgaXNsX29wdGlvbnNfc2V0X3NjaGVkdWxlX21heF9jb25zdGFudF90ZXJtKGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X3NjaGVkdWxlX21heF9jb25zdGFudF90ZXJtKGlzbF9jdHggKmN0eCk7CisKK2ludCBpc2xfb3B0aW9uc19zZXRfc2NoZWR1bGVfbWF4aW1pemVfYmFuZF9kZXB0aChpc2xfY3R4ICpjdHgsIGludCB2YWwpOworaW50IGlzbF9vcHRpb25zX2dldF9zY2hlZHVsZV9tYXhpbWl6ZV9iYW5kX2RlcHRoKGlzbF9jdHggKmN0eCk7CisKK2ludCBpc2xfb3B0aW9uc19zZXRfc2NoZWR1bGVfb3V0ZXJfemVyb19kaXN0YW5jZShpc2xfY3R4ICpjdHgsIGludCB2YWwpOworaW50IGlzbF9vcHRpb25zX2dldF9zY2hlZHVsZV9vdXRlcl96ZXJvX2Rpc3RhbmNlKGlzbF9jdHggKmN0eCk7CisKK2ludCBpc2xfb3B0aW9uc19zZXRfc2NoZWR1bGVfc3BsaXRfc2NhbGVkKGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X3NjaGVkdWxlX3NwbGl0X3NjYWxlZChpc2xfY3R4ICpjdHgpOworCitpbnQgaXNsX29wdGlvbnNfc2V0X3NjaGVkdWxlX3NlcGFyYXRlX2NvbXBvbmVudHMoaXNsX2N0eCAqY3R4LCBpbnQgdmFsKTsKK2ludCBpc2xfb3B0aW9uc19nZXRfc2NoZWR1bGVfc2VwYXJhdGVfY29tcG9uZW50cyhpc2xfY3R4ICpjdHgpOworCisjZGVmaW5lCQlJU0xfU0NIRURVTEVfRlVTRV9NQVgJCQkwCisjZGVmaW5lCQlJU0xfU0NIRURVTEVfRlVTRV9NSU4JCQkxCitpbnQgaXNsX29wdGlvbnNfc2V0X3NjaGVkdWxlX2Z1c2UoaXNsX2N0eCAqY3R4LCBpbnQgdmFsKTsKK2ludCBpc2xfb3B0aW9uc19nZXRfc2NoZWR1bGVfZnVzZShpc2xfY3R4ICpjdHgpOworCitfX2lzbF9naXZlIGlzbF9zY2hlZHVsZSAqaXNsX3VuaW9uX3NldF9jb21wdXRlX3NjaGVkdWxlKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqZG9tYWluLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdmFsaWRpdHksCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICpwcm94aW1pdHkpOwordm9pZCAqaXNsX3NjaGVkdWxlX2ZyZWUoX19pc2xfdGFrZSBpc2xfc2NoZWR1bGUgKnNjaGVkKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3NjaGVkdWxlX2dldF9tYXAoX19pc2xfa2VlcCBpc2xfc2NoZWR1bGUgKnNjaGVkKTsKKworaXNsX2N0eCAqaXNsX3NjaGVkdWxlX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfc2NoZWR1bGUgKnNjaGVkKTsKKworX19pc2xfZ2l2ZSBpc2xfYmFuZF9saXN0ICppc2xfc2NoZWR1bGVfZ2V0X2JhbmRfZm9yZXN0KAorCV9faXNsX2tlZXAgaXNsX3NjaGVkdWxlICpzY2hlZHVsZSk7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X3NjaGVkdWxlKF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJX19pc2xfa2VlcCBpc2xfc2NoZWR1bGUgKnNjaGVkdWxlKTsKK3ZvaWQgaXNsX3NjaGVkdWxlX2R1bXAoX19pc2xfa2VlcCBpc2xfc2NoZWR1bGUgKnNjaGVkdWxlKTsKKworaW50IGlzbF9zY2hlZHVsZV9mb3JlYWNoX2JhbmQoX19pc2xfa2VlcCBpc2xfc2NoZWR1bGUgKnNjaGVkLAorCWludCAoKmZuKShfX2lzbF9rZWVwIGlzbF9iYW5kICpiYW5kLCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvc2VxLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9zZXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTYzMzUyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvc2VxLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgS2F0aG9saWVrZSBVbml2ZXJzaXRlaXQgTGV1dmVuCisgKgorICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIE1JVCBsaWNlbnNlCisgKgorICogV3JpdHRlbiBieSBTdmVuIFZlcmRvb2xhZWdlLCBLLlUuTGV1dmVuLCBEZXBhcnRlbWVudAorICogQ29tcHV0ZXJ3ZXRlbnNjaGFwcGVuLCBDZWxlc3Rpam5lbmxhYW4gMjAwQSwgQi0zMDAxIExldXZlbiwgQmVsZ2l1bQorICovCisKKyNpZm5kZWYgSVNMX1NFUV9ICisjZGVmaW5lIElTTF9TRVFfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8aXNsL2ludC5oPgorI2luY2x1ZGUgPGlzbC9jdHguaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBTb21lIGNvbW1vbiBvcGVyYXRpb25zIG9uIHNlcXVlbmNlcyBvZiBpc2xfaW50J3MgKi8KKwordm9pZCBpc2xfc2VxX2Nscihpc2xfaW50ICpwLCB1bnNpZ25lZCBsZW4pOwordm9pZCBpc2xfc2VxX3NldChpc2xfaW50ICpwLCBpc2xfaW50IHYsIHVuc2lnbmVkIGxlbik7Cit2b2lkIGlzbF9zZXFfc2V0X3NpKGlzbF9pbnQgKnAsIGludCB2LCB1bnNpZ25lZCBsZW4pOwordm9pZCBpc2xfc2VxX25lZyhpc2xfaW50ICpkYXQsIGlzbF9pbnQgKnNyYywgdW5zaWduZWQgbGVuKTsKK3ZvaWQgaXNsX3NlcV9jcHkoaXNsX2ludCAqZHN0LCBpc2xfaW50ICpzcmMsIHVuc2lnbmVkIGxlbik7Cit2b2lkIGlzbF9zZXFfYWRkbXVsKGlzbF9pbnQgKmRzdCwgaXNsX2ludCBmLCBpc2xfaW50ICpzcmMsIHVuc2lnbmVkIGxlbik7Cit2b2lkIGlzbF9zZXFfc3VibXVsKGlzbF9pbnQgKmRzdCwgaXNsX2ludCBmLCBpc2xfaW50ICpzcmMsIHVuc2lnbmVkIGxlbik7Cit2b2lkIGlzbF9zZXFfc3dwX29yX2NweShpc2xfaW50ICpkc3QsIGlzbF9pbnQgKnNyYywgdW5zaWduZWQgbGVuKTsKK3ZvaWQgaXNsX3NlcV9zY2FsZShpc2xfaW50ICpkc3QsIGlzbF9pbnQgKnNyYywgaXNsX2ludCBmLCB1bnNpZ25lZCBsZW4pOwordm9pZCBpc2xfc2VxX3NjYWxlX2Rvd24oaXNsX2ludCAqZHN0LCBpc2xfaW50ICpzcmMsIGlzbF9pbnQgZiwgdW5zaWduZWQgbGVuKTsKK3ZvaWQgaXNsX3NlcV9jZGl2X3EoaXNsX2ludCAqZHN0LCBpc2xfaW50ICpzcmMsIGlzbF9pbnQgbSwgdW5zaWduZWQgbGVuKTsKK3ZvaWQgaXNsX3NlcV9mZGl2X3EoaXNsX2ludCAqZHN0LCBpc2xfaW50ICpzcmMsIGlzbF9pbnQgbSwgdW5zaWduZWQgbGVuKTsKK3ZvaWQgaXNsX3NlcV9mZGl2X3IoaXNsX2ludCAqZHN0LCBpc2xfaW50ICpzcmMsIGlzbF9pbnQgbSwgdW5zaWduZWQgbGVuKTsKK3ZvaWQgaXNsX3NlcV9jb21iaW5lKGlzbF9pbnQgKmRzdCwgaXNsX2ludCBtMSwgaXNsX2ludCAqc3JjMSwKKwkJCWlzbF9pbnQgbTIsIGlzbF9pbnQgKnNyYzIsIHVuc2lnbmVkIGxlbik7Cit2b2lkIGlzbF9zZXFfZWxpbShpc2xfaW50ICpkc3QsIGlzbF9pbnQgKnNyYywgdW5zaWduZWQgcG9zLCB1bnNpZ25lZCBsZW4sCisJCSAgaXNsX2ludCAqbSk7Cit2b2lkIGlzbF9zZXFfYWJzX21heChpc2xfaW50ICpwLCB1bnNpZ25lZCBsZW4sIGlzbF9pbnQgKm1heCk7Cit2b2lkIGlzbF9zZXFfZ2NkKGlzbF9pbnQgKnAsIHVuc2lnbmVkIGxlbiwgaXNsX2ludCAqZ2NkKTsKK3ZvaWQgaXNsX3NlcV9sY20oaXNsX2ludCAqcCwgdW5zaWduZWQgbGVuLCBpc2xfaW50ICpsY20pOwordm9pZCBpc2xfc2VxX25vcm1hbGl6ZShzdHJ1Y3QgaXNsX2N0eCAqY3R4LCBpc2xfaW50ICpwLCB1bnNpZ25lZCBsZW4pOwordm9pZCBpc2xfc2VxX2lubmVyX3Byb2R1Y3QoaXNsX2ludCAqcDEsIGlzbF9pbnQgKnAyLCB1bnNpZ25lZCBsZW4sCisJCQkgICBpc2xfaW50ICpwcm9kKTsKK2ludCBpc2xfc2VxX2ZpcnN0X25vbl96ZXJvKGlzbF9pbnQgKnAsIHVuc2lnbmVkIGxlbik7CitpbnQgaXNsX3NlcV9sYXN0X25vbl96ZXJvKGlzbF9pbnQgKnAsIHVuc2lnbmVkIGxlbik7CitpbnQgaXNsX3NlcV9hYnNfbWluX25vbl96ZXJvKGlzbF9pbnQgKnAsIHVuc2lnbmVkIGxlbik7CitpbnQgaXNsX3NlcV9lcShpc2xfaW50ICpwMSwgaXNsX2ludCAqcDIsIHVuc2lnbmVkIGxlbik7CitpbnQgaXNsX3NlcV9jbXAoaXNsX2ludCAqcDEsIGlzbF9pbnQgKnAyLCB1bnNpZ25lZCBsZW4pOworaW50IGlzbF9zZXFfaXNfbmVnKGlzbF9pbnQgKnAxLCBpc2xfaW50ICpwMiwgdW5zaWduZWQgbGVuKTsKKwordWludDMyX3QgaXNsX3NlcV9nZXRfaGFzaChpc2xfaW50ICpwLCB1bnNpZ25lZCBsZW4pOwordWludDMyX3QgaXNsX3NlcV9nZXRfaGFzaF9iaXRzKGlzbF9pbnQgKnAsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgYml0cyk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvc2V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjY1ZmVhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvc2V0LmgKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEthdGhvbGlla2UgVW5pdmVyc2l0ZWl0IExldXZlbgorICoKKyAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBNSVQgbGljZW5zZQorICoKKyAqIFdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZSwgSy5VLkxldXZlbiwgRGVwYXJ0ZW1lbnQKKyAqIENvbXB1dGVyd2V0ZW5zY2hhcHBlbiwgQ2VsZXN0aWpuZW5sYWFuIDIwMEEsIEItMzAwMSBMZXV2ZW4sIEJlbGdpdW0KKyAqLworCisjaWZuZGVmIElTTF9TRVRfSAorI2RlZmluZSBJU0xfU0VUX0gKKworI2luY2x1ZGUgPGlzbC9tYXBfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9hZmZfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9saXN0Lmg+CisjaW5jbHVkZSA8aXNsL21hdC5oPgorI2luY2x1ZGUgPGlzbC9wb2ludC5oPgorI2luY2x1ZGUgPGlzbC9sb2NhbF9zcGFjZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3Vuc2lnbmVkIGlzbF9iYXNpY19zZXRfbl9kaW0oX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK3Vuc2lnbmVkIGlzbF9iYXNpY19zZXRfbl9wYXJhbShfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOwordW5zaWduZWQgaXNsX2Jhc2ljX3NldF90b3RhbF9kaW0oY29uc3Qgc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQpOwordW5zaWduZWQgaXNsX2Jhc2ljX3NldF9kaW0oX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0LAorCQkJCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworCit1bnNpZ25lZCBpc2xfc2V0X25fZGltKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKK3Vuc2lnbmVkIGlzbF9zZXRfbl9wYXJhbShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7Cit1bnNpZ25lZCBpc2xfc2V0X2RpbShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CisKK2lzbF9jdHggKmlzbF9iYXNpY19zZXRfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOworaXNsX2N0eCAqaXNsX3NldF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfYmFzaWNfc2V0X2dldF9zcGFjZShfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zZXRfZ2V0X3NwYWNlKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9yZXNldF9zcGFjZShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKKworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYmFzaWNfc2V0X2dldF9kaXYoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0LAorCWludCBwb3MpOworCitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2Jhc2ljX3NldF9nZXRfbG9jYWxfc3BhY2UoCisJX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKKworY29uc3QgY2hhciAqaXNsX2Jhc2ljX3NldF9nZXRfdHVwbGVfbmFtZShfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOworaW50IGlzbF9zZXRfaGFzX3R1cGxlX25hbWUoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworY29uc3QgY2hhciAqaXNsX3NldF9nZXRfdHVwbGVfbmFtZShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfc2V0X3R1cGxlX25hbWUoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpzZXQsIGNvbnN0IGNoYXIgKnMpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3NldF90dXBsZV9uYW1lKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCWNvbnN0IGNoYXIgKnMpOworY29uc3QgY2hhciAqaXNsX2Jhc2ljX3NldF9nZXRfZGltX25hbWUoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfc2V0X2RpbV9uYW1lKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGNvbnN0IGNoYXIgKnMpOworaW50IGlzbF9zZXRfaGFzX2RpbV9uYW1lKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7Citjb25zdCBjaGFyICppc2xfc2V0X2dldF9kaW1fbmFtZShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3NldF9kaW1fbmFtZShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGNvbnN0IGNoYXIgKnMpOworCitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX2Jhc2ljX3NldF9nZXRfZGltX2lkKF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3NldF9kaW1faWQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBfX2lzbF90YWtlIGlzbF9pZCAqaWQpOworaW50IGlzbF9zZXRfaGFzX2RpbV9pZChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9zZXRfZ2V0X2RpbV9pZChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3NldF90dXBsZV9pZChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwlfX2lzbF90YWtlIGlzbF9pZCAqaWQpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3Jlc2V0X3R1cGxlX2lkKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK2ludCBpc2xfc2V0X2hhc190dXBsZV9pZChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX3NldF9nZXRfdHVwbGVfaWQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworCitpbnQgaXNsX3NldF9maW5kX2RpbV9ieV9pZChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSwKKwlfX2lzbF9rZWVwIGlzbF9pZCAqaWQpOworaW50IGlzbF9zZXRfZmluZF9kaW1fYnlfbmFtZShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSwKKwljb25zdCBjaGFyICpuYW1lKTsKKworaW50IGlzbF9iYXNpY19zZXRfaXNfcmF0aW9uYWwoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKKworc3RydWN0IGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfYWxsb2Moc3RydWN0IGlzbF9jdHggKmN0eCwKKwkJdW5zaWduZWQgbnBhcmFtLCB1bnNpZ25lZCBkaW0sIHVuc2lnbmVkIGV4dHJhLAorCQl1bnNpZ25lZCBuX2VxLCB1bnNpZ25lZCBuX2luZXEpOworc3RydWN0IGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZXh0ZW5kKHN0cnVjdCBpc2xfYmFzaWNfc2V0ICpiYXNlLAorCQl1bnNpZ25lZCBucGFyYW0sIHVuc2lnbmVkIGRpbSwgdW5zaWduZWQgZXh0cmEsCisJCXVuc2lnbmVkIG5fZXEsIHVuc2lnbmVkIG5faW5lcSk7CitzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9leHRlbmRfY29uc3RyYWludHMoCisJCXN0cnVjdCBpc2xfYmFzaWNfc2V0ICpiYXNlLCB1bnNpZ25lZCBuX2VxLCB1bnNpZ25lZCBuX2luZXEpOworc3RydWN0IGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZmluYWxpemUoc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQpOwordm9pZCAqaXNsX2Jhc2ljX3NldF9mcmVlKF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfY29weShfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOworc3RydWN0IGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZHVwKHN0cnVjdCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9lbXB0eShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK3N0cnVjdCBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2VtcHR5X2xpa2Uoc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3VuaXZlcnNlKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X25hdF91bml2ZXJzZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK3N0cnVjdCBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3VuaXZlcnNlX2xpa2Uoc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3VuaXZlcnNlX2xpa2Vfc2V0KAorCV9faXNsX2tlZXAgaXNsX3NldCAqbW9kZWwpOworc3RydWN0IGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfaW50ZXJ2YWwoc3RydWN0IGlzbF9jdHggKmN0eCwKKwlpc2xfaW50IG1pbiwgaXNsX2ludCBtYXgpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3Bvc2l0aXZlX29ydGhhbnQoCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNwYWNlKTsKK3ZvaWQgaXNsX2Jhc2ljX3NldF9wcmludF9pbnRlcm5hbChfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJCQkJRklMRSAqb3V0LCBpbnQgaW5kZW50KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2ludGVyc2VjdCgKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0MSwKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0Mik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9pbnRlcnNlY3RfcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldDEsIF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfYXBwbHkoCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9wcmVpbWFnZV9tdWx0aV9hZmYoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LCBfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2FmZmluZV9odWxsKAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3JlbW92ZV9kaW1zKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9zYW1wbGUoX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK3N0cnVjdCBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3NpbXBsaWZ5KHN0cnVjdCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2RldGVjdF9lcXVhbGl0aWVzKAorCQkJCQkJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9yZW1vdmVfcmVkdW5kYW5jaWVzKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfcmVtb3ZlX3JlZHVuZGFuY2llcyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfbGlzdF9wcm9kdWN0KAorCV9faXNsX3Rha2Ugc3RydWN0IGlzbF9iYXNpY19zZXRfbGlzdCAqbGlzdCk7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9yZWFkX2Zyb21fZmlsZShpc2xfY3R4ICpjdHgsCisJRklMRSAqaW5wdXQpOworX19pc2xfY29uc3RydWN0b3IKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9yZWFkX2Zyb21fc3RyKGlzbF9jdHggKmN0eCwKKwljb25zdCBjaGFyICpzdHIpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3JlYWRfZnJvbV9maWxlKGlzbF9jdHggKmN0eCwgRklMRSAqaW5wdXQpOworX19pc2xfY29uc3RydWN0b3IKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9yZWFkX2Zyb21fc3RyKGlzbF9jdHggKmN0eCwgY29uc3QgY2hhciAqc3RyKTsKK3ZvaWQgaXNsX2Jhc2ljX3NldF9kdW1wKF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCk7Cit2b2lkIGlzbF9zZXRfZHVtcChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9iYXNpY19zZXQoCisJX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcHJpbnRlciwgX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X3NldChfX2lzbF90YWtlIGlzbF9wcmludGVyICpwcmludGVyLAorCV9faXNsX2tlZXAgaXNsX3NldCAqbWFwKTsKK3ZvaWQgaXNsX2Jhc2ljX3NldF9wcmludChfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQsIEZJTEUgKm91dCwgaW50IGluZGVudCwKKwljb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnN1ZmZpeCwgdW5zaWduZWQgb3V0cHV0X2Zvcm1hdCk7Cit2b2lkIGlzbF9zZXRfcHJpbnQoX19pc2xfa2VlcCBzdHJ1Y3QgaXNsX3NldCAqc2V0LCBGSUxFICpvdXQsIGludCBpbmRlbnQsCisJdW5zaWduZWQgb3V0cHV0X2Zvcm1hdCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZml4KF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpc2xfaW50IHZhbHVlKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9maXhfc2koX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LAorCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGludCB2YWx1ZSk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZml4X3NpKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGludCB2YWx1ZSk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfbG93ZXJfYm91bmRfc2koX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgaW50IHZhbHVlKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9sb3dlcl9ib3VuZChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGlzbF9pbnQgdmFsdWUpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3VwcGVyX2JvdW5kX3NpKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgaW50IHZhbHVlKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF91cHBlcl9ib3VuZChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGlzbF9pbnQgdmFsdWUpOworCitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZXF1YXRlKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUxLCBpbnQgcG9zMSwgZW51bSBpc2xfZGltX3R5cGUgdHlwZTIsIGludCBwb3MyKTsKKworc3RydWN0IGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZnJvbV91bmRlcmx5aW5nX3NldCgKKwlzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqYnNldCwgc3RydWN0IGlzbF9iYXNpY19zZXQgKmxpa2UpOworc3RydWN0IGlzbF9zZXQgKmlzbF9zZXRfZnJvbV91bmRlcmx5aW5nX3NldCgKKwlzdHJ1Y3QgaXNsX3NldCAqc2V0LCBzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqbGlrZSk7CitzdHJ1Y3QgaXNsX3NldCAqaXNsX3NldF90b191bmRlcmx5aW5nX3NldChzdHJ1Y3QgaXNsX3NldCAqc2V0KTsKKworX19pc2xfZXhwb3J0CitpbnQgaXNsX2Jhc2ljX3NldF9pc19lcXVhbCgKKwkJc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQxLCBzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqYnNldDIpOworCitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9iYXNpY19zZXRfcGFydGlhbF9sZXhtaW4oCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwgX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpkb20sCisJCV9faXNsX2dpdmUgaXNsX3NldCAqKmVtcHR5KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX2Jhc2ljX3NldF9wYXJ0aWFsX2xleG1heCgKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LCBfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmRvbSwKKwkJX19pc2xfZ2l2ZSBpc2xfc2V0ICoqZW1wdHkpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3BhcnRpYWxfbGV4bWluKAorCQlfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwgX19pc2xfdGFrZSBpc2xfc2V0ICpkb20sCisJCV9faXNsX2dpdmUgaXNsX3NldCAqKmVtcHR5KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9wYXJ0aWFsX2xleG1heCgKKwkJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsIF9faXNsX3Rha2UgaXNsX3NldCAqZG9tLAorCQlfX2lzbF9naXZlIGlzbF9zZXQgKiplbXB0eSk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX2Jhc2ljX3NldF9sZXhtaW4oX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfYmFzaWNfc2V0X2xleG1heChfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfbGV4bWluKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2xleG1heChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9iYXNpY19zZXRfcGFydGlhbF9sZXhtaW5fcHdfbXVsdGlfYWZmKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwgX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpkb20sCisJX19pc2xfZ2l2ZSBpc2xfc2V0ICoqZW1wdHkpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfYmFzaWNfc2V0X3BhcnRpYWxfbGV4bWF4X3B3X211bHRpX2FmZigKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsIF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqZG9tLAorCV9faXNsX2dpdmUgaXNsX3NldCAqKmVtcHR5KTsKKworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9iYXNpY19zZXRfdW5pb24oCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldDEsCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldDIpOworCitpbnQgaXNsX2Jhc2ljX3NldF9jb21wYXJlX2F0KHN0cnVjdCBpc2xfYmFzaWNfc2V0ICpic2V0MSwKKwlzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqYnNldDIsIGludCBwb3MpOworaW50IGlzbF9zZXRfZm9sbG93c19hdChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldDEsCisJX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQyLCBpbnQgcG9zKTsKKworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3BhcmFtcyhfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2Zyb21fcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfcGFyYW1zKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9mcm9tX3BhcmFtcyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK2ludCBpc2xfYmFzaWNfc2V0X2RpbXNfZ2V0X3NpZ24oX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgdW5zaWduZWQgbiwgaW50ICpzaWducyk7CisKK2ludCBpc2xfYmFzaWNfc2V0X2lzX3VuaXZlcnNlKF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitpbnQgaXNsX2Jhc2ljX3NldF9wbGFpbl9pc19lbXB0eShfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOworaW50IGlzbF9iYXNpY19zZXRfZmFzdF9pc19lbXB0eShfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX2Jhc2ljX3NldF9pc19lbXB0eShfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOworaW50IGlzbF9iYXNpY19zZXRfaXNfYm91bmRlZChfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX2Jhc2ljX3NldF9pc19zdWJzZXQoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0MSwKKwlfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQyKTsKKworc3RydWN0IGlzbF9zZXQgKmlzbF9zZXRfYWxsb2Moc3RydWN0IGlzbF9jdHggKmN0eCwKKwkJdW5zaWduZWQgbnBhcmFtLCB1bnNpZ25lZCBkaW0sIGludCBuLCB1bnNpZ25lZCBmbGFncyk7CitzdHJ1Y3QgaXNsX3NldCAqaXNsX3NldF9leHRlbmQoc3RydWN0IGlzbF9zZXQgKmJhc2UsCisJCXVuc2lnbmVkIG5wYXJhbSwgdW5zaWduZWQgZGltKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9lbXB0eShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK3N0cnVjdCBpc2xfc2V0ICppc2xfc2V0X2VtcHR5X2xpa2Uoc3RydWN0IGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfdW5pdmVyc2UoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfbmF0X3VuaXZlcnNlKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3VuaXZlcnNlX2xpa2UoX19pc2xfa2VlcCBpc2xfc2V0ICptb2RlbCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfYWRkX2Jhc2ljX3NldChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwkJCQkJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitzdHJ1Y3QgaXNsX3NldCAqaXNsX3NldF9maW5hbGl6ZShzdHJ1Y3QgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9jb3B5KF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKK3ZvaWQgKmlzbF9zZXRfZnJlZShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitzdHJ1Y3QgaXNsX3NldCAqaXNsX3NldF9kdXAoc3RydWN0IGlzbF9zZXQgKnNldCk7CitfX2lzbF9jb25zdHJ1Y3RvcgorX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2Zyb21fYmFzaWNfc2V0KF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX3NldF9zYW1wbGUoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfcG9pbnQgKmlzbF9iYXNpY19zZXRfc2FtcGxlX3BvaW50KF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9naXZlIGlzbF9wb2ludCAqaXNsX3NldF9zYW1wbGVfcG9pbnQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZGV0ZWN0X2VxdWFsaXRpZXMoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9zZXRfYWZmaW5lX2h1bGwoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfc2V0X2NvbnZleF9odWxsKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfc2V0X3BvbHloZWRyYWxfaHVsbChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9zZXRfc2ltcGxlX2h1bGwoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfc2V0X3Vuc2hpZnRlZF9zaW1wbGVfaHVsbCgKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqaXNsX3NldF9ib3VuZGVkX3NpbXBsZV9odWxsKHN0cnVjdCBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3JlY2Vzc2lvbl9jb25lKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworc3RydWN0IGlzbF9zZXQgKmlzbF9zZXRfdW5pb25fZGlzam9pbnQoCisJCQlzdHJ1Y3QgaXNsX3NldCAqc2V0MSwgc3RydWN0IGlzbF9zZXQgKnNldDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfdW5pb24oCisJCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0MSwKKwkJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQyKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9wcm9kdWN0KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0MSwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNldDIpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2ZsYXRfcHJvZHVjdCgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQxLCBfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQyKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9mbGF0X3Byb2R1Y3QoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQxLAorCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0Mik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9pbnRlcnNlY3QoCisJCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0MSwKKwkJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2ludGVyc2VjdF9wYXJhbXMoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJCV9faXNsX3Rha2UgaXNsX3NldCAqcGFyYW1zKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3N1YnRyYWN0KAorCQlfX2lzbF90YWtlIGlzbF9zZXQgKnNldDEsCisJCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0Mik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9jb21wbGVtZW50KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2FwcGx5KAorCQlfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwkJX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3ByZWltYWdlX211bHRpX2FmZihfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9wcmVpbWFnZV9wd19tdWx0aV9hZmYoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2ZpeChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpc2xfaW50IHZhbHVlKTsKK3N0cnVjdCBpc2xfc2V0ICppc2xfc2V0X2ZpeF9kaW1fc2koc3RydWN0IGlzbF9zZXQgKnNldCwKKwkJdW5zaWduZWQgZGltLCBpbnQgdmFsdWUpOworc3RydWN0IGlzbF9zZXQgKmlzbF9zZXRfbG93ZXJfYm91bmRfZGltKHN0cnVjdCBpc2xfc2V0ICpzZXQsCisJCXVuc2lnbmVkIGRpbSwgaXNsX2ludCB2YWx1ZSk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfaW5zZXJ0X2RpbXMoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfaW5zZXJ0X2RpbXMoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfYWRkX2RpbXMoX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LAorCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBuKTsKKy8qIGRlcHJlY2F0ZWQgKi8KK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9hZGQoX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2FkZF9kaW1zKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9tb3ZlX2RpbXMoX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LAorCWVudW0gaXNsX2RpbV90eXBlIGRzdF90eXBlLCB1bnNpZ25lZCBkc3RfcG9zLAorCWVudW0gaXNsX2RpbV90eXBlIHNyY190eXBlLCB1bnNpZ25lZCBzcmNfcG9zLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9tb3ZlX2RpbXMoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgZHN0X3R5cGUsIHVuc2lnbmVkIGRzdF9wb3MsCisJZW51bSBpc2xfZGltX3R5cGUgc3JjX3R5cGUsIHVuc2lnbmVkIHNyY19wb3MsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3Byb2plY3Rfb3V0KAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9wcm9qZWN0X291dChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3JlbW92ZV9kaXZzKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZWxpbWluYXRlKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZWxpbWluYXRlKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK3N0cnVjdCBpc2xfc2V0ICppc2xfc2V0X2VsaW1pbmF0ZV9kaW1zKHN0cnVjdCBpc2xfc2V0ICpzZXQsCisJCXVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9yZW1vdmVfZGltcyhfX2lzbF90YWtlIGlzbF9zZXQgKmJzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3JlbW92ZV9kaXZzX2ludm9sdmluZ19kaW1zKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfcmVtb3ZlX2RpdnNfaW52b2x2aW5nX2RpbXMoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3JlbW92ZV91bmtub3duX2RpdnMoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9yZW1vdmVfdW5rbm93bl9kaXZzKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9yZW1vdmVfZGl2cyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfc3BsaXRfZGltcyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9kcm9wX2NvbnN0cmFpbnRzX2ludm9sdmluZ19kaW1zKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZHJvcF9jb25zdHJhaW50c19ub3RfaW52b2x2aW5nX2RpbXMoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9kcm9wX2NvbnN0cmFpbnRzX2ludm9sdmluZ19kaW1zKAorCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKKworaW50IGlzbF9iYXNpY19zZXRfaW52b2x2ZXNfZGltcyhfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworaW50IGlzbF9zZXRfaW52b2x2ZXNfZGltcyhfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CisKK3ZvaWQgaXNsX3NldF9wcmludF9pbnRlcm5hbChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwgRklMRSAqb3V0LCBpbnQgaW5kZW50KTsKK2ludCBpc2xfc2V0X3BsYWluX2lzX2VtcHR5KF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKK2ludCBpc2xfc2V0X2Zhc3RfaXNfZW1wdHkoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworaW50IGlzbF9zZXRfcGxhaW5faXNfdW5pdmVyc2UoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworaW50IGlzbF9zZXRfZmFzdF9pc191bml2ZXJzZShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CitpbnQgaXNsX3NldF9pc19wYXJhbXMoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX3NldF9pc19lbXB0eShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CitpbnQgaXNsX3NldF9pc19ib3VuZGVkKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKK19faXNsX2V4cG9ydAoraW50IGlzbF9zZXRfaXNfc3Vic2V0KF9faXNsX2tlZXAgaXNsX3NldCAqc2V0MSwgX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQyKTsKK19faXNsX2V4cG9ydAoraW50IGlzbF9zZXRfaXNfc3RyaWN0X3N1YnNldChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldDEsIF9faXNsX2tlZXAgaXNsX3NldCAqc2V0Mik7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfc2V0X2lzX2VxdWFsKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0MSwgX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQyKTsKK19faXNsX2V4cG9ydAoraW50IGlzbF9zZXRfaXNfZGlzam9pbnQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQxLCBfX2lzbF9rZWVwIGlzbF9zZXQgKnNldDIpOworaW50IGlzbF9zZXRfaXNfc2luZ2xldG9uKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKK2ludCBpc2xfc2V0X2lzX2JveChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CitpbnQgaXNsX3NldF9oYXNfZXF1YWxfc3BhY2UoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQxLCBfX2lzbF9rZWVwIGlzbF9zZXQgKnNldDIpOworCitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfc3VtKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0MSwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNldDIpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X25lZyhfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X25lZyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9tYWtlX2Rpc2pvaW50KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK3N0cnVjdCBpc2xfc2V0ICppc2xfYmFzaWNfc2V0X2NvbXB1dGVfZGl2cyhzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfY29tcHV0ZV9kaXZzKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9hbGlnbl9kaXZzKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworc3RydWN0IGlzbF9iYXNpY19zZXQgKmlzbF9zZXRfY29weV9iYXNpY19zZXQoc3RydWN0IGlzbF9zZXQgKnNldCk7CitzdHJ1Y3QgaXNsX3NldCAqaXNsX3NldF9kcm9wX2Jhc2ljX3NldChzdHJ1Y3QgaXNsX3NldCAqc2V0LAorCQkJCQkJc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQpOworCitpbnQgaXNsX2Jhc2ljX3NldF9wbGFpbl9kaW1faXNfZml4ZWQoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0LAorCXVuc2lnbmVkIGRpbSwgaXNsX2ludCAqdmFsKTsKKworaW50IGlzbF9zZXRfcGxhaW5faXNfZml4ZWQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpc2xfaW50ICp2YWwpOworaW50IGlzbF9zZXRfcGxhaW5fZGltX2lzX2ZpeGVkKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LAorCXVuc2lnbmVkIGRpbSwgaXNsX2ludCAqdmFsKTsKK2ludCBpc2xfc2V0X2Zhc3RfZGltX2lzX2ZpeGVkKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LAorCXVuc2lnbmVkIGRpbSwgaXNsX2ludCAqdmFsKTsKK2ludCBpc2xfc2V0X3BsYWluX2RpbV9oYXNfZml4ZWRfbG93ZXJfYm91bmQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJdW5zaWduZWQgZGltLCBpc2xfaW50ICp2YWwpOworaW50IGlzbF9zZXRfZGltX2lzX2JvdW5kZWQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK2ludCBpc2xfc2V0X2RpbV9oYXNfbG93ZXJfYm91bmQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK2ludCBpc2xfc2V0X2RpbV9oYXNfdXBwZXJfYm91bmQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK2ludCBpc2xfc2V0X2RpbV9oYXNfYW55X2xvd2VyX2JvdW5kKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitpbnQgaXNsX3NldF9kaW1faGFzX2FueV91cHBlcl9ib3VuZChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworCitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9naXN0KF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwkJCQkJICAgIF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqY29udGV4dCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZ2lzdF9iYXNpY19zZXQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpjb250ZXh0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2dpc3QoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpjb250ZXh0KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9naXN0X3BhcmFtcyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworaW50IGlzbF9iYXNpY19zZXRfZGltX3Jlc2lkdWVfY2xhc3Moc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQsCisJaW50IHBvcywgaXNsX2ludCAqbW9kdWxvLCBpc2xfaW50ICpyZXNpZHVlKTsKK2ludCBpc2xfc2V0X2RpbV9yZXNpZHVlX2NsYXNzKHN0cnVjdCBpc2xfc2V0ICpzZXQsCisJaW50IHBvcywgaXNsX2ludCAqbW9kdWxvLCBpc2xfaW50ICpyZXNpZHVlKTsKKworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfY29hbGVzY2UoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworCitpbnQgaXNsX3NldF9wbGFpbl9jbXAoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQxLCBfX2lzbF9rZWVwIGlzbF9zZXQgKnNldDIpOworaW50IGlzbF9zZXRfcGxhaW5faXNfZXF1YWwoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQxLCBfX2lzbF9rZWVwIGlzbF9zZXQgKnNldDIpOworaW50IGlzbF9zZXRfZmFzdF9pc19lcXVhbChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldDEsIF9faXNsX2tlZXAgaXNsX3NldCAqc2V0Mik7CitpbnQgaXNsX3NldF9wbGFpbl9pc19kaXNqb2ludChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldDEsCisJX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQyKTsKK2ludCBpc2xfc2V0X2Zhc3RfaXNfZGlzam9pbnQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQxLAorCV9faXNsX2tlZXAgaXNsX3NldCAqc2V0Mik7CisKK3VpbnQzMl90IGlzbF9zZXRfZ2V0X2hhc2goc3RydWN0IGlzbF9zZXQgKnNldCk7CisKK2ludCBpc2xfc2V0X2RpbV9pc191bmlxdWUoc3RydWN0IGlzbF9zZXQgKnNldCwgdW5zaWduZWQgZGltKTsKKworaW50IGlzbF9zZXRfbl9iYXNpY19zZXQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX3NldF9mb3JlYWNoX2Jhc2ljX3NldChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CisKK2ludCBpc2xfc2V0X2ZvcmVhY2hfcG9pbnQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX3BvaW50ICpwbnQsIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKK2ludCBpc2xfc2V0X2NvdW50KF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LCBpc2xfaW50ICpjb3VudCk7CitpbnQgaXNsX2Jhc2ljX3NldF9jb3VudF91cHRvKF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwlpc2xfaW50IG1heCwgaXNsX2ludCAqY291bnQpOworaW50IGlzbF9zZXRfY291bnRfdXB0byhfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwgaXNsX2ludCBtYXgsIGlzbF9pbnQgKmNvdW50KTsKKworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2Zyb21fcG9pbnQoX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZnJvbV9wb2ludChfX2lzbF90YWtlIGlzbF9wb2ludCAqcG50KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9ib3hfZnJvbV9wb2ludHMoCisJX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudDEsIF9faXNsX3Rha2UgaXNsX3BvaW50ICpwbnQyKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9ib3hfZnJvbV9wb2ludHMoX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudDEsCisJX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudDIpOworCitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfbGlmdChfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2xpZnQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworCitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9zZXRfbGV4X2xlX3NldChfX2lzbF90YWtlIGlzbF9zZXQgKnNldDEsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX3NldF9sZXhfbHRfc2V0KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0MSwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNldDIpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfc2V0X2xleF9nZV9zZXQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQxLAorCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0Mik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9zZXRfbGV4X2d0X3NldChfX2lzbF90YWtlIGlzbF9zZXQgKnNldDEsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQyKTsKKworaW50IGlzbF9zZXRfc2l6ZShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9hbGlnbl9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LCBfX2lzbF90YWtlIGlzbF9zcGFjZSAqbW9kZWwpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2FsaWduX3BhcmFtcyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqbW9kZWwpOworCitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9iYXNpY19zZXRfZXF1YWxpdGllc19tYXRyaXgoCisJX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0LCBlbnVtIGlzbF9kaW1fdHlwZSBjMSwKKwllbnVtIGlzbF9kaW1fdHlwZSBjMiwgZW51bSBpc2xfZGltX3R5cGUgYzMsIGVudW0gaXNsX2RpbV90eXBlIGM0KTsKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX2Jhc2ljX3NldF9pbmVxdWFsaXRpZXNfbWF0cml4KAorCV9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCwgZW51bSBpc2xfZGltX3R5cGUgYzEsCisJZW51bSBpc2xfZGltX3R5cGUgYzIsIGVudW0gaXNsX2RpbV90eXBlIGMzLCBlbnVtIGlzbF9kaW1fdHlwZSBjNCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZnJvbV9jb25zdHJhaW50X21hdHJpY2VzKAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJX19pc2xfdGFrZSBpc2xfbWF0ICplcSwgX19pc2xfdGFrZSBpc2xfbWF0ICppbmVxLCBlbnVtIGlzbF9kaW1fdHlwZSBjMSwKKwllbnVtIGlzbF9kaW1fdHlwZSBjMiwgZW51bSBpc2xfZGltX3R5cGUgYzMsIGVudW0gaXNsX2RpbV90eXBlIGM0KTsKKworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfYmFzaWNfc2V0X3JlZHVjZWRfYmFzaXMoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKKworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2NvZWZmaWNpZW50cygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfc2V0X2NvZWZmaWNpZW50cyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfc29sdXRpb25zKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9zZXRfc29sdXRpb25zKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfc2V0X2RpbV9tYXgoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsIGludCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfc2V0X2RpbV9taW4oX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsIGludCBwb3MpOworCitfX2lzbF9naXZlIGNoYXIgKmlzbF9zZXRfdG9fc3RyKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2luY2x1ZGUgPGlzbC9kaW0uaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9zZXRfdHlwZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvc2V0X3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTM0OWUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvc2V0X3R5cGUuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgSVNMX1NFVF9UWVBFX0gKKyNkZWZpbmUgSVNMX1NFVF9UWVBFX0gKKworI2luY2x1ZGUgPGlzbC9tYXBfdHlwZS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3NwYWNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9zcGFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTQxMDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9zcGFjZS5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBLYXRob2xpZWtlIFVuaXZlcnNpdGVpdCBMZXV2ZW4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgTUlUIGxpY2Vuc2UKKyAqCisgKiBXcml0dGVuIGJ5IFN2ZW4gVmVyZG9vbGFlZ2UsIEsuVS5MZXV2ZW4sIERlcGFydGVtZW50CisgKiBDb21wdXRlcndldGVuc2NoYXBwZW4sIENlbGVzdGlqbmVubGFhbiAyMDBBLCBCLTMwMDEgTGV1dmVuLCBCZWxnaXVtCisgKi8KKworI2lmbmRlZiBJU0xfU1BBQ0VfSAorI2RlZmluZSBJU0xfU1BBQ0VfSAorCisjaW5jbHVkZSA8aXNsL2N0eC5oPgorI2luY2x1ZGUgPGlzbC9pZC5oPgorI2luY2x1ZGUgPGlzbC9wcmludGVyLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGlzbF9zcGFjZTsKK3R5cGVkZWYgc3RydWN0IGlzbF9zcGFjZSBpc2xfc3BhY2U7CisKK2VudW0gaXNsX2RpbV90eXBlIHsKKwlpc2xfZGltX2NzdCwKKwlpc2xfZGltX3BhcmFtLAorCWlzbF9kaW1faW4sCisJaXNsX2RpbV9vdXQsCisJaXNsX2RpbV9zZXQgPSBpc2xfZGltX291dCwKKwlpc2xfZGltX2RpdiwKKwlpc2xfZGltX2FsbAorfTsKKworaXNsX2N0eCAqaXNsX3NwYWNlX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX2FsbG9jKGlzbF9jdHggKmN0eCwKKwkJCXVuc2lnbmVkIG5wYXJhbSwgdW5zaWduZWQgbl9pbiwgdW5zaWduZWQgbl9vdXQpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9zZXRfYWxsb2MoaXNsX2N0eCAqY3R4LAorCQkJdW5zaWduZWQgbnBhcmFtLCB1bnNpZ25lZCBkaW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9wYXJhbXNfYWxsb2MoaXNsX2N0eCAqY3R4LCB1bnNpZ25lZCBucGFyYW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9jb3B5KF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0pOwordm9pZCAqaXNsX3NwYWNlX2ZyZWUoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CisKK2ludCBpc2xfc3BhY2VfaXNfcGFyYW1zKF9faXNsX2tlZXAgaXNsX3NwYWNlICpzcGFjZSk7CitpbnQgaXNsX3NwYWNlX2lzX3NldChfX2lzbF9rZWVwIGlzbF9zcGFjZSAqc3BhY2UpOworaW50IGlzbF9zcGFjZV9pc19tYXAoX19pc2xfa2VlcCBpc2xfc3BhY2UgKnNwYWNlKTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9zZXRfdHVwbGVfbmFtZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKnMpOworaW50IGlzbF9zcGFjZV9oYXNfdHVwbGVfbmFtZShfX2lzbF9rZWVwIGlzbF9zcGFjZSAqc3BhY2UsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7Citjb25zdCBjaGFyICppc2xfc3BhY2VfZ2V0X3R1cGxlX25hbWUoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSwKKwkJCQkgZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX3NldF90dXBsZV9pZChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIF9faXNsX3Rha2UgaXNsX2lkICppZCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX3Jlc2V0X3R1cGxlX2lkKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitpbnQgaXNsX3NwYWNlX2hhc190dXBsZV9pZChfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK19faXNsX2dpdmUgaXNsX2lkICppc2xfc3BhY2VfZ2V0X3R1cGxlX2lkKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2Vfc2V0X2RpbV9pZChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgX19pc2xfdGFrZSBpc2xfaWQgKmlkKTsKK2ludCBpc2xfc3BhY2VfaGFzX2RpbV9pZChfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX3NwYWNlX2dldF9kaW1faWQoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworCitpbnQgaXNsX3NwYWNlX2ZpbmRfZGltX2J5X2lkKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0sIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsCisJX19pc2xfa2VlcCBpc2xfaWQgKmlkKTsKK2ludCBpc2xfc3BhY2VfZmluZF9kaW1fYnlfbmFtZShfX2lzbF9rZWVwIGlzbF9zcGFjZSAqc3BhY2UsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqbmFtZSk7CisKK2ludCBpc2xfc3BhY2VfaGFzX2RpbV9uYW1lKF9faXNsX2tlZXAgaXNsX3NwYWNlICpzcGFjZSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9zZXRfZGltX25hbWUoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwkJCQkgZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLAorCQkJCSBfX2lzbF9rZWVwIGNvbnN0IGNoYXIgKm5hbWUpOworX19pc2xfa2VlcCBjb25zdCBjaGFyICppc2xfc3BhY2VfZ2V0X2RpbV9uYW1lKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0sCisJCQkJIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfZXh0ZW5kKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJCQl1bnNpZ25lZCBucGFyYW0sIHVuc2lnbmVkIG5faW4sIHVuc2lnbmVkIG5fb3V0KTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfYWRkX2RpbXMoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSwKKwkJdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX21vdmVfZGltcyhfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIGRzdF90eXBlLCB1bnNpZ25lZCBkc3RfcG9zLAorCWVudW0gaXNsX2RpbV90eXBlIHNyY190eXBlLCB1bnNpZ25lZCBzcmNfcG9zLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfaW5zZXJ0X2RpbXMoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9qb2luKF9faXNsX3Rha2UgaXNsX3NwYWNlICpsZWZ0LAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpyaWdodCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX3Byb2R1Y3QoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmxlZnQsCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKnJpZ2h0KTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfZG9tYWluX3Byb2R1Y3QoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmxlZnQsCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKnJpZ2h0KTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfcmFuZ2VfcHJvZHVjdChfX2lzbF90YWtlIGlzbF9zcGFjZSAqbGVmdCwKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqcmlnaHQpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9tYXBfZnJvbV9zZXQoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX21hcF9mcm9tX2RvbWFpbl9hbmRfcmFuZ2UoCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRvbWFpbiwgX19pc2xfdGFrZSBpc2xfc3BhY2UgKnJhbmdlKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfcmV2ZXJzZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfZHJvcF9kaW1zKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG51bSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX2Ryb3BfaW5wdXRzKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJCXVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfZHJvcF9vdXRwdXRzKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJCXVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfZG9tYWluKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9mcm9tX2RvbWFpbihfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfcmFuZ2UoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX2Zyb21fcmFuZ2UoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX3BhcmFtcyhfX2lzbF90YWtlIGlzbF9zcGFjZSAqc3BhY2UpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9zZXRfZnJvbV9wYXJhbXMoX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNwYWNlKTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9hbGlnbl9wYXJhbXMoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbTEsCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbTIpOworCitpbnQgaXNsX3NwYWNlX2lzX3dyYXBwaW5nKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV93cmFwKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV91bndyYXAoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CisKK2ludCBpc2xfc3BhY2VfY2FuX3ppcChfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfemlwKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworCitpbnQgaXNsX3NwYWNlX2Nhbl9jdXJyeShfX2lzbF9rZWVwIGlzbF9zcGFjZSAqc3BhY2UpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9jdXJyeShfX2lzbF90YWtlIGlzbF9zcGFjZSAqc3BhY2UpOworCitpbnQgaXNsX3NwYWNlX2Nhbl91bmN1cnJ5KF9faXNsX2tlZXAgaXNsX3NwYWNlICpzcGFjZSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX3VuY3VycnkoX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNwYWNlKTsKKworaW50IGlzbF9zcGFjZV9pc19kb21haW4oX19pc2xfa2VlcCBpc2xfc3BhY2UgKnNwYWNlMSwKKwlfX2lzbF9rZWVwIGlzbF9zcGFjZSAqc3BhY2UyKTsKK2ludCBpc2xfc3BhY2VfaXNfcmFuZ2UoX19pc2xfa2VlcCBpc2xfc3BhY2UgKnNwYWNlMSwKKwlfX2lzbF9rZWVwIGlzbF9zcGFjZSAqc3BhY2UyKTsKK2ludCBpc2xfc3BhY2VfaXNfZXF1YWwoX19pc2xfa2VlcCBpc2xfc3BhY2UgKnNwYWNlMSwKKwlfX2lzbF9rZWVwIGlzbF9zcGFjZSAqc3BhY2UyKTsKK2ludCBpc2xfc3BhY2VfbWF0Y2goX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbTEsIGVudW0gaXNsX2RpbV90eXBlIGRpbTFfdHlwZSwKKwlfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltMiwgZW51bSBpc2xfZGltX3R5cGUgZGltMl90eXBlKTsKK2ludCBpc2xfc3BhY2VfdHVwbGVfbWF0Y2goX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbTEsIGVudW0gaXNsX2RpbV90eXBlIGRpbTFfdHlwZSwKKwkJCV9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0yLCBlbnVtIGlzbF9kaW1fdHlwZSBkaW0yX3R5cGUpOworaW50IGlzbF9zcGFjZV9jb21wYXRpYmxlKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0xLAorCV9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0yKTsKK3Vuc2lnbmVkIGlzbF9zcGFjZV9kaW0oX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X3NwYWNlKF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSk7Cit2b2lkIGlzbF9zcGFjZV9kdW1wKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0pOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3N0ZGludC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvc3RkaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZiODBkNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3N0ZGludC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfSVNMX0lOQ0xVREVfSVNMX1NURElOVF9ICisjZGVmaW5lIF9JU0xfSU5DTFVERV9JU0xfU1RESU5UX0ggMQorI2lmbmRlZiBfR0VORVJBVEVEX1NURElOVF9ICisjZGVmaW5lIF9HRU5FUkFURURfU1RESU5UX0ggImlzbCAwLjExLjEiCisvKiBnZW5lcmF0ZWQgdXNpbmcgZ251IGNvbXBpbGVyIHg4Nl82NC1saW51eC1nY2MgKEdDQykgNC44ICovCisjZGVmaW5lIF9TVERJTlRfSEFWRV9TVERJTlRfSCAxCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvc3RyZWFtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzA2YmNkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvc3RyZWFtLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEthdGhvbGlla2UgVW5pdmVyc2l0ZWl0IExldXZlbgorICoKKyAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBNSVQgbGljZW5zZQorICoKKyAqIFdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZSwgSy5VLkxldXZlbiwgRGVwYXJ0ZW1lbnQKKyAqIENvbXB1dGVyd2V0ZW5zY2hhcHBlbiwgQ2VsZXN0aWpuZW5sYWFuIDIwMEEsIEItMzAwMSBMZXV2ZW4sIEJlbGdpdW0KKyAqLworCisjaWZuZGVmIElTTF9TVFJFQU1fSAorI2RlZmluZSBJU0xfU1RSRUFNX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8aXNsL2hhc2guaD4KKyNpbmNsdWRlIDxpc2wvYWZmX3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvb2JqLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZW51bSBpc2xfdG9rZW5fdHlwZSB7IElTTF9UT0tFTl9FUlJPUiA9IC0xLAorCQkJSVNMX1RPS0VOX1VOS05PV04gPSAyNTYsIElTTF9UT0tFTl9WQUxVRSwKKwkJCUlTTF9UT0tFTl9JREVOVCwgSVNMX1RPS0VOX0dFLAorCQkJSVNMX1RPS0VOX0xFLCBJU0xfVE9LRU5fR1QsIElTTF9UT0tFTl9MVCwKKwkJCUlTTF9UT0tFTl9ORSwgSVNMX1RPS0VOX0VRX0VRLAorCQkJSVNMX1RPS0VOX0xFWF9HRSwgSVNMX1RPS0VOX0xFWF9MRSwKKwkJCUlTTF9UT0tFTl9MRVhfR1QsIElTTF9UT0tFTl9MRVhfTFQsCisJCQlJU0xfVE9LRU5fVE8sIElTTF9UT0tFTl9BTkQsCisJCQlJU0xfVE9LRU5fT1IsIElTTF9UT0tFTl9FWElTVFMsIElTTF9UT0tFTl9OT1QsCisJCQlJU0xfVE9LRU5fREVGLCBJU0xfVE9LRU5fSU5GVFksIElTTF9UT0tFTl9OQU4sCisJCQlJU0xfVE9LRU5fTUlOLCBJU0xfVE9LRU5fTUFYLCBJU0xfVE9LRU5fUkFULAorCQkJSVNMX1RPS0VOX1RSVUUsIElTTF9UT0tFTl9GQUxTRSwKKwkJCUlTTF9UT0tFTl9DRUlMRCwgSVNMX1RPS0VOX0ZMT09SRCwgSVNMX1RPS0VOX01PRCwKKwkJCUlTTF9UT0tFTl9TVFJJTkcsCisJCQlJU0xfVE9LRU5fTUFQLCBJU0xfVE9LRU5fQUZGLAorCQkJSVNMX1RPS0VOX0xBU1QgfTsKKworc3RydWN0IGlzbF90b2tlbiB7CisJaW50IHR5cGU7CisKKwl1bnNpZ25lZCBpbnQgb25fbmV3X2xpbmUgOiAxOworCXVuc2lnbmVkIGlzX2tleXdvcmQgOiAxOworCWludCBsaW5lOworCWludCBjb2w7CisKKwl1bmlvbiB7CisJCWlzbF9pbnQJdjsKKwkJY2hhcgkqczsKKwkJaXNsX21hcCAqbWFwOworCQlpc2xfcHdfYWZmICpwd2FmZjsKKwl9IHU7Cit9OworCit2b2lkIGlzbF90b2tlbl9mcmVlKHN0cnVjdCBpc2xfdG9rZW4gKnRvayk7CisKK3N0cnVjdCBpc2xfc3RyZWFtIHsKKwlzdHJ1Y3QgaXNsX2N0eAkqY3R4OworCUZJTEUgICAgICAgIAkqZmlsZTsKKwljb25zdCBjaGFyICAJKnN0cjsKKwlpbnQJICAgIAlsaW5lOworCWludAkgICAgCWNvbDsKKwlpbnQJICAgIAllb2Y7CisKKwljaGFyCSAgICAJKmJ1ZmZlcjsKKwlzaXplX3QJICAgIAlzaXplOworCXNpemVfdAkgICAgCWxlbjsKKwlpbnQJICAgIAljOworCWludAkJdW5bNV07CisJaW50CQluX3VuOworCisJc3RydWN0IGlzbF90b2tlbgkqdG9rZW5zWzVdOworCWludAkgICAgCW5fdG9rZW47CisKKwlzdHJ1Y3QgaXNsX2hhc2hfdGFibGUJKmtleXdvcmRzOworCWVudW0gaXNsX3Rva2VuX3R5cGUJIG5leHRfdHlwZTsKK307CisKK3N0cnVjdCBpc2xfc3RyZWFtKiBpc2xfc3RyZWFtX25ld19maWxlKHN0cnVjdCBpc2xfY3R4ICpjdHgsIEZJTEUgKmZpbGUpOworc3RydWN0IGlzbF9zdHJlYW0qIGlzbF9zdHJlYW1fbmV3X3N0cihzdHJ1Y3QgaXNsX2N0eCAqY3R4LCBjb25zdCBjaGFyICpzdHIpOwordm9pZCBpc2xfc3RyZWFtX2ZyZWUoc3RydWN0IGlzbF9zdHJlYW0gKnMpOworCit2b2lkIGlzbF9zdHJlYW1fZXJyb3Ioc3RydWN0IGlzbF9zdHJlYW0gKnMsIHN0cnVjdCBpc2xfdG9rZW4gKnRvaywgY2hhciAqbXNnKTsKKworc3RydWN0IGlzbF90b2tlbiAqaXNsX3N0cmVhbV9uZXh0X3Rva2VuKHN0cnVjdCBpc2xfc3RyZWFtICpzKTsKK3N0cnVjdCBpc2xfdG9rZW4gKmlzbF9zdHJlYW1fbmV4dF90b2tlbl9vbl9zYW1lX2xpbmUoc3RydWN0IGlzbF9zdHJlYW0gKnMpOworaW50IGlzbF9zdHJlYW1fbmV4dF90b2tlbl9pcyhzdHJ1Y3QgaXNsX3N0cmVhbSAqcywgaW50IHR5cGUpOwordm9pZCBpc2xfc3RyZWFtX3B1c2hfdG9rZW4oc3RydWN0IGlzbF9zdHJlYW0gKnMsIHN0cnVjdCBpc2xfdG9rZW4gKnRvayk7Cit2b2lkIGlzbF9zdHJlYW1fZmx1c2hfdG9rZW5zKHN0cnVjdCBpc2xfc3RyZWFtICpzKTsKK2ludCBpc2xfc3RyZWFtX2VhdF9pZl9hdmFpbGFibGUoc3RydWN0IGlzbF9zdHJlYW0gKnMsIGludCB0eXBlKTsKK2NoYXIgKmlzbF9zdHJlYW1fcmVhZF9pZGVudF9pZl9hdmFpbGFibGUoc3RydWN0IGlzbF9zdHJlYW0gKnMpOworaW50IGlzbF9zdHJlYW1fZWF0KHN0cnVjdCBpc2xfc3RyZWFtICpzLCBpbnQgdHlwZSk7CitpbnQgaXNsX3N0cmVhbV9pc19lbXB0eShzdHJ1Y3QgaXNsX3N0cmVhbSAqcyk7CitpbnQgaXNsX3N0cmVhbV9za2lwX2xpbmUoc3RydWN0IGlzbF9zdHJlYW0gKnMpOworCitlbnVtIGlzbF90b2tlbl90eXBlIGlzbF9zdHJlYW1fcmVnaXN0ZXJfa2V5d29yZChzdHJ1Y3QgaXNsX3N0cmVhbSAqcywKKwljb25zdCBjaGFyICpuYW1lKTsKKworc3RydWN0IGlzbF9vYmogaXNsX3N0cmVhbV9yZWFkX29iaihzdHJ1Y3QgaXNsX3N0cmVhbSAqcyk7CitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9zdHJlYW1fcmVhZF9tdWx0aV9hZmYoc3RydWN0IGlzbF9zdHJlYW0gKnMpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfc3RyZWFtX3JlYWRfbWFwKHN0cnVjdCBpc2xfc3RyZWFtICpzKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3N0cmVhbV9yZWFkX3NldChzdHJ1Y3QgaXNsX3N0cmVhbSAqcyk7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3N0cmVhbV9yZWFkX3B3X3Fwb2x5bm9taWFsKAorCXN0cnVjdCBpc2xfc3RyZWFtICpzKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3N0cmVhbV9yZWFkX3VuaW9uX21hcChzdHJ1Y3QgaXNsX3N0cmVhbSAqcyk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvdW5pb25fbWFwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC91bmlvbl9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWI3YjJmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvdW5pb25fbWFwLmgKQEAgLTAsMCArMSwyMDIgQEAKKyNpZm5kZWYgSVNMX1VOSU9OX01BUF9ICisjZGVmaW5lIElTTF9VTklPTl9NQVBfSAorCisjaW5jbHVkZSA8aXNsL3NwYWNlLmg+CisjaW5jbHVkZSA8aXNsL21hcF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3VuaW9uX21hcF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3ByaW50ZXIuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitfX2lzbF9jb25zdHJ1Y3RvcgorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2Zyb21fYmFzaWNfbWFwKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9jb25zdHJ1Y3RvcgorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2Zyb21fbWFwKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9lbXB0eShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9jb3B5KF9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcCk7Cit2b2lkICppc2xfdW5pb25fbWFwX2ZyZWUoX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKKworaXNsX2N0eCAqaXNsX3VuaW9uX21hcF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3VuaW9uX21hcF9nZXRfc3BhY2UoX19pc2xfa2VlcCBpc2xfdW5pb25fbWFwICp1bWFwKTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX3VuaXZlcnNlKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF91bmlvbl9tYXBfcGFyYW1zKF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9tYXBfZG9tYWluKF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9tYXBfcmFuZ2UoX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9kb21haW5fbWFwKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfcmFuZ2VfbWFwKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfZnJvbV9kb21haW4oCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9mcm9tX3JhbmdlKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CisKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2FmZmluZV9odWxsKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9wb2x5aGVkcmFsX2h1bGwoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9zaW1wbGVfaHVsbCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfY29hbGVzY2UoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9jb21wdXRlX2RpdnMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2xleG1pbihfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfbGV4bWF4KF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9hZGRfbWFwKF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCwKKwlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF91bmlvbihfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAxLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfc3VidHJhY3QoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMSwgX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9pbnRlcnNlY3QoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMSwgX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9pbnRlcnNlY3RfcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCwgX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX3Byb2R1Y3QoX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMSwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAyKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9kb21haW5fcHJvZHVjdCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAxLCBfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAyKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9yYW5nZV9wcm9kdWN0KAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDEsIF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDIpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2ZsYXRfcmFuZ2VfcHJvZHVjdCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAxLCBfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2dpc3QoX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqY29udGV4dCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9naXN0X3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAsIF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2dpc3RfZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCwgX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2dpc3RfcmFuZ2UoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwLCBfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworCitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9pbnRlcnNlY3RfZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCwgX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2ludGVyc2VjdF9yYW5nZSgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAsIF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CisKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX3N1YnRyYWN0X2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAsIF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqZG9tKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX3N1YnRyYWN0X3JhbmdlKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCwgX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICpkb20pOworCitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9hcHBseV9kb21haW4oCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMSwgX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9hcHBseV9yYW5nZSgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAxLCBfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX3JldmVyc2UoX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9mcm9tX2RvbWFpbl9hbmRfcmFuZ2UoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICpkb21haW4sIF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqcmFuZ2UpOworCitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9kZXRlY3RfZXF1YWxpdGllcygKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9tYXBfZGVsdGFzKF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfZGVsdGFzX21hcCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9zZXRfaWRlbnRpdHkoX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKKworX19pc2xfZXhwb3J0CitpbnQgaXNsX3VuaW9uX21hcF9pc19lbXB0eShfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZXhwb3J0CitpbnQgaXNsX3VuaW9uX21hcF9pc19zaW5nbGVfdmFsdWVkKF9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitpbnQgaXNsX3VuaW9uX21hcF9wbGFpbl9pc19pbmplY3RpdmUoX19pc2xfa2VlcCBpc2xfdW5pb25fbWFwICp1bWFwKTsKK19faXNsX2V4cG9ydAoraW50IGlzbF91bmlvbl9tYXBfaXNfaW5qZWN0aXZlKF9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfdW5pb25fbWFwX2lzX2JpamVjdGl2ZShfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXApOworCitfX2lzbF9leHBvcnQKK2ludCBpc2xfdW5pb25fbWFwX2lzX3N1YnNldChfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXAxLAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcDIpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX3VuaW9uX21hcF9pc19lcXVhbChfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXAxLAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcDIpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX3VuaW9uX21hcF9pc19zdHJpY3Rfc3Vic2V0KF9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcDEsCisJX19pc2xfa2VlcCBpc2xfdW5pb25fbWFwICp1bWFwMik7CisKK2ludCBpc2xfdW5pb25fbWFwX25fbWFwKF9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfdW5pb25fbWFwX2ZvcmVhY2hfbWFwKF9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcCwKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKK19faXNsX2dpdmUgaW50IGlzbF91bmlvbl9tYXBfY29udGFpbnMoX19pc2xfa2VlcCBpc2xfdW5pb25fbWFwICp1bWFwLAorCV9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfdW5pb25fbWFwX2V4dHJhY3RfbWFwKF9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcCwKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9mcm9tX3VuaW9uX21hcChfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworCitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF91bmlvbl9tYXBfc2FtcGxlKF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9maXhlZF9wb3dlcigKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAsIGlzbF9pbnQgZXhwKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9wb3dlcihfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAsCisJaW50ICpleGFjdCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfdHJhbnNpdGl2ZV9jbG9zdXJlKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCwgaW50ICpleGFjdCk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9sZXhfbHRfdW5pb25fbWFwKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDEsIF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDIpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2xleF9sZV91bmlvbl9tYXAoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMSwgX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMik7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfbGV4X2d0X3VuaW9uX21hcCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAxLCBfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAyKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9sZXhfZ2VfdW5pb25fbWFwKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDEsIF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDIpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfcmVhZF9mcm9tX2ZpbGUoaXNsX2N0eCAqY3R4LAorCUZJTEUgKmlucHV0KTsKK19faXNsX2NvbnN0cnVjdG9yCitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfcmVhZF9mcm9tX3N0cihpc2xfY3R4ICpjdHgsCisJY29uc3QgY2hhciAqc3RyKTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X3VuaW9uX21hcChfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcCk7Cit2b2lkIGlzbF91bmlvbl9tYXBfZHVtcChfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXApOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9tYXBfd3JhcChfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fc2V0X3Vud3JhcChfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfemlwKF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfY3VycnkoX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF91bmN1cnJ5KF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9hbGlnbl9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwLCBfX2lzbF90YWtlIGlzbF9zcGFjZSAqbW9kZWwpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2FsaWduX3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQsIF9faXNsX3Rha2UgaXNsX3NwYWNlICptb2RlbCk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNpbmNsdWRlIDxpc2wvZGltLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvdW5pb25fbWFwX3R5cGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3VuaW9uX21hcF90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzZjJjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3VuaW9uX21hcF90eXBlLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBJU0xfVU5JT05fTUFQX1RZUEVfSAorI2RlZmluZSBJU0xfVU5JT05fTUFQX1RZUEVfSAorCisjaW5jbHVkZSA8aXNsL2N0eC5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBfX2lzbF9leHBvcnQgaXNsX3VuaW9uX21hcDsKK3R5cGVkZWYgc3RydWN0IGlzbF91bmlvbl9tYXAgaXNsX3VuaW9uX21hcDsKKyNpZm5kZWYgaXNsX3VuaW9uX3NldAorc3RydWN0IF9faXNsX2V4cG9ydCBpc2xfdW5pb25fc2V0OwordHlwZWRlZiBzdHJ1Y3QgaXNsX3VuaW9uX3NldCBpc2xfdW5pb25fc2V0OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvdW5pb25fc2V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC91bmlvbl9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTg1OTc3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvdW5pb25fc2V0LmgKQEAgLTAsMCArMSwxMzMgQEAKKyNpZm5kZWYgSVNMX1VOSU9OX1NFVF9ICisjZGVmaW5lIElTTF9VTklPTl9TRVRfSAorCisjaW5jbHVkZSA8aXNsL3BvaW50Lmg+CisjaW5jbHVkZSA8aXNsL3VuaW9uX21hcC5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK19faXNsX2NvbnN0cnVjdG9yCitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfZnJvbV9iYXNpY19zZXQoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2NvbnN0cnVjdG9yCitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfZnJvbV9zZXQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2VtcHR5KF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2NvcHkoX19pc2xfa2VlcCBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK3ZvaWQgKmlzbF91bmlvbl9zZXRfZnJlZShfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworCitpc2xfY3R4ICppc2xfdW5pb25fc2V0X2dldF9jdHgoX19pc2xfa2VlcCBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfdW5pb25fc2V0X2dldF9zcGFjZShfX2lzbF9rZWVwIGlzbF91bmlvbl9zZXQgKnVzZXQpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfdW5pdmVyc2UoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3VuaW9uX3NldF9wYXJhbXMoX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKKworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfZGV0ZWN0X2VxdWFsaXRpZXMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2FmZmluZV9odWxsKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9wb2x5aGVkcmFsX2h1bGwoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9zaW1wbGVfaHVsbCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfY29hbGVzY2UoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9jb21wdXRlX2RpdnMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2xleG1pbihfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfbGV4bWF4KF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9hZGRfc2V0KF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfdW5pb24oX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0MSwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X3N1YnRyYWN0KAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldDEsIF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfaW50ZXJzZWN0KAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldDEsIF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfaW50ZXJzZWN0X3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQsIF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9wcm9kdWN0KF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldDEsCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0Mik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9naXN0KF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKmNvbnRleHQpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfZ2lzdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0LCBfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2FwcGx5KAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCwgX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKKworaW50IGlzbF91bmlvbl9zZXRfaXNfcGFyYW1zKF9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfdW5pb25fc2V0X2lzX2VtcHR5KF9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldCk7CisKK19faXNsX2V4cG9ydAoraW50IGlzbF91bmlvbl9zZXRfaXNfc3Vic2V0KF9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldDEsCisJX19pc2xfa2VlcCBpc2xfdW5pb25fc2V0ICp1c2V0Mik7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfdW5pb25fc2V0X2lzX2VxdWFsKF9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldDEsCisJX19pc2xfa2VlcCBpc2xfdW5pb25fc2V0ICp1c2V0Mik7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfdW5pb25fc2V0X2lzX3N0cmljdF9zdWJzZXQoX19pc2xfa2VlcCBpc2xfdW5pb25fc2V0ICp1c2V0MSwKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9zZXQgKnVzZXQyKTsKKworaW50IGlzbF91bmlvbl9zZXRfbl9zZXQoX19pc2xfa2VlcCBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK19faXNsX2V4cG9ydAoraW50IGlzbF91bmlvbl9zZXRfZm9yZWFjaF9zZXQoX19pc2xfa2VlcCBpc2xfdW5pb25fc2V0ICp1c2V0LAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworX19pc2xfZ2l2ZSBpbnQgaXNsX3VuaW9uX3NldF9jb250YWlucyhfX2lzbF9rZWVwIGlzbF91bmlvbl9zZXQgKnVzZXQsCisJX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF91bmlvbl9zZXRfZXh0cmFjdF9zZXQoX19pc2xfa2VlcCBpc2xfdW5pb25fc2V0ICp1c2V0LAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2Zyb21fdW5pb25fc2V0KF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CitpbnQgaXNsX3VuaW9uX3NldF9mb3JlYWNoX3BvaW50KF9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldCwKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudCwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworCitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF91bmlvbl9zZXRfc2FtcGxlKF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9saWZ0KF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX3NldF9sZXhfbHRfdW5pb25fc2V0KAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldDEsIF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldDIpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fc2V0X2xleF9sZV91bmlvbl9zZXQoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0MSwgX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0Mik7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9zZXRfbGV4X2d0X3VuaW9uX3NldCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQxLCBfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQyKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX3NldF9sZXhfZ2VfdW5pb25fc2V0KAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldDEsIF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldDIpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfY29lZmZpY2llbnRzKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqYnNldCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfc29sdXRpb25zKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqYnNldCk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9yZWFkX2Zyb21fZmlsZShpc2xfY3R4ICpjdHgsCisJRklMRSAqaW5wdXQpOworX19pc2xfY29uc3RydWN0b3IKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9yZWFkX2Zyb21fc3RyKGlzbF9jdHggKmN0eCwKKwljb25zdCBjaGFyICpzdHIpOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfdW5pb25fc2V0KF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJX19pc2xfa2VlcCBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK3ZvaWQgaXNsX3VuaW9uX3NldF9kdW1wKF9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldCk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNpbmNsdWRlIDxpc2wvZGltLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvdW5pb25fc2V0X3R5cGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3VuaW9uX3NldF90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiMmMzMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3VuaW9uX3NldF90eXBlLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIElTTF9VTklPTl9TRVRfVFlQRV9ICisjZGVmaW5lIElTTF9VTklPTl9TRVRfVFlQRV9ICisKKyNpbmNsdWRlIDxpc2wvdW5pb25fbWFwX3R5cGUuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC92ZWMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3ZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMjI5OTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL2lzbC92ZWMuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBLYXRob2xpZWtlIFVuaXZlcnNpdGVpdCBMZXV2ZW4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgTUlUIGxpY2Vuc2UKKyAqCisgKiBXcml0dGVuIGJ5IFN2ZW4gVmVyZG9vbGFlZ2UsIEsuVS5MZXV2ZW4sIERlcGFydGVtZW50CisgKiBDb21wdXRlcndldGVuc2NoYXBwZW4sIENlbGVzdGlqbmVubGFhbiAyMDBBLCBCLTMwMDEgTGV1dmVuLCBCZWxnaXVtCisgKi8KKworI2lmbmRlZiBJU0xfVkVDX0gKKyNkZWZpbmUgSVNMX1ZFQ19ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8aXNsL2ludC5oPgorI2luY2x1ZGUgPGlzbC9jdHguaD4KKyNpbmNsdWRlIDxpc2wvYmxrLmg+CisjaW5jbHVkZSA8aXNsL3ByaW50ZXIuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaXNsX3ZlYyB7CisJaW50IHJlZjsKKworCXN0cnVjdCBpc2xfY3R4ICpjdHg7CisKKwl1bnNpZ25lZCBzaXplOworCWlzbF9pbnQgKmVsOworCisJc3RydWN0IGlzbF9ibGsgYmxvY2s7Cit9OwordHlwZWRlZiBzdHJ1Y3QgaXNsX3ZlYyBpc2xfdmVjOworCitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfYWxsb2MoaXNsX2N0eCAqY3R4LCB1bnNpZ25lZCBzaXplKTsKK19faXNsX2dpdmUgaXNsX3ZlYyAqaXNsX3ZlY19jb3B5KF9faXNsX2tlZXAgaXNsX3ZlYyAqdmVjKTsKK3N0cnVjdCBpc2xfdmVjICppc2xfdmVjX2NvdyhzdHJ1Y3QgaXNsX3ZlYyAqdmVjKTsKK3ZvaWQgKmlzbF92ZWNfZnJlZShfX2lzbF90YWtlIGlzbF92ZWMgKnZlYyk7CisKK2lzbF9jdHggKmlzbF92ZWNfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF92ZWMgKnZlYyk7CisKK2ludCBpc2xfdmVjX3NpemUoX19pc2xfa2VlcCBpc2xfdmVjICp2ZWMpOworaW50IGlzbF92ZWNfZ2V0X2VsZW1lbnQoX19pc2xfa2VlcCBpc2xfdmVjICp2ZWMsIGludCBwb3MsIGlzbF9pbnQgKnYpOworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfdmVjX3NldF9lbGVtZW50KF9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjLAorCWludCBwb3MsIGlzbF9pbnQgdik7CitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfc2V0X2VsZW1lbnRfc2koX19pc2xfdGFrZSBpc2xfdmVjICp2ZWMsCisJaW50IHBvcywgaW50IHYpOworCitpbnQgaXNsX3ZlY19pc19lcXVhbChfX2lzbF9rZWVwIGlzbF92ZWMgKnZlYzEsIF9faXNsX2tlZXAgaXNsX3ZlYyAqdmVjMik7CisKK3ZvaWQgaXNsX3ZlY19kdW1wKF9faXNsX2tlZXAgaXNsX3ZlYyAqdmVjKTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X3ZlYyhfX2lzbF90YWtlIGlzbF9wcmludGVyICpwcmludGVyLAorCV9faXNsX2tlZXAgaXNsX3ZlYyAqdmVjKTsKKwordm9pZCBpc2xfdmVjX2xjbShzdHJ1Y3QgaXNsX3ZlYyAqdmVjLCBpc2xfaW50ICpsY20pOworc3RydWN0IGlzbF92ZWMgKmlzbF92ZWNfY2VpbChzdHJ1Y3QgaXNsX3ZlYyAqdmVjKTsKK3N0cnVjdCBpc2xfdmVjICppc2xfdmVjX25vcm1hbGl6ZShzdHJ1Y3QgaXNsX3ZlYyAqdmVjKTsKK19faXNsX2dpdmUgaXNsX3ZlYyAqaXNsX3ZlY19zZXQoX19pc2xfdGFrZSBpc2xfdmVjICp2ZWMsIGlzbF9pbnQgdik7CitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfc2V0X3NpKF9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjLCBpbnQgdik7CitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfY2xyKF9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjKTsKK19faXNsX2dpdmUgaXNsX3ZlYyAqaXNsX3ZlY19uZWcoX19pc2xfdGFrZSBpc2xfdmVjICp2ZWMpOworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfdmVjX3NjYWxlKF9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjLCBpc2xfaW50IG0pOworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfdmVjX2ZkaXZfcihfX2lzbF90YWtlIGlzbF92ZWMgKnZlYywgaXNsX2ludCBtKTsKK19faXNsX2dpdmUgaXNsX3ZlYyAqaXNsX3ZlY19hZGQoX19pc2xfdGFrZSBpc2xfdmVjICp2ZWMxLAorCV9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjMik7CitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfZXh0ZW5kKF9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjLCB1bnNpZ25lZCBzaXplKTsKK19faXNsX2dpdmUgaXNsX3ZlYyAqaXNsX3ZlY196ZXJvX2V4dGVuZChfX2lzbF90YWtlIGlzbF92ZWMgKnZlYywgdW5zaWduZWQgc2l6ZSk7CitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfY29uY2F0KF9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjMSwKKwlfX2lzbF90YWtlIGlzbF92ZWMgKnZlYzIpOworCitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfc29ydChfX2lzbF90YWtlIGlzbF92ZWMgKnZlYyk7CisKK19faXNsX2dpdmUgaXNsX3ZlYyAqaXNsX3ZlY19yZWFkX2Zyb21fZmlsZShpc2xfY3R4ICpjdHgsIEZJTEUgKmlucHV0KTsKKworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfdmVjX2Ryb3BfZWxzKF9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjLAorCXVuc2lnbmVkIHBvcywgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfaW5zZXJ0X2VscyhfX2lzbF90YWtlIGlzbF92ZWMgKnZlYywKKwl1bnNpZ25lZCBwb3MsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfdmVjX2luc2VydF96ZXJvX2VscyhfX2lzbF90YWtlIGlzbF92ZWMgKnZlYywKKwl1bnNpZ25lZCBwb3MsIHVuc2lnbmVkIG4pOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3ZlcnNpb24uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjhmMjNkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvdmVyc2lvbi5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgSVNMX1ZFUlNJT05fSAorI2RlZmluZSBJU0xfVkVSU0lPTl9ICisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworY29uc3QgY2hhciAqaXNsX3ZlcnNpb24odm9pZCk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZS9pc2wvdmVydGljZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3ZlcnRpY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4NDYwZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvaXNsL3ZlcnRpY2VzLmgKQEAgLTAsMCArMSw0NiBAQAorI2lmbmRlZiBJU0xfVkVSVElDRVNfSAorI2RlZmluZSBJU0xfVkVSVElDRVNfSAorCisjaW5jbHVkZSA8aXNsL3NldF90eXBlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGlzbF9leHRlcm5hbF92ZXJ0ZXg7Cit0eXBlZGVmIHN0cnVjdCBpc2xfZXh0ZXJuYWxfdmVydGV4CWlzbF92ZXJ0ZXg7CisKK3N0cnVjdCBpc2xfY2VsbDsKK3R5cGVkZWYgc3RydWN0IGlzbF9jZWxsCQlpc2xfY2VsbDsKKworc3RydWN0IGlzbF92ZXJ0aWNlczsKK3R5cGVkZWYgc3RydWN0IGlzbF92ZXJ0aWNlcwlpc2xfdmVydGljZXM7CisKK2lzbF9jdHggKmlzbF92ZXJ0ZXhfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF92ZXJ0ZXggKnZlcnRleCk7CitpbnQgaXNsX3ZlcnRleF9nZXRfaWQoX19pc2xfa2VlcCBpc2xfdmVydGV4ICp2ZXJ0ZXgpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfdmVydGV4X2dldF9kb21haW4oX19pc2xfa2VlcCBpc2xfdmVydGV4ICp2ZXJ0ZXgpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfdmVydGV4X2dldF9leHByKF9faXNsX2tlZXAgaXNsX3ZlcnRleCAqdmVydGV4KTsKK3ZvaWQgaXNsX3ZlcnRleF9mcmVlKF9faXNsX3Rha2UgaXNsX3ZlcnRleCAqdmVydGV4KTsKKworX19pc2xfZ2l2ZSBpc2xfdmVydGljZXMgKmlzbF9iYXNpY19zZXRfY29tcHV0ZV92ZXJ0aWNlcygKKwlfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOworaXNsX2N0eCAqaXNsX3ZlcnRpY2VzX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfdmVydGljZXMgKnZlcnRpY2VzKTsKK2ludCBpc2xfdmVydGljZXNfZ2V0X25fdmVydGljZXMoX19pc2xfa2VlcCBpc2xfdmVydGljZXMgKnZlcnRpY2VzKTsKK2ludCBpc2xfdmVydGljZXNfZm9yZWFjaF92ZXJ0ZXgoX19pc2xfa2VlcCBpc2xfdmVydGljZXMgKnZlcnRpY2VzLAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF92ZXJ0ZXggKnZlcnRleCwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOwordm9pZCBpc2xfdmVydGljZXNfZnJlZShfX2lzbF90YWtlIGlzbF92ZXJ0aWNlcyAqdmVydGljZXMpOworCitpc2xfY3R4ICppc2xfY2VsbF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX2NlbGwgKmNlbGwpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfY2VsbF9nZXRfZG9tYWluKF9faXNsX2tlZXAgaXNsX2NlbGwgKmNlbGwpOworaW50IGlzbF9jZWxsX2ZvcmVhY2hfdmVydGV4KF9faXNsX2tlZXAgaXNsX2NlbGwgKmNlbGwsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX3ZlcnRleCAqdmVydGV4LCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7Cit2b2lkIGlzbF9jZWxsX2ZyZWUoX19pc2xfdGFrZSBpc2xfY2VsbCAqY2VsbCk7CisKK2ludCBpc2xfdmVydGljZXNfZm9yZWFjaF9jZWxsKF9faXNsX2tlZXAgaXNsX3ZlcnRpY2VzICp2ZXJ0aWNlcywKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfY2VsbCAqY2VsbCwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvbXBjLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL21wYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzE5NDMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL21wYy5oCkBAIC0wLDAgKzEsMjY5IEBACisvKiBtcGMuaCAtLSBJbmNsdWRlIGZpbGUgZm9yIG1wYy4KKworQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIElOUklBCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBNUEMuCisKK0dOVSBNUEMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIE1QQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKK0ZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCittb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8gLgorKi8KKworI2lmbmRlZiBfX01QQ19ICisjZGVmaW5lIF9fTVBDX0gKKworI2luY2x1ZGUgImdtcC5oIgorI2luY2x1ZGUgIm1wZnIuaCIKKworLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBtcGZyPDMuMC4wICovCisjaWZuZGVmIG1wZnJfZXhwX3QKKyNkZWZpbmUgbXBmcl9leHBfdCBtcF9leHBfdAorI2VuZGlmCisKKy8qIERlZmluZSBNUEMgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgTVBDX1ZFUlNJT05fTUFKT1IgMQorI2RlZmluZSBNUENfVkVSU0lPTl9NSU5PUiAwCisjZGVmaW5lIE1QQ19WRVJTSU9OX1BBVENITEVWRUwgMQorI2RlZmluZSBNUENfVkVSU0lPTl9TVFJJTkcgIjEuMC4xIgorCisvKiBNYWNyb3MgZGVhbGluZyB3aXRoIE1QQyBWRVJTSU9OICovCisjZGVmaW5lIE1QQ19WRVJTSU9OX05VTShhLGIsYykgKCgoYSkgPDwgMTZMKSB8ICgoYikgPDwgOCkgfCAoYykpCisjZGVmaW5lIE1QQ19WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1QQ19WRVJTSU9OX05VTShNUENfVkVSU0lPTl9NQUpPUixNUENfVkVSU0lPTl9NSU5PUixNUENfVkVSU0lPTl9QQVRDSExFVkVMKQorCisvKiBDaGVjayBpZiBzdGRpbnQuaC9pbnR0eXBlcy5oIGlzIGluY2x1ZGVkICovCisjaWYgZGVmaW5lZCAoSU5UTUFYX0MpICYmIGRlZmluZWQgKFVJTlRNQVhfQykKKyNkZWZpbmUgX01QQ19IX0hBVkVfSU5UTUFYX1QgMQorI2VuZGlmCisKKy8qIFJldHVybiB2YWx1ZXMgKi8KKworLyogVHJhbnNmb3JtIG5lZ2F0aXZlIHRvIDIsIHBvc2l0aXZlIHRvIDEsIGxlYXZlIDAgdW5jaGFuZ2VkICovCisjZGVmaW5lIE1QQ19JTkVYX1BPUyhpbmV4KSAoKChpbmV4KSA8IDApID8gMiA6ICgoaW5leCkgPT0gMCkgPyAwIDogMSkKKy8qIFRyYW5zZm9ybSAyIHRvIG5lZ2F0aXZlLCAxIHRvIHBvc2l0aXZlLCBsZWF2ZSAwIHVuY2hhbmdlZCAqLworI2RlZmluZSBNUENfSU5FWF9ORUcoaW5leCkgKCgoaW5leCkgPT0gMikgPyAtMSA6ICgoaW5leCkgPT0gMCkgPyAwIDogMSkKKworLyogVGhlIGdsb2JhbCBpbmV4YWN0IGZsYWcgaXMgbWFkZSBvZiAocmVhbCBmbGFnKSArIDQgKiAoaW1hZ2luYXJ5IGZsYWcpLCB3aGVyZQorICAgZWFjaCBvZiB0aGUgcmVhbCBhbmQgaW1hZ2luYXJ5IGluZXhhY3QgZmxhZyBhcmU6CisgICAwIHdoZW4gdGhlIHJlc3VsdCBpcyBleGFjdCAobm8gcm91bmRpbmcgZXJyb3IpCisgICAxIHdoZW4gdGhlIHJlc3VsdCBpcyBsYXJnZXIgdGhhbiB0aGUgZXhhY3QgdmFsdWUKKyAgIDIgd2hlbiB0aGUgcmVzdWx0IGlzIHNtYWxsZXIgdGhhbiB0aGUgZXhhY3QgdmFsdWUgKi8KKyNkZWZpbmUgTVBDX0lORVgoaW5leF9yZSwgaW5leF9pbSkgXAorICAgICAgICAoTVBDX0lORVhfUE9TKGluZXhfcmUpIHwgKE1QQ19JTkVYX1BPUyhpbmV4X2ltKSA8PCAyKSkKKyNkZWZpbmUgTVBDX0lORVhfUkUoaW5leCkgTVBDX0lORVhfTkVHKChpbmV4KSAmIDMpCisjZGVmaW5lIE1QQ19JTkVYX0lNKGluZXgpIE1QQ19JTkVYX05FRygoaW5leCkgPj4gMikKKworLyogRm9yIGZ1bmN0aW9ucyBjb21wdXRpbmcgdHdvIHJlc3VsdHMsIHRoZSByZXR1cm4gdmFsdWUgaXMKKyAgIGluZXhhY3QxKzE2KmluZXhhY3QyLCB3aGljaCBpcyAwIGlpZiBib3RoIHJlc3VsdHMgYXJlIGV4YWN0LiAqLworI2RlZmluZSBNUENfSU5FWDEyKGluZXgxLCBpbmV4MikgKGluZXgxIHwgKGluZXgyIDw8IDQpKQorI2RlZmluZSBNUENfSU5FWDEoaW5leCkgKGluZXggJiAxNSkKKyNkZWZpbmUgTVBDX0lORVgyKGluZXgpIChpbmV4ID4+IDQpCisKKy8qIERlZmluaXRpb24gb2Ygcm91bmRpbmcgbW9kZXMgKi8KKworLyogYSBjb21wbGV4IHJvdW5kaW5nIG1vZGUgaXMganVzdCBhIHBhaXIgb2YgdHdvIHJlYWwgcm91bmRpbmcgbW9kZXMKKyAgIHdlIHJlc2VydmUgZm91ciBiaXRzIGZvciBhIHJlYWwgcm91bmRpbmcgbW9kZS4gICovCit0eXBlZGVmIGludCBtcGNfcm5kX3Q7CisKKyNkZWZpbmUgTVBDX1JORChyMSxyMikgKCgoaW50KShyMSkpICsgKChpbnQpKHIyKSA8PCA0KSkKKyNkZWZpbmUgTVBDX1JORF9SRSh4KSAoKG1wZnJfcm5kX3QpKCh4KSAmIDB4MEYpKQorI2RlZmluZSBNUENfUk5EX0lNKHgpICgobXBmcl9ybmRfdCkoKHgpID4+IDQpKQorCisjZGVmaW5lIE1QQ19STkROTiBNUENfUk5EIChHTVBfUk5ETixHTVBfUk5ETikKKyNkZWZpbmUgTVBDX1JORE5aIE1QQ19STkQgKEdNUF9STkROLEdNUF9STkRaKQorI2RlZmluZSBNUENfUk5ETlUgTVBDX1JORCAoR01QX1JORE4sR01QX1JORFUpCisjZGVmaW5lIE1QQ19STkRORCBNUENfUk5EIChHTVBfUk5ETixHTVBfUk5ERCkKKworI2RlZmluZSBNUENfUk5EWk4gTVBDX1JORCAoR01QX1JORFosR01QX1JORE4pCisjZGVmaW5lIE1QQ19STkRaWiBNUENfUk5EIChHTVBfUk5EWixHTVBfUk5EWikKKyNkZWZpbmUgTVBDX1JORFpVIE1QQ19STkQgKEdNUF9STkRaLEdNUF9STkRVKQorI2RlZmluZSBNUENfUk5EWkQgTVBDX1JORCAoR01QX1JORFosR01QX1JOREQpCisKKyNkZWZpbmUgTVBDX1JORFVOIE1QQ19STkQgKEdNUF9STkRVLEdNUF9STkROKQorI2RlZmluZSBNUENfUk5EVVogTVBDX1JORCAoR01QX1JORFUsR01QX1JORFopCisjZGVmaW5lIE1QQ19STkRVVSBNUENfUk5EIChHTVBfUk5EVSxHTVBfUk5EVSkKKyNkZWZpbmUgTVBDX1JORFVEIE1QQ19STkQgKEdNUF9STkRVLEdNUF9STkREKQorCisjZGVmaW5lIE1QQ19STkRETiBNUENfUk5EIChHTVBfUk5ERCxHTVBfUk5ETikKKyNkZWZpbmUgTVBDX1JORERaIE1QQ19STkQgKEdNUF9STkRELEdNUF9STkRaKQorI2RlZmluZSBNUENfUk5ERFUgTVBDX1JORCAoR01QX1JOREQsR01QX1JORFUpCisjZGVmaW5lIE1QQ19STkRERCBNUENfUk5EIChHTVBfUk5ERCxHTVBfUk5ERCkKKworCisvKiBEZWZpbml0aW9ucyBvZiB0eXBlcyBhbmQgdGhlaXIgc2VtYW50aWNzICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgbXBmcl90IHJlOworICBtcGZyX3QgaW07Cit9CitfX21wY19zdHJ1Y3Q7CisKK3R5cGVkZWYgX19tcGNfc3RydWN0IG1wY190WzFdOwordHlwZWRlZiBfX21wY19zdHJ1Y3QgKm1wY19wdHI7Cit0eXBlZGVmIGNvbnN0IF9fbXBjX3N0cnVjdCAqbXBjX3NyY3B0cjsKKworLyogU3VwcG9ydCBmb3IgV0lORE9XUyBETEwsIHNlZQorICAgaHR0cDovL2xpc3RzLmdmb3JnZS5pbnJpYS5mci9waXBlcm1haWwvbXBjLWRpc2N1c3MvMjAxMS1Ob3ZlbWJlci8wMDA5OTAuaHRtbDsKKyAgIHdoZW4gYnVpbGRpbmcgdGhlIERMTCwgZXhwb3J0IHN5bWJvbHMsIG90aGVyd2lzZSBiZWhhdmUgYXMgR01QICAgICAgICAgICAqLworI2lmIGRlZmluZWQgKF9fTVBDX0xJQlJBUllfQlVJTEQpICYmIF9fR01QX0xJQkdNUF9ETEwKKyNkZWZpbmUgX19NUENfREVDTFNQRUMgX19HTVBfREVDTFNQRUNfRVhQT1JUCisjZWxzZQorI2RlZmluZSBfX01QQ19ERUNMU1BFQyBfX0dNUF9ERUNMU1BFQworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2FkZCAgICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2FkZF9mciAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBmcl9zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19hZGRfc2kgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIGxvbmcgaW50LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfYWRkX3VpICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3N1YiAgICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3N1Yl9mciAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBmcl9zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19mcl9zdWIgICAgKG1wY19wdHIsIG1wZnJfc3JjcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc3ViX3VpICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3VpX3VpX3N1YiAobXBjX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfbXVsICAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfbXVsX2ZyICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGZyX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX211bF91aSAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19tdWxfc2kgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIGxvbmcgaW50LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfbXVsX2kgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBpbnQsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zcXIgICAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19kaXYgICAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19wb3cgICAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19wb3dfZnIgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wZnJfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfcG93X2xkICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBsb25nIGRvdWJsZSwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3Bvd19kICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgZG91YmxlLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfcG93X3NpICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBsb25nLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfcG93X3VpICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCB1bnNpZ25lZCBsb25nLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfcG93X3ogICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcHpfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfZGl2X2ZyICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGZyX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2ZyX2RpdiAgICAobXBjX3B0ciwgbXBmcl9zcmNwdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19kaXZfdWkgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfdWlfZGl2ICAgIChtcGNfcHRyLCB1bnNpZ25lZCBsb25nIGludCwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2Rpdl8ydWkgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19tdWxfMnVpICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfZGl2XzJzaSAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBsb25nIGludCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX211bF8yc2kgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbG9uZyBpbnQsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19jb25qICAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19uZWcgICAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19ub3JtICAgICAgKG1wZnJfcHRyLCBtcGNfc3JjcHRyLCBtcGZyX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2FicyAgICAgICAobXBmcl9wdHIsIG1wY19zcmNwdHIsIG1wZnJfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc3FydCAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0ICAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X2QgICAgIChtcGNfcHRyLCBkb3VibGUsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfZF9kICAgKG1wY19wdHIsIGRvdWJsZSwgZG91YmxlLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X2xkICAgIChtcGNfcHRyLCBsb25nIGRvdWJsZSwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9sZF9sZCAobXBjX3B0ciwgbG9uZyBkb3VibGUsIGxvbmcgZG91YmxlLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X2YgICAgIChtcGNfcHRyLCBtcGZfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X2ZfZiAgIChtcGNfcHRyLCBtcGZfc3JjcHRyLCBtcGZfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X2ZyICAgIChtcGNfcHRyLCBtcGZyX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9mcl9mciAobXBjX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3EgICAgIChtcGNfcHRyLCBtcHFfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3FfcSAgIChtcGNfcHRyLCBtcHFfc3JjcHRyLCBtcHFfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3NpICAgIChtcGNfcHRyLCBsb25nIGludCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9zaV9zaSAobXBjX3B0ciwgbG9uZyBpbnQsIGxvbmcgaW50LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3VpICAgIChtcGNfcHRyLCB1bnNpZ25lZCBsb25nIGludCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF91aV91aSAobXBjX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3ogICAgIChtcGNfcHRyLCBtcHpfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3pfeiAgIChtcGNfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgdm9pZCBtcGNfc3dhcCAgICAgIChtcGNfcHRyLCBtcGNfcHRyKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2ZtYSAgICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3NyY3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKKworX19NUENfREVDTFNQRUMgdm9pZCBtcGNfc2V0X25hbiAgIChtcGNfcHRyKTsKKworX19NUENfREVDTFNQRUMgaW50ICBtcGNfcmVhbCAgICAgIChtcGZyX3B0ciwgbXBjX3NyY3B0ciwgbXBmcl9ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19pbWFnICAgICAgKG1wZnJfcHRyLCBtcGNfc3JjcHRyLCBtcGZyX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2FyZyAgICAgICAobXBmcl9wdHIsIG1wY19zcmNwdHIsIG1wZnJfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfcHJvaiAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfY21wICAgICAgIChtcGNfc3JjcHRyLCBtcGNfc3JjcHRyKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2NtcF9zaV9zaSAobXBjX3NyY3B0ciwgbG9uZyBpbnQsIGxvbmcgaW50KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2V4cCAgICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2xvZyAgICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2xvZzEwICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NpbiAgICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2NvcyAgICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3Npbl9jb3MgICAobXBjX3B0ciwgbXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfdGFuICAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2luaCAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfY29zaCAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfdGFuaCAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfYXNpbiAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfYWNvcyAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfYXRhbiAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfYXNpbmggICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfYWNvc2ggICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfYXRhbmggICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgdm9pZCBtcGNfY2xlYXIgICAgIChtcGNfcHRyKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3VyYW5kb20gICAobXBjX3B0ciwgZ21wX3JhbmRzdGF0ZV90KTsKK19fTVBDX0RFQ0xTUEVDIHZvaWQgbXBjX2luaXQyICAgICAobXBjX3B0ciwgbXBmcl9wcmVjX3QpOworX19NUENfREVDTFNQRUMgdm9pZCBtcGNfaW5pdDMgICAgIChtcGNfcHRyLCBtcGZyX3ByZWNfdCwgbXBmcl9wcmVjX3QpOworX19NUENfREVDTFNQRUMgbXBmcl9wcmVjX3QgbXBjX2dldF9wcmVjIChtcGNfc3JjcHRyIHgpOworX19NUENfREVDTFNQRUMgdm9pZCBtcGNfZ2V0X3ByZWMyIChtcGZyX3ByZWNfdCAqcHIsIG1wZnJfcHJlY190ICpwaSwgbXBjX3NyY3B0ciB4KTsKK19fTVBDX0RFQ0xTUEVDIHZvaWQgbXBjX3NldF9wcmVjICAobXBjX3B0ciwgbXBmcl9wcmVjX3QpOworX19NUENfREVDTFNQRUMgY29uc3QgY2hhciAqIG1wY19nZXRfdmVyc2lvbiAodm9pZCk7CisKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3N0cnRvYyAgICAobXBjX3B0ciwgY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfc3RyICAgKG1wY19wdHIsIGNvbnN0IGNoYXIgKiwgaW50LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgY2hhciAqIG1wY19nZXRfc3RyIChpbnQsIHNpemVfdCwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIHZvaWQgbXBjX2ZyZWVfc3RyICAoY2hhciAqKTsKKworLyogZGVjbGFyZSBjZXJ0YWluIGZ1bmN0aW9ucyBvbmx5IGlmIGFwcHJvcHJpYXRlIGhlYWRlcnMgaGF2ZSBiZWVuIGluY2x1ZGVkICovCisjaWZkZWYgX01QQ19IX0hBVkVfSU5UTUFYX1QKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9zaiAgICAobXBjX3B0ciwgaW50bWF4X3QsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfdWogICAgKG1wY19wdHIsIHVpbnRtYXhfdCwgIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfc2pfc2ogKG1wY19wdHIsIGludG1heF90LCBpbnRtYXhfdCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF91al91aiAobXBjX3B0ciwgdWludG1heF90LCB1aW50bWF4X3QsIG1wY19ybmRfdCk7CisjZW5kaWYKKworI2lmZGVmIF9Db21wbGV4X0kKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9kYyAgICAobXBjX3B0ciwgZG91YmxlIF9Db21wbGV4LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X2xkYyAgIChtcGNfcHRyLCBsb25nIGRvdWJsZSBfQ29tcGxleCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGRvdWJsZSBfQ29tcGxleCBtcGNfZ2V0X2RjIChtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgbG9uZyBkb3VibGUgX0NvbXBsZXggbXBjX2dldF9sZGMgKG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CisjZW5kaWYKKworI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fTVBDX0RFQ0xTUEVDIGludCBtcGNfaW5wX3N0ciAgICAobXBjX3B0ciwgRklMRSAqLCBzaXplX3QgKiwgaW50LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgc2l6ZV90IG1wY19vdXRfc3RyIChGSUxFICosIGludCwgc2l6ZV90LCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZGVmaW5lIG1wY19yZWFscmVmKHgpICgoeCktPnJlKQorI2RlZmluZSBtcGNfaW1hZ3JlZih4KSAoKHgpLT5pbSkKKworI2RlZmluZSBtcGNfY21wX3NpKHgsIHkpIFwKKyAoIG1wY19jbXBfc2lfc2kgKCh4KSwgKHkpLCAwbCkgKQorI2RlZmluZSBtcGNfdWlfc3ViKHgsIHksIHosIHIpIG1wY191aV91aV9zdWIgKHgsIHksIDB1bCwgeiwgcikKKworLyoKKyAgIERlZmluZSBhIGZha2UgbXBmcl9zZXRfZnIgc28gdGhhdCwgZm9yIGluc3RhbmNlLCBtcGNfc2V0X2ZyX3ogd291bGQKKyAgIGJlIGRlZmluZWQgYXMgZm9sbG93czoKKyAgIG1wY19zZXRfZnJfeiAobXBjX3Qgcm9wLCBtcGZyX3QgeCwgbXB6X3QgeSwgbXBjX3JuZF90IHJuZCkKKyAgICAgICBNUENfU0VUX1hfWSAoZnIsIHosIHJvcCwgeCwgeSwgcm5kKQorKi8KKyNpZm5kZWYgbXBmcl9zZXRfZnIKKyNkZWZpbmUgbXBmcl9zZXRfZnIgbXBmcl9zZXQKKyNlbmRpZgorI2RlZmluZSBNUENfU0VUX1hfWShyZWFsX3QsIGltYWdfdCwgeiwgcmVhbF92YWx1ZSwgaW1hZ192YWx1ZSwgcm5kKSAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfaW5leF9yZSwgX2luZXhfaW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9pbmV4X3JlID0gKG1wZnJfc2V0XyAjIyByZWFsX3QpIChtcGNfcmVhbHJlZiAoeiksIChyZWFsX3ZhbHVlKSwgTVBDX1JORF9SRSAocm5kKSk7IFwKKyAgICBfaW5leF9pbSA9IChtcGZyX3NldF8gIyMgaW1hZ190KSAobXBjX2ltYWdyZWYgKHopLCAoaW1hZ192YWx1ZSksIE1QQ19STkRfSU0gKHJuZCkpOyBcCisgICAgcmV0dXJuIE1QQ19JTkVYIChfaW5leF9yZSwgX2luZXhfaW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2VuZGlmIC8qIGlmbmRlZiBfX01QQ19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL21wZjJtcGZyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL21wZjJtcGZyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3NWE2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvbXBmMm1wZnIuaApAQCAtMCwwICsxLDE3NSBAQAorLyogbXBmMm1wZnIuaCAtLSBDb21wYXRpYmlsaXR5IGluY2x1ZGUgZmlsZSB3aXRoIG1wZi4KKworQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitDb250cmlidXRlZCBieSB0aGUgQXJpQyBhbmQgQ2FyYW1lbCBwcm9qZWN0cywgSU5SSUEuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVBGUiBMaWJyYXJ5LgorCitUaGUgR05VIE1QRlIgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QRlIgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIEdOVSBNUEZSIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxFU1NFUi4gIElmIG5vdCwgc2VlCitodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvIG9yIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiAqLworCisjaWZuZGVmIF9fTVBGUl9GUk9NX01QRl9fCisjZGVmaW5lIF9fTVBGUl9GUk9NX01QRl9fCisKKy8qIHR5cGVzICovCisjZGVmaW5lIG1wZl90IG1wZnJfdAorI2RlZmluZSBtcGZfc3JjcHRyIG1wZnJfc3JjcHRyCisjZGVmaW5lIG1wZl9wdHIgbXBmcl9wdHIKKworLyogR2V0IGN1cnJlbnQgUm91bmRpbmcgTW9kZSAqLworI2lmbmRlZiBNUEZSX0RFRkFVTFRfUk5ECisjIGRlZmluZSBNUEZSX0RFRkFVTFRfUk5EIG1wZnJfZ2V0X2RlZmF1bHRfcm91bmRpbmdfbW9kZSAoKQorI2VuZGlmCisKKy8qIG1wZl9pbml0IGluaXRhbGl6ZXMgYXQgMCAqLworI3VuZGVmIG1wZl9pbml0CisjZGVmaW5lIG1wZl9pbml0KHgpIG1wZnJfaW5pdF9zZXRfdWkgKCh4KSwgMCwgTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfaW5pdDIKKyNkZWZpbmUgbXBmX2luaXQyKHgscCkgKG1wZnJfaW5pdDIoKHgpLChwKSksIG1wZnJfc2V0X3VpICgoeCksIDAsIE1QRlJfREVGQVVMVF9STkQpKQorCisvKiBmdW5jdGlvbnMgd2hpY2ggZG9uJ3QgdGFrZSBhcyBhcmd1bWVudCB0aGUgcm91bmRpbmcgbW9kZSAqLworI3VuZGVmIG1wZl9jZWlsCisjZGVmaW5lIG1wZl9jZWlsIG1wZnJfY2VpbAorI3VuZGVmIG1wZl9jbGVhcgorI2RlZmluZSBtcGZfY2xlYXIgbXBmcl9jbGVhcgorI3VuZGVmIG1wZl9jbXAKKyNkZWZpbmUgbXBmX2NtcCBtcGZyX2NtcAorI3VuZGVmIG1wZl9jbXBfc2kKKyNkZWZpbmUgbXBmX2NtcF9zaSBtcGZyX2NtcF9zaQorI3VuZGVmIG1wZl9jbXBfdWkKKyNkZWZpbmUgbXBmX2NtcF91aSBtcGZyX2NtcF91aQorI3VuZGVmIG1wZl9jbXBfZAorI2RlZmluZSBtcGZfY21wX2QgbXBmcl9jbXBfZAorI3VuZGVmIG1wZl9lcQorI2RlZmluZSBtcGZfZXEgbXBmcl9lcQorI3VuZGVmIG1wZl9mbG9vcgorI2RlZmluZSBtcGZfZmxvb3IgbXBmcl9mbG9vcgorI3VuZGVmIG1wZl9nZXRfcHJlYworI2RlZmluZSBtcGZfZ2V0X3ByZWMgbXBmcl9nZXRfcHJlYworI3VuZGVmIG1wZl9pbnRlZ2VyX3AKKyNkZWZpbmUgbXBmX2ludGVnZXJfcCBtcGZyX2ludGVnZXJfcAorI3VuZGVmIG1wZl9yYW5kb20yCisjZGVmaW5lIG1wZl9yYW5kb20yIG1wZnJfcmFuZG9tMgorI3VuZGVmIG1wZl9zZXRfZGVmYXVsdF9wcmVjCisjZGVmaW5lIG1wZl9zZXRfZGVmYXVsdF9wcmVjIG1wZnJfc2V0X2RlZmF1bHRfcHJlYworI3VuZGVmIG1wZl9nZXRfZGVmYXVsdF9wcmVjCisjZGVmaW5lIG1wZl9nZXRfZGVmYXVsdF9wcmVjIG1wZnJfZ2V0X2RlZmF1bHRfcHJlYworI3VuZGVmIG1wZl9zZXRfcHJlYworI2RlZmluZSBtcGZfc2V0X3ByZWMgbXBmcl9zZXRfcHJlYworI3VuZGVmIG1wZl9zZXRfcHJlY19yYXcKKyNkZWZpbmUgbXBmX3NldF9wcmVjX3Jhdyh4LHApIG1wZnJfcHJlY19yb3VuZCh4LHAsTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfdHJ1bmMKKyNkZWZpbmUgbXBmX3RydW5jIG1wZnJfdHJ1bmMKKyN1bmRlZiBtcGZfc2duCisjZGVmaW5lIG1wZl9zZ24gbXBmcl9zZ24KKyN1bmRlZiBtcGZfc3dhcAorI2RlZmluZSBtcGZfc3dhcCBtcGZyX3N3YXAKKyN1bmRlZiBtcGZfZHVtcAorI2RlZmluZSBtcGZfZHVtcCBtcGZyX2R1bXAKKworLyogZnVuY3Rpb25zIHdoaWNoIHRha2UgYXMgYXJndW1lbnQgdGhlIHJvdW5kaW5nIG1vZGUgKi8KKyN1bmRlZiBtcGZfYWJzCisjZGVmaW5lIG1wZl9hYnMoeCx5KSBtcGZyX2Ficyh4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfYWRkCisjZGVmaW5lIG1wZl9hZGQoeCx5LHopIG1wZnJfYWRkKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2FkZF91aQorI2RlZmluZSBtcGZfYWRkX3VpKHgseSx6KSBtcGZyX2FkZF91aSh4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9kaXYKKyNkZWZpbmUgbXBmX2Rpdih4LHkseikgbXBmcl9kaXYoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZGl2X3VpCisjZGVmaW5lIG1wZl9kaXZfdWkoeCx5LHopIG1wZnJfZGl2X3VpKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2Rpdl8yZXhwCisjZGVmaW5lIG1wZl9kaXZfMmV4cCh4LHkseikgbXBmcl9kaXZfMmV4cCh4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9maXRzX3Nsb25nX3AKKyNkZWZpbmUgbXBmX2ZpdHNfc2xvbmdfcCh4KSBtcGZyX2ZpdHNfdWxvbmdfcCh4LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2ZpdHNfdWxvbmdfcAorI2RlZmluZSBtcGZfZml0c191bG9uZ19wKHgpIG1wZnJfZml0c191bG9uZ19wKHgsTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZml0c19zaW50X3AKKyNkZWZpbmUgbXBmX2ZpdHNfc2ludF9wKHgpIG1wZnJfZml0c191aW50X3AoeCxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9maXRzX3VpbnRfcAorI2RlZmluZSBtcGZfZml0c191aW50X3AoeCkgbXBmcl9maXRzX3VpbnRfcCh4LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2ZpdHNfc3Nob3J0X3AKKyNkZWZpbmUgbXBmX2ZpdHNfc3Nob3J0X3AoeCkgbXBmcl9maXRzX3VzaG9ydF9wKHgsTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZml0c191c2hvcnRfcAorI2RlZmluZSBtcGZfZml0c191c2hvcnRfcCh4KSBtcGZyX2ZpdHNfdXNob3J0X3AoeCxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9nZXRfc3RyCisjZGVmaW5lIG1wZl9nZXRfc3RyKHgseSx6LHQsdSkgbXBmcl9nZXRfc3RyKHgseSx6LHQsdSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9nZXRfZAorI2RlZmluZSBtcGZfZ2V0X2QoeCkgbXBmcl9nZXRfZCh4LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2dldF9kXzJleHAKKyNkZWZpbmUgbXBmX2dldF9kXzJleHAoZSx4KSBtcGZyX2dldF9kXzJleHAoZSx4LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2dldF91aQorI2RlZmluZSBtcGZfZ2V0X3VpKHgpIG1wZnJfZ2V0X3VpKHgsTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZ2V0X3NpCisjZGVmaW5lIG1wZl9nZXRfc2koeCkgbXBmcl9nZXRfdWkoeCxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9pbnBfc3RyCisjZGVmaW5lIG1wZl9pbnBfc3RyKHgseSx6KSBtcGZyX2lucF9zdHIoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfc2V0X3N0cgorI2RlZmluZSBtcGZfc2V0X3N0cih4LHkseikgbXBmcl9zZXRfc3RyKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2luaXRfc2V0CisjZGVmaW5lIG1wZl9pbml0X3NldCh4LHkpIG1wZnJfaW5pdF9zZXQoeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2luaXRfc2V0X2QKKyNkZWZpbmUgbXBmX2luaXRfc2V0X2QoeCx5KSBtcGZyX2luaXRfc2V0X2QoeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2luaXRfc2V0X3NpCisjZGVmaW5lIG1wZl9pbml0X3NldF9zaSh4LHkpIG1wZnJfaW5pdF9zZXRfc2koeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2luaXRfc2V0X3N0cgorI2RlZmluZSBtcGZfaW5pdF9zZXRfc3RyKHgseSx6KSBtcGZyX2luaXRfc2V0X3N0cih4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9pbml0X3NldF91aQorI2RlZmluZSBtcGZfaW5pdF9zZXRfdWkoeCx5KSBtcGZyX2luaXRfc2V0X3VpKHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9tdWwKKyNkZWZpbmUgbXBmX211bCh4LHkseikgbXBmcl9tdWwoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfbXVsXzJleHAKKyNkZWZpbmUgbXBmX211bF8yZXhwKHgseSx6KSBtcGZyX211bF8yZXhwKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX211bF91aQorI2RlZmluZSBtcGZfbXVsX3VpKHgseSx6KSBtcGZyX211bF91aSh4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9uZWcKKyNkZWZpbmUgbXBmX25lZyh4LHkpIG1wZnJfbmVnKHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9vdXRfc3RyCisjZGVmaW5lIG1wZl9vdXRfc3RyKHgseSx6LHQpIG1wZnJfb3V0X3N0cih4LHkseix0LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3Bvd191aQorI2RlZmluZSBtcGZfcG93X3VpKHgseSx6KSBtcGZyX3Bvd191aSh4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9yZWxkaWZmCisjZGVmaW5lIG1wZl9yZWxkaWZmKHgseSx6KSBtcGZyX3JlbGRpZmYoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfc2V0CisjZGVmaW5lIG1wZl9zZXQoeCx5KSBtcGZyX3NldCh4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfc2V0X2QKKyNkZWZpbmUgbXBmX3NldF9kKHgseSkgbXBmcl9zZXRfZCh4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfc2V0X3EKKyNkZWZpbmUgbXBmX3NldF9xKHgseSkgbXBmcl9zZXRfcSh4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfc2V0X3NpCisjZGVmaW5lIG1wZl9zZXRfc2koeCx5KSBtcGZyX3NldF9zaSh4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfc2V0X3VpCisjZGVmaW5lIG1wZl9zZXRfdWkoeCx5KSBtcGZyX3NldF91aSh4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfc2V0X3oKKyNkZWZpbmUgbXBmX3NldF96KHgseSkgbXBmcl9zZXRfeih4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfc3FydAorI2RlZmluZSBtcGZfc3FydCh4LHkpIG1wZnJfc3FydCh4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfc3FydF91aQorI2RlZmluZSBtcGZfc3FydF91aSh4LHkpIG1wZnJfc3FydF91aSh4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfc3ViCisjZGVmaW5lIG1wZl9zdWIoeCx5LHopIG1wZnJfc3ViKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3N1Yl91aQorI2RlZmluZSBtcGZfc3ViX3VpKHgseSx6KSBtcGZyX3N1Yl91aSh4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl91aV9kaXYKKyNkZWZpbmUgbXBmX3VpX2Rpdih4LHkseikgbXBmcl91aV9kaXYoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfdWlfc3ViCisjZGVmaW5lIG1wZl91aV9zdWIoeCx5LHopIG1wZnJfdWlfc3ViKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3VyYW5kb21iCisjZGVmaW5lIG1wZl91cmFuZG9tYih4LHksbikgbXBmcl91cmFuZG9tYih4LHkpCisKKyN1bmRlZiBtcHpfc2V0X2YKKyNkZWZpbmUgbXB6X3NldF9mKHosZikgbXBmcl9nZXRfeih6LGYsTVBGUl9ERUZBVUxUX1JORCkKKworI2VuZGlmIC8qIF9fTVBGUl9GUk9NX01QRl9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL21wZnIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUvbXBmci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOWFkMjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlL21wZnIuaApAQCAtMCwwICsxLDEwNTkgQEAKKy8qIG1wZnIuaCAtLSBJbmNsdWRlIGZpbGUgZm9yIG1wZnIuCisKK0NvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQ29udHJpYnV0ZWQgYnkgdGhlIEFyaUMgYW5kIENhcmFtZWwgcHJvamVjdHMsIElOUklBLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QRlIgTGlicmFyeS4KKworVGhlIEdOVSBNUEZSIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUEZSIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBHTlUgTVBGUiBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MRVNTRVIuICBJZiBub3QsIHNlZQoraHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLyBvciB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gKi8KKworI2lmbmRlZiBfX01QRlJfSAorI2RlZmluZSBfX01QRlJfSAorCisvKiBEZWZpbmUgTVBGUiB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBNUEZSX1ZFUlNJT05fTUFKT1IgMworI2RlZmluZSBNUEZSX1ZFUlNJT05fTUlOT1IgMQorI2RlZmluZSBNUEZSX1ZFUlNJT05fUEFUQ0hMRVZFTCAxCisjZGVmaW5lIE1QRlJfVkVSU0lPTl9TVFJJTkcgIjMuMS4xIgorCisvKiBNYWNyb3MgZGVhbGluZyB3aXRoIE1QRlIgVkVSU0lPTiAqLworI2RlZmluZSBNUEZSX1ZFUlNJT05fTlVNKGEsYixjKSAoKChhKSA8PCAxNkwpIHwgKChiKSA8PCA4KSB8IChjKSkKKyNkZWZpbmUgTVBGUl9WRVJTSU9OIFwKK01QRlJfVkVSU0lPTl9OVU0oTVBGUl9WRVJTSU9OX01BSk9SLE1QRlJfVkVSU0lPTl9NSU5PUixNUEZSX1ZFUlNJT05fUEFUQ0hMRVZFTCkKKworLyogQ2hlY2sgaWYgR01QIGlzIGluY2x1ZGVkLCBhbmQgdHJ5IHRvIGluY2x1ZGUgaXQgKFdvcmtzIHdpdGggbG9jYWwgR01QKSAqLworI2lmbmRlZiBfX0dNUF9IX18KKyMgaW5jbHVkZSA8Z21wLmg+CisjZW5kaWYKKworLyogR01QJ3MgaW50ZXJuYWwgX19nbXBfY29uc3QgbWFjcm8gaGFzIGJlZW4gcmVtb3ZlZCBvbiAyMDEyLTAzLTA0OgorICAgICBodHRwOi8vZ21wbGliLm9yZzo4MDAwL2dtcC9yZXYvZDI4N2NmYWY2NzMyCisgICBjb25zdCBpcyBzdGFuZGFyZCBhbmQgbm93IGFzc3VtZWQgdG8gYmUgYXZhaWxhYmxlLiBJZiB0aGUgX19nbXBfY29uc3QKKyAgIGRlZmluaXRpb24gaXMgbm8gbG9uZ2VyIHByZXNlbnQgaW4gR01QLCB0aGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgR01QCisgICBhc3N1bWVzIHRoYXQgY29uc3QgaXMgYXZhaWxhYmxlOyB0aHVzIGxldCdzIGRlZmluZSBpdCB0byBjb25zdC4KKyAgIE5vdGU6IHRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4IHRoYXQgY2FuIGJlIGJhY2twb3J0ZWQgdG8gcHJldmlvdXMgTVBGUgorICAgdmVyc2lvbnMuIEluIHRoZSBmdXR1cmUsIF9fZ21wX2NvbnN0IHNob3VsZCBiZSByZXBsYWNlZCBieSBjb25zdCBsaWtlCisgICBpbiBHTVAuICovCisjaWZuZGVmIF9fZ21wX2NvbnN0CisjIGRlZmluZSBfX2dtcF9jb25zdCBjb25zdAorI2VuZGlmCisKKy8qIEF2b2lkIHNvbWUgcHJvYmxlbXMgd2l0aCBtYWNybyBleHBhbnNpb24gaWYgdGhlIHVzZXIgZGVmaW5lcyBtYWNyb3MKKyAgIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBrZXl3b3Jkcy4gQnkgY29udmVudGlvbiwgaWRlbnRpZmllcnMgYW5kIG1hY3JvCisgICBuYW1lcyBzdGFydGluZyB3aXRoIG1wZnJfIGFyZSByZXNlcnZlZCBieSBNUEZSLiAqLwordHlwZWRlZiB2b2lkICAgICAgICAgICAgbXBmcl92b2lkOwordHlwZWRlZiBpbnQgICAgICAgICAgICAgbXBmcl9pbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICBtcGZyX3VpbnQ7Cit0eXBlZGVmIGxvbmcgICAgICAgICAgICBtcGZyX2xvbmc7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBtcGZyX3Vsb25nOwordHlwZWRlZiBzaXplX3QgICAgICAgICAgbXBmcl9zaXplX3Q7CisKKy8qIERlZmluaXRpb24gb2Ygcm91bmRpbmcgbW9kZXMgKERPTidUIFVTRSBNUEZSX1JORE5BISkuCisgICBXYXJuaW5nISBDaGFuZ2luZyB0aGUgY29udGVudHMgb2YgdGhpcyBlbnVtIHNob3VsZCBiZSBzZWVuIGFzIGFuCisgICBpbnRlcmZhY2UgY2hhbmdlIHNpbmNlIHRoZSBvbGQgYW5kIHRoZSBuZXcgdHlwZXMgYXJlIG5vdCBjb21wYXRpYmxlCisgICAodGhlIGludGVnZXIgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIGVudW1lcmF0ZWQgdHlwZSBjYW4gZXZlbiBjaGFuZ2UsCisgICBzZWUgSVNPIEM5OSwgNi43LjIuMiM0KSwgYW5kIGluIE1ha2VmaWxlLmFtLCBBR0Ugc2hvdWxkIGJlIHNldCB0byAwLgorCisgICBNUEZSX1JORFUgbXVzdCBhcHBlYXIganVzdCBiZWZvcmUgTVBGUl9STkREIChzZWUKKyAgIE1QRlJfSVNfUk5EVVRFU1RfT1JfUk5ERE5PVFRFU1QgaW4gbXBmci1pbXBsLmgpLgorCisgICBNUEZSX1JOREYgaGFzIGJlZW4gYWRkZWQsIHRob3VnaCBub3QgaW1wbGVtZW50ZWQgeWV0LCBpbiBvcmRlciB0byBhdm9pZAorICAgdG8gYnJlYWsgdGhlIEFCSSBvbmNlIGZhaXRoZnVsIHJvdW5kaW5nIGdldHMgaW1wbGVtZW50ZWQuCisKKyAgIElmIHlvdSBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSByb3VuZGluZyBtb2RlcywgcGxlYXNlIHVwZGF0ZSB0aGUgcm91dGluZXMKKyAgIGluIHRleGNlcHRpb25zLmMgd2hpY2ggYXNzdW1lIDA9Uk5ETiwgMT1STkRaLCAyPVJORFUsIDM9Uk5ERCwgND1STkRBLgorKi8KK3R5cGVkZWYgZW51bSB7CisgIE1QRlJfUk5ETj0wLCAgLyogcm91bmQgdG8gbmVhcmVzdCwgd2l0aCB0aWVzIHRvIGV2ZW4gKi8KKyAgTVBGUl9STkRaLCAgICAvKiByb3VuZCB0b3dhcmQgemVybyAqLworICBNUEZSX1JORFUsICAgIC8qIHJvdW5kIHRvd2FyZCArSW5mICovCisgIE1QRlJfUk5ERCwgICAgLyogcm91bmQgdG93YXJkIC1JbmYgKi8KKyAgTVBGUl9STkRBLCAgICAvKiByb3VuZCBhd2F5IGZyb20gemVybyAqLworICBNUEZSX1JOREYsICAgIC8qIGZhaXRoZnVsIHJvdW5kaW5nIChub3QgaW1wbGVtZW50ZWQgeWV0KSAqLworICBNUEZSX1JORE5BPS0xIC8qIHJvdW5kIHRvIG5lYXJlc3QsIHdpdGggdGllcyBhd2F5IGZyb20gemVybyAobXBmcl9yb3VuZCkgKi8KK30gbXBmcl9ybmRfdDsKKworLyoga2VwdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE1QRlIgMi40LnggYW5kIGJlZm9yZSAqLworI2RlZmluZSBHTVBfUk5ETiBNUEZSX1JORE4KKyNkZWZpbmUgR01QX1JORFogTVBGUl9STkRaCisjZGVmaW5lIEdNUF9STkRVIE1QRlJfUk5EVQorI2RlZmluZSBHTVBfUk5ERCBNUEZSX1JOREQKKworLyogTm90ZTogV2l0aCB0aGUgZm9sbG93aW5nIGRlZmF1bHQgY2hvaWNlcyBmb3IgX01QRlJfUFJFQ19GT1JNQVQgYW5kCisgICBfTVBGUl9FWFBfRk9STUFULCBtcGZyX2V4cF90IHdpbGwgYmUgdGhlIHNhbWUgYXMgW21wX2V4cF90XSAoYXQgbGVhc3QKKyAgIHVwIHRvIEdNUCA1KS4gKi8KKworLyogRGVmaW5lIHByZWNpc2lvbjogMSAoc2hvcnQpLCAyIChpbnQpIG9yIDMgKGxvbmcpIChET04nVCBVU0UgSVQhKSAqLworI2lmbmRlZiBfTVBGUl9QUkVDX0ZPUk1BVAorIyBpZiBfX0dNUF9NUF9TSVpFX1RfSU5UID09IDEKKyMgIGRlZmluZSBfTVBGUl9QUkVDX0ZPUk1BVCAyCisjIGVsc2UKKyMgIGRlZmluZSBfTVBGUl9QUkVDX0ZPUk1BVCAzCisjIGVuZGlmCisjZW5kaWYKKworLyogRGVmaW5lIGV4cG9uZW50OiAxIChzaG9ydCksIDIgKGludCksIDMgKGxvbmcpIG9yIDQgKGludG1heF90KQorICAgKERPTidUIFVTRSBJVCEpICovCisjaWZuZGVmIF9NUEZSX0VYUF9GT1JNQVQKKyMgZGVmaW5lIF9NUEZSX0VYUF9GT1JNQVQgX01QRlJfUFJFQ19GT1JNQVQKKyNlbmRpZgorCisjaWYgX01QRlJfUFJFQ19GT1JNQVQgPiBfTVBGUl9FWFBfRk9STUFUCisjIGVycm9yICJtcGZyX3ByZWNfdCBtdXN0IG5vdCBiZSBsYXJnZXIgdGhhbiBtcGZyX2V4cF90IgorI2VuZGlmCisKKy8qIExldCdzIG1ha2UgbXBmcl9wcmVjX3Qgc2lnbmVkIGluIG9yZGVyIHRvIGF2b2lkIHByb2JsZW1zIGR1ZSB0byB0aGUKKyAgIHVzdWFsIGFyaXRobWV0aWMgY29udmVyc2lvbnMgd2hlbiBtaXhpbmcgbXBmcl9wcmVjX3QgYW5kIG1wZnJfZXhwX3QKKyAgIGluIGFuIGV4cHJlc3Npb24gKGZvciBlcnJvciBhbmFseXNpcykgaWYgY2FzdHMgYXJlIGZvcmdvdHRlbi4gKi8KKyNpZiAgIF9NUEZSX1BSRUNfRk9STUFUID09IDEKK3R5cGVkZWYgc2hvcnQgbXBmcl9wcmVjX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IG1wZnJfdXByZWNfdDsKKyNlbGlmIF9NUEZSX1BSRUNfRk9STUFUID09IDIKK3R5cGVkZWYgaW50ICAgbXBmcl9wcmVjX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgIG1wZnJfdXByZWNfdDsKKyNlbGlmIF9NUEZSX1BSRUNfRk9STUFUID09IDMKK3R5cGVkZWYgbG9uZyAgbXBmcl9wcmVjX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIG1wZnJfdXByZWNfdDsKKyNlbHNlCisjIGVycm9yICJJbnZhbGlkIE1QRlIgUHJlYyBmb3JtYXQiCisjZW5kaWYKKworLyogRGVmaW5pdGlvbiBvZiBwcmVjaXNpb24gbGltaXRzIHdpdGhvdXQgbmVlZGluZyA8bGltaXRzLmg+ICovCisvKiBOb3RlOiB0aGUgY2FzdHMgYWxsb3dzIHRoZSBleHByZXNzaW9uIHRvIHlpZWxkIHRoZSB3YW50ZWQgYmVoYXZpb3IKKyAgIGZvciBfTVBGUl9QUkVDX0ZPUk1BVCA9PSAxIChkdWUgdG8gaW50ZWdlciBwcm9tb3Rpb24gcnVsZXMpLiAqLworI2RlZmluZSBNUEZSX1BSRUNfTUlOIDIKKyNkZWZpbmUgTVBGUl9QUkVDX01BWCAoKG1wZnJfcHJlY190KSgobXBmcl91cHJlY190KSh+KG1wZnJfdXByZWNfdCkwKT4+MSkpCisKKy8qIERlZmluaXRpb24gb2Ygc2lnbiAqLwordHlwZWRlZiBpbnQgICAgICAgICAgbXBmcl9zaWduX3Q7CisKKy8qIERlZmluaXRpb24gb2YgdGhlIGV4cG9uZW50LiBfTVBGUl9FWFBfRk9STUFUIG11c3QgYmUgbGFyZ2UgZW5vdWdoCisgICBzbyB0aGF0IG1wZnJfZXhwX3QgaGFzIGF0IGxlYXN0IDMyIGJpdHMuICovCisjaWYgICBfTVBGUl9FWFBfRk9STUFUID09IDEKK3R5cGVkZWYgc2hvcnQgbXBmcl9leHBfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgbXBmcl91ZXhwX3Q7CisjZWxpZiBfTVBGUl9FWFBfRk9STUFUID09IDIKK3R5cGVkZWYgaW50IG1wZnJfZXhwX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBtcGZyX3VleHBfdDsKKyNlbGlmIF9NUEZSX0VYUF9GT1JNQVQgPT0gMwordHlwZWRlZiBsb25nIG1wZnJfZXhwX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbXBmcl91ZXhwX3Q7CisjZWxpZiBfTVBGUl9FWFBfRk9STUFUID09IDQKKy8qIE5vdGU6IGluIHRoaXMgY2FzZSwgaW50bWF4X3QgYW5kIHVpbnRtYXhfdCBtdXN0IGJlIGRlZmluZWQgYmVmb3JlCisgICB0aGUgaW5jbHVzaW9uIG9mIG1wZnIuaCAod2UgZG8gbm90IGluY2x1ZGUgPHN0ZGludC5oPiBoZXJlIGJlY2F1c2UKKyAgIG9mIHNvbWUgbm9uLUlTTyBDOTkgaW1wbGVtZW50YXRpb25zIHRoYXQgc3VwcG9ydCB0aGVzZSB0eXBlcykuICovCit0eXBlZGVmIGludG1heF90IG1wZnJfZXhwX3Q7Cit0eXBlZGVmIHVpbnRtYXhfdCBtcGZyX3VleHBfdDsKKyNlbHNlCisjIGVycm9yICJJbnZhbGlkIE1QRlIgRXhwIGZvcm1hdCIKKyNlbmRpZgorCisvKiBEZWZpbml0aW9uIG9mIHRoZSBzdGFuZGFyZCBleHBvbmVudCBsaW1pdHMgKi8KKyNkZWZpbmUgTVBGUl9FTUFYX0RFRkFVTFQgKChtcGZyX2V4cF90KSAoKChtcGZyX3Vsb25nKSAxIDw8IDMwKSAtIDEpKQorI2RlZmluZSBNUEZSX0VNSU5fREVGQVVMVCAoLShNUEZSX0VNQVhfREVGQVVMVCkpCisKKy8qIERPTidUIFVTRSBUSElTISAoRm9yIE1QRlItcHVibGljIG1hY3JvcyBvbmx5LCBzZWUgYmVsb3cuKQorICAgVGhlIG1wZnJfc2duIG1hY3JvIHVzZXMgdGhlIGZhY3QgdGhhdCBfX01QRlJfRVhQX05BTiBhbmQgX19NUEZSX0VYUF9aRVJPCisgICBhcmUgdGhlIHNtYWxsZXN0IHZhbHVlcy4gKi8KKyNkZWZpbmUgX19NUEZSX0VYUF9NQVggKChtcGZyX2V4cF90KSAoKChtcGZyX3VleHBfdCkgLTEpID4+IDEpKQorI2RlZmluZSBfX01QRlJfRVhQX05BTiAgKDEgLSBfX01QRlJfRVhQX01BWCkKKyNkZWZpbmUgX19NUEZSX0VYUF9aRVJPICgwIC0gX19NUEZSX0VYUF9NQVgpCisjZGVmaW5lIF9fTVBGUl9FWFBfSU5GICAoMiAtIF9fTVBGUl9FWFBfTUFYKQorCisvKiBEZWZpbml0aW9uIG9mIHRoZSBtYWluIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBtcGZyX3ByZWNfdCAgX21wZnJfcHJlYzsKKyAgbXBmcl9zaWduX3QgIF9tcGZyX3NpZ247CisgIG1wZnJfZXhwX3QgICBfbXBmcl9leHA7CisgIG1wX2xpbWJfdCAgICpfbXBmcl9kOworfSBfX21wZnJfc3RydWN0OworCisvKiBDb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdHlwZXMgb2YgTVBGUiAqLworI2lmbmRlZiBtcF9ybmRfdAorIyBkZWZpbmUgbXBfcm5kX3QgIG1wZnJfcm5kX3QKKyNlbmRpZgorI2lmbmRlZiBtcF9wcmVjX3QKKyMgZGVmaW5lIG1wX3ByZWNfdCBtcGZyX3ByZWNfdAorI2VuZGlmCisKKy8qCisgICBUaGUgcmVwcmVzZW50ZWQgbnVtYmVyIGlzCisgICAgICBfc2lnbiooX2Rbay0xXS9CK19kW2stMl0vQl4yKy4uLitfZFswXS9CXmspKjJeX2V4cAorICAgd2hlcmUgaz1jZWlsKF9tcF9wcmVjL0dNUF9OVU1CX0JJVFMpIGFuZCBCPTJeR01QX05VTUJfQklUUy4KKworICAgRm9yIHRoZSBtc2IgKG1vc3Qgc2lnbmlmaWNhbnQgYml0KSBub3JtYWxpemVkIHJlcHJlc2VudGF0aW9uLCB3ZSBtdXN0IGhhdmUKKyAgICAgIF9kW2stMV0+PUIvMiwgdW5sZXNzIHRoZSBudW1iZXIgaXMgc2luZ3VsYXIuCisKKyAgIFdlIG11c3QgYWxzbyBoYXZlIHRoZSBsYXN0IGsqR01QX05VTUJfQklUUy1fcHJlYyBiaXRzIHNldCB0byB6ZXJvLgorKi8KKwordHlwZWRlZiBfX21wZnJfc3RydWN0IG1wZnJfdFsxXTsKK3R5cGVkZWYgX19tcGZyX3N0cnVjdCAqbXBmcl9wdHI7Cit0eXBlZGVmIF9fZ21wX2NvbnN0IF9fbXBmcl9zdHJ1Y3QgKm1wZnJfc3JjcHRyOworCisvKiBGb3IgdGhvc2Ugd2hvIG5lZWQgYSBkaXJlY3QgYW5kIGZhc3QgYWNjZXNzIHRvIHRoZSBzaWduIGZpZWxkLgorICAgSG93ZXZlciBpdCBpcyBub3QgaW4gdGhlIEFQSSwgdGh1cyB1c2UgaXQgYXQgeW91ciBvd24gcmlzazogaXQgbWlnaHQKKyAgIG5vdCBiZSBzdXBwb3J0ZWQsIG9yIGNoYW5nZSBuYW1lLCBpbiBmdXJ0aGVyIHZlcnNpb25zIQorICAgVW5mb3J0dW5hdGVseSwgaXQgbXVzdCBiZSBkZWZpbmVkIGhlcmUgKGluc3RlYWQgb2YgTVBGUidzIGludGVybmFsCisgICBoZWFkZXIgZmlsZSBtcGZyLWltcGwuaCkgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHNvbWUgbWFjcm9zIGJlbG93LgorKi8KKyNkZWZpbmUgTVBGUl9TSUdOKHgpICgoeCktPl9tcGZyX3NpZ24pCisKKy8qIFN0YWNrIGludGVyZmFjZSAqLwordHlwZWRlZiBlbnVtIHsKKyAgTVBGUl9OQU5fS0lORCA9IDAsCisgIE1QRlJfSU5GX0tJTkQgPSAxLCBNUEZSX1pFUk9fS0lORCA9IDIsIE1QRlJfUkVHVUxBUl9LSU5EID0gMworfSBtcGZyX2tpbmRfdDsKKworLyogR01QIGRlZmluZXM6CisgICAgKyBzaXplX3Q6ICAgICAgICAgICAgICAgIFN0YW5kYXJkIHNpemVfdAorICAgICsgX19HTVBfQVRUUklCVVRFX1BVUkUgICBBdHRyaWJ1dGUgZm9yIG1hdGggZnVuY3Rpb25zLgorICAgICsgX19HTVBfTk9USFJPVyAgICAgICAgICBGb3IgQysrOiBjYW4ndCB0aHJvdyAuCisgICAgKyBfX0dNUF9FWFRFUk5fSU5MSU5FICAgIEF0dHJpYnV0ZSBmb3IgaW5saW5lIGZ1bmN0aW9uLgorICAgICogX19nbXBfY29uc3QgICAgICAgICAgICBjb25zdCAoU3VwcG9ydHMgZm9yIEsmUiBjb21waWxlciBvbmx5IGZvciBtcGZyLmgpLgorICAgICsgX19HTVBfREVDTFNQRUNfRVhQT1JUICBjb21waWxpbmcgdG8gZ28gaW50byBhIERMTAorICAgICsgX19HTVBfREVDTFNQRUNfSU1QT1JUICBjb21waWxpbmcgdG8gZ28gaW50byBhIGFwcGxpY2F0aW9uCisqLworLyogRXh0cmEgTVBGUiBkZWZpbmVzICovCisjZGVmaW5lIF9fTVBGUl9TRU5USU5FTF9BVFRSCisjaWYgZGVmaW5lZCAoX19HTlVDX18pCisjIGlmIF9fR05VQ19fID49IDQKKyMgIHVuZGVmIF9fTVBGUl9TRU5USU5FTF9BVFRSCisjICBkZWZpbmUgX19NUEZSX1NFTlRJTkVMX0FUVFIgX19hdHRyaWJ1dGVfXyAoKHNlbnRpbmVsKSkKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBQcm90b3R5cGVzOiBTdXBwb3J0IG9mIEsmUiBjb21waWxlciAqLworI2lmIGRlZmluZWQgKF9fR01QX1BST1RPKQorIyBkZWZpbmUgX01QRlJfUFJPVE8gX19HTVBfUFJPVE8KKyNlbGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyMgZGVmaW5lIF9NUEZSX1BST1RPKHgpIHgKKyNlbHNlCisjIGRlZmluZSBfTVBGUl9QUk9UTyh4KSAoKQorI2VuZGlmCisvKiBTdXBwb3J0IGZvciBXSU5ET1dTIERsbDoKKyAgIENoZWNrIGlmIHdlIGFyZSBpbnNpZGUgYSBNUEZSIGJ1aWxkLCBhbmQgaWYgc28gZXhwb3J0IHRoZSBmdW5jdGlvbnMuCisgICBPdGhlcndpc2UgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBHTVAgKi8KKyNpZiBkZWZpbmVkKF9fTVBGUl9XSVRISU5fTVBGUikgJiYgX19HTVBfTElCR01QX0RMTAorIyBkZWZpbmUgX19NUEZSX0RFQ0xTUEVDIF9fR01QX0RFQ0xTUEVDX0VYUE9SVAorI2Vsc2UKKyMgZGVmaW5lIF9fTVBGUl9ERUNMU1BFQyBfX0dNUF9ERUNMU1BFQworI2VuZGlmCisKKy8qIFVzZSBNUEZSX0RFUFJFQ0FURUQgdG8gbWFyayBNUEZSIGZ1bmN0aW9ucywgdHlwZXMgb3IgdmFyaWFibGVzIGFzCisgICBkZXByZWNhdGVkLiBDb2RlIGluc3BpcmVkIGJ5IEFwYWNoZSBTdWJ2ZXJzaW9uJ3Mgc3ZuX3R5cGVzLmggZmlsZS4gKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBcCisgIChfX0dOVUNfXyA+PSA0IHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDEpKQorIyBkZWZpbmUgTVBGUl9ERVBSRUNBVEVEIF9fYXR0cmlidXRlX18gKChkZXByZWNhdGVkKSkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDEzMDAKKyMgZGVmaW5lIE1QRlJfREVQUkVDQVRFRCBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQpCisjZWxzZQorIyBkZWZpbmUgTVBGUl9ERVBSRUNBVEVECisjZW5kaWYKKworLyogTm90ZTogSW4gb3JkZXIgdG8gYmUgZGVjbGFyZWQsIHNvbWUgZnVuY3Rpb25zIG5lZWQgYSBzcGVjaWZpYworICAgc3lzdGVtIGhlYWRlciB0byBiZSBpbmNsdWRlZCAqYmVmb3JlKiAibXBmci5oIi4gSWYgdGhlIHVzZXIKKyAgIGZvcmdldHMgdG8gaW5jbHVkZSB0aGUgaGVhZGVyLCB0aGUgTVBGUiBmdW5jdGlvbiBwcm90b3R5cGUgaW4KKyAgIHRoZSB1c2VyIG9iamVjdCBmaWxlIGlzIG5vdCBjb3JyZWN0LiBUbyBhdm9pZCB3cm9uZyByZXN1bHRzLAorICAgd2UgcmFpc2UgYSBsaW5rZXIgZXJyb3IgaW4gdGhhdCBjYXNlIGJ5IGNoYW5naW5nIHRoZWlyIGludGVybmFsCisgICBuYW1lIGluIHRoZSBsaWJyYXJ5IChwcmVmaXhlZCBieSBfX2dtcGZyIGluc3RlYWQgb2YgbXBmcikuIFNlZQorICAgdGhlIGxpbmVzIG9mIHRoZSBmb3JtICIjZGVmaW5lIG1wZnJfeHh4IF9fZ21wZnJfeHh4IiBiZWxvdy4gKi8KKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworX19NUEZSX0RFQ0xTUEVDIF9fZ21wX2NvbnN0IGNoYXIgKiBtcGZyX2dldF92ZXJzaW9uIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIF9fZ21wX2NvbnN0IGNoYXIgKiBtcGZyX2dldF9wYXRjaGVzIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2J1aWxkb3B0X3Rsc19wICAgICAgICAgIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2J1aWxkb3B0X2RlY2ltYWxfcCAgICAgIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2J1aWxkb3B0X2dtcGludGVybmFsc19wIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIF9fZ21wX2NvbnN0IGNoYXIgKiBtcGZyX2J1aWxkb3B0X3R1bmVfY2FzZSBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKKworX19NUEZSX0RFQ0xTUEVDIG1wZnJfZXhwX3QgbXBmcl9nZXRfZW1pbiAgICAgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgaW50ICAgICAgICBtcGZyX3NldF9lbWluICAgICBfTVBGUl9QUk9UTyAoKG1wZnJfZXhwX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBtcGZyX2V4cF90IG1wZnJfZ2V0X2VtaW5fbWluIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIG1wZnJfZXhwX3QgbXBmcl9nZXRfZW1pbl9tYXggX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgbXBmcl9leHBfdCBtcGZyX2dldF9lbWF4ICAgICBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgICAgICAgIG1wZnJfc2V0X2VtYXggICAgIF9NUEZSX1BST1RPICgobXBmcl9leHBfdCkpOworX19NUEZSX0RFQ0xTUEVDIG1wZnJfZXhwX3QgbXBmcl9nZXRfZW1heF9taW4gX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgbXBmcl9leHBfdCBtcGZyX2dldF9lbWF4X21heCBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKKworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfZGVmYXVsdF9yb3VuZGluZ19tb2RlIF9NUEZSX1BST1RPKChtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgbXBmcl9ybmRfdCBtcGZyX2dldF9kZWZhdWx0X3JvdW5kaW5nX21vZGUgX01QRlJfUFJPVE8oKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBfX2dtcF9jb25zdCBjaGFyICoKKyAgIG1wZnJfcHJpbnRfcm5kX21vZGUgX01QRlJfUFJPVE8oKG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9jbGVhcl9mbGFncyBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfY2xlYXJfdW5kZXJmbG93IF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9jbGVhcl9vdmVyZmxvdyBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfY2xlYXJfZGl2YnkwIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9jbGVhcl9uYW5mbGFnIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9jbGVhcl9pbmV4ZmxhZyBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfY2xlYXJfZXJhbmdlZmxhZyBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKKworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfdW5kZXJmbG93IF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfb3ZlcmZsb3cgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX3NldF9kaXZieTAgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX3NldF9uYW5mbGFnIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfaW5leGZsYWcgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX3NldF9lcmFuZ2VmbGFnIF9NUEZSX1BST1RPICgodm9pZCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdW5kZXJmbG93X3AgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfb3ZlcmZsb3dfcCBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kaXZieTBfcCBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9uYW5mbGFnX3AgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfaW5leGZsYWdfcCBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9lcmFuZ2VmbGFnX3AgX01QRlJfUFJPVE8gKCh2b2lkKSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9jaGVja19yYW5nZSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBpbnQsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9pbml0MiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3ByZWNfdCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9pbml0IF9NUEZSX1BST1RPICgobXBmcl9wdHIpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfY2xlYXIgX01QRlJfUFJPVE8gKChtcGZyX3B0cikpOworCitfX01QRlJfREVDTFNQRUMgdm9pZAorICBtcGZyX2luaXRzMiBfTVBGUl9QUk9UTyAoKG1wZnJfcHJlY190LCBtcGZyX3B0ciwgLi4uKSkgX19NUEZSX1NFTlRJTkVMX0FUVFI7CitfX01QRlJfREVDTFNQRUMgdm9pZAorICBtcGZyX2luaXRzIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIC4uLikpIF9fTVBGUl9TRU5USU5FTF9BVFRSOworX19NUEZSX0RFQ0xTUEVDIHZvaWQKKyAgbXBmcl9jbGVhcnMgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgLi4uKSkgX19NUEZSX1NFTlRJTkVMX0FUVFI7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9wcmVjX3JvdW5kIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfcHJlY190LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfY2FuX3JvdW5kIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfZXhwX3QsIG1wZnJfcm5kX3QsIG1wZnJfcm5kX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9wcmVjX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBtcGZyX3ByZWNfdCBtcGZyX21pbl9wcmVjIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIpKTsKKworX19NUEZSX0RFQ0xTUEVDIG1wZnJfZXhwX3QgbXBmcl9nZXRfZXhwIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zZXRfZXhwIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfZXhwX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBtcGZyX3ByZWNfdCBtcGZyX2dldF9wcmVjIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfcHJlYyBfTVBGUl9QUk9UTygobXBmcl9wdHIsIG1wZnJfcHJlY190KSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX3NldF9wcmVjX3JhdyBfTVBGUl9QUk9UTygobXBmcl9wdHIsIG1wZnJfcHJlY190KSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX3NldF9kZWZhdWx0X3ByZWMgX01QRlJfUFJPVE8oKG1wZnJfcHJlY190KSk7CitfX01QRlJfREVDTFNQRUMgbXBmcl9wcmVjX3QgbXBmcl9nZXRfZGVmYXVsdF9wcmVjIF9NUEZSX1BST1RPKCh2b2lkKSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zZXRfZCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBkb3VibGUsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zZXRfZmx0IF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGZsb2F0LCBtcGZyX3JuZF90KSk7CisjaWZkZWYgTVBGUl9XQU5UX0RFQ0lNQUxfRkxPQVRTCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2V0X2RlY2ltYWw2NCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBfRGVjaW1hbDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CisjZW5kaWYKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXRfbGQgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbG9uZyBkb3VibGUsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXRfeiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcHpfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X3pfMmV4cCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcHpfc3JjcHRyLCBtcGZyX2V4cF90LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX3NldF9uYW4gX01QRlJfUFJPVE8gKChtcGZyX3B0cikpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfaW5mIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGludCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfemVybyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBpbnQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXRfZiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfZ2V0X2YgX01QRlJfUFJPVE8gKChtcGZfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NldF9zaSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBsb25nLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIHVuc2lnbmVkIGxvbmcsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXRfc2lfMmV4cCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBsb25nLCBtcGZyX2V4cF90LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X3VpXzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3B0cix1bnNpZ25lZCBsb25nLG1wZnJfZXhwX3QsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludAorICBtcGZyX3NldF9xIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wcV9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXRfc3RyIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIF9fZ21wX2NvbnN0IGNoYXIgKiwgaW50LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfaW5pdF9zZXRfc3RyIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIF9fZ21wX2NvbnN0IGNoYXIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXQ0IF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90LCBpbnQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9hYnMgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXQgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9uZWcgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zaWduYml0IF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXRzaWduIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBpbnQsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9jb3B5c2lnbiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIG1wZnJfZXhwX3QgbXBmcl9nZXRfel8yZXhwIF9NUEZSX1BST1RPICgobXB6X3B0ciwgbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBmbG9hdCBtcGZyX2dldF9mbHQgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGRvdWJsZSBtcGZyX2dldF9kIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKyNpZmRlZiBNUEZSX1dBTlRfREVDSU1BTF9GTE9BVFMKK19fTVBGUl9ERUNMU1BFQyBfRGVjaW1hbDY0IG1wZnJfZ2V0X2RlY2ltYWw2NCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CisjZW5kaWYKK19fTVBGUl9ERUNMU1BFQyBsb25nIGRvdWJsZSBtcGZyX2dldF9sZCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGRvdWJsZSBtcGZyX2dldF9kMSBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgZG91YmxlIG1wZnJfZ2V0X2RfMmV4cCBfTVBGUl9QUk9UTyAoKGxvbmcqLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGxvbmcgZG91YmxlIG1wZnJfZ2V0X2xkXzJleHAgX01QRlJfUFJPVE8gKChsb25nKiwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9mcmV4cCBfTVBGUl9QUk9UTyAoKG1wZnJfZXhwX3QqLCBtcGZyX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgbG9uZyBtcGZyX2dldF9zaSBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBtcGZyX2dldF91aSBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgY2hhciptcGZyX2dldF9zdHIgX01QRlJfUFJPVE8gKChjaGFyKiwgbXBmcl9leHBfdCosIGludCwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9nZXRfeiBfTVBGUl9QUk9UTyAoKG1wel9wdHIgeiwgbXBmcl9zcmNwdHIgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9mcmVlX3N0ciBfTVBGUl9QUk9UTyAoKGNoYXIgKikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdXJhbmRvbSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBnbXBfcmFuZHN0YXRlX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9ncmFuZG9tIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfcHRyLCBnbXBfcmFuZHN0YXRlX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl91cmFuZG9tYiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBnbXBfcmFuZHN0YXRlX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9uZXh0YWJvdmUgX01QRlJfUFJPVE8gKChtcGZyX3B0cikpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9uZXh0YmVsb3cgX01QRlJfUFJPVE8gKChtcGZyX3B0cikpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9uZXh0dG93YXJkIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyKSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9wcmludGYgX01QRlJfUFJPVE8gKChfX2dtcF9jb25zdCBjaGFyKiwgLi4uKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYXNwcmludGYgX01QRlJfUFJPVE8gKChjaGFyKiosIF9fZ21wX2NvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc3ByaW50ZiBfTVBGUl9QUk9UTyAoKGNoYXIqLCBfX2dtcF9jb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc25wcmludGYgX01QRlJfUFJPVE8gKChjaGFyKiwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbXBfY29uc3QgY2hhciosIC4uLikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcG93IF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcG93X3NpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaW50LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcG93X3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdWlfcG93X3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl91aV9wb3cgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9wb3dfeiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wel9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NxcnQgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zcXJ0X3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIHVuc2lnbmVkIGxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9yZWNfc3FydCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2FkZCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3N1YiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX211bCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2RpdiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYWRkX3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zdWJfdWkgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZywgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3VpX3N1YiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCB1bnNpZ25lZCBsb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbXVsX3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kaXZfdWkgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZywgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3VpX2RpdiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCB1bnNpZ25lZCBsb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hZGRfc2kgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBpbnQsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zdWJfc2kgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBpbnQsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zaV9zdWIgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbG9uZyBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9tdWxfc2kgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBpbnQsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kaXZfc2kgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBpbnQsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zaV9kaXYgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbG9uZyBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2FkZF9kIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3N1Yl9kIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2Rfc3ViIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGRvdWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX211bF9kIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2Rpdl9kIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2RfZGl2IF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGRvdWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc3FyIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NvbnN0X3BpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jb25zdF9sb2cyIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jb25zdF9ldWxlciBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY29uc3RfY2F0YWxhbiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hZ20gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2xvZyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbG9nMiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9sb2cxMCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9sb2cxcCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2V4cCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZXhwMiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9leHAxMCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9leHBtMSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9laW50IF9NUEZSX1BST1RPICgobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2xpMiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NtcCAgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXAzIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyLCBpbnQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXBfZCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBkb3VibGUpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXBfbGQgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbG9uZyBkb3VibGUpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXBhYnMgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXBfdWkgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgdW5zaWduZWQgbG9uZykpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NtcF9zaSBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBsb25nKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wX3VpXzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgdW5zaWduZWQgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfZXhwX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXBfc2lfMmV4cCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBsb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9leHBfdCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9yZWxkaWZmIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9lcSBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2duIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX211bF8yZXhwIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZywgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2Rpdl8yZXhwIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZywgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX211bF8ydWkgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kaXZfMnVpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbXVsXzJzaSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZywgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2Rpdl8yc2kgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3JpbnQgX01QRlJfUFJPVE8oKG1wZnJfcHRyLG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcm91bmQgX01QRlJfUFJPVE8oKG1wZnJfcHRyLCBtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3RydW5jIF9NUEZSX1BST1RPKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jZWlsIF9NUEZSX1BST1RPKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9mbG9vciBfTVBGUl9QUk9UTygobXBmcl9wdHIsIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcmludF9yb3VuZCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3JpbnRfdHJ1bmMgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9yaW50X2NlaWwgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3JpbnRfZmxvb3IgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9mcmFjIF9NUEZSX1BST1RPICgobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX21vZGYgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcmVtcXVvIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGxvbmcqLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3JlbWFpbmRlciBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2Ztb2QgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ZpdHNfdWxvbmdfcCBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9maXRzX3Nsb25nX3AgX01QRlJfUFJPVE8oKG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZml0c191aW50X3AgX01QRlJfUFJPVE8oKG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZml0c19zaW50X3AgX01QRlJfUFJPVE8oKG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZml0c191c2hvcnRfcCBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9maXRzX3NzaG9ydF9wIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ZpdHNfdWludG1heF9wIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZml0c19pbnRtYXhfcCBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9leHRyYWN0IF9NUEZSX1BST1RPICgobXB6X3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfc3dhcCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3B0cikpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9kdW1wIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX25hbl9wIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2luZl9wIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX251bWJlcl9wIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ludGVnZXJfcCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfemVyb19wIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9yZWd1bGFyX3AgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0cikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZ3JlYXRlcl9wIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZ3JlYXRlcmVxdWFsX3AgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbGVzc19wIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbGVzc2VxdWFsX3AgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9sZXNzZ3JlYXRlcl9wIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0cixtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2VxdWFsX3AgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl91bm9yZGVyZWRfcCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0cikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYXRhbmggX01QRlJfUFJPVE8oKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hY29zaCBfTVBGUl9QUk9UTygobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2FzaW5oIF9NUEZSX1BST1RPKChtcGZyX3B0cixtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY29zaCBfTVBGUl9QUk9UTygobXBmcl9wdHIsbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zaW5oIF9NUEZSX1BST1RPKChtcGZyX3B0cixtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3RhbmggX01QRlJfUFJPVE8oKG1wZnJfcHRyLG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2luaF9jb3NoIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2VjaCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY3NjaCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY290aCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hY29zIF9NUEZSX1BST1RPICgobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2FzaW4gX01QRlJfUFJPVE8gKChtcGZyX3B0cixtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYXRhbiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zaW4gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3Npbl9jb3MgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY29zIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl90YW4gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2F0YW4yIF9NUEZSX1BST1RPICgobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2VjIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jc2MgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NvdCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9oeXBvdCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZXJmIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9lcmZjIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jYnJ0IF9NUEZSX1BST1RPICgobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3Jvb3QgX01QRlJfUFJPVE8gKChtcGZyX3B0cixtcGZyX3NyY3B0cix1bnNpZ25lZCBsb25nLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9nYW1tYSBfTVBGUl9QUk9UTygobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2xuZ2FtbWEgX01QRlJfUFJPVE8oKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9sZ2FtbWEgX01QRlJfUFJPVE8oKG1wZnJfcHRyLGludCosbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2RpZ2FtbWEgX01QRlJfUFJPVE8oKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl96ZXRhIF9NUEZSX1BST1RPICgobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3pldGFfdWkgX01QRlJfUFJPVE8gKChtcGZyX3B0cix1bnNpZ25lZCBsb25nLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9mYWNfdWkgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2owIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfajEgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9qbiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBsb25nLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl95MCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3kxIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfeW4gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbG9uZywgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9haSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbWluIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbWF4IF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZGltIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9tdWxfeiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wel9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kaXZfeiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wel9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hZGRfeiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wel9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zdWJfeiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wel9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl96X3N1YiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcHpfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXBfeiBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9tdWxfcSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wcV9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kaXZfcSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wcV9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hZGRfcSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wcV9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zdWJfcSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wcV9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXBfcSBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcHFfc3JjcHRyKSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXBfZiBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcGZfc3JjcHRyKSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9mbWEgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZm1zIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3N1bSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3B0ciAqX19nbXBfY29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZywgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX2ZyZWVfY2FjaGUgX01QRlJfUFJPVE8gKCh2b2lkKSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgIG1wZnJfc3Vibm9ybWFsaXplIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50ICBtcGZyX3N0cnRvZnIgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgX19nbXBfY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKiwgaW50LCBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBzaXplX3QgbXBmcl9jdXN0b21fZ2V0X3NpemUgICBfTVBGUl9QUk9UTyAoKG1wZnJfcHJlY190KSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCAgIG1wZnJfY3VzdG9tX2luaXQgICAgX01QRlJfUFJPVE8gKCh2b2lkICosIG1wZnJfcHJlY190KSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCAqIG1wZnJfY3VzdG9tX2dldF9zaWduaWZpY2FuZCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgbXBmcl9leHBfdCBtcGZyX2N1c3RvbV9nZXRfZXhwICBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCAgIG1wZnJfY3VzdG9tX21vdmUgICAgICAgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgdm9pZCAqKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCAgIG1wZnJfY3VzdG9tX2luaXRfc2V0ICAgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9leHBfdCwgbXBmcl9wcmVjX3QsIHZvaWQgKikpOworX19NUEZSX0RFQ0xTUEVDIGludCAgICBtcGZyX2N1c3RvbV9nZXRfa2luZCAgIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIpKTsKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKy8qIERlZmluZSBNUEZSX1VTRV9FWFRFTlNJT04gdG8gYXZvaWQgImdjYyAtcGVkYW50aWMiIHdhcm5pbmdzLiAqLworI2lmbmRlZiBNUEZSX0VYVEVOU0lPTgorIyBpZiBkZWZpbmVkKE1QRlJfVVNFX0VYVEVOU0lPTikKKyMgIGRlZmluZSBNUEZSX0VYVEVOU0lPTiBfX2V4dGVuc2lvbl9fCisjIGVsc2UKKyMgIGRlZmluZSBNUEZSX0VYVEVOU0lPTgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFdhcm5pbmchIFRoaXMgbWFjcm8gZG9lc24ndCB3b3JrIHdpdGggSyZSIEMgKGUuZy4sIGNvbXBhcmUgdGhlICJnY2MgLUUiCisgICBvdXRwdXQgd2l0aCBhbmQgd2l0aG91dCAtdHJhZGl0aW9uYWwpIGFuZCBzaG91bGRuJ3QgYmUgdXNlZCBpbnRlcm5hbGx5LgorICAgRm9yIHB1YmxpYyB1c2Ugb25seSwgYnV0IHNlZSB0aGUgTVBGUiBtYW51YWwuICovCisjZGVmaW5lIE1QRlJfREVDTF9JTklUKF94LCBfcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNUEZSX0VYVEVOU0lPTiBtcF9saW1iX3QgX19nbXBmcl9sb2NhbF90YWJfIyNfeFsoKF9wKS0xKS9HTVBfTlVNQl9CSVRTKzFdOyBcCisgIE1QRlJfRVhURU5TSU9OIG1wZnJfdCBfeCA9IHt7KF9wKSwxLF9fTVBGUl9FWFBfTkFOLF9fZ21wZnJfbG9jYWxfdGFiXyMjX3h9fQorCisvKiBGYXN0IGFjY2VzcyBtYWNyb3MgdG8gcmVwbGFjZSBmdW5jdGlvbiBpbnRlcmZhY2UuCisgICBJZiB0aGUgVVNFUiBkb24ndCB3YW50IHRvIHVzZSB0aGUgbWFjcm8gaW50ZXJmYWNlLCBsZXQgaGltIG1ha2UgaGFwcHkKKyAgIGV2ZW4gaWYgaXQgcHJvZHVjZXMgZmFzdGVyIGFuZCBzbWFsbGVyIGNvZGUuICovCisjaWZuZGVmIE1QRlJfVVNFX05PX01BQ1JPCisKKy8qIElubGluaW5nIHRoZXNlcyBmdW5jdGlvbnMgaXMgYm90aCBmYXN0ZXIgYW5kIHNtYWxsZXIgKi8KKyNkZWZpbmUgbXBmcl9uYW5fcChfeCkgICAgICAoKF94KS0+X21wZnJfZXhwID09IF9fTVBGUl9FWFBfTkFOKQorI2RlZmluZSBtcGZyX2luZl9wKF94KSAgICAgICgoX3gpLT5fbXBmcl9leHAgPT0gX19NUEZSX0VYUF9JTkYpCisjZGVmaW5lIG1wZnJfemVyb19wKF94KSAgICAgKChfeCktPl9tcGZyX2V4cCA9PSBfX01QRlJfRVhQX1pFUk8pCisjZGVmaW5lIG1wZnJfcmVndWxhcl9wKF94KSAgKChfeCktPl9tcGZyX2V4cCA+ICBfX01QRlJfRVhQX0lORikKKyNkZWZpbmUgbXBmcl9zZ24oX3gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoX3gpLT5fbXBmcl9leHAgPCBfX01QRlJfRVhQX0lORiA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKG1wZnJfbmFuX3AgKF94KSA/IG1wZnJfc2V0X2VyYW5nZWZsYWcgKCkgOiAobXBmcl92b2lkKSAwKSwgMCA6IFwKKyAgIE1QRlJfU0lHTiAoX3gpKQorCisvKiBQcmV2ZW50IHRoZW0gZnJvbSB1c2luZyBhcyBsdmFsdWVzICovCisjZGVmaW5lIE1QRlJfVkFMVUVfT0YoeCkgICgwID8gKHgpIDogKHgpKQorI2RlZmluZSBtcGZyX2dldF9wcmVjKF94KSBNUEZSX1ZBTFVFX09GKChfeCktPl9tcGZyX3ByZWMpCisjZGVmaW5lIG1wZnJfZ2V0X2V4cChfeCkgIE1QRlJfVkFMVUVfT0YoKF94KS0+X21wZnJfZXhwKQorLyogTm90ZTogaWYgbmVlZCBiZSwgdGhlIE1QRlJfVkFMVUVfT0YgY2FuIGJlIHVzZWQgZm9yIG90aGVyIGV4cHJlc3Npb25zCisgICAob2YgYW55IHR5cGUpLiBUaGFua3MgdG8gV29qdGVrIExlcmNoIGFuZCBUaW0gUmVudHNjaCBmb3IgdGhlIGlkZWEuICovCisKKyNkZWZpbmUgbXBmcl9yb3VuZChhLGIpIG1wZnJfcmludCgoYSksIChiKSwgTVBGUl9STkROQSkKKyNkZWZpbmUgbXBmcl90cnVuYyhhLGIpIG1wZnJfcmludCgoYSksIChiKSwgTVBGUl9STkRaKQorI2RlZmluZSBtcGZyX2NlaWwoYSxiKSAgbXBmcl9yaW50KChhKSwgKGIpLCBNUEZSX1JORFUpCisjZGVmaW5lIG1wZnJfZmxvb3IoYSxiKSBtcGZyX3JpbnQoKGEpLCAoYiksIE1QRlJfUk5ERCkKKworI2RlZmluZSBtcGZyX2NtcF91aShiLGkpIG1wZnJfY21wX3VpXzJleHAoKGIpLChpKSwwKQorI2RlZmluZSBtcGZyX2NtcF9zaShiLGkpIG1wZnJfY21wX3NpXzJleHAoKGIpLChpKSwwKQorI2RlZmluZSBtcGZyX3NldChhLGIscikgIG1wZnJfc2V0NChhLGIscixNUEZSX1NJR04oYikpCisjZGVmaW5lIG1wZnJfYWJzKGEsYixyKSAgbXBmcl9zZXQ0KGEsYixyLDEpCisjZGVmaW5lIG1wZnJfY29weXNpZ24oYSxiLGMscikgbXBmcl9zZXQ0KGEsYixyLE1QRlJfU0lHTihjKSkKKyNkZWZpbmUgbXBmcl9zZXRzaWduKGEsYixzLHIpIG1wZnJfc2V0NChhLGIsciwocykgPyAtMSA6IDEpCisjZGVmaW5lIG1wZnJfc2lnbmJpdCh4KSAgKE1QRlJfU0lHTih4KSA8IDApCisjZGVmaW5lIG1wZnJfY21wKGIsIGMpICAgbXBmcl9jbXAzKGIsIGMsIDEpCisjZGVmaW5lIG1wZnJfbXVsXzJleHAoeSx4LG4scikgbXBmcl9tdWxfMnVpKCh5KSwoeCksKG4pLChyKSkKKyNkZWZpbmUgbXBmcl9kaXZfMmV4cCh5LHgsbixyKSBtcGZyX2Rpdl8ydWkoKHkpLCh4KSwobiksKHIpKQorCisKKy8qIFdoZW4gdXNpbmcgR0NDLCBvcHRpbWl6ZSBjZXJ0YWluIGNvbW1vbiBjb21wYXJpc29ucyBhbmQgYWZmZWN0YXRpb25zLgorICAgKyBSZW1vdmUgSUNDIHNpbmNlIGl0IGRlZmluZXMgX19HTlVDX18gYnV0IHByb2R1Y2VzIGEKKyAgICAgaHVnZSBudW1iZXIgb2Ygd2FybmluZ3MgaWYgeW91IHVzZSB0aGlzIGNvZGUuCisgICAgIFZMOiBJIGNvdWxkbid0IHJlcHJvZHVjZSBhIHNpbmdsZSB3YXJuaW5nIHdoZW4gZW5hYmxpbmcgdGhlc2UgbWFjcm9zCisgICAgIHdpdGggaWNjIDEwLjEgMjAwODAyMTIgb24gSXRhbml1bS4gQnV0IHdpdGggdGhpcyB2ZXJzaW9uLCBfX0lDQyBpc24ndAorICAgICBkZWZpbmVkIChfX0lOVEVMX0NPTVBJTEVSIGlzLCB0aG91Z2gpLCBzbyB0aGF0IHRoZXNlIG1hY3JvcyBhcmUgZW5hYmxlZAorICAgICBhbnl3YXkuIENoZWNraW5nIHdpdGggb3RoZXIgSUNDIHZlcnNpb25zIGlzIG5lZWRlZC4gUG9zc2libHkgZGV0ZWN0CisgICAgIHdoZXRoZXIgd2FybmluZ3MgYXJlIHByb2R1Y2VkIG9yIG5vdCB3aXRoIGEgY29uZmlndXJlIHRlc3QuCisgICArIFJlbW92ZSBDKysgdG9vLCBzaW5jZSBpdCBjb21wbGFpbnMgdG9vIG11Y2guICovCisvKiBBZGRlZCBjYXN0cyB0byBpbXByb3ZlIHJvYnVzdG5lc3MgaW4gY2FzZSBvZiB1bmRlZmluZWQgYmVoYXZpb3IgYW5kCisgICBjb21waWxlciBleHRlbnNpb25zIGJhc2VkIG9uIFVCIChpbiBwYXJ0aWN1bGFyIC1md3JhcHYpLiBNUEZSIGRvZXNuJ3QKKyAgIHVzZSBzdWNoIGV4dGVuc2lvbnMsIGJ1dCB0aGVzZSBtYWNyb3Mgd2lsbCBiZSB1c2VkIGJ5IDNyZC1wYXJ0eSBjb2RlLAorICAgd2hlcmUgc3VjaCBleHRlbnNpb25zIG1heSBiZSByZXF1aXJlZC4KKyAgIE1vcmVvdmVyIGNhc3RzIHRvIHVuc2lnbmVkIGxvbmcgaGF2ZSBiZWVuIGFkZGVkIHRvIGF2b2lkIHdhcm5pbmdzIGluCisgICBwcm9ncmFtcyB0aGF0IHVzZSBNUEZSIGFuZCBhcmUgY29tcGlsZWQgd2l0aCAtV2NvbnZlcnNpb247IHN1Y2ggY2FzdHMKKyAgIGFyZSBPSyBzaW5jZSBpZiBYIGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiwgdGhlbiAodW5zaWduZWQgbG9uZykgWCBpcworICAgYWxzbyBhIGNvbnN0YW50IGV4cHJlc3Npb24sIHNvIHRoYXQgdGhlIG9wdGltaXphdGlvbnMgc3RpbGwgd29yay4gVGhlCisgICB3YXJuaW5ncyBhcmUgcHJvYmFibHkgcmVsYXRlZCB0byB0aGUgZm9sbG93aW5nIHR3byBidWdzOgorICAgICBodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQyMTAKKyAgICAgaHR0cDovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zODQ3MCAocG9zc2libHkgYSB2YXJpYW50KQorICAgYW5kIHRoZSBjYXN0cyBjb3VsZCBiZSByZW1vdmVkIG9uY2UgdGhlc2UgYnVncyBhcmUgZml4ZWQuCisgICBDYXN0cyBzaG91bGRuJ3QgYmUgdXNlZCBvbiB0aGUgZ2VuZXJpYyBjYWxscyAodG8gdGhlIC4uLl8yZXhwIGZ1bmN0aW9ucyksCisgICB3aGVyZSBpbXBsaWNpdCBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLiBJbmRlZWQsIGhhdmluZyBhdCBsZWFzdCBvbmUKKyAgIGltcGxpY2l0IGNvbnZlcnNpb24gaW4gdGhlIG1hY3JvIGFsbG93cyB0aGUgY29tcGlsZXIgdG8gZW1pdCBkaWFnbm9zdGljcworICAgd2hlbiBub3JtYWxseSBleHBlY3RlZCwgZm9yIGluc3RhbmNlIGluIHRoZSBmb2xsb3dpbmcgY2FsbDoKKyAgICAgbXBmcl9zZXRfdWkgKHgsICJmb28iLCBNUEZSX1JORE4pOworICAgSWYgdGhpcyBpcyBub3QgcG9zc2libGUgKGZvciBmdXR1cmUgbWFjcm9zKSwgb25lIG9mIHRoZSB0cmlja3MgZGVzY3JpYmVkCisgICBvbiBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvY29tcC5zdGQuYy9tc2cvZTkyYWJkMjRiZjllYWY3YiBjb3VsZAorICAgYmUgdXNlZC4gKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19JQ0MpICYmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2lmIChfX0dOVUNfXyA+PSAyKQorI3VuZGVmIG1wZnJfY21wX3VpCisvKiBXZSB1c2UgdGhlIGZhY3QgdGhhdCBtcGZyX3NnbiBvbiBOYU4gc2V0cyB0aGUgZXJhbmdlIGZsYWcgYW5kIHJldHVybnMgMC4KKyAgIEJ1dCB3YXJuaW5nISBtcGZyX3NnbiBpcyBzcGVjaWZpZWQgYXMgYSBtYWNybyBpbiB0aGUgQVBJLCB0aHVzIHRoZSBtYWNybworICAgbXVzdG4ndCBiZSB1c2VkIGlmIHNpZGUgZWZmZWN0cyBhcmUgcG9zc2libGUsIGxpa2UgaGVyZS4gKi8KKyNkZWZpbmUgbXBmcl9jbXBfdWkoX2YsX3UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX3UpICYmIChtcGZyX3Vsb25nKSAoX3UpID09IDAgPyAgICAgICAgXAorICAgKG1wZnJfc2duKSAoX2YpIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIG1wZnJfY21wX3VpXzJleHAgKChfZiksIChfdSksIDApKQorI3VuZGVmIG1wZnJfY21wX3NpCisjZGVmaW5lIG1wZnJfY21wX3NpKF9mLF9zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoX19idWlsdGluX2NvbnN0YW50X3AgKF9zKSAmJiAobXBmcl9sb25nKSAoX3MpID49IDAgPyAgICAgICAgIFwKKyAgIG1wZnJfY21wX3VpICgoX2YpLCAobXBmcl91bG9uZykgKG1wZnJfbG9uZykgKF9zKSkgOiAgICAgICAgICBcCisgICBtcGZyX2NtcF9zaV8yZXhwICgoX2YpLCAoX3MpLCAwKSkKKyNpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gOTUKKyN1bmRlZiBtcGZyX3NldF91aQorI2RlZmluZSBtcGZyX3NldF91aShfZixfdSxfcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfdSkgJiYgKG1wZnJfdWxvbmcpIChfdSkgPT0gMCA/ICAgICAgICBcCisgICBfX2V4dGVuc2lvbl9fICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIG1wZnJfcHRyIF9wID0gKF9mKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBfcC0+X21wZnJfc2lnbiA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX3AtPl9tcGZyX2V4cCA9IF9fTVBGUl9FWFBfWkVSTzsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChtcGZyX3ZvaWQpIChfcik7IDA7IH0pIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIG1wZnJfc2V0X3VpXzJleHAgKChfZiksIChfdSksIDAsIChfcikpKQorI2VuZGlmCisjdW5kZWYgbXBmcl9zZXRfc2kKKyNkZWZpbmUgbXBmcl9zZXRfc2koX2YsX3MsX3IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX3MpICYmIChtcGZyX2xvbmcpIChfcykgPj0gMCA/ICAgICAgICAgXAorICAgbXBmcl9zZXRfdWkgKChfZiksIChtcGZyX3Vsb25nKSAobXBmcl9sb25nKSAoX3MpLCAoX3IpKSA6ICAgIFwKKyAgIG1wZnJfc2V0X3NpXzJleHAgKChfZiksIChfcyksIDAsIChfcikpKQorI2VuZGlmCisjZW5kaWYKKworLyogTWFjcm8gdmVyc2lvbiBvZiBtcGZyX3N0YWNrIGludGVyZmFjZSBmb3IgZmFzdCBhY2Nlc3MgKi8KKyNkZWZpbmUgbXBmcl9jdXN0b21fZ2V0X3NpemUocCkgKChtcGZyX3NpemVfdCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoKChwKStHTVBfTlVNQl9CSVRTLTEpL0dNUF9OVU1CX0JJVFMqc2l6ZW9mIChtcF9saW1iX3QpKSkKKyNkZWZpbmUgbXBmcl9jdXN0b21faW5pdChtLHApIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBtcGZyX2N1c3RvbV9nZXRfc2lnbmlmaWNhbmQoeCkgKChtcGZyX3ZvaWQqKSgoeCktPl9tcGZyX2QpKQorI2RlZmluZSBtcGZyX2N1c3RvbV9nZXRfZXhwKHgpICgoeCktPl9tcGZyX2V4cCkKKyNkZWZpbmUgbXBmcl9jdXN0b21fbW92ZSh4LG0pIGRvIHsgKCh4KS0+X21wZnJfZCA9IChtcF9saW1iX3QqKShtKSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIG1wZnJfY3VzdG9tX2luaXRfc2V0KHgsayxlLHAsbSkgZG8geyAgICAgICAgICAgICAgICAgICBcCisgIG1wZnJfcHRyIF94ID0gKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1wZnJfZXhwX3QgX2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1wZnJfa2luZF90IF90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1wZnJfaW50IF9zLCBfazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9rID0gKGspOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChfayA+PSAwKSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3QgPSAobXBmcl9raW5kX3QpIF9rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3MgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3QgPSAobXBmcl9raW5kX3QpIC1rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3MgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9lID0gX3QgPT0gTVBGUl9SRUdVTEFSX0tJTkQgPyAoZSkgOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3QgPT0gTVBGUl9OQU5fS0lORCA/IF9fTVBGUl9FWFBfTkFOIDogICAgICAgICAgICAgICAgICAgICBcCisgICAgX3QgPT0gTVBGUl9JTkZfS0lORCA/IF9fTVBGUl9FWFBfSU5GIDogX19NUEZSX0VYUF9aRVJPOyAgICBcCisgIF94LT5fbXBmcl9wcmVjID0gKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF94LT5fbXBmcl9zaWduID0gX3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF94LT5fbXBmcl9leHAgID0gX2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF94LT5fbXBmcl9kICAgID0gKG1wX2xpbWJfdCopIChtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbXBmcl9jdXN0b21fZ2V0X2tpbmQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAoeCktPl9tcGZyX2V4cCA+ICBfX01QRlJfRVhQX0lORiA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobXBmcl9pbnQpIE1QRlJfUkVHVUxBUl9LSU5EICogTVBGUl9TSUdOICh4KSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgOiAoeCktPl9tcGZyX2V4cCA9PSBfX01QRlJfRVhQX0lORiA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobXBmcl9pbnQpIE1QRlJfSU5GX0tJTkQgKiBNUEZSX1NJR04gKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgOiAoeCktPl9tcGZyX2V4cCA9PSBfX01QRlJfRVhQX05BTiA/IChtcGZyX2ludCkgTVBGUl9OQU5fS0lORCAgICAgICAgIFwKKyAgOiAobXBmcl9pbnQpIE1QRlJfWkVST19LSU5EICogTVBGUl9TSUdOICh4KSApCisKKworI2VuZGlmIC8qIE1QRlJfVVNFX05PX01BQ1JPICovCisKKy8qIFRoZXNlcyBhcmUgZGVmaW5lZCB0byBiZSBtYWNyb3MgKi8KKyNkZWZpbmUgbXBmcl9pbml0X3NldF9zaSh4LCBpLCBybmQpIFwKKyAoIG1wZnJfaW5pdCh4KSwgbXBmcl9zZXRfc2koKHgpLCAoaSksIChybmQpKSApCisjZGVmaW5lIG1wZnJfaW5pdF9zZXRfdWkoeCwgaSwgcm5kKSBcCisgKCBtcGZyX2luaXQoeCksIG1wZnJfc2V0X3VpKCh4KSwgKGkpLCAocm5kKSkgKQorI2RlZmluZSBtcGZyX2luaXRfc2V0X2QoeCwgZCwgcm5kKSBcCisgKCBtcGZyX2luaXQoeCksIG1wZnJfc2V0X2QoKHgpLCAoZCksIChybmQpKSApCisjZGVmaW5lIG1wZnJfaW5pdF9zZXRfbGQoeCwgZCwgcm5kKSBcCisgKCBtcGZyX2luaXQoeCksIG1wZnJfc2V0X2xkKCh4KSwgKGQpLCAocm5kKSkgKQorI2RlZmluZSBtcGZyX2luaXRfc2V0X3ooeCwgaSwgcm5kKSBcCisgKCBtcGZyX2luaXQoeCksIG1wZnJfc2V0X3ooKHgpLCAoaSksIChybmQpKSApCisjZGVmaW5lIG1wZnJfaW5pdF9zZXRfcSh4LCBpLCBybmQpIFwKKyAoIG1wZnJfaW5pdCh4KSwgbXBmcl9zZXRfcSgoeCksIChpKSwgKHJuZCkpICkKKyNkZWZpbmUgbXBmcl9pbml0X3NldCh4LCB5LCBybmQpIFwKKyAoIG1wZnJfaW5pdCh4KSwgbXBmcl9zZXQoKHgpLCAoeSksIChybmQpKSApCisjZGVmaW5lIG1wZnJfaW5pdF9zZXRfZih4LCB5LCBybmQpIFwKKyAoIG1wZnJfaW5pdCh4KSwgbXBmcl9zZXRfZigoeCksICh5KSwgKHJuZCkpICkKKworLyogQ29tcGF0aWJpbGl0eSBsYXllciAtLSBvYnNvbGV0ZSBmdW5jdGlvbnMgYW5kIG1hY3JvcyAqLworLyogTm90ZTogaXQgaXMgbm90IHBvc3NpYmxlIHRvIG91dHB1dCB3YXJuaW5ncywgdW5sZXNzIG9uZSBkZWZpbmVzCisgKiBhIGRlcHJlY2F0ZWQgdmFyaWFibGUgYW5kIHVzZXMgaXQsIGUuZy4KKyAqICAgTVBGUl9ERVBSRUNBVEVEIGV4dGVybiBpbnQgbXBmcl9kZXByZWNhdGVkX2ZlYXR1cmU7CisgKiAgICNkZWZpbmUgTVBGUl9FTUlOX01JTiAoKHZvaWQpbXBmcl9kZXByZWNhdGVkX2ZlYXR1cmUsbXBmcl9nZXRfZW1pbl9taW4oKSkKKyAqICh0aGUgY2FzdCB0byB2b2lkIGF2b2lkcyBhIHdhcm5pbmcgYmVjYXVzZSB0aGUgbGVmdC1oYW5kIG9wZXJhbmQKKyAqIGhhcyBubyBlZmZlY3QpLgorICovCisjZGVmaW5lIG1wZnJfY21wX2FicyBtcGZyX2NtcGFicworI2RlZmluZSBtcGZyX3JvdW5kX3ByZWMoeCxyLHApIG1wZnJfcHJlY19yb3VuZCh4LHAscikKKyNkZWZpbmUgX19nbXBfZGVmYXVsdF9yb3VuZGluZ19tb2RlIChtcGZyX2dldF9kZWZhdWx0X3JvdW5kaW5nX21vZGUoKSkKKyNkZWZpbmUgX19tcGZyX2VtaW4gKG1wZnJfZ2V0X2VtaW4oKSkKKyNkZWZpbmUgX19tcGZyX2VtYXggKG1wZnJfZ2V0X2VtYXgoKSkKKyNkZWZpbmUgX19tcGZyX2RlZmF1bHRfZnBfYml0X3ByZWNpc2lvbiAobXBmcl9nZXRfZGVmYXVsdF9mcF9iaXRfcHJlY2lzaW9uKCkpCisjZGVmaW5lIE1QRlJfRU1JTl9NSU4gbXBmcl9nZXRfZW1pbl9taW4oKQorI2RlZmluZSBNUEZSX0VNSU5fTUFYIG1wZnJfZ2V0X2VtaW5fbWF4KCkKKyNkZWZpbmUgTVBGUl9FTUFYX01JTiBtcGZyX2dldF9lbWF4X21pbigpCisjZGVmaW5lIE1QRlJfRU1BWF9NQVggbXBmcl9nZXRfZW1heF9tYXgoKQorI2RlZmluZSBtcGZyX3ZlcnNpb24gKG1wZnJfZ2V0X3ZlcnNpb24oKSkKKyNpZm5kZWYgbXB6X3NldF9mcgorIyBkZWZpbmUgbXB6X3NldF9mciBtcGZyX2dldF96CisjZW5kaWYKKyNkZWZpbmUgbXBmcl9hZGRfb25lX3VscCh4LHIpIFwKKyAobXBmcl9zZ24gKHgpID4gMCA/IG1wZnJfbmV4dGFib3ZlICh4KSA6IG1wZnJfbmV4dGJlbG93ICh4KSkKKyNkZWZpbmUgbXBmcl9zdWJfb25lX3VscCh4LHIpIFwKKyAobXBmcl9zZ24gKHgpID4gMCA/IG1wZnJfbmV4dGJlbG93ICh4KSA6IG1wZnJfbmV4dGFib3ZlICh4KSkKKyNkZWZpbmUgbXBmcl9nZXRfel9leHAgbXBmcl9nZXRfel8yZXhwCisjZGVmaW5lIG1wZnJfY3VzdG9tX2dldF9tYW50aXNzYSBtcGZyX2N1c3RvbV9nZXRfc2lnbmlmaWNhbmQKKworI2VuZGlmIC8qIF9fTVBGUl9IICovCisKKworLyogQ2hlY2sgaWYgPHN0ZGludC5oPiAvIDxpbnR0eXBlcy5oPiBpcyBpbmNsdWRlZCBvciBpZiB0aGUgdXNlcgorICAgZXhwbGljaXRseSB3YW50cyBpbnRtYXhfdC4gQXV0b21hdGljYWwgZGV0ZWN0aW9uIGlzIGRvbmUgYnkKKyAgIGNoZWNraW5nOgorICAgICAtIElOVE1BWF9DIGFuZCBVSU5UTUFYX0MsIGJ1dCBub3QgaWYgdGhlIGNvbXBpbGVyIGlzIGEgQysrIG9uZQorICAgICAgIChhcyBzdWdnZXN0ZWQgYnkgUGF0cmljayBQZWxpc3NpZXIpIGJlY2F1c2UgdGhlIHRlc3QgZG9lcyBub3QKKyAgICAgICB3b3JrIHdlbGwgaW4gdGhpcyBjYXNlLiBTZWU6CisgICAgICAgICBodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2FyYy9tcGZyLzIwMTAtMDIvbXNnMDAwMjUuaHRtbAorICAgICAgIFdlIGRvIG5vdCBjaGVjayBJTlRNQVhfTUFYIGFuZCBVSU5UTUFYX01BWCBiZWNhdXNlIHVuZGVyIFNvbGFyaXMsCisgICAgICAgdGhlc2UgbWFjcm9zIGFyZSBhbHdheXMgZGVmaW5lZCBieSA8bGltaXRzLmg+IChpLmUuIGV2ZW4gd2hlbgorICAgICAgIDxzdGRpbnQuaD4gYW5kIDxpbnR0eXBlcy5oPiBhcmUgbm90IGluY2x1ZGVkKS4KKyAgICAgLSBfU1RESU5UX0ggKGRlZmluZWQgYnkgdGhlIGdsaWJjKSwgX1NURElOVF9IXyAoZGVmaW5lZCB1bmRlcgorICAgICAgIE1hYyBPUyBYKSBhbmQgX1NURElOVCAoZGVmaW5lZCB1bmRlciBNUyBWaXN1YWwgU3R1ZGlvKSwgYnV0CisgICAgICAgdGhpcyB0ZXN0IG1heSBub3Qgd29yayB3aXRoIGFsbCBpbXBsZW1lbnRhdGlvbnMuCisgICAgICAgUG9ydGFibGUgc29mdHdhcmUgc2hvdWxkIG5vdCByZWx5IG9uIHRoZXNlIHRlc3RzLgorKi8KKyNpZiAoZGVmaW5lZCAoSU5UTUFYX0MpICYmIGRlZmluZWQgKFVJTlRNQVhfQykgJiYgIWRlZmluZWQoX19jcGx1c3BsdXMpKSB8fCBcCisgIGRlZmluZWQgKE1QRlJfVVNFX0lOVE1BWF9UKSB8fCBcCisgIGRlZmluZWQgKF9TVERJTlRfSCkgfHwgZGVmaW5lZCAoX1NURElOVF9IXykgfHwgZGVmaW5lZCAoX1NURElOVCkKKyMgaWZuZGVmIF9NUEZSX0hfSEFWRV9JTlRNQVhfVAorIyBkZWZpbmUgX01QRlJfSF9IQVZFX0lOVE1BWF9UIDEKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBtcGZyX3NldF9zaiBfX2dtcGZyX3NldF9zagorI2RlZmluZSBtcGZyX3NldF9zal8yZXhwIF9fZ21wZnJfc2V0X3NqXzJleHAKKyNkZWZpbmUgbXBmcl9zZXRfdWogX19nbXBmcl9zZXRfdWoKKyNkZWZpbmUgbXBmcl9zZXRfdWpfMmV4cCBfX2dtcGZyX3NldF91al8yZXhwCisjZGVmaW5lIG1wZnJfZ2V0X3NqIF9fZ21wZnJfbXBmcl9nZXRfc2oKKyNkZWZpbmUgbXBmcl9nZXRfdWogX19nbXBmcl9tcGZyX2dldF91agorX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NldF9zaiBfTVBGUl9QUk9UTyAoKG1wZnJfdCwgaW50bWF4X3QsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXRfc2pfMmV4cCBfTVBGUl9QUk9UTyAoKG1wZnJfdCwgaW50bWF4X3QsIGludG1heF90LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2V0X3VqIF9NUEZSX1BST1RPICgobXBmcl90LCB1aW50bWF4X3QsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXRfdWpfMmV4cCBfTVBGUl9QUk9UTyAoKG1wZnJfdCwgdWludG1heF90LCBpbnRtYXhfdCwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludG1heF90IG1wZnJfZ2V0X3NqIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyB1aW50bWF4X3QgbXBmcl9nZXRfdWogX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworIyBlbmRpZiAvKiBfTVBGUl9IX0hBVkVfSU5UTUFYX1QgKi8KKyNlbmRpZgorCisKKy8qIENoZWNrIGlmIDxzdGRpby5oPiBoYXMgYmVlbiBpbmNsdWRlZCBvciBpZiB0aGUgdXNlciB3YW50cyBGSUxFICovCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfRklMRSkgfHwgZGVmaW5lZCAoTVBGUl9VU0VfRklMRSkKKyMgaWZuZGVmIF9NUEZSX0hfSEFWRV9GSUxFCisjIGRlZmluZSBfTVBGUl9IX0hBVkVfRklMRSAxCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgbXBmcl9pbnBfc3RyIF9fZ21wZnJfaW5wX3N0cgorI2RlZmluZSBtcGZyX291dF9zdHIgX19nbXBmcl9vdXRfc3RyCitfX01QRlJfREVDTFNQRUMgc2l6ZV90IG1wZnJfaW5wX3N0ciBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBGSUxFKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgc2l6ZV90IG1wZnJfb3V0X3N0ciBfTVBGUl9QUk9UTyAoKEZJTEUqLCBpbnQsIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKyNkZWZpbmUgbXBmcl9mcHJpbnRmIF9fZ21wZnJfZnByaW50ZgorX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ZwcmludGYgX01QRlJfUFJPVE8gKChGSUxFKiwgX19nbXBfY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikpOworCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworIyBlbmRpZiAvKiBfTVBGUl9IX0hBVkVfRklMRSAqLworI2VuZGlmCisKKworLyogY2hlY2sgaWYgPHN0ZGFyZy5oPiBoYXMgYmVlbiBpbmNsdWRlZCBvciBpZiB0aGUgdXNlciB3YW50cyB2YV9saXN0ICovCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfVkFfTElTVCkgfHwgZGVmaW5lZCAoTVBGUl9VU0VfVkFfTElTVCkKKyMgaWZuZGVmIF9NUEZSX0hfSEFWRV9WQV9MSVNUCisjIGRlZmluZSBfTVBGUl9IX0hBVkVfVkFfTElTVCAxCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgbXBmcl92cHJpbnRmIF9fZ21wZnJfdnByaW50ZgorI2RlZmluZSBtcGZyX3Zhc3ByaW50ZiBfX2dtcGZyX3Zhc3ByaW50ZgorI2RlZmluZSBtcGZyX3ZzcHJpbnRmIF9fZ21wZnJfdnNwcmludGYKKyNkZWZpbmUgbXBmcl92c25wcmludGYgX19nbXBmcl92c25wcmludGYKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl92cHJpbnRmIF9NUEZSX1BST1RPICgoX19nbXBfY29uc3QgY2hhciosIHZhX2xpc3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl92YXNwcmludGYgX01QRlJfUFJPVE8gKChjaGFyKiosIF9fZ21wX2NvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl92c3ByaW50ZiBfTVBGUl9QUk9UTyAoKGNoYXIqLCBfX2dtcF9jb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3ZzbnByaW50ZiBfTVBGUl9QUk9UTyAoKGNoYXIqLCBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dtcF9jb25zdCBjaGFyKiwgdmFfbGlzdCkpOworCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworIyBlbmRpZiAvKiBfTVBGUl9IX0hBVkVfVkFfTElTVCAqLworI2VuZGlmCisKKworLyogY2hlY2sgaWYgPHN0ZGFyZy5oPiBoYXMgYmVlbiBpbmNsdWRlZCBhbmQgaWYgRklMRSBpcyBhdmFpbGFibGUKKyAgIChzZWUgYWJvdmUpICovCisjaWYgZGVmaW5lZCAoX01QRlJfSF9IQVZFX1ZBX0xJU1QpICYmIGRlZmluZWQgKF9NUEZSX0hfSEFWRV9GSUxFKQorIyBpZm5kZWYgX01QRlJfSF9IQVZFX1ZBX0xJU1RfRklMRQorIyBkZWZpbmUgX01QRlJfSF9IQVZFX1ZBX0xJU1RfRklMRSAxCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgbXBmcl92ZnByaW50ZiBfX2dtcGZyX3ZmcHJpbnRmCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdmZwcmludGYgX01QRlJfUFJPVE8gKChGSUxFKiwgX19nbXBfY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0KSk7CisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjIGVuZGlmIC8qIF9NUEZSX0hfSEFWRV9WQV9MSVNUX0ZJTEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGJlZ2luLm8gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvY3J0YmVnaW4ubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGM0NzY4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGJlZ2luLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGJlZ2luUy5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGJlZ2luUy5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1N2U4MDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvY3J0YmVnaW5TLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGJlZ2luVC5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGJlZ2luVC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTUxNzIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvY3J0YmVnaW5ULm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGVuZC5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGVuZC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjgwY2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvY3J0ZW5kLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGVuZFMubyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRlbmRTLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3OTQzZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRlbmRTLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGZhc3RtYXRoLm8gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvY3J0ZmFzdG1hdGgubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzYzNmI2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGZhc3RtYXRoLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydHByZWMzMi5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydHByZWMzMi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNGM1MTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvY3J0cHJlYzMyLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydHByZWM2NC5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydHByZWM2NC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjIzYjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvY3J0cHJlYzY0Lm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydHByZWM4MC5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydHByZWM4MC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzhkZmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvY3J0cHJlYzgwLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2xpYmdjYy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2xpYmdjYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Yzg5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvbGliZ2NjLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2xpYmdjY19laC5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2xpYmdjY19laC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NzRmNWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvbGliZ2NjX2VoLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2xpYmdjb3YuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9saWJnY292LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlYzQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9saWJnY292LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGJlZ2luLm8gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvY3J0YmVnaW4ubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWUwYWM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGJlZ2luLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGJlZ2luUy5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGJlZ2luUy5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZWRjOTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvY3J0YmVnaW5TLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGJlZ2luVC5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGJlZ2luVC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZGU5NDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvY3J0YmVnaW5ULm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGVuZC5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGVuZC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjVkOWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvY3J0ZW5kLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGVuZFMubyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRlbmRTLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjZTM5OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRlbmRTLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGZhc3RtYXRoLm8gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvY3J0ZmFzdG1hdGgubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjE5MjM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGZhc3RtYXRoLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydHByZWMzMi5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydHByZWMzMi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMjIwMjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvY3J0cHJlYzMyLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydHByZWM2NC5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydHByZWM2NC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiM2RkOWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvY3J0cHJlYzY0Lm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydHByZWM4MC5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydHByZWM4MC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MWQzMDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvY3J0cHJlYzgwLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUtZml4ZWQvUkVBRE1FIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUtZml4ZWQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODZhNzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS1maXhlZC9SRUFETUUKQEAgLTAsMCArMSwxNCBAQAorVGhpcyBSRUFETUUgZmlsZSBpcyBjb3BpZWQgaW50byB0aGUgZGlyZWN0b3J5IGZvciBHQ0Mtb25seSBoZWFkZXIgZmlsZXMKK3doZW4gZml4aW5jbHVkZXMgaXMgcnVuIGJ5IHRoZSBtYWtlZmlsZSBmb3IgR0NDLgorCitNYW55IG9mIHRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSB3ZXJlIGF1dG9tYXRpY2FsbHkgZWRpdGVkIGZyb20gdGhlCitzdGFuZGFyZCBzeXN0ZW0gaGVhZGVyIGZpbGVzIGJ5IHRoZSBmaXhpbmNsdWRlcyBwcm9jZXNzLiAgVGhleSBhcmUKK3N5c3RlbS1zcGVjaWZpYywgYW5kIHdpbGwgbm90IHdvcmsgb24gYW55IG90aGVyIGtpbmQgb2Ygc3lzdGVtLiAgVGhleQorYXJlIGFsc28gbm90IHBhcnQgb2YgR0NDLiAgVGhlIHJlYXNvbiB3ZSBoYXZlIHRvIGRvIHRoaXMgaXMgYmVjYXVzZQorR0NDIHJlcXVpcmVzIEFOU0kgQyBoZWFkZXJzIGFuZCBtYW55IHZlbmRvcnMgc3VwcGx5IEFOU0ktaW5jb21wYXRpYmxlCitoZWFkZXJzLgorCitCZWNhdXNlIHRoaXMgaXMgYW4gYXV0b21hdGVkIHByb2Nlc3MsIHNvbWV0aW1lcyBoZWFkZXJzIGdldCAiZml4ZWQiCit0aGF0IGRvIG5vdCwgc3RyaWN0bHkgc3BlYWtpbmcsIG5lZWQgYSBmaXguICBBcyBsb25nIGFzIG5vdGhpbmcgaXMgYnJva2VuCitieSB0aGUgcHJvY2VzcywgaXQgaXMganVzdCBhbiB1bmZvcnR1bmF0ZSBjb2xsYXRlcmFsIGluY29udmVuaWVuY2UuCitXZSB3b3VsZCBsaWtlIHRvIHJlY3RpZnkgaXQsIGlmIGl0IGlzIG5vdCAidG9vIGluY29udmVuaWVudCIuCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS1maXhlZC9saW1pdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlLWZpeGVkL2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDBhODgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS1maXhlZC9saW1pdHMuaApAQCAtMCwwICsxLDE3MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIFRoaXMgYWRtaW5pc3RyaXZpYSBnZXRzIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgbGltaXRzLmgKKyAgIGlmIHRoZSBzeXN0ZW0gaGFzIGl0cyBvd24gdmVyc2lvbiBvZiBsaW1pdHMuaC4gICovCisKKy8qIFdlIHVzZSBfR0NDX0xJTUlUU19IXyBiZWNhdXNlIHdlIHdhbnQgdGhpcyBub3QgdG8gbWF0Y2gKKyAgIGFueSBtYWNyb3MgdGhhdCB0aGUgc3lzdGVtJ3MgbGltaXRzLmggdXNlcyBmb3IgaXRzIG93biBwdXJwb3Nlcy4gICovCisjaWZuZGVmIF9HQ0NfTElNSVRTX0hfICAvKiBUZXJtaW5hdGVkIGluIGxpbWl0eS5oLiAgKi8KKyNkZWZpbmUgX0dDQ19MSU1JVFNfSF8KKworI2lmbmRlZiBfTElCQ19MSU1JVFNfSF8KKy8qIFVzZSAiLi4uIiBzbyB0aGF0IHdlIGZpbmQgc3lzbGltaXRzLmggb25seSBpbiB0aGlzIHNhbWUgZGlyZWN0b3J5LiAgKi8KKyNpbmNsdWRlICJzeXNsaW1pdHMuaCIKKyNlbmRpZgorLyogQ29weXJpZ2h0IChDKSAxOTkxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0xJTUlUU19IX19fCisjZGVmaW5lIF9MSU1JVFNfSF9fXworCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIGBjaGFyJy4gICovCisjdW5kZWYgQ0hBUl9CSVQKKyNkZWZpbmUgQ0hBUl9CSVQgX19DSEFSX0JJVF9fCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGEgbXVsdGlieXRlIGNoYXJhY3Rlci4gICovCisjaWZuZGVmIE1CX0xFTl9NQVgKKyNkZWZpbmUgTUJfTEVOX01BWCAxCisjZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGNoYXInIGNhbiBob2xkLiAgKi8KKyN1bmRlZiBTQ0hBUl9NSU4KKyNkZWZpbmUgU0NIQVJfTUlOICgtU0NIQVJfTUFYIC0gMSkKKyN1bmRlZiBTQ0hBUl9NQVgKKyNkZWZpbmUgU0NIQVJfTUFYIF9fU0NIQVJfTUFYX18KKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgY2hhcicgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwKS4gICovCisjdW5kZWYgVUNIQVJfTUFYCisjaWYgX19TQ0hBUl9NQVhfXyA9PSBfX0lOVF9NQVhfXworIyBkZWZpbmUgVUNIQVJfTUFYIChTQ0hBUl9NQVggKiAyVSArIDFVKQorI2Vsc2UKKyMgZGVmaW5lIFVDSEFSX01BWCAoU0NIQVJfTUFYICogMiArIDEpCisjZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgY2hhcicgY2FuIGhvbGQuICAqLworI2lmZGVmIF9fQ0hBUl9VTlNJR05FRF9fCisjIHVuZGVmIENIQVJfTUlOCisjIGlmIF9fU0NIQVJfTUFYX18gPT0gX19JTlRfTUFYX18KKyMgIGRlZmluZSBDSEFSX01JTiAwVQorIyBlbHNlCisjICBkZWZpbmUgQ0hBUl9NSU4gMAorIyBlbmRpZgorIyB1bmRlZiBDSEFSX01BWAorIyBkZWZpbmUgQ0hBUl9NQVggVUNIQVJfTUFYCisjZWxzZQorIyB1bmRlZiBDSEFSX01JTgorIyBkZWZpbmUgQ0hBUl9NSU4gU0NIQVJfTUlOCisjIHVuZGVmIENIQVJfTUFYCisjIGRlZmluZSBDSEFSX01BWCBTQ0hBUl9NQVgKKyNlbmRpZgorCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgc2hvcnQgaW50JyBjYW4gaG9sZC4gICovCisjdW5kZWYgU0hSVF9NSU4KKyNkZWZpbmUgU0hSVF9NSU4gKC1TSFJUX01BWCAtIDEpCisjdW5kZWYgU0hSVF9NQVgKKyNkZWZpbmUgU0hSVF9NQVggX19TSFJUX01BWF9fCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIHNob3J0IGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwKS4gICovCisjdW5kZWYgVVNIUlRfTUFYCisjaWYgX19TSFJUX01BWF9fID09IF9fSU5UX01BWF9fCisjIGRlZmluZSBVU0hSVF9NQVggKFNIUlRfTUFYICogMlUgKyAxVSkKKyNlbHNlCisjIGRlZmluZSBVU0hSVF9NQVggKFNIUlRfTUFYICogMiArIDEpCisjZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGludCcgY2FuIGhvbGQuICAqLworI3VuZGVmIElOVF9NSU4KKyNkZWZpbmUgSU5UX01JTiAoLUlOVF9NQVggLSAxKQorI3VuZGVmIElOVF9NQVgKKyNkZWZpbmUgSU5UX01BWCBfX0lOVF9NQVhfXworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworI3VuZGVmIFVJTlRfTUFYCisjZGVmaW5lIFVJTlRfTUFYIChJTlRfTUFYICogMlUgKyAxVSkKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgaW50JyBjYW4gaG9sZC4KKyAgIChTYW1lIGFzIGBpbnQnKS4gICovCisjdW5kZWYgTE9OR19NSU4KKyNkZWZpbmUgTE9OR19NSU4gKC1MT05HX01BWCAtIDFMKQorI3VuZGVmIExPTkdfTUFYCisjZGVmaW5lIExPTkdfTUFYIF9fTE9OR19NQVhfXworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBsb25nIGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwKS4gICovCisjdW5kZWYgVUxPTkdfTUFYCisjZGVmaW5lIFVMT05HX01BWCAoTE9OR19NQVggKiAyVUwgKyAxVUwpCisKKyNpZiBkZWZpbmVkIChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBsb25nIGxvbmcgaW50JyBjYW4gaG9sZC4gICovCisjIHVuZGVmIExMT05HX01JTgorIyBkZWZpbmUgTExPTkdfTUlOICgtTExPTkdfTUFYIC0gMUxMKQorIyB1bmRlZiBMTE9OR19NQVgKKyMgZGVmaW5lIExMT05HX01BWCBfX0xPTkdfTE9OR19NQVhfXworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBsb25nIGxvbmcgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDApLiAgKi8KKyMgdW5kZWYgVUxMT05HX01BWAorIyBkZWZpbmUgVUxMT05HX01BWCAoTExPTkdfTUFYICogMlVMTCArIDFVTEwpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR05VX0xJQlJBUllfXykgPyBkZWZpbmVkIChfX1VTRV9HTlUpIDogIWRlZmluZWQgKF9fU1RSSUNUX0FOU0lfXykKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBsb25nIGxvbmcgaW50JyBjYW4gaG9sZC4gICovCisjIHVuZGVmIExPTkdfTE9OR19NSU4KKyMgZGVmaW5lIExPTkdfTE9OR19NSU4gKC1MT05HX0xPTkdfTUFYIC0gMUxMKQorIyB1bmRlZiBMT05HX0xPTkdfTUFYCisjIGRlZmluZSBMT05HX0xPTkdfTUFYIF9fTE9OR19MT05HX01BWF9fCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworIyB1bmRlZiBVTE9OR19MT05HX01BWAorIyBkZWZpbmUgVUxPTkdfTE9OR19NQVggKExPTkdfTE9OR19NQVggKiAyVUxMICsgMVVMTCkKKyNlbmRpZgorCisjZW5kaWYgLyogX0xJTUlUU19IX19fICovCisvKiBUaGlzIGFkbWluaXN0cml2aWEgZ2V0cyBhZGRlZCB0byB0aGUgZW5kIG9mIGxpbWl0cy5oCisgICBpZiB0aGUgc3lzdGVtIGhhcyBpdHMgb3duIHZlcnNpb24gb2YgbGltaXRzLmguICAqLworCisjZWxzZSAvKiBub3QgX0dDQ19MSU1JVFNfSF8gKi8KKworI2lmZGVmIF9HQ0NfTkVYVF9MSU1JVFNfSAorI2luY2x1ZGVfbmV4dCA8bGltaXRzLmg+CQkvKiByZWN1cnNlIGRvd24gdG8gdGhlIHJlYWwgb25lICovCisjZW5kaWYKKworI2VuZGlmIC8qIG5vdCBfR0NDX0xJTUlUU19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUtZml4ZWQvc3lzbGltaXRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS1maXhlZC9zeXNsaW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzYyODAyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUtZml4ZWQvc3lzbGltaXRzLmgKQEAgLTAsMCArMSw4IEBACisvKiBzeXNsaW1pdHMuaCBzdGFuZHMgZm9yIHRoZSBzeXN0ZW0ncyBvd24gbGltaXRzLmggZmlsZS4KKyAgIElmIHdlIGNhbiB1c2UgaXQgb2sgdW5tb2RpZmllZCwgdGhlbiB3ZSBpbnN0YWxsIHRoaXMgdGV4dC4KKyAgIElmIGZpeGluY2x1ZGVzIGZpeGVzIGl0LCB0aGVuIHRoZSBmaXhlZCB2ZXJzaW9uIGlzIGluc3RhbGxlZAorICAgaW5zdGVhZCBvZiB0aGlzIHRleHQuICAqLworCisjZGVmaW5lIF9HQ0NfTkVYVF9MSU1JVFNfSAkJLyogdGVsbCBnY2MncyBsaW1pdHMuaCB0byByZWN1cnNlICovCisjaW5jbHVkZV9uZXh0IDxsaW1pdHMuaD4KKyN1bmRlZiBfR0NDX05FWFRfTElNSVRTX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2FkeGludHJpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYWR4aW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwZWE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2FkeGludHJpbi5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWYgIWRlZmluZWQgX1g4NklOVFJJTl9IX0lOQ0xVREVEICYmICFkZWZpbmVkIF9JTU1JTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDxhZHhpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9BRFhJTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfQURYSU5UUklOX0hfSU5DTFVERUQKKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGNoYXIKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX2FkZGNhcnJ5eF91MzIgKHVuc2lnbmVkIGNoYXIgX19DRiwgdW5zaWduZWQgaW50IF9fWCwKKwkJdW5zaWduZWQgaW50IF9fWSwgdW5zaWduZWQgaW50ICpfX1ApCit7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2FkZGNhcnJ5eF91MzIgKF9fQ0YsIF9fWCwgX19ZLCBfX1ApOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGNoYXIKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX2FkZGNhcnJ5eF91NjQgKHVuc2lnbmVkIGNoYXIgX19DRiwgdW5zaWduZWQgbG9uZyBfX1gsCisJCXVuc2lnbmVkIGxvbmcgX19ZLCB1bnNpZ25lZCBsb25nIGxvbmcgKl9fUCkKK3sKKyAgICByZXR1cm4gX19idWlsdGluX2lhMzJfYWRkY2Fycnl4X3U2NCAoX19DRiwgX19YLCBfX1ksIF9fUCk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9BRFhJTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYW1taW50cmluLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9hbW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTEyOTJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYW1taW50cmluLmgKQEAgLTAsMCArMSw4OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEltcGxlbWVudGVkIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaW5jbHVkZWQgaW4gdGhlIEFNRCBQcm9ncmFtbWVycworICAgTWFudWFsIFVwZGF0ZSwgdmVyc2lvbiAyLnggKi8KKworI2lmbmRlZiBfQU1NSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX0FNTUlOVFJJTl9IX0lOQ0xVREVECisKKyNpZm5kZWYgX19TU0U0QV9fCisjIGVycm9yICJTU0U0QSBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCisvKiBXZSBuZWVkIGRlZmluaXRpb25zIGZyb20gdGhlIFNTRTMsIFNTRTIgYW5kIFNTRSBoZWFkZXIgZmlsZXMqLworI2luY2x1ZGUgPHBtbWludHJpbi5oPgorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdHJlYW1fc2QgKGRvdWJsZSAqIF9fUCwgX19tMTI4ZCBfX1kpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vdm50c2QgKF9fUCwgKF9fdjJkZikgX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RyZWFtX3NzIChmbG9hdCAqIF9fUCwgX19tMTI4IF9fWSkKK3sKKyAgX19idWlsdGluX2lhMzJfbW92bnRzcyAoX19QLCAoX192NHNmKSBfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9leHRyYWN0X3NpNjQgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9leHRycSAoKF9fdjJkaSkgX19YLCAoX192MTZxaSkgX19ZKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZXh0cmFjdGlfc2k2NCAoX19tMTI4aSBfX1gsIHVuc2lnbmVkIGNvbnN0IGludCBfX0ksIHVuc2lnbmVkIGNvbnN0IGludCBfX0wpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZXh0cnFpICgoX192MmRpKSBfX1gsIF9fSSwgX19MKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9leHRyYWN0aV9zaTY0KFgsIEksIEwpCQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZXh0cnFpICgoX192MmRpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgKHVuc2lnbmVkIGludCkoSSksICh1bnNpZ25lZCBpbnQpKEwpKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9pbnNlcnRfc2k2NCAoX19tMTI4aSBfX1gsX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfaW5zZXJ0cSAoKF9fdjJkaSlfX1gsIChfX3YyZGkpX19ZKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faW5zZXJ0aV9zaTY0KF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgdW5zaWduZWQgY29uc3QgaW50IF9fSSwgdW5zaWduZWQgY29uc3QgaW50IF9fTCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9pbnNlcnRxaSAoKF9fdjJkaSlfX1gsIChfX3YyZGkpX19ZLCBfX0ksIF9fTCk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1faW5zZXJ0aV9zaTY0KFgsIFksIEksIEwpCQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfaW5zZXJ0cWkgKChfX3YyZGkpKF9fbTEyOGkpKFgpLAkJXAorCQkJCSAgICAgIChfX3YyZGkpKF9fbTEyOGkpKFkpLAkJXAorCQkJCSAgICAgICh1bnNpZ25lZCBpbnQpKEkpLCAodW5zaWduZWQgaW50KShMKSkpCisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1NFNEFfXyAqLworCisjZW5kaWYgLyogX0FNTUlOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9hcm1fbmVvbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYXJtX25lb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjkyMTUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYXJtX25lb24uaApAQCAtMCwwICsxLDE2NjIwIEBACisvL2NyZWF0ZWQgYnkgVmljdG9yaWEgWmhpc2xpbmEsIHRoZSBTZW5pb3IgQXBwbGljYXRpb24gRW5naW5lZXIsIEludGVsIENvcnBvcmF0aW9uLCAgdmljdG9yaWEuemhpc2xpbmFAaW50ZWwuY29tCisKKy8vKioqIENvcHlyaWdodCAoQykgMjAxMi0yMDE0IEludGVsIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworLy9JTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorCisvL0J5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy9JZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLCBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGljZW5zZSBBZ3JlZW1lbnQKKworLy9QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorLy9jb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorCisvL1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRICisvL1JFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorLy9BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsCisvL0lORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTQorLy9MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorLy9PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisvL1BFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBzaW1wbGlmeSBBUk0tPklBMzIgcG9ydGluZworLy8gSXQgbWFrZXMgdGhlIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gQVJNIE5FT04gaW50cmluc2ljcyAoYXMgZGVmaW5lZCBpbiAiYXJtX25lb24uaCIpCisvLyBhbmQgeDg2IFNTRSh1cCB0byBTU0U0LjIpIGludHJpbnNpYyBmdW5jdGlvbnMgYXMgZGVmaW5lZCBpbiBoZWFkZXJzIGZpbGVzIGJlbG93CisvLyBNTVggaW5zdHJ1Y3Rpb24gc2V0IGlzIG5vdCB1c2VkIGR1ZSB0byBwZXJmb3JtYW5jZSBvdmVyaGVhZCBhbmQgdGhlIG5lY2Vzc2l0eSB0byB1c2UgdGhlCisvLyBFTU1TIGluc3RydWN0aW9uIChfbW1fZW1wdHkoKSlmb3IgbW14LXg4NyBmbG9hdGluZyBwb2ludCBzd2l0Y2hpbmcKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8hISEhISEhICBUbyB1c2UgdGhpcyBmaWxlIGluIHlvdXIgcHJvamVjdCB0aGF0IHVzZXMgQVJNIE5FT04gaW50aW5zaWNzIGp1c3Qga2VlcCBhcm1fbmVvbi5oIGluY2x1ZGVkIGFuZCBjb21wbGlsZSBpdCBhcyB1c3VhbC4KKy8vISEhISEhISAgUGxlYXNlIHBheSBhdHRlbnRpb24gYXQgVVNFX1NTRTQgYmVsb3cgLSB5b3UgbmVlZCB0byBkZWZpbmUgaXQgZm9yIG5ld2VzdCBJbnRlbCBwbGF0Zm9ybXMgZm9yCisvLyEhISEhISEgIGdyZWF0ZXIgcGVyZm9ybWFuY2UuIEl0IGNhbiBiZSBkb25lIGJ5IC1tc3NlNC4yIGNvbXBpbGVyIHN3aXRjaC4KKworI2lmbmRlZiBORU9OMlNTRV9ICisjZGVmaW5lIE5FT04yU1NFX0gKKworI2lmbmRlZiBVU0VfU1NFNAorI2lmIGRlZmluZWQoX19TU0U0XzJfXykKKyAgICAjZGVmaW5lIFVTRV9TU0U0CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8eG1taW50cmluLmg+ICAgICAvL1NTRQorI2luY2x1ZGUgPGVtbWludHJpbi5oPiAgICAgLy9TU0UyCisjaW5jbHVkZSA8cG1taW50cmluLmg+ICAgICAvL1NTRTMKKyNpbmNsdWRlIDx0bW1pbnRyaW4uaD4gICAgIC8vU1NTRTMKKyNpZmRlZiBVU0VfU1NFNAorI2luY2x1ZGUgPHNtbWludHJpbi5oPiAvL1NTRTQuMQorI2luY2x1ZGUgPG5tbWludHJpbi5oPiAvL1NTRTQuMgorI2VuZGlmCisKKworLy8qKioqKioqKioqKioqKiogIGZ1bmN0aW9ucyBhbmQgZGF0YSBhdHRyaWJ1dGVzLCBjb21waWxlciBkZXBlbmRlbnQgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIF9HQ0NfVkVSU0lPTiAoX19HTlVDX18gKiAxMDAwMCArIF9fR05VQ19NSU5PUl9fICogMTAwICsgX19HTlVDX1BBVENITEVWRUxfXykKKyNkZWZpbmUgX05FT04yU1NFX0FMSUdOXzE2ICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpCisjZGVmaW5lIF9ORU9OMlNTRV9JTkxJTkUgZXh0ZXJuIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKKyNpZiBfR0NDX1ZFUlNJT04gPCAgNDA1MDAKKyAgICAjZGVmaW5lIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGZ1bmN0aW9uLCBleHBsYW5hdGlvbikgICBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkgZnVuY3Rpb24KKyNlbHNlCisgICAgI2RlZmluZSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhmdW5jdGlvbiwgZXhwbGFuYXRpb24pICAgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZChleHBsYW5hdGlvbikpKSBmdW5jdGlvbgorI2VuZGlmCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorICAgICNkZWZpbmUgX05FT04yU1NFXzY0QklUICBfX3g4Nl82NF9fCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9ORU9OMlNTRV9BTElHTl8xNiAgX19kZWNsc3BlYyhhbGlnbigxNikpCisjZGVmaW5lIF9ORU9OMlNTRV9JTkxJTkUgX19pbmxpbmUKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKXx8IGRlZmluZWQgKF9fSU5URUxfQ09NUElMRVIpCisgICAgI2RlZmluZSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhmdW5jdGlvbiwgRVhQTEFOQVRJT04pIF9fZGVjbHNwZWMoZGVwcmVjYXRlZChFWFBMQU5BVElPTikpIGZ1bmN0aW9uCisjaWYgZGVmaW5lZChfTV9YNjQpCisgICAgICAgICNkZWZpbmUgX05FT04yU1NFXzY0QklUICBfTV9YNjQKKyNlbmRpZgorI2Vsc2UKKyAgICAjZGVmaW5lIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGZ1bmN0aW9uLCBleHBsYW5hdGlvbikgIGZ1bmN0aW9uCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAgKF9ORU9OMlNTRV82NEJJVCkgJiYgZGVmaW5lZCAoVVNFX1NTRTQpCisgICAgI2RlZmluZSBfTkVPTjJTU0VfNjRCSVRfU1NFNAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyAgICBkYXRhIHR5cGVzIGNvbnZlcnNpb24KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSIDwgMTMwMCkKKyAgICB0eXBlZGVmIHNpZ25lZCBjaGFyIGludDhfdDsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKKyAgICB0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQxNl90OworICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7CisgICAgdHlwZWRlZiBzaWduZWQgaW50IGludDMyX3Q7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyX3Q7CisgICAgdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIGludDY0X3Q7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgIHR5cGVkZWYgc2lnbmVkIF9faW50OCBpbnQ4X3Q7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDggdWludDhfdDsKKyAgICB0eXBlZGVmIHNpZ25lZCBfX2ludDE2IGludDE2X3Q7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDE2IHVpbnQxNl90OworICAgIHR5cGVkZWYgc2lnbmVkIF9faW50MzIgaW50MzJfdDsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgdWludDMyX3Q7CisKKyAgICB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgaW50NjRfdDsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKKwordHlwZWRlZiB1bmlvbiAgIF9fbTY0XzEyOCB7CisgICAgdWludDY0X3QgbTY0X3U2NFsxXTsKKyAgICBmbG9hdCBtNjRfZjMyWzJdOworICAgIGludDhfdCBtNjRfaThbOF07CisgICAgaW50MTZfdCBtNjRfaTE2WzRdOworICAgIGludDMyX3QgbTY0X2kzMlsyXTsKKyAgICBpbnQ2NF90IG02NF9pNjRbMV07CisgICAgdWludDhfdCBtNjRfdThbOF07CisgICAgdWludDE2X3QgbTY0X3UxNls0XTsKKyAgICB1aW50MzJfdCBtNjRfdTMyWzJdOworfSBfX202NF8xMjg7CisKK3R5cGVkZWYgX19tNjRfMTI4IGludDh4OF90OwordHlwZWRlZiBfX202NF8xMjggdWludDh4OF90OwordHlwZWRlZiBfX202NF8xMjggaW50MTZ4NF90OwordHlwZWRlZiBfX202NF8xMjggdWludDE2eDRfdDsKK3R5cGVkZWYgX19tNjRfMTI4IGludDMyeDJfdDsKK3R5cGVkZWYgX19tNjRfMTI4IHVpbnQzMngyX3Q7Cit0eXBlZGVmIF9fbTY0XzEyOCBpbnQ2NHgxX3Q7Cit0eXBlZGVmIF9fbTY0XzEyOCB1aW50NjR4MV90OwordHlwZWRlZiBfX202NF8xMjggcG9seTh4OF90OwordHlwZWRlZiBfX202NF8xMjggcG9seTE2eDRfdDsKKwordHlwZWRlZiBfX202NF8xMjggZmxvYXQzMngyX3Q7Cit0eXBlZGVmIF9fbTEyOCBmbG9hdDMyeDRfdDsKKwordHlwZWRlZiBfX20xMjggZmxvYXQxNng0X3Q7IC8vbm90IHN1cHBvcnRlZCBieSBJQSwgZm9yIGNvbXBhdGliaWxpdHkKK3R5cGVkZWYgX19tMTI4IGZsb2F0MTZ4OF90OyAvL25vdCBzdXBwb3J0ZWQgYnkgSUEsIGZvciBjb21wYXRpYmlsaXR5CisKK3R5cGVkZWYgX19tMTI4aSBpbnQ4eDE2X3Q7Cit0eXBlZGVmIF9fbTEyOGkgaW50MTZ4OF90OwordHlwZWRlZiBfX20xMjhpIGludDMyeDRfdDsKK3R5cGVkZWYgX19tMTI4aSBpbnQ2NHgyX3Q7Cit0eXBlZGVmIF9fbTEyOGkgdWludDh4MTZfdDsKK3R5cGVkZWYgX19tMTI4aSB1aW50MTZ4OF90OwordHlwZWRlZiBfX20xMjhpIHVpbnQzMng0X3Q7Cit0eXBlZGVmIF9fbTEyOGkgdWludDY0eDJfdDsKK3R5cGVkZWYgX19tMTI4aSBwb2x5OHgxNl90OwordHlwZWRlZiBfX20xMjhpIHBvbHkxNng4X3Q7CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgICNkZWZpbmUgU0lOVF9NSU4gICAgICgtMjE0NzQ4MzY0NyAtIDEpIC8qIG1pbiBzaWduZWQgaW50IHZhbHVlICovCisgICAgI2RlZmluZSBTSU5UX01BWCAgICAgICAyMTQ3NDgzNjQ3IC8qIG1heCBzaWduZWQgaW50IHZhbHVlICovCisjZWxzZQorICAgICNkZWZpbmUgU0lOVF9NSU4gICAgIElOVF9NSU4gLyogbWluIHNpZ25lZCBpbnQgdmFsdWUgKi8KKyAgICAjZGVmaW5lIFNJTlRfTUFYICAgICBJTlRfTUFYIC8qIG1heCBzaWduZWQgaW50IHZhbHVlICovCisjZW5kaWYKKwordHlwZWRlZiAgIGZsb2F0IGZsb2F0MzJfdDsKK3R5cGVkZWYgICBmbG9hdCBfX2ZwMTY7CisKK3R5cGVkZWYgIHVpbnQ4X3QgcG9seThfdDsKK3R5cGVkZWYgIHVpbnQxNl90IHBvbHkxNl90OworCisKKy8vTVNWQyBjb21waWxlcnMgKHRlc3RlZCB1cCB0byAyMDEyIFZTIHZlcnNpb24pIGRvZXNuJ3QgYWxsb3cgdXNpbmcgc3RydWN0dXJlcyBvciBhcnJheXMgb2YgX19tMTI4eCB0eXBlICBhcyBmdW5jdGlvbnMgYXJndW1lbnRzIHJlc3VsdGluZyBpbgorLy9lcnJvciBDMjcxOTogJ3NyYyc6IGZvcm1hbCBwYXJhbWV0ZXIgd2l0aCBfX2RlY2xzcGVjKGFsaWduKCcxNicpKSB3b24ndCBiZSBhbGlnbmVkLiAgVG8gYXZvaWQgaXQgd2UgbmVlZCB0aGUgc3BlY2lhbCB0cmljayBmb3IgZnVuY3Rpb25zIHRoYXQgdXNlIHRoZXNlIHR5cGVzCitzdHJ1Y3QgaW50OHgxNngyX3QgeworICAgIGludDh4MTZfdCB2YWxbMl07Cit9Oworc3RydWN0IGludDE2eDh4Ml90IHsKKyAgICBpbnQxNng4X3QgdmFsWzJdOworfTsKK3N0cnVjdCBpbnQzMng0eDJfdCB7CisgICAgaW50MzJ4NF90IHZhbFsyXTsKK307CitzdHJ1Y3QgaW50NjR4MngyX3QgeworICAgIGludDY0eDJfdCB2YWxbMl07Cit9OworLy9VbmZvcnR1bmF0ZWx5IHdlIGFyZSB1bmFibGUgdG8gbWVyZ2UgdHdvIDY0LWJpdHMgaW4gb24gMTI4IGJpdCByZWdpc3RlciBiZWNhdXNlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gYWNjZXNzIHZhbFtuXSBtZW1iZXJzIGV4cGxpY2l0bHkhISEKK3N0cnVjdCBpbnQ4eDh4Ml90IHsKKyAgICBpbnQ4eDhfdCB2YWxbMl07Cit9Oworc3RydWN0IGludDE2eDR4Ml90IHsKKyAgICBpbnQxNng0X3QgdmFsWzJdOworfTsKK3N0cnVjdCBpbnQzMngyeDJfdCB7CisgICAgaW50MzJ4Ml90IHZhbFsyXTsKK307CitzdHJ1Y3QgaW50NjR4MXgyX3QgeworICAgIGludDY0eDFfdCB2YWxbMl07Cit9OworCit0eXBlZGVmIHN0cnVjdCBpbnQ4eDE2eDJfdCBpbnQ4eDE2eDJfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQxNng4eDJfdCBpbnQxNng4eDJfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQzMng0eDJfdCBpbnQzMng0eDJfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQ2NHgyeDJfdCBpbnQ2NHgyeDJfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5CisKK3R5cGVkZWYgc3RydWN0IGludDh4OHgyX3QgaW50OHg4eDJfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQxNng0eDJfdCBpbnQxNng0eDJfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQzMngyeDJfdCBpbnQzMngyeDJfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQ2NHgxeDJfdCBpbnQ2NHgxeDJfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5CisKKy8qIHRvIGF2b2lkIHBvaW50ZXIgY29udmVyc2lvbnMgdGhlIGZvbGxvd2luZyB1bnNpZ25lZCBpbnRlZ2VycyBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIHZpYSB0aGUgY29ycmVzcG9uZGluZyBzaWduZWQgaW50ZWdlcnMgc3RydWN0dXJlcyBhYm92ZSAqLwordHlwZWRlZiBzdHJ1Y3QgaW50OHgxNngyX3QgdWludDh4MTZ4Ml90OwordHlwZWRlZiBzdHJ1Y3QgaW50MTZ4OHgyX3QgdWludDE2eDh4Ml90OwordHlwZWRlZiBzdHJ1Y3QgaW50MzJ4NHgyX3QgdWludDMyeDR4Ml90OwordHlwZWRlZiBzdHJ1Y3QgaW50NjR4MngyX3QgdWludDY0eDJ4Ml90OwordHlwZWRlZiBzdHJ1Y3QgaW50OHgxNngyX3QgcG9seTh4MTZ4Ml90OwordHlwZWRlZiBzdHJ1Y3QgaW50MTZ4OHgyX3QgcG9seTE2eDh4Ml90OworCit0eXBlZGVmIHN0cnVjdCBpbnQ4eDh4Ml90IHVpbnQ4eDh4Ml90OwordHlwZWRlZiBzdHJ1Y3QgaW50MTZ4NHgyX3QgdWludDE2eDR4Ml90OwordHlwZWRlZiBzdHJ1Y3QgaW50MzJ4MngyX3QgdWludDMyeDJ4Ml90OwordHlwZWRlZiBzdHJ1Y3QgaW50NjR4MXgyX3QgdWludDY0eDF4Ml90OwordHlwZWRlZiBzdHJ1Y3QgaW50OHg4eDJfdCBwb2x5OHg4eDJfdDsKK3R5cGVkZWYgc3RydWN0IGludDE2eDR4Ml90IHBvbHkxNng0eDJfdDsKKworLy9mbG9hdAorc3RydWN0IGZsb2F0MzJ4NHgyX3QgeworICAgIGZsb2F0MzJ4NF90IHZhbFsyXTsKK307CitzdHJ1Y3QgZmxvYXQxNng4eDJfdCB7CisgICAgZmxvYXQxNng4X3QgdmFsWzJdOworfTsKK3N0cnVjdCBmbG9hdDMyeDJ4Ml90IHsKKyAgICBmbG9hdDMyeDJfdCB2YWxbMl07Cit9OworCit0eXBlZGVmIHN0cnVjdCBmbG9hdDMyeDR4Ml90IGZsb2F0MzJ4NHgyX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgZmxvYXQxNng4eDJfdCBmbG9hdDE2eDh4Ml90OyAvL2ZvciBDIGNvbXBpbGVycyB0byBtYWtlIHRoZW0gaGFwcHkKK3R5cGVkZWYgc3RydWN0ICBmbG9hdDMyeDJ4Ml90IGZsb2F0MzJ4MngyX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiAgZmxvYXQxNng4eDJfdCBmbG9hdDE2eDR4Ml90OworCisvLzQKK3N0cnVjdCBpbnQ4eDE2eDRfdCB7CisgICAgaW50OHgxNl90IHZhbFs0XTsKK307CitzdHJ1Y3QgaW50MTZ4OHg0X3QgeworICAgIGludDE2eDhfdCB2YWxbNF07Cit9Oworc3RydWN0IGludDMyeDR4NF90IHsKKyAgICBpbnQzMng0X3QgdmFsWzRdOworfTsKK3N0cnVjdCBpbnQ2NHgyeDRfdCB7CisgICAgaW50NjR4Ml90IHZhbFs0XTsKK307CisKK3N0cnVjdCBpbnQ4eDh4NF90IHsKKyAgICBpbnQ4eDhfdCB2YWxbNF07Cit9Oworc3RydWN0IGludDE2eDR4NF90IHsKKyAgICBpbnQxNng0X3QgdmFsWzRdOworfTsKK3N0cnVjdCBpbnQzMngyeDRfdCB7CisgICAgaW50MzJ4Ml90IHZhbFs0XTsKK307CitzdHJ1Y3QgaW50NjR4MXg0X3QgeworICAgIGludDY0eDFfdCB2YWxbNF07Cit9OworCit0eXBlZGVmIHN0cnVjdCBpbnQ4eDE2eDRfdCBpbnQ4eDE2eDRfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQxNng4eDRfdCBpbnQxNng4eDRfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQzMng0eDRfdCBpbnQzMng0eDRfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQ2NHgyeDRfdCBpbnQ2NHgyeDRfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5CisKK3R5cGVkZWYgc3RydWN0IGludDh4OHg0X3QgaW50OHg4eDRfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQxNng0eDRfdCBpbnQxNng0eDRfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQzMngyeDRfdCBpbnQzMngyeDRfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQ2NHgxeDRfdCBpbnQ2NHgxeDRfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5CisKKy8qIHRvIGF2b2lkIHBvaW50ZXIgY29udmVyc2lvbnMgdGhlIGZvbGxvd2luZyB1bnNpZ25lZCBpbnRlZ2VycyBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIHZpYSB0aGUgY29ycmVzcG9uZGluZyBzaWduZWQgaW50ZWdlcnMgZGVhbGluZyBzdHJ1Y3R1cmVzIGFib3ZlOiovCit0eXBlZGVmIHN0cnVjdCBpbnQ4eDh4NF90IHVpbnQ4eDh4NF90OwordHlwZWRlZiBzdHJ1Y3QgaW50MTZ4NHg0X3QgdWludDE2eDR4NF90OwordHlwZWRlZiBzdHJ1Y3QgaW50MzJ4Mng0X3QgdWludDMyeDJ4NF90OwordHlwZWRlZiBzdHJ1Y3QgaW50NjR4MXg0X3QgdWludDY0eDF4NF90OwordHlwZWRlZiBzdHJ1Y3QgaW50OHg4eDRfdCBwb2x5OHg4eDRfdDsKK3R5cGVkZWYgc3RydWN0IGludDE2eDR4NF90IHBvbHkxNng0eDRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaW50OHgxNng0X3QgdWludDh4MTZ4NF90OwordHlwZWRlZiBzdHJ1Y3QgaW50MTZ4OHg0X3QgdWludDE2eDh4NF90OwordHlwZWRlZiBzdHJ1Y3QgaW50MzJ4NHg0X3QgdWludDMyeDR4NF90OwordHlwZWRlZiBzdHJ1Y3QgaW50NjR4Mng0X3QgdWludDY0eDJ4NF90OwordHlwZWRlZiBzdHJ1Y3QgaW50OHgxNng0X3QgcG9seTh4MTZ4NF90OwordHlwZWRlZiBzdHJ1Y3QgaW50MTZ4OHg0X3QgcG9seTE2eDh4NF90OworCitzdHJ1Y3QgZmxvYXQzMng0eDRfdCB7CisgICAgZmxvYXQzMng0X3QgdmFsWzRdOworfTsKK3N0cnVjdCBmbG9hdDE2eDh4NF90IHsKKyAgICBmbG9hdDE2eDhfdCB2YWxbNF07Cit9Oworc3RydWN0IGZsb2F0MzJ4Mng0X3QgeworICAgIGZsb2F0MzJ4Ml90IHZhbFs0XTsKK307CisKK3R5cGVkZWYgc3RydWN0IGZsb2F0MzJ4NHg0X3QgZmxvYXQzMng0eDRfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBmbG9hdDE2eDh4NF90IGZsb2F0MTZ4OHg0X3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgIGZsb2F0MzJ4Mng0X3QgZmxvYXQzMngyeDRfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmICBmbG9hdDE2eDh4NF90IGZsb2F0MTZ4NHg0X3Q7CisKKy8vMworc3RydWN0IGludDE2eDh4M190IHsKKyAgICBpbnQxNng4X3QgdmFsWzNdOworfTsKK3N0cnVjdCBpbnQzMng0eDNfdCB7CisgICAgaW50MzJ4NF90IHZhbFszXTsKK307CitzdHJ1Y3QgaW50NjR4MngzX3QgeworICAgIGludDY0eDJfdCB2YWxbM107Cit9Oworc3RydWN0IGludDh4MTZ4M190IHsKKyAgICBpbnQ4eDE2X3QgdmFsWzNdOworfTsKKworc3RydWN0IGludDE2eDR4M190IHsKKyAgICBpbnQxNng0X3QgdmFsWzNdOworfTsKK3N0cnVjdCBpbnQzMngyeDNfdCB7CisgICAgaW50MzJ4Ml90IHZhbFszXTsKK307CitzdHJ1Y3QgaW50NjR4MXgzX3QgeworICAgIGludDY0eDFfdCB2YWxbM107Cit9Oworc3RydWN0IGludDh4OHgzX3QgeworICAgIGludDh4OF90IHZhbFszXTsKK307Cit0eXBlZGVmIHN0cnVjdCBpbnQxNng4eDNfdCBpbnQxNng4eDNfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQzMng0eDNfdCBpbnQzMng0eDNfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQ2NHgyeDNfdCBpbnQ2NHgyeDNfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQ4eDE2eDNfdCBpbnQ4eDE2eDNfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5CisKK3R5cGVkZWYgc3RydWN0IGludDh4OHgzX3QgaW50OHg4eDNfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQxNng0eDNfdCBpbnQxNng0eDNfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQzMngyeDNfdCBpbnQzMngyeDNfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBpbnQ2NHgxeDNfdCBpbnQ2NHgxeDNfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5CisKKworLyogdG8gYXZvaWQgcG9pbnRlciBjb252ZXJzaW9ucyB0aGUgZm9sbG93aW5nIHVuc2lnbmVkIGludGVnZXJzIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgdmlhIHRoZSBjb3JyZXNwb25kaW5nIHNpZ25lZCBpbnRlZ2VycyBkZWFsaW5nIHN0cnVjdHVyZXMgYWJvdmU6Ki8KK3R5cGVkZWYgc3RydWN0IGludDh4MTZ4M190IHVpbnQ4eDE2eDNfdDsKK3R5cGVkZWYgc3RydWN0IGludDE2eDh4M190IHVpbnQxNng4eDNfdDsKK3R5cGVkZWYgc3RydWN0IGludDMyeDR4M190IHVpbnQzMng0eDNfdDsKK3R5cGVkZWYgc3RydWN0IGludDY0eDJ4M190IHVpbnQ2NHgyeDNfdDsKK3R5cGVkZWYgc3RydWN0IGludDh4MTZ4M190IHBvbHk4eDE2eDNfdDsKK3R5cGVkZWYgc3RydWN0IGludDE2eDh4M190IHBvbHkxNng4eDNfdDsKK3R5cGVkZWYgc3RydWN0ICBpbnQ4eDh4M190IHVpbnQ4eDh4M190OwordHlwZWRlZiBzdHJ1Y3QgIGludDE2eDR4M190IHVpbnQxNng0eDNfdDsKK3R5cGVkZWYgc3RydWN0ICBpbnQzMngyeDNfdCB1aW50MzJ4MngzX3Q7Cit0eXBlZGVmIHN0cnVjdCAgaW50NjR4MXgzX3QgdWludDY0eDF4M190OwordHlwZWRlZiBzdHJ1Y3QgIGludDh4OHgzX3QgcG9seTh4OHgzX3Q7Cit0eXBlZGVmIHN0cnVjdCAgaW50MTZ4NHgzX3QgcG9seTE2eDR4M190OworCisvL2Zsb2F0CitzdHJ1Y3QgZmxvYXQzMng0eDNfdCB7CisgICAgZmxvYXQzMng0X3QgdmFsWzNdOworfTsKK3N0cnVjdCBmbG9hdDMyeDJ4M190IHsKKyAgICBmbG9hdDMyeDJfdCB2YWxbM107Cit9Oworc3RydWN0IGZsb2F0MTZ4OHgzX3QgeworICAgIGZsb2F0MTZ4OF90IHZhbFszXTsKK307CisKK3R5cGVkZWYgc3RydWN0IGZsb2F0MzJ4NHgzX3QgZmxvYXQzMng0eDNfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCBmbG9hdDE2eDh4M190IGZsb2F0MTZ4OHgzX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgZmxvYXQzMngyeDNfdCBmbG9hdDMyeDJ4M190OyAvL2ZvciBDIGNvbXBpbGVycyB0byBtYWtlIHRoZW0gaGFwcHkKK3R5cGVkZWYgIGZsb2F0MTZ4OHgzX3QgZmxvYXQxNng0eDNfdDsKKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqIFBvcnRpbmcgYXV4aWxpYXJ5IG1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLyoqIGZsb2F0aW5nIHBvaW50IHJlbGF0ZWQgbWFjcm9zICoqCisjZGVmaW5lIF9NMTI4aShhKSBfbW1fY2FzdHBzX3NpMTI4KGEpCisjZGVmaW5lIF9NMTI4KGEpIF9tbV9jYXN0c2kxMjhfcHMoYSkKKy8vaGVyZSB0aGUgbW9zdCBwZXJmb3JtYW5jZSBlZmZlY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgY29tcGlsZXIgYW5kIDMyLzY0IGJpdHMgYnVpbGQgZGVwZW5kZW50CisjaWYgZGVmaW5lZCAoX05FT04yU1NFXzY0QklUKSB8fCAoZGVmaW5lZCAoX19JTlRFTF9DT01QSUxFUikgJiYgKF9fSU5URUxfQ09NUElMRVIgID49IDE1MDApICkKKworICAgICAgICAjZGVmaW5lIF9wTTEyOGkoYSkgX21tX2N2dHNpNjRfc2kxMjgoKihpbnQ2NF90KikoJihhKSkpCisgICAgICAgICNkZWZpbmUgX002NChvdXQsIGlucCkgb3V0Lm02NF9pNjRbMF0gPSBfbW1fY3Z0c2kxMjhfc2k2NCAoaW5wKTsKKyAgICAgICAgI2RlZmluZSBfTTY0ZihvdXQsIGlucCkgb3V0Lm02NF9pNjRbMF0gPSBfbW1fY3Z0c2kxMjhfc2k2NCAoX00xMjhpKGlucCkpOworI2Vsc2UKKyAgIC8vZm9yIDMyYml0IGdjYyBhbmQgTWljcm9zb2Z0IGNvbXBpbGVycyBidWlsZHMKKyAgICAjZGVmaW5lIF9wTTEyOGkoYSkgX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmKGEpKQorICAgICNkZWZpbmUgX002NChvdXQsIGlucCkgIF9tbV9zdG9yZWxfZXBpNjQgKChfX20xMjhpKikmKG91dCksIGlucCkKKyAgICAjZGVmaW5lIF9NNjRmKG91dCwgaW5wKSAgX21tX3N0b3JlbF9lcGk2NCAoKF9fbTEyOGkqKSYob3V0KSwgX00xMjhpKGlucCkpCisjZW5kaWYKKyNkZWZpbmUgX3BNMTI4KGEpIF9tbV9jYXN0c2kxMjhfcHMoX3BNMTI4aShhKSkKKworI2RlZmluZSByZXR1cm42NChhKSAgX002NChyZXM2NCxhKTsgcmV0dXJuIHJlczY0OworI2RlZmluZSByZXR1cm42NGYoYSkgIF9NNjRmKHJlczY0LGEpOyByZXR1cm4gcmVzNjQ7CisKKyNkZWZpbmUgX1VpNjQoYSkgKCoodWludDY0X3QqKSYoYSkpCisjZGVmaW5lIF9VTlNJR05FRF9UKGEpIHUgIyMgYQorCisjZGVmaW5lIF9TSUdOQklUNjQgKCh1aW50NjRfdCkxIDw8IDYzKQorI2RlZmluZSBfU1dBUF9ISV9MT1czMiAgKDIgfCAoMyA8PCAyKSB8ICgwIDw8IDQpIHwgKDEgPDwgNikpCisjZGVmaW5lIF9JTlNFUlRQU19ORFgoc3JjRmllbGQsIGRzdEZpZWxkKSAoKChzcmNGaWVsZCkgPDwgNikgfCAoKGRzdEZpZWxkKSA8PCA0KSApCisKKyNkZWZpbmUgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwgIlRoZSBmdW5jdGlvbiBtYXkgYmUgdmVyeSBzbG93IGR1ZSB0byB0aGUgc2VyaWFsIGltcGxlbWVudGF0aW9uLCBwbGVhc2UgdHJ5IHRvIGF2b2lkIGl0IgorI2RlZmluZSAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1VORUZGRUNUSVZFICJUaGUgZnVuY3Rpb24gbWF5IGJlIHNsb3cgZHVlIHRvIGluZWZmaWNpZW50IHg4NiBTSU1EIGltcGxlbWVudGF0aW9uLCBwbGVhc2UgdHJ5IHRvIGF2b2lkIGl0IgorCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorI2RlZmluZSBfX2NvbnN0cmFuZ2UobWluLG1heCkgIGNvbnN0CisjZGVmaW5lIF9fdHJhbnNmZXJzaXplKHNpemUpCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKiAgRnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhcyBkZWNsYXJlZCBpbiBvcmlnaW5hbCBhcm1fbmVvbi5oICoqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vVmVjdG9yIGFkZDogdmFkZCAtPiBWcltpXTo9VmFbaV0rVmJbaV0sIFZyLCBWYSwgVmIgaGF2ZSBlcXVhbCBsYW5lIHNpemVzLgoraW50OHg4X3QgdmFkZF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkFERC5JOCBkMCxkMCxkMAoraW50MTZ4NF90IHZhZGRfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZBREQuSTE2IGQwLGQwLGQwCitpbnQzMngyX3QgdmFkZF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVkFERC5JMzIgZDAsZDAsZDAKK2ludDY0eDFfdCB2YWRkX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWQURELkk2NCBkMCxkMCxkMAorZmxvYXQzMngyX3QgdmFkZF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZBREQuRjMyIGQwLGQwLGQwCit1aW50OHg4X3QgdmFkZF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQURELkk4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZhZGRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkFERC5JMTYgZDAsZDAsZDAKK3VpbnQzMngyX3QgdmFkZF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWQURELkkzMiBkMCxkMCxkMAordWludDY0eDFfdCB2YWRkX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYik7IC8vIFZBREQuSTY0IGQwLGQwLGQwCitpbnQ4eDE2X3QgdmFkZHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkFERC5JOCBxMCxxMCxxMAoraW50MTZ4OF90IHZhZGRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWQURELkkxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZhZGRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWQURELkkzMiBxMCxxMCxxMAoraW50NjR4Ml90IHZhZGRxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWQURELkk2NCBxMCxxMCxxMAorZmxvYXQzMng0X3QgdmFkZHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQURELkYzMiBxMCxxMCxxMAordWludDh4MTZfdCB2YWRkcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZBREQuSTggcTAscTAscTAKK3VpbnQxNng4X3QgdmFkZHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkFERC5JMTYgcTAscTAscTAKK3VpbnQzMng0X3QgdmFkZHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkFERC5JMzIgcTAscTAscTAKK3VpbnQ2NHgyX3QgdmFkZHFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVkFERC5JNjQgcTAscTAscTAKKy8vVmVjdG9yIGxvbmcgYWRkOiB2YWRkbCAtPiBWcltpXTo9VmFbaV0rVmJbaV0sIFZhLCBWYiBoYXZlIGVxdWFsIGxhbmUgc2l6ZXMsIHJlc3VsdCBpcyBhIDEyOCBiaXQgdmVjdG9yIG9mIGxhbmVzIHRoYXQgYXJlIHR3aWNlIHRoZSB3aWR0aC4KK2ludDE2eDhfdCB2YWRkbF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkFEREwuUzggcTAsZDAsZDAKK2ludDMyeDRfdCB2YWRkbF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkFEREwuUzE2IHEwLGQwLGQwCitpbnQ2NHgyX3QgdmFkZGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZBRERMLlMzMiBxMCxkMCxkMAordWludDE2eDhfdCB2YWRkbF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQURETC5VOCBxMCxkMCxkMAordWludDMyeDRfdCB2YWRkbF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWQURETC5VMTYgcTAsZDAsZDAKK3VpbnQ2NHgyX3QgdmFkZGxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkFEREwuVTMyIHEwLGQwLGQwCisvL1ZlY3RvciB3aWRlIGFkZHc6IHZhZGQgLT4gVnJbaV06PVZhW2ldK1ZiW2ldCitpbnQxNng4X3QgdmFkZHdfczgoaW50MTZ4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQUREVy5TOCBxMCxxMCxkMAoraW50MzJ4NF90IHZhZGR3X3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWQUREVy5TMTYgcTAscTAsZDAKK2ludDY0eDJfdCB2YWRkd19zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVkFERFcuUzMyIHEwLHEwLGQwCit1aW50MTZ4OF90IHZhZGR3X3U4KHVpbnQxNng4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQUREVy5VOCBxMCxxMCxkMAordWludDMyeDRfdCB2YWRkd191MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWQUREVy5VMTYgcTAscTAsZDAKK3VpbnQ2NHgyX3QgdmFkZHdfdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkFERFcuVTMyIHEwLHEwLGQwCisvL1ZlY3RvciBoYWx2aW5nIGFkZDogdmhhZGQgLT4gVnJbaV06PShWYVtpXStWYltpXSk+PjEKK2ludDh4OF90IHZoYWRkX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWSEFERC5TOCBkMCxkMCxkMAoraW50MTZ4NF90IHZoYWRkX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWSEFERC5TMTYgZDAsZDAsZDAKK2ludDMyeDJfdCB2aGFkZF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVkhBREQuUzMyIGQwLGQwLGQwCit1aW50OHg4X3QgdmhhZGRfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkhBREQuVTggZDAsZDAsZDAKK3VpbnQxNng0X3QgdmhhZGRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkhBREQuVTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZoYWRkX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZIQURELlUzMiBkMCxkMCxkMAoraW50OHgxNl90IHZoYWRkcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWSEFERC5TOCBxMCxxMCxxMAoraW50MTZ4OF90IHZoYWRkcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkhBREQuUzE2IHEwLHEwLHEwCitpbnQzMng0X3QgdmhhZGRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWSEFERC5TMzIgcTAscTAscTAKK3VpbnQ4eDE2X3QgdmhhZGRxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkhBREQuVTggcTAscTAscTAKK3VpbnQxNng4X3QgdmhhZGRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZIQURELlUxNiBxMCxxMCxxMAordWludDMyeDRfdCB2aGFkZHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkhBREQuVTMyIHEwLHEwLHEwCisvL1ZlY3RvciByb3VuZGluZyBoYWx2aW5nIGFkZDogdnJoYWRkIC0+IFZyW2ldOj0oVmFbaV0rVmJbaV0rMSk+PjEKK2ludDh4OF90IHZyaGFkZF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlJIQURELlM4IGQwLGQwLGQwCitpbnQxNng0X3QgdnJoYWRkX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUkhBREQuUzE2IGQwLGQwLGQwCitpbnQzMngyX3QgdnJoYWRkX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUkhBREQuUzMyIGQwLGQwLGQwCit1aW50OHg4X3QgdnJoYWRkX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZSSEFERC5VOCBkMCxkMCxkMAordWludDE2eDRfdCB2cmhhZGRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlJIQURELlUxNiBkMCxkMCxkMAordWludDMyeDJfdCB2cmhhZGRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlJIQURELlUzMiBkMCxkMCxkMAoraW50OHgxNl90IHZyaGFkZHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlJIQURELlM4IHEwLHEwLHEwCitpbnQxNng4X3QgdnJoYWRkcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlJIQURELlMxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZyaGFkZHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZSSEFERC5TMzIgcTAscTAscTAKK3VpbnQ4eDE2X3QgdnJoYWRkcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZSSEFERC5VOCBxMCxxMCxxMAordWludDE2eDhfdCB2cmhhZGRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZSSEFERC5VMTYgcTAscTAscTAKK3VpbnQzMng0X3QgdnJoYWRkcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWUkhBREQuVTMyIHEwLHEwLHEwCisvL1ZlY3RvciBzYXR1cmF0aW5nIGFkZDogdnFhZGQgLT4gVnJbaV06PXNhdDxzaXplPihWYVtpXStWYltpXSkKK2ludDh4OF90IHZxYWRkX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUUFERC5TOCBkMCxkMCxkMAoraW50MTZ4NF90IHZxYWRkX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUUFERC5TMTYgZDAsZDAsZDAKK2ludDMyeDJfdCB2cWFkZF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlFBREQuUzMyIGQwLGQwLGQwCitpbnQ2NHgxX3QgdnFhZGRfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYik7IC8vIFZRQURELlM2NCBkMCxkMCxkMAordWludDh4OF90IHZxYWRkX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZRQURELlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZxYWRkX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZRQURELlUxNiBkMCxkMCxkMAordWludDMyeDJfdCB2cWFkZF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWUUFERC5VMzIgZDAsZDAsZDAKK3VpbnQ2NHgxX3QgdnFhZGRfdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKTsgLy8gVlFBREQuVTY0IGQwLGQwLGQwCitpbnQ4eDE2X3QgdnFhZGRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZRQURELlM4IHEwLHEwLHEwCitpbnQxNng4X3QgdnFhZGRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUUFERC5TMTYgcTAscTAscTAKK2ludDMyeDRfdCB2cWFkZHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZRQURELlMzMiBxMCxxMCxxMAoraW50NjR4Ml90IHZxYWRkcV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlFBREQuUzY0IHEwLHEwLHEwCit1aW50OHgxNl90IHZxYWRkcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZRQURELlU4IHEwLHEwLHEwCit1aW50MTZ4OF90IHZxYWRkcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWUUFERC5VMTYgcTAscTAscTAKK3VpbnQzMng0X3QgdnFhZGRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZRQURELlUzMiBxMCxxMCxxMAordWludDY0eDJfdCB2cWFkZHFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVlFBREQuVTY0IHEwLHEwLHEwCisvL1ZlY3RvciBhZGQgaGlnaCBoYWxmOiB2YWRkaG4tPiBWcltpXTo9VmFbaV0rVmJbaV0KK2ludDh4OF90IHZhZGRobl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkFEREhOLkkxNiBkMCxxMCxxMAoraW50MTZ4NF90IHZhZGRobl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkFEREhOLkkzMiBkMCxxMCxxMAoraW50MzJ4Ml90IHZhZGRobl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVkFEREhOLkk2NCBkMCxxMCxxMAordWludDh4OF90IHZhZGRobl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWQURESE4uSTE2IGQwLHEwLHEwCit1aW50MTZ4NF90IHZhZGRobl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQURESE4uSTMyIGQwLHEwLHEwCit1aW50MzJ4Ml90IHZhZGRobl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWQURESE4uSTY0IGQwLHEwLHEwCisvL1ZlY3RvciByb3VuZGluZyBhZGQgaGlnaCBoYWxmOiB2cmFkZGhuCitpbnQ4eDhfdCB2cmFkZGhuX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUkFEREhOLkkxNiBkMCxxMCxxMAoraW50MTZ4NF90IHZyYWRkaG5fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZSQURESE4uSTMyIGQwLHEwLHEwCitpbnQzMngyX3QgdnJhZGRobl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlJBRERITi5JNjQgZDAscTAscTAKK3VpbnQ4eDhfdCB2cmFkZGhuX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZSQURESE4uSTE2IGQwLHEwLHEwCit1aW50MTZ4NF90IHZyYWRkaG5fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlJBRERITi5JMzIgZDAscTAscTAKK3VpbnQzMngyX3QgdnJhZGRobl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWUkFEREhOLkk2NCBkMCxxMCxxMAorLy9NdWx0aXBsaWNhdGlvbgorLy9WZWN0b3IgbXVsdGlwbHk6IHZtdWwgLT4gVnJbaV0gOj0gVmFbaV0gKiBWYltpXQoraW50OHg4X3Qgdm11bF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVk1VTC5JOCBkMCxkMCxkMAoraW50MTZ4NF90IHZtdWxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZNVUwuSTE2IGQwLGQwLGQwCitpbnQzMngyX3Qgdm11bF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVk1VTC5JMzIgZDAsZDAsZDAKK2Zsb2F0MzJ4Ml90IHZtdWxfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWTVVMLkYzMiBkMCxkMCxkMAordWludDh4OF90IHZtdWxfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVk1VTC5JOCBkMCxkMCxkMAordWludDE2eDRfdCB2bXVsX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZNVUwuSTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZtdWxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVk1VTC5JMzIgZDAsZDAsZDAKK3BvbHk4eDhfdCB2bXVsX3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYik7IC8vIFZNVUwuUDggZDAsZDAsZDAKK2ludDh4MTZfdCB2bXVscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWTVVMLkk4IHEwLHEwLHEwCitpbnQxNng4X3Qgdm11bHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZNVUwuSTE2IHEwLHEwLHEwCitpbnQzMng0X3Qgdm11bHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZNVUwuSTMyIHEwLHEwLHEwCitmbG9hdDMyeDRfdCB2bXVscV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZNVUwuRjMyIHEwLHEwLHEwCit1aW50OHgxNl90IHZtdWxxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVk1VTC5JOCBxMCxxMCxxMAordWludDE2eDhfdCB2bXVscV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWTVVMLkkxNiBxMCxxMCxxMAordWludDMyeDRfdCB2bXVscV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWTVVMLkkzMiBxMCxxMCxxMAorcG9seTh4MTZfdCB2bXVscV9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYik7IC8vIFZNVUwuUDggcTAscTAscTAKKy8vbXVsdGlwbHkgbGFuZQoraW50MTZ4NF90IHZtdWxfbGFuZV9zMTYgKGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpOworaW50MzJ4Ml90IHZtdWxfbGFuZV9zMzIgKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOworZmxvYXQzMngyX3Qgdm11bF9sYW5lX2YzMiAoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOwordWludDE2eDRfdCB2bXVsX2xhbmVfdTE2ICh1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpOwordWludDMyeDJfdCB2bXVsX2xhbmVfdTMyICh1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOworaW50MTZ4OF90IHZtdWxxX2xhbmVfczE2IChpbnQxNng4X3QgYSwgaW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKTsKK2ludDMyeDRfdCB2bXVscV9sYW5lX3MzMiAoaW50MzJ4NF90IGEsIGludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYyk7CitmbG9hdDMyeDRfdCB2bXVscV9sYW5lX2YzMiAoZmxvYXQzMng0X3QgYSwgZmxvYXQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOwordWludDE2eDhfdCB2bXVscV9sYW5lX3UxNiAodWludDE2eDhfdCBhLCB1aW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKTsKK3VpbnQzMng0X3Qgdm11bHFfbGFuZV91MzIgKHVpbnQzMng0X3QgYSwgdWludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYyk7CisvL1ZlY3RvciBtdWx0aXBseSBhY2N1bXVsYXRlOiB2bWxhIC0+IFZyW2ldIDo9IFZhW2ldICsgVmJbaV0gKiBWY1tpXQoraW50OHg4X3Qgdm1sYV9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVk1MQS5JOCBkMCxkMCxkMAoraW50MTZ4NF90IHZtbGFfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWTUxBLkkxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZtbGFfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpOyAvLyBWTUxBLkkzMiBkMCxkMCxkMAorZmxvYXQzMngyX3Qgdm1sYV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgYyk7IC8vIFZNTEEuRjMyIGQwLGQwLGQwCit1aW50OHg4X3Qgdm1sYV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVk1MQS5JOCBkMCxkMCxkMAordWludDE2eDRfdCB2bWxhX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCBjKTsgLy8gVk1MQS5JMTYgZDAsZDAsZDAKK3VpbnQzMngyX3Qgdm1sYV91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgYyk7IC8vIFZNTEEuSTMyIGQwLGQwLGQwCitpbnQ4eDE2X3Qgdm1sYXFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBpbnQ4eDE2X3QgYyk7IC8vIFZNTEEuSTggcTAscTAscTAKK2ludDE2eDhfdCB2bWxhcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgYyk7IC8vIFZNTEEuSTE2IHEwLHEwLHEwCitpbnQzMng0X3Qgdm1sYXFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4NF90IGMpOyAvLyBWTUxBLkkzMiBxMCxxMCxxMAorZmxvYXQzMng0X3Qgdm1sYXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4NF90IGMpOyAvLyBWTUxBLkYzMiBxMCxxMCxxMAordWludDh4MTZfdCB2bWxhcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgdWludDh4MTZfdCBjKTsgLy8gVk1MQS5JOCBxMCxxMCxxMAordWludDE2eDhfdCB2bWxhcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNng4X3QgYyk7IC8vIFZNTEEuSTE2IHEwLHEwLHEwCit1aW50MzJ4NF90IHZtbGFxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDRfdCBjKTsgLy8gVk1MQS5JMzIgcTAscTAscTAKKy8vVmVjdG9yIG11bHRpcGx5IGFjY3VtdWxhdGUgbG9uZzogdm1sYWwgLT4gVnJbaV0gOj0gVmFbaV0gKyBWYltpXSAqIFZjW2ldCitpbnQxNng4X3Qgdm1sYWxfczgoaW50MTZ4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpOyAvLyBWTUxBTC5TOCBxMCxkMCxkMAoraW50MzJ4NF90IHZtbGFsX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKTsgLy8gVk1MQUwuUzE2IHEwLGQwLGQwCitpbnQ2NHgyX3Qgdm1sYWxfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpOyAvLyBWTUxBTC5TMzIgcTAsZDAsZDAKK3VpbnQxNng4X3Qgdm1sYWxfdTgodWludDE2eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpOyAvLyBWTUxBTC5VOCBxMCxkMCxkMAordWludDMyeDRfdCB2bWxhbF91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYyk7IC8vIFZNTEFMLlUxNiBxMCxkMCxkMAordWludDY0eDJfdCB2bWxhbF91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgYyk7IC8vIFZNTEFMLlUzMiBxMCxkMCxkMAorLy9WZWN0b3IgbXVsdGlwbHkgc3VidHJhY3Q6IHZtbHMgLT4gVnJbaV0gOj0gVmFbaV0gLSBWYltpXSAqIFZjW2ldCitpbnQ4eDhfdCB2bWxzX3M4KGludDh4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpOyAvLyBWTUxTLkk4IGQwLGQwLGQwCitpbnQxNng0X3Qgdm1sc19zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYyk7IC8vIFZNTFMuSTE2IGQwLGQwLGQwCitpbnQzMngyX3Qgdm1sc19zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYyk7IC8vIFZNTFMuSTMyIGQwLGQwLGQwCitmbG9hdDMyeDJfdCB2bWxzX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDJfdCBjKTsgLy8gVk1MUy5GMzIgZDAsZDAsZDAKK3VpbnQ4eDhfdCB2bWxzX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpOyAvLyBWTUxTLkk4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZtbHNfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IGMpOyAvLyBWTUxTLkkxNiBkMCxkMCxkMAordWludDMyeDJfdCB2bWxzX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCBjKTsgLy8gVk1MUy5JMzIgZDAsZDAsZDAKK2ludDh4MTZfdCB2bWxzcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIGludDh4MTZfdCBjKTsgLy8gVk1MUy5JOCBxMCxxMCxxMAoraW50MTZ4OF90IHZtbHNxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCBjKTsgLy8gVk1MUy5JMTYgcTAscTAscTAKK2ludDMyeDRfdCB2bWxzcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgYyk7IC8vIFZNTFMuSTMyIHEwLHEwLHEwCitmbG9hdDMyeDRfdCB2bWxzcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMng0X3QgYyk7IC8vIFZNTFMuRjMyIHEwLHEwLHEwCit1aW50OHgxNl90IHZtbHNxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCB1aW50OHgxNl90IGMpOyAvLyBWTUxTLkk4IHEwLHEwLHEwCit1aW50MTZ4OF90IHZtbHNxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDhfdCBjKTsgLy8gVk1MUy5JMTYgcTAscTAscTAKK3VpbnQzMng0X3Qgdm1sc3FfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCB1aW50MzJ4NF90IGMpOyAvLyBWTUxTLkkzMiBxMCxxMCxxMAorLy9WZWN0b3IgbXVsdGlwbHkgc3VidHJhY3QgbG9uZworaW50MTZ4OF90IHZtbHNsX3M4KGludDE2eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVk1MU0wuUzggcTAsZDAsZDAKK2ludDMyeDRfdCB2bWxzbF9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYyk7IC8vIFZNTFNMLlMxNiBxMCxkMCxkMAoraW50NjR4Ml90IHZtbHNsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKTsgLy8gVk1MU0wuUzMyIHEwLGQwLGQwCit1aW50MTZ4OF90IHZtbHNsX3U4KHVpbnQxNng4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVk1MU0wuVTggcTAsZDAsZDAKK3VpbnQzMng0X3Qgdm1sc2xfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IGMpOyAvLyBWTUxTTC5VMTYgcTAsZDAsZDAKK3VpbnQ2NHgyX3Qgdm1sc2xfdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpOyAvLyBWTUxTTC5VMzIgcTAsZDAsZDAKKy8vVmVjdG9yIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgaGlnaAoraW50MTZ4NF90IHZxZG11bGhfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZRRE1VTEguUzE2IGQwLGQwLGQwCitpbnQzMngyX3QgdnFkbXVsaF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlFETVVMSC5TMzIgZDAsZDAsZDAKK2ludDE2eDhfdCB2cWRtdWxocV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlFETVVMSC5TMTYgcTAscTAscTAKK2ludDMyeDRfdCB2cWRtdWxocV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlFETVVMSC5TMzIgcTAscTAscTAKKy8vVmVjdG9yIHNhdHVyYXRpbmcgcm91bmRpbmcgZG91YmxpbmcgbXVsdGlwbHkgaGlnaAoraW50MTZ4NF90IHZxcmRtdWxoX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUVJETVVMSC5TMTYgZDAsZDAsZDAKK2ludDMyeDJfdCB2cXJkbXVsaF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlFSRE1VTEguUzMyIGQwLGQwLGQwCitpbnQxNng4X3QgdnFyZG11bGhxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUVJETVVMSC5TMTYgcTAscTAscTAKK2ludDMyeDRfdCB2cXJkbXVsaHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZRUkRNVUxILlMzMiBxMCxxMCxxMAorLy9WZWN0b3Igc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBhY2N1bXVsYXRlIGxvbmcKK2ludDMyeDRfdCB2cWRtbGFsX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKTsgLy8gVlFETUxBTC5TMTYgcTAsZDAsZDAKK2ludDY0eDJfdCB2cWRtbGFsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKTsgLy8gVlFETUxBTC5TMzIgcTAsZDAsZDAKKy8vVmVjdG9yIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgc3VidHJhY3QgbG9uZworaW50MzJ4NF90IHZxZG1sc2xfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWUURNTFNMLlMxNiBxMCxkMCxkMAoraW50NjR4Ml90IHZxZG1sc2xfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpOyAvLyBWUURNTFNMLlMzMiBxMCxkMCxkMAorLy9WZWN0b3IgbG9uZyBtdWx0aXBseQoraW50MTZ4OF90IHZtdWxsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWTVVMTC5TOCBxMCxkMCxkMAoraW50MzJ4NF90IHZtdWxsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWTVVMTC5TMTYgcTAsZDAsZDAKK2ludDY0eDJfdCB2bXVsbF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVk1VTEwuUzMyIHEwLGQwLGQwCit1aW50MTZ4OF90IHZtdWxsX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZNVUxMLlU4IHEwLGQwLGQwCit1aW50MzJ4NF90IHZtdWxsX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZNVUxMLlUxNiBxMCxkMCxkMAordWludDY0eDJfdCB2bXVsbF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWTVVMTC5VMzIgcTAsZDAsZDAKK3BvbHkxNng4X3Qgdm11bGxfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKTsgLy8gVk1VTEwuUDggcTAsZDAsZDAKKy8vVmVjdG9yIHNhdHVyYXRpbmcgZG91YmxpbmcgbG9uZyBtdWx0aXBseQoraW50MzJ4NF90IHZxZG11bGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZRRE1VTEwuUzE2IHEwLGQwLGQwCitpbnQ2NHgyX3QgdnFkbXVsbF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlFETVVMTC5TMzIgcTAsZDAsZDAKKy8vU3VidHJhY3Rpb24KKy8vVmVjdG9yIHN1YnRyYWN0CitpbnQ4eDhfdCB2c3ViX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWU1VCLkk4IGQwLGQwLGQwCitpbnQxNng0X3QgdnN1Yl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlNVQi5JMTYgZDAsZDAsZDAKK2ludDMyeDJfdCB2c3ViX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWU1VCLkkzMiBkMCxkMCxkMAoraW50NjR4MV90IHZzdWJfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYik7IC8vIFZTVUIuSTY0IGQwLGQwLGQwCitmbG9hdDMyeDJfdCB2c3ViX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVlNVQi5GMzIgZDAsZDAsZDAKK3VpbnQ4eDhfdCB2c3ViX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZTVUIuSTggZDAsZDAsZDAKK3VpbnQxNng0X3QgdnN1Yl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWU1VCLkkxNiBkMCxkMCxkMAordWludDMyeDJfdCB2c3ViX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZTVUIuSTMyIGQwLGQwLGQwCit1aW50NjR4MV90IHZzdWJfdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKTsgLy8gVlNVQi5JNjQgZDAsZDAsZDAKK2ludDh4MTZfdCB2c3VicV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWU1VCLkk4IHEwLHEwLHEwCitpbnQxNng4X3QgdnN1YnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZTVUIuSTE2IHEwLHEwLHEwCitpbnQzMng0X3QgdnN1YnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZTVUIuSTMyIHEwLHEwLHEwCitpbnQ2NHgyX3QgdnN1YnFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZTVUIuSTY0IHEwLHEwLHEwCitmbG9hdDMyeDRfdCB2c3VicV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZTVUIuRjMyIHEwLHEwLHEwCit1aW50OHgxNl90IHZzdWJxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVlNVQi5JOCBxMCxxMCxxMAordWludDE2eDhfdCB2c3VicV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWU1VCLkkxNiBxMCxxMCxxMAordWludDMyeDRfdCB2c3VicV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWU1VCLkkzMiBxMCxxMCxxMAordWludDY0eDJfdCB2c3VicV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWU1VCLkk2NCBxMCxxMCxxMAorLy9WZWN0b3IgbG9uZyBzdWJ0cmFjdDogdnN1YiAtPiBWcltpXTo9VmFbaV0rVmJbaV0KK2ludDE2eDhfdCB2c3VibF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlNVQkwuUzggcTAsZDAsZDAKK2ludDMyeDRfdCB2c3VibF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlNVQkwuUzE2IHEwLGQwLGQwCitpbnQ2NHgyX3QgdnN1YmxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZTVUJMLlMzMiBxMCxkMCxkMAordWludDE2eDhfdCB2c3VibF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWU1VCTC5VOCBxMCxkMCxkMAordWludDMyeDRfdCB2c3VibF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWU1VCTC5VMTYgcTAsZDAsZDAKK3VpbnQ2NHgyX3QgdnN1YmxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlNVQkwuVTMyIHEwLGQwLGQwCisvL1ZlY3RvciB3aWRlIHN1YnRyYWN0OiB2c3ViIC0+IFZyW2ldOj1WYVtpXStWYltpXQoraW50MTZ4OF90IHZzdWJ3X3M4KGludDE2eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlNVQlcuUzggcTAscTAsZDAKK2ludDMyeDRfdCB2c3Vid19zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlNVQlcuUzE2IHEwLHEwLGQwCitpbnQ2NHgyX3QgdnN1YndfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZTVUJXLlMzMiBxMCxxMCxkMAordWludDE2eDhfdCB2c3Vid191OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlNVQlcuVTggcTAscTAsZDAKK3VpbnQzMng0X3QgdnN1YndfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlNVQlcuVTE2IHEwLHEwLGQwCit1aW50NjR4Ml90IHZzdWJ3X3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZTVUJXLlUzMiBxMCxxMCxkMAorLy9WZWN0b3Igc2F0dXJhdGluZyBzdWJ0cmFjdAoraW50OHg4X3QgdnFzdWJfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZRU1VCLlM4IGQwLGQwLGQwCitpbnQxNng0X3QgdnFzdWJfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZRU1VCLlMxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZxc3ViX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUVNVQi5TMzIgZDAsZDAsZDAKK2ludDY0eDFfdCB2cXN1Yl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlFTVUIuUzY0IGQwLGQwLGQwCit1aW50OHg4X3QgdnFzdWJfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlFTVUIuVTggZDAsZDAsZDAKK3VpbnQxNng0X3QgdnFzdWJfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlFTVUIuVTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZxc3ViX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZRU1VCLlUzMiBkMCxkMCxkMAordWludDY0eDFfdCB2cXN1Yl91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpOyAvLyBWUVNVQi5VNjQgZDAsZDAsZDAKK2ludDh4MTZfdCB2cXN1YnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlFTVUIuUzggcTAscTAscTAKK2ludDE2eDhfdCB2cXN1YnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZRU1VCLlMxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZxc3VicV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlFTVUIuUzMyIHEwLHEwLHEwCitpbnQ2NHgyX3QgdnFzdWJxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWUVNVQi5TNjQgcTAscTAscTAKK3VpbnQ4eDE2X3QgdnFzdWJxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVlFTVUIuVTggcTAscTAscTAKK3VpbnQxNng4X3QgdnFzdWJxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZRU1VCLlUxNiBxMCxxMCxxMAordWludDMyeDRfdCB2cXN1YnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlFTVUIuVTMyIHEwLHEwLHEwCit1aW50NjR4Ml90IHZxc3VicV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWUVNVQi5VNjQgcTAscTAscTAKKy8vVmVjdG9yIGhhbHZpbmcgc3VidHJhY3QKK2ludDh4OF90IHZoc3ViX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWSFNVQi5TOCBkMCxkMCxkMAoraW50MTZ4NF90IHZoc3ViX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWSFNVQi5TMTYgZDAsZDAsZDAKK2ludDMyeDJfdCB2aHN1Yl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVkhTVUIuUzMyIGQwLGQwLGQwCit1aW50OHg4X3QgdmhzdWJfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkhTVUIuVTggZDAsZDAsZDAKK3VpbnQxNng0X3QgdmhzdWJfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkhTVUIuVTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZoc3ViX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZIU1VCLlUzMiBkMCxkMCxkMAoraW50OHgxNl90IHZoc3VicV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWSFNVQi5TOCBxMCxxMCxxMAoraW50MTZ4OF90IHZoc3VicV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkhTVUIuUzE2IHEwLHEwLHEwCitpbnQzMng0X3QgdmhzdWJxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWSFNVQi5TMzIgcTAscTAscTAKK3VpbnQ4eDE2X3QgdmhzdWJxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkhTVUIuVTggcTAscTAscTAKK3VpbnQxNng4X3QgdmhzdWJxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZIU1VCLlUxNiBxMCxxMCxxMAordWludDMyeDRfdCB2aHN1YnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkhTVUIuVTMyIHEwLHEwLHEwCisvL1ZlY3RvciBzdWJ0cmFjdCBoaWdoIGhhbGYKK2ludDh4OF90IHZzdWJobl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlNVQkhOLkkxNiBkMCxxMCxxMAoraW50MTZ4NF90IHZzdWJobl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlNVQkhOLkkzMiBkMCxxMCxxMAoraW50MzJ4Ml90IHZzdWJobl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlNVQkhOLkk2NCBkMCxxMCxxMAordWludDh4OF90IHZzdWJobl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWU1VCSE4uSTE2IGQwLHEwLHEwCit1aW50MTZ4NF90IHZzdWJobl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWU1VCSE4uSTMyIGQwLHEwLHEwCit1aW50MzJ4Ml90IHZzdWJobl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWU1VCSE4uSTY0IGQwLHEwLHEwCisvL1ZlY3RvciByb3VuZGluZyBzdWJ0cmFjdCBoaWdoIGhhbGYKK2ludDh4OF90IHZyc3ViaG5fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZSU1VCSE4uSTE2IGQwLHEwLHEwCitpbnQxNng0X3QgdnJzdWJobl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlJTVUJITi5JMzIgZDAscTAscTAKK2ludDMyeDJfdCB2cnN1YmhuX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWUlNVQkhOLkk2NCBkMCxxMCxxMAordWludDh4OF90IHZyc3ViaG5fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlJTVUJITi5JMTYgZDAscTAscTAKK3VpbnQxNng0X3QgdnJzdWJobl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWUlNVQkhOLkkzMiBkMCxxMCxxMAordWludDMyeDJfdCB2cnN1YmhuX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZSU1VCSE4uSTY0IGQwLHEwLHEwCisvL0NvbXBhcmlzb24KKy8vVmVjdG9yIGNvbXBhcmUgZXF1YWwKK3VpbnQ4eDhfdCB2Y2VxX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQ0VRLkk4IGQwLCBkMCwgZDAKK3VpbnQxNng0X3QgdmNlcV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkNFUS5JMTYgZDAsIGQwLCBkMAordWludDMyeDJfdCB2Y2VxX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQ0VRLkkzMiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjZXFfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQ0VRLkYzMiBkMCwgZDAsIGQwCit1aW50OHg4X3QgdmNlcV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQ0VRLkk4IGQwLCBkMCwgZDAKK3VpbnQxNng0X3QgdmNlcV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWQ0VRLkkxNiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjZXFfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkNFUS5JMzIgZDAsIGQwLCBkMAordWludDh4OF90IHZjZXFfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKTsgLy8gVkNFUS5JOCBkMCwgZDAsIGQwCit1aW50OHgxNl90IHZjZXFxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZDRVEuSTggcTAsIHEwLCBxMAordWludDE2eDhfdCB2Y2VxcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkNFUS5JMTYgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2VxcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkNFUS5JMzIgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2VxcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZDRVEuRjMyIHEwLCBxMCwgcTAKK3VpbnQ4eDE2X3QgdmNlcXFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQ0VRLkk4IHEwLCBxMCwgcTAKK3VpbnQxNng4X3QgdmNlcXFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkNFUS5JMTYgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2VxcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQ0VRLkkzMiBxMCwgcTAsIHEwCit1aW50OHgxNl90IHZjZXFxX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiKTsgLy8gVkNFUS5JOCBxMCwgcTAsIHEwCisvL1ZlY3RvciBjb21wYXJlIGdyZWF0ZXItdGhhbiBvciBlcXVhbAordWludDh4OF90IHZjZ2VfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZDR0UuUzggZDAsIGQwLCBkMAordWludDE2eDRfdCB2Y2dlX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWQ0dFLlMxNiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjZ2VfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZDR0UuUzMyIGQwLCBkMCwgZDAKK3VpbnQzMngyX3QgdmNnZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZDR0UuRjMyIGQwLCBkMCwgZDAKK3VpbnQ4eDhfdCB2Y2dlX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZDR0UuVTggZDAsIGQwLCBkMAordWludDE2eDRfdCB2Y2dlX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZDR0UuVTE2IGQwLCBkMCwgZDAKK3VpbnQzMngyX3QgdmNnZV91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWQ0dFLlUzMiBkMCwgZDAsIGQwCit1aW50OHgxNl90IHZjZ2VxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZDR0UuUzggcTAsIHEwLCBxMAordWludDE2eDhfdCB2Y2dlcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkNHRS5TMTYgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2dlcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkNHRS5TMzIgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2dlcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZDR0UuRjMyIHEwLCBxMCwgcTAKK3VpbnQ4eDE2X3QgdmNnZXFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQ0dFLlU4IHEwLCBxMCwgcTAKK3VpbnQxNng4X3QgdmNnZXFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkNHRS5VMTYgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2dlcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQ0dFLlUzMiBxMCwgcTAsIHEwCisvL1ZlY3RvciBjb21wYXJlIGxlc3MtdGhhbiBvciBlcXVhbAordWludDh4OF90IHZjbGVfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZDR0UuUzggZDAsIGQwLCBkMAordWludDE2eDRfdCB2Y2xlX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWQ0dFLlMxNiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjbGVfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZDR0UuUzMyIGQwLCBkMCwgZDAKK3VpbnQzMngyX3QgdmNsZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZDR0UuRjMyIGQwLCBkMCwgZDAKK3VpbnQ4eDhfdCB2Y2xlX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZDR0UuVTggZDAsIGQwLCBkMAordWludDE2eDRfdCB2Y2xlX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZDR0UuVTE2IGQwLCBkMCwgZDAKK3VpbnQzMngyX3QgdmNsZV91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWQ0dFLlUzMiBkMCwgZDAsIGQwCit1aW50OHgxNl90IHZjbGVxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZDR0UuUzggcTAsIHEwLCBxMAordWludDE2eDhfdCB2Y2xlcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkNHRS5TMTYgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2xlcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkNHRS5TMzIgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2xlcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZDR0UuRjMyIHEwLCBxMCwgcTAKK3VpbnQ4eDE2X3QgdmNsZXFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQ0dFLlU4IHEwLCBxMCwgcTAKK3VpbnQxNng4X3QgdmNsZXFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkNHRS5VMTYgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2xlcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQ0dFLlUzMiBxMCwgcTAsIHEwCisvL1ZlY3RvciBjb21wYXJlIGdyZWF0ZXItdGhhbgordWludDh4OF90IHZjZ3RfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZDR1QuUzggZDAsIGQwLCBkMAordWludDE2eDRfdCB2Y2d0X3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWQ0dULlMxNiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjZ3RfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZDR1QuUzMyIGQwLCBkMCwgZDAKK3VpbnQzMngyX3QgdmNndF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZDR1QuRjMyIGQwLCBkMCwgZDAKK3VpbnQ4eDhfdCB2Y2d0X3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZDR1QuVTggZDAsIGQwLCBkMAordWludDE2eDRfdCB2Y2d0X3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZDR1QuVTE2IGQwLCBkMCwgZDAKK3VpbnQzMngyX3QgdmNndF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWQ0dULlUzMiBkMCwgZDAsIGQwCit1aW50OHgxNl90IHZjZ3RxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZDR1QuUzggcTAsIHEwLCBxMAordWludDE2eDhfdCB2Y2d0cV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkNHVC5TMTYgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2d0cV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkNHVC5TMzIgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2d0cV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZDR1QuRjMyIHEwLCBxMCwgcTAKK3VpbnQ4eDE2X3QgdmNndHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQ0dULlU4IHEwLCBxMCwgcTAKK3VpbnQxNng4X3QgdmNndHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkNHVC5VMTYgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2d0cV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQ0dULlUzMiBxMCwgcTAsIHEwCisvL1ZlY3RvciBjb21wYXJlIGxlc3MtdGhhbgordWludDh4OF90IHZjbHRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZDR1QuUzggZDAsIGQwLCBkMAordWludDE2eDRfdCB2Y2x0X3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWQ0dULlMxNiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjbHRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZDR1QuUzMyIGQwLCBkMCwgZDAKK3VpbnQzMngyX3QgdmNsdF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZDR1QuRjMyIGQwLCBkMCwgZDAKK3VpbnQ4eDhfdCB2Y2x0X3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZDR1QuVTggZDAsIGQwLCBkMAordWludDE2eDRfdCB2Y2x0X3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZDR1QuVTE2IGQwLCBkMCwgZDAKK3VpbnQzMngyX3QgdmNsdF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWQ0dULlUzMiBkMCwgZDAsIGQwCit1aW50OHgxNl90IHZjbHRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZDR1QuUzggcTAsIHEwLCBxMAordWludDE2eDhfdCB2Y2x0cV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkNHVC5TMTYgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2x0cV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkNHVC5TMzIgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2x0cV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZDR1QuRjMyIHEwLCBxMCwgcTAKK3VpbnQ4eDE2X3QgdmNsdHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQ0dULlU4IHEwLCBxMCwgcTAKK3VpbnQxNng4X3QgdmNsdHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkNHVC5VMTYgcTAsIHEwLCBxMAordWludDMyeDRfdCB2Y2x0cV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQ0dULlUzMiBxMCwgcTAsIHEwCisvL1ZlY3RvciBjb21wYXJlIGFic29sdXRlIGdyZWF0ZXItdGhhbiBvciBlcXVhbAordWludDMyeDJfdCB2Y2FnZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZBQ0dFLkYzMiBkMCwgZDAsIGQwCit1aW50MzJ4NF90IHZjYWdlcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZBQ0dFLkYzMiBxMCwgcTAsIHEwCisvL1ZlY3RvciBjb21wYXJlIGFic29sdXRlIGxlc3MtdGhhbiBvciBlcXVhbAordWludDMyeDJfdCB2Y2FsZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZBQ0dFLkYzMiBkMCwgZDAsIGQwCit1aW50MzJ4NF90IHZjYWxlcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZBQ0dFLkYzMiBxMCwgcTAsIHEwCisvL1ZlY3RvciBjb21wYXJlIGFic29sdXRlIGdyZWF0ZXItdGhhbgordWludDMyeDJfdCB2Y2FndF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZBQ0dULkYzMiBkMCwgZDAsIGQwCit1aW50MzJ4NF90IHZjYWd0cV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZBQ0dULkYzMiBxMCwgcTAsIHEwCisvL1ZlY3RvciBjb21wYXJlIGFic29sdXRlIGxlc3MtdGhhbgordWludDMyeDJfdCB2Y2FsdF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZBQ0dULkYzMiBkMCwgZDAsIGQwCit1aW50MzJ4NF90IHZjYWx0cV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZBQ0dULkYzMiBxMCwgcTAsIHEwCisvL1ZlY3RvciB0ZXN0IGJpdHMKK3VpbnQ4eDhfdCB2dHN0X3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWVFNULjggZDAsIGQwLCBkMAordWludDE2eDRfdCB2dHN0X3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWVFNULjE2IGQwLCBkMCwgZDAKK3VpbnQzMngyX3QgdnRzdF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlRTVC4zMiBkMCwgZDAsIGQwCit1aW50OHg4X3QgdnRzdF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWVFNULjggZDAsIGQwLCBkMAordWludDE2eDRfdCB2dHN0X3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZUU1QuMTYgZDAsIGQwLCBkMAordWludDMyeDJfdCB2dHN0X3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZUU1QuMzIgZDAsIGQwLCBkMAordWludDh4OF90IHZ0c3RfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKTsgLy8gVlRTVC44IGQwLCBkMCwgZDAKK3VpbnQ4eDE2X3QgdnRzdHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlRTVC44IHEwLCBxMCwgcTAKK3VpbnQxNng4X3QgdnRzdHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZUU1QuMTYgcTAsIHEwLCBxMAordWludDMyeDRfdCB2dHN0cV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlRTVC4zMiBxMCwgcTAsIHEwCit1aW50OHgxNl90IHZ0c3RxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVlRTVC44IHEwLCBxMCwgcTAKK3VpbnQxNng4X3QgdnRzdHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlRTVC4xNiBxMCwgcTAsIHEwCit1aW50MzJ4NF90IHZ0c3RxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZUU1QuMzIgcTAsIHEwLCBxMAordWludDh4MTZfdCB2dHN0cV9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYik7IC8vIFZUU1QuOCBxMCwgcTAsIHEwCisvL0Fic29sdXRlIGRpZmZlcmVuY2UKKy8vQWJzb2x1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhcmd1bWVudHM6IFZyW2ldID0gfCBWYVtpXSAtIFZiW2ldIHwKK2ludDh4OF90IHZhYmRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZBQkQuUzggZDAsZDAsZDAKK2ludDE2eDRfdCB2YWJkX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWQUJELlMxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZhYmRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZBQkQuUzMyIGQwLGQwLGQwCit1aW50OHg4X3QgdmFiZF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQUJELlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZhYmRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkFCRC5VMTYgZDAsZDAsZDAKK3VpbnQzMngyX3QgdmFiZF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWQUJELlUzMiBkMCxkMCxkMAorZmxvYXQzMngyX3QgdmFiZF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZBQkQuRjMyIGQwLGQwLGQwCitpbnQ4eDE2X3QgdmFiZHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkFCRC5TOCBxMCxxMCxxMAoraW50MTZ4OF90IHZhYmRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWQUJELlMxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZhYmRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWQUJELlMzMiBxMCxxMCxxMAordWludDh4MTZfdCB2YWJkcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZBQkQuVTggcTAscTAscTAKK3VpbnQxNng4X3QgdmFiZHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkFCRC5VMTYgcTAscTAscTAKK3VpbnQzMng0X3QgdmFiZHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkFCRC5VMzIgcTAscTAscTAKK2Zsb2F0MzJ4NF90IHZhYmRxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVkFCRC5GMzIgcTAscTAscTAKKy8vQWJzb2x1dGUgZGlmZmVyZW5jZSAtIGxvbmcKK2ludDE2eDhfdCB2YWJkbF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkFCREwuUzggcTAsZDAsZDAKK2ludDMyeDRfdCB2YWJkbF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkFCREwuUzE2IHEwLGQwLGQwCitpbnQ2NHgyX3QgdmFiZGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZBQkRMLlMzMiBxMCxkMCxkMAordWludDE2eDhfdCB2YWJkbF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQUJETC5VOCBxMCxkMCxkMAordWludDMyeDRfdCB2YWJkbF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWQUJETC5VMTYgcTAsZDAsZDAKK3VpbnQ2NHgyX3QgdmFiZGxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkFCREwuVTMyIHEwLGQwLGQwCisvL0Fic29sdXRlIGRpZmZlcmVuY2UgYW5kIGFjY3VtdWxhdGU6IFZyW2ldID0gVmFbaV0gKyB8IFZiW2ldIC0gVmNbaV0gfAoraW50OHg4X3QgdmFiYV9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVkFCQS5TOCBkMCxkMCxkMAoraW50MTZ4NF90IHZhYmFfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWQUJBLlMxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZhYmFfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpOyAvLyBWQUJBLlMzMiBkMCxkMCxkMAordWludDh4OF90IHZhYmFfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZBQkEuVTggZDAsZDAsZDAKK3VpbnQxNng0X3QgdmFiYV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYyk7IC8vIFZBQkEuVTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZhYmFfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpOyAvLyBWQUJBLlUzMiBkMCxkMCxkMAoraW50OHgxNl90IHZhYmFxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgaW50OHgxNl90IGMpOyAvLyBWQUJBLlM4IHEwLHEwLHEwCitpbnQxNng4X3QgdmFiYXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IGMpOyAvLyBWQUJBLlMxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZhYmFxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCBjKTsgLy8gVkFCQS5TMzIgcTAscTAscTAKK3VpbnQ4eDE2X3QgdmFiYXFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIHVpbnQ4eDE2X3QgYyk7IC8vIFZBQkEuVTggcTAscTAscTAKK3VpbnQxNng4X3QgdmFiYXFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZ4OF90IGMpOyAvLyBWQUJBLlUxNiBxMCxxMCxxMAordWludDMyeDRfdCB2YWJhcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMng0X3QgYyk7IC8vIFZBQkEuVTMyIHEwLHEwLHEwCisvL0Fic29sdXRlIGRpZmZlcmVuY2UgYW5kIGFjY3VtdWxhdGUgLSBsb25nCitpbnQxNng4X3QgdmFiYWxfczgoaW50MTZ4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpOyAvLyBWQUJBTC5TOCBxMCxkMCxkMAoraW50MzJ4NF90IHZhYmFsX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKTsgLy8gVkFCQUwuUzE2IHEwLGQwLGQwCitpbnQ2NHgyX3QgdmFiYWxfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpOyAvLyBWQUJBTC5TMzIgcTAsZDAsZDAKK3VpbnQxNng4X3QgdmFiYWxfdTgodWludDE2eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpOyAvLyBWQUJBTC5VOCBxMCxkMCxkMAordWludDMyeDRfdCB2YWJhbF91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYyk7IC8vIFZBQkFMLlUxNiBxMCxkMCxkMAordWludDY0eDJfdCB2YWJhbF91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgYyk7IC8vIFZBQkFMLlUzMiBxMCxkMCxkMAorLy9NYXgvTWluCisvL3ZtYXggLT4gVnJbaV0gOj0gKFZhW2ldID49IFZiW2ldKSA/IFZhW2ldIDogVmJbaV0KK2ludDh4OF90IHZtYXhfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZNQVguUzggZDAsZDAsZDAKK2ludDE2eDRfdCB2bWF4X3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWTUFYLlMxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZtYXhfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZNQVguUzMyIGQwLGQwLGQwCit1aW50OHg4X3Qgdm1heF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWTUFYLlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZtYXhfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVk1BWC5VMTYgZDAsZDAsZDAKK3VpbnQzMngyX3Qgdm1heF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWTUFYLlUzMiBkMCxkMCxkMAorZmxvYXQzMngyX3Qgdm1heF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZNQVguRjMyIGQwLGQwLGQwCitpbnQ4eDE2X3Qgdm1heHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVk1BWC5TOCBxMCxxMCxxMAoraW50MTZ4OF90IHZtYXhxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWTUFYLlMxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZtYXhxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWTUFYLlMzMiBxMCxxMCxxMAordWludDh4MTZfdCB2bWF4cV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZNQVguVTggcTAscTAscTAKK3VpbnQxNng4X3Qgdm1heHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVk1BWC5VMTYgcTAscTAscTAKK3VpbnQzMng0X3Qgdm1heHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVk1BWC5VMzIgcTAscTAscTAKK2Zsb2F0MzJ4NF90IHZtYXhxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVk1BWC5GMzIgcTAscTAscTAKKy8vdm1pbiAtPiBWcltpXSA6PSAoVmFbaV0gPj0gVmJbaV0pID8gVmJbaV0gOiBWYVtpXQoraW50OHg4X3Qgdm1pbl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVk1JTi5TOCBkMCxkMCxkMAoraW50MTZ4NF90IHZtaW5fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZNSU4uUzE2IGQwLGQwLGQwCitpbnQzMngyX3Qgdm1pbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVk1JTi5TMzIgZDAsZDAsZDAKK3VpbnQ4eDhfdCB2bWluX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZNSU4uVTggZDAsZDAsZDAKK3VpbnQxNng0X3Qgdm1pbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWTUlOLlUxNiBkMCxkMCxkMAordWludDMyeDJfdCB2bWluX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZNSU4uVTMyIGQwLGQwLGQwCitmbG9hdDMyeDJfdCB2bWluX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVk1JTi5GMzIgZDAsZDAsZDAKK2ludDh4MTZfdCB2bWlucV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWTUlOLlM4IHEwLHEwLHEwCitpbnQxNng4X3Qgdm1pbnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZNSU4uUzE2IHEwLHEwLHEwCitpbnQzMng0X3Qgdm1pbnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZNSU4uUzMyIHEwLHEwLHEwCit1aW50OHgxNl90IHZtaW5xX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVk1JTi5VOCBxMCxxMCxxMAordWludDE2eDhfdCB2bWlucV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWTUlOLlUxNiBxMCxxMCxxMAordWludDMyeDRfdCB2bWlucV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWTUlOLlUzMiBxMCxxMCxxMAorZmxvYXQzMng0X3Qgdm1pbnFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWTUlOLkYzMiBxMCxxMCxxMAorLy9QYWlyd2lzZSBhZGRpdGlvbgorLy9QYWlyd2lzZSBhZGQKK2ludDh4OF90IHZwYWRkX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUEFERC5JOCBkMCxkMCxkMAoraW50MTZ4NF90IHZwYWRkX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUEFERC5JMTYgZDAsZDAsZDAKK2ludDMyeDJfdCB2cGFkZF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlBBREQuSTMyIGQwLGQwLGQwCit1aW50OHg4X3QgdnBhZGRfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlBBREQuSTggZDAsZDAsZDAKK3VpbnQxNng0X3QgdnBhZGRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlBBREQuSTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZwYWRkX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZQQURELkkzMiBkMCxkMCxkMAorZmxvYXQzMngyX3QgdnBhZGRfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWUEFERC5GMzIgZDAsZDAsZDAKKy8vTG9uZyBwYWlyd2lzZSBhZGQKK2ludDE2eDRfdCB2cGFkZGxfczgoaW50OHg4X3QgYSk7IC8vIFZQQURETC5TOCBkMCxkMAoraW50MzJ4Ml90IHZwYWRkbF9zMTYoaW50MTZ4NF90IGEpOyAvLyBWUEFEREwuUzE2IGQwLGQwCitpbnQ2NHgxX3QgdnBhZGRsX3MzMihpbnQzMngyX3QgYSk7IC8vIFZQQURETC5TMzIgZDAsZDAKK3VpbnQxNng0X3QgdnBhZGRsX3U4KHVpbnQ4eDhfdCBhKTsgLy8gVlBBRERMLlU4IGQwLGQwCit1aW50MzJ4Ml90IHZwYWRkbF91MTYodWludDE2eDRfdCBhKTsgLy8gVlBBRERMLlUxNiBkMCxkMAordWludDY0eDFfdCB2cGFkZGxfdTMyKHVpbnQzMngyX3QgYSk7IC8vIFZQQURETC5VMzIgZDAsZDAKK2ludDE2eDhfdCB2cGFkZGxxX3M4KGludDh4MTZfdCBhKTsgLy8gVlBBRERMLlM4IHEwLHEwCitpbnQzMng0X3QgdnBhZGRscV9zMTYoaW50MTZ4OF90IGEpOyAvLyBWUEFEREwuUzE2IHEwLHEwCitpbnQ2NHgyX3QgdnBhZGRscV9zMzIoaW50MzJ4NF90IGEpOyAvLyBWUEFEREwuUzMyIHEwLHEwCit1aW50MTZ4OF90IHZwYWRkbHFfdTgodWludDh4MTZfdCBhKTsgLy8gVlBBRERMLlU4IHEwLHEwCit1aW50MzJ4NF90IHZwYWRkbHFfdTE2KHVpbnQxNng4X3QgYSk7IC8vIFZQQURETC5VMTYgcTAscTAKK3VpbnQ2NHgyX3QgdnBhZGRscV91MzIodWludDMyeDRfdCBhKTsgLy8gVlBBRERMLlUzMiBxMCxxMAorLy9Mb25nIHBhaXJ3aXNlIGFkZCBhbmQgYWNjdW11bGF0ZQoraW50MTZ4NF90IHZwYWRhbF9zOChpbnQxNng0X3QgYSwgaW50OHg4X3QgYik7IC8vIFZQQURBTC5TOCBkMCxkMAoraW50MzJ4Ml90IHZwYWRhbF9zMTYoaW50MzJ4Ml90IGEsIGludDE2eDRfdCBiKTsgLy8gVlBBREFMLlMxNiBkMCxkMAoraW50NjR4MV90IHZwYWRhbF9zMzIoaW50NjR4MV90IGEsIGludDMyeDJfdCBiKTsgLy8gVlBBREFMLlMzMiBkMCxkMAordWludDE2eDRfdCB2cGFkYWxfdTgodWludDE2eDRfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZQQURBTC5VOCBkMCxkMAordWludDMyeDJfdCB2cGFkYWxfdTE2KHVpbnQzMngyX3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlBBREFMLlUxNiBkMCxkMAordWludDY0eDFfdCB2cGFkYWxfdTMyKHVpbnQ2NHgxX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlBBREFMLlUzMiBkMCxkMAoraW50MTZ4OF90IHZwYWRhbHFfczgoaW50MTZ4OF90IGEsIGludDh4MTZfdCBiKTsgLy8gVlBBREFMLlM4IHEwLHEwCitpbnQzMng0X3QgdnBhZGFscV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlBBREFMLlMxNiBxMCxxMAoraW50NjR4Ml90IHZwYWRhbHFfczMyKGludDY0eDJfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZQQURBTC5TMzIgcTAscTAKK3VpbnQxNng4X3QgdnBhZGFscV91OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZQQURBTC5VOCBxMCxxMAordWludDMyeDRfdCB2cGFkYWxxX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZQQURBTC5VMTYgcTAscTAKK3VpbnQ2NHgyX3QgdnBhZGFscV91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWUEFEQUwuVTMyIHEwLHEwCisvL0ZvbGRpbmcgbWF4aW11bSB2cG1heCAtPiB0YWtlcyBtYXhpbXVtIG9mIGFkamFjZW50IHBhaXJzCitpbnQ4eDhfdCB2cG1heF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlBNQVguUzggZDAsZDAsZDAKK2ludDE2eDRfdCB2cG1heF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlBNQVguUzE2IGQwLGQwLGQwCitpbnQzMngyX3QgdnBtYXhfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZQTUFYLlMzMiBkMCxkMCxkMAordWludDh4OF90IHZwbWF4X3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZQTUFYLlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZwbWF4X3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZQTUFYLlUxNiBkMCxkMCxkMAordWludDMyeDJfdCB2cG1heF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWUE1BWC5VMzIgZDAsZDAsZDAKK2Zsb2F0MzJ4Ml90IHZwbWF4X2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVlBNQVguRjMyIGQwLGQwLGQwCisvL0ZvbGRpbmcgbWluaW11bSB2cG1pbiAtPiB0YWtlcyBtaW5pbXVtIG9mIGFkamFjZW50IHBhaXJzCitpbnQ4eDhfdCB2cG1pbl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlBNSU4uUzggZDAsZDAsZDAKK2ludDE2eDRfdCB2cG1pbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlBNSU4uUzE2IGQwLGQwLGQwCitpbnQzMngyX3QgdnBtaW5fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZQTUlOLlMzMiBkMCxkMCxkMAordWludDh4OF90IHZwbWluX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZQTUlOLlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZwbWluX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZQTUlOLlUxNiBkMCxkMCxkMAordWludDMyeDJfdCB2cG1pbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWUE1JTi5VMzIgZDAsZDAsZDAKK2Zsb2F0MzJ4Ml90IHZwbWluX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVlBNSU4uRjMyIGQwLGQwLGQwCisvL1JlY2lwcm9jYWwvU3FydAorZmxvYXQzMngyX3QgdnJlY3BzX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVlJFQ1BTLkYzMiBkMCwgZDAsIGQwCitmbG9hdDMyeDRfdCB2cmVjcHNxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVlJFQ1BTLkYzMiBxMCwgcTAsIHEwCitmbG9hdDMyeDJfdCB2cnNxcnRzX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVlJTUVJUUy5GMzIgZDAsIGQwLCBkMAorZmxvYXQzMng0X3QgdnJzcXJ0c3FfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWUlNRUlRTLkYzMiBxMCwgcTAsIHEwCisvL1NoaWZ0cyBieSBzaWduZWQgdmFyaWFibGUKKy8vVmVjdG9yIHNoaWZ0IGxlZnQ6IFZyW2ldIDo9IFZhW2ldIDw8IFZiW2ldIChuZWdhdGl2ZSB2YWx1ZXMgc2hpZnQgcmlnaHQpCitpbnQ4eDhfdCB2c2hsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWU0hMLlM4IGQwLGQwLGQwCitpbnQxNng0X3QgdnNobF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlNITC5TMTYgZDAsZDAsZDAKK2ludDMyeDJfdCB2c2hsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWU0hMLlMzMiBkMCxkMCxkMAoraW50NjR4MV90IHZzaGxfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYik7IC8vIFZTSEwuUzY0IGQwLGQwLGQwCit1aW50OHg4X3QgdnNobF91OCh1aW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZTSEwuVTggZDAsZDAsZDAKK3VpbnQxNng0X3QgdnNobF91MTYodWludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZTSEwuVTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZzaGxfdTMyKHVpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWU0hMLlUzMiBkMCxkMCxkMAordWludDY0eDFfdCB2c2hsX3U2NCh1aW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlNITC5VNjQgZDAsZDAsZDAKK2ludDh4MTZfdCB2c2hscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWU0hMLlM4IHEwLHEwLHEwCitpbnQxNng4X3QgdnNobHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZTSEwuUzE2IHEwLHEwLHEwCitpbnQzMng0X3QgdnNobHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZTSEwuUzMyIHEwLHEwLHEwCitpbnQ2NHgyX3QgdnNobHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZTSEwuUzY0IHEwLHEwLHEwCit1aW50OHgxNl90IHZzaGxxX3U4KHVpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWU0hMLlU4IHEwLHEwLHEwCit1aW50MTZ4OF90IHZzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlNITC5VMTYgcTAscTAscTAKK3VpbnQzMng0X3QgdnNobHFfdTMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWU0hMLlUzMiBxMCxxMCxxMAordWludDY0eDJfdCB2c2hscV91NjQodWludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZTSEwuVTY0IHEwLHEwLHEwCisvL1ZlY3RvciBzYXR1cmF0aW5nIHNoaWZ0IGxlZnQ6IChuZWdhdGl2ZSB2YWx1ZXMgc2hpZnQgcmlnaHQpCitpbnQ4eDhfdCB2cXNobF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlFTSEwuUzggZDAsZDAsZDAKK2ludDE2eDRfdCB2cXNobF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlFTSEwuUzE2IGQwLGQwLGQwCitpbnQzMngyX3QgdnFzaGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZRU0hMLlMzMiBkMCxkMCxkMAoraW50NjR4MV90IHZxc2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWUVNITC5TNjQgZDAsZDAsZDAKK3VpbnQ4eDhfdCB2cXNobF91OCh1aW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZRU0hMLlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZxc2hsX3UxNih1aW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlFTSEwuVTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZxc2hsX3UzMih1aW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlFTSEwuVTMyIGQwLGQwLGQwCit1aW50NjR4MV90IHZxc2hsX3U2NCh1aW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlFTSEwuVTY0IGQwLGQwLGQwCitpbnQ4eDE2X3QgdnFzaGxxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZRU0hMLlM4IHEwLHEwLHEwCitpbnQxNng4X3QgdnFzaGxxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUVNITC5TMTYgcTAscTAscTAKK2ludDMyeDRfdCB2cXNobHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZRU0hMLlMzMiBxMCxxMCxxMAoraW50NjR4Ml90IHZxc2hscV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlFTSEwuUzY0IHEwLHEwLHEwCit1aW50OHgxNl90IHZxc2hscV91OCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlFTSEwuVTggcTAscTAscTAKK3VpbnQxNng4X3QgdnFzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlFTSEwuVTE2IHEwLHEwLHEwCit1aW50MzJ4NF90IHZxc2hscV91MzIodWludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZRU0hMLlUzMiBxMCxxMCxxMAordWludDY0eDJfdCB2cXNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWUVNITC5VNjQgcTAscTAscTAKKy8vVmVjdG9yIHJvdW5kaW5nIHNoaWZ0IGxlZnQ6IChuZWdhdGl2ZSB2YWx1ZXMgc2hpZnQgcmlnaHQpCitpbnQ4eDhfdCB2cnNobF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlJTSEwuUzggZDAsZDAsZDAKK2ludDE2eDRfdCB2cnNobF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlJTSEwuUzE2IGQwLGQwLGQwCitpbnQzMngyX3QgdnJzaGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZSU0hMLlMzMiBkMCxkMCxkMAoraW50NjR4MV90IHZyc2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWUlNITC5TNjQgZDAsZDAsZDAKK3VpbnQ4eDhfdCB2cnNobF91OCh1aW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZSU0hMLlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZyc2hsX3UxNih1aW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlJTSEwuVTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZyc2hsX3UzMih1aW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlJTSEwuVTMyIGQwLGQwLGQwCit1aW50NjR4MV90IHZyc2hsX3U2NCh1aW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlJTSEwuVTY0IGQwLGQwLGQwCitpbnQ4eDE2X3QgdnJzaGxxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZSU0hMLlM4IHEwLHEwLHEwCitpbnQxNng4X3QgdnJzaGxxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUlNITC5TMTYgcTAscTAscTAKK2ludDMyeDRfdCB2cnNobHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZSU0hMLlMzMiBxMCxxMCxxMAoraW50NjR4Ml90IHZyc2hscV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlJTSEwuUzY0IHEwLHEwLHEwCit1aW50OHgxNl90IHZyc2hscV91OCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlJTSEwuVTggcTAscTAscTAKK3VpbnQxNng4X3QgdnJzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlJTSEwuVTE2IHEwLHEwLHEwCit1aW50MzJ4NF90IHZyc2hscV91MzIodWludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZSU0hMLlUzMiBxMCxxMCxxMAordWludDY0eDJfdCB2cnNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWUlNITC5VNjQgcTAscTAscTAKKy8vVmVjdG9yIHNhdHVyYXRpbmcgcm91bmRpbmcgc2hpZnQgbGVmdDogKG5lZ2F0aXZlIHZhbHVlcyBzaGlmdCByaWdodCkKK2ludDh4OF90IHZxcnNobF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlFSU0hMLlM4IGQwLGQwLGQwCitpbnQxNng0X3QgdnFyc2hsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUVJTSEwuUzE2IGQwLGQwLGQwCitpbnQzMngyX3QgdnFyc2hsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUVJTSEwuUzMyIGQwLGQwLGQwCitpbnQ2NHgxX3QgdnFyc2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWUVJTSEwuUzY0IGQwLGQwLGQwCit1aW50OHg4X3QgdnFyc2hsX3U4KHVpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlFSU0hMLlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZxcnNobF91MTYodWludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZRUlNITC5VMTYgZDAsZDAsZDAKK3VpbnQzMngyX3QgdnFyc2hsX3UzMih1aW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlFSU0hMLlUzMiBkMCxkMCxkMAordWludDY0eDFfdCB2cXJzaGxfdTY0KHVpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWUVJTSEwuVTY0IGQwLGQwLGQwCitpbnQ4eDE2X3QgdnFyc2hscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWUVJTSEwuUzggcTAscTAscTAKK2ludDE2eDhfdCB2cXJzaGxxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUVJTSEwuUzE2IHEwLHEwLHEwCitpbnQzMng0X3QgdnFyc2hscV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlFSU0hMLlMzMiBxMCxxMCxxMAoraW50NjR4Ml90IHZxcnNobHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZRUlNITC5TNjQgcTAscTAscTAKK3VpbnQ4eDE2X3QgdnFyc2hscV91OCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlFSU0hMLlU4IHEwLHEwLHEwCit1aW50MTZ4OF90IHZxcnNobHFfdTE2KHVpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUVJTSEwuVTE2IHEwLHEwLHEwCit1aW50MzJ4NF90IHZxcnNobHFfdTMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUVJTSEwuVTMyIHEwLHEwLHEwCit1aW50NjR4Ml90IHZxcnNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWUVJTSEwuVTY0IHEwLHEwLHEwCisvL1NoaWZ0cyBieSBhIGNvbnN0YW50CisvL1ZlY3RvciBzaGlmdCByaWdodCBieSBjb25zdGFudAoraW50OHg4X3QgdnNocl9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlNIUi5TOCBkMCxkMCwjOAoraW50MTZ4NF90IHZzaHJfbl9zMTYoaW50MTZ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZTSFIuUzE2IGQwLGQwLCMxNgoraW50MzJ4Ml90IHZzaHJfbl9zMzIoaW50MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZTSFIuUzMyIGQwLGQwLCMzMgoraW50NjR4MV90IHZzaHJfbl9zNjQoaW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYik7IC8vIFZTSFIuUzY0IGQwLGQwLCM2NAordWludDh4OF90IHZzaHJfbl91OCh1aW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWU0hSLlU4IGQwLGQwLCM4Cit1aW50MTZ4NF90IHZzaHJfbl91MTYodWludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWU0hSLlUxNiBkMCxkMCwjMTYKK3VpbnQzMngyX3QgdnNocl9uX3UzMih1aW50MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZTSFIuVTMyIGQwLGQwLCMzMgordWludDY0eDFfdCB2c2hyX25fdTY0KHVpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKTsgLy8gVlNIUi5VNjQgZDAsZDAsIzY0CitpbnQ4eDE2X3QgdnNocnFfbl9zOChpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWU0hSLlM4IHEwLHEwLCM4CitpbnQxNng4X3QgdnNocnFfbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZTSFIuUzE2IHEwLHEwLCMxNgoraW50MzJ4NF90IHZzaHJxX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWU0hSLlMzMiBxMCxxMCwjMzIKK2ludDY0eDJfdCB2c2hycV9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKTsgLy8gVlNIUi5TNjQgcTAscTAsIzY0Cit1aW50OHgxNl90IHZzaHJxX25fdTgodWludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZTSFIuVTggcTAscTAsIzgKK3VpbnQxNng4X3QgdnNocnFfbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWU0hSLlUxNiBxMCxxMCwjMTYKK3VpbnQzMng0X3QgdnNocnFfbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWU0hSLlUzMiBxMCxxMCwjMzIKK3VpbnQ2NHgyX3QgdnNocnFfbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpOyAvLyBWU0hSLlU2NCBxMCxxMCwjNjQKKy8vVmVjdG9yIHNoaWZ0IGxlZnQgYnkgY29uc3RhbnQKK2ludDh4OF90IHZzaGxfbl9zOChpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZTSEwuSTggZDAsZDAsIzAKK2ludDE2eDRfdCB2c2hsX25fczE2KGludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpOyAvLyBWU0hMLkkxNiBkMCxkMCwjMAoraW50MzJ4Ml90IHZzaGxfbl9zMzIoaW50MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYik7IC8vIFZTSEwuSTMyIGQwLGQwLCMwCitpbnQ2NHgxX3QgdnNobF9uX3M2NChpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlNITC5JNjQgZDAsZDAsIzAKK3VpbnQ4eDhfdCB2c2hsX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKTsgLy8gVlNITC5JOCBkMCxkMCwjMAordWludDE2eDRfdCB2c2hsX25fdTE2KHVpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlNITC5JMTYgZDAsZDAsIzAKK3VpbnQzMngyX3QgdnNobF9uX3UzMih1aW50MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYik7IC8vIFZTSEwuSTMyIGQwLGQwLCMwCit1aW50NjR4MV90IHZzaGxfbl91NjQodWludDY0eDFfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpOyAvLyBWU0hMLkk2NCBkMCxkMCwjMAoraW50OHgxNl90IHZzaGxxX25fczgoaW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKTsgLy8gVlNITC5JOCBxMCxxMCwjMAoraW50MTZ4OF90IHZzaGxxX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpOyAvLyBWU0hMLkkxNiBxMCxxMCwjMAoraW50MzJ4NF90IHZzaGxxX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWU0hMLkkzMiBxMCxxMCwjMAoraW50NjR4Ml90IHZzaGxxX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpOyAvLyBWU0hMLkk2NCBxMCxxMCwjMAordWludDh4MTZfdCB2c2hscV9uX3U4KHVpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpOyAvLyBWU0hMLkk4IHEwLHEwLCMwCit1aW50MTZ4OF90IHZzaGxxX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlNITC5JMTYgcTAscTAsIzAKK3VpbnQzMng0X3QgdnNobHFfbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWU0hMLkkzMiBxMCxxMCwjMAordWludDY0eDJfdCB2c2hscV9uX3U2NCh1aW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYik7IC8vIFZTSEwuSTY0IHEwLHEwLCMwCisvL1ZlY3RvciByb3VuZGluZyBzaGlmdCByaWdodCBieSBjb25zdGFudAoraW50OHg4X3QgdnJzaHJfbl9zOChpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZSU0hSLlM4IGQwLGQwLCM4CitpbnQxNng0X3QgdnJzaHJfbl9zMTYoaW50MTZ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZSU0hSLlMxNiBkMCxkMCwjMTYKK2ludDMyeDJfdCB2cnNocl9uX3MzMihpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlJTSFIuUzMyIGQwLGQwLCMzMgoraW50NjR4MV90IHZyc2hyX25fczY0KGludDY0eDFfdCBhLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpOyAvLyBWUlNIUi5TNjQgZDAsZDAsIzY0Cit1aW50OHg4X3QgdnJzaHJfbl91OCh1aW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUlNIUi5VOCBkMCxkMCwjOAordWludDE2eDRfdCB2cnNocl9uX3UxNih1aW50MTZ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZSU0hSLlUxNiBkMCxkMCwjMTYKK3VpbnQzMngyX3QgdnJzaHJfbl91MzIodWludDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUlNIUi5VMzIgZDAsZDAsIzMyCit1aW50NjR4MV90IHZyc2hyX25fdTY0KHVpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKTsgLy8gVlJTSFIuVTY0IGQwLGQwLCM2NAoraW50OHgxNl90IHZyc2hycV9uX3M4KGludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZSU0hSLlM4IHEwLHEwLCM4CitpbnQxNng4X3QgdnJzaHJxX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUlNIUi5TMTYgcTAscTAsIzE2CitpbnQzMng0X3QgdnJzaHJxX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUlNIUi5TMzIgcTAscTAsIzMyCitpbnQ2NHgyX3QgdnJzaHJxX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpOyAvLyBWUlNIUi5TNjQgcTAscTAsIzY0Cit1aW50OHgxNl90IHZyc2hycV9uX3U4KHVpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUlNIUi5VOCBxMCxxMCwjOAordWludDE2eDhfdCB2cnNocnFfbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUlNIUi5VMTYgcTAscTAsIzE2Cit1aW50MzJ4NF90IHZyc2hycV9uX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZSU0hSLlUzMiBxMCxxMCwjMzIKK3VpbnQ2NHgyX3QgdnJzaHJxX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKTsgLy8gVlJTSFIuVTY0IHEwLHEwLCM2NAorLy9WZWN0b3Igc2hpZnQgcmlnaHQgYnkgY29uc3RhbnQgYW5kIGFjY3VtdWxhdGUKK2ludDh4OF90IHZzcmFfbl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkEuUzggZDAsZDAsIzgKK2ludDE2eDRfdCB2c3JhX25fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSQS5TMTYgZDAsZDAsIzE2CitpbnQzMngyX3QgdnNyYV9uX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZTUkEuUzMyIGQwLGQwLCMzMgoraW50NjR4MV90IHZzcmFfbl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWU1JBLlM2NCBkMCxkMCwjNjQKK3VpbnQ4eDhfdCB2c3JhX25fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkEuVTggZDAsZDAsIzgKK3VpbnQxNng0X3QgdnNyYV9uX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSQS5VMTYgZDAsZDAsIzE2Cit1aW50MzJ4Ml90IHZzcmFfbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZTUkEuVTMyIGQwLGQwLCMzMgordWludDY0eDFfdCB2c3JhX25fdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWU1JBLlU2NCBkMCxkMCwjNjQKK2ludDh4MTZfdCB2c3JhcV9uX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWU1JBLlM4IHEwLHEwLCM4CitpbnQxNng4X3QgdnNyYXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWU1JBLlMxNiBxMCxxMCwjMTYKK2ludDMyeDRfdCB2c3JhcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZTUkEuUzMyIHEwLHEwLCMzMgoraW50NjR4Ml90IHZzcmFxX25fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlNSQS5TNjQgcTAscTAsIzY0Cit1aW50OHgxNl90IHZzcmFxX25fdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlNSQS5VOCBxMCxxMCwjOAordWludDE2eDhfdCB2c3JhcV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSQS5VMTYgcTAscTAsIzE2Cit1aW50MzJ4NF90IHZzcmFxX25fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpOyAvLyBWU1JBLlUzMiBxMCxxMCwjMzIKK3VpbnQ2NHgyX3QgdnNyYXFfbl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZTUkEuVTY0IHEwLHEwLCM2NAorLy9WZWN0b3Igcm91bmRpbmcgc2hpZnQgcmlnaHQgYnkgY29uc3RhbnQgYW5kIGFjY3VtdWxhdGUKK2ludDh4OF90IHZyc3JhX25fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWUlNSQS5TOCBkMCxkMCwjOAoraW50MTZ4NF90IHZyc3JhX25fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlJTUkEuUzE2IGQwLGQwLCMxNgoraW50MzJ4Ml90IHZyc3JhX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlJTUkEuUzMyIGQwLGQwLCMzMgoraW50NjR4MV90IHZyc3JhX25fczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlJTUkEuUzY0IGQwLGQwLCM2NAordWludDh4OF90IHZyc3JhX25fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZSU1JBLlU4IGQwLGQwLCM4Cit1aW50MTZ4NF90IHZyc3JhX25fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWUlNSQS5VMTYgZDAsZDAsIzE2Cit1aW50MzJ4Ml90IHZyc3JhX25fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpOyAvLyBWUlNSQS5VMzIgZDAsZDAsIzMyCit1aW50NjR4MV90IHZyc3JhX25fdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWUlNSQS5VNjQgZDAsZDAsIzY0CitpbnQ4eDE2X3QgdnJzcmFxX25fczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZSU1JBLlM4IHEwLHEwLCM4CitpbnQxNng4X3QgdnJzcmFxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlJTUkEuUzE2IHEwLHEwLCMxNgoraW50MzJ4NF90IHZyc3JhcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZSU1JBLlMzMiBxMCxxMCwjMzIKK2ludDY0eDJfdCB2cnNyYXFfbl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWUlNSQS5TNjQgcTAscTAsIzY0Cit1aW50OHgxNl90IHZyc3JhcV9uX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZSU1JBLlU4IHEwLHEwLCM4Cit1aW50MTZ4OF90IHZyc3JhcV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlJTUkEuVTE2IHEwLHEwLCMxNgordWludDMyeDRfdCB2cnNyYXFfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZSU1JBLlUzMiBxMCxxMCwjMzIKK3VpbnQ2NHgyX3QgdnJzcmFxX25fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWUlNSQS5VNjQgcTAscTAsIzY0CisvL1ZlY3RvciBzYXR1cmF0aW5nIHNoaWZ0IGxlZnQgYnkgY29uc3RhbnQKK2ludDh4OF90IHZxc2hsX25fczgoaW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpOyAvLyBWUVNITC5TOCBkMCxkMCwjMAoraW50MTZ4NF90IHZxc2hsX25fczE2KGludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpOyAvLyBWUVNITC5TMTYgZDAsZDAsIzAKK2ludDMyeDJfdCB2cXNobF9uX3MzMihpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKTsgLy8gVlFTSEwuUzMyIGQwLGQwLCMwCitpbnQ2NHgxX3QgdnFzaGxfbl9zNjQoaW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYik7IC8vIFZRU0hMLlM2NCBkMCxkMCwjMAordWludDh4OF90IHZxc2hsX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKTsgLy8gVlFTSEwuVTggZDAsZDAsIzAKK3VpbnQxNng0X3QgdnFzaGxfbl91MTYodWludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpOyAvLyBWUVNITC5VMTYgZDAsZDAsIzAKK3VpbnQzMngyX3QgdnFzaGxfbl91MzIodWludDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWUVNITC5VMzIgZDAsZDAsIzAKK3VpbnQ2NHgxX3QgdnFzaGxfbl91NjQodWludDY0eDFfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpOyAvLyBWUVNITC5VNjQgZDAsZDAsIzAKK2ludDh4MTZfdCB2cXNobHFfbl9zOChpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpOyAvLyBWUVNITC5TOCBxMCxxMCwjMAoraW50MTZ4OF90IHZxc2hscV9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlFTSEwuUzE2IHEwLHEwLCMwCitpbnQzMng0X3QgdnFzaGxxX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWUVNITC5TMzIgcTAscTAsIzAKK2ludDY0eDJfdCB2cXNobHFfbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYik7IC8vIFZRU0hMLlM2NCBxMCxxMCwjMAordWludDh4MTZfdCB2cXNobHFfbl91OCh1aW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKTsgLy8gVlFTSEwuVTggcTAscTAsIzAKK3VpbnQxNng4X3QgdnFzaGxxX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlFTSEwuVTE2IHEwLHEwLCMwCit1aW50MzJ4NF90IHZxc2hscV9uX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYik7IC8vIFZRU0hMLlUzMiBxMCxxMCwjMAordWludDY0eDJfdCB2cXNobHFfbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpOyAvLyBWUVNITC5VNjQgcTAscTAsIzAKKy8vVmVjdG9yIHNpZ25lZC0+dW5zaWduZWQgc2F0dXJhdGluZyBzaGlmdCBsZWZ0IGJ5IGNvbnN0YW50Cit1aW50OHg4X3QgdnFzaGx1X25fczgoaW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpOyAvLyBWUVNITFUuUzggZDAsZDAsIzAKK3VpbnQxNng0X3QgdnFzaGx1X25fczE2KGludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpOyAvLyBWUVNITFUuUzE2IGQwLGQwLCMwCit1aW50MzJ4Ml90IHZxc2hsdV9uX3MzMihpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKTsgLy8gVlFTSExVLlMzMiBkMCxkMCwjMAordWludDY0eDFfdCB2cXNobHVfbl9zNjQoaW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYik7IC8vIFZRU0hMVS5TNjQgZDAsZDAsIzAKK3VpbnQ4eDE2X3QgdnFzaGx1cV9uX3M4KGludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZRU0hMVS5TOCBxMCxxMCwjMAordWludDE2eDhfdCB2cXNobHVxX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpOyAvLyBWUVNITFUuUzE2IHEwLHEwLCMwCit1aW50MzJ4NF90IHZxc2hsdXFfbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYik7IC8vIFZRU0hMVS5TMzIgcTAscTAsIzAKK3VpbnQ2NHgyX3QgdnFzaGx1cV9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlFTSExVLlM2NCBxMCxxMCwjMAorLy9WZWN0b3IgbmFycm93aW5nIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50CitpbnQ4eDhfdCB2c2hybl9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWU0hSTi5JMTYgZDAscTAsIzgKK2ludDE2eDRfdCB2c2hybl9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlNIUk4uSTMyIGQwLHEwLCMxNgoraW50MzJ4Ml90IHZzaHJuX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWU0hSTi5JNjQgZDAscTAsIzMyCit1aW50OHg4X3QgdnNocm5fbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZTSFJOLkkxNiBkMCxxMCwjOAordWludDE2eDRfdCB2c2hybl9uX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZTSFJOLkkzMiBkMCxxMCwjMTYKK3VpbnQzMngyX3QgdnNocm5fbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWU0hSTi5JNjQgZDAscTAsIzMyCisvL1ZlY3RvciBzaWduZWQtPnVuc2lnbmVkIG5hcnJvd2luZyBzYXR1cmF0aW5nIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50Cit1aW50OHg4X3QgdnFzaHJ1bl9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUVNIUlVOLlMxNiBkMCxxMCwjOAordWludDE2eDRfdCB2cXNocnVuX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUVNIUlVOLlMzMiBkMCxxMCwjMTYKK3VpbnQzMngyX3QgdnFzaHJ1bl9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlFTSFJVTi5TNjQgZDAscTAsIzMyCisvL1ZlY3RvciBzaWduZWQtPnVuc2lnbmVkIHJvdW5kaW5nIG5hcnJvd2luZyBzYXR1cmF0aW5nIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50Cit1aW50OHg4X3QgdnFyc2hydW5fbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlFSU0hSVU4uUzE2IGQwLHEwLCM4Cit1aW50MTZ4NF90IHZxcnNocnVuX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUVJTSFJVTi5TMzIgZDAscTAsIzE2Cit1aW50MzJ4Ml90IHZxcnNocnVuX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUVJTSFJVTi5TNjQgZDAscTAsIzMyCisvL1ZlY3RvciBuYXJyb3dpbmcgc2F0dXJhdGluZyBzaGlmdCByaWdodCBieSBjb25zdGFudAoraW50OHg4X3QgdnFzaHJuX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZRU0hSTi5TMTYgZDAscTAsIzgKK2ludDE2eDRfdCB2cXNocm5fbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZRU0hSTi5TMzIgZDAscTAsIzE2CitpbnQzMngyX3QgdnFzaHJuX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUVNIUk4uUzY0IGQwLHEwLCMzMgordWludDh4OF90IHZxc2hybl9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlFTSFJOLlUxNiBkMCxxMCwjOAordWludDE2eDRfdCB2cXNocm5fbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUVNIUk4uVTMyIGQwLHEwLCMxNgordWludDMyeDJfdCB2cXNocm5fbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUVNIUk4uVTY0IGQwLHEwLCMzMgorLy9WZWN0b3Igcm91bmRpbmcgbmFycm93aW5nIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50CitpbnQ4eDhfdCB2cnNocm5fbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlJTSFJOLkkxNiBkMCxxMCwjOAoraW50MTZ4NF90IHZyc2hybl9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlJTSFJOLkkzMiBkMCxxMCwjMTYKK2ludDMyeDJfdCB2cnNocm5fbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZSU0hSTi5JNjQgZDAscTAsIzMyCit1aW50OHg4X3QgdnJzaHJuX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUlNIUk4uSTE2IGQwLHEwLCM4Cit1aW50MTZ4NF90IHZyc2hybl9uX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZSU0hSTi5JMzIgZDAscTAsIzE2Cit1aW50MzJ4Ml90IHZyc2hybl9uX3U2NCh1aW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZSU0hSTi5JNjQgZDAscTAsIzMyCisvL1ZlY3RvciByb3VuZGluZyBuYXJyb3dpbmcgc2F0dXJhdGluZyBzaGlmdCByaWdodCBieSBjb25zdGFudAoraW50OHg4X3QgdnFyc2hybl9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUVJTSFJOLlMxNiBkMCxxMCwjOAoraW50MTZ4NF90IHZxcnNocm5fbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZRUlNIUk4uUzMyIGQwLHEwLCMxNgoraW50MzJ4Ml90IHZxcnNocm5fbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZRUlNIUk4uUzY0IGQwLHEwLCMzMgordWludDh4OF90IHZxcnNocm5fbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZRUlNIUk4uVTE2IGQwLHEwLCM4Cit1aW50MTZ4NF90IHZxcnNocm5fbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUVJTSFJOLlUzMiBkMCxxMCwjMTYKK3VpbnQzMngyX3QgdnFyc2hybl9uX3U2NCh1aW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZRUlNIUk4uVTY0IGQwLHEwLCMzMgorLy9WZWN0b3Igd2lkZW5pbmcgc2hpZnQgbGVmdCBieSBjb25zdGFudAoraW50MTZ4OF90IHZzaGxsX25fczgoaW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDAsOCkgaW50IGIpOyAvLyBWU0hMTC5TOCBxMCxkMCwjMAoraW50MzJ4NF90IHZzaGxsX25fczE2KGludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNikgaW50IGIpOyAvLyBWU0hMTC5TMTYgcTAsZDAsIzAKK2ludDY0eDJfdCB2c2hsbF9uX3MzMihpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDAsMzIpIGludCBiKTsgLy8gVlNITEwuUzMyIHEwLGQwLCMwCit1aW50MTZ4OF90IHZzaGxsX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDgpIGludCBiKTsgLy8gVlNITEwuVTggcTAsZDAsIzAKK3VpbnQzMng0X3QgdnNobGxfbl91MTYodWludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNikgaW50IGIpOyAvLyBWU0hMTC5VMTYgcTAsZDAsIzAKK3VpbnQ2NHgyX3QgdnNobGxfbl91MzIodWludDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMikgaW50IGIpOyAvLyBWU0hMTC5VMzIgcTAsZDAsIzAKKy8vU2hpZnRzIHdpdGggaW5zZXJ0CisvL1ZlY3RvciBzaGlmdCByaWdodCBhbmQgaW5zZXJ0CitpbnQ4eDhfdCB2c3JpX25fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWU1JJLjggZDAsZDAsIzgKK2ludDE2eDRfdCB2c3JpX25fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSSS4xNiBkMCxkMCwjMTYKK2ludDMyeDJfdCB2c3JpX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlNSSS4zMiBkMCxkMCwjMzIKK2ludDY0eDFfdCB2c3JpX25fczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlNSSS42NCBkMCxkMCwjNjQKK3VpbnQ4eDhfdCB2c3JpX25fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkkuOCBkMCxkMCwjOAordWludDE2eDRfdCB2c3JpX25fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWU1JJLjE2IGQwLGQwLCMxNgordWludDMyeDJfdCB2c3JpX25fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpOyAvLyBWU1JJLjMyIGQwLGQwLCMzMgordWludDY0eDFfdCB2c3JpX25fdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWU1JJLjY0IGQwLGQwLCM2NAorcG9seTh4OF90IHZzcmlfbl9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlNSSS44IGQwLGQwLCM4Citwb2x5MTZ4NF90IHZzcmlfbl9wMTYocG9seTE2eDRfdCBhLCBwb2x5MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZTUkkuMTYgZDAsZDAsIzE2CitpbnQ4eDE2X3QgdnNyaXFfbl9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlNSSS44IHEwLHEwLCM4CitpbnQxNng4X3QgdnNyaXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWU1JJLjE2IHEwLHEwLCMxNgoraW50MzJ4NF90IHZzcmlxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlNSSS4zMiBxMCxxMCwjMzIKK2ludDY0eDJfdCB2c3JpcV9uX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZTUkkuNjQgcTAscTAsIzY0Cit1aW50OHgxNl90IHZzcmlxX25fdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlNSSS44IHEwLHEwLCM4Cit1aW50MTZ4OF90IHZzcmlxX25fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWU1JJLjE2IHEwLHEwLCMxNgordWludDMyeDRfdCB2c3JpcV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlNSSS4zMiBxMCxxMCwjMzIKK3VpbnQ2NHgyX3QgdnNyaXFfbl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZTUkkuNjQgcTAscTAsIzY0Citwb2x5OHgxNl90IHZzcmlxX25fcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlNSSS44IHEwLHEwLCM4Citwb2x5MTZ4OF90IHZzcmlxX25fcDE2KHBvbHkxNng4X3QgYSwgcG9seTE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWU1JJLjE2IHEwLHEwLCMxNgorLy9WZWN0b3Igc2hpZnQgbGVmdCBhbmQgaW5zZXJ0CitpbnQ4eDhfdCB2c2xpX25fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWU0xJLjggZDAsZDAsIzAKK2ludDE2eDRfdCB2c2xpX25fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMTUpIGludCBjKTsgLy8gVlNMSS4xNiBkMCxkMCwjMAoraW50MzJ4Ml90IHZzbGlfbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGMpOyAvLyBWU0xJLjMyIGQwLGQwLCMwCitpbnQ2NHgxX3QgdnNsaV9uX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYyk7IC8vIFZTTEkuNjQgZDAsZDAsIzAKK3VpbnQ4eDhfdCB2c2xpX25fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZTTEkuOCBkMCxkMCwjMAordWludDE2eDRfdCB2c2xpX25fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGMpOyAvLyBWU0xJLjE2IGQwLGQwLCMwCit1aW50MzJ4Ml90IHZzbGlfbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYyk7IC8vIFZTTEkuMzIgZDAsZDAsIzAKK3VpbnQ2NHgxX3QgdnNsaV9uX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDAsNjMpIGludCBjKTsgLy8gVlNMSS42NCBkMCxkMCwjMAorcG9seTh4OF90IHZzbGlfbl9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIsIF9fY29uc3RyYW5nZSgwLDcpIGludCBjKTsgLy8gVlNMSS44IGQwLGQwLCMwCitwb2x5MTZ4NF90IHZzbGlfbl9wMTYocG9seTE2eDRfdCBhLCBwb2x5MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYyk7IC8vIFZTTEkuMTYgZDAsZDAsIzAKK2ludDh4MTZfdCB2c2xpcV9uX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWU0xJLjggcTAscTAsIzAKK2ludDE2eDhfdCB2c2xpcV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYyk7IC8vIFZTTEkuMTYgcTAscTAsIzAKK2ludDMyeDRfdCB2c2xpcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYyk7IC8vIFZTTEkuMzIgcTAscTAsIzAKK2ludDY0eDJfdCB2c2xpcV9uX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYyk7IC8vIFZTTEkuNjQgcTAscTAsIzAKK3VpbnQ4eDE2X3QgdnNsaXFfbl91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWU0xJLjggcTAscTAsIzAKK3VpbnQxNng4X3QgdnNsaXFfbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYyk7IC8vIFZTTEkuMTYgcTAscTAsIzAKK3VpbnQzMng0X3QgdnNsaXFfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYyk7IC8vIFZTTEkuMzIgcTAscTAsIzAKK3VpbnQ2NHgyX3QgdnNsaXFfbl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYyk7IC8vIFZTTEkuNjQgcTAscTAsIzAKK3BvbHk4eDE2X3QgdnNsaXFfbl9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWU0xJLjggcTAscTAsIzAKK3BvbHkxNng4X3QgdnNsaXFfbl9wMTYocG9seTE2eDhfdCBhLCBwb2x5MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYyk7IC8vIFZTTEkuMTYgcTAscTAsIzAKKy8vTG9hZHMgb2YgYSBzaW5nbGUgdmVjdG9yIG9yIGxhbmUuIFBlcmZvcm0gbG9hZHMgYW5kIHN0b3JlcyBvZiBhIHNpbmdsZSB2ZWN0b3Igb2Ygc29tZSB0eXBlLgorLy9Mb2FkIGEgc2luZ2xlIHZlY3RvciBmcm9tIG1lbW9yeQordWludDh4MTZfdCB2bGQxcV91OChfX3RyYW5zZmVyc2l6ZSgxNikgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDAsIGQxfSwgW3IwXQordWludDE2eDhfdCB2bGQxcV91MTYoX190cmFuc2ZlcnNpemUoOCkgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMCwgZDF9LCBbcjBdCit1aW50MzJ4NF90IHZsZDFxX3UzMihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwLCBkMX0sIFtyMF0KK3VpbnQ2NHgyX3QgdmxkMXFfdTY0KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxfSwgW3IwXQoraW50OHgxNl90IHZsZDFxX3M4KF9fdHJhbnNmZXJzaXplKDE2KSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwLCBkMX0sIFtyMF0KK2ludDE2eDhfdCB2bGQxcV9zMTYoX190cmFuc2ZlcnNpemUoOCkgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwLCBkMX0sIFtyMF0KK2ludDMyeDRfdCB2bGQxcV9zMzIoX190cmFuc2ZlcnNpemUoNCkgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwLCBkMX0sIFtyMF0KK2ludDY0eDJfdCB2bGQxcV9zNjQoX190cmFuc2ZlcnNpemUoMikgaW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMX0sIFtyMF0KK2Zsb2F0MTZ4OF90IHZsZDFxX2YxNihfX3RyYW5zZmVyc2l6ZSg4KSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMCwgZDF9LCBbcjBdCitmbG9hdDMyeDRfdCB2bGQxcV9mMzIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDAsIGQxfSwgW3IwXQorcG9seTh4MTZfdCB2bGQxcV9wOChfX3RyYW5zZmVyc2l6ZSgxNikgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDAsIGQxfSwgW3IwXQorcG9seTE2eDhfdCB2bGQxcV9wMTYoX190cmFuc2ZlcnNpemUoOCkgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMCwgZDF9LCBbcjBdCit1aW50OHg4X3QgdmxkMV91OChfX3RyYW5zZmVyc2l6ZSg4KSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS44IHtkMH0sIFtyMF0KK3VpbnQxNng0X3QgdmxkMV91MTYoX190cmFuc2ZlcnNpemUoNCkgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMH0sIFtyMF0KK3VpbnQzMngyX3QgdmxkMV91MzIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMH0sIFtyMF0KK3VpbnQ2NHgxX3QgdmxkMV91NjQoX190cmFuc2ZlcnNpemUoMSkgdWludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KK2ludDh4OF90IHZsZDFfczgoX190cmFuc2ZlcnNpemUoOCkgaW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS44IHtkMH0sIFtyMF0KK2ludDE2eDRfdCB2bGQxX3MxNihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDB9LCBbcjBdCitpbnQzMngyX3QgdmxkMV9zMzIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwfSwgW3IwXQoraW50NjR4MV90IHZsZDFfczY0KF9fdHJhbnNmZXJzaXplKDEpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KK2Zsb2F0MTZ4NF90IHZsZDFfZjE2KF9fdHJhbnNmZXJzaXplKDQpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwfSwgW3IwXQorZmxvYXQzMngyX3QgdmxkMV9mMzIoX190cmFuc2ZlcnNpemUoMikgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDB9LCBbcjBdCitwb2x5OHg4X3QgdmxkMV9wOChfX3RyYW5zZmVyc2l6ZSg4KSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS44IHtkMH0sIFtyMF0KK3BvbHkxNng0X3QgdmxkMV9wMTYoX190cmFuc2ZlcnNpemUoNCkgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMH0sIFtyMF0KKy8vTG9hZCBhIHNpbmdsZSBsYW5lIGZyb20gbWVtb3J5Cit1aW50OHgxNl90IHZsZDFxX2xhbmVfdTgoX190cmFuc2ZlcnNpemUoMSkgdWludDhfdCBjb25zdCAqIHB0ciwgdWludDh4MTZfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgbGFuZSk7IC8vVkxEMS44IHtkMFswXX0sIFtyMF0KK3VpbnQxNng4X3QgdmxkMXFfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoMSkgdWludDE2X3QgY29uc3QgKiBwdHIsIHVpbnQxNng4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDEuMTYge2QwWzBdfSwgW3IwXQordWludDMyeDRfdCB2bGQxcV9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMS4zMiB7ZDBbMF19LCBbcjBdCit1aW50NjR4Ml90IHZsZDFxX2xhbmVfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90IGNvbnN0ICogcHRyLCB1aW50NjR4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KK2ludDh4MTZfdCB2bGQxcV9sYW5lX3M4KF9fdHJhbnNmZXJzaXplKDEpIGludDhfdCBjb25zdCAqIHB0ciwgaW50OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy9WTEQxLjgge2QwWzBdfSwgW3IwXQoraW50MTZ4OF90IHZsZDFxX2xhbmVfczE2KF9fdHJhbnNmZXJzaXplKDEpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy9WTEQxLjE2IHtkMFswXX0sIFtyMF0KK2ludDMyeDRfdCB2bGQxcV9sYW5lX3MzMihfX3RyYW5zZmVyc2l6ZSgxKSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vVkxEMS4zMiB7ZDBbMF19LCBbcjBdCitmbG9hdDE2eDhfdCB2bGQxcV9sYW5lX2YxNihfX3RyYW5zZmVyc2l6ZSgxKSBfX2ZwMTYgY29uc3QgKiBwdHIsIGZsb2F0MTZ4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvL1ZMRDEuMTYge2QwWzBdfSwgW3IwXQorZmxvYXQzMng0X3QgdmxkMXFfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMSkgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMS4zMiB7ZDBbMF19LCBbcjBdCitpbnQ2NHgyX3QgdmxkMXFfbGFuZV9zNjQoX190cmFuc2ZlcnNpemUoMSkgaW50NjRfdCBjb25zdCAqIHB0ciwgaW50NjR4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvL1ZMRDEuNjQge2QwfSwgW3IwXQorcG9seTh4MTZfdCB2bGQxcV9sYW5lX3A4KF9fdHJhbnNmZXJzaXplKDEpIHBvbHk4X3QgY29uc3QgKiBwdHIsIHBvbHk4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvL1ZMRDEuOCB7ZDBbMF19LCBbcjBdCitwb2x5MTZ4OF90IHZsZDFxX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDEpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQxLjE2IHtkMFswXX0sIFtyMF0KK3VpbnQ4eDhfdCB2bGQxX2xhbmVfdTgoX190cmFuc2ZlcnNpemUoMSkgdWludDhfdCBjb25zdCAqIHB0ciwgdWludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvL1ZMRDEuOCB7ZDBbMF19LCBbcjBdCit1aW50MTZ4NF90IHZsZDFfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoMSkgdWludDE2X3QgY29uc3QgKiBwdHIsIHVpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vVkxEMS4xNiB7ZDBbMF19LCBbcjBdCit1aW50MzJ4Ml90IHZsZDFfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoMSkgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vVkxEMS4zMiB7ZDBbMF19LCBbcjBdCit1aW50NjR4MV90IHZsZDFfbGFuZV91NjQoX190cmFuc2ZlcnNpemUoMSkgdWludDY0X3QgY29uc3QgKiBwdHIsIHVpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vVkxEMS42NCB7ZDB9LCBbcjBdCitpbnQ4eDhfdCB2bGQxX2xhbmVfczgoX190cmFuc2ZlcnNpemUoMSkgaW50OF90IGNvbnN0ICogcHRyLCBpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMS44e2QwWzBdfSwgW3IwXQoraW50MTZ4NF90IHZsZDFfbGFuZV9zMTYoX190cmFuc2ZlcnNpemUoMSkgaW50MTZfdCBjb25zdCAqIHB0ciwgaW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvL1ZMRDEuMTYge2QwWzBdfSwgW3IwXQoraW50MzJ4Ml90IHZsZDFfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoMSkgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvL1ZMRDEuMzIge2QwWzBdfSwgW3IwXQorZmxvYXQxNng0X3QgdmxkMXFfbGFuZV9mMTYoX190cmFuc2ZlcnNpemUoMSkgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy9WTEQxLjE2IHtkMFswXX0sIFtyMF0KK2Zsb2F0MzJ4Ml90IHZsZDFfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMSkgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkxEMS4zMiB7ZDBbMF19LCBbcjBdCitpbnQ2NHgxX3QgdmxkMV9sYW5lX3M2NChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ2NF90IGNvbnN0ICogcHRyLCBpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vVkxEMS42NCB7ZDB9LCBbcjBdCitwb2x5OHg4X3QgdmxkMV9sYW5lX3A4KF9fdHJhbnNmZXJzaXplKDEpIHBvbHk4X3QgY29uc3QgKiBwdHIsIHBvbHk4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy9WTEQxLjgge2QwWzBdfSwgW3IwXQorcG9seTE2eDRfdCB2bGQxX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDEpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvL1ZMRDEuMTYge2QwWzBdfSwgW3IwXQorLy9Mb2FkIGFsbCBsYW5lcyBvZiB2ZWN0b3Igd2l0aCBzYW1lIHZhbHVlIGZyb20gbWVtb3J5Cit1aW50OHgxNl90IHZsZDFxX2R1cF91OChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS44IHtkMFtdfSwgW3IwXQordWludDE2eDhfdCB2bGQxcV9kdXBfdTE2KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDBbXX0sIFtyMF0KK3VpbnQzMng0X3QgdmxkMXFfZHVwX3UzMihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwW119LCBbcjBdCit1aW50NjR4Ml90IHZsZDFxX2R1cF91NjQoX190cmFuc2ZlcnNpemUoMSkgdWludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KK2ludDh4MTZfdCB2bGQxcV9kdXBfczgoX190cmFuc2ZlcnNpemUoMSkgaW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS44IHtkMFtdfSwgW3IwXQoraW50MTZ4OF90IHZsZDFxX2R1cF9zMTYoX190cmFuc2ZlcnNpemUoMSkgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwW119LCBbcjBdCitpbnQzMng0X3QgdmxkMXFfZHVwX3MzMihfX3RyYW5zZmVyc2l6ZSgxKSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDBbXX0sIFtyMF0KK2ludDY0eDJfdCB2bGQxcV9kdXBfczY0KF9fdHJhbnNmZXJzaXplKDEpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KK2Zsb2F0MTZ4OF90IHZsZDFxX2R1cF9mMTYoX190cmFuc2ZlcnNpemUoMSkgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDBbXX0sIFtyMF0KK2Zsb2F0MzJ4NF90IHZsZDFxX2R1cF9mMzIoX190cmFuc2ZlcnNpemUoMSkgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDBbXX0sIFtyMF0KK3BvbHk4eDE2X3QgdmxkMXFfZHVwX3A4KF9fdHJhbnNmZXJzaXplKDEpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwW119LCBbcjBdCitwb2x5MTZ4OF90IHZsZDFxX2R1cF9wMTYoX190cmFuc2ZlcnNpemUoMSkgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMFtdfSwgW3IwXQordWludDh4OF90IHZsZDFfZHVwX3U4KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwW119LCBbcjBdCit1aW50MTZ4NF90IHZsZDFfZHVwX3UxNihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwW119LCBbcjBdCit1aW50MzJ4Ml90IHZsZDFfZHVwX3UzMihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwW119LCBbcjBdCit1aW50NjR4MV90IHZsZDFfZHVwX3U2NChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwfSwgW3IwXQoraW50OHg4X3QgdmxkMV9kdXBfczgoX190cmFuc2ZlcnNpemUoMSkgaW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS44IHtkMFtdfSwgW3IwXQoraW50MTZ4NF90IHZsZDFfZHVwX3MxNihfX3RyYW5zZmVyc2l6ZSgxKSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDBbXX0sIFtyMF0KK2ludDMyeDJfdCB2bGQxX2R1cF9zMzIoX190cmFuc2ZlcnNpemUoMSkgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwW119LCBbcjBdCitpbnQ2NHgxX3QgdmxkMV9kdXBfczY0KF9fdHJhbnNmZXJzaXplKDEpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KK2Zsb2F0MTZ4NF90IHZsZDFfZHVwX2YxNihfX3RyYW5zZmVyc2l6ZSgxKSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMFtdfSwgW3IwXQorZmxvYXQzMngyX3QgdmxkMV9kdXBfZjMyKF9fdHJhbnNmZXJzaXplKDEpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwW119LCBbcjBdCitwb2x5OHg4X3QgdmxkMV9kdXBfcDgoX190cmFuc2ZlcnNpemUoMSkgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDBbXX0sIFtyMF0KK3BvbHkxNng0X3QgdmxkMV9kdXBfcDE2KF9fdHJhbnNmZXJzaXplKDEpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDBbXX0sIFtyMF0KKy8vU3RvcmUgYSBzaW5nbGUgdmVjdG9yIG9yIGxhbmUuIFN0b3JlcyBhbGwgbGFuZXMgb3IgYSBzaW5nbGUgbGFuZSBvZiBhIHZlY3Rvci4KKy8vU3RvcmUgYSBzaW5nbGUgdmVjdG9yIGludG8gbWVtb3J5Cit2b2lkIHZzdDFxX3U4KF9fdHJhbnNmZXJzaXplKDE2KSB1aW50OF90ICogcHRyLCB1aW50OHgxNl90IHZhbCk7IC8vIFZTVDEuOCB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QxcV91MTYoX190cmFuc2ZlcnNpemUoOCkgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4X3QgdmFsKTsgLy8gVlNUMS4xNiB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QxcV91MzIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0X3QgdmFsKTsgLy8gVlNUMS4zMiB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QxcV91NjQoX190cmFuc2ZlcnNpemUoMikgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgyX3QgdmFsKTsgLy8gVlNUMS42NCB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QxcV9zOChfX3RyYW5zZmVyc2l6ZSgxNikgaW50OF90ICogcHRyLCBpbnQ4eDE2X3QgdmFsKTsgLy8gVlNUMS44IHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDFxX3MxNihfX3RyYW5zZmVyc2l6ZSg4KSBpbnQxNl90ICogcHRyLCBpbnQxNng4X3QgdmFsKTsgLy8gVlNUMS4xNiB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QxcV9zMzIoX190cmFuc2ZlcnNpemUoNCkgaW50MzJfdCAqIHB0ciwgaW50MzJ4NF90IHZhbCk7IC8vIFZTVDEuMzIge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0MXFfczY0KF9fdHJhbnNmZXJzaXplKDIpIGludDY0X3QgKiBwdHIsIGludDY0eDJfdCB2YWwpOyAvLyBWU1QxLjY0IHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDFxX2YxNihfX3RyYW5zZmVyc2l6ZSg4KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OF90IHZhbCk7IC8vIFZTVDEuMTYge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0MXFfZjMyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMng0X3QgdmFsKTsgLy8gVlNUMS4zMiB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QxcV9wOChfX3RyYW5zZmVyc2l6ZSgxNikgcG9seThfdCAqIHB0ciwgcG9seTh4MTZfdCB2YWwpOyAvLyBWU1QxLjgge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0MXFfcDE2KF9fdHJhbnNmZXJzaXplKDgpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OF90IHZhbCk7IC8vIFZTVDEuMTYge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0MV91OChfX3RyYW5zZmVyc2l6ZSg4KSB1aW50OF90ICogcHRyLCB1aW50OHg4X3QgdmFsKTsgLy8gVlNUMS44IHtkMH0sIFtyMF0KK3ZvaWQgdnN0MV91MTYoX190cmFuc2ZlcnNpemUoNCkgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0X3QgdmFsKTsgLy8gVlNUMS4xNiB7ZDB9LCBbcjBdCit2b2lkIHZzdDFfdTMyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4Ml90IHZhbCk7IC8vIFZTVDEuMzIge2QwfSwgW3IwXQordm9pZCB2c3QxX3U2NChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50NjRfdCAqIHB0ciwgdWludDY0eDFfdCB2YWwpOyAvLyBWU1QxLjY0IHtkMH0sIFtyMF0KK3ZvaWQgdnN0MV9zOChfX3RyYW5zZmVyc2l6ZSg4KSBpbnQ4X3QgKiBwdHIsIGludDh4OF90IHZhbCk7IC8vIFZTVDEuOCB7ZDB9LCBbcjBdCit2b2lkIHZzdDFfczE2KF9fdHJhbnNmZXJzaXplKDQpIGludDE2X3QgKiBwdHIsIGludDE2eDRfdCB2YWwpOyAvLyBWU1QxLjE2IHtkMH0sIFtyMF0KK3ZvaWQgdnN0MV9zMzIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCAqIHB0ciwgaW50MzJ4Ml90IHZhbCk7IC8vIFZTVDEuMzIge2QwfSwgW3IwXQordm9pZCB2c3QxX3M2NChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ2NF90ICogcHRyLCBpbnQ2NHgxX3QgdmFsKTsgLy8gVlNUMS42NCB7ZDB9LCBbcjBdCit2b2lkIHZzdDFfZjE2KF9fdHJhbnNmZXJzaXplKDQpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0X3QgdmFsKTsgLy8gVlNUMS4xNiB7ZDB9LCBbcjBdCit2b2lkIHZzdDFfZjMyKF9fdHJhbnNmZXJzaXplKDIpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMngyX3QgdmFsKTsgLy8gVlNUMS4zMiB7ZDB9LCBbcjBdCit2b2lkIHZzdDFfcDgoX190cmFuc2ZlcnNpemUoOCkgcG9seThfdCAqIHB0ciwgcG9seTh4OF90IHZhbCk7IC8vIFZTVDEuOCB7ZDB9LCBbcjBdCit2b2lkIHZzdDFfcDE2KF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4NF90IHZhbCk7IC8vIFZTVDEuMTYge2QwfSwgW3IwXQorLy9TdG9yZSBhIGxhbmUgb2YgYSB2ZWN0b3IgaW50byBtZW1vcnkKKy8vTG9hZHMgb2YgYW4gTi1lbGVtZW50IHN0cnVjdHVyZQorLy9Mb2FkIE4tZWxlbWVudCBzdHJ1Y3R1cmUgZnJvbSBtZW1vcnkKK3VpbnQ4eDE2eDJfdCB2bGQycV91OChfX3RyYW5zZmVyc2l6ZSgzMikgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuOCB7ZDAsIGQyfSwgW3IwXQordWludDE2eDh4Ml90IHZsZDJxX3UxNihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjE2IHtkMCwgZDJ9LCBbcjBdCit1aW50MzJ4NHgyX3QgdmxkMnFfdTMyKF9fdHJhbnNmZXJzaXplKDgpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDAsIGQyfSwgW3IwXQoraW50OHgxNngyX3QgdmxkMnFfczgoX190cmFuc2ZlcnNpemUoMzIpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuOCB7ZDAsIGQyfSwgW3IwXQoraW50MTZ4OHgyX3QgdmxkMnFfczE2KF9fdHJhbnNmZXJzaXplKDE2KSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDAsIGQyfSwgW3IwXQoraW50MzJ4NHgyX3QgdmxkMnFfczMyKF9fdHJhbnNmZXJzaXplKDgpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjMyIHtkMCwgZDJ9LCBbcjBdCitmbG9hdDE2eDh4Ml90IHZsZDJxX2YxNihfX3RyYW5zZmVyc2l6ZSgxNikgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDAsIGQyfSwgW3IwXQorZmxvYXQzMng0eDJfdCB2bGQycV9mMzIoX190cmFuc2ZlcnNpemUoOCkgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDAsIGQyfSwgW3IwXQorcG9seTh4MTZ4Ml90IHZsZDJxX3A4KF9fdHJhbnNmZXJzaXplKDMyKSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi44IHtkMCwgZDJ9LCBbcjBdCitwb2x5MTZ4OHgyX3QgdmxkMnFfcDE2KF9fdHJhbnNmZXJzaXplKDE2KSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwLCBkMn0sIFtyMF0KK3VpbnQ4eDh4Ml90IHZsZDJfdTgoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjgge2QwLCBkMX0sIFtyMF0KK3VpbnQxNng0eDJfdCB2bGQyX3UxNihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwLCBkMX0sIFtyMF0KK3VpbnQzMngyeDJfdCB2bGQyX3UzMihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMzIge2QwLCBkMX0sIFtyMF0KK3VpbnQ2NHgxeDJfdCB2bGQyX3U2NChfX3RyYW5zZmVyc2l6ZSgyKSB1aW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMX0sIFtyMF0KK2ludDh4OHgyX3QgdmxkMl9zOChfX3RyYW5zZmVyc2l6ZSgxNikgaW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi44IHtkMCwgZDF9LCBbcjBdCitpbnQxNng0eDJfdCB2bGQyX3MxNihfX3RyYW5zZmVyc2l6ZSg4KSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDAsIGQxfSwgW3IwXQoraW50MzJ4MngyX3QgdmxkMl9zMzIoX190cmFuc2ZlcnNpemUoNCkgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMzIge2QwLCBkMX0sIFtyMF0KK2ludDY0eDF4Ml90IHZsZDJfczY0KF9fdHJhbnNmZXJzaXplKDIpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDF9LCBbcjBdCisvL2Zsb2F0MTZ4NHgyX3QgdmxkMl9mMTYoX190cmFuc2ZlcnNpemUoOCkgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDAsIGQxfSwgW3IwXQorZmxvYXQzMngyeDJfdCB2bGQyX2YzMihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjMyIHtkMCwgZDF9LCBbcjBdCitwb2x5OHg4eDJfdCB2bGQyX3A4KF9fdHJhbnNmZXJzaXplKDE2KSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi44IHtkMCwgZDF9LCBbcjBdCitwb2x5MTZ4NHgyX3QgdmxkMl9wMTYoX190cmFuc2ZlcnNpemUoOCkgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjE2IHtkMCwgZDF9LCBbcjBdCit1aW50OHgxNngzX3QgdmxkM3FfdTgoX190cmFuc2ZlcnNpemUoNDgpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjgge2QwLCBkMiwgZDR9LCBbcjBdCit1aW50MTZ4OHgzX3QgdmxkM3FfdTE2KF9fdHJhbnNmZXJzaXplKDI0KSB1aW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwLCBkMiwgZDR9LCBbcjBdCit1aW50MzJ4NHgzX3QgdmxkM3FfdTMyKF9fdHJhbnNmZXJzaXplKDEyKSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMzIge2QwLCBkMiwgZDR9LCBbcjBdCitpbnQ4eDE2eDNfdCB2bGQzcV9zOChfX3RyYW5zZmVyc2l6ZSg0OCkgaW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy44IHtkMCwgZDIsIGQ0fSwgW3IwXQoraW50MTZ4OHgzX3QgdmxkM3FfczE2KF9fdHJhbnNmZXJzaXplKDI0KSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDAsIGQyLCBkNH0sIFtyMF0KK2ludDMyeDR4M190IHZsZDNxX3MzMihfX3RyYW5zZmVyc2l6ZSgxMikgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMzIge2QwLCBkMiwgZDR9LCBbcjBdCitmbG9hdDE2eDh4M190IHZsZDNxX2YxNihfX3RyYW5zZmVyc2l6ZSgyNCkgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDAsIGQyLCBkNH0sIFtyMF0KK2Zsb2F0MzJ4NHgzX3QgdmxkM3FfZjMyKF9fdHJhbnNmZXJzaXplKDEyKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMCwgZDIsIGQ0fSwgW3IwXQorcG9seTh4MTZ4M190IHZsZDNxX3A4KF9fdHJhbnNmZXJzaXplKDQ4KSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy44IHtkMCwgZDIsIGQ0fSwgW3IwXQorcG9seTE2eDh4M190IHZsZDNxX3AxNihfX3RyYW5zZmVyc2l6ZSgyNCkgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMCwgZDIsIGQ0fSwgW3IwXQordWludDh4OHgzX3QgdmxkM191OChfX3RyYW5zZmVyc2l6ZSgyNCkgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDAsIGQxLCBkMn0sIFtyMF0KK3VpbnQxNng0eDNfdCB2bGQzX3UxNihfX3RyYW5zZmVyc2l6ZSgxMikgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQordWludDMyeDJ4M190IHZsZDNfdTMyKF9fdHJhbnNmZXJzaXplKDYpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4zMiB7ZDAsIGQxLCBkMn0sIFtyMF0KK3VpbnQ2NHgxeDNfdCB2bGQzX3U2NChfX3RyYW5zZmVyc2l6ZSgzKSB1aW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMSwgZDJ9LCBbcjBdCitpbnQ4eDh4M190IHZsZDNfczgoX190cmFuc2ZlcnNpemUoMjQpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDAsIGQxLCBkMn0sIFtyMF0KK2ludDE2eDR4M190IHZsZDNfczE2KF9fdHJhbnNmZXJzaXplKDEyKSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDAsIGQxLCBkMn0sIFtyMF0KK2ludDMyeDJ4M190IHZsZDNfczMyKF9fdHJhbnNmZXJzaXplKDYpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMCwgZDEsIGQyfSwgW3IwXQoraW50NjR4MXgzX3QgdmxkM19zNjQoX190cmFuc2ZlcnNpemUoMykgaW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMSwgZDJ9LCBbcjBdCitmbG9hdDE2eDR4M190IHZsZDNfZjE2KF9fdHJhbnNmZXJzaXplKDEyKSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQorZmxvYXQzMngyeDNfdCB2bGQzX2YzMihfX3RyYW5zZmVyc2l6ZSg2KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMCwgZDEsIGQyfSwgW3IwXQorcG9seTh4OHgzX3QgdmxkM19wOChfX3RyYW5zZmVyc2l6ZSgyNCkgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDAsIGQxLCBkMn0sIFtyMF0KK3BvbHkxNng0eDNfdCB2bGQzX3AxNihfX3RyYW5zZmVyc2l6ZSgxMikgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQordWludDh4MTZ4NF90IHZsZDRxX3U4KF9fdHJhbnNmZXJzaXplKDY0KSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxENC44IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK3VpbnQxNng4eDRfdCB2bGQ0cV91MTYoX190cmFuc2ZlcnNpemUoMzIpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit1aW50MzJ4NHg0X3QgdmxkNHFfdTMyKF9fdHJhbnNmZXJzaXplKDE2KSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQoraW50OHgxNng0X3QgdmxkNHFfczgoX190cmFuc2ZlcnNpemUoNjQpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCitpbnQxNng4eDRfdCB2bGQ0cV9zMTYoX190cmFuc2ZlcnNpemUoMzIpIGludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjE2IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK2ludDMyeDR4NF90IHZsZDRxX3MzMihfX3RyYW5zZmVyc2l6ZSgxNikgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQorZmxvYXQxNng4eDRfdCB2bGQ0cV9mMTYoX190cmFuc2ZlcnNpemUoMzIpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQorZmxvYXQzMng0eDRfdCB2bGQ0cV9mMzIoX190cmFuc2ZlcnNpemUoMTYpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQorcG9seTh4MTZ4NF90IHZsZDRxX3A4KF9fdHJhbnNmZXJzaXplKDY0KSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxENC44IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK3BvbHkxNng4eDRfdCB2bGQ0cV9wMTYoX190cmFuc2ZlcnNpemUoMzIpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit1aW50OHg4eDRfdCB2bGQ0X3U4KF9fdHJhbnNmZXJzaXplKDMyKSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxENC44IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3VpbnQxNng0eDRfdCB2bGQ0X3UxNihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjE2IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3VpbnQzMngyeDRfdCB2bGQ0X3UzMihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQordWludDY0eDF4NF90IHZsZDRfdTY0KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCitpbnQ4eDh4NF90IHZsZDRfczgoX190cmFuc2ZlcnNpemUoMzIpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCitpbnQxNng0eDRfdCB2bGQ0X3MxNihfX3RyYW5zZmVyc2l6ZSgxNikgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQoraW50MzJ4Mng0X3QgdmxkNF9zMzIoX190cmFuc2ZlcnNpemUoOCkgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQoraW50NjR4MXg0X3QgdmxkNF9zNjQoX190cmFuc2ZlcnNpemUoNCkgaW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorZmxvYXQxNng0eDRfdCB2bGQ0X2YxNihfX3RyYW5zZmVyc2l6ZSgxNikgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCitmbG9hdDMyeDJ4NF90IHZsZDRfZjMyKF9fdHJhbnNmZXJzaXplKDgpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorcG9seTh4OHg0X3QgdmxkNF9wOChfX3RyYW5zZmVyc2l6ZSgzMikgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCitwb2x5MTZ4NHg0X3QgdmxkNF9wMTYoX190cmFuc2ZlcnNpemUoMTYpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCisvL0xvYWQgYWxsIGxhbmVzIG9mIE4tZWxlbWVudCBzdHJ1Y3R1cmUgd2l0aCBzYW1lIHZhbHVlIGZyb20gbWVtb3J5Cit1aW50OHg4eDJfdCB2bGQyX2R1cF91OChfX3RyYW5zZmVyc2l6ZSgyKSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi44IHtkMFtdLCBkMVtdfSwgW3IwXQordWludDE2eDR4Ml90IHZsZDJfZHVwX3UxNihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwW10sIGQxW119LCBbcjBdCit1aW50MzJ4MngyX3QgdmxkMl9kdXBfdTMyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDBbXSwgZDFbXX0sIFtyMF0KK3VpbnQ2NHgxeDJfdCB2bGQyX2R1cF91NjQoX190cmFuc2ZlcnNpemUoMikgdWludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDF9LCBbcjBdCitpbnQ4eDh4Ml90IHZsZDJfZHVwX3M4KF9fdHJhbnNmZXJzaXplKDIpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuOCB7ZDBbXSwgZDFbXX0sIFtyMF0KK2ludDE2eDR4Ml90IHZsZDJfZHVwX3MxNihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDBbXSwgZDFbXX0sIFtyMF0KK2ludDMyeDJ4Ml90IHZsZDJfZHVwX3MzMihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDBbXSwgZDFbXX0sIFtyMF0KK2ludDY0eDF4Ml90IHZsZDJfZHVwX3M2NChfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxfSwgW3IwXQorLy9mbG9hdDE2eDR4Ml90IHZsZDJfZHVwX2YxNihfX3RyYW5zZmVyc2l6ZSgyKSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjE2IHtkMFtdLCBkMVtdfSwgW3IwXQorZmxvYXQzMngyeDJfdCB2bGQyX2R1cF9mMzIoX190cmFuc2ZlcnNpemUoMikgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDBbXSwgZDFbXX0sIFtyMF0KK3BvbHk4eDh4Ml90IHZsZDJfZHVwX3A4KF9fdHJhbnNmZXJzaXplKDIpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjgge2QwW10sIGQxW119LCBbcjBdCitwb2x5MTZ4NHgyX3QgdmxkMl9kdXBfcDE2KF9fdHJhbnNmZXJzaXplKDIpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDBbXSwgZDFbXX0sIFtyMF0KK3VpbnQ4eDh4M190IHZsZDNfZHVwX3U4KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjgge2QwW10sIGQxW10sIGQyW119LCBbcjBdCit1aW50MTZ4NHgzX3QgdmxkM19kdXBfdTE2KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KK3VpbnQzMngyeDNfdCB2bGQzX2R1cF91MzIoX190cmFuc2ZlcnNpemUoMykgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQordWludDY0eDF4M190IHZsZDNfZHVwX3U2NChfX3RyYW5zZmVyc2l6ZSgzKSB1aW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMSwgZDJ9LCBbcjBdCitpbnQ4eDh4M190IHZsZDNfZHVwX3M4KF9fdHJhbnNmZXJzaXplKDMpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KK2ludDE2eDR4M190IHZsZDNfZHVwX3MxNihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KK2ludDMyeDJ4M190IHZsZDNfZHVwX3MzMihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4zMiB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KK2ludDY0eDF4M190IHZsZDNfZHVwX3M2NChfX3RyYW5zZmVyc2l6ZSgzKSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxLCBkMn0sIFtyMF0KK2Zsb2F0MTZ4NHgzX3QgdmxkM19kdXBfZjE2KF9fdHJhbnNmZXJzaXplKDMpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwW10sIGQxW10sIGQyW119LCBbcjBdCitmbG9hdDMyeDJ4M190IHZsZDNfZHVwX2YzMihfX3RyYW5zZmVyc2l6ZSgzKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQorcG9seTh4OHgzX3QgdmxkM19kdXBfcDgoX190cmFuc2ZlcnNpemUoMykgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KK3BvbHkxNng0eDNfdCB2bGQzX2R1cF9wMTYoX190cmFuc2ZlcnNpemUoMykgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQordWludDh4OHg0X3QgdmxkNF9kdXBfdTgoX190cmFuc2ZlcnNpemUoNCkgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KK3VpbnQxNng0eDRfdCB2bGQ0X2R1cF91MTYoX190cmFuc2ZlcnNpemUoNCkgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjE2IHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQordWludDMyeDJ4NF90IHZsZDRfZHVwX3UzMihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCit1aW50NjR4MXg0X3QgdmxkNF9kdXBfdTY0KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCitpbnQ4eDh4NF90IHZsZDRfZHVwX3M4KF9fdHJhbnNmZXJzaXplKDQpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KK2ludDE2eDR4NF90IHZsZDRfZHVwX3MxNihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KK2ludDMyeDJ4NF90IHZsZDRfZHVwX3MzMihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4zMiB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KK2ludDY0eDF4NF90IHZsZDRfZHVwX3M2NChfX3RyYW5zZmVyc2l6ZSg0KSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCitmbG9hdDE2eDR4NF90IHZsZDRfZHVwX2YxNihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjE2IHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQorZmxvYXQzMngyeDRfdCB2bGQ0X2R1cF9mMzIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4zMiB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KK3BvbHk4eDh4NF90IHZsZDRfZHVwX3A4KF9fdHJhbnNmZXJzaXplKDQpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0Ljgge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCitwb2x5MTZ4NHg0X3QgdmxkNF9kdXBfcDE2KF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KKy8vTG9hZCBhIHNpbmdsZSBsYW5lIG9mIE4tZWxlbWVudCBzdHJ1Y3R1cmUgZnJvbSBtZW1vcnkKKy8vdGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgbW9kaWZpZWQgdG8gZGVhbCB3aXRoIHRoZSBlcnJvciBDMjcxOTogJ3NyYyc6IGZvcm1hbCBwYXJhbWV0ZXIgd2l0aCBfX2RlY2xzcGVjKGFsaWduKCcxNicpKSB3b24ndCBiZSBhbGlnbmVkCit1aW50MTZ4OHgyX3QgdmxkMnFfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4OHgyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMi4xNiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQordWludDMyeDR4Ml90IHZsZDJxX2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDR4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDIuMzIge2QwWzBdLCBkMlswXX0sIFtyMF0KK2ludDE2eDh4Ml90IHZsZDJxX2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQxNl90IGNvbnN0ICogcHRyLCBpbnQxNng4eDJfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQyLjE2IHtkMFswXSwgZDJbMF19LCBbcjBdCitpbnQzMng0eDJfdCB2bGQycV9sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4NHgyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMi4zMiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQorZmxvYXQxNng4eDJfdCB2bGQycV9sYW5lX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDh4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDIuMTYge2QwWzBdLCBkMlswXX0sIFtyMF0KK2Zsb2F0MzJ4NHgyX3QgdmxkMnFfbGFuZV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGZsb2F0MzJfdCBjb25zdCAqIHB0ciwgZmxvYXQzMng0eDJfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQyLjMyIHtkMFswXSwgZDJbMF19LCBbcjBdCitwb2x5MTZ4OHgyX3QgdmxkMnFfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4OHgyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMi4xNiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQordWludDh4OHgyX3QgdmxkMl9sYW5lX3U4X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50OF90IGNvbnN0ICogcHRyLCB1aW50OHg4eDJfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvL1ZMRDIuOCB7ZDBbMF0sIGQxWzBdfSwgW3IwXQordWludDE2eDR4Ml90IHZsZDJfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4NHgyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMi4xNiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQordWludDMyeDJ4Ml90IHZsZDJfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90IGNvbnN0ICogcHRyLCB1aW50MzJ4MngyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkxEMi4zMiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQoraW50OHg4eDJfdCB2bGQyX2xhbmVfczhfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGludDhfdCBjb25zdCAqIHB0ciwgaW50OHg4eDJfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvL1ZMRDIuOCB7ZDBbMF0sIGQxWzBdfSwgW3IwXQoraW50MTZ4NHgyX3QgdmxkMl9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50MTZfdCBjb25zdCAqIHB0ciwgaW50MTZ4NHgyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy9WTEQyLjE2IHtkMFswXSwgZDFbMF19LCBbcjBdCitpbnQzMngyeDJfdCB2bGQyX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMngyeDJfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvL1ZMRDIuMzIge2QwWzBdLCBkMVswXX0sIFtyMF0KKy8vZmxvYXQxNng0eDJfdCB2bGQyX2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBfX2ZwMTYgY29uc3QgKiBwdHIsIGZsb2F0MTZ4NHgyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMi4xNiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorZmxvYXQzMngyeDJfdCB2bGQyX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4MngyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkxEMi4zMiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorcG9seTh4OHgyX3QgdmxkMl9sYW5lX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBwb2x5OF90IGNvbnN0ICogcHRyLCBwb2x5OHg4eDJfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvL1ZMRDIuOCB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorcG9seTE2eDR4Ml90IHZsZDJfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4NHgyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMi4xNiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQordWludDE2eDh4M190IHZsZDNxX2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDh4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDMuMTYge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCit1aW50MzJ4NHgzX3QgdmxkM3FfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQzMl90IGNvbnN0ICogcHRyLCB1aW50MzJ4NHgzX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMy4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK2ludDE2eDh4M190IHZsZDNxX2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQxNl90IGNvbnN0ICogcHRyLCBpbnQxNng4eDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQzLjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQoraW50MzJ4NHgzX3QgdmxkM3FfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDMyX3QgY29uc3QgKiBwdHIsIGludDMyeDR4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDMuMzIge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCitmbG9hdDE2eDh4M190IHZsZDNxX2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBfX2ZwMTYgY29uc3QgKiBwdHIsIGZsb2F0MTZ4OHgzX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMy4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK2Zsb2F0MzJ4NHgzX3QgdmxkM3FfbGFuZV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGZsb2F0MzJfdCBjb25zdCAqIHB0ciwgZmxvYXQzMng0eDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQzLjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQorcG9seTE2eDh4M190IHZsZDNxX2xhbmVfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBwb2x5MTZfdCBjb25zdCAqIHB0ciwgcG9seTE2eDh4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDMuMTYge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCit1aW50OHg4eDNfdCB2bGQzX2xhbmVfdThfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ4X3QgY29uc3QgKiBwdHIsIHVpbnQ4eDh4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vVkxEMy44IHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQordWludDE2eDR4M190IHZsZDNfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4NHgzX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMy4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3VpbnQzMngyeDNfdCB2bGQzX2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDJ4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZMRDMuMzIge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCitpbnQ4eDh4M190IHZsZDNfbGFuZV9zOF9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50OF90IGNvbnN0ICogcHRyLCBpbnQ4eDh4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vVkxEMy44IHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQoraW50MTZ4NHgzX3QgdmxkM19sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50MTZfdCBjb25zdCAqIHB0ciwgaW50MTZ4NHgzX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy9WTEQzLjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQoraW50MzJ4MngzX3QgdmxkM19sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4MngzX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy9WTEQzLjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQorZmxvYXQxNng0eDNfdCB2bGQzX2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBfX2ZwMTYgY29uc3QgKiBwdHIsIGZsb2F0MTZ4NHgzX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMy4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK2Zsb2F0MzJ4MngzX3QgdmxkM19sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDJ4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZMRDMuMzIge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCitwb2x5OHg4eDNfdCB2bGQzX2xhbmVfcDhfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHBvbHk4X3QgY29uc3QgKiBwdHIsIHBvbHk4eDh4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vVkxEMy44IHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQorcG9seTE2eDR4M190IHZsZDNfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4NHgzX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMy4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3VpbnQxNng4eDRfdCB2bGQ0cV9sYW5lX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDE2X3QgY29uc3QgKiBwdHIsIHVpbnQxNng4eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQ0LjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK3VpbnQzMng0eDRfdCB2bGQ0cV9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMng0eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQ0LjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK2ludDE2eDh4NF90IHZsZDRxX2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQxNl90IGNvbnN0ICogcHRyLCBpbnQxNng4eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQ0LjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK2ludDMyeDR4NF90IHZsZDRxX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMng0eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQ0LjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK2Zsb2F0MTZ4OHg0X3QgdmxkNHFfbGFuZV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIF9fZnAxNiBjb25zdCAqIHB0ciwgZmxvYXQxNng4eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQ0LjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK2Zsb2F0MzJ4NHg0X3QgdmxkNHFfbGFuZV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCBjb25zdCAqIHB0ciwgZmxvYXQzMng0eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQ0LjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK3BvbHkxNng4eDRfdCB2bGQ0cV9sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgcG9seTE2X3QgY29uc3QgKiBwdHIsIHBvbHkxNng4eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQ0LjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK3VpbnQ4eDh4NF90IHZsZDRfbGFuZV91OF9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDhfdCBjb25zdCAqIHB0ciwgdWludDh4OHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy9WTEQ0Ljgge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQordWludDE2eDR4NF90IHZsZDRfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4NHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxENC4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCit1aW50MzJ4Mng0X3QgdmxkNF9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMngyeDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTEQ0LjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK2ludDh4OHg0X3QgdmxkNF9sYW5lX3M4X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQ4X3QgY29uc3QgKiBwdHIsIGludDh4OHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy9WTEQ0Ljgge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQoraW50MTZ4NHg0X3QgdmxkNF9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgaW50MTZfdCBjb25zdCAqIHB0ciwgaW50MTZ4NHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy9WTEQ0LjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK2ludDMyeDJ4NF90IHZsZDRfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgY29uc3QgKiBwdHIsIGludDMyeDJ4NF90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vVkxENC4zMiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCitmbG9hdDE2eDR4NF90IHZsZDRfbGFuZV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIF9fZnAxNiBjb25zdCAqIHB0ciwgZmxvYXQxNng0eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQ0LjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK2Zsb2F0MzJ4Mng0X3QgdmxkNF9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDJ4NF90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZMRDQuMzIge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQorcG9seTh4OHg0X3QgdmxkNF9sYW5lX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5OF90IGNvbnN0ICogcHRyLCBwb2x5OHg4eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvL1ZMRDQuOCB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCitwb2x5MTZ4NHg0X3QgdmxkNF9sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgcG9seTE2X3QgY29uc3QgKiBwdHIsIHBvbHkxNng0eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQ0LjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KKy8vU3RvcmUgTi1lbGVtZW50IHN0cnVjdHVyZSB0byBtZW1vcnkKK3ZvaWQgdnN0MnFfdThfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSB1aW50OF90ICogcHRyLCB1aW50OHgxNngyX3QgKiB2YWwpOyAvLyBWU1QyLjgge2QwLCBkMn0sIFtyMF0KK3ZvaWQgdnN0MnFfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4eDJfdCAqIHZhbCk7IC8vIFZTVDIuMTYge2QwLCBkMn0sIFtyMF0KK3ZvaWQgdnN0MnFfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDR4Ml90ICogdmFsKTsgLy8gVlNUMi4zMiB7ZDAsIGQyfSwgW3IwXQordm9pZCB2c3QycV9zOF9wdHIoX190cmFuc2ZlcnNpemUoMzIpIGludDhfdCAqIHB0ciwgaW50OHgxNngyX3QgKiB2YWwpOyAvLyBWU1QyLjgge2QwLCBkMn0sIFtyMF0KK3ZvaWQgdnN0MnFfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgaW50MTZfdCAqIHB0ciwgaW50MTZ4OHgyX3QgKiB2YWwpOyAvLyBWU1QyLjE2IHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoOCkgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHgyX3QgKiB2YWwpOyAvLyBWU1QyLjMyIHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4eDJfdCAqIHZhbCk7IC8vIFZTVDIuMTYge2QwLCBkMn0sIFtyMF0KK3ZvaWQgdnN0MnFfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg4KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NHgyX3QgKiB2YWwpOyAvLyBWU1QyLjMyIHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSgzMikgcG9seThfdCAqIHB0ciwgcG9seTh4MTZ4Ml90ICogdmFsKTsgLy8gVlNUMi44IHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHgyX3QgKiB2YWwpOyAvLyBWU1QyLjE2IHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJfdThfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSB1aW50OF90ICogcHRyLCB1aW50OHg4eDJfdCAqIHZhbCk7IC8vIFZTVDIuOCB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QyX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoOCkgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0eDJfdCAqIHZhbCk7IC8vIFZTVDIuMTYge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0Ml91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4MngyX3QgKiB2YWwpOyAvLyBWU1QyLjMyIHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDJfdTY0X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50NjRfdCAqIHB0ciwgdWludDY0eDF4Ml90ICogdmFsKTsgLy8gVlNUMS42NCB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QyX3M4X3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgaW50OF90ICogcHRyLCBpbnQ4eDh4Ml90ICogdmFsKTsgLy8gVlNUMi44IHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDJfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSg4KSBpbnQxNl90ICogcHRyLCBpbnQxNng0eDJfdCAqIHZhbCk7IC8vIFZTVDIuMTYge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0Ml9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgKiBwdHIsIGludDMyeDJ4Ml90ICogdmFsKTsgLy8gVlNUMi4zMiB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QyX3M2NF9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50NjRfdCAqIHB0ciwgaW50NjR4MXgyX3QgKiB2YWwpOyAvLyBWU1QxLjY0IHtkMCwgZDF9LCBbcjBdCisvL3ZvaWQgdnN0Ml9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDgpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0eDJfdCAqIHZhbCk7IC8vIFZTVDIuMTYge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0Ml9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMngyeDJfdCAqIHZhbCk7IC8vIFZTVDIuMzIge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0Ml9wOF9wdHIoX190cmFuc2ZlcnNpemUoMTYpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDh4Ml90ICogdmFsKTsgLy8gVlNUMi44IHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDJfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSg4KSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDR4Ml90ICogdmFsKTsgLy8gVlNUMi4xNiB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QzcV91OF9wdHIoX190cmFuc2ZlcnNpemUoNDgpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDE2eDNfdCAqIHZhbCk7IC8vIFZTVDMuOCB7ZDAsIGQyLCBkNH0sIFtyMF0KK3ZvaWQgdnN0M3FfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyNCkgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4eDNfdCAqIHZhbCk7IC8vIFZTVDMuMTYge2QwLCBkMiwgZDR9LCBbcjBdCit2b2lkIHZzdDNxX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMTIpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4NHgzX3QgKiB2YWwpOyAvLyBWU1QzLjMyIHtkMCwgZDIsIGQ0fSwgW3IwXQordm9pZCB2c3QzcV9zOF9wdHIoX190cmFuc2ZlcnNpemUoNDgpIGludDhfdCAqIHB0ciwgaW50OHgxNngzX3QgKiB2YWwpOyAvLyBWU1QzLjgge2QwLCBkMiwgZDR9LCBbcjBdCit2b2lkIHZzdDNxX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMjQpIGludDE2X3QgKiBwdHIsIGludDE2eDh4M190ICogdmFsKTsgLy8gVlNUMy4xNiB7ZDAsIGQyLCBkNH0sIFtyMF0KK3ZvaWQgdnN0M3FfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgxMikgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHgzX3QgKiB2YWwpOyAvLyBWU1QzLjMyIHtkMCwgZDIsIGQ0fSwgW3IwXQordm9pZCB2c3QzcV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDI0KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHgzX3QgKiB2YWwpOyAvLyBWU1QzLjE2IHtkMCwgZDIsIGQ0fSwgW3IwXQordm9pZCB2c3QzcV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDEyKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NHgzX3QgKiB2YWwpOyAvLyBWU1QzLjMyIHtkMCwgZDIsIGQ0fSwgW3IwXQordm9pZCB2c3QzcV9wOF9wdHIoX190cmFuc2ZlcnNpemUoNDgpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDE2eDNfdCAqIHZhbCk7IC8vIFZTVDMuOCB7ZDAsIGQyLCBkNH0sIFtyMF0KK3ZvaWQgdnN0M3FfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyNCkgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4eDNfdCAqIHZhbCk7IC8vIFZTVDMuMTYge2QwLCBkMiwgZDR9LCBbcjBdCit2b2lkIHZzdDNfdThfcHRyKF9fdHJhbnNmZXJzaXplKDI0KSB1aW50OF90ICogcHRyLCB1aW50OHg4eDNfdCAqIHZhbCk7IC8vIFZTVDMuOCB7ZDAsIGQxLCBkMn0sIFtyMF0KK3ZvaWQgdnN0M191MTZfcHRyKF9fdHJhbnNmZXJzaXplKDEyKSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDR4M190ICogdmFsKTsgLy8gVlNUMy4xNiB7ZDAsIGQxLCBkMn0sIFtyMF0KK3ZvaWQgdnN0M191MzJfcHRyKF9fdHJhbnNmZXJzaXplKDYpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4MngzX3QgKiB2YWwpOyAvLyBWU1QzLjMyIHtkMCwgZDEsIGQyfSwgW3IwXQordm9pZCB2c3QzX3U2NF9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgxeDNfdCAqIHZhbCk7IC8vIFZTVDEuNjQge2QwLCBkMSwgZDJ9LCBbcjBdCit2b2lkIHZzdDNfczhfcHRyKF9fdHJhbnNmZXJzaXplKDI0KSBpbnQ4X3QgKiBwdHIsIGludDh4OHgzX3QgKiB2YWwpOyAvLyBWU1QzLjgge2QwLCBkMSwgZDJ9LCBbcjBdCit2b2lkIHZzdDNfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxMikgaW50MTZfdCAqIHB0ciwgaW50MTZ4NHgzX3QgKiB2YWwpOyAvLyBWU1QzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQordm9pZCB2c3QzX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoNikgaW50MzJfdCAqIHB0ciwgaW50MzJ4MngzX3QgKiB2YWwpOyAvLyBWU1QzLjMyIHtkMCwgZDEsIGQyfSwgW3IwXQordm9pZCB2c3QzX3M2NF9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50NjRfdCAqIHB0ciwgaW50NjR4MXgzX3QgKiB2YWwpOyAvLyBWU1QxLjY0IHtkMCwgZDEsIGQyfSwgW3IwXQordm9pZCB2c3QzX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMTIpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0eDNfdCAqIHZhbCk7IC8vIFZTVDMuMTYge2QwLCBkMSwgZDJ9LCBbcjBdCit2b2lkIHZzdDNfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg2KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4MngzX3QgKiB2YWwpOyAvLyBWU1QzLjMyIHtkMCwgZDEsIGQyfSwgW3IwXQordm9pZCB2c3QzX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSgyNCkgcG9seThfdCAqIHB0ciwgcG9seTh4OHgzX3QgKiB2YWwpOyAvLyBWU1QzLjgge2QwLCBkMSwgZDJ9LCBbcjBdCit2b2lkIHZzdDNfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxMikgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0eDNfdCAqIHZhbCk7IC8vIFZTVDMuMTYge2QwLCBkMSwgZDJ9LCBbcjBdCit2b2lkIHZzdDRxX3U4X3B0cihfX3RyYW5zZmVyc2l6ZSg2NCkgdWludDhfdCAqIHB0ciwgdWludDh4MTZ4NF90ICogdmFsKTsgLy8gVlNUNC44IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK3ZvaWQgdnN0NHFfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzMikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4eDRfdCAqIHZhbCk7IC8vIFZTVDQuMTYge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQordm9pZCB2c3Q0cV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDR4NF90ICogdmFsKTsgLy8gVlNUNC4zMiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit2b2lkIHZzdDRxX3M4X3B0cihfX3RyYW5zZmVyc2l6ZSg2NCkgaW50OF90ICogcHRyLCBpbnQ4eDE2eDRfdCAqIHZhbCk7IC8vIFZTVDQuOCB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit2b2lkIHZzdDRxX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMzIpIGludDE2X3QgKiBwdHIsIGludDE2eDh4NF90ICogdmFsKTsgLy8gVlNUNC4xNiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit2b2lkIHZzdDRxX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIGludDMyX3QgKiBwdHIsIGludDMyeDR4NF90ICogdmFsKTsgLy8gVlNUNC4zMiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit2b2lkIHZzdDRxX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMzIpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4eDRfdCAqIHZhbCk7IC8vIFZTVDQuMTYge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQordm9pZCB2c3Q0cV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NHg0X3QgKiB2YWwpOyAvLyBWU1Q0LjMyIHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK3ZvaWQgdnN0NHFfcDhfcHRyKF9fdHJhbnNmZXJzaXplKDY0KSBwb2x5OF90ICogcHRyLCBwb2x5OHgxNng0X3QgKiB2YWwpOyAvLyBWU1Q0Ljgge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQordm9pZCB2c3Q0cV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDh4NF90ICogdmFsKTsgLy8gVlNUNC4xNiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit2b2lkIHZzdDRfdThfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSB1aW50OF90ICogcHRyLCB1aW50OHg4eDRfdCAqIHZhbCk7IC8vIFZTVDQuOCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit2b2lkIHZzdDRfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0eDRfdCAqIHZhbCk7IC8vIFZTVDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQordm9pZCB2c3Q0X3UzMl9wdHIoX190cmFuc2ZlcnNpemUoOCkgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyeDRfdCAqIHZhbCk7IC8vIFZTVDQuMzIge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQordm9pZCB2c3Q0X3U2NF9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgxeDRfdCAqIHZhbCk7IC8vIFZTVDEuNjQge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQordm9pZCB2c3Q0X3M4X3B0cihfX3RyYW5zZmVyc2l6ZSgzMikgaW50OF90ICogcHRyLCBpbnQ4eDh4NF90ICogdmFsKTsgLy8gVlNUNC44IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3ZvaWQgdnN0NF9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSBpbnQxNl90ICogcHRyLCBpbnQxNng0eDRfdCAqIHZhbCk7IC8vIFZTVDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQordm9pZCB2c3Q0X3MzMl9wdHIoX190cmFuc2ZlcnNpemUoOCkgaW50MzJfdCAqIHB0ciwgaW50MzJ4Mng0X3QgKiB2YWwpOyAvLyBWU1Q0LjMyIHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3ZvaWQgdnN0NF9zNjRfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGludDY0X3QgKiBwdHIsIGludDY0eDF4NF90ICogdmFsKTsgLy8gVlNUMS42NCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit2b2lkIHZzdDRfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgX19mcDE2ICogcHRyLCBmbG9hdDE2eDR4NF90ICogdmFsKTsgLy8gVlNUNC4xNiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit2b2lkIHZzdDRfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg4KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4Mng0X3QgKiB2YWwpOyAvLyBWU1Q0LjMyIHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3ZvaWQgdnN0NF9wOF9wdHIoX190cmFuc2ZlcnNpemUoMzIpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDh4NF90ICogdmFsKTsgLy8gVlNUNC44IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3ZvaWQgdnN0NF9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDR4NF90ICogdmFsKTsgLy8gVlNUNC4xNiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCisvL1N0b3JlIGEgc2luZ2xlIGxhbmUgb2YgTi1lbGVtZW50IHN0cnVjdHVyZSB0byBtZW1vcnkKK3ZvaWQgdnN0MnFfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMi4xNntkMFswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDJxX2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDR4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDIuMzJ7ZDBbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QycV9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50MTZfdCAqIHB0ciwgaW50MTZ4OHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMi4xNntkMFswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDJxX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQzMl90ICogcHRyLCBpbnQzMng0eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1QyLjMye2QwWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0MnFfbGFuZV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1QyLjE2e2QwWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0MnFfbGFuZV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMng0eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvL1ZTVDIuMzIge2QwWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0MnFfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMi4xNntkMFswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDJfbGFuZV91OF9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDhfdCAqIHB0ciwgdWludDh4OHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMi44e2QwWzBdLCBkMVswXX0sIFtyMF0KK3ZvaWQgdnN0Ml9sYW5lX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1QyLjE2e2QwWzBdLCBkMVswXX0sIFtyMF0KK3ZvaWQgdnN0Ml9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyeDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWU1QyLjMye2QwWzBdLCBkMVswXX0sIFtyMF0KK3ZvaWQgdnN0Ml9sYW5lX3M4X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ4X3QgKiBwdHIsIGludDh4OHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMi44IHtkMFswXSxkMVswXX0sIFtyMF0KK3ZvaWQgdnN0Ml9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50MTZfdCAqIHB0ciwgaW50MTZ4NHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUMi4xNntkMFswXSwgZDFbMF19LCBbcjBdCit2b2lkIHZzdDJfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGludDMyX3QgKiBwdHIsIGludDMyeDJ4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZTVDIuMzJ7ZDBbMF0sIGQxWzBdfSwgW3IwXQordm9pZCB2c3QyX2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUMi4xNntkMFswXSwgZDFbMF19LCBbcjBdCit2b2lkIHZzdDJfbGFuZV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMngyeDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWU1QyLjMye2QwWzBdLCBkMVswXX0sIFtyMF0KK3ZvaWQgdnN0Ml9sYW5lX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBwb2x5OF90ICogcHRyLCBwb2x5OHg4eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1QyLjh7ZDBbMF0sIGQxWzBdfSwgW3IwXQordm9pZCB2c3QyX2xhbmVfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDR4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDIuMTZ7ZDBbMF0sIGQxWzBdfSwgW3IwXQordm9pZCB2c3QzcV9sYW5lX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1QzLjE2e2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCit2b2lkIHZzdDNxX2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDR4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDMuMzJ7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK3ZvaWQgdnN0M3FfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDE2X3QgKiBwdHIsIGludDE2eDh4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDMuMTZ7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK3ZvaWQgdnN0M3FfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDMyX3QgKiBwdHIsIGludDMyeDR4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDMuMzJ7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK3ZvaWQgdnN0M3FfbGFuZV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1QzLjE2e2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCit2b2lkIHZzdDNxX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy9WU1QzLjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQordm9pZCB2c3QzcV9sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1QzLjE2e2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCit2b2lkIHZzdDNfbGFuZV91OF9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDhfdCAqIHB0ciwgdWludDh4OHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMy44e2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDNfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUMy4xNntkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QzX2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDJ4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZTVDMuMzJ7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0M19sYW5lX3M4X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQ4X3QgKiBwdHIsIGludDh4OHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMy44IHtkMFswXSxkMVswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDNfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDE2X3QgKiBwdHIsIGludDE2eDR4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDMuMTZ7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0M19sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50MzJfdCAqIHB0ciwgaW50MzJ4MngzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVlNUMy4zMntkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QzX2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUMy4xNntkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QzX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4MngzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVlNUMy4zMntkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QzX2xhbmVfcDhfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDh4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDMuOHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QzX2xhbmVfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDR4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDMuMTZ7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0NHFfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUNC4xNntkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK3ZvaWQgdnN0NHFfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4NHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUNC4zMntkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK3ZvaWQgdnN0NHFfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGludDE2X3QgKiBwdHIsIGludDE2eDh4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDQuMTZ7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCit2b2lkIHZzdDRxX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90ICogcHRyLCBpbnQzMng0eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1Q0LjMye2QwWzBdLCBkMlswXSwgZDRbMF0sIGQ2WzBdfSwgW3IwXQordm9pZCB2c3Q0cV9sYW5lX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgX19mcDE2ICogcHRyLCBmbG9hdDE2eDh4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDQuMTZ7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCit2b2lkIHZzdDRxX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy9WU1Q0LjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK3ZvaWQgdnN0NHFfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUNC4xNntkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK3ZvaWQgdnN0NF9sYW5lX3U4X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50OF90ICogcHRyLCB1aW50OHg4eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1Q0Ljh7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCit2b2lkIHZzdDRfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUNC4xNntkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK3ZvaWQgdnN0NF9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyeDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWU1Q0LjMye2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQordm9pZCB2c3Q0X2xhbmVfczhfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGludDhfdCAqIHB0ciwgaW50OHg4eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1Q0Ljgge2QwWzBdLGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCit2b2lkIHZzdDRfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGludDE2X3QgKiBwdHIsIGludDE2eDR4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDQuMTZ7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCit2b2lkIHZzdDRfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgKiBwdHIsIGludDMyeDJ4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZTVDQuMzJ7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCit2b2lkIHZzdDRfbGFuZV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1Q0LjE2e2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQordm9pZCB2c3Q0X2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4Mng0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVlNUNC4zMntkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK3ZvaWQgdnN0NF9sYW5lX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5OF90ICogcHRyLCBwb2x5OHg4eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1Q0Ljh7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCit2b2lkIHZzdDRfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4NHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUNC4xNntkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KKy8vRXh0cmFjdCBsYW5lcyBmcm9tIGEgdmVjdG9yIGFuZCBwdXQgaW50byBhIHJlZ2lzdGVyLiBUaGVzZSBpbnRyaW5zaWNzIGV4dHJhY3QgYSBzaW5nbGUgbGFuZSAoZWxlbWVudCkgZnJvbSBhIHZlY3Rvci4KK3VpbnQ4X3QgdmdldF9sYW5lX3U4KHVpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi5VOCByMCwgZDBbMF0KK3VpbnQxNl90IHZnZXRfbGFuZV91MTYodWludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi5VMTYgcjAsIGQwWzBdCit1aW50MzJfdCB2Z2V0X2xhbmVfdTMyKHVpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZNT1YuMzIgcjAsIGQwWzBdCitpbnQ4X3QgdmdldF9sYW5lX3M4KGludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTU9WLlM4IHIwLCBkMFswXQoraW50MTZfdCB2Z2V0X2xhbmVfczE2KGludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi5TMTYgcjAsIGQwWzBdCitpbnQzMl90IHZnZXRfbGFuZV9zMzIoaW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WLjMyIHIwLCBkMFswXQorcG9seThfdCB2Z2V0X2xhbmVfcDgocG9seTh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTU9WLlU4IHIwLCBkMFswXQorcG9seTE2X3QgdmdldF9sYW5lX3AxNihwb2x5MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLlUxNiByMCwgZDBbMF0KK2Zsb2F0MzJfdCB2Z2V0X2xhbmVfZjMyKGZsb2F0MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WLjMyIHIwLCBkMFswXQordWludDhfdCB2Z2V0cV9sYW5lX3U4KHVpbnQ4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvLyBWTU9WLlU4IHIwLCBkMFswXQordWludDE2X3QgdmdldHFfbGFuZV91MTYodWludDE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi5VMTYgcjAsIGQwWzBdCit1aW50MzJfdCB2Z2V0cV9sYW5lX3UzMih1aW50MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLjMyIHIwLCBkMFswXQoraW50OF90IHZnZXRxX2xhbmVfczgoaW50OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy8gVk1PVi5TOCByMCwgZDBbMF0KK2ludDE2X3QgdmdldHFfbGFuZV9zMTYoaW50MTZ4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTU9WLlMxNiByMCwgZDBbMF0KK2ludDMyX3QgdmdldHFfbGFuZV9zMzIoaW50MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLjMyIHIwLCBkMFswXQorcG9seThfdCB2Z2V0cV9sYW5lX3A4KHBvbHk4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvLyBWTU9WLlU4IHIwLCBkMFswXQorcG9seTE2X3QgdmdldHFfbGFuZV9wMTYocG9seTE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi5VMTYgcjAsIGQwWzBdCitmbG9hdDMyX3QgdmdldHFfbGFuZV9mMzIoZmxvYXQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuMzIgcjAsIGQwWzBdCitpbnQ2NF90IHZnZXRfbGFuZV9zNjQoaW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvLyBWTU9WIHIwLHIwLGQwCit1aW50NjRfdCB2Z2V0X2xhbmVfdTY0KHVpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZNT1YgcjAscjAsZDAKK2ludDY0X3QgdmdldHFfbGFuZV9zNjQoaW50NjR4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WIHIwLHIwLGQwCit1aW50NjRfdCB2Z2V0cV9sYW5lX3U2NCh1aW50NjR4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WIHIwLHIwLGQwCisvL0xvYWQgYSBzaW5nbGUgbGFuZSBvZiBhIHZlY3RvciBmcm9tIGEgbGl0ZXJhbC4gVGhlc2UgaW50cmluc2ljcyBzZXQgYSBzaW5nbGUgbGFuZSAoZWxlbWVudCkgd2l0aGluIGEgdmVjdG9yLgordWludDh4OF90IHZzZXRfbGFuZV91OCh1aW50OF90IHZhbHVlLCB1aW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuOCBkMFswXSxyMAordWludDE2eDRfdCB2c2V0X2xhbmVfdTE2KHVpbnQxNl90IHZhbHVlLCB1aW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLjE2IGQwWzBdLHIwCit1aW50MzJ4Ml90IHZzZXRfbGFuZV91MzIodWludDMyX3QgdmFsdWUsIHVpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZNT1YuMzIgZDBbMF0scjAKK2ludDh4OF90IHZzZXRfbGFuZV9zOChpbnQ4X3QgdmFsdWUsIGludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTU9WLjggZDBbMF0scjAKK2ludDE2eDRfdCB2c2V0X2xhbmVfczE2KGludDE2X3QgdmFsdWUsIGludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4xNiBkMFswXSxyMAoraW50MzJ4Ml90IHZzZXRfbGFuZV9zMzIoaW50MzJfdCB2YWx1ZSwgaW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WLjMyIGQwWzBdLHIwCitwb2x5OHg4X3QgdnNldF9sYW5lX3A4KHBvbHk4X3QgdmFsdWUsIHBvbHk4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi44IGQwWzBdLHIwCitwb2x5MTZ4NF90IHZzZXRfbGFuZV9wMTYocG9seTE2X3QgdmFsdWUsIHBvbHkxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuMTYgZDBbMF0scjAKK2Zsb2F0MzJ4Ml90IHZzZXRfbGFuZV9mMzIoZmxvYXQzMl90IHZhbHVlLCBmbG9hdDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVk1PVi4zMiBkMFswXSxyMAordWludDh4MTZfdCB2c2V0cV9sYW5lX3U4KHVpbnQ4X3QgdmFsdWUsIHVpbnQ4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvLyBWTU9WLjggZDBbMF0scjAKK3VpbnQxNng4X3QgdnNldHFfbGFuZV91MTYodWludDE2X3QgdmFsdWUsIHVpbnQxNng4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuMTYgZDBbMF0scjAKK3VpbnQzMng0X3QgdnNldHFfbGFuZV91MzIodWludDMyX3QgdmFsdWUsIHVpbnQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuMzIgZDBbMF0scjAKK2ludDh4MTZfdCB2c2V0cV9sYW5lX3M4KGludDhfdCB2YWx1ZSwgaW50OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy8gVk1PVi44IGQwWzBdLHIwCitpbnQxNng4X3QgdnNldHFfbGFuZV9zMTYoaW50MTZfdCB2YWx1ZSwgaW50MTZ4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTU9WLjE2IGQwWzBdLHIwCitpbnQzMng0X3QgdnNldHFfbGFuZV9zMzIoaW50MzJfdCB2YWx1ZSwgaW50MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLjMyIGQwWzBdLHIwCitwb2x5OHgxNl90IHZzZXRxX2xhbmVfcDgocG9seThfdCB2YWx1ZSwgcG9seTh4MTZfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgbGFuZSk7IC8vIFZNT1YuOCBkMFswXSxyMAorcG9seTE2eDhfdCB2c2V0cV9sYW5lX3AxNihwb2x5MTZfdCB2YWx1ZSwgcG9seTE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi4xNiBkMFswXSxyMAorZmxvYXQzMng0X3QgdnNldHFfbGFuZV9mMzIoZmxvYXQzMl90IHZhbHVlLCBmbG9hdDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4zMiBkMFswXSxyMAoraW50NjR4MV90IHZzZXRfbGFuZV9zNjQoaW50NjRfdCB2YWx1ZSwgaW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvLyBWTU9WIGQwLHIwLHIwCit1aW50NjR4MV90IHZzZXRfbGFuZV91NjQodWludDY0X3QgdmFsdWUsIHVpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZNT1YgZDAscjAscjAKK2ludDY0eDJfdCB2c2V0cV9sYW5lX3M2NChpbnQ2NF90IHZhbHVlLCBpbnQ2NHgyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZNT1YgZDAscjAscjAKK3VpbnQ2NHgyX3QgdnNldHFfbGFuZV91NjQodWludDY0X3QgdmFsdWUsIHVpbnQ2NHgyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZNT1YgZDAscjAscjAKKy8vSW5pdGlhbGl6ZSBhIHZlY3RvciBmcm9tIGEgbGl0ZXJhbCBiaXQgcGF0dGVybi4KK2ludDh4OF90IHZjcmVhdGVfczgodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKK2ludDE2eDRfdCB2Y3JlYXRlX3MxNih1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAoraW50MzJ4Ml90IHZjcmVhdGVfczMyKHVpbnQ2NF90IGEpOyAvLyBWTU9WIGQwLHIwLHIwCitmbG9hdDE2eDRfdCB2Y3JlYXRlX2YxNih1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorZmxvYXQzMngyX3QgdmNyZWF0ZV9mMzIodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKK3VpbnQ4eDhfdCB2Y3JlYXRlX3U4KHVpbnQ2NF90IGEpOyAvLyBWTU9WIGQwLHIwLHIwCit1aW50MTZ4NF90IHZjcmVhdGVfdTE2KHVpbnQ2NF90IGEpOyAvLyBWTU9WIGQwLHIwLHIwCit1aW50MzJ4Ml90IHZjcmVhdGVfdTMyKHVpbnQ2NF90IGEpOyAvLyBWTU9WIGQwLHIwLHIwCit1aW50NjR4MV90IHZjcmVhdGVfdTY0KHVpbnQ2NF90IGEpOyAvLyBWTU9WIGQwLHIwLHIwCitwb2x5OHg4X3QgdmNyZWF0ZV9wOCh1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorcG9seTE2eDRfdCB2Y3JlYXRlX3AxNih1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAoraW50NjR4MV90IHZjcmVhdGVfczY0KHVpbnQ2NF90IGEpOyAvLyBWTU9WIGQwLHIwLHIwCisvL1NldCBhbGwgbGFuZXMgdG8gc2FtZSB2YWx1ZQorLy9Mb2FkIGFsbCBsYW5lcyBvZiB2ZWN0b3IgdG8gdGhlIHNhbWUgbGl0ZXJhbCB2YWx1ZQordWludDh4OF90IHZkdXBfbl91OCh1aW50OF90IHZhbHVlKTsgLy8gVkRVUC44IGQwLHIwCit1aW50MTZ4NF90IHZkdXBfbl91MTYodWludDE2X3QgdmFsdWUpOyAvLyBWRFVQLjE2IGQwLHIwCit1aW50MzJ4Ml90IHZkdXBfbl91MzIodWludDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIGQwLHIwCitpbnQ4eDhfdCB2ZHVwX25fczgoaW50OF90IHZhbHVlKTsgLy8gVkRVUC44IGQwLHIwCitpbnQxNng0X3QgdmR1cF9uX3MxNihpbnQxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBkMCxyMAoraW50MzJ4Ml90IHZkdXBfbl9zMzIoaW50MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgZDAscjAKK3BvbHk4eDhfdCB2ZHVwX25fcDgocG9seThfdCB2YWx1ZSk7IC8vIFZEVVAuOCBkMCxyMAorcG9seTE2eDRfdCB2ZHVwX25fcDE2KHBvbHkxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBkMCxyMAorZmxvYXQzMngyX3QgdmR1cF9uX2YzMihmbG9hdDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIGQwLHIwCit1aW50OHgxNl90IHZkdXBxX25fdTgodWludDhfdCB2YWx1ZSk7IC8vIFZEVVAuOCBxMCxyMAordWludDE2eDhfdCB2ZHVwcV9uX3UxNih1aW50MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgcTAscjAKK3VpbnQzMng0X3QgdmR1cHFfbl91MzIodWludDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIHEwLHIwCitpbnQ4eDE2X3QgdmR1cHFfbl9zOChpbnQ4X3QgdmFsdWUpOyAvLyBWRFVQLjggcTAscjAKK2ludDE2eDhfdCB2ZHVwcV9uX3MxNihpbnQxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBxMCxyMAoraW50MzJ4NF90IHZkdXBxX25fczMyKGludDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIHEwLHIwCitwb2x5OHgxNl90IHZkdXBxX25fcDgocG9seThfdCB2YWx1ZSk7IC8vIFZEVVAuOCBxMCxyMAorcG9seTE2eDhfdCB2ZHVwcV9uX3AxNihwb2x5MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgcTAscjAKK2Zsb2F0MzJ4NF90IHZkdXBxX25fZjMyKGZsb2F0MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgcTAscjAKK2ludDY0eDFfdCB2ZHVwX25fczY0KGludDY0X3QgdmFsdWUpOyAvLyBWTU9WIGQwLHIwLHIwCit1aW50NjR4MV90IHZkdXBfbl91NjQodWludDY0X3QgdmFsdWUpOyAvLyBWTU9WIGQwLHIwLHIwCitpbnQ2NHgyX3QgdmR1cHFfbl9zNjQoaW50NjRfdCB2YWx1ZSk7IC8vIFZNT1YgZDAscjAscjAKK3VpbnQ2NHgyX3QgdmR1cHFfbl91NjQodWludDY0X3QgdmFsdWUpOyAvLyBWTU9WIGQwLHIwLHIwCit1aW50OHg4X3Qgdm1vdl9uX3U4KHVpbnQ4X3QgdmFsdWUpOyAvLyBWRFVQLjggZDAscjAKK3VpbnQxNng0X3Qgdm1vdl9uX3UxNih1aW50MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgZDAscjAKK3VpbnQzMngyX3Qgdm1vdl9uX3UzMih1aW50MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgZDAscjAKK2ludDh4OF90IHZtb3Zfbl9zOChpbnQ4X3QgdmFsdWUpOyAvLyBWRFVQLjggZDAscjAKK2ludDE2eDRfdCB2bW92X25fczE2KGludDE2X3QgdmFsdWUpOyAvLyBWRFVQLjE2IGQwLHIwCitpbnQzMngyX3Qgdm1vdl9uX3MzMihpbnQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBkMCxyMAorcG9seTh4OF90IHZtb3Zfbl9wOChwb2x5OF90IHZhbHVlKTsgLy8gVkRVUC44IGQwLHIwCitwb2x5MTZ4NF90IHZtb3Zfbl9wMTYocG9seTE2X3QgdmFsdWUpOyAvLyBWRFVQLjE2IGQwLHIwCitmbG9hdDMyeDJfdCB2bW92X25fZjMyKGZsb2F0MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgZDAscjAKK3VpbnQ4eDE2X3Qgdm1vdnFfbl91OCh1aW50OF90IHZhbHVlKTsgLy8gVkRVUC44IHEwLHIwCit1aW50MTZ4OF90IHZtb3ZxX25fdTE2KHVpbnQxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBxMCxyMAordWludDMyeDRfdCB2bW92cV9uX3UzMih1aW50MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgcTAscjAKK2ludDh4MTZfdCB2bW92cV9uX3M4KGludDhfdCB2YWx1ZSk7IC8vIFZEVVAuOCBxMCxyMAoraW50MTZ4OF90IHZtb3ZxX25fczE2KGludDE2X3QgdmFsdWUpOyAvLyBWRFVQLjE2IHEwLHIwCitpbnQzMng0X3Qgdm1vdnFfbl9zMzIoaW50MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgcTAscjAKK3BvbHk4eDE2X3Qgdm1vdnFfbl9wOChwb2x5OF90IHZhbHVlKTsgLy8gVkRVUC44IHEwLHIwCitwb2x5MTZ4OF90IHZtb3ZxX25fcDE2KHBvbHkxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBxMCxyMAorZmxvYXQzMng0X3Qgdm1vdnFfbl9mMzIoZmxvYXQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBxMCxyMAoraW50NjR4MV90IHZtb3Zfbl9zNjQoaW50NjRfdCB2YWx1ZSk7IC8vIFZNT1YgZDAscjAscjAKK3VpbnQ2NHgxX3Qgdm1vdl9uX3U2NCh1aW50NjRfdCB2YWx1ZSk7IC8vIFZNT1YgZDAscjAscjAKK2ludDY0eDJfdCB2bW92cV9uX3M2NChpbnQ2NF90IHZhbHVlKTsgLy8gVk1PViBkMCxyMCxyMAordWludDY0eDJfdCB2bW92cV9uX3U2NCh1aW50NjRfdCB2YWx1ZSk7IC8vIFZNT1YgZDAscjAscjAKKy8vTG9hZCBhbGwgbGFuZXMgb2YgdGhlIHZlY3RvciB0byB0aGUgdmFsdWUgb2YgYSBsYW5lIG9mIGEgdmVjdG9yCit1aW50OHg4X3QgdmR1cF9sYW5lX3U4KHVpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkRVUC44IGQwLGQwWzBdCit1aW50MTZ4NF90IHZkdXBfbGFuZV91MTYodWludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkRVUC4xNiBkMCxkMFswXQordWludDMyeDJfdCB2ZHVwX2xhbmVfdTMyKHVpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZEVVAuMzIgZDAsZDBbMF0KK2ludDh4OF90IHZkdXBfbGFuZV9zOChpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkRVUC44IGQwLGQwWzBdCitpbnQxNng0X3QgdmR1cF9sYW5lX3MxNihpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZEVVAuMTYgZDAsZDBbMF0KK2ludDMyeDJfdCB2ZHVwX2xhbmVfczMyKGludDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkRVUC4zMiBkMCxkMFswXQorcG9seTh4OF90IHZkdXBfbGFuZV9wOChwb2x5OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZEVVAuOCBkMCxkMFswXQorcG9seTE2eDRfdCB2ZHVwX2xhbmVfcDE2KHBvbHkxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZEVVAuMTYgZDAsZDBbMF0KK2Zsb2F0MzJ4Ml90IHZkdXBfbGFuZV9mMzIoZmxvYXQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZEVVAuMzIgZDAsZDBbMF0KK3VpbnQ4eDE2X3QgdmR1cHFfbGFuZV91OCh1aW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZEVVAuOCBxMCxkMFswXQordWludDE2eDhfdCB2ZHVwcV9sYW5lX3UxNih1aW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWRFVQLjE2IHEwLGQwWzBdCit1aW50MzJ4NF90IHZkdXBxX2xhbmVfdTMyKHVpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZEVVAuMzIgcTAsZDBbMF0KK2ludDh4MTZfdCB2ZHVwcV9sYW5lX3M4KGludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWRFVQLjggcTAsZDBbMF0KK2ludDE2eDhfdCB2ZHVwcV9sYW5lX3MxNihpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZEVVAuMTYgcTAsZDBbMF0KK2ludDMyeDRfdCB2ZHVwcV9sYW5lX3MzMihpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZEVVAuMzIgcTAsZDBbMF0KK3BvbHk4eDE2X3QgdmR1cHFfbGFuZV9wOChwb2x5OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZEVVAuOCBxMCxkMFswXQorcG9seTE2eDhfdCB2ZHVwcV9sYW5lX3AxNihwb2x5MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWRFVQLjE2IHEwLGQwWzBdCitmbG9hdDMyeDRfdCB2ZHVwcV9sYW5lX2YzMihmbG9hdDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkRVUC4zMiBxMCxkMFswXQoraW50NjR4MV90IHZkdXBfbGFuZV9zNjQoaW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvLyBWTU9WIGQwLGQwCit1aW50NjR4MV90IHZkdXBfbGFuZV91NjQodWludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKTsgLy8gVk1PViBkMCxkMAoraW50NjR4Ml90IHZkdXBxX2xhbmVfczY0KGludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKTsgLy8gVk1PViBxMCxxMAordWludDY0eDJfdCB2ZHVwcV9sYW5lX3U2NCh1aW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvLyBWTU9WIHEwLHEwCisvL0NvbWJpbmluZyB2ZWN0b3JzLiBUaGVzZSBpbnRyaW5zaWNzIGpvaW4gdHdvIDY0IGJpdCB2ZWN0b3JzIGludG8gYSBzaW5nbGUgMTI4Yml0IHZlY3Rvci4KK2ludDh4MTZfdCB2Y29tYmluZV9zOChpbnQ4eDhfdCBsb3csIGludDh4OF90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCitpbnQxNng4X3QgdmNvbWJpbmVfczE2KGludDE2eDRfdCBsb3csIGludDE2eDRfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAoraW50MzJ4NF90IHZjb21iaW5lX3MzMihpbnQzMngyX3QgbG93LCBpbnQzMngyX3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKK2ludDY0eDJfdCB2Y29tYmluZV9zNjQoaW50NjR4MV90IGxvdywgaW50NjR4MV90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCitmbG9hdDE2eDhfdCB2Y29tYmluZV9mMTYoZmxvYXQxNng0X3QgbG93LCBmbG9hdDE2eDRfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAorZmxvYXQzMng0X3QgdmNvbWJpbmVfZjMyKGZsb2F0MzJ4Ml90IGxvdywgZmxvYXQzMngyX3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKK3VpbnQ4eDE2X3QgdmNvbWJpbmVfdTgodWludDh4OF90IGxvdywgdWludDh4OF90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCit1aW50MTZ4OF90IHZjb21iaW5lX3UxNih1aW50MTZ4NF90IGxvdywgdWludDE2eDRfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAordWludDMyeDRfdCB2Y29tYmluZV91MzIodWludDMyeDJfdCBsb3csIHVpbnQzMngyX3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKK3VpbnQ2NHgyX3QgdmNvbWJpbmVfdTY0KHVpbnQ2NHgxX3QgbG93LCB1aW50NjR4MV90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCitwb2x5OHgxNl90IHZjb21iaW5lX3A4KHBvbHk4eDhfdCBsb3csIHBvbHk4eDhfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAorcG9seTE2eDhfdCB2Y29tYmluZV9wMTYocG9seTE2eDRfdCBsb3csIHBvbHkxNng0X3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKKy8vU3BsaXR0aW5nIHZlY3RvcnMuIFRoZXNlIGludHJpbnNpY3Mgc3BsaXQgYSAxMjggYml0IHZlY3RvciBpbnRvIDIgY29tcG9uZW50IDY0IGJpdCB2ZWN0b3JzCitpbnQ4eDhfdCB2Z2V0X2hpZ2hfczgoaW50OHgxNl90IGEpOyAvLyBWTU9WIGQwLGQwCitpbnQxNng0X3QgdmdldF9oaWdoX3MxNihpbnQxNng4X3QgYSk7IC8vIFZNT1YgZDAsZDAKK2ludDMyeDJfdCB2Z2V0X2hpZ2hfczMyKGludDMyeDRfdCBhKTsgLy8gVk1PViBkMCxkMAoraW50NjR4MV90IHZnZXRfaGlnaF9zNjQoaW50NjR4Ml90IGEpOyAvLyBWTU9WIGQwLGQwCitmbG9hdDE2eDRfdCB2Z2V0X2hpZ2hfZjE2KGZsb2F0MTZ4OF90IGEpOyAvLyBWTU9WIGQwLGQwCitmbG9hdDMyeDJfdCB2Z2V0X2hpZ2hfZjMyKGZsb2F0MzJ4NF90IGEpOyAvLyBWTU9WIGQwLGQwCit1aW50OHg4X3QgdmdldF9oaWdoX3U4KHVpbnQ4eDE2X3QgYSk7IC8vIFZNT1YgZDAsZDAKK3VpbnQxNng0X3QgdmdldF9oaWdoX3UxNih1aW50MTZ4OF90IGEpOyAvLyBWTU9WIGQwLGQwCit1aW50MzJ4Ml90IHZnZXRfaGlnaF91MzIodWludDMyeDRfdCBhKTsgLy8gVk1PViBkMCxkMAordWludDY0eDFfdCB2Z2V0X2hpZ2hfdTY0KHVpbnQ2NHgyX3QgYSk7IC8vIFZNT1YgZDAsZDAKK3BvbHk4eDhfdCB2Z2V0X2hpZ2hfcDgocG9seTh4MTZfdCBhKTsgLy8gVk1PViBkMCxkMAorcG9seTE2eDRfdCB2Z2V0X2hpZ2hfcDE2KHBvbHkxNng4X3QgYSk7IC8vIFZNT1YgZDAsZDAKK2ludDh4OF90IHZnZXRfbG93X3M4KGludDh4MTZfdCBhKTsgLy8gVk1PViBkMCxkMAoraW50MTZ4NF90IHZnZXRfbG93X3MxNihpbnQxNng4X3QgYSk7IC8vIFZNT1YgZDAsZDAKK2ludDMyeDJfdCB2Z2V0X2xvd19zMzIoaW50MzJ4NF90IGEpOyAvLyBWTU9WIGQwLGQwCitpbnQ2NHgxX3QgdmdldF9sb3dfczY0KGludDY0eDJfdCBhKTsgLy8gVk1PViBkMCxkMAorZmxvYXQxNng0X3QgdmdldF9sb3dfZjE2KGZsb2F0MTZ4OF90IGEpOyAvLyBWTU9WIGQwLGQwCitmbG9hdDMyeDJfdCB2Z2V0X2xvd19mMzIoZmxvYXQzMng0X3QgYSk7IC8vIFZNT1YgZDAsZDAKK3VpbnQ4eDhfdCB2Z2V0X2xvd191OCh1aW50OHgxNl90IGEpOyAvLyBWTU9WIGQwLGQwCit1aW50MTZ4NF90IHZnZXRfbG93X3UxNih1aW50MTZ4OF90IGEpOyAvLyBWTU9WIGQwLGQwCit1aW50MzJ4Ml90IHZnZXRfbG93X3UzMih1aW50MzJ4NF90IGEpOyAvLyBWTU9WIGQwLGQwCit1aW50NjR4MV90IHZnZXRfbG93X3U2NCh1aW50NjR4Ml90IGEpOyAvLyBWTU9WIGQwLGQwCitwb2x5OHg4X3QgdmdldF9sb3dfcDgocG9seTh4MTZfdCBhKTsgLy8gVk1PViBkMCxkMAorcG9seTE2eDRfdCB2Z2V0X2xvd19wMTYocG9seTE2eDhfdCBhKTsgLy8gVk1PViBkMCxkMAorLy9Db252ZXJ0aW5nIHZlY3RvcnMuIFRoZXNlIGludHJpbnNpY3MgYXJlIHVzZWQgdG8gY29udmVydCB2ZWN0b3JzLgorLy9Db252ZXJ0IGZyb20gZmxvYXQKK2ludDMyeDJfdCB2Y3Z0X3MzMl9mMzIoZmxvYXQzMngyX3QgYSk7IC8vIFZDVlQuUzMyLkYzMiBkMCwgZDAKK3VpbnQzMngyX3QgdmN2dF91MzJfZjMyKGZsb2F0MzJ4Ml90IGEpOyAvLyBWQ1ZULlUzMi5GMzIgZDAsIGQwCitpbnQzMng0X3QgdmN2dHFfczMyX2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVkNWVC5TMzIuRjMyIHEwLCBxMAordWludDMyeDRfdCB2Y3Z0cV91MzJfZjMyKGZsb2F0MzJ4NF90IGEpOyAvLyBWQ1ZULlUzMi5GMzIgcTAsIHEwCitpbnQzMngyX3QgdmN2dF9uX3MzMl9mMzIoZmxvYXQzMngyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVkNWVC5TMzIuRjMyIGQwLCBkMCwgIzMyCit1aW50MzJ4Ml90IHZjdnRfbl91MzJfZjMyKGZsb2F0MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZDVlQuVTMyLkYzMiBkMCwgZDAsICMzMgoraW50MzJ4NF90IHZjdnRxX25fczMyX2YzMihmbG9hdDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWQ1ZULlMzMi5GMzIgcTAsIHEwLCAjMzIKK3VpbnQzMng0X3QgdmN2dHFfbl91MzJfZjMyKGZsb2F0MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZDVlQuVTMyLkYzMiBxMCwgcTAsICMzMgorLy9Db252ZXJ0IHRvIGZsb2F0CitmbG9hdDMyeDJfdCB2Y3Z0X2YzMl9zMzIoaW50MzJ4Ml90IGEpOyAvLyBWQ1ZULkYzMi5TMzIgZDAsIGQwCitmbG9hdDMyeDJfdCB2Y3Z0X2YzMl91MzIodWludDMyeDJfdCBhKTsgLy8gVkNWVC5GMzIuVTMyIGQwLCBkMAorZmxvYXQzMng0X3QgdmN2dHFfZjMyX3MzMihpbnQzMng0X3QgYSk7IC8vIFZDVlQuRjMyLlMzMiBxMCwgcTAKK2Zsb2F0MzJ4NF90IHZjdnRxX2YzMl91MzIodWludDMyeDRfdCBhKTsgLy8gVkNWVC5GMzIuVTMyIHEwLCBxMAorZmxvYXQzMngyX3QgdmN2dF9uX2YzMl9zMzIoaW50MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZDVlQuRjMyLlMzMiBkMCwgZDAsICMzMgorZmxvYXQzMngyX3QgdmN2dF9uX2YzMl91MzIodWludDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWQ1ZULkYzMi5VMzIgZDAsIGQwLCAjMzIKK2Zsb2F0MzJ4NF90IHZjdnRxX25fZjMyX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVkNWVC5GMzIuUzMyIHEwLCBxMCwgIzMyCitmbG9hdDMyeDRfdCB2Y3Z0cV9uX2YzMl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWQ1ZULkYzMi5VMzIgcTAsIHEwLCAjMzIKKy8vQ29udmVydCBiZXR3ZWVuIGZsb2F0cworZmxvYXQxNng0X3QgdmN2dF9mMTZfZjMyKGZsb2F0MzJ4NF90IGEpOyAvLyBWQ1ZULkYxNi5GMzIgZDAsIHEwCitmbG9hdDMyeDRfdCB2Y3Z0X2YzMl9mMTYoZmxvYXQxNng0X3QgYSk7IC8vIFZDVlQuRjMyLkYxNiBxMCwgZDAKKy8vVmVjdG9yIG5hcnJvdyBpbnRlZ2VyCitpbnQ4eDhfdCB2bW92bl9zMTYoaW50MTZ4OF90IGEpOyAvLyBWTU9WTi5JMTYgZDAscTAKK2ludDE2eDRfdCB2bW92bl9zMzIoaW50MzJ4NF90IGEpOyAvLyBWTU9WTi5JMzIgZDAscTAKK2ludDMyeDJfdCB2bW92bl9zNjQoaW50NjR4Ml90IGEpOyAvLyBWTU9WTi5JNjQgZDAscTAKK3VpbnQ4eDhfdCB2bW92bl91MTYodWludDE2eDhfdCBhKTsgLy8gVk1PVk4uSTE2IGQwLHEwCit1aW50MTZ4NF90IHZtb3ZuX3UzMih1aW50MzJ4NF90IGEpOyAvLyBWTU9WTi5JMzIgZDAscTAKK3VpbnQzMngyX3Qgdm1vdm5fdTY0KHVpbnQ2NHgyX3QgYSk7IC8vIFZNT1ZOLkk2NCBkMCxxMAorLy9WZWN0b3IgbG9uZyBtb3ZlCitpbnQxNng4X3Qgdm1vdmxfczgoaW50OHg4X3QgYSk7IC8vIFZNT1ZMLlM4IHEwLGQwCitpbnQzMng0X3Qgdm1vdmxfczE2KGludDE2eDRfdCBhKTsgLy8gVk1PVkwuUzE2IHEwLGQwCitpbnQ2NHgyX3Qgdm1vdmxfczMyKGludDMyeDJfdCBhKTsgLy8gVk1PVkwuUzMyIHEwLGQwCit1aW50MTZ4OF90IHZtb3ZsX3U4KHVpbnQ4eDhfdCBhKTsgLy8gVk1PVkwuVTggcTAsZDAKK3VpbnQzMng0X3Qgdm1vdmxfdTE2KHVpbnQxNng0X3QgYSk7IC8vIFZNT1ZMLlUxNiBxMCxkMAordWludDY0eDJfdCB2bW92bF91MzIodWludDMyeDJfdCBhKTsgLy8gVk1PVkwuVTMyIHEwLGQwCisvL1ZlY3RvciBzYXR1cmF0aW5nIG5hcnJvdyBpbnRlZ2VyCitpbnQ4eDhfdCB2cW1vdm5fczE2KGludDE2eDhfdCBhKTsgLy8gVlFNT1ZOLlMxNiBkMCxxMAoraW50MTZ4NF90IHZxbW92bl9zMzIoaW50MzJ4NF90IGEpOyAvLyBWUU1PVk4uUzMyIGQwLHEwCitpbnQzMngyX3QgdnFtb3ZuX3M2NChpbnQ2NHgyX3QgYSk7IC8vIFZRTU9WTi5TNjQgZDAscTAKK3VpbnQ4eDhfdCB2cW1vdm5fdTE2KHVpbnQxNng4X3QgYSk7IC8vIFZRTU9WTi5VMTYgZDAscTAKK3VpbnQxNng0X3QgdnFtb3ZuX3UzMih1aW50MzJ4NF90IGEpOyAvLyBWUU1PVk4uVTMyIGQwLHEwCit1aW50MzJ4Ml90IHZxbW92bl91NjQodWludDY0eDJfdCBhKTsgLy8gVlFNT1ZOLlU2NCBkMCxxMAorLy9WZWN0b3Igc2F0dXJhdGluZyBuYXJyb3cgaW50ZWdlciBzaWduZWQtPnVuc2lnbmVkCit1aW50OHg4X3QgdnFtb3Z1bl9zMTYoaW50MTZ4OF90IGEpOyAvLyBWUU1PVlVOLlMxNiBkMCxxMAordWludDE2eDRfdCB2cW1vdnVuX3MzMihpbnQzMng0X3QgYSk7IC8vIFZRTU9WVU4uUzMyIGQwLHEwCit1aW50MzJ4Ml90IHZxbW92dW5fczY0KGludDY0eDJfdCBhKTsgLy8gVlFNT1ZVTi5TNjQgZDAscTAKKy8vVGFibGUgbG9vayB1cAordWludDh4OF90IHZ0YmwxX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwfSwgZDAKK2ludDh4OF90IHZ0YmwxX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMH0sIGQwCitwb2x5OHg4X3QgdnRibDFfcDgocG9seTh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDB9LCBkMAordWludDh4OF90IHZ0YmwyX3U4X3B0cih1aW50OHg4eDJfdCAqYSwgdWludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDF9LCBkMAoraW50OHg4X3QgdnRibDJfczhfcHRyKGludDh4OHgyX3QgKmEsIGludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDF9LCBkMAorcG9seTh4OF90IHZ0YmwyX3A4X3B0cihwb2x5OHg4eDJfdCAqYSwgdWludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDF9LCBkMAordWludDh4OF90IHZ0YmwzX3U4X3B0cih1aW50OHg4eDNfdCAqYSwgdWludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDEsIGQyfSwgZDAKK2ludDh4OF90IHZ0YmwzX3M4X3B0cihpbnQ4eDh4M190ICphLCBpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxLCBkMn0sIGQwCitwb2x5OHg4X3QgdnRibDNfcDhfcHRyKHBvbHk4eDh4M190ICphLCB1aW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMSwgZDJ9LCBkMAordWludDh4OF90IHZ0Ymw0X3U4X3B0cih1aW50OHg4eDRfdCAqYSwgdWludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDEsIGQyLCBkM30sIGQwCitpbnQ4eDhfdCB2dGJsNF9zOF9wdHIoaW50OHg4eDRfdCAqYSwgaW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMSwgZDIsIGQzfSwgZDAKK3BvbHk4eDhfdCB2dGJsNF9wOF9wdHIocG9seTh4OHg0X3QgKmEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxLCBkMiwgZDN9LCBkMAorLy9FeHRlbmRlZCB0YWJsZSBsb29rIHVwIGludHJpbnNpY3MKK3VpbnQ4eDhfdCB2dGJ4MV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDB9LCBkMAoraW50OHg4X3QgdnRieDFfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiwgaW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwfSwgZDAKK3BvbHk4eDhfdCB2dGJ4MV9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDB9LCBkMAordWludDh4OF90IHZ0YngyX3U4X3B0cih1aW50OHg4X3QgYSwgdWludDh4OHgyX3QgKmIsIHVpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDAsIGQxfSwgZDAKK2ludDh4OF90IHZ0YngyX3M4X3B0cihpbnQ4eDhfdCBhLCBpbnQ4eDh4Ml90ICpiLCBpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDAsIGQxfSwgZDAKK3BvbHk4eDhfdCB2dGJ4Ml9wOF9wdHIocG9seTh4OF90IGEsIHBvbHk4eDh4Ml90ICpiLCB1aW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwLCBkMX0sIGQwCit1aW50OHg4X3QgdnRieDNfdThfcHRyKHVpbnQ4eDhfdCBhLCB1aW50OHg4eDNfdCAqYiwgdWludDh4OF90IGMpOyAvLyBWVEJYLjggZDAsIHtkMCwgZDEsIGQyfSwgZDAKK2ludDh4OF90IHZ0YngzX3M4X3B0cihpbnQ4eDhfdCBhLCBpbnQ4eDh4M190ICpiLCBpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDAsIGQxLCBkMn0sIGQwCitwb2x5OHg4X3QgdnRieDNfcDhfcHRyKHBvbHk4eDhfdCBhLCBwb2x5OHg4eDNfdCAqYiwgdWludDh4OF90IGMpOyAvLyBWVEJYLjggZDAsIHtkMCwgZDEsIGQyfSwgZDAKK3VpbnQ4eDhfdCB2dGJ4NF91OF9wdHIodWludDh4OF90IGEsIHVpbnQ4eDh4NF90ICpiLCB1aW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwLCBkMSwgZDIsIGQzfSwgZDAKK2ludDh4OF90IHZ0Yng0X3M4X3B0cihpbnQ4eDhfdCBhLCBpbnQ4eDh4NF90ICpiLCBpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDAsIGQxLCBkMiwgZDN9LCBkMAorcG9seTh4OF90IHZ0Yng0X3A4X3B0cihwb2x5OHg4X3QgYSwgcG9seTh4OHg0X3QgKmIsIHVpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDAsIGQxLCBkMiwgZDN9LCBkMAorLy9PcGVyYXRpb25zIHdpdGggYSBzY2FsYXIgdmFsdWUKKy8vVmVjdG9yIG11bHRpcGx5IGFjY3VtdWxhdGUgd2l0aCBzY2FsYXIKK2ludDE2eDRfdCB2bWxhX2xhbmVfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVk1MQS5JMTYgZDAsIGQwLGQwWzBdCitpbnQzMngyX3Qgdm1sYV9sYW5lX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEEuSTMyIGQwLCBkMCxkMFswXQordWludDE2eDRfdCB2bWxhX2xhbmVfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVk1MQS5JMTYgZDAsIGQwLGQwWzBdCit1aW50MzJ4Ml90IHZtbGFfbGFuZV91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxBLkkzMiBkMCwgZDAsZDBbMF0KK2Zsb2F0MzJ4Ml90IHZtbGFfbGFuZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxBLkYzMiBkMCxkMCwgZDBbMF0KK2ludDE2eDhfdCB2bWxhcV9sYW5lX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTEEuSTE2IHEwLCBxMCxkMFswXQoraW50MzJ4NF90IHZtbGFxX2xhbmVfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MQS5JMzIgcTAsIHEwLGQwWzBdCit1aW50MTZ4OF90IHZtbGFxX2xhbmVfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVk1MQS5JMTYgcTAscTAsIGQwWzBdCit1aW50MzJ4NF90IHZtbGFxX2xhbmVfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCB1aW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MQS5JMzIgcTAscTAsIGQwWzBdCitmbG9hdDMyeDRfdCB2bWxhcV9sYW5lX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEEuRjMyIHEwLHEwLCBkMFswXQorLy9WZWN0b3Igd2lkZW5pbmcgbXVsdGlwbHkgYWNjdW11bGF0ZSB3aXRoIHNjYWxhcgoraW50MzJ4NF90IHZtbGFsX2xhbmVfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy9WTUxBTC5TMTYgcTAsIGQwLGQwWzBdCitpbnQ2NHgyX3Qgdm1sYWxfbGFuZV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvL1ZNTEFMLlMzMiBxMCwgZDAsZDBbMF0KK3VpbnQzMng0X3Qgdm1sYWxfbGFuZV91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxBTC5VMTYgcTAsZDAsIGQwWzBdCit1aW50NjR4Ml90IHZtbGFsX2xhbmVfdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MQUwuVTMyIHEwLGQwLCBkMFswXQorLy9WZWN0b3Igd2lkZW5pbmcgc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBhY2N1bXVsYXRlIHdpdGggc2NhbGFyCitpbnQzMng0X3QgdnFkbWxhbF9sYW5lX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZRRE1MQUwuUzE2IHEwLGQwLCBkMFswXQoraW50NjR4Ml90IHZxZG1sYWxfbGFuZV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWUURNTEFMLlMzMiBxMCxkMCwgZDBbMF0KKy8vVmVjdG9yIG11bHRpcGx5IHN1YnRyYWN0IHdpdGggc2NhbGFyCitpbnQxNng0X3Qgdm1sc19sYW5lX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTFMuSTE2IGQwLCBkMCxkMFswXQoraW50MzJ4Ml90IHZtbHNfbGFuZV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxTLkkzMiBkMCwgZDAsZDBbMF0KK3VpbnQxNng0X3Qgdm1sc19sYW5lX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTFMuSTE2IGQwLCBkMCxkMFswXQordWludDMyeDJfdCB2bWxzX2xhbmVfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MUy5JMzIgZDAsIGQwLGQwWzBdCitmbG9hdDMyeDJfdCB2bWxzX2xhbmVfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MUy5GMzIgZDAsZDAsIGQwWzBdCitpbnQxNng4X3Qgdm1sc3FfbGFuZV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxTLkkxNiBxMCwgcTAsZDBbMF0KK2ludDMyeDRfdCB2bWxzcV9sYW5lX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTFMuSTMyIHEwLCBxMCxkMFswXQordWludDE2eDhfdCB2bWxzcV9sYW5lX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTFMuSTE2IHEwLHEwLCBkMFswXQordWludDMyeDRfdCB2bWxzcV9sYW5lX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTFMuSTMyIHEwLHEwLCBkMFswXQorZmxvYXQzMng0X3Qgdm1sc3FfbGFuZV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxTLkYzMiBxMCxxMCwgZDBbMF0KKy8vVmVjdG9yIHdpZGVuaW5nIG11bHRpcGx5IHN1YnRyYWN0IHdpdGggc2NhbGFyCitpbnQzMng0X3Qgdm1sc2xfbGFuZV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxTTC5TMTYgcTAsIGQwLGQwWzBdCitpbnQ2NHgyX3Qgdm1sc2xfbGFuZV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxTTC5TMzIgcTAsIGQwLGQwWzBdCit1aW50MzJ4NF90IHZtbHNsX2xhbmVfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVk1MU0wuVTE2IHEwLGQwLCBkMFswXQordWludDY0eDJfdCB2bWxzbF9sYW5lX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTFNMLlUzMiBxMCxkMCwgZDBbMF0KKy8vVmVjdG9yIHdpZGVuaW5nIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgc3VidHJhY3Qgd2l0aCBzY2FsYXIKK2ludDMyeDRfdCB2cWRtbHNsX2xhbmVfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVlFETUxTTC5TMTYgcTAsZDAsIGQwWzBdCitpbnQ2NHgyX3QgdnFkbWxzbF9sYW5lX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZRRE1MU0wuUzMyIHEwLGQwLCBkMFswXQorLy9WZWN0b3IgbXVsdGlwbHkgYnkgc2NhbGFyCitpbnQxNng0X3Qgdm11bF9uX3MxNihpbnQxNng0X3QgYSwgaW50MTZfdCBiKTsgLy8gVk1VTC5JMTYgZDAsZDAsZDBbMF0KK2ludDMyeDJfdCB2bXVsX25fczMyKGludDMyeDJfdCBhLCBpbnQzMl90IGIpOyAvLyBWTVVMLkkzMiBkMCxkMCxkMFswXQorZmxvYXQzMngyX3Qgdm11bF9uX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyX3QgYik7IC8vIFZNVUwuRjMyIGQwLGQwLGQwWzBdCit1aW50MTZ4NF90IHZtdWxfbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZfdCBiKTsgLy8gVk1VTC5JMTYgZDAsZDAsZDBbMF0KK3VpbnQzMngyX3Qgdm11bF9uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMl90IGIpOyAvLyBWTVVMLkkzMiBkMCxkMCxkMFswXQoraW50MTZ4OF90IHZtdWxxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNl90IGIpOyAvLyBWTVVMLkkxNiBxMCxxMCxkMFswXQoraW50MzJ4NF90IHZtdWxxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMl90IGIpOyAvLyBWTVVMLkkzMiBxMCxxMCxkMFswXQorZmxvYXQzMng0X3Qgdm11bHFfbl9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMl90IGIpOyAvLyBWTVVMLkYzMiBxMCxxMCxkMFswXQordWludDE2eDhfdCB2bXVscV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNl90IGIpOyAvLyBWTVVMLkkxNiBxMCxxMCxkMFswXQordWludDMyeDRfdCB2bXVscV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMl90IGIpOyAvLyBWTVVMLkkzMiBxMCxxMCxkMFswXQorLy9WZWN0b3IgbG9uZyBtdWx0aXBseSB3aXRoIHNjYWxhcgoraW50MzJ4NF90IHZtdWxsX25fczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNl90IHZhbDIpOyAvLyBWTVVMTC5TMTYgcTAsZDAsZDBbMF0KK2ludDY0eDJfdCB2bXVsbF9uX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJfdCB2YWwyKTsgLy8gVk1VTEwuUzMyIHEwLGQwLGQwWzBdCit1aW50MzJ4NF90IHZtdWxsX25fdTE2KHVpbnQxNng0X3QgdmVjMSwgdWludDE2X3QgdmFsMik7IC8vIFZNVUxMLlUxNiBxMCxkMCxkMFswXQordWludDY0eDJfdCB2bXVsbF9uX3UzMih1aW50MzJ4Ml90IHZlYzEsIHVpbnQzMl90IHZhbDIpOyAvLyBWTVVMTC5VMzIgcTAsZDAsZDBbMF0KKy8vVmVjdG9yIGxvbmcgbXVsdGlwbHkgYnkgc2NhbGFyCitpbnQzMng0X3Qgdm11bGxfbGFuZV9zMTYoaW50MTZ4NF90IHZlYzEsIGludDE2eDRfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMykgaW50IHZhbDMpOyAvLyBWTVVMTC5TMTYgcTAsZDAsZDBbMF0KK2ludDY0eDJfdCB2bXVsbF9sYW5lX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyk7IC8vIFZNVUxMLlMzMiBxMCxkMCxkMFswXQordWludDMyeDRfdCB2bXVsbF9sYW5lX3UxNih1aW50MTZ4NF90IHZlYzEsIHVpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKTsgLy8gVk1VTEwuVTE2IHEwLGQwLGQwWzBdCit1aW50NjR4Ml90IHZtdWxsX2xhbmVfdTMyKHVpbnQzMngyX3QgdmVjMSwgdWludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpOyAvLyBWTVVMTC5VMzIgcTAsZDAsZDBbMF0KKy8vVmVjdG9yIHNhdHVyYXRpbmcgZG91YmxpbmcgbG9uZyBtdWx0aXBseSB3aXRoIHNjYWxhcgoraW50MzJ4NF90IHZxZG11bGxfbl9zMTYoaW50MTZ4NF90IHZlYzEsIGludDE2X3QgdmFsMik7IC8vIFZRRE1VTEwuUzE2IHEwLGQwLGQwWzBdCitpbnQ2NHgyX3QgdnFkbXVsbF9uX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJfdCB2YWwyKTsgLy8gVlFETVVMTC5TMzIgcTAsZDAsZDBbMF0KKy8vVmVjdG9yIHNhdHVyYXRpbmcgZG91YmxpbmcgbG9uZyBtdWx0aXBseSBieSBzY2FsYXIKK2ludDMyeDRfdCB2cWRtdWxsX2xhbmVfczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKTsgLy8gVlFETVVMTC5TMTYgcTAsZDAsZDBbMF0KK2ludDY0eDJfdCB2cWRtdWxsX2xhbmVfczMyKGludDMyeDJfdCB2ZWMxLCBpbnQzMngyX3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDEpIGludCB2YWwzKTsgLy8gVlFETVVMTC5TMzIgcTAsZDAsZDBbMF0KKy8vVmVjdG9yIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgaGlnaCB3aXRoIHNjYWxhcgoraW50MTZ4NF90IHZxZG11bGhfbl9zMTYoaW50MTZ4NF90IHZlYzEsIGludDE2X3QgdmFsMik7IC8vIFZRRE1VTEguUzE2IGQwLGQwLGQwWzBdCitpbnQzMngyX3QgdnFkbXVsaF9uX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJfdCB2YWwyKTsgLy8gVlFETVVMSC5TMzIgZDAsZDAsZDBbMF0KK2ludDE2eDhfdCB2cWRtdWxocV9uX3MxNihpbnQxNng4X3QgdmVjMSwgaW50MTZfdCB2YWwyKTsgLy8gVlFETVVMSC5TMTYgcTAscTAsZDBbMF0KK2ludDMyeDRfdCB2cWRtdWxocV9uX3MzMihpbnQzMng0X3QgdmVjMSwgaW50MzJfdCB2YWwyKTsgLy8gVlFETVVMSC5TMzIgcTAscTAsZDBbMF0KKy8vVmVjdG9yIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgaGlnaCBieSBzY2FsYXIKK2ludDE2eDRfdCB2cWRtdWxoX2xhbmVfczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKTsgLy8gVlFETVVMSC5TMTYgZDAsZDAsZDBbMF0KK2ludDMyeDJfdCB2cWRtdWxoX2xhbmVfczMyKGludDMyeDJfdCB2ZWMxLCBpbnQzMngyX3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDEpIGludCB2YWwzKTsgLy8gVlFETVVMSC5TMzIgZDAsZDAsZDBbMF0KK2ludDE2eDhfdCB2cWRtdWxocV9sYW5lX3MxNihpbnQxNng4X3QgdmVjMSwgaW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMyk7IC8vIFZRRE1VTEguUzE2IHEwLHEwLGQwWzBdCitpbnQzMng0X3QgdnFkbXVsaHFfbGFuZV9zMzIoaW50MzJ4NF90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpOyAvLyBWUURNVUxILlMzMiBxMCxxMCxkMFswXQorLy9WZWN0b3Igc2F0dXJhdGluZyByb3VuZGluZyBkb3VibGluZyBtdWx0aXBseSBoaWdoIHdpdGggc2NhbGFyCitpbnQxNng0X3QgdnFyZG11bGhfbl9zMTYoaW50MTZ4NF90IHZlYzEsIGludDE2X3QgdmFsMik7IC8vIFZRUkRNVUxILlMxNiBkMCxkMCxkMFswXQoraW50MzJ4Ml90IHZxcmRtdWxoX25fczMyKGludDMyeDJfdCB2ZWMxLCBpbnQzMl90IHZhbDIpOyAvLyBWUVJETVVMSC5TMzIgZDAsZDAsZDBbMF0KK2ludDE2eDhfdCB2cXJkbXVsaHFfbl9zMTYoaW50MTZ4OF90IHZlYzEsIGludDE2X3QgdmFsMik7IC8vIFZRUkRNVUxILlMxNiBxMCxxMCxkMFswXQoraW50MzJ4NF90IHZxcmRtdWxocV9uX3MzMihpbnQzMng0X3QgdmVjMSwgaW50MzJfdCB2YWwyKTsgLy8gVlFSRE1VTEguUzMyIHEwLHEwLGQwWzBdCisvL1ZlY3RvciByb3VuZGluZyBzYXR1cmF0aW5nIGRvdWJsaW5nIG11bHRpcGx5IGhpZ2ggYnkgc2NhbGFyCitpbnQxNng0X3QgdnFyZG11bGhfbGFuZV9zMTYoaW50MTZ4NF90IHZlYzEsIGludDE2eDRfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMykgaW50IHZhbDMpOyAvLyBWUVJETVVMSC5TMTYgZDAsZDAsZDBbMF0KK2ludDMyeDJfdCB2cXJkbXVsaF9sYW5lX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyk7IC8vIFZRUkRNVUxILlMzMiBkMCxkMCxkMFswXQoraW50MTZ4OF90IHZxcmRtdWxocV9sYW5lX3MxNihpbnQxNng4X3QgdmVjMSwgaW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMyk7IC8vIFZRUkRNVUxILlMxNiBxMCxxMCxkMFswXQoraW50MzJ4NF90IHZxcmRtdWxocV9sYW5lX3MzMihpbnQzMng0X3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyk7IC8vIFZRUkRNVUxILlMzMiBxMCxxMCxkMFswXQorLy9WZWN0b3IgbXVsdGlwbHkgYWNjdW11bGF0ZSB3aXRoIHNjYWxhcgoraW50MTZ4NF90IHZtbGFfbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpOyAvLyBWTUxBLkkxNiBkMCwgZDAsIGQwWzBdCitpbnQzMngyX3Qgdm1sYV9uX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyX3QgYyk7IC8vIFZNTEEuSTMyIGQwLCBkMCwgZDBbMF0KK3VpbnQxNng0X3Qgdm1sYV9uX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2X3QgYyk7IC8vIFZNTEEuSTE2IGQwLCBkMCwgZDBbMF0KK3VpbnQzMngyX3Qgdm1sYV9uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyX3QgYyk7IC8vIFZNTEEuSTMyIGQwLCBkMCwgZDBbMF0KK2Zsb2F0MzJ4Ml90IHZtbGFfbl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMl90IGMpOyAvLyBWTUxBLkYzMiBkMCwgZDAsIGQwWzBdCitpbnQxNng4X3Qgdm1sYXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNl90IGMpOyAvLyBWTUxBLkkxNiBxMCwgcTAsIGQwWzBdCitpbnQzMng0X3Qgdm1sYXFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMl90IGMpOyAvLyBWTUxBLkkzMiBxMCwgcTAsIGQwWzBdCit1aW50MTZ4OF90IHZtbGFxX25fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZfdCBjKTsgLy8gVk1MQS5JMTYgcTAsIHEwLCBkMFswXQordWludDMyeDRfdCB2bWxhcV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyX3QgYyk7IC8vIFZNTEEuSTMyIHEwLCBxMCwgZDBbMF0KK2Zsb2F0MzJ4NF90IHZtbGFxX25fZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJfdCBjKTsgLy8gVk1MQS5GMzIgcTAsIHEwLCBkMFswXQorLy9WZWN0b3Igd2lkZW5pbmcgbXVsdGlwbHkgYWNjdW11bGF0ZSB3aXRoIHNjYWxhcgoraW50MzJ4NF90IHZtbGFsX25fczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZfdCBjKTsgLy8gVk1MQUwuUzE2IHEwLCBkMCwgZDBbMF0KK2ludDY0eDJfdCB2bWxhbF9uX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyX3QgYyk7IC8vIFZNTEFMLlMzMiBxMCwgZDAsIGQwWzBdCit1aW50MzJ4NF90IHZtbGFsX25fdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZfdCBjKTsgLy8gVk1MQUwuVTE2IHEwLCBkMCwgZDBbMF0KK3VpbnQ2NHgyX3Qgdm1sYWxfbl91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMl90IGMpOyAvLyBWTUxBTC5VMzIgcTAsIGQwLCBkMFswXQorLy9WZWN0b3Igd2lkZW5pbmcgc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBhY2N1bXVsYXRlIHdpdGggc2NhbGFyCitpbnQzMng0X3QgdnFkbWxhbF9uX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYyk7IC8vIFZRRE1MQUwuUzE2IHEwLCBkMCwgZDBbMF0KK2ludDY0eDJfdCB2cWRtbGFsX25fczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKTsgLy8gVlFETUxBTC5TMzIgcTAsIGQwLCBkMFswXQorLy9WZWN0b3IgbXVsdGlwbHkgc3VidHJhY3Qgd2l0aCBzY2FsYXIKK2ludDE2eDRfdCB2bWxzX25fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZfdCBjKTsgLy8gVk1MUy5JMTYgZDAsIGQwLCBkMFswXQoraW50MzJ4Ml90IHZtbHNfbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpOyAvLyBWTUxTLkkzMiBkMCwgZDAsIGQwWzBdCit1aW50MTZ4NF90IHZtbHNfbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNl90IGMpOyAvLyBWTUxTLkkxNiBkMCwgZDAsIGQwWzBdCit1aW50MzJ4Ml90IHZtbHNfbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMl90IGMpOyAvLyBWTUxTLkkzMiBkMCwgZDAsIGQwWzBdCitmbG9hdDMyeDJfdCB2bWxzX25fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJfdCBjKTsgLy8gVk1MUy5GMzIgZDAsIGQwLCBkMFswXQoraW50MTZ4OF90IHZtbHNxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZfdCBjKTsgLy8gVk1MUy5JMTYgcTAsIHEwLCBkMFswXQoraW50MzJ4NF90IHZtbHNxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJfdCBjKTsgLy8gVk1MUy5JMzIgcTAsIHEwLCBkMFswXQordWludDE2eDhfdCB2bWxzcV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2X3QgYyk7IC8vIFZNTFMuSTE2IHEwLCBxMCwgZDBbMF0KK3VpbnQzMng0X3Qgdm1sc3Ffbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMl90IGMpOyAvLyBWTUxTLkkzMiBxMCwgcTAsIGQwWzBdCitmbG9hdDMyeDRfdCB2bWxzcV9uX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyX3QgYyk7IC8vIFZNTFMuRjMyIHEwLCBxMCwgZDBbMF0KKy8vVmVjdG9yIHdpZGVuaW5nIG11bHRpcGx5IHN1YnRyYWN0IHdpdGggc2NhbGFyCitpbnQzMng0X3Qgdm1sc2xfbl9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpOyAvLyBWTUxTTC5TMTYgcTAsIGQwLCBkMFswXQoraW50NjR4Ml90IHZtbHNsX25fczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKTsgLy8gVk1MU0wuUzMyIHEwLCBkMCwgZDBbMF0KK3VpbnQzMng0X3Qgdm1sc2xfbl91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNl90IGMpOyAvLyBWTUxTTC5VMTYgcTAsIGQwLCBkMFswXQordWludDY0eDJfdCB2bWxzbF9uX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyX3QgYyk7IC8vIFZNTFNMLlUzMiBxMCwgZDAsIGQwWzBdCisvL1ZlY3RvciB3aWRlbmluZyBzYXR1cmF0aW5nIGRvdWJsaW5nIG11bHRpcGx5IHN1YnRyYWN0IHdpdGggc2NhbGFyCitpbnQzMng0X3QgdnFkbWxzbF9uX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYyk7IC8vIFZRRE1MU0wuUzE2IHEwLCBkMCwgZDBbMF0KK2ludDY0eDJfdCB2cWRtbHNsX25fczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKTsgLy8gVlFETUxTTC5TMzIgcTAsIGQwLCBkMFswXQorLy9WZWN0b3IgZXh0cmFjdAoraW50OHg4X3QgdmV4dF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZFWFQuOCBkMCxkMCxkMCwjMAordWludDh4OF90IHZleHRfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZFWFQuOCBkMCxkMCxkMCwjMAorcG9seTh4OF90IHZleHRfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZFWFQuOCBkMCxkMCxkMCwjMAoraW50MTZ4NF90IHZleHRfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpOyAvLyBWRVhULjE2IGQwLGQwLGQwLCMwCit1aW50MTZ4NF90IHZleHRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgYyk7IC8vIFZFWFQuMTYgZDAsZDAsZDAsIzAKK3BvbHkxNng0X3QgdmV4dF9wMTYocG9seTE2eDRfdCBhLCBwb2x5MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKTsgLy8gVkVYVC4xNiBkMCxkMCxkMCwjMAoraW50MzJ4Ml90IHZleHRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOyAvLyBWRVhULjMyIGQwLGQwLGQwLCMwCit1aW50MzJ4Ml90IHZleHRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYyk7IC8vIFZFWFQuMzIgZDAsZDAsZDAsIzAKK2ludDY0eDFfdCB2ZXh0X3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgwLDApIGludCBjKTsgLy8gVkVYVC42NCBkMCxkMCxkMCwjMAordWludDY0eDFfdCB2ZXh0X3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDAsMCkgaW50IGMpOyAvLyBWRVhULjY0IGQwLGQwLGQwLCMwCitmbG9hdDMyeDJfdCB2ZXh0X2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYyk7IC8vIFZFWFQuMzIgZDAsZDAsZDAsIzAKK2ludDh4MTZfdCB2ZXh0cV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYyk7IC8vIFZFWFQuOCBxMCxxMCxxMCwjMAordWludDh4MTZfdCB2ZXh0cV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDAsMTUpIGludCBjKTsgLy8gVkVYVC44IHEwLHEwLHEwLCMwCitwb2x5OHgxNl90IHZleHRxX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGMpOyAvLyBWRVhULjggcTAscTAscTAsIzAKK2ludDE2eDhfdCB2ZXh0cV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZFWFQuMTYgcTAscTAscTAsIzAKK3VpbnQxNng4X3QgdmV4dHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZFWFQuMTYgcTAscTAscTAsIzAKK3BvbHkxNng4X3QgdmV4dHFfcDE2KHBvbHkxNng4X3QgYSwgcG9seTE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZFWFQuMTYgcTAscTAscTAsIzAKK2ludDMyeDRfdCB2ZXh0cV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgYyk7IC8vIFZFWFQuMzIgcTAscTAscTAsIzAKK3VpbnQzMng0X3QgdmV4dHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgYyk7IC8vIFZFWFQuMzIgcTAscTAscTAsIzAKK2ludDY0eDJfdCB2ZXh0cV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYyk7IC8vIFZFWFQuNjQgcTAscTAscTAsIzAKK3VpbnQ2NHgyX3QgdmV4dHFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYyk7IC8vIFZFWFQuNjQgcTAscTAscTAsIzAKK2Zsb2F0MzJ4NF90IHZleHRxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBmbG9hdCBjKTsgLy8gVkVYVC4zMiBxMCxxMCxxMCwjMAorLy9SZXZlcnNlIHZlY3RvciBlbGVtZW50cyAoc3dhcCBlbmRpYW5uZXNzKS4gVlJFVm4ubSByZXZlcnNlcyB0aGUgb3JkZXIgb2YgdGhlIG0tYml0IGxhbmVzIHdpdGhpbiBhIHNldCB0aGF0IGlzIG4gYml0cyB3aWRlLgoraW50OHg4X3QgdnJldjY0X3M4KGludDh4OF90IHZlYyk7IC8vIFZSRVY2NC44IGQwLGQwCitpbnQxNng0X3QgdnJldjY0X3MxNihpbnQxNng0X3QgdmVjKTsgLy8gVlJFVjY0LjE2IGQwLGQwCitpbnQzMngyX3QgdnJldjY0X3MzMihpbnQzMngyX3QgdmVjKTsgLy8gVlJFVjY0LjMyIGQwLGQwCit1aW50OHg4X3QgdnJldjY0X3U4KHVpbnQ4eDhfdCB2ZWMpOyAvLyBWUkVWNjQuOCBkMCxkMAordWludDE2eDRfdCB2cmV2NjRfdTE2KHVpbnQxNng0X3QgdmVjKTsgLy8gVlJFVjY0LjE2IGQwLGQwCit1aW50MzJ4Ml90IHZyZXY2NF91MzIodWludDMyeDJfdCB2ZWMpOyAvLyBWUkVWNjQuMzIgZDAsZDAKK3BvbHk4eDhfdCB2cmV2NjRfcDgocG9seTh4OF90IHZlYyk7IC8vIFZSRVY2NC44IGQwLGQwCitwb2x5MTZ4NF90IHZyZXY2NF9wMTYocG9seTE2eDRfdCB2ZWMpOyAvLyBWUkVWNjQuMTYgZDAsZDAKK2Zsb2F0MzJ4Ml90IHZyZXY2NF9mMzIoZmxvYXQzMngyX3QgdmVjKTsgLy8gVlJFVjY0LjMyIGQwLGQwCitpbnQ4eDE2X3QgdnJldjY0cV9zOChpbnQ4eDE2X3QgdmVjKTsgLy8gVlJFVjY0LjggcTAscTAKK2ludDE2eDhfdCB2cmV2NjRxX3MxNihpbnQxNng4X3QgdmVjKTsgLy8gVlJFVjY0LjE2IHEwLHEwCitpbnQzMng0X3QgdnJldjY0cV9zMzIoaW50MzJ4NF90IHZlYyk7IC8vIFZSRVY2NC4zMiBxMCxxMAordWludDh4MTZfdCB2cmV2NjRxX3U4KHVpbnQ4eDE2X3QgdmVjKTsgLy8gVlJFVjY0LjggcTAscTAKK3VpbnQxNng4X3QgdnJldjY0cV91MTYodWludDE2eDhfdCB2ZWMpOyAvLyBWUkVWNjQuMTYgcTAscTAKK3VpbnQzMng0X3QgdnJldjY0cV91MzIodWludDMyeDRfdCB2ZWMpOyAvLyBWUkVWNjQuMzIgcTAscTAKK3BvbHk4eDE2X3QgdnJldjY0cV9wOChwb2x5OHgxNl90IHZlYyk7IC8vIFZSRVY2NC44IHEwLHEwCitwb2x5MTZ4OF90IHZyZXY2NHFfcDE2KHBvbHkxNng4X3QgdmVjKTsgLy8gVlJFVjY0LjE2IHEwLHEwCitmbG9hdDMyeDRfdCB2cmV2NjRxX2YzMihmbG9hdDMyeDRfdCB2ZWMpOyAvLyBWUkVWNjQuMzIgcTAscTAKK2ludDh4OF90IHZyZXYzMl9zOChpbnQ4eDhfdCB2ZWMpOyAvLyBWUkVWMzIuOCBkMCxkMAoraW50MTZ4NF90IHZyZXYzMl9zMTYoaW50MTZ4NF90IHZlYyk7IC8vIFZSRVYzMi4xNiBkMCxkMAordWludDh4OF90IHZyZXYzMl91OCh1aW50OHg4X3QgdmVjKTsgLy8gVlJFVjMyLjggZDAsZDAKK3VpbnQxNng0X3QgdnJldjMyX3UxNih1aW50MTZ4NF90IHZlYyk7IC8vIFZSRVYzMi4xNiBkMCxkMAorcG9seTh4OF90IHZyZXYzMl9wOChwb2x5OHg4X3QgdmVjKTsgLy8gVlJFVjMyLjggZDAsZDAKK3BvbHkxNng0X3QgdnJldjMyX3AxNihwb2x5MTZ4NF90IHZlYyk7IC8vIFZSRVYzMi4xNiBkMCxkMAoraW50OHgxNl90IHZyZXYzMnFfczgoaW50OHgxNl90IHZlYyk7IC8vIFZSRVYzMi44IHEwLHEwCitpbnQxNng4X3QgdnJldjMycV9zMTYoaW50MTZ4OF90IHZlYyk7IC8vIFZSRVYzMi4xNiBxMCxxMAordWludDh4MTZfdCB2cmV2MzJxX3U4KHVpbnQ4eDE2X3QgdmVjKTsgLy8gVlJFVjMyLjggcTAscTAKK3VpbnQxNng4X3QgdnJldjMycV91MTYodWludDE2eDhfdCB2ZWMpOyAvLyBWUkVWMzIuMTYgcTAscTAKK3BvbHk4eDE2X3QgdnJldjMycV9wOChwb2x5OHgxNl90IHZlYyk7IC8vIFZSRVYzMi44IHEwLHEwCitwb2x5MTZ4OF90IHZyZXYzMnFfcDE2KHBvbHkxNng4X3QgdmVjKTsgLy8gVlJFVjMyLjE2IHEwLHEwCitpbnQ4eDhfdCB2cmV2MTZfczgoaW50OHg4X3QgdmVjKTsgLy8gVlJFVjE2LjggZDAsZDAKK3VpbnQ4eDhfdCB2cmV2MTZfdTgodWludDh4OF90IHZlYyk7IC8vIFZSRVYxNi44IGQwLGQwCitwb2x5OHg4X3QgdnJldjE2X3A4KHBvbHk4eDhfdCB2ZWMpOyAvLyBWUkVWMTYuOCBkMCxkMAoraW50OHgxNl90IHZyZXYxNnFfczgoaW50OHgxNl90IHZlYyk7IC8vIFZSRVYxNi44IHEwLHEwCit1aW50OHgxNl90IHZyZXYxNnFfdTgodWludDh4MTZfdCB2ZWMpOyAvLyBWUkVWMTYuOCBxMCxxMAorcG9seTh4MTZfdCB2cmV2MTZxX3A4KHBvbHk4eDE2X3QgdmVjKTsgLy8gVlJFVjE2LjggcTAscTAKKy8vT3RoZXIgc2luZ2xlIG9wZXJhbmQgYXJpdGhtZXRpYworLy9BYnNvbHV0ZTogVmRbaV0gPSB8VmFbaV18CitpbnQ4eDhfdCB2YWJzX3M4KGludDh4OF90IGEpOyAvLyBWQUJTLlM4IGQwLGQwCitpbnQxNng0X3QgdmFic19zMTYoaW50MTZ4NF90IGEpOyAvLyBWQUJTLlMxNiBkMCxkMAoraW50MzJ4Ml90IHZhYnNfczMyKGludDMyeDJfdCBhKTsgLy8gVkFCUy5TMzIgZDAsZDAKK2Zsb2F0MzJ4Ml90IHZhYnNfZjMyKGZsb2F0MzJ4Ml90IGEpOyAvLyBWQUJTLkYzMiBkMCxkMAoraW50OHgxNl90IHZhYnNxX3M4KGludDh4MTZfdCBhKTsgLy8gVkFCUy5TOCBxMCxxMAoraW50MTZ4OF90IHZhYnNxX3MxNihpbnQxNng4X3QgYSk7IC8vIFZBQlMuUzE2IHEwLHEwCitpbnQzMng0X3QgdmFic3FfczMyKGludDMyeDRfdCBhKTsgLy8gVkFCUy5TMzIgcTAscTAKK2Zsb2F0MzJ4NF90IHZhYnNxX2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVkFCUy5GMzIgcTAscTAKKy8vU2F0dXJhdGluZyBhYnNvbHV0ZTogVmRbaV0gPSBzYXQofFZhW2ldfCkKK2ludDh4OF90IHZxYWJzX3M4KGludDh4OF90IGEpOyAvLyBWUUFCUy5TOCBkMCxkMAoraW50MTZ4NF90IHZxYWJzX3MxNihpbnQxNng0X3QgYSk7IC8vIFZRQUJTLlMxNiBkMCxkMAoraW50MzJ4Ml90IHZxYWJzX3MzMihpbnQzMngyX3QgYSk7IC8vIFZRQUJTLlMzMiBkMCxkMAoraW50OHgxNl90IHZxYWJzcV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZRQUJTLlM4IHEwLHEwCitpbnQxNng4X3QgdnFhYnNxX3MxNihpbnQxNng4X3QgYSk7IC8vIFZRQUJTLlMxNiBxMCxxMAoraW50MzJ4NF90IHZxYWJzcV9zMzIoaW50MzJ4NF90IGEpOyAvLyBWUUFCUy5TMzIgcTAscTAKKy8vTmVnYXRlOiBWZFtpXSA9IC0gVmFbaV0KK2ludDh4OF90IHZuZWdfczgoaW50OHg4X3QgYSk7IC8vIFZORS8vZDAsZDAKK2ludDE2eDRfdCB2bmVnX3MxNihpbnQxNng0X3QgYSk7IC8vIFZORS8vZDAsZDAKK2ludDMyeDJfdCB2bmVnX3MzMihpbnQzMngyX3QgYSk7IC8vIFZORS8vZDAsZDAKK2Zsb2F0MzJ4Ml90IHZuZWdfZjMyKGZsb2F0MzJ4Ml90IGEpOyAvLyBWTkUvL2QwLGQwCitpbnQ4eDE2X3Qgdm5lZ3FfczgoaW50OHgxNl90IGEpOyAvLyBWTkUvL3EwLHEwCitpbnQxNng4X3Qgdm5lZ3FfczE2KGludDE2eDhfdCBhKTsgLy8gVk5FLy9xMCxxMAoraW50MzJ4NF90IHZuZWdxX3MzMihpbnQzMng0X3QgYSk7IC8vIFZORS8vcTAscTAKK2Zsb2F0MzJ4NF90IHZuZWdxX2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVk5FLy9xMCxxMAorLy9TYXR1cmF0aW5nIE5lZ2F0ZTogc2F0KFZkW2ldID0gLSBWYVtpXSkKK2ludDh4OF90IHZxbmVnX3M4KGludDh4OF90IGEpOyAvLyBWUU5FLy9kMCxkMAoraW50MTZ4NF90IHZxbmVnX3MxNihpbnQxNng0X3QgYSk7IC8vIFZRTkUvL2QwLGQwCitpbnQzMngyX3QgdnFuZWdfczMyKGludDMyeDJfdCBhKTsgLy8gVlFORS8vZDAsZDAKK2ludDh4MTZfdCB2cW5lZ3FfczgoaW50OHgxNl90IGEpOyAvLyBWUU5FLy9xMCxxMAoraW50MTZ4OF90IHZxbmVncV9zMTYoaW50MTZ4OF90IGEpOyAvLyBWUU5FLy9xMCxxMAoraW50MzJ4NF90IHZxbmVncV9zMzIoaW50MzJ4NF90IGEpOyAvLyBWUU5FLy9xMCxxMAorLy9Db3VudCBsZWFkaW5nIHNpZ24gYml0cworaW50OHg4X3QgdmNsc19zOChpbnQ4eDhfdCBhKTsgLy8gVkNMUy5TOCBkMCxkMAoraW50MTZ4NF90IHZjbHNfczE2KGludDE2eDRfdCBhKTsgLy8gVkNMUy5TMTYgZDAsZDAKK2ludDMyeDJfdCB2Y2xzX3MzMihpbnQzMngyX3QgYSk7IC8vIFZDTFMuUzMyIGQwLGQwCitpbnQ4eDE2X3QgdmNsc3FfczgoaW50OHgxNl90IGEpOyAvLyBWQ0xTLlM4IHEwLHEwCitpbnQxNng4X3QgdmNsc3FfczE2KGludDE2eDhfdCBhKTsgLy8gVkNMUy5TMTYgcTAscTAKK2ludDMyeDRfdCB2Y2xzcV9zMzIoaW50MzJ4NF90IGEpOyAvLyBWQ0xTLlMzMiBxMCxxMAorLy9Db3VudCBsZWFkaW5nIHplcm9zCitpbnQ4eDhfdCB2Y2x6X3M4KGludDh4OF90IGEpOyAvLyBWQ0xaLkk4IGQwLGQwCitpbnQxNng0X3QgdmNsel9zMTYoaW50MTZ4NF90IGEpOyAvLyBWQ0xaLkkxNiBkMCxkMAoraW50MzJ4Ml90IHZjbHpfczMyKGludDMyeDJfdCBhKTsgLy8gVkNMWi5JMzIgZDAsZDAKK3VpbnQ4eDhfdCB2Y2x6X3U4KHVpbnQ4eDhfdCBhKTsgLy8gVkNMWi5JOCBkMCxkMAordWludDE2eDRfdCB2Y2x6X3UxNih1aW50MTZ4NF90IGEpOyAvLyBWQ0xaLkkxNiBkMCxkMAordWludDMyeDJfdCB2Y2x6X3UzMih1aW50MzJ4Ml90IGEpOyAvLyBWQ0xaLkkzMiBkMCxkMAoraW50OHgxNl90IHZjbHpxX3M4KGludDh4MTZfdCBhKTsgLy8gVkNMWi5JOCBxMCxxMAoraW50MTZ4OF90IHZjbHpxX3MxNihpbnQxNng4X3QgYSk7IC8vIFZDTFouSTE2IHEwLHEwCitpbnQzMng0X3QgdmNsenFfczMyKGludDMyeDRfdCBhKTsgLy8gVkNMWi5JMzIgcTAscTAKK3VpbnQ4eDE2X3QgdmNsenFfdTgodWludDh4MTZfdCBhKTsgLy8gVkNMWi5JOCBxMCxxMAordWludDE2eDhfdCB2Y2x6cV91MTYodWludDE2eDhfdCBhKTsgLy8gVkNMWi5JMTYgcTAscTAKK3VpbnQzMng0X3QgdmNsenFfdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZDTFouSTMyIHEwLHEwCisvL0NvdW50IG51bWJlciBvZiBzZXQgYml0cwordWludDh4OF90IHZjbnRfdTgodWludDh4OF90IGEpOyAvLyBWQ05ULjggZDAsZDAKK2ludDh4OF90IHZjbnRfczgoaW50OHg4X3QgYSk7IC8vIFZDTlQuOCBkMCxkMAorcG9seTh4OF90IHZjbnRfcDgocG9seTh4OF90IGEpOyAvLyBWQ05ULjggZDAsZDAKK3VpbnQ4eDE2X3QgdmNudHFfdTgodWludDh4MTZfdCBhKTsgLy8gVkNOVC44IHEwLHEwCitpbnQ4eDE2X3QgdmNudHFfczgoaW50OHgxNl90IGEpOyAvLyBWQ05ULjggcTAscTAKK3BvbHk4eDE2X3QgdmNudHFfcDgocG9seTh4MTZfdCBhKTsgLy8gVkNOVC44IHEwLHEwCisvL1JlY2lwcm9jYWwgZXN0aW1hdGUKK2Zsb2F0MzJ4Ml90IHZyZWNwZV9mMzIoZmxvYXQzMngyX3QgYSk7IC8vIFZSRUNQRS5GMzIgZDAsZDAKK3VpbnQzMngyX3QgdnJlY3BlX3UzMih1aW50MzJ4Ml90IGEpOyAvLyBWUkVDUEUuVTMyIGQwLGQwCitmbG9hdDMyeDRfdCB2cmVjcGVxX2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVlJFQ1BFLkYzMiBxMCxxMAordWludDMyeDRfdCB2cmVjcGVxX3UzMih1aW50MzJ4NF90IGEpOyAvLyBWUkVDUEUuVTMyIHEwLHEwCisvL1JlY2lwcm9jYWwgc3F1YXJlIHJvb3QgZXN0aW1hdGUKK2Zsb2F0MzJ4Ml90IHZyc3FydGVfZjMyKGZsb2F0MzJ4Ml90IGEpOyAvLyBWUlNRUlRFLkYzMiBkMCxkMAordWludDMyeDJfdCB2cnNxcnRlX3UzMih1aW50MzJ4Ml90IGEpOyAvLyBWUlNRUlRFLlUzMiBkMCxkMAorZmxvYXQzMng0X3QgdnJzcXJ0ZXFfZjMyKGZsb2F0MzJ4NF90IGEpOyAvLyBWUlNRUlRFLkYzMiBxMCxxMAordWludDMyeDRfdCB2cnNxcnRlcV91MzIodWludDMyeDRfdCBhKTsgLy8gVlJTUVJURS5VMzIgcTAscTAKKy8vTG9naWNhbCBvcGVyYXRpb25zCisvL0JpdHdpc2Ugbm90CitpbnQ4eDhfdCB2bXZuX3M4KGludDh4OF90IGEpOyAvLyBWTVZOIGQwLGQwCitpbnQxNng0X3Qgdm12bl9zMTYoaW50MTZ4NF90IGEpOyAvLyBWTVZOIGQwLGQwCitpbnQzMngyX3Qgdm12bl9zMzIoaW50MzJ4Ml90IGEpOyAvLyBWTVZOIGQwLGQwCit1aW50OHg4X3Qgdm12bl91OCh1aW50OHg4X3QgYSk7IC8vIFZNVk4gZDAsZDAKK3VpbnQxNng0X3Qgdm12bl91MTYodWludDE2eDRfdCBhKTsgLy8gVk1WTiBkMCxkMAordWludDMyeDJfdCB2bXZuX3UzMih1aW50MzJ4Ml90IGEpOyAvLyBWTVZOIGQwLGQwCitwb2x5OHg4X3Qgdm12bl9wOChwb2x5OHg4X3QgYSk7IC8vIFZNVk4gZDAsZDAKK2ludDh4MTZfdCB2bXZucV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZNVk4gcTAscTAKK2ludDE2eDhfdCB2bXZucV9zMTYoaW50MTZ4OF90IGEpOyAvLyBWTVZOIHEwLHEwCitpbnQzMng0X3Qgdm12bnFfczMyKGludDMyeDRfdCBhKTsgLy8gVk1WTiBxMCxxMAordWludDh4MTZfdCB2bXZucV91OCh1aW50OHgxNl90IGEpOyAvLyBWTVZOIHEwLHEwCit1aW50MTZ4OF90IHZtdm5xX3UxNih1aW50MTZ4OF90IGEpOyAvLyBWTVZOIHEwLHEwCit1aW50MzJ4NF90IHZtdm5xX3UzMih1aW50MzJ4NF90IGEpOyAvLyBWTVZOIHEwLHEwCitwb2x5OHgxNl90IHZtdm5xX3A4KHBvbHk4eDE2X3QgYSk7IC8vIFZNVk4gcTAscTAKKy8vQml0d2lzZSBhbmQKK2ludDh4OF90IHZhbmRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZBTkQgZDAsZDAsZDAKK2ludDE2eDRfdCB2YW5kX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWQU5EIGQwLGQwLGQwCitpbnQzMngyX3QgdmFuZF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVkFORCBkMCxkMCxkMAoraW50NjR4MV90IHZhbmRfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYik7IC8vIFZBTkQgZDAsZDAsZDAKK3VpbnQ4eDhfdCB2YW5kX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZBTkQgZDAsZDAsZDAKK3VpbnQxNng0X3QgdmFuZF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWQU5EIGQwLGQwLGQwCit1aW50MzJ4Ml90IHZhbmRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkFORCBkMCxkMCxkMAordWludDY0eDFfdCB2YW5kX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYik7IC8vIFZBTkQgZDAsZDAsZDAKK2ludDh4MTZfdCB2YW5kcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWQU5EIHEwLHEwLHEwCitpbnQxNng4X3QgdmFuZHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZBTkQgcTAscTAscTAKK2ludDMyeDRfdCB2YW5kcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkFORCBxMCxxMCxxMAoraW50NjR4Ml90IHZhbmRxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWQU5EIHEwLHEwLHEwCit1aW50OHgxNl90IHZhbmRxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkFORCBxMCxxMCxxMAordWludDE2eDhfdCB2YW5kcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWQU5EIHEwLHEwLHEwCit1aW50MzJ4NF90IHZhbmRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZBTkQgcTAscTAscTAKK3VpbnQ2NHgyX3QgdmFuZHFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVkFORCBxMCxxMCxxMAorLy9CaXR3aXNlIG9yCitpbnQ4eDhfdCB2b3JyX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWT1JSIGQwLGQwLGQwCitpbnQxNng0X3Qgdm9ycl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVk9SUiBkMCxkMCxkMAoraW50MzJ4Ml90IHZvcnJfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZPUlIgZDAsZDAsZDAKK2ludDY0eDFfdCB2b3JyX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWT1JSIGQwLGQwLGQwCit1aW50OHg4X3Qgdm9ycl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWT1JSIGQwLGQwLGQwCit1aW50MTZ4NF90IHZvcnJfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVk9SUiBkMCxkMCxkMAordWludDMyeDJfdCB2b3JyX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZPUlIgZDAsZDAsZDAKK3VpbnQ2NHgxX3Qgdm9ycl91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpOyAvLyBWT1JSIGQwLGQwLGQwCitpbnQ4eDE2X3Qgdm9ycnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVk9SUiBxMCxxMCxxMAoraW50MTZ4OF90IHZvcnJxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWT1JSIHEwLHEwLHEwCitpbnQzMng0X3Qgdm9ycnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZPUlIgcTAscTAscTAKK2ludDY0eDJfdCB2b3JycV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVk9SUiBxMCxxMCxxMAordWludDh4MTZfdCB2b3JycV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZPUlIgcTAscTAscTAKK3VpbnQxNng4X3Qgdm9ycnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVk9SUiBxMCxxMCxxMAordWludDMyeDRfdCB2b3JycV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWT1JSIHEwLHEwLHEwCit1aW50NjR4Ml90IHZvcnJxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZPUlIgcTAscTAscTAKKy8vQml0d2lzZSBleGNsdXNpdmUgb3IgKEVPUiBvciBYT1IpCitpbnQ4eDhfdCB2ZW9yX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWRU9SIGQwLGQwLGQwCitpbnQxNng0X3QgdmVvcl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkVPUiBkMCxkMCxkMAoraW50MzJ4Ml90IHZlb3JfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZFT1IgZDAsZDAsZDAKK2ludDY0eDFfdCB2ZW9yX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWRU9SIGQwLGQwLGQwCit1aW50OHg4X3QgdmVvcl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWRU9SIGQwLGQwLGQwCit1aW50MTZ4NF90IHZlb3JfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkVPUiBkMCxkMCxkMAordWludDMyeDJfdCB2ZW9yX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZFT1IgZDAsZDAsZDAKK3VpbnQ2NHgxX3QgdmVvcl91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpOyAvLyBWRU9SIGQwLGQwLGQwCitpbnQ4eDE2X3QgdmVvcnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkVPUiBxMCxxMCxxMAoraW50MTZ4OF90IHZlb3JxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWRU9SIHEwLHEwLHEwCitpbnQzMng0X3QgdmVvcnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZFT1IgcTAscTAscTAKK2ludDY0eDJfdCB2ZW9ycV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVkVPUiBxMCxxMCxxMAordWludDh4MTZfdCB2ZW9ycV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZFT1IgcTAscTAscTAKK3VpbnQxNng4X3QgdmVvcnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkVPUiBxMCxxMCxxMAordWludDMyeDRfdCB2ZW9ycV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWRU9SIHEwLHEwLHEwCit1aW50NjR4Ml90IHZlb3JxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZFT1IgcTAscTAscTAKKy8vQml0IENsZWFyCitpbnQ4eDhfdCB2YmljX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQklDIGQwLGQwLGQwCitpbnQxNng0X3QgdmJpY19zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkJJQyBkMCxkMCxkMAoraW50MzJ4Ml90IHZiaWNfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZCSUMgZDAsZDAsZDAKK2ludDY0eDFfdCB2YmljX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWQklDIGQwLGQwLGQwCit1aW50OHg4X3QgdmJpY191OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQklDIGQwLGQwLGQwCit1aW50MTZ4NF90IHZiaWNfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkJJQyBkMCxkMCxkMAordWludDMyeDJfdCB2YmljX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZCSUMgZDAsZDAsZDAKK3VpbnQ2NHgxX3QgdmJpY191NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpOyAvLyBWQklDIGQwLGQwLGQwCitpbnQ4eDE2X3QgdmJpY3FfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkJJQyBxMCxxMCxxMAoraW50MTZ4OF90IHZiaWNxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWQklDIHEwLHEwLHEwCitpbnQzMng0X3QgdmJpY3FfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZCSUMgcTAscTAscTAKK2ludDY0eDJfdCB2YmljcV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVkJJQyBxMCxxMCxxMAordWludDh4MTZfdCB2YmljcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZCSUMgcTAscTAscTAKK3VpbnQxNng4X3QgdmJpY3FfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkJJQyBxMCxxMCxxMAordWludDMyeDRfdCB2YmljcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQklDIHEwLHEwLHEwCit1aW50NjR4Ml90IHZiaWNxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZCSUMgcTAscTAscTAKKy8vQml0d2lzZSBPUiBjb21wbGVtZW50CitpbnQ4eDhfdCB2b3JuX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWT1JOIGQwLGQwLGQwCitpbnQxNng0X3Qgdm9ybl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVk9STiBkMCxkMCxkMAoraW50MzJ4Ml90IHZvcm5fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZPUk4gZDAsZDAsZDAKK2ludDY0eDFfdCB2b3JuX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWT1JOIGQwLGQwLGQwCit1aW50OHg4X3Qgdm9ybl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWT1JOIGQwLGQwLGQwCit1aW50MTZ4NF90IHZvcm5fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVk9STiBkMCxkMCxkMAordWludDMyeDJfdCB2b3JuX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZPUk4gZDAsZDAsZDAKK3VpbnQ2NHgxX3Qgdm9ybl91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpOyAvLyBWT1JOIGQwLGQwLGQwCitpbnQ4eDE2X3Qgdm9ybnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVk9STiBxMCxxMCxxMAoraW50MTZ4OF90IHZvcm5xX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWT1JOIHEwLHEwLHEwCitpbnQzMng0X3Qgdm9ybnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZPUk4gcTAscTAscTAKK2ludDY0eDJfdCB2b3JucV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVk9STiBxMCxxMCxxMAordWludDh4MTZfdCB2b3JucV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZPUk4gcTAscTAscTAKK3VpbnQxNng4X3Qgdm9ybnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVk9STiBxMCxxMCxxMAordWludDMyeDRfdCB2b3JucV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWT1JOIHEwLHEwLHEwCit1aW50NjR4Ml90IHZvcm5xX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZPUk4gcTAscTAscTAKKy8vQml0d2lzZSBTZWxlY3QKK2ludDh4OF90IHZic2xfczgodWludDh4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCitpbnQxNng0X3QgdmJzbF9zMTYodWludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCitpbnQzMngyX3QgdmJzbF9zMzIodWludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCitpbnQ2NHgxX3QgdmJzbF9zNjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiwgaW50NjR4MV90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCit1aW50OHg4X3QgdmJzbF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAordWludDE2eDRfdCB2YnNsX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAordWludDMyeDJfdCB2YnNsX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAordWludDY0eDFfdCB2YnNsX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYiwgdWludDY0eDFfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAorZmxvYXQzMngyX3QgdmJzbF9mMzIodWludDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDJfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAorcG9seTh4OF90IHZic2xfcDgodWludDh4OF90IGEsIHBvbHk4eDhfdCBiLCBwb2x5OHg4X3QgYyk7IC8vIFZCU0wgZDAsZDAsZDAKK3BvbHkxNng0X3QgdmJzbF9wMTYodWludDE2eDRfdCBhLCBwb2x5MTZ4NF90IGIsIHBvbHkxNng0X3QgYyk7IC8vIFZCU0wgZDAsZDAsZDAKK2ludDh4MTZfdCB2YnNscV9zOCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBpbnQ4eDE2X3QgYyk7IC8vIFZCU0wgcTAscTAscTAKK2ludDE2eDhfdCB2YnNscV9zMTYodWludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IGMpOyAvLyBWQlNMIHEwLHEwLHEwCitpbnQzMng0X3QgdmJzbHFfczMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAoraW50NjR4Ml90IHZic2xxX3M2NCh1aW50NjR4Ml90IGEsIGludDY0eDJfdCBiLCBpbnQ2NHgyX3QgYyk7IC8vIFZCU0wgcTAscTAscTAKK3VpbnQ4eDE2X3QgdmJzbHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIHVpbnQ4eDE2X3QgYyk7IC8vIFZCU0wgcTAscTAscTAKK3VpbnQxNng4X3QgdmJzbHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZ4OF90IGMpOyAvLyBWQlNMIHEwLHEwLHEwCit1aW50MzJ4NF90IHZic2xxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDRfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAordWludDY0eDJfdCB2YnNscV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIsIHVpbnQ2NHgyX3QgYyk7IC8vIFZCU0wgcTAscTAscTAKK2Zsb2F0MzJ4NF90IHZic2xxX2YzMih1aW50MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4NF90IGMpOyAvLyBWQlNMIHEwLHEwLHEwCitwb2x5OHgxNl90IHZic2xxX3A4KHVpbnQ4eDE2X3QgYSwgcG9seTh4MTZfdCBiLCBwb2x5OHgxNl90IGMpOyAvLyBWQlNMIHEwLHEwLHEwCitwb2x5MTZ4OF90IHZic2xxX3AxNih1aW50MTZ4OF90IGEsIHBvbHkxNng4X3QgYiwgcG9seTE2eDhfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAorLy9UcmFuc3Bvc2l0aW9uIG9wZXJhdGlvbnMKKy8vVHJhbnNwb3NlIGVsZW1lbnRzCitpbnQ4eDh4Ml90IHZ0cm5fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZUUk4uOCBkMCxkMAoraW50MTZ4NHgyX3QgdnRybl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlRSTi4xNiBkMCxkMAoraW50MzJ4MngyX3QgdnRybl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlRSTi4zMiBkMCxkMAordWludDh4OHgyX3QgdnRybl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWVFJOLjggZDAsZDAKK3VpbnQxNng0eDJfdCB2dHJuX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZUUk4uMTYgZDAsZDAKK3VpbnQzMngyeDJfdCB2dHJuX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZUUk4uMzIgZDAsZDAKK2Zsb2F0MzJ4MngyX3QgdnRybl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZUUk4uMzIgZDAsZDAKK3BvbHk4eDh4Ml90IHZ0cm5fcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKTsgLy8gVlRSTi44IGQwLGQwCitwb2x5MTZ4NHgyX3QgdnRybl9wMTYocG9seTE2eDRfdCBhLCBwb2x5MTZ4NF90IGIpOyAvLyBWVFJOLjE2IGQwLGQwCitpbnQ4eDE2eDJfdCB2dHJucV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWVFJOLjggcTAscTAKK2ludDE2eDh4Ml90IHZ0cm5xX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWVFJOLjE2IHEwLHEwCitpbnQzMng0eDJfdCB2dHJucV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlRSTi4zMiBxMCxxMAordWludDh4MTZ4Ml90IHZ0cm5xX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVlRSTi44IHEwLHEwCit1aW50MTZ4OHgyX3QgdnRybnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlRSTi4xNiBxMCxxMAordWludDMyeDR4Ml90IHZ0cm5xX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZUUk4uMzIgcTAscTAKK2Zsb2F0MzJ4NHgyX3QgdnRybnFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWVFJOLjMyIHEwLHEwCitwb2x5OHgxNngyX3QgdnRybnFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpOyAvLyBWVFJOLjggcTAscTAKK3BvbHkxNng4eDJfdCB2dHJucV9wMTYocG9seTE2eDhfdCBhLCBwb2x5MTZ4OF90IGIpOyAvLyBWVFJOLjE2IHEwLHEwCisvL0ludGVybGVhdmUgZWxlbWVudHMKK2ludDh4OHgyX3QgdnppcF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlpJUC44IGQwLGQwCitpbnQxNng0eDJfdCB2emlwX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWWklQLjE2IGQwLGQwCitpbnQzMngyeDJfdCB2emlwX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWWklQLjMyIGQwLGQwCit1aW50OHg4eDJfdCB2emlwX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZaSVAuOCBkMCxkMAordWludDE2eDR4Ml90IHZ6aXBfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlpJUC4xNiBkMCxkMAordWludDMyeDJ4Ml90IHZ6aXBfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlpJUC4zMiBkMCxkMAorZmxvYXQzMngyeDJfdCB2emlwX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVlpJUC4zMiBkMCxkMAorcG9seTh4OHgyX3QgdnppcF9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIpOyAvLyBWWklQLjggZDAsZDAKK3BvbHkxNng0eDJfdCB2emlwX3AxNihwb2x5MTZ4NF90IGEsIHBvbHkxNng0X3QgYik7IC8vIFZaSVAuMTYgZDAsZDAKK2ludDh4MTZ4Ml90IHZ6aXBxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZaSVAuOCBxMCxxMAoraW50MTZ4OHgyX3QgdnppcHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZaSVAuMTYgcTAscTAKK2ludDMyeDR4Ml90IHZ6aXBxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWWklQLjMyIHEwLHEwCit1aW50OHgxNngyX3QgdnppcHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWWklQLjggcTAscTAKK3VpbnQxNng4eDJfdCB2emlwcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWWklQLjE2IHEwLHEwCit1aW50MzJ4NHgyX3QgdnppcHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlpJUC4zMiBxMCxxMAorZmxvYXQzMng0eDJfdCB2emlwcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZaSVAuMzIgcTAscTAKK3BvbHk4eDE2eDJfdCB2emlwcV9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYik7IC8vIFZaSVAuOCBxMCxxMAorcG9seTE2eDh4Ml90IHZ6aXBxX3AxNihwb2x5MTZ4OF90IGEsIHBvbHkxNng4X3QgYik7IC8vIFZaSVAuMTYgcTAscTAKKy8vRGUtSW50ZXJsZWF2ZSBlbGVtZW50cworaW50OHg4eDJfdCB2dXpwX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWVVpQLjggZDAsZDAKK2ludDE2eDR4Ml90IHZ1enBfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZVWlAuMTYgZDAsZDAKK2ludDMyeDJ4Ml90IHZ1enBfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZVWlAuMzIgZDAsZDAKK3VpbnQ4eDh4Ml90IHZ1enBfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlVaUC44IGQwLGQwCit1aW50MTZ4NHgyX3QgdnV6cF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWVVpQLjE2IGQwLGQwCit1aW50MzJ4MngyX3QgdnV6cF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWVVpQLjMyIGQwLGQwCitmbG9hdDMyeDJ4Ml90IHZ1enBfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWVVpQLjMyIGQwLGQwCitwb2x5OHg4eDJfdCB2dXpwX3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYik7IC8vIFZVWlAuOCBkMCxkMAorcG9seTE2eDR4Ml90IHZ1enBfcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiKTsgLy8gVlVaUC4xNiBkMCxkMAoraW50OHgxNngyX3QgdnV6cHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlVaUC44IHEwLHEwCitpbnQxNng4eDJfdCB2dXpwcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlVaUC4xNiBxMCxxMAoraW50MzJ4NHgyX3QgdnV6cHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZVWlAuMzIgcTAscTAKK3VpbnQ4eDE2eDJfdCB2dXpwcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZVWlAuOCBxMCxxMAordWludDE2eDh4Ml90IHZ1enBxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZVWlAuMTYgcTAscTAKK3VpbnQzMng0eDJfdCB2dXpwcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWVVpQLjMyIHEwLHEwCitmbG9hdDMyeDR4Ml90IHZ1enBxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVlVaUC4zMiBxMCxxMAorcG9seTh4MTZ4Ml90IHZ1enBxX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiKTsgLy8gVlVaUC44IHEwLHEwCitwb2x5MTZ4OHgyX3QgdnV6cHFfcDE2KHBvbHkxNng4X3QgYSwgcG9seTE2eDhfdCBiKTsgLy8gVlVaUC4xNiBxMCxxMAorCisKKy8vXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisvLyB0aGUgZm9sbG93aW5nIG1hY3JvcyBzb2x2ZSB0aGUgcHJvYmxlbSBvZiB0aGUgImltbWVkaWF0ZSBwYXJhbWV0ZXJzIHJlcXVpcmVtZW50IiBmb3Igc29tZSB4ODYgaW50cmluc2ljcy4gV2hpbGUgZm9yIHJlbGVhc2UgYnVpbGQgaXQgaXMgbm90IGEgbXVzdCwKKy8vZm9yIGRlYnVnIGJ1aWxkIHdlIG5lZWQgaXQgdG8gY29tcGlsZSB0aGUgY29kZSB1bmxlc3MgdGhlICJJbnRyaW5zaWMgcGFyYW1ldGVyIG11c3QgYmUgYW4gaW1tZWRpYXRlIHZhbHVlIiBlcnJvciBpcyBvdXIgZ29hbAorLy8KKyNpZiAoICgoZGVmaW5lZCBfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTYwMCkpIHx8IGRlZmluZWQgKF9fSU5URUxfQ09NUElMRVIpICkmJiBkZWZpbmVkIE5ERUJVRyAgICAgLy9pZiBpdCBpcyBhIHJlbGVhc2UgYnVpbGQsIHdlIGFsc28gbmVlZCBpdCB0byBmaXggdGhlIGlzc3VlIGZvciBWUzIwMTAgYW5kIGVhcmxpZXIgY29tcGlsZXJzLgorCisgICAgI2RlZmluZSBfTU1fQUxJR05SX0VQSTggX21tX2FsaWducl9lcGk4CisKKyAgICAjZGVmaW5lIF9NTV9FWFRSQUNUX0VQSTE2ICBfbW1fZXh0cmFjdF9lcGkxNgorICAgICNkZWZpbmUgX01NX0lOU0VSVF9FUEkxNiBfbW1faW5zZXJ0X2VwaTE2CisjaWZkZWYgVVNFX1NTRTQKKyAgICAgICAgI2RlZmluZSBfTU1fRVhUUkFDVF9FUEk4ICBfbW1fZXh0cmFjdF9lcGk4CisgICAgICAgICNkZWZpbmUgX01NX0VYVFJBQ1RfRVBJMzIgIF9tbV9leHRyYWN0X2VwaTMyCisgICAgICAgICNkZWZpbmUgX01NX0VYVFJBQ1RfUFMgIF9tbV9leHRyYWN0X3BzCisKKyAgICAgICAgI2RlZmluZSBfTU1fSU5TRVJUX0VQSTggIF9tbV9pbnNlcnRfZXBpOAorICAgICAgICAjZGVmaW5lIF9NTV9JTlNFUlRfRVBJMzIgX21tX2luc2VydF9lcGkzMgorICAgICAgICAjZGVmaW5lIF9NTV9JTlNFUlRfUFMgICAgX21tX2luc2VydF9wcworI2lmZGVmICBfTkVPTjJTU0VfNjRCSVQKKyAgICAgICAgICAgICNkZWZpbmUgX01NX0lOU0VSVF9FUEk2NCBfbW1faW5zZXJ0X2VwaTY0CisgICAgICAgICAgICAjZGVmaW5lIF9NTV9FWFRSQUNUX0VQSTY0IF9tbV9leHRyYWN0X2VwaTY0CisjZW5kaWYKKyNlbmRpZiAvL1NTRTQKKyNlbHNlCisgICAgI2RlZmluZSBfTkVPTjJTU0VfQ09NTUEgLAorICAgICNkZWZpbmUgX05FT04yU1NFX1NXSVRDSDE2KE5BTUUsIGEsIGIsIExBTkUpIFwKKyAgICAgICAgICAgIHN3aXRjaChMQU5FKSAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgMDogICAgIHJldHVybiBOQU1FKGEgYiwgMCk7IFwKKyAgICAgICAgY2FzZSAxOiAgICAgcmV0dXJuIE5BTUUoYSBiLCAxKTsgXAorICAgICAgICBjYXNlIDI6ICAgICByZXR1cm4gTkFNRShhIGIsIDIpOyBcCisgICAgICAgIGNhc2UgMzogICAgIHJldHVybiBOQU1FKGEgYiwgMyk7IFwKKyAgICAgICAgY2FzZSA0OiAgICAgcmV0dXJuIE5BTUUoYSBiLCA0KTsgXAorICAgICAgICBjYXNlIDU6ICAgICByZXR1cm4gTkFNRShhIGIsIDUpOyBcCisgICAgICAgIGNhc2UgNjogICAgIHJldHVybiBOQU1FKGEgYiwgNik7IFwKKyAgICAgICAgY2FzZSA3OiAgICAgcmV0dXJuIE5BTUUoYSBiLCA3KTsgXAorICAgICAgICBjYXNlIDg6ICAgICByZXR1cm4gTkFNRShhIGIsIDgpOyBcCisgICAgICAgIGNhc2UgOTogICAgIHJldHVybiBOQU1FKGEgYiwgOSk7IFwKKyAgICAgICAgY2FzZSAxMDogICAgcmV0dXJuIE5BTUUoYSBiLCAxMCk7IFwKKyAgICAgICAgY2FzZSAxMTogICAgcmV0dXJuIE5BTUUoYSBiLCAxMSk7IFwKKyAgICAgICAgY2FzZSAxMjogICAgcmV0dXJuIE5BTUUoYSBiLCAxMik7IFwKKyAgICAgICAgY2FzZSAxMzogICAgcmV0dXJuIE5BTUUoYSBiLCAxMyk7IFwKKyAgICAgICAgY2FzZSAxNDogICAgcmV0dXJuIE5BTUUoYSBiLCAxNCk7IFwKKyAgICAgICAgY2FzZSAxNTogICAgcmV0dXJuIE5BTUUoYSBiLCAxNSk7IFwKKyAgICAgICAgZGVmYXVsdDogICAgcmV0dXJuIE5BTUUoYSBiLCAwKTsgXAorICAgICAgICB9CisKKyAgICAjZGVmaW5lIF9ORU9OMlNTRV9TV0lUQ0g4KE5BTUUsIHZlYywgTEFORSwgcCkgXAorICAgICAgICAgICAgc3dpdGNoKExBTkUpICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSAwOiAgcmV0dXJuIE5BTUUodmVjIHAsMCk7IFwKKyAgICAgICAgY2FzZSAxOiAgcmV0dXJuIE5BTUUodmVjIHAsMSk7IFwKKyAgICAgICAgY2FzZSAyOiAgcmV0dXJuIE5BTUUodmVjIHAsMik7IFwKKyAgICAgICAgY2FzZSAzOiAgcmV0dXJuIE5BTUUodmVjIHAsMyk7IFwKKyAgICAgICAgY2FzZSA0OiAgcmV0dXJuIE5BTUUodmVjIHAsNCk7IFwKKyAgICAgICAgY2FzZSA1OiAgcmV0dXJuIE5BTUUodmVjIHAsNSk7IFwKKyAgICAgICAgY2FzZSA2OiAgcmV0dXJuIE5BTUUodmVjIHAsNik7IFwKKyAgICAgICAgY2FzZSA3OiAgcmV0dXJuIE5BTUUodmVjIHAsNyk7IFwKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5BTUUodmVjIHAsMCk7IFwKKyAgICAgICAgfQorCisgICAgI2RlZmluZSBfTkVPTjJTU0VfU1dJVENINChOQU1FLCBjYXNlMCwgY2FzZTEsIGNhc2UyLCBjYXNlMywgdmVjLCBMQU5FLCBwKSBcCisgICAgICAgICAgICBzd2l0Y2goTEFORSkgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIGNhc2UwOiAgcmV0dXJuIE5BTUUodmVjIHAsY2FzZTApOyBcCisgICAgICAgIGNhc2UgY2FzZTE6ICByZXR1cm4gTkFNRSh2ZWMgcCxjYXNlMSk7IFwKKyAgICAgICAgY2FzZSBjYXNlMjogIHJldHVybiBOQU1FKHZlYyBwLGNhc2UyKTsgXAorICAgICAgICBjYXNlIGNhc2UzOiAgcmV0dXJuIE5BTUUodmVjIHAsY2FzZTMpOyBcCisgICAgICAgIGRlZmF1bHQ6ICAgICByZXR1cm4gTkFNRSh2ZWMgcCxjYXNlMCk7IFwKKyAgICAgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBfX20xMjhpIF9NTV9BTElHTlJfRVBJOChfX20xMjhpIGEsIF9fbTEyOGkgYiwgaW50IExBTkUpCisgICAgeworICAgICAgICBfTkVPTjJTU0VfU1dJVENIMTYoX21tX2FsaWducl9lcGk4LCBhLCBfTkVPTjJTU0VfQ09NTUEgYiwgTEFORSkKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgIF9NTV9JTlNFUlRfRVBJMTYoX19tMTI4aSB2ZWMsIGludCBwLCBjb25zdCBpbnQgTEFORSkKKyAgICB7CisgICAgICAgIF9ORU9OMlNTRV9TV0lUQ0g4KF9tbV9pbnNlcnRfZXBpMTYsIHZlYywgTEFORSwgX05FT04yU1NFX0NPTU1BIHApCisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBpbnQgX01NX0VYVFJBQ1RfRVBJMTYoX19tMTI4aSB2ZWMsIGNvbnN0IGludCBMQU5FKQorICAgIHsKKyAgICAgICAgX05FT04yU1NFX1NXSVRDSDgoX21tX2V4dHJhY3RfZXBpMTYsIHZlYywgTEFORSwpCisgICAgfQorCisjaWZkZWYgVVNFX1NTRTQKKyAgICAgICAgX05FT04yU1NFX0lOTElORSBpbnQgX01NX0VYVFJBQ1RfRVBJMzIoX19tMTI4aSB2ZWMsIGNvbnN0IGludCBMQU5FKQorICAgICAgICB7CisgICAgICAgICAgICBfTkVPTjJTU0VfU1dJVENINChfbW1fZXh0cmFjdF9lcGkzMiwgMCwxLDIsMywgdmVjLCBMQU5FLCkKKyAgICAgICAgfQorCisgICAgICAgIF9ORU9OMlNTRV9JTkxJTkUgaW50IF9NTV9FWFRSQUNUX1BTKF9fbTEyOCB2ZWMsIGNvbnN0IGludCBMQU5FKQorICAgICAgICB7CisgICAgICAgICAgICBfTkVPTjJTU0VfU1dJVENINChfbW1fZXh0cmFjdF9wcywgMCwxLDIsMywgdmVjLCBMQU5FLCkKKyAgICAgICAgfQorCisgICAgICAgIF9ORU9OMlNTRV9JTkxJTkUgaW50IF9NTV9FWFRSQUNUX0VQSTgoX19tMTI4aSB2ZWMsIGNvbnN0IGludCBMQU5FKQorICAgICAgICB7CisgICAgICAgICAgICBfTkVPTjJTU0VfU1dJVENIMTYoX21tX2V4dHJhY3RfZXBpOCwgdmVjLCAsIExBTkUpCisgICAgICAgIH0KKworICAgICAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgIF9NTV9JTlNFUlRfRVBJMzIoX19tMTI4aSB2ZWMsIGludCBwLCBjb25zdCBpbnQgTEFORSkKKyAgICAgICAgeworICAgICAgICAgICAgX05FT04yU1NFX1NXSVRDSDQoX21tX2luc2VydF9lcGkzMiwgMCwgMSwgMiwgMywgdmVjLCBMQU5FLCBfTkVPTjJTU0VfQ09NTUEgcCkKKyAgICAgICAgfQorCisgICAgICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSAgX01NX0lOU0VSVF9FUEk4KF9fbTEyOGkgdmVjLCBpbnQgcCwgY29uc3QgaW50IExBTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ORU9OMlNTRV9TV0lUQ0gxNihfbW1faW5zZXJ0X2VwaTgsIHZlYywgX05FT04yU1NFX0NPTU1BIHAsIExBTkUpCisgICAgICAgIH0KKworI2lmZGVmICBfTkVPTjJTU0VfNjRCSVQKKyAgICAgICAgICAgIC8vdGhlIHNwZWNpYWwgY2FzZSBvZiBmdW5jdGlvbnMgYXZhaWxhYmxlIG9ubHkgZm9yIFNTRTQgYW5kIDY0LWJpdCBidWlsZC4KKyAgICAgICAgICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSAgX01NX0lOU0VSVF9FUEk2NChfX20xMjhpIHZlYywgaW50IHAsIGNvbnN0IGludCBMQU5FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaChMQU5FKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX21tX2luc2VydF9lcGk2NCh2ZWMsICBwLCAwKTsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbW1faW5zZXJ0X2VwaTY0KHZlYywgIHAsIDEpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbW1faW5zZXJ0X2VwaTY0KHZlYywgIHAsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX05FT04yU1NFX0lOTElORSBpbnQ2NF90IF9NTV9FWFRSQUNUX0VQSTY0KF9fbTEyOGkgdmFsLCBjb25zdCBpbnQgTEFORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoTEFORSA9PTApIHJldHVybiBfbW1fZXh0cmFjdF9lcGk2NCh2YWwsIDApOworICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIF9tbV9leHRyYWN0X2VwaTY0KHZhbCwgMSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOCBfTU1fSU5TRVJUX1BTKF9fbTEyOCB2ZWMsIF9fbTEyOCBwLCBjb25zdCBpbnQgTEFORSkKKyAgICAgICAgeworICAgICAgICAgICAgX05FT04yU1NFX1NXSVRDSDQoX21tX2luc2VydF9wcywgMCwgMTYsIDMyLCA0OCwgdmVjLCBMQU5FLCBfTkVPTjJTU0VfQ09NTUEgcCkKKyAgICAgICAgfQorCisjZW5kaWYgLy9VU0VfU1NFNAorCisjZW5kaWYgICAgIC8vI2lmZGVmIE5ERUJVRworCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisvLyBCZWxvdyBhcmUgc29tZSBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgZWl0aGVyIGZvciBTU0U0IGludHJpbnNpY3MgImVtdWxhdGlvbiIgZm9yIFNTU0UzIGxpbWl0ZWQgZGV2aWNlcworLy8gb3IgZm9yIHNvbWUgc3BlY2lmaWMgY29tbW9ubHkgdXNlZCBvcGVyYXRpb25zIGltcGxlbWVudGF0aW9uIG1pc3NpbmcgaW4gU1NFCisjaWZkZWYgVVNFX1NTRTQKKyAgICAjZGVmaW5lIF9NTV9DVlRFUFU4X0VQSTE2ICBfbW1fY3Z0ZXB1OF9lcGkxNgorICAgICNkZWZpbmUgX01NX0NWVEVQVTE2X0VQSTMyIF9tbV9jdnRlcHUxNl9lcGkzMgorICAgICNkZWZpbmUgX01NX0NWVEVQVTMyX0VQSTY0ICBfbW1fY3Z0ZXB1MzJfZXBpNjQKKworICAgICNkZWZpbmUgX01NX0NWVEVQSThfRVBJMTYgIF9tbV9jdnRlcGk4X2VwaTE2CisgICAgI2RlZmluZSBfTU1fQ1ZURVBJMTZfRVBJMzIgX21tX2N2dGVwaTE2X2VwaTMyCisgICAgI2RlZmluZSBfTU1fQ1ZURVBJMzJfRVBJNjQgIF9tbV9jdnRlcGkzMl9lcGk2NAorCisgICAgI2RlZmluZSBfTU1fTUFYX0VQSTggIF9tbV9tYXhfZXBpOAorICAgICNkZWZpbmUgX01NX01BWF9FUEkzMiBfbW1fbWF4X2VwaTMyCisgICAgI2RlZmluZSBfTU1fTUFYX0VQVTE2IF9tbV9tYXhfZXB1MTYKKyAgICAjZGVmaW5lIF9NTV9NQVhfRVBVMzIgX21tX21heF9lcHUzMgorCisgICAgI2RlZmluZSBfTU1fTUlOX0VQSTggIF9tbV9taW5fZXBpOAorICAgICNkZWZpbmUgX01NX01JTl9FUEkzMiBfbW1fbWluX2VwaTMyCisgICAgI2RlZmluZSBfTU1fTUlOX0VQVTE2IF9tbV9taW5fZXB1MTYKKyAgICAjZGVmaW5lIF9NTV9NSU5fRVBVMzIgX21tX21pbl9lcHUzMgorCisgICAgI2RlZmluZSBfTU1fQkxFTkRWX0VQSTggX21tX2JsZW5kdl9lcGk4CisgICAgI2RlZmluZSBfTU1fUEFDS1VTX0VQSTMyIF9tbV9wYWNrdXNfZXBpMzIKKyAgICAjZGVmaW5lIF9NTV9QQUNLVVMxX0VQSTMyKGEpIF9tbV9wYWNrdXNfZXBpMzIoYSwgYSkKKworICAgICNkZWZpbmUgX01NX01VTExPX0VQSTMyIF9tbV9tdWxsb19lcGkzMgorICAgICNkZWZpbmUgX01NX01VTF9FUEkzMiAgX21tX211bF9lcGkzMgorCisgICAgI2RlZmluZSBfTU1fQ01QRVFfRVBJNjQgX21tX2NtcGVxX2VwaTY0CisjZWxzZSAgICAgLy9ubyBTU0U0ICEhISEhIQorICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSBfTU1fQ1ZURVBVOF9FUEkxNihfX20xMjhpIGEpCisgICAgeworICAgICAgICBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgICAgICByZXR1cm4gX21tX3VucGFja2xvX2VwaTgoYSwgemVybyk7CisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBfX20xMjhpIF9NTV9DVlRFUFUxNl9FUEkzMihfX20xMjhpIGEpCisgICAgeworICAgICAgICBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgICAgICByZXR1cm4gX21tX3VucGFja2xvX2VwaTE2KGEsIHplcm8pOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSBfTU1fQ1ZURVBVMzJfRVBJNjQoX19tMTI4aSBhKQorICAgIHsKKyAgICAgICAgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICAgICAgcmV0dXJuIF9tbV91bnBhY2tsb19lcGkzMihhLCB6ZXJvKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX0NWVEVQSThfRVBJMTYoX19tMTI4aSBhKQorICAgIHsKKyAgICAgICAgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICAgICAgX19tMTI4aSBzaWduID0gX21tX2NtcGd0X2VwaTgoemVybywgYSk7CisgICAgICAgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpOChhLCBzaWduKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX0NWVEVQSTE2X0VQSTMyKF9fbTEyOGkgYSkKKyAgICB7CisgICAgICAgIF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgICAgIF9fbTEyOGkgc2lnbiA9IF9tbV9jbXBndF9lcGkxNih6ZXJvLCBhKTsKKyAgICAgICAgcmV0dXJuIF9tbV91bnBhY2tsb19lcGkxNihhLCBzaWduKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX0NWVEVQSTMyX0VQSTY0KF9fbTEyOGkgYSkKKyAgICB7CisgICAgICAgIF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgICAgIF9fbTEyOGkgc2lnbiA9IF9tbV9jbXBndF9lcGkzMih6ZXJvLCBhKTsKKyAgICAgICAgcmV0dXJuIF9tbV91bnBhY2tsb19lcGkzMihhLCBzaWduKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIGludCBfTU1fRVhUUkFDVF9FUEkzMihfX20xMjhpIHZlYywgY29uc3QgaW50IExBTkUpCisgICAgeworICAgICAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50MzJfdCB0bXBbNF07CisgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopdG1wLCB2ZWMpOworICAgICAgICByZXR1cm4gdG1wW0xBTkVdOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgaW50IF9NTV9FWFRSQUNUX0VQSTgoX19tMTI4aSB2ZWMsIGNvbnN0IGludCBMQU5FKQorICAgIHsKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCB0bXBbMTZdOworICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgdmVjKTsKKyAgICAgICAgcmV0dXJuIChpbnQpdG1wW0xBTkVdOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgaW50IF9NTV9FWFRSQUNUX1BTKF9fbTEyOCB2ZWMsIGNvbnN0IGludCBMQU5FKQorICAgIHsKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDMyX3QgdG1wWzRdOworICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgX00xMjhpKHZlYykpOworICAgICAgICByZXR1cm4gdG1wW0xBTkVdOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSAgX01NX0lOU0VSVF9FUEkzMihfX20xMjhpIHZlYywgaW50IHAsIGNvbnN0IGludCBMQU5FKQorICAgIHsKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDMyX3QgcHZlY1s0XSA9IHswLDAsMCwwfTsKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQzMl90IG1hc2tbNF0gPSB7MHhmZmZmZmZmZiwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZn07CisgICAgICAgIF9fbTEyOGkgdmVjX21hc2tlZCwgcF9tYXNrZWQ7CisgICAgICAgIHB2ZWNbTEFORV0gPSBwOworICAgICAgICBtYXNrW0xBTkVdID0gMHgwOworICAgICAgICB2ZWNfbWFza2VkID0gX21tX2FuZF9zaTEyOCAoKihfX20xMjhpKiltYXNrLHZlYyk7IC8vcmVhZHkgZm9yIHAKKyAgICAgICAgcF9tYXNrZWQgPSBfbW1fYW5kbm90X3NpMTI4ICgqKF9fbTEyOGkqKW1hc2ssKihfX20xMjhpKilwdmVjKTsgLy9yZWFkeSBmb3IgdmVjCisgICAgICAgIHJldHVybiBfbW1fb3Jfc2kxMjgodmVjX21hc2tlZCwgcF9tYXNrZWQpOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSAgX01NX0lOU0VSVF9FUEk4KF9fbTEyOGkgdmVjLCBpbnQgcCwgY29uc3QgaW50IExBTkUpCisgICAgeworICAgICAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IHB2ZWNbMTZdID0gezAsMCwwLDAsIDAsMCwwLDAsIDAsMCwwLDAsIDAsMCwwLDB9OworICAgICAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrWzE2XSA9IHsweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKyAgICAgICAgX19tMTI4aSB2ZWNfbWFza2VkLCBwX21hc2tlZDsKKyAgICAgICAgcHZlY1tMQU5FXSA9IChpbnQ4X3QpcDsKKyAgICAgICAgbWFza1tMQU5FXSA9IDB4MDsKKyAgICAgICAgdmVjX21hc2tlZCA9IF9tbV9hbmRfc2kxMjggKCooX19tMTI4aSopbWFzayx2ZWMpOyAvL3JlYWR5IGZvciBwCisgICAgICAgIHBfbWFza2VkID0gX21tX2FuZG5vdF9zaTEyOCAgKCooX19tMTI4aSopbWFzaywqKF9fbTEyOGkqKXB2ZWMpOyAvL3JlYWR5IGZvciB2ZWMKKyAgICAgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCh2ZWNfbWFza2VkLCBwX21hc2tlZCk7CisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBfX20xMjggX01NX0lOU0VSVF9QUyhfX20xMjggdmVjLCBfX20xMjggcCwgY29uc3QgaW50IExBTkUpCisgICAgeworICAgICAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50MzJfdCBtYXNrWzRdID0gezB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwweGZmZmZmZmZmLDB4ZmZmZmZmZmZ9OworICAgICAgICBfX20xMjggdG1wLCB2ZWNfbWFza2VkLCBwX21hc2tlZDsKKyAgICAgICAgbWFza1tMQU5FID4+IDRdID0gMHgwOyAvL2hlcmUgdGhlIExBTkUgaXMgbm90IGFjdHVyYWwgbGFuZSwgbmVlZCB0byBkZWFsIHdpdGggaXQKKyAgICAgICAgdmVjX21hc2tlZCA9IF9tbV9hbmRfcHMgKCooX19tMTI4KiltYXNrLHZlYyk7IC8vcmVhZHkgZm9yIHAKKyAgICAgICAgcF9tYXNrZWQgPSBfbW1fYW5kbm90X3BzICgqKF9fbTEyOCopbWFzaywgcCk7IC8vcmVhZHkgZm9yIHZlYworICAgICAgICB0bXAgPSBfbW1fb3JfcHModmVjX21hc2tlZCwgcF9tYXNrZWQpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSBfTU1fTUFYX0VQSTgoX19tMTI4aSBhLCBfX20xMjhpIGIpCisgICAgeworICAgICAgICBfX20xMjhpIGNtcCwgcmVzYSwgcmVzYjsKKyAgICAgICAgY21wID0gX21tX2NtcGd0X2VwaTggKGEsIGIpOworICAgICAgICByZXNhID0gX21tX2FuZF9zaTEyOCAoY21wLCBhKTsKKyAgICAgICAgcmVzYiA9IF9tbV9hbmRub3Rfc2kxMjggKGNtcCxiKTsKKyAgICAgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChyZXNhLCByZXNiKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX01BWF9FUEkzMihfX20xMjhpIGEsIF9fbTEyOGkgYikKKyAgICB7CisgICAgICAgIF9fbTEyOGkgY21wLCByZXNhLCByZXNiOworICAgICAgICBjbXAgPSBfbW1fY21wZ3RfZXBpMzIoYSwgYik7CisgICAgICAgIHJlc2EgPSBfbW1fYW5kX3NpMTI4IChjbXAsIGEpOworICAgICAgICByZXNiID0gX21tX2FuZG5vdF9zaTEyOCAoY21wLGIpOworICAgICAgICByZXR1cm4gX21tX29yX3NpMTI4KHJlc2EsIHJlc2IpOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSBfTU1fTUFYX0VQVTE2KF9fbTEyOGkgYSwgX19tMTI4aSBiKQorICAgIHsKKyAgICAgICAgX19tMTI4aSBjODAwMCwgYl9zLCBhX3MsIGNtcDsKKyAgICAgICAgYzgwMDAgPSBfbW1fY21wZXFfZXBpMTYgKGEsYSk7IC8vMHhmZmZmCisgICAgICAgIGM4MDAwID0gX21tX3NsbGlfZXBpMTYgKGM4MDAwLCAxNSk7IC8vMHg4MDAwCisgICAgICAgIGJfcyA9IF9tbV9zdWJfZXBpMTYgKGIsIGM4MDAwKTsKKyAgICAgICAgYV9zID0gX21tX3N1Yl9lcGkxNiAoYSwgYzgwMDApOworICAgICAgICBjbXAgPSBfbW1fY21wZ3RfZXBpMTYgKGFfcywgYl9zKTsgLy9ubyB1bnNpZ25lZCBjb21wYXJpc29uLCBuZWVkIHRvIGdvIHRvIHNpZ25lZAorICAgICAgICBhX3MgPSBfbW1fYW5kX3NpMTI4IChjbXAsYSk7CisgICAgICAgIGJfcyA9IF9tbV9hbmRub3Rfc2kxMjggKGNtcCxiKTsKKyAgICAgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChhX3MsIGJfcyk7CisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBfX20xMjhpIF9NTV9NQVhfRVBVMzIoX19tMTI4aSBhLCBfX20xMjhpIGIpCisgICAgeworICAgICAgICBfX20xMjhpIGM4MDAwMDAwMCwgYl9zLCBhX3MsIGNtcDsKKyAgICAgICAgYzgwMDAwMDAwID0gX21tX2NtcGVxX2VwaTMyIChhLGEpOyAvLzB4ZmZmZmZmZmYKKyAgICAgICAgYzgwMDAwMDAwID0gX21tX3NsbGlfZXBpMzIgKGM4MDAwMDAwMCwgMzEpOyAvLzB4ODAwMDAwMDAKKyAgICAgICAgYl9zID0gX21tX3N1Yl9lcGkzMiAoYiwgYzgwMDAwMDAwKTsKKyAgICAgICAgYV9zID0gX21tX3N1Yl9lcGkzMiAoYSwgYzgwMDAwMDAwKTsKKyAgICAgICAgY21wID0gX21tX2NtcGd0X2VwaTMyIChhX3MsIGJfcyk7IC8vbm8gdW5zaWduZWQgY29tcGFyaXNvbiwgbmVlZCB0byBnbyB0byBzaWduZWQKKyAgICAgICAgYV9zID0gX21tX2FuZF9zaTEyOCAoY21wLGEpOworICAgICAgICBiX3MgPSBfbW1fYW5kbm90X3NpMTI4IChjbXAsYik7CisgICAgICAgIHJldHVybiBfbW1fb3Jfc2kxMjgoYV9zLCBiX3MpOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSBfTU1fTUlOX0VQSTgoX19tMTI4aSBhLCBfX20xMjhpIGIpCisgICAgeworICAgICAgICBfX20xMjhpIGNtcCwgcmVzYSwgcmVzYjsKKyAgICAgICAgY21wID0gX21tX2NtcGd0X2VwaTggKGIsIGEpOworICAgICAgICByZXNhID0gX21tX2FuZF9zaTEyOCAoY21wLCBhKTsKKyAgICAgICAgcmVzYiA9IF9tbV9hbmRub3Rfc2kxMjggKGNtcCxiKTsKKyAgICAgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChyZXNhLCByZXNiKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX01JTl9FUEkzMihfX20xMjhpIGEsIF9fbTEyOGkgYikKKyAgICB7CisgICAgICAgIF9fbTEyOGkgY21wLCByZXNhLCByZXNiOworICAgICAgICBjbXAgPSBfbW1fY21wZ3RfZXBpMzIoYiwgYSk7CisgICAgICAgIHJlc2EgPSBfbW1fYW5kX3NpMTI4IChjbXAsIGEpOworICAgICAgICByZXNiID0gX21tX2FuZG5vdF9zaTEyOCAoY21wLGIpOworICAgICAgICByZXR1cm4gX21tX29yX3NpMTI4KHJlc2EsIHJlc2IpOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSBfTU1fTUlOX0VQVTE2KF9fbTEyOGkgYSwgX19tMTI4aSBiKQorICAgIHsKKyAgICAgICAgX19tMTI4aSBjODAwMCwgYl9zLCBhX3MsIGNtcDsKKyAgICAgICAgYzgwMDAgPSBfbW1fY21wZXFfZXBpMTYgKGEsYSk7IC8vMHhmZmZmCisgICAgICAgIGM4MDAwID0gX21tX3NsbGlfZXBpMTYgKGM4MDAwLCAxNSk7IC8vMHg4MDAwCisgICAgICAgIGJfcyA9IF9tbV9zdWJfZXBpMTYgKGIsIGM4MDAwKTsKKyAgICAgICAgYV9zID0gX21tX3N1Yl9lcGkxNiAoYSwgYzgwMDApOworICAgICAgICBjbXAgPSBfbW1fY21wZ3RfZXBpMTYgKGJfcywgYV9zKTsgLy9ubyB1bnNpZ25lZCBjb21wYXJpc29uLCBuZWVkIHRvIGdvIHRvIHNpZ25lZAorICAgICAgICBhX3MgPSBfbW1fYW5kX3NpMTI4IChjbXAsYSk7CisgICAgICAgIGJfcyA9IF9tbV9hbmRub3Rfc2kxMjggKGNtcCxiKTsKKyAgICAgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChhX3MsIGJfcyk7CisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBfX20xMjhpIF9NTV9NSU5fRVBVMzIoX19tMTI4aSBhLCBfX20xMjhpIGIpCisgICAgeworICAgICAgICBfX20xMjhpIGM4MDAwMDAwMCwgYl9zLCBhX3MsIGNtcDsKKyAgICAgICAgYzgwMDAwMDAwID0gX21tX2NtcGVxX2VwaTMyIChhLGEpOyAvLzB4ZmZmZmZmZmYKKyAgICAgICAgYzgwMDAwMDAwID0gX21tX3NsbGlfZXBpMzIgKGM4MDAwMDAwMCwgMzEpOyAvLzB4ODAwMDAwMDAKKyAgICAgICAgYl9zID0gX21tX3N1Yl9lcGkzMiAoYiwgYzgwMDAwMDAwKTsKKyAgICAgICAgYV9zID0gX21tX3N1Yl9lcGkzMiAoYSwgYzgwMDAwMDAwKTsKKyAgICAgICAgY21wID0gX21tX2NtcGd0X2VwaTMyIChiX3MsIGFfcyk7IC8vbm8gdW5zaWduZWQgY29tcGFyaXNvbiwgbmVlZCB0byBnbyB0byBzaWduZWQKKyAgICAgICAgYV9zID0gX21tX2FuZF9zaTEyOCAoY21wLGEpOworICAgICAgICBiX3MgPSBfbW1fYW5kbm90X3NpMTI4IChjbXAsYik7CisgICAgICAgIHJldHVybiBfbW1fb3Jfc2kxMjgoYV9zLCBiX3MpOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSAgX01NX0JMRU5EVl9FUEk4KF9fbTEyOGkgYSwgX19tMTI4aSBiLCBfX20xMjhpIG1hc2spIC8vdGhpcyBpcyBOT1QgZXhhY3QgaW1wbGVtZW50YXRpb24gb2YgX21tX2JsZW5kdl9lcGk4ICAhISEhISAtIHBsZWFzZSBzZWUgYmVsb3cKKyAgICB7CisgICAgICAgIC8vaXQgYXNzdW1lcyBtYXNrIGlzIGVpdGhlciAweGZmIG9yIDAgIGFsd2F5cyAobGlrZSBpbiBhbGwgdXNlY2FzZXMgYmVsb3cpIHdoaWxlIGZvciB0aGUgb3JpZ2luYWwgX21tX2JsZW5kdl9lcGk4IG9ubHkgTVNCIG1hc2sgYnl0ZSBtYXR0ZXJzLgorICAgICAgICBfX20xMjhpIGFfbWFza2VkLCBiX21hc2tlZDsKKyAgICAgICAgYl9tYXNrZWQgPSBfbW1fYW5kX3NpMTI4IChtYXNrLGIpOyAvL3VzZSBiIGlmIG1hc2sgMHhmZgorICAgICAgICBhX21hc2tlZCA9IF9tbV9hbmRub3Rfc2kxMjggKG1hc2ssYSk7CisgICAgICAgIHJldHVybiBfbW1fb3Jfc2kxMjgoYV9tYXNrZWQsIGJfbWFza2VkKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX1BBQ0tVU19FUEkzMihfX20xMjhpIGEsIF9fbTEyOGkgYikKKyAgICB7CisgICAgICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMzJfZXZlbl9vZGRbMTZdID0geyAwLDEsIDQsNSwgOCw5LCAgMTIsMTMsICAyLDMsIDYsNywxMCwxMSwxNCwxNX07CisgICAgICAgIF9fbTEyOGkgYTE2LCBiMTYsIHJlcywgcmVzaGksY21wLCB6ZXJvOworICAgICAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICAgICAgYTE2ID0gX21tX3NodWZmbGVfZXBpOCAoYSwgKihfX20xMjhpKikgbWFzazhfMzJfZXZlbl9vZGQpOworICAgICAgICBiMTYgPSBfbW1fc2h1ZmZsZV9lcGk4IChiLCAqKF9fbTEyOGkqKSBtYXNrOF8zMl9ldmVuX29kZCk7CisgICAgICAgIHJlcyA9IF9tbV91bnBhY2tsb19lcGk2NChhMTYsIGIxNik7IC8vcmVzdWx0IHdpdGhvdXQgc2F0dXJhdGlvbgorICAgICAgICByZXNoaSA9IF9tbV91bnBhY2toaV9lcGk2NChhMTYsIGIxNik7IC8vaGkgcGFydCBvZiByZXN1bHQgdXNlZCBmb3Igc2F0dXJhdGlvbgorICAgICAgICBjbXAgPSBfbW1fY21wZ3RfZXBpMTYoemVybywgcmVzaGkpOyAvL2lmIGNtcDwwIHRoZSByZXN1bHQgc2hvdWxkIGJlIHplcm8KKyAgICAgICAgcmVzID0gX21tX2FuZG5vdF9zaTEyOChjbXAscmVzKTsgLy9pZiBjbXAgemVybyAtIGRvIG5vdGhpbmcsIG90aGVyd2lzZSBjbXAgPDAgIGFuZCB0aGUgcmVzdWx0IGlzIDAKKyAgICAgICAgY21wID0gX21tX2NtcGd0X2VwaTE2KHJlc2hpLHplcm8pOyAvL2lmIGNtcCBwb3NpdGl2ZQorICAgICAgICByZXR1cm4gX21tX29yX3NpMTI4KHJlcywgY21wKTsgLy9pZiBjbXAgcG9zaXRpdmUgd2UgYXJlIG91dCBvZiAxNmJpdHMgbmVlZCB0byBzYXR1cmFhdGUgdG8gMHhmZmZmCisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBfX20xMjhpIF9NTV9QQUNLVVMxX0VQSTMyKF9fbTEyOGkgYSkKKyAgICB7CisgICAgICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMzJfZXZlbl9vZGRbMTZdID0geyAwLDEsIDQsNSwgOCw5LCAgMTIsMTMsICAyLDMsIDYsNywxMCwxMSwxNCwxNX07CisgICAgICAgIF9fbTEyOGkgYTE2LCByZXMsIHJlc2hpLGNtcCwgemVybzsKKyAgICAgICAgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgICAgIGExNiA9IF9tbV9zaHVmZmxlX2VwaTggKGEsICooX19tMTI4aSopbWFzazhfMzJfZXZlbl9vZGQpOworICAgICAgICByZXNoaSA9IF9tbV91bnBhY2toaV9lcGk2NChhMTYsIGExNik7IC8vaGkgcGFydCBvZiByZXN1bHQgdXNlZCBmb3Igc2F0dXJhdGlvbgorICAgICAgICBjbXAgPSBfbW1fY21wZ3RfZXBpMTYoemVybywgcmVzaGkpOyAvL2lmIGNtcDwwIHRoZSByZXN1bHQgc2hvdWxkIGJlIHplcm8KKyAgICAgICAgcmVzID0gX21tX2FuZG5vdF9zaTEyOChjbXAsIGExNik7IC8vaWYgY21wIHplcm8gLSBkbyBub3RoaW5nLCBvdGhlcndpc2UgY21wIDwwICBhbmQgdGhlIHJlc3VsdCBpcyAwCisgICAgICAgIGNtcCA9IF9tbV9jbXBndF9lcGkxNihyZXNoaSx6ZXJvKTsgLy9pZiBjbXAgcG9zaXRpdmUKKyAgICAgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChyZXMsIGNtcCk7IC8vaWYgY21wIHBvc2l0aXZlIHdlIGFyZSBvdXQgb2YgMTZiaXRzIG5lZWQgdG8gc2F0dXJhYXRlIHRvIDB4ZmZmZgorICAgIH0KKworCisgICAgX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhfX20xMjhpIF9NTV9NVUxMT19FUEkzMihfX20xMjhpIGEsIF9fbTEyOGkgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCisgICAgeworICAgICAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50MzJfdCBhdG1wWzRdLCBidG1wWzRdLCByZXNbNF07CisgICAgICAgIGludDY0X3QgcmVzNjQ7CisgICAgICAgIGludCBpOworICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWJ0bXAsIGIpOworICAgICAgICBmb3IgKGkgPSAwOyBpPDQ7IGkrKykgeworICAgICAgICAgICAgcmVzNjQgPSBhdG1wW2ldICogYnRtcFtpXTsKKyAgICAgICAgICAgIHJlc1tpXSA9IChpbnQpKHJlczY0ICYgMHhmZmZmZmZmZik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSBfTU1fTVVMX0VQSTMyKF9fbTEyOGkgYSwgX19tMTI4aSBiKQorICAgIHsKKyAgICAgICAgX19tMTI4aSBzaWduLCB6ZXJvLCAgbXVsX3VzLCBhX25lZywgYl9uZWcsIG11bF91c19uZWc7CisgICAgICAgIHNpZ24gPSBfbW1feG9yX3NpMTI4IChhLCBiKTsKKyAgICAgICAgc2lnbiA9ICBfbW1fc3JhaV9lcGkzMiAoc2lnbiwgMzEpOyAvL3Byb21vdGUgc2lnbiBiaXQgdG8gYWxsIGZpZWxkcywgYWxsIGZmZiBpZiBuZWdhdGl2ZSBhbmQgYWxsIDAgaWYgcG9zaXRpdmUKKyAgICAgICAgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgICAgIGFfbmVnID0gX21tX2Fic19lcGkzMiAoYSk7IC8vbmVnYXRlIGEgYW5kIGIKKyAgICAgICAgYl9uZWcgPSBfbW1fYWJzX2VwaTMyIChiKTsgLy9uZWdhdGUgYSBhbmQgYgorICAgICAgICBtdWxfdXMgPSBfbW1fbXVsX2VwdTMyIChhX25lZywgYl9uZWcpOyAvL3VzZXMgMCBhbmQgMm5kIGRhdGEgbGFuZXMsIChhYnMpLCB0aGUgbXVsdGlwbGljYXRpb24gZ2l2ZXMgNjQgYml0IHJlc3VsdAorICAgICAgICBtdWxfdXNfbmVnID0gX21tX3N1Yl9lcGk2NCh6ZXJvLCBtdWxfdXMpOworICAgICAgICBtdWxfdXNfbmVnID0gX21tX2FuZF9zaTEyOChzaWduLCBtdWxfdXNfbmVnKTsKKyAgICAgICAgbXVsX3VzID0gX21tX2FuZG5vdF9zaTEyOChzaWduLCBtdWxfdXMpOworICAgICAgICByZXR1cm4gX21tX29yX3NpMTI4IChtdWxfdXMsIG11bF91c19uZWcpOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSBfTU1fQ01QRVFfRVBJNjQoX19tMTI4aSBhLCBfX20xMjhpIGIpCisgICAgeworICAgICAgICBfX20xMjhpIHJlczsKKyAgICAgICAgcmVzID0gX21tX2NtcGVxX2VwaTMyIChhLCBiKTsKKyAgICAgICAgcmV0dXJuIF9tbV9zaHVmZmxlX2VwaTMyIChyZXMsIDEgfCAoMSA8PCAyKSB8ICgzIDw8IDQpIHwgKDMgPDwgNikpOyAvL2NvcHkgdGhlIGluZm9ybWF0aW9uIGZyb20gaGkgdG8gbG93IHBhcnQgb2YgdGhlIDY0IGJpdCBkYXRhCisgICAgfQorI2VuZGlmICAgICAvL1NTRTQKKworLy90aGUgc3BlY2lhbCBjYXNlIG9mIGZ1bmN0aW9ucyB3b3JraW5nIG9ubHkgZm9yIDMyIGJpdHMsIG5vIFNTRTQKK19ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSAgX01NX0lOU0VSVF9FUEk2NF8zMihfX20xMjhpIHZlYywgaW50IHAsIGNvbnN0IGludCBMQU5FKQoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50NjRfdCBwdmVjWzJdID0gezAsMH07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ2NF90IG1hc2tbMl0gPSB7MHhmZmZmZmZmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZmZmZmZ9OworICAgIF9fbTEyOGkgdmVjX21hc2tlZCwgcF9tYXNrZWQ7CisgICAgcHZlY1tMQU5FXSA9IHA7CisgICAgbWFza1tMQU5FXSA9IDB4MDsKKyAgICB2ZWNfbWFza2VkID0gX21tX2FuZF9zaTEyOCAoKihfX20xMjhpKiltYXNrLHZlYyk7IC8vcmVhZHkgZm9yIHAKKyAgICBwX21hc2tlZCA9IF9tbV9hbmRub3Rfc2kxMjggKCooX19tMTI4aSopbWFzaywqKF9fbTEyOGkqKXB2ZWMpOyAvL3JlYWR5IGZvciB2ZWMKKyAgICByZXR1cm4gX21tX29yX3NpMTI4KHZlY19tYXNrZWQsIHBfbWFza2VkKTsKK30KKworX05FT04yU1NFX0lOTElORSBpbnQ2NF90IF9NTV9FWFRSQUNUX0VQSTY0XzMyKF9fbTEyOGkgdmFsLCBjb25zdCBpbnQgTEFORSkKK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50NjRfdCB0bXBbMl07CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKil0bXAsIHZhbCk7CisgICAgcmV0dXJuIHRtcFtMQU5FXTsKK30KKworI2lmbmRlZiBfTkVPTjJTU0VfNjRCSVRfU1NFNAorICAgICNkZWZpbmUgX01NX0lOU0VSVF9FUEk2NCBfTU1fSU5TRVJUX0VQSTY0XzMyCisgICAgI2RlZmluZSBfTU1fRVhUUkFDVF9FUEk2NCBfTU1fRVhUUkFDVF9FUEk2NF8zMgorI2VuZGlmCisKK2ludDMyeDRfdCAgdnFkX3MzMihpbnQzMng0X3QgYSk7IC8vRG91Ymxpbmcgc2F0dXJhdGlvbiBmb3Igc2lnbmVkIGludHMKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90ICB2cWRfczMyKGludDMyeDRfdCBhKQoreworICAgIC8vT3ZlcmZsb3cgaGFwcGVucyBvbmx5IGlmIGEgYW5kIHN1bSBoYXZlIHRoZSBvcHBvc2l0ZSBzaWducworICAgIF9fbTEyOGkgYzdmZmZmZmZmLCByZXMsIHJlc19zYXQsIHJlc194b3JfYTsKKyAgICBjN2ZmZmZmZmYgPSBfbW1fc2V0MV9lcGkzMigweDdmZmZmZmZmKTsKKyAgICByZXMgPSBfbW1fc2xsaV9lcGkzMiAoYSwgMSk7IC8vIHJlcyA9IGEqMgorICAgIHJlc19zYXQgPSBfbW1fc3JsaV9lcGkzMihhLCAzMSk7CisgICAgcmVzX3NhdCA9IF9tbV9hZGRfZXBpMzIocmVzX3NhdCwgYzdmZmZmZmZmKTsKKyAgICByZXNfeG9yX2EgPSBfbW1feG9yX3NpMTI4KHJlcywgYSk7CisgICAgcmVzX3hvcl9hID0gX21tX3NyYWlfZXBpMzIocmVzX3hvcl9hLDMxKTsgLy9wcm9wYWdhdGUgdGhlIHNpZ2ggYml0LCBhbGwgZmZmZiBpZiA8MCBhbGwgb25lcyBvdGhlcndpc2UKKyAgICByZXNfc2F0ID0gX21tX2FuZF9zaTEyOChyZXNfeG9yX2EsIHJlc19zYXQpOworICAgIHJlcyA9IF9tbV9hbmRub3Rfc2kxMjgocmVzX3hvcl9hLCByZXMpOworICAgIHJldHVybiBfbW1fb3Jfc2kxMjgocmVzLCByZXNfc2F0KTsKK30KKworCisvLyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqICBGdW5jdGlvbnMgcmVkZWZpbml0aW9uXGltcGxlbWVudGF0aW4gc3RhcnRzIGhlcmUgKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKworLypJZiB0aGUgdW5pZmllZCBpbnRyaW5zaWNzIHNvbHV0aW9ucyBpcyBuZWNlc3NhcnkgcGxlYXNlIGRlZmluZSB5b3VyIFNTRSBpbnRyaW5zaWNzIHdyYXAgaGVyZSBsaWtlIGluIHRoZSBmb2xsb3dpbmcgc2FtcGxlOgorI2lmZGVmIEFSTQorI2RlZmluZSB2ZWN0b3JfYWRkcV9zMzIgX21tX2FkZF9lcGkzMgorI2Vsc2UgLy9pZiB3ZSBoYXZlIElBCisjZGVmaW5lIHZlY3Rvcl9hZGRxX3MzMiB2YWRkX3MzMgorI2VuZGlmCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbnMgYmVsb3cgYXJlIG9yZ2FuaXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheToKKworRWFjaCBORU9OIGludHJpbnNpYyBmdW5jdGlvbiBoYXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKzEuICBpdHMgeDg2IGZ1bGwgZXF1aXZhbGVudCBTU0UgaW50cmluc2ljIC0gaW4gdGhpcyBjYXNlIHg4NiB2ZXJzaW9uIGp1c3QgZm9sbG93cyB0aGUgTkVPTiBvbmUgdW5kZXIgdGhlIGNvcnJlc3BvbmRpbmcgI2RlZmluZSBzdGF0ZW1lbnQKKzIuICB4ODYgaW1wbGVtZW50YXRpb24gdXNpbmcgbW9yZSB0aGFuIG9uZSB4ODYgaW50cmluc2ljcy4gSW4gdGhpcyBjYXNlIGl0IGlzIHNoYXBlZCBhcyBpbmxpbmVkIEMgZnVuY3Rpb24gd2l0aCByZXR1cm4gc3RhdGVtZW50CiszLiAgdGhlIHJlZmVyZW5jZSB0byB0aGUgTkVPTiBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNhbWUgcmVzdWx0IGFuZCBpbXBsZW1lbnRlZCBpbiB4ODYgYXMgYWJvdmUuIEluIHRoaXMgY2FzZSBpdCBpcyBzaGFwZWQgYXMgbWF0Y2hpbmcgTkVPTiBmdW5jdGlvbiBkZWZpbml0aW9uCis0LiAgZm9yIGFib3V0IDUlIG9mIGZ1bmN0aW9ucyBkdWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgeDg2IFNJTUQgdW5hdmFpbGFiaWxpdHkgb3IgaW5lZmZpY2llbmN5IGluIHRlcm1zIG9mIHBlcmZvcm1hbmNlCit0aGUgc2VyaWFsIGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29tcGlsZXIgd2FybmluZy4gSWYgdGhlc2UgZnVuY3Rpb25zIGFyZSBvbiB5b3VyIGFwcCBjcml0aWNhbCBwYXRoCistIHBsZWFzZSBjb25zaWRlciBzdWNoIGZ1bmN0aW9ucyByZW1vdmFsIGZyb20geW91ciBjb2RlLgorKi8KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKiogICAgICBWZWN0b3IgYWRkICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZhZGRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZBREQuSTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdmFkZF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9hZGRfZXBpOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCitpbnQxNng0X3QgdmFkZF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkFERC5JMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZhZGRfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2FkZF9lcGkxNihfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCitpbnQzMngyX3QgdmFkZF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVkFERC5JMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZhZGRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2FkZF9lcGkzMihfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCitpbnQ2NHgxX3QgIHZhZGRfczY0KGludDY0eDFfdCBhLCAgaW50NjR4MV90IGIpOyAvLyBWQURELkk2NCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgxX3QgIHZhZGRfczY0KGludDY0eDFfdCBhLCAgaW50NjR4MV90IGIpCit7CisgICAgaW50NjR4MV90IHJlczY0OworICAgIHJlczY0Lm02NF9pNjRbMF0gPSBhLm02NF9pNjRbMF0gKyBiLm02NF9pNjRbMF07CisgICAgcmV0dXJuIHJlczY0OworfQorCisKK2Zsb2F0MzJ4Ml90IHZhZGRfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQURELkYzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2YWRkX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKQoreworICAgIF9fbTEyOCByZXM7CisgICAgX19tNjRfMTI4IHJlczY0OworICAgIHJlcyA9IF9tbV9hZGRfcHMoX3BNMTI4KGEpLF9wTTEyOChiKSk7IC8vU1NFLCB1c2Ugb25seSBsb3cgNjQgYml0cworICAgIF9NNjRmKHJlczY0LCByZXMpOworICAgIHJldHVybiByZXM2NDsKK30KKwordWludDh4OF90ICB2YWRkX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZBREQuSTggZDAsZDAsZDAKKyNkZWZpbmUgdmFkZF91OCB2YWRkX3M4CisKK3VpbnQxNng0X3QgIHZhZGRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkFERC5JMTYgZDAsZDAsZDAKKyNkZWZpbmUgdmFkZF91MTYgdmFkZF9zMTYKKwordWludDMyeDJfdCAgdmFkZF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWQURELkkzMiBkMCxkMCxkMAorI2RlZmluZSB2YWRkX3UzMiB2YWRkX3MzMgorCit1aW50NjR4MV90IHZhZGRfdTY0KHVpbnQ2NHgxX3QgYSwgIHVpbnQ2NHgxX3QgYik7IC8vIFZBREQuSTY0IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgxX3QgdmFkZF91NjQodWludDY0eDFfdCBhLCAgdWludDY0eDFfdCBiKQoreworICAgIHVpbnQ2NHgxX3QgcmVzNjQ7CisgICAgcmVzNjQubTY0X3U2NFswXSA9IGEubTY0X3U2NFswXSArIGIubTY0X3U2NFswXTsKKyAgICByZXR1cm4gcmVzNjQ7Cit9CisKKworaW50OHgxNl90ICAgdmFkZHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkFERC5JOCBxMCxxMCxxMAorI2RlZmluZSB2YWRkcV9zOCBfbW1fYWRkX2VwaTgKKworaW50MTZ4OF90ICAgdmFkZHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZBREQuSTE2IHEwLHEwLHEwCisjZGVmaW5lIHZhZGRxX3MxNiBfbW1fYWRkX2VwaTE2CisKK2ludDMyeDRfdCAgIHZhZGRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWQURELkkzMiBxMCxxMCxxMAorI2RlZmluZSB2YWRkcV9zMzIgX21tX2FkZF9lcGkzMgorCitpbnQ2NHgyX3QgICB2YWRkcV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVkFERC5JNjQgcTAscTAscTAKKyNkZWZpbmUgdmFkZHFfczY0IF9tbV9hZGRfZXBpNjQKKworZmxvYXQzMng0X3QgdmFkZHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQURELkYzMiBxMCxxMCxxMAorI2RlZmluZSB2YWRkcV9mMzIgX21tX2FkZF9wcworCit1aW50OHgxNl90ICAgdmFkZHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQURELkk4IHEwLHEwLHEwCisjZGVmaW5lIHZhZGRxX3U4IF9tbV9hZGRfZXBpOAorCit1aW50MTZ4OF90ICAgdmFkZHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkFERC5JMTYgcTAscTAscTAKKyNkZWZpbmUgdmFkZHFfdTE2IF9tbV9hZGRfZXBpMTYKKwordWludDMyeDRfdCAgIHZhZGRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZBREQuSTMyIHEwLHEwLHEwCisjZGVmaW5lIHZhZGRxX3UzMiBfbW1fYWRkX2VwaTMyCisKK3VpbnQ2NHgyX3QgICB2YWRkcV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWQURELkk2NCBxMCxxMCxxMAorI2RlZmluZSB2YWRkcV91NjQgX21tX2FkZF9lcGk2NAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogVmVjdG9yIGxvbmcgYWRkICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqOgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9WYSwgVmIgaGF2ZSBlcXVhbCBsYW5lIHNpemVzLCByZXN1bHQgaXMgYSAxMjggYml0IHZlY3RvciBvZiBsYW5lcyB0aGF0IGFyZSB0d2ljZSB0aGUgd2lkdGguCitpbnQxNng4X3QgIHZhZGRsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQURETC5TOCBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgIHZhZGRsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIC8vIFZBRERMLlM4IHEwLGQwLGQwCit7CisgICAgX19tMTI4aSBhMTYsIGIxNjsKKyAgICBhMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vU1NFNC4xLAorICAgIGIxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGIpKTsgLy9TU0U0LjEsCisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYgKGExNiwgYjE2KTsKK30KKworaW50MzJ4NF90ICB2YWRkbF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkFEREwuUzE2IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCAgdmFkZGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgLy8gVkFEREwuUzE2IHEwLGQwLGQwCit7CisgICAgX19tMTI4aSBhMzIsIGIzMjsKKyAgICBhMzIgPSBfTU1fQ1ZURVBJMTZfRVBJMzIgKF9wTTEyOGkoYSkpOyAvL1NTRTQuMQorICAgIGIzMiA9IF9NTV9DVlRFUEkxNl9FUEkzMiAoX3BNMTI4aShiKSk7IC8vU1NFNC4xCisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMzIgKGEzMiwgYjMyKTsKK30KKworaW50NjR4Ml90ICB2YWRkbF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVkFEREwuUzMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCAgdmFkZGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgLy8gVkFEREwuUzMyIHEwLGQwLGQwCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwKKyAgICBfX20xMjhpIGE2NCwgYjY0OworICAgIGE2NCA9IF9NTV9DVlRFUEkzMl9FUEk2NCAoX3BNMTI4aShhKSk7IC8vU1NFNC4xCisgICAgYjY0ID0gX01NX0NWVEVQSTMyX0VQSTY0IChfcE0xMjhpKGIpKTsgLy9TU0U0LjEKKyAgICByZXR1cm4gX21tX2FkZF9lcGk2NCAoIGE2NCwgYjY0KTsKK30KKwordWludDE2eDhfdCB2YWRkbF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQURETC5VOCBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZhZGRsX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgLy8gVkFEREwuVTggcTAsZDAsZDAKK3sKKyAgICBfX20xMjhpIGExNiwgYjE2OworICAgIGExNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGEpKTsgLy9TU0U0LjEKKyAgICBiMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoX3BNMTI4aShiKSk7IC8vU1NFNC4xCisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYgKGExNiwgYjE2KTsKK30KKwordWludDMyeDRfdCB2YWRkbF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWQURETC5zMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2YWRkbF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIC8vIFZBRERMLnMxNiBxMCxkMCxkMAoreworICAgIF9fbTEyOGkgYTMyLCBiMzI7CisgICAgYTMyID0gX01NX0NWVEVQVTE2X0VQSTMyIChfcE0xMjhpKGEpKTsgLy9TU0U0LjEKKyAgICBiMzIgPSBfTU1fQ1ZURVBVMTZfRVBJMzIgKF9wTTEyOGkoYikpOyAvL1NTRTQuMQorICAgIHJldHVybiBfbW1fYWRkX2VwaTMyIChhMzIsIGIzMik7Cit9CisKK3VpbnQ2NHgyX3QgdmFkZGxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkFEREwuVTMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3QgdmFkZGxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSAvLyBWQURETC5VMzIgcTAsZDAsZDAKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbAorICAgIF9fbTEyOGkgYTY0LCBiNjQ7CisgICAgYTY0ID0gX01NX0NWVEVQVTMyX0VQSTY0IChfcE0xMjhpKGEpKTsgLy9TU0U0LjEKKyAgICBiNjQgPSBfTU1fQ1ZURVBVMzJfRVBJNjQgKF9wTTEyOGkoYikpOyAvL1NTRTQuMQorICAgIHJldHVybiBfbW1fYWRkX2VwaTY0IChhNjQsIGI2NCk7Cit9CisKKy8vKioqKioqKioqKioqKioqICAgVmVjdG9yIHdpZGUgYWRkOiB2YWRkd188dHlwZT4uIFZyW2ldOj1WYVtpXStWYltpXSAqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MTZ4OF90ICB2YWRkd19zOChpbnQxNng4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZBRERXLlM4IHEwLHEwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCAgdmFkZHdfczgoaW50MTZ4OF90IGEsIGludDh4OF90IGIpIC8vIFZBRERXLlM4IHEwLHEwLGQwCit7CisgICAgX19tMTI4aSBiMTY7CisgICAgYjE2ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYikpOyAvL1NTRTQuMSwKKyAgICByZXR1cm4gX21tX2FkZF9lcGkxNiAoYSwgYjE2KTsKK30KKworaW50MzJ4NF90ICB2YWRkd19zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkFERFcuUzE2IHEwLHEwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCAgdmFkZHdfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYikgLy8gVkFERFcuUzE2IHEwLHEwLGQwCit7CisgICAgX19tMTI4aSBiMzI7CisgICAgYjMyID0gIF9NTV9DVlRFUEkxNl9FUEkzMihfcE0xMjhpKGIpKTsgLy9TU0U0LjEsCisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMzIgKGEsIGIzMik7Cit9CisKK2ludDY0eDJfdCAgdmFkZHdfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZBRERXLlMzMiBxMCxxMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgIHZhZGR3X3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIpIC8vIFZBRERXLlMzMiBxMCxxMCxkMAoreworICAgIF9fbTEyOGkgYjY0OworICAgIGI2NCA9IF9NTV9DVlRFUEkzMl9FUEk2NCAoX3BNMTI4aShiKSk7IC8vU1NFNC4xCisgICAgcmV0dXJuIF9tbV9hZGRfZXBpNjQgKGEsIGI2NCk7Cit9CisKK3VpbnQxNng4X3QgdmFkZHdfdTgodWludDE2eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZBRERXLlU4IHEwLHEwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdmFkZHdfdTgodWludDE2eDhfdCBhLCB1aW50OHg4X3QgYikgLy8gVkFERFcuVTggcTAscTAsZDAKK3sKKyAgICBfX20xMjhpIGIxNjsKKyAgICBiMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoX3BNMTI4aShiKSk7IC8vU1NFNC4xCisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYgKGEsIGIxNik7Cit9CisKK3VpbnQzMng0X3QgdmFkZHdfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkFERFcuczE2IHEwLHEwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmFkZHdfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiKSAvLyBWQUREVy5zMTYgcTAscTAsZDAKK3sKKyAgICBfX20xMjhpIGIzMjsKKyAgICBiMzIgPSBfTU1fQ1ZURVBVMTZfRVBJMzIgKF9wTTEyOGkoYikpOyAvL1NTRTQuMQorICAgIHJldHVybiBfbW1fYWRkX2VwaTMyIChhLCBiMzIpOworfQorCit1aW50NjR4Ml90IHZhZGR3X3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZBRERXLlUzMiBxMCxxMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50NjR4Ml90IHZhZGR3X3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYikgLy8gVkFERFcuVTMyIHEwLHEwLGQwCit7CisgICAgX19tMTI4aSBiNjQ7CisgICAgYjY0ID0gX01NX0NWVEVQVTMyX0VQSTY0IChfcE0xMjhpKGIpKTsgLy9TU0U0LjEKKyAgICByZXR1cm4gX21tX2FkZF9lcGk2NCAoYSwgYjY0KTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKipWZWN0b3IgaGFsdmluZyBhZGQ6IHZoYWRkIC0+IFZyW2ldOj0oVmFbaV0rVmJbaV0pPj4xICwgIHJlc3VsdCB0cnVuY2F0ZWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2aGFkZF9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYik7IC8vIFZIQURELlM4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZoYWRkX3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KHZoYWRkcV91OChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKworaW50MTZ4NF90IHZoYWRkX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKTsgLy8gVkhBREQuUzE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2aGFkZF9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoIHZoYWRkcV9zMTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK2ludDMyeDJfdCB2aGFkZF9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYik7IC8vIFZIQURELlMzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdmhhZGRfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KCB2aGFkZHFfczMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50OHg4X3QgdmhhZGRfdTgodWludDh4OF90IGEsICB1aW50OHg4X3QgYik7IC8vIFZIQURELncgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZoYWRkX3U4KHVpbnQ4eDhfdCBhLCAgdWludDh4OF90IGIpCit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KCB2aGFkZHFfdTgoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQxNng0X3QgdmhhZGRfdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYik7IC8vIFZIQURELnMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZoYWRkX3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIpCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCggdmhhZGRxX3UxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCB2aGFkZF91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiKTsgLy8gVkhBREQuVTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdmhhZGRfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KCB2aGFkZHFfdTMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCitpbnQ4eDE2X3QgdmhhZGRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZIQURELlM4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCB2aGFkZHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKQoreworICAgIC8vbmVlZCB0byBhdm9pZCBpbnRlcm5hbCBvdmVyZmxvdywgd2lsbCB1c2UgdGhlICh4JnkpKygoeF55KT4+MSkuCisgICAgX19tMTI4aSB0bXAxLCB0bXAyOworICAgIHRtcDEgPSBfbW1fYW5kX3NpMTI4KGEsYik7CisgICAgdG1wMiA9IF9tbV94b3Jfc2kxMjgoYSxiKTsKKyAgICB0bXAyID0gdnNocnFfbl9zOCh0bXAyLDEpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTgodG1wMSx0bXAyKTsKK30KKworaW50MTZ4OF90IHZoYWRkcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkhBREQuUzEgNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdmhhZGRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpCit7CisgICAgLy9uZWVkIHRvIGF2b2lkIGludGVybmFsIG92ZXJmbG93LCB3aWxsIHVzZSB0aGUgKHgmeSkrKCh4XnkpPj4xKS4KKyAgICBfX20xMjhpIHRtcDEsIHRtcDI7CisgICAgdG1wMSA9IF9tbV9hbmRfc2kxMjgoYSxiKTsKKyAgICB0bXAyID0gX21tX3hvcl9zaTEyOChhLGIpOworICAgIHRtcDIgPSBfbW1fc3JhaV9lcGkxNih0bXAyLDEpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTE2KHRtcDEsdG1wMik7Cit9CisKK2ludDMyeDRfdCB2aGFkZHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZIQURELlMzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdmhhZGRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIC8vIFZIQURELlMzMiBxMCxxMCxxMAoreworICAgIC8vbmVlZCB0byBhdm9pZCBpbnRlcm5hbCBvdmVyZmxvdywgd2lsbCB1c2UgdGhlICh4JnkpKygoeF55KT4+MSkuCisgICAgX19tMTI4aSB0bXAxLCB0bXAyOworICAgIHRtcDEgPSBfbW1fYW5kX3NpMTI4KGEsYik7CisgICAgdG1wMiA9IF9tbV94b3Jfc2kxMjgoYSxiKTsKKyAgICB0bXAyID0gX21tX3NyYWlfZXBpMzIodG1wMiwxKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkzMih0bXAxLHRtcDIpOworfQorCit1aW50OHgxNl90IHZoYWRkcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZIQURELlU4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3QgdmhhZGRxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKSAvLyBWSEFERC5VOCBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgYzEsIHN1bSwgcmVzOworICAgIGMxID0gX21tX3NldDFfZXBpOCgxKTsKKyAgICBzdW0gPSBfbW1fYXZnX2VwdTgoYSwgYik7IC8vcmVzdWx0IGlzIHJvdW5kZWQsIG5lZWQgdG8gY29tcGVuc2F0ZSBpdAorICAgIHJlcyA9IF9tbV94b3Jfc2kxMjgoYSwgYik7IC8vZm9yIHJvdW5kaW5nIGNvbXBlbnNhdGlvbgorICAgIHJlcyA9IF9tbV9hbmRfc2kxMjgocmVzLGMxKTsgLy9mb3Igcm91bmRpbmcgY29tcGVuc2F0aW9uCisgICAgcmV0dXJuIF9tbV9zdWJfZXBpOCAoc3VtLCByZXMpOyAvL2FjdHVhbCByb3VuZGluZyBjb21wZW5zYXRpb24KK30KKwordWludDE2eDhfdCB2aGFkZHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkhBREQuczE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdmhhZGRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgLy8gVkhBREQuczE2IHEwLHEwLHEwCit7CisgICAgX19tMTI4aSBzdW0sIHJlczsKKyAgICBzdW0gPSBfbW1fYXZnX2VwdTE2KGEsIGIpOyAvL3Jlc3VsdCBpcyByb3VuZGVkLCBuZWVkIHRvIGNvbXBlbnNhdGUgaXQKKyAgICByZXMgPSBfbW1feG9yX3NpMTI4KGEsIGIpOyAvL2ZvciByb3VuZGluZyBjb21wZW5zYXRpb24KKyAgICByZXMgPSBfbW1fc2xsaV9lcGkxNiAocmVzLDE1KTsgLy9zaGlmdCBsZWZ0ICB0aGVuIGJhY2sgcmlnaHQgdG8KKyAgICByZXMgPSBfbW1fc3JsaV9lcGkxNiAocmVzLDE1KTsgLy9nZXQgMSBvciB6ZXJvCisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMTYgKHN1bSwgcmVzKTsgLy9hY3R1YWwgcm91bmRpbmcgY29tcGVuc2F0aW9uCit9CisKK3VpbnQzMng0X3QgdmhhZGRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZIQURELlUzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZoYWRkcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIC8vIFZIQURELlUzMiBxMCxxMCxxMAoreworICAgIC8vbmVlZCB0byBhdm9pZCBpbnRlcm5hbCBvdmVyZmxvdywgd2lsbCB1c2UgdGhlICh4JnkpKygoeF55KT4+MSkuCisgICAgX19tMTI4aSB0bXAxLCB0bXAyOworICAgIHRtcDEgPSBfbW1fYW5kX3NpMTI4KGEsYik7CisgICAgdG1wMiA9IF9tbV94b3Jfc2kxMjgoYSxiKTsKKyAgICB0bXAyID0gX21tX3NybGlfZXBpMzIodG1wMiwxKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkzMih0bXAxLHRtcDIpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKlZlY3RvciByb3VuZGluZyBoYWx2aW5nIGFkZDogdnJoYWRke3F9Xzx0eXBlPi4gVnJbaV06PShWYVtpXStWYltpXSsxKT4+MSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdnJoYWRkX3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiKTsgLy8gVlJIQURELlM4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZyaGFkZF9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYikKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NCh2cmhhZGRxX3M4KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCitpbnQxNng0X3QgdnJoYWRkX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKTsgLy8gVlJIQURELlMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnJoYWRkX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2cmhhZGRxX3MxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKworaW50MzJ4Ml90IHZyaGFkZF9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYik7IC8vIFZSSEFERC5TMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZyaGFkZF9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnJoYWRkcV9zMzIoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQ4eDhfdCB2cmhhZGRfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlJIQURELlU4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2cmhhZGRfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKQoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fYXZnX2VwdTgoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7IC8vU1NFLCByZXN1bHQgcm91bmRpbmchISEKK30KKworCit1aW50MTZ4NF90IHZyaGFkZF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWUkhBREQuczE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnJoYWRkX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9hdmdfZXB1MTYoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7IC8vU1NFLCByZXN1bHQgcm91bmRpbmchISEKK30KKworCit1aW50MzJ4Ml90IHZyaGFkZF91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiKTsgLy8gVlJIQURELlUzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZyaGFkZF91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiKQoreworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnJoYWRkcV91MzIoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK2ludDh4MTZfdCAgdnJoYWRkcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWUkhBREQuUzggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90ICB2cmhhZGRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgLy8gVlJIQURELlM4IHEwLHEwLHEwCit7CisgICAgLy9ubyBzaWduZWQgYXZlcmFnZSBpbiB4ODYgU0lNRCwgZ28gdG8gdW5zaWduZWQKKyAgICBfX20xMjhpIGMxMjgsIGF1LCBidSwgc3VtOworICAgIGMxMjggPSBfbW1fc2V0MV9lcGk4KDB4ODApOyAvLy0xMjgKKyAgICBhdSA9IF9tbV9zdWJfZXBpOChhLCBjMTI4KTsgLy9hZGQgMTI4CisgICAgYnUgPSBfbW1fc3ViX2VwaTgoYiwgYzEyOCk7IC8vYWRkIDEyOAorICAgIHN1bSA9IF9tbV9hdmdfZXB1OChhdSwgYnUpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTggKHN1bSwgYzEyOCk7IC8vc3ViIDEyOAorfQorCitpbnQxNng4X3QgIHZyaGFkZHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZSSEFERC5TMTYgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90ICB2cmhhZGRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZSSEFERC5TMTYgcTAscTAscTAKK3sKKyAgICAvL25vIHNpZ25lZCBhdmVyYWdlIGluIHg4NiBTSU1ELCBnbyB0byB1bnNpZ25lZAorICAgIF9fbTEyOGkgY3g4MDAwLCBhdSwgYnUsIHN1bTsKKyAgICBjeDgwMDAgPSBfbW1fc2V0MV9lcGkxNigweDgwMDApOyAvLyAtIDMyNzY4CisgICAgYXUgPSBfbW1fc3ViX2VwaTE2KGEsIGN4ODAwMCk7IC8vYWRkIDMyNzY4CisgICAgYnUgPSBfbW1fc3ViX2VwaTE2KGIsIGN4ODAwMCk7IC8vYWRkIDMyNzY4CisgICAgc3VtID0gX21tX2F2Z19lcHUxNihhdSwgYnUpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTE2IChzdW0sIGN4ODAwMCk7IC8vc3ViIDMyNzY4Cit9CisKK2ludDMyeDRfdCAgdnJoYWRkcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlJIQURELlMzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgIHZyaGFkZHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikKK3sKKyAgICAvL25lZWQgdG8gYXZvaWQgb3ZlcmZsb3cKKyAgICBfX20xMjhpIGEyLCBiMiwgcmVzLCBzdW07CisgICAgYTIgPSBfbW1fc3JhaV9lcGkzMihhLDEpOyAvL2EyPWEvMjsKKyAgICBiMiA9IF9tbV9zcmFpX2VwaTMyKGIsMSk7IC8vIGIyPWIvMjsKKyAgICByZXMgPSBfbW1fb3Jfc2kxMjgoYSxiKTsgLy9mb3Igcm91bmRpbmcKKyAgICByZXMgPSBfbW1fc2xsaV9lcGkzMiAocmVzLDMxKTsgLy9zaGlmdCBsZWZ0ICB0aGVuIGJhY2sgcmlnaHQgdG8KKyAgICByZXMgPSBfbW1fc3JsaV9lcGkzMiAocmVzLDMxKTsgLy9nZXQgMSBvciB6ZXJvCisgICAgc3VtID0gX21tX2FkZF9lcGkzMihhMixiMik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMzIoc3VtLHJlcyk7Cit9CisKK3VpbnQ4eDE2X3QgICB2cmhhZGRxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVlJIQURELlU4IHEwLHEwLHEwCisjZGVmaW5lIHZyaGFkZHFfdTggX21tX2F2Z19lcHU4IC8vU1NFMiwgcmVzdWx0cyByb3VuZGVkCisKK3VpbnQxNng4X3QgICB2cmhhZGRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZSSEFERC5zMTYgcTAscTAscTAKKyNkZWZpbmUgdnJoYWRkcV91MTYgX21tX2F2Z19lcHUxNiAvL1NTRTIsIHJlc3VsdHMgcm91bmRlZAorCisKK3VpbnQzMng0X3QgdnJoYWRkcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWUkhBREQuVTMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdnJoYWRkcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIC8vIFZSSEFERC5VMzIgcTAscTAscTAKK3sKKyAgICAvL25lZWQgdG8gYXZvaWQgb3ZlcmZsb3cKKyAgICBfX20xMjhpIGEyLCBiMiwgcmVzLCBzdW07CisgICAgYTIgPSBfbW1fc3JsaV9lcGkzMihhLDEpOyAvL2EyPWEvMjsKKyAgICBiMiA9IF9tbV9zcmxpX2VwaTMyKGIsMSk7IC8vIGIyPWIvMjsKKyAgICByZXMgPSBfbW1fb3Jfc2kxMjgoYSxiKTsgLy9mb3Igcm91bmRpbmcKKyAgICByZXMgPSBfbW1fc2xsaV9lcGkzMiAocmVzLDMxKTsgLy9zaGlmdCBsZWZ0ICB0aGVuIGJhY2sgcmlnaHQgdG8KKyAgICByZXMgPSBfbW1fc3JsaV9lcGkzMiAocmVzLDMxKTsgLy9nZXQgMSBvciB6ZXJvCisgICAgc3VtID0gX21tX2FkZF9lcGkzMihhMixiMik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMzIoc3VtLHJlcyk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqIFZRQUREOiBWZWN0b3Igc2F0dXJhdGluZyBhZGQgKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdnFhZGRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZRQURELlM4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZxYWRkX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2FkZHNfZXBpOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCitpbnQxNng0X3QgdnFhZGRfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZRQURELlMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnFhZGRfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2FkZHNfZXBpMTYoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKworaW50MzJ4Ml90IHZxYWRkX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiKTsgLy8gVlFBREQuUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cWFkZF9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnFhZGRxX3MzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKworaW50NjR4MV90ICB2cWFkZF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlFBREQuUzY0IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDFfdCB2cWFkZF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBpbnQ2NHgxX3QgcmVzOworICAgIHVpbnQ2NF90IGE2NCwgYjY0OworICAgIGE2NCA9IGEubTY0X3U2NFswXTsKKyAgICBiNjQgPSBiLm02NF91NjRbMF07CisgICAgcmVzLm02NF91NjRbMF0gPSBhNjQgKyBiNjQ7CisgICAgYTY0ID0gKGE2NCA+PiA2MykgKyAofl9TSUdOQklUNjQpOworICAgIGlmICgoaW50NjRfdCkoKGI2NCBeIGE2NCkgfCB+KHJlcy5tNjRfdTY0WzBdIF4gYjY0KSk+PTApIHsKKyAgICAgICAgcmVzLm02NF91NjRbMF0gPSBhNjQ7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2cWFkZF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWUUFERC5VOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnFhZGRfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKQoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fYWRkc19lcHU4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQxNng0X3QgdnFhZGRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlFBREQuczE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnFhZGRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKQoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2FkZHNfZXB1MTYoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCB2cWFkZF91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiKTsgLy8gVlFBREQuVTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnFhZGRfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZxYWRkcV91MzIoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQ2NHgxX3QgdnFhZGRfdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKTsgLy8gVlFBREQuVTY0IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ2NHgxX3QgdnFhZGRfdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDY0X3QgYTY0LCBiNjQ7CisgICAgdWludDY0eDFfdCByZXM7CisgICAgYTY0ID0gYS5tNjRfdTY0WzBdOworICAgIGI2NCA9IGIubTY0X3U2NFswXTsKKyAgICByZXMubTY0X3U2NFswXSA9IGE2NCArIGI2NDsKKyAgICBpZiAocmVzLm02NF91NjRbMF0gPCBhNjQpIHsKKyAgICAgICAgcmVzLm02NF91NjRbMF0gPSB+KHVpbnQ2NF90KTA7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2ludDh4MTZfdCAgIHZxYWRkcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWUUFERC5TOCBxMCxxMCxxMAorI2RlZmluZSB2cWFkZHFfczggX21tX2FkZHNfZXBpOAorCitpbnQxNng4X3QgICB2cWFkZHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZRQURELlMxNiBxMCxxMCxxMAorI2RlZmluZSB2cWFkZHFfczE2IF9tbV9hZGRzX2VwaTE2CisKK2ludDMyeDRfdCAgdnFhZGRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUUFERC5TMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90ICB2cWFkZHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikKK3sKKyAgICAvL25vIGNvcnJlc3BvbmRpbmcgeDg2IFNJTUQgc291bHV0aW9uLCBzcGVjaWFsIHRyaWNrcyBhcmUgbmVjZXNzYXJ5LiBPdmVyZmxvdyBoYXBwZW5zIG9ubHkgaWYgYSBhbmQgYiBoYXZlIHRoZSBzYW1lIHNpZ24gYW5kIHN1bSBoYXMgdGhlIG9wcG9zaXRlIHNpZ24KKyAgICBfX20xMjhpIGM3ZmZmZmZmZiwgcmVzLCByZXNfc2F0LCByZXNfeG9yX2EsIGJfeG9yX2FfOworICAgIGM3ZmZmZmZmZiA9IF9tbV9zZXQxX2VwaTMyKDB4N2ZmZmZmZmYpOworICAgIHJlcyA9IF9tbV9hZGRfZXBpMzIoYSwgYik7CisgICAgcmVzX3NhdCA9IF9tbV9zcmxpX2VwaTMyKGEsIDMxKTsKKyAgICByZXNfc2F0ID0gX21tX2FkZF9lcGkzMihyZXNfc2F0LCBjN2ZmZmZmZmYpOworICAgIHJlc194b3JfYSA9IF9tbV94b3Jfc2kxMjgocmVzLCBhKTsKKyAgICBiX3hvcl9hXyA9IF9tbV94b3Jfc2kxMjgoYiwgYSk7CisgICAgcmVzX3hvcl9hID0gX21tX2FuZG5vdF9zaTEyOChiX3hvcl9hXywgcmVzX3hvcl9hKTsKKyAgICByZXNfeG9yX2EgPSBfbW1fc3JhaV9lcGkzMihyZXNfeG9yX2EsMzEpOyAvL3Byb3BhZ2F0ZSB0aGUgc2lnaCBiaXQsIGFsbCBmZmZmIGlmIDwwIGFsbCBvbmVzIG90aGVyd2lzZQorICAgIHJlc19zYXQgPSBfbW1fYW5kX3NpMTI4KHJlc194b3JfYSwgcmVzX3NhdCk7CisgICAgcmVzID0gX21tX2FuZG5vdF9zaTEyOChyZXNfeG9yX2EsIHJlcyk7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChyZXMsIHJlc19zYXQpOworfQorCitpbnQ2NHgyX3QgIHZxYWRkcV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlFBREQuUzY0IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDJfdCB2cWFkZHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ2NF90IGF0bXBbMl0sIGJ0bXBbMl0sIHJlc1syXTsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYnRtcCwgYik7CisgICAgcmVzWzBdID0gYXRtcFswXSArIGJ0bXBbMF07CisgICAgcmVzWzFdID0gYXRtcFsxXSArIGJ0bXBbMV07CisKKyAgICBhdG1wWzBdID0gKGF0bXBbMF0gPj4gNjMpICsgKH5fU0lHTkJJVDY0KTsKKyAgICBhdG1wWzFdID0gKGF0bXBbMV0gPj4gNjMpICsgKH5fU0lHTkJJVDY0KTsKKworICAgIGlmICgoaW50NjRfdCkoKGJ0bXBbMF0gXiBhdG1wWzBdKSB8IH4ocmVzWzBdIF4gYnRtcFswXSkpPj0wKSB7CisgICAgICAgIHJlc1swXSA9IGF0bXBbMF07CisgICAgfQorICAgIGlmICgoaW50NjRfdCkoKGJ0bXBbMV0gXiBhdG1wWzFdKSB8IH4ocmVzWzFdIF4gYnRtcFsxXSkpPj0wKSB7CisgICAgICAgIHJlc1sxXSA9IGF0bXBbMV07CisgICAgfQorICAgIHJldHVybiBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopcmVzKTsKK30KKwordWludDh4MTZfdCAgIHZxYWRkcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZRQURELlU4IHEwLHEwLHEwCisjZGVmaW5lIHZxYWRkcV91OCBfbW1fYWRkc19lcHU4CisKK3VpbnQxNng4X3QgICB2cWFkZHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlFBREQuczE2IHEwLHEwLHEwCisjZGVmaW5lIHZxYWRkcV91MTYgX21tX2FkZHNfZXB1MTYKKwordWludDMyeDRfdCB2cWFkZHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlFBREQuVTMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdnFhZGRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikKK3sKKyAgICBfX20xMjhpIGM4MDAwMDAwMCwgY21wLCBzdWJzdW0sIHN1YmEsIHN1bTsKKyAgICBjODAwMDAwMDAgPSBfbW1fc2V0MV9lcGkzMiAoMHg4MDAwMDAwMCk7CisgICAgc3VtID0gX21tX2FkZF9lcGkzMiAoYSwgYik7CisgICAgc3Vic3VtID0gX21tX3N1Yl9lcGkzMiAoc3VtLCBjODAwMDAwMDApOworICAgIHN1YmEgPSBfbW1fc3ViX2VwaTMyIChhLCBjODAwMDAwMDApOworICAgIGNtcCA9IF9tbV9jbXBndF9lcGkzMiAoIHN1YmEsIHN1YnN1bSk7IC8vbm8gdW5zaWduZWQgY29tcGFyaXNvbiwgbmVlZCB0byBnbyB0byBzaWduZWQKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChzdW0sIGNtcCk7IC8vc2F0dXJhdGlvbgorfQorCit1aW50NjR4Ml90IHZxYWRkcV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWUUFERC5VNjQgcTAscTAscTAKKyNpZmRlZiBVU0VfU1NFNAorICAgIF9ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2cWFkZHFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKQorICAgIHsKKyAgICAgICAgX19tMTI4aSBjODAwMDAwMDAsIHN1bSwgY21wLCBzdWJhLCBzdWJzdW07CisgICAgICAgIGM4MDAwMDAwMCA9IF9tbV9zZXRfZXBpMzIgKDB4ODAwMDAwMDAsIDB4MCwgMHg4MDAwMDAwMCwgMHgwKTsKKyAgICAgICAgc3VtID0gX21tX2FkZF9lcGk2NCAoYSwgYik7CisgICAgICAgIHN1YnN1bSA9IF9tbV9zdWJfZXBpNjQgKHN1bSwgYzgwMDAwMDAwKTsKKyAgICAgICAgc3ViYSA9IF9tbV9zdWJfZXBpNjQgKGEsIGM4MDAwMDAwMCk7CisgICAgICAgIGNtcCA9IF9tbV9jbXBndF9lcGk2NCAoIHN1YmEsIHN1YnN1bSk7IC8vbm8gdW5zaWduZWQgY29tcGFyaXNvbiwgbmVlZCB0byBnbyB0byBzaWduZWQsIFNTRTQuMiEhIQorICAgICAgICByZXR1cm4gX21tX29yX3NpMTI4IChzdW0sIGNtcCk7IC8vc2F0dXJhdGlvbgorICAgIH0KKyNlbHNlCisgICAgX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50NjR4Ml90IHZxYWRkcV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQorICAgIHsKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ2NF90IGF0bXBbMl0sIGJ0bXBbMl0sIHJlc1syXTsKKyAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsKKyAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilidG1wLCBiKTsKKyAgICAgICAgcmVzWzBdID0gYXRtcFswXSArIGJ0bXBbMF07CisgICAgICAgIHJlc1sxXSA9IGF0bXBbMV0gKyBidG1wWzFdOworICAgICAgICBpZiAocmVzWzBdIDwgYXRtcFswXSkgcmVzWzBdID0gfih1aW50NjRfdCkwOworICAgICAgICBpZiAocmVzWzFdIDwgYXRtcFsxXSkgcmVzWzFdID0gfih1aW50NjRfdCkwOworICAgICAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShyZXMpKTsKKyAgICB9CisjZW5kaWYKKworCisvLyoqKioqKioqKioqKioqKioqKiogVmVjdG9yIGFkZCBoaWdoIGhhbGYgKHRydW5jYXRlZCkgICoqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90ICAgdmFkZGhuX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWQURESE4uSTE2IGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90ICAgdmFkZGhuX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZBRERITi5JMTYgZDAscTAscTAKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1bTsKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTE2IChhLCBiKTsKKyAgICBzdW0gPSBfbW1fc3JhaV9lcGkxNiAoc3VtLCA4KTsKKyAgICBzdW0gPSBfbW1fcGFja3NfZXBpMTYgKHN1bSwgc3VtKTsgLy91c2UgNjQgbG93IGJpdHMgb25seQorICAgIHJldHVybjY0KHN1bSk7Cit9CisKK2ludDE2eDRfdCAgdmFkZGhuX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWQURESE4uSTMyIGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCAgdmFkZGhuX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIC8vIFZBRERITi5JMzIgZDAscTAscTAKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdW07CisgICAgc3VtID0gX21tX2FkZF9lcGkzMiAoYSwgYik7CisgICAgc3VtID0gX21tX3NyYWlfZXBpMzIoc3VtLCAxNik7CisgICAgc3VtID0gX21tX3BhY2tzX2VwaTMyIChzdW0sIHN1bSk7IC8vdXNlIDY0IGxvdyBiaXRzIG9ubHkKKyAgICByZXR1cm42NChzdW0pOworfQorCitpbnQzMngyX3QgIHZhZGRobl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVkFEREhOLkk2NCBkMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgIHZhZGRobl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1bTsKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTY0IChhLCBiKTsKKyAgICBzdW0gPSBfbW1fc2h1ZmZsZV9lcGkzMihzdW0sICAxIHwgKDMgPDwgMikgfCAoMCA8PCA0KSB8ICgyIDw8IDYpKTsKKyAgICByZXR1cm42NChzdW0pOworfQorCit1aW50OHg4X3QgIHZhZGRobl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWQURESE4uSTE2IGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCAgdmFkZGhuX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgLy8gVkFEREhOLkkxNiBkMCxxMCxxMAoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1bTsKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTE2IChhLCBiKTsKKyAgICBzdW0gPSBfbW1fc3JsaV9lcGkxNiAoc3VtLCA4KTsKKyAgICBzdW0gPSBfbW1fcGFja3VzX2VwaTE2IChzdW0sc3VtKTsgLy91c2UgNjQgbG93IGJpdHMgb25seQorICAgIHJldHVybjY0KHN1bSk7Cit9CisKK3VpbnQxNng0X3QgdmFkZGhuX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZBRERITi5JMzIgZDAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2YWRkaG5fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSAvLyBWQURESE4uSTMyIGQwLHEwLHEwCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1bTsKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTMyIChhLCBiKTsKKyAgICBzdW0gPSBfbW1fc3JsaV9lcGkzMiAoc3VtLCAxNik7CisgICAgc3VtID0gX01NX1BBQ0tVUzFfRVBJMzIgKHN1bSk7IC8vdXNlIDY0IGxvdyBiaXRzIG9ubHkKKyAgICByZXR1cm42NChzdW0pOworfQorCit1aW50MzJ4Ml90IHZhZGRobl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWQURESE4uSTY0IGQwLHEwLHEwCisjZGVmaW5lIHZhZGRobl91NjQgdmFkZGhuX3M2NAorCisvLyoqKioqKioqKioqIFZlY3RvciByb3VuZGluZyBhZGQgaGlnaCBoYWxmOiB2cmFkZGhuXzx0eXBlPiAqKioqKioqKioqKioqKioqKiouCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgICB2cmFkZGhuX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUkFEREhOLkkxNiBkMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCAgIHZyYWRkaG5fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgLy8gVlJBRERITi5JMTYgZDAscTAscTAKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1bSwgbWFzazE7CisgICAgc3VtID0gX21tX2FkZF9lcGkxNiAoYSwgYik7CisgICAgbWFzazEgPSBfbW1fc2xsaV9lcGkxNihzdW0sIDkpOyAvL3NoaWZ0IGxlZnQgdGhlbiBiYWNrIHJpZ2h0IHRvCisgICAgbWFzazEgPSBfbW1fc3JsaV9lcGkxNihtYXNrMSwgMTUpOyAvL2dldCAgNy10aCBiaXQgMSBvciB6ZXJvCisgICAgc3VtID0gX21tX3NyYWlfZXBpMTYgKHN1bSwgOCk7IC8vZ2V0IGhpZ2ggaGFsZgorICAgIHN1bSA9IF9tbV9hZGRfZXBpMTYgKHN1bSwgbWFzazEpOyAvL2FjdHVhbCByb3VuZGluZworICAgIHN1bSA9IF9tbV9wYWNrc19lcGkxNiAoc3VtLCBzdW0pOworICAgIHJldHVybjY0KHN1bSk7Cit9CisKK2ludDE2eDRfdCAgdnJhZGRobl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlJBRERITi5JMzIgZDAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90ICB2cmFkZGhuX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIC8vIFZSQURESE4uSTMyIGQwLHEwLHEwCit7CisgICAgLy9TSU1EIG1heSBiZSBub3Qgb3B0aW1hbCwgc2VyaWFsIG1heSBiZSBmYXN0ZXIKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdW0sIG1hc2sxOworICAgIHN1bSA9IF9tbV9hZGRfZXBpMzIgKGEsIGIpOworICAgIG1hc2sxID0gX21tX3NsbGlfZXBpMzIoc3VtLCAxNyk7IC8vc2hpZnQgbGVmdCB0aGVuIGJhY2sgcmlnaHQgdG8KKyAgICBtYXNrMSA9IF9tbV9zcmxpX2VwaTMyKG1hc2sxLDMxKTsgLy9nZXQgIDE1LXRoIGJpdCAxIG9yIHplcm8KKyAgICBzdW0gPSBfbW1fc3JhaV9lcGkzMiAoc3VtLCAxNik7IC8vZ2V0IGhpZ2ggaGFsZgorICAgIHN1bSA9IF9tbV9hZGRfZXBpMzIgKHN1bSwgbWFzazEpOyAvL2FjdHVhbCByb3VuZGluZworICAgIHN1bSA9IF9tbV9wYWNrc19lcGkzMiAoc3VtLCBzdW0pOworICAgIHJldHVybjY0KHN1bSk7Cit9CisKK2ludDMyeDJfdCAgdnJhZGRobl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlJBRERITi5JNjQgZDAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZyYWRkaG5fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikKK3sKKyAgICAvL1NJTUQgbWF5IGJlIG5vdCBvcHRpbWFsLCBzZXJpYWwgbWF5IGJlIGZhc3RlcgorICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1bSwgbWFzazE7CisgICAgc3VtID0gX21tX2FkZF9lcGk2NCAoYSwgYik7CisgICAgbWFzazEgPSBfbW1fc2xsaV9lcGk2NChzdW0sIDMzKTsgLy9zaGlmdCBsZWZ0IHRoZW4gYmFjayByaWdodCB0bworICAgIG1hc2sxID0gX21tX3NybGlfZXBpNjQobWFzazEsMzIpOyAvL2dldCAgMzEtdGggYml0IDEgb3IgemVybworICAgIHN1bSA9IF9tbV9hZGRfZXBpNjQgKHN1bSwgbWFzazEpOyAvL2FjdHVhbCBoaWdoIGhhbGYgcm91bmRpbmcKKyAgICBzdW0gPSBfbW1fc2h1ZmZsZV9lcGkzMihzdW0sICAxIHwgKDMgPDwgMikgfCAoMSA8PCA0KSB8ICgzIDw8IDYpKTsKKyAgICByZXR1cm42NChzdW0pOworfQorCit1aW50OHg4X3QgIHZyYWRkaG5fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlJBRERITi5JMTYgZDAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90ICB2cmFkZGhuX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgLy8gVlJBRERITi5JMTYgZDAscTAscTAKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdW0sIG1hc2sxOworICAgIHN1bSA9IF9tbV9hZGRfZXBpMTYgKGEsIGIpOworICAgIG1hc2sxID0gX21tX3NsbGlfZXBpMTYoc3VtLCA5KTsgLy9zaGlmdCBsZWZ0IHRoZW4gYmFjayByaWdodCB0bworICAgIG1hc2sxID0gX21tX3NybGlfZXBpMTYobWFzazEsIDE1KTsgLy9nZXQgIDctdGggYml0IDEgb3IgemVybworICAgIHN1bSA9IF9tbV9zcmFpX2VwaTE2IChzdW0sIDgpOyAvL2dldCBoaWdoIGhhbGYKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTE2IChzdW0sIG1hc2sxKTsgLy9hY3R1YWwgcm91bmRpbmcKKyAgICBzdW0gPSBfbW1fcGFja3VzX2VwaTE2IChzdW0sIHN1bSk7CisgICAgcmV0dXJuNjQoc3VtKTsKK30KKwordWludDE2eDRfdCB2cmFkZGhuX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZSQURESE4uSTMyIGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnJhZGRobl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpCit7CisgICAgLy9TSU1EIG1heSBiZSBub3Qgb3B0aW1hbCwgc2VyaWFsIG1heSBiZSBmYXN0ZXIKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgc3VtLCBtYXNrMTsKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTMyIChhLCBiKTsKKyAgICBtYXNrMSA9IF9tbV9zbGxpX2VwaTMyKHN1bSwgMTcpOyAvL3NoaWZ0IGxlZnQgdGhlbiBiYWNrIHJpZ2h0IHRvCisgICAgbWFzazEgPSBfbW1fc3JsaV9lcGkzMihtYXNrMSwzMSk7IC8vZ2V0ICAxNS10aCBiaXQgMSBvciB6ZXJvCisgICAgc3VtID0gX21tX3NyYWlfZXBpMzIgKHN1bSwgMTYpOyAvL2dldCBoaWdoIGhhbGYKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTMyIChzdW0sIG1hc2sxKTsgLy9hY3R1YWwgcm91bmRpbmcKKyAgICBzdW0gPSBfTU1fUEFDS1VTMV9FUEkzMiAoc3VtKTsKKyAgICByZXR1cm42NChzdW0pOworfQorCit1aW50MzJ4Ml90IHZyYWRkaG5fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVlJBRERITi5JNjQgZDAscTAscTAKKyNkZWZpbmUgdnJhZGRobl91NjQgdnJhZGRobl9zNjQKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKiAgICAgICAgICAgICBNdWx0aXBsaWNhdGlvbiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy9WZWN0b3IgbXVsdGlwbHk6IHZtdWwgLT4gVnJbaV0gOj0gVmFbaV0gKiBWYltpXQorLy9BcyB3ZSBkb24ndCBnbyB0byB3aWRlciByZXN1bHQgZnVuY3Rpb25zIGFyZSBlcXVhbCB0byAibXVsdGlwbHkgbG93IiBpbiB4ODYKK2ludDh4OF90IHZtdWxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZNVUwuSTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3Qgdm11bF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSAvLyBWTVVMLkk4IGQwLGQwLGQwCit7CisgICAgLy8gbm8gOCBiaXQgc2ltZCBtdWx0aXBseSwgbmVlZCB0byBnbyB0byAxNiBiaXRzIGluIFNTRQorICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYTEyOCwgYjEyOCwgcmVzOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMTZfZXZlbl9vZGRbMTZdID0geyAwLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1IH07CisgICAgYTEyOCA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGEpKTsgLy8gU1NFIDQuMSB1c2UgbG93IDY0IGJpdHMKKyAgICBiMTI4ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYikpOyAvLyBTU0UgNC4xIHVzZSBsb3cgNjQgYml0cworICAgIHJlcyA9IF9tbV9tdWxsb19lcGkxNiAoYTEyOCwgYjEyOCk7CisgICAgcmVzID0gX21tX3NodWZmbGVfZXBpOCAocmVzLCAqKF9fbTEyOGkqKSBtYXNrOF8xNl9ldmVuX29kZCk7IC8vcmV0dXJuIHRvIDggYml0IGZyb20gMTYsIHVzZSA2NCBsb3cgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MTZ4NF90IHZtdWxfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIpOyAvLyBWTVVMLkkxNiBkMCxkMCxkMAorI2RlZmluZSB2bXVsX3MxNiB2bXVsX3UxNgorCitpbnQzMngyX3Qgdm11bF9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYik7IC8vIFZNVUwuSTMyIGQwLGQwLGQwCisjZGVmaW5lIHZtdWxfczMyIHZtdWxfdTMyCisKK2Zsb2F0MzJ4Ml90IHZtdWxfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWTVVMLkYzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2bXVsX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKQoreworICAgIGZsb2F0MzJ4NF90IHRtcDsKKyAgICBfX202NF8xMjggcmVzNjQ7CisgICAgdG1wID0gIF9tbV9tdWxfcHMoX3BNMTI4KGEpLF9wTTEyOChiKSk7CisgICAgX002NGYocmVzNjQsIHRtcCk7IC8vdXNlIGxvdyA2NCBiaXRzCisgICAgcmV0dXJuIHJlczY0OworfQorCit1aW50OHg4X3Qgdm11bF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWTVVMLkk4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2bXVsX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgLy8gVk1VTC5JOCBkMCxkMCxkMAoreworICAgIC8vIG5vIDggYml0IHNpbWQgbXVsdGlwbHksIG5lZWQgdG8gZ28gdG8gMTYgYml0cyBpbiBTU0UKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBtYXNrLCBhMTI4LCBiMTI4LCByZXM7CisgICAgbWFzayA9IF9tbV9zZXQxX2VwaTE2KDB4ZmYpOworICAgIGExMjggPSBfTU1fQ1ZURVBVOF9FUEkxNiAoX3BNMTI4aShhKSk7CisgICAgYjEyOCA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGIpKTsKKyAgICByZXMgPSBfbW1fbXVsbG9fZXBpMTYgKGExMjgsIGIxMjgpOworICAgIHJlcyA9IF9tbV9hbmRfc2kxMjgocmVzLCBtYXNrKTsgLy90byBhdm9pZCBzYXR1cmF0aW9uCisgICAgcmVzID0gX21tX3BhY2t1c19lcGkxNiAocmVzLHJlcyk7IC8vdXNlIG9ubHkgbG93IDY0IGJpdHMKKyAgICByZXR1cm42NChyZXMpOworfQorCit1aW50MTZ4NF90IHZtdWxfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVk1VTC5JMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2bXVsX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9tdWxsb19lcGkxNihfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MzJ4Ml90ICAgdm11bF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWTVVMLkkzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyggdWludDMyeDJfdCAgIHZtdWxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICB1aW50MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X3UzMlswXSA9IGEubTY0X3UzMlswXSAqIGIubTY0X3UzMlswXTsKKyAgICByZXMubTY0X3UzMlsxXSA9IGEubTY0X3UzMlsxXSAqIGIubTY0X3UzMlsxXTsKKyAgICByZXR1cm4gcmVzOworfQorCitwb2x5OHg4X3Qgdm11bF9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIpOyAvLyBWTVVMLlA4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHBvbHk4eDhfdCB2bXVsX3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYikKK3sKKyAgICAvL21heSBiZSBvcHRpbWl6ZWQKKyAgICBwb2x5OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBhNjQsIGI2NCwgYzEsIHJlcywgdG1wLCBibWFza2VkOworICAgIGludCBpOworICAgIGE2NCA9IF9wTTEyOGkoYSk7CisgICAgYjY0ID0gX3BNMTI4aShiKTsKKyAgICBjMSA9IF9tbV9jbXBlcV9lcGk4IChhNjQsYTY0KTsgLy9hbGwgb25lcyAweGZmLi4uLgorICAgIGMxID0gdnNocnFfbl91OChjMSw3KTsgLy8weDEKKyAgICBibWFza2VkID0gX21tX2FuZF9zaTEyOChiNjQsIGMxKTsgLy8weDEKKyAgICByZXMgPSB2bXVscV91OChhNjQsIGJtYXNrZWQpOworICAgIGZvcihpID0gMTsgaTw4OyBpKyspIHsKKyAgICAgICAgYzEgPSBfbW1fc2xsaV9lcGkxNihjMSwxKTsgLy9zaGlmdCBtYXNrIGxlZnQgYnkgMSwgMTYgYml0IHNoaWZ0IGlzIE9LIGhlcmUKKyAgICAgICAgYm1hc2tlZCA9IF9tbV9hbmRfc2kxMjgoYjY0LCBjMSk7IC8vMHgxCisgICAgICAgIHRtcCA9IHZtdWxxX3U4KGE2NCwgYm1hc2tlZCk7CisgICAgICAgIHJlcyA9IF9tbV94b3Jfc2kxMjgocmVzLCB0bXApOworICAgIH0KKyAgICByZXR1cm42NCAocmVzKTsKK30KKworaW50OHgxNl90IHZtdWxxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZNVUwuSTggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZtdWxxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgLy8gVk1VTC5JOCBxMCxxMCxxMAoreworICAgIC8vIG5vIDggYml0IHNpbWQgbXVsdGlwbHksIG5lZWQgdG8gZ28gdG8gMTYgYml0cworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgX19tMTI4aSBhMTYsIGIxNiwgcjE2XzEsIHIxNl8yOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMTZfZXZlbl9vZGRbMTZdID0geyAwLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1IH07CisgICAgYTE2ID0gX01NX0NWVEVQSThfRVBJMTYgKGEpOyAvLyBTU0UgNC4xCisgICAgYjE2ID0gX01NX0NWVEVQSThfRVBJMTYgKGIpOyAvLyBTU0UgNC4xCisgICAgcjE2XzEgPSBfbW1fbXVsbG9fZXBpMTYgKGExNiwgYjE2KTsKKyAgICAvL3N3YXAgaGkgYW5kIGxvdyBwYXJ0IG9mIGEgYW5kIGIgdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICBhMTYgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgX1NXQVBfSElfTE9XMzIpOworICAgIGIxNiA9IF9tbV9zaHVmZmxlX2VwaTMyIChiLCBfU1dBUF9ISV9MT1czMik7CisgICAgYTE2ID0gX01NX0NWVEVQSThfRVBJMTYgKGExNik7IC8vIFNTRSA0LjEKKyAgICBiMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoYjE2KTsgLy8gU1NFIDQuMSAgX19tMTI4aSByMTZfMgorCisgICAgcjE2XzIgPSBfbW1fbXVsbG9fZXBpMTYgKGExNiwgYjE2KTsKKyAgICByMTZfMSA9IF9tbV9zaHVmZmxlX2VwaTggKHIxNl8xLCAqKF9fbTEyOGkqKW1hc2s4XzE2X2V2ZW5fb2RkKTsgLy9yZXR1cm4gdG8gOCBiaXQKKyAgICByMTZfMiA9IF9tbV9zaHVmZmxlX2VwaTggKHIxNl8yLCAqKF9fbTEyOGkqKW1hc2s4XzE2X2V2ZW5fb2RkKTsgLy9yZXR1cm4gdG8gOCBiaXQKKworICAgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpNjQocjE2XzEsICByMTZfMik7Cit9CisKK2ludDE2eDhfdCAgIHZtdWxxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWTVVMLkkxNiBxMCxxMCxxMAorI2RlZmluZSB2bXVscV9zMTYgX21tX211bGxvX2VwaTE2CisKK2ludDMyeDRfdCAgIHZtdWxxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWTVVMLkkzMiBxMCxxMCxxMAorI2RlZmluZSB2bXVscV9zMzIgX01NX01VTExPX0VQSTMyIC8vU1NFNC4xCisKK2Zsb2F0MzJ4NF90IHZtdWxxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVk1VTC5GMzIgcTAscTAscTAKKyNkZWZpbmUgdm11bHFfZjMyIF9tbV9tdWxfcHMKKwordWludDh4MTZfdCB2bXVscV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZNVUwuSTggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2bXVscV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgLy8gVk1VTC5JOCBxMCxxMCxxMAoreworICAgIC8vIG5vIDggYml0IHNpbWQgbXVsdGlwbHksIG5lZWQgdG8gZ28gdG8gMTYgYml0cworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgX19tMTI4aSBtYXNrZmYsIGExNiwgYjE2LCByMTZfMSwgcjE2XzI7CisgICAgbWFza2ZmID0gX21tX3NldDFfZXBpMTYoMHhmZik7CisgICAgYTE2ID0gX01NX0NWVEVQVThfRVBJMTYgKGEpOyAvLyBTU0UgNC4xCisgICAgYjE2ID0gX01NX0NWVEVQVThfRVBJMTYgKGIpOyAvLyBTU0UgNC4xCisgICAgcjE2XzEgPSBfbW1fbXVsbG9fZXBpMTYgKGExNiwgYjE2KTsKKyAgICByMTZfMSA9IF9tbV9hbmRfc2kxMjgocjE2XzEsIG1hc2tmZik7IC8vdG8gYXZvaWQgc2F0dXJhdGlvbgorICAgIC8vc3dhcCBoaSBhbmQgbG93IHBhcnQgb2YgYSBhbmQgYiB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgZGF0YQorICAgIGExNiA9IF9tbV9zaHVmZmxlX2VwaTMyIChhLCBfU1dBUF9ISV9MT1czMik7CisgICAgYjE2ID0gX21tX3NodWZmbGVfZXBpMzIgKGIsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBhMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoYTE2KTsgLy8gU1NFIDQuMQorICAgIGIxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChiMTYpOyAvLyBTU0UgNC4xCisKKyAgICByMTZfMiA9IF9tbV9tdWxsb19lcGkxNiAoYTE2LCBiMTYpOworICAgIHIxNl8yID0gX21tX2FuZF9zaTEyOChyMTZfMiwgbWFza2ZmKTsgLy90byBhdm9pZCBzYXR1cmF0aW9uCisgICAgcmV0dXJuIF9tbV9wYWNrdXNfZXBpMTYgKHIxNl8xLCAgcjE2XzIpOworfQorCit1aW50MTZ4OF90ICAgdm11bHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVk1VTC5JMTYgcTAscTAscTAKKyNkZWZpbmUgdm11bHFfdTE2IF9tbV9tdWxsb19lcGkxNgorCit1aW50MzJ4NF90ICAgdm11bHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVk1VTC5JMzIgcTAscTAscTAKKyNkZWZpbmUgdm11bHFfdTMyIF9NTV9NVUxMT19FUEkzMiAvL1NTRTQuMQorCitwb2x5OHgxNl90IHZtdWxxX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiKTsgLy8gVk1VTC5QOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBwb2x5OHgxNl90IHZtdWxxX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiKQoreworICAgIC8vbWF5IGJlIG9wdGltaXplZAorICAgIF9fbTEyOGkgYzEsIHJlcywgdG1wLCBibWFza2VkOworICAgIGludCBpOworICAgIGMxID0gX21tX2NtcGVxX2VwaTggKGEsYSk7IC8vYWxsIG9uZXMgMHhmZi4uLi4KKyAgICBjMSA9IHZzaHJxX25fdTgoYzEsNyk7IC8vMHgxCisgICAgYm1hc2tlZCA9IF9tbV9hbmRfc2kxMjgoYiwgYzEpOyAvLzB4MQorICAgIHJlcyA9IHZtdWxxX3U4KGEsIGJtYXNrZWQpOworICAgIGZvcihpID0gMTsgaTw4OyBpKyspIHsKKyAgICAgICAgYzEgPSBfbW1fc2xsaV9lcGkxNihjMSwxKTsgLy9zaGlmdCBtYXNrIGxlZnQgYnkgMSwgMTYgYml0IHNoaWZ0IGlzIE9LIGhlcmUKKyAgICAgICAgYm1hc2tlZCA9IF9tbV9hbmRfc2kxMjgoYiwgYzEpOyAvLzB4MQorICAgICAgICB0bXAgPSB2bXVscV91OChhLCBibWFza2VkKTsKKyAgICAgICAgcmVzID0gX21tX3hvcl9zaTEyOChyZXMsIHRtcCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKiBWZWN0b3IgbG9uZyBtdWx0aXBseSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQxNng4X3Qgdm11bGxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZNVUxMLlM4IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2bXVsbF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSAvLyBWTVVMTC5TOCBxMCxkMCxkMAoreworICAgIC8vbm8gOCBiaXQgc2ltZCBtdWx0aXBseSwgbmVlZCB0byBnbyB0byAxNiBiaXRzCisgICAgX19tMTI4aSBhMTYsIGIxNjsKKyAgICBhMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vIFNTRSA0LjEKKyAgICBiMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShiKSk7IC8vIFNTRSA0LjEKKyAgICByZXR1cm4gX21tX211bGxvX2VwaTE2IChhMTYsIGIxNik7IC8vc2hvdWxkIGZpdCBpbnRvIDE2IGJpdAorfQorCitpbnQzMng0X3Qgdm11bGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZNVUxMLlMxNiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3Qgdm11bGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgLy8gVk1VTEwuUzE2IHEwLGQwLGQwCit7CisgICAgI2lmZGVmIFVTRV9TU0U0CisgICAgICAgIF9fbTEyOGkgYTE2LCBiMTY7CisgICAgICAgIGExNiA9IF9NTV9DVlRFUEkxNl9FUEkzMiAoX3BNMTI4aShhKSk7IC8vIFNTRSA0LjEKKyAgICAgICAgYjE2ID0gX01NX0NWVEVQSTE2X0VQSTMyIChfcE0xMjhpKGIpKTsgLy8gU1NFIDQuMQorICAgICAgICByZXR1cm4gX01NX01VTExPX0VQSTMyIChhMTYsIGIxNik7IC8vIFNTRSA0LjEKKyAgICAjZWxzZQorICAgICAgICBfX20xMjhpIGxvdywgaGksIGExMjgsYjEyODsKKyAgICAgICAgYTEyOCA9IF9wTTEyOGkoYSk7CisgICAgICAgIGIxMjggPSBfcE0xMjhpKGIpOworICAgICAgICBsb3cgPSAgX21tX211bGxvX2VwaTE2KGExMjgsYjEyOCk7CisgICAgICAgIGhpID0gICBfbW1fbXVsaGlfZXBpMTYoYTEyOCxiMTI4KTsKKyAgICAgICAgcmV0dXJuIF9tbV91bnBhY2tsb19lcGkxNihsb3csaGkpOworICAgICNlbmRpZgorfQorCitpbnQ2NHgyX3Qgdm11bGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZNVUxMLlMzMiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3Qgdm11bGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgLy8gVk1VTEwuUzMyIHEwLGQwLGQwCit7CisgICAgX19tMTI4aSBhYiwgYmEsIGExMjgsIGIxMjg7CisgICAgYTEyOCA9IF9wTTEyOGkoYSk7CisgICAgYjEyOCA9IF9wTTEyOGkoYik7CisgICAgYWIgPSBfbW1fdW5wYWNrbG9fZXBpMzIgKGExMjgsIGIxMjgpOyAvL2EwLCBiMCwgYTEsYjEKKyAgICBiYSA9IF9tbV91bnBhY2tsb19lcGkzMiAoYjEyOCwgYTEyOCk7IC8vYjAsIGEwLCBiMSxhMQorICAgIHJldHVybiBfTU1fTVVMX0VQSTMyKGFiLCBiYSk7IC8vdXNlcyAxcnN0IGFuZCAzcmQgZGF0YSBsYW5lcywgdGhlIG11bHRpcGxpY2F0aW9uIGdpdmVzIDY0IGJpdCByZXN1bHQKK30KKwordWludDE2eDhfdCB2bXVsbF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWTVVMTC5VOCBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZtdWxsX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgLy8gVk1VTEwuVTggcTAsZDAsZDAKK3sKKyAgICAvL25vIDggYml0IHNpbWQgbXVsdGlwbHksIG5lZWQgdG8gZ28gdG8gMTYgYml0cworICAgIF9fbTEyOGkgYTE2LCBiMTY7CisgICAgYTE2ID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvLyBTU0UgNC4xCisgICAgYjE2ID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYikpOyAvLyBTU0UgNC4xCisgICAgcmV0dXJuIF9tbV9tdWxsb19lcGkxNiAoYTE2LCBiMTYpOyAvL3Nob3VsZCBmaXQgaW50byAxNiBiaXQKK30KKwordWludDMyeDRfdCB2bXVsbF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWTVVMTC5zMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2bXVsbF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIC8vIFZNVUxMLnMxNiBxMCxkMCxkMAoreworICAgICNpZmRlZiBVU0VfU1NFNAorICAgICAgICBfX20xMjhpIGExNiwgYjE2OworICAgICAgICBhMTYgPSBfTU1fQ1ZURVBVMTZfRVBJMzIgKF9wTTEyOGkoYSkpOyAvLyBTU0UgNC4xCisgICAgICAgIGIxNiA9IF9NTV9DVlRFUFUxNl9FUEkzMiAoX3BNMTI4aShiKSk7IC8vIFNTRSA0LjEKKyAgICAgICAgcmV0dXJuIF9NTV9NVUxMT19FUEkzMiAoYTE2LCBiMTYpOyAvLyBTU0UgNC4xCisgICAgI2Vsc2UKKyAgICAgICAgX19tMTI4aSBhMTI4LGIxMjgsbG93LCBoaTsKKyAgICAgICAgYTEyOCA9IF9wTTEyOGkoYSk7CisgICAgICAgIGIxMjggPSBfcE0xMjhpKGIpOworICAgICAgICBsb3cgPSAgX21tX211bGxvX2VwaTE2KGExMjgsYjEyOCk7CisgICAgICAgIGhpID0gICBfbW1fbXVsaGlfZXB1MTYoYTEyOCxiMTI4KTsKKyAgICAgICAgcmV0dXJuIF9tbV91bnBhY2tsb19lcGkxNihsb3csaGkpOworICAgICNlbmRpZgorfQorCit1aW50NjR4Ml90IHZtdWxsX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZNVUxMLlUzMiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50NjR4Ml90IHZtdWxsX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgLy8gVk1VTEwuVTMyIHEwLGQwLGQwCit7CisgICAgLy8vbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggc2VyaWFsIGltcGxlbWVudGF0aW9uCisgICAgX19tMTI4aSBhYiwgYmEsIGExMjgsIGIxMjg7CisgICAgYTEyOCA9IF9wTTEyOGkoYSk7CisgICAgYjEyOCA9IF9wTTEyOGkoYik7CisgICAgYWIgPSBfbW1fdW5wYWNrbG9fZXBpMzIgKGExMjgsIGIxMjgpOyAvL2EwLCBiMCwgYTEsYjEKKyAgICBiYSA9IF9tbV91bnBhY2tsb19lcGkzMiAoYjEyOCwgYTEyOCk7IC8vYjAsIGEwLCBiMSxhMQorICAgIHJldHVybiBfbW1fbXVsX2VwdTMyIChhYiwgYmEpOyAvL3VzZXMgMXJzdCBhbmQgM3JkIGRhdGEgbGFuZXMsIHRoZSBtdWx0aXBsaWNhdGlvbiBnaXZlcyA2NCBiaXQgcmVzdWx0Cit9CisKK3BvbHkxNng4X3Qgdm11bGxfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKTsgLy8gVk1VTEwuUDggcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgcG9seTE2eDhfdCB2bXVsbF9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIpCit7CisgICAgLy9tYXkgYmUgb3B0aW1pemVkCisgICAgX19tMTI4aSBhMTI4LGIxMjgsIGMxLCBhMTI4XzE2LCBibWFza2VkXzE2LCByZXMsIHRtcCwgYm1hc2tlZDsKKyAgICBpbnQgaTsKKyAgICBhMTI4ID0gX3BNMTI4aShhKTsKKyAgICBiMTI4ID0gX3BNMTI4aShiKTsKKyAgICBjMSA9IF9tbV9jbXBlcV9lcGk4IChhMTI4LGExMjgpOyAvL2FsbCBvbmVzIDB4ZmYuLi4uCisgICAgYzEgPSB2c2hycV9uX3U4KGMxLDcpOyAvLzB4MQorICAgIGJtYXNrZWQgPSBfbW1fYW5kX3NpMTI4KGIxMjgsIGMxKTsgLy8weDEKKworICAgIGExMjhfMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoYTEyOCk7IC8vIFNTRSA0LjEKKyAgICBibWFza2VkXzE2ID0gX01NX0NWVEVQVThfRVBJMTYgKGJtYXNrZWQpOyAvLyBTU0UgNC4xCisgICAgcmVzID0gX21tX211bGxvX2VwaTE2IChhMTI4XzE2LCBibWFza2VkXzE2KTsgLy9zaG91bGQgZml0IGludG8gMTYgYml0CisgICAgZm9yKGkgPSAxOyBpPDg7IGkrKykgeworICAgICAgICBjMSA9IF9tbV9zbGxpX2VwaTE2KGMxLDEpOyAvL3NoaWZ0IG1hc2sgbGVmdCBieSAxLCAxNiBiaXQgc2hpZnQgaXMgT0sgaGVyZQorICAgICAgICBibWFza2VkID0gX21tX2FuZF9zaTEyOChiMTI4LCBjMSk7IC8vMHgxCisgICAgICAgIGJtYXNrZWRfMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoYm1hc2tlZCk7IC8vIFNTRSA0LjEKKyAgICAgICAgdG1wID0gX21tX211bGxvX2VwaTE2IChhMTI4XzE2LCBibWFza2VkXzE2KTsgLy9zaG91bGQgZml0IGludG8gMTYgYml0LCB2bXVsbF91OChhLCBibWFza2VkKTsKKyAgICAgICAgcmVzID0gX21tX3hvcl9zaTEyOChyZXMsIHRtcCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8vKioqKioqKioqKioqKioqKlZlY3RvciBzYXR1cmF0aW5nIGRvdWJsaW5nIGxvbmcgbXVsdGlwbHkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDMyeDRfdCB2cWRtdWxsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUURNVUxMLlMxNiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnFkbXVsbF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKQoreworICAgIC8vdGhlIHNlcmlhbCBzb3VsdXRpb24gbWF5IGJlIGZhc3RlciBkdWUgdG8gc2F0dXJhdGlvbgorICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZtdWxsX3MxNihhLCBiKTsKKyAgICByZXR1cm4gdnFkX3MzMihyZXMpOworfQorCitpbnQ2NHgyX3QgdnFkbXVsbF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlFETVVMTC5TMzIgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4Ml90IHZxZG11bGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiksX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvL3RoZSBzZXJpYWwgc291bHV0aW9uIG1heSBiZSBmYXN0ZXIgZHVlIHRvIHNhdHVyYXRpb24KKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2bXVsbF9zMzIoYSxiKTsKKyAgICByZXR1cm4gdnFhZGRxX3M2NChyZXMscmVzKTsgLy9zbG93IHNlcmlhbCBmdW5jdGlvbiEhISEKK30KKworLy8qKioqKioqKioqKioqKioqKioqKiogVmVjdG9yIG11bHRpcGx5IGFjY3VtdWxhdGU6IHZtbGEgLT4gVnJbaV0gOj0gVmFbaV0gKyBWYltpXSAqIFZjW2ldICAqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2bWxhX3M4KGludDh4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpOyAvLyBWTUxBLkk4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZtbGFfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiwgaW50OHg4X3QgYykgLy8gVk1MQS5JOCBkMCxkMCxkMAoreworICAgIC8vIG5vIDggYml0IHg4NiBzaW1kIG11bHRpcGx5LCBuZWVkIHRvIGdvIHRvIDE2IGJpdHMsICBhbmQgdXNlIHRoZSBsb3cgNjQgYml0cworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYjEyOCwgYzEyOCwgcmVzOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMTZfZXZlbl9vZGRbMTZdID0geyAwLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1IH07CisgICAgYjEyOCA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGIpKTsgLy8gU1NFIDQuMSB1c2UgbG93IDY0IGJpdHMKKyAgICBjMTI4ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYykpOyAvLyBTU0UgNC4xIHVzZSBsb3cgNjQgYml0cworICAgIHJlcyA9IF9tbV9tdWxsb19lcGkxNiAoYzEyOCwgYjEyOCk7CisgICAgcmVzICA9ICBfbW1fc2h1ZmZsZV9lcGk4IChyZXMsICooX19tMTI4aSopIG1hc2s4XzE2X2V2ZW5fb2RkKTsKKyAgICByZXMgID0gX21tX2FkZF9lcGk4IChyZXMsIF9wTTEyOGkoYSkpOyAvL3VzZSB0aGUgbG93IDY0IGJpdHMKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQxNng0X3Qgdm1sYV9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWTUxBLkkxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3Qgdm1sYV9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZtbGFxX3MxNihfcE0xMjhpKGEpLF9wTTEyOGkoYiksIF9wTTEyOGkoYykpKTsKK30KKworCitpbnQzMngyX3Qgdm1sYV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYyk7IC8vIFZNTEEuSTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2bWxhX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKSAvLyBWTUxBLkkzMiBkMCxkMCxkMAoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfTU1fTVVMTE9fRVBJMzIgKF9wTTEyOGkoYiksIF9wTTEyOGkoYykpOyAvL1NTRTQuMQorICAgIHJlcyA9IF9tbV9hZGRfZXBpMzIgKHJlcywgX3BNMTI4aShhKSk7IC8vdXNlIHRoZSBsb3cgNjQgYml0cworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2Zsb2F0MzJ4Ml90IHZtbGFfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4Ml90IGMpOyAvLyBWTUxBLkYzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2bWxhX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDJfdCBjKQoreworICAgIC8vZm1hIGlzIGNvbWluZyBzb29uLCBidXQgcmlnaHQgbm93OgorICAgIF9fbTEyOCByZXM7CisgICAgX19tNjRfMTI4IHJlczY0OworICAgIHJlcyA9IF9tbV9tdWxfcHMgKF9wTTEyOChjKSwgX3BNMTI4KGIpKTsKKyAgICByZXMgPSBfbW1fYWRkX3BzIChfcE0xMjgoYSksIHJlcyk7CisgICAgX002NGYocmVzNjQsIHJlcyk7CisgICAgcmV0dXJuIHJlczY0OworfQorCit1aW50OHg4X3Qgdm1sYV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVk1MQS5JOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3Qgdm1sYV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKSAvLyBWTUxBLkk4IGQwLGQwLGQwCit7CisgICAgLy8gbm8gOCBiaXQgeDg2IHNpbWQgbXVsdGlwbHksIG5lZWQgdG8gZ28gdG8gMTYgYml0cywgIGFuZCB1c2UgdGhlIGxvdyA2NCBiaXRzCisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgbWFzaywgYjEyOCwgYzEyOCwgcmVzOworICAgIG1hc2sgPSBfbW1fc2V0MV9lcGkxNigweGZmKTsKKyAgICBiMTI4ID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYikpOyAvLyBTU0UgNC4xIHVzZSBsb3cgNjQgYml0cworICAgIGMxMjggPSBfTU1fQ1ZURVBVOF9FUEkxNiAoX3BNMTI4aShjKSk7IC8vIFNTRSA0LjEgdXNlIGxvdyA2NCBiaXRzCisgICAgcmVzID0gX21tX211bGxvX2VwaTE2IChjMTI4LCBiMTI4KTsKKyAgICByZXMgPSBfbW1fYW5kX3NpMTI4KHJlcywgbWFzayk7IC8vdG8gYXZvaWQgc2F0dXJhdGlvbgorICAgIHJlcyA9IF9tbV9wYWNrdXNfZXBpMTYgKHJlcywgcmVzKTsKKyAgICByZXMgPSAgX21tX2FkZF9lcGk4IChyZXMsIF9wTTEyOGkoYSkpOyAvL3VzZSB0aGUgbG93IDY0IGJpdHMKKyAgICByZXR1cm42NChyZXMpOworfQorCit1aW50MTZ4NF90IHZtbGFfdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCBjKTsgLy8gVk1MQS5JMTYgZDAsZDAsZDAKKyNkZWZpbmUgdm1sYV91MTYgdm1sYV9zMTYKKwordWludDMyeDJfdCB2bWxhX3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgYyk7IC8vIFZNTEEuSTMyIGQwLGQwLGQwCisjZGVmaW5lIHZtbGFfdTMyIHZtbGFfczMyCisKK2ludDh4MTZfdCB2bWxhcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIGludDh4MTZfdCBjKTsgLy8gVk1MQS5JOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3Qgdm1sYXFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBpbnQ4eDE2X3QgYykgLy8gVk1MQS5JOCBxMCxxMCxxMAoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgLy8gbm8gOCBiaXQgc2ltZCBtdWx0aXBseSwgbmVlZCB0byBnbyB0byAxNiBiaXRzCisgICAgX19tMTI4aSBiMTYsIGMxNiwgcjE2XzEsIGFfMixyMTZfMjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzE2X2V2ZW5fb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSB9OworICAgIGIxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChiKTsgLy8gU1NFIDQuMQorICAgIGMxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChjKTsgLy8gU1NFIDQuMQorICAgIHIxNl8xID0gX21tX211bGxvX2VwaTE2IChiMTYsIGMxNik7CisgICAgcjE2XzEgPSBfbW1fc2h1ZmZsZV9lcGk4IChyMTZfMSwgKihfX20xMjhpKikgbWFzazhfMTZfZXZlbl9vZGQpOyAvL3JldHVybiB0byA4IGJpdHMKKyAgICByMTZfMSA9IF9tbV9hZGRfZXBpOCAocjE2XzEsIGEpOworICAgIC8vc3dhcCBoaSBhbmQgbG93IHBhcnQgb2YgYSwgYiBhbmQgYyB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgZGF0YQorICAgIGFfMiA9IF9tbV9zaHVmZmxlX2VwaTMyIChhLCBfU1dBUF9ISV9MT1czMik7CisgICAgYjE2ID0gX21tX3NodWZmbGVfZXBpMzIgKGIsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBjMTYgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYywgX1NXQVBfSElfTE9XMzIpOworICAgIGIxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChiMTYpOyAvLyBTU0UgNC4xCisgICAgYzE2ID0gX01NX0NWVEVQSThfRVBJMTYgKGMxNik7IC8vIFNTRSA0LjEKKworICAgIHIxNl8yID0gX21tX211bGxvX2VwaTE2IChiMTYsIGMxNik7CisgICAgcjE2XzIgPSBfbW1fc2h1ZmZsZV9lcGk4IChyMTZfMiwgKihfX20xMjhpKikgbWFzazhfMTZfZXZlbl9vZGQpOworICAgIHIxNl8yID0gX21tX2FkZF9lcGk4KHIxNl8yLCBhXzIpOworICAgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpNjQocjE2XzEscjE2XzIpOworfQorCitpbnQxNng4X3Qgdm1sYXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IGMpOyAvLyBWTUxBLkkxNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3Qgdm1sYXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IGMpIC8vIFZNTEEuSTE2IHEwLHEwLHEwCit7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gX21tX211bGxvX2VwaTE2IChjLCBiKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkxNiAocmVzLCBhKTsKK30KKworaW50MzJ4NF90IHZtbGFxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCBjKTsgLy8gVk1MQS5JMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZtbGFxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCBjKSAvLyBWTUxBLkkzMiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9NTV9NVUxMT19FUEkzMiAoYywgIGIpOyAvL1NTRTQuMQorICAgIHJldHVybiBfbW1fYWRkX2VwaTMyIChyZXMsIGEpOworfQorCitmbG9hdDMyeDRfdCB2bWxhcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMng0X3QgYyk7IC8vIFZNTEEuRjMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZtbGFxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDRfdCBjKSAvLyBWTUxBLkYzMiBxMCxxMCxxMAoreworICAgIC8vZm1hIGlzIGNvbWluZyBzb29uLCBidXQgcmlnaHQgbm93OgorICAgIF9fbTEyOCByZXM7CisgICAgcmVzID0gX21tX211bF9wcyAoYywgYik7CisgICAgcmV0dXJuIF9tbV9hZGRfcHMgKGEsIHJlcyk7Cit9CisKK3VpbnQ4eDE2X3Qgdm1sYXFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIHVpbnQ4eDE2X3QgYyk7IC8vIFZNTEEuSTggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2bWxhcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgdWludDh4MTZfdCBjKSAvLyBWTUxBLkk4IHEwLHEwLHEwCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICAvLyBubyA4IGJpdCBzaW1kIG11bHRpcGx5LCBuZWVkIHRvIGdvIHRvIDE2IGJpdHMKKyAgICBfX20xMjhpIGIxNiwgYzE2LCByMTZfMSwgYV8yLCByMTZfMjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzE2X2V2ZW5fb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSB9OworICAgIGIxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChiKTsgLy8gU1NFIDQuMQorICAgIGMxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChjKTsgLy8gU1NFIDQuMQorICAgIHIxNl8xID0gX21tX211bGxvX2VwaTE2IChiMTYsIGMxNik7CisgICAgcjE2XzEgPSBfbW1fc2h1ZmZsZV9lcGk4IChyMTZfMSwgKihfX20xMjhpKikgbWFzazhfMTZfZXZlbl9vZGQpOyAvL3JldHVybiB0byA4IGJpdHMKKyAgICByMTZfMSA9IF9tbV9hZGRfZXBpOCAocjE2XzEsIGEpOworICAgIC8vc3dhcCBoaSBhbmQgbG93IHBhcnQgb2YgYSwgYiBhbmQgYyB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgZGF0YQorICAgIGFfMiA9IF9tbV9zaHVmZmxlX2VwaTMyIChhLCBfU1dBUF9ISV9MT1czMik7CisgICAgYjE2ID0gX21tX3NodWZmbGVfZXBpMzIgKGIsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBjMTYgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYywgX1NXQVBfSElfTE9XMzIpOworICAgIGIxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChiMTYpOyAvLyBTU0UgNC4xCisgICAgYzE2ID0gX01NX0NWVEVQVThfRVBJMTYgKGMxNik7IC8vIFNTRSA0LjEKKworICAgIHIxNl8yID0gX21tX211bGxvX2VwaTE2IChiMTYsIGMxNik7CisgICAgcjE2XzIgPSBfbW1fc2h1ZmZsZV9lcGk4IChyMTZfMiwgKihfX20xMjhpKikgbWFzazhfMTZfZXZlbl9vZGQpOworICAgIHIxNl8yID0gX21tX2FkZF9lcGk4KHIxNl8yLCBhXzIpOworICAgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpNjQocjE2XzEscjE2XzIpOworfQorCit1aW50MTZ4OF90IHZtbGFxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDhfdCBjKTsgLy8gVk1MQS5JMTYgcTAscTAscTAKKyNkZWZpbmUgdm1sYXFfdTE2IHZtbGFxX3MxNgorCit1aW50MzJ4NF90IHZtbGFxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDRfdCBjKTsgLy8gVk1MQS5JMzIgcTAscTAscTAKKyNkZWZpbmUgdm1sYXFfdTMyIHZtbGFxX3MzMgorCisvLyoqKioqKioqKioqKioqKioqKioqKiogIFZlY3RvciB3aWRlbmluZyBtdWx0aXBseSBhY2N1bXVsYXRlIChsb25nIG11bHRpcGx5IGFjY3VtdWxhdGUpOgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHZtbGEgLT4gVnJbaV0gOj0gVmFbaV0gKyBWYltpXSAqIFZjW2ldICAqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MTZ4OF90IHZtbGFsX3M4KGludDE2eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVk1MQUwuUzggcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZtbGFsX3M4KGludDE2eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKSAvLyBWTUxBTC5TOCBxMCxkMCxkMAoreworICAgIGludDE2eDhfdCByZXM7CisgICAgcmVzID0gdm11bGxfczgoYiwgYyk7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYgKHJlcywgYSk7Cit9CisKK2ludDMyeDRfdCB2bWxhbF9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYyk7IC8vIFZNTEFMLlMxNiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3Qgdm1sYWxfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpIC8vIFZNTEFMLlMxNiBxMCxkMCxkMAoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggc2VyaWFsIGltcGxlbWVudGF0aW9uCisgICAgaW50MzJ4NF90IHJlczsKKyAgICByZXMgPSB2bXVsbF9zMTYoYiwgIGMpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTMyIChyZXMsIGEpOworfQorCitpbnQ2NHgyX3Qgdm1sYWxfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpOyAvLyBWTUxBTC5TMzIgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90IHZtbGFsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKSAvLyBWTUxBTC5TMzIgcTAsZDAsZDAKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHNlcmlhbCBpbXBsZW1lbnRhdGlvbgorICAgIGludDY0eDJfdCByZXM7CisgICAgcmVzID0gdm11bGxfczMyKCBiLCBjKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGk2NCAocmVzLCBhKTsKK30KKwordWludDE2eDhfdCB2bWxhbF91OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZNTEFMLlU4IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3Qgdm1sYWxfdTgodWludDE2eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpIC8vIFZNTEFMLlU4IHEwLGQwLGQwCit7CisgICAgdWludDE2eDhfdCByZXM7CisgICAgcmVzID0gdm11bGxfdTgoYiwgYyk7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYgKHJlcywgYSk7Cit9CisKK3VpbnQzMng0X3Qgdm1sYWxfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IGMpOyAvLyBWTUxBTC5zMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2bWxhbF91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYykgLy8gVk1MQUwuczE2IHEwLGQwLGQwCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBzZXJpYWwgaW1wbGVtZW50YXRpb24KKyAgICB1aW50MzJ4NF90IHJlczsKKyAgICByZXMgPSB2bXVsbF91MTYoYiwgYyk7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMzIgKHJlcywgYSk7Cit9CisKK3VpbnQ2NHgyX3Qgdm1sYWxfdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpOyAvLyBWTUxBTC5VMzIgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2bWxhbF91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgYykgLy8gVk1MQUwuVTMyIHEwLGQwLGQwCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBzZXJpYWwgaW1wbGVtZW50YXRpb24KKyAgICBpbnQ2NHgyX3QgcmVzOworICAgIHJlcyA9IHZtdWxsX3UzMiggYixjKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGk2NCAocmVzLCBhKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKiBWZWN0b3IgbXVsdGlwbHkgc3VidHJhY3Q6IHZtbHMgLT4gVnJbaV0gOj0gVmFbaV0gLSBWYltpXSAqIFZjW2ldICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3Qgdm1sc19zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVk1MUy5JOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2bWxzX3M4KGludDh4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpIC8vIFZNTFMuSTggZDAsZDAsZDAKK3sKKyAgICAvLyBubyA4IGJpdCBzaW1kIG11bHRpcGx5LCBuZWVkIHRvIGdvIHRvIDE2IGJpdHMgLSAgYW5kIHVzZSB0aGUgbG93IDY0IGJpdHMKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXM2NCA9IHZtdWxfczgoYixjKTsKKyAgICByZXMgPSBfbW1fc3ViX2VwaTggKF9wTTEyOGkoYSksIF9wTTEyOGkocmVzNjQpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQxNng0X3Qgdm1sc19zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWTUxTLkkxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3Qgdm1sc19zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZtbHNxX3MxNihfcE0xMjhpKGEpLF9wTTEyOGkoYiksIF9wTTEyOGkoYykpKTsKK30KKworCitpbnQzMngyX3Qgdm1sc19zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYyk7IC8vIFZNTFMuSTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2bWxzX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKSAvLyBWTUxTLkkzMiBkMCxkMCxkMAoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfTU1fTVVMTE9fRVBJMzIgKF9wTTEyOGkoYyksX3BNMTI4aSggYikpOyAvL1NTRTQuMQorICAgIHJlcyA9ICBfbW1fc3ViX2VwaTMyIChfcE0xMjhpKGEpLHJlcyk7IC8vdXNlIGxvdyA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyZXMpOworfQorCitmbG9hdDMyeDJfdCB2bWxzX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDJfdCBjKTsgLy8gVk1MUy5GMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3Qgdm1sc19mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgYykKK3sKKyAgICBfX20xMjggcmVzOworICAgIF9fbTY0XzEyOCByZXM2NDsKKyAgICByZXMgPSBfbW1fbXVsX3BzIChfcE0xMjgoYyksIF9wTTEyOChiKSk7CisgICAgcmVzID0gX21tX3N1Yl9wcyAoX3BNMTI4KGEpLCByZXMpOworICAgIF9NNjRmKHJlczY0LCByZXMpOworICAgIHJldHVybiByZXM2NDsKK30KKwordWludDh4OF90IHZtbHNfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZNTFMuSTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZtbHNfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYykKK3sKKyAgICAvLyBubyA4IGJpdCBzaW1kIG11bHRpcGx5LCBuZWVkIHRvIGdvIHRvIDE2IGJpdHMgLSAgYW5kIHVzZSB0aGUgbG93IDY0IGJpdHMKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzNjQgPSB2bXVsX3U4KGIsYyk7CisgICAgcmVzID0gX21tX3N1Yl9lcGk4IChfcE0xMjhpKGEpLCBfcE0xMjhpKHJlczY0KSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKwordWludDE2eDRfdCB2bWxzX3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYyk7IC8vIFZNTFMuSTE2IGQwLGQwLGQwCisjZGVmaW5lIHZtbHNfdTE2IHZtbHNfczE2CisKK3VpbnQzMngyX3Qgdm1sc191MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpOyAvLyBWTUxTLkkzMiBkMCxkMCxkMAorI2RlZmluZSB2bWxzX3UzMiB2bWxzX3MzMgorCisKK2ludDh4MTZfdCB2bWxzcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIGludDh4MTZfdCBjKTsgLy8gVk1MUy5JOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3Qgdm1sc3FfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBpbnQ4eDE2X3QgYykgLy8gVk1MUy5JOCBxMCxxMCxxMAoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgLy8gbm8gOCBiaXQgc2ltZCBtdWx0aXBseSwgbmVlZCB0byBnbyB0byAxNiBiaXRzCisgICAgX19tMTI4aSBiMTYsIGMxNiwgcjE2XzEsIGFfMiwgcjE2XzI7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF8xNl9ldmVuX29kZFsxNl0gPSB7IDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUgfTsKKyAgICBiMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoYik7IC8vIFNTRSA0LjEKKyAgICBjMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoYyk7IC8vIFNTRSA0LjEKKyAgICByMTZfMSA9IF9tbV9tdWxsb19lcGkxNiAoYjE2LCBjMTYpOworICAgIHIxNl8xID0gX21tX3NodWZmbGVfZXBpOCAocjE2XzEsICooX19tMTI4aSopIG1hc2s4XzE2X2V2ZW5fb2RkKTsKKyAgICByMTZfMSA9IF9tbV9zdWJfZXBpOCAoYSwgcjE2XzEpOworICAgIC8vc3dhcCBoaSBhbmQgbG93IHBhcnQgb2YgYSwgYiwgYyB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgZGF0YQorICAgIGFfMiA9IF9tbV9zaHVmZmxlX2VwaTMyIChhLCBfU1dBUF9ISV9MT1czMik7CisgICAgYjE2ID0gX21tX3NodWZmbGVfZXBpMzIgKGIsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBjMTYgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYywgX1NXQVBfSElfTE9XMzIpOworICAgIGIxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChiMTYpOyAvLyBTU0UgNC4xCisgICAgYzE2ID0gX01NX0NWVEVQSThfRVBJMTYgKGMxNik7IC8vIFNTRSA0LjEKKworICAgIHIxNl8yID0gX21tX211bGxvX2VwaTE2IChiMTYsIGMxNik7CisgICAgcjE2XzIgPSBfbW1fc2h1ZmZsZV9lcGk4IChyMTZfMiwgKihfX20xMjhpKikgbWFzazhfMTZfZXZlbl9vZGQpOworICAgIHIxNl8yID0gX21tX3N1Yl9lcGk4IChhXzIsIHIxNl8yKTsKKyAgICByZXR1cm4gX21tX3VucGFja2xvX2VwaTY0KHIxNl8xLHIxNl8yKTsKK30KKworaW50MTZ4OF90IHZtbHNxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCBjKTsgLy8gVk1MUy5JMTYgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZtbHNxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCBjKSAvLyBWTUxTLkkxNiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9tbV9tdWxsb19lcGkxNiAoYywgYik7CisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMTYgKGEsIHJlcyk7Cit9CisKK2ludDMyeDRfdCB2bWxzcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgYyk7IC8vIFZNTFMuSTMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2bWxzcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgYykgLy8gVk1MUy5JMzIgcTAscTAscTAKK3sKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfTU1fTVVMTE9fRVBJMzIgKGMsIGIpOyAvL1NTRTQuMQorICAgIHJldHVybiBfbW1fc3ViX2VwaTMyIChhLCByZXMpOworfQorCitmbG9hdDMyeDRfdCB2bWxzcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMng0X3QgYyk7IC8vIFZNTFMuRjMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZtbHNxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDRfdCBjKSAvLyBWTUxTLkYzMiBxMCxxMCxxMAoreworICAgIF9fbTEyOCByZXM7CisgICAgcmVzID0gX21tX211bF9wcyAoYywgYik7CisgICAgcmV0dXJuIF9tbV9zdWJfcHMgKGEsIHJlcyk7Cit9CisKK3VpbnQ4eDE2X3Qgdm1sc3FfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIHVpbnQ4eDE2X3QgYyk7IC8vIFZNTFMuSTggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2bWxzcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgdWludDh4MTZfdCBjKSAvLyBWTUxTLkk4IHEwLHEwLHEwCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICAvLyBubyA4IGJpdCBzaW1kIG11bHRpcGx5LCBuZWVkIHRvIGdvIHRvIDE2IGJpdHMKKyAgICBfX20xMjhpIGIxNiwgYzE2LCByMTZfMSwgYV8yLCByMTZfMjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzE2X2V2ZW5fb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSB9OworICAgIGIxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChiKTsgLy8gU1NFIDQuMQorICAgIGMxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChjKTsgLy8gU1NFIDQuMQorICAgIHIxNl8xID0gX21tX211bGxvX2VwaTE2IChiMTYsIGMxNik7CisgICAgcjE2XzEgPSBfbW1fc2h1ZmZsZV9lcGk4IChyMTZfMSwgKihfX20xMjhpKikgbWFzazhfMTZfZXZlbl9vZGQpOyAvL3JldHVybiB0byA4IGJpdHMKKyAgICByMTZfMSA9IF9tbV9zdWJfZXBpOCAoYSwgcjE2XzEpOworICAgIC8vc3dhcCBoaSBhbmQgbG93IHBhcnQgb2YgYSwgYiBhbmQgYyB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgZGF0YQorICAgIGFfMiA9IF9tbV9zaHVmZmxlX2VwaTMyIChhLCBfU1dBUF9ISV9MT1czMik7CisgICAgYjE2ID0gX21tX3NodWZmbGVfZXBpMzIgKGIsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBjMTYgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYywgX1NXQVBfSElfTE9XMzIpOworICAgIGIxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChiMTYpOyAvLyBTU0UgNC4xCisgICAgYzE2ID0gX01NX0NWVEVQVThfRVBJMTYgKGMxNik7IC8vIFNTRSA0LjEKKworICAgIHIxNl8yID0gX21tX211bGxvX2VwaTE2IChiMTYsIGMxNik7CisgICAgcjE2XzIgPSBfbW1fc2h1ZmZsZV9lcGk4IChyMTZfMiwgKihfX20xMjhpKikgbWFzazhfMTZfZXZlbl9vZGQpOworICAgIHIxNl8yID0gX21tX3N1Yl9lcGk4KGFfMiwgcjE2XzIpOworICAgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpNjQocjE2XzEscjE2XzIpOworfQorCit1aW50MTZ4OF90IHZtbHNxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDhfdCBjKTsgLy8gVk1MUy5JMTYgcTAscTAscTAKKyNkZWZpbmUgdm1sc3FfdTE2IHZtbHNxX3MxNgorCit1aW50MzJ4NF90IHZtbHNxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDRfdCBjKTsgLy8gVk1MUy5JMzIgcTAscTAscTAKKyNkZWZpbmUgdm1sc3FfdTMyIHZtbHNxX3MzMgorCisvLyoqKioqKioqKioqKioqKioqKioqIFZlY3RvciBtdWx0aXBseSBzdWJ0cmFjdCBsb25nICh3aWRlbmluZyBtdWx0aXBseSBzdWJ0cmFjdCkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDE2eDhfdCB2bWxzbF9zOChpbnQxNng4X3QgYSwgaW50OHg4X3QgYiwgaW50OHg4X3QgYyk7IC8vIFZNTFNMLlM4IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2bWxzbF9zOChpbnQxNng4X3QgYSwgaW50OHg4X3QgYiwgaW50OHg4X3QgYykgLy8gVk1MU0wuUzggcTAsZDAsZDAKK3sKKyAgICBpbnQxNng4X3QgcmVzOworICAgIHJlcyA9IHZtdWxsX3M4KGIsIGMpOworICAgIHJldHVybiBfbW1fc3ViX2VwaTE2IChhLCByZXMpOworfQorCitpbnQzMng0X3Qgdm1sc2xfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWTUxTTC5TMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZtbHNsX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKSAvLyBWTUxTTC5TMTYgcTAsZDAsZDAKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHNlcmlhbCBpbXBsZW1lbnRhdGlvbgorICAgIGludDMyeDRfdCByZXM7CisgICAgcmVzID0gdm11bGxfczE2KGIsICBjKTsKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkzMiAoYSwgcmVzKTsKK30KKworaW50NjR4Ml90IHZtbHNsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKTsgLy8gVk1MU0wuUzMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2bWxzbF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYykgLy8gVk1MU0wuUzMyIHEwLGQwLGQwCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBzZXJpYWwgaW1wbGVtZW50YXRpb24KKyAgICBpbnQ2NHgyX3QgcmVzOworICAgIHJlcyA9IHZtdWxsX3MzMiggYixjKTsKKyAgICByZXR1cm4gX21tX3N1Yl9lcGk2NCAoYSwgcmVzKTsKK30KKwordWludDE2eDhfdCB2bWxzbF91OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZNTFNMLlU4IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3Qgdm1sc2xfdTgodWludDE2eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpIC8vIFZNTFNMLlU4IHEwLGQwLGQwCit7CisgICAgdWludDE2eDhfdCByZXM7CisgICAgcmVzID0gdm11bGxfdTgoYiwgYyk7CisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMTYgKGEsIHJlcyk7Cit9CisKK3VpbnQzMng0X3Qgdm1sc2xfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IGMpOyAvLyBWTUxTTC5zMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2bWxzbF91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYykgLy8gVk1MU0wuczE2IHEwLGQwLGQwCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBzZXJpYWwgaW1wbGVtZW50YXRpb24KKyAgICB1aW50MzJ4NF90IHJlczsKKyAgICByZXMgPSB2bXVsbF91MTYoYiwgYyk7CisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMzIgKGEsIHJlcyk7Cit9CisKK3VpbnQ2NHgyX3Qgdm1sc2xfdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpOyAvLyBWTUxTTC5VMzIgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2bWxzbF91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgYykgLy8gVk1MU0wuVTMyIHEwLGQwLGQwCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBzZXJpYWwgaW1wbGVtZW50YXRpb24KKyAgICBpbnQ2NHgyX3QgcmVzOworICAgIHJlcyA9IHZtdWxsX3UzMiggYixjKTsKKyAgICByZXR1cm4gX21tX3N1Yl9lcGk2NCAoYSwgcmVzKTsKK30KKworLy8qKioqKiogIFZlY3RvciBzYXR1cmF0aW5nIGRvdWJsaW5nIG11bHRpcGx5IGhpZ2ggKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQxNng0X3QgdnFkbXVsaF9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYik7IC8vIFZRRE1VTEguUzE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDE2eDRfdCB2cWRtdWxoX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBpbnQxNng0X3QgcmVzOworICAgIGludDMyX3QgYTMyLCBiMzIsIGk7CisgICAgZm9yIChpID0gMDsgaTw0OyBpKyspIHsKKyAgICAgICAgYTMyID0gKGludDMyX3QpIGEubTY0X2kxNltpXTsKKyAgICAgICAgYjMyID0gKGludDMyX3QpIGIubTY0X2kxNltpXTsKKyAgICAgICAgYTMyID0gKGEzMiAqIGIzMikgPj4gMTU7CisgICAgICAgIHJlcy5tNjRfaTE2W2ldID0gKGEzMiA9PSAweDgwMDApID8gMHg3ZmZmIDogKGludDE2X3QpIGEzMjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworaW50MzJ4Ml90IHZxZG11bGhfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZRRE1VTEguUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cWRtdWxoX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIC8vIG5vIG11bHRpcGx5IGhpZ2ggMzIgYml0IFNJTUQgaW4gSUEzMiwgc28gbmVlZCB0byBkbyBzb21lIHRyaWNrcywgc2VyaWFsIHNvbHV0aW9uIG1heSBiZSBmYXN0ZXIKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIGEgc2VyaWFsIHNvbHV0aW9uCisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgbWFzazsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDMyX3QgY21hc2szMltdID0gezB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDB9OworICAgIGludDY0eDJfdCBtdWw7CisgICAgbXVsID0gdm11bGxfczMyKGEsYik7CisgICAgbXVsID0gX21tX3NsbGlfZXBpNjQobXVsLDEpOyAvL2RvdWJsZSB0aGUgcmVzdWx0CisgICAgLy9hdCB0aGlzIHBvaW50IHN0YXJ0IHRyZWF0aW5nIDIgNjQtYml0IG51bWJlcnMgYXMgNCAzMi1iaXQKKyAgICBtdWwgPSBfbW1fc2h1ZmZsZV9lcGkzMiAobXVsLCAxIHwgKDMgPDwgMikgfCAoMCA8PCA0KSB8ICgyIDw8IDYpKTsgLy9zaHVmZmxlIHRoZSBkYXRhIHRvIGdldCAyIDMyLWJpdHMKKyAgICBtYXNrID0gX21tX2NtcGVxX2VwaTMyIChtdWwsICooX19tMTI4aSopY21hc2szMik7CisgICAgbXVsID0gX21tX3hvcl9zaTEyOCAobXVsLCAgbWFzayk7IC8vcmVzIHNhdHVyYXRlZCBmb3IgMHg4MDAwMDAwMAorICAgIHJldHVybjY0KG11bCk7Cit9CisKK2ludDE2eDhfdCB2cWRtdWxocV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlFETVVMSC5TMTYgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZxZG11bGhxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZRRE1VTEguUzE2IHEwLHEwLHEwCit7CisgICAgX19tMTI4aSByZXMsIHJlc19sbywgbWFzazsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDE2X3QgY21hc2tbXSA9IHsweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMH07CisgICAgcmVzID0gX21tX211bGhpX2VwaTE2IChhLCBiKTsKKyAgICByZXMgPSBfbW1fc2xsaV9lcGkxNiAocmVzLCAxKTsgLy9kb3VibGUgdGhlIHJlc3VsdCwgZG9uJ3QgY2FyZSBhYm91dCBzYXR1cmF0aW9uCisgICAgcmVzX2xvID0gX21tX211bGxvX2VwaTE2IChhLCBiKTsKKyAgICByZXNfbG8gPSBfbW1fc3JsaV9lcGkxNihyZXNfbG8sMTUpOyAvL3Rha2UgdGhlIGhpZ2hlc3QgYml0CisgICAgcmVzID0gX21tX2FkZF9lcGkxNihyZXMsIHJlc19sbyk7IC8vY29tYmluZSByZXN1bHRzCisgICAgbWFzayA9IF9tbV9jbXBlcV9lcGkxNiAocmVzLCAqKF9fbTEyOGkqKWNtYXNrKTsKKyAgICByZXR1cm4gX21tX3hvcl9zaTEyOCAocmVzLCAgbWFzayk7IC8vcmVzIHNhdHVyYXRlZCBmb3IgMHg4MDAwCit9CisKK2ludDMyeDRfdCB2cWRtdWxocV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlFETVVMSC5TMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4NF90IHZxZG11bGhxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfVU5FRkZFQ1RJVkUpCit7CisgICAgLy8gbm8gbXVsdGlwbHkgaGlnaCAzMiBiaXQgU0lNRCBpbiBJQTMyLCBtYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBhIHNlcmlhbCBzb2x1dGlvbiBmb3IgdGhlIFNTU0UzIHRhcmdldAorICAgIF9fbTEyOGkgYWIsIGJhLCBtYXNrLCBtdWwsIG11bDE7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQzMl90IGNtYXNrMzJbXSA9IHsweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwfTsKKyAgICBhYiA9IF9tbV91bnBhY2tsb19lcGkzMiAoYSwgYik7IC8vYTAsIGIwLCBhMSxiMQorICAgIGJhID0gX21tX3VucGFja2xvX2VwaTMyIChiLCBhKTsgLy9iMCwgYTAsIGIxLGExCisgICAgbXVsID0gX01NX01VTF9FUEkzMihhYiwgYmEpOyAvL3VzZXMgMXJzdCBhbmQgM3JkIGRhdGEgbGFuZXMsIHRoZSBtdWx0aXBsaWNhdGlvbiBnaXZlcyA2NCBiaXQgcmVzdWx0CisgICAgbXVsID0gX21tX3NsbGlfZXBpNjQobXVsLDEpOyAvL2RvdWJsZSB0aGUgcmVzdWx0CisgICAgYWIgPSBfbW1fdW5wYWNraGlfZXBpMzIgKGEsIGIpOyAvL2EyLCBiMiwgYTMsYjMKKyAgICBiYSA9IF9tbV91bnBhY2toaV9lcGkzMiAoYiwgYSk7IC8vYjIsIGEyLCBiMyxhMworICAgIG11bDEgPSBfTU1fTVVMX0VQSTMyKGFiLCBiYSk7IC8vdXNlcyAxcnN0IGFuZCAzcmQgZGF0YSBsYW5lcywgdGhlIG11bHRpcGxpY2F0aW9uIGdpdmVzIDY0IGJpdCByZXN1bHQKKyAgICBtdWwxID0gX21tX3NsbGlfZXBpNjQobXVsMSwxKTsgLy9kb3VibGUgdGhlIHJlc3VsdAorICAgIG11bCA9IF9tbV9zaHVmZmxlX2VwaTMyIChtdWwsIDEgfCAoMyA8PCAyKSB8ICgwIDw8IDQpIHwgKDIgPDwgNikpOyAvL3NodWZmbGUgdGhlIGRhdGEgdG8gZ2V0IDIgMzItYml0cworICAgIG11bDEgPSBfbW1fc2h1ZmZsZV9lcGkzMiAobXVsMSwgMSB8ICgzIDw8IDIpIHwgKDAgPDwgNCkgfCAoMiA8PCA2KSk7IC8vc2h1ZmZsZSB0aGUgZGF0YSB0byBnZXQgMiAzMi1iaXRzCisgICAgbXVsID0gX21tX3VucGFja2xvX2VwaTY0KG11bCwgbXVsMSk7CisgICAgbWFzayA9IF9tbV9jbXBlcV9lcGkzMiAobXVsLCAqKF9fbTEyOGkqKWNtYXNrMzIpOworICAgIHJldHVybiBfbW1feG9yX3NpMTI4IChtdWwsICBtYXNrKTsgLy9yZXMgc2F0dXJhdGVkIGZvciAweDgwMDAwMDAwCit9CisKKy8vKioqKioqKioqIFZlY3RvciBzYXR1cmF0aW5nIHJvdW5kaW5nIGRvdWJsaW5nIG11bHRpcGx5IGhpZ2ggKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL0lmIHVzZSBfbW1fbXVsaHJzX3h4IGZ1bmN0aW9ucyAgdGhlIHJlc3VsdCBtYXkgZGlmZmVyIGZyb20gTkVPTiBvbmUgYSBsaXR0bGUgIGR1ZSB0byBkaWZmZXJlbnQgcm91bmRpbmcgcnVsZXMgYW5kIG9yZGVyCitpbnQxNng0X3QgdnFyZG11bGhfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIpOyAvLyBWUVJETVVMSC5TMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZxcmRtdWxoX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2cXJkbXVsaHFfczE2KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworaW50MzJ4Ml90IHZxcmRtdWxoX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUVJETVVMSC5TMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4Ml90IHZxcmRtdWxoX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfVU5FRkZFQ1RJVkUpCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBhIHNlcmlhbCBzb2x1dGlvbgorICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDMyX3QgY21hc2szMltdID0gezB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDB9OworICAgIF9fbTEyOGkgcmVzX3NhdCwgbWFzaywgbWFzazE7CisgICAgaW50NjR4Ml90IG11bDsKKyAgICBtdWwgPSB2bXVsbF9zMzIoYSxiKTsKKyAgICByZXNfc2F0ID0gX21tX3NsbGlfZXBpNjQgKG11bCwgMSk7IC8vZG91YmxlIHRoZSByZXN1bHQsIHNhdHVyYXRpb24gbm90IGNvbnNpZGVyZWQKKyAgICBtYXNrMSA9IF9tbV9zbGxpX2VwaTY0KHJlc19zYXQsIDMyKTsgLy9zaGlmdCBsZWZ0IHRoZW4gYmFjayByaWdodCB0bworICAgIG1hc2sxID0gX21tX3NybGlfZXBpNjQobWFzazEsMzEpOyAvL2dldCAgMzEtdGggYml0IDEgb3IgemVybworICAgIG11bCA9IF9tbV9hZGRfZXBpMzIgKHJlc19zYXQsIG1hc2sxKTsgLy9hY3R1YWwgcm91bmRpbmcKKyAgICAvL2F0IHRoaXMgcG9pbnQgc3RhcnQgdHJlYXRpbmcgMiA2NC1iaXQgbnVtYmVycyBhcyA0IDMyLWJpdAorICAgIG11bCA9IF9tbV9zaHVmZmxlX2VwaTMyIChtdWwsIDEgfCAoMyA8PCAyKSB8ICgwIDw8IDQpIHwgKDIgPDwgNikpOyAvL3NodWZmbGUgdGhlIGRhdGEgdG8gZ2V0IDIgMzItYml0cyBmcm9tIGVhY2ggNjQtYml0CisgICAgbWFzayA9IF9tbV9jbXBlcV9lcGkzMiAobXVsLCAqKF9fbTEyOGkqKWNtYXNrMzIpOworICAgIG11bCA9IF9tbV94b3Jfc2kxMjggKG11bCwgIG1hc2spOyAvL3JlcyBzYXR1cmF0ZWQgZm9yIDB4ODAwMDAwMDAKKyAgICByZXR1cm42NChtdWwpOworfQorCitpbnQxNng4X3QgdnFyZG11bGhxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUVJETVVMSC5TMTYgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZxcmRtdWxocV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSAvLyBWUVJETVVMSC5TMTYgcTAscTAscTAKK3sKKyAgICBfX20xMjhpIG1hc2ssIHJlczsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDE2X3QgY21hc2tbXSA9IHsweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMH07CisgICAgcmVzID0gX21tX211bGhyc19lcGkxNiAoYSwgYik7CisgICAgbWFzayA9IF9tbV9jbXBlcV9lcGkxNiAocmVzLCAqKF9fbTEyOGkqKWNtYXNrKTsKKyAgICByZXR1cm4gX21tX3hvcl9zaTEyOCAocmVzLCAgbWFzayk7IC8vcmVzIHNhdHVyYXRlZCBmb3IgMHg4MDAwCit9CisKK2ludDMyeDRfdCB2cXJkbXVsaHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZRUkRNVUxILlMzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMng0X3QgdnFyZG11bGhxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfVU5FRkZFQ1RJVkUpCit7CisgICAgLy8gbm8gbXVsdGlwbHkgaGlnaCAzMiBiaXQgU0lNRCBpbiBJQTMyLCBtYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBhIHNlcmlhbCBzb2x1dGlvbiBmb3IgdGhlIFNTU0UzIHRhcmdldAorICAgIF9fbTEyOGkgYWIsIGJhLCAgbWFzaywgbXVsLCBtdWwxLCBtYXNrMTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDMyX3QgY21hc2szMltdID0gezB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDB9OworICAgIGFiID0gX21tX3VucGFja2xvX2VwaTMyIChhLCBiKTsgLy9hMCwgYjAsIGExLGIxCisgICAgYmEgPSBfbW1fdW5wYWNrbG9fZXBpMzIgKGIsIGEpOyAvL2IwLCBhMCwgYjEsYTEKKyAgICBtdWwgPSBfTU1fTVVMX0VQSTMyKGFiLCBiYSk7IC8vdXNlcyAxcnN0IGFuZCAzcmQgZGF0YSBsYW5lcywgdGhlIG11bHRpcGxpY2F0aW9uIGdpdmVzIDY0IGJpdCByZXN1bHQKKyAgICBtdWwgPSBfbW1fc2xsaV9lcGk2NCAobXVsLCAxKTsgLy9kb3VibGUgdGhlIHJlc3VsdCwgc2F0dXJhdGlvbiBub3QgY29uc2lkZXJlZAorICAgIG1hc2sxID0gX21tX3NsbGlfZXBpNjQobXVsLCAzMik7IC8vc2hpZnQgbGVmdCB0aGVuIGJhY2sgcmlnaHQgdG8KKyAgICBtYXNrMSA9IF9tbV9zcmxpX2VwaTY0KG1hc2sxLDMxKTsgLy9nZXQgIDMxLXRoIGJpdCAxIG9yIHplcm8KKyAgICBtdWwgPSBfbW1fYWRkX2VwaTMyIChtdWwsIG1hc2sxKTsgLy9hY3R1YWwgcm91bmRpbmcKKworICAgIGFiID0gX21tX3VucGFja2hpX2VwaTMyIChhLCBiKTsgLy9hMiwgYjIsIGEzLGIzCisgICAgYmEgPSBfbW1fdW5wYWNraGlfZXBpMzIgKGIsIGEpOyAvL2IyLCBhMiwgYjMsYTMKKyAgICBtdWwxID0gX01NX01VTF9FUEkzMihhYiwgYmEpOyAvL3VzZXMgMXJzdCBhbmQgM3JkIGRhdGEgbGFuZXMsIHRoZSBtdWx0aXBsaWNhdGlvbiBnaXZlcyA2NCBiaXQgcmVzdWx0CisgICAgbXVsMSA9IF9tbV9zbGxpX2VwaTY0IChtdWwxLCAxKTsgLy9kb3VibGUgdGhlIHJlc3VsdCwgc2F0dXJhdGlvbiBub3QgY29uc2lkZXJlZAorICAgIG1hc2sxID0gX21tX3NsbGlfZXBpNjQobXVsMSwgMzIpOyAvL3NoaWZ0IGxlZnQgdGhlbiBiYWNrIHJpZ2h0IHRvCisgICAgbWFzazEgPSBfbW1fc3JsaV9lcGk2NChtYXNrMSwzMSk7IC8vZ2V0ICAzMS10aCBiaXQgMSBvciB6ZXJvCisgICAgbXVsMSA9IF9tbV9hZGRfZXBpMzIgKG11bDEsIG1hc2sxKTsgLy9hY3R1YWwgcm91bmRpbmcKKyAgICAvL2F0IHRoaXMgcG9pbnQgc3RhcnQgdHJlYXRpbmcgMiA2NC1iaXQgbnVtYmVycyBhcyA0IDMyLWJpdAorICAgIG11bCA9IF9tbV9zaHVmZmxlX2VwaTMyIChtdWwsIDEgfCAoMyA8PCAyKSB8ICgwIDw8IDQpIHwgKDIgPDwgNikpOyAvL3NodWZmbGUgdGhlIGRhdGEgdG8gZ2V0IDIgMzItYml0cyBmcm9tIGVhY2ggNjQtYml0CisgICAgbXVsMSA9IF9tbV9zaHVmZmxlX2VwaTMyIChtdWwxLCAxIHwgKDMgPDwgMikgfCAoMCA8PCA0KSB8ICgyIDw8IDYpKTsgLy9zaHVmZmxlIHRoZSBkYXRhIHRvIGdldCAyIDMyLWJpdHMgZnJvbSBlYWNoIDY0LWJpdAorICAgIG11bCA9IF9tbV91bnBhY2tsb19lcGk2NChtdWwsIG11bDEpOworICAgIG1hc2sgPSBfbW1fY21wZXFfZXBpMzIgKG11bCwgKihfX20xMjhpKiljbWFzazMyKTsKKyAgICByZXR1cm4gX21tX3hvcl9zaTEyOCAobXVsLCAgbWFzayk7IC8vcmVzIHNhdHVyYXRlZCBmb3IgMHg4MDAwMDAwMAorfQorCisvLyoqKioqKioqKioqKipWZWN0b3Igd2lkZW5pbmcgc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBhY2N1bXVsYXRlIChsb25nIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgYWNjdW11bGF0ZSkgKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MzJ4NF90IHZxZG1sYWxfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWUURNTEFMLlMxNiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnFkbWxhbF9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYykgLy8gVlFETUxBTC5TMTYgcTAsZDAsZDAKK3sKKyAgICAvL25vdCBvcHRpbWFsIFNJTUQgc291bHV0aW9uLCBzZXJpYWwgbWF5IGJlIGZhc3RlcgorICAgIF9fbTEyOGkgcmVzMzI7CisgICAgcmVzMzIgPSB2bXVsbF9zMTYoYiwgIGMpOworICAgIHJlczMyID0gdnFkX3MzMihyZXMzMik7IC8vZG91YmxpbmcgJiBzYXR1cmF0aW9uICxpZiBubyBzYXR1cmF0aW9uIHdlIGNvdWxkIHVzZSBfbW1fc2xsaV9lcGkzMiAocmVzLCAxKTsKKyAgICByZXR1cm4gdnFhZGRxX3MzMihyZXMzMiwgYSk7IC8vc2F0dXJhdGlvbgorfQorCitpbnQ2NHgyX3QgdnFkbWxhbF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYyk7IC8vIFZRRE1MQUwuUzMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDJfdCB2cWRtbGFsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKSxfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIF9fbTEyOGkgcmVzNjQ7CisgICAgcmVzNjQgPSB2bXVsbF9zMzIoYixjKTsKKyAgICByZXM2NCA9IHZxYWRkcV9zNjQocmVzNjQsIHJlczY0KTsgLy9kb3VibGluZyAmIHNhdHVyYXRpb24gLGlmIG5vIHNhdHVyYXRpb24gd2UgY291bGQgdXNlIF9tbV9zbGxpX2VwaTY0IChyZXMsIDEpOworICAgIHJldHVybiB2cWFkZHFfczY0KHJlczY0LCBhKTsgLy9zYXR1cmF0aW9uCit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKiAgVmVjdG9yIHN1YnRyYWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdnN1Yl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlNVQi5JOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2c3ViX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX3N1Yl9lcGk4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK2ludDE2eDRfdCB2c3ViX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWU1VCLkkxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnN1Yl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fc3ViX2VwaTE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK2ludDMyeDJfdCB2c3ViX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWU1VCLkkzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnN1Yl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fc3ViX2VwaTMyKF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK2ludDY0eDFfdCB2c3ViX3M2NChpbnQ2NHgxX3QgYSwgIGludDY0eDFfdCBiKTsgLy8gVlNVQi5JNjQgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4MV90IHZzdWJfczY0KGludDY0eDFfdCBhLCAgaW50NjR4MV90IGIpCit7CisgICAgaW50NjR4MV90IHJlczY0OworICAgIHJlczY0Lm02NF9pNjRbMF0gPSBhLm02NF9pNjRbMF0gLSBiLm02NF9pNjRbMF07CisgICAgcmV0dXJuIHJlczY0OworfQorCisKK2Zsb2F0MzJ4Ml90IHZzdWJfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWU1VCLkYzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2c3ViX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKQoreworICAgIGZsb2F0MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X2YzMlswXSA9IGEubTY0X2YzMlswXSAtIGIubTY0X2YzMlswXTsKKyAgICByZXMubTY0X2YzMlsxXSA9IGEubTY0X2YzMlsxXSAtIGIubTY0X2YzMlsxXTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHg4X3QgdnN1Yl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWU1VCLkk4IGQwLGQwLGQwCisjZGVmaW5lIHZzdWJfdTggdnN1Yl9zOAorCit1aW50MTZ4NF90IHZzdWJfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlNVQi5JMTYgZDAsZDAsZDAKKyNkZWZpbmUgdnN1Yl91MTYgdnN1Yl9zMTYKKwordWludDMyeDJfdCB2c3ViX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZTVUIuSTMyIGQwLGQwLGQwCisjZGVmaW5lIHZzdWJfdTMyIHZzdWJfczMyCisKKwordWludDY0eDFfdCB2c3ViX3U2NCh1aW50NjR4MV90IGEsICB1aW50NjR4MV90IGIpOyAvLyBWU1VCLkk2NCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50NjR4MV90IHZzdWJfdTY0KHVpbnQ2NHgxX3QgYSwgIHVpbnQ2NHgxX3QgYikKK3sKKyAgICBpbnQ2NHgxX3QgcmVzNjQ7CisgICAgcmVzNjQubTY0X3U2NFswXSA9IGEubTY0X3U2NFswXSAtIGIubTY0X3U2NFswXTsKKyAgICByZXR1cm4gcmVzNjQ7Cit9CisKKworaW50OHgxNl90ICAgdnN1YnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlNVQi5JOCBxMCxxMCxxMAorI2RlZmluZSB2c3VicV9zOCBfbW1fc3ViX2VwaTgKKworaW50MTZ4OF90ICAgdnN1YnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZTVUIuSTE2IHEwLHEwLHEwCisjZGVmaW5lIHZzdWJxX3MxNiBfbW1fc3ViX2VwaTE2CisKK2ludDMyeDRfdCAgIHZzdWJxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWU1VCLkkzMiBxMCxxMCxxMAorI2RlZmluZSB2c3VicV9zMzIgX21tX3N1Yl9lcGkzMgorCitpbnQ2NHgyX3QgICB2c3VicV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlNVQi5JNjQgcTAscTAscTAKKyNkZWZpbmUgdnN1YnFfczY0IF9tbV9zdWJfZXBpNjQKKworZmxvYXQzMng0X3QgdnN1YnFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWU1VCLkYzMiBxMCxxMCxxMAorI2RlZmluZSB2c3VicV9mMzIgX21tX3N1Yl9wcworCit1aW50OHgxNl90ICAgdnN1YnFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWU1VCLkk4IHEwLHEwLHEwCisjZGVmaW5lIHZzdWJxX3U4IF9tbV9zdWJfZXBpOAorCit1aW50MTZ4OF90ICAgdnN1YnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlNVQi5JMTYgcTAscTAscTAKKyNkZWZpbmUgdnN1YnFfdTE2IF9tbV9zdWJfZXBpMTYKKwordWludDMyeDRfdCAgIHZzdWJxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZTVUIuSTMyIHEwLHEwLHEwCisjZGVmaW5lIHZzdWJxX3UzMiBfbW1fc3ViX2VwaTMyCisKK3VpbnQ2NHgyX3QgICB2c3VicV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWU1VCLkk2NCBxMCxxMCxxMAorI2RlZmluZSB2c3VicV91NjQgX21tX3N1Yl9lcGk2NAorCisvLyoqKioqKioqKioqKioqKlZlY3RvciBsb25nIHN1YnRyYWN0OiB2c3ViIC0+IFZyW2ldOj1WYVtpXS1WYltpXSAqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vVmEsIFZiIGhhdmUgZXF1YWwgbGFuZSBzaXplcywgcmVzdWx0IGlzIGEgMTI4IGJpdCB2ZWN0b3Igb2YgbGFuZXMgdGhhdCBhcmUgdHdpY2UgdGhlIHdpZHRoLgoraW50MTZ4OF90IHZzdWJsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWU1VCTC5TOCBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnN1YmxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgLy8gVlNVQkwuUzggcTAsZDAsZDAKK3sKKyAgICBfX20xMjhpIGExNiwgYjE2OworICAgIGExNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGEpKTsgLy9TU0U0LjEsCisgICAgYjE2ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYikpOyAvL1NTRTQuMSwKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkxNiAoYTE2LCBiMTYpOworfQorCitpbnQzMng0X3QgdnN1YmxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZTVUJMLlMxNiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnN1YmxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgLy8gVlNVQkwuUzE2IHEwLGQwLGQwCit7CisgICAgX19tMTI4aSBhMzIsIGIzMjsKKyAgICBhMzIgPSBfTU1fQ1ZURVBJMTZfRVBJMzIgKF9wTTEyOGkoYSkpOyAvL1NTRTQuMQorICAgIGIzMiA9IF9NTV9DVlRFUEkxNl9FUEkzMiAoX3BNMTI4aShiKSk7IC8vU1NFNC4xLAorICAgIHJldHVybiBfbW1fc3ViX2VwaTMyIChhMzIsIGIzMik7Cit9CisKK2ludDY0eDJfdCB2c3VibF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlNVQkwuUzMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2c3VibF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSAvLyBWU1VCTC5TMzIgcTAsZDAsZDAKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbAorICAgIF9fbTEyOGkgYTY0LCBiNjQ7CisgICAgYTY0ID0gX01NX0NWVEVQSTMyX0VQSTY0IChfcE0xMjhpKGEpKTsgLy9TU0U0LjEKKyAgICBiNjQgPSBfTU1fQ1ZURVBJMzJfRVBJNjQgKF9wTTEyOGkoYikpOyAvL1NTRTQuMSwKKyAgICByZXR1cm4gX21tX3N1Yl9lcGk2NCAoYTY0LCBiNjQpOworfQorCit1aW50MTZ4OF90IHZzdWJsX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZTVUJMLlU4IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdnN1YmxfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKSAvLyBWU1VCTC5VOCBxMCxkMCxkMAoreworICAgIF9fbTEyOGkgYTE2LCBiMTY7CisgICAgYTE2ID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvL1NTRTQuMSwKKyAgICBiMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoX3BNMTI4aShiKSk7IC8vU1NFNC4xLAorICAgIHJldHVybiBfbW1fc3ViX2VwaTE2IChhMTYsIGIxNik7Cit9CisKK3VpbnQzMng0X3QgdnN1YmxfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlNVQkwuczE2IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdnN1YmxfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKSAvLyBWU1VCTC5zMTYgcTAsZDAsZDAKK3sKKyAgICBfX20xMjhpIGEzMiwgYjMyOworICAgIGEzMiA9IF9NTV9DVlRFUFUxNl9FUEkzMiAoX3BNMTI4aShhKSk7IC8vU1NFNC4xCisgICAgYjMyID0gX01NX0NWVEVQVTE2X0VQSTMyIChfcE0xMjhpKGIpKTsgLy9TU0U0LjEsCisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMzIgKGEzMiwgYjMyKTsKK30KKwordWludDY0eDJfdCB2c3VibF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWU1VCTC5VMzIgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2c3VibF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpIC8vIFZTVUJMLlUzMiBxMCxkMCxkMAoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgX19tMTI4aSBhNjQsIGI2NDsKKyAgICBhNjQgPSBfTU1fQ1ZURVBVMzJfRVBJNjQgKF9wTTEyOGkoYSkpOyAvL1NTRTQuMQorICAgIGI2NCA9IF9NTV9DVlRFUFUzMl9FUEk2NCAoX3BNMTI4aShiKSk7IC8vU1NFNC4xLAorICAgIHJldHVybiBfbW1fc3ViX2VwaTY0IChhNjQsIGI2NCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKiogVmVjdG9yIHdpZGUgc3VidHJhY3Q6IHZzdWIgLT4gVnJbaV06PVZhW2ldLVZiW2ldICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDE2eDhfdCB2c3Vid19zOChpbnQxNng4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZTVUJXLlM4IHEwLHEwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2c3Vid19zOChpbnQxNng4X3QgYSwgaW50OHg4X3QgYikgLy8gVlNVQlcuUzggcTAscTAsZDAKK3sKKyAgICBfX20xMjhpIGIxNjsKKyAgICBiMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShiKSk7IC8vU1NFNC4xLAorICAgIHJldHVybiBfbW1fc3ViX2VwaTE2IChhLCBiMTYpOworfQorCitpbnQzMng0X3QgdnN1YndfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZTVUJXLlMxNiBxMCxxMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnN1YndfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYikgLy8gVlNVQlcuUzE2IHEwLHEwLGQwCit7CisgICAgX19tMTI4aSBiMzI7CisgICAgYjMyID0gX01NX0NWVEVQSTE2X0VQSTMyIChfcE0xMjhpKGIpKTsgLy9TU0U0LjEsCisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMzIgKGEsIGIzMik7Cit9CisKK2ludDY0eDJfdCB2c3Vid19zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlNVQlcuUzMyIHEwLHEwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2c3Vid19zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiKSAvLyBWU1VCVy5TMzIgcTAscTAsZDAKK3sKKyAgICBfX20xMjhpIGI2NDsKKyAgICBiNjQgPSBfTU1fQ1ZURVBJMzJfRVBJNjQgKF9wTTEyOGkoYikpOyAvL1NTRTQuMQorICAgIHJldHVybiBfbW1fc3ViX2VwaTY0IChhLCBiNjQpOworfQorCit1aW50MTZ4OF90IHZzdWJ3X3U4KHVpbnQxNng4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWU1VCVy5VOCBxMCxxMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZzdWJ3X3U4KHVpbnQxNng4X3QgYSwgdWludDh4OF90IGIpIC8vIFZTVUJXLlU4IHEwLHEwLGQwCit7CisgICAgX19tMTI4aSBiMTY7CisgICAgYjE2ID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYikpOyAvL1NTRTQuMSwKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkxNiAoYSwgYjE2KTsKK30KKwordWludDMyeDRfdCB2c3Vid191MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWU1VCVy5zMTYgcTAscTAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2c3Vid191MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIpIC8vIFZTVUJXLnMxNiBxMCxxMCxkMAoreworICAgIF9fbTEyOGkgYjMyOworICAgIGIzMiA9IF9NTV9DVlRFUFUxNl9FUEkzMiAoX3BNMTI4aShiKSk7IC8vU1NFNC4xLAorICAgIHJldHVybiBfbW1fc3ViX2VwaTMyIChhLCBiMzIpOworfQorCit1aW50NjR4Ml90IHZzdWJ3X3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZTVUJXLlUzMiBxMCxxMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50NjR4Ml90IHZzdWJ3X3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYikgLy8gVlNVQlcuVTMyIHEwLHEwLGQwCit7CisgICAgX19tMTI4aSBiNjQ7CisgICAgYjY0ID0gX01NX0NWVEVQVTMyX0VQSTY0IChfcE0xMjhpKGIpKTsgLy9TU0U0LjEKKyAgICByZXR1cm4gX21tX3N1Yl9lcGk2NCAoYSwgYjY0KTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKipWZWN0b3Igc2F0dXJhdGluZyBzdWJ0cmFjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdnFzdWJfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZRU1VCLlM4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZxc3ViX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX3N1YnNfZXBpOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCitpbnQxNng0X3QgdnFzdWJfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZRU1VCLlMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnFzdWJfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX3N1YnNfZXBpMTYoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKworaW50MzJ4Ml90IHZxc3ViX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiKTsgLy8gVlFTVUIuUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cXN1Yl9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnFzdWJxX3MzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKworaW50NjR4MV90IHZxc3ViX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWUVNVQi5TNjQgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4MV90IHZxc3ViX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKSAvL25vIG9wdGltYWwgU0lNRCBzb3VsdXRpb24KK3sKKyAgICB1aW50NjR4MV90IHJlczsKKyAgICB1aW50NjRfdCBhNjQsYjY0OworICAgIGE2NCA9IGEubTY0X3U2NFswXTsKKyAgICBiNjQgPSBiLm02NF91NjRbMF07CisgICAgcmVzLm02NF91NjRbMF0gPSBhNjQgLSBiNjQ7CisKKyAgICBhNjQgPSAgKGE2NCA+PiA2MykgKyAofl9TSUdOQklUNjQpOworICAgIGlmICgoaW50NjRfdCkoKGE2NCBeIGI2NCkgJiAoYTY0IF4gcmVzLm02NF91NjRbMF0pKSA8IDApIHsKKyAgICAgICAgcmVzLm02NF91NjRbMF0gPSBhNjQ7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2cXN1Yl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWUVNVQi5VOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnFzdWJfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKQoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fc3Vic19lcHU4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQxNng0X3QgdnFzdWJfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlFTVUIuczE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnFzdWJfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKQoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX3N1YnNfZXB1MTYoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCB2cXN1Yl91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiKTsgLy8gVlFTVUIuVTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnFzdWJfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZxc3VicV91MzIoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQ2NHgxX3QgdnFzdWJfdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKTsgLy8gVlFTVUIuVTY0IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ2NHgxX3QgdnFzdWJfdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICB1aW50NjR4MV90IHJlczsKKyAgICB1aW50NjRfdCBhNjQsIGI2NDsKKyAgICBhNjQgPSBfVWk2NChhKTsKKyAgICBiNjQgPSBfVWk2NChiKTsKKyAgICBpZiAoYTY0ID4gYjY0KSB7CisgICAgICAgIHJlcy5tNjRfdTY0WzBdID0gYTY0IC0gYjY0OworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcy5tNjRfdTY0WzBdID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworaW50OHgxNl90ICAgdnFzdWJxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZRU1VCLlM4IHEwLHEwLHEwCisjZGVmaW5lIHZxc3VicV9zOCBfbW1fc3Vic19lcGk4CisKK2ludDE2eDhfdCAgIHZxc3VicV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlFTVUIuUzE2IHEwLHEwLHEwCisjZGVmaW5lIHZxc3VicV9zMTYgX21tX3N1YnNfZXBpMTYKKworaW50MzJ4NF90IHZxc3VicV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlFTVUIuUzMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2cXN1YnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikKK3sKKyAgICAvL25vIGNvcnJlc3BvbmRpbmcgeDg2IFNJTUQgc291bHV0aW9uLCBzcGVjaWFsIHRyaWNrcyBhcmUgbmVjZXNzYXJ5LiBUaGUgb3ZlcmZsb3cgaXMgcG9zc2libGUgb25seSBpZiBhIGFuZCBiIGhhdmUgb3Bwb3NpdGUgc2lnbnMgYW5kIHN1YiBoYXMgb3Bwb3NpdGUgc2lnbiB0byBhCisgICAgX19tMTI4aSBjN2ZmZmZmZmYsIHJlcywgcmVzX3NhdCwgcmVzX3hvcl9hLCBiX3hvcl9hOworICAgIGM3ZmZmZmZmZiA9IF9tbV9zZXQxX2VwaTMyKDB4N2ZmZmZmZmYpOworICAgIHJlcyA9IF9tbV9zdWJfZXBpMzIoYSwgYik7CisgICAgcmVzX3NhdCA9IF9tbV9zcmxpX2VwaTMyKGEsIDMxKTsKKyAgICByZXNfc2F0ID0gX21tX2FkZF9lcGkzMihyZXNfc2F0LCBjN2ZmZmZmZmYpOworICAgIHJlc194b3JfYSA9IF9tbV94b3Jfc2kxMjgocmVzLCBhKTsKKyAgICBiX3hvcl9hID0gX21tX3hvcl9zaTEyOChiLCBhKTsKKyAgICByZXNfeG9yX2EgPSBfbW1fYW5kX3NpMTI4KGJfeG9yX2EsIHJlc194b3JfYSk7CisgICAgcmVzX3hvcl9hID0gX21tX3NyYWlfZXBpMzIocmVzX3hvcl9hLDMxKTsgLy9wcm9wYWdhdGUgdGhlIHNpZ2ggYml0LCBhbGwgZmZmZiBpZiA8MCBhbGwgb25lcyBvdGhlcndpc2UKKyAgICByZXNfc2F0ID0gX21tX2FuZF9zaTEyOChyZXNfeG9yX2EsIHJlc19zYXQpOworICAgIHJlcyA9IF9tbV9hbmRub3Rfc2kxMjgocmVzX3hvcl9hLCByZXMpOworICAgIHJldHVybiBfbW1fb3Jfc2kxMjgocmVzLCByZXNfc2F0KTsKK30KKworaW50NjR4Ml90IHZxc3VicV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlFTVUIuUzY0IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDJfdCB2cXN1YnFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpIC8vbm8gb3B0aW1hbCBTSU1EIHNvdWx1dGlvbgoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ2NF90IGF0bXBbMl0sIGJ0bXBbMl07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ2NF90IHJlc1syXTsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYnRtcCwgYik7CisgICAgcmVzWzBdID0gYXRtcFswXSAtIGJ0bXBbMF07CisgICAgcmVzWzFdID0gYXRtcFsxXSAtIGJ0bXBbMV07CisgICAgaWYgKCgocmVzWzBdIF4gYXRtcFswXSkgJiBfU0lHTkJJVDY0KSAmJiAoKGF0bXBbMF0gXiBidG1wWzBdKSAmIF9TSUdOQklUNjQpKSB7CisgICAgICAgIHJlc1swXSA9IChhdG1wWzBdID4+IDYzKSBeIH5fU0lHTkJJVDY0OworICAgIH0KKyAgICBpZiAoKChyZXNbMV0gXiBhdG1wWzFdKSAmIF9TSUdOQklUNjQpICYmICgoYXRtcFsxXSBeIGJ0bXBbMV0pICYgX1NJR05CSVQ2NCkpIHsKKyAgICAgICAgcmVzWzFdID0gKGF0bXBbMV0gPj4gNjMpIF4gfl9TSUdOQklUNjQ7CisgICAgfQorICAgIHJldHVybiBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopcmVzKTsKK30KKwordWludDh4MTZfdCAgIHZxc3VicV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZRU1VCLlU4IHEwLHEwLHEwCisjZGVmaW5lIHZxc3VicV91OCBfbW1fc3Vic19lcHU4CisKK3VpbnQxNng4X3QgICB2cXN1YnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlFTVUIuczE2IHEwLHEwLHEwCisjZGVmaW5lIHZxc3VicV91MTYgX21tX3N1YnNfZXB1MTYKKwordWludDMyeDRfdCB2cXN1YnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlFTVUIuVTMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdnFzdWJxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgLy8gVlFTVUIuVTMyIHEwLHEwLHEwCit7CisgICAgX19tMTI4aSBtaW4sIG1hc2ssIHN1YjsKKyAgICBtaW4gPSBfTU1fTUlOX0VQVTMyKGEsIGIpOyAvL1NTRTQuMQorICAgIG1hc2sgPSBfbW1fY21wZXFfZXBpMzIgKG1pbiwgIGIpOworICAgIHN1YiA9IF9tbV9zdWJfZXBpMzIgKGEsIGIpOworICAgIHJldHVybiBfbW1fYW5kX3NpMTI4ICggc3ViLCBtYXNrKTsKK30KKworX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50NjR4Ml90IHZxc3VicV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKTsgLy8gVlFTVUIuVTY0IHEwLHEwLHEwCisjaWZkZWYgVVNFX1NTRTQKKyAgICBfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3QgdnFzdWJxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYikKKyAgICB7CisgICAgICAgIF9fbTEyOGkgYzgwMDAwMDAwLCBzdWJiLCBzdWJhLCBjbXAsIHN1YjsKKyAgICAgICAgYzgwMDAwMDAwID0gX21tX3NldF9lcGkzMiAoMHg4MDAwMDAwMCwgMHgwLCAweDgwMDAwMDAwLCAweDApOworICAgICAgICBzdWIgID0gX21tX3N1Yl9lcGk2NCAoYSwgYik7CisgICAgICAgIHN1YmEgPSBfbW1fc3ViX2VwaTY0IChhLCBjODAwMDAwMDApOworICAgICAgICBzdWJiID0gX21tX3N1Yl9lcGk2NCAoYiwgYzgwMDAwMDAwKTsKKyAgICAgICAgY21wID0gX21tX2NtcGd0X2VwaTY0ICggc3ViYSwgc3ViYik7IC8vbm8gdW5zaWduZWQgY29tcGFyaXNvbiwgbmVlZCB0byBnbyB0byBzaWduZWQsIFNTRTQuMiEhIQorICAgICAgICByZXR1cm4gX21tX2FuZF9zaTEyOCAoc3ViLCBjbXApOyAvL3NhdHVyYXRpb24KKyAgICB9CisjZWxzZQorICAgIF9ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDJfdCB2cXN1YnFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKKyAgICB7CisgICAgICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50NjRfdCBhdG1wWzJdLCBidG1wWzJdLCByZXNbMl07CisgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYXRtcCwgYSk7CisgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYnRtcCwgYik7CisgICAgICAgIHJlc1swXSA9IChhdG1wWzBdID4gYnRtcFswXSkgPyBhdG1wWzBdIC0gIGJ0bXBbMF0gOiAwOworICAgICAgICByZXNbMV0gPSAoYXRtcFsxXSA+IGJ0bXBbMV0pID8gYXRtcFsxXSAtICBidG1wWzFdIDogMDsKKyAgICAgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikocmVzKSk7CisgICAgfQorI2VuZGlmCisKKy8vKioqKioqKioqKlZlY3RvciBoYWx2aW5nIHN1YnRyYWN0IFZyW2ldOj0oVmFbaV0tVmJbaV0pPj4xICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdmhzdWJfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZIU1VCLlM4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZoc3ViX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIC8vIFZIU1VCLlM4IGQwLGQwLGQwCit7CisgICAgLy9ubyA4IGJpdCBzaGlmdCBhdmFpbGFibGUsIGludGVybmFsIG92ZXJmbG93IGlzIHBvc3NpYmxlLCBzbyBsZXQncyBnbyB0byAxNiBiaXQsCisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByMTY7CisgICAgaW50OHg4X3QgcjsKKyAgICByID0gdnN1Yl9zOCAoYSwgYik7CisgICAgcjE2ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkocikpOyAvL1NTRSA0LjEKKyAgICByMTYgPSBfbW1fc3JhaV9lcGkxNiAocjE2LCAxKTsgLy9TU0UyCisgICAgcjE2ID0gIF9tbV9wYWNrc19lcGkxNiAocjE2LHIxNik7IC8vdXNlIGxvdyA2NCBiaXRzCisgICAgcmV0dXJuNjQocjE2KTsKK30KKworaW50MTZ4NF90IHZoc3ViX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKTsgLy8gVkhTVUIuUzE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2aHN1Yl9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmhzdWJxX3MxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKworCitpbnQzMngyX3QgdmhzdWJfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpOyAvLyBWSFNVQi5TMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZoc3ViX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2aHN1YnFfczMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50OHg4X3QgdmhzdWJfdTgodWludDh4OF90IGEsICB1aW50OHg4X3QgYik7IC8vIFZIU1VCLlU4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2aHN1Yl91OCh1aW50OHg4X3QgYSwgIHVpbnQ4eDhfdCBiKQoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NCh2aHN1YnFfdTgoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCit1aW50MTZ4NF90IHZoc3ViX3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIpOyAvLyBWSFNVQi5zMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2aHN1Yl91MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiKQoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmhzdWJxX3UxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKK3VpbnQzMngyX3QgdmhzdWJfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYik7IC8vIFZIU1VCLlUzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZoc3ViX3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2aHN1YnFfdTMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworaW50OHgxNl90IHZoc3VicV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWSFNVQi5TOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdmhzdWJxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgLy8gVkhTVUIuUzggcTAscTAscTAKK3sKKyAgICAvLyAvL25lZWQgdG8gZGVhbCB3aXRoIHRoZSBwb3NzaWJpbGl0eSBvZiBpbnRlcm5hbCBvdmVyZmxvdworICAgIF9fbTEyOGkgYzEyOCwgYXUsYnU7CisgICAgYzEyOCA9IF9tbV9zZXQxX2VwaTggKDEyOCk7CisgICAgYXUgPSBfbW1fYWRkX2VwaTgoIGEsIGMxMjgpOworICAgIGJ1ID0gX21tX2FkZF9lcGk4KCBiLCBjMTI4KTsKKyAgICByZXR1cm4gdmhzdWJxX3U4KGF1LGJ1KTsKK30KKworaW50MTZ4OF90IHZoc3VicV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkhTVUIuUzE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2aHN1YnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgLy8gVkhTVUIuUzE2IHEwLHEwLHEwCit7CisgICAgLy9uZWVkIHRvIGRlYWwgd2l0aCB0aGUgcG9zc2liaWxpdHkgb2YgaW50ZXJuYWwgb3ZlcmZsb3cKKyAgICBfX20xMjhpIGM4MDAwLCBhdSxidTsKKyAgICBjODAwMCA9IF9tbV9zZXQxX2VwaTE2KDB4ODAwMCk7CisgICAgYXUgPSBfbW1fYWRkX2VwaTE2KCBhLCBjODAwMCk7CisgICAgYnUgPSBfbW1fYWRkX2VwaTE2KCBiLCBjODAwMCk7CisgICAgcmV0dXJuIHZoc3VicV91MTYoYXUsYnUpOworfQorCitpbnQzMng0X3QgdmhzdWJxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWSFNVQi5TMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZoc3VicV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSAvLyBWSFNVQi5TMzIgcTAscTAscTAKK3sKKyAgICAvL25lZWQgdG8gZGVhbCB3aXRoIHRoZSBwb3NzaWJpbGl0eSBvZiBpbnRlcm5hbCBvdmVyZmxvdworICAgIF9fbTEyOGkgYTIsIGIyLHIsIGJfMTsKKyAgICBhMiA9IF9tbV9zcmFpX2VwaTMyIChhLDEpOworICAgIGIyID0gX21tX3NyYWlfZXBpMzIgKGIsMSk7CisgICAgciA9IF9tbV9zdWJfZXBpMzIgKGEyLCBiMik7CisgICAgYl8xID0gX21tX2FuZG5vdF9zaTEyOChhLCBiKTsgLy8hYSBhbmQgYgorICAgIGJfMSA9IF9tbV9zbGxpX2VwaTMyIChiXzEsMzEpOworICAgIGJfMSA9IF9tbV9zcmxpX2VwaTMyIChiXzEsMzEpOyAvLzAgb3IgMSwgbGFzdCBiIGJpdAorICAgIHJldHVybiBfbW1fc3ViX2VwaTMyKHIsYl8xKTsKK30KKwordWludDh4MTZfdCB2aHN1YnFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWSFNVQi5VOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZoc3VicV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgLy8gVkhTVUIuVTggcTAscTAscTAKK3sKKyAgICBfX20xMjhpIGF2ZzsKKyAgICBhdmcgPSBfbW1fYXZnX2VwdTggKGEsIGIpOworICAgIHJldHVybiBfbW1fc3ViX2VwaTgoYSwgYXZnKTsKK30KKwordWludDE2eDhfdCB2aHN1YnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkhTVUIuczE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdmhzdWJxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgLy8gVkhTVUIuczE2IHEwLHEwLHEwCit7CisgICAgX19tMTI4aSBhdmc7CisgICAgYXZnID0gX21tX2F2Z19lcHUxNiAoYSwgYik7CisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMTYoYSwgYXZnKTsKK30KKwordWludDMyeDRfdCB2aHN1YnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkhTVUIuVTMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmhzdWJxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgLy8gVkhTVUIuVTMyIHEwLHEwLHEwCit7CisgICAgLy9uZWVkIHRvIGRlYWwgd2l0aCB0aGUgcG9zc2liaWxpdHkgb2YgaW50ZXJuYWwgb3ZlcmZsb3cKKyAgICBfX20xMjhpIGEyLCBiMixyLCBiXzE7CisgICAgYTIgPSBfbW1fc3JsaV9lcGkzMiAoYSwxKTsKKyAgICBiMiA9IF9tbV9zcmxpX2VwaTMyIChiLDEpOworICAgIHIgPSBfbW1fc3ViX2VwaTMyIChhMiwgYjIpOworICAgIGJfMSA9IF9tbV9hbmRub3Rfc2kxMjgoYSwgYik7IC8vIWEgYW5kIGIKKyAgICBiXzEgPSBfbW1fc2xsaV9lcGkzMiAoYl8xLDMxKTsKKyAgICBiXzEgPSBfbW1fc3JsaV9lcGkzMiAoYl8xLDMxKTsgLy8wIG9yIDEsIGxhc3QgYiBiaXQKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkzMihyLGJfMSk7Cit9CisKKy8vKioqKioqKiBWZWN0b3Igc3VidHJhY3QgaGlnaCBoYWxmICh0cnVuY2F0ZWQpICoqICoqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZzdWJobl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlNVQkhOLkkxNiBkMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2c3ViaG5fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgLy8gVlNVQkhOLkkxNiBkMCxxMCxxMAoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgc3VtLCBzdW04OworICAgIHN1bSA9IF9tbV9zdWJfZXBpMTYgKGEsIGIpOworICAgIHN1bTggPSBfbW1fc3JhaV9lcGkxNiAoc3VtLCA4KTsKKyAgICBzdW04ID0gX21tX3BhY2tzX2VwaTE2KHN1bTgsc3VtOCk7CisgICAgcmV0dXJuNjQoc3VtOCk7Cit9CisKK2ludDE2eDRfdCB2c3ViaG5fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZTVUJITi5JMzIgZDAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZzdWJobl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSAvLyBWU1VCSE4uSTMyIGQwLHEwLHEwCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgc3VtLCBzdW0xNjsKKyAgICBzdW0gPSBfbW1fc3ViX2VwaTMyIChhLCBiKTsKKyAgICBzdW0xNiA9IF9tbV9zcmFpX2VwaTMyIChzdW0sIDE2KTsKKyAgICBzdW0xNiA9IF9tbV9wYWNrc19lcGkzMihzdW0xNixzdW0xNik7CisgICAgcmV0dXJuNjQoc3VtMTYpOworfQorCitpbnQzMngyX3QgdnN1YmhuX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWU1VCSE4uSTY0IGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2c3ViaG5fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdWI7CisgICAgc3ViID0gX21tX3N1Yl9lcGk2NCAoYSwgYik7CisgICAgc3ViID0gX21tX3NodWZmbGVfZXBpMzIoc3ViLCAgMSB8ICgzIDw8IDIpIHwgKDAgPDwgNCkgfCAoMiA8PCA2KSk7CisgICAgcmV0dXJuNjQoc3ViKTsKK30KKwordWludDh4OF90IHZzdWJobl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWU1VCSE4uSTE2IGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2c3ViaG5fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKSAvLyBWU1VCSE4uSTE2IGQwLHEwLHEwCit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgc3VtLCBzdW04OworICAgIHN1bSA9IF9tbV9zdWJfZXBpMTYgKGEsIGIpOworICAgIHN1bTggPSBfbW1fc3JsaV9lcGkxNiAoc3VtLCA4KTsKKyAgICBzdW04ID0gIF9tbV9wYWNrdXNfZXBpMTYoc3VtOCxzdW04KTsKKyAgICByZXR1cm42NChzdW04KTsKK30KKwordWludDE2eDRfdCB2c3ViaG5fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlNVQkhOLkkzMiBkMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZzdWJobl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIC8vIFZTVUJITi5JMzIgZDAscTAscTAKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgc3VtLCBzdW0xNjsKKyAgICBzdW0gPSBfbW1fc3ViX2VwaTMyIChhLCBiKTsKKyAgICBzdW0xNiA9IF9tbV9zcmxpX2VwaTMyIChzdW0sIDE2KTsKKyAgICBzdW0xNiA9ICBfTU1fUEFDS1VTMV9FUEkzMihzdW0xNik7CisgICAgcmV0dXJuNjQoc3VtMTYpOworfQorCit1aW50MzJ4Ml90IHZzdWJobl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWU1VCSE4uSTY0IGQwLHEwLHEwCisjZGVmaW5lIHZzdWJobl91NjQgdnN1YmhuX3M2NAorCisvLyoqKioqKioqKioqKiBWZWN0b3Igcm91bmRpbmcgc3VidHJhY3QgaGlnaCBoYWxmICoqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZyc3ViaG5fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZSU1VCSE4uSTE2IGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZyc3ViaG5fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgLy8gVlJTVUJITi5JMTYgZDAscTAscTAKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1YiwgbWFzazE7CisgICAgc3ViID0gX21tX3N1Yl9lcGkxNiAoYSwgYik7CisgICAgbWFzazEgPSBfbW1fc2xsaV9lcGkxNihzdWIsIDkpOyAvL3NoaWZ0IGxlZnQgdGhlbiBiYWNrIHJpZ2h0IHRvCisgICAgbWFzazEgPSBfbW1fc3JsaV9lcGkxNihtYXNrMSwgMTUpOyAvL2dldCAgNy10aCBiaXQgMSBvciB6ZXJvCisgICAgc3ViID0gX21tX3NyYWlfZXBpMTYgKHN1YiwgOCk7IC8vZ2V0IGhpZ2ggaGFsZgorICAgIHN1YiA9IF9tbV9hZGRfZXBpMTYgKHN1YiwgbWFzazEpOyAvL2FjdHVhbCByb3VuZGluZworICAgIHN1YiA9ICBfbW1fcGFja3NfZXBpMTYgKHN1Yiwgc3ViKTsKKyAgICByZXR1cm42NChzdWIpOworfQorCitpbnQxNng0X3QgdnJzdWJobl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlJTVUJITi5JMzIgZDAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZyc3ViaG5fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgLy8gVlJTVUJITi5JMzIgZDAscTAscTAKK3sKKyAgICAvL1NJTUQgbWF5IGJlIG5vdCBvcHRpbWFsLCBzZXJpYWwgbWF5IGJlIGZhc3RlcgorICAgIGludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1YiwgbWFzazE7CisgICAgc3ViID0gX21tX3N1Yl9lcGkzMiAoYSwgYik7CisgICAgbWFzazEgPSBfbW1fc2xsaV9lcGkzMihzdWIsIDE3KTsgLy9zaGlmdCBsZWZ0IHRoZW4gYmFjayByaWdodCB0bworICAgIG1hc2sxID0gX21tX3NybGlfZXBpMzIobWFzazEsMzEpOyAvL2dldCAgMTUtdGggYml0IDEgb3IgemVybworICAgIHN1YiA9IF9tbV9zcmFpX2VwaTMyIChzdWIsIDE2KTsgLy9nZXQgaGlnaCBoYWxmCisgICAgc3ViID0gX21tX2FkZF9lcGkzMiAoc3ViLCBtYXNrMSk7IC8vYWN0dWFsIHJvdW5kaW5nCisgICAgc3ViID0gX21tX3BhY2tzX2VwaTMyIChzdWIsIHN1Yik7CisgICAgcmV0dXJuNjQoc3ViKTsKK30KKworaW50MzJ4Ml90IHZyc3ViaG5fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZSU1VCSE4uSTY0IGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cnN1YmhuX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpCit7CisgICAgLy9TSU1EIG1heSBiZSBub3Qgb3B0aW1hbCwgc2VyaWFsIG1heSBiZSBmYXN0ZXIKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdWIsIG1hc2sxOworICAgIHN1YiA9IF9tbV9zdWJfZXBpNjQgKGEsIGIpOworICAgIG1hc2sxID0gX21tX3NsbGlfZXBpNjQoc3ViLCAzMyk7IC8vc2hpZnQgbGVmdCB0aGVuIGJhY2sgcmlnaHQgdG8KKyAgICBtYXNrMSA9IF9tbV9zcmxpX2VwaTY0KG1hc2sxLDMyKTsgLy9nZXQgIDMxLXRoIGJpdCAxIG9yIHplcm8KKyAgICBzdWIgPSBfbW1fYWRkX2VwaTY0IChzdWIsIG1hc2sxKTsgLy9hY3R1YWwgaGlnaCBoYWxmIHJvdW5kaW5nCisgICAgc3ViID0gX21tX3NodWZmbGVfZXBpMzIoc3ViLCAgMSB8ICgzIDw8IDIpIHwgKDAgPDwgNCkgfCAoMiA8PCA2KSk7CisgICAgcmV0dXJuNjQoc3ViKTsKK30KKwordWludDh4OF90IHZyc3ViaG5fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlJTVUJITi5JMTYgZDAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZyc3ViaG5fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKSAvLyBWUlNVQkhOLkkxNiBkMCxxMCxxMAoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1YiwgbWFzazE7CisgICAgc3ViID0gX21tX3N1Yl9lcGkxNiAoYSwgYik7CisgICAgbWFzazEgPSBfbW1fc2xsaV9lcGkxNihzdWIsIDkpOyAvL3NoaWZ0IGxlZnQgdGhlbiBiYWNrIHJpZ2h0IHRvCisgICAgbWFzazEgPSBfbW1fc3JsaV9lcGkxNihtYXNrMSwgMTUpOyAvL2dldCAgNy10aCBiaXQgMSBvciB6ZXJvCisgICAgc3ViID0gX21tX3NyYWlfZXBpMTYgKHN1YiwgOCk7IC8vZ2V0IGhpZ2ggaGFsZgorICAgIHN1YiA9IF9tbV9hZGRfZXBpMTYgKHN1YiwgbWFzazEpOyAvL2FjdHVhbCByb3VuZGluZworICAgIHN1YiA9IF9tbV9wYWNrdXNfZXBpMTYgKHN1Yiwgc3ViKTsKKyAgICByZXR1cm42NChzdWIpOworfQorCit1aW50MTZ4NF90IHZyc3ViaG5fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlJTVUJITi5JMzIgZDAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2cnN1YmhuX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgLy8gVlJTVUJITi5JMzIgZDAscTAscTAKK3sKKyAgICAvL1NJTUQgbWF5IGJlIG5vdCBvcHRpbWFsLCBzZXJpYWwgbWF5IGJlIGZhc3RlcgorICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdWIsIG1hc2sxOworICAgIHN1YiA9IF9tbV9zdWJfZXBpMzIgKGEsIGIpOworICAgIG1hc2sxID0gX21tX3NsbGlfZXBpMzIoc3ViLCAxNyk7IC8vc2hpZnQgbGVmdCB0aGVuIGJhY2sgcmlnaHQgdG8KKyAgICBtYXNrMSA9IF9tbV9zcmxpX2VwaTMyKG1hc2sxLDMxKTsgLy9nZXQgIDE1LXRoIGJpdCAxIG9yIHplcm8KKyAgICBzdWIgPSBfbW1fc3JhaV9lcGkzMiAoc3ViLCAxNik7IC8vZ2V0IGhpZ2ggaGFsZgorICAgIHN1YiA9IF9tbV9hZGRfZXBpMzIgKHN1YiwgbWFzazEpOyAvL2FjdHVhbCByb3VuZGluZworICAgIHN1YiA9ICBfTU1fUEFDS1VTMV9FUEkzMiAoc3ViKTsKKyAgICByZXR1cm42NChzdWIpOworfQorCit1aW50MzJ4Ml90IHZyc3ViaG5fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVlJTVUJITi5JNjQgZDAscTAscTAKKyNkZWZpbmUgdnJzdWJobl91NjQgdnJzdWJobl9zNjQKKworLy8qKioqKioqKioqKiBWZWN0b3Igc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBzdWJ0cmFjdCBsb25nICoqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MzJ4NF90IHZxZG1sc2xfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWUURNTFNMLlMxNiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnFkbWxzbF9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYykKK3sKKyAgICAvL25vdCBvcHRpbWFsIFNJTUQgc291bHV0aW9uLCBzZXJpYWwgbWF5IGJlIGZhc3RlcgorICAgIF9fbTEyOGkgcmVzMzIsIG1hc2s7CisgICAgaW50MzJ4NF90IHJlczsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDMyX3QgY21hc2tbXSA9IHsweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwfTsKKyAgICByZXMgPSB2bXVsbF9zMTYoYiwgIGMpOworICAgIHJlczMyID0gX21tX3NsbGlfZXBpMzIgKHJlcywgMSk7IC8vZG91YmxlIHRoZSByZXN1bHQsIHNhdHVyYXRpb24gbm90IGNvbnNpZGVyZWQKKyAgICBtYXNrID0gX21tX2NtcGVxX2VwaTMyIChyZXMzMiwgKihfX20xMjhpKiljbWFzayk7CisgICAgcmVzMzIgPSBfbW1feG9yX3NpMTI4IChyZXMzMiwgIG1hc2spOyAvL3JlczMyIHNhdHVyYXRlZCBmb3IgMHg4MDAwMDAwMAorICAgIHJldHVybiB2cXN1YnFfczMyKGEsIHJlczMyKTsgLy9zYXR1cmF0aW9uCit9CisKK2ludDY0eDJfdCB2cWRtbHNsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKTsgLy8gVlFETUxTTC5TMzIgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4Ml90IHZxZG1sc2xfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIF9fbTEyOGkgcmVzNjQsIG1hc2s7CisgICAgaW50NjR4Ml90IHJlczsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDY0X3QgY21hc2tbXSA9IHsweDgwMDAwMDAwMDAwMDAwMDAsIDB4ODAwMDAwMDAwMDAwMDAwMH07CisgICAgcmVzID0gdm11bGxfczMyKGIsICBjKTsKKyAgICByZXM2NCA9IF9tbV9zbGxpX2VwaTY0IChyZXMsIDEpOyAvL2RvdWJsZSB0aGUgcmVzdWx0LCBzYXR1cmF0aW9uIG5vdCBjb25zaWRlcmVkCisgICAgbWFzayA9IF9NTV9DTVBFUV9FUEk2NCAocmVzNjQsICooX19tMTI4aSopY21hc2spOworICAgIHJlczY0ID0gX21tX3hvcl9zaTEyOCAocmVzNjQsICBtYXNrKTsgLy9yZXMzMiBzYXR1cmF0ZWQgZm9yIDB4ODAwMDAwMDAKKyAgICByZXR1cm4gdnFzdWJxX3M2NChhLCByZXM2NCk7IC8vc2F0dXJhdGlvbgorfQorCisvLyoqKioqKioqKioqKioqKioqKiAgQ09NUEFSSVNPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKiBWZWN0b3IgY29tcGFyZSBlcXVhbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3VpbnQ4eDhfdCB2Y2VxX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQ0VRLkk4IGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdmNlcV9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9jbXBlcV9lcGk4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQxNng0X3QgdmNlcV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkNFUS5JMTYgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdmNlcV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fY21wZXFfZXBpMTYoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCB2Y2VxX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQ0VRLkkzMiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2Y2VxX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9jbXBlcV9lcGkzMihfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MzJ4Ml90IHZjZXFfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQ0VRLkYzMiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdmNlcV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOCByZXM7CisgICAgcmVzID0gX21tX2NtcGVxX3BzKF9wTTEyOChhKSwgX3BNMTI4KGIpICk7CisgICAgcmV0dXJuNjRmKHJlcyk7Cit9CisKK3VpbnQ4eDhfdCB2Y2VxX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZDRVEuSTggZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdmNlcV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpCit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9jbXBlcV9lcGk4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQxNng0X3QgdmNlcV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWQ0VRLkkxNiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdmNlcV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fY21wZXFfZXBpMTYoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCB2Y2VxX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZDRVEuSTMyIGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2Y2VxX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9jbXBlcV9lcGkzMihfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCit1aW50OHg4X3QgICB2Y2VxX3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYik7IC8vIFZDRVEuSTggZDAsIGQwLCBkMAorI2RlZmluZSB2Y2VxX3A4IHZjZXFfdTgKKworCit1aW50OHgxNl90ICAgdmNlcXFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkNFUS5JOCBxMCwgcTAsIHEwCisjZGVmaW5lIHZjZXFxX3M4IF9tbV9jbXBlcV9lcGk4CisKK3VpbnQxNng4X3QgICB2Y2VxcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkNFUS5JMTYgcTAsIHEwLCBxMAorI2RlZmluZSB2Y2VxcV9zMTYgX21tX2NtcGVxX2VwaTE2CisKK3VpbnQzMng0X3QgICB2Y2VxcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkNFUS5JMzIgcTAsIHEwLCBxMAorI2RlZmluZSB2Y2VxcV9zMzIgX21tX2NtcGVxX2VwaTMyCisKK3VpbnQzMng0X3QgdmNlcXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQ0VRLkYzMiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmNlcXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpCit7CisgICAgX19tMTI4IHJlczsKKyAgICByZXMgPSBfbW1fY21wZXFfcHMoYSxiKTsKKyAgICByZXR1cm4gX00xMjhpKHJlcyk7Cit9CisKK3VpbnQ4eDE2X3QgICB2Y2VxcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZDRVEuSTggcTAsIHEwLCBxMAorI2RlZmluZSB2Y2VxcV91OCBfbW1fY21wZXFfZXBpOAorCit1aW50MTZ4OF90ICAgdmNlcXFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkNFUS5JMTYgcTAsIHEwLCBxMAorI2RlZmluZSB2Y2VxcV91MTYgX21tX2NtcGVxX2VwaTE2CisKK3VpbnQzMng0X3QgICB2Y2VxcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQ0VRLkkzMiBxMCwgcTAsIHEwCisjZGVmaW5lIHZjZXFxX3UzMiBfbW1fY21wZXFfZXBpMzIKKwordWludDh4MTZfdCAgIHZjZXFxX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiKTsgLy8gVkNFUS5JOCBxMCwgcTAsIHEwCisjZGVmaW5lIHZjZXFxX3A4IF9tbV9jbXBlcV9lcGk4CisKKy8vKioqKioqKioqKioqKioqKioqVmVjdG9yIGNvbXBhcmUgZ3JlYXRlci10aGFuIG9yIGVxdWFsKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL2luIElBIFNJTUQgbm8gZ3JlYXRlci10aGFuLW9yLWVxdWFsIGNvbXBhcmlzb24gZm9yIGludGVnZXJzLAorLy8gdGhlcmUgaXMgZ3JlYXRlci10aGFuIGF2YWlsYWJsZSBvbmx5LCBzbyB3ZSBuZWVkIHRoZSBmb2xsb3dpbmcgdHJpY2tzCisKK3VpbnQ4eDhfdCB2Y2dlX3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiKTsgLy8gVkNHRS5TOCBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZjZ2VfczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmNnZXFfczgoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQxNng0X3QgdmNnZV9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYik7IC8vIFZDR0UuUzE2IGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZjZ2VfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZjZ2VxX3MxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCB2Y2dlX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiKTsgLy8gVkNHRS5TMzIgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdmNnZV9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmNnZXFfczMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MzJ4Ml90IHZjZ2VfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQ0dFLkYzMiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdmNnZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOCByZXM7CisgICAgcmVzID0gX21tX2NtcGdlX3BzKF9wTTEyOChhKSxfcE0xMjgoYikpOyAvL3VzZSBvbmx5IDIgZmlyc3QgZW50cmllcworICAgIHJldHVybjY0ZihyZXMpOworfQorCit1aW50OHg4X3QgdmNnZV91OCh1aW50OHg4X3QgYSwgIHVpbnQ4eDhfdCBiKTsgLy8gVkNHRS5VOCBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2Y2dlX3U4KHVpbnQ4eDhfdCBhLCAgdWludDh4OF90IGIpCit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KHZjZ2VxX3U4KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MTZ4NF90IHZjZ2VfdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYik7IC8vIFZDR0UuczE2IGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2Y2dlX3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIpCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2Y2dlcV91MTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgdmNnZV91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiKTsgLy8gVkNHRS5VMzIgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZjZ2VfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYikKK3sKKyAgICAvL3NlcmlhbCBzb2x1dGlvbiBsb29rcyBmYXN0ZXIKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZjZ2VxX3UzMiAoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKKwordWludDh4MTZfdCB2Y2dlcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWQ0dFLlM4IHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2Y2dlcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIC8vIFZDR0UuUzggcTAsIHEwLCBxMAoreworICAgIF9fbTEyOGkgbTEsIG0yOworICAgIG0xID0gX21tX2NtcGd0X2VwaTggKCBhLCBiKTsKKyAgICBtMiA9IF9tbV9jbXBlcV9lcGk4ICggYSwgYik7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAgKCBtMSwgbTIpOworfQorCit1aW50MTZ4OF90IHZjZ2VxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWQ0dFLlMxNiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdmNnZXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgLy8gVkNHRS5TMTYgcTAsIHEwLCBxMAoreworICAgIF9fbTEyOGkgbTEsIG0yOworICAgIG0xID0gX21tX2NtcGd0X2VwaTE2ICggYSwgYik7CisgICAgbTIgPSBfbW1fY21wZXFfZXBpMTYgKCBhLCBiKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4ICAgKCBtMSxtMik7Cit9CisKK3VpbnQzMng0X3QgdmNnZXFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZDR0UuUzMyIHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2Y2dlcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSAvLyBWQ0dFLlMzMiBxMCwgcTAsIHEwCit7CisgICAgX19tMTI4aSBtMSwgbTI7CisgICAgbTEgPSBfbW1fY21wZ3RfZXBpMzIgKGEsIGIpOworICAgIG0yID0gX21tX2NtcGVxX2VwaTMyIChhLCBiKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4ICAgKG0xLCBtMik7Cit9CisKK3VpbnQzMng0X3QgdmNnZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQ0dFLkYzMiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmNnZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpCit7CisgICAgX19tMTI4IHJlczsKKyAgICByZXMgPSBfbW1fY21wZ2VfcHMoYSxiKTsgLy91c2Ugb25seSAyIGZpcnN0IGVudHJpZXMKKyAgICByZXR1cm4gKihfX20xMjhpKikmcmVzOworfQorCit1aW50OHgxNl90IHZjZ2VxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkNHRS5VOCBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3QgdmNnZXFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpIC8vIFZDR0UuVTggcTAsIHEwLCBxMAoreworICAgIC8vbm8gdW5zaWduZWQgY2hhcnMgY29tcGFyaXNvbiwgb25seSBzaWduZWQgYXZhaWxhYmxlLHNvIG5lZWQgdGhlIHRyaWNrCisgICAgI2lmZGVmIFVTRV9TU0U0CisgICAgICAgIF9fbTEyOGkgY21wOworICAgICAgICBjbXAgPSBfbW1fbWF4X2VwdTgoYSwgYik7CisgICAgICAgIHJldHVybiBfbW1fY21wZXFfZXBpOChjbXAsIGEpOyAvL2E+PWIKKyAgICAjZWxzZQorICAgICAgICBfX20xMjhpIGMxMjgsIGFzLCBicywgbTEsIG0yOworICAgICAgICBjMTI4ID0gX21tX3NldDFfZXBpOCAoMTI4KTsKKyAgICAgICAgYXMgPSBfbW1fc3ViX2VwaTgoIGEsIGMxMjgpOworICAgICAgICBicyA9IF9tbV9zdWJfZXBpOCggYiwgYzEyOCk7CisgICAgICAgIG0xID0gX21tX2NtcGd0X2VwaTgoIGFzLCBicyk7CisgICAgICAgIG0yID0gX21tX2NtcGVxX2VwaTggKGFzLCBicyk7CisgICAgICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKCBtMSwgIG0yKTsKKyAgICAjZW5kaWYKK30KKwordWludDE2eDhfdCB2Y2dlcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWQ0dFLnMxNiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdmNnZXFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKSAvLyBWQ0dFLnMxNiBxMCwgcTAsIHEwCit7CisgICAgLy9ubyB1bnNpZ25lZCBzaG9ydHMgY29tcGFyaXNvbiwgb25seSBzaWduZWQgYXZhaWxhYmxlLHNvIG5lZWQgdGhlIHRyaWNrCisgICAgI2lmZGVmIFVTRV9TU0U0CisgICAgICAgIF9fbTEyOGkgY21wOworICAgICAgICBjbXAgPSBfbW1fbWF4X2VwdTE2KGEsIGIpOworICAgICAgICByZXR1cm4gX21tX2NtcGVxX2VwaTE2KGNtcCwgYSk7IC8vYT49YgorICAgICNlbHNlCisgICAgICAgIF9fbTEyOGkgYzgwMDAsIGFzLCBicywgbTEsIG0yOworICAgICAgICBjODAwMCA9IF9tbV9zZXQxX2VwaTE2ICgweDgwMDApOworICAgICAgICBhcyA9IF9tbV9zdWJfZXBpMTYoYSxjODAwMCk7CisgICAgICAgIGJzID0gX21tX3N1Yl9lcGkxNihiLGM4MDAwKTsKKyAgICAgICAgbTEgPSBfbW1fY21wZ3RfZXBpMTYoYXMsIGJzKTsKKyAgICAgICAgbTIgPSBfbW1fY21wZXFfZXBpMTYgKGFzLCBicyk7CisgICAgICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKCBtMSwgbTIpOworICAgICNlbmRpZgorfQorCit1aW50MzJ4NF90IHZjZ2VxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZDR0UuVTMyIHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2Y2dlcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIC8vIFZDR0UuVTMyIHEwLCBxMCwgcTAKK3sKKyAgICAvL25vIHVuc2lnbmVkIGludHMgY29tcGFyaXNvbiwgb25seSBzaWduZWQgYXZhaWxhYmxlLHNvIG5lZWQgdGhlIHRyaWNrCisgICAgI2lmZGVmIFVTRV9TU0U0CisgICAgICAgIF9fbTEyOGkgY21wOworICAgICAgICBjbXAgPSBfbW1fbWF4X2VwdTMyKGEsIGIpOworICAgICAgICByZXR1cm4gX21tX2NtcGVxX2VwaTMyKGNtcCwgYSk7IC8vYT49YgorICAgICNlbHNlCisgICAgICAgIC8vc2VyaWFsIHNvbHV0aW9uIG1heSBiZSBmYXN0ZXIKKyAgICAgICAgX19tMTI4aSBjODAwMDAwMDAsIGFzLCBicywgbTEsIG0yOworICAgICAgICBjODAwMDAwMDAgPSBfbW1fc2V0MV9lcGkzMiAoMHg4MDAwMDAwMCk7CisgICAgICAgIGFzID0gX21tX3N1Yl9lcGkzMihhLGM4MDAwMDAwMCk7CisgICAgICAgIGJzID0gX21tX3N1Yl9lcGkzMihiLGM4MDAwMDAwMCk7CisgICAgICAgIG0xID0gX21tX2NtcGd0X2VwaTMyIChhcywgYnMpOworICAgICAgICBtMiA9IF9tbV9jbXBlcV9lcGkzMiAoYXMsIGJzKTsKKyAgICAgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoIG0xLCAgbTIpOworICAgICNlbmRpZgorfQorCisvLyoqKioqKioqKioqKioqKioqKioqKipWZWN0b3IgY29tcGFyZSBsZXNzLXRoYW4gb3IgZXF1YWwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL2luIElBIFNJTUQgbm8gbGVzcy10aGFuLW9yLWVxdWFsIGNvbXBhcmlzb24gZm9yIGludGVnZXJzIHByZXNlbnQsIHNvIHdlIG5lZWQgdGhlIHRyaWNrcworCit1aW50OHg4X3QgdmNsZV9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYik7IC8vIFZDR0UuUzggZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2Y2xlX3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KHZjbGVxX3M4KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MTZ4NF90IHZjbGVfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIpOyAvLyBWQ0dFLlMxNiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2Y2xlX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2Y2xlcV9zMTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgdmNsZV9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYik7IC8vIFZDR0UuUzMyIGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZjbGVfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZjbGVxX3MzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCB2Y2xlX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVkNHRS5GMzIgZDAsIGQwLCBkMD8KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2Y2xlX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKQoreworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4IHJlczsKKyAgICByZXMgPSBfbW1fY21wbGVfcHMoX3BNMTI4KGEpLF9wTTEyOChiKSk7CisgICAgcmV0dXJuNjRmKHJlcyk7Cit9CisKK3VpbnQ4eDhfdCB2Y2xlX3U4KHVpbnQ4eDhfdCBhLCAgdWludDh4OF90IGIpOyAvLyBWQ0dFLlU4IGQwLCBkMCwgZDAKKyNkZWZpbmUgdmNsZV91OChhLGIpIHZjZ2VfdTgoYixhKQorCisKK3VpbnQxNng0X3QgdmNsZV91MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiKTsgLy8gVkNHRS5zMTYgZDAsIGQwLCBkMAorI2RlZmluZSB2Y2xlX3UxNihhLGIpIHZjZ2VfdTE2KGIsYSkKKworCit1aW50MzJ4Ml90IHZjbGVfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYik7IC8vIFZDR0UuVTMyIGQwLCBkMCwgZDAKKyNkZWZpbmUgdmNsZV91MzIoYSxiKSB2Y2dlX3UzMihiLGEpCisKK3VpbnQ4eDE2X3QgdmNsZXFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkNHRS5TOCBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3QgdmNsZXFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSAvLyBWQ0dFLlM4IHEwLCBxMCwgcTAKK3sKKyAgICBfX20xMjhpIGMxLCByZXM7CisgICAgYzEgPSBfbW1fY21wZXFfZXBpOCAoYSxhKTsgLy9hbGwgb25lcyAweGZmLi4uLgorICAgIHJlcyA9IF9tbV9jbXBndF9lcGk4ICggYSwgIGIpOworICAgIHJldHVybiBfbW1fYW5kbm90X3NpMTI4IChyZXMsIGMxKTsgLy9pbnZlcnNlIHRoZSBjbXBndCByZXN1bHQsIGdldCBsZXNzLXRoYW4tb3ItZXF1YWwKK30KKwordWludDE2eDhfdCB2Y2xlcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkNHRS5TMTYgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZjbGVxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZDR0UuUzE2IHEwLCBxMCwgcTAKK3sKKyAgICBfX20xMjhpIGMxLCByZXM7CisgICAgYzEgPSBfbW1fY21wZXFfZXBpMTYgKGEsYSk7IC8vYWxsIG9uZXMgMHhmZi4uLi4KKyAgICByZXMgPSBfbW1fY21wZ3RfZXBpMTYgKCBhLCAgYik7CisgICAgcmV0dXJuIF9tbV9hbmRub3Rfc2kxMjggKHJlcywgYzEpOworfQorCit1aW50MzJ4NF90IHZjbGVxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWQ0dFLlMzMiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmNsZXFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgLy8gVkNHRS5TMzIgcTAsIHEwLCBxMAoreworICAgIF9fbTEyOGkgYzEsIHJlczsKKyAgICBjMSA9IF9tbV9jbXBlcV9lcGkzMiAoYSxhKTsgLy9hbGwgb25lcyAweGZmLi4uLgorICAgIHJlcyA9IF9tbV9jbXBndF9lcGkzMiAoIGEsICBiKTsKKyAgICByZXR1cm4gX21tX2FuZG5vdF9zaTEyOCAocmVzLCBjMSk7Cit9CisKK3VpbnQzMng0X3QgdmNsZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQ0dFLkYzMiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmNsZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpCit7CisgICAgX19tMTI4IHJlczsKKyAgICByZXMgPSBfbW1fY21wbGVfcHMoYSxiKTsKKyAgICByZXR1cm4gKihfX20xMjhpKikmcmVzOworfQorCit1aW50OHgxNl90IHZjbGVxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkNHRS5VOCBxMCwgcTAsIHEwCisjaWZkZWYgVVNFX1NTRTQKKyAgICBfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3QgdmNsZXFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpIC8vIFZDR0UuVTggcTAsIHEwLCBxMAorICAgIHsKKyAgICAgICAgLy9ubyB1bnNpZ25lZCBjaGFycyBjb21wYXJpc29uIGluIFNTRSwgb25seSBzaWduZWQgYXZhaWxhYmxlLHNvIG5lZWQgdGhlIHRyaWNrCisgICAgICAgIF9fbTEyOGkgY21wOworICAgICAgICBjbXAgPSBfbW1fbWluX2VwdTgoYSwgYik7CisgICAgICAgIHJldHVybiBfbW1fY21wZXFfZXBpOChjbXAsIGEpOyAvL2E8PWIKKyAgICB9CisjZWxzZQorICAgICNkZWZpbmUgdmNsZXFfdTgoYSxiKSB2Y2dlcV91OChiLGEpCisjZW5kaWYKKworCit1aW50MTZ4OF90IHZjbGVxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZDR0UuczE2IHEwLCBxMCwgcTAKKyNpZmRlZiBVU0VfU1NFNAorICAgIF9ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2Y2xlcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIC8vIFZDR0UuczE2IHEwLCBxMCwgcTAKKyAgICB7CisgICAgICAgIC8vbm8gdW5zaWduZWQgc2hvcnRzIGNvbXBhcmlzb24gaW4gU1NFLCBvbmx5IHNpZ25lZCBhdmFpbGFibGUsc28gbmVlZCB0aGUgdHJpY2sKKyAgICAgICAgX19tMTI4aSBjbXA7CisgICAgICAgIGNtcCA9IF9tbV9taW5fZXB1MTYoYSwgYik7CisgICAgICAgIHJldHVybiBfbW1fY21wZXFfZXBpMTYoY21wLCBhKTsgLy9hPD1iCisgICAgfQorI2Vsc2UKKyAgICAjZGVmaW5lIHZjbGVxX3UxNihhLGIpIHZjZ2VxX3UxNihiLGEpCisjZW5kaWYKKworCit1aW50MzJ4NF90IHZjbGVxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZDR0UuVTMyIHEwLCBxMCwgcTAKKyNpZmRlZiBVU0VfU1NFNAorICAgIF9ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2Y2xlcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIC8vIFZDR0UuVTMyIHEwLCBxMCwgcTAKKyAgICB7CisgICAgICAgIC8vbm8gdW5zaWduZWQgY2hhcnMgY29tcGFyaXNvbiBpbiBTU0UsIG9ubHkgc2lnbmVkIGF2YWlsYWJsZSxzbyBuZWVkIHRoZSB0cmljaworICAgICAgICBfX20xMjhpIGNtcDsKKyAgICAgICAgY21wID0gX21tX21pbl9lcHUzMihhLCBiKTsKKyAgICAgICAgcmV0dXJuIF9tbV9jbXBlcV9lcGkzMihjbXAsIGEpOyAvL2E8PWIKKyAgICB9CisjZWxzZQorLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCB0aGUgc2VyaWFsIG9uZQorICAgICNkZWZpbmUgdmNsZXFfdTMyKGEsYikgdmNnZXFfdTMyKGIsYSkKKyNlbmRpZgorCisKKy8vKioqKioqIFZlY3RvciBjb21wYXJlIGdyZWF0ZXItdGhhbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3VpbnQ4eDhfdCB2Y2d0X3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQ0dULlM4IGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdmNndF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9jbXBndF9lcGk4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQxNng0X3QgdmNndF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkNHVC5TMTYgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdmNndF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fY21wZ3RfZXBpMTYoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCB2Y2d0X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQ0dULlMzMiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2Y2d0X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9jbXBndF9lcGkzMihfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MzJ4Ml90IHZjZ3RfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQ0dULkYzMiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdmNndF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOCByZXM7CisgICAgcmVzID0gX21tX2NtcGd0X3BzKF9wTTEyOChhKSxfcE0xMjgoYikpOyAvL3VzZSBvbmx5IDIgZmlyc3QgZW50cmllcworICAgIHJldHVybjY0ZihyZXMpOworfQorCit1aW50OHg4X3QgdmNndF91OCh1aW50OHg4X3QgYSwgIHVpbnQ4eDhfdCBiKTsgLy8gVkNHVC5VOCBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2Y2d0X3U4KHVpbnQ4eDhfdCBhLCAgdWludDh4OF90IGIpCit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KHZjZ3RxX3U4KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MTZ4NF90IHZjZ3RfdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYik7IC8vIFZDR1QuczE2IGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2Y2d0X3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIpCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2Y2d0cV91MTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgdmNndF91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiKTsgLy8gVkNHVC5VMzIgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZjZ3RfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZjZ3RxX3UzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDh4MTZfdCAgIHZjZ3RxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZDR1QuUzggcTAsIHEwLCBxMAorI2RlZmluZSB2Y2d0cV9zOCBfbW1fY21wZ3RfZXBpOAorCit1aW50MTZ4OF90ICAgdmNndHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZDR1QuUzE2IHEwLCBxMCwgcTAKKyNkZWZpbmUgdmNndHFfczE2IF9tbV9jbXBndF9lcGkxNgorCit1aW50MzJ4NF90ICAgdmNndHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZDR1QuUzMyIHEwLCBxMCwgcTAKKyNkZWZpbmUgdmNndHFfczMyIF9tbV9jbXBndF9lcGkzMgorCit1aW50MzJ4NF90IHZjZ3RxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVkNHVC5GMzIgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZjZ3RxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKQoreworICAgIF9fbTEyOCByZXM7CisgICAgcmVzID0gX21tX2NtcGd0X3BzKGEsYik7IC8vdXNlIG9ubHkgMiBmaXJzdCBlbnRyaWVzCisgICAgcmV0dXJuICooX19tMTI4aSopJnJlczsKK30KKwordWludDh4MTZfdCB2Y2d0cV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZDR1QuVTggcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZjZ3RxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKSAvLyBWQ0dULlU4IHEwLCBxMCwgcTAKK3sKKyAgICAvL25vIHVuc2lnbmVkIGNoYXJzIGNvbXBhcmlzb24sIG9ubHkgc2lnbmVkIGF2YWlsYWJsZSxzbyBuZWVkIHRoZSB0cmljaworICAgIF9fbTEyOGkgYzEyOCwgYXMsIGJzOworICAgIGMxMjggPSBfbW1fc2V0MV9lcGk4ICgxMjgpOworICAgIGFzID0gX21tX3N1Yl9lcGk4KGEsYzEyOCk7CisgICAgYnMgPSBfbW1fc3ViX2VwaTgoYixjMTI4KTsKKyAgICByZXR1cm4gX21tX2NtcGd0X2VwaTggKGFzLCBicyk7Cit9CisKK3VpbnQxNng4X3QgdmNndHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkNHVC5zMTYgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZjZ3RxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgLy8gVkNHVC5zMTYgcTAsIHEwLCBxMAoreworICAgIC8vbm8gdW5zaWduZWQgc2hvcnQgY29tcGFyaXNvbiwgb25seSBzaWduZWQgYXZhaWxhYmxlLHNvIG5lZWQgdGhlIHRyaWNrCisgICAgX19tMTI4aSBjODAwMCwgYXMsIGJzOworICAgIGM4MDAwID0gX21tX3NldDFfZXBpMTYgKDB4ODAwMCk7CisgICAgYXMgPSBfbW1fc3ViX2VwaTE2KGEsYzgwMDApOworICAgIGJzID0gX21tX3N1Yl9lcGkxNihiLGM4MDAwKTsKKyAgICByZXR1cm4gX21tX2NtcGd0X2VwaTE2ICggYXMsIGJzKTsKK30KKwordWludDMyeDRfdCB2Y2d0cV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQ0dULlUzMiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmNndHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSAvLyBWQ0dULlUzMiBxMCwgcTAsIHEwCit7CisgICAgLy9ubyB1bnNpZ25lZCBpbnQgY29tcGFyaXNvbiwgb25seSBzaWduZWQgYXZhaWxhYmxlLHNvIG5lZWQgdGhlIHRyaWNrCisgICAgX19tMTI4aSBjODAwMDAwMDAsIGFzLCBiczsKKyAgICBjODAwMDAwMDAgPSBfbW1fc2V0MV9lcGkzMiAoMHg4MDAwMDAwMCk7CisgICAgYXMgPSBfbW1fc3ViX2VwaTMyKGEsYzgwMDAwMDAwKTsKKyAgICBicyA9IF9tbV9zdWJfZXBpMzIoYixjODAwMDAwMDApOworICAgIHJldHVybiBfbW1fY21wZ3RfZXBpMzIgKCBhcywgYnMpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKiBWZWN0b3IgY29tcGFyZSBsZXNzLXRoYW4gKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordWludDh4OF90ICAgdmNsdF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkNHVC5TOCBkMCwgZDAsIGQwCisjZGVmaW5lIHZjbHRfczgoYSxiKSB2Y2d0X3M4KGIsYSkgLy9zd2FwIHRoZSBhcmd1bWVudHMhIQorCisKK3VpbnQxNng0X3QgICB2Y2x0X3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWQ0dULlMxNiBkMCwgZDAsIGQwCisjZGVmaW5lIHZjbHRfczE2KGEsYikgdmNndF9zMTYoYixhKSAvL3N3YXAgdGhlIGFyZ3VtZW50cyEhCisKKwordWludDMyeDJfdCAgIHZjbHRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZDR1QuUzMyIGQwLCBkMCwgZDAKKyNkZWZpbmUgdmNsdF9zMzIoYSxiKSAgdmNndF9zMzIoYixhKSAvL3N3YXAgdGhlIGFyZ3VtZW50cyEhCisKKwordWludDMyeDJfdCB2Y2x0X2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVkNHVC5GMzIgZDAsIGQwLCBkMAorI2RlZmluZSB2Y2x0X2YzMihhLGIpIHZjZ3RfZjMyKGIsIGEpIC8vc3dhcCB0aGUgYXJndW1lbnRzISEKKwordWludDh4OF90IHZjbHRfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkNHVC5VOCBkMCwgZDAsIGQwCisjZGVmaW5lIHZjbHRfdTgoYSxiKSB2Y2d0X3U4KGIsYSkgLy9zd2FwIHRoZSBhcmd1bWVudHMhIQorCit1aW50MTZ4NF90IHZjbHRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkNHVC5zMTYgZDAsIGQwLCBkMAorI2RlZmluZSB2Y2x0X3UxNihhLGIpIHZjZ3RfdTE2KGIsYSkgLy9zd2FwIHRoZSBhcmd1bWVudHMhIQorCit1aW50MzJ4Ml90IHZjbHRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkNHVC5VMzIgZDAsIGQwLCBkMAorI2RlZmluZSB2Y2x0X3UzMihhLGIpIHZjZ3RfdTMyKGIsYSkgLy9zd2FwIHRoZSBhcmd1bWVudHMhIQorCit1aW50OHgxNl90ICAgdmNsdHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkNHVC5TOCBxMCwgcTAsIHEwCisjZGVmaW5lIHZjbHRxX3M4KGEsYikgdmNndHFfczgoYiwgYSkgLy9zd2FwIHRoZSBhcmd1bWVudHMhIQorCit1aW50MTZ4OF90ICAgdmNsdHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZDR1QuUzE2IHEwLCBxMCwgcTAKKyNkZWZpbmUgdmNsdHFfczE2KGEsYikgdmNndHFfczE2KGIsIGEpIC8vc3dhcCB0aGUgYXJndW1lbnRzISEKKwordWludDMyeDRfdCAgIHZjbHRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWQ0dULlMzMiBxMCwgcTAsIHEwCisjZGVmaW5lIHZjbHRxX3MzMihhLGIpIHZjZ3RxX3MzMihiLCBhKSAvL3N3YXAgdGhlIGFyZ3VtZW50cyEhCisKK3VpbnQzMng0X3QgdmNsdHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQ0dULkYzMiBxMCwgcTAsIHEwCisjZGVmaW5lIHZjbHRxX2YzMihhLGIpIHZjZ3RxX2YzMihiLCBhKSAvL3N3YXAgdGhlIGFyZ3VtZW50cyEhCisKK3VpbnQ4eDE2X3QgdmNsdHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQ0dULlU4IHEwLCBxMCwgcTAKKyNkZWZpbmUgdmNsdHFfdTgoYSxiKSB2Y2d0cV91OChiLCBhKSAvL3N3YXAgdGhlIGFyZ3VtZW50cyEhCisKK3VpbnQxNng4X3QgdmNsdHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkNHVC5zMTYgcTAsIHEwLCBxMAorI2RlZmluZSB2Y2x0cV91MTYoYSxiKSB2Y2d0cV91MTYoYiwgYSkgLy9zd2FwIHRoZSBhcmd1bWVudHMhIQorCit1aW50MzJ4NF90IHZjbHRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZDR1QuVTMyIHEwLCBxMCwgcTAKKyNkZWZpbmUgdmNsdHFfdTMyKGEsYikgdmNndHFfdTMyKGIsIGEpIC8vc3dhcCB0aGUgYXJndW1lbnRzISEKKworLy8qKioqKioqKioqKioqKioqKlZlY3RvciBjb21wYXJlIGFic29sdXRlIGdyZWF0ZXItdGhhbiBvciBlcXVhbCAqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit1aW50MzJ4Ml90IHZjYWdlX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVkFDR0UuRjMyIGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2Y2FnZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgYzdmZmZmZmZmOworICAgIF9fbTEyOCBhMCwgYjA7CisgICAgYzdmZmZmZmZmID0gX21tX3NldDFfZXBpMzIgKDB4N2ZmZmZmZmYpOworICAgIGEwID0gX21tX2FuZF9wcyAoX3BNMTI4KGEpLCAqKF9fbTEyOCopJmM3ZmZmZmZmZik7CisgICAgYjAgPSBfbW1fYW5kX3BzIChfcE0xMjgoYiksICooX19tMTI4KikmYzdmZmZmZmZmKTsKKyAgICBhMCA9IF9tbV9jbXBnZV9wcyAoIGEwLCBiMCk7CisgICAgcmV0dXJuNjRmKGEwKTsKK30KKwordWludDMyeDRfdCB2Y2FnZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQUNHRS5GMzIgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZjYWdlcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYikgLy8gVkFDR0UuRjMyIHEwLCBxMCwgcTAKK3sKKyAgICBfX20xMjhpIGM3ZmZmZmZmZjsKKyAgICBfX20xMjggYTAsIGIwOworICAgIGM3ZmZmZmZmZiA9IF9tbV9zZXQxX2VwaTMyICgweDdmZmZmZmZmKTsKKyAgICBhMCA9IF9tbV9hbmRfcHMgKGEsICooX19tMTI4KikmYzdmZmZmZmZmKTsKKyAgICBiMCA9IF9tbV9hbmRfcHMgKGIsICooX19tMTI4KikmYzdmZmZmZmZmKTsKKyAgICBhMCA9IF9tbV9jbXBnZV9wcyAoIGEwLCBiMCk7CisgICAgcmV0dXJuICgqKF9fbTEyOGkqKSZhMCk7Cit9CisKKy8vKioqKioqKipWZWN0b3IgY29tcGFyZSBhYnNvbHV0ZSBsZXNzLXRoYW4gb3IgZXF1YWwgKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit1aW50MzJ4Ml90IHZjYWxlX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVkFDR0UuRjMyIGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2Y2FsZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgYzdmZmZmZmZmOworICAgIF9fbTEyOCBhMCwgYjA7CisgICAgYzdmZmZmZmZmID0gX21tX3NldDFfZXBpMzIgKDB4N2ZmZmZmZmYpOworICAgIGEwID0gX21tX2FuZF9wcyAoX3BNMTI4KGEpLCAqKF9fbTEyOCopJmM3ZmZmZmZmZik7CisgICAgYjAgPSBfbW1fYW5kX3BzIChfcE0xMjgoYiksICooX19tMTI4KikmYzdmZmZmZmZmKTsKKyAgICBhMCA9IF9tbV9jbXBsZV9wcyAoYTAsIGIwKTsKKyAgICByZXR1cm42NGYoYTApOworfQorCit1aW50MzJ4NF90IHZjYWxlcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZBQ0dFLkYzMiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmNhbGVxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSAvLyBWQUNHRS5GMzIgcTAsIHEwLCBxMAoreworICAgIF9fbTEyOGkgYzdmZmZmZmZmOworICAgIF9fbTEyOCBhMCwgYjA7CisgICAgYzdmZmZmZmZmID0gX21tX3NldDFfZXBpMzIgKDB4N2ZmZmZmZmYpOworICAgIGEwID0gX21tX2FuZF9wcyAoYSwgKihfX20xMjgqKSZjN2ZmZmZmZmYpOworICAgIGIwID0gX21tX2FuZF9wcyAoYiwgKihfX20xMjgqKSZjN2ZmZmZmZmYpOworICAgIGEwID0gX21tX2NtcGxlX3BzIChhMCwgYjApOworICAgIHJldHVybiAoKihfX20xMjhpKikmYTApOworfQorCisvLyoqKioqKioqICBWZWN0b3IgY29tcGFyZSBhYnNvbHV0ZSBncmVhdGVyLXRoYW4gICAgKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordWludDMyeDJfdCB2Y2FndF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZBQ0dULkYzMiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdmNhZ3RfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIGM3ZmZmZmZmZjsKKyAgICBfX20xMjggYTAsIGIwOworICAgIGM3ZmZmZmZmZiA9IF9tbV9zZXQxX2VwaTMyICgweDdmZmZmZmZmKTsKKyAgICBhMCA9IF9tbV9hbmRfcHMgKF9wTTEyOChhKSwgKihfX20xMjgqKSZjN2ZmZmZmZmYpOworICAgIGIwID0gX21tX2FuZF9wcyAoX3BNMTI4KGIpLCAqKF9fbTEyOCopJmM3ZmZmZmZmZik7CisgICAgYTAgPSBfbW1fY21wZ3RfcHMgKGEwLCBiMCk7CisgICAgcmV0dXJuNjRmKGEwKTsKK30KKwordWludDMyeDRfdCB2Y2FndHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQUNHVC5GMzIgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZjYWd0cV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYikgLy8gVkFDR1QuRjMyIHEwLCBxMCwgcTAKK3sKKyAgICBfX20xMjhpIGM3ZmZmZmZmZjsKKyAgICBfX20xMjggYTAsIGIwOworICAgIGM3ZmZmZmZmZiA9IF9tbV9zZXQxX2VwaTMyICgweDdmZmZmZmZmKTsKKyAgICBhMCA9IF9tbV9hbmRfcHMgKGEsICooX19tMTI4KikmYzdmZmZmZmZmKTsKKyAgICBiMCA9IF9tbV9hbmRfcHMgKGIsICooX19tMTI4KikmYzdmZmZmZmZmKTsKKyAgICBhMCA9IF9tbV9jbXBndF9wcyAoYTAsIGIwKTsKKyAgICByZXR1cm4gKCooX19tMTI4aSopJmEwKTsKK30KKworLy8qKioqKioqKioqKioqKipWZWN0b3IgY29tcGFyZSBhYnNvbHV0ZSBsZXNzLXRoYW4gICoqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3VpbnQzMngyX3QgdmNhbHRfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQUNHVC5GMzIgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZjYWx0X2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKQoreworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSBjN2ZmZmZmZmY7CisgICAgX19tMTI4IGEwLCBiMDsKKyAgICBjN2ZmZmZmZmYgPSBfbW1fc2V0MV9lcGkzMiAoMHg3ZmZmZmZmZik7CisgICAgYTAgPSBfbW1fYW5kX3BzIChfcE0xMjgoYSksICooX19tMTI4KikmYzdmZmZmZmZmKTsKKyAgICBiMCA9IF9tbV9hbmRfcHMgKF9wTTEyOChiKSwgKihfX20xMjgqKSZjN2ZmZmZmZmYpOworICAgIGEwID0gX21tX2NtcGx0X3BzIChhMCwgYjApOworICAgIHJldHVybjY0ZihhMCk7Cit9CisKK3VpbnQzMng0X3QgdmNhbHRxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVkFDR1QuRjMyIHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2Y2FsdHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpIC8vIFZBQ0dULkYzMiBxMCwgcTAsIHEwCit7CisgICAgX19tMTI4aSBjN2ZmZmZmZmY7CisgICAgX19tMTI4IGEwLCBiMDsKKyAgICBjN2ZmZmZmZmYgPSBfbW1fc2V0MV9lcGkzMiAoMHg3ZmZmZmZmZik7CisgICAgYTAgPSBfbW1fYW5kX3BzIChhLCAqKF9fbTEyOCopJmM3ZmZmZmZmZik7CisgICAgYjAgPSBfbW1fYW5kX3BzIChiLCAqKF9fbTEyOCopJmM3ZmZmZmZmZik7CisgICAgYTAgPSBfbW1fY21wbHRfcHMgKGEwLCBiMCk7CisgICAgcmV0dXJuICgqKF9fbTEyOGkqKSZhMCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKlZlY3RvciB0ZXN0IGJpdHMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qVlRTVCAoVmVjdG9yIFRlc3QgQml0cykgdGFrZXMgZWFjaCBlbGVtZW50IGluIGEgdmVjdG9yLCBhbmQgYml0d2lzZSBsb2dpY2FsIEFORHMgdGhlbQord2l0aCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIGEgc2Vjb25kIHZlY3Rvci4gSWYgdGhlIHJlc3VsdCBpcyBub3QgemVybywgdGhlCitjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gdGhlIGRlc3RpbmF0aW9uIHZlY3RvciBpcyBzZXQgdG8gYWxsIG9uZXMuIE90aGVyd2lzZSwgaXQgaXMgc2V0IHRvCithbGwgemVyb3MuICovCisKK3VpbnQ4eDhfdCB2dHN0X3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiKTsgLy8gVlRTVC44IGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZ0c3RfczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnRzdHFfczgoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQxNng0X3QgdnRzdF9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYik7IC8vIFZUU1QuMTYgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZ0c3RfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZ0c3RxX3MxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCB2dHN0X3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiKTsgLy8gVlRTVC4zMiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnRzdF9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnRzdHFfczMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50OHg4X3QgdnRzdF91OCh1aW50OHg4X3QgYSwgIHVpbnQ4eDhfdCBiKTsgLy8gVlRTVC44IGQwLCBkMCwgZDAKKyNkZWZpbmUgdnRzdF91OCB2dHN0X3M4CisKK3VpbnQxNng0X3QgdnRzdF91MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiKTsgLy8gVlRTVC4xNiBkMCwgZDAsIGQwCisjZGVmaW5lIHZ0c3RfdTE2IHZ0c3RfczE2CisKK3VpbnQzMngyX3QgdnRzdF91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiKTsgLy8gVlRTVC4zMiBkMCwgZDAsIGQwCisjZGVmaW5lIHZ0c3RfdTMyIHZ0c3RfczMyCisKKwordWludDh4OF90IHZ0c3RfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKTsgLy8gVlRTVC44IGQwLCBkMCwgZDAKKyNkZWZpbmUgdnRzdF9wOCB2dHN0X3U4CisKK3VpbnQ4eDE2X3QgdnRzdHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlRTVC44IHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2dHN0cV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIC8vIFZUU1QuOCBxMCwgcTAsIHEwCit7CisgICAgX19tMTI4aSB6ZXJvLCBvbmUsIHJlczsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjggKCk7CisgICAgb25lID0gX21tX2NtcGVxX2VwaTgoemVybyx6ZXJvKTsgLy8weGZmZi4uZmZmZgorICAgIHJlcyA9IF9tbV9hbmRfc2kxMjggKGEsIGIpOworICAgIHJlcyA9ICBfbW1fY21wZXFfZXBpOCAocmVzLCB6ZXJvKTsKKyAgICByZXR1cm4gX21tX3hvcl9zaTEyOChyZXMsIG9uZSk7IC8vaW52ZXJ0IHJlc3VsdAorfQorCit1aW50MTZ4OF90IHZ0c3RxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWVFNULjE2IHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2dHN0cV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSAvLyBWVFNULjE2IHEwLCBxMCwgcTAKK3sKKyAgICBfX20xMjhpIHplcm8sIG9uZSwgcmVzOworICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCAoKTsKKyAgICBvbmUgPSBfbW1fY21wZXFfZXBpOCh6ZXJvLHplcm8pOyAvLzB4ZmZmLi5mZmZmCisgICAgcmVzID0gX21tX2FuZF9zaTEyOCAoYSwgYik7CisgICAgcmVzID0gIF9tbV9jbXBlcV9lcGkxNiAocmVzLCB6ZXJvKTsKKyAgICByZXR1cm4gX21tX3hvcl9zaTEyOChyZXMsIG9uZSk7IC8vaW52ZXJ0IHJlc3VsdAorfQorCit1aW50MzJ4NF90IHZ0c3RxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWVFNULjMyIHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2dHN0cV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSAvLyBWVFNULjMyIHEwLCBxMCwgcTAKK3sKKyAgICBfX20xMjhpIHplcm8sIG9uZSwgcmVzOworICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCAoKTsKKyAgICBvbmUgPSBfbW1fY21wZXFfZXBpOCh6ZXJvLHplcm8pOyAvLzB4ZmZmLi5mZmZmCisgICAgcmVzID0gX21tX2FuZF9zaTEyOCAoYSwgYik7CisgICAgcmVzID0gIF9tbV9jbXBlcV9lcGkzMiAocmVzLCB6ZXJvKTsKKyAgICByZXR1cm4gX21tX3hvcl9zaTEyOChyZXMsIG9uZSk7IC8vaW52ZXJ0IHJlc3VsdAorfQorCit1aW50OHgxNl90IHZ0c3RxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVlRTVC44IHEwLCBxMCwgcTAKKyNkZWZpbmUgdnRzdHFfdTggdnRzdHFfczgKKwordWludDE2eDhfdCB2dHN0cV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWVFNULjE2IHEwLCBxMCwgcTAKKyNkZWZpbmUgdnRzdHFfdTE2IHZ0c3RxX3MxNgorCit1aW50MzJ4NF90IHZ0c3RxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZUU1QuMzIgcTAsIHEwLCBxMAorI2RlZmluZSB2dHN0cV91MzIgdnRzdHFfczMyCisKK3VpbnQ4eDE2X3QgdnRzdHFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpOyAvLyBWVFNULjggcTAsIHEwLCBxMAorI2RlZmluZSB2dHN0cV9wOCB2dHN0cV91OAorCisvLyoqKioqKioqKioqKioqKioqKiBBYnNvbHV0ZSBkaWZmZXJlbmNlICoqKioqKioqKioqKioqKioqKioqCisvLyoqKiBBYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFyZ3VtZW50czogVnJbaV0gPSB8IFZhW2ldIC0gVmJbaV0gfCoqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdmFiZF9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYik7IC8vIFZBQkQuUzggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdmFiZF9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYikKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NCh2YWJkcV9zOChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKK2ludDE2eDRfdCB2YWJkX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKTsgLy8gVkFCRC5TMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZhYmRfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZhYmRxX3MxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKK2ludDMyeDJfdCB2YWJkX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiKTsgLy8gVkFCRC5TMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZhYmRfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZhYmRxX3MzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKK3VpbnQ4eDhfdCB2YWJkX3U4KHVpbnQ4eDhfdCBhLCAgdWludDh4OF90IGIpOyAvLyBWQUJELlU4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2YWJkX3U4KHVpbnQ4eDhfdCBhLCAgdWludDh4OF90IGIpCit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KHZhYmRxX3U4KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKwordWludDE2eDRfdCB2YWJkX3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIpOyAvLyBWQUJELnMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZhYmRfdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYikKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZhYmRxX3UxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKK3VpbnQzMngyX3QgdmFiZF91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiKTsgLy8gVkFCRC5VMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2YWJkX3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2YWJkcV91MzIoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCitmbG9hdDMyeDJfdCB2YWJkX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVkFCRC5GMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3QgdmFiZF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICBmbG9hdDMyeDRfdCByZXM7CisgICAgX19tNjRfMTI4IHJlczY0OworICAgIHJlcyA9IHZhYmRxX2YzMihfcE0xMjgoYSksIF9wTTEyOChiKSk7CisgICAgX002NGYocmVzNjQsIHJlcyk7CisgICAgcmV0dXJuIHJlczY0OworfQorCitpbnQ4eDE2X3QgdmFiZHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkFCRC5TOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdmFiZHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSAvLyBWQUJELlM4IHEwLHEwLHEwCit7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gX21tX3N1Yl9lcGk4IChhLCBiKTsKKyAgICByZXR1cm4gX21tX2Fic19lcGk4IChyZXMpOworfQorCitpbnQxNng4X3QgdmFiZHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZBQkQuUzE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2YWJkcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSAvLyBWQUJELlMxNiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9tbV9zdWJfZXBpMTYgKGEsYik7CisgICAgcmV0dXJuIF9tbV9hYnNfZXBpMTYgKHJlcyk7Cit9CisKK2ludDMyeDRfdCB2YWJkcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkFCRC5TMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZhYmRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIC8vIFZBQkQuUzMyIHEwLHEwLHEwCit7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gX21tX3N1Yl9lcGkzMiAoYSxiKTsKKyAgICByZXR1cm4gX21tX2Fic19lcGkzMiAocmVzKTsKK30KKwordWludDh4MTZfdCB2YWJkcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZBQkQuVTggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2YWJkcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgLy9ubyBhYnMgZm9yIHVuc2lnbmVkCit7CisgICAgX19tMTI4aSBjbXAsIGRpZmFiLCBkaWZiYTsKKyAgICBjbXAgPSB2Y2d0cV91OChhLGIpOworICAgIGRpZmFiID0gX21tX3N1Yl9lcGk4KGEsYik7CisgICAgZGlmYmEgPSBfbW1fc3ViX2VwaTggKGIsYSk7CisgICAgZGlmYWIgPSBfbW1fYW5kX3NpMTI4KGNtcCwgZGlmYWIpOworICAgIGRpZmJhID0gX21tX2FuZG5vdF9zaTEyOChjbXAsIGRpZmJhKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4KGRpZmFiLCBkaWZiYSk7Cit9CisKK3VpbnQxNng4X3QgdmFiZHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkFCRC5zMTYgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2YWJkcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpCit7CisgICAgX19tMTI4aSBjbXAsIGRpZmFiLCBkaWZiYTsKKyAgICBjbXAgPSB2Y2d0cV91MTYoYSxiKTsKKyAgICBkaWZhYiA9IF9tbV9zdWJfZXBpMTYoYSxiKTsKKyAgICBkaWZiYSA9IF9tbV9zdWJfZXBpMTYgKGIsYSk7CisgICAgZGlmYWIgPSBfbW1fYW5kX3NpMTI4KGNtcCwgZGlmYWIpOworICAgIGRpZmJhID0gX21tX2FuZG5vdF9zaTEyOChjbXAsIGRpZmJhKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4KGRpZmFiLCBkaWZiYSk7Cit9CisKK3VpbnQzMng0X3QgdmFiZHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkFCRC5VMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2YWJkcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpCit7CisgICAgX19tMTI4aSBjbXAsIGRpZmFiLCBkaWZiYTsKKyAgICBjbXAgPSB2Y2d0cV91MzIoYSxiKTsKKyAgICBkaWZhYiA9IF9tbV9zdWJfZXBpMzIoYSxiKTsKKyAgICBkaWZiYSA9IF9tbV9zdWJfZXBpMzIgKGIsYSk7CisgICAgZGlmYWIgPSBfbW1fYW5kX3NpMTI4KGNtcCwgZGlmYWIpOworICAgIGRpZmJhID0gX21tX2FuZG5vdF9zaTEyOChjbXAsIGRpZmJhKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4KGRpZmFiLCBkaWZiYSk7Cit9CisKK2Zsb2F0MzJ4NF90IHZhYmRxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVkFCRC5GMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3QgdmFiZHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpIC8vIFZBQkQuRjMyIHEwLHEwLHEwCit7CisgICAgX19tMTI4aSBjMTsKKyAgICBfX20xMjggcmVzOworICAgIGMxID0gIF9tbV9zZXQxX2VwaTMyKDB4N2ZmZmZmZmYpOworICAgIHJlcyA9IF9tbV9zdWJfcHMgKGEsIGIpOworICAgIHJldHVybiBfbW1fYW5kX3BzIChyZXMsICooX19tMTI4KikmYzEpOworfQorCisvLyoqKioqKioqKioqKiAgQWJzb2x1dGUgZGlmZmVyZW5jZSAtIGxvbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDE2eDhfdCB2YWJkbF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkFCREwuUzggcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZhYmRsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIC8vIFZBQkRMLlM4IHEwLGQwLGQwCit7CisgICAgX19tMTI4aSBhMTYsIGIxNjsKKyAgICBhMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vU1NFNC4xLAorICAgIGIxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGIpKTsgLy9TU0U0LjEsCisgICAgcmV0dXJuIHZhYmRxX3MxNihhMTYsIGIxNik7CisKK30KKworaW50MzJ4NF90IHZhYmRsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWQUJETC5TMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZhYmRsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIC8vIFZBQkRMLlMxNiBxMCxkMCxkMAoreworICAgIF9fbTEyOGkgYTMyLCBiMzI7CisgICAgYTMyID0gX01NX0NWVEVQSTE2X0VQSTMyIChfcE0xMjhpKGEpKTsgLy9TU0U0LjEKKyAgICBiMzIgPSBfTU1fQ1ZURVBJMTZfRVBJMzIgKF9wTTEyOGkoYikpOyAvL1NTRTQuMSwKKyAgICByZXR1cm4gdmFiZHFfczMyKGEzMiwgYjMyKTsKK30KKworaW50NjR4Ml90IHZhYmRsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQUJETC5TMzIgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcgKGludDY0eDJfdCB2YWJkbF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSxfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vbm8gb3B0aW1hbCBTSU1EIHNvbHV0aW9uLCBzZXJpYWwgbG9va3MgZmFzdGVyCisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDY0X3QgcmVzWzJdOworICAgIGlmKGEubTY0X2kzMlswXSA+IGIubTY0X2kzMlswXSkgcmVzWzBdID0gKCBpbnQ2NF90KSBhLm02NF9pMzJbMF0gLSAoIGludDY0X3QpIGIubTY0X2kzMlswXTsKKyAgICBlbHNlIHJlc1swXSA9ICggaW50NjRfdCkgYi5tNjRfaTMyWzBdIC0gKCBpbnQ2NF90KSBhLm02NF9pMzJbMF07CisgICAgaWYoYS5tNjRfaTMyWzFdID4gYi5tNjRfaTMyWzFdKSByZXNbMV0gPSAoIGludDY0X3QpIGEubTY0X2kzMlsxXSAtICggaW50NjRfdCkgYi5tNjRfaTMyWzFdOworICAgIGVsc2UgcmVzWzFdID0gKCBpbnQ2NF90KSBiLm02NF9pMzJbMV0gLSAoIGludDY0X3QpIGEubTY0X2kzMlsxXTsKKyAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7Cit9CisKK3VpbnQxNng4X3QgdmFiZGxfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkFCREwuVTggcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2YWJkbF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpCit7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdnN1YmxfdTgoYSxiKTsKKyAgICByZXR1cm4gX21tX2Fic19lcGkxNihyZXMpOworfQorCit1aW50MzJ4NF90IHZhYmRsX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZBQkRMLnMxNiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZhYmRsX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikKK3sKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2c3VibF91MTYoYSxiKTsKKyAgICByZXR1cm4gX21tX2Fic19lcGkzMihyZXMpOworfQorCit1aW50NjR4Ml90IHZhYmRsX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZBQkRMLlUzMiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyAodWludDY0eDJfdCB2YWJkbF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50NjRfdCByZXNbMl07CisgICAgaWYoYS5tNjRfdTMyWzBdID4gYi5tNjRfdTMyWzBdKSByZXNbMF0gPSAoIHVpbnQ2NF90KSBhLm02NF91MzJbMF0gLSAoIHVpbnQ2NF90KSBiLm02NF91MzJbMF07CisgICAgZWxzZSByZXNbMF0gPSAoIHVpbnQ2NF90KSBiLm02NF91MzJbMF0gLSAoIHVpbnQ2NF90KSBhLm02NF91MzJbMF07CisgICAgaWYoYS5tNjRfdTMyWzFdID4gYi5tNjRfdTMyWzFdKSByZXNbMV0gPSAoIHVpbnQ2NF90KSBhLm02NF91MzJbMV0gLSAoIHVpbnQ2NF90KSBiLm02NF91MzJbMV07CisgICAgZWxzZSByZXNbMV0gPSAoIHVpbnQ2NF90KSBiLm02NF91MzJbMV0gLSAoIHVpbnQ2NF90KSBhLm02NF91MzJbMV07CisgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworfQorCisvLyoqKioqKioqKipBYnNvbHV0ZSBkaWZmZXJlbmNlIGFuZCBhY2N1bXVsYXRlOiBWcltpXSA9IFZhW2ldICsgfCBWYltpXSAtIFZjW2ldIHwgKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZhYmFfczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIsIGludDh4OF90IGMpOyAvLyBWQUJBLlM4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZhYmFfczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIsIGludDh4OF90IGMpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmFiYXFfczgoX3BNMTI4aShhKSxfcE0xMjhpKGIpLCBfcE0xMjhpKGMpKSk7Cit9CisKK2ludDE2eDRfdCB2YWJhX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYyk7IC8vIFZBQkEuUzE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2YWJhX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYykKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmFiYXFfczE2KF9wTTEyOGkoYSksIF9wTTEyOGkoYiksIF9wTTEyOGkoYykpKTsKK30KKworaW50MzJ4Ml90IHZhYmFfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKTsgLy8gVkFCQS5TMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZhYmFfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2YWJhcV9zMzIoX3BNMTI4aShhKSwgX3BNMTI4aShiKSwgX3BNMTI4aShjKSkpOworfQorCit1aW50OHg4X3QgdmFiYV91OCh1aW50OHg4X3QgYSwgIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZBQkEuVTggZDAsZDAsZDAKKyNkZWZpbmUgdmFiYV91OCB2YWJhX3M4CisKKwordWludDE2eDRfdCB2YWJhX3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYyk7IC8vIFZBQkEuczE2IGQwLGQwLGQwCisjZGVmaW5lIHZhYmFfdTE2IHZhYmFfczE2CisKK3VpbnQzMngyX3QgdmFiYV91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpOyAvLyBWQUJBLlUzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZhYmFfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCBjKQoreworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmFiYXFfdTMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYiksIF9wTTEyOGkoYykpKTsKK30KKworaW50OHgxNl90IHZhYmFxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgaW50OHgxNl90IGMpOyAvLyBWQUJBLlM4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCB2YWJhcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIGludDh4MTZfdCBjKSAvLyBWQUJBLlM4IHEwLHEwLHEwCit7CisgICAgaW50OHgxNl90IHN1YjsKKyAgICBzdWIgPSB2YWJkcV9zOChiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfczgoIGEsIHN1Yik7Cit9CisKK2ludDE2eDhfdCB2YWJhcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgYyk7IC8vIFZBQkEuUzE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2YWJhcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgYykgLy8gVkFCQS5TMTYgcTAscTAscTAKK3sKKyAgICBpbnQxNng4X3Qgc3ViOworICAgIHN1YiA9IHZhYmRxX3MxNihiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfczE2KCBhLCBzdWIpOworfQorCitpbnQzMng0X3QgdmFiYXFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4NF90IGMpOyAvLyBWQUJBLlMzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdmFiYXFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4NF90IGMpIC8vIFZBQkEuUzMyIHEwLHEwLHEwCit7CisgICAgaW50MzJ4NF90IHN1YjsKKyAgICBzdWIgPSB2YWJkcV9zMzIoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3MzMiggYSwgc3ViKTsKK30KKwordWludDh4MTZfdCB2YWJhcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgdWludDh4MTZfdCBjKTsgLy8gVkFCQS5VOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZhYmFxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCB1aW50OHgxNl90IGMpCit7CisgICAgdWludDh4MTZfdCBzdWI7CisgICAgc3ViID0gdmFiZHFfdTgoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3U4KCBhLCBzdWIpOworfQorCit1aW50MTZ4OF90IHZhYmFxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDhfdCBjKTsgLy8gVkFCQS5zMTYgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2YWJhcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNng4X3QgYykKK3sKKyAgICB1aW50MTZ4OF90IHN1YjsKKyAgICBzdWIgPSB2YWJkcV91MTYoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3UxNiggYSwgc3ViKTsKK30KKwordWludDMyeDRfdCB2YWJhcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMng0X3QgYyk7IC8vIFZBQkEuVTMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmFiYXFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCB1aW50MzJ4NF90IGMpCit7CisgICAgdWludDMyeDRfdCBzdWI7CisgICAgc3ViID0gdmFiZHFfdTMyKGIsIGMpOworICAgIHJldHVybiB2YWRkcV91MzIoIGEsIHN1Yik7Cit9CisKKy8vKioqKioqKioqKioqKiogQWJzb2x1dGUgZGlmZmVyZW5jZSBhbmQgYWNjdW11bGF0ZSAtIGxvbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MTZ4OF90IHZhYmFsX3M4KGludDE2eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVkFCQUwuUzggcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZhYmFsX3M4KGludDE2eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKSAvLyBWQUJBTC5TOCBxMCxkMCxkMAoreworICAgIF9fbTEyOGkgYjE2LCBjMTYsIHJlczsKKyAgICBiMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShiKSk7IC8vU1NFNC4xLAorICAgIGMxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGMpKTsgLy9TU0U0LjEsCisgICAgcmVzID0gX21tX2Fic19lcGkxNiAoX21tX3N1Yl9lcGkxNiAoYjE2LCBjMTYpICk7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYgKGEsIHJlcyk7Cit9CisKK2ludDMyeDRfdCB2YWJhbF9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYyk7IC8vIFZBQkFMLlMxNiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdmFiYWxfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpIC8vIFZBQkFMLlMxNiBxMCxkMCxkMAoreworICAgIF9fbTEyOGkgYjMyLCBjMzIsIHJlczsKKyAgICBiMzIgPSBfTU1fQ1ZURVBJMTZfRVBJMzIoX3BNMTI4aShiKSk7IC8vU1NFNC4xCisgICAgYzMyID0gX01NX0NWVEVQSTE2X0VQSTMyKF9wTTEyOGkoYykpOyAvL1NTRTQuMQorICAgIHJlcyA9IF9tbV9hYnNfZXBpMzIgKF9tbV9zdWJfZXBpMzIgKGIzMiwgYzMyKSApOworICAgIHJldHVybiBfbW1fYWRkX2VwaTMyIChhLCByZXMpOworfQorCitpbnQ2NHgyX3QgdmFiYWxfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpOyAvLyBWQUJBTC5TMzIgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcgKGludDY0eDJfdCB2YWJhbF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYyksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdmFiZGxfczMyKGIsYyk7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpNjQoYSwgcmVzKTsKK30KKwordWludDE2eDhfdCB2YWJhbF91OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZBQkFMLlU4IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdmFiYWxfdTgodWludDE2eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpCit7CisgICAgX19tMTI4aSBiMTYsIGMxNiwgcmVzOworICAgIGIxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGIpKTsgLy9TU0U0LjEsCisgICAgYzE2ID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYykpOyAvL1NTRTQuMSwKKyAgICByZXMgPSBfbW1fYWJzX2VwaTE2IChfbW1fc3ViX2VwaTE2IChiMTYsIGMxNikgKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkxNiAoYSwgcmVzKTsKK30KKwordWludDMyeDRfdCB2YWJhbF91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYyk7IC8vIFZBQkFMLnMxNiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZhYmFsX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCBjKQoreworICAgIF9fbTEyOGkgYjMyLCBjMzIsIHJlczsKKyAgICBiMzIgPSBfTU1fQ1ZURVBVMTZfRVBJMzIoX3BNMTI4aShiKSk7IC8vU1NFNC4xCisgICAgYzMyID0gX01NX0NWVEVQVTE2X0VQSTMyKF9wTTEyOGkoYykpOyAvL1NTRTQuMQorICAgIHJlcyA9IF9tbV9hYnNfZXBpMzIgKF9tbV9zdWJfZXBpMzIgKGIzMiwgYzMyKSApOworICAgIHJldHVybiBfbW1fYWRkX2VwaTMyIChhLCByZXMpOworfQorCit1aW50NjR4Ml90IHZhYmFsX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCBjKTsgLy8gVkFCQUwuVTMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HICh1aW50NjR4Ml90IHZhYmFsX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCBjKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2YWJkbF91MzIoYixjKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGk2NChhLCByZXMpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKiogIE1heGltdW0gYW5kIG1pbmltdW0gb3BlcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKiogTWF4aW11bTogIHZtYXggLT4gVnJbaV0gOj0gKFZhW2ldID49IFZiW2ldKSA/IFZhW2ldIDogVmJbaV0gICAgKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgICB2bWF4X3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWTUFYLlM4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90ICAgdm1heF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9NTV9NQVhfRVBJOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpOyAvL1NTRTQuMSwgdXNlIG9ubHkgbG93ZXIgNjQgYml0cworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDE2eDRfdCB2bWF4X3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWTUFYLlMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3Qgdm1heF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fbWF4X2VwaTE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCitpbnQzMngyX3QgICB2bWF4X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWTUFYLlMzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgICB2bWF4X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9ICBfTU1fTUFYX0VQSTMyKF9wTTEyOGkoYSksX3BNMTI4aShiKSk7IC8vU1NFNC4xLCB1c2Ugb25seSBsb3dlciA2NCBiaXRzCisgICAgcmV0dXJuNjQocmVzKTsKK30KKwordWludDh4OF90IHZtYXhfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVk1BWC5VOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3Qgdm1heF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpCit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9tYXhfZXB1OChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MTZ4NF90IHZtYXhfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVk1BWC5zMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2bWF4X3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KF9NTV9NQVhfRVBVMTYoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCAgIHZtYXhfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVk1BWC5VMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCAgIHZtYXhfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKQoreworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gX01NX01BWF9FUFUzMihfcE0xMjhpKGEpLF9wTTEyOGkoYikpOyAvL1NTRTQuMSwgdXNlIG9ubHkgbG93ZXIgNjQgYml0cywgbWF5IGJlIG5vdCBlZmZlY3RpdmUgY29tcGFyZWQgd2l0aCBzZXJpYWwKKyAgICByZXR1cm42NChyZXMpOworfQorCitmbG9hdDMyeDJfdCB2bWF4X2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVk1BWC5GMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3Qgdm1heF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICAvL3NlcmlhbCBzb2x1dGlvbiBsb29rcyBmYXN0ZXIgdGhhbiAgU0lNRCBvbmUKKyAgICBmbG9hdDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9mMzJbMF0gPSAoYS5tNjRfZjMyWzBdID4gYi5tNjRfZjMyWzBdKSA/IGEubTY0X2YzMlswXSA6IGIubTY0X2YzMlswXTsKKyAgICByZXMubTY0X2YzMlsxXSA9IChhLm02NF9mMzJbMV0gPiBiLm02NF9mMzJbMV0pID8gYS5tNjRfZjMyWzFdIDogYi5tNjRfZjMyWzFdOworICAgIHJldHVybiByZXM7Cit9CisKK2ludDh4MTZfdCAgIHZtYXhxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZNQVguUzggcTAscTAscTAKKyNkZWZpbmUgdm1heHFfczggX01NX01BWF9FUEk4IC8vU1NFNC4xCisKK2ludDE2eDhfdCAgIHZtYXhxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWTUFYLlMxNiBxMCxxMCxxMAorI2RlZmluZSB2bWF4cV9zMTYgX21tX21heF9lcGkxNgorCitpbnQzMng0X3QgICB2bWF4cV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVk1BWC5TMzIgcTAscTAscTAKKyNkZWZpbmUgdm1heHFfczMyIF9NTV9NQVhfRVBJMzIgLy9TU0U0LjEKKwordWludDh4MTZfdCAgIHZtYXhxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVk1BWC5VOCBxMCxxMCxxMAorI2RlZmluZSB2bWF4cV91OCBfbW1fbWF4X2VwdTgKKwordWludDE2eDhfdCAgIHZtYXhxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZNQVguczE2IHEwLHEwLHEwCisjZGVmaW5lIHZtYXhxX3UxNiBfTU1fTUFYX0VQVTE2IC8vU1NFNC4xCisKK3VpbnQzMng0X3QgICB2bWF4cV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWTUFYLlUzMiBxMCxxMCxxMAorI2RlZmluZSB2bWF4cV91MzIgX01NX01BWF9FUFUzMiAvL1NTRTQuMQorCisKK2Zsb2F0MzJ4NF90IHZtYXhxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVk1BWC5GMzIgcTAscTAscTAKKyNkZWZpbmUgdm1heHFfZjMyIF9tbV9tYXhfcHMKKworLy8qKioqKioqKioqKioqKiogTWluaW11bTogdm1pbiAtPiBWcltpXSA6PSAoVmFbaV0gPj0gVmJbaV0pID8gVmJbaV0gOiBWYVtpXSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgICB2bWluX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWTUlOLlM4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90ICAgdm1pbl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9NTV9NSU5fRVBJOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpOyAvL1NTRTQuMSwgdXNlIG9ubHkgbG93ZXIgNjQgYml0cworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDE2eDRfdCB2bWluX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWTUlOLlMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3Qgdm1pbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fbWluX2VwaTE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK2ludDMyeDJfdCAgIHZtaW5fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZNSU4uUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCAgIHZtaW5fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gX01NX01JTl9FUEkzMihfcE0xMjhpKGEpLF9wTTEyOGkoYikpOyAvL1NTRTQuMSwgdXNlIG9ubHkgbG93ZXIgNjQgYml0cworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK3VpbnQ4eDhfdCB2bWluX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZNSU4uVTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZtaW5fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKQoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fbWluX2VwdTgoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDE2eDRfdCB2bWluX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZNSU4uczE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3Qgdm1pbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfTU1fTUlOX0VQVTE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgICB2bWluX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZNSU4uVTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgICB2bWluX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9NTV9NSU5fRVBVMzIoX3BNMTI4aShhKSxfcE0xMjhpKGIpKTsgLy9TU0U0LjEsIHVzZSBvbmx5IGxvd2VyIDY0IGJpdHMsIG1heSBiZSBub3QgZWZmZWN0aXZlIGNvbXBhcmVkIHdpdGggc2VyaWFsCisgICAgcmV0dXJuNjQocmVzKTsKK30KKworZmxvYXQzMngyX3Qgdm1pbl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZNSU4uRjMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZtaW5fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyIHRoYW4gIFNJTUQgb25lCisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfZjMyWzBdID0gKGEubTY0X2YzMlswXSA8IGIubTY0X2YzMlswXSkgPyBhLm02NF9mMzJbMF0gOiBiLm02NF9mMzJbMF07CisgICAgcmVzLm02NF9mMzJbMV0gPSAoYS5tNjRfZjMyWzFdIDwgYi5tNjRfZjMyWzFdKSA/IGEubTY0X2YzMlsxXSA6IGIubTY0X2YzMlsxXTsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQ4eDE2X3QgICB2bWlucV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWTUlOLlM4IHEwLHEwLHEwCisjZGVmaW5lIHZtaW5xX3M4IF9NTV9NSU5fRVBJOCAvL1NTRTQuMQorCitpbnQxNng4X3QgICB2bWlucV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVk1JTi5TMTYgcTAscTAscTAKKyNkZWZpbmUgdm1pbnFfczE2IF9tbV9taW5fZXBpMTYKKworaW50MzJ4NF90ICAgdm1pbnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZNSU4uUzMyIHEwLHEwLHEwCisjZGVmaW5lIHZtaW5xX3MzMiBfTU1fTUlOX0VQSTMyIC8vU1NFNC4xCisKK3VpbnQ4eDE2X3QgICB2bWlucV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZNSU4uVTggcTAscTAscTAKKyNkZWZpbmUgdm1pbnFfdTggX21tX21pbl9lcHU4CisKK3VpbnQxNng4X3QgICB2bWlucV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWTUlOLnMxNiBxMCxxMCxxMAorI2RlZmluZSB2bWlucV91MTYgX01NX01JTl9FUFUxNiAvL1NTRTQuMQorCit1aW50MzJ4NF90ICAgdm1pbnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVk1JTi5VMzIgcTAscTAscTAKKyNkZWZpbmUgdm1pbnFfdTMyIF9NTV9NSU5fRVBVMzIgLy9TU0U0LjEKKworZmxvYXQzMng0X3Qgdm1pbnFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWTUlOLkYzMiBxMCxxMCxxMAorI2RlZmluZSB2bWlucV9mMzIgX21tX21pbl9wcworCisvLyoqKioqKioqKioqKiogIFBhaXJ3aXNlIGFkZGl0aW9uIG9wZXJhdGlvbnMuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9QYWlyd2lzZSBhZGQgLSBhZGRzIGFkamFjZW50IHBhaXJzIG9mIGVsZW1lbnRzIG9mIHR3byB2ZWN0b3JzLCBhbmQgcGxhY2VzIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IKK2ludDh4OF90IHZwYWRkX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUEFERC5JOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2cGFkZF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSAvLyBWUEFERC5JOCBkMCxkMCxkMAoreworICAgIC8vbm8gOCBiaXQgaGFkZCBpbiBJQTMyLCBuZWVkIHRvIGdvIHRvIDE2IGJpdCBhbmQgdGhlbiBwYWNrCisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBhMTYsIGIxNiwgcmVzOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMTZfZXZlbl9vZGRbMTZdID0geyAwLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1IH07CisgICAgYTE2ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvLyBTU0UgNC4xCisgICAgYjE2ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYikpOyAvLyBTU0UgNC4xCisgICAgcmVzID0gX21tX2hhZGRfZXBpMTYgKGExNiwgYjE2KTsKKyAgICByZXMgPSBfbW1fc2h1ZmZsZV9lcGk4IChyZXMsICooX19tMTI4aSopIG1hc2s4XzE2X2V2ZW5fb2RkKTsgLy9yZXR1cm4gdG8gOCBiaXQsIHVzZSBsb3cgNjQgYml0cworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDE2eDRfdCAgIHZwYWRkX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUEFERC5JMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90ICAgdnBhZGRfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBoYWRkMTI4OworICAgIGhhZGQxMjggPSBfbW1faGFkZF9lcGkxNiAoX3BNMTI4aShhKSwgX3BNMTI4aShiKSk7CisgICAgaGFkZDEyOCA9IF9tbV9zaHVmZmxlX2VwaTMyIChoYWRkMTI4LCAwIHwgKDIgPDwgMikgfCAoMSA8PCA0KSB8ICgzIDw8IDYpKTsKKyAgICByZXR1cm42NChoYWRkMTI4KTsKK30KKworCitpbnQzMngyX3QgICB2cGFkZF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlBBREQuSTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCAgIHZwYWRkX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgaGFkZDEyODsKKyAgICBoYWRkMTI4ID0gX21tX2hhZGRfZXBpMzIgKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpOworICAgIGhhZGQxMjggPSBfbW1fc2h1ZmZsZV9lcGkzMiAoaGFkZDEyOCwgMCB8ICgyIDw8IDIpIHwgKDEgPDwgNCkgfCAoMyA8PCA2KSk7CisgICAgcmV0dXJuNjQoaGFkZDEyOCk7Cit9CisKKwordWludDh4OF90IHZwYWRkX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZQQURELkk4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2cGFkZF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIC8vIFZQQURELkk4IGQwLGQwLGQwCit7CisgICAgLy8gIG5vIDggYml0IGhhZGQgaW4gSUEzMiwgbmVlZCB0byBnbyB0byAxNiBiaXQgYW5kIHRoZW4gcGFjaworICAgIHVpbnQ4eDhfdCByZXM2NDsKKy8vICBubyB1bnNpZ25lZCBfbW1faGFkZF8gZnVuY3Rpb25zIGluIElBMzIsIGJ1dCA4IHVuc2lnbmVkIGlzIGxlc3MgdGhlbiAxNiBzaWduZWQsIHNvIGl0IHNob3VsZCB3b3JrCisgICAgX19tMTI4aSBtYXNrOCwgYTE2LCBiMTYsIHJlczsKKyAgICBtYXNrOCA9IF9tbV9zZXQxX2VwaTE2KDB4ZmYpOworICAgIGExNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGEpKTsgLy8gU1NFIDQuMQorICAgIGIxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGIpKTsgLy8gU1NFIDQuMQorICAgIHJlcyA9IF9tbV9oYWRkX2VwaTE2IChhMTYsIGIxNik7CisgICAgcmVzID0gX21tX2FuZF9zaTEyOChyZXMsIG1hc2s4KTsgLy90byBhdm9pZCBzYXR1cmF0aW9uCisgICAgcmVzID0gX21tX3BhY2t1c19lcGkxNiAocmVzLHJlcyk7IC8vdXNlIGxvdyA2NCBiaXRzCisgICAgcmV0dXJuNjQocmVzKTsKK30KKwordWludDE2eDRfdCB2cGFkZF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWUEFERC5JMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2cGFkZF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIC8vIFZQQURELkkxNiBkMCxkMCxkMAoreworICAgIC8vIHNvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbCwgc2VyaWFsIGV4ZWN1dGlvbiBtYXkgYmUgZmFzdGVyCisgICAgLy8gbm8gdW5zaWduZWQgX21tX2hhZGRfIGZ1bmN0aW9ucyBpbiBJQTMyLCBuZWVkIHRvIG1vdmUgZnJvbSB1bnNpZ25lZCB0byBzaWduZWQKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgYzMyNzY3LCAgY2ZmZmUsIGFzLCBicywgcmVzOworICAgIGMzMjc2NyA9IF9tbV9zZXQxX2VwaTE2ICgzMjc2Nyk7CisgICAgY2ZmZmUgPSBfbW1fc2V0MV9lcGkxNiAoMHhmZmZlKTsKKyAgICBhcyA9IF9tbV9zdWJfZXBpMTYgKF9wTTEyOGkoYSksIGMzMjc2Nyk7CisgICAgYnMgPSBfbW1fc3ViX2VwaTE2IChfcE0xMjhpKGIpLCBjMzI3NjcpOworICAgIHJlcyA9IF9tbV9oYWRkX2VwaTE2IChhcywgYnMpOworICAgIHJlcyA9IF9tbV9hZGRfZXBpMTYgKHJlcywgY2ZmZmUpOworICAgIHJlcyA9IF9tbV9zaHVmZmxlX2VwaTMyIChyZXMsIDAgfCAoMiA8PCAyKSB8ICgxIDw8IDQpIHwgKDMgPDwgNikpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK3VpbnQzMngyX3QgdnBhZGRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlBBREQuSTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnBhZGRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSAvL3NlcmlhbCBtYXkgYmUgZmFzdGVyCit7CisgICAgLy9oYWRkIGRvZXNuJ3Qgd29yayBmb3IgdW5zaWduZWQgdmFsdWVzCisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIGFiLCBhYl9zaCwgcmVzOworICAgIGFiID0gX21tX3VucGFja2xvX2VwaTY0ICggX3BNMTI4aShhKSwgX3BNMTI4aShiKSk7IC8vYTAgYTEgYjAgYjEKKyAgICBhYl9zaCA9IF9tbV9zaHVmZmxlX2VwaTMyKGFiLCAxIHwgKDAgPDwgMikgfCAoMyA8PCA0KSB8ICgyIDw8IDYpKTsgLy9hMSwgYTAsIGIxLCBiMAorICAgIHJlcyA9IF9tbV9hZGRfZXBpMzIoYWIsIGFiX3NoKTsKKyAgICByZXMgPSBfbW1fc2h1ZmZsZV9lcGkzMihyZXMsIDAgfCAoMiA8PCAyKSB8ICgxIDw8IDQpIHwgKDMgPDwgNikpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2Zsb2F0MzJ4Ml90IHZwYWRkX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVlBBREQuRjMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZwYWRkX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKQoreworICAgIF9fbTEyOCBoYWRkMTI4OworICAgIF9fbTY0XzEyOCByZXM2NDsKKyAgICBoYWRkMTI4ID0gX21tX2hhZGRfcHMgKF9wTTEyOChhKSwgX3BNMTI4KGIpKTsKKyAgICBoYWRkMTI4ID0gX21tX3NodWZmbGVfcHMgKGhhZGQxMjgsIGhhZGQxMjgsIF9NTV9TSFVGRkxFKDMsMSwgMiwgMCkpOyAvL3VzZSBsb3cgNjQgYml0cworICAgIF9NNjRmKHJlczY0LCBoYWRkMTI4KTsKKyAgICByZXR1cm4gcmVzNjQ7Cit9CisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgTG9uZyBwYWlyd2lzZSBhZGQgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL0FkZHMgYWRqYWNlbnQgcGFpcnMgb2YgZWxlbWVudHMgb2YgYSB2ZWN0b3Isc2lnbiBvciB6ZXJvIGV4dGVuZHMgdGhlIHJlc3VsdHMgdG8gdHdpY2UgdGhlaXIgb3JpZ2luYWwgd2lkdGgsCisvLyBhbmQgcGxhY2VzIHRoZSBmaW5hbCByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuCisKK2ludDE2eDRfdCB2cGFkZGxfczgoaW50OHg4X3QgYSk7IC8vIFZQQURETC5TOCBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnBhZGRsX3M4KGludDh4OF90IGEpIC8vIFZQQURETC5TOCBkMCxkMAoreworICAgIC8vbm8gOCBiaXQgaGFkZCBpbiBJQTMyLCBuZWVkIHRvIGdvIHRvIDE2IGJpdCBhbnl3YXkKKyAgICBfX20xMjhpIGExNjsKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgYTE2ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvLyBTU0UgNC4xCisgICAgYTE2ID0gX21tX2hhZGRfZXBpMTYgKGExNiwgIGExNik7IC8vdXNlIGxvdyA2NCBiaXRzCisgICAgcmV0dXJuNjQoYTE2KTsKK30KKworaW50MzJ4Ml90IHZwYWRkbF9zMTYoaW50MTZ4NF90IGEpOyAvLyBWUEFEREwuUzE2IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cGFkZGxfczE2KGludDE2eDRfdCBhKSAvLyBWUEFEREwuUzE2IGQwLGQwCit7CisgICAgLy8gc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsLCBzZXJpYWwgZXhlY3V0aW9uIG1heSBiZSBmYXN0ZXIKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByMzJfMTsKKyAgICByMzJfMSA9IF9NTV9DVlRFUEkxNl9FUEkzMiAoX3BNMTI4aShhKSk7CisgICAgcjMyXzEgPSBfbW1faGFkZF9lcGkzMihyMzJfMSwgcjMyXzEpOyAvL3VzZSBsb3cgNjQgYml0cworICAgIHJldHVybjY0KHIzMl8xKTsKK30KKworaW50NjR4MV90IHZwYWRkbF9zMzIoaW50MzJ4Ml90IGEpOyAvLyBWUEFEREwuUzMyIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDFfdCB2cGFkZGxfczMyKGludDMyeDJfdCBhKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyCit7CisgICAgaW50NjR4MV90IHJlczsKKyAgICByZXMubTY0X2k2NFswXSA9IChpbnQ2NF90KWEubTY0X2kzMlswXSArIChpbnQ2NF90KWEubTY0X2kzMlsxXTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50MTZ4NF90IHZwYWRkbF91OCh1aW50OHg4X3QgYSk7IC8vIFZQQURETC5VOCBkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZwYWRkbF91OCh1aW50OHg4X3QgYSkgLy8gVlBBRERMLlU4IGQwLGQwCit7CisgICAgLy8gIG5vIDggYml0IGhhZGQgaW4gSUEzMiwgbmVlZCB0byBnbyB0byAxNiBiaXQKKy8vICBubyB1bnNpZ25lZCBfbW1faGFkZF8gZnVuY3Rpb25zIGluIElBMzIsIGJ1dCA4IHVuc2lnbmVkIGlzIGxlc3MgdGhlbiAxNiBzaWduZWQsIHNvIGl0IHNob3VsZCB3b3JrCisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIGExNjsKKyAgICBhMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vIFNTRSA0LjEgdXNlIGxvdyA2NCBiaXRzCisgICAgYTE2ID0gX21tX2hhZGRfZXBpMTYgKGExNiwgYTE2KTsgLy91c2UgbG93IDY0IGJpdHMKKyAgICByZXR1cm42NChhMTYpOworfQorCit1aW50MzJ4Ml90IHZwYWRkbF91MTYodWludDE2eDRfdCBhKTsgLy8gVlBBRERMLnMxNiBkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MzJ4Ml90IHZwYWRkbF91MTYodWludDE2eDRfdCBhKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyIHRoYW4gYSBTSU1EIG9uZQorICAgIHVpbnQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfdTMyWzBdID0gKHVpbnQzMl90KWEubTY0X3UxNlswXSArICh1aW50MzJfdClhLm02NF91MTZbMV07CisgICAgcmVzLm02NF91MzJbMV0gPSAodWludDMyX3QpYS5tNjRfdTE2WzJdICsgKHVpbnQzMl90KWEubTY0X3UxNlszXTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50NjR4MV90IHZwYWRkbF91MzIodWludDMyeDJfdCBhKTsgLy8gVlBBRERMLlUzMiBkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50NjR4MV90IHZwYWRkbF91MzIodWludDMyeDJfdCBhKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyCit7CisgICAgdWludDY0eDFfdCByZXM7CisgICAgcmVzLm02NF91NjRbMF0gPSAodWludDY0X3QpYS5tNjRfdTMyWzBdICsgKHVpbnQ2NF90KWEubTY0X3UzMlsxXTsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQxNng4X3QgdnBhZGRscV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZQQURETC5TOCBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnBhZGRscV9zOChpbnQ4eDE2X3QgYSkgLy8gVlBBRERMLlM4IHEwLHEwCit7CisgICAgLy9ubyA4IGJpdCBoYWRkIGluIElBMzIsIG5lZWQgdG8gZ28gdG8gMTYgYml0CisgICAgX19tMTI4aSByMTZfMSwgcjE2XzI7CisgICAgcjE2XzEgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoYSk7IC8vIFNTRSA0LjEKKyAgICAvL3N3YXAgaGkgYW5kIGxvdyBwYXJ0IG9mIHIgdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICByMTZfMiA9IF9tbV9zaHVmZmxlX2VwaTMyIChhLCBfU1dBUF9ISV9MT1czMik7CisgICAgcjE2XzIgPSBfTU1fQ1ZURVBJOF9FUEkxNiAocjE2XzIpOworICAgIHJldHVybiBfbW1faGFkZF9lcGkxNiAocjE2XzEsIHIxNl8yKTsKK30KKworaW50MzJ4NF90IHZwYWRkbHFfczE2KGludDE2eDhfdCBhKTsgLy8gVlBBRERMLlMxNiBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnBhZGRscV9zMTYoaW50MTZ4OF90IGEpIC8vIFZQQURETC5TMTYgcTAscTAKK3sKKyAgICAvL25vIDggYml0IGhhZGQgaW4gSUEzMiwgbmVlZCB0byBnbyB0byAxNiBiaXQKKyAgICBfX20xMjhpIHIzMl8xLCByMzJfMjsKKyAgICByMzJfMSA9IF9NTV9DVlRFUEkxNl9FUEkzMihhKTsKKyAgICAvL3N3YXAgaGkgYW5kIGxvdyBwYXJ0IG9mIHIgdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICByMzJfMiA9IF9tbV9zaHVmZmxlX2VwaTMyIChhLCBfU1dBUF9ISV9MT1czMik7CisgICAgcjMyXzIgPSBfTU1fQ1ZURVBJMTZfRVBJMzIgKHIzMl8yKTsKKyAgICByZXR1cm4gX21tX2hhZGRfZXBpMzIgKHIzMl8xLCByMzJfMik7Cit9CisKK2ludDY0eDJfdCB2cGFkZGxxX3MzMihpbnQzMng0X3QgYSk7IC8vIFZQQURETC5TMzIgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4Ml90IHZwYWRkbHFfczMyKGludDMyeDRfdCBhKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkgLy8gVlBBRERMLlMzMiBxMCxxMAoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQzMl90IGF0bXBbNF07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDY0X3QgcmVzWzJdOworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYXRtcCwgYSk7CisgICAgcmVzWzBdID0gKGludDY0X3QpYXRtcFswXSArIChpbnQ2NF90KWF0bXBbMV07CisgICAgcmVzWzFdID0gKGludDY0X3QpYXRtcFsyXSArIChpbnQ2NF90KWF0bXBbM107CisgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworfQorCit1aW50MTZ4OF90IHZwYWRkbHFfdTgodWludDh4MTZfdCBhKTsgLy8gVlBBRERMLlU4IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdnBhZGRscV91OCh1aW50OHgxNl90IGEpIC8vIFZQQURETC5VOCBxMCxxMAoreworICAgIC8vbm8gOCBiaXQgaGFkZCBpbiBJQTMyLCBuZWVkIHRvIGdvIHRvIDE2IGJpdAorICAgIF9fbTEyOGkgcjE2XzEsIHIxNl8yOworICAgIHIxNl8xID0gX01NX0NWVEVQVThfRVBJMTYoYSk7CisgICAgLy9zd2FwIGhpIGFuZCBsb3cgcGFydCBvZiByIHRvIHByb2Nlc3MgdGhlIHJlbWFpbmluZyBkYXRhCisgICAgcjE2XzIgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgX1NXQVBfSElfTE9XMzIpOworICAgIHIxNl8yID0gX01NX0NWVEVQVThfRVBJMTYgKHIxNl8yKTsKKyAgICByZXR1cm4gX21tX2hhZGRfZXBpMTYgKHIxNl8xLCByMTZfMik7Cit9CisKK3VpbnQzMng0X3QgdnBhZGRscV91MTYodWludDE2eDhfdCBhKTsgLy8gVlBBRERMLnMxNiBxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MzJ4NF90IHZwYWRkbHFfdTE2KHVpbnQxNng4X3QgYSksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vc2VyaWFsIHNvbHV0aW9uIGxvb2tzIGZhc3RlciB0aGFuIGEgU0lNRCBvbmUKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDE2X3QgYXRtcFs4XTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDMyX3QgcmVzWzRdOworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYXRtcCwgYSk7CisgICAgcmVzWzBdID0gKHVpbnQzMl90KWF0bXBbMF0gKyAodWludDMyX3QpYXRtcFsxXTsKKyAgICByZXNbMV0gPSAodWludDMyX3QpYXRtcFsyXSArICh1aW50MzJfdClhdG1wWzNdOworICAgIHJlc1syXSA9ICh1aW50MzJfdClhdG1wWzRdICsgKHVpbnQzMl90KWF0bXBbNV07CisgICAgcmVzWzNdID0gKHVpbnQzMl90KWF0bXBbNl0gKyAodWludDMyX3QpYXRtcFs3XTsKKyAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7Cit9CisKK3VpbnQ2NHgyX3QgdnBhZGRscV91MzIodWludDMyeDRfdCBhKTsgLy8gVlBBRERMLlUzMiBxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50NjR4Ml90IHZwYWRkbHFfdTMyKHVpbnQzMng0X3QgYSksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQzMl90IGF0bXBbNF07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ2NF90IHJlc1syXTsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgIHJlc1swXSA9ICh1aW50NjRfdClhdG1wWzBdICsgKHVpbnQ2NF90KWF0bXBbMV07CisgICAgcmVzWzFdID0gKHVpbnQ2NF90KWF0bXBbMl0gKyAodWludDY0X3QpYXRtcFszXTsKKyAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqICBMb25nIHBhaXJ3aXNlIGFkZCBhbmQgYWNjdW11bGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL1ZQQURBTCAoVmVjdG9yIFBhaXJ3aXNlIEFkZCBhbmQgQWNjdW11bGF0ZSBMb25nKSBhZGRzIGFkamFjZW50IHBhaXJzIG9mIGVsZW1lbnRzIG9mIGEgdmVjdG9yLAorLy8gYW5kIGFjY3VtdWxhdGVzIHRoZSAgdmFsdWVzIG9mIHRoZSByZXN1bHRzIGludG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBkZXN0aW5hdGlvbiAod2lkZSkgdmVjdG9yCitpbnQxNng0X3QgdnBhZGFsX3M4KGludDE2eDRfdCBhLCAgaW50OHg4X3QgYik7IC8vIFZQQURBTC5TOCBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnBhZGFsX3M4KGludDE2eDRfdCBhLCAgaW50OHg4X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnBhZGFscV9zOChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKK2ludDMyeDJfdCB2cGFkYWxfczE2KGludDMyeDJfdCBhLCAgaW50MTZ4NF90IGIpOyAvLyBWUEFEQUwuUzE2IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cGFkYWxfczE2KGludDMyeDJfdCBhLCAgaW50MTZ4NF90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZwYWRhbHFfczE2KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCitpbnQ2NHgxX3QgdnBhZGFsX3MzMihpbnQ2NHgxX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUEFEQUwuUzMyIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDFfdCB2cGFkYWxfczMyKGludDY0eDFfdCBhLCBpbnQzMngyX3QgYikKK3sKKyAgICBpbnQ2NHgxX3QgcmVzOworICAgIHJlcy5tNjRfaTY0WzBdID0gKGludDY0X3QpYi5tNjRfaTMyWzBdICsgKGludDY0X3QpYi5tNjRfaTMyWzFdICsgYS5tNjRfaTY0WzBdOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQxNng0X3QgdnBhZGFsX3U4KHVpbnQxNng0X3QgYSwgIHVpbnQ4eDhfdCBiKTsgLy8gVlBBREFMLlU4IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnBhZGFsX3U4KHVpbnQxNng0X3QgYSwgIHVpbnQ4eDhfdCBiKQoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnBhZGFscV91OChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCB2cGFkYWxfdTE2KHVpbnQzMngyX3QgYSwgIHVpbnQxNng0X3QgYik7IC8vIFZQQURBTC5zMTYgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2cGFkYWxfdTE2KHVpbnQzMngyX3QgYSwgIHVpbnQxNng0X3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZwYWRhbHFfdTE2KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKwordWludDY0eDFfdCB2cGFkYWxfdTMyKHVpbnQ2NHgxX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlBBREFMLlUzMiBkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50NjR4MV90IHZwYWRhbF91MzIodWludDY0eDFfdCBhLCB1aW50MzJ4Ml90IGIpCit7CisgICAgdWludDY0eDFfdCByZXM7CisgICAgcmVzLm02NF91NjRbMF0gPSAodWludDY0X3QpYi5tNjRfdTMyWzBdICsgKHVpbnQ2NF90KWIubTY0X3UzMlsxXSArIGEubTY0X3U2NFswXTsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQxNng4X3QgdnBhZGFscV9zOChpbnQxNng4X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWUEFEQUwuUzggcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZwYWRhbHFfczgoaW50MTZ4OF90IGEsIGludDh4MTZfdCBiKSAvLyBWUEFEQUwuUzggcTAscTAKK3sKKyAgICBpbnQxNng4X3QgcGFkOworICAgIHBhZCA9IHZwYWRkbHFfczgoYik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYgKGEsIHBhZCk7Cit9CisKK2ludDMyeDRfdCB2cGFkYWxxX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUEFEQUwuUzE2IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2cGFkYWxxX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZQQURBTC5TMTYgcTAscTAKK3sKKyAgICBpbnQzMng0X3QgcGFkOworICAgIHBhZCA9IHZwYWRkbHFfczE2KGIpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTMyKGEsIHBhZCk7Cit9CisKK2ludDY0eDJfdCB2cGFkYWxxX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUEFEQUwuUzMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2cGFkYWxxX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIpCit7CisgICAgaW50NjR4Ml90IHBhZDsKKyAgICBwYWQgPSB2cGFkZGxxX3MzMihiKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGk2NCAoYSwgcGFkKTsKK30KKwordWludDE2eDhfdCB2cGFkYWxxX3U4KHVpbnQxNng4X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVlBBREFMLlU4IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdnBhZGFscV91OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDE2X3QgYikgLy8gVlBBREFMLlU4IHEwLHEwCit7CisgICAgdWludDE2eDhfdCBwYWQ7CisgICAgcGFkID0gdnBhZGRscV91OChiKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkxNiAoYSwgcGFkKTsKK30KKwordWludDMyeDRfdCB2cGFkYWxxX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZQQURBTC5zMTYgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDRfdCB2cGFkYWxxX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng4X3QgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgdWludDMyeDRfdCBwYWQ7CisgICAgcGFkID0gdnBhZGRscV91MTYoYik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMzIoYSwgcGFkKTsKK30gLy9ubyBvcHRpbWFsIFNJTUQgc29sdXRpb24sIHNlcmlhbCBpcyBmYXN0ZXIKKwordWludDY0eDJfdCB2cGFkYWxxX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZQQURBTC5VMzIgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDJfdCB2cGFkYWxxX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMng0X3QgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgLy9ubyBvcHRpbWFsIFNJTUQgc29sdXRpb24sIHNlcmlhbCBpcyBmYXN0ZXIKKyAgICB1aW50NjR4Ml90IHBhZDsKKyAgICBwYWQgPSB2cGFkZGxxX3UzMihiKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGk2NChhLCBwYWQpOworfSAvL25vIG9wdGltYWwgU0lNRCBzb2x1dGlvbiwgc2VyaWFsIGlzIGZhc3RlcgorCisvLyoqKioqKioqKiogIEZvbGRpbmcgbWF4aW11bSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9WUE1BWCAoVmVjdG9yIFBhaXJ3aXNlIE1heGltdW0pIGNvbXBhcmVzIGFkamFjZW50IHBhaXJzIG9mIGVsZW1lbnRzIGluIHR3byB2ZWN0b3JzLAorLy9hbmQgY29waWVzIHRoZSBsYXJnZXIgb2YgZWFjaCBwYWlyIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpbiB0aGUgZGVzdGluYXRpb24KKy8vICAgIG5vIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25hbGl0eSBpbiBJQTMyIFNJTUQsIHNvIHdlIG5lZWQgdG8gZG8gdGhlIHZlcnRpY2FsIGNvbXBhcmlzb24KK2ludDh4OF90IHZwbWF4X3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUE1BWC5TOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2cG1heF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSAvLyBWUE1BWC5TOCBkMCxkMCxkMAoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYWIsIGFiMSwgbWF4OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2s4X3NhYlsxNl0gPSB7IDEsIDAsIDMsIDIsIDUsIDQsIDcsIDYsIDksIDgsIDExLCAxMCwgMTMsIDEyLCAxNSwgMTR9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2s4X29kZFsxNl0gPSB7IDEsIDMsICA1LCAgNywgOSwgMTEsIDEzLCAxNSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisgICAgYWIgPSBfbW1fdW5wYWNrbG9fZXBpNjQgKCBfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKTsgLy9hYgorICAgIGFiMSA9IF9tbV9zaHVmZmxlX2VwaTggKGFiLCAqKF9fbTEyOGkqKSBtYXNrOF9zYWIpOyAvL2hvcmlzb250YWwgcGFpcnMgc3dhcCBmb3IgdmVydGljYWwgbWF4IGZpbmRpbmcKKyAgICBtYXggPSBfTU1fTUFYX0VQSTggKGFiLCBhYjEpOyAvLyBTU0U0LjEKKyAgICBtYXggPSBfbW1fc2h1ZmZsZV9lcGk4IChtYXgsICooX19tMTI4aSopIG1hc2s4X29kZCk7IC8vcmVtb3ZlIHJlcGV0aXRpdmUgZGF0YQorICAgIHJldHVybjY0KG1heCk7IC8vd2UgbmVlZCA2NCBiaXRzIG9ubHkKK30KKworaW50MTZ4NF90IHZwbWF4X3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUE1BWC5TMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZwbWF4X3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIC8vIFZQTUFYLlMxNiBkMCxkMCxkMAoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggdGhlIHNlcmlhbCBvbmUKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBhYiwgYWIxLCBtYXg7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMTZfc2FiWzE2XSA9IHsgMiwgMywgMCwgMSwgNiwgNywgNCwgNSwgMTAsIDExLCA4LCA5LCAxNCwgMTUsIDEyLCAxM307IC8vZWFjaCBjaGFycyBwYWlyIGlzIGNvbnNpZGVyZCB0byBiZSAxNiBiaXQgbnVtYmVyCisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMTZfb2RkWzE2XSA9IHsgMCwxLCA0LDUsIDgsOSwgMTIsMTMsICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKyAgICBhYiA9IF9tbV91bnBhY2tsb19lcGk2NCAoIF9wTTEyOGkoYSksICBfcE0xMjhpKGIpKTsgLy9hYgorICAgIGFiMSA9IF9tbV9zaHVmZmxlX2VwaTggKGFiLCAqKF9fbTEyOGkqKSBtYXNrMTZfc2FiKTsgLy9ob3Jpc29udGFsIHBhaXJzIHN3YXAgZm9yIHZlcnRpY2FsIG1heCBmaW5kaW5nLCB1c2UgOGJpdCBmbiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWFzaworICAgIG1heCA9IF9tbV9tYXhfZXBpMTYgKGFiLCBhYjEpOworICAgIG1heCA9ICBfbW1fc2h1ZmZsZV9lcGk4IChtYXgsICooX19tMTI4aSopIG1hc2sxNl9vZGQpOyAvL3JlbW92ZSByZXBldGl0aXZlIGRhdGEsIHVzZSA4Yml0IGZuIGFuZCB0aGUgY29ycmVzcG9uZGluZyBtYXNrCisgICAgcmV0dXJuNjQobWF4KTsKK30KKworaW50MzJ4Ml90IHZwbWF4X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUE1BWC5TMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4Ml90IHZwbWF4X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvL3NlcmlhbCBzb2x1dGlvbiBsb29rcyBmYXN0ZXIgdGhhbiBTSU1EIG9uZQorICAgIGludDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9pMzJbMF0gPSAoYS5tNjRfaTMyWzBdIDwgYS5tNjRfaTMyWzFdKSA/IGEubTY0X2kzMlsxXSA6IGEubTY0X2kzMlswXTsKKyAgICByZXMubTY0X2kzMlsxXSA9IChiLm02NF9pMzJbMF0gPCBiLm02NF9pMzJbMV0pID8gYi5tNjRfaTMyWzFdIDogYi5tNjRfaTMyWzBdOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2cG1heF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWUE1BWC5VOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnBtYXhfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKSAvLyBWUE1BWC5VOCBkMCxkMCxkMAoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIGFiLCBhYjEsIG1heDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4X3NhYlsxNl0gPSB7IDEsIDAsIDMsIDIsIDUsIDQsIDcsIDYsIDksIDgsIDExLCAxMCwgMTMsIDEyLCAxNSwgMTR9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2s4X29kZFsxNl0gPSB7IDEsIDMsICA1LCAgNywgOSwgMTEsIDEzLCAxNSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisgICAgYWIgPSBfbW1fdW5wYWNrbG9fZXBpNjQgKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpOyAvL2FiCisgICAgYWIxID0gX21tX3NodWZmbGVfZXBpOCAoYWIsICooX19tMTI4aSopIG1hc2s4X3NhYik7IC8vaG9yaXNvbnRhbCBwYWlycyBzd2FwIGZvciB2ZXJ0aWNhbCBtYXggZmluZGluZworICAgIG1heCA9IF9tbV9tYXhfZXB1OCAoYWIsIGFiMSk7IC8vIFNTRTQuMQorICAgIG1heCA9IF9tbV9zaHVmZmxlX2VwaTggKG1heCwgKihfX20xMjhpKikgbWFzazhfb2RkKTsgLy9yZW1vdmUgcmVwZXRpdGl2ZSBkYXRhCisgICAgcmV0dXJuNjQobWF4KTsKK30KKwordWludDE2eDRfdCB2cG1heF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWUE1BWC5zMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2cG1heF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIC8vIFZQTUFYLnMxNiBkMCxkMCxkMAoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggdGhlIHNlcmlhbCBvbmUKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgYWIsIGFiMSwgbWF4OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2sxNl9zYWJbMTZdID0geyAyLCAzLCAwLCAxLCA2LCA3LCA0LCA1LCAxMCwgMTEsIDgsIDksIDE0LCAxNSwgMTIsIDEzfTsgLy9lYWNoIGNoYXJzIHBhaXIgaXMgY29uc2lkZXJkIHRvIGJlIDE2IGJpdCBudW1iZXIKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrMTZfb2RkWzE2XSA9IHsgMCwxLCA0LDUsIDgsOSwgMTIsMTMsICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKyAgICBhYiA9IF9tbV91bnBhY2tsb19lcGk2NCAoIF9wTTEyOGkoYSksIF9wTTEyOGkoYikpOyAvL2FiCisgICAgYWIxID0gX21tX3NodWZmbGVfZXBpOCAoYWIsICooX19tMTI4aSopIG1hc2sxNl9zYWIpOyAvL2hvcmlzb250YWwgcGFpcnMgc3dhcCBmb3IgdmVydGljYWwgbWF4IGZpbmRpbmcsIHVzZSA4Yml0IGZuIGFuZCB0aGUgY29ycmVzcG9uZGluZyBtYXNrCisgICAgbWF4ID0gX01NX01BWF9FUFUxNiAoYWIsIGFiMSk7CisgICAgbWF4ID0gX21tX3NodWZmbGVfZXBpOCAobWF4LCAqKF9fbTEyOGkqKSBtYXNrMTZfb2RkKTsgLy9yZW1vdmUgcmVwZXRpdGl2ZSBkYXRhLCB1c2UgOGJpdCBmbiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWFzaworICAgIHJldHVybjY0KG1heCk7Cit9CisKK3VpbnQzMngyX3QgdnBtYXhfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlBNQVguVTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQzMngyX3QgdnBtYXhfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyIHRoYW4gU0lNRCBvbmUKKyAgICB1aW50MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X2kzMlswXSA9IChhLm02NF9pMzJbMF0gPCBhLm02NF9pMzJbMV0pID8gYS5tNjRfaTMyWzFdIDogYS5tNjRfaTMyWzBdOworICAgIHJlcy5tNjRfaTMyWzFdID0gKGIubTY0X2kzMlswXSA8IGIubTY0X2kzMlsxXSkgPyBiLm02NF9pMzJbMV0gOiBiLm02NF9pMzJbMF07CisgICAgcmV0dXJuIHJlczsKK30gLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyIHRoYW4gYSBTSU1EIG9uZQorCitmbG9hdDMyeDJfdCB2cG1heF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZQTUFYLkYzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhmbG9hdDMyeDJfdCB2cG1heF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyIHRoYW4gIFNJTUQgb25lCisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfZjMyWzBdID0gKGEubTY0X2YzMlswXSA8IGEubTY0X2YzMlsxXSkgPyBhLm02NF9mMzJbMV0gOiBhLm02NF9mMzJbMF07CisgICAgcmVzLm02NF9mMzJbMV0gPSAoYi5tNjRfZjMyWzBdIDwgYi5tNjRfZjMyWzFdKSA/IGIubTY0X2YzMlsxXSA6IGIubTY0X2YzMlswXTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyAqKioqKioqKioqKioqKioqKiBGb2xkaW5nIG1pbmltdW0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL3ZwbWluIC0+IHRha2VzIG1pbmltdW0gb2YgYWRqYWNlbnQgcGFpcnMKK2ludDh4OF90IHZwbWluX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUE1JTi5TOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2cG1pbl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSAvLyBWUE1JTi5TOCBkMCxkMCxkMAoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYWIsIGFiMSwgbWluOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2s4X3NhYlsxNl0gPSB7IDEsIDAsIDMsIDIsIDUsIDQsIDcsIDYsIDksIDgsIDExLCAxMCwgMTMsIDEyLCAxNSwgMTR9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2s4X29kZFsxNl0gPSB7IDEsIDMsICA1LCAgNywgOSwgMTEsIDEzLCAxNSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisgICAgYWIgPSBfbW1fdW5wYWNrbG9fZXBpNjQgKCBfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKTsgLy9hYgorICAgIGFiMSA9IF9tbV9zaHVmZmxlX2VwaTggKGFiLCAqKF9fbTEyOGkqKSBtYXNrOF9zYWIpOyAvL2hvcmlzb250YWwgcGFpcnMgc3dhcCBmb3IgdmVydGljYWwgbWluIGZpbmRpbmcKKyAgICBtaW4gPSAgX01NX01JTl9FUEk4IChhYiwgYWIxKTsgLy8gU1NFNC4xCisgICAgbWluID0gIF9tbV9zaHVmZmxlX2VwaTggKG1pbiwgKihfX20xMjhpKikgbWFzazhfb2RkKTsgLy9yZW1vdmUgcmVwZXRpdGl2ZSBkYXRhCisgICAgcmV0dXJuNjQobWluKTsKK30KKworaW50MTZ4NF90IHZwbWluX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUE1JTi5TMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZwbWluX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIC8vIFZQTUlOLlMxNiBkMCxkMCxkMAoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggdGhlIHNlcmlhbCBvbmUKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBhYiwgYWIxLCBtaW47CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMTZfc2FiWzE2XSA9IHsgMiwgMywgMCwgMSwgNiwgNywgNCwgNSwgMTAsIDExLCA4LCA5LCAxNCwgMTUsIDEyLCAxM307IC8vZWFjaCBjaGFycyBwYWlyIGlzIGNvbnNpZGVyZCB0byBiZSAxNiBiaXQgbnVtYmVyCisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMTZfb2RkWzE2XSA9IHsgMCwxLCA0LDUsIDgsOSwgMTIsMTMsICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKyAgICBhYiA9IF9tbV91bnBhY2tsb19lcGk2NCAoICBfcE0xMjhpKGEpLCAgX3BNMTI4aShiKSk7IC8vYWIKKyAgICBhYjEgPSBfbW1fc2h1ZmZsZV9lcGk4IChhYiwgKihfX20xMjhpKikgbWFzazE2X3NhYik7IC8vaG9yaXNvbnRhbCBwYWlycyBzd2FwIGZvciB2ZXJ0aWNhbCBtYXggZmluZGluZywgdXNlIDhiaXQgZm4gYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1hc2sKKyAgICBtaW4gPSBfbW1fbWluX2VwaTE2IChhYiwgYWIxKTsKKyAgICBtaW4gPSBfbW1fc2h1ZmZsZV9lcGk4IChtaW4sICooX19tMTI4aSopIG1hc2sxNl9vZGQpOyAvL3JlbW92ZSByZXBldGl0aXZlIGRhdGEsIHVzZSA4Yml0IGZuIGFuZCB0aGUgY29ycmVzcG9uZGluZyBtYXNrCisgICAgcmV0dXJuNjQobWluKTsKK30KKworaW50MzJ4Ml90IHZwbWluX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUE1JTi5TMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4Ml90IHZwbWluX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvL3NlcmlhbCBzb2x1dGlvbiBsb29rcyBmYXN0ZXIgdGhhbiBTSU1EIG9uZQorICAgIGludDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9pMzJbMF0gPSAoYS5tNjRfaTMyWzBdID4gYS5tNjRfaTMyWzFdKSA/IGEubTY0X2kzMlsxXSA6IGEubTY0X2kzMlswXTsKKyAgICByZXMubTY0X2kzMlsxXSA9IChiLm02NF9pMzJbMF0gPiBiLm02NF9pMzJbMV0pID8gYi5tNjRfaTMyWzFdIDogYi5tNjRfaTMyWzBdOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2cG1pbl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWUE1JTi5VOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnBtaW5fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKSAvLyBWUE1JTi5VOCBkMCxkMCxkMAoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIGFiLCBhYjEsIG1pbjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrOF9zYWJbMTZdID0geyAxLCAwLCAzLCAyLCA1LCA0LCA3LCA2LCA5LCA4LCAxMSwgMTAsIDEzLCAxMiwgMTUsIDE0fTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrOF9vZGRbMTZdID0geyAxLCAzLCAgNSwgIDcsIDksIDExLCAxMywgMTUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworICAgIGFiID0gX21tX3VucGFja2xvX2VwaTY0ICggIF9wTTEyOGkoYSksICBfcE0xMjhpKGIpKTsgLy9hYgorICAgIGFiMSA9IF9tbV9zaHVmZmxlX2VwaTggKGFiLCAqKF9fbTEyOGkqKSBtYXNrOF9zYWIpOyAvL2hvcmlzb250YWwgcGFpcnMgc3dhcCBmb3IgdmVydGljYWwgbWF4IGZpbmRpbmcKKyAgICBtaW4gPSBfbW1fbWluX2VwdTggKGFiLCBhYjEpOyAvLyBTU0U0LjEKKyAgICBtaW4gPSBfbW1fc2h1ZmZsZV9lcGk4IChtaW4sICooX19tMTI4aSopIG1hc2s4X29kZCk7IC8vcmVtb3ZlIHJlcGV0aXRpdmUgZGF0YQorICAgIHJldHVybjY0KG1pbik7Cit9CisKK3VpbnQxNng0X3QgdnBtaW5fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlBNSU4uczE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnBtaW5fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKSAvLyBWUE1JTi5zMTYgZDAsZDAsZDAKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHRoZSBzZXJpYWwgb25lCisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIGFiLCBhYjEsIG1pbjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrMTZfc2FiWzE2XSA9IHsgMiwgMywgMCwgMSwgNiwgNywgNCwgNSwgMTAsIDExLCA4LCA5LCAxNCwgMTUsIDEyLCAxM307IC8vZWFjaCBjaGFycyBwYWlyIGlzIGNvbnNpZGVyZCB0byBiZSAxNiBiaXQgbnVtYmVyCisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFzazE2X29kZFsxNl0gPSB7IDAsMSwgNCw1LCA4LDksIDEyLDEzLCAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisgICAgYWIgPSBfbW1fdW5wYWNrbG9fZXBpNjQgKCBfcE0xMjhpKGEpLCAgX3BNMTI4aShiKSk7IC8vYWIKKyAgICBhYjEgPSBfbW1fc2h1ZmZsZV9lcGk4IChhYiwgKihfX20xMjhpKikgbWFzazE2X3NhYik7IC8vaG9yaXNvbnRhbCBwYWlycyBzd2FwIGZvciB2ZXJ0aWNhbCBtaW4gZmluZGluZywgdXNlIDhiaXQgZm4gYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1hc2sKKyAgICBtaW4gPSBfTU1fTUlOX0VQVTE2IChhYiwgYWIxKTsKKyAgICBtaW4gPSAgICBfbW1fc2h1ZmZsZV9lcGk4IChtaW4sICooX19tMTI4aSopIG1hc2sxNl9vZGQpOyAvL3JlbW92ZSByZXBldGl0aXZlIGRhdGEsIHVzZSA4Yml0IGZuIGFuZCB0aGUgY29ycmVzcG9uZGluZyBtYXNrCisgICAgcmV0dXJuNjQobWluKTsKK30KKwordWludDMyeDJfdCB2cG1pbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWUE1JTi5VMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDJfdCB2cG1pbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvL3NlcmlhbCBzb2x1dGlvbiBsb29rcyBmYXN0ZXIgdGhhbiBTSU1EIG9uZQorICAgIHVpbnQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfdTMyWzBdID0gKGEubTY0X3UzMlswXSA+IGEubTY0X3UzMlsxXSkgPyBhLm02NF91MzJbMV0gOiBhLm02NF91MzJbMF07CisgICAgcmVzLm02NF91MzJbMV0gPSAoYi5tNjRfdTMyWzBdID4gYi5tNjRfdTMyWzFdKSA/IGIubTY0X3UzMlsxXSA6IGIubTY0X3UzMlswXTsKKyAgICByZXR1cm4gcmVzOworfQorCitmbG9hdDMyeDJfdCB2cG1pbl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZQTUlOLkYzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhmbG9hdDMyeDJfdCB2cG1pbl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyIHRoYW4gU0lNRCBvbmUKKyAgICBmbG9hdDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9mMzJbMF0gPSAoYS5tNjRfZjMyWzBdID4gYS5tNjRfZjMyWzFdKSA/IGEubTY0X2YzMlsxXSA6IGEubTY0X2YzMlswXTsKKyAgICByZXMubTY0X2YzMlsxXSA9IChiLm02NF9mMzJbMF0gPiBiLm02NF9mMzJbMV0pID8gYi5tNjRfZjMyWzFdIDogYi5tNjRfZjMyWzBdOworICAgIHJldHVybiByZXM7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqICBSZWNpcHJvY2FsL1NxcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKiogUmVjaXByb2NhbCBlc3RpbWF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL3RoZSBBUk0gTkVPTiBhbmQgeDg2IFNJTUQgcmVzdWx0cyBtYXkgYmUgc2xpZ2h0bHkgZGlmZmVyZW50CitmbG9hdDMyeDJfdCB2cmVjcGVfZjMyKGZsb2F0MzJ4Ml90IGEpOyAvLyBWUkVDUEUuRjMyIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZyZWNwZV9mMzIoZmxvYXQzMngyX3QgYSkgLy91c2UgbG93IDY0IGJpdHMKK3sKKyAgICBmbG9hdDMyeDRfdCByZXM7CisgICAgX19tNjRfMTI4IHJlczY0OworICAgIHJlcyA9IF9tbV9yY3BfcHMoX3BNMTI4KGEpKTsKKyAgICBfTTY0ZihyZXM2NCwgcmVzKTsKKyAgICByZXR1cm4gcmVzNjQ7Cit9CisKK3VpbnQzMngyX3QgdnJlY3BlX3UzMih1aW50MzJ4Ml90IGEpOyAvLyBWUkVDUEUuVTMyIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQzMngyX3QgdnJlY3BlX3UzMih1aW50MzJ4Ml90IGEpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vSW5wdXQgaXMgIGZpeGVkIHBvaW50IG51bWJlciEhISBObyByZWNpcHJvY2FsIGZvciBpbnRzIGluIElBMzIgYXZhaWxhYmxlCisgICAgdWludDMyeDJfdCByZXM7CisgICAgZmxvYXQgcmVzZiwgcjsKKyAgICBpbnQgaSwgcSwgczsKKyAgICBmb3IgKGkgPTA7IGk8MjsgaSsrKXsKKyAgICAgICAgaWYoKGEubTY0X3UzMltpXSAmIDB4ODAwMDAwMDApID09IDApIHsKKyAgICAgICAgICAgIHJlcy5tNjRfdTMyW2ldID0gMHhmZmZmZmZmZjsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICByZXNmID0gIChmbG9hdCkgKGEubTY0X3UzMltpXSAqICgwLjVmIC8gKHVpbnQzMl90KSgxIDw8IDMxKSkpOworICAgICAgICAgICAgcSA9IChpbnQpKHJlc2YgKiA1MTIuMCk7IC8qIGEgaW4gdW5pdHMgb2YgMS81MTIgcm91bmRlZCBkb3duICovCisgICAgICAgICAgICByID0gMS4wIC8gKCgoZmxvYXQpcSArIDAuNSkgLyA1MTIuMCk7IC8qIHJlY2lwcm9jYWwgciAqLworICAgICAgICAgICAgcyA9IChpbnQpKDI1Ni4wICogciArIDAuNSk7IC8qIHIgaW4gdW5pdHMgb2YgMS8yNTYgcm91bmRlZCB0byBuZWFyZXN0ICovCisgICAgICAgICAgICByID0gIChmbG9hdClzIC8gMjU2LjA7CisgICAgICAgICAgICByZXMubTY0X3UzMltpXSA9IHIgKiAodWludDMyX3QpKDEgPDwgMzEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2Zsb2F0MzJ4NF90IHZyZWNwZXFfZjMyKGZsb2F0MzJ4NF90IGEpOyAvLyBWUkVDUEUuRjMyIHEwLHEwCisjZGVmaW5lIHZyZWNwZXFfZjMyIF9tbV9yY3BfcHMKKworCit1aW50MzJ4NF90IHZyZWNwZXFfdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZSRUNQRS5VMzIgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDRfdCB2cmVjcGVxX3UzMih1aW50MzJ4NF90IGEpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vSW5wdXQgaXMgIGZpeGVkIHBvaW50IG51bWJlciEhIQorICAgIC8vV2UgaW1wbGVtZW50IHRoZSByZWNpcF9lc3RpbWF0ZSBmdW5jdGlvbiBhcyBkZXNjcmliZWQgaW4gQVJNdjcgcmVmZXJlbmNlIG1hbnVhbCAoVlJFQ1BFIGluc3RydWN0aW9uKSBidXQgdXNlIGZsb2F0IGluc3RlYWQgb2YgZG91YmxlCisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQzMl90IGF0bXBbNF07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQzMl90IHJlc1s0XTsKKyAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQgYzgwMDAwMDAwWzRdID0gezB4ODAwMDAwMDAsMHg4MDAwMDAwMCwgMHg4MDAwMDAwMCwweDgwMDAwMDAwfTsKKyAgICBmbG9hdCByZXNmLCByOworICAgIGludCBpLCBxLCBzOworICBfX20xMjhpIHJlczEyOCwgbWFzaywgemVybzsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIGZvciAoaSA9MDsgaTw0OyBpKyspeworICAgICAgICByZXNmID0gKGF0bXBbaV0gKiAoMC41ZiAvICh1aW50MzJfdCkgKDEgPDwgMzEpKSk7ICAvLyAgMi4zMjgzMDY0MzY1Mzg2OTYzRS0xMCB+KDAuNWYgLyAodWludDMyX3QpICgxIDw8IDMxKSkKKyAgICAgICAgcSA9IChpbnQpKHJlc2YgKiA1MTIuMCk7IC8qIGEgaW4gdW5pdHMgb2YgMS81MTIgcm91bmRlZCBkb3duICovCisgICAgICAgIHIgPSAxLjAgLyAoKChmbG9hdClxICsgMC41KSAvIDUxMi4wKTsgLyogcmVjaXByb2NhbCByICovCisgICAgICAgIHMgPSAoaW50KSgyNTYuMCAqIHIgKyAwLjUpOyAvKiByIGluIHVuaXRzIG9mIDEvMjU2IHJvdW5kZWQgdG8gbmVhcmVzdCAqLworICAgICAgICByID0gIChmbG9hdClzIC8gMjU2LjA7CisgICAgICAgIHJlc1tpXSA9ICh1aW50MzJfdCkgKHIgKiAoKCh1aW50MzJfdCkxKSA8PCAzMSkgKTsKKyAgICB9CisgICAgcmVzMTI4ID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7CisgICAgbWFzayA9IF9tbV9hbmRfc2kxMjgoYSwgKihfX20xMjhpKiljODAwMDAwMDApOworICAgIG1hc2sgPSBfbW1fY21wZXFfZXBpMzIoemVybywgbWFzayk7ICAvLzB4ZmZmZmZmZmYgaWYgYXRtcFtpXSA8PSAweDdmZmZmZmZmCisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChyZXMxMjgsIG1hc2spOworfQorCisvLyoqKioqKioqKipSZWNpcHJvY2FsIHNxdWFyZSByb290IGVzdGltYXRlICoqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9ubyByZWNpcHJvY2FsIHNxdWFyZSByb290IGZvciBpbnRzIGluIElBMzIgYXZhaWxhYmxlLCBuZWl0aGVyIGZvciB1bnNpZ25lZCBpbnQgdG8gZmxvYXQ0IGxhbmVzIGNvbnZlcnNpb24sIHNvIGEgc2VyaWFsIHNvbHV0aW9uIGxvb2tzIGZhc3RlcgorLy9idXQgdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gZm9yIHZyc3FydGVfdTMyIG1heSB2YXJ5IGZvciB2YXJpb3VzIEFSTSBjb21waWxlcnMKKy8vLy90aGUgQVJNIE5FT04gYW5kIHg4NiBTSU1EIHJlc3VsdHMgbWF5IGJlIHNsaWdodGx5IGRpZmZlcmVudAorZmxvYXQzMngyX3QgdnJzcXJ0ZV9mMzIoZmxvYXQzMngyX3QgYSk7IC8vIFZSU1FSVEUuRjMyIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZyc3FydGVfZjMyKGZsb2F0MzJ4Ml90IGEpIC8vdXNlIGxvdyA2NCBiaXRzCit7CisgICAgZmxvYXQzMng0X3QgcmVzOworICAgIF9fbTY0XzEyOCByZXM2NDsKKyAgICByZXMgPSBfbW1fcnNxcnRfcHMoX3BNMTI4KGEpKTsKKyAgICBfTTY0ZihyZXM2NCwgcmVzKTsKKyAgICByZXR1cm4gcmVzNjQ7Cit9CisKK3VpbnQzMngyX3QgdnJzcXJ0ZV91MzIodWludDMyeDJfdCBhKTsgLy8gVlJTUVJURS5VMzIgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDJfdCB2cnNxcnRlX3UzMih1aW50MzJ4Ml90IGEpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vSW5wdXQgaXMgIGZpeGVkIHBvaW50IG51bWJlciEhIQorICAgIC8vV2UgaW1wbGVtZW50IHRoZSByZWNpcF9zcXJ0X2VzdGltYXRlIGZ1bmN0aW9uIGFzIGRlc2NyaWJlZCBpbiBBUk12NyByZWZlcmVuY2UgbWFudWFsIChWUlNRUlRFIGluc3RydWN0aW9uKSBidXQgdXNlIGZsb2F0IGluc3RlYWQgb2YgZG91YmxlCisgICB1aW50MzJ4Ml90IHJlczsKKyAgIF9fbTEyOCB0bXA7CisgICAgZmxvYXQgciwgcmVzZiwgY29lZmY7CisgICAgaW50IGkscTAsIHExLCBzOzsKKyAgICBmb3IgKGkgPTA7IGk8MjsgaSsrKXsKKyAgICAgICAgaWYoKGEubTY0X3UzMltpXSAmIDB4YzAwMDAwMDApID09IDApIHsgLy9hIDw9MHgzZmZmZmZmZgorICAgICAgICAgICAgcmVzLm02NF91MzJbaV0gPSAweGZmZmZmZmZmOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHJlc2YgPSAgKGZsb2F0KSAoYS5tNjRfdTMyW2ldICogKDAuNWYgLyAodWludDMyX3QpKDEgPDwgMzEpKSk7CisgICAgICAgICAgICBjb2VmZiA9IChyZXNmIDwgMC41KT8gNTEyLjAgOiAyNTYuMCA7IC8qIHJhbmdlIDAuMjUgPD0gcmVzZiA8IDAuNSAgb3IgcmFuZ2UgMC41IDw9IHJlc2YgPCAxLjAqLworICAgICAgICAgICAgcTAgPSAoaW50KShyZXNmICogY29lZmYpOyAvKiBhIGluIHVuaXRzIG9mIDEvNTEyIHJvdW5kZWQgZG93biAqLworICAgICAgICAgICAgciA9ICgoZmxvYXQpcTAgKyAwLjUpIC8gY29lZmY7CisgICAgICAgICAgICB0bXAgPSBfbW1fcnNxcnRfc3MoX21tX2xvYWRfc3MoICZyKSk7LyogcmVjaXByb2NhbCByb290IHIgKi8KKyAgICAgICAgICAgIF9tbV9zdG9yZV9zcygmciwgdG1wKTsKKyAgICAgICAgICAgIHMgPSAoaW50KSgyNTYuMCAqIHIgKyAwLjUpOyAvKiByIGluIHVuaXRzIG9mIDEvMjU2IHJvdW5kZWQgdG8gbmVhcmVzdCAqLworICAgICAgICAgICAgciA9IChmbG9hdClzIC8gMjU2LjA7CisgICAgICAgICAgICByZXMubTY0X3UzMltpXSA9IHIgKiAoKCh1aW50MzJfdCkxKSA8PCAzMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworZmxvYXQzMng0X3QgdnJzcXJ0ZXFfZjMyKGZsb2F0MzJ4NF90IGEpOyAvLyBWUlNRUlRFLkYzMiBxMCxxMAorI2RlZmluZSB2cnNxcnRlcV9mMzIgX21tX3JzcXJ0X3BzCisKK3VpbnQzMng0X3QgdnJzcXJ0ZXFfdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZSU1FSVEUuVTMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQzMng0X3QgdnJzcXJ0ZXFfdTMyKHVpbnQzMng0X3QgYSksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgLy9JbnB1dCBpcyAgZml4ZWQgcG9pbnQgbnVtYmVyISEhCisgICAgLy9XZSBpbXBsZW1lbnQgdGhlIHJlY2lwX3NxcnRfZXN0aW1hdGUgZnVuY3Rpb24gYXMgZGVzY3JpYmVkIGluIEFSTXY3IHJlZmVyZW5jZSBtYW51YWwgKFZSU1FSVEUgaW5zdHJ1Y3Rpb24pIGJ1dCB1c2UgZmxvYXQgaW5zdGVhZCBvZiBkb3VibGUKKyAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50MzJfdCAgYXRtcFs0XSwgcmVzWzRdOworICAgX05FT04yU1NFX0FMSUdOXzE2IGZsb2F0IGMxXzMxWzRdID0geyhmbG9hdCkoKCh1aW50MzJfdCkxKSA8PCAzMSksIChmbG9hdCkoKCh1aW50MzJfdCkxKSA8PCAzMSksKGZsb2F0KSgoKHVpbnQzMl90KTEpIDw8IDMxKSwgKGZsb2F0KSgoKHVpbnQzMl90KTEpIDw8IDMxKX07CisgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50IGNfYzAwMDAwMDBbNF0gPSB7MHhjMDAwMDAwMCwweGMwMDAwMDAwLCAweGMwMDAwMDAwLDB4YzAwMDAwMDB9OworICBfX20xMjggdG1wOworICBfX20xMjhpIHJlczEyOCwgbWFzaywgemVybzsKKyAgICBmbG9hdCByLCByZXNmLCBjb2VmZjsKKyAgICBpbnQgaSxxMCwgcTEsIHM7CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICBmb3IgKGkgPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgcmVzZiA9ICAoZmxvYXQpIChhdG1wW2ldICogKDAuNWYgLyAodWludDMyX3QpKDEgPDwgMzEpKSk7CisgICAgICAgIGNvZWZmID0gKHJlc2YgPCAwLjUpPyA1MTIuMCA6IDI1Ni4wIDsgLyogcmFuZ2UgMC4yNSA8PSByZXNmIDwgMC41ICBvciByYW5nZSAwLjUgPD0gcmVzZiA8IDEuMCovCisgICAgICAgIHEwID0gKGludCkocmVzZiAqIGNvZWZmKTsgLyogYSBpbiB1bml0cyBvZiAxLzUxMiByb3VuZGVkIGRvd24gKi8KKyAgICAgICAgciA9ICgoZmxvYXQpcTAgKyAwLjUpIC8gY29lZmY7CisgICAgICAgIHRtcCA9IF9tbV9yc3FydF9zcyhfbW1fbG9hZF9zcyggJnIpKTsvKiByZWNpcHJvY2FsIHJvb3QgciAqLworICAgICAgICBfbW1fc3RvcmVfc3MoJnIsIHRtcCk7CisgICAgICAgIHMgPSAoaW50KSgyNTYuMCAqIHIgKyAwLjUpOyAvKiByIGluIHVuaXRzIG9mIDEvMjU2IHJvdW5kZWQgdG8gbmVhcmVzdCAqLworICAgICAgICByID0gKGZsb2F0KXMgLyAyNTYuMDsKKyAgICAgICAgcmVzW2ldID0gKHVpbnQzMl90KSAociAqICgoKHVpbnQzMl90KTEpIDw8IDMxKSApOworICAgIH0KKyAgICByZXMxMjggPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopcmVzKTsKKyAgICBtYXNrID0gX21tX2FuZF9zaTEyOChhLCAqKF9fbTEyOGkqKWNfYzAwMDAwMDApOworICAgIG1hc2sgPSBfbW1fY21wZXFfZXBpMzIoemVybywgbWFzayk7ICAvLzB4ZmZmZmZmZmYgaWYgYXRtcFtpXSA8PSAweDNmZmZmZmZmCisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChyZXMxMjgsIG1hc2spOworfQorLy8qKioqKioqKioqKiogUmVjaXByb2NhbCBlc3RpbWF0ZS9zdGVwIGFuZCAxL3NxcnQgZXN0aW1hdGUvc3RlcCAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKlZSRUNQUyAoVmVjdG9yIFJlY2lwcm9jYWwgU3RlcCkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL211bHRpcGxpZXMgdGhlIGVsZW1lbnRzIG9mIG9uZSB2ZWN0b3IgYnkgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgYW5vdGhlciB2ZWN0b3IsCisvL3N1YnRyYWN0cyBlYWNoIG9mIHRoZSByZXN1bHRzIGZyb20gMiwgYW5kIHBsYWNlcyB0aGUgZmluYWwgcmVzdWx0cyBpbnRvIHRoZSBlbGVtZW50cyBvZiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLgorCitmbG9hdDMyeDJfdCB2cmVjcHNfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWUkVDUFMuRjMyIGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3QgdnJlY3BzX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKQoreworICAgIGZsb2F0MzJ4NF90IHJlczsKKyAgICBfX202NF8xMjggcmVzNjQ7CisgICAgcmVzID0gdnJlY3BzcV9mMzIoX3BNMTI4KGEpLCBfcE0xMjgoYikpOworICAgIF9NNjRmKHJlczY0LCByZXMpOworICAgIHJldHVybiByZXM2NDsKK30KKworZmxvYXQzMng0X3QgdnJlY3BzcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZSRUNQUy5GMzIgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDRfdCB2cmVjcHNxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSAvLyBWUkVDUFMuRjMyIHEwLCBxMCwgcTAKK3sKKyAgICBfX20xMjggZjIsIG11bDsKKyAgICBmMiA9ICBfbW1fc2V0MV9wcygyLik7CisgICAgbXVsID0gX21tX211bF9wcyhhLGIpOworICAgIHJldHVybiBfbW1fc3ViX3BzKGYyLG11bCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKipWUlNRUlRTIChWZWN0b3IgUmVjaXByb2NhbCBTcXVhcmUgUm9vdCBTdGVwKSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9tdWx0aXBsaWVzIHRoZSBlbGVtZW50cyBvZiBvbmUgdmVjdG9yIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIGFub3RoZXIgdmVjdG9yLAorLy9zdWJ0cmFjdHMgZWFjaCBvZiB0aGUgcmVzdWx0cyBmcm9tIDMsIGRpdmlkZXMgdGhlc2UgcmVzdWx0cyBieSB0d28sIGFuZCBwbGFjZXMgdGhlIGZpbmFsIHJlc3VsdHMgaW50byB0aGUgZWxlbWVudHMgb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3Rvci4KKworZmxvYXQzMngyX3QgdnJzcXJ0c19mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZSU1FSVFMuRjMyIGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3QgdnJzcXJ0c19mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICBmbG9hdDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9mMzJbMF0gPSAoMyAtIGEubTY0X2YzMlswXSAqIGIubTY0X2YzMlswXSkgLyAyOworICAgIHJlcy5tNjRfZjMyWzFdID0gKDMgLSBhLm02NF9mMzJbMV0gKiBiLm02NF9mMzJbMV0pIC8gMjsKKyAgICByZXR1cm4gcmVzOworfQorCitmbG9hdDMyeDRfdCB2cnNxcnRzcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZSU1FSVFMuRjMyIHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3QgdnJzcXJ0c3FfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpIC8vIFZSU1FSVFMuRjMyIHEwLCBxMCwgcTAKK3sKKyAgICBfX20xMjggZjMsIGYwNSwgbXVsOworICAgIGYzID0gIF9tbV9zZXQxX3BzKDMuKTsKKyAgICBmMDUgPSAgX21tX3NldDFfcHMoMC41KTsKKyAgICBtdWwgPSBfbW1fbXVsX3BzKGEsYik7CisgICAgZjMgPSBfbW1fc3ViX3BzKGYzLG11bCk7CisgICAgcmV0dXJuIF9tbV9tdWxfcHMgKGYzLCBmMDUpOworfQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTaGlmdHMgYnkgc2lnbmVkIHZhcmlhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqIFZlY3RvciBzaGlmdCBsZWZ0OiBWcltpXSA6PSBWYVtpXSA8PCBWYltpXSAobmVnYXRpdmUgdmFsdWVzIHNoaWZ0IHJpZ2h0KSAqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9ObyBzdWNoIG9wZXJhdGlvbnMgaW4gSUEzMiBTSU1EIHVuZm9ydHVuYXRlbHksIGNvbnN0YW50IHNoaWZ0IG9ubHkgYXZhaWxhYmxlLCBzbyBuZWVkIHRvIGRvIHRoZSBzZXJpYWwgc29sdXRpb24KKy8vaGVscGVyIG1hY3JvLiBJdCBtYXRjaGVzIEFSTSBpbXBsZW1lbnRhdGlvbiBmb3IgYmlnIHNoaWZ0cworI2RlZmluZSBTRVJJQUxfU0hJRlQoVFlQRSwgSU5URVJOQUxfVFlQRSwgTEVOTUFYLCBMRU4pIFwKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IFRZUEUgYXRtcFtMRU5NQVhdLCByZXNbTEVOTUFYXTsgX05FT04yU1NFX0FMSUdOXzE2IElOVEVSTkFMX1RZUEUgYnRtcFtMRU5NQVhdOyBpbnQgaSwgbGFuZXNpemUgPSBzaXplb2YoSU5URVJOQUxfVFlQRSkgPDwgMzsgXAorICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOyBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWJ0bXAsIGIpOyBcCisgICAgICAgIGZvciAoaSA9IDA7IGk8TEVOOyBpKyspIHsgXAorICAgICAgICBpZiggKGJ0bXBbaV0gPj0gbGFuZXNpemUpfHwoYnRtcFtpXSA8PSAtbGFuZXNpemUpICkgcmVzW2ldID0gMDsgXAorICAgICAgICBlbHNlIHJlc1tpXSA9IChidG1wW2ldID49MCkgPyBhdG1wW2ldIDw8IGJ0bXBbaV0gOiBhdG1wW2ldID4+ICgtYnRtcFtpXSk7IH0gXAorICAgICAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7CisKKyNkZWZpbmUgU0VSSUFMX1NISUZUXzY0KFRZUEUsIFNJR04sIExFTikgXAorICAgICAgICBpbnQgIyMgVFlQRSAjIyB4ICMjIExFTiAjIyBfdCByZXM7ICBpbnQgaSwgbGFuZXNpemUgPSBzaXplb2YoaW50ICMjIFRZUEUgIyMgX3QpIDw8IDM7IFwKKyAgICAgICAgZm9yIChpID0gMDsgaTxMRU47IGkrKykgeyBcCisgICAgICAgIGlmKCAoYi5tNjRfaSAjIyBUWVBFW2ldID49IGxhbmVzaXplKXx8KGIubTY0X2kgIyMgVFlQRVtpXSA8PSAtbGFuZXNpemUpICkgcmVzLm02NF8gIyMgU0lHTiAjIyBUWVBFW2ldID0gMDsgXAorICAgICAgICBlbHNlIHJlcy5tNjRfICMjIFNJR04gIyMgVFlQRVtpXSA9IChiLm02NF9pICMjIFRZUEVbaV0gPj0wKSA/IGEubTY0XyAjIyBTSUdOICMjIFRZUEVbaV0gPDwgYi5tNjRfaSAjIyBUWVBFW2ldIDogYS5tNjRfICMjIFNJR04gIyMgVFlQRVtpXSA+PiAoLWIubTY0X2kgIyMgVFlQRVtpXSk7IH0gXAorICAgICAgICByZXR1cm4gcmVzOworCitpbnQ4eDhfdCB2c2hsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWU0hMLlM4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDh4OF90IHZzaGxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TSElGVF82NCg4LCBpLCA4KQorfQorCitpbnQxNng0X3QgdnNobF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlNITC5TMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MTZ4NF90IHZzaGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TSElGVF82NCgxNiwgaSwgNCkKK30KKworaW50MzJ4Ml90IHZzaGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZTSEwuUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDJfdCB2c2hsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0hJRlRfNjQoMzIsIGksIDIpCit9CisKK2ludDY0eDFfdCB2c2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWU0hMLlM2NCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgxX3QgdnNobF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NISUZUXzY0KDY0LCBpLCAxKQorfQorCit1aW50OHg4X3QgdnNobF91OCh1aW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZTSEwuVTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDh4OF90IHZzaGxfdTgodWludDh4OF90IGEsIGludDh4OF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0hJRlRfNjQoOCwgdSwgOCkKK30KKwordWludDE2eDRfdCB2c2hsX3UxNih1aW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlNITC5zMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDE2eDRfdCB2c2hsX3UxNih1aW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NISUZUXzY0KDE2LCB1LCA0KQorfQorCit1aW50MzJ4Ml90IHZzaGxfdTMyKHVpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWU0hMLlUzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MzJ4Ml90IHZzaGxfdTMyKHVpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0hJRlRfNjQoMzIsIHUsIDIpCit9CisKK3VpbnQ2NHgxX3QgdnNobF91NjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYik7IC8vIFZTSEwuVTY0IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgxX3QgdnNobF91NjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYikgLy9pZiB3ZSB1c2UgdGhlIFNFUklBTF9TSElGVCBtYWNybyBuZWVkIHRvIGhhdmUgdGhlIHNwZWNpYWwgcHJvY2Vzc2luZyAgZm9yIGxhcmdlIG51bWJlcnMKK3sKKyAgICBTRVJJQUxfU0hJRlRfNjQoNjQsIHUsIDEpCit9CisKK2ludDh4MTZfdCB2c2hscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWU0hMLlM4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDh4MTZfdCB2c2hscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0hJRlQoaW50OF90LCBpbnQ4X3QsIDE2LCAxNikKK30KKworaW50MTZ4OF90IHZzaGxxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWU0hMLlMxNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQxNng4X3QgdnNobHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TSElGVChpbnQxNl90LCBpbnQxNl90LCA4LCA4KQorfQorCitpbnQzMng0X3QgdnNobHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZTSEwuUzMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDRfdCB2c2hscV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NISUZUKGludDMyX3QsIGludDMyX3QsIDQsIDQpCit9CisKK2ludDY0eDJfdCB2c2hscV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlNITC5TNjQgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4Ml90IHZzaGxxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0hJRlQoaW50NjRfdCwgaW50NjRfdCwgMiwgMikKK30KKwordWludDh4MTZfdCB2c2hscV91OCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlNITC5VOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50OHgxNl90IHZzaGxxX3U4KHVpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0hJRlQodWludDhfdCwgaW50OF90LCAxNiwgMTYpCit9CisKK3VpbnQxNng4X3QgdnNobHFfdTE2KHVpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWU0hMLnMxNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MTZ4OF90IHZzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NISUZUKHVpbnQxNl90LCBpbnQxNl90LCA4LCA4KQorfQorCit1aW50MzJ4NF90IHZzaGxxX3UzMih1aW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlNITC5VMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDRfdCB2c2hscV91MzIodWludDMyeDRfdCBhLCBpbnQzMng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TSElGVCh1aW50MzJfdCwgaW50MzJfdCwgNCwgNCkKK30KKwordWludDY0eDJfdCB2c2hscV91NjQodWludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZTSEwuVTY0IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKCB1aW50NjR4Ml90IHZzaGxxX3U2NCh1aW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NISUZUKHVpbnQ2NF90LCBpbnQ2NF90LCAyLCAyKQorfQorCisKKy8vKioqKioqKioqKiogVmVjdG9yIHNhdHVyYXRpbmcgc2hpZnQgbGVmdDogKG5lZ2F0aXZlIHZhbHVlcyBzaGlmdCByaWdodCkgKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9ObyBzdWNoIG9wZXJhdGlvbnMgaW4gSUEzMiBTSU1EIGF2YWlsYWJsZSB5ZXQsIGNvbnN0YW50IHNoaWZ0IG9ubHkgYXZhaWxhYmxlLCBzbyBuZWVkIHRvIGRvIHRoZSBzZXJpYWwgc29sdXRpb24KKyNkZWZpbmUgU0VSSUFMX1NBVFVSQVRJTkdfU0hJRlRfU0lHTkVEKFRZUEUsIExFTk1BWCwgTEVOKSBcCisgICAgICAgIF9ORU9OMlNTRV9BTElHTl8xNiBUWVBFIGF0bXBbTEVOTUFYXSwgcmVzW0xFTk1BWF0sIGJ0bXBbTEVOTUFYXTsgVFlQRSBsaW1pdDsgaW50IGk7IFwKKyAgICAgICAgaW50IGxhbmVzaXplXzEgPSAoc2l6ZW9mKFRZUEUpIDw8IDMpIC0gMTsgXAorICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOyBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWJ0bXAsIGIpOyBcCisgICAgICAgIGZvciAoaSA9IDA7IGk8TEVOOyBpKyspIHsgXAorICAgICAgICBpZiAoYXRtcFtpXSA9PTApIHJlc1tpXSA9IDA7IFwKKyAgICAgICAgZWxzZXsgXAorICAgICAgICAgICAgaWYoYnRtcFtpXSA8MCkgcmVzW2ldID0gYXRtcFtpXSA+PiAoLWJ0bXBbaV0pOyBcCisgICAgICAgICAgICBlbHNleyBcCisgICAgICAgICAgICAgICAgaWYgKGJ0bXBbaV0+bGFuZXNpemVfMSkgeyBcCisgICAgICAgICAgICAgICAgICAgIHJlc1tpXSA9ICgoX1VOU0lHTkVEX1QoVFlQRSkpYXRtcFtpXSA+PiBsYW5lc2l6ZV8xICkgKyAoKFRZUEUpMSA8PCBsYW5lc2l6ZV8xKSAtIDE7IFwKKyAgICAgICAgICAgICAgICB9ZWxzZXsgXAorICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IChUWVBFKTEgPDwgKGxhbmVzaXplXzEgLSBidG1wW2ldKTsgXAorICAgICAgICAgICAgICAgICAgICBpZigoYXRtcFtpXSA+PSBsaW1pdCl8fChhdG1wW2ldIDw9IC1saW1pdCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc1tpXSA9ICgoX1VOU0lHTkVEX1QoVFlQRSkpYXRtcFtpXSA+PiBsYW5lc2l6ZV8xICkgKyAoKFRZUEUpMSA8PCBsYW5lc2l6ZV8xKSAtIDE7IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSByZXNbaV0gPSBhdG1wW2ldIDw8IGJ0bXBbaV07IH19fX0gXAorICAgICAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7CisKKyNkZWZpbmUgU0VSSUFMX1NBVFVSQVRJTkdfU0hJRlRfVU5TSUdORUQoVFlQRSwgTEVOTUFYLCBMRU4pIFwKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IF9VTlNJR05FRF9UKFRZUEUpIGF0bXBbTEVOTUFYXSwgcmVzW0xFTk1BWF07IF9ORU9OMlNTRV9BTElHTl8xNiBUWVBFIGJ0bXBbTEVOTUFYXTsgX1VOU0lHTkVEX1QoVFlQRSkgbGltaXQ7IGludCBpOyBcCisgICAgICAgIFRZUEUgbGFuZXNpemUgPSAoc2l6ZW9mKFRZUEUpIDw8IDMpOyBcCisgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYXRtcCwgYSk7IF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYnRtcCwgYik7IFwKKyAgICAgICAgZm9yIChpID0gMDsgaTxMRU47IGkrKykgeyBcCisgICAgICAgIGlmIChhdG1wW2ldID09MCkge3Jlc1tpXSA9IDA7IFwKKyAgICAgICAgfWVsc2V7IFwKKyAgICAgICAgICAgIGlmKGJ0bXBbaV0gPCAwKSByZXNbaV0gPSBhdG1wW2ldID4+ICgtYnRtcFtpXSk7IFwKKyAgICAgICAgICAgIGVsc2V7IFwKKyAgICAgICAgICAgICAgICBpZiAoYnRtcFtpXT5sYW5lc2l6ZSkgcmVzW2ldID0gfigoVFlQRSkwKTsgXAorICAgICAgICAgICAgICAgIGVsc2V7IFwKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSAoVFlQRSkgMSA8PCAobGFuZXNpemUgLSBidG1wW2ldKTsgXAorICAgICAgICAgICAgICAgICAgICByZXNbaV0gPSAoIGF0bXBbaV0gPj0gbGltaXQpID8gcmVzW2ldID0gfigoVFlQRSkwKSA6IGF0bXBbaV0gPDwgYnRtcFtpXTsgfX19fSBcCisgICAgICAgIHJldHVybiBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopcmVzKTsKKworI2RlZmluZSBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9TSUdORURfNjQoVFlQRSwgTEVOKSBcCisgICAgICAgIGludCAjIyBUWVBFICMjIHggIyMgTEVOICMjIF90IHJlczsgaW50ICMjIFRZUEUgIyMgX3QgbGltaXQ7IGludCBpOyBcCisgICAgICAgIGludCBsYW5lc2l6ZV8xID0gKHNpemVvZiggaW50ICMjIFRZUEUgIyMgX3QpIDw8IDMpIC0gMTsgXAorICAgICAgICBmb3IgKGkgPSAwOyBpPExFTjsgaSsrKSB7IFwKKyAgICAgICAgaWYgKGEubTY0X2kgIyMgVFlQRVtpXSA9PTApIHJlcy5tNjRfaSAjIyBUWVBFW2ldID0gMDsgXAorICAgICAgICBlbHNleyBcCisgICAgICAgICAgICBpZihiLm02NF9pICMjIFRZUEVbaV0gPDApIHJlcy5tNjRfaSAjIyBUWVBFW2ldID0gYS5tNjRfaSAjIyBUWVBFW2ldID4+ICgtKGIubTY0X2kgIyMgVFlQRVtpXSkpOyBcCisgICAgICAgICAgICBlbHNleyBcCisgICAgICAgICAgICAgICAgaWYgKGIubTY0X2kgIyMgVFlQRVtpXT5sYW5lc2l6ZV8xKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgcmVzLm02NF9pICMjIFRZUEVbaV0gPSAoKF9VTlNJR05FRF9UKGludCAjIyBUWVBFICMjIF90KSlhLm02NF9pICMjIFRZUEVbaV0gPj4gbGFuZXNpemVfMSApICsgKChpbnQgIyMgVFlQRSAjIyBfdCkgMSA8PCBsYW5lc2l6ZV8xKSAtIDE7IFwKKyAgICAgICAgICAgICAgICB9ZWxzZXsgXAorICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IChpbnQgIyMgVFlQRSAjIyBfdCkgMSA8PCAobGFuZXNpemVfMSAtIGIubTY0X2kgIyMgVFlQRVtpXSk7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYoKGEubTY0X2kgIyMgVFlQRVtpXSA+PSBsaW1pdCl8fChhLm02NF9pICMjIFRZUEVbaV0gPD0gLWxpbWl0KSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzLm02NF9pICMjIFRZUEVbaV0gPSAoKF9VTlNJR05FRF9UKGludCAjIyBUWVBFICMjIF90KSlhLm02NF9pICMjIFRZUEVbaV0gPj4gbGFuZXNpemVfMSApICsgKChpbnQgIyMgVFlQRSAjIyBfdCkgMSA8PCBsYW5lc2l6ZV8xKSAtIDE7IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSByZXMubTY0X2kgIyMgVFlQRVtpXSA9IGEubTY0X2kgIyMgVFlQRVtpXSA8PCBiLm02NF9pICMjIFRZUEVbaV07IH19fX0gXAorICAgICAgICByZXR1cm4gcmVzOworCisjZGVmaW5lIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1VOU0lHTkVEXzY0KFRZUEUsIExFTikgXAorICAgICAgICBpbnQgIyMgVFlQRSAjIyB4ICMjIExFTiAjIyBfdCByZXM7ICBfVU5TSUdORURfVChpbnQgIyMgVFlQRSAjIyBfdCkgbGltaXQ7IGludCBpOyBcCisgICAgICAgIGludCAjIyBUWVBFICMjIF90IGxhbmVzaXplID0gKHNpemVvZihpbnQgIyMgVFlQRSAjIyBfdCkgPDwgMyk7IFwKKyAgICAgICAgZm9yIChpID0gMDsgaTxMRU47IGkrKykgeyBcCisgICAgICAgIGlmIChhLm02NF91ICMjIFRZUEVbaV0gPT0wKSB7cmVzLm02NF91ICMjIFRZUEVbaV0gPSAwOyBcCisgICAgICAgIH1lbHNleyBcCisgICAgICAgICAgICBpZihiLm02NF9pICMjIFRZUEVbaV0gPCAwKSByZXMubTY0X3UgIyMgVFlQRVtpXSA9IGEubTY0X3UgIyMgVFlQRVtpXSA+PiAoLShiLm02NF9pICMjIFRZUEVbaV0pKTsgXAorICAgICAgICAgICAgZWxzZXsgXAorICAgICAgICAgICAgICAgIGlmIChiLm02NF9pICMjIFRZUEVbaV0+bGFuZXNpemUpIHJlcy5tNjRfdSAjIyBUWVBFW2ldID0gfigoaW50ICMjIFRZUEUgIyMgX3QpIDApOyBcCisgICAgICAgICAgICAgICAgZWxzZXsgXAorICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IChpbnQgIyMgVFlQRSAjIyBfdCkgMSA8PCAobGFuZXNpemUgLSBiLm02NF9pICMjIFRZUEVbaV0pOyBcCisgICAgICAgICAgICAgICAgICAgIHJlcy5tNjRfdSAjIyBUWVBFW2ldID0gKCBhLm02NF91ICMjIFRZUEVbaV0gPj0gbGltaXQpID8gcmVzLm02NF91ICMjIFRZUEVbaV0gPSB+KChpbnQgIyMgVFlQRSAjIyBfdCkgMCkgOiBhLm02NF91ICMjIFRZUEVbaV0gPDwgYi5tNjRfdSAjIyBUWVBFW2ldOyB9fX19IFwKKyAgICAgICAgcmV0dXJuIHJlczsKKworaW50OHg4X3QgdnFzaGxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZRU0hMLlM4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDh4OF90IHZxc2hsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9TSUdORURfNjQoOCw4KQorfQorCitpbnQxNng0X3QgdnFzaGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZRU0hMLlMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQxNng0X3QgdnFzaGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1NJR05FRF82NCgxNiw0KQorfQorCitpbnQzMngyX3QgdnFzaGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZRU0hMLlMzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMngyX3QgdnFzaGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1NJR05FRF82NCgzMiwyKQorfQorCitpbnQ2NHgxX3QgdnFzaGxfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYik7IC8vIFZRU0hMLlM2NCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgxX3QgdnFzaGxfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1NJR05FRF82NCg2NCwxKQorfQorCit1aW50OHg4X3QgdnFzaGxfdTgodWludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUVNITC5VOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50OHg4X3QgdnFzaGxfdTgodWludDh4OF90IGEsIGludDh4OF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9VTlNJR05FRF82NCg4LDgpCit9CisKK3VpbnQxNng0X3QgdnFzaGxfdTE2KHVpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUVNITC5zMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDE2eDRfdCB2cXNobF91MTYodWludDE2eDRfdCBhLCBpbnQxNng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1VOU0lHTkVEXzY0KDE2LDQpCit9CisKK3VpbnQzMngyX3QgdnFzaGxfdTMyKHVpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUVNITC5VMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDJfdCB2cXNobF91MzIodWludDMyeDJfdCBhLCBpbnQzMngyX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1VOU0lHTkVEXzY0KDMyLDIpCit9CisKK3VpbnQ2NHgxX3QgdnFzaGxfdTY0KHVpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWUVNITC5VNjQgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDFfdCB2cXNobF91NjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1VOU0lHTkVEXzY0KDY0LDEpCit9CisKK2ludDh4MTZfdCB2cXNobHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlFTSEwuUzggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50OHgxNl90IHZxc2hscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9TSUdORUQoaW50OF90LCAxNiwgMTYpCit9CisKK2ludDE2eDhfdCB2cXNobHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZRU0hMLlMxNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQxNng4X3QgdnFzaGxxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9TSUdORUQoaW50MTZfdCwgOCwgOCkKK30KKworaW50MzJ4NF90IHZxc2hscV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlFTSEwuUzMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDRfdCB2cXNobHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1NJR05FRChpbnQzMl90LCA0LCA0KQorfQorCitpbnQ2NHgyX3QgdnFzaGxxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWUVNITC5TNjQgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4Ml90IHZxc2hscV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfU0hJRlRfU0lHTkVEKGludDY0X3QsIDIsIDIpCit9CisKK3VpbnQ4eDE2X3QgdnFzaGxxX3U4KHVpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWUVNITC5VOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50OHgxNl90IHZxc2hscV91OCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfU0hJRlRfVU5TSUdORUQoaW50OF90LCAxNiwgMTYpCit9CisKK3VpbnQxNng4X3QgdnFzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlFTSEwuczE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQxNng4X3QgdnFzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfU0hJRlRfVU5TSUdORUQoaW50MTZfdCwgOCwgOCkKK30KKwordWludDMyeDRfdCB2cXNobHFfdTMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUVNITC5VMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDRfdCB2cXNobHFfdTMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9VTlNJR05FRChpbnQzMl90LCA0LCA0KQorfQorCit1aW50NjR4Ml90IHZxc2hscV91NjQodWludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZRU0hMLlU2NCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50NjR4Ml90IHZxc2hscV91NjQodWludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1VOU0lHTkVEKGludDY0X3QsIDIsIDIpCit9CisKKworLy8qKioqKioqKiBWZWN0b3Igcm91bmRpbmcgc2hpZnQgbGVmdDogKG5lZ2F0aXZlIHZhbHVlcyBzaGlmdCByaWdodCkgKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL05vIHN1Y2ggb3BlcmF0aW9ucyBpbiBJQTMyIFNJTUQgYXZhaWxhYmxlIHlldCwgY29uc3RhbnQgc2hpZnQgb25seSBhdmFpbGFibGUsIHNvIG5lZWQgdG8gZG8gdGhlIHNlcmlhbCBzb2x1dGlvbgorLy9yb3VuZGluZyBtYWtlcyBzZW5zZSBmb3IgcmlnaHQgc2hpZnRzIG9ubHkuCisjZGVmaW5lIFNFUklBTF9ST1VORElOR19TSElGVChUWVBFLCBJTlRFUk5BTF9UWVBFLCBMRU5NQVgsIExFTikgXAorICAgICAgICBfTkVPTjJTU0VfQUxJR05fMTYgVFlQRSBhdG1wW0xFTk1BWF0sIHJlc1tMRU5NQVhdOyBfTkVPTjJTU0VfQUxJR05fMTYgSU5URVJOQUxfVFlQRSBidG1wW0xFTk1BWF07IElOVEVSTkFMX1RZUEUgaSwgbGFuZXNpemUgPSBzaXplb2YoSU5URVJOQUxfVFlQRSkgPDwgMzsgXAorICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOyBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWJ0bXAsIGIpOyBcCisgICAgICAgIGZvciAoaSA9IDA7IGk8TEVOOyBpKyspIHsgXAorICAgICAgICBpZiggYnRtcFtpXSA+PSAwKSB7IFwKKyAgICAgICAgICAgIGlmKGJ0bXBbaV0gPj0gbGFuZXNpemUpIHJlc1tpXSA9IDA7IFwKKyAgICAgICAgICAgIGVsc2UgcmVzW2ldID0gKGF0bXBbaV0gPDwgYnRtcFtpXSk7IFwKKyAgICAgICAgfWVsc2V7IFwKKyAgICAgICAgICAgIHJlc1tpXSA9IChidG1wW2ldIDwgLWxhbmVzaXplKSA/IHJlc1tpXSA9IDAgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ0bXBbaV0gPT0gLWxhbmVzaXplKSA/IChhdG1wW2ldICYgKChJTlRFUk5BTF9UWVBFKTEgPDwgKC1idG1wW2ldIC0gMSkpKSA+PiAoLWJ0bXBbaV0gLSAxKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXRtcFtpXSA+PiAoLWJ0bXBbaV0pKSArICggKGF0bXBbaV0gJiAoKElOVEVSTkFMX1RZUEUpMSA8PCAoLWJ0bXBbaV0gLSAxKSkpID4+ICgtYnRtcFtpXSAtIDEpICk7ICAgIH19IFwKKyAgICAgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworCisKKyNkZWZpbmUgU0VSSUFMX1JPVU5ESU5HX1NISUZUXzY0KFRZUEUsIFNJR04sIExFTikgXAorICAgICAgICBpbnQgIyMgVFlQRSAjIyB4ICMjIExFTiAjIyBfdCByZXM7ICBpbnQgaTsgIGludCBsYW5lc2l6ZSA9IHNpemVvZihpbnQgIyMgVFlQRSAjIyBfdCkgPDwgMzsgXAorICAgICAgICBmb3IgKGkgPSAwOyBpPExFTjsgaSsrKSB7IFwKKyAgICAgICAgaWYoIGIubTY0X2kgIyMgVFlQRVtpXSA+PSAwKSB7IFwKKyAgICAgICAgICAgIGlmKGIubTY0X2kgIyMgVFlQRVtpXSA+PSBsYW5lc2l6ZSkgcmVzLm02NF8gIyMgU0lHTiAjIyBUWVBFW2ldID0gMDsgXAorICAgICAgICAgICAgZWxzZSByZXMubTY0XyAjIyBTSUdOICMjIFRZUEVbaV0gPSAoYS5tNjRfICMjIFNJR04gIyMgVFlQRVtpXSA8PCBiLm02NF9pICMjIFRZUEVbaV0pOyBcCisgICAgICAgIH1lbHNleyBcCisgICAgICAgICAgICByZXMubTY0XyAjIyBTSUdOICMjIFRZUEVbaV0gPSAoYi5tNjRfaSAjIyBUWVBFW2ldIDwgLWxhbmVzaXplKSA/IHJlcy5tNjRfICMjIFNJR04gIyMgVFlQRVtpXSA9IDAgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGIubTY0X2kgIyMgVFlQRVtpXSA9PSAtbGFuZXNpemUpID8gKGEubTY0XyAjIyBTSUdOICMjIFRZUEVbaV0gJiAoKGludCAjIyBUWVBFICMjIF90KSAxIDw8ICgtKGIubTY0X2kgIyMgVFlQRVtpXSkgLSAxKSkpID4+ICgtKGIubTY0X2kgIyMgVFlQRVtpXSkgLSAxKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYS5tNjRfICMjIFNJR04gIyMgVFlQRVtpXSA+PiAoLShiLm02NF9pICMjIFRZUEVbaV0pKSkgKyAoIChhLm02NF8gIyMgU0lHTiAjIyBUWVBFW2ldICYgKChpbnQgIyMgVFlQRSAjIyBfdCkgMSA8PCAoLShiLm02NF9pICMjIFRZUEVbaV0pIC0gMSkpKSA+PiAoLShiLm02NF9pICMjIFRZUEVbaV0pIC0gMSkgKTsgICAgfX0gXAorICAgICAgICByZXR1cm4gcmVzOworCisKK2ludDh4OF90IHZyc2hsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUlNITC5TOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ4eDhfdCB2cnNobF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1JPVU5ESU5HX1NISUZUXzY0KDgsaSw4KQorfQorCitpbnQxNng0X3QgdnJzaGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZSU0hMLlMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQxNng0X3QgdnJzaGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9ST1VORElOR19TSElGVF82NCgxNixpLDQpCit9CisKK2ludDMyeDJfdCB2cnNobF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlJTSEwuUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDJfdCB2cnNobF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1JPVU5ESU5HX1NISUZUXzY0KDMyLGksMikKK30KKworaW50NjR4MV90IHZyc2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWUlNITC5TNjQgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4MV90IHZyc2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfUk9VTkRJTkdfU0hJRlRfNjQoNjQsaSwxKQorfQorCit1aW50OHg4X3QgdnJzaGxfdTgodWludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUlNITC5VOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50OHg4X3QgdnJzaGxfdTgodWludDh4OF90IGEsIGludDh4OF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfUk9VTkRJTkdfU0hJRlRfNjQoOCx1LDgpCit9CisKK3VpbnQxNng0X3QgdnJzaGxfdTE2KHVpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUlNITC5zMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDE2eDRfdCB2cnNobF91MTYodWludDE2eDRfdCBhLCBpbnQxNng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9ST1VORElOR19TSElGVF82NCgxNix1LDQpCit9CisKK3VpbnQzMngyX3QgdnJzaGxfdTMyKHVpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUlNITC5VMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDJfdCB2cnNobF91MzIodWludDMyeDJfdCBhLCBpbnQzMngyX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9ST1VORElOR19TSElGVF82NCgzMix1LDIpCit9CisKK3VpbnQ2NHgxX3QgdnJzaGxfdTY0KHVpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWUlNITC5VNjQgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDFfdCB2cnNobF91NjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9ST1VORElOR19TSElGVF82NCg2NCx1LDEpCit9CisKK2ludDh4MTZfdCB2cnNobHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlJTSEwuUzggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50OHgxNl90IHZyc2hscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfUk9VTkRJTkdfU0hJRlQoaW50OF90LCBpbnQ4X3QsIDE2LCAxNikKK30KKworaW50MTZ4OF90IHZyc2hscV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlJTSEwuUzE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDE2eDhfdCB2cnNobHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9ST1VORElOR19TSElGVChpbnQxNl90LCBpbnQxNl90LCA4LCA4KQorfQorCitpbnQzMng0X3QgdnJzaGxxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUlNITC5TMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4NF90IHZyc2hscV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1JPVU5ESU5HX1NISUZUKGludDMyX3QsIGludDMyX3QsIDQsIDQpCit9CisKK2ludDY0eDJfdCB2cnNobHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZSU0hMLlM2NCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgyX3QgdnJzaGxxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfUk9VTkRJTkdfU0hJRlQoaW50NjRfdCwgaW50NjRfdCwgMiwgMikKK30KKwordWludDh4MTZfdCB2cnNobHFfdTgodWludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZSU0hMLlU4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ4eDE2X3QgdnJzaGxxX3U4KHVpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfUk9VTkRJTkdfU0hJRlQodWludDhfdCwgaW50OF90LCAxNiwgMTYpCit9CisKK3VpbnQxNng4X3QgdnJzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlJTSEwuczE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQxNng4X3QgdnJzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1JPVU5ESU5HX1NISUZUKHVpbnQxNl90LCBpbnQxNl90LCA4LCA4KQorfQorCit1aW50MzJ4NF90IHZyc2hscV91MzIodWludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZSU0hMLlUzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MzJ4NF90IHZyc2hscV91MzIodWludDMyeDRfdCBhLCBpbnQzMng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9ST1VORElOR19TSElGVCh1aW50MzJfdCwgaW50MzJfdCwgNCwgNCkKK30KKwordWludDY0eDJfdCB2cnNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWUlNITC5VNjQgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDJfdCB2cnNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfUk9VTkRJTkdfU0hJRlQodWludDY0X3QsIGludDY0X3QsIDIsIDIpCit9CisKKworLy8qKioqKioqKioqIFZlY3RvciBzYXR1cmF0aW5nIHJvdW5kaW5nIHNoaWZ0IGxlZnQ6IChuZWdhdGl2ZSB2YWx1ZXMgc2hpZnQgcmlnaHQpICoqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9ObyBzdWNoIG9wZXJhdGlvbnMgaW4gSUEzMiBTSU1EIHVuZm9ydHVuYXRlbHksIGNvbnN0YW50IHNoaWZ0IG9ubHkgYXZhaWxhYmxlLCBzbyBuZWVkIHRvIGRvIHRoZSBzZXJpYWwgc29sdXRpb24KKy8vU2F0dXJhdGlvbiBoYXBwZW5zIGZvciBsZWZ0IHNoaWZ0cyBvbmx5IHdoaWxlIHJvdW5kaW5nIG1ha2VzIHNlbnNlIGZvciByaWdodCBzaGlmdHMgb25seS4KKyNkZWZpbmUgU0VSSUFMX1NBVFVSQVRJTkdfUk9VTkRJTkdfU0hJRlRfU0lHTkVEKFRZUEUsIExFTk1BWCwgTEVOKSBcCisgICAgICAgIF9ORU9OMlNTRV9BTElHTl8xNiBUWVBFIGF0bXBbTEVOTUFYXSwgcmVzW0xFTk1BWF0sIGJ0bXBbTEVOTUFYXTsgVFlQRSBsaW1pdDsgaW50IGk7IFwKKyAgICAgICAgaW50IGxhbmVzaXplXzEgPSAoc2l6ZW9mKFRZUEUpIDw8IDMpIC0gMTsgXAorICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOyBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWJ0bXAsIGIpOyBcCisgICAgICAgIGZvciAoaSA9IDA7IGk8TEVOOyBpKyspIHsgXAorICAgICAgICBpZiAoYXRtcFtpXSA9PTApIHJlc1tpXSA9IDA7IFwKKyAgICAgICAgZWxzZXsgXAorICAgICAgICAgICAgaWYoYnRtcFtpXSA8MCkgcmVzW2ldID0gKGJ0bXBbaV0gPCAoLWxhbmVzaXplXzEpKSA/IDAgOiAoYXRtcFtpXSA+PiAoLWJ0bXBbaV0pKSArICggKGF0bXBbaV0gJiAoKFRZUEUpMSA8PCAoLWJ0bXBbaV0gLSAxKSkpID4+ICgtYnRtcFtpXSAtIDEpICk7IFwKKyAgICAgICAgICAgIGVsc2V7IFwKKyAgICAgICAgICAgICAgICBpZiAoYnRtcFtpXT5sYW5lc2l6ZV8xKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgcmVzW2ldID0gKChfVU5TSUdORURfVChUWVBFKSlhdG1wW2ldID4+IGxhbmVzaXplXzEgKSArICgoVFlQRSkxIDw8IGxhbmVzaXplXzEpIC0gMTsgXAorICAgICAgICAgICAgICAgIH1lbHNleyBcCisgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gKFRZUEUpMSA8PCAobGFuZXNpemVfMSAtIGJ0bXBbaV0pOyBcCisgICAgICAgICAgICAgICAgICAgIGlmKChhdG1wW2ldID49IGxpbWl0KXx8KGF0bXBbaV0gPD0gLWxpbWl0KSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2ldID0gKChfVU5TSUdORURfVChUWVBFKSlhdG1wW2ldID4+IGxhbmVzaXplXzEgKSArICgoVFlQRSkxIDw8IGxhbmVzaXplXzEpIC0gMTsgXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHJlc1tpXSA9IGF0bXBbaV0gPDwgYnRtcFtpXTsgfX19fSBcCisgICAgICAgIHJldHVybiBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopcmVzKTsKKworI2RlZmluZSBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9VTlNJR05FRChUWVBFLCBMRU5NQVgsIExFTikgXAorICAgICAgICBfTkVPTjJTU0VfQUxJR05fMTYgX1VOU0lHTkVEX1QoVFlQRSkgYXRtcFtMRU5NQVhdLCByZXNbTEVOTUFYXTsgX05FT04yU1NFX0FMSUdOXzE2IFRZUEUgYnRtcFtMRU5NQVhdOyBfVU5TSUdORURfVChUWVBFKSBsaW1pdDsgaW50IGk7IFwKKyAgICAgICAgaW50IGxhbmVzaXplID0gKHNpemVvZihUWVBFKSA8PCAzKTsgXAorICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOyBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWJ0bXAsIGIpOyBcCisgICAgICAgIGZvciAoaSA9IDA7IGk8TEVOOyBpKyspIHsgXAorICAgICAgICBpZiAoYXRtcFtpXSA9PTApIHtyZXNbaV0gPSAwOyBcCisgICAgICAgIH1lbHNleyBcCisgICAgICAgICAgICBpZihidG1wW2ldIDwgMCkgcmVzW2ldID0gKGJ0bXBbaV0gPCAoLWxhbmVzaXplKSkgPyAwIDogKGF0bXBbaV0gPj4gKC1idG1wW2ldKSkgKyAoIChhdG1wW2ldICYgKChUWVBFKTEgPDwgKC1idG1wW2ldIC0gMSkpKSA+PiAoLWJ0bXBbaV0gLSAxKSApOyBcCisgICAgICAgICAgICBlbHNleyBcCisgICAgICAgICAgICAgICAgaWYgKGJ0bXBbaV0+bGFuZXNpemUpIHJlc1tpXSA9IH4oKFRZUEUpMCk7IFwKKyAgICAgICAgICAgICAgICBlbHNleyBcCisgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gKFRZUEUpIDEgPDwgKGxhbmVzaXplIC0gYnRtcFtpXSk7IFwKKyAgICAgICAgICAgICAgICAgICAgcmVzW2ldID0gKCBhdG1wW2ldID49IGxpbWl0KSA/IHJlc1tpXSA9IH4oKFRZUEUpMCkgOiBhdG1wW2ldIDw8IGJ0bXBbaV07IH19fX0gXAorICAgICAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7CisKKyNkZWZpbmUgU0VSSUFMX1NBVFVSQVRJTkdfUk9VTkRJTkdfU0hJRlRfU0lHTkVEXzY0KFRZUEUsIExFTikgXAorICAgICAgICBfX202NF8xMjggcmVzOyBpbnQgIyMgVFlQRSAjIyBfdCBsaW1pdDsgaW50IGk7IFwKKyAgICAgICAgaW50IGxhbmVzaXplXzEgPSAoc2l6ZW9mKGludCAjIyBUWVBFICMjIF90ICkgPDwgMykgLSAxOyBcCisgICAgICAgIGZvciAoaSA9IDA7IGk8TEVOOyBpKyspIHsgXAorICAgICAgICBpZiAoYS5tNjRfaSAjIyBUWVBFW2ldID09MCkgcmVzLm02NF9pICMjIFRZUEVbaV0gPSAwOyBcCisgICAgICAgIGVsc2V7IFwKKyAgICAgICAgICAgIGlmKGIubTY0X2kgIyMgVFlQRVtpXSA8MCkgcmVzLm02NF9pICMjIFRZUEVbaV0gPSAoYi5tNjRfaSAjIyBUWVBFW2ldIDwgKC1sYW5lc2l6ZV8xKSkgPyAwIDogKGEubTY0X2kgIyMgVFlQRVtpXSA+PiAoLShiLm02NF9pICMjIFRZUEVbaV0pKSkgKyAoIChhLm02NF9pICMjIFRZUEVbaV0gJiAoKGludCAjIyBUWVBFICMjIF90ICkgMSA8PCAoLShiLm02NF9pICMjIFRZUEVbaV0pIC0gMSkpKSA+PiAoLShiLm02NF9pICMjIFRZUEVbaV0pIC0gMSkgKTsgXAorICAgICAgICAgICAgZWxzZXsgXAorICAgICAgICAgICAgICAgIGlmIChiLm02NF9pICMjIFRZUEVbaV0+bGFuZXNpemVfMSkgeyBcCisgICAgICAgICAgICAgICAgICAgIHJlcy5tNjRfaSAjIyBUWVBFW2ldID0gKChfVU5TSUdORURfVChpbnQgIyMgVFlQRSAjIyBfdCApKWEubTY0X2kgIyMgVFlQRVtpXSA+PiBsYW5lc2l6ZV8xICkgKyAoKGludCAjIyBUWVBFICMjIF90ICkgMSA8PCBsYW5lc2l6ZV8xKSAtIDE7IFwKKyAgICAgICAgICAgICAgICB9ZWxzZXsgXAorICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IChpbnQgIyMgVFlQRSAjIyBfdCApIDEgPDwgKGxhbmVzaXplXzEgLSBiLm02NF9pICMjIFRZUEVbaV0pOyBcCisgICAgICAgICAgICAgICAgICAgIGlmKChhLm02NF9pICMjIFRZUEVbaV0gPj0gbGltaXQpfHwoYS5tNjRfaSAjIyBUWVBFW2ldIDw9IC1saW1pdCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5tNjRfaSAjIyBUWVBFW2ldID0gKChfVU5TSUdORURfVChpbnQgIyMgVFlQRSAjIyBfdCApKWEubTY0X2kgIyMgVFlQRVtpXSA+PiBsYW5lc2l6ZV8xICkgKyAoKGludCAjIyBUWVBFICMjIF90ICkgMSA8PCBsYW5lc2l6ZV8xKSAtIDE7IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSByZXMubTY0X2kgIyMgVFlQRVtpXSA9IGEubTY0X2kgIyMgVFlQRVtpXSA8PCBiLm02NF9pICMjIFRZUEVbaV07IH19fX0gXAorICAgICAgICByZXR1cm4gcmVzOworCisjZGVmaW5lIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1VOU0lHTkVEXzY0KFRZUEUsIExFTikgXAorICAgICAgICBfX202NF8xMjggcmVzOyBfVU5TSUdORURfVChpbnQgIyMgVFlQRSAjIyBfdCkgbGltaXQ7IGludCBpOyBcCisgICAgICAgIGludCBsYW5lc2l6ZSA9IChzaXplb2YoaW50ICMjIFRZUEUgIyMgX3QpIDw8IDMpOyBcCisgICAgICAgIGZvciAoaSA9IDA7IGk8TEVOOyBpKyspIHsgXAorICAgICAgICBpZiAoYS5tNjRfdSAjIyBUWVBFW2ldID09MCkge3Jlcy5tNjRfdSAjIyBUWVBFW2ldID0gMDsgXAorICAgICAgICB9ZWxzZXsgXAorICAgICAgICAgICAgaWYoYi5tNjRfaSAjIyBUWVBFW2ldIDwgMCkgcmVzLm02NF91ICMjIFRZUEVbaV0gPSAoYi5tNjRfaSAjIyBUWVBFW2ldIDwgKC1sYW5lc2l6ZSkpID8gMCA6IChhLm02NF91ICMjIFRZUEVbaV0gPj4gKC0oYi5tNjRfaSAjIyBUWVBFW2ldKSkpICsgKCAoYS5tNjRfdSAjIyBUWVBFW2ldICYgKChpbnQgIyMgVFlQRSAjIyBfdCkgMSA8PCAoLShiLm02NF9pICMjIFRZUEVbaV0pIC0gMSkpKSA+PiAoLShiLm02NF9pICMjIFRZUEVbaV0pIC0gMSkgKTsgXAorICAgICAgICAgICAgZWxzZXsgXAorICAgICAgICAgICAgICAgIGlmIChiLm02NF9pICMjIFRZUEVbaV0+bGFuZXNpemUpIHJlcy5tNjRfdSAjIyBUWVBFW2ldID0gfigoaW50ICMjIFRZUEUgIyMgX3QpIDApOyBcCisgICAgICAgICAgICAgICAgZWxzZXsgXAorICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IChpbnQgIyMgVFlQRSAjIyBfdCkgMSA8PCAobGFuZXNpemUgLSBiLm02NF9pICMjIFRZUEVbaV0pOyBcCisgICAgICAgICAgICAgICAgICAgIHJlcy5tNjRfdSAjIyBUWVBFW2ldID0gKCBhLm02NF91ICMjIFRZUEVbaV0gPj0gbGltaXQpID8gcmVzLm02NF91ICMjIFRZUEVbaV0gPSB+KChpbnQgIyMgVFlQRSAjIyBfdCkgMCkgOiBhLm02NF91ICMjIFRZUEVbaV0gPDwgYi5tNjRfaSAjIyBUWVBFW2ldOyB9fX19IFwKKyAgICAgICAgcmV0dXJuIHJlczsKKworaW50OHg4X3QgdnFyc2hsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUVJTSEwuUzggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50OHg4X3QgdnFyc2hsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9TSUdORURfNjQoOCw4KQorfQorCitpbnQxNng0X3QgdnFyc2hsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUVJTSEwuUzE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDE2eDRfdCB2cXJzaGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1NJR05FRF82NCgxNiw0KQorfQorCitpbnQzMngyX3QgdnFyc2hsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUVJTSEwuUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDJfdCB2cXJzaGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1NJR05FRF82NCgzMiwyKQorfQorCitpbnQ2NHgxX3QgdnFyc2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWUVJTSEwuUzY0IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDFfdCB2cXJzaGxfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1NJR05FRF82NCg2NCwxKQorfQorCit1aW50OHg4X3QgdnFyc2hsX3U4KHVpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlFSU0hMLlU4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ4eDhfdCB2cXJzaGxfdTgodWludDh4OF90IGEsIGludDh4OF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9VTlNJR05FRF82NCg4LDgpCit9CisKK3VpbnQxNng0X3QgdnFyc2hsX3UxNih1aW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlFSU0hMLnMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MTZ4NF90IHZxcnNobF91MTYodWludDE2eDRfdCBhLCBpbnQxNng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1VOU0lHTkVEXzY0KDE2LDQpCit9CisKK3VpbnQzMngyX3QgdnFyc2hsX3UzMih1aW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlFSU0hMLlUzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MzJ4Ml90IHZxcnNobF91MzIodWludDMyeDJfdCBhLCBpbnQzMngyX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1VOU0lHTkVEXzY0KDMyLDIpCit9CisKK3VpbnQ2NHgxX3QgdnFyc2hsX3U2NCh1aW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlFSU0hMLlU2NCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50NjR4MV90IHZxcnNobF91NjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1VOU0lHTkVEXzY0KDY0LDEpCit9CisKK2ludDh4MTZfdCB2cXJzaGxxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZRUlNITC5TOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ4eDE2X3QgdnFyc2hscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9TSUdORUQoaW50OF90LCAxNiwgMTYpCit9CisKK2ludDE2eDhfdCB2cXJzaGxxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUVJTSEwuUzE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDE2eDhfdCB2cXJzaGxxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9TSUdORUQoaW50MTZfdCwgOCwgOCkKK30KKworaW50MzJ4NF90IHZxcnNobHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZRUlNITC5TMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4NF90IHZxcnNobHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1NJR05FRChpbnQzMl90LCA0LCA0KQorfQorCitpbnQ2NHgyX3QgdnFyc2hscV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlFSU0hMLlM2NCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgyX3QgdnFyc2hscV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfUk9VTkRJTkdfU0hJRlRfU0lHTkVEKGludDY0X3QsIDIsIDIpCit9CisKK3VpbnQ4eDE2X3QgdnFyc2hscV91OCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlFSU0hMLlU4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ4eDE2X3QgdnFyc2hscV91OCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfUk9VTkRJTkdfU0hJRlRfVU5TSUdORUQoaW50OF90LCAxNiwgMTYpCit9CisKK3VpbnQxNng4X3QgdnFyc2hscV91MTYodWludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZRUlNITC5zMTYgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDE2eDhfdCB2cXJzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfUk9VTkRJTkdfU0hJRlRfVU5TSUdORUQoaW50MTZfdCwgOCwgOCkKK30KKwordWludDMyeDRfdCB2cXJzaGxxX3UzMih1aW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlFSU0hMLlUzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MzJ4NF90IHZxcnNobHFfdTMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9VTlNJR05FRChpbnQzMl90LCA0LCA0KQorfQorCit1aW50NjR4Ml90IHZxcnNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWUVJTSEwuVTY0IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ2NHgyX3QgdnFyc2hscV91NjQodWludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1VOU0lHTkVEKGludDY0X3QsIDIsIDIpCit9CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFNoaWZ0cyBieSBhIGNvbnN0YW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKiBWZWN0b3Igc2hpZnQgcmlnaHQgYnkgY29uc3RhbnQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdnNocl9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlNIUi5TOCBkMCxkMCwjOAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2c2hyX25fczgoaW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpIC8vIFZTSFIuUzggZDAsZDAsIzgKK3sKKyAgICAvL25vIDggYml0IHNoaWZ0IGF2YWlsYWJsZSwgZ28gdG8gMTYgYml0CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByOworICAgIHIgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vU1NFIDQuMQorICAgIHIgPSBfbW1fc3JhaV9lcGkxNiAociwgYik7IC8vU1NFMgorICAgIHIgPSBfbW1fcGFja3NfZXBpMTYgKHIscik7IC8vd2UgbmVlZCA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyKTsKK30KKworaW50MTZ4NF90IHZzaHJfbl9zMTYoaW50MTZ4NF90IGEsICBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWU0hSLlMxNiBkMCxkMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZzaHJfbl9zMTYoaW50MTZ4NF90IGEsICBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9zcmFpX2VwaTE2KF9wTTEyOGkoYSksIGIpKTsKK30KKworCitpbnQzMngyX3QgdnNocl9uX3MzMihpbnQzMngyX3QgYSwgIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZTSFIuUzMyIGQwLGQwLCMzMgorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnNocl9uX3MzMihpbnQzMngyX3QgYSwgIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX3NyYWlfZXBpMzIoX3BNMTI4aShhKSwgYikpOworfQorCitpbnQ2NHgxX3QgdnNocl9uX3M2NChpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKTsgLy8gVlNIUi5TNjQgZDAsZDAsIzY0CitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDFfdCB2c2hyX25fczY0KGludDY0eDFfdCBhLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vbm8gYXJpdGhtZXRpYyBzaGlmdCBmb3IgNjRiaXQgdmFsdWVzLCBzZXJpYWwgc29sdXRpb24gdXNlZAorICAgIGludDY0eDFfdCByZXM7CisgICAgaWYoYj49NjQpIHJlcy5tNjRfaTY0WzBdID0gMDsKKyAgICBlbHNlIHJlcy5tNjRfaTY0WzBdID0gKCooaW50NjRfdCopJmEpID4+IGI7CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDh4OF90IHZzaHJfbl91OCh1aW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWU0hSLlU4IGQwLGQwLCM4CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2c2hyX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWU0hSLlU4IGQwLGQwLCM4Cit7CisgICAgLy9ubyA4IGJpdCBzaGlmdCBhdmFpbGFibGUsIGdvIHRvIDE2IGJpdAorICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHI7CisgICAgciA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGEpKTsgLy9TU0UgNC4xCisgICAgciA9IF9tbV9zcmxpX2VwaTE2IChyLCBiKTsgLy9mb3IgdW5zaWduZWQgdmFyaWFibGVzIHdlIHVzZSB0aGUgbG9naWNhbCBzaGlmdCBub3QgYXJpdGhtZXRpY2FsIG9uZQorICAgIHIgPSBfbW1fcGFja3VzX2VwaTE2IChyLHIpOyAvL3dlIG5lZWQgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocik7Cit9CisKK3VpbnQxNng0X3QgdnNocl9uX3UxNih1aW50MTZ4NF90IGEsICBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWU0hSLnMxNiBkMCxkMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2c2hyX25fdTE2KHVpbnQxNng0X3QgYSwgIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYikKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9zcmxpX2VwaTE2KF9wTTEyOGkoYSksIGIpKTsKK30KKworCit1aW50MzJ4Ml90IHZzaHJfbl91MzIodWludDMyeDJfdCBhLCAgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlNIUi5VMzIgZDAsZDAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnNocl9uX3UzMih1aW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fc3JsaV9lcGkzMihfcE0xMjhpKGEpLCBiKSk7Cit9CisKKwordWludDY0eDFfdCB2c2hyX25fdTY0KHVpbnQ2NHgxX3QgYSwgIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYik7IC8vIFZTSFIuVTY0IGQwLGQwLCM2NAorX05FT04yU1NFX0lOTElORSB1aW50NjR4MV90IHZzaHJfbl91NjQodWludDY0eDFfdCBhLCAgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKQoreworICAgIHVpbnQ2NHgxX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX3NybGlfZXBpNjQoX3BNMTI4aShhKSwgYikpOworfQorCisKK2ludDh4MTZfdCB2c2hycV9uX3M4KGludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZTSFIuUzggcTAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZzaHJxX25fczgoaW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWU0hSLlM4IHEwLHEwLCM4Cit7CisgICAgLy9ubyA4IGJpdCBzaGlmdCBhdmFpbGFibGUsIGdvIHRvIDE2IGJpdCB0cmljaworICAgIF9fbTEyOGkgemVybywgbWFzazAsIGFfc2lnbiwgciwgYV9zaWduX21hc2s7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDE2X3QgbWFzazBfMTZbOV0gPSB7MHgwMDAwLCAweDAwODAsIDB4MDBjMCwgMHgwMGUwLCAweDAwZjAsICAweDAwZjgsIDB4MDBmYywgMHgwMGZlLCAweDAwZmZ9OworICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIG1hc2swID0gX21tX3NldDFfZXBpMTYobWFzazBfMTZbYl0pOyAvL3RvIG1hc2sgdGhlIGJpdHMgdG8gYmUgInNwb2lsZWQiICBieSAxNiBiaXQgc2hpZnQKKyAgICBhX3NpZ24gPSAgX21tX2NtcGd0X2VwaTggKHplcm8sIGEpOyAvL2ZmIGlmIGE8MCBvciB6ZXJvIGlmIGE+MAorICAgIHIgPSBfbW1fc3JhaV9lcGkxNiAoYSwgYik7CisgICAgYV9zaWduX21hc2sgPSAgX21tX2FuZF9zaTEyOCAobWFzazAsIGFfc2lnbik7CisgICAgciA9ICBfbW1fYW5kbm90X3NpMTI4IChtYXNrMCwgcik7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAociwgYV9zaWduX21hc2spOworfQorCitpbnQxNng4X3QgdnNocnFfbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZTSFIuUzE2IHEwLHEwLCMxNgorI2RlZmluZSB2c2hycV9uX3MxNiBfbW1fc3JhaV9lcGkxNgorCitpbnQzMng0X3QgdnNocnFfbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZTSFIuUzMyIHEwLHEwLCMzMgorI2RlZmluZSB2c2hycV9uX3MzMiBfbW1fc3JhaV9lcGkzMgorCitpbnQ2NHgyX3QgdnNocnFfbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYik7IC8vIFZTSFIuUzY0IHEwLHEwLCM2NAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgdnNocnFfbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYikKK3sKKyAgICAvL1NJTUQgaW1wbGVtZW50YXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsIGR1ZSB0byA2NCBiaXQgYXJpdGhtZXRpYyBzaGlmdCBhYnNlbnNlIGluIHg4NiBTSU1ECisgICAgX19tMTI4aSBjMSwgc2lnbm1hc2ssYTAsICByZXM2NDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDY0X3QgbWFza1tdID0gezB4ODAwMDAwMDAwMDAwMDAwMCwgMHg4MDAwMDAwMDAwMDAwMDAwfTsKKyAgICBjMSA9ICBfbW1fY21wZXFfZXBpMzIoYSxhKTsgLy8weGZmZmZmZmZmZmZmZmZmZmYKKyAgICBzaWdubWFzayAgPSAgX21tX3NsbGlfZXBpNjQgKGMxLCAoNjQgLSBiKSk7CisgICAgYTAgPSBfbW1fb3Jfc2kxMjgoYSwgKihfX20xMjhpKiltYXNrKTsgLy9nZXQgdGhlIGZpcnN0IGJpdAorICAgIGEwID0gX01NX0NNUEVRX0VQSTY0IChhLCBhMCk7CisgICAgc2lnbm1hc2sgPSBfbW1fYW5kX3NpMTI4KGEwLCBzaWdubWFzayk7CisgICAgcmVzNjQgPSBfbW1fc3JsaV9lcGk2NCAoYSwgYik7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChyZXM2NCwgc2lnbm1hc2spOworfQorCit1aW50OHgxNl90IHZzaHJxX25fdTgodWludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZTSFIuVTggcTAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2c2hycV9uX3U4KHVpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpIC8vIFZTSFIuVTggcTAscTAsIzgKK3sKKyAgICAvL25vIDggYml0IHNoaWZ0IGF2YWlsYWJsZSwgbmVlZCB0aGUgc3BlY2lhbCB0cmljaworICAgIF9fbTEyOGkgbWFzazAsIHI7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQxNl90IG1hc2sxMF8xNls5XSA9IHsweGZmZmYsIDB4ZmY3ZiwgMHhmZjNmLCAweGZmMWYsIDB4ZmYwZiwgIDB4ZmYwNywgMHhmZjAzLCAweGZmMDEsIDB4ZmYwMH07CisgICAgbWFzazAgPSBfbW1fc2V0MV9lcGkxNihtYXNrMTBfMTZbYl0pOyAvL3RvIG1hc2sgdGhlIGJpdHMgdG8gYmUgInNwb2lsZWQiICBieSAxNiBiaXQgc2hpZnQKKyAgICByID0gX21tX3NybGlfZXBpMTYgKCBhLCBiKTsKKyAgICByZXR1cm4gX21tX2FuZF9zaTEyOCAociwgIG1hc2swKTsKK30KKwordWludDE2eDhfdCB2c2hycV9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZTSFIuczE2IHEwLHEwLCMxNgorI2RlZmluZSB2c2hycV9uX3UxNiBfbW1fc3JsaV9lcGkxNgorCit1aW50MzJ4NF90IHZzaHJxX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlNIUi5VMzIgcTAscTAsIzMyCisjZGVmaW5lIHZzaHJxX25fdTMyIF9tbV9zcmxpX2VwaTMyCisKK3VpbnQ2NHgyX3QgdnNocnFfbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpOyAvLyBWU0hSLlU2NCBxMCxxMCwjNjQKKyNkZWZpbmUgdnNocnFfbl91NjQgX21tX3NybGlfZXBpNjQKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogVmVjdG9yIHNoaWZ0IGxlZnQgYnkgY29uc3RhbnQgKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZzaGxfbl9zOChpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZTSEwuSTggZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnNobF9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKSAvLyBWU0hMLkk4IGQwLGQwLCMwCit7CisgICAgLy9ubyA4IGJpdCBzaGlmdCBhdmFpbGFibGUsIGdvIHRvIDE2IGJpdAorICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzE2X2V2ZW5fb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSB9OworICAgIHIgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vU1NFIDQuMQorICAgIHIgPSBfbW1fc2xsaV9lcGkxNiAociwgYik7IC8vU1NFMgorICAgIHIgPSBfbW1fc2h1ZmZsZV9lcGk4IChyLCAqKF9fbTEyOGkqKSBtYXNrOF8xNl9ldmVuX29kZCk7IC8vcmV0dXJuIHRvIDggYml0LCB3ZSBuZWVkIDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIpOworfQorCitpbnQxNng0X3QgdnNobF9uX3MxNihpbnQxNng0X3QgYSwgIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYik7IC8vIFZTSEwuSTE2IGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2c2hsX25fczE2KGludDE2eDRfdCBhLCAgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fc2xsaV9lcGkxNihfcE0xMjhpKGEpLCBiKSk7Cit9CisKKworaW50MzJ4Ml90IHZzaGxfbl9zMzIoaW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWU0hMLkkzMiBkMCxkMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnNobF9uX3MzMihpbnQzMngyX3QgYSwgIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX3NsbGlfZXBpMzIoX3BNMTI4aShhKSwgYikpOworfQorCisKK2ludDY0eDFfdCB2c2hsX25fczY0KGludDY0eDFfdCBhLCAgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlNITC5JNjQgZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4MV90IHZzaGxfbl9zNjQoaW50NjR4MV90IGEsICBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpCit7CisgICAgaW50NjR4MV90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9zbGxpX2VwaTY0KF9wTTEyOGkoYSksIGIpKTsKK30KKworCit1aW50OHg4X3QgdnNobF9uX3U4KHVpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZTSEwuSTggZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZzaGxfbl91OCh1aW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpCit7CisgICAgLy9ubyA4IGJpdCBzaGlmdCBhdmFpbGFibGUsIGdvIHRvIDE2IGJpdAorICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIG1hc2s4OworICAgIF9fbTEyOGkgcjsKKyAgICBtYXNrOCA9IF9tbV9zZXQxX2VwaTE2KDB4ZmYpOworICAgIHIgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vU1NFIDQuMQorICAgIHIgPSBfbW1fc2xsaV9lcGkxNiAociwgYik7IC8vU1NFMgorICAgIHIgPSBfbW1fYW5kX3NpMTI4KHIsIG1hc2s4KTsgLy90byBhdm9pZCBzYXR1cmF0aW9uCisgICAgciA9IF9tbV9wYWNrdXNfZXBpMTYgKHIscik7IC8vd2UgbmVlZCA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyKTsKK30KKwordWludDE2eDRfdCB2c2hsX25fdTE2KHVpbnQxNng0X3QgYSwgIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYik7IC8vIFZTSEwuSTE2IGQwLGQwLCMwCisjZGVmaW5lIHZzaGxfbl91MTYgdnNobF9uX3MxNgorCisKK3VpbnQzMngyX3QgdnNobF9uX3UzMih1aW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWU0hMLkkzMiBkMCxkMCwjMAorI2RlZmluZSB2c2hsX25fdTMyIHZzaGxfbl9zMzIKKwordWludDY0eDFfdCB2c2hsX25fdTY0KHVpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlNITC5JNjQgZDAsZDAsIzAKKyNkZWZpbmUgdnNobF9uX3U2NCB2c2hsX25fczY0CisKK2ludDh4MTZfdCB2c2hscV9uX3M4KGludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZTSEwuSTggcTAscTAsIzAKKyNkZWZpbmUgdnNobHFfbl9zOCB2c2hscV9uX3U4CisKK2ludDE2eDhfdCB2c2hscV9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlNITC5JMTYgcTAscTAsIzAKKyNkZWZpbmUgdnNobHFfbl9zMTYgX21tX3NsbGlfZXBpMTYKKworaW50MzJ4NF90IHZzaGxxX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWU0hMLkkzMiBxMCxxMCwjMAorI2RlZmluZSB2c2hscV9uX3MzMiBfbW1fc2xsaV9lcGkzMgorCitpbnQ2NHgyX3QgdnNobHFfbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYik7IC8vIFZTSEwuSTY0IHEwLHEwLCMwCisjZGVmaW5lIHZzaGxxX25fczY0IF9tbV9zbGxpX2VwaTY0CisKK3VpbnQ4eDE2X3QgdnNobHFfbl91OCh1aW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKTsgLy8gVlNITC5JOCBxMCxxMCwjMAorX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZzaGxxX25fdTgodWludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYikKK3sKKyAgICAvL25vIDggYml0IHNoaWZ0IGF2YWlsYWJsZSwgbmVlZCB0aGUgc3BlY2lhbCB0cmljaworICAgIF9fbTEyOGkgbWFzazAsIHI7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQxNl90IG1hc2sxMF8xNls5XSA9IHsweGZmZmYsIDB4ZmVmZiwgMHhmY2ZmLCAweGY4ZmYsIDB4ZjBmZiwgIDB4ZTBmZiwgMHhjMGZmLCAweDgwZmYsIDB4ZmZ9OworICAgIG1hc2swID0gX21tX3NldDFfZXBpMTYobWFzazEwXzE2W2JdKTsgLy90byBtYXNrIHRoZSBiaXRzIHRvIGJlICJzcG9pbGVkIiAgYnkgMTYgYml0IHNoaWZ0CisgICAgciA9IF9tbV9zbGxpX2VwaTE2ICggYSwgYik7CisgICAgcmV0dXJuIF9tbV9hbmRfc2kxMjggKHIsICBtYXNrMCk7Cit9CisKK3VpbnQxNng4X3QgdnNobHFfbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpOyAvLyBWU0hMLkkxNiBxMCxxMCwjMAorI2RlZmluZSB2c2hscV9uX3UxNiB2c2hscV9uX3MxNgorCit1aW50MzJ4NF90IHZzaGxxX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKTsgLy8gVlNITC5JMzIgcTAscTAsIzAKKyNkZWZpbmUgdnNobHFfbl91MzIgdnNobHFfbl9zMzIKKwordWludDY0eDJfdCB2c2hscV9uX3U2NCh1aW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYik7IC8vIFZTSEwuSTY0IHEwLHEwLCMwCisjZGVmaW5lIHZzaGxxX25fdTY0IHZzaGxxX25fczY0CisKKy8vKioqKioqKioqKioqKiBWZWN0b3Igcm91bmRpbmcgc2hpZnQgcmlnaHQgYnkgY29uc3RhbnQgKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vTm8gY29ycmVzcG9uZGluZyAgeDg2IGludHJpbnNpY3MgZXhpc3QsIG5lZWQgdG8gZG8gc29tZSB0cmlja3MKK2ludDh4OF90IHZyc2hyX25fczgoaW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUlNIUi5TOCBkMCxkMCwjOAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2cnNocl9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWUlNIUi5TOCBkMCxkMCwjOAoreworICAgIC8vbm8gOCBiaXQgc2hpZnQgYXZhaWxhYmxlLCBnbyB0byAxNiBiaXQKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHIsIG1hc2tiOworICAgIHIgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vU1NFIDQuMQorICAgIG1hc2tiID0gIF9tbV9zbGxpX2VwaTE2IChyLCAoMTYgLSBiKSk7IC8vdG8gZ2V0IHJvdW5kaW5nIChiLTEpdGggYml0CisgICAgbWFza2IgPSBfbW1fc3JsaV9lcGkxNiAobWFza2IsIDE1KTsgLy8xIG9yIDAKKyAgICByID0gX21tX3NyYWlfZXBpMTYgKHIsIGIpOworICAgIHIgPSBfbW1fYWRkX2VwaTE2IChyLCBtYXNrYik7IC8vYWN0dWFsIHJvdW5kaW5nCisgICAgciA9IF9tbV9wYWNrc19lcGkxNiAocixyKTsgLy8vL3dlIG5lZWQgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocik7Cit9CisKK2ludDE2eDRfdCB2cnNocl9uX3MxNihpbnQxNng0X3QgYSwgIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZSU0hSLlMxNiBkMCxkMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZyc2hyX25fczE2KGludDE2eDRfdCBhLCAgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2cnNocnFfbl9zMTYoX3BNMTI4aShhKSwgYikpOworfQorCisKK2ludDMyeDJfdCB2cnNocl9uX3MzMihpbnQzMngyX3QgYSwgIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZSU0hSLlMzMiBkMCxkMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZyc2hyX25fczMyKGludDMyeDJfdCBhLCAgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2cnNocnFfbl9zMzIoX3BNMTI4aShhKSwgYikpOworfQorCisKK2ludDY0eDFfdCB2cnNocl9uX3M2NChpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKTsgLy8gVlJTSFIuUzY0IGQwLGQwLCM2NAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgxX3QgdnJzaHJfbl9zNjQoaW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gaXMgZmFzdGVyCisgICAgaW50NjR4MV90IHJlczsKKyAgICBpbnQ2NF90IGFfaTY0ID0gKiggaW50NjRfdCopJmE7CisgICAgaWYoYj09NjQpIHsKKyAgICAgICAgcmVzLm02NF9pNjRbMF0gPSAwOyAvL2ZvciBzb21lIGNvbXBpbGVycyByb3VuZGluZyBoYXBwZW5zIGFuZCB3ZSBuZWVkIHRvIHVzZShhX2k2NCAmIF9TSUdOQklUNjQpPj42MzsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IG1hc2tiID0gYV9pNjQgJiAoKCBpbnQ2NF90KTEgPDwgKGIgLSAxKSk7CisgICAgICAgIHJlcy5tNjRfaTY0WzBdID0gKGFfaTY0ID4+IGIpICsgKG1hc2tiID4+IChiIC0gMSkpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHg4X3QgdnJzaHJfbl91OCh1aW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUlNIUi5VOCBkMCxkMCwjOAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnJzaHJfbl91OCh1aW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpIC8vIFZSU0hSLlU4IGQwLGQwLCM4Cit7CisgICAgLy9ubyA4IGJpdCBzaGlmdCBhdmFpbGFibGUsIGdvIHRvIDE2IGJpdCwgc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggdGhlIHNlcmlhbCBvbmUKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByLCBtYXNrYjsKKyAgICByID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvL1NTRSA0LjEKKyAgICBtYXNrYiA9ICBfbW1fc2xsaV9lcGkxNiAociwgKDE2IC0gYikpOyAvL3RvIGdldCByb3VuZGluZyAoYi0xKXRoIGJpdAorICAgIG1hc2tiID0gX21tX3NybGlfZXBpMTYgKG1hc2tiLCAxNSk7IC8vMSBvciAwCisgICAgciA9IF9tbV9zcmxpX2VwaTE2IChyLCBiKTsKKyAgICByID0gX21tX2FkZF9lcGkxNiAociwgbWFza2IpOyAvL2FjdHVhbCByb3VuZGluZworICAgIHIgPSAgX21tX3BhY2t1c19lcGkxNiAocixyKTsgLy8vL3dlIG5lZWQgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocik7Cit9CisKK3VpbnQxNng0X3QgdnJzaHJfbl91MTYodWludDE2eDRfdCBhLCAgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlJTSFIuczE2IGQwLGQwLCMxNgorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZyc2hyX25fdTE2KHVpbnQxNng0X3QgYSwgIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYikKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZyc2hycV9uX3UxNihfcE0xMjhpKGEpLCBiKSk7Cit9CisKKwordWludDMyeDJfdCB2cnNocl9uX3UzMih1aW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUlNIUi5VMzIgZDAsZDAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnJzaHJfbl91MzIodWludDMyeDJfdCBhLCAgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKQoreworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnJzaHJxX25fdTMyKF9wTTEyOGkoYSksIGIpKTsKK30KKworCit1aW50NjR4MV90IHZyc2hyX25fdTY0KHVpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKTsgLy8gVlJTSFIuVTY0IGQwLGQwLCM2NAorX05FT04yU1NFX0lOTElORSB1aW50NjR4MV90IHZyc2hyX25fdTY0KHVpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKQoreworICAgIHVpbnQ2NHgxX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnJzaHJxX25fdTY0KF9wTTEyOGkoYSksIGIpKTsKK30KKworaW50OHgxNl90IHZyc2hycV9uX3M4KGludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZSU0hSLlM4IHEwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCB2cnNocnFfbl9zOChpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpIC8vIFZSU0hSLlM4IHEwLHEwLCM4Cit7CisgICAgLy9ubyA4IGJpdCBzaGlmdCBhdmFpbGFibGUsIGdvIHRvIDE2IGJpdCB0cmljaworICAgIF9fbTEyOGkgciwgbWFzazEsIG1hc2tiOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50MTZfdCBtYXNrMmJbOV0gPSB7MHgwMDAwLCAweDAxMDEsIDB4MDIwMiwgMHgwNDA0LCAweDA4MDgsIDB4MTAxMCwgMHgyMDIwLCAweDQwNDAsIDB4ODA4MH07IC8vIDJeYi10aCBiaXQgc2V0IHRvIDEKKyAgICByID0gdnNocnFfbl9zOCAoYSwgYik7CisgICAgbWFzazEgPSBfbW1fc2V0MV9lcGkxNihtYXNrMmJbYl0pOyAvLyAyXmItdGggYml0IHNldCB0byAxIGZvciAxNmJpdCwgbmVlZCBpdCBmb3Igcm91bmRpbmcKKyAgICBtYXNrYiA9IF9tbV9hbmRfc2kxMjgoYSwgbWFzazEpOyAvL2dldCBiIG9yIDAgZm9yIHJvdW5kaW5nCisgICAgbWFza2IgPSAgX21tX3NybGlfZXBpMTYgKG1hc2tiLCBiIC0gMSk7IC8vIHRvIGFkZCAxCisgICAgcmV0dXJuIF9tbV9hZGRfZXBpOChyLCBtYXNrYik7IC8vYWN0dWFsIHJvdW5kaW5nCit9CisKK2ludDE2eDhfdCB2cnNocnFfbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZSU0hSLlMxNiBxMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZyc2hycV9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKSAvLyBWUlNIUi5TMTYgcTAscTAsIzE2Cit7CisgICAgX19tMTI4aSBtYXNrYiwgcjsKKyAgICBtYXNrYiA9ICBfbW1fc2xsaV9lcGkxNihhLCAoMTYgLSBiKSk7IC8vdG8gZ2V0IHJvdW5kaW5nIChiLTEpdGggYml0CisgICAgbWFza2IgPSBfbW1fc3JsaV9lcGkxNihtYXNrYiwgMTUpOyAvLzEgb3IgMAorICAgIHIgPSBfbW1fc3JhaV9lcGkxNiAoYSwgYik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYgKHIsIG1hc2tiKTsgLy9hY3R1YWwgcm91bmRpbmcKK30KKworaW50MzJ4NF90IHZyc2hycV9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlJTSFIuUzMyIHEwLHEwLCMzMgorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnJzaHJxX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpIC8vIFZSU0hSLlMzMiBxMCxxMCwjMzIKK3sKKyAgICBfX20xMjhpIG1hc2tiLCAgcjsKKyAgICBtYXNrYiA9IF9tbV9zbGxpX2VwaTMyIChhLCAoMzIgLSBiKSk7IC8vdG8gZ2V0IHJvdW5kaW5nIChiLTEpdGggYml0CisgICAgbWFza2IgPSBfbW1fc3JsaV9lcGkzMiAobWFza2IsMzEpOyAvLzEgb3IgMAorICAgIHIgPSBfbW1fc3JhaV9lcGkzMihhLCBiKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkzMiAociwgbWFza2IpOyAvL2FjdHVhbCByb3VuZGluZworfQorCitpbnQ2NHgyX3QgdnJzaHJxX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpOyAvLyBWUlNIUi5TNjQgcTAscTAsIzY0CitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2cnNocnFfbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYikKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIGEgc2VyaWFsIG9uZQorICAgIF9fbTEyOGkgbWFza2I7CisgICAgaW50NjR4Ml90IHI7CisgICAgbWFza2IgPSBfbW1fc2xsaV9lcGk2NCAoYSwgKDY0IC0gYikpOyAvL3RvIGdldCByb3VuZGluZyAoYi0xKXRoIGJpdAorICAgIG1hc2tiID0gX21tX3NybGlfZXBpNjQgKG1hc2tiLDYzKTsgLy8xIG9yIDAKKyAgICByID0gdnNocnFfbl9zNjQoYSwgYik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpNjQgKHIsIG1hc2tiKTsgLy9hY3R1YWwgcm91bmRpbmcKK30KKwordWludDh4MTZfdCB2cnNocnFfbl91OCh1aW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlJTSFIuVTggcTAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2cnNocnFfbl91OCh1aW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWUlNIUi5VOCBxMCxxMCwjOAoreworICAgIC8vbm8gOCBiaXQgc2hpZnQgYXZhaWxhYmxlLCBnbyB0byAxNiBiaXQgdHJpY2sKKyAgICBfX20xMjhpIHIsIG1hc2sxLCBtYXNrYjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDE2X3QgbWFzazJiWzldID0gezB4MDAwMCwgMHgwMTAxLCAweDAyMDIsIDB4MDQwNCwgMHgwODA4LCAweDEwMTAsIDB4MjAyMCwgMHg0MDQwLCAweDgwODB9OyAvLyAyXmItdGggYml0IHNldCB0byAxCisgICAgciA9IHZzaHJxX25fdTggKGEsIGIpOworICAgIG1hc2sxID0gX21tX3NldDFfZXBpMTYobWFzazJiW2JdKTsgLy8gMl5iLXRoIGJpdCBzZXQgdG8gMSBmb3IgMTZiaXQsIG5lZWQgaXQgZm9yIHJvdW5kaW5nCisgICAgbWFza2IgPSBfbW1fYW5kX3NpMTI4KGEsIG1hc2sxKTsgLy9nZXQgYiBvciAwIGZvciByb3VuZGluZworICAgIG1hc2tiID0gIF9tbV9zcmxpX2VwaTE2IChtYXNrYiwgYiAtIDEpOyAvLyB0byBhZGQgMQorICAgIHJldHVybiBfbW1fYWRkX2VwaTgociwgbWFza2IpOyAvL2FjdHVhbCByb3VuZGluZworfQorCit1aW50MTZ4OF90IHZyc2hycV9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZSU0hSLnMxNiBxMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2cnNocnFfbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpIC8vIFZSU0hSLlMxNiBxMCxxMCwjMTYKK3sKKyAgICBfX20xMjhpIG1hc2tiLCByOworICAgIG1hc2tiID0gIF9tbV9zbGxpX2VwaTE2KGEsICgxNiAtIGIpKTsgLy90byBnZXQgcm91bmRpbmcgKGItMSl0aCBiaXQKKyAgICBtYXNrYiA9IF9tbV9zcmxpX2VwaTE2KG1hc2tiLCAxNSk7IC8vMSBvciAwCisgICAgciA9IF9tbV9zcmxpX2VwaTE2IChhLCBiKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkxNiAociwgbWFza2IpOyAvL2FjdHVhbCByb3VuZGluZworfQorCit1aW50MzJ4NF90IHZyc2hycV9uX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZSU0hSLlUzMiBxMCxxMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2cnNocnFfbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpIC8vIFZSU0hSLlMzMiBxMCxxMCwjMzIKK3sKKyAgICBfX20xMjhpIG1hc2tiLCAgcjsKKyAgICBtYXNrYiA9IF9tbV9zbGxpX2VwaTMyIChhLCAoMzIgLSBiKSk7IC8vdG8gZ2V0IHJvdW5kaW5nIChiLTEpdGggYml0CisgICAgbWFza2IgPSBfbW1fc3JsaV9lcGkzMiAobWFza2IsMzEpOyAvLzEgb3IgMAorICAgIHIgPSBfbW1fc3JsaV9lcGkzMihhLCBiKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkzMiAociwgbWFza2IpOyAvL2FjdHVhbCByb3VuZGluZworfQorCit1aW50NjR4Ml90IHZyc2hycV9uX3U2NCh1aW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYik7IC8vIFZSU0hSLlU2NCBxMCxxMCwjNjQKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2cnNocnFfbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBhIHNlcmlhbCBvbmUKKyAgICBfX20xMjhpIG1hc2tiLCAgcjsKKyAgICBtYXNrYiA9IF9tbV9zbGxpX2VwaTY0IChhLCAoNjQgLSBiKSk7IC8vdG8gZ2V0IHJvdW5kaW5nIChiLTEpdGggYml0CisgICAgbWFza2IgPSBfbW1fc3JsaV9lcGk2NCAobWFza2IsNjMpOyAvLzEgb3IgMAorICAgIHIgPSBfbW1fc3JsaV9lcGk2NChhLCBiKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGk2NCAociwgbWFza2IpOyAvL2FjdHVhbCByb3VuZGluZworfQorCisvLyoqKioqKioqKioqKiogVmVjdG9yIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50IGFuZCBhY2N1bXVsYXRlICoqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZzcmFfbl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkEuUzggZDAsZDAsIzgKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnNyYV9uX3M4KGludDh4OF90IGEsIGludDh4OF90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKSAvLyBWU1JBLlM4IGQwLGQwLCM4Cit7CisgICAgaW50OHg4X3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2c2hyX25fczgoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRfczgoIGEsIHNoaWZ0KTsKK30KKworaW50MTZ4NF90IHZzcmFfbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWU1JBLlMxNiBkMCxkMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZzcmFfbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpIC8vIFZTUkEuUzE2IGQwLGQwLCMxNgoreworICAgIGludDE2eDRfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZzaHJfbl9zMTYoIGIsIGMpOworICAgIHJldHVybiB2YWRkX3MxNihhLCBzaGlmdCk7Cit9CisKK2ludDMyeDJfdCB2c3JhX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlNSQS5TMzIgZDAsZDAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2c3JhX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKSAvLyBWU1JBLlMzMiBkMCxkMCwjMzIKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHRoZSBzZXJpYWwgZXhlY3V0aW9uCisgICAgaW50MzJ4Ml90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnNocl9uX3MzMihiLCBjKTsKKyAgICByZXR1cm4gdmFkZF9zMzIoIGEsIHNoaWZ0KTsKK30KKworaW50NjR4MV90IHZzcmFfbl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWU1JBLlM2NCBkMCxkMCwjNjQKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4MV90IHZzcmFfbl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBhIHNlcmlhbCBzb2x1dGlvbgorICAgIGludDY0eDFfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZzaHJfbl9zNjQoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRfczY0KCBhLCBzaGlmdCk7Cit9CisKK3VpbnQ4eDhfdCB2c3JhX25fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkEuVTggZDAsZDAsIzgKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZzcmFfbl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKSAvLyBWU1JBLlU4IGQwLGQwLCM4Cit7CisgICAgdWludDh4OF90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnNocl9uX3U4KGIsIGMpOworICAgIHJldHVybiB2YWRkX3U4KGEsIHNoaWZ0KTsKK30KKwordWludDE2eDRfdCB2c3JhX25fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWU1JBLnMxNiBkMCxkMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2c3JhX25fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpIC8vIFZTUkEuczE2IGQwLGQwLCMxNgoreworICAgIHVpbnQxNng0X3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2c2hyX25fdTE2KGIsIGMpOworICAgIHJldHVybiB2YWRkX3UxNihhLHNoaWZ0KTsKK30KKwordWludDMyeDJfdCB2c3JhX25fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpOyAvLyBWU1JBLlUzMiBkMCxkMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2c3JhX25fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpIC8vIFZTUkEuVTMyIGQwLGQwLCMzMgoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggdGhlIHNlcmlhbCBleGVjdXRpb24KKyAgICB1aW50MzJ4Ml90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnNocl9uX3UzMihiLCBjKTsKKyAgICByZXR1cm4gdmFkZF91MzIoIGEsIHNoaWZ0KTsKK30KKwordWludDY0eDFfdCB2c3JhX25fdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWU1JBLlU2NCBkMCxkMCwjNjQKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDFfdCB2c3JhX25fdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpIC8vIFZTUkEuVTY0IGQwLGQwLCM2NAoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggdGhlIHNlcmlhbCBleGVjdXRpb24KKyAgICB1aW50NjR4MV90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnNocl9uX3U2NChiLCBjKTsKKyAgICByZXR1cm4gdmFkZF91NjQoYSwgc2hpZnQpOworfQorCitpbnQ4eDE2X3QgdnNyYXFfbl9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlNSQS5TOCBxMCxxMCwjOAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdnNyYXFfbl9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKSAvLyBWU1JBLlM4IHEwLHEwLCM4Cit7CisgICAgaW50OHgxNl90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnNocnFfbl9zOChiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfczgoYSwgc2hpZnQpOworfQorCitpbnQxNng4X3QgdnNyYXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWU1JBLlMxNiBxMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZzcmFxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKSAvLyBWU1JBLlMxNiBxMCxxMCwjMTYKK3sKKyAgICBpbnQxNng4X3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2c2hycV9uX3MxNihiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfczE2KGEsIHNoaWZ0KTsKK30KKworaW50MzJ4NF90IHZzcmFxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlNSQS5TMzIgcTAscTAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2c3JhcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYykgLy8gVlNSQS5TMzIgcTAscTAsIzMyCit7CisgICAgaW50MzJ4NF90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnNocnFfbl9zMzIoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3MzMihhLCBzaGlmdCk7Cit9CisKK2ludDY0eDJfdCB2c3JhcV9uX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZTUkEuUzY0IHEwLHEwLCM2NAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgdnNyYXFfbl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpIC8vIFZTUkEuUzY0IHEwLHEwLCM2NAoreworICAgIGludDY0eDJfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZzaHJxX25fczY0KGIsIGMpOworICAgIHJldHVybiB2YWRkcV9zNjQoIGEsIHNoaWZ0KTsKK30KKwordWludDh4MTZfdCB2c3JhcV9uX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkEuVTggcTAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2c3JhcV9uX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYykgLy8gVlNSQS5VOCBxMCxxMCwjOAoreworICAgIHVpbnQ4eDE2X3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2c2hycV9uX3U4KGIsIGMpOworICAgIHJldHVybiB2YWRkcV91OChhLCBzaGlmdCk7Cit9CisKK3VpbnQxNng4X3QgdnNyYXFfbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZTUkEuczE2IHEwLHEwLCMxNgorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZzcmFxX25fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpIC8vIFZTUkEuczE2IHEwLHEwLCMxNgoreworICAgIHVpbnQxNng4X3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2c2hycV9uX3UxNihiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfdTE2KGEsICBzaGlmdCk7Cit9CisKK3VpbnQzMng0X3QgdnNyYXFfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZTUkEuVTMyIHEwLHEwLCMzMgorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZzcmFxX25fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpIC8vIFZTUkEuVTMyIHEwLHEwLCMzMgoreworICAgIHVpbnQzMng0X3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2c2hycV9uX3UzMihiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfdTMyKGEsIHNoaWZ0KTsKK30KKwordWludDY0eDJfdCB2c3JhcV9uX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlNSQS5VNjQgcTAscTAsIzY0CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3QgdnNyYXFfbl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYykgLy8gVlNSQS5VNjQgcTAscTAsIzY0Cit7CisgICAgdWludDY0eDJfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZzaHJxX25fdTY0KGIsIGMpOworICAgIHJldHVybiB2YWRkcV91NjQoYSwgc2hpZnQpOworfQorCisvLyoqKioqKioqKioqKiogVmVjdG9yIHJvdW5kaW5nIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50IGFuZCBhY2N1bXVsYXRlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2cnNyYV9uX3M4KGludDh4OF90IGEsIGludDh4OF90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlJTUkEuUzggZDAsZDAsIzgKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnJzcmFfbl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYykgLy8gVlJTUkEuUzggZDAsZDAsIzgKK3sKKyAgICBpbnQ4eDhfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZyc2hyX25fczgoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRfczgoIGEsIHNoaWZ0KTsKK30KKworaW50MTZ4NF90IHZyc3JhX25fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlJTUkEuUzE2IGQwLGQwLCMxNgorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnJzcmFfbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpIC8vIFZSU1JBLlMxNiBkMCxkMCwjMTYKK3sKKyAgICBpbnQxNng0X3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2cnNocl9uX3MxNiggYiwgYyk7CisgICAgcmV0dXJuIHZhZGRfczE2KGEsIHNoaWZ0KTsKK30KKworaW50MzJ4Ml90IHZyc3JhX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlJTUkEuUzMyIGQwLGQwLCMzMgorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnJzcmFfbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpIC8vIFZSU1JBLlMzMiBkMCxkMCwjMzIKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHRoZSBzZXJpYWwgZXhlY3V0aW9uCisgICAgaW50MzJ4Ml90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnJzaHJfbl9zMzIoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRfczMyKCBhLCBzaGlmdCk7Cit9CisKK2ludDY0eDFfdCB2cnNyYV9uX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZSU1JBLlM2NCBkMCxkMCwjNjQKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4MV90IHZyc3JhX25fczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkgLy9zZXJpYWwgc29sdXRpb24KK3sKKyAgICBpbnQ2NHgxX3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2cnNocl9uX3M2NChiLCBjKTsKKyAgICByZXR1cm4gdmFkZF9zNjQoIGEsIHNoaWZ0KTsKK30KKwordWludDh4OF90IHZyc3JhX25fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZSU1JBLlU4IGQwLGQwLCM4CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2cnNyYV9uX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpIC8vIFZSU1JBLlU4IGQwLGQwLCM4Cit7CisgICAgdWludDh4OF90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnJzaHJfbl91OChiLCBjKTsKKyAgICByZXR1cm4gdmFkZF91OChhLCBzaGlmdCk7Cit9CisKK3VpbnQxNng0X3QgdnJzcmFfbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZSU1JBLnMxNiBkMCxkMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2cnNyYV9uX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKSAvLyBWUlNSQS5zMTYgZDAsZDAsIzE2Cit7CisgICAgdWludDE2eDRfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZyc2hyX25fdTE2KGIsIGMpOworICAgIHJldHVybiB2YWRkX3UxNihhLHNoaWZ0KTsKK30KKwordWludDMyeDJfdCB2cnNyYV9uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlJTUkEuVTMyIGQwLGQwLCMzMgorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZyc3JhX25fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpIC8vIFZSU1JBLlUzMiBkMCxkMCwjMzIKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHRoZSBzZXJpYWwgZXhlY3V0aW9uCisgICAgdWludDMyeDJfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZyc2hyX25fdTMyKGIsIGMpOworICAgIHJldHVybiB2YWRkX3UzMiggYSwgc2hpZnQpOworfQorCit1aW50NjR4MV90IHZyc3JhX25fdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWUlNSQS5VNjQgZDAsZDAsIzY0CitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ2NHgxX3QgdnJzcmFfbl91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpIC8vc2VyaWFsIHNvbHV0aW9uCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCB0aGUgc2VyaWFsIGV4ZWN1dGlvbgorICAgIHVpbnQ2NHgxX3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2cnNocl9uX3U2NChiLCBjKTsKKyAgICByZXR1cm4gdmFkZF91NjQoIGEsIHNoaWZ0KTsKK30KKworaW50OHgxNl90IHZyc3JhcV9uX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWUlNSQS5TOCBxMCxxMCwjOAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdnJzcmFxX25fczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYykgLy8gVlJTUkEuUzggcTAscTAsIzgKK3sKKyAgICBpbnQ4eDE2X3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2cnNocnFfbl9zOChiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfczgoYSwgc2hpZnQpOworfQorCitpbnQxNng4X3QgdnJzcmFxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlJTUkEuUzE2IHEwLHEwLCMxNgorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnJzcmFxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKSAvLyBWUlNSQS5TMTYgcTAscTAsIzE2Cit7CisgICAgaW50MTZ4OF90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnJzaHJxX25fczE2KGIsIGMpOworICAgIHJldHVybiB2YWRkcV9zMTYoYSwgc2hpZnQpOworfQorCitpbnQzMng0X3QgdnJzcmFxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlJTUkEuUzMyIHEwLHEwLCMzMgorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnJzcmFxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKSAvLyBWUlNSQS5TMzIgcTAscTAsIzMyCit7CisgICAgaW50MzJ4NF90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnJzaHJxX25fczMyKGIsIGMpOworICAgIHJldHVybiB2YWRkcV9zMzIoYSwgc2hpZnQpOworfQorCitpbnQ2NHgyX3QgdnJzcmFxX25fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlJTUkEuUzY0IHEwLHEwLCM2NAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgdnJzcmFxX25fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKQoreworICAgIGludDY0eDJfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZyc2hycV9uX3M2NChiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfczY0KGEsIHNoaWZ0KTsKK30KKwordWludDh4MTZfdCB2cnNyYXFfbl91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWUlNSQS5VOCBxMCxxMCwjOAorX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZyc3JhcV9uX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYykgLy8gVlJTUkEuVTggcTAscTAsIzgKK3sKKyAgICB1aW50OHgxNl90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnJzaHJxX25fdTgoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3U4KGEsIHNoaWZ0KTsKK30KKwordWludDE2eDhfdCB2cnNyYXFfbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZSU1JBLnMxNiBxMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2cnNyYXFfbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYykgLy8gVlJTUkEuczE2IHEwLHEwLCMxNgoreworICAgIHVpbnQxNng4X3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2cnNocnFfbl91MTYoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3UxNihhLCAgc2hpZnQpOworfQorCit1aW50MzJ4NF90IHZyc3JhcV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlJTUkEuVTMyIHEwLHEwLCMzMgorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZyc3JhcV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKSAvLyBWUlNSQS5VMzIgcTAscTAsIzMyCit7CisgICAgdWludDMyeDRfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZyc2hycV9uX3UzMihiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfdTMyKGEsIHNoaWZ0KTsKK30KKwordWludDY0eDJfdCB2cnNyYXFfbl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZSU1JBLlU2NCBxMCxxMCwjNjQKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2cnNyYXFfbl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYykKK3sKKyAgICB1aW50NjR4Ml90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnJzaHJxX25fdTY0KGIsIGMpOworICAgIHJldHVybiB2YWRkcV91NjQoYSwgc2hpZnQpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKipWZWN0b3Igc2F0dXJhdGluZyBzaGlmdCBsZWZ0IGJ5IGNvbnN0YW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL3dlIGRvbid0IGNoZWNrIGNvbnN0IHJhbmdlcyAgYXNzdW1pbmcgdGhleSBhcmUgbWV0CitpbnQ4eDhfdCB2cXNobF9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKTsgLy8gVlFTSEwuUzggZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnFzaGxfbl9zOChpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYikgLy8gVlFTSEwuUzggZDAsZDAsIzAKK3sKKyAgICAvL25vIDggYml0IHNoaWZ0IGF2YWlsYWJsZSBpbiBJQTMyIFNJTUQsIGdvIHRvIDE2IGJpdC4gSXQgYWxzbyBwcm92aWRlcyB0aGUgYXV0byBzYXR1cmF0aW9uIChpbiBwYWNrcyBmdW5jdGlvbikKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIGExMjgsIHIxMjg7CisgICAgYTEyOCA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGEpKTsgLy9TU0UgNC4xCisgICAgcjEyOCA9IF9tbV9zbGxpX2VwaTE2IChhMTI4LCBiKTsKKyAgICByMTI4ID0gX21tX3BhY2tzX2VwaTE2IChyMTI4LHIxMjgpOyAvL3NhdHVyYXRlZCBzOCwgdXNlIDY0IGxvdyBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMTI4KTsKK30KKworaW50MTZ4NF90IHZxc2hsX25fczE2KGludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpOyAvLyBWUVNITC5TMTYgZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZxc2hsX25fczE2KGludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpIC8vIFZRU0hMLlMxNiBkMCxkMCwjMAoreworICAgIC8vIGdvIHRvIDMyIGJpdCB0byBnZXQgdGhlIGF1dG8gc2F0dXJhdGlvbiAoaW4gcGFja3MgZnVuY3Rpb24pCisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgYTEyOCwgcjEyODsKKyAgICBhMTI4ID0gX01NX0NWVEVQSTE2X0VQSTMyIChfcE0xMjhpKGEpKTsgLy9TU0UgNC4xCisgICAgcjEyOCA9IF9tbV9zbGxpX2VwaTMyIChhMTI4LCBiKTsgLy9zaGlmdF9yZXMKKyAgICByMTI4ID0gX21tX3BhY2tzX2VwaTMyIChyMTI4LHIxMjgpOyAvL3NhdHVyYXRlZCBzMTYsIHVzZSA2NCBsb3cgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjEyOCk7Cit9CisKK2ludDMyeDJfdCB2cXNobF9uX3MzMihpbnQzMngyX3QgYSwgIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYik7IC8vIFZRU0hMLlMzMiBkMCxkMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnFzaGxfbl9zMzIoaW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpCit7CisgICAgLy9zZXJpYWwgZXhlY3V0aW9uIG1heSBiZSBmYXN0ZXIKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnFzaGxxX25fczMyIChfcE0xMjhpKGEpLCBiKSk7Cit9CisKKworaW50NjR4MV90IHZxc2hsX25fczY0KGludDY0eDFfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpOyAvLyBWUVNITC5TNjQgZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4MV90IHZxc2hsX25fczY0KGludDY0eDFfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vIG5vIGVmZmVjdGl2ZSBTSU1EIHNvbHV0aW9uIGhlcmUKKyAgICBpbnQ2NHgxX3QgcmVzOworICAgIGludDY0X3QgYm1hc2s7CisgICAgaW50NjRfdCBhX2k2NCA9ICooIGludDY0X3QqKSZhOworICAgIGJtYXNrID0gKCBpbnQ2NF90KTEgPDwgKDYzIC0gYik7IC8vcG9zaXRpdmUKKyAgICBpZiAoYV9pNjQgPj0gYm1hc2spIHsKKyAgICAgICAgcmVzLm02NF9pNjRbMF0gPSB+KF9TSUdOQklUNjQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcy5tNjRfaTY0WzBdICA9IChhX2k2NCA8PSAtYm1hc2spID8gX1NJR05CSVQ2NCA6IGFfaTY0IDw8IGI7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKwordWludDh4OF90IHZxc2hsX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKTsgLy8gVlFTSEwuVTggZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZxc2hsX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKSAvLyBWUVNITC5VOCBkMCxkMCwjMAoreworICAgIC8vbm8gOCBiaXQgc2hpZnQgYXZhaWxhYmxlIGluIElBMzIgU0lNRCwgZ28gdG8gMTYgYml0CisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYTEyOCwgcjEyODsKKyAgICBhMTI4ID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvL1NTRSA0LjEKKyAgICByMTI4ID0gX21tX3NsbGlfZXBpMTYgKGExMjgsIGIpOyAvL3NoaWZ0X3JlcworICAgIHIxMjggPSBfbW1fcGFja3VzX2VwaTE2IChyMTI4LHIxMjgpOyAvL3NhdHVyYXRlZCB1OCwgdXNlIDY0IGxvdyBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMTI4KTsKK30KKwordWludDE2eDRfdCB2cXNobF9uX3UxNih1aW50MTZ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYik7IC8vIFZRU0hMLnMxNiBkMCxkMCwjMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZxc2hsX25fdTE2KHVpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKSAvLyBWUVNITC5zMTYgZDAsZDAsIzAKK3sKKyAgICAvLyBnbyB0byAzMiBiaXQgdG8gZ2V0IHRoZSBhdXRvIHNhdHVyYXRpb24gKGluIHBhY2t1cyBmdW5jdGlvbikKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgYTEyOCwgcjEyODsKKyAgICBhMTI4ID0gX01NX0NWVEVQVTE2X0VQSTMyIChfcE0xMjhpKGEpKTsgLy9TU0UgNC4xCisgICAgcjEyOCA9IF9tbV9zbGxpX2VwaTMyIChhMTI4LCBiKTsgLy9zaGlmdF9yZXMKKyAgICByMTI4ID0gX01NX1BBQ0tVUzFfRVBJMzIgKHIxMjgpOyAvL3NhdHVyYXRlZCBzMTYKKyAgICByZXR1cm42NChyMTI4KTsKK30KKwordWludDMyeDJfdCB2cXNobF9uX3UzMih1aW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWUVNITC5VMzIgZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2cXNobF9uX3UzMih1aW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2cXNobHFfbl91MzIoX3BNMTI4aShhKSwgYikpOworfQorCit1aW50NjR4MV90IHZxc2hsX25fdTY0KHVpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlFTSEwuVTY0IGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ2NHgxX3QgdnFzaGxfbl91NjQodWludDY0eDFfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vIG5vIGVmZmVjdGl2ZSBTSU1EIHNvbHV0aW9uIGhlcmUKKyAgICB1aW50NjR4MV90IHJlczsKKyAgICB1aW50NjRfdCBibWFzazsKKyAgICB1aW50NjRfdCBhX2k2NCA9ICoodWludDY0X3QqKSZhOworICAgIGJtYXNrID0gKCB1aW50NjRfdCkxIDw8ICg2NCAtIGIpOworICAgIHJlcy5tNjRfdTY0WzBdID0gKGFfaTY0ID49IGJtYXNrKSYmKGI+MCkgPyAweGZmZmZmZmZmZmZmZmZmZmYgOiBhX2k2NCA8PCBiOyAvL2lmIGI9MCB3ZSBhcmUgZmluZSB3aXRoIGFueSBhCisgICAgcmV0dXJuIHJlczsKK30KKworaW50OHgxNl90IHZxc2hscV9uX3M4KGludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZRU0hMLlM4IHEwLHEwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCB2cXNobHFfbl9zOChpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpIC8vIFZRU0hMLlM4IHEwLHEwLCMwCit7CisgICAgLy8gZ28gdG8gMTYgYml0IHRvIGdldCB0aGUgYXV0byBzYXR1cmF0aW9uIChpbiBwYWNrcyBmdW5jdGlvbikKKyAgICBfX20xMjhpIGExMjgsIHIxMjhfMSwgcjEyOF8yOworICAgIGExMjggPSBfTU1fQ1ZURVBJOF9FUEkxNiAoYSk7IC8vU1NFIDQuMQorICAgIHIxMjhfMSA9IF9tbV9zbGxpX2VwaTE2IChhMTI4LCBiKTsKKyAgICAvL3N3YXAgaGkgYW5kIGxvdyBwYXJ0IG9mIGExMjggdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICBhMTI4ID0gX21tX3NodWZmbGVfZXBpMzIgKGEsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBhMTI4ID0gX01NX0NWVEVQSThfRVBJMTYgKGExMjgpOworICAgIHIxMjhfMiA9IF9tbV9zbGxpX2VwaTE2IChhMTI4LCBiKTsKKyAgICByZXR1cm4gX21tX3BhY2tzX2VwaTE2IChyMTI4XzEsIHIxMjhfMik7IC8vc2F0dXJhdGVkIHM4Cit9CisKK2ludDE2eDhfdCB2cXNobHFfbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYik7IC8vIFZRU0hMLlMxNiBxMCxxMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnFzaGxxX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpIC8vIFZRU0hMLlMxNiBxMCxxMCwjMAoreworICAgIC8vIG1hbnVhbCBzYXR1cmF0aW9uIHNvbHV0aW9uIGxvb2tzIExFU1Mgb3B0aW1hbCB0aGFuIDMyIGJpdHMgY29udmVyc2lvbiBvbmUKKyAgICAvLyBnbyB0byAzMiBiaXQgdG8gZ2V0IHRoZSBhdXRvIHNhdHVyYXRpb24gKGluIHBhY2tzIGZ1bmN0aW9uKQorICAgIF9fbTEyOGkgYTEyOCwgcjEyOF8xLCByMTI4XzI7CisgICAgYTEyOCA9IF9NTV9DVlRFUEkxNl9FUEkzMiAoYSk7IC8vU1NFIDQuMQorICAgIHIxMjhfMSA9IF9tbV9zbGxpX2VwaTMyIChhMTI4LCBiKTsgLy9zaGlmdF9yZXMKKyAgICAvL3N3YXAgaGkgYW5kIGxvdyBwYXJ0IG9mIGExMjggdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICBhMTI4ID0gX21tX3NodWZmbGVfZXBpMzIgKGEsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBhMTI4ID0gX01NX0NWVEVQSTE2X0VQSTMyIChhMTI4KTsKKyAgICByMTI4XzIgPSBfbW1fc2xsaV9lcGkzMiAoYTEyOCwgYik7CisgICAgcmV0dXJuIF9tbV9wYWNrc19lcGkzMiAocjEyOF8xLCByMTI4XzIpOyAvL3NhdHVyYXRlZCBzMTYKK30KKworaW50MzJ4NF90IHZxc2hscV9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKTsgLy8gVlFTSEwuUzMyIHEwLHEwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2cXNobHFfbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYikgLy8gVlFTSEwuUzMyIHEwLHEwLCMwCit7CisgICAgLy8gbm8gNjQgYml0IHNhdHVyYXRpb24gb3B0aW9uIGF2YWlsYWJsZSwgc3BlY2lhbCB0cmlja3MgbmVjZXNzYXJ5CisgICAgX19tMTI4aSBjMSwgbWFza0EsIHNhdHVyYXRpb25fbWFzaywgYzdmZmZmZmZfbWFzaywgc2hpZnRfcmVzLCBzaGlmdF9yZXNfbWFzazsKKyAgICBjMSA9IF9tbV9jbXBlcV9lcGkzMihhLGEpOyAvLzB4ZmYuLmZmCisgICAgbWFza0EgPSBfbW1fc3JsaV9lcGkzMihjMSwgYiArIDEpOyAvL21hc2sgZm9yIHBvc2l0aXZlIG51bWJlcnMgKDMyLWIrMSkgemVyb3MgYW5kIGItMSBvbmVzCisgICAgc2F0dXJhdGlvbl9tYXNrID0gX21tX2NtcGd0X2VwaTMyIChhLCBtYXNrQSk7IC8vMHhmZi4uLmZmIGlmIHdlIG5lZWQgc2F0dXJhdGlvbiwgMCAgb3RoZXJ3aXNlCisgICAgYzdmZmZmZmZfbWFzayAgPSBfbW1fc3JsaV9lcGkzMihzYXR1cmF0aW9uX21hc2ssIDEpOyAvL3NhdHVyYXRlZCB0byAweDdmLi5mZiB3aGVuIG5lZWRlZCBhbmQgemVyb3MgaWYgbm90CisgICAgc2hpZnRfcmVzID0gX21tX3NsbGlfZXBpMzIgKGEsIGIpOworICAgIHNoaWZ0X3Jlc19tYXNrID0gX21tX2FuZG5vdF9zaTEyOChzYXR1cmF0aW9uX21hc2ssIHNoaWZ0X3Jlcyk7CisgICAgLy9yZXN1bHQgd2l0aCBwb3NpdGl2ZSBudW1iZXJzIHNhdHVyYXRlZAorICAgIHNoaWZ0X3JlcyA9IF9tbV9vcl9zaTEyOCAoYzdmZmZmZmZfbWFzaywgc2hpZnRfcmVzX21hc2spOworICAgIC8vdHJlYXQgbmVnYXRpdmUgbnVtYmVycworICAgIG1hc2tBID0gX21tX3NsbGlfZXBpMzIoYzEsIDMxIC0gYik7IC8vbWFzayBmb3IgbmVnYXRpdmUgbnVtYmVycyBiLTEgb25lcyAgYW5kICgzMi1iKzEpICB6ZXJvcworICAgIHNhdHVyYXRpb25fbWFzayA9IF9tbV9jbXBndF9lcGkzMiAobWFza0EsYSk7IC8vMHhmZi4uLmZmIGlmIHdlIG5lZWQgc2F0dXJhdGlvbiwgMCAgb3RoZXJ3aXNlCisgICAgYzdmZmZmZmZfbWFzayAgPSBfbW1fc2xsaV9lcGkzMihzYXR1cmF0aW9uX21hc2ssIDMxKTsgLy9zYXR1cmF0ZWQgdG8gMHg4MC4uMDAgd2hlbiBuZWVkZWQgYW5kIHplcm9zIGlmIG5vdAorICAgIHNoaWZ0X3Jlc19tYXNrID0gX21tX2FuZG5vdF9zaTEyOChzYXR1cmF0aW9uX21hc2ssIHNoaWZ0X3Jlcyk7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYzdmZmZmZmZfbWFzaywgc2hpZnRfcmVzX21hc2spOworfQorCitpbnQ2NHgyX3QgdnFzaGxxX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpOyAvLyBWUVNITC5TNjQgcTAscTAsIzAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4Ml90IHZxc2hscV9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvLyBubyBlZmZlY3RpdmUgU0lNRCBzb2x1dGlvbiBoZXJlCisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDY0X3QgYXRtcFsyXSwgcmVzWzJdOworICAgIGludDY0X3QgYm1hc2s7CisgICAgaW50IGk7CisgICAgYm1hc2sgPSAoIGludDY0X3QpMSA8PCAoNjMgLSBiKTsgLy9wb3NpdGl2ZQorICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYXRtcCwgYSk7CisgICAgZm9yIChpID0gMDsgaTwyOyBpKyspIHsKKyAgICAgICAgaWYgKGF0bXBbaV0gPj0gYm1hc2spIHsKKyAgICAgICAgICAgIHJlc1tpXSA9IH4oX1NJR05CSVQ2NCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNbaV0gPSAoYXRtcFtpXSA8PSAtYm1hc2spID8gX1NJR05CSVQ2NCA6IGF0bXBbaV0gPDwgYjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7Cit9CisKK3VpbnQ4eDE2X3QgdnFzaGxxX25fdTgodWludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZRU0hMLlU4IHEwLHEwLCMwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3QgdnFzaGxxX25fdTgodWludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYikgLy8gVlFTSEwuVTggcTAscTAsIzAKK3sKKyAgICAvLyBnbyB0byAxNiBiaXQgdG8gZ2V0IHRoZSBhdXRvIHNhdHVyYXRpb24gKGluIHBhY2tzIGZ1bmN0aW9uKQorICAgIF9fbTEyOGkgYTEyOCwgcjEyOF8xLCByMTI4XzI7CisgICAgYTEyOCA9IF9NTV9DVlRFUFU4X0VQSTE2IChhKTsgLy9TU0UgNC4xCisgICAgcjEyOF8xID0gX21tX3NsbGlfZXBpMTYgKGExMjgsIGIpOworICAgIC8vc3dhcCBoaSBhbmQgbG93IHBhcnQgb2YgYTEyOCB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgZGF0YQorICAgIGExMjggPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgX1NXQVBfSElfTE9XMzIpOworICAgIGExMjggPSBfTU1fQ1ZURVBVOF9FUEkxNiAoYTEyOCk7CisgICAgcjEyOF8yID0gX21tX3NsbGlfZXBpMTYgKGExMjgsIGIpOworICAgIHJldHVybiBfbW1fcGFja3VzX2VwaTE2IChyMTI4XzEsIHIxMjhfMik7IC8vc2F0dXJhdGVkIHU4Cit9CisKK3VpbnQxNng4X3QgdnFzaGxxX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlFTSEwuczE2IHEwLHEwLCMwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdnFzaGxxX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKSAvLyBWUVNITC5zMTYgcTAscTAsIzAKK3sKKyAgICAvLyBtYW51YWwgc2F0dXJhdGlvbiBzb2x1dGlvbiBsb29rcyBtb3JlIG9wdGltYWwgdGhhbiAzMiBiaXRzIGNvbnZlcnNpb24gb25lCisgICAgX19tMTI4aSBjYiwgYzgwMDAsIGFfc2lnbmVkLCBzYXR1cmF0aW9uX21hc2ssICBzaGlmdF9yZXM7CisgICAgY2IgPSBfbW1fc2V0MV9lcGkxNigoMSA8PCAoMTYgLSBiKSkgLSAxIC0gMHg4MDAwICk7CisgICAgYzgwMDAgPSBfbW1fc2V0MV9lcGkxNiAoMHg4MDAwKTsKKy8vbm8gdW5zaWduZWQgc2hvcnRzIGNvbXBhcmlzb24gaW4gU1NFLCBvbmx5IHNpZ25lZCBhdmFpbGFibGUsIHNvIG5lZWQgdGhlIHRyaWNrCisgICAgYV9zaWduZWQgPSBfbW1fc3ViX2VwaTE2KGEsIGM4MDAwKTsgLy9nbyB0byBzaWduZWQKKyAgICBzYXR1cmF0aW9uX21hc2sgPSBfbW1fY21wZ3RfZXBpMTYgKGFfc2lnbmVkLCBjYik7CisgICAgc2hpZnRfcmVzID0gX21tX3NsbGlfZXBpMTYgKGEsIGIpOworICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKHNoaWZ0X3Jlcywgc2F0dXJhdGlvbl9tYXNrKTsKK30KKwordWludDMyeDRfdCB2cXNobHFfbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWUVNITC5VMzIgcTAscTAsIzAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2cXNobHFfbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpIC8vIFZRU0hMLlUzMiBxMCxxMCwjMAoreworICAgIC8vIG1hbnVhbCBzYXR1cmF0aW9uIHNvbHV0aW9uLCBubyA2NCBiaXQgc2F0dXJhdGlvbiBvcHRpb24sIHRoZSBzZXJpYWwgdmVyc2lvbiBtYXkgYmUgZmFzdGVyCisgICAgX19tMTI4aSBjYiwgYzgwMDAwMDAwLCBhX3NpZ25lZCwgc2F0dXJhdGlvbl9tYXNrLCAgc2hpZnRfcmVzOworICAgIGNiID0gX21tX3NldDFfZXBpMzIoKDEgPDwgKDMyIC0gYikpIC0gMSAtIDB4ODAwMDAwMDAgKTsKKyAgICBjODAwMDAwMDAgPSBfbW1fc2V0MV9lcGkzMiAoMHg4MDAwMDAwMCk7CisvL25vIHVuc2lnbmVkIGludHMgY29tcGFyaXNvbiBpbiBTU0UsIG9ubHkgc2lnbmVkIGF2YWlsYWJsZSwgc28gbmVlZCB0aGUgdHJpY2sKKyAgICBhX3NpZ25lZCA9IF9tbV9zdWJfZXBpMzIoYSwgYzgwMDAwMDAwKTsgLy9nbyB0byBzaWduZWQKKyAgICBzYXR1cmF0aW9uX21hc2sgPSBfbW1fY21wZ3RfZXBpMzIgKGFfc2lnbmVkLCBjYik7CisgICAgc2hpZnRfcmVzID0gX21tX3NsbGlfZXBpMzIgKGEsIGIpOworICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKHNoaWZ0X3Jlcywgc2F0dXJhdGlvbl9tYXNrKTsKK30KKwordWludDY0eDJfdCB2cXNobHFfbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpOyAvLyBWUVNITC5VNjQgcTAscTAsIzAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDJfdCB2cXNobHFfbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vIG5vIGVmZmVjdGl2ZSBTSU1EIHNvbHV0aW9uIGhlcmUKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDY0X3QgYXRtcFsyXSwgcmVzWzJdOworICAgIHVpbnQ2NF90IGJtYXNrOworICAgIGludCBpOworICAgIGJtYXNrID0gKCB1aW50NjRfdCkxIDw8ICg2NCAtIGIpOworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYXRtcCwgYSk7CisgICAgZm9yIChpID0gMDsgaTwyOyBpKyspIHsKKyAgICAgICAgcmVzW2ldID0gKGF0bXBbaV0gPj0gYm1hc2spJiYoYj4wKSA/IDB4ZmZmZmZmZmZmZmZmZmZmZiA6IGF0bXBbaV0gPDwgYjsgLy9pZiBiPTAgd2UgYXJlIGZpbmUgd2l0aCBhbnkgYQorICAgIH0KKyAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7Cit9CisKKy8vKioqKioqKioqKioqKipWZWN0b3Igc2lnbmVkLT51bnNpZ25lZCBzYXR1cmF0aW5nIHNoaWZ0IGxlZnQgYnkgY29uc3RhbnQgKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit1aW50OHg4X3QgdnFzaGx1X25fczgoaW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpOyAvLyBWUVNITFUuUzggZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZxc2hsdV9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKSAvLyBWUVNITFUuUzggZDAsZDAsIzAKK3sKKyAgICAvL25vIDggYml0IHNoaWZ0IGF2YWlsYWJsZSBpbiBJQTMyIFNJTUQsIGdvIHRvIDE2IGJpdC4gSXQgYWxzbyBwcm92aWRlcyB0aGUgYXV0byBzYXR1cmF0aW9uIChpbiBwYWNrcyBmdW5jdGlvbikKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBhMTI4LCByMTI4OworICAgIGExMjggPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vU1NFIDQuMQorICAgIHIxMjggPSBfbW1fc2xsaV9lcGkxNiAoYTEyOCwgYik7CisgICAgcjEyOCA9IF9tbV9wYWNrdXNfZXBpMTYgKHIxMjgscjEyOCk7IC8vc2F0dXJhdGVkIHU4LCB1c2UgNjQgbG93IGJpdHMgb25seQorICAgIHJldHVybjY0KHIxMjgpOworfQorCit1aW50MTZ4NF90IHZxc2hsdV9uX3MxNihpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlFTSExVLlMxNiBkMCxkMCwjMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZxc2hsdV9uX3MxNihpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKSAvLyBWUVNITFUuUzE2IGQwLGQwLCMwCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIGExMjgsIHIxMjg7CisgICAgYTEyOCA9IF9NTV9DVlRFUEkxNl9FUEkzMiAoX3BNMTI4aShhKSk7IC8vU1NFIDQuMQorICAgIHIxMjggPSBfbW1fc2xsaV9lcGkzMiAoYTEyOCwgYik7IC8vc2hpZnRfcmVzCisgICAgcjEyOCA9IF9NTV9QQUNLVVMxX0VQSTMyIChyMTI4KTsgLy9zYXR1cmF0ZWQgczE2LCB1c2UgNjQgbG93IGJpdHMgb25seQorICAgIHJldHVybjY0KHIxMjgpOworfQorCit1aW50MzJ4Ml90IHZxc2hsdV9uX3MzMihpbnQzMngyX3QgYSwgIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYik7IC8vIFZRU0hMVS5TMzIgZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZxc2hsdV9uX3MzMihpbnQzMngyX3QgYSwgIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoIHZxc2hsdXFfbl9zMzIoX3BNMTI4aShhKSwgYikpOworfQorCit1aW50NjR4MV90IHZxc2hsdV9uX3M2NChpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlFTSExVLlM2NCBkMCxkMCwjMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50NjR4MV90IHZxc2hsdV9uX3M2NChpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkgLy8gbm8gZWZmZWN0aXZlIFNJTUQgc29sdXRpb24gaGVyZSwgc2VyaWFsIGV4ZWN1dGlvbiBsb29rcyBmYXN0ZXIKK3sKKyAgICB1aW50NjR4MV90IHJlczsKKyAgICB1aW50NjRfdCBsaW1pdDsKKyAgICBpZiAoYS5tNjRfaTY0WzBdPD0wKSB7CisgICAgICAgIHJlcy5tNjRfdTY0WzBdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBsaW1pdCA9ICh1aW50NjRfdCkgMSA8PCAoNjQgLSBiKTsKKyAgICAgICAgcmVzLm02NF91NjRbMF0gPSAoICgodWludDY0X3QpYS5tNjRfaTY0WzBdKSA+PSBsaW1pdCkgPyByZXMubTY0X3U2NFswXSA9IH4oKHVpbnQ2NF90KTApIDogYS5tNjRfaTY0WzBdIDw8IGI7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDE2X3QgdnFzaGx1cV9uX3M4KGludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZRU0hMVS5TOCBxMCxxMCwjMAorX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZxc2hsdXFfbl9zOChpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpIC8vIFZRU0hMVS5TOCBxMCxxMCwjMAoreworICAgIF9fbTEyOGkgYTEyOCwgcjEyOF8xLCByMTI4XzI7CisgICAgYTEyOCA9IF9NTV9DVlRFUEk4X0VQSTE2IChhKTsgLy9TU0UgNC4xCisgICAgcjEyOF8xID0gX21tX3NsbGlfZXBpMTYgKGExMjgsIGIpOworICAgIC8vc3dhcCBoaSBhbmQgbG93IHBhcnQgb2YgYTEyOCB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgZGF0YQorICAgIGExMjggPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgX1NXQVBfSElfTE9XMzIpOworICAgIGExMjggPSBfTU1fQ1ZURVBJOF9FUEkxNiAoYTEyOCk7CisgICAgcjEyOF8yID0gX21tX3NsbGlfZXBpMTYgKGExMjgsIGIpOworICAgIHJldHVybiBfbW1fcGFja3VzX2VwaTE2IChyMTI4XzEsIHIxMjhfMik7IC8vc2F0dXJhdGVkIHU4Cit9CisKK3VpbnQxNng4X3QgdnFzaGx1cV9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlFTSExVLlMxNiBxMCxxMCwjMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZxc2hsdXFfbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYikgLy8gVlFTSExVLlMxNiBxMCxxMCwjMAoreworICAgIC8vIG1hbnVhbCBzYXR1cmF0aW9uIHNvbHV0aW9uIGxvb2tzIExFU1Mgb3B0aW1hbCB0aGFuIDMyIGJpdHMgY29udmVyc2lvbiBvbmUKKyAgICBfX20xMjhpIGExMjgsIHIxMjhfMSwgcjEyOF8yOworICAgIGExMjggPSBfTU1fQ1ZURVBJMTZfRVBJMzIgKGEpOyAvL1NTRSA0LjEKKyAgICByMTI4XzEgPSBfbW1fc2xsaV9lcGkzMiAoYTEyOCwgYik7IC8vc2hpZnRfcmVzCisgICAgLy9zd2FwIGhpIGFuZCBsb3cgcGFydCBvZiBhMTI4IHRvIHByb2Nlc3MgdGhlIHJlbWFpbmluZyBkYXRhCisgICAgYTEyOCA9IF9tbV9zaHVmZmxlX2VwaTMyIChhLCBfU1dBUF9ISV9MT1czMik7CisgICAgYTEyOCA9IF9NTV9DVlRFUEkxNl9FUEkzMiAoYTEyOCk7CisgICAgcjEyOF8yID0gX21tX3NsbGlfZXBpMzIgKGExMjgsIGIpOworICAgIHJldHVybiBfTU1fUEFDS1VTX0VQSTMyIChyMTI4XzEsIHIxMjhfMik7IC8vc2F0dXJhdGVkIHMxNgorfQorCit1aW50MzJ4NF90IHZxc2hsdXFfbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYik7IC8vIFZRU0hMVS5TMzIgcTAscTAsIzAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2cXNobHVxX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpIC8vIFZRU0hMVS5TMzIgcTAscTAsIzAKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSAgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCB0aGUgc2VyaWFsIG9uZQorICAgIF9fbTEyOGkgemVybywgbWFza0EsIG1hc2tHVDAsIGEwLCAgYV9tYXNrZWQsIGFfc2hpZnQ7CisgICAgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgbWFza0EgPSBfbW1fY21wZXFfZXBpMzIoYSwgYSk7CisgICAgbWFza0EgPSBfbW1fc2xsaV9lcGkzMihtYXNrQSwoMzIgLSBiKSk7IC8vIGIgb25lcyBhbmQgKDMyLWIpemVyb3MKKyAgICAvL3NhdHVyYXRlIG5lZ2F0aXZlIG51bWJlcnMgdG8gemVybworICAgIG1hc2tHVDAgICA9IF9tbV9jbXBndF9lcGkzMiAoYSwgemVybyk7IC8vIC8vMHhmZmZmZmZmZiBpZiBwb3NpdGl2ZSBudW1iZXIgYW5kIHplcm8gb3RoZXJ3aXNlIChuZWdhdGl2ZSBudW1iZXJzKQorICAgIGEwID0gX21tX2FuZF9zaTEyOCAoYSwgIG1hc2tHVDApOyAvL25lZ2F0aXZlIGFyZSB6ZXJvcyBub3cKKyAgICAvL3NhdHVyYXRlIHBvc2l0aXZlIHRvIDB4ZmZmZmZmZmYKKyAgICBhX21hc2tlZCA9IF9tbV9hbmRfc2kxMjggKGEwLCBtYXNrQSk7CisgICAgYV9tYXNrZWQgPSBfbW1fY21wZ3RfZXBpMzIgKGFfbWFza2VkLCB6ZXJvKTsgLy8weGZmZmZmZmZmIGlmIHNhdHVyYXRpb24gbmVjZXNzYXJ5IDAgb3RoZXJ3aXNlCisgICAgYV9zaGlmdCA9IF9tbV9zbGxpX2VwaTMyIChhMCwgYik7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYV9zaGlmdCwgYV9tYXNrZWQpOyAvL2FjdHVhbCBzYXR1cmF0aW9uCit9CisKK3VpbnQ2NHgyX3QgdnFzaGx1cV9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlFTSExVLlM2NCBxMCxxMCwjMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50NjR4Ml90IHZxc2hsdXFfbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vIG5vIGVmZmVjdGl2ZSBTSU1EIHNvbHV0aW9uIGhlcmUsIHNlcmlhbCBleGVjdXRpb24gbG9va3MgZmFzdGVyCisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDY0X3QgYXRtcFsyXTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDY0X3QgcmVzWzJdOworICAgIHVpbnQ2NF90IGxpbWl0OworICAgIGludCBpOworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYXRtcCwgYSk7CisgICAgZm9yIChpID0gMDsgaTwyOyBpKyspIHsKKyAgICAgICAgaWYgKGF0bXBbaV08PTApIHsKKyAgICAgICAgICAgIHJlc1tpXSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaW1pdCA9ICh1aW50NjRfdCkgMSA8PCAoNjQgLSBiKTsKKyAgICAgICAgICAgIHJlc1tpXSA9ICggKCh1aW50NjRfdClhdG1wW2ldKSA+PSBsaW1pdCkgPyByZXNbaV0gPSB+KCh1aW50NjRfdCkwKSA6IGF0bXBbaV0gPDwgYjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7Cit9CisKKy8vKioqKioqKioqKioqKiogVmVjdG9yIG5hcnJvd2luZyAgc2hpZnQgcmlnaHQgYnkgY29uc3RhbnQgKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdnNocm5fbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlNIUk4uSTE2IGQwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZzaHJuX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYikgLy8gVlNIUk4uSTE2IGQwLHEwLCM4Cit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByMTY7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF8xNl9ldmVuX29kZFsxNl0gPSB7IDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUgfTsKKyAgICByMTYgID0gdnNocnFfbl9zMTYoYSxiKTsKKyAgICByMTYgID0gX21tX3NodWZmbGVfZXBpOCAocjE2LCAqKF9fbTEyOGkqKSBtYXNrOF8xNl9ldmVuX29kZCk7IC8vbmFycm93LCB1c2UgbG93IDY0IGJpdHMgb25seS4gSW1wb3NzaWJsZSB0byB1c2UgX21tX3BhY2tzIGJlY2F1c2Ugb2YgbmVnYXRpdmUgc2F0dXJhdGlvbiBwcm9ibGVtcworICAgIHJldHVybjY0KHIxNik7Cit9CisKK2ludDE2eDRfdCB2c2hybl9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlNIUk4uSTMyIGQwLHEwLCMxNgorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnNocm5fbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYikgLy8gVlNIUk4uSTMyIGQwLHEwLCMxNgoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHIzMjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2sxNl9vZGRbMTZdID0geyAwLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1IH07CisgICAgcjMyICA9IHZzaHJxX25fczMyKGEsYik7CisgICAgcjMyICA9ICBfbW1fc2h1ZmZsZV9lcGk4IChyMzIsICooX19tMTI4aSopIG1hc2sxNl9vZGQpOyAvL25hcnJvdywgdXNlIGxvdyA2NCBiaXRzIG9ubHkuIEltcG9zc2libGUgdG8gdXNlIF9tbV9wYWNrcyBiZWNhdXNlIG9mIG5lZ2F0aXZlIHNhdHVyYXRpb24gcHJvYmxlbXMKKyAgICByZXR1cm42NChyMzIpOworfQorCitpbnQzMngyX3QgdnNocm5fbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZTSFJOLkk2NCBkMCxxMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZzaHJuX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgcjY0OworICAgIHI2NCAgPSB2c2hycV9uX3M2NChhLGIpOworICAgIHI2NCAgPSBfbW1fc2h1ZmZsZV9lcGkzMihyNjQsIDAgfCAoMiA8PCAyKSB8ICgxIDw8IDQpIHwgKDMgPDwgNikpOyAvL3NodWZmbGUgdGhlIGRhdGEgdG8gZ2V0IDIgMzItYml0cworICAgIHJldHVybjY0KHI2NCk7Cit9CisKK3VpbnQ4eDhfdCB2c2hybl9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlNIUk4uSTE2IGQwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2c2hybl9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWU0hSTi5JMTYgZDAscTAsIzgKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBtYXNrLCByMTY7CisgICAgbWFzayA9IF9tbV9zZXQxX2VwaTE2KDB4ZmYpOworICAgIHIxNiAgPSB2c2hycV9uX3MxNihhLGIpOyAvL2FmdGVyIHJpZ2h0IHNoaWZ0IGI+PTEgdW5zaWduZWQgdmFyIGZpdHMgaW50byBzaWduZWQgcmFuZ2UsIHNvIHdlIGNvdWxkIHVzZSBfbW1fcGFja3VzX2VwaTE2IChzaWduZWQgMTYgdG8gdW5zaWduZWQgOCkKKyAgICByMTYgPSBfbW1fYW5kX3NpMTI4KHIxNiwgbWFzayk7IC8vdG8gYXZvaWQgc2F0dXJhdGlvbgorICAgIHIxNiA9IF9tbV9wYWNrdXNfZXBpMTYgKHIxNixyMTYpOyAvL25hcnJvdywgdXNlIGxvdyA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMTYpOworfQorCit1aW50MTZ4NF90IHZzaHJuX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlNIUk4uSTMyIGQwLHEwLCMxNgorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZzaHJuX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKSAvLyBWU0hSTi5JMzIgZDAscTAsIzE2Cit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIG1hc2ssIHIzMjsKKyAgICBtYXNrID0gX21tX3NldDFfZXBpMzIoMHhmZmZmKTsKKyAgICByMzIgID0gdnNocnFfbl91MzIoYSxiKTsgLy9hZnRlciByaWdodCBzaGlmdCBiPj0xIHVuc2lnbmVkIHZhciBmaXRzIGludG8gc2lnbmVkIHJhbmdlLCBzbyB3ZSBjb3VsZCB1c2UgX01NX1BBQ0tVU19FUEkzMiAoc2lnbmVkIDMyIHRvIHVuc2lnbmVkIDE2KQorICAgIHIzMiA9IF9tbV9hbmRfc2kxMjgocjMyLCBtYXNrKTsgLy90byBhdm9pZCBzYXR1cmF0aW9uCisgICAgcjMyID0gIF9NTV9QQUNLVVMxX0VQSTMyIChyMzIpOyAvL3NhdHVyYXRlIGFuZCAgbmFycm93LCB1c2UgbG93IDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIzMik7Cit9CisKK3VpbnQzMngyX3QgdnNocm5fbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWU0hSTi5JNjQgZDAscTAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnNocm5fbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHI2NDsKKyAgICByNjQgID0gdnNocnFfbl91NjQoYSxiKTsKKyAgICByNjQgID0gX21tX3NodWZmbGVfZXBpMzIocjY0LCAwIHwgKDIgPDwgMikgfCAoMSA8PCA0KSB8ICgzIDw8IDYpKTsgLy9zaHVmZmxlIHRoZSBkYXRhIHRvIGdldCAyIDMyLWJpdHMKKyAgICByZXR1cm42NChyNjQpOworfQorCisvLyoqKioqKioqKioqKioqIFZlY3RvciBzaWduZWQtPnVuc2lnbmVkIG5hcnJvd2luZyBzYXR1cmF0aW5nIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50ICoqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordWludDh4OF90IHZxc2hydW5fbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlFTSFJVTi5TMTYgZDAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZxc2hydW5fbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWUVNIUlVOLlMxNiBkMCxxMCwjOAoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHIxNjsKKyAgICByMTYgID0gdnNocnFfbl9zMTYoYSxiKTsKKyAgICByMTYgPSBfbW1fcGFja3VzX2VwaTE2IChyMTYscjE2KTsgLy9zYXR1cmF0ZSBhbmQgIG5hcnJvdyAoc2lnbmVkIHRvIHVuc2lnbmVkKSwgdXNlIGxvdyA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMTYpOworfQorCit1aW50MTZ4NF90IHZxc2hydW5fbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZRU0hSVU4uUzMyIGQwLHEwLCMxNgorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZxc2hydW5fbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYikgLy8gVlFTSFJVTi5TMzIgZDAscTAsIzE2Cit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHIzMjsKKyAgICByMzIgID0gdnNocnFfbl9zMzIoYSxiKTsKKyAgICByMzIgID0gX01NX1BBQ0tVUzFfRVBJMzIgKHIzMik7IC8vc2F0dXJhdGUgYW5kICBuYXJyb3coc2lnbmVkIHRvIHVuc2lnbmVkKSwgdXNlIGxvdyA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMzIpOworfQorCit1aW50MzJ4Ml90IHZxc2hydW5fbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZRU0hSVU4uUzY0IGQwLHEwLCMzMgorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MzJ4Ml90IHZxc2hydW5fbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpIC8vc2VyaWFsIHNvbHV0aW9uIGlzIGZhc3RlcgoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ2NF90IGF0bXBbMl07CisgICAgdWludDMyeDJfdCByZXM7CisgICAgaW50NjRfdCByZXM2NDsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgIGlmIChhdG1wWzBdIDwgMCkgeworICAgICAgICByZXMubTY0X3UzMlswXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzNjQgPSAoYXRtcFswXSA+PiBiKTsKKyAgICAgICAgcmVzLm02NF91MzJbMF0gPSAocmVzNjQgPiAoaW50NjRfdCkweGZmZmZmZmZmKSA/IDB4ZmZmZmZmZmYgOiAodWludDMyX3QpIHJlczY0OworICAgIH0KKyAgICBpZiAoYXRtcFsxXSA8IDApIHsKKyAgICAgICAgcmVzLm02NF91MzJbMV0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlczY0ID0gKGF0bXBbMV0gPj4gYik7CisgICAgICAgIHJlcy5tNjRfdTMyWzFdID0gKHJlczY0ID4gKGludDY0X3QpMHhmZmZmZmZmZikgPyAweGZmZmZmZmZmIDogKHVpbnQzMl90KXJlczY0OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyoqKiogVmVjdG9yIHNpZ25lZC0+dW5zaWduZWQgcm91bmRpbmcgbmFycm93aW5nIHNhdHVyYXRpbmcgc2hpZnQgcmlnaHQgYnkgY29uc3RhbnQgKioqKioKK3VpbnQ4eDhfdCB2cXJzaHJ1bl9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUVJTSFJVTi5TMTYgZDAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZxcnNocnVuX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYikgLy8gVlFSU0hSVU4uUzE2IGQwLHEwLCM4Cit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCB0aGUgc2VyaWFsIG9uZQorICAgIF9fbTEyOGkgcjE2OworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICByMTYgPSB2cnNocnFfbl9zMTYoYSxiKTsKKyAgICByMTYgPSAgX21tX3BhY2t1c19lcGkxNiAocjE2LHIxNik7IC8vc2F0dXJhdGUgYW5kICBuYXJyb3cgKHNpZ25lZCB0byB1bnNpZ25lZCksIHVzZSBsb3cgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjE2KTsKK30KKwordWludDE2eDRfdCB2cXJzaHJ1bl9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlFSU0hSVU4uUzMyIGQwLHEwLCMxNgorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZxcnNocnVuX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpIC8vIFZRUlNIUlVOLlMzMiBkMCxxMCwjMTYKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHRoZSBzZXJpYWwgb25lCisgICAgX19tMTI4aSByMzI7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICByMzIgPSB2cnNocnFfbl9zMzIoYSxiKTsKKyAgICByMzIgPSAgX01NX1BBQ0tVUzFfRVBJMzIgKHIzMik7IC8vc2F0dXJhdGUgYW5kICBuYXJyb3cgKHNpZ25lZCB0byB1bnNpZ25lZCksIHVzZSBsb3cgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjMyKTsKK30KKwordWludDMyeDJfdCB2cXJzaHJ1bl9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlFSU0hSVU4uUzY0IGQwLHEwLCMzMgorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MzJ4Ml90IHZxcnNocnVuX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKSAvL3NlcmlhbCBzb2x1dGlvbiBpcyBmYXN0ZXIKK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50NjRfdCBhdG1wWzJdOworICAgIHVpbnQzMngyX3QgcmVzOworICAgIGludDY0X3QgcmVzNjQ7CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsKKyAgICBpZiAoYXRtcFswXSA8IDApIHsKKyAgICAgICAgcmVzLm02NF91MzJbMF0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlczY0ID0gKGF0bXBbMF0gPj4gYikgKyAoIChhdG1wWzBdICYgKChpbnQ2NF90KTEgPDwgKGIgLSAxKSkpID4+IChiIC0gMSkgICk7CisgICAgICAgIHJlcy5tNjRfdTMyWzBdID0gKHJlczY0ID4gKGludDY0X3QpMHhmZmZmZmZmZiApID8gMHhmZmZmZmZmZiA6IHJlczY0OworICAgIH0KKyAgICBpZiAoYXRtcFsxXSA8IDApIHsKKyAgICAgICAgcmVzLm02NF91MzJbMV0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlczY0ID0gKGF0bXBbMV0gPj4gYikgKyAoIChhdG1wWzBdICYgKChpbnQ2NF90KTEgPDwgKGIgLSAxKSkpID4+IChiIC0gMSkgICk7CisgICAgICAgIHJlcy5tNjRfdTMyWzFdID0gKHJlczY0ID4gKGludDY0X3QpMHhmZmZmZmZmZiApID8gMHhmZmZmZmZmZiA6IHJlczY0OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyoqKioqIFZlY3RvciBuYXJyb3dpbmcgc2F0dXJhdGluZyBzaGlmdCByaWdodCBieSBjb25zdGFudCAqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZxc2hybl9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUVNIUk4uUzE2IGQwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZxc2hybl9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpIC8vIFZRU0hSTi5TMTYgZDAscTAsIzgKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHIxNjsKKyAgICByMTYgID0gdnNocnFfbl9zMTYoYSxiKTsKKyAgICByMTYgID0gX21tX3BhY2tzX2VwaTE2IChyMTYscjE2KTsgLy9zYXR1cmF0ZSBhbmQgIG5hcnJvdywgdXNlIGxvdyA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMTYpOworfQorCitpbnQxNng0X3QgdnFzaHJuX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUVNIUk4uUzMyIGQwLHEwLCMxNgorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnFzaHJuX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpIC8vIFZRU0hSTi5TMzIgZDAscTAsIzE2Cit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcjMyOworICAgIHIzMiAgPSB2c2hycV9uX3MzMihhLGIpOworICAgIHIzMiAgPSBfbW1fcGFja3NfZXBpMzIgKHIzMixyMzIpOyAvL3NhdHVyYXRlIGFuZCAgbmFycm93LCB1c2UgbG93IDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIzMik7Cit9CisKK2ludDMyeDJfdCB2cXNocm5fbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZRU0hSTi5TNjQgZDAscTAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDJfdCB2cXNocm5fbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19VTkVGRkVDVElWRSkKK3sKKyAgICAvL25vIG9wdGltYWwgU0lNRCBzb2x1dGlvbiBmb3VuZAorICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ2NF90IHJlczY0WzJdLCBhdG1wWzJdOworICAgIGludDMyeDJfdCByZXM7CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsKKyAgICByZXM2NFswXSA9IChhdG1wWzBdID4+IGIpOworICAgIHJlczY0WzFdID0gKGF0bXBbMV0gPj4gYik7CisgICAgaWYocmVzNjRbMF0+U0lOVF9NQVgpIHJlczY0WzBdID0gU0lOVF9NQVg7CisgICAgaWYocmVzNjRbMF08U0lOVF9NSU4pIHJlczY0WzBdID0gU0lOVF9NSU47CisgICAgaWYocmVzNjRbMV0+U0lOVF9NQVgpIHJlczY0WzFdID0gU0lOVF9NQVg7CisgICAgaWYocmVzNjRbMV08U0lOVF9NSU4pIHJlczY0WzFdID0gU0lOVF9NSU47CisgICAgcmVzLm02NF9pMzJbMF0gPSAoaW50MzJfdClyZXM2NFswXTsKKyAgICByZXMubTY0X2kzMlsxXSA9IChpbnQzMl90KXJlczY0WzFdOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2cXNocm5fbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZRU0hSTi5zMTYgZDAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZxc2hybl9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWUVNIUk4uczE2IGQwLHEwLCM4Cit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcjE2OworICAgIHIxNiAgPSB2c2hycV9uX3UxNihhLGIpOyAvL2FmdGVyIHJpZ2h0IHNoaWZ0IGI+PTEgdW5zaWduZWQgdmFyIGZpdHMgaW50byBzaWduZWQgcmFuZ2UsIHNvIHdlIGNvdWxkIHVzZSBfbW1fcGFja3VzX2VwaTE2IChzaWduZWQgMTYgdG8gdW5zaWduZWQgOCkKKyAgICByMTYgID0gX21tX3BhY2t1c19lcGkxNiAocjE2LHIxNik7IC8vc2F0dXJhdGUgYW5kICBuYXJyb3csIHVzZSBsb3cgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjE2KTsKK30KKwordWludDE2eDRfdCB2cXNocm5fbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUVNIUk4uVTMyIGQwLHEwLCMxNgorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZxc2hybl9uX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYikgLy8gVlFTSFJOLlUzMiBkMCxxMCwjMTYKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcjMyOworICAgIHIzMiAgPSB2c2hycV9uX3UzMihhLGIpOyAvL2FmdGVyIHJpZ2h0IHNoaWZ0IGI+PTEgdW5zaWduZWQgdmFyIGZpdHMgaW50byBzaWduZWQgcmFuZ2UsIHNvIHdlIGNvdWxkIHVzZSBfTU1fUEFDS1VTX0VQSTMyIChzaWduZWQgMzIgdG8gdW5zaWduZWQgOCkKKyAgICByMzIgID0gX01NX1BBQ0tVUzFfRVBJMzIgKHIzMik7IC8vc2F0dXJhdGUgYW5kICBuYXJyb3csIHVzZSBsb3cgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjMyKTsKK30KKwordWludDMyeDJfdCB2cXNocm5fbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUVNIUk4uVTY0IGQwLHEwLCMzMgorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZxc2hybl9uX3U2NCh1aW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYikKK3sKKyAgICAvL3NlcmlhbCBzb2x1dGlvbiBtYXkgYmUgZmFzdGVyCisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHI2NCwgcmVzX2hpLCB6ZXJvOworICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIHI2NCAgPSB2c2hycV9uX3U2NChhLGIpOworICAgIHJlc19oaSA9IF9tbV9zcmxpX2VwaTY0KHI2NCwgIDMyKTsKKyAgICByZXNfaGkgPSBfbW1fY21wZ3RfZXBpMzIocmVzX2hpLCB6ZXJvKTsKKyAgICByNjQgPSBfbW1fb3Jfc2kxMjgocjY0LCByZXNfaGkpOworICAgIHI2NCA9IF9tbV9zaHVmZmxlX2VwaTMyKHI2NCwgMCB8ICgyIDw8IDIpIHwgKDEgPDwgNCkgfCAoMyA8PCA2KSk7IC8vc2h1ZmZsZSB0aGUgZGF0YSB0byBnZXQgMiAzMi1iaXRzCisgICAgcmV0dXJuNjQocjY0KTsKK30KKworCisvLyoqKioqKioqKiBWZWN0b3Igcm91bmRpbmcgbmFycm93aW5nIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50ICoqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdnJzaHJuX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZSU0hSTi5JMTYgZDAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnJzaHJuX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYikgLy8gVlJTSFJOLkkxNiBkMCxxMCwjOAoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcjE2OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMTZfZXZlbl9vZGRbMTZdID0geyAwLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1IH07CisgICAgcjE2ICA9IHZyc2hycV9uX3MxNihhLGIpOworICAgIHIxNiAgPSBfbW1fc2h1ZmZsZV9lcGk4IChyMTYsICooX19tMTI4aSopIG1hc2s4XzE2X2V2ZW5fb2RkKTsgLy9uYXJyb3csIHVzZSBsb3cgNjQgYml0cyBvbmx5LiBJbXBvc3NpYmxlIHRvIHVzZSBfbW1fcGFja3MgYmVjYXVzZSBvZiBuZWdhdGl2ZSBzYXR1cmF0aW9uIHByb2JsZW1zCisgICAgcmV0dXJuNjQocjE2KTsKK30KKworaW50MTZ4NF90IHZyc2hybl9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlJTSFJOLkkzMiBkMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZyc2hybl9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKSAvLyBWUlNIUk4uSTMyIGQwLHEwLCMxNgoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHIzMjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2sxNl9vZGRbMTZdID0geyAwLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1IH07CisgICAgcjMyICA9IHZyc2hycV9uX3MzMihhLGIpOworICAgIHIzMiAgPSAgX21tX3NodWZmbGVfZXBpOCAocjMyLCAqKF9fbTEyOGkqKSBtYXNrMTZfb2RkKTsgLy9uYXJyb3csIHVzZSBsb3cgNjQgYml0cyBvbmx5LiBJbXBvc3NpYmxlIHRvIHVzZSBfbW1fcGFja3MgYmVjYXVzZSBvZiBuZWdhdGl2ZSBzYXR1cmF0aW9uIHByb2JsZW1zCisgICAgcmV0dXJuNjQocjMyKTsKK30KKworaW50MzJ4Ml90IHZyc2hybl9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlJTSFJOLkk2NCBkMCxxMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZyc2hybl9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHI2NDsKKyAgICByNjQgID0gdnJzaHJxX25fczY0KGEsYik7CisgICAgcjY0ICA9IF9tbV9zaHVmZmxlX2VwaTMyKHI2NCwgMCB8ICgyIDw8IDIpIHwgKDEgPDwgNCkgfCAoMyA8PCA2KSk7IC8vc2h1ZmZsZSB0aGUgZGF0YSB0byBnZXQgMiAzMi1iaXRzCisgICAgcmV0dXJuNjQocjY0KTsKK30KKwordWludDh4OF90IHZyc2hybl9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlJTSFJOLkkxNiBkMCxxMCwjOAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnJzaHJuX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpIC8vIFZSU0hSTi5JMTYgZDAscTAsIzgKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBtYXNrLCByMTY7CisgICAgbWFzayA9IF9tbV9zZXQxX2VwaTE2KDB4ZmYpOworICAgIHIxNiAgPSB2cnNocnFfbl9zMTYoYSxiKTsgLy9hZnRlciByaWdodCBzaGlmdCBiPj0xIHVuc2lnbmVkIHZhciBmaXRzIGludG8gc2lnbmVkIHJhbmdlLCBzbyB3ZSBjb3VsZCB1c2UgX21tX3BhY2t1c19lcGkxNiAoc2lnbmVkIDE2IHRvIHVuc2lnbmVkIDgpCisgICAgcjE2ID0gX21tX2FuZF9zaTEyOChyMTYsIG1hc2spOyAvL3RvIGF2b2lkIHNhdHVyYXRpb24KKyAgICByMTYgPSBfbW1fcGFja3VzX2VwaTE2IChyMTYscjE2KTsgLy9zYXR1cmF0ZSBhbmQgIG5hcnJvdywgdXNlIGxvdyA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMTYpOworfQorCit1aW50MTZ4NF90IHZyc2hybl9uX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZSU0hSTi5JMzIgZDAscTAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnJzaHJuX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKSAvLyBWUlNIUk4uSTMyIGQwLHEwLCMxNgoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBtYXNrLCByMzI7CisgICAgbWFzayA9IF9tbV9zZXQxX2VwaTMyKDB4ZmZmZik7CisgICAgcjMyICA9IHZyc2hycV9uX3UzMihhLGIpOyAvL2FmdGVyIHJpZ2h0IHNoaWZ0IGI+PTEgdW5zaWduZWQgdmFyIGZpdHMgaW50byBzaWduZWQgcmFuZ2UsIHNvIHdlIGNvdWxkIHVzZSBfTU1fUEFDS1VTX0VQSTMyIChzaWduZWQgMzIgdG8gdW5zaWduZWQgOCkKKyAgICByMzIgPSBfbW1fYW5kX3NpMTI4KHIzMiwgbWFzayk7IC8vdG8gYXZvaWQgc2F0dXJhdGlvbgorICAgIHIzMiA9IF9NTV9QQUNLVVMxX0VQSTMyIChyMzIpOyAvL3NhdHVyYXRlIGFuZCAgbmFycm93LCB1c2UgbG93IDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIzMik7Cit9CisKK3VpbnQzMngyX3QgdnJzaHJuX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlJTSFJOLkk2NCBkMCxxMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2cnNocm5fbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpIC8vc2VyaWFsIHNvbHV0aW9uIG1heSBiZSBmYXN0ZXIKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgcjY0OworICAgIHI2NCAgPSB2cnNocnFfbl91NjQoYSxiKTsKKyAgICByNjQgID0gIF9tbV9zaHVmZmxlX2VwaTMyKHI2NCwgMCB8ICgyIDw8IDIpIHwgKDEgPDwgNCkgfCAoMyA8PCA2KSk7IC8vc2h1ZmZsZSB0aGUgZGF0YSB0byBnZXQgMiAzMi1iaXRzCisgICAgcmV0dXJuNjQocjY0KTsKK30KKworLy8qKioqKioqKioqKioqIFZlY3RvciByb3VuZGluZyBuYXJyb3dpbmcgc2F0dXJhdGluZyBzaGlmdCByaWdodCBieSBjb25zdGFudCAqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdnFyc2hybl9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUVJTSFJOLlMxNiBkMCxxMCwjOAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2cXJzaHJuX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYikgLy8gVlFSU0hSTi5TMTYgZDAscTAsIzgKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHIxNjsKKyAgICByMTYgID0gdnJzaHJxX25fczE2KGEsYik7CisgICAgcjE2ICA9ICBfbW1fcGFja3NfZXBpMTYgKHIxNixyMTYpOyAvL3NhdHVyYXRlIGFuZCAgbmFycm93LCB1c2UgbG93IDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIxNik7Cit9CisKK2ludDE2eDRfdCB2cXJzaHJuX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUVJTSFJOLlMzMiBkMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZxcnNocm5fbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYikgLy8gVlFSU0hSTi5TMzIgZDAscTAsIzE2Cit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcjMyOworICAgIHIzMiAgPSB2cnNocnFfbl9zMzIoYSxiKTsKKyAgICByMzIgID0gX21tX3BhY2tzX2VwaTMyIChyMzIscjMyKTsgLy9zYXR1cmF0ZSBhbmQgIG5hcnJvdywgdXNlIGxvdyA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMzIpOworfQorCitpbnQzMngyX3QgdnFyc2hybl9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlFSU0hSTi5TNjQgZDAscTAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDJfdCB2cXJzaHJuX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfVU5FRkZFQ1RJVkUpCit7CisgICAgLy9ubyBvcHRpbWFsIFNJTUQgc29sdXRpb24gZm91bmQKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50NjRfdCByZXM2NFsyXSwgYXRtcFsyXSwgbWFza2JbMl07CisgICAgaW50MzJ4Ml90IHJlczsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgIG1hc2tiWzBdID0gYXRtcFswXSAmICgoIGludDY0X3QpMSA8PCAoYiAtIDEpKTsKKyAgICByZXM2NFswXSA9IChhdG1wWzBdID4+IGIpICsgKG1hc2tiWzBdID4+IChiIC0gMSkpOyAvL3JvdW5kZWQgcmVzdWx0CisgICAgbWFza2JbMV0gPSBhdG1wWzFdICYgKCggaW50NjRfdCkxIDw8IChiIC0gMSkpOworICAgIHJlczY0WzFdID0gKGF0bXBbMV0gPj4gYikgKyAobWFza2JbMV0gPj4gKGIgLSAxKSk7IC8vcm91bmRlZCByZXN1bHQKKyAgICBpZihyZXM2NFswXT5TSU5UX01BWCkgcmVzNjRbMF0gPSBTSU5UX01BWDsKKyAgICBpZihyZXM2NFswXTxTSU5UX01JTikgcmVzNjRbMF0gPSBTSU5UX01JTjsKKyAgICBpZihyZXM2NFsxXT5TSU5UX01BWCkgcmVzNjRbMV0gPSBTSU5UX01BWDsKKyAgICBpZihyZXM2NFsxXTxTSU5UX01JTikgcmVzNjRbMV0gPSBTSU5UX01JTjsKKyAgICByZXMubTY0X2kzMlswXSA9IChpbnQzMl90KXJlczY0WzBdOworICAgIHJlcy5tNjRfaTMyWzFdID0gKGludDMyX3QpcmVzNjRbMV07CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDh4OF90IHZxcnNocm5fbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZRUlNIUk4uczE2IGQwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2cXJzaHJuX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpIC8vIFZRUlNIUk4uczE2IGQwLHEwLCM4Cit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcjE2OworICAgIHIxNiAgPSB2cnNocnFfbl91MTYoYSxiKTsgLy9hZnRlciByaWdodCBzaGlmdCBiPj0xIHVuc2lnbmVkIHZhciBmaXRzIGludG8gc2lnbmVkIHJhbmdlLCBzbyB3ZSBjb3VsZCB1c2UgX21tX3BhY2t1c19lcGkxNiAoc2lnbmVkIDE2IHRvIHVuc2lnbmVkIDgpCisgICAgcjE2ICA9IF9tbV9wYWNrdXNfZXBpMTYgKHIxNixyMTYpOyAvL3NhdHVyYXRlIGFuZCAgbmFycm93LCB1c2UgbG93IDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIxNik7Cit9CisKK3VpbnQxNng0X3QgdnFyc2hybl9uX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZRUlNIUk4uVTMyIGQwLHEwLCMxNgorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZxcnNocm5fbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpIC8vIFZRUlNIUk4uVTMyIGQwLHEwLCMxNgoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByMzI7CisgICAgcjMyICA9IHZyc2hycV9uX3UzMihhLGIpOyAvL2FmdGVyIHJpZ2h0IHNoaWZ0IGI+PTEgdW5zaWduZWQgdmFyIGZpdHMgaW50byBzaWduZWQgcmFuZ2UsIHNvIHdlIGNvdWxkIHVzZSBfTU1fUEFDS1VTX0VQSTMyIChzaWduZWQgMzIgdG8gdW5zaWduZWQgOCkKKyAgICByMzIgID0gX01NX1BBQ0tVUzFfRVBJMzIgKHIzMik7IC8vc2F0dXJhdGUgYW5kICBuYXJyb3csIHVzZSBsb3cgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjMyKTsKK30KKwordWludDMyeDJfdCB2cXJzaHJuX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlFSU0hSTi5VNjQgZDAscTAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnFyc2hybl9uX3U2NCh1aW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYikKK3sKKyAgICAvL3NlcmlhbCBzb2x1dGlvbiBtYXkgYmUgZmFzdGVyCisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHI2NCwgcmVzX2hpLCB6ZXJvOworICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIHI2NCAgPSB2cnNocnFfbl91NjQoYSxiKTsKKyAgICByZXNfaGkgPSBfbW1fc3JsaV9lcGk2NChyNjQsICAzMik7CisgICAgcmVzX2hpID0gX21tX2NtcGd0X2VwaTMyKHJlc19oaSwgemVybyk7CisgICAgcjY0ID0gX21tX29yX3NpMTI4KHI2NCwgcmVzX2hpKTsKKyAgICByNjQgPSBfbW1fc2h1ZmZsZV9lcGkzMihyNjQsIDAgfCAoMiA8PCAyKSB8ICgxIDw8IDQpIHwgKDMgPDwgNikpOyAvL3NodWZmbGUgdGhlIGRhdGEgdG8gZ2V0IDIgMzItYml0cworICAgIHJldHVybjY0KHI2NCk7Cit9CisKKy8vKioqKioqKioqKioqKiogVmVjdG9yIHdpZGVuaW5nIHNoaWZ0IGxlZnQgYnkgY29uc3RhbnQgKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDE2eDhfdCB2c2hsbF9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDgpIGludCBiKTsgLy8gVlNITEwuUzggcTAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZzaGxsX25fczgoaW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDAsOCkgaW50IGIpIC8vIFZTSExMLlM4IHEwLGQwLCMwCit7CisgICAgX19tMTI4aSByOworICAgIHIgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vU1NFIDQuMQorICAgIHJldHVybiBfbW1fc2xsaV9lcGkxNiAociwgYik7Cit9CisKK2ludDMyeDRfdCB2c2hsbF9uX3MxNihpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTYpIGludCBiKTsgLy8gVlNITEwuUzE2IHEwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2c2hsbF9uX3MxNihpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTYpIGludCBiKSAvLyBWU0hMTC5TMTYgcTAsZDAsIzAKK3sKKyAgICBfX20xMjhpIHI7CisgICAgciA9ICBfTU1fQ1ZURVBJMTZfRVBJMzIoX3BNMTI4aShhKSk7IC8vU1NFNC4xLAorICAgIHJldHVybiBfbW1fc2xsaV9lcGkzMiAociwgYik7Cit9CisKK2ludDY0eDJfdCB2c2hsbF9uX3MzMihpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDAsMzIpIGludCBiKTsgLy8gVlNITEwuUzMyIHEwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2c2hsbF9uX3MzMihpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDAsMzIpIGludCBiKSAvLyBWU0hMTC5TMzIgcTAsZDAsIzAKK3sKKyAgICBfX20xMjhpIHI7CisgICAgciA9ICBfTU1fQ1ZURVBJMzJfRVBJNjQoX3BNMTI4aShhKSk7IC8vU1NFNC4xLAorICAgIHJldHVybiBfbW1fc2xsaV9lcGk2NCAociwgYik7Cit9CisKK3VpbnQxNng4X3QgdnNobGxfbl91OCh1aW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDAsOCkgaW50IGIpOyAvLyBWU0hMTC5VOCBxMCxkMCwjMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZzaGxsX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDgpIGludCBiKSAvLyBWU0hMTC5VOCBxMCxkMCwjMAoreworICAgIC8vbm8gdWludDggdG8gdWludDE2IGNvbnZlcnNpb24gYXZhaWxhYmxlLCBtYW51YWwgY29udmVyc2lvbiB1c2VkCisgICAgX19tMTI4aSB6ZXJvLCAgcjsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjggKCk7CisgICAgciA9IF9tbV91bnBhY2tsb19lcGk4KF9wTTEyOGkoYSksIHplcm8pOworICAgIHJldHVybiBfbW1fc2xsaV9lcGkxNiAociwgYik7Cit9CisKK3VpbnQzMng0X3QgdnNobGxfbl91MTYodWludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNikgaW50IGIpOyAvLyBWU0hMTC5zMTYgcTAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2c2hsbF9uX3UxNih1aW50MTZ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDE2KSBpbnQgYikgLy8gVlNITEwuczE2IHEwLGQwLCMwCit7CisgICAgLy9ubyB1aW50MTYgdG8gdWludDMyIGNvbnZlcnNpb24gYXZhaWxhYmxlLCBtYW51YWwgY29udmVyc2lvbiB1c2VkCisgICAgX19tMTI4aSB6ZXJvLCAgcjsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjggKCk7CisgICAgciA9IF9tbV91bnBhY2tsb19lcGkxNihfcE0xMjhpKGEpLCB6ZXJvKTsKKyAgICByZXR1cm4gX21tX3NsbGlfZXBpMzIgKHIsIGIpOworfQorCit1aW50NjR4Ml90IHZzaGxsX25fdTMyKHVpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDAsMzIpIGludCBiKTsgLy8gVlNITEwuVTMyIHEwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3QgdnNobGxfbl91MzIodWludDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMikgaW50IGIpIC8vIFZTSExMLlUzMiBxMCxkMCwjMAoreworICAgIC8vbm8gdWludDMyIHRvIHVpbnQ2NCBjb252ZXJzaW9uIGF2YWlsYWJsZSwgbWFudWFsIGNvbnZlcnNpb24gdXNlZAorICAgIF9fbTEyOGkgemVybywgIHI7CisgICAgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4ICgpOworICAgIHIgPSBfbW1fdW5wYWNrbG9fZXBpMzIoX3BNMTI4aShhKSwgemVybyk7CisgICAgcmV0dXJuIF9tbV9zbGxpX2VwaTY0IChyLCBiKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTaGlmdHMgd2l0aCBpbnNlcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy90YWtlcyBlYWNoIGVsZW1lbnQgaW4gYSB2ZWN0b3IsICBzaGlmdHMgdGhlbSBieSBhbiBpbW1lZGlhdGUgdmFsdWUsCisvL2FuZCBpbnNlcnRzIHRoZSByZXN1bHRzIGluIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuIEJpdHMgc2hpZnRlZCBvdXQgb2YgdGhlIGVhY2ggZWxlbWVudCBhcmUgbG9zdC4KKworLy8qKioqKioqKioqKioqKioqIFZlY3RvciBzaGlmdCByaWdodCBhbmQgaW5zZXJ0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9BY3R1YWxseSB0aGUgImMiIGxlZnQgYml0cyBmcm9tICJhIiBhcmUgdGhlIG9ubHkgYml0cyByZW1haW5lZCBmcm9tICJhIiAgYWZ0ZXIgdGhlIHNoaWZ0LgorLy9BbGwgb3RoZXIgYml0cyBhcmUgdGFrZW4gZnJvbSBiIHNoaWZ0ZWQuCitpbnQ4eDhfdCB2c3JpX25fczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlNSSS44IGQwLGQwLCM4CitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZzcmlfbl9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnNyaXFfbl9zOChfcE0xMjhpKGEpLF9wTTEyOGkoYiksIGMpKTsKK30KKworCitpbnQxNng0X3QgdnNyaV9uX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWU1JJLjE2IGQwLGQwLCMxNgorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnNyaV9uX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZzcmlxX25fczE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSwgYykpOworfQorCisKK2ludDMyeDJfdCB2c3JpX25fczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZTUkkuMzIgZDAsZDAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2c3JpX25fczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYykKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnNyaXFfbl9zMzIoX3BNMTI4aShhKSxfcE0xMjhpKGIpLCBjKSk7Cit9CisKKworaW50NjR4MV90IHZzcmlfbl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWU1JJLjY0IGQwLGQwLCM2NAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgxX3QgdnNyaV9uX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYykKK3sKKyAgICBpbnQ2NHgxX3QgcmVzOworICAgIGlmIChjID09NjQpCisgICAgICAgIHJlcyA9IGE7CisgICAgZWxzZXsKKyAgICAgICAgcmVzLm02NF9pNjRbMF0gPSAoYi5tNjRfdTY0WzBdID4+IGMpIHwgKChhLm02NF9pNjRbMF0gPj4gKDY0IC0gYykpIDw8ICg2NCAtIGMpKTsgLy90cmVhdCBiIGFzIHVuc2lnbmVkIGZvciBzaGlmdCB0byBnZXQgbGVhZGluZyB6ZXJvcworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHg4X3QgdnNyaV9uX3U4KHVpbnQ4eDhfdCBhLCAgdWludDh4OF90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlNSSS44IGQwLGQwLCM4CisjZGVmaW5lIHZzcmlfbl91OCB2c3JpX25fczgKKwordWludDE2eDRfdCB2c3JpX25fdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSSS4xNiBkMCxkMCwjMTYKKyNkZWZpbmUgdnNyaV9uX3UxNiB2c3JpX25fczE2CisKK3VpbnQzMngyX3QgdnNyaV9uX3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZTUkkuMzIgZDAsZDAsIzMyCisjZGVmaW5lIHZzcmlfbl91MzIgdnNyaV9uX3MzMgorCisKK3VpbnQ2NHgxX3QgdnNyaV9uX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlNSSS42NCBkMCxkMCwjNjQKKyNkZWZpbmUgdnNyaV9uX3U2NCB2c3JpX25fczY0CisKK3BvbHk4eDhfdCB2c3JpX25fcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkkuOCBkMCxkMCwjOAorI2RlZmluZSB2c3JpX25fcDggdnNyaV9uX3U4CisKK3BvbHkxNng0X3QgdnNyaV9uX3AxNihwb2x5MTZ4NF90IGEsIHBvbHkxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSSS4xNiBkMCxkMCwjMTYKKyNkZWZpbmUgdnNyaV9uX3AxNiB2c3JpX25fdTE2CisKK2ludDh4MTZfdCB2c3JpcV9uX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWU1JJLjggcTAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZzcmlxX25fczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYykgLy8gVlNSSS44IHEwLHEwLCM4Cit7CisgICAgX19tMTI4aSBtYXNrQSwgYV9tYXNrZWQ7CisgICAgdWludDh4MTZfdCBiX3NoaWZ0OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2tMZWZ0WzldID0gezB4MCwgMHg4MCwgMHhjMCwgMHhlMCwgMHhmMCwgMHhmOCwgMHhmYywgMHhmZSwgMHhmZn07IC8vImEiIGJpdHMgbWFzaywgMCBiaXQgbm90IHVzZWQKKyAgICBtYXNrQSA9IF9tbV9zZXQxX2VwaTgobWFza0xlZnRbY10pOyAvLyBjIG9uZXMgYW5kICg4LWMpemVyb3MKKyAgICBhX21hc2tlZCA9IF9tbV9hbmRfc2kxMjggKGEsIG1hc2tBKTsKKyAgICBiX3NoaWZ0ID0gdnNocnFfbl91OCggYiwgYyk7IC8vIGMgemVyb3Mgb24gdGhlIGxlZnQgaW4gYiBkdWUgdG8gbG9naWNhbCBzaGlmdAorICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKGFfbWFza2VkLCBiX3NoaWZ0KTsgLy9jb21iaW5lIChpbnNlcnQgYiBpbnRvIGEpCit9CisKK2ludDE2eDhfdCB2c3JpcV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZTUkkuMTYgcTAscTAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2c3JpcV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYykgLy8gVlNSSS4xNiBxMCxxMCwjMTYKK3sKKyAgICAvL3RvIGN1dCAiYyIgbGVmdCBiaXRzIGZyb20gYSB3ZSBkbyBzaGlmdCByaWdodCBhbmQgdGhlbiAgc2hpZnQgYmFjayBsZWZ0IHByb3ZpZGluZyBjIHJpZ2h0IHplcm9zIGluIGEKKyAgICB1aW50MTZ4OF90IGJfc2hpZnQ7CisgICAgdWludDE2eDhfdCBhX2M7CisgICAgYl9zaGlmdCA9IHZzaHJxX25fdTE2KCBiLCBjKTsgLy8gYyB6ZXJvcyBvbiB0aGUgbGVmdCBpbiBiIGR1ZSB0byBsb2dpY2FsIHNoaWZ0CisgICAgYV9jID0gdnNocnFfbl91MTYoIGEsICgxNiAtIGMpKTsKKyAgICBhX2MgID0gX21tX3NsbGlfZXBpMTYoYV9jLCAoMTYgLSBjKSk7IC8vbG9naWNhbCBzaGlmdCBwcm92aWRlcyByaWdodCAiYyIgYml0cyB6ZXJvcyBpbiBhCisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYV9jLCBiX3NoaWZ0KTsgLy9jb21iaW5lIChpbnNlcnQgYiBpbnRvIGEpCit9CisKK2ludDMyeDRfdCB2c3JpcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZTUkkuMzIgcTAscTAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2c3JpcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYykgLy8gVlNSSS4zMiBxMCxxMCwjMzIKK3sKKyAgICAvL3RvIGN1dCAiYyIgbGVmdCBiaXRzIGZyb20gYSB3ZSBkbyBzaGlmdCByaWdodCBhbmQgdGhlbiAgc2hpZnQgYmFjayBsZWZ0IHByb3ZpZGluZyBjIHJpZ2h0IHplcm9zIGluIGEKKyAgICB1aW50MzJ4NF90IGJfc2hpZnQ7CisgICAgdWludDMyeDRfdCBhX2M7CisgICAgYl9zaGlmdCA9IHZzaHJxX25fdTMyKCBiLCBjKTsgLy8gYyB6ZXJvcyBvbiB0aGUgbGVmdCBpbiBiIGR1ZSB0byBsb2dpY2FsIHNoaWZ0CisgICAgYV9jID0gdnNocnFfbl91MzIoIGEsICgzMiAtIGMpKTsKKyAgICBhX2MgID0gX21tX3NsbGlfZXBpMzIoYV9jLCAoMzIgLSBjKSk7IC8vbG9naWNhbCBzaGlmdCBwcm92aWRlcyByaWdodCAiYyIgYml0cyB6ZXJvcyBpbiBhCisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYV9jLCBiX3NoaWZ0KTsgLy9jb21iaW5lIChpbnNlcnQgYiBpbnRvIGEpCit9CisKK2ludDY0eDJfdCB2c3JpcV9uX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZTUkkuNjQgcTAscTAsIzY0CitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2c3JpcV9uX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYykKK3sKKyAgICAvL3NlcmlhbCBzb2x1dGlvbiBtYXkgYmUgZmFzdGVyCisgICAgdWludDY0eDJfdCBiX3NoaWZ0OworICAgIHVpbnQ2NHgyX3QgYV9jOworICAgIGJfc2hpZnQgPSBfbW1fc3JsaV9lcGk2NChiLCBjKTsgLy8gYyB6ZXJvcyBvbiB0aGUgbGVmdCBpbiBiIGR1ZSB0byBsb2dpY2FsIHNoaWZ0CisgICAgYV9jID0gX21tX3NybGlfZXBpNjQoYSwgKDY0IC0gYykpOworICAgIGFfYyAgPSBfbW1fc2xsaV9lcGk2NChhX2MsICg2NCAtIGMpKTsgLy9sb2dpY2FsIHNoaWZ0IHByb3ZpZGVzIHJpZ2h0ICJjIiBiaXRzIHplcm9zIGluIGEKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChhX2MsIGJfc2hpZnQpOyAvL2NvbWJpbmUgKGluc2VydCBiIGludG8gYSkKK30KKwordWludDh4MTZfdCB2c3JpcV9uX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkkuOCBxMCxxMCwjOAorI2RlZmluZSB2c3JpcV9uX3U4IHZzcmlxX25fczgKKwordWludDE2eDhfdCB2c3JpcV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSSS4xNiBxMCxxMCwjMTYKKyNkZWZpbmUgdnNyaXFfbl91MTYgdnNyaXFfbl9zMTYKKwordWludDMyeDRfdCB2c3JpcV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlNSSS4zMiBxMCxxMCwjMzIKKyNkZWZpbmUgdnNyaXFfbl91MzIgdnNyaXFfbl9zMzIKKwordWludDY0eDJfdCB2c3JpcV9uX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlNSSS42NCBxMCxxMCwjNjQKKyNkZWZpbmUgdnNyaXFfbl91NjQgdnNyaXFfbl9zNjQKKworcG9seTh4MTZfdCB2c3JpcV9uX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkkuOCBxMCxxMCwjOAorI2RlZmluZSB2c3JpcV9uX3A4IHZzcmlxX25fdTgKKworcG9seTE2eDhfdCB2c3JpcV9uX3AxNihwb2x5MTZ4OF90IGEsIHBvbHkxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSSS4xNiBxMCxxMCwjMTYKKyNkZWZpbmUgdnNyaXFfbl9wMTYgdnNyaXFfbl91MTYKKworLy8qKioqKiBWZWN0b3Igc2hpZnQgbGVmdCBhbmQgaW5zZXJ0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vQWN0dWFsbHkgdGhlICJjIiByaWdodCBiaXRzIGZyb20gImEiIGFyZSB0aGUgb25seSBiaXRzIHJlbWFpbmVkIGZyb20gImEiICBhZnRlciB0aGUgc2hpZnQuCisvL0FsbCBvdGhlciBiaXRzIGFyZSB0YWtlbiBmcm9tIGIgc2hpZnRlZC4gRW5kaW5nIHplcm9zIGFyZSBpbnNlcnRlZCBpbiBiIGluIHRoZSBzaGlmdCBwcm9jZXMuIFdlIG5lZWQgdG8gY29tYmluZSAiYSIgYW5kICJiIHNoaWZ0ZWQiLgoraW50OHg4X3QgdnNsaV9uX3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZTTEkuOCBkMCxkMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2c2xpX25fczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIsIF9fY29uc3RyYW5nZSgwLDcpIGludCBjKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KHZzbGlxX25fczgoX3BNMTI4aShhKSxfcE0xMjhpKGIpLCBjKSk7Cit9CisKKworaW50MTZ4NF90IHZzbGlfbl9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMTUpIGludCBjKTsgLy8gVlNMSS4xNiBkMCxkMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnNsaV9uX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGMpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZzbGlxX25fczE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSwgYykpOworfQorCisKK2ludDMyeDJfdCB2c2xpX25fczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYyk7IC8vIFZTTEkuMzIgZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZzbGlfbl9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMzEpIGludCBjKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2c2xpcV9uX3MzMihfcE0xMjhpKGEpLF9wTTEyOGkoYiksIGMpKTsKK30KKworaW50NjR4MV90IHZzbGlfbl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGMpOyAvLyBWU0xJLjY0IGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDFfdCB2c2xpX25fczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDAsNjMpIGludCBjKQoreworICAgIGludDY0eDFfdCByZXM7CisgICAgcmVzLm02NF9pNjRbMF0gPSAoYi5tNjRfaTY0WzBdIDw8IGMpIHwgKChhLm02NF91NjRbMF0gPDwgKDY0IC0gYykpID4+ICg2NCAtIGMpKTsgLy9uZWVkIHRvIHRyZWF0IGEgYXMgdW5zaWduZWQgdG8gZ2V0IGxlYWRpbmcgemVyb3MKKyAgICByZXR1cm4gcmVzOworfQorCisKK3VpbnQ4eDhfdCB2c2xpX25fdTgodWludDh4OF90IGEsICB1aW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWU0xJLjggZDAsZDAsIzAKKyNkZWZpbmUgdnNsaV9uX3U4IHZzbGlfbl9zOAorCit1aW50MTZ4NF90IHZzbGlfbl91MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGMpOyAvLyBWU0xJLjE2IGQwLGQwLCMwCisjZGVmaW5lIHZzbGlfbl91MTYgdnNsaV9uX3MxNgorCit1aW50MzJ4Ml90IHZzbGlfbl91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGMpOyAvLyBWU0xJLjMyIGQwLGQwLCMwCisjZGVmaW5lIHZzbGlfbl91MzIgdnNsaV9uX3MzMgorCit1aW50NjR4MV90IHZzbGlfbl91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYyk7IC8vIFZTTEkuNjQgZDAsZDAsIzAKKyNkZWZpbmUgdnNsaV9uX3U2NCB2c2xpX25fczY0CisKK3BvbHk4eDhfdCB2c2xpX25fcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZTTEkuOCBkMCxkMCwjMAorI2RlZmluZSB2c2xpX25fcDggdnNsaV9uX3U4CisKK3BvbHkxNng0X3QgdnNsaV9uX3AxNihwb2x5MTZ4NF90IGEsIHBvbHkxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMTUpIGludCBjKTsgLy8gVlNMSS4xNiBkMCxkMCwjMAorI2RlZmluZSB2c2xpX25fcDE2IHZzbGlfbl91MTYKKworaW50OHgxNl90IHZzbGlxX25fczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZTTEkuOCBxMCxxMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdnNsaXFfbl9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgwLDcpIGludCBjKSAvLyBWU0xJLjggcTAscTAsIzAKK3sKKyAgICBfX20xMjhpIG1hc2tBLCBhX21hc2tlZDsKKyAgICBpbnQ4eDE2X3QgYl9zaGlmdDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrUmlnaHRbOF0gPSB7MHgwLCAweDEsIDB4MywgMHg3LCAweDBmLCAweDFmLCAweDNmLCAweDdmfTsgLy8iYSIgYml0cyBtYXNrCisgICAgbWFza0EgPSBfbW1fc2V0MV9lcGk4KG1hc2tSaWdodFtjXSk7IC8vICg4LWMpemVyb3MgYW5kIGMgb25lcworICAgIGJfc2hpZnQgPSB2c2hscV9uX3M4KCBiLCBjKTsKKyAgICBhX21hc2tlZCA9IF9tbV9hbmRfc2kxMjggKGEsIG1hc2tBKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChiX3NoaWZ0LCBhX21hc2tlZCk7IC8vY29tYmluZSAoaW5zZXJ0IGIgaW50byBhKQorfQorCitpbnQxNng4X3QgdnNsaXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGMpOyAvLyBWU0xJLjE2IHEwLHEwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2c2xpcV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYykgLy8gVlNMSS4xNiBxMCxxMCwjMAoreworICAgIC8vdG8gY3V0ICJjIiByaWdodCBiaXRzIGZyb20gYSB3ZSBkbyBzaGlmdCBsZWZ0IGFuZCB0aGVuIGxvZ2ljYWwgc2hpZnQgYmFjayByaWdodCBwcm92aWRpbmcgKDE2LWMpemVyb3MgaW4gYQorICAgIGludDE2eDhfdCBiX3NoaWZ0OworICAgIGludDE2eDhfdCBhX2M7CisgICAgYl9zaGlmdCA9IHZzaGxxX25fczE2KCBiLCBjKTsKKyAgICBhX2MgPSB2c2hscV9uX3MxNiggYSwgKDE2IC0gYykpOworICAgIGFfYyAgPSBfbW1fc3JsaV9lcGkxNihhX2MsICgxNiAtIGMpKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChiX3NoaWZ0LCBhX2MpOyAvL2NvbWJpbmUgKGluc2VydCBiIGludG8gYSkKK30KKworaW50MzJ4NF90IHZzbGlxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDAsMzEpIGludCBjKTsgLy8gVlNMSS4zMiBxMCxxMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnNsaXFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGMpIC8vIFZTTEkuMzIgcTAscTAsIzAKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSAgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCB0aGUgc2VyaWFsIG9uZQorICAgIC8vdG8gY3V0ICJjIiByaWdodCBiaXRzIGZyb20gYSB3ZSBkbyBzaGlmdCBsZWZ0IGFuZCB0aGVuIGxvZ2ljYWwgc2hpZnQgYmFjayByaWdodCBwcm92aWRpbmcgKDMyLWMpemVyb3MgaW4gYQorICAgIGludDMyeDRfdCBiX3NoaWZ0OworICAgIGludDMyeDRfdCBhX2M7CisgICAgYl9zaGlmdCA9IHZzaGxxX25fczMyKCBiLCBjKTsKKyAgICBhX2MgPSB2c2hscV9uX3MzMiggYSwgKDMyIC0gYykpOworICAgIGFfYyAgPSBfbW1fc3JsaV9lcGkzMihhX2MsICgzMiAtIGMpKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChiX3NoaWZ0LCBhX2MpOyAvL2NvbWJpbmUgKGluc2VydCBiIGludG8gYSkKK30KKworaW50NjR4Ml90IHZzbGlxX25fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiwgX19jb25zdHJhbmdlKDAsNjMpIGludCBjKTsgLy8gVlNMSS42NCBxMCxxMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgdnNsaXFfbl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGMpIC8vIFZTTEkuNjQgcTAscTAsIzAKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSAgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCB0aGUgc2VyaWFsIG9uZQorICAgIC8vdG8gY3V0ICJjIiByaWdodCBiaXRzIGZyb20gYSB3ZSBkbyBzaGlmdCBsZWZ0IGFuZCB0aGVuIGxvZ2ljYWwgc2hpZnQgYmFjayByaWdodCBwcm92aWRpbmcgKDY0LWMpemVyb3MgaW4gYQorICAgIGludDY0eDJfdCBiX3NoaWZ0OworICAgIGludDY0eDJfdCBhX2M7CisgICAgYl9zaGlmdCA9IHZzaGxxX25fczY0KCBiLCBjKTsKKyAgICBhX2MgPSB2c2hscV9uX3M2NCggYSwgKDY0IC0gYykpOworICAgIGFfYyAgPSBfbW1fc3JsaV9lcGk2NChhX2MsICg2NCAtIGMpKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChiX3NoaWZ0LCBhX2MpOyAvL2NvbWJpbmUgKGluc2VydCBiIGludG8gYSkKK30KKwordWludDh4MTZfdCB2c2xpcV9uX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZTTEkuOCBxMCxxMCwjMAorI2RlZmluZSB2c2xpcV9uX3U4IHZzbGlxX25fczgKKwordWludDE2eDhfdCB2c2xpcV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDAsMTUpIGludCBjKTsgLy8gVlNMSS4xNiBxMCxxMCwjMAorI2RlZmluZSB2c2xpcV9uX3UxNiB2c2xpcV9uX3MxNgorCit1aW50MzJ4NF90IHZzbGlxX25fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGMpOyAvLyBWU0xJLjMyIHEwLHEwLCMwCisjZGVmaW5lIHZzbGlxX25fdTMyIHZzbGlxX25fczMyCisKK3VpbnQ2NHgyX3QgdnNsaXFfbl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYyk7IC8vIFZTTEkuNjQgcTAscTAsIzAKKyNkZWZpbmUgdnNsaXFfbl91NjQgdnNsaXFfbl9zNjQKKworcG9seTh4MTZfdCB2c2xpcV9uX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZTTEkuOCBxMCxxMCwjMAorI2RlZmluZSB2c2xpcV9uX3A4IHZzbGlxX25fdTgKKworcG9seTE2eDhfdCB2c2xpcV9uX3AxNihwb2x5MTZ4OF90IGEsIHBvbHkxNng4X3QgYiwgX19jb25zdHJhbmdlKDAsMTUpIGludCBjKTsgLy8gVlNMSS4xNiBxMCxxMCwjMAorI2RlZmluZSB2c2xpcV9uX3AxNiB2c2xpcV9uX3UxNgorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqIExvYWRzIGFuZCBzdG9yZXMgb2YgYSBzaW5nbGUgdmVjdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vUGVyZm9ybXMgbG9hZHMgYW5kIHN0b3JlcyBvZiBhIHNpbmdsZSB2ZWN0b3Igb2Ygc29tZSB0eXBlLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBMb2FkcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vV2UgYXNzdW1lIHB0ciBpcyBOT1QgYWxpZ25lZCBpbiBnZW5lcmFsIGNhc2UgYW5kIHVzZSBfX20xMjhpIF9tbV9sb2FkdV9zaTEyOCAoKF9fbTEyOGkqKSBwdHIpOy4KKy8vYWxzbyBmb3IgU1NFMyAgc3VwcG9ydGluZyBzeXN0ZW1zIHRoZSBfX20xMjhpIF9tbV9sZGRxdV9zaTEyOCAoX19tMTI4aSBjb25zdCogcCkgdXNhZ2UgZm9yIHVuYWxpZ25lZCBhY2Nlc3MgbWF5IGJlIGFkdmFudGFnZW91cy4KKy8vIGl0IGxvYWRzIGEgMzItYnl0ZSBibG9jayBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSBhbmQgZXh0cmFjdHMgdGhlIDE2IGJ5dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuYWxpZ25lZCBhY2Nlc3MKKy8vSWYgdGhlIHB0ciBpcyBhbGlnbmVkIHRoZW4gY291bGQgdXNlIF9fbTEyOGkgX21tX2xvYWRfc2kxMjggKChfX20xMjhpKikgcHRyKSBpbnN0ZWFkOworI2RlZmluZSBMT0FEX1NJMTI4KHB0cikgXAorICAgICAgICAoICgodW5zaWduZWQgbG9uZykocHRyKSAmIDE1KSA9PSAwICkgPyBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopKHB0cikpIDogX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikocHRyKSk7CisKK3VpbnQ4eDE2X3QgdmxkMXFfdTgoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfdTggTE9BRF9TSTEyOAorCit1aW50MTZ4OF90IHZsZDFxX3UxNihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfdTE2IExPQURfU0kxMjgKKwordWludDMyeDRfdCB2bGQxcV91MzIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZsZDFxX3UzMiBMT0FEX1NJMTI4CisKK3VpbnQ2NHgyX3QgdmxkMXFfdTY0KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2bGQxcV91NjQgTE9BRF9TSTEyOAorCitpbnQ4eDE2X3QgdmxkMXFfczgoX190cmFuc2ZlcnNpemUoMTYpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2bGQxcV9zOCBMT0FEX1NJMTI4CisKK2ludDE2eDhfdCB2bGQxcV9zMTYoX190cmFuc2ZlcnNpemUoOCkgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfczE2IExPQURfU0kxMjgKKworaW50MzJ4NF90IHZsZDFxX3MzMihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2bGQxcV9zMzIgTE9BRF9TSTEyOAorCitpbnQ2NHgyX3QgdmxkMXFfczY0KF9fdHJhbnNmZXJzaXplKDIpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZsZDFxX3M2NCBMT0FEX1NJMTI4CisKK2Zsb2F0MTZ4OF90IHZsZDFxX2YxNihfX3RyYW5zZmVyc2l6ZSg4KSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMCwgZDF9LCBbcjBdCisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseSwgc28gbmVlZCB0byBnbyB0byAzMiBiaXQgYW5kIHRoZW4gd29yayB3aXRoIHR3byAxMjhiaXQgcmVnaXN0ZXJzCisvKiBfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MTZ4OF90IHZsZDFxX2YxNihfX3RyYW5zZmVyc2l6ZSg4KSBfX2ZwMTYgY29uc3QgKiBwdHIpLy8gVkxEMS4xNiB7ZDAsIGQxfSwgW3IwXQore19fbTEyOCBmMSA9IF9tbV9zZXRfcHMgKHB0clszXSwgcHRyWzJdLCBwdHJbMV0sIHB0clswXSk7CitfX20xMjggZjI7CitmMiA9IF9tbV9zZXRfcHMgKHB0cls3XSwgcHRyWzZdLCBwdHJbNV0sIHB0cls0XSk7Cit9Ki8KKworZmxvYXQzMng0X3QgdmxkMXFfZjMyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwLCBkMX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3QgdmxkMXFfZjMyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCBjb25zdCAqIHB0cikKK3sKKyAgICBpZiggKCgodW5zaWduZWQgbG9uZykocHRyKSkgJiAxNSApID09IDAgKSAvLzE2IGJpdHMgYWxpZ25lZAorICAgICAgICByZXR1cm4gX21tX2xvYWRfcHMocHRyKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBfbW1fbG9hZHVfcHMocHRyKTsKK30KKworcG9seTh4MTZfdCB2bGQxcV9wOChfX3RyYW5zZmVyc2l6ZSgxNikgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2bGQxcV9wOCAgTE9BRF9TSTEyOAorCitwb2x5MTZ4OF90IHZsZDFxX3AxNihfX3RyYW5zZmVyc2l6ZSg4KSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfcDE2IExPQURfU0kxMjgKKwordWludDh4OF90IHZsZDFfdTgoX190cmFuc2ZlcnNpemUoOCkgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDB9LCBbcjBdCisjZGVmaW5lIHZsZDFfdTgocHRyKSAgKigoX19tNjRfMTI4KikocHRyKSkgLy93YXMgX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikocHRyKSkKKwordWludDE2eDRfdCB2bGQxX3UxNihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwfSwgW3IwXQorI2RlZmluZSB2bGQxX3UxNiB2bGQxX3U4CisKK3VpbnQzMngyX3QgdmxkMV91MzIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMH0sIFtyMF0KKyNkZWZpbmUgdmxkMV91MzIgdmxkMV91OAorCisKK3VpbnQ2NHgxX3QgdmxkMV91NjQoX190cmFuc2ZlcnNpemUoMSkgdWludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KKyNkZWZpbmUgdmxkMV91NjQgdmxkMV91OAorCitpbnQ4eDhfdCB2bGQxX3M4KF9fdHJhbnNmZXJzaXplKDgpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDB9LCBbcjBdCisjZGVmaW5lIHZsZDFfczggdmxkMV91OAorCitpbnQxNng0X3QgdmxkMV9zMTYoX190cmFuc2ZlcnNpemUoNCkgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwfSwgW3IwXQorI2RlZmluZSB2bGQxX3MxNiB2bGQxX3UxNgorCitpbnQzMngyX3QgdmxkMV9zMzIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwfSwgW3IwXQorI2RlZmluZSB2bGQxX3MzMiB2bGQxX3UzMgorCitpbnQ2NHgxX3QgdmxkMV9zNjQoX190cmFuc2ZlcnNpemUoMSkgaW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwfSwgW3IwXQorI2RlZmluZSB2bGQxX3M2NCB2bGQxX3U2NAorCitmbG9hdDE2eDRfdCB2bGQxX2YxNihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMH0sIFtyMF0KKy8vIElBMzIgU0lNRCBkb2Vzbid0IHdvcmsgd2l0aCAxNmJpdCBmbG9hdHMgY3VycmVudGx5LCBzbyBuZWVkIHRvIGdvIHRvIDMyIGJpdCBsaWtlIF9tbV9zZXRfcHMgKHB0clszXSwgcHRyWzJdLCBwdHJbMV0sIHB0clswXSk7CisKK2Zsb2F0MzJ4Ml90IHZsZDFfZjMyKF9fdHJhbnNmZXJzaXplKDIpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwfSwgW3IwXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2bGQxX2YzMihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpCit7CisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfZjMyWzBdID0gKihwdHIpOworICAgIHJlcy5tNjRfZjMyWzFdID0gKihwdHIgKyAxKTsKKyAgICByZXR1cm4gcmVzOworfQorCitwb2x5OHg4X3QgdmxkMV9wOChfX3RyYW5zZmVyc2l6ZSg4KSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS44IHtkMH0sIFtyMF0KKyNkZWZpbmUgdmxkMV9wOCB2bGQxX3U4CisKK3BvbHkxNng0X3QgdmxkMV9wMTYoX190cmFuc2ZlcnNpemUoNCkgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMH0sIFtyMF0KKyNkZWZpbmUgdmxkMV9wMTYgdmxkMV91MTYKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqIExhbmUgbG9hZCBmdW5jdGlvbnMgLSBpbnNlcnQgdGhlIGRhdGEgYXQgIHZlY3RvcidzIGdpdmVuIHBvc2l0aW9uIChsYW5lKSAqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit1aW50OHgxNl90IHZsZDFxX2xhbmVfdTgoX190cmFuc2ZlcnNpemUoMSkgdWludDhfdCBjb25zdCAqIHB0ciwgdWludDh4MTZfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgbGFuZSk7IC8vIFZMRDEuOCB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZsZDFxX2xhbmVfdTgocHRyLCB2ZWMsIGxhbmUpIF9NTV9JTlNFUlRfRVBJOCh2ZWMsICoocHRyKSwgbGFuZSkKKwordWludDE2eDhfdCB2bGQxcV9sYW5lX3UxNihfX3RyYW5zZmVyc2l6ZSgxKSAgICB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMS4xNiB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZsZDFxX2xhbmVfdTE2KHB0ciwgdmVjLCBsYW5lKSBfTU1fSU5TRVJUX0VQSTE2KHZlYywgKihwdHIpLCBsYW5lKQorCit1aW50MzJ4NF90IHZsZDFxX2xhbmVfdTMyKF9fdHJhbnNmZXJzaXplKDEpIHVpbnQzMl90IGNvbnN0ICogcHRyLCB1aW50MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQxLjMyIHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfbGFuZV91MzIocHRyLCB2ZWMsIGxhbmUpIF9NTV9JTlNFUlRfRVBJMzIodmVjLCAqKHB0ciksIGxhbmUpCisKK3VpbnQ2NHgyX3QgdmxkMXFfbGFuZV91NjQoX190cmFuc2ZlcnNpemUoMSkgdWludDY0X3QgY29uc3QgKiBwdHIsIHVpbnQ2NHgyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZMRDEuNjQge2QwfSwgW3IwXQorI2RlZmluZSB2bGQxcV9sYW5lX3U2NChwdHIsIHZlYywgbGFuZSkgX01NX0lOU0VSVF9FUEk2NCh2ZWMsICoocHRyKSwgbGFuZSk7IC8vIF9wOworCisKK2ludDh4MTZfdCB2bGQxcV9sYW5lX3M4KF9fdHJhbnNmZXJzaXplKDEpIGludDhfdCBjb25zdCAqIHB0ciwgaW50OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy8gVkxEMS44IHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfbGFuZV9zOChwdHIsIHZlYywgbGFuZSkgX01NX0lOU0VSVF9FUEk4KHZlYywgKihwdHIpLCBsYW5lKQorCitpbnQxNng4X3QgdmxkMXFfbGFuZV9zMTYoX190cmFuc2ZlcnNpemUoMSkgaW50MTZfdCBjb25zdCAqIHB0ciwgaW50MTZ4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQxLjE2IHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfbGFuZV9zMTYocHRyLCB2ZWMsIGxhbmUpIF9NTV9JTlNFUlRfRVBJMTYodmVjLCAqKHB0ciksIGxhbmUpCisKK2ludDMyeDRfdCB2bGQxcV9sYW5lX3MzMihfX3RyYW5zZmVyc2l6ZSgxKSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDEuMzIge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2bGQxcV9sYW5lX3MzMihwdHIsIHZlYywgbGFuZSkgX01NX0lOU0VSVF9FUEkzMih2ZWMsICoocHRyKSwgbGFuZSkKKworZmxvYXQxNng4X3QgdmxkMXFfbGFuZV9mMTYoX190cmFuc2ZlcnNpemUoMSkgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMS4xNiB7ZDBbMF19LCBbcjBdCisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCitmbG9hdDMyeDRfdCB2bGQxcV9sYW5lX2YzMihfX3RyYW5zZmVyc2l6ZSgxKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQxLjMyIHtkMFswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3QgdmxkMXFfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMSkgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgIC8vd2UgbmVlZCB0byBkZWFsIHdpdGggIHB0ciAgMTZiaXQgTk9UIGFsaWduZWQgY2FzZQorICAgIF9fbTEyOCBwOworICAgIHAgPSBfbW1fc2V0MV9wcygqKHB0cikpOworICAgIHJldHVybiBfTU1fSU5TRVJUX1BTKHZlYywgIHAsIF9JTlNFUlRQU19ORFgoMCwgbGFuZSkpOworfQorCitpbnQ2NHgyX3QgdmxkMXFfbGFuZV9zNjQoX190cmFuc2ZlcnNpemUoMSkgaW50NjRfdCBjb25zdCAqIHB0ciwgaW50NjR4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfbGFuZV9zNjQocHRyLCB2ZWMsIGxhbmUpIF9NTV9JTlNFUlRfRVBJNjQodmVjLCAqKHB0ciksIGxhbmUpCisKK3BvbHk4eDE2X3QgdmxkMXFfbGFuZV9wOChfX3RyYW5zZmVyc2l6ZSgxKSBwb2x5OF90IGNvbnN0ICogcHRyLCBwb2x5OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy8gVkxEMS44IHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfbGFuZV9wOChwdHIsIHZlYywgbGFuZSkgX01NX0lOU0VSVF9FUEk4KHZlYywgKihwdHIpLCBsYW5lKQorCitwb2x5MTZ4OF90IHZsZDFxX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDEpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQxLjE2IHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfbGFuZV9wMTYocHRyLCB2ZWMsIGxhbmUpIF9NTV9JTlNFUlRfRVBJMTYodmVjLCAqKHB0ciksIGxhbmUpCisKK3VpbnQ4eDhfdCB2bGQxX2xhbmVfdTgoX190cmFuc2ZlcnNpemUoMSkgdWludDhfdCBjb25zdCAqIHB0ciwgdWludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQxLjgge2QwWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdmxkMV9sYW5lX3U4KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ4X3QgY29uc3QgKiBwdHIsIHVpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKQoreworICAgIHVpbnQ4eDhfdCByZXM7CisgICAgcmVzID0gdmVjOworICAgIHJlcy5tNjRfdThbbGFuZV0gPSAqKHB0cik7CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDE2eDRfdCB2bGQxX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQxLjE2IHtkMFswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2bGQxX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgdWludDE2eDRfdCByZXM7CisgICAgcmVzID0gdmVjOworICAgIHJlcy5tNjRfdTE2W2xhbmVdID0gKihwdHIpOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMngyX3QgdmxkMV9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkxEMS4zMiB7ZDBbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdmxkMV9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgIHVpbnQzMngyX3QgcmVzOworICAgIHJlcyA9IHZlYzsKKyAgICByZXMubTY0X3UzMltsYW5lXSA9ICoocHRyKTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50NjR4MV90IHZsZDFfbGFuZV91NjQoX190cmFuc2ZlcnNpemUoMSkgdWludDY0X3QgY29uc3QgKiBwdHIsIHVpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZMRDEuNjQge2QwfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50NjR4MV90IHZsZDFfbGFuZV91NjQoX190cmFuc2ZlcnNpemUoMSkgdWludDY0X3QgY29uc3QgKiBwdHIsIHVpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSkKK3sKKyAgICB1aW50NjR4MV90IHJlczsKKyAgICByZXMubTY0X3U2NFswXSA9ICoocHRyKTsKKyAgICByZXR1cm4gcmVzOworfQorCisKK2ludDh4OF90IHZsZDFfbGFuZV9zOChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ4X3QgY29uc3QgKiBwdHIsIGludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQxLjgge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2bGQxX2xhbmVfczgocHRyLCB2ZWMsIGxhbmUpIHZsZDFfbGFuZV91OCgodWludDhfdCopcHRyLCB2ZWMsIGxhbmUpCisKK2ludDE2eDRfdCB2bGQxX2xhbmVfczE2KF9fdHJhbnNmZXJzaXplKDEpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMS4xNiB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZsZDFfbGFuZV9zMTYocHRyLCB2ZWMsIGxhbmUpIHZsZDFfbGFuZV91MTYoKHVpbnQxNl90KilwdHIsIHZlYywgbGFuZSkKKworaW50MzJ4Ml90IHZsZDFfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoMSkgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTEQxLjMyIHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMV9sYW5lX3MzMihwdHIsIHZlYywgbGFuZSkgdmxkMV9sYW5lX3UzMigodWludDMyX3QqKXB0ciwgdmVjLCBsYW5lKQorCitmbG9hdDE2eDRfdCB2bGQxX2xhbmVfZjE2KF9fdHJhbnNmZXJzaXplKDEpIF9fZnAxNiBjb25zdCAqIHB0ciwgZmxvYXQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDEuMTYge2QwWzBdfSwgW3IwXQorLy9jdXJyZW50IElBIFNJTUQgZG9lc24ndCBzdXBwb3J0IGZsb2F0MTYKKworZmxvYXQzMngyX3QgdmxkMV9sYW5lX2YzMihfX3RyYW5zZmVyc2l6ZSgxKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTEQxLjMyIHtkMFswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3QgdmxkMV9sYW5lX2YzMihfX3RyYW5zZmVyc2l6ZSgxKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpCit7CisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIHJlcyA9IHZlYzsKKyAgICByZXMubTY0X2YzMltsYW5lXSA9ICoocHRyKTsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQ2NHgxX3QgdmxkMV9sYW5lX3M2NChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ2NF90IGNvbnN0ICogcHRyLCBpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZMRDEuNjQge2QwfSwgW3IwXQorI2RlZmluZSB2bGQxX2xhbmVfczY0KHB0ciwgdmVjLCBsYW5lKSB2bGQxX2xhbmVfdTY0KCh1aW50NjRfdCopcHRyLCB2ZWMsIGxhbmUpCisKK3BvbHk4eDhfdCB2bGQxX2xhbmVfcDgoX190cmFuc2ZlcnNpemUoMSkgcG9seThfdCBjb25zdCAqIHB0ciwgcG9seTh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQxLjgge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2bGQxX2xhbmVfcDggdmxkMV9sYW5lX3U4CisKK3BvbHkxNng0X3QgdmxkMV9sYW5lX3AxNihfX3RyYW5zZmVyc2l6ZSgxKSBwb2x5MTZfdCBjb25zdCAqIHB0ciwgcG9seTE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMS4xNiB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZsZDFfbGFuZV9wMTYgdmxkMV9sYW5lX3MxNgorCisvLyAqKioqKioqKioqKioqKioqKiogTG9hZCBzaW5nbGUgdmFsdWUgKCBzZXQgYWxsIGxhbmVzIG9mIHZlY3RvciB3aXRoIHNhbWUgdmFsdWUgZnJvbSBtZW1vcnkpKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit1aW50OHgxNl90IHZsZDFxX2R1cF91OChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS44IHtkMFtdfSwgW3IwXQorI2RlZmluZSB2bGQxcV9kdXBfdTgocHRyKSBfbW1fc2V0MV9lcGk4KCoocHRyKSkKKwordWludDE2eDhfdCB2bGQxcV9kdXBfdTE2KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDBbXX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfZHVwX3UxNihwdHIpIF9tbV9zZXQxX2VwaTE2KCoocHRyKSkKKwordWludDMyeDRfdCB2bGQxcV9kdXBfdTMyKF9fdHJhbnNmZXJzaXplKDEpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDBbXX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfZHVwX3UzMihwdHIpIF9tbV9zZXQxX2VwaTMyKCoocHRyKSkKKwordWludDY0eDJfdCB2bGQxcV9kdXBfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDB9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3QgICB2bGQxcV9kdXBfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90IGNvbnN0ICogcHRyKQoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50NjRfdCB2YWxbMl0gPSB7KihwdHIpLCAqKHB0cil9OworICAgIHJldHVybiBMT0FEX1NJMTI4KHZhbCk7Cit9CisKK2ludDh4MTZfdCB2bGQxcV9kdXBfczgoX190cmFuc2ZlcnNpemUoMSkgaW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS44IHtkMFtdfSwgW3IwXQorI2RlZmluZSB2bGQxcV9kdXBfczgocHRyKSBfbW1fc2V0MV9lcGk4KCoocHRyKSkKKworaW50MTZ4OF90IHZsZDFxX2R1cF9zMTYoX190cmFuc2ZlcnNpemUoMSkgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwW119LCBbcjBdCisjZGVmaW5lIHZsZDFxX2R1cF9zMTYocHRyKSBfbW1fc2V0MV9lcGkxNiAoKihwdHIpKQorCitpbnQzMng0X3QgdmxkMXFfZHVwX3MzMihfX3RyYW5zZmVyc2l6ZSgxKSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDBbXX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfZHVwX3MzMihwdHIpIF9tbV9zZXQxX2VwaTMyICgqKHB0cikpCisKK2ludDY0eDJfdCB2bGQxcV9kdXBfczY0KF9fdHJhbnNmZXJzaXplKDEpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfZHVwX3M2NChwdHIpIHZsZDFxX2R1cF91NjQoKHVpbnQ2NF90KilwdHIpCisKK2Zsb2F0MTZ4OF90IHZsZDFxX2R1cF9mMTYoX190cmFuc2ZlcnNpemUoMSkgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDBbXX0sIFtyMF0KKy8vY3VycmVudCBJQSBTSU1EIGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdDE2LCBuZWVkIHRvIGdvIHRvIDMyIGJpdHMKKworZmxvYXQzMng0X3QgdmxkMXFfZHVwX2YzMihfX3RyYW5zZmVyc2l6ZSgxKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMFtdfSwgW3IwXQorI2RlZmluZSB2bGQxcV9kdXBfZjMyKHB0cikgX21tX3NldDFfcHMgKCoocHRyKSkKKworcG9seTh4MTZfdCB2bGQxcV9kdXBfcDgoX190cmFuc2ZlcnNpemUoMSkgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDBbXX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfZHVwX3A4KHB0cikgX21tX3NldDFfZXBpOCgqKHB0cikpCisKK3BvbHkxNng4X3QgdmxkMXFfZHVwX3AxNihfX3RyYW5zZmVyc2l6ZSgxKSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwW119LCBbcjBdCisjZGVmaW5lIHZsZDFxX2R1cF9wMTYocHRyKSBfbW1fc2V0MV9lcGkxNiAoKihwdHIpKQorCit1aW50OHg4X3QgdmxkMV9kdXBfdTgoX190cmFuc2ZlcnNpemUoMSkgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDBbXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDh4OF90IHZsZDFfZHVwX3U4KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ4X3QgY29uc3QgKiBwdHIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIHVpbnQ4eDhfdCByZXM7CisgICAgaW50IGk7CisgICAgZm9yKGkgPSAwOyBpPDg7IGkrKykgeworICAgICAgICByZXMubTY0X3U4W2ldID0gICoocHRyKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDE2eDRfdCB2bGQxX2R1cF91MTYoX190cmFuc2ZlcnNpemUoMSkgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMFtdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MTZ4NF90IHZsZDFfZHVwX3UxNihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MTZfdCBjb25zdCAqIHB0ciksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgdWludDE2eDRfdCByZXM7CisgICAgaW50IGk7CisgICAgZm9yKGkgPSAwOyBpPDQ7IGkrKykgeworICAgICAgICByZXMubTY0X3UxNltpXSA9ICAqKHB0cik7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMngyX3QgdmxkMV9kdXBfdTMyKF9fdHJhbnNmZXJzaXplKDEpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDBbXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDJfdCB2bGQxX2R1cF91MzIoX190cmFuc2ZlcnNpemUoMSkgdWludDMyX3QgY29uc3QgKiBwdHIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIHVpbnQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfdTMyWzBdID0gKihwdHIpOworICAgIHJlcy5tNjRfdTMyWzFdID0gKihwdHIpOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ2NHgxX3QgdmxkMV9kdXBfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDB9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgxX3QgdmxkMV9kdXBfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90IGNvbnN0ICogcHRyKQoreworICAgIHVpbnQ2NHgxX3QgcmVzOworICAgIHJlcy5tNjRfdTY0WzBdID0gKihwdHIpOworICAgIHJldHVybiByZXM7Cit9CisKK2ludDh4OF90IHZsZDFfZHVwX3M4KF9fdHJhbnNmZXJzaXplKDEpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDBbXX0sIFtyMF0KKyNkZWZpbmUgdmxkMV9kdXBfczgocHRyKSB2bGQxX2R1cF91OCgodWludDhfdCopcHRyKQorCisKK2ludDE2eDRfdCB2bGQxX2R1cF9zMTYoX190cmFuc2ZlcnNpemUoMSkgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwW119LCBbcjBdCisjZGVmaW5lIHZsZDFfZHVwX3MxNihwdHIpIHZsZDFfZHVwX3UxNigodWludDE2X3QqKXB0cikKKworCitpbnQzMngyX3QgdmxkMV9kdXBfczMyKF9fdHJhbnNmZXJzaXplKDEpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMFtdfSwgW3IwXQorI2RlZmluZSB2bGQxX2R1cF9zMzIocHRyKSB2bGQxX2R1cF91MzIoKHVpbnQzMl90KilwdHIpCisKKworaW50NjR4MV90IHZsZDFfZHVwX3M2NChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDB9LCBbcjBdCisjZGVmaW5lIHZsZDFfZHVwX3M2NChwdHIpIHZsZDFfZHVwX3U2NCgodWludDY0X3QqKXB0cikKKworZmxvYXQxNng0X3QgdmxkMV9kdXBfZjE2KF9fdHJhbnNmZXJzaXplKDEpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwW119LCBbcjBdCisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCitmbG9hdDMyeDJfdCB2bGQxX2R1cF9mMzIoX190cmFuc2ZlcnNpemUoMSkgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDBbXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3QgdmxkMV9kdXBfZjMyKF9fdHJhbnNmZXJzaXplKDEpIGZsb2F0MzJfdCBjb25zdCAqIHB0cikKK3sKKyAgICBmbG9hdDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9mMzJbMF0gPSAqKHB0cik7CisgICAgcmVzLm02NF9mMzJbMV0gPSByZXMubTY0X2YzMlswXTsKKyAgICByZXR1cm4gcmVzOyAvLyB1c2UgbGFzdCA2NGJpdHMgb25seQorfQorCitwb2x5OHg4X3QgdmxkMV9kdXBfcDgoX190cmFuc2ZlcnNpemUoMSkgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDBbXX0sIFtyMF0KKyNkZWZpbmUgdmxkMV9kdXBfcDggdmxkMV9kdXBfdTgKKworCitwb2x5MTZ4NF90IHZsZDFfZHVwX3AxNihfX3RyYW5zZmVyc2l6ZSgxKSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwW119LCBbcjBdCisjZGVmaW5lIHZsZDFfZHVwX3AxNiB2bGQxX2R1cF91MTYKKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFN0b3JlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gSWYgcHRyIGlzIDE2Yml0IGFsaWduZWQgYW5kIHlvdSAgbmVlZCB0byBzdG9yZSBkYXRhIHdpdGhvdXQgY2FjaGUgcG9sbHV0aW9uIHRoZW4gdXNlIHZvaWQgX21tX3N0cmVhbV9zaTEyOCAoKF9fbTEyOGkqKXB0ciwgdmFsKTsKKy8vaGVyZSB3ZSBhc3N1bWUgdGhlIGNhc2Ugb2YgIE5PVCAxNmJpdCBhbGlnbmVkIHB0ciBwb3NzaWJsZS4gSWYgaXQgaXMgYWxpZ25lZCB3ZSBjb3VsZCB0byB1c2UgX21tX3N0b3JlX3NpMTI4IGxpa2Ugc2hvd24gaW4gdGhlIGZvbGxvd2luZyBtYWNybworI2RlZmluZSBTVE9SRV9TSTEyOChwdHIsIHZhbCkgXAorICAgICAgICAoKCh1bnNpZ25lZCBsb25nKShwdHIpICYgMTUpID09IDAgKSA/IF9tbV9zdG9yZV9zaTEyOCAoKF9fbTEyOGkqKShwdHIpLCB2YWwpIDogX21tX3N0b3JldV9zaTEyOCAoKF9fbTEyOGkqKShwdHIpLCB2YWwpOworCit2b2lkIHZzdDFxX3U4KF9fdHJhbnNmZXJzaXplKDE2KSB1aW50OF90ICogcHRyLCB1aW50OHgxNl90IHZhbCk7IC8vIFZTVDEuOCB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2c3QxcV91OCBTVE9SRV9TSTEyOAorCit2b2lkIHZzdDFxX3UxNihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDhfdCB2YWwpOyAvLyBWU1QxLjE2IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZzdDFxX3UxNiBTVE9SRV9TSTEyOAorCit2b2lkIHZzdDFxX3UzMihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDRfdCB2YWwpOyAvLyBWU1QxLjMyIHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZzdDFxX3UzMiBTVE9SRV9TSTEyOAorCit2b2lkIHZzdDFxX3U2NChfX3RyYW5zZmVyc2l6ZSgyKSB1aW50NjRfdCAqIHB0ciwgdWludDY0eDJfdCB2YWwpOyAvLyBWU1QxLjY0IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZzdDFxX3U2NCBTVE9SRV9TSTEyOAorCit2b2lkIHZzdDFxX3M4KF9fdHJhbnNmZXJzaXplKDE2KSBpbnQ4X3QgKiBwdHIsIGludDh4MTZfdCB2YWwpOyAvLyBWU1QxLjgge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdnN0MXFfczggU1RPUkVfU0kxMjgKKwordm9pZCB2c3QxcV9zMTYoX190cmFuc2ZlcnNpemUoOCkgaW50MTZfdCAqIHB0ciwgaW50MTZ4OF90IHZhbCk7IC8vIFZTVDEuMTYge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdnN0MXFfczE2IFNUT1JFX1NJMTI4CisKK3ZvaWQgdnN0MXFfczMyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgKiBwdHIsIGludDMyeDRfdCB2YWwpOyAvLyBWU1QxLjMyIHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZzdDFxX3MzMiBTVE9SRV9TSTEyOAorCit2b2lkIHZzdDFxX3M2NChfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ2NF90ICogcHRyLCBpbnQ2NHgyX3QgdmFsKTsgLy8gVlNUMS42NCB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2c3QxcV9zNjQgU1RPUkVfU0kxMjgKKwordm9pZCB2c3QxcV9mMTYoX190cmFuc2ZlcnNpemUoOCkgX19mcDE2ICogcHRyLCBmbG9hdDE2eDhfdCB2YWwpOyAvLyBWU1QxLjE2IHtkMCwgZDF9LCBbcjBdCisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseQorCit2b2lkIHZzdDFxX2YzMihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NF90IHZhbCk7IC8vIFZTVDEuMzIge2QwLCBkMX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QxcV9mMzIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDRfdCB2YWwpCit7CisgICAgaWYoICgodW5zaWduZWQgbG9uZykocHRyKSAmIDE1KSAgPT0gMCApIC8vMTYgYml0cyBhbGlnbmVkCisgICAgICAgIF9tbV9zdG9yZV9wcyAocHRyLCB2YWwpOworICAgIGVsc2UKKyAgICAgICAgX21tX3N0b3JldV9wcyAocHRyLCB2YWwpOworfQorCit2b2lkIHZzdDFxX3A4KF9fdHJhbnNmZXJzaXplKDE2KSBwb2x5OF90ICogcHRyLCBwb2x5OHgxNl90IHZhbCk7IC8vIFZTVDEuOCB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2c3QxcV9wOCAgdnN0MXFfdTgKKwordm9pZCB2c3QxcV9wMTYoX190cmFuc2ZlcnNpemUoOCkgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4X3QgdmFsKTsgLy8gVlNUMS4xNiB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2c3QxcV9wMTYgdnN0MXFfdTE2CisKK3ZvaWQgdnN0MV91OChfX3RyYW5zZmVyc2l6ZSg4KSB1aW50OF90ICogcHRyLCB1aW50OHg4X3QgdmFsKTsgLy8gVlNUMS44IHtkMH0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QxX3U4KF9fdHJhbnNmZXJzaXplKDgpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDhfdCB2YWwpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaTw4OyBpKyspIHsKKyAgICAgICAgKihwdHIgKyBpKSA9ICgodWludDhfdCopJnZhbClbaV07CisgICAgfQorICAgIC8vX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopcHRyLCB2YWwpOworICAgIHJldHVybjsKK30KKwordm9pZCB2c3QxX3UxNihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDRfdCB2YWwpOyAvLyBWU1QxLjE2IHtkMH0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QxX3UxNihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDRfdCB2YWwpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaTw0OyBpKyspIHsKKyAgICAgICAgKihwdHIgKyBpKSA9ICgodWludDE2X3QqKSZ2YWwpW2ldOworICAgIH0KKyAgICAvL19tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKXB0ciwgdmFsKTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgdnN0MV91MzIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyX3QgdmFsKTsgLy8gVlNUMS4zMiB7ZDB9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0MV91MzIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyX3QgdmFsKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGk8MjsgaSsrKSB7CisgICAgICAgICoocHRyICsgaSkgPSAoKHVpbnQzMl90KikmdmFsKVtpXTsKKyAgICB9CisgICAgLy9fbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKilwdHIsIHZhbCk7CisgICAgcmV0dXJuOworfQorCit2b2lkIHZzdDFfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90ICogcHRyLCB1aW50NjR4MV90IHZhbCk7IC8vIFZTVDEuNjQge2QwfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDFfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90ICogcHRyLCB1aW50NjR4MV90IHZhbCkKK3sKKyAgICAqKHB0cikgPSAqKCh1aW50NjRfdCopJnZhbCk7CisgICAgLy9fbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKilwdHIsIHZhbCk7CisgICAgcmV0dXJuOworfQorCit2b2lkIHZzdDFfczgoX190cmFuc2ZlcnNpemUoOCkgaW50OF90ICogcHRyLCBpbnQ4eDhfdCB2YWwpOyAvLyBWU1QxLjgge2QwfSwgW3IwXQorI2RlZmluZSB2c3QxX3M4KHB0cix2YWwpIHZzdDFfdTgoKHVpbnQ4X3QqKXB0cix2YWwpCisKK3ZvaWQgdnN0MV9zMTYoX190cmFuc2ZlcnNpemUoNCkgaW50MTZfdCAqIHB0ciwgaW50MTZ4NF90IHZhbCk7IC8vIFZTVDEuMTYge2QwfSwgW3IwXQorI2RlZmluZSB2c3QxX3MxNihwdHIsdmFsKSB2c3QxX3UxNigodWludDE2X3QqKXB0cix2YWwpCisKK3ZvaWQgdnN0MV9zMzIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCAqIHB0ciwgaW50MzJ4Ml90IHZhbCk7IC8vIFZTVDEuMzIge2QwfSwgW3IwXQorI2RlZmluZSB2c3QxX3MzMihwdHIsdmFsKSB2c3QxX3UzMigodWludDMyX3QqKXB0cix2YWwpCisKK3ZvaWQgdnN0MV9zNjQoX190cmFuc2ZlcnNpemUoMSkgaW50NjRfdCAqIHB0ciwgaW50NjR4MV90IHZhbCk7IC8vIFZTVDEuNjQge2QwfSwgW3IwXQorI2RlZmluZSB2c3QxX3M2NChwdHIsdmFsKSB2c3QxX3U2NCgodWludDY0X3QqKXB0cix2YWwpCisKK3ZvaWQgdnN0MV9mMTYoX190cmFuc2ZlcnNpemUoNCkgX19mcDE2ICogcHRyLCBmbG9hdDE2eDRfdCB2YWwpOyAvLyBWU1QxLjE2IHtkMH0sIFtyMF0KKy8vY3VycmVudCBJQSBTSU1EIGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdDE2CisKK3ZvaWQgdnN0MV9mMzIoX190cmFuc2ZlcnNpemUoMikgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJfdCB2YWwpOyAvLyBWU1QxLjMyIHtkMH0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QxX2YzMihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4Ml90IHZhbCkKK3sKKyAgICAqKHB0cikgPSAgIHZhbC5tNjRfZjMyWzBdOworICAgICoocHRyICsgMSkgPSB2YWwubTY0X2YzMlsxXTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgdnN0MV9wOChfX3RyYW5zZmVyc2l6ZSg4KSBwb2x5OF90ICogcHRyLCBwb2x5OHg4X3QgdmFsKTsgLy8gVlNUMS44IHtkMH0sIFtyMF0KKyNkZWZpbmUgdnN0MV9wOCB2c3QxX3U4CisKK3ZvaWQgdnN0MV9wMTYoX190cmFuc2ZlcnNpemUoNCkgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0X3QgdmFsKTsgLy8gVlNUMS4xNiB7ZDB9LCBbcjBdCisjZGVmaW5lIHZzdDFfcDE2IHZzdDFfdTE2CisKKy8vKioqKioqKioqKipTdG9yZSBhIGxhbmUgb2YgYSB2ZWN0b3IgaW50byBtZW1vcnkgKGV4dHJhY3QgZ2l2ZW4gbGFuZSkgKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordm9pZCB2c3QxcV9sYW5lX3U4KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDE2X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvLyBWU1QxLjgge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2c3QxcV9sYW5lX3U4KHB0ciwgdmFsLCBsYW5lKSAqKHB0cikgPSBfTU1fRVhUUkFDVF9FUEk4ICh2YWwsIGxhbmUpCisKK3ZvaWQgdnN0MXFfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoMSkgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDEuMTYge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2c3QxcV9sYW5lX3UxNihwdHIsIHZhbCwgbGFuZSkgKihwdHIpID0gX01NX0VYVFJBQ1RfRVBJMTYgKHZhbCwgbGFuZSkKKwordm9pZCB2c3QxcV9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUMS4zMiB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZzdDFxX2xhbmVfdTMyKHB0ciwgdmFsLCBsYW5lKSAqKHB0cikgPSBfTU1fRVhUUkFDVF9FUEkzMiAodmFsLCBsYW5lKQorCit2b2lkIHZzdDFxX2xhbmVfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90ICogcHRyLCB1aW50NjR4Ml90IHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWU1QxLjY0IHtkMH0sIFtyMF0KKyNkZWZpbmUgdnN0MXFfbGFuZV91NjQocHRyLCB2YWwsIGxhbmUpICoocHRyKSA9IF9NTV9FWFRSQUNUX0VQSTY0ICh2YWwsIGxhbmUpCisKK3ZvaWQgdnN0MXFfbGFuZV9zOChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ4X3QgKiBwdHIsIGludDh4MTZfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgbGFuZSk7IC8vIFZTVDEuOCB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZzdDFxX2xhbmVfczgocHRyLCB2YWwsIGxhbmUpICoocHRyKSA9IF9NTV9FWFRSQUNUX0VQSTggKHZhbCwgbGFuZSkKKwordm9pZCB2c3QxcV9sYW5lX3MxNihfX3RyYW5zZmVyc2l6ZSgxKSBpbnQxNl90ICogcHRyLCBpbnQxNng4X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDEuMTYge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2c3QxcV9sYW5lX3MxNihwdHIsIHZhbCwgbGFuZSkgKihwdHIpID0gX01NX0VYVFJBQ1RfRVBJMTYgKHZhbCwgbGFuZSkKKwordm9pZCB2c3QxcV9sYW5lX3MzMihfX3RyYW5zZmVyc2l6ZSgxKSBpbnQzMl90ICogcHRyLCBpbnQzMng0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDEuMzIge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2c3QxcV9sYW5lX3MzMihwdHIsIHZhbCwgbGFuZSkgKihwdHIpID0gX01NX0VYVFJBQ1RfRVBJMzIgKHZhbCwgbGFuZSkKKwordm9pZCB2c3QxcV9sYW5lX3M2NChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ2NF90ICogcHRyLCBpbnQ2NHgyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZTVDEuNjQge2QwfSwgW3IwXQorI2RlZmluZSB2c3QxcV9sYW5lX3M2NChwdHIsIHZhbCwgbGFuZSkgKihwdHIpID0gX01NX0VYVFJBQ1RfRVBJNjQgKHZhbCwgbGFuZSkKKwordm9pZCB2c3QxcV9sYW5lX2YxNihfX3RyYW5zZmVyc2l6ZSgxKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OF90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1QxLjE2IHtkMFswXX0sIFtyMF0KKy8vY3VycmVudCBJQSBTSU1EIGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdDE2CisKK3ZvaWQgdnN0MXFfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMSkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUMS4zMiB7ZDBbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0MXFfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMSkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgIGludDMyX3QgaWxhbmU7CisgICAgaWxhbmUgPSBfTU1fRVhUUkFDVF9QUyh2YWwsbGFuZSk7CisgICAgKihwdHIpID0gICooKGZsb2F0KikmaWxhbmUpOworfQorCit2b2lkIHZzdDFxX2xhbmVfcDgoX190cmFuc2ZlcnNpemUoMSkgcG9seThfdCAqIHB0ciwgcG9seTh4MTZfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgbGFuZSk7IC8vIFZTVDEuOCB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZzdDFxX2xhbmVfcDggICB2c3QxcV9sYW5lX3U4CisKK3ZvaWQgdnN0MXFfbGFuZV9wMTYoX190cmFuc2ZlcnNpemUoMSkgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDEuMTYge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2c3QxcV9sYW5lX3AxNiAgIHZzdDFxX2xhbmVfczE2CisKK3ZvaWQgdnN0MV9sYW5lX3U4KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDhfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMS44IHtkMFswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QxX2xhbmVfdTgoX190cmFuc2ZlcnNpemUoMSkgdWludDhfdCAqIHB0ciwgdWludDh4OF90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpCit7CisgICAgKihwdHIpID0gdmFsLm02NF91OFtsYW5lXTsKK30KKwordm9pZCB2c3QxX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1QxLjE2IHtkMFswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QxX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgKihwdHIpID0gdmFsLm02NF91MTZbbGFuZV07Cit9CisKK3ZvaWQgdnN0MV9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVlNUMS4zMiB7ZDBbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0MV9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgICoocHRyKSA9IHZhbC5tNjRfdTMyW2xhbmVdOworfQorCit2b2lkIHZzdDFfbGFuZV91NjQoX190cmFuc2ZlcnNpemUoMSkgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgxX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZTVDEuNjQge2QwfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDFfbGFuZV91NjQoX190cmFuc2ZlcnNpemUoMSkgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgxX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSkKK3sKKyAgICAqKHB0cikgPSB2YWwubTY0X3U2NFswXTsKK30KKwordm9pZCB2c3QxX2xhbmVfczgoX190cmFuc2ZlcnNpemUoMSkgaW50OF90ICogcHRyLCBpbnQ4eDhfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMS44IHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgIHZzdDFfbGFuZV9zOChwdHIsIHZhbCwgbGFuZSkgdnN0MV9sYW5lX3U4KCh1aW50OF90KilwdHIsIHZhbCwgbGFuZSkKKwordm9pZCB2c3QxX2xhbmVfczE2KF9fdHJhbnNmZXJzaXplKDEpIGludDE2X3QgKiBwdHIsIGludDE2eDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUMS4xNiB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZzdDFfbGFuZV9zMTYocHRyLCB2YWwsIGxhbmUpIHZzdDFfbGFuZV91MTYoKHVpbnQxNl90KilwdHIsIHZhbCwgbGFuZSkKKwordm9pZCB2c3QxX2xhbmVfczMyKF9fdHJhbnNmZXJzaXplKDEpIGludDMyX3QgKiBwdHIsIGludDMyeDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVlNUMS4zMiB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZzdDFfbGFuZV9zMzIocHRyLCB2YWwsIGxhbmUpICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopcHRyLCB2YWwsIGxhbmUpCisKKwordm9pZCB2c3QxX2xhbmVfczY0KF9fdHJhbnNmZXJzaXplKDEpIGludDY0X3QgKiBwdHIsIGludDY0eDFfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKTsgLy8gVlNUMS42NCB7ZDB9LCBbcjBdCisjZGVmaW5lIHZzdDFfbGFuZV9zNjQocHRyLCB2YWwsIGxhbmUpIHZzdDFfbGFuZV91NjQoKHVpbnQ2NF90KilwdHIsIHZhbCwgbGFuZSkKKworCit2b2lkIHZzdDFfbGFuZV9mMTYoX190cmFuc2ZlcnNpemUoMSkgX19mcDE2ICogcHRyLCBmbG9hdDE2eDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUMS4xNiB7ZDBbMF19LCBbcjBdCisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCit2b2lkIHZzdDFfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMSkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVlNUMS4zMiB7ZDBbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0MV9sYW5lX2YzMihfX3RyYW5zZmVyc2l6ZSgxKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4Ml90IHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpCit7CisgICAgKihwdHIpID0gdmFsLm02NF9mMzJbbGFuZV07Cit9CisKK3ZvaWQgdnN0MV9sYW5lX3A4KF9fdHJhbnNmZXJzaXplKDEpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDhfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMS44IHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdnN0MV9sYW5lX3A4IHZzdDFfbGFuZV91OAorCit2b2lkIHZzdDFfbGFuZV9wMTYoX190cmFuc2ZlcnNpemUoMSkgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDEuMTYge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2c3QxX2xhbmVfcDE2IHZzdDFfbGFuZV9zMTYKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqIExvYWRzIGFuZCBzdG9yZXMgb2YgYW4gTi1lbGVtZW50IHN0cnVjdHVyZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL1RoZXNlIGludHJpbnNpY3MgbG9hZCBvciBzdG9yZSBhbiBuLWVsZW1lbnQgc3RydWN0dXJlLiBUaGUgYXJyYXkgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nCisvL1dlIGFzc3VtZSBwdHIgaXMgTk9UIGFsaWduZWQgaW4gZ2VuZXJhbCBjYXNlLCBmb3IgbW9yZSBkZXRhaWxzIHNlZSAgIkxvYWRzIGFuZCBzdG9yZXMgb2YgYSBzaW5nbGUgdmVjdG9yIGZ1bmN0aW9ucyIKKy8vKioqKioqKioqKioqKioqKioqIDIgZWxlbWVudHMgbG9hZCAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit1aW50OHgxNngyX3QgdmxkMnFfdTgoX190cmFuc2ZlcnNpemUoMzIpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjgge2QwLCBkMn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZ4Ml90IHZsZDJxX3U4KF9fdHJhbnNmZXJzaXplKDMyKSB1aW50OF90IGNvbnN0ICogcHRyKSAvLyBWTEQyLjgge2QwLCBkMn0sIFtyMF0KK3sKKyAgICB1aW50OHgxNngyX3QgdjsKKyAgICB2LnZhbFswXSA9IHZsZDFxX3U4KHB0cik7CisgICAgdi52YWxbMV0gPSB2bGQxcV91OCgocHRyICsgMTYpKTsKKyAgICB2ID0gdnV6cHFfczgodi52YWxbMF0sIHYudmFsWzFdKTsKKyAgICByZXR1cm4gdjsKK30KKwordWludDE2eDh4Ml90IHZsZDJxX3UxNihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjE2IHtkMCwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4eDJfdCB2bGQycV91MTYoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQxNl90IGNvbnN0ICogcHRyKSAvLyBWTEQyLjE2IHtkMCwgZDJ9LCBbcjBdCit7CisgICAgdWludDE2eDh4Ml90IHY7CisgICAgdi52YWxbMF0gPSB2bGQxcV91MTYoIHB0cik7CisgICAgdi52YWxbMV0gPSB2bGQxcV91MTYoIChwdHIgKyA4KSk7CisgICAgdiA9IHZ1enBxX3MxNih2LnZhbFswXSwgdi52YWxbMV0pOworICAgIHJldHVybiB2OworfQorCit1aW50MzJ4NHgyX3QgdmxkMnFfdTMyKF9fdHJhbnNmZXJzaXplKDgpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDAsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NHgyX3QgdmxkMnFfdTMyKF9fdHJhbnNmZXJzaXplKDgpIHVpbnQzMl90IGNvbnN0ICogcHRyKSAvLyBWTEQyLjMyIHtkMCwgZDJ9LCBbcjBdCit7CisgICAgdWludDMyeDR4Ml90IHY7CisgICAgdi52YWxbMF0gPSB2bGQxcV91MzIgKCBwdHIpOworICAgIHYudmFsWzFdID0gdmxkMXFfdTMyICggKHB0ciArIDQpKTsKKyAgICB2ID0gdnV6cHFfczMyKHYudmFsWzBdLCB2LnZhbFsxXSk7CisgICAgcmV0dXJuIHY7Cit9CisKK2ludDh4MTZ4Ml90IHZsZDJxX3M4KF9fdHJhbnNmZXJzaXplKDMyKSBpbnQ4X3QgY29uc3QgKiBwdHIpOworI2RlZmluZSAgdmxkMnFfczgocHRyKSB2bGQycV91OCgodWludDhfdCopIHB0cikKKworaW50MTZ4OHgyX3QgdmxkMnFfczE2KF9fdHJhbnNmZXJzaXplKDE2KSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDAsIGQyfSwgW3IwXQorI2RlZmluZSB2bGQycV9zMTYocHRyKSB2bGQycV91MTYoKHVpbnQxNl90KikgcHRyKQorCitpbnQzMng0eDJfdCB2bGQycV9zMzIoX190cmFuc2ZlcnNpemUoOCkgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMzIge2QwLCBkMn0sIFtyMF0KKyNkZWZpbmUgdmxkMnFfczMyKHB0cikgdmxkMnFfdTMyKCh1aW50MzJfdCopIHB0cikKKworCitmbG9hdDE2eDh4Ml90IHZsZDJxX2YxNihfX3RyYW5zZmVyc2l6ZSgxNikgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDAsIGQyfSwgW3IwXQorLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHksIHNvIG5lZWQgdG8gZ28gdG8gMzIgYml0IGFuZCB0aGVuIHdvcmsgd2l0aCB0d28gMTI4Yml0IHJlZ2lzdGVycy4gU2VlIHZsZDFxX2YxNiBmb3IgZXhhbXBsZQorCitmbG9hdDMyeDR4Ml90IHZsZDJxX2YzMihfX3RyYW5zZmVyc2l6ZSg4KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjMyIHtkMCwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NHgyX3QgdmxkMnFfZjMyKF9fdHJhbnNmZXJzaXplKDgpIGZsb2F0MzJfdCBjb25zdCAqIHB0cikgLy8gVkxEMi4zMiB7ZDAsIGQyfSwgW3IwXQoreworICAgIGZsb2F0MzJ4NHgyX3QgdjsKKyAgICB2LnZhbFswXSA9ICB2bGQxcV9mMzIgKHB0cik7CisgICAgdi52YWxbMV0gPSAgdmxkMXFfZjMyICgocHRyICsgNCkpOworICAgIHYgPSB2dXpwcV9mMzIodi52YWxbMF0sIHYudmFsWzFdKTsKKyAgICByZXR1cm4gdjsKK30KKworcG9seTh4MTZ4Ml90IHZsZDJxX3A4KF9fdHJhbnNmZXJzaXplKDMyKSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi44IHtkMCwgZDJ9LCBbcjBdCisjZGVmaW5lICB2bGQycV9wOCB2bGQycV91OAorCitwb2x5MTZ4OHgyX3QgdmxkMnFfcDE2KF9fdHJhbnNmZXJzaXplKDE2KSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwLCBkMn0sIFtyMF0KKyNkZWZpbmUgdmxkMnFfcDE2IHZsZDJxX3UxNgorCit1aW50OHg4eDJfdCB2bGQyX3U4KF9fdHJhbnNmZXJzaXplKDE2KSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi44IHtkMCwgZDF9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDh4Ml90IHZsZDJfdTgoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQ4X3QgY29uc3QgKiBwdHIpCit7CisgICAgdWludDh4OHgyX3QgdjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4X2V2ZW5fb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNX07CisgICAgX19tMTI4aSBsZDEyODsKKyAgICBsZDEyOCA9IHZsZDFxX3U4KHB0cik7IC8vbWVyZ2UgdHdvIDY0LWJpdHMgaW4gMTI4IGJpdAorICAgIGxkMTI4ID0gIF9tbV9zaHVmZmxlX2VwaTgobGQxMjgsICooX19tMTI4aSopbWFzazhfZXZlbl9vZGQpOworICAgIHZzdDFxX3U4KCh2LnZhbCksIGxkMTI4KTsgLy8gIHYudmFsWzFdID0gX21tX3NodWZmbGVfZXBpMzIodi52YWxbMF0sIF9TV0FQX0hJX0xPVzMyKTsKKyAgICByZXR1cm4gdjsKK30KKwordWludDE2eDR4Ml90IHZsZDJfdTE2KF9fdHJhbnNmZXJzaXplKDgpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDAsIGQxfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NHgyX3QgdmxkMl91MTYoX190cmFuc2ZlcnNpemUoOCkgdWludDE2X3QgY29uc3QgKiBwdHIpCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQxNng0eDJfdCB2OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazE2X2V2ZW5fb2RkWzE2XSA9IHsgMCwxLCA0LDUsIDgsOSwgMTIsMTMsIDIsMywgNiw3LCAxMCwxMSwgMTQsMTV9OworICAgIF9fbTEyOGkgbGQxMjg7CisgICAgbGQxMjggPSB2bGQxcV91MTYocHRyKTsgLy9tZXJnZSB0d28gNjQtYml0cyBpbiAxMjggYml0CisgICAgbGQxMjggPSBfbW1fc2h1ZmZsZV9lcGk4KGxkMTI4LCAqKF9fbTEyOGkqKW1hc2sxNl9ldmVuX29kZCk7CisgICAgdnN0MXFfdTE2KCh2LnZhbCksIGxkMTI4KTsKKyAgICByZXR1cm4gdjsKK30KKwordWludDMyeDJ4Ml90IHZsZDJfdTMyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDAsIGQxfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4MngyX3QgdmxkMl91MzIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgY29uc3QgKiBwdHIpCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQzMngyeDJfdCB2OworICAgIF9fbTEyOGkgbGQxMjg7CisgICAgbGQxMjggPSB2bGQxcV91MzIocHRyKTsgLy9tZXJnZSB0d28gNjQtYml0cyBpbiAxMjggYml0CisgICAgbGQxMjggPSBfbW1fc2h1ZmZsZV9lcGkzMihsZDEyOCwgIDAgfCAoMiA8PCAyKSB8ICgxIDw8IDQpIHwgKDMgPDwgNikpOworICAgIHZzdDFxX3UzMigodi52YWwpLCBsZDEyOCk7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQ2NHgxeDJfdCB2bGQyX3U2NChfX3RyYW5zZmVyc2l6ZSgyKSB1aW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDF4Ml90IHZsZDJfdTY0KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ2NF90IGNvbnN0ICogcHRyKQoreworICAgIHVpbnQ2NHgxeDJfdCB2OworICAgIHYudmFsWzBdLm02NF91NjRbMF0gPSAqKHB0cik7CisgICAgdi52YWxbMV0ubTY0X3U2NFswXSA9ICoocHRyICsgMSk7CisgICAgcmV0dXJuIHY7Cit9CisKK2ludDh4OHgyX3QgdmxkMl9zOChfX3RyYW5zZmVyc2l6ZSgxNikgaW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi44IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZsZDJfczgocHRyKSB2bGQyX3U4KCh1aW50OF90KilwdHIpCisKK2ludDE2eDR4Ml90IHZsZDJfczE2KF9fdHJhbnNmZXJzaXplKDgpIGludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjE2IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZsZDJfczE2KHB0cikgdmxkMl91MTYoKHVpbnQxNl90KilwdHIpCisKK2ludDMyeDJ4Ml90IHZsZDJfczMyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjMyIHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZsZDJfczMyKHB0cikgdmxkMl91MzIoKHVpbnQzMl90KilwdHIpCisKK2ludDY0eDF4Ml90IHZsZDJfczY0KF9fdHJhbnNmZXJzaXplKDIpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZsZDJfczY0KHB0cikgdmxkMl91NjQoKHVpbnQ2NF90KilwdHIpCisKK2Zsb2F0MTZ4NHgyX3QgdmxkMl9mMTYoX190cmFuc2ZlcnNpemUoOCkgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDAsIGQxfSwgW3IwXQorLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHksIHNvIG5lZWQgdG8gZ28gdG8gMzIgYml0IGFuZCB0aGVuIHdvcmsgd2l0aCB0d28gMTI4Yml0IHJlZ2lzdGVycy4gU2VlIHZsZDFfZjE2IGZvciBleGFtcGxlCisKK2Zsb2F0MzJ4MngyX3QgdmxkMl9mMzIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDAsIGQxfSwgW3IwXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJ4Ml90IHZsZDJfZjMyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCBjb25zdCAqIHB0cikKK3sKKyAgICBmbG9hdDMyeDJ4Ml90IHY7CisgICAgdi52YWxbMF0ubTY0X2YzMlswXSA9ICoocHRyKTsKKyAgICB2LnZhbFswXS5tNjRfZjMyWzFdID0gKihwdHIgKyAyKTsKKyAgICB2LnZhbFsxXS5tNjRfZjMyWzBdID0gKihwdHIgKyAxKTsKKyAgICB2LnZhbFsxXS5tNjRfZjMyWzFdID0gKihwdHIgKyAzKTsKKyAgICByZXR1cm4gdjsKK30KKworcG9seTh4OHgyX3QgdmxkMl9wOChfX3RyYW5zZmVyc2l6ZSgxNikgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuOCB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2bGQyX3A4IHZsZDJfdTgKKworcG9seTE2eDR4Ml90IHZsZDJfcDE2KF9fdHJhbnNmZXJzaXplKDgpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2bGQyX3AxNiB2bGQyX3UxNgorCisvLyoqKioqKioqKioqKioqKioqKioqIFRyaXBsZXRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3VpbnQ4eDE2eDNfdCB2bGQzcV91OChfX3RyYW5zZmVyc2l6ZSg0OCkgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDAsIGQyLCBkNH0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZ4M190IHZsZDNxX3U4KF9fdHJhbnNmZXJzaXplKDQ4KSB1aW50OF90IGNvbnN0ICogcHRyKSAvLyBWTEQzLjgge2QwLCBkMiwgZDR9LCBbcjBdCit7CisgICAgLy9hMCxhMSxhMixhMywuLi5hNyxhOCwuLi5hMTUsICBiMCxiMSxiMiwuLi5iNyxiOCwuLi5iMTUsIGMwLGMxLGMyLC4uLmM3LGM4LC4uLmMxNSAtPgorICAgIC8vYTowLDMsNiw5LDEyLDE1LGI6Miw1LDgsMTEsMTQsICBjOjEsNCw3LDEwLDEzCisgICAgLy9hOjEsNCw3LDEwLDEzLCAgYjowLDMsNiw5LDEyLDE1LGM6Miw1LDgsMTEsMTQsCisgICAgLy9hOjIsNSw4LDExLDE0LCAgYjoxLDQsNywxMCwxMywgIGM6MCwzLDYsOSwxMiwxNQorICAgIHVpbnQ4eDE2eDNfdCB2OworICAgIF9fbTEyOGkgdG1wMCwgdG1wMSx0bXAyLCB0bXAzOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMFsxNl0gPSB7MCwzLDYsOSwxMiwxNSwxLDQsNywxMCwxMywyLDUsOCwxMSwxNH07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF8xWzE2XSA9IHsyLDUsOCwxMSwxNCwwLDMsNiw5LDEyLDE1LDEsNCw3LDEwLDEzfTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzJbMTZdID0gezEsNCw3LDEwLDEzLDIsNSw4LDExLDE0LDAsMyw2LDksMTIsMTV9OworCisgICAgdi52YWxbMF0gPSAgdmxkMXFfdTggKHB0cik7IC8vYTAsYTEsYTIsYTMsLi4uYTcsIC4uLmExNQorICAgIHYudmFsWzFdID0gIHZsZDFxX3U4ICgocHRyICsgMTYpKTsgLy9iMCxiMSxiMixiMy4uLmI3LCAuLi5iMTUKKyAgICB2LnZhbFsyXSA9ICB2bGQxcV91OCAoKHB0ciArIDMyKSk7IC8vYzAsYzEsYzIsYzMsLi4uYzcsLi4uYzE1CisKKyAgICB0bXAwID0gX21tX3NodWZmbGVfZXBpOCh2LnZhbFswXSwgKihfX20xMjhpKiltYXNrOF8wKTsgLy9hOjAsMyw2LDksMTIsMTUsMSw0LDcsMTAsMTMsMiw1LDgsMTEKKyAgICB0bXAxID0gX21tX3NodWZmbGVfZXBpOCh2LnZhbFsxXSwgKihfX20xMjhpKiltYXNrOF8xKTsgLy9iOjIsNSw4LDExLDE0LDAsMyw2LDksMTIsMTUsMSw0LDcsMTAsMTMKKyAgICB0bXAyID0gX21tX3NodWZmbGVfZXBpOCh2LnZhbFsyXSwgKihfX20xMjhpKiltYXNrOF8yKTsgLy9jOjEsNCw3LDEwLDEzLDIsNSw4LDExLDE0LDMsNiw5LDEyLDE1CisKKyAgICB0bXAzID0gX21tX3NsbGlfc2kxMjgodG1wMCwxMCk7IC8vMCwwLDAsMCwwLDAsMCwwLDAsMCxhMCxhMyxhNixhOSxhMTIsYTE1CisgICAgdG1wMyA9IF9tbV9hbGlnbnJfZXBpOCh0bXAxLHRtcDMsIDEwKTsgLy9hOjAsMyw2LDksMTIsMTUsYjoyLDUsOCwxMSwxNCx4LHgseCx4LHgKKyAgICB0bXAzID0gX21tX3NsbGlfc2kxMjgodG1wMywgNSk7IC8vMCwwLDAsMCwwLGE6MCwzLDYsOSwxMiwxNSxiOjIsNSw4LDExLDE0LAorICAgIHRtcDMgPSBfbW1fc3JsaV9zaTEyOCh0bXAzLCA1KTsgLy9hOjAsMyw2LDksMTIsMTUsYjoyLDUsOCwxMSwxNCw6MCwwLDAsMCwwCisgICAgdi52YWxbMF0gPSBfbW1fc2xsaV9zaTEyOCh0bXAyLCAxMSk7IC8vMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIDEsNCw3LDEwLDEzLAorICAgIHYudmFsWzBdID0gX21tX29yX3NpMTI4KHYudmFsWzBdLHRtcDMpOyAvL2E6MCwzLDYsOSwxMiwxNSxiOjIsNSw4LDExLDE0LGM6MSw0LDcsMTAsMTMsCisKKyAgICB0bXAzID0gX21tX3NsbGlfc2kxMjgodG1wMCwgNSk7IC8vMCwwLDAsMCwwLGE6MCwzLDYsOSwxMiwxNSwxLDQsNywxMCwxMywKKyAgICB0bXAzID0gX21tX3NybGlfc2kxMjgodG1wMywgMTEpOyAvL2E6MSw0LDcsMTAsMTMsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMAorICAgIHYudmFsWzFdID0gX21tX3NybGlfc2kxMjgodG1wMSw1KTsgLy9iOjAsMyw2LDksMTIsMTUsQzoxLDQsNywxMCwxMywgMCwwLDAsMCwwCisgICAgdi52YWxbMV0gPSBfbW1fc2xsaV9zaTEyOCh2LnZhbFsxXSwgNSk7IC8vMCwwLDAsMCwwLGI6MCwzLDYsOSwxMiwxNSxDOjEsNCw3LDEwLDEzLAorICAgIHYudmFsWzFdID0gX21tX29yX3NpMTI4KHYudmFsWzFdLHRtcDMpOyAvL2E6MSw0LDcsMTAsMTMsYjowLDMsNiw5LDEyLDE1LEM6MSw0LDcsMTAsMTMsCisgICAgdi52YWxbMV0gPSAgX21tX3NsbGlfc2kxMjgodi52YWxbMV0sNSk7IC8vMCwwLDAsMCwwLGE6MSw0LDcsMTAsMTMsYjowLDMsNiw5LDEyLDE1LAorICAgIHYudmFsWzFdID0gX21tX3NybGlfc2kxMjgodi52YWxbMV0sIDUpOyAvL2E6MSw0LDcsMTAsMTMsYjowLDMsNiw5LDEyLDE1LDAsMCwwLDAsMAorICAgIHRtcDMgPSBfbW1fc3JsaV9zaTEyOCh0bXAyLDUpOyAvL2M6Miw1LDgsMTEsMTQsMCwzLDYsOSwxMiwxNSwwLDAsMCwwLDAKKyAgICB0bXAzID0gX21tX3NsbGlfc2kxMjgodG1wMywxMSk7IC8vMCwwLDAsMCwwLDAsMCwwLDAsMCwwLGM6Miw1LDgsMTEsMTQsCisgICAgdi52YWxbMV0gPSBfbW1fb3Jfc2kxMjgodi52YWxbMV0sdG1wMyk7IC8vYToxLDQsNywxMCwxMyxiOjAsMyw2LDksMTIsMTUsYzoyLDUsOCwxMSwxNCwKKworICAgIHRtcDMgPSBfbW1fc3JsaV9zaTEyOCh0bXAyLDEwKTsgLy9jOjAsMyw2LDksMTIsMTUsIDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgdG1wMyA9IF9tbV9zbGxpX3NpMTI4KHRtcDMsMTApOyAvLzAsMCwwLDAsMCwwLDAsMCwwLDAsIGM6MCwzLDYsOSwxMiwxNSwKKyAgICB2LnZhbFsyXSA9IF9tbV9zcmxpX3NpMTI4KHRtcDEsMTEpOyAvL2I6MSw0LDcsMTAsMTMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwCisgICAgdi52YWxbMl0gPSBfbW1fc2xsaV9zaTEyOCh2LnZhbFsyXSw1KTsgLy8wLDAsMCwwLDAsYjoxLDQsNywxMCwxMywgMCwwLDAsMCwwLDAKKyAgICB2LnZhbFsyXSA9IF9tbV9vcl9zaTEyOCh2LnZhbFsyXSx0bXAzKTsgLy8wLDAsMCwwLDAsYjoxLDQsNywxMCwxMyxjOjAsMyw2LDksMTIsMTUsCisgICAgdG1wMCA9IF9tbV9zcmxpX3NpMTI4KHRtcDAsIDExKTsgLy9hOjIsNSw4LDExLDE0LCAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgdi52YWxbMl0gPSBfbW1fb3Jfc2kxMjgodi52YWxbMl0sdG1wMCk7IC8vYToyLDUsOCwxMSwxNCxiOjEsNCw3LDEwLDEzLGM6MCwzLDYsOSwxMiwxNSwKKyAgICByZXR1cm4gdjsKK30KKwordWludDE2eDh4M190IHZsZDNxX3UxNihfX3RyYW5zZmVyc2l6ZSgyNCkgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMCwgZDIsIGQ0fSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OHgzX3QgdmxkM3FfdTE2KF9fdHJhbnNmZXJzaXplKDI0KSB1aW50MTZfdCBjb25zdCAqIHB0cikgLy8gVkxEMy4xNiB7ZDAsIGQyLCBkNH0sIFtyMF0KK3sKKyAgICAvL2EwLCBhMSxhMixhMywuLi5hNywgIGIwLGIxLGIyLGIzLC4uLmI3LCBjMCxjMSxjMixjMy4uLmM3IC0+IGEwLGEzLGE2LGIxLGI0LGI3LGMyLGM1LCBhMSxhNCxhNyxiMixiNSxjMCxjMyxjNiwgYTIsYTUsYjAsYjMsYjYsYzEsYzQsYzcKKyAgICB1aW50MTZ4OHgzX3QgdjsKKyAgICBfX20xMjhpIHRtcDAsIHRtcDEsdG1wMiwgdG1wMzsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2sxNl8wWzE2XSA9IHswLDEsIDYsNywgMTIsMTMsIDIsMywgOCw5LCAxNCwxNSwgNCw1LCAxMCwxMX07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMTZfMVsxNl0gPSB7MiwzLCA4LDksIDE0LDE1LCA0LDUsIDEwLDExLCAwLDEsIDYsNywgMTIsMTN9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazE2XzJbMTZdID0gezQsNSwgMTAsMTEsIDAsMSwgNiw3LCAxMiwxMywgMiwzLCA4LDksIDE0LDE1fTsKKworICAgIHYudmFsWzBdID0gIHZsZDFxX3UxNiAocHRyKTsgLy9hMCxhMSxhMixhMywuLi5hNywKKyAgICB2LnZhbFsxXSA9ICB2bGQxcV91MTYgKChwdHIgKyA4KSk7IC8vYjAsYjEsYjIsYjMuLi5iNworICAgIHYudmFsWzJdID0gIHZsZDFxX3UxNiAoKHB0ciArIDE2KSk7IC8vYzAsYzEsYzIsYzMsLi4uYzcKKworICAgIHRtcDAgPSBfbW1fc2h1ZmZsZV9lcGk4KHYudmFsWzBdLCAqKF9fbTEyOGkqKW1hc2sxNl8wKTsgLy9hMCxhMyxhNixhMSxhNCxhNyxhMixhNSwKKyAgICB0bXAxID0gX21tX3NodWZmbGVfZXBpOCh2LnZhbFsxXSwgKihfX20xMjhpKiltYXNrMTZfMSk7IC8vYjEsYjQsYjcsYjIsYjUsYjAsYjMsYjYKKyAgICB0bXAyID0gX21tX3NodWZmbGVfZXBpOCh2LnZhbFsyXSwgKihfX20xMjhpKiltYXNrMTZfMik7IC8vYzIsYzUsIGMwLGMzLGM2LCBjMSxjNCxjNworCisgICAgdG1wMyA9IF9tbV9zbGxpX3NpMTI4KHRtcDAsMTApOyAvLzAsMCwwLDAsMCxhMCxhMyxhNiwKKyAgICB0bXAzID0gX21tX2FsaWducl9lcGk4KHRtcDEsdG1wMywgMTApOyAvL2EwLGEzLGE2LGIxLGI0LGI3LHgseAorICAgIHRtcDMgPSBfbW1fc2xsaV9zaTEyOCh0bXAzLCA0KTsgLy8wLDAsIGEwLGEzLGE2LGIxLGI0LGI3CisgICAgdG1wMyA9IF9tbV9zcmxpX3NpMTI4KHRtcDMsIDQpOyAvL2EwLGEzLGE2LGIxLGI0LGI3LDAsMAorICAgIHYudmFsWzBdID0gX21tX3NsbGlfc2kxMjgodG1wMiwgMTIpOyAvLzAsMCwwLDAsMCwwLCBjMixjNSwKKyAgICB2LnZhbFswXSA9IF9tbV9vcl9zaTEyOCh2LnZhbFswXSx0bXAzKTsgLy9hMCxhMyxhNixiMSxiNCxiNyxjMixjNQorCisgICAgdG1wMyA9IF9tbV9zbGxpX3NpMTI4KHRtcDAsIDQpOyAvLzAsMCxhMCxhMyxhNixhMSxhNCxhNworICAgIHRtcDMgPSBfbW1fc3JsaV9zaTEyOCh0bXAzLDEwKTsgLy9hMSxhNCxhNywgMCwwLDAsMCwwCisgICAgdi52YWxbMV0gPSBfbW1fc3JsaV9zaTEyOCh0bXAxLDYpOyAvL2IyLGI1LGIwLGIzLGI2LDAsMAorICAgIHYudmFsWzFdID0gX21tX3NsbGlfc2kxMjgodi52YWxbMV0sIDYpOyAvLzAsMCwwLGIyLGI1LGIwLGIzLGI2LAorICAgIHYudmFsWzFdID0gX21tX29yX3NpMTI4KHYudmFsWzFdLHRtcDMpOyAvL2ExLGE0LGE3LGIyLGI1LGIwLGIzLGI2LAorICAgIHYudmFsWzFdID0gIF9tbV9zbGxpX3NpMTI4KHYudmFsWzFdLDYpOyAvLzAsMCwwLGExLGE0LGE3LGIyLGI1LAorICAgIHYudmFsWzFdID0gX21tX3NybGlfc2kxMjgodi52YWxbMV0sIDYpOyAvL2ExLGE0LGE3LGIyLGI1LDAsMCwwLAorICAgIHRtcDMgPSBfbW1fc3JsaV9zaTEyOCh0bXAyLDQpOyAvL2MwLGMzLGM2LCBjMSxjNCxjNywwLDAKKyAgICB0bXAzID0gX21tX3NsbGlfc2kxMjgodG1wMywxMCk7IC8vMCwwLDAsMCwwLGMwLGMzLGM2LAorICAgIHYudmFsWzFdID0gX21tX29yX3NpMTI4KHYudmFsWzFdLHRtcDMpOyAvL2ExLGE0LGE3LGIyLGI1LGMwLGMzLGM2LAorCisgICAgdG1wMyA9IF9tbV9zcmxpX3NpMTI4KHRtcDIsMTApOyAvL2MxLGM0LGM3LCAwLDAsMCwwLDAKKyAgICB0bXAzID0gX21tX3NsbGlfc2kxMjgodG1wMywxMCk7IC8vMCwwLDAsMCwwLCBjMSxjNCxjNywKKyAgICB2LnZhbFsyXSA9IF9tbV9zcmxpX3NpMTI4KHRtcDEsMTApOyAvL2IwLGIzLGI2LDAsMCwgMCwwLDAKKyAgICB2LnZhbFsyXSA9IF9tbV9zbGxpX3NpMTI4KHYudmFsWzJdLDQpOyAvLzAsMCwgYjAsYjMsYjYsMCwwLDAKKyAgICB2LnZhbFsyXSA9IF9tbV9vcl9zaTEyOCh2LnZhbFsyXSx0bXAzKTsgLy8wLDAsIGIwLGIzLGI2LGMxLGM0LGM3LAorICAgIHRtcDAgPSBfbW1fc3JsaV9zaTEyOCh0bXAwLCAxMik7IC8vYTIsYTUsMCwwLDAsMCwwLDAKKyAgICB2LnZhbFsyXSA9IF9tbV9vcl9zaTEyOCh2LnZhbFsyXSx0bXAwKTsgLy9hMixhNSxiMCxiMyxiNixjMSxjNCxjNywKKyAgICByZXR1cm4gdjsKK30KKwordWludDMyeDR4M190IHZsZDNxX3UzMihfX3RyYW5zZmVyc2l6ZSgxMikgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMCwgZDIsIGQ0fSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NHgzX3QgdmxkM3FfdTMyKF9fdHJhbnNmZXJzaXplKDEyKSB1aW50MzJfdCBjb25zdCAqIHB0cikgLy8gVkxEMy4zMiB7ZDAsIGQyLCBkNH0sIFtyMF0KK3sKKyAgICAvL2EwLGExLGEyLGEzLCAgYjAsYjEsYjIsYjMsIGMwLGMxLGMyLGMzIC0+IGEwLGEzLGIyLGMxLCAgYTEsYjAsYjMsYzIsIGEyLGIxLGMwLGMzLAorICAgIHVpbnQzMng0eDNfdCB2OworICAgIF9fbTEyOGkgdG1wMCwgdG1wMSx0bXAyLCB0bXAzOworICAgIHYudmFsWzBdID0gIHZsZDFxX3UzMiAocHRyKTsgLy9hMCxhMSxhMixhMywKKyAgICB2LnZhbFsxXSA9ICB2bGQxcV91MzIgKChwdHIgKyA0KSk7IC8vYjAsYjEsYjIsYjMKKyAgICB2LnZhbFsyXSA9ICB2bGQxcV91MzIgKChwdHIgKyA4KSk7IC8vYzAsYzEsYzIsYzMsCisKKyAgICB0bXAwID0gX21tX3NodWZmbGVfZXBpMzIodi52YWxbMF0sIDAgfCAoMyA8PCAyKSB8ICgxIDw8IDQpIHwgKDIgPDwgNikpOyAvL2EwLGEzLGExLGEyCisgICAgdG1wMSA9IF9tbV9zaHVmZmxlX2VwaTMyKHYudmFsWzFdLCBfU1dBUF9ISV9MT1czMik7IC8vYjIsYjMsYjAsYjEKKyAgICB0bXAyID0gX21tX3NodWZmbGVfZXBpMzIodi52YWxbMl0sIDEgfCAoMiA8PCAyKSB8ICgwIDw8IDQpIHwgKDMgPDwgNikpOyAvL2MxLGMyLCBjMCxjMworCisgICAgdG1wMyA9IF9tbV91bnBhY2tsb19lcGkzMih0bXAxLCB0bXAyKTsgLy9iMixjMSwgYjMsYzIKKyAgICB2LnZhbFswXSA9IF9tbV91bnBhY2tsb19lcGk2NCh0bXAwLHRtcDMpOyAvL2EwLGEzLGIyLGMxCisgICAgdG1wMCA9IF9tbV91bnBhY2toaV9lcGkzMih0bXAwLCB0bXAxKTsgLy9hMSxiMCwgYTIsYjEKKyAgICB2LnZhbFsxXSA9IF9tbV9zaHVmZmxlX2VwaTMyKHRtcDAsIF9TV0FQX0hJX0xPVzMyICk7IC8vYTIsYjEsIGExLGIwLAorICAgIHYudmFsWzFdID0gX21tX3VucGFja2hpX2VwaTY0KHYudmFsWzFdLCB0bXAzKTsgLy9hMSxiMCwgYjMsYzIKKyAgICB2LnZhbFsyXSA9IF9tbV91bnBhY2toaV9lcGk2NCh0bXAwLCB0bXAyKTsgLy9hMixiMSwgYzAsYzMKKyAgICByZXR1cm4gdjsKK30KKworaW50OHgxNngzX3QgdmxkM3FfczgoX190cmFuc2ZlcnNpemUoNDgpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDAsIGQyLCBkNH0sIFtyMF0KKyNkZWZpbmUgIHZsZDNxX3M4KHB0cikgdmxkM3FfdTgoKHVpbnQ4X3QqKSAocHRyKSkKKworaW50MTZ4OHgzX3QgdmxkM3FfczE2KF9fdHJhbnNmZXJzaXplKDI0KSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDAsIGQyLCBkNH0sIFtyMF0KKyNkZWZpbmUgIHZsZDNxX3MxNihwdHIpIHZsZDNxX3UxNigodWludDE2X3QqKSAocHRyKSkKKworaW50MzJ4NHgzX3QgdmxkM3FfczMyKF9fdHJhbnNmZXJzaXplKDEyKSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4zMiB7ZDAsIGQyLCBkNH0sIFtyMF0KKyNkZWZpbmUgIHZsZDNxX3MzMihwdHIpIHZsZDNxX3UzMigodWludDMyX3QqKSAocHRyKSkKKworZmxvYXQxNng4eDNfdCB2bGQzcV9mMTYoX190cmFuc2ZlcnNpemUoMjQpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwLCBkMiwgZDR9LCBbcjBdCisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseSwgc28gbmVlZCB0byBnbyB0byAzMiBiaXQgYW5kIHRoZW4gd29yayB3aXRoIHR3byAxMjhiaXQgcmVnaXN0ZXJzLiBTZWUgdmxkMXFfZjE2IGZvciBleGFtcGxlCisKK2Zsb2F0MzJ4NHgzX3QgdmxkM3FfZjMyKF9fdHJhbnNmZXJzaXplKDEyKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMCwgZDIsIGQ0fSwgW3IwXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDR4M190IHZsZDNxX2YzMihfX3RyYW5zZmVyc2l6ZSgxMikgZmxvYXQzMl90IGNvbnN0ICogcHRyKSAvLyBWTEQzLjMyIHtkMCwgZDIsIGQ0fSwgW3IwXQoreworICAgIC8vYTAsYTEsYTIsYTMsICBiMCxiMSxiMixiMywgYzAsYzEsYzIsYzMgLT4gYTAsYTMsYjIsYzEsICBhMSxiMCxiMyxjMiwgYTIsYjEsYzAsYzMsCisgICAgZmxvYXQzMng0eDNfdCB2OworICAgIF9fbTEyOCB0bXAwLCB0bXAxLHRtcDIsIHRtcDM7CisgICAgdi52YWxbMF0gPSAgdmxkMXFfZjMyIChwdHIpOyAvL2EwLGExLGEyLGEzLAorICAgIHYudmFsWzFdID0gIHZsZDFxX2YzMiAoKHB0ciArIDQpKTsgLy9iMCxiMSxiMixiMworICAgIHYudmFsWzJdID0gIHZsZDFxX2YzMiAoKHB0ciArIDgpKTsgLy9jMCxjMSxjMixjMywKKworICAgIHRtcDAgPSBfbW1fY2FzdHNpMTI4X3BzKF9tbV9zaHVmZmxlX2VwaTMyKF9tbV9jYXN0cHNfc2kxMjgodi52YWxbMF0pLCAwIHwgKDMgPDwgMikgfCAoMSA8PCA0KSB8ICgyIDw8IDYpKSk7IC8vYTAsYTMsYTEsYTIKKyAgICB0bXAxID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2h1ZmZsZV9lcGkzMihfbW1fY2FzdHBzX3NpMTI4KHYudmFsWzFdKSwgX1NXQVBfSElfTE9XMzIpKTsgLy9iMixiMyxiMCxiMQorICAgIHRtcDIgPSBfbW1fY2FzdHNpMTI4X3BzKF9tbV9zaHVmZmxlX2VwaTMyKF9tbV9jYXN0cHNfc2kxMjgodi52YWxbMl0pLCAxIHwgKDIgPDwgMikgfCAoMCA8PCA0KSB8ICgzIDw8IDYpKSk7IC8vYzEsYzIsIGMwLGMzCisgICAgdG1wMyA9IF9tbV91bnBhY2tsb19wcyh0bXAxLCB0bXAyKTsgLy9iMixjMSwgYjMsYzIKKworICAgIHYudmFsWzBdID0gX21tX21vdmVsaF9wcyh0bXAwLHRtcDMpOyAvL2EwLGEzLGIyLGMxCisgICAgdG1wMCA9IF9tbV91bnBhY2toaV9wcyh0bXAwLCB0bXAxKTsgLy9hMSxiMCwgYTIsYjEKKyAgICB2LnZhbFsxXSA9IF9tbV9jYXN0c2kxMjhfcHMoX21tX3NodWZmbGVfZXBpMzIoX21tX2Nhc3Rwc19zaTEyOCh0bXAwKSwgX1NXQVBfSElfTE9XMzIgKSk7IC8vYTIsYjEsIGExLGIwLAorICAgIHYudmFsWzFdID0gX21tX21vdmVobF9wcyh0bXAzLHYudmFsWzFdKTsgLy9hMSxiMCwgYjMsYzIKKyAgICB2LnZhbFsyXSA9IF9tbV9tb3ZlaGxfcHModG1wMix0bXAwKTsgLy9hMixiMSwgYzAsYzMKKyAgICByZXR1cm4gdjsKK30KKworcG9seTh4MTZ4M190IHZsZDNxX3A4KF9fdHJhbnNmZXJzaXplKDQ4KSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy44IHtkMCwgZDIsIGQ0fSwgW3IwXQorI2RlZmluZSB2bGQzcV9wOCB2bGQzcV91OAorCitwb2x5MTZ4OHgzX3QgdmxkM3FfcDE2KF9fdHJhbnNmZXJzaXplKDI0KSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwLCBkMiwgZDR9LCBbcjBdCisjZGVmaW5lIHZsZDNxX3AxNiB2bGQzcV91MTYKKwordWludDh4OHgzX3QgdmxkM191OChfX3RyYW5zZmVyc2l6ZSgyNCkgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDAsIGQxLCBkMn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OHgzX3QgdmxkM191OChfX3RyYW5zZmVyc2l6ZSgyNCkgdWludDhfdCBjb25zdCAqIHB0cikgLy8gVkxEMy44IHtkMCwgZDEsIGQyfSwgW3IwXQoreworICAgIC8vYTAsIGExLGEyLGEzLC4uLmE3LCAgYjAsYjEsYjIsYjMsLi4uYjcsIGMwLGMxLGMyLGMzLi4uYzcgLT4gYTAsYTMsYTYsYjEsYjQsYjcsYzIsYzUsIGExLGE0LGE3LGIyLGI1LGMwLGMzLGM2LCBhMixhNSxiMCxiMyxiNixjMSxjNCxjNworICAgIHVpbnQ4eDh4M190IHY7CisgICAgX19tMTI4aSB2YWwwLCB2YWwxLCB2YWwyLCB0bXAwLCB0bXAxOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMFsxNl0gPSB7MCwzLDYsOSwxMiwxNSwgMSw0LDcsMTAsMTMsIDIsNSw4LDExLDE0fTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzFbMTZdID0gezIsNSwgMCwzLDYsIDEsNCw3LCAwLDAsMCwwLDAsMCwwLDB9OworICAgIHZhbDAgPSAgdmxkMXFfdTggKHB0cik7IC8vYTAsYTEsYTIsYTMsLi4uYTcsIGIwLGIxLGIyLGIzLi4uYjcKKyAgICB2YWwyID0gIF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKHB0ciArIDE2KSk7IC8vYzAsYzEsYzIsYzMsLi4uYzcKKworICAgIHRtcDAgPSBfbW1fc2h1ZmZsZV9lcGk4KHZhbDAsICooX19tMTI4aSopbWFzazhfMCk7IC8vYTAsYTMsYTYsYjEsYjQsYjcsIGExLGE0LGE3LGIyLGI1LCBhMixhNSxiMCxiMyxiNiwKKyAgICB0bXAxID0gX21tX3NodWZmbGVfZXBpOCh2YWwyLCAqKF9fbTEyOGkqKW1hc2s4XzEpOyAvL2MyLGM1LCBjMCxjMyxjNiwgYzEsYzQsYzcseCx4LHgseCx4LHgseCx4CisgICAgdmFsMCA9IF9tbV9zbGxpX3NpMTI4KHRtcDAsMTApOworICAgIHZhbDAgPSBfbW1fc3JsaV9zaTEyOCh2YWwwLDEwKTsgLy9hMCxhMyxhNixiMSxiNCxiNywgMCwwLDAsMCwwLDAsMCwwLDAsMAorICAgIHZhbDIgPSBfbW1fc2xsaV9zaTEyOCh0bXAxLDYpOyAvLzAsMCwwLDAsMCwwLGMyLGM1LHgseCx4LHgseCx4LHgseAorICAgIHZhbDAgPSBfbW1fb3Jfc2kxMjgodmFsMCx2YWwyKTsgLy9hMCxhMyxhNixiMSxiNCxiNyxjMixjNSB4LHgseCx4LHgseCx4LHgKKyAgICBfTTY0KHYudmFsWzBdLCB2YWwwKTsKKyAgICB2YWwxID0gX21tX3NsbGlfc2kxMjgodG1wMCw1KTsgLy8wLDAsMCwwLDAsMCwwLDAsMCwwLDAsIGExLGE0LGE3LGIyLGI1LAorICAgIHZhbDEgPSBfbW1fc3JsaV9zaTEyOCh2YWwxLDExKTsgLy9hMSxhNCxhNyxiMixiNSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgdmFsMiA9IF9tbV9zcmxpX3NpMTI4KHRtcDEsMik7IC8vYzAsYzMsYzYsYzEsYzQsYzcseCx4LHgseCx4LHgseCx4LDAsMAorICAgIHZhbDIgPSBfbW1fc2xsaV9zaTEyOCh2YWwyLDUpOyAvLzAsMCwwLDAsMCxjMCxjMyxjNiwwLDAsMCwwLDAsMCwwLDAKKyAgICB2YWwxID0gX21tX29yX3NpMTI4KHZhbDEsdmFsMik7IC8vYTEsYTQsYTcsYjIsYjUsYzAsYzMsYzYseCx4LHgseCx4LHgseCx4CisgICAgX002NCh2LnZhbFsxXSwgdmFsMSk7CisKKyAgICB0bXAwID0gX21tX3NybGlfc2kxMjgodG1wMCwxMSk7IC8vYTIsYTUsYjAsYjMsYjYsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIHZhbDIgPSBfbW1fc3JsaV9zaTEyOCh0bXAxLDUpOyAvL2MxLGM0LGM3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAKKyAgICB2YWwyID0gX21tX3NsbGlfc2kxMjgodmFsMiw1KTsgLy8wLDAsMCwwLDAsYzEsYzQsYzcsCisgICAgdmFsMiA9IF9tbV9vcl9zaTEyOCh0bXAwLCB2YWwyKTsgLy9hMixhNSxiMCxiMyxiNixjMSxjNCxjNyx4LHgseCx4LHgseCx4LHgKKyAgICBfTTY0KHYudmFsWzJdLCB2YWwyKTsKKyAgICByZXR1cm4gdjsKK30KKwordWludDE2eDR4M190IHZsZDNfdTE2KF9fdHJhbnNmZXJzaXplKDEyKSB1aW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwLCBkMSwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0eDNfdCB2bGQzX3UxNihfX3RyYW5zZmVyc2l6ZSgxMikgdWludDE2X3QgY29uc3QgKiBwdHIpIC8vIFZMRDMuMTYge2QwLCBkMSwgZDJ9LCBbcjBdCit7CisgICAgLy9hMCxhMSxhMixhMywgIGIwLGIxLGIyLGIzLCBjMCxjMSxjMixjMyAtPiBhMCxhMyxiMixjMSwgIGExLGIwLGIzLGMyLCBhMixiMSxjMCxjMywKKyAgICB1aW50MTZ4NHgzX3QgdjsKKyAgICBfX20xMjhpIHZhbDAsIHZhbDEsIHZhbDIsIHRtcDAsIHRtcDE7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMTZbMTZdID0gezAsMSwgNiw3LCAxMiwxMywgMiwzLCA4LDksIDE0LDE1LCA0LDUsIDEwLDExfTsKKyAgICB2YWwwID0gIHZsZDFxX3UxNiAocHRyKTsgLy9hMCxhMSxhMixhMywgIGIwLGIxLGIyLGIzCisgICAgdmFsMiA9ICBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShwdHIgKyA4KSk7IC8vYzAsYzEsYzIsYzMsIHgseCx4LHgKKworICAgIHRtcDAgPSBfbW1fc2h1ZmZsZV9lcGk4KHZhbDAsICooX19tMTI4aSopbWFzazE2KTsgLy9hMCwgYTMsIGIyLGExLCBiMCwgYjMsIGEyLCBiMQorICAgIHRtcDEgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KHZhbDIsIDIwMSk7IC8vMTEgMDAgMTAgMDEgICAgIDogYzEsIGMyLCBjMCwgYzMsCisgICAgdmFsMCA9IF9tbV9zbGxpX3NpMTI4KHRtcDAsMTApOworICAgIHZhbDAgPSBfbW1fc3JsaV9zaTEyOCh2YWwwLDEwKTsgLy9hMCwgYTMsIGIyLCAwLDAsIDAsMCwKKyAgICB2YWwyID0gX21tX3NsbGlfc2kxMjgodG1wMSwxNCk7IC8vMCwwLDAsMCwwLDAsMCxjMQorICAgIHZhbDIgPSBfbW1fc3JsaV9zaTEyOCh2YWwyLDgpOyAvLzAsMCwwLGMxLDAsMCwwLDAKKyAgICB2YWwwID0gX21tX29yX3NpMTI4KHZhbDAsdmFsMik7IC8vYTAsIGEzLCBiMiwgYzEsIHgseCx4LHgKKyAgICBfTTY0KHYudmFsWzBdLCB2YWwwKTsKKworICAgIHZhbDEgPSBfbW1fc2xsaV9zaTEyOCh0bXAwLDQpOyAvLzAsMCwwLDAsMCxhMSwgYjAsIGIzCisgICAgdmFsMSA9IF9tbV9zcmxpX3NpMTI4KHZhbDEsMTApOyAvL2ExLCBiMCwgYjMsIDAsMCwgMCwwLAorICAgIHZhbDIgPSBfbW1fc3JsaV9zaTEyOCh0bXAxLDIpOyAvL2MyLCAwLDAsMCwwLDAsMCwwLAorICAgIHZhbDIgPSBfbW1fc2xsaV9zaTEyOCh2YWwyLDYpOyAvLzAsMCwwLGMyLDAsMCwwLDAKKyAgICB2YWwxID0gX21tX29yX3NpMTI4KHZhbDEsdmFsMik7IC8vYTEsIGIwLCBiMywgYzIsIHgseCx4LHgKKyAgICBfTTY0KHYudmFsWzFdLCB2YWwxKTsKKworICAgIHRtcDAgPSBfbW1fc3JsaV9zaTEyOCh0bXAwLDEyKTsgLy9hMiwgYjEsMCwwLDAsMCwwLDAKKyAgICB0bXAxID0gX21tX3NybGlfc2kxMjgodG1wMSw0KTsKKyAgICB0bXAxID0gX21tX3NsbGlfc2kxMjgodG1wMSw0KTsgLy8wLDAsYzAsIGMzLAorICAgIHZhbDIgPSBfbW1fb3Jfc2kxMjgodG1wMCwgdG1wMSk7IC8vYTIsIGIxLCBjMCwgYzMsCisgICAgX002NCh2LnZhbFsyXSwgdmFsMik7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQzMngyeDNfdCB2bGQzX3UzMihfX3RyYW5zZmVyc2l6ZSg2KSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMzIge2QwLCBkMSwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyeDNfdCB2bGQzX3UzMihfX3RyYW5zZmVyc2l6ZSg2KSB1aW50MzJfdCBjb25zdCAqIHB0cikgLy8gVkxEMy4zMiB7ZDAsIGQxLCBkMn0sIFtyMF0KK3sKKyAgICAvL2EwLGExLCAgYjAsYjEsIGMwLGMxLCAgLT4gYTAsYjEsIGExLGMwLCBiMCxjMQorICAgIHVpbnQzMngyeDNfdCB2OworICAgIF9fbTEyOGkgdmFsMCwgdmFsMSwgdmFsMjsKKyAgICB2YWwwID0gIHZsZDFxX3UzMiAocHRyKTsgLy9hMCxhMSwgIGIwLGIxLAorICAgIHZhbDIgPSAgIF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopIChwdHIgKyA0KSk7IC8vYzAsYzEsIHgseAorCisgICAgdmFsMCA9IF9tbV9zaHVmZmxlX2VwaTMyKHZhbDAsIDAgfCAoMyA8PCAyKSB8ICgxIDw8IDQpIHwgKDIgPDwgNikpOyAvL2EwLGIxLCBhMSwgYjAKKyAgICBfTTY0KHYudmFsWzBdLCB2YWwwKTsKKyAgICB2YWwyID0gIF9tbV9zbGxpX3NpMTI4KHZhbDIsIDgpOyAvL3gsIHgsYzAsYzEsCisgICAgdmFsMSA9ICBfbW1fdW5wYWNraGlfZXBpMzIodmFsMCx2YWwyKTsgLy9hMSxjMCwgYjAsIGMxCisgICAgX002NCh2LnZhbFsxXSwgdmFsMSk7CisgICAgdmFsMiA9ICBfbW1fc3JsaV9zaTEyOCh2YWwxLCA4KTsgLy9iMCwgYzEsIHgsIHgsCisgICAgX002NCh2LnZhbFsyXSwgdmFsMik7CisgICAgcmV0dXJuIHY7Cit9Cit1aW50NjR4MXgzX3QgdmxkM191NjQoX190cmFuc2ZlcnNpemUoMykgdWludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50NjR4MXgzX3QgdmxkM191NjQoX190cmFuc2ZlcnNpemUoMykgdWludDY0X3QgY29uc3QgKiBwdHIpIC8vIFZMRDEuNjQge2QwLCBkMSwgZDJ9LCBbcjBdCit7CisgICAgdWludDY0eDF4M190IHY7CisgICAgdi52YWxbMF0ubTY0X3U2NFswXSA9ICoocHRyKTsKKyAgICB2LnZhbFsxXS5tNjRfdTY0WzBdID0gKihwdHIgKyAxKTsKKyAgICB2LnZhbFsyXS5tNjRfdTY0WzBdID0gKihwdHIgKyAyKTsKKyAgICByZXR1cm4gdjsKK30KKworaW50OHg4eDNfdCB2bGQzX3M4KF9fdHJhbnNmZXJzaXplKDI0KSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjgge2QwLCBkMSwgZDJ9LCBbcjBdCisjZGVmaW5lIHZsZDNfczgocHRyKSB2bGQzX3U4KCh1aW50OF90KilwdHIpCisKK2ludDE2eDR4M190IHZsZDNfczE2KF9fdHJhbnNmZXJzaXplKDEyKSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDAsIGQxLCBkMn0sIFtyMF0KKyNkZWZpbmUgdmxkM19zMTYocHRyKSB2bGQzX3UxNigodWludDE2X3QqKXB0cikKKworaW50MzJ4MngzX3QgdmxkM19zMzIoX190cmFuc2ZlcnNpemUoNikgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMzIge2QwLCBkMSwgZDJ9LCBbcjBdCisjZGVmaW5lIHZsZDNfczMyKHB0cikgdmxkM191MzIoKHVpbnQzMl90KilwdHIpCisKK2ludDY0eDF4M190IHZsZDNfczY0KF9fdHJhbnNmZXJzaXplKDMpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyfSwgW3IwXQorI2RlZmluZSB2bGQzX3M2NChwdHIpIHZsZDNfdTY0KCh1aW50NjRfdCopcHRyKQorCitmbG9hdDE2eDR4M190IHZsZDNfZjE2KF9fdHJhbnNmZXJzaXplKDEyKSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQorLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHksIHNvIG5lZWQgdG8gZ28gdG8gMzIgYml0IGFuZCB0aGVuIHdvcmsgd2l0aCB0d28gMTI4Yml0IHJlZ2lzdGVycy4gU2VlIHZsZDFxX2YxNiBmb3IgZXhhbXBsZQorCitmbG9hdDMyeDJ4M190IHZsZDNfZjMyKF9fdHJhbnNmZXJzaXplKDYpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMzIge2QwLCBkMSwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4MngzX3QgdmxkM19mMzIoX190cmFuc2ZlcnNpemUoNikgZmxvYXQzMl90IGNvbnN0ICogcHRyKQoreworICAgIC8vYTAsYTEsICBiMCxiMSwgYzAsYzEsICAtPiBhMCxiMSwgYTEsYzAsIGIwLGMxCisgICAgZmxvYXQzMngyeDNfdCB2OworICAgIHYudmFsWzBdLm02NF9mMzJbMF0gPSAqKHB0cik7CisgICAgdi52YWxbMF0ubTY0X2YzMlsxXSA9ICoocHRyICsgMyk7CisKKyAgICB2LnZhbFsxXS5tNjRfZjMyWzBdID0gKihwdHIgKyAxKTsKKyAgICB2LnZhbFsxXS5tNjRfZjMyWzFdID0gKihwdHIgKyA0KTsKKworICAgIHYudmFsWzJdLm02NF9mMzJbMF0gPSAqKHB0ciArIDIpOworICAgIHYudmFsWzJdLm02NF9mMzJbMV0gPSAqKHB0ciArIDUpOworICAgIHJldHVybiB2OworfQorCitwb2x5OHg4eDNfdCB2bGQzX3A4KF9fdHJhbnNmZXJzaXplKDI0KSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy44IHtkMCwgZDEsIGQyfSwgW3IwXQorI2RlZmluZSB2bGQzX3A4IHZsZDNfdTgKKworcG9seTE2eDR4M190IHZsZDNfcDE2KF9fdHJhbnNmZXJzaXplKDEyKSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwLCBkMSwgZDJ9LCBbcjBdCisjZGVmaW5lIHZsZDNfcDE2IHZsZDNfdTE2CisKKy8vKioqKioqKioqKioqKioqICBRdWFkcnVwbGVzIGxvYWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3VpbnQ4eDE2eDRfdCB2bGQ0cV91OChfX3RyYW5zZmVyc2l6ZSg2NCkgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2eDRfdCB2bGQ0cV91OChfX3RyYW5zZmVyc2l6ZSg2NCkgdWludDhfdCBjb25zdCAqIHB0cikgLy8gVkxENC44IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK3sKKyAgICB1aW50OHgxNng0X3QgdjsKKyAgICBfX20xMjhpIHRtcDMsIHRtcDIsIHRtcDEsIHRtcDA7CisKKyAgICB2LnZhbFswXSA9IHZsZDFxX3U4ICggcHRyKTsgLy9hMCxhMSxhMiwuLi5hNywgLi4uYTE1CisgICAgdi52YWxbMV0gPSB2bGQxcV91OCAoIChwdHIgKyAxNikpOyAvL2IwLCBiMSxiMiwuLi5iNy4uLi4gYjE1CisgICAgdi52YWxbMl0gPSB2bGQxcV91OCAoIChwdHIgKyAzMikpOyAvL2MwLCBjMSxjMiwuLi5jNy4uLi5jMTUKKyAgICB2LnZhbFszXSA9IHZsZDFxX3U4ICggKHB0ciArIDQ4KSk7IC8vZDAsZDEsZDIsLi4uZDcuLi4uZDE1CisKKyAgICB0bXAwID0gX21tX3VucGFja2xvX2VwaTgodi52YWxbMF0sdi52YWxbMV0pOyAvL2EwLGIwLCBhMSxiMSwgYTIsYjIsIGEzLGIzLC4uLi5hNyxiNworICAgIHRtcDEgPSBfbW1fdW5wYWNrbG9fZXBpOCh2LnZhbFsyXSx2LnZhbFszXSk7IC8vYzAsZDAsIGMxLGQxLCBjMixkMiwgYzMsZDMsLi4uIGM3LGQ3CisgICAgdG1wMiA9IF9tbV91bnBhY2toaV9lcGk4KHYudmFsWzBdLHYudmFsWzFdKTsgLy9hOCxiOCwgYTksYjksIGExMCxiMTAsIGExMSxiMTEsLi4uYTE1LGIxNQorICAgIHRtcDMgPSBfbW1fdW5wYWNraGlfZXBpOCh2LnZhbFsyXSx2LnZhbFszXSk7IC8vYzgsZDgsIGM5LGQ5LCBjMTAsZDEwLCBjMTEsZDExLC4uLmMxNSxkMTUKKworICAgIHYudmFsWzBdID0gX21tX3VucGFja2xvX2VwaTgodG1wMCwgdG1wMik7IC8vYTAsYTgsIGIwLGI4LCAgYTEsYTksIGIxLGI5LCAuLi4uYTMsYTExLCBiMyxiMTEKKyAgICB2LnZhbFsxXSA9IF9tbV91bnBhY2toaV9lcGk4KHRtcDAsIHRtcDIpOyAvL2E0LGExMiwgYjQsYjEyLCBhNSxhMTMsIGI1LGIxMywuLi4uYTcsYTE1LGI3LGIxNQorICAgIHYudmFsWzJdID0gX21tX3VucGFja2xvX2VwaTgodG1wMSwgdG1wMyk7IC8vYzAsYzgsIGQwLGQ4LCBjMSxjOSwgZDEsZDkuLi4uLmQzLGQxMQorICAgIHYudmFsWzNdID0gX21tX3VucGFja2hpX2VwaTgodG1wMSwgdG1wMyk7IC8vYzQsYzEyLGQ0LGQxMiwgYzUsYzEzLCBkNSxkMTMsLi4uLmQ3LGQxNQorCisgICAgdG1wMCA9ICBfbW1fdW5wYWNrbG9fZXBpMzIodi52YWxbMF0sIHYudmFsWzJdICk7IC8vL2EwLGE4LCBiMCxiOCwgYzAsYzgsICBkMCxkOCwgYTEsYTksIGIxLGI5LCBjMSxjOSwgZDEsZDkKKyAgICB0bXAxID0gIF9tbV91bnBhY2toaV9lcGkzMih2LnZhbFswXSwgdi52YWxbMl0gKTsgLy9hMixhMTAsIGIyLGIxMCwgYzIsYzEwLCBkMixkMTAsIGEzLGExMSwgYjMsYjExLCBjMyxjMTEsIGQzLGQxMQorICAgIHRtcDIgPSAgX21tX3VucGFja2xvX2VwaTMyKHYudmFsWzFdLCB2LnZhbFszXSApOyAvL2E0LGExMiwgYjQsYjEyLCBjNCxjMTIsIGQ0LGQxMiwgYTUsYTEzLCBiNSxiMTMsIGM1LGMxMywgZDUsZDEzLAorICAgIHRtcDMgPSAgX21tX3VucGFja2hpX2VwaTMyKHYudmFsWzFdLCB2LnZhbFszXSApOyAvL2E2LGExNCwgYjYsYjE0LCBjNixjMTQsIGQ2LGQxNCwgYTcsYTE1LGI3LGIxNSxjNyxjMTUsZDcsZDE1CisKKyAgICB2LnZhbFswXSA9IF9tbV91bnBhY2tsb19lcGk4KHRtcDAsIHRtcDIpOyAvL2EwLGE0LGE4LGExMixiMCxiNCxiOCxiMTIsYzAsYzQsYzgsYzEyLGQwLGQ0LGQ4LGQxMgorICAgIHYudmFsWzFdID0gX21tX3VucGFja2hpX2VwaTgodG1wMCwgdG1wMik7IC8vYTEsYTUsIGE5LCBhMTMsIGIxLGI1LCBiOSxiMTMsIGMxLGM1LCBjOSwgYzEzLCBkMSxkNSwgZDksZDEzCisgICAgdi52YWxbMl0gPSBfbW1fdW5wYWNrbG9fZXBpOCh0bXAxLCB0bXAzKTsgLy9hMixhNiwgYTEwLGExNCwgYjIsYjYsIGIxMCxiMTQsYzIsYzYsIGMxMCxjMTQsIGQyLGQ2LCBkMTAsZDE0CisgICAgdi52YWxbM10gPSBfbW1fdW5wYWNraGlfZXBpOCh0bXAxLCB0bXAzKTsgLy9hMyxhNywgYTExLGExNSwgYjMsYjcsIGIxMSxiMTUsYzMsYzcsIGMxMSwgYzE1LGQzLGQ3LCBkMTEsZDE1CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQxNng4eDRfdCB2bGQ0cV91MTYoX190cmFuc2ZlcnNpemUoMzIpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4eDRfdCB2bGQ0cV91MTYoX190cmFuc2ZlcnNpemUoMzIpIHVpbnQxNl90IGNvbnN0ICogcHRyKSAvLyBWTEQ0LjE2IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK3sKKyAgICB1aW50MTZ4OHg0X3QgdjsKKyAgICBfX20xMjhpIHRtcDMsIHRtcDIsIHRtcDEsIHRtcDA7CisgICAgdG1wMCAgPSAgdmxkMXFfdTE2IChwdHIpOyAvL2EwLGExLGEyLC4uLmE3CisgICAgdG1wMSAgPSAgdmxkMXFfdTE2ICgocHRyICsgOCkpOyAvL2IwLCBiMSxiMiwuLi5iNworICAgIHRtcDIgID0gIHZsZDFxX3UxNiAoKHB0ciArIDE2KSk7IC8vYzAsIGMxLGMyLC4uLmM3CisgICAgdG1wMyAgPSAgdmxkMXFfdTE2ICgocHRyICsgMjQpKTsgLy9kMCxkMSxkMiwuLi5kNworICAgIHYudmFsWzBdID0gX21tX3VucGFja2xvX2VwaTE2KHRtcDAsdG1wMSk7IC8vYTAsYjAsIGExLGIxLCBhMixiMiwgYTMsYjMsCisgICAgdi52YWxbMV0gPSBfbW1fdW5wYWNrbG9fZXBpMTYodG1wMix0bXAzKTsgLy9jMCxkMCwgYzEsZDEsIGMyLGQyLCBjMyxkMywKKyAgICB2LnZhbFsyXSA9IF9tbV91bnBhY2toaV9lcGkxNih0bXAwLHRtcDEpOyAvL2E0LGI0LCBhNSxiNSwgYTYsYjYsIGE3LGI3CisgICAgdi52YWxbM10gPSBfbW1fdW5wYWNraGlfZXBpMTYodG1wMix0bXAzKTsgLy9jNCxkNCwgYzUsZDUsIGM2LGQ2LCBjNyxkNworICAgIHRtcDAgPSBfbW1fdW5wYWNrbG9fZXBpMTYodi52YWxbMF0sIHYudmFsWzJdKTsgLy9hMCxhNCwgYjAsYjQsIGExLGE1LCBiMSxiNQorICAgIHRtcDEgPSBfbW1fdW5wYWNraGlfZXBpMTYodi52YWxbMF0sIHYudmFsWzJdKTsgLy9hMixhNiwgYjIsYjYsIGEzLGE3LCBiMyxiNworICAgIHRtcDIgPSBfbW1fdW5wYWNrbG9fZXBpMTYodi52YWxbMV0sIHYudmFsWzNdKTsgLy9jMCxjNCwgZDAsZDQsIGMxLGM1LCBkMSxkNQorICAgIHRtcDMgPSBfbW1fdW5wYWNraGlfZXBpMTYodi52YWxbMV0sIHYudmFsWzNdKTsgLy9jMixjNiwgZDIsZDYsIGMzLGM3LCBkMyxkNworICAgIHYudmFsWzBdID0gIF9tbV91bnBhY2tsb19lcGk2NCh0bXAwLCB0bXAyKTsgLy9hMCxhNCwgYjAsYjQsIGMwLGM0LCBkMCxkNCwKKyAgICB2LnZhbFsxXSA9ICBfbW1fdW5wYWNraGlfZXBpNjQodG1wMCwgdG1wMik7IC8vYTEsYTUsIGIxLGI1LCBjMSxjNSwgZDEsZDUKKyAgICB2LnZhbFsyXSA9ICBfbW1fdW5wYWNrbG9fZXBpNjQodG1wMSwgdG1wMyk7IC8vYTIsYTYsIGIyLGI2LCBjMixjNiwgZDIsZDYsCisgICAgdi52YWxbM10gPSAgX21tX3VucGFja2hpX2VwaTY0KHRtcDEsIHRtcDMpOyAvL2EzLGE3LCBiMyxiNywgYzMsYzcsIGQzLGQ3CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQzMng0eDRfdCB2bGQ0cV91MzIoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4zMiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0eDRfdCB2bGQ0cV91MzIoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQzMl90IGNvbnN0ICogcHRyKSAvLyBWTEQ0LjMyIHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK3sKKyAgICB1aW50MzJ4NHg0X3QgdjsKKyAgICBfX20xMjhpIHRtcDMsIHRtcDIsIHRtcDEsIHRtcDA7CisgICAgdi52YWxbMF0gPSAgdmxkMXFfdTMyIChwdHIpOworICAgIHYudmFsWzFdID0gIHZsZDFxX3UzMiAoKHB0ciArIDQpKTsKKyAgICB2LnZhbFsyXSA9ICB2bGQxcV91MzIgKChwdHIgKyA4KSk7CisgICAgdi52YWxbM10gPSAgdmxkMXFfdTMyICgocHRyICsgMTIpKTsKKyAgICB0bXAwID0gX21tX3VucGFja2xvX2VwaTMyKHYudmFsWzBdLHYudmFsWzFdKTsKKyAgICB0bXAxID0gX21tX3VucGFja2xvX2VwaTMyKHYudmFsWzJdLHYudmFsWzNdKTsKKyAgICB0bXAyID0gX21tX3VucGFja2hpX2VwaTMyKHYudmFsWzBdLHYudmFsWzFdKTsKKyAgICB0bXAzID0gX21tX3VucGFja2hpX2VwaTMyKHYudmFsWzJdLHYudmFsWzNdKTsKKyAgICB2LnZhbFswXSA9IF9tbV91bnBhY2tsb19lcGk2NCh0bXAwLCB0bXAxKTsKKyAgICB2LnZhbFsxXSA9IF9tbV91bnBhY2toaV9lcGk2NCh0bXAwLCB0bXAxKTsKKyAgICB2LnZhbFsyXSA9IF9tbV91bnBhY2tsb19lcGk2NCh0bXAyLCB0bXAzKTsKKyAgICB2LnZhbFszXSA9IF9tbV91bnBhY2toaV9lcGk2NCh0bXAyLCB0bXAzKTsKKyAgICByZXR1cm4gdjsKK30KKworaW50OHgxNng0X3QgdmxkNHFfczgoX190cmFuc2ZlcnNpemUoNjQpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCisjZGVmaW5lIHZsZDRxX3M4KHB0cikgdmxkNHFfdTgoKHVpbnQ4X3QqKXB0cikKKworaW50MTZ4OHg0X3QgdmxkNHFfczE2KF9fdHJhbnNmZXJzaXplKDMyKSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCisjZGVmaW5lICB2bGQ0cV9zMTYocHRyKSB2bGQ0cV91MTYoKHVpbnQxNl90KilwdHIpCisKK2ludDMyeDR4NF90IHZsZDRxX3MzMihfX3RyYW5zZmVyc2l6ZSgxNikgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQorI2RlZmluZSAgdmxkNHFfczMyKHB0cikgdmxkNHFfdTMyKCh1aW50MzJfdCopcHRyKQorCitmbG9hdDE2eDh4NF90IHZsZDRxX2YxNihfX3RyYW5zZmVyc2l6ZSgzMikgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseSwgc28gbmVlZCB0byBnbyB0byAzMiBiaXQgYW5kIHRoZW4gd29yayB3aXRoIHR3byAxMjhiaXQgcmVnaXN0ZXJzLiBTZWUgdmxkMXFfZjE2IGZvciBleGFtcGxlCisKK2Zsb2F0MzJ4NHg0X3QgdmxkNHFfZjMyKF9fdHJhbnNmZXJzaXplKDE2KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjMyIHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0eDRfdCB2bGQ0cV9mMzIoX190cmFuc2ZlcnNpemUoMTYpIGZsb2F0MzJfdCBjb25zdCAqIHB0cikgLy8gVkxENC4zMiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit7CisgICAgZmxvYXQzMng0eDRfdCB2OworICAgIF9fbTEyOCB0bXAzLCB0bXAyLCB0bXAxLCB0bXAwOworCisgICAgdi52YWxbMF0gPSAgdmxkMXFfZjMyICgoZmxvYXQqKSBwdHIpOworICAgIHYudmFsWzFdID0gIHZsZDFxX2YzMiAoKGZsb2F0KikgKHB0ciArIDQpKTsKKyAgICB2LnZhbFsyXSA9ICB2bGQxcV9mMzIgKChmbG9hdCopIChwdHIgKyA4KSk7CisgICAgdi52YWxbM10gPSAgdmxkMXFfZjMyICgoZmxvYXQqKSAocHRyICsgMTIpKTsKKyAgICB0bXAwID0gX21tX3VucGFja2xvX3BzKHYudmFsWzBdLCB2LnZhbFsxXSk7CisgICAgdG1wMiA9IF9tbV91bnBhY2tsb19wcyh2LnZhbFsyXSwgdi52YWxbM10pOworICAgIHRtcDEgPSBfbW1fdW5wYWNraGlfcHModi52YWxbMF0sIHYudmFsWzFdKTsKKyAgICB0bXAzID0gX21tX3VucGFja2hpX3BzKHYudmFsWzJdLCB2LnZhbFszXSk7CisgICAgdi52YWxbMF0gPSBfbW1fbW92ZWxoX3BzKHRtcDAsIHRtcDIpOworICAgIHYudmFsWzFdID0gX21tX21vdmVobF9wcyh0bXAyLCB0bXAwKTsKKyAgICB2LnZhbFsyXSA9IF9tbV9tb3ZlbGhfcHModG1wMSwgdG1wMyk7CisgICAgdi52YWxbM10gPSBfbW1fbW92ZWhsX3BzKHRtcDMsIHRtcDEpOworICAgIHJldHVybiB2OworfQorCitwb2x5OHgxNng0X3QgdmxkNHFfcDgoX190cmFuc2ZlcnNpemUoNjQpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0Ljgge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQorI2RlZmluZSB2bGQ0cV9wOCB2bGQ0cV91OAorCitwb2x5MTZ4OHg0X3QgdmxkNHFfcDE2KF9fdHJhbnNmZXJzaXplKDMyKSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQorI2RlZmluZSB2bGQ0cV9wMTYgdmxkNHFfczE2CisKK3VpbnQ4eDh4NF90IHZsZDRfdTgoX190cmFuc2ZlcnNpemUoMzIpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0Ljgge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50OHg4eDRfdCB2bGQ0X3U4KF9fdHJhbnNmZXJzaXplKDMyKSB1aW50OF90IGNvbnN0ICogcHRyKSAvLyBWTEQ0Ljgge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQoreworICAgIHVpbnQ4eDh4NF90IHY7CisgICAgX19tMTI4aSBzaDAsIHNoMTsKKyAgICBfX20xMjhpIHZhbDAsICB2YWwyOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazRfOFsxNl0gPSB7MCwgNCwgOCwgMTIsIDEsIDUsIDksIDEzLCAyLCA2LCAxMCwgMTQsIDMsIDcsIDExLCAxNX07CisKKyAgICB2YWwwID0gdmxkMXFfdTgoKCBwdHIpKTsgLy9sb2FkIGZpcnN0IDY0LWJpdHMgaW4gdmFsWzBdIGFuZCB2YWxbMV0KKyAgICB2YWwyID0gdmxkMXFfdTgoKCBwdHIgKyAxNikpOyAvL2xvYWQgdGhpcmQgYW5kIGZvcnRoIDY0LWJpdHMgaW4gdmFsWzJdLCB2YWxbM10KKworICAgIHNoMCA9IF9tbV9zaHVmZmxlX2VwaTgodmFsMCwgKihfX20xMjhpKiltYXNrNF84KTsKKyAgICBzaDEgPSBfbW1fc2h1ZmZsZV9lcGk4KHZhbDIsICooX19tMTI4aSopbWFzazRfOCk7CisgICAgdmFsMCA9IF9tbV91bnBhY2tsb19lcGkzMihzaDAsc2gxKTsgLy8wLDQsOCwxMiwxNiwyMCwyNCwyOCwgMSw1LDksMTMsMTcsMjEsMjUsMjkKKyAgICB2c3QxcV91OCgmdi52YWxbMF0sIHZhbDAgKTsKKyAgICB2YWwyID0gX21tX3VucGFja2hpX2VwaTMyKHNoMCxzaDEpOyAvLzIsNiwxMCwxNCwxOCwyMiwyNiwzMCwgMyw3LDExLDE1LDE5LDIzLDI3LDMxCisgICAgdnN0MXFfdTgoJnYudmFsWzJdLCB2YWwyICk7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQxNng0eDRfdCB2bGQ0X3UxNihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjE2IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDR4NF90IHZsZDRfdTE2KF9fdHJhbnNmZXJzaXplKDE2KSB1aW50MTZfdCBjb25zdCAqIHB0cikgLy8gVkxENC4xNiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit7CisgICAgdWludDE2eDR4NF90IHY7CisgICAgX19tMTI4aSBzaDAsIHNoMTsKKyAgICBfX20xMjhpIHZhbDAsIHZhbDI7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrNF8xNlsxNl0gPSB7MCwxLCA4LDksIDIsMywgMTAsMTEsIDQsNSwgMTIsMTMsIDYsNywgMTQsMTV9OyAvLzAsIDQsIDEsIDUsIDIsIDYsIDMsIDcKKyAgICB2YWwwID0gdmxkMXFfdTE2ICggKHB0cikpOyAvL2xvYWQgZmlyc3QgNjQtYml0cyBpbiB2YWxbMF0gYW5kIHZhbFsxXQorICAgIHZhbDIgPSB2bGQxcV91MTYgKCAocHRyICsgOCkpOyAvL2xvYWQgdGhpcmQgYW5kIGZvcnRoIDY0LWJpdHMgaW4gdmFsWzJdLCB2YWxbM10KKyAgICBzaDAgPSBfbW1fc2h1ZmZsZV9lcGk4KHZhbDAsICooX19tMTI4aSopbWFzazRfMTYpOworICAgIHNoMSA9IF9tbV9zaHVmZmxlX2VwaTgodmFsMiwgKihfX20xMjhpKiltYXNrNF8xNik7CisgICAgdmFsMCA9IF9tbV91bnBhY2tsb19lcGkzMihzaDAsc2gxKTsgLy8wLDQsOCwxMiwgMSw1LDksMTMKKyAgICB2c3QxcV91MTYoJnYudmFsWzBdLCB2YWwwICk7CisgICAgdmFsMiA9IF9tbV91bnBhY2toaV9lcGkzMihzaDAsc2gxKTsgLy8yLDYsMTAsMTQsIDMsNywxMSwxNQorICAgIHZzdDFxX3UxNigmdi52YWxbMl0sIHZhbDIgKTsKKyAgICByZXR1cm4gdjsKK30KKwordWludDMyeDJ4NF90IHZsZDRfdTMyKF9fdHJhbnNmZXJzaXplKDgpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4zMiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyeDRfdCB2bGQ0X3UzMihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MzJfdCBjb25zdCAqIHB0cikKK3sKKyAgICAvL2EwLGExLCAgYjAsYjEsIGMwLGMxLCBkMCxkMSAtPiBhMCxjMCwgYTEsYzEsIGIwLGQwLCBiMSxkMQorICAgIHVpbnQzMngyeDRfdCB2OworICAgIF9fbTEyOGkgdmFsMCwgdmFsMDEsIHZhbDI7CisgICAgdmFsMCA9ICB2bGQxcV91MzIgKHB0cik7IC8vYTAsYTEsICBiMCxiMSwKKyAgICB2YWwyID0gIHZsZDFxX3UzMiAoKHB0ciArIDQpKTsgLy9jMCxjMSwgZDAsZDEKKyAgICB2YWwwMSA9IF9tbV91bnBhY2tsb19lcGkzMih2YWwwLHZhbDIpOyAvL2EwLCBjMCwgYTEsYzEsCisgICAgdmFsMiA9IF9tbV91bnBhY2toaV9lcGkzMih2YWwwLHZhbDIpOyAvL2IwLGQwLCBiMSwgZDEKKyAgICB2c3QxcV91MzIoJnYudmFsWzBdLCB2YWwwMSk7CisgICAgdnN0MXFfdTMyKCZ2LnZhbFsyXSwgdmFsMiApOworICAgIHJldHVybiB2OworfQorCit1aW50NjR4MXg0X3QgdmxkNF91NjQoX190cmFuc2ZlcnNpemUoNCkgdWludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDF4NF90IHZsZDRfdTY0KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQ2NF90IGNvbnN0ICogcHRyKSAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3sKKyAgICB1aW50NjR4MXg0X3QgdjsKKyAgICB2LnZhbFswXS5tNjRfdTY0WzBdID0gKihwdHIpOyAvL2xvYWQgZmlyc3QgNjQtYml0cyBpbiB2YWxbMF0gYW5kIHZhbFsxXQorICAgIHYudmFsWzFdLm02NF91NjRbMF0gPSAqKHB0ciArIDEpOyAvL2xvYWQgZmlyc3QgNjQtYml0cyBpbiB2YWxbMF0gYW5kIHZhbFsxXQorICAgIHYudmFsWzJdLm02NF91NjRbMF0gPSAqKHB0ciArIDIpOyAvL2xvYWQgdGhpcmQgYW5kIGZvcnRoIDY0LWJpdHMgaW4gdmFsWzJdLCB2YWxbM10KKyAgICB2LnZhbFszXS5tNjRfdTY0WzBdID0gKihwdHIgKyAzKTsgLy9sb2FkIHRoaXJkIGFuZCBmb3J0aCA2NC1iaXRzIGluIHZhbFsyXSwgdmFsWzNdCisgICAgcmV0dXJuIHY7Cit9CisKK2ludDh4OHg0X3QgdmxkNF9zOChfX3RyYW5zZmVyc2l6ZSgzMikgaW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxENC44IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KKyNkZWZpbmUgIHZsZDRfczgocHRyKSB2bGQ0X3U4KCh1aW50OF90KilwdHIpCisKK2ludDE2eDR4NF90IHZsZDRfczE2KF9fdHJhbnNmZXJzaXplKDE2KSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCisjZGVmaW5lIHZsZDRfczE2KHB0cikgdmxkNF91MTYoKHVpbnQxNl90KilwdHIpCisKK2ludDMyeDJ4NF90IHZsZDRfczMyKF9fdHJhbnNmZXJzaXplKDgpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjMyIHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KKyNkZWZpbmUgdmxkNF9zMzIocHRyKSB2bGQ0X3UzMigodWludDMyX3QqKXB0cikKKworaW50NjR4MXg0X3QgdmxkNF9zNjQoX190cmFuc2ZlcnNpemUoNCkgaW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorI2RlZmluZSB2bGQ0X3M2NChwdHIpIHZsZDRfdTY0KCh1aW50NjRfdCopcHRyKQorCitmbG9hdDE2eDR4NF90IHZsZDRfZjE2KF9fdHJhbnNmZXJzaXplKDE2KSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjE2IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KKy8vIElBMzIgU0lNRCBkb2Vzbid0IHdvcmsgd2l0aCAxNmJpdCBmbG9hdHMgY3VycmVudGx5LCBzbyBuZWVkIHRvIGdvIHRvIDMyIGJpdCBhbmQgdGhlbiB3b3JrIHdpdGggdHdvIDEyOGJpdCByZWdpc3RlcnMuIFNlZSB2bGQxcV9mMTYgZm9yIGV4YW1wbGUKKworZmxvYXQzMngyeDRfdCB2bGQ0X2YzMihfX3RyYW5zZmVyc2l6ZSg4KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjMyIHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyeDRfdCB2bGQ0X2YzMihfX3RyYW5zZmVyc2l6ZSg4KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpIC8vIFZMRDQuMzIge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQoreworICAgIC8vYTAsYTEsICBiMCxiMSwgYzAsYzEsIGQwLGQxIC0+IGEwLGMwLCBhMSxjMSwgYjAsZDAsIGIxLGQxCisgICAgZmxvYXQzMngyeDRfdCByZXM7CisgICAgcmVzLnZhbFswXS5tNjRfZjMyWzBdID0gKihwdHIpOworICAgIHJlcy52YWxbMF0ubTY0X2YzMlsxXSA9ICoocHRyICsgNCk7CisgICAgcmVzLnZhbFsxXS5tNjRfZjMyWzBdID0gKihwdHIgKyAxKTsKKyAgICByZXMudmFsWzFdLm02NF9mMzJbMV0gPSAqKHB0ciArIDUpOworICAgIHJlcy52YWxbMl0ubTY0X2YzMlswXSA9ICoocHRyICsgMik7CisgICAgcmVzLnZhbFsyXS5tNjRfZjMyWzFdID0gKihwdHIgKyA2KTsKKyAgICByZXMudmFsWzNdLm02NF9mMzJbMF0gPSAqKHB0ciArIDMpOworICAgIHJlcy52YWxbM10ubTY0X2YzMlsxXSA9ICoocHRyICsgNyk7CisgICAgcmV0dXJuIHJlczsKK30KKworcG9seTh4OHg0X3QgdmxkNF9wOChfX3RyYW5zZmVyc2l6ZSgzMikgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCisjZGVmaW5lIHZsZDRfcDggdmxkNF91OAorCitwb2x5MTZ4NHg0X3QgdmxkNF9wMTYoX190cmFuc2ZlcnNpemUoMTYpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCisjZGVmaW5lIHZsZDRfcDE2IHZsZDRfdTE2CisKKy8vKioqKioqKioqKioqKiBEdXBsaWNhdGUgKG9yIHByb3BhZ2F0ZSkgcHRyWzBdIHRvIGFsbCB2YWxbMF0gbGFuZXMgYW5kIHB0clsxXSB0byBhbGwgdmFsWzFdIGxhbmVzICoqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordWludDh4OHgyX3QgdmxkMl9kdXBfdTgoX190cmFuc2ZlcnNpemUoMikgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuOCB7ZDBbXSwgZDFbXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OHgyX3QgdmxkMl9kdXBfdTgoX190cmFuc2ZlcnNpemUoMikgdWludDhfdCBjb25zdCAqIHB0cikgLy8gVkxEMi44IHtkMFtdLCBkMVtdfSwgW3IwXQoreworICAgIHVpbnQ4eDh4Ml90IHY7CisgICAgX19tMTI4aSB2YWwwLCB2YWwxOworICAgIHZhbDAgPSBMT0FEX1NJMTI4KHB0cik7IC8vMCwxLHgseCwgeCx4LHgseCx4LHgseCx4LCB4LHgseCx4CisgICAgdmFsMSA9IF9tbV91bnBhY2tsb19lcGk4KHZhbDAsdmFsMCk7IC8vMCwwLDEsMSx4LHgseCx4LCB4LHgseCx4LHgseCx4LHgsCisgICAgdmFsMSA9IF9tbV91bnBhY2tsb19lcGkxNih2YWwxLHZhbDEpOyAvLzAsMCwwLDAsIDEsMSwxLDEseCx4LHgseCwgeCx4LHgseAorICAgIHZhbDAgPSBfbW1fdW5wYWNrbG9fZXBpMzIodmFsMSx2YWwxKTsgLy8wLDAsMCwwLCAwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwKKyAgICB2c3QxcV91OCh2LnZhbCwgdmFsMCk7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQxNng0eDJfdCB2bGQyX2R1cF91MTYoX190cmFuc2ZlcnNpemUoMikgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjE2IHtkMFtdLCBkMVtdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NHgyX3QgdmxkMl9kdXBfdTE2KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90IGNvbnN0ICogcHRyKSAvLyBWTEQyLjE2IHtkMFtdLCBkMVtdfSwgW3IwXQoreworICAgIHVpbnQxNng0eDJfdCB2OworICAgIF9fbTEyOGkgdmFsMCwgdmFsMTsKKyAgICB2YWwxID0gTE9BRF9TSTEyOChwdHIpOyAvLzAsMSx4LHgsIHgseCx4LHgKKyAgICB2YWwwID0gX21tX3NodWZmbGVsb19lcGkxNih2YWwxLCAwKTsgLy8wMCAwMCAwMCAwMCAoYWxsIDApCisgICAgX002NCh2LnZhbFswXSwgdmFsMCk7CisgICAgdmFsMSA9IF9tbV9zaHVmZmxlbG9fZXBpMTYodmFsMSwgODUpOyAvLzAxIDAxIDAxIDAxIChhbGwgMSkKKyAgICBfTTY0KHYudmFsWzFdLCB2YWwxKTsKKyAgICByZXR1cm4gdjsKK30KKwordWludDMyeDJ4Ml90IHZsZDJfZHVwX3UzMihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMzIge2QwW10sIGQxW119LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyeDJfdCB2bGQyX2R1cF91MzIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgY29uc3QgKiBwdHIpIC8vIFZMRDIuMzIge2QwW10sIGQxW119LCBbcjBdCit7CisgICAgdWludDMyeDJ4Ml90IHY7CisgICAgX19tMTI4aSB2YWwwOworICAgIHZhbDAgPSBMT0FEX1NJMTI4KHB0cik7IC8vMCwxLHgseAorICAgIHZhbDAgPSBfbW1fc2h1ZmZsZV9lcGkzMih2YWwwLCAgIDAgfCAoMCA8PCAyKSB8ICgxIDw8IDQpIHwgKDEgPDwgNikpOyAvLzAsMCwxLDEKKyAgICB2c3QxcV91MzIodi52YWwsIHZhbDApOworICAgIHJldHVybiB2OworfQorCit1aW50NjR4MXgyX3QgdmxkMl9kdXBfdTY0KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2bGQyX2R1cF91NjQgdmxkMl91NjQKKworaW50OHg4eDJfdCB2bGQyX2R1cF9zOChfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjgge2QwW10sIGQxW119LCBbcjBdCisjZGVmaW5lIHZsZDJfZHVwX3M4KHB0cikgdmxkMl9kdXBfdTgoKHVpbnQ4X3QqKXB0cikKKworaW50MTZ4NHgyX3QgdmxkMl9kdXBfczE2KF9fdHJhbnNmZXJzaXplKDIpIGludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjE2IHtkMFtdLCBkMVtdfSwgW3IwXQorI2RlZmluZSB2bGQyX2R1cF9zMTYocHRyKSB2bGQyX2R1cF91MTYoKHVpbnQxNl90KilwdHIpCisKK2ludDMyeDJ4Ml90IHZsZDJfZHVwX3MzMihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDBbXSwgZDFbXX0sIFtyMF0KKyNkZWZpbmUgdmxkMl9kdXBfczMyKHB0cikgdmxkMl9kdXBfdTMyKCh1aW50MzJfdCopcHRyKQorCitpbnQ2NHgxeDJfdCB2bGQyX2R1cF9zNjQoX190cmFuc2ZlcnNpemUoMikgaW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdmxkMl9kdXBfczY0KHB0cikgdmxkMl9kdXBfdTY0KCh1aW50NjRfdCopcHRyKQorCitmbG9hdDE2eDR4Ml90IHZsZDJfZHVwX2YxNihfX3RyYW5zZmVyc2l6ZSgyKSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjE2IHtkMFtdLCBkMVtdfSwgW3IwXQorLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHksIHNvIG5lZWQgdG8gZ28gdG8gMzIgYml0IGFuZCB0aGVuIHdvcmsgd2l0aCB0d28gMTI4Yml0IHJlZ2lzdGVycy4gU2VlIHZsZDFxX2YxNiBmb3IgZXhhbXBsZQorCitmbG9hdDMyeDJ4Ml90IHZsZDJfZHVwX2YzMihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjMyIHtkMFtdLCBkMVtdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJ4Ml90IHZsZDJfZHVwX2YzMihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpIC8vIFZMRDIuMzIge2QwW10sIGQxW119LCBbcjBdCit7CisgICAgZmxvYXQzMngyeDJfdCB2OworICAgIHYudmFsWzBdLm02NF9mMzJbMF0gPSAqKHB0cik7IC8vMCwwCisgICAgdi52YWxbMF0ubTY0X2YzMlsxXSA9ICoocHRyKTsgLy8wLDAKKyAgICB2LnZhbFsxXS5tNjRfZjMyWzBdID0gKihwdHIgKyAxKTsgLy8xLDEKKyAgICB2LnZhbFsxXS5tNjRfZjMyWzFdID0gKihwdHIgKyAxKTsgLy8xLDEKKyAgICByZXR1cm4gdjsKK30KKworcG9seTh4OHgyX3QgdmxkMl9kdXBfcDgoX190cmFuc2ZlcnNpemUoMikgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuOCB7ZDBbXSwgZDFbXX0sIFtyMF0KKyNkZWZpbmUgdmxkMl9kdXBfcDggdmxkMl9kdXBfdTgKKworcG9seTE2eDR4Ml90IHZsZDJfZHVwX3AxNihfX3RyYW5zZmVyc2l6ZSgyKSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwW10sIGQxW119LCBbcjBdCisjZGVmaW5lIHZsZDJfZHVwX3AxNiB2bGQyX2R1cF9zMTYKKworLy8qKioqKioqKioqKioqIER1cGxpY2F0ZSAob3IgcHJvcGFnYXRlKXRyaXBsZXRzOiAqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL3B0clswXSB0byBhbGwgdmFsWzBdIGxhbmVzLCBwdHJbMV0gdG8gYWxsIHZhbFsxXSBsYW5lcyBhbmQgcHRyWzJdIHRvIGFsbCB2YWxbMl0gbGFuZXMKK3VpbnQ4eDh4M190IHZsZDNfZHVwX3U4KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjgge2QwW10sIGQxW10sIGQyW119LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDh4M190IHZsZDNfZHVwX3U4KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ4X3QgY29uc3QgKiBwdHIpIC8vIFZMRDMuOCB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KK3sKKyAgICB1aW50OHg4eDNfdCB2OworICAgIF9fbTEyOGkgdmFsMCwgdmFsMSwgdmFsMjsKKyAgICB2YWwwID0gTE9BRF9TSTEyOChwdHIpOyAvLzAsMSwyLHgsIHgseCx4LHgseCx4LHgseCwgeCx4LHgseAorICAgIHZhbDEgPSBfbW1fdW5wYWNrbG9fZXBpOCh2YWwwLHZhbDApOyAvLzAsMCwxLDEsMiwyLHgseCwgeCx4LHgseCx4LHgseCx4LAorICAgIHZhbDEgPSBfbW1fdW5wYWNrbG9fZXBpMTYodmFsMSx2YWwxKTsgLy8wLDAsMCwwLCAxLDEsMSwxLDIsMiwyLDIseCx4LHgseCwKKyAgICB2YWwwID0gX21tX3VucGFja2xvX2VwaTMyKHZhbDEsdmFsMSk7IC8vMCwwLDAsMCwgMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsCisgICAgdmFsMiA9IF9tbV91bnBhY2toaV9lcGkzMih2YWwxLHZhbDEpOyAvLyAyLDIsMiwyLDIsMiwyLDIsIHgseCx4LHgseCx4LHgseCwKKyAgICB2c3QxcV91OCh2LnZhbCwgdmFsMCk7CisgICAgX002NCh2LnZhbFsyXSwgdmFsMik7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQxNng0eDNfdCB2bGQzX2R1cF91MTYoX190cmFuc2ZlcnNpemUoMykgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NHgzX3QgdmxkM19kdXBfdTE2KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQxNl90IGNvbnN0ICogcHRyKSAvLyBWTEQzLjE2IHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQoreworICAgIHVpbnQxNng0eDNfdCB2OworICAgIF9fbTEyOGkgdmFsMCwgdmFsMSwgdmFsMjsKKyAgICB2YWwyID0gTE9BRF9TSTEyOChwdHIpOyAvLzAsMSwyLHgsIHgseCx4LHgKKyAgICB2YWwwID0gX21tX3NodWZmbGVsb19lcGkxNih2YWwyLCAwKTsgLy8wMCAwMCAwMCAwMCAoYWxsIDApCisgICAgdmFsMSA9IF9tbV9zaHVmZmxlbG9fZXBpMTYodmFsMiwgODUpOyAvLzAxIDAxIDAxIDAxIChhbGwgMSkKKyAgICB2YWwyID0gX21tX3NodWZmbGVsb19lcGkxNih2YWwyLCAxNzApOyAvLzEwIDEwIDEwIDEwIChhbGwgMikKKyAgICBfTTY0KHYudmFsWzBdLCB2YWwwKTsKKyAgICBfTTY0KHYudmFsWzFdLCB2YWwxKTsKKyAgICBfTTY0KHYudmFsWzJdLCB2YWwyKTsKKyAgICByZXR1cm4gdjsKK30KKwordWludDMyeDJ4M190IHZsZDNfZHVwX3UzMihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMzIge2QwW10sIGQxW10sIGQyW119LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyeDNfdCB2bGQzX2R1cF91MzIoX190cmFuc2ZlcnNpemUoMykgdWludDMyX3QgY29uc3QgKiBwdHIpIC8vIFZMRDMuMzIge2QwW10sIGQxW10sIGQyW119LCBbcjBdCit7CisgICAgdWludDMyeDJ4M190IHY7CisgICAgX19tMTI4aSB2YWwwLCB2YWwxLCB2YWwyOworICAgIHZhbDIgPSBMT0FEX1NJMTI4KHB0cik7IC8vMCwxLDIseAorICAgIHZhbDAgPSBfbW1fc2h1ZmZsZV9lcGkzMih2YWwyLCAgIDAgfCAoMCA8PCAyKSB8ICgyIDw8IDQpIHwgKDIgPDwgNikpOyAvLzAsMCwyLDIKKyAgICB2YWwxID0gX21tX3NodWZmbGVfZXBpMzIodmFsMiwgICAxIHwgKDEgPDwgMikgfCAoMiA8PCA0KSB8ICgyIDw8IDYpKTsgLy8xLDEsMiwyCisgICAgdmFsMiA9IF9tbV9zcmxpX3NpMTI4KHZhbDAsIDgpOyAvLzIsMiwweDAsMHgwCisgICAgX002NCh2LnZhbFswXSwgdmFsMCk7CisgICAgX002NCh2LnZhbFsxXSwgdmFsMSk7CisgICAgX002NCh2LnZhbFsyXSwgdmFsMik7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQ2NHgxeDNfdCB2bGQzX2R1cF91NjQoX190cmFuc2ZlcnNpemUoMykgdWludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50NjR4MXgzX3QgdmxkM19kdXBfdTY0KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ2NF90IGNvbnN0ICogcHRyKSAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyfSwgW3IwXQoreworICAgIHVpbnQ2NHgxeDNfdCB2OworICAgIHYudmFsWzBdLm02NF91NjRbMF0gPSAqKHB0cik7CisgICAgdi52YWxbMV0ubTY0X3U2NFswXSA9ICoocHRyICsgMSk7CisgICAgdi52YWxbMl0ubTY0X3U2NFswXSA9ICoocHRyICsgMik7CisgICAgcmV0dXJuIHY7Cit9CisKK2ludDh4OHgzX3QgdmxkM19kdXBfczgoX190cmFuc2ZlcnNpemUoMykgaW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy44IHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQorI2RlZmluZSB2bGQzX2R1cF9zOChwdHIpIHZsZDNfZHVwX3U4KCh1aW50OF90KilwdHIpCisKK2ludDE2eDR4M190IHZsZDNfZHVwX3MxNihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KKyNkZWZpbmUgdmxkM19kdXBfczE2KHB0cikgdmxkM19kdXBfdTE2KCh1aW50MTZfdCopcHRyKQorCitpbnQzMngyeDNfdCB2bGQzX2R1cF9zMzIoX190cmFuc2ZlcnNpemUoMykgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMzIge2QwW10sIGQxW10sIGQyW119LCBbcjBdCisjZGVmaW5lIHZsZDNfZHVwX3MzMihwdHIpIHZsZDNfZHVwX3UzMigodWludDMyX3QqKXB0cikKKworaW50NjR4MXgzX3QgdmxkM19kdXBfczY0KF9fdHJhbnNmZXJzaXplKDMpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyfSwgW3IwXQorI2RlZmluZSB2bGQzX2R1cF9zNjQocHRyKSB2bGQzX2R1cF91NjQoKHVpbnQ2NF90KilwdHIpCisKKworZmxvYXQxNng0eDNfdCB2bGQzX2R1cF9mMTYoX190cmFuc2ZlcnNpemUoMykgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KKy8vIElBMzIgU0lNRCBkb2Vzbid0IHdvcmsgd2l0aCAxNmJpdCBmbG9hdHMgY3VycmVudGx5LCBzbyBuZWVkIHRvIGdvIHRvIDMyIGJpdCBhbmQgdGhlbiB3b3JrIHdpdGggdHdvIDEyOGJpdCByZWdpc3RlcnMuIFNlZSB2bGQxcV9mMTYgZm9yIGV4YW1wbGUKKworZmxvYXQzMngyeDNfdCB2bGQzX2R1cF9mMzIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4zMiB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyeDNfdCB2bGQzX2R1cF9mMzIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90IGNvbnN0ICogcHRyKSAvLyBWTEQzLjMyIHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQoreworICAgIGZsb2F0MzJ4MngzX3QgdjsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpPDM7IGkrKykgeworICAgICAgICB2LnZhbFtpXS5tNjRfZjMyWzBdID0gKihwdHIgKyBpKTsKKyAgICAgICAgdi52YWxbaV0ubTY0X2YzMlsxXSA9ICoocHRyICsgaSk7CisgICAgfQorICAgIHJldHVybiB2OworfQorCitwb2x5OHg4eDNfdCB2bGQzX2R1cF9wOChfX3RyYW5zZmVyc2l6ZSgzKSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy44IHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQorI2RlZmluZSB2bGQzX2R1cF9wOCB2bGQzX2R1cF91OAorCitwb2x5MTZ4NHgzX3QgdmxkM19kdXBfcDE2KF9fdHJhbnNmZXJzaXplKDMpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KKyNkZWZpbmUgdmxkM19kdXBfcDE2IHZsZDNfZHVwX3MxNgorCisKKy8vKioqKioqKioqKioqKiBEdXBsaWNhdGUgKG9yIHByb3BhZ2F0ZSkgcXVhZHJ1cGxlczogKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9wdHJbMF0gdG8gYWxsIHZhbFswXSBsYW5lcywgcHRyWzFdIHRvIGFsbCB2YWxbMV0gbGFuZXMsIHB0clsyXSB0byBhbGwgdmFsWzJdIGxhbmVzICBhbmQgIHB0clszXSB0byBhbGwgdmFsWzNdIGxhbmVzCit1aW50OHg4eDRfdCB2bGQ0X2R1cF91OChfX3RyYW5zZmVyc2l6ZSg0KSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxENC44IHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50OHg4eDRfdCB2bGQ0X2R1cF91OChfX3RyYW5zZmVyc2l6ZSg0KSB1aW50OF90IGNvbnN0ICogcHRyKSAvLyBWTEQ0Ljgge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCit7CisgICAgdWludDh4OHg0X3QgdjsKKyAgICBfX20xMjhpIHZhbDAsIHZhbDEsIHZhbDI7CisgICAgdmFsMCA9IExPQURfU0kxMjgocHRyKTsgLy8wLDEsMiwzLCB4LHgseCx4LHgseCx4LHgsIHgseCx4LHgKKyAgICB2YWwxID0gX21tX3VucGFja2xvX2VwaTgodmFsMCx2YWwwKTsgLy8wLDAsMSwxLDIsMiwzLDMsIHgseCx4LHgseCx4LHgseCwKKyAgICB2YWwxID0gX21tX3VucGFja2xvX2VwaTE2KHZhbDEsdmFsMSk7IC8vMCwwLDAsMCwgMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMKKyAgICB2YWwwID0gX21tX3VucGFja2xvX2VwaTMyKHZhbDEsdmFsMSk7IC8vMCwwLDAsMCwgMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsCisgICAgdmFsMiA9IF9tbV91bnBhY2toaV9lcGkzMih2YWwxLHZhbDEpOyAvLyAyLDIsMiwyLDIsMiwyLDIsIDMsMywzLDMsIDMsMywzLDMKKyAgICB2c3QxcV91OCgmdi52YWxbMF0sIHZhbDApOworICAgIHZzdDFxX3U4KCZ2LnZhbFsyXSwgdmFsMik7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQxNng0eDRfdCB2bGQ0X2R1cF91MTYoX190cmFuc2ZlcnNpemUoNCkgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjE2IHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NHg0X3QgdmxkNF9kdXBfdTE2KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90IGNvbnN0ICogcHRyKSAvLyBWTEQ0LjE2IHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQoreworICAgIHVpbnQxNng0eDRfdCB2OworICAgIF9fbTEyOGkgdmFsMCwgdmFsMSwgdmFsMiwgdmFsMzsKKyAgICB2YWwzID0gTE9BRF9TSTEyOChwdHIpOyAvLzAsMSwyLDMsIHgseCx4LHgKKyAgICB2YWwwID0gX21tX3NodWZmbGVsb19lcGkxNih2YWwzLCAwKTsgLy8wMCAwMCAwMCAwMCAoYWxsIDApCisgICAgdmFsMSA9IF9tbV9zaHVmZmxlbG9fZXBpMTYodmFsMywgODUpOyAvLzAxIDAxIDAxIDAxIChhbGwgMSkKKyAgICB2YWwyID0gX21tX3NodWZmbGVsb19lcGkxNih2YWwzLCAxNzApOyAvLzEwIDEwIDEwIDEwIChhbGwgMikKKyAgICB2YWwzID0gX21tX3NodWZmbGVsb19lcGkxNih2YWwzLCAyNTUpOyAvLzExIDExIDExIDExIChhbGwgMykKKyAgICBfTTY0KHYudmFsWzBdLCB2YWwwKTsKKyAgICBfTTY0KHYudmFsWzFdLCB2YWwxKTsKKyAgICBfTTY0KHYudmFsWzJdLCB2YWwyKTsKKyAgICBfTTY0KHYudmFsWzNdLCB2YWwzKTsKKyAgICByZXR1cm4gdjsKK30KKwordWludDMyeDJ4NF90IHZsZDRfZHVwX3UzMihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyeDRfdCB2bGQ0X2R1cF91MzIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgY29uc3QgKiBwdHIpIC8vIFZMRDQuMzIge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCit7CisgICAgdWludDMyeDJ4NF90IHY7CisgICAgX19tMTI4aSB2YWwwLCB2YWwxLCB2YWwyLCB2YWwzOworICAgIHZhbDMgPSBMT0FEX1NJMTI4KHB0cik7IC8vMCwxLDIsMworICAgIHZhbDAgPSBfbW1fc2h1ZmZsZV9lcGkzMih2YWwzLCAgIDAgfCAoMCA8PCAyKSB8ICgyIDw8IDQpIHwgKDMgPDwgNikpOyAvLzAsMCwyLDMKKyAgICB2YWwxID0gX21tX3NodWZmbGVfZXBpMzIodmFsMywgICAxIHwgKDEgPDwgMikgfCAoMiA8PCA0KSB8ICgzIDw8IDYpKTsgLy8xLDEsMiwzCisgICAgdmFsMiA9IF9tbV9zaHVmZmxlX2VwaTMyKHZhbDMsICAgMiB8ICgyIDw8IDIpIHwgKDMgPDwgNCkgfCAoMyA8PCA2KSk7IC8vMiwyLDMsMworICAgIHZhbDMgPSBfbW1fc2h1ZmZsZV9lcGkzMih2YWwzLCAgIDMgfCAoMyA8PCAyKSB8ICgzIDw8IDQpIHwgKDMgPDwgNikpOyAvLzMsMywyLDIKKyAgICBfTTY0KHYudmFsWzBdLCB2YWwwKTsKKyAgICBfTTY0KHYudmFsWzFdLCB2YWwxKTsKKyAgICBfTTY0KHYudmFsWzJdLCB2YWwyKTsKKyAgICBfTTY0KHYudmFsWzNdLCB2YWwzKTsKKyAgICByZXR1cm4gdjsKK30KKwordWludDY0eDF4NF90IHZsZDRfZHVwX3U2NChfX3RyYW5zZmVyc2l6ZSg0KSB1aW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50NjR4MXg0X3QgdmxkNF9kdXBfdTY0KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQ2NF90IGNvbnN0ICogcHRyKSAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3sKKyAgICB1aW50NjR4MXg0X3QgdjsKKyAgICB2LnZhbFswXS5tNjRfdTY0WzBdID0gKihwdHIpOworICAgIHYudmFsWzFdLm02NF91NjRbMF0gPSAqKHB0ciArIDEpOworICAgIHYudmFsWzJdLm02NF91NjRbMF0gPSAqKHB0ciArIDIpOworICAgIHYudmFsWzNdLm02NF91NjRbMF0gPSAqKHB0ciArIDMpOworICAgIHJldHVybiB2OworfQorCitpbnQ4eDh4NF90IHZsZDRfZHVwX3M4KF9fdHJhbnNmZXJzaXplKDQpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KKyNkZWZpbmUgdmxkNF9kdXBfczgocHRyKSB2bGQ0X2R1cF91OCgodWludDhfdCopcHRyKQorCitpbnQxNng0eDRfdCB2bGQ0X2R1cF9zMTYoX190cmFuc2ZlcnNpemUoNCkgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCisjZGVmaW5lIHZsZDRfZHVwX3MxNihwdHIpIHZsZDRfZHVwX3UxNigodWludDE2X3QqKXB0cikKKworaW50MzJ4Mng0X3QgdmxkNF9kdXBfczMyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjMyIHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQorI2RlZmluZSB2bGQ0X2R1cF9zMzIocHRyKSB2bGQ0X2R1cF91MzIoKHVpbnQzMl90KilwdHIpCisKK2ludDY0eDF4NF90IHZsZDRfZHVwX3M2NChfX3RyYW5zZmVyc2l6ZSg0KSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCisjZGVmaW5lIHZsZDRfZHVwX3M2NChwdHIpIHZsZDRfZHVwX3U2NCgodWludDY0X3QqKXB0cikKKworZmxvYXQxNng0eDRfdCB2bGQ0X2R1cF9mMTYoX190cmFuc2ZlcnNpemUoNCkgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KKy8vIElBMzIgU0lNRCBkb2Vzbid0IHdvcmsgd2l0aCAxNmJpdCBmbG9hdHMgY3VycmVudGx5LCBzbyBuZWVkIHRvIGdvIHRvIDMyIGJpdCBhbmQgdGhlbiB3b3JrIHdpdGggdHdvIDEyOGJpdCByZWdpc3RlcnMuIFNlZSB2bGQxcV9mMTYgZm9yIGV4YW1wbGUKKworZmxvYXQzMngyeDRfdCB2bGQ0X2R1cF9mMzIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4zMiB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyeDRfdCB2bGQ0X2R1cF9mMzIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90IGNvbnN0ICogcHRyKSAvLyBWTEQ0LjMyIHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQoreworICAgIGZsb2F0MzJ4Mng0X3QgdjsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpPDQ7IGkrKykgeworICAgICAgICB2LnZhbFtpXS5tNjRfZjMyWzBdID0gKihwdHIgKyBpKTsKKyAgICAgICAgdi52YWxbaV0ubTY0X2YzMlsxXSA9ICoocHRyICsgaSk7CisgICAgfQorICAgIHJldHVybiB2OworfQorCitwb2x5OHg4eDRfdCB2bGQ0X2R1cF9wOChfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxENC44IHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQorI2RlZmluZSB2bGQ0X2R1cF9wOCB2bGQ0X2R1cF91OAorCitwb2x5MTZ4NHg0X3QgdmxkNF9kdXBfcDE2KF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KKyNkZWZpbmUgdmxkNF9kdXBfcDE2IHZsZDRfZHVwX3UxNgorCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqTGFuZSBsb2FkcyBmb3IgIGFuIE4tZWxlbWVudCBzdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKiBMYW5lIHBhaXJzICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vZG9lcyB2bGQxX2xhbmVfeHggcHRyWzBdIHRvIHNyYy0+dmFsWzBdIGF0IGxhbmUgcG9zaXRvbiBhbmQgcHRyWzFdIHRvIHNyYy0+dmFsWzFdIGF0IGxhbmUgcG9zaXRvbgorLy93ZSBhc3N1bWUgIHNyYyBpcyAxNiBiaXQgYWxpZ25lZAorCisvLyEhISEhISBNaWNyb3NvZnQgY29tcGlsZXIgZG9lcyBub3QgYWxsb3cgeHh4eHh4XzJ0IGZ1bmN0aW9uIGFyZ3VtZW50cyByZXN1bHRpbmcgaW4gImZvcm1hbCBwYXJhbWV0ZXIgd2l0aCBfX2RlY2xzcGVjKGFsaWduKCcxNicpKSB3b24ndCBiZSBhbGlnbmVkIiBlcnJvcgorLy90byBmaXggaXQgdGhlIGFsbCBmdW5jdGlvbnMgYmVsb3cgd29yayB3aXRoICB4eHh4eHhfMnQgcG9pbnRlcnMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG9yaWdpbmFsIGZ1bmN0aW9ucyBhcmUgcmVkZWZpbmVkCisKKy8vdWludDE2eDh4Ml90IHZsZDJxX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4OHgyX3Qgc3JjLF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWTEQyLjE2IHtkMFswXSwgZDJbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4eDJfdCB2bGQycV9sYW5lX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDE2X3QgY29uc3QgKiBwdHIsIHVpbnQxNng4eDJfdCogc3JjLF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKSAvLyBWTEQyLjE2IHtkMFswXSwgZDJbMF19LCBbcjBdCit7CisgICAgdWludDE2eDh4Ml90IHY7CisgICAgdi52YWxbMF0gPSB2bGQxcV9sYW5lX3MxNiAocHRyLCBzcmMtPnZhbFswXSwgIGxhbmUpOworICAgIHYudmFsWzFdID0gdmxkMXFfbGFuZV9zMTYgKChwdHIgKyAxKSwgc3JjLT52YWxbMV0sICBsYW5lKTsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgdmxkMnFfbGFuZV91MTYocHRyLCBzcmMsIGxhbmUpIHZsZDJxX2xhbmVfdTE2X3B0cihwdHIsICZzcmMsIGxhbmUpCisKKy8vdWludDMyeDR4Ml90IHZsZDJxX2xhbmVfdTMyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90IGNvbnN0ICogcHRyLCB1aW50MzJ4NHgyX3Qgc3JjLF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsvLyBWTEQyLjMyIHtkMFswXSwgZDJbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0eDJfdCB2bGQycV9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMng0eDJfdCogc3JjLF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKSAvLyBWTEQyLjMyIHtkMFswXSwgZDJbMF19LCBbcjBdCit7CisgICAgdWludDMyeDR4Ml90IHY7CisgICAgdi52YWxbMF0gPSBfTU1fSU5TRVJUX0VQSTMyIChzcmMtPnZhbFswXSwgIHB0clswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gPSBfTU1fSU5TRVJUX0VQSTMyIChzcmMtPnZhbFsxXSwgIHB0clsxXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDJxX2xhbmVfdTMyKHB0ciwgc3JjLCBsYW5lKSB2bGQycV9sYW5lX3UzMl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisvL2ludDE2eDh4Ml90IHZsZDJxX2xhbmVfczE2KF9fdHJhbnNmZXJzaXplKDIpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDh4Ml90IHNyYywgX19jb25zdHJhbmdlKDAsNylpbnQgbGFuZSk7Ly8gVkxEMi4xNiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSBpbnQxNng4eDJfdCB2bGQycV9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50MTZfdCBjb25zdCAqIHB0ciwgaW50MTZ4OHgyX3QqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpCit7CisgICAgaW50MTZ4OHgyX3QgdjsKKyAgICB2LnZhbFswXSA9IHZsZDFxX2xhbmVfczE2IChwdHIsIHNyYy0+dmFsWzBdLCAgbGFuZSk7CisgICAgdi52YWxbMV0gPSB2bGQxcV9sYW5lX3MxNiAoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQycV9sYW5lX3MxNihwdHIsIHNyYywgbGFuZSkgdmxkMnFfbGFuZV9zMTZfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworLy9pbnQzMng0eDJfdCB2bGQycV9sYW5lX3MzMihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMng0eDJfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDMpaW50IGxhbmUpOy8vIFZMRDIuMzIge2QwWzBdLCBkMlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NHgyX3QgdmxkMnFfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGludDMyX3QgY29uc3QgKiBwdHIsIGludDMyeDR4Ml90KiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgIGludDMyeDR4Ml90IHY7CisgICAgdi52YWxbMF0gPSBfTU1fSU5TRVJUX0VQSTMyIChzcmMtPnZhbFswXSwgIHB0clswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gPSBfTU1fSU5TRVJUX0VQSTMyIChzcmMtPnZhbFsxXSwgIHB0clsxXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDJxX2xhbmVfczMyKHB0ciwgc3JjLCBsYW5lKSB2bGQycV9sYW5lX3MzMl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisvL2Zsb2F0MTZ4OHgyX3QgdmxkMnFfbGFuZV9mMTYoX190cmFuc2ZlcnNpemUoMikgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDh4Ml90IHNyYywgX19jb25zdHJhbmdlKDAsNylpbnQgbGFuZSk7Ly8gVkxEMi4xNiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQorLy9jdXJyZW50IElBIFNJTUQgZG9lc24ndCBzdXBwb3J0IGZsb2F0MTYKKworLy9mbG9hdDMyeDR4Ml90IHZsZDJxX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4NHgyX3Qgc3JjLF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsvLyBWTEQyLjMyIHtkMFswXSwgZDJbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NHgyX3QgdmxkMnFfbGFuZV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGZsb2F0MzJfdCBjb25zdCAqIHB0ciwgZmxvYXQzMng0eDJfdCogc3JjLF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKSAvLyBWTEQyLjMyIHtkMFswXSwgZDJbMF19LCBbcjBdCit7CisgICAgZmxvYXQzMng0eDJfdCB2OworICAgIHYudmFsWzBdID0gdmxkMXFfbGFuZV9mMzIocHRyLCBzcmMtPnZhbFswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gPSB2bGQxcV9sYW5lX2YzMigocHRyICsgMSksIHNyYy0+dmFsWzFdLCBsYW5lKTsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgdmxkMnFfbGFuZV9mMzIocHRyLHNyYyxsYW5lKSB2bGQycV9sYW5lX2YzMl9wdHIocHRyLCZzcmMsbGFuZSkKKworLy9wb2x5MTZ4OHgyX3QgdmxkMnFfbGFuZV9wMTYoX190cmFuc2ZlcnNpemUoMikgcG9seTE2X3QgY29uc3QgKiBwdHIsIHBvbHkxNng4eDJfdCBzcmMsX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZMRDIuMTYge2QwWzBdLCBkMlswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMnFfbGFuZV9wMTYgdmxkMnFfbGFuZV91MTYKKworLy91aW50OHg4eDJfdCB2bGQyX2xhbmVfdTgoX190cmFuc2ZlcnNpemUoMikgdWludDhfdCBjb25zdCAqIHB0ciwgdWludDh4OHgyX3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVkxEMi44IHtkMFswXSwgZDFbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDh4Ml90IHZsZDJfbGFuZV91OF9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDhfdCBjb25zdCAqIHB0ciwgdWludDh4OHgyX3QqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpIC8vIFZMRDIuOCB7ZDBbMF0sIGQxWzBdfSwgW3IwXQoreworICAgIHVpbnQ4eDh4Ml90IHY7CisgICAgdi52YWxbMF0gPSB2bGQxX2xhbmVfdTgocHRyLCBzcmMtPnZhbFswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gPSB2bGQxX2xhbmVfdTgoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDJfbGFuZV91OChwdHIsIHNyYywgbGFuZSkgdmxkMl9sYW5lX3U4X3B0cihwdHIsICZzcmMsIGxhbmUpCisKKy8vdWludDE2eDR4Ml90IHZsZDJfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoMikgdWludDE2X3QgY29uc3QgKiBwdHIsIHVpbnQxNng0eDJfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDMpaW50IGxhbmUpOy8vIFZMRDIuMTYge2QwWzBdLCBkMVswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDR4Ml90IHZsZDJfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4NHgyX3QqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgdWludDE2eDR4Ml90IHY7CisgICAgdi52YWxbMF0gID0gIHZsZDFfbGFuZV91MTYocHRyLCBzcmMtPnZhbFswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gID0gdmxkMV9sYW5lX3UxNigocHRyICsgMSksIHNyYy0+dmFsWzFdLCBsYW5lKTsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgdmxkMl9sYW5lX3UxNihwdHIsIHNyYywgbGFuZSkgdmxkMl9sYW5lX3UxNl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisvL3VpbnQzMngyeDJfdCB2bGQyX2xhbmVfdTMyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90IGNvbnN0ICogcHRyLCB1aW50MzJ4MngyX3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKWludCBsYW5lKTsvLyBWTEQyLjMyIHtkMFswXSwgZDFbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyeDJfdCB2bGQyX2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDJ4Ml90KiBzcmMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgIHVpbnQzMngyeDJfdCB2OworICAgIHYudmFsWzBdICA9ICB2bGQxX2xhbmVfdTMyKHB0ciwgc3JjLT52YWxbMF0sIGxhbmUpOworICAgIHYudmFsWzFdICA9IHZsZDFfbGFuZV91MzIoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDJfbGFuZV91MzIocHRyLCBzcmMsIGxhbmUpIHZsZDJfbGFuZV91MzJfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworLy9pbnQ4eDh4Ml90IHZsZDJfbGFuZV9zOChfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ4X3QgY29uc3QgKiBwdHIsIGludDh4OHgyX3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVkxEMi44IHtkMFswXSwgZDFbMF19LCBbcjBdCitpbnQ4eDh4Ml90IHZsZDJfbGFuZV9zOF9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50OF90IGNvbnN0ICogcHRyLCBpbnQ4eDh4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDIuOCB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorI2RlZmluZSB2bGQyX2xhbmVfczgocHRyLCBzcmMsIGxhbmUpICB2bGQyX2xhbmVfdTgoKCB1aW50OF90KikgcHRyLCBzcmMsIGxhbmUpCisKKy8vaW50MTZ4NHgyX3QgdmxkMl9sYW5lX3MxNihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQxNl90IGNvbnN0ICogcHRyLCBpbnQxNng0eDJfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsvLyBWTEQyLjE2IHtkMFswXSwgZDFbMF19LCBbcjBdCitpbnQxNng0eDJfdCB2bGQyX2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQxNl90IGNvbnN0ICogcHRyLCBpbnQxNng0eDJfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQyLjE2IHtkMFswXSwgZDFbMF19LCBbcjBdCisjZGVmaW5lIHZsZDJfbGFuZV9zMTYocHRyLCBzcmMsIGxhbmUpIHZsZDJfbGFuZV91MTYoKCB1aW50MTZfdCopIHB0ciwgc3JjLCBsYW5lKQorCisvL2ludDMyeDJ4Ml90IHZsZDJfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4MngyX3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7Ly8gVkxEMi4zMiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQoraW50MzJ4MngyX3QgdmxkMl9sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4MngyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkxEMi4zMiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorI2RlZmluZSB2bGQyX2xhbmVfczMyKHB0ciwgc3JjLCBsYW5lKSB2bGQyX2xhbmVfdTMyKCggdWludDMyX3QqKSBwdHIsIHNyYywgbGFuZSkKKworLy9mbG9hdDE2eDR4Ml90IHZsZDJfbGFuZV9mMTYoX190cmFuc2ZlcnNpemUoMikgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDR4Ml90IHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQyLjE2IHtkMFswXSwgZDFbMF19LCBbcjBdCisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCitmbG9hdDMyeDJ4Ml90IHZsZDJfbGFuZV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGZsb2F0MzJfdCBjb25zdCAqIHB0ciwgZmxvYXQzMngyeDJfdCAqIHNyYyxfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZMRDIuMzIge2QwWzBdLCBkMVswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyeDJfdCB2bGQyX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4MngyX3QgKiBzcmMsX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpCit7CisgICAgZmxvYXQzMngyeDJfdCB2OworICAgIHYudmFsWzBdID0gdmxkMV9sYW5lX2YzMihwdHIsIHNyYy0+dmFsWzBdLCBsYW5lKTsKKyAgICB2LnZhbFsxXSA9IHZsZDFfbGFuZV9mMzIoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDJfbGFuZV9mMzIocHRyLCBzcmMsIGxhbmUpIHZsZDJfbGFuZV9mMzJfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworLy9wb2x5OHg4eDJfdCB2bGQyX2xhbmVfcDgoX190cmFuc2ZlcnNpemUoMikgcG9seThfdCBjb25zdCAqIHB0ciwgcG9seTh4OHgyX3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVkxEMi44IHtkMFswXSwgZDFbMF19LCBbcjBdCitwb2x5OHg4eDJfdCB2bGQyX2xhbmVfcDhfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHBvbHk4X3QgY29uc3QgKiBwdHIsIHBvbHk4eDh4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDIuOCB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorI2RlZmluZSB2bGQyX2xhbmVfcDggdmxkMl9sYW5lX3U4CisKKy8vcG9seTE2eDR4Ml90IHZsZDJfbGFuZV9wMTYoX190cmFuc2ZlcnNpemUoMikgcG9seTE2X3QgY29uc3QgKiBwdHIsIHBvbHkxNng0eDJfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDMpaW50IGxhbmUpOy8vIFZMRDIuMTYge2QwWzBdLCBkMVswXX0sIFtyMF0KK3BvbHkxNng0eDJfdCB2bGQyX2xhbmVfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBwb2x5MTZfdCBjb25zdCAqIHB0ciwgcG9seTE2eDR4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDIuMTYge2QwWzBdLCBkMVswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMl9sYW5lX3AxNiB2bGQyX2xhbmVfdTE2CisKKy8vKioqKioqKioqKiogTGFuZSB0cmlwbGV0cyAqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vZG9lcyB2bGQxX2xhbmVfeHggcHRyWzBdIHRvIHNyYy0+dmFsWzBdLCBwdHJbMV0gdG8gc3JjLT52YWxbMV0gYW5kIHB0clsyXSB0byBzcmMtPnZhbFsyXSBhdCBsYW5lIHBvc2l0b24KKy8vd2UgYXNzdW1lIHNyYyBpcyAxNiBiaXQgYWxpZ25lZAorCisvL3VpbnQxNng4eDNfdCB2bGQzcV9sYW5lX3UxNihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDh4M190IHNyYyxfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVkxEMy4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDh4M190IHZsZDNxX2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDh4M190KiBzcmMsX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpIC8vIFZMRDMuMTYge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCit7CisgICAgdWludDE2eDh4M190IHY7CisgICAgdi52YWxbMF0gPSBfTU1fSU5TRVJUX0VQSTE2ICggc3JjLT52YWxbMF0sICBwdHJbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gX01NX0lOU0VSVF9FUEkxNiAoIHNyYy0+dmFsWzFdLCAgcHRyWzFdLCBsYW5lKTsKKyAgICB2LnZhbFsyXSA9IF9NTV9JTlNFUlRfRVBJMTYgKCBzcmMtPnZhbFsyXSwgIHB0clsyXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDNxX2xhbmVfdTE2KHB0ciwgc3JjLCBsYW5lKSB2bGQzcV9sYW5lX3UxNl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisvL3VpbnQzMng0eDNfdCB2bGQzcV9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDR4M190IHNyYyxfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVkxEMy4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDR4M190IHZsZDNxX2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDR4M190KiBzcmMsX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpIC8vIFZMRDMuMzIge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCit7CisgICAgdWludDMyeDR4M190IHY7CisgICAgdi52YWxbMF0gPSBfTU1fSU5TRVJUX0VQSTMyICggc3JjLT52YWxbMF0sICBwdHJbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gX01NX0lOU0VSVF9FUEkzMiAoIHNyYy0+dmFsWzFdLCAgcHRyWzFdLCBsYW5lKTsKKyAgICB2LnZhbFsyXSA9IF9NTV9JTlNFUlRfRVBJMzIgKCBzcmMtPnZhbFsyXSwgIHB0clsyXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDNxX2xhbmVfdTMyKHB0ciwgc3JjLCBsYW5lKSB2bGQzcV9sYW5lX3UzMl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisvL2ludDE2eDh4M190IHZsZDNxX2xhbmVfczE2KF9fdHJhbnNmZXJzaXplKDMpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDh4M190IHNyYywgX19jb25zdHJhbmdlKDAsNylpbnQgbGFuZSk7Ly8gVkxEMy4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OHgzX3QgdmxkM3FfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDh4M190KiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKSAvLyBWTEQzLjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQoreworICAgIGludDE2eDh4M190IHY7CisgICAgdi52YWxbMF0gPSBfTU1fSU5TRVJUX0VQSTE2ICggc3JjLT52YWxbMF0sICBwdHJbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gX01NX0lOU0VSVF9FUEkxNiAoIHNyYy0+dmFsWzFdLCAgcHRyWzFdLCBsYW5lKTsKKyAgICB2LnZhbFsyXSA9IF9NTV9JTlNFUlRfRVBJMTYgKCBzcmMtPnZhbFsyXSwgIHB0clsyXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDNxX2xhbmVfczE2KHB0ciwgc3JjLCBsYW5lKSB2bGQzcV9sYW5lX3MxNl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisvL2ludDMyeDR4M190IHZsZDNxX2xhbmVfczMyKF9fdHJhbnNmZXJzaXplKDMpIGludDMyX3QgY29uc3QgKiBwdHIsIGludDMyeDR4M190IHNyYywgX19jb25zdHJhbmdlKDAsMylpbnQgbGFuZSk7Ly8gVkxEMy4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NHgzX3QgdmxkM3FfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDMyX3QgY29uc3QgKiBwdHIsIGludDMyeDR4M190KiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKSAvLyBWTEQzLjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQoreworICAgIGludDMyeDR4M190IHY7CisgICAgdi52YWxbMF0gPSBfTU1fSU5TRVJUX0VQSTMyICggc3JjLT52YWxbMF0sICBwdHJbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gX01NX0lOU0VSVF9FUEkzMiAoIHNyYy0+dmFsWzFdLCAgcHRyWzFdLCBsYW5lKTsKKyAgICB2LnZhbFsyXSA9IF9NTV9JTlNFUlRfRVBJMzIgKCBzcmMtPnZhbFsyXSwgIHB0clsyXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDNxX2xhbmVfczMyKHB0ciwgc3JjLCBsYW5lKSB2bGQzcV9sYW5lX3MzMl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCitmbG9hdDE2eDh4M190IHZsZDNxX2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBfX2ZwMTYgY29uc3QgKiBwdHIsIGZsb2F0MTZ4OHgzX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMy4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KKy8vY3VycmVudCBJQSBTSU1EIGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdDE2CisjZGVmaW5lIHZsZDNxX2xhbmVfZjE2KHB0ciwgc3JjLCBsYW5lKSB2bGQzcV9sYW5lX2YxNl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisKKy8vZmxvYXQzMng0eDNfdCB2bGQzcV9sYW5lX2YzMihfX3RyYW5zZmVyc2l6ZSgzKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4NHgzX3Qgc3JjLF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsvLyBWTEQzLjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDR4M190IHZsZDNxX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4NHgzX3QqIHNyYyxfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkgLy8gVkxEMy4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK3sKKyAgICBmbG9hdDMyeDR4M190IHY7CisgICAgdi52YWxbMF0gPSB2bGQxcV9sYW5lX2YzMigmcHRyWzBdLCBzcmMtPnZhbFswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gPSB2bGQxcV9sYW5lX2YzMigmcHRyWzFdLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSB2bGQxcV9sYW5lX2YzMigmcHRyWzJdLCBzcmMtPnZhbFsyXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDNxX2xhbmVfZjMyKHB0cixzcmMsbGFuZSkgdmxkM3FfbGFuZV9mMzJfcHRyKHB0ciwmc3JjLGxhbmUpCisKK3BvbHkxNng4eDNfdCB2bGQzcV9sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgcG9seTE2X3QgY29uc3QgKiBwdHIsIHBvbHkxNng4eDNfdCAqIHNyYyxfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDMuMTYge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCisjZGVmaW5lIHZsZDNxX2xhbmVfcDE2IHZsZDNxX2xhbmVfdTE2CisKKy8vdWludDh4OHgzX3QgdmxkM19sYW5lX3U4KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ4X3QgY29uc3QgKiBwdHIsIHVpbnQ4eDh4M190IHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZMRDMuOCB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OHgzX3QgdmxkM19sYW5lX3U4X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50OF90IGNvbnN0ICogcHRyLCB1aW50OHg4eDNfdCogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkgLy8gVkxEMy44IHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQoreworICAgIHVpbnQ4eDh4M190IHY7CisgICAgdi52YWxbMF0gPSB2bGQxX2xhbmVfdTgocHRyLCBzcmMtPnZhbFswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gPSB2bGQxX2xhbmVfdTgoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSB2bGQxX2xhbmVfdTgoKHB0ciArIDIpLCBzcmMtPnZhbFsyXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDNfbGFuZV91OChwdHIsIHNyYywgbGFuZSkgdmxkM19sYW5lX3U4X3B0cihwdHIsICZzcmMsIGxhbmUpCisKKy8vdWludDE2eDR4M190IHZsZDNfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoMykgdWludDE2X3QgICBjb25zdCAqIHB0ciwgdWludDE2eDR4M190IHNyYywgX19jb25zdHJhbmdlKDAsMylpbnQgbGFuZSk7Ly8gVkxEMy4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDR4M190IHZsZDNfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4NHgzX3QqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpIC8vIFZMRDMuMTYge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCit7CisgICAgdWludDE2eDR4M190IHY7CisgICAgdi52YWxbMF0gPSB2bGQxX2xhbmVfdTE2KHB0ciwgc3JjLT52YWxbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gdmxkMV9sYW5lX3UxNigocHRyICsgMSksIHNyYy0+dmFsWzFdLCBsYW5lKTsKKyAgICB2LnZhbFsyXSA9IHZsZDFfbGFuZV91MTYoKHB0ciArIDIpLCBzcmMtPnZhbFsyXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDNfbGFuZV91MTYocHRyLCBzcmMsIGxhbmUpIHZsZDNfbGFuZV91MTZfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworLy91aW50MzJ4MngzX3QgdmxkM19sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDJ4M190IHNyYywgX19jb25zdHJhbmdlKDAsMSlpbnQgbGFuZSk7Ly8gVkxEMy4zMiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJ4M190IHZsZDNfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQzMl90IGNvbnN0ICogcHRyLCB1aW50MzJ4MngzX3QqIHNyYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpIC8vIFZMRDMuMzIge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCit7CisgICAgLy9uZWVkIHRvIG1lcmdlIGludG8gMTI4IGJpdCBhbnl3YXkKKyAgICB1aW50MzJ4MngzX3QgdjsKKyAgICB2LnZhbFswXSA9IHZsZDFfbGFuZV91MzIocHRyLCBzcmMtPnZhbFswXSwgbGFuZSk7OworICAgIHYudmFsWzFdID0gdmxkMV9sYW5lX3UzMigocHRyICsgMSksIHNyYy0+dmFsWzFdLCBsYW5lKTs7CisgICAgdi52YWxbMl0gPSB2bGQxX2xhbmVfdTMyKChwdHIgKyAyKSwgc3JjLT52YWxbMl0sIGxhbmUpOzsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgdmxkM19sYW5lX3UzMihwdHIsIHNyYywgbGFuZSkgdmxkM19sYW5lX3UzMl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCitpbnQ4eDh4M190IHZsZDNfbGFuZV9zOF9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50OF90IGNvbnN0ICogcHRyLCBpbnQ4eDh4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDMuOCB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KKyNkZWZpbmUgdmxkM19sYW5lX3M4KHB0ciwgc3JjLCBsYW5lKSAgdmxkM19sYW5lX3U4X3B0cigoIHVpbnQ4X3QqKSBwdHIsICZzcmMsIGxhbmUpCisKK2ludDE2eDR4M190IHZsZDNfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDR4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDMuMTYge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCisjZGVmaW5lIHZsZDNfbGFuZV9zMTYocHRyLCBzcmMsIGxhbmUpICB2bGQzX2xhbmVfdTE2X3B0cigoIHVpbnQxNl90KikgcHRyLCAmc3JjLCBsYW5lKQorCitpbnQzMngyeDNfdCB2bGQzX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMngyeDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTEQzLjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQorI2RlZmluZSB2bGQzX2xhbmVfczMyKHB0ciwgc3JjLCBsYW5lKSAgdmxkM19sYW5lX3UzMl9wdHIoKCB1aW50MzJfdCopIHB0ciwgJnNyYywgbGFuZSkKKworZmxvYXQxNng0eDNfdCB2bGQzX2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBfX2ZwMTYgY29uc3QgKiBwdHIsIGZsb2F0MTZ4NHgzX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMy4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KKy8vY3VycmVudCBJQSBTSU1EIGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdDE2CisKKy8vZmxvYXQzMngyeDNfdCB2bGQzX2xhbmVfZjMyKF9fdHJhbnNmZXJzaXplKDMpIGZsb2F0MzJfdCBjb25zdCAqIHB0ciwgZmxvYXQzMngyeDNfdCBzcmMsX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOy8vIFZMRDMuMzIge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4MngzX3QgdmxkM19sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDJ4M190KiBzcmMsX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpIC8vIFZMRDMuMzIge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCit7CisgICAgZmxvYXQzMngyeDNfdCB2OworICAgIHYudmFsWzBdID0gdmxkMV9sYW5lX2YzMihwdHIsIHNyYy0+dmFsWzBdLCBsYW5lKTsKKyAgICB2LnZhbFsxXSA9IHZsZDFfbGFuZV9mMzIoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSB2bGQxX2xhbmVfZjMyKChwdHIgKyAyKSwgc3JjLT52YWxbMl0sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQzX2xhbmVfZjMyKHB0cixzcmMsbGFuZSkgdmxkM19sYW5lX2YzMl9wdHIocHRyLCZzcmMsbGFuZSkKKworLy9wb2x5OHg4eDNfdCB2bGQzX2xhbmVfcDhfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHBvbHk4X3QgY29uc3QgKiBwdHIsIHBvbHk4eDh4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDMuOCB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KKyNkZWZpbmUgdmxkM19sYW5lX3A4IHZsZDNfbGFuZV91OAorCisvL3BvbHkxNng0eDNfdCB2bGQzX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDMpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4NHgzX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMy4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KKyNkZWZpbmUgdmxkM19sYW5lX3AxNiB2bGQzX2xhbmVfdTE2CisKKy8vKioqKioqKioqKioqKioqKioqKiBMYW5lIFF1YWRydXBsZXMgIGxvYWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9kb2VzIHZsZDFfbGFuZV94eCBwdHJbMF0gdG8gc3JjLT52YWxbMF0sIHB0clsxXSB0byBzcmMtPnZhbFsxXSwgcHRyWzJdIHRvIHNyYy0+dmFsWzJdIGFuZCBwdHJbM10gdG8gc3JjLT52YWxbM10gYXQgbGFuZSBwb3NpdG9uCisvL3dlIGFzc3VtZSBzcmMgaXMgMTYgYml0IGFsaWduZWQKKworLy91aW50MTZ4OHg0X3QgdmxkNHFfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoNCkgdWludDE2X3QgY29uc3QgKiBwdHIsIHVpbnQxNng4eDRfdCBzcmMsX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpLy8gVkxENC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4eDRfdCB2bGQ0cV9sYW5lX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDE2X3QgY29uc3QgKiBwdHIsIHVpbnQxNng4eDRfdCogc3JjLF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKQoreworICAgIHVpbnQxNng4eDRfdCB2OworICAgIHYudmFsWzBdID0gX01NX0lOU0VSVF9FUEkxNiAoIHNyYy0+dmFsWzBdLCAgcHRyWzBdLCBsYW5lKTsKKyAgICB2LnZhbFsxXSA9IF9NTV9JTlNFUlRfRVBJMTYgKCBzcmMtPnZhbFsxXSwgIHB0clsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSBfTU1fSU5TRVJUX0VQSTE2ICggc3JjLT52YWxbMl0sICBwdHJbMl0sIGxhbmUpOworICAgIHYudmFsWzNdID0gX01NX0lOU0VSVF9FUEkxNiAoIHNyYy0+dmFsWzNdLCAgcHRyWzNdLCBsYW5lKTsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgdmxkNHFfbGFuZV91MTYocHRyLCBzcmMsIGxhbmUpIHZsZDRxX2xhbmVfdTE2X3B0cihwdHIsICZzcmMsIGxhbmUpCisKKy8vdWludDMyeDR4NF90IHZsZDRxX2xhbmVfdTMyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90IGNvbnN0ICogcHRyLCB1aW50MzJ4NHg0X3Qgc3JjLF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKS8vIFZMRDQuMzIge2QwWzBdLCBkMlswXSwgZDRbMF0sIGQ2WzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NHg0X3QgdmxkNHFfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90IGNvbnN0ICogcHRyLCB1aW50MzJ4NHg0X3QqIHNyYyxfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkKK3sKKyAgICB1aW50MzJ4NHg0X3QgdjsKKyAgICB2LnZhbFswXSA9IF9NTV9JTlNFUlRfRVBJMzIgKCBzcmMtPnZhbFswXSwgIHB0clswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gPSBfTU1fSU5TRVJUX0VQSTMyICggc3JjLT52YWxbMV0sICBwdHJbMV0sIGxhbmUpOworICAgIHYudmFsWzJdID0gX01NX0lOU0VSVF9FUEkzMiAoIHNyYy0+dmFsWzJdLCAgcHRyWzJdLCBsYW5lKTsKKyAgICB2LnZhbFszXSA9IF9NTV9JTlNFUlRfRVBJMzIgKCBzcmMtPnZhbFszXSwgIHB0clszXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDRxX2xhbmVfdTMyKHB0ciwgc3JjLCBsYW5lKSB2bGQ0cV9sYW5lX3UzMl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisvL2ludDE2eDh4NF90IHZsZDRxX2xhbmVfczE2KF9fdHJhbnNmZXJzaXplKDQpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDh4NF90IHNyYywgX19jb25zdHJhbmdlKDAsNylpbnQgbGFuZSk7Ly8gVkxENC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCitpbnQxNng4eDRfdCB2bGQ0cV9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgaW50MTZfdCBjb25zdCAqIHB0ciwgaW50MTZ4OHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxENC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCisjZGVmaW5lIHZsZDRxX2xhbmVfczE2KHB0ciwgc3JjLCBsYW5lKSB2bGQ0cV9sYW5lX3UxNigoIHVpbnQxNl90KikgcHRyLCBzcmMsIGxhbmUpCisKKy8vaW50MzJ4NHg0X3QgdmxkNHFfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoNCkgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4NHg0X3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKWludCBsYW5lKTsvLyBWTEQ0LjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK2ludDMyeDR4NF90IHZsZDRxX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMng0eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQ0LjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KKyNkZWZpbmUgdmxkNHFfbGFuZV9zMzIocHRyLCBzcmMsIGxhbmUpICB2bGQ0cV9sYW5lX3UzMigoIHVpbnQzMl90KikgcHRyLCBzcmMsIGxhbmUpCisKKy8vZmxvYXQxNng4eDRfdCB2bGQ0cV9sYW5lX2YxNihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgY29uc3QgKiBwdHIsIGZsb2F0MTZ4OHg0X3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KWludCBsYW5lKTsvLyBWTEQ0LjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK2Zsb2F0MTZ4OHg0X3QgdmxkNHFfbGFuZV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIF9fZnAxNiBjb25zdCAqIHB0ciwgZmxvYXQxNng4eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQ0LjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KKy8vY3VycmVudCBJQSBTSU1EIGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdDE2CisKKy8vZmxvYXQzMng0eDRfdCB2bGQ0cV9sYW5lX2YzMihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4NHg0X3Qgc3JjLF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKS8vIFZMRDQuMzIge2QwWzBdLCBkMlswXSwgZDRbMF0sIGQ2WzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDR4NF90IHZsZDRxX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4NHg0X3QqIHNyYyxfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkKK3sKKyAgICBmbG9hdDMyeDR4NF90IHY7CisgICAgdi52YWxbMF0gPSB2bGQxcV9sYW5lX2YzMigmcHRyWzBdLCBzcmMtPnZhbFswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gPSB2bGQxcV9sYW5lX2YzMigmcHRyWzFdLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSB2bGQxcV9sYW5lX2YzMigmcHRyWzJdLCBzcmMtPnZhbFsyXSwgbGFuZSk7CisgICAgdi52YWxbM10gPSB2bGQxcV9sYW5lX2YzMigmcHRyWzNdLCBzcmMtPnZhbFszXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDRxX2xhbmVfZjMyKHB0cix2YWwsbGFuZSkgdmxkNHFfbGFuZV9mMzJfcHRyKHB0ciwmdmFsLGxhbmUpCisKKy8vcG9seTE2eDh4NF90IHZsZDRxX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4OHg0X3Qgc3JjLF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWTEQ0LjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK3BvbHkxNng4eDRfdCB2bGQ0cV9sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgcG9seTE2X3QgY29uc3QgKiBwdHIsIHBvbHkxNng4eDRfdCAqIHNyYyxfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDQuMTYge2QwWzBdLCBkMlswXSwgZDRbMF0sIGQ2WzBdfSwgW3IwXQorI2RlZmluZSB2bGQ0cV9sYW5lX3AxNiB2bGQ0cV9sYW5lX3UxNgorCisvL3VpbnQ4eDh4NF90IHZsZDRfbGFuZV91OChfX3RyYW5zZmVyc2l6ZSg0KSB1aW50OF90IGNvbnN0ICogcHRyLCB1aW50OHg4eDRfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKS8vIFZMRDQuOCB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDh4NF90IHZsZDRfbGFuZV91OF9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDhfdCBjb25zdCAqIHB0ciwgdWludDh4OHg0X3QqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpCit7CisgICAgdWludDh4OHg0X3QgdjsKKyAgICB2LnZhbFswXSA9IHZsZDFfbGFuZV91OChwdHIsIHNyYy0+dmFsWzBdLCBsYW5lKTsKKyAgICB2LnZhbFsxXSA9IHZsZDFfbGFuZV91OCgocHRyICsgMSksIHNyYy0+dmFsWzFdLCBsYW5lKTsKKyAgICB2LnZhbFsyXSA9IHZsZDFfbGFuZV91OCgocHRyICsgMiksIHNyYy0+dmFsWzJdLCBsYW5lKTsKKyAgICB2LnZhbFszXSA9IHZsZDFfbGFuZV91OCgocHRyICsgMyksIHNyYy0+dmFsWzNdLCBsYW5lKTsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgdmxkNF9sYW5lX3U4KHB0ciwgc3JjLCBsYW5lKSB2bGQ0X2xhbmVfdThfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworLy91aW50MTZ4NHg0X3QgdmxkNF9sYW5lX3UxNihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDR4NF90IHNyYywgX19jb25zdHJhbmdlKDAsMylpbnQgbGFuZSkvLyBWTEQ0LjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDR4NF90IHZsZDRfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4NHg0X3QqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgdWludDE2eDR4NF90IHY7CisgICAgdi52YWxbMF0gPSB2bGQxX2xhbmVfdTE2KHB0ciwgc3JjLT52YWxbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gdmxkMV9sYW5lX3UxNigocHRyICsgMSksIHNyYy0+dmFsWzFdLCBsYW5lKTsKKyAgICB2LnZhbFsyXSA9IHZsZDFfbGFuZV91MTYoKHB0ciArIDIpLCBzcmMtPnZhbFsyXSwgbGFuZSk7CisgICAgdi52YWxbM10gPSB2bGQxX2xhbmVfdTE2KChwdHIgKyAzKSwgc3JjLT52YWxbM10sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQ0X2xhbmVfdTE2KHB0ciwgc3JjLCBsYW5lKSB2bGQ0X2xhbmVfdTE2X3B0cihwdHIsICZzcmMsIGxhbmUpCisKKy8vdWludDMyeDJ4NF90IHZsZDRfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMngyeDRfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDEpaW50IGxhbmUpLy8gVkxENC4zMiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyeDRfdCB2bGQ0X2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDJ4NF90KiBzcmMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgIHVpbnQzMngyeDRfdCB2OworICAgIHYudmFsWzBdID0gdmxkMV9sYW5lX3UzMihwdHIsIHNyYy0+dmFsWzBdLCBsYW5lKTsKKyAgICB2LnZhbFsxXSA9IHZsZDFfbGFuZV91MzIoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSB2bGQxX2xhbmVfdTMyKChwdHIgKyAyKSwgc3JjLT52YWxbMl0sIGxhbmUpOworICAgIHYudmFsWzNdID0gdmxkMV9sYW5lX3UzMigocHRyICsgMyksIHNyYy0+dmFsWzNdLCBsYW5lKTsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgdmxkNF9sYW5lX3UzMihwdHIsIHNyYywgbGFuZSkgdmxkNF9sYW5lX3UzMl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisvL2ludDh4OHg0X3QgdmxkNF9sYW5lX3M4KF9fdHJhbnNmZXJzaXplKDQpIGludDhfdCBjb25zdCAqIHB0ciwgaW50OHg4eDRfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWTEQ0Ljgge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQoraW50OHg4eDRfdCB2bGQ0X2xhbmVfczhfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGludDhfdCBjb25zdCAqIHB0ciwgaW50OHg4eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOworI2RlZmluZSB2bGQ0X2xhbmVfczgocHRyLHNyYyxsYW5lKSB2bGQ0X2xhbmVfdTgoKHVpbnQ4X3QqKXB0cixzcmMsbGFuZSkKKworLy9pbnQxNng0eDRfdCB2bGQ0X2xhbmVfczE2KF9fdHJhbnNmZXJzaXplKDQpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDR4NF90IHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOy8vIFZMRDQuMTYge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQoraW50MTZ4NHg0X3QgdmxkNF9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgaW50MTZfdCBjb25zdCAqIHB0ciwgaW50MTZ4NHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsKKyNkZWZpbmUgdmxkNF9sYW5lX3MxNihwdHIsc3JjLGxhbmUpIHZsZDRfbGFuZV91MTYoKHVpbnQxNl90KilwdHIsc3JjLGxhbmUpCisKKy8vaW50MzJ4Mng0X3QgdmxkNF9sYW5lX3MzMihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMngyeDRfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsvLyBWTEQ0LjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK2ludDMyeDJ4NF90IHZsZDRfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgY29uc3QgKiBwdHIsIGludDMyeDJ4NF90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7CisjZGVmaW5lIHZsZDRfbGFuZV9zMzIocHRyLHNyYyxsYW5lKSB2bGQ0X2xhbmVfdTMyKCh1aW50MzJfdCopcHRyLHNyYyxsYW5lKQorCisvL2Zsb2F0MTZ4NHg0X3QgdmxkNF9sYW5lX2YxNihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgY29uc3QgKiBwdHIsIGZsb2F0MTZ4NHg0X3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKWludCBsYW5lKTsvLyBWTEQ0LjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK2Zsb2F0MTZ4NHg0X3QgdmxkNF9sYW5lX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDR4NF90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7CisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCisvL2Zsb2F0MzJ4Mng0X3QgdmxkNF9sYW5lX2YzMihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4Mng0X3Qgc3JjLF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKS8vIFZMRDQuMzIge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJ4NF90IHZsZDRfbGFuZV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCBjb25zdCAqIHB0ciwgZmxvYXQzMngyeDRfdCogc3JjLF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgIC8vc2VyaWFsIHNvbHV0aW9uIG1heSBiZSBmYXN0ZXIKKyAgICBmbG9hdDMyeDJ4NF90IHY7CisgICAgdi52YWxbMF0gPSB2bGQxX2xhbmVfZjMyKHB0ciwgc3JjLT52YWxbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gdmxkMV9sYW5lX2YzMigocHRyICsgMSksIHNyYy0+dmFsWzFdLCBsYW5lKTsKKyAgICB2LnZhbFsyXSA9IHZsZDFfbGFuZV9mMzIoKHB0ciArIDIpLCBzcmMtPnZhbFsyXSwgbGFuZSk7CisgICAgdi52YWxbM10gPSB2bGQxX2xhbmVfZjMyKChwdHIgKyAzKSwgc3JjLT52YWxbM10sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQ0X2xhbmVfZjMyKHB0cixzcmMsbGFuZSkgdmxkNF9sYW5lX2YzMl9wdHIocHRyLCZzcmMsbGFuZSkKKworLy9wb2x5OHg4eDRfdCB2bGQ0X2xhbmVfcDgoX190cmFuc2ZlcnNpemUoNCkgcG9seThfdCBjb25zdCAqIHB0ciwgcG9seTh4OHg0X3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVkxENC44IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK3BvbHk4eDh4NF90IHZsZDRfbGFuZV9wOF9wdHIoX190cmFuc2ZlcnNpemUoNCkgcG9seThfdCBjb25zdCAqIHB0ciwgcG9seTh4OHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsKKyNkZWZpbmUgdmxkNF9sYW5lX3A4IHZsZDRfbGFuZV91OAorCisvL3BvbHkxNng0eDRfdCB2bGQ0X2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4NHg0X3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKWludCBsYW5lKTsvLyBWTEQ0LjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK3BvbHkxNng0eDRfdCB2bGQ0X2xhbmVfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5MTZfdCBjb25zdCAqIHB0ciwgcG9seTE2eDR4NF90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7CisjZGVmaW5lIHZsZDRfbGFuZV9wMTYgdmxkNF9sYW5lX3UxNgorCisvLyoqKioqKioqKioqKioqKioqKiogU3RvcmUgZHVwbGV0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vaGVyZSB3ZSBhc3N1bWUgdGhlIHB0ciBpcyAxNmJpdCBhbGlnbmVkLiBJZiBub3Qgd2UgbmVlZCB0byB1c2UgX21tX3N0b3JldV9zaTEyOCBsaWtlIHNob3duIGluIHZzdDFxX3U4IGZ1bmN0aW9uCisvL0lmIG5lY2Vzc2FyeSB5b3UgbmVlZCB0byBtb2RpZnkgYWxsIHN0b3JlIGZ1bmN0aW9ucyBhY2NvcmRpbmdseS4gU2VlIG1vcmUgY29tbWVudHMgdG8gIlN0b3JlIHNpbmdsZSIgZnVuY3Rpb25zCisvL3ZvaWQgdnN0MnFfdTgoX190cmFuc2ZlcnNpemUoMzIpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDE2eDJfdCB2YWwpLy8gVlNUMi44IHtkMCwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0MnFfdThfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSB1aW50OF90ICogcHRyLCB1aW50OHgxNngyX3QqIHZhbCkKK3sKKyAgICB1aW50OHgxNngyX3QgdjsKKyAgICB2LnZhbFswXSA9IF9tbV91bnBhY2tsb19lcGk4KHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7CisgICAgdi52YWxbMV0gPSBfbW1fdW5wYWNraGlfZXBpOCh2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOworICAgIHZzdDFxX3U4IChwdHIsIHYudmFsWzBdKTsKKyAgICB2c3QxcV91OCAoKHB0ciArIDE2KSwgIHYudmFsWzFdKTsKK30KKyNkZWZpbmUgdnN0MnFfdTgocHRyLCB2YWwpIHZzdDJxX3U4X3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QycV91MTYoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OHgyX3QgdmFsKS8vIFZTVDIuMTYge2QwLCBkMn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QycV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDh4Ml90KiB2YWwpCit7CisgICAgdWludDE2eDh4Ml90IHY7CisgICAgdi52YWxbMF0gPSBfbW1fdW5wYWNrbG9fZXBpMTYodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsKKyAgICB2LnZhbFsxXSA9IF9tbV91bnBhY2toaV9lcGkxNih2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOworICAgIHZzdDFxX3UxNiAocHRyLCB2LnZhbFswXSk7CisgICAgdnN0MXFfdTE2ICgocHRyICsgOCksICB2LnZhbFsxXSk7Cit9CisjZGVmaW5lIHZzdDJxX3UxNihwdHIsIHZhbCkgdnN0MnFfdTE2X3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QycV91MzIoX190cmFuc2ZlcnNpemUoOCkgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0eDJfdCB2YWwpLy8gVlNUMi4zMiB7ZDAsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDJxX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoOCkgdWludDMyX3QqIHB0ciwgdWludDMyeDR4Ml90KiB2YWwpCit7CisgICAgdWludDMyeDR4Ml90IHY7CisgICAgdi52YWxbMF0gPSBfbW1fdW5wYWNrbG9fZXBpMzIodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsKKyAgICB2LnZhbFsxXSA9IF9tbV91bnBhY2toaV9lcGkzMih2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOworICAgIHZzdDFxX3UzMiAocHRyLCB2LnZhbFswXSk7CisgICAgdnN0MXFfdTMyICgocHRyICsgNCksICB2LnZhbFsxXSk7Cit9CisjZGVmaW5lIHZzdDJxX3UzMihwdHIsIHZhbCkgdnN0MnFfdTMyX3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QycV9zOChfX3RyYW5zZmVyc2l6ZSgzMikgaW50OF90ICogcHRyLCBpbnQ4eDE2eDJfdCB2YWwpOyAvLyBWU1QyLjgge2QwLCBkMn0sIFtyMF0KK3ZvaWQgdnN0MnFfczhfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSBpbnQ4X3QgKiBwdHIsIGludDh4MTZ4Ml90ICogdmFsKTsKKyNkZWZpbmUgdnN0MnFfczgocHRyLCB2YWwpIHZzdDJxX3U4KCh1aW50OF90KikocHRyKSwgdmFsKQorCisvL3ZvaWQgdnN0MnFfczE2KF9fdHJhbnNmZXJzaXplKDE2KSBpbnQxNl90ICogcHRyLCBpbnQxNng4eDJfdCB2YWwpOy8vIFZTVDIuMTYge2QwLCBkMn0sIFtyMF0KK3ZvaWQgdnN0MnFfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgaW50MTZfdCAqIHB0ciwgaW50MTZ4OHgyX3QgKiB2YWwpOworI2RlZmluZSB2c3QycV9zMTYocHRyLCB2YWwpIHZzdDJxX3UxNigodWludDE2X3QqKShwdHIpLCB2YWwpCisKKy8vdm9pZCB2c3QycV9zMzIoX190cmFuc2ZlcnNpemUoOCkgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHgyX3QgdmFsKTsvLyBWU1QyLjMyIHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoOCkgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHgyX3QgKiB2YWwpOworI2RlZmluZSB2c3QycV9zMzIocHRyLCB2YWwpICB2c3QycV91MzIoKHVpbnQzMl90KikocHRyKSwgdmFsKQorCisvL3ZvaWQgdnN0MnFfZjE2KF9fdHJhbnNmZXJzaXplKDE2KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHgyX3QgdmFsKTsvLyBWU1QyLjE2IHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4eDJfdCAqIHZhbCk7CisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseQorCisvL3ZvaWQgdnN0MnFfZjMyKF9fdHJhbnNmZXJzaXplKDgpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMng0eDJfdCB2YWwpLy8gVlNUMi4zMiB7ZDAsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDJxX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoOCkgZmxvYXQzMl90KiBwdHIsIGZsb2F0MzJ4NHgyX3QqIHZhbCkKK3sKKyAgICBmbG9hdDMyeDR4Ml90IHY7CisgICAgdi52YWxbMF0gPSBfbW1fdW5wYWNrbG9fcHModmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsKKyAgICB2LnZhbFsxXSA9IF9tbV91bnBhY2toaV9wcyh2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOworICAgIHZzdDFxX2YzMiAocHRyLCB2LnZhbFswXSk7CisgICAgdnN0MXFfZjMyICgocHRyICsgNCksICB2LnZhbFsxXSk7Cit9CisjZGVmaW5lIHZzdDJxX2YzMihwdHIsIHZhbCkgdnN0MnFfZjMyX3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QycV9wOChfX3RyYW5zZmVyc2l6ZSgzMikgcG9seThfdCAqIHB0ciwgcG9seTh4MTZ4Ml90IHZhbCk7Ly8gVlNUMi44IHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSgzMikgcG9seThfdCAqIHB0ciwgcG9seTh4MTZ4Ml90ICogdmFsKTsKKyNkZWZpbmUgdnN0MnFfcDggdnN0MnFfdTgKKworLy92b2lkIHZzdDJxX3AxNihfX3RyYW5zZmVyc2l6ZSgxNikgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4eDJfdCB2YWwpOy8vIFZTVDIuMTYge2QwLCBkMn0sIFtyMF0KK3ZvaWQgdnN0MnFfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4eDJfdCAqIHZhbCk7CisjZGVmaW5lIHZzdDJxX3AxNiB2c3QycV91MTYKKworLy92b2lkIHZzdDJfdTgoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4Ml90IHZhbCk7Ly8gVlNUMi44IHtkMCwgZDF9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0Ml91OF9wdHIoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4Ml90KiB2YWwpCit7CisgICAgX19tMTI4aSB2MDsKKyAgICB2MCA9IF9tbV91bnBhY2tsb19lcGk4KF9wTTEyOGkodmFsLT52YWxbMF0pLCBfcE0xMjhpKHZhbC0+dmFsWzFdKSk7CisgICAgdnN0MXFfdTggKHB0ciwgdjApOworfQorI2RlZmluZSB2c3QyX3U4KHB0ciwgdmFsKSB2c3QyX3U4X3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QyX3UxNihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDR4Ml90IHZhbCk7Ly8gVlNUMi4xNiB7ZDAsIGQxfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDJfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDR4Ml90KiB2YWwpCit7CisgICAgX19tMTI4aSB2MDsKKyAgICB2MCA9IF9tbV91bnBhY2tsb19lcGkxNihfcE0xMjhpKHZhbC0+dmFsWzBdKSwgX3BNMTI4aSh2YWwtPnZhbFsxXSkpOworICAgIHZzdDFxX3UxNiAocHRyLCB2MCk7Cit9CisjZGVmaW5lIHZzdDJfdTE2KHB0ciwgdmFsKSB2c3QyX3UxNl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0Ml91MzIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyeDJfdCB2YWwpOy8vIFZTVDIuMzIge2QwLCBkMX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QyX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyeDJfdCogdmFsKQoreworICAgIF9fbTEyOGkgdjA7CisgICAgdjAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoX3BNMTI4aSh2YWwtPnZhbFswXSksIF9wTTEyOGkodmFsLT52YWxbMV0pKTsKKyAgICB2c3QxcV91MzIgKHB0ciwgdjApOworfQorI2RlZmluZSB2c3QyX3UzMihwdHIsIHZhbCkgdnN0Ml91MzJfcHRyKHB0ciwgJnZhbCkKKworCisvL3ZvaWQgdnN0Ml91NjQoX190cmFuc2ZlcnNpemUoMikgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgxeDJfdCB2YWwpOy8vIFZTVDEuNjQge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0Ml91NjRfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ2NF90ICogcHRyLCB1aW50NjR4MXgyX3QgKiB2YWwpOworX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDJfdTY0X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50NjRfdCAqIHB0ciwgdWludDY0eDF4Ml90KiB2YWwpCit7CisgICAgKihwdHIpID0gdmFsLT52YWxbMF0ubTY0X3U2NFswXTsKKyAgICAqKHB0ciArIDEpID0gdmFsLT52YWxbMV0ubTY0X3U2NFswXTsKK30KKyNkZWZpbmUgdnN0Ml91NjQocHRyLCB2YWwpIHZzdDJfdTY0X3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QyX3M4KF9fdHJhbnNmZXJzaXplKDE2KSBpbnQ4X3QgKiBwdHIsIGludDh4OHgyX3QgdmFsKTsvLyBWU1QyLjgge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdnN0Ml9zOChwdHIsIHZhbCkgdnN0Ml91OCgodWludDhfdCopIHB0ciwgdmFsKQorCisvL3ZvaWQgdnN0Ml9zMTYoX190cmFuc2ZlcnNpemUoOCkgaW50MTZfdCAqIHB0ciwgaW50MTZ4NHgyX3QgdmFsKTsgLy8gVlNUMi4xNiB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2c3QyX3MxNihwdHIsdmFsKSB2c3QyX3UxNigodWludDE2X3QqKSBwdHIsIHZhbCkKKworLy92b2lkIHZzdDJfczMyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgKiBwdHIsIGludDMyeDJ4Ml90IHZhbCk7IC8vIFZTVDIuMzIge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdnN0Ml9zMzIocHRyLHZhbCkgdnN0Ml91MzIoKHVpbnQzMl90KikgcHRyLCB2YWwpCisKKy8vdm9pZCB2c3QyX3M2NChfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ2NF90ICogcHRyLCBpbnQ2NHgxeDJfdCB2YWwpOworI2RlZmluZSB2c3QyX3M2NChwdHIsdmFsKSB2c3QyX3U2NCgodWludDY0X3QqKSBwdHIsdmFsKQorCisvL3ZvaWQgdnN0Ml9mMTYoX190cmFuc2ZlcnNpemUoOCkgX19mcDE2ICogcHRyLCBmbG9hdDE2eDR4Ml90IHZhbCk7IC8vIFZTVDIuMTYge2QwLCBkMX0sIFtyMF0KKy8vY3VycmVudCBJQSBTSU1EIGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdDE2CisKKy8vdm9pZCB2c3QyX2YzMihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4MngyX3QgdmFsKTsgLy8gVlNUMi4zMiB7ZDAsIGQxfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDJfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QqIHB0ciwgZmxvYXQzMngyeDJfdCogdmFsKQoreworICAgICoocHRyKSA9ICAgdmFsLT52YWxbMF0ubTY0X2YzMlswXTsKKyAgICAqKHB0ciArIDEpID0gdmFsLT52YWxbMV0ubTY0X2YzMlswXTsKKyAgICAqKHB0ciArIDIpID0gdmFsLT52YWxbMF0ubTY0X2YzMlsxXTsKKyAgICAqKHB0ciArIDMpID0gdmFsLT52YWxbMV0ubTY0X2YzMlsxXTsKK30KKyNkZWZpbmUgdnN0Ml9mMzIocHRyLCB2YWwpIHZzdDJfZjMyX3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QyX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgcG9seThfdCAqIHB0ciwgcG9seTh4OHgyX3QgKiB2YWwpOyAvLyBWU1QyLjgge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdnN0Ml9wOCB2c3QyX3U4CisKKy8vdm9pZCB2c3QyX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoOCkgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0eDJfdCAqIHZhbCk7IC8vIFZTVDIuMTYge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdnN0Ml9wMTYgdnN0Ml91MTYKKworLy8qKioqKioqKioqKioqKioqKioqKiBUcmlwbGV0cyBzdG9yZSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL3ZvaWQgdnN0M3FfdTgoX190cmFuc2ZlcnNpemUoNDgpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDE2eDNfdCB2YWwpLy8gVlNUMy44IHtkMCwgZDIsIGQ0fSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDNxX3U4X3B0cihfX3RyYW5zZmVyc2l6ZSg0OCkgdWludDhfdCAqIHB0ciwgdWludDh4MTZ4M190KiB2YWwpCit7CisgICAgdWludDh4MTZ4M190IHY7CisgICAgX19tMTI4aSB2MCx2MSx2MiwgY2ZmLCBibGRtYXNrOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2swWzE2XSAgID0gezAsIDEsIDB4ZmYsIDIsIDMsMHhmZiwgNCwgNSwweGZmLCA2LDcsMHhmZiwgOCw5LDB4ZmYsIDEwfTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrMVsxNl0gICA9IHswLCAweGZmLCAxLCAyLCAweGZmLCAzLCA0LCAweGZmLCA1LCA2LCAweGZmLCA3LDgsMHhmZiwgOSwxMH07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFzazJbMTZdID0gICAgezB4ZmYsIDYsIDcsIDB4ZmYsIDgsIDksMHhmZiwgMTAsIDExLDB4ZmYsIDEyLDEzLDB4ZmYsIDE0LDE1LDB4ZmZ9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2sybG9bMTZdID0gezB4ZmYsMHhmZiwgMCwgMHhmZiwweGZmLCAxLCAweGZmLDB4ZmYsIDIsIDB4ZmYsMHhmZiwgMywgMHhmZiwweGZmLCA0LCAweGZmfTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrMm1lZFsxNl0gPSB7MHhmZiwgNSwgMHhmZiwgMHhmZiwgNiwgMHhmZiwweGZmLCA3LCAweGZmLDB4ZmYsIDgsIDB4ZmYsMHhmZiwgOSwgMHhmZiwgMHhmZn07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFzazJoaVsxNl0gPSB7MTAsIDB4ZmYsMHhmZiwgMTEsIDB4ZmYsMHhmZiwgMTIsIDB4ZmYsMHhmZiwgMTMsIDB4ZmYsMHhmZiwgMTQsIDB4ZmYsIDB4ZmYsIDE1fTsKKworICAgIHYwID0gIF9tbV91bnBhY2tsb19lcGk4KHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7IC8vMCwxLCAzLDQsIDYsNywgOSwxMCwgMTIsMTMsIDE1LDE2LCAxOCwxOSwgMjEsMjIKKyAgICB2MiA9ICBfbW1fdW5wYWNraGlfZXBpOCh2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOyAvLzI0LDI1LCAgMjcsMjgsIDMwLDMxLCAzMywzNCwgMzYsMzcsIDM5LDQwLCA0Miw0MywgNDUsNDYKKyAgICB2MSA9ICBfbW1fYWxpZ25yX2VwaTgodjIsIHYwLCAxMSk7IC8vMTIsMTMsIDE1LDE2LCAxOCwxOSwgMjEsMjIsIDI0LDI1LCAgMjcsMjgsIDMwLDMxLCAzMywzNAorICAgIHYudmFsWzBdID0gIF9tbV9zaHVmZmxlX2VwaTgodjAsICooX19tMTI4aSopbWFzazApOyAvL21ha2UgaG9sZXMgZm9yIHRoZSB2LnZhbFsyXSBkYXRhIGVtYmVkZGluZworICAgIHYudmFsWzJdID0gIF9tbV9zaHVmZmxlX2VwaTgodmFsLT52YWxbMl0sICooX19tMTI4aSopbWFzazJsbyk7IC8vbWFrZSBwbHVncyBmb3IgdGhlIHYudmFsWzJdIGRhdGEgZW1iZWRkaW5nCisgICAgY2ZmID0gX21tX2NtcGVxX2VwaTgodjAsIHYwKTsgLy9hbGwgZmYKKyAgICBibGRtYXNrID0gX21tX2NtcGVxX2VwaTgoKihfX20xMjhpKiltYXNrMCwgY2ZmKTsKKyAgICB2LnZhbFswXSA9IF9NTV9CTEVORFZfRVBJOCh2LnZhbFswXSwgdi52YWxbMl0sIGJsZG1hc2spOworICAgIHZzdDFxX3U4KHB0ciwgICB2LnZhbFswXSk7CisgICAgdi52YWxbMF0gPSAgX21tX3NodWZmbGVfZXBpOCh2MSwgKihfX20xMjhpKiltYXNrMSk7IC8vbWFrZSBob2xlcyBmb3IgdGhlIHYudmFsWzJdIGRhdGEgZW1iZWRkaW5nCisgICAgdi52YWxbMl0gPSAgX21tX3NodWZmbGVfZXBpOCh2YWwtPnZhbFsyXSwgKihfX20xMjhpKiltYXNrMm1lZCk7IC8vbWFrZSBwbHVncyBmb3IgdGhlIHYudmFsWzJdIGRhdGEgZW1iZWRkaW5nCisgICAgYmxkbWFzayA9IF9tbV9jbXBlcV9lcGk4KCooX19tMTI4aSopbWFzazEsIGNmZik7CisgICAgdi52YWxbMV0gPSBfTU1fQkxFTkRWX0VQSTgodi52YWxbMF0sdi52YWxbMl0sIGJsZG1hc2spOworICAgIHZzdDFxX3U4KChwdHIgKyAxNiksICB2LnZhbFsxXSk7CisgICAgdi52YWxbMF0gPSAgX21tX3NodWZmbGVfZXBpOCh2MiwgKihfX20xMjhpKiltYXNrMik7IC8vbWFrZSBob2xlcyBmb3IgdGhlIHYudmFsWzJdIGRhdGEgZW1iZWRkaW5nCisgICAgdi52YWxbMl0gPSAgX21tX3NodWZmbGVfZXBpOCh2YWwtPnZhbFsyXSwgKihfX20xMjhpKiltYXNrMmhpKTsgLy9tYWtlIHBsdWdzIGZvciB0aGUgdi52YWxbMl0gZGF0YSBlbWJlZGRpbmcKKyAgICBibGRtYXNrID0gX21tX2NtcGVxX2VwaTgoKihfX20xMjhpKiltYXNrMiwgY2ZmKTsKKyAgICB2LnZhbFsyXSA9IF9NTV9CTEVORFZfRVBJOCh2LnZhbFswXSx2LnZhbFsyXSwgYmxkbWFzayApOworICAgIHZzdDFxX3U4KChwdHIgKyAzMiksICB2LnZhbFsyXSk7Cit9CisjZGVmaW5lIHZzdDNxX3U4KHB0ciwgdmFsKSB2c3QzcV91OF9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0M3FfdTE2KF9fdHJhbnNmZXJzaXplKDI0KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDh4M190IHZhbCkvLyBWU1QzLjE2IHtkMCwgZDIsIGQ0fSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDNxX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMjQpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OHgzX3QqIHZhbCkKK3sKKyAgICB1aW50MTZ4OHgzX3QgdjsKKyAgICBfX20xMjhpIHYwLHYxLHYyLCBjZmYsIGJsZG1hc2s7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFzazBbMTZdICAgPSB7MCwxLCAyLDMsIDB4ZmYsMHhmZiwgNCw1LCA2LDcsMHhmZiwweGZmLCA4LDksMTAsMTF9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2sxWzE2XSAgID0gezB4ZmYsIDB4ZmYsIDAsMSwgMiwzLCAweGZmLDB4ZmYsIDQsNSwgNiw3LCAweGZmLDB4ZmYsIDgsOX07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFzazJbMTZdID0gICAgezYsNywweGZmLDB4ZmYsIDgsOSwxMCwxMSwgMHhmZiwgMHhmZiwgMTIsMTMsMTQsMTUsIDB4ZmYsIDB4ZmZ9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2sybG9bMTZdID0gezB4ZmYsMHhmZiwgMHhmZiwweGZmLCAwLDEsIDB4ZmYsMHhmZiwgMHhmZiwweGZmLCAyLDMsIDB4ZmYsMHhmZiwgMHhmZiwweGZmfTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrMm1lZFsxNl0gPSB7NCw1LCAweGZmLDB4ZmYsMHhmZiwweGZmLCA2LDcsIDB4ZmYsIDB4ZmYsMHhmZiwweGZmLCA4LDksIDB4ZmYsIDB4ZmZ9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2syaGlbMTZdID0gezB4ZmYsIDB4ZmYsIDEwLDExLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAxMiwxMywgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwxNCwxNX07CisKKyAgICB2MCA9ICBfbW1fdW5wYWNrbG9fZXBpMTYodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsgLy8wLDEsIDMsNCwgNiw3LCA5LDEwCisgICAgdjIgPSAgX21tX3VucGFja2hpX2VwaTE2KHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7IC8vMTIsMTMsIDE1LDE2LCAxOCwxOSwgMjEsMjIsCisgICAgdjEgPSAgX21tX2FsaWducl9lcGk4KHYyLCB2MCwgMTIpOyAvLzksMTAsIDEyLDEzLCAxNSwxNiwgMTgsMTkKKyAgICB2LnZhbFswXSA9ICBfbW1fc2h1ZmZsZV9lcGk4KHYwLCAqKF9fbTEyOGkqKW1hc2swKTsgLy9tYWtlIGhvbGVzIGZvciB0aGUgdi52YWxbMl0gZGF0YSBlbWJlZGRpbmcKKyAgICB2LnZhbFsyXSA9ICBfbW1fc2h1ZmZsZV9lcGk4KHZhbC0+dmFsWzJdLCAqKF9fbTEyOGkqKW1hc2sybG8pOyAvL21ha2UgcGx1Z3MgZm9yIHRoZSB2LnZhbFsyXSBkYXRhIGVtYmVkZGluZworICAgIGNmZiA9IF9tbV9jbXBlcV9lcGkxNih2MCwgdjApOyAvL2FsbCBmZgorICAgIGJsZG1hc2sgPSBfbW1fY21wZXFfZXBpMTYoKihfX20xMjhpKiltYXNrMCwgY2ZmKTsKKyAgICB2LnZhbFswXSA9IF9NTV9CTEVORFZfRVBJOCh2LnZhbFswXSwgdi52YWxbMl0sIGJsZG1hc2spOworICAgIHZzdDFxX3UxNihwdHIsICAgICAgdi52YWxbMF0pOworICAgIHYudmFsWzBdID0gIF9tbV9zaHVmZmxlX2VwaTgodjEsICooX19tMTI4aSopbWFzazEpOyAvL21ha2UgaG9sZXMgZm9yIHRoZSB2LnZhbFsyXSBkYXRhIGVtYmVkZGluZworICAgIHYudmFsWzJdID0gIF9tbV9zaHVmZmxlX2VwaTgodmFsLT52YWxbMl0sICooX19tMTI4aSopbWFzazJtZWQpOyAvL21ha2UgcGx1Z3MgZm9yIHRoZSB2LnZhbFsyXSBkYXRhIGVtYmVkZGluZworICAgIGJsZG1hc2sgPSBfbW1fY21wZXFfZXBpMTYoKihfX20xMjhpKiltYXNrMSwgY2ZmKTsKKyAgICB2LnZhbFsxXSA9IF9NTV9CTEVORFZfRVBJOCh2LnZhbFswXSx2LnZhbFsyXSwgYmxkbWFzayk7CisgICAgdnN0MXFfdTE2KChwdHIgKyA4KSwgIHYudmFsWzFdKTsKKyAgICB2LnZhbFswXSA9ICBfbW1fc2h1ZmZsZV9lcGk4KHYyLCAqKF9fbTEyOGkqKW1hc2syKTsgLy9tYWtlIGhvbGVzIGZvciB0aGUgdi52YWxbMl0gZGF0YSBlbWJlZGRpbmcKKyAgICB2LnZhbFsyXSA9ICBfbW1fc2h1ZmZsZV9lcGk4KHZhbC0+dmFsWzJdLCAqKF9fbTEyOGkqKW1hc2syaGkpOyAvL21ha2UgcGx1Z3MgZm9yIHRoZSB2LnZhbFsyXSBkYXRhIGVtYmVkZGluZworICAgIGJsZG1hc2sgPSBfbW1fY21wZXFfZXBpMTYoKihfX20xMjhpKiltYXNrMiwgY2ZmKTsKKyAgICB2LnZhbFsyXSA9IF9NTV9CTEVORFZfRVBJOCh2LnZhbFswXSx2LnZhbFsyXSwgYmxkbWFzayApOworICAgIHZzdDFxX3UxNigocHRyICsgMTYpLCB2LnZhbFsyXSk7Cit9CisjZGVmaW5lIHZzdDNxX3UxNihwdHIsIHZhbCkgdnN0M3FfdTE2X3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QzcV91MzIoX190cmFuc2ZlcnNpemUoMTIpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4NHgzX3QgdmFsKS8vIFZTVDMuMzIge2QwLCBkMiwgZDR9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0M3FfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgxMikgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0eDNfdCogdmFsKQoreworICAgIC8vYTAsYTEsYTIsYTMsICBiMCxiMSxiMixiMywgYzAsYzEsYzIsYzMgLT4gYTAsYjAsYzAsYTEsIGIxLGMxLGEyLGIyLCBjMixhMyxiMyxjMworICAgIHVpbnQzMng0eDNfdCB2OworICAgIF9fbTEyOGkgdG1wMCwgdG1wMSx0bXAyOworICAgIHRtcDAgPSBfbW1fdW5wYWNrbG9fZXBpMzIodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsgLy9hMCxiMCxhMSxiMQorICAgIHRtcDEgPSBfbW1fdW5wYWNraGlfZXBpMzIodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsgLy9hMixiMixhMyxiMworICAgIHRtcDIgPSBfbW1fdW5wYWNrbG9fZXBpMzIodmFsLT52YWxbMV0sIHZhbC0+dmFsWzJdKTsgLy9iMCxjMCxiMSxjMQorICAgIHYudmFsWzFdID0gX21tX2Nhc3Rwc19zaTEyOChfbW1fc2h1ZmZsZV9wcyhfbW1fY2FzdHNpMTI4X3BzKHRtcDIpLF9tbV9jYXN0c2kxMjhfcHModG1wMSksIF9NTV9TSFVGRkxFKDEsMCwzLDIpKSk7IC8vYjEsYzEsYTIsYjIsCisgICAgdi52YWxbMl0gPSBfbW1fdW5wYWNraGlfZXBpNjQodG1wMSwgdmFsLT52YWxbMl0pOyAvL2EzLGIzLCBjMixjMworICAgIHYudmFsWzJdID0gX21tX3NodWZmbGVfZXBpMzIodi52YWxbMl0sIDIgfCAoMCA8PCAyKSB8ICgxIDw8IDQpIHwgKDMgPDwgNikpOyAvL2MyLGEzLGIzLGMzCisgICAgdG1wMSA9IF9tbV91bnBhY2tsb19lcGkzMih0bXAyLHZhbC0+dmFsWzBdKTsgLy9iMCxhMCxjMCxhMQorICAgIHYudmFsWzBdID0gX21tX2Nhc3Rwc19zaTEyOChfbW1fc2h1ZmZsZV9wcyhfbW1fY2FzdHNpMTI4X3BzKHRtcDApLF9tbV9jYXN0c2kxMjhfcHModG1wMSksIF9NTV9TSFVGRkxFKDMsMiwxLDApKSk7IC8vYTAsYjAsYzAsYTEsCisKKyAgICB2c3QxcV91MzIocHRyLCAgICAgIHYudmFsWzBdKTsKKyAgICB2c3QxcV91MzIoKHB0ciArIDQpLCAgdi52YWxbMV0pOworICAgIHZzdDFxX3UzMigocHRyICsgOCksICB2LnZhbFsyXSk7Cit9CisjZGVmaW5lIHZzdDNxX3UzMihwdHIsIHZhbCkgdnN0M3FfdTMyX3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QzcV9zOChfX3RyYW5zZmVyc2l6ZSg0OCkgaW50OF90ICogcHRyLCBpbnQ4eDE2eDNfdCB2YWwpOwordm9pZCB2c3QzcV9zOF9wdHIoX190cmFuc2ZlcnNpemUoNDgpIGludDhfdCAqIHB0ciwgaW50OHgxNngzX3QgKiB2YWwpOworI2RlZmluZSB2c3QzcV9zOChwdHIsIHZhbCkgdnN0M3FfdTgoKHVpbnQ4X3QqKShwdHIpLCB2YWwpCisKKy8vdm9pZCB2c3QzcV9zMTYoX190cmFuc2ZlcnNpemUoMjQpIGludDE2X3QgKiBwdHIsIGludDE2eDh4M190IHZhbCk7Cit2b2lkIHZzdDNxX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMjQpIGludDE2X3QgKiBwdHIsIGludDE2eDh4M190ICogdmFsKTsKKyNkZWZpbmUgdnN0M3FfczE2KHB0ciwgdmFsKSB2c3QzcV91MTYoKHVpbnQxNl90KikocHRyKSwgdmFsKQorCisvL3ZvaWQgdnN0M3FfczMyKF9fdHJhbnNmZXJzaXplKDEyKSBpbnQzMl90ICogcHRyLCBpbnQzMng0eDNfdCB2YWwpOwordm9pZCB2c3QzcV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDEyKSBpbnQzMl90ICogcHRyLCBpbnQzMng0eDNfdCAqIHZhbCk7CisjZGVmaW5lIHZzdDNxX3MzMihwdHIsIHZhbCkgIHZzdDNxX3UzMigodWludDMyX3QqKShwdHIpLCB2YWwpCisKKy8vdm9pZCB2c3QzcV9mMTYoX190cmFuc2ZlcnNpemUoMjQpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4eDNfdCB2YWwpOy8vIFZTVDMuMTYge2QwLCBkMiwgZDR9LCBbcjBdCit2b2lkIHZzdDNxX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMjQpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4eDNfdCAqIHZhbCk7CisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseQorCisvL3ZvaWQgdnN0M3FfZjMyKF9fdHJhbnNmZXJzaXplKDEyKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NHgzX3QgdmFsKS8vIFZTVDMuMzIge2QwLCBkMiwgZDR9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0M3FfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgxMikgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDR4M190KiB2YWwpCit7CisgICAgZmxvYXQzMng0eDNfdCB2OworICAgIF9fbTEyOCB0bXAwLCB0bXAxLHRtcDI7CisgICAgdG1wMCA9IF9tbV91bnBhY2tsb19wcyh2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOyAvL2EwLGIwLGExLGIxCisgICAgdG1wMSA9IF9tbV91bnBhY2toaV9wcyh2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOyAvL2EyLGIyLGEzLGIzCisgICAgdG1wMiA9IF9tbV91bnBhY2tsb19wcyh2YWwtPnZhbFsxXSwgdmFsLT52YWxbMl0pOyAvL2IwLGMwLGIxLGMxCisgICAgdi52YWxbMV0gPSBfbW1fc2h1ZmZsZV9wcyh0bXAyLHRtcDEsIF9NTV9TSFVGRkxFKDEsMCwzLDIpKTsgLy9iMSxjMSxhMixiMiwKKyAgICB2LnZhbFsyXSA9IF9tbV9tb3ZlaGxfcHModmFsLT52YWxbMl0sdG1wMSk7IC8vYTMsYjMsIGMyLGMzCisgICAgdi52YWxbMl0gPSBfbW1fc2h1ZmZsZV9wcyh2LnZhbFsyXSx2LnZhbFsyXSwgX01NX1NIVUZGTEUoMywxLDAsMikpOyAvL2MyLGEzLGIzLGMzCisgICAgdG1wMSA9IF9tbV91bnBhY2tsb19wcyh0bXAyLHZhbC0+dmFsWzBdKTsgLy9iMCxhMCxjMCxhMQorICAgIHYudmFsWzBdID0gX21tX3NodWZmbGVfcHModG1wMCx0bXAxLCBfTU1fU0hVRkZMRSgzLDIsMSwwKSk7IC8vYTAsYjAsYzAsYTEsCisKKyAgICB2c3QxcV9mMzIoIHB0ciwgICAgdi52YWxbMF0pOworICAgIHZzdDFxX2YzMiggKHB0ciArIDQpLCAgdi52YWxbMV0pOworICAgIHZzdDFxX2YzMiggKHB0ciArIDgpLCAgdi52YWxbMl0pOworfQorI2RlZmluZSB2c3QzcV9mMzIocHRyLCB2YWwpIHZzdDNxX2YzMl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0M3FfcDgoX190cmFuc2ZlcnNpemUoNDgpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDE2eDNfdCB2YWwpOy8vIFZTVDMuOCB7ZDAsIGQyLCBkNH0sIFtyMF0KK3ZvaWQgdnN0M3FfcDhfcHRyKF9fdHJhbnNmZXJzaXplKDQ4KSBwb2x5OF90ICogcHRyLCBwb2x5OHgxNngzX3QgKiB2YWwpOworI2RlZmluZSB2c3QzcV9wOCB2c3QzcV91OAorCisvL3ZvaWQgdnN0M3FfcDE2KF9fdHJhbnNmZXJzaXplKDI0KSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDh4M190IHZhbCk7Ly8gVlNUMy4xNiB7ZDAsIGQyLCBkNH0sIFtyMF0KK3ZvaWQgdnN0M3FfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyNCkgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4eDNfdCAqIHZhbCk7CisjZGVmaW5lIHZzdDNxX3AxNiB2c3QzcV91MTYKKworLy92b2lkIHZzdDNfdTgoX190cmFuc2ZlcnNpemUoMjQpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4M190IHZhbCkvLyBWU1QzLjgge2QwLCBkMSwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0M191OF9wdHIoX190cmFuc2ZlcnNpemUoMjQpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4M190KiB2YWwpCit7CisgICAgX19tMTI4aSB0bXAsIHNoMCwgc2gxLCB2YWwwLCB2YWwyOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazBbMTZdID0geyAwLCA4LCAxNiwgMSwgOSwgMTcsIDIsIDEwLCAxOCwgMywgMTEsIDE5LCA0LCAxMiwgMjAsIDV9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazFbMTZdID0gezEzLCAyMSwgNiwgMTQsIDIyLCA3LCAxNSwgMjMsIDAsMCwwLDAsMCwwLDAsMH07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMF9zZWxbMTZdID0gezAsIDAsIDB4ZmYsIDAsIDAsIDB4ZmYsIDAsIDAsIDB4ZmYsIDAsIDAsIDB4ZmYsIDAsIDAsIDB4ZmYsIDB9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazFfc2VsWzE2XSA9IHswLCAweGZmLCAwLCAwLCAweGZmLCAwLCAwLCAweGZmLCAwLDAsMCwwLDAsMCwwLDB9OworICAgIHRtcCA9IF9tbV91bnBhY2tsb19lcGk2NChfcE0xMjhpKHZhbC0+dmFsWzBdKSwgX3BNMTI4aSh2YWwtPnZhbFsxXSkgKTsKKyAgICBzaDAgPSAgX21tX3NodWZmbGVfZXBpOCh0bXAsICooX19tMTI4aSopbWFzazApOyAvL2ZvciBiaT4xNSBiaSBpcyB3cmFwcGVkIChiaS09MTUpCisgICAgdmFsMiA9IF9wTTEyOGkodmFsLT52YWxbMl0pOworICAgIHNoMSA9ICBfbW1fc2h1ZmZsZV9lcGk4KHZhbDIsICooX19tMTI4aSopbWFzazApOworICAgIHZhbDAgPSBfTU1fQkxFTkRWX0VQSTgoc2gwLCBzaDEsICooX19tMTI4aSopbWFzazBfc2VsKTsKKyAgICB2c3QxcV91OChwdHIsICAgdmFsMCk7IC8vc3RvcmUgYXMgMTI4IGJpdCBzdHJ1Y3R1cmUKKyAgICBzaDAgPSAgX21tX3NodWZmbGVfZXBpOCh0bXAsICooX19tMTI4aSopbWFzazEpOyAvL2ZvciBiaT4xNSBiaSBpcyB3cmFwcGVkIChiaS09MTUpCisgICAgc2gxID0gIF9tbV9zaHVmZmxlX2VwaTgodmFsMiwgKihfX20xMjhpKiltYXNrMSk7CisgICAgdmFsMiA9IF9NTV9CTEVORFZfRVBJOChzaDAsIHNoMSwgKihfX20xMjhpKiltYXNrMV9zZWwpOworICAgIF9NNjQoKCooX19tNjRfMTI4KikocHRyICsgMTYpKSwgIHZhbDIpOyAvL25lZWQgaXQgdG8gZml0IGludG8gKnB0ciBtZW1vcnkKK30KKyNkZWZpbmUgdnN0M191OChwdHIsIHZhbCkgdnN0M191OF9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0M191MTYoX190cmFuc2ZlcnNpemUoMTIpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHgzX3QgdmFsKS8vIFZTVDMuMTYge2QwLCBkMSwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0M191MTZfcHRyKF9fdHJhbnNmZXJzaXplKDEyKSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDR4M190KiB2YWwpCit7CisgICAgX19tMTI4aSB0bXAsIHZhbDAsIHZhbDEsIHZhbDI7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMFsxNl0gPSB7MCwxLCA4LDksIDE2LDE3LCAyLDMsIDEwLDExLCAxOCwxOSwgNCw1LCAxMiwxM307CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMVsxNl0gPSB7MjAsMjEsIDYsNywgMTQsMTUsIDIyLDIzLCAgIDAsMCwwLDAsMCwwLDAsMH07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQxNl90IG1hc2swZls4XSA9IHsweGZmZmYsIDB4ZmZmZiwgMCwgMHhmZmZmLCAweGZmZmYsIDAsIDB4ZmZmZiwgMHhmZmZmfTsgLy9pZiBhbGwgb25lcyB3ZSB0YWtlIHRoZSByZXN1bHQgZnJvbSB2LnZhbFswXSAgb3RoZXJ3aXNlIGZyb20gdi52YWxbMV0KKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDE2X3QgbWFzazFmWzhdID0gezB4ZmZmZiwgMCwgMCwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9OyAvL2lmIGFsbCBvbmVzIHdlIHRha2UgdGhlIHJlc3VsdCBmcm9tIHYudmFsWzFdICBvdGhlcndpc2UgZnJvbSB2LnZhbFswXQorICAgIHRtcCA9IF9tbV91bnBhY2tsb19lcGk2NChfcE0xMjhpKHZhbC0+dmFsWzBdKSwgX3BNMTI4aSh2YWwtPnZhbFsxXSkpOworICAgIHZhbDAgPSBfbW1fc2h1ZmZsZV9lcGk4KHRtcCwgKihfX20xMjhpKiltYXNrMCk7CisgICAgdmFsMiA9IF9wTTEyOGkodmFsLT52YWxbMl0pOworICAgIHZhbDEgPSBfbW1fc2h1ZmZsZV9lcGk4KHZhbDIsICooX19tMTI4aSopbWFzazApOworICAgIHZhbDAgPSBfTU1fQkxFTkRWX0VQSTgodmFsMSwgdmFsMCwgKihfX20xMjhpKiltYXNrMGYpOworICAgIHZzdDFxX3UxNihwdHIsICAgIHZhbDApOyAvL3N0b3JlIGFzIDEyOCBiaXQgc3RydWN0dXJlCisgICAgdmFsMCA9IF9tbV9zaHVmZmxlX2VwaTgodG1wLCAqKF9fbTEyOGkqKW1hc2sxKTsKKyAgICB2YWwxID0gX21tX3NodWZmbGVfZXBpOCh2YWwyLCAqKF9fbTEyOGkqKW1hc2sxKTsKKyAgICB2YWwxID0gX01NX0JMRU5EVl9FUEk4KHZhbDAsIHZhbDEsICAqKF9fbTEyOGkqKW1hc2sxZik7IC8vY2hhbmdlIHRoZSBvcGVyYW5kcyBvcmRlcgorICAgIF9NNjQoKCooX19tNjRfMTI4KikocHRyICsgOCkpLCAgdmFsMSk7IC8vbmVlZCBpdCB0byBmaXQgaW50byAqcHRyIG1lbW9yeQorfQorI2RlZmluZSB2c3QzX3UxNihwdHIsIHZhbCkgdnN0M191MTZfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDNfdTMyKF9fdHJhbnNmZXJzaXplKDYpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4MngzX3QgdmFsKS8vIFZTVDMuMzIge2QwLCBkMSwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0M191MzJfcHRyKF9fdHJhbnNmZXJzaXplKDYpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4MngzX3QqIHZhbCkKK3sKKyAgICAvL3ZhbC0+dmFsWzBdOjAsMyx2YWwtPnZhbFsxXToxLDQ7IHZhbC0+dmFsWzJdOjIsNSx4LHg7CisgICAgX19tMTI4aSB2YWwwLCB2YWwxOworICAgIHZhbDAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoX3BNMTI4aSh2YWwtPnZhbFsxXSksIF9wTTEyOGkodmFsLT52YWxbMl0pKTsgLy92YWxbMF06IDEsNCwyLDUKKyAgICB2YWwwID0gX21tX3NodWZmbGVfZXBpMzIodmFsMCwgMCB8ICgyIDw8IDIpIHwgKDEgPDwgNCkgfCAoMyA8PCA2KSk7IC8vMSwyLDQsNQorICAgIHZhbDEgPSBfbW1fc3JsaV9zaTEyOCh2YWwwLCA4KTsgLy80LDUsIHgseAorICAgIF9NNjQoKCooX19tNjRfMTI4KikocHRyICsgNCkpLCAgdmFsMSk7CisgICAgdmFsMCA9IF9tbV91bnBhY2tsb19lcGkzMihfcE0xMjhpKHZhbC0+dmFsWzBdKSwgdmFsMCk7IC8vMCwxLDMsMgorICAgIHZhbDAgPSBfbW1fc2h1ZmZsZV9lcGkzMih2YWwwLCAwIHwgKDEgPDwgMikgfCAoMyA8PCA0KSB8ICgyIDw8IDYpKTsgLy8wLDEsMiwgMworICAgIHZzdDFxX3UzMihwdHIsIHZhbDApOyAvL3N0b3JlIGFzIDEyOCBiaXQgc3RydWN0dXJlCit9CisjZGVmaW5lIHZzdDNfdTMyKHB0ciwgdmFsKSB2c3QzX3UzMl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0M191NjQoX190cmFuc2ZlcnNpemUoMykgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgxeDNfdCB2YWwpLy8gVlNUMS42NCB7ZDAsIGQxLCBkMn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QzX3U2NF9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgxeDNfdCogdmFsKQoreworICAgICoocHRyKSA9IHZhbC0+dmFsWzBdLm02NF91NjRbMF07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF91NjRbMF07CisgICAgKihwdHIgKyAyKSA9IHZhbC0+dmFsWzJdLm02NF91NjRbMF07Cit9CisjZGVmaW5lIHZzdDNfdTY0KHB0ciwgdmFsKSB2c3QzX3U2NF9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0M19zOChfX3RyYW5zZmVyc2l6ZSgyNCkgaW50OF90ICogcHRyLCBpbnQ4eDh4M190IHZhbCkgIC8vIFZTVDMuOCB7ZDAsIGQxLCBkMn0sIFtyMF0KKyNkZWZpbmUgdnN0M19zOChwdHIsIHZhbCkgdnN0M191OF9wdHIoKHVpbnQ4X3QqKXB0ciwgJnZhbCkKKworLy92b2lkIHZzdDNfczE2KF9fdHJhbnNmZXJzaXplKDEyKSBpbnQxNl90ICogcHRyLCBpbnQxNng0eDNfdCB2YWwpICAvLyBWU1QzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQorI2RlZmluZSB2c3QzX3MxNihwdHIsIHZhbCkgdnN0M191MTZfcHRyKCh1aW50MTZfdCopcHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0M19zMzIoX190cmFuc2ZlcnNpemUoNikgaW50MzJfdCAqIHB0ciwgaW50MzJ4MngzX3QgdmFsKTsgLy8gVlNUMy4zMiB7ZDAsIGQxLCBkMn0sIFtyMF0KKyNkZWZpbmUgdnN0M19zMzIocHRyLCB2YWwpIHZzdDNfdTMyX3B0cigodWludDMyX3QqKXB0ciwgJnZhbCkKKworLy92b2lkIHZzdDNfczY0KF9fdHJhbnNmZXJzaXplKDMpIGludDY0X3QgKiBwdHIsIGludDY0eDF4M190IHZhbCkgLy8gVlNUMS42NCB7ZDAsIGQxLCBkMn0sIFtyMF0KKyNkZWZpbmUgdnN0M19zNjQocHRyLCB2YWwpIHZzdDNfdTY0X3B0cigodWludDY0X3QqKXB0ciwgJnZhbCkKKworLy92b2lkIHZzdDNfZjE2KF9fdHJhbnNmZXJzaXplKDEyKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NHgzX3QgdmFsKTsvLyBWU1QzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQordm9pZCB2c3QzX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMTIpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0eDNfdCAqIHZhbCk7IC8vIFZTVDMuMTYge2QwLCBkMSwgZDJ9LCBbcjBdCisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseSwgc28gbmVlZCB0byBnbyB0byAzMiBiaXQgYW5kIHRoZW4gd29yayB3aXRoIHR3byAxMjhiaXQgcmVnaXN0ZXJzLiBTZWUgdmxkMXFfZjE2IGZvciBleGFtcGxlCisKKy8vdm9pZCB2c3QzX2YzMihfX3RyYW5zZmVyc2l6ZSg2KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4MngzX3QgdmFsKS8vIFZTVDMuMzIge2QwLCBkMSwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0M19mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDYpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMngyeDNfdCogdmFsKQoreworICAgIC8vdmFsLT52YWxbMF06MCwzLHZhbC0+dmFsWzFdOjEsNDsgdmFsLT52YWxbMl06Miw1LHgseDsgICAtPiAwLDIsIDQsMSwgMyw1CisgICAgKihwdHIpID0gICB2YWwtPnZhbFswXS5tNjRfZjMyWzBdOworICAgICoocHRyICsgMSkgPSB2YWwtPnZhbFsxXS5tNjRfZjMyWzBdOworICAgICoocHRyICsgMikgPSB2YWwtPnZhbFsyXS5tNjRfZjMyWzBdOworICAgICoocHRyICsgMykgPSB2YWwtPnZhbFswXS5tNjRfZjMyWzFdOworICAgICoocHRyICsgNCkgPSB2YWwtPnZhbFsxXS5tNjRfZjMyWzFdOworICAgICoocHRyICsgNSkgPSB2YWwtPnZhbFsyXS5tNjRfZjMyWzFdOworfQorI2RlZmluZSB2c3QzX2YzMihwdHIsIHZhbCkgdnN0M19mMzJfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDNfcDgoX190cmFuc2ZlcnNpemUoMjQpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDh4M190IHZhbCk7Ly8gVlNUMy44IHtkMCwgZDEsIGQyfSwgW3IwXQordm9pZCB2c3QzX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSgyNCkgcG9seThfdCAqIHB0ciwgcG9seTh4OHgzX3QgKiB2YWwpOworI2RlZmluZSB2c3QzX3A4IHZzdDNfdTgKKworLy92b2lkIHZzdDNfcDE2KF9fdHJhbnNmZXJzaXplKDEyKSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDR4M190IHZhbCk7Ly8gVlNUMy4xNiB7ZDAsIGQxLCBkMn0sIFtyMF0KK3ZvaWQgdnN0M19wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDEyKSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDR4M190ICogdmFsKTsKKyNkZWZpbmUgdnN0M19wMTYgdnN0M19zMTYKKworLy8qKioqKioqKioqKioqKiogIFF1YWRydXBsZXMgc3RvcmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL3ZvaWQgdnN0NHFfdTgoX190cmFuc2ZlcnNpemUoNjQpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDE2eDRfdCB2YWwpLy8gVlNUNC44IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3Q0cV91OF9wdHIoX190cmFuc2ZlcnNpemUoNjQpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDE2eDRfdCogdmFsKQoreworICAgIF9fbTEyOGkgdG1wMSwgdG1wMiwgcmVzOworICAgIHRtcDEgPSBfbW1fdW5wYWNrbG9fZXBpOCh2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOyAvLyAgMCwxLCA0LDUsIDgsOSwgMTIsMTMsIDE2LDE3LCAyMCwyMSwgMjQsMjUsIDI4LDI5CisgICAgdG1wMiA9IF9tbV91bnBhY2tsb19lcGk4KHZhbC0+dmFsWzJdLCB2YWwtPnZhbFszXSk7IC8vICAyLDMsIDYsNywgMTAsMTEsIDE0LDE1LCAxOCwxOSwgMjIsMjMsIDI2LDI3LCAzMCwzMQorICAgIHJlcyA9IF9tbV91bnBhY2tsb19lcGkxNih0bXAxLCB0bXAyKTsgLy8wLDEsIDIsMywgNCw1LCA2LDcsIDgsOSwgMTAsMTEsIDEyLDEzLCAxNCwxNQorICAgIHZzdDFxX3U4KHB0ciwgIHJlcyk7CisgICAgcmVzID0gX21tX3VucGFja2hpX2VwaTE2KHRtcDEsIHRtcDIpOyAvLzE2LDE3LCAxOCwxOSwgMjAsMjEsIDIyLDIzLCAyNCwyNSwgMjYsMjcsIDI4LDI5LCAzMCwzMQorICAgIHZzdDFxX3U4KChwdHIgKyAxNiksIHJlcyk7CisgICAgdG1wMSA9IF9tbV91bnBhY2toaV9lcGk4KHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7IC8vCisgICAgdG1wMiA9IF9tbV91bnBhY2toaV9lcGk4KHZhbC0+dmFsWzJdLCB2YWwtPnZhbFszXSk7IC8vCisgICAgcmVzID0gX21tX3VucGFja2xvX2VwaTE2KHRtcDEsIHRtcDIpOyAvLworICAgIHZzdDFxX3U4KChwdHIgKyAzMiksIHJlcyk7CisgICAgcmVzID0gX21tX3VucGFja2hpX2VwaTE2KHRtcDEsIHRtcDIpOyAvLworICAgIHZzdDFxX3U4KChwdHIgKyA0OCksIHJlcyk7Cit9CisjZGVmaW5lIHZzdDRxX3U4KHB0ciwgdmFsKSB2c3Q0cV91OF9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0NHFfdTE2KF9fdHJhbnNmZXJzaXplKDMyKSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDh4NF90IHZhbCkvLyBWU1Q0LjE2IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3Q0cV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDh4NF90KiB2YWwpCit7CisgICAgdWludDE2eDh4NF90IHY7CisgICAgX19tMTI4aSB0bXAxLCB0bXAyOworICAgIHRtcDEgPSBfbW1fdW5wYWNrbG9fZXBpMTYodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsgLy8wLDEsIDQsNSwgOCw5LCAxMiwxMworICAgIHRtcDIgPSBfbW1fdW5wYWNrbG9fZXBpMTYodmFsLT52YWxbMl0sIHZhbC0+dmFsWzNdKTsgLy8yLDMsIDYsNyAsIDEwLDExLCAxNCwxNQorICAgIHYudmFsWzBdID0gX21tX3VucGFja2xvX2VwaTMyKHRtcDEsIHRtcDIpOworICAgIHYudmFsWzFdID0gX21tX3VucGFja2hpX2VwaTMyKHRtcDEsIHRtcDIpOworICAgIHRtcDEgPSBfbW1fdW5wYWNraGlfZXBpMTYodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsgLy8wLDEsIDQsNSwgOCw5LCAxMiwxMworICAgIHRtcDIgPSBfbW1fdW5wYWNraGlfZXBpMTYodmFsLT52YWxbMl0sIHZhbC0+dmFsWzNdKTsgLy8yLDMsIDYsNyAsIDEwLDExLCAxNCwxNQorICAgIHYudmFsWzJdID0gX21tX3VucGFja2xvX2VwaTMyKHRtcDEsIHRtcDIpOworICAgIHYudmFsWzNdID0gX21tX3VucGFja2hpX2VwaTMyKHRtcDEsIHRtcDIpOworICAgIHZzdDFxX3UxNihwdHIsICAgICB2LnZhbFswXSk7CisgICAgdnN0MXFfdTE2KChwdHIgKyA4KSwgdi52YWxbMV0pOworICAgIHZzdDFxX3UxNigocHRyICsgMTYpLHYudmFsWzJdKTsKKyAgICB2c3QxcV91MTYoKHB0ciArIDI0KSwgdi52YWxbM10pOworfQorI2RlZmluZSB2c3Q0cV91MTYocHRyLCB2YWwpIHZzdDRxX3UxNl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0NHFfdTMyKF9fdHJhbnNmZXJzaXplKDE2KSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDR4NF90IHZhbCkvLyBWU1Q0LjMyIHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3Q0cV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDR4NF90KiB2YWwpCit7CisgICAgdWludDE2eDh4NF90IHY7CisgICAgX19tMTI4aSB0bXAxLCB0bXAyOworICAgIHRtcDEgPSBfbW1fdW5wYWNrbG9fZXBpMzIodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsgLy8wLDEsIDQsNSwgOCw5LCAxMiwxMworICAgIHRtcDIgPSBfbW1fdW5wYWNrbG9fZXBpMzIodmFsLT52YWxbMl0sIHZhbC0+dmFsWzNdKTsgLy8yLDMsIDYsNyAsIDEwLDExLCAxNCwxNQorICAgIHYudmFsWzBdID0gX21tX3VucGFja2xvX2VwaTY0KHRtcDEsIHRtcDIpOworICAgIHYudmFsWzFdID0gX21tX3VucGFja2hpX2VwaTY0KHRtcDEsIHRtcDIpOworICAgIHRtcDEgPSBfbW1fdW5wYWNraGlfZXBpMzIodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsgLy8wLDEsIDQsNSwgOCw5LCAxMiwxMworICAgIHRtcDIgPSBfbW1fdW5wYWNraGlfZXBpMzIodmFsLT52YWxbMl0sIHZhbC0+dmFsWzNdKTsgLy8yLDMsIDYsNyAsIDEwLDExLCAxNCwxNQorICAgIHYudmFsWzJdID0gX21tX3VucGFja2xvX2VwaTY0KHRtcDEsIHRtcDIpOworICAgIHYudmFsWzNdID0gX21tX3VucGFja2hpX2VwaTY0KHRtcDEsIHRtcDIpOworICAgIHZzdDFxX3UzMihwdHIsICAgICAgdi52YWxbMF0pOworICAgIHZzdDFxX3UzMigocHRyICsgNCksICB2LnZhbFsxXSk7CisgICAgdnN0MXFfdTMyKChwdHIgKyA4KSwgIHYudmFsWzJdKTsKKyAgICB2c3QxcV91MzIoKHB0ciArIDEyKSwgdi52YWxbM10pOworfQorI2RlZmluZSB2c3Q0cV91MzIocHRyLCB2YWwpIHZzdDRxX3UzMl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0NHFfczgoX190cmFuc2ZlcnNpemUoNjQpIGludDhfdCAqIHB0ciwgaW50OHgxNng0X3QgdmFsKTsKK3ZvaWQgdnN0NHFfczhfcHRyKF9fdHJhbnNmZXJzaXplKDY0KSBpbnQ4X3QgKiBwdHIsIGludDh4MTZ4NF90ICogdmFsKTsKKyNkZWZpbmUgdnN0NHFfczgocHRyLCB2YWwpIHZzdDRxX3U4KCh1aW50OF90KikocHRyKSwgdmFsKQorCisvL3ZvaWQgdnN0NHFfczE2KF9fdHJhbnNmZXJzaXplKDMyKSBpbnQxNl90ICogcHRyLCBpbnQxNng4eDRfdCB2YWwpOwordm9pZCB2c3Q0cV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSBpbnQxNl90ICogcHRyLCBpbnQxNng4eDRfdCAqIHZhbCk7CisjZGVmaW5lIHZzdDRxX3MxNihwdHIsIHZhbCkgdnN0NHFfdTE2KCh1aW50MTZfdCopKHB0ciksIHZhbCkKKworLy92b2lkIHZzdDRxX3MzMihfX3RyYW5zZmVyc2l6ZSgxNikgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHg0X3QgdmFsKTsKK3ZvaWQgdnN0NHFfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHg0X3QgKiB2YWwpOworI2RlZmluZSB2c3Q0cV9zMzIocHRyLCB2YWwpIHZzdDRxX3UzMigodWludDMyX3QqKShwdHIpLCB2YWwpCisKKy8vdm9pZCB2c3Q0cV9mMTYoX190cmFuc2ZlcnNpemUoMzIpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4eDRfdCB2YWwpOy8vIFZTVDQuMTYge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQordm9pZCB2c3Q0cV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHg0X3QgKiB2YWwpOworLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHkKKworLy92b2lkIHZzdDRxX2YzMihfX3RyYW5zZmVyc2l6ZSgxNikgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDR4NF90IHZhbCkvLyBWU1Q0LjMyIHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3Q0cV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NHg0X3QqIHZhbCkKK3sKKyAgICBfX20xMjggdG1wMywgdG1wMiwgdG1wMSwgdG1wMDsKKyAgICBmbG9hdDMyeDR4NF90IHY7CisgICAgdG1wMCA9IF9tbV91bnBhY2tsb19wcyh2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOworICAgIHRtcDIgPSBfbW1fdW5wYWNrbG9fcHModmFsLT52YWxbMl0sIHZhbC0+dmFsWzNdKTsKKyAgICB0bXAxID0gX21tX3VucGFja2hpX3BzKHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7CisgICAgdG1wMyA9IF9tbV91bnBhY2toaV9wcyh2YWwtPnZhbFsyXSwgdmFsLT52YWxbM10pOworICAgIHYudmFsWzBdID0gX21tX21vdmVsaF9wcyh0bXAwLCB0bXAyKTsKKyAgICB2LnZhbFsxXSA9IF9tbV9tb3ZlaGxfcHModG1wMiwgdG1wMCk7CisgICAgdi52YWxbMl0gPSBfbW1fbW92ZWxoX3BzKHRtcDEsIHRtcDMpOworICAgIHYudmFsWzNdID0gX21tX21vdmVobF9wcyh0bXAzLCB0bXAxKTsKKyAgICB2c3QxcV9mMzIocHRyLCAgIHYudmFsWzBdKTsKKyAgICB2c3QxcV9mMzIoKHB0ciArIDQpLCB2LnZhbFsxXSk7CisgICAgdnN0MXFfZjMyKChwdHIgKyA4KSwgdi52YWxbMl0pOworICAgIHZzdDFxX2YzMigocHRyICsgMTIpLCB2LnZhbFszXSk7Cit9CisjZGVmaW5lIHZzdDRxX2YzMihwdHIsIHZhbCkgdnN0NHFfZjMyX3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3Q0cV9wOChfX3RyYW5zZmVyc2l6ZSg2NCkgcG9seThfdCAqIHB0ciwgcG9seTh4MTZ4NF90IHZhbCk7Ly8gVlNUNC44IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK3ZvaWQgdnN0NHFfcDhfcHRyKF9fdHJhbnNmZXJzaXplKDY0KSBwb2x5OF90ICogcHRyLCBwb2x5OHgxNng0X3QgKiB2YWwpOworI2RlZmluZSB2c3Q0cV9wOCB2c3Q0cV91OAorCisvL3ZvaWQgdnN0NHFfcDE2KF9fdHJhbnNmZXJzaXplKDMyKSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDh4NF90IHZhbCk7Ly8gVlNUNC4xNiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit2b2lkIHZzdDRxX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMzIpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHg0X3QgKiB2YWwpOworI2RlZmluZSB2c3Q0cV9wMTYgdnN0NHFfczE2CisKKy8vdm9pZCB2c3Q0X3U4KF9fdHJhbnNmZXJzaXplKDMyKSB1aW50OF90ICogcHRyLCB1aW50OHg4eDRfdCB2YWwpLy8gVlNUNC44IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3Q0X3U4X3B0cihfX3RyYW5zZmVyc2l6ZSgzMikgdWludDhfdCAqIHB0ciwgdWludDh4OHg0X3QqIHZhbCkKK3sKKyAgICBfX20xMjhpIHNoMCwgc2gxLCB2YWwwLCB2YWwyOworICAgIHNoMCA9IF9tbV91bnBhY2tsb19lcGk4KF9wTTEyOGkodmFsLT52YWxbMF0pLF9wTTEyOGkodmFsLT52YWxbMV0pKTsgLy8gYTAsYjAsYTEsYjEsYTIsYjIsYTMsYjMsYTQsYjQsYTUsYjUsIGE2LGI2LGE3LGI3LAorICAgIHNoMSA9IF9tbV91bnBhY2tsb19lcGk4KF9wTTEyOGkodmFsLT52YWxbMl0pLF9wTTEyOGkodmFsLT52YWxbM10pKTsgLy8gYzAsZDAsYzEsZDEsYzIsZDIsYzMsZDMsIGM0LGQ0LGM1LGQ1LGM2LGQ2LGM3LGQ3CisgICAgdmFsMCA9IF9tbV91bnBhY2tsb19lcGkxNihzaDAsc2gxKTsgLy8gYTAsYjAsYzAsZDAsYTEsYjEsYzEsZDEsYTIsYjIsYzIsZDIsYTMsYjMsYzMsZDMsCisgICAgdmFsMiA9IF9tbV91bnBhY2toaV9lcGkxNihzaDAsc2gxKTsgLy9hNCxiNCxjNCxkNCxhNSxiNSxjNSxkNSwgYTYsYjYsYzYsZDYsYTcsYjcsYzcsZDcKKyAgICB2c3QxcV91OChwdHIsICAgIHZhbDApOworICAgIHZzdDFxX3U4KChwdHIgKyAxNiksICB2YWwyKTsKK30KKyNkZWZpbmUgdnN0NF91OChwdHIsIHZhbCkgdnN0NF91OF9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0NF91MTYoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHg0X3QgdmFsKS8vIFZTVDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDRfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0eDRfdCogdmFsKQoreworICAgIF9fbTEyOGkgc2gwLCBzaDEsIHZhbDAsIHZhbDI7CisgICAgc2gwID0gX21tX3VucGFja2xvX2VwaTE2KF9wTTEyOGkodmFsLT52YWxbMF0pLF9wTTEyOGkodmFsLT52YWxbMV0pKTsgLy9hMCxhMSxiMCxiMSxjMCxjMSxkMCxkMSwKKyAgICBzaDEgPSBfbW1fdW5wYWNrbG9fZXBpMTYoX3BNMTI4aSh2YWwtPnZhbFsyXSksX3BNMTI4aSh2YWwtPnZhbFszXSkpOyAvL2EyLGEzLGIyLGIzLGMyLGMzLGQyLGQzCisgICAgdmFsMCA9IF9tbV91bnBhY2tsb19lcGkzMihzaDAsc2gxKTsgLy8gYTAsYTEsYTIsYTMsYjAsYjEsYjIsYjMKKyAgICB2YWwyID0gX21tX3VucGFja2hpX2VwaTMyKHNoMCxzaDEpOyAvLyBjMCxjMSxjMixjMyxkMCxkMSxkMixkMworICAgIHZzdDFxX3UxNihwdHIsICAgICAgdmFsMCk7IC8vc3RvcmUgYXMgMTI4IGJpdCBzdHJ1Y3R1cmUKKyAgICB2c3QxcV91MTYoKHB0ciArIDgpLCAgdmFsMik7Cit9CisjZGVmaW5lIHZzdDRfdTE2KHB0ciwgdmFsKSB2c3Q0X3UxNl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0NF91MzIoX190cmFuc2ZlcnNpemUoOCkgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyeDRfdCB2YWwpLy8gVlNUNC4zMiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0NF91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDgpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4Mng0X3QqIHZhbCkKK3sKKyAgICAvLzAsNCwgICAxLDUsICAyLDYsICAzLDcKKyAgICBfX20xMjhpIHNoMCwgc2gxLCB2YWwwLCB2YWwxOworICAgIHNoMCA9IF9tbV91bnBhY2tsb19lcGkzMihfcE0xMjhpKHZhbC0+dmFsWzBdKSwgX3BNMTI4aSh2YWwtPnZhbFsxXSkpOyAvLzAsMSw0LDUKKyAgICBzaDEgPSBfbW1fdW5wYWNrbG9fZXBpMzIoX3BNMTI4aSh2YWwtPnZhbFsyXSksIF9wTTEyOGkodmFsLT52YWxbM10pKTsgLy8yLDMsNiw3CisgICAgdmFsMCA9IF9tbV91bnBhY2tsb19lcGk2NChzaDAsc2gxKTsgLy8KKyAgICB2YWwxID0gX21tX3VucGFja2hpX2VwaTY0KHNoMCxzaDEpOyAvLworICAgIHZzdDFxX3UzMihwdHIsICAgICB2YWwwKTsgLy9zdG9yZSBhcyAxMjggYml0IHN0cnVjdHVyZQorICAgIHZzdDFxX3UzMigocHRyICsgNCksICB2YWwxKTsKK30KKyNkZWZpbmUgdnN0NF91MzIocHRyLCB2YWwpIHZzdDRfdTMyX3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3Q0X3U2NChfX3RyYW5zZmVyc2l6ZSg0KSB1aW50NjRfdCAqIHB0ciwgdWludDY0eDF4NF90IHZhbCkvLyBWU1QxLjY0IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3Q0X3U2NF9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgxeDRfdCogdmFsKQoreworICAgICoocHRyKSA9ICB2YWwtPnZhbFswXS5tNjRfdTY0WzBdOworICAgICoocHRyICsgMSkgPSAgdmFsLT52YWxbMV0ubTY0X3U2NFswXTsKKyAgICAqKHB0ciArIDIpID0gIHZhbC0+dmFsWzJdLm02NF91NjRbMF07CisgICAgKihwdHIgKyAzKSA9ICB2YWwtPnZhbFszXS5tNjRfdTY0WzBdOworfQorI2RlZmluZSB2c3Q0X3U2NChwdHIsIHZhbCkgdnN0NF91NjRfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDRfczgoX190cmFuc2ZlcnNpemUoMzIpIGludDhfdCAqIHB0ciwgaW50OHg4eDRfdCB2YWwpICAvL1ZTVDQuOCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCisjZGVmaW5lIHZzdDRfczgocHRyLCB2YWwpIHZzdDRfdTgoKHVpbnQ4X3QqKXB0ciwgdmFsKQorCisvL3ZvaWQgdnN0NF9zMTYoX190cmFuc2ZlcnNpemUoMTYpIGludDE2X3QgKiBwdHIsIGludDE2eDR4NF90IHZhbCkgIC8vIFZTVDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorI2RlZmluZSB2c3Q0X3MxNihwdHIsIHZhbCkgdnN0NF91MTYoKHVpbnQxNl90KilwdHIsIHZhbCkKKworLy92b2lkIHZzdDRfczMyKF9fdHJhbnNmZXJzaXplKDgpIGludDMyX3QgKiBwdHIsIGludDMyeDJ4NF90IHZhbCkgLy8gVlNUNC4zMiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCisjZGVmaW5lIHZzdDRfczMyKHB0ciwgdmFsKSB2c3Q0X3UzMigodWludDMyX3QqKXB0ciwgdmFsKQorCisvL3ZvaWQgdnN0NF9zNjQoX190cmFuc2ZlcnNpemUoNCkgaW50NjRfdCAqIHB0ciwgaW50NjR4MXg0X3QgdmFsKTsgLy8gVlNUMS42NCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit2b2lkIHZzdDRfczY0X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQ2NF90ICogcHRyLCBpbnQ2NHgxeDRfdCAqIHZhbCk7CisjZGVmaW5lIHZzdDRfczY0KHB0ciwgdmFsKSB2c3Q0X3U2NCgodWludDY0X3QqKXB0ciwgdmFsKQorCisvL3ZvaWQgdnN0NF9mMTYoX190cmFuc2ZlcnNpemUoMTYpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0eDRfdCB2YWwpOy8vIFZTVDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQordm9pZCB2c3Q0X2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0eDRfdCAqIHZhbCk7CisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseSwgc28gbmVlZCB0byBnbyB0byAzMiBiaXQgYW5kIHRoZW4gd29yayB3aXRoIHR3byAxMjhiaXQgcmVnaXN0ZXJzLiBTZWUgdmxkMXFfZjE2IGZvciBleGFtcGxlCisKKy8vdm9pZCB2c3Q0X2YzMihfX3RyYW5zZmVyc2l6ZSg4KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4Mng0X3QgdmFsKS8vIFZTVDQuMzIge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDRfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg4KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4Mng0X3QqIHZhbCkKK3sKKyAgICAvLzAsNCwgICAxLDUsICAyLDYsICAzLDcgLT4gMCwxLCAyLDMsIDQsNSwgNiw3CisgICAgKihwdHIpID0gICB2YWwtPnZhbFswXS5tNjRfZjMyWzBdOworICAgICoocHRyICsgMSkgPSB2YWwtPnZhbFsxXS5tNjRfZjMyWzBdOworICAgICoocHRyICsgMikgPSB2YWwtPnZhbFsyXS5tNjRfZjMyWzBdOworICAgICoocHRyICsgMykgPSB2YWwtPnZhbFszXS5tNjRfZjMyWzBdOworICAgICoocHRyICsgNCkgPSB2YWwtPnZhbFswXS5tNjRfZjMyWzFdOworICAgICoocHRyICsgNSkgPSB2YWwtPnZhbFsxXS5tNjRfZjMyWzFdOworICAgICoocHRyICsgNikgPSB2YWwtPnZhbFsyXS5tNjRfZjMyWzFdOworICAgICoocHRyICsgNykgPSB2YWwtPnZhbFszXS5tNjRfZjMyWzFdOworfQorI2RlZmluZSB2c3Q0X2YzMihwdHIsIHZhbCkgdnN0NF9mMzJfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDRfcDgoX190cmFuc2ZlcnNpemUoMzIpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDh4NF90IHZhbCk7Ly8gVlNUNC44IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3ZvaWQgdnN0NF9wOF9wdHIoX190cmFuc2ZlcnNpemUoMzIpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDh4NF90ICogdmFsKTsKKyNkZWZpbmUgdnN0NF9wOCB2c3Q0X3U4CisKKy8vdm9pZCB2c3Q0X3AxNihfX3RyYW5zZmVyc2l6ZSgxNikgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0eDRfdCB2YWwpOy8vIFZTVDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQordm9pZCB2c3Q0X3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4NHg0X3QgKiB2YWwpOworI2RlZmluZSB2c3Q0X3AxNiB2c3Q0X3UxNgorCisvLyoqKioqKioqKioqIFN0b3JlIGEgbGFuZSBvZiBhIHZlY3RvciBpbnRvIG1lbW9yeSAoZXh0cmFjdCBnaXZlbiBsYW5lKSBmb3IgYSBjb3VwbGUgb2YgdmVjdG9ycyAgKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL3ZvaWQgdnN0MnFfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoMikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4eDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKS8vIFZTVDIuMTYge2QwWzBdLCBkMlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QycV9sYW5lX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4eDJfdCogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkKK3sKKyAgICB2c3QxcV9sYW5lX3MxNihwdHIsIHZhbC0+dmFsWzBdLCBsYW5lKTsKKyAgICB2c3QxcV9sYW5lX3MxNigocHRyICsgMSksIHZhbC0+dmFsWzFdLCBsYW5lKTsKK30KKyNkZWZpbmUgdnN0MnFfbGFuZV91MTYocHRyLCB2YWwsIGxhbmUpIHZzdDJxX2xhbmVfdTE2X3B0cihwdHIsICZ2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3QycV9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDR4Ml90IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpLy8gVlNUMi4zMiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDJxX2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MzJfdCogcHRyLCB1aW50MzJ4NHgyX3QqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgdnN0MXFfbGFuZV91MzIocHRyLCB2YWwtPnZhbFswXSwgbGFuZSk7CisgICAgdnN0MXFfbGFuZV91MzIoKHB0ciArIDEpLCB2YWwtPnZhbFsxXSwgbGFuZSk7Cit9CisjZGVmaW5lIHZzdDJxX2xhbmVfdTMyKHB0ciwgdmFsLCBsYW5lKSB2c3QycV9sYW5lX3UzMl9wdHIocHRyLCAmdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0MnFfbGFuZV9zMTYoX190cmFuc2ZlcnNpemUoMikgaW50MTZfdCAqIHB0ciwgaW50MTZ4OHgyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVlNUMi4xNiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QycV9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50MTZfdCAqIHB0ciwgaW50MTZ4OHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0MnFfbGFuZV9zMTYocHRyLCB2YWwsIGxhbmUpIHZzdDJxX2xhbmVfdTE2KCh1aW50MTZfdCopcHRyLCB2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3QycV9sYW5lX3MzMihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQzMl90ICogcHRyLCBpbnQzMng0eDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsvLyBWU1QyLjMyIHtkMFswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDJxX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQzMl90ICogcHRyLCBpbnQzMng0eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOworI2RlZmluZSB2c3QycV9sYW5lX3MzMihwdHIsIHZhbCwgbGFuZSkgIHZzdDJxX2xhbmVfdTMyKCh1aW50MzJfdCopcHRyLCB2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3QycV9sYW5lX2YxNihfX3RyYW5zZmVyc2l6ZSgyKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHgyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVlNUMi4xNiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QycV9sYW5lX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgX19mcDE2ICogcHRyLCBmbG9hdDE2eDh4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7CisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCisvL3ZvaWQgdnN0MnFfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMikgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDR4Ml90IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpLy8gVlNUMi4zMiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDJxX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QqIHB0ciwgZmxvYXQzMng0eDJfdCogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkKK3sKKyAgICB2c3QxcV9sYW5lX2YzMihwdHIsIHZhbC0+dmFsWzBdLCBsYW5lKTsKKyAgICB2c3QxcV9sYW5lX2YzMigocHRyICsgMSksIHZhbC0+dmFsWzFdLCBsYW5lKTsKK30KKyNkZWZpbmUgdnN0MnFfbGFuZV9mMzIocHRyLHNyYyxsYW5lKSB2c3QycV9sYW5lX2YzMl9wdHIocHRyLCZzcmMsbGFuZSkKKworLy92b2lkIHZzdDJxX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDIpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHgyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVlNUMi4xNiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QycV9sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOworI2RlZmluZSB2c3QycV9sYW5lX3AxNiB2c3QycV9sYW5lX3MxNgorCisvL3ZvaWQgdnN0Ml9sYW5lX3U4KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4Ml90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZTVDIuOCB7ZDBbMF0sIGQxWzBdfSwgW3IwXQordm9pZCB2c3QyX2xhbmVfdThfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDIuOCB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDJfbGFuZV91OF9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDhfdCAqIHB0ciwgdWludDh4OHgyX3QqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpIC8vIFZTVDIuOCB7ZDBbMF0sIGQxWzBdfSwgW3IwXQoreworICAgICoocHRyKSA9IHZhbC0+dmFsWzBdLm02NF91OFtsYW5lXTsKKyAgICAqKHB0ciArIDEpID0gdmFsLT52YWxbMV0ubTY0X3U4W2xhbmVdOworfQorI2RlZmluZSB2c3QyX2xhbmVfdTgocHRyLCB2YWwsIGxhbmUpIHZzdDJfbGFuZV91OF9wdHIocHRyLCAmdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0Ml9sYW5lX3UxNihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDR4Ml90IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOy8vIFZTVDIuMTYge2QwWzBdLCBkMVswXX0sIFtyMF0KK3ZvaWQgdnN0Ml9sYW5lX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1QyLjE2IHtkMFswXSwgZDFbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0Ml9sYW5lX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgKihwdHIpID0gdmFsLT52YWxbMF0ubTY0X3UxNltsYW5lXTsKKyAgICAqKHB0ciArIDEpID0gdmFsLT52YWxbMV0ubTY0X3UxNltsYW5lXTsKK30KKyNkZWZpbmUgdnN0Ml9sYW5lX3UxNihwdHIsIHZhbCwgbGFuZSkgdnN0Ml9sYW5lX3UxNl9wdHIocHRyLCAmdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0Ml9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDJ4Ml90IHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOy8vIFZTVDIuMzIge2QwWzBdLCBkMVswXX0sIFtyMF0KK3ZvaWQgdnN0Ml9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyeDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWU1QyLjMyIHtkMFswXSwgZDFbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0Ml9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyeDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpCit7CisgICAgKihwdHIpID0gdmFsLT52YWxbMF0ubTY0X3UzMltsYW5lXTsKKyAgICAqKHB0ciArIDEpID0gdmFsLT52YWxbMV0ubTY0X3UzMltsYW5lXTsKK30KKyNkZWZpbmUgdnN0Ml9sYW5lX3UzMihwdHIsIHZhbCwgbGFuZSkgdnN0Ml9sYW5lX3UzMl9wdHIocHRyLCAmdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0Ml9sYW5lX3M4KF9fdHJhbnNmZXJzaXplKDIpIGludDhfdCAqIHB0ciwgaW50OHg4eDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWU1QyLjgge2QwWzBdLCBkMVswXX0sIFtyMF0KK3ZvaWQgdnN0Ml9sYW5lX3M4X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ4X3QgKiBwdHIsIGludDh4OHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0Ml9sYW5lX3M4KHB0ciwgdmFsLCBsYW5lKSAgdnN0Ml9sYW5lX3U4KCh1aW50OF90KilwdHIsIHZhbCwgbGFuZSkKKworLy92b2lkIHZzdDJfbGFuZV9zMTYoX190cmFuc2ZlcnNpemUoMikgaW50MTZfdCAqIHB0ciwgaW50MTZ4NHgyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVlNUMi4xNiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQordm9pZCB2c3QyX2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQxNl90ICogcHRyLCBpbnQxNng0eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOworI2RlZmluZSB2c3QyX2xhbmVfczE2KHB0ciwgdmFsLCBsYW5lKSAgdnN0Ml9sYW5lX3UxNigodWludDE2X3QqKXB0ciwgdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0Ml9sYW5lX3MzMihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQzMl90ICogcHRyLCBpbnQzMngyeDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsvLyBWU1QyLjMyIHtkMFswXSwgZDFbMF19LCBbcjBdCit2b2lkIHZzdDJfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGludDMyX3QgKiBwdHIsIGludDMyeDJ4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7CisjZGVmaW5lIHZzdDJfbGFuZV9zMzIocHRyLCB2YWwsIGxhbmUpICB2c3QyX2xhbmVfdTMyKCh1aW50MzJfdCopcHRyLCB2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3QyX2xhbmVfZjE2KF9fdHJhbnNmZXJzaXplKDIpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0eDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUMi4xNiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorLy9jdXJyZW50IElBIFNJTUQgZG9lc24ndCBzdXBwb3J0IGZsb2F0MTYKKwordm9pZCB2c3QyX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4MngyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVlNUMi4zMiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDJfbGFuZV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMngyeDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpCit7CisgICAgKihwdHIpID0gdmFsLT52YWxbMF0ubTY0X2YzMltsYW5lXTsKKyAgICAqKHB0ciArIDEpID0gdmFsLT52YWxbMV0ubTY0X2YzMltsYW5lXTsKK30KKyNkZWZpbmUgdnN0Ml9sYW5lX2YzMihwdHIsc3JjLGxhbmUpIHZzdDJfbGFuZV9mMzJfcHRyKHB0ciwmc3JjLGxhbmUpCisKKy8vdm9pZCB2c3QyX2xhbmVfcDgoX190cmFuc2ZlcnNpemUoMikgcG9seThfdCAqIHB0ciwgcG9seTh4OHgyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVlNUMi44IHtkMFswXSwgZDFbMF19LCBbcjBdCisjZGVmaW5lIHZzdDJfbGFuZV9wOCB2c3QyX2xhbmVfdTgKKworLy92b2lkIHZzdDJfbGFuZV9wMTYoX190cmFuc2ZlcnNpemUoMikgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0eDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsvLyBWU1QyLjE2IHtkMFswXSwgZDFbMF19LCBbcjBdCisjZGVmaW5lIHZzdDJfbGFuZV9wMTYgdnN0Ml9sYW5lX3UxNgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiogVHJpcGxlIGxhbmVzICBzdG9yZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL3ZvaWQgdnN0M3FfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoMykgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4eDNfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKS8vIFZTVDMuMTYge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0M3FfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OHgzX3QqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpCit7CisgICAgdnN0MnFfbGFuZV91MTZfcHRyKHB0ciwgKHVpbnQxNng4eDJfdCopdmFsLCBsYW5lKTsKKyAgICB2c3QxcV9sYW5lX3UxNigocHRyICsgMiksIHZhbC0+dmFsWzJdLCBsYW5lKTsKK30KKyNkZWZpbmUgdnN0M3FfbGFuZV91MTYocHRyLCB2YWwsIGxhbmUpIHZzdDNxX2xhbmVfdTE2X3B0cihwdHIsICZ2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3QzcV9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDR4M190IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpLy8gVlNUMy4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QzcV9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0eDNfdCogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkKK3sKKyAgICB2c3QycV9sYW5lX3UzMl9wdHIocHRyLCAodWludDMyeDR4Ml90Kil2YWwsIGxhbmUpOworICAgIHZzdDFxX2xhbmVfdTMyKChwdHIgKyAyKSwgdmFsLT52YWxbMl0sIGxhbmUpOworfQorI2RlZmluZSB2c3QzcV9sYW5lX3UzMihwdHIsIHZhbCwgbGFuZSkgdnN0M3FfbGFuZV91MzJfcHRyKHB0ciwgJnZhbCwgbGFuZSkKKworLy92b2lkIHZzdDNxX2xhbmVfczE2KF9fdHJhbnNmZXJzaXplKDMpIGludDE2X3QgKiBwdHIsIGludDE2eDh4M190IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZTVDMuMTYge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCit2b2lkIHZzdDNxX2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQxNl90ICogcHRyLCBpbnQxNng4eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOworI2RlZmluZSB2c3QzcV9sYW5lX3MxNihwdHIsIHZhbCwgbGFuZSkgdnN0M3FfbGFuZV91MTYoKHVpbnQxNl90ICopcHRyLCB2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3QzcV9sYW5lX3MzMihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQzMl90ICogcHRyLCBpbnQzMng0eDNfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsvLyBWU1QzLjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQordm9pZCB2c3QzcV9sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0M3FfbGFuZV9zMzIocHRyLCB2YWwsIGxhbmUpIHZzdDNxX2xhbmVfdTMyKCh1aW50MzJfdCAqKXB0ciwgdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0M3FfbGFuZV9mMTYoX190cmFuc2ZlcnNpemUoMykgX19mcDE2ICogcHRyLCBmbG9hdDE2eDh4M190IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZTVDMuMTYge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCit2b2lkIHZzdDNxX2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsKKy8vY3VycmVudCBJQSBTSU1EIGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdDE2CisKKy8vdm9pZCB2c3QzcV9sYW5lX2YzMihfX3RyYW5zZmVyc2l6ZSgzKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NHgzX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkvLyBWU1QzLjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDNxX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NHgzX3QqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgdnN0MXFfbGFuZV9mMzIocHRyLCAgIHZhbC0+dmFsWzBdLCBsYW5lKTsKKyAgICB2c3QxcV9sYW5lX2YzMigocHRyICsgMSksICAgdmFsLT52YWxbMV0sIGxhbmUpOworICAgIHZzdDFxX2xhbmVfZjMyKChwdHIgKyAyKSwgdmFsLT52YWxbMl0sIGxhbmUpOworfQorI2RlZmluZSB2c3QzcV9sYW5lX2YzMihwdHIsdmFsLGxhbmUpIHZzdDNxX2xhbmVfZjMyX3B0cihwdHIsJnZhbCxsYW5lKQorCisvL3ZvaWQgdnN0M3FfbGFuZV9wMTYoX190cmFuc2ZlcnNpemUoMykgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4eDNfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWU1QzLjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQordm9pZCB2c3QzcV9sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOworI2RlZmluZSB2c3QzcV9sYW5lX3AxNiB2c3QzcV9sYW5lX3MxNgorCisvL3ZvaWQgdnN0M19sYW5lX3U4KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4M190IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpLy8gVlNUMy44IHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDNfbGFuZV91OF9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDhfdCAqIHB0ciwgdWludDh4OHgzX3QqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpCit7CisgICAgKihwdHIpID0gICAgIHZhbC0+dmFsWzBdLm02NF91OFtsYW5lXTsKKyAgICAqKHB0ciArIDEpID0gdmFsLT52YWxbMV0ubTY0X3U4W2xhbmVdOworICAgICoocHRyICsgMikgPSB2YWwtPnZhbFsyXS5tNjRfdThbbGFuZV07Cit9CisjZGVmaW5lIHZzdDNfbGFuZV91OChwdHIsIHZhbCwgbGFuZSkgdnN0M19sYW5lX3U4X3B0cihwdHIsICZ2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3QzX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHgzX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkvLyBWU1QzLjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDNfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHgzX3QqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgKihwdHIpID0gICAgIHZhbC0+dmFsWzBdLm02NF91MTZbbGFuZV07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF91MTZbbGFuZV07CisgICAgKihwdHIgKyAyKSA9IHZhbC0+dmFsWzJdLm02NF91MTZbbGFuZV07Cit9CisjZGVmaW5lIHZzdDNfbGFuZV91MTYocHRyLCB2YWwsIGxhbmUpIHZzdDNfbGFuZV91MTZfcHRyKHB0ciwgJnZhbCwgbGFuZSkKKworLy92b2lkIHZzdDNfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoMykgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyeDNfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKS8vIFZTVDMuMzIge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0M19sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyeDNfdCogdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICAqKHB0cikgPSAgICAgdmFsLT52YWxbMF0ubTY0X3UzMltsYW5lXTsKKyAgICAqKHB0ciArIDEpID0gdmFsLT52YWxbMV0ubTY0X3UzMltsYW5lXTsKKyAgICAqKHB0ciArIDIpID0gdmFsLT52YWxbMl0ubTY0X3UzMltsYW5lXTsKK30KKyNkZWZpbmUgdnN0M19sYW5lX3UzMihwdHIsIHZhbCwgbGFuZSkgdnN0M19sYW5lX3UzMl9wdHIocHRyLCAmdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0M19sYW5lX3M4KF9fdHJhbnNmZXJzaXplKDMpIGludDhfdCAqIHB0ciwgaW50OHg4eDNfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWU1QzLjgge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDNfbGFuZV9zOF9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50OF90ICogcHRyLCBpbnQ4eDh4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7CisjZGVmaW5lICB2c3QzX2xhbmVfczgocHRyLCB2YWwsIGxhbmUpIHZzdDNfbGFuZV91OCgodWludDhfdCAqKXB0ciwgdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0M19sYW5lX3MxNihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQxNl90ICogcHRyLCBpbnQxNng0eDNfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsvLyBWU1QzLjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QzX2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQxNl90ICogcHRyLCBpbnQxNng0eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOworI2RlZmluZSB2c3QzX2xhbmVfczE2KHB0ciwgdmFsLCBsYW5lKSB2c3QzX2xhbmVfdTE2KCh1aW50MTZfdCAqKXB0ciwgdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0M19sYW5lX3MzMihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQzMl90ICogcHRyLCBpbnQzMngyeDNfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsvLyBWU1QzLjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QzX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQzMl90ICogcHRyLCBpbnQzMngyeDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOworI2RlZmluZSB2c3QzX2xhbmVfczMyKHB0ciwgdmFsLCBsYW5lKSB2c3QzX2xhbmVfdTMyKCh1aW50MzJfdCAqKXB0ciwgdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0M19sYW5lX2YxNihfX3RyYW5zZmVyc2l6ZSgzKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NHgzX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVlNUMy4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0M19sYW5lX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgX19mcDE2ICogcHRyLCBmbG9hdDE2eDR4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7CisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCisvL3ZvaWQgdnN0M19sYW5lX2YzMihfX3RyYW5zZmVyc2l6ZSgzKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4MngzX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkvLyBWU1QzLjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QzX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4MngzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsKK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QzX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4MngzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgICoocHRyKSA9IHZhbC0+dmFsWzBdLm02NF9mMzJbbGFuZV07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF9mMzJbbGFuZV07CisgICAgKihwdHIgKyAyKSA9IHZhbC0+dmFsWzJdLm02NF9mMzJbbGFuZV07Cit9CisjZGVmaW5lIHZzdDNfbGFuZV9mMzIocHRyLHZhbCxsYW5lKSB2c3QzX2xhbmVfZjMyX3B0cihwdHIsJnZhbCxsYW5lKQorCisvL3ZvaWQgdnN0M19sYW5lX3A4KF9fdHJhbnNmZXJzaXplKDMpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDh4M190IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZTVDMuOCB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0M19sYW5lX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBwb2x5OF90ICogcHRyLCBwb2x5OHg4eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOworI2RlZmluZSB2c3QzX2xhbmVfcDggdnN0M19sYW5lX3U4CisKKy8vdm9pZCB2c3QzX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDMpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4NHgzX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVlNUMy4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0M19sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOworI2RlZmluZSB2c3QzX2xhbmVfcDE2IHZzdDNfbGFuZV9zMTYKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBRdWFkcnVwbGUgbGFuZXMgc3RvcmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vdm9pZCB2c3Q0cV9sYW5lX3UxNihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDh4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpLy8gVlNUNC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0NHFfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OHg0X3QqIHZhbDQsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKQoreworICAgIHZzdDJxX2xhbmVfdTE2X3B0cihwdHIsICAgICh1aW50MTZ4OHgyX3QqKXZhbDQtPnZhbCwgbGFuZSk7CisgICAgdnN0MnFfbGFuZV91MTZfcHRyKChwdHIgKyAyKSwoKHVpbnQxNng4eDJfdCopdmFsNC0+dmFsICsgMSksIGxhbmUpOworfQorI2RlZmluZSB2c3Q0cV9sYW5lX3UxNihwdHIsIHZhbCwgbGFuZSkgdnN0NHFfbGFuZV91MTZfcHRyKHB0ciwgJnZhbCwgbGFuZSkKKworLy92b2lkIHZzdDRxX2xhbmVfdTMyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4NHg0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkvLyBWU1Q0LjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3Q0cV9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0eDRfdCogdmFsNCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgdnN0MnFfbGFuZV91MzJfcHRyKHB0ciwgICAgICh1aW50MzJ4NHgyX3QqKXZhbDQtPnZhbCwgbGFuZSk7CisgICAgdnN0MnFfbGFuZV91MzJfcHRyKChwdHIgKyAyKSwgKCh1aW50MzJ4NHgyX3QqKXZhbDQtPnZhbCArIDEpLCBsYW5lKTsKK30KKyNkZWZpbmUgdnN0NHFfbGFuZV91MzIocHRyLCB2YWwsIGxhbmUpIHZzdDRxX2xhbmVfdTMyX3B0cihwdHIsICZ2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3Q0cV9sYW5lX3MxNihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQxNl90ICogcHRyLCBpbnQxNng4eDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWU1Q0LjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK3ZvaWQgdnN0NHFfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGludDE2X3QgKiBwdHIsIGludDE2eDh4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7CisjZGVmaW5lIHZzdDRxX2xhbmVfczE2KHB0cix2YWwsbGFuZSkgdnN0NHFfbGFuZV91MTYoKHVpbnQxNl90ICopcHRyLHZhbCxsYW5lKQorCisvL3ZvaWQgdnN0NHFfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoNCkgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHg0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVlNUNC4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCit2b2lkIHZzdDRxX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90ICogcHRyLCBpbnQzMng0eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOworI2RlZmluZSB2c3Q0cV9sYW5lX3MzMihwdHIsdmFsLGxhbmUpIHZzdDRxX2xhbmVfdTMyKCh1aW50MzJfdCAqKXB0cix2YWwsbGFuZSkKKworLy92b2lkIHZzdDRxX2xhbmVfZjE2KF9fdHJhbnNmZXJzaXplKDQpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4eDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWU1Q0LjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK3ZvaWQgdnN0NHFfbGFuZV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOworLy9jdXJyZW50IElBIFNJTUQgZG9lc24ndCBzdXBwb3J0IGZsb2F0MTYKKworLy92b2lkIHZzdDRxX2xhbmVfZjMyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMng0eDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKS8vIFZTVDQuMzIge2QwWzBdLCBkMlswXSwgZDRbMF0sIGQ2WzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDRxX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NHg0X3QqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgdnN0MXFfbGFuZV9mMzIocHRyLCAgIHZhbC0+dmFsWzBdLCBsYW5lKTsKKyAgICB2c3QxcV9sYW5lX2YzMigocHRyICsgMSksIHZhbC0+dmFsWzFdLCBsYW5lKTsKKyAgICB2c3QxcV9sYW5lX2YzMigocHRyICsgMiksIHZhbC0+dmFsWzJdLCBsYW5lKTsKKyAgICB2c3QxcV9sYW5lX2YzMigocHRyICsgMyksIHZhbC0+dmFsWzNdLCBsYW5lKTsKK30KKyNkZWZpbmUgdnN0NHFfbGFuZV9mMzIocHRyLHZhbCxsYW5lKSB2c3Q0cV9sYW5lX2YzMl9wdHIocHRyLCZ2YWwsbGFuZSkKKworLy92b2lkIHZzdDRxX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHg0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVlNUNC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCit2b2lkIHZzdDRxX2xhbmVfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDh4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7CisjZGVmaW5lIHZzdDRxX2xhbmVfcDE2IHZzdDRxX2xhbmVfdTE2CisKKy8vdm9pZCB2c3Q0X2xhbmVfdTgoX190cmFuc2ZlcnNpemUoNCkgdWludDhfdCAqIHB0ciwgdWludDh4OHg0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkvLyBWU1Q0Ljgge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDRfbGFuZV91OF9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDhfdCAqIHB0ciwgdWludDh4OHg0X3QqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpCit7CisgICAgKihwdHIpID0gICAgIHZhbC0+dmFsWzBdLm02NF91OFtsYW5lXTsKKyAgICAqKHB0ciArIDEpID0gdmFsLT52YWxbMV0ubTY0X3U4W2xhbmVdOworICAgICoocHRyICsgMikgPSB2YWwtPnZhbFsyXS5tNjRfdThbbGFuZV07CisgICAgKihwdHIgKyAzKSA9IHZhbC0+dmFsWzNdLm02NF91OFtsYW5lXTsKK30KKyNkZWZpbmUgdnN0NF9sYW5lX3U4KHB0ciwgdmFsLCBsYW5lKSB2c3Q0X2xhbmVfdThfcHRyKHB0ciwgJnZhbCwgbGFuZSkKKworLy92b2lkIHZzdDRfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoNCkgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0eDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKS8vIFZTVDQuMTYge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDRfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHg0X3QqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgKihwdHIpID0gICAgIHZhbC0+dmFsWzBdLm02NF91MTZbbGFuZV07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF91MTZbbGFuZV07CisgICAgKihwdHIgKyAyKSA9IHZhbC0+dmFsWzJdLm02NF91MTZbbGFuZV07CisgICAgKihwdHIgKyAzKSA9IHZhbC0+dmFsWzNdLm02NF91MTZbbGFuZV07Cit9CisjZGVmaW5lIHZzdDRfbGFuZV91MTYocHRyLCB2YWwsIGxhbmUpIHZzdDRfbGFuZV91MTZfcHRyKHB0ciwgJnZhbCwgbGFuZSkKKworLy92b2lkIHZzdDRfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyeDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKS8vIFZTVDQuMzIge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDRfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4Mng0X3QqIHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpCit7CisgICAgKihwdHIpID0gICAgIHZhbC0+dmFsWzBdLm02NF91MzJbbGFuZV07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF91MzJbbGFuZV07CisgICAgKihwdHIgKyAyKSA9IHZhbC0+dmFsWzJdLm02NF91MzJbbGFuZV07CisgICAgKihwdHIgKyAzKSA9IHZhbC0+dmFsWzNdLm02NF91MzJbbGFuZV07Cit9CisjZGVmaW5lIHZzdDRfbGFuZV91MzIocHRyLCB2YWwsIGxhbmUpIHZzdDRfbGFuZV91MzJfcHRyKHB0ciwgJnZhbCwgbGFuZSkKKworLy92b2lkIHZzdDRfbGFuZV9zOChfX3RyYW5zZmVyc2l6ZSg0KSBpbnQ4X3QgKiBwdHIsIGludDh4OHg0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkvLyBWU1Q0Ljgge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQorI2RlZmluZSB2c3Q0X2xhbmVfczgocHRyLCB2YWwsIGxhbmUpIHZzdDRfbGFuZV91OCgodWludDhfdCopcHRyLCB2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3Q0X2xhbmVfczE2KF9fdHJhbnNmZXJzaXplKDQpIGludDE2X3QgKiBwdHIsIGludDE2eDR4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpLy8gVlNUNC4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCisjZGVmaW5lIHZzdDRfbGFuZV9zMTYocHRyLCB2YWwsIGxhbmUpIHZzdDRfbGFuZV91MTYoKHVpbnQxNl90KilwdHIsIHZhbCwgbGFuZSkKKworLy92b2lkIHZzdDRfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoNCkgaW50MzJfdCAqIHB0ciwgaW50MzJ4Mng0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkvLyBWU1Q0LjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KKyNkZWZpbmUgdnN0NF9sYW5lX3MzMihwdHIsIHZhbCwgbGFuZSkgdnN0NF9sYW5lX3UzMigodWludDMyX3QqKXB0ciwgdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0NF9sYW5lX2YxNihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NHg0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVlNUNC4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCit2b2lkIHZzdDRfbGFuZV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOworLy9jdXJyZW50IElBIFNJTUQgZG9lc24ndCBzdXBwb3J0IGZsb2F0MTYKKwordm9pZCB2c3Q0X2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4Mng0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVlNUNC4zMiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0NF9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4NF90KiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgICoocHRyKSA9IHZhbC0+dmFsWzBdLm02NF9mMzJbbGFuZV07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF9mMzJbbGFuZV07CisgICAgKihwdHIgKyAyKSA9IHZhbC0+dmFsWzJdLm02NF9mMzJbbGFuZV07CisgICAgKihwdHIgKyAzKSA9IHZhbC0+dmFsWzNdLm02NF9mMzJbbGFuZV07Cit9CisjZGVmaW5lIHZzdDRfbGFuZV9mMzIocHRyLHZhbCxsYW5lKSB2c3Q0X2xhbmVfZjMyX3B0cihwdHIsJnZhbCxsYW5lKQorCisvL3ZvaWQgdnN0NF9sYW5lX3A4KF9fdHJhbnNmZXJzaXplKDQpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDh4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZTVDQuOCB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCit2b2lkIHZzdDRfbGFuZV9wOF9wdHIoX190cmFuc2ZlcnNpemUoNCkgcG9seThfdCAqIHB0ciwgcG9seTh4OHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0NF9sYW5lX3A4IHZzdDRfbGFuZV91OAorCisvL3ZvaWQgdnN0NF9sYW5lX3AxNihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDR4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOy8vIFZTVDQuMTYge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQordm9pZCB2c3Q0X2xhbmVfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDR4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7CisjZGVmaW5lIHZzdDRfbGFuZV9wMTYgdnN0NF9sYW5lX3UxNgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiBFeHRyYWN0IGxhbmVzIGZyb20gYSB2ZWN0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vVGhlc2UgaW50cmluc2ljcyBleHRyYWN0IGEgc2luZ2xlIGxhbmUgKGVsZW1lbnQpIGZyb20gYSB2ZWN0b3IuCit1aW50OF90IHZnZXRfbGFuZV91OCh1aW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuVTggcjAsIGQwWzBdCisjZGVmaW5lIHZnZXRfbGFuZV91OCh2ZWMsIGxhbmUpIHZlYy5tNjRfdThbbGFuZV0KKwordWludDE2X3QgdmdldF9sYW5lX3UxNih1aW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLnMxNiByMCwgZDBbMF0KKyNkZWZpbmUgdmdldF9sYW5lX3UxNih2ZWMsIGxhbmUpIHZlYy5tNjRfdTE2W2xhbmVdCisKKwordWludDMyX3QgdmdldF9sYW5lX3UzMih1aW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WLjMyIHIwLCBkMFswXQorI2RlZmluZSB2Z2V0X2xhbmVfdTMyKHZlYywgbGFuZSkgdmVjLm02NF91MzJbbGFuZV0KKworaW50OF90IHZnZXRfbGFuZV9zOChpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi5TOCByMCwgZDBbMF0KKyNkZWZpbmUgdmdldF9sYW5lX3M4KHZlYywgbGFuZSkgdmVjLm02NF9pOFtsYW5lXQorCitpbnQxNl90IHZnZXRfbGFuZV9zMTYoaW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLlMxNiByMCwgZDBbMF0KKyNkZWZpbmUgdmdldF9sYW5lX3MxNih2ZWMsIGxhbmUpIHZlYy5tNjRfaTE2W2xhbmVdCisKK2ludDMyX3QgdmdldF9sYW5lX3MzMihpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZNT1YuMzIgcjAsIGQwWzBdCisjZGVmaW5lIHZnZXRfbGFuZV9zMzIodmVjLCBsYW5lKSB2ZWMubTY0X2kzMltsYW5lXQorCitwb2x5OF90IHZnZXRfbGFuZV9wOChwb2x5OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuVTggcjAsIGQwWzBdCisjZGVmaW5lIHZnZXRfbGFuZV9wOCB2Z2V0X2xhbmVfdTgKKworcG9seTE2X3QgdmdldF9sYW5lX3AxNihwb2x5MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLnMxNiByMCwgZDBbMF0KKyNkZWZpbmUgdmdldF9sYW5lX3AxNiB2Z2V0X2xhbmVfdTE2CisKK2Zsb2F0MzJfdCB2Z2V0X2xhbmVfZjMyKGZsb2F0MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WLjMyIHIwLCBkMFswXQorI2RlZmluZSB2Z2V0X2xhbmVfZjMyKHZlYywgbGFuZSkgdmVjLm02NF9mMzJbbGFuZV0KKwordWludDhfdCB2Z2V0cV9sYW5lX3U4KHVpbnQ4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvLyBWTU9WLlU4IHIwLCBkMFswXQorI2RlZmluZSB2Z2V0cV9sYW5lX3U4IF9NTV9FWFRSQUNUX0VQSTgKKwordWludDE2X3QgdmdldHFfbGFuZV91MTYodWludDE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi5zMTYgcjAsIGQwWzBdCisjZGVmaW5lICB2Z2V0cV9sYW5lX3UxNiBfTU1fRVhUUkFDVF9FUEkxNgorCit1aW50MzJfdCB2Z2V0cV9sYW5lX3UzMih1aW50MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLjMyIHIwLCBkMFswXQorI2RlZmluZSB2Z2V0cV9sYW5lX3UzMiBfTU1fRVhUUkFDVF9FUEkzMgorCitpbnQ4X3QgdmdldHFfbGFuZV9zOChpbnQ4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvLyBWTU9WLlM4IHIwLCBkMFswXQorI2RlZmluZSB2Z2V0cV9sYW5lX3M4IHZnZXRxX2xhbmVfdTgKKworaW50MTZfdCB2Z2V0cV9sYW5lX3MxNihpbnQxNng4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuUzE2IHIwLCBkMFswXQorI2RlZmluZSB2Z2V0cV9sYW5lX3MxNiB2Z2V0cV9sYW5lX3UxNgorCitpbnQzMl90IHZnZXRxX2xhbmVfczMyKGludDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4zMiByMCwgZDBbMF0KKyNkZWZpbmUgdmdldHFfbGFuZV9zMzIgdmdldHFfbGFuZV91MzIKKworcG9seThfdCB2Z2V0cV9sYW5lX3A4KHBvbHk4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvLyBWTU9WLlU4IHIwLCBkMFswXQorI2RlZmluZSB2Z2V0cV9sYW5lX3A4IHZnZXRxX2xhbmVfdTgKKworcG9seTE2X3QgdmdldHFfbGFuZV9wMTYocG9seTE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi5zMTYgcjAsIGQwWzBdCisjZGVmaW5lIHZnZXRxX2xhbmVfcDE2IHZnZXRxX2xhbmVfdTE2CisKK2Zsb2F0MzJfdCB2Z2V0cV9sYW5lX2YzMihmbG9hdDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4zMiByMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMl90IHZnZXRxX2xhbmVfZjMyKGZsb2F0MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgaW50MzJfdCBpbGFuZTsKKyAgICBpbGFuZSA9IF9NTV9FWFRSQUNUX1BTKHZlYyxsYW5lKTsKKyAgICByZXR1cm4gKihmbG9hdCopJmlsYW5lOworfQorCitpbnQ2NF90IHZnZXRfbGFuZV9zNjQoaW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvLyBWTU9WIHIwLHIwLGQwCisjZGVmaW5lIHZnZXRfbGFuZV9zNjQodmVjLCBsYW5lKSB2ZWMubTY0X2k2NFswXQorCit1aW50NjRfdCB2Z2V0X2xhbmVfdTY0KHVpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZNT1YgcjAscjAsZDAKKyNkZWZpbmUgdmdldF9sYW5lX3U2NCh2ZWMsIGxhbmUpIHZlYy5tNjRfdTY0WzBdCisKKworaW50NjRfdCB2Z2V0cV9sYW5lX3M2NChpbnQ2NHgyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZNT1YgcjAscjAsZDAKKyNkZWZpbmUgdmdldHFfbGFuZV9zNjQgKGludDY0X3QpIHZnZXRxX2xhbmVfdTY0CisKK3VpbnQ2NF90IHZnZXRxX2xhbmVfdTY0KHVpbnQ2NHgyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZNT1YgcjAscjAsZDAKKyNkZWZpbmUgdmdldHFfbGFuZV91NjQgX01NX0VYVFJBQ1RfRVBJNjQKKworLy8gKioqKioqKioqKioqKioqKiogU2V0IGxhbmVzIHdpdGhpbiBhIHZlY3RvciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vVGhlc2UgaW50cmluc2ljcyBzZXQgYSBzaW5nbGUgbGFuZSAoZWxlbWVudCkgd2l0aGluIGEgdmVjdG9yLgorLy9zYW1lIGZ1bmN0aW9ucyBhcyB2bGQxX2xhbmVfeHggb25lcywgYnV0IHRha2UgdGhlIHZhbHVlIHRvIGJlIHNldCBkaXJlY3RseS4KKwordWludDh4OF90IHZzZXRfbGFuZV91OCh1aW50OF90IHZhbHVlLCB1aW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuOCBkMFswXSxyMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnNldF9sYW5lX3U4KHVpbnQ4X3QgdmFsdWUsIHVpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKQoreworICAgIHVpbnQ4X3QgdmFsOworICAgIHZhbCA9IHZhbHVlOworICAgIHJldHVybiB2bGQxX2xhbmVfdTgoJnZhbCwgdmVjLCAgbGFuZSk7Cit9CisKK3VpbnQxNng0X3QgdnNldF9sYW5lX3UxNih1aW50MTZfdCB2YWx1ZSwgdWludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4xNiBkMFswXSxyMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZzZXRfbGFuZV91MTYodWludDE2X3QgdmFsdWUsIHVpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkKK3sKKyAgICB1aW50MTZfdCB2YWw7CisgICAgdmFsID0gdmFsdWU7CisgICAgcmV0dXJuIHZsZDFfbGFuZV91MTYoJnZhbCwgdmVjLCAgbGFuZSk7Cit9CisKK3VpbnQzMngyX3QgdnNldF9sYW5lX3UzMih1aW50MzJfdCB2YWx1ZSwgdWludDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVk1PVi4zMiBkMFswXSxyMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZzZXRfbGFuZV91MzIodWludDMyX3QgdmFsdWUsIHVpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICB1aW50MzJfdCB2YWw7CisgICAgdmFsID0gdmFsdWU7CisgICAgcmV0dXJuIHZsZDFfbGFuZV91MzIoJnZhbCwgdmVjLCAgbGFuZSk7Cit9CisKK2ludDh4OF90IHZzZXRfbGFuZV9zOChpbnQ4X3QgdmFsdWUsIGludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTU9WLjggZDBbMF0scjAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnNldF9sYW5lX3M4KGludDhfdCB2YWx1ZSwgaW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkKK3sKKyAgICBpbnQ4X3QgdmFsOworICAgIHZhbCA9IHZhbHVlOworICAgIHJldHVybiB2bGQxX2xhbmVfczgoJnZhbCwgdmVjLCAgbGFuZSk7Cit9CisKK2ludDE2eDRfdCB2c2V0X2xhbmVfczE2KGludDE2X3QgdmFsdWUsIGludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4xNiBkMFswXSxyMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnNldF9sYW5lX3MxNihpbnQxNl90IHZhbHVlLCBpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkKK3sKKyAgICBpbnQxNl90IHZhbDsKKyAgICB2YWwgPSB2YWx1ZTsKKyAgICByZXR1cm4gdmxkMV9sYW5lX3MxNigmdmFsLCB2ZWMsICBsYW5lKTsKK30KKworaW50MzJ4Ml90IHZzZXRfbGFuZV9zMzIoaW50MzJfdCB2YWx1ZSwgaW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WLjMyIGQwWzBdLHIwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2c2V0X2xhbmVfczMyKGludDMyX3QgdmFsdWUsIGludDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgIGludDMyX3QgdmFsOworICAgIHZhbCA9IHZhbHVlOworICAgIHJldHVybiB2bGQxX2xhbmVfczMyKCZ2YWwsIHZlYywgIGxhbmUpOworfQorCitwb2x5OHg4X3QgdnNldF9sYW5lX3A4KHBvbHk4X3QgdmFsdWUsIHBvbHk4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi44IGQwWzBdLHIwCisjZGVmaW5lIHZzZXRfbGFuZV9wOCAgdnNldF9sYW5lX3U4CisKK3BvbHkxNng0X3QgdnNldF9sYW5lX3AxNihwb2x5MTZfdCB2YWx1ZSwgcG9seTE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4xNiBkMFswXSxyMAorI2RlZmluZSB2c2V0X2xhbmVfcDE2ICB2c2V0X2xhbmVfdTE2CisKK2Zsb2F0MzJ4Ml90IHZzZXRfbGFuZV9mMzIoZmxvYXQzMl90IHZhbHVlLCBmbG9hdDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVk1PVi4zMiBkMFswXSxyMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2c2V0X2xhbmVfZjMyKGZsb2F0MzJfdCB2YWx1ZSwgZmxvYXQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICBmbG9hdDMyX3QgdmFsOworICAgIHZhbCA9IHZhbHVlOworICAgIHJldHVybiB2bGQxX2xhbmVfZjMyKCZ2YWwsIHZlYywgIGxhbmUpOworfQorCit1aW50OHgxNl90IHZzZXRxX2xhbmVfdTgodWludDhfdCB2YWx1ZSwgdWludDh4MTZfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgbGFuZSk7IC8vIFZNT1YuOCBkMFswXSxyMAorX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZzZXRxX2xhbmVfdTgodWludDhfdCB2YWx1ZSwgdWludDh4MTZfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgbGFuZSkKK3sKKyAgICB1aW50OF90IHZhbDsKKyAgICB2YWwgPSB2YWx1ZTsKKyAgICByZXR1cm4gdmxkMXFfbGFuZV91OCgmdmFsLCB2ZWMsICBsYW5lKTsKK30KKwordWludDE2eDhfdCB2c2V0cV9sYW5lX3UxNih1aW50MTZfdCB2YWx1ZSwgdWludDE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi4xNiBkMFswXSxyMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZzZXRxX2xhbmVfdTE2KHVpbnQxNl90IHZhbHVlLCB1aW50MTZ4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpCit7CisgICAgdWludDE2X3QgdmFsOworICAgIHZhbCA9IHZhbHVlOworICAgIHJldHVybiB2bGQxcV9sYW5lX3UxNigmdmFsLCB2ZWMsICBsYW5lKTsKK30KKwordWludDMyeDRfdCB2c2V0cV9sYW5lX3UzMih1aW50MzJfdCB2YWx1ZSwgdWludDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4zMiBkMFswXSxyMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZzZXRxX2xhbmVfdTMyKHVpbnQzMl90IHZhbHVlLCB1aW50MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgdWludDMyX3QgdmFsOworICAgIHZhbCA9IHZhbHVlOworICAgIHJldHVybiB2bGQxcV9sYW5lX3UzMigmdmFsLCB2ZWMsICBsYW5lKTsKK30KKworaW50OHgxNl90IHZzZXRxX2xhbmVfczgoaW50OF90IHZhbHVlLCBpbnQ4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvLyBWTU9WLjggZDBbMF0scjAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZzZXRxX2xhbmVfczgoaW50OF90IHZhbHVlLCBpbnQ4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpCit7CisgICAgaW50OF90IHZhbDsKKyAgICB2YWwgPSB2YWx1ZTsKKyAgICByZXR1cm4gdmxkMXFfbGFuZV9zOCgmdmFsLCB2ZWMsICBsYW5lKTsKK30KKworaW50MTZ4OF90IHZzZXRxX2xhbmVfczE2KGludDE2X3QgdmFsdWUsIGludDE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi4xNiBkMFswXSxyMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnNldHFfbGFuZV9zMTYoaW50MTZfdCB2YWx1ZSwgaW50MTZ4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpCit7CisgICAgaW50MTZfdCB2YWw7CisgICAgdmFsID0gdmFsdWU7CisgICAgcmV0dXJuIHZsZDFxX2xhbmVfczE2KCZ2YWwsIHZlYywgIGxhbmUpOworfQorCitpbnQzMng0X3QgdnNldHFfbGFuZV9zMzIoaW50MzJfdCB2YWx1ZSwgaW50MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLjMyIGQwWzBdLHIwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2c2V0cV9sYW5lX3MzMihpbnQzMl90IHZhbHVlLCBpbnQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkKK3sKKyAgICBpbnQzMl90IHZhbDsKKyAgICB2YWwgPSB2YWx1ZTsKKyAgICByZXR1cm4gdmxkMXFfbGFuZV9zMzIoJnZhbCwgdmVjLCAgbGFuZSk7Cit9CisKK3BvbHk4eDE2X3QgdnNldHFfbGFuZV9wOChwb2x5OF90IHZhbHVlLCBwb2x5OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy8gVk1PVi44IGQwWzBdLHIwCisjZGVmaW5lIHZzZXRxX2xhbmVfcDggdnNldHFfbGFuZV91OAorCitwb2x5MTZ4OF90IHZzZXRxX2xhbmVfcDE2KHBvbHkxNl90IHZhbHVlLCBwb2x5MTZ4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTU9WLjE2IGQwWzBdLHIwCisjZGVmaW5lIHZzZXRxX2xhbmVfcDE2IHZzZXRxX2xhbmVfdTE2CisKK2Zsb2F0MzJ4NF90IHZzZXRxX2xhbmVfZjMyKGZsb2F0MzJfdCB2YWx1ZSwgZmxvYXQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuMzIgZDBbMF0scjAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3QgdnNldHFfbGFuZV9mMzIoZmxvYXQzMl90IHZhbHVlLCBmbG9hdDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgIGZsb2F0MzJfdCB2YWw7CisgICAgdmFsID0gdmFsdWU7CisgICAgcmV0dXJuIHZsZDFxX2xhbmVfZjMyKCZ2YWwsIHZlYywgIGxhbmUpOworfQorCitpbnQ2NHgxX3QgdnNldF9sYW5lX3M2NChpbnQ2NF90IHZhbHVlLCBpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZNT1YgZDAscjAscjAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4MV90IHZzZXRfbGFuZV9zNjQoaW50NjRfdCB2YWx1ZSwgaW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpCit7CisgICAgaW50NjRfdCB2YWw7CisgICAgdmFsID0gdmFsdWU7CisgICAgcmV0dXJuIHZsZDFfbGFuZV9zNjQoJnZhbCwgdmVjLCAgbGFuZSk7Cit9CisKK3VpbnQ2NHgxX3QgdnNldF9sYW5lX3U2NCh1aW50NjRfdCB2YWx1ZSwgdWludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKTsgLy8gVk1PViBkMCxyMCxyMAorX05FT04yU1NFX0lOTElORSB1aW50NjR4MV90IHZzZXRfbGFuZV91NjQodWludDY0X3QgdmFsdWUsIHVpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSkKK3sKKyAgICB1aW50NjRfdCB2YWw7CisgICAgdmFsID0gdmFsdWU7CisgICAgcmV0dXJuIHZsZDFfbGFuZV91NjQoJnZhbCwgdmVjLCAgbGFuZSk7Cit9CisKK2ludDY0eDJfdCB2c2V0cV9sYW5lX3M2NChpbnQ2NF90IHZhbHVlLCBpbnQ2NHgyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZNT1YgZDAscjAscjAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90IHZzZXRxX2xhbmVfczY0KGludDY0X3QgdmFsdWUsIGludDY0eDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgIHVpbnQ2NF90IHZhbDsKKyAgICB2YWwgPSB2YWx1ZTsKKyAgICByZXR1cm4gdmxkMXFfbGFuZV9zNjQoJnZhbCwgdmVjLCAgbGFuZSk7Cit9CisKK3VpbnQ2NHgyX3QgdnNldHFfbGFuZV91NjQodWludDY0X3QgdmFsdWUsIHVpbnQ2NHgyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdnNldHFfbGFuZV91NjQgdnNldHFfbGFuZV9zNjQKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKiBJbml0aWFsaXplIGEgdmVjdG9yIGZyb20gYml0IHBhdHRlcm4gKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL1RoZXNlIGludHJpbnNpY3MgY3JlYXRlIGEgdmVjdG9yIGZyb20gYSBsaXRlcmFsIGJpdCBwYXR0ZXJuLgoraW50OHg4X3QgdmNyZWF0ZV9zOCh1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorI2RlZmluZSB2Y3JlYXRlX3M4KGEpICAoKihfX202NF8xMjgqKSYoYSkpCisKKworaW50MTZ4NF90IHZjcmVhdGVfczE2KHVpbnQ2NF90IGEpOyAvLyBWTU9WIGQwLHIwLHIwCisjZGVmaW5lIHZjcmVhdGVfczE2ICB2Y3JlYXRlX3M4CisKK2ludDMyeDJfdCB2Y3JlYXRlX3MzMih1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorI2RlZmluZSB2Y3JlYXRlX3MzMiAgdmNyZWF0ZV9zOAorCitmbG9hdDE2eDRfdCB2Y3JlYXRlX2YxNih1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorLy9ubyBJQTMyIFNJTUQgYXZhbGlsYWJsZQorCitmbG9hdDMyeDJfdCB2Y3JlYXRlX2YzMih1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorI2RlZmluZSB2Y3JlYXRlX2YzMihhKSAgKCooX19tNjRfMTI4KikmKGEpKQorCit1aW50OHg4X3QgdmNyZWF0ZV91OCh1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorI2RlZmluZSB2Y3JlYXRlX3U4IHZjcmVhdGVfczgKKwordWludDE2eDRfdCB2Y3JlYXRlX3UxNih1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorI2RlZmluZSB2Y3JlYXRlX3UxNiB2Y3JlYXRlX3MxNgorCit1aW50MzJ4Ml90IHZjcmVhdGVfdTMyKHVpbnQ2NF90IGEpOyAvLyBWTU9WIGQwLHIwLHIwCisjZGVmaW5lIHZjcmVhdGVfdTMyIHZjcmVhdGVfczMyCisKK3VpbnQ2NHgxX3QgdmNyZWF0ZV91NjQodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdmNyZWF0ZV91NjQgIHZjcmVhdGVfczgKKworCitwb2x5OHg4X3QgdmNyZWF0ZV9wOCh1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorI2RlZmluZSB2Y3JlYXRlX3A4IHZjcmVhdGVfdTgKKworcG9seTE2eDRfdCB2Y3JlYXRlX3AxNih1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorI2RlZmluZSB2Y3JlYXRlX3AxNiB2Y3JlYXRlX3UxNgorCitpbnQ2NHgxX3QgdmNyZWF0ZV9zNjQodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdmNyZWF0ZV9zNjQgdmNyZWF0ZV91NjQKKworLy8qKioqKioqKioqKioqKioqKioqKiogU2V0IGFsbCBsYW5lcyB0byBzYW1lIHZhbHVlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9UaGVzZSBpbnRyaW5zaWNzIHNldCBhbGwgbGFuZXMgdG8gdGhlIHNhbWUgdmFsdWUuCit1aW50OHg4X3QgICB2ZHVwX25fdTgodWludDhfdCB2YWx1ZSk7IC8vIFZEVVAuOCBkMCxyMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50OHg4X3QgIHZkdXBfbl91OCh1aW50OF90IHZhbHVlKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgdWludDh4OF90IHJlczsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpPDg7IGkrKykgeworICAgICAgICByZXMubTY0X3U4W2ldID0gdmFsdWU7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQxNng0X3QgICB2ZHVwX25fdTE2KHVpbnQxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBkMCxyMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MTZ4NF90ICB2ZHVwX25fdTE2KHVpbnQxNl90IHZhbHVlKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgdWludDE2eDRfdCByZXM7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaTw0OyBpKyspIHsKKyAgICAgICAgcmVzLm02NF91MTZbaV0gPSB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDMyeDJfdCAgIHZkdXBfbl91MzIodWludDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIGQwLHIwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQzMngyX3QgIHZkdXBfbl91MzIodWludDMyX3QgdmFsdWUpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICB1aW50MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X3UzMlswXSA9IHZhbHVlOworICAgIHJlcy5tNjRfdTMyWzFdID0gdmFsdWU7CisgICAgcmV0dXJuIHJlczsKK30KKworaW50OHg4X3QgICB2ZHVwX25fczgoaW50OF90IHZhbHVlKTsgLy8gVkRVUC44IGQwLHIwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDh4OF90ICB2ZHVwX25fczgoaW50OF90IHZhbHVlKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgaW50OHg4X3QgcmVzOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGk8ODsgaSsrKSB7CisgICAgICAgIHJlcy5tNjRfaThbaV0gPSB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworaW50MTZ4NF90ICAgdmR1cF9uX3MxNihpbnQxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBkMCxyMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQxNng0X3QgIHZkdXBfbl9zMTYoaW50MTZfdCB2YWx1ZSksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIGludDE2eDRfdCByZXM7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaTw0OyBpKyspIHsKKyAgICAgICAgcmVzLm02NF9pMTZbaV0gPSB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworaW50MzJ4Ml90ICAgdmR1cF9uX3MzMihpbnQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBkMCxyMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMngyX3QgIHZkdXBfbl9zMzIoaW50MzJfdCB2YWx1ZSksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIGludDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9pMzJbMF0gPSB2YWx1ZTsKKyAgICByZXMubTY0X2kzMlsxXSA9IHZhbHVlOworICAgIHJldHVybiByZXM7Cit9CisKK3BvbHk4eDhfdCB2ZHVwX25fcDgocG9seThfdCB2YWx1ZSk7IC8vIFZEVVAuOCBkMCxyMAorI2RlZmluZSB2ZHVwX25fcDggdmR1cF9uX3U4CisKK3BvbHkxNng0X3QgdmR1cF9uX3AxNihwb2x5MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgZDAscjAKKyNkZWZpbmUgdmR1cF9uX3AxNiB2ZHVwX25fczE2CisKK2Zsb2F0MzJ4Ml90IHZkdXBfbl9mMzIoZmxvYXQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBkMCxyMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2ZHVwX25fZjMyKGZsb2F0MzJfdCB2YWx1ZSkKK3sKKyAgICBmbG9hdDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9mMzJbMF0gPSB2YWx1ZTsKKyAgICByZXMubTY0X2YzMlsxXSA9IHZhbHVlOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDE2X3QgICB2ZHVwcV9uX3U4KHVpbnQ4X3QgdmFsdWUpOyAvLyBWRFVQLjggcTAscjAKKyNkZWZpbmUgdmR1cHFfbl91OCh2YWx1ZSkgX21tX3NldDFfZXBpOCgodWludDhfdCkgKHZhbHVlKSkKKwordWludDE2eDhfdCAgIHZkdXBxX25fdTE2KHVpbnQxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBxMCxyMAorI2RlZmluZSB2ZHVwcV9uX3UxNih2YWx1ZSkgX21tX3NldDFfZXBpMTYoKHVpbnQxNl90KSAodmFsdWUpKQorCit1aW50MzJ4NF90ICAgdmR1cHFfbl91MzIodWludDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIHEwLHIwCisjZGVmaW5lIHZkdXBxX25fdTMyKHZhbHVlKSBfbW1fc2V0MV9lcGkzMigodWludDMyX3QpICh2YWx1ZSkpCisKK2ludDh4MTZfdCAgIHZkdXBxX25fczgoaW50OF90IHZhbHVlKTsgLy8gVkRVUC44IHEwLHIwCisjZGVmaW5lIHZkdXBxX25fczggX21tX3NldDFfZXBpOAorCitpbnQxNng4X3QgICB2ZHVwcV9uX3MxNihpbnQxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBxMCxyMAorI2RlZmluZSB2ZHVwcV9uX3MxNiBfbW1fc2V0MV9lcGkxNgorCitpbnQzMng0X3QgICB2ZHVwcV9uX3MzMihpbnQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBxMCxyMAorI2RlZmluZSB2ZHVwcV9uX3MzMiBfbW1fc2V0MV9lcGkzMgorCitwb2x5OHgxNl90IHZkdXBxX25fcDgocG9seThfdCB2YWx1ZSk7IC8vIFZEVVAuOCBxMCxyMAorI2RlZmluZSAgdmR1cHFfbl9wOCB2ZHVwcV9uX3U4CisKK3BvbHkxNng4X3QgdmR1cHFfbl9wMTYocG9seTE2X3QgdmFsdWUpOyAvLyBWRFVQLjE2IHEwLHIwCisjZGVmaW5lICB2ZHVwcV9uX3AxNiB2ZHVwcV9uX3UxNgorCitmbG9hdDMyeDRfdCB2ZHVwcV9uX2YzMihmbG9hdDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIHEwLHIwCisjZGVmaW5lIHZkdXBxX25fZjMyIF9tbV9zZXQxX3BzCisKK2ludDY0eDFfdCB2ZHVwX25fczY0KGludDY0X3QgdmFsdWUpOyAvLyBWTU9WIGQwLHIwLHIwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDFfdCB2ZHVwX25fczY0KGludDY0X3QgdmFsdWUpCit7CisgICAgaW50NjR4MV90IHJlczsKKyAgICByZXMubTY0X2k2NFswXSA9IHZhbHVlOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ2NHgxX3QgdmR1cF9uX3U2NCh1aW50NjRfdCB2YWx1ZSk7IC8vIFZNT1YgZDAscjAscjAKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDFfdCAgdmR1cF9uX3U2NCh1aW50NjRfdCB2YWx1ZSkKK3sKKyAgICB1aW50NjR4MV90IHJlczsKKyAgICByZXMubTY0X3U2NFswXSA9IHZhbHVlOworICAgIHJldHVybiByZXM7Cit9CisKK2ludDY0eDJfdCAgIHZkdXBxX25fczY0KGludDY0X3QgdmFsdWUpOyAvLyBWTU9WIGQwLHIwLHIwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCAgIHZkdXBxX25fczY0KGludDY0X3QgdmFsdWUpCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDY0X3QgdmFsdWUyWzJdID0ge3ZhbHVlLCB2YWx1ZX07IC8vdmFsdWUgbWF5IGJlIGFuIGltbWVkaWF0ZQorICAgIHJldHVybiBMT0FEX1NJMTI4KHZhbHVlMik7Cit9CisKK3VpbnQ2NHgyX3QgICB2ZHVwcV9uX3U2NCh1aW50NjRfdCB2YWx1ZSk7IC8vIFZNT1YgZDAscjAscjAKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCAgIHZkdXBxX25fdTY0KHVpbnQ2NF90IHZhbHVlKQoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50NjRfdCB2YWxbMl0gPSB7dmFsdWUsIHZhbHVlfTsgLy92YWx1ZSBtYXkgYmUgYW4gaW1tZWRpYXRlCisgICAgcmV0dXJuIExPQURfU0kxMjgodmFsKTsKK30KKworLy8qKioqICBTZXQgYWxsIGxhbmVzIHRvIHNhbWUgdmFsdWUgICoqKioqKioqKioqKioqKioqKioqKioqKgorLy9TYW1lIGZ1bmN0aW9ucyBhcyBhYm92ZSAtIGp1c3QgYWxpYWNlcy4qKioqKioqKioqKioqKioqKioqKgorLy9Qcm9iYWJseSB0aGV5IHJlZmxlY3QgdGhlIGZhY3QgdGhhdCAxMjgtYml0IGZ1bmN0aW9ucyB2ZXJzaW9ucyB1c2UgVk1PViBpbnN0cnVjdGlvbiAqKioqKioqKioqCit1aW50OHg4X3Qgdm1vdl9uX3U4KHVpbnQ4X3QgdmFsdWUpOyAvLyBWRFVQLjggZDAscjAKKyNkZWZpbmUgdm1vdl9uX3U4IHZkdXBfbl9zOAorCit1aW50MTZ4NF90IHZtb3Zfbl91MTYodWludDE2X3QgdmFsdWUpOyAvLyBWRFVQLjE2IGQwLHIwCisjZGVmaW5lIHZtb3Zfbl91MTYgdmR1cF9uX3MxNgorCit1aW50MzJ4Ml90IHZtb3Zfbl91MzIodWludDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIGQwLHIwCisjZGVmaW5lIHZtb3Zfbl91MzIgdmR1cF9uX3UzMgorCitpbnQ4eDhfdCB2bW92X25fczgoaW50OF90IHZhbHVlKTsgLy8gVkRVUC44IGQwLHIwCisjZGVmaW5lIHZtb3Zfbl9zOCB2ZHVwX25fczgKKworaW50MTZ4NF90IHZtb3Zfbl9zMTYoaW50MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgZDAscjAKKyNkZWZpbmUgdm1vdl9uX3MxNiB2ZHVwX25fczE2CisKK2ludDMyeDJfdCB2bW92X25fczMyKGludDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIGQwLHIwCisjZGVmaW5lIHZtb3Zfbl9zMzIgdmR1cF9uX3MzMgorCitwb2x5OHg4X3Qgdm1vdl9uX3A4KHBvbHk4X3QgdmFsdWUpOyAvLyBWRFVQLjggZDAscjAKKyNkZWZpbmUgdm1vdl9uX3A4IHZkdXBfbl91OAorCitwb2x5MTZ4NF90IHZtb3Zfbl9wMTYocG9seTE2X3QgdmFsdWUpOyAvLyBWRFVQLjE2IGQwLHIwCisjZGVmaW5lIHZtb3Zfbl9wMTYgdmR1cF9uX3MxNgorCitmbG9hdDMyeDJfdCB2bW92X25fZjMyKGZsb2F0MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgZDAscjAKKyNkZWZpbmUgdm1vdl9uX2YzMiB2ZHVwX25fZjMyCisKK3VpbnQ4eDE2X3Qgdm1vdnFfbl91OCh1aW50OF90IHZhbHVlKTsgLy8gVkRVUC44IHEwLHIwCisjZGVmaW5lIHZtb3ZxX25fdTggdmR1cHFfbl91OAorCit1aW50MTZ4OF90IHZtb3ZxX25fdTE2KHVpbnQxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBxMCxyMAorI2RlZmluZSB2bW92cV9uX3UxNiB2ZHVwcV9uX3MxNgorCit1aW50MzJ4NF90IHZtb3ZxX25fdTMyKHVpbnQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBxMCxyMAorI2RlZmluZSB2bW92cV9uX3UzMiB2ZHVwcV9uX3UzMgorCitpbnQ4eDE2X3Qgdm1vdnFfbl9zOChpbnQ4X3QgdmFsdWUpOyAvLyBWRFVQLjggcTAscjAKKyNkZWZpbmUgdm1vdnFfbl9zOCB2ZHVwcV9uX3M4CisKK2ludDE2eDhfdCB2bW92cV9uX3MxNihpbnQxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBxMCxyMAorI2RlZmluZSB2bW92cV9uX3MxNiB2ZHVwcV9uX3MxNgorCitpbnQzMng0X3Qgdm1vdnFfbl9zMzIoaW50MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgcTAscjAKKyNkZWZpbmUgdm1vdnFfbl9zMzIgdmR1cHFfbl9zMzIKKworcG9seTh4MTZfdCB2bW92cV9uX3A4KHBvbHk4X3QgdmFsdWUpOyAvLyBWRFVQLjggcTAscjAKKyNkZWZpbmUgdm1vdnFfbl9wOCB2ZHVwcV9uX3U4CisKK3BvbHkxNng4X3Qgdm1vdnFfbl9wMTYocG9seTE2X3QgdmFsdWUpOyAvLyBWRFVQLjE2IHEwLHIwCisjZGVmaW5lIHZtb3ZxX25fcDE2IHZkdXBxX25fczE2CisKK2Zsb2F0MzJ4NF90IHZtb3ZxX25fZjMyKGZsb2F0MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgcTAscjAKKyNkZWZpbmUgdm1vdnFfbl9mMzIgdmR1cHFfbl9mMzIKKworaW50NjR4MV90IHZtb3Zfbl9zNjQoaW50NjRfdCB2YWx1ZSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdm1vdl9uX3M2NCB2ZHVwX25fczY0CisKK3VpbnQ2NHgxX3Qgdm1vdl9uX3U2NCh1aW50NjRfdCB2YWx1ZSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdm1vdl9uX3U2NCB2ZHVwX25fdTY0CisKK2ludDY0eDJfdCB2bW92cV9uX3M2NChpbnQ2NF90IHZhbHVlKTsgLy8gVk1PViBkMCxyMCxyMAorI2RlZmluZSB2bW92cV9uX3M2NCB2ZHVwcV9uX3M2NAorCit1aW50NjR4Ml90IHZtb3ZxX25fdTY0KHVpbnQ2NF90IHZhbHVlKTsgLy8gVk1PViBkMCxyMCxyMAorI2RlZmluZSB2bW92cV9uX3U2NCB2ZHVwcV9uX3U2NAorCisvLyoqKioqKioqKioqKioqU2V0IGFsbCBsYW5lcyB0byB0aGUgdmFsdWUgb2Ygb25lIGxhbmUgb2YgYSB2ZWN0b3IgKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL2hlcmUgc2h1ZmZsZSBpcyBiZXR0ZXIgc29sdXRpb24gdGhhbiBsYW5lIGV4dHJhY3Rpb24gZm9sbG93ZWQgYnkgc2V0MSBmdW5jdGlvbgordWludDh4OF90IHZkdXBfbGFuZV91OCh1aW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZEVVAuOCBkMCxkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdmR1cF9sYW5lX3U4KHVpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKQoreworICAgIHVpbnQ4eDhfdCByZXM7CisgICAgdWludDhfdCB2YWxhbmU7CisgICAgaW50IGkgPSAwOworICAgIHZhbGFuZSA9IHZlYy5tNjRfdThbbGFuZV07CisgICAgZm9yIChpID0gMDsgaTw4OyBpKyspIHsKKyAgICAgICAgcmVzLm02NF91OFtpXSA9IHZhbGFuZTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDE2eDRfdCB2ZHVwX2xhbmVfdTE2KHVpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZEVVAuMTYgZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2ZHVwX2xhbmVfdTE2KHVpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkKK3sKKyAgICB1aW50MTZ4NF90IHJlczsKKyAgICB1aW50MTZfdCB2YWxhbmU7CisgICAgdmFsYW5lID0gdmVjLm02NF91MTZbbGFuZV07CisgICAgcmVzLm02NF91MTZbMF0gPSB2YWxhbmU7CisgICAgcmVzLm02NF91MTZbMV0gPSB2YWxhbmU7CisgICAgcmVzLm02NF91MTZbMl0gPSB2YWxhbmU7CisgICAgcmVzLm02NF91MTZbM10gPSB2YWxhbmU7CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDMyeDJfdCB2ZHVwX2xhbmVfdTMyKHVpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZEVVAuMzIgZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2ZHVwX2xhbmVfdTMyKHVpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICB1aW50MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X3UzMlswXSA9IHZlYy5tNjRfdTMyW2xhbmVdOworICAgIHJlcy5tNjRfdTMyWzFdID0gcmVzLm02NF91MzJbMF07CisgICAgcmV0dXJuIHJlczsKK30KKworaW50OHg4X3QgdmR1cF9sYW5lX3M4KGludDh4OF90IHZlYywgIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkRVUC44IGQwLGQwWzBdCisjZGVmaW5lIHZkdXBfbGFuZV9zOCB2ZHVwX2xhbmVfdTgKKworaW50MTZ4NF90IHZkdXBfbGFuZV9zMTYoaW50MTZ4NF90IHZlYywgIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkRVUC4xNiBkMCxkMFswXQorI2RlZmluZSB2ZHVwX2xhbmVfczE2IHZkdXBfbGFuZV91MTYKKworaW50MzJ4Ml90IHZkdXBfbGFuZV9zMzIoaW50MzJ4Ml90IHZlYywgIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkRVUC4zMiBkMCxkMFswXQorI2RlZmluZSB2ZHVwX2xhbmVfczMyIHZkdXBfbGFuZV91MzIKKworcG9seTh4OF90IHZkdXBfbGFuZV9wOChwb2x5OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZEVVAuOCBkMCxkMFswXQorI2RlZmluZSB2ZHVwX2xhbmVfcDggdmR1cF9sYW5lX3U4CisKK3BvbHkxNng0X3QgdmR1cF9sYW5lX3AxNihwb2x5MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWRFVQLjE2IGQwLGQwWzBdCisjZGVmaW5lIHZkdXBfbGFuZV9wMTYgdmR1cF9sYW5lX3MxNgorCitmbG9hdDMyeDJfdCB2ZHVwX2xhbmVfZjMyKGZsb2F0MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWRFVQLjMyIGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZkdXBfbGFuZV9mMzIoZmxvYXQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICBmbG9hdDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9mMzJbMF0gPSB2ZWMubTY0X2YzMltsYW5lXTsKKyAgICByZXMubTY0X2YzMlsxXSA9IHJlcy5tNjRfZjMyWzBdOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDE2X3QgdmR1cHFfbGFuZV91OCh1aW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZEVVAuOCBxMCxkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZkdXBxX2xhbmVfdTgodWludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpIC8vIFZEVVAuOCBxMCxkMFswXQoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbGFuZW1hc2s4WzE2XSA9IHtsYW5lLCBsYW5lLCBsYW5lLCBsYW5lLCBsYW5lLCBsYW5lLCBsYW5lLCBsYW5lLCBsYW5lLCBsYW5lLCBsYW5lLCBsYW5lLCBsYW5lLCBsYW5lLCBsYW5lLCBsYW5lfTsKKyAgICByZXR1cm4gX21tX3NodWZmbGVfZXBpOCAoX3BNMTI4aSh2ZWMpLCAqKF9fbTEyOGkqKSBsYW5lbWFzazgpOworfQorCit1aW50MTZ4OF90IHZkdXBxX2xhbmVfdTE2KHVpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZEVVAuMTYgcTAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2ZHVwcV9sYW5lX3UxNih1aW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpIC8vIFZEVVAuMTYgcTAsZDBbMF0KK3sKKyAgICAvL3dlIGNvdWxkIHVzZSA4Yml0IHNodWZmbGUgZm9yIDE2IGJpdCBhcyB3ZWxsCisgICAgY29uc3QgaW50OF90IGxhbmUxNiA9ICgoaW50OF90KSBsYW5lKSA8PCAxOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbGFuZW1hc2tfZTE2WzE2XSA9IHtsYW5lMTYsIGxhbmUxNiArIDEsIGxhbmUxNiwgbGFuZTE2ICsgMSwgbGFuZTE2LCBsYW5lMTYgKyAxLCBsYW5lMTYsIGxhbmUxNiArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5lMTYsIGxhbmUxNiArIDEsIGxhbmUxNiwgbGFuZTE2ICsgMSwgbGFuZTE2LCBsYW5lMTYgKyAxLCBsYW5lMTYsIGxhbmUxNiArIDF9OworICAgIHJldHVybiBfbW1fc2h1ZmZsZV9lcGk4IChfcE0xMjhpKHZlYyksICooX19tMTI4aSopbGFuZW1hc2tfZTE2KTsKK30KKwordWludDMyeDRfdCB2ZHVwcV9sYW5lX3UzMih1aW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWRFVQLjMyIHEwLGQwWzBdCisjZGVmaW5lIHZkdXBxX2xhbmVfdTMyKHZlYywgIGxhbmUpIF9tbV9zaHVmZmxlX2VwaTMyIChfcE0xMjhpKHZlYyksICBsYW5lIHwgKGxhbmUgPDwgMikgfCAobGFuZSA8PCA0KSB8IChsYW5lIDw8IDYpKQorCitpbnQ4eDE2X3QgdmR1cHFfbGFuZV9zOChpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkRVUC44IHEwLGQwWzBdCisjZGVmaW5lIHZkdXBxX2xhbmVfczggdmR1cHFfbGFuZV91OAorCitpbnQxNng4X3QgdmR1cHFfbGFuZV9zMTYoaW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWRFVQLjE2IHEwLGQwWzBdCisjZGVmaW5lIHZkdXBxX2xhbmVfczE2IHZkdXBxX2xhbmVfdTE2CisKK2ludDMyeDRfdCB2ZHVwcV9sYW5lX3MzMihpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZEVVAuMzIgcTAsZDBbMF0KKyNkZWZpbmUgdmR1cHFfbGFuZV9zMzIgdmR1cHFfbGFuZV91MzIKKworcG9seTh4MTZfdCB2ZHVwcV9sYW5lX3A4KHBvbHk4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkRVUC44IHEwLGQwWzBdCisjZGVmaW5lIHZkdXBxX2xhbmVfcDggdmR1cHFfbGFuZV91OAorCitwb2x5MTZ4OF90IHZkdXBxX2xhbmVfcDE2KHBvbHkxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZEVVAuMTYgcTAsZDBbMF0KKyNkZWZpbmUgdmR1cHFfbGFuZV9wMTYgdmR1cHFfbGFuZV9zMTYKKworZmxvYXQzMng0X3QgdmR1cHFfbGFuZV9mMzIoZmxvYXQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZEVVAuMzIgcTAsZDBbMF0KKyNkZWZpbmUgIHZkdXBxX2xhbmVfZjMyKHZlYywgbGFuZSkgIF9tbV9sb2FkMV9wcygodmVjLm02NF9mMzIgKyBsYW5lKSkKKworaW50NjR4MV90IHZkdXBfbGFuZV9zNjQoaW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZkdXBfbGFuZV9zNjQodmVjLGxhbmUpIHZlYworCit1aW50NjR4MV90IHZkdXBfbGFuZV91NjQodWludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2ZHVwX2xhbmVfdTY0KHZlYyxsYW5lKSB2ZWMKKworaW50NjR4Ml90IHZkdXBxX2xhbmVfczY0KGludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKTsgLy8gVk1PViBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgdmR1cHFfbGFuZV9zNjQoaW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpCit7CisgICAgX19tMTI4aSB2ZWMxMjg7CisgICAgdmVjMTI4ID0gX3BNMTI4aSh2ZWMpOworICAgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpNjQodmVjMTI4LHZlYzEyOCk7Cit9CisKK3VpbnQ2NHgyX3QgdmR1cHFfbGFuZV91NjQodWludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKTsgLy8gVk1PViBxMCxxMAorI2RlZmluZSB2ZHVwcV9sYW5lX3U2NCB2ZHVwcV9sYW5lX3M2NAorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqKiogIENvbWJpbmluZyB2ZWN0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9UaGVzZSBpbnRyaW5zaWNzIGpvaW4gdHdvIDY0IGJpdCB2ZWN0b3JzIGludG8gYSBzaW5nbGUgMTI4Yml0IHZlY3Rvci4KK2ludDh4MTZfdCAgIHZjb21iaW5lX3M4KGludDh4OF90IGxvdywgaW50OHg4X3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmNvbWJpbmVfczgobG93LCBoaWdoKSAgIF9tbV91bnBhY2tsb19lcGk2NCAoX3BNMTI4aShsb3cpLCBfcE0xMjhpKGhpZ2gpICkKKworaW50MTZ4OF90ICAgdmNvbWJpbmVfczE2KGludDE2eDRfdCBsb3csIGludDE2eDRfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2Y29tYmluZV9zMTYobG93LCBoaWdoKSAgICBfbW1fdW5wYWNrbG9fZXBpNjQgKF9wTTEyOGkobG93KSwgX3BNMTI4aShoaWdoKSApCisKK2ludDMyeDRfdCAgIHZjb21iaW5lX3MzMihpbnQzMngyX3QgbG93LCBpbnQzMngyX3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmNvbWJpbmVfczMyKGxvdywgaGlnaCkgICBfbW1fdW5wYWNrbG9fZXBpNjQgKF9wTTEyOGkobG93KSwgX3BNMTI4aShoaWdoKSApCisKK2ludDY0eDJfdCAgIHZjb21iaW5lX3M2NChpbnQ2NHgxX3QgbG93LCBpbnQ2NHgxX3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmNvbWJpbmVfczY0KGxvdywgaGlnaCkgICBfbW1fdW5wYWNrbG9fZXBpNjQgKF9wTTEyOGkobG93KSwgX3BNMTI4aShoaWdoKSApCisKK2Zsb2F0MTZ4OF90IHZjb21iaW5lX2YxNihmbG9hdDE2eDRfdCBsb3csIGZsb2F0MTZ4NF90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCitmbG9hdDMyeDRfdCB2Y29tYmluZV9mMzIoZmxvYXQzMngyX3QgbG93LCBmbG9hdDMyeDJfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDRfdCB2Y29tYmluZV9mMzIoZmxvYXQzMngyX3QgbG93LCBmbG9hdDMyeDJfdCBoaWdoKQoreworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9tbV91bnBhY2tsb19lcGk2NChfcE0xMjhpKGxvdyksIF9wTTEyOGkoaGlnaCkgKTsKKyAgICByZXR1cm4gX00xMjgocmVzKTsKK30KKwordWludDh4MTZfdCAgIHZjb21iaW5lX3U4KHVpbnQ4eDhfdCBsb3csIHVpbnQ4eDhfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2Y29tYmluZV91OCB2Y29tYmluZV9zOAorCit1aW50MTZ4OF90ICAgdmNvbWJpbmVfdTE2KHVpbnQxNng0X3QgbG93LCB1aW50MTZ4NF90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZjb21iaW5lX3UxNiB2Y29tYmluZV9zMTYKKwordWludDMyeDRfdCAgIHZjb21iaW5lX3UzMih1aW50MzJ4Ml90IGxvdywgdWludDMyeDJfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2Y29tYmluZV91MzIgdmNvbWJpbmVfczMyCisKK3VpbnQ2NHgyX3QgICB2Y29tYmluZV91NjQodWludDY0eDFfdCBsb3csIHVpbnQ2NHgxX3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmNvbWJpbmVfdTY0IHZjb21iaW5lX3M2NAorCitwb2x5OHgxNl90ICAgdmNvbWJpbmVfcDgocG9seTh4OF90IGxvdywgcG9seTh4OF90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZjb21iaW5lX3A4IHZjb21iaW5lX3U4CisKK3BvbHkxNng4X3QgICB2Y29tYmluZV9wMTYocG9seTE2eDRfdCBsb3csIHBvbHkxNng0X3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmNvbWJpbmVfcDE2IHZjb21iaW5lX3UxNgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKiBTcGxpdHRpbmcgdmVjdG9ycyAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKiogR2V0IGhpZ2ggcGFydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vVGhlc2UgaW50cmluc2ljcyBzcGxpdCBhIDEyOCBiaXQgdmVjdG9yIGludG8gMiBjb21wb25lbnQgNjQgYml0IHZlY3RvcnMKK2ludDh4OF90IHZnZXRfaGlnaF9zOChpbnQ4eDE2X3QgYSk7IC8vIFZNT1YgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdmdldF9oaWdoX3M4KGludDh4MTZfdCBhKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9tbV91bnBhY2toaV9lcGk2NChhLGEpOyAvL1NTRTIKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQxNng0X3QgdmdldF9oaWdoX3MxNihpbnQxNng4X3QgYSk7IC8vIFZNT1YgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZnZXRfaGlnaF9zMTYoaW50MTZ4OF90IGEpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9ICBfbW1fdW5wYWNraGlfZXBpNjQoYSxhKTsgLy9TU0UyCisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MzJ4Ml90IHZnZXRfaGlnaF9zMzIoaW50MzJ4NF90IGEpOyAvLyBWTU9WIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2Z2V0X2hpZ2hfczMyKGludDMyeDRfdCBhKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSAgX21tX3VucGFja2hpX2VwaTY0KGEsYSk7IC8vU1NFMgorICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDY0eDFfdCB2Z2V0X2hpZ2hfczY0KGludDY0eDJfdCBhKTsgLy8gVk1PViBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgxX3QgdmdldF9oaWdoX3M2NChpbnQ2NHgyX3QgYSkKK3sKKyAgICBpbnQ2NHgxX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gIF9tbV91bnBhY2toaV9lcGk2NChhLGEpOyAvL1NTRTIKKyAgICByZXR1cm42NChyZXMpOworfQorCitmbG9hdDE2eDRfdCB2Z2V0X2hpZ2hfZjE2KGZsb2F0MTZ4OF90IGEpOyAvLyBWTU9WIGQwLGQwCisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseQorCitmbG9hdDMyeDJfdCB2Z2V0X2hpZ2hfZjMyKGZsb2F0MzJ4NF90IGEpOyAvLyBWTU9WIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZnZXRfaGlnaF9mMzIoZmxvYXQzMng0X3QgYSkKK3sKKyAgICBfX20xMjhpIHJlczsKKyAgICBfX202NF8xMjggcmVzNjQ7CisgICAgcmVzID0gX21tX3VucGFja2hpX2VwaTY0KF9NMTI4aShhKSxfTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK3VpbnQ4eDhfdCB2Z2V0X2hpZ2hfdTgodWludDh4MTZfdCBhKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2Z2V0X2hpZ2hfdTggdmdldF9oaWdoX3M4CisKK3VpbnQxNng0X3QgdmdldF9oaWdoX3UxNih1aW50MTZ4OF90IGEpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZnZXRfaGlnaF91MTYgdmdldF9oaWdoX3MxNgorCit1aW50MzJ4Ml90IHZnZXRfaGlnaF91MzIodWludDMyeDRfdCBhKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2Z2V0X2hpZ2hfdTMyIHZnZXRfaGlnaF9zMzIKKwordWludDY0eDFfdCB2Z2V0X2hpZ2hfdTY0KHVpbnQ2NHgyX3QgYSk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmdldF9oaWdoX3U2NCB2Z2V0X2hpZ2hfczY0CisKK3BvbHk4eDhfdCB2Z2V0X2hpZ2hfcDgocG9seTh4MTZfdCBhKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2Z2V0X2hpZ2hfcDggdmdldF9oaWdoX3U4CisKK3BvbHkxNng0X3QgdmdldF9oaWdoX3AxNihwb2x5MTZ4OF90IGEpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZnZXRfaGlnaF9wMTYgdmdldF9oaWdoX3UxNgorCisvLyoqKioqKioqKioqKioqKioqKioqKiogR2V0IGxvdyBwYXJ0ICoqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdmdldF9sb3dfczgoaW50OHgxNl90IGEpOyAvLyBWTU9WIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZnZXRfbG93X3M4KGludDh4MTZfdCBhKSAvLyBWTU9WIGQwLGQwCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KGEpOworfQorCitpbnQxNng0X3QgdmdldF9sb3dfczE2KGludDE2eDhfdCBhKTsgLy8gVk1PViBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdmdldF9sb3dfczE2KGludDE2eDhfdCBhKSAvLyBWTU9WIGQwLGQwCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KGEpOworfQorCitpbnQzMngyX3QgdmdldF9sb3dfczMyKGludDMyeDRfdCBhKTsgLy8gVk1PViBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdmdldF9sb3dfczMyKGludDMyeDRfdCBhKSAvLyBWTU9WIGQwLGQwCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KGEpOworfQorCitpbnQ2NHgxX3QgdmdldF9sb3dfczY0KGludDY0eDJfdCBhKTsgLy8gVk1PViBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgxX3QgdmdldF9sb3dfczY0KGludDY0eDJfdCBhKSAvLyBWTU9WIGQwLGQwCit7CisgICAgaW50NjR4MV90IHJlczY0OworICAgIHJldHVybjY0IChhKTsKK30KKworZmxvYXQxNng0X3QgdmdldF9sb3dfZjE2KGZsb2F0MTZ4OF90IGEpOyAvLyBWTU9WIGQwLGQwCisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseQorCitmbG9hdDMyeDJfdCB2Z2V0X2xvd19mMzIoZmxvYXQzMng0X3QgYSk7IC8vIFZNT1YgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3QgdmdldF9sb3dfZjMyKGZsb2F0MzJ4NF90IGEpCit7CisgICAgZmxvYXQzMngyX3QgcmVzNjQ7CisgICAgX002NGYocmVzNjQsIGEpOworICAgIHJldHVybiByZXM2NDsKK30KKwordWludDh4OF90IHZnZXRfbG93X3U4KHVpbnQ4eDE2X3QgYSk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmdldF9sb3dfdTggdmdldF9sb3dfczgKKwordWludDE2eDRfdCB2Z2V0X2xvd191MTYodWludDE2eDhfdCBhKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2Z2V0X2xvd191MTYgdmdldF9sb3dfczE2CisKK3VpbnQzMngyX3QgdmdldF9sb3dfdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmdldF9sb3dfdTMyIHZnZXRfbG93X3MzMgorCit1aW50NjR4MV90IHZnZXRfbG93X3U2NCh1aW50NjR4Ml90IGEpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZnZXRfbG93X3U2NCB2Z2V0X2xvd19zNjQKKworcG9seTh4OF90IHZnZXRfbG93X3A4KHBvbHk4eDE2X3QgYSk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmdldF9sb3dfcDggdmdldF9sb3dfdTgKKworcG9seTE2eDRfdCB2Z2V0X2xvd19wMTYocG9seTE2eDhfdCBhKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2Z2V0X2xvd19wMTYgdmdldF9sb3dfczE2CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqIENvbnZlcnRpbmcgdmVjdG9ycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKiogQ29udmVydCBmcm9tIGZsb2F0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gbmVlZCB0byBzZXQgX01NX1NFVF9ST1VORElOR19NT0RFICggeCkgYWNjb3JkaW5nbHkKK2ludDMyeDJfdCAgIHZjdnRfczMyX2YzMihmbG9hdDMyeDJfdCBhKTsgLy8gVkNWVC5TMzIuRjMyIGQwLCBkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgICB2Y3Z0X3MzMl9mMzIoZmxvYXQzMngyX3QgYSkKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gIF9tbV9jdnR0cHNfZXBpMzIoX3BNMTI4KGEpKTsgLy91c2UgbG93IDY0IGJpdHMgb2YgcmVzdWx0IG9ubHkKKyAgICByZXR1cm42NChyZXMpOworfQorCit1aW50MzJ4Ml90IHZjdnRfdTMyX2YzMihmbG9hdDMyeDJfdCBhKTsgLy8gVkNWVC5VMzIuRjMyIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZjdnRfdTMyX2YzMihmbG9hdDMyeDJfdCBhKQoreworICAgIC8vbWF5IGJlIG5vdCBlZmZlY3RpdmUgY29tcGFyZWQgd2l0aCBhIHNlcmlhbCBTSU1EIHNvbHV0aW9uCisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2Y3Z0cV91MzJfZjMyKF9wTTEyOChhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MzJ4NF90ICAgdmN2dHFfczMyX2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVkNWVC5TMzIuRjMyIHEwLCBxMAorI2RlZmluZSB2Y3Z0cV9zMzJfZjMyIF9tbV9jdnR0cHNfZXBpMzIKKwordWludDMyeDRfdCB2Y3Z0cV91MzJfZjMyKGZsb2F0MzJ4NF90IGEpOyAvLyBWQ1ZULlUzMi5GMzIgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmN2dHFfdTMyX2YzMihmbG9hdDMyeDRfdCBhKSAvLyBWQ1ZULlUzMi5GMzIgcTAsIHEwCit7CisgICAgLy9ObyBzaW5nbGUgaW5zdHJ1Y3Rpb24gU1NFIHNvbHV0aW9uICBidXQgd2UgY291bGQgaW1wbGVtZW50IGl0IGFzIGZvbGxvd2luZzoKKyAgICBfX20xMjhpIHJlc2k7CisgICAgX19tMTI4IHplcm8sICBtYXNrLCBhX3BvcywgbWFza19mX21heF9zaSwgcmVzOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQzMl90IGM3ZmZmZmZmZls0XSA9IHsweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDdmZmZmZmZmfTsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fcHMoKTsKKyAgICBtYXNrID0gX21tX2NtcGd0X3BzKGEsIHplcm8pOworICAgIGFfcG9zID0gX21tX2FuZF9wcyhhLCBtYXNrKTsKKyAgICBtYXNrX2ZfbWF4X3NpID0gX21tX2NtcGd0X3BzKGFfcG9zLCooX19tMTI4KiljN2ZmZmZmZmYpOworICAgIHJlcyA9ICBfbW1fc3ViX3BzKGFfcG9zLCBtYXNrX2ZfbWF4X3NpKTsgLy9pZiB0aGUgaW5wdXQgZml0cyB0byBzaWduZWQgd2UgZG9uJ3Qgc3VidHJhY3QgYW55dGhpbmcKKyAgICByZXNpID0gX21tX2N2dHRwc19lcGkzMihyZXMpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTMyKHJlc2ksICooX19tMTI4aSopJm1hc2tfZl9tYXhfc2kpOworfQorCisvLyAqKioqKiBDb252ZXJ0IHRvIHRoZSBmaXhlZCBwb2ludCAgd2l0aCAgIHRoZSBudW1iZXIgb2YgZnJhY3Rpb24gYml0cyBzcGVjaWZpZWQgYnkgYiAqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQzMngyX3QgdmN2dF9uX3MzMl9mMzIoZmxvYXQzMngyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVkNWVC5TMzIuRjMyIGQwLCBkMCwgIzMyCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2Y3Z0X25fczMyX2YzMihmbG9hdDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZjdnRxX25fczMyX2YzMihfcE0xMjgoYSksYikpOworfQorCit1aW50MzJ4Ml90IHZjdnRfbl91MzJfZjMyKGZsb2F0MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZDVlQuVTMyLkYzMiBkMCwgZDAsICMzMgorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZjdnRfbl91MzJfZjMyKGZsb2F0MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczsKKyAgICBmbG9hdCBjb252Y29uc3Q7CisgICAgY29udmNvbnN0ID0gKGZsb2F0KSgodWludDMyX3QpMSA8PCBiKTsKKyAgICByZXMubTY0X3UzMlswXSA9ICh1aW50MzJfdCkgKGEubTY0X2YzMlswXSAqIGNvbnZjb25zdCk7CisgICAgcmVzLm02NF91MzJbMV0gPSAodWludDMyX3QpIChhLm02NF9mMzJbMV0gKiBjb252Y29uc3QpOworICAgIHJldHVybiByZXM7Cit9CisKK2ludDMyeDRfdCB2Y3Z0cV9uX3MzMl9mMzIoZmxvYXQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVkNWVC5TMzIuRjMyIHEwLCBxMCwgIzMyCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2Y3Z0cV9uX3MzMl9mMzIoZmxvYXQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKQoreworICAgIGZsb2F0IGNvbnZjb25zdDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDMyX3QgY21hc2tbXSA9IHsweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwfTsKKyAgICBfX20xMjggY2NvbnN0MTI4OworICAgIF9fbTEyOGkgbWFzaywgcmVzOworICAgIGNvbnZjb25zdCA9IChmbG9hdCkoMSA8PCBiKTsKKyAgICBjY29uc3QxMjggPSB2ZHVwcV9uX2YzMihjb252Y29uc3QpOworICAgIHJlcyA9ICBfbW1fY3Z0dHBzX2VwaTMyKF9tbV9tdWxfcHMoYSxjY29uc3QxMjgpKTsKKyAgICBtYXNrID0gX21tX2NtcGVxX2VwaTMyIChyZXMsICooX19tMTI4aSopY21hc2spOworICAgIHJldHVybiBfbW1feG9yX3NpMTI4IChyZXMsICBtYXNrKTsgLy9yZXMgc2F0dXJhdGVkIGZvciAweDgwMDAwMDAwCit9CisKK3VpbnQzMng0X3QgdmN2dHFfbl91MzJfZjMyKGZsb2F0MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZDVlQuVTMyLkYzMiBxMCwgcTAsICMzMgorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZjdnRxX25fdTMyX2YzMihmbG9hdDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpCit7CisgICAgZmxvYXQgY29udmNvbnN0OworICAgIF9fbTEyOCBjY29uc3QxMjg7CisgICAgY29udmNvbnN0ID0gKGZsb2F0KSgxIDw8IGIpOworICAgIGNjb25zdDEyOCA9IHZkdXBxX25fZjMyKGNvbnZjb25zdCk7CisgICAgcmV0dXJuIHZjdnRxX3UzMl9mMzIoX21tX211bF9wcyhhLGNjb25zdDEyOCkpOworfQorCisvLyoqKioqKioqKioqKioqKioqIENvbnZlcnQgdG8gZmxvYXQgKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitmbG9hdDMyeDJfdCB2Y3Z0X2YzMl9zMzIoaW50MzJ4Ml90IGEpOyAvLyBWQ1ZULkYzMi5TMzIgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZjdnRfZjMyX3MzMihpbnQzMngyX3QgYSkgLy91c2UgbG93IDY0IGJpdHMKK3sKKyAgICBmbG9hdDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9mMzJbMF0gPSAoZmxvYXQpIGEubTY0X2kzMlswXTsKKyAgICByZXMubTY0X2YzMlsxXSA9IChmbG9hdCkgYS5tNjRfaTMyWzFdOworICAgIHJldHVybiByZXM7Cit9CisKK2Zsb2F0MzJ4Ml90IHZjdnRfZjMyX3UzMih1aW50MzJ4Ml90IGEpOyAvLyBWQ1ZULkYzMi5VMzIgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZjdnRfZjMyX3UzMih1aW50MzJ4Ml90IGEpCit7CisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfZjMyWzBdID0gKGZsb2F0KSBhLm02NF91MzJbMF07CisgICAgcmVzLm02NF9mMzJbMV0gPSAoZmxvYXQpIGEubTY0X3UzMlsxXTsKKyAgICByZXR1cm4gcmVzOworfQorCitmbG9hdDMyeDRfdCB2Y3Z0cV9mMzJfczMyKGludDMyeDRfdCBhKTsgLy8gVkNWVC5GMzIuUzMyIHEwLCBxMAorI2RlZmluZSB2Y3Z0cV9mMzJfczMyKGEpIF9tbV9jdnRlcGkzMl9wcyhhKQorCitmbG9hdDMyeDRfdCB2Y3Z0cV9mMzJfdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZDVlQuRjMyLlUzMiBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3QgdmN2dHFfZjMyX3UzMih1aW50MzJ4NF90IGEpIC8vIFZDVlQuRjMyLlUzMiBxMCwgcTAKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbAorICAgIF9fbTEyOCB0d28xNiwgZkhpLCBmTG87CisgICAgX19tMTI4aSBoaSwgbG87CisgICAgdHdvMTYgPSBfbW1fc2V0MV9wcygoZmxvYXQpMHgxMDAwMCk7IC8vMl4xNgorICAgIC8vIEF2b2lkIGRvdWJsZSByb3VuZGluZyBieSBkb2luZyB0d28gZXhhY3QgY29udmVyc2lvbnMKKyAgICAvLyBvZiBoaWdoIGFuZCBsb3cgMTYtYml0IHNlZ21lbnRzCisgICAgaGkgPSBfbW1fc3JsaV9lcGkzMihhLCAxNik7CisgICAgbG8gPSBfbW1fc3JsaV9lcGkzMihfbW1fc2xsaV9lcGkzMihhLCAxNiksIDE2KTsKKyAgICBmSGkgPSBfbW1fbXVsX3BzKF9tbV9jdnRlcGkzMl9wcyhoaSksIHR3bzE2KTsKKyAgICBmTG8gPSBfbW1fY3Z0ZXBpMzJfcHMobG8pOworICAgIC8vIGRvIHNpbmdsZSByb3VuZGluZyBhY2NvcmRpbmcgdG8gY3VycmVudCByb3VuZGluZyBtb2RlCisgICAgcmV0dXJuIF9tbV9hZGRfcHMoZkhpLCBmTG8pOworfQorCisvLyAqKioqKiBDb252ZXJ0IHRvIHRoZSBmbG9hdCBmcm9tIGZpeGVkIHBvaW50ICB3aXRoICAgdGhlIG51bWJlciBvZiBmcmFjdGlvbiBiaXRzIHNwZWNpZmllZCBieSBiICoqKioqKioqKioqCitmbG9hdDMyeDJfdCB2Y3Z0X25fZjMyX3MzMihpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVkNWVC5GMzIuUzMyIGQwLCBkMCwgIzMyCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZjdnRfbl9mMzJfczMyKGludDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpCit7CisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIGZsb2F0IGNvbnZjb25zdDsKKyAgICBjb252Y29uc3QgPSAoZmxvYXQpKDEuIC8gKCh1aW50MzJfdCkxIDw8IGIpKTsKKyAgICByZXMubTY0X2YzMlswXSA9ICBhLm02NF9pMzJbMF0gKiBjb252Y29uc3Q7CisgICAgcmVzLm02NF9mMzJbMV0gPSBhLm02NF9pMzJbMV0gKiBjb252Y29uc3Q7CisgICAgcmV0dXJuIHJlczsKK30KKworZmxvYXQzMngyX3QgdmN2dF9uX2YzMl91MzIodWludDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWQ1ZULkYzMi5VMzIgZDAsIGQwLCAjMzIKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3QgdmN2dF9uX2YzMl91MzIodWludDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpIC8vIFZDVlQuRjMyLlUzMiBkMCwgZDAsICMzMgoreworICAgIGZsb2F0MzJ4Ml90IHJlczsKKyAgICBmbG9hdCBjb252Y29uc3Q7CisgICAgY29udmNvbnN0ID0gKGZsb2F0KSgxLiAvICgodWludDMyX3QpMSA8PCBiKSk7CisgICAgcmVzLm02NF9mMzJbMF0gPSAgYS5tNjRfdTMyWzBdICogY29udmNvbnN0OworICAgIHJlcy5tNjRfZjMyWzFdID0gYS5tNjRfdTMyWzFdICogY29udmNvbnN0OworICAgIHJldHVybiByZXM7Cit9CisKK2Zsb2F0MzJ4NF90IHZjdnRxX25fZjMyX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVkNWVC5GMzIuUzMyIHEwLCBxMCwgIzMyCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZjdnRxX25fZjMyX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKQoreworICAgIGZsb2F0IGNvbnZjb25zdDsKKyAgICBfX20xMjggY2NvbnN0MTI4LCBhZjsKKyAgICBjb252Y29uc3QgPSAoZmxvYXQpKDEuIC8gKCh1aW50MzJfdCkxIDw8IGIpKTsKKyAgICBhZiA9IF9tbV9jdnRlcGkzMl9wcyhhKTsKKyAgICBjY29uc3QxMjggPSB2ZHVwcV9uX2YzMihjb252Y29uc3QpOworICAgIHJldHVybiBfbW1fbXVsX3BzKGFmLGNjb25zdDEyOCk7Cit9CisKK2Zsb2F0MzJ4NF90IHZjdnRxX25fZjMyX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZDVlQuRjMyLlUzMiBxMCwgcTAsICMzMgorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDRfdCB2Y3Z0cV9uX2YzMl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpCit7CisgICAgZmxvYXQgY29udmNvbnN0OworICAgIF9fbTEyOCBjY29uc3QxMjgsIGFmOworICAgIGNvbnZjb25zdCA9IChmbG9hdCkoMS4gLyAoMSA8PCBiKSk7CisgICAgYWYgPSB2Y3Z0cV9mMzJfdTMyKGEpOworICAgIGNjb25zdDEyOCA9IHZkdXBxX25fZjMyKGNvbnZjb25zdCk7CisgICAgcmV0dXJuIF9tbV9tdWxfcHMoYWYsY2NvbnN0MTI4KTsKK30KKworLy8qKioqKioqKioqKioqKkNvbnZlcnQgYmV0d2VlbiBmbG9hdHMgKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitmbG9hdDE2eDRfdCB2Y3Z0X2YxNl9mMzIoZmxvYXQzMng0X3QgYSk7IC8vIFZDVlQuRjE2LkYzMiBkMCwgcTAKKy8vSW50ZWwgU0lNRCBkb2Vzbid0IHN1cHBvcnQgMTZiaXRzIGZsb2F0cyBjdXJlbnRseQorCitmbG9hdDMyeDRfdCB2Y3Z0X2YzMl9mMTYoZmxvYXQxNng0X3QgYSk7IC8vIFZDVlQuRjMyLkYxNiBxMCwgZDAKKy8vSW50ZWwgU0lNRCBkb2Vzbid0IHN1cHBvcnQgMTZiaXRzIGZsb2F0cyBjdXJlbnRseSwgdGhlIG9ubHkgc29sdXRpb24gaXMgdG8gc3RvcmUgMTZiaXQgZmxvYXRzIGFuZCBsb2FkIGFzIDMyIGJpdHMKKworLy8qKioqKioqKioqKipWZWN0b3IgbmFycm93IGludGVnZXIgY29udmVyc2lvbiAodHJ1bmNhdGlvbikgKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZtb3ZuX3MxNihpbnQxNng4X3QgYSk7IC8vIFZNT1ZOLkkxNiBkMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2bW92bl9zMTYoaW50MTZ4OF90IGEpIC8vIFZNT1ZOLkkxNiBkMCxxMAoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMTZfZXZlbl9vZGRbMTZdID0geyAwLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1IH07CisgICAgcmVzID0gX21tX3NodWZmbGVfZXBpOCAoYSwgKihfX20xMjhpKikgbWFzazhfMTZfZXZlbl9vZGQpOyAvL3VzZSA2NCBsb3cgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MTZ4NF90IHZtb3ZuX3MzMihpbnQzMng0X3QgYSk7IC8vIFZNT1ZOLkkzMiBkMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3Qgdm1vdm5fczMyKGludDMyeDRfdCBhKSAvLyBWTU9WTi5JMzIgZDAscTAKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF8zMl9ldmVuX29kZFsxNl0gPSB7IDAsMSwgNCw1LCA4LDksICAxMiwxMywgIDIsMywgNiw3LDEwLDExLDE0LDE1fTsKKyAgICByZXMgPSBfbW1fc2h1ZmZsZV9lcGk4IChhLCAqKF9fbTEyOGkqKSBtYXNrOF8zMl9ldmVuX29kZCk7IC8vdXNlIDY0IGxvdyBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQzMngyX3Qgdm1vdm5fczY0KGludDY0eDJfdCBhKTsgLy8gVk1PVk4uSTY0IGQwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2bW92bl9zNjQoaW50NjR4Ml90IGEpCit7CisgICAgLy9tYXkgYmUgbm90IGVmZmVjdGl2ZSBjb21wYXJlZCB3aXRoIGEgc2VyaWFsIGltcGxlbWVudGF0aW9uCisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9tbV9zaHVmZmxlX2VwaTMyIChhLCAwIHwgKDIgPDwgMikgfCAoMSA8PCA0KSB8ICgzIDw8IDYpKTsgLy91c2UgNjQgbG93IGJpdHMgb25seSwgX01NX1NIVUZGTEUoMywgMSwgMiwgMCkKKyAgICByZXR1cm42NChyZXMpOworfQorCit1aW50OHg4X3Qgdm1vdm5fdTE2KHVpbnQxNng4X3QgYSk7IC8vIFZNT1ZOLkkxNiBkMCxxMAorI2RlZmluZSB2bW92bl91MTYgdm1vdm5fczE2CisKK3VpbnQxNng0X3Qgdm1vdm5fdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZNT1ZOLkkzMiBkMCxxMAorI2RlZmluZSB2bW92bl91MzIgdm1vdm5fczMyCisKK3VpbnQzMngyX3Qgdm1vdm5fdTY0KHVpbnQ2NHgyX3QgYSk7IC8vIFZNT1ZOLkk2NCBkMCxxMAorI2RlZmluZSB2bW92bl91NjQgdm1vdm5fczY0CisKKy8vKioqKioqKioqKioqKioqKiBWZWN0b3IgbG9uZyBtb3ZlICAgKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDE2eDhfdCB2bW92bF9zOChpbnQ4eDhfdCBhKTsgLy8gVk1PVkwuUzggcTAsZDAKKyNkZWZpbmUgdm1vdmxfczgoYSkgX01NX0NWVEVQSThfRVBJMTYoX3BNMTI4aShhKSkgLy9TU0U0LjEKKworaW50MzJ4NF90IHZtb3ZsX3MxNihpbnQxNng0X3QgYSk7IC8vIFZNT1ZMLlMxNiBxMCxkMAorI2RlZmluZSB2bW92bF9zMTYoYSkgX01NX0NWVEVQSTE2X0VQSTMyKF9wTTEyOGkoYSkpIC8vU1NFNC4xCisKK2ludDY0eDJfdCB2bW92bF9zMzIoaW50MzJ4Ml90IGEpOyAvLyBWTU9WTC5TMzIgcTAsZDAKKyNkZWZpbmUgdm1vdmxfczMyKGEpICBfTU1fQ1ZURVBJMzJfRVBJNjQoX3BNMTI4aShhKSkgLy9TU0U0LjEKKwordWludDE2eDhfdCB2bW92bF91OCh1aW50OHg4X3QgYSk7IC8vIFZNT1ZMLlU4IHEwLGQwCisjZGVmaW5lIHZtb3ZsX3U4KGEpIF9NTV9DVlRFUFU4X0VQSTE2KF9wTTEyOGkoYSkpIC8vU1NFNC4xCisKK3VpbnQzMng0X3Qgdm1vdmxfdTE2KHVpbnQxNng0X3QgYSk7IC8vIFZNT1ZMLnMxNiBxMCxkMAorI2RlZmluZSB2bW92bF91MTYoYSkgX01NX0NWVEVQVTE2X0VQSTMyKF9wTTEyOGkoYSkpIC8vU1NFNC4xCisKK3VpbnQ2NHgyX3Qgdm1vdmxfdTMyKHVpbnQzMngyX3QgYSk7IC8vIFZNT1ZMLlUzMiBxMCxkMAorI2RlZmluZSB2bW92bF91MzIoYSkgIF9NTV9DVlRFUFUzMl9FUEk2NChfcE0xMjhpKGEpKSAvL1NTRTQuMQorCisvLyoqKioqKioqKioqKipWZWN0b3Igc2F0dXJhdGluZyBuYXJyb3cgaW50ZWdlcioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCAgIHZxbW92bl9zMTYoaW50MTZ4OF90IGEpOyAvLyBWUU1PVk4uUzE2IGQwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90ICAgdnFtb3ZuX3MxNihpbnQxNng4X3QgYSkKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfbW1fcGFja3NfZXBpMTYoYSwgYSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MTZ4NF90ICAgdnFtb3ZuX3MzMihpbnQzMng0X3QgYSk7IC8vIFZRTU9WTi5TMzIgZDAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90ICAgdnFtb3ZuX3MzMihpbnQzMng0X3QgYSkKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gX21tX3BhY2tzX2VwaTMyKGEsIGEpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDMyeDJfdCB2cW1vdm5fczY0KGludDY0eDJfdCBhKTsgLy8gVlFNT1ZOLlM2NCBkMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMngyX3QgdnFtb3ZuX3M2NChpbnQ2NHgyX3QgYSksX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkgLy9ubyBlZmZlY3RpdmUgU0lNRCBzb2x1dGlvbgoreworICAgIGludDMyeDJfdCByZXM7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDY0X3QgYXRtcFsyXTsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgIGlmKGF0bXBbMF0+U0lOVF9NQVgpIGF0bXBbMF0gPSBTSU5UX01BWDsKKyAgICBpZihhdG1wWzBdPFNJTlRfTUlOKSBhdG1wWzBdID0gU0lOVF9NSU47CisgICAgaWYoYXRtcFsxXT5TSU5UX01BWCkgYXRtcFsxXSA9IFNJTlRfTUFYOworICAgIGlmKGF0bXBbMV08U0lOVF9NSU4pIGF0bXBbMV0gPSBTSU5UX01JTjsKKyAgICByZXMubTY0X2kzMlswXSA9IChpbnQzMl90KWF0bXBbMF07CisgICAgcmVzLm02NF9pMzJbMV0gPSAoaW50MzJfdClhdG1wWzFdOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2cW1vdm5fdTE2KHVpbnQxNng4X3QgYSk7IC8vIFZRTU9WTi5zMTYgZDAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZxbW92bl91MTYodWludDE2eDhfdCBhKSAvLyBWUU1PVk4uczE2IGQwLHEwCit7CisgICAgLy9ubyB1aW50MTYgdG8gdWludDggY29udmVyc2lvbiBpbiBTU0UsIG5lZWQgdHJ1bmNhdGUgdG8gbWF4IHNpZ25lZCBmaXJzdAorICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIGM3ZmZmLCBhX3RydW5jOworICAgIGM3ZmZmID0gX21tX3NldDFfZXBpMTYgKDB4N2ZmZik7IC8vIDE1LXRoIGJpdCBzZXQgdG8gemVybworICAgIGFfdHJ1bmMgPSAgX21tX2FuZF9zaTEyOChhLCAgYzdmZmYpOyAvLyBhIHRydW5jYXRlZCB0byBtYXggc2lnbmVkCisgICAgYV90cnVuYyA9ICBfbW1fcGFja3VzX2VwaTE2IChhX3RydW5jLCBhX3RydW5jKTsgLy91c2UgbG93IDY0Yml0cyBvbmx5CisgICAgcmV0dXJuNjQoYV90cnVuYyk7Cit9CisKK3VpbnQxNng0X3QgdnFtb3ZuX3UzMih1aW50MzJ4NF90IGEpOyAvLyBWUU1PVk4uVTMyIGQwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnFtb3ZuX3UzMih1aW50MzJ4NF90IGEpIC8vIFZRTU9WTi5VMzIgZDAscTAKK3sKKyAgICAvL25vIHVpbnQzMiB0byB1aW50MTYgY29udmVyc2lvbiBpbiBTU0UsIG5lZWQgdHJ1bmNhdGUgdG8gbWF4IHNpZ25lZCBmaXJzdAorICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBjN2ZmZmZmZmYsIGFfdHJ1bmM7CisgICAgYzdmZmZmZmZmID0gX21tX3NldDFfZXBpMzIoKHVpbnQzMl90KTB4N2ZmZmZmZmYpOyAvLyAzMS10aCBiaXQgc2V0IHRvIHplcm8KKyAgICBhX3RydW5jID0gIF9tbV9hbmRfc2kxMjgoYSwgIGM3ZmZmZmZmZik7IC8vIGEgdHJ1bmNhdGVkIHRvIG1heCBzaWduZWQKKyAgICBhX3RydW5jID0gX01NX1BBQ0tVUzFfRVBJMzIgKGFfdHJ1bmMpOyAvL3VzZSBsb3cgNjRiaXRzIG9ubHkKKyAgICByZXR1cm42NChhX3RydW5jKTsKK30KKwordWludDMyeDJfdCB2cW1vdm5fdTY0KHVpbnQ2NHgyX3QgYSk7IC8vIFZRTU9WTi5VNjQgZDAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2cW1vdm5fdTY0KHVpbnQ2NHgyX3QgYSkKK3sKKyAgICAvL3NlcmlhbCBzb2x1dGlvbiBtYXkgYmUgZmFzdGVyCisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlc19oaSwgbWFzazsKKyAgICBtYXNrID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICByZXNfaGkgPSBfbW1fc3JsaV9lcGk2NChhLCAzMik7CisgICAgcmVzX2hpID0gX21tX2NtcGVxX2VwaTMyKHJlc19oaSwgbWFzayk7CisgICAgbWFzayA9IF9tbV9jbXBlcV9lcGkzMihtYXNrLG1hc2spOyAvL2FsbCBmZmYKKyAgICBtYXNrID0gX21tX2FuZG5vdF9zaTEyOChyZXNfaGksbWFzayk7IC8vaW52ZXJzdCByZXNfaGkgdG8gZ2V0ID4zMiBiaXRzIG51bWJlcnMKKyAgICByZXNfaGkgPSBfbW1fb3Jfc2kxMjgoYSwgbWFzayk7CisgICAgcmVzX2hpID0gX21tX3NodWZmbGVfZXBpMzIocmVzX2hpLCAwIHwgKDIgPDwgMikgfCAoMSA8PCA0KSB8ICgzIDw8IDYpKTsgLy9zaHVmZmxlIHRoZSBkYXRhIHRvIGdldCAyIDMyLWJpdHMKKyAgICByZXR1cm42NChyZXNfaGkpOworfQorLy8qKioqKioqKioqKioqIFZlY3RvciBzYXR1cmF0aW5nIG5hcnJvdyBpbnRlZ2VyIHNpZ25lZC0+dW5zaWduZWQgKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3VpbnQ4eDhfdCB2cW1vdnVuX3MxNihpbnQxNng4X3QgYSk7IC8vIFZRTU9WVU4uUzE2IGQwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2cW1vdnVuX3MxNihpbnQxNng4X3QgYSkKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gX21tX3BhY2t1c19lcGkxNihhLCBhKTsgLy91c2UgbG93IDY0Yml0cyBvbmx5CisgICAgcmV0dXJuNjQocmVzKTsKK30KKwordWludDE2eDRfdCB2cW1vdnVuX3MzMihpbnQzMng0X3QgYSk7IC8vIFZRTU9WVU4uUzMyIGQwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnFtb3Z1bl9zMzIoaW50MzJ4NF90IGEpCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfTU1fUEFDS1VTMV9FUEkzMihhKTsgLy91c2UgbG93IDY0Yml0cyBvbmx5CisgICAgcmV0dXJuNjQocmVzKTsKK30KKwordWludDMyeDJfdCB2cW1vdnVuX3M2NChpbnQ2NHgyX3QgYSk7IC8vIFZRTU9WVU4uUzY0IGQwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnFtb3Z1bl9zNjQoaW50NjR4Ml90IGEpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlc19oaSxyZXNfbG8sIHplcm8sIGNtcDsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICByZXNfaGkgPSBfbW1fc3JsaV9lcGk2NChhLCAgMzIpOworICAgIGNtcCA9IF9tbV9jbXBndF9lcGkzMih6ZXJvLCByZXNfaGkpOyAvL2lmIGNtcDwwIHRoZSByZXN1bHQgc2hvdWxkIGJlIHplcm8KKyAgICByZXNfbG8gPSBfbW1fYW5kbm90X3NpMTI4KGNtcCxhKTsgLy9pZiBjbXAgemVybyAtIGRvIG5vdGhpbmcsIG90aGVyd2lzZSBjbXAgPDAgIGFuZCB0aGUgcmVzdWx0IGlzIDAKKyAgICBjbXAgPSBfbW1fY21wZ3RfZXBpMzIocmVzX2hpLHplcm8pOyAvL2lmIGNtcCBwb3NpdGl2ZQorICAgIHJlc19sbyA9ICBfbW1fb3Jfc2kxMjgocmVzX2xvLCBjbXApOyAvL2lmIGNtcCBwb3NpdGl2ZSB3ZSBhcmUgb3V0IG9mIDMyYml0cyBuZWVkIHRvIHNhdHVyYWF0ZSB0byAweGZmZmZmZmZmCisgICAgcmVzX2xvID0gX21tX3NodWZmbGVfZXBpMzIocmVzX2xvLCAwIHwgKDIgPDwgMikgfCAoMSA8PCA0KSB8ICgzIDw8IDYpKTsgLy9zaHVmZmxlIHRoZSBkYXRhIHRvIGdldCAyIDMyLWJpdHMKKyAgICByZXR1cm42NChyZXNfbG8pOworfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKiBUYWJsZSBsb29rIHVwICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9WVEJMIChWZWN0b3IgVGFibGUgTG9va3VwKSB1c2VzIGJ5dGUgaW5kZXhlcyBpbiBhIGNvbnRyb2wgdmVjdG9yIHRvIGxvb2sgdXAgYnl0ZSB2YWx1ZXMKKy8vaW4gYSB0YWJsZSBhbmQgZ2VuZXJhdGUgYSBuZXcgdmVjdG9yLiBJbmRleGVzIG91dCBvZiByYW5nZSByZXR1cm4gMC4KKy8vZm9yIEludGVsIFNJTUQgd2UgbmVlZCB0byBzZXQgdGhlIE1TQiB0byAxIGZvciB6ZXJvIHJldHVybgordWludDh4OF90IHZ0YmwxX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwfSwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZ0YmwxX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBjNywgbWFza2d0LCBibWFzaywgYjEyODsKKyAgICBjNyA9IF9tbV9zZXQxX2VwaTggKDcpOworICAgIGIxMjggPSBfcE0xMjhpKGIpOworICAgIG1hc2tndCA9IF9tbV9jbXBndF9lcGk4KGIxMjgsYzcpOworICAgIGJtYXNrID0gX21tX29yX3NpMTI4KGIxMjgsbWFza2d0KTsKKyAgICBibWFzayA9IF9tbV9zaHVmZmxlX2VwaTgoX3BNMTI4aShhKSxibWFzayk7CisgICAgcmV0dXJuNjQoYm1hc2spOworfQorCitpbnQ4eDhfdCB2dGJsMV9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwfSwgZDAKKyNkZWZpbmUgdnRibDFfczggdnRibDFfdTgKKworcG9seTh4OF90IHZ0YmwxX3A4KHBvbHk4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwfSwgZDAKKyNkZWZpbmUgdnRibDFfcDggdnRibDFfdTgKKworLy9TcGVjaWFsIHRyaWNrIHRvIGF2b2lkIF9fZGVjbHNwZWMoYWxpZ24oJzgnKSkgd29uJ3QgYmUgYWxpZ25lZCIgZXJyb3IKKy8vdWludDh4OF90IHZ0YmwyX3U4KHVpbnQ4eDh4Ml90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxfSwgZDAKK3VpbnQ4eDhfdCB2dGJsMl91OF9wdHIodWludDh4OHgyX3QqIGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxfSwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZ0YmwyX3U4X3B0cih1aW50OHg4eDJfdCogYSwgdWludDh4OF90IGIpCit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYzE1LCBhMDEsIG1hc2tndDE1LCBibWFzaywgYjEyODsKKyAgICBjMTUgPSBfbW1fc2V0MV9lcGk4ICgxNSk7CisgICAgYjEyOCA9IF9wTTEyOGkoYik7CisgICAgbWFza2d0MTUgPSBfbW1fY21wZ3RfZXBpOChiMTI4LGMxNSk7CisgICAgYm1hc2sgPSBfbW1fb3Jfc2kxMjgoYjEyOCwgbWFza2d0MTUpOworICAgIGEwMSA9IF9tbV91bnBhY2tsb19lcGk2NChfcE0xMjhpKGEtPnZhbFswXSksIF9wTTEyOGkoYS0+dmFsWzFdKSk7CisgICAgYTAxID0gIF9tbV9zaHVmZmxlX2VwaTgoYTAxLCBibWFzayk7CisgICAgcmV0dXJuNjQoYTAxKTsKK30KKyNkZWZpbmUgdnRibDJfdTgoYSwgYikgdnRibDJfdThfcHRyKCZhLCBiKQorCisvL2ludDh4OF90IHZ0YmwyX3M4KGludDh4OHgyX3QgYSwgaW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMX0sIGQwCisjZGVmaW5lIHZ0YmwyX3M4IHZ0YmwyX3U4CisKKy8vcG9seTh4OF90IHZ0YmwyX3A4KHBvbHk4eDh4Ml90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxfSwgZDAKKyNkZWZpbmUgdnRibDJfcDggdnRibDJfdTgKKworLy9TcGVjaWFsIHRyaWNrIHRvIGF2b2lkIF9fZGVjbHNwZWMoYWxpZ24oJzE2JykpIHdvbid0IGJlIGFsaWduZWQiIGVycm9yCisvL3VpbnQ4eDhfdCB2dGJsM191OCh1aW50OHg4eDNfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMSwgZDJ9LCBkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnRibDNfdThfcHRyKHVpbnQ4eDh4M190KiBhLCB1aW50OHg4X3QgYikKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbAorICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIGMxNSwgYzIzLCBtYXNrZ3QyMywgYm1hc2ssIG1hc2tndDE1LCBzaDAsIHNoMSwgYTAxLCBiMTI4OworICAgIGMxNSA9IF9tbV9zZXQxX2VwaTggKDE1KTsKKyAgICBjMjMgPSBfbW1fc2V0MV9lcGk4ICgyMyk7CisgICAgYjEyOCA9IF9wTTEyOGkoYik7CisgICAgbWFza2d0MjMgPSBfbW1fY21wZ3RfZXBpOChiMTI4LGMyMyk7CisgICAgYm1hc2sgPSBfbW1fb3Jfc2kxMjgoYjEyOCwgbWFza2d0MjMpOworICAgIG1hc2tndDE1ID0gX21tX2NtcGd0X2VwaTgoYjEyOCxjMTUpOworICAgIGEwMSA9IF9tbV91bnBhY2tsb19lcGk2NChfcE0xMjhpKGEtPnZhbFswXSksX3BNMTI4aShhLT52YWxbMV0pKTsKKyAgICBzaDAgPSAgX21tX3NodWZmbGVfZXBpOChhMDEsIGJtYXNrKTsKKyAgICBzaDEgPSAgX21tX3NodWZmbGVfZXBpOChfcE0xMjhpKGEtPnZhbFsyXSksIGJtYXNrKTsgLy9mb3IgYmk+MTUgYmkgaXMgd3JhcHBlZCAoYmktPTE1KQorICAgIHNoMCA9IF9NTV9CTEVORFZfRVBJOChzaDAsIHNoMSwgbWFza2d0MTUpOyAvL1NTRTQuMQorICAgIHJldHVybjY0KHNoMCk7Cit9CisjZGVmaW5lIHZ0YmwzX3U4KGEsYikgdnRibDNfdThfcHRyKCZhLGIpCisKKy8vaW50OHg4X3QgdnRibDNfczgoaW50OHg4eDNfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxLCBkMn0sIGQwCitpbnQ4eDhfdCB2dGJsM19zOF9wdHIoaW50OHg4eDNfdCogYSwgaW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMSwgZDJ9LCBkMAorI2RlZmluZSB2dGJsM19zOCB2dGJsM191OAorCisvL3BvbHk4eDhfdCB2dGJsM19wOChwb2x5OHg4eDNfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMSwgZDJ9LCBkMAorcG9seTh4OF90IHZ0YmwzX3A4X3B0cihwb2x5OHg4eDNfdCogYSwgdWludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDEsIGQyfSwgZDAKKyNkZWZpbmUgdnRibDNfcDggdnRibDNfdTgKKworLy91aW50OHg4X3QgdnRibDRfdTgodWludDh4OHg0X3QgYSwgdWludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDEsIGQyLCBkM30sIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2dGJsNF91OF9wdHIodWludDh4OHg0X3QqIGEsIHVpbnQ4eDhfdCBiKQoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYzE1LCBjMzEsIG1hc2tndDMxLCBibWFzaywgbWFza2d0MTUsIHNoMCwgc2gxLCBhMDEsIGEyMywgYjEyODsKKyAgICBjMTUgPSBfbW1fc2V0MV9lcGk4ICgxNSk7CisgICAgYzMxID0gX21tX3NldDFfZXBpOCAoMzEpOworICAgIGIxMjggPSBfcE0xMjhpKGIpOworICAgIG1hc2tndDMxID0gX21tX2NtcGd0X2VwaTgoYjEyOCxjMzEpOworICAgIGJtYXNrID0gX21tX29yX3NpMTI4KGIxMjgsIG1hc2tndDMxKTsKKyAgICBtYXNrZ3QxNSA9IF9tbV9jbXBndF9lcGk4KGIxMjgsYzE1KTsKKyAgICBhMDEgPSBfbW1fdW5wYWNrbG9fZXBpNjQoX3BNMTI4aShhLT52YWxbMF0pLF9wTTEyOGkoYS0+dmFsWzFdKSk7CisgICAgYTIzID0gX21tX3VucGFja2xvX2VwaTY0KF9wTTEyOGkoYS0+dmFsWzJdKSxfcE0xMjhpKGEtPnZhbFszXSkpOworICAgIHNoMCA9ICBfbW1fc2h1ZmZsZV9lcGk4KGEwMSwgYm1hc2spOworICAgIHNoMSA9ICBfbW1fc2h1ZmZsZV9lcGk4KGEyMywgYm1hc2spOyAvL2ZvciBiaT4xNSBiaSBpcyB3cmFwcGVkIChiaS09MTUpCisgICAgc2gwID0gX01NX0JMRU5EVl9FUEk4IChzaDAsIHNoMSwgbWFza2d0MTUpOyAvL1NTRTQuMQorICAgIHJldHVybjY0KHNoMCk7Cit9CisjZGVmaW5lIHZ0Ymw0X3U4KGEsYikgdnRibDRfdThfcHRyKCZhLGIpCisKKy8vaW50OHg4X3QgdnRibDRfczgoaW50OHg4eDRfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxLCBkMiwgZDN9LCBkMAoraW50OHg4X3QgdnRibDRfczhfcHRyKGludDh4OHg0X3QqIGEsIGludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDEsIGQyLCBkM30sIGQwCisjZGVmaW5lIHZ0Ymw0X3M4IHZ0Ymw0X3U4CisKKy8vcG9seTh4OF90IHZ0Ymw0X3A4KHBvbHk4eDh4NF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxLCBkMiwgZDN9LCBkMAorcG9seTh4OF90IHZ0Ymw0X3A4X3B0cihwb2x5OHg4eDRfdCogYSwgdWludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDEsIGQyLCBkM30sIGQwCisjZGVmaW5lIHZ0Ymw0X3A4IHZ0Ymw0X3U4CisKKy8vKioqKioqKioqKioqKioqKioqIEV4dGVuZGVkIHRhYmxlIGxvb2sgdXAgaW50cmluc2ljcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9WVEJYIChWZWN0b3IgVGFibGUgRXh0ZW5zaW9uKSB3b3JrcyBpbiB0aGUgc2FtZSB3YXkgYXMgVlRCTCBkbywKKy8vIGV4Y2VwdCB0aGF0IGluZGV4ZXMgb3V0IG9mIHJhbmdlIGxlYXZlIHRoZSBkZXN0aW5hdGlvbiBlbGVtZW50IHVuY2hhbmdlZC4KKwordWludDh4OF90IHZ0YngxX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpOyAvLyBWVEJYLjggZDAsIHtkMH0sIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2dGJ4MV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKQoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIGM3LCBtYXNrZ3QsIHNoLCBjMTI4OworICAgIGM3ID0gX21tX3NldDFfZXBpOCAoNyk7CisgICAgYzEyOCA9IF9wTTEyOGkoYyk7CisgICAgbWFza2d0ID0gX21tX2NtcGd0X2VwaTgoYzEyOCxjNyk7CisgICAgYzcgPSBfbW1fYW5kX3NpMTI4KG1hc2tndCxfcE0xMjhpKGEpKTsKKyAgICBzaCA9IF9tbV9zaHVmZmxlX2VwaTgoX3BNMTI4aShiKSxjMTI4KTsKKyAgICBzaCA9IF9tbV9hbmRub3Rfc2kxMjgobWFza2d0LHNoKTsKKyAgICBzaCA9ICBfbW1fb3Jfc2kxMjgoc2gsYzcpOworICAgIHJldHVybjY0KHNoKTsKK30KKworaW50OHg4X3QgdnRieDFfczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIsIGludDh4OF90IGMpOyAvLyBWVEJYLjggZDAsIHtkMH0sIGQwCisjZGVmaW5lIHZ0YngxX3M4IHZ0YngxX3U4CisKK3BvbHk4eDhfdCB2dGJ4MV9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDB9LCBkMAorI2RlZmluZSB2dGJ4MV9wOCB2dGJ4MV91OAorCisvL1NwZWNpYWwgdHJpY2sgdG8gYXZvaWQgX19kZWNsc3BlYyhhbGlnbignOCcpKSB3b24ndCBiZSBhbGlnbmVkIiBlcnJvcgorLy91aW50OHg4X3QgdnRieDJfdTgodWludDh4OF90IGEsIHVpbnQ4eDh4Ml90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDAsIGQxfSwgZDAKK3VpbnQ4eDhfdCB2dGJ4Ml91OF9wdHIodWludDh4OF90IGEsIHVpbnQ4eDh4Ml90KiBiLCB1aW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwLCBkMX0sIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2dGJ4Ml91OF9wdHIodWludDh4OF90IGEsIHVpbnQ4eDh4Ml90KiBiLCB1aW50OHg4X3QgYykKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBjMTUsIGIwMSwgbWFza2d0MTUsIHNoLCBjMTI4OworICAgIGMxNSA9IF9tbV9zZXQxX2VwaTggKDE1KTsKKyAgICBjMTI4ID0gX3BNMTI4aShjKTsKKyAgICBtYXNrZ3QxNSA9IF9tbV9jbXBndF9lcGk4KGMxMjgsIGMxNSk7CisgICAgYzE1ID0gX21tX2FuZF9zaTEyOChtYXNrZ3QxNSwgX3BNMTI4aShhKSk7CisgICAgYjAxID0gX21tX3VucGFja2xvX2VwaTY0KF9wTTEyOGkoYi0+dmFsWzBdKSwgX3BNMTI4aShiLT52YWxbMV0pKTsKKyAgICBzaCA9ICBfbW1fc2h1ZmZsZV9lcGk4KGIwMSwgYzEyOCk7CisgICAgc2ggPSBfbW1fYW5kbm90X3NpMTI4KG1hc2tndDE1LCBzaCk7CisgICAgc2ggPSAgX21tX29yX3NpMTI4KHNoLGMxNSk7CisgICAgcmV0dXJuNjQoc2gpOworfQorI2RlZmluZSB2dGJ4Ml91OChhLCBiLCBjKSB2dGJ4Ml91OF9wdHIoYSwgJmIsIGMpCisKKy8vaW50OHg4X3QgdnRieDJfczgoaW50OHg4X3QgYSwgIGludDh4OHgyX3QgYiwgaW50OHg4X3QgYyk7ICAvLyBWVEJYLjggZDAsIHtkMCwgZDF9LCBkMAorI2RlZmluZSB2dGJ4Ml9zOCB2dGJ4Ml91OAorCisvL3BvbHk4eDhfdCB2dGJ4Ml9wOChwb2x5OHg4X3QgYSwgcG9seTh4OHgyX3QgYiwgdWludDh4OF90IGMpOyAvLyBWVEJYLjggZDAsIHtkMCwgZDF9LCBkMAorI2RlZmluZSB2dGJ4Ml9wOCB2dGJ4Ml91OAorCisvL3VpbnQ4eDhfdCB2dGJ4M191OCh1aW50OHg4X3QgYSwgdWludDh4OHgzX3QgYiwgdWludDh4OF90IGMpIC8vIFZUQlguOCBkMCwge2QwLCBkMSwgZDJ9LCBkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnRieDNfdThfcHRyKHVpbnQ4eDhfdCBhLCB1aW50OHg4eDNfdCogYiwgdWludDh4OF90IGMpCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBjMTUsIGMyMywgbWFza2d0MTUsIG1hc2tndDIzLCBzaDAsIHNoMSwgYjAxLCBjMTI4OworICAgIGMxNSA9IF9tbV9zZXQxX2VwaTggKDE1KTsKKyAgICBjMjMgPSBfbW1fc2V0MV9lcGk4ICgyMyk7CisgICAgYzEyOCA9IF9wTTEyOGkoYyk7CisgICAgbWFza2d0MTUgPSBfbW1fY21wZ3RfZXBpOChjMTI4LGMxNSk7CisgICAgbWFza2d0MjMgPSBfbW1fY21wZ3RfZXBpOChjMTI4LGMyMyk7CisgICAgYzIzID0gX21tX2FuZF9zaTEyOChtYXNrZ3QyMywgX3BNMTI4aShhKSk7CisgICAgYjAxID0gX21tX3VucGFja2xvX2VwaTY0KF9wTTEyOGkoYi0+dmFsWzBdKSxfcE0xMjhpKGItPnZhbFsxXSkpOworICAgIHNoMCA9ICBfbW1fc2h1ZmZsZV9lcGk4KGIwMSwgYzEyOCk7CisgICAgc2gxID0gIF9tbV9zaHVmZmxlX2VwaTgoX3BNMTI4aShiLT52YWxbMl0pLCBjMTI4KTsgLy9mb3IgYmk+MTUgYmkgaXMgd3JhcHBlZCAoYmktPTE1KQorICAgIHNoMCA9IF9NTV9CTEVORFZfRVBJOChzaDAsIHNoMSwgbWFza2d0MTUpOworICAgIHNoMCA9IF9tbV9hbmRub3Rfc2kxMjgobWFza2d0MjMsc2gwKTsKKyAgICBzaDAgPSBfbW1fb3Jfc2kxMjgoc2gwLGMyMyk7CisgICAgcmV0dXJuNjQoc2gwKTsKK30KKyNkZWZpbmUgdnRieDNfdTgoYSwgYiwgYykgdnRieDNfdThfcHRyKGEsICZiLCBjKQorCisvL2ludDh4OF90IHZ0YngzX3M4KGludDh4OF90IGEsIGludDh4OHgzX3QgYiwgaW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwLCBkMSwgZDJ9LCBkMAoraW50OHg4X3QgdnRieDNfczhfcHRyKGludDh4OF90IGEsIGludDh4OHgzX3QqIGIsIGludDh4OF90IGMpOworI2RlZmluZSB2dGJ4M19zOCB2dGJ4M191OAorCisvL3BvbHk4eDhfdCB2dGJ4M19wOChwb2x5OHg4X3QgYSwgcG9seTh4OHgzX3QgYiwgdWludDh4OF90IGMpOyAvLyBWVEJYLjggZDAsIHtkMCwgZDEsIGQyfSwgZDAKK3BvbHk4eDhfdCB2dGJ4M19wOF9wdHIocG9seTh4OF90IGEsIHBvbHk4eDh4M190KiBiLCB1aW50OHg4X3QgYyk7CisjZGVmaW5lIHZ0YngzX3A4IHZ0YngzX3U4CisKKy8vdWludDh4OF90IHZ0Yng0X3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4eDRfdCBiLCB1aW50OHg4X3QgYykgLy8gVlRCWC44IGQwLCB7ZDAsIGQxLCBkMiwgZDN9LCBkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnRieDRfdThfcHRyKHVpbnQ4eDhfdCBhLCB1aW50OHg4eDRfdCogYiwgdWludDh4OF90IGMpCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBjMTUsIGMzMSwgbWFza2d0MTUsIG1hc2tndDMxLCBzaDAsIHNoMSwgYjAxLCBiMjMsIGMxMjg7CisgICAgYzE1ID0gX21tX3NldDFfZXBpOCAoMTUpOworICAgIGMzMSA9IF9tbV9zZXQxX2VwaTggKDMxKTsKKyAgICBjMTI4ID0gX3BNMTI4aShjKTsKKyAgICBtYXNrZ3QxNSA9IF9tbV9jbXBndF9lcGk4KGMxMjgsYzE1KTsKKyAgICBtYXNrZ3QzMSA9IF9tbV9jbXBndF9lcGk4KGMxMjgsYzMxKTsKKyAgICBjMzEgPSBfbW1fYW5kX3NpMTI4KG1hc2tndDMxLCBfcE0xMjhpKGEpKTsKKworICAgIGIwMSA9IF9tbV91bnBhY2tsb19lcGk2NChfcE0xMjhpKGItPnZhbFswXSksX3BNMTI4aShiLT52YWxbMV0pKTsKKyAgICBiMjMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoX3BNMTI4aShiLT52YWxbMl0pLF9wTTEyOGkoYi0+dmFsWzNdKSk7CisgICAgc2gwID0gIF9tbV9zaHVmZmxlX2VwaTgoYjAxLCBjMTI4KTsKKyAgICBzaDEgPSAgX21tX3NodWZmbGVfZXBpOChiMjMsIGMxMjgpOyAvL2ZvciBiaT4xNSBiaSBpcyB3cmFwcGVkIChiaS09MTUpCisgICAgc2gwID0gX01NX0JMRU5EVl9FUEk4KHNoMCwgc2gxLCBtYXNrZ3QxNSk7CisgICAgc2gwID0gX21tX2FuZG5vdF9zaTEyOChtYXNrZ3QzMSxzaDApOworICAgIHNoMCA9ICBfbW1fb3Jfc2kxMjgoc2gwLGMzMSk7CisgICAgcmV0dXJuNjQoc2gwKTsKK30KKyNkZWZpbmUgdnRieDRfdTgoYSwgYiwgYykgdnRieDRfdThfcHRyKGEsICZiLCBjKQorCisvL2ludDh4OF90IHZ0Yng0X3M4KGludDh4OF90IGEsIGludDh4OHg0X3QgYiwgaW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwLCBkMSwgZDIsIGQzfSwgZDAKK2ludDh4OF90IHZ0Yng0X3M4X3B0cihpbnQ4eDhfdCBhLCBpbnQ4eDh4NF90KiBiLCBpbnQ4eDhfdCBjKTsKKyNkZWZpbmUgdnRieDRfczggdnRieDRfdTgKKworLy9wb2x5OHg4X3QgdnRieDRfcDgocG9seTh4OF90IGEsIHBvbHk4eDh4NF90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDAsIGQxLCBkMiwgZDN9LCBkMAorcG9seTh4OF90IHZ0Yng0X3A4X3B0cihwb2x5OHg4X3QgYSwgcG9seTh4OHg0X3QqIGIsIHVpbnQ4eDhfdCBjKTsKKyNkZWZpbmUgdnRieDRfcDggdnRieDRfdTgKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKiogT3BlcmF0aW9ucyB3aXRoIGEgc2NhbGFyIHZhbHVlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vKioqKioqKiBWZWN0b3IgbXVsdGlwbHkgYWNjdW11bGF0ZSBieSBzY2FsYXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQxNng0X3Qgdm1sYV9sYW5lX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTEEuSTE2IGQwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZtbGFfbGFuZV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpIC8vIFZNTEEuSTE2IGQwLCBkMCwgZDBbMF0KK3sKKyAgICBpbnQxNl90IGM7CisgICAgaW50MTZ4NF90IHNjYWxhcjsKKyAgICBjID0gdmdldF9sYW5lX3MxNih2LCBsKTsKKyAgICBzY2FsYXIgPSB2ZHVwX25fczE2KGMpOworICAgIHJldHVybiB2bWxhX3MxNihhLCBiLCBzY2FsYXIpOworfQorCitpbnQzMngyX3Qgdm1sYV9sYW5lX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEEuSTMyIGQwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZtbGFfbGFuZV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpIC8vIFZNTEEuSTMyIGQwLCBkMCwgZDBbMF0KK3sKKyAgICBpbnQzMl90IGM7CisgICAgaW50MzJ4Ml90IHNjYWxhcjsKKyAgICBjID0gdmdldF9sYW5lX3MzMih2LCBsKTsKKyAgICBzY2FsYXIgPSB2ZHVwX25fczMyKGMpOworICAgIHJldHVybiB2bWxhX3MzMihhLCBiLCBzY2FsYXIpOworfQorCit1aW50MTZ4NF90IHZtbGFfbGFuZV91MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVk1MQS5JMTYgZDAsIGQwLCBkMFswXQorI2RlZmluZSB2bWxhX2xhbmVfdTE2IHZtbGFfbGFuZV9zMTYKKworCit1aW50MzJ4Ml90IHZtbGFfbGFuZV91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MQS5JMzIgZDAsIGQwLCBkMFswXQorI2RlZmluZSB2bWxhX2xhbmVfdTMyIHZtbGFfbGFuZV9zMzIKKworZmxvYXQzMngyX3Qgdm1sYV9sYW5lX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEEuRjMyIGQwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3Qgdm1sYV9sYW5lX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCkKK3sKKyAgICBmbG9hdDMyX3QgdmxhbmU7CisgICAgZmxvYXQzMngyX3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9mMzIodiwgbCk7CisgICAgYyA9IHZkdXBfbl9mMzIodmxhbmUpOworICAgIHJldHVybiB2bWxhX2YzMihhLGIsYyk7Cit9CisKK2ludDE2eDhfdCB2bWxhcV9sYW5lX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTEEuSTE2IHEwLCBxMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZtbGFxX2xhbmVfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKSAvLyBWTUxBLkkxNiBxMCwgcTAsIGQwWzBdCit7CisgICAgaW50MTZfdCB2bGFuZTsKKyAgICBpbnQxNng4X3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMTYodiwgbCk7CisgICAgYyA9IHZkdXBxX25fczE2KHZsYW5lKTsKKyAgICByZXR1cm4gdm1sYXFfczE2KGEsYixjKTsKK30KKworaW50MzJ4NF90IHZtbGFxX2xhbmVfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MQS5JMzIgcTAsIHEwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3Qgdm1sYXFfbGFuZV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpIC8vIFZNTEEuSTMyIHEwLCBxMCwgZDBbMF0KK3sKKyAgICBpbnQzMl90IHZsYW5lOworICAgIGludDMyeDRfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MzMih2LCBsKTsKKyAgICBjID0gdmR1cHFfbl9zMzIodmxhbmUpOworICAgIHJldHVybiB2bWxhcV9zMzIoYSxiLGMpOworfQorCit1aW50MTZ4OF90IHZtbGFxX2xhbmVfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVk1MQS5JMTYgcTAsIHEwLCBkMFswXQorI2RlZmluZSB2bWxhcV9sYW5lX3UxNiB2bWxhcV9sYW5lX3MxNgorCit1aW50MzJ4NF90IHZtbGFxX2xhbmVfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCB1aW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MQS5JMzIgcTAsIHEwLCBkMFswXQorI2RlZmluZSB2bWxhcV9sYW5lX3UzMiB2bWxhcV9sYW5lX3MzMgorCitmbG9hdDMyeDRfdCB2bWxhcV9sYW5lX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEEuRjMyIHEwLCBxMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3Qgdm1sYXFfbGFuZV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpIC8vIFZNTEEuRjMyIHEwLCBxMCwgZDBbMF0KK3sKKyAgICBmbG9hdDMyX3QgdmxhbmU7CisgICAgZmxvYXQzMng0X3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9mMzIodiwgbCk7CisgICAgYyA9IHZkdXBxX25fZjMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm1sYXFfZjMyKGEsYixjKTsKK30KKworLy8qKioqKioqKioqKioqKioqKiBWZWN0b3Igd2lkZW5pbmcgbXVsdGlwbHkgYWNjdW11bGF0ZSBieSBzY2FsYXIgKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDMyeDRfdCB2bWxhbF9sYW5lX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTEFMLlMxNiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2bWxhbF9sYW5lX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCkgLy8gVk1MQUwuUzE2IHEwLCBkMCwgZDBbMF0KK3sKKyAgICBpbnQxNl90IHZsYW5lOworICAgIGludDE2eDRfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MxNih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3MxNih2bGFuZSk7CisgICAgcmV0dXJuIHZtbGFsX3MxNihhLCBiLCBjKTsKK30KKworaW50NjR4Ml90IHZtbGFsX2xhbmVfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MQUwuUzMyIHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90IHZtbGFsX2xhbmVfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKSAvLyBWTUxBTC5TMzIgcTAsIGQwLCBkMFswXQoreworICAgIGludDMyX3QgdmxhbmU7CisgICAgaW50MzJ4Ml90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczMyKHYsIGwpOworICAgIGMgPSB2ZHVwX25fczMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm1sYWxfczMyKGEsIGIsIGMpOworfQorCit1aW50MzJ4NF90IHZtbGFsX2xhbmVfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVk1MQUwuczE2IHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2bWxhbF9sYW5lX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCkgLy8gVk1MQUwuczE2IHEwLCBkMCwgZDBbMF0KK3sKKyAgICB1aW50MTZfdCB2bGFuZTsKKyAgICB1aW50MTZ4NF90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfdTE2KHYsIGwpOworICAgIGMgPSB2ZHVwX25fdTE2KHZsYW5lKTsKKyAgICByZXR1cm4gdm1sYWxfdTE2KGEsIGIsIGMpOworfQorCit1aW50NjR4Ml90IHZtbGFsX2xhbmVfdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MQUwuVTMyIHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2bWxhbF9sYW5lX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCkgLy8gVk1MQUwuVTMyIHEwLCBkMCwgZDBbMF0KK3sKKyAgICB1aW50MzJfdCB2bGFuZTsKKyAgICB1aW50MzJ4Ml90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfdTMyKHYsIGwpOworICAgIGMgPSB2ZHVwX25fdTMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm1sYWxfdTMyKGEsIGIsIGMpOworfQorCisvLyAqKioqKioqKiBWZWN0b3Igd2lkZW5pbmcgc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBhY2N1bXVsYXRlIGJ5IHNjYWxhciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDMyeDRfdCB2cWRtbGFsX2xhbmVfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVlFETUxBTC5TMTYgcTAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnFkbWxhbF9sYW5lX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCkKK3sKKyAgICBpbnQxNl90IHZsYW5lOworICAgIGludDE2eDRfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MxNih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3MxNih2bGFuZSk7CisgICAgcmV0dXJuIHZxZG1sYWxfczE2KGEsIGIsIGMpOworfQorCitpbnQ2NHgyX3QgdnFkbWxhbF9sYW5lX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZRRE1MQUwuUzMyIHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90IHZxZG1sYWxfbGFuZV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpCit7CisgICAgaW50MzJfdCB2bGFuZTsKKyAgICB1aW50MzJ4Ml90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczMyKHYsIGwpOworICAgIGMgPSB2ZHVwX25fczMyKHZsYW5lKTsKKyAgICByZXR1cm4gdnFkbWxhbF9zMzIoYSwgYiwgYyk7Cit9CisKKy8vICoqKioqKiBWZWN0b3IgbXVsdGlwbHkgc3VidHJhY3QgYnkgc2NhbGFyICoqKioqKioqKioqKioqKioqCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQxNng0X3Qgdm1sc19sYW5lX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTFMuSTE2IGQwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZtbHNfbGFuZV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpIC8vIFZNTFMuSTE2IGQwLCBkMCwgZDBbMF0KK3sKKyAgICBpbnQxNl90IHZsYW5lOworICAgIGludDE2eDRfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MxNih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3MxNih2bGFuZSk7CisgICAgcmV0dXJuIHZtbHNfczE2KGEsIGIsIGMpOworfQorCitpbnQzMngyX3Qgdm1sc19sYW5lX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTFMuSTMyIGQwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZtbHNfbGFuZV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpIC8vIFZNTFMuSTMyIGQwLCBkMCwgZDBbMF0KK3sKKyAgICBpbnQzMl90IHZsYW5lOworICAgIGludDMyeDJfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MzMih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3MzMih2bGFuZSk7CisgICAgcmV0dXJuIHZtbHNfczMyKGEsIGIsIGMpOworfQorCit1aW50MTZ4NF90IHZtbHNfbGFuZV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxTLkkxNiBkMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3Qgdm1sc19sYW5lX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCkgLy8gVk1MUy5JMTYgZDAsIGQwLCBkMFswXQoreworICAgIHVpbnQxNl90IHZsYW5lOworICAgIHVpbnQxNng0X3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMTYodiwgbCk7CisgICAgYyA9IHZkdXBfbl9zMTYodmxhbmUpOworICAgIHJldHVybiB2bWxzX3MxNihhLCBiLCBjKTsKK30KKwordWludDMyeDJfdCB2bWxzX2xhbmVfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MUy5JMzIgZDAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZtbHNfbGFuZV91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpIC8vIFZNTFMuSTMyIGQwLCBkMCwgZDBbMF0KK3sKKyAgICB1aW50MzJfdCB2bGFuZTsKKyAgICB1aW50MzJ4Ml90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfdTMyKHYsIGwpOworICAgIGMgPSB2ZHVwX25fdTMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm1sc191MzIoYSwgYiwgYyk7Cit9CisKK2Zsb2F0MzJ4Ml90IHZtbHNfbGFuZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxTLkYzMiBkMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZtbHNfbGFuZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpCit7CisgICAgZmxvYXQzMl90IHZsYW5lOworICAgIGZsb2F0MzJ4Ml90IGM7CisgICAgdmxhbmUgPSAoZmxvYXQpIHZnZXRfbGFuZV9mMzIodiwgbCk7CisgICAgYyA9IHZkdXBfbl9mMzIodmxhbmUpOworICAgIHJldHVybiB2bWxzX2YzMihhLGIsYyk7Cit9CisKK2ludDE2eDhfdCB2bWxzcV9sYW5lX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTFMuSTE2IHEwLCBxMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZtbHNxX2xhbmVfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKSAvLyBWTUxTLkkxNiBxMCwgcTAsIGQwWzBdCit7CisgICAgaW50MTZfdCB2bGFuZTsKKyAgICBpbnQxNng4X3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMTYodiwgbCk7CisgICAgYyA9IHZkdXBxX25fczE2KHZsYW5lKTsKKyAgICByZXR1cm4gdm1sc3FfczE2KGEsIGIsYyk7Cit9CisKK2ludDMyeDRfdCB2bWxzcV9sYW5lX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTFMuSTMyIHEwLCBxMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZtbHNxX2xhbmVfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKSAvLyBWTUxTLkkzMiBxMCwgcTAsIGQwWzBdCit7CisgICAgaW50MzJfdCB2bGFuZTsKKyAgICBpbnQzMng0X3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMzIodiwgbCk7CisgICAgYyA9IHZkdXBxX25fczMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm1sc3FfczMyKGEsYixjKTsKK30KKwordWludDE2eDhfdCB2bWxzcV9sYW5lX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTEEuSTE2IHEwLCBxMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2bWxzcV9sYW5lX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCkgLy8gVk1MQS5JMTYgcTAsIHEwLCBkMFswXQoreworICAgIHVpbnQxNl90IHZsYW5lOworICAgIHVpbnQxNng4X3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV91MTYodiwgbCk7CisgICAgYyA9IHZkdXBxX25fdTE2KHZsYW5lKTsKKyAgICByZXR1cm4gdm1sc3FfdTE2KGEsYixjKTsKK30KKwordWludDMyeDRfdCB2bWxzcV9sYW5lX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEEuSTMyIHEwLCBxMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2bWxzcV9sYW5lX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCkgLy8gVk1MQS5JMzIgcTAsIHEwLCBkMFswXQoreworICAgIHVpbnQzMl90IHZsYW5lOworICAgIHVpbnQzMng0X3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV91MzIodiwgbCk7CisgICAgYyA9IHZkdXBxX25fdTMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm1sc3FfdTMyKGEsYixjKTsKK30KKworZmxvYXQzMng0X3Qgdm1sc3FfbGFuZV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxBLkYzMiBxMCwgcTAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZtbHNxX2xhbmVfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKSAvLyBWTUxBLkYzMiBxMCwgcTAsIGQwWzBdCit7CisgICAgZmxvYXQzMl90IHZsYW5lOworICAgIGZsb2F0MzJ4NF90IGM7CisgICAgdmxhbmUgPSAoZmxvYXQpIHZnZXRfbGFuZV9mMzIodiwgbCk7CisgICAgYyA9IHZkdXBxX25fZjMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm1sc3FfZjMyKGEsYixjKTsKK30KKworLy8gKioqKiBWZWN0b3Igd2lkZW5pbmcgbXVsdGlwbHkgc3VidHJhY3QgYnkgc2NhbGFyICoqKioKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDMyeDRfdCB2bWxzbF9sYW5lX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTEFMLlMxNiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2bWxzbF9sYW5lX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCkgLy8gVk1MQUwuUzE2IHEwLCBkMCwgZDBbMF0KK3sKKyAgICBpbnQxNl90IHZsYW5lOworICAgIGludDE2eDRfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MxNih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3MxNih2bGFuZSk7CisgICAgcmV0dXJuIHZtbHNsX3MxNihhLCBiLCBjKTsKK30KKworaW50NjR4Ml90IHZtbHNsX2xhbmVfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MQUwuUzMyIHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90IHZtbHNsX2xhbmVfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKSAvLyBWTUxBTC5TMzIgcTAsIGQwLCBkMFswXQoreworICAgIGludDMyX3QgdmxhbmU7CisgICAgaW50MzJ4Ml90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczMyKHYsIGwpOworICAgIGMgPSB2ZHVwX25fczMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm1sc2xfczMyKGEsIGIsIGMpOworfQorCit1aW50MzJ4NF90IHZtbHNsX2xhbmVfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVk1MQUwuczE2IHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2bWxzbF9sYW5lX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCkgLy8gVk1MQUwuczE2IHEwLCBkMCwgZDBbMF0KK3sKKyAgICB1aW50MTZfdCB2bGFuZTsKKyAgICB1aW50MTZ4NF90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczE2KHYsIGwpOworICAgIGMgPSB2ZHVwX25fczE2KHZsYW5lKTsKKyAgICByZXR1cm4gdm1sc2xfczE2KGEsIGIsIGMpOworfQorCit1aW50NjR4Ml90IHZtbHNsX2xhbmVfdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MQUwuVTMyIHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2bWxzbF9sYW5lX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCkgLy8gVk1MQUwuVTMyIHEwLCBkMCwgZDBbMF0KK3sKKyAgICB1aW50MzJfdCB2bGFuZTsKKyAgICB1aW50MzJ4Ml90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfdTMyKHYsIGwpOworICAgIGMgPSB2ZHVwX25fdTMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm1sc2xfdTMyKGEsIGIsIGMpOworfQorCisvLyoqKioqKioqKiBWZWN0b3Igd2lkZW5pbmcgc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBzdWJ0cmFjdCBieSBzY2FsYXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQzMng0X3QgdnFkbWxzbF9sYW5lX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZRRE1MU0wuUzE2IHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZxZG1sc2xfbGFuZV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpCit7CisgICAgaW50MTZfdCB2bGFuZTsKKyAgICBpbnQxNng0X3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMTYodiwgbCk7CisgICAgYyA9IHZkdXBfbl9zMTYodmxhbmUpOworICAgIHJldHVybiB2cWRtbHNsX3MxNihhLCBiLCBjKTsKK30KKworaW50NjR4Ml90IHZxZG1sc2xfbGFuZV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWUURNTFNMLlMzMiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDJfdCB2cWRtbHNsX2xhbmVfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBpbnQzMl90IHZsYW5lOworICAgIGludDMyeDJfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MzMih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3MzMih2bGFuZSk7CisgICAgcmV0dXJuIHZxZG1sc2xfczMyKGEsIGIsIGMpOworfQorLy8qKioqKioqKioqIFZlY3RvciBtdWx0aXBseSB3aXRoIHNjYWxhciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MTZ4NF90IHZtdWxfbl9zMTYoaW50MTZ4NF90IGEsIGludDE2X3QgYik7IC8vIFZNVUwuSTE2IGQwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2bXVsX25fczE2KGludDE2eDRfdCBhLCBpbnQxNl90IGIpIC8vIFZNVUwuSTE2IGQwLGQwLGQwWzBdCit7CisgICAgaW50MTZ4NF90IGIxNng0OworICAgIGIxNng0ID0gdmR1cF9uX3MxNihiKTsKKyAgICByZXR1cm4gdm11bF9zMTYoYSwgYjE2eDQpOworfQorCitpbnQzMngyX3Qgdm11bF9uX3MzMihpbnQzMngyX3QgYSwgaW50MzJfdCBiKTsgLy8gVk1VTC5JMzIgZDAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZtdWxfbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyX3QgYikgLy8gVk1VTC5JMzIgZDAsZDAsZDBbMF0KK3sKKyAgICAvL3NlcmlhbCBzb2x1dGlvbiBsb29rcyBmYXN0ZXIKKyAgICBpbnQzMngyX3QgYjMyeDI7CisgICAgYjMyeDIgPSB2ZHVwX25fczMyKGIpOworICAgIHJldHVybiB2bXVsX3MzMihhLCBiMzJ4Mik7Cit9CisKK2Zsb2F0MzJ4Ml90IHZtdWxfbl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMl90IGIpOyAvLyBWTVVMLkYzMiBkMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2bXVsX25fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJfdCBiKSAvLyBWTVVMLkYzMiBkMCxkMCxkMFswXQoreworICAgIGZsb2F0MzJ4Ml90IGIzMngyOworICAgIGIzMngyID0gdmR1cF9uX2YzMihiKTsKKyAgICByZXR1cm4gdm11bF9mMzIoYSwgYjMyeDIpOworfQorCit1aW50MTZ4NF90IHZtdWxfbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZfdCBiKTsgLy8gVk1VTC5JMTYgZDAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2bXVsX25fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2X3QgYikgLy8gVk1VTC5JMTYgZDAsZDAsZDBbMF0KK3sKKyAgICB1aW50MTZ4NF90IGIxNng0OworICAgIGIxNng0ID0gdmR1cF9uX3MxNihiKTsKKyAgICByZXR1cm4gdm11bF9zMTYoYSwgYjE2eDQpOworfQorCit1aW50MzJ4Ml90IHZtdWxfbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJfdCBiKTsgLy8gVk1VTC5JMzIgZDAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2bXVsX25fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyX3QgYikgLy8gVk1VTC5JMzIgZDAsZDAsZDBbMF0KK3sKKyAgICAvL3NlcmlhbCBzb2x1dGlvbiBsb29rcyBmYXN0ZXIKKyAgICB1aW50MzJ4Ml90IGIzMngyOworICAgIGIzMngyID0gdmR1cF9uX3UzMihiKTsKKyAgICByZXR1cm4gdm11bF91MzIoYSwgYjMyeDIpOworfQorCitpbnQxNng4X3Qgdm11bHFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2X3QgYik7IC8vIFZNVUwuSTE2IHEwLHEwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2bXVscV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZfdCBiKSAvLyBWTVVMLkkxNiBxMCxxMCxkMFswXQoreworICAgIGludDE2eDhfdCBiMTZ4ODsKKyAgICBiMTZ4OCA9IHZkdXBxX25fczE2KGIpOworICAgIHJldHVybiB2bXVscV9zMTYoYSwgYjE2eDgpOworfQorCitpbnQzMng0X3Qgdm11bHFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyX3QgYik7IC8vIFZNVUwuSTMyIHEwLHEwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2bXVscV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJfdCBiKSAvLyBWTVVMLkkzMiBxMCxxMCxkMFswXQoreworICAgIGludDMyeDRfdCBiMzJ4NDsKKyAgICBiMzJ4NCA9IHZkdXBxX25fczMyKGIpOworICAgIHJldHVybiB2bXVscV9zMzIoYSwgYjMyeDQpOworfQorCitmbG9hdDMyeDRfdCB2bXVscV9uX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyX3QgYik7IC8vIFZNVUwuRjMyIHEwLHEwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZtdWxxX25fZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJfdCBiKSAvLyBWTVVMLkYzMiBxMCxxMCxkMFswXQoreworICAgIGZsb2F0MzJ4NF90IGIzMng0OworICAgIGIzMng0ID0gdmR1cHFfbl9mMzIoYik7CisgICAgcmV0dXJuIHZtdWxxX2YzMihhLCBiMzJ4NCk7Cit9CisKK3VpbnQxNng4X3Qgdm11bHFfbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZfdCBiKTsgLy8gVk1VTC5JMTYgcTAscTAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2bXVscV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNl90IGIpIC8vIFZNVUwuSTE2IHEwLHEwLGQwWzBdCit7CisgICAgdWludDE2eDhfdCBiMTZ4ODsKKyAgICBiMTZ4OCA9IHZkdXBxX25fczE2KGIpOworICAgIHJldHVybiB2bXVscV9zMTYoYSwgYjE2eDgpOworfQorCit1aW50MzJ4NF90IHZtdWxxX25fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyX3QgYik7IC8vIFZNVUwuSTMyIHEwLHEwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3Qgdm11bHFfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJfdCBiKSAvLyBWTVVMLkkzMiBxMCxxMCxkMFswXQoreworICAgIHVpbnQzMng0X3QgYjMyeDQ7CisgICAgYjMyeDQgPSB2ZHVwcV9uX3UzMihiKTsKKyAgICByZXR1cm4gdm11bHFfdTMyKGEsIGIzMng0KTsKK30KKworLy8qKioqKioqKioqIFZlY3RvciBtdWx0aXBseSBsYW5lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQxNng0X3Qgdm11bF9sYW5lX3MxNiAoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgYyk7CitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2bXVsX2xhbmVfczE2IChpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKQoreworICAgIGludDE2eDRfdCBiMTZ4NDsKKyAgICBpbnQxNl90IHZsYW5lOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MxNihiLCBjKTsKKyAgICBiMTZ4NCA9IHZkdXBfbl9zMTYodmxhbmUpOworICAgIHJldHVybiB2bXVsX3MxNihhLCBiMTZ4NCk7Cit9CisKK2ludDMyeDJfdCB2bXVsX2xhbmVfczMyIChpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZtdWxfbGFuZV9zMzIgKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpCit7CisgICAgaW50MzJ4Ml90IGIzMngyOworICAgIGludDMyX3QgdmxhbmU7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczMyKGIsIGMpOworICAgIGIzMngyID0gdmR1cF9uX3MzMih2bGFuZSk7CisgICAgcmV0dXJuIHZtdWxfczMyKGEsIGIzMngyKTsKK30KKworZmxvYXQzMngyX3Qgdm11bF9sYW5lX2YzMiAoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOworX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2bXVsX2xhbmVfZjMyIChmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYykKK3sKKyAgICBmbG9hdDMyeDJfdCBiMzJ4MjsKKyAgICBmbG9hdDMyX3QgdmxhbmU7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfZjMyKGIsIGMpOworICAgIGIzMngyID0gdmR1cF9uX2YzMih2bGFuZSk7CisgICAgcmV0dXJuIHZtdWxfZjMyKGEsIGIzMngyKTsKK30KKwordWludDE2eDRfdCB2bXVsX2xhbmVfdTE2ICh1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpOworI2RlZmluZSB2bXVsX2xhbmVfdTE2IHZtdWxfbGFuZV9zMTYKKwordWludDMyeDJfdCB2bXVsX2xhbmVfdTMyICh1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOworI2RlZmluZSB2bXVsX2xhbmVfdTMyIHZtdWxfbGFuZV9zMzIKKworaW50MTZ4OF90IHZtdWxxX2xhbmVfczE2KGludDE2eDhfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpOworX05FT04yU1NFX0lOTElORSBpbnQxNng4X3Qgdm11bHFfbGFuZV9zMTYgKGludDE2eDhfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpCit7CisgICAgaW50MTZ4OF90IGIxNng4OworICAgIGludDE2X3QgdmxhbmU7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczE2KGIsIGMpOworICAgIGIxNng4ID0gdmR1cHFfbl9zMTYodmxhbmUpOworICAgIHJldHVybiB2bXVscV9zMTYoYSwgYjE2eDgpOworfQorCitpbnQzMng0X3Qgdm11bHFfbGFuZV9zMzIgKGludDMyeDRfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOworX05FT04yU1NFX0lOTElORSBpbnQzMng0X3Qgdm11bHFfbGFuZV9zMzIgKGludDMyeDRfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpCit7CisgICAgaW50MzJ4NF90IGIzMng0OworICAgIGludDMyX3QgdmxhbmU7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczMyKGIsIGMpOworICAgIGIzMng0ID0gdmR1cHFfbl9zMzIodmxhbmUpOworICAgIHJldHVybiB2bXVscV9zMzIoYSwgYjMyeDQpOworfQorCitmbG9hdDMyeDRfdCB2bXVscV9sYW5lX2YzMiAoZmxvYXQzMng0X3QgYSwgZmxvYXQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOworX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDRfdCB2bXVscV9sYW5lX2YzMiAoZmxvYXQzMng0X3QgYSwgZmxvYXQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpCit7CisgICAgZmxvYXQzMng0X3QgYjMyeDQ7CisgICAgZmxvYXQzMl90IHZsYW5lOworICAgIHZsYW5lID0gdmdldF9sYW5lX2YzMihiLCBjKTsKKyAgICBiMzJ4NCA9IHZkdXBxX25fZjMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm11bHFfZjMyKGEsIGIzMng0KTsKK30KKwordWludDE2eDhfdCB2bXVscV9sYW5lX3UxNiAodWludDE2eDhfdCBhLCB1aW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKTsKKyNkZWZpbmUgdm11bHFfbGFuZV91MTYgdm11bHFfbGFuZV9zMTYKKwordWludDMyeDRfdCB2bXVscV9sYW5lX3UzMiAodWludDMyeDRfdCBhLCB1aW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsKKyNkZWZpbmUgdm11bHFfbGFuZV91MzIgdm11bHFfbGFuZV9zMzIKKworLy8qKioqIFZlY3RvciBsb25nIG11bHRpcGx5IHdpdGggc2NhbGFyICoqKioqKioqKioqKgoraW50MzJ4NF90IHZtdWxsX25fczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNl90IHZhbDIpOyAvLyBWTVVMTC5TMTYgcTAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZtdWxsX25fczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNl90IHZhbDIpIC8vIFZNVUxMLlMxNiBxMCxkMCxkMFswXQoreworICAgIGludDE2eDRfdCBiMTZ4NDsKKyAgICBiMTZ4NCA9IHZkdXBfbl9zMTYodmFsMik7CisgICAgcmV0dXJuIHZtdWxsX3MxNih2ZWMxLCBiMTZ4NCk7Cit9CisKK2ludDY0eDJfdCB2bXVsbF9uX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJfdCB2YWwyKTsgLy8gVk1VTEwuUzMyIHEwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2bXVsbF9uX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJfdCB2YWwyKSAvLyBWTVVMTC5TMzIgcTAsZDAsZDBbMF0KK3sKKyAgICBpbnQzMngyX3QgYjMyeDI7CisgICAgYjMyeDIgPSB2ZHVwX25fczMyKHZhbDIpOworICAgIHJldHVybiB2bXVsbF9zMzIodmVjMSwgYjMyeDIpOworfQorCit1aW50MzJ4NF90IHZtdWxsX25fdTE2KHVpbnQxNng0X3QgdmVjMSwgdWludDE2X3QgdmFsMik7IC8vIFZNVUxMLnMxNiBxMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZtdWxsX25fdTE2KHVpbnQxNng0X3QgdmVjMSwgdWludDE2X3QgdmFsMikgLy8gVk1VTEwuczE2IHEwLGQwLGQwWzBdCit7CisgICAgdWludDE2eDRfdCBiMTZ4NDsKKyAgICBiMTZ4NCA9IHZkdXBfbl9zMTYodmFsMik7CisgICAgcmV0dXJuIHZtdWxsX3MxNih2ZWMxLCBiMTZ4NCk7Cit9CisKK3VpbnQ2NHgyX3Qgdm11bGxfbl91MzIodWludDMyeDJfdCB2ZWMxLCB1aW50MzJfdCB2YWwyKTsgLy8gVk1VTEwuVTMyIHEwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3Qgdm11bGxfbl91MzIodWludDMyeDJfdCB2ZWMxLCB1aW50MzJfdCB2YWwyKSAvLyBWTVVMTC5VMzIgcTAsZDAsZDBbMF0KK3sKKyAgICB1aW50MzJ4Ml90IGIzMngyOworICAgIGIzMngyID0gdmR1cF9uX3UzMih2YWwyKTsKKyAgICByZXR1cm4gdm11bGxfdTMyKHZlYzEsIGIzMngyKTsKK30KKworLy8qKioqIFZlY3RvciBsb25nIG11bHRpcGx5IGJ5IHNjYWxhciAqKioqCitpbnQzMng0X3Qgdm11bGxfbGFuZV9zMTYoaW50MTZ4NF90IHZlYzEsIGludDE2eDRfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMykgaW50IHZhbDMpOyAvLyBWTVVMTC5TMTYgcTAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZtdWxsX2xhbmVfczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKSAvLyBWTVVMTC5TMTYgcTAsZDAsZDBbMF0KK3sKKyAgICBpbnQxNl90IHZsYW5lOworICAgIGludDE2eDRfdCBiOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MxNih2YWwyLCB2YWwzKTsKKyAgICBiID0gdmR1cF9uX3MxNih2bGFuZSk7CisgICAgcmV0dXJuIHZtdWxsX3MxNih2ZWMxLCBiKTsKK30KKworaW50NjR4Ml90IHZtdWxsX2xhbmVfczMyKGludDMyeDJfdCB2ZWMxLCBpbnQzMngyX3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDEpIGludCB2YWwzKTsgLy8gVk1VTEwuUzMyIHEwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2bXVsbF9sYW5lX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMykgLy8gVk1VTEwuUzMyIHEwLGQwLGQwWzBdCit7CisgICAgaW50MzJfdCB2bGFuZTsKKyAgICBpbnQzMngyX3QgYjsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMzIodmFsMiwgdmFsMyk7CisgICAgYiA9IHZkdXBfbl9zMzIodmxhbmUpOworICAgIHJldHVybiB2bXVsbF9zMzIodmVjMSwgYik7Cit9CisKK3VpbnQzMng0X3Qgdm11bGxfbGFuZV91MTYodWludDE2eDRfdCB2ZWMxLCB1aW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMyk7IC8vIFZNVUxMLnMxNiBxMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZtdWxsX2xhbmVfdTE2KHVpbnQxNng0X3QgdmVjMSwgdWludDE2eDRfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMykgaW50IHZhbDMpIC8vIFZNVUxMLnMxNiBxMCxkMCxkMFswXQoreworICAgIHVpbnQxNl90IHZsYW5lOworICAgIHVpbnQxNng0X3QgYjsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMTYodmFsMiwgdmFsMyk7CisgICAgYiA9IHZkdXBfbl9zMTYodmxhbmUpOworICAgIHJldHVybiB2bXVsbF9zMTYodmVjMSwgYik7Cit9CisKK3VpbnQ2NHgyX3Qgdm11bGxfbGFuZV91MzIodWludDMyeDJfdCB2ZWMxLCB1aW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyk7IC8vIFZNVUxMLlUzMiBxMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50NjR4Ml90IHZtdWxsX2xhbmVfdTMyKHVpbnQzMngyX3QgdmVjMSwgdWludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpIC8vIFZNVUxMLlUzMiBxMCxkMCxkMFswXQoreworICAgIHVpbnQzMl90IHZsYW5lOworICAgIHVpbnQzMngyX3QgYjsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV91MzIodmFsMiwgdmFsMyk7CisgICAgYiA9IHZkdXBfbl91MzIodmxhbmUpOworICAgIHJldHVybiB2bXVsbF91MzIodmVjMSwgYik7Cit9CisKKy8vKioqKioqKioqIFZlY3RvciBzYXR1cmF0aW5nIGRvdWJsaW5nIGxvbmcgbXVsdGlwbHkgd2l0aCBzY2FsYXIgICoqKioqKioqKioqKioqKioqKioKK2ludDMyeDRfdCB2cWRtdWxsX25fczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNl90IHZhbDIpOyAvLyBWUURNVUxMLlMxNiBxMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnFkbXVsbF9uX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZfdCB2YWwyKQoreworICAgIC8vdGhlIHNlcmlhbCBzb3VsdXRpb24gbWF5IGJlIGZhc3RlciBkdWUgdG8gc2F0dXJhdGlvbgorICAgIGludDE2eDRfdCBiOworICAgIGIgPSB2ZHVwX25fczE2KHZhbDIpOworICAgIHJldHVybiB2cWRtdWxsX3MxNih2ZWMxLCBiKTsKK30KKworaW50NjR4Ml90IHZxZG11bGxfbl9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyX3QgdmFsMik7IC8vIFZRRE1VTEwuUzMyIHEwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDJfdCB2cWRtdWxsX25fczMyKGludDMyeDJfdCB2ZWMxLCBpbnQzMl90IHZhbDIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIGludDMyeDJfdCBiOworICAgIGIgPSB2ZHVwX25fczMyKHZhbDIpOworICAgIHJldHVybiB2cWRtdWxsX3MzMih2ZWMxLGIpOyAvL3Nsb3cgc2VyaWFsIGZ1bmN0aW9uISEhIQorfQorCisvLyoqKioqKioqKioqKiogVmVjdG9yIHNhdHVyYXRpbmcgZG91YmxpbmcgbG9uZyBtdWx0aXBseSBieSBzY2FsYXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDMyeDRfdCB2cWRtdWxsX2xhbmVfczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKTsgLy8gVlFETVVMTC5TMTYgcTAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZxZG11bGxfbGFuZV9zMTYoaW50MTZ4NF90IHZlYzEsIGludDE2eDRfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMykgaW50IHZhbDMpCit7CisgICAgaW50MTZfdCBjOworICAgIGludDE2eDRfdCBzY2FsYXI7CisgICAgYyA9IHZnZXRfbGFuZV9zMTYodmFsMiwgdmFsMyk7CisgICAgc2NhbGFyID0gdmR1cF9uX3MxNihjKTsKKyAgICByZXR1cm4gdnFkbXVsbF9zMTYodmVjMSwgc2NhbGFyKTsKK30KKworCitpbnQ2NHgyX3QgdnFkbXVsbF9sYW5lX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyk7IC8vICBWUURNVUxMLlMzMiBxMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgyX3QgdnFkbXVsbF9sYW5lX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgaW50MzJfdCBjOworICAgIGludDMyeDJfdCBzY2FsYXI7CisgICAgYyA9IHZnZXRfbGFuZV9zMzIodmFsMiwgdmFsMyk7CisgICAgc2NhbGFyID0gdmR1cF9uX3MzMihjKTsKKyAgICByZXR1cm4gdnFkbXVsbF9zMzIodmVjMSxzY2FsYXIpOyAvL3Nsb3cgc2VyaWFsIGZ1bmN0aW9uISEhIQorfQorCisvLyAqKioqKlZlY3RvciBzYXR1cmF0aW5nIGRvdWJsaW5nIG11bHRpcGx5IGhpZ2ggd2l0aCBzY2FsYXIgKioqKioKK2ludDE2eDRfdCB2cWRtdWxoX25fczE2KGludDE2eDRfdCB2ZWMxLCAgaW50MTZfdCB2YWwyKTsgLy8gIFZRRE1VTEguUzE2IGQwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cWRtdWxoX25fczE2KGludDE2eDRfdCB2ZWMxLCAgaW50MTZfdCB2YWwyKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2cWRtdWxocV9uX3MxNihfcE0xMjhpKHZlYzEpLCB2YWwyKSk7Cit9CisKK2ludDMyeDJfdCB2cWRtdWxoX25fczMyKGludDMyeDJfdCB2ZWMxLCAgaW50MzJfdCB2YWwyKTsgLy8gIFZRRE1VTEguUzMyIGQwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cWRtdWxoX25fczMyKGludDMyeDJfdCB2ZWMxLCAgaW50MzJfdCB2YWwyKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2cWRtdWxocV9uX3MzMihfcE0xMjhpKHZlYzEpLCB2YWwyKSk7Cit9CisKK2ludDE2eDhfdCB2cWRtdWxocV9uX3MxNihpbnQxNng4X3QgdmVjMSwgaW50MTZfdCB2YWwyKTsgLy8gIFZRRE1VTEguUzE2IHEwLHEwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2cWRtdWxocV9uX3MxNihpbnQxNng4X3QgdmVjMSwgaW50MTZfdCB2YWwyKSAvLyAgVlFETVVMSC5TMTYgcTAscTAsZDBbMF0KK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbAorICAgIGludDE2eDhfdCBzY2FsYXI7CisgICAgc2NhbGFyID0gdmR1cHFfbl9zMTYodmFsMik7CisgICAgcmV0dXJuIHZxZG11bGhxX3MxNih2ZWMxLCBzY2FsYXIpOworfQorCitpbnQzMng0X3QgdnFkbXVsaHFfbl9zMzIoaW50MzJ4NF90IHZlYzEsIGludDMyX3QgdmFsMik7IC8vICBWUURNVUxILlMzMiBxMCxxMCxkMFswXQorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMng0X3QgdnFkbXVsaHFfbl9zMzIoaW50MzJ4NF90IHZlYzEsIGludDMyX3QgdmFsMiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19VTkVGRkVDVElWRSkKK3sKKyAgICBpbnQzMng0X3Qgc2NhbGFyOworICAgIHNjYWxhciA9IHZkdXBxX25fczMyKHZhbDIpOworICAgIHJldHVybiB2cWRtdWxocV9zMzIodmVjMSwgc2NhbGFyKTsKK30KKworLy8qKioqKiBWZWN0b3Igc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBoaWdoIGJ5IHNjYWxhciAqKioqKioqKioqKioqKioqCitpbnQxNng0X3QgdnFkbXVsaF9sYW5lX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMyk7IC8vICBWUURNVUxILlMxNiBkMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnFkbXVsaF9sYW5lX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMykgLy8gIFZRRE1VTEguUzE2IGQwLGQwLGQwWzBdCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICBpbnQxNl90IHZsYW5lOworICAgIGludDE2eDRfdCBzY2FsYXI7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczE2KHZhbDIsIHZhbDMpOworICAgIHNjYWxhciA9IHZkdXBfbl9zMTYodmxhbmUpOworICAgIHJldHVybiB2cWRtdWxoX3MxNih2ZWMxLCBzY2FsYXIpOworfQorCitpbnQzMngyX3QgdnFkbXVsaF9sYW5lX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyk7IC8vICBWUURNVUxILlMzMiBkMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMngyX3QgdnFkbXVsaF9sYW5lX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19VTkVGRkVDVElWRSkKK3sKKyAgICBpbnQzMl90IHZsYW5lOworICAgIGludDMyeDJfdCBzY2FsYXI7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczMyKHZhbDIsIHZhbDMpOworICAgIHNjYWxhciA9IHZkdXBfbl9zMzIodmxhbmUpOworICAgIHJldHVybiB2cWRtdWxoX3MzMih2ZWMxLCBzY2FsYXIpOworfQorCitpbnQxNng4X3QgdnFkbXVsaHFfbGFuZV9zMTYoaW50MTZ4OF90IHZlYzEsIGludDE2eDRfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMykgaW50IHZhbDMpOyAvLyAgVlFETVVMSC5TMTYgcTAscTAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZxZG11bGhxX2xhbmVfczE2KGludDE2eDhfdCB2ZWMxLCBpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKSAvLyAgVlFETVVMSC5TMTYgcTAscTAsZDBbMF0KK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbAorICAgIGludDE2X3QgdmxhbmU7CisgICAgaW50MTZ4OF90IHNjYWxhcjsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMTYodmFsMiwgdmFsMyk7CisgICAgc2NhbGFyID0gdmR1cHFfbl9zMTYodmxhbmUgKTsKKyAgICByZXR1cm4gdnFkbXVsaHFfczE2KHZlYzEsIHNjYWxhcik7Cit9CisKK2ludDMyeDRfdCB2cWRtdWxocV9sYW5lX3MzMihpbnQzMng0X3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyk7IC8vICBWUURNVUxILlMzMiBxMCxxMCxkMFswXQorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMng0X3QgdnFkbXVsaHFfbGFuZV9zMzIoaW50MzJ4NF90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfVU5FRkZFQ1RJVkUpCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICBpbnQzMl90IHZsYW5lOworICAgIGludDMyeDRfdCBzY2FsYXI7CisgICAgdmxhbmUgPSB2Z2V0cV9sYW5lX3MzMihfcE0xMjhpKHZhbDIpLCB2YWwzKTsKKyAgICBzY2FsYXIgPSB2ZHVwcV9uX3MzMih2bGFuZSApOworICAgIHJldHVybiB2cWRtdWxocV9zMzIodmVjMSwgc2NhbGFyKTsKK30KKworLy8qKioqKioqKiBWZWN0b3Igc2F0dXJhdGluZyByb3VuZGluZyBkb3VibGluZyBtdWx0aXBseSBoaWdoIHdpdGggc2NhbGFyICoqKgoraW50MTZ4NF90IHZxcmRtdWxoX25fczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNl90IHZhbDIpOyAvLyBWUVJETVVMSC5TMTYgZDAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZxcmRtdWxoX25fczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNl90IHZhbDIpIC8vIFZRUkRNVUxILlMxNiBkMCxkMCxkMFswXQoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgaW50MTZ4NF90IHNjYWxhcjsKKyAgICBzY2FsYXIgPSB2ZHVwX25fczE2KHZhbDIpOworICAgIHJldHVybiB2cXJkbXVsaF9zMTYodmVjMSwgc2NhbGFyKTsKK30KKworaW50MzJ4Ml90IHZxcmRtdWxoX25fczMyKGludDMyeDJfdCB2ZWMxLCBpbnQzMl90IHZhbDIpOyAvLyBWUVJETVVMSC5TMzIgZDAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4Ml90IHZxcmRtdWxoX25fczMyKGludDMyeDJfdCB2ZWMxLCBpbnQzMl90IHZhbDIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfVU5FRkZFQ1RJVkUpCit7CisgICAgaW50MzJ4Ml90IHNjYWxhcjsKKyAgICBzY2FsYXIgPSB2ZHVwX25fczMyKHZhbDIpOworICAgIHJldHVybiB2cXJkbXVsaF9zMzIodmVjMSwgc2NhbGFyKTsKK30KKworaW50MTZ4OF90IHZxcmRtdWxocV9uX3MxNihpbnQxNng4X3QgdmVjMSwgaW50MTZfdCB2YWwyKTsgLy8gVlFSRE1VTEguUzE2IHEwLHEwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2cXJkbXVsaHFfbl9zMTYoaW50MTZ4OF90IHZlYzEsIGludDE2X3QgdmFsMikgLy8gVlFSRE1VTEguUzE2IHEwLHEwLGQwWzBdCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICBpbnQxNng4X3Qgc2NhbGFyOworICAgIHNjYWxhciA9IHZkdXBxX25fczE2KHZhbDIpOworICAgIHJldHVybiB2cXJkbXVsaHFfczE2KHZlYzEsIHNjYWxhcik7Cit9CisKK2ludDMyeDRfdCB2cXJkbXVsaHFfbl9zMzIoaW50MzJ4NF90IHZlYzEsIGludDMyX3QgdmFsMik7IC8vIFZRUkRNVUxILlMzMiBxMCxxMCxkMFswXQorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMng0X3QgdnFyZG11bGhxX25fczMyKGludDMyeDRfdCB2ZWMxLCBpbnQzMl90IHZhbDIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfVU5FRkZFQ1RJVkUpCit7CisgICAgaW50MzJ4NF90IHNjYWxhcjsKKyAgICBzY2FsYXIgPSB2ZHVwcV9uX3MzMih2YWwyKTsKKyAgICByZXR1cm4gdnFyZG11bGhxX3MzMih2ZWMxLCBzY2FsYXIpOworfQorCisvLyoqKioqKioqKiBWZWN0b3Igcm91bmRpbmcgc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBoaWdoIGJ5IHNjYWxhciAgKioqKgoraW50MTZ4NF90IHZxcmRtdWxoX2xhbmVfczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKTsgLy8gVlFSRE1VTEguUzE2IGQwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cXJkbXVsaF9sYW5lX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMykgLy8gVlFSRE1VTEguUzE2IGQwLGQwLGQwWzBdCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICBpbnQxNl90IHZsYW5lOworICAgIGludDE2eDRfdCBzY2FsYXI7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczE2KHZhbDIsIHZhbDMpOworICAgIHNjYWxhciA9IHZkdXBfbl9zMTYodmxhbmUpOworICAgIHJldHVybiB2cXJkbXVsaF9zMTYodmVjMSwgc2NhbGFyKTsKK30KKworaW50MzJ4Ml90IHZxcmRtdWxoX2xhbmVfczMyKGludDMyeDJfdCB2ZWMxLCBpbnQzMngyX3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDEpIGludCB2YWwzKTsgLy8gVlFSRE1VTEguUzMyIGQwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDJfdCB2cXJkbXVsaF9sYW5lX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19VTkVGRkVDVElWRSkKK3sKKyAgICBpbnQzMl90IHZsYW5lOworICAgIGludDMyeDJfdCBzY2FsYXI7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczMyKHZhbDIsIHZhbDMpOworICAgIHNjYWxhciA9IHZkdXBfbl9zMzIodmxhbmUpOworICAgIHJldHVybiB2cXJkbXVsaF9zMzIodmVjMSwgc2NhbGFyKTsKK30KKworaW50MTZ4OF90IHZxcmRtdWxocV9sYW5lX3MxNihpbnQxNng4X3QgdmVjMSwgaW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMyk7IC8vIFZRUkRNVUxILlMxNiBxMCxxMCxkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnFyZG11bGhxX2xhbmVfczE2KGludDE2eDhfdCB2ZWMxLCBpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKSAvLyBWUVJETVVMSC5TMTYgcTAscTAsZDBbMF0KK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbAorICAgIGludDE2X3QgdmxhbmU7CisgICAgaW50MTZ4OF90IHNjYWxhcjsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMTYodmFsMiwgdmFsMyk7CisgICAgc2NhbGFyID0gdmR1cHFfbl9zMTYodmxhbmUpOworICAgIHJldHVybiB2cXJkbXVsaHFfczE2KHZlYzEsIHNjYWxhcik7Cit9CisKK2ludDMyeDRfdCB2cXJkbXVsaHFfbGFuZV9zMzIoaW50MzJ4NF90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpOyAvLyBWUVJETVVMSC5TMzIgcTAscTAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4NF90IHZxcmRtdWxocV9sYW5lX3MzMihpbnQzMng0X3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19VTkVGRkVDVElWRSkKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbAorICAgIGludDMyX3QgdmxhbmU7CisgICAgaW50MzJ4NF90IHNjYWxhcjsKKyAgICB2bGFuZSA9IHZnZXRxX2xhbmVfczMyKF9wTTEyOGkodmFsMiksIHZhbDMpOworICAgIHNjYWxhciA9IHZkdXBxX25fczMyKHZsYW5lICk7CisgICAgcmV0dXJuIHZxcmRtdWxocV9zMzIodmVjMSwgc2NhbGFyKTsKK30KKworLy8qKioqKioqKioqKioqKlZlY3RvciBtdWx0aXBseSBhY2N1bXVsYXRlIHdpdGggc2NhbGFyICoqKioqKioqKioqKioqKioqKioKK2ludDE2eDRfdCB2bWxhX25fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZfdCBjKTsgLy8gVk1MQS5JMTYgZDAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3Qgdm1sYV9uX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYykgLy8gVk1MQS5JMTYgZDAsIGQwLCBkMFswXQoreworICAgIGludDE2eDRfdCBzY2FsYXI7CisgICAgc2NhbGFyID0gdmR1cF9uX3MxNihjKTsKKyAgICByZXR1cm4gdm1sYV9zMTYoYSwgYiwgc2NhbGFyKTsKK30KKworaW50MzJ4Ml90IHZtbGFfbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpOyAvLyBWTUxBLkkzMiBkMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2bWxhX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKSAvLyBWTUxBLkkzMiBkMCwgZDAsIGQwWzBdCit7CisgICAgaW50MzJ4Ml90IHNjYWxhcjsKKyAgICBzY2FsYXIgPSB2ZHVwX25fczMyKGMpOworICAgIHJldHVybiB2bWxhX3MzMihhLCBiLCBzY2FsYXIpOworfQorCit1aW50MTZ4NF90IHZtbGFfbl91MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiLCB1aW50MTZfdCBjKTsgLy8gVk1MQS5JMTYgZDAsIGQwLCBkMFswXQorI2RlZmluZSB2bWxhX25fdTE2IHZtbGFfbl9zMTYKKworCit1aW50MzJ4Ml90IHZtbGFfbl91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiLCB1aW50MzJfdCBjKTsgLy8gVk1MQS5JMzIgZDAsIGQwLCBkMFswXQorI2RlZmluZSB2bWxhX25fdTMyIHZtbGFfbl9zMzIKKworCitmbG9hdDMyeDJfdCB2bWxhX25fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJfdCBjKTsgLy8gVk1MQS5GMzIgZDAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2bWxhX25fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJfdCBjKSAvLyBWTUxBLkYzMiBkMCwgZDAsIGQwWzBdCit7CisgICAgZmxvYXQzMngyX3Qgc2NhbGFyOworICAgIHNjYWxhciA9IHZkdXBfbl9mMzIoYyk7CisgICAgcmV0dXJuIHZtbGFfZjMyKGEsIGIsIHNjYWxhcik7Cit9CisKK2ludDE2eDhfdCB2bWxhcV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2X3QgYyk7IC8vIFZNTEEuSTE2IHEwLCBxMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZtbGFxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZfdCBjKSAvLyBWTUxBLkkxNiBxMCwgcTAsIGQwWzBdCit7CisgICAgaW50MTZ4OF90IHNjYWxhcjsKKyAgICBzY2FsYXIgPSB2ZHVwcV9uX3MxNihjKTsKKyAgICByZXR1cm4gdm1sYXFfczE2KGEsYixzY2FsYXIpOworfQorCitpbnQzMng0X3Qgdm1sYXFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMl90IGMpOyAvLyBWTUxBLkkzMiBxMCwgcTAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2bWxhcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyX3QgYykgLy8gVk1MQS5JMzIgcTAsIHEwLCBkMFswXQoreworICAgIGludDMyeDRfdCBzY2FsYXI7CisgICAgc2NhbGFyID0gdmR1cHFfbl9zMzIoYyk7CisgICAgcmV0dXJuIHZtbGFxX3MzMihhLGIsc2NhbGFyKTsKK30KKwordWludDE2eDhfdCB2bWxhcV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2X3QgYyk7IC8vIFZNTEEuSTE2IHEwLCBxMCwgZDBbMF0KKyNkZWZpbmUgdm1sYXFfbl91MTYgdm1sYXFfbl9zMTYKKwordWludDMyeDRfdCB2bWxhcV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyX3QgYyk7IC8vIFZNTEEuSTMyIHEwLCBxMCwgZDBbMF0KKyNkZWZpbmUgdm1sYXFfbl91MzIgdm1sYXFfbl9zMzIKKworZmxvYXQzMng0X3Qgdm1sYXFfbl9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMl90IGMpOyAvLyBWTUxBLkYzMiBxMCwgcTAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZtbGFxX25fZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJfdCBjKSAvLyBWTUxBLkYzMiBxMCwgcTAsIGQwWzBdCit7CisgICAgZmxvYXQzMng0X3Qgc2NhbGFyOworICAgIHNjYWxhciA9IHZkdXBxX25fZjMyKGMpOworICAgIHJldHVybiB2bWxhcV9mMzIoYSxiLHNjYWxhcik7Cit9CisKKy8vKioqKioqKioqKioqVmVjdG9yIHdpZGVuaW5nIG11bHRpcGx5IGFjY3VtdWxhdGUgd2l0aCBzY2FsYXIqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQzMng0X3Qgdm1sYWxfbl9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpOyAvLyBWTUxBTC5TMTYgcTAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3Qgdm1sYWxfbl9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpIC8vIFZNTEFMLlMxNiBxMCwgZDAsIGQwWzBdCit7CisgICAgaW50MTZ4NF90IHZjOworICAgIHZjID0gdmR1cF9uX3MxNihjKTsKKyAgICByZXR1cm4gdm1sYWxfczE2KGEsIGIsIHZjKTsKK30KKworaW50NjR4Ml90IHZtbGFsX25fczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKTsgLy8gVk1MQUwuUzMyIHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90IHZtbGFsX25fczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKSAvLyBWTUxBTC5TMzIgcTAsIGQwLCBkMFswXQoreworICAgIGludDMyeDJfdCB2YzsKKyAgICB2YyA9IHZkdXBfbl9zMzIoYyk7CisgICAgcmV0dXJuIHZtbGFsX3MzMihhLCBiLCB2Yyk7Cit9CisKK3VpbnQzMng0X3Qgdm1sYWxfbl91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNl90IGMpOyAvLyBWTUxBTC5zMTYgcTAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZtbGFsX25fdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZfdCBjKSAvLyBWTUxBTC5zMTYgcTAsIGQwLCBkMFswXQoreworICAgIHVpbnQxNng0X3QgdmM7CisgICAgdmMgPSB2ZHVwX25fczE2KGMpOworICAgIHJldHVybiB2bWxhbF9zMTYoYSwgYiwgdmMpOworfQorCit1aW50NjR4Ml90IHZtbGFsX25fdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJfdCBjKTsgLy8gVk1MQUwuVTMyIHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2bWxhbF9uX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyX3QgYykgLy8gVk1MQUwuVTMyIHEwLCBkMCwgZDBbMF0KK3sKKyAgICB1aW50MzJ4Ml90IHZjOworICAgIHZjID0gdmR1cF9uX3UzMihjKTsKKyAgICByZXR1cm4gdm1sYWxfdTMyKGEsIGIsIHZjKTsKK30KKworLy8qKioqKioqKioqKiogVmVjdG9yIHdpZGVuaW5nIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgYWNjdW11bGF0ZSB3aXRoIHNjYWxhciAqKioqKioqKioqKioqKgoraW50MzJ4NF90IHZxZG1sYWxfbl9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpOyAvLyBWUURNTEFMLlMxNiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2cWRtbGFsX25fczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZfdCBjKQoreworICAgIC8vbm90IG9wdGltYWwgU0lNRCBzb3VsdXRpb24sIHNlcmlhbCBtYXkgYmUgZmFzdGVyCisgICAgaW50MTZ4NF90IHZjOworICAgIHZjID0gdmR1cF9uX3MxNihjKTsKKyAgICByZXR1cm4gdnFkbWxhbF9zMTYoYSwgYiwgdmMpOworfQorCitpbnQ2NHgyX3QgdnFkbWxhbF9uX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyX3QgYyk7IC8vIFZRRE1MQUwuUzMyIHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4Ml90IHZxZG1sYWxfbl9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIGludDMyeDJfdCB2YzsKKyAgICB2YyA9IHZkdXBfbl9zMzIoYyk7CisgICAgcmV0dXJuIHZxZG1sYWxfczMyKGEsIGIsIHZjKTsKK30KKworLy8qKioqKioqKiBWZWN0b3IgbXVsdGlwbHkgc3VidHJhY3Qgd2l0aCBzY2FsYXIgKioqKioqKioqKioqKioKK2ludDE2eDRfdCB2bWxzX25fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZfdCBjKTsgLy8gVk1MUy5JMTYgZDAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3Qgdm1sc19uX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYykgLy8gVk1MUy5JMTYgZDAsIGQwLCBkMFswXQoreworICAgIGludDE2eDRfdCB2YzsKKyAgICB2YyA9IHZkdXBfbl9zMTYoYyk7CisgICAgcmV0dXJuIHZtbHNfczE2KGEsIGIsIHZjKTsKK30KKworaW50MzJ4Ml90IHZtbHNfbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpOyAvLyBWTUxTLkkzMiBkMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2bWxzX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKSAvLyBWTUxTLkkzMiBkMCwgZDAsIGQwWzBdCit7CisgICAgaW50MzJ4Ml90IHZjOworICAgIHZjID0gdmR1cF9uX3MzMihjKTsKKyAgICByZXR1cm4gdm1sc19zMzIoYSwgYiwgdmMpOworfQorCit1aW50MTZ4NF90IHZtbHNfbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNl90IGMpOyAvLyBWTUxTLkkxNiBkMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3Qgdm1sc19uX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2X3QgYykgLy8gVk1MUy5JMTYgZDAsIGQwLCBkMFswXQoreworICAgIHVpbnQxNng0X3QgdmM7CisgICAgdmMgPSB2ZHVwX25fczE2KGMpOworICAgIHJldHVybiB2bWxzX3MxNihhLCBiLCB2Yyk7Cit9CisKK3VpbnQzMngyX3Qgdm1sc19uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyX3QgYyk7IC8vIFZNTFMuSTMyIGQwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2bWxzX25fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJfdCBjKSAvLyBWTUxTLkkzMiBkMCwgZDAsIGQwWzBdCit7CisgICAgdWludDMyeDJfdCB2YzsKKyAgICB2YyA9IHZkdXBfbl91MzIoYyk7CisgICAgcmV0dXJuIHZtbHNfdTMyKGEsIGIsIHZjKTsKK30KKworZmxvYXQzMngyX3Qgdm1sc19uX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyX3QgYyk7IC8vIFZNTFMuRjMyIGQwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3Qgdm1sc19uX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyX3QgYykKK3sKKyAgICBmbG9hdDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9mMzJbMF0gPSBhLm02NF9mMzJbMF0gLSBiLm02NF9mMzJbMF0gKiBjOworICAgIHJlcy5tNjRfZjMyWzFdID0gYS5tNjRfZjMyWzFdIC0gYi5tNjRfZjMyWzFdICogYzsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQxNng4X3Qgdm1sc3Ffbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNl90IGMpOyAvLyBWTUxTLkkxNiBxMCwgcTAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2bWxzcV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2X3QgYykgLy8gVk1MUy5JMTYgcTAsIHEwLCBkMFswXQoreworICAgIGludDE2eDhfdCB2YzsKKyAgICB2YyA9IHZkdXBxX25fczE2KGMpOworICAgIHJldHVybiB2bWxzcV9zMTYoYSwgYix2Yyk7Cit9CisKK2ludDMyeDRfdCB2bWxzcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyX3QgYyk7IC8vIFZNTFMuSTMyIHEwLCBxMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZtbHNxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJfdCBjKSAvLyBWTUxTLkkzMiBxMCwgcTAsIGQwWzBdCit7CisgICAgaW50MzJ4NF90IHZjOworICAgIHZjID0gdmR1cHFfbl9zMzIoYyk7CisgICAgcmV0dXJuIHZtbHNxX3MzMihhLGIsdmMpOworfQorCit1aW50MTZ4OF90IHZtbHNxX25fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZfdCBjKTsgLy8gVk1MUy5JMTYgcTAsIHEwLCBkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZtbHNxX25fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZfdCBjKSAvLyBWTUxTLkkxNiBxMCwgcTAsIGQwWzBdCit7CisgICAgdWludDMyeDRfdCB2YzsKKyAgICB2YyA9IHZkdXBxX25fdTMyKGMpOworICAgIHJldHVybiB2bWxzcV91MzIoYSxiLHZjKTsKK30KKwordWludDMyeDRfdCB2bWxzcV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyX3QgYyk7IC8vIFZNTFMuSTMyIHEwLCBxMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2bWxzcV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyX3QgYykgLy8gVk1MUy5JMzIgcTAsIHEwLCBkMFswXQoreworICAgIHVpbnQzMng0X3QgdmM7CisgICAgdmMgPSB2ZHVwcV9uX3UzMihjKTsKKyAgICByZXR1cm4gdm1sc3FfdTMyKGEsYix2Yyk7Cit9CisKK2Zsb2F0MzJ4NF90IHZtbHNxX25fZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJfdCBjKTsgLy8gVk1MUy5GMzIgcTAsIHEwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDRfdCB2bWxzcV9uX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyX3QgYykKK3sKKyAgICBmbG9hdDMyeDRfdCB2YzsKKyAgICB2YyA9IHZkdXBxX25fZjMyKGMpOworICAgIHJldHVybiB2bWxzcV9mMzIoYSxiLHZjKTsKK30KKworLy8qKioqIFZlY3RvciB3aWRlbmluZyBtdWx0aXBseSBzdWJ0cmFjdCB3aXRoIHNjYWxhciAqKioqKioKK2ludDMyeDRfdCB2bWxzbF9uX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYyk7IC8vIFZNTFNMLlMxNiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2bWxzbF9uX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYykgLy8gVk1MU0wuUzE2IHEwLCBkMCwgZDBbMF0KK3sKKyAgICBpbnQxNng0X3QgdmM7CisgICAgdmMgPSB2ZHVwX25fczE2KGMpOworICAgIHJldHVybiB2bWxzbF9zMTYoYSwgYiwgdmMpOworfQorCitpbnQ2NHgyX3Qgdm1sc2xfbl9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpOyAvLyBWTUxTTC5TMzIgcTAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3Qgdm1sc2xfbl9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpIC8vIFZNTFNMLlMzMiBxMCwgZDAsIGQwWzBdCit7CisgICAgaW50MzJ4Ml90IHZjOworICAgIHZjID0gdmR1cF9uX3MzMihjKTsKKyAgICByZXR1cm4gdm1sc2xfczMyKGEsIGIsIHZjKTsKK30KKwordWludDMyeDRfdCB2bWxzbF9uX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2X3QgYyk7IC8vIFZNTFNMLnMxNiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3Qgdm1sc2xfbl91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNl90IGMpIC8vIFZNTFNMLnMxNiBxMCwgZDAsIGQwWzBdCit7CisgICAgdWludDE2eDRfdCB2YzsKKyAgICB2YyA9IHZkdXBfbl91MTYoYyk7CisgICAgcmV0dXJuIHZtbHNsX3UxNihhLCBiLCB2Yyk7Cit9CisKK3VpbnQ2NHgyX3Qgdm1sc2xfbl91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMl90IGMpOyAvLyBWTUxTTC5VMzIgcTAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50NjR4Ml90IHZtbHNsX25fdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJfdCBjKSAvLyBWTUxTTC5VMzIgcTAsIGQwLCBkMFswXQoreworICAgIHVpbnQzMngyX3QgdmM7CisgICAgdmMgPSB2ZHVwX25fdTMyKGMpOworICAgIHJldHVybiB2bWxzbF91MzIoYSwgYiwgdmMpOworfQorCisvLyoqKioqIFZlY3RvciB3aWRlbmluZyBzYXR1cmF0aW5nIGRvdWJsaW5nIG11bHRpcGx5IHN1YnRyYWN0IHdpdGggc2NhbGFyICoqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQzMng0X3QgdnFkbWxzbF9uX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYyk7IC8vIFZRRE1MU0wuUzE2IHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZxZG1sc2xfbl9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpCit7CisgICAgaW50MTZ4NF90IHZjOworICAgIHZjID0gdmR1cF9uX3MxNihjKTsKKyAgICByZXR1cm4gdnFkbWxzbF9zMTYoYSwgYiwgdmMpOworfQorCitpbnQ2NHgyX3QgdnFkbWxzbF9uX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyX3QgYyk7IC8vIFZRRE1MU0wuUzMyIHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4Ml90IHZxZG1sc2xfbl9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIGludDMyeDJfdCB2YzsKKyAgICB2YyA9IHZkdXBfbl9zMzIoYyk7CisgICAgcmV0dXJuIHZxZG1sc2xfczMyKGEsIGIsIHZjKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqICBWZWN0b3IgZXh0cmFjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL1ZFWFQgKFZlY3RvciBFeHRyYWN0KSBleHRyYWN0cyAgZWxlbWVudHMgZnJvbSB0aGUgYm90dG9tIGVuZCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQKKy8vdmVjdG9yIGFuZCB0aGUgdG9wIGVuZCBvZiB0aGUgZmlyc3QsIGNvbmNhdGVuYXRlcyB0aGVtLCBhbmQgcGxhY2VzIHRoZSByZXN1bHQgaW4gdGhlIGRlc3RpbmF0aW9uIHZlY3RvcgorLy9jIGVsZW1lbnRzIGZyb20gdGhlIGJvdHRvbSBlbmQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGFuZCAoOC1jKSBmcm9tIHRoZSB0b3AgZW5kIG9mIHRoZSBmaXJzdAoraW50OHg4X3QgdmV4dF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZFWFQuOCBkMCxkMCxkMCwjMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ4eDhfdCB2ZXh0X3M4KGludDh4OF90IGEsIGludDh4OF90IGIsIF9fY29uc3RyYW5nZSgwLDcpIGludCBjKSxfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIGludDh4OF90IHJlczsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpPDggLSBjOyBpKyspIHsKKyAgICAgICAgcmVzLm02NF9pOFtpXSA9IGEubTY0X2k4W2kgKyBjXTsKKyAgICB9CisgICAgZm9yKGkgPSAwOyBpPGM7IGkrKykgeworICAgICAgICByZXMubTY0X2k4WzggLSBjICsgaV0gPSBiLm02NF9pOFtpXTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDh4OF90IHZleHRfdTgodWludDh4OF90IGEsICB1aW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWRVhULjggZDAsZDAsZDAsIzAKKyNkZWZpbmUgdmV4dF91OCB2ZXh0X3M4CisvL3NhbWUgcmVzdWx0IHRlc3RlZAorCitwb2x5OHg4X3QgdmV4dF9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIsIF9fY29uc3RyYW5nZSgwLDcpIGludCBjKTsgLy8gVkVYVC44IGQwLGQwLGQwLCMwCisjZGVmaW5lIHZleHRfcDggdmV4dF91OAorCitpbnQxNng0X3QgdmV4dF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgYyk7IC8vIFZFWFQuMTYgZDAsZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90ICBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyAodmV4dF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgYyksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgaW50MTZ4NF90IHJlczsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpPDQgLSBjOyBpKyspIHsKKyAgICAgICAgcmVzLm02NF9pMTZbaV0gPSBhLm02NF9pMTZbaSArIGNdOworICAgIH0KKyAgICBmb3IoaSA9IDA7IGk8YzsgaSsrKSB7CisgICAgICAgIHJlcy5tNjRfaTE2WzQgLSBjICsgaV0gPSBiLm02NF9pMTZbaV07CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQxNng0X3QgdmV4dF91MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgYyk7IC8vIFZFWFQuMTYgZDAsZDAsZDAsIzAKKyNkZWZpbmUgdmV4dF91MTYgdmV4dF9zMTYKKworcG9seTE2eDRfdCB2ZXh0X3AxNihwb2x5MTZ4NF90IGEsIHBvbHkxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpOyAvLyBWRVhULjE2IGQwLGQwLGQwLCMwCisjZGVmaW5lIHZleHRfcDE2IHZleHRfczE2CisKK2ludDMyeDJfdCB2ZXh0X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsgLy8gVkVYVC4zMiBkMCxkMCxkMCwjMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMngyX3QgdmV4dF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYyksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgaW50MzJ4Ml90IHJlczsKKyAgICBpZiAoYz09MCkgeworICAgICAgICByZXMubTY0X2kzMlswXSA9IGEubTY0X2kzMlswXTsKKyAgICAgICAgcmVzLm02NF9pMzJbMV0gPSBhLm02NF9pMzJbMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzLm02NF9pMzJbMF0gPSBhLm02NF9pMzJbMV07CisgICAgICAgIHJlcy5tNjRfaTMyWzFdID0gYi5tNjRfaTMyWzBdOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitmbG9hdDMyeDJfdCB2ZXh0X2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYyk7IC8vIFZFWFQuMzIgZDAsZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoZmxvYXQzMngyX3QgdmV4dF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIGZsb2F0MzJ4Ml90IHJlczsKKyAgICBpZiAoYz09MCkgeworICAgICAgICByZXMubTY0X2YzMlswXSA9IGEubTY0X2YzMlswXTsKKyAgICAgICAgcmVzLm02NF9mMzJbMV0gPSBhLm02NF9mMzJbMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzLm02NF9mMzJbMF0gPSBhLm02NF9mMzJbMV07CisgICAgICAgIHJlcy5tNjRfZjMyWzFdID0gYi5tNjRfZjMyWzBdOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50MzJ4Ml90IHZleHRfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOyAvLyBWRVhULjMyIGQwLGQwLGQwLCMwCisjZGVmaW5lIHZleHRfdTMyIHZleHRfczMyCisKKworaW50NjR4MV90IHZleHRfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDAsMCkgaW50IGMpOyAvLyBWRVhULjY0IGQwLGQwLGQwLCMwCisjZGVmaW5lIHZleHRfczY0KGEsYixjKSBhCisKK3VpbnQ2NHgxX3QgdmV4dF91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgwLDApIGludCBjKTsgLy8gVkVYVC42NCBkMCxkMCxkMCwjMAorI2RlZmluZSB2ZXh0X3U2NChhLGIsYykgYQorCitpbnQ4eDE2X3QgdmV4dHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGMpOyAvLyBWRVhULjggcTAscTAscTAsIzAKKyNkZWZpbmUgdmV4dHFfczgoYSxiLGMpIF9NTV9BTElHTlJfRVBJOCAoYixhLGMpCisKK3VpbnQ4eDE2X3QgdmV4dHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYyk7IC8vIFZFWFQuOCBxMCxxMCxxMCwjMAorI2RlZmluZSB2ZXh0cV91OChhLGIsYykgX01NX0FMSUdOUl9FUEk4IChiLGEsYykKKworcG9seTh4MTZfdCB2ZXh0cV9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYiwgX19jb25zdHJhbmdlKDAsMTUpIGludCBjKTsgLy8gVkVYVC44IHEwLHEwLHEwLCMwCisjZGVmaW5lIHZleHRxX3A4IHZleHRxX3M4CisKK2ludDE2eDhfdCB2ZXh0cV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZFWFQuMTYgcTAscTAscTAsIzAKKyNkZWZpbmUgdmV4dHFfczE2KGEsYixjKSBfTU1fQUxJR05SX0VQSTggKGIsYSxjICogMikKKwordWludDE2eDhfdCB2ZXh0cV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgwLDcpIGludCBjKTsgLy8gVkVYVC4xNiBxMCxxMCxxMCwjMAorI2RlZmluZSB2ZXh0cV91MTYoYSxiLGMpIF9NTV9BTElHTlJfRVBJOCAoYixhLGMgKiAyKQorCitwb2x5MTZ4OF90IHZleHRxX3AxNihwb2x5MTZ4OF90IGEsIHBvbHkxNng4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWRVhULjE2IHEwLHEwLHEwLCMwCisjZGVmaW5lIHZleHRxX3AxNiB2ZXh0cV9zMTYKKworaW50MzJ4NF90IHZleHRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKTsgLy8gVkVYVC4zMiBxMCxxMCxxMCwjMAorI2RlZmluZSB2ZXh0cV9zMzIoYSxiLGMpIF9NTV9BTElHTlJfRVBJOCAoYixhLGMgKiA0KQorCit1aW50MzJ4NF90IHZleHRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpOyAvLyBWRVhULjMyIHEwLHEwLHEwLCMwCisjZGVmaW5lIHZleHRxX3UzMihhLGIsYykgX01NX0FMSUdOUl9FUEk4IChiLGEsYyAqIDQpCisKK2Zsb2F0MzJ4NF90IHZleHRxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBmbG9hdCBjKTsgLy8gVkVYVC4zMiBxMCxxMCxxMCwjMAorI2RlZmluZSB2ZXh0cV9mMzIoYSxiLGMpIF9NMTI4KHZleHRxX3MzMihfTTEyOGkoYSksX00xMjhpKGIpLGMpICkKKworaW50NjR4Ml90IHZleHRxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsgLy8gVkVYVC42NCBxMCxxMCxxMCwjMAorI2RlZmluZSB2ZXh0cV9zNjQoYSxiLGMpIF9NTV9BTElHTlJfRVBJOChiLGEsYyAqIDgpCisKK3VpbnQ2NHgyX3QgdmV4dHFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYyk7IC8vIFZFWFQuNjQgcTAscTAscTAsIzAKKyNkZWZpbmUgdmV4dHFfdTY0KGEsYixjKSBfTU1fQUxJR05SX0VQSTgoYixhLGMgKiA4KQorCisvLyoqKioqKioqKioqKiBSZXZlcnNlIHZlY3RvciBlbGVtZW50cyAoc3dhcCBlbmRpYW5uZXNzKSoqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vVlJFVm4ubSByZXZlcnNlcyB0aGUgb3JkZXIgb2YgdGhlIG0tYml0IGxhbmVzIHdpdGhpbiBhIHNldCB0aGF0IGlzIG4gYml0cyB3aWRlLgoraW50OHg4X3QgdnJldjY0X3M4KGludDh4OF90IHZlYyk7IC8vIFZSRVY2NC44IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZyZXY2NF9zOChpbnQ4eDhfdCB2ZWMpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdnJldjY0cV9zOChfcE0xMjhpKHZlYykpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDE2eDRfdCB2cmV2NjRfczE2KGludDE2eDRfdCB2ZWMpOyAvLyBWUkVWNjQuMTYgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZyZXY2NF9zMTYoaW50MTZ4NF90IHZlYykKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdnJldjY0cV9zMTYoX3BNMTI4aSh2ZWMpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQzMngyX3QgdnJldjY0X3MzMihpbnQzMngyX3QgdmVjKTsgLy8gVlJFVjY0LjMyIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cmV2NjRfczMyKGludDMyeDJfdCB2ZWMpCit7CisgICAgaW50MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X2kzMlswXSA9IHZlYy5tNjRfaTMyWzFdOworICAgIHJlcy5tNjRfaTMyWzFdID0gdmVjLm02NF9pMzJbMF07CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDh4OF90IHZyZXY2NF91OCh1aW50OHg4X3QgdmVjKTsgLy8gVlJFVjY0LjggZDAsZDAKKyNkZWZpbmUgdnJldjY0X3U4IHZyZXY2NF9zOAorCit1aW50MTZ4NF90IHZyZXY2NF91MTYodWludDE2eDRfdCB2ZWMpOyAvLyBWUkVWNjQuMTYgZDAsZDAKKyNkZWZpbmUgdnJldjY0X3UxNiB2cmV2NjRfczE2CisKK3VpbnQzMngyX3QgdnJldjY0X3UzMih1aW50MzJ4Ml90IHZlYyk7IC8vIFZSRVY2NC4zMiBkMCxkMAorI2RlZmluZSB2cmV2NjRfdTMyIHZyZXY2NF9zMzIKKworcG9seTh4OF90IHZyZXY2NF9wOChwb2x5OHg4X3QgdmVjKTsgLy8gVlJFVjY0LjggZDAsZDAKKyNkZWZpbmUgdnJldjY0X3A4IHZyZXY2NF91OAorCitwb2x5MTZ4NF90IHZyZXY2NF9wMTYocG9seTE2eDRfdCB2ZWMpOyAvLyBWUkVWNjQuMTYgZDAsZDAKKyNkZWZpbmUgdnJldjY0X3AxNiB2cmV2NjRfdTE2CisKK2Zsb2F0MzJ4Ml90IHZyZXY2NF9mMzIoZmxvYXQzMngyX3QgdmVjKTsgLy8gVlJFVjY0LjMyIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZyZXY2NF9mMzIoZmxvYXQzMngyX3QgdmVjKQoreworICAgIGZsb2F0MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X2YzMlswXSA9IHZlYy5tNjRfZjMyWzFdOworICAgIHJlcy5tNjRfZjMyWzFdID0gdmVjLm02NF9mMzJbMF07CisgICAgcmV0dXJuIHJlczsKK30KKworaW50OHgxNl90IHZyZXY2NHFfczgoaW50OHgxNl90IHZlYyk7IC8vIFZSRVY2NC44IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCB2cmV2NjRxX3M4KGludDh4MTZfdCB2ZWMpIC8vIFZSRVY2NC44IHEwLHEwCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrX3Jldl9lOFsxNl0gPSB7Nyw2LDUsNCwzLDIsMSwwLCAxNSwxNCwxMywxMiwxMSwxMCw5LCA4fTsKKyAgICByZXR1cm4gX21tX3NodWZmbGVfZXBpOCAodmVjLCAqKF9fbTEyOGkqKSAgbWFza19yZXZfZTgpOworfQorCitpbnQxNng4X3QgdnJldjY0cV9zMTYoaW50MTZ4OF90IHZlYyk7IC8vIFZSRVY2NC4xNiBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnJldjY0cV9zMTYoaW50MTZ4OF90IHZlYykgLy8gVlJFVjY0LjE2IHEwLHEwCit7CisgICAgLy9ubyBfbW1fc2h1ZmZsZV9lcGkxNiwgX21tX3NodWZmbGVfZXBpOCB0byBiZSB1c2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbWFzaworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFza19yZXZfZTE2WzE2XSA9IHs2LDcsIDQsNSwyLDMsMCwxLDE0LDE1LDEyLDEzLDEwLDExLDgsOX07CisgICAgcmV0dXJuIF9tbV9zaHVmZmxlX2VwaTggKHZlYywgKihfX20xMjhpKiltYXNrX3Jldl9lMTYpOworfQorCitpbnQzMng0X3QgdnJldjY0cV9zMzIoaW50MzJ4NF90IHZlYyk7IC8vIFZSRVY2NC4zMiBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnJldjY0cV9zMzIoaW50MzJ4NF90IHZlYykgLy8gVlJFVjY0LjMyIHEwLHEwCit7CisgICAgcmV0dXJuIF9tbV9zaHVmZmxlX2VwaTMyICh2ZWMsIDEgfCAoMCA8PCAyKSB8ICgzIDw8IDQpIHwgKDIgPDwgNikgKTsKK30KKwordWludDh4MTZfdCB2cmV2NjRxX3U4KHVpbnQ4eDE2X3QgdmVjKTsgLy8gVlJFVjY0LjggcTAscTAKKyNkZWZpbmUgdnJldjY0cV91OCB2cmV2NjRxX3M4CisKK3VpbnQxNng4X3QgdnJldjY0cV91MTYodWludDE2eDhfdCB2ZWMpOyAvLyBWUkVWNjQuMTYgcTAscTAKKyNkZWZpbmUgdnJldjY0cV91MTYgdnJldjY0cV9zMTYKKwordWludDMyeDRfdCB2cmV2NjRxX3UzMih1aW50MzJ4NF90IHZlYyk7IC8vIFZSRVY2NC4zMiBxMCxxMAorI2RlZmluZSB2cmV2NjRxX3UzMiB2cmV2NjRxX3MzMgorCitwb2x5OHgxNl90IHZyZXY2NHFfcDgocG9seTh4MTZfdCB2ZWMpOyAvLyBWUkVWNjQuOCBxMCxxMAorI2RlZmluZSB2cmV2NjRxX3A4IHZyZXY2NHFfdTgKKworcG9seTE2eDhfdCB2cmV2NjRxX3AxNihwb2x5MTZ4OF90IHZlYyk7IC8vIFZSRVY2NC4xNiBxMCxxMAorI2RlZmluZSB2cmV2NjRxX3AxNiB2cmV2NjRxX3UxNgorCitmbG9hdDMyeDRfdCB2cmV2NjRxX2YzMihmbG9hdDMyeDRfdCB2ZWMpOyAvLyBWUkVWNjQuMzIgcTAscTAKKyNkZWZpbmUgdnJldjY0cV9mMzIodmVjKSBfbW1fc2h1ZmZsZV9wcyAodmVjLCAgdmVjLCBfTU1fU0hVRkZMRSgyLDMsIDAsMSkpCisKKy8vKioqKioqKioqKioqKioqKioqKiogIDMyIGJpdCBzaHVmZmxlcyAqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdnJldjMyX3M4KGludDh4OF90IHZlYyk7IC8vIFZSRVYzMi44IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZyZXYzMl9zOChpbnQ4eDhfdCB2ZWMpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdnJldjMycV9zOChfcE0xMjhpKHZlYykpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDE2eDRfdCB2cmV2MzJfczE2KGludDE2eDRfdCB2ZWMpOyAvLyBWUkVWMzIuMTYgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZyZXYzMl9zMTYoaW50MTZ4NF90IHZlYykKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdnJldjMycV9zMTYoX3BNMTI4aSh2ZWMpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCit1aW50OHg4X3QgdnJldjMyX3U4KHVpbnQ4eDhfdCB2ZWMpOyAvLyBWUkVWMzIuOCBkMCxkMAorI2RlZmluZSB2cmV2MzJfdTggdnJldjMyX3M4CisKK3VpbnQxNng0X3QgdnJldjMyX3UxNih1aW50MTZ4NF90IHZlYyk7IC8vIFZSRVYzMi4xNiBkMCxkMAorI2RlZmluZSB2cmV2MzJfdTE2IHZyZXYzMl9zMTYKKworcG9seTh4OF90IHZyZXYzMl9wOChwb2x5OHg4X3QgdmVjKTsgLy8gVlJFVjMyLjggZDAsZDAKKyNkZWZpbmUgdnJldjMyX3A4IHZyZXYzMl91OAorCitwb2x5MTZ4NF90IHZyZXYzMl9wMTYocG9seTE2eDRfdCB2ZWMpOyAvLyBWUkVWMzIuMTYgZDAsZDAKKyNkZWZpbmUgdnJldjMyX3AxNiB2cmV2MzJfdTE2CisKK2ludDh4MTZfdCB2cmV2MzJxX3M4KGludDh4MTZfdCB2ZWMpOyAvLyBWUkVWMzIuOCBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdnJldjMycV9zOChpbnQ4eDE2X3QgdmVjKSAvLyBWUkVWMzIuOCBxMCxxMAoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFza19yZXZfZThbMTZdID0gezMsMiwxLDAsIDcsNiw1LDQsIDExLDEwLDksOCwgMTUsMTQsMTMsMTJ9OworICAgIHJldHVybiBfbW1fc2h1ZmZsZV9lcGk4ICh2ZWMsICooX19tMTI4aSopICBtYXNrX3Jldl9lOCk7Cit9CisKK2ludDE2eDhfdCB2cmV2MzJxX3MxNihpbnQxNng4X3QgdmVjKTsgLy8gVlJFVjMyLjE2IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2cmV2MzJxX3MxNihpbnQxNng4X3QgdmVjKSAvLyBWUkVWMzIuMTYgcTAscTAKK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2tfcmV2X2U4WzE2XSA9IHsyLDMsMCwxLCA2LDcsIDQsNSwgMTAsMTEsIDgsOSwgMTQsMTUsMTIsMTN9OworICAgIHJldHVybiBfbW1fc2h1ZmZsZV9lcGk4ICh2ZWMsICooX19tMTI4aSopICBtYXNrX3Jldl9lOCk7Cit9CisKK3VpbnQ4eDE2X3QgdnJldjMycV91OCh1aW50OHgxNl90IHZlYyk7IC8vIFZSRVYzMi44IHEwLHEwCisjZGVmaW5lIHZyZXYzMnFfdTggdnJldjMycV9zOAorCit1aW50MTZ4OF90IHZyZXYzMnFfdTE2KHVpbnQxNng4X3QgdmVjKTsgLy8gVlJFVjMyLjE2IHEwLHEwCisjZGVmaW5lIHZyZXYzMnFfdTE2IHZyZXYzMnFfczE2CisKK3BvbHk4eDE2X3QgdnJldjMycV9wOChwb2x5OHgxNl90IHZlYyk7IC8vIFZSRVYzMi44IHEwLHEwCisjZGVmaW5lIHZyZXYzMnFfcDggdnJldjMycV91OAorCitwb2x5MTZ4OF90IHZyZXYzMnFfcDE2KHBvbHkxNng4X3QgdmVjKTsgLy8gVlJFVjMyLjE2IHEwLHEwCisjZGVmaW5lIHZyZXYzMnFfcDE2IHZyZXYzMnFfdTE2CisKKy8vKioqKioqKioqKioqKiAgMTYgYml0IHNodWZmbGVzICoqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2cmV2MTZfczgoaW50OHg4X3QgdmVjKTsgLy8gVlJFVjE2LjggZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnJldjE2X3M4KGludDh4OF90IHZlYykKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2cmV2MTZxX3M4KF9wTTEyOGkodmVjKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKwordWludDh4OF90IHZyZXYxNl91OCh1aW50OHg4X3QgdmVjKTsgLy8gVlJFVjE2LjggZDAsZDAKKyNkZWZpbmUgdnJldjE2X3U4IHZyZXYxNl9zOAorCitwb2x5OHg4X3QgdnJldjE2X3A4KHBvbHk4eDhfdCB2ZWMpOyAvLyBWUkVWMTYuOCBkMCxkMAorI2RlZmluZSB2cmV2MTZfcDggdnJldjE2X3U4CisKK2ludDh4MTZfdCB2cmV2MTZxX3M4KGludDh4MTZfdCB2ZWMpOyAvLyBWUkVWMTYuOCBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdnJldjE2cV9zOChpbnQ4eDE2X3QgdmVjKSAvLyBWUkVWMTYuOCBxMCxxMAoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFza19yZXY4WzE2XSA9IHsxLDAsIDMsMiwgNSw0LCA3LDYsIDksOCwgMTEsIDEwLCAxMywgMTIsIDE1LCAxNH07CisgICAgcmV0dXJuIF9tbV9zaHVmZmxlX2VwaTggKHZlYywgKihfX20xMjhpKikgIG1hc2tfcmV2OCk7Cit9CisKK3VpbnQ4eDE2X3QgdnJldjE2cV91OCh1aW50OHgxNl90IHZlYyk7IC8vIFZSRVYxNi44IHEwLHEwCisjZGVmaW5lIHZyZXYxNnFfdTggdnJldjE2cV9zOAorCitwb2x5OHgxNl90IHZyZXYxNnFfcDgocG9seTh4MTZfdCB2ZWMpOyAvLyBWUkVWMTYuOCBxMCxxMAorI2RlZmluZSB2cmV2MTZxX3A4IHZyZXYxNnFfdTgKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKiBPdGhlciBzaW5nbGUgb3BlcmFuZCBhcml0aG1ldGljICoqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vKioqKioqKioqKiogQWJzb2x1dGU6IFZkW2ldID0gfFZhW2ldfCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgICB2YWJzX3M4KGludDh4OF90IGEpOyAvLyBWQUJTLlM4IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90ICAgdmFic19zOChpbnQ4eDhfdCBhKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9tbV9hYnNfZXBpOChfcE0xMjhpKGEpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCisKK2ludDE2eDRfdCAgIHZhYnNfczE2KGludDE2eDRfdCBhKTsgLy8gVkFCUy5TMTYgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90ICAgdmFic19zMTYoaW50MTZ4NF90IGEpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9tbV9hYnNfZXBpMTYoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MzJ4Ml90ICAgdmFic19zMzIoaW50MzJ4Ml90IGEpOyAvLyBWQUJTLlMzMiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgICB2YWJzX3MzMihpbnQzMngyX3QgYSkKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gX21tX2Fic19lcGkzMihfcE0xMjhpKGEpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitmbG9hdDMyeDJfdCB2YWJzX2YzMihmbG9hdDMyeDJfdCBhKTsgLy8gVkFCUy5GMzIgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3QgdmFic19mMzIoZmxvYXQzMngyX3QgYSkgLy8gVkFCUy5GMzIgZDAsZDAKK3sKKyAgICBmbG9hdDMyeDRfdCByZXM7CisgICAgX19tNjRfMTI4IHJlczY0OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQzMl90IGM3ZmZmZmZmZls0XSA9IHsweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDdmZmZmZmZmfTsKKyAgICByZXMgPSBfbW1fYW5kX3BzIChfcE0xMjgoYSksICooX19tMTI4KiljN2ZmZmZmZmYpOyAvL3VzZSA2NCBsb3cgYml0cyBvbmx5CisgICAgX002NGYocmVzNjQsIHJlcyk7CisgICAgcmV0dXJuIHJlczY0OworfQorCitpbnQ4eDE2X3QgICB2YWJzcV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZBQlMuUzggcTAscTAKKyNkZWZpbmUgdmFic3FfczggX21tX2Fic19lcGk4CisKK2ludDE2eDhfdCAgIHZhYnNxX3MxNihpbnQxNng4X3QgYSk7IC8vIFZBQlMuUzE2IHEwLHEwCisjZGVmaW5lIHZhYnNxX3MxNiBfbW1fYWJzX2VwaTE2CisKK2ludDMyeDRfdCAgIHZhYnNxX3MzMihpbnQzMng0X3QgYSk7IC8vIFZBQlMuUzMyIHEwLHEwCisjZGVmaW5lIHZhYnNxX3MzMiBfbW1fYWJzX2VwaTMyCisKK2Zsb2F0MzJ4NF90IHZhYnNxX2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVkFCUy5GMzIgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3QgdmFic3FfZjMyKGZsb2F0MzJ4NF90IGEpIC8vIFZBQlMuRjMyIHEwLHEwCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDMyX3QgYzdmZmZmZmZmWzRdID0gezB4N2ZmZmZmZmYsIDB4N2ZmZmZmZmYsIDB4N2ZmZmZmZmYsIDB4N2ZmZmZmZmZ9OworICAgIHJldHVybiBfbW1fYW5kX3BzIChhLCAqKF9fbTEyOCopYzdmZmZmZmZmKTsKK30KKworLy8qKioqKiogU2F0dXJhdGluZyBhYnNvbHV0ZTogVmRbaV0gPSBzYXQofFZhW2ldfCkgKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vRm9yIHNpZ25lZC1pbnRlZ2VyIGRhdGEgdHlwZXMsIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgbW9zdCBuZWdhdGl2ZSB2YWx1ZSBpcyBub3QgcmVwcmVzZW50YWJsZSBieSB0aGUgZGF0YSB0eXBlLCBzYXR1cmF0aW9uIHRha2VzIHBsYWNlCitpbnQ4eDhfdCB2cWFic19zOChpbnQ4eDhfdCBhKTsgLy8gVlFBQlMuUzggZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnFhYnNfczgoaW50OHg4X3QgYSkKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2cWFic3FfczgoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MTZ4NF90IHZxYWJzX3MxNihpbnQxNng0X3QgYSk7IC8vIFZRQUJTLlMxNiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnFhYnNfczE2KGludDE2eDRfdCBhKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2cWFic3FfczE2KF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDMyeDJfdCB2cWFic19zMzIoaW50MzJ4Ml90IGEpOyAvLyBWUUFCUy5TMzIgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZxYWJzX3MzMihpbnQzMngyX3QgYSkKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdnFhYnNxX3MzMihfcE0xMjhpKGEpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQ4eDE2X3QgdnFhYnNxX3M4KGludDh4MTZfdCBhKTsgLy8gVlFBQlMuUzggcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZxYWJzcV9zOChpbnQ4eDE2X3QgYSkgLy8gVlFBQlMuUzggcTAscTAKK3sKKyAgICBfX20xMjhpIGNfMTI4LCBhYnMsIGFic19jbXA7CisgICAgY18xMjggPSBfbW1fc2V0MV9lcGk4ICgweDgwKTsgLy8tMTI4CisgICAgYWJzID0gX21tX2Fic19lcGk4IChhKTsKKyAgICBhYnNfY21wID0gX21tX2NtcGVxX2VwaTggKGFicywgY18xMjgpOworICAgIHJldHVybiBfbW1feG9yX3NpMTI4IChhYnMsICBhYnNfY21wKTsKK30KKworaW50MTZ4OF90IHZxYWJzcV9zMTYoaW50MTZ4OF90IGEpOyAvLyBWUUFCUy5TMTYgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZxYWJzcV9zMTYoaW50MTZ4OF90IGEpIC8vIFZRQUJTLlMxNiBxMCxxMAoreworICAgIF9fbTEyOGkgY18zMjc2OCwgYWJzLCBhYnNfY21wOworICAgIGNfMzI3NjggPSBfbW1fc2V0MV9lcGkxNiAoMHg4MDAwKTsgLy8tMzI3NjgKKyAgICBhYnMgPSBfbW1fYWJzX2VwaTE2IChhKTsKKyAgICBhYnNfY21wID0gX21tX2NtcGVxX2VwaTE2IChhYnMsIGNfMzI3NjgpOworICAgIHJldHVybiBfbW1feG9yX3NpMTI4IChhYnMsICBhYnNfY21wKTsKK30KKworaW50MzJ4NF90IHZxYWJzcV9zMzIoaW50MzJ4NF90IGEpOyAvLyBWUUFCUy5TMzIgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZxYWJzcV9zMzIoaW50MzJ4NF90IGEpIC8vIFZRQUJTLlMzMiBxMCxxMAoreworICAgIF9fbTEyOGkgYzgwMDAwMDAwLCBhYnMsIGFic19jbXA7CisgICAgYzgwMDAwMDAwID0gX21tX3NldDFfZXBpMzIgKDB4ODAwMDAwMDApOyAvL21vc3QgbmVnYXRpdmUgdmFsdWUKKyAgICBhYnMgPSBfbW1fYWJzX2VwaTMyIChhKTsKKyAgICBhYnNfY21wID0gX21tX2NtcGVxX2VwaTMyIChhYnMsIGM4MDAwMDAwMCk7CisgICAgcmV0dXJuIF9tbV94b3Jfc2kxMjggKGFicywgIGFic19jbXApOworfQorCisvLyoqKioqKioqKioqKioqKiBOZWdhdGU6IFZkW2ldID0gLSBWYVtpXSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL3NldmVyYWwgTmVnYXRlIGltcGxlbWVudGF0aW9ucyBwb3NzaWJsZSBmb3IgU0lNRC4KKy8vZS4vL2Z1bmN0aW9uIF9tbV9zaWduIGZ1bmN0aW9uKGEsIG5lZ2F0aXZlIG51bWJlcnMgdmVjdG9yKSwgYnV0IHRoZSBmb2xsb3dpbmcgb25lIGdpdmVzIGdvb2QgcGVyZm9ybWFuY2U6CitpbnQ4eDhfdCB2bmVnX3M4KGludDh4OF90IGEpOyAvLyBWTkUvL2QwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZuZWdfczgoaW50OHg4X3QgYSkKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2bmVncV9zOChfcE0xMjhpKGEpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQxNng0X3Qgdm5lZ19zMTYoaW50MTZ4NF90IGEpOyAvLyBWTkUvL2QwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2bmVnX3MxNihpbnQxNng0X3QgYSkKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdm5lZ3FfczE2KF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDMyeDJfdCB2bmVnX3MzMihpbnQzMngyX3QgYSk7IC8vIFZORS8vZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZuZWdfczMyKGludDMyeDJfdCBhKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2bmVncV9zMzIoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworZmxvYXQzMngyX3Qgdm5lZ19mMzIoZmxvYXQzMngyX3QgYSk7IC8vIFZORS8vZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3Qgdm5lZ19mMzIoZmxvYXQzMngyX3QgYSkgLy8gVk5FLy9kMCxkMAoreworICAgIGZsb2F0MzJ4NF90IHJlczsKKyAgICBfX202NF8xMjggcmVzNjQ7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDMyX3QgYzgwMDAwMDAwWzRdID0gezB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDB9OworICAgIHJlcyA9IF9tbV94b3JfcHMgKF9wTTEyOChhKSwgKihfX20xMjgqKSBjODAwMDAwMDApOyAvL3VzZSBsb3cgNjQgYml0cworICAgIF9NNjRmKHJlczY0LCByZXMpOworICAgIHJldHVybiByZXM2NDsKK30KKworaW50OHgxNl90IHZuZWdxX3M4KGludDh4MTZfdCBhKTsgLy8gVk5FLy9xMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3Qgdm5lZ3FfczgoaW50OHgxNl90IGEpIC8vIFZORS8vcTAscTAKK3sKKyAgICBfX20xMjhpIHplcm87CisgICAgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4ICgpOworICAgIHJldHVybiBfbW1fc3ViX2VwaTggKHplcm8sIGEpOworfSAvL29yIF9tbV9zaWduX2VwaTggKGEsIG5lZ2F0aXZlIG51bWJlcnMgdmVjdG9yKQorCitpbnQxNng4X3Qgdm5lZ3FfczE2KGludDE2eDhfdCBhKTsgLy8gVk5FLy9xMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3Qgdm5lZ3FfczE2KGludDE2eDhfdCBhKSAvLyBWTkUvL3EwLHEwCit7CisgICAgX19tMTI4aSB6ZXJvOworICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCAoKTsKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkxNiAoemVybywgYSk7Cit9IC8vb3IgX21tX3NpZ25fZXBpMTYgKGEsIG5lZ2F0aXZlIG51bWJlcnMgdmVjdG9yKQorCitpbnQzMng0X3Qgdm5lZ3FfczMyKGludDMyeDRfdCBhKTsgLy8gVk5FLy9xMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3Qgdm5lZ3FfczMyKGludDMyeDRfdCBhKSAvLyBWTkUvL3EwLHEwCit7CisgICAgX19tMTI4aSB6ZXJvOworICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCAoKTsKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkzMiAoemVybywgYSk7Cit9IC8vb3IgX21tX3NpZ25fZXBpMzIgKGEsIG5lZ2F0aXZlIG51bWJlcnMgdmVjdG9yKQorCitmbG9hdDMyeDRfdCB2bmVncV9mMzIoZmxvYXQzMng0X3QgYSk7IC8vIFZORS8vcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3Qgdm5lZ3FfZjMyKGZsb2F0MzJ4NF90IGEpIC8vIFZORS8vcTAscTAKK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50MzJfdCBjODAwMDAwMDBbNF0gPSB7MHg4MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMH07CisgICAgcmV0dXJuIF9tbV94b3JfcHMgKGEsICooX19tMTI4KikgYzgwMDAwMDAwKTsKK30KKworLy8qKioqKioqKioqKioqKiBTYXR1cmF0aW5nIE5lZ2F0ZTogc2F0KFZkW2ldID0gLSBWYVtpXSkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL0ZvciBzaWduZWQtaW50ZWdlciBkYXRhIHR5cGVzLCB0aGUgbmVnYXRpb24gb2YgdGhlIG1vc3QgbmVnYXRpdmUgdmFsdWUgY2FuJ3QgYmUgcHJvZHVjZWQgd2l0aG91dCBzYXR1cmF0aW9uLCB3aGlsZSB3aXRoIHNhdHVyYXRpb24gaXQgaXMgbWF4IHBvc2l0aXZlCitpbnQ4eDhfdCB2cW5lZ19zOChpbnQ4eDhfdCBhKTsgLy8gVlFORS8vZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnFuZWdfczgoaW50OHg4X3QgYSkKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2cW5lZ3FfczgoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MTZ4NF90IHZxbmVnX3MxNihpbnQxNng0X3QgYSk7IC8vIFZRTkUvL2QwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cW5lZ19zMTYoaW50MTZ4NF90IGEpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZxbmVncV9zMTYoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MzJ4Ml90IHZxbmVnX3MzMihpbnQzMngyX3QgYSk7IC8vIFZRTkUvL2QwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cW5lZ19zMzIoaW50MzJ4Ml90IGEpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZxbmVncV9zMzIoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50OHgxNl90IHZxbmVncV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZRTkUvL3EwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCB2cW5lZ3FfczgoaW50OHgxNl90IGEpIC8vIFZRTkUvL3EwLHEwCit7CisgICAgX19tMTI4aSB6ZXJvOworICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCAoKTsKKyAgICByZXR1cm4gX21tX3N1YnNfZXBpOCAoemVybywgYSk7IC8vc2F0dXJhdGluZyBzdWJzdHJhY3Rpb24KK30KKworaW50MTZ4OF90IHZxbmVncV9zMTYoaW50MTZ4OF90IGEpOyAvLyBWUU5FLy9xMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnFuZWdxX3MxNihpbnQxNng4X3QgYSkgLy8gVlFORS8vcTAscTAKK3sKKyAgICBfX20xMjhpIHplcm87CisgICAgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4ICgpOworICAgIHJldHVybiBfbW1fc3Vic19lcGkxNiAoemVybywgYSk7IC8vc2F0dXJhdGluZyBzdWJzdHJhY3Rpb24KK30KKworaW50MzJ4NF90IHZxbmVncV9zMzIoaW50MzJ4NF90IGEpOyAvLyBWUU5FLy9xMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnFuZWdxX3MzMihpbnQzMng0X3QgYSkgLy8gVlFORS8vcTAscTAKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIGEgc2VyaWFsCisgICAgX19tMTI4aSBjODAwMDAwMDAsIHplcm8sIHN1YiwgY21wOworICAgIGM4MDAwMDAwMCA9IF9tbV9zZXQxX2VwaTMyICgweDgwMDAwMDAwKTsgLy9tb3N0IG5lZ2F0aXZlIHZhbHVlCisgICAgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4ICgpOworICAgIHN1YiA9ICBfbW1fc3ViX2VwaTMyICh6ZXJvLCBhKTsgLy9zdWJzdHJhY3Rpb24KKyAgICBjbXAgPSBfbW1fY21wZXFfZXBpMzIgKGEsIGM4MDAwMDAwMCk7CisgICAgcmV0dXJuIF9tbV94b3Jfc2kxMjggKHN1YiwgIGNtcCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqIENvdW50IGxlYWRpbmcgemVyb3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vbm8gY29ycmVzcG9uZGluZyB2ZWN0b3IgaW50cmluc2ljcyBpbiBJQTMyLCBuZWVkIHRvIGltcGxlbWVudCBpdC4gIFdoaWxlIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBlZmZlY3RpdmUgZm9yIDggYml0cywgaXQgbWF5IGJlIG5vdCBmb3IgMTYgYW5kIDMyIGJpdHMKK2ludDh4OF90IHZjbHpfczgoaW50OHg4X3QgYSk7IC8vIFZDTFouSTggZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdmNsel9zOChpbnQ4eDhfdCBhKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZjbHpxX3M4KF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDE2eDRfdCB2Y2x6X3MxNihpbnQxNng0X3QgYSk7IC8vIFZDTFouSTE2IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2Y2x6X3MxNihpbnQxNng0X3QgYSkKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdmNsenFfczE2KF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDMyeDJfdCB2Y2x6X3MzMihpbnQzMngyX3QgYSk7IC8vIFZDTFouSTMyIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2Y2x6X3MzMihpbnQzMngyX3QgYSkKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdmNsenFfczMyKF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKKwordWludDh4OF90IHZjbHpfdTgodWludDh4OF90IGEpOyAvLyBWQ0xaLkk4IGQwLGQwCisjZGVmaW5lIHZjbHpfdTggdmNsel9zOAorCit1aW50MTZ4NF90IHZjbHpfdTE2KHVpbnQxNng0X3QgYSk7IC8vIFZDTFouSTE2IGQwLGQwCisjZGVmaW5lIHZjbHpfdTE2IHZjbHpfczE2CisKK3VpbnQzMngyX3QgdmNsel91MzIodWludDMyeDJfdCBhKTsgLy8gVkNMWi5JMzIgZDAsZDAKKyNkZWZpbmUgdmNsel91MzIgdmNsel9zMzIKKworaW50OHgxNl90IHZjbHpxX3M4KGludDh4MTZfdCBhKTsgLy8gVkNMWi5JOCBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdmNsenFfczgoaW50OHgxNl90IGEpCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrX0NMWlsxNl0gPSB7IC8qIDAgKi8gNCwvKiAxICovIDMsLyogMiAqLyAyLC8qIDMgKi8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0ICovIDEsLyogNSAqLyAxLC8qIDYgKi8gMSwvKiA3ICovIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOCAqLyAwLC8qIDkgKi8gMCwvKiBhICovIDAsLyogYiAqLyAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGMgKi8gMCwvKiBkICovIDAsLyogZSAqLyAwLC8qIGYgKi8gMCAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICBfX20xMjhpIG1hc2tMT1csIGM0LCBsb3djbHosIG1hc2ssIGhpY2x6OworICAgIG1hc2tMT1cgPSBfbW1fc2V0MV9lcGk4KDB4MGYpOyAvL2xvdyA0IGJpdHMsIGRvbid0IG5lZWQgbWFza2luZyBsb3cgdG8gYXZvaWQgemVybyBpZiBNU0IgaXMgc2V0IC0gaXQgaGFwcGVucyBhdXRvbWF0aWNhbGx5CisgICAgYzQgPSBfbW1fc2V0MV9lcGk4KDQpOworICAgIGxvd2NseiA9IF9tbV9zaHVmZmxlX2VwaTgoICooX19tMTI4aSopbWFza19DTFosIGEpOyAvL3VzZXMgbG93IDQgYml0cyBhbnl3YXkKKyAgICBtYXNrID0gIF9tbV9zcmxpX2VwaTE2KGEsIDQpOyAvL2dldCBoaWdoIDQgYml0cyBhcyBsb3cgYml0cworICAgIG1hc2sgPSBfbW1fYW5kX3NpMTI4KG1hc2ssIG1hc2tMT1cpOyAvL2xvdyA0IGJpdHMsIG5lZWQgbWFza2luZyB0byBhdm9pZCB6ZXJvIGlmIE1TQiBpcyBzZXQKKyAgICBoaWNseiA9IF9tbV9zaHVmZmxlX2VwaTgoICooX19tMTI4aSopIG1hc2tfQ0xaLCBtYXNrKTsgLy91c2VzIGxvdyA0IGJpdHMgYW55d2F5CisgICAgbWFzayA9IF9tbV9jbXBlcV9lcGk4KGhpY2x6LCBjNCk7IC8vIHNob3dzIHRoZSBuZWVkIHRvIGFkZCBsb3djbHogemVyb3MKKyAgICBsb3djbHogPSBfbW1fYW5kX3NpMTI4KGxvd2NseixtYXNrKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGk4KGxvd2NseiwgaGljbHopOworfQorCitpbnQxNng4X3QgdmNsenFfczE2KGludDE2eDhfdCBhKTsgLy8gVkNMWi5JMTYgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZjbHpxX3MxNihpbnQxNng4X3QgYSkKK3sKKyAgICBfX20xMjhpIGM3LCByZXM4eDE2LCByZXM4eDE2X3N3YXA7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF9zYWJbMTZdID0geyAxLCAwLCAzLCAyLCA1LCA0LCA3LCA2LCA5LCA4LCAxMSwgMTAsIDEzLCAxMiwgMTUsIDE0fTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDE2X3QgbWFzazhiaXRbOF0gPSB7MHgwMGZmLCAweDAwZmYsIDB4MDBmZiwgMHgwMGZmLDB4MDBmZiwgMHgwMGZmLCAweDAwZmYsIDB4MDBmZn07CisgICAgYzcgPSBfbW1fc3JsaV9lcGkxNigqKF9fbTEyOGkqKW1hc2s4Yml0LCA1KTsgLy83CisgICAgcmVzOHgxNiA9IHZjbHpxX3M4KGEpOworICAgIHJlczh4MTZfc3dhcCA9IF9tbV9zaHVmZmxlX2VwaTggKHJlczh4MTYsICooX19tMTI4aSopIG1hc2s4X3NhYik7IC8vaG9yaXNvbnRhbCBwYWlycyBzd2FwCisgICAgcmVzOHgxNiA9IF9tbV9hbmRfc2kxMjgocmVzOHgxNiwgKihfX20xMjhpKiltYXNrOGJpdCk7IC8vbG93Y2x6CisgICAgcmVzOHgxNl9zd2FwID0gX21tX2FuZF9zaTEyOChyZXM4eDE2X3N3YXAsICooX19tMTI4aSopbWFzazhiaXQpOyAvL2hpY2x6CisgICAgYzcgPSBfbW1fY21wZ3RfZXBpMTYocmVzOHgxNl9zd2FwLCBjNyk7IC8vIHNob3dzIHRoZSBuZWVkIHRvIGFkZCBsb3djbHogemVyb3MKKyAgICByZXM4eDE2ID0gX21tX2FuZF9zaTEyOChyZXM4eDE2LCBjNyk7IC8vbG93Y2x6CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYocmVzOHgxNl9zd2FwLCByZXM4eDE2KTsKK30KKworaW50MzJ4NF90IHZjbHpxX3MzMihpbnQzMng0X3QgYSk7IC8vIFZDTFouSTMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2Y2x6cV9zMzIoaW50MzJ4NF90IGEpCit7CisgICAgX19tMTI4aSBjNTU1NTU1NTUsIGMzMzMzMzMzMywgYzBmMGYwZjBmLCBjM2YsIGMzMiwgdG1wLCB0bXAxLCByZXM7CisgICAgYzU1NTU1NTU1ID0gX21tX3NldDFfZXBpMzIoMHg1NTU1NTU1NSk7CisgICAgYzMzMzMzMzMzID0gX21tX3NldDFfZXBpMzIoMHgzMzMzMzMzMyk7CisgICAgYzBmMGYwZjBmID0gX21tX3NldDFfZXBpMzIoMHgwZjBmMGYwZik7CisgICAgYzNmID0gX21tX3NldDFfZXBpMzIoMHgzZik7CisgICAgYzMyID0gX21tX3NldDFfZXBpMzIoMzIpOworICAgIHRtcCA9IF9tbV9zcmxpX2VwaTMyKGEsIDEpOworICAgIHJlcyA9IF9tbV9vcl9zaTEyOCh0bXAsIGEpOyAvL2F0bXBbaV0gfD0gKGF0bXBbaV0gPj4gMSk7CisgICAgdG1wID0gX21tX3NybGlfZXBpMzIocmVzLCAyKTsKKyAgICByZXMgPSBfbW1fb3Jfc2kxMjgodG1wLCByZXMpOyAvL2F0bXBbaV0gfD0gKGF0bXBbaV0gPj4gMik7CisgICAgdG1wID0gX21tX3NybGlfZXBpMzIocmVzLCA0KTsKKyAgICByZXMgPSBfbW1fb3Jfc2kxMjgodG1wLCByZXMpOyAvL2F0bXBbaV0gfD0gKGF0bXBbaV0gPj4gNCk7CisgICAgdG1wID0gX21tX3NybGlfZXBpMzIocmVzLCA4KTsKKyAgICByZXMgPSBfbW1fb3Jfc2kxMjgodG1wLCByZXMpOyAvL2F0bXBbaV0gfD0gKGF0bXBbaV0gPj4gOCk7CisgICAgdG1wID0gX21tX3NybGlfZXBpMzIocmVzLCAxNik7CisgICAgcmVzID0gX21tX29yX3NpMTI4KHRtcCwgcmVzKTsgLy9hdG1wW2ldIHw9IChhdG1wW2ldID4+IDE2KTsKKworICAgIHRtcCA9IF9tbV9zcmxpX2VwaTMyKHJlcywgMSk7CisgICAgdG1wID0gX21tX2FuZF9zaTEyOCh0bXAsIGM1NTU1NTU1NSk7CisgICAgcmVzID0gX21tX3N1Yl9lcGkzMihyZXMsIHRtcCk7IC8vYXRtcFtpXSAtPSAoKGF0bXBbaV0gPj4gMSkgJiAweDU1NTU1NTU1KTsKKworICAgIHRtcCA9IF9tbV9zcmxpX2VwaTMyKHJlcywgMik7CisgICAgdG1wID0gX21tX2FuZF9zaTEyOCh0bXAsIGMzMzMzMzMzMyk7CisgICAgdG1wMSA9IF9tbV9hbmRfc2kxMjgocmVzLCBjMzMzMzMzMzMpOworICAgIHJlcyA9IF9tbV9hZGRfZXBpMzIodG1wLCB0bXAxKTsgLy9hdG1wW2ldID0gKCgoYXRtcFtpXSA+PiAyKSAmIDB4MzMzMzMzMzMpICsgKGF0bXBbaV0gJiAweDMzMzMzMzMzKSk7CisKKyAgICB0bXAgPSBfbW1fc3JsaV9lcGkzMihyZXMsIDQpOworICAgIHRtcCA9IF9tbV9hZGRfZXBpMzIodG1wLCByZXMpOworICAgIHJlcyA9IF9tbV9hbmRfc2kxMjgodG1wLCBjMGYwZjBmMGYpOyAvL2F0bXBbaV0gPSAoKChhdG1wW2ldID4+IDQpICsgYXRtcFtpXSkgJiAweDBmMGYwZjBmKTsKKworICAgIHRtcCA9IF9tbV9zcmxpX2VwaTMyKHJlcywgOCk7CisgICAgcmVzID0gX21tX2FkZF9lcGkzMih0bXAsIHJlcyk7IC8vYXRtcFtpXSArPSAoYXRtcFtpXSA+PiA4KTsKKworICAgIHRtcCA9IF9tbV9zcmxpX2VwaTMyKHJlcywgMTYpOworICAgIHJlcyA9IF9tbV9hZGRfZXBpMzIodG1wLCByZXMpOyAvL2F0bXBbaV0gKz0gKGF0bXBbaV0gPj4gMTYpOworCisgICAgcmVzID0gX21tX2FuZF9zaTEyOChyZXMsIGMzZik7IC8vYXRtcFtpXSA9IGF0bXBbaV0gJiAweDAwMDAwMDNmOworCisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMzIoYzMyLCByZXMpOyAvL3Jlc1tpXSA9IDMyIC0gYXRtcFtpXTsKK30KKwordWludDh4MTZfdCB2Y2x6cV91OCh1aW50OHgxNl90IGEpOyAvLyBWQ0xaLkk4IHEwLHEwCisjZGVmaW5lIHZjbHpxX3U4IHZjbHpxX3M4CisKK3VpbnQxNng4X3QgdmNsenFfdTE2KHVpbnQxNng4X3QgYSk7IC8vIFZDTFouSTE2IHEwLHEwCisjZGVmaW5lIHZjbHpxX3UxNiB2Y2x6cV9zMTYKKwordWludDMyeDRfdCB2Y2x6cV91MzIodWludDMyeDRfdCBhKTsgLy8gVkNMWi5JMzIgcTAscTAKKyNkZWZpbmUgdmNsenFfdTMyIHZjbHpxX3MzMgorCisvLyoqKioqKioqKioqKioqIENvdW50IGxlYWRpbmcgc2lnbiBiaXRzICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL1ZDTFMgKFZlY3RvciBDb3VudCBMZWFkaW5nIFNpZ24gYml0cykgY291bnRzIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgYml0cyBmb2xsb3dpbmcKKy8vIHRoZSB0b3Btb3N0IGJpdCwgdGhhdCBhcmUgdGhlIHNhbWUgYXMgdGhlIHRvcG1vc3QgYml0LCBpbiBlYWNoIGVsZW1lbnQgaW4gYSB2ZWN0b3IKKy8vTm8gY29ycmVzcG9uZGluZyB2ZWN0b3IgaW50cmluc2ljcyBpbiBJQTMyLCBuZWVkIHRvIGltcGxlbWVudCBpdC4KKy8vV2hpbGUgdGhlIGltcGxlbWVudGF0aW9uIGlzIGVmZmVjdGl2ZSBmb3IgOCBiaXRzLCBpdCBtYXkgYmUgbm90IGZvciAxNiBhbmQgMzIgYml0cworaW50OHg4X3QgdmNsc19zOChpbnQ4eDhfdCBhKTsgLy8gVkNMUy5TOCBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2Y2xzX3M4KGludDh4OF90IGEpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdmNsc3FfczgoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MTZ4NF90IHZjbHNfczE2KGludDE2eDRfdCBhKTsgLy8gVkNMUy5TMTYgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZjbHNfczE2KGludDE2eDRfdCBhKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2Y2xzcV9zMTYoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MzJ4Ml90IHZjbHNfczMyKGludDMyeDJfdCBhKTsgLy8gVkNMUy5TMzIgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZjbHNfczMyKGludDMyeDJfdCBhKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2Y2xzcV9zMzIoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50OHgxNl90IHZjbHNxX3M4KGludDh4MTZfdCBhKTsgLy8gVkNMUy5TOCBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdmNsc3FfczgoaW50OHgxNl90IGEpCit7CisgICAgX19tMTI4aSBjZmYsIGM4MCwgYzEsIGFfbWFzaywgYV9uZWcsIGFfcG9zLCBhX2NvbWI7CisgICAgY2ZmID0gX21tX2NtcGVxX2VwaTggKGEsYSk7IC8vMHhmZgorICAgIGM4MCA9IF9tbV9zZXQxX2VwaTgoMHg4MCk7CisgICAgYzEgPSBfbW1fc2V0MV9lcGk4KDEpOworICAgIGFfbWFzayA9IF9tbV9hbmRfc2kxMjgoYSwgYzgwKTsKKyAgICBhX21hc2sgPSBfbW1fY21wZXFfZXBpOChhX21hc2ssIGM4MCk7IC8vMHhmZiBpZiBuZWdhdGl2ZSBpbnB1dCBhbmQgMCBpZiBwb3NpdGl2ZQorICAgIGFfbmVnID0gX21tX3hvcl9zaTEyOChhLCBjZmYpOworICAgIGFfbmVnID0gX21tX2FuZF9zaTEyOChhX21hc2ssIGFfbmVnKTsKKyAgICBhX3BvcyA9IF9tbV9hbmRub3Rfc2kxMjgoYV9tYXNrLCBhKTsKKyAgICBhX2NvbWIgPSBfbW1fb3Jfc2kxMjgoYV9wb3MsIGFfbmVnKTsKKyAgICBhX2NvbWIgPSB2Y2x6cV9zOChhX2NvbWIpOworICAgIHJldHVybiBfbW1fc3ViX2VwaTgoYV9jb21iLCBjMSk7Cit9CisKK2ludDE2eDhfdCB2Y2xzcV9zMTYoaW50MTZ4OF90IGEpOyAvLyBWQ0xTLlMxNiBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdmNsc3FfczE2KGludDE2eDhfdCBhKQoreworICAgIF9fbTEyOGkgY2ZmZmYsIGM4MDAwLCBjMSwgYV9tYXNrLCBhX25lZywgYV9wb3MsIGFfY29tYjsKKyAgICBjZmZmZiA9IF9tbV9jbXBlcV9lcGkxNihhLGEpOworICAgIGM4MDAwID0gIF9tbV9zbGxpX2VwaTE2KGNmZmZmLCAxNSk7IC8vMHg4MDAwCisgICAgYzEgPSBfbW1fc3JsaV9lcGkxNihjZmZmZiwxNSk7IC8vMHgxCisgICAgYV9tYXNrID0gX21tX2FuZF9zaTEyOChhLCBjODAwMCk7CisgICAgYV9tYXNrID0gX21tX2NtcGVxX2VwaTE2KGFfbWFzaywgYzgwMDApOyAvLzB4ZmZmZiBpZiBuZWdhdGl2ZSBpbnB1dCBhbmQgMCBpZiBwb3NpdGl2ZQorICAgIGFfbmVnID0gX21tX3hvcl9zaTEyOChhLCBjZmZmZik7CisgICAgYV9uZWcgPSBfbW1fYW5kX3NpMTI4KGFfbWFzaywgYV9uZWcpOworICAgIGFfcG9zID0gX21tX2FuZG5vdF9zaTEyOChhX21hc2ssIGEpOworICAgIGFfY29tYiA9IF9tbV9vcl9zaTEyOChhX3BvcywgYV9uZWcpOworICAgIGFfY29tYiA9IHZjbHpxX3MxNihhX2NvbWIpOworICAgIHJldHVybiBfbW1fc3ViX2VwaTE2KGFfY29tYiwgYzEpOworfQorCitpbnQzMng0X3QgdmNsc3FfczMyKGludDMyeDRfdCBhKTsgLy8gVkNMUy5TMzIgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZjbHNxX3MzMihpbnQzMng0X3QgYSkKK3sKKyAgICBfX20xMjhpIGNmZmZmZmZmZiwgYzgwMDAwMDAwLCBjMSwgYV9tYXNrLCBhX25lZywgYV9wb3MsIGFfY29tYjsKKyAgICBjZmZmZmZmZmYgPSBfbW1fY21wZXFfZXBpMzIoYSxhKTsKKyAgICBjODAwMDAwMDAgPSAgX21tX3NsbGlfZXBpMzIoY2ZmZmZmZmZmLCAzMSk7IC8vMHg4MDAwMDAwMAorICAgIGMxID0gX21tX3NybGlfZXBpMzIoY2ZmZmZmZmZmLDMxKTsgLy8weDEKKyAgICBhX21hc2sgPSBfbW1fYW5kX3NpMTI4KGEsIGM4MDAwMDAwMCk7CisgICAgYV9tYXNrID0gX21tX2NtcGVxX2VwaTMyKGFfbWFzaywgYzgwMDAwMDAwKTsgLy8weGZmZmZmZmZmIGlmIG5lZ2F0aXZlIGlucHV0IGFuZCAwIGlmIHBvc2l0aXZlCisgICAgYV9uZWcgPSBfbW1feG9yX3NpMTI4KGEsIGNmZmZmZmZmZik7CisgICAgYV9uZWcgPSBfbW1fYW5kX3NpMTI4KGFfbWFzaywgYV9uZWcpOworICAgIGFfcG9zID0gX21tX2FuZG5vdF9zaTEyOChhX21hc2ssIGEpOworICAgIGFfY29tYiA9IF9tbV9vcl9zaTEyOChhX3BvcywgYV9uZWcpOworICAgIGFfY29tYiA9IHZjbHpxX3MzMihhX2NvbWIpOworICAgIHJldHVybiBfbW1fc3ViX2VwaTMyKGFfY29tYiwgYzEpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ291bnQgbnVtYmVyIG9mIHNldCBiaXRzICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9ObyBjb3JyZXNwb25kaW5nIFNJTUQgc29sdXRpb24uIE9uZSBvcHRpb24gaXMgdG8gZ2V0IGEgZWxlbWVudHMsIGNvbnZlcnQgaXQgdG8gMzIgYml0cyBhbmQgdGhlbiB1c2UgU1NFNC4yICBfbW1fcG9wY250X191MzIgKHVuc2lnbmVkIGludCB2KSBmb3IgZWFjaCBlbGVtZW50CisvL2Fub3RoZXIgb3B0aW9uIGlzIHRvIGRvIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOgorCit1aW50OHg4X3QgdmNudF91OCh1aW50OHg4X3QgYSk7IC8vIFZDTlQuOCBkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdmNudF91OCh1aW50OHg4X3QgYSkKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdmNudHFfdTgoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50OHg4X3QgdmNudF9zOChpbnQ4eDhfdCBhKTsgLy8gVkNOVC44IGQwLGQwCisjZGVmaW5lIHZjbnRfczggdmNudF91OAorCitwb2x5OHg4X3QgdmNudF9wOChwb2x5OHg4X3QgYSk7IC8vIFZDTlQuOCBkMCxkMAorI2RlZmluZSB2Y250X3A4IHZjbnRfdTgKKwordWludDh4MTZfdCB2Y250cV91OCh1aW50OHgxNl90IGEpOyAvLyBWQ05ULjggcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2Y250cV91OCh1aW50OHgxNl90IGEpCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrX1BPUENPVU5UWzE2XSA9IHsgLyogMCAqLyAwLC8qIDEgKi8gMSwvKiAyICovIDEsLyogMyAqLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0ICovIDEsLyogNSAqLyAyLC8qIDYgKi8gMiwvKiA3ICovIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDggKi8gMSwvKiA5ICovIDIsLyogYSAqLyAyLC8qIGIgKi8gMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYyAqLyAyLC8qIGQgKi8gMywvKiBlICovIDMsLyogZiAqLyA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgIF9fbTEyOGkgbWFza0xPVywgbWFzaywgbG93cG9wY250LCBoaXBvcGNudDsKKyAgICBtYXNrTE9XID0gX21tX3NldDFfZXBpOCgweDBmKTsgLy9sb3cgNCBiaXRzLCBuZWVkIG1hc2tpbmcgdG8gYXZvaWQgemVybyBpZiBNU0IgaXMgc2V0CisgICAgbWFzayA9IF9tbV9hbmRfc2kxMjgoYSwgbWFza0xPVyk7CisgICAgbG93cG9wY250ID0gX21tX3NodWZmbGVfZXBpOCggKihfX20xMjhpKiltYXNrX1BPUENPVU5ULCBtYXNrKTsgLy91c2VzIGxvdyA0IGJpdHMgYW55d2F5CisgICAgbWFzayA9ICBfbW1fc3JsaV9lcGkxNihhLCA0KTsgLy9nZXQgaGlnaCA0IGJpdHMgYXMgbG93IGJpdHMKKyAgICBtYXNrID0gX21tX2FuZF9zaTEyOChtYXNrLCBtYXNrTE9XKTsgLy9sb3cgNCBiaXRzLCBuZWVkIG1hc2tpbmcgdG8gYXZvaWQgemVybyBpZiBNU0IgaXMgc2V0CisgICAgaGlwb3BjbnQgPSBfbW1fc2h1ZmZsZV9lcGk4KCAqKF9fbTEyOGkqKSBtYXNrX1BPUENPVU5ULCBtYXNrKTsgLy91c2VzIGxvdyA0IGJpdHMgYW55d2F5CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpOChsb3dwb3BjbnQsIGhpcG9wY250KTsKK30KKworaW50OHgxNl90IHZjbnRxX3M4KGludDh4MTZfdCBhKTsgLy8gVkNOVC44IHEwLHEwCisjZGVmaW5lIHZjbnRxX3M4IHZjbnRxX3U4CisKK3BvbHk4eDE2X3QgdmNudHFfcDgocG9seTh4MTZfdCBhKTsgLy8gVkNOVC44IHEwLHEwCisjZGVmaW5lIHZjbnRxX3A4IHZjbnRxX3U4CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKiogTG9naWNhbCBvcGVyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKiogQml0d2lzZSBub3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vc2V2ZXJhbCBCaXR3aXNlIG5vdCBpbXBsZW1lbnRhdGlvbnMgcG9zc2libGUgZm9yIFNJTUQuIEVnICJ4b3IiIHdpdGggYWxsIG9uZXMsIGJ1dCB0aGUgZm9sbG93aW5nIG9uZSBnaXZlcyBnb29kIHBlcmZvcm1hbmNlCitpbnQ4eDhfdCB2bXZuX3M4KGludDh4OF90IGEpOyAvLyBWTVZOIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZtdm5fczgoaW50OHg4X3QgYSkKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2bXZucV9zOChfcE0xMjhpKGEpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQxNng0X3Qgdm12bl9zMTYoaW50MTZ4NF90IGEpOyAvLyBWTVZOIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2bXZuX3MxNihpbnQxNng0X3QgYSkKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdm12bnFfczE2KF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDMyeDJfdCB2bXZuX3MzMihpbnQzMngyX3QgYSk7IC8vIFZNVk4gZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZtdm5fczMyKGludDMyeDJfdCBhKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2bXZucV9zMzIoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKwordWludDh4OF90IHZtdm5fdTgodWludDh4OF90IGEpOyAvLyBWTVZOIGQwLGQwCisjZGVmaW5lIHZtdm5fdTggdm12bl9zOAorCit1aW50MTZ4NF90IHZtdm5fdTE2KHVpbnQxNng0X3QgYSk7IC8vIFZNVk4gZDAsZDAKKyNkZWZpbmUgdm12bl91MTYgdm12bl9zMTYKKwordWludDMyeDJfdCB2bXZuX3UzMih1aW50MzJ4Ml90IGEpOyAvLyBWTVZOIGQwLGQwCisjZGVmaW5lIHZtdm5fdTMyIHZtdm5fczMyCisKK3BvbHk4eDhfdCB2bXZuX3A4KHBvbHk4eDhfdCBhKTsgLy8gVk1WTiBkMCxkMAorI2RlZmluZSB2bXZuX3A4IHZtdm5fdTgKKworaW50OHgxNl90IHZtdm5xX3M4KGludDh4MTZfdCBhKTsgLy8gVk1WTiBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3Qgdm12bnFfczgoaW50OHgxNl90IGEpIC8vIFZNVk4gcTAscTAKK3sKKyAgICBfX20xMjhpIGMxOworICAgIGMxID0gX21tX2NtcGVxX2VwaTggKGEsYSk7IC8vMHhmZgorICAgIHJldHVybiBfbW1fYW5kbm90X3NpMTI4IChhLCBjMSk7Cit9CisKK2ludDE2eDhfdCB2bXZucV9zMTYoaW50MTZ4OF90IGEpOyAvLyBWTVZOIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2bXZucV9zMTYoaW50MTZ4OF90IGEpIC8vIFZNVk4gcTAscTAKK3sKKyAgICBfX20xMjhpIGMxOworICAgIGMxID0gX21tX2NtcGVxX2VwaTE2IChhLGEpOyAvLzB4ZmZmZgorICAgIHJldHVybiBfbW1fYW5kbm90X3NpMTI4IChhLCBjMSk7Cit9CisKK2ludDMyeDRfdCB2bXZucV9zMzIoaW50MzJ4NF90IGEpOyAvLyBWTVZOIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2bXZucV9zMzIoaW50MzJ4NF90IGEpIC8vIFZNVk4gcTAscTAKK3sKKyAgICBfX20xMjhpIGMxOworICAgIGMxID0gX21tX2NtcGVxX2VwaTMyIChhLGEpOyAvLzB4ZmZmZmZmZmYKKyAgICByZXR1cm4gX21tX2FuZG5vdF9zaTEyOCAoYSwgYzEpOworfQorCit1aW50OHgxNl90IHZtdm5xX3U4KHVpbnQ4eDE2X3QgYSk7IC8vIFZNVk4gcTAscTAKKyNkZWZpbmUgdm12bnFfdTggdm12bnFfczgKKwordWludDE2eDhfdCB2bXZucV91MTYodWludDE2eDhfdCBhKTsgLy8gVk1WTiBxMCxxMAorI2RlZmluZSB2bXZucV91MTYgdm12bnFfczE2CisKK3VpbnQzMng0X3Qgdm12bnFfdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZNVk4gcTAscTAKKyNkZWZpbmUgdm12bnFfdTMyIHZtdm5xX3MzMgorCitwb2x5OHgxNl90IHZtdm5xX3A4KHBvbHk4eDE2X3QgYSk7IC8vIFZNVk4gcTAscTAKKyNkZWZpbmUgdm12bnFfcDggdm12bnFfdTgKKworLy8qKioqKioqKioqKioqKioqKiogQml0d2lzZSBhbmQgKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2YW5kX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQU5EIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZhbmRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fYW5kX3NpMTI4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCitpbnQxNng0X3QgdmFuZF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkFORCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdmFuZF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fYW5kX3NpMTI4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCitpbnQzMngyX3QgdmFuZF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVkFORCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdmFuZF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fYW5kX3NpMTI4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK2ludDY0eDFfdCB2YW5kX3M2NChpbnQ2NHgxX3QgYSwgIGludDY0eDFfdCBiKTsgLy8gVkFORCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgxX3QgdmFuZF9zNjQoaW50NjR4MV90IGEsICBpbnQ2NHgxX3QgYikKK3sKKyAgICBpbnQ2NHgxX3QgcmVzOworICAgIHJlcy5tNjRfaTY0WzBdID0gYS5tNjRfaTY0WzBdICYgYi5tNjRfaTY0WzBdOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2YW5kX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZBTkQgZDAsZDAsZDAKKyNkZWZpbmUgdmFuZF91OCB2YW5kX3M4CisKK3VpbnQxNng0X3QgdmFuZF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWQU5EIGQwLGQwLGQwCisjZGVmaW5lIHZhbmRfdTE2IHZhbmRfczE2CisKK3VpbnQzMngyX3QgdmFuZF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWQU5EIGQwLGQwLGQwCisjZGVmaW5lIHZhbmRfdTMyIHZhbmRfczMyCisKK3VpbnQ2NHgxX3QgdmFuZF91NjQodWludDY0eDFfdCBhLCAgdWludDY0eDFfdCBiKTsgLy8gVkFORCBkMCxkMCxkMAorI2RlZmluZSB2YW5kX3U2NCB2YW5kX3M2NAorCisKK2ludDh4MTZfdCAgIHZhbmRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZBTkQgcTAscTAscTAKKyNkZWZpbmUgdmFuZHFfczggX21tX2FuZF9zaTEyOAorCitpbnQxNng4X3QgICB2YW5kcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkFORCBxMCxxMCxxMAorI2RlZmluZSB2YW5kcV9zMTYgX21tX2FuZF9zaTEyOAorCitpbnQzMng0X3QgICB2YW5kcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkFORCBxMCxxMCxxMAorI2RlZmluZSB2YW5kcV9zMzIgX21tX2FuZF9zaTEyOAorCitpbnQ2NHgyX3QgICB2YW5kcV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVkFORCBxMCxxMCxxMAorI2RlZmluZSB2YW5kcV9zNjQgX21tX2FuZF9zaTEyOAorCit1aW50OHgxNl90ICAgdmFuZHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQU5EIHEwLHEwLHEwCisjZGVmaW5lIHZhbmRxX3U4IF9tbV9hbmRfc2kxMjgKKwordWludDE2eDhfdCAgIHZhbmRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZBTkQgcTAscTAscTAKKyNkZWZpbmUgdmFuZHFfdTE2IF9tbV9hbmRfc2kxMjgKKwordWludDMyeDRfdCAgIHZhbmRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZBTkQgcTAscTAscTAKKyNkZWZpbmUgdmFuZHFfdTMyIF9tbV9hbmRfc2kxMjgKKwordWludDY0eDJfdCAgIHZhbmRxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZBTkQgcTAscTAscTAKKyNkZWZpbmUgdmFuZHFfdTY0IF9tbV9hbmRfc2kxMjgKKworLy8qKioqKioqKioqKioqKioqKioqKiBCaXR3aXNlIG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZvcnJfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZPUlIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3Qgdm9ycl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9vcl9zaTEyOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCitpbnQxNng0X3Qgdm9ycl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVk9SUiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3Qgdm9ycl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fb3Jfc2kxMjgoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKworaW50MzJ4Ml90IHZvcnJfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZPUlIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZvcnJfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX29yX3NpMTI4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK2ludDY0eDFfdCB2b3JyX3M2NChpbnQ2NHgxX3QgYSwgIGludDY0eDFfdCBiKTsgLy8gVk9SUiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgxX3Qgdm9ycl9zNjQoaW50NjR4MV90IGEsICBpbnQ2NHgxX3QgYikKK3sKKyAgICBpbnQ2NHgxX3QgcmVzOworICAgIHJlcy5tNjRfaTY0WzBdID0gYS5tNjRfaTY0WzBdIHwgYi5tNjRfaTY0WzBdOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2b3JyX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZPUlIgZDAsZDAsZDAKKyNkZWZpbmUgdm9ycl91OCB2b3JyX3M4CisKK3VpbnQxNng0X3Qgdm9ycl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWT1JSIGQwLGQwLGQwCisjZGVmaW5lIHZvcnJfdTE2IHZvcnJfczE2CisKK3VpbnQzMngyX3Qgdm9ycl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWT1JSIGQwLGQwLGQwCisjZGVmaW5lIHZvcnJfdTMyIHZvcnJfczMyCisKK3VpbnQ2NHgxX3Qgdm9ycl91NjQodWludDY0eDFfdCBhLCAgdWludDY0eDFfdCBiKTsgLy8gVk9SUiBkMCxkMCxkMAorI2RlZmluZSB2b3JyX3U2NCB2b3JyX3M2NAorCitpbnQ4eDE2X3QgICB2b3JycV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWT1JSIHEwLHEwLHEwCisjZGVmaW5lIHZvcnJxX3M4IF9tbV9vcl9zaTEyOAorCitpbnQxNng4X3QgICB2b3JycV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVk9SUiBxMCxxMCxxMAorI2RlZmluZSB2b3JycV9zMTYgX21tX29yX3NpMTI4CisKK2ludDMyeDRfdCAgIHZvcnJxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWT1JSIHEwLHEwLHEwCisjZGVmaW5lIHZvcnJxX3MzMiBfbW1fb3Jfc2kxMjgKKworaW50NjR4Ml90ICAgdm9ycnFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZPUlIgcTAscTAscTAKKyNkZWZpbmUgdm9ycnFfczY0IF9tbV9vcl9zaTEyOAorCit1aW50OHgxNl90ICAgdm9ycnFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWT1JSIHEwLHEwLHEwCisjZGVmaW5lIHZvcnJxX3U4IF9tbV9vcl9zaTEyOAorCit1aW50MTZ4OF90ICAgdm9ycnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVk9SUiBxMCxxMCxxMAorI2RlZmluZSB2b3JycV91MTYgX21tX29yX3NpMTI4CisKK3VpbnQzMng0X3QgICB2b3JycV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWT1JSIHEwLHEwLHEwCisjZGVmaW5lIHZvcnJxX3UzMiBfbW1fb3Jfc2kxMjgKKwordWludDY0eDJfdCAgIHZvcnJxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZPUlIgcTAscTAscTAKKyNkZWZpbmUgdm9ycnFfdTY0IF9tbV9vcl9zaTEyOAorCisvLyoqKioqKioqKioqKiogQml0d2lzZSBleGNsdXNpdmUgb3IgKEVPUiBvciBYT1IpICoqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2ZW9yX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWRU9SIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZlb3JfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1feG9yX3NpMTI4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCitpbnQxNng0X3QgdmVvcl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkVPUiBkMCxkMCxkMAorI2RlZmluZSB2ZW9yX3MxNiB2ZW9yX3M4CisKK2ludDMyeDJfdCB2ZW9yX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWRU9SIGQwLGQwLGQwCisjZGVmaW5lIHZlb3JfczMyIHZlb3JfczgKKworaW50NjR4MV90IHZlb3JfczY0KGludDY0eDFfdCBhLCAgaW50NjR4MV90IGIpOyAvLyBWRU9SIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDFfdCB2ZW9yX3M2NChpbnQ2NHgxX3QgYSwgIGludDY0eDFfdCBiKQoreworICAgIGludDY0eDFfdCByZXM7CisgICAgcmVzLm02NF9pNjRbMF0gPSBhLm02NF9pNjRbMF0gXiBiLm02NF9pNjRbMF07CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDh4OF90IHZlb3JfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkVPUiBkMCxkMCxkMAorI2RlZmluZSB2ZW9yX3U4IHZlb3JfczgKKwordWludDE2eDRfdCB2ZW9yX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZFT1IgZDAsZDAsZDAKKyNkZWZpbmUgdmVvcl91MTYgdmVvcl9zMTYKKwordWludDMyeDJfdCB2ZW9yX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZFT1IgZDAsZDAsZDAKKyNkZWZpbmUgdmVvcl91MzIgdmVvcl9zMzIKKwordWludDY0eDFfdCB2ZW9yX3U2NCh1aW50NjR4MV90IGEsICB1aW50NjR4MV90IGIpOyAvLyBWRU9SIGQwLGQwLGQwCisjZGVmaW5lIHZlb3JfdTY0IHZlb3JfczY0CisKK2ludDh4MTZfdCAgIHZlb3JxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZFT1IgcTAscTAscTAKKyNkZWZpbmUgdmVvcnFfczggX21tX3hvcl9zaTEyOAorCitpbnQxNng4X3QgICB2ZW9ycV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkVPUiBxMCxxMCxxMAorI2RlZmluZSB2ZW9ycV9zMTYgX21tX3hvcl9zaTEyOAorCitpbnQzMng0X3QgICB2ZW9ycV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkVPUiBxMCxxMCxxMAorI2RlZmluZSB2ZW9ycV9zMzIgX21tX3hvcl9zaTEyOAorCitpbnQ2NHgyX3QgICB2ZW9ycV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVkVPUiBxMCxxMCxxMAorI2RlZmluZSB2ZW9ycV9zNjQgX21tX3hvcl9zaTEyOAorCit1aW50OHgxNl90ICAgdmVvcnFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWRU9SIHEwLHEwLHEwCisjZGVmaW5lIHZlb3JxX3U4IF9tbV94b3Jfc2kxMjgKKwordWludDE2eDhfdCAgIHZlb3JxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZFT1IgcTAscTAscTAKKyNkZWZpbmUgdmVvcnFfdTE2IF9tbV94b3Jfc2kxMjgKKwordWludDMyeDRfdCAgIHZlb3JxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZFT1IgcTAscTAscTAKKyNkZWZpbmUgdmVvcnFfdTMyIF9tbV94b3Jfc2kxMjgKKwordWludDY0eDJfdCAgIHZlb3JxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZFT1IgcTAscTAscTAKKyNkZWZpbmUgdmVvcnFfdTY0IF9tbV94b3Jfc2kxMjgKKworLy8qKioqKioqKioqKioqKioqKioqKioqIEJpdCBDbGVhciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vTG9naWNhbCBBTkQgY29tcGxlbWVudCAoQU5EIG5lZ2F0aW9uIG9yIEFORCBOT1QpCitpbnQ4eDhfdCAgIHZiaWNfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZCSUMgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgICB2YmljX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2FuZG5vdF9zaTEyOChfcE0xMjhpKGIpLF9wTTEyOGkoYSkpKTsgLy9ub3RpY2UgdGhlIGFyZ3VtZW50cyAic3dhcCIKK30KKworaW50MTZ4NF90ICAgdmJpY19zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkJJQyBkMCxkMCxkMAorI2RlZmluZSB2YmljX3MxNiB2YmljX3M4CisKK2ludDMyeDJfdCAgIHZiaWNfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZCSUMgZDAsZDAsZDAKKyNkZWZpbmUgdmJpY19zMzIgdmJpY19zOAorCitpbnQ2NHgxX3QgICB2YmljX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWQklDIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDFfdCAgIHZiaWNfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYikKK3sKKyAgICBpbnQ2NHgxX3QgcmVzOworICAgIHJlcy5tNjRfaTY0WzBdID0gYS5tNjRfaTY0WzBdICYgKH5iLm02NF9pNjRbMF0pOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCAgIHZiaWNfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkJJQyBkMCxkMCxkMAorI2RlZmluZSB2YmljX3U4IHZiaWNfczgKKwordWludDE2eDRfdCAgIHZiaWNfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkJJQyBkMCxkMCxkMAorI2RlZmluZSB2YmljX3UxNiB2YmljX3MxNgorCit1aW50MzJ4Ml90ICAgdmJpY191MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWQklDIGQwLGQwLGQwCisjZGVmaW5lIHZiaWNfdTMyIHZiaWNfczMyCisKK3VpbnQ2NHgxX3QgICB2YmljX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYik7IC8vIFZCSUMgZDAsZDAsZDAKKyNkZWZpbmUgdmJpY191NjQgdmJpY19zNjQKKworaW50OHgxNl90ICAgdmJpY3FfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkJJQyBxMCxxMCxxMAorI2RlZmluZSB2YmljcV9zOChhLGIpIF9tbV9hbmRub3Rfc2kxMjggKGIsYSkgLy9ub3RpY2UgYXJndW1lbnRzICJzd2FwIgorCitpbnQxNng4X3QgICB2YmljcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkJJQyBxMCxxMCxxMAorI2RlZmluZSB2YmljcV9zMTYoYSxiKSBfbW1fYW5kbm90X3NpMTI4IChiLGEpIC8vbm90aWNlIGFyZ3VtZW50cyAic3dhcCIKKworaW50MzJ4NF90ICAgdmJpY3FfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZCSUMgcTAscTAscTAKKyNkZWZpbmUgdmJpY3FfczMyKGEsYikgX21tX2FuZG5vdF9zaTEyOCAoYixhKSAvL25vdGljZSBhcmd1bWVudHMgInN3YXAiCisKK2ludDY0eDJfdCAgIHZiaWNxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWQklDIHEwLHEwLHEwCisjZGVmaW5lIHZiaWNxX3M2NChhLGIpIF9tbV9hbmRub3Rfc2kxMjggKGIsYSkgLy9ub3RpY2UgYXJndW1lbnRzICJzd2FwIgorCit1aW50OHgxNl90ICAgdmJpY3FfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQklDIHEwLHEwLHEwCisjZGVmaW5lIHZiaWNxX3U4KGEsYikgX21tX2FuZG5vdF9zaTEyOCAoYixhKSAvL25vdGljZSBhcmd1bWVudHMgInN3YXAiCisKK3VpbnQxNng4X3QgICB2YmljcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWQklDIHEwLHEwLHEwCisjZGVmaW5lIHZiaWNxX3UxNihhLGIpIF9tbV9hbmRub3Rfc2kxMjggKGIsYSkgLy9ub3RpY2UgYXJndW1lbnRzICJzd2FwIgorCit1aW50MzJ4NF90ICAgdmJpY3FfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkJJQyBxMCxxMCxxMAorI2RlZmluZSB2YmljcV91MzIoYSxiKSBfbW1fYW5kbm90X3NpMTI4IChiLGEpIC8vbm90aWNlIGFyZ3VtZW50cyAic3dhcCIKKwordWludDY0eDJfdCAgIHZiaWNxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZCSUMgcTAscTAscTAKKyNkZWZpbmUgdmJpY3FfdTY0KGEsYikgX21tX2FuZG5vdF9zaTEyOCAoYixhKSAvL25vdGljZSBhcmd1bWVudHMgInN3YXAiCisKKy8vKioqKioqKioqKioqKioqKiBCaXR3aXNlIE9SIGNvbXBsZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9ubyBleGFjdCBJQSAzMiBtYXRjaCwgbmVlZCB0byBpbXBsZW1lbnQgaXQgYXMgZm9sbG93aW5nCitpbnQ4eDhfdCB2b3JuX3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiKTsgLy8gVk9STiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2b3JuX3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KHZvcm5xX3M4KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCitpbnQxNng0X3Qgdm9ybl9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYik7IC8vIFZPUk4gZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZvcm5fczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZvcm5xX3MxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKworaW50MzJ4Ml90IHZvcm5fczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpOyAvLyBWT1JOIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2b3JuX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2b3JucV9zMzIoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK2ludDY0eDFfdCB2b3JuX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWT1JOIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDFfdCB2b3JuX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpCit7CisgICAgaW50NjR4MV90IHJlczsKKyAgICByZXMubTY0X2k2NFswXSA9IGEubTY0X2k2NFswXSB8ICh+Yi5tNjRfaTY0WzBdKTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHg4X3Qgdm9ybl91OCh1aW50OHg4X3QgYSwgIHVpbnQ4eDhfdCBiKTsgLy8gVk9STiBkMCxkMCxkMAorI2RlZmluZSB2b3JuX3U4IHZvcm5fczgKKworCit1aW50MTZ4NF90IHZvcm5fdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYik7IC8vIFZPUk4gZDAsZDAsZDAKKyNkZWZpbmUgdm9ybl91MTYgdm9ybl9zMTYKKwordWludDMyeDJfdCB2b3JuX3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIpOyAvLyBWT1JOIGQwLGQwLGQwCisjZGVmaW5lIHZvcm5fdTMyIHZvcm5fczMyCisKK3VpbnQ2NHgxX3Qgdm9ybl91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpOyAvLyBWT1JOIGQwLGQwLGQwCisjZGVmaW5lIHZvcm5fdTY0IHZvcm5fczY0CisKKworaW50OHgxNl90IHZvcm5xX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZPUk4gcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZvcm5xX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgLy8gVk9STiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgYjE7CisgICAgYjEgPSB2bXZucV9zOCggYik7IC8vYml0d2lzZSBub3QgZm9yIGIKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChhLCBiMSk7Cit9CisKK2ludDE2eDhfdCB2b3JucV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVk9STiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3Qgdm9ybnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgLy8gVk9STiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgYjE7CisgICAgYjEgPSB2bXZucV9zMTYoIGIpOyAvL2JpdHdpc2Ugbm90IGZvciBiCisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYSwgYjEpOworfQorCitpbnQzMng0X3Qgdm9ybnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZPUk4gcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZvcm5xX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIC8vIFZPUk4gcTAscTAscTAKK3sKKyAgICBfX20xMjhpIGIxOworICAgIGIxID0gdm12bnFfczMyKCBiKTsgLy9iaXR3aXNlIG5vdCBmb3IgYgorICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKGEsIGIxKTsKK30KKworaW50NjR4Ml90IHZvcm5xX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWT1JOIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2b3JucV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKQoreworICAgIF9fbTEyOGkgYzEsIGIxOworICAgIGMxID0gX21tX2NtcGVxX2VwaTggKGEsIGEpOyAvL2FsbCBvbmVzIDB4ZmZmZmZmZi4uLmZmZmZmCisgICAgYjEgPSBfbW1fYW5kbm90X3NpMTI4IChiLCBjMSk7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYSwgYjEpOworfQorCit1aW50OHgxNl90IHZvcm5xX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVk9STiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZvcm5xX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKSAvLyBWT1JOIHEwLHEwLHEwCit7CisgICAgX19tMTI4aSBiMTsKKyAgICBiMSA9IHZtdm5xX3U4KCBiKTsgLy9iaXR3aXNlIG5vdCBmb3IgYgorICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKGEsIGIxKTsKK30KKwordWludDE2eDhfdCB2b3JucV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWT1JOIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3Qgdm9ybnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKSAvLyBWT1JOIHEwLHEwLHEwCit7CisgICAgX19tMTI4aSBiMTsKKyAgICBiMSA9IHZtdm5xX3MxNiggYik7IC8vYml0d2lzZSBub3QgZm9yIGIKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChhLCBiMSk7Cit9CisKK3VpbnQzMng0X3Qgdm9ybnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVk9STiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZvcm5xX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgLy8gVk9STiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgYjE7CisgICAgYjEgPSB2bXZucV91MzIoIGIpOyAvL2JpdHdpc2Ugbm90IGZvciBiCisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYSwgYjEpOworfQordWludDY0eDJfdCB2b3JucV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWT1JOIHEwLHEwLHEwCisjZGVmaW5lIHZvcm5xX3U2NCB2b3JucV9zNjQKKworLy8qKioqKioqKioqKioqKioqKioqKiogQml0d2lzZSBTZWxlY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL05vdGUgVGhpcyBpbnRyaW5zaWMgY2FuIGNvbXBpbGUgdG8gYW55IG9mIFZCU0wvVkJJRi9WQklUIGRlcGVuZGluZyBvbiByZWdpc3RlciBhbGxvY2F0aW9uLig/Pz8/Pz8/Pz8pCisKKy8vVkJTTCAoQml0d2lzZSBTZWxlY3QpIHNlbGVjdHMgZWFjaCBiaXQgZm9yIHRoZSBkZXN0aW5hdGlvbiBmcm9tIHRoZSBmaXJzdCBvcGVyYW5kIGlmIHRoZQorLy9jb3JyZXNwb25kaW5nIGJpdCBvZiB0aGUgZGVzdGluYXRpb24gaXMgMSwgb3IgZnJvbSB0aGUgc2Vjb25kIG9wZXJhbmQgaWYgdGhlIGNvcnJlc3BvbmRpbmcgYml0IG9mIHRoZSBkZXN0aW5hdGlvbiBpcyAwLgorCisvL1ZCSUYgKEJpdHdpc2UgSW5zZXJ0IGlmIEZhbHNlKSBpbnNlcnRzIGVhY2ggYml0IGZyb20gdGhlIGZpcnN0IG9wZXJhbmQgaW50byB0aGUgZGVzdGluYXRpb24KKy8vaWYgdGhlIGNvcnJlc3BvbmRpbmcgYml0IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBpcyAwLCBvdGhlcndpc2UgbGVhdmVzIHRoZSBkZXN0aW5hdGlvbiBiaXQgdW5jaGFuZ2VkCisKKy8vVkJJVCAoQml0d2lzZSBJbnNlcnQgaWYgVHJ1ZSkgaW5zZXJ0cyBlYWNoIGJpdCBmcm9tIHRoZSBmaXJzdCBvcGVyYW5kIGludG8gdGhlIGRlc3RpbmF0aW9uCisvL2lmIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgaXMgMSwgb3RoZXJ3aXNlIGxlYXZlcyB0aGUgZGVzdGluYXRpb24gYml0IHVuY2hhbmdlZC4KKworLy9WQlNMIG9ubHkgaXMgaW1wbGVtZW50ZWQgZm9yIFNJTUQKK2ludDh4OF90IHZic2xfczgodWludDh4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZic2xfczgodWludDh4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdmJzbHFfczgoX3BNMTI4aShhKSwgX3BNMTI4aShiKSwgX3BNMTI4aShjKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MTZ4NF90IHZic2xfczE2KHVpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAorI2RlZmluZSB2YnNsX3MxNiB2YnNsX3M4CisKK2ludDMyeDJfdCB2YnNsX3MzMih1aW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYyk7IC8vIFZCU0wgZDAsZDAsZDAKKyNkZWZpbmUgdmJzbF9zMzIgdmJzbF9zOAorCitpbnQ2NHgxX3QgdmJzbF9zNjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiwgaW50NjR4MV90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDFfdCB2YnNsX3M2NCh1aW50NjR4MV90IGEsIGludDY0eDFfdCBiLCBpbnQ2NHgxX3QgYykKK3sKKyAgICBpbnQ2NHgxX3QgcmVzOworICAgIHJlcy5tNjRfaTY0WzBdID0gKGEubTY0X2k2NFswXSAmIGIubTY0X2k2NFswXSkgfCAoICh+YS5tNjRfaTY0WzBdKSAmIGMubTY0X2k2NFswXSk7CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDh4OF90IHZic2xfdTgodWludDh4OF90IGEsICB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCisjZGVmaW5lIHZic2xfdTggdmJzbF9zOAorCit1aW50MTZ4NF90IHZic2xfdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAorI2RlZmluZSB2YnNsX3UxNiB2YnNsX3M4CisKK3VpbnQzMngyX3QgdmJzbF91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCisjZGVmaW5lIHZic2xfdTMyIHZic2xfczgKKwordWludDY0eDFfdCB2YnNsX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYiwgdWludDY0eDFfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAorI2RlZmluZSB2YnNsX3U2NCB2YnNsX3M2NAorCitmbG9hdDMyeDJfdCB2YnNsX2YzMih1aW50MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4Ml90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZic2xfZjMyKHVpbnQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgYykKK3sKKyAgICBfX20xMjggc2VsMSwgc2VsMjsKKyAgICBfX202NF8xMjggcmVzNjQ7CisgICAgc2VsMSA9IF9tbV9hbmRfcHMgICAoX3BNMTI4KGEpLCBfcE0xMjgoYikpOworICAgIHNlbDIgPSBfbW1fYW5kbm90X3BzIChfcE0xMjgoYSksIF9wTTEyOChjKSk7CisgICAgc2VsMSA9IF9tbV9vcl9wcyAoc2VsMSwgc2VsMik7CisgICAgX002NGYocmVzNjQsIHNlbDEpOworICAgIHJldHVybiByZXM2NDsKK30KKworcG9seTh4OF90IHZic2xfcDgodWludDh4OF90IGEsIHBvbHk4eDhfdCBiLCBwb2x5OHg4X3QgYyk7IC8vIFZCU0wgZDAsZDAsZDAKKyNkZWZpbmUgIHZic2xfcDggdmJzbF9zOAorCitwb2x5MTZ4NF90IHZic2xfcDE2KHVpbnQxNng0X3QgYSwgcG9seTE2eDRfdCBiLCBwb2x5MTZ4NF90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCisjZGVmaW5lICB2YnNsX3AxNiB2YnNsX3M4CisKK2ludDh4MTZfdCB2YnNscV9zOCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBpbnQ4eDE2X3QgYyk7IC8vIFZCU0wgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZic2xxX3M4KHVpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIGludDh4MTZfdCBjKSAvLyBWQlNMIHEwLHEwLHEwCit7CisgICAgX19tMTI4aSBzZWwxLCBzZWwyOworICAgIHNlbDEgPSBfbW1fYW5kX3NpMTI4ICAgKGEsIGIpOworICAgIHNlbDIgPSBfbW1fYW5kbm90X3NpMTI4IChhLCBjKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChzZWwxLCBzZWwyKTsKK30KKworaW50MTZ4OF90IHZic2xxX3MxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgYyk7IC8vIFZCU0wgcTAscTAscTAKKyNkZWZpbmUgdmJzbHFfczE2IHZic2xxX3M4CisKK2ludDMyeDRfdCB2YnNscV9zMzIodWludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4NF90IGMpOyAvLyBWQlNMIHEwLHEwLHEwCisjZGVmaW5lIHZic2xxX3MzMiB2YnNscV9zOAorCitpbnQ2NHgyX3QgdmJzbHFfczY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIsIGludDY0eDJfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAorI2RlZmluZSB2YnNscV9zNjQgdmJzbHFfczgKKwordWludDh4MTZfdCB2YnNscV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgdWludDh4MTZfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAorI2RlZmluZSB2YnNscV91OCB2YnNscV9zOAorCit1aW50MTZ4OF90IHZic2xxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDhfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAorI2RlZmluZSB2YnNscV91MTYgdmJzbHFfczgKKwordWludDMyeDRfdCB2YnNscV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMng0X3QgYyk7IC8vIFZCU0wgcTAscTAscTAKKyNkZWZpbmUgdmJzbHFfdTMyIHZic2xxX3M4CisKK3VpbnQ2NHgyX3QgdmJzbHFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiLCB1aW50NjR4Ml90IGMpOyAvLyBWQlNMIHEwLHEwLHEwCisjZGVmaW5lIHZic2xxX3U2NCB2YnNscV9zOAorCitmbG9hdDMyeDRfdCB2YnNscV9mMzIodWludDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDRfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDRfdCB2YnNscV9mMzIodWludDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDRfdCBjKSAvLyBWQlNMIHEwLHEwLHEwCit7CisgICAgX19tMTI4IHNlbDEsIHNlbDI7CisgICAgc2VsMSA9IF9tbV9hbmRfcHMgICAoKihfX20xMjgqKSZhLCBiKTsKKyAgICBzZWwyID0gX21tX2FuZG5vdF9wcyAoKihfX20xMjgqKSZhLCBjKTsKKyAgICByZXR1cm4gX21tX29yX3BzIChzZWwxLCBzZWwyKTsKK30KKworcG9seTh4MTZfdCB2YnNscV9wOCh1aW50OHgxNl90IGEsIHBvbHk4eDE2X3QgYiwgcG9seTh4MTZfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAorI2RlZmluZSB2YnNscV9wOCB2YnNscV91OAorCitwb2x5MTZ4OF90IHZic2xxX3AxNih1aW50MTZ4OF90IGEsIHBvbHkxNng4X3QgYiwgcG9seTE2eDhfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAorI2RlZmluZSB2YnNscV9wMTYgdmJzbHFfczgKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKiBUcmFuc3Bvc2l0aW9uIG9wZXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKiogIFZlY3RvciBUcmFuc3Bvc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9WVFJOIChWZWN0b3IgVHJhbnNwb3NlKSB0cmVhdHMgdGhlIGVsZW1lbnRzIG9mIGl0cyBvcGVyYW5kIHZlY3RvcnMgYXMgZWxlbWVudHMgb2YgMiB4IDIgbWF0cmljZXMsIGFuZCB0cmFuc3Bvc2VzIHRoZSBtYXRyaWNlcy4KKy8vIG1ha2luZyB0aGUgcmVzdWx0IGxvb2sgYXMgKGEwLCBiMCwgYTIsIGIyLCBhNCwgYjQsLi4uLikgKGExLCBiMSwgYTMsIGIzLCBhNSwgYjUsLi4uLi4pCitpbnQ4eDh4Ml90IHZ0cm5fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZUUk4uOCBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDh4Ml90IHZ0cm5fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgLy8gVlRSTi44IGQwLGQwCit7CisgICAgaW50OHg4eDJfdCB2YWw7CisgICAgX19tMTI4aSB0bXAsIHZhbDA7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMTZfZXZlbl9vZGRbMTZdID0geyAwLDEsIDQsNSwgOCw5LCAxMiwxMywgMiwzLCA2LDcsIDEwLDExLCAxNCwxNX07IC8vbWFzazhfdHJuc3AKKyAgICB0bXAgPSBfbW1fdW5wYWNrbG9fZXBpOChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKTsgLy9hMCxiMCxhMSxiMSxhMixiMixhMyxiMywuLi4sYTcsYjcKKyAgICB2YWwwID0gX21tX3NodWZmbGVfZXBpOCAodG1wLCAqKF9fbTEyOGkqKW1hc2sxNl9ldmVuX29kZCk7IC8vKGEwLCBiMCwgYTIsIGIyLCBhNCwgYjQsIGE2LCBiNiksIChhMSxiMSwgYTMsYjMsIGE1LGI1LCBhNyxiNykKKyAgICB2c3QxcV9zOCAodmFsLnZhbCwgdmFsMCk7IC8vIF9tbV9zaHVmZmxlX2VwaTMyICh2YWwudmFsWzBdLCBfU1dBUF9ISV9MT1czMik7IC8vKGExLGIxLCBhMyxiMywgYTUsYjUsIGE3LGI3KSwoYTAsIGIwLCBhMiwgYjIsIGE0LCBiNCwgYTYsIGI2KSwKKyAgICByZXR1cm4gdmFsOworfQorCitpbnQxNng0eDJfdCB2dHJuX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWVFJOLjE2IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDR4Ml90IHZ0cm5fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgLy8gVlRSTi4xNiBkMCxkMAoreworICAgIGludDE2eDR4Ml90IHZhbDsKKyAgICBfX20xMjhpIHRtcCwgdmFsMDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2tkbHYxNlsxNl0gPSB7MCwxLCAyLDMsIDgsOSwgMTAsMTEsIDQsNSwgNiw3LCAxMiwxMywgMTQsIDE1fTsKKyAgICB0bXAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSk7IC8vYTAsYjAsYTEsYjEsYTIsYjIsYTMsYjMKKyAgICB2YWwwID0gIF9tbV9zaHVmZmxlX2VwaTggKHRtcCwgKihfX20xMjhpKiltYXNrZGx2MTYpOyAvL2EwLCBiMCwgYTIsIGIyLCBhMSxiMSwgYTMsIGIzCisgICAgdnN0MXFfczE2KHZhbC52YWwsIHZhbDApOyAvLyBfbW1fc2h1ZmZsZV9lcGkzMiAodmFsLnZhbFswXSwgX1NXQVBfSElfTE9XMzIpOyAvLyhhMSxiMSwgYTMsYjMpLChhMCwgYjAsIGEyLCBiMiksCisgICAgcmV0dXJuIHZhbDsKK30KKworaW50MzJ4MngyX3QgdnRybl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlRSTi4zMiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyeDJfdCB2dHJuX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4MngyX3QgdmFsOworICAgIF9fbTEyOGkgdmFsMDsKKyAgICB2YWwwID0gX21tX3VucGFja2xvX2VwaTMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpOyAvL2EwLGIwLGExLGIxCisgICAgdnN0MXFfczMyKHZhbC52YWwsIHZhbDApOyAvLyBfbW1fc2h1ZmZsZV9lcGkzMih2YWwudmFsWzBdLCBfU1dBUF9ISV9MT1czMik7IC8vYTEsYjEsIGEwLGIwLAorICAgIHJldHVybiB2YWw7Cit9CisKK3VpbnQ4eDh4Ml90IHZ0cm5fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRSTi44IGQwLGQwCisjZGVmaW5lIHZ0cm5fdTggdnRybl9zOAorCit1aW50MTZ4NHgyX3QgdnRybl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWVFJOLjE2IGQwLGQwCisjZGVmaW5lIHZ0cm5fdTE2IHZ0cm5fczE2CisKK3VpbnQzMngyeDJfdCB2dHJuX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZUUk4uMzIgZDAsZDAKKyNkZWZpbmUgdnRybl91MzIgdnRybl9zMzIKKworZmxvYXQzMngyeDJfdCB2dHJuX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVlRSTi4zMiBkMCxkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJ4Ml90IHZ0cm5fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpCit7CisgICAgZmxvYXQzMngyeDJfdCB2YWw7CisgICAgdmFsLnZhbFswXS5tNjRfZjMyWzBdID0gYS5tNjRfZjMyWzBdOworICAgIHZhbC52YWxbMF0ubTY0X2YzMlsxXSA9IGIubTY0X2YzMlswXTsKKyAgICB2YWwudmFsWzFdLm02NF9mMzJbMF0gPSBhLm02NF9mMzJbMV07CisgICAgdmFsLnZhbFsxXS5tNjRfZjMyWzFdID0gYi5tNjRfZjMyWzFdOworICAgIHJldHVybiB2YWw7IC8vYTAsYjAsYTEsYjEKK30KKworcG9seTh4OHgyX3QgdnRybl9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIpOyAvLyBWVFJOLjggZDAsZDAKKyNkZWZpbmUgIHZ0cm5fcDggdnRybl91OAorCitwb2x5MTZ4NHgyX3QgdnRybl9wMTYocG9seTE2eDRfdCBhLCBwb2x5MTZ4NF90IGIpOyAvLyBWVFJOLjE2IGQwLGQwCisjZGVmaW5lICB2dHJuX3AxNiB2dHJuX3MxNgorCisvL2ludDh4MTZ4Ml90IHZ0cm5xX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZUUk4uOCBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2eDJfdCB2dHJucV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIC8vIFZUUk4uOCBxMCxxMAoreworICAgIGludDh4MTZ4Ml90IHI4eDE2OworICAgIF9fbTEyOGkgYV9zaCwgYl9zaDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4X2V2ZW5fb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMyw1LCA3LCA5LCAxMSwgMTMsIDE1fTsKKyAgICBhX3NoID0gX21tX3NodWZmbGVfZXBpOCAoYSwgKihfX20xMjhpKiltYXNrOF9ldmVuX29kZCk7IC8vYTAsIGEyLCBhNCwgYTYsIGE4LCBhMTAsIGExMiwgYTE0LCBhMSwgYTMsIGE1LCBhNywgYTksIGExMSwgYTEzLCBhMTUKKyAgICBiX3NoID0gX21tX3NodWZmbGVfZXBpOCAoYiwgKihfX20xMjhpKiltYXNrOF9ldmVuX29kZCk7IC8vYjAsIGIyLCBiNCwgYjYsIGI4LCBiMTAsIGIxMiwgYjE0LCBiMSwgYjMsIGI1LCBiNywgYjksIGIxMSwgYjEzLCBiMTUKKworICAgIHI4eDE2LnZhbFswXSA9ICBfbW1fdW5wYWNrbG9fZXBpOChhX3NoLCBiX3NoKTsgLy8oYTAsIGIwLCBhMiwgYjIsIGE0LCBiNCwgYTYsIGI2LCBhOCxiOCwgYTEwLGIxMCwgYTEyLGIxMiwgYTE0LGIxNCkKKyAgICByOHgxNi52YWxbMV0gPSAgX21tX3VucGFja2hpX2VwaTgoYV9zaCwgYl9zaCk7IC8vIChhMSwgYjEsIGEzLCBiMywgYTUsIGI1LCBhNywgYjcsIGE5LGI5LCBhMTEsYjExLCBhMTMsYjEzLCBhMTUsYjE1KQorICAgIHJldHVybiByOHgxNjsKK30KKworaW50MTZ4OHgyX3QgdnRybnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZUUk4uMTYgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OHgyX3QgdnRybnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgLy8gVlRSTi4xNiBxMCxxMAoreworICAgIGludDE2eDh4Ml90IHYxNng4OworICAgIF9fbTEyOGkgYV9zaCwgYl9zaDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2sxNl9ldmVuX29kZFsxNl0gPSB7IDAsMSwgNCw1LCA4LDksIDEyLDEzLCAyLDMsIDYsNywgMTAsMTEsIDE0LDE1fTsKKyAgICBhX3NoID0gX21tX3NodWZmbGVfZXBpOCAoYSwgKihfX20xMjhpKiltYXNrMTZfZXZlbl9vZGQpOyAvL2EwLCBhMiwgYTQsIGE2LCAgYTEsIGEzLCBhNSwgYTcKKyAgICBiX3NoID0gX21tX3NodWZmbGVfZXBpOCAoYiwgKihfX20xMjhpKiltYXNrMTZfZXZlbl9vZGQpOyAvL2IwLCBiMiwgYjQsIGI2LCAgYjEsIGIzLCBiNSwgYjcKKyAgICB2MTZ4OC52YWxbMF0gPSBfbW1fdW5wYWNrbG9fZXBpMTYoYV9zaCwgYl9zaCk7IC8vYTAsIGIwLCBhMiwgYjIsIGE0LCBiNCwgYTYsIGI2CisgICAgdjE2eDgudmFsWzFdID0gX21tX3VucGFja2hpX2VwaTE2KGFfc2gsIGJfc2gpOyAvL2ExLCBiMSwgYTMsIGIzLCBhNSwgYjUsIGE3LCBiNworICAgIHJldHVybiB2MTZ4ODsKK30KKworaW50MzJ4NHgyX3QgdnRybnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZUUk4uMzIgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NHgyX3QgdnRybnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgLy8gVlRSTi4zMiBxMCxxMAoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIHNvbHV0aW9uIGNvbXBhcmVkIHdpdGggc2VyaWFsCisgICAgaW50MzJ4NHgyX3QgdjMyeDQ7CisgICAgX19tMTI4aSBhX3NoLCBiX3NoOworICAgIGFfc2ggPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgMjE2KTsgLy9hMCwgYTIsIGExLCBhMworICAgIGJfc2ggPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYiwgMjE2KTsgLy9iMCwgYjIsIGIxLCBiMworCisgICAgdjMyeDQudmFsWzBdID0gX21tX3VucGFja2xvX2VwaTMyKGFfc2gsIGJfc2gpOyAvL2EwLCBiMCwgYTIsIGIyCisgICAgdjMyeDQudmFsWzFdID0gX21tX3VucGFja2hpX2VwaTMyKGFfc2gsIGJfc2gpOyAvL2ExLCBiMSwgYTMsICBiMworICAgIHJldHVybiB2MzJ4NDsKK30KKwordWludDh4MTZ4Ml90IHZ0cm5xX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVlRSTi44IHEwLHEwCisjZGVmaW5lIHZ0cm5xX3U4IHZ0cm5xX3M4CisKK3VpbnQxNng4eDJfdCB2dHJucV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWVFJOLjE2IHEwLHEwCisjZGVmaW5lIHZ0cm5xX3UxNiB2dHJucV9zMTYKKwordWludDMyeDR4Ml90IHZ0cm5xX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZUUk4uMzIgcTAscTAKKyNkZWZpbmUgdnRybnFfdTMyIHZ0cm5xX3MzMgorCitmbG9hdDMyeDR4Ml90IHZ0cm5xX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVlRSTi4zMiBxMCxxMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDR4Ml90IHZ0cm5xX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSAvLyBWVFJOLjMyIHEwLHEwCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgc29sdXRpb24gY29tcGFyZWQgd2l0aCBzZXJpYWwKKyAgICBmbG9hdDMyeDR4Ml90IGYzMng0OworICAgIF9fbTEyOCBhX3NoLCBiX3NoOworICAgIGFfc2ggPSBfbW1fc2h1ZmZsZV9wcyAoYSwgYSwgX01NX1NIVUZGTEUoMywxLCAyLCAwKSk7IC8vYTAsIGEyLCBhMSwgYTMsIG5lZWQgdG8gY2hlY2sgZW5kaW5lc3MKKyAgICBiX3NoID0gX21tX3NodWZmbGVfcHMgKGIsIGIsIF9NTV9TSFVGRkxFKDMsMSwgMiwgMCkpOyAvL2IwLCBiMiwgYjEsIGIzLCBuZWVkIHRvIGNoZWNrIGVuZGluZXNzCisKKyAgICBmMzJ4NC52YWxbMF0gPSBfbW1fdW5wYWNrbG9fcHMoYV9zaCwgYl9zaCk7IC8vYTAsIGIwLCBhMiwgYjIKKyAgICBmMzJ4NC52YWxbMV0gPSBfbW1fdW5wYWNraGlfcHMoYV9zaCwgYl9zaCk7IC8vYTEsIGIxLCBhMywgIGIzCisgICAgcmV0dXJuIGYzMng0OworfQorCitwb2x5OHgxNngyX3QgdnRybnFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpOyAvLyBWVFJOLjggcTAscTAKKyNkZWZpbmUgdnRybnFfcDggdnRybnFfczgKKworcG9seTE2eDh4Ml90IHZ0cm5xX3AxNihwb2x5MTZ4OF90IGEsIHBvbHkxNng4X3QgYik7IC8vIFZUUk4uMTYgcTAscTAKKyNkZWZpbmUgdnRybnFfcDE2IHZ0cm5xX3MxNgorCisvLyoqKioqKioqKioqKioqKioqIEludGVybGVhdmUgZWxlbWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL291dHB1dCBoYXMgKGEwLGIwLGExLGIxLCBhMixiMiwuLi4uLikKK2ludDh4OHgyX3QgdnppcF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlpJUC44IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OHgyX3QgdnppcF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSAvLyBWWklQLjggZDAsZDAKK3sKKyAgICBpbnQ4eDh4Ml90IHZhbDsKKyAgICBfX20xMjhpIHZhbDA7CisgICAgdmFsMCA9IF9tbV91bnBhY2tsb19lcGk4KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpOworICAgIHZzdDFxX3M4KHZhbC52YWwsIHZhbDApOyAvL19tbV9zaHVmZmxlX2VwaTMyKHZhbC52YWxbMF0sIF9TV0FQX0hJX0xPVzMyKTsKKyAgICByZXR1cm4gdmFsOworfQorCitpbnQxNng0eDJfdCB2emlwX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWWklQLjE2IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDR4Ml90IHZ6aXBfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgLy8gVlpJUC4xNiBkMCxkMAoreworICAgIGludDE2eDR4Ml90IHZhbDsKKyAgICBfX20xMjhpIHZhbDA7CisgICAgdmFsMCA9IF9tbV91bnBhY2tsb19lcGkxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKTsKKyAgICB2c3QxcV9zMTYodmFsLnZhbCwgdmFsMCk7IC8vIF9tbV9zaHVmZmxlX2VwaTMyKHZhbC52YWxbMF0sIF9TV0FQX0hJX0xPVzMyKTsKKyAgICByZXR1cm4gdmFsOworfQorCitpbnQzMngyeDJfdCB2emlwX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWWklQLjMyIGQwLGQwCisjZGVmaW5lIHZ6aXBfczMyIHZ0cm5fczMyCisKK3VpbnQ4eDh4Ml90IHZ6aXBfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlpJUC44IGQwLGQwCisjZGVmaW5lIHZ6aXBfdTggdnppcF9zOAorCit1aW50MTZ4NHgyX3QgdnppcF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWWklQLjE2IGQwLGQwCisjZGVmaW5lIHZ6aXBfdTE2IHZ6aXBfczE2CisKK3VpbnQzMngyeDJfdCB2emlwX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZaSVAuMzIgZDAsZDAKKyNkZWZpbmUgdnppcF91MzIgdnppcF9zMzIKKworZmxvYXQzMngyeDJfdCB2emlwX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVlpJUC4zMiBkMCxkMAorI2RlZmluZSB2emlwX2YzMiB2dHJuX2YzMgorCitwb2x5OHg4eDJfdCB2emlwX3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYik7IC8vIFZaSVAuOCBkMCxkMAorI2RlZmluZSB2emlwX3A4IHZ6aXBfdTgKKworcG9seTE2eDR4Ml90IHZ6aXBfcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiKTsgLy8gVlpJUC4xNiBkMCxkMAorI2RlZmluZSB2emlwX3AxNiB2emlwX3UxNgorCitpbnQ4eDE2eDJfdCB2emlwcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWWklQLjggcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNngyX3QgdnppcHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSAvLyBWWklQLjggcTAscTAKK3sKKyAgICBpbnQ4eDE2eDJfdCByOHgxNjsKKyAgICByOHgxNi52YWxbMF0gPSAgX21tX3VucGFja2xvX2VwaTgoYSwgYik7CisgICAgcjh4MTYudmFsWzFdID0gIF9tbV91bnBhY2toaV9lcGk4KGEsIGIpOworICAgIHJldHVybiByOHgxNjsKK30KKworaW50MTZ4OHgyX3QgdnppcHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZaSVAuMTYgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OHgyX3QgdnppcHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgLy8gVlpJUC4xNiBxMCxxMAoreworICAgIGludDE2eDh4Ml90IHIxNng4OworICAgIHIxNng4LnZhbFswXSA9ICBfbW1fdW5wYWNrbG9fZXBpMTYoYSwgYik7CisgICAgcjE2eDgudmFsWzFdID0gIF9tbV91bnBhY2toaV9lcGkxNihhLCBiKTsKKyAgICByZXR1cm4gcjE2eDg7Cit9CisKK2ludDMyeDR4Ml90IHZ6aXBxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWWklQLjMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDR4Ml90IHZ6aXBxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIC8vIFZaSVAuMzIgcTAscTAKK3sKKyAgICBpbnQzMng0eDJfdCByMzJ4NDsKKyAgICByMzJ4NC52YWxbMF0gPSAgX21tX3VucGFja2xvX2VwaTMyKGEsIGIpOworICAgIHIzMng0LnZhbFsxXSA9ICBfbW1fdW5wYWNraGlfZXBpMzIoYSwgYik7CisgICAgcmV0dXJuIHIzMng0OworfQorCit1aW50OHgxNngyX3QgdnppcHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWWklQLjggcTAscTAKKyNkZWZpbmUgdnppcHFfdTggdnppcHFfczgKKwordWludDE2eDh4Ml90IHZ6aXBxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZaSVAuMTYgcTAscTAKKyNkZWZpbmUgdnppcHFfdTE2IHZ6aXBxX3MxNgorCit1aW50MzJ4NHgyX3QgdnppcHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlpJUC4zMiBxMCxxMAorI2RlZmluZSB2emlwcV91MzIgdnppcHFfczMyCisKK2Zsb2F0MzJ4NHgyX3QgdnppcHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWWklQLjMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NHgyX3QgdnppcHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpIC8vIFZaSVAuMzIgcTAscTAKK3sKKyAgICBmbG9hdDMyeDR4Ml90IGYzMng0OworICAgIGYzMng0LnZhbFswXSA9ICAgX21tX3VucGFja2xvX3BzICggYSwgIGIpOworICAgIGYzMng0LnZhbFsxXSA9ICAgX21tX3VucGFja2hpX3BzICggYSwgIGIpOworICAgIHJldHVybiBmMzJ4NDsKK30KKworcG9seTh4MTZ4Ml90IHZ6aXBxX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiKTsgLy8gVlpJUC44IHEwLHEwCisjZGVmaW5lIHZ6aXBxX3A4IHZ6aXBxX3U4CisKK3BvbHkxNng4eDJfdCB2emlwcV9wMTYocG9seTE2eDhfdCBhLCBwb2x5MTZ4OF90IGIpOyAvLyBWWklQLjE2IHEwLHEwCisjZGVmaW5lIHZ6aXBxX3AxNiB2emlwcV91MTYKKworLy8qKioqKioqKioqKioqKioqKioqKioqKiBEZS1JbnRlcmxlYXZlIGVsZW1lbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9BcyB0aGUgcmVzdWx0IG9mIHRoZXNlIGZ1bmN0aW9ucyBmaXJzdCB2YWwgIGNvbnRhaW5zIChhMCxhMixhNCwuLi4uLGIwLGIyLCBiNCwuLi4pIGFuZCB0aGUgc2Vjb25kIHZhbCAoYTEsYTMsYTUsLi4uLmIxLGIzLGI1Li4uKQorLy9ubyBzdWNoIGZ1bmN0aW9ucyBpbiBJQTMyIFNJTUQsIHNodWZmbGUgaXMgcmVxdWlyZWQKK2ludDh4OHgyX3QgdnV6cF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlVaUC44IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OHgyX3QgdnV6cF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSAvLyBWVVpQLjggZDAsZDAKK3sKKyAgICBpbnQ4eDh4Ml90IHZhbDsKKyAgICBfX20xMjhpIHRtcCwgdmFsMDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2tkbHY4WzE2XSA9IHsgMCwgNCwgOCwgMTIsIDEsIDUsIDksIDEzLCAgMiwgNiwgMTAsIDE0LCAzLCA3LCAxMSwxNX07CisgICAgdG1wID0gX21tX3VucGFja2xvX2VwaTgoX3BNMTI4aShhKSwgX3BNMTI4aShiKSk7IC8vYTAsYjAsYTEsYjEsYTIsYjIsYTMsYjMsLi4uLGE3LGI3CisgICAgdmFsMCA9IF9tbV9zaHVmZmxlX2VwaTggKHRtcCwgKihfX20xMjhpKiltYXNrZGx2OCk7IC8vKGEwLCBhMiwgYTQsIGE2LCBiMCwgYjIsIGI0LCBiNiksICAoYTEsIGEzLCBhNSwgYTcsIGIxLGIzLCBiNSwgYjcpCisgICAgdnN0MXFfczgodmFsLnZhbCwgdmFsMCk7IC8vIF9tbV9zaHVmZmxlX2VwaTMyKHZhbC52YWxbMF0sIF9TV0FQX0hJX0xPVzMyKTsKKyAgICByZXR1cm4gdmFsOworfQorCitpbnQxNng0eDJfdCB2dXpwX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWVVpQLjE2IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDR4Ml90IHZ1enBfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgLy8gVlVaUC4xNiBkMCxkMAoreworICAgIGludDE2eDR4Ml90IHZhbDsKKyAgICBfX20xMjhpIHRtcCwgdmFsMDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2tkbHYxNlsxNl0gPSB7MCwxLCAgOCw5LCAgMiwzLCAxMCwxMSwgIDQsNSwgMTIsMTMsIDYsNywgMTQsMTV9OworICAgIHRtcCA9IF9tbV91bnBhY2tsb19lcGkxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKTsgLy9hMCxiMCxhMSxiMSxhMixiMixhMyxiMworICAgIHZhbDAgPSBfbW1fc2h1ZmZsZV9lcGk4ICh0bXAsICooX19tMTI4aSopbWFza2RsdjE2KTsgLy9hMCxhMiwgYjAsIGIyLCBhMSxhMywgYjEsYjMKKyAgICB2c3QxcV9zMTYodmFsLnZhbCwgdmFsMCk7IC8vIF9tbV9zaHVmZmxlX2VwaTMyKHZhbC52YWxbMF0sIF9TV0FQX0hJX0xPVzMyKTsKKyAgICByZXR1cm4gdmFsOworfQorCitpbnQzMngyeDJfdCB2dXpwX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWVVpQLjMyIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJ4Ml90IHZ1enBfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgLy8gVlVaUC4zMiBkMCxkMAoreworICAgIGludDMyeDJ4Ml90IHZhbDsKKyAgICBfX20xMjhpIHZhbDA7CisgICAgdmFsMCA9IF9tbV91bnBhY2tsb19lcGkzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKTsgLy9hMCxiMCwgYTEsYjEKKyAgICB2c3QxcV9zMzIodmFsLnZhbCwgdmFsMCk7IC8vIF9tbV9zaHVmZmxlX2VwaTMyKHZhbC52YWxbMF0sIF9TV0FQX0hJX0xPVzMyKTsKKyAgICByZXR1cm4gdmFsOworfQorCit1aW50OHg4eDJfdCB2dXpwX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZVWlAuOCBkMCxkMAorI2RlZmluZSB2dXpwX3U4IHZ1enBfczgKKwordWludDE2eDR4Ml90IHZ1enBfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlVaUC4xNiBkMCxkMAorI2RlZmluZSB2dXpwX3UxNiB2dXpwX3MxNgorCit1aW50MzJ4MngyX3QgdnV6cF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWVVpQLjMyIGQwLGQwCisjZGVmaW5lIHZ1enBfdTMyIHZ1enBfczMyCisKK2Zsb2F0MzJ4MngyX3QgdnV6cF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZVWlAuMzIgZDAsZDAKKyNkZWZpbmUgdnV6cF9mMzIgdnppcF9mMzIKKworcG9seTh4OHgyX3QgdnV6cF9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIpOyAvLyBWVVpQLjggZDAsZDAKKyNkZWZpbmUgdnV6cF9wOCB2dXpwX3U4CisKK3BvbHkxNng0eDJfdCB2dXpwX3AxNihwb2x5MTZ4NF90IGEsIHBvbHkxNng0X3QgYik7IC8vIFZVWlAuMTYgZDAsZDAKKyNkZWZpbmUgdnV6cF9wMTYgdnV6cF91MTYKKworaW50OHgxNngyX3QgdnV6cHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlVaUC44IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZ4Ml90IHZ1enBxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgLy8gVlVaUC44IHEwLHEwCit7CisgICAgaW50OHgxNngyX3Qgdjh4MTY7CisgICAgX19tMTI4aSBhX3NoLCBiX3NoOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfZXZlbl9vZGRbMTZdID0geyAwLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxLCAzLDUsIDcsIDksIDExLCAxMywgMTV9OworICAgIGFfc2ggPSBfbW1fc2h1ZmZsZV9lcGk4IChhLCAqKF9fbTEyOGkqKW1hc2s4X2V2ZW5fb2RkKTsgLy9hMCwgYTIsIGE0LCBhNiwgYTgsIGExMCwgYTEyLCBhMTQsIGExLCBhMywgYTUsIGE3LCBhOSwgYTExLCBhMTMsIGExNQorICAgIGJfc2ggPSBfbW1fc2h1ZmZsZV9lcGk4IChiLCAqKF9fbTEyOGkqKW1hc2s4X2V2ZW5fb2RkKTsgLy9iMCwgYjIsIGI0LCBiNiwgYjgsIGIxMCwgYjEyLCBiMTQsIGIxLCBiMywgYjUsIGI3LCBiOSwgYjExLCBiMTMsIGIxNQorICAgIC8vd2UgbmVlZCB1bnBhY2s2NCB0byBjb21iaW5lIGxvd2VyICh1cHBlcikgNjQgYml0cyBmcm9tIGEgd2l0aCBsb3dlciAodXBwZXIpIDY0IGJpdHMgZnJvbSBiCisgICAgdjh4MTYudmFsWzBdID0gX21tX3VucGFja2xvX2VwaTY0KGFfc2gsIGJfc2gpOyAvLy9hMCwgYTIsIGE0LCBhNiwgYTgsIGExMCwgYTEyLCBhMTQsICBiMCwgYjIsIGI0LCBiNiwgYjgsIGIxMCwgYjEyLCBiMTQsCisgICAgdjh4MTYudmFsWzFdID0gX21tX3VucGFja2hpX2VwaTY0KGFfc2gsIGJfc2gpOyAvL2ExLCBhMywgYTUsIGE3LCBhOSwgYTExLCBhMTMsIGExNSwgIGIxLCBiMywgYjUsIGI3LCBiOSwgYjExLCBiMTMsIGIxNQorICAgIHJldHVybiB2OHgxNjsKK30KKworaW50MTZ4OHgyX3QgdnV6cHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZVWlAuMTYgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OHgyX3QgdnV6cHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgLy8gVlVaUC4xNiBxMCxxMAoreworICAgIGludDE2eDh4Ml90IHYxNng4OworICAgIF9fbTEyOGkgYV9zaCwgYl9zaDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2sxNl9ldmVuX29kZFsxNl0gPSB7IDAsMSwgNCw1LCA4LDksIDEyLDEzLCAyLDMsIDYsNywgMTAsMTEsIDE0LDE1fTsKKyAgICBhX3NoID0gX21tX3NodWZmbGVfZXBpOCAoYSwgKihfX20xMjhpKiltYXNrMTZfZXZlbl9vZGQpOyAvL2EwLCBhMiwgYTQsIGE2LCAgYTEsIGEzLCBhNSwgYTcKKyAgICBiX3NoID0gX21tX3NodWZmbGVfZXBpOCAoYiwgKihfX20xMjhpKiltYXNrMTZfZXZlbl9vZGQpOyAvL2IwLCBiMiwgYjQsIGI2LCAgYjEsIGIzLCBiNSwgYjcKKyAgICB2MTZ4OC52YWxbMF0gPSBfbW1fdW5wYWNrbG9fZXBpNjQoYV9zaCwgYl9zaCk7IC8vYTAsIGEyLCBhNCwgYTYsIGIwLCBiMiwgYjQsIGI2CisgICAgdjE2eDgudmFsWzFdID0gX21tX3VucGFja2hpX2VwaTY0KGFfc2gsIGJfc2gpOyAvL2ExLCBhMywgYTUsIGE3LCBiMSwgYjMsIGI1LCBiNworICAgIHJldHVybiB2MTZ4ODsKK30KKworaW50MzJ4NHgyX3QgdnV6cHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZVWlAuMzIgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NHgyX3QgdnV6cHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgLy8gVlVaUC4zMiBxMCxxMAoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIHNvbHV0aW9uIGNvbXBhcmVkIHdpdGggc2VyaWFsCisgICAgaW50MzJ4NHgyX3QgdjMyeDQ7CisgICAgX19tMTI4aSBhX3NoLCBiX3NoOworICAgIGFfc2ggPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgMjE2KTsgLy9hMCwgYTIsIGExLCBhMworICAgIGJfc2ggPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYiwgMjE2KTsgLy9iMCwgYjIsIGIxLCBiMworCisgICAgdjMyeDQudmFsWzBdID0gX21tX3VucGFja2xvX2VwaTY0KGFfc2gsIGJfc2gpOyAvL2EwLCBhMiwgYjAsIGIyCisgICAgdjMyeDQudmFsWzFdID0gX21tX3VucGFja2hpX2VwaTY0KGFfc2gsIGJfc2gpOyAvL2ExLCBhMywgYjEsIGIzCisgICAgcmV0dXJuIHYzMng0OworfQorCit1aW50OHgxNngyX3QgdnV6cHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWVVpQLjggcTAscTAKKyNkZWZpbmUgdnV6cHFfdTggdnV6cHFfczgKKwordWludDE2eDh4Ml90IHZ1enBxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZVWlAuMTYgcTAscTAKKyNkZWZpbmUgdnV6cHFfdTE2IHZ1enBxX3MxNgorCit1aW50MzJ4NHgyX3QgdnV6cHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlVaUC4zMiBxMCxxMAorI2RlZmluZSB2dXpwcV91MzIgdnV6cHFfczMyCisKK2Zsb2F0MzJ4NHgyX3QgdnV6cHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWVVpQLjMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NHgyX3QgdnV6cHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpIC8vIFZVWlAuMzIgcTAscTAKK3sKKyAgICBmbG9hdDMyeDR4Ml90IHYzMng0OworICAgIHYzMng0LnZhbFswXSA9IF9tbV9zaHVmZmxlX3BzKGEsIGIsIF9NTV9TSFVGRkxFKDIsMCwgMiwgMCkpOyAvL2EwLCBhMiwgYjAsIGIyICwgbmVlZCB0byBjaGVjayBlbmRpYW5lc3MgaG93ZXZlcgorICAgIHYzMng0LnZhbFsxXSA9IF9tbV9zaHVmZmxlX3BzKGEsIGIsIF9NTV9TSFVGRkxFKDMsMSwgMywgMSkpOyAvL2ExLCBhMywgYjEsIGIzLCBuZWVkIHRvIGNoZWNrIGVuZGlhbmVzcyBob3dldmVyCisgICAgcmV0dXJuIHYzMng0OworfQorCitwb2x5OHgxNngyX3QgdnV6cHFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpOyAvLyBWVVpQLjggcTAscTAKKyNkZWZpbmUgdnV6cHFfcDggdnV6cHFfdTgKKworcG9seTE2eDh4Ml90IHZ1enBxX3AxNihwb2x5MTZ4OF90IGEsIHBvbHkxNng4X3QgYik7IC8vIFZVWlAuMTYgcTAscTAKKyNkZWZpbmUgdnV6cHFfcDE2IHZ1enBxX3UxNgorCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vKioqKioqKioqKioqKioqKioqKioqKiogUmVpbnRlcnByZXQgY2FzdCBpbnRyaW5zaWNzLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyBOb3QgYSBwYXJ0IG9mIG9maWNpYWwgTkVPTiBpbnN0cnVjdGlvbiBzZXQgYnV0IGF2YWlsYWJsZSBpbiBnY2MgY29tcGlsZXIgKioqKioqKioqKioqKioqKioqKioqCitwb2x5OHg4X3QgdnJlaW50ZXJwcmV0X3A4X3UzMiAodWludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3A4X3UzMgorCitwb2x5OHg4X3QgdnJlaW50ZXJwcmV0X3A4X3UxNiAodWludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3A4X3UxNgorCitwb2x5OHg4X3QgdnJlaW50ZXJwcmV0X3A4X3U4ICh1aW50OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wOF91OAorCitwb2x5OHg4X3QgdnJlaW50ZXJwcmV0X3A4X3MzMiAoaW50MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfcDhfczMyCisKK3BvbHk4eDhfdCB2cmVpbnRlcnByZXRfcDhfczE2IChpbnQxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wOF9zMTYKKworcG9seTh4OF90IHZyZWludGVycHJldF9wOF9zOCAoaW50OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wOF9zOAorCitwb2x5OHg4X3QgdnJlaW50ZXJwcmV0X3A4X3U2NCAodWludDY0eDFfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3A4X3U2NAorCitwb2x5OHg4X3QgdnJlaW50ZXJwcmV0X3A4X3M2NCAoaW50NjR4MV90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfcDhfczY0CisKK3BvbHk4eDhfdCB2cmVpbnRlcnByZXRfcDhfZjMyIChmbG9hdDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3A4X2YzMgorCitwb2x5OHg4X3QgdnJlaW50ZXJwcmV0X3A4X3AxNiAocG9seTE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3A4X3AxNgorCitwb2x5OHgxNl90IHZyZWludGVycHJldHFfcDhfdTMyICh1aW50MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3A4X3UzMgorCitwb2x5OHgxNl90IHZyZWludGVycHJldHFfcDhfdTE2ICh1aW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3A4X3UxNgorCitwb2x5OHgxNl90IHZyZWludGVycHJldHFfcDhfdTggKHVpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfcDhfdTgKKworcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X3MzMiAoaW50MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3A4X3MzMgorCitwb2x5OHgxNl90IHZyZWludGVycHJldHFfcDhfczE2IChpbnQxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfcDhfczE2CisKK3BvbHk4eDE2X3QgdnJlaW50ZXJwcmV0cV9wOF9zOCAoaW50OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3A4X3M4CisKK3BvbHk4eDE2X3QgdnJlaW50ZXJwcmV0cV9wOF91NjQgKHVpbnQ2NHgyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfcDhfdTY0CisKK3BvbHk4eDE2X3QgdnJlaW50ZXJwcmV0cV9wOF9zNjQgKGludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9wOF9zNjQKKworcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X2YzMiAoZmxvYXQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfcDhfZjMyKHQpIF9NMTI4aSh0KQorCitwb2x5OHgxNl90IHZyZWludGVycHJldHFfcDhfcDE2IChwb2x5MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3A4X3AxNgorCitwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfdTMyICh1aW50MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfcDE2X3UzMgorCitwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfdTE2ICh1aW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfcDE2X3UxNgorCitwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfdTggKHVpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3AxNl91OAorCitwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfczMyIChpbnQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wMTZfczMyCisKK3BvbHkxNng0X3QgdnJlaW50ZXJwcmV0X3AxNl9zMTYgKGludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3AxNl9zMTYKKworcG9seTE2eDRfdCB2cmVpbnRlcnByZXRfcDE2X3M4IChpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3AxNl9zOAorCitwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfdTY0ICh1aW50NjR4MV90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfcDE2X3U2NAorCitwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfczY0IChpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wMTZfczY0CisKK3BvbHkxNng0X3QgdnJlaW50ZXJwcmV0X3AxNl9mMzIgKGZsb2F0MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfcDE2X2YzMgorCitwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfcDggKHBvbHk4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3AxNl9wOAorCitwb2x5MTZ4OF90IHZyZWludGVycHJldHFfcDE2X3UzMiAodWludDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9wMTZfdTMyCisKK3BvbHkxNng4X3QgdnJlaW50ZXJwcmV0cV9wMTZfdTE2ICh1aW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3AxNl91MTYKKworcG9seTE2eDhfdCB2cmVpbnRlcnByZXRxX3AxNl9zMzIgKGludDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9wMTZfczMyCisKK3BvbHkxNng4X3QgdnJlaW50ZXJwcmV0cV9wMTZfczE2IChpbnQxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfcDE2X3MxNgorCitwb2x5MTZ4OF90IHZyZWludGVycHJldHFfcDE2X3M4IChpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfcDE2X3M4CisKK3BvbHkxNng4X3QgdnJlaW50ZXJwcmV0cV9wMTZfdTY0ICh1aW50NjR4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3AxNl91NjQKKworcG9seTE2eDhfdCB2cmVpbnRlcnByZXRxX3AxNl9zNjQgKGludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9wMTZfczY0CisKK3BvbHkxNng4X3QgdnJlaW50ZXJwcmV0cV9wMTZfZjMyIChmbG9hdDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9wMTZfZjMyKHQpIF9NMTI4aSh0KQorCitwb2x5MTZ4OF90IHZyZWludGVycHJldHFfcDE2X3A4IChwb2x5OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3AxNl9wOCAgdnJlaW50ZXJwcmV0cV9zMTZfcDgKKworLy8qKioqICBJbnRlZ2VyIHRvIGZsb2F0ICAqKioqKioKK2Zsb2F0MzJ4Ml90IHZyZWludGVycHJldF9mMzJfdTMyICh1aW50MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfZjMyX3UzMih0KSAoKihfX202NF8xMjgqKSYodCkpCisKKworZmxvYXQzMngyX3QgdnJlaW50ZXJwcmV0X2YzMl91MTYgKHVpbnQxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9mMzJfdTE2IHZyZWludGVycHJldF9mMzJfdTMyCisKKworZmxvYXQzMngyX3QgdnJlaW50ZXJwcmV0X2YzMl91OCAodWludDh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfZjMyX3U4IHZyZWludGVycHJldF9mMzJfdTMyCisKKworZmxvYXQzMngyX3QgdnJlaW50ZXJwcmV0X2YzMl9zMzIgKGludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X2YzMl9zMzIgdnJlaW50ZXJwcmV0X2YzMl91MzIKKworCitmbG9hdDMyeDJfdCB2cmVpbnRlcnByZXRfZjMyX3MxNiAoaW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfZjMyX3MxNiB2cmVpbnRlcnByZXRfZjMyX3UzMgorCitmbG9hdDMyeDJfdCB2cmVpbnRlcnByZXRfZjMyX3M4IChpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X2YzMl9zOCB2cmVpbnRlcnByZXRfZjMyX3UzMgorCisKK2Zsb2F0MzJ4Ml90IHZyZWludGVycHJldF9mMzJfdTY0KHVpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9mMzJfdTY0IHZyZWludGVycHJldF9mMzJfdTMyCisKKworZmxvYXQzMngyX3QgdnJlaW50ZXJwcmV0X2YzMl9zNjQgKGludDY0eDFfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X2YzMl9zNjQgdnJlaW50ZXJwcmV0X2YzMl91MzIKKworCitmbG9hdDMyeDJfdCB2cmVpbnRlcnByZXRfZjMyX3AxNiAocG9seTE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X2YzMl9wMTYgdnJlaW50ZXJwcmV0X2YzMl91MzIKKworZmxvYXQzMngyX3QgdnJlaW50ZXJwcmV0X2YzMl9wOCAocG9seTh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfZjMyX3A4IHZyZWludGVycHJldF9mMzJfdTMyCisKK2Zsb2F0MzJ4NF90IHZyZWludGVycHJldHFfZjMyX3UzMiAodWludDMyeDRfdCB0KTsKKyNkZWZpbmUgIHZyZWludGVycHJldHFfZjMyX3UzMih0KSAqKF9fbTEyOCopJih0KQorCitmbG9hdDMyeDRfdCB2cmVpbnRlcnByZXRxX2YzMl91MTYgKHVpbnQxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfZjMyX3UxNiB2cmVpbnRlcnByZXRxX2YzMl91MzIKKworZmxvYXQzMng0X3QgdnJlaW50ZXJwcmV0cV9mMzJfdTggKHVpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfZjMyX3U4IHZyZWludGVycHJldHFfZjMyX3UzMgorCitmbG9hdDMyeDRfdCB2cmVpbnRlcnByZXRxX2YzMl9zMzIgKGludDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9mMzJfczMyIHZyZWludGVycHJldHFfZjMyX3UzMgorCitmbG9hdDMyeDRfdCB2cmVpbnRlcnByZXRxX2YzMl9zMTYgKGludDE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9mMzJfczE2IHZyZWludGVycHJldHFfZjMyX3UzMgorCitmbG9hdDMyeDRfdCB2cmVpbnRlcnByZXRxX2YzMl9zOCAoaW50OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX2YzMl9zOCB2cmVpbnRlcnByZXRxX2YzMl91MzIKKworZmxvYXQzMng0X3QgdnJlaW50ZXJwcmV0cV9mMzJfdTY0ICh1aW50NjR4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX2YzMl91NjQgdnJlaW50ZXJwcmV0cV9mMzJfdTMyCisKK2Zsb2F0MzJ4NF90IHZyZWludGVycHJldHFfZjMyX3M2NCAoaW50NjR4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX2YzMl9zNjQgdnJlaW50ZXJwcmV0cV9mMzJfdTMyCisKK2Zsb2F0MzJ4NF90IHZyZWludGVycHJldHFfZjMyX3AxNiAocG9seTE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9mMzJfcDE2IHZyZWludGVycHJldHFfZjMyX3UzMgorCitmbG9hdDMyeDRfdCB2cmVpbnRlcnByZXRxX2YzMl9wOCAocG9seTh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9mMzJfcDggdnJlaW50ZXJwcmV0cV9mMzJfdTMyCisKKy8vKioqIEludGVnZXIgdHlwZSBjb252ZXJzaW9ucyAqKioqKioqKioqKioqKioqKioKKy8vbm8gY29udmVyc2lvbiBuZWNlc3NhcnkgZm9yIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGJlY2F1c2UgaXQgaXMgc2FtZSBkYXRhIHR5cGUKK2ludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X3UzMiAodWludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3M2NF91MzIKKworaW50NjR4MV90IHZyZWludGVycHJldF9zNjRfdTE2ICh1aW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczY0X3UxNgorCitpbnQ2NHgxX3QgdnJlaW50ZXJwcmV0X3M2NF91OCAodWludDh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczY0X3U4CisKK2ludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X3MzMiAoaW50MzJ4Ml90IHQpOworI2RlZmluZSAgdnJlaW50ZXJwcmV0X3M2NF9zMzIKKworaW50NjR4MV90IHZyZWludGVycHJldF9zNjRfczE2IChpbnQxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zNjRfczE2CisKK2ludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X3M4IChpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgIHZyZWludGVycHJldF9zNjRfczgKKworaW50NjR4MV90IHZyZWludGVycHJldF9zNjRfdTY0ICh1aW50NjR4MV90IHQpOworI2RlZmluZSAgdnJlaW50ZXJwcmV0X3M2NF91NjQKKworaW50NjR4MV90IHZyZWludGVycHJldF9zNjRfZjMyIChmbG9hdDMyeDJfdCB0KTsKKyNkZWZpbmUgIHZyZWludGVycHJldF9zNjRfZjMyCisKK2ludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X3AxNiAocG9seTE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3M2NF9wMTYKKworaW50NjR4MV90IHZyZWludGVycHJldF9zNjRfcDggKHBvbHk4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3M2NF9wOAorCitpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV9zNjRfdTMyICh1aW50MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M2NF91MzIKKworaW50NjR4Ml90IHZyZWludGVycHJldHFfczY0X3MxNiAodWludDE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zNjRfczE2CisKK2ludDY0eDJfdCB2cmVpbnRlcnByZXRxX3M2NF91OCAodWludDh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zNjRfdTgKKworaW50NjR4Ml90IHZyZWludGVycHJldHFfczY0X3MzMiAoaW50MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M2NF9zMzIKKworaW50NjR4Ml90IHZyZWludGVycHJldHFfczY0X3UxNiAoaW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M2NF91MTYKKworaW50NjR4Ml90IHZyZWludGVycHJldHFfczY0X3M4IChpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczY0X3M4CisKK2ludDY0eDJfdCB2cmVpbnRlcnByZXRxX3M2NF91NjQgKHVpbnQ2NHgyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczY0X3U2NAorCitpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV9zNjRfZjMyIChmbG9hdDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zNjRfZjMyKHQpIF9NMTI4aSh0KQorCitpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV9zNjRfcDE2IChwb2x5MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M2NF9wMTYKKworaW50NjR4Ml90IHZyZWludGVycHJldHFfczY0X3A4IChwb2x5OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M2NF9wOAorCit1aW50NjR4MV90IHZyZWludGVycHJldF91NjRfdTMyICh1aW50MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTY0X3UzMgorCit1aW50NjR4MV90IHZyZWludGVycHJldF91NjRfdTE2ICh1aW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTY0X3UxNgorCit1aW50NjR4MV90IHZyZWludGVycHJldF91NjRfdTggKHVpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U2NF91OAorCit1aW50NjR4MV90IHZyZWludGVycHJldF91NjRfczMyIChpbnQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91NjRfczMyCisKK3VpbnQ2NHgxX3QgdnJlaW50ZXJwcmV0X3U2NF9zMTYgKGludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U2NF9zMTYKKwordWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X3M4IChpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U2NF9zOAorCit1aW50NjR4MV90IHZyZWludGVycHJldF91NjRfczY0IChpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91NjRfczY0CisKK3VpbnQ2NHgxX3QgdnJlaW50ZXJwcmV0X3U2NF9mMzIgKGZsb2F0MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTY0X2YzMgorCit1aW50NjR4MV90IHZyZWludGVycHJldF91NjRfcDE2IChwb2x5MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTY0X3AxNgorCit1aW50NjR4MV90IHZyZWludGVycHJldF91NjRfcDggKHBvbHk4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U2NF9wOAorCit1aW50NjR4Ml90IHZyZWludGVycHJldHFfdTY0X3UzMiAodWludDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91NjRfdTMyCisKK3VpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV91NjRfdTE2ICh1aW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3U2NF91MTYKKwordWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF91OCAodWludDh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91NjRfdTgKKwordWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF9zMzIgKGludDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91NjRfczMyCisKK3VpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV91NjRfczE2IChpbnQxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTY0X3MxNgorCit1aW50NjR4Ml90IHZyZWludGVycHJldHFfdTY0X3M4IChpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTY0X3M4CisKK3VpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV91NjRfczY0IChpbnQ2NHgyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTY0X3M2NAorCit1aW50NjR4Ml90IHZyZWludGVycHJldHFfdTY0X2YzMiAoZmxvYXQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTY0X2YzMih0KSBfTTEyOGkodCkKKwordWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF9wMTYgKHBvbHkxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTY0X3AxNgorCit1aW50NjR4Ml90IHZyZWludGVycHJldHFfdTY0X3A4IChwb2x5OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3U2NF9wOAorCitpbnQ4eDhfdCB2cmVpbnRlcnByZXRfczhfdTMyICh1aW50MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczhfdTMyCisKK2ludDh4OF90IHZyZWludGVycHJldF9zOF91MTYgKHVpbnQxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zOF91MTYKKworaW50OHg4X3QgdnJlaW50ZXJwcmV0X3M4X3U4ICh1aW50OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zOF91OAorCitpbnQ4eDhfdCB2cmVpbnRlcnByZXRfczhfczMyIChpbnQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zOF9zMzIKKworaW50OHg4X3QgdnJlaW50ZXJwcmV0X3M4X3MxNiAoaW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczhfczE2CisKK2ludDh4OF90IHZyZWludGVycHJldF9zOF91NjQgKHVpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zOF91NjQKKworaW50OHg4X3QgdnJlaW50ZXJwcmV0X3M4X3M2NCAoaW50NjR4MV90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczhfczY0CisKK2ludDh4OF90IHZyZWludGVycHJldF9zOF9mMzIgKGZsb2F0MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczhfZjMyCisKK2ludDh4OF90IHZyZWludGVycHJldF9zOF9wMTYgKHBvbHkxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zOF9wMTYKKworaW50OHg4X3QgdnJlaW50ZXJwcmV0X3M4X3A4IChwb2x5OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zOF9wOAorCitpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV9zOF91MzIgKHVpbnQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczhfdTMyCisKK2ludDh4MTZfdCB2cmVpbnRlcnByZXRxX3M4X3UxNiAodWludDE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zOF91MTYKKworaW50OHgxNl90IHZyZWludGVycHJldHFfczhfdTggKHVpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczhfdTgKKworaW50OHgxNl90IHZyZWludGVycHJldHFfczhfczMyIChpbnQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczhfczMyCisKK2ludDh4MTZfdCB2cmVpbnRlcnByZXRxX3M4X3MxNiAoaW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M4X3MxNgorCitpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV9zOF91NjQgKHVpbnQ2NHgyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczhfdTY0CisKK2ludDh4MTZfdCB2cmVpbnRlcnByZXRxX3M4X3M2NCAoaW50NjR4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M4X3M2NAorCitpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV9zOF9mMzIgKGZsb2F0MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M4X2YzMih0KSBfTTEyOGkodCkKKworaW50OHgxNl90IHZyZWludGVycHJldHFfczhfcDE2IChwb2x5MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M4X3AxNgorCitpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV9zOF9wOCAocG9seTh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zOF9wOAorCitpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3MxNl91MzIgKHVpbnQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zMTZfdTMyCisKK2ludDE2eDRfdCB2cmVpbnRlcnByZXRfczE2X3UxNiAodWludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MxNl91MTYKKworaW50MTZ4NF90IHZyZWludGVycHJldF9zMTZfdTggKHVpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MxNl91OAorCitpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3MxNl9zMzIgKGludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MxNl9zMzIKKworaW50MTZ4NF90IHZyZWludGVycHJldF9zMTZfczggKGludDh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczE2X3M4CisKK2ludDE2eDRfdCB2cmVpbnRlcnByZXRfczE2X3U2NCAodWludDY0eDFfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MxNl91NjQKKworaW50MTZ4NF90IHZyZWludGVycHJldF9zMTZfczY0IChpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zMTZfczY0CisKK2ludDE2eDRfdCB2cmVpbnRlcnByZXRfczE2X2YzMiAoZmxvYXQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zMTZfZjMyCisKKworaW50MTZ4NF90IHZyZWludGVycHJldF9zMTZfcDE2IChwb2x5MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczE2X3AxNgorCitpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3MxNl9wOCAocG9seTh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczE2X3A4CisKK2ludDE2eDhfdCB2cmVpbnRlcnByZXRxX3MxNl91MzIgKHVpbnQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczE2X3UzMgorCitpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV9zMTZfdTE2ICh1aW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MxNl91MTYKKworaW50MTZ4OF90IHZyZWludGVycHJldHFfczE2X3U4ICh1aW50OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MxNl91OAorCitpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV9zMTZfczMyIChpbnQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczE2X3MzMgorCitpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV9zMTZfczggKGludDh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMTZfczgKKworaW50MTZ4OF90IHZyZWludGVycHJldHFfczE2X3U2NCAodWludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMTZfdTY0CisKK2ludDE2eDhfdCB2cmVpbnRlcnByZXRxX3MxNl9zNjQgKGludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMTZfczY0CisKK2ludDE2eDhfdCB2cmVpbnRlcnByZXRxX3MxNl9mMzIgKGZsb2F0MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MxNl9mMzIodCkgX00xMjhpKHQpCisKK2ludDE2eDhfdCB2cmVpbnRlcnByZXRxX3MxNl9wMTYgKHBvbHkxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczE2X3AxNgorCitpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV9zMTZfcDggKHBvbHk4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczE2X3A4CisKK2ludDMyeDJfdCB2cmVpbnRlcnByZXRfczMyX3UzMiAodWludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MzMl91MzIKKworaW50MzJ4Ml90IHZyZWludGVycHJldF9zMzJfdTE2ICh1aW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczMyX3UxNgorCitpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3MzMl91OCAodWludDh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczMyX3U4CisKK2ludDMyeDJfdCB2cmVpbnRlcnByZXRfczMyX3MxNiAoaW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczMyX3MxNgorCitpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3MzMl9zOCAoaW50OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zMzJfczgKKworaW50MzJ4Ml90IHZyZWludGVycHJldF9zMzJfdTY0ICh1aW50NjR4MV90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczMyX3U2NAorCitpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3MzMl9zNjQgKGludDY0eDFfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MzMl9zNjQKKworaW50MzJ4Ml90IHZyZWludGVycHJldF9zMzJfZjMyIChmbG9hdDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MzMl9mMzIKKworaW50MzJ4Ml90IHZyZWludGVycHJldF9zMzJfcDE2IChwb2x5MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczMyX3AxNgorCitpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3MzMl9wOCAocG9seTh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczMyX3A4CisKK2ludDMyeDRfdCB2cmVpbnRlcnByZXRxX3MzMl91MzIgKHVpbnQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczMyX3UzMgorCitpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV9zMzJfdTE2ICh1aW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MzMl91MTYKKworaW50MzJ4NF90IHZyZWludGVycHJldHFfczMyX3U4ICh1aW50OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MzMl91OAorCitpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV9zMzJfczE2IChpbnQxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczMyX3MxNgorCitpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV9zMzJfczggKGludDh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMzJfczgKKworaW50MzJ4NF90IHZyZWludGVycHJldHFfczMyX3U2NCAodWludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMzJfdTY0CisKK2ludDMyeDRfdCB2cmVpbnRlcnByZXRxX3MzMl9zNjQgKGludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMzJfczY0CisKK2ludDMyeDRfdCB2cmVpbnRlcnByZXRxX3MzMl9mMzIgKGZsb2F0MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MzMl9mMzIodCkgIF9tbV9jYXN0cHNfc2kxMjgodCkgLy8oKihfX20xMjhpKikmKHQpKQorCitpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV9zMzJfcDE2IChwb2x5MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MzMl9wMTYKKworaW50MzJ4NF90IHZyZWludGVycHJldHFfczMyX3A4IChwb2x5OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MzMl9wOAorCit1aW50OHg4X3QgdnJlaW50ZXJwcmV0X3U4X3UzMiAodWludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U4X3UzMgorCit1aW50OHg4X3QgdnJlaW50ZXJwcmV0X3U4X3UxNiAodWludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U4X3UxNgorCit1aW50OHg4X3QgdnJlaW50ZXJwcmV0X3U4X3MzMiAoaW50MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdThfczMyCisKK3VpbnQ4eDhfdCB2cmVpbnRlcnByZXRfdThfczE2IChpbnQxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91OF9zMTYKKwordWludDh4OF90IHZyZWludGVycHJldF91OF9zOCAoaW50OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91OF9zOAorCit1aW50OHg4X3QgdnJlaW50ZXJwcmV0X3U4X3U2NCAodWludDY0eDFfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U4X3U2NAorCit1aW50OHg4X3QgdnJlaW50ZXJwcmV0X3U4X3M2NCAoaW50NjR4MV90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdThfczY0CisKK3VpbnQ4eDhfdCB2cmVpbnRlcnByZXRfdThfZjMyIChmbG9hdDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U4X2YzMgorCit1aW50OHg4X3QgdnJlaW50ZXJwcmV0X3U4X3AxNiAocG9seTE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U4X3AxNgorCit1aW50OHg4X3QgdnJlaW50ZXJwcmV0X3U4X3A4IChwb2x5OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91OF9wOAorCit1aW50OHgxNl90IHZyZWludGVycHJldHFfdThfdTMyICh1aW50MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3U4X3UzMgorCit1aW50OHgxNl90IHZyZWludGVycHJldHFfdThfdTE2ICh1aW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3U4X3UxNgorCit1aW50OHgxNl90IHZyZWludGVycHJldHFfdThfczMyIChpbnQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdThfczMyCisKK3VpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV91OF9zMTYgKGludDE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91OF9zMTYKKwordWludDh4MTZfdCB2cmVpbnRlcnByZXRxX3U4X3M4IChpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdThfczgKKwordWludDh4MTZfdCB2cmVpbnRlcnByZXRxX3U4X3U2NCAodWludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91OF91NjQKKwordWludDh4MTZfdCB2cmVpbnRlcnByZXRxX3U4X3M2NCAoaW50NjR4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3U4X3M2NAorCit1aW50OHgxNl90IHZyZWludGVycHJldHFfdThfZjMyIChmbG9hdDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91OF9mMzIodCkgX00xMjhpKHQpCisKKwordWludDh4MTZfdCB2cmVpbnRlcnByZXRxX3U4X3AxNiAocG9seTE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91OF9wMTYKKwordWludDh4MTZfdCB2cmVpbnRlcnByZXRxX3U4X3A4IChwb2x5OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3U4X3A4CisKK3VpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3UxNl91MzIgKHVpbnQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91MTZfdTMyCisKK3VpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3UxNl91OCAodWludDh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTE2X3U4CisKK3VpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3UxNl9zMzIgKGludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3UxNl9zMzIKKwordWludDE2eDRfdCB2cmVpbnRlcnByZXRfdTE2X3MxNiAoaW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTE2X3MxNgorCit1aW50MTZ4NF90IHZyZWludGVycHJldF91MTZfczggKGludDh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTE2X3M4CisKK3VpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3UxNl91NjQgKHVpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91MTZfdTY0CisKK3VpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3UxNl9zNjQgKGludDY0eDFfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3UxNl9zNjQKKwordWludDE2eDRfdCB2cmVpbnRlcnByZXRfdTE2X2YzMiAoZmxvYXQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91MTZfZjMyCisKK3VpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3UxNl9wMTYgKHBvbHkxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91MTZfcDE2CisKK3VpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3UxNl9wOCAocG9seTh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTE2X3A4CisKK3VpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV91MTZfdTMyICh1aW50MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3UxNl91MzIKKwordWludDE2eDhfdCB2cmVpbnRlcnByZXRxX3UxNl91OCAodWludDh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91MTZfdTgKKwordWludDE2eDhfdCB2cmVpbnRlcnByZXRxX3UxNl9zMzIgKGludDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91MTZfczMyCisKK3VpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV91MTZfczE2IChpbnQxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTE2X3MxNgorCit1aW50MTZ4OF90IHZyZWludGVycHJldHFfdTE2X3M4IChpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTE2X3M4CisKK3VpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV91MTZfdTY0ICh1aW50NjR4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3UxNl91NjQKKwordWludDE2eDhfdCB2cmVpbnRlcnByZXRxX3UxNl9zNjQgKGludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91MTZfczY0CisKK3VpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV91MTZfZjMyIChmbG9hdDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91MTZfZjMyKHQpIF9NMTI4aSh0KQorCit1aW50MTZ4OF90IHZyZWludGVycHJldHFfdTE2X3AxNiAocG9seTE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91MTZfcDE2CisKK3VpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV91MTZfcDggKHBvbHk4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTE2X3A4CisKK3VpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3UzMl91MTYgKHVpbnQxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91MzJfdTE2CisKK3VpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3UzMl91OCAodWludDh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTMyX3U4CisKK3VpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3UzMl9zMzIgKGludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3UzMl9zMzIKKwordWludDMyeDJfdCB2cmVpbnRlcnByZXRfdTMyX3MxNiAoaW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTMyX3MxNgorCit1aW50MzJ4Ml90IHZyZWludGVycHJldF91MzJfczggKGludDh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTMyX3M4CisKK3VpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3UzMl91NjQgKHVpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91MzJfdTY0CisKK3VpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3UzMl9zNjQgKGludDY0eDFfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3UzMl9zNjQKKwordWludDMyeDJfdCB2cmVpbnRlcnByZXRfdTMyX2YzMiAoZmxvYXQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91MzJfZjMyCisKK3VpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3UzMl9wMTYgKHBvbHkxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91MzJfcDE2CisKK3VpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3UzMl9wOCAocG9seTh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTMyX3A4CisKK3VpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfdTE2ICh1aW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3UzMl91MTYKKwordWludDMyeDRfdCB2cmVpbnRlcnByZXRxX3UzMl91OCAodWludDh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91MzJfdTgKKwordWludDMyeDRfdCB2cmVpbnRlcnByZXRxX3UzMl9zMzIgKGludDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91MzJfczMyCisKK3VpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfczE2IChpbnQxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTMyX3MxNgorCit1aW50MzJ4NF90IHZyZWludGVycHJldHFfdTMyX3M4IChpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTMyX3M4CisKK3VpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfdTY0ICh1aW50NjR4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3UzMl91NjQKKwordWludDMyeDRfdCB2cmVpbnRlcnByZXRxX3UzMl9zNjQgKGludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91MzJfczY0CisKK3VpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfZjMyIChmbG9hdDMyeDRfdCB0KTsKKyNkZWZpbmUgIHZyZWludGVycHJldHFfdTMyX2YzMih0KSBfTTEyOGkodCkKKwordWludDMyeDRfdCB2cmVpbnRlcnByZXRxX3UzMl9wMTYgKHBvbHkxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTMyX3AxNgorCit1aW50MzJ4NF90IHZyZWludGVycHJldHFfdTMyX3A4IChwb2x5OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3UzMl9wOAorCisjZW5kaWYgLyogTkVPTjJTU0VfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYXZ4MmludHJpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYXZ4MmludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MzdiZjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9hdngyaW50cmluLmgKQEAgLTAsMCArMSwxODczIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfSU1NSU5UUklOX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8YXZ4MmludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8aW1taW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFN1bSBhYnNvbHV0ZSA4LWJpdCBpbnRlZ2VyIGRpZmZlcmVuY2Ugb2YgYWRqYWNlbnQgZ3JvdXBzIG9mIDQKKyAgIGJ5dGUgaW50ZWdlcnMgaW4gdGhlIGZpcnN0IDIgb3BlcmFuZHMuICBTdGFydGluZyBvZmZzZXRzIHdpdGhpbgorICAgb3BlcmFuZHMgYXJlIGRldGVybWluZWQgYnkgdGhlIDNyZCBtYXNrIG9wZXJhbmQuICAqLworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tcHNhZGJ3X2VwdTggKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9tcHNhZGJ3MjU2ICgoX192MzJxaSlfX1gsCisJCQkJCSAgICAgIChfX3YzMnFpKV9fWSwgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9tcHNhZGJ3X2VwdTgoWCwgWSwgTSkJCQkJCVwKKyAgKChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9tcHNhZGJ3MjU2ICgoX192MzJxaSkoX19tMjU2aSkoWCksCQlcCisJCQkJCShfX3YzMnFpKShfX20yNTZpKShZKSwgKGludCkoTSkpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYWJzX2VwaTggKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFic2IyNTYgKChfX3YzMnFpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYWJzX2VwaTE2IChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhYnN3MjU2ICgoX192MTZoaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Fic19lcGkzMiAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYWJzZDI1NiAoKF9fdjhzaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3BhY2tzX2VwaTMyIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYWNrc3NkdzI1NiAoKF9fdjhzaSlfX0EsIChfX3Y4c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wYWNrc19lcGkxNiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFja3Nzd2IyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wYWNrdXNfZXBpMzIgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhY2t1c2R3MjU2ICgoX192OHNpKV9fQSwgKF9fdjhzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3BhY2t1c19lcGkxNiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFja3Vzd2IyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hZGRfZXBpOCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFkZGIyNTYgKChfX3YzMnFpKV9fQSwgKF9fdjMycWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hZGRfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhZGR3MjU2ICgoX192MTZoaSlfX0EsIChfX3YxNmhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYWRkX2VwaTMyIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYWRkZDI1NiAoKF9fdjhzaSlfX0EsIChfX3Y4c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hZGRfZXBpNjQgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhZGRxMjU2ICgoX192NGRpKV9fQSwgKF9fdjRkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FkZHNfZXBpOCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFkZHNiMjU2ICgoX192MzJxaSlfX0EsIChfX3YzMnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYWRkc19lcGkxNiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFkZHN3MjU2ICgoX192MTZoaSlfX0EsIChfX3YxNmhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYWRkc19lcHU4IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYWRkdXNiMjU2ICgoX192MzJxaSlfX0EsIChfX3YzMnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYWRkc19lcHUxNiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFkZHVzdzI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FsaWducl9lcGk4IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IsIGNvbnN0IGludCBfX04pCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGFsaWducjI1NiAoKF9fdjRkaSlfX0EsCisJCQkJCSAgICAgIChfX3Y0ZGkpX19CLAorCQkJCQkgICAgICBfX04gKiA4KTsKK30KKyNlbHNlCisvKiBJbiB0aGF0IGNhc2UgKF9fTio4KSB3aWxsIGJlIGluIHZyZWcsIGFuZCBpbnNuIHdpbGwgbm90IGJlIG1hdGNoZWQuICovCisvKiBVc2UgZGVmaW5lIGluc3RlYWQgKi8KKyNkZWZpbmUgX21tMjU2X2FsaWducl9lcGk4KEEsIEIsIE4pCQkJCSAgIFwKKyAgKChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYWxpZ25yMjU2ICgoX192NGRpKShfX20yNTZpKShBKSwJICAgXAorCQkJCQkoX192NGRpKShfX20yNTZpKShCKSwJICAgXAorCQkJCQkoaW50KShOKSAqIDgpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYW5kX3NpMjU2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfYW5kc2kyNTYgKChfX3Y0ZGkpX19BLCAoX192NGRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYW5kbm90X3NpMjU2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfYW5kbm90c2kyNTYgKChfX3Y0ZGkpX19BLCAoX192NGRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYXZnX2VwdTggKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhdmdiMjU2ICgoX192MzJxaSlfX0EsIChfX3YzMnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYXZnX2VwdTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYXZndzI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2JsZW5kdl9lcGk4IChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1ksIF9fbTI1NmkgX19NKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BibGVuZHZiMjU2ICgoX192MzJxaSlfX1gsCisJCQkJCSAgICAgICAoX192MzJxaSlfX1ksCisJCQkJCSAgICAgICAoX192MzJxaSlfX00pOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2JsZW5kX2VwaTE2IChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGJsZW5kdzI1NiAoKF9fdjE2aGkpX19YLAorCQkJCQkgICAgICAoX192MTZoaSlfX1ksCisJCQkJCSAgICAgICBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X2JsZW5kX2VwaTE2KFgsIFksIE0pCQkJCQlcCisgICgoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGJsZW5kdzI1NiAoKF9fdjE2aGkpKF9fbTI1NmkpKFgpLAkJXAorCQkJCQkoX192MTZoaSkoX19tMjU2aSkoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2NtcGVxX2VwaTggKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BjbXBlcWIyNTYgKChfX3YzMnFpKV9fQSwgKF9fdjMycWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jbXBlcV9lcGkxNiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGNtcGVxdzI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2NtcGVxX2VwaTMyIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wY21wZXFkMjU2ICgoX192OHNpKV9fQSwgKF9fdjhzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2NtcGVxX2VwaTY0IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wY21wZXFxMjU2ICgoX192NGRpKV9fQSwgKF9fdjRkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2NtcGd0X2VwaTggKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BjbXBndGIyNTYgKChfX3YzMnFpKV9fQSwKKwkJCQkJICAgICAoX192MzJxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2NtcGd0X2VwaTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wY21wZ3R3MjU2ICgoX192MTZoaSlfX0EsCisJCQkJCSAgICAgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jbXBndF9lcGkzMiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGNtcGd0ZDI1NiAoKF9fdjhzaSlfX0EsCisJCQkJCSAgICAgKF9fdjhzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2NtcGd0X2VwaTY0IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wY21wZ3RxMjU2ICgoX192NGRpKV9fQSwgKF9fdjRkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2hhZGRfZXBpMTYgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9waGFkZHcyNTYgKChfX3YxNmhpKV9fWCwKKwkJCQkJICAgICAoX192MTZoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2hhZGRfZXBpMzIgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9waGFkZGQyNTYgKChfX3Y4c2kpX19YLCAoX192OHNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaGFkZHNfZXBpMTYgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9waGFkZHN3MjU2ICgoX192MTZoaSlfX1gsCisJCQkJCSAgICAgIChfX3YxNmhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaHN1Yl9lcGkxNiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Boc3VidzI1NiAoKF9fdjE2aGkpX19YLAorCQkJCQkgICAgIChfX3YxNmhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaHN1Yl9lcGkzMiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Boc3ViZDI1NiAoKF9fdjhzaSlfX1gsIChfX3Y4c2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9oc3Vic19lcGkxNiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Boc3Vic3cyNTYgKChfX3YxNmhpKV9fWCwKKwkJCQkJICAgICAgKF9fdjE2aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYWRkdWJzX2VwaTE2IChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1hZGR1YnN3MjU2ICgoX192MzJxaSlfX1gsCisJCQkJCQkoX192MzJxaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hZGRfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtYWRkd2QyNTYgKChfX3YxNmhpKV9fQSwKKwkJCQkJICAgICAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21heF9lcGk4IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbWF4c2IyNTYgKChfX3YzMnFpKV9fQSwgKF9fdjMycWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXhfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtYXhzdzI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21heF9lcGkzMiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1heHNkMjU2ICgoX192OHNpKV9fQSwgKF9fdjhzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21heF9lcHU4IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbWF4dWIyNTYgKChfX3YzMnFpKV9fQSwgKF9fdjMycWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXhfZXB1MTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtYXh1dzI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21heF9lcHUzMiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1heHVkMjU2ICgoX192OHNpKV9fQSwgKF9fdjhzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21pbl9lcGk4IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbWluc2IyNTYgKChfX3YzMnFpKV9fQSwgKF9fdjMycWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9taW5fZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtaW5zdzI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21pbl9lcGkzMiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1pbnNkMjU2ICgoX192OHNpKV9fQSwgKF9fdjhzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21pbl9lcHU4IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbWludWIyNTYgKChfX3YzMnFpKV9fQSwgKF9fdjMycWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9taW5fZXB1MTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtaW51dzI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21pbl9lcHUzMiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1pbnVkMjU2ICgoX192OHNpKV9fQSwgKF9fdjhzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbW92ZW1hc2tfZXBpOCAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wbW92bXNrYjI1NiAoKF9fdjMycWkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcGk4X2VwaTE2IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hidzI1NiAoKF9fdjE2cWkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcGk4X2VwaTMyIChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hiZDI1NiAoKF9fdjE2cWkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcGk4X2VwaTY0IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hicTI1NiAoKF9fdjE2cWkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcGkxNl9lcGkzMiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnN4d2QyNTYgKChfX3Y4aGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcGkxNl9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnN4d3EyNTYgKChfX3Y4aGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcGkzMl9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnN4ZHEyNTYgKChfX3Y0c2kpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcHU4X2VwaTE2IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92enhidzI1NiAoKF9fdjE2cWkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcHU4X2VwaTMyIChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92enhiZDI1NiAoKF9fdjE2cWkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcHU4X2VwaTY0IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbW92enhicTI1NiAoKF9fdjE2cWkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcHUxNl9lcGkzMiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnp4d2QyNTYgKChfX3Y4aGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcHUxNl9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnp4d3EyNTYgKChfX3Y4aGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcHUzMl9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnp4ZHEyNTYgKChfX3Y0c2kpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tdWxfZXBpMzIgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wbXVsZHEyNTYgKChfX3Y4c2kpX19YLCAoX192OHNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXVsaHJzX2VwaTE2IChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG11bGhyc3cyNTYgKChfX3YxNmhpKV9fWCwKKwkJCQkJICAgICAgIChfX3YxNmhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXVsaGlfZXB1MTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtdWxodXcyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tdWxoaV9lcGkxNiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG11bGh3MjU2ICgoX192MTZoaSlfX0EsIChfX3YxNmhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXVsbG9fZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtdWxsdzI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X211bGxvX2VwaTMyIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbXVsbGQyNTYgKChfX3Y4c2kpX19BLCAoX192OHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXVsX2VwdTMyIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbXVsdWRxMjU2ICgoX192OHNpKV9fQSwgKF9fdjhzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X29yX3NpMjU2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wb3IyNTYgKChfX3Y0ZGkpX19BLCAoX192NGRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2FkX2VwdTggKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzYWRidzI1NiAoKF9fdjMycWkpX19BLCAoX192MzJxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NodWZmbGVfZXBpOCAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzaHVmYjI1NiAoKF9fdjMycWkpX19YLAorCQkJCQkgICAgIChfX3YzMnFpKV9fWSk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2h1ZmZsZV9lcGkzMiAoX19tMjU2aSBfX0EsIGNvbnN0IGludCBfX21hc2spCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2h1ZmQyNTYgKChfX3Y4c2kpX19BLCBfX21hc2spOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NodWZmbGVoaV9lcGkxNiAoX19tMjU2aSBfX0EsIGNvbnN0IGludCBfX21hc2spCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2h1Zmh3MjU2ICgoX192MTZoaSlfX0EsIF9fbWFzayk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2h1ZmZsZWxvX2VwaTE2IChfX20yNTZpIF9fQSwgY29uc3QgaW50IF9fbWFzaykKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzaHVmbHcyNTYgKChfX3YxNmhpKV9fQSwgX19tYXNrKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9zaHVmZmxlX2VwaTMyKEEsIE4pIFwKKyAgKChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzaHVmZDI1NiAoKF9fdjhzaSkoX19tMjU2aSkoQSksIChpbnQpKE4pKSkKKyNkZWZpbmUgX21tMjU2X3NodWZmbGVoaV9lcGkxNihBLCBOKSBcCisgICgoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2h1Zmh3MjU2ICgoX192MTZoaSkoX19tMjU2aSkoQSksIChpbnQpKE4pKSkKKyNkZWZpbmUgX21tMjU2X3NodWZmbGVsb19lcGkxNihBLCBOKSBcCisgICgoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2h1Zmx3MjU2ICgoX192MTZoaSkoX19tMjU2aSkoQSksIChpbnQpKE4pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NpZ25fZXBpOCAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzaWduYjI1NiAoKF9fdjMycWkpX19YLCAoX192MzJxaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NpZ25fZXBpMTYgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc2lnbncyNTYgKChfX3YxNmhpKV9fWCwgKF9fdjE2aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zaWduX2VwaTMyIChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNpZ25kMjU2ICgoX192OHNpKV9fWCwgKF9fdjhzaSlfX1kpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NsbGlfc2kyNTYgKF9fbTI1NmkgX19BLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNsbGRxaTI1NiAoX19BLCBfX04gKiA4KTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9zbGxpX3NpMjU2KEEsIE4pIFwKKyAgKChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzbGxkcWkyNTYgKChfX20yNTZpKShBKSwgKGludCkoTikgKiA4KSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NsbGlfZXBpMTYgKF9fbTI1NmkgX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNsbHdpMjU2ICgoX192MTZoaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2xsX2VwaTE2IChfX20yNTZpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2xsdzI1NigoX192MTZoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zbGxpX2VwaTMyIChfX20yNTZpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzbGxkaTI1NiAoKF9fdjhzaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2xsX2VwaTMyIChfX20yNTZpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2xsZDI1NigoX192OHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NsbGlfZXBpNjQgKF9fbTI1NmkgX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNsbHFpMjU2ICgoX192NGRpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zbGxfZXBpNjQgKF9fbTI1NmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzbGxxMjU2KChfX3Y0ZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3JhaV9lcGkxNiAoX19tMjU2aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3Jhd2kyNTYgKChfX3YxNmhpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zcmFfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzcmF3MjU2ICgoX192MTZoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zcmFpX2VwaTMyIChfX20yNTZpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzcmFkaTI1NiAoKF9fdjhzaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3JhX2VwaTMyIChfX20yNTZpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3JhZDI1NiAoKF9fdjhzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zcmxpX3NpMjU2IChfX20yNTZpIF9fQSwgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzcmxkcWkyNTYgKF9fQSwgX19OICogOCk7Cit9CisjZWxzZQorI2RlZmluZSBfbW0yNTZfc3JsaV9zaTI1NihBLCBOKSBcCisgICgoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3JsZHFpMjU2ICgoX19tMjU2aSkoQSksIChpbnQpKE4pICogOCkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zcmxpX2VwaTE2IChfX20yNTZpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Bzcmx3aTI1NiAoKF9fdjE2aGkpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NybF9lcGkxNiAoX19tMjU2aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNybHcyNTYoKF9fdjE2aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3JsaV9lcGkzMiAoX19tMjU2aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3JsZGkyNTYgKChfX3Y4c2kpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NybF9lcGkzMiAoX19tMjU2aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNybGQyNTYoKF9fdjhzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zcmxpX2VwaTY0IChfX20yNTZpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzcmxxaTI1NiAoKF9fdjRkaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3JsX2VwaTY0IChfX20yNTZpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3JscTI1NigoX192NGRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N1Yl9lcGk4IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3ViYjI1NiAoKF9fdjMycWkpX19BLCAoX192MzJxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N1Yl9lcGkxNiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHN1YncyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdWJfZXBpMzIgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzdWJkMjU2ICgoX192OHNpKV9fQSwgKF9fdjhzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N1Yl9lcGk2NCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHN1YnEyNTYgKChfX3Y0ZGkpX19BLCAoX192NGRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3Vic19lcGk4IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3Vic2IyNTYgKChfX3YzMnFpKV9fQSwgKF9fdjMycWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdWJzX2VwaTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3Vic3cyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdWJzX2VwdTggKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzdWJ1c2IyNTYgKChfX3YzMnFpKV9fQSwgKF9fdjMycWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdWJzX2VwdTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3VidXN3MjU2ICgoX192MTZoaSlfX0EsIChfX3YxNmhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdW5wYWNraGlfZXBpOCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHVucGNraGJ3MjU2ICgoX192MzJxaSlfX0EsIChfX3YzMnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdW5wYWNraGlfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2h3ZDI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3VucGFja2hpX2VwaTMyIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wdW5wY2toZHEyNTYgKChfX3Y4c2kpX19BLCAoX192OHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdW5wYWNraGlfZXBpNjQgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2hxZHEyNTYgKChfX3Y0ZGkpX19BLCAoX192NGRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdW5wYWNrbG9fZXBpOCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHVucGNrbGJ3MjU2ICgoX192MzJxaSlfX0EsIChfX3YzMnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdW5wYWNrbG9fZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2x3ZDI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3VucGFja2xvX2VwaTMyIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wdW5wY2tsZHEyNTYgKChfX3Y4c2kpX19BLCAoX192OHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdW5wYWNrbG9fZXBpNjQgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2xxZHEyNTYgKChfX3Y0ZGkpX19BLCAoX192NGRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfeG9yX3NpMjU2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9weG9yMjU2ICgoX192NGRpKV9fQSwgKF9fdjRkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N0cmVhbV9sb2FkX3NpMjU2IChfX20yNTZpIGNvbnN0ICpfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfbW92bnRkcWEyNTYgKChfX3Y0ZGkgKikgX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Jyb2FkY2FzdHNzX3BzIChfX20xMjggX19YKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmJyb2FkY2FzdHNzX3BzICgoX192NHNmKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9icm9hZGNhc3Rzc19wcyAoX19tMTI4IF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3Zicm9hZGNhc3Rzc19wczI1NiAoKF9fdjRzZilfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Jyb2FkY2FzdHNkX3BkIChfX20xMjhkIF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92YnJvYWRjYXN0c2RfcGQyNTYgKChfX3YyZGYpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9icm9hZGNhc3RzaTEyOF9zaTI1NiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdmJyb2FkY2FzdHNpMjU2ICgoX192MmRpKV9fWCk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYmxlbmRfZXBpMzIgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYmxlbmRkMTI4ICgoX192NHNpKV9fWCwKKwkJCQkJICAgICAgKF9fdjRzaSlfX1ksCisJCQkJCSAgICAgIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fYmxlbmRfZXBpMzIoWCwgWSwgTSkJCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYmxlbmRkMTI4ICgoX192NHNpKShfX20xMjhpKShYKSwJCVwKKwkJCQkJKF9fdjRzaSkoX19tMTI4aSkoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2JsZW5kX2VwaTMyIChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGJsZW5kZDI1NiAoKF9fdjhzaSlfX1gsCisJCQkJCSAgICAgIChfX3Y4c2kpX19ZLAorCQkJCQkgICAgICBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X2JsZW5kX2VwaTMyKFgsIFksIE0pCQkJCQlcCisgICgoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGJsZW5kZDI1NiAoKF9fdjhzaSkoX19tMjU2aSkoWCksCQlcCisJCQkJCShfX3Y4c2kpKF9fbTI1NmkpKFkpLCAoaW50KShNKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9icm9hZGNhc3RiX2VwaTggKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Bicm9hZGNhc3RiMjU2ICgoX192MTZxaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Jyb2FkY2FzdHdfZXBpMTYgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Bicm9hZGNhc3R3MjU2ICgoX192OGhpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYnJvYWRjYXN0ZF9lcGkzMiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGJyb2FkY2FzdGQyNTYgKChfX3Y0c2kpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9icm9hZGNhc3RxX2VwaTY0IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0cTI1NiAoKF9fdjJkaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Jyb2FkY2FzdGJfZXBpOCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGJyb2FkY2FzdGIxMjggKChfX3YxNnFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYnJvYWRjYXN0d19lcGkxNiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGJyb2FkY2FzdHcxMjggKChfX3Y4aGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9icm9hZGNhc3RkX2VwaTMyIChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0ZDEyOCAoKF9fdjRzaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Jyb2FkY2FzdHFfZXBpNjQgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Bicm9hZGNhc3RxMTI4ICgoX192MmRpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGVybXV0ZXZhcjh4MzJfZXBpMzIgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wZXJtdmFyc2kyNTYgKChfX3Y4c2kpX19YLCAoX192OHNpKV9fWSk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20yNTZkCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGVybXV0ZTR4NjRfcGQgKF9fbTI1NmQgX19YLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3Blcm1kZjI1NiAoKF9fdjRkZilfX1gsIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW0yNTZfcGVybXV0ZTR4NjRfcGQoWCwgTSkJCQkgICAgICAgXAorICAoKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3Blcm1kZjI1NiAoKF9fdjRkZikoX19tMjU2ZCkoWCksIChpbnQpKE0pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMjU2CitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGVybXV0ZXZhcjh4MzJfcHMgKF9fbTI1NiBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfcGVybXZhcnNmMjU2ICgoX192OHNmKV9fWCwgKF9fdjhzaSlfX1kpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGU0eDY0X2VwaTY0IChfX20yNTZpIF9fWCwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wZXJtZGkyNTYgKChfX3Y0ZGkpX19YLCBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X3Blcm11dGU0eDY0X2VwaTY0KFgsIE0pCQkJICAgICAgIFwKKyAgKChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wZXJtZGkyNTYgKChfX3Y0ZGkpKF9fbTI1NmkpKFgpLCAoaW50KShNKSkpCisjZW5kaWYKKworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Blcm10aTI1NiAoKF9fdjRkaSlfX1gsIChfX3Y0ZGkpX19ZLCBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihYLCBZLCBNKQkJCQlcCisgICgoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGVybXRpMjU2ICgoX192NGRpKShfX20yNTZpKShYKSwgKF9fdjRkaSkoX19tMjU2aSkoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2V4dHJhY3RpMTI4X3NpMjU2IChfX20yNTZpIF9fWCwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9leHRyYWN0MTI4aTI1NiAoKF9fdjRkaSlfX1gsIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW0yNTZfZXh0cmFjdGkxMjhfc2kyNTYoWCwgTSkJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2V4dHJhY3QxMjhpMjU2ICgoX192NGRpKShfX20yNTZpKShYKSwgKGludCkoTSkpKQorI2VuZGlmCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaW5zZXJ0aTEyOF9zaTI1NiAoX19tMjU2aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2luc2VydDEyOGkyNTYgKChfX3Y0ZGkpX19YLCAoX192MmRpKV9fWSwgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9pbnNlcnRpMTI4X3NpMjU2KFgsIFksIE0pCQkJIFwKKyAgKChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9pbnNlcnQxMjhpMjU2ICgoX192NGRpKShfX20yNTZpKShYKSwgXAorCQkJCQkgICAoX192MmRpKShfX20xMjhpKShZKSwgXAorCQkJCQkgICAoaW50KShNKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrbG9hZF9lcGkzMiAoaW50IGNvbnN0ICpfX1gsIF9fbTI1NmkgX19NICkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9tYXNrbG9hZGQyNTYgKChjb25zdCBfX3Y4c2kgKilfX1gsCisJCQkJCQkoX192OHNpKV9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWFza2xvYWRfZXBpNjQgKGxvbmcgbG9uZyBjb25zdCAqX19YLCBfX20yNTZpIF9fTSApCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfbWFza2xvYWRxMjU2ICgoY29uc3QgX192NGRpICopX19YLAorCQkJCQkJKF9fdjRkaSlfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2tsb2FkX2VwaTMyIChpbnQgY29uc3QgKl9fWCwgX19tMTI4aSBfX00gKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX21hc2tsb2FkZCAoKGNvbnN0IF9fdjRzaSAqKV9fWCwKKwkJCQkJICAgICAoX192NHNpKV9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza2xvYWRfZXBpNjQgKGxvbmcgbG9uZyBjb25zdCAqX19YLCBfX20xMjhpIF9fTSApCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbWFza2xvYWRxICgoY29uc3QgX192MmRpICopX19YLAorCQkJCQkgICAgIChfX3YyZGkpX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrc3RvcmVfZXBpMzIgKGludCAqX19YLCBfX20yNTZpIF9fTSwgX19tMjU2aSBfX1kgKQoreworICBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVkMjU2ICgoX192OHNpICopX19YLCAoX192OHNpKV9fTSwgKF9fdjhzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tzdG9yZV9lcGk2NCAobG9uZyBsb25nICpfX1gsIF9fbTI1NmkgX19NLCBfX20yNTZpIF9fWSApCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXEyNTYgKChfX3Y0ZGkgKilfX1gsIChfX3Y0ZGkpX19NLCAoX192NGRpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza3N0b3JlX2VwaTMyIChpbnQgKl9fWCwgX19tMTI4aSBfX00sIF9fbTEyOGkgX19ZICkKK3sKKyAgX19idWlsdGluX2lhMzJfbWFza3N0b3JlZCAoKF9fdjRzaSAqKV9fWCwgKF9fdjRzaSlfX00sIChfX3Y0c2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXNrc3RvcmVfZXBpNjQgKGxvbmcgbG9uZyAqX19YLCBfX20xMjhpIF9fTSwgX19tMTI4aSBfX1kgKQoreworICBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVxICgoIF9fdjJkaSAqKV9fWCwgKF9fdjJkaSlfX00sIChfX3YyZGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zbGx2X2VwaTMyIChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNsbHY4c2kgKChfX3Y4c2kpX19YLCAoX192OHNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsdl9lcGkzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzbGx2NHNpICgoX192NHNpKV9fWCwgKF9fdjRzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NsbHZfZXBpNjQgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc2xsdjRkaSAoKF9fdjRkaSlfX1gsIChfX3Y0ZGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGx2X2VwaTY0IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNsbHYyZGkgKChfX3YyZGkpX19YLCAoX192MmRpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3Jhdl9lcGkzMiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzcmF2OHNpICgoX192OHNpKV9fWCwgKF9fdjhzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NyYXZfZXBpMzIgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc3JhdjRzaSAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zcmx2X2VwaTMyIChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNybHY4c2kgKChfX3Y4c2kpX19YLCAoX192OHNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3Jsdl9lcGkzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Bzcmx2NHNpICgoX192NHNpKV9fWCwgKF9fdjRzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NybHZfZXBpNjQgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JsdjRkaSAoKF9fdjRkaSlfX1gsIChfX3Y0ZGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmx2X2VwaTY0IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNybHYyZGkgKChfX3YyZGkpX19YLCAoX192MmRpKV9fWSk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhkCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faTMyZ2F0aGVyX3BkIChkb3VibGUgY29uc3QgKmJhc2UsIF9fbTEyOGkgaW5kZXgsIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgX192MmRmIHNyYyA9IF9tbV9zZXR6ZXJvX3BkICgpOworICBfX3YyZGYgbWFzayA9IF9tbV9jbXBlcV9wZCAoc3JjLCBzcmMpOworCisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2MmRmIChzcmMsCisJCQkJCQliYXNlLAorCQkJCQkJKF9fdjRzaSlpbmRleCwKKwkJCQkJCW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza19pMzJnYXRoZXJfcGQgKF9fbTEyOGQgc3JjLCBkb3VibGUgY29uc3QgKmJhc2UsIF9fbTEyOGkgaW5kZXgsCisJCSAgICAgICBfX20xMjhkIG1hc2ssIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXYyZGYgKChfX3YyZGYpc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3Y0c2kpaW5kZXgsCisJCQkJCQkoX192MmRmKW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaTMyZ2F0aGVyX3BkIChkb3VibGUgY29uc3QgKmJhc2UsIF9fbTEyOGkgaW5kZXgsIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgX192NGRmIHNyYyA9IF9tbTI1Nl9zZXR6ZXJvX3BkICgpOworICBfX3Y0ZGYgbWFzayA9IF9tbTI1Nl9jbXBfcGQgKHNyYywgc3JjLCBfQ01QX0VRX09RKTsKKworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjRkZiAoc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3Y0c2kpaW5kZXgsCisJCQkJCQltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tfaTMyZ2F0aGVyX3BkIChfX20yNTZkIHNyYywgZG91YmxlIGNvbnN0ICpiYXNlLAorCQkJICBfX20xMjhpIGluZGV4LCBfX20yNTZkIG1hc2ssIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY0ZGYgKChfX3Y0ZGYpc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3Y0c2kpaW5kZXgsCisJCQkJCQkoX192NGRmKW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faTY0Z2F0aGVyX3BkIChkb3VibGUgY29uc3QgKmJhc2UsIF9fbTEyOGkgaW5kZXgsIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgX192MmRmIHNyYyA9IF9tbV9zZXR6ZXJvX3BkICgpOworICBfX3YyZGYgbWFzayA9IF9tbV9jbXBlcV9wZCAoc3JjLCBzcmMpOworCisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MmRmIChzcmMsCisJCQkJCQliYXNlLAorCQkJCQkJKF9fdjJkaSlpbmRleCwKKwkJCQkJCW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza19pNjRnYXRoZXJfcGQgKF9fbTEyOGQgc3JjLCBkb3VibGUgY29uc3QgKmJhc2UsIF9fbTEyOGkgaW5kZXgsCisJCSAgICAgICBfX20xMjhkIG1hc2ssIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXYyZGYgKChfX3YyZGYpc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3YyZGkpaW5kZXgsCisJCQkJCQkoX192MmRmKW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaTY0Z2F0aGVyX3BkIChkb3VibGUgY29uc3QgKmJhc2UsIF9fbTI1NmkgaW5kZXgsIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgX192NGRmIHNyYyA9IF9tbTI1Nl9zZXR6ZXJvX3BkICgpOworICBfX3Y0ZGYgbWFzayA9IF9tbTI1Nl9jbXBfcGQgKHNyYywgc3JjLCBfQ01QX0VRX09RKTsKKworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjRkZiAoc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3Y0ZGkpaW5kZXgsCisJCQkJCQltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tfaTY0Z2F0aGVyX3BkIChfX20yNTZkIHNyYywgZG91YmxlIGNvbnN0ICpiYXNlLAorCQkJICBfX20yNTZpIGluZGV4LCBfX20yNTZkIG1hc2ssIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0ZGYgKChfX3Y0ZGYpc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3Y0ZGkpaW5kZXgsCisJCQkJCQkoX192NGRmKW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9pMzJnYXRoZXJfcHMgKGZsb2F0IGNvbnN0ICpiYXNlLCBfX20xMjhpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjRzZiBzcmMgPSBfbW1fc2V0emVyb19wcyAoKTsKKyAgX192NHNmIG1hc2sgPSBfbW1fY21wZXFfcHMgKHNyYywgc3JjKTsKKworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2NHNmIChzcmMsCisJCQkJCSAgICAgICBiYXNlLAorCQkJCQkgICAgICAgKF9fdjRzaSlpbmRleCwKKwkJCQkJICAgICAgIG1hc2ssCisJCQkJCSAgICAgICBzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXNrX2kzMmdhdGhlcl9wcyAoX19tMTI4IHNyYywgZmxvYXQgY29uc3QgKmJhc2UsIF9fbTEyOGkgaW5kZXgsCisJCSAgICAgICBfX20xMjggbWFzaywgY29uc3QgaW50IHNjYWxlKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2NHNmICgoX192NHNmKXNyYywKKwkJCQkJICAgICAgIGJhc2UsCisJCQkJCSAgICAgICAoX192NHNpKWluZGV4LAorCQkJCQkgICAgICAgKF9fdjRzZiltYXNrLAorCQkJCQkgICAgICAgc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2CitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaTMyZ2F0aGVyX3BzIChmbG9hdCBjb25zdCAqYmFzZSwgX19tMjU2aSBpbmRleCwgY29uc3QgaW50IHNjYWxlKQoreworICBfX3Y4c2Ygc3JjID0gX21tMjU2X3NldHplcm9fcHMgKCk7CisgIF9fdjhzZiBtYXNrID0gX21tMjU2X2NtcF9wcyAoc3JjLCBzcmMsIF9DTVBfRVFfT1EpOworCisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY4c2YgKHNyYywKKwkJCQkJICAgICAgIGJhc2UsCisJCQkJCSAgICAgICAoX192OHNpKWluZGV4LAorCQkJCQkgICAgICAgbWFzaywKKwkJCQkJICAgICAgIHNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NgorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tfaTMyZ2F0aGVyX3BzIChfX20yNTYgc3JjLCBmbG9hdCBjb25zdCAqYmFzZSwKKwkJCSAgX19tMjU2aSBpbmRleCwgX19tMjU2IG1hc2ssIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjhzZiAoKF9fdjhzZilzcmMsCisJCQkJCSAgICAgICBiYXNlLAorCQkJCQkgICAgICAgKF9fdjhzaSlpbmRleCwKKwkJCQkJICAgICAgIChfX3Y4c2YpbWFzaywKKwkJCQkJICAgICAgIHNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2k2NGdhdGhlcl9wcyAoZmxvYXQgY29uc3QgKmJhc2UsIF9fbTEyOGkgaW5kZXgsIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgX192NHNmIHNyYyA9IF9tbV9zZXR6ZXJvX3BzICgpOworICBfX3Y0c2YgbWFzayA9IF9tbV9jbXBlcV9wcyAoc3JjLCBzcmMpOworCisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0c2YgKHNyYywKKwkJCQkJICAgICAgIGJhc2UsCisJCQkJCSAgICAgICAoX192MmRpKWluZGV4LAorCQkJCQkgICAgICAgbWFzaywKKwkJCQkJICAgICAgIHNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2tfaTY0Z2F0aGVyX3BzIChfX20xMjggc3JjLCBmbG9hdCBjb25zdCAqYmFzZSwgX19tMTI4aSBpbmRleCwKKwkJICAgICAgIF9fbTEyOCBtYXNrLCBjb25zdCBpbnQgc2NhbGUpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0c2YgKChfX3Y0c2Ypc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3YyZGkpaW5kZXgsCisJCQkJCQkoX192NHNmKW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9pNjRnYXRoZXJfcHMgKGZsb2F0IGNvbnN0ICpiYXNlLCBfX20yNTZpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjRzZiBzcmMgPSBfbW1fc2V0emVyb19wcyAoKTsKKyAgX192NHNmIG1hc2sgPSBfbW1fY21wZXFfcHMgKHNyYywgc3JjKTsKKworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NHNmMjU2IChzcmMsCisJCQkJCQkgIGJhc2UsCisJCQkJCQkgIChfX3Y0ZGkpaW5kZXgsCisJCQkJCQkgIG1hc2ssCisJCQkJCQkgIHNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tfaTY0Z2F0aGVyX3BzIChfX20xMjggc3JjLCBmbG9hdCBjb25zdCAqYmFzZSwKKwkJCSAgX19tMjU2aSBpbmRleCwgX19tMTI4IG1hc2ssIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjRzZjI1NiAoKF9fdjRzZilzcmMsCisJCQkJCQkgIGJhc2UsCisJCQkJCQkgIChfX3Y0ZGkpaW5kZXgsCisJCQkJCQkgIChfX3Y0c2YpbWFzaywKKwkJCQkJCSAgc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2kzMmdhdGhlcl9lcGk2NCAobG9uZyBsb25nIGludCBjb25zdCAqYmFzZSwKKwkJICAgICBfX20xMjhpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjJkaSBzcmMgPSBfX2V4dGVuc2lvbl9fIChfX3YyZGkpeyAwLCAwIH07CisgIF9fdjJkaSBtYXNrID0gX19leHRlbnNpb25fXyAoX192MmRpKXsgfjAsIH4wIH07CisKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXYyZGkgKHNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192NHNpKWluZGV4LAorCQkJCQkJbWFzaywKKwkJCQkJCXNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXNrX2kzMmdhdGhlcl9lcGk2NCAoX19tMTI4aSBzcmMsIGxvbmcgbG9uZyBpbnQgY29uc3QgKmJhc2UsCisJCQkgIF9fbTEyOGkgaW5kZXgsIF9fbTEyOGkgbWFzaywgY29uc3QgaW50IHNjYWxlKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjJkaSAoKF9fdjJkaSlzcmMsCisJCQkJCQliYXNlLAorCQkJCQkJKF9fdjRzaSlpbmRleCwKKwkJCQkJCShfX3YyZGkpbWFzaywKKwkJCQkJCXNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9pMzJnYXRoZXJfZXBpNjQgKGxvbmcgbG9uZyBpbnQgY29uc3QgKmJhc2UsCisJCQlfX20xMjhpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjRkaSBzcmMgPSBfX2V4dGVuc2lvbl9fIChfX3Y0ZGkpeyAwLCAwLCAwLCAwIH07CisgIF9fdjRkaSBtYXNrID0gX19leHRlbnNpb25fXyAoX192NGRpKXsgfjAsIH4wLCB+MCwgfjAgfTsKKworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjRkaSAoc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3Y0c2kpaW5kZXgsCisJCQkJCQltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tfaTMyZ2F0aGVyX2VwaTY0IChfX20yNTZpIHNyYywgbG9uZyBsb25nIGludCBjb25zdCAqYmFzZSwKKwkJCSAgICAgX19tMTI4aSBpbmRleCwgX19tMjU2aSBtYXNrLCBjb25zdCBpbnQgc2NhbGUpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2NGRpICgoX192NGRpKXNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192NHNpKWluZGV4LAorCQkJCQkJKF9fdjRkaSltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2k2NGdhdGhlcl9lcGk2NCAobG9uZyBsb25nIGludCBjb25zdCAqYmFzZSwKKwkJICAgICBfX20xMjhpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjJkaSBzcmMgPSBfX2V4dGVuc2lvbl9fIChfX3YyZGkpeyAwLCAwIH07CisgIF9fdjJkaSBtYXNrID0gX19leHRlbnNpb25fXyAoX192MmRpKXsgfjAsIH4wIH07CisKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXYyZGkgKHNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192MmRpKWluZGV4LAorCQkJCQkJbWFzaywKKwkJCQkJCXNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXNrX2k2NGdhdGhlcl9lcGk2NCAoX19tMTI4aSBzcmMsIGxvbmcgbG9uZyBpbnQgY29uc3QgKmJhc2UsIF9fbTEyOGkgaW5kZXgsCisJCQkgIF9fbTEyOGkgbWFzaywgY29uc3QgaW50IHNjYWxlKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjJkaSAoKF9fdjJkaSlzcmMsCisJCQkJCQliYXNlLAorCQkJCQkJKF9fdjJkaSlpbmRleCwKKwkJCQkJCShfX3YyZGkpbWFzaywKKwkJCQkJCXNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9pNjRnYXRoZXJfZXBpNjQgKGxvbmcgbG9uZyBpbnQgY29uc3QgKmJhc2UsCisJCQlfX20yNTZpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjRkaSBzcmMgPSBfX2V4dGVuc2lvbl9fIChfX3Y0ZGkpeyAwLCAwLCAwLCAwIH07CisgIF9fdjRkaSBtYXNrID0gX19leHRlbnNpb25fXyAoX192NGRpKXsgfjAsIH4wLCB+MCwgfjAgfTsKKworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjRkaSAoc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3Y0ZGkpaW5kZXgsCisJCQkJCQltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tfaTY0Z2F0aGVyX2VwaTY0IChfX20yNTZpIHNyYywgbG9uZyBsb25nIGludCBjb25zdCAqYmFzZSwKKwkJCSAgICAgX19tMjU2aSBpbmRleCwgX19tMjU2aSBtYXNrLCBjb25zdCBpbnQgc2NhbGUpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NGRpICgoX192NGRpKXNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192NGRpKWluZGV4LAorCQkJCQkJKF9fdjRkaSltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2kzMmdhdGhlcl9lcGkzMiAoaW50IGNvbnN0ICpiYXNlLCBfX20xMjhpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjRzaSBzcmMgPSBfX2V4dGVuc2lvbl9fIChfX3Y0c2kpeyAwLCAwLCAwLCAwIH07CisgIF9fdjRzaSBtYXNrID0gX19leHRlbnNpb25fXyAoX192NHNpKXsgfjAsIH4wLCB+MCwgfjAgfTsKKworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjRzaSAoc3JjLAorCQkJCQkgICAgICAgYmFzZSwKKwkJCQkJICAgICAgIChfX3Y0c2kpaW5kZXgsCisJCQkJCSAgICAgICBtYXNrLAorCQkJCQkgICAgICAgc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2tfaTMyZ2F0aGVyX2VwaTMyIChfX20xMjhpIHNyYywgaW50IGNvbnN0ICpiYXNlLCBfX20xMjhpIGluZGV4LAorCQkJICBfX20xMjhpIG1hc2ssIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY0c2kgKChfX3Y0c2kpc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3Y0c2kpaW5kZXgsCisJCQkJCQkoX192NHNpKW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaTMyZ2F0aGVyX2VwaTMyIChpbnQgY29uc3QgKmJhc2UsIF9fbTI1NmkgaW5kZXgsIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgX192OHNpIHNyYyA9IF9fZXh0ZW5zaW9uX18gKF9fdjhzaSl7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgX192OHNpIG1hc2sgPSBfX2V4dGVuc2lvbl9fIChfX3Y4c2kpeyB+MCwgfjAsIH4wLCB+MCwgfjAsIH4wLCB+MCwgfjAgfTsKKworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjhzaSAoc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3Y4c2kpaW5kZXgsCisJCQkJCQltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tfaTMyZ2F0aGVyX2VwaTMyIChfX20yNTZpIHNyYywgaW50IGNvbnN0ICpiYXNlLAorCQkJICAgICBfX20yNTZpIGluZGV4LCBfX20yNTZpIG1hc2ssIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY4c2kgKChfX3Y4c2kpc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3Y4c2kpaW5kZXgsCisJCQkJCQkoX192OHNpKW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faTY0Z2F0aGVyX2VwaTMyIChpbnQgY29uc3QgKmJhc2UsIF9fbTEyOGkgaW5kZXgsIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgX192NHNpIHNyYyA9IF9fZXh0ZW5zaW9uX18gKF9fdjRzaSl7IDAsIDAsIDAsIDAgfTsKKyAgX192NHNpIG1hc2sgPSBfX2V4dGVuc2lvbl9fIChfX3Y0c2kpeyB+MCwgfjAsIH4wLCB+MCB9OworCisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NHNpIChzcmMsCisJCQkJCQliYXNlLAorCQkJCQkJKF9fdjJkaSlpbmRleCwKKwkJCQkJCW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza19pNjRnYXRoZXJfZXBpMzIgKF9fbTEyOGkgc3JjLCBpbnQgY29uc3QgKmJhc2UsIF9fbTEyOGkgaW5kZXgsCisJCQkgIF9fbTEyOGkgbWFzaywgY29uc3QgaW50IHNjYWxlKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjRzaSAoKF9fdjRzaSlzcmMsCisJCQkJCQliYXNlLAorCQkJCQkJKF9fdjJkaSlpbmRleCwKKwkJCQkJCShfX3Y0c2kpbWFzaywKKwkJCQkJCXNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9pNjRnYXRoZXJfZXBpMzIgKGludCBjb25zdCAqYmFzZSwgX19tMjU2aSBpbmRleCwgY29uc3QgaW50IHNjYWxlKQoreworICBfX3Y0c2kgc3JjID0gX19leHRlbnNpb25fXyAoX192NHNpKXsgMCwgMCwgMCwgMCB9OworICBfX3Y0c2kgbWFzayA9IF9fZXh0ZW5zaW9uX18gKF9fdjRzaSl7IH4wLCB+MCwgfjAsIH4wIH07CisKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0c2kyNTYgKHNyYywKKwkJCQkJCSAgYmFzZSwKKwkJCQkJCSAgKF9fdjRkaSlpbmRleCwKKwkJCQkJCSAgbWFzaywKKwkJCQkJCSAgc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tfaTY0Z2F0aGVyX2VwaTMyIChfX20xMjhpIHNyYywgaW50IGNvbnN0ICpiYXNlLAorCQkJICAgICBfX20yNTZpIGluZGV4LCBfX20xMjhpIG1hc2ssIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0c2kyNTYgKChfX3Y0c2kpc3JjLAorCQkJCQkJICAgYmFzZSwKKwkJCQkJCSAgIChfX3Y0ZGkpaW5kZXgsCisJCQkJCQkgICAoX192NHNpKW1hc2ssCisJCQkJCQkgICBzY2FsZSk7Cit9CisjZWxzZSAvKiBfX09QVElNSVpFX18gKi8KKyNkZWZpbmUgX21tX2kzMmdhdGhlcl9wZChCQVNFLCBJTkRFWCwgU0NBTEUpCQkJCVwKKyAgKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjJkZiAoKF9fdjJkZikgX21tX3NldHplcm9fcGQgKCksCVwKKwkJCQkJIChkb3VibGUgY29uc3QgKilCQVNFLAkJXAorCQkJCQkgKF9fdjRzaSkoX19tMTI4aSlJTkRFWCwJXAorCQkJCQkgKF9fdjJkZilfbW1fc2V0MV9wZCgJCVwKKwkJCQkJICAgKGRvdWJsZSkobG9uZyBsb25nIGludCkgLTEpLCBcCisJCQkJCSAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbV9tYXNrX2kzMmdhdGhlcl9wZChTUkMsIEJBU0UsIElOREVYLCBNQVNLLCBTQ0FMRSkJIFwKKyAgKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjJkZiAoKF9fdjJkZikoX19tMTI4ZClTUkMsCSBcCisJCQkJCSAoZG91YmxlIGNvbnN0ICopQkFTRSwJIFwKKwkJCQkJIChfX3Y0c2kpKF9fbTEyOGkpSU5ERVgsIFwKKwkJCQkJIChfX3YyZGYpKF9fbTEyOGQpTUFTSywJIFwKKwkJCQkJIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tMjU2X2kzMmdhdGhlcl9wZChCQVNFLCBJTkRFWCwgU0NBTEUpCQkJCVwKKyAgKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjRkZiAoKF9fdjRkZikgX21tMjU2X3NldHplcm9fcGQgKCksCVwKKwkJCQkJIChkb3VibGUgY29uc3QgKilCQVNFLAkJXAorCQkJCQkgKF9fdjRzaSkoX19tMTI4aSlJTkRFWCwJXAorCQkJCQkgKF9fdjRkZilfbW0yNTZfc2V0MV9wZCgJXAorCQkJCQkgICAoZG91YmxlKShsb25nIGxvbmcgaW50KSAtMSksIFwKKwkJCQkJIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tMjU2X21hc2tfaTMyZ2F0aGVyX3BkKFNSQywgQkFTRSwgSU5ERVgsIE1BU0ssIFNDQUxFKQkgXAorICAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2NGRmICgoX192NGRmKShfX20yNTZkKVNSQywJIFwKKwkJCQkJIChkb3VibGUgY29uc3QgKilCQVNFLAkgXAorCQkJCQkgKF9fdjRzaSkoX19tMTI4aSlJTkRFWCwgXAorCQkJCQkgKF9fdjRkZikoX19tMjU2ZClNQVNLLAkgXAorCQkJCQkgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW1faTY0Z2F0aGVyX3BkKEJBU0UsIElOREVYLCBTQ0FMRSkJCQkJXAorICAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MmRmICgoX192MmRmKSBfbW1fc2V0emVyb19wZCAoKSwJXAorCQkJCQkgKGRvdWJsZSBjb25zdCAqKUJBU0UsCQlcCisJCQkJCSAoX192MmRpKShfX20xMjhpKUlOREVYLAlcCisJCQkJCSAoX192MmRmKV9tbV9zZXQxX3BkKAkJXAorCQkJCQkgICAoZG91YmxlKShsb25nIGxvbmcgaW50KSAtMSksIFwKKwkJCQkJIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tX21hc2tfaTY0Z2F0aGVyX3BkKFNSQywgQkFTRSwgSU5ERVgsIE1BU0ssIFNDQUxFKQkgXAorICAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MmRmICgoX192MmRmKShfX20xMjhkKVNSQywJIFwKKwkJCQkJIChkb3VibGUgY29uc3QgKilCQVNFLAkgXAorCQkJCQkgKF9fdjJkaSkoX19tMTI4aSlJTkRFWCwgXAorCQkJCQkgKF9fdjJkZikoX19tMTI4ZClNQVNLLAkgXAorCQkJCQkgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW0yNTZfaTY0Z2F0aGVyX3BkKEJBU0UsIElOREVYLCBTQ0FMRSkJCQkJXAorICAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NGRmICgoX192NGRmKSBfbW0yNTZfc2V0emVyb19wZCAoKSwJXAorCQkJCQkgKGRvdWJsZSBjb25zdCAqKUJBU0UsCQlcCisJCQkJCSAoX192NGRpKShfX20yNTZpKUlOREVYLAlcCisJCQkJCSAoX192NGRmKV9tbTI1Nl9zZXQxX3BkKAlcCisJCQkJCSAgIChkb3VibGUpKGxvbmcgbG9uZyBpbnQpIC0xKSwgXAorCQkJCQkgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW0yNTZfbWFza19pNjRnYXRoZXJfcGQoU1JDLCBCQVNFLCBJTkRFWCwgTUFTSywgU0NBTEUpCSBcCisgIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0ZGYgKChfX3Y0ZGYpKF9fbTI1NmQpU1JDLAkgXAorCQkJCQkgKGRvdWJsZSBjb25zdCAqKUJBU0UsCSBcCisJCQkJCSAoX192NGRpKShfX20yNTZpKUlOREVYLCBcCisJCQkJCSAoX192NGRmKShfX20yNTZkKU1BU0ssCSBcCisJCQkJCSAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbV9pMzJnYXRoZXJfcHMoQkFTRSwgSU5ERVgsIFNDQUxFKQkJCQlcCisgIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjRzZiAoKF9fdjRzZikgX21tX3NldHplcm9fcHMgKCksCVwKKwkJCQkJKGZsb2F0IGNvbnN0ICopQkFTRSwJCVwKKwkJCQkJKF9fdjRzaSkoX19tMTI4aSlJTkRFWCwJCVwKKwkJCQkJX21tX3NldDFfcHMgKChmbG9hdCkoaW50KSAtMSksCVwKKwkJCQkJKGludClTQ0FMRSkKKworI2RlZmluZSBfbW1fbWFza19pMzJnYXRoZXJfcHMoU1JDLCBCQVNFLCBJTkRFWCwgTUFTSywgU0NBTEUpCSBcCisgIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjRzZiAoKF9fdjRzZikoX19tMTI4ZClTUkMsCSBcCisJCQkJCShmbG9hdCBjb25zdCAqKUJBU0UsCSBcCisJCQkJCShfX3Y0c2kpKF9fbTEyOGkpSU5ERVgsCSBcCisJCQkJCShfX3Y0c2YpKF9fbTEyOGQpTUFTSywJIFwKKwkJCQkJKGludClTQ0FMRSkKKworI2RlZmluZSBfbW0yNTZfaTMyZ2F0aGVyX3BzKEJBU0UsIElOREVYLCBTQ0FMRSkJCQkgICAgICAgXAorICAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY4c2YgKChfX3Y4c2YpIF9tbTI1Nl9zZXR6ZXJvX3BzICgpLCBcCisJCQkJCShmbG9hdCBjb25zdCAqKUJBU0UsCSAgICAgICBcCisJCQkJCShfX3Y4c2kpKF9fbTI1NmkpSU5ERVgsCSAgICAgICBcCisJCQkJCShfX3Y4c2YpX21tMjU2X3NldDFfcHMgKCAgICAgICBcCisJCQkJCSAgKGZsb2F0KShpbnQpIC0xKSwJICAgICAgIFwKKwkJCQkJKGludClTQ0FMRSkKKworI2RlZmluZSBfbW0yNTZfbWFza19pMzJnYXRoZXJfcHMoU1JDLCBCQVNFLCBJTkRFWCwgTUFTSywgU0NBTEUpIFwKKyAgKF9fbTI1NikgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2OHNmICgoX192OHNmKShfX20yNTYpU1JDLAlcCisJCQkJCShmbG9hdCBjb25zdCAqKUJBU0UsCVwKKwkJCQkJKF9fdjhzaSkoX19tMjU2aSlJTkRFWCwgXAorCQkJCQkoX192OHNmKShfX20yNTZkKU1BU0ssCVwKKwkJCQkJKGludClTQ0FMRSkKKworI2RlZmluZSBfbW1faTY0Z2F0aGVyX3BzKEJBU0UsIElOREVYLCBTQ0FMRSkJCQkJXAorICAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0c2YgKChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BkICgpLAlcCisJCQkJCShmbG9hdCBjb25zdCAqKUJBU0UsCQlcCisJCQkJCShfX3YyZGkpKF9fbTEyOGkpSU5ERVgsCQlcCisJCQkJCShfX3Y0c2YpX21tX3NldDFfcHMgKAkJXAorCQkJCQkgIChmbG9hdCkoaW50KSAtMSksCQlcCisJCQkJCShpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tX21hc2tfaTY0Z2F0aGVyX3BzKFNSQywgQkFTRSwgSU5ERVgsIE1BU0ssIFNDQUxFKQkgXAorICAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0c2YgKChfX3Y0c2YpKF9fbTEyOClTUkMsCSBcCisJCQkJCShmbG9hdCBjb25zdCAqKUJBU0UsCSBcCisJCQkJCShfX3YyZGkpKF9fbTEyOGkpSU5ERVgsCSBcCisJCQkJCShfX3Y0c2YpKF9fbTEyOGQpTUFTSywJIFwKKwkJCQkJKGludClTQ0FMRSkKKworI2RlZmluZSBfbW0yNTZfaTY0Z2F0aGVyX3BzKEJBU0UsIElOREVYLCBTQ0FMRSkJCQkJXAorICAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0c2YyNTYgKChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BzICgpLAlcCisJCQkJCSAgIChmbG9hdCBjb25zdCAqKUJBU0UsCQlcCisJCQkJCSAgIChfX3Y0ZGkpKF9fbTI1NmkpSU5ERVgsCVwKKwkJCQkJICAgKF9fdjRzZilfbW1fc2V0MV9wcygJCVwKKwkJCQkJICAgICAoZmxvYXQpKGludCkgLTEpLAkJXAorCQkJCQkgICAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2k2NGdhdGhlcl9wcyhTUkMsIEJBU0UsIElOREVYLCBNQVNLLCBTQ0FMRSkJICAgXAorICAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0c2YyNTYgKChfX3Y0c2YpKF9fbTEyOClTUkMsCSAgIFwKKwkJCQkJICAgKGZsb2F0IGNvbnN0ICopQkFTRSwJICAgXAorCQkJCQkgICAoX192NGRpKShfX20yNTZpKUlOREVYLCBcCisJCQkJCSAgIChfX3Y0c2YpKF9fbTEyOClNQVNLLCAgIFwKKwkJCQkJICAgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW1faTMyZ2F0aGVyX2VwaTY0KEJBU0UsIElOREVYLCBTQ0FMRSkJCQkJXAorICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2MmRpICgoX192MmRpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwgXAorCQkJCQkgKGxvbmcgbG9uZyBjb25zdCAqKUJBU0UsCVwKKwkJCQkJIChfX3Y0c2kpKF9fbTEyOGkpSU5ERVgsCVwKKwkJCQkJIChfX3YyZGkpX21tX3NldDFfZXBpNjR4ICgtMSksCVwKKwkJCQkJIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tX21hc2tfaTMyZ2F0aGVyX2VwaTY0KFNSQywgQkFTRSwgSU5ERVgsIE1BU0ssIFNDQUxFKQkgIFwKKyAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjJkaSAoKF9fdjJkaSkoX19tMTI4aSlTUkMsCSAgXAorCQkJCQkgKGxvbmcgbG9uZyBjb25zdCAqKUJBU0UsIFwKKwkJCQkJIChfX3Y0c2kpKF9fbTEyOGkpSU5ERVgsICBcCisJCQkJCSAoX192MmRpKShfX20xMjhpKU1BU0ssCSAgXAorCQkJCQkgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW0yNTZfaTMyZ2F0aGVyX2VwaTY0KEJBU0UsIElOREVYLCBTQ0FMRSkJCQkgICBcCisgIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY0ZGkgKChfX3Y0ZGkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLCBcCisJCQkJCSAobG9uZyBsb25nIGNvbnN0ICopQkFTRSwJICAgXAorCQkJCQkgKF9fdjRzaSkoX19tMTI4aSlJTkRFWCwJICAgXAorCQkJCQkgKF9fdjRkaSlfbW0yNTZfc2V0MV9lcGk2NHggKC0xKSwgIFwKKwkJCQkJIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tMjU2X21hc2tfaTMyZ2F0aGVyX2VwaTY0KFNSQywgQkFTRSwgSU5ERVgsIE1BU0ssIFNDQUxFKSBcCisgIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY0ZGkgKChfX3Y0ZGkpKF9fbTI1NmkpU1JDLAkgICBcCisJCQkJCSAobG9uZyBsb25nIGNvbnN0ICopQkFTRSwgIFwKKwkJCQkJIChfX3Y0c2kpKF9fbTEyOGkpSU5ERVgsICAgXAorCQkJCQkgKF9fdjRkaSkoX19tMjU2aSlNQVNLLAkgICBcCisJCQkJCSAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbV9pNjRnYXRoZXJfZXBpNjQoQkFTRSwgSU5ERVgsIFNDQUxFKQkJCQlcCisgIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXYyZGkgKChfX3YyZGkpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLCBcCisJCQkJCSAobG9uZyBsb25nIGNvbnN0ICopQkFTRSwJXAorCQkJCQkgKF9fdjJkaSkoX19tMTI4aSlJTkRFWCwJXAorCQkJCQkgKF9fdjJkaSlfbW1fc2V0MV9lcGk2NHggKC0xKSwJXAorCQkJCQkgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW1fbWFza19pNjRnYXRoZXJfZXBpNjQoU1JDLCBCQVNFLCBJTkRFWCwgTUFTSywgU0NBTEUpCSAgXAorICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MmRpICgoX192MmRpKShfX20xMjhpKVNSQywJICBcCisJCQkJCSAobG9uZyBsb25nIGNvbnN0ICopQkFTRSwgXAorCQkJCQkgKF9fdjJkaSkoX19tMTI4aSlJTkRFWCwgIFwKKwkJCQkJIChfX3YyZGkpKF9fbTEyOGkpTUFTSywJICBcCisJCQkJCSAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbTI1Nl9pNjRnYXRoZXJfZXBpNjQoQkFTRSwgSU5ERVgsIFNDQUxFKQkJCSAgIFwKKyAgKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjRkaSAoKF9fdjRkaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksIFwKKwkJCQkJIChsb25nIGxvbmcgY29uc3QgKilCQVNFLAkgICBcCisJCQkJCSAoX192NGRpKShfX20yNTZpKUlOREVYLAkgICBcCisJCQkJCSAoX192NGRpKV9tbTI1Nl9zZXQxX2VwaTY0eCAoLTEpLCAgXAorCQkJCQkgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW0yNTZfbWFza19pNjRnYXRoZXJfZXBpNjQoU1JDLCBCQVNFLCBJTkRFWCwgTUFTSywgU0NBTEUpIFwKKyAgKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjRkaSAoKF9fdjRkaSkoX19tMjU2aSlTUkMsCSAgIFwKKwkJCQkJIChsb25nIGxvbmcgY29uc3QgKilCQVNFLCAgXAorCQkJCQkgKF9fdjRkaSkoX19tMjU2aSlJTkRFWCwgICBcCisJCQkJCSAoX192NGRpKShfX20yNTZpKU1BU0ssCSAgIFwKKwkJCQkJIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tX2kzMmdhdGhlcl9lcGkzMihCQVNFLCBJTkRFWCwgU0NBTEUpCQkJCVwKKyAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjRzaSAoKF9fdjRzaSkgX21tX3NldHplcm9fc2kxMjggKCksCVwKKwkJCQkJIChpbnQgY29uc3QgKilCQVNFLAkJXAorCQkJCQkgKF9fdjRzaSkoX19tMTI4aSlJTkRFWCwJXAorCQkJCQkgKF9fdjRzaSlfbW1fc2V0MV9lcGkzMiAoLTEpLAlcCisJCQkJCSAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbV9tYXNrX2kzMmdhdGhlcl9lcGkzMihTUkMsIEJBU0UsIElOREVYLCBNQVNLLCBTQ0FMRSkgXAorICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2NHNpICgoX192NHNpKShfX20xMjhpKVNSQywJXAorCQkJCQkoaW50IGNvbnN0ICopQkFTRSwJXAorCQkJCQkoX192NHNpKShfX20xMjhpKUlOREVYLCBcCisJCQkJCShfX3Y0c2kpKF9fbTEyOGkpTUFTSywJXAorCQkJCQkoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbTI1Nl9pMzJnYXRoZXJfZXBpMzIoQkFTRSwgSU5ERVgsIFNDQUxFKQkJCSAgIFwKKyAgKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjhzaSAoKF9fdjhzaSkgX21tMjU2X3NldHplcm9fc2kyNTYgKCksIFwKKwkJCQkJIChpbnQgY29uc3QgKilCQVNFLAkJICAgXAorCQkJCQkgKF9fdjhzaSkoX19tMjU2aSlJTkRFWCwJICAgXAorCQkJCQkgKF9fdjhzaSlfbW0yNTZfc2V0MV9lcGkzMiAoLTEpLCAgIFwKKwkJCQkJIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tMjU2X21hc2tfaTMyZ2F0aGVyX2VwaTMyKFNSQywgQkFTRSwgSU5ERVgsIE1BU0ssIFNDQUxFKSBcCisgIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY4c2kgKChfX3Y4c2kpKF9fbTI1NmkpU1JDLAkgICBcCisJCQkJCShpbnQgY29uc3QgKilCQVNFLAkgICBcCisJCQkJCShfX3Y4c2kpKF9fbTI1NmkpSU5ERVgsCSAgIFwKKwkJCQkJKF9fdjhzaSkoX19tMjU2aSlNQVNLLAkgICBcCisJCQkJCShpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tX2k2NGdhdGhlcl9lcGkzMihCQVNFLCBJTkRFWCwgU0NBTEUpCQkJCVwKKyAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjRzaSAoKF9fdjRzaSkgX21tX3NldHplcm9fc2kxMjggKCksCVwKKwkJCQkJIChpbnQgY29uc3QgKilCQVNFLAkJXAorCQkJCQkgKF9fdjJkaSkoX19tMTI4aSlJTkRFWCwJXAorCQkJCQkgKF9fdjRzaSlfbW1fc2V0MV9lcGkzMiAoLTEpLAlcCisJCQkJCSAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbV9tYXNrX2k2NGdhdGhlcl9lcGkzMihTUkMsIEJBU0UsIElOREVYLCBNQVNLLCBTQ0FMRSkgXAorICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NHNpICgoX192NHNpKShfX20xMjhpKVNSQywJXAorCQkJCQkoaW50IGNvbnN0ICopQkFTRSwJXAorCQkJCQkoX192MmRpKShfX20xMjhpKUlOREVYLCBcCisJCQkJCShfX3Y0c2kpKF9fbTEyOGkpTUFTSywJXAorCQkJCQkoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbTI1Nl9pNjRnYXRoZXJfZXBpMzIoQkFTRSwgSU5ERVgsIFNDQUxFKQkJCSAgIFwKKyAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjRzaTI1NiAoKF9fdjRzaSkgX21tX3NldHplcm9fc2kxMjggKCksIFwKKwkJCQkJICAgIChpbnQgY29uc3QgKilCQVNFLAkJICAgXAorCQkJCQkgICAgKF9fdjRkaSkoX19tMjU2aSlJTkRFWCwJICAgXAorCQkJCQkgICAgKF9fdjRzaSlfbW1fc2V0MV9lcGkzMigtMSksCSAgIFwKKwkJCQkJICAgIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tMjU2X21hc2tfaTY0Z2F0aGVyX2VwaTMyKFNSQywgQkFTRSwgSU5ERVgsIE1BU0ssIFNDQUxFKSBcCisgIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0c2kyNTYgKChfX3Y0c2kpKF9fbTEyOGkpU1JDLCAgXAorCQkJCQkgICAoaW50IGNvbnN0ICopQkFTRSwJICAgXAorCQkJCQkgICAoX192NGRpKShfX20yNTZpKUlOREVYLCBcCisJCQkJCSAgIChfX3Y0c2kpKF9fbTEyOGkpTUFTSywgIFwKKwkJCQkJICAgKGludClTQ0FMRSkKKyNlbmRpZiAgLyogX19PUFRJTUlaRV9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9hdnhpbnRyaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2F2eGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NWRlNDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9hdnhpbnRyaW4uaApAQCAtMCwwICsxLDE0MjYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBJbXBsZW1lbnRlZCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVkIGluIHRoZSBJbnRlbCBDKysgQ29tcGlsZXIKKyAgIFVzZXIgR3VpZGUgYW5kIFJlZmVyZW5jZSwgdmVyc2lvbiAxMS4wLiAgKi8KKworI2lmbmRlZiBfSU1NSU5UUklOX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8YXZ4aW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxpbW1pbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogSW50ZXJuYWwgZGF0YSB0eXBlcyBmb3IgaW1wbGVtZW50aW5nIHRoZSBpbnRyaW5zaWNzLiAgKi8KK3R5cGVkZWYgZG91YmxlIF9fdjRkZiBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgzMikpKTsKK3R5cGVkZWYgZmxvYXQgX192OHNmIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSkpOwordHlwZWRlZiBsb25nIGxvbmcgX192NGRpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSkpOwordHlwZWRlZiBpbnQgX192OHNpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSkpOwordHlwZWRlZiBzaG9ydCBfX3YxNmhpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSkpOwordHlwZWRlZiBjaGFyIF9fdjMycWkgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpKSk7CisKKy8qIFRoZSBJbnRlbCBBUEkgaXMgZmxleGlibGUgZW5vdWdoIHRoYXQgd2UgbXVzdCBhbGxvdyBhbGlhc2luZyB3aXRoIG90aGVyCisgICB2ZWN0b3IgdHlwZXMsIGFuZCB0aGVpciBzY2FsYXIgY29tcG9uZW50cy4gICovCit0eXBlZGVmIGZsb2F0IF9fbTI1NiBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgzMiksCisJCQkJICAgICBfX21heV9hbGlhc19fKSk7Cit0eXBlZGVmIGxvbmcgbG9uZyBfX20yNTZpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSwKKwkJCQkJICBfX21heV9hbGlhc19fKSk7Cit0eXBlZGVmIGRvdWJsZSBfX20yNTZkIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSwKKwkJCQkgICAgICAgX19tYXlfYWxpYXNfXykpOworCisvKiBDb21wYXJlIHByZWRpY2F0ZXMgZm9yIHNjYWxhciBhbmQgcGFja2VkIGNvbXBhcmUgaW50cmluc2ljcy4gICovCisKKy8qIEVxdWFsIChvcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9FUV9PUQkweDAwCisvKiBMZXNzLXRoYW4gKG9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTFRfT1MJMHgwMQorLyogTGVzcy10aGFuLW9yLWVxdWFsIChvcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0xFX09TCTB4MDIKKy8qIFVub3JkZXJlZCAobm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfVU5PUkRfUQkweDAzCisvKiBOb3QtZXF1YWwgKHVub3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkVRX1VRCTB4MDQKKy8qIE5vdC1sZXNzLXRoYW4gKHVub3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9OTFRfVVMJMHgwNQorLyogTm90LWxlc3MtdGhhbi1vci1lcXVhbCAodW5vcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX05MRV9VUwkweDA2CisvKiBPcmRlcmVkIChub25zaWduYWxpbmcpICAgKi8KKyNkZWZpbmUgX0NNUF9PUkRfUQkweDA3CisvKiBFcXVhbCAodW5vcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9FUV9VUQkweDA4CisvKiBOb3QtZ3JlYXRlci10aGFuLW9yLWVxdWFsICh1bm9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkdFX1VTCTB4MDkKKy8qIE5vdC1ncmVhdGVyLXRoYW4gKHVub3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9OR1RfVVMJMHgwYQorLyogRmFsc2UgKG9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0ZBTFNFX09RCTB4MGIKKy8qIE5vdC1lcXVhbCAob3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkVRX09RCTB4MGMKKy8qIEdyZWF0ZXItdGhhbi1vci1lcXVhbCAob3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9HRV9PUwkweDBkCisvKiBHcmVhdGVyLXRoYW4gKG9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfR1RfT1MJMHgwZQorLyogVHJ1ZSAodW5vcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9UUlVFX1VRCTB4MGYKKy8qIEVxdWFsIChvcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0VRX09TCTB4MTAKKy8qIExlc3MtdGhhbiAob3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTFRfT1EJMHgxMQorLyogTGVzcy10aGFuLW9yLWVxdWFsIChvcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9MRV9PUQkweDEyCisvKiBVbm9yZGVyZWQgKHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfVU5PUkRfUwkweDEzCisvKiBOb3QtZXF1YWwgKHVub3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9ORVFfVVMJMHgxNAorLyogTm90LWxlc3MtdGhhbiAodW5vcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9OTFRfVVEJMHgxNQorLyogTm90LWxlc3MtdGhhbi1vci1lcXVhbCAodW5vcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9OTEVfVVEJMHgxNgorLyogT3JkZXJlZCAoc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9PUkRfUwkweDE3CisvKiBFcXVhbCAodW5vcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0VRX1VTCTB4MTgKKy8qIE5vdC1ncmVhdGVyLXRoYW4tb3ItZXF1YWwgKHVub3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkdFX1VRCTB4MTkKKy8qIE5vdC1ncmVhdGVyLXRoYW4gKHVub3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkdUX1VRCTB4MWEKKy8qIEZhbHNlIChvcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0ZBTFNFX09TCTB4MWIKKy8qIE5vdC1lcXVhbCAob3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9ORVFfT1MJMHgxYworLyogR3JlYXRlci10aGFuLW9yLWVxdWFsIChvcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9HRV9PUQkweDFkCisvKiBHcmVhdGVyLXRoYW4gKG9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0dUX09RCTB4MWUKKy8qIFRydWUgKHVub3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9UUlVFX1VTCTB4MWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYWRkX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfYWRkcGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYWRkX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfYWRkcHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FkZHN1Yl9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2FkZHN1YnBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FkZHN1Yl9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2FkZHN1YnBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IpOworfQorCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FuZF9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2FuZHBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FuZF9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2FuZHBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hbmRub3RfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9hbmRucGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYW5kbm90X3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfYW5kbnBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IpOworfQorCisvKiBEb3VibGUvc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBibGVuZCBpbnN0cnVjdGlvbnMgLSBzZWxlY3QKKyAgIGRhdGEgZnJvbSAyIHNvdXJjZXMgdXNpbmcgY29uc3RhbnQvdmFyaWFibGUgbWFzay4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2JsZW5kX3BkIChfX20yNTZkIF9fWCwgX19tMjU2ZCBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfYmxlbmRwZDI1NiAoKF9fdjRkZilfX1gsCisJCQkJCSAgICAgIChfX3Y0ZGYpX19ZLAorCQkJCQkgICAgICBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2JsZW5kX3BzIChfX20yNTYgX19YLCBfX20yNTYgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfYmxlbmRwczI1NiAoKF9fdjhzZilfX1gsCisJCQkJCSAgICAgKF9fdjhzZilfX1ksCisJCQkJCSAgICAgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9ibGVuZF9wZChYLCBZLCBNKQkJCQkJXAorICAoKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2JsZW5kcGQyNTYgKChfX3Y0ZGYpKF9fbTI1NmQpKFgpLAkJXAorCQkJCQkoX192NGRmKShfX20yNTZkKShZKSwgKGludCkoTSkpKQorCisjZGVmaW5lIF9tbTI1Nl9ibGVuZF9wcyhYLCBZLCBNKQkJCQkJXAorICAoKF9fbTI1NikgX19idWlsdGluX2lhMzJfYmxlbmRwczI1NiAoKF9fdjhzZikoX19tMjU2KShYKSwJCVwKKwkJCQkgICAgICAgKF9fdjhzZikoX19tMjU2KShZKSwgKGludCkoTSkpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2JsZW5kdl9wZCAoX19tMjU2ZCBfX1gsIF9fbTI1NmQgX19ZLCBfX20yNTZkIF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9ibGVuZHZwZDI1NiAoKF9fdjRkZilfX1gsCisJCQkJCSAgICAgICAoX192NGRmKV9fWSwKKwkJCQkJICAgICAgIChfX3Y0ZGYpX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9ibGVuZHZfcHMgKF9fbTI1NiBfX1gsIF9fbTI1NiBfX1ksIF9fbTI1NiBfX00pCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9ibGVuZHZwczI1NiAoKF9fdjhzZilfX1gsCisJCQkJCSAgICAgIChfX3Y4c2YpX19ZLAorCQkJCQkgICAgICAoX192OHNmKV9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Rpdl9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2RpdnBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Rpdl9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2RpdnBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IpOworfQorCisvKiBEb3QgcHJvZHVjdCBpbnN0cnVjdGlvbnMgd2l0aCBtYXNrLWRlZmluZWQgc3VtbWluZyBhbmQgemVyb2luZyBwYXJ0cworICAgb2YgcmVzdWx0LiAgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9kcF9wcyAoX19tMjU2IF9fWCwgX19tMjU2IF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2RwcHMyNTYgKChfX3Y4c2YpX19YLAorCQkJCQkgIChfX3Y4c2YpX19ZLAorCQkJCQkgIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW0yNTZfZHBfcHMoWCwgWSwgTSkJCQkJCQlcCisgICgoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9kcHBzMjU2ICgoX192OHNmKShfX20yNTYpKFgpLAkJXAorCQkJCSAgICAoX192OHNmKShfX20yNTYpKFkpLCAoaW50KShNKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaGFkZF9wZCAoX19tMjU2ZCBfX1gsIF9fbTI1NmQgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2hhZGRwZDI1NiAoKF9fdjRkZilfX1gsIChfX3Y0ZGYpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9oYWRkX3BzIChfX20yNTYgX19YLCBfX20yNTYgX19ZKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfaGFkZHBzMjU2ICgoX192OHNmKV9fWCwgKF9fdjhzZilfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9oc3ViX3BkIChfX20yNTZkIF9fWCwgX19tMjU2ZCBfX1kpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfaHN1YnBkMjU2ICgoX192NGRmKV9fWCwgKF9fdjRkZilfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2hzdWJfcHMgKF9fbTI1NiBfX1gsIF9fbTI1NiBfX1kpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9oc3VicHMyNTYgKChfX3Y4c2YpX19YLCAoX192OHNmKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21heF9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX21heHBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21heF9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX21heHBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9taW5fcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9taW5wZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9taW5fcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9taW5wczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXVsX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfbXVscGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXVsX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfbXVscHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X29yX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfb3JwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9vcl9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX29ycHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQik7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NodWZmbGVfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgY29uc3QgaW50IF9fbWFzaykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9zaHVmcGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQiwKKwkJCQkJICAgICBfX21hc2spOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NodWZmbGVfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIGNvbnN0IGludCBfX21hc2spCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9zaHVmcHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQiwKKwkJCQkJICAgIF9fbWFzayk7Cit9CisjZWxzZQorI2RlZmluZSBfbW0yNTZfc2h1ZmZsZV9wZChBLCBCLCBOKQkJCQkJXAorICAoKF9fbTI1NmQpX19idWlsdGluX2lhMzJfc2h1ZnBkMjU2ICgoX192NGRmKShfX20yNTZkKShBKSwJCVwKKwkJCQkgICAgICAoX192NGRmKShfX20yNTZkKShCKSwgKGludCkoTikpKQorCisjZGVmaW5lIF9tbTI1Nl9zaHVmZmxlX3BzKEEsIEIsIE4pCQkJCQlcCisgICgoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9zaHVmcHMyNTYgKChfX3Y4c2YpKF9fbTI1NikoQSksCQlcCisJCQkJICAgICAgKF9fdjhzZikoX19tMjU2KShCKSwgKGludCkoTikpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N1Yl9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3N1YnBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N1Yl9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3N1YnBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl94b3JfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl94b3JwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl94b3JfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl94b3JwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wX3BkIChfX20xMjhkIF9fWCwgX19tMTI4ZCBfX1ksIGNvbnN0IGludCBfX1ApCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfY21wcGQgKChfX3YyZGYpX19YLCAoX192MmRmKV9fWSwgX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBfcHMgKF9fbTEyOCBfX1gsIF9fbTEyOCBfX1ksIGNvbnN0IGludCBfX1ApCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBwcyAoKF9fdjRzZilfX1gsIChfX3Y0c2YpX19ZLCBfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jbXBfcGQgKF9fbTI1NmQgX19YLCBfX20yNTZkIF9fWSwgY29uc3QgaW50IF9fUCkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9jbXBwZDI1NiAoKF9fdjRkZilfX1gsIChfX3Y0ZGYpX19ZLAorCQkJCQkgICAgX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jbXBfcHMgKF9fbTI1NiBfX1gsIF9fbTI1NiBfX1ksIGNvbnN0IGludCBfX1ApCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9jbXBwczI1NiAoKF9fdjhzZilfX1gsIChfX3Y4c2YpX19ZLAorCQkJCQkgICBfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBfc2QgKF9fbTEyOGQgX19YLCBfX20xMjhkIF9fWSwgY29uc3QgaW50IF9fUCkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9jbXBzZCAoKF9fdjJkZilfX1gsIChfX3YyZGYpX19ZLCBfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcF9zcyAoX19tMTI4IF9fWCwgX19tMTI4IF9fWSwgY29uc3QgaW50IF9fUCkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcHNzICgoX192NHNmKV9fWCwgKF9fdjRzZilfX1ksIF9fUCk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fY21wX3BkKFgsIFksIFApCQkJCQkJXAorICAoKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2NtcHBkICgoX192MmRmKShfX20xMjhkKShYKSwJCVwKKwkJCQkgICAoX192MmRmKShfX20xMjhkKShZKSwgKGludCkoUCkpKQorCisjZGVmaW5lIF9tbV9jbXBfcHMoWCwgWSwgUCkJCQkJCQlcCisgICgoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBwcyAoKF9fdjRzZikoX19tMTI4KShYKSwJCQlcCisJCQkJICAoX192NHNmKShfX20xMjgpKFkpLCAoaW50KShQKSkpCisKKyNkZWZpbmUgX21tMjU2X2NtcF9wZChYLCBZLCBQKQkJCQkJCVwKKyAgKChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9jbXBwZDI1NiAoKF9fdjRkZikoX19tMjU2ZCkoWCksCQlcCisJCQkJICAgICAgKF9fdjRkZikoX19tMjU2ZCkoWSksIChpbnQpKFApKSkKKworI2RlZmluZSBfbW0yNTZfY21wX3BzKFgsIFksIFApCQkJCQkJXAorICAoKF9fbTI1NikgX19idWlsdGluX2lhMzJfY21wcHMyNTYgKChfX3Y4c2YpKF9fbTI1NikoWCksCQlcCisJCQkJICAgICAoX192OHNmKShfX20yNTYpKFkpLCAoaW50KShQKSkpCisKKyNkZWZpbmUgX21tX2NtcF9zZChYLCBZLCBQKQkJCQkJCVwKKyAgKChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9jbXBzZCAoKF9fdjJkZikoX19tMTI4ZCkoWCksCQlcCisJCQkJICAgKF9fdjJkZikoX19tMTI4ZCkoWSksIChpbnQpKFApKSkKKworI2RlZmluZSBfbW1fY21wX3NzKFgsIFksIFApCQkJCQkJXAorICAoKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wc3MgKChfX3Y0c2YpKF9fbTEyOCkoWCksCQkJXAorCQkJCSAgKF9fdjRzZikoX19tMTI4KShZKSwgKGludCkoUCkpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2N2dGVwaTMyX3BkIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX2N2dGRxMnBkMjU2ICgoX192NHNpKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2N2dGVwaTMyX3BzIChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfY3Z0ZHEycHMyNTYgKChfX3Y4c2kpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0cGRfcHMgKF9fbTI1NmQgX19BKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl9jdnRwZDJwczI1NiAoKF9fdjRkZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0cHNfZXBpMzIgKF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9jdnRwczJkcTI1NiAoKF9fdjhzZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0cHNfcGQgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9jdnRwczJwZDI1NiAoKF9fdjRzZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0dHBkX2VwaTMyIChfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2N2dHRwZDJkcTI1NiAoKF9fdjRkZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0cGRfZXBpMzIgKF9fbTI1NmQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfY3Z0cGQyZHEyNTYgKChfX3Y0ZGYpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2N2dHRwc19lcGkzMiAoX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX2N2dHRwczJkcTI1NiAoKF9fdjhzZikgX19BKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZXh0cmFjdGYxMjhfcGQgKF9fbTI1NmQgX19YLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZleHRyYWN0ZjEyOF9wZDI1NiAoKF9fdjRkZilfX1gsIF9fTik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZXh0cmFjdGYxMjhfcHMgKF9fbTI1NiBfX1gsIGNvbnN0IGludCBfX04pCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92ZXh0cmFjdGYxMjhfcHMyNTYgKChfX3Y4c2YpX19YLCBfX04pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoX19tMjU2aSBfX1gsIGNvbnN0IGludCBfX04pCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdmV4dHJhY3RmMTI4X3NpMjU2ICgoX192OHNpKV9fWCwgX19OKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9leHRyYWN0X2VwaTMyIChfX20yNTZpIF9fWCwgaW50IGNvbnN0IF9fTikKK3sKKyAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKF9fWCwgX19OID4+IDIpOworICByZXR1cm4gX21tX2V4dHJhY3RfZXBpMzIgKF9fWSwgX19OICUgNCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZXh0cmFjdF9lcGkxNiAoX19tMjU2aSBfX1gsIGludCBjb25zdCBfX04pCit7CisgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2IChfX1gsIF9fTiA+PiAzKTsKKyAgcmV0dXJuIF9tbV9leHRyYWN0X2VwaTE2IChfX1ksIF9fTiAlIDgpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2V4dHJhY3RfZXBpOCAoX19tMjU2aSBfX1gsIGludCBjb25zdCBfX04pCit7CisgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2IChfX1gsIF9fTiA+PiA0KTsKKyAgcmV0dXJuIF9tbV9leHRyYWN0X2VwaTggKF9fWSwgX19OICUgMTYpOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyAgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZXh0cmFjdF9lcGk2NCAoX19tMjU2aSBfX1gsIGNvbnN0IGludCBfX04pCit7CisgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2IChfX1gsIF9fTiA+PiAxKTsKKyAgcmV0dXJuIF9tbV9leHRyYWN0X2VwaTY0IChfX1ksIF9fTiAlIDIpOworfQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfbW0yNTZfZXh0cmFjdGYxMjhfcGQoWCwgTikJCQkJCVwKKyAgKChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92ZXh0cmFjdGYxMjhfcGQyNTYgKChfX3Y0ZGYpKF9fbTI1NmQpKFgpLAlcCisJCQkJCQkoaW50KShOKSkpCisKKyNkZWZpbmUgX21tMjU2X2V4dHJhY3RmMTI4X3BzKFgsIE4pCQkJCQlcCisgICgoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92ZXh0cmFjdGYxMjhfcHMyNTYgKChfX3Y4c2YpKF9fbTI1NikoWCksCVwKKwkJCQkJICAgICAgIChpbnQpKE4pKSkKKworI2RlZmluZSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYoWCwgTikJCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92ZXh0cmFjdGYxMjhfc2kyNTYgKChfX3Y4c2kpKF9fbTI1NmkpKFgpLAlcCisJCQkJCQkoaW50KShOKSkpCisKKyNkZWZpbmUgX21tMjU2X2V4dHJhY3RfZXBpMzIoWCwgTikJCQkJCVwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJXAorICAgKHsJCQkJCQkJCQlcCisgICAgICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoKFgpLCAoTikgPj4gMik7CQlcCisgICAgICBfbW1fZXh0cmFjdF9lcGkzMiAoX19ZLCAoTikgJSA0KTsJCQkJCVwKKyAgICB9KSkKKworI2RlZmluZSBfbW0yNTZfZXh0cmFjdF9lcGkxNihYLCBOKQkJCQkJXAorICAoX19leHRlbnNpb25fXwkJCQkJCQlcCisgICAoewkJCQkJCQkJCVwKKyAgICAgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2ICgoWCksIChOKSA+PiAzKTsJCVwKKyAgICAgIF9tbV9leHRyYWN0X2VwaTE2IChfX1ksIChOKSAlIDgpOwkJCQkJXAorICAgIH0pKQorCisjZGVmaW5lIF9tbTI1Nl9leHRyYWN0X2VwaTgoWCwgTikJCQkJCVwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJXAorICAgKHsJCQkJCQkJCQlcCisgICAgICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoKFgpLCAoTikgPj4gNCk7CQlcCisgICAgICBfbW1fZXh0cmFjdF9lcGk4IChfX1ksIChOKSAlIDE2KTsJCQkJCVwKKyAgICB9KSkKKworI2lmZGVmIF9feDg2XzY0X18KKyNkZWZpbmUgX21tMjU2X2V4dHJhY3RfZXBpNjQoWCwgTikJCQkJCVwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJXAorICAgKHsJCQkJCQkJCQlcCisgICAgICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoKFgpLCAoTikgPj4gMSk7CQlcCisgICAgICBfbW1fZXh0cmFjdF9lcGk2NCAoX19ZLCAoTikgJSAyKTsJCQkJCVwKKyAgICB9KSkKKyNlbmRpZgorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3plcm9hbGwgKHZvaWQpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Z6ZXJvYWxsICgpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl96ZXJvdXBwZXIgKHZvaWQpCit7CisgIF9fYnVpbHRpbl9pYTMyX3Z6ZXJvdXBwZXIgKCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Blcm11dGV2YXJfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycGQgKChfX3YyZGYpX19BLAorCQkJCQkJKF9fdjJkaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wZXJtdXRldmFyX3BkIChfX20yNTZkIF9fQSwgX19tMjU2aSBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBkMjU2ICgoX192NGRmKV9fQSwKKwkJCQkJCSAgIChfX3Y0ZGkpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wZXJtdXRldmFyX3BzIChfX20xMjggX19BLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwcyAoKF9fdjRzZilfX0EsCisJCQkJCSAgICAgICAoX192NHNpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGVybXV0ZXZhcl9wcyAoX19tMjU2IF9fQSwgX19tMjU2aSBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycHMyNTYgKChfX3Y4c2YpX19BLAorCQkJCQkJICAoX192OHNpKV9fQyk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Blcm11dGVfcGQgKF9fbTEyOGQgX19YLCBjb25zdCBpbnQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWxwZCAoKF9fdjJkZilfX1gsIF9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGVfcGQgKF9fbTI1NmQgX19YLCBjb25zdCBpbnQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWxwZDI1NiAoKF9fdjRkZilfX1gsIF9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcGVybXV0ZV9wcyAoX19tMTI4IF9fWCwgY29uc3QgaW50IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWxwcyAoKF9fdjRzZilfX1gsIF9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGVybXV0ZV9wcyAoX19tMjU2IF9fWCwgY29uc3QgaW50IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWxwczI1NiAoKF9fdjhzZilfX1gsIF9fQyk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fcGVybXV0ZV9wZChYLCBDKQkJCQkJCVwKKyAgKChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92cGVybWlscGQgKChfX3YyZGYpKF9fbTEyOGQpKFgpLCAoaW50KShDKSkpCisKKyNkZWZpbmUgX21tMjU2X3Blcm11dGVfcGQoWCwgQykJCQkJCQlcCisgICgoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdnBlcm1pbHBkMjU2ICgoX192NGRmKShfX20yNTZkKShYKSwJKGludCkoQykpKQorCisjZGVmaW5lIF9tbV9wZXJtdXRlX3BzKFgsIEMpCQkJCQkJXAorICAoKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdnBlcm1pbHBzICgoX192NHNmKShfX20xMjgpKFgpLCAoaW50KShDKSkpCisKKyNkZWZpbmUgX21tMjU2X3Blcm11dGVfcHMoWCwgQykJCQkJCQlcCisgICgoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92cGVybWlscHMyNTYgKChfX3Y4c2YpKF9fbTI1NikoWCksIChpbnQpKEMpKSkKKyNlbmRpZgorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wZXJtdXRlMmYxMjhfcGQgKF9fbTI1NmQgX19YLCBfX20yNTZkIF9fWSwgY29uc3QgaW50IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92cGVybTJmMTI4X3BkMjU2ICgoX192NGRmKV9fWCwKKwkJCQkJCSAgICAoX192NGRmKV9fWSwKKwkJCQkJCSAgICBfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGUyZjEyOF9wcyAoX19tMjU2IF9fWCwgX19tMjU2IF9fWSwgY29uc3QgaW50IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtMmYxMjhfcHMyNTYgKChfX3Y4c2YpX19YLAorCQkJCQkJICAgKF9fdjhzZilfX1ksCisJCQkJCQkgICBfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wZXJtdXRlMmYxMjhfc2kyNTYgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSwgY29uc3QgaW50IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92cGVybTJmMTI4X3NpMjU2ICgoX192OHNpKV9fWCwKKwkJCQkJCSAgICAoX192OHNpKV9fWSwKKwkJCQkJCSAgICBfX0MpOworfQorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X3Blcm11dGUyZjEyOF9wZChYLCBZLCBDKQkJCQkJXAorICAoKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtMmYxMjhfcGQyNTYgKChfX3Y0ZGYpKF9fbTI1NmQpKFgpLAlcCisJCQkJCSAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKFkpLAlcCisJCQkJCSAgICAgIChpbnQpKEMpKSkKKworI2RlZmluZSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFgsIFksIEMpCQkJCQlcCisgICgoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92cGVybTJmMTI4X3BzMjU2ICgoX192OHNmKShfX20yNTYpKFgpLAlcCisJCQkJCSAgICAgKF9fdjhzZikoX19tMjU2KShZKSwJXAorCQkJCQkgICAgIChpbnQpKEMpKSkKKworI2RlZmluZSBfbW0yNTZfcGVybXV0ZTJmMTI4X3NpMjU2KFgsIFksIEMpCQkJCVwKKyAgKChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92cGVybTJmMTI4X3NpMjU2ICgoX192OHNpKShfX20yNTZpKShYKSwJXAorCQkJCQkgICAgICAoX192OHNpKShfX20yNTZpKShZKSwJXAorCQkJCQkgICAgICAoaW50KShDKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9icm9hZGNhc3Rfc3MgKGZsb2F0IGNvbnN0ICpfX1gpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92YnJvYWRjYXN0c3MgKF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Jyb2FkY2FzdF9zZCAoZG91YmxlIGNvbnN0ICpfX1gpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmJyb2FkY2FzdHNkMjU2IChfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Jyb2FkY2FzdF9zcyAoZmxvYXQgY29uc3QgKl9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3Zicm9hZGNhc3RzczI1NiAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYnJvYWRjYXN0X3BkIChfX20xMjhkIGNvbnN0ICpfX1gpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmJyb2FkY2FzdGYxMjhfcGQyNTYgKF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYnJvYWRjYXN0X3BzIChfX20xMjggY29uc3QgKl9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3Zicm9hZGNhc3RmMTI4X3BzMjU2IChfX1gpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9pbnNlcnRmMTI4X3BkIChfX20yNTZkIF9fWCwgX19tMTI4ZCBfX1ksIGNvbnN0IGludCBfX08pCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmluc2VydGYxMjhfcGQyNTYgKChfX3Y0ZGYpX19YLAorCQkJCQkJICAgICAoX192MmRmKV9fWSwKKwkJCQkJCSAgICAgX19PKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9pbnNlcnRmMTI4X3BzIChfX20yNTYgX19YLCBfX20xMjggX19ZLCBjb25zdCBpbnQgX19PKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmluc2VydGYxMjhfcHMyNTYgKChfX3Y4c2YpX19YLAorCQkJCQkJICAgIChfX3Y0c2YpX19ZLAorCQkJCQkJICAgIF9fTyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2luc2VydGYxMjhfc2kyNTYgKF9fbTI1NmkgX19YLCBfX20xMjhpIF9fWSwgY29uc3QgaW50IF9fTykKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92aW5zZXJ0ZjEyOF9zaTI1NiAoKF9fdjhzaSlfX1gsCisJCQkJCQkgICAgIChfX3Y0c2kpX19ZLAorCQkJCQkJICAgICBfX08pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9pbnNlcnRfZXBpMzIgKF9fbTI1NmkgX19YLCBpbnQgX19ELCBpbnQgY29uc3QgX19OKQoreworICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoX19YLCBfX04gPj4gMik7CisgIF9fWSA9IF9tbV9pbnNlcnRfZXBpMzIgKF9fWSwgX19ELCBfX04gJSA0KTsKKyAgcmV0dXJuIF9tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2IChfX1gsIF9fWSwgX19OID4+IDIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9pbnNlcnRfZXBpMTYgKF9fbTI1NmkgX19YLCBpbnQgX19ELCBpbnQgY29uc3QgX19OKQoreworICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoX19YLCBfX04gPj4gMyk7CisgIF9fWSA9IF9tbV9pbnNlcnRfZXBpMTYgKF9fWSwgX19ELCBfX04gJSA4KTsKKyAgcmV0dXJuIF9tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2IChfX1gsIF9fWSwgX19OID4+IDMpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9pbnNlcnRfZXBpOCAoX19tMjU2aSBfX1gsIGludCBfX0QsIGludCBjb25zdCBfX04pCit7CisgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2IChfX1gsIF9fTiA+PiA0KTsKKyAgX19ZID0gX21tX2luc2VydF9lcGk4IChfX1ksIF9fRCwgX19OICUgMTYpOworICByZXR1cm4gX21tMjU2X2luc2VydGYxMjhfc2kyNTYgKF9fWCwgX19ZLCBfX04gPj4gNCk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9pbnNlcnRfZXBpNjQgKF9fbTI1NmkgX19YLCBsb25nIGxvbmcgX19ELCBpbnQgY29uc3QgX19OKQoreworICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoX19YLCBfX04gPj4gMSk7CisgIF9fWSA9IF9tbV9pbnNlcnRfZXBpNjQgKF9fWSwgX19ELCBfX04gJSAyKTsKKyAgcmV0dXJuIF9tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2IChfX1gsIF9fWSwgX19OID4+IDEpOworfQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfbW0yNTZfaW5zZXJ0ZjEyOF9wZChYLCBZLCBPKQkJCQkJXAorICAoKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZpbnNlcnRmMTI4X3BkMjU2ICgoX192NGRmKShfX20yNTZkKShYKSwJXAorCQkJCQkgICAgICAgKF9fdjJkZikoX19tMTI4ZCkoWSksCVwKKwkJCQkJICAgICAgIChpbnQpKE8pKSkKKworI2RlZmluZSBfbW0yNTZfaW5zZXJ0ZjEyOF9wcyhYLCBZLCBPKQkJCQkJXAorICAoKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmluc2VydGYxMjhfcHMyNTYgKChfX3Y4c2YpKF9fbTI1NikoWCksCVwKKwkJCQkJICAgICAgKF9fdjRzZikoX19tMTI4KShZKSwgIAlcCisJCQkJCSAgICAgIChpbnQpKE8pKSkKKworI2RlZmluZSBfbW0yNTZfaW5zZXJ0ZjEyOF9zaTI1NihYLCBZLCBPKQkJCQlcCisgICgoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdmluc2VydGYxMjhfc2kyNTYgKChfX3Y4c2kpKF9fbTI1NmkpKFgpLAlcCisJCQkJCSAgICAgICAoX192NHNpKShfX20xMjhpKShZKSwJXAorCQkJCQkgICAgICAgKGludCkoTykpKQorCisjZGVmaW5lIF9tbTI1Nl9pbnNlcnRfZXBpMzIoWCwgRCwgTikJCQkJCVwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJXAorICAgKHsJCQkJCQkJCQlcCisgICAgICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoKFgpLCAoTikgPj4gMik7CQlcCisgICAgICBfX1kgPSBfbW1faW5zZXJ0X2VwaTMyIChfX1ksIChEKSwgKE4pICUgNCk7CQkJXAorICAgICAgX21tMjU2X2luc2VydGYxMjhfc2kyNTYgKChYKSwgX19ZLCAoTikgPj4gMik7CQkJXAorICAgIH0pKQorCisjZGVmaW5lIF9tbTI1Nl9pbnNlcnRfZXBpMTYoWCwgRCwgTikJCQkJCVwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJXAorICAgKHsJCQkJCQkJCQlcCisgICAgICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoKFgpLCAoTikgPj4gMyk7CQlcCisgICAgICBfX1kgPSBfbW1faW5zZXJ0X2VwaTE2IChfX1ksIChEKSwgKE4pICUgOCk7CQkJXAorICAgICAgX21tMjU2X2luc2VydGYxMjhfc2kyNTYgKChYKSwgX19ZLCAoTikgPj4gMyk7CQkJXAorICAgIH0pKQorCisjZGVmaW5lIF9tbTI1Nl9pbnNlcnRfZXBpOChYLCBELCBOKQkJCQkJXAorICAoX19leHRlbnNpb25fXwkJCQkJCQlcCisgICAoewkJCQkJCQkJCVwKKyAgICAgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2ICgoWCksIChOKSA+PiA0KTsJCVwKKyAgICAgIF9fWSA9IF9tbV9pbnNlcnRfZXBpOCAoX19ZLCAoRCksIChOKSAlIDE2KTsJCQlcCisgICAgICBfbW0yNTZfaW5zZXJ0ZjEyOF9zaTI1NiAoKFgpLCBfX1ksIChOKSA+PiA0KTsJCQlcCisgICAgfSkpCisKKyNpZmRlZiBfX3g4Nl82NF9fCisjZGVmaW5lIF9tbTI1Nl9pbnNlcnRfZXBpNjQoWCwgRCwgTikJCQkJCVwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJXAorICAgKHsJCQkJCQkJCQlcCisgICAgICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoKFgpLCAoTikgPj4gMSk7CQlcCisgICAgICBfX1kgPSBfbW1faW5zZXJ0X2VwaTY0IChfX1ksIChEKSwgKE4pICUgMik7CQkJXAorICAgICAgX21tMjU2X2luc2VydGYxMjhfc2kyNTYgKChYKSwgX19ZLCAoTikgPj4gMSk7CQkJXAorICAgIH0pKQorI2VuZGlmCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbG9hZF9wZCAoZG91YmxlIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAqKF9fbTI1NmQgKilfX1A7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N0b3JlX3BkIChkb3VibGUgKl9fUCwgX19tMjU2ZCBfX0EpCit7CisgICooX19tMjU2ZCAqKV9fUCA9IF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9sb2FkX3BzIChmbG9hdCBjb25zdCAqX19QKQoreworICByZXR1cm4gKihfX20yNTYgKilfX1A7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N0b3JlX3BzIChmbG9hdCAqX19QLCBfX20yNTYgX19BKQoreworICAqKF9fbTI1NiAqKV9fUCA9IF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbG9hZHVfcGQgKGRvdWJsZSBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2xvYWR1cGQyNTYgKF9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N0b3JldV9wZCAoZG91YmxlICpfX1AsIF9fbTI1NmQgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZXVwZDI1NiAoX19QLCAoX192NGRmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbG9hZHVfcHMgKGZsb2F0IGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9sb2FkdXBzMjU2IChfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdG9yZXVfcHMgKGZsb2F0ICpfX1AsIF9fbTI1NiBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JldXBzMjU2IChfX1AsIChfX3Y4c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbG9hZF9zaTI1NiAoX19tMjU2aSBjb25zdCAqX19QKQoreworICByZXR1cm4gKl9fUDsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3RvcmVfc2kyNTYgKF9fbTI1NmkgKl9fUCwgX19tMjU2aSBfX0EpCit7CisgICpfX1AgPSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2xvYWR1X3NpMjU2IChfX20yNTZpIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfbG9hZGRxdTI1NiAoKGNoYXIgY29uc3QgKilfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdG9yZXVfc2kyNTYgKF9fbTI1NmkgKl9fUCwgX19tMjU2aSBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JlZHF1MjU2ICgoY2hhciAqKV9fUCwgKF9fdjMycWkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza2xvYWRfcGQgKGRvdWJsZSBjb25zdCAqX19QLCBfX20xMjhpIF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBkICgoY29uc3QgX192MmRmICopX19QLAorCQkJCQkgICAgICAoX192MmRpKV9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2tzdG9yZV9wZCAoZG91YmxlICpfX1AsIF9fbTEyOGkgX19NLCBfX20xMjhkIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfbWFza3N0b3JlcGQgKChfX3YyZGYgKilfX1AsIChfX3YyZGkpX19NLCAoX192MmRmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tsb2FkX3BkIChkb3VibGUgY29uc3QgKl9fUCwgX19tMjU2aSBfX00pCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfbWFza2xvYWRwZDI1NiAoKGNvbnN0IF9fdjRkZiAqKV9fUCwKKwkJCQkJCSAoX192NGRpKV9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tzdG9yZV9wZCAoZG91YmxlICpfX1AsIF9fbTI1NmkgX19NLCBfX20yNTZkIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfbWFza3N0b3JlcGQyNTYgKChfX3Y0ZGYgKilfX1AsIChfX3Y0ZGkpX19NLCAoX192NGRmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza2xvYWRfcHMgKGZsb2F0IGNvbnN0ICpfX1AsIF9fbTEyOGkgX19NKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbWFza2xvYWRwcyAoKGNvbnN0IF9fdjRzZiAqKV9fUCwKKwkJCQkJICAgICAoX192NHNpKV9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2tzdG9yZV9wcyAoZmxvYXQgKl9fUCwgX19tMTI4aSBfX00sIF9fbTEyOCBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBzICgoX192NHNmICopX19QLCAoX192NHNpKV9fTSwgKF9fdjRzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tsb2FkX3BzIChmbG9hdCBjb25zdCAqX19QLCBfX20yNTZpIF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcHMyNTYgKChjb25zdCBfX3Y4c2YgKilfX1AsCisJCQkJCQkoX192OHNpKV9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tzdG9yZV9wcyAoZmxvYXQgKl9fUCwgX19tMjU2aSBfX00sIF9fbTI1NiBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBzMjU2ICgoX192OHNmICopX19QLCAoX192OHNpKV9fTSwgKF9fdjhzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21vdmVoZHVwX3BzIChfX20yNTYgX19YKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfbW92c2hkdXAyNTYgKChfX3Y4c2YpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tb3ZlbGR1cF9wcyAoX19tMjU2IF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX21vdnNsZHVwMjU2ICgoX192OHNmKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21vdmVkdXBfcGQgKF9fbTI1NmQgX19YKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX21vdmRkdXAyNTYgKChfX3Y0ZGYpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbGRkcXVfc2kyNTYgKF9fbTI1NmkgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9sZGRxdTI1NiAoKGNoYXIgY29uc3QgKilfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdHJlYW1fc2kyNTYgKF9fbTI1NmkgKl9fQSwgX19tMjU2aSBfX0IpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vdm50ZHEyNTYgKChfX3Y0ZGkgKilfX0EsIChfX3Y0ZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3RyZWFtX3BkIChkb3VibGUgKl9fQSwgX19tMjU2ZCBfX0IpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vdm50cGQyNTYgKF9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdHJlYW1fcHMgKGZsb2F0ICpfX1AsIF9fbTI1NiBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vdm50cHMyNTYgKF9fUCwgKF9fdjhzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3JjcF9wcyAoX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3JjcHBzMjU2ICgoX192OHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcnNxcnRfcHMgKF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9yc3FydHBzMjU2ICgoX192OHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NxcnRfcGQgKF9fbTI1NmQgX19BKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3NxcnRwZDI1NiAoKF9fdjRkZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NxcnRfcHMgKF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9zcXJ0cHMyNTYgKChfX3Y4c2YpX19BKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcm91bmRfcGQgKF9fbTI1NmQgX19WLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3JvdW5kcGQyNTYgKChfX3Y0ZGYpX19WLCBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3JvdW5kX3BzIChfX20yNTYgX19WLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfcm91bmRwczI1NiAoKF9fdjhzZilfX1YsIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW0yNTZfcm91bmRfcGQoViwgTSkgXAorICAoKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3JvdW5kcGQyNTYgKChfX3Y0ZGYpKF9fbTI1NmQpKFYpLCAoaW50KShNKSkpCisKKyNkZWZpbmUgX21tMjU2X3JvdW5kX3BzKFYsIE0pIFwKKyAgKChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3JvdW5kcHMyNTYgKChfX3Y4c2YpKF9fbTI1NikoViksIChpbnQpKE0pKSkKKyNlbmRpZgorCisjZGVmaW5lIF9tbTI1Nl9jZWlsX3BkKFYpCV9tbTI1Nl9yb3VuZF9wZCAoKFYpLCBfTU1fRlJPVU5EX0NFSUwpCisjZGVmaW5lIF9tbTI1Nl9mbG9vcl9wZChWKQlfbW0yNTZfcm91bmRfcGQgKChWKSwgX01NX0ZST1VORF9GTE9PUikKKyNkZWZpbmUgX21tMjU2X2NlaWxfcHMoVikJX21tMjU2X3JvdW5kX3BzICgoViksIF9NTV9GUk9VTkRfQ0VJTCkKKyNkZWZpbmUgX21tMjU2X2Zsb29yX3BzKFYpCV9tbTI1Nl9yb3VuZF9wcyAoKFYpLCBfTU1fRlJPVU5EX0ZMT09SKQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl91bnBhY2toaV9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3VucGNraHBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl91bnBhY2tsb19wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3VucGNrbHBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3VucGFja2hpX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdW5wY2tocHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdW5wYWNrbG9fcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl91bnBja2xwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV90ZXN0el9wZCAoX19tMTI4ZCBfX00sIF9fbTEyOGQgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3R6cGQgKChfX3YyZGYpX19NLCAoX192MmRmKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdGVzdGNfcGQgKF9fbTEyOGQgX19NLCBfX20xMjhkIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BkICgoX192MmRmKV9fTSwgKF9fdjJkZilfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Rlc3RuemNfcGQgKF9fbTEyOGQgX19NLCBfX20xMjhkIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0bnpjcGQgKChfX3YyZGYpX19NLCAoX192MmRmKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdGVzdHpfcHMgKF9fbTEyOCBfX00sIF9fbTEyOCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdHpwcyAoKF9fdjRzZilfX00sIChfX3Y0c2YpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV90ZXN0Y19wcyAoX19tMTI4IF9fTSwgX19tMTI4IF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BzICgoX192NHNmKV9fTSwgKF9fdjRzZilfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Rlc3RuemNfcHMgKF9fbTEyOCBfX00sIF9fbTEyOCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BzICgoX192NHNmKV9fTSwgKF9fdjRzZilfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Rlc3R6X3BkIChfX20yNTZkIF9fTSwgX19tMjU2ZCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdHpwZDI1NiAoKF9fdjRkZilfX00sIChfX3Y0ZGYpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl90ZXN0Y19wZCAoX19tMjU2ZCBfX00sIF9fbTI1NmQgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3RjcGQyNTYgKChfX3Y0ZGYpX19NLCAoX192NGRmKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdGVzdG56Y19wZCAoX19tMjU2ZCBfX00sIF9fbTI1NmQgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3RuemNwZDI1NiAoKF9fdjRkZilfX00sIChfX3Y0ZGYpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl90ZXN0el9wcyAoX19tMjU2IF9fTSwgX19tMjU2IF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBzMjU2ICgoX192OHNmKV9fTSwgKF9fdjhzZilfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Rlc3RjX3BzIChfX20yNTYgX19NLCBfX20yNTYgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3RjcHMyNTYgKChfX3Y4c2YpX19NLCAoX192OHNmKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdGVzdG56Y19wcyAoX19tMjU2IF9fTSwgX19tMjU2IF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0bnpjcHMyNTYgKChfX3Y4c2YpX19NLCAoX192OHNmKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdGVzdHpfc2kyNTYgKF9fbTI1NmkgX19NLCBfX20yNTZpIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3B0ZXN0ejI1NiAoKF9fdjRkaSlfX00sIChfX3Y0ZGkpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl90ZXN0Y19zaTI1NiAoX19tMjU2aSBfX00sIF9fbTI1NmkgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcHRlc3RjMjU2ICgoX192NGRpKV9fTSwgKF9fdjRkaSlfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Rlc3RuemNfc2kyNTYgKF9fbTI1NmkgX19NLCBfX20yNTZpIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bnpjMjU2ICgoX192NGRpKV9fTSwgKF9fdjRkaSlfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21vdmVtYXNrX3BkIChfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX21vdm1za3BkMjU2ICgoX192NGRmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbW92ZW1hc2tfcHMgKF9fbTI1NiBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9tb3Ztc2twczI1NiAoKF9fdjhzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXR6ZXJvX3BkICh2b2lkKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMjU2ZCl7IDAuMCwgMC4wLCAwLjAsIDAuMCB9OworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldHplcm9fcHMgKHZvaWQpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20yNTYpeyAwLjAsIDAuMCwgMC4wLCAwLjAsCisJCQkJIDAuMCwgMC4wLCAwLjAsIDAuMCB9OworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXR6ZXJvX3NpMjU2ICh2b2lkKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMjU2aSkoX192NGRpKXsgMCwgMCwgMCwgMCB9OworfQorCisvKiBDcmVhdGUgdGhlIHZlY3RvciBbQSBCIEMgRF0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0X3BkIChkb3VibGUgX19BLCBkb3VibGUgX19CLCBkb3VibGUgX19DLCBkb3VibGUgX19EKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMjU2ZCl7IF9fRCwgX19DLCBfX0IsIF9fQSB9OworfQorCisvKiBDcmVhdGUgdGhlIHZlY3RvciBbQSBCIEMgRCBFIEYgRyBIXS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldF9wcyAoZmxvYXQgX19BLCBmbG9hdCBfX0IsIGZsb2F0IF9fQywgZmxvYXQgX19ELAorCSAgICAgICBmbG9hdCBfX0UsIGZsb2F0IF9fRiwgZmxvYXQgX19HLCBmbG9hdCBfX0gpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20yNTYpeyBfX0gsIF9fRywgX19GLCBfX0UsCisJCQkJIF9fRCwgX19DLCBfX0IsIF9fQSB9OworfQorCisvKiBDcmVhdGUgdGhlIHZlY3RvciBbQSBCIEMgRCBFIEYgRyBIXS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXRfZXBpMzIgKGludCBfX0EsIGludCBfX0IsIGludCBfX0MsIGludCBfX0QsCisJCSAgaW50IF9fRSwgaW50IF9fRiwgaW50IF9fRywgaW50IF9fSCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTI1NmkpKF9fdjhzaSl7IF9fSCwgX19HLCBfX0YsIF9fRSwKKwkJCQkJICBfX0QsIF9fQywgX19CLCBfX0EgfTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0X2VwaTE2IChzaG9ydCBfX3ExNSwgc2hvcnQgX19xMTQsIHNob3J0IF9fcTEzLCBzaG9ydCBfX3ExMiwKKwkJICBzaG9ydCBfX3ExMSwgc2hvcnQgX19xMTAsIHNob3J0IF9fcTA5LCBzaG9ydCBfX3EwOCwKKwkJICBzaG9ydCBfX3EwNywgc2hvcnQgX19xMDYsIHNob3J0IF9fcTA1LCBzaG9ydCBfX3EwNCwKKwkJICBzaG9ydCBfX3EwMywgc2hvcnQgX19xMDIsIHNob3J0IF9fcTAxLCBzaG9ydCBfX3EwMCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTI1NmkpKF9fdjE2aGkpeworICAgIF9fcTAwLCBfX3EwMSwgX19xMDIsIF9fcTAzLCBfX3EwNCwgX19xMDUsIF9fcTA2LCBfX3EwNywKKyAgICBfX3EwOCwgX19xMDksIF9fcTEwLCBfX3ExMSwgX19xMTIsIF9fcTEzLCBfX3ExNCwgX19xMTUKKyAgfTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0X2VwaTggIChjaGFyIF9fcTMxLCBjaGFyIF9fcTMwLCBjaGFyIF9fcTI5LCBjaGFyIF9fcTI4LAorCQkgIGNoYXIgX19xMjcsIGNoYXIgX19xMjYsIGNoYXIgX19xMjUsIGNoYXIgX19xMjQsCisJCSAgY2hhciBfX3EyMywgY2hhciBfX3EyMiwgY2hhciBfX3EyMSwgY2hhciBfX3EyMCwKKwkJICBjaGFyIF9fcTE5LCBjaGFyIF9fcTE4LCBjaGFyIF9fcTE3LCBjaGFyIF9fcTE2LAorCQkgIGNoYXIgX19xMTUsIGNoYXIgX19xMTQsIGNoYXIgX19xMTMsIGNoYXIgX19xMTIsCisJCSAgY2hhciBfX3ExMSwgY2hhciBfX3ExMCwgY2hhciBfX3EwOSwgY2hhciBfX3EwOCwKKwkJICBjaGFyIF9fcTA3LCBjaGFyIF9fcTA2LCBjaGFyIF9fcTA1LCBjaGFyIF9fcTA0LAorCQkgIGNoYXIgX19xMDMsIGNoYXIgX19xMDIsIGNoYXIgX19xMDEsIGNoYXIgX19xMDApCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20yNTZpKShfX3YzMnFpKXsKKyAgICBfX3EwMCwgX19xMDEsIF9fcTAyLCBfX3EwMywgX19xMDQsIF9fcTA1LCBfX3EwNiwgX19xMDcsCisgICAgX19xMDgsIF9fcTA5LCBfX3ExMCwgX19xMTEsIF9fcTEyLCBfX3ExMywgX19xMTQsIF9fcTE1LAorICAgIF9fcTE2LCBfX3ExNywgX19xMTgsIF9fcTE5LCBfX3EyMCwgX19xMjEsIF9fcTIyLCBfX3EyMywKKyAgICBfX3EyNCwgX19xMjUsIF9fcTI2LCBfX3EyNywgX19xMjgsIF9fcTI5LCBfX3EzMCwgX19xMzEKKyAgfTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0X2VwaTY0eCAobG9uZyBsb25nIF9fQSwgbG9uZyBsb25nIF9fQiwgbG9uZyBsb25nIF9fQywKKwkJICAgbG9uZyBsb25nIF9fRCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTI1NmkpKF9fdjRkaSl7IF9fRCwgX19DLCBfX0IsIF9fQSB9OworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igd2l0aCBhbGwgZWxlbWVudHMgZXF1YWwgdG8gQS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXQxX3BkIChkb3VibGUgX19BKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMjU2ZCl7IF9fQSwgX19BLCBfX0EsIF9fQSB9OworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igd2l0aCBhbGwgZWxlbWVudHMgZXF1YWwgdG8gQS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldDFfcHMgKGZsb2F0IF9fQSkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTI1Nil7IF9fQSwgX19BLCBfX0EsIF9fQSwKKwkJCQkgX19BLCBfX0EsIF9fQSwgX19BIH07Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIGFsbCBlbGVtZW50cyBlcXVhbCB0byBBLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldDFfZXBpMzIgKGludCBfX0EpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20yNTZpKShfX3Y4c2kpeyBfX0EsIF9fQSwgX19BLCBfX0EsCisJCQkJCSAgX19BLCBfX0EsIF9fQSwgX19BIH07Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldDFfZXBpMTYgKHNob3J0IF9fQSkKK3sKKyAgcmV0dXJuIF9tbTI1Nl9zZXRfZXBpMTYgKF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLAorCQkJICAgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXQxX2VwaTggKGNoYXIgX19BKQoreworICByZXR1cm4gX21tMjU2X3NldF9lcGk4IChfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwKKwkJCSAgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsCisJCQkgIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLAorCQkJICBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldDFfZXBpNjR4IChsb25nIGxvbmcgX19BKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMjU2aSkoX192NGRpKXsgX19BLCBfX0EsIF9fQSwgX19BIH07Cit9CisKKy8qIENyZWF0ZSB2ZWN0b3JzIG9mIGVsZW1lbnRzIGluIHRoZSByZXZlcnNlZCBvcmRlciBmcm9tIHRoZQorICAgX21tMjU2X3NldF9YWFggZnVuY3Rpb25zLiAgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0cl9wZCAoZG91YmxlIF9fQSwgZG91YmxlIF9fQiwgZG91YmxlIF9fQywgZG91YmxlIF9fRCkKK3sKKyAgcmV0dXJuIF9tbTI1Nl9zZXRfcGQgKF9fRCwgX19DLCBfX0IsIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0cl9wcyAoZmxvYXQgX19BLCBmbG9hdCBfX0IsIGZsb2F0IF9fQywgZmxvYXQgX19ELAorCQlmbG9hdCBfX0UsIGZsb2F0IF9fRiwgZmxvYXQgX19HLCBmbG9hdCBfX0gpCit7CisgIHJldHVybiBfbW0yNTZfc2V0X3BzIChfX0gsIF9fRywgX19GLCBfX0UsIF9fRCwgX19DLCBfX0IsIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldHJfZXBpMzIgKGludCBfX0EsIGludCBfX0IsIGludCBfX0MsIGludCBfX0QsCisJCSAgIGludCBfX0UsIGludCBfX0YsIGludCBfX0csIGludCBfX0gpCit7CisgIHJldHVybiBfbW0yNTZfc2V0X2VwaTMyIChfX0gsIF9fRywgX19GLCBfX0UsIF9fRCwgX19DLCBfX0IsIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldHJfZXBpMTYgKHNob3J0IF9fcTE1LCBzaG9ydCBfX3ExNCwgc2hvcnQgX19xMTMsIHNob3J0IF9fcTEyLAorCQkgICBzaG9ydCBfX3ExMSwgc2hvcnQgX19xMTAsIHNob3J0IF9fcTA5LCBzaG9ydCBfX3EwOCwKKwkJICAgc2hvcnQgX19xMDcsIHNob3J0IF9fcTA2LCBzaG9ydCBfX3EwNSwgc2hvcnQgX19xMDQsCisJCSAgIHNob3J0IF9fcTAzLCBzaG9ydCBfX3EwMiwgc2hvcnQgX19xMDEsIHNob3J0IF9fcTAwKQoreworICByZXR1cm4gX21tMjU2X3NldF9lcGkxNiAoX19xMDAsIF9fcTAxLCBfX3EwMiwgX19xMDMsCisJCQkgICBfX3EwNCwgX19xMDUsIF9fcTA2LCBfX3EwNywKKwkJCSAgIF9fcTA4LCBfX3EwOSwgX19xMTAsIF9fcTExLAorCQkJICAgX19xMTIsIF9fcTEzLCBfX3ExNCwgX19xMTUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXRyX2VwaTggIChjaGFyIF9fcTMxLCBjaGFyIF9fcTMwLCBjaGFyIF9fcTI5LCBjaGFyIF9fcTI4LAorCQkgICBjaGFyIF9fcTI3LCBjaGFyIF9fcTI2LCBjaGFyIF9fcTI1LCBjaGFyIF9fcTI0LAorCQkgICBjaGFyIF9fcTIzLCBjaGFyIF9fcTIyLCBjaGFyIF9fcTIxLCBjaGFyIF9fcTIwLAorCQkgICBjaGFyIF9fcTE5LCBjaGFyIF9fcTE4LCBjaGFyIF9fcTE3LCBjaGFyIF9fcTE2LAorCQkgICBjaGFyIF9fcTE1LCBjaGFyIF9fcTE0LCBjaGFyIF9fcTEzLCBjaGFyIF9fcTEyLAorCQkgICBjaGFyIF9fcTExLCBjaGFyIF9fcTEwLCBjaGFyIF9fcTA5LCBjaGFyIF9fcTA4LAorCQkgICBjaGFyIF9fcTA3LCBjaGFyIF9fcTA2LCBjaGFyIF9fcTA1LCBjaGFyIF9fcTA0LAorCQkgICBjaGFyIF9fcTAzLCBjaGFyIF9fcTAyLCBjaGFyIF9fcTAxLCBjaGFyIF9fcTAwKQoreworICByZXR1cm4gX21tMjU2X3NldF9lcGk4IChfX3EwMCwgX19xMDEsIF9fcTAyLCBfX3EwMywKKwkJCSAgX19xMDQsIF9fcTA1LCBfX3EwNiwgX19xMDcsCisJCQkgIF9fcTA4LCBfX3EwOSwgX19xMTAsIF9fcTExLAorCQkJICBfX3ExMiwgX19xMTMsIF9fcTE0LCBfX3ExNSwKKwkJCSAgX19xMTYsIF9fcTE3LCBfX3ExOCwgX19xMTksCisJCQkgIF9fcTIwLCBfX3EyMSwgX19xMjIsIF9fcTIzLAorCQkJICBfX3EyNCwgX19xMjUsIF9fcTI2LCBfX3EyNywKKwkJCSAgX19xMjgsIF9fcTI5LCBfX3EzMCwgX19xMzEpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXRyX2VwaTY0eCAobG9uZyBsb25nIF9fQSwgbG9uZyBsb25nIF9fQiwgbG9uZyBsb25nIF9fQywKKwkJICAgIGxvbmcgbG9uZyBfX0QpCit7CisgIHJldHVybiBfbW0yNTZfc2V0X2VwaTY0eCAoX19ELCBfX0MsIF9fQiwgX19BKTsKK30KKworLyogQ2FzdHMgYmV0d2VlbiB2YXJpb3VzIFNQLCBEUCwgSU5UIHZlY3RvciB0eXBlcy4gIE5vdGUgdGhhdCB0aGVzZSBkbyBubworICAgY29udmVyc2lvbiBvZiB2YWx1ZXMsIHRoZXkganVzdCBjaGFuZ2UgdGhlIHR5cGUuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jYXN0cGRfcHMgKF9fbTI1NmQgX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jYXN0cGRfc2kyNTYgKF9fbTI1NmQgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY2FzdHBzX3BkIChfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY2FzdHBzX3NpMjU2KF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Nhc3RzaTI1Nl9wcyAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Nhc3RzaTI1Nl9wZCAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jYXN0cGQyNTZfcGQxMjggKF9fbTI1NmQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3BkX3BkMjU2ICgoX192NGRmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY2FzdHBzMjU2X3BzMTI4IChfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcHNfcHMyNTYgKChfX3Y4c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY2FzdHNpMjU2X3NpMTI4IChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9zaV9zaTI1NiAoKF9fdjhzaSlfX0EpOworfQorCisvKiBXaGVuIGNhc3QgaXMgZG9uZSBmcm9tIGEgMTI4IHRvIDI1Ni1iaXQgdHlwZSwgdGhlIGxvdyAxMjggYml0cyBvZgorICAgdGhlIDI1Ni1iaXQgcmVzdWx0IGNvbnRhaW4gc291cmNlIHBhcmFtZXRlciB2YWx1ZSBhbmQgdGhlIHVwcGVyIDEyOAorICAgYml0cyBvZiB0aGUgcmVzdWx0IGFyZSB1bmRlZmluZWQuICBUaG9zZSBpbnRyaW5zaWNzIHNob3VsZG4ndAorICAgZ2VuZXJhdGUgYW55IGV4dHJhIG1vdmVzLiAgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY2FzdHBkMTI4X3BkMjU2IChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9wZDI1Nl9wZCAoKF9fdjJkZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Nhc3RwczEyOF9wczI1NiAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3BzMjU2X3BzICgoX192NHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Nhc3RzaTEyOF9zaTI1NiAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfc2kyNTZfc2kgKChfX3Y0c2kpX19BKTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2JtaTJpbnRyaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2JtaTJpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjllYTIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYm1pMmludHJpbi5oCkBAIC0wLDAgKzEsMTAyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmICFkZWZpbmVkIF9YODZJTlRSSU5fSF9JTkNMVURFRCAmJiAhZGVmaW5lZCBfSU1NSU5UUklOX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Ym1pMmludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19CTUkyX18KKyMgZXJyb3IgIkJNSTIgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2VuZGlmIC8qIF9fQk1JMl9fICovCisKKyNpZm5kZWYgX0JNSTJJTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfQk1JMklOVFJJTl9IX0lOQ0xVREVECisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX2J6aGlfdTMyICh1bnNpZ25lZCBpbnQgX19YLCB1bnNpZ25lZCBpbnQgX19ZKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfYnpoaV9zaSAoX19YLCBfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19wZGVwX3UzMiAodW5zaWduZWQgaW50IF9fWCwgdW5zaWduZWQgaW50IF9fWSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BkZXBfc2kgKF9fWCwgX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfcGV4dF91MzIgKHVuc2lnbmVkIGludCBfX1gsIHVuc2lnbmVkIGludCBfX1kpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wZXh0X3NpIChfX1gsIF9fWSk7Cit9CisKKyNpZmRlZiAgX194ODZfNjRfXworCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19iemhpX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCwgdW5zaWduZWQgbG9uZyBsb25nIF9fWSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2J6aGlfZGkgKF9fWCwgX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfcGRlcF91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX1kpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wZGVwX2RpIChfX1gsIF9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3BleHRfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCB1bnNpZ25lZCBsb25nIGxvbmcgX19ZKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGV4dF9kaSAoX19YLCBfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tdWx4X3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCwgdW5zaWduZWQgbG9uZyBsb25nIF9fWSwKKwkgICB1bnNpZ25lZCBsb25nIGxvbmcgKl9fUCkKK3sKKyAgdW5zaWduZWQgX19pbnQxMjggX19yZXMgPSAodW5zaWduZWQgX19pbnQxMjgpIF9fWCAqIF9fWTsKKyAgKl9fUCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpIChfX3JlcyA+PiA2NCk7CisgIHJldHVybiAodW5zaWduZWQgbG9uZyBsb25nKSBfX3JlczsKK30KKworI2Vsc2UgLyogIV9feDg2XzY0X18gKi8KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbXVseF91MzIgKHVuc2lnbmVkIGludCBfX1gsIHVuc2lnbmVkIGludCBfX1ksIHVuc2lnbmVkIGludCAqX19QKQoreworICB1bnNpZ25lZCBsb25nIGxvbmcgX19yZXMgPSAodW5zaWduZWQgbG9uZyBsb25nKSBfX1ggKiBfX1k7CisgICpfX1AgPSAodW5zaWduZWQgaW50KSAoX19yZXMgPj4gMzIpOworICByZXR1cm4gKHVuc2lnbmVkIGludCkgX19yZXM7Cit9CisKKyNlbmRpZiAvKiAhX194ODZfNjRfXyAgKi8KKworI2VuZGlmIC8qIF9CTUkySU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2JtaWludHJpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYm1paW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3ZjJlYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2JtaWludHJpbi5oCkBAIC0wLDAgKzEsMTc3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmICFkZWZpbmVkIF9YODZJTlRSSU5fSF9JTkNMVURFRCAmJiAhZGVmaW5lZCBfSU1NSU5UUklOX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Ym1paW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX0JNSV9fCisjIGVycm9yICJCTUkgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2VuZGlmIC8qIF9fQk1JX18gKi8KKworI2lmbmRlZiBfQk1JSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX0JNSUlOVFJJTl9IX0lOQ0xVREVECisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBzaG9ydCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fdHpjbnRfdTE2ICh1bnNpZ25lZCBzaG9ydCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY3R6cyAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYW5kbl91MzIgKHVuc2lnbmVkIGludCBfX1gsIHVuc2lnbmVkIGludCBfX1kpCit7CisgIHJldHVybiB+X19YICYgX19ZOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19iZXh0cl91MzIgKHVuc2lnbmVkIGludCBfX1gsIHVuc2lnbmVkIGludCBfX1kpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9iZXh0cl91MzIgKF9fWCwgX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19iZXh0cl91MzIgKHVuc2lnbmVkIGludCBfX1gsIHVuc2lnbmVkIGludCBfX1ksIHVuc2lnbmVkIF9fWikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2JleHRyX3UzMiAoX19YLCAoKF9fWSAmIDB4ZmYpIHwgKChfX1ogJiAweGZmKSA8PCA4KSkpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibHNpX3UzMiAodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fWCAmIC1fX1g7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfYmxzaV91MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX2Jsc2lfdTMyIChfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibHNtc2tfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19YIF4gKF9fWCAtIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX2Jsc21za191MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX2Jsc21za191MzIgKF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2Jsc3JfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19YICYgKF9fWCAtIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX2Jsc3JfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19ibHNyX3UzMiAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fdHpjbnRfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19idWlsdGluX2N0eiAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK190emNudF91MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY3R6IChfX1gpOworfQorCisKKyNpZmRlZiAgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYW5kbl91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX1kpCit7CisgIHJldHVybiB+X19YICYgX19ZOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19iZXh0cl91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX1kpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9iZXh0cl91NjQgKF9fWCwgX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19iZXh0cl91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gsIHVuc2lnbmVkIGludCBfX1ksIHVuc2lnbmVkIGludCBfX1opCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9iZXh0cl91NjQgKF9fWCwgKChfX1kgJiAweGZmKSB8ICgoX19aICYgMHhmZikgPDwgOCkpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxzaV91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX1ggJiAtX19YOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX2Jsc2lfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICByZXR1cm4gX19ibHNpX3U2NCAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxzbXNrX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fWCBeIChfX1ggLSAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19ibHNtc2tfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICByZXR1cm4gX19ibHNtc2tfdTY0IChfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibHNyX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fWCAmIChfX1ggLSAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19ibHNyX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fYmxzcl91NjQgKF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3R6Y250X3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9jdHpsbCAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK190emNudF91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY3R6bGwgKF9fWCk7Cit9CisKKyNlbmRpZiAvKiBfX3g4Nl82NF9fICAqLworCisjZW5kaWYgLyogX0JNSUlOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9ibW1pbnRyaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2JtbWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjhjZWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9ibW1pbnRyaW4uaApAQCAtMCwwICsxLDI5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfQk1NSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX0JNTUlOVFJJTl9IX0lOQ0xVREVECisKKyMgZXJyb3IgIlNTRTUgaW5zdHJ1Y3Rpb24gc2V0IHJlbW92ZWQgZnJvbSBjb21waWxlciIKKworI2VuZGlmIC8qIF9CTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvY3B1aWQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2NwdWlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlMWViYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2NwdWlkLmgKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAqIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAqIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICogYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAqIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICogPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKy8qICVlY3ggKi8KKyNkZWZpbmUgYml0X1NTRTMJKDEgPDwgMCkKKyNkZWZpbmUgYml0X1BDTE1VTAkoMSA8PCAxKQorI2RlZmluZSBiaXRfTFpDTlQJKDEgPDwgNSkKKyNkZWZpbmUgYml0X1NTU0UzCSgxIDw8IDkpCisjZGVmaW5lIGJpdF9GTUEJCSgxIDw8IDEyKQorI2RlZmluZSBiaXRfQ01QWENIRzE2QgkoMSA8PCAxMykKKyNkZWZpbmUgYml0X1NTRTRfMQkoMSA8PCAxOSkKKyNkZWZpbmUgYml0X1NTRTRfMgkoMSA8PCAyMCkKKyNkZWZpbmUgYml0X01PVkJFCSgxIDw8IDIyKQorI2RlZmluZSBiaXRfUE9QQ05UCSgxIDw8IDIzKQorI2RlZmluZSBiaXRfQUVTCQkoMSA8PCAyNSkKKyNkZWZpbmUgYml0X1hTQVZFCSgxIDw8IDI2KQorI2RlZmluZSBiaXRfT1NYU0FWRQkoMSA8PCAyNykKKyNkZWZpbmUgYml0X0FWWAkJKDEgPDwgMjgpCisjZGVmaW5lIGJpdF9GMTZDCSgxIDw8IDI5KQorI2RlZmluZSBiaXRfUkRSTkQJKDEgPDwgMzApCisKKy8qICVlZHggKi8KKyNkZWZpbmUgYml0X0NNUFhDSEc4QgkoMSA8PCA4KQorI2RlZmluZSBiaXRfQ01PVgkoMSA8PCAxNSkKKyNkZWZpbmUgYml0X01NWAkJKDEgPDwgMjMpCisjZGVmaW5lIGJpdF9GWFNBVkUJKDEgPDwgMjQpCisjZGVmaW5lIGJpdF9TU0UJCSgxIDw8IDI1KQorI2RlZmluZSBiaXRfU1NFMgkoMSA8PCAyNikKKworLyogRXh0ZW5kZWQgRmVhdHVyZXMgKi8KKy8qICVlY3ggKi8KKyNkZWZpbmUgYml0X0xBSEZfTE0JKDEgPDwgMCkKKyNkZWZpbmUgYml0X0FCTQkJKDEgPDwgNSkKKyNkZWZpbmUgYml0X1NTRTRhCSgxIDw8IDYpCisjZGVmaW5lIGJpdF9QUkZDSFcJKDEgPDwgOCkKKyNkZWZpbmUgYml0X1hPUCAgICAgICAgICgxIDw8IDExKQorI2RlZmluZSBiaXRfTFdQIAkoMSA8PCAxNSkKKyNkZWZpbmUgYml0X0ZNQTQgICAgICAgICgxIDw8IDE2KQorI2RlZmluZSBiaXRfVEJNICAgICAgICAgKDEgPDwgMjEpCisKKy8qICVlZHggKi8KKyNkZWZpbmUgYml0X01NWEVYVAkoMSA8PCAyMikKKyNkZWZpbmUgYml0X0xNCQkoMSA8PCAyOSkKKyNkZWZpbmUgYml0XzNETk9XUAkoMSA8PCAzMCkKKyNkZWZpbmUgYml0XzNETk9XCSgxIDw8IDMxKQorCisvKiBFeHRlbmRlZCBGZWF0dXJlcyAoJWVheCA9PSA3KSAqLworI2RlZmluZSBiaXRfRlNHU0JBU0UJKDEgPDwgMCkKKyNkZWZpbmUgYml0X0JNSQkoMSA8PCAzKQorI2RlZmluZSBiaXRfSExFCSgxIDw8IDQpCisjZGVmaW5lIGJpdF9BVlgyCSgxIDw8IDUpCisjZGVmaW5lIGJpdF9CTUkyCSgxIDw8IDgpCisjZGVmaW5lIGJpdF9SVE0JKDEgPDwgMTEpCisjZGVmaW5lIGJpdF9SRFNFRUQJKDEgPDwgMTgpCisjZGVmaW5lIGJpdF9BRFgJKDEgPDwgMTkpCisKKy8qIEV4dGVuZGVkIFN0YXRlIEVudW1lcmF0aW9uIFN1Yi1sZWFmICglZWF4ID09IDEzLCAlZWN4ID09IDEpICovCisjZGVmaW5lIGJpdF9YU0FWRU9QVAkoMSA8PCAwKQorCisvKiBTaWduYXR1cmVzIGZvciBkaWZmZXJlbnQgQ1BVIGltcGxlbWVudGF0aW9ucyBhcyByZXR1cm5lZCBpbiB1c2VzCisgICBvZiBjcHVpZCB3aXRoIGxldmVsIDAuICAqLworI2RlZmluZSBzaWduYXR1cmVfQU1EX2VieAkweDY4NzQ3NTQxCisjZGVmaW5lIHNpZ25hdHVyZV9BTURfZWN4CTB4NDQ0ZDQxNjMKKyNkZWZpbmUgc2lnbmF0dXJlX0FNRF9lZHgJMHg2OTc0NmU2NQorCisjZGVmaW5lIHNpZ25hdHVyZV9DRU5UQVVSX2VieAkweDc0NmU2NTQzCisjZGVmaW5lIHNpZ25hdHVyZV9DRU5UQVVSX2VjeAkweDczNmM3NTYxCisjZGVmaW5lIHNpZ25hdHVyZV9DRU5UQVVSX2VkeAkweDQ4NzI3NTYxCisKKyNkZWZpbmUgc2lnbmF0dXJlX0NZUklYX2VieAkweDY5NzI3OTQzCisjZGVmaW5lIHNpZ25hdHVyZV9DWVJJWF9lY3gJMHg2NDYxNjU3NAorI2RlZmluZSBzaWduYXR1cmVfQ1lSSVhfZWR4CTB4NzM2ZTQ5NzgKKworI2RlZmluZSBzaWduYXR1cmVfSU5URUxfZWJ4CTB4NzU2ZTY1NDcKKyNkZWZpbmUgc2lnbmF0dXJlX0lOVEVMX2VjeAkweDZjNjU3NDZlCisjZGVmaW5lIHNpZ25hdHVyZV9JTlRFTF9lZHgJMHg0OTY1NmU2OQorCisjZGVmaW5lIHNpZ25hdHVyZV9UTTFfZWJ4CTB4NmU2MTcyNTQKKyNkZWZpbmUgc2lnbmF0dXJlX1RNMV9lY3gJMHg1NTUwNDM2MQorI2RlZmluZSBzaWduYXR1cmVfVE0xX2VkeAkweDc0NjU2ZDczCisKKyNkZWZpbmUgc2lnbmF0dXJlX1RNMl9lYngJMHg3NTZlNjU0NworI2RlZmluZSBzaWduYXR1cmVfVE0yX2VjeAkweDM2Mzg3ODRkCisjZGVmaW5lIHNpZ25hdHVyZV9UTTJfZWR4CTB4NTQ2NTZlNjkKKworI2RlZmluZSBzaWduYXR1cmVfTlNDX2VieAkweDY0NmY2NTQ3CisjZGVmaW5lIHNpZ25hdHVyZV9OU0NfZWN4CTB4NDM1MzRlMjAKKyNkZWZpbmUgc2lnbmF0dXJlX05TQ19lZHgJMHg3OTYyMjA2NQorCisjZGVmaW5lIHNpZ25hdHVyZV9ORVhHRU5fZWJ4CTB4NDc3ODY1NGUKKyNkZWZpbmUgc2lnbmF0dXJlX05FWEdFTl9lY3gJMHg2ZTY1NzY2OQorI2RlZmluZSBzaWduYXR1cmVfTkVYR0VOX2VkeAkweDcyNDQ2ZTY1CisKKyNkZWZpbmUgc2lnbmF0dXJlX1JJU0VfZWJ4CTB4NjU3MzY5NTIKKyNkZWZpbmUgc2lnbmF0dXJlX1JJU0VfZWN4CTB4NjU3MzY5NTIKKyNkZWZpbmUgc2lnbmF0dXJlX1JJU0VfZWR4CTB4NjU3MzY5NTIKKworI2RlZmluZSBzaWduYXR1cmVfU0lTX2VieAkweDIwNTM2OTUzCisjZGVmaW5lIHNpZ25hdHVyZV9TSVNfZWN4CTB4MjA1MzY5NTMKKyNkZWZpbmUgc2lnbmF0dXJlX1NJU19lZHgJMHgyMDUzNjk1MworCisjZGVmaW5lIHNpZ25hdHVyZV9VTUNfZWJ4CTB4MjA0MzRkNTUKKyNkZWZpbmUgc2lnbmF0dXJlX1VNQ19lY3gJMHgyMDQzNGQ1NQorI2RlZmluZSBzaWduYXR1cmVfVU1DX2VkeAkweDIwNDM0ZDU1CisKKyNkZWZpbmUgc2lnbmF0dXJlX1ZJQV9lYngJMHgyMDQxNDk1NgorI2RlZmluZSBzaWduYXR1cmVfVklBX2VjeAkweDIwNDE0OTU2CisjZGVmaW5lIHNpZ25hdHVyZV9WSUFfZWR4CTB4MjA0MTQ5NTYKKworI2RlZmluZSBzaWduYXR1cmVfVk9SVEVYX2VieAkweDc0NzI2ZjU2CisjZGVmaW5lIHNpZ25hdHVyZV9WT1JURVhfZWN4CTB4NDM2ZjUzMjAKKyNkZWZpbmUgc2lnbmF0dXJlX1ZPUlRFWF9lZHgJMHgzNjM4Nzg2NQorCisjaWYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChfX1BJQ19fKQorLyogJWVieCBtYXkgYmUgdGhlIFBJQyByZWdpc3Rlci4gICovCisjaWYgX19HTlVDX18gPj0gMworI2RlZmluZSBfX2NwdWlkKGxldmVsLCBhLCBiLCBjLCBkKQkJCVwKKyAgX19hc21fXyAoInhjaGd7bH1cdHslJX1lYngsICVrMVxuXHQiCQkJXAorCSAgICJjcHVpZFxuXHQiCQkJCQlcCisJICAgInhjaGd7bH1cdHslJX1lYngsICVrMVxuXHQiCQkJXAorCSAgIDogIj1hIiAoYSksICI9JnIiIChiKSwgIj1jIiAoYyksICI9ZCIgKGQpCVwKKwkgICA6ICIwIiAobGV2ZWwpKQorCisjZGVmaW5lIF9fY3B1aWRfY291bnQobGV2ZWwsIGNvdW50LCBhLCBiLCBjLCBkKQkJXAorICBfX2FzbV9fICgieGNoZ3tsfVx0eyUlfWVieCwgJWsxXG5cdCIJCQlcCisJICAgImNwdWlkXG5cdCIJCQkJCVwKKwkgICAieGNoZ3tsfVx0eyUlfWVieCwgJWsxXG5cdCIJCQlcCisJICAgOiAiPWEiIChhKSwgIj0mciIgKGIpLCAiPWMiIChjKSwgIj1kIiAoZCkJXAorCSAgIDogIjAiIChsZXZlbCksICIyIiAoY291bnQpKQorI2Vsc2UKKy8qIEhvc3QgR0NDcyBvbGRlciB0aGFuIDMuMCB3ZXJlbid0IHN1cHBvcnRpbmcgSW50ZWwgYXNtIHN5bnRheAorICAgbm9yIGFsdGVybmF0aXZlcyBpbiBpMzg2IGNvZGUuICAqLworI2RlZmluZSBfX2NwdWlkKGxldmVsLCBhLCBiLCBjLCBkKQkJCVwKKyAgX19hc21fXyAoInhjaGdsXHQlJWVieCwgJWsxXG5cdCIJCQlcCisJICAgImNwdWlkXG5cdCIJCQkJCVwKKwkgICAieGNoZ2xcdCUlZWJ4LCAlazFcblx0IgkJCVwKKwkgICA6ICI9YSIgKGEpLCAiPSZyIiAoYiksICI9YyIgKGMpLCAiPWQiIChkKQlcCisJICAgOiAiMCIgKGxldmVsKSkKKworI2RlZmluZSBfX2NwdWlkX2NvdW50KGxldmVsLCBjb3VudCwgYSwgYiwgYywgZCkJCVwKKyAgX19hc21fXyAoInhjaGdsXHQlJWVieCwgJWsxXG5cdCIJCQlcCisJICAgImNwdWlkXG5cdCIJCQkJCVwKKwkgICAieGNoZ2xcdCUlZWJ4LCAlazFcblx0IgkJCVwKKwkgICA6ICI9YSIgKGEpLCAiPSZyIiAoYiksICI9YyIgKGMpLCAiPWQiIChkKQlcCisJICAgOiAiMCIgKGxldmVsKSwgIjIiIChjb3VudCkpCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykgJiYgKGRlZmluZWQoX19jb2RlX21vZGVsX21lZGl1bV9fKSB8fCBkZWZpbmVkKF9fY29kZV9tb2RlbF9sYXJnZV9fKSkgJiYgZGVmaW5lZChfX1BJQ19fKQorLyogJXJieCBtYXkgYmUgdGhlIFBJQyByZWdpc3Rlci4gICovCisjZGVmaW5lIF9fY3B1aWQobGV2ZWwsIGEsIGIsIGMsIGQpCQkJXAorICBfX2FzbV9fICgieGNoZ3txfVx0eyUlfXJieCwgJXExXG5cdCIJCQlcCisJICAgImNwdWlkXG5cdCIJCQkJCVwKKwkgICAieGNoZ3txfVx0eyUlfXJieCwgJXExXG5cdCIJCQlcCisJICAgOiAiPWEiIChhKSwgIj0mciIgKGIpLCAiPWMiIChjKSwgIj1kIiAoZCkJXAorCSAgIDogIjAiIChsZXZlbCkpCisKKyNkZWZpbmUgX19jcHVpZF9jb3VudChsZXZlbCwgY291bnQsIGEsIGIsIGMsIGQpCQlcCisgIF9fYXNtX18gKCJ4Y2hne3F9XHR7JSV9cmJ4LCAlcTFcblx0IgkJCVwKKwkgICAiY3B1aWRcblx0IgkJCQkJXAorCSAgICJ4Y2hne3F9XHR7JSV9cmJ4LCAlcTFcblx0IgkJCVwKKwkgICA6ICI9YSIgKGEpLCAiPSZyIiAoYiksICI9YyIgKGMpLCAiPWQiIChkKQlcCisJICAgOiAiMCIgKGxldmVsKSwgIjIiIChjb3VudCkpCisjZWxzZQorI2RlZmluZSBfX2NwdWlkKGxldmVsLCBhLCBiLCBjLCBkKQkJCVwKKyAgX19hc21fXyAoImNwdWlkXG5cdCIJCQkJCVwKKwkgICA6ICI9YSIgKGEpLCAiPWIiIChiKSwgIj1jIiAoYyksICI9ZCIgKGQpCVwKKwkgICA6ICIwIiAobGV2ZWwpKQorCisjZGVmaW5lIF9fY3B1aWRfY291bnQobGV2ZWwsIGNvdW50LCBhLCBiLCBjLCBkKQkJXAorICBfX2FzbV9fICgiY3B1aWRcblx0IgkJCQkJXAorCSAgIDogIj1hIiAoYSksICI9YiIgKGIpLCAiPWMiIChjKSwgIj1kIiAoZCkJXAorCSAgIDogIjAiIChsZXZlbCksICIyIiAoY291bnQpKQorI2VuZGlmCisKKy8qIFJldHVybiBoaWdoZXN0IHN1cHBvcnRlZCBpbnB1dCB2YWx1ZSBmb3IgY3B1aWQgaW5zdHJ1Y3Rpb24uICBleHQgY2FuCisgICBiZSBlaXRoZXIgMHgwIG9yIDB4ODAwMDAwMCB0byByZXR1cm4gaGlnaGVzdCBzdXBwb3J0ZWQgdmFsdWUgZm9yCisgICBiYXNpYyBvciBleHRlbmRlZCBjcHVpZCBpbmZvcm1hdGlvbi4gIEZ1bmN0aW9uIHJldHVybnMgMCBpZiBjcHVpZAorICAgaXMgbm90IHN1cHBvcnRlZCBvciB3aGF0ZXZlciBjcHVpZCByZXR1cm5zIGluIGVheCByZWdpc3Rlci4gIElmIHNpZworICAgcG9pbnRlciBpcyBub24tbnVsbCwgdGhlbiBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSBzaWduYXR1cmUKKyAgIChhcyBmb3VuZCBpbiBlYnggcmVnaXN0ZXIpIGFyZSByZXR1cm5lZCBpbiBsb2NhdGlvbiBwb2ludGVkIGJ5IHNpZy4gICovCisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fZ2V0X2NwdWlkX21heCAodW5zaWduZWQgaW50IF9fZXh0LCB1bnNpZ25lZCBpbnQgKl9fc2lnKQoreworICB1bnNpZ25lZCBpbnQgX19lYXgsIF9fZWJ4LCBfX2VjeCwgX19lZHg7CisKKyNpZm5kZWYgX194ODZfNjRfXworICAvKiBTZWUgaWYgd2UgY2FuIHVzZSBjcHVpZC4gIE9uIEFNRDY0IHdlIGFsd2F5cyBjYW4uICAqLworI2lmIF9fR05VQ19fID49IDMKKyAgX19hc21fXyAoInB1c2hme2x8ZH1cblx0IgorCSAgICJwdXNoZntsfGR9XG5cdCIKKwkgICAicG9we2x9XHQlMFxuXHQiCisJICAgIm1vdntsfVx0eyUwLCAlMXwlMSwgJTB9XG5cdCIKKwkgICAieG9ye2x9XHR7JTIsICUwfCUwLCAlMn1cblx0IgorCSAgICJwdXNoe2x9XHQlMFxuXHQiCisJICAgInBvcGZ7bHxkfVxuXHQiCisJICAgInB1c2hme2x8ZH1cblx0IgorCSAgICJwb3B7bH1cdCUwXG5cdCIKKwkgICAicG9wZntsfGR9XG5cdCIKKwkgICA6ICI9JnIiIChfX2VheCksICI9JnIiIChfX2VieCkKKwkgICA6ICJpIiAoMHgwMDIwMDAwMCkpOworI2Vsc2UKKy8qIEhvc3QgR0NDcyBvbGRlciB0aGFuIDMuMCB3ZXJlbid0IHN1cHBvcnRpbmcgSW50ZWwgYXNtIHN5bnRheAorICAgbm9yIGFsdGVybmF0aXZlcyBpbiBpMzg2IGNvZGUuICAqLworICBfX2FzbV9fICgicHVzaGZsXG5cdCIKKwkgICAicHVzaGZsXG5cdCIKKwkgICAicG9wbFx0JTBcblx0IgorCSAgICJtb3ZsXHQlMCwgJTFcblx0IgorCSAgICJ4b3JsXHQlMiwgJTBcblx0IgorCSAgICJwdXNobFx0JTBcblx0IgorCSAgICJwb3BmbFxuXHQiCisJICAgInB1c2hmbFxuXHQiCisJICAgInBvcGxcdCUwXG5cdCIKKwkgICAicG9wZmxcblx0IgorCSAgIDogIj0mciIgKF9fZWF4KSwgIj0mciIgKF9fZWJ4KQorCSAgIDogImkiICgweDAwMjAwMDAwKSk7CisjZW5kaWYKKworICBpZiAoISgoX19lYXggXiBfX2VieCkgJiAweDAwMjAwMDAwKSkKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorCisgIC8qIEhvc3Qgc3VwcG9ydHMgY3B1aWQuICBSZXR1cm4gaGlnaGVzdCBzdXBwb3J0ZWQgY3B1aWQgaW5wdXQgdmFsdWUuICAqLworICBfX2NwdWlkIChfX2V4dCwgX19lYXgsIF9fZWJ4LCBfX2VjeCwgX19lZHgpOworCisgIGlmIChfX3NpZykKKyAgICAqX19zaWcgPSBfX2VieDsKKworICByZXR1cm4gX19lYXg7Cit9CisKKy8qIFJldHVybiBjcHVpZCBkYXRhIGZvciByZXF1ZXN0ZWQgY3B1aWQgbGV2ZWwsIGFzIGZvdW5kIGluIHJldHVybmVkCisgICBlYXgsIGVieCwgZWN4IGFuZCBlZHggcmVnaXN0ZXJzLiAgVGhlIGZ1bmN0aW9uIGNoZWNrcyBpZiBjcHVpZCBpcworICAgc3VwcG9ydGVkIGFuZCByZXR1cm5zIDEgZm9yIHZhbGlkIGNwdWlkIGluZm9ybWF0aW9uIG9yIDAgZm9yCisgICB1bnN1cHBvcnRlZCBjcHVpZCBsZXZlbC4gIEFsbCBwb2ludGVycyBhcmUgcmVxdWlyZWQgdG8gYmUgbm9uLW51bGwuICAqLworCitzdGF0aWMgX19pbmxpbmUgaW50CitfX2dldF9jcHVpZCAodW5zaWduZWQgaW50IF9fbGV2ZWwsCisJICAgICB1bnNpZ25lZCBpbnQgKl9fZWF4LCB1bnNpZ25lZCBpbnQgKl9fZWJ4LAorCSAgICAgdW5zaWduZWQgaW50ICpfX2VjeCwgdW5zaWduZWQgaW50ICpfX2VkeCkKK3sKKyAgdW5zaWduZWQgaW50IF9fZXh0ID0gX19sZXZlbCAmIDB4ODAwMDAwMDA7CisKKyAgaWYgKF9fZ2V0X2NwdWlkX21heCAoX19leHQsIDApIDwgX19sZXZlbCkKKyAgICByZXR1cm4gMDsKKworICBfX2NwdWlkIChfX2xldmVsLCAqX19lYXgsICpfX2VieCwgKl9fZWN4LCAqX19lZHgpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2Nyb3NzLXN0ZGFyZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvY3Jvc3Mtc3RkYXJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzNGNmMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2Nyb3NzLXN0ZGFyZy5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9fQ1JPU1NfU1REQVJHX0hfSU5DTFVERUQKKyNkZWZpbmUgX19DUk9TU19TVERBUkdfSF9JTkNMVURFRAorCisvKiBNYWtlIHN1cmUgdGhhdCBmb3Igbm9uIHg2NCB0YXJnZXRzIGNyb3NzIGJ1aWx0aW5zIGFyZSBkZWZpbmVkLiAgKi8KKyNpZm5kZWYgX194ODZfNjRfXworLyogQ2FsbCBhYmkgbXNfYWJpLiAgKi8KKyNkZWZpbmUgX19idWlsdGluX21zX3ZhX2xpc3QgX19idWlsdGluX3ZhX2xpc3QKKyNkZWZpbmUgX19idWlsdGluX21zX3ZhX2NvcHkgX19idWlsdGluX3ZhX2NvcHkKKyNkZWZpbmUgX19idWlsdGluX21zX3ZhX3N0YXJ0IF9fYnVpbHRpbl92YV9zdGFydAorI2RlZmluZSBfX2J1aWx0aW5fbXNfdmFfZW5kIF9fYnVpbHRpbl92YV9lbmQKKworLyogQ2FsbCBhYmkgc3lzdl9hYmkuICAqLworI2RlZmluZSBfX2J1aWx0aW5fc3lzdl92YV9saXN0IF9fYnVpbHRpbl92YV9saXN0CisjZGVmaW5lIF9fYnVpbHRpbl9zeXN2X3ZhX2NvcHkgX19idWlsdGluX3ZhX2NvcHkKKyNkZWZpbmUgX19idWlsdGluX3N5c3ZfdmFfc3RhcnQgX19idWlsdGluX3ZhX3N0YXJ0CisjZGVmaW5lIF9fYnVpbHRpbl9zeXN2X3ZhX2VuZCBfX2J1aWx0aW5fdmFfZW5kCisjZW5kaWYKKworI2RlZmluZSBfX21zX3ZhX2NvcHkoX19kLF9fcykgX19idWlsdGluX21zX3ZhX2NvcHkoX19kLF9fcykKKyNkZWZpbmUgX19tc192YV9zdGFydChfX3YsX19sKSBfX2J1aWx0aW5fbXNfdmFfc3RhcnQoX192LF9fbCkKKyNkZWZpbmUgX19tc192YV9hcmcoX192LF9fbCkJX19idWlsdGluX3ZhX2FyZyhfX3YsX19sKQorI2RlZmluZSBfX21zX3ZhX2VuZChfX3YpIF9fYnVpbHRpbl9tc192YV9lbmQoX192KQorCisjZGVmaW5lIF9fc3lzdl92YV9jb3B5KF9fZCxfX3MpIF9fYnVpbHRpbl9zeXN2X3ZhX2NvcHkoX19kLF9fcykKKyNkZWZpbmUgX19zeXN2X3ZhX3N0YXJ0KF9fdixfX2wpIF9fYnVpbHRpbl9zeXN2X3ZhX3N0YXJ0KF9fdixfX2wpCisjZGVmaW5lIF9fc3lzdl92YV9hcmcoX192LF9fbCkJX19idWlsdGluX3ZhX2FyZyhfX3YsX19sKQorI2RlZmluZSBfX3N5c3ZfdmFfZW5kKF9fdikgX19idWlsdGluX3N5c3ZfdmFfZW5kKF9fdikKKworI2lmbmRlZiBfX0dOVUNfU1lTVl9WQV9MSVNUCisjZGVmaW5lIF9fR05VQ19TWVNWX1ZBX0xJU1QKKyAgdHlwZWRlZiBfX2J1aWx0aW5fc3lzdl92YV9saXN0IF9fZ251Y19zeXN2X3ZhX2xpc3Q7CisjZW5kaWYKKworI2lmbmRlZiBfU1lTVl9WQV9MSVNUX0RFRklORUQKKyNkZWZpbmUgX1NZU1ZfVkFfTElTVF9ERUZJTkVECisgIHR5cGVkZWYgX19nbnVjX3N5c3ZfdmFfbGlzdCBzeXN2X3ZhX2xpc3Q7CisjZW5kaWYKKworI2lmbmRlZiBfX0dOVUNfTVNfVkFfTElTVAorI2RlZmluZSBfX0dOVUNfTVNfVkFfTElTVAorICB0eXBlZGVmIF9fYnVpbHRpbl9tc192YV9saXN0IF9fZ251Y19tc192YV9saXN0OworI2VuZGlmCisKKyNpZm5kZWYgX01TX1ZBX0xJU1RfREVGSU5FRAorI2RlZmluZSBfTVNfVkFfTElTVF9ERUZJTkVECisgIHR5cGVkZWYgX19nbnVjX21zX3ZhX2xpc3QgbXNfdmFfbGlzdDsKKyNlbmRpZgorCisjZW5kaWYgLyogX19DUk9TU19TVERBUkdfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvZW1taW50cmluLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9lbW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQwNGExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvZW1taW50cmluLmgKQEAgLTAsMCArMSwxNTIwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogSW1wbGVtZW50ZWQgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBpbmNsdWRlZCBpbiB0aGUgSW50ZWwgQysrIENvbXBpbGVyCisgICBVc2VyIEd1aWRlIGFuZCBSZWZlcmVuY2UsIHZlcnNpb24gOS4wLiAgKi8KKworI2lmbmRlZiBfRU1NSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX0VNTUlOVFJJTl9IX0lOQ0xVREVECisKKyNpZm5kZWYgX19TU0UyX18KKyMgZXJyb3IgIlNTRTIgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2Vsc2UKKworLyogV2UgbmVlZCBkZWZpbml0aW9ucyBmcm9tIHRoZSBTU0UgaGVhZGVyIGZpbGVzKi8KKyNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KKworLyogU1NFMiAqLwordHlwZWRlZiBkb3VibGUgX192MmRmIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSkpOwordHlwZWRlZiBsb25nIGxvbmcgX192MmRpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSkpOwordHlwZWRlZiBpbnQgX192NHNpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSkpOwordHlwZWRlZiBzaG9ydCBfX3Y4aGkgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpKSk7Cit0eXBlZGVmIGNoYXIgX192MTZxaSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsKKworLyogVGhlIEludGVsIEFQSSBpcyBmbGV4aWJsZSBlbm91Z2ggdGhhdCB3ZSBtdXN0IGFsbG93IGFsaWFzaW5nIHdpdGggb3RoZXIKKyAgIHZlY3RvciB0eXBlcywgYW5kIHRoZWlyIHNjYWxhciBjb21wb25lbnRzLiAgKi8KK3R5cGVkZWYgbG9uZyBsb25nIF9fbTEyOGkgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpLCBfX21heV9hbGlhc19fKSk7Cit0eXBlZGVmIGRvdWJsZSBfX20xMjhkIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSwgX19tYXlfYWxpYXNfXykpOworCisvKiBDcmVhdGUgYSBzZWxlY3RvciBmb3IgdXNlIHdpdGggdGhlIFNIVUZQRCBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIF9NTV9TSFVGRkxFMihmcDEsZnAwKSBcCisgKCgoZnAxKSA8PCAxKSB8IChmcDApKQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igd2l0aCBlbGVtZW50IDAgYXMgRiBhbmQgdGhlIHJlc3QgemVyby4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfc2QgKGRvdWJsZSBfX0YpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjhkKXsgX19GLCAwLjAgfTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggYm90aCBlbGVtZW50cyBlcXVhbCB0byBGLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldDFfcGQgKGRvdWJsZSBfX0YpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjhkKXsgX19GLCBfX0YgfTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X3BkMSAoZG91YmxlIF9fRikKK3sKKyAgcmV0dXJuIF9tbV9zZXQxX3BkIChfX0YpOworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igd2l0aCB0aGUgbG93ZXIgdmFsdWUgWCBhbmQgdXBwZXIgdmFsdWUgVy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfcGQgKGRvdWJsZSBfX1csIGRvdWJsZSBfX1gpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjhkKXsgX19YLCBfX1cgfTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggdGhlIGxvd2VyIHZhbHVlIFcgYW5kIHVwcGVyIHZhbHVlIFguICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0cl9wZCAoZG91YmxlIF9fVywgZG91YmxlIF9fWCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOGQpeyBfX1csIF9fWCB9OworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igb2YgemVyb3MuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0emVyb19wZCAodm9pZCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOGQpeyAwLjAsIDAuMCB9OworfQorCisvKiBTZXRzIHRoZSBsb3cgRFBGUCB2YWx1ZSBvZiBBIGZyb20gdGhlIGxvdyB2YWx1ZSBvZiBCLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdmVfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9tb3ZzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworLyogTG9hZCB0d28gRFBGUCB2YWx1ZXMgZnJvbSBQLiAgVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZF9wZCAoZG91YmxlIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAqKF9fbTEyOGQgKilfX1A7Cit9CisKKy8qIExvYWQgdHdvIERQRlAgdmFsdWVzIGZyb20gUC4gIFRoZSBhZGRyZXNzIG5lZWQgbm90IGJlIDE2LWJ5dGUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkdV9wZCAoZG91YmxlIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9sb2FkdXBkIChfX1ApOworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igd2l0aCBhbGwgdHdvIGVsZW1lbnRzIGVxdWFsIHRvICpQLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWQxX3BkIChkb3VibGUgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIF9tbV9zZXQxX3BkICgqX19QKTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggZWxlbWVudCAwIGFzICpQIGFuZCB0aGUgcmVzdCB6ZXJvLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRfc2QgKGRvdWJsZSBjb25zdCAqX19QKQoreworICByZXR1cm4gX21tX3NldF9zZCAoKl9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRfcGQxIChkb3VibGUgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIF9tbV9sb2FkMV9wZCAoX19QKTsKK30KKworLyogTG9hZCB0d28gRFBGUCB2YWx1ZXMgaW4gcmV2ZXJzZSBvcmRlci4gIFRoZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2Fkcl9wZCAoZG91YmxlIGNvbnN0ICpfX1ApCit7CisgIF9fbTEyOGQgX190bXAgPSBfbW1fbG9hZF9wZCAoX19QKTsKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3NodWZwZCAoX190bXAsIF9fdG1wLCBfTU1fU0hVRkZMRTIgKDAsMSkpOworfQorCisvKiBTdG9yZSB0d28gRFBGUCB2YWx1ZXMuICBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZV9wZCAoZG91YmxlICpfX1AsIF9fbTEyOGQgX19BKQoreworICAqKF9fbTEyOGQgKilfX1AgPSBfX0E7Cit9CisKKy8qIFN0b3JlIHR3byBEUEZQIHZhbHVlcy4gIFRoZSBhZGRyZXNzIG5lZWQgbm90IGJlIDE2LWJ5dGUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZXVfcGQgKGRvdWJsZSAqX19QLCBfX20xMjhkIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmV1cGQgKF9fUCwgX19BKTsKK30KKworLyogU3RvcmVzIHRoZSBsb3dlciBEUEZQIHZhbHVlLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3JlX3NkIChkb3VibGUgKl9fUCwgX19tMTI4ZCBfX0EpCit7CisgICpfX1AgPSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3YyZGYgKF9fQSwgMCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBkb3VibGUgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2RfZjY0IChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjJkZiAoX19BLCAwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVsX3BkIChkb3VibGUgKl9fUCwgX19tMTI4ZCBfX0EpCit7CisgIF9tbV9zdG9yZV9zZCAoX19QLCBfX0EpOworfQorCisvKiBTdG9yZXMgdGhlIHVwcGVyIERQRlAgdmFsdWUuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVoX3BkIChkb3VibGUgKl9fUCwgX19tMTI4ZCBfX0EpCit7CisgICpfX1AgPSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3YyZGYgKF9fQSwgMSk7Cit9CisKKy8qIFN0b3JlIHRoZSBsb3dlciBEUEZQIHZhbHVlIGFjcm9zcyB0d28gd29yZHMuCisgICBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZTFfcGQgKGRvdWJsZSAqX19QLCBfX20xMjhkIF9fQSkKK3sKKyAgX21tX3N0b3JlX3BkIChfX1AsIF9fYnVpbHRpbl9pYTMyX3NodWZwZCAoX19BLCBfX0EsIF9NTV9TSFVGRkxFMiAoMCwwKSkpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZV9wZDEgKGRvdWJsZSAqX19QLCBfX20xMjhkIF9fQSkKK3sKKyAgX21tX3N0b3JlMV9wZCAoX19QLCBfX0EpOworfQorCisvKiBTdG9yZSB0d28gRFBGUCB2YWx1ZXMgaW4gcmV2ZXJzZSBvcmRlci4gIFRoZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZXJfcGQgKGRvdWJsZSAqX19QLCBfX20xMjhkIF9fQSkKK3sKKyAgX21tX3N0b3JlX3BkIChfX1AsIF9fYnVpbHRpbl9pYTMyX3NodWZwZCAoX19BLCBfX0EsIF9NTV9TSFVGRkxFMiAoMCwxKSkpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpMTI4X3NpMzIgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdmVjX2V4dF92NHNpICgoX192NHNpKV9fQSwgMCk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCisvKiBJbnRlbCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTEyOF9zaTY0IChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjJkaSAoKF9fdjJkaSlfX0EsIDApOworfQorCisvKiBNaWNyb3NvZnQgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2kxMjhfc2k2NHggKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdmVjX2V4dF92MmRpICgoX192MmRpKV9fQSwgMCk7Cit9CisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9hZGRwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9hZGRzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3ViX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9zdWJwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3ViX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9zdWJzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9tdWxwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9tdWxzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZGl2X3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9kaXZwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZGl2X3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9kaXZzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3FydF9wZCAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9zcXJ0cGQgKChfX3YyZGYpX19BKTsKK30KKworLyogUmV0dXJuIHBhaXIge3NxcnQgKEFbMCksIEJbMV19LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NxcnRfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgX192MmRmIF9fdG1wID0gX19idWlsdGluX2lhMzJfbW92c2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9zcXJ0c2QgKChfX3YyZGYpX190bXApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX21pbnBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX21pbnNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXhfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX21heHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXhfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX21heHNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hbmRfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2FuZHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hbmRub3RfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2FuZG5wZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fb3JfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX29ycGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3hvcl9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfeG9ycGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVxX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBlcXBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBsdF9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbHRwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbGVfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcGxlcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGd0X3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBndHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBnZV9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wZ2VwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmVxX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBuZXFwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmx0X3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBubHRwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmxlX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBubGVwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmd0X3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBuZ3RwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmdlX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBuZ2VwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wb3JkX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBvcmRwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wdW5vcmRfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcHVub3JkcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVxX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBlcXNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBsdF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbHRzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbGVfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcGxlc2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGd0X3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbW92c2QgKChfX3YyZGYpIF9fQSwKKwkJCQkJIChfX3YyZGYpCisJCQkJCSBfX2J1aWx0aW5faWEzMl9jbXBsdHNkICgoX192MmRmKSBfX0IsCisJCQkJCQkJCSAoX192MmRmKQorCQkJCQkJCQkgX19BKSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGdlX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbW92c2QgKChfX3YyZGYpIF9fQSwKKwkJCQkJIChfX3YyZGYpCisJCQkJCSBfX2J1aWx0aW5faWEzMl9jbXBsZXNkICgoX192MmRmKSBfX0IsCisJCQkJCQkJCSAoX192MmRmKQorCQkJCQkJCQkgX19BKSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG5lcV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbmVxc2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG5sdF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbmx0c2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG5sZV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbmxlc2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG5ndF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX21vdnNkICgoX192MmRmKSBfX0EsCisJCQkJCSAoX192MmRmKQorCQkJCQkgX19idWlsdGluX2lhMzJfY21wbmx0c2QgKChfX3YyZGYpIF9fQiwKKwkJCQkJCQkJICAoX192MmRmKQorCQkJCQkJCQkgIF9fQSkpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBuZ2Vfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9tb3ZzZCAoKF9fdjJkZikgX19BLAorCQkJCQkgKF9fdjJkZikKKwkJCQkJIF9fYnVpbHRpbl9pYTMyX2NtcG5sZXNkICgoX192MmRmKSBfX0IsCisJCQkJCQkJCSAgKF9fdjJkZikKKwkJCQkJCQkJICBfX0EpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wb3JkX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBvcmRzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wdW5vcmRfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcHVub3Jkc2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29taWVxX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jb21pc2RlcSAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21pbHRfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlzZGx0ICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWlsZV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taXNkbGUgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29taWd0X3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jb21pc2RndCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21pZ2Vfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlzZGdlICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWluZXFfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlzZG5lcSAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWVxX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taXNkZXEgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdWNvbWlsdF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlzZGx0ICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Vjb21pbGVfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RsZSAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWd0X3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taXNkZ3QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdWNvbWlnZV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlzZGdlICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Vjb21pbmVxX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taXNkbmVxICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igb2YgUWksIHdoZXJlIGkgaXMgdGhlIGVsZW1lbnQgbnVtYmVyLiAgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X2VwaTY0eCAobG9uZyBsb25nIF9fcTEsIGxvbmcgbG9uZyBfX3EwKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMTI4aSkoX192MmRpKXsgX19xMCwgX19xMSB9OworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfZXBpNjQgKF9fbTY0IF9fcTEsICBfX202NCBfX3EwKQoreworICByZXR1cm4gX21tX3NldF9lcGk2NHggKChsb25nIGxvbmcpX19xMSwgKGxvbmcgbG9uZylfX3EwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X2VwaTMyIChpbnQgX19xMywgaW50IF9fcTIsIGludCBfX3ExLCBpbnQgX19xMCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOGkpKF9fdjRzaSl7IF9fcTAsIF9fcTEsIF9fcTIsIF9fcTMgfTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X2VwaTE2IChzaG9ydCBfX3E3LCBzaG9ydCBfX3E2LCBzaG9ydCBfX3E1LCBzaG9ydCBfX3E0LAorCSAgICAgICBzaG9ydCBfX3EzLCBzaG9ydCBfX3EyLCBzaG9ydCBfX3ExLCBzaG9ydCBfX3EwKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMTI4aSkoX192OGhpKXsKKyAgICBfX3EwLCBfX3ExLCBfX3EyLCBfX3EzLCBfX3E0LCBfX3E1LCBfX3E2LCBfX3E3IH07Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9lcGk4IChjaGFyIF9fcTE1LCBjaGFyIF9fcTE0LCBjaGFyIF9fcTEzLCBjaGFyIF9fcTEyLAorCSAgICAgIGNoYXIgX19xMTEsIGNoYXIgX19xMTAsIGNoYXIgX19xMDksIGNoYXIgX19xMDgsCisJICAgICAgY2hhciBfX3EwNywgY2hhciBfX3EwNiwgY2hhciBfX3EwNSwgY2hhciBfX3EwNCwKKwkgICAgICBjaGFyIF9fcTAzLCBjaGFyIF9fcTAyLCBjaGFyIF9fcTAxLCBjaGFyIF9fcTAwKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMTI4aSkoX192MTZxaSl7CisgICAgX19xMDAsIF9fcTAxLCBfX3EwMiwgX19xMDMsIF9fcTA0LCBfX3EwNSwgX19xMDYsIF9fcTA3LAorICAgIF9fcTA4LCBfX3EwOSwgX19xMTAsIF9fcTExLCBfX3ExMiwgX19xMTMsIF9fcTE0LCBfX3ExNQorICB9OworfQorCisvKiBTZXQgYWxsIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgdmVjdG9yIHRvIEEuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXQxX2VwaTY0eCAobG9uZyBsb25nIF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpNjR4IChfX0EsIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldDFfZXBpNjQgKF9fbTY0IF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpNjQgKF9fQSwgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0MV9lcGkzMiAoaW50IF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpMzIgKF9fQSwgX19BLCBfX0EsIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldDFfZXBpMTYgKHNob3J0IF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpMTYgKF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0MV9lcGk4IChjaGFyIF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpOCAoX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsCisJCSAgICAgICBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSk7Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciBvZiBRaSwgd2hlcmUgaSBpcyB0aGUgZWxlbWVudCBudW1iZXIuCisgICBUaGUgcGFyYW1ldGVyIG9yZGVyIGlzIHJldmVyc2VkIGZyb20gdGhlIF9tbV9zZXRfZXBpKiBmdW5jdGlvbnMuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRyX2VwaTY0IChfX202NCBfX3EwLCBfX202NCBfX3ExKQoreworICByZXR1cm4gX21tX3NldF9lcGk2NCAoX19xMSwgX19xMCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldHJfZXBpMzIgKGludCBfX3EwLCBpbnQgX19xMSwgaW50IF9fcTIsIGludCBfX3EzKQoreworICByZXR1cm4gX21tX3NldF9lcGkzMiAoX19xMywgX19xMiwgX19xMSwgX19xMCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldHJfZXBpMTYgKHNob3J0IF9fcTAsIHNob3J0IF9fcTEsIHNob3J0IF9fcTIsIHNob3J0IF9fcTMsCisJICAgICAgICBzaG9ydCBfX3E0LCBzaG9ydCBfX3E1LCBzaG9ydCBfX3E2LCBzaG9ydCBfX3E3KQoreworICByZXR1cm4gX21tX3NldF9lcGkxNiAoX19xNywgX19xNiwgX19xNSwgX19xNCwgX19xMywgX19xMiwgX19xMSwgX19xMCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldHJfZXBpOCAoY2hhciBfX3EwMCwgY2hhciBfX3EwMSwgY2hhciBfX3EwMiwgY2hhciBfX3EwMywKKwkgICAgICAgY2hhciBfX3EwNCwgY2hhciBfX3EwNSwgY2hhciBfX3EwNiwgY2hhciBfX3EwNywKKwkgICAgICAgY2hhciBfX3EwOCwgY2hhciBfX3EwOSwgY2hhciBfX3ExMCwgY2hhciBfX3ExMSwKKwkgICAgICAgY2hhciBfX3ExMiwgY2hhciBfX3ExMywgY2hhciBfX3ExNCwgY2hhciBfX3ExNSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpOCAoX19xMTUsIF9fcTE0LCBfX3ExMywgX19xMTIsIF9fcTExLCBfX3ExMCwgX19xMDksIF9fcTA4LAorCQkgICAgICAgX19xMDcsIF9fcTA2LCBfX3EwNSwgX19xMDQsIF9fcTAzLCBfX3EwMiwgX19xMDEsIF9fcTAwKTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggZWxlbWVudCAwIGFzICpQIGFuZCB0aGUgcmVzdCB6ZXJvLiAgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZF9zaTEyOCAoX19tMTI4aSBjb25zdCAqX19QKQoreworICByZXR1cm4gKl9fUDsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZHVfc2kxMjggKF9fbTEyOGkgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9sb2FkZHF1ICgoY2hhciBjb25zdCAqKV9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRsX2VwaTY0IChfX20xMjhpIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTY0ICgoX19tNjQpMExMLCAqKF9fbTY0ICopX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVfc2kxMjggKF9fbTEyOGkgKl9fUCwgX19tMTI4aSBfX0IpCit7CisgICpfX1AgPSBfX0I7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3JldV9zaTEyOCAoX19tMTI4aSAqX19QLCBfX20xMjhpIF9fQikKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmVkcXUgKChjaGFyICopX19QLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZWxfZXBpNjQgKF9fbTEyOGkgKl9fUCwgX19tMTI4aSBfX0IpCit7CisgICoobG9uZyBsb25nICopX19QID0gX19idWlsdGluX2lhMzJfdmVjX2V4dF92MmRpICgoX192MmRpKV9fQiwgMCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tb3ZlcGk2NF9waTY0IChfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfdmVjX2V4dF92MmRpICgoX192MmRpKV9fQiwgMCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdnBpNjRfZXBpNjQgKF9fbTY0IF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpNjQgKChfX202NCkwTEwsIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdmVfZXBpNjQgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfbW92cTEyOCAoKF9fdjJkaSkgX19BKTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIG9mIHplcm9zLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldHplcm9fc2kxMjggKHZvaWQpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjhpKShfX3Y0c2kpeyAwLCAwLCAwLCAwIH07Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwaTMyX3BkIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2N2dGRxMnBkICgoX192NHNpKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwaTMyX3BzIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY3Z0ZHEycHMgKChfX3Y0c2kpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBkX2VwaTMyIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2N2dHBkMmRxICgoX192MmRmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cGRfcGkzMiAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfY3Z0cGQycGkgKChfX3YyZGYpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cGRfcHMgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl9jdnRwZDJwcyAoKF9fdjJkZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0dHBkX2VwaTMyIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2N2dHRwZDJkcSAoKF9fdjJkZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRwZF9waTMyIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9jdnR0cGQycGkgKChfX3YyZGYpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBpMzJfcGQgKF9fbTY0IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2N2dHBpMnBkICgoX192MnNpKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwc19lcGkzMiAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2N2dHBzMmRxICgoX192NHNmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnR0cHNfZXBpMzIgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9jdnR0cHMyZHEgKChfX3Y0c2YpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBzX3BkIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY3Z0cHMycGQgKChfX3Y0c2YpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2Rfc2kzMiAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnRzZDJzaSAoKF9fdjJkZikgX19BKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KKy8qIEludGVsIGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNkX3NpNjQgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0c2Qyc2k2NCAoKF9fdjJkZikgX19BKTsKK30KKworLyogTWljcm9zb2Z0IGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNkX3NpNjR4IChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHNkMnNpNjQgKChfX3YyZGYpIF9fQSk7Cit9CisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnR0c2Rfc2kzMiAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnR0c2Qyc2kgKChfX3YyZGYpIF9fQSk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCisvKiBJbnRlbCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnR0c2Rfc2k2NCAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnR0c2Qyc2k2NCAoKF9fdjJkZikgX19BKTsKK30KKworLyogTWljcm9zb2Z0IGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRzZF9zaTY0eCAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnR0c2Qyc2k2NCAoKF9fdjJkZikgX19BKTsKK30KKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNkX3NzIChfX20xMjggX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY3Z0c2Qyc3MgKChfX3Y0c2YpIF9fQSwgKF9fdjJkZikgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2kzMl9zZCAoX19tMTI4ZCBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jdnRzaTJzZCAoKF9fdjJkZikgX19BLCBfX0IpOworfQorCisjaWZkZWYgX194ODZfNjRfXworLyogSW50ZWwgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpNjRfc2QgKF9fbTEyOGQgX19BLCBsb25nIGxvbmcgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY3Z0c2k2NDJzZCAoKF9fdjJkZikgX19BLCBfX0IpOworfQorCisvKiBNaWNyb3NvZnQgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpNjR4X3NkIChfX20xMjhkIF9fQSwgbG9uZyBsb25nIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2N2dHNpNjQyc2QgKChfX3YyZGYpIF9fQSwgX19CKTsKK30KKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzc19zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jdnRzczJzZCAoKF9fdjJkZikgX19BLCAoX192NHNmKV9fQik7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NodWZmbGVfcGQoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBjb25zdCBpbnQgX19tYXNrKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc2h1ZnBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIF9fbWFzayk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fc2h1ZmZsZV9wZChBLCBCLCBOKQkJCQkJCVwKKyAgKChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3NodWZwZCAoKF9fdjJkZikoX19tMTI4ZCkoQSksCQlcCisJCQkJICAgKF9fdjJkZikoX19tMTI4ZCkoQiksIChpbnQpKE4pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2toaV9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdW5wY2tocGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2xvX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl91bnBja2xwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZGhfcGQgKF9fbTEyOGQgX19BLCBkb3VibGUgY29uc3QgKl9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2xvYWRocGQgKChfX3YyZGYpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkbF9wZCAoX19tMTI4ZCBfX0EsIGRvdWJsZSBjb25zdCAqX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfbG9hZGxwZCAoKF9fdjJkZilfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZW1hc2tfcGQgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbW92bXNrcGQgKChfX3YyZGYpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcGFja3NfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhY2tzc3diMTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wYWNrc19lcGkzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFja3NzZHcxMjggKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3BhY2t1c19lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFja3Vzd2IxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2hpX2VwaTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2hidzEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2toaV9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHVucGNraHdkMTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2toaV9lcGkzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHVucGNraGRxMTI4ICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2toaV9lcGk2NCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHVucGNraHFkcTEyOCAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNrbG9fZXBpOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHVucGNrbGJ3MTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2xvX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wdW5wY2tsd2QxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2xvX2VwaTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wdW5wY2tsZHExMjggKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2xvX2VwaTY0IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wdW5wY2tscWRxMTI4ICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRfZXBpOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFkZGIxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWRkdzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkX2VwaTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWRkZDEyOCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkX2VwaTY0IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWRkcTEyOCAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkc19lcGk4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWRkc2IxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkc19lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFkZHN3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRzX2VwdTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhZGR1c2IxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkc19lcHUxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFkZHVzdzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3ViX2VwaTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzdWJiMTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1Yl9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHN1YncxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1Yl9lcGkzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHN1YmQxMjggKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1Yl9lcGk2NCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHN1YnExMjggKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1YnNfZXBpOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHN1YnNiMTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1YnNfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzdWJzdzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3Vic19lcHU4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3VidXNiMTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1YnNfZXB1MTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzdWJ1c3cxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hZGRfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BtYWRkd2QxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bGhpX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wbXVsaHcxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bGxvX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wbXVsbHcxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxfc3UzMiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcG11bHVkcSAoKF9fdjJzaSlfX0EsIChfX3Yyc2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsX2VwdTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wbXVsdWRxMTI4ICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGxpX2VwaTE2IChfX20xMjhpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzbGx3aTEyOCAoKF9fdjhoaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbGlfZXBpMzIgKF9fbTEyOGkgX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNsbGRpMTI4ICgoX192NHNpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsaV9lcGk2NCAoX19tMTI4aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2xscWkxMjggKChfX3YyZGkpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmFpX2VwaTE2IChfX20xMjhpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmF3aTEyOCAoKF9fdjhoaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NyYWlfZXBpMzIgKF9fbTEyOGkgX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNyYWRpMTI4ICgoX192NHNpKV9fQSwgX19CKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JsaV9zaTEyOCAoX19tMTI4aSBfX0EsIGNvbnN0IGludCBfX04pCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JsZHFpMTI4IChfX0EsIF9fTiAqIDgpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGxpX3NpMTI4IChfX20xMjhpIF9fQSwgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzbGxkcWkxMjggKF9fQSwgX19OICogOCk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fc3JsaV9zaTEyOChBLCBOKSBcCisgICgoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JsZHFpMTI4ICgoX19tMTI4aSkoQSksIChpbnQpKE4pICogOCkpCisjZGVmaW5lIF9tbV9zbGxpX3NpMTI4KEEsIE4pIFwKKyAgKChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzbGxkcWkxMjggKChfX20xMjhpKShBKSwgKGludCkoTikgKiA4KSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmxpX2VwaTE2IChfX20xMjhpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Bzcmx3aTEyOCAoKF9fdjhoaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybGlfZXBpMzIgKF9fbTEyOGkgX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNybGRpMTI4ICgoX192NHNpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JsaV9lcGk2NCAoX19tMTI4aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JscWkxMjggKChfX3YyZGkpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGxfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzbGx3MTI4KChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbF9lcGkzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNsbGQxMjgoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsX2VwaTY0IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2xscTEyOCgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmFfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmF3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmFfZXBpMzIgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmFkMTI4ICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmxfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Bzcmx3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmxfZXBpMzIgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmxkMTI4ICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmxfZXBpNjQgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmxxMTI4ICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hbmRfc2kxMjggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhbmQxMjggKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FuZG5vdF9zaTEyOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFuZG4xMjggKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX29yX3NpMTI4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wb3IxMjggKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3hvcl9zaTEyOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHhvcjEyOCAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXFfZXBpOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGNtcGVxYjEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlcV9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGNtcGVxdzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXFfZXBpMzIgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BjbXBlcWQxMjggKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGx0X2VwaTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BjbXBndGIxMjggKChfX3YxNnFpKV9fQiwgKF9fdjE2cWkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbHRfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BjbXBndHcxMjggKChfX3Y4aGkpX19CLCAoX192OGhpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGx0X2VwaTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wY21wZ3RkMTI4ICgoX192NHNpKV9fQiwgKF9fdjRzaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBndF9lcGk4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wY21wZ3RiMTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGd0X2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wY21wZ3R3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBndF9lcGkzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGNtcGd0ZDEyOCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9leHRyYWN0X2VwaTE2IChfX20xMjhpIGNvbnN0IF9fQSwgaW50IGNvbnN0IF9fTikKK3sKKyAgcmV0dXJuICh1bnNpZ25lZCBzaG9ydCkgX19idWlsdGluX2lhMzJfdmVjX2V4dF92OGhpICgoX192OGhpKV9fQSwgX19OKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faW5zZXJ0X2VwaTE2IChfX20xMjhpIGNvbnN0IF9fQSwgaW50IGNvbnN0IF9fRCwgaW50IGNvbnN0IF9fTikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92ZWNfc2V0X3Y4aGkgKChfX3Y4aGkpX19BLCBfX0QsIF9fTik7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fZXh0cmFjdF9lcGkxNihBLCBOKSBcCisgICgoaW50KSAodW5zaWduZWQgc2hvcnQpIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjhoaSAoKF9fdjhoaSkoX19tMTI4aSkoQSksIChpbnQpKE4pKSkKKyNkZWZpbmUgX21tX2luc2VydF9lcGkxNihBLCBELCBOKQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdmVjX3NldF92OGhpICgoX192OGhpKShfX20xMjhpKShBKSwJXAorCQkJCQkgIChpbnQpKEQpLCAoaW50KShOKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWF4X2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wbWF4c3cxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21heF9lcHU4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wbWF4dWIxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWluX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wbWluc3cxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21pbl9lcHU4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wbWludWIxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tb3ZlbWFza19lcGk4IChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Btb3Ztc2tiMTI4ICgoX192MTZxaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxoaV9lcHUxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcG11bGh1dzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2h1ZmZsZWhpX2VwaTE2IChfX20xMjhpIF9fQSwgY29uc3QgaW50IF9fbWFzaykKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzaHVmaHcgKChfX3Y4aGkpX19BLCBfX21hc2spOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaHVmZmxlbG9fZXBpMTYgKF9fbTEyOGkgX19BLCBjb25zdCBpbnQgX19tYXNrKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNodWZsdyAoKF9fdjhoaSlfX0EsIF9fbWFzayk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NodWZmbGVfZXBpMzIgKF9fbTEyOGkgX19BLCBjb25zdCBpbnQgX19tYXNrKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNodWZkICgoX192NHNpKV9fQSwgX19tYXNrKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9zaHVmZmxlaGlfZXBpMTYoQSwgTikgXAorICAoKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNodWZodyAoKF9fdjhoaSkoX19tMTI4aSkoQSksIChpbnQpKE4pKSkKKyNkZWZpbmUgX21tX3NodWZmbGVsb19lcGkxNihBLCBOKSBcCisgICgoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2h1Zmx3ICgoX192OGhpKShfX20xMjhpKShBKSwgKGludCkoTikpKQorI2RlZmluZSBfbW1fc2h1ZmZsZV9lcGkzMihBLCBOKSBcCisgICgoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2h1ZmQgKChfX3Y0c2kpKF9fbTEyOGkpKEEpLCAoaW50KShOKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza21vdmV1X3NpMTI4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIGNoYXIgKl9fQykKK3sKKyAgX19idWlsdGluX2lhMzJfbWFza21vdmRxdSAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IsIF9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2F2Z19lcHU4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYXZnYjEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hdmdfZXB1MTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3Bhdmd3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zYWRfZXB1OCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNhZGJ3MTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0cmVhbV9zaTMyIChpbnQgKl9fQSwgaW50IF9fQikKK3sKKyAgX19idWlsdGluX2lhMzJfbW92bnRpIChfX0EsIF9fQik7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdHJlYW1fc2k2NCAobG9uZyBsb25nIGludCAqX19BLCBsb25nIGxvbmcgaW50IF9fQikKK3sKKyAgX19idWlsdGluX2lhMzJfbW92bnRpNjQgKF9fQSwgX19CKTsKK30KKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdHJlYW1fc2kxMjggKF9fbTEyOGkgKl9fQSwgX19tMTI4aSBfX0IpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vdm50ZHEgKChfX3YyZGkgKilfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RyZWFtX3BkIChkb3VibGUgKl9fQSwgX19tMTI4ZCBfX0IpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vdm50cGQgKF9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbGZsdXNoICh2b2lkIGNvbnN0ICpfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX2NsZmx1c2ggKF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xmZW5jZSAodm9pZCkKK3sKKyAgX19idWlsdGluX2lhMzJfbGZlbmNlICgpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tZmVuY2UgKHZvaWQpCit7CisgIF9fYnVpbHRpbl9pYTMyX21mZW5jZSAoKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2kzMl9zaTEyOCAoaW50IF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpMzIgKDAsIDAsIDAsIF9fQSk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCisvKiBJbnRlbCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2k2NF9zaTEyOCAobG9uZyBsb25nIF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpNjR4ICgwLCBfX0EpOworfQorCisvKiBNaWNyb3NvZnQgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpNjR4X3NpMTI4IChsb25nIGxvbmcgX19BKQoreworICByZXR1cm4gX21tX3NldF9lcGk2NHggKDAsIF9fQSk7Cit9CisjZW5kaWYKKworLyogQ2FzdHMgYmV0d2VlbiB2YXJpb3VzIFNQLCBEUCwgSU5UIHZlY3RvciB0eXBlcy4gIE5vdGUgdGhhdCB0aGVzZSBkbyBubworICAgY29udmVyc2lvbiBvZiB2YWx1ZXMsIHRoZXkganVzdCBjaGFuZ2UgdGhlIHR5cGUuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jYXN0cGRfcHMoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Nhc3RwZF9zaTEyOChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Nhc3Rwc19wZChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY2FzdHBzX3NpMTI4KF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Nhc3RzaTEyOF9wcyhfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY2FzdHNpMTI4X3BkKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fQTsKK30KKworI2VuZGlmIC8qIF9fU1NFMl9fICAqLworCisjZW5kaWYgLyogX0VNTUlOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9mMTZjaW50cmluLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9mMTZjaW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyOWZjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2YxNmNpbnRyaW4uaApAQCAtMCwwICsxLDkyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmICFkZWZpbmVkIF9YODZJTlRSSU5fSF9JTkNMVURFRCAmJiAhZGVmaW5lZCBfSU1NSU5UUklOX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8ZjE2aW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gb3IgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fRjE2Q19fCisjIGVycm9yICJGMTZDIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbHNlCisKKyNpZm5kZWYgX0YxNkNJTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfRjE2Q0lOVFJJTl9IX0lOQ0xVREVECisKK2V4dGVybiBfX2lubGluZSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19jdnRzaF9zcyAodW5zaWduZWQgc2hvcnQgX19TKQoreworICBfX3Y4aGkgX19IID0gX19leHRlbnNpb25fXyAoX192OGhpKXsgKHNob3J0KSBfX1MsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgX192NHNmIF9fQSA9IF9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwcyAoX19IKTsKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjRzZiAoX19BLCAwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwaF9wcyAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHMgKChfX3Y4aGkpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0cGhfcHMgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmN2dHBoMnBzMjU2ICgoX192OGhpKSBfX0EpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgc2hvcnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfY3Z0c3Nfc2ggKGZsb2F0IF9fRiwgY29uc3QgaW50IF9fSSkKK3sKKyAgX192NHNmIF9fQSA9ICBfX2V4dGVuc2lvbl9fIChfX3Y0c2YpeyBfX0YsIDAsIDAsIDAgfTsKKyAgX192OGhpIF9fSCA9IF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaCAoX19BLCBfX0kpOworICByZXR1cm4gKHVuc2lnbmVkIHNob3J0KSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y4aGkgKF9fSCwgMCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBzX3BoIChfX20xMjggX19BLCBjb25zdCBpbnQgX19JKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaCAoKF9fdjRzZikgX19BLCBfX0kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRwc19waCAoX19tMjU2IF9fQSwgY29uc3QgaW50IF9fSSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGgyNTYgKChfX3Y4c2YpIF9fQSwgX19JKTsKK30KKyNlbHNlCisjZGVmaW5lIF9jdnRzc19zaChfX0YsIF9fSSkJCQkJCQlcCisgIChfX2V4dGVuc2lvbl9fIAkJCQkJCQlcCisgICAoewkJCQkJCQkJCVwKKyAgICAgIF9fdjRzZiBfX0EgPSAgX19leHRlbnNpb25fXyAoX192NHNmKXsgX19GLCAwLCAwLCAwIH07CQlcCisgICAgICBfX3Y4aGkgX19IID0gX19idWlsdGluX2lhMzJfdmN2dHBzMnBoIChfX0EsIF9fSSk7CQkJXAorICAgICAgKHVuc2lnbmVkIHNob3J0KSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y4aGkgKF9fSCwgMCk7CQlcCisgICAgfSkpCisKKyNkZWZpbmUgX21tX2N2dHBzX3BoKEEsIEkpIFwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGggKChfX3Y0c2YpKF9fbTEyOCkgQSwgKGludCkgKEkpKSkKKworI2RlZmluZSBfbW0yNTZfY3Z0cHNfcGgoQSwgSSkgXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaDI1NiAoKF9fdjhzZikoX19tMjU2KSBBLCAoaW50KSAoSSkpKQorI2VuZGlmIC8qIF9fT1BUSU1JWkUgKi8KKworI2VuZGlmIC8qIF9GMTZDSU5UUklOX0hfSU5DTFVERUQgKi8KKyNlbmRpZiAvKiBfX0YxNkNfXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvZmxvYXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2Zsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0NjFkNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2Zsb2F0LmgKQEAgLTAsMCArMSwyNzcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKgorICogSVNPIEMgU3RhbmRhcmQ6ICA1LjIuNC4yLjIgIENoYXJhY3RlcmlzdGljcyBvZiBmbG9hdGluZyB0eXBlcyA8ZmxvYXQuaD4KKyAqLworCisjaWZuZGVmIF9GTE9BVF9IX19fCisjZGVmaW5lIF9GTE9BVF9IX19fCisKKy8qIFJhZGl4IG9mIGV4cG9uZW50IHJlcHJlc2VudGF0aW9uLCBiLiAqLworI3VuZGVmIEZMVF9SQURJWAorI2RlZmluZSBGTFRfUkFESVgJX19GTFRfUkFESVhfXworCisvKiBOdW1iZXIgb2YgYmFzZS1GTFRfUkFESVggZGlnaXRzIGluIHRoZSBzaWduaWZpY2FuZCwgcC4gICovCisjdW5kZWYgRkxUX01BTlRfRElHCisjdW5kZWYgREJMX01BTlRfRElHCisjdW5kZWYgTERCTF9NQU5UX0RJRworI2RlZmluZSBGTFRfTUFOVF9ESUcJX19GTFRfTUFOVF9ESUdfXworI2RlZmluZSBEQkxfTUFOVF9ESUcJX19EQkxfTUFOVF9ESUdfXworI2RlZmluZSBMREJMX01BTlRfRElHCV9fTERCTF9NQU5UX0RJR19fCisKKy8qIE51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cywgcSwgc3VjaCB0aGF0IGFueSBmbG9hdGluZy1wb2ludCBudW1iZXIgd2l0aCBxCisgICBkZWNpbWFsIGRpZ2l0cyBjYW4gYmUgcm91bmRlZCBpbnRvIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHdpdGggcCByYWRpeCBiCisgICBkaWdpdHMgYW5kIGJhY2sgYWdhaW4gd2l0aG91dCBjaGFuZ2UgdG8gdGhlIHEgZGVjaW1hbCBkaWdpdHMsCisKKwlwICogbG9nMTAoYikJCQlpZiBiIGlzIGEgcG93ZXIgb2YgMTAKKwlmbG9vcigocCAtIDEpICogbG9nMTAoYikpCW90aGVyd2lzZQorKi8KKyN1bmRlZiBGTFRfRElHCisjdW5kZWYgREJMX0RJRworI3VuZGVmIExEQkxfRElHCisjZGVmaW5lIEZMVF9ESUcJCV9fRkxUX0RJR19fCisjZGVmaW5lIERCTF9ESUcJCV9fREJMX0RJR19fCisjZGVmaW5lIExEQkxfRElHCV9fTERCTF9ESUdfXworCisvKiBNaW5pbXVtIGludCB4IHN1Y2ggdGhhdCBGTFRfUkFESVgqKih4LTEpIGlzIGEgbm9ybWFsaXplZCBmbG9hdCwgZW1pbiAqLworI3VuZGVmIEZMVF9NSU5fRVhQCisjdW5kZWYgREJMX01JTl9FWFAKKyN1bmRlZiBMREJMX01JTl9FWFAKKyNkZWZpbmUgRkxUX01JTl9FWFAJX19GTFRfTUlOX0VYUF9fCisjZGVmaW5lIERCTF9NSU5fRVhQCV9fREJMX01JTl9FWFBfXworI2RlZmluZSBMREJMX01JTl9FWFAJX19MREJMX01JTl9FWFBfXworCisvKiBNaW5pbXVtIG5lZ2F0aXZlIGludGVnZXIgc3VjaCB0aGF0IDEwIHJhaXNlZCB0byB0aGF0IHBvd2VyIGlzIGluIHRoZQorICAgcmFuZ2Ugb2Ygbm9ybWFsaXplZCBmbG9hdGluZy1wb2ludCBudW1iZXJzLAorCisJY2VpbChsb2cxMChiKSAqIChlbWluIC0gMSkpCisqLworI3VuZGVmIEZMVF9NSU5fMTBfRVhQCisjdW5kZWYgREJMX01JTl8xMF9FWFAKKyN1bmRlZiBMREJMX01JTl8xMF9FWFAKKyNkZWZpbmUgRkxUX01JTl8xMF9FWFAJX19GTFRfTUlOXzEwX0VYUF9fCisjZGVmaW5lIERCTF9NSU5fMTBfRVhQCV9fREJMX01JTl8xMF9FWFBfXworI2RlZmluZSBMREJMX01JTl8xMF9FWFAJX19MREJMX01JTl8xMF9FWFBfXworCisvKiBNYXhpbXVtIGludCB4IHN1Y2ggdGhhdCBGTFRfUkFESVgqKih4LTEpIGlzIGEgcmVwcmVzZW50YWJsZSBmbG9hdCwgZW1heC4gICovCisjdW5kZWYgRkxUX01BWF9FWFAKKyN1bmRlZiBEQkxfTUFYX0VYUAorI3VuZGVmIExEQkxfTUFYX0VYUAorI2RlZmluZSBGTFRfTUFYX0VYUAlfX0ZMVF9NQVhfRVhQX18KKyNkZWZpbmUgREJMX01BWF9FWFAJX19EQkxfTUFYX0VYUF9fCisjZGVmaW5lIExEQkxfTUFYX0VYUAlfX0xEQkxfTUFYX0VYUF9fCisKKy8qIE1heGltdW0gaW50ZWdlciBzdWNoIHRoYXQgMTAgcmFpc2VkIHRvIHRoYXQgcG93ZXIgaXMgaW4gdGhlIHJhbmdlIG9mCisgICByZXByZXNlbnRhYmxlIGZpbml0ZSBmbG9hdGluZy1wb2ludCBudW1iZXJzLAorCisJZmxvb3IobG9nMTAoKDEgLSBiKiotcCkgKiBiKiplbWF4KSkKKyovCisjdW5kZWYgRkxUX01BWF8xMF9FWFAKKyN1bmRlZiBEQkxfTUFYXzEwX0VYUAorI3VuZGVmIExEQkxfTUFYXzEwX0VYUAorI2RlZmluZSBGTFRfTUFYXzEwX0VYUAlfX0ZMVF9NQVhfMTBfRVhQX18KKyNkZWZpbmUgREJMX01BWF8xMF9FWFAJX19EQkxfTUFYXzEwX0VYUF9fCisjZGVmaW5lIExEQkxfTUFYXzEwX0VYUAlfX0xEQkxfTUFYXzEwX0VYUF9fCisKKy8qIE1heGltdW0gcmVwcmVzZW50YWJsZSBmaW5pdGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyLAorCisJKDEgLSBiKiotcCkgKiBiKiplbWF4CisqLworI3VuZGVmIEZMVF9NQVgKKyN1bmRlZiBEQkxfTUFYCisjdW5kZWYgTERCTF9NQVgKKyNkZWZpbmUgRkxUX01BWAkJX19GTFRfTUFYX18KKyNkZWZpbmUgREJMX01BWAkJX19EQkxfTUFYX18KKyNkZWZpbmUgTERCTF9NQVgJX19MREJMX01BWF9fCisKKy8qIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMSBhbmQgdGhlIGxlYXN0IHZhbHVlIGdyZWF0ZXIgdGhhbiAxIHRoYXQgaXMKKyAgIHJlcHJlc2VudGFibGUgaW4gdGhlIGdpdmVuIGZsb2F0aW5nIHBvaW50IHR5cGUsIGIqKjEtcC4gICovCisjdW5kZWYgRkxUX0VQU0lMT04KKyN1bmRlZiBEQkxfRVBTSUxPTgorI3VuZGVmIExEQkxfRVBTSUxPTgorI2RlZmluZSBGTFRfRVBTSUxPTglfX0ZMVF9FUFNJTE9OX18KKyNkZWZpbmUgREJMX0VQU0lMT04JX19EQkxfRVBTSUxPTl9fCisjZGVmaW5lIExEQkxfRVBTSUxPTglfX0xEQkxfRVBTSUxPTl9fCisKKy8qIE1pbmltdW0gbm9ybWFsaXplZCBwb3NpdGl2ZSBmbG9hdGluZy1wb2ludCBudW1iZXIsIGIqKihlbWluIC0gMSkuICAqLworI3VuZGVmIEZMVF9NSU4KKyN1bmRlZiBEQkxfTUlOCisjdW5kZWYgTERCTF9NSU4KKyNkZWZpbmUgRkxUX01JTgkJX19GTFRfTUlOX18KKyNkZWZpbmUgREJMX01JTgkJX19EQkxfTUlOX18KKyNkZWZpbmUgTERCTF9NSU4JX19MREJMX01JTl9fCisKKy8qIEFkZGl0aW9uIHJvdW5kcyB0byAwOiB6ZXJvLCAxOiBuZWFyZXN0LCAyOiAraW5mLCAzOiAtaW5mLCAtMTogdW5rbm93bi4gICovCisvKiA/Pz8gVGhpcyBpcyBzdXBwb3NlZCB0byBjaGFuZ2Ugd2l0aCBjYWxscyB0byBmZXNldHJvdW5kIGluIDxmZW52Lmg+LiAgKi8KKyN1bmRlZiBGTFRfUk9VTkRTCisjZGVmaW5lIEZMVF9ST1VORFMgMQorCisjaWYgZGVmaW5lZCAoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisvKiBUaGUgZmxvYXRpbmctcG9pbnQgZXhwcmVzc2lvbiBldmFsdWF0aW9uIG1ldGhvZC4KKyAgICAgICAgLTEgIGluZGV0ZXJtaW5hdGUKKyAgICAgICAgIDAgIGV2YWx1YXRlIGFsbCBvcGVyYXRpb25zIGFuZCBjb25zdGFudHMganVzdCB0byB0aGUgcmFuZ2UgYW5kCisgICAgICAgICAgICBwcmVjaXNpb24gb2YgdGhlIHR5cGUKKyAgICAgICAgIDEgIGV2YWx1YXRlIG9wZXJhdGlvbnMgYW5kIGNvbnN0YW50cyBvZiB0eXBlIGZsb2F0IGFuZCBkb3VibGUKKyAgICAgICAgICAgIHRvIHRoZSByYW5nZSBhbmQgcHJlY2lzaW9uIG9mIHRoZSBkb3VibGUgdHlwZSwgZXZhbHVhdGUKKyAgICAgICAgICAgIGxvbmcgZG91YmxlIG9wZXJhdGlvbnMgYW5kIGNvbnN0YW50cyB0byB0aGUgcmFuZ2UgYW5kCisgICAgICAgICAgICBwcmVjaXNpb24gb2YgdGhlIGxvbmcgZG91YmxlIHR5cGUKKyAgICAgICAgIDIgIGV2YWx1YXRlIGFsbCBvcGVyYXRpb25zIGFuZCBjb25zdGFudHMgdG8gdGhlIHJhbmdlIGFuZAorICAgICAgICAgICAgcHJlY2lzaW9uIG9mIHRoZSBsb25nIGRvdWJsZSB0eXBlCisKKyAgID8/PyBUaGlzIG91Z2h0IHRvIGNoYW5nZSB3aXRoIHRoZSBzZXR0aW5nIG9mIHRoZSBmcCBjb250cm9sIHdvcmQ7CisgICB0aGUgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGNvbXBpbGVyIGFzc3VtZXMgdGhlIHdpZGVzdCBzZXR0aW5nLiAgKi8KKyN1bmRlZiBGTFRfRVZBTF9NRVRIT0QKKyNkZWZpbmUgRkxUX0VWQUxfTUVUSE9ECV9fRkxUX0VWQUxfTUVUSE9EX18KKworLyogTnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzLCBuLCBzdWNoIHRoYXQgYW55IGZsb2F0aW5nLXBvaW50IG51bWJlciBpbiB0aGUKKyAgIHdpZGVzdCBzdXBwb3J0ZWQgZmxvYXRpbmcgdHlwZSB3aXRoIHBtYXggcmFkaXggYiBkaWdpdHMgY2FuIGJlIHJvdW5kZWQKKyAgIHRvIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHdpdGggbiBkZWNpbWFsIGRpZ2l0cyBhbmQgYmFjayBhZ2FpbiB3aXRob3V0CisgICBjaGFuZ2UgdG8gdGhlIHZhbHVlLAorCisJcG1heCAqIGxvZzEwKGIpCQkJaWYgYiBpcyBhIHBvd2VyIG9mIDEwCisJY2VpbCgxICsgcG1heCAqIGxvZzEwKGIpKQlvdGhlcndpc2UKKyovCisjdW5kZWYgREVDSU1BTF9ESUcKKyNkZWZpbmUgREVDSU1BTF9ESUcJX19ERUNJTUFMX0RJR19fCisKKyNlbmRpZiAvKiBDOTkgKi8KKworI2lmIGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMjAxMTEyTAorLyogVmVyc2lvbnMgb2YgREVDSU1BTF9ESUcgZm9yIGVhY2ggZmxvYXRpbmctcG9pbnQgdHlwZS4gICovCisjdW5kZWYgRkxUX0RFQ0lNQUxfRElHCisjdW5kZWYgREJMX0RFQ0lNQUxfRElHCisjdW5kZWYgTERCTF9ERUNJTUFMX0RJRworI2RlZmluZSBGTFRfREVDSU1BTF9ESUcJCV9fRkxUX0RFQ0lNQUxfRElHX18KKyNkZWZpbmUgREJMX0RFQ0lNQUxfRElHCQlfX0RCTF9ERUNJTUFMX0RJR19fCisjZGVmaW5lIExEQkxfREVDSU1BTF9ESUcJX19ERUNJTUFMX0RJR19fCisKKy8qIFdoZXRoZXIgdHlwZXMgc3VwcG9ydCBzdWJub3JtYWwgbnVtYmVycy4gICovCisjdW5kZWYgRkxUX0hBU19TVUJOT1JNCisjdW5kZWYgREJMX0hBU19TVUJOT1JNCisjdW5kZWYgTERCTF9IQVNfU1VCTk9STQorI2RlZmluZSBGTFRfSEFTX1NVQk5PUk0JCV9fRkxUX0hBU19ERU5PUk1fXworI2RlZmluZSBEQkxfSEFTX1NVQk5PUk0JCV9fREJMX0hBU19ERU5PUk1fXworI2RlZmluZSBMREJMX0hBU19TVUJOT1JNCV9fTERCTF9IQVNfREVOT1JNX18KKworLyogTWluaW11bSBwb3NpdGl2ZSB2YWx1ZXMsIGluY2x1ZGluZyBzdWJub3JtYWxzLiAgKi8KKyN1bmRlZiBGTFRfVFJVRV9NSU4KKyN1bmRlZiBEQkxfVFJVRV9NSU4KKyN1bmRlZiBMREJMX1RSVUVfTUlOCisjaWYgX19GTFRfSEFTX0RFTk9STV9fCisjZGVmaW5lIEZMVF9UUlVFX01JTglfX0ZMVF9ERU5PUk1fTUlOX18KKyNlbHNlCisjZGVmaW5lIEZMVF9UUlVFX01JTglfX0ZMVF9NSU5fXworI2VuZGlmCisjaWYgX19EQkxfSEFTX0RFTk9STV9fCisjZGVmaW5lIERCTF9UUlVFX01JTglfX0RCTF9ERU5PUk1fTUlOX18KKyNlbHNlCisjZGVmaW5lIERCTF9UUlVFX01JTglfX0RCTF9NSU5fXworI2VuZGlmCisjaWYgX19MREJMX0hBU19ERU5PUk1fXworI2RlZmluZSBMREJMX1RSVUVfTUlOCV9fTERCTF9ERU5PUk1fTUlOX18KKyNlbHNlCisjZGVmaW5lIExEQkxfVFJVRV9NSU4JX19MREJMX01JTl9fCisjZW5kaWYKKworI2VuZGlmIC8qIEMxMSAqLworCisjaWZkZWYgX19TVERDX1dBTlRfREVDX0ZQX18KKy8qIERyYWZ0IFRlY2huaWNhbCBSZXBvcnQgMjQ3MzIsIGV4dGVuc2lvbiBmb3IgZGVjaW1hbCBmbG9hdGluZy1wb2ludAorICAgYXJpdGhtZXRpYzogQ2hhcmFjdGVyaXN0aWMgb2YgZGVjaW1hbCBmbG9hdGluZyB0eXBlcyA8ZmxvYXQuaD4uICAqLworCisvKiBOdW1iZXIgb2YgYmFzZS1GTFRfUkFESVggZGlnaXRzIGluIHRoZSBzaWduaWZpY2FuZCwgcC4gICovCisjdW5kZWYgREVDMzJfTUFOVF9ESUcKKyN1bmRlZiBERUM2NF9NQU5UX0RJRworI3VuZGVmIERFQzEyOF9NQU5UX0RJRworI2RlZmluZSBERUMzMl9NQU5UX0RJRwlfX0RFQzMyX01BTlRfRElHX18KKyNkZWZpbmUgREVDNjRfTUFOVF9ESUcJX19ERUM2NF9NQU5UX0RJR19fCisjZGVmaW5lIERFQzEyOF9NQU5UX0RJRwlfX0RFQzEyOF9NQU5UX0RJR19fCisKKy8qIE1pbmltdW0gZXhwb25lbnQuICovCisjdW5kZWYgREVDMzJfTUlOX0VYUAorI3VuZGVmIERFQzY0X01JTl9FWFAKKyN1bmRlZiBERUMxMjhfTUlOX0VYUAorI2RlZmluZSBERUMzMl9NSU5fRVhQCV9fREVDMzJfTUlOX0VYUF9fCisjZGVmaW5lIERFQzY0X01JTl9FWFAJX19ERUM2NF9NSU5fRVhQX18KKyNkZWZpbmUgREVDMTI4X01JTl9FWFAJX19ERUMxMjhfTUlOX0VYUF9fCisKKy8qIE1heGltdW0gZXhwb25lbnQuICovCisjdW5kZWYgREVDMzJfTUFYX0VYUAorI3VuZGVmIERFQzY0X01BWF9FWFAKKyN1bmRlZiBERUMxMjhfTUFYX0VYUAorI2RlZmluZSBERUMzMl9NQVhfRVhQCV9fREVDMzJfTUFYX0VYUF9fCisjZGVmaW5lIERFQzY0X01BWF9FWFAJX19ERUM2NF9NQVhfRVhQX18KKyNkZWZpbmUgREVDMTI4X01BWF9FWFAJX19ERUMxMjhfTUFYX0VYUF9fCisKKy8qIE1heGltdW0gcmVwcmVzZW50YWJsZSBmaW5pdGUgZGVjaW1hbCBmbG9hdGluZy1wb2ludCBudW1iZXIKKyAgICh0aGVyZSBhcmUgNiwgMTUsIGFuZCAzMyA5cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludHMgcmVzcGVjdGl2ZWx5KS4gKi8KKyN1bmRlZiBERUMzMl9NQVgKKyN1bmRlZiBERUM2NF9NQVgKKyN1bmRlZiBERUMxMjhfTUFYCisjZGVmaW5lIERFQzMyX01BWCAgIF9fREVDMzJfTUFYX18KKyNkZWZpbmUgREVDNjRfTUFYICAgX19ERUM2NF9NQVhfXworI2RlZmluZSBERUMxMjhfTUFYICBfX0RFQzEyOF9NQVhfXworCisvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEgYW5kIHRoZSBsZWFzdCB2YWx1ZSBncmVhdGVyIHRoYW4gMSB0aGF0IGlzCisgICByZXByZXNlbnRhYmxlIGluIHRoZSBnaXZlbiBmbG9hdGluZyBwb2ludCB0eXBlLiAqLworI3VuZGVmIERFQzMyX0VQU0lMT04KKyN1bmRlZiBERUM2NF9FUFNJTE9OCisjdW5kZWYgREVDMTI4X0VQU0lMT04KKyNkZWZpbmUgREVDMzJfRVBTSUxPTglfX0RFQzMyX0VQU0lMT05fXworI2RlZmluZSBERUM2NF9FUFNJTE9OCV9fREVDNjRfRVBTSUxPTl9fCisjZGVmaW5lIERFQzEyOF9FUFNJTE9OCV9fREVDMTI4X0VQU0lMT05fXworCisvKiBNaW5pbXVtIG5vcm1hbGl6ZWQgcG9zaXRpdmUgZmxvYXRpbmctcG9pbnQgbnVtYmVyLiAqLworI3VuZGVmIERFQzMyX01JTgorI3VuZGVmIERFQzY0X01JTgorI3VuZGVmIERFQzEyOF9NSU4KKyNkZWZpbmUgREVDMzJfTUlOCV9fREVDMzJfTUlOX18KKyNkZWZpbmUgREVDNjRfTUlOCV9fREVDNjRfTUlOX18KKyNkZWZpbmUgREVDMTI4X01JTglfX0RFQzEyOF9NSU5fXworCisvKiBNaW5pbXVtIHN1Ym5vcm1hbCBwb3NpdGl2ZSBmbG9hdGluZy1wb2ludCBudW1iZXIuICovCisjdW5kZWYgREVDMzJfU1VCTk9STUFMX01JTgorI3VuZGVmIERFQzY0X1NVQk5PUk1BTF9NSU4KKyN1bmRlZiBERUMxMjhfU1VCTk9STUFMX01JTgorI2RlZmluZSBERUMzMl9TVUJOT1JNQUxfTUlOICAgICAgIF9fREVDMzJfU1VCTk9STUFMX01JTl9fCisjZGVmaW5lIERFQzY0X1NVQk5PUk1BTF9NSU4gICAgICAgX19ERUM2NF9TVUJOT1JNQUxfTUlOX18KKyNkZWZpbmUgREVDMTI4X1NVQk5PUk1BTF9NSU4gICAgICBfX0RFQzEyOF9TVUJOT1JNQUxfTUlOX18KKworLyogVGhlIGZsb2F0aW5nLXBvaW50IGV4cHJlc3Npb24gZXZhbHVhdGlvbiBtZXRob2QuCisgICAgICAgICAtMSAgaW5kZXRlcm1pbmF0ZQorICAgICAgICAgMCAgZXZhbHVhdGUgYWxsIG9wZXJhdGlvbnMgYW5kIGNvbnN0YW50cyBqdXN0IHRvIHRoZSByYW5nZSBhbmQKKyAgICAgICAgICAgIHByZWNpc2lvbiBvZiB0aGUgdHlwZQorICAgICAgICAgMSAgZXZhbHVhdGUgb3BlcmF0aW9ucyBhbmQgY29uc3RhbnRzIG9mIHR5cGUgX0RlY2ltYWwzMiAKKwkgICAgYW5kIF9EZWNpbWFsNjQgdG8gdGhlIHJhbmdlIGFuZCBwcmVjaXNpb24gb2YgdGhlIF9EZWNpbWFsNjQgCisgICAgICAgICAgICB0eXBlLCBldmFsdWF0ZSBfRGVjaW1hbDEyOCBvcGVyYXRpb25zIGFuZCBjb25zdGFudHMgdG8gdGhlIAorCSAgICByYW5nZSBhbmQgcHJlY2lzaW9uIG9mIHRoZSBfRGVjaW1hbDEyOCB0eXBlOworCSAyICBldmFsdWF0ZSBhbGwgb3BlcmF0aW9ucyBhbmQgY29uc3RhbnRzIHRvIHRoZSByYW5nZSBhbmQKKwkgICAgcHJlY2lzaW9uIG9mIHRoZSBfRGVjaW1hbDEyOCB0eXBlLiAgKi8KKworI3VuZGVmIERFQ19FVkFMX01FVEhPRAorI2RlZmluZSBERUNfRVZBTF9NRVRIT0QJX19ERUNfRVZBTF9NRVRIT0RfXworCisjZW5kaWYgLyogX19TVERDX1dBTlRfREVDX0ZQX18gKi8KKworI2VuZGlmIC8qIF9GTE9BVF9IX19fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9mbWE0aW50cmluLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9mbWE0aW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiYTc4MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2ZtYTRpbnRyaW4uaApAQCAtMCwwICsxLDIzNiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX1g4NklOVFJJTl9IX0lOQ0xVREVECisjIGVycm9yICJOZXZlciB1c2UgPGZtYTRpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9GTUE0SU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX0ZNQTRJTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fRk1BNF9fCisjIGVycm9yICJGTUE0IGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbHNlCisKKy8qIFdlIG5lZWQgZGVmaW5pdGlvbnMgZnJvbSB0aGUgU1NFNEEsIFNTRTMsIFNTRTIgYW5kIFNTRSBoZWFkZXIgZmlsZXMuICAqLworI2luY2x1ZGUgPGFtbWludHJpbi5oPgorCisvKiAxMjhiIEZsb2F0aW5nIHBvaW50IG11bHRpcGx5L2FkZCB0eXBlIGluc3RydWN0aW9ucy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2NfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2NfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2Nfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2Nfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21zdWJfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCisKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIC0oX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21zdWJfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgLShfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tc3ViX3NzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgLShfX3Y0c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXN1Yl9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAtKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX25tYWNjX3BzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkcHMgKC0oX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIChfX3Y0c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbm1hY2NfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQgKC0oX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIChfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9ubWFjY19zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzICgtKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX25tYWNjX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkICgtKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAoX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbm1zdWJfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwcyAoLShfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgLShfX3Y0c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbm1zdWJfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQgKC0oX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIC0oX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbm1zdWJfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzcyAoLShfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgLShfX3Y0c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbm1zdWJfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc2QgKC0oX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIC0oX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFkZHN1Yl9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIChfX3Y0c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFkZHN1Yl9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAoX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXN1YmFkZF9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIC0oX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21zdWJhZGRfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgLShfX3YyZGYpX19DKTsKK30KKworLyogMjU2YiBGbG9hdGluZyBwb2ludCBtdWx0aXBseS9hZGQgdHlwZSBpbnN0cnVjdGlvbnMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYWNjX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQiwgKF9fdjhzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYWNjX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IsIChfX3Y0ZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tc3ViX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQorCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLCAtKF9fdjhzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tc3ViX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IsIC0oX192NGRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbm1hY2NfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1NiAoLShfX3Y4c2YpX19BLCAoX192OHNmKV9fQiwgKF9fdjhzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9ubWFjY19wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1NiAoLShfX3Y0ZGYpX19BLCAoX192NGRmKV9fQiwgKF9fdjRkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X25tc3ViX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTYgKC0oX192OHNmKV9fQSwgKF9fdjhzZilfX0IsIC0oX192OHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X25tc3ViX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2ICgtKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLCAtKF9fdjRkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hZGRzdWJfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLCAoX192OHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hZGRzdWJfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQiwgKF9fdjRkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21zdWJhZGRfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLCAtKF9fdjhzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tc3ViYWRkX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IsIC0oX192NGRmKV9fQyk7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2ZtYWludHJpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvZm1haW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkZTg0YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2ZtYWludHJpbi5oCkBAIC0wLDAgKzEsMjk3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfSU1NSU5UUklOX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Zm1haW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxpbW1pbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfRk1BSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX0ZNQUlOVFJJTl9IX0lOQ0xVREVECisKKyNpZm5kZWYgX19GTUFfXworIyBlcnJvciAiRk1BIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbHNlCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mbWFkZF9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZm1hZGRfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZm1hZGRfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2ZtYWRkX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZm1hZGRfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc2QzICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZtYWRkX3NzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3MzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Ztc3ViX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZm1zdWJfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192NGRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Ztc3ViX3BzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1hZGRwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y0c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NgorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZm1zdWJfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjhzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZm1zdWJfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDMgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZm1zdWJfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzMyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mbm1hZGRfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRwZCAoLShfX3YyZGYpX19BLCAoX192MmRmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9mbm1hZGRfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1NiAoLShfX3Y0ZGYpX19BLCAoX192NGRmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZubWFkZF9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkcHMgKC0oX192NHNmKV9fQSwgKF9fdjRzZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2ZubWFkZF9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTYgKC0oX192OHNmKV9fQSwgKF9fdjhzZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mbm1hZGRfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDMgKChfX3YyZGYpX19BLCAtKF9fdjJkZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZm5tYWRkX3NzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1hZGRzczMgKChfX3Y0c2YpX19BLCAtKF9fdjRzZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZm5tc3ViX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkcGQgKC0oX192MmRmKV9fQSwgKF9fdjJkZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2ZubXN1Yl9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2ICgtKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192NGRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZubXN1Yl9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkcHMgKC0oX192NHNmKV9fQSwgKF9fdjRzZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9mbm1zdWJfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2ICgtKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y4c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZubXN1Yl9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkMyAoKF9fdjJkZilfX0EsIC0oX192MmRmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZm5tc3ViX3NzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1hZGRzczMgKChfX3Y0c2YpX19BLCAtKF9fdjRzZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y0c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZtYWRkc3ViX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9mbWFkZHN1Yl9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMjU2ICgoX192NGRmKV9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZtYWRkc3ViX3BzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9mbWFkZHN1Yl9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMyNTYgKChfX3Y4c2YpX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mbXN1YmFkZF9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Ztc3ViYWRkX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTYgKChfX3Y0ZGYpX19BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0ZGYpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192NGRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Ztc3ViYWRkX3BzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y0c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NgorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZm1zdWJhZGRfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMjU2ICgoX192OHNmKV9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y4c2YpX19DKTsKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvZnhzcmludHJpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvZnhzcmludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNjMyMjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9meHNyaW50cmluLmgKQEAgLTAsMCArMSw2MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qICNpZiAhZGVmaW5lZCBfWDg2SU5UUklOX0hfSU5DTFVERUQgJiYgIWRlZmluZWQgX0lNTUlOVFJJTl9IX0lOQ0xVREVEICovCisvKiAjIGVycm9yICJOZXZlciB1c2UgPGZ4c3JpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIgKi8KKy8qICNlbmRpZiAqLworCisjaWZuZGVmIF9GWFNSSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX0ZYU1JJTlRSSU5fSF9JTkNMVURFRAorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfZnhzYXZlICh2b2lkICpfX1ApCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9meHNhdmUgKF9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19meHJzdG9yICh2b2lkICpfX1ApCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9meHJzdG9yIChfX1ApOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIHZvaWQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX2Z4c2F2ZTY0ICh2b2lkICpfX1ApCit7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2Z4c2F2ZTY0IChfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfZnhyc3RvcjY0ICh2b2lkICpfX1ApCit7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2Z4cnN0b3I2NCAoX19QKTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0ZYU1JJTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvaWEzMmludHJpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvaWEzMmludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMWFmMGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9pYTMyaW50cmluLmgKQEAgLTAsMCArMSwyNDIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9YODZJTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDxpYTMyaW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogMzJiaXQgYnNmICovCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYnNmZCAoaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9jdHogKF9fWCk7Cit9CisKKy8qIDMyYml0IGJzciAqLworZXh0ZXJuIF9faW5saW5lIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2JzcmQgKGludCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9ic3JzaSAoX19YKTsKK30KKworLyogMzJiaXQgYnN3YXAgKi8KK2V4dGVybiBfX2lubGluZSBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ic3dhcGQgKGludCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXAzMiAoX19YKTsKK30KKworI2lmZGVmIF9fU1NFNF8yX18KKy8qIDMyYml0IGFjY3VtdWxhdGUgQ1JDMzIgKHBvbHlub21pYWwgMHgxMUVEQzZGNDEpIHZhbHVlLiAgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19jcmMzMmIgKHVuc2lnbmVkIGludCBfX0MsIHVuc2lnbmVkIGNoYXIgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJxaSAoX19DLCBfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fY3JjMzJ3ICh1bnNpZ25lZCBpbnQgX19DLCB1bnNpZ25lZCBzaG9ydCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jcmMzMmhpIChfX0MsIF9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19jcmMzMmQgKHVuc2lnbmVkIGludCBfX0MsIHVuc2lnbmVkIGludCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jcmMzMnNpIChfX0MsIF9fVik7Cit9CisjZW5kaWYgLyogU1NFNC4yICovCisKKy8qIDMyYml0IHBvcGNudCAqLworZXh0ZXJuIF9faW5saW5lIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3BvcGNudGQgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnQgKF9fWCk7Cit9CisKKy8qIHJkcG1jICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcmRwbWMgKGludCBfX1MpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZHBtYyAoX19TKTsKK30KKworLyogcmR0c2MgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yZHRzYyAodm9pZCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkdHNjICgpOworfQorCisvKiByZHRzY3AgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yZHRzY3AgKHVuc2lnbmVkIGludCAqX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcmR0c2NwIChfX0EpOworfQorCisvKiA4Yml0IHJvbCAqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGNoYXIKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yb2xiICh1bnNpZ25lZCBjaGFyIF9fWCwgaW50IF9fQykKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JvbHFpIChfX1gsIF9fQyk7Cit9CisKKy8qIDE2Yml0IHJvbCAqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIHNob3J0CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcm9sdyAodW5zaWduZWQgc2hvcnQgX19YLCBpbnQgX19DKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcm9saGkgKF9fWCwgX19DKTsKK30KKworLyogMzJiaXQgcm9sICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcm9sZCAodW5zaWduZWQgaW50IF9fWCwgaW50IF9fQykKK3sKKyAgcmV0dXJuIChfX1ggPDwgX19DKSB8IChfX1ggPj4gKDMyIC0gX19DKSk7Cit9CisKKy8qIDhiaXQgcm9yICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgY2hhcgorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3JvcmIgKHVuc2lnbmVkIGNoYXIgX19YLCBpbnQgX19DKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcm9ycWkgKF9fWCwgX19DKTsKK30KKworLyogMTZiaXQgcm9yICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgc2hvcnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yb3J3ICh1bnNpZ25lZCBzaG9ydCBfX1gsIGludCBfX0MpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yb3JoaSAoX19YLCBfX0MpOworfQorCisvKiAzMmJpdCByb3IgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yb3JkICh1bnNpZ25lZCBpbnQgX19YLCBpbnQgX19DKQoreworICByZXR1cm4gKF9fWCA+PiBfX0MpIHwgKF9fWCA8PCAoMzIgLSBfX0MpKTsKK30KKworLyogUGF1c2UgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcGF1c2UgKHZvaWQpCit7CisgIF9fYnVpbHRpbl9pYTMyX3BhdXNlICgpOworfQorCisjaWZkZWYgX194ODZfNjRfXworLyogNjRiaXQgYnNmICovCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYnNmcSAobG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9jdHpsbCAoX19YKTsKK30KKworLyogNjRiaXQgYnNyICovCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYnNycSAobG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2JzcmRpIChfX1gpOworfQorCisvKiA2NGJpdCBic3dhcCAqLworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZworX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2Jzd2FwcSAobG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9ic3dhcDY0IChfX1gpOworfQorCisjaWZkZWYgX19TU0U0XzJfXworLyogNjRiaXQgYWNjdW11bGF0ZSBDUkMzMiAocG9seW5vbWlhbCAweDExRURDNkY0MSkgdmFsdWUuICAqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2NyYzMycSAodW5zaWduZWQgbG9uZyBsb25nIF9fQywgdW5zaWduZWQgbG9uZyBsb25nIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NyYzMyZGkgKF9fQywgX19WKTsKK30KKyNlbmRpZgorCisvKiA2NGJpdCBwb3BjbnQgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19wb3BjbnRxICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICByZXR1cm4gX19idWlsdGluX3BvcGNvdW50bGwgKF9fWCk7Cit9CisKKy8qIDY0Yml0IHJvbCAqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3JvbHEgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gsIGludCBfX0MpCit7CisgIHJldHVybiAoX19YIDw8IF9fQykgfCAoX19YID4+ICg2NCAtIF9fQykpOworfQorCisvKiA2NGJpdCByb3IgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yb3JxICh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCBpbnQgX19DKQoreworICByZXR1cm4gKF9fWCA+PiBfX0MpIHwgKF9fWCA8PCAoNjQgLSBfX0MpKTsKK30KKworI2RlZmluZSBfYnN3YXA2NChhKQkJX19ic3dhcHEoYSkKKyNkZWZpbmUgX3BvcGNudDY0KGEpCQlfX3BvcGNudHEoYSkKKyNkZWZpbmUgX2xyb3RsKGEsYikJCV9fcm9scSgoYSksIChiKSkKKyNkZWZpbmUgX2xyb3RyKGEsYikJCV9fcm9ycSgoYSksIChiKSkKKyNlbHNlCisjZGVmaW5lIF9scm90bChhLGIpCQlfX3JvbGQoKGEpLCAoYikpCisjZGVmaW5lIF9scm90cihhLGIpCQlfX3JvcmQoKGEpLCAoYikpCisjZW5kaWYKKworI2RlZmluZSBfYml0X3NjYW5fZm9yd2FyZChhKQlfX2JzZmQoYSkKKyNkZWZpbmUgX2JpdF9zY2FuX3JldmVyc2UoYSkJX19ic3JkKGEpCisjZGVmaW5lIF9ic3dhcChhKQkJX19ic3dhcGQoYSkKKyNkZWZpbmUgX3BvcGNudDMyKGEpCQlfX3BvcGNudGQoYSkKKyNkZWZpbmUgX3JkcG1jKGEpCQlfX3JkcG1jKGEpCisjZGVmaW5lIF9yZHRzYygpCQlfX3JkdHNjKCkKKyNkZWZpbmUgX3JkdHNjcChhKQkJX19yZHRzY3AoYSkKKyNkZWZpbmUgX3JvdHdsKGEsYikJCV9fcm9sdygoYSksIChiKSkKKyNkZWZpbmUgX3JvdHdyKGEsYikJCV9fcm9ydygoYSksIChiKSkKKyNkZWZpbmUgX3JvdGwoYSxiKQkJX19yb2xkKChhKSwgKGIpKQorI2RlZmluZSBfcm90cihhLGIpCQlfX3JvcmQoKGEpLCAoYikpCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9pbW1pbnRyaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2ltbWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzc3NTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9pbW1pbnRyaW4uaApAQCAtMCwwICsxLDE3NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0lNTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9JTU1JTlRSSU5fSF9JTkNMVURFRAorCisjaWZkZWYgX19NTVhfXworI2luY2x1ZGUgPG1taW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fU1NFX18KKyNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19TU0UyX18KKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19TU0UzX18KKyNpbmNsdWRlIDxwbW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19TU1NFM19fCisjaW5jbHVkZSA8dG1taW50cmluLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU1NFNF8yX18pIHx8IGRlZmluZWQgKF9fU1NFNF8xX18pCisjaW5jbHVkZSA8c21taW50cmluLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQUVTX18pIHx8IGRlZmluZWQgKF9fUENMTVVMX18pCisjaW5jbHVkZSA8d21taW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fQVZYX18KKyNpbmNsdWRlIDxhdnhpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19BVlgyX18KKyNpbmNsdWRlIDxhdngyaW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fTFpDTlRfXworI2luY2x1ZGUgPGx6Y250aW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fQk1JX18KKyNpbmNsdWRlIDxibWlpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19CTUkyX18KKyNpbmNsdWRlIDxibWkyaW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fRk1BX18KKyNpbmNsdWRlIDxmbWFpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19GMTZDX18KKyNpbmNsdWRlIDxmMTZjaW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fUlRNX18KKyNpbmNsdWRlIDxydG1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19SVE1fXworI2luY2x1ZGUgPHh0ZXN0aW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fUkRSTkRfXworZXh0ZXJuIF9faW5saW5lIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfcmRyYW5kMTZfc3RlcCAodW5zaWduZWQgc2hvcnQgKl9fUCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkcmFuZDE2X3N0ZXAgKF9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3JkcmFuZDMyX3N0ZXAgKHVuc2lnbmVkIGludCAqX19QKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcmRyYW5kMzJfc3RlcCAoX19QKTsKK30KKyNlbmRpZiAvKiBfX1JEUk5EX18gKi8KKworI2lmZGVmICBfX3g4Nl82NF9fCisjaWZkZWYgX19GU0dTQkFTRV9fCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19yZWFkZnNiYXNlX3UzMiAodm9pZCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkZnNiYXNlMzIgKCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3JlYWRmc2Jhc2VfdTY0ICh2b2lkKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcmRmc2Jhc2U2NCAoKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfcmVhZGdzYmFzZV91MzIgKHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZGdzYmFzZTMyICgpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19yZWFkZ3NiYXNlX3U2NCAodm9pZCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkZ3NiYXNlNjQgKCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK193cml0ZWZzYmFzZV91MzIgKHVuc2lnbmVkIGludCBfX0IpCit7CisgIF9fYnVpbHRpbl9pYTMyX3dyZnNiYXNlMzIgKF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK193cml0ZWZzYmFzZV91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX0IpCit7CisgIF9fYnVpbHRpbl9pYTMyX3dyZnNiYXNlNjQgKF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK193cml0ZWdzYmFzZV91MzIgKHVuc2lnbmVkIGludCBfX0IpCit7CisgIF9fYnVpbHRpbl9pYTMyX3dyZ3NiYXNlMzIgKF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK193cml0ZWdzYmFzZV91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX0IpCit7CisgIF9fYnVpbHRpbl9pYTMyX3dyZ3NiYXNlNjQgKF9fQik7Cit9CisjZW5kaWYgLyogX19GU0dTQkFTRV9fICovCisKKyNpZmRlZiBfX1JEUk5EX18KK2V4dGVybiBfX2lubGluZSBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3JkcmFuZDY0X3N0ZXAgKHVuc2lnbmVkIGxvbmcgbG9uZyAqX19QKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcmRyYW5kNjRfc3RlcCAoX19QKTsKK30KKyNlbmRpZiAvKiBfX1JEUk5EX18gKi8KKyNlbmRpZiAvKiBfX3g4Nl82NF9fICAqLworCisjZW5kaWYgLyogX0lNTUlOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9pc282NDYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2lzbzY0Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZGVjOTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9pc282NDYuaApAQCAtMCwwICsxLDQ1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyoKKyAqIElTTyBDIFN0YW5kYXJkOiAgNy45ICBBbHRlcm5hdGl2ZSBzcGVsbGluZ3MgIDxpc282NDYuaD4KKyAqLworCisjaWZuZGVmIF9JU082NDZfSAorI2RlZmluZSBfSVNPNjQ2X0gKKworI2lmbmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBhbmQJJiYKKyNkZWZpbmUgYW5kX2VxCSY9CisjZGVmaW5lIGJpdGFuZAkmCisjZGVmaW5lIGJpdG9yCXwKKyNkZWZpbmUgY29tcGwJfgorI2RlZmluZSBub3QJIQorI2RlZmluZSBub3RfZXEJIT0KKyNkZWZpbmUgb3IJfHwKKyNkZWZpbmUgb3JfZXEJfD0KKyNkZWZpbmUgeG9yCV4KKyNkZWZpbmUgeG9yX2VxCV49CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9sd3BpbnRyaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2x3cGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzA4NTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9sd3BpbnRyaW4uaApAQCAtMCwwICsxLDEwMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX1g4NklOVFJJTl9IX0lOQ0xVREVECisjIGVycm9yICJOZXZlciB1c2UgPGx3cGludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX0xXUElOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9MV1BJTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fTFdQX18KKyMgZXJyb3IgIkxXUCBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fbGx3cGNiICh2b2lkICpwY2JBZGRyZXNzKQoreworICBfX2J1aWx0aW5faWEzMl9sbHdwY2IgKHBjYkFkZHJlc3MpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCAqIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19zbHdwY2IgKHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9zbHdwY2IgKCk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19sd3B2YWwzMiAodW5zaWduZWQgaW50IGRhdGEyLCB1bnNpZ25lZCBpbnQgZGF0YTEsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgX19idWlsdGluX2lhMzJfbHdwdmFsMzIgKGRhdGEyLCBkYXRhMSwgZmxhZ3MpOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2x3cHZhbDY0ICh1bnNpZ25lZCBsb25nIGxvbmcgZGF0YTIsIHVuc2lnbmVkIGludCBkYXRhMSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworICBfX2J1aWx0aW5faWEzMl9sd3B2YWw2NCAoZGF0YTIsIGRhdGExLCBmbGFncyk7Cit9CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9fbHdwdmFsMzIoRDIsIEQxLCBGKSBcCisgIChfX2J1aWx0aW5faWEzMl9sd3B2YWwzMiAoKHVuc2lnbmVkIGludCkgKEQyKSwgKHVuc2lnbmVkIGludCkgKEQxKSwgXAorCQkJICAgICh1bnNpZ25lZCBpbnQpIChGKSkpCisjaWZkZWYgX194ODZfNjRfXworI2RlZmluZSBfX2x3cHZhbDY0KEQyLCBEMSwgRikgXAorICAoX19idWlsdGluX2lhMzJfbHdwdmFsNjQgKCh1bnNpZ25lZCBsb25nIGxvbmcpIChEMiksICh1bnNpZ25lZCBpbnQpIChEMSksIFwKKwkJCSAgICAodW5zaWduZWQgaW50KSAoRikpKQorI2VuZGlmCisjZW5kaWYKKworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgY2hhciBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fbHdwaW5zMzIgKHVuc2lnbmVkIGludCBkYXRhMiwgdW5zaWduZWQgaW50IGRhdGExLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9sd3BpbnMzMiAoZGF0YTIsIGRhdGExLCBmbGFncyk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgY2hhciBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fbHdwaW5zNjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhMiwgdW5zaWduZWQgaW50IGRhdGExLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9sd3BpbnM2NCAoZGF0YTIsIGRhdGExLCBmbGFncyk7Cit9CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9fbHdwaW5zMzIoRDIsIEQxLCBGKSBcCisgIChfX2J1aWx0aW5faWEzMl9sd3BpbnMzMiAoKHVuc2lnbmVkIGludCkgKEQyKSwgKHVuc2lnbmVkIGludCkgKEQxKSwgXAorCQkJICAgICh1bnNpZ25lZCBpbnQpIChGKSkpCisjaWZkZWYgX194ODZfNjRfXworI2RlZmluZSBfX2x3cGluczY0KEQyLCBEMSwgRikgXAorICAoX19idWlsdGluX2lhMzJfbHdwaW5zNjQgKCh1bnNpZ25lZCBsb25nIGxvbmcpIChEMiksICh1bnNpZ25lZCBpbnQpIChEMSksIFwKKwkJCSAgICAodW5zaWduZWQgaW50KSAoRikpKQorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIF9fTFdQX18gKi8KKworI2VuZGlmIC8qIF9MV1BJTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvbHpjbnRpbnRyaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2x6Y250aW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4MmJiOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2x6Y250aW50cmluLmgKQEAgLTAsMCArMSw2NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZiAhZGVmaW5lZCBfWDg2SU5UUklOX0hfSU5DTFVERUQgJiYgIWRlZmluZWQgX0lNTUlOVFJJTl9IX0lOQ0xVREVECisjIGVycm9yICJOZXZlciB1c2UgPGx6Y250aW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX0xaQ05UX18KKyMgZXJyb3IgIkxaQ05UIGluc3RydWN0aW9uIGlzIG5vdCBlbmFibGVkIgorI2VuZGlmIC8qIF9fTFpDTlRfXyAqLworCisjaWZuZGVmIF9MWkNOVElOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9MWkNOVElOVFJJTl9IX0lOQ0xVREVECisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBzaG9ydCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fbHpjbnQxNiAodW5zaWduZWQgc2hvcnQgX19YKQoreworICByZXR1cm4gX19idWlsdGluX2NsenMgKF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2x6Y250MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY2x6IChfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX2x6Y250X3UzMiAodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9jbHogKF9fWCk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19semNudDY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICByZXR1cm4gX19idWlsdGluX2NsemxsIChfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX2x6Y250X3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9jbHpsbCAoX19YKTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0xaQ05USU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL21tM2Rub3cuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL21tM2Rub3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTgwNmI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvbW0zZG5vdy5oCkBAIC0wLDAgKzEsMjEwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogSW1wbGVtZW50ZWQgZnJvbSB0aGUgbW0zZG5vdy5oIChvZiBzdXBwb3NlZGx5IEFNRCBvcmlnaW4pIGluY2x1ZGVkIHdpdGgKKyAgIE1TVkMgNy4xLiAgKi8KKworI2lmbmRlZiBfTU0zRE5PV19IX0lOQ0xVREVECisjZGVmaW5lIF9NTTNETk9XX0hfSU5DTFVERUQKKworI2lmZGVmIF9fM2ROT1dfXworCisjaW5jbHVkZSA8bW1pbnRyaW4uaD4KKyNpbmNsdWRlIDxwcmZjaHdpbnRyaW4uaD4KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9mZW1tcyAodm9pZCkKK3sKKyAgX19idWlsdGluX2lhMzJfZmVtbXMoKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGF2Z3VzYiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGF2Z3VzYiAoKF9fdjhxaSlfX0EsIChfX3Y4cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGYyaWQgKF9fbTY0IF9fQSkKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZjJpZCAoKF9fdjJzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZmFjYyAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZhY2MgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmYWRkIChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZmFkZCAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZjbXBlcSAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZjbXBlcSAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZjbXBnZSAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZjbXBnZSAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZjbXBndCAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZjbXBndCAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZtYXggKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmbWF4ICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZm1pbiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZtaW4gKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmbXVsIChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZm11bCAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZyY3AgKF9fbTY0IF9fQSkKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZnJjcCAoKF9fdjJzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZnJjcGl0MSAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZyY3BpdDEgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmcmNwaXQyIChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZnJjcGl0MiAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZyc3FydCAoX19tNjQgX19BKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmcnNxcnQgKChfX3Yyc2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZyc3FpdDEgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmcnNxaXQxICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZnN1YiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZzdWIgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3Bmc3ViciAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZzdWJyICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9waTJmZCAoX19tNjQgX19BKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BpMmZkICgoX192MnNpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BtdWxocncgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BtdWxocncgKChfX3Y0aGkpX19BLCAoX192NGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHJlZmV0Y2ggKHZvaWQgKl9fUCkKK3sKKyAgX19idWlsdGluX3ByZWZldGNoIChfX1AsIDAsIDMgLyogX01NX0hJTlRfVDAgKi8pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9mcm9tX2Zsb2F0IChmbG9hdCBfX0EpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX202NCkoX192MnNmKXsgX19BLCAwLjBmIH07Cit9CisKK2V4dGVybiBfX2lubGluZSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3RvX2Zsb2F0IChfX202NCBfX0EpCit7CisgIHVuaW9uIHsgX192MnNmIHY7IGZsb2F0IGFbMl07IH0gX190bXA7CisgIF9fdG1wLnYgPSAoX192MnNmKV9fQTsKKyAgcmV0dXJuIF9fdG1wLmFbMF07Cit9CisKKyNpZmRlZiBfXzNkTk9XX0FfXworCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZjJpdyAoX19tNjQgX19BKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmMml3ICgoX192MnNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmbmFjYyAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZuYWNjICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZnBuYWNjIChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZnBuYWNjICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9waTJmdyAoX19tNjQgX19BKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BpMmZ3ICgoX192MnNpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3Bzd2FwZCAoX19tNjQgX19BKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3Bzd2FwZHNmICgoX192MnNmKV9fQSk7Cit9CisKKyNlbmRpZiAvKiBfXzNkTk9XX0FfXyAqLworI2VuZGlmIC8qIF9fM2ROT1dfXyAqLworCisjZW5kaWYgLyogX01NM0ROT1dfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvbW1fbWFsbG9jLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9tbV9tYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTJkMWEwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvbW1fbWFsbG9jLmgKQEAgLTAsMCArMSw2MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX01NX01BTExPQ19IX0lOQ0xVREVECisjZGVmaW5lIF9NTV9NQUxMT0NfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZiAhZGVmaW5lZChfX0FORFJPSURfXykgfHwgZGVmaW5lZChIQVZFX1BPU0lYX01FTUFMSUdOKQorLyogV2UgY2FuJ3QgZGVwZW5kIG9uIDxzdGRsaWIuaD4gc2luY2UgdGhlIHByb3RvdHlwZSBvZiBwb3NpeF9tZW1hbGlnbgorICAgbWF5IG5vdCBiZSB2aXNpYmxlLiAgKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKK2V4dGVybiBpbnQgcG9zaXhfbWVtYWxpZ24gKHZvaWQgKiosIHNpemVfdCwgc2l6ZV90KTsKKyNlbHNlCitleHRlcm4gIkMiIGludCBwb3NpeF9tZW1hbGlnbiAodm9pZCAqKiwgc2l6ZV90LCBzaXplX3QpIHRocm93ICgpOworI2VuZGlmCisjZW5kaWYKKworc3RhdGljIF9faW5saW5lIHZvaWQgKgorX21tX21hbGxvYyAoc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQpCit7CisgIHZvaWQgKnB0cjsKKyAgaWYgKGFsaWdubWVudCA9PSAxKQorICAgIHJldHVybiBtYWxsb2MgKHNpemUpOworICBpZiAoYWxpZ25tZW50ID09IDIgfHwgKHNpemVvZiAodm9pZCAqKSA9PSA4ICYmIGFsaWdubWVudCA9PSA0KSkKKyAgICBhbGlnbm1lbnQgPSBzaXplb2YgKHZvaWQgKik7CisjaWYgIWRlZmluZWQoX19BTkRST0lEX18pIHx8IGRlZmluZWQoSEFWRV9QT1NJWF9NRU1BTElHTikKKyAgaWYgKHBvc2l4X21lbWFsaWduICgmcHRyLCBhbGlnbm1lbnQsIHNpemUpID09IDApCisgICAgcmV0dXJuIHB0cjsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworI2Vsc2UKKyAgcmV0dXJuIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK19tbV9mcmVlICh2b2lkICogcHRyKQoreworICBmcmVlIChwdHIpOworfQorCisjZW5kaWYgLyogX01NX01BTExPQ19IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9tbWludHJpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvbW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzYyMDNiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvbW1pbnRyaW4uaApAQCAtMCwwICsxLDkyMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEltcGxlbWVudGVkIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaW5jbHVkZWQgaW4gdGhlIEludGVsIEMrKyBDb21waWxlcgorICAgVXNlciBHdWlkZSBhbmQgUmVmZXJlbmNlLCB2ZXJzaW9uIDkuMC4gICovCisKKyNpZm5kZWYgX01NSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX01NSU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX01NWF9fCisjIGVycm9yICJNTVggaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2Vsc2UKKy8qIFRoZSBJbnRlbCBBUEkgaXMgZmxleGlibGUgZW5vdWdoIHRoYXQgd2UgbXVzdCBhbGxvdyBhbGlhc2luZyB3aXRoIG90aGVyCisgICB2ZWN0b3IgdHlwZXMsIGFuZCB0aGVpciBzY2FsYXIgY29tcG9uZW50cy4gICovCit0eXBlZGVmIGludCBfX202NCBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICg4KSwgX19tYXlfYWxpYXNfXykpOworCisvKiBJbnRlcm5hbCBkYXRhIHR5cGVzIGZvciBpbXBsZW1lbnRpbmcgdGhlIGludHJpbnNpY3MuICAqLwordHlwZWRlZiBpbnQgX192MnNpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDgpKSk7Cit0eXBlZGVmIHNob3J0IF9fdjRoaSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICg4KSkpOwordHlwZWRlZiBjaGFyIF9fdjhxaSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICg4KSkpOwordHlwZWRlZiBsb25nIGxvbmcgX192MWRpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDgpKSk7Cit0eXBlZGVmIGZsb2F0IF9fdjJzZiBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICg4KSkpOworCisvKiBFbXB0eSB0aGUgbXVsdGltZWRpYSBzdGF0ZS4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9lbXB0eSAodm9pZCkKK3sKKyAgX19idWlsdGluX2lhMzJfZW1tcyAoKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9lbXB0eSAodm9pZCkKK3sKKyAgX21tX2VtcHR5ICgpOworfQorCisvKiBDb252ZXJ0IEkgdG8gYSBfX202NCBvYmplY3QuICBUaGUgaW50ZWdlciBpcyB6ZXJvLWV4dGVuZGVkIHRvIDY0LWJpdHMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0ICBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTMyX3NpNjQgKGludCBfX2kpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3ZlY19pbml0X3Yyc2kgKF9faSwgMCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCAgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9mcm9tX2ludCAoaW50IF9faSkKK3sKKyAgcmV0dXJuIF9tbV9jdnRzaTMyX3NpNjQgKF9faSk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCisvKiBDb252ZXJ0IEkgdG8gYSBfX202NCBvYmplY3QuICAqLworCisvKiBJbnRlbCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0ICBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX2Zyb21faW50NjQgKGxvbmcgbG9uZyBfX2kpCit7CisgIHJldHVybiAoX19tNjQpIF9faTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0ICBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTY0X202NCAobG9uZyBsb25nIF9faSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19pOworfQorCisvKiBNaWNyb3NvZnQgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCAgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2k2NHhfc2k2NCAobG9uZyBsb25nIF9faSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9waTY0eCAobG9uZyBsb25nIF9faSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19pOworfQorI2VuZGlmCisKKy8qIENvbnZlcnQgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIF9fbTY0IG9iamVjdCBpbnRvIGFuIGludGVnZXIuICAqLworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTY0X3NpMzIgKF9fbTY0IF9faSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjJzaSAoKF9fdjJzaSlfX2ksIDApOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fdG9faW50IChfX202NCBfX2kpCit7CisgIHJldHVybiBfbW1fY3Z0c2k2NF9zaTMyIChfX2kpOworfQorCisjaWZkZWYgX194ODZfNjRfXworLyogQ29udmVydCB0aGUgX19tNjQgb2JqZWN0IHRvIGEgNjRiaXQgaW50ZWdlci4gICovCisKKy8qIEludGVsIGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fdG9faW50NjQgKF9fbTY0IF9faSkKK3sKKyAgcmV0dXJuIChsb25nIGxvbmcpX19pOworfQorCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dG02NF9zaTY0IChfX202NCBfX2kpCit7CisgIHJldHVybiAobG9uZyBsb25nKV9faTsKK30KKworLyogTWljcm9zb2Z0IGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpNjRfc2k2NHggKF9fbTY0IF9faSkKK3sKKyAgcmV0dXJuIChsb25nIGxvbmcpX19pOworfQorI2VuZGlmCisKKy8qIFBhY2sgdGhlIGZvdXIgMTYtYml0IHZhbHVlcyBmcm9tIE0xIGludG8gdGhlIGxvd2VyIGZvdXIgOC1iaXQgdmFsdWVzIG9mCisgICB0aGUgcmVzdWx0LCBhbmQgdGhlIGZvdXIgMTYtYml0IHZhbHVlcyBmcm9tIE0yIGludG8gdGhlIHVwcGVyIGZvdXIgOC1iaXQKKyAgIHZhbHVlcyBvZiB0aGUgcmVzdWx0LCBhbGwgd2l0aCBzaWduZWQgc2F0dXJhdGlvbi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcGFja3NfcGkxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFja3Nzd2IgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGFja3Nzd2IgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fcGFja3NfcGkxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIFBhY2sgdGhlIHR3byAzMi1iaXQgdmFsdWVzIGZyb20gTTEgaW4gdG8gdGhlIGxvd2VyIHR3byAxNi1iaXQgdmFsdWVzIG9mCisgICB0aGUgcmVzdWx0LCBhbmQgdGhlIHR3byAzMi1iaXQgdmFsdWVzIGZyb20gTTIgaW50byB0aGUgdXBwZXIgdHdvIDE2LWJpdAorICAgdmFsdWVzIG9mIHRoZSByZXN1bHQsIGFsbCB3aXRoIHNpZ25lZCBzYXR1cmF0aW9uLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wYWNrc19waTMyIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWNrc3NkdyAoKF9fdjJzaSlfX20xLCAoX192MnNpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYWNrc3NkdyAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9wYWNrc19waTMyIChfX20xLCBfX20yKTsKK30KKworLyogUGFjayB0aGUgZm91ciAxNi1iaXQgdmFsdWVzIGZyb20gTTEgaW50byB0aGUgbG93ZXIgZm91ciA4LWJpdCB2YWx1ZXMgb2YKKyAgIHRoZSByZXN1bHQsIGFuZCB0aGUgZm91ciAxNi1iaXQgdmFsdWVzIGZyb20gTTIgaW50byB0aGUgdXBwZXIgZm91ciA4LWJpdAorICAgdmFsdWVzIG9mIHRoZSByZXN1bHQsIGFsbCB3aXRoIHVuc2lnbmVkIHNhdHVyYXRpb24uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3BhY2tzX3B1MTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhY2t1c3diICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BhY2t1c3diIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3BhY2tzX3B1MTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBJbnRlcmxlYXZlIHRoZSBmb3VyIDgtYml0IHZhbHVlcyBmcm9tIHRoZSBoaWdoIGhhbGYgb2YgTTEgd2l0aCB0aGUgZm91cgorICAgOC1iaXQgdmFsdWVzIGZyb20gdGhlIGhpZ2ggaGFsZiBvZiBNMi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNraGlfcGk4IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wdW5wY2toYncgKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHVucGNraGJ3IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3VucGFja2hpX3BpOCAoX19tMSwgX19tMik7Cit9CisKKy8qIEludGVybGVhdmUgdGhlIHR3byAxNi1iaXQgdmFsdWVzIGZyb20gdGhlIGhpZ2ggaGFsZiBvZiBNMSB3aXRoIHRoZSB0d28KKyAgIDE2LWJpdCB2YWx1ZXMgZnJvbSB0aGUgaGlnaCBoYWxmIG9mIE0yLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2toaV9waTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wdW5wY2tod2QgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHVucGNraHdkIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3VucGFja2hpX3BpMTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBJbnRlcmxlYXZlIHRoZSAzMi1iaXQgdmFsdWUgZnJvbSB0aGUgaGlnaCBoYWxmIG9mIE0xIHdpdGggdGhlIDMyLWJpdAorICAgdmFsdWUgZnJvbSB0aGUgaGlnaCBoYWxmIG9mIE0yLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2toaV9waTMyIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wdW5wY2toZHEgKChfX3Yyc2kpX19tMSwgKF9fdjJzaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHVucGNraGRxIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3VucGFja2hpX3BpMzIgKF9fbTEsIF9fbTIpOworfQorCisvKiBJbnRlcmxlYXZlIHRoZSBmb3VyIDgtYml0IHZhbHVlcyBmcm9tIHRoZSBsb3cgaGFsZiBvZiBNMSB3aXRoIHRoZSBmb3VyCisgICA4LWJpdCB2YWx1ZXMgZnJvbSB0aGUgbG93IGhhbGYgb2YgTTIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2xvX3BpOCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHVucGNrbGJ3ICgoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3B1bnBja2xidyAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV91bnBhY2tsb19waTggKF9fbTEsIF9fbTIpOworfQorCisvKiBJbnRlcmxlYXZlIHRoZSB0d28gMTYtYml0IHZhbHVlcyBmcm9tIHRoZSBsb3cgaGFsZiBvZiBNMSB3aXRoIHRoZSB0d28KKyAgIDE2LWJpdCB2YWx1ZXMgZnJvbSB0aGUgbG93IGhhbGYgb2YgTTIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2xvX3BpMTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2x3ZCAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wdW5wY2tsd2QgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fdW5wYWNrbG9fcGkxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIEludGVybGVhdmUgdGhlIDMyLWJpdCB2YWx1ZSBmcm9tIHRoZSBsb3cgaGFsZiBvZiBNMSB3aXRoIHRoZSAzMi1iaXQKKyAgIHZhbHVlIGZyb20gdGhlIGxvdyBoYWxmIG9mIE0yLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2tsb19waTMyIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wdW5wY2tsZHEgKChfX3Yyc2kpX19tMSwgKF9fdjJzaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHVucGNrbGRxIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3VucGFja2xvX3BpMzIgKF9fbTEsIF9fbTIpOworfQorCisvKiBBZGQgdGhlIDgtYml0IHZhbHVlcyBpbiBNMSB0byB0aGUgOC1iaXQgdmFsdWVzIGluIE0yLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRfcGk4IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWRkYiAoKF9fdjhxaSlfX20xLCAoX192OHFpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYWRkYiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9hZGRfcGk4IChfX20xLCBfX20yKTsKK30KKworLyogQWRkIHRoZSAxNi1iaXQgdmFsdWVzIGluIE0xIHRvIHRoZSAxNi1iaXQgdmFsdWVzIGluIE0yLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRfcGkxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFkZHcgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGFkZHcgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fYWRkX3BpMTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBBZGQgdGhlIDMyLWJpdCB2YWx1ZXMgaW4gTTEgdG8gdGhlIDMyLWJpdCB2YWx1ZXMgaW4gTTIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZF9waTMyIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWRkZCAoKF9fdjJzaSlfX20xLCAoX192MnNpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYWRkZCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9hZGRfcGkzMiAoX19tMSwgX19tMik7Cit9CisKKy8qIEFkZCB0aGUgNjQtYml0IHZhbHVlcyBpbiBNMSB0byB0aGUgNjQtYml0IHZhbHVlcyBpbiBNMi4gICovCisjaWZkZWYgX19TU0UyX18KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRfc2k2NCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFkZHEgKChfX3YxZGkpX19tMSwgKF9fdjFkaSlfX20yKTsKK30KKyNlbmRpZgorCisvKiBBZGQgdGhlIDgtYml0IHZhbHVlcyBpbiBNMSB0byB0aGUgOC1iaXQgdmFsdWVzIGluIE0yIHVzaW5nIHNpZ25lZAorICAgc2F0dXJhdGVkIGFyaXRobWV0aWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZHNfcGk4IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWRkc2IgKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGFkZHNiIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2FkZHNfcGk4IChfX20xLCBfX20yKTsKK30KKworLyogQWRkIHRoZSAxNi1iaXQgdmFsdWVzIGluIE0xIHRvIHRoZSAxNi1iaXQgdmFsdWVzIGluIE0yIHVzaW5nIHNpZ25lZAorICAgc2F0dXJhdGVkIGFyaXRobWV0aWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZHNfcGkxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFkZHN3ICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BhZGRzdyAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9hZGRzX3BpMTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBBZGQgdGhlIDgtYml0IHZhbHVlcyBpbiBNMSB0byB0aGUgOC1iaXQgdmFsdWVzIGluIE0yIHVzaW5nIHVuc2lnbmVkCisgICBzYXR1cmF0ZWQgYXJpdGhtZXRpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkc19wdTggKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhZGR1c2IgKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGFkZHVzYiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9hZGRzX3B1OCAoX19tMSwgX19tMik7Cit9CisKKy8qIEFkZCB0aGUgMTYtYml0IHZhbHVlcyBpbiBNMSB0byB0aGUgMTYtYml0IHZhbHVlcyBpbiBNMiB1c2luZyB1bnNpZ25lZAorICAgc2F0dXJhdGVkIGFyaXRobWV0aWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZHNfcHUxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFkZHVzdyAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYWRkdXN3IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2FkZHNfcHUxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIFN1YnRyYWN0IHRoZSA4LWJpdCB2YWx1ZXMgaW4gTTIgZnJvbSB0aGUgOC1iaXQgdmFsdWVzIGluIE0xLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJfcGk4IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3ViYiAoKF9fdjhxaSlfX20xLCAoX192OHFpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3ViYiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9zdWJfcGk4IChfX20xLCBfX20yKTsKK30KKworLyogU3VidHJhY3QgdGhlIDE2LWJpdCB2YWx1ZXMgaW4gTTIgZnJvbSB0aGUgMTYtYml0IHZhbHVlcyBpbiBNMS4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3ViX3BpMTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzdWJ3ICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzdWJ3IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3N1Yl9waTE2IChfX20xLCBfX20yKTsKK30KKworLyogU3VidHJhY3QgdGhlIDMyLWJpdCB2YWx1ZXMgaW4gTTIgZnJvbSB0aGUgMzItYml0IHZhbHVlcyBpbiBNMS4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3ViX3BpMzIgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzdWJkICgoX192MnNpKV9fbTEsIChfX3Yyc2kpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzdWJkIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3N1Yl9waTMyIChfX20xLCBfX20yKTsKK30KKworLyogQWRkIHRoZSA2NC1iaXQgdmFsdWVzIGluIE0xIHRvIHRoZSA2NC1iaXQgdmFsdWVzIGluIE0yLiAgKi8KKyNpZmRlZiBfX1NTRTJfXworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1Yl9zaTY0IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3VicSAoKF9fdjFkaSlfX20xLCAoX192MWRpKV9fbTIpOworfQorI2VuZGlmCisKKy8qIFN1YnRyYWN0IHRoZSA4LWJpdCB2YWx1ZXMgaW4gTTIgZnJvbSB0aGUgOC1iaXQgdmFsdWVzIGluIE0xIHVzaW5nIHNpZ25lZAorICAgc2F0dXJhdGluZyBhcml0aG1ldGljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJzX3BpOCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHN1YnNiICgoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzdWJzYiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9zdWJzX3BpOCAoX19tMSwgX19tMik7Cit9CisKKy8qIFN1YnRyYWN0IHRoZSAxNi1iaXQgdmFsdWVzIGluIE0yIGZyb20gdGhlIDE2LWJpdCB2YWx1ZXMgaW4gTTEgdXNpbmcKKyAgIHNpZ25lZCBzYXR1cmF0aW5nIGFyaXRobWV0aWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1YnNfcGkxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHN1YnN3ICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzdWJzdyAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9zdWJzX3BpMTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBTdWJ0cmFjdCB0aGUgOC1iaXQgdmFsdWVzIGluIE0yIGZyb20gdGhlIDgtYml0IHZhbHVlcyBpbiBNMSB1c2luZworICAgdW5zaWduZWQgc2F0dXJhdGluZyBhcml0aG1ldGljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJzX3B1OCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHN1YnVzYiAoKF9fdjhxaSlfX20xLCAoX192OHFpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3VidXNiIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3N1YnNfcHU4IChfX20xLCBfX20yKTsKK30KKworLyogU3VidHJhY3QgdGhlIDE2LWJpdCB2YWx1ZXMgaW4gTTIgZnJvbSB0aGUgMTYtYml0IHZhbHVlcyBpbiBNMSB1c2luZworICAgdW5zaWduZWQgc2F0dXJhdGluZyBhcml0aG1ldGljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJzX3B1MTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzdWJ1c3cgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHN1YnVzdyAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9zdWJzX3B1MTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBNdWx0aXBseSBmb3VyIDE2LWJpdCB2YWx1ZXMgaW4gTTEgYnkgZm91ciAxNi1iaXQgdmFsdWVzIGluIE0yIHByb2R1Y2luZworICAgZm91ciAzMi1iaXQgaW50ZXJtZWRpYXRlIHJlc3VsdHMsIHdoaWNoIGFyZSB0aGVuIHN1bW1lZCBieSBwYWlycyB0bworICAgcHJvZHVjZSB0d28gMzItYml0IHJlc3VsdHMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hZGRfcGkxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcG1hZGR3ZCAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wbWFkZHdkIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX21hZGRfcGkxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIE11bHRpcGx5IGZvdXIgc2lnbmVkIDE2LWJpdCB2YWx1ZXMgaW4gTTEgYnkgZm91ciBzaWduZWQgMTYtYml0IHZhbHVlcyBpbgorICAgTTIgYW5kIHByb2R1Y2UgdGhlIGhpZ2ggMTYgYml0cyBvZiB0aGUgMzItYml0IHJlc3VsdHMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bGhpX3BpMTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BtdWxodyAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wbXVsaHcgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fbXVsaGlfcGkxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIE11bHRpcGx5IGZvdXIgMTYtYml0IHZhbHVlcyBpbiBNMSBieSBmb3VyIDE2LWJpdCB2YWx1ZXMgaW4gTTIgYW5kIHByb2R1Y2UKKyAgIHRoZSBsb3cgMTYgYml0cyBvZiB0aGUgcmVzdWx0cy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsbG9fcGkxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcG11bGx3ICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BtdWxsdyAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9tdWxsb19waTE2IChfX20xLCBfX20yKTsKK30KKworLyogU2hpZnQgZm91ciAxNi1iaXQgdmFsdWVzIGluIE0gbGVmdCBieSBDT1VOVC4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsX3BpMTYgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNsbHcgKChfX3Y0aGkpX19tLCAoX192NGhpKV9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc2xsdyAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NsbF9waTE2IChfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsaV9waTE2IChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2xsd2kgKChfX3Y0aGkpX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNsbHdpIChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NsbGlfcGkxNiAoX19tLCBfX2NvdW50KTsKK30KKworLyogU2hpZnQgdHdvIDMyLWJpdCB2YWx1ZXMgaW4gTSBsZWZ0IGJ5IENPVU5ULiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGxfcGkzMiAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2xsZCAoKF9fdjJzaSlfX20sIChfX3Yyc2kpX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzbGxkIChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc2xsX3BpMzIgKF9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGxpX3BpMzIgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzbGxkaSAoKF9fdjJzaSlfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc2xsZGkgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc2xsaV9waTMyIChfX20sIF9fY291bnQpOworfQorCisvKiBTaGlmdCB0aGUgNjQtYml0IHZhbHVlIGluIE0gbGVmdCBieSBDT1VOVC4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsX3NpNjQgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNsbHEgKChfX3YxZGkpX19tLCAoX192MWRpKV9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc2xscSAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NsbF9zaTY0IChfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsaV9zaTY0IChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2xscWkgKChfX3YxZGkpX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNsbHFpIChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NsbGlfc2k2NCAoX19tLCBfX2NvdW50KTsKK30KKworLyogU2hpZnQgZm91ciAxNi1iaXQgdmFsdWVzIGluIE0gcmlnaHQgYnkgQ09VTlQ7IHNoaWZ0IGluIHRoZSBzaWduIGJpdC4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JhX3BpMTYgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNyYXcgKChfX3Y0aGkpX19tLCAoX192NGhpKV9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3JhdyAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NyYV9waTE2IChfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JhaV9waTE2IChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3Jhd2kgKChfX3Y0aGkpX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNyYXdpIChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NyYWlfcGkxNiAoX19tLCBfX2NvdW50KTsKK30KKworLyogU2hpZnQgdHdvIDMyLWJpdCB2YWx1ZXMgaW4gTSByaWdodCBieSBDT1VOVDsgc2hpZnQgaW4gdGhlIHNpZ24gYml0LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmFfcGkzMiAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3JhZCAoKF9fdjJzaSlfX20sIChfX3Yyc2kpX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzcmFkIChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc3JhX3BpMzIgKF9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmFpX3BpMzIgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzcmFkaSAoKF9fdjJzaSlfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3JhZGkgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc3JhaV9waTMyIChfX20sIF9fY291bnQpOworfQorCisvKiBTaGlmdCBmb3VyIDE2LWJpdCB2YWx1ZXMgaW4gTSByaWdodCBieSBDT1VOVDsgc2hpZnQgaW4gemVyb3MuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybF9waTE2IChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3Bzcmx3ICgoX192NGhpKV9fbSwgKF9fdjRoaSlfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNybHcgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zcmxfcGkxNiAoX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybGlfcGkxNiAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNybHdpICgoX192NGhpKV9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3Bzcmx3aSAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zcmxpX3BpMTYgKF9fbSwgX19jb3VudCk7Cit9CisKKy8qIFNoaWZ0IHR3byAzMi1iaXQgdmFsdWVzIGluIE0gcmlnaHQgYnkgQ09VTlQ7IHNoaWZ0IGluIHplcm9zLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmxfcGkzMiAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3JsZCAoKF9fdjJzaSlfX20sIChfX3Yyc2kpX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzcmxkIChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc3JsX3BpMzIgKF9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmxpX3BpMzIgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzcmxkaSAoKF9fdjJzaSlfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3JsZGkgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc3JsaV9waTMyIChfX20sIF9fY291bnQpOworfQorCisvKiBTaGlmdCB0aGUgNjQtYml0IHZhbHVlIGluIE0gbGVmdCBieSBDT1VOVDsgc2hpZnQgaW4gemVyb3MuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybF9zaTY0IChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzcmxxICgoX192MWRpKV9fbSwgKF9fdjFkaSlfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNybHEgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zcmxfc2k2NCAoX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybGlfc2k2NCAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNybHFpICgoX192MWRpKV9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzcmxxaSAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zcmxpX3NpNjQgKF9fbSwgX19jb3VudCk7Cit9CisKKy8qIEJpdC13aXNlIEFORCB0aGUgNjQtYml0IHZhbHVlcyBpbiBNMSBhbmQgTTIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FuZF9zaTY0IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGFuZCAoX19tMSwgX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BhbmQgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fYW5kX3NpNjQgKF9fbTEsIF9fbTIpOworfQorCisvKiBCaXQtd2lzZSBjb21wbGVtZW50IHRoZSA2NC1iaXQgdmFsdWUgaW4gTTEgYW5kIGJpdC13aXNlIEFORCBpdCB3aXRoIHRoZQorICAgNjQtYml0IHZhbHVlIGluIE0yLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hbmRub3Rfc2k2NCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BhbmRuIChfX20xLCBfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGFuZG4gKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fYW5kbm90X3NpNjQgKF9fbTEsIF9fbTIpOworfQorCisvKiBCaXQtd2lzZSBpbmNsdXNpdmUgT1IgdGhlIDY0LWJpdCB2YWx1ZXMgaW4gTTEgYW5kIE0yLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9vcl9zaTY0IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcG9yIChfX20xLCBfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcG9yIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX29yX3NpNjQgKF9fbTEsIF9fbTIpOworfQorCisvKiBCaXQtd2lzZSBleGNsdXNpdmUgT1IgdGhlIDY0LWJpdCB2YWx1ZXMgaW4gTTEgYW5kIE0yLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV94b3Jfc2k2NCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3B4b3IgKF9fbTEsIF9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9weG9yIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3hvcl9zaTY0IChfX20xLCBfX20yKTsKK30KKworLyogQ29tcGFyZSBlaWdodCA4LWJpdCB2YWx1ZXMuICBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIDB4RkYgaWYgdGhlCisgICB0ZXN0IGlzIHRydWUgYW5kIHplcm8gaWYgZmFsc2UuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVxX3BpOCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGNtcGVxYiAoKF9fdjhxaSlfX20xLCAoX192OHFpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wY21wZXFiIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2NtcGVxX3BpOCAoX19tMSwgX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBndF9waTggKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BjbXBndGIgKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGNtcGd0YiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9jbXBndF9waTggKF9fbTEsIF9fbTIpOworfQorCisvKiBDb21wYXJlIGZvdXIgMTYtYml0IHZhbHVlcy4gIFRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gaXMgMHhGRkZGIGlmCisgICB0aGUgdGVzdCBpcyB0cnVlIGFuZCB6ZXJvIGlmIGZhbHNlLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlcV9waTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wY21wZXF3ICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BjbXBlcXcgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fY21wZXFfcGkxNiAoX19tMSwgX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBndF9waTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wY21wZ3R3ICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BjbXBndHcgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fY21wZ3RfcGkxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIENvbXBhcmUgdHdvIDMyLWJpdCB2YWx1ZXMuICBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIDB4RkZGRkZGRkYgaWYKKyAgIHRoZSB0ZXN0IGlzIHRydWUgYW5kIHplcm8gaWYgZmFsc2UuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVxX3BpMzIgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlcWQgKChfX3Yyc2kpX19tMSwgKF9fdjJzaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGNtcGVxZCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9jbXBlcV9waTMyIChfX20xLCBfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGd0X3BpMzIgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BjbXBndGQgKChfX3Yyc2kpX19tMSwgKF9fdjJzaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGNtcGd0ZCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9jbXBndF9waTMyIChfX20xLCBfX20yKTsKK30KKworLyogQ3JlYXRlcyBhIDY0LWJpdCB6ZXJvLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXR6ZXJvX3NpNjQgKHZvaWQpCit7CisgIHJldHVybiAoX19tNjQpMExMOworfQorCisvKiBDcmVhdGVzIGEgdmVjdG9yIG9mIHR3byAzMi1iaXQgdmFsdWVzOyBJMCBpcyBsZWFzdCBzaWduaWZpY2FudC4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X3BpMzIgKGludCBfX2kxLCBpbnQgX19pMCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfdmVjX2luaXRfdjJzaSAoX19pMCwgX19pMSk7Cit9CisKKy8qIENyZWF0ZXMgYSB2ZWN0b3Igb2YgZm91ciAxNi1iaXQgdmFsdWVzOyBXMCBpcyBsZWFzdCBzaWduaWZpY2FudC4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X3BpMTYgKHNob3J0IF9fdzMsIHNob3J0IF9fdzIsIHNob3J0IF9fdzEsIHNob3J0IF9fdzApCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3ZlY19pbml0X3Y0aGkgKF9fdzAsIF9fdzEsIF9fdzIsIF9fdzMpOworfQorCisvKiBDcmVhdGVzIGEgdmVjdG9yIG9mIGVpZ2h0IDgtYml0IHZhbHVlczsgQjAgaXMgbGVhc3Qgc2lnbmlmaWNhbnQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9waTggKGNoYXIgX19iNywgY2hhciBfX2I2LCBjaGFyIF9fYjUsIGNoYXIgX19iNCwKKwkgICAgIGNoYXIgX19iMywgY2hhciBfX2IyLCBjaGFyIF9fYjEsIGNoYXIgX19iMCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfdmVjX2luaXRfdjhxaSAoX19iMCwgX19iMSwgX19iMiwgX19iMywKKwkJCQkJICAgICAgIF9fYjQsIF9fYjUsIF9fYjYsIF9fYjcpOworfQorCisvKiBTaW1pbGFyLCBidXQgd2l0aCB0aGUgYXJndW1lbnRzIGluIHJldmVyc2Ugb3JkZXIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldHJfcGkzMiAoaW50IF9faTAsIGludCBfX2kxKQoreworICByZXR1cm4gX21tX3NldF9waTMyIChfX2kxLCBfX2kwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldHJfcGkxNiAoc2hvcnQgX193MCwgc2hvcnQgX193MSwgc2hvcnQgX193Miwgc2hvcnQgX193MykKK3sKKyAgcmV0dXJuIF9tbV9zZXRfcGkxNiAoX193MywgX193MiwgX193MSwgX193MCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRyX3BpOCAoY2hhciBfX2IwLCBjaGFyIF9fYjEsIGNoYXIgX19iMiwgY2hhciBfX2IzLAorCSAgICAgIGNoYXIgX19iNCwgY2hhciBfX2I1LCBjaGFyIF9fYjYsIGNoYXIgX19iNykKK3sKKyAgcmV0dXJuIF9tbV9zZXRfcGk4IChfX2I3LCBfX2I2LCBfX2I1LCBfX2I0LCBfX2IzLCBfX2IyLCBfX2IxLCBfX2IwKTsKK30KKworLyogQ3JlYXRlcyBhIHZlY3RvciBvZiB0d28gMzItYml0IHZhbHVlcywgYm90aCBlbGVtZW50cyBjb250YWluaW5nIEkuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldDFfcGkzMiAoaW50IF9faSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfcGkzMiAoX19pLCBfX2kpOworfQorCisvKiBDcmVhdGVzIGEgdmVjdG9yIG9mIGZvdXIgMTYtYml0IHZhbHVlcywgYWxsIGVsZW1lbnRzIGNvbnRhaW5pbmcgVy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0MV9waTE2IChzaG9ydCBfX3cpCit7CisgIHJldHVybiBfbW1fc2V0X3BpMTYgKF9fdywgX193LCBfX3csIF9fdyk7Cit9CisKKy8qIENyZWF0ZXMgYSB2ZWN0b3Igb2YgZWlnaHQgOC1iaXQgdmFsdWVzLCBhbGwgZWxlbWVudHMgY29udGFpbmluZyBCLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXQxX3BpOCAoY2hhciBfX2IpCit7CisgIHJldHVybiBfbW1fc2V0X3BpOCAoX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IpOworfQorCisjZW5kaWYgLyogX19NTVhfXyAqLworI2VuZGlmIC8qIF9NTUlOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9ubW1pbnRyaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL25tbWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZmJlZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9ubW1pbnRyaW4uaApAQCAtMCwwICsxLDM3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogSW1wbGVtZW50ZWQgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBpbmNsdWRlZCBpbiB0aGUgSW50ZWwgQysrIENvbXBpbGVyCisgICBVc2VyIEd1aWRlIGFuZCBSZWZlcmVuY2UsIHZlcnNpb24gMTAuMC4gICovCisKKyNpZm5kZWYgX05NTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9OTU1JTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fU1NFNF8yX18KKyMgZXJyb3IgIlNTRTQuMiBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorLyogV2UganVzdCBpbmNsdWRlIFNTRTQuMSBoZWFkZXIgZmlsZS4gICovCisjaW5jbHVkZSA8c21taW50cmluLmg+CisjZW5kaWYgLyogX19TU0U0XzJfXyAqLworCisjZW5kaWYgLyogX05NTUlOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9wbW1pbnRyaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3BtbWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNjk1NmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9wbW1pbnRyaW4uaApAQCAtMCwwICsxLDEyNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEltcGxlbWVudGVkIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaW5jbHVkZWQgaW4gdGhlIEludGVsIEMrKyBDb21waWxlcgorICAgVXNlciBHdWlkZSBhbmQgUmVmZXJlbmNlLCB2ZXJzaW9uIDkuMC4gICovCisKKyNpZm5kZWYgX1BNTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9QTU1JTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fU1NFM19fCisjIGVycm9yICJTU0UzIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbHNlCisKKy8qIFdlIG5lZWQgZGVmaW5pdGlvbnMgZnJvbSB0aGUgU1NFMiBhbmQgU1NFIGhlYWRlciBmaWxlcyovCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisKKy8qIEFkZGl0aW9uYWwgYml0cyBpbiB0aGUgTVhDU1IuICAqLworI2RlZmluZSBfTU1fREVOT1JNQUxTX1pFUk9fTUFTSwkJMHgwMDQwCisjZGVmaW5lIF9NTV9ERU5PUk1BTFNfWkVST19PTgkJMHgwMDQwCisjZGVmaW5lIF9NTV9ERU5PUk1BTFNfWkVST19PRkYJCTB4MDAwMAorCisjZGVmaW5lIF9NTV9TRVRfREVOT1JNQUxTX1pFUk9fTU9ERShtb2RlKSBcCisgIF9tbV9zZXRjc3IgKChfbW1fZ2V0Y3NyICgpICYgfl9NTV9ERU5PUk1BTFNfWkVST19NQVNLKSB8IChtb2RlKSkKKyNkZWZpbmUgX01NX0dFVF9ERU5PUk1BTFNfWkVST19NT0RFKCkgXAorICAoX21tX2dldGNzcigpICYgX01NX0RFTk9STUFMU19aRVJPX01BU0spCisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkc3ViX3BzIChfX20xMjggX19YLCBfX20xMjggX19ZKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfYWRkc3VicHMgKChfX3Y0c2YpX19YLCAoX192NHNmKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZF9wcyAoX19tMTI4IF9fWCwgX19tMTI4IF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2hhZGRwcyAoKF9fdjRzZilfX1gsIChfX3Y0c2YpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oc3ViX3BzIChfX20xMjggX19YLCBfX20xMjggX19ZKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfaHN1YnBzICgoX192NHNmKV9fWCwgKF9fdjRzZilfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdmVoZHVwX3BzIChfX20xMjggX19YKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbW92c2hkdXAgKChfX3Y0c2YpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tb3ZlbGR1cF9wcyAoX19tMTI4IF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21vdnNsZHVwICgoX192NHNmKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZHN1Yl9wZCAoX19tMTI4ZCBfX1gsIF9fbTEyOGQgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2FkZHN1YnBkICgoX192MmRmKV9fWCwgKF9fdjJkZilfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkX3BkIChfX20xMjhkIF9fWCwgX19tMTI4ZCBfX1kpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfaGFkZHBkICgoX192MmRmKV9fWCwgKF9fdjJkZilfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oc3ViX3BkIChfX20xMjhkIF9fWCwgX19tMTI4ZCBfX1kpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfaHN1YnBkICgoX192MmRmKV9fWCwgKF9fdjJkZilfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkZHVwX3BkIChkb3VibGUgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIF9tbV9sb2FkMV9wZCAoX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZWR1cF9wZCAoX19tMTI4ZCBfX1gpCit7CisgIHJldHVybiBfbW1fc2h1ZmZsZV9wZCAoX19YLCBfX1gsIF9NTV9TSFVGRkxFMiAoMCwwKSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xkZHF1X3NpMTI4IChfX20xMjhpIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbGRkcXUgKChjaGFyIGNvbnN0ICopX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW9uaXRvciAodm9pZCBjb25zdCAqIF9fUCwgdW5zaWduZWQgaW50IF9fRSwgdW5zaWduZWQgaW50IF9fSCkKK3sKKyAgX19idWlsdGluX2lhMzJfbW9uaXRvciAoX19QLCBfX0UsIF9fSCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX213YWl0ICh1bnNpZ25lZCBpbnQgX19FLCB1bnNpZ25lZCBpbnQgX19IKQoreworICBfX2J1aWx0aW5faWEzMl9td2FpdCAoX19FLCBfX0gpOworfQorCisjZW5kaWYgLyogX19TU0UzX18gKi8KKworI2VuZGlmIC8qIF9QTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvcG9wY250aW50cmluLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9wb3BjbnRpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjdlZmRmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvcG9wY250aW50cmluLmgKQEAgLTAsMCArMSw0NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX19QT1BDTlRfXworIyBlcnJvciAiUE9QQ05UIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbmRpZiAvKiBfX1BPUENOVF9fICovCisKKyNpZm5kZWYgX1BPUENOVElOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9QT1BDTlRJTlRSSU5fSF9JTkNMVURFRAorCisvKiBDYWxjdWxhdGUgYSBudW1iZXIgb2YgYml0cyBzZXQgdG8gMS4gICovCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3BvcGNudF91MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnQgKF9fWCk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nICBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wb3BjbnRfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICByZXR1cm4gX19idWlsdGluX3BvcGNvdW50bGwgKF9fWCk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9QT1BDTlRJTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvcHJmY2h3aW50cmluLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9wcmZjaHdpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODAxMWJiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvcHJmY2h3aW50cmluLmgKQEAgLTAsMCArMSw0MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZiAhZGVmaW5lZCBfWDg2SU5UUklOX0hfSU5DTFVERUQgJiYgIWRlZmluZWQgX01NM0ROT1dfSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDxwcmZjaHdpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBvciA8bW0zZG5vdy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZCAoX19QUkZDSFdfXykgJiYgIWRlZmluZWQgKF9fM2ROT1dfXykKKyMgZXJyb3IgIlBSRkNIVyBpbnN0cnVjdGlvbiBub3QgZW5hYmxlZCIKKyNlbmRpZiAvKiBfX1BSRkNIV19fIG9yICBfXzNkTk9XX18qLworCisjaWZuZGVmIF9QUkZDSFdJTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfUFJGQ0hXSU5UUklOX0hfSU5DTFVERUQKKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wcmVmZXRjaHcgKHZvaWQgKl9fUCkKK3sKKyAgX19idWlsdGluX3ByZWZldGNoIChfX1AsIDEsIDMgLyogX01NX0hJTlRfVDAgKi8pOworfQorCisjZW5kaWYgLyogX1BSRkNIV0lOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9yZHNlZWRpbnRyaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3Jkc2VlZGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMGMyMzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9yZHNlZWRpbnRyaW4uaApAQCAtMCwwICsxLDU4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmICFkZWZpbmVkIF9YODZJTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDxyZHNlZWRpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fUkRTRUVEX18KKyMgZXJyb3IgIlJEU0VFRCBpbnN0cnVjdGlvbiBub3QgZW5hYmxlZCIKKyNlbmRpZiAvKiBfX1JEU0VFRF9fICovCisKKyNpZm5kZWYgX1JEU0VFRElOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9SRFNFRURJTlRSSU5fSF9JTkNMVURFRAorCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19yZHNlZWQxNl9zdGVwICh1bnNpZ25lZCBzaG9ydCAqcCkKK3sKKyAgICByZXR1cm4gX19idWlsdGluX2lhMzJfcmRzZWVkX2hpX3N0ZXAgKHApOworfQorCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19yZHNlZWQzMl9zdGVwICh1bnNpZ25lZCBpbnQgKnApCit7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Jkc2VlZF9zaV9zdGVwIChwKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK2V4dGVybiBfX2lubGluZSBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3Jkc2VlZDY0X3N0ZXAgKHVuc2lnbmVkIGxvbmcgbG9uZyAqcCkKK3sKKyAgICByZXR1cm4gX19idWlsdGluX2lhMzJfcmRzZWVkX2RpX3N0ZXAgKHApOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfUkRTRUVESU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3J0bWludHJpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvcnRtaW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzYTc3MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3J0bWludHJpbi5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9JTU1JTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDxydG1pbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fUlRNX18KKyMgZXJyb3IgIlJUTSBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZW5kaWYgLyogX19SVE1fXyAqLworCisjaWZuZGVmIF9SVE1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfUlRNSU5UUklOX0hfSU5DTFVERUQKKworI2RlZmluZSBfWEJFR0lOX1NUQVJURUQJCSh+MHUpCisjZGVmaW5lIF9YQUJPUlRfRVhQTElDSVQJKDEgPDwgMCkKKyNkZWZpbmUgX1hBQk9SVF9SRVRSWQkJKDEgPDwgMSkKKyNkZWZpbmUgX1hBQk9SVF9DT05GTElDVAkoMSA8PCAyKQorI2RlZmluZSBfWEFCT1JUX0NBUEFDSVRZCSgxIDw8IDMpCisjZGVmaW5lIF9YQUJPUlRfREVCVUcJCSgxIDw8IDQpCisjZGVmaW5lIF9YQUJPUlRfTkVTVEVECQkoMSA8PCA1KQorI2RlZmluZSBfWEFCT1JUX0NPREUoeCkJCSgoKHgpID4+IDI0KSAmIDB4RkYpCisKKy8qIFN0YXJ0IGFuIFJUTSBjb2RlIHJlZ2lvbi4gIFJldHVybiBfWEJFR0lOX1NUQVJURUQgb24gc3VjY2VzcyBhbmQgdGhlCisgICBhYm9ydCBjb25kaXRpb24gb3RoZXJ3aXNlLiAgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3hiZWdpbiAodm9pZCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3hiZWdpbiAoKTsKK30KKworLyogU3BlY2lmeSB0aGUgZW5kIG9mIGFuIFJUTSBjb2RlIHJlZ2lvbi4gIElmIGl0IGNvcnJlc3BvbmRzIHRvIHRoZQorICAgb3V0ZXJtb3N0IHRyYW5zYWN0aW9uLCB0aGVuIGF0dGVtcHRzIHRoZSB0cmFuc2FjdGlvbiBjb21taXQuICBJZiB0aGUKKyAgIGNvbW1pdCBmYWlscywgdGhlbiBjb250cm9sIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBvdXRlcm1vc3QgdHJhbnNhY3Rpb24KKyAgIGZhbGxiYWNrIGhhbmRsZXIuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3hlbmQgKHZvaWQpCit7CisgIF9fYnVpbHRpbl9pYTMyX3hlbmQgKCk7Cit9CisKKy8qIEZvcmNlIGFuIFJUTSBhYm9ydCBjb25kaXRpb24uIFRoZSBjb250cm9sIGlzIHRyYW5zZmVycmVkIHRvIHRoZQorICAgb3V0ZXJtb3N0IHRyYW5zYWN0aW9uIGZhbGxiYWNrIGhhbmRsZXIgd2l0aCB0aGUgYWJvcnQgY29uZGl0aW9uIElNTS4gICovCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfeGFib3J0IChjb25zdCB1bnNpZ25lZCBpbnQgaW1tKQoreworICBfX2J1aWx0aW5faWEzMl94YWJvcnQgKGltbSk7Cit9CisjZWxzZQorI2RlZmluZSBfeGFib3J0KE4pICBfX2J1aWx0aW5faWEzMl94YWJvcnQgKE4pCisjZW5kaWYgLyogX19PUFRJTUlaRV9fICovCisKKyNlbmRpZiAvKiBfUlRNSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3NtbWludHJpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc21taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlOTE2YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3NtbWludHJpbi5oCkBAIC0wLDAgKzEsODMwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogSW1wbGVtZW50ZWQgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBpbmNsdWRlZCBpbiB0aGUgSW50ZWwgQysrIENvbXBpbGVyCisgICBVc2VyIEd1aWRlIGFuZCBSZWZlcmVuY2UsIHZlcnNpb24gMTAuMC4gICovCisKKyNpZm5kZWYgX1NNTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9TTU1JTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fU1NFNF8xX18KKyMgZXJyb3IgIlNTRTQuMSBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCisvKiBXZSBuZWVkIGRlZmluaXRpb25zIGZyb20gdGhlIFNTU0UzLCBTU0UzLCBTU0UyIGFuZCBTU0UgaGVhZGVyCisgICBmaWxlcy4gICovCisjaW5jbHVkZSA8dG1taW50cmluLmg+CisKKy8qIFJvdW5kaW5nIG1vZGUgbWFjcm9zLiAqLworI2RlZmluZSBfTU1fRlJPVU5EX1RPX05FQVJFU1RfSU5UCTB4MDAKKyNkZWZpbmUgX01NX0ZST1VORF9UT19ORUdfSU5GCQkweDAxCisjZGVmaW5lIF9NTV9GUk9VTkRfVE9fUE9TX0lORgkJMHgwMgorI2RlZmluZSBfTU1fRlJPVU5EX1RPX1pFUk8JCTB4MDMKKyNkZWZpbmUgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OCTB4MDQKKworI2RlZmluZSBfTU1fRlJPVU5EX1JBSVNFX0VYQwkJMHgwMAorI2RlZmluZSBfTU1fRlJPVU5EX05PX0VYQwkJMHgwOAorCisjZGVmaW5lIF9NTV9GUk9VTkRfTklOVAkJXAorICAoX01NX0ZST1VORF9UT19ORUFSRVNUX0lOVCB8IF9NTV9GUk9VTkRfUkFJU0VfRVhDKQorI2RlZmluZSBfTU1fRlJPVU5EX0ZMT09SCVwKKyAgKF9NTV9GUk9VTkRfVE9fTkVHX0lORiB8IF9NTV9GUk9VTkRfUkFJU0VfRVhDKQorI2RlZmluZSBfTU1fRlJPVU5EX0NFSUwJCVwKKyAgKF9NTV9GUk9VTkRfVE9fUE9TX0lORiB8IF9NTV9GUk9VTkRfUkFJU0VfRVhDKQorI2RlZmluZSBfTU1fRlJPVU5EX1RSVU5DCVwKKyAgKF9NTV9GUk9VTkRfVE9fWkVSTyB8IF9NTV9GUk9VTkRfUkFJU0VfRVhDKQorI2RlZmluZSBfTU1fRlJPVU5EX1JJTlQJCVwKKyAgKF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTiB8IF9NTV9GUk9VTkRfUkFJU0VfRVhDKQorI2RlZmluZSBfTU1fRlJPVU5EX05FQVJCWUlOVAlcCisgIChfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04gfCBfTU1fRlJPVU5EX05PX0VYQykKKworLyogVGVzdCBJbnN0cnVjdGlvbiAqLworLyogUGFja2VkIGludGVnZXIgMTI4LWJpdCBiaXR3aXNlIGNvbXBhcmlzb24uIFJldHVybiAxIGlmCisgICAoX19WICYgX19NKSA9PSAwLiAgKi8KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdGVzdHpfc2kxMjggKF9fbTEyOGkgX19NLCBfX20xMjhpIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3B0ZXN0ejEyOCAoKF9fdjJkaSlfX00sIChfX3YyZGkpX19WKTsKK30KKworLyogUGFja2VkIGludGVnZXIgMTI4LWJpdCBiaXR3aXNlIGNvbXBhcmlzb24uIFJldHVybiAxIGlmCisgICAoX19WICYgfl9fTSkgPT0gMC4gICovCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Rlc3RjX3NpMTI4IChfX20xMjhpIF9fTSwgX19tMTI4aSBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wdGVzdGMxMjggKChfX3YyZGkpX19NLCAoX192MmRpKV9fVik7Cit9CisKKy8qIFBhY2tlZCBpbnRlZ2VyIDEyOC1iaXQgYml0d2lzZSBjb21wYXJpc29uLiBSZXR1cm4gMSBpZgorICAgKF9fViAmIF9fTSkgIT0gMCAmJiAoX19WICYgfl9fTSkgIT0gMC4gICovCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Rlc3RuemNfc2kxMjggKF9fbTEyOGkgX19NLCBfX20xMjhpIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bnpjMTI4ICgoX192MmRpKV9fTSwgKF9fdjJkaSlfX1YpOworfQorCisvKiBNYWNyb3MgZm9yIHBhY2tlZCBpbnRlZ2VyIDEyOC1iaXQgY29tcGFyaXNvbiBpbnRyaW5zaWNzLiAgKi8KKyNkZWZpbmUgX21tX3Rlc3RfYWxsX3plcm9zKE0sIFYpIF9tbV90ZXN0el9zaTEyOCAoKE0pLCAoVikpCisKKyNkZWZpbmUgX21tX3Rlc3RfYWxsX29uZXMoVikgXAorICBfbW1fdGVzdGNfc2kxMjggKChWKSwgX21tX2NtcGVxX2VwaTMyICgoViksIChWKSkpCisKKyNkZWZpbmUgX21tX3Rlc3RfbWl4X29uZXNfemVyb3MoTSwgVikgX21tX3Rlc3RuemNfc2kxMjggKChNKSwgKFYpKQorCisvKiBQYWNrZWQvc2NhbGFyIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcuICAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yb3VuZF9wZCAoX19tMTI4ZCBfX1YsIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfcm91bmRwZCAoKF9fdjJkZilfX1YsIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JvdW5kX3NkKF9fbTEyOGQgX19ELCBfX20xMjhkIF9fViwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9yb3VuZHNkICgoX192MmRmKV9fRCwKKwkJCQkJICAgKF9fdjJkZilfX1YsCisJCQkJCSAgIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fcm91bmRfcGQoViwgTSkgXAorICAoKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3JvdW5kcGQgKChfX3YyZGYpKF9fbTEyOGQpKFYpLCAoaW50KShNKSkpCisKKyNkZWZpbmUgX21tX3JvdW5kX3NkKEQsIFYsIE0pCQkJCQkJXAorICAoKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3JvdW5kc2QgKChfX3YyZGYpKF9fbTEyOGQpKEQpLAkJXAorCQkJCSAgICAgKF9fdjJkZikoX19tMTI4ZCkoViksIChpbnQpKE0pKSkKKyNlbmRpZgorCisvKiBQYWNrZWQvc2NhbGFyIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcuICAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JvdW5kX3BzIChfX20xMjggX19WLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcm91bmRwcyAoKF9fdjRzZilfX1YsIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcm91bmRfc3MgKF9fbTEyOCBfX0QsIF9fbTEyOCBfX1YsIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yb3VuZHNzICgoX192NHNmKV9fRCwKKwkJCQkJICAoX192NHNmKV9fViwKKwkJCQkJICBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX3JvdW5kX3BzKFYsIE0pIFwKKyAgKChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3JvdW5kcHMgKChfX3Y0c2YpKF9fbTEyOCkoViksIChpbnQpKE0pKSkKKworI2RlZmluZSBfbW1fcm91bmRfc3MoRCwgViwgTSkJCQkJCQlcCisgICgoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yb3VuZHNzICgoX192NHNmKShfX20xMjgpKEQpLAkJXAorCQkJCSAgICAoX192NHNmKShfX20xMjgpKFYpLCAoaW50KShNKSkpCisjZW5kaWYKKworLyogTWFjcm9zIGZvciBjZWlsL2Zsb29yIGludHJpbnNpY3MuICAqLworI2RlZmluZSBfbW1fY2VpbF9wZChWKQkgICBfbW1fcm91bmRfcGQgKChWKSwgX01NX0ZST1VORF9DRUlMKQorI2RlZmluZSBfbW1fY2VpbF9zZChELCBWKSAgX21tX3JvdW5kX3NkICgoRCksIChWKSwgX01NX0ZST1VORF9DRUlMKQorCisjZGVmaW5lIF9tbV9mbG9vcl9wZChWKQkgICBfbW1fcm91bmRfcGQoKFYpLCBfTU1fRlJPVU5EX0ZMT09SKQorI2RlZmluZSBfbW1fZmxvb3Jfc2QoRCwgVikgX21tX3JvdW5kX3NkICgoRCksIChWKSwgX01NX0ZST1VORF9GTE9PUikKKworI2RlZmluZSBfbW1fY2VpbF9wcyhWKQkgICBfbW1fcm91bmRfcHMgKChWKSwgX01NX0ZST1VORF9DRUlMKQorI2RlZmluZSBfbW1fY2VpbF9zcyhELCBWKSAgX21tX3JvdW5kX3NzICgoRCksIChWKSwgX01NX0ZST1VORF9DRUlMKQorCisjZGVmaW5lIF9tbV9mbG9vcl9wcyhWKQkgICBfbW1fcm91bmRfcHMgKChWKSwgX01NX0ZST1VORF9GTE9PUikKKyNkZWZpbmUgX21tX2Zsb29yX3NzKEQsIFYpIF9tbV9yb3VuZF9zcyAoKEQpLCAoViksIF9NTV9GUk9VTkRfRkxPT1IpCisKKy8qIFNTRTQuMSAqLworCisvKiBJbnRlZ2VyIGJsZW5kIGluc3RydWN0aW9ucyAtIHNlbGVjdCBkYXRhIGZyb20gMiBzb3VyY2VzIHVzaW5nCisgICBjb25zdGFudC92YXJpYWJsZSBtYXNrLiAgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYmxlbmRfZXBpMTYgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYmxlbmR3MTI4ICgoX192OGhpKV9fWCwKKwkJCQkJICAgICAgKF9fdjhoaSlfX1ksCisJCQkJCSAgICAgIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fYmxlbmRfZXBpMTYoWCwgWSwgTSkJCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYmxlbmR3MTI4ICgoX192OGhpKShfX20xMjhpKShYKSwJCVwKKwkJCQkJKF9fdjhoaSkoX19tMTI4aSkoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9ibGVuZHZfZXBpOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBfX20xMjhpIF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYmxlbmR2YjEyOCAoKF9fdjE2cWkpX19YLAorCQkJCQkgICAgICAgKF9fdjE2cWkpX19ZLAorCQkJCQkgICAgICAgKF9fdjE2cWkpX19NKTsKK30KKworLyogU2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBibGVuZCBpbnN0cnVjdGlvbnMgLSBzZWxlY3QgZGF0YQorICAgZnJvbSAyIHNvdXJjZXMgdXNpbmcgY29uc3RhbnQvdmFyaWFibGUgbWFzay4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYmxlbmRfcHMgKF9fbTEyOCBfX1gsIF9fbTEyOCBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9ibGVuZHBzICgoX192NHNmKV9fWCwKKwkJCQkJICAoX192NHNmKV9fWSwKKwkJCQkJICBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2JsZW5kX3BzKFgsIFksIE0pCQkJCQkJXAorICAoKF9fbTEyOCkgX19idWlsdGluX2lhMzJfYmxlbmRwcyAoKF9fdjRzZikoX19tMTI4KShYKSwJCVwKKwkJCQkgICAgKF9fdjRzZikoX19tMTI4KShZKSwgKGludCkoTSkpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYmxlbmR2X3BzIChfX20xMjggX19YLCBfX20xMjggX19ZLCBfX20xMjggX19NKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfYmxlbmR2cHMgKChfX3Y0c2YpX19YLAorCQkJCQkgICAoX192NHNmKV9fWSwKKwkJCQkJICAgKF9fdjRzZilfX00pOworfQorCisvKiBEb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGJsZW5kIGluc3RydWN0aW9ucyAtIHNlbGVjdCBkYXRhCisgICBmcm9tIDIgc291cmNlcyB1c2luZyBjb25zdGFudC92YXJpYWJsZSBtYXNrLiAgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYmxlbmRfcGQgKF9fbTEyOGQgX19YLCBfX20xMjhkIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9ibGVuZHBkICgoX192MmRmKV9fWCwKKwkJCQkJICAgKF9fdjJkZilfX1ksCisJCQkJCSAgIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fYmxlbmRfcGQoWCwgWSwgTSkJCQkJCQlcCisgICgoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfYmxlbmRwZCAoKF9fdjJkZikoX19tMTI4ZCkoWCksCQlcCisJCQkJICAgICAoX192MmRmKShfX20xMjhkKShZKSwgKGludCkoTSkpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2JsZW5kdl9wZCAoX19tMTI4ZCBfX1gsIF9fbTEyOGQgX19ZLCBfX20xMjhkIF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9ibGVuZHZwZCAoKF9fdjJkZilfX1gsCisJCQkJCSAgICAoX192MmRmKV9fWSwKKwkJCQkJICAgIChfX3YyZGYpX19NKTsKK30KKworLyogRG90IHByb2R1Y3QgaW5zdHJ1Y3Rpb25zIHdpdGggbWFzay1kZWZpbmVkIHN1bW1pbmcgYW5kIHplcm9pbmcgcGFydHMKKyAgIG9mIHJlc3VsdC4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZHBfcHMgKF9fbTEyOCBfX1gsIF9fbTEyOCBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9kcHBzICgoX192NHNmKV9fWCwKKwkJCQkgICAgICAgKF9fdjRzZilfX1ksCisJCQkJICAgICAgIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2RwX3BkIChfX20xMjhkIF9fWCwgX19tMTI4ZCBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZHBwZCAoKF9fdjJkZilfX1gsCisJCQkJCShfX3YyZGYpX19ZLAorCQkJCQlfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2RwX3BzKFgsIFksIE0pCQkJCQkJXAorICAoKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZHBwcyAoKF9fdjRzZikoX19tMTI4KShYKSwJCQlcCisJCQkJIChfX3Y0c2YpKF9fbTEyOCkoWSksIChpbnQpKE0pKSkKKworI2RlZmluZSBfbW1fZHBfcGQoWCwgWSwgTSkJCQkJCQlcCisgICgoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZHBwZCAoKF9fdjJkZikoX19tMTI4ZCkoWCksCQkJXAorCQkJCSAgKF9fdjJkZikoX19tMTI4ZCkoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCisvKiBQYWNrZWQgaW50ZWdlciA2NC1iaXQgY29tcGFyaXNvbiwgemVyb2luZyBvciBmaWxsaW5nIHdpdGggb25lcworICAgY29ycmVzcG9uZGluZyBwYXJ0cyBvZiByZXN1bHQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXFfZXBpNjQgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wY21wZXFxICgoX192MmRpKV9fWCwgKF9fdjJkaSlfX1kpOworfQorCisvKiAgTWluL21heCBwYWNrZWQgaW50ZWdlciBpbnN0cnVjdGlvbnMuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fZXBpOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtaW5zYjEyOCAoKF9fdjE2cWkpX19YLCAoX192MTZxaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXhfZXBpOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzYjEyOCAoKF9fdjE2cWkpX19YLCAoX192MTZxaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fZXB1MTYgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWludXcxMjggKChfX3Y4aGkpX19YLCAoX192OGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21heF9lcHUxNiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtYXh1dzEyOCAoKF9fdjhoaSlfX1gsIChfX3Y4aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWluX2VwaTMyIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1pbnNkMTI4ICgoX192NHNpKV9fWCwgKF9fdjRzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXhfZXBpMzIgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWF4c2QxMjggKChfX3Y0c2kpX19YLCAoX192NHNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21pbl9lcHUzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtaW51ZDEyOCAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWF4X2VwdTMyIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1heHVkMTI4ICgoX192NHNpKV9fWCwgKF9fdjRzaSlfX1kpOworfQorCisvKiBQYWNrZWQgaW50ZWdlciAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2l0aCB0cnVuY2F0aW9uIG9mIHVwcGVyCisgICBoYWx2ZXMgb2YgcmVzdWx0cy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxsb19lcGkzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtdWxsZDEyOCAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworLyogUGFja2VkIGludGVnZXIgMzItYml0IG11bHRpcGxpY2F0aW9uIG9mIDIgcGFpcnMgb2Ygb3BlcmFuZHMKKyAgIHdpdGggdHdvIDY0LWJpdCByZXN1bHRzLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bF9lcGkzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtdWxkcTEyOCAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworLyogSW5zZXJ0IHNpbmdsZSBwcmVjaXNpb24gZmxvYXQgaW50byBwYWNrZWQgc2luZ2xlIHByZWNpc2lvbiBhcnJheQorICAgZWxlbWVudCBzZWxlY3RlZCBieSBpbmRleCBOLiAgVGhlIGJpdHMgWzctNl0gb2YgTiBkZWZpbmUgUworICAgaW5kZXgsIHRoZSBiaXRzIFs1LTRdIGRlZmluZSBEIGluZGV4LCBhbmQgYml0cyBbMy0wXSBkZWZpbmUKKyAgIHplcm9pbmcgbWFzayBmb3IgRC4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faW5zZXJ0X3BzIChfX20xMjggX19ELCBfX20xMjggX19TLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfaW5zZXJ0cHMxMjggKChfX3Y0c2YpX19ELAorCQkJCQkgICAgICAoX192NHNmKV9fUywKKwkJCQkJICAgICAgX19OKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9pbnNlcnRfcHMoRCwgUywgTikJCQkJCQlcCisgICgoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9pbnNlcnRwczEyOCAoKF9fdjRzZikoX19tMTI4KShEKSwJCVwKKwkJCQkJKF9fdjRzZikoX19tMTI4KShTKSwgKGludCkoTikpKQorI2VuZGlmCisKKy8qIEhlbHBlciBtYWNybyB0byBjcmVhdGUgdGhlIE4gdmFsdWUgZm9yIF9tbV9pbnNlcnRfcHMuICAqLworI2RlZmluZSBfTU1fTUtfSU5TRVJUUFNfTkRYKFMsIEQsIE0pICgoKFMpIDw8IDYpIHwgKChEKSA8PCA0KSB8IChNKSkKKworLyogRXh0cmFjdCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2Ygc2luZ2xlIHByZWNpc2lvbiBmbG9hdCBmcm9tIHBhY2tlZAorICAgc2luZ2xlIHByZWNpc2lvbiBhcnJheSBlbGVtZW50IG9mIFggc2VsZWN0ZWQgYnkgaW5kZXggTi4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZXh0cmFjdF9wcyAoX19tMTI4IF9fWCwgY29uc3QgaW50IF9fTikKK3sKKyAgdW5pb24geyBpbnQgaTsgZmxvYXQgZjsgfSBfX3RtcDsKKyAgX190bXAuZiA9IF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjRzZiAoKF9fdjRzZilfX1gsIF9fTik7CisgIHJldHVybiBfX3RtcC5pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2V4dHJhY3RfcHMoWCwgTikJCQkJCQlcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCVwKKyAgICh7CQkJCQkJCQkJXAorICAgICB1bmlvbiB7IGludCBpOyBmbG9hdCBmOyB9IF9fdG1wOwkJCQkJXAorICAgICBfX3RtcC5mID0gX19idWlsdGluX2lhMzJfdmVjX2V4dF92NHNmICgoX192NHNmKShfX20xMjgpKFgpLCAoaW50KShOKSk7IFwKKyAgICAgX190bXAuaTsJCQkJCQkJCVwKKyAgIH0pKQorI2VuZGlmCisKKy8qIEV4dHJhY3QgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHNpbmdsZSBwcmVjaXNpb24gZmxvYXQgaW50bworICAgRCBmcm9tIHBhY2tlZCBzaW5nbGUgcHJlY2lzaW9uIGFycmF5IGVsZW1lbnQgb2YgUyBzZWxlY3RlZAorICAgYnkgaW5kZXggTi4gICovCisjZGVmaW5lIF9NTV9FWFRSQUNUX0ZMT0FUKEQsIFMsIE4pIFwKKyAgeyAoRCkgPSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0c2YgKChfX3Y0c2YpKFMpLCAoTikpOyB9CisgIAorLyogRXh0cmFjdCBzcGVjaWZpZWQgc2luZ2xlIHByZWNpc2lvbiBmbG9hdCBlbGVtZW50IGludG8gdGhlIGxvd2VyCisgICBwYXJ0IG9mIF9fbTEyOC4gICovCisjZGVmaW5lIF9NTV9QSUNLX09VVF9QUyhYLCBOKQkJCQlcCisgIF9tbV9pbnNlcnRfcHMgKF9tbV9zZXR6ZXJvX3BzICgpLCAoWCksIAkJXAorCQkgX01NX01LX0lOU0VSVFBTX05EWCAoKE4pLCAwLCAweDBlKSkKKworLyogSW5zZXJ0IGludGVnZXIsIFMsIGludG8gcGFja2VkIGludGVnZXIgYXJyYXkgZWxlbWVudCBvZiBECisgICBzZWxlY3RlZCBieSBpbmRleCBOLiAgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faW5zZXJ0X2VwaTggKF9fbTEyOGkgX19ELCBpbnQgX19TLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjE2cWkgKChfX3YxNnFpKV9fRCwKKwkJCQkJCSBfX1MsIF9fTik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2luc2VydF9lcGkzMiAoX19tMTI4aSBfX0QsIGludCBfX1MsIGNvbnN0IGludCBfX04pCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdmVjX3NldF92NHNpICgoX192NHNpKV9fRCwKKwkJCQkJCSBfX1MsIF9fTik7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9pbnNlcnRfZXBpNjQgKF9fbTEyOGkgX19ELCBsb25nIGxvbmcgX19TLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjJkaSAoKF9fdjJkaSlfX0QsCisJCQkJCQkgX19TLCBfX04pOworfQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfbW1faW5zZXJ0X2VwaTgoRCwgUywgTikJCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92ZWNfc2V0X3YxNnFpICgoX192MTZxaSkoX19tMTI4aSkoRCksCVwKKwkJCQkJICAgKGludCkoUyksIChpbnQpKE4pKSkKKworI2RlZmluZSBfbW1faW5zZXJ0X2VwaTMyKEQsIFMsIE4pCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92ZWNfc2V0X3Y0c2kgKChfX3Y0c2kpKF9fbTEyOGkpKEQpLAlcCisJCQkJCSAgKGludCkoUyksIChpbnQpKE4pKSkKKworI2lmZGVmIF9feDg2XzY0X18KKyNkZWZpbmUgX21tX2luc2VydF9lcGk2NChELCBTLCBOKQkJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjJkaSAoKF9fdjJkaSkoX19tMTI4aSkoRCksCQlcCisJCQkJCSAgKGxvbmcgbG9uZykoUyksIChpbnQpKE4pKSkKKyNlbmRpZgorI2VuZGlmCisKKy8qIEV4dHJhY3QgaW50ZWdlciBmcm9tIHBhY2tlZCBpbnRlZ2VyIGFycmF5IGVsZW1lbnQgb2YgWCBzZWxlY3RlZCBieQorICAgaW5kZXggTi4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZXh0cmFjdF9lcGk4IChfX20xMjhpIF9fWCwgY29uc3QgaW50IF9fTikKK3sKKyAgIHJldHVybiAodW5zaWduZWQgY2hhcikgX19idWlsdGluX2lhMzJfdmVjX2V4dF92MTZxaSAoKF9fdjE2cWkpX19YLCBfX04pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2V4dHJhY3RfZXBpMzIgKF9fbTEyOGkgX19YLCBjb25zdCBpbnQgX19OKQoreworICAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjRzaSAoKF9fdjRzaSlfX1gsIF9fTik7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nICBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9leHRyYWN0X2VwaTY0IChfX20xMjhpIF9fWCwgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjJkaSAoKF9fdjJkaSlfX1gsIF9fTik7Cit9CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9tbV9leHRyYWN0X2VwaTgoWCwgTikgXAorICAoKGludCkgKHVuc2lnbmVkIGNoYXIpIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjE2cWkgKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTikpKQorI2RlZmluZSBfbW1fZXh0cmFjdF9lcGkzMihYLCBOKSBcCisgICgoaW50KSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0c2kgKChfX3Y0c2kpKF9fbTEyOGkpKFgpLCAoaW50KShOKSkpCisKKyNpZmRlZiBfX3g4Nl82NF9fCisjZGVmaW5lIF9tbV9leHRyYWN0X2VwaTY0KFgsIE4pIFwKKyAgKChsb25nIGxvbmcpIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjJkaSAoKF9fdjJkaSkoX19tMTI4aSkoWCksIChpbnQpKE4pKSkKKyNlbmRpZgorI2VuZGlmCisKKy8qIFJldHVybiBob3Jpem9udGFsIHBhY2tlZCB3b3JkIG1pbmltdW0gYW5kIGl0cyBpbmRleCBpbiBiaXRzIFsxNTowXQorICAgYW5kIGJpdHMgWzE4OjE2XSByZXNwZWN0aXZlbHkuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWlucG9zX2VwdTE2IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9waG1pbnBvc3V3MTI4ICgoX192OGhpKV9fWCk7Cit9CisKKy8qIFBhY2tlZCBpbnRlZ2VyIHNpZ24tZXh0ZW5zaW9uLiAgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXBpOF9lcGkzMiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnN4YmQxMjggKChfX3YxNnFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwaTE2X2VwaTMyIChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3h3ZDEyOCAoKF9fdjhoaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcGk4X2VwaTY0IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hicTEyOCAoKF9fdjE2cWkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXBpMzJfZXBpNjQgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeGRxMTI4ICgoX192NHNpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwaTE2X2VwaTY0IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3h3cTEyOCAoKF9fdjhoaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcGk4X2VwaTE2IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hidzEyOCAoKF9fdjE2cWkpX19YKTsKK30KKworLyogUGFja2VkIGludGVnZXIgemVyby1leHRlbnNpb24uICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwdThfZXBpMzIgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eGJkMTI4ICgoX192MTZxaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcHUxNl9lcGkzMiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnp4d2QxMjggKChfX3Y4aGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXB1OF9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnp4YnExMjggKChfX3YxNnFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwdTMyX2VwaTY0IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92enhkcTEyOCAoKF9fdjRzaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcHUxNl9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnp4d3ExMjggKChfX3Y4aGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXB1OF9lcGkxNiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnp4YncxMjggKChfX3YxNnFpKV9fWCk7Cit9CisKKy8qIFBhY2sgOCBkb3VibGUgd29yZHMgZnJvbSAyIG9wZXJhbmRzIGludG8gOCB3b3JkcyBvZiByZXN1bHQgd2l0aAorICAgdW5zaWduZWQgc2F0dXJhdGlvbi4gKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3BhY2t1c19lcGkzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhY2t1c2R3MTI4ICgoX192NHNpKV9fWCwgKF9fdjRzaSlfX1kpOworfQorCisvKiBTdW0gYWJzb2x1dGUgOC1iaXQgaW50ZWdlciBkaWZmZXJlbmNlIG9mIGFkamFjZW50IGdyb3VwcyBvZiA0CisgICBieXRlIGludGVnZXJzIGluIHRoZSBmaXJzdCAyIG9wZXJhbmRzLiAgU3RhcnRpbmcgb2Zmc2V0cyB3aXRoaW4KKyAgIG9wZXJhbmRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAzcmQgbWFzayBvcGVyYW5kLiAgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXBzYWRid19lcHU4IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbXBzYWRidzEyOCAoKF9fdjE2cWkpX19YLAorCQkJCQkgICAgICAoX192MTZxaSlfX1ksIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fbXBzYWRid19lcHU4KFgsIFksIE0pCQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbXBzYWRidzEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLAkJXAorCQkJCQkoX192MTZxaSkoX19tMTI4aSkoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCisvKiBMb2FkIGRvdWJsZSBxdWFkd29yZCB1c2luZyBub24tdGVtcG9yYWwgYWxpZ25lZCBoaW50LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0cmVhbV9sb2FkX3NpMTI4IChfX20xMjhpICpfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbW92bnRkcWEgKChfX3YyZGkgKikgX19YKTsKK30KKworI2lmZGVmIF9fU1NFNF8yX18KKworLyogVGhlc2UgbWFjcm9zIHNwZWNpZnkgdGhlIHNvdXJjZSBkYXRhIGZvcm1hdC4gICovCisjZGVmaW5lIF9TSUREX1VCWVRFX09QUwkJCTB4MDAKKyNkZWZpbmUgX1NJRERfVVdPUkRfT1BTCQkJMHgwMQorI2RlZmluZSBfU0lERF9TQllURV9PUFMJCQkweDAyCisjZGVmaW5lIF9TSUREX1NXT1JEX09QUwkJCTB4MDMKKworLyogVGhlc2UgbWFjcm9zIHNwZWNpZnkgdGhlIGNvbXBhcmlzb24gb3BlcmF0aW9uLiAgKi8KKyNkZWZpbmUgX1NJRERfQ01QX0VRVUFMX0FOWQkJMHgwMAorI2RlZmluZSBfU0lERF9DTVBfUkFOR0VTCQkweDA0CisjZGVmaW5lIF9TSUREX0NNUF9FUVVBTF9FQUNICQkweDA4CisjZGVmaW5lIF9TSUREX0NNUF9FUVVBTF9PUkRFUkVECQkweDBjCisKKy8qIFRoZXNlIG1hY3JvcyBzcGVjaWZ5IHRoZSBwb2xhcml0eS4gICovCisjZGVmaW5lIF9TSUREX1BPU0lUSVZFX1BPTEFSSVRZCQkweDAwCisjZGVmaW5lIF9TSUREX05FR0FUSVZFX1BPTEFSSVRZCQkweDEwCisjZGVmaW5lIF9TSUREX01BU0tFRF9QT1NJVElWRV9QT0xBUklUWQkweDIwCisjZGVmaW5lIF9TSUREX01BU0tFRF9ORUdBVElWRV9QT0xBUklUWQkweDMwCisKKy8qIFRoZXNlIG1hY3JvcyBzcGVjaWZ5IHRoZSBvdXRwdXQgc2VsZWN0aW9uIGluIF9tbV9jbXBYc3RyaSAoKS4gICovCisjZGVmaW5lIF9TSUREX0xFQVNUX1NJR05JRklDQU5UCQkweDAwCisjZGVmaW5lIF9TSUREX01PU1RfU0lHTklGSUNBTlQJCTB4NDAKKworLyogVGhlc2UgbWFjcm9zIHNwZWNpZnkgdGhlIG91dHB1dCBzZWxlY3Rpb24gaW4gX21tX2NtcFhzdHJtICgpLiAgKi8KKyNkZWZpbmUgX1NJRERfQklUX01BU0sJCQkweDAwCisjZGVmaW5lIF9TSUREX1VOSVRfTUFTSwkJCTB4NDAKKworLyogSW50cmluc2ljcyBmb3IgdGV4dC9zdHJpbmcgcHJvY2Vzc2luZy4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGlzdHJtIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGNtcGlzdHJtMTI4ICgoX192MTZxaSlfX1gsCisJCQkJCQkoX192MTZxaSlfX1ksCisJCQkJCQlfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGlzdHJpIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21waXN0cmkxMjggKChfX3YxNnFpKV9fWCwKKwkJCQkgICAgICAoX192MTZxaSlfX1ksCisJCQkJICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXN0cm0gKF9fbTEyOGkgX19YLCBpbnQgX19MWCwgX19tMTI4aSBfX1ksIGludCBfX0xZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RybTEyOCAoKF9fdjE2cWkpX19YLCBfX0xYLAorCQkJCQkJKF9fdjE2cWkpX19ZLCBfX0xZLAorCQkJCQkJX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlc3RyaSAoX19tMTI4aSBfX1gsIGludCBfX0xYLCBfX20xMjhpIF9fWSwgaW50IF9fTFksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmkxMjggKChfX3YxNnFpKV9fWCwgX19MWCwKKwkJCQkgICAgICAoX192MTZxaSlfX1ksIF9fTFksCisJCQkJICAgICAgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9jbXBpc3RybShYLCBZLCBNKQkJCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wY21waXN0cm0xMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJXAorCQkJCQkgIChfX3YxNnFpKShfX20xMjhpKShZKSwgKGludCkoTSkpKQorI2RlZmluZSBfbW1fY21waXN0cmkoWCwgWSwgTSkJCQkJCQlcCisgICgoaW50KSBfX2J1aWx0aW5faWEzMl9wY21waXN0cmkxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgICAoX192MTZxaSkoX19tMTI4aSkoWSksIChpbnQpKE0pKSkKKworI2RlZmluZSBfbW1fY21wZXN0cm0oWCwgTFgsIFksIExZLCBNKQkJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RybTEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLAlcCisJCQkJCSAgKGludCkoTFgpLCAoX192MTZxaSkoX19tMTI4aSkoWSksIFwKKwkJCQkJICAoaW50KShMWSksIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGVzdHJpKFgsIExYLCBZLCBMWSwgTSkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaTEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLCAoaW50KShMWCksCVwKKwkJCQkgICAgICAoX192MTZxaSkoX19tMTI4aSkoWSksIChpbnQpKExZKSwJXAorCQkJCSAgICAgIChpbnQpKE0pKSkKKyNlbmRpZgorCisvKiBJbnRyaW5zaWNzIGZvciB0ZXh0L3N0cmluZyBwcm9jZXNzaW5nIGFuZCByZWFkaW5nIHZhbHVlcyBvZgorICAgRUZsYWdzLiAgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBpc3RyYSAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGNtcGlzdHJpYTEyOCAoKF9fdjE2cWkpX19YLAorCQkJCSAgICAgICAoX192MTZxaSlfX1ksCisJCQkJICAgICAgIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21waXN0cmMgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaWMxMjggKChfX3YxNnFpKV9fWCwKKwkJCQkgICAgICAgKF9fdjE2cWkpX19ZLAorCQkJCSAgICAgICBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGlzdHJvIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21waXN0cmlvMTI4ICgoX192MTZxaSlfX1gsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwKKwkJCQkgICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBpc3RycyAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGNtcGlzdHJpczEyOCAoKF9fdjE2cWkpX19YLAorCQkJCSAgICAgICAoX192MTZxaSlfX1ksCisJCQkJICAgICAgIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21waXN0cnogKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaXoxMjggKChfX3YxNnFpKV9fWCwKKwkJCQkgICAgICAgKF9fdjE2cWkpX19ZLAorCQkJCSAgICAgICBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVzdHJhIChfX20xMjhpIF9fWCwgaW50IF9fTFgsIF9fbTEyOGkgX19ZLCBpbnQgX19MWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaWExMjggKChfX3YxNnFpKV9fWCwgX19MWCwKKwkJCQkgICAgICAgKF9fdjE2cWkpX19ZLCBfX0xZLAorCQkJCSAgICAgICBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVzdHJjIChfX20xMjhpIF9fWCwgaW50IF9fTFgsIF9fbTEyOGkgX19ZLCBpbnQgX19MWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaWMxMjggKChfX3YxNnFpKV9fWCwgX19MWCwKKwkJCQkgICAgICAgKF9fdjE2cWkpX19ZLCBfX0xZLAorCQkJCSAgICAgICBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVzdHJvIChfX20xMjhpIF9fWCwgaW50IF9fTFgsIF9fbTEyOGkgX19ZLCBpbnQgX19MWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaW8xMjggKChfX3YxNnFpKV9fWCwgX19MWCwKKwkJCQkgICAgICAgKF9fdjE2cWkpX19ZLCBfX0xZLAorCQkJCSAgICAgICBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVzdHJzIChfX20xMjhpIF9fWCwgaW50IF9fTFgsIF9fbTEyOGkgX19ZLCBpbnQgX19MWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaXMxMjggKChfX3YxNnFpKV9fWCwgX19MWCwKKwkJCQkgICAgICAgKF9fdjE2cWkpX19ZLCBfX0xZLAorCQkJCSAgICAgICBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVzdHJ6IChfX20xMjhpIF9fWCwgaW50IF9fTFgsIF9fbTEyOGkgX19ZLCBpbnQgX19MWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaXoxMjggKChfX3YxNnFpKV9fWCwgX19MWCwKKwkJCQkgICAgICAgKF9fdjE2cWkpX19ZLCBfX0xZLAorCQkJCSAgICAgICBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2NtcGlzdHJhKFgsIFksIE0pCQkJCQkJXAorICAoKGludCkgX19idWlsdGluX2lhMzJfcGNtcGlzdHJpYTEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLAkJXAorCQkJCSAgICAgICAoX192MTZxaSkoX19tMTI4aSkoWSksIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGlzdHJjKFgsIFksIE0pCQkJCQkJXAorICAoKGludCkgX19idWlsdGluX2lhMzJfcGNtcGlzdHJpYzEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLAkJXAorCQkJCSAgICAgICAoX192MTZxaSkoX19tMTI4aSkoWSksIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGlzdHJvKFgsIFksIE0pCQkJCQkJXAorICAoKGludCkgX19idWlsdGluX2lhMzJfcGNtcGlzdHJpbzEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLAkJXAorCQkJCSAgICAgICAoX192MTZxaSkoX19tMTI4aSkoWSksIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGlzdHJzKFgsIFksIE0pCQkJCQkJXAorICAoKGludCkgX19idWlsdGluX2lhMzJfcGNtcGlzdHJpczEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLAkJXAorCQkJCSAgICAgICAoX192MTZxaSkoX19tMTI4aSkoWSksIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGlzdHJ6KFgsIFksIE0pCQkJCQkJXAorICAoKGludCkgX19idWlsdGluX2lhMzJfcGNtcGlzdHJpejEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLAkJXAorCQkJCSAgICAgICAoX192MTZxaSkoX19tMTI4aSkoWSksIChpbnQpKE0pKSkKKworI2RlZmluZSBfbW1fY21wZXN0cmEoWCwgTFgsIFksIExZLCBNKQkJCQkJXAorICAoKGludCkgX19idWlsdGluX2lhMzJfcGNtcGVzdHJpYTEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLCAoaW50KShMWCksIFwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShMWSksIFwKKwkJCQkgICAgICAgKGludCkoTSkpKQorI2RlZmluZSBfbW1fY21wZXN0cmMoWCwgTFgsIFksIExZLCBNKQkJCQkJXAorICAoKGludCkgX19idWlsdGluX2lhMzJfcGNtcGVzdHJpYzEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLCAoaW50KShMWCksIFwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShMWSksIFwKKwkJCQkgICAgICAgKGludCkoTSkpKQorI2RlZmluZSBfbW1fY21wZXN0cm8oWCwgTFgsIFksIExZLCBNKQkJCQkJXAorICAoKGludCkgX19idWlsdGluX2lhMzJfcGNtcGVzdHJpbzEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLCAoaW50KShMWCksIFwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShMWSksIFwKKwkJCQkgICAgICAgKGludCkoTSkpKQorI2RlZmluZSBfbW1fY21wZXN0cnMoWCwgTFgsIFksIExZLCBNKQkJCQkJXAorICAoKGludCkgX19idWlsdGluX2lhMzJfcGNtcGVzdHJpczEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLCAoaW50KShMWCksIFwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShMWSksIFwKKwkJCQkgICAgICAgKGludCkoTSkpKQorI2RlZmluZSBfbW1fY21wZXN0cnooWCwgTFgsIFksIExZLCBNKQkJCQkJXAorICAoKGludCkgX19idWlsdGluX2lhMzJfcGNtcGVzdHJpejEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLCAoaW50KShMWCksIFwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShMWSksIFwKKwkJCQkgICAgICAgKGludCkoTSkpKQorI2VuZGlmCisKKy8qIFBhY2tlZCBpbnRlZ2VyIDY0LWJpdCBjb21wYXJpc29uLCB6ZXJvaW5nIG9yIGZpbGxpbmcgd2l0aCBvbmVzCisgICBjb3JyZXNwb25kaW5nIHBhcnRzIG9mIHJlc3VsdC4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBndF9lcGk2NCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BjbXBndHEgKChfX3YyZGkpX19YLCAoX192MmRpKV9fWSk7Cit9CisKKyNpZmRlZiBfX1BPUENOVF9fCisjaW5jbHVkZSA8cG9wY250aW50cmluLmg+CisjZW5kaWYKKworLyogQWNjdW11bGF0ZSBDUkMzMiAocG9seW5vbWlhbCAweDExRURDNkY0MSkgdmFsdWUuICAqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jcmMzMl91OCAodW5zaWduZWQgaW50IF9fQywgdW5zaWduZWQgY2hhciBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jcmMzMnFpIChfX0MsIF9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3JjMzJfdTE2ICh1bnNpZ25lZCBpbnQgX19DLCB1bnNpZ25lZCBzaG9ydCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jcmMzMmhpIChfX0MsIF9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3JjMzJfdTMyICh1bnNpZ25lZCBpbnQgX19DLCB1bnNpZ25lZCBpbnQgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJzaSAoX19DLCBfX1YpOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jcmMzMl91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX0MsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jcmMzMmRpIChfX0MsIF9fVik7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1NFNF8yX18gKi8KKworI2VuZGlmIC8qIF9fU1NFNF8xX18gKi8KKworI2VuZGlmIC8qIF9TTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3NwL3NzcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3NwL3NzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZmUwZTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zc3Avc3NwLmgKQEAgLTAsMCArMSw2NSBAQAorLyogT2JqZWN0IHNpemUgY2hlY2tpbmcgc3VwcG9ydCBtYWNyb3MuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworSW4gYWRkaXRpb24gdG8gdGhlIHBlcm1pc3Npb25zIGluIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMgeW91IHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlCitjb21waWxlZCB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpbnRvIGNvbWJpbmF0aW9ucyB3aXRoIG90aGVyIHByb2dyYW1zLAorYW5kIHRvIGRpc3RyaWJ1dGUgdGhvc2UgY29tYmluYXRpb25zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZworZnJvbSB0aGUgdXNlIG9mIHRoaXMgZmlsZS4gIChUaGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByZXN0cmljdGlvbnMKK2RvIGFwcGx5IGluIG90aGVyIHJlc3BlY3RzOyBmb3IgZXhhbXBsZSwgdGhleSBjb3ZlciBtb2RpZmljYXRpb24gb2YKK3RoZSBmaWxlLCBhbmQgZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGEgY29tYmluZQorZXhlY3V0YWJsZS4pCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisKKyNpZm5kZWYgX1NTUF9ICisjZGVmaW5lIF9TU1BfSCAxCisKKyNpZiBfRk9SVElGWV9TT1VSQ0UgPiAwICYmIF9fT1BUSU1JWkVfXyA+IDAgXAorICAgICYmIGRlZmluZWQgX19HTlVDX18gXAorICAgICYmIChfX0dOVUNfXyA+IDQgfHwgKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gMSkpIFwKKyAgICAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyBpZiBfRk9SVElGWV9TT1VSQ0UgPT0gMQorIyAgZGVmaW5lIF9fU1NQX0ZPUlRJRllfTEVWRUwgMQorIyBlbGlmIF9GT1JUSUZZX1NPVVJDRSA+IDEKKyMgIGRlZmluZSBfX1NTUF9GT1JUSUZZX0xFVkVMIDIKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgX19TU1BfRk9SVElGWV9MRVZFTCA+IDAKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjIGRlZmluZSBfX3NzcF9ib3MocHRyKSBfX2J1aWx0aW5fb2JqZWN0X3NpemUgKHB0ciwgX19TU1BfRk9SVElGWV9MRVZFTCA+IDEpCisjIGRlZmluZSBfX3NzcF9ib3MwKHB0cikgX19idWlsdGluX29iamVjdF9zaXplIChwdHIsIDApCisKKyMgZGVmaW5lIF9fU1NQX1JFRElSRUNUKG5hbWUsIHByb3RvLCBhbGlhcykgXAorICBuYW1lIHByb3RvIF9fYXNtX18gKF9fU1NQX0FTTU5BTUUgKCNhbGlhcykpCisjIGRlZmluZSBfX1NTUF9BU01OQU1FKGNuYW1lKSAgX19TU1BfQVNNTkFNRTIgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgY25hbWUpCisjIGRlZmluZSBfX1NTUF9BU01OQU1FMihwcmVmaXgsIGNuYW1lKSBfX1NTUF9BU01OQU1FMyAocHJlZml4KSBjbmFtZQorIyBkZWZpbmUgX19TU1BfQVNNTkFNRTMocHJlZml4KSAjcHJlZml4CisKKyMgdW5kZWYgX19TU1BfSEFWRV9WU05QUklOVEYKKworZXh0ZXJuIHZvaWQgX19jaGtfZmFpbCAodm9pZCkgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisjZW5kaWYKKworI2VuZGlmIC8qIF9TU1BfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3NwL3N0ZGlvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zc3Avc3RkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODNjYTYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3NwL3N0ZGlvLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qIENoZWNraW5nIG1hY3JvcyBmb3Igc3RkaW8gZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0luIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzIHlvdSB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBsaW5rIHRoZQorY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW50byBjb21iaW5hdGlvbnMgd2l0aCBvdGhlciBwcm9ncmFtcywKK2FuZCB0byBkaXN0cmlidXRlIHRob3NlIGNvbWJpbmF0aW9ucyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcKK2Zyb20gdGhlIHVzZSBvZiB0aGlzIGZpbGUuICAoVGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmVzdHJpY3Rpb25zCitkbyBhcHBseSBpbiBvdGhlciByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mCit0aGUgZmlsZSwgYW5kIGRpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhIGNvbWJpbmUKK2V4ZWN1dGFibGUuKQorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworCisjaWZuZGVmIF9TU1BfU1RESU9fSAorI2RlZmluZSBfU1NQX1NURElPX0ggMQorCisjaW5jbHVkZSA8c3NwLmg+CisjaW5jbHVkZV9uZXh0IDxzdGRpby5oPgorCisjaWYgX19TU1BfRk9SVElGWV9MRVZFTCA+IDAKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjdW5kZWYgc3ByaW50ZgorI3VuZGVmIHZzcHJpbnRmCisjdW5kZWYgc25wcmludGYKKyN1bmRlZiB2c25wcmludGYKKyN1bmRlZiBnZXRzCisjdW5kZWYgZmdldHMKKworZXh0ZXJuIGludCBfX3NwcmludGZfY2hrIChjaGFyICpfX3Jlc3RyaWN0X18gX19zLCBpbnQgX19mbGFnLCBzaXplX3QgX19zbGVuLAorCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3RfXyBfX2Zvcm1hdCwgLi4uKTsKK2V4dGVybiBpbnQgX192c3ByaW50Zl9jaGsgKGNoYXIgKl9fcmVzdHJpY3RfXyBfX3MsIGludCBfX2ZsYWcsIHNpemVfdCBfX3NsZW4sCisJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3RfXyBfX2Zvcm1hdCwKKwkJCSAgIHZhX2xpc3QgX19hcCk7CisKKyNkZWZpbmUgc3ByaW50ZihzdHIsIC4uLikgXAorICBfX2J1aWx0aW5fX19zcHJpbnRmX2NoayAoc3RyLCAwLCBfX3NzcF9ib3MgKHN0ciksIFwKKwkJCSAgIF9fVkFfQVJHU19fKQorI2RlZmluZSB2c3ByaW50ZihzdHIsIGZtdCwgYXApIFwKKyAgX19idWlsdGluX19fdnNwcmludGZfY2hrIChzdHIsIDAsIF9fc3NwX2JvcyAoc3RyKSwgZm10LCBhcCkKKworZXh0ZXJuIGludCBfX3NucHJpbnRmX2NoayAoY2hhciAqX19yZXN0cmljdF9fIF9fcywgc2l6ZV90IF9fbiwgaW50IF9fZmxhZywKKwkJCSAgIHNpemVfdCBfX3NsZW4sIF9fY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fZm9ybWF0LAorCQkJICAgLi4uKTsKK2V4dGVybiBpbnQgX192c25wcmludGZfY2hrIChjaGFyICpfX3Jlc3RyaWN0X18gX19zLCBzaXplX3QgX19uLCBpbnQgX19mbGFnLAorCQkJICAgIHNpemVfdCBfX3NsZW4sIF9fY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fZm9ybWF0LAorCQkJICAgIHZhX2xpc3QgX19hcCk7CisKKyNkZWZpbmUgc25wcmludGYoc3RyLCBsZW4sIC4uLikgXAorICBfX2J1aWx0aW5fX19zbnByaW50Zl9jaGsgKHN0ciwgbGVuLCAwLCBfX3NzcF9ib3MgKHN0ciksIF9fVkFfQVJHU19fKQorI2RlZmluZSB2c25wcmludGYoc3RyLCBsZW4sIGZtdCwgYXApIFwKKyAgX19idWlsdGluX19fdnNucHJpbnRmX2NoayAoc3RyLCBsZW4sIDAsIF9fc3NwX2JvcyAoc3RyKSwgZm10LCBhcCkKKworZXh0ZXJuIGNoYXIgKl9fZ2V0c19jaGsgKGNoYXIgKl9fc3RyLCBzaXplX3QpOworZXh0ZXJuIGNoYXIgKl9fU1NQX1JFRElSRUNUIChfX2dldHNfYWxpYXMsIChjaGFyICpfX3N0ciksIGdldHMpOworCitleHRlcm4gaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgY2hhciAqCitnZXRzIChjaGFyICpfX3N0cikKK3sKKyAgaWYgKF9fc3NwX2JvcyAoX19zdHIpICE9IChzaXplX3QpIC0xKQorICAgIHJldHVybiBfX2dldHNfY2hrIChfX3N0ciwgX19zc3BfYm9zIChfX3N0cikpOworICByZXR1cm4gX19nZXRzX2FsaWFzIChfX3N0cik7Cit9CisKK2V4dGVybiBjaGFyICpfX1NTUF9SRURJUkVDVCAoX19mZ2V0c19hbGlhcywKKwkJCSAgICAgKGNoYXIgKl9fcmVzdHJpY3RfXyBfX3MsIGludCBfX24sCisJCQkgICAgICBGSUxFICpfX3Jlc3RyaWN0X18gX19zdHJlYW0pLCBmZ2V0cyk7CisKK2V4dGVybiBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKSBjaGFyICoKK2ZnZXRzIChjaGFyICpfX3Jlc3RyaWN0X18gX19zLCBpbnQgX19uLCBGSUxFICpfX3Jlc3RyaWN0X18gX19zdHJlYW0pCit7CisgIGlmIChfX3NzcF9ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEgJiYgKHNpemVfdCkgX19uID4gX19zc3BfYm9zIChfX3MpKQorICAgIF9fY2hrX2ZhaWwgKCk7CisgIHJldHVybiBfX2ZnZXRzX2FsaWFzIChfX3MsIF9fbiwgX19zdHJlYW0pOworfQorCisjZW5kaWYgLyogX19TU1BfRk9SVElGWV9MRVZFTCA+IDAgKi8KKyNlbmRpZiAvKiBfU1NQX1NURElPX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3NzcC9zdHJpbmcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3NzcC9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTQ3NTRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3NwL3N0cmluZy5oCkBAIC0wLDAgKzEsMTY3IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHN0cmluZyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworSW4gYWRkaXRpb24gdG8gdGhlIHBlcm1pc3Npb25zIGluIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMgeW91IHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlCitjb21waWxlZCB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpbnRvIGNvbWJpbmF0aW9ucyB3aXRoIG90aGVyIHByb2dyYW1zLAorYW5kIHRvIGRpc3RyaWJ1dGUgdGhvc2UgY29tYmluYXRpb25zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZworZnJvbSB0aGUgdXNlIG9mIHRoaXMgZmlsZS4gIChUaGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByZXN0cmljdGlvbnMKK2RvIGFwcGx5IGluIG90aGVyIHJlc3BlY3RzOyBmb3IgZXhhbXBsZSwgdGhleSBjb3ZlciBtb2RpZmljYXRpb24gb2YKK3RoZSBmaWxlLCBhbmQgZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGEgY29tYmluZQorZXhlY3V0YWJsZS4pCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisKKyNpZm5kZWYgX1NTUF9TVFJJTkdfSAorI2RlZmluZSBfU1NQX1NUUklOR19IIDEKKworI2luY2x1ZGUgPHNzcC5oPgorI2luY2x1ZGVfbmV4dCA8c3RyaW5nLmg+CisKKyNpZiBfX1NTUF9GT1JUSUZZX0xFVkVMID4gMAorCisjdW5kZWYgbWVtY3B5CisjdW5kZWYgbWVtbW92ZQorI3VuZGVmIG1lbXNldAorI3VuZGVmIHN0cmNhdAorI3VuZGVmIHN0cmNweQorI3VuZGVmIHN0cm5jYXQKKyN1bmRlZiBzdHJuY3B5CisjdW5kZWYgbWVtcGNweQorI3VuZGVmIHN0cGNweQorI3VuZGVmIGJjb3B5CisjdW5kZWYgYnplcm8KKworI2RlZmluZSBtZW1jcHkoZGVzdCwgc3JjLCBsZW4pIFwKKyAgKChfX3NzcF9ib3MwIChkZXN0KSAhPSAoc2l6ZV90KSAtMSkJCQkJCVwKKyAgID8gX19idWlsdGluX19fbWVtY3B5X2NoayAoZGVzdCwgc3JjLCBsZW4sIF9fc3NwX2JvczAgKGRlc3QpKQkJXAorICAgOiBfX21lbWNweV9pY2hrIChkZXN0LCBzcmMsIGxlbikpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgdm9pZCAqCitfX21lbWNweV9pY2hrICh2b2lkICpfX3Jlc3RyaWN0X18gX19kZXN0LCBjb25zdCB2b2lkICpfX3Jlc3RyaWN0X18gX19zcmMsCisJICAgICAgIHNpemVfdCBfX2xlbikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX21lbWNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX3NzcF9ib3MwIChfX2Rlc3QpKTsKK30KKworCisjZGVmaW5lIG1lbW1vdmUoZGVzdCwgc3JjLCBsZW4pIFwKKyAgKChfX3NzcF9ib3MwIChkZXN0KSAhPSAoc2l6ZV90KSAtMSkJCQkJCVwKKyAgID8gX19idWlsdGluX19fbWVtbW92ZV9jaGsgKGRlc3QsIHNyYywgbGVuLCBfX3NzcF9ib3MwIChkZXN0KSkJCVwKKyAgIDogX19tZW1tb3ZlX2ljaGsgKGRlc3QsIHNyYywgbGVuKSkKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKSB2b2lkICoKK19fbWVtbW92ZV9pY2hrICh2b2lkICpfX2Rlc3QsIGNvbnN0IHZvaWQgKl9fc3JjLCBzaXplX3QgX19sZW4pCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19tZW1tb3ZlX2NoayAoX19kZXN0LCBfX3NyYywgX19sZW4sIF9fc3NwX2JvczAgKF9fZGVzdCkpOworfQorCisKKyNkZWZpbmUgbWVtcGNweShkZXN0LCBzcmMsIGxlbikgXAorICAoKF9fc3NwX2JvczAgKGRlc3QpICE9IChzaXplX3QpIC0xKQkJCQkJXAorICAgPyBfX2J1aWx0aW5fX19tZW1wY3B5X2NoayAoZGVzdCwgc3JjLCBsZW4sIF9fc3NwX2JvczAgKGRlc3QpKQlcCisgICA6IF9fbWVtcGNweV9pY2hrIChkZXN0LCBzcmMsIGxlbikpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgdm9pZCAqCitfX21lbXBjcHlfaWNoayAodm9pZCAqX19yZXN0cmljdF9fIF9fZGVzdCwgY29uc3Qgdm9pZCAqX19yZXN0cmljdF9fIF9fc3JjLAorCQlzaXplX3QgX19sZW4pCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19tZW1wY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19sZW4sIF9fc3NwX2JvczAgKF9fZGVzdCkpOworfQorCisKKyNkZWZpbmUgbWVtc2V0KGRlc3QsIGNoLCBsZW4pIFwKKyAgKChfX3NzcF9ib3MwIChkZXN0KSAhPSAoc2l6ZV90KSAtMSkJCQkJCVwKKyAgID8gX19idWlsdGluX19fbWVtc2V0X2NoayAoZGVzdCwgY2gsIGxlbiwgX19zc3BfYm9zMCAoZGVzdCkpCQlcCisgICA6IF9fbWVtc2V0X2ljaGsgKGRlc3QsIGNoLCBsZW4pKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIHZvaWQgKgorX19tZW1zZXRfaWNoayAodm9pZCAqX19kZXN0LCBpbnQgX19jaCwgc2l6ZV90IF9fbGVuKQoreworICByZXR1cm4gX19idWlsdGluX19fbWVtc2V0X2NoayAoX19kZXN0LCBfX2NoLCBfX2xlbiwgX19zc3BfYm9zMCAoX19kZXN0KSk7Cit9CisKKyNkZWZpbmUgYmNvcHkoc3JjLCBkZXN0LCBsZW4pICgodm9pZCkgXAorICgoX19zc3BfYm9zMCAoZGVzdCkgIT0gKHNpemVfdCkgLTEpCQkJCQlcCisgICA/IF9fYnVpbHRpbl9fX21lbW1vdmVfY2hrIChkZXN0LCBzcmMsIGxlbiwgX19zc3BfYm9zMCAoZGVzdCkpCVwKKyAgIDogX19tZW1tb3ZlX2ljaGsgKGRlc3QsIHNyYywgbGVuKSkpCisjZGVmaW5lIGJ6ZXJvKGRlc3QsIGxlbikgKCh2b2lkKSBcCisgICgoX19zc3BfYm9zMCAoZGVzdCkgIT0gKHNpemVfdCkgLTEpCQkJCQlcCisgICA/IF9fYnVpbHRpbl9fX21lbXNldF9jaGsgKGRlc3QsICdcMCcsIGxlbiwgX19zc3BfYm9zMCAoZGVzdCkpCVwKKyAgIDogX19tZW1zZXRfaWNoayAoZGVzdCwgJ1wwJywgbGVuKSkpCisKKworI2RlZmluZSBzdHJjcHkoZGVzdCwgc3JjKSBcCisgICgoX19zc3BfYm9zIChkZXN0KSAhPSAoc2l6ZV90KSAtMSkJCQkJCVwKKyAgID8gX19idWlsdGluX19fc3RyY3B5X2NoayAoZGVzdCwgc3JjLCBfX3NzcF9ib3MgKGRlc3QpKQkJXAorICAgOiBfX3N0cmNweV9pY2hrIChkZXN0LCBzcmMpKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIGNoYXIgKgorX19zdHJjcHlfaWNoayAoY2hhciAqX19yZXN0cmljdF9fIF9fZGVzdCwgY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fc3JjKQoreworICByZXR1cm4gX19idWlsdGluX19fc3RyY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19zc3BfYm9zIChfX2Rlc3QpKTsKK30KKworCisjZGVmaW5lIHN0cGNweShkZXN0LCBzcmMpIFwKKyAgKChfX3NzcF9ib3MgKGRlc3QpICE9IChzaXplX3QpIC0xKQkJCQkJXAorICAgPyBfX2J1aWx0aW5fX19zdHBjcHlfY2hrIChkZXN0LCBzcmMsIF9fc3NwX2JvcyAoZGVzdCkpCQlcCisgICA6IF9fc3RwY3B5X2ljaGsgKGRlc3QsIHNyYykpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgY2hhciAqCitfX3N0cGNweV9pY2hrIChjaGFyICpfX3Jlc3RyaWN0X18gX19kZXN0LCBjb25zdCBjaGFyICpfX3Jlc3RyaWN0X18gX19zcmMpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHBjcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX3NzcF9ib3MgKF9fZGVzdCkpOworfQorCisKKyNkZWZpbmUgc3RybmNweShkZXN0LCBzcmMsIGxlbikgXAorICAoKF9fc3NwX2JvcyAoZGVzdCkgIT0gKHNpemVfdCkgLTEpCQkJCQlcCisgICA/IF9fYnVpbHRpbl9fX3N0cm5jcHlfY2hrIChkZXN0LCBzcmMsIGxlbiwgX19zc3BfYm9zIChkZXN0KSkJCVwKKyAgIDogX19zdHJuY3B5X2ljaGsgKGRlc3QsIHNyYywgbGVuKSkKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKSBjaGFyICoKK19fc3RybmNweV9pY2hrIChjaGFyICpfX3Jlc3RyaWN0X18gX19kZXN0LCBjb25zdCBjaGFyICpfX3Jlc3RyaWN0X18gX19zcmMsCisJCXNpemVfdCBfX2xlbikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3N0cm5jcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19zc3BfYm9zIChfX2Rlc3QpKTsKK30KKworCisjZGVmaW5lIHN0cmNhdChkZXN0LCBzcmMpIFwKKyAgKChfX3NzcF9ib3MgKGRlc3QpICE9IChzaXplX3QpIC0xKQkJCQkJXAorICAgPyBfX2J1aWx0aW5fX19zdHJjYXRfY2hrIChkZXN0LCBzcmMsIF9fc3NwX2JvcyAoZGVzdCkpCQlcCisgICA6IF9fc3RyY2F0X2ljaGsgKGRlc3QsIHNyYykpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgY2hhciAqCitfX3N0cmNhdF9pY2hrIChjaGFyICpfX3Jlc3RyaWN0X18gX19kZXN0LCBjb25zdCBjaGFyICpfX3Jlc3RyaWN0X18gX19zcmMpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHJjYXRfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX3NzcF9ib3MgKF9fZGVzdCkpOworfQorCisKKyNkZWZpbmUgc3RybmNhdChkZXN0LCBzcmMsIGxlbikgXAorICAoKF9fc3NwX2JvcyAoZGVzdCkgIT0gKHNpemVfdCkgLTEpCQkJCQlcCisgICA/IF9fYnVpbHRpbl9fX3N0cm5jYXRfY2hrIChkZXN0LCBzcmMsIGxlbiwgX19zc3BfYm9zIChkZXN0KSkJCVwKKyAgIDogX19zdHJuY2F0X2ljaGsgKGRlc3QsIHNyYywgbGVuKSkKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKSBjaGFyICoKK19fc3RybmNhdF9pY2hrIChjaGFyICpfX3Jlc3RyaWN0X18gX19kZXN0LCBjb25zdCBjaGFyICpfX3Jlc3RyaWN0X18gX19zcmMsCisJCXNpemVfdCBfX2xlbikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3N0cm5jYXRfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19zc3BfYm9zIChfX2Rlc3QpKTsKK30KKworI2VuZGlmIC8qIF9fU1NQX0ZPUlRJRllfTEVWRUwgPiAwICovCisjZW5kaWYgLyogX1NTUF9TVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3NwL3VuaXN0ZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3NwL3VuaXN0ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0M2ZlNTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zc3AvdW5pc3RkLmgKQEAgLTAsMCArMSw4NCBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciB1bmlzdGQgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0luIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzIHlvdSB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBsaW5rIHRoZQorY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW50byBjb21iaW5hdGlvbnMgd2l0aCBvdGhlciBwcm9ncmFtcywKK2FuZCB0byBkaXN0cmlidXRlIHRob3NlIGNvbWJpbmF0aW9ucyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcKK2Zyb20gdGhlIHVzZSBvZiB0aGlzIGZpbGUuICAoVGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmVzdHJpY3Rpb25zCitkbyBhcHBseSBpbiBvdGhlciByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mCit0aGUgZmlsZSwgYW5kIGRpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhIGNvbWJpbmUKK2V4ZWN1dGFibGUuKQorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworCisjaWZuZGVmIF9TU1BfVU5JU1REX0gKKyNkZWZpbmUgX1NTUF9VTklTVERfSCAxCisKKyNpbmNsdWRlIDxzc3AuaD4KKyNpbmNsdWRlX25leHQgPHVuaXN0ZC5oPgorCisjaWYgX19TU1BfRk9SVElGWV9MRVZFTCA+IDAKKworI3VuZGVmIHJlYWQKKyN1bmRlZiByZWFkbGluaworI3VuZGVmIGdldGN3ZAorCitleHRlcm4gc3NpemVfdCBfX1NTUF9SRURJUkVDVCAoX19yZWFkX2FsaWFzLCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLAorCQkJCQkgICAgICBzaXplX3QgX19uYnl0ZXMpLCByZWFkKTsKKworZXh0ZXJuIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIHNzaXplX3QKK3JlYWQgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzKQoreworICBpZiAoX19zc3BfYm9zMCAoX19idWYpICE9IChzaXplX3QpIC0xICYmIF9fbmJ5dGVzID4gX19zc3BfYm9zMCAoX19idWYpKQorICAgIF9fY2hrX2ZhaWwgKCk7CisgIHJldHVybiBfX3JlYWRfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX25ieXRlcyk7Cit9CisKK2V4dGVybiBpbnQgX19TU1BfUkVESVJFQ1QgKF9fcmVhZGxpbmtfYWxpYXMsCisJCQkgICAoY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fcGF0aCwKKwkJCSAgICBjaGFyICpfX3Jlc3RyaWN0X18gX19idWYsIHNpemVfdCBfX2xlbiksCisJCQkgICByZWFkbGluayk7CisKK2V4dGVybiBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKSBpbnQKK3JlYWRsaW5rIChjb25zdCBjaGFyICpfX3Jlc3RyaWN0X18gX19wYXRoLCBjaGFyICpfX3Jlc3RyaWN0X18gX19idWYsCisJICBzaXplX3QgX19sZW4pCit7CisgIGlmIChfX3NzcF9ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSAmJiBfX2xlbiA+IF9fc3NwX2JvcyAoX19idWYpKQorICAgIF9fY2hrX2ZhaWwgKCk7CisgIHJldHVybiBfX3JlYWRsaW5rX2FsaWFzIChfX3BhdGgsIF9fYnVmLCBfX2xlbik7Cit9CisKK2V4dGVybiBjaGFyICpfX1NTUF9SRURJUkVDVCAoX19nZXRjd2RfYWxpYXMsCisJCQkgICAgIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fc2l6ZSksIGdldGN3ZCk7CisKK2V4dGVybiBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKSBjaGFyICoKK2dldGN3ZCAoY2hhciAqX19idWYsIHNpemVfdCBfX3NpemUpCit7CisgIGlmIChfX3NzcF9ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSAmJiBfX3NpemUgPiBfX3NzcF9ib3MgKF9fYnVmKSkKKyAgICBfX2Noa19mYWlsICgpOworICByZXR1cm4gX19nZXRjd2RfYWxpYXMgKF9fYnVmLCBfX3NpemUpOworfQorCisjZW5kaWYgLyogX19TU1BfRk9SVElGWV9MRVZFTCA+IDAgKi8KKyNlbmRpZiAvKiBfU1NQX1VOSVNURF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRhbGlnbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkYWxpZ24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTU0NWRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkYWxpZ24uaApAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogSVNPIEMxWDogNy4xNSBBbGlnbm1lbnQgPHN0ZGFsaWduLmg+LiAgKi8KKworI2lmbmRlZiBfU1REQUxJR05fSAorI2RlZmluZSBfU1REQUxJR05fSAorCisjaWZuZGVmIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgYWxpZ25hcyBfQWxpZ25hcworI2RlZmluZSBhbGlnbm9mIF9BbGlnbm9mCisKKyNkZWZpbmUgX19hbGlnbmFzX2lzX2RlZmluZWQgMQorI2RlZmluZSBfX2FsaWdub2ZfaXNfZGVmaW5lZCAxCisKKyNlbmRpZgorCisjZW5kaWYJLyogc3RkYWxpZ24uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkYXJnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRhcmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjRlMGQ2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkYXJnLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk4OS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKgorICogSVNPIEMgU3RhbmRhcmQ6ICA3LjE1ICBWYXJpYWJsZSBhcmd1bWVudHMgIDxzdGRhcmcuaD4KKyAqLworCisjaWZuZGVmIF9TVERBUkdfSAorI2lmbmRlZiBfQU5TSV9TVERBUkdfSF8KKyNpZm5kZWYgX19uZWVkX19fdmFfbGlzdAorI2RlZmluZSBfU1REQVJHX0gKKyNkZWZpbmUgX0FOU0lfU1REQVJHX0hfCisjZW5kaWYgLyogbm90IF9fbmVlZF9fX3ZhX2xpc3QgKi8KKyN1bmRlZiBfX25lZWRfX192YV9saXN0CisKKy8qIERlZmluZSBfX2dudWNfdmFfbGlzdC4gICovCisKKyNpZm5kZWYgX19HTlVDX1ZBX0xJU1QKKyNkZWZpbmUgX19HTlVDX1ZBX0xJU1QKK3R5cGVkZWYgX19idWlsdGluX3ZhX2xpc3QgX19nbnVjX3ZhX2xpc3Q7CisjZW5kaWYKKworLyogRGVmaW5lIHRoZSBzdGFuZGFyZCBtYWNyb3MgZm9yIHRoZSB1c2VyLAorICAgaWYgdGhpcyBpbnZvY2F0aW9uIHdhcyBmcm9tIHRoZSB1c2VyIHByb2dyYW0uICAqLworI2lmZGVmIF9TVERBUkdfSAorCisjZGVmaW5lIHZhX3N0YXJ0KHYsbCkJX19idWlsdGluX3ZhX3N0YXJ0KHYsbCkKKyNkZWZpbmUgdmFfZW5kKHYpCV9fYnVpbHRpbl92YV9lbmQodikKKyNkZWZpbmUgdmFfYXJnKHYsbCkJX19idWlsdGluX3ZhX2FyZyh2LGwpCisjaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBfX1NURENfVkVSU0lPTl9fICsgMCA+PSAxOTk5MDBMIHx8IGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCisjZGVmaW5lIHZhX2NvcHkoZCxzKQlfX2J1aWx0aW5fdmFfY29weShkLHMpCisjZW5kaWYKKyNkZWZpbmUgX192YV9jb3B5KGQscykJX19idWlsdGluX3ZhX2NvcHkoZCxzKQorCisvKiBEZWZpbmUgdmFfbGlzdCwgaWYgZGVzaXJlZCwgZnJvbSBfX2dudWNfdmFfbGlzdC4gKi8KKy8qIFdlIGRlbGliZXJhdGVseSBkbyBub3QgZGVmaW5lIHZhX2xpc3Qgd2hlbiBjYWxsZWQgZnJvbQorICAgc3RkaW8uaCwgYmVjYXVzZSBBTlNJIEMgc2F5cyB0aGF0IHN0ZGlvLmggaXMgbm90IHN1cHBvc2VkIHRvIGRlZmluZQorICAgdmFfbGlzdC4gIHN0ZGlvLmggbmVlZHMgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhhdCBkYXRhIHR5cGUsIAorICAgYnV0IG11c3Qgbm90IHVzZSB0aGF0IG5hbWUuICBJdCBzaG91bGQgdXNlIHRoZSBuYW1lIF9fZ251Y192YV9saXN0LAorICAgd2hpY2ggaXMgc2FmZSBiZWNhdXNlIGl0IGlzIHJlc2VydmVkIGZvciB0aGUgaW1wbGVtZW50YXRpb24uICAqLworCisjaWZkZWYgX0JTRF9WQV9MSVNUCisjdW5kZWYgX0JTRF9WQV9MSVNUCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19zdnI0X18pIHx8IChkZWZpbmVkKF9TQ09fRFMpICYmICFkZWZpbmVkKF9fVkFfTElTVCkpCisvKiBTVlI0LjIgdXNlcyBfVkFfTElTVCBmb3IgYW4gaW50ZXJuYWwgYWxpYXMgZm9yIHZhX2xpc3QsCisgICBzbyB3ZSBtdXN0IGF2b2lkIHRlc3RpbmcgaXQgYW5kIHNldHRpbmcgaXQgaGVyZS4KKyAgIFNWUjQgdXNlcyBfVkFfTElTVCBhcyBhIGZsYWcgaW4gc3RkYXJnLmgsIGJ1dCB3ZSBzaG91bGQKKyAgIGhhdmUgbm8gY29uZmxpY3Qgd2l0aCB0aGF0LiAgKi8KKyNpZm5kZWYgX1ZBX0xJU1RfCisjZGVmaW5lIF9WQV9MSVNUXworI2lmZGVmIF9faTg2MF9fCisjaWZuZGVmIF9WQV9MSVNUCisjZGVmaW5lIF9WQV9MSVNUIHZhX2xpc3QKKyNlbmRpZgorI2VuZGlmIC8qIF9faTg2MF9fICovCit0eXBlZGVmIF9fZ251Y192YV9saXN0IHZhX2xpc3Q7CisjaWZkZWYgX1NDT19EUworI2RlZmluZSBfX1ZBX0xJU1QKKyNlbmRpZgorI2VuZGlmIC8qIF9WQV9MSVNUXyAqLworI2Vsc2UgLyogbm90IF9fc3ZyNF9fIHx8IF9TQ09fRFMgKi8KKworLyogVGhlIG1hY3JvIF9WQV9MSVNUXyBpcyB0aGUgc2FtZSB0aGluZyB1c2VkIGJ5IHRoaXMgZmlsZSBpbiBVbHRyaXguCisgICBCdXQgb24gQlNEIE5FVDIgd2UgbXVzdCBub3QgdGVzdCBvciBkZWZpbmUgb3IgdW5kZWYgaXQuCisgICAoTm90ZSB0aGF0IHRoZSBjb21tZW50cyBpbiBORVQgMidzIGFuc2kuaAorICAgYXJlIGluY29ycmVjdCBmb3IgX1ZBX0xJU1RfLS1zZWUgc3RkaW8uaCEpICAqLworI2lmICFkZWZpbmVkIChfVkFfTElTVF8pIHx8IGRlZmluZWQgKF9fQlNEX05FVDJfXykgfHwgZGVmaW5lZCAoX19fXzM4NkJTRF9fX18pIHx8IGRlZmluZWQgKF9fYnNkaV9fKSB8fCBkZWZpbmVkIChfX3NlcXVlbnRfXykgfHwgZGVmaW5lZCAoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoV0lOTlQpCisvKiBUaGUgbWFjcm8gX1ZBX0xJU1RfREVGSU5FRCBpcyB1c2VkIGluIFdpbmRvd3MgTlQgMy41ICAqLworI2lmbmRlZiBfVkFfTElTVF9ERUZJTkVECisvKiBUaGUgbWFjcm8gX1ZBX0xJU1QgaXMgdXNlZCBpbiBTQ08gVW5peCAzLjIuICAqLworI2lmbmRlZiBfVkFfTElTVAorLyogVGhlIG1hY3JvIF9WQV9MSVNUX1RfSCBpcyB1c2VkIGluIHRoZSBCdWxsIGRweDIgICovCisjaWZuZGVmIF9WQV9MSVNUX1RfSAorLyogVGhlIG1hY3JvIF9fdmFfbGlzdF9fIGlzIHVzZWQgYnkgQmVPUy4gICovCisjaWZuZGVmIF9fdmFfbGlzdF9fCit0eXBlZGVmIF9fZ251Y192YV9saXN0IHZhX2xpc3Q7CisjZW5kaWYgLyogbm90IF9fdmFfbGlzdF9fICovCisjZW5kaWYgLyogbm90IF9WQV9MSVNUX1RfSCAqLworI2VuZGlmIC8qIG5vdCBfVkFfTElTVCAqLworI2VuZGlmIC8qIG5vdCBfVkFfTElTVF9ERUZJTkVEICovCisjaWYgIShkZWZpbmVkIChfX0JTRF9ORVQyX18pIHx8IGRlZmluZWQgKF9fX18zODZCU0RfX19fKSB8fCBkZWZpbmVkIChfX2JzZGlfXykgfHwgZGVmaW5lZCAoX19zZXF1ZW50X18pIHx8IGRlZmluZWQgKF9fRnJlZUJTRF9fKSkKKyNkZWZpbmUgX1ZBX0xJU1RfCisjZW5kaWYKKyNpZm5kZWYgX1ZBX0xJU1QKKyNkZWZpbmUgX1ZBX0xJU1QKKyNlbmRpZgorI2lmbmRlZiBfVkFfTElTVF9ERUZJTkVECisjZGVmaW5lIF9WQV9MSVNUX0RFRklORUQKKyNlbmRpZgorI2lmbmRlZiBfVkFfTElTVF9UX0gKKyNkZWZpbmUgX1ZBX0xJU1RfVF9ICisjZW5kaWYKKyNpZm5kZWYgX192YV9saXN0X18KKyNkZWZpbmUgX192YV9saXN0X18KKyNlbmRpZgorCisjZW5kaWYgLyogbm90IF9WQV9MSVNUXywgZXhjZXB0IG9uIGNlcnRhaW4gc3lzdGVtcyAqLworCisjZW5kaWYgLyogbm90IF9fc3ZyNF9fICovCisKKyNlbmRpZiAvKiBfU1REQVJHX0ggKi8KKworI2VuZGlmIC8qIG5vdCBfQU5TSV9TVERBUkdfSF8gKi8KKyNlbmRpZiAvKiBub3QgX1NUREFSR19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRib29sLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRib29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0NmU2MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGJvb2wuaApAQCAtMCwwICsxLDUwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyoKKyAqIElTTyBDIFN0YW5kYXJkOiAgNy4xNiAgQm9vbGVhbiB0eXBlIGFuZCB2YWx1ZXMgIDxzdGRib29sLmg+CisgKi8KKworI2lmbmRlZiBfU1REQk9PTF9ICisjZGVmaW5lIF9TVERCT09MX0gKKworI2lmbmRlZiBfX2NwbHVzcGx1cworCisjZGVmaW5lIGJvb2wJX0Jvb2wKKyNkZWZpbmUgdHJ1ZQkxCisjZGVmaW5lIGZhbHNlCTAKKworI2Vsc2UgLyogX19jcGx1c3BsdXMgKi8KKworLyogU3VwcG9ydGluZyA8c3RkYm9vbC5oPiBpbiBDKysgaXMgYSBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgX0Jvb2wJYm9vbAorI2RlZmluZSBib29sCWJvb2wKKyNkZWZpbmUgZmFsc2UJZmFsc2UKKyNkZWZpbmUgdHJ1ZQl0cnVlCisKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKiBTaWduYWwgdGhhdCBhbGwgdGhlIGRlZmluaXRpb25zIGFyZSBwcmVzZW50LiAgKi8KKyNkZWZpbmUgX19ib29sX3RydWVfZmFsc2VfYXJlX2RlZmluZWQJMQorCisjZW5kaWYJLyogc3RkYm9vbC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRkZWYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNGRkNjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRkZWYuaApAQCAtMCwwICsxLDQzOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTg5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qCisgKiBJU08gQyBTdGFuZGFyZDogIDcuMTcgIENvbW1vbiBkZWZpbml0aW9ucyAgPHN0ZGRlZi5oPgorICovCisjaWYgKCFkZWZpbmVkKF9TVERERUZfSCkgJiYgIWRlZmluZWQoX1NURERFRl9IXykgJiYgIWRlZmluZWQoX0FOU0lfU1REREVGX0gpIFwKKyAgICAgJiYgIWRlZmluZWQoX19TVERERUZfSF9fKSkgXAorICAgIHx8IGRlZmluZWQoX19uZWVkX3djaGFyX3QpIHx8IGRlZmluZWQoX19uZWVkX3NpemVfdCkgXAorICAgIHx8IGRlZmluZWQoX19uZWVkX3B0cmRpZmZfdCkgfHwgZGVmaW5lZChfX25lZWRfTlVMTCkgXAorICAgIHx8IGRlZmluZWQoX19uZWVkX3dpbnRfdCkKKworLyogQW55IG9uZSBvZiB0aGVzZSBzeW1ib2xzIF9fbmVlZF8qIG1lYW5zIHRoYXQgR05VIGxpYmMKKyAgIHdhbnRzIHVzIGp1c3QgdG8gZGVmaW5lIG9uZSBkYXRhIHR5cGUuICBTbyBkb24ndCBkZWZpbmUKKyAgIHRoZSBzeW1ib2xzIHRoYXQgaW5kaWNhdGUgdGhpcyBmaWxlJ3MgZW50aXJlIGpvYiBoYXMgYmVlbiBkb25lLiAgKi8KKyNpZiAoIWRlZmluZWQoX19uZWVkX3djaGFyX3QpICYmICFkZWZpbmVkKF9fbmVlZF9zaXplX3QpCVwKKyAgICAgJiYgIWRlZmluZWQoX19uZWVkX3B0cmRpZmZfdCkgJiYgIWRlZmluZWQoX19uZWVkX05VTEwpCVwKKyAgICAgJiYgIWRlZmluZWQoX19uZWVkX3dpbnRfdCkpCisjZGVmaW5lIF9TVERERUZfSAorI2RlZmluZSBfU1REREVGX0hfCisvKiBzbmFyb2ZmQG5leHQuY29tIHNheXMgdGhlIE5lWFQgbmVlZHMgdGhpcy4gICovCisjZGVmaW5lIF9BTlNJX1NURERFRl9ICisjZW5kaWYKKworI2lmbmRlZiBfX3N5c19zdGR0eXBlc19oCisvKiBUaGlzIGF2b2lkcyBsb3NzYWdlIG9uIFN1bk9TIGJ1dCBvbmx5IGlmIHN0ZHR5cGVzLmggY29tZXMgZmlyc3QuCisgICBUaGVyZSdzIG5vIHdheSB0byB3aW4gd2l0aCB0aGUgb3RoZXIgb3JkZXIhICBTdW4gbG9zc2FnZS4gICovCisKKy8qIE9uIDQuM2JzZC1uZXQyLCBtYWtlIHN1cmUgYW5zaS5oIGlzIGluY2x1ZGVkLCBzbyB3ZSBoYXZlCisgICBvbmUgbGVzcyBjYXNlIHRvIGRlYWwgd2l0aCBpbiB0aGUgZm9sbG93aW5nLiAgKi8KKyNpZiBkZWZpbmVkIChfX0JTRF9ORVQyX18pIHx8IGRlZmluZWQgKF9fX18zODZCU0RfX19fKSB8fCAoZGVmaW5lZCAoX19GcmVlQlNEX18pICYmIChfX0ZyZWVCU0RfXyA8IDUpKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCisjaW5jbHVkZSA8bWFjaGluZS9hbnNpLmg+CisjZW5kaWYKKy8qIE9uIEZyZWVCU0QgNSwgbWFjaGluZS9hbnNpLmggZG9lcyBub3QgZXhpc3QgYW55bW9yZS4uLiAqLworI2lmIGRlZmluZWQgKF9fRnJlZUJTRF9fKSAmJiAoX19GcmVlQlNEX18gPj0gNSkKKyNpbmNsdWRlIDxzeXMvX3R5cGVzLmg+CisjZW5kaWYKKworLyogSW4gNC4zYnNkLW5ldDIsIG1hY2hpbmUvYW5zaS5oIGRlZmluZXMgdGhlc2Ugc3ltYm9scywgd2hpY2ggYXJlCisgICBkZWZpbmVkIGlmIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgaXMgKm5vdCogZGVmaW5lZC4KKyAgIEZyZWVCU0QtMi4xIGRlZmluZXMgX01BQ0hJTkVfQU5TSV9IXyBpbnN0ZWFkIG9mIF9BTlNJX0hfLgorICAgTmV0QlNEIGRlZmluZXMgX0kzODZfQU5TSV9IXyBhbmQgX1g4Nl82NF9BTlNJX0hfIGluc3RlYWQgb2YgX0FOU0lfSF8gKi8KKyNpZiBkZWZpbmVkKF9BTlNJX0hfKSB8fCBkZWZpbmVkKF9NQUNISU5FX0FOU0lfSF8pIHx8IGRlZmluZWQoX1g4Nl82NF9BTlNJX0hfKSAgfHwgZGVmaW5lZChfSTM4Nl9BTlNJX0hfKQorI2lmICFkZWZpbmVkKF9TSVpFX1RfKSAmJiAhZGVmaW5lZChfQlNEX1NJWkVfVF8pCisjZGVmaW5lIF9TSVpFX1QKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9QVFJESUZGX1RfKSAmJiAhZGVmaW5lZChfQlNEX1BUUkRJRkZfVF8pCisjZGVmaW5lIF9QVFJESUZGX1QKKyNlbmRpZgorLyogT24gQlNELzM4NiAxLjEsIGF0IGxlYXN0LCBtYWNoaW5lL2Fuc2kuaCBkZWZpbmVzIF9CU0RfV0NIQVJfVF8KKyAgIGluc3RlYWQgb2YgX1dDSEFSX1RfLiAqLworI2lmICFkZWZpbmVkKF9XQ0hBUl9UXykgJiYgIWRlZmluZWQoX0JTRF9XQ0hBUl9UXykKKyNpZm5kZWYgX0JTRF9XQ0hBUl9UXworI2RlZmluZSBfV0NIQVJfVAorI2VuZGlmCisjZW5kaWYKKy8qIFVuZGVmIF9GT09fVF8gaWYgd2UgYXJlIHN1cHBvc2VkIHRvIGRlZmluZSBmb29fdC4gICovCisjaWYgZGVmaW5lZCAoX19uZWVkX3B0cmRpZmZfdCkgfHwgZGVmaW5lZCAoX1NURERFRl9IXykKKyN1bmRlZiBfUFRSRElGRl9UXworI3VuZGVmIF9CU0RfUFRSRElGRl9UXworI2VuZGlmCisjaWYgZGVmaW5lZCAoX19uZWVkX3NpemVfdCkgfHwgZGVmaW5lZCAoX1NURERFRl9IXykKKyN1bmRlZiBfU0laRV9UXworI3VuZGVmIF9CU0RfU0laRV9UXworI2VuZGlmCisjaWYgZGVmaW5lZCAoX19uZWVkX3djaGFyX3QpIHx8IGRlZmluZWQgKF9TVERERUZfSF8pCisjdW5kZWYgX1dDSEFSX1RfCisjdW5kZWYgX0JTRF9XQ0hBUl9UXworI2VuZGlmCisjZW5kaWYgLyogZGVmaW5lZChfQU5TSV9IXykgfHwgZGVmaW5lZChfTUFDSElORV9BTlNJX0hfKSB8fCBkZWZpbmVkKF9YODZfNjRfQU5TSV9IXykgfHwgZGVmaW5lZChfSTM4Nl9BTlNJX0hfKSAqLworCisvKiBTZXF1ZW50J3MgaGVhZGVyIGZpbGVzIHVzZSBfUFRSRElGRl9UXyBpbiBzb21lIGNvbmZsaWN0aW5nIHdheS4KKyAgIEp1c3QgaWdub3JlIGl0LiAgKi8KKyNpZiBkZWZpbmVkIChfX3NlcXVlbnRfXykgJiYgZGVmaW5lZCAoX1BUUkRJRkZfVF8pCisjdW5kZWYgX1BUUkRJRkZfVF8KKyNlbmRpZgorCisvKiBPbiBWeFdvcmtzLCA8dHlwZS92eFR5cGVzQmFzZS5oPiBtYXkgaGF2ZSBkZWZpbmVkIG1hY3JvcyBsaWtlCisgICBfVFlQRV9zaXplX3Qgd2hpY2ggd2lsbCB0eXBlZGVmIHNpemVfdC4gIGZpeGluY2x1ZGVzIHBhdGNoZWQgdGhlCisgICB2eFR5cGVzQmFzZS5oIHNvIHRoYXQgdGhpcyBtYWNybyBpcyBvbmx5IGRlZmluZWQgaWYgX0dDQ19TSVpFX1QgaXMKKyAgIG5vdCBkZWZpbmVkLCBhbmQgc28gdGhhdCBkZWZpbmluZyB0aGlzIG1hY3JvIGRlZmluZXMgX0dDQ19TSVpFX1QuCisgICBJZiB3ZSBmaW5kIHRoYXQgdGhlIG1hY3JvcyBhcmUgc3RpbGwgZGVmaW5lZCBhdCB0aGlzIHBvaW50LCB3ZSBtdXN0CisgICBpbnZva2UgdGhlbSBzbyB0aGF0IHRoZSB0eXBlIGlzIGRlZmluZWQgYXMgZXhwZWN0ZWQuICAqLworI2lmIGRlZmluZWQgKF9UWVBFX3B0cmRpZmZfdCkgJiYgKGRlZmluZWQgKF9fbmVlZF9wdHJkaWZmX3QpIHx8IGRlZmluZWQgKF9TVERERUZfSF8pKQorX1RZUEVfcHRyZGlmZl90OworI3VuZGVmIF9UWVBFX3B0cmRpZmZfdAorI2VuZGlmCisjaWYgZGVmaW5lZCAoX1RZUEVfc2l6ZV90KSAmJiAoZGVmaW5lZCAoX19uZWVkX3NpemVfdCkgfHwgZGVmaW5lZCAoX1NURERFRl9IXykpCitfVFlQRV9zaXplX3Q7CisjdW5kZWYgX1RZUEVfc2l6ZV90CisjZW5kaWYKKyNpZiBkZWZpbmVkIChfVFlQRV93Y2hhcl90KSAmJiAoZGVmaW5lZCAoX19uZWVkX3djaGFyX3QpIHx8IGRlZmluZWQgKF9TVERERUZfSF8pKQorX1RZUEVfd2NoYXJfdDsKKyN1bmRlZiBfVFlQRV93Y2hhcl90CisjZW5kaWYKKworLyogSW4gY2FzZSBub2JvZHkgaGFzIGRlZmluZWQgdGhlc2UgdHlwZXMsIGJ1dCB3ZSBhcmVuJ3QgcnVubmluZyB1bmRlcgorICAgR0NDIDIuMDAsIG1ha2Ugc3VyZSB0aGF0IF9fUFRSRElGRl9UWVBFX18sIF9fU0laRV9UWVBFX18sIGFuZAorICAgX19XQ0hBUl9UWVBFX18gaGF2ZSByZWFzb25hYmxlIHZhbHVlcy4gIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUKKyAgIHBhcnRzIG9mIEdDQyBpcyBjb21waWxlZCBieSBhbiBvbGRlciBjb21waWxlciwgdGhhdCBhY3R1YWxseQorICAgaW5jbHVkZSBnc3RkZGVmLmgsIHN1Y2ggYXMgY29sbGVjdDIuICAqLworCisvKiBTaWduZWQgdHlwZSBvZiBkaWZmZXJlbmNlIG9mIHR3byBwb2ludGVycy4gICovCisKKy8qIERlZmluZSB0aGlzIHR5cGUgaWYgd2UgYXJlIGRvaW5nIHRoZSB3aG9sZSBqb2IsCisgICBvciBpZiB3ZSB3YW50IHRoaXMgdHlwZSBpbiBwYXJ0aWN1bGFyLiAgKi8KKyNpZiBkZWZpbmVkIChfU1REREVGX0gpIHx8IGRlZmluZWQgKF9fbmVlZF9wdHJkaWZmX3QpCisjaWZuZGVmIF9QVFJESUZGX1QJLyogaW4gY2FzZSA8c3lzL3R5cGVzLmg+IGhhcyBkZWZpbmVkIGl0LiAqLworI2lmbmRlZiBfVF9QVFJESUZGXworI2lmbmRlZiBfVF9QVFJESUZGCisjaWZuZGVmIF9fUFRSRElGRl9UCisjaWZuZGVmIF9QVFJESUZGX1RfCisjaWZuZGVmIF9CU0RfUFRSRElGRl9UXworI2lmbmRlZiBfX19pbnRfcHRyZGlmZl90X2gKKyNpZm5kZWYgX0dDQ19QVFJESUZGX1QKKyNkZWZpbmUgX1BUUkRJRkZfVAorI2RlZmluZSBfVF9QVFJESUZGXworI2RlZmluZSBfVF9QVFJESUZGCisjZGVmaW5lIF9fUFRSRElGRl9UCisjZGVmaW5lIF9QVFJESUZGX1RfCisjZGVmaW5lIF9CU0RfUFRSRElGRl9UXworI2RlZmluZSBfX19pbnRfcHRyZGlmZl90X2gKKyNkZWZpbmUgX0dDQ19QVFJESUZGX1QKKyNpZm5kZWYgX19QVFJESUZGX1RZUEVfXworI2RlZmluZSBfX1BUUkRJRkZfVFlQRV9fIGxvbmcgaW50CisjZW5kaWYKK3R5cGVkZWYgX19QVFJESUZGX1RZUEVfXyBwdHJkaWZmX3Q7CisjZW5kaWYgLyogX0dDQ19QVFJESUZGX1QgKi8KKyNlbmRpZiAvKiBfX19pbnRfcHRyZGlmZl90X2ggKi8KKyNlbmRpZiAvKiBfQlNEX1BUUkRJRkZfVF8gKi8KKyNlbmRpZiAvKiBfUFRSRElGRl9UXyAqLworI2VuZGlmIC8qIF9fUFRSRElGRl9UICovCisjZW5kaWYgLyogX1RfUFRSRElGRiAqLworI2VuZGlmIC8qIF9UX1BUUkRJRkZfICovCisjZW5kaWYgLyogX1BUUkRJRkZfVCAqLworCisvKiBJZiB0aGlzIHN5bWJvbCBoYXMgZG9uZSBpdHMgam9iLCBnZXQgcmlkIG9mIGl0LiAgKi8KKyN1bmRlZglfX25lZWRfcHRyZGlmZl90CisKKyNlbmRpZiAvKiBfU1REREVGX0ggb3IgX19uZWVkX3B0cmRpZmZfdC4gICovCisKKy8qIFVuc2lnbmVkIHR5cGUgb2YgYHNpemVvZicgc29tZXRoaW5nLiAgKi8KKworLyogRGVmaW5lIHRoaXMgdHlwZSBpZiB3ZSBhcmUgZG9pbmcgdGhlIHdob2xlIGpvYiwKKyAgIG9yIGlmIHdlIHdhbnQgdGhpcyB0eXBlIGluIHBhcnRpY3VsYXIuICAqLworI2lmIGRlZmluZWQgKF9TVERERUZfSCkgfHwgZGVmaW5lZCAoX19uZWVkX3NpemVfdCkKKyNpZm5kZWYgX19zaXplX3RfXwkvKiBCZU9TICovCisjaWZuZGVmIF9fU0laRV9UX18JLyogQ3JheSBVbmljb3MvTWsgKi8KKyNpZm5kZWYgX1NJWkVfVAkvKiBpbiBjYXNlIDxzeXMvdHlwZXMuaD4gaGFzIGRlZmluZWQgaXQuICovCisjaWZuZGVmIF9TWVNfU0laRV9UX0gKKyNpZm5kZWYgX1RfU0laRV8KKyNpZm5kZWYgX1RfU0laRQorI2lmbmRlZiBfX1NJWkVfVAorI2lmbmRlZiBfU0laRV9UXworI2lmbmRlZiBfQlNEX1NJWkVfVF8KKyNpZm5kZWYgX1NJWkVfVF9ERUZJTkVEXworI2lmbmRlZiBfU0laRV9UX0RFRklORUQKKyNpZm5kZWYgX0JTRF9TSVpFX1RfREVGSU5FRF8JLyogRGFyd2luICovCisjaWZuZGVmIF9TSVpFX1RfREVDTEFSRUQJLyogRnJlZUJTRCA1ICovCisjaWZuZGVmIF9fX2ludF9zaXplX3RfaAorI2lmbmRlZiBfR0NDX1NJWkVfVAorI2lmbmRlZiBfU0laRVRfCisjaWZuZGVmIF9fc2l6ZV90CisjZGVmaW5lIF9fc2l6ZV90X18JLyogQmVPUyAqLworI2RlZmluZSBfX1NJWkVfVF9fCS8qIENyYXkgVW5pY29zL01rICovCisjZGVmaW5lIF9TSVpFX1QKKyNkZWZpbmUgX1NZU19TSVpFX1RfSAorI2RlZmluZSBfVF9TSVpFXworI2RlZmluZSBfVF9TSVpFCisjZGVmaW5lIF9fU0laRV9UCisjZGVmaW5lIF9TSVpFX1RfCisjZGVmaW5lIF9CU0RfU0laRV9UXworI2RlZmluZSBfU0laRV9UX0RFRklORURfCisjZGVmaW5lIF9TSVpFX1RfREVGSU5FRAorI2RlZmluZSBfQlNEX1NJWkVfVF9ERUZJTkVEXwkvKiBEYXJ3aW4gKi8KKyNkZWZpbmUgX1NJWkVfVF9ERUNMQVJFRAkvKiBGcmVlQlNEIDUgKi8KKyNkZWZpbmUgX19faW50X3NpemVfdF9oCisjZGVmaW5lIF9HQ0NfU0laRV9UCisjZGVmaW5lIF9TSVpFVF8KKyNpZiAoZGVmaW5lZCAoX19GcmVlQlNEX18pICYmIChfX0ZyZWVCU0RfXyA+PSA1KSkgXAorICB8fCBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykKKy8qIF9fc2l6ZV90IGlzIGEgdHlwZWRlZiBvbiBGcmVlQlNEIDUsIG11c3Qgbm90IHRyYXNoIGl0LiAqLworI2VsaWYgZGVmaW5lZCAoX19WTVNfXykKKy8qIF9fc2l6ZV90IGlzIGFsc28gYSB0eXBlZGVmIG9uIFZNUy4gICovCisjZWxzZQorI2RlZmluZSBfX3NpemVfdAorI2VuZGlmCisjaWZuZGVmIF9fU0laRV9UWVBFX18KKyNkZWZpbmUgX19TSVpFX1RZUEVfXyBsb25nIHVuc2lnbmVkIGludAorI2VuZGlmCisjaWYgIShkZWZpbmVkIChfX0dOVUdfXykgJiYgZGVmaW5lZCAoc2l6ZV90KSkKK3R5cGVkZWYgX19TSVpFX1RZUEVfXyBzaXplX3Q7CisjaWZkZWYgX19CRU9TX18KK3R5cGVkZWYgbG9uZyBzc2l6ZV90OworI2VuZGlmIC8qIF9fQkVPU19fICovCisjZW5kaWYgLyogIShkZWZpbmVkIChfX0dOVUdfXykgJiYgZGVmaW5lZCAoc2l6ZV90KSkgKi8KKyNlbmRpZiAvKiBfX3NpemVfdCAqLworI2VuZGlmIC8qIF9TSVpFVF8gKi8KKyNlbmRpZiAvKiBfR0NDX1NJWkVfVCAqLworI2VuZGlmIC8qIF9fX2ludF9zaXplX3RfaCAqLworI2VuZGlmIC8qIF9TSVpFX1RfREVDTEFSRUQgKi8KKyNlbmRpZiAvKiBfQlNEX1NJWkVfVF9ERUZJTkVEXyAqLworI2VuZGlmIC8qIF9TSVpFX1RfREVGSU5FRCAqLworI2VuZGlmIC8qIF9TSVpFX1RfREVGSU5FRF8gKi8KKyNlbmRpZiAvKiBfQlNEX1NJWkVfVF8gKi8KKyNlbmRpZiAvKiBfU0laRV9UXyAqLworI2VuZGlmIC8qIF9fU0laRV9UICovCisjZW5kaWYgLyogX1RfU0laRSAqLworI2VuZGlmIC8qIF9UX1NJWkVfICovCisjZW5kaWYgLyogX1NZU19TSVpFX1RfSCAqLworI2VuZGlmIC8qIF9TSVpFX1QgKi8KKyNlbmRpZiAvKiBfX1NJWkVfVF9fICovCisjZW5kaWYgLyogX19zaXplX3RfXyAqLworI3VuZGVmCV9fbmVlZF9zaXplX3QKKyNlbmRpZiAvKiBfU1REREVGX0ggb3IgX19uZWVkX3NpemVfdC4gICovCisKKworLyogV2lkZSBjaGFyYWN0ZXIgdHlwZS4KKyAgIExvY2FsZS13cml0ZXJzIHNob3VsZCBjaGFuZ2UgdGhpcyBhcyBuZWNlc3NhcnkgdG8KKyAgIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCB1bmlxdWUgdmFsdWVzIG5vdCBiZXR3ZWVuIDAgYW5kIDEyNywKKyAgIGFuZCBub3QgKHdjaGFyX3QpIC0xLCBmb3IgZWFjaCBkZWZpbmVkIG11bHRpYnl0ZSBjaGFyYWN0ZXIuICAqLworCisvKiBEZWZpbmUgdGhpcyB0eXBlIGlmIHdlIGFyZSBkb2luZyB0aGUgd2hvbGUgam9iLAorICAgb3IgaWYgd2Ugd2FudCB0aGlzIHR5cGUgaW4gcGFydGljdWxhci4gICovCisjaWYgZGVmaW5lZCAoX1NURERFRl9IKSB8fCBkZWZpbmVkIChfX25lZWRfd2NoYXJfdCkKKyNpZm5kZWYgX193Y2hhcl90X18JLyogQmVPUyAqLworI2lmbmRlZiBfX1dDSEFSX1RfXwkvKiBDcmF5IFVuaWNvcy9NayAqLworI2lmbmRlZiBfV0NIQVJfVAorI2lmbmRlZiBfVF9XQ0hBUl8KKyNpZm5kZWYgX1RfV0NIQVIKKyNpZm5kZWYgX19XQ0hBUl9UCisjaWZuZGVmIF9XQ0hBUl9UXworI2lmbmRlZiBfQlNEX1dDSEFSX1RfCisjaWZuZGVmIF9CU0RfV0NIQVJfVF9ERUZJTkVEXyAgICAvKiBEYXJ3aW4gKi8KKyNpZm5kZWYgX0JTRF9SVU5FX1RfREVGSU5FRF8JLyogRGFyd2luICovCisjaWZuZGVmIF9XQ0hBUl9UX0RFQ0xBUkVEIC8qIEZyZWVCU0QgNSAqLworI2lmbmRlZiBfV0NIQVJfVF9ERUZJTkVEXworI2lmbmRlZiBfV0NIQVJfVF9ERUZJTkVECisjaWZuZGVmIF9XQ0hBUl9UX0gKKyNpZm5kZWYgX19faW50X3djaGFyX3RfaAorI2lmbmRlZiBfX0lOVF9XQ0hBUl9UX0gKKyNpZm5kZWYgX0dDQ19XQ0hBUl9UCisjZGVmaW5lIF9fd2NoYXJfdF9fCS8qIEJlT1MgKi8KKyNkZWZpbmUgX19XQ0hBUl9UX18JLyogQ3JheSBVbmljb3MvTWsgKi8KKyNkZWZpbmUgX1dDSEFSX1QKKyNkZWZpbmUgX1RfV0NIQVJfCisjZGVmaW5lIF9UX1dDSEFSCisjZGVmaW5lIF9fV0NIQVJfVAorI2RlZmluZSBfV0NIQVJfVF8KKyNkZWZpbmUgX0JTRF9XQ0hBUl9UXworI2RlZmluZSBfV0NIQVJfVF9ERUZJTkVEXworI2RlZmluZSBfV0NIQVJfVF9ERUZJTkVECisjZGVmaW5lIF9XQ0hBUl9UX0gKKyNkZWZpbmUgX19faW50X3djaGFyX3RfaAorI2RlZmluZSBfX0lOVF9XQ0hBUl9UX0gKKyNkZWZpbmUgX0dDQ19XQ0hBUl9UCisjZGVmaW5lIF9XQ0hBUl9UX0RFQ0xBUkVECisKKy8qIE9uIEJTRC8zODYgMS4xLCBhdCBsZWFzdCwgbWFjaGluZS9hbnNpLmggZGVmaW5lcyBfQlNEX1dDSEFSX1RfCisgICBpbnN0ZWFkIG9mIF9XQ0hBUl9UXywgYW5kIF9CU0RfUlVORV9UXyAod2hpY2gsIHVubGlrZSB0aGUgb3RoZXIKKyAgIHN5bWJvbHMgaW4gdGhlIF9GT09fVF8gZmFtaWx5LCBzdGF5cyBkZWZpbmVkIGV2ZW4gYWZ0ZXIgaXRzCisgICBjb3JyZXNwb25kaW5nIHR5cGUgaXMgZGVmaW5lZCkuICBJZiB3ZSBkZWZpbmUgd2NoYXJfdCwgdGhlbiB3ZQorICAgbXVzdCB1bmRlZiBfV0NIQVJfVF87IGZvciBCU0QvMzg2IDEuMSAoYW5kIHBlcmhhcHMgb3RoZXJzKSwgaWYKKyAgIHdlIHVuZGVmIF9XQ0hBUl9UXywgdGhlbiB3ZSBtdXN0IGFsc28gZGVmaW5lIHJ1bmVfdCwgc2luY2UgCisgICBoZWFkZXJzIGxpa2UgcnVuZXR5cGUuaCBhc3N1bWUgdGhhdCBpZiBtYWNoaW5lL2Fuc2kuaCBpcyBpbmNsdWRlZCwKKyAgIGFuZCBfQlNEX1dDSEFSX1RfIGlzIG5vdCBkZWZpbmVkLCB0aGVuIHJ1bmVfdCBpcyBhdmFpbGFibGUuCisgICBtYWNoaW5lL2Fuc2kuaCBzYXlzLCAiTm90ZSB0aGF0IF9XQ0hBUl9UXyBhbmQgX1JVTkVfVF8gbXVzdCBiZSBvZgorICAgdGhlIHNhbWUgdHlwZS4iICovCisjaWZkZWYgX0JTRF9XQ0hBUl9UXworI3VuZGVmIF9CU0RfV0NIQVJfVF8KKyNpZmRlZiBfQlNEX1JVTkVfVF8KKyNpZiAhZGVmaW5lZCAoX0FOU0lfU09VUkNFKSAmJiAhZGVmaW5lZCAoX1BPU0lYX1NPVVJDRSkKK3R5cGVkZWYgX0JTRF9SVU5FX1RfIHJ1bmVfdDsKKyNkZWZpbmUgX0JTRF9XQ0hBUl9UX0RFRklORURfCisjZGVmaW5lIF9CU0RfUlVORV9UX0RFRklORURfCS8qIERhcndpbiAqLworI2lmIGRlZmluZWQgKF9fRnJlZUJTRF9fKSAmJiAoX19GcmVlQlNEX18gPCA1KQorLyogV2h5IGlzIHRoaXMgZmlsZSBzbyBoYXJkIHRvIG1haW50YWluIHByb3Blcmx5PyAgSW4gY29udHJhc3QgdG8KKyAgIHRoZSBjb21tZW50IGFib3ZlIHJlZ2FyZGluZyBCU0QvMzg2IDEuMSwgb24gRnJlZUJTRCBmb3IgYXMgbG9uZworICAgYXMgdGhlIHN5bWJvbCBoYXMgZXhpc3RlZCwgX0JTRF9SVU5FX1RfIG11c3Qgbm90IHN0YXkgZGVmaW5lZCBvcgorICAgcmVkdW5kYW50IHR5cGVkZWZzIHdpbGwgb2NjdXIgd2hlbiBzdGRsaWIuaCBpcyBpbmNsdWRlZCBhZnRlciB0aGlzIGZpbGUuICovCisjdW5kZWYgX0JTRF9SVU5FX1RfCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKy8qIEZyZWVCU0QgNSBjYW4ndCBiZSBoYW5kbGVkIHdlbGwgdXNpbmcgInRyYWRpdGlvbmFsIiBsb2dpYyBhYm92ZQorICAgc2luY2UgaXQgbm8gbG9uZ2VyIGRlZmluZXMgX0JTRF9SVU5FX1RfIHlldCBzdGlsbCBkZXNpcmVzIHRvIGV4cG9ydAorICAgcnVuZV90IGluIHNvbWUgY2FzZXMuLi4gKi8KKyNpZiBkZWZpbmVkIChfX0ZyZWVCU0RfXykgJiYgKF9fRnJlZUJTRF9fID49IDUpCisjaWYgIWRlZmluZWQgKF9BTlNJX1NPVVJDRSkgJiYgIWRlZmluZWQgKF9QT1NJWF9TT1VSQ0UpCisjaWYgX19CU0RfVklTSUJMRQorI2lmbmRlZiBfUlVORV9UX0RFQ0xBUkVECit0eXBlZGVmIF9fcnVuZV90ICAgICAgICBydW5lX3Q7CisjZGVmaW5lIF9SVU5FX1RfREVDTEFSRUQKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fV0NIQVJfVFlQRV9fCisjZGVmaW5lIF9fV0NIQVJfVFlQRV9fIGludAorI2VuZGlmCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIF9fV0NIQVJfVFlQRV9fIHdjaGFyX3Q7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZiAvKiBfV0NIQVJfVF9ERUNMQVJFRCAqLworI2VuZGlmIC8qIF9CU0RfUlVORV9UX0RFRklORURfICovCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZiAvKiBfX1dDSEFSX1RfXyAqLworI2VuZGlmIC8qIF9fd2NoYXJfdF9fICovCisjdW5kZWYJX19uZWVkX3djaGFyX3QKKyNlbmRpZiAvKiBfU1REREVGX0ggb3IgX19uZWVkX3djaGFyX3QuICAqLworCisjaWYgZGVmaW5lZCAoX19uZWVkX3dpbnRfdCkKKyNpZm5kZWYgX1dJTlRfVAorI2RlZmluZSBfV0lOVF9UCisKKyNpZm5kZWYgX19XSU5UX1RZUEVfXworI2RlZmluZSBfX1dJTlRfVFlQRV9fIHVuc2lnbmVkIGludAorI2VuZGlmCit0eXBlZGVmIF9fV0lOVF9UWVBFX18gd2ludF90OworI2VuZGlmCisjdW5kZWYgX19uZWVkX3dpbnRfdAorI2VuZGlmCisKKy8qICBJbiA0LjNic2QtbmV0MiwgbGVhdmUgdGhlc2UgdW5kZWZpbmVkIHRvIGluZGljYXRlIHRoYXQgc2l6ZV90LCBldGMuCisgICAgYXJlIGFscmVhZHkgZGVmaW5lZC4gICovCisvKiAgQlNEL09TIDMuMSBhbmQgRnJlZUJTRCBbMjNdLnggcmVxdWlyZSB0aGUgTUFDSElORV9BTlNJX0ggY2hlY2sgaGVyZS4gICovCisvKiAgTmV0QlNEIDUgcmVxdWlyZXMgdGhlIEkzODZfQU5TSV9IIGFuZCBYODZfNjRfQU5TSV9IIGNoZWNrcyBoZXJlLiAgKi8KKyNpZiBkZWZpbmVkKF9BTlNJX0hfKSB8fCBkZWZpbmVkKF9NQUNISU5FX0FOU0lfSF8pIHx8IGRlZmluZWQoX1g4Nl82NF9BTlNJX0hfKSB8fCBkZWZpbmVkKF9JMzg2X0FOU0lfSF8pCisvKiAgVGhlIHJlZmVyZW5jZXMgdG8gX0dDQ19QVFJESUZGX1RfLCBfR0NDX1NJWkVfVF8sIGFuZCBfR0NDX1dDSEFSX1RfCisgICAgYXJlIHByb2JhYmx5IHR5cG9zIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBiZWZvcmUgMi44IGlzIHJlbGVhc2VkLiAgKi8KKyNpZmRlZiBfR0NDX1BUUkRJRkZfVF8KKyN1bmRlZiBfUFRSRElGRl9UXworI3VuZGVmIF9CU0RfUFRSRElGRl9UXworI2VuZGlmCisjaWZkZWYgX0dDQ19TSVpFX1RfCisjdW5kZWYgX1NJWkVfVF8KKyN1bmRlZiBfQlNEX1NJWkVfVF8KKyNlbmRpZgorI2lmZGVmIF9HQ0NfV0NIQVJfVF8KKyN1bmRlZiBfV0NIQVJfVF8KKyN1bmRlZiBfQlNEX1dDSEFSX1RfCisjZW5kaWYKKy8qICBUaGUgZm9sbG93aW5nIG9uZXMgYXJlIHRoZSByZWFsIG9uZXMuICAqLworI2lmZGVmIF9HQ0NfUFRSRElGRl9UCisjdW5kZWYgX1BUUkRJRkZfVF8KKyN1bmRlZiBfQlNEX1BUUkRJRkZfVF8KKyNlbmRpZgorI2lmZGVmIF9HQ0NfU0laRV9UCisjdW5kZWYgX1NJWkVfVF8KKyN1bmRlZiBfQlNEX1NJWkVfVF8KKyNlbmRpZgorI2lmZGVmIF9HQ0NfV0NIQVJfVAorI3VuZGVmIF9XQ0hBUl9UXworI3VuZGVmIF9CU0RfV0NIQVJfVF8KKyNlbmRpZgorI2VuZGlmIC8qIF9BTlNJX0hfIHx8IF9NQUNISU5FX0FOU0lfSF8gfHwgX1g4Nl82NF9BTlNJX0hfIHx8IF9JMzg2X0FOU0lfSF8gKi8KKworI2VuZGlmIC8qIF9fc3lzX3N0ZHR5cGVzX2ggKi8KKworLyogQSBudWxsIHBvaW50ZXIgY29uc3RhbnQuICAqLworCisjaWYgZGVmaW5lZCAoX1NURERFRl9IKSB8fCBkZWZpbmVkIChfX25lZWRfTlVMTCkKKyN1bmRlZiBOVUxMCQkvKiBpbiBjYXNlIDxzdGRpby5oPiBoYXMgZGVmaW5lZCBpdC4gKi8KKyNpZmRlZiBfX0dOVUdfXworI2RlZmluZSBOVUxMIF9fbnVsbAorI2Vsc2UgICAvKiBHKysgKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQorI2Vsc2UgICAvKiBDKysgKi8KKyNkZWZpbmUgTlVMTCAwCisjZW5kaWYgIC8qIEMrKyAqLworI2VuZGlmICAvKiBHKysgKi8KKyNlbmRpZgkvKiBOVUxMIG5vdCBkZWZpbmVkIGFuZCA8c3RkZGVmLmg+IG9yIG5lZWQgTlVMTC4gICovCisjdW5kZWYJX19uZWVkX05VTEwKKworI2lmZGVmIF9TVERERUZfSAorCisvKiBPZmZzZXQgb2YgbWVtYmVyIE1FTUJFUiBpbiBhIHN0cnVjdCBvZiB0eXBlIFRZUEUuICovCisjZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgX19idWlsdGluX29mZnNldG9mIChUWVBFLCBNRU1CRVIpCisKKyNpZiAoZGVmaW5lZCAoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAyMDExMTJMKSBcCisgIHx8IChkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMKQorI2lmbmRlZiBfR0NDX01BWF9BTElHTl9UCisjZGVmaW5lIF9HQ0NfTUFYX0FMSUdOX1QKKy8qIFR5cGUgd2hvc2UgYWxpZ25tZW50IGlzIHN1cHBvcnRlZCBpbiBldmVyeSBjb250ZXh0IGFuZCBpcyBhdCBsZWFzdAorICAgYXMgZ3JlYXQgYXMgdGhhdCBvZiBhbnkgc3RhbmRhcmQgdHlwZSBub3QgdXNpbmcgYWxpZ25tZW50CisgICBzcGVjaWZpZXJzLiAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgbG9uZyBsb25nIF9fbWF4X2FsaWduX2xsIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKF9fYWxpZ25vZl9fKGxvbmcgbG9uZykpKSk7CisgIGxvbmcgZG91YmxlIF9fbWF4X2FsaWduX2xkIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKF9fYWxpZ25vZl9fKGxvbmcgZG91YmxlKSkpKTsKK30gbWF4X2FsaWduX3Q7CisjZW5kaWYKKyNlbmRpZiAvKiBDMTEgb3IgQysrMTEuICAqLworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2lmbmRlZiBfR1hYX05VTExQVFJfVAorI2RlZmluZSBfR1hYX05VTExQVFJfVAorICB0eXBlZGVmIGRlY2x0eXBlKG51bGxwdHIpIG51bGxwdHJfdDsKKyNlbmRpZgorI2VuZGlmIC8qIEMrKzExLiAgKi8KKworI2VuZGlmIC8qIF9TVERERUZfSCB3YXMgZGVmaW5lZCB0aGlzIHRpbWUgKi8KKworI2VuZGlmIC8qICFfU1REREVGX0ggJiYgIV9TVERERUZfSF8gJiYgIV9BTlNJX1NURERFRl9IICYmICFfX1NURERFRl9IX18KKwkgIHx8IF9fbmVlZF9YWFggd2FzIG5vdCBkZWZpbmVkIGJlZm9yZSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkZml4LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRmaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGNlZjFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkZml4LmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBJU08vSUVDIEpUQzEgU0MyMiBXRzE0IE4xMTY5CisgKiBEYXRlOiAyMDA2LTA0LTA0CisgKiBJU08vSUVDIFRSIDE4MDM3CisgKiBQcm9ncmFtbWluZyBsYW5ndWFnZXMgLSBDIC0gRXh0ZW5zaW9ucyB0byBzdXBwb3J0IGVtYmVkZGVkIHByb2Nlc3NvcnMKKyAqLworCisjaWZuZGVmIF9TVERGSVhfSAorI2RlZmluZSBfU1RERklYX0gKKworLyogNy4xOGEuMSBJbnRyb2R1Y3Rpb24uICAqLworCisjdW5kZWYgZnJhY3QKKyN1bmRlZiBhY2N1bQorI3VuZGVmIHNhdAorI2RlZmluZSBmcmFjdAkJX0ZyYWN0CisjZGVmaW5lIGFjY3VtCQlfQWNjdW0KKyNkZWZpbmUgc2F0CQlfU2F0CisKKy8qIDcuMThhLjMgUHJlY2lzaW9uIG1hY3Jvcy4gICovCisKKyN1bmRlZiBTRlJBQ1RfRkJJVAorI3VuZGVmIFNGUkFDVF9NSU4KKyN1bmRlZiBTRlJBQ1RfTUFYCisjdW5kZWYgU0ZSQUNUX0VQU0lMT04KKyNkZWZpbmUgU0ZSQUNUX0ZCSVQJX19TRlJBQ1RfRkJJVF9fCisjZGVmaW5lIFNGUkFDVF9NSU4JX19TRlJBQ1RfTUlOX18KKyNkZWZpbmUgU0ZSQUNUX01BWAlfX1NGUkFDVF9NQVhfXworI2RlZmluZSBTRlJBQ1RfRVBTSUxPTglfX1NGUkFDVF9FUFNJTE9OX18KKworI3VuZGVmIFVTRlJBQ1RfRkJJVAorI3VuZGVmIFVTRlJBQ1RfTUlOCisjdW5kZWYgVVNGUkFDVF9NQVgKKyN1bmRlZiBVU0ZSQUNUX0VQU0lMT04KKyNkZWZpbmUgVVNGUkFDVF9GQklUCV9fVVNGUkFDVF9GQklUX18KKyNkZWZpbmUgVVNGUkFDVF9NSU4JX19VU0ZSQUNUX01JTl9fCQkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgVVNGUkFDVF9NQVgJX19VU0ZSQUNUX01BWF9fCisjZGVmaW5lIFVTRlJBQ1RfRVBTSUxPTglfX1VTRlJBQ1RfRVBTSUxPTl9fCisKKyN1bmRlZiBGUkFDVF9GQklUCisjdW5kZWYgRlJBQ1RfTUlOCisjdW5kZWYgRlJBQ1RfTUFYCisjdW5kZWYgRlJBQ1RfRVBTSUxPTgorI2RlZmluZSBGUkFDVF9GQklUCV9fRlJBQ1RfRkJJVF9fCisjZGVmaW5lIEZSQUNUX01JTglfX0ZSQUNUX01JTl9fCisjZGVmaW5lIEZSQUNUX01BWAlfX0ZSQUNUX01BWF9fCisjZGVmaW5lIEZSQUNUX0VQU0lMT04JX19GUkFDVF9FUFNJTE9OX18KKworI3VuZGVmIFVGUkFDVF9GQklUCisjdW5kZWYgVUZSQUNUX01JTgorI3VuZGVmIFVGUkFDVF9NQVgKKyN1bmRlZiBVRlJBQ1RfRVBTSUxPTgorI2RlZmluZSBVRlJBQ1RfRkJJVAlfX1VGUkFDVF9GQklUX18KKyNkZWZpbmUgVUZSQUNUX01JTglfX1VGUkFDVF9NSU5fXwkJLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIFVGUkFDVF9NQVgJX19VRlJBQ1RfTUFYX18KKyNkZWZpbmUgVUZSQUNUX0VQU0lMT04JX19VRlJBQ1RfRVBTSUxPTl9fCisKKyN1bmRlZiBMRlJBQ1RfRkJJVAorI3VuZGVmIExGUkFDVF9NSU4KKyN1bmRlZiBMRlJBQ1RfTUFYCisjdW5kZWYgTEZSQUNUX0VQU0lMT04KKyNkZWZpbmUgTEZSQUNUX0ZCSVQJX19MRlJBQ1RfRkJJVF9fCisjZGVmaW5lIExGUkFDVF9NSU4JX19MRlJBQ1RfTUlOX18KKyNkZWZpbmUgTEZSQUNUX01BWAlfX0xGUkFDVF9NQVhfXworI2RlZmluZSBMRlJBQ1RfRVBTSUxPTglfX0xGUkFDVF9FUFNJTE9OX18KKworI3VuZGVmIFVMRlJBQ1RfRkJJVAorI3VuZGVmIFVMRlJBQ1RfTUlOCisjdW5kZWYgVUxGUkFDVF9NQVgKKyN1bmRlZiBVTEZSQUNUX0VQU0lMT04KKyNkZWZpbmUgVUxGUkFDVF9GQklUCV9fVUxGUkFDVF9GQklUX18KKyNkZWZpbmUgVUxGUkFDVF9NSU4JX19VTEZSQUNUX01JTl9fCQkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgVUxGUkFDVF9NQVgJX19VTEZSQUNUX01BWF9fCisjZGVmaW5lIFVMRlJBQ1RfRVBTSUxPTglfX1VMRlJBQ1RfRVBTSUxPTl9fCisKKyN1bmRlZiBMTEZSQUNUX0ZCSVQKKyN1bmRlZiBMTEZSQUNUX01JTgorI3VuZGVmIExMRlJBQ1RfTUFYCisjdW5kZWYgTExGUkFDVF9FUFNJTE9OCisjZGVmaW5lIExMRlJBQ1RfRkJJVAlfX0xMRlJBQ1RfRkJJVF9fCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBMTEZSQUNUX01JTglfX0xMRlJBQ1RfTUlOX18JCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBMTEZSQUNUX01BWAlfX0xMRlJBQ1RfTUFYX18JCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBMTEZSQUNUX0VQU0lMT04JX19MTEZSQUNUX0VQU0lMT05fXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKworI3VuZGVmIFVMTEZSQUNUX0ZCSVQKKyN1bmRlZiBVTExGUkFDVF9NSU4KKyN1bmRlZiBVTExGUkFDVF9NQVgKKyN1bmRlZiBVTExGUkFDVF9FUFNJTE9OCisjZGVmaW5lIFVMTEZSQUNUX0ZCSVQJX19VTExGUkFDVF9GQklUX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIFVMTEZSQUNUX01JTglfX1VMTEZSQUNUX01JTl9fCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBVTExGUkFDVF9NQVgJX19VTExGUkFDVF9NQVhfXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgVUxMRlJBQ1RfRVBTSUxPTglfX1VMTEZSQUNUX0VQU0lMT05fXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKworI3VuZGVmIFNBQ0NVTV9GQklUCisjdW5kZWYgU0FDQ1VNX0lCSVQKKyN1bmRlZiBTQUNDVU1fTUlOCisjdW5kZWYgU0FDQ1VNX01BWAorI3VuZGVmIFNBQ0NVTV9FUFNJTE9OCisjZGVmaW5lIFNBQ0NVTV9GQklUCV9fU0FDQ1VNX0ZCSVRfXworI2RlZmluZSBTQUNDVU1fSUJJVAlfX1NBQ0NVTV9JQklUX18KKyNkZWZpbmUgU0FDQ1VNX01JTglfX1NBQ0NVTV9NSU5fXworI2RlZmluZSBTQUNDVU1fTUFYCV9fU0FDQ1VNX01BWF9fCisjZGVmaW5lIFNBQ0NVTV9FUFNJTE9OCV9fU0FDQ1VNX0VQU0lMT05fXworCisjdW5kZWYgVVNBQ0NVTV9GQklUCisjdW5kZWYgVVNBQ0NVTV9JQklUCisjdW5kZWYgVVNBQ0NVTV9NSU4KKyN1bmRlZiBVU0FDQ1VNX01BWAorI3VuZGVmIFVTQUNDVU1fRVBTSUxPTgorI2RlZmluZSBVU0FDQ1VNX0ZCSVQJX19VU0FDQ1VNX0ZCSVRfXworI2RlZmluZSBVU0FDQ1VNX0lCSVQJX19VU0FDQ1VNX0lCSVRfXworI2RlZmluZSBVU0FDQ1VNX01JTglfX1VTQUNDVU1fTUlOX18JCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBVU0FDQ1VNX01BWAlfX1VTQUNDVU1fTUFYX18KKyNkZWZpbmUgVVNBQ0NVTV9FUFNJTE9OCV9fVVNBQ0NVTV9FUFNJTE9OX18KKworI3VuZGVmIEFDQ1VNX0ZCSVQKKyN1bmRlZiBBQ0NVTV9JQklUCisjdW5kZWYgQUNDVU1fTUlOCisjdW5kZWYgQUNDVU1fTUFYCisjdW5kZWYgQUNDVU1fRVBTSUxPTgorI2RlZmluZSBBQ0NVTV9GQklUCV9fQUNDVU1fRkJJVF9fCisjZGVmaW5lIEFDQ1VNX0lCSVQJX19BQ0NVTV9JQklUX18KKyNkZWZpbmUgQUNDVU1fTUlOCV9fQUNDVU1fTUlOX18KKyNkZWZpbmUgQUNDVU1fTUFYCV9fQUNDVU1fTUFYX18KKyNkZWZpbmUgQUNDVU1fRVBTSUxPTglfX0FDQ1VNX0VQU0lMT05fXworCisjdW5kZWYgVUFDQ1VNX0ZCSVQKKyN1bmRlZiBVQUNDVU1fSUJJVAorI3VuZGVmIFVBQ0NVTV9NSU4KKyN1bmRlZiBVQUNDVU1fTUFYCisjdW5kZWYgVUFDQ1VNX0VQU0lMT04KKyNkZWZpbmUgVUFDQ1VNX0ZCSVQJX19VQUNDVU1fRkJJVF9fCisjZGVmaW5lIFVBQ0NVTV9JQklUCV9fVUFDQ1VNX0lCSVRfXworI2RlZmluZSBVQUNDVU1fTUlOCV9fVUFDQ1VNX01JTl9fCQkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgVUFDQ1VNX01BWAlfX1VBQ0NVTV9NQVhfXworI2RlZmluZSBVQUNDVU1fRVBTSUxPTglfX1VBQ0NVTV9FUFNJTE9OX18KKworI3VuZGVmIExBQ0NVTV9GQklUCisjdW5kZWYgTEFDQ1VNX0lCSVQKKyN1bmRlZiBMQUNDVU1fTUlOCisjdW5kZWYgTEFDQ1VNX01BWAorI3VuZGVmIExBQ0NVTV9FUFNJTE9OCisjZGVmaW5lIExBQ0NVTV9GQklUCV9fTEFDQ1VNX0ZCSVRfXworI2RlZmluZSBMQUNDVU1fSUJJVAlfX0xBQ0NVTV9JQklUX18KKyNkZWZpbmUgTEFDQ1VNX01JTglfX0xBQ0NVTV9NSU5fXworI2RlZmluZSBMQUNDVU1fTUFYCV9fTEFDQ1VNX01BWF9fCisjZGVmaW5lIExBQ0NVTV9FUFNJTE9OCV9fTEFDQ1VNX0VQU0lMT05fXworCisjdW5kZWYgVUxBQ0NVTV9GQklUCisjdW5kZWYgVUxBQ0NVTV9JQklUCisjdW5kZWYgVUxBQ0NVTV9NSU4KKyN1bmRlZiBVTEFDQ1VNX01BWAorI3VuZGVmIFVMQUNDVU1fRVBTSUxPTgorI2RlZmluZSBVTEFDQ1VNX0ZCSVQJX19VTEFDQ1VNX0ZCSVRfXworI2RlZmluZSBVTEFDQ1VNX0lCSVQJX19VTEFDQ1VNX0lCSVRfXworI2RlZmluZSBVTEFDQ1VNX01JTglfX1VMQUNDVU1fTUlOX18JCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBVTEFDQ1VNX01BWAlfX1VMQUNDVU1fTUFYX18KKyNkZWZpbmUgVUxBQ0NVTV9FUFNJTE9OCV9fVUxBQ0NVTV9FUFNJTE9OX18KKworI3VuZGVmIExMQUNDVU1fRkJJVAorI3VuZGVmIExMQUNDVU1fSUJJVAorI3VuZGVmIExMQUNDVU1fTUlOCisjdW5kZWYgTExBQ0NVTV9NQVgKKyN1bmRlZiBMTEFDQ1VNX0VQU0lMT04KKyNkZWZpbmUgTExBQ0NVTV9GQklUCV9fTExBQ0NVTV9GQklUX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIExMQUNDVU1fSUJJVAlfX0xMQUNDVU1fSUJJVF9fCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBMTEFDQ1VNX01JTglfX0xMQUNDVU1fTUlOX18JCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBMTEFDQ1VNX01BWAlfX0xMQUNDVU1fTUFYX18JCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBMTEFDQ1VNX0VQU0lMT04JX19MTEFDQ1VNX0VQU0lMT05fXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKworI3VuZGVmIFVMTEFDQ1VNX0ZCSVQKKyN1bmRlZiBVTExBQ0NVTV9JQklUCisjdW5kZWYgVUxMQUNDVU1fTUlOCisjdW5kZWYgVUxMQUNDVU1fTUFYCisjdW5kZWYgVUxMQUNDVU1fRVBTSUxPTgorI2RlZmluZSBVTExBQ0NVTV9GQklUCV9fVUxMQUNDVU1fRkJJVF9fCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBVTExBQ0NVTV9JQklUCV9fVUxMQUNDVU1fSUJJVF9fCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBVTExBQ0NVTV9NSU4JX19VTExBQ0NVTV9NSU5fXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgVUxMQUNDVU1fTUFYCV9fVUxMQUNDVU1fTUFYX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIFVMTEFDQ1VNX0VQU0lMT04JX19VTExBQ0NVTV9FUFNJTE9OX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisKKyNlbmRpZiAvKiBfU1RERklYX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGludC1nY2MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGludC1nY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzMzOWUyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkaW50LWdjYy5oCkBAIC0wLDAgKzEsMjYzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyoKKyAqIElTTyBDIFN0YW5kYXJkOiAgNy4xOCAgSW50ZWdlciB0eXBlcyAgPHN0ZGludC5oPgorICovCisKKyNpZm5kZWYgX0dDQ19TVERJTlRfSAorI2RlZmluZSBfR0NDX1NURElOVF9ICisKKy8qIDcuOC4xLjEgRXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcyAqLworCisjaWZkZWYgX19JTlQ4X1RZUEVfXwordHlwZWRlZiBfX0lOVDhfVFlQRV9fIGludDhfdDsKKyNlbmRpZgorI2lmZGVmIF9fSU5UMTZfVFlQRV9fCit0eXBlZGVmIF9fSU5UMTZfVFlQRV9fIGludDE2X3Q7CisjZW5kaWYKKyNpZmRlZiBfX0lOVDMyX1RZUEVfXwordHlwZWRlZiBfX0lOVDMyX1RZUEVfXyBpbnQzMl90OworI2VuZGlmCisjaWZkZWYgX19JTlQ2NF9UWVBFX18KK3R5cGVkZWYgX19JTlQ2NF9UWVBFX18gaW50NjRfdDsKKyNlbmRpZgorI2lmZGVmIF9fVUlOVDhfVFlQRV9fCit0eXBlZGVmIF9fVUlOVDhfVFlQRV9fIHVpbnQ4X3Q7CisjZW5kaWYKKyNpZmRlZiBfX1VJTlQxNl9UWVBFX18KK3R5cGVkZWYgX19VSU5UMTZfVFlQRV9fIHVpbnQxNl90OworI2VuZGlmCisjaWZkZWYgX19VSU5UMzJfVFlQRV9fCit0eXBlZGVmIF9fVUlOVDMyX1RZUEVfXyB1aW50MzJfdDsKKyNlbmRpZgorI2lmZGVmIF9fVUlOVDY0X1RZUEVfXwordHlwZWRlZiBfX1VJTlQ2NF9UWVBFX18gdWludDY0X3Q7CisjZW5kaWYKKworLyogNy44LjEuMiBNaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMgKi8KKwordHlwZWRlZiBfX0lOVF9MRUFTVDhfVFlQRV9fIGludF9sZWFzdDhfdDsKK3R5cGVkZWYgX19JTlRfTEVBU1QxNl9UWVBFX18gaW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgX19JTlRfTEVBU1QzMl9UWVBFX18gaW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgX19JTlRfTEVBU1Q2NF9UWVBFX18gaW50X2xlYXN0NjRfdDsKK3R5cGVkZWYgX19VSU5UX0xFQVNUOF9UWVBFX18gdWludF9sZWFzdDhfdDsKK3R5cGVkZWYgX19VSU5UX0xFQVNUMTZfVFlQRV9fIHVpbnRfbGVhc3QxNl90OwordHlwZWRlZiBfX1VJTlRfTEVBU1QzMl9UWVBFX18gdWludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIF9fVUlOVF9MRUFTVDY0X1RZUEVfXyB1aW50X2xlYXN0NjRfdDsKKworLyogNy44LjEuMyBGYXN0ZXN0IG1pbmltdW0td2lkdGggaW50ZWdlciB0eXBlcyAqLworCit0eXBlZGVmIF9fSU5UX0ZBU1Q4X1RZUEVfXyBpbnRfZmFzdDhfdDsKK3R5cGVkZWYgX19JTlRfRkFTVDE2X1RZUEVfXyBpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIF9fSU5UX0ZBU1QzMl9UWVBFX18gaW50X2Zhc3QzMl90OwordHlwZWRlZiBfX0lOVF9GQVNUNjRfVFlQRV9fIGludF9mYXN0NjRfdDsKK3R5cGVkZWYgX19VSU5UX0ZBU1Q4X1RZUEVfXyB1aW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIF9fVUlOVF9GQVNUMTZfVFlQRV9fIHVpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIF9fVUlOVF9GQVNUMzJfVFlQRV9fIHVpbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIF9fVUlOVF9GQVNUNjRfVFlQRV9fIHVpbnRfZmFzdDY0X3Q7CisKKy8qIDcuOC4xLjQgSW50ZWdlciB0eXBlcyBjYXBhYmxlIG9mIGhvbGRpbmcgb2JqZWN0IHBvaW50ZXJzICovCisKKyNpZmRlZiBfX0lOVFBUUl9UWVBFX18KK3R5cGVkZWYgX19JTlRQVFJfVFlQRV9fIGludHB0cl90OworI2VuZGlmCisjaWZkZWYgX19VSU5UUFRSX1RZUEVfXwordHlwZWRlZiBfX1VJTlRQVFJfVFlQRV9fIHVpbnRwdHJfdDsKKyNlbmRpZgorCisvKiA3LjguMS41IEdyZWF0ZXN0LXdpZHRoIGludGVnZXIgdHlwZXMgKi8KKwordHlwZWRlZiBfX0lOVE1BWF9UWVBFX18gaW50bWF4X3Q7Cit0eXBlZGVmIF9fVUlOVE1BWF9UWVBFX18gdWludG1heF90OworCisjaWYgKCFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IF9fY3BsdXNwbHVzID49IDIwMTEwM0wgXAorICAgICB8fCBkZWZpbmVkIF9fU1REQ19MSU1JVF9NQUNST1MpCisKKy8qIDcuMTguMiBMaW1pdHMgb2Ygc3BlY2lmaWVkLXdpZHRoIGludGVnZXIgdHlwZXMgKi8KKworI2lmZGVmIF9fSU5UOF9NQVhfXworIyB1bmRlZiBJTlQ4X01BWAorIyBkZWZpbmUgSU5UOF9NQVggX19JTlQ4X01BWF9fCisjIHVuZGVmIElOVDhfTUlOCisjIGRlZmluZSBJTlQ4X01JTiAoLUlOVDhfTUFYIC0gMSkKKyNlbmRpZgorI2lmZGVmIF9fVUlOVDhfTUFYX18KKyMgdW5kZWYgVUlOVDhfTUFYCisjIGRlZmluZSBVSU5UOF9NQVggX19VSU5UOF9NQVhfXworI2VuZGlmCisjaWZkZWYgX19JTlQxNl9NQVhfXworIyB1bmRlZiBJTlQxNl9NQVgKKyMgZGVmaW5lIElOVDE2X01BWCBfX0lOVDE2X01BWF9fCisjIHVuZGVmIElOVDE2X01JTgorIyBkZWZpbmUgSU5UMTZfTUlOICgtSU5UMTZfTUFYIC0gMSkKKyNlbmRpZgorI2lmZGVmIF9fVUlOVDE2X01BWF9fCisjIHVuZGVmIFVJTlQxNl9NQVgKKyMgZGVmaW5lIFVJTlQxNl9NQVggX19VSU5UMTZfTUFYX18KKyNlbmRpZgorI2lmZGVmIF9fSU5UMzJfTUFYX18KKyMgdW5kZWYgSU5UMzJfTUFYCisjIGRlZmluZSBJTlQzMl9NQVggX19JTlQzMl9NQVhfXworIyB1bmRlZiBJTlQzMl9NSU4KKyMgZGVmaW5lIElOVDMyX01JTiAoLUlOVDMyX01BWCAtIDEpCisjZW5kaWYKKyNpZmRlZiBfX1VJTlQzMl9NQVhfXworIyB1bmRlZiBVSU5UMzJfTUFYCisjIGRlZmluZSBVSU5UMzJfTUFYIF9fVUlOVDMyX01BWF9fCisjZW5kaWYKKyNpZmRlZiBfX0lOVDY0X01BWF9fCisjIHVuZGVmIElOVDY0X01BWAorIyBkZWZpbmUgSU5UNjRfTUFYIF9fSU5UNjRfTUFYX18KKyMgdW5kZWYgSU5UNjRfTUlOCisjIGRlZmluZSBJTlQ2NF9NSU4gKC1JTlQ2NF9NQVggLSAxKQorI2VuZGlmCisjaWZkZWYgX19VSU5UNjRfTUFYX18KKyMgdW5kZWYgVUlOVDY0X01BWAorIyBkZWZpbmUgVUlOVDY0X01BWCBfX1VJTlQ2NF9NQVhfXworI2VuZGlmCisKKyN1bmRlZiBJTlRfTEVBU1Q4X01BWAorI2RlZmluZSBJTlRfTEVBU1Q4X01BWCBfX0lOVF9MRUFTVDhfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1Q4X01JTgorI2RlZmluZSBJTlRfTEVBU1Q4X01JTiAoLUlOVF9MRUFTVDhfTUFYIC0gMSkKKyN1bmRlZiBVSU5UX0xFQVNUOF9NQVgKKyNkZWZpbmUgVUlOVF9MRUFTVDhfTUFYIF9fVUlOVF9MRUFTVDhfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1QxNl9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUMTZfTUFYIF9fSU5UX0xFQVNUMTZfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1QxNl9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUMTZfTUlOICgtSU5UX0xFQVNUMTZfTUFYIC0gMSkKKyN1bmRlZiBVSU5UX0xFQVNUMTZfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1QxNl9NQVggX19VSU5UX0xFQVNUMTZfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1QzMl9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUMzJfTUFYIF9fSU5UX0xFQVNUMzJfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1QzMl9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUMzJfTUlOICgtSU5UX0xFQVNUMzJfTUFYIC0gMSkKKyN1bmRlZiBVSU5UX0xFQVNUMzJfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1QzMl9NQVggX19VSU5UX0xFQVNUMzJfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1Q2NF9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUNjRfTUFYIF9fSU5UX0xFQVNUNjRfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1Q2NF9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUNjRfTUlOICgtSU5UX0xFQVNUNjRfTUFYIC0gMSkKKyN1bmRlZiBVSU5UX0xFQVNUNjRfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1Q2NF9NQVggX19VSU5UX0xFQVNUNjRfTUFYX18KKworI3VuZGVmIElOVF9GQVNUOF9NQVgKKyNkZWZpbmUgSU5UX0ZBU1Q4X01BWCBfX0lOVF9GQVNUOF9NQVhfXworI3VuZGVmIElOVF9GQVNUOF9NSU4KKyNkZWZpbmUgSU5UX0ZBU1Q4X01JTiAoLUlOVF9GQVNUOF9NQVggLSAxKQorI3VuZGVmIFVJTlRfRkFTVDhfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDhfTUFYIF9fVUlOVF9GQVNUOF9NQVhfXworI3VuZGVmIElOVF9GQVNUMTZfTUFYCisjZGVmaW5lIElOVF9GQVNUMTZfTUFYIF9fSU5UX0ZBU1QxNl9NQVhfXworI3VuZGVmIElOVF9GQVNUMTZfTUlOCisjZGVmaW5lIElOVF9GQVNUMTZfTUlOICgtSU5UX0ZBU1QxNl9NQVggLSAxKQorI3VuZGVmIFVJTlRfRkFTVDE2X01BWAorI2RlZmluZSBVSU5UX0ZBU1QxNl9NQVggX19VSU5UX0ZBU1QxNl9NQVhfXworI3VuZGVmIElOVF9GQVNUMzJfTUFYCisjZGVmaW5lIElOVF9GQVNUMzJfTUFYIF9fSU5UX0ZBU1QzMl9NQVhfXworI3VuZGVmIElOVF9GQVNUMzJfTUlOCisjZGVmaW5lIElOVF9GQVNUMzJfTUlOICgtSU5UX0ZBU1QzMl9NQVggLSAxKQorI3VuZGVmIFVJTlRfRkFTVDMyX01BWAorI2RlZmluZSBVSU5UX0ZBU1QzMl9NQVggX19VSU5UX0ZBU1QzMl9NQVhfXworI3VuZGVmIElOVF9GQVNUNjRfTUFYCisjZGVmaW5lIElOVF9GQVNUNjRfTUFYIF9fSU5UX0ZBU1Q2NF9NQVhfXworI3VuZGVmIElOVF9GQVNUNjRfTUlOCisjZGVmaW5lIElOVF9GQVNUNjRfTUlOICgtSU5UX0ZBU1Q2NF9NQVggLSAxKQorI3VuZGVmIFVJTlRfRkFTVDY0X01BWAorI2RlZmluZSBVSU5UX0ZBU1Q2NF9NQVggX19VSU5UX0ZBU1Q2NF9NQVhfXworCisjaWZkZWYgX19JTlRQVFJfTUFYX18KKyMgdW5kZWYgSU5UUFRSX01BWAorIyBkZWZpbmUgSU5UUFRSX01BWCBfX0lOVFBUUl9NQVhfXworIyB1bmRlZiBJTlRQVFJfTUlOCisjIGRlZmluZSBJTlRQVFJfTUlOICgtSU5UUFRSX01BWCAtIDEpCisjZW5kaWYKKyNpZmRlZiBfX1VJTlRQVFJfTUFYX18KKyMgdW5kZWYgVUlOVFBUUl9NQVgKKyMgZGVmaW5lIFVJTlRQVFJfTUFYIF9fVUlOVFBUUl9NQVhfXworI2VuZGlmCisKKyN1bmRlZiBJTlRNQVhfTUFYCisjZGVmaW5lIElOVE1BWF9NQVggX19JTlRNQVhfTUFYX18KKyN1bmRlZiBJTlRNQVhfTUlOCisjZGVmaW5lIElOVE1BWF9NSU4gKC1JTlRNQVhfTUFYIC0gMSkKKyN1bmRlZiBVSU5UTUFYX01BWAorI2RlZmluZSBVSU5UTUFYX01BWCBfX1VJTlRNQVhfTUFYX18KKworLyogNy4xOC4zIExpbWl0cyBvZiBvdGhlciBpbnRlZ2VyIHR5cGVzICovCisKKyN1bmRlZiBQVFJESUZGX01BWAorI2RlZmluZSBQVFJESUZGX01BWCBfX1BUUkRJRkZfTUFYX18KKyN1bmRlZiBQVFJESUZGX01JTgorI2RlZmluZSBQVFJESUZGX01JTiAoLVBUUkRJRkZfTUFYIC0gMSkKKworI3VuZGVmIFNJR19BVE9NSUNfTUFYCisjZGVmaW5lIFNJR19BVE9NSUNfTUFYIF9fU0lHX0FUT01JQ19NQVhfXworI3VuZGVmIFNJR19BVE9NSUNfTUlOCisjZGVmaW5lIFNJR19BVE9NSUNfTUlOIF9fU0lHX0FUT01JQ19NSU5fXworCisjdW5kZWYgU0laRV9NQVgKKyNkZWZpbmUgU0laRV9NQVggX19TSVpFX01BWF9fCisKKyN1bmRlZiBXQ0hBUl9NQVgKKyNkZWZpbmUgV0NIQVJfTUFYIF9fV0NIQVJfTUFYX18KKyN1bmRlZiBXQ0hBUl9NSU4KKyNkZWZpbmUgV0NIQVJfTUlOIF9fV0NIQVJfTUlOX18KKworI3VuZGVmIFdJTlRfTUFYCisjZGVmaW5lIFdJTlRfTUFYIF9fV0lOVF9NQVhfXworI3VuZGVmIFdJTlRfTUlOCisjZGVmaW5lIFdJTlRfTUlOIF9fV0lOVF9NSU5fXworCisjZW5kaWYgLyogKCFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkgICB8fCBkZWZpbmVkIF9fU1REQ19MSU1JVF9NQUNST1MpICAqLworCisjaWYgKCFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IF9fY3BsdXNwbHVzID49IDIwMTEwM0wgXAorICAgICB8fCBkZWZpbmVkIF9fU1REQ19DT05TVEFOVF9NQUNST1MpCisKKyN1bmRlZiBJTlQ4X0MKKyNkZWZpbmUgSU5UOF9DKGMpIF9fSU5UOF9DKGMpCisjdW5kZWYgSU5UMTZfQworI2RlZmluZSBJTlQxNl9DKGMpIF9fSU5UMTZfQyhjKQorI3VuZGVmIElOVDMyX0MKKyNkZWZpbmUgSU5UMzJfQyhjKSBfX0lOVDMyX0MoYykKKyN1bmRlZiBJTlQ2NF9DCisjZGVmaW5lIElOVDY0X0MoYykgX19JTlQ2NF9DKGMpCisjdW5kZWYgVUlOVDhfQworI2RlZmluZSBVSU5UOF9DKGMpIF9fVUlOVDhfQyhjKQorI3VuZGVmIFVJTlQxNl9DCisjZGVmaW5lIFVJTlQxNl9DKGMpIF9fVUlOVDE2X0MoYykKKyN1bmRlZiBVSU5UMzJfQworI2RlZmluZSBVSU5UMzJfQyhjKSBfX1VJTlQzMl9DKGMpCisjdW5kZWYgVUlOVDY0X0MKKyNkZWZpbmUgVUlOVDY0X0MoYykgX19VSU5UNjRfQyhjKQorI3VuZGVmIElOVE1BWF9DCisjZGVmaW5lIElOVE1BWF9DKGMpIF9fSU5UTUFYX0MoYykKKyN1bmRlZiBVSU5UTUFYX0MKKyNkZWZpbmUgVUlOVE1BWF9DKGMpIF9fVUlOVE1BWF9DKGMpCisKKyNlbmRpZiAvKiAoIWRlZmluZWQgX19jcGx1c3BsdXMgfHwgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCSAgIHx8IGRlZmluZWQgX19TVERDX0NPTlNUQU5UX01BQ1JPUykgKi8KKworI2VuZGlmIC8qIF9HQ0NfU1RESU5UX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGludC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiNmY3MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGludC5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX0dDQ19XUkFQX1NURElOVF9ICisjaWYgX19TVERDX0hPU1RFRF9fCisjIGlmIGRlZmluZWQgX19jcGx1c3BsdXMgJiYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyAgdW5kZWYgX19TVERDX0xJTUlUX01BQ1JPUworIyAgZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyMgIHVuZGVmIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgIGRlZmluZSBfX1NURENfQ09OU1RBTlRfTUFDUk9TCisjIGVuZGlmCisjIGluY2x1ZGVfbmV4dCA8c3RkaW50Lmg+CisjZWxzZQorIyBpbmNsdWRlICJzdGRpbnQtZ2NjLmgiCisjZW5kaWYKKyNkZWZpbmUgX0dDQ19XUkFQX1NURElOVF9ICisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZG5vcmV0dXJuLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRub3JldHVybi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNGJlYzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRub3JldHVybi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBJU08gQzFYOiA3LjIzIF9Ob3JldHVybiA8c3Rkbm9yZXR1cm4uaD4uICAqLworCisjaWZuZGVmIF9TVEROT1JFVFVSTl9ICisjZGVmaW5lIF9TVEROT1JFVFVSTl9ICisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKworI2RlZmluZSBub3JldHVybiBfTm9yZXR1cm4KKworI2VuZGlmCisKKyNlbmRpZgkvKiBzdGRub3JldHVybi5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS90Ym1pbnRyaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3RibWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzRmNzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS90Ym1pbnRyaW4uaApAQCAtMCwwICsxLDE3MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX1g4NklOVFJJTl9IX0lOQ0xVREVECisjIGVycm9yICJOZXZlciB1c2UgPHRibWludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19UQk1fXworIyBlcnJvciAiVEJNIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbmRpZiAvKiBfX1RCTV9fICovCisKKyNpZm5kZWYgX1RCTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9UQk1JTlRSSU5fSF9JTkNMVURFRAorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19iZXh0cmlfdTMyICh1bnNpZ25lZCBpbnQgX19YLCBjb25zdCB1bnNpZ25lZCBpbnQgX19JKQoreworCXJldHVybiBfX2J1aWx0aW5faWEzMl9iZXh0cmlfdTMyIChfX1gsIF9fSSk7Cit9CisjZWxzZQorI2RlZmluZSBfX2JleHRyaV91MzIoWCwgSSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKHVuc2lnbmVkIGludClfX2J1aWx0aW5faWEzMl9iZXh0cmlfdTMyICgodW5zaWduZWQgaW50KShYKSwgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKEkpKSkKKyNlbmRpZiAvKl9fT1BUSU1JWkVfXyAqLworCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibGNmaWxsX3UzMiAodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fWCAmIChfX1ggKyAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjaV91MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX1ggfCB+KF9fWCArIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibGNpY191MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiB+X19YICYgKF9fWCArIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibGNtc2tfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19YIF4gKF9fWCArIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibGNzX3UzMiAodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fWCB8IChfX1ggKyAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxzZmlsbF91MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX1ggfCAoX19YIC0gMSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2Jsc2ljX3UzMiAodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIH5fX1ggfCAoX19YIC0gMSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3QxbXNrY191MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiB+X19YIHwgKF9fWCArIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX190em1za191MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiB+X19YICYgKF9fWCAtIDEpOworfQorCisKKworI2lmZGVmIF9feDg2XzY0X18KKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2JleHRyaV91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gsIGNvbnN0IHVuc2lnbmVkIGludCBfX0kpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9iZXh0cmlfdTY0IChfX1gsIF9fSSk7Cit9CisjZWxzZQorI2RlZmluZSBfX2JleHRyaV91NjQoWCwgSSkJCQkJCQkgICBcCisgICgodW5zaWduZWQgbG9uZyBsb25nKV9fYnVpbHRpbl9pYTMyX2JleHRyaV91NjQgKCh1bnNpZ25lZCBsb25nIGxvbmcpKFgpLCBcCisJCQkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpKEkpKSkKKyNlbmRpZiAvKl9fT1BUSU1JWkVfXyAqLworCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibGNmaWxsX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fWCAmIChfX1ggKyAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjaV91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX1ggfCB+KF9fWCArIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibGNpY191NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiB+X19YICYgKF9fWCArIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibGNtc2tfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICByZXR1cm4gX19YIF4gKF9fWCArIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibGNzX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fWCB8IChfX1ggKyAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxzZmlsbF91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX1ggfCAoX19YIC0gMSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2Jsc2ljX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIH5fX1ggfCAoX19YIC0gMSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3QxbXNrY191NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiB+X19YIHwgKF9fWCArIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX190em1za191NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiB+X19YICYgKF9fWCAtIDEpOworfQorCisKKyNlbmRpZiAvKiBfX3g4Nl82NF9fICAqLworI2VuZGlmIC8qIF9UQk1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvdG1taW50cmluLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS90bW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjdiMTk5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvdG1taW50cmluLmgKQEAgLTAsMCArMSwyNDQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBJbXBsZW1lbnRlZCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVkIGluIHRoZSBJbnRlbCBDKysgQ29tcGlsZXIKKyAgIFVzZXIgR3VpZGUgYW5kIFJlZmVyZW5jZSwgdmVyc2lvbiA5LjEuICAqLworCisjaWZuZGVmIF9UTU1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfVE1NSU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX1NTU0UzX18KKyMgZXJyb3IgIlNTU0UzIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbHNlCisKKy8qIFdlIG5lZWQgZGVmaW5pdGlvbnMgZnJvbSB0aGUgU1NFMywgU1NFMiBhbmQgU1NFIGhlYWRlciBmaWxlcyovCisjaW5jbHVkZSA8cG1taW50cmluLmg+CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRfZXBpMTYgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9waGFkZHcxMjggKChfX3Y4aGkpX19YLCAoX192OGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRfZXBpMzIgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9waGFkZGQxMjggKChfX3Y0c2kpX19YLCAoX192NHNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRzX2VwaTE2IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGhhZGRzdzEyOCAoKF9fdjhoaSlfX1gsIChfX3Y4aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRfcGkxNiAoX19tNjQgX19YLCBfX202NCBfX1kpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BoYWRkdyAoKF9fdjRoaSlfX1gsIChfX3Y0aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRfcGkzMiAoX19tNjQgX19YLCBfX202NCBfX1kpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BoYWRkZCAoKF9fdjJzaSlfX1gsIChfX3Yyc2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRzX3BpMTYgKF9fbTY0IF9fWCwgX19tNjQgX19ZKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9waGFkZHN3ICgoX192NGhpKV9fWCwgKF9fdjRoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oc3ViX2VwaTE2IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGhzdWJ3MTI4ICgoX192OGhpKV9fWCwgKF9fdjhoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oc3ViX2VwaTMyIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGhzdWJkMTI4ICgoX192NHNpKV9fWCwgKF9fdjRzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oc3Vic19lcGkxNiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Boc3Vic3cxMjggKChfX3Y4aGkpX19YLCAoX192OGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oc3ViX3BpMTYgKF9fbTY0IF9fWCwgX19tNjQgX19ZKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9waHN1YncgKChfX3Y0aGkpX19YLCAoX192NGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oc3ViX3BpMzIgKF9fbTY0IF9fWCwgX19tNjQgX19ZKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9waHN1YmQgKChfX3Yyc2kpX19YLCAoX192MnNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oc3Vic19waTE2IChfX202NCBfX1gsIF9fbTY0IF9fWSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGhzdWJzdyAoKF9fdjRoaSlfX1gsIChfX3Y0aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFkZHVic19lcGkxNiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtYWRkdWJzdzEyOCAoKF9fdjE2cWkpX19YLCAoX192MTZxaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFkZHVic19waTE2IChfX202NCBfX1gsIF9fbTY0IF9fWSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcG1hZGR1YnN3ICgoX192OHFpKV9fWCwgKF9fdjhxaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxocnNfZXBpMTYgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbXVsaHJzdzEyOCAoKF9fdjhoaSlfX1gsIChfX3Y4aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bGhyc19waTE2IChfX202NCBfX1gsIF9fbTY0IF9fWSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcG11bGhyc3cgKChfX3Y0aGkpX19YLCAoX192NGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NodWZmbGVfZXBpOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzaHVmYjEyOCAoKF9fdjE2cWkpX19YLCAoX192MTZxaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2h1ZmZsZV9waTggKF9fbTY0IF9fWCwgX19tNjQgX19ZKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2h1ZmIgKChfX3Y4cWkpX19YLCAoX192OHFpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NpZ25fZXBpOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzaWduYjEyOCAoKF9fdjE2cWkpX19YLCAoX192MTZxaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaWduX2VwaTE2IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNpZ253MTI4ICgoX192OGhpKV9fWCwgKF9fdjhoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaWduX2VwaTMyIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNpZ25kMTI4ICgoX192NHNpKV9fWCwgKF9fdjRzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2lnbl9waTggKF9fbTY0IF9fWCwgX19tNjQgX19ZKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2lnbmIgKChfX3Y4cWkpX19YLCAoX192OHFpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaWduX3BpMTYgKF9fbTY0IF9fWCwgX19tNjQgX19ZKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2lnbncgKChfX3Y0aGkpX19YLCAoX192NGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaWduX3BpMzIgKF9fbTY0IF9fWCwgX19tNjQgX19ZKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2lnbmQgKChfX3Yyc2kpX19YLCAoX192MnNpKV9fWSk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FsaWducl9lcGk4KF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWxpZ25yMTI4ICgoX192MmRpKV9fWCwKKwkJCQkJICAgICAgKF9fdjJkaSlfX1ksIF9fTiAqIDgpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWxpZ25yX3BpOChfX202NCBfX1gsIF9fbTY0IF9fWSwgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFsaWduciAoKF9fdjFkaSlfX1gsCisJCQkJCSAoX192MWRpKV9fWSwgX19OICogOCk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fYWxpZ25yX2VwaTgoWCwgWSwgTikJCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWxpZ25yMTI4ICgoX192MmRpKShfX20xMjhpKShYKSwJCVwKKwkJCQkJKF9fdjJkaSkoX19tMTI4aSkoWSksCQlcCisJCQkJCShpbnQpKE4pICogOCkpCisjZGVmaW5lIF9tbV9hbGlnbnJfcGk4KFgsIFksIE4pCQkJCQkJXAorICAoKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWxpZ25yICgoX192MWRpKShfX202NCkoWCksCQkJXAorCQkJCSAgIChfX3YxZGkpKF9fbTY0KShZKSwJCQlcCisJCQkJICAgKGludCkoTikgKiA4KSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hYnNfZXBpOCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFic2IxMjggKChfX3YxNnFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Fic19lcGkxNiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFic3cxMjggKChfX3Y4aGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWJzX2VwaTMyIChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWJzZDEyOCAoKF9fdjRzaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWJzX3BpOCAoX19tNjQgX19YKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWJzYiAoKF9fdjhxaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWJzX3BpMTYgKF9fbTY0IF9fWCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFic3cgKChfX3Y0aGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Fic19waTMyIChfX202NCBfX1gpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhYnNkICgoX192MnNpKV9fWCk7Cit9CisKKyNlbmRpZiAvKiBfX1NTU0UzX18gKi8KKworI2VuZGlmIC8qIF9UTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvdW53aW5kLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS91bndpbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGQ3OGI5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvdW53aW5kLmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qIEV4Y2VwdGlvbiBoYW5kbGluZyBhbmQgZnJhbWUgdW53aW5kIHJ1bnRpbWUgaW50ZXJmYWNlIHJvdXRpbmVzLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIFRoaXMgaXMgZGVyaXZlZCBmcm9tIHRoZSBDKysgQUJJIGZvciBJQS02NC4gIFdoZXJlIHdlIGRpdmVyZ2UKKyAgIGZvciBjcm9zcy1hcmNoaXRlY3R1cmUgY29tcGF0aWJpbGl0eSBhcmUgbm90ZWQgd2l0aCAiQEBAIi4gICovCisKKyNpZm5kZWYgX1VOV0lORF9ICisjZGVmaW5lIF9VTldJTkRfSAorCisjaWYgZGVmaW5lZCAoX19TRUhfXykgJiYgIWRlZmluZWQgKF9fVVNJTkdfU0pMSl9FWENFUFRJT05TX18pCisvKiBPbmx5IGZvciBfR0NDX3NwZWNpZmljX2hhbmRsZXIuICAqLworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIEhJREVfRVhQT1JUUworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGRlZmF1bHQpCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBMZXZlbCAxOiBCYXNlIEFCSSAgKi8KKworLyogQEBAIFRoZSBJQS02NCBBQkkgdXNlcyB1aW50NjQgdGhyb3VnaG91dC4gIE1vc3QgcGxhY2VzIHRoaXMgaXMKKyAgIGluZWZmaWNpZW50IGZvciAzMi1iaXQgYW5kIHNtYWxsZXIgbWFjaGluZXMuICAqLwordHlwZWRlZiB1bnNpZ25lZCBfVW53aW5kX1dvcmQgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX191bndpbmRfd29yZF9fKSkpOwordHlwZWRlZiBzaWduZWQgX1Vud2luZF9Td29yZCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX3Vud2luZF93b3JkX18pKSk7CisjaWYgZGVmaW5lZChfX2lhNjRfXykgJiYgZGVmaW5lZChfX2hwdXhfXykKK3R5cGVkZWYgdW5zaWduZWQgX1Vud2luZF9QdHIgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX193b3JkX18pKSk7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBfVW53aW5kX1B0ciBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX3BvaW50ZXJfXykpKTsKKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBfVW53aW5kX0ludGVybmFsX1B0ciBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX3BvaW50ZXJfXykpKTsKKworLyogQEBAIFRoZSBJQS02NCBBQkkgdXNlcyBhIDY0LWJpdCB3b3JkIHRvIGlkZW50aWZ5IHRoZSBwcm9kdWNlciBhbmQKKyAgIGNvbnN1bWVyIG9mIGFuIGV4Y2VwdGlvbi4gIFdlJ2xsIGdvIGFsb25nIHdpdGggdGhpcyBmb3Igbm93IGV2ZW4gb24KKyAgIDMyLWJpdCBtYWNoaW5lcy4gIFdlJ2xsIG5lZWQgdG8gcHJvdmlkZSBzb21lIG90aGVyIG9wdGlvbiBmb3IKKyAgIDE2LWJpdCBtYWNoaW5lcyBhbmQgZm9yIG1hY2hpbmVzIHdpdGggPiA4IGJpdHMgcGVyIGJ5dGUuICAqLwordHlwZWRlZiB1bnNpZ25lZCBfVW53aW5kX0V4Y2VwdGlvbl9DbGFzcyBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0RJX18pKSk7CisKKy8qIFRoZSB1bndpbmQgaW50ZXJmYWNlIHVzZXMgcmVhc29uIGNvZGVzIGluIHNldmVyYWwgY29udGV4dHMgdG8KKyAgIGlkZW50aWZ5IHRoZSByZWFzb25zIGZvciBmYWlsdXJlcyBvciBvdGhlciBhY3Rpb25zLiAgKi8KK3R5cGVkZWYgZW51bQoreworICBfVVJDX05PX1JFQVNPTiA9IDAsCisgIF9VUkNfRk9SRUlHTl9FWENFUFRJT05fQ0FVR0hUID0gMSwKKyAgX1VSQ19GQVRBTF9QSEFTRTJfRVJST1IgPSAyLAorICBfVVJDX0ZBVEFMX1BIQVNFMV9FUlJPUiA9IDMsCisgIF9VUkNfTk9STUFMX1NUT1AgPSA0LAorICBfVVJDX0VORF9PRl9TVEFDSyA9IDUsCisgIF9VUkNfSEFORExFUl9GT1VORCA9IDYsCisgIF9VUkNfSU5TVEFMTF9DT05URVhUID0gNywKKyAgX1VSQ19DT05USU5VRV9VTldJTkQgPSA4Cit9IF9VbndpbmRfUmVhc29uX0NvZGU7CisKKworLyogVGhlIHVud2luZCBpbnRlcmZhY2UgdXNlcyBhIHBvaW50ZXIgdG8gYW4gZXhjZXB0aW9uIGhlYWRlciBvYmplY3QKKyAgIGFzIGl0cyByZXByZXNlbnRhdGlvbiBvZiBhbiBleGNlcHRpb24gYmVpbmcgdGhyb3duLiBJbiBnZW5lcmFsLCB0aGUKKyAgIGZ1bGwgcmVwcmVzZW50YXRpb24gb2YgYW4gZXhjZXB0aW9uIG9iamVjdCBpcyBsYW5ndWFnZS0gYW5kCisgICBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYywgYnV0IGl0IHdpbGwgYmUgcHJlZml4ZWQgYnkgYSBoZWFkZXIKKyAgIHVuZGVyc3Rvb2QgYnkgdGhlIHVud2luZCBpbnRlcmZhY2UuICAqLworCitzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb247CisKK3R5cGVkZWYgdm9pZCAoKl9VbndpbmRfRXhjZXB0aW9uX0NsZWFudXBfRm4pIChfVW53aW5kX1JlYXNvbl9Db2RlLAorCQkJCQkgICAgICBzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKik7CisKK3N0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbgoreworICBfVW53aW5kX0V4Y2VwdGlvbl9DbGFzcyBleGNlcHRpb25fY2xhc3M7CisgIF9VbndpbmRfRXhjZXB0aW9uX0NsZWFudXBfRm4gZXhjZXB0aW9uX2NsZWFudXA7CisKKyNpZiAhZGVmaW5lZCAoX19VU0lOR19TSkxKX0VYQ0VQVElPTlNfXykgJiYgZGVmaW5lZCAoX19TRUhfXykKKyAgX1Vud2luZF9Xb3JkIHByaXZhdGVfWzZdOworI2Vsc2UKKyAgX1Vud2luZF9Xb3JkIHByaXZhdGVfMTsKKyAgX1Vud2luZF9Xb3JkIHByaXZhdGVfMjsKKyNlbmRpZgorCisgIC8qIEBAQCBUaGUgSUEtNjQgQUJJIHNheXMgdGhhdCB0aGlzIHN0cnVjdHVyZSBtdXN0IGJlIGRvdWJsZS13b3JkIGFsaWduZWQuCisgICAgIFRha2luZyB0aGF0IGxpdGVyYWxseSBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgZ2VuZXJpY2FsbHkuICBJbnN0ZWFkIHdlCisgICAgIHByb3ZpZGUgdGhlIG1heGltdW0gYWxpZ25tZW50IHJlcXVpcmVkIGJ5IGFueSB0eXBlIGZvciB0aGUgbWFjaGluZS4gICovCit9IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKSk7CisKKworLyogVGhlIEFDVElPTlMgYXJndW1lbnQgdG8gdGhlIHBlcnNvbmFsaXR5IHJvdXRpbmUgaXMgYSBiaXR3aXNlIE9SIG9mIG9uZQorICAgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50cy4gICovCit0eXBlZGVmIGludCBfVW53aW5kX0FjdGlvbjsKKworI2RlZmluZSBfVUFfU0VBUkNIX1BIQVNFCTEKKyNkZWZpbmUgX1VBX0NMRUFOVVBfUEhBU0UJMgorI2RlZmluZSBfVUFfSEFORExFUl9GUkFNRQk0CisjZGVmaW5lIF9VQV9GT1JDRV9VTldJTkQJOAorI2RlZmluZSBfVUFfRU5EX09GX1NUQUNLCTE2CisKKy8qIFRoZSB0YXJnZXQgY2FuIG92ZXJyaWRlIHRoaXMgbWFjcm8gdG8gZGVmaW5lIGFueSBiYWNrLWVuZC1zcGVjaWZpYworICAgYXR0cmlidXRlcyByZXF1aXJlZCBmb3IgdGhlIGxvd2VzdC1sZXZlbCBzdGFjayBmcmFtZS4gICovCisjaWZuZGVmIExJQkdDQzJfVU5XSU5EX0FUVFJJQlVURQorI2RlZmluZSBMSUJHQ0MyX1VOV0lORF9BVFRSSUJVVEUKKyNlbmRpZgorCisvKiBUaGlzIGlzIGFuIG9wYXF1ZSB0eXBlIHVzZWQgdG8gcmVmZXIgdG8gYSBzeXN0ZW0tc3BlY2lmaWMgZGF0YQorICAgc3RydWN0dXJlIHVzZWQgYnkgdGhlIHN5c3RlbSB1bndpbmRlci4gVGhpcyBjb250ZXh0IGlzIGNyZWF0ZWQgYW5kCisgICBkZXN0cm95ZWQgYnkgdGhlIHN5c3RlbSwgYW5kIHBhc3NlZCB0byB0aGUgcGVyc29uYWxpdHkgcm91dGluZQorICAgZHVyaW5nIHVud2luZGluZy4gICovCitzdHJ1Y3QgX1Vud2luZF9Db250ZXh0OworCisvKiBSYWlzZSBhbiBleGNlcHRpb24sIHBhc3NpbmcgYWxvbmcgdGhlIGdpdmVuIGV4Y2VwdGlvbiBvYmplY3QuICAqLworZXh0ZXJuIF9VbndpbmRfUmVhc29uX0NvZGUgTElCR0NDMl9VTldJTkRfQVRUUklCVVRFCitfVW53aW5kX1JhaXNlRXhjZXB0aW9uIChzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKik7CisKKy8qIFJhaXNlIGFuIGV4Y2VwdGlvbiBmb3IgZm9yY2VkIHVud2luZGluZy4gICovCisKK3R5cGVkZWYgX1Vud2luZF9SZWFzb25fQ29kZSAoKl9VbndpbmRfU3RvcF9GbikKKyAgICAgKGludCwgX1Vud2luZF9BY3Rpb24sIF9VbndpbmRfRXhjZXB0aW9uX0NsYXNzLAorICAgICAgc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICosIHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKiwgdm9pZCAqKTsKKworZXh0ZXJuIF9VbndpbmRfUmVhc29uX0NvZGUgTElCR0NDMl9VTldJTkRfQVRUUklCVVRFCitfVW53aW5kX0ZvcmNlZFVud2luZCAoc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICosIF9VbndpbmRfU3RvcF9Gbiwgdm9pZCAqKTsKKworLyogSGVscGVyIHRvIGludm9rZSB0aGUgZXhjZXB0aW9uX2NsZWFudXAgcm91dGluZS4gICovCitleHRlcm4gdm9pZCBfVW53aW5kX0RlbGV0ZUV4Y2VwdGlvbiAoc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICopOworCisvKiBSZXN1bWUgcHJvcGFnYXRpb24gb2YgYW4gZXhpc3RpbmcgZXhjZXB0aW9uLiAgVGhpcyBpcyB1c2VkIGFmdGVyCisgICBlLmcuIGV4ZWN1dGluZyBjbGVhbnVwIGNvZGUsIGFuZCBub3QgdG8gaW1wbGVtZW50IHJldGhyb3dpbmcuICAqLworZXh0ZXJuIHZvaWQgTElCR0NDMl9VTldJTkRfQVRUUklCVVRFCitfVW53aW5kX1Jlc3VtZSAoc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICopOworCisvKiBAQEAgUmVzdW1lIHByb3BhZ2F0aW9uIG9mIGEgRk9SQ0VfVU5XSU5EIGV4Y2VwdGlvbiwgb3IgdG8gcmV0aHJvdworICAgYSBub3JtYWwgZXhjZXB0aW9uIHRoYXQgd2FzIGhhbmRsZWQuICAqLworZXh0ZXJuIF9VbndpbmRfUmVhc29uX0NvZGUgTElCR0NDMl9VTldJTkRfQVRUUklCVVRFCitfVW53aW5kX1Jlc3VtZV9vcl9SZXRocm93IChzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKik7CisKKy8qIEBAQCBVc2UgdW53aW5kIGRhdGEgdG8gcGVyZm9ybSBhIHN0YWNrIGJhY2t0cmFjZS4gIFRoZSB0cmFjZSBjYWxsYmFjaworICAgaXMgY2FsbGVkIGZvciBldmVyeSBzdGFjayBmcmFtZSBpbiB0aGUgY2FsbCBjaGFpbiwgYnV0IG5vIGNsZWFudXAKKyAgIGFjdGlvbnMgYXJlIHBlcmZvcm1lZC4gICovCit0eXBlZGVmIF9VbndpbmRfUmVhc29uX0NvZGUgKCpfVW53aW5kX1RyYWNlX0ZuKQorICAgICAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqLCB2b2lkICopOworCitleHRlcm4gX1Vud2luZF9SZWFzb25fQ29kZSBMSUJHQ0MyX1VOV0lORF9BVFRSSUJVVEUKK19VbndpbmRfQmFja3RyYWNlIChfVW53aW5kX1RyYWNlX0ZuLCB2b2lkICopOworCisvKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIGNvbW11bmljYXRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVud2luZAorICAgY29udGV4dCAoaS5lLiB0aGUgdW53aW5kIGRlc2NyaXB0b3JzIGFuZCB0aGUgdXNlciByZWdpc3RlciBzdGF0ZSkgYmV0d2VlbgorICAgdGhlIHVud2luZCBsaWJyYXJ5IGFuZCB0aGUgcGVyc29uYWxpdHkgcm91dGluZSBhbmQgbGFuZGluZyBwYWQuICBPbmx5CisgICBzZWxlY3RlZCByZWdpc3RlcnMgbWF5IGJlIG1hbmlwdWxhdGVkLiAgKi8KKworZXh0ZXJuIF9VbndpbmRfV29yZCBfVW53aW5kX0dldEdSIChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICosIGludCk7CitleHRlcm4gdm9pZCBfVW53aW5kX1NldEdSIChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICosIGludCwgX1Vud2luZF9Xb3JkKTsKKworZXh0ZXJuIF9VbndpbmRfUHRyIF9VbndpbmRfR2V0SVAgKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKik7CitleHRlcm4gX1Vud2luZF9QdHIgX1Vud2luZF9HZXRJUEluZm8gKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKiwgaW50ICopOworZXh0ZXJuIHZvaWQgX1Vud2luZF9TZXRJUCAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqLCBfVW53aW5kX1B0cik7CisKKy8qIEBAQCBSZXRyaWV2ZSB0aGUgQ0ZBIG9mIHRoZSBnaXZlbiBjb250ZXh0LiAgKi8KK2V4dGVybiBfVW53aW5kX1dvcmQgX1Vud2luZF9HZXRDRkEgKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKik7CisKK2V4dGVybiB2b2lkICpfVW53aW5kX0dldExhbmd1YWdlU3BlY2lmaWNEYXRhIChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICopOworCitleHRlcm4gX1Vud2luZF9QdHIgX1Vud2luZF9HZXRSZWdpb25TdGFydCAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqKTsKKworCisvKiBUaGUgcGVyc29uYWxpdHkgcm91dGluZSBpcyB0aGUgZnVuY3Rpb24gaW4gdGhlIEMrKyAob3Igb3RoZXIgbGFuZ3VhZ2UpCisgICBydW50aW1lIGxpYnJhcnkgd2hpY2ggc2VydmVzIGFzIGFuIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBzeXN0ZW0gdW53aW5kCisgICBsaWJyYXJ5IGFuZCBsYW5ndWFnZS1zcGVjaWZpYyBleGNlcHRpb24gaGFuZGxpbmcgc2VtYW50aWNzLiAgSXQgaXMKKyAgIHNwZWNpZmljIHRvIHRoZSBjb2RlIGZyYWdtZW50IGRlc2NyaWJlZCBieSBhbiB1bndpbmQgaW5mbyBibG9jaywgYW5kCisgICBpdCBpcyBhbHdheXMgcmVmZXJlbmNlZCB2aWEgdGhlIHBvaW50ZXIgaW4gdGhlIHVud2luZCBpbmZvIGJsb2NrLCBhbmQKKyAgIGhlbmNlIGl0IGhhcyBubyBBQkktc3BlY2lmaWVkIG5hbWUuCisKKyAgIE5vdGUgdGhhdCB0aGlzIGltcGxpZXMgdGhhdCB0d28gZGlmZmVyZW50IEMrKyBpbXBsZW1lbnRhdGlvbnMgY2FuCisgICB1c2UgZGlmZmVyZW50IG5hbWVzLCBhbmQgaGF2ZSBkaWZmZXJlbnQgY29udGVudHMgaW4gdGhlIGxhbmd1YWdlCisgICBzcGVjaWZpYyBkYXRhIGFyZWEuICBNb3Jlb3ZlciwgdGhhdCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgZGF0YQorICAgYXJlYSBjb250YWlucyBubyB2ZXJzaW9uIGluZm8gYmVjYXVzZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpbnZva2VkCisgICBwcm92aWRlcyBtb3JlIGVmZmVjdGl2ZSB2ZXJzaW9uaW5nIGJ5IGRldGVjdGluZyBhdCBsaW5rIHRpbWUgdGhlCisgICBsYWNrIG9mIGNvZGUgdG8gaGFuZGxlIHRoZSBkaWZmZXJlbnQgZGF0YSBmb3JtYXQuICAqLworCit0eXBlZGVmIF9VbndpbmRfUmVhc29uX0NvZGUgKCpfVW53aW5kX1BlcnNvbmFsaXR5X0ZuKQorICAgICAoaW50LCBfVW53aW5kX0FjdGlvbiwgX1Vud2luZF9FeGNlcHRpb25fQ2xhc3MsCisgICAgICBzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKiwgc3RydWN0IF9VbndpbmRfQ29udGV4dCAqKTsKKworLyogQEBAIFRoZSBmb2xsb3dpbmcgYWx0ZXJuYXRlIGVudHJ5IHBvaW50cyBhcmUgZm9yIHNldGptcC9sb25nam1wCisgICBiYXNlZCB1bndpbmRpbmcuICAqLworCitzdHJ1Y3QgU2pMal9GdW5jdGlvbl9Db250ZXh0OworZXh0ZXJuIHZvaWQgX1Vud2luZF9TakxqX1JlZ2lzdGVyIChzdHJ1Y3QgU2pMal9GdW5jdGlvbl9Db250ZXh0ICopOworZXh0ZXJuIHZvaWQgX1Vud2luZF9TakxqX1VucmVnaXN0ZXIgKHN0cnVjdCBTakxqX0Z1bmN0aW9uX0NvbnRleHQgKik7CisKK2V4dGVybiBfVW53aW5kX1JlYXNvbl9Db2RlIExJQkdDQzJfVU5XSU5EX0FUVFJJQlVURQorX1Vud2luZF9TakxqX1JhaXNlRXhjZXB0aW9uIChzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKik7CitleHRlcm4gX1Vud2luZF9SZWFzb25fQ29kZSBMSUJHQ0MyX1VOV0lORF9BVFRSSUJVVEUKK19VbndpbmRfU2pMal9Gb3JjZWRVbndpbmQgKHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqLCBfVW53aW5kX1N0b3BfRm4sIHZvaWQgKik7CitleHRlcm4gdm9pZCBMSUJHQ0MyX1VOV0lORF9BVFRSSUJVVEUKK19VbndpbmRfU2pMal9SZXN1bWUgKHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqKTsKK2V4dGVybiBfVW53aW5kX1JlYXNvbl9Db2RlIExJQkdDQzJfVU5XSU5EX0FUVFJJQlVURQorX1Vud2luZF9TakxqX1Jlc3VtZV9vcl9SZXRocm93IChzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKik7CisKKy8qIEBAQCBUaGUgZm9sbG93aW5nIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBiYXNlIGFkZHJlc3NlcyBmb3IgdGV4dAorICAgYW5kIGRhdGEtcmVsYXRpdmUgYWRkcmVzc2luZyBpbiB0aGUgTERTQS4gIEluIG9yZGVyIHRvIHN0YXkgbGluaworICAgY29tcGF0aWJsZSB3aXRoIHRoZSBzdGFuZGFyZCBBQkkgZm9yIElBLTY0LCB3ZSBpbmxpbmUgdGhlc2UuICAqLworCisjaWZkZWYgX19pYTY0X18KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIGlubGluZSBfVW53aW5kX1B0cgorX1Vud2luZF9HZXREYXRhUmVsQmFzZSAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqX0MpCit7CisgIC8qIFRoZSBHUCBpcyBzdG9yZWQgaW4gUjEuICAqLworICByZXR1cm4gX1Vud2luZF9HZXRHUiAoX0MsIDEpOworfQorCitzdGF0aWMgaW5saW5lIF9VbndpbmRfUHRyCitfVW53aW5kX0dldFRleHRSZWxCYXNlIChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICpfQyBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpKQoreworICBhYm9ydCAoKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEBAQCBSZXRyaWV2ZSB0aGUgQmFja2luZyBTdG9yZSBQb2ludGVyIG9mIHRoZSBnaXZlbiBjb250ZXh0LiAgKi8KK2V4dGVybiBfVW53aW5kX1dvcmQgX1Vud2luZF9HZXRCU1AgKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKik7CisjZWxzZQorZXh0ZXJuIF9VbndpbmRfUHRyIF9VbndpbmRfR2V0RGF0YVJlbEJhc2UgKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKik7CitleHRlcm4gX1Vud2luZF9QdHIgX1Vud2luZF9HZXRUZXh0UmVsQmFzZSAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqKTsKKyNlbmRpZgorCisvKiBAQEAgR2l2ZW4gYW4gYWRkcmVzcywgcmV0dXJuIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgZnVuY3Rpb24gdGhhdAorICAgY29udGFpbnMgaXQuICAqLworZXh0ZXJuIHZvaWQgKiBfVW53aW5kX0ZpbmRFbmNsb3NpbmdGdW5jdGlvbiAodm9pZCAqcGMpOworCisjaWZuZGVmIF9fU0laRU9GX0xPTkdfXworICAjZXJyb3IgIl9fU0laRU9GX0xPTkdfXyBtYWNybyBub3QgZGVmaW5lZCIKKyNlbmRpZgorCisjaWZuZGVmIF9fU0laRU9GX1BPSU5URVJfXworICAjZXJyb3IgIl9fU0laRU9GX1BPSU5URVJfXyBtYWNybyBub3QgZGVmaW5lZCIKKyNlbmRpZgorCisKKy8qIGxlYjEyOCB0eXBlIG51bWJlcnMgaGF2ZSBhIHBvdGVudGlhbGx5IHVubGltaXRlZCBzaXplLgorICAgVGhlIHRhcmdldCBvZiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zIG9mIF9zbGViMTI4X3QgYW5kIF91bGViMTI4X3QKKyAgIGlzIHRvIGhhdmUgZWZmaWNpZW50IGRhdGEgdHlwZXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGxlYjEyOCB0eXBlCisgICBudW1iZXJzIHVzZWQgaW4gdGhlIHVud2luZCBjb2RlLgorICAgTW9zdGx5IHRoZXNlIHR5cGVzIHdpbGwgc2ltcGx5IGJlIGRlZmluZWQgdG8gbG9uZyBhbmQgdW5zaWduZWQgbG9uZworICAgZXhjZXB0IHdoZW4gYSB1bnNpZ25lZCBsb25nIGRhdGEgdHlwZSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUgaXMgbm90CisgICBjYXBhYmxlIG9mIHN0b3JpbmcgYSBwb2ludGVyLiAgKi8KKworI2lmIF9fU0laRU9GX0xPTkdfXyA+PSBfX1NJWkVPRl9QT0lOVEVSX18KKyAgdHlwZWRlZiBsb25nIF9zbGViMTI4X3Q7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBfdWxlYjEyOF90OworI2VsaWYgX19TSVpFT0ZfTE9OR19MT05HX18gPj0gX19TSVpFT0ZfUE9JTlRFUl9fCisgIHR5cGVkZWYgbG9uZyBsb25nIF9zbGViMTI4X3Q7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF91bGViMTI4X3Q7CisjZWxzZQorIyBlcnJvciAiV2hhdCB0eXBlIHNoYWxsIHdlIHVzZSBmb3IgX3NsZWIxMjhfdD8iCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU0VIX18pICYmICFkZWZpbmVkIChfX1VTSU5HX1NKTEpfRVhDRVBUSU9OU19fKQorLyogSGFuZGxlcyB0aGUgbWFwcGluZyBmcm9tIFNFSCB0byBHQ0MgaW50ZXJmYWNlcy4gICovCitFWENFUFRJT05fRElTUE9TSVRJT04gX0dDQ19zcGVjaWZpY19oYW5kbGVyIChQRVhDRVBUSU9OX1JFQ09SRCwgdm9pZCAqLAorCQkJCQkgICAgIFBDT05URVhULCBQRElTUEFUQ0hFUl9DT05URVhULAorCQkJCQkgICAgIF9VbndpbmRfUGVyc29uYWxpdHlfRm4pOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNpZm5kZWYgSElERV9FWFBPUlRTCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorI2VuZGlmCisKKyNlbmRpZiAvKiB1bndpbmQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvdmFyYXJncy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvdmFyYXJncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTgwM2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS92YXJhcmdzLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9WQVJBUkdTX0gKKyNkZWZpbmUgX1ZBUkFSR1NfSAorCisjZXJyb3IgIkdDQyBubyBsb25nZXIgaW1wbGVtZW50cyA8dmFyYXJncy5oPi4iCisjZXJyb3IgIlJldmlzZSB5b3VyIGNvZGUgdG8gdXNlIDxzdGRhcmcuaD4uIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3dtbWludHJpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvd21taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjMjRmNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3dtbWludHJpbi5oCkBAIC0wLDAgKzEsMTIwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogSW1wbGVtZW50ZWQgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBpbmNsdWRlZCBpbiB0aGUgSW50ZWwgQysrIENvbXBpbGVyCisgICBVc2VyIEd1aWRlIGFuZCBSZWZlcmVuY2UsIHZlcnNpb24gMTAuMS4gICovCisKKyNpZm5kZWYgX1dNTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9XTU1JTlRSSU5fSF9JTkNMVURFRAorCisvKiBXZSBuZWVkIGRlZmluaXRpb25zIGZyb20gdGhlIFNTRTIgaGVhZGVyIGZpbGUuICAqLworI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisjaWYgIWRlZmluZWQgKF9fQUVTX18pICYmICFkZWZpbmVkIChfX1BDTE1VTF9fKQorIyBlcnJvciAiQUVTL1BDTE1VTCBpbnN0cnVjdGlvbnMgbm90IGVuYWJsZWQiCisjZWxzZQorCisvKiBBRVMgKi8KKworI2lmZGVmIF9fQUVTX18KKy8qIFBlcmZvcm1zIDEgcm91bmQgb2YgQUVTIGRlY3J5cHRpb24gb2YgdGhlIGZpcnN0IG0xMjhpIHVzaW5nIAorICAgdGhlIHNlY29uZCBtMTI4aSBhcyBhIHJvdW5kIGtleS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZXNkZWNfc2kxMjggKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9hZXNkZWMxMjggKChfX3YyZGkpX19YLCAoX192MmRpKV9fWSk7Cit9CisKKy8qIFBlcmZvcm1zIHRoZSBsYXN0IHJvdW5kIG9mIEFFUyBkZWNyeXB0aW9uIG9mIHRoZSBmaXJzdCBtMTI4aSAKKyAgIHVzaW5nIHRoZSBzZWNvbmQgbTEyOGkgYXMgYSByb3VuZCBrZXkuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWVzZGVjbGFzdF9zaTEyOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2Flc2RlY2xhc3QxMjggKChfX3YyZGkpX19YLAorCQkJCQkJIChfX3YyZGkpX19ZKTsKK30KKworLyogUGVyZm9ybXMgMSByb3VuZCBvZiBBRVMgZW5jcnlwdGlvbiBvZiB0aGUgZmlyc3QgbTEyOGkgdXNpbmcgCisgICB0aGUgc2Vjb25kIG0xMjhpIGFzIGEgcm91bmQga2V5LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Flc2VuY19zaTEyOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2Flc2VuYzEyOCAoKF9fdjJkaSlfX1gsIChfX3YyZGkpX19ZKTsKK30KKworLyogUGVyZm9ybXMgdGhlIGxhc3Qgcm91bmQgb2YgQUVTIGVuY3J5cHRpb24gb2YgdGhlIGZpcnN0IG0xMjhpCisgICB1c2luZyB0aGUgc2Vjb25kIG0xMjhpIGFzIGEgcm91bmQga2V5LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Flc2VuY2xhc3Rfc2kxMjggKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9hZXNlbmNsYXN0MTI4ICgoX192MmRpKV9fWCwgKF9fdjJkaSlfX1kpOworfQorCisvKiBQZXJmb3JtcyB0aGUgSW52ZXJzZU1peENvbHVtbiBvcGVyYXRpb24gb24gdGhlIHNvdXJjZSBtMTI4aSAKKyAgIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbnRvIG0xMjhpIGRlc3RpbmF0aW9uLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Flc2ltY19zaTEyOCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfYWVzaW1jMTI4ICgoX192MmRpKV9fWCk7Cit9CisKKy8qIEdlbmVyYXRlcyBhIG0xMjhpIHJvdW5kIGtleSBmb3IgdGhlIGlucHV0IG0xMjhpIEFFUyBjaXBoZXIga2V5IGFuZAorICAgYnl0ZSByb3VuZCBjb25zdGFudC4gIFRoZSBzZWNvbmQgcGFyYW1ldGVyIG11c3QgYmUgYSBjb21waWxlIHRpbWUKKyAgIGNvbnN0YW50LiAgKi8KKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Flc2tleWdlbmFzc2lzdF9zaTEyOCAoX19tMTI4aSBfX1gsIGNvbnN0IGludCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfYWVza2V5Z2VuYXNzaXN0MTI4ICgoX192MmRpKV9fWCwgX19DKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9hZXNrZXlnZW5hc3Npc3Rfc2kxMjgoWCwgQykJCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9hZXNrZXlnZW5hc3Npc3QxMjggKChfX3YyZGkpKF9fbTEyOGkpKFgpLAlcCisJCQkJCQkoaW50KShDKSkpCisjZW5kaWYKKyNlbmRpZiAgLyogX19BRVNfXyAqLworCisvKiBQQ0xNVUwgKi8KKworI2lmZGVmIF9fUENMTVVMX18KKy8qIFBlcmZvcm1zIGNhcnJ5LWxlc3MgaW50ZWdlciBtdWx0aXBsaWNhdGlvbiBvZiA2NC1iaXQgaGFsdmVzIG9mCisgICAxMjgtYml0IGlucHV0IG9wZXJhbmRzLiAgVGhlIHRoaXJkIHBhcmFtZXRlciBpbmR1Y2F0ZXMgd2hpY2ggNjQtYml0CisgICBoYXZlcyBvZiB0aGUgaW5wdXQgcGFyYW1ldGVycyB2MSBhbmQgdjIgc2hvdWxkIGJlIHVzZWQuIEl0IG11c3QgYmUKKyAgIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50LiAgKi8KKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NsbXVsZXBpNjRfc2kxMjggKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgY29uc3QgaW50IF9fSSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wY2xtdWxxZHExMjggKChfX3YyZGkpX19YLAorCQkJCQkJKF9fdjJkaSlfX1ksIF9fSSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fY2xtdWxlcGk2NF9zaTEyOChYLCBZLCBJKQkJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BjbG11bHFkcTEyOCAoKF9fdjJkaSkoX19tMTI4aSkoWCksCQlcCisJCQkJCSAgKF9fdjJkaSkoX19tMTI4aSkoWSksIChpbnQpKEkpKSkKKyNlbmRpZgorI2VuZGlmICAvKiBfX1BDTE1VTF9fICAqLworCisjZW5kaWYgLyogX19BRVNfXy9fX1BDTE1VTF9fICovCisKKyNlbmRpZiAvKiBfV01NSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3g4NmludHJpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUveDg2aW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmMjlkNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3g4NmludHJpbi5oCkBAIC0wLDAgKzEsMTIyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfWDg2SU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX1g4NklOVFJJTl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxpYTMyaW50cmluLmg+CisKKyNpZmRlZiBfX01NWF9fCisjaW5jbHVkZSA8bW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19TU0VfXworI2luY2x1ZGUgPHhtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1NTRTJfXworI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1NTRTNfXworI2luY2x1ZGUgPHBtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1NTU0UzX18KKyNpbmNsdWRlIDx0bW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19TU0U0QV9fCisjaW5jbHVkZSA8YW1taW50cmluLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU1NFNF8yX18pIHx8IGRlZmluZWQgKF9fU1NFNF8xX18pCisjaW5jbHVkZSA8c21taW50cmluLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQUVTX18pIHx8IGRlZmluZWQgKF9fUENMTVVMX18pCisjaW5jbHVkZSA8d21taW50cmluLmg+CisjZW5kaWYKKworLyogRm9yIGluY2x1ZGluZyBBVlggaW5zdHJ1Y3Rpb25zICovCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisKKyNpZmRlZiBfXzNkTk9XX18KKyNpbmNsdWRlIDxtbTNkbm93Lmg+CisjZW5kaWYKKworI2lmZGVmIF9fRk1BNF9fCisjaW5jbHVkZSA8Zm1hNGludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1hPUF9fCisjaW5jbHVkZSA8eG9waW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fTFdQX18KKyNpbmNsdWRlIDxsd3BpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19CTUlfXworI2luY2x1ZGUgPGJtaWludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0JNSTJfXworI2luY2x1ZGUgPGJtaTJpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19UQk1fXworI2luY2x1ZGUgPHRibWludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0xaQ05UX18KKyNpbmNsdWRlIDxsemNudGludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1BPUENOVF9fCisjaW5jbHVkZSA8cG9wY250aW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fUkRTRUVEX18KKyNpbmNsdWRlIDxyZHNlZWRpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19QUkZDSFdfXworI2luY2x1ZGUgPHByZmNod2ludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0ZYU1JfXworI2luY2x1ZGUgPGZ4c3JpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19YU0FWRV9fCisjaW5jbHVkZSA8eHNhdmVpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19YU0FWRU9QVF9fCisjaW5jbHVkZSA8eHNhdmVvcHRpbnRyaW4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YWR4aW50cmluLmg+CisKKyNlbmRpZiAvKiBfWDg2SU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3htbWludHJpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUveG1taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyMzU2MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3htbWludHJpbi5oCkBAIC0wLDAgKzEsMTI1MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEltcGxlbWVudGVkIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaW5jbHVkZWQgaW4gdGhlIEludGVsIEMrKyBDb21waWxlcgorICAgVXNlciBHdWlkZSBhbmQgUmVmZXJlbmNlLCB2ZXJzaW9uIDkuMC4gICovCisKKyNpZm5kZWYgX1hNTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9YTU1JTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fU1NFX18KKyMgZXJyb3IgIlNTRSBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCisvKiBXZSBuZWVkIHR5cGUgZGVmaW5pdGlvbnMgZnJvbSB0aGUgTU1YIGhlYWRlciBmaWxlLiAgKi8KKyNpbmNsdWRlIDxtbWludHJpbi5oPgorCisvKiBHZXQgX21tX21hbGxvYyAoKSBhbmQgX21tX2ZyZWUgKCkuICAqLworI2luY2x1ZGUgPG1tX21hbGxvYy5oPgorCisvKiBUaGUgSW50ZWwgQVBJIGlzIGZsZXhpYmxlIGVub3VnaCB0aGF0IHdlIG11c3QgYWxsb3cgYWxpYXNpbmcgd2l0aCBvdGhlcgorICAgdmVjdG9yIHR5cGVzLCBhbmQgdGhlaXIgc2NhbGFyIGNvbXBvbmVudHMuICAqLwordHlwZWRlZiBmbG9hdCBfX20xMjggX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpLCBfX21heV9hbGlhc19fKSk7CisKKy8qIEludGVybmFsIGRhdGEgdHlwZXMgZm9yIGltcGxlbWVudGluZyB0aGUgaW50cmluc2ljcy4gICovCit0eXBlZGVmIGZsb2F0IF9fdjRzZiBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsKKworLyogQ3JlYXRlIGEgc2VsZWN0b3IgZm9yIHVzZSB3aXRoIHRoZSBTSFVGUFMgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBfTU1fU0hVRkZMRShmcDMsZnAyLGZwMSxmcDApIFwKKyAoKChmcDMpIDw8IDYpIHwgKChmcDIpIDw8IDQpIHwgKChmcDEpIDw8IDIpIHwgKGZwMCkpCisKKy8qIENvbnN0YW50cyBmb3IgdXNlIHdpdGggX21tX3ByZWZldGNoLiAgKi8KK2VudW0gX21tX2hpbnQKK3sKKyAgX01NX0hJTlRfVDAgPSAzLAorICBfTU1fSElOVF9UMSA9IDIsCisgIF9NTV9ISU5UX1QyID0gMSwKKyAgX01NX0hJTlRfTlRBID0gMAorfTsKKworLyogQml0cyBpbiB0aGUgTVhDU1IuICAqLworI2RlZmluZSBfTU1fRVhDRVBUX01BU0sgICAgICAgMHgwMDNmCisjZGVmaW5lIF9NTV9FWENFUFRfSU5WQUxJRCAgICAweDAwMDEKKyNkZWZpbmUgX01NX0VYQ0VQVF9ERU5PUk0gICAgIDB4MDAwMgorI2RlZmluZSBfTU1fRVhDRVBUX0RJVl9aRVJPICAgMHgwMDA0CisjZGVmaW5lIF9NTV9FWENFUFRfT1ZFUkZMT1cgICAweDAwMDgKKyNkZWZpbmUgX01NX0VYQ0VQVF9VTkRFUkZMT1cgIDB4MDAxMAorI2RlZmluZSBfTU1fRVhDRVBUX0lORVhBQ1QgICAgMHgwMDIwCisKKyNkZWZpbmUgX01NX01BU0tfTUFTSyAgICAgICAgIDB4MWY4MAorI2RlZmluZSBfTU1fTUFTS19JTlZBTElEICAgICAgMHgwMDgwCisjZGVmaW5lIF9NTV9NQVNLX0RFTk9STSAgICAgICAweDAxMDAKKyNkZWZpbmUgX01NX01BU0tfRElWX1pFUk8gICAgIDB4MDIwMAorI2RlZmluZSBfTU1fTUFTS19PVkVSRkxPVyAgICAgMHgwNDAwCisjZGVmaW5lIF9NTV9NQVNLX1VOREVSRkxPVyAgICAweDA4MDAKKyNkZWZpbmUgX01NX01BU0tfSU5FWEFDVCAgICAgIDB4MTAwMAorCisjZGVmaW5lIF9NTV9ST1VORF9NQVNLICAgICAgICAweDYwMDAKKyNkZWZpbmUgX01NX1JPVU5EX05FQVJFU1QgICAgIDB4MDAwMAorI2RlZmluZSBfTU1fUk9VTkRfRE9XTiAgICAgICAgMHgyMDAwCisjZGVmaW5lIF9NTV9ST1VORF9VUCAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgX01NX1JPVU5EX1RPV0FSRF9aRVJPIDB4NjAwMAorCisjZGVmaW5lIF9NTV9GTFVTSF9aRVJPX01BU0sgICAweDgwMDAKKyNkZWZpbmUgX01NX0ZMVVNIX1pFUk9fT04gICAgIDB4ODAwMAorI2RlZmluZSBfTU1fRkxVU0hfWkVST19PRkYgICAgMHgwMDAwCisKKy8qIENyZWF0ZSBhIHZlY3RvciBvZiB6ZXJvcy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldHplcm9fcHMgKHZvaWQpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjgpeyAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmIH07Cit9CisKKy8qIFBlcmZvcm0gdGhlIHJlc3BlY3RpdmUgb3BlcmF0aW9uIG9uIHRoZSBsb3dlciBTUEZQIChzaW5nbGUtcHJlY2lzaW9uCisgICBmbG9hdGluZy1wb2ludCkgdmFsdWVzIG9mIEEgYW5kIEI7IHRoZSB1cHBlciB0aHJlZSBTUEZQIHZhbHVlcyBhcmUKKyAgIHBhc3NlZCB0aHJvdWdoIGZyb20gQS4gICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfYWRkc3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3ViX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc3Vic3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbXVsc3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZGl2X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZGl2c3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3FydF9zcyAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3NxcnRzcyAoKF9fdjRzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JjcF9zcyAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3JjcHNzICgoX192NHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcnNxcnRfc3MgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yc3FydHNzICgoX192NHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWluX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbWluc3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWF4X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbWF4c3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKKy8qIFBlcmZvcm0gdGhlIHJlc3BlY3RpdmUgb3BlcmF0aW9uIG9uIHRoZSBmb3VyIFNQRlAgdmFsdWVzIGluIEEgYW5kIEIuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZF9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2FkZHBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1Yl9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3N1YnBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bF9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX211bHBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Rpdl9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2RpdnBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NxcnRfcHMgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9zcXJ0cHMgKChfX3Y0c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yY3BfcHMgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yY3BwcyAoKF9fdjRzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JzcXJ0X3BzIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcnNxcnRwcyAoKF9fdjRzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21pbl9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21pbnBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21heF9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21heHBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBQZXJmb3JtIGxvZ2ljYWwgYml0LXdpc2Ugb3BlcmF0aW9ucyBvbiAxMjgtYml0IHZhbHVlcy4gICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYW5kX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfYW5kcHMgKF9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hbmRub3RfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9hbmRucHMgKF9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9vcl9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX29ycHMgKF9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV94b3JfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl94b3JwcyAoX19BLCBfX0IpOworfQorCisvKiBQZXJmb3JtIGEgY29tcGFyaXNvbiBvbiB0aGUgbG93ZXIgU1BGUCB2YWx1ZXMgb2YgQSBhbmQgQi4gIElmIHRoZQorICAgY29tcGFyaXNvbiBpcyB0cnVlLCBwbGFjZSBhIG1hc2sgb2YgYWxsIG9uZXMgaW4gdGhlIHJlc3VsdCwgb3RoZXJ3aXNlIGEKKyAgIG1hc2sgb2YgemVyb3MuICBUaGUgdXBwZXIgdGhyZWUgU1BGUCB2YWx1ZXMgYXJlIHBhc3NlZCB0aHJvdWdoIGZyb20gQS4gICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXFfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBlcXNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGx0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbHRzcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBsZV9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcGxlc3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ3Rfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZzcyAoKF9fdjRzZikgX19BLAorCQkJCQkoX192NHNmKQorCQkJCQlfX2J1aWx0aW5faWEzMl9jbXBsdHNzICgoX192NHNmKSBfX0IsCisJCQkJCQkJCShfX3Y0c2YpCisJCQkJCQkJCV9fQSkpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGdlX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbW92c3MgKChfX3Y0c2YpIF9fQSwKKwkJCQkJKF9fdjRzZikKKwkJCQkJX19idWlsdGluX2lhMzJfY21wbGVzcyAoKF9fdjRzZikgX19CLAorCQkJCQkJCQkoX192NHNmKQorCQkJCQkJCQlfX0EpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBuZXFfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBuZXFzcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBubHRfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBubHRzcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBubGVfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBubGVzcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBuZ3Rfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZzcyAoKF9fdjRzZikgX19BLAorCQkJCQkoX192NHNmKQorCQkJCQlfX2J1aWx0aW5faWEzMl9jbXBubHRzcyAoKF9fdjRzZikgX19CLAorCQkJCQkJCQkgKF9fdjRzZikKKwkJCQkJCQkJIF9fQSkpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG5nZV9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21vdnNzICgoX192NHNmKSBfX0EsCisJCQkJCShfX3Y0c2YpCisJCQkJCV9fYnVpbHRpbl9pYTMyX2NtcG5sZXNzICgoX192NHNmKSBfX0IsCisJCQkJCQkJCSAoX192NHNmKQorCQkJCQkJCQkgX19BKSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wb3JkX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wb3Jkc3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wdW5vcmRfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXB1bm9yZHNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBQZXJmb3JtIGEgY29tcGFyaXNvbiBvbiB0aGUgZm91ciBTUEZQIHZhbHVlcyBvZiBBIGFuZCBCLiAgRm9yIGVhY2gKKyAgIGVsZW1lbnQsIGlmIHRoZSBjb21wYXJpc29uIGlzIHRydWUsIHBsYWNlIGEgbWFzayBvZiBhbGwgb25lcyBpbiB0aGUKKyAgIHJlc3VsdCwgb3RoZXJ3aXNlIGEgbWFzayBvZiB6ZXJvcy4gICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXFfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBlcXBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGx0X3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbHRwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBsZV9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcGxlcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ3RfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBndHBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGdlX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wZ2VwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBuZXFfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBuZXFwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBubHRfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBubHRwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBubGVfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBubGVwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBuZ3RfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBuZ3RwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBuZ2VfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBuZ2VwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBvcmRfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBvcmRwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXB1bm9yZF9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcHVub3JkcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKKy8qIENvbXBhcmUgdGhlIGxvd2VyIFNQRlAgdmFsdWVzIG9mIEEgYW5kIEIgYW5kIHJldHVybiAxIGlmIHRydWUKKyAgIGFuZCAwIGlmIGZhbHNlLiAgKi8KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21pZXFfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jb21pZXEgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29taWx0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taWx0ICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWlsZV9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlsZSAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21pZ3Rfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jb21pZ3QgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29taWdlX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taWdlICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWluZXFfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jb21pbmVxICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Vjb21pZXFfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taWVxICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Vjb21pbHRfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taWx0ICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Vjb21pbGVfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taWxlICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Vjb21pZ3Rfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taWd0ICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Vjb21pZ2Vfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taWdlICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Vjb21pbmVxX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWluZXEgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKKy8qIENvbnZlcnQgdGhlIGxvd2VyIFNQRlAgdmFsdWUgdG8gYSAzMi1iaXQgaW50ZWdlciBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQKKyAgIHJvdW5kaW5nIG1vZGUuICAqLworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzc19zaTMyIChfX20xMjggX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0c3Myc2kgKChfX3Y0c2YpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0X3NzMnNpIChfX20xMjggX19BKQoreworICByZXR1cm4gX21tX2N2dHNzX3NpMzIgKF9fQSk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCisvKiBDb252ZXJ0IHRoZSBsb3dlciBTUEZQIHZhbHVlIHRvIGEgMzItYml0IGludGVnZXIgYWNjb3JkaW5nIHRvIHRoZQorICAgY3VycmVudCByb3VuZGluZyBtb2RlLiAgKi8KKworLyogSW50ZWwgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c3Nfc2k2NCAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHNzMnNpNjQgKChfX3Y0c2YpIF9fQSk7Cit9CisKKy8qIE1pY3Jvc29mdCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzc19zaTY0eCAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHNzMnNpNjQgKChfX3Y0c2YpIF9fQSk7Cit9CisjZW5kaWYKKworLyogQ29udmVydCB0aGUgdHdvIGxvd2VyIFNQRlAgdmFsdWVzIHRvIDMyLWJpdCBpbnRlZ2VycyBhY2NvcmRpbmcgdG8gdGhlCisgICBjdXJyZW50IHJvdW5kaW5nIG1vZGUuICBSZXR1cm4gdGhlIGludGVnZXJzIGluIHBhY2tlZCBmb3JtLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwc19waTMyIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9jdnRwczJwaSAoKF9fdjRzZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dF9wczJwaSAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9jdnRwc19waTMyIChfX0EpOworfQorCisvKiBUcnVuY2F0ZSB0aGUgbG93ZXIgU1BGUCB2YWx1ZSB0byBhIDMyLWJpdCBpbnRlZ2VyLiAgKi8KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0dHNzX3NpMzIgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnR0c3Myc2kgKChfX3Y0c2YpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0dF9zczJzaSAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9jdnR0c3Nfc2kzMiAoX19BKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KKy8qIFRydW5jYXRlIHRoZSBsb3dlciBTUEZQIHZhbHVlIHRvIGEgMzItYml0IGludGVnZXIuICAqLworCisvKiBJbnRlbCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnR0c3Nfc2k2NCAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHRzczJzaTY0ICgoX192NHNmKSBfX0EpOworfQorCisvKiBNaWNyb3NvZnQgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0dHNzX3NpNjR4IChfX20xMjggX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0dHNzMnNpNjQgKChfX3Y0c2YpIF9fQSk7Cit9CisjZW5kaWYKKworLyogVHJ1bmNhdGUgdGhlIHR3byBsb3dlciBTUEZQIHZhbHVlcyB0byAzMi1iaXQgaW50ZWdlcnMuICBSZXR1cm4gdGhlCisgICBpbnRlZ2VycyBpbiBwYWNrZWQgZm9ybS4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0dHBzX3BpMzIgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJwaSAoKF9fdjRzZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRfcHMycGkgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfbW1fY3Z0dHBzX3BpMzIgKF9fQSk7Cit9CisKKy8qIENvbnZlcnQgQiB0byBhIFNQRlAgdmFsdWUgYW5kIGluc2VydCBpdCBhcyBlbGVtZW50IHplcm8gaW4gQS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpMzJfc3MgKF9fbTEyOCBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jdnRzaTJzcyAoKF9fdjRzZikgX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dF9zaTJzcyAoX19tMTI4IF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIF9tbV9jdnRzaTMyX3NzIChfX0EsIF9fQik7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCisvKiBDb252ZXJ0IEIgdG8gYSBTUEZQIHZhbHVlIGFuZCBpbnNlcnQgaXQgYXMgZWxlbWVudCB6ZXJvIGluIEEuICAqLworCisvKiBJbnRlbCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTY0X3NzIChfX20xMjggX19BLCBsb25nIGxvbmcgX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0c2k2NDJzcyAoKF9fdjRzZikgX19BLCBfX0IpOworfQorCisvKiBNaWNyb3NvZnQgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2k2NHhfc3MgKF9fbTEyOCBfX0EsIGxvbmcgbG9uZyBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jdnRzaTY0MnNzICgoX192NHNmKSBfX0EsIF9fQik7Cit9CisjZW5kaWYKKworLyogQ29udmVydCB0aGUgdHdvIDMyLWJpdCB2YWx1ZXMgaW4gQiB0byBTUEZQIGZvcm0gYW5kIGluc2VydCB0aGVtCisgICBhcyB0aGUgdHdvIGxvd2VyIGVsZW1lbnRzIGluIEEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwaTMyX3BzIChfX20xMjggX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jdnRwaTJwcyAoKF9fdjRzZikgX19BLCAoX192MnNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0X3BpMnBzIChfX20xMjggX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiBfbW1fY3Z0cGkzMl9wcyAoX19BLCBfX0IpOworfQorCisvKiBDb252ZXJ0IHRoZSBmb3VyIHNpZ25lZCAxNi1iaXQgdmFsdWVzIGluIEEgdG8gU1BGUCBmb3JtLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cGkxNl9wcyAoX19tNjQgX19BKQoreworICBfX3Y0aGkgX19zaWduOworICBfX3Yyc2kgX19oaXNpLCBfX2xvc2k7CisgIF9fdjRzZiBfX3plcm8sIF9fcmEsIF9fcmI7CisKKyAgLyogVGhpcyBjb21wYXJpc29uIGFnYWluc3QgemVybyBnaXZlcyB1cyBhIG1hc2sgdGhhdCBjYW4gYmUgdXNlZCB0bworICAgICBmaWxsIGluIHRoZSBtaXNzaW5nIHNpZ24gYml0cyBpbiB0aGUgdW5wYWNrIG9wZXJhdGlvbnMgYmVsb3csIHNvCisgICAgIHRoYXQgd2UgZ2V0IHNpZ25lZCB2YWx1ZXMgYWZ0ZXIgdW5wYWNraW5nLiAgKi8KKyAgX19zaWduID0gX19idWlsdGluX2lhMzJfcGNtcGd0dyAoKF9fdjRoaSkwTEwsIChfX3Y0aGkpX19BKTsKKworICAvKiBDb252ZXJ0IHRoZSBmb3VyIHdvcmRzIHRvIGRvdWJsZXdvcmRzLiAgKi8KKyAgX19sb3NpID0gKF9fdjJzaSkgX19idWlsdGluX2lhMzJfcHVucGNrbHdkICgoX192NGhpKV9fQSwgX19zaWduKTsKKyAgX19oaXNpID0gKF9fdjJzaSkgX19idWlsdGluX2lhMzJfcHVucGNraHdkICgoX192NGhpKV9fQSwgX19zaWduKTsKKworICAvKiBDb252ZXJ0IHRoZSBkb3VibGV3b3JkcyB0byBmbG9hdGluZyBwb2ludCB0d28gYXQgYSB0aW1lLiAgKi8KKyAgX196ZXJvID0gKF9fdjRzZikgX21tX3NldHplcm9fcHMgKCk7CisgIF9fcmEgPSBfX2J1aWx0aW5faWEzMl9jdnRwaTJwcyAoX196ZXJvLCBfX2xvc2kpOworICBfX3JiID0gX19idWlsdGluX2lhMzJfY3Z0cGkycHMgKF9fcmEsIF9faGlzaSk7CisKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21vdmxocHMgKF9fcmEsIF9fcmIpOworfQorCisvKiBDb252ZXJ0IHRoZSBmb3VyIHVuc2lnbmVkIDE2LWJpdCB2YWx1ZXMgaW4gQSB0byBTUEZQIGZvcm0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwdTE2X3BzIChfX202NCBfX0EpCit7CisgIF9fdjJzaSBfX2hpc2ksIF9fbG9zaTsKKyAgX192NHNmIF9femVybywgX19yYSwgX19yYjsKKworICAvKiBDb252ZXJ0IHRoZSBmb3VyIHdvcmRzIHRvIGRvdWJsZXdvcmRzLiAgKi8KKyAgX19sb3NpID0gKF9fdjJzaSkgX19idWlsdGluX2lhMzJfcHVucGNrbHdkICgoX192NGhpKV9fQSwgKF9fdjRoaSkwTEwpOworICBfX2hpc2kgPSAoX192MnNpKSBfX2J1aWx0aW5faWEzMl9wdW5wY2tod2QgKChfX3Y0aGkpX19BLCAoX192NGhpKTBMTCk7CisKKyAgLyogQ29udmVydCB0aGUgZG91Ymxld29yZHMgdG8gZmxvYXRpbmcgcG9pbnQgdHdvIGF0IGEgdGltZS4gICovCisgIF9femVybyA9IChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BzICgpOworICBfX3JhID0gX19idWlsdGluX2lhMzJfY3Z0cGkycHMgKF9femVybywgX19sb3NpKTsKKyAgX19yYiA9IF9fYnVpbHRpbl9pYTMyX2N2dHBpMnBzIChfX3JhLCBfX2hpc2kpOworCisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZsaHBzIChfX3JhLCBfX3JiKTsKK30KKworLyogQ29udmVydCB0aGUgbG93IGZvdXIgc2lnbmVkIDgtYml0IHZhbHVlcyBpbiBBIHRvIFNQRlAgZm9ybS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBpOF9wcyAoX19tNjQgX19BKQoreworICBfX3Y4cWkgX19zaWduOworCisgIC8qIFRoaXMgY29tcGFyaXNvbiBhZ2FpbnN0IHplcm8gZ2l2ZXMgdXMgYSBtYXNrIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAgICAgZmlsbCBpbiB0aGUgbWlzc2luZyBzaWduIGJpdHMgaW4gdGhlIHVucGFjayBvcGVyYXRpb25zIGJlbG93LCBzbworICAgICB0aGF0IHdlIGdldCBzaWduZWQgdmFsdWVzIGFmdGVyIHVucGFja2luZy4gICovCisgIF9fc2lnbiA9IF9fYnVpbHRpbl9pYTMyX3BjbXBndGIgKChfX3Y4cWkpMExMLCAoX192OHFpKV9fQSk7CisKKyAgLyogQ29udmVydCB0aGUgZm91ciBsb3cgYnl0ZXMgdG8gd29yZHMuICAqLworICBfX0EgPSAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2xidyAoKF9fdjhxaSlfX0EsIF9fc2lnbik7CisKKyAgcmV0dXJuIF9tbV9jdnRwaTE2X3BzKF9fQSk7Cit9CisKKy8qIENvbnZlcnQgdGhlIGxvdyBmb3VyIHVuc2lnbmVkIDgtYml0IHZhbHVlcyBpbiBBIHRvIFNQRlAgZm9ybS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHB1OF9wcyhfX202NCBfX0EpCit7CisgIF9fQSA9IChfX202NCkgX19idWlsdGluX2lhMzJfcHVucGNrbGJ3ICgoX192OHFpKV9fQSwgKF9fdjhxaSkwTEwpOworICByZXR1cm4gX21tX2N2dHB1MTZfcHMoX19BKTsKK30KKworLyogQ29udmVydCB0aGUgZm91ciBzaWduZWQgMzItYml0IHZhbHVlcyBpbiBBIGFuZCBCIHRvIFNQRlAgZm9ybS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBpMzJ4Ml9wcyhfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgX192NHNmIF9femVybyA9IChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BzICgpOworICBfX3Y0c2YgX19zZmEgPSBfX2J1aWx0aW5faWEzMl9jdnRwaTJwcyAoX196ZXJvLCAoX192MnNpKV9fQSk7CisgIF9fdjRzZiBfX3NmYiA9IF9fYnVpbHRpbl9pYTMyX2N2dHBpMnBzIChfX3NmYSwgKF9fdjJzaSlfX0IpOworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbW92bGhwcyAoX19zZmEsIF9fc2ZiKTsKK30KKworLyogQ29udmVydCB0aGUgZm91ciBTUEZQIHZhbHVlcyBpbiBBIHRvIGZvdXIgc2lnbmVkIDE2LWJpdCBpbnRlZ2Vycy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cHNfcGkxNihfX20xMjggX19BKQoreworICBfX3Y0c2YgX19oaXNmID0gKF9fdjRzZilfX0E7CisgIF9fdjRzZiBfX2xvc2YgPSBfX2J1aWx0aW5faWEzMl9tb3ZobHBzIChfX2hpc2YsIF9faGlzZik7CisgIF9fdjJzaSBfX2hpc2kgPSBfX2J1aWx0aW5faWEzMl9jdnRwczJwaSAoX19oaXNmKTsKKyAgX192MnNpIF9fbG9zaSA9IF9fYnVpbHRpbl9pYTMyX2N2dHBzMnBpIChfX2xvc2YpOworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWNrc3NkdyAoX19oaXNpLCBfX2xvc2kpOworfQorCisvKiBDb252ZXJ0IHRoZSBmb3VyIFNQRlAgdmFsdWVzIGluIEEgdG8gZm91ciBzaWduZWQgOC1iaXQgaW50ZWdlcnMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBzX3BpOChfX20xMjggX19BKQoreworICBfX3Y0aGkgX190bXAgPSAoX192NGhpKSBfbW1fY3Z0cHNfcGkxNiAoX19BKTsKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFja3Nzd2IgKF9fdG1wLCAoX192NGhpKTBMTCk7Cit9CisKKy8qIFNlbGVjdHMgZm91ciBzcGVjaWZpYyBTUEZQIHZhbHVlcyBmcm9tIEEgYW5kIEIgYmFzZWQgb24gTUFTSy4gICovCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NodWZmbGVfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIGludCBjb25zdCBfX21hc2spCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9zaHVmcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgX19tYXNrKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9zaHVmZmxlX3BzKEEsIEIsIE1BU0spCQkJCQlcCisgICgoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9zaHVmcHMgKChfX3Y0c2YpKF9fbTEyOCkoQSksCQkJXAorCQkJCSAgIChfX3Y0c2YpKF9fbTEyOCkoQiksIChpbnQpKE1BU0spKSkKKyNlbmRpZgorCisvKiBTZWxlY3RzIGFuZCBpbnRlcmxlYXZlcyB0aGUgdXBwZXIgdHdvIFNQRlAgdmFsdWVzIGZyb20gQSBhbmQgQi4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2hpX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdW5wY2tocHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKKy8qIFNlbGVjdHMgYW5kIGludGVybGVhdmVzIHRoZSBsb3dlciB0d28gU1BGUCB2YWx1ZXMgZnJvbSBBIGFuZCBCLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNrbG9fcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl91bnBja2xwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworLyogU2V0cyB0aGUgdXBwZXIgdHdvIFNQRlAgdmFsdWVzIHdpdGggNjQtYml0cyBvZiBkYXRhIGxvYWRlZCBmcm9tIFA7CisgICB0aGUgbG93ZXIgdHdvIHZhbHVlcyBhcmUgcGFzc2VkIHRocm91Z2ggZnJvbSBBLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZGhfcGkgKF9fbTEyOCBfX0EsIF9fbTY0IGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9sb2FkaHBzICgoX192NHNmKV9fQSwgKGNvbnN0IF9fdjJzZiAqKV9fUCk7Cit9CisKKy8qIFN0b3JlcyB0aGUgdXBwZXIgdHdvIFNQRlAgdmFsdWVzIG9mIEEgaW50byBQLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3JlaF9waSAoX19tNjQgKl9fUCwgX19tMTI4IF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmVocHMgKChfX3Yyc2YgKilfX1AsIChfX3Y0c2YpX19BKTsKK30KKworLyogTW92ZXMgdGhlIHVwcGVyIHR3byB2YWx1ZXMgb2YgQiBpbnRvIHRoZSBsb3dlciB0d28gdmFsdWVzIG9mIEEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tb3ZlaGxfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZobHBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBNb3ZlcyB0aGUgbG93ZXIgdHdvIHZhbHVlcyBvZiBCIGludG8gdGhlIHVwcGVyIHR3byB2YWx1ZXMgb2YgQS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdmVsaF9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21vdmxocHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKKy8qIFNldHMgdGhlIGxvd2VyIHR3byBTUEZQIHZhbHVlcyB3aXRoIDY0LWJpdHMgb2YgZGF0YSBsb2FkZWQgZnJvbSBQOworICAgdGhlIHVwcGVyIHR3byB2YWx1ZXMgYXJlIHBhc3NlZCB0aHJvdWdoIGZyb20gQS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRsX3BpIChfX20xMjggX19BLCBfX202NCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbG9hZGxwcyAoKF9fdjRzZilfX0EsIChjb25zdCBfX3Yyc2YgKilfX1ApOworfQorCisvKiBTdG9yZXMgdGhlIGxvd2VyIHR3byBTUEZQIHZhbHVlcyBvZiBBIGludG8gUC4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZWxfcGkgKF9fbTY0ICpfX1AsIF9fbTEyOCBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JlbHBzICgoX192MnNmICopX19QLCAoX192NHNmKV9fQSk7Cit9CisKKy8qIENyZWF0ZXMgYSA0LWJpdCBtYXNrIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgU1BGUCB2YWx1ZXMuICAqLworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tb3ZlbWFza19wcyAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX21vdm1za3BzICgoX192NHNmKV9fQSk7Cit9CisKKy8qIFJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuICAqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9nZXRjc3IgKHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9zdG14Y3NyICgpOworfQorCisvKiBSZWFkIGV4Y2VwdGlvbiBiaXRzIGZyb20gdGhlIGNvbnRyb2wgcmVnaXN0ZXIuICAqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19NTV9HRVRfRVhDRVBUSU9OX1NUQVRFICh2b2lkKQoreworICByZXR1cm4gX21tX2dldGNzcigpICYgX01NX0VYQ0VQVF9NQVNLOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX01NX0dFVF9FWENFUFRJT05fTUFTSyAodm9pZCkKK3sKKyAgcmV0dXJuIF9tbV9nZXRjc3IoKSAmIF9NTV9NQVNLX01BU0s7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfTU1fR0VUX1JPVU5ESU5HX01PREUgKHZvaWQpCit7CisgIHJldHVybiBfbW1fZ2V0Y3NyKCkgJiBfTU1fUk9VTkRfTUFTSzsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19NTV9HRVRfRkxVU0hfWkVST19NT0RFICh2b2lkKQoreworICByZXR1cm4gX21tX2dldGNzcigpICYgX01NX0ZMVVNIX1pFUk9fTUFTSzsKK30KKworLyogU2V0IHRoZSBjb250cm9sIHJlZ2lzdGVyIHRvIEkuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0Y3NyICh1bnNpZ25lZCBpbnQgX19JKQoreworICBfX2J1aWx0aW5faWEzMl9sZG14Y3NyIChfX0kpOworfQorCisvKiBTZXQgZXhjZXB0aW9uIGJpdHMgaW4gdGhlIGNvbnRyb2wgcmVnaXN0ZXIuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfTU1fU0VUX0VYQ0VQVElPTl9TVEFURSh1bnNpZ25lZCBpbnQgX19tYXNrKQoreworICBfbW1fc2V0Y3NyKChfbW1fZ2V0Y3NyKCkgJiB+X01NX0VYQ0VQVF9NQVNLKSB8IF9fbWFzayk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX01NX1NFVF9FWENFUFRJT05fTUFTSyAodW5zaWduZWQgaW50IF9fbWFzaykKK3sKKyAgX21tX3NldGNzcigoX21tX2dldGNzcigpICYgfl9NTV9NQVNLX01BU0spIHwgX19tYXNrKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfTU1fU0VUX1JPVU5ESU5HX01PREUgKHVuc2lnbmVkIGludCBfX21vZGUpCit7CisgIF9tbV9zZXRjc3IoKF9tbV9nZXRjc3IoKSAmIH5fTU1fUk9VTkRfTUFTSykgfCBfX21vZGUpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19NTV9TRVRfRkxVU0hfWkVST19NT0RFICh1bnNpZ25lZCBpbnQgX19tb2RlKQoreworICBfbW1fc2V0Y3NyKChfbW1fZ2V0Y3NyKCkgJiB+X01NX0ZMVVNIX1pFUk9fTUFTSykgfCBfX21vZGUpOworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igd2l0aCBlbGVtZW50IDAgYXMgRiBhbmQgdGhlIHJlc3QgemVyby4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9zcyAoZmxvYXQgX19GKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMTI4KShfX3Y0c2YpeyBfX0YsIDAuMGYsIDAuMGYsIDAuMGYgfTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggYWxsIGZvdXIgZWxlbWVudHMgZXF1YWwgdG8gRi4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldDFfcHMgKGZsb2F0IF9fRikKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOCkoX192NHNmKXsgX19GLCBfX0YsIF9fRiwgX19GIH07Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X3BzMSAoZmxvYXQgX19GKQoreworICByZXR1cm4gX21tX3NldDFfcHMgKF9fRik7Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIGVsZW1lbnQgMCBhcyAqUCBhbmQgdGhlIHJlc3QgemVyby4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRfc3MgKGZsb2F0IGNvbnN0ICpfX1ApCit7CisgIHJldHVybiBfbW1fc2V0X3NzICgqX19QKTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggYWxsIGZvdXIgZWxlbWVudHMgZXF1YWwgdG8gKlAuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkMV9wcyAoZmxvYXQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIF9tbV9zZXQxX3BzICgqX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkX3BzMSAoZmxvYXQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIF9tbV9sb2FkMV9wcyAoX19QKTsKK30KKworLyogTG9hZCBmb3VyIFNQRlAgdmFsdWVzIGZyb20gUC4gIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZF9wcyAoZmxvYXQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20xMjgpICooX192NHNmICopX19QOworfQorCisvKiBMb2FkIGZvdXIgU1BGUCB2YWx1ZXMgZnJvbSBQLiAgVGhlIGFkZHJlc3MgbmVlZCBub3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZHVfcHMgKGZsb2F0IGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9sb2FkdXBzIChfX1ApOworfQorCisvKiBMb2FkIGZvdXIgU1BGUCB2YWx1ZXMgaW4gcmV2ZXJzZSBvcmRlci4gIFRoZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRyX3BzIChmbG9hdCBjb25zdCAqX19QKQoreworICBfX3Y0c2YgX190bXAgPSAqKF9fdjRzZiAqKV9fUDsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3NodWZwcyAoX190bXAsIF9fdG1wLCBfTU1fU0hVRkZMRSAoMCwxLDIsMykpOworfQorCisvKiBDcmVhdGUgdGhlIHZlY3RvciBbWiBZIFggV10uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfcHMgKGNvbnN0IGZsb2F0IF9fWiwgY29uc3QgZmxvYXQgX19ZLCBjb25zdCBmbG9hdCBfX1gsIGNvbnN0IGZsb2F0IF9fVykKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOCkoX192NHNmKXsgX19XLCBfX1gsIF9fWSwgX19aIH07Cit9CisKKy8qIENyZWF0ZSB0aGUgdmVjdG9yIFtXIFggWSBaXS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldHJfcHMgKGZsb2F0IF9fWiwgZmxvYXQgX19ZLCBmbG9hdCBfX1gsIGZsb2F0IF9fVykKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOCkoX192NHNmKXsgX19aLCBfX1ksIF9fWCwgX19XIH07Cit9CisKKy8qIFN0b3JlcyB0aGUgbG93ZXIgU1BGUCB2YWx1ZS4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZV9zcyAoZmxvYXQgKl9fUCwgX19tMTI4IF9fQSkKK3sKKyAgKl9fUCA9IF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjRzZiAoKF9fdjRzZilfX0EsIDApOworfQorCitleHRlcm4gX19pbmxpbmUgZmxvYXQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c3NfZjMyIChfX20xMjggX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdmVjX2V4dF92NHNmICgoX192NHNmKV9fQSwgMCk7Cit9CisKKy8qIFN0b3JlIGZvdXIgU1BGUCB2YWx1ZXMuICBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZV9wcyAoZmxvYXQgKl9fUCwgX19tMTI4IF9fQSkKK3sKKyAgKihfX3Y0c2YgKilfX1AgPSAoX192NHNmKV9fQTsKK30KKworLyogU3RvcmUgZm91ciBTUEZQIHZhbHVlcy4gIFRoZSBhZGRyZXNzIG5lZWQgbm90IGJlIDE2LWJ5dGUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZXVfcHMgKGZsb2F0ICpfX1AsIF9fbTEyOCBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JldXBzIChfX1AsIChfX3Y0c2YpX19BKTsKK30KKworLyogU3RvcmUgdGhlIGxvd2VyIFNQRlAgdmFsdWUgYWNyb3NzIGZvdXIgd29yZHMuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmUxX3BzIChmbG9hdCAqX19QLCBfX20xMjggX19BKQoreworICBfX3Y0c2YgX192YSA9IChfX3Y0c2YpX19BOworICBfX3Y0c2YgX190bXAgPSBfX2J1aWx0aW5faWEzMl9zaHVmcHMgKF9fdmEsIF9fdmEsIF9NTV9TSFVGRkxFICgwLDAsMCwwKSk7CisgIF9tbV9zdG9yZXVfcHMgKF9fUCwgX190bXApOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZV9wczEgKGZsb2F0ICpfX1AsIF9fbTEyOCBfX0EpCit7CisgIF9tbV9zdG9yZTFfcHMgKF9fUCwgX19BKTsKK30KKworLyogU3RvcmUgZm91ciBTUEZQIHZhbHVlcyBpbiByZXZlcnNlIG9yZGVyLiAgVGhlIGFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3Jlcl9wcyAoZmxvYXQgKl9fUCwgX19tMTI4IF9fQSkKK3sKKyAgX192NHNmIF9fdmEgPSAoX192NHNmKV9fQTsKKyAgX192NHNmIF9fdG1wID0gX19idWlsdGluX2lhMzJfc2h1ZnBzIChfX3ZhLCBfX3ZhLCBfTU1fU0hVRkZMRSAoMCwxLDIsMykpOworICBfbW1fc3RvcmVfcHMgKF9fUCwgX190bXApOworfQorCisvKiBTZXRzIHRoZSBsb3cgU1BGUCB2YWx1ZSBvZiBBIGZyb20gdGhlIGxvdyB2YWx1ZSBvZiBCLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZV9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21vdnNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBFeHRyYWN0cyBvbmUgb2YgdGhlIGZvdXIgd29yZHMgb2YgQS4gIFRoZSBzZWxlY3RvciBOIG11c3QgYmUgaW1tZWRpYXRlLiAgKi8KKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZXh0cmFjdF9waTE2IChfX202NCBjb25zdCBfX0EsIGludCBjb25zdCBfX04pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0aGkgKChfX3Y0aGkpX19BLCBfX04pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGV4dHJ3IChfX202NCBjb25zdCBfX0EsIGludCBjb25zdCBfX04pCit7CisgIHJldHVybiBfbW1fZXh0cmFjdF9waTE2IChfX0EsIF9fTik7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fZXh0cmFjdF9waTE2KEEsIE4pCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjRoaSAoKF9fdjRoaSkoX19tNjQpKEEpLCAoaW50KShOKSkpCisKKyNkZWZpbmUgX21fcGV4dHJ3KEEsIE4pIF9tbV9leHRyYWN0X3BpMTYoQSwgTikKKyNlbmRpZgorCisvKiBJbnNlcnRzIHdvcmQgRCBpbnRvIG9uZSBvZiBmb3VyIHdvcmRzIG9mIEEuICBUaGUgc2VsZWN0b3IgTiBtdXN0IGJlCisgICBpbW1lZGlhdGUuICAqLworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2luc2VydF9waTE2IChfX202NCBjb25zdCBfX0EsIGludCBjb25zdCBfX0QsIGludCBjb25zdCBfX04pCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjRoaSAoKF9fdjRoaSlfX0EsIF9fRCwgX19OKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGluc3J3IChfX202NCBjb25zdCBfX0EsIGludCBjb25zdCBfX0QsIGludCBjb25zdCBfX04pCit7CisgIHJldHVybiBfbW1faW5zZXJ0X3BpMTYgKF9fQSwgX19ELCBfX04pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2luc2VydF9waTE2KEEsIEQsIE4pCQkJCVwKKyAgKChfX202NCkgX19idWlsdGluX2lhMzJfdmVjX3NldF92NGhpICgoX192NGhpKShfX202NCkoQSksCVwKKwkJCQkJKGludCkoRCksIChpbnQpKE4pKSkKKworI2RlZmluZSBfbV9waW5zcncoQSwgRCwgTikgX21tX2luc2VydF9waTE2KEEsIEQsIE4pCisjZW5kaWYKKworLyogQ29tcHV0ZSB0aGUgZWxlbWVudC13aXNlIG1heGltdW0gb2Ygc2lnbmVkIDE2LWJpdCB2YWx1ZXMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21heF9waTE2IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcG1heHN3ICgoX192NGhpKV9fQSwgKF9fdjRoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wbWF4c3cgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gX21tX21heF9waTE2IChfX0EsIF9fQik7Cit9CisKKy8qIENvbXB1dGUgdGhlIGVsZW1lbnQtd2lzZSBtYXhpbXVtIG9mIHVuc2lnbmVkIDgtYml0IHZhbHVlcy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWF4X3B1OCAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BtYXh1YiAoKF9fdjhxaSlfX0EsIChfX3Y4cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcG1heHViIChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIF9tbV9tYXhfcHU4IChfX0EsIF9fQik7Cit9CisKKy8qIENvbXB1dGUgdGhlIGVsZW1lbnQtd2lzZSBtaW5pbXVtIG9mIHNpZ25lZCAxNi1iaXQgdmFsdWVzLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fcGkxNiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BtaW5zdyAoKF9fdjRoaSlfX0EsIChfX3Y0aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcG1pbnN3IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIF9tbV9taW5fcGkxNiAoX19BLCBfX0IpOworfQorCisvKiBDb21wdXRlIHRoZSBlbGVtZW50LXdpc2UgbWluaW11bSBvZiB1bnNpZ25lZCA4LWJpdCB2YWx1ZXMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21pbl9wdTggKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wbWludWIgKChfX3Y4cWkpX19BLCAoX192OHFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BtaW51YiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiBfbW1fbWluX3B1OCAoX19BLCBfX0IpOworfQorCisvKiBDcmVhdGUgYW4gOC1iaXQgbWFzayBvZiB0aGUgc2lnbnMgb2YgOC1iaXQgdmFsdWVzLiAgKi8KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZW1hc2tfcGk4IChfX202NCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wbW92bXNrYiAoKF9fdjhxaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcG1vdm1za2IgKF9fbTY0IF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9tb3ZlbWFza19waTggKF9fQSk7Cit9CisKKy8qIE11bHRpcGx5IGZvdXIgdW5zaWduZWQgMTYtYml0IHZhbHVlcyBpbiBBIGJ5IGZvdXIgdW5zaWduZWQgMTYtYml0IHZhbHVlcworICAgaW4gQiBhbmQgcHJvZHVjZSB0aGUgaGlnaCAxNiBiaXRzIG9mIHRoZSAzMi1iaXQgcmVzdWx0cy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsaGlfcHUxNiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BtdWxodXcgKChfX3Y0aGkpX19BLCAoX192NGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BtdWxodXcgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gX21tX211bGhpX3B1MTYgKF9fQSwgX19CKTsKK30KKworLyogUmV0dXJuIGEgY29tYmluYXRpb24gb2YgdGhlIGZvdXIgMTYtYml0IHZhbHVlcyBpbiBBLiAgVGhlIHNlbGVjdG9yCisgICBtdXN0IGJlIGFuIGltbWVkaWF0ZS4gICovCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2h1ZmZsZV9waTE2IChfX202NCBfX0EsIGludCBjb25zdCBfX04pCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzaHVmdyAoKF9fdjRoaSlfX0EsIF9fTik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzaHVmdyAoX19tNjQgX19BLCBpbnQgY29uc3QgX19OKQoreworICByZXR1cm4gX21tX3NodWZmbGVfcGkxNiAoX19BLCBfX04pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX3NodWZmbGVfcGkxNihBLCBOKSBcCisgICgoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzaHVmdyAoKF9fdjRoaSkoX19tNjQpKEEpLCAoaW50KShOKSkpCisKKyNkZWZpbmUgX21fcHNodWZ3KEEsIE4pIF9tbV9zaHVmZmxlX3BpMTYgKEEsIE4pCisjZW5kaWYKKworLyogQ29uZGl0aW9uYWxseSBzdG9yZSBieXRlIGVsZW1lbnRzIG9mIEEgaW50byBQLiAgVGhlIGhpZ2ggYml0IG9mIGVhY2gKKyAgIGJ5dGUgaW4gdGhlIHNlbGVjdG9yIE4gZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIGJ5dGUgZnJvbQorICAgQSBpcyBzdG9yZWQuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza21vdmVfc2k2NCAoX19tNjQgX19BLCBfX202NCBfX04sIGNoYXIgKl9fUCkKK3sKKyAgX19idWlsdGluX2lhMzJfbWFza21vdnEgKChfX3Y4cWkpX19BLCAoX192OHFpKV9fTiwgX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9tYXNrbW92cSAoX19tNjQgX19BLCBfX202NCBfX04sIGNoYXIgKl9fUCkKK3sKKyAgX21tX21hc2ttb3ZlX3NpNjQgKF9fQSwgX19OLCBfX1ApOworfQorCisvKiBDb21wdXRlIHRoZSByb3VuZGVkIGF2ZXJhZ2VzIG9mIHRoZSB1bnNpZ25lZCA4LWJpdCB2YWx1ZXMgaW4gQSBhbmQgQi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYXZnX3B1OCAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhdmdiICgoX192OHFpKV9fQSwgKF9fdjhxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYXZnYiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiBfbW1fYXZnX3B1OCAoX19BLCBfX0IpOworfQorCisvKiBDb21wdXRlIHRoZSByb3VuZGVkIGF2ZXJhZ2VzIG9mIHRoZSB1bnNpZ25lZCAxNi1iaXQgdmFsdWVzIGluIEEgYW5kIEIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2F2Z19wdTE2IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGF2Z3cgKChfX3Y0aGkpX19BLCAoX192NGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3Bhdmd3IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIF9tbV9hdmdfcHUxNiAoX19BLCBfX0IpOworfQorCisvKiBDb21wdXRlIHRoZSBzdW0gb2YgdGhlIGFic29sdXRlIGRpZmZlcmVuY2VzIG9mIHRoZSB1bnNpZ25lZCA4LWJpdAorICAgdmFsdWVzIGluIEEgYW5kIEIuICBSZXR1cm4gdGhlIHZhbHVlIGluIHRoZSBsb3dlciAxNi1iaXQgd29yZDsgdGhlCisgICB1cHBlciB3b3JkcyBhcmUgY2xlYXJlZC4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2FkX3B1OCAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzYWRidyAoKF9fdjhxaSlfX0EsIChfX3Y4cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNhZGJ3IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIF9tbV9zYWRfcHU4IChfX0EsIF9fQik7Cit9CisKKy8qIExvYWRzIG9uZSBjYWNoZSBsaW5lIGZyb20gYWRkcmVzcyBQIHRvIGEgbG9jYXRpb24gImNsb3NlciIgdG8gdGhlCisgICBwcm9jZXNzb3IuICBUaGUgc2VsZWN0b3IgSSBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgcHJlZmV0Y2ggb3BlcmF0aW9uLiAgKi8KKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3ByZWZldGNoIChjb25zdCB2b2lkICpfX1AsIGVudW0gX21tX2hpbnQgX19JKQoreworICBfX2J1aWx0aW5fcHJlZmV0Y2ggKF9fUCwgMCwgX19JKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9wcmVmZXRjaChQLCBJKSBcCisgIF9fYnVpbHRpbl9wcmVmZXRjaCAoKFApLCAwLCAoSSkpCisjZW5kaWYKKworLyogU3RvcmVzIHRoZSBkYXRhIGluIEEgdG8gdGhlIGFkZHJlc3MgUCB3aXRob3V0IHBvbGx1dGluZyB0aGUgY2FjaGVzLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0cmVhbV9waSAoX19tNjQgKl9fUCwgX19tNjQgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZudHEgKCh1bnNpZ25lZCBsb25nIGxvbmcgKilfX1AsICh1bnNpZ25lZCBsb25nIGxvbmcpX19BKTsKK30KKworLyogTGlrZXdpc2UuICBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdHJlYW1fcHMgKGZsb2F0ICpfX1AsIF9fbTEyOCBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vdm50cHMgKF9fUCwgKF9fdjRzZilfX0EpOworfQorCisvKiBHdWFyYW50ZWVzIHRoYXQgZXZlcnkgcHJlY2VkaW5nIHN0b3JlIGlzIGdsb2JhbGx5IHZpc2libGUgYmVmb3JlCisgICBhbnkgc3Vic2VxdWVudCBzdG9yZS4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZmVuY2UgKHZvaWQpCit7CisgIF9fYnVpbHRpbl9pYTMyX3NmZW5jZSAoKTsKK30KKworLyogVGhlIGV4ZWN1dGlvbiBvZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpcyBkZWxheWVkIGJ5IGFuIGltcGxlbWVudGF0aW9uCisgICBzcGVjaWZpYyBhbW91bnQgb2YgdGltZS4gIFRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtb2RpZnkgdGhlCisgICBhcmNoaXRlY3R1cmFsIHN0YXRlLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3BhdXNlICh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl9wYXVzZSAoKTsKK30KKworLyogVHJhbnNwb3NlIHRoZSA0eDQgbWF0cml4IGNvbXBvc2VkIG9mIHJvd1swLTNdLiAgKi8KKyNkZWZpbmUgX01NX1RSQU5TUE9TRTRfUFMocm93MCwgcm93MSwgcm93Miwgcm93MykJCQlcCitkbyB7CQkJCQkJCQkJXAorICBfX3Y0c2YgX19yMCA9IChyb3cwKSwgX19yMSA9IChyb3cxKSwgX19yMiA9IChyb3cyKSwgX19yMyA9IChyb3czKTsJXAorICBfX3Y0c2YgX190MCA9IF9fYnVpbHRpbl9pYTMyX3VucGNrbHBzIChfX3IwLCBfX3IxKTsJCQlcCisgIF9fdjRzZiBfX3QxID0gX19idWlsdGluX2lhMzJfdW5wY2tscHMgKF9fcjIsIF9fcjMpOwkJCVwKKyAgX192NHNmIF9fdDIgPSBfX2J1aWx0aW5faWEzMl91bnBja2hwcyAoX19yMCwgX19yMSk7CQkJXAorICBfX3Y0c2YgX190MyA9IF9fYnVpbHRpbl9pYTMyX3VucGNraHBzIChfX3IyLCBfX3IzKTsJCQlcCisgIChyb3cwKSA9IF9fYnVpbHRpbl9pYTMyX21vdmxocHMgKF9fdDAsIF9fdDEpOwkJCQlcCisgIChyb3cxKSA9IF9fYnVpbHRpbl9pYTMyX21vdmhscHMgKF9fdDEsIF9fdDApOwkJCQlcCisgIChyb3cyKSA9IF9fYnVpbHRpbl9pYTMyX21vdmxocHMgKF9fdDIsIF9fdDMpOwkJCQlcCisgIChyb3czKSA9IF9fYnVpbHRpbl9pYTMyX21vdmhscHMgKF9fdDMsIF9fdDIpOwkJCQlcCit9IHdoaWxlICgwKQorCisvKiBGb3IgYmFja3dhcmQgc291cmNlIGNvbXBhdGliaWxpdHkuICAqLworI2lmZGVmIF9fU1NFMl9fCisjIGluY2x1ZGUgPGVtbWludHJpbi5oPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NTRV9fICovCisjZW5kaWYgLyogX1hNTUlOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94b3BpbnRyaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3hvcGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTk5YTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94b3BpbnRyaW4uaApAQCAtMCwwICsxLDgzOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX1g4NklOVFJJTl9IX0lOQ0xVREVECisjIGVycm9yICJOZXZlciB1c2UgPHhvcGludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX1hPUE1NSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX1hPUE1NSU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX1hPUF9fCisjIGVycm9yICJYT1AgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2Vsc2UKKworI2luY2x1ZGUgPGZtYTRpbnRyaW4uaD4KKworLyogSW50ZWdlciBtdWx0aXBseS9hZGQgaW50cnVjdGlvbnMuICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjc19lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3N3dyAoKF9fdjhoaSlfX0EsKF9fdjhoaSlfX0IsIChfX3Y4aGkpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFjY19lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3d3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IsIChfX3Y4aGkpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFjY3NkX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3N3ZCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CLCAoX192NHNpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2NkX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3dkICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IsIChfX3Y0c2kpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFjY3NfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBtYWNzc2RkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IsIChfX3Y0c2kpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFjY19lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hY3NkZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CLCAoX192NHNpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2NzbG9fZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBtYWNzc2RxbCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CLCAoX192MmRpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2Nsb19lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hY3NkcWwgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQiwgKF9fdjJkaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjc2hpX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3NkcWggKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQiwgKF9fdjJkaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjaGlfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBtYWNzZHFoICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IsIChfX3YyZGkpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFkZHNkX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFkY3Nzd2QgKChfX3Y4aGkpX19BLChfX3Y4aGkpX19CLChfX3Y0c2kpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFkZGRfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBtYWRjc3dkICgoX192OGhpKV9fQSwoX192OGhpKV9fQiwoX192NHNpKV9fQyk7Cit9CisKKy8qIFBhY2tlZCBJbnRlZ2VyIEhvcml6b250YWwgQWRkIGFuZCBTdWJ0cmFjdCAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZHdfZXBpOChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoYWRkYncgKChfX3YxNnFpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRkX2VwaTgoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZGJkICgoX192MTZxaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkcV9lcGk4KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhhZGRicSAoKF9fdjE2cWkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZGRfZXBpMTYoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHdkICgoX192OGhpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRxX2VwaTE2KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhhZGR3cSAoKF9fdjhoaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkcV9lcGkzMihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoYWRkZHEgKChfX3Y0c2kpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZHdfZXB1OChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoYWRkdWJ3ICgoX192MTZxaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkZF9lcHU4KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhhZGR1YmQgKChfX3YxNnFpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRxX2VwdTgoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHVicSAoKF9fdjE2cWkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZGRfZXB1MTYoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHV3ZCAoKF9fdjhoaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkcV9lcHUxNihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoYWRkdXdxICgoX192OGhpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRxX2VwdTMyKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhhZGR1ZHEgKChfX3Y0c2kpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faHN1YndfZXBpOChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoc3ViYncgKChfX3YxNnFpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hzdWJkX2VwaTE2KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhzdWJ3ZCAoKF9fdjhoaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oc3VicV9lcGkzMihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoc3ViZHEgKChfX3Y0c2kpX19BKTsKK30KKworLyogVmVjdG9yIGNvbmRpdGlvbmFsIG1vdmUgYW5kIHBlcm11dGUgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21vdl9zaTEyOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNtb3YgKF9fQSwgX19CLCBfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wZXJtX2VwaTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBwZXJtICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQiwgKF9fdjE2cWkpX19DKTsKK30KKworLyogUGFja2VkIEludGVnZXIgUm90YXRlcyBhbmQgU2hpZnRzCisgICBSb3RhdGVzIC0gTm9uLUltbWVkaWF0ZSBmb3JtICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JvdF9lcGk4KF9fbTEyOGkgX19BLCAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwcm90YiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yb3RfZXBpMTYoX19tMTI4aSBfX0EsICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnByb3R3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yb3RfZXBpMzIoX19tMTI4aSBfX0EsICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnByb3RkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yb3RfZXBpNjQoX19tMTI4aSBfX0EsICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSAgX19idWlsdGluX2lhMzJfdnByb3RxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCisvKiBSb3RhdGVzIC0gSW1tZWRpYXRlIGZvcm0gKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcm90aV9lcGk4KF9fbTEyOGkgX19BLCBjb25zdCBpbnQgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHJvdGJpICgoX192MTZxaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JvdGlfZXBpMTYoX19tMTI4aSBfX0EsIGNvbnN0IGludCBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwcm90d2kgKChfX3Y4aGkpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yb3RpX2VwaTMyKF9fbTEyOGkgX19BLCBjb25zdCBpbnQgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHJvdGRpICgoX192NHNpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcm90aV9lcGk2NChfX20xMjhpIF9fQSwgY29uc3QgaW50IF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnByb3RxaSAoKF9fdjJkaSlfX0EsIF9fQik7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fcm90aV9lcGk4KEEsIE4pIFwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHJvdGJpICgoX192MTZxaSkoX19tMTI4aSkoQSksIChpbnQpKE4pKSkKKyNkZWZpbmUgX21tX3JvdGlfZXBpMTYoQSwgTikgXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwcm90d2kgKChfX3Y4aGkpKF9fbTEyOGkpKEEpLCAoaW50KShOKSkpCisjZGVmaW5lIF9tbV9yb3RpX2VwaTMyKEEsIE4pIFwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHJvdGRpICgoX192NHNpKShfX20xMjhpKShBKSwgKGludCkoTikpKQorI2RlZmluZSBfbW1fcm90aV9lcGk2NChBLCBOKSBcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnByb3RxaSAoKF9fdjJkaSkoX19tMTI4aSkoQSksIChpbnQpKE4pKSkKKyNlbmRpZgorCisvKiBTaGlmdHMgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2hsX2VwaTgoX19tMTI4aSBfX0EsICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBzaGxiICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NobF9lcGkxNihfX20xMjhpIF9fQSwgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHNobHcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NobF9lcGkzMihfX20xMjhpIF9fQSwgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHNobGQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NobF9lcGk2NChfX20xMjhpIF9fQSwgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHNobHEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2hhX2VwaTgoX19tMTI4aSBfX0EsICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBzaGFiICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NoYV9lcGkxNihfX20xMjhpIF9fQSwgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHNoYXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NoYV9lcGkzMihfX20xMjhpIF9fQSwgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHNoYWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NoYV9lcGk2NChfX20xMjhpIF9fQSwgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHNoYXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKKy8qIENvbXBhcmUgYW5kIFByZWRpY2F0ZSBHZW5lcmF0aW9uCisgICBwY29tIChpbnRlZ2VyLCB1bnNpbmdlZCBieXRlcykgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbHRfZXB1OChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sdHViICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWxlX2VwdTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbGV1YiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21ndF9lcHU4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWd0dWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ2VfZXB1OChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21nZXViICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWVxX2VwdTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZXF1YiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21uZXFfZXB1OChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21uZXF1YiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21mYWxzZV9lcHU4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWZhbHNldWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tdHJ1ZV9lcHU4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbXRydWV1YiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCisvKnBjb20gKGludGVnZXIsIHVuc2luZ2VkIHdvcmRzKSAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sdF9lcHUxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sdHV3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sZV9lcHUxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sZXV3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21ndF9lcHUxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21ndHV3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21nZV9lcHUxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21nZXV3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21lcV9lcHUxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21lcXV3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21uZXFfZXB1MTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbmVxdXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWZhbHNlX2VwdTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWZhbHNldXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbXRydWVfZXB1MTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tdHJ1ZXV3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCisvKnBjb20gKGludGVnZXIsIHVuc2luZ2VkIGRvdWJsZSB3b3JkcykgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbHRfZXB1MzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbHR1ZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbGVfZXB1MzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbGV1ZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ3RfZXB1MzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ3R1ZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ2VfZXB1MzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ2V1ZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZXFfZXB1MzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZXF1ZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbmVxX2VwdTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbW5lcXVkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21mYWxzZV9lcHUzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21mYWxzZXVkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb210cnVlX2VwdTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbXRydWV1ZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworLypwY29tIChpbnRlZ2VyLCB1bnNpbmdlZCBxdWFkIHdvcmRzKSAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sdF9lcHU2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sdHVxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sZV9lcHU2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sZXVxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21ndF9lcHU2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21ndHVxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21nZV9lcHU2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21nZXVxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21lcV9lcHU2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21lcXVxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21uZXFfZXB1NjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbmVxdXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWZhbHNlX2VwdTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWZhbHNldXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbXRydWVfZXB1NjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tdHJ1ZXVxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCisvKnBjb20gKGludGVnZXIsIHNpZ25lZCBieXRlcykgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbHRfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sdGIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbGVfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sZWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ3RfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21ndGIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ2VfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21nZWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZXFfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21lcWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbmVxX2VwaTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbmVxYiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21mYWxzZV9lcGk4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWZhbHNlYiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb210cnVlX2VwaTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tdHJ1ZWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworLypwY29tIChpbnRlZ2VyLCBzaWduZWQgd29yZHMpICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWx0X2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWx0dyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbGVfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbGV3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21ndF9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21ndHcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWdlX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWdldyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZXFfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZXF3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21uZXFfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbmVxdyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZmFsc2VfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZmFsc2V3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb210cnVlX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbXRydWV3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCisvKnBjb20gKGludGVnZXIsIHNpZ25lZCBkb3VibGUgd29yZHMpICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWx0X2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWx0ZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbGVfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbGVkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21ndF9lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21ndGQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWdlX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWdlZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZXFfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZXFkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21uZXFfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbmVxZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZmFsc2VfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZmFsc2VkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb210cnVlX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbXRydWVkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCisvKnBjb20gKGludGVnZXIsIHNpZ25lZCBxdWFkIHdvcmRzKSAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sdF9lcGk2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sdHEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWxlX2VwaTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWxlcSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ3RfZXBpNjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ3RxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21nZV9lcGk2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21nZXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWVxX2VwaTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWVxcSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbmVxX2VwaTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbW5lcXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWZhbHNlX2VwaTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWZhbHNlcSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tdHJ1ZV9lcGk2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb210cnVlcSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworLyogRlJDWiAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZyY3pfcHMgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92ZnJjenBzICgoX192NHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZyY3pfcGQgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmcmN6cGQgKChfX3YyZGYpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mcmN6X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbW92c3MgKChfX3Y0c2YpX19BLAorCQkJCQkoX192NHNmKQorCQkJCQlfX2J1aWx0aW5faWEzMl92ZnJjenNzICgoX192NHNmKV9fQikpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mcmN6X3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbW92c2QgKChfX3YyZGYpX19BLAorCQkJCQkgKF9fdjJkZikKKwkJCQkJIF9fYnVpbHRpbl9pYTMyX3ZmcmN6c2QgKChfX3YyZGYpX19CKSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZnJjel9wcyAoX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZmcmN6cHMyNTYgKChfX3Y4c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZnJjel9wZCAoX19tMjU2ZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmZyY3pwZDI1NiAoKF9fdjRkZilfX0EpOworfQorCisvKiBQRVJNSUwyICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Blcm11dGUyX3BkIChfX20xMjhkIF9fWCwgX19tMTI4ZCBfX1ksIF9fbTEyOGkgX19DLCBjb25zdCBpbnQgX19JKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycGQgKChfX3YyZGYpX19YLAorCQkJCQkgICAgICAoX192MmRmKV9fWSwKKwkJCQkJICAgICAgKF9fdjJkaSlfX0MsCisJCQkJCSAgICAgIF9fSSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGUyX3BkIChfX20yNTZkIF9fWCwgX19tMjU2ZCBfX1ksIF9fbTI1NmkgX19DLCBjb25zdCBpbnQgX19JKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycGQyNTYgKChfX3Y0ZGYpX19YLAorCQkJCQkJIChfX3Y0ZGYpX19ZLAorCQkJCQkJIChfX3Y0ZGkpX19DLAorCQkJCQkJIF9fSSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcGVybXV0ZTJfcHMgKF9fbTEyOCBfX1gsIF9fbTEyOCBfX1ksIF9fbTEyOGkgX19DLCBjb25zdCBpbnQgX19JKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdnBlcm1pbDJwcyAoKF9fdjRzZilfX1gsCisJCQkJCSAgICAgKF9fdjRzZilfX1ksCisJCQkJCSAgICAgKF9fdjRzaSlfX0MsCisJCQkJCSAgICAgX19JKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wZXJtdXRlMl9wcyAoX19tMjU2IF9fWCwgX19tMjU2IF9fWSwgX19tMjU2aSBfX0MsIGNvbnN0IGludCBfX0kpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92cGVybWlsMnBzMjU2ICgoX192OHNmKV9fWCwKKwkJCQkJCShfX3Y4c2YpX19ZLAorCQkJCQkJKF9fdjhzaSlfX0MsCisJCQkJCQlfX0kpOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX3Blcm11dGUyX3BkKFgsIFksIEMsIEkpCQkJCQlcCisgICgoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdnBlcm1pbDJwZCAoKF9fdjJkZikoX19tMTI4ZCkoWCksCQlcCisJCQkJCShfX3YyZGYpKF9fbTEyOGQpKFkpLAkJXAorCQkJCQkoX192MmRpKShfX20xMjhkKShDKSwJCVwKKwkJCQkJKGludCkoSSkpKQorCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRlMl9wZChYLCBZLCBDLCBJKQkJCQkJXAorICAoKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycGQyNTYgKChfX3Y0ZGYpKF9fbTI1NmQpKFgpLAlcCisJCQkJCSAgIChfX3Y0ZGYpKF9fbTI1NmQpKFkpLAlcCisJCQkJCSAgIChfX3Y0ZGkpKF9fbTI1NmQpKEMpLAlcCisJCQkJCSAgIChpbnQpKEkpKSkKKworI2RlZmluZSBfbW1fcGVybXV0ZTJfcHMoWCwgWSwgQywgSSkJCQkJCVwKKyAgKChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycHMgKChfX3Y0c2YpKF9fbTEyOCkoWCksCQlcCisJCQkJICAgICAgIChfX3Y0c2YpKF9fbTEyOCkoWSksCQlcCisJCQkJICAgICAgIChfX3Y0c2kpKF9fbTEyOCkoQyksCQlcCisJCQkJICAgICAgIChpbnQpKEkpKSkKKworI2RlZmluZSBfbW0yNTZfcGVybXV0ZTJfcHMoWCwgWSwgQywgSSkJCQkJCVwKKyAgKChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycHMyNTYgKChfX3Y4c2YpKF9fbTI1NikoWCksCQlcCisJCQkJCSAgKF9fdjhzZikoX19tMjU2KShZKSwgIAlcCisJCQkJCSAgKF9fdjhzaSkoX19tMjU2KShDKSwJCVwKKyAJCQkJCSAgKGludCkoSSkpKQorI2VuZGlmIC8qIF9fT1BUSU1JWkVfXyAqLworCisjZW5kaWYgLyogX19YT1BfXyAqLworCisjZW5kaWYgLyogX1hPUE1NSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3hzYXZlaW50cmluLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94c2F2ZWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjY1ODkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94c2F2ZWludHJpbi5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiAjaWYgIWRlZmluZWQgX1g4NklOVFJJTl9IX0lOQ0xVREVEICYmICFkZWZpbmVkIF9JTU1JTlRSSU5fSF9JTkNMVURFRCAqLworLyogIyBlcnJvciAiTmV2ZXIgdXNlIDx4c2F2ZWludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IGluc3RlYWQuIiAqLworLyogI2VuZGlmICovCisKKyNpZm5kZWYgX1hTQVZFSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX1hTQVZFSU5UUklOX0hfSU5DTFVERUQKKworZXh0ZXJuIF9faW5saW5lIHZvaWQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3hzYXZlICh2b2lkICpfX1AsIGxvbmcgbG9uZyBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl94c2F2ZSAoX19QLCBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfeHJzdG9yICh2b2lkICpfX1AsIGxvbmcgbG9uZyBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl94cnN0b3IgKF9fUCwgX19NKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK194c2F2ZTY0ICh2b2lkICpfX1AsIGxvbmcgbG9uZyBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl94c2F2ZTY0IChfX1AsIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK194cnN0b3I2NCAodm9pZCAqX19QLCBsb25nIGxvbmcgX19NKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfeHJzdG9yNjQgKF9fUCwgX19NKTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1hTQVZFSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3hzYXZlb3B0aW50cmluLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94c2F2ZW9wdGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNzNlMzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94c2F2ZW9wdGludHJpbi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiAjaWYgIWRlZmluZWQgX1g4NklOVFJJTl9IX0lOQ0xVREVEICYmICFkZWZpbmVkIF9JTU1JTlRSSU5fSF9JTkNMVURFRCAqLworLyogIyBlcnJvciAiTmV2ZXIgdXNlIDx4c2F2ZW9wdGludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IGluc3RlYWQuIiAqLworLyogI2VuZGlmICovCisKKyNpZm5kZWYgX1hTQVZFT1BUSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX1hTQVZFT1BUSU5UUklOX0hfSU5DTFVERUQKKworZXh0ZXJuIF9faW5saW5lIHZvaWQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3hzYXZlb3B0ICh2b2lkICpfX1AsIGxvbmcgbG9uZyBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl94c2F2ZW9wdCAoX19QLCBfX00pOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIHZvaWQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3hzYXZlb3B0NjQgKHZvaWQgKl9fUCwgbG9uZyBsb25nIF9fTSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3hzYXZlb3B0NjQgKF9fUCwgX19NKTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1hTQVZFT1BUSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3h0ZXN0aW50cmluLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94dGVzdGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MmZiN2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94dGVzdGludHJpbi5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9JTU1JTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDx4dGVzdGludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8aW1taW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19SVE1fXworIyBlcnJvciAiUlRNIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbmRpZiAvKiBfX1JUTV9fICovCisKKyNpZm5kZWYgX1hURVNUSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX1hURVNUSU5UUklOX0hfSU5DTFVERUQKKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBpbnN0cnVjdGlvbiBleGVjdXRlcyBpbnNpZGUgYW4gUlRNIG9yIEhMRSBjb2RlCisgICByZWdpb24uICBSZXR1cm4gemVybyBvdGhlcndpc2UuICAgKi8KK2V4dGVybiBfX2lubGluZSBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3h0ZXN0ICh2b2lkKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfeHRlc3QgKCk7Cit9CisKKyNlbmRpZiAvKiBfWFRFU1RJTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvZml4aW5jX2xpc3QgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9maXhpbmNfbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTJiYzJiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvZml4aW5jX2xpc3QKQEAgLTAsMCArMSBAQAorOwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvZ3N5c2xpbWl0cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvZ3N5c2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjI4MDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9nc3lzbGltaXRzLmgKQEAgLTAsMCArMSw4IEBACisvKiBzeXNsaW1pdHMuaCBzdGFuZHMgZm9yIHRoZSBzeXN0ZW0ncyBvd24gbGltaXRzLmggZmlsZS4KKyAgIElmIHdlIGNhbiB1c2UgaXQgb2sgdW5tb2RpZmllZCwgdGhlbiB3ZSBpbnN0YWxsIHRoaXMgdGV4dC4KKyAgIElmIGZpeGluY2x1ZGVzIGZpeGVzIGl0LCB0aGVuIHRoZSBmaXhlZCB2ZXJzaW9uIGlzIGluc3RhbGxlZAorICAgaW5zdGVhZCBvZiB0aGlzIHRleHQuICAqLworCisjZGVmaW5lIF9HQ0NfTkVYVF9MSU1JVFNfSAkJLyogdGVsbCBnY2MncyBsaW1pdHMuaCB0byByZWN1cnNlICovCisjaW5jbHVkZV9uZXh0IDxsaW1pdHMuaD4KKyN1bmRlZiBfR0NDX05FWFRfTElNSVRTX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL2luY2x1ZGUvUkVBRE1FIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvaW5jbHVkZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4NmE3NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL2luY2x1ZGUvUkVBRE1FCkBAIC0wLDAgKzEsMTQgQEAKK1RoaXMgUkVBRE1FIGZpbGUgaXMgY29waWVkIGludG8gdGhlIGRpcmVjdG9yeSBmb3IgR0NDLW9ubHkgaGVhZGVyIGZpbGVzCit3aGVuIGZpeGluY2x1ZGVzIGlzIHJ1biBieSB0aGUgbWFrZWZpbGUgZm9yIEdDQy4KKworTWFueSBvZiB0aGUgZmlsZXMgaW4gdGhpcyBkaXJlY3Rvcnkgd2VyZSBhdXRvbWF0aWNhbGx5IGVkaXRlZCBmcm9tIHRoZQorc3RhbmRhcmQgc3lzdGVtIGhlYWRlciBmaWxlcyBieSB0aGUgZml4aW5jbHVkZXMgcHJvY2Vzcy4gIFRoZXkgYXJlCitzeXN0ZW0tc3BlY2lmaWMsIGFuZCB3aWxsIG5vdCB3b3JrIG9uIGFueSBvdGhlciBraW5kIG9mIHN5c3RlbS4gIFRoZXkKK2FyZSBhbHNvIG5vdCBwYXJ0IG9mIEdDQy4gIFRoZSByZWFzb24gd2UgaGF2ZSB0byBkbyB0aGlzIGlzIGJlY2F1c2UKK0dDQyByZXF1aXJlcyBBTlNJIEMgaGVhZGVycyBhbmQgbWFueSB2ZW5kb3JzIHN1cHBseSBBTlNJLWluY29tcGF0aWJsZQoraGVhZGVycy4KKworQmVjYXVzZSB0aGlzIGlzIGFuIGF1dG9tYXRlZCBwcm9jZXNzLCBzb21ldGltZXMgaGVhZGVycyBnZXQgImZpeGVkIgordGhhdCBkbyBub3QsIHN0cmljdGx5IHNwZWFraW5nLCBuZWVkIGEgZml4LiAgQXMgbG9uZyBhcyBub3RoaW5nIGlzIGJyb2tlbgorYnkgdGhlIHByb2Nlc3MsIGl0IGlzIGp1c3QgYW4gdW5mb3J0dW5hdGUgY29sbGF0ZXJhbCBpbmNvbnZlbmllbmNlLgorV2Ugd291bGQgbGlrZSB0byByZWN0aWZ5IGl0LCBpZiBpdCBpcyBub3QgInRvbyBpbmNvbnZlbmllbnQiLgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvaW5jbHVkZS9saW1pdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL2luY2x1ZGUvbGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0MGE4OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL2luY2x1ZGUvbGltaXRzLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5Mi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBUaGlzIGFkbWluaXN0cml2aWEgZ2V0cyBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIGxpbWl0cy5oCisgICBpZiB0aGUgc3lzdGVtIGhhcyBpdHMgb3duIHZlcnNpb24gb2YgbGltaXRzLmguICAqLworCisvKiBXZSB1c2UgX0dDQ19MSU1JVFNfSF8gYmVjYXVzZSB3ZSB3YW50IHRoaXMgbm90IHRvIG1hdGNoCisgICBhbnkgbWFjcm9zIHRoYXQgdGhlIHN5c3RlbSdzIGxpbWl0cy5oIHVzZXMgZm9yIGl0cyBvd24gcHVycG9zZXMuICAqLworI2lmbmRlZiBfR0NDX0xJTUlUU19IXyAgLyogVGVybWluYXRlZCBpbiBsaW1pdHkuaC4gICovCisjZGVmaW5lIF9HQ0NfTElNSVRTX0hfCisKKyNpZm5kZWYgX0xJQkNfTElNSVRTX0hfCisvKiBVc2UgIi4uLiIgc28gdGhhdCB3ZSBmaW5kIHN5c2xpbWl0cy5oIG9ubHkgaW4gdGhpcyBzYW1lIGRpcmVjdG9yeS4gICovCisjaW5jbHVkZSAic3lzbGltaXRzLmgiCisjZW5kaWYKKy8qIENvcHlyaWdodCAoQykgMTk5MS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9MSU1JVFNfSF9fXworI2RlZmluZSBfTElNSVRTX0hfX18KKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBgY2hhcicuICAqLworI3VuZGVmIENIQVJfQklUCisjZGVmaW5lIENIQVJfQklUIF9fQ0hBUl9CSVRfXworCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBhIG11bHRpYnl0ZSBjaGFyYWN0ZXIuICAqLworI2lmbmRlZiBNQl9MRU5fTUFYCisjZGVmaW5lIE1CX0xFTl9NQVggMQorI2VuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBjaGFyJyBjYW4gaG9sZC4gICovCisjdW5kZWYgU0NIQVJfTUlOCisjZGVmaW5lIFNDSEFSX01JTiAoLVNDSEFSX01BWCAtIDEpCisjdW5kZWYgU0NIQVJfTUFYCisjZGVmaW5lIFNDSEFSX01BWCBfX1NDSEFSX01BWF9fCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGNoYXInIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworI3VuZGVmIFVDSEFSX01BWAorI2lmIF9fU0NIQVJfTUFYX18gPT0gX19JTlRfTUFYX18KKyMgZGVmaW5lIFVDSEFSX01BWCAoU0NIQVJfTUFYICogMlUgKyAxVSkKKyNlbHNlCisjIGRlZmluZSBVQ0hBUl9NQVggKFNDSEFSX01BWCAqIDIgKyAxKQorI2VuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYGNoYXInIGNhbiBob2xkLiAgKi8KKyNpZmRlZiBfX0NIQVJfVU5TSUdORURfXworIyB1bmRlZiBDSEFSX01JTgorIyBpZiBfX1NDSEFSX01BWF9fID09IF9fSU5UX01BWF9fCisjICBkZWZpbmUgQ0hBUl9NSU4gMFUKKyMgZWxzZQorIyAgZGVmaW5lIENIQVJfTUlOIDAKKyMgZW5kaWYKKyMgdW5kZWYgQ0hBUl9NQVgKKyMgZGVmaW5lIENIQVJfTUFYIFVDSEFSX01BWAorI2Vsc2UKKyMgdW5kZWYgQ0hBUl9NSU4KKyMgZGVmaW5lIENIQVJfTUlOIFNDSEFSX01JTgorIyB1bmRlZiBDSEFSX01BWAorIyBkZWZpbmUgQ0hBUl9NQVggU0NIQVJfTUFYCisjZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIHNob3J0IGludCcgY2FuIGhvbGQuICAqLworI3VuZGVmIFNIUlRfTUlOCisjZGVmaW5lIFNIUlRfTUlOICgtU0hSVF9NQVggLSAxKQorI3VuZGVmIFNIUlRfTUFYCisjZGVmaW5lIFNIUlRfTUFYIF9fU0hSVF9NQVhfXworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBzaG9ydCBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworI3VuZGVmIFVTSFJUX01BWAorI2lmIF9fU0hSVF9NQVhfXyA9PSBfX0lOVF9NQVhfXworIyBkZWZpbmUgVVNIUlRfTUFYIChTSFJUX01BWCAqIDJVICsgMVUpCisjZWxzZQorIyBkZWZpbmUgVVNIUlRfTUFYIChTSFJUX01BWCAqIDIgKyAxKQorI2VuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBpbnQnIGNhbiBob2xkLiAgKi8KKyN1bmRlZiBJTlRfTUlOCisjZGVmaW5lIElOVF9NSU4gKC1JTlRfTUFYIC0gMSkKKyN1bmRlZiBJTlRfTUFYCisjZGVmaW5lIElOVF9NQVggX19JTlRfTUFYX18KKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDApLiAgKi8KKyN1bmRlZiBVSU5UX01BWAorI2RlZmluZSBVSU5UX01BWCAoSU5UX01BWCAqIDJVICsgMVUpCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBsb25nIGludCcgY2FuIGhvbGQuCisgICAoU2FtZSBhcyBgaW50JykuICAqLworI3VuZGVmIExPTkdfTUlOCisjZGVmaW5lIExPTkdfTUlOICgtTE9OR19NQVggLSAxTCkKKyN1bmRlZiBMT05HX01BWAorI2RlZmluZSBMT05HX01BWCBfX0xPTkdfTUFYX18KKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworI3VuZGVmIFVMT05HX01BWAorI2RlZmluZSBVTE9OR19NQVggKExPTkdfTUFYICogMlVMICsgMVVMKQorCisjaWYgZGVmaW5lZCAoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAqLworIyB1bmRlZiBMTE9OR19NSU4KKyMgZGVmaW5lIExMT05HX01JTiAoLUxMT05HX01BWCAtIDFMTCkKKyMgdW5kZWYgTExPTkdfTUFYCisjIGRlZmluZSBMTE9OR19NQVggX19MT05HX0xPTkdfTUFYX18KKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwKS4gICovCisjIHVuZGVmIFVMTE9OR19NQVgKKyMgZGVmaW5lIFVMTE9OR19NQVggKExMT05HX01BWCAqIDJVTEwgKyAxVUxMKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dOVV9MSUJSQVJZX18pID8gZGVmaW5lZCAoX19VU0VfR05VKSA6ICFkZWZpbmVkIChfX1NUUklDVF9BTlNJX18pCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAqLworIyB1bmRlZiBMT05HX0xPTkdfTUlOCisjIGRlZmluZSBMT05HX0xPTkdfTUlOICgtTE9OR19MT05HX01BWCAtIDFMTCkKKyMgdW5kZWYgTE9OR19MT05HX01BWAorIyBkZWZpbmUgTE9OR19MT05HX01BWCBfX0xPTkdfTE9OR19NQVhfXworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBsb25nIGxvbmcgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDApLiAgKi8KKyMgdW5kZWYgVUxPTkdfTE9OR19NQVgKKyMgZGVmaW5lIFVMT05HX0xPTkdfTUFYIChMT05HX0xPTkdfTUFYICogMlVMTCArIDFVTEwpCisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU1JVFNfSF9fXyAqLworLyogVGhpcyBhZG1pbmlzdHJpdmlhIGdldHMgYWRkZWQgdG8gdGhlIGVuZCBvZiBsaW1pdHMuaAorICAgaWYgdGhlIHN5c3RlbSBoYXMgaXRzIG93biB2ZXJzaW9uIG9mIGxpbWl0cy5oLiAgKi8KKworI2Vsc2UgLyogbm90IF9HQ0NfTElNSVRTX0hfICovCisKKyNpZmRlZiBfR0NDX05FWFRfTElNSVRTX0gKKyNpbmNsdWRlX25leHQgPGxpbWl0cy5oPgkJLyogcmVjdXJzZSBkb3duIHRvIHRoZSByZWFsIG9uZSAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBub3QgX0dDQ19MSU1JVFNfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL21hY3JvX2xpc3QgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9tYWNyb19saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9tYWNyb19saXN0CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9ta2hlYWRlcnMuY29uZiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL21raGVhZGVycy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NmIxZWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9ta2hlYWRlcnMuY29uZgpAQCAtMCwwICsxLDMgQEAKK1NZU1RFTV9IRUFERVJfRElSPSIvdXNyL2xvY2FsL2dvb2dsZS9ob21lL2NoaC93b3JrZGlyL3ByZWNpc2U3LzEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdCR7c3lzcm9vdF9oZWFkZXJzX3N1ZmZpeH0vdXNyL2luY2x1ZGUiCitPVEhFUl9GSVhJTkNMVURFU19ESVJTPSIiCitTVE1QX0ZJWElOQz0ic3RtcC1maXhpbmMiCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvbGliZ2NjLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvbGliZ2NjLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkY2JlYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9saWJnY2MuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvbGliZ2NjX2VoLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvbGliZ2NjX2VoLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViZTUzMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9saWJnY2NfZWguYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvbGliZ2Nvdi5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2xpYmdjb3YuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTRkMDg0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2djYy94ODZfNjQtbGludXgvNC44L2xpYmdjb3YuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvbGliY2xvb2ctaXNsLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvbGliY2xvb2ctaXNsLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3MjY1ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9saWJjbG9vZy1pc2wuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvbGliZ21wLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvbGliZ21wLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkYzJmMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9saWJnbXAuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvbGliaXNsLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvbGliaXNsLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4ZTlkYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9saWJpc2wuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvbGlibXBjLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvbGlibXBjLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhNzM1MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9saWJtcGMuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvbGlibXBmci5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2xpYm1wZnIuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmVjZWZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL2xpYm1wZnIuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvcGtnY29uZmlnL2Nsb29nLWlzbC5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9wa2djb25maWcvY2xvb2ctaXNsLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkM2JiNTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIvcGtnY29uZmlnL2Nsb29nLWlzbC5wYwpAQCAtMCwwICsxLDE4IEBACisjIGdlbmVyYXRlZCBieSBjb25maWd1cmUgLyByZW1vdmUgdGhpcyBsaW5lIHRvIGRpc2FibGUgcmVnZW5lcmF0aW9uCitwcmVmaXg9L3Vzci9sb2NhbC9nb29nbGUvaG9tZS9jaGgvd29ya2Rpci9wcmVjaXNlNy8xL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44CitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2JpbmRpcj0ke2V4ZWNfcHJlZml4fS9iaW4KK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK2RhdGFyb290ZGlyPSR7cHJlZml4fS9zaGFyZQorZGF0YWRpcj0ke2RhdGFyb290ZGlyfQorc3lzY29uZmRpcj0ke3ByZWZpeH0vZXRjCitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCitwYWNrYWdlPWNsb29nLWlzbAorc3VmZml4PQorCitOYW1lOiBjbG9vZy1pc2wKK0Rlc2NyaXB0aW9uOiBjbG9vZy1pc2wgTGlicmFyeQorVmVyc2lvbjogMC4xOC4wCitSZXF1aXJlczogCitMaWJzOiAtTCR7bGliZGlyfSAtTC91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvY2hoL3dvcmtkaXIvcHJlY2lzZTcvMS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIgLWxjbG9vZy1pc2wgLWxnbXAKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1JL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9jaGgvd29ya2Rpci9wcmVjaXNlNy8xL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUgLURDTE9PR19JTlRfR01QPTEKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9wa2djb25maWcvaXNsLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliL3BrZ2NvbmZpZy9pc2wucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3ZmY5OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYi9wa2djb25maWcvaXNsLnBjCkBAIC0wLDAgKzEsMTggQEAKKyMgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZSAvIHJlbW92ZSB0aGlzIGxpbmUgdG8gZGlzYWJsZSByZWdlbmVyYXRpb24KK3ByZWZpeD0vdXNyL2xvY2FsL2dvb2dsZS9ob21lL2NoaC93b3JrZGlyL3ByZWNpc2U3LzEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorYmluZGlyPSR7ZXhlY19wcmVmaXh9L2JpbgorbGliZGlyPSR7ZXhlY19wcmVmaXh9L2xpYgorZGF0YXJvb3RkaXI9JHtwcmVmaXh9L3NoYXJlCitkYXRhZGlyPSR7ZGF0YXJvb3RkaXJ9CitzeXNjb25mZGlyPSR7cHJlZml4fS9ldGMKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK3BhY2thZ2U9aXNsCitzdWZmaXg9CisKK05hbWU6IGlzbAorRGVzY3JpcHRpb246IGlzbCBMaWJyYXJ5CitWZXJzaW9uOiAwLjExLjEKK1JlcXVpcmVzOiAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1ML3Vzci9sb2NhbC9nb29nbGUvaG9tZS9jaGgvd29ya2Rpci9wcmVjaXNlNy8xL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYiAtbGlzbCAtbGdtcAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0gLUkvdXNyL2xvY2FsL2dvb2dsZS9ob21lL2NoaC93b3JrZGlyL3ByZWNpc2U3LzEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvaW5jbHVkZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliNjQvbGliaWJlcnR5LmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWI2NC9saWJpYmVydHkuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmVhMzMwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliNjQvbGliaWJlcnR5LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9jYzEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2NjMQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YTBjNjhjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9jYzEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9jYzFwbHVzIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9jYzFwbHVzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmN2VlODUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2NjMXBsdXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9jb2xsZWN0MiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvY29sbGVjdDIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjJkZTU1OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvY29sbGVjdDIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL2ZpeGluYy5zaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9maXhpbmMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjdiOGQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9maXhpbmMuc2gKQEAgLTAsMCArMSw1MTQgQEAKKyMhL2Jpbi9zaAorIworIyBJbnN0YWxsIG1vZGlmaWVkIHZlcnNpb25zIG9mIGNlcnRhaW4gQU5TSS1pbmNvbXBhdGlibGUgc3lzdGVtIGhlYWRlcgorIyBmaWxlcyB3aGljaCBhcmUgZml4ZWQgdG8gd29yayBjb3JyZWN0bHkgd2l0aCBBTlNJIEMgYW5kIHBsYWNlZCBpbiBhCisjIGRpcmVjdG9yeSB0aGF0IEdDQyB3aWxsIHNlYXJjaC4KKyMKKyMgU2VlIFJFQURNRS1maXhpbmMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjCisjICBmaXhpbmNsdWRlcyBjb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDkKKyMgIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgZml4aW5jbHVkZXMgaXMgZnJlZSBzb2Z0d2FyZS4KKyMgCisjIFlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBmaXhpbmNsdWRlcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisjIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggZml4aW5jbHVkZXM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKyMgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKKworIyBVc2FnZTogZml4aW5jLnNoIG91dHB1dC1kaXIgaW5wdXQtZGlyCisjCisjIERpcmVjdG9yeSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcmVzdWx0cy4KKyMgRmFpbCBpZiBubyBhcmcgdG8gc3BlY2lmeSBhIGRpcmVjdG9yeSBmb3IgdGhlIG91dHB1dC4KK2lmIFsgIngkMSIgPSAieCIgXQordGhlbgorICBlY2hvIGZpeGluY2x1ZGVzOiBubyBvdXRwdXQgZGlyZWN0b3J5IHNwZWNpZmllZAorICBleGl0IDEKK2ZpCisKK0xJQj0kezF9CitzaGlmdAorCisjIE1ha2Ugc3VyZSBpdCBleGlzdHMuCitpZiBbICEgLWQgJExJQiBdOyB0aGVuCisgIG1rZGlyICRMSUIgfHwgeworICAgIGVjaG8gZml4aW5jbHVkZXM6ICBvdXRwdXQgZGlyICdgJyRMSUIiJyBjYW5ub3QgYmUgY3JlYXRlZCIKKyAgICBleGl0IDEKKyAgfQorZWxzZQorICAoIGNkICRMSUIgJiYgdG91Y2ggRE9ORSAmJiBybSBET05FICkgfHwgeworICAgIGVjaG8gZml4aW5jbHVkZXM6ICBvdXRwdXQgZGlyICdgJyRMSUIiJyBpcyBhbiBpbnZhbGlkIGRpcmVjdG9yeSIKKyAgICBleGl0IDEKKyAgfQorZmkKKworaWYgdGVzdCAteiAiJFZFUkJPU0UiCit0aGVuCisgIFZFUkJPU0U9MgorICBleHBvcnQgVkVSQk9TRQorZWxzZQorICBjYXNlICIkVkVSQk9TRSIgaW4KKyAgWzAtOV0gKSA6IDs7CisgICogKSAgVkVSQk9TRT0zIDs7CisgIGVzYWMKK2ZpCisKKyMgRGVmaW5lIHdoYXQgdGFyZ2V0IHN5c3RlbSB3ZSdyZSBmaXhpbmcuCisjCitpZiB0ZXN0IC1yIC4vTWFrZWZpbGU7IHRoZW4KKyAgdGFyZ2V0X2Nhbm9uaWNhbD0iYHNlZCAtbiAtZSAncyxedGFyZ2V0WyAJXSo9WyAJXSpcKC4qXCkkLFwxLHAnIDwgTWFrZWZpbGVgIgorZmkKKworIyBJZiBub3QgZnJvbSB0aGUgTWFrZWZpbGUsIHRoZW4gdHJ5IGNvbmZpZy5ndWVzcworIworaWYgdGVzdCAteiAiJHt0YXJnZXRfY2Fub25pY2FsfSIgOyB0aGVuCisgIGlmIHRlc3QgLXggLi9jb25maWcuZ3Vlc3MgOyB0aGVuCisgICAgdGFyZ2V0X2Nhbm9uaWNhbD0iYGNvbmZpZy5ndWVzc2AiIDsgZmkKKyAgdGVzdCAteiAiJHt0YXJnZXRfY2Fub25pY2FsfSIgJiYgdGFyZ2V0X2Nhbm9uaWNhbD11bmtub3duCitmaQorZXhwb3J0IHRhcmdldF9jYW5vbmljYWwKKworIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKKyMKKyMgRGVmaW5lIFBXRENNRCBhcyBhIGNvbW1hbmQgdG8gdXNlIHRvIGdldCB0aGUgd29ya2luZyBkaXIKKyMgaW4gdGhlIGZvcm0gdGhhdCB3ZSB3YW50LgorUFdEQ01EPSR7UFdEQ01ELXB3ZH0KKworY2FzZSAiYCRQV0RDTURgIiBpbgorLy8qKQorICAgICMgT24gYW4gQXBvbGxvLCBkaXNjYXJkIGV2ZXJ5dGhpbmcgYmVmb3JlIGAvdXNyJy4KKyAgICBQV0RDTUQ9ImV2YWwgcHdkIHwgc2VkIC1lICdzLC4qL3Vzci8sL3Vzci8sJyIKKyAgICA7OworZXNhYworCisjIE9yaWdpbmFsIGRpcmVjdG9yeS4KK09SSUdESVI9YCR7UFdEQ01EfWAKK2V4cG9ydCBPUklHRElSCitGSVhJTkNMPWAke1BXRENNRH1gL2ZpeGluY2wKK2lmIFsgISAteCAkRklYSU5DTCBdIDsgdGhlbgorICBlY2hvICJDYW5ub3QgZmluZCBmaXhpbmNsIiA+JjIKKyAgZXhpdCAxCitmaQorZXhwb3J0IEZJWElOQ0wKKworIyBNYWtlIExJQiBhYnNvbHV0ZSBvbmx5IGlmIG5lZWRlZCB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHRoZSBhbWQuCitjYXNlICRMSUIgaW4KKy8qKQorICAgIDs7CisqKQorICAgIGNkICRMSUI7IExJQj1gJHtQV0RDTUR9YAorICAgIDs7Citlc2FjCisKK2lmIHRlc3QgJFZFUkJPU0UgLWd0IDAKK3RoZW4gZWNobyBGaXhpbmcgaGVhZGVycyBpbnRvICR7TElCfSBmb3IgJHt0YXJnZXRfY2Fub25pY2FsfSB0YXJnZXQgOyBmaQorCisjIERldGVybWluZSB3aGV0aGVyIHRoaXMgc3lzdGVtIGhhcyBzeW1ib2xpYyBsaW5rcy4KK2lmIHRlc3QgLW4gIiRESkRJUiI7IHRoZW4KKyAgTElOS1M9ZmFsc2UKK2VsaWYgbG4gLXMgWCAkTElCL1Nob3VsZE5vdEV4aXN0IDI+L2Rldi9udWxsOyB0aGVuCisgIHJtIC1mICRMSUIvU2hvdWxkTm90RXhpc3QKKyAgTElOS1M9dHJ1ZQorZWxpZiBsbiAtcyBYIC90bXAvU2hvdWxkTm90RXhpc3QgMj4vZGV2L251bGw7IHRoZW4KKyAgcm0gLWYgL3RtcC9TaG91bGROb3RFeGlzdAorICBMSU5LUz10cnVlCitlbHNlCisgIExJTktTPWZhbHNlCitmaQorCisjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIworIworIyAgQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYWNoaW5lX25hbWUgZml4IG5lZWRzIHRvIGJlIGRpc2FibGVkLgorIworIyAgT24gc29tZSBwbGF0Zm9ybXMsIG1hY2hpbmVfbmFtZSBkb2Vzbid0IHdvcmsgcHJvcGVybHkgYW5kCisjICBicmVha3Mgc29tZSBvZiB0aGUgaGVhZGVyIGZpbGVzLiAgU2luY2UgZXZlcnl0aGluZyB3b3JrcworIyAgcHJvcGVybHkgd2l0aG91dCBpdCwganVzdCB3aXBlIHRoZSBtYWNybyBsaXN0IHRvCisjICBkaXNhYmxlIHRoZSBmaXguCisKK2Nhc2UgIiR7dGFyZ2V0X2Nhbm9uaWNhbH0iIGluCisgICAgKi0qLXZ4d29ya3MqKQorCXRlc3QgLWYgJHtNQUNST19MSVNUfSAmJiAgZWNobyA+ICR7TUFDUk9fTElTVH0KKyAgICAgICAgOzsKK2VzYWMKKworCisjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIworIworIyAgSW4gdGhlIGZpbGUgbWFjcm9fbGlzdCBhcmUgbGlzdGVkIGFsbCB0aGUgcHJlZGVmaW5lZAorIyAgbWFjcm9zIHRoYXQgYXJlIG5vdCBpbiB0aGUgQzg5IHJlc2VydmVkIG5hbWVzcGFjZSAodGhlIHJlc2VydmVkCisjICBuYW1lc3BhY2UgaXMgYWxsIGlkZW50aWZpZXJzIGJlZ2lubm5pbmcgd2l0aCB0d28gdW5kZXJzY29yZXMgb3Igb25lCisjICB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5IGEgY2FwaXRhbCBsZXR0ZXIpLiAgQSByZWd1bGFyIGV4cHJlc3Npb24gdG8gZmluZAorIyAgYW55IG9mIHRob3NlIG1hY3JvcyBpbiBhIGhlYWRlciBmaWxlIGlzIHdyaXR0ZW4gdG8gTU5fTkFNRV9QQVQuCisjCisjICBOb3RlIGRlcGVuZGVuY3kgb24gQVNDSUkuIFwwMTIgPSBuZXdsaW5lLgorIyAgdHIgJyAnICdcbicgaXMsIGFsYXMsIG5vdCBwb3J0YWJsZS4KKworaWYgdGVzdCAtcyAke01BQ1JPX0xJU1R9Cit0aGVuCisgIGlmIHRlc3QgJFZFUkJPU0UgLWd0IDA7IHRoZW4KKyAgICBlY2hvICJGb3JiaWRkZW4gaWRlbnRpZmllcnM6IGB0ciAnXDAxMicgJyAnIDwgJHtNQUNST19MSVNUfWAiCisgIGZpCisgIE1OX05BTUVfUEFUPSJgc2VkICdzL14vXFxcXDwvOyBzLyQvXFxcXD4vOyAkIXMvJC98LycgXAorICAgICAgPCAke01BQ1JPX0xJU1R9IHwgdHIgLWQgJ1wwMTInYCIKKyAgZXhwb3J0IE1OX05BTUVfUEFUCitlbHNlCisgIGlmIHRlc3QgJFZFUkJPU0UgLWd0IDAKKyAgdGhlbiBlY2hvICJObyBmb3JiaWRkZW4gaWRlbnRpZmllcnMgZGVmaW5lZCBieSB0aGlzIHRhcmdldCIgOyBmaQorZmkKKworIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKKyMKKyMgIFNlYXJjaCBlYWNoIGlucHV0IGRpcmVjdG9yeSBmb3IgYnJva2VuIGhlYWRlciBmaWxlcy4KKyMgIFRoaXMgbG9vcCBlbmRzIG5lYXIgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyMKK2lmIHRlc3QgJCMgLWVxIDAKK3RoZW4KKyAgICBJTlBVVExJU1Q9Ii91c3IvaW5jbHVkZSIKK2Vsc2UKKyAgICBJTlBVVExJU1Q9IiRAIgorZmkKKworZm9yIElOUFVUIGluICR7SU5QVVRMSVNUfSA7IGRvCisKK2NkICR7T1JJR0RJUn0KKworIyAgTWFrZSBzdXJlIGEgZGlyZWN0b3J5IGV4aXN0cyBiZWZvcmUgY2hhbmdpbmcgaW50byBpdCwKKyMgIG90aGVyd2lzZSBTb2xhcmlzMiB3aWxsIGZhaWwtZXhpdCB0aGUgc2NyaXB0LgorIworaWYgWyAhIC1kICR7SU5QVVR9IF07IHRoZW4KKyAgY29udGludWUKK2ZpCitjZCAke0lOUFVUfQorCitJTlBVVD1gJHtQV0RDTUR9YAorZXhwb3J0IElOUFVUCisKKyMKKyMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjCisjCitpZiB0ZXN0ICRWRVJCT1NFIC1ndCAxCit0aGVuIGVjaG8gRmluZGluZyBkaXJlY3RvcmllcyBhbmQgbGlua3MgdG8gZGlyZWN0b3JpZXMgOyBmaQorCisjIEZpbmQgYWxsIGRpcmVjdG9yaWVzIGFuZCBhbGwgc3ltbGlua3MgdGhhdCBwb2ludCB0byBkaXJlY3Rvcmllcy4KKyMgUHV0IHRoZSBsaXN0IGluICRhbGxfZGlycy4KKyMgRWFjaCB0aW1lIHdlIGZpbmQgYSBzeW1saW5rLCBhZGQgaXQgdG8gbmV3ZGlycworIyBzbyB0aGF0IHdlIGRvIGFub3RoZXIgZmluZCB3aXRoaW4gdGhlIGRpciB0aGUgbGluayBwb2ludHMgdG8uCisjIE5vdGUgdGhhdCAkYWxsX2RpcnMgbWF5IGhhdmUgZHVwbGljYXRlcyBpbiBpdDsKKyMgbGF0ZXIgcGFydHMgb2YgdGhpcyBmaWxlIGFyZSBzdXBwb3NlZCB0byBpZ25vcmUgdGhlbS4KK2RpcnM9Ii4iCitsZXZlbHM9MgorYWxsX2RpcnM9IiIKK3NlYXJjaF9kaXJzPSIiCisKK3doaWxlIFsgLW4gIiRkaXJzIiBdICYmIFsgJGxldmVscyAtZ3QgMCBdCitkbworICBsZXZlbHM9YGV4cHIgJGxldmVscyAtIDFgCisgIG5ld2RpcnM9CisgIGZvciBkIGluICRkaXJzCisgIGRvCisgICAgaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMQorICAgIHRoZW4gZWNobyAiIFNlYXJjaGluZyAkSU5QVVQvJGQiIDsgZmkKKworICAgICMgRmluZCBhbGwgZGlyZWN0b3JpZXMgdW5kZXIgJGQsIHJlbGF0aXZlIHRvICRkLCBleGNsdWRpbmcgJGQgaXRzZWxmLgorICAgICMgKFRoZSAvLiBpcyBuZWVkZWQgYWZ0ZXIgJGQgaW4gY2FzZSAkZCBpcyBhIHN5bWxpbmsuKQorICAgIGFsbF9kaXJzPSIkYWxsX2RpcnMgYGZpbmQgJGQvLiAtdHlwZSBkIC1wcmludCB8IFwKKyAgICAgICAgICAgICAgIHNlZCAtZSAnL1wvXC4kL2QnIC1lICdzQC8uL0AvQGcnYCIKKyAgICAjIEZpbmQgYWxsIGxpbmtzIHRvIGRpcmVjdG9yaWVzLgorICAgICMgVXNpbmcgYC1leGVjIHRlc3QgLWQnIGluIGZpbmQgZmFpbHMgb24gc29tZSBzeXN0ZW1zLAorICAgICMgYW5kIHRyeWluZyB0byBydW4gdGVzdCB2aWEgc2ggZmFpbHMgb24gb3RoZXJzLAorICAgICMgc28gdGhpcyBpcyB0aGUgc2ltcGxlc3QgYWx0ZXJuYXRpdmUgbGVmdC4KKyAgICAjIEZpcnN0IGZpbmQgYWxsIHRoZSBsaW5rcywgdGhlbiB0ZXN0IGVhY2ggb25lLgorICAgIHRoZXNlbGlua3M9CisgICAgJExJTktTICYmIFwKKyAgICAgIHRoZXNlbGlua3M9YGZpbmQgJGQvLiAtdHlwZSBsIC1wcmludCB8IHNlZCAtZSAnc0AvLi9AL0BnJ2AKKyAgICBmb3IgZDEgaW4gJHRoZXNlbGlua3MgLS1kdW1teS0tCisgICAgZG8KKyAgICAgICMgSWYgdGhlIGxpbmsgcG9pbnRzIHRvIGEgZGlyZWN0b3J5LAorICAgICAgIyBhZGQgdGhhdCBkaXIgdG8gJG5ld2RpcnMKKyAgICAgIGlmIFsgLWQgJGQxIF0KKyAgICAgIHRoZW4KKyAgICAgICAgYWxsX2RpcnM9IiRhbGxfZGlycyAkZDEiCisgICAgICAgIGlmIFsgImBscyAtbGQgJGQxIHwgc2VkIC1uICdzLy4qLT4gLy9wJ2AiICE9ICIuIiBdCisgICAgICAgIHRoZW4KKyAgICAgICAgICBuZXdkaXJzPSIkbmV3ZGlycyAkZDEiCisgICAgICAgICAgc2VhcmNoX2RpcnM9IiRzZWFyY2hfZGlycyAkZDEiCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGRvbmUKKyAgZG9uZQorCisgIGRpcnM9IiRuZXdkaXJzIgorZG9uZQorCisjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIworIworZGlycz0KK2lmIHRlc3QgJFZFUkJPU0UgLWd0IDIKK3RoZW4gZWNobyAiQWxsIGRpcmVjdG9yaWVzIChpbmNsdWRpbmcgbGlua3MgdG8gZGlyZWN0b3JpZXMpOiIKKyAgICAgZWNobyAkYWxsX2RpcnMKK2ZpCisKK2ZvciBmaWxlIGluICRhbGxfZGlyczsgZG8KKyAgcm0gLXJmICRMSUIvJGZpbGUKKyAgaWYgWyAhIC1kICRMSUIvJGZpbGUgXQorICB0aGVuIG1rZGlyICRMSUIvJGZpbGUKKyAgZmkKK2RvbmUKK21rZGlyICRMSUIvcm9vdAorCisjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIworIworIyB0cmVldG9wcyBnZXRzIGFuIGFsdGVybmF0aW5nIGxpc3QKKyMgb2Ygb2xkIGRpcmVjdG9yaWVzIHRvIGNvcHkKKyMgYW5kIHRoZSBuZXcgZGlyZWN0b3JpZXMgdG8gY29weSB0by4KK3RyZWV0b3BzPSIuICR7TElCfSIKKworaWYgJExJTktTOyB0aGVuCisgIGlmIHRlc3QgJFZFUkJPU0UgLWd0IDEKKyAgdGhlbiBlY2hvICdNYWtpbmcgc3ltYm9saWMgZGlyZWN0b3J5IGxpbmtzJyA7IGZpCisgIGN3ZD1gJHtQV0RDTUR9YAorCisgIGZvciBzeW1fbGluayBpbiAkc2VhcmNoX2RpcnM7IGRvCisgICAgY2QgJHtJTlBVVH0KKyAgICBkZXN0PWBscyAtbGQgJHtzeW1fbGlua30gfCBzZWQgLW4gJ3MvLiotPiAvL3AnYAorCisgICAgIyBJbiBjYXNlICRkZXN0IGlzIHJlbGF0aXZlLCBnZXQgdG8gJHtzeW1fbGlua30ncyBkaXIgZmlyc3QuCisgICAgIworICAgIGNkIC4vYGVjaG8gJHtzeW1fbGlua30gfCBzZWQgJ3M7L1teL10qJDs7J2AKKworICAgICMgQ2hlY2sgdGhhdCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBleGlzdHMuCisgICAgIyBSZWRpcmVjdGlvbnMgY2hhbmdlZCB0byBhdm9pZCBidWcgaW4gc2ggb24gVWx0cml4LgorICAgICMKKyAgICAoY2QgJGRlc3QpID4gL2Rldi9udWxsIDI+JjEKKyAgICBpZiBbICQ/ID0gMCBdOyB0aGVuCisgICAgICBjZCAkZGVzdAorCisgICAgICAjIGZ1bGxfZGVzdF9kaXIgZ2V0cyB0aGUgZGlyIHRoYXQgdGhlIGxpbmsgYWN0dWFsbHkgbGVhZHMgdG8uCisgICAgICAjCisgICAgICBmdWxsX2Rlc3RfZGlyPWAke1BXRENNRH1gCisKKyAgICAgICMgQ2Fub25pY2FsaXplICR7SU5QVVR9IG5vdyB0byBtaW5pbWl6ZSB0aGUgdGltZSBhbgorICAgICAgIyBhdXRvbW91bnRlciBoYXMgdG8gY2hhbmdlIHRoZSByZXN1bHQgb2YgJHtQV0RDTUR9LgorICAgICAgIworICAgICAgY2lucHV0PWBjZCAke0lOUFVUfTsgJHtQV0RDTUR9YAorCisgICAgICAjIElmIGEgbGluayBwb2ludHMgdG8gLiwgbWFrZSBhIHNpbWlsYXIgbGluayB0byAuCisgICAgICAjCisgICAgICBpZiBbICR7ZnVsbF9kZXN0X2Rpcn0gPSAke2NpbnB1dH0gXTsgdGhlbgorICAgICAgICBpZiB0ZXN0ICRWRVJCT1NFIC1ndCAyCisgICAgICAgIHRoZW4gZWNobyAke3N5bV9saW5rfSAnLT4nIC4gJzogTWFraW5nIHNlbGYgbGluaycgOyBmaQorICAgICAgICBybSAtZnIgJHtMSUJ9LyR7c3ltX2xpbmt9ID4gL2Rldi9udWxsIDI+JjEKKyAgICAgICAgbG4gLXMgLiAke0xJQn0vJHtzeW1fbGlua30gPiAvZGV2L251bGwgMj4mMQorCisgICAgICAjIElmIGxpbmsgbGVhZHMgYmFjayBpbnRvICR7SU5QVVR9LAorICAgICAgIyBtYWtlIGEgc2ltaWxhciBsaW5rIGhlcmUuCisgICAgICAjCisgICAgICBlbGlmIGV4cHIgJHtmdWxsX2Rlc3RfZGlyfSA6ICIke2NpbnB1dH0vLioiID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgICMgWSBnZXRzIHRoZSBhY3R1YWwgdGFyZ2V0IGRpciBuYW1lLCByZWxhdGl2ZSB0byAke0lOUFVUfS4KKyAgICAgICAgeT1gZWNobyAke2Z1bGxfZGVzdF9kaXJ9IHwgc2VkIC1uICJzJiR7Y2lucHV0fS8mJnAiYAorICAgICAgICAjIERPVFMgaXMgdGhlIHJlbGF0aXZlIHBhdGggZnJvbSAke0xJQn0vJHtzeW1fbGlua30gYmFjayB0byAke0xJQn0uCisgICAgICAgIGRvdHM9YGVjaG8gIiR7c3ltX2xpbmt9IiB8CisgICAgICAgICAgc2VkIC1lICdzQF4uL0BAJyAtZSAnc0AvLi9AL0BnJyAtZSAnc0BbXi9dW14vXSpALi5AZycgLWUgJ3NALi4kQEAnYAorICAgICAgICBpZiB0ZXN0ICRWRVJCT1NFIC1ndCAyCisgICAgICAgIHRoZW4gZWNobyAke3N5bV9saW5rfSAnLT4nICRkb3RzJHkgJzogTWFraW5nIGxvY2FsIGxpbmsnIDsgZmkKKyAgICAgICAgcm0gLWZyICR7TElCfS8ke3N5bV9saW5rfSA+IC9kZXYvbnVsbCAyPiYxCisgICAgICAgIGxuIC1zICRkb3RzJHkgJHtMSUJ9LyR7c3ltX2xpbmt9ID4gL2Rldi9udWxsIDI+JjEKKworICAgICAgZWxzZQorICAgICAgICAjIElmIHRoZSBsaW5rIGlzIHRvIGEgZGlyICR0YXJnZXQgb3V0c2lkZSAke0lOUFVUfSwKKyAgICAgICAgIyByZXBvaW50IHRoZSBsaW5rIGF0ICR7SU5QVVR9L3Jvb3QkdGFyZ2V0CisgICAgICAgICMgYW5kIHByb2Nlc3MgJHRhcmdldCBpbnRvICR7SU5QVVR9L3Jvb3QkdGFyZ2V0CisgICAgICAgICMgdHJlYXQgdGhpcyBkaXJlY3RvcnkgYXMgaWYgaXQgYWN0dWFsbHkgY29udGFpbmVkIHRoZSBmaWxlcy4KKyAgICAgICAgIworICAgICAgICBpZiB0ZXN0ICRWRVJCT1NFIC1ndCAyCisgICAgICAgIHRoZW4gZWNobyAke3N5bV9saW5rfSAnLT4nIHJvb3Qke2Z1bGxfZGVzdF9kaXJ9ICc6IE1ha2luZyByb290ZWQgbGluaycKKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAtZCAkTElCL3Jvb3Qke2Z1bGxfZGVzdF9kaXJ9IF0KKyAgICAgICAgdGhlbiB0cnVlCisgICAgICAgIGVsc2UKKyAgICAgICAgICBkaXJuYW1lPXJvb3Qke2Z1bGxfZGVzdF9kaXJ9LworICAgICAgICAgIGRpcm1hZGU9LgorICAgICAgICAgIGNkICRMSUIKKyAgICAgICAgICB3aGlsZSBbIHgkZGlybmFtZSAhPSB4IF07IGRvCisgICAgICAgICAgICBjb21wb25lbnQ9YGVjaG8gJGRpcm5hbWUgfCBzZWQgLWUgJ3N8Ly4qJHx8J2AKKyAgICAgICAgICAgIG1rZGlyICRjb21wb25lbnQgPi9kZXYvbnVsbCAyPiYxCisgICAgICAgICAgICBjZCAkY29tcG9uZW50CisgICAgICAgICAgICBkaXJtYWRlPSRkaXJtYWRlLyRjb21wb25lbnQKKyAgICAgICAgICAgIGRpcm5hbWU9YGVjaG8gJGRpcm5hbWUgfCBzZWQgLWUgJ3N8W14vXSovfHwnYAorICAgICAgICAgIGRvbmUKKyAgICAgICAgZmkKKworICAgICAgICAjIER1cGxpY2F0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGNyZWF0ZWQgaW4gJHtMSUJ9LyR7c3ltX2xpbmt9IGluIG5ldworICAgICAgICAjIHJvb3QgYXJlYS4KKyAgICAgICAgIworICAgICAgICBmb3IgZmlsZTIgaW4gJGFsbF9kaXJzOyBkbworICAgICAgICAgIGNhc2UgJGZpbGUyIGluCisgICAgICAgICAgICAke3N5bV9saW5rfS8qKQorICAgICAgICAgICAgICBkdXBkaXI9JHtMSUJ9L3Jvb3Qke2Z1bGxfZGVzdF9kaXJ9L2BlY2hvICRmaWxlMiB8CisgICAgICAgICAgICAgICAgICAgICAgc2VkIC1uICJzfF4ke3N5bV9saW5rfS98fHAiYAorICAgICAgICAgICAgICBpZiB0ZXN0ICRWRVJCT1NFIC1ndCAyCisgICAgICAgICAgICAgIHRoZW4gZWNobyAiRHVwbGljYXRpbmcgJHtzeW1fbGlua30ncyAke2R1cGRpcn0iIDsgZmkKKyAgICAgICAgICAgICAgaWYgWyAtZCAke2R1cGRpcn0gXQorICAgICAgICAgICAgICB0aGVuIHRydWUKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1rZGlyICR7ZHVwZGlyfQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgIGRvbmUKKworICAgICAgICAjIEdldCB0aGUgcGF0aCBmcm9tICR7TElCfSB0byAke3N5bV9saW5rfSwgYWNjb3VudGluZyBmb3Igc3ltbGlua3MuCisgICAgICAgICMKKyAgICAgICAgcGFyZW50PWBlY2hvICIke3N5bV9saW5rfSIgfCBzZWQgLWUgJ3NAL1teL10qJEBAJ2AKKyAgICAgICAgbGliYWJzPWBjZCAke0xJQn07ICR7UFdEQ01EfWAKKyAgICAgICAgZmlsZTI9YGNkICR7TElCfTsgY2QgJHBhcmVudDsgJHtQV0RDTUR9IHwgc2VkIC1lICJzQF4ke2xpYmFic31AQCJgCisKKyAgICAgICAgIyBET1RTIGlzIHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gJHtMSUJ9LyR7c3ltX2xpbmt9IGJhY2sgdG8gJHtMSUJ9LgorICAgICAgICAjCisgICAgICAgIGRvdHM9YGVjaG8gIiRmaWxlMiIgfCBzZWQgLWUgJ3NAL1teL10qQC4uL0BnJ2AKKyAgICAgICAgcm0gLWZyICR7TElCfS8ke3N5bV9saW5rfSA+IC9kZXYvbnVsbCAyPiYxCisgICAgICAgIGxuIC1zICR7ZG90c31yb290JHtmdWxsX2Rlc3RfZGlyfSAke0xJQn0vJHtzeW1fbGlua30gPiAvZGV2L251bGwgMj4mMQorICAgICAgICB0cmVldG9wcz0iJHRyZWV0b3BzICR7c3ltX2xpbmt9ICR7TElCfS9yb290JHtmdWxsX2Rlc3RfZGlyfSIKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorZmkKKworIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKKyMKK3JlcXVpcmVkPQorc2V0IHggJHRyZWV0b3BzCitzaGlmdAord2hpbGUgWyAkIyAhPSAwIF07IGRvCisgICMgJDEgaXMgYW4gb2xkIGRpcmVjdG9yeSB0byBjb3B5LCBhbmQgJDIgaXMgdGhlIG5ldyBkaXJlY3RvcnkgdG8gY29weSB0by4KKyAgIworICBTUkNESVI9YGNkICR7SU5QVVR9IDsgY2QgJDEgOyAke1BXRENNRH1gCisgIGV4cG9ydCBTUkNESVIKKworICBGSU5EX0JBU0U9JDEKKyAgZXhwb3J0IEZJTkRfQkFTRQorICBzaGlmdAorCisgIERFU1RESVI9YGNkICQxOyR7UFdEQ01EfWAKKyAgZXhwb3J0IERFU1RESVIKKyAgc2hpZnQKKworICAjIFRoZSBzYW1lIGRpciBjYW4gYXBwZWFyIG1vcmUgdGhhbiBvbmNlIGluIHRyZWV0b3BzLgorICAjIFRoZXJlJ3Mgbm8gbmVlZCB0byBzY2FuIGl0IG1vcmUgdGhhbiBvbmNlLgorICAjCisgIGlmIFsgLWYgJHtERVNURElSfS9ET05FIF0KKyAgdGhlbiBjb250aW51ZSA7IGZpCisKKyAgdG91Y2ggJHtERVNURElSfS9ET05FCisgIGlmIHRlc3QgJFZFUkJPU0UgLWd0IDEKKyAgdGhlbiBlY2hvIEZpeGluZyBkaXJlY3RvcnkgJHtTUkNESVJ9IGludG8gJHtERVNURElSfSA7IGZpCisKKyAgIyBDaGVjayBmaWxlcyB3aGljaCBhcmUgc3ltbGlua3MgYXMgd2VsbCBhcyB0aG9zZSB3aGljaCBhcmUgZmlsZXMuCisgICMKKyAgY2QgJHtJTlBVVH0KKyAgcmVxdWlyZWQ9IiRyZXF1aXJlZCBgaWYgJExJTktTOyB0aGVuCisgICAgZmluZCAke0ZJTkRfQkFTRX0vLiAtbmFtZSAnKi5oJyBcKCAtdHlwZSBmIC1vIC10eXBlIGwgXCkgLXByaW50CisgIGVsc2UKKyAgICBmaW5kICR7RklORF9CQVNFfS8uIC1uYW1lICcqLmgnIC10eXBlIGYgLXByaW50CisgIGZpIHwgXAorICAgIHNlZCAtZSAnczsvXC4vOy87ZycgLWUgJ3M7Ly8qOy87ZycgfCBcCisgICAgJHtGSVhJTkNMfWAiCitkb25lCisKKyMjIE1ha2Ugc3VyZSB0aGF0IGFueSBpbmNsdWRlIGZpbGVzIHJlZmVyZW5jZWQgdXNpbmcgZG91YmxlIHF1b3RlcworIyMgZXhpc3QgaW4gdGhlIGZpeGVkIGRpcmVjdG9yeS4gIFRoaXMgY29tZXMgbGFzdCBzaW5jZSBvdGhlcndpc2UKKyMjIHdlIG1pZ2h0IGVuZCB1cCBkZWxldGluZyBzb21lIG9mIHRoZXNlIGZpbGVzICJiZWNhdXNlIHRoZXkgZG9uJ3QKKyMjIG5lZWQgYW55IGNoYW5nZS4iCitzZXQgeCBgZWNobyAkcmVxdWlyZWRgCitzaGlmdAord2hpbGUgWyAkIyAhPSAwIF07IGRvCisgIG5ld3JlcT0KKyAgd2hpbGUgWyAkIyAhPSAwIF07IGRvCisgICAgIyAkMSBpcyB0aGUgZGlyZWN0b3J5IHRvIGNvcHkgZnJvbSwKKyAgICAjICQyIGlzIHRoZSB1bmZpeGVkIGZpbGUsCisgICAgIyAkMyBpcyB0aGUgZml4ZWQgZmlsZSBuYW1lLgorICAgICMKKyAgICBjZCAke0lOUFVUfQorICAgIGNkICQxCisgICAgaWYgWyAtZiAkMiBdIDsgdGhlbgorICAgICAgaWYgWyAtciAkMiBdICYmIFsgISAtciAkMyBdOyB0aGVuCisgICAgICAgIGNwICQyICQzID4vZGV2L251bGwgMj4mMSB8fCBlY2hvICJDYW4ndCBjb3B5ICQyIiA+JjIKKyAgICAgICAgY2htb2QgK3cgJDMgMj4vZGV2L251bGwKKyAgICAgICAgY2htb2QgYStyICQzIDI+L2Rldi9udWxsCisgICAgICAgIGlmIHRlc3QgJFZFUkJPU0UgLWd0IDIKKyAgICAgICAgdGhlbiBlY2hvIENvcGllZCAkMiA7IGZpCisgICAgICAgIGZvciBpbmNsdWRlIGluIGBlZ3JlcCAnXlsgCV0qI1sgCV0qaW5jbHVkZVsgCV0qIlteL10nICQzIHwKKyAgICAgICAgICAgICBzZWQgLWUgJ3MvXlsgCV0qI1sgCV0qaW5jbHVkZVsgCV0qIlwoW14iXSpcKSIuKiQvXDEvJ2AKKyAgICAgICAgZG8KKwkgIGRpcj1gZWNobyAkMiB8IHNlZCAtZSBzJ3wvW14vXSokfHwnYAorCSAgZGlyMj1gZWNobyAkMyB8IHNlZCAtZSBzJ3wvW14vXSokfHwnYAorCSAgbmV3cmVxPSIkbmV3cmVxICQxICRkaXIvJGluY2x1ZGUgJGRpcjIvJGluY2x1ZGUiCisgICAgICAgIGRvbmUKKyAgICAgIGZpCisgICAgZmkKKyAgICBzaGlmdDsgc2hpZnQ7IHNoaWZ0CisgIGRvbmUKKyAgc2V0IHggJG5ld3JlcQorICBzaGlmdAorZG9uZQorCitpZiB0ZXN0ICRWRVJCT1NFIC1ndCAyCit0aGVuIGVjaG8gJ0NsZWFuaW5nIHVwIERPTkUgZmlsZXMuJyA7IGZpCitjZCAkTElCCisjIExvb2sgZm9yIGZpbGVzIGNhc2UtaW5zZW5zaXRpdmVseSwgZm9yIHRoZSBiZW5lZml0IG9mCisjIERPUy9XaW5kb3dzIGZpbGVzeXN0ZW1zLgorZmluZCAuIC1uYW1lICdbRGRdW09vXVtObl1bRWVdJyAtZXhlYyBybSAtZiAne30nICc7JworCitpZiB0ZXN0ICRWRVJCT1NFIC1ndCAxCit0aGVuIGVjaG8gJ0NsZWFuaW5nIHVwIHVubmVlZGVkIGRpcmVjdG9yaWVzOicgOyBmaQorY2QgJExJQgorYWxsX2RpcnM9YGZpbmQgLiAtdHlwZSBkIFwhIC1uYW1lICcuJyAtcHJpbnQgfCBzb3J0IC1yYAorZm9yIGZpbGUgaW4gJGFsbF9kaXJzOyBkbworICBpZiBybWRpciAkTElCLyRmaWxlID4gL2Rldi9udWxsCisgIHRoZW4KKyAgICB0ZXN0ICRWRVJCT1NFIC1ndCAzICYmIGVjaG8gIiAgcmVtb3ZlZCAkZmlsZSIKKyAgZmkKK2RvbmUgMj4gL2Rldi9udWxsCisKKyMgT24gc3lzdGVtcyB3aGljaCBkb24ndCBzdXBwb3J0IHN5bWxpbmtzLCBgZmluZCcgbWF5IGJhcmYKKyMgaWYgY2FsbGVkIHdpdGggIi10eXBlIGwiIHByZWRpY2F0ZS4gIFNvIG9ubHkgdXNlIHRoYXQgaWYKKyMgd2Uga25vdyB3ZSBzaG91bGQgbG9vayBmb3Igc3ltbGlua3MuCitpZiAkTElOS1M7IHRoZW4KKyAgdGVzdCAkVkVSQk9TRSAtZ3QgMiAmJiBlY2hvICJSZW1vdmluZyB1bnVzZWQgc3ltbGlua3MiCisKKyAgYWxsX2RpcnM9YGZpbmQgLiAtdHlwZSBsIC1wcmludGAKKyAgZm9yIGZpbGUgaW4gJGFsbF9kaXJzCisgIGRvCisgICAgaWYgdGVzdCAhIC1kICRmaWxlCisgICAgdGhlbgorICAgICAgcm0gLWYgJGZpbGUKKyAgICAgIHRlc3QgJFZFUkJPU0UgLWd0IDMgJiYgZWNobyAiICByZW1vdmVkICRmaWxlIgorICAgICAgcm1kaXIgYGRpcm5hbWUgJGZpbGVgID4gL2Rldi9udWxsICYmIFwKKyAgICAgICAgICAgdGVzdCAkVkVSQk9TRSAtZ3QgMyAmJiBcCisgICAgICAgICAgIGVjaG8gIiAgcmVtb3ZlZCBgZGlybmFtZSAkZmlsZWAiCisgICAgZmkKKyAgZG9uZSAyPiAvZGV2L251bGwKK2ZpCisKK2lmIHRlc3QgJFZFUkJPU0UgLWd0IDAKK3RoZW4gZWNobyBmaXhpbmNsdWRlcyBpcyBkb25lIDsgZmkKKworIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKKyMKKyMgRW5kIG9mIGZvciBJTlBVVCBkaXJlY3RvcmllcworIworZG9uZQorIworIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9maXhpbmNsIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL2ZpeGluY2wKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzA0ODI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9maXhpbmNsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9ta2hlYWRlcnMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvbWtoZWFkZXJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1OWM4MmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvbWtoZWFkZXJzCkBAIC0wLDAgKzEsMTA0IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyNUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyNHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorI3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisjU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyN2ZXJzaW9uLgorCisjR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjZm9yIG1vcmUgZGV0YWlscy4KKworI1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKyM8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyMgQmFzaWMgaW5mb3JtYXRpb24KK3RhcmdldD14ODZfNjQtcGMtbGludXgtZ251Cit0YXJnZXRfbm9uY2Fub25pY2FsPXg4Nl82NC1saW51eAordmVyc2lvbj00LjgKKworVkVSQk9TRT0wCit3aGlsZSBbIHgkMSA9IHgtdiBdIDsgZG8KKyAgICBzaGlmdAorICAgIFZFUkJPU0U9YGV4cHIgJFZFUkJPU0UgKyAxYAorZG9uZQorZXhwb3J0IFZFUkJPU0UKKworaWYgWyB4JDEgPSB4LS1oZWxwIF0gOyB0aGVuCisgICAgZWNobyAiVXNhZ2U6IG1raGVhZGVycyBbb3B0aW9uc10gW3ByZWZpeCBbaXN5c3Jvb3RdXSIKKyAgICBlY2hvICJPcHRpb25zOiIKKyAgICBlY2hvICIgIC12ICAgICAgICBQcmludCBtb3JlIG91dHB1dCAobWF5IGJlIHJlcGVhdGVkIGZvciBldmVuIG1vcmUgb3V0cHV0KSIKKyAgICBlY2hvICIgIC0taGVscCAgICBUaGlzIGhlbHAiCisgICAgZWNobyAiICAtLXZlcnNpb24gUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKKyAgICBleGl0IDAKK2ZpCisKK2lmIFsgeCQxID0geC0tdmVyc2lvbiBdIDsgdGhlbgorICAgIGVjaG8gIm1raGVhZGVycyAoR0NDKSB2ZXJzaW9uICR2ZXJzaW9uIgorICAgIGVjaG8gIkNvcHlyaWdodCAyMDAyLCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiIKKyAgICBlY2hvICJUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIgorICAgIGVjaG8gInRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMiCisgICAgZWNobyAiYWJzb2x1dGVseSBubyB3YXJyYW50eS4iCisgICAgZXhpdCAwCitmaQorCisjIENvbW1vbiBwcmVmaXggZm9yIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KK2lmIFsgeCQxICE9IHggXSA7IHRoZW4KKyAgcHJlZml4PSQxCisgIHNoaWZ0CitlbHNlCisgIHByZWZpeD0vdXNyL2xvY2FsL2dvb2dsZS9ob21lL2NoaC93b3JrZGlyL3ByZWNpc2U3LzEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgKK2ZpCisKKyMgQWxsb3cgZm9yIGFsdGVybmF0ZSBpc3lzcm9vdCBpbiB3aGljaCB0byBmaW5kIGhlYWRlcnMKK2lmIFsgeCQxICE9IHggXSA7IHRoZW4KKyAgaXN5c3Jvb3Q9JDEKKyAgc2hpZnQKK2Vsc2UKKyAgaXN5c3Jvb3Q9CitmaQorCisjIERpcmVjdG9yeSBpbiB3aGljaCB0byBwdXQgaG9zdCBkZXBlbmRlbnQgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcworZXhlY19wcmVmaXg9JHtwcmVmaXh9CisjIERpcmVjdG9yeSBpbiB3aGljaCB0byBwdXQgdGhlIGRpcmVjdG9yaWVzIHVzZWQgYnkgdGhlIGNvbXBpbGVyLgorbGliZGlyPSR7ZXhlY19wcmVmaXh9L2xpYgorbGliZXhlY2Rpcj0ke2V4ZWNfcHJlZml4fS9saWJleGVjCisjIERpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tcGlsZXIgZmluZHMgbGlicmFyaWVzLCBldGMuCitsaWJzdWJkaXI9JHtsaWJkaXJ9L2djYy8ke3RhcmdldF9ub25jYW5vbmljYWx9LyR7dmVyc2lvbn0KKyMgRGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21waWxlciBmaW5kcyBleGVjdXRhYmxlcworbGliZXhlY3N1YmRpcj0ke2xpYmV4ZWNkaXJ9L2djYy8ke3RhcmdldF9ub25jYW5vbmljYWx9LyR7dmVyc2lvbn0KKworaXRvb2xzZGlyPSR7bGliZXhlY3N1YmRpcn0vaW5zdGFsbC10b29scworaXRvb2xzZGF0YWRpcj0ke2xpYnN1YmRpcn0vaW5zdGFsbC10b29scworaW5jZGlyPSR7bGlic3ViZGlyfS9pbmNsdWRlLWZpeGVkCitta2luc3RhbGxkaXJzPSIvYmluL3NoICR7aXRvb2xzZGlyfS9ta2luc3RhbGxkaXJzIgorCitjZCAke2l0b29sc2Rpcn0KK3JtIC1yZiAke2luY2Rpcn0vKgorCitmb3IgbWwgaW4gYGNhdCAke2l0b29sc2RhdGFkaXJ9L2ZpeGluY19saXN0YDsgZG8KKyAgc3lzcm9vdF9oZWFkZXJzX3N1ZmZpeD1gZWNobyAke21sfSB8IHNlZCAtZSAncy87LiokLy8nYAorICBtdWx0aV9kaXI9YGVjaG8gJHttbH0gfCBzZWQgLWUgJ3MvXlteO10qOy8vJ2AKKyAgc3ViaW5jZGlyPSR7aW5jZGlyfSR7bXVsdGlfZGlyfQorICAuICR7aXRvb2xzZGF0YWRpcn0vbWtoZWFkZXJzLmNvbmYKKyAgaWYgWyB4JHtTVE1QX0ZJWElOQ30gIT0geCBdIDsgdGhlbgorCVRBUkdFVF9NQUNISU5FPSIke3RhcmdldH0iIHRhcmdldF9jYW5vbmljYWw9IiR7dGFyZ2V0fSIgXAorCSAgICBNQUNST19MSVNUPSIke2l0b29sc2RhdGFkaXJ9L21hY3JvX2xpc3QiIFwKKwkgICAgL2Jpbi9zaCAuL2ZpeGluYy5zaCAke3N1YmluY2Rpcn0gXAorCSAgICAke2lzeXNyb290fSR7U1lTVEVNX0hFQURFUl9ESVJ9ICR7T1RIRVJfRklYSU5DTFVERVNfRElSU30KKwlybSAtZiAke3N1YmluY2Rpcn0vc3lzbGltaXRzLmgKKwlpZiBbIC1mICR7c3ViaW5jZGlyfS9saW1pdHMuaCBdOyB0aGVuCisJICBtdiAke3N1YmluY2Rpcn0vbGltaXRzLmggJHtzdWJpbmNkaXJ9L3N5c2xpbWl0cy5oCisJZWxzZQorCSAgY3AgJHtpdG9vbHNkYXRhZGlyfS9nc3lzbGltaXRzLmggJHtzdWJpbmNkaXJ9L3N5c2xpbWl0cy5oCisJZmkKKyAgZmkKKworICBjcCAke2l0b29sc2RhdGFkaXJ9L2luY2x1ZGUke211bHRpX2Rpcn0vbGltaXRzLmggJHtzdWJpbmNkaXJ9Citkb25lCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvbWtpbnN0YWxsZGlycyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9ta2luc3RhbGxkaXJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxOTFhNDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvbWtpbnN0YWxsZGlycwpAQCAtMCwwICsxLDE2MiBAQAorIyEgL2Jpbi9zaAorIyBta2luc3RhbGxkaXJzIC0tLSBtYWtlIGRpcmVjdG9yeSBoaWVyYXJjaHkKKworc2NyaXB0dmVyc2lvbj0yMDA5LTA0LTI4LjIxOyAjIFVUQworCisjIE9yaWdpbmFsIGF1dGhvcjogTm9haCBGcmllZG1hbiA8ZnJpZWRtYW5AcHJlcC5haS5taXQuZWR1PgorIyBDcmVhdGVkOiAxOTkzLTA1LTE2CisjIFB1YmxpYyBkb21haW4uCisjCisjIFRoaXMgZmlsZSBpcyBtYWludGFpbmVkIGluIEF1dG9tYWtlLCBwbGVhc2UgcmVwb3J0CisjIGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPiBvciBzZW5kIHBhdGNoZXMgdG8KKyMgPGF1dG9tYWtlLXBhdGNoZXNAZ251Lm9yZz4uCisKK25sPScKKycKK0lGUz0iICIiCSRubCIKK2VycnN0YXR1cz0wCitkaXJtb2RlPQorCit1c2FnZT0iXAorVXNhZ2U6IG1raW5zdGFsbGRpcnMgWy1oXSBbLS1oZWxwXSBbLS12ZXJzaW9uXSBbLW0gTU9ERV0gRElSIC4uLgorCitDcmVhdGUgZWFjaCBkaXJlY3RvcnkgRElSICh3aXRoIG1vZGUgTU9ERSwgaWYgc3BlY2lmaWVkKSwgaW5jbHVkaW5nIGFsbAorbGVhZGluZyBmaWxlIG5hbWUgY29tcG9uZW50cy4KKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4iCisKKyMgcHJvY2VzcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC1oIHwgLS1oZWxwIHwgLS1oKikgICAgICAgICAjIC1oIGZvciBoZWxwCisgICAgICBlY2hvICIkdXNhZ2UiCisgICAgICBleGl0ICQ/CisgICAgICA7OworICAgIC1tKSAgICAgICAgICAgICAgICAgICAgICAgICAjIC1tIFBFUk0gYXJnCisgICAgICBzaGlmdAorICAgICAgdGVzdCAkIyAtZXEgMCAmJiB7IGVjaG8gIiR1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgICBkaXJtb2RlPSQxCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAtLXZlcnNpb24pCisgICAgICBlY2hvICIkMCAkc2NyaXB0dmVyc2lvbiIKKyAgICAgIGV4aXQgJD8KKyAgICAgIDs7CisgICAgLS0pICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgc2hpZnQKKyAgICAgIGJyZWFrCisgICAgICA7OworICAgIC0qKSAgICAgICAgICAgICAgICAgICAgICAgICAjIHVua25vd24gb3B0aW9uCisgICAgICBlY2hvICIkdXNhZ2UiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgICAgOzsKKyAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmaXJzdCBub24tb3B0IGFyZworICAgICAgYnJlYWsKKyAgICAgIDs7CisgIGVzYWMKK2RvbmUKKworZm9yIGZpbGUKK2RvCisgIGlmIHRlc3QgLWQgIiRmaWxlIjsgdGhlbgorICAgIHNoaWZ0CisgIGVsc2UKKyAgICBicmVhaworICBmaQorZG9uZQorCitjYXNlICQjIGluCisgIDApIGV4aXQgMCA7OworZXNhYworCisjIFNvbGFyaXMgOCdzIG1rZGlyIC1wIGlzbid0IHRocmVhZC1zYWZlLiAgSWYgeW91IG1rZGlyIC1wIGEvYiBhbmQKKyMgbWtkaXIgLXAgYS9jIGF0IHRoZSBzYW1lIHRpbWUsIGJvdGggd2lsbCBkZXRlY3QgdGhhdCBhIGlzIG1pc3NpbmcsCisjIG9uZSB3aWxsIGNyZWF0ZSBhLCB0aGVuIHRoZSBvdGhlciB3aWxsIHRyeSB0byBjcmVhdGUgYSBhbmQgZGllIHdpdGgKKyMgYSAiRmlsZSBleGlzdHMiIGVycm9yLiAgVGhpcyBpcyBhIHByb2JsZW0gd2hlbiBjYWxsaW5nIG1raW5zdGFsbGRpcnMKKyMgZnJvbSBhIHBhcmFsbGVsIG1ha2UuICBXZSB1c2UgLS12ZXJzaW9uIGluIHRoZSBwcm9iZSB0byByZXN0cmljdAorIyBvdXJzZWx2ZXMgdG8gR05VIG1rZGlyLCB3aGljaCBpcyB0aHJlYWQtc2FmZS4KK2Nhc2UgJGRpcm1vZGUgaW4KKyAgJycpCisgICAgaWYgbWtkaXIgLXAgLS12ZXJzaW9uIC4gPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgISAtZCAuLy0tdmVyc2lvbjsgdGhlbgorICAgICAgZWNobyAibWtkaXIgLXAgLS0gJCoiCisgICAgICBleGVjIG1rZGlyIC1wIC0tICIkQCIKKyAgICBlbHNlCisgICAgICAjIE9uIE5leHRTdGVwIGFuZCBPcGVuU3RlcCwgdGhlIGBta2RpcicgY29tbWFuZCBkb2VzIG5vdAorICAgICAgIyByZWNvZ25pemUgYW55IG9wdGlvbi4gIEl0IHdpbGwgaW50ZXJwcmV0IGFsbCBvcHRpb25zIGFzCisgICAgICAjIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZSwgYW5kIHRoZW4gYWJvcnQgYmVjYXVzZSBgLicgYWxyZWFkeQorICAgICAgIyBleGlzdHMuCisgICAgICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICAgICAgdGVzdCAtZCAuLy0tdmVyc2lvbiAmJiBybWRpciAuLy0tdmVyc2lvbgorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICBpZiBta2RpciAtbSAiJGRpcm1vZGUiIC1wIC0tdmVyc2lvbiAuID4vZGV2L251bGwgMj4mMSAmJgorICAgICAgIHRlc3QgISAtZCAuLy0tdmVyc2lvbjsgdGhlbgorICAgICAgZWNobyAibWtkaXIgLW0gJGRpcm1vZGUgLXAgLS0gJCoiCisgICAgICBleGVjIG1rZGlyIC1tICIkZGlybW9kZSIgLXAgLS0gIiRAIgorICAgIGVsc2UKKyAgICAgICMgQ2xlYW4gdXAgYWZ0ZXIgTmV4dFN0ZXAgYW5kIE9wZW5TdGVwIG1rZGlyLgorICAgICAgZm9yIGQgaW4gLi8tbSAuLy1wIC4vLS12ZXJzaW9uICIuLyRkaXJtb2RlIjsKKyAgICAgIGRvCisgICAgICAgIHRlc3QgLWQgJGQgJiYgcm1kaXIgJGQKKyAgICAgIGRvbmUKKyAgICBmaQorICAgIDs7Citlc2FjCisKK2ZvciBmaWxlCitkbworICBjYXNlICRmaWxlIGluCisgICAgLyopIHBhdGhjb21wPS8gOzsKKyAgICAqKSAgcGF0aGNvbXA9IDs7CisgIGVzYWMKKyAgb0lGUz0kSUZTCisgIElGUz0vCisgIHNldCBmbm9yZCAkZmlsZQorICBzaGlmdAorICBJRlM9JG9JRlMKKworICBmb3IgZAorICBkbworICAgIHRlc3QgIngkZCIgPSB4ICYmIGNvbnRpbnVlCisKKyAgICBwYXRoY29tcD0kcGF0aGNvbXAkZAorICAgIGNhc2UgJHBhdGhjb21wIGluCisgICAgICAtKikgcGF0aGNvbXA9Li8kcGF0aGNvbXAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KKyAgICAgIGVjaG8gIm1rZGlyICRwYXRoY29tcCIKKworICAgICAgbWtkaXIgIiRwYXRoY29tcCIgfHwgbGFzdGVycj0kPworCisgICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KKwllcnJzdGF0dXM9JGxhc3RlcnIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICEgLXogIiRkaXJtb2RlIjsgdGhlbgorCSAgZWNobyAiY2htb2QgJGRpcm1vZGUgJHBhdGhjb21wIgorCSAgbGFzdGVycj0KKwkgIGNobW9kICIkZGlybW9kZSIgIiRwYXRoY29tcCIgfHwgbGFzdGVycj0kPworCisJICBpZiB0ZXN0ICEgLXogIiRsYXN0ZXJyIjsgdGhlbgorCSAgICBlcnJzdGF0dXM9JGxhc3RlcnIKKwkgIGZpCisJZmkKKyAgICAgIGZpCisgICAgZmkKKworICAgIHBhdGhjb21wPSRwYXRoY29tcC8KKyAgZG9uZQorZG9uZQorCitleGl0ICRlcnJzdGF0dXMKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtdGltZS16b25lOiAiVVRDIgorIyB0aW1lLXN0YW1wLWVuZDogIjsgIyBVVEMiCisjIEVuZDoKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvbGlibHRvX3BsdWdpbi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvbGlibHRvX3BsdWdpbi5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mMjViYTg4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9saWJsdG9fcGx1Z2luLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmx0b19wbHVnaW4uc28uMC4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2xpYmx0b19wbHVnaW4uc28uMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvbGlibHRvX3BsdWdpbi5zby4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmYyNWJhODgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2xpYmx0b19wbHVnaW4uc28uMApAQCAtMCwwICsxIEBACitsaWJsdG9fcGx1Z2luLnNvLjAuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9saWJsdG9fcGx1Z2luLnNvLjAuMC4wIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9saWJsdG9fcGx1Z2luLnNvLjAuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhNGRjYWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2xpYmx0b19wbHVnaW4uc28uMC4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9sdG8td3JhcHBlciBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvbHRvLXdyYXBwZXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGM4OTcxYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvbHRvLXdyYXBwZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9sdG8xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9sdG8xCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM0OGY3OWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2x0bzEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NWUxYmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL0dML2dsLmgKQEAgLTAsMCArMSwyMjM1IEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICogVmVyc2lvbjogIDcuNgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSAgVk13YXJlLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogQlJJQU4gUEFVTCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBfX2dsX2hfCisjZGVmaW5lIF9fZ2xfaF8KKworI2lmIGRlZmluZWQoVVNFX01HTF9OQU1FU1BBQ0UpCisjaW5jbHVkZSAiZ2xfbWFuZ2xlLmgiCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQmVnaW4gc3lzdGVtLXNwZWNpZmljIHN0dWZmLiBEbyBub3QgZG8gYW55IG9mIHRoaXMgd2hlbiBidWlsZGluZworICogZm9yIFNjaVRlY2ggU05BUCwgYXMgdGhpcyBpcyBhbGwgZG9uZSBiZWZvcmUgdGhpcyBoZWFkZXIgZmlsZSBpcworICogaW5jbHVkZWQuIAorICovCisjaWYgIWRlZmluZWQoX19TQ0lURUNIX1NOQVBfXykKKworI2lmIGRlZmluZWQoX19CRU9TX18pCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgICAvKiB0byBnZXQgc29tZSBCZU9TLWlzbXMgKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoT1BFTlNURVApICYmIChkZWZpbmVkKE5lWFQpIHx8IGRlZmluZWQoTmVYVF9QRE8pKQorI2RlZmluZSBPUEVOU1RFUAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19XSU4zMl9fKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorI2RlZmluZSBfX1dJTjMyX18KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoT1BFTlNURVApICYmIChkZWZpbmVkKF9fV0lOMzJfXykgJiYgIWRlZmluZWQoX19DWUdXSU5fXykpCisjICBpZiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpICYmIGRlZmluZWQoQlVJTERfR0wzMikgLyogdGFnIHNwZWNpZnkgd2UncmUgYnVpbGRpbmcgbWVzYSBhcyBhIERMTCAqLworIyAgICBkZWZpbmUgR0xBUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICBlbGlmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkgJiYgZGVmaW5lZChfRExMKSAvKiB0YWcgc3BlY2lmeWluZyB3ZSdyZSBidWlsZGluZyBmb3IgRExMIHJ1bnRpbWUgc3VwcG9ydCAqLworIyAgICBkZWZpbmUgR0xBUEkgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICBlbHNlIC8qIGZvciB1c2Ugd2l0aCBzdGF0aWMgbGluayBsaWIgYnVpbGQgb2YgV2luMzIgZWRpdGlvbiBvbmx5ICovCisjICAgIGRlZmluZSBHTEFQSSBleHRlcm4KKyMgIGVuZGlmIC8qIF9TVEFUSUNfTUVTQSBzdXBwb3J0ICovCisjICBpZiBkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiBkZWZpbmVkKEdMX05PX1NURENBTEwpIHx8IGRlZmluZWQoVU5ERVJfQ0UpICAvKiBUaGUgZ2VuZXJhdGVkIERMTHMgYnkgTWluZ1cgd2l0aCBTVERDQUxMIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBvbmVzIGRvbmUgYnkgTWljcm9zb2Z0J3MgY29tcGlsZXJzICovCisjICAgIGRlZmluZSBHTEFQSUVOVFJZIAorIyAgZWxzZQorIyAgICBkZWZpbmUgR0xBUElFTlRSWSBfX3N0ZGNhbGwKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fQ1lHV0lOX18pICYmIGRlZmluZWQoVVNFX09QRU5HTDMyKSAvKiB1c2UgbmF0aXZlIHdpbmRvd3Mgb3BlbmdsMzIgKi8KKyMgIGRlZmluZSBHTEFQSSBleHRlcm4KKyMgIGRlZmluZSBHTEFQSUVOVFJZIF9fc3RkY2FsbAorI2VsaWYgKGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDQpIHx8IChkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKSkKKyMgIGRlZmluZSBHTEFQSSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorIyAgZGVmaW5lIEdMQVBJRU5UUlkKKyNlbmRpZiAvKiBXSU4zMiAmJiAhQ1lHV0lOICovCisKKyNpZiAoZGVmaW5lZChfX0JFT1NfXykgJiYgZGVmaW5lZChfX1BPV0VSUENfXykpIHx8IGRlZmluZWQoX19RVUlDS0RSQVdfXykKKyMgIGRlZmluZSBQUkFHTUFfRVhQT1JUX1NVUFBPUlRFRAkJMQorI2VuZGlmCisKKy8qCisgKiBXSU5ET1dTOiBJbmNsdWRlIHdpbmRvd3MuaCBoZXJlIHRvIGRlZmluZSBBUElFTlRSWS4KKyAqIEl0IGlzIGFsc28gdXNlZnVsIHdoZW4gYXBwbGljYXRpb25zIGluY2x1ZGUgdGhpcyBmaWxlIGJ5CisgKiBpbmNsdWRpbmcgb25seSBnbHV0LmgsIHNpbmNlIGdsdXQuaCBkZXBlbmRzIG9uIHdpbmRvd3MuaC4KKyAqIEFwcGxpY2F0aW9ucyBuZWVkaW5nIHRvIGluY2x1ZGUgd2luZG93cy5oIHdpdGggcGFybXMgb3RoZXIKKyAqIHRoYW4gIldJTjMyX0xFQU5fQU5EX01FQU4iIG1heSBpbmNsdWRlIHdpbmRvd3MuaCBiZWZvcmUKKyAqIGdsdXQuaCBvciBnbC5oLgorICovCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKEFQSUVOVFJZKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorI2lmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2VuZGlmCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKG1hY2ludG9zaCkgJiYgUFJBR01BX0lNUE9SVF9TVVBQT1JURUQKKyNwcmFnbWEgaW1wb3J0IG9uCisjZW5kaWYKKworI2lmbmRlZiBHTEFQSQorI2RlZmluZSBHTEFQSSBleHRlcm4KKyNlbmRpZgorCisjaWZuZGVmIEdMQVBJRU5UUlkKKyNkZWZpbmUgR0xBUElFTlRSWQorI2VuZGlmCisKKyNpZm5kZWYgQVBJRU5UUlkKKyNkZWZpbmUgQVBJRU5UUlkgR0xBUElFTlRSWQorI2VuZGlmCisKKy8qICJQIiBzdWZmaXggdG8gYmUgdXNlZCBmb3IgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gKi8KKyNpZm5kZWYgQVBJRU5UUllQCisjZGVmaW5lIEFQSUVOVFJZUCBBUElFTlRSWSAqCisjZW5kaWYKKworI2lmbmRlZiBHTEFQSUVOVFJZUAorI2RlZmluZSBHTEFQSUVOVFJZUCBHTEFQSUVOVFJZICoKKyNlbmRpZgorCisjaWZkZWYgQ0VOVEVSTElORV9DTFBQCisjZGVmaW5lIHNpZ25lZAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBSQUdNQV9FWFBPUlRfU1VQUE9SVEVEKQorI3ByYWdtYSBleHBvcnQgb24KKyNlbmRpZgorCisjZW5kaWYgLyogIV9fU0NJVEVDSF9TTkFQX18gKi8KKy8qCisgKiBFbmQgc3lzdGVtLXNwZWNpZmljIHN0dWZmLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisjZGVmaW5lIEdMX1ZFUlNJT05fMV8xICAgMQorI2RlZmluZSBHTF9WRVJTSU9OXzFfMiAgIDEKKyNkZWZpbmUgR0xfVkVSU0lPTl8xXzMgICAxCisjZGVmaW5lIEdMX0FSQl9pbWFnaW5nICAgMQorCisKKy8qCisgKiBEYXRhdHlwZXMKKyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQJR0xlbnVtOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCUdMYm9vbGVhbjsKK3R5cGVkZWYgdW5zaWduZWQgaW50CUdMYml0ZmllbGQ7Cit0eXBlZGVmIHZvaWQJCUdMdm9pZDsKK3R5cGVkZWYgc2lnbmVkIGNoYXIJR0xieXRlOwkJLyogMS1ieXRlIHNpZ25lZCAqLwordHlwZWRlZiBzaG9ydAkJR0xzaG9ydDsJLyogMi1ieXRlIHNpZ25lZCAqLwordHlwZWRlZiBpbnQJCUdMaW50OwkJLyogNC1ieXRlIHNpZ25lZCAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCUdMdWJ5dGU7CS8qIDEtYnl0ZSB1bnNpZ25lZCAqLwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlHTHVzaG9ydDsJLyogMi1ieXRlIHVuc2lnbmVkICovCit0eXBlZGVmIHVuc2lnbmVkIGludAlHTHVpbnQ7CQkvKiA0LWJ5dGUgdW5zaWduZWQgKi8KK3R5cGVkZWYgaW50CQlHTHNpemVpOwkvKiA0LWJ5dGUgc2lnbmVkICovCit0eXBlZGVmIGZsb2F0CQlHTGZsb2F0OwkvKiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0ICovCit0eXBlZGVmIGZsb2F0CQlHTGNsYW1wZjsJLyogc2luZ2xlIHByZWNpc2lvbiBmbG9hdCBpbiBbMCwxXSAqLwordHlwZWRlZiBkb3VibGUJCUdMZG91YmxlOwkvKiBkb3VibGUgcHJlY2lzaW9uIGZsb2F0ICovCit0eXBlZGVmIGRvdWJsZQkJR0xjbGFtcGQ7CS8qIGRvdWJsZSBwcmVjaXNpb24gZmxvYXQgaW4gWzAsMV0gKi8KKworCisKKy8qCisgKiBDb25zdGFudHMKKyAqLworCisvKiBCb29sZWFuIHZhbHVlcyAqLworI2RlZmluZSBHTF9GQUxTRQkJCQkweDAKKyNkZWZpbmUgR0xfVFJVRQkJCQkJMHgxCisKKy8qIERhdGEgdHlwZXMgKi8KKyNkZWZpbmUgR0xfQllURQkJCQkJMHgxNDAwCisjZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEUJCQkweDE0MDEKKyNkZWZpbmUgR0xfU0hPUlQJCQkJMHgxNDAyCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUCQkJMHgxNDAzCisjZGVmaW5lIEdMX0lOVAkJCQkJMHgxNDA0CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVAkJCQkweDE0MDUKKyNkZWZpbmUgR0xfRkxPQVQJCQkJMHgxNDA2CisjZGVmaW5lIEdMXzJfQllURVMJCQkJMHgxNDA3CisjZGVmaW5lIEdMXzNfQllURVMJCQkJMHgxNDA4CisjZGVmaW5lIEdMXzRfQllURVMJCQkJMHgxNDA5CisjZGVmaW5lIEdMX0RPVUJMRQkJCQkweDE0MEEKKworLyogUHJpbWl0aXZlcyAqLworI2RlZmluZSBHTF9QT0lOVFMJCQkJMHgwMDAwCisjZGVmaW5lIEdMX0xJTkVTCQkJCTB4MDAwMQorI2RlZmluZSBHTF9MSU5FX0xPT1AJCQkJMHgwMDAyCisjZGVmaW5lIEdMX0xJTkVfU1RSSVAJCQkJMHgwMDAzCisjZGVmaW5lIEdMX1RSSUFOR0xFUwkJCQkweDAwMDQKKyNkZWZpbmUgR0xfVFJJQU5HTEVfU1RSSVAJCQkweDAwMDUKKyNkZWZpbmUgR0xfVFJJQU5HTEVfRkFOCQkJCTB4MDAwNgorI2RlZmluZSBHTF9RVUFEUwkJCQkweDAwMDcKKyNkZWZpbmUgR0xfUVVBRF9TVFJJUAkJCQkweDAwMDgKKyNkZWZpbmUgR0xfUE9MWUdPTgkJCQkweDAwMDkKKworLyogVmVydGV4IEFycmF5cyAqLworI2RlZmluZSBHTF9WRVJURVhfQVJSQVkJCQkJMHg4MDc0CisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWQkJCQkweDgwNzUKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVkJCQkJMHg4MDc2CisjZGVmaW5lIEdMX0lOREVYX0FSUkFZCQkJCTB4ODA3NworI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZCQkJMHg4MDc4CisjZGVmaW5lIEdMX0VER0VfRkxBR19BUlJBWQkJCTB4ODA3OQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfU0laRQkJCTB4ODA3QQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfVFlQRQkJCTB4ODA3QgorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfU1RSSURFCQkJMHg4MDdDCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9UWVBFCQkJMHg4MDdFCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9TVFJJREUJCQkweDgwN0YKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfU0laRQkJCTB4ODA4MQorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9UWVBFCQkJMHg4MDgyCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1NUUklERQkJCTB4ODA4MworI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9UWVBFCQkJMHg4MDg1CisjZGVmaW5lIEdMX0lOREVYX0FSUkFZX1NUUklERQkJCTB4ODA4NgorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkUJCTB4ODA4OAorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUJCTB4ODA4OQorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERQkJMHg4MDhBCisjZGVmaW5lIEdMX0VER0VfRkxBR19BUlJBWV9TVFJJREUJCTB4ODA4QworI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUgkJCTB4ODA4RQorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUgkJCTB4ODA4RgorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSCQkJMHg4MDkwCisjZGVmaW5lIEdMX0lOREVYX0FSUkFZX1BPSU5URVIJCQkweDgwOTEKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSCQkweDgwOTIKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX1BPSU5URVIJCTB4ODA5MworI2RlZmluZSBHTF9WMkYJCQkJCTB4MkEyMAorI2RlZmluZSBHTF9WM0YJCQkJCTB4MkEyMQorI2RlZmluZSBHTF9DNFVCX1YyRgkJCQkweDJBMjIKKyNkZWZpbmUgR0xfQzRVQl9WM0YJCQkJMHgyQTIzCisjZGVmaW5lIEdMX0MzRl9WM0YJCQkJMHgyQTI0CisjZGVmaW5lIEdMX04zRl9WM0YJCQkJMHgyQTI1CisjZGVmaW5lIEdMX0M0Rl9OM0ZfVjNGCQkJCTB4MkEyNgorI2RlZmluZSBHTF9UMkZfVjNGCQkJCTB4MkEyNworI2RlZmluZSBHTF9UNEZfVjRGCQkJCTB4MkEyOAorI2RlZmluZSBHTF9UMkZfQzRVQl9WM0YJCQkJMHgyQTI5CisjZGVmaW5lIEdMX1QyRl9DM0ZfVjNGCQkJCTB4MkEyQQorI2RlZmluZSBHTF9UMkZfTjNGX1YzRgkJCQkweDJBMkIKKyNkZWZpbmUgR0xfVDJGX0M0Rl9OM0ZfVjNGCQkJMHgyQTJDCisjZGVmaW5lIEdMX1Q0Rl9DNEZfTjNGX1Y0RgkJCTB4MkEyRAorCisvKiBNYXRyaXggTW9kZSAqLworI2RlZmluZSBHTF9NQVRSSVhfTU9ERQkJCQkweDBCQTAKKyNkZWZpbmUgR0xfTU9ERUxWSUVXCQkJCTB4MTcwMAorI2RlZmluZSBHTF9QUk9KRUNUSU9OCQkJCTB4MTcwMQorI2RlZmluZSBHTF9URVhUVVJFCQkJCTB4MTcwMgorCisvKiBQb2ludHMgKi8KKyNkZWZpbmUgR0xfUE9JTlRfU01PT1RICQkJCTB4MEIxMAorI2RlZmluZSBHTF9QT0lOVF9TSVpFCQkJCTB4MEIxMQorI2RlZmluZSBHTF9QT0lOVF9TSVpFX0dSQU5VTEFSSVRZIAkJMHgwQjEzCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfUkFOR0UJCQkweDBCMTIKKworLyogTGluZXMgKi8KKyNkZWZpbmUgR0xfTElORV9TTU9PVEgJCQkJMHgwQjIwCisjZGVmaW5lIEdMX0xJTkVfU1RJUFBMRQkJCQkweDBCMjQKKyNkZWZpbmUgR0xfTElORV9TVElQUExFX1BBVFRFUk4JCQkweDBCMjUKKyNkZWZpbmUgR0xfTElORV9TVElQUExFX1JFUEVBVAkJCTB4MEIyNgorI2RlZmluZSBHTF9MSU5FX1dJRFRICQkJCTB4MEIyMQorI2RlZmluZSBHTF9MSU5FX1dJRFRIX0dSQU5VTEFSSVRZCQkweDBCMjMKKyNkZWZpbmUgR0xfTElORV9XSURUSF9SQU5HRQkJCTB4MEIyMgorCisvKiBQb2x5Z29ucyAqLworI2RlZmluZSBHTF9QT0lOVAkJCQkweDFCMDAKKyNkZWZpbmUgR0xfTElORQkJCQkJMHgxQjAxCisjZGVmaW5lIEdMX0ZJTEwJCQkJCTB4MUIwMgorI2RlZmluZSBHTF9DVwkJCQkJMHgwOTAwCisjZGVmaW5lIEdMX0NDVwkJCQkJMHgwOTAxCisjZGVmaW5lIEdMX0ZST05UCQkJCTB4MDQwNAorI2RlZmluZSBHTF9CQUNLCQkJCQkweDA0MDUKKyNkZWZpbmUgR0xfUE9MWUdPTl9NT0RFCQkJCTB4MEI0MAorI2RlZmluZSBHTF9QT0xZR09OX1NNT09USAkJCTB4MEI0MQorI2RlZmluZSBHTF9QT0xZR09OX1NUSVBQTEUJCQkweDBCNDIKKyNkZWZpbmUgR0xfRURHRV9GTEFHCQkJCTB4MEI0MworI2RlZmluZSBHTF9DVUxMX0ZBQ0UJCQkJMHgwQjQ0CisjZGVmaW5lIEdMX0NVTExfRkFDRV9NT0RFCQkJMHgwQjQ1CisjZGVmaW5lIEdMX0ZST05UX0ZBQ0UJCQkJMHgwQjQ2CisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUgkJMHg4MDM4CisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTCQkJMHgyQTAwCisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UCQkJMHgyQTAxCisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0xJTkUJCQkweDJBMDIKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRklMTAkJCTB4ODAzNworCisvKiBEaXNwbGF5IExpc3RzICovCisjZGVmaW5lIEdMX0NPTVBJTEUJCQkJMHgxMzAwCisjZGVmaW5lIEdMX0NPTVBJTEVfQU5EX0VYRUNVVEUJCQkweDEzMDEKKyNkZWZpbmUgR0xfTElTVF9CQVNFCQkJCTB4MEIzMgorI2RlZmluZSBHTF9MSVNUX0lOREVYCQkJCTB4MEIzMworI2RlZmluZSBHTF9MSVNUX01PREUJCQkJMHgwQjMwCisKKy8qIERlcHRoIGJ1ZmZlciAqLworI2RlZmluZSBHTF9ORVZFUgkJCQkweDAyMDAKKyNkZWZpbmUgR0xfTEVTUwkJCQkJMHgwMjAxCisjZGVmaW5lIEdMX0VRVUFMCQkJCTB4MDIwMgorI2RlZmluZSBHTF9MRVFVQUwJCQkJMHgwMjAzCisjZGVmaW5lIEdMX0dSRUFURVIJCQkJMHgwMjA0CisjZGVmaW5lIEdMX05PVEVRVUFMCQkJCTB4MDIwNQorI2RlZmluZSBHTF9HRVFVQUwJCQkJMHgwMjA2CisjZGVmaW5lIEdMX0FMV0FZUwkJCQkweDAyMDcKKyNkZWZpbmUgR0xfREVQVEhfVEVTVAkJCQkweDBCNzEKKyNkZWZpbmUgR0xfREVQVEhfQklUUwkJCQkweDBENTYKKyNkZWZpbmUgR0xfREVQVEhfQ0xFQVJfVkFMVUUJCQkweDBCNzMKKyNkZWZpbmUgR0xfREVQVEhfRlVOQwkJCQkweDBCNzQKKyNkZWZpbmUgR0xfREVQVEhfUkFOR0UJCQkJMHgwQjcwCisjZGVmaW5lIEdMX0RFUFRIX1dSSVRFTUFTSwkJCTB4MEI3MgorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQJCQkweDE5MDIKKworLyogTGlnaHRpbmcgKi8KKyNkZWZpbmUgR0xfTElHSFRJTkcJCQkJMHgwQjUwCisjZGVmaW5lIEdMX0xJR0hUMAkJCQkweDQwMDAKKyNkZWZpbmUgR0xfTElHSFQxCQkJCTB4NDAwMQorI2RlZmluZSBHTF9MSUdIVDIJCQkJMHg0MDAyCisjZGVmaW5lIEdMX0xJR0hUMwkJCQkweDQwMDMKKyNkZWZpbmUgR0xfTElHSFQ0CQkJCTB4NDAwNAorI2RlZmluZSBHTF9MSUdIVDUJCQkJMHg0MDA1CisjZGVmaW5lIEdMX0xJR0hUNgkJCQkweDQwMDYKKyNkZWZpbmUgR0xfTElHSFQ3CQkJCTB4NDAwNworI2RlZmluZSBHTF9TUE9UX0VYUE9ORU5UCQkJMHgxMjA1CisjZGVmaW5lIEdMX1NQT1RfQ1VUT0ZGCQkJCTB4MTIwNgorI2RlZmluZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTgkJCTB4MTIwNworI2RlZmluZSBHTF9MSU5FQVJfQVRURU5VQVRJT04JCQkweDEyMDgKKyNkZWZpbmUgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OCQkweDEyMDkKKyNkZWZpbmUgR0xfQU1CSUVOVAkJCQkweDEyMDAKKyNkZWZpbmUgR0xfRElGRlVTRQkJCQkweDEyMDEKKyNkZWZpbmUgR0xfU1BFQ1VMQVIJCQkJMHgxMjAyCisjZGVmaW5lIEdMX1NISU5JTkVTUwkJCQkweDE2MDEKKyNkZWZpbmUgR0xfRU1JU1NJT04JCQkJMHgxNjAwCisjZGVmaW5lIEdMX1BPU0lUSU9OCQkJCTB4MTIwMworI2RlZmluZSBHTF9TUE9UX0RJUkVDVElPTgkJCTB4MTIwNAorI2RlZmluZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFCQkJMHgxNjAyCisjZGVmaW5lIEdMX0NPTE9SX0lOREVYRVMJCQkweDE2MDMKKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfVFdPX1NJREUJCQkweDBCNTIKKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSCQkweDBCNTEKKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfQU1CSUVOVAkJCTB4MEI1MworI2RlZmluZSBHTF9GUk9OVF9BTkRfQkFDSwkJCTB4MDQwOAorI2RlZmluZSBHTF9TSEFERV9NT0RFTAkJCQkweDBCNTQKKyNkZWZpbmUgR0xfRkxBVAkJCQkJMHgxRDAwCisjZGVmaW5lIEdMX1NNT09USAkJCQkweDFEMDEKKyNkZWZpbmUgR0xfQ09MT1JfTUFURVJJQUwJCQkweDBCNTcKKyNkZWZpbmUgR0xfQ09MT1JfTUFURVJJQUxfRkFDRQkJCTB4MEI1NQorI2RlZmluZSBHTF9DT0xPUl9NQVRFUklBTF9QQVJBTUVURVIJCTB4MEI1NgorI2RlZmluZSBHTF9OT1JNQUxJWkUJCQkJMHgwQkExCisKKy8qIFVzZXIgY2xpcHBpbmcgcGxhbmVzICovCisjZGVmaW5lIEdMX0NMSVBfUExBTkUwCQkJCTB4MzAwMAorI2RlZmluZSBHTF9DTElQX1BMQU5FMQkJCQkweDMwMDEKKyNkZWZpbmUgR0xfQ0xJUF9QTEFORTIJCQkJMHgzMDAyCisjZGVmaW5lIEdMX0NMSVBfUExBTkUzCQkJCTB4MzAwMworI2RlZmluZSBHTF9DTElQX1BMQU5FNAkJCQkweDMwMDQKKyNkZWZpbmUgR0xfQ0xJUF9QTEFORTUJCQkJMHgzMDA1CisKKy8qIEFjY3VtdWxhdGlvbiBidWZmZXIgKi8KKyNkZWZpbmUgR0xfQUNDVU1fUkVEX0JJVFMJCQkweDBENTgKKyNkZWZpbmUgR0xfQUNDVU1fR1JFRU5fQklUUwkJCTB4MEQ1OQorI2RlZmluZSBHTF9BQ0NVTV9CTFVFX0JJVFMJCQkweDBENUEKKyNkZWZpbmUgR0xfQUNDVU1fQUxQSEFfQklUUwkJCTB4MEQ1QgorI2RlZmluZSBHTF9BQ0NVTV9DTEVBUl9WQUxVRQkJCTB4MEI4MAorI2RlZmluZSBHTF9BQ0NVTQkJCQkweDAxMDAKKyNkZWZpbmUgR0xfQURECQkJCQkweDAxMDQKKyNkZWZpbmUgR0xfTE9BRAkJCQkJMHgwMTAxCisjZGVmaW5lIEdMX01VTFQJCQkJCTB4MDEwMworI2RlZmluZSBHTF9SRVRVUk4JCQkJMHgwMTAyCisKKy8qIEFscGhhIHRlc3RpbmcgKi8KKyNkZWZpbmUgR0xfQUxQSEFfVEVTVAkJCQkweDBCQzAKKyNkZWZpbmUgR0xfQUxQSEFfVEVTVF9SRUYJCQkweDBCQzIKKyNkZWZpbmUgR0xfQUxQSEFfVEVTVF9GVU5DCQkJMHgwQkMxCisKKy8qIEJsZW5kaW5nICovCisjZGVmaW5lIEdMX0JMRU5ECQkJCTB4MEJFMgorI2RlZmluZSBHTF9CTEVORF9TUkMJCQkJMHgwQkUxCisjZGVmaW5lIEdMX0JMRU5EX0RTVAkJCQkweDBCRTAKKyNkZWZpbmUgR0xfWkVSTwkJCQkJMHgwCisjZGVmaW5lIEdMX09ORQkJCQkJMHgxCisjZGVmaW5lIEdMX1NSQ19DT0xPUgkJCQkweDAzMDAKKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19DT0xPUgkJCTB4MDMwMQorI2RlZmluZSBHTF9TUkNfQUxQSEEJCQkJMHgwMzAyCisjZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQUxQSEEJCQkweDAzMDMKKyNkZWZpbmUgR0xfRFNUX0FMUEhBCQkJCTB4MDMwNAorI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBCQkJMHgwMzA1CisjZGVmaW5lIEdMX0RTVF9DT0xPUgkJCQkweDAzMDYKKyNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9DT0xPUgkJCTB4MDMwNworI2RlZmluZSBHTF9TUkNfQUxQSEFfU0FUVVJBVEUJCQkweDAzMDgKKworLyogUmVuZGVyIE1vZGUgKi8KKyNkZWZpbmUgR0xfRkVFREJBQ0sJCQkJMHgxQzAxCisjZGVmaW5lIEdMX1JFTkRFUgkJCQkweDFDMDAKKyNkZWZpbmUgR0xfU0VMRUNUCQkJCTB4MUMwMgorCisvKiBGZWVkYmFjayAqLworI2RlZmluZSBHTF8yRAkJCQkJMHgwNjAwCisjZGVmaW5lIEdMXzNECQkJCQkweDA2MDEKKyNkZWZpbmUgR0xfM0RfQ09MT1IJCQkJMHgwNjAyCisjZGVmaW5lIEdMXzNEX0NPTE9SX1RFWFRVUkUJCQkweDA2MDMKKyNkZWZpbmUgR0xfNERfQ09MT1JfVEVYVFVSRQkJCTB4MDYwNAorI2RlZmluZSBHTF9QT0lOVF9UT0tFTgkJCQkweDA3MDEKKyNkZWZpbmUgR0xfTElORV9UT0tFTgkJCQkweDA3MDIKKyNkZWZpbmUgR0xfTElORV9SRVNFVF9UT0tFTgkJCTB4MDcwNworI2RlZmluZSBHTF9QT0xZR09OX1RPS0VOCQkJMHgwNzAzCisjZGVmaW5lIEdMX0JJVE1BUF9UT0tFTgkJCQkweDA3MDQKKyNkZWZpbmUgR0xfRFJBV19QSVhFTF9UT0tFTgkJCTB4MDcwNQorI2RlZmluZSBHTF9DT1BZX1BJWEVMX1RPS0VOCQkJMHgwNzA2CisjZGVmaW5lIEdMX1BBU1NfVEhST1VHSF9UT0tFTgkJCTB4MDcwMAorI2RlZmluZSBHTF9GRUVEQkFDS19CVUZGRVJfUE9JTlRFUgkJMHgwREYwCisjZGVmaW5lIEdMX0ZFRURCQUNLX0JVRkZFUl9TSVpFCQkJMHgwREYxCisjZGVmaW5lIEdMX0ZFRURCQUNLX0JVRkZFUl9UWVBFCQkJMHgwREYyCisKKy8qIFNlbGVjdGlvbiAqLworI2RlZmluZSBHTF9TRUxFQ1RJT05fQlVGRkVSX1BPSU5URVIJCTB4MERGMworI2RlZmluZSBHTF9TRUxFQ1RJT05fQlVGRkVSX1NJWkUJCTB4MERGNAorCisvKiBGb2cgKi8KKyNkZWZpbmUgR0xfRk9HCQkJCQkweDBCNjAKKyNkZWZpbmUgR0xfRk9HX01PREUJCQkJMHgwQjY1CisjZGVmaW5lIEdMX0ZPR19ERU5TSVRZCQkJCTB4MEI2MgorI2RlZmluZSBHTF9GT0dfQ09MT1IJCQkJMHgwQjY2CisjZGVmaW5lIEdMX0ZPR19JTkRFWAkJCQkweDBCNjEKKyNkZWZpbmUgR0xfRk9HX1NUQVJUCQkJCTB4MEI2MworI2RlZmluZSBHTF9GT0dfRU5ECQkJCTB4MEI2NAorI2RlZmluZSBHTF9MSU5FQVIJCQkJMHgyNjAxCisjZGVmaW5lIEdMX0VYUAkJCQkJMHgwODAwCisjZGVmaW5lIEdMX0VYUDIJCQkJCTB4MDgwMQorCisvKiBMb2dpYyBPcHMgKi8KKyNkZWZpbmUgR0xfTE9HSUNfT1AJCQkJMHgwQkYxCisjZGVmaW5lIEdMX0lOREVYX0xPR0lDX09QCQkJMHgwQkYxCisjZGVmaW5lIEdMX0NPTE9SX0xPR0lDX09QCQkJMHgwQkYyCisjZGVmaW5lIEdMX0xPR0lDX09QX01PREUJCQkweDBCRjAKKyNkZWZpbmUgR0xfQ0xFQVIJCQkJMHgxNTAwCisjZGVmaW5lIEdMX1NFVAkJCQkJMHgxNTBGCisjZGVmaW5lIEdMX0NPUFkJCQkJCTB4MTUwMworI2RlZmluZSBHTF9DT1BZX0lOVkVSVEVECQkJMHgxNTBDCisjZGVmaW5lIEdMX05PT1AJCQkJCTB4MTUwNQorI2RlZmluZSBHTF9JTlZFUlQJCQkJMHgxNTBBCisjZGVmaW5lIEdMX0FORAkJCQkJMHgxNTAxCisjZGVmaW5lIEdMX05BTkQJCQkJCTB4MTUwRQorI2RlZmluZSBHTF9PUgkJCQkJMHgxNTA3CisjZGVmaW5lIEdMX05PUgkJCQkJMHgxNTA4CisjZGVmaW5lIEdMX1hPUgkJCQkJMHgxNTA2CisjZGVmaW5lIEdMX0VRVUlWCQkJCTB4MTUwOQorI2RlZmluZSBHTF9BTkRfUkVWRVJTRQkJCQkweDE1MDIKKyNkZWZpbmUgR0xfQU5EX0lOVkVSVEVECQkJCTB4MTUwNAorI2RlZmluZSBHTF9PUl9SRVZFUlNFCQkJCTB4MTUwQgorI2RlZmluZSBHTF9PUl9JTlZFUlRFRAkJCQkweDE1MEQKKworLyogU3RlbmNpbCAqLworI2RlZmluZSBHTF9TVEVOQ0lMX0JJVFMJCQkJMHgwRDU3CisjZGVmaW5lIEdMX1NURU5DSUxfVEVTVAkJCQkweDBCOTAKKyNkZWZpbmUgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRQkJCTB4MEI5MQorI2RlZmluZSBHTF9TVEVOQ0lMX0ZVTkMJCQkJMHgwQjkyCisjZGVmaW5lIEdMX1NURU5DSUxfVkFMVUVfTUFTSwkJCTB4MEI5MworI2RlZmluZSBHTF9TVEVOQ0lMX0ZBSUwJCQkJMHgwQjk0CisjZGVmaW5lIEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMCQkweDBCOTUKKyNkZWZpbmUgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MJCTB4MEI5NgorI2RlZmluZSBHTF9TVEVOQ0lMX1JFRgkJCQkweDBCOTcKKyNkZWZpbmUgR0xfU1RFTkNJTF9XUklURU1BU0sJCQkweDBCOTgKKyNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWAkJCTB4MTkwMQorI2RlZmluZSBHTF9LRUVQCQkJCQkweDFFMDAKKyNkZWZpbmUgR0xfUkVQTEFDRQkJCQkweDFFMDEKKyNkZWZpbmUgR0xfSU5DUgkJCQkJMHgxRTAyCisjZGVmaW5lIEdMX0RFQ1IJCQkJCTB4MUUwMworCisvKiBCdWZmZXJzLCBQaXhlbCBEcmF3aW5nL1JlYWRpbmcgKi8KKyNkZWZpbmUgR0xfTk9ORQkJCQkJMHgwCisjZGVmaW5lIEdMX0xFRlQJCQkJCTB4MDQwNgorI2RlZmluZSBHTF9SSUdIVAkJCQkweDA0MDcKKy8qR0xfRlJPTlQJCQkJCTB4MDQwNCAqLworLypHTF9CQUNLCQkJCQkweDA0MDUgKi8KKy8qR0xfRlJPTlRfQU5EX0JBQ0sJCQkJMHgwNDA4ICovCisjZGVmaW5lIEdMX0ZST05UX0xFRlQJCQkJMHgwNDAwCisjZGVmaW5lIEdMX0ZST05UX1JJR0hUCQkJCTB4MDQwMQorI2RlZmluZSBHTF9CQUNLX0xFRlQJCQkJMHgwNDAyCisjZGVmaW5lIEdMX0JBQ0tfUklHSFQJCQkJMHgwNDAzCisjZGVmaW5lIEdMX0FVWDAJCQkJCTB4MDQwOQorI2RlZmluZSBHTF9BVVgxCQkJCQkweDA0MEEKKyNkZWZpbmUgR0xfQVVYMgkJCQkJMHgwNDBCCisjZGVmaW5lIEdMX0FVWDMJCQkJCTB4MDQwQworI2RlZmluZSBHTF9DT0xPUl9JTkRFWAkJCQkweDE5MDAKKyNkZWZpbmUgR0xfUkVECQkJCQkweDE5MDMKKyNkZWZpbmUgR0xfR1JFRU4JCQkJMHgxOTA0CisjZGVmaW5lIEdMX0JMVUUJCQkJCTB4MTkwNQorI2RlZmluZSBHTF9BTFBIQQkJCQkweDE5MDYKKyNkZWZpbmUgR0xfTFVNSU5BTkNFCQkJCTB4MTkwOQorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEEJCQkweDE5MEEKKyNkZWZpbmUgR0xfQUxQSEFfQklUUwkJCQkweDBENTUKKyNkZWZpbmUgR0xfUkVEX0JJVFMJCQkJMHgwRDUyCisjZGVmaW5lIEdMX0dSRUVOX0JJVFMJCQkJMHgwRDUzCisjZGVmaW5lIEdMX0JMVUVfQklUUwkJCQkweDBENTQKKyNkZWZpbmUgR0xfSU5ERVhfQklUUwkJCQkweDBENTEKKyNkZWZpbmUgR0xfU1VCUElYRUxfQklUUwkJCTB4MEQ1MAorI2RlZmluZSBHTF9BVVhfQlVGRkVSUwkJCQkweDBDMDAKKyNkZWZpbmUgR0xfUkVBRF9CVUZGRVIJCQkJMHgwQzAyCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSCQkJCTB4MEMwMQorI2RlZmluZSBHTF9ET1VCTEVCVUZGRVIJCQkJMHgwQzMyCisjZGVmaW5lIEdMX1NURVJFTwkJCQkweDBDMzMKKyNkZWZpbmUgR0xfQklUTUFQCQkJCTB4MUEwMAorI2RlZmluZSBHTF9DT0xPUgkJCQkweDE4MDAKKyNkZWZpbmUgR0xfREVQVEgJCQkJMHgxODAxCisjZGVmaW5lIEdMX1NURU5DSUwJCQkJMHgxODAyCisjZGVmaW5lIEdMX0RJVEhFUgkJCQkweDBCRDAKKyNkZWZpbmUgR0xfUkdCCQkJCQkweDE5MDcKKyNkZWZpbmUgR0xfUkdCQQkJCQkJMHgxOTA4CisKKy8qIEltcGxlbWVudGF0aW9uIGxpbWl0cyAqLworI2RlZmluZSBHTF9NQVhfTElTVF9ORVNUSU5HCQkJMHgwQjMxCisjZGVmaW5lIEdMX01BWF9FVkFMX09SREVSCQkJMHgwRDMwCisjZGVmaW5lIEdMX01BWF9MSUdIVFMJCQkJMHgwRDMxCisjZGVmaW5lIEdMX01BWF9DTElQX1BMQU5FUwkJCTB4MEQzMgorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TSVpFCQkJMHgwRDMzCisjZGVmaW5lIEdMX01BWF9QSVhFTF9NQVBfVEFCTEUJCQkweDBEMzQKKyNkZWZpbmUgR0xfTUFYX0FUVFJJQl9TVEFDS19ERVBUSAkJMHgwRDM1CisjZGVmaW5lIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEgJCTB4MEQzNgorI2RlZmluZSBHTF9NQVhfTkFNRV9TVEFDS19ERVBUSAkJCTB4MEQzNworI2RlZmluZSBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSAkJMHgwRDM4CisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRICQkweDBEMzkKKyNkZWZpbmUgR0xfTUFYX1ZJRVdQT1JUX0RJTVMJCQkweDBEM0EKKyNkZWZpbmUgR0xfTUFYX0NMSUVOVF9BVFRSSUJfU1RBQ0tfREVQVEgJMHgwRDNCCisKKy8qIEdldHMgKi8KKyNkZWZpbmUgR0xfQVRUUklCX1NUQUNLX0RFUFRICQkJMHgwQkIwCisjZGVmaW5lIEdMX0NMSUVOVF9BVFRSSUJfU1RBQ0tfREVQVEgJCTB4MEJCMQorI2RlZmluZSBHTF9DT0xPUl9DTEVBUl9WQUxVRQkJCTB4MEMyMgorI2RlZmluZSBHTF9DT0xPUl9XUklURU1BU0sJCQkweDBDMjMKKyNkZWZpbmUgR0xfQ1VSUkVOVF9JTkRFWAkJCTB4MEIwMQorI2RlZmluZSBHTF9DVVJSRU5UX0NPTE9SCQkJMHgwQjAwCisjZGVmaW5lIEdMX0NVUlJFTlRfTk9STUFMCQkJMHgwQjAyCisjZGVmaW5lIEdMX0NVUlJFTlRfUkFTVEVSX0NPTE9SCQkJMHgwQjA0CisjZGVmaW5lIEdMX0NVUlJFTlRfUkFTVEVSX0RJU1RBTkNFCQkweDBCMDkKKyNkZWZpbmUgR0xfQ1VSUkVOVF9SQVNURVJfSU5ERVgJCQkweDBCMDUKKyNkZWZpbmUgR0xfQ1VSUkVOVF9SQVNURVJfUE9TSVRJT04JCTB4MEIwNworI2RlZmluZSBHTF9DVVJSRU5UX1JBU1RFUl9URVhUVVJFX0NPT1JEUwkweDBCMDYKKyNkZWZpbmUgR0xfQ1VSUkVOVF9SQVNURVJfUE9TSVRJT05fVkFMSUQJMHgwQjA4CisjZGVmaW5lIEdMX0NVUlJFTlRfVEVYVFVSRV9DT09SRFMJCTB4MEIwMworI2RlZmluZSBHTF9JTkRFWF9DTEVBUl9WQUxVRQkJCTB4MEMyMAorI2RlZmluZSBHTF9JTkRFWF9NT0RFCQkJCTB4MEMzMAorI2RlZmluZSBHTF9JTkRFWF9XUklURU1BU0sJCQkweDBDMjEKKyNkZWZpbmUgR0xfTU9ERUxWSUVXX01BVFJJWAkJCTB4MEJBNgorI2RlZmluZSBHTF9NT0RFTFZJRVdfU1RBQ0tfREVQVEgJCTB4MEJBMworI2RlZmluZSBHTF9OQU1FX1NUQUNLX0RFUFRICQkJMHgwRDcwCisjZGVmaW5lIEdMX1BST0pFQ1RJT05fTUFUUklYCQkJMHgwQkE3CisjZGVmaW5lIEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEgJCTB4MEJBNAorI2RlZmluZSBHTF9SRU5ERVJfTU9ERQkJCQkweDBDNDAKKyNkZWZpbmUgR0xfUkdCQV9NT0RFCQkJCTB4MEMzMQorI2RlZmluZSBHTF9URVhUVVJFX01BVFJJWAkJCTB4MEJBOAorI2RlZmluZSBHTF9URVhUVVJFX1NUQUNLX0RFUFRICQkJMHgwQkE1CisjZGVmaW5lIEdMX1ZJRVdQT1JUCQkJCTB4MEJBMgorCisvKiBFdmFsdWF0b3JzICovCisjZGVmaW5lIEdMX0FVVE9fTk9STUFMCQkJCTB4MEQ4MAorI2RlZmluZSBHTF9NQVAxX0NPTE9SXzQJCQkJMHgwRDkwCisjZGVmaW5lIEdMX01BUDFfSU5ERVgJCQkJMHgwRDkxCisjZGVmaW5lIEdMX01BUDFfTk9STUFMCQkJCTB4MEQ5MgorI2RlZmluZSBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMQkJCTB4MEQ5MworI2RlZmluZSBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMgkJCTB4MEQ5NAorI2RlZmluZSBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMwkJCTB4MEQ5NQorI2RlZmluZSBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfNAkJCTB4MEQ5NgorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF8zCQkJMHgwRDk3CisjZGVmaW5lIEdMX01BUDFfVkVSVEVYXzQJCQkweDBEOTgKKyNkZWZpbmUgR0xfTUFQMl9DT0xPUl80CQkJCTB4MERCMAorI2RlZmluZSBHTF9NQVAyX0lOREVYCQkJCTB4MERCMQorI2RlZmluZSBHTF9NQVAyX05PUk1BTAkJCQkweDBEQjIKKyNkZWZpbmUgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzEJCQkweDBEQjMKKyNkZWZpbmUgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzIJCQkweDBEQjQKKyNkZWZpbmUgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzMJCQkweDBEQjUKKyNkZWZpbmUgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzQJCQkweDBEQjYKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfMwkJCTB4MERCNworI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF80CQkJMHgwREI4CisjZGVmaW5lIEdMX01BUDFfR1JJRF9ET01BSU4JCQkweDBERDAKKyNkZWZpbmUgR0xfTUFQMV9HUklEX1NFR01FTlRTCQkJMHgwREQxCisjZGVmaW5lIEdMX01BUDJfR1JJRF9ET01BSU4JCQkweDBERDIKKyNkZWZpbmUgR0xfTUFQMl9HUklEX1NFR01FTlRTCQkJMHgwREQzCisjZGVmaW5lIEdMX0NPRUZGCQkJCTB4MEEwMAorI2RlZmluZSBHTF9PUkRFUgkJCQkweDBBMDEKKyNkZWZpbmUgR0xfRE9NQUlOCQkJCTB4MEEwMgorCisvKiBIaW50cyAqLworI2RlZmluZSBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQJCTB4MEM1MAorI2RlZmluZSBHTF9QT0lOVF9TTU9PVEhfSElOVAkJCTB4MEM1MQorI2RlZmluZSBHTF9MSU5FX1NNT09USF9ISU5UCQkJMHgwQzUyCisjZGVmaW5lIEdMX1BPTFlHT05fU01PT1RIX0hJTlQJCQkweDBDNTMKKyNkZWZpbmUgR0xfRk9HX0hJTlQJCQkJMHgwQzU0CisjZGVmaW5lIEdMX0RPTlRfQ0FSRQkJCQkweDExMDAKKyNkZWZpbmUgR0xfRkFTVEVTVAkJCQkweDExMDEKKyNkZWZpbmUgR0xfTklDRVNUCQkJCTB4MTEwMgorCisvKiBTY2lzc29yIGJveCAqLworI2RlZmluZSBHTF9TQ0lTU09SX0JPWAkJCQkweDBDMTAKKyNkZWZpbmUgR0xfU0NJU1NPUl9URVNUCQkJCTB4MEMxMQorCisvKiBQaXhlbCBNb2RlIC8gVHJhbnNmZXIgKi8KKyNkZWZpbmUgR0xfTUFQX0NPTE9SCQkJCTB4MEQxMAorI2RlZmluZSBHTF9NQVBfU1RFTkNJTAkJCQkweDBEMTEKKyNkZWZpbmUgR0xfSU5ERVhfU0hJRlQJCQkJMHgwRDEyCisjZGVmaW5lIEdMX0lOREVYX09GRlNFVAkJCQkweDBEMTMKKyNkZWZpbmUgR0xfUkVEX1NDQUxFCQkJCTB4MEQxNAorI2RlZmluZSBHTF9SRURfQklBUwkJCQkweDBEMTUKKyNkZWZpbmUgR0xfR1JFRU5fU0NBTEUJCQkJMHgwRDE4CisjZGVmaW5lIEdMX0dSRUVOX0JJQVMJCQkJMHgwRDE5CisjZGVmaW5lIEdMX0JMVUVfU0NBTEUJCQkJMHgwRDFBCisjZGVmaW5lIEdMX0JMVUVfQklBUwkJCQkweDBEMUIKKyNkZWZpbmUgR0xfQUxQSEFfU0NBTEUJCQkJMHgwRDFDCisjZGVmaW5lIEdMX0FMUEhBX0JJQVMJCQkJMHgwRDFECisjZGVmaW5lIEdMX0RFUFRIX1NDQUxFCQkJCTB4MEQxRQorI2RlZmluZSBHTF9ERVBUSF9CSUFTCQkJCTB4MEQxRgorI2RlZmluZSBHTF9QSVhFTF9NQVBfU19UT19TX1NJWkUJCTB4MENCMQorI2RlZmluZSBHTF9QSVhFTF9NQVBfSV9UT19JX1NJWkUJCTB4MENCMAorI2RlZmluZSBHTF9QSVhFTF9NQVBfSV9UT19SX1NJWkUJCTB4MENCMgorI2RlZmluZSBHTF9QSVhFTF9NQVBfSV9UT19HX1NJWkUJCTB4MENCMworI2RlZmluZSBHTF9QSVhFTF9NQVBfSV9UT19CX1NJWkUJCTB4MENCNAorI2RlZmluZSBHTF9QSVhFTF9NQVBfSV9UT19BX1NJWkUJCTB4MENCNQorI2RlZmluZSBHTF9QSVhFTF9NQVBfUl9UT19SX1NJWkUJCTB4MENCNgorI2RlZmluZSBHTF9QSVhFTF9NQVBfR19UT19HX1NJWkUJCTB4MENCNworI2RlZmluZSBHTF9QSVhFTF9NQVBfQl9UT19CX1NJWkUJCTB4MENCOAorI2RlZmluZSBHTF9QSVhFTF9NQVBfQV9UT19BX1NJWkUJCTB4MENCOQorI2RlZmluZSBHTF9QSVhFTF9NQVBfU19UT19TCQkJMHgwQzcxCisjZGVmaW5lIEdMX1BJWEVMX01BUF9JX1RPX0kJCQkweDBDNzAKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0lfVE9fUgkJCTB4MEM3MgorI2RlZmluZSBHTF9QSVhFTF9NQVBfSV9UT19HCQkJMHgwQzczCisjZGVmaW5lIEdMX1BJWEVMX01BUF9JX1RPX0IJCQkweDBDNzQKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0lfVE9fQQkJCTB4MEM3NQorI2RlZmluZSBHTF9QSVhFTF9NQVBfUl9UT19SCQkJMHgwQzc2CisjZGVmaW5lIEdMX1BJWEVMX01BUF9HX1RPX0cJCQkweDBDNzcKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0JfVE9fQgkJCTB4MEM3OAorI2RlZmluZSBHTF9QSVhFTF9NQVBfQV9UT19BCQkJMHgwQzc5CisjZGVmaW5lIEdMX1BBQ0tfQUxJR05NRU5UCQkJMHgwRDA1CisjZGVmaW5lIEdMX1BBQ0tfTFNCX0ZJUlNUCQkJMHgwRDAxCisjZGVmaW5lIEdMX1BBQ0tfUk9XX0xFTkdUSAkJCTB4MEQwMgorI2RlZmluZSBHTF9QQUNLX1NLSVBfUElYRUxTCQkJMHgwRDA0CisjZGVmaW5lIEdMX1BBQ0tfU0tJUF9ST1dTCQkJMHgwRDAzCisjZGVmaW5lIEdMX1BBQ0tfU1dBUF9CWVRFUwkJCTB4MEQwMAorI2RlZmluZSBHTF9VTlBBQ0tfQUxJR05NRU5UCQkJMHgwQ0Y1CisjZGVmaW5lIEdMX1VOUEFDS19MU0JfRklSU1QJCQkweDBDRjEKKyNkZWZpbmUgR0xfVU5QQUNLX1JPV19MRU5HVEgJCQkweDBDRjIKKyNkZWZpbmUgR0xfVU5QQUNLX1NLSVBfUElYRUxTCQkJMHgwQ0Y0CisjZGVmaW5lIEdMX1VOUEFDS19TS0lQX1JPV1MJCQkweDBDRjMKKyNkZWZpbmUgR0xfVU5QQUNLX1NXQVBfQllURVMJCQkweDBDRjAKKyNkZWZpbmUgR0xfWk9PTV9YCQkJCTB4MEQxNgorI2RlZmluZSBHTF9aT09NX1kJCQkJMHgwRDE3CisKKy8qIFRleHR1cmUgbWFwcGluZyAqLworI2RlZmluZSBHTF9URVhUVVJFX0VOVgkJCQkweDIzMDAKKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlZfTU9ERQkJCTB4MjIwMAorI2RlZmluZSBHTF9URVhUVVJFXzFECQkJCTB4MERFMAorI2RlZmluZSBHTF9URVhUVVJFXzJECQkJCTB4MERFMQorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUwkJCTB4MjgwMgorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfVAkJCTB4MjgwMworI2RlZmluZSBHTF9URVhUVVJFX01BR19GSUxURVIJCQkweDI4MDAKKyNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fRklMVEVSCQkJMHgyODAxCisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WX0NPTE9SCQkJMHgyMjAxCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VOX1MJCQkweDBDNjAKKyNkZWZpbmUgR0xfVEVYVFVSRV9HRU5fVAkJCTB4MEM2MQorI2RlZmluZSBHTF9URVhUVVJFX0dFTl9SCQkJMHgwQzYyCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VOX1EJCQkweDBDNjMKKyNkZWZpbmUgR0xfVEVYVFVSRV9HRU5fTU9ERQkJCTB4MjUwMAorI2RlZmluZSBHTF9URVhUVVJFX0JPUkRFUl9DT0xPUgkJCTB4MTAwNAorI2RlZmluZSBHTF9URVhUVVJFX1dJRFRICQkJMHgxMDAwCisjZGVmaW5lIEdMX1RFWFRVUkVfSEVJR0hUCQkJMHgxMDAxCisjZGVmaW5lIEdMX1RFWFRVUkVfQk9SREVSCQkJMHgxMDA1CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUE9ORU5UUwkJCTB4MTAwMworI2RlZmluZSBHTF9URVhUVVJFX1JFRF9TSVpFCQkJMHg4MDVDCisjZGVmaW5lIEdMX1RFWFRVUkVfR1JFRU5fU0laRQkJCTB4ODA1RAorI2RlZmluZSBHTF9URVhUVVJFX0JMVUVfU0laRQkJCTB4ODA1RQorI2RlZmluZSBHTF9URVhUVVJFX0FMUEhBX1NJWkUJCQkweDgwNUYKKyNkZWZpbmUgR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRQkJMHg4MDYwCisjZGVmaW5lIEdMX1RFWFRVUkVfSU5URU5TSVRZX1NJWkUJCTB4ODA2MQorI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUCQkweDI3MDAKKyNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSCQkweDI3MDIKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUCQkweDI3MDEKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9MSU5FQVIJCQkweDI3MDMKKyNkZWZpbmUgR0xfT0JKRUNUX0xJTkVBUgkJCTB4MjQwMQorI2RlZmluZSBHTF9PQkpFQ1RfUExBTkUJCQkJMHgyNTAxCisjZGVmaW5lIEdMX0VZRV9MSU5FQVIJCQkJMHgyNDAwCisjZGVmaW5lIEdMX0VZRV9QTEFORQkJCQkweDI1MDIKKyNkZWZpbmUgR0xfU1BIRVJFX01BUAkJCQkweDI0MDIKKyNkZWZpbmUgR0xfREVDQUwJCQkJMHgyMTAxCisjZGVmaW5lIEdMX01PRFVMQVRFCQkJCTB4MjEwMAorI2RlZmluZSBHTF9ORUFSRVNUCQkJCTB4MjYwMAorI2RlZmluZSBHTF9SRVBFQVQJCQkJMHgyOTAxCisjZGVmaW5lIEdMX0NMQU1QCQkJCTB4MjkwMAorI2RlZmluZSBHTF9TCQkJCQkweDIwMDAKKyNkZWZpbmUgR0xfVAkJCQkJMHgyMDAxCisjZGVmaW5lIEdMX1IJCQkJCTB4MjAwMgorI2RlZmluZSBHTF9RCQkJCQkweDIwMDMKKworLyogVXRpbGl0eSAqLworI2RlZmluZSBHTF9WRU5ET1IJCQkJMHgxRjAwCisjZGVmaW5lIEdMX1JFTkRFUkVSCQkJCTB4MUYwMQorI2RlZmluZSBHTF9WRVJTSU9OCQkJCTB4MUYwMgorI2RlZmluZSBHTF9FWFRFTlNJT05TCQkJCTB4MUYwMworCisvKiBFcnJvcnMgKi8KKyNkZWZpbmUgR0xfTk9fRVJST1IgCQkJCTB4MAorI2RlZmluZSBHTF9JTlZBTElEX0VOVU0JCQkJMHgwNTAwCisjZGVmaW5lIEdMX0lOVkFMSURfVkFMVUUJCQkweDA1MDEKKyNkZWZpbmUgR0xfSU5WQUxJRF9PUEVSQVRJT04JCQkweDA1MDIKKyNkZWZpbmUgR0xfU1RBQ0tfT1ZFUkZMT1cJCQkweDA1MDMKKyNkZWZpbmUgR0xfU1RBQ0tfVU5ERVJGTE9XCQkJMHgwNTA0CisjZGVmaW5lIEdMX09VVF9PRl9NRU1PUlkJCQkweDA1MDUKKworLyogZ2xQdXNoL1BvcEF0dHJpYiBiaXRzICovCisjZGVmaW5lIEdMX0NVUlJFTlRfQklUCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgR0xfUE9JTlRfQklUCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0xfTElORV9CSVQJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBHTF9QT0xZR09OX0JJVAkJCQkweDAwMDAwMDA4CisjZGVmaW5lIEdMX1BPTFlHT05fU1RJUFBMRV9CSVQJCQkweDAwMDAwMDEwCisjZGVmaW5lIEdMX1BJWEVMX01PREVfQklUCQkJMHgwMDAwMDAyMAorI2RlZmluZSBHTF9MSUdIVElOR19CSVQJCQkJMHgwMDAwMDA0MAorI2RlZmluZSBHTF9GT0dfQklUCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVAkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgR0xfQUNDVU1fQlVGRkVSX0JJVAkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUCQkJMHgwMDAwMDQwMAorI2RlZmluZSBHTF9WSUVXUE9SVF9CSVQJCQkJMHgwMDAwMDgwMAorI2RlZmluZSBHTF9UUkFOU0ZPUk1fQklUCQkJMHgwMDAwMTAwMAorI2RlZmluZSBHTF9FTkFCTEVfQklUCQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVAkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgR0xfSElOVF9CSVQJCQkJMHgwMDAwODAwMAorI2RlZmluZSBHTF9FVkFMX0JJVAkJCQkweDAwMDEwMDAwCisjZGVmaW5lIEdMX0xJU1RfQklUCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSVQJCQkJMHgwMDA0MDAwMAorI2RlZmluZSBHTF9TQ0lTU09SX0JJVAkJCQkweDAwMDgwMDAwCisjZGVmaW5lIEdMX0FMTF9BVFRSSUJfQklUUwkJCTB4MDAwRkZGRkYKKworCisvKiBPcGVuR0wgMS4xICovCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfMUQJCQkweDgwNjMKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8yRAkJCTB4ODA2NAorI2RlZmluZSBHTF9URVhUVVJFX1BSSU9SSVRZCQkJMHg4MDY2CisjZGVmaW5lIEdMX1RFWFRVUkVfUkVTSURFTlQJCQkweDgwNjcKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HXzFECQkJMHg4MDY4CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18yRAkJCTB4ODA2OQorI2RlZmluZSBHTF9URVhUVVJFX0lOVEVSTkFMX0ZPUk1BVAkJMHgxMDAzCisjZGVmaW5lIEdMX0FMUEhBNAkJCQkweDgwM0IKKyNkZWZpbmUgR0xfQUxQSEE4CQkJCTB4ODAzQworI2RlZmluZSBHTF9BTFBIQTEyCQkJCTB4ODAzRAorI2RlZmluZSBHTF9BTFBIQTE2CQkJCTB4ODAzRQorI2RlZmluZSBHTF9MVU1JTkFOQ0U0CQkJCTB4ODAzRgorI2RlZmluZSBHTF9MVU1JTkFOQ0U4CQkJCTB4ODA0MAorI2RlZmluZSBHTF9MVU1JTkFOQ0UxMgkJCQkweDgwNDEKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTYJCQkJMHg4MDQyCisjZGVmaW5lIEdMX0xVTUlOQU5DRTRfQUxQSEE0CQkJMHg4MDQzCisjZGVmaW5lIEdMX0xVTUlOQU5DRTZfQUxQSEEyCQkJMHg4MDQ0CisjZGVmaW5lIEdMX0xVTUlOQU5DRThfQUxQSEE4CQkJMHg4MDQ1CisjZGVmaW5lIEdMX0xVTUlOQU5DRTEyX0FMUEhBNAkJCTB4ODA0NgorI2RlZmluZSBHTF9MVU1JTkFOQ0UxMl9BTFBIQTEyCQkJMHg4MDQ3CisjZGVmaW5lIEdMX0xVTUlOQU5DRTE2X0FMUEhBMTYJCQkweDgwNDgKKyNkZWZpbmUgR0xfSU5URU5TSVRZCQkJCTB4ODA0OQorI2RlZmluZSBHTF9JTlRFTlNJVFk0CQkJCTB4ODA0QQorI2RlZmluZSBHTF9JTlRFTlNJVFk4CQkJCTB4ODA0QgorI2RlZmluZSBHTF9JTlRFTlNJVFkxMgkJCQkweDgwNEMKKyNkZWZpbmUgR0xfSU5URU5TSVRZMTYJCQkJMHg4MDRECisjZGVmaW5lIEdMX1IzX0czX0IyCQkJCTB4MkExMAorI2RlZmluZSBHTF9SR0I0CQkJCQkweDgwNEYKKyNkZWZpbmUgR0xfUkdCNQkJCQkJMHg4MDUwCisjZGVmaW5lIEdMX1JHQjgJCQkJCTB4ODA1MQorI2RlZmluZSBHTF9SR0IxMAkJCQkweDgwNTIKKyNkZWZpbmUgR0xfUkdCMTIJCQkJMHg4MDUzCisjZGVmaW5lIEdMX1JHQjE2CQkJCTB4ODA1NAorI2RlZmluZSBHTF9SR0JBMgkJCQkweDgwNTUKKyNkZWZpbmUgR0xfUkdCQTQJCQkJMHg4MDU2CisjZGVmaW5lIEdMX1JHQjVfQTEJCQkJMHg4MDU3CisjZGVmaW5lIEdMX1JHQkE4CQkJCTB4ODA1OAorI2RlZmluZSBHTF9SR0IxMF9BMgkJCQkweDgwNTkKKyNkZWZpbmUgR0xfUkdCQTEyCQkJCTB4ODA1QQorI2RlZmluZSBHTF9SR0JBMTYJCQkJMHg4MDVCCisjZGVmaW5lIEdMX0NMSUVOVF9QSVhFTF9TVE9SRV9CSVQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgR0xfQ0xJRU5UX1ZFUlRFWF9BUlJBWV9CSVQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0xfQUxMX0NMSUVOVF9BVFRSSUJfQklUUyAJCTB4RkZGRkZGRkYKKyNkZWZpbmUgR0xfQ0xJRU5UX0FMTF9BVFRSSUJfQklUUyAJCTB4RkZGRkZGRkYKKworCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzCisgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ2xlYXJJbmRleCggR0xmbG9hdCBjICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENsZWFyQ29sb3IoIEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENsZWFyKCBHTGJpdGZpZWxkIG1hc2sgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW5kZXhNYXNrKCBHTHVpbnQgbWFzayApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvck1hc2soIEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xBbHBoYUZ1bmMoIEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQmxlbmRGdW5jKCBHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTG9naWNPcCggR0xlbnVtIG9wY29kZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDdWxsRmFjZSggR0xlbnVtIG1vZGUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRnJvbnRGYWNlKCBHTGVudW0gbW9kZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQb2ludFNpemUoIEdMZmxvYXQgc2l6ZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMaW5lV2lkdGgoIEdMZmxvYXQgd2lkdGggKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTGluZVN0aXBwbGUoIEdMaW50IGZhY3RvciwgR0x1c2hvcnQgcGF0dGVybiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQb2x5Z29uTW9kZSggR0xlbnVtIGZhY2UsIEdMZW51bSBtb2RlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBvbHlnb25PZmZzZXQoIEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBvbHlnb25TdGlwcGxlKCBjb25zdCBHTHVieXRlICptYXNrICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFBvbHlnb25TdGlwcGxlKCBHTHVieXRlICptYXNrICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEVkZ2VGbGFnKCBHTGJvb2xlYW4gZmxhZyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFZGdlRmxhZ3YoIGNvbnN0IEdMYm9vbGVhbiAqZmxhZyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xTY2lzc29yKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENsaXBQbGFuZSggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGRvdWJsZSAqZXF1YXRpb24gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0Q2xpcFBsYW5lKCBHTGVudW0gcGxhbmUsIEdMZG91YmxlICplcXVhdGlvbiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xEcmF3QnVmZmVyKCBHTGVudW0gbW9kZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSZWFkQnVmZmVyKCBHTGVudW0gbW9kZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFbmFibGUoIEdMZW51bSBjYXAgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRGlzYWJsZSggR0xlbnVtIGNhcCApOworCitHTEFQSSBHTGJvb2xlYW4gR0xBUElFTlRSWSBnbElzRW5hYmxlZCggR0xlbnVtIGNhcCApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEVuYWJsZUNsaWVudFN0YXRlKCBHTGVudW0gY2FwICk7ICAvKiAxLjEgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRGlzYWJsZUNsaWVudFN0YXRlKCBHTGVudW0gY2FwICk7ICAvKiAxLjEgKi8KKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRCb29sZWFudiggR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXREb3VibGV2KCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0RmxvYXR2KCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRJbnRlZ2VydiggR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUHVzaEF0dHJpYiggR0xiaXRmaWVsZCBtYXNrICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBvcEF0dHJpYiggdm9pZCApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFB1c2hDbGllbnRBdHRyaWIoIEdMYml0ZmllbGQgbWFzayApOyAgLyogMS4xICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBvcENsaWVudEF0dHJpYiggdm9pZCApOyAgLyogMS4xICovCisKKworR0xBUEkgR0xpbnQgR0xBUElFTlRSWSBnbFJlbmRlck1vZGUoIEdMZW51bSBtb2RlICk7CisKK0dMQVBJIEdMZW51bSBHTEFQSUVOVFJZIGdsR2V0RXJyb3IoIHZvaWQgKTsKKworR0xBUEkgY29uc3QgR0x1Ynl0ZSAqIEdMQVBJRU5UUlkgZ2xHZXRTdHJpbmcoIEdMZW51bSBuYW1lICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEZpbmlzaCggdm9pZCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xGbHVzaCggdm9pZCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xIaW50KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSApOworCisKKy8qCisgKiBEZXB0aCBCdWZmZXIKKyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDbGVhckRlcHRoKCBHTGNsYW1wZCBkZXB0aCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xEZXB0aEZ1bmMoIEdMZW51bSBmdW5jICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbERlcHRoTWFzayggR0xib29sZWFuIGZsYWcgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRGVwdGhSYW5nZSggR0xjbGFtcGQgbmVhcl92YWwsIEdMY2xhbXBkIGZhcl92YWwgKTsKKworCisvKgorICogQWNjdW11bGF0aW9uIEJ1ZmZlcgorICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENsZWFyQWNjdW0oIEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQWNjdW0oIEdMZW51bSBvcCwgR0xmbG9hdCB2YWx1ZSApOworCisKKy8qCisgKiBUcmFuc2Zvcm1hdGlvbgorICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1hdHJpeE1vZGUoIEdMZW51bSBtb2RlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE9ydGhvKCBHTGRvdWJsZSBsZWZ0LCBHTGRvdWJsZSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZG91YmxlIGJvdHRvbSwgR0xkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xkb3VibGUgbmVhcl92YWwsIEdMZG91YmxlIGZhcl92YWwgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRnJ1c3R1bSggR0xkb3VibGUgbGVmdCwgR0xkb3VibGUgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZG91YmxlIGJvdHRvbSwgR0xkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGRvdWJsZSBuZWFyX3ZhbCwgR0xkb3VibGUgZmFyX3ZhbCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWaWV3cG9ydCggR0xpbnQgeCwgR0xpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFB1c2hNYXRyaXgoIHZvaWQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUG9wTWF0cml4KCB2b2lkICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExvYWRJZGVudGl0eSggdm9pZCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMb2FkTWF0cml4ZCggY29uc3QgR0xkb3VibGUgKm0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExvYWRNYXRyaXhmKCBjb25zdCBHTGZsb2F0ICptICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRNYXRyaXhkKCBjb25zdCBHTGRvdWJsZSAqbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdE1hdHJpeGYoIGNvbnN0IEdMZmxvYXQgKm0gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUm90YXRlZCggR0xkb3VibGUgYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHogKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJvdGF0ZWYoIEdMZmxvYXQgYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsU2NhbGVkKCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xTY2FsZWYoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVHJhbnNsYXRlZCggR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVHJhbnNsYXRlZiggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApOworCisKKy8qCisgKiBEaXNwbGF5IExpc3RzCisgKi8KKworR0xBUEkgR0xib29sZWFuIEdMQVBJRU5UUlkgZ2xJc0xpc3QoIEdMdWludCBsaXN0ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbERlbGV0ZUxpc3RzKCBHTHVpbnQgbGlzdCwgR0xzaXplaSByYW5nZSApOworCitHTEFQSSBHTHVpbnQgR0xBUElFTlRSWSBnbEdlbkxpc3RzKCBHTHNpemVpIHJhbmdlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE5ld0xpc3QoIEdMdWludCBsaXN0LCBHTGVudW0gbW9kZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFbmRMaXN0KCB2b2lkICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENhbGxMaXN0KCBHTHVpbnQgbGlzdCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDYWxsTGlzdHMoIEdMc2l6ZWkgbiwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICpsaXN0cyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMaXN0QmFzZSggR0x1aW50IGJhc2UgKTsKKworCisvKgorICogRHJhd2luZyBGdW5jdGlvbnMKKyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xCZWdpbiggR0xlbnVtIG1vZGUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRW5kKCB2b2lkICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4MmQoIEdMZG91YmxlIHgsIEdMZG91YmxlIHkgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDJmKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4MmkoIEdMaW50IHgsIEdMaW50IHkgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDJzKCBHTHNob3J0IHgsIEdMc2hvcnQgeSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgzZCggR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4M2YoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDNpKCBHTGludCB4LCBHTGludCB5LCBHTGludCB6ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgzcyggR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXg0ZCggR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4NGYoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4NGkoIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDRzKCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4MmR2KCBjb25zdCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4MmZ2KCBjb25zdCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgyaXYoIGNvbnN0IEdMaW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgyc3YoIGNvbnN0IEdMc2hvcnQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4M2R2KCBjb25zdCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4M2Z2KCBjb25zdCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgzaXYoIGNvbnN0IEdMaW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgzc3YoIGNvbnN0IEdMc2hvcnQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4NGR2KCBjb25zdCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4NGZ2KCBjb25zdCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXg0aXYoIGNvbnN0IEdMaW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXg0c3YoIGNvbnN0IEdMc2hvcnQgKnYgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xOb3JtYWwzYiggR0xieXRlIG54LCBHTGJ5dGUgbnksIEdMYnl0ZSBueiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTm9ybWFsM2QoIEdMZG91YmxlIG54LCBHTGRvdWJsZSBueSwgR0xkb3VibGUgbnogKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE5vcm1hbDNmKCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xOb3JtYWwzaSggR0xpbnQgbngsIEdMaW50IG55LCBHTGludCBueiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTm9ybWFsM3MoIEdMc2hvcnQgbngsIEdMc2hvcnQgbnksIEdMc2hvcnQgbnogKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTm9ybWFsM2J2KCBjb25zdCBHTGJ5dGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE5vcm1hbDNkdiggY29uc3QgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE5vcm1hbDNmdiggY29uc3QgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTm9ybWFsM2l2KCBjb25zdCBHTGludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTm9ybWFsM3N2KCBjb25zdCBHTHNob3J0ICp2ICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW5kZXhkKCBHTGRvdWJsZSBjICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbmRleGYoIEdMZmxvYXQgYyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW5kZXhpKCBHTGludCBjICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbmRleHMoIEdMc2hvcnQgYyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW5kZXh1YiggR0x1Ynl0ZSBjICk7ICAvKiAxLjEgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW5kZXhkdiggY29uc3QgR0xkb3VibGUgKmMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEluZGV4ZnYoIGNvbnN0IEdMZmxvYXQgKmMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEluZGV4aXYoIGNvbnN0IEdMaW50ICpjICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbmRleHN2KCBjb25zdCBHTHNob3J0ICpjICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbmRleHVidiggY29uc3QgR0x1Ynl0ZSAqYyApOyAgLyogMS4xICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM2IoIEdMYnl0ZSByZWQsIEdMYnl0ZSBncmVlbiwgR0xieXRlIGJsdWUgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM2QoIEdMZG91YmxlIHJlZCwgR0xkb3VibGUgZ3JlZW4sIEdMZG91YmxlIGJsdWUgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM2YoIEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM2koIEdMaW50IHJlZCwgR0xpbnQgZ3JlZW4sIEdMaW50IGJsdWUgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM3MoIEdMc2hvcnQgcmVkLCBHTHNob3J0IGdyZWVuLCBHTHNob3J0IGJsdWUgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM3ViKCBHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjN1aSggR0x1aW50IHJlZCwgR0x1aW50IGdyZWVuLCBHTHVpbnQgYmx1ZSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzdXMoIEdMdXNob3J0IHJlZCwgR0x1c2hvcnQgZ3JlZW4sIEdMdXNob3J0IGJsdWUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0YiggR0xieXRlIHJlZCwgR0xieXRlIGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGJ5dGUgYmx1ZSwgR0xieXRlIGFscGhhICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjRkKCBHTGRvdWJsZSByZWQsIEdMZG91YmxlIGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGRvdWJsZSBibHVlLCBHTGRvdWJsZSBhbHBoYSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0ZiggR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0aSggR0xpbnQgcmVkLCBHTGludCBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYmx1ZSwgR0xpbnQgYWxwaGEgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNHMoIEdMc2hvcnQgcmVkLCBHTHNob3J0IGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNob3J0IGJsdWUsIEdMc2hvcnQgYWxwaGEgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNHViKCBHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWJ5dGUgYmx1ZSwgR0x1Ynl0ZSBhbHBoYSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0dWkoIEdMdWludCByZWQsIEdMdWludCBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBibHVlLCBHTHVpbnQgYWxwaGEgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNHVzKCBHTHVzaG9ydCByZWQsIEdMdXNob3J0IGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1c2hvcnQgYmx1ZSwgR0x1c2hvcnQgYWxwaGEgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjNidiggY29uc3QgR0xieXRlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjNkdiggY29uc3QgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM2Z2KCBjb25zdCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjNpdiggY29uc3QgR0xpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM3N2KCBjb25zdCBHTHNob3J0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjN1YnYoIGNvbnN0IEdMdWJ5dGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM3VpdiggY29uc3QgR0x1aW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjN1c3YoIGNvbnN0IEdMdXNob3J0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNGJ2KCBjb25zdCBHTGJ5dGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNGR2KCBjb25zdCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0ZnYoIGNvbnN0IEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNGl2KCBjb25zdCBHTGludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0c3YoIGNvbnN0IEdMc2hvcnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNHVidiggY29uc3QgR0x1Ynl0ZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0dWl2KCBjb25zdCBHTHVpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNHVzdiggY29uc3QgR0x1c2hvcnQgKnYgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDFkKCBHTGRvdWJsZSBzICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDFmKCBHTGZsb2F0IHMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMWkoIEdMaW50IHMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMXMoIEdMc2hvcnQgcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDJkKCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDJmKCBHTGZsb2F0IHMsIEdMZmxvYXQgdCApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQyaSggR0xpbnQgcywgR0xpbnQgdCApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQycyggR0xzaG9ydCBzLCBHTHNob3J0IHQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQzZCggR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgciApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQzZiggR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQzaSggR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgciApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQzcyggR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDRkKCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0LCBHTGRvdWJsZSByLCBHTGRvdWJsZSBxICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDRmKCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkNGkoIEdMaW50IHMsIEdMaW50IHQsIEdMaW50IHIsIEdMaW50IHEgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkNHMoIEdMc2hvcnQgcywgR0xzaG9ydCB0LCBHTHNob3J0IHIsIEdMc2hvcnQgcSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDFkdiggY29uc3QgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMWZ2KCBjb25zdCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDFpdiggY29uc3QgR0xpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMXN2KCBjb25zdCBHTHNob3J0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMmR2KCBjb25zdCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQyZnYoIGNvbnN0IEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMml2KCBjb25zdCBHTGludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQyc3YoIGNvbnN0IEdMc2hvcnQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQzZHYoIGNvbnN0IEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDNmdiggY29uc3QgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQzaXYoIGNvbnN0IEdMaW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDNzdiggY29uc3QgR0xzaG9ydCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDRkdiggY29uc3QgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkNGZ2KCBjb25zdCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDRpdiggY29uc3QgR0xpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkNHN2KCBjb25zdCBHTHNob3J0ICp2ICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zMmQoIEdMZG91YmxlIHgsIEdMZG91YmxlIHkgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczJmKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zMmkoIEdMaW50IHgsIEdMaW50IHkgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczJzKCBHTHNob3J0IHgsIEdMc2hvcnQgeSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MzZCggR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zM2YoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczNpKCBHTGludCB4LCBHTGludCB5LCBHTGludCB6ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MzcyggR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3M0ZCggR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zNGYoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zNGkoIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczRzKCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zMmR2KCBjb25zdCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zMmZ2KCBjb25zdCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MyaXYoIGNvbnN0IEdMaW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3Myc3YoIGNvbnN0IEdMc2hvcnQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zM2R2KCBjb25zdCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zM2Z2KCBjb25zdCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MzaXYoIGNvbnN0IEdMaW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3Mzc3YoIGNvbnN0IEdMc2hvcnQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zNGR2KCBjb25zdCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zNGZ2KCBjb25zdCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3M0aXYoIGNvbnN0IEdMaW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3M0c3YoIGNvbnN0IEdMc2hvcnQgKnYgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSZWN0ZCggR0xkb3VibGUgeDEsIEdMZG91YmxlIHkxLCBHTGRvdWJsZSB4MiwgR0xkb3VibGUgeTIgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJlY3RmKCBHTGZsb2F0IHgxLCBHTGZsb2F0IHkxLCBHTGZsb2F0IHgyLCBHTGZsb2F0IHkyICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSZWN0aSggR0xpbnQgeDEsIEdMaW50IHkxLCBHTGludCB4MiwgR0xpbnQgeTIgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJlY3RzKCBHTHNob3J0IHgxLCBHTHNob3J0IHkxLCBHTHNob3J0IHgyLCBHTHNob3J0IHkyICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmVjdGR2KCBjb25zdCBHTGRvdWJsZSAqdjEsIGNvbnN0IEdMZG91YmxlICp2MiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmVjdGZ2KCBjb25zdCBHTGZsb2F0ICp2MSwgY29uc3QgR0xmbG9hdCAqdjIgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJlY3RpdiggY29uc3QgR0xpbnQgKnYxLCBjb25zdCBHTGludCAqdjIgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJlY3RzdiggY29uc3QgR0xzaG9ydCAqdjEsIGNvbnN0IEdMc2hvcnQgKnYyICk7CisKKworLyoKKyAqIFZlcnRleCBBcnJheXMgICgxLjEpCisgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4UG9pbnRlciggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwdHIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTm9ybWFsUG9pbnRlciggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICpwdHIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3JQb2ludGVyKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcHRyICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEluZGV4UG9pbnRlciggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKnB0ciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXIoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwdHIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRWRnZUZsYWdQb2ludGVyKCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwdHIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0UG9pbnRlcnYoIEdMZW51bSBwbmFtZSwgR0x2b2lkICoqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEFycmF5RWxlbWVudCggR0xpbnQgaSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xEcmF3QXJyYXlzKCBHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRzKCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbnRlcmxlYXZlZEFycmF5cyggR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICpwb2ludGVyICk7CisKKy8qCisgKiBMaWdodGluZworICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFNoYWRlTW9kZWwoIEdMZW51bSBtb2RlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExpZ2h0ZiggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExpZ2h0aSggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMaWdodGZ2KCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTGlnaHRpdiggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldExpZ2h0ZnYoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCAqcGFyYW1zICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRMaWdodGl2KCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTGlnaHRNb2RlbGYoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTGlnaHRNb2RlbGkoIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExpZ2h0TW9kZWxmdiggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExpZ2h0TW9kZWxpdiggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1hdGVyaWFsZiggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWF0ZXJpYWxpKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWF0ZXJpYWxmdiggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNYXRlcmlhbGl2KCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldE1hdGVyaWFsZnYoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0TWF0ZXJpYWxpdiggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvck1hdGVyaWFsKCBHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUgKTsKKworCisvKgorICogUmFzdGVyIGZ1bmN0aW9ucworICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBpeGVsWm9vbSggR0xmbG9hdCB4ZmFjdG9yLCBHTGZsb2F0IHlmYWN0b3IgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUGl4ZWxTdG9yZWYoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUGl4ZWxTdG9yZWkoIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUGl4ZWxUcmFuc2ZlcmYoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUGl4ZWxUcmFuc2ZlcmkoIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUGl4ZWxNYXBmdiggR0xlbnVtIG1hcCwgR0xzaXplaSBtYXBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmbG9hdCAqdmFsdWVzICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQaXhlbE1hcHVpdiggR0xlbnVtIG1hcCwgR0xzaXplaSBtYXBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdWludCAqdmFsdWVzICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQaXhlbE1hcHVzdiggR0xlbnVtIG1hcCwgR0xzaXplaSBtYXBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdXNob3J0ICp2YWx1ZXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0UGl4ZWxNYXBmdiggR0xlbnVtIG1hcCwgR0xmbG9hdCAqdmFsdWVzICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRQaXhlbE1hcHVpdiggR0xlbnVtIG1hcCwgR0x1aW50ICp2YWx1ZXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFBpeGVsTWFwdXN2KCBHTGVudW0gbWFwLCBHTHVzaG9ydCAqdmFsdWVzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEJpdG1hcCggR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgeG9yaWcsIEdMZmxvYXQgeW9yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgeG1vdmUsIEdMZmxvYXQgeW1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdWJ5dGUgKmJpdG1hcCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSZWFkUGl4ZWxzKCBHTGludCB4LCBHTGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdm9pZCAqcGl4ZWxzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbERyYXdQaXhlbHMoIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKnBpeGVscyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb3B5UGl4ZWxzKCBHTGludCB4LCBHTGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdHlwZSApOworCisvKgorICogU3RlbmNpbGluZworICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFN0ZW5jaWxGdW5jKCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xTdGVuY2lsTWFzayggR0x1aW50IG1hc2sgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsU3RlbmNpbE9wKCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ2xlYXJTdGVuY2lsKCBHTGludCBzICk7CisKKworCisvKgorICogVGV4dHVyZSBtYXBwaW5nCisgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4R2VuZCggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZG91YmxlIHBhcmFtICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhHZW5mKCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4R2VuaSggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleEdlbmR2KCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xkb3VibGUgKnBhcmFtcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4R2VuZnYoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleEdlbml2KCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRUZXhHZW5kdiggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFRleEdlbmZ2KCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRUZXhHZW5pdiggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhFbnZmKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleEVudmkoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4RW52ZnYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhFbnZpdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFRleEVudmZ2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0VGV4RW52aXYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleFBhcmFtZXRlcmYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVyaSggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmbG9hdCAqcGFyYW1zICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJpdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJmdiggR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJpdiggR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdiggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdiggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhJbWFnZTFEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKnBpeGVscyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhJbWFnZTJEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICpwaXhlbHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0VGV4SW1hZ2UoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdm9pZCAqcGl4ZWxzICk7CisKKworLyogMS4xIGZ1bmN0aW9ucyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZW5UZXh0dXJlcyggR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbERlbGV0ZVRleHR1cmVzKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZSggR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUHJpb3JpdGl6ZVRleHR1cmVzKCBHTHNpemVpIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdWludCAqdGV4dHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMY2xhbXBmICpwcmlvcml0aWVzICk7CisKK0dMQVBJIEdMYm9vbGVhbiBHTEFQSUVOVFJZIGdsQXJlVGV4dHVyZXNSZXNpZGVudCggR0xzaXplaSBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHVpbnQgKnRleHR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gKnJlc2lkZW5jZXMgKTsKKworR0xBUEkgR0xib29sZWFuIEdMQVBJRU5UUlkgZ2xJc1RleHR1cmUoIEdMdWludCB0ZXh0dXJlICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UxRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleFN1YkltYWdlMkQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKnBpeGVscyApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvcHlUZXhJbWFnZTFEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGludGVybmFsZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHgsIEdMaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYm9yZGVyICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMUQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTJEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHgsIEdMaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQgKTsKKworCisvKgorICogRXZhbHVhdG9ycworICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1hcDFkKCBHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSB1MSwgR0xkb3VibGUgdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IG9yZGVyLCBjb25zdCBHTGRvdWJsZSAqcG9pbnRzICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNYXAxZiggR0xlbnVtIHRhcmdldCwgR0xmbG9hdCB1MSwgR0xmbG9hdCB1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgb3JkZXIsIGNvbnN0IEdMZmxvYXQgKnBvaW50cyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNYXAyZCggR0xlbnVtIHRhcmdldCwKKwkJICAgICBHTGRvdWJsZSB1MSwgR0xkb3VibGUgdTIsIEdMaW50IHVzdHJpZGUsIEdMaW50IHVvcmRlciwKKwkJICAgICBHTGRvdWJsZSB2MSwgR0xkb3VibGUgdjIsIEdMaW50IHZzdHJpZGUsIEdMaW50IHZvcmRlciwKKwkJICAgICBjb25zdCBHTGRvdWJsZSAqcG9pbnRzICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNYXAyZiggR0xlbnVtIHRhcmdldCwKKwkJICAgICBHTGZsb2F0IHUxLCBHTGZsb2F0IHUyLCBHTGludCB1c3RyaWRlLCBHTGludCB1b3JkZXIsCisJCSAgICAgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xpbnQgdnN0cmlkZSwgR0xpbnQgdm9yZGVyLAorCQkgICAgIGNvbnN0IEdMZmxvYXQgKnBvaW50cyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRNYXBkdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHF1ZXJ5LCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0TWFwZnYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBxdWVyeSwgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0TWFwaXYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBxdWVyeSwgR0xpbnQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRXZhbENvb3JkMWQoIEdMZG91YmxlIHUgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEV2YWxDb29yZDFmKCBHTGZsb2F0IHUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRXZhbENvb3JkMWR2KCBjb25zdCBHTGRvdWJsZSAqdSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRXZhbENvb3JkMWZ2KCBjb25zdCBHTGZsb2F0ICp1ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEV2YWxDb29yZDJkKCBHTGRvdWJsZSB1LCBHTGRvdWJsZSB2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFdmFsQ29vcmQyZiggR0xmbG9hdCB1LCBHTGZsb2F0IHYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRXZhbENvb3JkMmR2KCBjb25zdCBHTGRvdWJsZSAqdSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRXZhbENvb3JkMmZ2KCBjb25zdCBHTGZsb2F0ICp1ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1hcEdyaWQxZCggR0xpbnQgdW4sIEdMZG91YmxlIHUxLCBHTGRvdWJsZSB1MiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWFwR3JpZDFmKCBHTGludCB1biwgR0xmbG9hdCB1MSwgR0xmbG9hdCB1MiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNYXBHcmlkMmQoIEdMaW50IHVuLCBHTGRvdWJsZSB1MSwgR0xkb3VibGUgdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHZuLCBHTGRvdWJsZSB2MSwgR0xkb3VibGUgdjIgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1hcEdyaWQyZiggR0xpbnQgdW4sIEdMZmxvYXQgdTEsIEdMZmxvYXQgdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHZuLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEV2YWxQb2ludDEoIEdMaW50IGkgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRXZhbFBvaW50MiggR0xpbnQgaSwgR0xpbnQgaiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFdmFsTWVzaDEoIEdMZW51bSBtb2RlLCBHTGludCBpMSwgR0xpbnQgaTIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRXZhbE1lc2gyKCBHTGVudW0gbW9kZSwgR0xpbnQgaTEsIEdMaW50IGkyLCBHTGludCBqMSwgR0xpbnQgajIgKTsKKworCisvKgorICogRm9nCisgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRm9nZiggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEZvZ2koIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRm9nZnYoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEZvZ2l2KCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKTsKKworCisvKgorICogU2VsZWN0aW9uIGFuZCBGZWVkYmFjaworICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEZlZWRiYWNrQnVmZmVyKCBHTHNpemVpIHNpemUsIEdMZW51bSB0eXBlLCBHTGZsb2F0ICpidWZmZXIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUGFzc1Rocm91Z2goIEdMZmxvYXQgdG9rZW4gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsU2VsZWN0QnVmZmVyKCBHTHNpemVpIHNpemUsIEdMdWludCAqYnVmZmVyICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEluaXROYW1lcyggdm9pZCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMb2FkTmFtZSggR0x1aW50IG5hbWUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUHVzaE5hbWUoIEdMdWludCBuYW1lICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBvcE5hbWUoIHZvaWQgKTsKKworCisKKy8qCisgKiBPcGVuR0wgMS4yCisgKi8KKworI2RlZmluZSBHTF9SRVNDQUxFX05PUk1BTAkJCTB4ODAzQQorI2RlZmluZSBHTF9DTEFNUF9UT19FREdFCQkJMHg4MTJGCisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUwkJMHg4MEU4CisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTCQkJMHg4MEU5CisjZGVmaW5lIEdMX0JHUgkJCQkJMHg4MEUwCisjZGVmaW5lIEdMX0JHUkEJCQkJCTB4ODBFMQorI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFXzNfM18yCQkJMHg4MDMyCisjZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEVfMl8zXzNfUkVWCQkweDgzNjIKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV82XzUJCQkweDgzNjMKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV82XzVfUkVWCQkweDgzNjQKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNAkJMHg4MDMzCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWCQkweDgzNjUKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMQkJMHg4MDM0CisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzVfUkVWCQkweDgzNjYKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzhfOF84XzgJCQkweDgwMzUKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWCQkweDgzNjcKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzEwXzEwXzEwXzIJCTB4ODAzNgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVYJCTB4ODM2OAorI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9DT0xPUl9DT05UUk9MCQkweDgxRjgKKyNkZWZpbmUgR0xfU0lOR0xFX0NPTE9SCQkJCTB4ODFGOQorI2RlZmluZSBHTF9TRVBBUkFURV9TUEVDVUxBUl9DT0xPUgkJMHg4MUZBCisjZGVmaW5lIEdMX1RFWFRVUkVfTUlOX0xPRAkJCTB4ODEzQQorI2RlZmluZSBHTF9URVhUVVJFX01BWF9MT0QJCQkweDgxM0IKKyNkZWZpbmUgR0xfVEVYVFVSRV9CQVNFX0xFVkVMCQkJMHg4MTNDCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0xFVkVMCQkJMHg4MTNECisjZGVmaW5lIEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFCQkweDBCMTIKKyNkZWZpbmUgR0xfU01PT1RIX1BPSU5UX1NJWkVfR1JBTlVMQVJJVFkJMHgwQjEzCisjZGVmaW5lIEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFCQkweDBCMjIKKyNkZWZpbmUgR0xfU01PT1RIX0xJTkVfV0lEVEhfR1JBTlVMQVJJVFkJMHgwQjIzCisjZGVmaW5lIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRQkJMHg4NDZECisjZGVmaW5lIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRQkJMHg4NDZFCisjZGVmaW5lIEdMX1BBQ0tfU0tJUF9JTUFHRVMJCQkweDgwNkIKKyNkZWZpbmUgR0xfUEFDS19JTUFHRV9IRUlHSFQJCQkweDgwNkMKKyNkZWZpbmUgR0xfVU5QQUNLX1NLSVBfSU1BR0VTCQkJMHg4MDZECisjZGVmaW5lIEdMX1VOUEFDS19JTUFHRV9IRUlHSFQJCQkweDgwNkUKKyNkZWZpbmUgR0xfVEVYVFVSRV8zRAkJCQkweDgwNkYKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8zRAkJCTB4ODA3MAorI2RlZmluZSBHTF9URVhUVVJFX0RFUFRICQkJMHg4MDcxCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9SCQkJMHg4MDcyCisjZGVmaW5lIEdMX01BWF8zRF9URVhUVVJFX1NJWkUJCQkweDgwNzMKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HXzNECQkJMHg4MDZBCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbERyYXdSYW5nZUVsZW1lbnRzKCBHTGVudW0gbW9kZSwgR0x1aW50IHN0YXJ0LAorCUdMdWludCBlbmQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4SW1hZ2UzRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICpwaXhlbHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UzRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UzRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIGhlaWdodCApOworCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdSQU5HRUVMRU1FTlRTUFJPQykgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhTVUJJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisKKworLyoKKyAqIEdMX0FSQl9pbWFnaW5nCisgKi8KKworI2RlZmluZSBHTF9DT05TVEFOVF9DT0xPUgkJCTB4ODAwMQorI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IJCTB4ODAwMgorI2RlZmluZSBHTF9DT05TVEFOVF9BTFBIQQkJCTB4ODAwMworI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEEJCTB4ODAwNAorI2RlZmluZSBHTF9DT0xPUl9UQUJMRQkJCQkweDgwRDAKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9DT0xPUl9UQUJMRQkJMHg4MEQxCisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0NPTE9SX1RBQkxFCTB4ODBEMgorI2RlZmluZSBHTF9QUk9YWV9DT0xPUl9UQUJMRQkJCTB4ODBEMworI2RlZmluZSBHTF9QUk9YWV9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFCTB4ODBENAorI2RlZmluZSBHTF9QUk9YWV9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRQkweDgwRDUKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfU0NBTEUJCQkweDgwRDYKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQklBUwkJCTB4ODBENworI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9GT1JNQVQJCQkweDgwRDgKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfV0lEVEgJCQkweDgwRDkKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkUJCQkweDgwREEKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfR1JFRU5fU0laRQkJMHg4MERCCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRQkJMHg4MERDCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0FMUEhBX1NJWkUJCTB4ODBERAorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9MVU1JTkFOQ0VfU0laRQkJMHg4MERFCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFCQkweDgwREYKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fMUQJCQkweDgwMTAKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fMkQJCQkweDgwMTEKKyNkZWZpbmUgR0xfU0VQQVJBQkxFXzJECQkJCTB4ODAxMgorI2RlZmluZSBHTF9DT05WT0xVVElPTl9CT1JERVJfTU9ERQkJMHg4MDEzCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0ZJTFRFUl9TQ0FMRQkJMHg4MDE0CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0ZJTFRFUl9CSUFTCQkweDgwMTUKKyNkZWZpbmUgR0xfUkVEVUNFCQkJCTB4ODAxNgorI2RlZmluZSBHTF9DT05WT0xVVElPTl9GT1JNQVQJCQkweDgwMTcKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fV0lEVEgJCQkweDgwMTgKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fSEVJR0hUCQkJMHg4MDE5CisjZGVmaW5lIEdMX01BWF9DT05WT0xVVElPTl9XSURUSAkJMHg4MDFBCisjZGVmaW5lIEdMX01BWF9DT05WT0xVVElPTl9IRUlHSFQJCTB4ODAxQgorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX1JFRF9TQ0FMRQkJMHg4MDFDCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fR1JFRU5fU0NBTEUJCTB4ODAxRAorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0JMVUVfU0NBTEUJCTB4ODAxRQorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0FMUEhBX1NDQUxFCQkweDgwMUYKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9SRURfQklBUwkJMHg4MDIwCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fR1JFRU5fQklBUwkJMHg4MDIxCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9CSUFTCQkweDgwMjIKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9CSUFTCQkweDgwMjMKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQk9SREVSCQkJMHg4MTUxCisjZGVmaW5lIEdMX1JFUExJQ0FURV9CT1JERVIJCQkweDgxNTMKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fQk9SREVSX0NPTE9SCQkweDgxNTQKKyNkZWZpbmUgR0xfQ09MT1JfTUFUUklYCQkJCTB4ODBCMQorI2RlZmluZSBHTF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEgJCTB4ODBCMgorI2RlZmluZSBHTF9NQVhfQ09MT1JfTUFUUklYX1NUQUNLX0RFUFRICQkweDgwQjMKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfUkVEX1NDQUxFCQkweDgwQjQKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fU0NBTEUJMHg4MEI1CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfU0NBTEUJCTB4ODBCNgorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9TQ0FMRQkweDgwQjcKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfUkVEX0JJQVMJCTB4ODBCOAorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9CSUFTCQkweDgwQjkKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9CSUFTCQkweDgwQkEKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfQklBUwkJMHg4MEJCCisjZGVmaW5lIEdMX0hJU1RPR1JBTQkJCQkweDgwMjQKKyNkZWZpbmUgR0xfUFJPWFlfSElTVE9HUkFNCQkJMHg4MDI1CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9XSURUSAkJCTB4ODAyNgorI2RlZmluZSBHTF9ISVNUT0dSQU1fRk9STUFUCQkJMHg4MDI3CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9SRURfU0laRQkJCTB4ODAyOAorI2RlZmluZSBHTF9ISVNUT0dSQU1fR1JFRU5fU0laRQkJCTB4ODAyOQorI2RlZmluZSBHTF9ISVNUT0dSQU1fQkxVRV9TSVpFCQkJMHg4MDJBCisjZGVmaW5lIEdMX0hJU1RPR1JBTV9BTFBIQV9TSVpFCQkJMHg4MDJCCisjZGVmaW5lIEdMX0hJU1RPR1JBTV9MVU1JTkFOQ0VfU0laRQkJMHg4MDJDCisjZGVmaW5lIEdMX0hJU1RPR1JBTV9TSU5LCQkJMHg4MDJECisjZGVmaW5lIEdMX01JTk1BWAkJCQkweDgwMkUKKyNkZWZpbmUgR0xfTUlOTUFYX0ZPUk1BVAkJCTB4ODAyRgorI2RlZmluZSBHTF9NSU5NQVhfU0lOSwkJCQkweDgwMzAKKyNkZWZpbmUgR0xfVEFCTEVfVE9PX0xBUkdFCQkJMHg4MDMxCisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OCQkJMHg4MDA5CisjZGVmaW5lIEdMX01JTgkJCQkJMHg4MDA3CisjZGVmaW5lIEdMX01BWAkJCQkJMHg4MDA4CisjZGVmaW5lIEdMX0ZVTkNfQURECQkJCTB4ODAwNgorI2RlZmluZSBHTF9GVU5DX1NVQlRSQUNUCQkJMHg4MDBBCisjZGVmaW5lIEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVAkJMHg4MDBCCisjZGVmaW5lIEdMX0JMRU5EX0NPTE9SCQkJCTB4ODAwNQorCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yVGFibGUoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICp0YWJsZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvclN1YlRhYmxlKCBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBzdGFydCwgR0xzaXplaSBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICpkYXRhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yVGFibGVQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xpbnQgKnBhcmFtcyk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yVGFibGVQYXJhbWV0ZXJmdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29weUNvbG9yU3ViVGFibGUoIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb3B5Q29sb3JUYWJsZSggR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGggKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZSggR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRhYmxlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJmdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcml2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQmxlbmRFcXVhdGlvbiggR0xlbnVtIG1vZGUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQmxlbmRDb2xvciggR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEhpc3RvZ3JhbSggR0xlbnVtIHRhcmdldCwgR0xzaXplaSB3aWR0aCwKKwkJCQkgICBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMYm9vbGVhbiBzaW5rICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJlc2V0SGlzdG9ncmFtKCBHTGVudW0gdGFyZ2V0ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldEhpc3RvZ3JhbSggR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LAorCQkJCSAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorCQkJCSAgICAgIEdMdm9pZCAqdmFsdWVzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcmZ2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisJCQkJCQkgR0xmbG9hdCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcml2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisJCQkJCQkgR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNaW5tYXgoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKKwkJCQlHTGJvb2xlYW4gc2luayApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSZXNldE1pbm1heCggR0xlbnVtIHRhcmdldCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRNaW5tYXgoIEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHZvaWQgKnZhbHVlcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRNaW5tYXhQYXJhbWV0ZXJmdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorCQkJCQkgICAgICBHTGZsb2F0ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0TWlubWF4UGFyYW1ldGVyaXYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKwkJCQkJICAgICAgR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb252b2x1dGlvbkZpbHRlcjFEKCBHTGVudW0gdGFyZ2V0LAorCUdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisJY29uc3QgR0x2b2lkICppbWFnZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb252b2x1dGlvbkZpbHRlcjJEKCBHTGVudW0gdGFyZ2V0LAorCUdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsCisJR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW1hZ2UgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisJR0xmbG9hdCBwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorCWNvbnN0IEdMZmxvYXQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcmkoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKwlHTGludCBwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorCWNvbnN0IEdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMUQoIEdMZW51bSB0YXJnZXQsCisJR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvcHlDb252b2x1dGlvbkZpbHRlcjJEKCBHTGVudW0gdGFyZ2V0LAorCUdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwKKwlHTHNpemVpIGhlaWdodCk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldENvbnZvbHV0aW9uRmlsdGVyKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LAorCUdMZW51bSB0eXBlLCBHTHZvaWQgKmltYWdlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyZnYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKwlHTGZsb2F0ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJpdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorCUdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsU2VwYXJhYmxlRmlsdGVyMkQoIEdMZW51bSB0YXJnZXQsCisJR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwKKwlHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpyb3csIGNvbnN0IEdMdm9pZCAqY29sdW1uICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFNlcGFyYWJsZUZpbHRlciggR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwKKwlHTGVudW0gdHlwZSwgR0x2b2lkICpyb3csIEdMdm9pZCAqY29sdW1uLCBHTHZvaWQgKnNwYW4gKTsKKwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVORENPTE9SUFJPQykgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTlBST0MpIChHTGVudW0gbW9kZSk7CisKKworCisvKgorICogT3BlbkdMIDEuMworICovCisKKy8qIG11bHRpdGV4dHVyZSAqLworI2RlZmluZSBHTF9URVhUVVJFMAkJCQkweDg0QzAKKyNkZWZpbmUgR0xfVEVYVFVSRTEJCQkJMHg4NEMxCisjZGVmaW5lIEdMX1RFWFRVUkUyCQkJCTB4ODRDMgorI2RlZmluZSBHTF9URVhUVVJFMwkJCQkweDg0QzMKKyNkZWZpbmUgR0xfVEVYVFVSRTQJCQkJMHg4NEM0CisjZGVmaW5lIEdMX1RFWFRVUkU1CQkJCTB4ODRDNQorI2RlZmluZSBHTF9URVhUVVJFNgkJCQkweDg0QzYKKyNkZWZpbmUgR0xfVEVYVFVSRTcJCQkJMHg4NEM3CisjZGVmaW5lIEdMX1RFWFRVUkU4CQkJCTB4ODRDOAorI2RlZmluZSBHTF9URVhUVVJFOQkJCQkweDg0QzkKKyNkZWZpbmUgR0xfVEVYVFVSRTEwCQkJCTB4ODRDQQorI2RlZmluZSBHTF9URVhUVVJFMTEJCQkJMHg4NENCCisjZGVmaW5lIEdMX1RFWFRVUkUxMgkJCQkweDg0Q0MKKyNkZWZpbmUgR0xfVEVYVFVSRTEzCQkJCTB4ODRDRAorI2RlZmluZSBHTF9URVhUVVJFMTQJCQkJMHg4NENFCisjZGVmaW5lIEdMX1RFWFRVUkUxNQkJCQkweDg0Q0YKKyNkZWZpbmUgR0xfVEVYVFVSRTE2CQkJCTB4ODREMAorI2RlZmluZSBHTF9URVhUVVJFMTcJCQkJMHg4NEQxCisjZGVmaW5lIEdMX1RFWFRVUkUxOAkJCQkweDg0RDIKKyNkZWZpbmUgR0xfVEVYVFVSRTE5CQkJCTB4ODREMworI2RlZmluZSBHTF9URVhUVVJFMjAJCQkJMHg4NEQ0CisjZGVmaW5lIEdMX1RFWFRVUkUyMQkJCQkweDg0RDUKKyNkZWZpbmUgR0xfVEVYVFVSRTIyCQkJCTB4ODRENgorI2RlZmluZSBHTF9URVhUVVJFMjMJCQkJMHg4NEQ3CisjZGVmaW5lIEdMX1RFWFRVUkUyNAkJCQkweDg0RDgKKyNkZWZpbmUgR0xfVEVYVFVSRTI1CQkJCTB4ODREOQorI2RlZmluZSBHTF9URVhUVVJFMjYJCQkJMHg4NERBCisjZGVmaW5lIEdMX1RFWFRVUkUyNwkJCQkweDg0REIKKyNkZWZpbmUgR0xfVEVYVFVSRTI4CQkJCTB4ODREQworI2RlZmluZSBHTF9URVhUVVJFMjkJCQkJMHg4NERECisjZGVmaW5lIEdMX1RFWFRVUkUzMAkJCQkweDg0REUKKyNkZWZpbmUgR0xfVEVYVFVSRTMxCQkJCTB4ODRERgorI2RlZmluZSBHTF9BQ1RJVkVfVEVYVFVSRQkJCTB4ODRFMAorI2RlZmluZSBHTF9DTElFTlRfQUNUSVZFX1RFWFRVUkUJCTB4ODRFMQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9VTklUUwkJCTB4ODRFMgorLyogdGV4dHVyZV9jdWJlX21hcCAqLworI2RlZmluZSBHTF9OT1JNQUxfTUFQCQkJCTB4ODUxMQorI2RlZmluZSBHTF9SRUZMRUNUSU9OX01BUAkJCTB4ODUxMgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQCQkJMHg4NTEzCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUAkJMHg4NTE0CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWAkJMHg4NTE1CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWAkJMHg4NTE2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWQkJMHg4NTE3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWQkJMHg4NTE4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWgkJMHg4NTE5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWgkJMHg4NTFBCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfQ1VCRV9NQVAJCTB4ODUxQgorI2RlZmluZSBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFCQkweDg1MUMKKy8qIHRleHR1cmVfY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9BTFBIQQkJCTB4ODRFOQorI2RlZmluZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRQkJCTB4ODRFQQorI2RlZmluZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9BTFBIQQkJMHg4NEVCCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfSU5URU5TSVRZCQkJMHg4NEVDCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCCQkJMHg4NEVECisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQQkJCTB4ODRFRQorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTSU9OX0hJTlQJCTB4ODRFRgorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTRURfSU1BR0VfU0laRQkweDg2QTAKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0VECQkJMHg4NkExCisjZGVmaW5lIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUwkweDg2QTIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMJCTB4ODZBMworLyogbXVsdGlzYW1wbGUgKi8KKyNkZWZpbmUgR0xfTVVMVElTQU1QTEUJCQkJMHg4MDlECisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRQkJMHg4MDlFCisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19PTkUJCQkweDgwOUYKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFCQkJMHg4MEEwCisjZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTCQkJMHg4MEE4CisjZGVmaW5lIEdMX1NBTVBMRVMJCQkJMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRQkJMHg4MEFBCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQJCTB4ODBBQgorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CSVQJCQkweDIwMDAwMDAwCisvKiB0cmFuc3Bvc2VfbWF0cml4ICovCisjZGVmaW5lIEdMX1RSQU5TUE9TRV9NT0RFTFZJRVdfTUFUUklYCQkweDg0RTMKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX1BST0pFQ1RJT05fTUFUUklYCQkweDg0RTQKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX1RFWFRVUkVfTUFUUklYCQkweDg0RTUKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX0NPTE9SX01BVFJJWAkJMHg4NEU2CisvKiB0ZXh0dXJlX2Vudl9jb21iaW5lICovCisjZGVmaW5lIEdMX0NPTUJJTkUJCQkJMHg4NTcwCisjZGVmaW5lIEdMX0NPTUJJTkVfUkdCCQkJCTB4ODU3MQorI2RlZmluZSBHTF9DT01CSU5FX0FMUEhBCQkJMHg4NTcyCisjZGVmaW5lIEdMX1NPVVJDRTBfUkdCCQkJCTB4ODU4MAorI2RlZmluZSBHTF9TT1VSQ0UxX1JHQgkJCQkweDg1ODEKKyNkZWZpbmUgR0xfU09VUkNFMl9SR0IJCQkJMHg4NTgyCisjZGVmaW5lIEdMX1NPVVJDRTBfQUxQSEEJCQkweDg1ODgKKyNkZWZpbmUgR0xfU09VUkNFMV9BTFBIQQkJCTB4ODU4OQorI2RlZmluZSBHTF9TT1VSQ0UyX0FMUEhBCQkJMHg4NThBCisjZGVmaW5lIEdMX09QRVJBTkQwX1JHQgkJCQkweDg1OTAKKyNkZWZpbmUgR0xfT1BFUkFORDFfUkdCCQkJCTB4ODU5MQorI2RlZmluZSBHTF9PUEVSQU5EMl9SR0IJCQkJMHg4NTkyCisjZGVmaW5lIEdMX09QRVJBTkQwX0FMUEhBCQkJMHg4NTk4CisjZGVmaW5lIEdMX09QRVJBTkQxX0FMUEhBCQkJMHg4NTk5CisjZGVmaW5lIEdMX09QRVJBTkQyX0FMUEhBCQkJMHg4NTlBCisjZGVmaW5lIEdMX1JHQl9TQ0FMRQkJCQkweDg1NzMKKyNkZWZpbmUgR0xfQUREX1NJR05FRAkJCQkweDg1NzQKKyNkZWZpbmUgR0xfSU5URVJQT0xBVEUJCQkJMHg4NTc1CisjZGVmaW5lIEdMX1NVQlRSQUNUCQkJCTB4ODRFNworI2RlZmluZSBHTF9DT05TVEFOVAkJCQkweDg1NzYKKyNkZWZpbmUgR0xfUFJJTUFSWV9DT0xPUgkJCTB4ODU3NworI2RlZmluZSBHTF9QUkVWSU9VUwkJCQkweDg1NzgKKy8qIHRleHR1cmVfZW52X2RvdDMgKi8KKyNkZWZpbmUgR0xfRE9UM19SR0IJCQkJMHg4NkFFCisjZGVmaW5lIEdMX0RPVDNfUkdCQQkJCQkweDg2QUYKKy8qIHRleHR1cmVfYm9yZGVyX2NsYW1wICovCisjZGVmaW5lIEdMX0NMQU1QX1RPX0JPUkRFUgkJCTB4ODEyRAorCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlKCBHTGVudW0gdGV4dHVyZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDbGllbnRBY3RpdmVUZXh0dXJlKCBHTGVudW0gdGV4dHVyZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UxRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTNEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTFEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTNEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0Q29tcHJlc3NlZFRleEltYWdlKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsb2QsIEdMdm9pZCAqaW1nICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZCggR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWR2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWYoIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWZ2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaSggR0xlbnVtIHRhcmdldCwgR0xpbnQgcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWl2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMXMoIEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMXN2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZCggR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmR2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmYoIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZnYoIEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJpKCBHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaXYoIEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQycyggR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2QoIEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNkdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNmKCBHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZnYoIEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNpKCBHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaXYoIEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzcyggR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM3N2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZCggR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgciwgR0xkb3VibGUgcSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGR2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGYoIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGZ2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aSggR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgciwgR0xpbnQgcSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGl2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHMoIEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0LCBHTHNob3J0IHIsIEdMc2hvcnQgcSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHN2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2ICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGQoIGNvbnN0IEdMZG91YmxlIG1bMTZdICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExvYWRUcmFuc3Bvc2VNYXRyaXhmKCBjb25zdCBHTGZsb2F0IG1bMTZdICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhkKCBjb25zdCBHTGRvdWJsZSBtWzE2XSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0VHJhbnNwb3NlTWF0cml4ZiggY29uc3QgR0xmbG9hdCBtWzE2XSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZSggR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQgKTsKKworCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFDVElWRVRFWFRVUkVQUk9DKSAoR0xlbnVtIHRleHR1cmUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVDT1ZFUkFHRVBST0MpIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UyRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFMURQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFMURQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT01QUkVTU0VEVEVYSU1BR0VQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMdm9pZCAqaW1nKTsKKworCisKKy8qCisgKiBHTF9BUkJfbXVsdGl0ZXh0dXJlIChBUkIgZXh0ZW5zaW9uIDEgYW5kIE9wZW5HTCAxLjIuMSkKKyAqLworI2lmbmRlZiBHTF9BUkJfbXVsdGl0ZXh0dXJlCisjZGVmaW5lIEdMX0FSQl9tdWx0aXRleHR1cmUgMQorCisjZGVmaW5lIEdMX1RFWFRVUkUwX0FSQgkJCQkweDg0QzAKKyNkZWZpbmUgR0xfVEVYVFVSRTFfQVJCCQkJCTB4ODRDMQorI2RlZmluZSBHTF9URVhUVVJFMl9BUkIJCQkJMHg4NEMyCisjZGVmaW5lIEdMX1RFWFRVUkUzX0FSQgkJCQkweDg0QzMKKyNkZWZpbmUgR0xfVEVYVFVSRTRfQVJCCQkJCTB4ODRDNAorI2RlZmluZSBHTF9URVhUVVJFNV9BUkIJCQkJMHg4NEM1CisjZGVmaW5lIEdMX1RFWFRVUkU2X0FSQgkJCQkweDg0QzYKKyNkZWZpbmUgR0xfVEVYVFVSRTdfQVJCCQkJCTB4ODRDNworI2RlZmluZSBHTF9URVhUVVJFOF9BUkIJCQkJMHg4NEM4CisjZGVmaW5lIEdMX1RFWFRVUkU5X0FSQgkJCQkweDg0QzkKKyNkZWZpbmUgR0xfVEVYVFVSRTEwX0FSQgkJCTB4ODRDQQorI2RlZmluZSBHTF9URVhUVVJFMTFfQVJCCQkJMHg4NENCCisjZGVmaW5lIEdMX1RFWFRVUkUxMl9BUkIJCQkweDg0Q0MKKyNkZWZpbmUgR0xfVEVYVFVSRTEzX0FSQgkJCTB4ODRDRAorI2RlZmluZSBHTF9URVhUVVJFMTRfQVJCCQkJMHg4NENFCisjZGVmaW5lIEdMX1RFWFRVUkUxNV9BUkIJCQkweDg0Q0YKKyNkZWZpbmUgR0xfVEVYVFVSRTE2X0FSQgkJCTB4ODREMAorI2RlZmluZSBHTF9URVhUVVJFMTdfQVJCCQkJMHg4NEQxCisjZGVmaW5lIEdMX1RFWFRVUkUxOF9BUkIJCQkweDg0RDIKKyNkZWZpbmUgR0xfVEVYVFVSRTE5X0FSQgkJCTB4ODREMworI2RlZmluZSBHTF9URVhUVVJFMjBfQVJCCQkJMHg4NEQ0CisjZGVmaW5lIEdMX1RFWFRVUkUyMV9BUkIJCQkweDg0RDUKKyNkZWZpbmUgR0xfVEVYVFVSRTIyX0FSQgkJCTB4ODRENgorI2RlZmluZSBHTF9URVhUVVJFMjNfQVJCCQkJMHg4NEQ3CisjZGVmaW5lIEdMX1RFWFRVUkUyNF9BUkIJCQkweDg0RDgKKyNkZWZpbmUgR0xfVEVYVFVSRTI1X0FSQgkJCTB4ODREOQorI2RlZmluZSBHTF9URVhUVVJFMjZfQVJCCQkJMHg4NERBCisjZGVmaW5lIEdMX1RFWFRVUkUyN19BUkIJCQkweDg0REIKKyNkZWZpbmUgR0xfVEVYVFVSRTI4X0FSQgkJCTB4ODREQworI2RlZmluZSBHTF9URVhUVVJFMjlfQVJCCQkJMHg4NERECisjZGVmaW5lIEdMX1RFWFRVUkUzMF9BUkIJCQkweDg0REUKKyNkZWZpbmUgR0xfVEVYVFVSRTMxX0FSQgkJCTB4ODRERgorI2RlZmluZSBHTF9BQ1RJVkVfVEVYVFVSRV9BUkIJCQkweDg0RTAKKyNkZWZpbmUgR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFX0FSQgkJMHg4NEUxCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1VOSVRTX0FSQgkJMHg4NEUyCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEFjdGl2ZVRleHR1cmVBUkIoR0xlbnVtIHRleHR1cmUpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ2xpZW50QWN0aXZlVGV4dHVyZUFSQihHTGVudW0gdGV4dHVyZSk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWRBUkIoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcyk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWR2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZkFSQihHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFmdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaUFSQihHTGVudW0gdGFyZ2V0LCBHTGludCBzKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaXZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFzQVJCKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcyk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMXN2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkQVJCKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmZBUkIoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJmdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaUFSQihHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaXZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzQVJCKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyc3ZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2RBUkIoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgcik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2R2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZkFSQihHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZnZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2lBUkIoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgcik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2l2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzc0FSQihHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzc3ZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGRBUkIoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgciwgR0xkb3VibGUgcSk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGR2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZkFSQihHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aUFSQihHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByLCBHTGludCBxKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aXZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRzQVJCKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0LCBHTHNob3J0IHIsIEdMc2hvcnQgcSk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHN2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFDVElWRVRFWFRVUkVBUkJQUk9DKSAoR0xlbnVtIHRleHR1cmUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTElFTlRBQ1RJVkVURVhUVVJFQVJCUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMURWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxU0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMVNWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkRBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQyRFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMklBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQySVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMlNBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMlNWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0RBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzRFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0ZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzRlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzU0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNTVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDREQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIsIEdMZG91YmxlIHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENERWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByLCBHTGludCBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0U0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByLCBHTHNob3J0IHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFNWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworCisjZW5kaWYgLyogR0xfQVJCX211bHRpdGV4dHVyZSAqLworCisKKworLyoKKyAqIERlZmluZSB0aGlzIHRva2VuIGlmIHlvdSB3YW50ICJvbGQtc3R5bGUiIGhlYWRlciBmaWxlIGJlaGF2aW91ciAoZXh0ZW5zaW9ucworICogZGVmaW5lZCBpbiBnbC5oKS4gIE90aGVyd2lzZSwgZXh0ZW5zaW9ucyB3aWxsIGJlIGluY2x1ZGVkIGZyb20gZ2xleHQuaC4KKyAqLworI2lmIGRlZmluZWQoR0xfR0xFWFRfTEVHQUNZKQorCisvKiBBbGwgZXh0ZW5zaW9ucyB0aGF0IHVzZWQgdG8gYmUgaGVyZSBhcmUgbm93IGZvdW5kIGluIGdsZXh0LmggKi8KKworI2Vsc2UgIC8qIEdMX0dMRVhUX0xFR0FDWSAqLworCisjaW5jbHVkZSA8R0wvZ2xleHQuaD4KKworI2VuZGlmICAvKiBHTF9HTEVYVF9MRUdBQ1kgKi8KKworCisKKyNpZiBHTF9BUkJfc2hhZGVyX29iamVjdHMKKworI2lmbmRlZiBHTF9NRVNBX3NoYWRlcl9kZWJ1ZworI2RlZmluZSBHTF9NRVNBX3NoYWRlcl9kZWJ1ZyAxCisKKyNkZWZpbmUgR0xfREVCVUdfT0JKRUNUX01FU0EgICAgICAgICAgICAgIDB4ODc1OQorI2RlZmluZSBHTF9ERUJVR19QUklOVF9NRVNBICAgICAgICAgICAgICAgMHg4NzVBCisjZGVmaW5lIEdMX0RFQlVHX0FTU0VSVF9NRVNBICAgICAgICAgICAgICAweDg3NUIKKworR0xBUEkgR0xoYW5kbGVBUkIgR0xBUElFTlRSWSBnbENyZWF0ZURlYnVnT2JqZWN0TUVTQSAodm9pZCk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDbGVhckRlYnVnTG9nTUVTQSAoR0xoYW5kbGVBUkIgb2JqLCBHTGVudW0gbG9nVHlwZSwgR0xlbnVtIHNoYWRlclR5cGUpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0RGVidWdMb2dNRVNBIChHTGhhbmRsZUFSQiBvYmosIEdMZW51bSBsb2dUeXBlLCBHTGVudW0gc2hhZGVyVHlwZSwgR0xzaXplaSBtYXhMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyQVJCICpkZWJ1Z0xvZyk7CitHTEFQSSBHTHNpemVpIEdMQVBJRU5UUlkgZ2xHZXREZWJ1Z0xvZ0xlbmd0aE1FU0EgKEdMaGFuZGxlQVJCIG9iaiwgR0xlbnVtIGxvZ1R5cGUsIEdMZW51bSBzaGFkZXJUeXBlKTsKKworI2VuZGlmIC8qIEdMX01FU0Ffc2hhZGVyX2RlYnVnICovCisKKyNlbmRpZiAvKiBHTF9BUkJfc2hhZGVyX29iamVjdHMgKi8KKworCisvKgorICogPz8/LiBHTF9NRVNBX3BhY2tlZF9kZXB0aF9zdGVuY2lsCisgKiBYWFggb2Jzb2xldGUKKyAqLworI2lmbmRlZiBHTF9NRVNBX3BhY2tlZF9kZXB0aF9zdGVuY2lsCisjZGVmaW5lIEdMX01FU0FfcGFja2VkX2RlcHRoX3N0ZW5jaWwgMQorCisjZGVmaW5lIEdMX0RFUFRIX1NURU5DSUxfTUVTQQkJCTB4ODc1MAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMjRfOF9NRVNBCQkweDg3NTEKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzhfMjRfUkVWX01FU0EJCTB4ODc1MgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF8xNV8xX01FU0EJCTB4ODc1MworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF8xXzE1X1JFVl9NRVNBCQkweDg3NTQKKworI2VuZGlmIC8qIEdMX01FU0FfcGFja2VkX2RlcHRoX3N0ZW5jaWwgKi8KKworCisjaWZuZGVmIEdMX01FU0FfcHJvZ3JhbV9kZWJ1ZworI2RlZmluZSBHTF9NRVNBX3Byb2dyYW1fZGVidWcgMQorCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1BST0dSQU1fUE9TSVRJT05fTUVTQSAgICAgICAweDhiYjAKKyNkZWZpbmUgR0xfRlJBR01FTlRfUFJPR1JBTV9DQUxMQkFDS19NRVNBICAgICAgIDB4OGJiMQorI2RlZmluZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0NBTExCQUNLX0ZVTkNfTUVTQSAgMHg4YmIyCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1BST0dSQU1fQ0FMTEJBQ0tfREFUQV9NRVNBICAweDhiYjMKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fUE9TSVRJT05fTUVTQSAgICAgICAgIDB4OGJiNAorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9DQUxMQkFDS19NRVNBICAgICAgICAgMHg4YmI1CisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX0NBTExCQUNLX0ZVTkNfTUVTQSAgICAweDhiYjYKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fQ0FMTEJBQ0tfREFUQV9NRVNBICAgIDB4OGJiNworCit0eXBlZGVmIHZvaWQgKCpHTHByb2dyYW1jYWxsYmFja01FU0EpKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqZGF0YSk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFByb2dyYW1DYWxsYmFja01FU0EoR0xlbnVtIHRhcmdldCwgR0xwcm9ncmFtY2FsbGJhY2tNRVNBIGNhbGxiYWNrLCBHTHZvaWQgKmRhdGEpOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRQcm9ncmFtUmVnaXN0ZXJmdk1FU0EoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIEdMZmxvYXQgKnYpOworCisjZW5kaWYgLyogR0xfTUVTQV9wcm9ncmFtX2RlYnVnICovCisKKworI2lmbmRlZiBHTF9NRVNBX3RleHR1cmVfYXJyYXkKKyNkZWZpbmUgR0xfTUVTQV90ZXh0dXJlX2FycmF5IDEKKworLyogR0xfTUVTQV90ZXh0dXJlX2FycmF5IHVzZXMgdGhlIHNhbWUgZW51bSB2YWx1ZXMgYXMgR0xfRVhUX3RleHR1cmVfYXJyYXkuCisgKi8KKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfYXJyYXkKKworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmVMYXllckVYVChHTGVudW0gdGFyZ2V0LAorICAgIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IGxheWVyKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCisKKyNpZiAwCisvKiAodGVtcG9yYXJpbHkpIGRpc2FibGVkIGJlY2F1c2Ugb2YgY29sbGlzaW9uIHdpdGggdHlwZWRlZiBpbiBnbGV4dC5oCisgKiB0aGF0IGhhcHBlbnMgaWYgYXBwcyBpbmNsdWRlIGJvdGggZ2wuaCBhbmQgZ2xleHQuaAorICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRUxBWUVSRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsCisgICAgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgbGF5ZXIpOworI2VuZGlmCisKKyNkZWZpbmUgR0xfVEVYVFVSRV8xRF9BUlJBWV9FWFQgICAgICAgICAweDhDMTgKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8xRF9BUlJBWV9FWFQgICAweDhDMTkKKyNkZWZpbmUgR0xfVEVYVFVSRV8yRF9BUlJBWV9FWFQgICAgICAgICAweDhDMUEKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8yRF9BUlJBWV9FWFQgICAweDhDMUIKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HXzFEX0FSUkFZX0VYVCAweDhDMUMKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HXzJEX0FSUkFZX0VYVCAweDhDMUQKKyNkZWZpbmUgR0xfTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTX0VYVCAweDg4RkYKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSX0VYVCAweDhDRDQKKyNlbmRpZgorCisjZW5kaWYKKworCisjaWZuZGVmIEdMX0FUSV9ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZQorI2RlZmluZSBHTF9BVElfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUgMQorCisjZGVmaW5lIEdMX0FMUEhBX0JMRU5EX0VRVUFUSU9OX0FUSQkgICAgICAgIDB4ODgzRAorCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVBVEkoIEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUEgKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTlNFUEFSQVRFQVRJUFJPQykgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUEpOworCisjZW5kaWYgLyogR0xfQVRJX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlICovCisKKworLyogR0xfT0VTX0VHTF9pbWFnZSAqLworI2lmbmRlZiBHTF9PRVNfRUdMX2ltYWdlCit0eXBlZGVmIHZvaWQqIEdMZWdsSW1hZ2VPRVM7CisjZW5kaWYKKworI2lmbmRlZiBHTF9PRVNfRUdMX2ltYWdlCisjZGVmaW5lIEdMX09FU19FR0xfaW1hZ2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFR0xJTUFHRVRBUkdFVFRFWFRVUkUyRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRUdMSU1BR0VUQVJHRVRSRU5ERVJCVUZGRVJTVE9SQUdFT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOworI2VuZGlmCisKKworLyoqCisgKiogTk9URSEhISEhICBJZiB5b3UgYWRkIG5ldyBmdW5jdGlvbnMgdG8gdGhpcyBmaWxlLCBvciB1cGRhdGUKKyAqKiBnbGV4dC5oIGJlIHN1cmUgdG8gcmVnZW5lcmF0ZSB0aGUgZ2xfbWFuZ2xlLmggZmlsZS4gIFNlZSBjb21tZW50cworICoqIGluIHRoYXQgZmlsZSBmb3IgZGV0YWlscy4KKyAqKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCZWdpbiBzeXN0ZW0tc3BlY2lmaWMgc3R1ZmYKKyAqLworI2lmIGRlZmluZWQoUFJBR01BX0VYUE9SVF9TVVBQT1JURUQpCisjcHJhZ21hIGV4cG9ydCBvZmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChtYWNpbnRvc2gpICYmIFBSQUdNQV9JTVBPUlRfU1VQUE9SVEVECisjcHJhZ21hIGltcG9ydCBvZmYKKyNlbmRpZgorLyoKKyAqIEVuZCBzeXN0ZW0tc3BlY2lmaWMgc3R1ZmYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dsX2hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL0dML2dsX21hbmdsZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbF9tYW5nbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjg0ODAzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbF9tYW5nbGUuaApAQCAtMCwwICsxLDIzMTEgQEAKKyNpZiAwCisjZGVmaW5lIEdMX01BTkdMRV9DMSAiRE8gTk9UIEVESVQhISEgLSBUTyBSRUdFTkVSQVRFIGZyb20gZ2wuaCwgRVhFQ1VURSBUSElTIEZJTEUgSU4gU0hFTEwgKC9iaW4vc2gpIGFuZCBzYXZlIHRoZSBvdXRwdXQiCisjZGVmaW5lIEdMX01BTkdMRV9DMiAiVGhpcyBmaWxlIGlzIHVzZWQgdG8gY3JlYXRlIEdMIGZ1bmN0aW9uIHByb3R5cGVzIGFuZCBhbGlhc2VzIGZvciB0aGUgZnVuY3Rpb24gbmFtZXMiCisJZmlsZXM9ImdsLmggZ2xleHQuaCIKKyNkZWZpbmUgR0xfTUFOR0xFX0MzICJnZXQgcmVnZW5lcmF0aW9uIGhlYWRlciAtIGNvcHkgZXZlcnl0aGluZyBpbiB0aGlzIGZpbGUgYWJvdmUgdGhlICdSRUdFTkVSQVRFX1RPX0VORCcgbGluZSIKKwlhd2sgCSchZG9uZTsgL15cL1wqUkVHRU5FUkFURV9UT19FTkQvIHtkb25lPTF9JyAkMAorCWVjaG8gIiIKKyNkZWZpbmUgR0xfTUFOR0xFX0M0IGdldCBhbGlhc2VzCisJZ3JlcCAnXkdMQVBJJyAkZmlsZXMgfCBzZWQgLWUgJ3MvLipFTlRSWSBnbFwoW14oIF0qXCkuKiQvI2RlZmluZSBnbFwxCQlNQU5HTEUoXDEpLycgfCBzb3J0IHwgdW5pcQorCWVjaG8gIiIKKwllY2hvICIjZW5kaWYgLyogR0xfTUFOR0xFX0ggKi8iCisJZXhpdAorI2VuZGlmIC8qIFJFR0VORVJBVElPTiAqLworCisvKgorICogSWYgeW91IGNvbXBpbGUgTWVzYSB3aXRoIFVTRV9NR0xfTkFNRVNQQUNFIGRlZmluZWQgdGhlbiB5b3UgY2FuIGxpbmsKKyAqIHlvdXIgYXBwbGljYXRpb24gYm90aCB3aXRoIE9wZW5HTCBhbmQgTWVzYS4gIFRoZSBNZXNhIGZ1bmN0aW9ucyB3aWxsCisgKiBiZSByZWRlZmluZWQgc28gdGhleSBhcmUgcHJlZml4ZWQgd2l0aCAibWdsIiBpbnN0ZWFkIG9mICJnbCIuCisgKiBNZ2wgY29udHJpYnV0ZWQgYnkgUmFuZHkgRnJhbmsgKHJmcmFua0Byc2luYy5jb20pCisgKiBSZWduZXJhdGlvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IFJheSBUaWNlIChyYXl0QG1hLnVsdHJhLm5ldCkKKyAqLworCisjaWZuZGVmIEdMX01BTkdMRV9ICisjZGVmaW5lIEdMX01BTkdMRV9ICisKKyNpZm5kZWYgICBNQU5HTEUKKyNkZWZpbmUgICBNQU5HTEUoeCkgbWdsIyN4CisjZW5kaWYgIC8qTUFOR0xFKi8KKworLypSRUdFTkVSQVRFX1RPX0VORC0tLS0tLS0tLS0tQUxMIExJTkVTIEJFTE9XIEhFUkUgR0VUIFJFUExBQ0VEIE9OIFJFR0VORVJBVElPTiAqLworCisjZGVmaW5lIGdsQWNjdW0JCU1BTkdMRShBY2N1bSkKKyNkZWZpbmUgZ2xBY3RpdmVQcm9ncmFtRVhUCQlNQU5HTEUoQWN0aXZlUHJvZ3JhbUVYVCkKKyNkZWZpbmUgZ2xBY3RpdmVTaGFkZXJQcm9ncmFtCQlNQU5HTEUoQWN0aXZlU2hhZGVyUHJvZ3JhbSkKKyNkZWZpbmUgZ2xBY3RpdmVTdGVuY2lsRmFjZUVYVAkJTUFOR0xFKEFjdGl2ZVN0ZW5jaWxGYWNlRVhUKQorI2RlZmluZSBnbEFjdGl2ZVRleHR1cmVBUkIJCU1BTkdMRShBY3RpdmVUZXh0dXJlQVJCKQorI2RlZmluZSBnbEFjdGl2ZVRleHR1cmUJCU1BTkdMRShBY3RpdmVUZXh0dXJlKQorI2RlZmluZSBnbEFjdGl2ZVZhcnlpbmdOVgkJTUFOR0xFKEFjdGl2ZVZhcnlpbmdOVikKKyNkZWZpbmUgZ2xBbHBoYUZyYWdtZW50T3AxQVRJCQlNQU5HTEUoQWxwaGFGcmFnbWVudE9wMUFUSSkKKyNkZWZpbmUgZ2xBbHBoYUZyYWdtZW50T3AyQVRJCQlNQU5HTEUoQWxwaGFGcmFnbWVudE9wMkFUSSkKKyNkZWZpbmUgZ2xBbHBoYUZyYWdtZW50T3AzQVRJCQlNQU5HTEUoQWxwaGFGcmFnbWVudE9wM0FUSSkKKyNkZWZpbmUgZ2xBbHBoYUZ1bmMJCU1BTkdMRShBbHBoYUZ1bmMpCisjZGVmaW5lIGdsQXBwbHlUZXh0dXJlRVhUCQlNQU5HTEUoQXBwbHlUZXh0dXJlRVhUKQorI2RlZmluZSBnbEFyZVByb2dyYW1zUmVzaWRlbnROVgkJTUFOR0xFKEFyZVByb2dyYW1zUmVzaWRlbnROVikKKyNkZWZpbmUgZ2xBcmVUZXh0dXJlc1Jlc2lkZW50RVhUCQlNQU5HTEUoQXJlVGV4dHVyZXNSZXNpZGVudEVYVCkKKyNkZWZpbmUgZ2xBcmVUZXh0dXJlc1Jlc2lkZW50CQlNQU5HTEUoQXJlVGV4dHVyZXNSZXNpZGVudCkKKyNkZWZpbmUgZ2xBcnJheUVsZW1lbnRFWFQJCU1BTkdMRShBcnJheUVsZW1lbnRFWFQpCisjZGVmaW5lIGdsQXJyYXlFbGVtZW50CQlNQU5HTEUoQXJyYXlFbGVtZW50KQorI2RlZmluZSBnbEFycmF5T2JqZWN0QVRJCQlNQU5HTEUoQXJyYXlPYmplY3RBVEkpCisjZGVmaW5lIGdsQXN5bmNNYXJrZXJTR0lYCQlNQU5HTEUoQXN5bmNNYXJrZXJTR0lYKQorI2RlZmluZSBnbEF0dGFjaE9iamVjdEFSQgkJTUFOR0xFKEF0dGFjaE9iamVjdEFSQikKKyNkZWZpbmUgZ2xBdHRhY2hTaGFkZXIJCU1BTkdMRShBdHRhY2hTaGFkZXIpCisjZGVmaW5lIGdsQmVnaW5Db25kaXRpb25hbFJlbmRlcgkJTUFOR0xFKEJlZ2luQ29uZGl0aW9uYWxSZW5kZXIpCisjZGVmaW5lIGdsQmVnaW5Db25kaXRpb25hbFJlbmRlck5WCQlNQU5HTEUoQmVnaW5Db25kaXRpb25hbFJlbmRlck5WKQorI2RlZmluZSBnbEJlZ2luRnJhZ21lbnRTaGFkZXJBVEkJCU1BTkdMRShCZWdpbkZyYWdtZW50U2hhZGVyQVRJKQorI2RlZmluZSBnbEJlZ2luCQlNQU5HTEUoQmVnaW4pCisjZGVmaW5lIGdsQmVnaW5PY2NsdXNpb25RdWVyeU5WCQlNQU5HTEUoQmVnaW5PY2NsdXNpb25RdWVyeU5WKQorI2RlZmluZSBnbEJlZ2luUGVyZk1vbml0b3JBTUQJCU1BTkdMRShCZWdpblBlcmZNb25pdG9yQU1EKQorI2RlZmluZSBnbEJlZ2luUXVlcnlBUkIJCU1BTkdMRShCZWdpblF1ZXJ5QVJCKQorI2RlZmluZSBnbEJlZ2luUXVlcnlJbmRleGVkCQlNQU5HTEUoQmVnaW5RdWVyeUluZGV4ZWQpCisjZGVmaW5lIGdsQmVnaW5RdWVyeQkJTUFOR0xFKEJlZ2luUXVlcnkpCisjZGVmaW5lIGdsQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVAkJTUFOR0xFKEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQpCisjZGVmaW5lIGdsQmVnaW5UcmFuc2Zvcm1GZWVkYmFjawkJTUFOR0xFKEJlZ2luVHJhbnNmb3JtRmVlZGJhY2spCisjZGVmaW5lIGdsQmVnaW5UcmFuc2Zvcm1GZWVkYmFja05WCQlNQU5HTEUoQmVnaW5UcmFuc2Zvcm1GZWVkYmFja05WKQorI2RlZmluZSBnbEJlZ2luVmVydGV4U2hhZGVyRVhUCQlNQU5HTEUoQmVnaW5WZXJ0ZXhTaGFkZXJFWFQpCisjZGVmaW5lIGdsQmVnaW5WaWRlb0NhcHR1cmVOVgkJTUFOR0xFKEJlZ2luVmlkZW9DYXB0dXJlTlYpCisjZGVmaW5lIGdsQmluZEF0dHJpYkxvY2F0aW9uQVJCCQlNQU5HTEUoQmluZEF0dHJpYkxvY2F0aW9uQVJCKQorI2RlZmluZSBnbEJpbmRBdHRyaWJMb2NhdGlvbgkJTUFOR0xFKEJpbmRBdHRyaWJMb2NhdGlvbikKKyNkZWZpbmUgZ2xCaW5kQnVmZmVyQVJCCQlNQU5HTEUoQmluZEJ1ZmZlckFSQikKKyNkZWZpbmUgZ2xCaW5kQnVmZmVyQmFzZUVYVAkJTUFOR0xFKEJpbmRCdWZmZXJCYXNlRVhUKQorI2RlZmluZSBnbEJpbmRCdWZmZXJCYXNlCQlNQU5HTEUoQmluZEJ1ZmZlckJhc2UpCisjZGVmaW5lIGdsQmluZEJ1ZmZlckJhc2VOVgkJTUFOR0xFKEJpbmRCdWZmZXJCYXNlTlYpCisjZGVmaW5lIGdsQmluZEJ1ZmZlcgkJTUFOR0xFKEJpbmRCdWZmZXIpCisjZGVmaW5lIGdsQmluZEJ1ZmZlck9mZnNldEVYVAkJTUFOR0xFKEJpbmRCdWZmZXJPZmZzZXRFWFQpCisjZGVmaW5lIGdsQmluZEJ1ZmZlck9mZnNldE5WCQlNQU5HTEUoQmluZEJ1ZmZlck9mZnNldE5WKQorI2RlZmluZSBnbEJpbmRCdWZmZXJSYW5nZUVYVAkJTUFOR0xFKEJpbmRCdWZmZXJSYW5nZUVYVCkKKyNkZWZpbmUgZ2xCaW5kQnVmZmVyUmFuZ2UJCU1BTkdMRShCaW5kQnVmZmVyUmFuZ2UpCisjZGVmaW5lIGdsQmluZEJ1ZmZlclJhbmdlTlYJCU1BTkdMRShCaW5kQnVmZmVyUmFuZ2VOVikKKyNkZWZpbmUgZ2xCaW5kRnJhZ0RhdGFMb2NhdGlvbkVYVAkJTUFOR0xFKEJpbmRGcmFnRGF0YUxvY2F0aW9uRVhUKQorI2RlZmluZSBnbEJpbmRGcmFnRGF0YUxvY2F0aW9uSW5kZXhlZAkJTUFOR0xFKEJpbmRGcmFnRGF0YUxvY2F0aW9uSW5kZXhlZCkKKyNkZWZpbmUgZ2xCaW5kRnJhZ0RhdGFMb2NhdGlvbgkJTUFOR0xFKEJpbmRGcmFnRGF0YUxvY2F0aW9uKQorI2RlZmluZSBnbEJpbmRGcmFnbWVudFNoYWRlckFUSQkJTUFOR0xFKEJpbmRGcmFnbWVudFNoYWRlckFUSSkKKyNkZWZpbmUgZ2xCaW5kRnJhbWVidWZmZXJFWFQJCU1BTkdMRShCaW5kRnJhbWVidWZmZXJFWFQpCisjZGVmaW5lIGdsQmluZEZyYW1lYnVmZmVyCQlNQU5HTEUoQmluZEZyYW1lYnVmZmVyKQorI2RlZmluZSBnbEJpbmRJbWFnZVRleHR1cmVFWFQJCU1BTkdMRShCaW5kSW1hZ2VUZXh0dXJlRVhUKQorI2RlZmluZSBnbEJpbmRMaWdodFBhcmFtZXRlckVYVAkJTUFOR0xFKEJpbmRMaWdodFBhcmFtZXRlckVYVCkKKyNkZWZpbmUgZ2xCaW5kTWF0ZXJpYWxQYXJhbWV0ZXJFWFQJCU1BTkdMRShCaW5kTWF0ZXJpYWxQYXJhbWV0ZXJFWFQpCisjZGVmaW5lIGdsQmluZE11bHRpVGV4dHVyZUVYVAkJTUFOR0xFKEJpbmRNdWx0aVRleHR1cmVFWFQpCisjZGVmaW5lIGdsQmluZFBhcmFtZXRlckVYVAkJTUFOR0xFKEJpbmRQYXJhbWV0ZXJFWFQpCisjZGVmaW5lIGdsQmluZFByb2dyYW1BUkIJCU1BTkdMRShCaW5kUHJvZ3JhbUFSQikKKyNkZWZpbmUgZ2xCaW5kUHJvZ3JhbU5WCQlNQU5HTEUoQmluZFByb2dyYW1OVikKKyNkZWZpbmUgZ2xCaW5kUHJvZ3JhbVBpcGVsaW5lCQlNQU5HTEUoQmluZFByb2dyYW1QaXBlbGluZSkKKyNkZWZpbmUgZ2xCaW5kUmVuZGVyYnVmZmVyRVhUCQlNQU5HTEUoQmluZFJlbmRlcmJ1ZmZlckVYVCkKKyNkZWZpbmUgZ2xCaW5kUmVuZGVyYnVmZmVyCQlNQU5HTEUoQmluZFJlbmRlcmJ1ZmZlcikKKyNkZWZpbmUgZ2xCaW5kU2FtcGxlcgkJTUFOR0xFKEJpbmRTYW1wbGVyKQorI2RlZmluZSBnbEJpbmRUZXhHZW5QYXJhbWV0ZXJFWFQJCU1BTkdMRShCaW5kVGV4R2VuUGFyYW1ldGVyRVhUKQorI2RlZmluZSBnbEJpbmRUZXh0dXJlRVhUCQlNQU5HTEUoQmluZFRleHR1cmVFWFQpCisjZGVmaW5lIGdsQmluZFRleHR1cmUJCU1BTkdMRShCaW5kVGV4dHVyZSkKKyNkZWZpbmUgZ2xCaW5kVGV4dHVyZVVuaXRQYXJhbWV0ZXJFWFQJCU1BTkdMRShCaW5kVGV4dHVyZVVuaXRQYXJhbWV0ZXJFWFQpCisjZGVmaW5lIGdsQmluZFRyYW5zZm9ybUZlZWRiYWNrCQlNQU5HTEUoQmluZFRyYW5zZm9ybUZlZWRiYWNrKQorI2RlZmluZSBnbEJpbmRUcmFuc2Zvcm1GZWVkYmFja05WCQlNQU5HTEUoQmluZFRyYW5zZm9ybUZlZWRiYWNrTlYpCisjZGVmaW5lIGdsQmluZFZlcnRleEFycmF5QVBQTEUJCU1BTkdMRShCaW5kVmVydGV4QXJyYXlBUFBMRSkKKyNkZWZpbmUgZ2xCaW5kVmVydGV4QXJyYXkJCU1BTkdMRShCaW5kVmVydGV4QXJyYXkpCisjZGVmaW5lIGdsQmluZFZlcnRleFNoYWRlckVYVAkJTUFOR0xFKEJpbmRWZXJ0ZXhTaGFkZXJFWFQpCisjZGVmaW5lIGdsQmluZFZpZGVvQ2FwdHVyZVN0cmVhbUJ1ZmZlck5WCQlNQU5HTEUoQmluZFZpZGVvQ2FwdHVyZVN0cmVhbUJ1ZmZlck5WKQorI2RlZmluZSBnbEJpbmRWaWRlb0NhcHR1cmVTdHJlYW1UZXh0dXJlTlYJCU1BTkdMRShCaW5kVmlkZW9DYXB0dXJlU3RyZWFtVGV4dHVyZU5WKQorI2RlZmluZSBnbEJpbm9ybWFsM2JFWFQJCU1BTkdMRShCaW5vcm1hbDNiRVhUKQorI2RlZmluZSBnbEJpbm9ybWFsM2J2RVhUCQlNQU5HTEUoQmlub3JtYWwzYnZFWFQpCisjZGVmaW5lIGdsQmlub3JtYWwzZEVYVAkJTUFOR0xFKEJpbm9ybWFsM2RFWFQpCisjZGVmaW5lIGdsQmlub3JtYWwzZHZFWFQJCU1BTkdMRShCaW5vcm1hbDNkdkVYVCkKKyNkZWZpbmUgZ2xCaW5vcm1hbDNmRVhUCQlNQU5HTEUoQmlub3JtYWwzZkVYVCkKKyNkZWZpbmUgZ2xCaW5vcm1hbDNmdkVYVAkJTUFOR0xFKEJpbm9ybWFsM2Z2RVhUKQorI2RlZmluZSBnbEJpbm9ybWFsM2lFWFQJCU1BTkdMRShCaW5vcm1hbDNpRVhUKQorI2RlZmluZSBnbEJpbm9ybWFsM2l2RVhUCQlNQU5HTEUoQmlub3JtYWwzaXZFWFQpCisjZGVmaW5lIGdsQmlub3JtYWwzc0VYVAkJTUFOR0xFKEJpbm9ybWFsM3NFWFQpCisjZGVmaW5lIGdsQmlub3JtYWwzc3ZFWFQJCU1BTkdMRShCaW5vcm1hbDNzdkVYVCkKKyNkZWZpbmUgZ2xCaW5vcm1hbFBvaW50ZXJFWFQJCU1BTkdMRShCaW5vcm1hbFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsQml0bWFwCQlNQU5HTEUoQml0bWFwKQorI2RlZmluZSBnbEJsZW5kQ29sb3JFWFQJCU1BTkdMRShCbGVuZENvbG9yRVhUKQorI2RlZmluZSBnbEJsZW5kQ29sb3IJCU1BTkdMRShCbGVuZENvbG9yKQorI2RlZmluZSBnbEJsZW5kRXF1YXRpb25FWFQJCU1BTkdMRShCbGVuZEVxdWF0aW9uRVhUKQorI2RlZmluZSBnbEJsZW5kRXF1YXRpb25pQVJCCQlNQU5HTEUoQmxlbmRFcXVhdGlvbmlBUkIpCisjZGVmaW5lIGdsQmxlbmRFcXVhdGlvbmkJCU1BTkdMRShCbGVuZEVxdWF0aW9uaSkKKyNkZWZpbmUgZ2xCbGVuZEVxdWF0aW9uSW5kZXhlZEFNRAkJTUFOR0xFKEJsZW5kRXF1YXRpb25JbmRleGVkQU1EKQorI2RlZmluZSBnbEJsZW5kRXF1YXRpb24JCU1BTkdMRShCbGVuZEVxdWF0aW9uKQorI2RlZmluZSBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZUFUSQkJTUFOR0xFKEJsZW5kRXF1YXRpb25TZXBhcmF0ZUFUSSkKKyNkZWZpbmUgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVFWFQJCU1BTkdMRShCbGVuZEVxdWF0aW9uU2VwYXJhdGVFWFQpCisjZGVmaW5lIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlaUFSQgkJTUFOR0xFKEJsZW5kRXF1YXRpb25TZXBhcmF0ZWlBUkIpCisjZGVmaW5lIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlaQkJTUFOR0xFKEJsZW5kRXF1YXRpb25TZXBhcmF0ZWkpCisjZGVmaW5lIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlSW5kZXhlZEFNRAkJTUFOR0xFKEJsZW5kRXF1YXRpb25TZXBhcmF0ZUluZGV4ZWRBTUQpCisjZGVmaW5lIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlCQlNQU5HTEUoQmxlbmRFcXVhdGlvblNlcGFyYXRlKQorI2RlZmluZSBnbEJsZW5kRnVuY2lBUkIJCU1BTkdMRShCbGVuZEZ1bmNpQVJCKQorI2RlZmluZSBnbEJsZW5kRnVuY2kJCU1BTkdMRShCbGVuZEZ1bmNpKQorI2RlZmluZSBnbEJsZW5kRnVuY0luZGV4ZWRBTUQJCU1BTkdMRShCbGVuZEZ1bmNJbmRleGVkQU1EKQorI2RlZmluZSBnbEJsZW5kRnVuYwkJTUFOR0xFKEJsZW5kRnVuYykKKyNkZWZpbmUgZ2xCbGVuZEZ1bmNTZXBhcmF0ZUVYVAkJTUFOR0xFKEJsZW5kRnVuY1NlcGFyYXRlRVhUKQorI2RlZmluZSBnbEJsZW5kRnVuY1NlcGFyYXRlaUFSQgkJTUFOR0xFKEJsZW5kRnVuY1NlcGFyYXRlaUFSQikKKyNkZWZpbmUgZ2xCbGVuZEZ1bmNTZXBhcmF0ZWkJCU1BTkdMRShCbGVuZEZ1bmNTZXBhcmF0ZWkpCisjZGVmaW5lIGdsQmxlbmRGdW5jU2VwYXJhdGVJbmRleGVkQU1ECQlNQU5HTEUoQmxlbmRGdW5jU2VwYXJhdGVJbmRleGVkQU1EKQorI2RlZmluZSBnbEJsZW5kRnVuY1NlcGFyYXRlSU5HUgkJTUFOR0xFKEJsZW5kRnVuY1NlcGFyYXRlSU5HUikKKyNkZWZpbmUgZ2xCbGVuZEZ1bmNTZXBhcmF0ZQkJTUFOR0xFKEJsZW5kRnVuY1NlcGFyYXRlKQorI2RlZmluZSBnbEJsaXRGcmFtZWJ1ZmZlckVYVAkJTUFOR0xFKEJsaXRGcmFtZWJ1ZmZlckVYVCkKKyNkZWZpbmUgZ2xCbGl0RnJhbWVidWZmZXIJCU1BTkdMRShCbGl0RnJhbWVidWZmZXIpCisjZGVmaW5lIGdsQnVmZmVyQWRkcmVzc1JhbmdlTlYJCU1BTkdMRShCdWZmZXJBZGRyZXNzUmFuZ2VOVikKKyNkZWZpbmUgZ2xCdWZmZXJEYXRhQVJCCQlNQU5HTEUoQnVmZmVyRGF0YUFSQikKKyNkZWZpbmUgZ2xCdWZmZXJEYXRhCQlNQU5HTEUoQnVmZmVyRGF0YSkKKyNkZWZpbmUgZ2xCdWZmZXJQYXJhbWV0ZXJpQVBQTEUJCU1BTkdMRShCdWZmZXJQYXJhbWV0ZXJpQVBQTEUpCisjZGVmaW5lIGdsQnVmZmVyU3ViRGF0YUFSQgkJTUFOR0xFKEJ1ZmZlclN1YkRhdGFBUkIpCisjZGVmaW5lIGdsQnVmZmVyU3ViRGF0YQkJTUFOR0xFKEJ1ZmZlclN1YkRhdGEpCisjZGVmaW5lIGdsQ2FsbExpc3QJCU1BTkdMRShDYWxsTGlzdCkKKyNkZWZpbmUgZ2xDYWxsTGlzdHMJCU1BTkdMRShDYWxsTGlzdHMpCisjZGVmaW5lIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VYVAkJTUFOR0xFKENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQpCisjZGVmaW5lIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cwkJTUFOR0xFKENoZWNrRnJhbWVidWZmZXJTdGF0dXMpCisjZGVmaW5lIGdsQ2hlY2tOYW1lZEZyYW1lYnVmZmVyU3RhdHVzRVhUCQlNQU5HTEUoQ2hlY2tOYW1lZEZyYW1lYnVmZmVyU3RhdHVzRVhUKQorI2RlZmluZSBnbENsYW1wQ29sb3JBUkIJCU1BTkdMRShDbGFtcENvbG9yQVJCKQorI2RlZmluZSBnbENsYW1wQ29sb3IJCU1BTkdMRShDbGFtcENvbG9yKQorI2RlZmluZSBnbENsZWFyQWNjdW0JCU1BTkdMRShDbGVhckFjY3VtKQorI2RlZmluZSBnbENsZWFyQnVmZmVyZmkJCU1BTkdMRShDbGVhckJ1ZmZlcmZpKQorI2RlZmluZSBnbENsZWFyQnVmZmVyZnYJCU1BTkdMRShDbGVhckJ1ZmZlcmZ2KQorI2RlZmluZSBnbENsZWFyQnVmZmVyaXYJCU1BTkdMRShDbGVhckJ1ZmZlcml2KQorI2RlZmluZSBnbENsZWFyQnVmZmVydWl2CQlNQU5HTEUoQ2xlYXJCdWZmZXJ1aXYpCisjZGVmaW5lIGdsQ2xlYXJDb2xvcklpRVhUCQlNQU5HTEUoQ2xlYXJDb2xvcklpRVhUKQorI2RlZmluZSBnbENsZWFyQ29sb3JJdWlFWFQJCU1BTkdMRShDbGVhckNvbG9ySXVpRVhUKQorI2RlZmluZSBnbENsZWFyQ29sb3IJCU1BTkdMRShDbGVhckNvbG9yKQorI2RlZmluZSBnbENsZWFyRGVidWdMb2dNRVNBCQlNQU5HTEUoQ2xlYXJEZWJ1Z0xvZ01FU0EpCisjZGVmaW5lIGdsQ2xlYXJEZXB0aGROVgkJTUFOR0xFKENsZWFyRGVwdGhkTlYpCisjZGVmaW5lIGdsQ2xlYXJEZXB0aGYJCU1BTkdMRShDbGVhckRlcHRoZikKKyNkZWZpbmUgZ2xDbGVhckRlcHRoCQlNQU5HTEUoQ2xlYXJEZXB0aCkKKyNkZWZpbmUgZ2xDbGVhckluZGV4CQlNQU5HTEUoQ2xlYXJJbmRleCkKKyNkZWZpbmUgZ2xDbGVhcgkJTUFOR0xFKENsZWFyKQorI2RlZmluZSBnbENsZWFyU3RlbmNpbAkJTUFOR0xFKENsZWFyU3RlbmNpbCkKKyNkZWZpbmUgZ2xDbGllbnRBY3RpdmVUZXh0dXJlQVJCCQlNQU5HTEUoQ2xpZW50QWN0aXZlVGV4dHVyZUFSQikKKyNkZWZpbmUgZ2xDbGllbnRBY3RpdmVUZXh0dXJlCQlNQU5HTEUoQ2xpZW50QWN0aXZlVGV4dHVyZSkKKyNkZWZpbmUgZ2xDbGllbnRBY3RpdmVWZXJ0ZXhTdHJlYW1BVEkJCU1BTkdMRShDbGllbnRBY3RpdmVWZXJ0ZXhTdHJlYW1BVEkpCisjZGVmaW5lIGdsQ2xpZW50QXR0cmliRGVmYXVsdEVYVAkJTUFOR0xFKENsaWVudEF0dHJpYkRlZmF1bHRFWFQpCisjZGVmaW5lIGdsQ2xpZW50V2FpdFN5bmMJCU1BTkdMRShDbGllbnRXYWl0U3luYykKKyNkZWZpbmUgZ2xDbGlwUGxhbmUJCU1BTkdMRShDbGlwUGxhbmUpCisjZGVmaW5lIGdsQ29sb3IzYgkJTUFOR0xFKENvbG9yM2IpCisjZGVmaW5lIGdsQ29sb3IzYnYJCU1BTkdMRShDb2xvcjNidikKKyNkZWZpbmUgZ2xDb2xvcjNkCQlNQU5HTEUoQ29sb3IzZCkKKyNkZWZpbmUgZ2xDb2xvcjNkdgkJTUFOR0xFKENvbG9yM2R2KQorI2RlZmluZSBnbENvbG9yM2YJCU1BTkdMRShDb2xvcjNmKQorI2RlZmluZSBnbENvbG9yM2ZWZXJ0ZXgzZlNVTgkJTUFOR0xFKENvbG9yM2ZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xDb2xvcjNmVmVydGV4M2Z2U1VOCQlNQU5HTEUoQ29sb3IzZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xDb2xvcjNmdgkJTUFOR0xFKENvbG9yM2Z2KQorI2RlZmluZSBnbENvbG9yM2hOVgkJTUFOR0xFKENvbG9yM2hOVikKKyNkZWZpbmUgZ2xDb2xvcjNodk5WCQlNQU5HTEUoQ29sb3IzaHZOVikKKyNkZWZpbmUgZ2xDb2xvcjNpCQlNQU5HTEUoQ29sb3IzaSkKKyNkZWZpbmUgZ2xDb2xvcjNpdgkJTUFOR0xFKENvbG9yM2l2KQorI2RlZmluZSBnbENvbG9yM3MJCU1BTkdMRShDb2xvcjNzKQorI2RlZmluZSBnbENvbG9yM3N2CQlNQU5HTEUoQ29sb3Izc3YpCisjZGVmaW5lIGdsQ29sb3IzdWIJCU1BTkdMRShDb2xvcjN1YikKKyNkZWZpbmUgZ2xDb2xvcjN1YnYJCU1BTkdMRShDb2xvcjN1YnYpCisjZGVmaW5lIGdsQ29sb3IzdWkJCU1BTkdMRShDb2xvcjN1aSkKKyNkZWZpbmUgZ2xDb2xvcjN1aXYJCU1BTkdMRShDb2xvcjN1aXYpCisjZGVmaW5lIGdsQ29sb3IzdXMJCU1BTkdMRShDb2xvcjN1cykKKyNkZWZpbmUgZ2xDb2xvcjN1c3YJCU1BTkdMRShDb2xvcjN1c3YpCisjZGVmaW5lIGdsQ29sb3I0YgkJTUFOR0xFKENvbG9yNGIpCisjZGVmaW5lIGdsQ29sb3I0YnYJCU1BTkdMRShDb2xvcjRidikKKyNkZWZpbmUgZ2xDb2xvcjRkCQlNQU5HTEUoQ29sb3I0ZCkKKyNkZWZpbmUgZ2xDb2xvcjRkdgkJTUFOR0xFKENvbG9yNGR2KQorI2RlZmluZSBnbENvbG9yNGYJCU1BTkdMRShDb2xvcjRmKQorI2RlZmluZSBnbENvbG9yNGZOb3JtYWwzZlZlcnRleDNmU1VOCQlNQU5HTEUoQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOCQlNQU5HTEUoQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbENvbG9yNGZ2CQlNQU5HTEUoQ29sb3I0ZnYpCisjZGVmaW5lIGdsQ29sb3I0aE5WCQlNQU5HTEUoQ29sb3I0aE5WKQorI2RlZmluZSBnbENvbG9yNGh2TlYJCU1BTkdMRShDb2xvcjRodk5WKQorI2RlZmluZSBnbENvbG9yNGkJCU1BTkdMRShDb2xvcjRpKQorI2RlZmluZSBnbENvbG9yNGl2CQlNQU5HTEUoQ29sb3I0aXYpCisjZGVmaW5lIGdsQ29sb3I0cwkJTUFOR0xFKENvbG9yNHMpCisjZGVmaW5lIGdsQ29sb3I0c3YJCU1BTkdMRShDb2xvcjRzdikKKyNkZWZpbmUgZ2xDb2xvcjR1YgkJTUFOR0xFKENvbG9yNHViKQorI2RlZmluZSBnbENvbG9yNHViVmVydGV4MmZTVU4JCU1BTkdMRShDb2xvcjR1YlZlcnRleDJmU1VOKQorI2RlZmluZSBnbENvbG9yNHViVmVydGV4MmZ2U1VOCQlNQU5HTEUoQ29sb3I0dWJWZXJ0ZXgyZnZTVU4pCisjZGVmaW5lIGdsQ29sb3I0dWJWZXJ0ZXgzZlNVTgkJTUFOR0xFKENvbG9yNHViVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsQ29sb3I0dWJWZXJ0ZXgzZnZTVU4JCU1BTkdMRShDb2xvcjR1YlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xDb2xvcjR1YnYJCU1BTkdMRShDb2xvcjR1YnYpCisjZGVmaW5lIGdsQ29sb3I0dWkJCU1BTkdMRShDb2xvcjR1aSkKKyNkZWZpbmUgZ2xDb2xvcjR1aXYJCU1BTkdMRShDb2xvcjR1aXYpCisjZGVmaW5lIGdsQ29sb3I0dXMJCU1BTkdMRShDb2xvcjR1cykKKyNkZWZpbmUgZ2xDb2xvcjR1c3YJCU1BTkdMRShDb2xvcjR1c3YpCisjZGVmaW5lIGdsQ29sb3JGb3JtYXROVgkJTUFOR0xFKENvbG9yRm9ybWF0TlYpCisjZGVmaW5lIGdsQ29sb3JGcmFnbWVudE9wMUFUSQkJTUFOR0xFKENvbG9yRnJhZ21lbnRPcDFBVEkpCisjZGVmaW5lIGdsQ29sb3JGcmFnbWVudE9wMkFUSQkJTUFOR0xFKENvbG9yRnJhZ21lbnRPcDJBVEkpCisjZGVmaW5lIGdsQ29sb3JGcmFnbWVudE9wM0FUSQkJTUFOR0xFKENvbG9yRnJhZ21lbnRPcDNBVEkpCisjZGVmaW5lIGdsQ29sb3JNYXNraQkJTUFOR0xFKENvbG9yTWFza2kpCisjZGVmaW5lIGdsQ29sb3JNYXNrSW5kZXhlZEVYVAkJTUFOR0xFKENvbG9yTWFza0luZGV4ZWRFWFQpCisjZGVmaW5lIGdsQ29sb3JNYXNrCQlNQU5HTEUoQ29sb3JNYXNrKQorI2RlZmluZSBnbENvbG9yTWF0ZXJpYWwJCU1BTkdMRShDb2xvck1hdGVyaWFsKQorI2RlZmluZSBnbENvbG9yUDN1aQkJTUFOR0xFKENvbG9yUDN1aSkKKyNkZWZpbmUgZ2xDb2xvclAzdWl2CQlNQU5HTEUoQ29sb3JQM3VpdikKKyNkZWZpbmUgZ2xDb2xvclA0dWkJCU1BTkdMRShDb2xvclA0dWkpCisjZGVmaW5lIGdsQ29sb3JQNHVpdgkJTUFOR0xFKENvbG9yUDR1aXYpCisjZGVmaW5lIGdsQ29sb3JQb2ludGVyRVhUCQlNQU5HTEUoQ29sb3JQb2ludGVyRVhUKQorI2RlZmluZSBnbENvbG9yUG9pbnRlckxpc3RJQk0JCU1BTkdMRShDb2xvclBvaW50ZXJMaXN0SUJNKQorI2RlZmluZSBnbENvbG9yUG9pbnRlcgkJTUFOR0xFKENvbG9yUG9pbnRlcikKKyNkZWZpbmUgZ2xDb2xvclBvaW50ZXJ2SU5URUwJCU1BTkdMRShDb2xvclBvaW50ZXJ2SU5URUwpCisjZGVmaW5lIGdsQ29sb3JTdWJUYWJsZUVYVAkJTUFOR0xFKENvbG9yU3ViVGFibGVFWFQpCisjZGVmaW5lIGdsQ29sb3JTdWJUYWJsZQkJTUFOR0xFKENvbG9yU3ViVGFibGUpCisjZGVmaW5lIGdsQ29sb3JUYWJsZUVYVAkJTUFOR0xFKENvbG9yVGFibGVFWFQpCisjZGVmaW5lIGdsQ29sb3JUYWJsZQkJTUFOR0xFKENvbG9yVGFibGUpCisjZGVmaW5lIGdsQ29sb3JUYWJsZVBhcmFtZXRlcmZ2CQlNQU5HTEUoQ29sb3JUYWJsZVBhcmFtZXRlcmZ2KQorI2RlZmluZSBnbENvbG9yVGFibGVQYXJhbWV0ZXJmdlNHSQkJTUFOR0xFKENvbG9yVGFibGVQYXJhbWV0ZXJmdlNHSSkKKyNkZWZpbmUgZ2xDb2xvclRhYmxlUGFyYW1ldGVyaXYJCU1BTkdMRShDb2xvclRhYmxlUGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsQ29sb3JUYWJsZVBhcmFtZXRlcml2U0dJCQlNQU5HTEUoQ29sb3JUYWJsZVBhcmFtZXRlcml2U0dJKQorI2RlZmluZSBnbENvbG9yVGFibGVTR0kJCU1BTkdMRShDb2xvclRhYmxlU0dJKQorI2RlZmluZSBnbENvbWJpbmVySW5wdXROVgkJTUFOR0xFKENvbWJpbmVySW5wdXROVikKKyNkZWZpbmUgZ2xDb21iaW5lck91dHB1dE5WCQlNQU5HTEUoQ29tYmluZXJPdXRwdXROVikKKyNkZWZpbmUgZ2xDb21iaW5lclBhcmFtZXRlcmZOVgkJTUFOR0xFKENvbWJpbmVyUGFyYW1ldGVyZk5WKQorI2RlZmluZSBnbENvbWJpbmVyUGFyYW1ldGVyZnZOVgkJTUFOR0xFKENvbWJpbmVyUGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xDb21iaW5lclBhcmFtZXRlcmlOVgkJTUFOR0xFKENvbWJpbmVyUGFyYW1ldGVyaU5WKQorI2RlZmluZSBnbENvbWJpbmVyUGFyYW1ldGVyaXZOVgkJTUFOR0xFKENvbWJpbmVyUGFyYW1ldGVyaXZOVikKKyNkZWZpbmUgZ2xDb21iaW5lclN0YWdlUGFyYW1ldGVyZnZOVgkJTUFOR0xFKENvbWJpbmVyU3RhZ2VQYXJhbWV0ZXJmdk5WKQorI2RlZmluZSBnbENvbXBpbGVTaGFkZXJBUkIJCU1BTkdMRShDb21waWxlU2hhZGVyQVJCKQorI2RlZmluZSBnbENvbXBpbGVTaGFkZXJJbmNsdWRlQVJCCQlNQU5HTEUoQ29tcGlsZVNoYWRlckluY2x1ZGVBUkIpCisjZGVmaW5lIGdsQ29tcGlsZVNoYWRlcgkJTUFOR0xFKENvbXBpbGVTaGFkZXIpCisjZGVmaW5lIGdsQ29tcHJlc3NlZE11bHRpVGV4SW1hZ2UxREVYVAkJTUFOR0xFKENvbXByZXNzZWRNdWx0aVRleEltYWdlMURFWFQpCisjZGVmaW5lIGdsQ29tcHJlc3NlZE11bHRpVGV4SW1hZ2UyREVYVAkJTUFOR0xFKENvbXByZXNzZWRNdWx0aVRleEltYWdlMkRFWFQpCisjZGVmaW5lIGdsQ29tcHJlc3NlZE11bHRpVGV4SW1hZ2UzREVYVAkJTUFOR0xFKENvbXByZXNzZWRNdWx0aVRleEltYWdlM0RFWFQpCisjZGVmaW5lIGdsQ29tcHJlc3NlZE11bHRpVGV4U3ViSW1hZ2UxREVYVAkJTUFOR0xFKENvbXByZXNzZWRNdWx0aVRleFN1YkltYWdlMURFWFQpCisjZGVmaW5lIGdsQ29tcHJlc3NlZE11bHRpVGV4U3ViSW1hZ2UyREVYVAkJTUFOR0xFKENvbXByZXNzZWRNdWx0aVRleFN1YkltYWdlMkRFWFQpCisjZGVmaW5lIGdsQ29tcHJlc3NlZE11bHRpVGV4U3ViSW1hZ2UzREVYVAkJTUFOR0xFKENvbXByZXNzZWRNdWx0aVRleFN1YkltYWdlM0RFWFQpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleEltYWdlMURBUkIJCU1BTkdMRShDb21wcmVzc2VkVGV4SW1hZ2UxREFSQikKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4SW1hZ2UxRAkJTUFOR0xFKENvbXByZXNzZWRUZXhJbWFnZTFEKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXhJbWFnZTJEQVJCCQlNQU5HTEUoQ29tcHJlc3NlZFRleEltYWdlMkRBUkIpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleEltYWdlMkQJCU1BTkdMRShDb21wcmVzc2VkVGV4SW1hZ2UyRCkKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4SW1hZ2UzREFSQgkJTUFOR0xFKENvbXByZXNzZWRUZXhJbWFnZTNEQVJCKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXhJbWFnZTNECQlNQU5HTEUoQ29tcHJlc3NlZFRleEltYWdlM0QpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMURBUkIJCU1BTkdMRShDb21wcmVzc2VkVGV4U3ViSW1hZ2UxREFSQikKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UxRAkJTUFOR0xFKENvbXByZXNzZWRUZXhTdWJJbWFnZTFEKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEQVJCCQlNQU5HTEUoQ29tcHJlc3NlZFRleFN1YkltYWdlMkRBUkIpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQJCU1BTkdMRShDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCkKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzREFSQgkJTUFOR0xFKENvbXByZXNzZWRUZXhTdWJJbWFnZTNEQVJCKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTNECQlNQU5HTEUoQ29tcHJlc3NlZFRleFN1YkltYWdlM0QpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleHR1cmVJbWFnZTFERVhUCQlNQU5HTEUoQ29tcHJlc3NlZFRleHR1cmVJbWFnZTFERVhUKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXh0dXJlSW1hZ2UyREVYVAkJTUFOR0xFKENvbXByZXNzZWRUZXh0dXJlSW1hZ2UyREVYVCkKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4dHVyZUltYWdlM0RFWFQJCU1BTkdMRShDb21wcmVzc2VkVGV4dHVyZUltYWdlM0RFWFQpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleHR1cmVTdWJJbWFnZTFERVhUCQlNQU5HTEUoQ29tcHJlc3NlZFRleHR1cmVTdWJJbWFnZTFERVhUKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXh0dXJlU3ViSW1hZ2UyREVYVAkJTUFOR0xFKENvbXByZXNzZWRUZXh0dXJlU3ViSW1hZ2UyREVYVCkKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4dHVyZVN1YkltYWdlM0RFWFQJCU1BTkdMRShDb21wcmVzc2VkVGV4dHVyZVN1YkltYWdlM0RFWFQpCisjZGVmaW5lIGdsQ29udm9sdXRpb25GaWx0ZXIxREVYVAkJTUFOR0xFKENvbnZvbHV0aW9uRmlsdGVyMURFWFQpCisjZGVmaW5lIGdsQ29udm9sdXRpb25GaWx0ZXIxRAkJTUFOR0xFKENvbnZvbHV0aW9uRmlsdGVyMUQpCisjZGVmaW5lIGdsQ29udm9sdXRpb25GaWx0ZXIyREVYVAkJTUFOR0xFKENvbnZvbHV0aW9uRmlsdGVyMkRFWFQpCisjZGVmaW5lIGdsQ29udm9sdXRpb25GaWx0ZXIyRAkJTUFOR0xFKENvbnZvbHV0aW9uRmlsdGVyMkQpCisjZGVmaW5lIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmRVhUCQlNQU5HTEUoQ29udm9sdXRpb25QYXJhbWV0ZXJmRVhUKQorI2RlZmluZSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyZgkJTUFOR0xFKENvbnZvbHV0aW9uUGFyYW1ldGVyZikKKyNkZWZpbmUgZ2xDb252b2x1dGlvblBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoQ29udm9sdXRpb25QYXJhbWV0ZXJmdkVYVCkKKyNkZWZpbmUgZ2xDb252b2x1dGlvblBhcmFtZXRlcmZ2CQlNQU5HTEUoQ29udm9sdXRpb25QYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xDb252b2x1dGlvblBhcmFtZXRlcmlFWFQJCU1BTkdMRShDb252b2x1dGlvblBhcmFtZXRlcmlFWFQpCisjZGVmaW5lIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpCQlNQU5HTEUoQ29udm9sdXRpb25QYXJhbWV0ZXJpKQorI2RlZmluZSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaXZFWFQJCU1BTkdMRShDb252b2x1dGlvblBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaXYJCU1BTkdMRShDb252b2x1dGlvblBhcmFtZXRlcml2KQorI2RlZmluZSBnbENvcHlCdWZmZXJTdWJEYXRhCQlNQU5HTEUoQ29weUJ1ZmZlclN1YkRhdGEpCisjZGVmaW5lIGdsQ29weUNvbG9yU3ViVGFibGVFWFQJCU1BTkdMRShDb3B5Q29sb3JTdWJUYWJsZUVYVCkKKyNkZWZpbmUgZ2xDb3B5Q29sb3JTdWJUYWJsZQkJTUFOR0xFKENvcHlDb2xvclN1YlRhYmxlKQorI2RlZmluZSBnbENvcHlDb2xvclRhYmxlCQlNQU5HTEUoQ29weUNvbG9yVGFibGUpCisjZGVmaW5lIGdsQ29weUNvbG9yVGFibGVTR0kJCU1BTkdMRShDb3B5Q29sb3JUYWJsZVNHSSkKKyNkZWZpbmUgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIxREVYVAkJTUFOR0xFKENvcHlDb252b2x1dGlvbkZpbHRlcjFERVhUKQorI2RlZmluZSBnbENvcHlDb252b2x1dGlvbkZpbHRlcjFECQlNQU5HTEUoQ29weUNvbnZvbHV0aW9uRmlsdGVyMUQpCisjZGVmaW5lIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMkRFWFQJCU1BTkdMRShDb3B5Q29udm9sdXRpb25GaWx0ZXIyREVYVCkKKyNkZWZpbmUgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIyRAkJTUFOR0xFKENvcHlDb252b2x1dGlvbkZpbHRlcjJEKQorI2RlZmluZSBnbENvcHlJbWFnZVN1YkRhdGFOVgkJTUFOR0xFKENvcHlJbWFnZVN1YkRhdGFOVikKKyNkZWZpbmUgZ2xDb3B5TXVsdGlUZXhJbWFnZTFERVhUCQlNQU5HTEUoQ29weU11bHRpVGV4SW1hZ2UxREVYVCkKKyNkZWZpbmUgZ2xDb3B5TXVsdGlUZXhJbWFnZTJERVhUCQlNQU5HTEUoQ29weU11bHRpVGV4SW1hZ2UyREVYVCkKKyNkZWZpbmUgZ2xDb3B5TXVsdGlUZXhTdWJJbWFnZTFERVhUCQlNQU5HTEUoQ29weU11bHRpVGV4U3ViSW1hZ2UxREVYVCkKKyNkZWZpbmUgZ2xDb3B5TXVsdGlUZXhTdWJJbWFnZTJERVhUCQlNQU5HTEUoQ29weU11bHRpVGV4U3ViSW1hZ2UyREVYVCkKKyNkZWZpbmUgZ2xDb3B5TXVsdGlUZXhTdWJJbWFnZTNERVhUCQlNQU5HTEUoQ29weU11bHRpVGV4U3ViSW1hZ2UzREVYVCkKKyNkZWZpbmUgZ2xDb3B5UGl4ZWxzCQlNQU5HTEUoQ29weVBpeGVscykKKyNkZWZpbmUgZ2xDb3B5VGV4SW1hZ2UxREVYVAkJTUFOR0xFKENvcHlUZXhJbWFnZTFERVhUKQorI2RlZmluZSBnbENvcHlUZXhJbWFnZTFECQlNQU5HTEUoQ29weVRleEltYWdlMUQpCisjZGVmaW5lIGdsQ29weVRleEltYWdlMkRFWFQJCU1BTkdMRShDb3B5VGV4SW1hZ2UyREVYVCkKKyNkZWZpbmUgZ2xDb3B5VGV4SW1hZ2UyRAkJTUFOR0xFKENvcHlUZXhJbWFnZTJEKQorI2RlZmluZSBnbENvcHlUZXhTdWJJbWFnZTFERVhUCQlNQU5HTEUoQ29weVRleFN1YkltYWdlMURFWFQpCisjZGVmaW5lIGdsQ29weVRleFN1YkltYWdlMUQJCU1BTkdMRShDb3B5VGV4U3ViSW1hZ2UxRCkKKyNkZWZpbmUgZ2xDb3B5VGV4U3ViSW1hZ2UyREVYVAkJTUFOR0xFKENvcHlUZXhTdWJJbWFnZTJERVhUKQorI2RlZmluZSBnbENvcHlUZXhTdWJJbWFnZTJECQlNQU5HTEUoQ29weVRleFN1YkltYWdlMkQpCisjZGVmaW5lIGdsQ29weVRleFN1YkltYWdlM0RFWFQJCU1BTkdMRShDb3B5VGV4U3ViSW1hZ2UzREVYVCkKKyNkZWZpbmUgZ2xDb3B5VGV4U3ViSW1hZ2UzRAkJTUFOR0xFKENvcHlUZXhTdWJJbWFnZTNEKQorI2RlZmluZSBnbENvcHlUZXh0dXJlSW1hZ2UxREVYVAkJTUFOR0xFKENvcHlUZXh0dXJlSW1hZ2UxREVYVCkKKyNkZWZpbmUgZ2xDb3B5VGV4dHVyZUltYWdlMkRFWFQJCU1BTkdMRShDb3B5VGV4dHVyZUltYWdlMkRFWFQpCisjZGVmaW5lIGdsQ29weVRleHR1cmVTdWJJbWFnZTFERVhUCQlNQU5HTEUoQ29weVRleHR1cmVTdWJJbWFnZTFERVhUKQorI2RlZmluZSBnbENvcHlUZXh0dXJlU3ViSW1hZ2UyREVYVAkJTUFOR0xFKENvcHlUZXh0dXJlU3ViSW1hZ2UyREVYVCkKKyNkZWZpbmUgZ2xDb3B5VGV4dHVyZVN1YkltYWdlM0RFWFQJCU1BTkdMRShDb3B5VGV4dHVyZVN1YkltYWdlM0RFWFQpCisjZGVmaW5lIGdsQ3JlYXRlRGVidWdPYmplY3RNRVNBCQlNQU5HTEUoQ3JlYXRlRGVidWdPYmplY3RNRVNBKQorI2RlZmluZSBnbENyZWF0ZVByb2dyYW0JCU1BTkdMRShDcmVhdGVQcm9ncmFtKQorI2RlZmluZSBnbENyZWF0ZVByb2dyYW1PYmplY3RBUkIJCU1BTkdMRShDcmVhdGVQcm9ncmFtT2JqZWN0QVJCKQorI2RlZmluZSBnbENyZWF0ZVNoYWRlcgkJTUFOR0xFKENyZWF0ZVNoYWRlcikKKyNkZWZpbmUgZ2xDcmVhdGVTaGFkZXJPYmplY3RBUkIJCU1BTkdMRShDcmVhdGVTaGFkZXJPYmplY3RBUkIpCisjZGVmaW5lIGdsQ3JlYXRlU2hhZGVyUHJvZ3JhbUVYVAkJTUFOR0xFKENyZWF0ZVNoYWRlclByb2dyYW1FWFQpCisjZGVmaW5lIGdsQ3JlYXRlU2hhZGVyUHJvZ3JhbXYJCU1BTkdMRShDcmVhdGVTaGFkZXJQcm9ncmFtdikKKyNkZWZpbmUgZ2xDcmVhdGVTeW5jRnJvbUNMZXZlbnRBUkIJCU1BTkdMRShDcmVhdGVTeW5jRnJvbUNMZXZlbnRBUkIpCisjZGVmaW5lIGdsQ3VsbEZhY2UJCU1BTkdMRShDdWxsRmFjZSkKKyNkZWZpbmUgZ2xDdWxsUGFyYW1ldGVyZHZFWFQJCU1BTkdMRShDdWxsUGFyYW1ldGVyZHZFWFQpCisjZGVmaW5lIGdsQ3VsbFBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoQ3VsbFBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbEN1cnJlbnRQYWxldHRlTWF0cml4QVJCCQlNQU5HTEUoQ3VycmVudFBhbGV0dGVNYXRyaXhBUkIpCisjZGVmaW5lIGdsRGVidWdNZXNzYWdlQ2FsbGJhY2tBTUQJCU1BTkdMRShEZWJ1Z01lc3NhZ2VDYWxsYmFja0FNRCkKKyNkZWZpbmUgZ2xEZWJ1Z01lc3NhZ2VDYWxsYmFja0FSQgkJTUFOR0xFKERlYnVnTWVzc2FnZUNhbGxiYWNrQVJCKQorI2RlZmluZSBnbERlYnVnTWVzc2FnZUNvbnRyb2xBUkIJCU1BTkdMRShEZWJ1Z01lc3NhZ2VDb250cm9sQVJCKQorI2RlZmluZSBnbERlYnVnTWVzc2FnZUVuYWJsZUFNRAkJTUFOR0xFKERlYnVnTWVzc2FnZUVuYWJsZUFNRCkKKyNkZWZpbmUgZ2xEZWJ1Z01lc3NhZ2VJbnNlcnRBTUQJCU1BTkdMRShEZWJ1Z01lc3NhZ2VJbnNlcnRBTUQpCisjZGVmaW5lIGdsRGVidWdNZXNzYWdlSW5zZXJ0QVJCCQlNQU5HTEUoRGVidWdNZXNzYWdlSW5zZXJ0QVJCKQorI2RlZmluZSBnbERlZm9ybWF0aW9uTWFwM2RTR0lYCQlNQU5HTEUoRGVmb3JtYXRpb25NYXAzZFNHSVgpCisjZGVmaW5lIGdsRGVmb3JtYXRpb25NYXAzZlNHSVgJCU1BTkdMRShEZWZvcm1hdGlvbk1hcDNmU0dJWCkKKyNkZWZpbmUgZ2xEZWZvcm1TR0lYCQlNQU5HTEUoRGVmb3JtU0dJWCkKKyNkZWZpbmUgZ2xEZWxldGVBc3luY01hcmtlcnNTR0lYCQlNQU5HTEUoRGVsZXRlQXN5bmNNYXJrZXJzU0dJWCkKKyNkZWZpbmUgZ2xEZWxldGVCdWZmZXJzQVJCCQlNQU5HTEUoRGVsZXRlQnVmZmVyc0FSQikKKyNkZWZpbmUgZ2xEZWxldGVCdWZmZXJzCQlNQU5HTEUoRGVsZXRlQnVmZmVycykKKyNkZWZpbmUgZ2xEZWxldGVGZW5jZXNBUFBMRQkJTUFOR0xFKERlbGV0ZUZlbmNlc0FQUExFKQorI2RlZmluZSBnbERlbGV0ZUZlbmNlc05WCQlNQU5HTEUoRGVsZXRlRmVuY2VzTlYpCisjZGVmaW5lIGdsRGVsZXRlRnJhZ21lbnRTaGFkZXJBVEkJCU1BTkdMRShEZWxldGVGcmFnbWVudFNoYWRlckFUSSkKKyNkZWZpbmUgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNFWFQJCU1BTkdMRShEZWxldGVGcmFtZWJ1ZmZlcnNFWFQpCisjZGVmaW5lIGdsRGVsZXRlRnJhbWVidWZmZXJzCQlNQU5HTEUoRGVsZXRlRnJhbWVidWZmZXJzKQorI2RlZmluZSBnbERlbGV0ZUxpc3RzCQlNQU5HTEUoRGVsZXRlTGlzdHMpCisjZGVmaW5lIGdsRGVsZXRlTmFtZWRTdHJpbmdBUkIJCU1BTkdMRShEZWxldGVOYW1lZFN0cmluZ0FSQikKKyNkZWZpbmUgZ2xEZWxldGVOYW1lc0FNRAkJTUFOR0xFKERlbGV0ZU5hbWVzQU1EKQorI2RlZmluZSBnbERlbGV0ZU9iamVjdEFSQgkJTUFOR0xFKERlbGV0ZU9iamVjdEFSQikKKyNkZWZpbmUgZ2xEZWxldGVPY2NsdXNpb25RdWVyaWVzTlYJCU1BTkdMRShEZWxldGVPY2NsdXNpb25RdWVyaWVzTlYpCisjZGVmaW5lIGdsRGVsZXRlUGVyZk1vbml0b3JzQU1ECQlNQU5HTEUoRGVsZXRlUGVyZk1vbml0b3JzQU1EKQorI2RlZmluZSBnbERlbGV0ZVByb2dyYW0JCU1BTkdMRShEZWxldGVQcm9ncmFtKQorI2RlZmluZSBnbERlbGV0ZVByb2dyYW1QaXBlbGluZXMJCU1BTkdMRShEZWxldGVQcm9ncmFtUGlwZWxpbmVzKQorI2RlZmluZSBnbERlbGV0ZVByb2dyYW1zQVJCCQlNQU5HTEUoRGVsZXRlUHJvZ3JhbXNBUkIpCisjZGVmaW5lIGdsRGVsZXRlUHJvZ3JhbXNOVgkJTUFOR0xFKERlbGV0ZVByb2dyYW1zTlYpCisjZGVmaW5lIGdsRGVsZXRlUXVlcmllc0FSQgkJTUFOR0xFKERlbGV0ZVF1ZXJpZXNBUkIpCisjZGVmaW5lIGdsRGVsZXRlUXVlcmllcwkJTUFOR0xFKERlbGV0ZVF1ZXJpZXMpCisjZGVmaW5lIGdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVAkJTUFOR0xFKERlbGV0ZVJlbmRlcmJ1ZmZlcnNFWFQpCisjZGVmaW5lIGdsRGVsZXRlUmVuZGVyYnVmZmVycwkJTUFOR0xFKERlbGV0ZVJlbmRlcmJ1ZmZlcnMpCisjZGVmaW5lIGdsRGVsZXRlU2FtcGxlcnMJCU1BTkdMRShEZWxldGVTYW1wbGVycykKKyNkZWZpbmUgZ2xEZWxldGVTaGFkZXIJCU1BTkdMRShEZWxldGVTaGFkZXIpCisjZGVmaW5lIGdsRGVsZXRlU3luYwkJTUFOR0xFKERlbGV0ZVN5bmMpCisjZGVmaW5lIGdsRGVsZXRlVGV4dHVyZXNFWFQJCU1BTkdMRShEZWxldGVUZXh0dXJlc0VYVCkKKyNkZWZpbmUgZ2xEZWxldGVUZXh0dXJlcwkJTUFOR0xFKERlbGV0ZVRleHR1cmVzKQorI2RlZmluZSBnbERlbGV0ZVRyYW5zZm9ybUZlZWRiYWNrcwkJTUFOR0xFKERlbGV0ZVRyYW5zZm9ybUZlZWRiYWNrcykKKyNkZWZpbmUgZ2xEZWxldGVUcmFuc2Zvcm1GZWVkYmFja3NOVgkJTUFOR0xFKERlbGV0ZVRyYW5zZm9ybUZlZWRiYWNrc05WKQorI2RlZmluZSBnbERlbGV0ZVZlcnRleEFycmF5c0FQUExFCQlNQU5HTEUoRGVsZXRlVmVydGV4QXJyYXlzQVBQTEUpCisjZGVmaW5lIGdsRGVsZXRlVmVydGV4QXJyYXlzCQlNQU5HTEUoRGVsZXRlVmVydGV4QXJyYXlzKQorI2RlZmluZSBnbERlbGV0ZVZlcnRleFNoYWRlckVYVAkJTUFOR0xFKERlbGV0ZVZlcnRleFNoYWRlckVYVCkKKyNkZWZpbmUgZ2xEZXB0aEJvdW5kc2ROVgkJTUFOR0xFKERlcHRoQm91bmRzZE5WKQorI2RlZmluZSBnbERlcHRoQm91bmRzRVhUCQlNQU5HTEUoRGVwdGhCb3VuZHNFWFQpCisjZGVmaW5lIGdsRGVwdGhGdW5jCQlNQU5HTEUoRGVwdGhGdW5jKQorI2RlZmluZSBnbERlcHRoTWFzawkJTUFOR0xFKERlcHRoTWFzaykKKyNkZWZpbmUgZ2xEZXB0aFJhbmdlQXJyYXl2CQlNQU5HTEUoRGVwdGhSYW5nZUFycmF5dikKKyNkZWZpbmUgZ2xEZXB0aFJhbmdlZE5WCQlNQU5HTEUoRGVwdGhSYW5nZWROVikKKyNkZWZpbmUgZ2xEZXB0aFJhbmdlZgkJTUFOR0xFKERlcHRoUmFuZ2VmKQorI2RlZmluZSBnbERlcHRoUmFuZ2VJbmRleGVkCQlNQU5HTEUoRGVwdGhSYW5nZUluZGV4ZWQpCisjZGVmaW5lIGdsRGVwdGhSYW5nZQkJTUFOR0xFKERlcHRoUmFuZ2UpCisjZGVmaW5lIGdsRGV0YWNoT2JqZWN0QVJCCQlNQU5HTEUoRGV0YWNoT2JqZWN0QVJCKQorI2RlZmluZSBnbERldGFjaFNoYWRlcgkJTUFOR0xFKERldGFjaFNoYWRlcikKKyNkZWZpbmUgZ2xEZXRhaWxUZXhGdW5jU0dJUwkJTUFOR0xFKERldGFpbFRleEZ1bmNTR0lTKQorI2RlZmluZSBnbERpc2FibGVDbGllbnRTdGF0ZUluZGV4ZWRFWFQJCU1BTkdMRShEaXNhYmxlQ2xpZW50U3RhdGVJbmRleGVkRVhUKQorI2RlZmluZSBnbERpc2FibGVDbGllbnRTdGF0ZQkJTUFOR0xFKERpc2FibGVDbGllbnRTdGF0ZSkKKyNkZWZpbmUgZ2xEaXNhYmxlaQkJTUFOR0xFKERpc2FibGVpKQorI2RlZmluZSBnbERpc2FibGVJbmRleGVkRVhUCQlNQU5HTEUoRGlzYWJsZUluZGV4ZWRFWFQpCisjZGVmaW5lIGdsRGlzYWJsZQkJTUFOR0xFKERpc2FibGUpCisjZGVmaW5lIGdsRGlzYWJsZVZhcmlhbnRDbGllbnRTdGF0ZUVYVAkJTUFOR0xFKERpc2FibGVWYXJpYW50Q2xpZW50U3RhdGVFWFQpCisjZGVmaW5lIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFQUExFCQlNQU5HTEUoRGlzYWJsZVZlcnRleEF0dHJpYkFQUExFKQorI2RlZmluZSBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheUFSQgkJTUFOR0xFKERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheUFSQikKKyNkZWZpbmUgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkJCU1BTkdMRShEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkpCisjZGVmaW5lIGdsRHJhd0FycmF5c0VYVAkJTUFOR0xFKERyYXdBcnJheXNFWFQpCisjZGVmaW5lIGdsRHJhd0FycmF5c0luZGlyZWN0CQlNQU5HTEUoRHJhd0FycmF5c0luZGlyZWN0KQorI2RlZmluZSBnbERyYXdBcnJheXNJbnN0YW5jZWRBUkIJCU1BTkdMRShEcmF3QXJyYXlzSW5zdGFuY2VkQVJCKQorI2RlZmluZSBnbERyYXdBcnJheXNJbnN0YW5jZWRFWFQJCU1BTkdMRShEcmF3QXJyYXlzSW5zdGFuY2VkRVhUKQorI2RlZmluZSBnbERyYXdBcnJheXNJbnN0YW5jZWQJCU1BTkdMRShEcmF3QXJyYXlzSW5zdGFuY2VkKQorI2RlZmluZSBnbERyYXdBcnJheXMJCU1BTkdMRShEcmF3QXJyYXlzKQorI2RlZmluZSBnbERyYXdCdWZmZXIJCU1BTkdMRShEcmF3QnVmZmVyKQorI2RlZmluZSBnbERyYXdCdWZmZXJzQVJCCQlNQU5HTEUoRHJhd0J1ZmZlcnNBUkIpCisjZGVmaW5lIGdsRHJhd0J1ZmZlcnNBVEkJCU1BTkdMRShEcmF3QnVmZmVyc0FUSSkKKyNkZWZpbmUgZ2xEcmF3QnVmZmVycwkJTUFOR0xFKERyYXdCdWZmZXJzKQorI2RlZmluZSBnbERyYXdFbGVtZW50QXJyYXlBUFBMRQkJTUFOR0xFKERyYXdFbGVtZW50QXJyYXlBUFBMRSkKKyNkZWZpbmUgZ2xEcmF3RWxlbWVudEFycmF5QVRJCQlNQU5HTEUoRHJhd0VsZW1lbnRBcnJheUFUSSkKKyNkZWZpbmUgZ2xEcmF3RWxlbWVudHNCYXNlVmVydGV4CQlNQU5HTEUoRHJhd0VsZW1lbnRzQmFzZVZlcnRleCkKKyNkZWZpbmUgZ2xEcmF3RWxlbWVudHNJbmRpcmVjdAkJTUFOR0xFKERyYXdFbGVtZW50c0luZGlyZWN0KQorI2RlZmluZSBnbERyYXdFbGVtZW50c0luc3RhbmNlZEFSQgkJTUFOR0xFKERyYXdFbGVtZW50c0luc3RhbmNlZEFSQikKKyNkZWZpbmUgZ2xEcmF3RWxlbWVudHNJbnN0YW5jZWRCYXNlVmVydGV4CQlNQU5HTEUoRHJhd0VsZW1lbnRzSW5zdGFuY2VkQmFzZVZlcnRleCkKKyNkZWZpbmUgZ2xEcmF3RWxlbWVudHNJbnN0YW5jZWRFWFQJCU1BTkdMRShEcmF3RWxlbWVudHNJbnN0YW5jZWRFWFQpCisjZGVmaW5lIGdsRHJhd0VsZW1lbnRzSW5zdGFuY2VkCQlNQU5HTEUoRHJhd0VsZW1lbnRzSW5zdGFuY2VkKQorI2RlZmluZSBnbERyYXdFbGVtZW50cwkJTUFOR0xFKERyYXdFbGVtZW50cykKKyNkZWZpbmUgZ2xEcmF3TWVzaEFycmF5c1NVTgkJTUFOR0xFKERyYXdNZXNoQXJyYXlzU1VOKQorI2RlZmluZSBnbERyYXdQaXhlbHMJCU1BTkdMRShEcmF3UGl4ZWxzKQorI2RlZmluZSBnbERyYXdSYW5nZUVsZW1lbnRBcnJheUFQUExFCQlNQU5HTEUoRHJhd1JhbmdlRWxlbWVudEFycmF5QVBQTEUpCisjZGVmaW5lIGdsRHJhd1JhbmdlRWxlbWVudEFycmF5QVRJCQlNQU5HTEUoRHJhd1JhbmdlRWxlbWVudEFycmF5QVRJKQorI2RlZmluZSBnbERyYXdSYW5nZUVsZW1lbnRzQmFzZVZlcnRleAkJTUFOR0xFKERyYXdSYW5nZUVsZW1lbnRzQmFzZVZlcnRleCkKKyNkZWZpbmUgZ2xEcmF3UmFuZ2VFbGVtZW50c0VYVAkJTUFOR0xFKERyYXdSYW5nZUVsZW1lbnRzRVhUKQorI2RlZmluZSBnbERyYXdSYW5nZUVsZW1lbnRzCQlNQU5HTEUoRHJhd1JhbmdlRWxlbWVudHMpCisjZGVmaW5lIGdsRHJhd1RyYW5zZm9ybUZlZWRiYWNrCQlNQU5HTEUoRHJhd1RyYW5zZm9ybUZlZWRiYWNrKQorI2RlZmluZSBnbERyYXdUcmFuc2Zvcm1GZWVkYmFja05WCQlNQU5HTEUoRHJhd1RyYW5zZm9ybUZlZWRiYWNrTlYpCisjZGVmaW5lIGdsRHJhd1RyYW5zZm9ybUZlZWRiYWNrU3RyZWFtCQlNQU5HTEUoRHJhd1RyYW5zZm9ybUZlZWRiYWNrU3RyZWFtKQorI2RlZmluZSBnbEVkZ2VGbGFnRm9ybWF0TlYJCU1BTkdMRShFZGdlRmxhZ0Zvcm1hdE5WKQorI2RlZmluZSBnbEVkZ2VGbGFnCQlNQU5HTEUoRWRnZUZsYWcpCisjZGVmaW5lIGdsRWRnZUZsYWdQb2ludGVyRVhUCQlNQU5HTEUoRWRnZUZsYWdQb2ludGVyRVhUKQorI2RlZmluZSBnbEVkZ2VGbGFnUG9pbnRlckxpc3RJQk0JCU1BTkdMRShFZGdlRmxhZ1BvaW50ZXJMaXN0SUJNKQorI2RlZmluZSBnbEVkZ2VGbGFnUG9pbnRlcgkJTUFOR0xFKEVkZ2VGbGFnUG9pbnRlcikKKyNkZWZpbmUgZ2xFZGdlRmxhZ3YJCU1BTkdMRShFZGdlRmxhZ3YpCisjZGVmaW5lIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTCQlNQU5HTEUoRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTKQorI2RlZmluZSBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTCQlNQU5HTEUoRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMpCisjZGVmaW5lIGdsRWxlbWVudFBvaW50ZXJBUFBMRQkJTUFOR0xFKEVsZW1lbnRQb2ludGVyQVBQTEUpCisjZGVmaW5lIGdsRWxlbWVudFBvaW50ZXJBVEkJCU1BTkdMRShFbGVtZW50UG9pbnRlckFUSSkKKyNkZWZpbmUgZ2xFbmFibGVDbGllbnRTdGF0ZUluZGV4ZWRFWFQJCU1BTkdMRShFbmFibGVDbGllbnRTdGF0ZUluZGV4ZWRFWFQpCisjZGVmaW5lIGdsRW5hYmxlQ2xpZW50U3RhdGUJCU1BTkdMRShFbmFibGVDbGllbnRTdGF0ZSkKKyNkZWZpbmUgZ2xFbmFibGVpCQlNQU5HTEUoRW5hYmxlaSkKKyNkZWZpbmUgZ2xFbmFibGVJbmRleGVkRVhUCQlNQU5HTEUoRW5hYmxlSW5kZXhlZEVYVCkKKyNkZWZpbmUgZ2xFbmFibGUJCU1BTkdMRShFbmFibGUpCisjZGVmaW5lIGdsRW5hYmxlVmFyaWFudENsaWVudFN0YXRlRVhUCQlNQU5HTEUoRW5hYmxlVmFyaWFudENsaWVudFN0YXRlRVhUKQorI2RlZmluZSBnbEVuYWJsZVZlcnRleEF0dHJpYkFQUExFCQlNQU5HTEUoRW5hYmxlVmVydGV4QXR0cmliQVBQTEUpCisjZGVmaW5lIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXlBUkIJCU1BTkdMRShFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheUFSQikKKyNkZWZpbmUgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheQkJTUFOR0xFKEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KQorI2RlZmluZSBnbEVuZENvbmRpdGlvbmFsUmVuZGVyCQlNQU5HTEUoRW5kQ29uZGl0aW9uYWxSZW5kZXIpCisjZGVmaW5lIGdsRW5kQ29uZGl0aW9uYWxSZW5kZXJOVgkJTUFOR0xFKEVuZENvbmRpdGlvbmFsUmVuZGVyTlYpCisjZGVmaW5lIGdsRW5kRnJhZ21lbnRTaGFkZXJBVEkJCU1BTkdMRShFbmRGcmFnbWVudFNoYWRlckFUSSkKKyNkZWZpbmUgZ2xFbmRMaXN0CQlNQU5HTEUoRW5kTGlzdCkKKyNkZWZpbmUgZ2xFbmQJCU1BTkdMRShFbmQpCisjZGVmaW5lIGdsRW5kT2NjbHVzaW9uUXVlcnlOVgkJTUFOR0xFKEVuZE9jY2x1c2lvblF1ZXJ5TlYpCisjZGVmaW5lIGdsRW5kUGVyZk1vbml0b3JBTUQJCU1BTkdMRShFbmRQZXJmTW9uaXRvckFNRCkKKyNkZWZpbmUgZ2xFbmRRdWVyeUFSQgkJTUFOR0xFKEVuZFF1ZXJ5QVJCKQorI2RlZmluZSBnbEVuZFF1ZXJ5SW5kZXhlZAkJTUFOR0xFKEVuZFF1ZXJ5SW5kZXhlZCkKKyNkZWZpbmUgZ2xFbmRRdWVyeQkJTUFOR0xFKEVuZFF1ZXJ5KQorI2RlZmluZSBnbEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUCQlNQU5HTEUoRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQpCisjZGVmaW5lIGdsRW5kVHJhbnNmb3JtRmVlZGJhY2sJCU1BTkdMRShFbmRUcmFuc2Zvcm1GZWVkYmFjaykKKyNkZWZpbmUgZ2xFbmRUcmFuc2Zvcm1GZWVkYmFja05WCQlNQU5HTEUoRW5kVHJhbnNmb3JtRmVlZGJhY2tOVikKKyNkZWZpbmUgZ2xFbmRWZXJ0ZXhTaGFkZXJFWFQJCU1BTkdMRShFbmRWZXJ0ZXhTaGFkZXJFWFQpCisjZGVmaW5lIGdsRW5kVmlkZW9DYXB0dXJlTlYJCU1BTkdMRShFbmRWaWRlb0NhcHR1cmVOVikKKyNkZWZpbmUgZ2xFdmFsQ29vcmQxZAkJTUFOR0xFKEV2YWxDb29yZDFkKQorI2RlZmluZSBnbEV2YWxDb29yZDFkdgkJTUFOR0xFKEV2YWxDb29yZDFkdikKKyNkZWZpbmUgZ2xFdmFsQ29vcmQxZgkJTUFOR0xFKEV2YWxDb29yZDFmKQorI2RlZmluZSBnbEV2YWxDb29yZDFmdgkJTUFOR0xFKEV2YWxDb29yZDFmdikKKyNkZWZpbmUgZ2xFdmFsQ29vcmQyZAkJTUFOR0xFKEV2YWxDb29yZDJkKQorI2RlZmluZSBnbEV2YWxDb29yZDJkdgkJTUFOR0xFKEV2YWxDb29yZDJkdikKKyNkZWZpbmUgZ2xFdmFsQ29vcmQyZgkJTUFOR0xFKEV2YWxDb29yZDJmKQorI2RlZmluZSBnbEV2YWxDb29yZDJmdgkJTUFOR0xFKEV2YWxDb29yZDJmdikKKyNkZWZpbmUgZ2xFdmFsTWFwc05WCQlNQU5HTEUoRXZhbE1hcHNOVikKKyNkZWZpbmUgZ2xFdmFsTWVzaDEJCU1BTkdMRShFdmFsTWVzaDEpCisjZGVmaW5lIGdsRXZhbE1lc2gyCQlNQU5HTEUoRXZhbE1lc2gyKQorI2RlZmluZSBnbEV2YWxQb2ludDEJCU1BTkdMRShFdmFsUG9pbnQxKQorI2RlZmluZSBnbEV2YWxQb2ludDIJCU1BTkdMRShFdmFsUG9pbnQyKQorI2RlZmluZSBnbEV4ZWN1dGVQcm9ncmFtTlYJCU1BTkdMRShFeGVjdXRlUHJvZ3JhbU5WKQorI2RlZmluZSBnbEV4dHJhY3RDb21wb25lbnRFWFQJCU1BTkdMRShFeHRyYWN0Q29tcG9uZW50RVhUKQorI2RlZmluZSBnbEZlZWRiYWNrQnVmZmVyCQlNQU5HTEUoRmVlZGJhY2tCdWZmZXIpCisjZGVmaW5lIGdsRmVuY2VTeW5jCQlNQU5HTEUoRmVuY2VTeW5jKQorI2RlZmluZSBnbEZpbmFsQ29tYmluZXJJbnB1dE5WCQlNQU5HTEUoRmluYWxDb21iaW5lcklucHV0TlYpCisjZGVmaW5lIGdsRmluaXNoQXN5bmNTR0lYCQlNQU5HTEUoRmluaXNoQXN5bmNTR0lYKQorI2RlZmluZSBnbEZpbmlzaEZlbmNlQVBQTEUJCU1BTkdMRShGaW5pc2hGZW5jZUFQUExFKQorI2RlZmluZSBnbEZpbmlzaEZlbmNlTlYJCU1BTkdMRShGaW5pc2hGZW5jZU5WKQorI2RlZmluZSBnbEZpbmlzaAkJTUFOR0xFKEZpbmlzaCkKKyNkZWZpbmUgZ2xGaW5pc2hPYmplY3RBUFBMRQkJTUFOR0xFKEZpbmlzaE9iamVjdEFQUExFKQorI2RlZmluZSBnbEZpbmlzaFRleHR1cmVTVU5YCQlNQU5HTEUoRmluaXNoVGV4dHVyZVNVTlgpCisjZGVmaW5lIGdsRmx1c2gJCU1BTkdMRShGbHVzaCkKKyNkZWZpbmUgZ2xGbHVzaE1hcHBlZEJ1ZmZlclJhbmdlQVBQTEUJCU1BTkdMRShGbHVzaE1hcHBlZEJ1ZmZlclJhbmdlQVBQTEUpCisjZGVmaW5lIGdsRmx1c2hNYXBwZWRCdWZmZXJSYW5nZQkJTUFOR0xFKEZsdXNoTWFwcGVkQnVmZmVyUmFuZ2UpCisjZGVmaW5lIGdsRmx1c2hNYXBwZWROYW1lZEJ1ZmZlclJhbmdlRVhUCQlNQU5HTEUoRmx1c2hNYXBwZWROYW1lZEJ1ZmZlclJhbmdlRVhUKQorI2RlZmluZSBnbEZsdXNoUGl4ZWxEYXRhUmFuZ2VOVgkJTUFOR0xFKEZsdXNoUGl4ZWxEYXRhUmFuZ2VOVikKKyNkZWZpbmUgZ2xGbHVzaFJhc3RlclNHSVgJCU1BTkdMRShGbHVzaFJhc3RlclNHSVgpCisjZGVmaW5lIGdsRmx1c2hWZXJ0ZXhBcnJheVJhbmdlQVBQTEUJCU1BTkdMRShGbHVzaFZlcnRleEFycmF5UmFuZ2VBUFBMRSkKKyNkZWZpbmUgZ2xGbHVzaFZlcnRleEFycmF5UmFuZ2VOVgkJTUFOR0xFKEZsdXNoVmVydGV4QXJyYXlSYW5nZU5WKQorI2RlZmluZSBnbEZvZ0Nvb3JkZEVYVAkJTUFOR0xFKEZvZ0Nvb3JkZEVYVCkKKyNkZWZpbmUgZ2xGb2dDb29yZGQJCU1BTkdMRShGb2dDb29yZGQpCisjZGVmaW5lIGdsRm9nQ29vcmRkdkVYVAkJTUFOR0xFKEZvZ0Nvb3JkZHZFWFQpCisjZGVmaW5lIGdsRm9nQ29vcmRkdgkJTUFOR0xFKEZvZ0Nvb3JkZHYpCisjZGVmaW5lIGdsRm9nQ29vcmRmRVhUCQlNQU5HTEUoRm9nQ29vcmRmRVhUKQorI2RlZmluZSBnbEZvZ0Nvb3JkZgkJTUFOR0xFKEZvZ0Nvb3JkZikKKyNkZWZpbmUgZ2xGb2dDb29yZEZvcm1hdE5WCQlNQU5HTEUoRm9nQ29vcmRGb3JtYXROVikKKyNkZWZpbmUgZ2xGb2dDb29yZGZ2RVhUCQlNQU5HTEUoRm9nQ29vcmRmdkVYVCkKKyNkZWZpbmUgZ2xGb2dDb29yZGZ2CQlNQU5HTEUoRm9nQ29vcmRmdikKKyNkZWZpbmUgZ2xGb2dDb29yZGhOVgkJTUFOR0xFKEZvZ0Nvb3JkaE5WKQorI2RlZmluZSBnbEZvZ0Nvb3JkaHZOVgkJTUFOR0xFKEZvZ0Nvb3JkaHZOVikKKyNkZWZpbmUgZ2xGb2dDb29yZFBvaW50ZXJFWFQJCU1BTkdMRShGb2dDb29yZFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsRm9nQ29vcmRQb2ludGVyTGlzdElCTQkJTUFOR0xFKEZvZ0Nvb3JkUG9pbnRlckxpc3RJQk0pCisjZGVmaW5lIGdsRm9nQ29vcmRQb2ludGVyCQlNQU5HTEUoRm9nQ29vcmRQb2ludGVyKQorI2RlZmluZSBnbEZvZ2YJCU1BTkdMRShGb2dmKQorI2RlZmluZSBnbEZvZ0Z1bmNTR0lTCQlNQU5HTEUoRm9nRnVuY1NHSVMpCisjZGVmaW5lIGdsRm9nZnYJCU1BTkdMRShGb2dmdikKKyNkZWZpbmUgZ2xGb2dpCQlNQU5HTEUoRm9naSkKKyNkZWZpbmUgZ2xGb2dpdgkJTUFOR0xFKEZvZ2l2KQorI2RlZmluZSBnbEZyYWdtZW50Q29sb3JNYXRlcmlhbFNHSVgJCU1BTkdMRShGcmFnbWVudENvbG9yTWF0ZXJpYWxTR0lYKQorI2RlZmluZSBnbEZyYWdtZW50TGlnaHRmU0dJWAkJTUFOR0xFKEZyYWdtZW50TGlnaHRmU0dJWCkKKyNkZWZpbmUgZ2xGcmFnbWVudExpZ2h0ZnZTR0lYCQlNQU5HTEUoRnJhZ21lbnRMaWdodGZ2U0dJWCkKKyNkZWZpbmUgZ2xGcmFnbWVudExpZ2h0aVNHSVgJCU1BTkdMRShGcmFnbWVudExpZ2h0aVNHSVgpCisjZGVmaW5lIGdsRnJhZ21lbnRMaWdodGl2U0dJWAkJTUFOR0xFKEZyYWdtZW50TGlnaHRpdlNHSVgpCisjZGVmaW5lIGdsRnJhZ21lbnRMaWdodE1vZGVsZlNHSVgJCU1BTkdMRShGcmFnbWVudExpZ2h0TW9kZWxmU0dJWCkKKyNkZWZpbmUgZ2xGcmFnbWVudExpZ2h0TW9kZWxmdlNHSVgJCU1BTkdMRShGcmFnbWVudExpZ2h0TW9kZWxmdlNHSVgpCisjZGVmaW5lIGdsRnJhZ21lbnRMaWdodE1vZGVsaVNHSVgJCU1BTkdMRShGcmFnbWVudExpZ2h0TW9kZWxpU0dJWCkKKyNkZWZpbmUgZ2xGcmFnbWVudExpZ2h0TW9kZWxpdlNHSVgJCU1BTkdMRShGcmFnbWVudExpZ2h0TW9kZWxpdlNHSVgpCisjZGVmaW5lIGdsRnJhZ21lbnRNYXRlcmlhbGZTR0lYCQlNQU5HTEUoRnJhZ21lbnRNYXRlcmlhbGZTR0lYKQorI2RlZmluZSBnbEZyYWdtZW50TWF0ZXJpYWxmdlNHSVgJCU1BTkdMRShGcmFnbWVudE1hdGVyaWFsZnZTR0lYKQorI2RlZmluZSBnbEZyYWdtZW50TWF0ZXJpYWxpU0dJWAkJTUFOR0xFKEZyYWdtZW50TWF0ZXJpYWxpU0dJWCkKKyNkZWZpbmUgZ2xGcmFnbWVudE1hdGVyaWFsaXZTR0lYCQlNQU5HTEUoRnJhZ21lbnRNYXRlcmlhbGl2U0dJWCkKKyNkZWZpbmUgZ2xGcmFtZWJ1ZmZlckRyYXdCdWZmZXJFWFQJCU1BTkdMRShGcmFtZWJ1ZmZlckRyYXdCdWZmZXJFWFQpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJEcmF3QnVmZmVyc0VYVAkJTUFOR0xFKEZyYW1lYnVmZmVyRHJhd0J1ZmZlcnNFWFQpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJSZWFkQnVmZmVyRVhUCQlNQU5HTEUoRnJhbWVidWZmZXJSZWFkQnVmZmVyRVhUKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUCQlNQU5HTEUoRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIJCU1BTkdMRShGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcikKKyNkZWZpbmUgZ2xGcmFtZWJ1ZmZlclRleHR1cmUxREVYVAkJTUFOR0xFKEZyYW1lYnVmZmVyVGV4dHVyZTFERVhUKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyVGV4dHVyZTFECQlNQU5HTEUoRnJhbWVidWZmZXJUZXh0dXJlMUQpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRFWFQJCU1BTkdMRShGcmFtZWJ1ZmZlclRleHR1cmUyREVYVCkKKyNkZWZpbmUgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRAkJTUFOR0xFKEZyYW1lYnVmZmVyVGV4dHVyZTJEKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyVGV4dHVyZTNERVhUCQlNQU5HTEUoRnJhbWVidWZmZXJUZXh0dXJlM0RFWFQpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJUZXh0dXJlM0QJCU1BTkdMRShGcmFtZWJ1ZmZlclRleHR1cmUzRCkKKyNkZWZpbmUgZ2xGcmFtZWJ1ZmZlclRleHR1cmVBUkIJCU1BTkdMRShGcmFtZWJ1ZmZlclRleHR1cmVBUkIpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJUZXh0dXJlRVhUCQlNQU5HTEUoRnJhbWVidWZmZXJUZXh0dXJlRVhUKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyVGV4dHVyZUZhY2VBUkIJCU1BTkdMRShGcmFtZWJ1ZmZlclRleHR1cmVGYWNlQVJCKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyVGV4dHVyZUZhY2VFWFQJCU1BTkdMRShGcmFtZWJ1ZmZlclRleHR1cmVGYWNlRVhUKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyVGV4dHVyZUxheWVyQVJCCQlNQU5HTEUoRnJhbWVidWZmZXJUZXh0dXJlTGF5ZXJBUkIpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJUZXh0dXJlTGF5ZXJFWFQJCU1BTkdMRShGcmFtZWJ1ZmZlclRleHR1cmVMYXllckVYVCkKKyNkZWZpbmUgZ2xGcmFtZWJ1ZmZlclRleHR1cmVMYXllcgkJTUFOR0xFKEZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyVGV4dHVyZQkJTUFOR0xFKEZyYW1lYnVmZmVyVGV4dHVyZSkKKyNkZWZpbmUgZ2xGcmFtZVRlcm1pbmF0b3JHUkVNRURZCQlNQU5HTEUoRnJhbWVUZXJtaW5hdG9yR1JFTUVEWSkKKyNkZWZpbmUgZ2xGcmFtZVpvb21TR0lYCQlNQU5HTEUoRnJhbWVab29tU0dJWCkKKyNkZWZpbmUgZ2xGcmVlT2JqZWN0QnVmZmVyQVRJCQlNQU5HTEUoRnJlZU9iamVjdEJ1ZmZlckFUSSkKKyNkZWZpbmUgZ2xGcm9udEZhY2UJCU1BTkdMRShGcm9udEZhY2UpCisjZGVmaW5lIGdsRnJ1c3R1bQkJTUFOR0xFKEZydXN0dW0pCisjZGVmaW5lIGdsR2VuQXN5bmNNYXJrZXJzU0dJWAkJTUFOR0xFKEdlbkFzeW5jTWFya2Vyc1NHSVgpCisjZGVmaW5lIGdsR2VuQnVmZmVyc0FSQgkJTUFOR0xFKEdlbkJ1ZmZlcnNBUkIpCisjZGVmaW5lIGdsR2VuQnVmZmVycwkJTUFOR0xFKEdlbkJ1ZmZlcnMpCisjZGVmaW5lIGdsR2VuZXJhdGVNaXBtYXBFWFQJCU1BTkdMRShHZW5lcmF0ZU1pcG1hcEVYVCkKKyNkZWZpbmUgZ2xHZW5lcmF0ZU1pcG1hcAkJTUFOR0xFKEdlbmVyYXRlTWlwbWFwKQorI2RlZmluZSBnbEdlbmVyYXRlTXVsdGlUZXhNaXBtYXBFWFQJCU1BTkdMRShHZW5lcmF0ZU11bHRpVGV4TWlwbWFwRVhUKQorI2RlZmluZSBnbEdlbmVyYXRlVGV4dHVyZU1pcG1hcEVYVAkJTUFOR0xFKEdlbmVyYXRlVGV4dHVyZU1pcG1hcEVYVCkKKyNkZWZpbmUgZ2xHZW5GZW5jZXNBUFBMRQkJTUFOR0xFKEdlbkZlbmNlc0FQUExFKQorI2RlZmluZSBnbEdlbkZlbmNlc05WCQlNQU5HTEUoR2VuRmVuY2VzTlYpCisjZGVmaW5lIGdsR2VuRnJhZ21lbnRTaGFkZXJzQVRJCQlNQU5HTEUoR2VuRnJhZ21lbnRTaGFkZXJzQVRJKQorI2RlZmluZSBnbEdlbkZyYW1lYnVmZmVyc0VYVAkJTUFOR0xFKEdlbkZyYW1lYnVmZmVyc0VYVCkKKyNkZWZpbmUgZ2xHZW5GcmFtZWJ1ZmZlcnMJCU1BTkdMRShHZW5GcmFtZWJ1ZmZlcnMpCisjZGVmaW5lIGdsR2VuTGlzdHMJCU1BTkdMRShHZW5MaXN0cykKKyNkZWZpbmUgZ2xHZW5OYW1lc0FNRAkJTUFOR0xFKEdlbk5hbWVzQU1EKQorI2RlZmluZSBnbEdlbk9jY2x1c2lvblF1ZXJpZXNOVgkJTUFOR0xFKEdlbk9jY2x1c2lvblF1ZXJpZXNOVikKKyNkZWZpbmUgZ2xHZW5QZXJmTW9uaXRvcnNBTUQJCU1BTkdMRShHZW5QZXJmTW9uaXRvcnNBTUQpCisjZGVmaW5lIGdsR2VuUHJvZ3JhbVBpcGVsaW5lcwkJTUFOR0xFKEdlblByb2dyYW1QaXBlbGluZXMpCisjZGVmaW5lIGdsR2VuUHJvZ3JhbXNBUkIJCU1BTkdMRShHZW5Qcm9ncmFtc0FSQikKKyNkZWZpbmUgZ2xHZW5Qcm9ncmFtc05WCQlNQU5HTEUoR2VuUHJvZ3JhbXNOVikKKyNkZWZpbmUgZ2xHZW5RdWVyaWVzQVJCCQlNQU5HTEUoR2VuUXVlcmllc0FSQikKKyNkZWZpbmUgZ2xHZW5RdWVyaWVzCQlNQU5HTEUoR2VuUXVlcmllcykKKyNkZWZpbmUgZ2xHZW5SZW5kZXJidWZmZXJzRVhUCQlNQU5HTEUoR2VuUmVuZGVyYnVmZmVyc0VYVCkKKyNkZWZpbmUgZ2xHZW5SZW5kZXJidWZmZXJzCQlNQU5HTEUoR2VuUmVuZGVyYnVmZmVycykKKyNkZWZpbmUgZ2xHZW5TYW1wbGVycwkJTUFOR0xFKEdlblNhbXBsZXJzKQorI2RlZmluZSBnbEdlblN5bWJvbHNFWFQJCU1BTkdMRShHZW5TeW1ib2xzRVhUKQorI2RlZmluZSBnbEdlblRleHR1cmVzRVhUCQlNQU5HTEUoR2VuVGV4dHVyZXNFWFQpCisjZGVmaW5lIGdsR2VuVGV4dHVyZXMJCU1BTkdMRShHZW5UZXh0dXJlcykKKyNkZWZpbmUgZ2xHZW5UcmFuc2Zvcm1GZWVkYmFja3MJCU1BTkdMRShHZW5UcmFuc2Zvcm1GZWVkYmFja3MpCisjZGVmaW5lIGdsR2VuVHJhbnNmb3JtRmVlZGJhY2tzTlYJCU1BTkdMRShHZW5UcmFuc2Zvcm1GZWVkYmFja3NOVikKKyNkZWZpbmUgZ2xHZW5WZXJ0ZXhBcnJheXNBUFBMRQkJTUFOR0xFKEdlblZlcnRleEFycmF5c0FQUExFKQorI2RlZmluZSBnbEdlblZlcnRleEFycmF5cwkJTUFOR0xFKEdlblZlcnRleEFycmF5cykKKyNkZWZpbmUgZ2xHZW5WZXJ0ZXhTaGFkZXJzRVhUCQlNQU5HTEUoR2VuVmVydGV4U2hhZGVyc0VYVCkKKyNkZWZpbmUgZ2xHZXRBY3RpdmVBdHRyaWJBUkIJCU1BTkdMRShHZXRBY3RpdmVBdHRyaWJBUkIpCisjZGVmaW5lIGdsR2V0QWN0aXZlQXR0cmliCQlNQU5HTEUoR2V0QWN0aXZlQXR0cmliKQorI2RlZmluZSBnbEdldEFjdGl2ZVN1YnJvdXRpbmVOYW1lCQlNQU5HTEUoR2V0QWN0aXZlU3Vicm91dGluZU5hbWUpCisjZGVmaW5lIGdsR2V0QWN0aXZlU3Vicm91dGluZVVuaWZvcm1pdgkJTUFOR0xFKEdldEFjdGl2ZVN1YnJvdXRpbmVVbmlmb3JtaXYpCisjZGVmaW5lIGdsR2V0QWN0aXZlU3Vicm91dGluZVVuaWZvcm1OYW1lCQlNQU5HTEUoR2V0QWN0aXZlU3Vicm91dGluZVVuaWZvcm1OYW1lKQorI2RlZmluZSBnbEdldEFjdGl2ZVVuaWZvcm1BUkIJCU1BTkdMRShHZXRBY3RpdmVVbmlmb3JtQVJCKQorI2RlZmluZSBnbEdldEFjdGl2ZVVuaWZvcm1CbG9ja2l2CQlNQU5HTEUoR2V0QWN0aXZlVW5pZm9ybUJsb2NraXYpCisjZGVmaW5lIGdsR2V0QWN0aXZlVW5pZm9ybUJsb2NrTmFtZQkJTUFOR0xFKEdldEFjdGl2ZVVuaWZvcm1CbG9ja05hbWUpCisjZGVmaW5lIGdsR2V0QWN0aXZlVW5pZm9ybQkJTUFOR0xFKEdldEFjdGl2ZVVuaWZvcm0pCisjZGVmaW5lIGdsR2V0QWN0aXZlVW5pZm9ybU5hbWUJCU1BTkdMRShHZXRBY3RpdmVVbmlmb3JtTmFtZSkKKyNkZWZpbmUgZ2xHZXRBY3RpdmVVbmlmb3Jtc2l2CQlNQU5HTEUoR2V0QWN0aXZlVW5pZm9ybXNpdikKKyNkZWZpbmUgZ2xHZXRBY3RpdmVWYXJ5aW5nTlYJCU1BTkdMRShHZXRBY3RpdmVWYXJ5aW5nTlYpCisjZGVmaW5lIGdsR2V0QXJyYXlPYmplY3RmdkFUSQkJTUFOR0xFKEdldEFycmF5T2JqZWN0ZnZBVEkpCisjZGVmaW5lIGdsR2V0QXJyYXlPYmplY3RpdkFUSQkJTUFOR0xFKEdldEFycmF5T2JqZWN0aXZBVEkpCisjZGVmaW5lIGdsR2V0QXR0YWNoZWRPYmplY3RzQVJCCQlNQU5HTEUoR2V0QXR0YWNoZWRPYmplY3RzQVJCKQorI2RlZmluZSBnbEdldEF0dGFjaGVkU2hhZGVycwkJTUFOR0xFKEdldEF0dGFjaGVkU2hhZGVycykKKyNkZWZpbmUgZ2xHZXRBdHRyaWJMb2NhdGlvbkFSQgkJTUFOR0xFKEdldEF0dHJpYkxvY2F0aW9uQVJCKQorI2RlZmluZSBnbEdldEF0dHJpYkxvY2F0aW9uCQlNQU5HTEUoR2V0QXR0cmliTG9jYXRpb24pCisjZGVmaW5lIGdsR2V0Qm9vbGVhbkluZGV4ZWR2RVhUCQlNQU5HTEUoR2V0Qm9vbGVhbkluZGV4ZWR2RVhUKQorI2RlZmluZSBnbEdldEJvb2xlYW5pX3YJCU1BTkdMRShHZXRCb29sZWFuaV92KQorI2RlZmluZSBnbEdldEJvb2xlYW52CQlNQU5HTEUoR2V0Qm9vbGVhbnYpCisjZGVmaW5lIGdsR2V0QnVmZmVyUGFyYW1ldGVyaTY0dgkJTUFOR0xFKEdldEJ1ZmZlclBhcmFtZXRlcmk2NHYpCisjZGVmaW5lIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXZBUkIJCU1BTkdMRShHZXRCdWZmZXJQYXJhbWV0ZXJpdkFSQikKKyNkZWZpbmUgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdgkJTUFOR0xFKEdldEJ1ZmZlclBhcmFtZXRlcml2KQorI2RlZmluZSBnbEdldEJ1ZmZlclBhcmFtZXRlcnVpNjR2TlYJCU1BTkdMRShHZXRCdWZmZXJQYXJhbWV0ZXJ1aTY0dk5WKQorI2RlZmluZSBnbEdldEJ1ZmZlclBvaW50ZXJ2QVJCCQlNQU5HTEUoR2V0QnVmZmVyUG9pbnRlcnZBUkIpCisjZGVmaW5lIGdsR2V0QnVmZmVyUG9pbnRlcnYJCU1BTkdMRShHZXRCdWZmZXJQb2ludGVydikKKyNkZWZpbmUgZ2xHZXRCdWZmZXJTdWJEYXRhQVJCCQlNQU5HTEUoR2V0QnVmZmVyU3ViRGF0YUFSQikKKyNkZWZpbmUgZ2xHZXRCdWZmZXJTdWJEYXRhCQlNQU5HTEUoR2V0QnVmZmVyU3ViRGF0YSkKKyNkZWZpbmUgZ2xHZXRDbGlwUGxhbmUJCU1BTkdMRShHZXRDbGlwUGxhbmUpCisjZGVmaW5lIGdsR2V0Q29sb3JUYWJsZUVYVAkJTUFOR0xFKEdldENvbG9yVGFibGVFWFQpCisjZGVmaW5lIGdsR2V0Q29sb3JUYWJsZQkJTUFOR0xFKEdldENvbG9yVGFibGUpCisjZGVmaW5lIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJmdgkJTUFOR0xFKEdldENvbG9yVGFibGVQYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyZnZTR0kJCU1BTkdMRShHZXRDb2xvclRhYmxlUGFyYW1ldGVyZnZTR0kpCisjZGVmaW5lIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcml2RVhUCQlNQU5HTEUoR2V0Q29sb3JUYWJsZVBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJpdgkJTUFOR0xFKEdldENvbG9yVGFibGVQYXJhbWV0ZXJpdikKKyNkZWZpbmUgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXZTR0kJCU1BTkdMRShHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXZTR0kpCisjZGVmaW5lIGdsR2V0Q29sb3JUYWJsZVNHSQkJTUFOR0xFKEdldENvbG9yVGFibGVTR0kpCisjZGVmaW5lIGdsR2V0Q29tYmluZXJJbnB1dFBhcmFtZXRlcmZ2TlYJCU1BTkdMRShHZXRDb21iaW5lcklucHV0UGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xHZXRDb21iaW5lcklucHV0UGFyYW1ldGVyaXZOVgkJTUFOR0xFKEdldENvbWJpbmVySW5wdXRQYXJhbWV0ZXJpdk5WKQorI2RlZmluZSBnbEdldENvbWJpbmVyT3V0cHV0UGFyYW1ldGVyZnZOVgkJTUFOR0xFKEdldENvbWJpbmVyT3V0cHV0UGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xHZXRDb21iaW5lck91dHB1dFBhcmFtZXRlcml2TlYJCU1BTkdMRShHZXRDb21iaW5lck91dHB1dFBhcmFtZXRlcml2TlYpCisjZGVmaW5lIGdsR2V0Q29tYmluZXJTdGFnZVBhcmFtZXRlcmZ2TlYJCU1BTkdMRShHZXRDb21iaW5lclN0YWdlUGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xHZXRDb21wcmVzc2VkTXVsdGlUZXhJbWFnZUVYVAkJTUFOR0xFKEdldENvbXByZXNzZWRNdWx0aVRleEltYWdlRVhUKQorI2RlZmluZSBnbEdldENvbXByZXNzZWRUZXhJbWFnZUFSQgkJTUFOR0xFKEdldENvbXByZXNzZWRUZXhJbWFnZUFSQikKKyNkZWZpbmUgZ2xHZXRDb21wcmVzc2VkVGV4SW1hZ2UJCU1BTkdMRShHZXRDb21wcmVzc2VkVGV4SW1hZ2UpCisjZGVmaW5lIGdsR2V0Q29tcHJlc3NlZFRleHR1cmVJbWFnZUVYVAkJTUFOR0xFKEdldENvbXByZXNzZWRUZXh0dXJlSW1hZ2VFWFQpCisjZGVmaW5lIGdsR2V0Q29udm9sdXRpb25GaWx0ZXJFWFQJCU1BTkdMRShHZXRDb252b2x1dGlvbkZpbHRlckVYVCkKKyNkZWZpbmUgZ2xHZXRDb252b2x1dGlvbkZpbHRlcgkJTUFOR0xFKEdldENvbnZvbHV0aW9uRmlsdGVyKQorI2RlZmluZSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyZnZFWFQJCU1BTkdMRShHZXRDb252b2x1dGlvblBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyZnYJCU1BTkdMRShHZXRDb252b2x1dGlvblBhcmFtZXRlcmZ2KQorI2RlZmluZSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyaXZFWFQJCU1BTkdMRShHZXRDb252b2x1dGlvblBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyaXYJCU1BTkdMRShHZXRDb252b2x1dGlvblBhcmFtZXRlcml2KQorI2RlZmluZSBnbEdldERlYnVnTG9nTGVuZ3RoTUVTQQkJTUFOR0xFKEdldERlYnVnTG9nTGVuZ3RoTUVTQSkKKyNkZWZpbmUgZ2xHZXREZWJ1Z0xvZ01FU0EJCU1BTkdMRShHZXREZWJ1Z0xvZ01FU0EpCisjZGVmaW5lIGdsR2V0RGVidWdNZXNzYWdlTG9nQU1ECQlNQU5HTEUoR2V0RGVidWdNZXNzYWdlTG9nQU1EKQorI2RlZmluZSBnbEdldERlYnVnTWVzc2FnZUxvZ0FSQgkJTUFOR0xFKEdldERlYnVnTWVzc2FnZUxvZ0FSQikKKyNkZWZpbmUgZ2xHZXREZXRhaWxUZXhGdW5jU0dJUwkJTUFOR0xFKEdldERldGFpbFRleEZ1bmNTR0lTKQorI2RlZmluZSBnbEdldERvdWJsZUluZGV4ZWR2RVhUCQlNQU5HTEUoR2V0RG91YmxlSW5kZXhlZHZFWFQpCisjZGVmaW5lIGdsR2V0RG91YmxlaV92CQlNQU5HTEUoR2V0RG91YmxlaV92KQorI2RlZmluZSBnbEdldERvdWJsZXYJCU1BTkdMRShHZXREb3VibGV2KQorI2RlZmluZSBnbEdldEVycm9yCQlNQU5HTEUoR2V0RXJyb3IpCisjZGVmaW5lIGdsR2V0RmVuY2Vpdk5WCQlNQU5HTEUoR2V0RmVuY2Vpdk5WKQorI2RlZmluZSBnbEdldEZpbmFsQ29tYmluZXJJbnB1dFBhcmFtZXRlcmZ2TlYJCU1BTkdMRShHZXRGaW5hbENvbWJpbmVySW5wdXRQYXJhbWV0ZXJmdk5WKQorI2RlZmluZSBnbEdldEZpbmFsQ29tYmluZXJJbnB1dFBhcmFtZXRlcml2TlYJCU1BTkdMRShHZXRGaW5hbENvbWJpbmVySW5wdXRQYXJhbWV0ZXJpdk5WKQorI2RlZmluZSBnbEdldEZsb2F0SW5kZXhlZHZFWFQJCU1BTkdMRShHZXRGbG9hdEluZGV4ZWR2RVhUKQorI2RlZmluZSBnbEdldEZsb2F0aV92CQlNQU5HTEUoR2V0RmxvYXRpX3YpCisjZGVmaW5lIGdsR2V0RmxvYXR2CQlNQU5HTEUoR2V0RmxvYXR2KQorI2RlZmluZSBnbEdldEZvZ0Z1bmNTR0lTCQlNQU5HTEUoR2V0Rm9nRnVuY1NHSVMpCisjZGVmaW5lIGdsR2V0RnJhZ0RhdGFJbmRleAkJTUFOR0xFKEdldEZyYWdEYXRhSW5kZXgpCisjZGVmaW5lIGdsR2V0RnJhZ0RhdGFMb2NhdGlvbkVYVAkJTUFOR0xFKEdldEZyYWdEYXRhTG9jYXRpb25FWFQpCisjZGVmaW5lIGdsR2V0RnJhZ0RhdGFMb2NhdGlvbgkJTUFOR0xFKEdldEZyYWdEYXRhTG9jYXRpb24pCisjZGVmaW5lIGdsR2V0RnJhZ21lbnRMaWdodGZ2U0dJWAkJTUFOR0xFKEdldEZyYWdtZW50TGlnaHRmdlNHSVgpCisjZGVmaW5lIGdsR2V0RnJhZ21lbnRMaWdodGl2U0dJWAkJTUFOR0xFKEdldEZyYWdtZW50TGlnaHRpdlNHSVgpCisjZGVmaW5lIGdsR2V0RnJhZ21lbnRNYXRlcmlhbGZ2U0dJWAkJTUFOR0xFKEdldEZyYWdtZW50TWF0ZXJpYWxmdlNHSVgpCisjZGVmaW5lIGdsR2V0RnJhZ21lbnRNYXRlcmlhbGl2U0dJWAkJTUFOR0xFKEdldEZyYWdtZW50TWF0ZXJpYWxpdlNHSVgpCisjZGVmaW5lIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZFWFQJCU1BTkdMRShHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVYVCkKKyNkZWZpbmUgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdgkJTUFOR0xFKEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KQorI2RlZmluZSBnbEdldEZyYW1lYnVmZmVyUGFyYW1ldGVyaXZFWFQJCU1BTkdMRShHZXRGcmFtZWJ1ZmZlclBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNBUkIJCU1BTkdMRShHZXRHcmFwaGljc1Jlc2V0U3RhdHVzQVJCKQorI2RlZmluZSBnbEdldEhhbmRsZUFSQgkJTUFOR0xFKEdldEhhbmRsZUFSQikKKyNkZWZpbmUgZ2xHZXRIaXN0b2dyYW1FWFQJCU1BTkdMRShHZXRIaXN0b2dyYW1FWFQpCisjZGVmaW5lIGdsR2V0SGlzdG9ncmFtCQlNQU5HTEUoR2V0SGlzdG9ncmFtKQorI2RlZmluZSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoR2V0SGlzdG9ncmFtUGFyYW1ldGVyZnZFWFQpCisjZGVmaW5lIGdsR2V0SGlzdG9ncmFtUGFyYW1ldGVyZnYJCU1BTkdMRShHZXRIaXN0b2dyYW1QYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xHZXRIaXN0b2dyYW1QYXJhbWV0ZXJpdkVYVAkJTUFOR0xFKEdldEhpc3RvZ3JhbVBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcml2CQlNQU5HTEUoR2V0SGlzdG9ncmFtUGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsR2V0SW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJmdkhQCQlNQU5HTEUoR2V0SW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJmdkhQKQorI2RlZmluZSBnbEdldEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyaXZIUAkJTUFOR0xFKEdldEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyaXZIUCkKKyNkZWZpbmUgZ2xHZXRJbmZvTG9nQVJCCQlNQU5HTEUoR2V0SW5mb0xvZ0FSQikKKyNkZWZpbmUgZ2xHZXRJbnN0cnVtZW50c1NHSVgJCU1BTkdMRShHZXRJbnN0cnVtZW50c1NHSVgpCisjZGVmaW5lIGdsR2V0SW50ZWdlcjY0aV92CQlNQU5HTEUoR2V0SW50ZWdlcjY0aV92KQorI2RlZmluZSBnbEdldEludGVnZXI2NHYJCU1BTkdMRShHZXRJbnRlZ2VyNjR2KQorI2RlZmluZSBnbEdldEludGVnZXJJbmRleGVkdkVYVAkJTUFOR0xFKEdldEludGVnZXJJbmRleGVkdkVYVCkKKyNkZWZpbmUgZ2xHZXRJbnRlZ2VyaV92CQlNQU5HTEUoR2V0SW50ZWdlcmlfdikKKyNkZWZpbmUgZ2xHZXRJbnRlZ2VydWk2NGlfdk5WCQlNQU5HTEUoR2V0SW50ZWdlcnVpNjRpX3ZOVikKKyNkZWZpbmUgZ2xHZXRJbnRlZ2VydWk2NHZOVgkJTUFOR0xFKEdldEludGVnZXJ1aTY0dk5WKQorI2RlZmluZSBnbEdldEludGVnZXJ2CQlNQU5HTEUoR2V0SW50ZWdlcnYpCisjZGVmaW5lIGdsR2V0SW52YXJpYW50Qm9vbGVhbnZFWFQJCU1BTkdMRShHZXRJbnZhcmlhbnRCb29sZWFudkVYVCkKKyNkZWZpbmUgZ2xHZXRJbnZhcmlhbnRGbG9hdHZFWFQJCU1BTkdMRShHZXRJbnZhcmlhbnRGbG9hdHZFWFQpCisjZGVmaW5lIGdsR2V0SW52YXJpYW50SW50ZWdlcnZFWFQJCU1BTkdMRShHZXRJbnZhcmlhbnRJbnRlZ2VydkVYVCkKKyNkZWZpbmUgZ2xHZXRMaWdodGZ2CQlNQU5HTEUoR2V0TGlnaHRmdikKKyNkZWZpbmUgZ2xHZXRMaWdodGl2CQlNQU5HTEUoR2V0TGlnaHRpdikKKyNkZWZpbmUgZ2xHZXRMaXN0UGFyYW1ldGVyZnZTR0lYCQlNQU5HTEUoR2V0TGlzdFBhcmFtZXRlcmZ2U0dJWCkKKyNkZWZpbmUgZ2xHZXRMaXN0UGFyYW1ldGVyaXZTR0lYCQlNQU5HTEUoR2V0TGlzdFBhcmFtZXRlcml2U0dJWCkKKyNkZWZpbmUgZ2xHZXRMb2NhbENvbnN0YW50Qm9vbGVhbnZFWFQJCU1BTkdMRShHZXRMb2NhbENvbnN0YW50Qm9vbGVhbnZFWFQpCisjZGVmaW5lIGdsR2V0TG9jYWxDb25zdGFudEZsb2F0dkVYVAkJTUFOR0xFKEdldExvY2FsQ29uc3RhbnRGbG9hdHZFWFQpCisjZGVmaW5lIGdsR2V0TG9jYWxDb25zdGFudEludGVnZXJ2RVhUCQlNQU5HTEUoR2V0TG9jYWxDb25zdGFudEludGVnZXJ2RVhUKQorI2RlZmluZSBnbEdldE1hcEF0dHJpYlBhcmFtZXRlcmZ2TlYJCU1BTkdMRShHZXRNYXBBdHRyaWJQYXJhbWV0ZXJmdk5WKQorI2RlZmluZSBnbEdldE1hcEF0dHJpYlBhcmFtZXRlcml2TlYJCU1BTkdMRShHZXRNYXBBdHRyaWJQYXJhbWV0ZXJpdk5WKQorI2RlZmluZSBnbEdldE1hcENvbnRyb2xQb2ludHNOVgkJTUFOR0xFKEdldE1hcENvbnRyb2xQb2ludHNOVikKKyNkZWZpbmUgZ2xHZXRNYXBkdgkJTUFOR0xFKEdldE1hcGR2KQorI2RlZmluZSBnbEdldE1hcGZ2CQlNQU5HTEUoR2V0TWFwZnYpCisjZGVmaW5lIGdsR2V0TWFwaXYJCU1BTkdMRShHZXRNYXBpdikKKyNkZWZpbmUgZ2xHZXRNYXBQYXJhbWV0ZXJmdk5WCQlNQU5HTEUoR2V0TWFwUGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xHZXRNYXBQYXJhbWV0ZXJpdk5WCQlNQU5HTEUoR2V0TWFwUGFyYW1ldGVyaXZOVikKKyNkZWZpbmUgZ2xHZXRNYXRlcmlhbGZ2CQlNQU5HTEUoR2V0TWF0ZXJpYWxmdikKKyNkZWZpbmUgZ2xHZXRNYXRlcmlhbGl2CQlNQU5HTEUoR2V0TWF0ZXJpYWxpdikKKyNkZWZpbmUgZ2xHZXRNaW5tYXhFWFQJCU1BTkdMRShHZXRNaW5tYXhFWFQpCisjZGVmaW5lIGdsR2V0TWlubWF4CQlNQU5HTEUoR2V0TWlubWF4KQorI2RlZmluZSBnbEdldE1pbm1heFBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoR2V0TWlubWF4UGFyYW1ldGVyZnZFWFQpCisjZGVmaW5lIGdsR2V0TWlubWF4UGFyYW1ldGVyZnYJCU1BTkdMRShHZXRNaW5tYXhQYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xHZXRNaW5tYXhQYXJhbWV0ZXJpdkVYVAkJTUFOR0xFKEdldE1pbm1heFBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldE1pbm1heFBhcmFtZXRlcml2CQlNQU5HTEUoR2V0TWlubWF4UGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsR2V0TXVsdGlzYW1wbGVmdgkJTUFOR0xFKEdldE11bHRpc2FtcGxlZnYpCisjZGVmaW5lIGdsR2V0TXVsdGlzYW1wbGVmdk5WCQlNQU5HTEUoR2V0TXVsdGlzYW1wbGVmdk5WKQorI2RlZmluZSBnbEdldE11bHRpVGV4RW52ZnZFWFQJCU1BTkdMRShHZXRNdWx0aVRleEVudmZ2RVhUKQorI2RlZmluZSBnbEdldE11bHRpVGV4RW52aXZFWFQJCU1BTkdMRShHZXRNdWx0aVRleEVudml2RVhUKQorI2RlZmluZSBnbEdldE11bHRpVGV4R2VuZHZFWFQJCU1BTkdMRShHZXRNdWx0aVRleEdlbmR2RVhUKQorI2RlZmluZSBnbEdldE11bHRpVGV4R2VuZnZFWFQJCU1BTkdMRShHZXRNdWx0aVRleEdlbmZ2RVhUKQorI2RlZmluZSBnbEdldE11bHRpVGV4R2VuaXZFWFQJCU1BTkdMRShHZXRNdWx0aVRleEdlbml2RVhUKQorI2RlZmluZSBnbEdldE11bHRpVGV4SW1hZ2VFWFQJCU1BTkdMRShHZXRNdWx0aVRleEltYWdlRVhUKQorI2RlZmluZSBnbEdldE11bHRpVGV4TGV2ZWxQYXJhbWV0ZXJmdkVYVAkJTUFOR0xFKEdldE11bHRpVGV4TGV2ZWxQYXJhbWV0ZXJmdkVYVCkKKyNkZWZpbmUgZ2xHZXRNdWx0aVRleExldmVsUGFyYW1ldGVyaXZFWFQJCU1BTkdMRShHZXRNdWx0aVRleExldmVsUGFyYW1ldGVyaXZFWFQpCisjZGVmaW5lIGdsR2V0TXVsdGlUZXhQYXJhbWV0ZXJmdkVYVAkJTUFOR0xFKEdldE11bHRpVGV4UGFyYW1ldGVyZnZFWFQpCisjZGVmaW5lIGdsR2V0TXVsdGlUZXhQYXJhbWV0ZXJJaXZFWFQJCU1BTkdMRShHZXRNdWx0aVRleFBhcmFtZXRlcklpdkVYVCkKKyNkZWZpbmUgZ2xHZXRNdWx0aVRleFBhcmFtZXRlckl1aXZFWFQJCU1BTkdMRShHZXRNdWx0aVRleFBhcmFtZXRlckl1aXZFWFQpCisjZGVmaW5lIGdsR2V0TXVsdGlUZXhQYXJhbWV0ZXJpdkVYVAkJTUFOR0xFKEdldE11bHRpVGV4UGFyYW1ldGVyaXZFWFQpCisjZGVmaW5lIGdsR2V0TmFtZWRCdWZmZXJQYXJhbWV0ZXJpdkVYVAkJTUFOR0xFKEdldE5hbWVkQnVmZmVyUGFyYW1ldGVyaXZFWFQpCisjZGVmaW5lIGdsR2V0TmFtZWRCdWZmZXJQYXJhbWV0ZXJ1aTY0dk5WCQlNQU5HTEUoR2V0TmFtZWRCdWZmZXJQYXJhbWV0ZXJ1aTY0dk5WKQorI2RlZmluZSBnbEdldE5hbWVkQnVmZmVyUG9pbnRlcnZFWFQJCU1BTkdMRShHZXROYW1lZEJ1ZmZlclBvaW50ZXJ2RVhUKQorI2RlZmluZSBnbEdldE5hbWVkQnVmZmVyU3ViRGF0YUVYVAkJTUFOR0xFKEdldE5hbWVkQnVmZmVyU3ViRGF0YUVYVCkKKyNkZWZpbmUgZ2xHZXROYW1lZEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhUCQlNQU5HTEUoR2V0TmFtZWRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVYVCkKKyNkZWZpbmUgZ2xHZXROYW1lZFByb2dyYW1pdkVYVAkJTUFOR0xFKEdldE5hbWVkUHJvZ3JhbWl2RVhUKQorI2RlZmluZSBnbEdldE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyZHZFWFQJCU1BTkdMRShHZXROYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcmR2RVhUKQorI2RlZmluZSBnbEdldE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyZnZFWFQJCU1BTkdMRShHZXROYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbEdldE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVySWl2RVhUCQlNQU5HTEUoR2V0TmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJaXZFWFQpCisjZGVmaW5lIGdsR2V0TmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJdWl2RVhUCQlNQU5HTEUoR2V0TmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJdWl2RVhUKQorI2RlZmluZSBnbEdldE5hbWVkUHJvZ3JhbVN0cmluZ0VYVAkJTUFOR0xFKEdldE5hbWVkUHJvZ3JhbVN0cmluZ0VYVCkKKyNkZWZpbmUgZ2xHZXROYW1lZFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2RVhUCQlNQU5HTEUoR2V0TmFtZWRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVCkKKyNkZWZpbmUgZ2xHZXROYW1lZFN0cmluZ0FSQgkJTUFOR0xFKEdldE5hbWVkU3RyaW5nQVJCKQorI2RlZmluZSBnbEdldE5hbWVkU3RyaW5naXZBUkIJCU1BTkdMRShHZXROYW1lZFN0cmluZ2l2QVJCKQorI2RlZmluZSBnbEdldG5Db2xvclRhYmxlQVJCCQlNQU5HTEUoR2V0bkNvbG9yVGFibGVBUkIpCisjZGVmaW5lIGdsR2V0bkNvbXByZXNzZWRUZXhJbWFnZUFSQgkJTUFOR0xFKEdldG5Db21wcmVzc2VkVGV4SW1hZ2VBUkIpCisjZGVmaW5lIGdsR2V0bkNvbnZvbHV0aW9uRmlsdGVyQVJCCQlNQU5HTEUoR2V0bkNvbnZvbHV0aW9uRmlsdGVyQVJCKQorI2RlZmluZSBnbEdldG5IaXN0b2dyYW1BUkIJCU1BTkdMRShHZXRuSGlzdG9ncmFtQVJCKQorI2RlZmluZSBnbEdldG5NYXBkdkFSQgkJTUFOR0xFKEdldG5NYXBkdkFSQikKKyNkZWZpbmUgZ2xHZXRuTWFwZnZBUkIJCU1BTkdMRShHZXRuTWFwZnZBUkIpCisjZGVmaW5lIGdsR2V0bk1hcGl2QVJCCQlNQU5HTEUoR2V0bk1hcGl2QVJCKQorI2RlZmluZSBnbEdldG5NaW5tYXhBUkIJCU1BTkdMRShHZXRuTWlubWF4QVJCKQorI2RlZmluZSBnbEdldG5QaXhlbE1hcGZ2QVJCCQlNQU5HTEUoR2V0blBpeGVsTWFwZnZBUkIpCisjZGVmaW5lIGdsR2V0blBpeGVsTWFwdWl2QVJCCQlNQU5HTEUoR2V0blBpeGVsTWFwdWl2QVJCKQorI2RlZmluZSBnbEdldG5QaXhlbE1hcHVzdkFSQgkJTUFOR0xFKEdldG5QaXhlbE1hcHVzdkFSQikKKyNkZWZpbmUgZ2xHZXRuUG9seWdvblN0aXBwbGVBUkIJCU1BTkdMRShHZXRuUG9seWdvblN0aXBwbGVBUkIpCisjZGVmaW5lIGdsR2V0blNlcGFyYWJsZUZpbHRlckFSQgkJTUFOR0xFKEdldG5TZXBhcmFibGVGaWx0ZXJBUkIpCisjZGVmaW5lIGdsR2V0blRleEltYWdlQVJCCQlNQU5HTEUoR2V0blRleEltYWdlQVJCKQorI2RlZmluZSBnbEdldG5Vbmlmb3JtZHZBUkIJCU1BTkdMRShHZXRuVW5pZm9ybWR2QVJCKQorI2RlZmluZSBnbEdldG5Vbmlmb3JtZnZBUkIJCU1BTkdMRShHZXRuVW5pZm9ybWZ2QVJCKQorI2RlZmluZSBnbEdldG5Vbmlmb3JtaXZBUkIJCU1BTkdMRShHZXRuVW5pZm9ybWl2QVJCKQorI2RlZmluZSBnbEdldG5Vbmlmb3JtdWl2QVJCCQlNQU5HTEUoR2V0blVuaWZvcm11aXZBUkIpCisjZGVmaW5lIGdsR2V0T2JqZWN0QnVmZmVyZnZBVEkJCU1BTkdMRShHZXRPYmplY3RCdWZmZXJmdkFUSSkKKyNkZWZpbmUgZ2xHZXRPYmplY3RCdWZmZXJpdkFUSQkJTUFOR0xFKEdldE9iamVjdEJ1ZmZlcml2QVRJKQorI2RlZmluZSBnbEdldE9iamVjdFBhcmFtZXRlcmZ2QVJCCQlNQU5HTEUoR2V0T2JqZWN0UGFyYW1ldGVyZnZBUkIpCisjZGVmaW5lIGdsR2V0T2JqZWN0UGFyYW1ldGVyaXZBUFBMRQkJTUFOR0xFKEdldE9iamVjdFBhcmFtZXRlcml2QVBQTEUpCisjZGVmaW5lIGdsR2V0T2JqZWN0UGFyYW1ldGVyaXZBUkIJCU1BTkdMRShHZXRPYmplY3RQYXJhbWV0ZXJpdkFSQikKKyNkZWZpbmUgZ2xHZXRPY2NsdXNpb25RdWVyeWl2TlYJCU1BTkdMRShHZXRPY2NsdXNpb25RdWVyeWl2TlYpCisjZGVmaW5lIGdsR2V0T2NjbHVzaW9uUXVlcnl1aXZOVgkJTUFOR0xFKEdldE9jY2x1c2lvblF1ZXJ5dWl2TlYpCisjZGVmaW5lIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyRGF0YUFNRAkJTUFOR0xFKEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQpCisjZGVmaW5lIGdsR2V0UGVyZk1vbml0b3JDb3VudGVySW5mb0FNRAkJTUFOR0xFKEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQpCisjZGVmaW5lIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRAkJTUFOR0xFKEdldFBlcmZNb25pdG9yQ291bnRlcnNBTUQpCisjZGVmaW5lIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyU3RyaW5nQU1ECQlNQU5HTEUoR2V0UGVyZk1vbml0b3JDb3VudGVyU3RyaW5nQU1EKQorI2RlZmluZSBnbEdldFBlcmZNb25pdG9yR3JvdXBzQU1ECQlNQU5HTEUoR2V0UGVyZk1vbml0b3JHcm91cHNBTUQpCisjZGVmaW5lIGdsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRAkJTUFOR0xFKEdldFBlcmZNb25pdG9yR3JvdXBTdHJpbmdBTUQpCisjZGVmaW5lIGdsR2V0UGl4ZWxNYXBmdgkJTUFOR0xFKEdldFBpeGVsTWFwZnYpCisjZGVmaW5lIGdsR2V0UGl4ZWxNYXB1aXYJCU1BTkdMRShHZXRQaXhlbE1hcHVpdikKKyNkZWZpbmUgZ2xHZXRQaXhlbE1hcHVzdgkJTUFOR0xFKEdldFBpeGVsTWFwdXN2KQorI2RlZmluZSBnbEdldFBpeGVsVGV4R2VuUGFyYW1ldGVyZnZTR0lTCQlNQU5HTEUoR2V0UGl4ZWxUZXhHZW5QYXJhbWV0ZXJmdlNHSVMpCisjZGVmaW5lIGdsR2V0UGl4ZWxUZXhHZW5QYXJhbWV0ZXJpdlNHSVMJCU1BTkdMRShHZXRQaXhlbFRleEdlblBhcmFtZXRlcml2U0dJUykKKyNkZWZpbmUgZ2xHZXRQb2ludGVySW5kZXhlZHZFWFQJCU1BTkdMRShHZXRQb2ludGVySW5kZXhlZHZFWFQpCisjZGVmaW5lIGdsR2V0UG9pbnRlcnZFWFQJCU1BTkdMRShHZXRQb2ludGVydkVYVCkKKyNkZWZpbmUgZ2xHZXRQb2ludGVydgkJTUFOR0xFKEdldFBvaW50ZXJ2KQorI2RlZmluZSBnbEdldFBvbHlnb25TdGlwcGxlCQlNQU5HTEUoR2V0UG9seWdvblN0aXBwbGUpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbUJpbmFyeQkJTUFOR0xFKEdldFByb2dyYW1CaW5hcnkpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbUVudlBhcmFtZXRlcmR2QVJCCQlNQU5HTEUoR2V0UHJvZ3JhbUVudlBhcmFtZXRlcmR2QVJCKQorI2RlZmluZSBnbEdldFByb2dyYW1FbnZQYXJhbWV0ZXJmdkFSQgkJTUFOR0xFKEdldFByb2dyYW1FbnZQYXJhbWV0ZXJmdkFSQikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtRW52UGFyYW1ldGVySWl2TlYJCU1BTkdMRShHZXRQcm9ncmFtRW52UGFyYW1ldGVySWl2TlYpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbUVudlBhcmFtZXRlckl1aXZOVgkJTUFOR0xFKEdldFByb2dyYW1FbnZQYXJhbWV0ZXJJdWl2TlYpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbUluZm9Mb2cJCU1BTkdMRShHZXRQcm9ncmFtSW5mb0xvZykKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtaXZBUkIJCU1BTkdMRShHZXRQcm9ncmFtaXZBUkIpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbWl2CQlNQU5HTEUoR2V0UHJvZ3JhbWl2KQorI2RlZmluZSBnbEdldFByb2dyYW1pdk5WCQlNQU5HTEUoR2V0UHJvZ3JhbWl2TlYpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbUxvY2FsUGFyYW1ldGVyZHZBUkIJCU1BTkdMRShHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJkdkFSQikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJmdkFSQgkJTUFOR0xFKEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlcmZ2QVJCKQorI2RlZmluZSBnbEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlcklpdk5WCQlNQU5HTEUoR2V0UHJvZ3JhbUxvY2FsUGFyYW1ldGVySWl2TlYpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbUxvY2FsUGFyYW1ldGVySXVpdk5WCQlNQU5HTEUoR2V0UHJvZ3JhbUxvY2FsUGFyYW1ldGVySXVpdk5WKQorI2RlZmluZSBnbEdldFByb2dyYW1OYW1lZFBhcmFtZXRlcmR2TlYJCU1BTkdMRShHZXRQcm9ncmFtTmFtZWRQYXJhbWV0ZXJkdk5WKQorI2RlZmluZSBnbEdldFByb2dyYW1OYW1lZFBhcmFtZXRlcmZ2TlYJCU1BTkdMRShHZXRQcm9ncmFtTmFtZWRQYXJhbWV0ZXJmdk5WKQorI2RlZmluZSBnbEdldFByb2dyYW1QYXJhbWV0ZXJkdk5WCQlNQU5HTEUoR2V0UHJvZ3JhbVBhcmFtZXRlcmR2TlYpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbVBhcmFtZXRlcmZ2TlYJCU1BTkdMRShHZXRQcm9ncmFtUGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nCQlNQU5HTEUoR2V0UHJvZ3JhbVBpcGVsaW5lSW5mb0xvZykKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtUGlwZWxpbmVpdgkJTUFOR0xFKEdldFByb2dyYW1QaXBlbGluZWl2KQorI2RlZmluZSBnbEdldFByb2dyYW1SZWdpc3RlcmZ2TUVTQQkJTUFOR0xFKEdldFByb2dyYW1SZWdpc3RlcmZ2TUVTQSkKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtU3RhZ2VpdgkJTUFOR0xFKEdldFByb2dyYW1TdGFnZWl2KQorI2RlZmluZSBnbEdldFByb2dyYW1TdHJpbmdBUkIJCU1BTkdMRShHZXRQcm9ncmFtU3RyaW5nQVJCKQorI2RlZmluZSBnbEdldFByb2dyYW1TdHJpbmdOVgkJTUFOR0xFKEdldFByb2dyYW1TdHJpbmdOVikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtU3Vicm91dGluZVBhcmFtZXRlcnVpdk5WCQlNQU5HTEUoR2V0UHJvZ3JhbVN1YnJvdXRpbmVQYXJhbWV0ZXJ1aXZOVikKKyNkZWZpbmUgZ2xHZXRRdWVyeUluZGV4ZWRpdgkJTUFOR0xFKEdldFF1ZXJ5SW5kZXhlZGl2KQorI2RlZmluZSBnbEdldFF1ZXJ5aXZBUkIJCU1BTkdMRShHZXRRdWVyeWl2QVJCKQorI2RlZmluZSBnbEdldFF1ZXJ5aXYJCU1BTkdMRShHZXRRdWVyeWl2KQorI2RlZmluZSBnbEdldFF1ZXJ5T2JqZWN0aTY0dkVYVAkJTUFOR0xFKEdldFF1ZXJ5T2JqZWN0aTY0dkVYVCkKKyNkZWZpbmUgZ2xHZXRRdWVyeU9iamVjdGk2NHYJCU1BTkdMRShHZXRRdWVyeU9iamVjdGk2NHYpCisjZGVmaW5lIGdsR2V0UXVlcnlPYmplY3RpdkFSQgkJTUFOR0xFKEdldFF1ZXJ5T2JqZWN0aXZBUkIpCisjZGVmaW5lIGdsR2V0UXVlcnlPYmplY3RpdgkJTUFOR0xFKEdldFF1ZXJ5T2JqZWN0aXYpCisjZGVmaW5lIGdsR2V0UXVlcnlPYmplY3R1aTY0dkVYVAkJTUFOR0xFKEdldFF1ZXJ5T2JqZWN0dWk2NHZFWFQpCisjZGVmaW5lIGdsR2V0UXVlcnlPYmplY3R1aTY0dgkJTUFOR0xFKEdldFF1ZXJ5T2JqZWN0dWk2NHYpCisjZGVmaW5lIGdsR2V0UXVlcnlPYmplY3R1aXZBUkIJCU1BTkdMRShHZXRRdWVyeU9iamVjdHVpdkFSQikKKyNkZWZpbmUgZ2xHZXRRdWVyeU9iamVjdHVpdgkJTUFOR0xFKEdldFF1ZXJ5T2JqZWN0dWl2KQorI2RlZmluZSBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2RVhUCQlNQU5HTEUoR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZFWFQpCisjZGVmaW5lIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYJCU1BTkdMRShHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdikKKyNkZWZpbmUgZ2xHZXRTYW1wbGVyUGFyYW1ldGVyZnYJCU1BTkdMRShHZXRTYW1wbGVyUGFyYW1ldGVyZnYpCisjZGVmaW5lIGdsR2V0U2FtcGxlclBhcmFtZXRlcklpdgkJTUFOR0xFKEdldFNhbXBsZXJQYXJhbWV0ZXJJaXYpCisjZGVmaW5lIGdsR2V0U2FtcGxlclBhcmFtZXRlckl1aXYJCU1BTkdMRShHZXRTYW1wbGVyUGFyYW1ldGVySXVpdikKKyNkZWZpbmUgZ2xHZXRTYW1wbGVyUGFyYW1ldGVyaXYJCU1BTkdMRShHZXRTYW1wbGVyUGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsR2V0U2VwYXJhYmxlRmlsdGVyRVhUCQlNQU5HTEUoR2V0U2VwYXJhYmxlRmlsdGVyRVhUKQorI2RlZmluZSBnbEdldFNlcGFyYWJsZUZpbHRlcgkJTUFOR0xFKEdldFNlcGFyYWJsZUZpbHRlcikKKyNkZWZpbmUgZ2xHZXRTaGFkZXJJbmZvTG9nCQlNQU5HTEUoR2V0U2hhZGVySW5mb0xvZykKKyNkZWZpbmUgZ2xHZXRTaGFkZXJpdgkJTUFOR0xFKEdldFNoYWRlcml2KQorI2RlZmluZSBnbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdAkJTUFOR0xFKEdldFNoYWRlclByZWNpc2lvbkZvcm1hdCkKKyNkZWZpbmUgZ2xHZXRTaGFkZXJTb3VyY2VBUkIJCU1BTkdMRShHZXRTaGFkZXJTb3VyY2VBUkIpCisjZGVmaW5lIGdsR2V0U2hhZGVyU291cmNlCQlNQU5HTEUoR2V0U2hhZGVyU291cmNlKQorI2RlZmluZSBnbEdldFNoYXJwZW5UZXhGdW5jU0dJUwkJTUFOR0xFKEdldFNoYXJwZW5UZXhGdW5jU0dJUykKKyNkZWZpbmUgZ2xHZXRTdHJpbmdpCQlNQU5HTEUoR2V0U3RyaW5naSkKKyNkZWZpbmUgZ2xHZXRTdHJpbmcJCU1BTkdMRShHZXRTdHJpbmcpCisjZGVmaW5lIGdsR2V0U3Vicm91dGluZUluZGV4CQlNQU5HTEUoR2V0U3Vicm91dGluZUluZGV4KQorI2RlZmluZSBnbEdldFN1YnJvdXRpbmVVbmlmb3JtTG9jYXRpb24JCU1BTkdMRShHZXRTdWJyb3V0aW5lVW5pZm9ybUxvY2F0aW9uKQorI2RlZmluZSBnbEdldFN5bmNpdgkJTUFOR0xFKEdldFN5bmNpdikKKyNkZWZpbmUgZ2xHZXRUZXhCdW1wUGFyYW1ldGVyZnZBVEkJCU1BTkdMRShHZXRUZXhCdW1wUGFyYW1ldGVyZnZBVEkpCisjZGVmaW5lIGdsR2V0VGV4QnVtcFBhcmFtZXRlcml2QVRJCQlNQU5HTEUoR2V0VGV4QnVtcFBhcmFtZXRlcml2QVRJKQorI2RlZmluZSBnbEdldFRleEVudmZ2CQlNQU5HTEUoR2V0VGV4RW52ZnYpCisjZGVmaW5lIGdsR2V0VGV4RW52aXYJCU1BTkdMRShHZXRUZXhFbnZpdikKKyNkZWZpbmUgZ2xHZXRUZXhGaWx0ZXJGdW5jU0dJUwkJTUFOR0xFKEdldFRleEZpbHRlckZ1bmNTR0lTKQorI2RlZmluZSBnbEdldFRleEdlbmR2CQlNQU5HTEUoR2V0VGV4R2VuZHYpCisjZGVmaW5lIGdsR2V0VGV4R2VuZnYJCU1BTkdMRShHZXRUZXhHZW5mdikKKyNkZWZpbmUgZ2xHZXRUZXhHZW5pdgkJTUFOR0xFKEdldFRleEdlbml2KQorI2RlZmluZSBnbEdldFRleEltYWdlCQlNQU5HTEUoR2V0VGV4SW1hZ2UpCisjZGVmaW5lIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdgkJTUFOR0xFKEdldFRleExldmVsUGFyYW1ldGVyZnYpCisjZGVmaW5lIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdgkJTUFOR0xFKEdldFRleExldmVsUGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsR2V0VGV4UGFyYW1ldGVyZnYJCU1BTkdMRShHZXRUZXhQYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xHZXRUZXhQYXJhbWV0ZXJJaXZFWFQJCU1BTkdMRShHZXRUZXhQYXJhbWV0ZXJJaXZFWFQpCisjZGVmaW5lIGdsR2V0VGV4UGFyYW1ldGVySWl2CQlNQU5HTEUoR2V0VGV4UGFyYW1ldGVySWl2KQorI2RlZmluZSBnbEdldFRleFBhcmFtZXRlckl1aXZFWFQJCU1BTkdMRShHZXRUZXhQYXJhbWV0ZXJJdWl2RVhUKQorI2RlZmluZSBnbEdldFRleFBhcmFtZXRlckl1aXYJCU1BTkdMRShHZXRUZXhQYXJhbWV0ZXJJdWl2KQorI2RlZmluZSBnbEdldFRleFBhcmFtZXRlcml2CQlNQU5HTEUoR2V0VGV4UGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsR2V0VGV4UGFyYW1ldGVyUG9pbnRlcnZBUFBMRQkJTUFOR0xFKEdldFRleFBhcmFtZXRlclBvaW50ZXJ2QVBQTEUpCisjZGVmaW5lIGdsR2V0VGV4dHVyZUltYWdlRVhUCQlNQU5HTEUoR2V0VGV4dHVyZUltYWdlRVhUKQorI2RlZmluZSBnbEdldFRleHR1cmVMZXZlbFBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoR2V0VGV4dHVyZUxldmVsUGFyYW1ldGVyZnZFWFQpCisjZGVmaW5lIGdsR2V0VGV4dHVyZUxldmVsUGFyYW1ldGVyaXZFWFQJCU1BTkdMRShHZXRUZXh0dXJlTGV2ZWxQYXJhbWV0ZXJpdkVYVCkKKyNkZWZpbmUgZ2xHZXRUZXh0dXJlUGFyYW1ldGVyZnZFWFQJCU1BTkdMRShHZXRUZXh0dXJlUGFyYW1ldGVyZnZFWFQpCisjZGVmaW5lIGdsR2V0VGV4dHVyZVBhcmFtZXRlcklpdkVYVAkJTUFOR0xFKEdldFRleHR1cmVQYXJhbWV0ZXJJaXZFWFQpCisjZGVmaW5lIGdsR2V0VGV4dHVyZVBhcmFtZXRlckl1aXZFWFQJCU1BTkdMRShHZXRUZXh0dXJlUGFyYW1ldGVySXVpdkVYVCkKKyNkZWZpbmUgZ2xHZXRUZXh0dXJlUGFyYW1ldGVyaXZFWFQJCU1BTkdMRShHZXRUZXh0dXJlUGFyYW1ldGVyaXZFWFQpCisjZGVmaW5lIGdsR2V0VHJhY2tNYXRyaXhpdk5WCQlNQU5HTEUoR2V0VHJhY2tNYXRyaXhpdk5WKQorI2RlZmluZSBnbEdldFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ0VYVAkJTUFOR0xFKEdldFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ0VYVCkKKyNkZWZpbmUgZ2xHZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmcJCU1BTkdMRShHZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmcpCisjZGVmaW5lIGdsR2V0VHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nTlYJCU1BTkdMRShHZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdOVikKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtQmxvY2tJbmRleAkJTUFOR0xFKEdldFVuaWZvcm1CbG9ja0luZGV4KQorI2RlZmluZSBnbEdldFVuaWZvcm1CdWZmZXJTaXplRVhUCQlNQU5HTEUoR2V0VW5pZm9ybUJ1ZmZlclNpemVFWFQpCisjZGVmaW5lIGdsR2V0VW5pZm9ybWR2CQlNQU5HTEUoR2V0VW5pZm9ybWR2KQorI2RlZmluZSBnbEdldFVuaWZvcm1mdkFSQgkJTUFOR0xFKEdldFVuaWZvcm1mdkFSQikKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtZnYJCU1BTkdMRShHZXRVbmlmb3JtZnYpCisjZGVmaW5lIGdsR2V0VW5pZm9ybWk2NHZOVgkJTUFOR0xFKEdldFVuaWZvcm1pNjR2TlYpCisjZGVmaW5lIGdsR2V0VW5pZm9ybUluZGljZXMJCU1BTkdMRShHZXRVbmlmb3JtSW5kaWNlcykKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtaXZBUkIJCU1BTkdMRShHZXRVbmlmb3JtaXZBUkIpCisjZGVmaW5lIGdsR2V0VW5pZm9ybWl2CQlNQU5HTEUoR2V0VW5pZm9ybWl2KQorI2RlZmluZSBnbEdldFVuaWZvcm1Mb2NhdGlvbkFSQgkJTUFOR0xFKEdldFVuaWZvcm1Mb2NhdGlvbkFSQikKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtTG9jYXRpb24JCU1BTkdMRShHZXRVbmlmb3JtTG9jYXRpb24pCisjZGVmaW5lIGdsR2V0VW5pZm9ybU9mZnNldEVYVAkJTUFOR0xFKEdldFVuaWZvcm1PZmZzZXRFWFQpCisjZGVmaW5lIGdsR2V0VW5pZm9ybVN1YnJvdXRpbmV1aXYJCU1BTkdMRShHZXRVbmlmb3JtU3Vicm91dGluZXVpdikKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtdWk2NHZOVgkJTUFOR0xFKEdldFVuaWZvcm11aTY0dk5WKQorI2RlZmluZSBnbEdldFVuaWZvcm11aXZFWFQJCU1BTkdMRShHZXRVbmlmb3JtdWl2RVhUKQorI2RlZmluZSBnbEdldFVuaWZvcm11aXYJCU1BTkdMRShHZXRVbmlmb3JtdWl2KQorI2RlZmluZSBnbEdldFZhcmlhbnRBcnJheU9iamVjdGZ2QVRJCQlNQU5HTEUoR2V0VmFyaWFudEFycmF5T2JqZWN0ZnZBVEkpCisjZGVmaW5lIGdsR2V0VmFyaWFudEFycmF5T2JqZWN0aXZBVEkJCU1BTkdMRShHZXRWYXJpYW50QXJyYXlPYmplY3RpdkFUSSkKKyNkZWZpbmUgZ2xHZXRWYXJpYW50Qm9vbGVhbnZFWFQJCU1BTkdMRShHZXRWYXJpYW50Qm9vbGVhbnZFWFQpCisjZGVmaW5lIGdsR2V0VmFyaWFudEZsb2F0dkVYVAkJTUFOR0xFKEdldFZhcmlhbnRGbG9hdHZFWFQpCisjZGVmaW5lIGdsR2V0VmFyaWFudEludGVnZXJ2RVhUCQlNQU5HTEUoR2V0VmFyaWFudEludGVnZXJ2RVhUKQorI2RlZmluZSBnbEdldFZhcmlhbnRQb2ludGVydkVYVAkJTUFOR0xFKEdldFZhcmlhbnRQb2ludGVydkVYVCkKKyNkZWZpbmUgZ2xHZXRWYXJ5aW5nTG9jYXRpb25OVgkJTUFOR0xFKEdldFZhcnlpbmdMb2NhdGlvbk5WKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYkFycmF5T2JqZWN0ZnZBVEkJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdGZ2QVRJKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYkFycmF5T2JqZWN0aXZBVEkJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdGl2QVRJKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYmR2QVJCCQlNQU5HTEUoR2V0VmVydGV4QXR0cmliZHZBUkIpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliZHYJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJkdikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJkdk5WCQlNQU5HTEUoR2V0VmVydGV4QXR0cmliZHZOVikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJmdkFSQgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYmZ2QVJCKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYmZ2CQlNQU5HTEUoR2V0VmVydGV4QXR0cmliZnYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliZnZOVgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYmZ2TlYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliSWl2RVhUCQlNQU5HTEUoR2V0VmVydGV4QXR0cmliSWl2RVhUKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYklpdgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYklpdikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJJdWl2RVhUCQlNQU5HTEUoR2V0VmVydGV4QXR0cmliSXVpdkVYVCkKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJJdWl2CQlNQU5HTEUoR2V0VmVydGV4QXR0cmliSXVpdikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJpdkFSQgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYml2QVJCKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYml2CQlNQU5HTEUoR2V0VmVydGV4QXR0cmliaXYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliaXZOVgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYml2TlYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliTGR2RVhUCQlNQU5HTEUoR2V0VmVydGV4QXR0cmliTGR2RVhUKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYkxkdgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYkxkdikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJMaTY0dk5WCQlNQU5HTEUoR2V0VmVydGV4QXR0cmliTGk2NHZOVikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJMdWk2NHZOVgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYkx1aTY0dk5WKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2QVJCCQlNQU5HTEUoR2V0VmVydGV4QXR0cmliUG9pbnRlcnZBUkIpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydk5WCQlNQU5HTEUoR2V0VmVydGV4QXR0cmliUG9pbnRlcnZOVikKKyNkZWZpbmUgZ2xHZXRWaWRlb0NhcHR1cmVpdk5WCQlNQU5HTEUoR2V0VmlkZW9DYXB0dXJlaXZOVikKKyNkZWZpbmUgZ2xHZXRWaWRlb0NhcHR1cmVTdHJlYW1kdk5WCQlNQU5HTEUoR2V0VmlkZW9DYXB0dXJlU3RyZWFtZHZOVikKKyNkZWZpbmUgZ2xHZXRWaWRlb0NhcHR1cmVTdHJlYW1mdk5WCQlNQU5HTEUoR2V0VmlkZW9DYXB0dXJlU3RyZWFtZnZOVikKKyNkZWZpbmUgZ2xHZXRWaWRlb0NhcHR1cmVTdHJlYW1pdk5WCQlNQU5HTEUoR2V0VmlkZW9DYXB0dXJlU3RyZWFtaXZOVikKKyNkZWZpbmUgZ2xHZXRWaWRlb2k2NHZOVgkJTUFOR0xFKEdldFZpZGVvaTY0dk5WKQorI2RlZmluZSBnbEdldFZpZGVvaXZOVgkJTUFOR0xFKEdldFZpZGVvaXZOVikKKyNkZWZpbmUgZ2xHZXRWaWRlb3VpNjR2TlYJCU1BTkdMRShHZXRWaWRlb3VpNjR2TlYpCisjZGVmaW5lIGdsR2V0VmlkZW91aXZOVgkJTUFOR0xFKEdldFZpZGVvdWl2TlYpCisjZGVmaW5lIGdsR2xvYmFsQWxwaGFGYWN0b3JiU1VOCQlNQU5HTEUoR2xvYmFsQWxwaGFGYWN0b3JiU1VOKQorI2RlZmluZSBnbEdsb2JhbEFscGhhRmFjdG9yZFNVTgkJTUFOR0xFKEdsb2JhbEFscGhhRmFjdG9yZFNVTikKKyNkZWZpbmUgZ2xHbG9iYWxBbHBoYUZhY3RvcmZTVU4JCU1BTkdMRShHbG9iYWxBbHBoYUZhY3RvcmZTVU4pCisjZGVmaW5lIGdsR2xvYmFsQWxwaGFGYWN0b3JpU1VOCQlNQU5HTEUoR2xvYmFsQWxwaGFGYWN0b3JpU1VOKQorI2RlZmluZSBnbEdsb2JhbEFscGhhRmFjdG9yc1NVTgkJTUFOR0xFKEdsb2JhbEFscGhhRmFjdG9yc1NVTikKKyNkZWZpbmUgZ2xHbG9iYWxBbHBoYUZhY3RvcnViU1VOCQlNQU5HTEUoR2xvYmFsQWxwaGFGYWN0b3J1YlNVTikKKyNkZWZpbmUgZ2xHbG9iYWxBbHBoYUZhY3RvcnVpU1VOCQlNQU5HTEUoR2xvYmFsQWxwaGFGYWN0b3J1aVNVTikKKyNkZWZpbmUgZ2xHbG9iYWxBbHBoYUZhY3RvcnVzU1VOCQlNQU5HTEUoR2xvYmFsQWxwaGFGYWN0b3J1c1NVTikKKyNkZWZpbmUgZ2xIaW50CQlNQU5HTEUoSGludCkKKyNkZWZpbmUgZ2xIaW50UEdJCQlNQU5HTEUoSGludFBHSSkKKyNkZWZpbmUgZ2xIaXN0b2dyYW1FWFQJCU1BTkdMRShIaXN0b2dyYW1FWFQpCisjZGVmaW5lIGdsSGlzdG9ncmFtCQlNQU5HTEUoSGlzdG9ncmFtKQorI2RlZmluZSBnbElnbG9vSW50ZXJmYWNlU0dJWAkJTUFOR0xFKElnbG9vSW50ZXJmYWNlU0dJWCkKKyNkZWZpbmUgZ2xJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmZIUAkJTUFOR0xFKEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyZkhQKQorI2RlZmluZSBnbEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyZnZIUAkJTUFOR0xFKEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyZnZIUCkKKyNkZWZpbmUgZ2xJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmlIUAkJTUFOR0xFKEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyaUhQKQorI2RlZmluZSBnbEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyaXZIUAkJTUFOR0xFKEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyaXZIUCkKKyNkZWZpbmUgZ2xJbmRleGQJCU1BTkdMRShJbmRleGQpCisjZGVmaW5lIGdsSW5kZXhkdgkJTUFOR0xFKEluZGV4ZHYpCisjZGVmaW5lIGdsSW5kZXhmCQlNQU5HTEUoSW5kZXhmKQorI2RlZmluZSBnbEluZGV4Rm9ybWF0TlYJCU1BTkdMRShJbmRleEZvcm1hdE5WKQorI2RlZmluZSBnbEluZGV4RnVuY0VYVAkJTUFOR0xFKEluZGV4RnVuY0VYVCkKKyNkZWZpbmUgZ2xJbmRleGZ2CQlNQU5HTEUoSW5kZXhmdikKKyNkZWZpbmUgZ2xJbmRleGkJCU1BTkdMRShJbmRleGkpCisjZGVmaW5lIGdsSW5kZXhpdgkJTUFOR0xFKEluZGV4aXYpCisjZGVmaW5lIGdsSW5kZXhNYXNrCQlNQU5HTEUoSW5kZXhNYXNrKQorI2RlZmluZSBnbEluZGV4TWF0ZXJpYWxFWFQJCU1BTkdMRShJbmRleE1hdGVyaWFsRVhUKQorI2RlZmluZSBnbEluZGV4UG9pbnRlckVYVAkJTUFOR0xFKEluZGV4UG9pbnRlckVYVCkKKyNkZWZpbmUgZ2xJbmRleFBvaW50ZXJMaXN0SUJNCQlNQU5HTEUoSW5kZXhQb2ludGVyTGlzdElCTSkKKyNkZWZpbmUgZ2xJbmRleFBvaW50ZXIJCU1BTkdMRShJbmRleFBvaW50ZXIpCisjZGVmaW5lIGdsSW5kZXhzCQlNQU5HTEUoSW5kZXhzKQorI2RlZmluZSBnbEluZGV4c3YJCU1BTkdMRShJbmRleHN2KQorI2RlZmluZSBnbEluZGV4dWIJCU1BTkdMRShJbmRleHViKQorI2RlZmluZSBnbEluZGV4dWJ2CQlNQU5HTEUoSW5kZXh1YnYpCisjZGVmaW5lIGdsSW5pdE5hbWVzCQlNQU5HTEUoSW5pdE5hbWVzKQorI2RlZmluZSBnbEluc2VydENvbXBvbmVudEVYVAkJTUFOR0xFKEluc2VydENvbXBvbmVudEVYVCkKKyNkZWZpbmUgZ2xJbnN0cnVtZW50c0J1ZmZlclNHSVgJCU1BTkdMRShJbnN0cnVtZW50c0J1ZmZlclNHSVgpCisjZGVmaW5lIGdsSW50ZXJsZWF2ZWRBcnJheXMJCU1BTkdMRShJbnRlcmxlYXZlZEFycmF5cykKKyNkZWZpbmUgZ2xJc0FzeW5jTWFya2VyU0dJWAkJTUFOR0xFKElzQXN5bmNNYXJrZXJTR0lYKQorI2RlZmluZSBnbElzQnVmZmVyQVJCCQlNQU5HTEUoSXNCdWZmZXJBUkIpCisjZGVmaW5lIGdsSXNCdWZmZXIJCU1BTkdMRShJc0J1ZmZlcikKKyNkZWZpbmUgZ2xJc0J1ZmZlclJlc2lkZW50TlYJCU1BTkdMRShJc0J1ZmZlclJlc2lkZW50TlYpCisjZGVmaW5lIGdsSXNFbmFibGVkaQkJTUFOR0xFKElzRW5hYmxlZGkpCisjZGVmaW5lIGdsSXNFbmFibGVkSW5kZXhlZEVYVAkJTUFOR0xFKElzRW5hYmxlZEluZGV4ZWRFWFQpCisjZGVmaW5lIGdsSXNFbmFibGVkCQlNQU5HTEUoSXNFbmFibGVkKQorI2RlZmluZSBnbElzRmVuY2VBUFBMRQkJTUFOR0xFKElzRmVuY2VBUFBMRSkKKyNkZWZpbmUgZ2xJc0ZlbmNlTlYJCU1BTkdMRShJc0ZlbmNlTlYpCisjZGVmaW5lIGdsSXNGcmFtZWJ1ZmZlckVYVAkJTUFOR0xFKElzRnJhbWVidWZmZXJFWFQpCisjZGVmaW5lIGdsSXNGcmFtZWJ1ZmZlcgkJTUFOR0xFKElzRnJhbWVidWZmZXIpCisjZGVmaW5lIGdsSXNMaXN0CQlNQU5HTEUoSXNMaXN0KQorI2RlZmluZSBnbElzTmFtZUFNRAkJTUFOR0xFKElzTmFtZUFNRCkKKyNkZWZpbmUgZ2xJc05hbWVkQnVmZmVyUmVzaWRlbnROVgkJTUFOR0xFKElzTmFtZWRCdWZmZXJSZXNpZGVudE5WKQorI2RlZmluZSBnbElzTmFtZWRTdHJpbmdBUkIJCU1BTkdMRShJc05hbWVkU3RyaW5nQVJCKQorI2RlZmluZSBnbElzT2JqZWN0QnVmZmVyQVRJCQlNQU5HTEUoSXNPYmplY3RCdWZmZXJBVEkpCisjZGVmaW5lIGdsSXNPY2NsdXNpb25RdWVyeU5WCQlNQU5HTEUoSXNPY2NsdXNpb25RdWVyeU5WKQorI2RlZmluZSBnbElzUHJvZ3JhbUFSQgkJTUFOR0xFKElzUHJvZ3JhbUFSQikKKyNkZWZpbmUgZ2xJc1Byb2dyYW0JCU1BTkdMRShJc1Byb2dyYW0pCisjZGVmaW5lIGdsSXNQcm9ncmFtTlYJCU1BTkdMRShJc1Byb2dyYW1OVikKKyNkZWZpbmUgZ2xJc1Byb2dyYW1QaXBlbGluZQkJTUFOR0xFKElzUHJvZ3JhbVBpcGVsaW5lKQorI2RlZmluZSBnbElzUXVlcnlBUkIJCU1BTkdMRShJc1F1ZXJ5QVJCKQorI2RlZmluZSBnbElzUXVlcnkJCU1BTkdMRShJc1F1ZXJ5KQorI2RlZmluZSBnbElzUmVuZGVyYnVmZmVyRVhUCQlNQU5HTEUoSXNSZW5kZXJidWZmZXJFWFQpCisjZGVmaW5lIGdsSXNSZW5kZXJidWZmZXIJCU1BTkdMRShJc1JlbmRlcmJ1ZmZlcikKKyNkZWZpbmUgZ2xJc1NhbXBsZXIJCU1BTkdMRShJc1NhbXBsZXIpCisjZGVmaW5lIGdsSXNTaGFkZXIJCU1BTkdMRShJc1NoYWRlcikKKyNkZWZpbmUgZ2xJc1N5bmMJCU1BTkdMRShJc1N5bmMpCisjZGVmaW5lIGdsSXNUZXh0dXJlRVhUCQlNQU5HTEUoSXNUZXh0dXJlRVhUKQorI2RlZmluZSBnbElzVGV4dHVyZQkJTUFOR0xFKElzVGV4dHVyZSkKKyNkZWZpbmUgZ2xJc1RyYW5zZm9ybUZlZWRiYWNrCQlNQU5HTEUoSXNUcmFuc2Zvcm1GZWVkYmFjaykKKyNkZWZpbmUgZ2xJc1RyYW5zZm9ybUZlZWRiYWNrTlYJCU1BTkdMRShJc1RyYW5zZm9ybUZlZWRiYWNrTlYpCisjZGVmaW5lIGdsSXNWYXJpYW50RW5hYmxlZEVYVAkJTUFOR0xFKElzVmFyaWFudEVuYWJsZWRFWFQpCisjZGVmaW5lIGdsSXNWZXJ0ZXhBcnJheUFQUExFCQlNQU5HTEUoSXNWZXJ0ZXhBcnJheUFQUExFKQorI2RlZmluZSBnbElzVmVydGV4QXJyYXkJCU1BTkdMRShJc1ZlcnRleEFycmF5KQorI2RlZmluZSBnbElzVmVydGV4QXR0cmliRW5hYmxlZEFQUExFCQlNQU5HTEUoSXNWZXJ0ZXhBdHRyaWJFbmFibGVkQVBQTEUpCisjZGVmaW5lIGdsTGlnaHRFbnZpU0dJWAkJTUFOR0xFKExpZ2h0RW52aVNHSVgpCisjZGVmaW5lIGdsTGlnaHRmCQlNQU5HTEUoTGlnaHRmKQorI2RlZmluZSBnbExpZ2h0ZnYJCU1BTkdMRShMaWdodGZ2KQorI2RlZmluZSBnbExpZ2h0aQkJTUFOR0xFKExpZ2h0aSkKKyNkZWZpbmUgZ2xMaWdodGl2CQlNQU5HTEUoTGlnaHRpdikKKyNkZWZpbmUgZ2xMaWdodE1vZGVsZgkJTUFOR0xFKExpZ2h0TW9kZWxmKQorI2RlZmluZSBnbExpZ2h0TW9kZWxmdgkJTUFOR0xFKExpZ2h0TW9kZWxmdikKKyNkZWZpbmUgZ2xMaWdodE1vZGVsaQkJTUFOR0xFKExpZ2h0TW9kZWxpKQorI2RlZmluZSBnbExpZ2h0TW9kZWxpdgkJTUFOR0xFKExpZ2h0TW9kZWxpdikKKyNkZWZpbmUgZ2xMaW5lU3RpcHBsZQkJTUFOR0xFKExpbmVTdGlwcGxlKQorI2RlZmluZSBnbExpbmVXaWR0aAkJTUFOR0xFKExpbmVXaWR0aCkKKyNkZWZpbmUgZ2xMaW5rUHJvZ3JhbUFSQgkJTUFOR0xFKExpbmtQcm9ncmFtQVJCKQorI2RlZmluZSBnbExpbmtQcm9ncmFtCQlNQU5HTEUoTGlua1Byb2dyYW0pCisjZGVmaW5lIGdsTGlzdEJhc2UJCU1BTkdMRShMaXN0QmFzZSkKKyNkZWZpbmUgZ2xMaXN0UGFyYW1ldGVyZlNHSVgJCU1BTkdMRShMaXN0UGFyYW1ldGVyZlNHSVgpCisjZGVmaW5lIGdsTGlzdFBhcmFtZXRlcmZ2U0dJWAkJTUFOR0xFKExpc3RQYXJhbWV0ZXJmdlNHSVgpCisjZGVmaW5lIGdsTGlzdFBhcmFtZXRlcmlTR0lYCQlNQU5HTEUoTGlzdFBhcmFtZXRlcmlTR0lYKQorI2RlZmluZSBnbExpc3RQYXJhbWV0ZXJpdlNHSVgJCU1BTkdMRShMaXN0UGFyYW1ldGVyaXZTR0lYKQorI2RlZmluZSBnbExvYWRJZGVudGl0eURlZm9ybWF0aW9uTWFwU0dJWAkJTUFOR0xFKExvYWRJZGVudGl0eURlZm9ybWF0aW9uTWFwU0dJWCkKKyNkZWZpbmUgZ2xMb2FkSWRlbnRpdHkJCU1BTkdMRShMb2FkSWRlbnRpdHkpCisjZGVmaW5lIGdsTG9hZE1hdHJpeGQJCU1BTkdMRShMb2FkTWF0cml4ZCkKKyNkZWZpbmUgZ2xMb2FkTWF0cml4ZgkJTUFOR0xFKExvYWRNYXRyaXhmKQorI2RlZmluZSBnbExvYWROYW1lCQlNQU5HTEUoTG9hZE5hbWUpCisjZGVmaW5lIGdsTG9hZFByb2dyYW1OVgkJTUFOR0xFKExvYWRQcm9ncmFtTlYpCisjZGVmaW5lIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGRBUkIJCU1BTkdMRShMb2FkVHJhbnNwb3NlTWF0cml4ZEFSQikKKyNkZWZpbmUgZ2xMb2FkVHJhbnNwb3NlTWF0cml4ZAkJTUFOR0xFKExvYWRUcmFuc3Bvc2VNYXRyaXhkKQorI2RlZmluZSBnbExvYWRUcmFuc3Bvc2VNYXRyaXhmQVJCCQlNQU5HTEUoTG9hZFRyYW5zcG9zZU1hdHJpeGZBUkIpCisjZGVmaW5lIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGYJCU1BTkdMRShMb2FkVHJhbnNwb3NlTWF0cml4ZikKKyNkZWZpbmUgZ2xMb2NrQXJyYXlzRVhUCQlNQU5HTEUoTG9ja0FycmF5c0VYVCkKKyNkZWZpbmUgZ2xMb2dpY09wCQlNQU5HTEUoTG9naWNPcCkKKyNkZWZpbmUgZ2xNYWtlQnVmZmVyTm9uUmVzaWRlbnROVgkJTUFOR0xFKE1ha2VCdWZmZXJOb25SZXNpZGVudE5WKQorI2RlZmluZSBnbE1ha2VCdWZmZXJSZXNpZGVudE5WCQlNQU5HTEUoTWFrZUJ1ZmZlclJlc2lkZW50TlYpCisjZGVmaW5lIGdsTWFrZU5hbWVkQnVmZmVyTm9uUmVzaWRlbnROVgkJTUFOR0xFKE1ha2VOYW1lZEJ1ZmZlck5vblJlc2lkZW50TlYpCisjZGVmaW5lIGdsTWFrZU5hbWVkQnVmZmVyUmVzaWRlbnROVgkJTUFOR0xFKE1ha2VOYW1lZEJ1ZmZlclJlc2lkZW50TlYpCisjZGVmaW5lIGdsTWFwMWQJCU1BTkdMRShNYXAxZCkKKyNkZWZpbmUgZ2xNYXAxZgkJTUFOR0xFKE1hcDFmKQorI2RlZmluZSBnbE1hcDJkCQlNQU5HTEUoTWFwMmQpCisjZGVmaW5lIGdsTWFwMmYJCU1BTkdMRShNYXAyZikKKyNkZWZpbmUgZ2xNYXBCdWZmZXJBUkIJCU1BTkdMRShNYXBCdWZmZXJBUkIpCisjZGVmaW5lIGdsTWFwQnVmZmVyCQlNQU5HTEUoTWFwQnVmZmVyKQorI2RlZmluZSBnbE1hcEJ1ZmZlclJhbmdlCQlNQU5HTEUoTWFwQnVmZmVyUmFuZ2UpCisjZGVmaW5lIGdsTWFwQ29udHJvbFBvaW50c05WCQlNQU5HTEUoTWFwQ29udHJvbFBvaW50c05WKQorI2RlZmluZSBnbE1hcEdyaWQxZAkJTUFOR0xFKE1hcEdyaWQxZCkKKyNkZWZpbmUgZ2xNYXBHcmlkMWYJCU1BTkdMRShNYXBHcmlkMWYpCisjZGVmaW5lIGdsTWFwR3JpZDJkCQlNQU5HTEUoTWFwR3JpZDJkKQorI2RlZmluZSBnbE1hcEdyaWQyZgkJTUFOR0xFKE1hcEdyaWQyZikKKyNkZWZpbmUgZ2xNYXBOYW1lZEJ1ZmZlckVYVAkJTUFOR0xFKE1hcE5hbWVkQnVmZmVyRVhUKQorI2RlZmluZSBnbE1hcE5hbWVkQnVmZmVyUmFuZ2VFWFQJCU1BTkdMRShNYXBOYW1lZEJ1ZmZlclJhbmdlRVhUKQorI2RlZmluZSBnbE1hcE9iamVjdEJ1ZmZlckFUSQkJTUFOR0xFKE1hcE9iamVjdEJ1ZmZlckFUSSkKKyNkZWZpbmUgZ2xNYXBQYXJhbWV0ZXJmdk5WCQlNQU5HTEUoTWFwUGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xNYXBQYXJhbWV0ZXJpdk5WCQlNQU5HTEUoTWFwUGFyYW1ldGVyaXZOVikKKyNkZWZpbmUgZ2xNYXBWZXJ0ZXhBdHRyaWIxZEFQUExFCQlNQU5HTEUoTWFwVmVydGV4QXR0cmliMWRBUFBMRSkKKyNkZWZpbmUgZ2xNYXBWZXJ0ZXhBdHRyaWIxZkFQUExFCQlNQU5HTEUoTWFwVmVydGV4QXR0cmliMWZBUFBMRSkKKyNkZWZpbmUgZ2xNYXBWZXJ0ZXhBdHRyaWIyZEFQUExFCQlNQU5HTEUoTWFwVmVydGV4QXR0cmliMmRBUFBMRSkKKyNkZWZpbmUgZ2xNYXBWZXJ0ZXhBdHRyaWIyZkFQUExFCQlNQU5HTEUoTWFwVmVydGV4QXR0cmliMmZBUFBMRSkKKyNkZWZpbmUgZ2xNYXRlcmlhbGYJCU1BTkdMRShNYXRlcmlhbGYpCisjZGVmaW5lIGdsTWF0ZXJpYWxmdgkJTUFOR0xFKE1hdGVyaWFsZnYpCisjZGVmaW5lIGdsTWF0ZXJpYWxpCQlNQU5HTEUoTWF0ZXJpYWxpKQorI2RlZmluZSBnbE1hdGVyaWFsaXYJCU1BTkdMRShNYXRlcmlhbGl2KQorI2RlZmluZSBnbE1hdHJpeEZydXN0dW1FWFQJCU1BTkdMRShNYXRyaXhGcnVzdHVtRVhUKQorI2RlZmluZSBnbE1hdHJpeEluZGV4UG9pbnRlckFSQgkJTUFOR0xFKE1hdHJpeEluZGV4UG9pbnRlckFSQikKKyNkZWZpbmUgZ2xNYXRyaXhJbmRleHVidkFSQgkJTUFOR0xFKE1hdHJpeEluZGV4dWJ2QVJCKQorI2RlZmluZSBnbE1hdHJpeEluZGV4dWl2QVJCCQlNQU5HTEUoTWF0cml4SW5kZXh1aXZBUkIpCisjZGVmaW5lIGdsTWF0cml4SW5kZXh1c3ZBUkIJCU1BTkdMRShNYXRyaXhJbmRleHVzdkFSQikKKyNkZWZpbmUgZ2xNYXRyaXhMb2FkZEVYVAkJTUFOR0xFKE1hdHJpeExvYWRkRVhUKQorI2RlZmluZSBnbE1hdHJpeExvYWRmRVhUCQlNQU5HTEUoTWF0cml4TG9hZGZFWFQpCisjZGVmaW5lIGdsTWF0cml4TG9hZElkZW50aXR5RVhUCQlNQU5HTEUoTWF0cml4TG9hZElkZW50aXR5RVhUKQorI2RlZmluZSBnbE1hdHJpeExvYWRUcmFuc3Bvc2VkRVhUCQlNQU5HTEUoTWF0cml4TG9hZFRyYW5zcG9zZWRFWFQpCisjZGVmaW5lIGdsTWF0cml4TG9hZFRyYW5zcG9zZWZFWFQJCU1BTkdMRShNYXRyaXhMb2FkVHJhbnNwb3NlZkVYVCkKKyNkZWZpbmUgZ2xNYXRyaXhNb2RlCQlNQU5HTEUoTWF0cml4TW9kZSkKKyNkZWZpbmUgZ2xNYXRyaXhNdWx0ZEVYVAkJTUFOR0xFKE1hdHJpeE11bHRkRVhUKQorI2RlZmluZSBnbE1hdHJpeE11bHRmRVhUCQlNQU5HTEUoTWF0cml4TXVsdGZFWFQpCisjZGVmaW5lIGdsTWF0cml4TXVsdFRyYW5zcG9zZWRFWFQJCU1BTkdMRShNYXRyaXhNdWx0VHJhbnNwb3NlZEVYVCkKKyNkZWZpbmUgZ2xNYXRyaXhNdWx0VHJhbnNwb3NlZkVYVAkJTUFOR0xFKE1hdHJpeE11bHRUcmFuc3Bvc2VmRVhUKQorI2RlZmluZSBnbE1hdHJpeE9ydGhvRVhUCQlNQU5HTEUoTWF0cml4T3J0aG9FWFQpCisjZGVmaW5lIGdsTWF0cml4UG9wRVhUCQlNQU5HTEUoTWF0cml4UG9wRVhUKQorI2RlZmluZSBnbE1hdHJpeFB1c2hFWFQJCU1BTkdMRShNYXRyaXhQdXNoRVhUKQorI2RlZmluZSBnbE1hdHJpeFJvdGF0ZWRFWFQJCU1BTkdMRShNYXRyaXhSb3RhdGVkRVhUKQorI2RlZmluZSBnbE1hdHJpeFJvdGF0ZWZFWFQJCU1BTkdMRShNYXRyaXhSb3RhdGVmRVhUKQorI2RlZmluZSBnbE1hdHJpeFNjYWxlZEVYVAkJTUFOR0xFKE1hdHJpeFNjYWxlZEVYVCkKKyNkZWZpbmUgZ2xNYXRyaXhTY2FsZWZFWFQJCU1BTkdMRShNYXRyaXhTY2FsZWZFWFQpCisjZGVmaW5lIGdsTWF0cml4VHJhbnNsYXRlZEVYVAkJTUFOR0xFKE1hdHJpeFRyYW5zbGF0ZWRFWFQpCisjZGVmaW5lIGdsTWF0cml4VHJhbnNsYXRlZkVYVAkJTUFOR0xFKE1hdHJpeFRyYW5zbGF0ZWZFWFQpCisjZGVmaW5lIGdsTWVtb3J5QmFycmllckVYVAkJTUFOR0xFKE1lbW9yeUJhcnJpZXJFWFQpCisjZGVmaW5lIGdsTWlubWF4RVhUCQlNQU5HTEUoTWlubWF4RVhUKQorI2RlZmluZSBnbE1pbm1heAkJTUFOR0xFKE1pbm1heCkKKyNkZWZpbmUgZ2xNaW5TYW1wbGVTaGFkaW5nQVJCCQlNQU5HTEUoTWluU2FtcGxlU2hhZGluZ0FSQikKKyNkZWZpbmUgZ2xNaW5TYW1wbGVTaGFkaW5nCQlNQU5HTEUoTWluU2FtcGxlU2hhZGluZykKKyNkZWZpbmUgZ2xNdWx0aURyYXdBcnJheXNFWFQJCU1BTkdMRShNdWx0aURyYXdBcnJheXNFWFQpCisjZGVmaW5lIGdsTXVsdGlEcmF3QXJyYXlzCQlNQU5HTEUoTXVsdGlEcmF3QXJyYXlzKQorI2RlZmluZSBnbE11bHRpRHJhd0VsZW1lbnRBcnJheUFQUExFCQlNQU5HTEUoTXVsdGlEcmF3RWxlbWVudEFycmF5QVBQTEUpCisjZGVmaW5lIGdsTXVsdGlEcmF3RWxlbWVudHNCYXNlVmVydGV4CQlNQU5HTEUoTXVsdGlEcmF3RWxlbWVudHNCYXNlVmVydGV4KQorI2RlZmluZSBnbE11bHRpRHJhd0VsZW1lbnRzRVhUCQlNQU5HTEUoTXVsdGlEcmF3RWxlbWVudHNFWFQpCisjZGVmaW5lIGdsTXVsdGlEcmF3RWxlbWVudHMJCU1BTkdMRShNdWx0aURyYXdFbGVtZW50cykKKyNkZWZpbmUgZ2xNdWx0aURyYXdSYW5nZUVsZW1lbnRBcnJheUFQUExFCQlNQU5HTEUoTXVsdGlEcmF3UmFuZ2VFbGVtZW50QXJyYXlBUFBMRSkKKyNkZWZpbmUgZ2xNdWx0aU1vZGVEcmF3QXJyYXlzSUJNCQlNQU5HTEUoTXVsdGlNb2RlRHJhd0FycmF5c0lCTSkKKyNkZWZpbmUgZ2xNdWx0aU1vZGVEcmF3RWxlbWVudHNJQk0JCU1BTkdMRShNdWx0aU1vZGVEcmF3RWxlbWVudHNJQk0pCisjZGVmaW5lIGdsTXVsdGlUZXhCdWZmZXJFWFQJCU1BTkdMRShNdWx0aVRleEJ1ZmZlckVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWRBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMWRBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFkCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFkKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxZHZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMWR2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxZHYJCU1BTkdMRShNdWx0aVRleENvb3JkMWR2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxZkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQxZkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWYJCU1BTkdMRShNdWx0aVRleENvb3JkMWYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFmdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQxZnZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFmdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQxZnYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFoTlYJCU1BTkdMRShNdWx0aVRleENvb3JkMWhOVikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWh2TlYJCU1BTkdMRShNdWx0aVRleENvb3JkMWh2TlYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFpQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFpQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxaQkJTUFOR0xFKE11bHRpVGV4Q29vcmQxaSkKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWl2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFpdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWl2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDFpdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMXNBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMXNBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFzCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFzKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxc3ZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMXN2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxc3YJCU1BTkdMRShNdWx0aVRleENvb3JkMXN2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyZEFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyZEFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMmQJCU1BTkdMRShNdWx0aVRleENvb3JkMmQpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJkdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyZHZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJkdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyZHYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJmQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDJmQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyZgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyZikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMmZ2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDJmdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMmZ2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDJmdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMmhOVgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyaE5WKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyaHZOVgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyaHZOVikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMmlBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMmlBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJpCQlNQU5HTEUoTXVsdGlUZXhDb29yZDJpKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyaXZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMml2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyaXYJCU1BTkdMRShNdWx0aVRleENvb3JkMml2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyc0FSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyc0FSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMnMJCU1BTkdMRShNdWx0aVRleENvb3JkMnMpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJzdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyc3ZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJzdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyc3YpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNkQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNkQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzZAkJTUFOR0xFKE11bHRpVGV4Q29vcmQzZCkKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM2R2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNkdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM2R2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDNkdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM2ZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkM2ZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNmCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNmKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzZnZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkM2Z2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzZnYJCU1BTkdMRShNdWx0aVRleENvb3JkM2Z2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzaE5WCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNoTlYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNodk5WCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNodk5WKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzaUFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzaUFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM2kJCU1BTkdMRShNdWx0aVRleENvb3JkM2kpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNpdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzaXZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNpdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzaXYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNzQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNzQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzcwkJTUFOR0xFKE11bHRpVGV4Q29vcmQzcykKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM3N2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNzdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM3N2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDNzdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGRBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkNGRBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRkCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRkKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0ZHZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkNGR2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0ZHYJCU1BTkdMRShNdWx0aVRleENvb3JkNGR2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0ZkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQ0ZkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGYJCU1BTkdMRShNdWx0aVRleENvb3JkNGYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRmdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQ0ZnZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRmdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQ0ZnYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRoTlYJCU1BTkdMRShNdWx0aVRleENvb3JkNGhOVikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGh2TlYJCU1BTkdMRShNdWx0aVRleENvb3JkNGh2TlYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRpQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRpQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0aQkJTUFOR0xFKE11bHRpVGV4Q29vcmQ0aSkKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGl2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRpdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGl2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDRpdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNHNBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkNHNBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRzCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRzKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0c3ZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkNHN2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0c3YJCU1BTkdMRShNdWx0aVRleENvb3JkNHN2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmRQMXVpCQlNQU5HTEUoTXVsdGlUZXhDb29yZFAxdWkpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZFAxdWl2CQlNQU5HTEUoTXVsdGlUZXhDb29yZFAxdWl2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmRQMnVpCQlNQU5HTEUoTXVsdGlUZXhDb29yZFAydWkpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZFAydWl2CQlNQU5HTEUoTXVsdGlUZXhDb29yZFAydWl2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmRQM3VpCQlNQU5HTEUoTXVsdGlUZXhDb29yZFAzdWkpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZFAzdWl2CQlNQU5HTEUoTXVsdGlUZXhDb29yZFAzdWl2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmRQNHVpCQlNQU5HTEUoTXVsdGlUZXhDb29yZFA0dWkpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZFA0dWl2CQlNQU5HTEUoTXVsdGlUZXhDb29yZFA0dWl2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmRQb2ludGVyRVhUCQlNQU5HTEUoTXVsdGlUZXhDb29yZFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhFbnZmRVhUCQlNQU5HTEUoTXVsdGlUZXhFbnZmRVhUKQorI2RlZmluZSBnbE11bHRpVGV4RW52ZnZFWFQJCU1BTkdMRShNdWx0aVRleEVudmZ2RVhUKQorI2RlZmluZSBnbE11bHRpVGV4RW52aUVYVAkJTUFOR0xFKE11bHRpVGV4RW52aUVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleEVudml2RVhUCQlNQU5HTEUoTXVsdGlUZXhFbnZpdkVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleEdlbmRFWFQJCU1BTkdMRShNdWx0aVRleEdlbmRFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhHZW5kdkVYVAkJTUFOR0xFKE11bHRpVGV4R2VuZHZFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhHZW5mRVhUCQlNQU5HTEUoTXVsdGlUZXhHZW5mRVhUKQorI2RlZmluZSBnbE11bHRpVGV4R2VuZnZFWFQJCU1BTkdMRShNdWx0aVRleEdlbmZ2RVhUKQorI2RlZmluZSBnbE11bHRpVGV4R2VuaUVYVAkJTUFOR0xFKE11bHRpVGV4R2VuaUVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleEdlbml2RVhUCQlNQU5HTEUoTXVsdGlUZXhHZW5pdkVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleEltYWdlMURFWFQJCU1BTkdMRShNdWx0aVRleEltYWdlMURFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhJbWFnZTJERVhUCQlNQU5HTEUoTXVsdGlUZXhJbWFnZTJERVhUKQorI2RlZmluZSBnbE11bHRpVGV4SW1hZ2UzREVYVAkJTUFOR0xFKE11bHRpVGV4SW1hZ2UzREVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleFBhcmFtZXRlcmZFWFQJCU1BTkdMRShNdWx0aVRleFBhcmFtZXRlcmZFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhQYXJhbWV0ZXJmdkVYVAkJTUFOR0xFKE11bHRpVGV4UGFyYW1ldGVyZnZFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhQYXJhbWV0ZXJpRVhUCQlNQU5HTEUoTXVsdGlUZXhQYXJhbWV0ZXJpRVhUKQorI2RlZmluZSBnbE11bHRpVGV4UGFyYW1ldGVySWl2RVhUCQlNQU5HTEUoTXVsdGlUZXhQYXJhbWV0ZXJJaXZFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhQYXJhbWV0ZXJJdWl2RVhUCQlNQU5HTEUoTXVsdGlUZXhQYXJhbWV0ZXJJdWl2RVhUKQorI2RlZmluZSBnbE11bHRpVGV4UGFyYW1ldGVyaXZFWFQJCU1BTkdMRShNdWx0aVRleFBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbE11bHRpVGV4UmVuZGVyYnVmZmVyRVhUCQlNQU5HTEUoTXVsdGlUZXhSZW5kZXJidWZmZXJFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhTdWJJbWFnZTFERVhUCQlNQU5HTEUoTXVsdGlUZXhTdWJJbWFnZTFERVhUKQorI2RlZmluZSBnbE11bHRpVGV4U3ViSW1hZ2UyREVYVAkJTUFOR0xFKE11bHRpVGV4U3ViSW1hZ2UyREVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleFN1YkltYWdlM0RFWFQJCU1BTkdMRShNdWx0aVRleFN1YkltYWdlM0RFWFQpCisjZGVmaW5lIGdsTXVsdE1hdHJpeGQJCU1BTkdMRShNdWx0TWF0cml4ZCkKKyNkZWZpbmUgZ2xNdWx0TWF0cml4ZgkJTUFOR0xFKE11bHRNYXRyaXhmKQorI2RlZmluZSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhkQVJCCQlNQU5HTEUoTXVsdFRyYW5zcG9zZU1hdHJpeGRBUkIpCisjZGVmaW5lIGdsTXVsdFRyYW5zcG9zZU1hdHJpeGQJCU1BTkdMRShNdWx0VHJhbnNwb3NlTWF0cml4ZCkKKyNkZWZpbmUgZ2xNdWx0VHJhbnNwb3NlTWF0cml4ZkFSQgkJTUFOR0xFKE11bHRUcmFuc3Bvc2VNYXRyaXhmQVJCKQorI2RlZmluZSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhmCQlNQU5HTEUoTXVsdFRyYW5zcG9zZU1hdHJpeGYpCisjZGVmaW5lIGdsTmFtZWRCdWZmZXJEYXRhRVhUCQlNQU5HTEUoTmFtZWRCdWZmZXJEYXRhRVhUKQorI2RlZmluZSBnbE5hbWVkQnVmZmVyU3ViRGF0YUVYVAkJTUFOR0xFKE5hbWVkQnVmZmVyU3ViRGF0YUVYVCkKKyNkZWZpbmUgZ2xOYW1lZENvcHlCdWZmZXJTdWJEYXRhRVhUCQlNQU5HTEUoTmFtZWRDb3B5QnVmZmVyU3ViRGF0YUVYVCkKKyNkZWZpbmUgZ2xOYW1lZEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUCQlNQU5HTEUoTmFtZWRGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVCkKKyNkZWZpbmUgZ2xOYW1lZEZyYW1lYnVmZmVyVGV4dHVyZTFERVhUCQlNQU5HTEUoTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmUxREVYVCkKKyNkZWZpbmUgZ2xOYW1lZEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUCQlNQU5HTEUoTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmUyREVYVCkKKyNkZWZpbmUgZ2xOYW1lZEZyYW1lYnVmZmVyVGV4dHVyZTNERVhUCQlNQU5HTEUoTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmUzREVYVCkKKyNkZWZpbmUgZ2xOYW1lZEZyYW1lYnVmZmVyVGV4dHVyZUVYVAkJTUFOR0xFKE5hbWVkRnJhbWVidWZmZXJUZXh0dXJlRVhUKQorI2RlZmluZSBnbE5hbWVkRnJhbWVidWZmZXJUZXh0dXJlRmFjZUVYVAkJTUFOR0xFKE5hbWVkRnJhbWVidWZmZXJUZXh0dXJlRmFjZUVYVCkKKyNkZWZpbmUgZ2xOYW1lZEZyYW1lYnVmZmVyVGV4dHVyZUxheWVyRVhUCQlNQU5HTEUoTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmVMYXllckVYVCkKKyNkZWZpbmUgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRkRVhUCQlNQU5HTEUoTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZEVYVCkKKyNkZWZpbmUgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRkdkVYVAkJTUFOR0xFKE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGR2RVhUKQorI2RlZmluZSBnbE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGZFWFQJCU1BTkdMRShOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRmRVhUKQorI2RlZmluZSBnbE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGZ2RVhUCQlNQU5HTEUoTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZnZFWFQpCisjZGVmaW5lIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNGlFWFQJCU1BTkdMRShOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0aUVYVCkKKyNkZWZpbmUgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0aXZFWFQJCU1BTkdMRShOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0aXZFWFQpCisjZGVmaW5lIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNHVpRVhUCQlNQU5HTEUoTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNHVpRVhUKQorI2RlZmluZSBnbE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTR1aXZFWFQJCU1BTkdMRShOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0dWl2RVhUKQorI2RlZmluZSBnbE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyczRmdkVYVAkJTUFOR0xFKE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyczRmdkVYVCkKKyNkZWZpbmUgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcnNJNGl2RVhUCQlNQU5HTEUoTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJzSTRpdkVYVCkKKyNkZWZpbmUgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcnNJNHVpdkVYVAkJTUFOR0xFKE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyc0k0dWl2RVhUKQorI2RlZmluZSBnbE5hbWVkUHJvZ3JhbVN0cmluZ0VYVAkJTUFOR0xFKE5hbWVkUHJvZ3JhbVN0cmluZ0VYVCkKKyNkZWZpbmUgZ2xOYW1lZFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQJCU1BTkdMRShOYW1lZFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQpCisjZGVmaW5lIGdsTmFtZWRSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVDb3ZlcmFnZUVYVAkJTUFOR0xFKE5hbWVkUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQ292ZXJhZ2VFWFQpCisjZGVmaW5lIGdsTmFtZWRSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQJCU1BTkdMRShOYW1lZFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCkKKyNkZWZpbmUgZ2xOYW1lZFN0cmluZ0FSQgkJTUFOR0xFKE5hbWVkU3RyaW5nQVJCKQorI2RlZmluZSBnbE5ld0xpc3QJCU1BTkdMRShOZXdMaXN0KQorI2RlZmluZSBnbE5ld09iamVjdEJ1ZmZlckFUSQkJTUFOR0xFKE5ld09iamVjdEJ1ZmZlckFUSSkKKyNkZWZpbmUgZ2xOb3JtYWwzYgkJTUFOR0xFKE5vcm1hbDNiKQorI2RlZmluZSBnbE5vcm1hbDNidgkJTUFOR0xFKE5vcm1hbDNidikKKyNkZWZpbmUgZ2xOb3JtYWwzZAkJTUFOR0xFKE5vcm1hbDNkKQorI2RlZmluZSBnbE5vcm1hbDNkdgkJTUFOR0xFKE5vcm1hbDNkdikKKyNkZWZpbmUgZ2xOb3JtYWwzZgkJTUFOR0xFKE5vcm1hbDNmKQorI2RlZmluZSBnbE5vcm1hbDNmVmVydGV4M2ZTVU4JCU1BTkdMRShOb3JtYWwzZlZlcnRleDNmU1VOKQorI2RlZmluZSBnbE5vcm1hbDNmVmVydGV4M2Z2U1VOCQlNQU5HTEUoTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsTm9ybWFsM2Z2CQlNQU5HTEUoTm9ybWFsM2Z2KQorI2RlZmluZSBnbE5vcm1hbDNoTlYJCU1BTkdMRShOb3JtYWwzaE5WKQorI2RlZmluZSBnbE5vcm1hbDNodk5WCQlNQU5HTEUoTm9ybWFsM2h2TlYpCisjZGVmaW5lIGdsTm9ybWFsM2kJCU1BTkdMRShOb3JtYWwzaSkKKyNkZWZpbmUgZ2xOb3JtYWwzaXYJCU1BTkdMRShOb3JtYWwzaXYpCisjZGVmaW5lIGdsTm9ybWFsM3MJCU1BTkdMRShOb3JtYWwzcykKKyNkZWZpbmUgZ2xOb3JtYWwzc3YJCU1BTkdMRShOb3JtYWwzc3YpCisjZGVmaW5lIGdsTm9ybWFsRm9ybWF0TlYJCU1BTkdMRShOb3JtYWxGb3JtYXROVikKKyNkZWZpbmUgZ2xOb3JtYWxQM3VpCQlNQU5HTEUoTm9ybWFsUDN1aSkKKyNkZWZpbmUgZ2xOb3JtYWxQM3VpdgkJTUFOR0xFKE5vcm1hbFAzdWl2KQorI2RlZmluZSBnbE5vcm1hbFBvaW50ZXJFWFQJCU1BTkdMRShOb3JtYWxQb2ludGVyRVhUKQorI2RlZmluZSBnbE5vcm1hbFBvaW50ZXJMaXN0SUJNCQlNQU5HTEUoTm9ybWFsUG9pbnRlckxpc3RJQk0pCisjZGVmaW5lIGdsTm9ybWFsUG9pbnRlcgkJTUFOR0xFKE5vcm1hbFBvaW50ZXIpCisjZGVmaW5lIGdsTm9ybWFsUG9pbnRlcnZJTlRFTAkJTUFOR0xFKE5vcm1hbFBvaW50ZXJ2SU5URUwpCisjZGVmaW5lIGdsTm9ybWFsU3RyZWFtM2JBVEkJCU1BTkdMRShOb3JtYWxTdHJlYW0zYkFUSSkKKyNkZWZpbmUgZ2xOb3JtYWxTdHJlYW0zYnZBVEkJCU1BTkdMRShOb3JtYWxTdHJlYW0zYnZBVEkpCisjZGVmaW5lIGdsTm9ybWFsU3RyZWFtM2RBVEkJCU1BTkdMRShOb3JtYWxTdHJlYW0zZEFUSSkKKyNkZWZpbmUgZ2xOb3JtYWxTdHJlYW0zZHZBVEkJCU1BTkdMRShOb3JtYWxTdHJlYW0zZHZBVEkpCisjZGVmaW5lIGdsTm9ybWFsU3RyZWFtM2ZBVEkJCU1BTkdMRShOb3JtYWxTdHJlYW0zZkFUSSkKKyNkZWZpbmUgZ2xOb3JtYWxTdHJlYW0zZnZBVEkJCU1BTkdMRShOb3JtYWxTdHJlYW0zZnZBVEkpCisjZGVmaW5lIGdsTm9ybWFsU3RyZWFtM2lBVEkJCU1BTkdMRShOb3JtYWxTdHJlYW0zaUFUSSkKKyNkZWZpbmUgZ2xOb3JtYWxTdHJlYW0zaXZBVEkJCU1BTkdMRShOb3JtYWxTdHJlYW0zaXZBVEkpCisjZGVmaW5lIGdsTm9ybWFsU3RyZWFtM3NBVEkJCU1BTkdMRShOb3JtYWxTdHJlYW0zc0FUSSkKKyNkZWZpbmUgZ2xOb3JtYWxTdHJlYW0zc3ZBVEkJCU1BTkdMRShOb3JtYWxTdHJlYW0zc3ZBVEkpCisjZGVmaW5lIGdsT2JqZWN0UHVyZ2VhYmxlQVBQTEUJCU1BTkdMRShPYmplY3RQdXJnZWFibGVBUFBMRSkKKyNkZWZpbmUgZ2xPYmplY3RVbnB1cmdlYWJsZUFQUExFCQlNQU5HTEUoT2JqZWN0VW5wdXJnZWFibGVBUFBMRSkKKyNkZWZpbmUgZ2xPcnRobwkJTUFOR0xFKE9ydGhvKQorI2RlZmluZSBnbFBhc3NUZXhDb29yZEFUSQkJTUFOR0xFKFBhc3NUZXhDb29yZEFUSSkKKyNkZWZpbmUgZ2xQYXNzVGhyb3VnaAkJTUFOR0xFKFBhc3NUaHJvdWdoKQorI2RlZmluZSBnbFBhdGNoUGFyYW1ldGVyZnYJCU1BTkdMRShQYXRjaFBhcmFtZXRlcmZ2KQorI2RlZmluZSBnbFBhdGNoUGFyYW1ldGVyaQkJTUFOR0xFKFBhdGNoUGFyYW1ldGVyaSkKKyNkZWZpbmUgZ2xQYXVzZVRyYW5zZm9ybUZlZWRiYWNrCQlNQU5HTEUoUGF1c2VUcmFuc2Zvcm1GZWVkYmFjaykKKyNkZWZpbmUgZ2xQYXVzZVRyYW5zZm9ybUZlZWRiYWNrTlYJCU1BTkdMRShQYXVzZVRyYW5zZm9ybUZlZWRiYWNrTlYpCisjZGVmaW5lIGdsUGl4ZWxEYXRhUmFuZ2VOVgkJTUFOR0xFKFBpeGVsRGF0YVJhbmdlTlYpCisjZGVmaW5lIGdsUGl4ZWxNYXBmdgkJTUFOR0xFKFBpeGVsTWFwZnYpCisjZGVmaW5lIGdsUGl4ZWxNYXB1aXYJCU1BTkdMRShQaXhlbE1hcHVpdikKKyNkZWZpbmUgZ2xQaXhlbE1hcHVzdgkJTUFOR0xFKFBpeGVsTWFwdXN2KQorI2RlZmluZSBnbFBpeGVsU3RvcmVmCQlNQU5HTEUoUGl4ZWxTdG9yZWYpCisjZGVmaW5lIGdsUGl4ZWxTdG9yZWkJCU1BTkdMRShQaXhlbFN0b3JlaSkKKyNkZWZpbmUgZ2xQaXhlbFRleEdlblBhcmFtZXRlcmZTR0lTCQlNQU5HTEUoUGl4ZWxUZXhHZW5QYXJhbWV0ZXJmU0dJUykKKyNkZWZpbmUgZ2xQaXhlbFRleEdlblBhcmFtZXRlcmZ2U0dJUwkJTUFOR0xFKFBpeGVsVGV4R2VuUGFyYW1ldGVyZnZTR0lTKQorI2RlZmluZSBnbFBpeGVsVGV4R2VuUGFyYW1ldGVyaVNHSVMJCU1BTkdMRShQaXhlbFRleEdlblBhcmFtZXRlcmlTR0lTKQorI2RlZmluZSBnbFBpeGVsVGV4R2VuUGFyYW1ldGVyaXZTR0lTCQlNQU5HTEUoUGl4ZWxUZXhHZW5QYXJhbWV0ZXJpdlNHSVMpCisjZGVmaW5lIGdsUGl4ZWxUZXhHZW5TR0lYCQlNQU5HTEUoUGl4ZWxUZXhHZW5TR0lYKQorI2RlZmluZSBnbFBpeGVsVHJhbnNmZXJmCQlNQU5HTEUoUGl4ZWxUcmFuc2ZlcmYpCisjZGVmaW5lIGdsUGl4ZWxUcmFuc2ZlcmkJCU1BTkdMRShQaXhlbFRyYW5zZmVyaSkKKyNkZWZpbmUgZ2xQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcmZFWFQJCU1BTkdMRShQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcmZFWFQpCisjZGVmaW5lIGdsUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJmdkVYVAkJTUFOR0xFKFBpeGVsVHJhbnNmb3JtUGFyYW1ldGVyZnZFWFQpCisjZGVmaW5lIGdsUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJpRVhUCQlNQU5HTEUoUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJpRVhUKQorI2RlZmluZSBnbFBpeGVsVHJhbnNmb3JtUGFyYW1ldGVyaXZFWFQJCU1BTkdMRShQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbFBpeGVsWm9vbQkJTUFOR0xFKFBpeGVsWm9vbSkKKyNkZWZpbmUgZ2xQTlRyaWFuZ2xlc2ZBVEkJCU1BTkdMRShQTlRyaWFuZ2xlc2ZBVEkpCisjZGVmaW5lIGdsUE5UcmlhbmdsZXNpQVRJCQlNQU5HTEUoUE5UcmlhbmdsZXNpQVRJKQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyZkFSQgkJTUFOR0xFKFBvaW50UGFyYW1ldGVyZkFSQikKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmZFWFQJCU1BTkdMRShQb2ludFBhcmFtZXRlcmZFWFQpCisjZGVmaW5lIGdsUG9pbnRQYXJhbWV0ZXJmCQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJmKQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyZlNHSVMJCU1BTkdMRShQb2ludFBhcmFtZXRlcmZTR0lTKQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyZnZBUkIJCU1BTkdMRShQb2ludFBhcmFtZXRlcmZ2QVJCKQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyZnZFWFQJCU1BTkdMRShQb2ludFBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyZnYJCU1BTkdMRShQb2ludFBhcmFtZXRlcmZ2KQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyZnZTR0lTCQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJmdlNHSVMpCisjZGVmaW5lIGdsUG9pbnRQYXJhbWV0ZXJpCQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJpKQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyaU5WCQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJpTlYpCisjZGVmaW5lIGdsUG9pbnRQYXJhbWV0ZXJpdgkJTUFOR0xFKFBvaW50UGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsUG9pbnRQYXJhbWV0ZXJpdk5WCQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJpdk5WKQorI2RlZmluZSBnbFBvaW50U2l6ZQkJTUFOR0xFKFBvaW50U2l6ZSkKKyNkZWZpbmUgZ2xQb2xsQXN5bmNTR0lYCQlNQU5HTEUoUG9sbEFzeW5jU0dJWCkKKyNkZWZpbmUgZ2xQb2xsSW5zdHJ1bWVudHNTR0lYCQlNQU5HTEUoUG9sbEluc3RydW1lbnRzU0dJWCkKKyNkZWZpbmUgZ2xQb2x5Z29uTW9kZQkJTUFOR0xFKFBvbHlnb25Nb2RlKQorI2RlZmluZSBnbFBvbHlnb25PZmZzZXRFWFQJCU1BTkdMRShQb2x5Z29uT2Zmc2V0RVhUKQorI2RlZmluZSBnbFBvbHlnb25PZmZzZXQJCU1BTkdMRShQb2x5Z29uT2Zmc2V0KQorI2RlZmluZSBnbFBvbHlnb25TdGlwcGxlCQlNQU5HTEUoUG9seWdvblN0aXBwbGUpCisjZGVmaW5lIGdsUG9wQXR0cmliCQlNQU5HTEUoUG9wQXR0cmliKQorI2RlZmluZSBnbFBvcENsaWVudEF0dHJpYgkJTUFOR0xFKFBvcENsaWVudEF0dHJpYikKKyNkZWZpbmUgZ2xQb3BNYXRyaXgJCU1BTkdMRShQb3BNYXRyaXgpCisjZGVmaW5lIGdsUG9wTmFtZQkJTUFOR0xFKFBvcE5hbWUpCisjZGVmaW5lIGdsUHJlc2VudEZyYW1lRHVhbEZpbGxOVgkJTUFOR0xFKFByZXNlbnRGcmFtZUR1YWxGaWxsTlYpCisjZGVmaW5lIGdsUHJlc2VudEZyYW1lS2V5ZWROVgkJTUFOR0xFKFByZXNlbnRGcmFtZUtleWVkTlYpCisjZGVmaW5lIGdsUHJpbWl0aXZlUmVzdGFydEluZGV4CQlNQU5HTEUoUHJpbWl0aXZlUmVzdGFydEluZGV4KQorI2RlZmluZSBnbFByaW1pdGl2ZVJlc3RhcnRJbmRleE5WCQlNQU5HTEUoUHJpbWl0aXZlUmVzdGFydEluZGV4TlYpCisjZGVmaW5lIGdsUHJpbWl0aXZlUmVzdGFydE5WCQlNQU5HTEUoUHJpbWl0aXZlUmVzdGFydE5WKQorI2RlZmluZSBnbFByaW9yaXRpemVUZXh0dXJlc0VYVAkJTUFOR0xFKFByaW9yaXRpemVUZXh0dXJlc0VYVCkKKyNkZWZpbmUgZ2xQcmlvcml0aXplVGV4dHVyZXMJCU1BTkdMRShQcmlvcml0aXplVGV4dHVyZXMpCisjZGVmaW5lIGdsUHJvZ3JhbUJpbmFyeQkJTUFOR0xFKFByb2dyYW1CaW5hcnkpCisjZGVmaW5lIGdsUHJvZ3JhbUJ1ZmZlclBhcmFtZXRlcnNmdk5WCQlNQU5HTEUoUHJvZ3JhbUJ1ZmZlclBhcmFtZXRlcnNmdk5WKQorI2RlZmluZSBnbFByb2dyYW1CdWZmZXJQYXJhbWV0ZXJzSWl2TlYJCU1BTkdMRShQcm9ncmFtQnVmZmVyUGFyYW1ldGVyc0lpdk5WKQorI2RlZmluZSBnbFByb2dyYW1CdWZmZXJQYXJhbWV0ZXJzSXVpdk5WCQlNQU5HTEUoUHJvZ3JhbUJ1ZmZlclBhcmFtZXRlcnNJdWl2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbUNhbGxiYWNrTUVTQQkJTUFOR0xFKFByb2dyYW1DYWxsYmFja01FU0EpCisjZGVmaW5lIGdsUHJvZ3JhbUVudlBhcmFtZXRlcjRkQVJCCQlNQU5HTEUoUHJvZ3JhbUVudlBhcmFtZXRlcjRkQVJCKQorI2RlZmluZSBnbFByb2dyYW1FbnZQYXJhbWV0ZXI0ZHZBUkIJCU1BTkdMRShQcm9ncmFtRW52UGFyYW1ldGVyNGR2QVJCKQorI2RlZmluZSBnbFByb2dyYW1FbnZQYXJhbWV0ZXI0ZkFSQgkJTUFOR0xFKFByb2dyYW1FbnZQYXJhbWV0ZXI0ZkFSQikKKyNkZWZpbmUgZ2xQcm9ncmFtRW52UGFyYW1ldGVyNGZ2QVJCCQlNQU5HTEUoUHJvZ3JhbUVudlBhcmFtZXRlcjRmdkFSQikKKyNkZWZpbmUgZ2xQcm9ncmFtRW52UGFyYW1ldGVySTRpTlYJCU1BTkdMRShQcm9ncmFtRW52UGFyYW1ldGVySTRpTlYpCisjZGVmaW5lIGdsUHJvZ3JhbUVudlBhcmFtZXRlckk0aXZOVgkJTUFOR0xFKFByb2dyYW1FbnZQYXJhbWV0ZXJJNGl2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbUVudlBhcmFtZXRlckk0dWlOVgkJTUFOR0xFKFByb2dyYW1FbnZQYXJhbWV0ZXJJNHVpTlYpCisjZGVmaW5lIGdsUHJvZ3JhbUVudlBhcmFtZXRlckk0dWl2TlYJCU1BTkdMRShQcm9ncmFtRW52UGFyYW1ldGVySTR1aXZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtRW52UGFyYW1ldGVyczRmdkVYVAkJTUFOR0xFKFByb2dyYW1FbnZQYXJhbWV0ZXJzNGZ2RVhUKQorI2RlZmluZSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJzSTRpdk5WCQlNQU5HTEUoUHJvZ3JhbUVudlBhcmFtZXRlcnNJNGl2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbUVudlBhcmFtZXRlcnNJNHVpdk5WCQlNQU5HTEUoUHJvZ3JhbUVudlBhcmFtZXRlcnNJNHVpdk5WKQorI2RlZmluZSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRkQVJCCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGRBUkIpCisjZGVmaW5lIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGR2QVJCCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGR2QVJCKQorI2RlZmluZSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRmQVJCCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGZBUkIpCisjZGVmaW5lIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGZ2QVJCCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGZ2QVJCKQorI2RlZmluZSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0aU5WCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTRpTlYpCisjZGVmaW5lIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTRpdk5WCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTRpdk5WKQorI2RlZmluZSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0dWlOVgkJTUFOR0xFKFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0dWlOVikKKyNkZWZpbmUgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNHVpdk5WCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTR1aXZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJzNGZ2RVhUCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVyczRmdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJzSTRpdk5WCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVyc0k0aXZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJzSTR1aXZOVgkJTUFOR0xFKFByb2dyYW1Mb2NhbFBhcmFtZXRlcnNJNHVpdk5WKQorI2RlZmluZSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRkTlYJCU1BTkdMRShQcm9ncmFtTmFtZWRQYXJhbWV0ZXI0ZE5WKQorI2RlZmluZSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRkdk5WCQlNQU5HTEUoUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGR2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGZOVgkJTUFOR0xFKFByb2dyYW1OYW1lZFBhcmFtZXRlcjRmTlYpCisjZGVmaW5lIGdsUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGZ2TlYJCU1BTkdMRShQcm9ncmFtTmFtZWRQYXJhbWV0ZXI0ZnZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtUGFyYW1ldGVyNGROVgkJTUFOR0xFKFByb2dyYW1QYXJhbWV0ZXI0ZE5WKQorI2RlZmluZSBnbFByb2dyYW1QYXJhbWV0ZXI0ZHZOVgkJTUFOR0xFKFByb2dyYW1QYXJhbWV0ZXI0ZHZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtUGFyYW1ldGVyNGZOVgkJTUFOR0xFKFByb2dyYW1QYXJhbWV0ZXI0Zk5WKQorI2RlZmluZSBnbFByb2dyYW1QYXJhbWV0ZXI0ZnZOVgkJTUFOR0xFKFByb2dyYW1QYXJhbWV0ZXI0ZnZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtUGFyYW1ldGVyaUFSQgkJTUFOR0xFKFByb2dyYW1QYXJhbWV0ZXJpQVJCKQorI2RlZmluZSBnbFByb2dyYW1QYXJhbWV0ZXJpRVhUCQlNQU5HTEUoUHJvZ3JhbVBhcmFtZXRlcmlFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVBhcmFtZXRlcmkJCU1BTkdMRShQcm9ncmFtUGFyYW1ldGVyaSkKKyNkZWZpbmUgZ2xQcm9ncmFtUGFyYW1ldGVyczRkdk5WCQlNQU5HTEUoUHJvZ3JhbVBhcmFtZXRlcnM0ZHZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtUGFyYW1ldGVyczRmdk5WCQlNQU5HTEUoUHJvZ3JhbVBhcmFtZXRlcnM0ZnZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtU3RyaW5nQVJCCQlNQU5HTEUoUHJvZ3JhbVN0cmluZ0FSQikKKyNkZWZpbmUgZ2xQcm9ncmFtU3Vicm91dGluZVBhcmFtZXRlcnN1aXZOVgkJTUFOR0xFKFByb2dyYW1TdWJyb3V0aW5lUGFyYW1ldGVyc3Vpdk5WKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMWRFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTFkRVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMWQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTFkKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMWR2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0xZHZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0xZHYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTFkdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTFmRVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0xZkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTFmCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0xZikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTFmdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMWZ2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMWZ2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0xZnYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0xaTY0TlYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTFpNjROVikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTFpNjR2TlYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTFpNjR2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0xaUVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMWlFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0xaQkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMWkpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0xaXZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTFpdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTFpdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMWl2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMXVpNjROVgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMXVpNjROVikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTF1aTY0dk5WCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0xdWk2NHZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTF1aUVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMXVpRVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMXVpCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0xdWkpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0xdWl2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0xdWl2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMXVpdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMXVpdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTJkRVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0yZEVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTJkCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0yZCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTJkdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMmR2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMmR2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0yZHYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0yZkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMmZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0yZgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMmYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0yZnZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJmdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTJmdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMmZ2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMmk2NE5WCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0yaTY0TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0yaTY0dk5WCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0yaTY0dk5WKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMmlFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJpRVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMmkJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJpKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMml2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0yaXZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0yaXYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJpdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTJ1aTY0TlYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJ1aTY0TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0ydWk2NHZOVgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMnVpNjR2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0ydWlFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJ1aUVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTJ1aQkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMnVpKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMnVpdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMnVpdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTJ1aXYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJ1aXYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0zZEVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtM2RFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0zZAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtM2QpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0zZHZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTNkdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTNkdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtM2R2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM2ZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTNmRVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM2YJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTNmKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM2Z2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zZnZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0zZnYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTNmdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTNpNjROVgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtM2k2NE5WKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM2k2NHZOVgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtM2k2NHZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTNpRVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zaUVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTNpCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zaSkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTNpdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtM2l2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM2l2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zaXYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0zdWk2NE5WCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zdWk2NE5WKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM3VpNjR2TlYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTN1aTY0dk5WKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM3VpRVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zdWlFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0zdWkJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTN1aSkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTN1aXZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTN1aXZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0zdWl2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zdWl2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtNGRFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTRkRVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtNGQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTRkKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtNGR2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm00ZHZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm00ZHYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTRkdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTRmRVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm00ZkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTRmCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm00ZikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTRmdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNGZ2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtNGZ2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm00ZnYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm00aTY0TlYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTRpNjROVikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTRpNjR2TlYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTRpNjR2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm00aUVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNGlFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm00aQkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNGkpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm00aXZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTRpdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTRpdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNGl2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtNHVpNjROVgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNHVpNjROVikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTR1aTY0dk5WCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm00dWk2NHZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTR1aUVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNHVpRVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtNHVpCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm00dWkpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm00dWl2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm00dWl2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtNHVpdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNHVpdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJkdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4MmR2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MmR2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZHYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDJmdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJmdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4MmZ2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MngzZHZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4M2R2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MngzZHYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4M2R2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MngzZnZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4M2Z2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MngzZnYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4M2Z2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4Mng0ZHZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4NGR2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4Mng0ZHYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4NGR2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4Mng0ZnZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4NGZ2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4Mng0ZnYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4NGZ2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M2R2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZHZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZHYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDNkdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4M2Z2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M2Z2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDJkdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4M3gyZHZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDJkdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4M3gyZHYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDJmdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4M3gyZnZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDJmdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4M3gyZnYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDRkdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4M3g0ZHZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDRkdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4M3g0ZHYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDRmdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4M3g0ZnZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDRmdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4M3g0ZnYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZHZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDRkdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDRkdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4NGR2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDRmdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4MmR2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDJkdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4MmR2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDJkdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4MmZ2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDJmdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4MmZ2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDJmdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4M2R2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDNkdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4M2R2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDNkdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4M2Z2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDNmdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4M2Z2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDNmdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybXVpNjROVgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtdWk2NE5WKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtdWk2NHZOVgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtdWk2NHZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtVmVydGV4TGltaXROVgkJTUFOR0xFKFByb2dyYW1WZXJ0ZXhMaW1pdE5WKQorI2RlZmluZSBnbFByb3Zva2luZ1ZlcnRleEVYVAkJTUFOR0xFKFByb3Zva2luZ1ZlcnRleEVYVCkKKyNkZWZpbmUgZ2xQcm92b2tpbmdWZXJ0ZXgJCU1BTkdMRShQcm92b2tpbmdWZXJ0ZXgpCisjZGVmaW5lIGdsUHVzaEF0dHJpYgkJTUFOR0xFKFB1c2hBdHRyaWIpCisjZGVmaW5lIGdsUHVzaENsaWVudEF0dHJpYkRlZmF1bHRFWFQJCU1BTkdMRShQdXNoQ2xpZW50QXR0cmliRGVmYXVsdEVYVCkKKyNkZWZpbmUgZ2xQdXNoQ2xpZW50QXR0cmliCQlNQU5HTEUoUHVzaENsaWVudEF0dHJpYikKKyNkZWZpbmUgZ2xQdXNoTWF0cml4CQlNQU5HTEUoUHVzaE1hdHJpeCkKKyNkZWZpbmUgZ2xQdXNoTmFtZQkJTUFOR0xFKFB1c2hOYW1lKQorI2RlZmluZSBnbFF1ZXJ5Q291bnRlcgkJTUFOR0xFKFF1ZXJ5Q291bnRlcikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MyZAkJTUFOR0xFKFJhc3RlclBvczJkKQorI2RlZmluZSBnbFJhc3RlclBvczJkdgkJTUFOR0xFKFJhc3RlclBvczJkdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MyZgkJTUFOR0xFKFJhc3RlclBvczJmKQorI2RlZmluZSBnbFJhc3RlclBvczJmdgkJTUFOR0xFKFJhc3RlclBvczJmdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MyaQkJTUFOR0xFKFJhc3RlclBvczJpKQorI2RlZmluZSBnbFJhc3RlclBvczJpdgkJTUFOR0xFKFJhc3RlclBvczJpdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MycwkJTUFOR0xFKFJhc3RlclBvczJzKQorI2RlZmluZSBnbFJhc3RlclBvczJzdgkJTUFOR0xFKFJhc3RlclBvczJzdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MzZAkJTUFOR0xFKFJhc3RlclBvczNkKQorI2RlZmluZSBnbFJhc3RlclBvczNkdgkJTUFOR0xFKFJhc3RlclBvczNkdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MzZgkJTUFOR0xFKFJhc3RlclBvczNmKQorI2RlZmluZSBnbFJhc3RlclBvczNmdgkJTUFOR0xFKFJhc3RlclBvczNmdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MzaQkJTUFOR0xFKFJhc3RlclBvczNpKQorI2RlZmluZSBnbFJhc3RlclBvczNpdgkJTUFOR0xFKFJhc3RlclBvczNpdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MzcwkJTUFOR0xFKFJhc3RlclBvczNzKQorI2RlZmluZSBnbFJhc3RlclBvczNzdgkJTUFOR0xFKFJhc3RlclBvczNzdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3M0ZAkJTUFOR0xFKFJhc3RlclBvczRkKQorI2RlZmluZSBnbFJhc3RlclBvczRkdgkJTUFOR0xFKFJhc3RlclBvczRkdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3M0ZgkJTUFOR0xFKFJhc3RlclBvczRmKQorI2RlZmluZSBnbFJhc3RlclBvczRmdgkJTUFOR0xFKFJhc3RlclBvczRmdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3M0aQkJTUFOR0xFKFJhc3RlclBvczRpKQorI2RlZmluZSBnbFJhc3RlclBvczRpdgkJTUFOR0xFKFJhc3RlclBvczRpdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3M0cwkJTUFOR0xFKFJhc3RlclBvczRzKQorI2RlZmluZSBnbFJhc3RlclBvczRzdgkJTUFOR0xFKFJhc3RlclBvczRzdikKKyNkZWZpbmUgZ2xSZWFkQnVmZmVyCQlNQU5HTEUoUmVhZEJ1ZmZlcikKKyNkZWZpbmUgZ2xSZWFkSW5zdHJ1bWVudHNTR0lYCQlNQU5HTEUoUmVhZEluc3RydW1lbnRzU0dJWCkKKyNkZWZpbmUgZ2xSZWFkblBpeGVsc0FSQgkJTUFOR0xFKFJlYWRuUGl4ZWxzQVJCKQorI2RlZmluZSBnbFJlYWRQaXhlbHMJCU1BTkdMRShSZWFkUGl4ZWxzKQorI2RlZmluZSBnbFJlY3RkCQlNQU5HTEUoUmVjdGQpCisjZGVmaW5lIGdsUmVjdGR2CQlNQU5HTEUoUmVjdGR2KQorI2RlZmluZSBnbFJlY3RmCQlNQU5HTEUoUmVjdGYpCisjZGVmaW5lIGdsUmVjdGZ2CQlNQU5HTEUoUmVjdGZ2KQorI2RlZmluZSBnbFJlY3RpCQlNQU5HTEUoUmVjdGkpCisjZGVmaW5lIGdsUmVjdGl2CQlNQU5HTEUoUmVjdGl2KQorI2RlZmluZSBnbFJlY3RzCQlNQU5HTEUoUmVjdHMpCisjZGVmaW5lIGdsUmVjdHN2CQlNQU5HTEUoUmVjdHN2KQorI2RlZmluZSBnbFJlZmVyZW5jZVBsYW5lU0dJWAkJTUFOR0xFKFJlZmVyZW5jZVBsYW5lU0dJWCkKKyNkZWZpbmUgZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIJCU1BTkdMRShSZWxlYXNlU2hhZGVyQ29tcGlsZXIpCisjZGVmaW5lIGdsUmVuZGVyYnVmZmVyU3RvcmFnZUVYVAkJTUFOR0xFKFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQpCisjZGVmaW5lIGdsUmVuZGVyYnVmZmVyU3RvcmFnZQkJTUFOR0xFKFJlbmRlcmJ1ZmZlclN0b3JhZ2UpCisjZGVmaW5lIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQ292ZXJhZ2VOVgkJTUFOR0xFKFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUNvdmVyYWdlTlYpCisjZGVmaW5lIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUCQlNQU5HTEUoUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKQorI2RlZmluZSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZQkJTUFOR0xFKFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSkKKyNkZWZpbmUgZ2xSZW5kZXJNb2RlCQlNQU5HTEUoUmVuZGVyTW9kZSkKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGVQb2ludGVyU1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RlUG9pbnRlclNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1YlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXViU1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVidlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVidlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yM2ZWZXJ0ZXgzZlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpQ29sb3IzZlZlcnRleDNmU1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpQ29sb3IzZlZlcnRleDNmdlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpQ29sb3IzZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yNGZOb3JtYWwzZlZlcnRleDNmU1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpQ29sb3I0dWJWZXJ0ZXgzZlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpQ29sb3I0dWJWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yNHViVmVydGV4M2Z2U1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlDb2xvcjR1YlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aU5vcm1hbDNmVmVydGV4M2ZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aU5vcm1hbDNmVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlOb3JtYWwzZlZlcnRleDNmdlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aVNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmU1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmU1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmTm9ybWFsM2ZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmdlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZk5vcm1hbDNmVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZlZlcnRleDNmU1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmVmVydGV4M2Z2U1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpVmVydGV4M2ZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aVZlcnRleDNmU1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpVmVydGV4M2Z2U1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWl2U1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWl2U1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVzU1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldXNTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldXN2U1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldXN2U1VOKQorI2RlZmluZSBnbFJlcXVlc3RSZXNpZGVudFByb2dyYW1zTlYJCU1BTkdMRShSZXF1ZXN0UmVzaWRlbnRQcm9ncmFtc05WKQorI2RlZmluZSBnbFJlc2V0SGlzdG9ncmFtRVhUCQlNQU5HTEUoUmVzZXRIaXN0b2dyYW1FWFQpCisjZGVmaW5lIGdsUmVzZXRIaXN0b2dyYW0JCU1BTkdMRShSZXNldEhpc3RvZ3JhbSkKKyNkZWZpbmUgZ2xSZXNldE1pbm1heEVYVAkJTUFOR0xFKFJlc2V0TWlubWF4RVhUKQorI2RlZmluZSBnbFJlc2V0TWlubWF4CQlNQU5HTEUoUmVzZXRNaW5tYXgpCisjZGVmaW5lIGdsUmVzaXplQnVmZmVyc01FU0EJCU1BTkdMRShSZXNpemVCdWZmZXJzTUVTQSkKKyNkZWZpbmUgZ2xSZXN1bWVUcmFuc2Zvcm1GZWVkYmFjawkJTUFOR0xFKFJlc3VtZVRyYW5zZm9ybUZlZWRiYWNrKQorI2RlZmluZSBnbFJlc3VtZVRyYW5zZm9ybUZlZWRiYWNrTlYJCU1BTkdMRShSZXN1bWVUcmFuc2Zvcm1GZWVkYmFja05WKQorI2RlZmluZSBnbFJvdGF0ZWQJCU1BTkdMRShSb3RhdGVkKQorI2RlZmluZSBnbFJvdGF0ZWYJCU1BTkdMRShSb3RhdGVmKQorI2RlZmluZSBnbFNhbXBsZUNvdmVyYWdlQVJCCQlNQU5HTEUoU2FtcGxlQ292ZXJhZ2VBUkIpCisjZGVmaW5lIGdsU2FtcGxlQ292ZXJhZ2UJCU1BTkdMRShTYW1wbGVDb3ZlcmFnZSkKKyNkZWZpbmUgZ2xTYW1wbGVNYXBBVEkJCU1BTkdMRShTYW1wbGVNYXBBVEkpCisjZGVmaW5lIGdsU2FtcGxlTWFza0VYVAkJTUFOR0xFKFNhbXBsZU1hc2tFWFQpCisjZGVmaW5lIGdsU2FtcGxlTWFza2kJCU1BTkdMRShTYW1wbGVNYXNraSkKKyNkZWZpbmUgZ2xTYW1wbGVNYXNrSW5kZXhlZE5WCQlNQU5HTEUoU2FtcGxlTWFza0luZGV4ZWROVikKKyNkZWZpbmUgZ2xTYW1wbGVNYXNrU0dJUwkJTUFOR0xFKFNhbXBsZU1hc2tTR0lTKQorI2RlZmluZSBnbFNhbXBsZVBhdHRlcm5FWFQJCU1BTkdMRShTYW1wbGVQYXR0ZXJuRVhUKQorI2RlZmluZSBnbFNhbXBsZVBhdHRlcm5TR0lTCQlNQU5HTEUoU2FtcGxlUGF0dGVyblNHSVMpCisjZGVmaW5lIGdsU2FtcGxlclBhcmFtZXRlcmYJCU1BTkdMRShTYW1wbGVyUGFyYW1ldGVyZikKKyNkZWZpbmUgZ2xTYW1wbGVyUGFyYW1ldGVyZnYJCU1BTkdMRShTYW1wbGVyUGFyYW1ldGVyZnYpCisjZGVmaW5lIGdsU2FtcGxlclBhcmFtZXRlcklpdgkJTUFOR0xFKFNhbXBsZXJQYXJhbWV0ZXJJaXYpCisjZGVmaW5lIGdsU2FtcGxlclBhcmFtZXRlcmkJCU1BTkdMRShTYW1wbGVyUGFyYW1ldGVyaSkKKyNkZWZpbmUgZ2xTYW1wbGVyUGFyYW1ldGVySXVpdgkJTUFOR0xFKFNhbXBsZXJQYXJhbWV0ZXJJdWl2KQorI2RlZmluZSBnbFNhbXBsZXJQYXJhbWV0ZXJpdgkJTUFOR0xFKFNhbXBsZXJQYXJhbWV0ZXJpdikKKyNkZWZpbmUgZ2xTY2FsZWQJCU1BTkdMRShTY2FsZWQpCisjZGVmaW5lIGdsU2NhbGVmCQlNQU5HTEUoU2NhbGVmKQorI2RlZmluZSBnbFNjaXNzb3JBcnJheXYJCU1BTkdMRShTY2lzc29yQXJyYXl2KQorI2RlZmluZSBnbFNjaXNzb3JJbmRleGVkCQlNQU5HTEUoU2Npc3NvckluZGV4ZWQpCisjZGVmaW5lIGdsU2Npc3NvckluZGV4ZWR2CQlNQU5HTEUoU2Npc3NvckluZGV4ZWR2KQorI2RlZmluZSBnbFNjaXNzb3IJCU1BTkdMRShTY2lzc29yKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2JFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNiRVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2IJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNiKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2J2RVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzYnZFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzYnYJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNidikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNkRVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzZEVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNkCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzZCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNkdkVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2R2RVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2R2CQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzZHYpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzZkVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2ZFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzZgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2YpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzZnZFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNmdkVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNmdgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2Z2KQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2hOVgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2hOVikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNodk5WCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzaHZOVikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNpRVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzaUVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNpCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzaSkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNpdkVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2l2RVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2l2CQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzaXYpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3Izc0VYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3NFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzcwkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3MpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3Izc3ZFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNzdkVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNzdgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3N2KQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3ViRVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzdWJFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzdWIJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjN1YikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjN1YnZFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjN1YnZFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzdWJ2CQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzdWJ2KQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3VpRVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzdWlFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzdWkJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjN1aSkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjN1aXZFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjN1aXZFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzdWl2CQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzdWl2KQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3VzRVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzdXNFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzdXMJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjN1cykKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjN1c3ZFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjN1c3ZFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzdXN2CQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzdXN2KQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yRm9ybWF0TlYJCU1BTkdMRShTZWNvbmRhcnlDb2xvckZvcm1hdE5WKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yUDN1aQkJTUFOR0xFKFNlY29uZGFyeUNvbG9yUDN1aSkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvclAzdWl2CQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3JQM3VpdikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvclBvaW50ZXJFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvclBvaW50ZXJFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3JQb2ludGVyTGlzdElCTQkJTUFOR0xFKFNlY29uZGFyeUNvbG9yUG9pbnRlckxpc3RJQk0pCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3JQb2ludGVyCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3JQb2ludGVyKQorI2RlZmluZSBnbFNlbGVjdEJ1ZmZlcgkJTUFOR0xFKFNlbGVjdEJ1ZmZlcikKKyNkZWZpbmUgZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1ECQlNQU5HTEUoU2VsZWN0UGVyZk1vbml0b3JDb3VudGVyc0FNRCkKKyNkZWZpbmUgZ2xTZXBhcmFibGVGaWx0ZXIyREVYVAkJTUFOR0xFKFNlcGFyYWJsZUZpbHRlcjJERVhUKQorI2RlZmluZSBnbFNlcGFyYWJsZUZpbHRlcjJECQlNQU5HTEUoU2VwYXJhYmxlRmlsdGVyMkQpCisjZGVmaW5lIGdsU2V0RmVuY2VBUFBMRQkJTUFOR0xFKFNldEZlbmNlQVBQTEUpCisjZGVmaW5lIGdsU2V0RmVuY2VOVgkJTUFOR0xFKFNldEZlbmNlTlYpCisjZGVmaW5lIGdsU2V0RnJhZ21lbnRTaGFkZXJDb25zdGFudEFUSQkJTUFOR0xFKFNldEZyYWdtZW50U2hhZGVyQ29uc3RhbnRBVEkpCisjZGVmaW5lIGdsU2V0SW52YXJpYW50RVhUCQlNQU5HTEUoU2V0SW52YXJpYW50RVhUKQorI2RlZmluZSBnbFNldExvY2FsQ29uc3RhbnRFWFQJCU1BTkdMRShTZXRMb2NhbENvbnN0YW50RVhUKQorI2RlZmluZSBnbFNoYWRlTW9kZWwJCU1BTkdMRShTaGFkZU1vZGVsKQorI2RlZmluZSBnbFNoYWRlckJpbmFyeQkJTUFOR0xFKFNoYWRlckJpbmFyeSkKKyNkZWZpbmUgZ2xTaGFkZXJPcDFFWFQJCU1BTkdMRShTaGFkZXJPcDFFWFQpCisjZGVmaW5lIGdsU2hhZGVyT3AyRVhUCQlNQU5HTEUoU2hhZGVyT3AyRVhUKQorI2RlZmluZSBnbFNoYWRlck9wM0VYVAkJTUFOR0xFKFNoYWRlck9wM0VYVCkKKyNkZWZpbmUgZ2xTaGFkZXJTb3VyY2VBUkIJCU1BTkdMRShTaGFkZXJTb3VyY2VBUkIpCisjZGVmaW5lIGdsU2hhZGVyU291cmNlCQlNQU5HTEUoU2hhZGVyU291cmNlKQorI2RlZmluZSBnbFNoYXJwZW5UZXhGdW5jU0dJUwkJTUFOR0xFKFNoYXJwZW5UZXhGdW5jU0dJUykKKyNkZWZpbmUgZ2xTcHJpdGVQYXJhbWV0ZXJmU0dJWAkJTUFOR0xFKFNwcml0ZVBhcmFtZXRlcmZTR0lYKQorI2RlZmluZSBnbFNwcml0ZVBhcmFtZXRlcmZ2U0dJWAkJTUFOR0xFKFNwcml0ZVBhcmFtZXRlcmZ2U0dJWCkKKyNkZWZpbmUgZ2xTcHJpdGVQYXJhbWV0ZXJpU0dJWAkJTUFOR0xFKFNwcml0ZVBhcmFtZXRlcmlTR0lYKQorI2RlZmluZSBnbFNwcml0ZVBhcmFtZXRlcml2U0dJWAkJTUFOR0xFKFNwcml0ZVBhcmFtZXRlcml2U0dJWCkKKyNkZWZpbmUgZ2xTdGFydEluc3RydW1lbnRzU0dJWAkJTUFOR0xFKFN0YXJ0SW5zdHJ1bWVudHNTR0lYKQorI2RlZmluZSBnbFN0ZW5jaWxDbGVhclRhZ0VYVAkJTUFOR0xFKFN0ZW5jaWxDbGVhclRhZ0VYVCkKKyNkZWZpbmUgZ2xTdGVuY2lsRnVuYwkJTUFOR0xFKFN0ZW5jaWxGdW5jKQorI2RlZmluZSBnbFN0ZW5jaWxGdW5jU2VwYXJhdGVBVEkJCU1BTkdMRShTdGVuY2lsRnVuY1NlcGFyYXRlQVRJKQorI2RlZmluZSBnbFN0ZW5jaWxGdW5jU2VwYXJhdGUJCU1BTkdMRShTdGVuY2lsRnVuY1NlcGFyYXRlKQorI2RlZmluZSBnbFN0ZW5jaWxNYXNrCQlNQU5HTEUoU3RlbmNpbE1hc2spCisjZGVmaW5lIGdsU3RlbmNpbE1hc2tTZXBhcmF0ZQkJTUFOR0xFKFN0ZW5jaWxNYXNrU2VwYXJhdGUpCisjZGVmaW5lIGdsU3RlbmNpbE9wCQlNQU5HTEUoU3RlbmNpbE9wKQorI2RlZmluZSBnbFN0ZW5jaWxPcFNlcGFyYXRlQVRJCQlNQU5HTEUoU3RlbmNpbE9wU2VwYXJhdGVBVEkpCisjZGVmaW5lIGdsU3RlbmNpbE9wU2VwYXJhdGUJCU1BTkdMRShTdGVuY2lsT3BTZXBhcmF0ZSkKKyNkZWZpbmUgZ2xTdG9wSW5zdHJ1bWVudHNTR0lYCQlNQU5HTEUoU3RvcEluc3RydW1lbnRzU0dJWCkKKyNkZWZpbmUgZ2xTdHJpbmdNYXJrZXJHUkVNRURZCQlNQU5HTEUoU3RyaW5nTWFya2VyR1JFTUVEWSkKKyNkZWZpbmUgZ2xTd2l6emxlRVhUCQlNQU5HTEUoU3dpenpsZUVYVCkKKyNkZWZpbmUgZ2xUYWdTYW1wbGVCdWZmZXJTR0lYCQlNQU5HTEUoVGFnU2FtcGxlQnVmZmVyU0dJWCkKKyNkZWZpbmUgZ2xUYW5nZW50M2JFWFQJCU1BTkdMRShUYW5nZW50M2JFWFQpCisjZGVmaW5lIGdsVGFuZ2VudDNidkVYVAkJTUFOR0xFKFRhbmdlbnQzYnZFWFQpCisjZGVmaW5lIGdsVGFuZ2VudDNkRVhUCQlNQU5HTEUoVGFuZ2VudDNkRVhUKQorI2RlZmluZSBnbFRhbmdlbnQzZHZFWFQJCU1BTkdMRShUYW5nZW50M2R2RVhUKQorI2RlZmluZSBnbFRhbmdlbnQzZkVYVAkJTUFOR0xFKFRhbmdlbnQzZkVYVCkKKyNkZWZpbmUgZ2xUYW5nZW50M2Z2RVhUCQlNQU5HTEUoVGFuZ2VudDNmdkVYVCkKKyNkZWZpbmUgZ2xUYW5nZW50M2lFWFQJCU1BTkdMRShUYW5nZW50M2lFWFQpCisjZGVmaW5lIGdsVGFuZ2VudDNpdkVYVAkJTUFOR0xFKFRhbmdlbnQzaXZFWFQpCisjZGVmaW5lIGdsVGFuZ2VudDNzRVhUCQlNQU5HTEUoVGFuZ2VudDNzRVhUKQorI2RlZmluZSBnbFRhbmdlbnQzc3ZFWFQJCU1BTkdMRShUYW5nZW50M3N2RVhUKQorI2RlZmluZSBnbFRhbmdlbnRQb2ludGVyRVhUCQlNQU5HTEUoVGFuZ2VudFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsVGJ1ZmZlck1hc2szREZYCQlNQU5HTEUoVGJ1ZmZlck1hc2szREZYKQorI2RlZmluZSBnbFRlc3NlbGxhdGlvbkZhY3RvckFNRAkJTUFOR0xFKFRlc3NlbGxhdGlvbkZhY3RvckFNRCkKKyNkZWZpbmUgZ2xUZXNzZWxsYXRpb25Nb2RlQU1ECQlNQU5HTEUoVGVzc2VsbGF0aW9uTW9kZUFNRCkKKyNkZWZpbmUgZ2xUZXN0RmVuY2VBUFBMRQkJTUFOR0xFKFRlc3RGZW5jZUFQUExFKQorI2RlZmluZSBnbFRlc3RGZW5jZU5WCQlNQU5HTEUoVGVzdEZlbmNlTlYpCisjZGVmaW5lIGdsVGVzdE9iamVjdEFQUExFCQlNQU5HTEUoVGVzdE9iamVjdEFQUExFKQorI2RlZmluZSBnbFRleEJ1ZmZlckFSQgkJTUFOR0xFKFRleEJ1ZmZlckFSQikKKyNkZWZpbmUgZ2xUZXhCdWZmZXJFWFQJCU1BTkdMRShUZXhCdWZmZXJFWFQpCisjZGVmaW5lIGdsVGV4QnVmZmVyCQlNQU5HTEUoVGV4QnVmZmVyKQorI2RlZmluZSBnbFRleEJ1bXBQYXJhbWV0ZXJmdkFUSQkJTUFOR0xFKFRleEJ1bXBQYXJhbWV0ZXJmdkFUSSkKKyNkZWZpbmUgZ2xUZXhCdW1wUGFyYW1ldGVyaXZBVEkJCU1BTkdMRShUZXhCdW1wUGFyYW1ldGVyaXZBVEkpCisjZGVmaW5lIGdsVGV4Q29vcmQxZAkJTUFOR0xFKFRleENvb3JkMWQpCisjZGVmaW5lIGdsVGV4Q29vcmQxZHYJCU1BTkdMRShUZXhDb29yZDFkdikKKyNkZWZpbmUgZ2xUZXhDb29yZDFmCQlNQU5HTEUoVGV4Q29vcmQxZikKKyNkZWZpbmUgZ2xUZXhDb29yZDFmdgkJTUFOR0xFKFRleENvb3JkMWZ2KQorI2RlZmluZSBnbFRleENvb3JkMWhOVgkJTUFOR0xFKFRleENvb3JkMWhOVikKKyNkZWZpbmUgZ2xUZXhDb29yZDFodk5WCQlNQU5HTEUoVGV4Q29vcmQxaHZOVikKKyNkZWZpbmUgZ2xUZXhDb29yZDFpCQlNQU5HTEUoVGV4Q29vcmQxaSkKKyNkZWZpbmUgZ2xUZXhDb29yZDFpdgkJTUFOR0xFKFRleENvb3JkMWl2KQorI2RlZmluZSBnbFRleENvb3JkMXMJCU1BTkdMRShUZXhDb29yZDFzKQorI2RlZmluZSBnbFRleENvb3JkMXN2CQlNQU5HTEUoVGV4Q29vcmQxc3YpCisjZGVmaW5lIGdsVGV4Q29vcmQyZAkJTUFOR0xFKFRleENvb3JkMmQpCisjZGVmaW5lIGdsVGV4Q29vcmQyZHYJCU1BTkdMRShUZXhDb29yZDJkdikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmQ29sb3IzZlZlcnRleDNmU1VOCQlNQU5HTEUoVGV4Q29vcmQyZkNvbG9yM2ZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmQ29sb3IzZlZlcnRleDNmdlNVTgkJTUFOR0xFKFRleENvb3JkMmZDb2xvcjNmVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbFRleENvb3JkMmZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTgkJTUFOR0xFKFRleENvb3JkMmZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOCQlNQU5HTEUoVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmQ29sb3I0dWJWZXJ0ZXgzZlNVTgkJTUFOR0xFKFRleENvb3JkMmZDb2xvcjR1YlZlcnRleDNmU1VOKQorI2RlZmluZSBnbFRleENvb3JkMmZDb2xvcjR1YlZlcnRleDNmdlNVTgkJTUFOR0xFKFRleENvb3JkMmZDb2xvcjR1YlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmCQlNQU5HTEUoVGV4Q29vcmQyZikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmTm9ybWFsM2ZWZXJ0ZXgzZlNVTgkJTUFOR0xFKFRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmU1VOKQorI2RlZmluZSBnbFRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmdlNVTgkJTUFOR0xFKFRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmVmVydGV4M2ZTVU4JCU1BTkdMRShUZXhDb29yZDJmVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsVGV4Q29vcmQyZlZlcnRleDNmdlNVTgkJTUFOR0xFKFRleENvb3JkMmZWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsVGV4Q29vcmQyZnYJCU1BTkdMRShUZXhDb29yZDJmdikKKyNkZWZpbmUgZ2xUZXhDb29yZDJoTlYJCU1BTkdMRShUZXhDb29yZDJoTlYpCisjZGVmaW5lIGdsVGV4Q29vcmQyaHZOVgkJTUFOR0xFKFRleENvb3JkMmh2TlYpCisjZGVmaW5lIGdsVGV4Q29vcmQyaQkJTUFOR0xFKFRleENvb3JkMmkpCisjZGVmaW5lIGdsVGV4Q29vcmQyaXYJCU1BTkdMRShUZXhDb29yZDJpdikKKyNkZWZpbmUgZ2xUZXhDb29yZDJzCQlNQU5HTEUoVGV4Q29vcmQycykKKyNkZWZpbmUgZ2xUZXhDb29yZDJzdgkJTUFOR0xFKFRleENvb3JkMnN2KQorI2RlZmluZSBnbFRleENvb3JkM2QJCU1BTkdMRShUZXhDb29yZDNkKQorI2RlZmluZSBnbFRleENvb3JkM2R2CQlNQU5HTEUoVGV4Q29vcmQzZHYpCisjZGVmaW5lIGdsVGV4Q29vcmQzZgkJTUFOR0xFKFRleENvb3JkM2YpCisjZGVmaW5lIGdsVGV4Q29vcmQzZnYJCU1BTkdMRShUZXhDb29yZDNmdikKKyNkZWZpbmUgZ2xUZXhDb29yZDNoTlYJCU1BTkdMRShUZXhDb29yZDNoTlYpCisjZGVmaW5lIGdsVGV4Q29vcmQzaHZOVgkJTUFOR0xFKFRleENvb3JkM2h2TlYpCisjZGVmaW5lIGdsVGV4Q29vcmQzaQkJTUFOR0xFKFRleENvb3JkM2kpCisjZGVmaW5lIGdsVGV4Q29vcmQzaXYJCU1BTkdMRShUZXhDb29yZDNpdikKKyNkZWZpbmUgZ2xUZXhDb29yZDNzCQlNQU5HTEUoVGV4Q29vcmQzcykKKyNkZWZpbmUgZ2xUZXhDb29yZDNzdgkJTUFOR0xFKFRleENvb3JkM3N2KQorI2RlZmluZSBnbFRleENvb3JkNGQJCU1BTkdMRShUZXhDb29yZDRkKQorI2RlZmluZSBnbFRleENvb3JkNGR2CQlNQU5HTEUoVGV4Q29vcmQ0ZHYpCisjZGVmaW5lIGdsVGV4Q29vcmQ0ZkNvbG9yNGZOb3JtYWwzZlZlcnRleDRmU1VOCQlNQU5HTEUoVGV4Q29vcmQ0ZkNvbG9yNGZOb3JtYWwzZlZlcnRleDRmU1VOKQorI2RlZmluZSBnbFRleENvb3JkNGZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXg0ZnZTVU4JCU1BTkdMRShUZXhDb29yZDRmQ29sb3I0Zk5vcm1hbDNmVmVydGV4NGZ2U1VOKQorI2RlZmluZSBnbFRleENvb3JkNGYJCU1BTkdMRShUZXhDb29yZDRmKQorI2RlZmluZSBnbFRleENvb3JkNGZWZXJ0ZXg0ZlNVTgkJTUFOR0xFKFRleENvb3JkNGZWZXJ0ZXg0ZlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDRmVmVydGV4NGZ2U1VOCQlNQU5HTEUoVGV4Q29vcmQ0ZlZlcnRleDRmdlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDRmdgkJTUFOR0xFKFRleENvb3JkNGZ2KQorI2RlZmluZSBnbFRleENvb3JkNGhOVgkJTUFOR0xFKFRleENvb3JkNGhOVikKKyNkZWZpbmUgZ2xUZXhDb29yZDRodk5WCQlNQU5HTEUoVGV4Q29vcmQ0aHZOVikKKyNkZWZpbmUgZ2xUZXhDb29yZDRpCQlNQU5HTEUoVGV4Q29vcmQ0aSkKKyNkZWZpbmUgZ2xUZXhDb29yZDRpdgkJTUFOR0xFKFRleENvb3JkNGl2KQorI2RlZmluZSBnbFRleENvb3JkNHMJCU1BTkdMRShUZXhDb29yZDRzKQorI2RlZmluZSBnbFRleENvb3JkNHN2CQlNQU5HTEUoVGV4Q29vcmQ0c3YpCisjZGVmaW5lIGdsVGV4Q29vcmRGb3JtYXROVgkJTUFOR0xFKFRleENvb3JkRm9ybWF0TlYpCisjZGVmaW5lIGdsVGV4Q29vcmRQMXVpCQlNQU5HTEUoVGV4Q29vcmRQMXVpKQorI2RlZmluZSBnbFRleENvb3JkUDF1aXYJCU1BTkdMRShUZXhDb29yZFAxdWl2KQorI2RlZmluZSBnbFRleENvb3JkUDJ1aQkJTUFOR0xFKFRleENvb3JkUDJ1aSkKKyNkZWZpbmUgZ2xUZXhDb29yZFAydWl2CQlNQU5HTEUoVGV4Q29vcmRQMnVpdikKKyNkZWZpbmUgZ2xUZXhDb29yZFAzdWkJCU1BTkdMRShUZXhDb29yZFAzdWkpCisjZGVmaW5lIGdsVGV4Q29vcmRQM3VpdgkJTUFOR0xFKFRleENvb3JkUDN1aXYpCisjZGVmaW5lIGdsVGV4Q29vcmRQNHVpCQlNQU5HTEUoVGV4Q29vcmRQNHVpKQorI2RlZmluZSBnbFRleENvb3JkUDR1aXYJCU1BTkdMRShUZXhDb29yZFA0dWl2KQorI2RlZmluZSBnbFRleENvb3JkUG9pbnRlckVYVAkJTUFOR0xFKFRleENvb3JkUG9pbnRlckVYVCkKKyNkZWZpbmUgZ2xUZXhDb29yZFBvaW50ZXJMaXN0SUJNCQlNQU5HTEUoVGV4Q29vcmRQb2ludGVyTGlzdElCTSkKKyNkZWZpbmUgZ2xUZXhDb29yZFBvaW50ZXIJCU1BTkdMRShUZXhDb29yZFBvaW50ZXIpCisjZGVmaW5lIGdsVGV4Q29vcmRQb2ludGVydklOVEVMCQlNQU5HTEUoVGV4Q29vcmRQb2ludGVydklOVEVMKQorI2RlZmluZSBnbFRleEVudmYJCU1BTkdMRShUZXhFbnZmKQorI2RlZmluZSBnbFRleEVudmZ2CQlNQU5HTEUoVGV4RW52ZnYpCisjZGVmaW5lIGdsVGV4RW52aQkJTUFOR0xFKFRleEVudmkpCisjZGVmaW5lIGdsVGV4RW52aXYJCU1BTkdMRShUZXhFbnZpdikKKyNkZWZpbmUgZ2xUZXhGaWx0ZXJGdW5jU0dJUwkJTUFOR0xFKFRleEZpbHRlckZ1bmNTR0lTKQorI2RlZmluZSBnbFRleEdlbmQJCU1BTkdMRShUZXhHZW5kKQorI2RlZmluZSBnbFRleEdlbmR2CQlNQU5HTEUoVGV4R2VuZHYpCisjZGVmaW5lIGdsVGV4R2VuZgkJTUFOR0xFKFRleEdlbmYpCisjZGVmaW5lIGdsVGV4R2VuZnYJCU1BTkdMRShUZXhHZW5mdikKKyNkZWZpbmUgZ2xUZXhHZW5pCQlNQU5HTEUoVGV4R2VuaSkKKyNkZWZpbmUgZ2xUZXhHZW5pdgkJTUFOR0xFKFRleEdlbml2KQorI2RlZmluZSBnbFRleEltYWdlMUQJCU1BTkdMRShUZXhJbWFnZTFEKQorI2RlZmluZSBnbFRleEltYWdlMkQJCU1BTkdMRShUZXhJbWFnZTJEKQorI2RlZmluZSBnbFRleEltYWdlMkRNdWx0aXNhbXBsZQkJTUFOR0xFKFRleEltYWdlMkRNdWx0aXNhbXBsZSkKKyNkZWZpbmUgZ2xUZXhJbWFnZTNERVhUCQlNQU5HTEUoVGV4SW1hZ2UzREVYVCkKKyNkZWZpbmUgZ2xUZXhJbWFnZTNECQlNQU5HTEUoVGV4SW1hZ2UzRCkKKyNkZWZpbmUgZ2xUZXhJbWFnZTNETXVsdGlzYW1wbGUJCU1BTkdMRShUZXhJbWFnZTNETXVsdGlzYW1wbGUpCisjZGVmaW5lIGdsVGV4SW1hZ2U0RFNHSVMJCU1BTkdMRShUZXhJbWFnZTREU0dJUykKKyNkZWZpbmUgZ2xUZXhQYXJhbWV0ZXJmCQlNQU5HTEUoVGV4UGFyYW1ldGVyZikKKyNkZWZpbmUgZ2xUZXhQYXJhbWV0ZXJmdgkJTUFOR0xFKFRleFBhcmFtZXRlcmZ2KQorI2RlZmluZSBnbFRleFBhcmFtZXRlcklpdkVYVAkJTUFOR0xFKFRleFBhcmFtZXRlcklpdkVYVCkKKyNkZWZpbmUgZ2xUZXhQYXJhbWV0ZXJJaXYJCU1BTkdMRShUZXhQYXJhbWV0ZXJJaXYpCisjZGVmaW5lIGdsVGV4UGFyYW1ldGVyaQkJTUFOR0xFKFRleFBhcmFtZXRlcmkpCisjZGVmaW5lIGdsVGV4UGFyYW1ldGVySXVpdkVYVAkJTUFOR0xFKFRleFBhcmFtZXRlckl1aXZFWFQpCisjZGVmaW5lIGdsVGV4UGFyYW1ldGVySXVpdgkJTUFOR0xFKFRleFBhcmFtZXRlckl1aXYpCisjZGVmaW5lIGdsVGV4UGFyYW1ldGVyaXYJCU1BTkdMRShUZXhQYXJhbWV0ZXJpdikKKyNkZWZpbmUgZ2xUZXhSZW5kZXJidWZmZXJOVgkJTUFOR0xFKFRleFJlbmRlcmJ1ZmZlck5WKQorI2RlZmluZSBnbFRleFN1YkltYWdlMURFWFQJCU1BTkdMRShUZXhTdWJJbWFnZTFERVhUKQorI2RlZmluZSBnbFRleFN1YkltYWdlMUQJCU1BTkdMRShUZXhTdWJJbWFnZTFEKQorI2RlZmluZSBnbFRleFN1YkltYWdlMkRFWFQJCU1BTkdMRShUZXhTdWJJbWFnZTJERVhUKQorI2RlZmluZSBnbFRleFN1YkltYWdlMkQJCU1BTkdMRShUZXhTdWJJbWFnZTJEKQorI2RlZmluZSBnbFRleFN1YkltYWdlM0RFWFQJCU1BTkdMRShUZXhTdWJJbWFnZTNERVhUKQorI2RlZmluZSBnbFRleFN1YkltYWdlM0QJCU1BTkdMRShUZXhTdWJJbWFnZTNEKQorI2RlZmluZSBnbFRleFN1YkltYWdlNERTR0lTCQlNQU5HTEUoVGV4U3ViSW1hZ2U0RFNHSVMpCisjZGVmaW5lIGdsVGV4dHVyZUJhcnJpZXJOVgkJTUFOR0xFKFRleHR1cmVCYXJyaWVyTlYpCisjZGVmaW5lIGdsVGV4dHVyZUJ1ZmZlckVYVAkJTUFOR0xFKFRleHR1cmVCdWZmZXJFWFQpCisjZGVmaW5lIGdsVGV4dHVyZUNvbG9yTWFza1NHSVMJCU1BTkdMRShUZXh0dXJlQ29sb3JNYXNrU0dJUykKKyNkZWZpbmUgZ2xUZXh0dXJlSW1hZ2UxREVYVAkJTUFOR0xFKFRleHR1cmVJbWFnZTFERVhUKQorI2RlZmluZSBnbFRleHR1cmVJbWFnZTJERVhUCQlNQU5HTEUoVGV4dHVyZUltYWdlMkRFWFQpCisjZGVmaW5lIGdsVGV4dHVyZUltYWdlM0RFWFQJCU1BTkdMRShUZXh0dXJlSW1hZ2UzREVYVCkKKyNkZWZpbmUgZ2xUZXh0dXJlTGlnaHRFWFQJCU1BTkdMRShUZXh0dXJlTGlnaHRFWFQpCisjZGVmaW5lIGdsVGV4dHVyZU1hdGVyaWFsRVhUCQlNQU5HTEUoVGV4dHVyZU1hdGVyaWFsRVhUKQorI2RlZmluZSBnbFRleHR1cmVOb3JtYWxFWFQJCU1BTkdMRShUZXh0dXJlTm9ybWFsRVhUKQorI2RlZmluZSBnbFRleHR1cmVQYXJhbWV0ZXJmRVhUCQlNQU5HTEUoVGV4dHVyZVBhcmFtZXRlcmZFWFQpCisjZGVmaW5lIGdsVGV4dHVyZVBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoVGV4dHVyZVBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbFRleHR1cmVQYXJhbWV0ZXJpRVhUCQlNQU5HTEUoVGV4dHVyZVBhcmFtZXRlcmlFWFQpCisjZGVmaW5lIGdsVGV4dHVyZVBhcmFtZXRlcklpdkVYVAkJTUFOR0xFKFRleHR1cmVQYXJhbWV0ZXJJaXZFWFQpCisjZGVmaW5lIGdsVGV4dHVyZVBhcmFtZXRlckl1aXZFWFQJCU1BTkdMRShUZXh0dXJlUGFyYW1ldGVySXVpdkVYVCkKKyNkZWZpbmUgZ2xUZXh0dXJlUGFyYW1ldGVyaXZFWFQJCU1BTkdMRShUZXh0dXJlUGFyYW1ldGVyaXZFWFQpCisjZGVmaW5lIGdsVGV4dHVyZVJhbmdlQVBQTEUJCU1BTkdMRShUZXh0dXJlUmFuZ2VBUFBMRSkKKyNkZWZpbmUgZ2xUZXh0dXJlUmVuZGVyYnVmZmVyRVhUCQlNQU5HTEUoVGV4dHVyZVJlbmRlcmJ1ZmZlckVYVCkKKyNkZWZpbmUgZ2xUZXh0dXJlU3ViSW1hZ2UxREVYVAkJTUFOR0xFKFRleHR1cmVTdWJJbWFnZTFERVhUKQorI2RlZmluZSBnbFRleHR1cmVTdWJJbWFnZTJERVhUCQlNQU5HTEUoVGV4dHVyZVN1YkltYWdlMkRFWFQpCisjZGVmaW5lIGdsVGV4dHVyZVN1YkltYWdlM0RFWFQJCU1BTkdMRShUZXh0dXJlU3ViSW1hZ2UzREVYVCkKKyNkZWZpbmUgZ2xUcmFja01hdHJpeE5WCQlNQU5HTEUoVHJhY2tNYXRyaXhOVikKKyNkZWZpbmUgZ2xUcmFuc2Zvcm1GZWVkYmFja0F0dHJpYnNOVgkJTUFOR0xFKFRyYW5zZm9ybUZlZWRiYWNrQXR0cmlic05WKQorI2RlZmluZSBnbFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtQXR0cmlic05WCQlNQU5HTEUoVHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1BdHRyaWJzTlYpCisjZGVmaW5lIGdsVHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nc0VYVAkJTUFOR0xFKFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3NFWFQpCisjZGVmaW5lIGdsVHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncwkJTUFOR0xFKFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3MpCisjZGVmaW5lIGdsVHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nc05WCQlNQU5HTEUoVHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nc05WKQorI2RlZmluZSBnbFRyYW5zbGF0ZWQJCU1BTkdMRShUcmFuc2xhdGVkKQorI2RlZmluZSBnbFRyYW5zbGF0ZWYJCU1BTkdMRShUcmFuc2xhdGVmKQorI2RlZmluZSBnbFVuaWZvcm0xZAkJTUFOR0xFKFVuaWZvcm0xZCkKKyNkZWZpbmUgZ2xVbmlmb3JtMWR2CQlNQU5HTEUoVW5pZm9ybTFkdikKKyNkZWZpbmUgZ2xVbmlmb3JtMWZBUkIJCU1BTkdMRShVbmlmb3JtMWZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTFmCQlNQU5HTEUoVW5pZm9ybTFmKQorI2RlZmluZSBnbFVuaWZvcm0xZnZBUkIJCU1BTkdMRShVbmlmb3JtMWZ2QVJCKQorI2RlZmluZSBnbFVuaWZvcm0xZnYJCU1BTkdMRShVbmlmb3JtMWZ2KQorI2RlZmluZSBnbFVuaWZvcm0xaTY0TlYJCU1BTkdMRShVbmlmb3JtMWk2NE5WKQorI2RlZmluZSBnbFVuaWZvcm0xaTY0dk5WCQlNQU5HTEUoVW5pZm9ybTFpNjR2TlYpCisjZGVmaW5lIGdsVW5pZm9ybTFpQVJCCQlNQU5HTEUoVW5pZm9ybTFpQVJCKQorI2RlZmluZSBnbFVuaWZvcm0xaQkJTUFOR0xFKFVuaWZvcm0xaSkKKyNkZWZpbmUgZ2xVbmlmb3JtMWl2QVJCCQlNQU5HTEUoVW5pZm9ybTFpdkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtMWl2CQlNQU5HTEUoVW5pZm9ybTFpdikKKyNkZWZpbmUgZ2xVbmlmb3JtMXVpNjROVgkJTUFOR0xFKFVuaWZvcm0xdWk2NE5WKQorI2RlZmluZSBnbFVuaWZvcm0xdWk2NHZOVgkJTUFOR0xFKFVuaWZvcm0xdWk2NHZOVikKKyNkZWZpbmUgZ2xVbmlmb3JtMXVpRVhUCQlNQU5HTEUoVW5pZm9ybTF1aUVYVCkKKyNkZWZpbmUgZ2xVbmlmb3JtMXVpCQlNQU5HTEUoVW5pZm9ybTF1aSkKKyNkZWZpbmUgZ2xVbmlmb3JtMXVpdkVYVAkJTUFOR0xFKFVuaWZvcm0xdWl2RVhUKQorI2RlZmluZSBnbFVuaWZvcm0xdWl2CQlNQU5HTEUoVW5pZm9ybTF1aXYpCisjZGVmaW5lIGdsVW5pZm9ybTJkCQlNQU5HTEUoVW5pZm9ybTJkKQorI2RlZmluZSBnbFVuaWZvcm0yZHYJCU1BTkdMRShVbmlmb3JtMmR2KQorI2RlZmluZSBnbFVuaWZvcm0yZkFSQgkJTUFOR0xFKFVuaWZvcm0yZkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtMmYJCU1BTkdMRShVbmlmb3JtMmYpCisjZGVmaW5lIGdsVW5pZm9ybTJmdkFSQgkJTUFOR0xFKFVuaWZvcm0yZnZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTJmdgkJTUFOR0xFKFVuaWZvcm0yZnYpCisjZGVmaW5lIGdsVW5pZm9ybTJpNjROVgkJTUFOR0xFKFVuaWZvcm0yaTY0TlYpCisjZGVmaW5lIGdsVW5pZm9ybTJpNjR2TlYJCU1BTkdMRShVbmlmb3JtMmk2NHZOVikKKyNkZWZpbmUgZ2xVbmlmb3JtMmlBUkIJCU1BTkdMRShVbmlmb3JtMmlBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTJpCQlNQU5HTEUoVW5pZm9ybTJpKQorI2RlZmluZSBnbFVuaWZvcm0yaXZBUkIJCU1BTkdMRShVbmlmb3JtMml2QVJCKQorI2RlZmluZSBnbFVuaWZvcm0yaXYJCU1BTkdMRShVbmlmb3JtMml2KQorI2RlZmluZSBnbFVuaWZvcm0ydWk2NE5WCQlNQU5HTEUoVW5pZm9ybTJ1aTY0TlYpCisjZGVmaW5lIGdsVW5pZm9ybTJ1aTY0dk5WCQlNQU5HTEUoVW5pZm9ybTJ1aTY0dk5WKQorI2RlZmluZSBnbFVuaWZvcm0ydWlFWFQJCU1BTkdMRShVbmlmb3JtMnVpRVhUKQorI2RlZmluZSBnbFVuaWZvcm0ydWkJCU1BTkdMRShVbmlmb3JtMnVpKQorI2RlZmluZSBnbFVuaWZvcm0ydWl2RVhUCQlNQU5HTEUoVW5pZm9ybTJ1aXZFWFQpCisjZGVmaW5lIGdsVW5pZm9ybTJ1aXYJCU1BTkdMRShVbmlmb3JtMnVpdikKKyNkZWZpbmUgZ2xVbmlmb3JtM2QJCU1BTkdMRShVbmlmb3JtM2QpCisjZGVmaW5lIGdsVW5pZm9ybTNkdgkJTUFOR0xFKFVuaWZvcm0zZHYpCisjZGVmaW5lIGdsVW5pZm9ybTNmQVJCCQlNQU5HTEUoVW5pZm9ybTNmQVJCKQorI2RlZmluZSBnbFVuaWZvcm0zZgkJTUFOR0xFKFVuaWZvcm0zZikKKyNkZWZpbmUgZ2xVbmlmb3JtM2Z2QVJCCQlNQU5HTEUoVW5pZm9ybTNmdkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtM2Z2CQlNQU5HTEUoVW5pZm9ybTNmdikKKyNkZWZpbmUgZ2xVbmlmb3JtM2k2NE5WCQlNQU5HTEUoVW5pZm9ybTNpNjROVikKKyNkZWZpbmUgZ2xVbmlmb3JtM2k2NHZOVgkJTUFOR0xFKFVuaWZvcm0zaTY0dk5WKQorI2RlZmluZSBnbFVuaWZvcm0zaUFSQgkJTUFOR0xFKFVuaWZvcm0zaUFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtM2kJCU1BTkdMRShVbmlmb3JtM2kpCisjZGVmaW5lIGdsVW5pZm9ybTNpdkFSQgkJTUFOR0xFKFVuaWZvcm0zaXZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTNpdgkJTUFOR0xFKFVuaWZvcm0zaXYpCisjZGVmaW5lIGdsVW5pZm9ybTN1aTY0TlYJCU1BTkdMRShVbmlmb3JtM3VpNjROVikKKyNkZWZpbmUgZ2xVbmlmb3JtM3VpNjR2TlYJCU1BTkdMRShVbmlmb3JtM3VpNjR2TlYpCisjZGVmaW5lIGdsVW5pZm9ybTN1aUVYVAkJTUFOR0xFKFVuaWZvcm0zdWlFWFQpCisjZGVmaW5lIGdsVW5pZm9ybTN1aQkJTUFOR0xFKFVuaWZvcm0zdWkpCisjZGVmaW5lIGdsVW5pZm9ybTN1aXZFWFQJCU1BTkdMRShVbmlmb3JtM3VpdkVYVCkKKyNkZWZpbmUgZ2xVbmlmb3JtM3VpdgkJTUFOR0xFKFVuaWZvcm0zdWl2KQorI2RlZmluZSBnbFVuaWZvcm00ZAkJTUFOR0xFKFVuaWZvcm00ZCkKKyNkZWZpbmUgZ2xVbmlmb3JtNGR2CQlNQU5HTEUoVW5pZm9ybTRkdikKKyNkZWZpbmUgZ2xVbmlmb3JtNGZBUkIJCU1BTkdMRShVbmlmb3JtNGZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTRmCQlNQU5HTEUoVW5pZm9ybTRmKQorI2RlZmluZSBnbFVuaWZvcm00ZnZBUkIJCU1BTkdMRShVbmlmb3JtNGZ2QVJCKQorI2RlZmluZSBnbFVuaWZvcm00ZnYJCU1BTkdMRShVbmlmb3JtNGZ2KQorI2RlZmluZSBnbFVuaWZvcm00aTY0TlYJCU1BTkdMRShVbmlmb3JtNGk2NE5WKQorI2RlZmluZSBnbFVuaWZvcm00aTY0dk5WCQlNQU5HTEUoVW5pZm9ybTRpNjR2TlYpCisjZGVmaW5lIGdsVW5pZm9ybTRpQVJCCQlNQU5HTEUoVW5pZm9ybTRpQVJCKQorI2RlZmluZSBnbFVuaWZvcm00aQkJTUFOR0xFKFVuaWZvcm00aSkKKyNkZWZpbmUgZ2xVbmlmb3JtNGl2QVJCCQlNQU5HTEUoVW5pZm9ybTRpdkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtNGl2CQlNQU5HTEUoVW5pZm9ybTRpdikKKyNkZWZpbmUgZ2xVbmlmb3JtNHVpNjROVgkJTUFOR0xFKFVuaWZvcm00dWk2NE5WKQorI2RlZmluZSBnbFVuaWZvcm00dWk2NHZOVgkJTUFOR0xFKFVuaWZvcm00dWk2NHZOVikKKyNkZWZpbmUgZ2xVbmlmb3JtNHVpRVhUCQlNQU5HTEUoVW5pZm9ybTR1aUVYVCkKKyNkZWZpbmUgZ2xVbmlmb3JtNHVpCQlNQU5HTEUoVW5pZm9ybTR1aSkKKyNkZWZpbmUgZ2xVbmlmb3JtNHVpdkVYVAkJTUFOR0xFKFVuaWZvcm00dWl2RVhUKQorI2RlZmluZSBnbFVuaWZvcm00dWl2CQlNQU5HTEUoVW5pZm9ybTR1aXYpCisjZGVmaW5lIGdsVW5pZm9ybUJsb2NrQmluZGluZwkJTUFOR0xFKFVuaWZvcm1CbG9ja0JpbmRpbmcpCisjZGVmaW5lIGdsVW5pZm9ybUJ1ZmZlckVYVAkJTUFOR0xFKFVuaWZvcm1CdWZmZXJFWFQpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDJkdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXgyZHYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDJmdkFSQgkJTUFOR0xFKFVuaWZvcm1NYXRyaXgyZnZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDJmdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXgyZnYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDJ4M2R2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDJ4M2R2KQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgyeDNmdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXgyeDNmdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4Mng0ZHYJCU1BTkdMRShVbmlmb3JtTWF0cml4Mng0ZHYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDJ4NGZ2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDJ4NGZ2KQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgzZHYJCU1BTkdMRShVbmlmb3JtTWF0cml4M2R2KQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgzZnZBUkIJCU1BTkdMRShVbmlmb3JtTWF0cml4M2Z2QVJCKQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgzZnYJCU1BTkdMRShVbmlmb3JtTWF0cml4M2Z2KQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgzeDJkdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXgzeDJkdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4M3gyZnYJCU1BTkdMRShVbmlmb3JtTWF0cml4M3gyZnYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDN4NGR2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDN4NGR2KQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgzeDRmdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXgzeDRmdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4NGR2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDRkdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4NGZ2QVJCCQlNQU5HTEUoVW5pZm9ybU1hdHJpeDRmdkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4NGZ2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDRmdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4NHgyZHYJCU1BTkdMRShVbmlmb3JtTWF0cml4NHgyZHYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDR4MmZ2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDR4MmZ2KQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXg0eDNkdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXg0eDNkdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4NHgzZnYJCU1BTkdMRShVbmlmb3JtTWF0cml4NHgzZnYpCisjZGVmaW5lIGdsVW5pZm9ybVN1YnJvdXRpbmVzdWl2CQlNQU5HTEUoVW5pZm9ybVN1YnJvdXRpbmVzdWl2KQorI2RlZmluZSBnbFVuaWZvcm11aTY0TlYJCU1BTkdMRShVbmlmb3JtdWk2NE5WKQorI2RlZmluZSBnbFVuaWZvcm11aTY0dk5WCQlNQU5HTEUoVW5pZm9ybXVpNjR2TlYpCisjZGVmaW5lIGdsVW5sb2NrQXJyYXlzRVhUCQlNQU5HTEUoVW5sb2NrQXJyYXlzRVhUKQorI2RlZmluZSBnbFVubWFwQnVmZmVyQVJCCQlNQU5HTEUoVW5tYXBCdWZmZXJBUkIpCisjZGVmaW5lIGdsVW5tYXBCdWZmZXIJCU1BTkdMRShVbm1hcEJ1ZmZlcikKKyNkZWZpbmUgZ2xVbm1hcE5hbWVkQnVmZmVyRVhUCQlNQU5HTEUoVW5tYXBOYW1lZEJ1ZmZlckVYVCkKKyNkZWZpbmUgZ2xVbm1hcE9iamVjdEJ1ZmZlckFUSQkJTUFOR0xFKFVubWFwT2JqZWN0QnVmZmVyQVRJKQorI2RlZmluZSBnbFVwZGF0ZU9iamVjdEJ1ZmZlckFUSQkJTUFOR0xFKFVwZGF0ZU9iamVjdEJ1ZmZlckFUSSkKKyNkZWZpbmUgZ2xVc2VQcm9ncmFtCQlNQU5HTEUoVXNlUHJvZ3JhbSkKKyNkZWZpbmUgZ2xVc2VQcm9ncmFtT2JqZWN0QVJCCQlNQU5HTEUoVXNlUHJvZ3JhbU9iamVjdEFSQikKKyNkZWZpbmUgZ2xVc2VQcm9ncmFtU3RhZ2VzCQlNQU5HTEUoVXNlUHJvZ3JhbVN0YWdlcykKKyNkZWZpbmUgZ2xVc2VTaGFkZXJQcm9ncmFtRVhUCQlNQU5HTEUoVXNlU2hhZGVyUHJvZ3JhbUVYVCkKKyNkZWZpbmUgZ2xWYWxpZGF0ZVByb2dyYW1BUkIJCU1BTkdMRShWYWxpZGF0ZVByb2dyYW1BUkIpCisjZGVmaW5lIGdsVmFsaWRhdGVQcm9ncmFtCQlNQU5HTEUoVmFsaWRhdGVQcm9ncmFtKQorI2RlZmluZSBnbFZhbGlkYXRlUHJvZ3JhbVBpcGVsaW5lCQlNQU5HTEUoVmFsaWRhdGVQcm9ncmFtUGlwZWxpbmUpCisjZGVmaW5lIGdsVmFyaWFudEFycmF5T2JqZWN0QVRJCQlNQU5HTEUoVmFyaWFudEFycmF5T2JqZWN0QVRJKQorI2RlZmluZSBnbFZhcmlhbnRidkVYVAkJTUFOR0xFKFZhcmlhbnRidkVYVCkKKyNkZWZpbmUgZ2xWYXJpYW50ZHZFWFQJCU1BTkdMRShWYXJpYW50ZHZFWFQpCisjZGVmaW5lIGdsVmFyaWFudGZ2RVhUCQlNQU5HTEUoVmFyaWFudGZ2RVhUKQorI2RlZmluZSBnbFZhcmlhbnRpdkVYVAkJTUFOR0xFKFZhcmlhbnRpdkVYVCkKKyNkZWZpbmUgZ2xWYXJpYW50UG9pbnRlckVYVAkJTUFOR0xFKFZhcmlhbnRQb2ludGVyRVhUKQorI2RlZmluZSBnbFZhcmlhbnRzdkVYVAkJTUFOR0xFKFZhcmlhbnRzdkVYVCkKKyNkZWZpbmUgZ2xWYXJpYW50dWJ2RVhUCQlNQU5HTEUoVmFyaWFudHVidkVYVCkKKyNkZWZpbmUgZ2xWYXJpYW50dWl2RVhUCQlNQU5HTEUoVmFyaWFudHVpdkVYVCkKKyNkZWZpbmUgZ2xWYXJpYW50dXN2RVhUCQlNQU5HTEUoVmFyaWFudHVzdkVYVCkKKyNkZWZpbmUgZ2xWRFBBVUZpbmlOVgkJTUFOR0xFKFZEUEFVRmluaU5WKQorI2RlZmluZSBnbFZEUEFVR2V0U3VyZmFjZWl2TlYJCU1BTkdMRShWRFBBVUdldFN1cmZhY2Vpdk5WKQorI2RlZmluZSBnbFZEUEFVSW5pdE5WCQlNQU5HTEUoVkRQQVVJbml0TlYpCisjZGVmaW5lIGdsVkRQQVVJc1N1cmZhY2VOVgkJTUFOR0xFKFZEUEFVSXNTdXJmYWNlTlYpCisjZGVmaW5lIGdsVkRQQVVNYXBTdXJmYWNlc05WCQlNQU5HTEUoVkRQQVVNYXBTdXJmYWNlc05WKQorI2RlZmluZSBnbFZEUEFVUmVnaXN0ZXJPdXRwdXRTdXJmYWNlTlYJCU1BTkdMRShWRFBBVVJlZ2lzdGVyT3V0cHV0U3VyZmFjZU5WKQorI2RlZmluZSBnbFZEUEFVUmVnaXN0ZXJWaWRlb1N1cmZhY2VOVgkJTUFOR0xFKFZEUEFVUmVnaXN0ZXJWaWRlb1N1cmZhY2VOVikKKyNkZWZpbmUgZ2xWRFBBVVN1cmZhY2VBY2Nlc3NOVgkJTUFOR0xFKFZEUEFVU3VyZmFjZUFjY2Vzc05WKQorI2RlZmluZSBnbFZEUEFVVW5tYXBTdXJmYWNlc05WCQlNQU5HTEUoVkRQQVVVbm1hcFN1cmZhY2VzTlYpCisjZGVmaW5lIGdsVkRQQVVVbnJlZ2lzdGVyU3VyZmFjZU5WCQlNQU5HTEUoVkRQQVVVbnJlZ2lzdGVyU3VyZmFjZU5WKQorI2RlZmluZSBnbFZlcnRleDJkCQlNQU5HTEUoVmVydGV4MmQpCisjZGVmaW5lIGdsVmVydGV4MmR2CQlNQU5HTEUoVmVydGV4MmR2KQorI2RlZmluZSBnbFZlcnRleDJmCQlNQU5HTEUoVmVydGV4MmYpCisjZGVmaW5lIGdsVmVydGV4MmZ2CQlNQU5HTEUoVmVydGV4MmZ2KQorI2RlZmluZSBnbFZlcnRleDJoTlYJCU1BTkdMRShWZXJ0ZXgyaE5WKQorI2RlZmluZSBnbFZlcnRleDJodk5WCQlNQU5HTEUoVmVydGV4Mmh2TlYpCisjZGVmaW5lIGdsVmVydGV4MmkJCU1BTkdMRShWZXJ0ZXgyaSkKKyNkZWZpbmUgZ2xWZXJ0ZXgyaXYJCU1BTkdMRShWZXJ0ZXgyaXYpCisjZGVmaW5lIGdsVmVydGV4MnMJCU1BTkdMRShWZXJ0ZXgycykKKyNkZWZpbmUgZ2xWZXJ0ZXgyc3YJCU1BTkdMRShWZXJ0ZXgyc3YpCisjZGVmaW5lIGdsVmVydGV4M2QJCU1BTkdMRShWZXJ0ZXgzZCkKKyNkZWZpbmUgZ2xWZXJ0ZXgzZHYJCU1BTkdMRShWZXJ0ZXgzZHYpCisjZGVmaW5lIGdsVmVydGV4M2YJCU1BTkdMRShWZXJ0ZXgzZikKKyNkZWZpbmUgZ2xWZXJ0ZXgzZnYJCU1BTkdMRShWZXJ0ZXgzZnYpCisjZGVmaW5lIGdsVmVydGV4M2hOVgkJTUFOR0xFKFZlcnRleDNoTlYpCisjZGVmaW5lIGdsVmVydGV4M2h2TlYJCU1BTkdMRShWZXJ0ZXgzaHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXgzaQkJTUFOR0xFKFZlcnRleDNpKQorI2RlZmluZSBnbFZlcnRleDNpdgkJTUFOR0xFKFZlcnRleDNpdikKKyNkZWZpbmUgZ2xWZXJ0ZXgzcwkJTUFOR0xFKFZlcnRleDNzKQorI2RlZmluZSBnbFZlcnRleDNzdgkJTUFOR0xFKFZlcnRleDNzdikKKyNkZWZpbmUgZ2xWZXJ0ZXg0ZAkJTUFOR0xFKFZlcnRleDRkKQorI2RlZmluZSBnbFZlcnRleDRkdgkJTUFOR0xFKFZlcnRleDRkdikKKyNkZWZpbmUgZ2xWZXJ0ZXg0ZgkJTUFOR0xFKFZlcnRleDRmKQorI2RlZmluZSBnbFZlcnRleDRmdgkJTUFOR0xFKFZlcnRleDRmdikKKyNkZWZpbmUgZ2xWZXJ0ZXg0aE5WCQlNQU5HTEUoVmVydGV4NGhOVikKKyNkZWZpbmUgZ2xWZXJ0ZXg0aHZOVgkJTUFOR0xFKFZlcnRleDRodk5WKQorI2RlZmluZSBnbFZlcnRleDRpCQlNQU5HTEUoVmVydGV4NGkpCisjZGVmaW5lIGdsVmVydGV4NGl2CQlNQU5HTEUoVmVydGV4NGl2KQorI2RlZmluZSBnbFZlcnRleDRzCQlNQU5HTEUoVmVydGV4NHMpCisjZGVmaW5lIGdsVmVydGV4NHN2CQlNQU5HTEUoVmVydGV4NHN2KQorI2RlZmluZSBnbFZlcnRleEFycmF5UGFyYW1ldGVyaUFQUExFCQlNQU5HTEUoVmVydGV4QXJyYXlQYXJhbWV0ZXJpQVBQTEUpCisjZGVmaW5lIGdsVmVydGV4QXJyYXlSYW5nZUFQUExFCQlNQU5HTEUoVmVydGV4QXJyYXlSYW5nZUFQUExFKQorI2RlZmluZSBnbFZlcnRleEFycmF5UmFuZ2VOVgkJTUFOR0xFKFZlcnRleEFycmF5UmFuZ2VOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBcnJheVZlcnRleEF0dHJpYkxPZmZzZXRFWFQJCU1BTkdMRShWZXJ0ZXhBcnJheVZlcnRleEF0dHJpYkxPZmZzZXRFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWRBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxZEFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxZAkJTUFOR0xFKFZlcnRleEF0dHJpYjFkKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFkTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxZE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFkdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjFkdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxZHYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxZHYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWR2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxZHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxZkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjFmQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFmCQlNQU5HTEUoVmVydGV4QXR0cmliMWYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjFmTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWZ2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliMWZ2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFmdgkJTUFOR0xFKFZlcnRleEF0dHJpYjFmdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxZnZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjFmdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFoTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxaE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFodk5WCQlNQU5HTEUoVmVydGV4QXR0cmliMWh2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMXNBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxc0FSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxcwkJTUFOR0xFKFZlcnRleEF0dHJpYjFzKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFzTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxc05WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFzdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjFzdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxc3YJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxc3YpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMXN2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxc3ZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyZEFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjJkQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJkCQlNQU5HTEUoVmVydGV4QXR0cmliMmQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmROVgkJTUFOR0xFKFZlcnRleEF0dHJpYjJkTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmR2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliMmR2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJkdgkJTUFOR0xFKFZlcnRleEF0dHJpYjJkdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyZHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjJkdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJmQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliMmZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyZikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyZk5WCQlNQU5HTEUoVmVydGV4QXR0cmliMmZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyZnZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyZnZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmZ2CQlNQU5HTEUoVmVydGV4QXR0cmliMmZ2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJmdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliMmZ2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmhOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjJoTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmh2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyaHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyc0FSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjJzQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJzCQlNQU5HTEUoVmVydGV4QXR0cmliMnMpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMnNOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjJzTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMnN2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliMnN2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJzdgkJTUFOR0xFKFZlcnRleEF0dHJpYjJzdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyc3ZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjJzdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNkQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliM2RBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2QJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzZCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzZE5WCQlNQU5HTEUoVmVydGV4QXR0cmliM2ROVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzZHZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzZHZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2R2CQlNQU5HTEUoVmVydGV4QXR0cmliM2R2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNkdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliM2R2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2ZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzZkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzZgkJTUFOR0xFKFZlcnRleEF0dHJpYjNmKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNmTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzZk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNmdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjNmdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzZnYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzZnYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2Z2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzZnZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzaE5WCQlNQU5HTEUoVmVydGV4QXR0cmliM2hOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzaHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjNodk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNzQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliM3NBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM3MJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzcykKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzc05WCQlNQU5HTEUoVmVydGV4QXR0cmliM3NOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzc3ZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzc3ZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM3N2CQlNQU5HTEUoVmVydGV4QXR0cmliM3N2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNzdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliM3N2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGJ2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNGJ2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRidgkJTUFOR0xFKFZlcnRleEF0dHJpYjRidikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0ZEFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjRkQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRkCQlNQU5HTEUoVmVydGV4QXR0cmliNGQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGROVgkJTUFOR0xFKFZlcnRleEF0dHJpYjRkTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGR2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNGR2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRkdgkJTUFOR0xFKFZlcnRleEF0dHJpYjRkdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0ZHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjRkdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRmQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNGZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0ZikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0Zk5WCQlNQU5HTEUoVmVydGV4QXR0cmliNGZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0ZnZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0ZnZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGZ2CQlNQU5HTEUoVmVydGV4QXR0cmliNGZ2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRmdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliNGZ2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGhOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjRoTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGh2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0aHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0aXZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0aXZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGl2CQlNQU5HTEUoVmVydGV4QXR0cmliNGl2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROYnZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0TmJ2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROYnYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0TmJ2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROaXZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0Tml2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROaXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0Tml2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROc3ZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0TnN2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROc3YJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0TnN2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROdWJBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0TnViQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROdWIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0TnViKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROdWJ2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNE51YnZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE51YnYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0TnVidikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0TnVpdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjROdWl2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROdWl2CQlNQU5HTEUoVmVydGV4QXR0cmliNE51aXYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE51c3ZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0TnVzdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0TnVzdgkJTUFOR0xFKFZlcnRleEF0dHJpYjROdXN2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRzQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNHNBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHMJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0cykKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0c05WCQlNQU5HTEUoVmVydGV4QXR0cmliNHNOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0c3ZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0c3ZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHN2CQlNQU5HTEUoVmVydGV4QXR0cmliNHN2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRzdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliNHN2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHViTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0dWJOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0dWJ2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNHVidkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0dWJ2CQlNQU5HTEUoVmVydGV4QXR0cmliNHVidikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0dWJ2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0dWJ2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHVpdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjR1aXZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHVpdgkJTUFOR0xFKFZlcnRleEF0dHJpYjR1aXYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHVzdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjR1c3ZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHVzdgkJTUFOR0xFKFZlcnRleEF0dHJpYjR1c3YpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliQXJyYXlPYmplY3RBVEkJCU1BTkdMRShWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdEFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJEaXZpc29yQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliRGl2aXNvckFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJEaXZpc29yCQlNQU5HTEUoVmVydGV4QXR0cmliRGl2aXNvcikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJGb3JtYXROVgkJTUFOR0xFKFZlcnRleEF0dHJpYkZvcm1hdE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkxaUVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkxaUVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJMWkJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMWkpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTFpdkVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkxaXZFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTFpdgkJTUFOR0xFKFZlcnRleEF0dHJpYkkxaXYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTF1aUVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkxdWlFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTF1aQkJTUFOR0xFKFZlcnRleEF0dHJpYkkxdWkpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTF1aXZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMXVpdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJMXVpdgkJTUFOR0xFKFZlcnRleEF0dHJpYkkxdWl2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkyaUVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkyaUVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJMmkJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMmkpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTJpdkVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkyaXZFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTJpdgkJTUFOR0xFKFZlcnRleEF0dHJpYkkyaXYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTJ1aUVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkydWlFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTJ1aQkJTUFOR0xFKFZlcnRleEF0dHJpYkkydWkpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTJ1aXZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMnVpdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJMnVpdgkJTUFOR0xFKFZlcnRleEF0dHJpYkkydWl2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkzaUVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkzaUVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJM2kJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJM2kpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTNpdkVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkzaXZFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTNpdgkJTUFOR0xFKFZlcnRleEF0dHJpYkkzaXYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTN1aUVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkzdWlFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTN1aQkJTUFOR0xFKFZlcnRleEF0dHJpYkkzdWkpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTN1aXZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJM3VpdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJM3VpdgkJTUFOR0xFKFZlcnRleEF0dHJpYkkzdWl2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0YnZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNGJ2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0YnYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNGJ2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0aUVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkk0aUVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJNGkJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNGkpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTRpdkVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkk0aXZFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTRpdgkJTUFOR0xFKFZlcnRleEF0dHJpYkk0aXYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTRzdkVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkk0c3ZFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTRzdgkJTUFOR0xFKFZlcnRleEF0dHJpYkk0c3YpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTR1YnZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNHVidkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJNHVidgkJTUFOR0xFKFZlcnRleEF0dHJpYkk0dWJ2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0dWlFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNHVpRVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0dWkJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNHVpKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0dWl2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTR1aXZFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTR1aXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNHVpdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJNHVzdkVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkk0dXN2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0dXN2CQlNQU5HTEUoVmVydGV4QXR0cmliSTR1c3YpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSUZvcm1hdE5WCQlNQU5HTEUoVmVydGV4QXR0cmliSUZvcm1hdE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYklQb2ludGVyRVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSVBvaW50ZXJFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSVBvaW50ZXIJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJUG9pbnRlcikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMMWRFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMMWRFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDFkCQlNQU5HTEUoVmVydGV4QXR0cmliTDFkKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwxZHZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMMWR2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwxZHYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMMWR2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwxaTY0TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMMWk2NE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwxaTY0dk5WCQlNQU5HTEUoVmVydGV4QXR0cmliTDFpNjR2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDF1aTY0TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMMXVpNjROVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMMXVpNjR2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMMXVpNjR2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDJkRVhUCQlNQU5HTEUoVmVydGV4QXR0cmliTDJkRVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwyZAkJTUFOR0xFKFZlcnRleEF0dHJpYkwyZCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMMmR2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliTDJkdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMMmR2CQlNQU5HTEUoVmVydGV4QXR0cmliTDJkdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMMmk2NE5WCQlNQU5HTEUoVmVydGV4QXR0cmliTDJpNjROVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMMmk2NHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYkwyaTY0dk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwydWk2NE5WCQlNQU5HTEUoVmVydGV4QXR0cmliTDJ1aTY0TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDJ1aTY0dk5WCQlNQU5HTEUoVmVydGV4QXR0cmliTDJ1aTY0dk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwzZEVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkwzZEVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMM2QJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMM2QpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDNkdkVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkwzZHZFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDNkdgkJTUFOR0xFKFZlcnRleEF0dHJpYkwzZHYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDNpNjROVgkJTUFOR0xFKFZlcnRleEF0dHJpYkwzaTY0TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDNpNjR2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMM2k2NHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMM3VpNjROVgkJTUFOR0xFKFZlcnRleEF0dHJpYkwzdWk2NE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwzdWk2NHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYkwzdWk2NHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMNGRFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMNGRFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDRkCQlNQU5HTEUoVmVydGV4QXR0cmliTDRkKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkw0ZHZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMNGR2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkw0ZHYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMNGR2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkw0aTY0TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMNGk2NE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkw0aTY0dk5WCQlNQU5HTEUoVmVydGV4QXR0cmliTDRpNjR2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDR1aTY0TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMNHVpNjROVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMNHVpNjR2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMNHVpNjR2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTEZvcm1hdE5WCQlNQU5HTEUoVmVydGV4QXR0cmliTEZvcm1hdE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkxQb2ludGVyRVhUCQlNQU5HTEUoVmVydGV4QXR0cmliTFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTFBvaW50ZXIJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMUG9pbnRlcikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJQMXVpCQlNQU5HTEUoVmVydGV4QXR0cmliUDF1aSkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJQMXVpdgkJTUFOR0xFKFZlcnRleEF0dHJpYlAxdWl2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYlAydWkJCU1BTkdMRShWZXJ0ZXhBdHRyaWJQMnVpKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYlAydWl2CQlNQU5HTEUoVmVydGV4QXR0cmliUDJ1aXYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliUDN1aQkJTUFOR0xFKFZlcnRleEF0dHJpYlAzdWkpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliUDN1aXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJQM3VpdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJQNHVpCQlNQU5HTEUoVmVydGV4QXR0cmliUDR1aSkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJQNHVpdgkJTUFOR0xFKFZlcnRleEF0dHJpYlA0dWl2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYlBvaW50ZXJBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWJQb2ludGVyQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYlBvaW50ZXIJCU1BTkdMRShWZXJ0ZXhBdHRyaWJQb2ludGVyKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYlBvaW50ZXJOVgkJTUFOR0xFKFZlcnRleEF0dHJpYlBvaW50ZXJOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzMWR2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzMWR2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczFmdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczFmdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnMxaHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnMxaHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzMXN2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzMXN2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczJkdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczJkdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnMyZnZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnMyZnZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzMmh2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzMmh2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczJzdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczJzdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnMzZHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnMzZHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzM2Z2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzM2Z2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczNodk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczNodk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnMzc3ZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnMzc3ZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzNGR2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzNGR2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczRmdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczRmdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnM0aHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnM0aHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzNHN2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzNHN2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczR1YnZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnM0dWJ2TlYpCisjZGVmaW5lIGdsVmVydGV4QmxlbmRBUkIJCU1BTkdMRShWZXJ0ZXhCbGVuZEFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhCbGVuZEVudmZBVEkJCU1BTkdMRShWZXJ0ZXhCbGVuZEVudmZBVEkpCisjZGVmaW5lIGdsVmVydGV4QmxlbmRFbnZpQVRJCQlNQU5HTEUoVmVydGV4QmxlbmRFbnZpQVRJKQorI2RlZmluZSBnbFZlcnRleEZvcm1hdE5WCQlNQU5HTEUoVmVydGV4Rm9ybWF0TlYpCisjZGVmaW5lIGdsVmVydGV4UDJ1aQkJTUFOR0xFKFZlcnRleFAydWkpCisjZGVmaW5lIGdsVmVydGV4UDJ1aXYJCU1BTkdMRShWZXJ0ZXhQMnVpdikKKyNkZWZpbmUgZ2xWZXJ0ZXhQM3VpCQlNQU5HTEUoVmVydGV4UDN1aSkKKyNkZWZpbmUgZ2xWZXJ0ZXhQM3VpdgkJTUFOR0xFKFZlcnRleFAzdWl2KQorI2RlZmluZSBnbFZlcnRleFA0dWkJCU1BTkdMRShWZXJ0ZXhQNHVpKQorI2RlZmluZSBnbFZlcnRleFA0dWl2CQlNQU5HTEUoVmVydGV4UDR1aXYpCisjZGVmaW5lIGdsVmVydGV4UG9pbnRlckVYVAkJTUFOR0xFKFZlcnRleFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsVmVydGV4UG9pbnRlckxpc3RJQk0JCU1BTkdMRShWZXJ0ZXhQb2ludGVyTGlzdElCTSkKKyNkZWZpbmUgZ2xWZXJ0ZXhQb2ludGVyCQlNQU5HTEUoVmVydGV4UG9pbnRlcikKKyNkZWZpbmUgZ2xWZXJ0ZXhQb2ludGVydklOVEVMCQlNQU5HTEUoVmVydGV4UG9pbnRlcnZJTlRFTCkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0xZEFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTFkQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTFkdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTFkdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0xZkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTFmQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTFmdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTFmdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0xaUFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTFpQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTFpdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTFpdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0xc0FUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTFzQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTFzdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTFzdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0yZEFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTJkQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTJkdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTJkdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0yZkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTJmQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTJmdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTJmdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0yaUFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTJpQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTJpdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTJpdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0yc0FUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTJzQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTJzdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTJzdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0zZEFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTNkQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTNkdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTNkdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0zZkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTNmQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTNmdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTNmdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0zaUFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTNpQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTNpdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTNpdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0zc0FUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTNzQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTNzdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTNzdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW00ZEFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTRkQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTRkdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTRkdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW00ZkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTRmQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTRmdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTRmdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW00aUFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTRpQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTRpdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTRpdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW00c0FUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTRzQVRJKQorI2RlZmluZSBnbFZlcnRleFN0cmVhbTRzdkFUSQkJTUFOR0xFKFZlcnRleFN0cmVhbTRzdkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhXZWlnaHRmRVhUCQlNQU5HTEUoVmVydGV4V2VpZ2h0ZkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhXZWlnaHRmdkVYVAkJTUFOR0xFKFZlcnRleFdlaWdodGZ2RVhUKQorI2RlZmluZSBnbFZlcnRleFdlaWdodGhOVgkJTUFOR0xFKFZlcnRleFdlaWdodGhOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhXZWlnaHRodk5WCQlNQU5HTEUoVmVydGV4V2VpZ2h0aHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhXZWlnaHRQb2ludGVyRVhUCQlNQU5HTEUoVmVydGV4V2VpZ2h0UG9pbnRlckVYVCkKKyNkZWZpbmUgZ2xWaWRlb0NhcHR1cmVOVgkJTUFOR0xFKFZpZGVvQ2FwdHVyZU5WKQorI2RlZmluZSBnbFZpZGVvQ2FwdHVyZVN0cmVhbVBhcmFtZXRlcmR2TlYJCU1BTkdMRShWaWRlb0NhcHR1cmVTdHJlYW1QYXJhbWV0ZXJkdk5WKQorI2RlZmluZSBnbFZpZGVvQ2FwdHVyZVN0cmVhbVBhcmFtZXRlcmZ2TlYJCU1BTkdMRShWaWRlb0NhcHR1cmVTdHJlYW1QYXJhbWV0ZXJmdk5WKQorI2RlZmluZSBnbFZpZGVvQ2FwdHVyZVN0cmVhbVBhcmFtZXRlcml2TlYJCU1BTkdMRShWaWRlb0NhcHR1cmVTdHJlYW1QYXJhbWV0ZXJpdk5WKQorI2RlZmluZSBnbFZpZXdwb3J0QXJyYXl2CQlNQU5HTEUoVmlld3BvcnRBcnJheXYpCisjZGVmaW5lIGdsVmlld3BvcnRJbmRleGVkZgkJTUFOR0xFKFZpZXdwb3J0SW5kZXhlZGYpCisjZGVmaW5lIGdsVmlld3BvcnRJbmRleGVkZnYJCU1BTkdMRShWaWV3cG9ydEluZGV4ZWRmdikKKyNkZWZpbmUgZ2xWaWV3cG9ydAkJTUFOR0xFKFZpZXdwb3J0KQorI2RlZmluZSBnbFdhaXRTeW5jCQlNQU5HTEUoV2FpdFN5bmMpCisjZGVmaW5lIGdsV2VpZ2h0YnZBUkIJCU1BTkdMRShXZWlnaHRidkFSQikKKyNkZWZpbmUgZ2xXZWlnaHRkdkFSQgkJTUFOR0xFKFdlaWdodGR2QVJCKQorI2RlZmluZSBnbFdlaWdodGZ2QVJCCQlNQU5HTEUoV2VpZ2h0ZnZBUkIpCisjZGVmaW5lIGdsV2VpZ2h0aXZBUkIJCU1BTkdMRShXZWlnaHRpdkFSQikKKyNkZWZpbmUgZ2xXZWlnaHRQb2ludGVyQVJCCQlNQU5HTEUoV2VpZ2h0UG9pbnRlckFSQikKKyNkZWZpbmUgZ2xXZWlnaHRzdkFSQgkJTUFOR0xFKFdlaWdodHN2QVJCKQorI2RlZmluZSBnbFdlaWdodHVidkFSQgkJTUFOR0xFKFdlaWdodHVidkFSQikKKyNkZWZpbmUgZ2xXZWlnaHR1aXZBUkIJCU1BTkdMRShXZWlnaHR1aXZBUkIpCisjZGVmaW5lIGdsV2VpZ2h0dXN2QVJCCQlNQU5HTEUoV2VpZ2h0dXN2QVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczJkQVJCCQlNQU5HTEUoV2luZG93UG9zMmRBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zMmQJCU1BTkdMRShXaW5kb3dQb3MyZCkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyZE1FU0EJCU1BTkdMRShXaW5kb3dQb3MyZE1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zMmR2QVJCCQlNQU5HTEUoV2luZG93UG9zMmR2QVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczJkdgkJTUFOR0xFKFdpbmRvd1BvczJkdikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyZHZNRVNBCQlNQU5HTEUoV2luZG93UG9zMmR2TUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyZkFSQgkJTUFOR0xFKFdpbmRvd1BvczJmQVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczJmCQlNQU5HTEUoV2luZG93UG9zMmYpCisjZGVmaW5lIGdsV2luZG93UG9zMmZNRVNBCQlNQU5HTEUoV2luZG93UG9zMmZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczJmdkFSQgkJTUFOR0xFKFdpbmRvd1BvczJmdkFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyZnYJCU1BTkdMRShXaW5kb3dQb3MyZnYpCisjZGVmaW5lIGdsV2luZG93UG9zMmZ2TUVTQQkJTUFOR0xFKFdpbmRvd1BvczJmdk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zMmlBUkIJCU1BTkdMRShXaW5kb3dQb3MyaUFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyaQkJTUFOR0xFKFdpbmRvd1BvczJpKQorI2RlZmluZSBnbFdpbmRvd1BvczJpTUVTQQkJTUFOR0xFKFdpbmRvd1BvczJpTUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyaXZBUkIJCU1BTkdMRShXaW5kb3dQb3MyaXZBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zMml2CQlNQU5HTEUoV2luZG93UG9zMml2KQorI2RlZmluZSBnbFdpbmRvd1BvczJpdk1FU0EJCU1BTkdMRShXaW5kb3dQb3MyaXZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczJzQVJCCQlNQU5HTEUoV2luZG93UG9zMnNBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zMnMJCU1BTkdMRShXaW5kb3dQb3MycykKKyNkZWZpbmUgZ2xXaW5kb3dQb3Myc01FU0EJCU1BTkdMRShXaW5kb3dQb3Myc01FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zMnN2QVJCCQlNQU5HTEUoV2luZG93UG9zMnN2QVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczJzdgkJTUFOR0xFKFdpbmRvd1BvczJzdikKKyNkZWZpbmUgZ2xXaW5kb3dQb3Myc3ZNRVNBCQlNQU5HTEUoV2luZG93UG9zMnN2TUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzZEFSQgkJTUFOR0xFKFdpbmRvd1BvczNkQVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczNkCQlNQU5HTEUoV2luZG93UG9zM2QpCisjZGVmaW5lIGdsV2luZG93UG9zM2RNRVNBCQlNQU5HTEUoV2luZG93UG9zM2RNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczNkdkFSQgkJTUFOR0xFKFdpbmRvd1BvczNkdkFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzZHYJCU1BTkdMRShXaW5kb3dQb3MzZHYpCisjZGVmaW5lIGdsV2luZG93UG9zM2R2TUVTQQkJTUFOR0xFKFdpbmRvd1BvczNkdk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zM2ZBUkIJCU1BTkdMRShXaW5kb3dQb3MzZkFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzZgkJTUFOR0xFKFdpbmRvd1BvczNmKQorI2RlZmluZSBnbFdpbmRvd1BvczNmTUVTQQkJTUFOR0xFKFdpbmRvd1BvczNmTUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzZnZBUkIJCU1BTkdMRShXaW5kb3dQb3MzZnZBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zM2Z2CQlNQU5HTEUoV2luZG93UG9zM2Z2KQorI2RlZmluZSBnbFdpbmRvd1BvczNmdk1FU0EJCU1BTkdMRShXaW5kb3dQb3MzZnZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczNpQVJCCQlNQU5HTEUoV2luZG93UG9zM2lBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zM2kJCU1BTkdMRShXaW5kb3dQb3MzaSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzaU1FU0EJCU1BTkdMRShXaW5kb3dQb3MzaU1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zM2l2QVJCCQlNQU5HTEUoV2luZG93UG9zM2l2QVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczNpdgkJTUFOR0xFKFdpbmRvd1BvczNpdikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzaXZNRVNBCQlNQU5HTEUoV2luZG93UG9zM2l2TUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3Mzc0FSQgkJTUFOR0xFKFdpbmRvd1BvczNzQVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczNzCQlNQU5HTEUoV2luZG93UG9zM3MpCisjZGVmaW5lIGdsV2luZG93UG9zM3NNRVNBCQlNQU5HTEUoV2luZG93UG9zM3NNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczNzdkFSQgkJTUFOR0xFKFdpbmRvd1BvczNzdkFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3Mzc3YJCU1BTkdMRShXaW5kb3dQb3Mzc3YpCisjZGVmaW5lIGdsV2luZG93UG9zM3N2TUVTQQkJTUFOR0xFKFdpbmRvd1BvczNzdk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zNGRNRVNBCQlNQU5HTEUoV2luZG93UG9zNGRNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczRkdk1FU0EJCU1BTkdMRShXaW5kb3dQb3M0ZHZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczRmTUVTQQkJTUFOR0xFKFdpbmRvd1BvczRmTUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3M0ZnZNRVNBCQlNQU5HTEUoV2luZG93UG9zNGZ2TUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3M0aU1FU0EJCU1BTkdMRShXaW5kb3dQb3M0aU1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zNGl2TUVTQQkJTUFOR0xFKFdpbmRvd1BvczRpdk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zNHNNRVNBCQlNQU5HTEUoV2luZG93UG9zNHNNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczRzdk1FU0EJCU1BTkdMRShXaW5kb3dQb3M0c3ZNRVNBKQorI2RlZmluZSBnbFdyaXRlTWFza0VYVAkJTUFOR0xFKFdyaXRlTWFza0VYVCkKKworI2VuZGlmIC8qIEdMX01BTkdMRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL0dML2dsZXh0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL0dML2dsZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk0MDAyMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2xleHQuaApAQCAtMCwwICsxLDExNDg4IEBACisjaWZuZGVmIF9fZ2xleHRfaF8KKyNkZWZpbmUgX19nbGV4dF9oXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKiAKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKiAKKyoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisqKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCisqKiAKKyoqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyoqIE1BVEVSSUFMUyBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCisqLworCisvKiBIZWFkZXIgZmlsZSB2ZXJzaW9uIG51bWJlciwgcmVxdWlyZWQgYnkgT3BlbkdMIEFCSSBmb3IgTGludXggKi8KKy8qIGdsZXh0LmggbGFzdCB1cGRhdGVkICREYXRlOiAyMDExLTA4LTA4IDAwOjM0OjI5IC0wNzAwIChNb24sIDA4IEF1ZyAyMDExKSAkICovCisvKiBDdXJyZW50IHZlcnNpb24gYXQgaHR0cDovL3d3dy5vcGVuZ2wub3JnL3JlZ2lzdHJ5LyAqLworI2RlZmluZSBHTF9HTEVYVF9WRVJTSU9OIDcyCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbiBtYWNyb3MgLSB0byBtb3ZlIGludG8gZ2xwbGF0Zm9ybS5oICovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoQVBJRU5UUlkpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIEFQSUVOVFJZCisjZGVmaW5lIEFQSUVOVFJZCisjZW5kaWYKKyNpZm5kZWYgQVBJRU5UUllQCisjZGVmaW5lIEFQSUVOVFJZUCBBUElFTlRSWSAqCisjZW5kaWYKKyNpZm5kZWYgR0xBUEkKKyNkZWZpbmUgR0xBUEkgZXh0ZXJuCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzIKKyNkZWZpbmUgR0xfVU5TSUdORURfQllURV8zXzNfMiAgICAgICAgICAgIDB4ODAzMgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgMHg4MDMzCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgICAgICAgICAweDgwMzQKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzhfOF84XzggICAgICAgICAgIDB4ODAzNQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMTBfMTBfMTBfMiAgICAgICAgMHg4MDM2CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18zRCAgICAgICAgICAgICAweDgwNkEKKyNkZWZpbmUgR0xfUEFDS19TS0lQX0lNQUdFUyAgICAgICAgICAgICAgIDB4ODA2QgorI2RlZmluZSBHTF9QQUNLX0lNQUdFX0hFSUdIVCAgICAgICAgICAgICAgMHg4MDZDCisjZGVmaW5lIEdMX1VOUEFDS19TS0lQX0lNQUdFUyAgICAgICAgICAgICAweDgwNkQKKyNkZWZpbmUgR0xfVU5QQUNLX0lNQUdFX0hFSUdIVCAgICAgICAgICAgIDB4ODA2RQorI2RlZmluZSBHTF9URVhUVVJFXzNEICAgICAgICAgICAgICAgICAgICAgMHg4MDZGCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfM0QgICAgICAgICAgICAgICAweDgwNzAKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSCAgICAgICAgICAgICAgICAgIDB4ODA3MQorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUiAgICAgICAgICAgICAgICAgMHg4MDcyCisjZGVmaW5lIEdMX01BWF8zRF9URVhUVVJFX1NJWkUgICAgICAgICAgICAweDgwNzMKKyNkZWZpbmUgR0xfVU5TSUdORURfQllURV8yXzNfM19SRVYgICAgICAgIDB4ODM2MgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgMHg4MzYzCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81X1JFViAgICAgICAweDgzNjQKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNF9SRVYgICAgIDB4ODM2NQorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFViAgICAgMHg4MzY2CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViAgICAgICAweDgzNjcKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWICAgIDB4ODM2OAorI2RlZmluZSBHTF9CR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUwCisjZGVmaW5lIEdMX0JHUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTICAgICAgICAgIDB4ODBFOAorI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyAgICAgICAgICAgMHg4MEU5CisjZGVmaW5lIEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAweDgxMkYKKyNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fTE9EICAgICAgICAgICAgICAgIDB4ODEzQQorI2RlZmluZSBHTF9URVhUVVJFX01BWF9MT0QgICAgICAgICAgICAgICAgMHg4MTNCCisjZGVmaW5lIEdMX1RFWFRVUkVfQkFTRV9MRVZFTCAgICAgICAgICAgICAweDgxM0MKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfTEVWRUwgICAgICAgICAgICAgIDB4ODEzRAorI2RlZmluZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgMHgwQjEyCisjZGVmaW5lIEdMX1NNT09USF9QT0lOVF9TSVpFX0dSQU5VTEFSSVRZICAweDBCMTMKKyNkZWZpbmUgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgIDB4MEIyMgorI2RlZmluZSBHTF9TTU9PVEhfTElORV9XSURUSF9HUkFOVUxBUklUWSAgMHgwQjIzCisjZGVmaW5lIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAweDg0NkUKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV8yX0RFUFJFQ0FURUQKKyNkZWZpbmUgR0xfUkVTQ0FMRV9OT1JNQUwgICAgICAgICAgICAgICAgIDB4ODAzQQorI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9DT0xPUl9DT05UUk9MICAgICAgMHg4MUY4CisjZGVmaW5lIEdMX1NJTkdMRV9DT0xPUiAgICAgICAgICAgICAgICAgICAweDgxRjkKKyNkZWZpbmUgR0xfU0VQQVJBVEVfU1BFQ1VMQVJfQ09MT1IgICAgICAgIDB4ODFGQQorI2RlZmluZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgMHg4NDZECisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfaW1hZ2luZworI2RlZmluZSBHTF9DT05TVEFOVF9DT0xPUiAgICAgICAgICAgICAgICAgMHg4MDAxCisjZGVmaW5lIEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUiAgICAgICAweDgwMDIKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODAwMworI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEEgICAgICAgMHg4MDA0CisjZGVmaW5lIEdMX0JMRU5EX0NPTE9SICAgICAgICAgICAgICAgICAgICAweDgwMDUKKyNkZWZpbmUgR0xfRlVOQ19BREQgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwNgorI2RlZmluZSBHTF9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA3CisjZGVmaW5lIEdMX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDgKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT04gICAgICAgICAgICAgICAgIDB4ODAwOQorI2RlZmluZSBHTF9GVU5DX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgMHg4MDBBCisjZGVmaW5lIEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVCAgICAgICAgICAweDgwMEIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9pbWFnaW5nX0RFUFJFQ0FURUQKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fMUQgICAgICAgICAgICAgICAgIDB4ODAxMAorI2RlZmluZSBHTF9DT05WT0xVVElPTl8yRCAgICAgICAgICAgICAgICAgMHg4MDExCisjZGVmaW5lIEdMX1NFUEFSQUJMRV8yRCAgICAgICAgICAgICAgICAgICAweDgwMTIKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fQk9SREVSX01PREUgICAgICAgIDB4ODAxMworI2RlZmluZSBHTF9DT05WT0xVVElPTl9GSUxURVJfU0NBTEUgICAgICAgMHg4MDE0CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0ZJTFRFUl9CSUFTICAgICAgICAweDgwMTUKKyNkZWZpbmUgR0xfUkVEVUNFICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxNgorI2RlZmluZSBHTF9DT05WT0xVVElPTl9GT1JNQVQgICAgICAgICAgICAgMHg4MDE3CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX1dJRFRIICAgICAgICAgICAgICAweDgwMTgKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fSEVJR0hUICAgICAgICAgICAgIDB4ODAxOQorI2RlZmluZSBHTF9NQVhfQ09OVk9MVVRJT05fV0lEVEggICAgICAgICAgMHg4MDFBCisjZGVmaW5lIEdMX01BWF9DT05WT0xVVElPTl9IRUlHSFQgICAgICAgICAweDgwMUIKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9SRURfU0NBTEUgICAgIDB4ODAxQworI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX1NDQUxFICAgMHg4MDFECisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9TQ0FMRSAgICAweDgwMUUKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9TQ0FMRSAgIDB4ODAxRgorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX1JFRF9CSUFTICAgICAgMHg4MDIwCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fR1JFRU5fQklBUyAgICAweDgwMjEKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX0JJQVMgICAgIDB4ODAyMgorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0FMUEhBX0JJQVMgICAgMHg4MDIzCisjZGVmaW5lIEdMX0hJU1RPR1JBTSAgICAgICAgICAgICAgICAgICAgICAweDgwMjQKKyNkZWZpbmUgR0xfUFJPWFlfSElTVE9HUkFNICAgICAgICAgICAgICAgIDB4ODAyNQorI2RlZmluZSBHTF9ISVNUT0dSQU1fV0lEVEggICAgICAgICAgICAgICAgMHg4MDI2CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9GT1JNQVQgICAgICAgICAgICAgICAweDgwMjcKKyNkZWZpbmUgR0xfSElTVE9HUkFNX1JFRF9TSVpFICAgICAgICAgICAgIDB4ODAyOAorI2RlZmluZSBHTF9ISVNUT0dSQU1fR1JFRU5fU0laRSAgICAgICAgICAgMHg4MDI5CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9CTFVFX1NJWkUgICAgICAgICAgICAweDgwMkEKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0FMUEhBX1NJWkUgICAgICAgICAgIDB4ODAyQgorI2RlZmluZSBHTF9ISVNUT0dSQU1fTFVNSU5BTkNFX1NJWkUgICAgICAgMHg4MDJDCisjZGVmaW5lIEdMX0hJU1RPR1JBTV9TSU5LICAgICAgICAgICAgICAgICAweDgwMkQKKyNkZWZpbmUgR0xfTUlOTUFYICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAyRQorI2RlZmluZSBHTF9NSU5NQVhfRk9STUFUICAgICAgICAgICAgICAgICAgMHg4MDJGCisjZGVmaW5lIEdMX01JTk1BWF9TSU5LICAgICAgICAgICAgICAgICAgICAweDgwMzAKKyNkZWZpbmUgR0xfVEFCTEVfVE9PX0xBUkdFICAgICAgICAgICAgICAgIDB4ODAzMQorI2RlZmluZSBHTF9DT0xPUl9NQVRSSVggICAgICAgICAgICAgICAgICAgMHg4MEIxCisjZGVmaW5lIEdMX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSCAgICAgICAweDgwQjIKKyNkZWZpbmUgR0xfTUFYX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSCAgIDB4ODBCMworI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfU0NBTEUgICAgMHg4MEI0CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0dSRUVOX1NDQUxFICAweDgwQjUKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9TQ0FMRSAgIDB4ODBCNgorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9TQ0FMRSAgMHg4MEI3CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX1JFRF9CSUFTICAgICAweDgwQjgKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fQklBUyAgIDB4ODBCOQorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9CTFVFX0JJQVMgICAgMHg4MEJBCisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0FMUEhBX0JJQVMgICAweDgwQkIKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEUgICAgICAgICAgICAgICAgICAgIDB4ODBEMAorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFICAgMHg4MEQxCisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0NPTE9SX1RBQkxFICAweDgwRDIKKyNkZWZpbmUgR0xfUFJPWFlfQ09MT1JfVEFCTEUgICAgICAgICAgICAgIDB4ODBEMworI2RlZmluZSBHTF9QUk9YWV9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFIDB4ODBENAorI2RlZmluZSBHTF9QUk9YWV9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRSAweDgwRDUKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfU0NBTEUgICAgICAgICAgICAgIDB4ODBENgorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9CSUFTICAgICAgICAgICAgICAgMHg4MEQ3CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0ZPUk1BVCAgICAgICAgICAgICAweDgwRDgKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfV0lEVEggICAgICAgICAgICAgIDB4ODBEOQorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9SRURfU0laRSAgICAgICAgICAgMHg4MERBCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0dSRUVOX1NJWkUgICAgICAgICAweDgwREIKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQkxVRV9TSVpFICAgICAgICAgIDB4ODBEQworI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9BTFBIQV9TSVpFICAgICAgICAgMHg4MERECisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0xVTUlOQU5DRV9TSVpFICAgICAweDgwREUKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfSU5URU5TSVRZX1NJWkUgICAgIDB4ODBERgorI2RlZmluZSBHTF9DT05TVEFOVF9CT1JERVIgICAgICAgICAgICAgICAgMHg4MTUxCisjZGVmaW5lIEdMX1JFUExJQ0FURV9CT1JERVIgICAgICAgICAgICAgICAweDgxNTMKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fQk9SREVSX0NPTE9SICAgICAgIDB4ODE1NAorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzMKKyNkZWZpbmUgR0xfVEVYVFVSRTAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMAorI2RlZmluZSBHTF9URVhUVVJFMSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMxCisjZGVmaW5lIEdMX1RFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgICAweDg0QzIKKyNkZWZpbmUgR0xfVEVYVFVSRTMgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMworI2RlZmluZSBHTF9URVhUVVJFNCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM0CisjZGVmaW5lIEdMX1RFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzUKKyNkZWZpbmUgR0xfVEVYVFVSRTYgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNgorI2RlZmluZSBHTF9URVhUVVJFNyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM3CisjZGVmaW5lIEdMX1RFWFRVUkU4ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzgKKyNkZWZpbmUgR0xfVEVYVFVSRTkgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOQorI2RlZmluZSBHTF9URVhUVVJFMTAgICAgICAgICAgICAgICAgICAgICAgMHg4NENBCisjZGVmaW5lIEdMX1RFWFRVUkUxMSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0IKKyNkZWZpbmUgR0xfVEVYVFVSRTEyICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQworI2RlZmluZSBHTF9URVhUVVJFMTMgICAgICAgICAgICAgICAgICAgICAgMHg4NENECisjZGVmaW5lIEdMX1RFWFRVUkUxNCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0UKKyNkZWZpbmUgR0xfVEVYVFVSRTE1ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRgorI2RlZmluZSBHTF9URVhUVVJFMTYgICAgICAgICAgICAgICAgICAgICAgMHg4NEQwCisjZGVmaW5lIEdMX1RFWFRVUkUxNyAgICAgICAgICAgICAgICAgICAgICAweDg0RDEKKyNkZWZpbmUgR0xfVEVYVFVSRTE4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMgorI2RlZmluZSBHTF9URVhUVVJFMTkgICAgICAgICAgICAgICAgICAgICAgMHg4NEQzCisjZGVmaW5lIEdMX1RFWFRVUkUyMCAgICAgICAgICAgICAgICAgICAgICAweDg0RDQKKyNkZWZpbmUgR0xfVEVYVFVSRTIxICAgICAgICAgICAgICAgICAgICAgIDB4ODRENQorI2RlZmluZSBHTF9URVhUVVJFMjIgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ2CisjZGVmaW5lIEdMX1RFWFRVUkUyMyAgICAgICAgICAgICAgICAgICAgICAweDg0RDcKKyNkZWZpbmUgR0xfVEVYVFVSRTI0ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOAorI2RlZmluZSBHTF9URVhUVVJFMjUgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ5CisjZGVmaW5lIEdMX1RFWFRVUkUyNiAgICAgICAgICAgICAgICAgICAgICAweDg0REEKKyNkZWZpbmUgR0xfVEVYVFVSRTI3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQgorI2RlZmluZSBHTF9URVhUVVJFMjggICAgICAgICAgICAgICAgICAgICAgMHg4NERDCisjZGVmaW5lIEdMX1RFWFRVUkUyOSAgICAgICAgICAgICAgICAgICAgICAweDg0REQKKyNkZWZpbmUgR0xfVEVYVFVSRTMwICAgICAgICAgICAgICAgICAgICAgIDB4ODRERQorI2RlZmluZSBHTF9URVhUVVJFMzEgICAgICAgICAgICAgICAgICAgICAgMHg4NERGCisjZGVmaW5lIEdMX0FDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICAweDg0RTAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEUgICAgICAgICAgICAgICAgICAgIDB4ODA5RAorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgMHg4MDlFCisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19PTkUgICAgICAgICAgICAweDgwOUYKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFICAgICAgICAgICAgICAgIDB4ODBBMAorI2RlZmluZSBHTF9TQU1QTEVfQlVGRkVSUyAgICAgICAgICAgICAgICAgMHg4MEE4CisjZGVmaW5lIEdMX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAweDgwQTkKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFICAgICAgICAgIDB4ODBBQQorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0VfSU5WRVJUICAgICAgICAgMHg4MEFCCisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVAgICAgICAgICAgICAgICAweDg1MTMKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQICAgICAgIDB4ODUxNAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggICAgMHg4NTE1CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCAgICAweDg1MTYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZICAgIDB4ODUxNworI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1kgICAgMHg4NTE4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWiAgICAweDg1MTkKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aICAgIDB4ODUxQQorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX0NVQkVfTUFQICAgICAgICAgMHg4NTFCCisjZGVmaW5lIEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgICAgICAweDg1MUMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0IgICAgICAgICAgICAgICAgIDB4ODRFRAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkEgICAgICAgICAgICAgICAgMHg4NEVFCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUFJFU1NJT05fSElOVCAgICAgICAweDg0RUYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0VEX0lNQUdFX1NJWkUgIDB4ODZBMAorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTRUQgICAgICAgICAgICAgMHg4NkExCisjZGVmaW5lIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAweDg2QTIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgICAgIDB4ODZBMworI2RlZmluZSBHTF9DTEFNUF9UT19CT1JERVIgICAgICAgICAgICAgICAgMHg4MTJECisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfM19ERVBSRUNBVEVECisjZGVmaW5lIEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAweDg0RTEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfVU5JVFMgICAgICAgICAgICAgIDB4ODRFMgorI2RlZmluZSBHTF9UUkFOU1BPU0VfTU9ERUxWSUVXX01BVFJJWCAgICAgMHg4NEUzCisjZGVmaW5lIEdMX1RSQU5TUE9TRV9QUk9KRUNUSU9OX01BVFJJWCAgICAweDg0RTQKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX1RFWFRVUkVfTUFUUklYICAgICAgIDB4ODRFNQorI2RlZmluZSBHTF9UUkFOU1BPU0VfQ09MT1JfTUFUUklYICAgICAgICAgMHg4NEU2CisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0JJVCAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEdMX05PUk1BTF9NQVAgICAgICAgICAgICAgICAgICAgICAweDg1MTEKKyNkZWZpbmUgR0xfUkVGTEVDVElPTl9NQVAgICAgICAgICAgICAgICAgIDB4ODUxMgorI2RlZmluZSBHTF9DT01QUkVTU0VEX0FMUEhBICAgICAgICAgICAgICAgMHg4NEU5CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFICAgICAgICAgICAweDg0RUEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0VfQUxQSEEgICAgIDB4ODRFQgorI2RlZmluZSBHTF9DT01QUkVTU0VEX0lOVEVOU0lUWSAgICAgICAgICAgMHg4NEVDCisjZGVmaW5lIEdMX0NPTUJJTkUgICAgICAgICAgICAgICAgICAgICAgICAweDg1NzAKKyNkZWZpbmUgR0xfQ09NQklORV9SR0IgICAgICAgICAgICAgICAgICAgIDB4ODU3MQorI2RlZmluZSBHTF9DT01CSU5FX0FMUEhBICAgICAgICAgICAgICAgICAgMHg4NTcyCisjZGVmaW5lIEdMX1NPVVJDRTBfUkdCICAgICAgICAgICAgICAgICAgICAweDg1ODAKKyNkZWZpbmUgR0xfU09VUkNFMV9SR0IgICAgICAgICAgICAgICAgICAgIDB4ODU4MQorI2RlZmluZSBHTF9TT1VSQ0UyX1JHQiAgICAgICAgICAgICAgICAgICAgMHg4NTgyCisjZGVmaW5lIEdMX1NPVVJDRTBfQUxQSEEgICAgICAgICAgICAgICAgICAweDg1ODgKKyNkZWZpbmUgR0xfU09VUkNFMV9BTFBIQSAgICAgICAgICAgICAgICAgIDB4ODU4OQorI2RlZmluZSBHTF9TT1VSQ0UyX0FMUEhBICAgICAgICAgICAgICAgICAgMHg4NThBCisjZGVmaW5lIEdMX09QRVJBTkQwX1JHQiAgICAgICAgICAgICAgICAgICAweDg1OTAKKyNkZWZpbmUgR0xfT1BFUkFORDFfUkdCICAgICAgICAgICAgICAgICAgIDB4ODU5MQorI2RlZmluZSBHTF9PUEVSQU5EMl9SR0IgICAgICAgICAgICAgICAgICAgMHg4NTkyCisjZGVmaW5lIEdMX09QRVJBTkQwX0FMUEhBICAgICAgICAgICAgICAgICAweDg1OTgKKyNkZWZpbmUgR0xfT1BFUkFORDFfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODU5OQorI2RlZmluZSBHTF9PUEVSQU5EMl9BTFBIQSAgICAgICAgICAgICAgICAgMHg4NTlBCisjZGVmaW5lIEdMX1JHQl9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAweDg1NzMKKyNkZWZpbmUgR0xfQUREX1NJR05FRCAgICAgICAgICAgICAgICAgICAgIDB4ODU3NAorI2RlZmluZSBHTF9JTlRFUlBPTEFURSAgICAgICAgICAgICAgICAgICAgMHg4NTc1CisjZGVmaW5lIEdMX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAweDg0RTcKKyNkZWZpbmUgR0xfQ09OU1RBTlQgICAgICAgICAgICAgICAgICAgICAgIDB4ODU3NgorI2RlZmluZSBHTF9QUklNQVJZX0NPTE9SICAgICAgICAgICAgICAgICAgMHg4NTc3CisjZGVmaW5lIEdMX1BSRVZJT1VTICAgICAgICAgICAgICAgICAgICAgICAweDg1NzgKKyNkZWZpbmUgR0xfRE9UM19SR0IgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRQorI2RlZmluZSBHTF9ET1QzX1JHQkEgICAgICAgICAgICAgICAgICAgICAgMHg4NkFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfNAorI2RlZmluZSBHTF9CTEVORF9EU1RfUkdCICAgICAgICAgICAgICAgICAgMHg4MEM4CisjZGVmaW5lIEdMX0JMRU5EX1NSQ19SR0IgICAgICAgICAgICAgICAgICAweDgwQzkKKyNkZWZpbmUgR0xfQkxFTkRfRFNUX0FMUEhBICAgICAgICAgICAgICAgIDB4ODBDQQorI2RlZmluZSBHTF9CTEVORF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgMHg4MENCCisjZGVmaW5lIEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAweDgxMjgKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMTYgICAgICAgICAgICAgIDB4ODFBNQorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQyNCAgICAgICAgICAgICAgMHg4MUE2CisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDMyICAgICAgICAgICAgICAweDgxQTcKKyNkZWZpbmUgR0xfTUlSUk9SRURfUkVQRUFUICAgICAgICAgICAgICAgIDB4ODM3MAorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9MT0RfQklBUyAgICAgICAgICAgMHg4NEZECisjZGVmaW5lIEdMX1RFWFRVUkVfTE9EX0JJQVMgICAgICAgICAgICAgICAweDg1MDEKKyNkZWZpbmUgR0xfSU5DUl9XUkFQICAgICAgICAgICAgICAgICAgICAgIDB4ODUwNworI2RlZmluZSBHTF9ERUNSX1dSQVAgICAgICAgICAgICAgICAgICAgICAgMHg4NTA4CisjZGVmaW5lIEdMX1RFWFRVUkVfREVQVEhfU0laRSAgICAgICAgICAgICAweDg4NEEKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX01PREUgICAgICAgICAgIDB4ODg0QworI2RlZmluZSBHTF9URVhUVVJFX0NPTVBBUkVfRlVOQyAgICAgICAgICAgMHg4ODRECisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfNF9ERVBSRUNBVEVECisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUlOICAgICAgICAgICAgICAgICAweDgxMjYKKyNkZWZpbmUgR0xfUE9JTlRfU0laRV9NQVggICAgICAgICAgICAgICAgIDB4ODEyNworI2RlZmluZSBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiAgICAgMHg4MTI5CisjZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUCAgICAgICAgICAgICAgICAweDgxOTEKKyNkZWZpbmUgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQgICAgICAgICAgIDB4ODE5MgorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0UgICAgICAgICAgMHg4NDUwCisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFICAgICAgICAgICAgICAgICAweDg0NTEKKyNkZWZpbmUgR0xfRlJBR01FTlRfREVQVEggICAgICAgICAgICAgICAgIDB4ODQ1MgorI2RlZmluZSBHTF9DVVJSRU5UX0ZPR19DT09SRElOQVRFICAgICAgICAgMHg4NDUzCisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1RZUEUgICAgICAweDg0NTQKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfU1RSSURFICAgIDB4ODQ1NQorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9QT0lOVEVSICAgMHg4NDU2CisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZICAgICAgICAgICAweDg0NTcKKyNkZWZpbmUgR0xfQ09MT1JfU1VNICAgICAgICAgICAgICAgICAgICAgIDB4ODQ1OAorI2RlZmluZSBHTF9DVVJSRU5UX1NFQ09OREFSWV9DT0xPUiAgICAgICAgMHg4NDU5CisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9TSVpFICAgICAweDg0NUEKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1RZUEUgICAgIDB4ODQ1QgorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU1RSSURFICAgMHg4NDVDCisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9QT0lOVEVSICAweDg0NUQKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZICAgICAgICAgIDB4ODQ1RQorI2RlZmluZSBHTF9URVhUVVJFX0ZJTFRFUl9DT05UUk9MICAgICAgICAgMHg4NTAwCisjZGVmaW5lIEdMX0RFUFRIX1RFWFRVUkVfTU9ERSAgICAgICAgICAgICAweDg4NEIKKyNkZWZpbmUgR0xfQ09NUEFSRV9SX1RPX1RFWFRVUkUgICAgICAgICAgIDB4ODg0RQorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzUKKyNkZWZpbmUgR0xfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgIDB4ODc2NAorI2RlZmluZSBHTF9CVUZGRVJfVVNBR0UgICAgICAgICAgICAgICAgICAgMHg4NzY1CisjZGVmaW5lIEdMX1FVRVJZX0NPVU5URVJfQklUUyAgICAgICAgICAgICAweDg4NjQKKyNkZWZpbmUgR0xfQ1VSUkVOVF9RVUVSWSAgICAgICAgICAgICAgICAgIDB4ODg2NQorI2RlZmluZSBHTF9RVUVSWV9SRVNVTFQgICAgICAgICAgICAgICAgICAgMHg4ODY2CisjZGVmaW5lIEdMX1FVRVJZX1JFU1VMVF9BVkFJTEFCTEUgICAgICAgICAweDg4NjcKKyNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgIDB4ODg5MgorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiAgICAgICAgICAgMHg4ODkzCisjZGVmaW5lIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAweDg4OTQKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyAgIDB4ODg5NQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HIDB4ODg5RgorI2RlZmluZSBHTF9SRUFEX09OTFkgICAgICAgICAgICAgICAgICAgICAgMHg4OEI4CisjZGVmaW5lIEdMX1dSSVRFX09OTFkgICAgICAgICAgICAgICAgICAgICAweDg4QjkKKyNkZWZpbmUgR0xfUkVBRF9XUklURSAgICAgICAgICAgICAgICAgICAgIDB4ODhCQQorI2RlZmluZSBHTF9CVUZGRVJfQUNDRVNTICAgICAgICAgICAgICAgICAgMHg4OEJCCisjZGVmaW5lIEdMX0JVRkZFUl9NQVBQRUQgICAgICAgICAgICAgICAgICAweDg4QkMKKyNkZWZpbmUgR0xfQlVGRkVSX01BUF9QT0lOVEVSICAgICAgICAgICAgIDB4ODhCRAorI2RlZmluZSBHTF9TVFJFQU1fRFJBVyAgICAgICAgICAgICAgICAgICAgMHg4OEUwCisjZGVmaW5lIEdMX1NUUkVBTV9SRUFEICAgICAgICAgICAgICAgICAgICAweDg4RTEKKyNkZWZpbmUgR0xfU1RSRUFNX0NPUFkgICAgICAgICAgICAgICAgICAgIDB4ODhFMgorI2RlZmluZSBHTF9TVEFUSUNfRFJBVyAgICAgICAgICAgICAgICAgICAgMHg4OEU0CisjZGVmaW5lIEdMX1NUQVRJQ19SRUFEICAgICAgICAgICAgICAgICAgICAweDg4RTUKKyNkZWZpbmUgR0xfU1RBVElDX0NPUFkgICAgICAgICAgICAgICAgICAgIDB4ODhFNgorI2RlZmluZSBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgMHg4OEU4CisjZGVmaW5lIEdMX0RZTkFNSUNfUkVBRCAgICAgICAgICAgICAgICAgICAweDg4RTkKKyNkZWZpbmUgR0xfRFlOQU1JQ19DT1BZICAgICAgICAgICAgICAgICAgIDB4ODhFQQorI2RlZmluZSBHTF9TQU1QTEVTX1BBU1NFRCAgICAgICAgICAgICAgICAgMHg4OTE0CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfNV9ERVBSRUNBVEVECisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyAgICAweDg4OTYKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgIDB4ODg5NworI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORyAgICAgMHg4ODk4CisjZGVmaW5lIEdMX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAweDg4OTkKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUEKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX0JVRkZFUl9CSU5ESU5HIDB4ODg5QgorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgMHg4ODlDCisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0JVRkZFUl9CSU5ESU5HIDB4ODg5RAorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgMHg4ODlFCisjZGVmaW5lIEdMX0ZPR19DT09SRF9TUkMgICAgICAgICAgICAgICAgICAweDg0NTAKKyNkZWZpbmUgR0xfRk9HX0NPT1JEICAgICAgICAgICAgICAgICAgICAgIDB4ODQ1MQorI2RlZmluZSBHTF9DVVJSRU5UX0ZPR19DT09SRCAgICAgICAgICAgICAgMHg4NDUzCisjZGVmaW5lIEdMX0ZPR19DT09SRF9BUlJBWV9UWVBFICAgICAgICAgICAweDg0NTQKKyNkZWZpbmUgR0xfRk9HX0NPT1JEX0FSUkFZX1NUUklERSAgICAgICAgIDB4ODQ1NQorI2RlZmluZSBHTF9GT0dfQ09PUkRfQVJSQVlfUE9JTlRFUiAgICAgICAgMHg4NDU2CisjZGVmaW5lIEdMX0ZPR19DT09SRF9BUlJBWSAgICAgICAgICAgICAgICAweDg0NTcKKyNkZWZpbmUgR0xfRk9HX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HIDB4ODg5RAorI2RlZmluZSBHTF9TUkMwX1JHQiAgICAgICAgICAgICAgICAgICAgICAgMHg4NTgwCisjZGVmaW5lIEdMX1NSQzFfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDg1ODEKKyNkZWZpbmUgR0xfU1JDMl9SR0IgICAgICAgICAgICAgICAgICAgICAgIDB4ODU4MgorI2RlZmluZSBHTF9TUkMwX0FMUEhBICAgICAgICAgICAgICAgICAgICAgMHg4NTg4CisjZGVmaW5lIEdMX1NSQzFfQUxQSEEgICAgICAgICAgICAgICAgICAgICAweDg1ODkKKyNkZWZpbmUgR0xfU1JDMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgIDB4ODU4QQorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8yXzAKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fUkdCICAgICAgICAgICAgIDB4ODAwOQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQgICAgMHg4NjIyCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRSAgICAgICAweDg2MjMKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREUgICAgIDB4ODYyNAorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEUgICAgICAgMHg4NjI1CisjZGVmaW5lIEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQiAgICAgICAgICAweDg2MjYKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRSAgICAgIDB4ODY0MgorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVIgICAgMHg4NjQ1CisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19GVU5DICAgICAgICAgICAgICAweDg4MDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX0ZBSUwgICAgICAgICAgICAgIDB4ODgwMQorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMICAgMHg4ODAyCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MgICAweDg4MDMKKyNkZWZpbmUgR0xfTUFYX0RSQVdfQlVGRkVSUyAgICAgICAgICAgICAgIDB4ODgyNAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjAgICAgICAgICAgICAgICAgICAgMHg4ODI1CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMSAgICAgICAgICAgICAgICAgICAweDg4MjYKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIyICAgICAgICAgICAgICAgICAgIDB4ODgyNworI2RlZmluZSBHTF9EUkFXX0JVRkZFUjMgICAgICAgICAgICAgICAgICAgMHg4ODI4CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNCAgICAgICAgICAgICAgICAgICAweDg4MjkKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI1ICAgICAgICAgICAgICAgICAgIDB4ODgyQQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjYgICAgICAgICAgICAgICAgICAgMHg4ODJCCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNyAgICAgICAgICAgICAgICAgICAweDg4MkMKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI4ICAgICAgICAgICAgICAgICAgIDB4ODgyRAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjkgICAgICAgICAgICAgICAgICAgMHg4ODJFCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTAgICAgICAgICAgICAgICAgICAweDg4MkYKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMSAgICAgICAgICAgICAgICAgIDB4ODgzMAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEyICAgICAgICAgICAgICAgICAgMHg4ODMxCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTMgICAgICAgICAgICAgICAgICAweDg4MzIKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxNCAgICAgICAgICAgICAgICAgIDB4ODgzMworI2RlZmluZSBHTF9EUkFXX0JVRkZFUjE1ICAgICAgICAgICAgICAgICAgMHg4ODM0CisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBICAgICAgICAgICAweDg4M0QKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9BVFRSSUJTICAgICAgICAgICAgIDB4ODg2OQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQgMHg4ODZBCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTICAgICAgICAweDg4NzIKKyNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSICAgICAgICAgICAgICAgIDB4OEIzMAorI2RlZmluZSBHTF9WRVJURVhfU0hBREVSICAgICAgICAgICAgICAgICAgMHg4QjMxCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFMgMHg4QjQ5CisjZGVmaW5lIEdMX01BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTICAweDhCNEEKKyNkZWZpbmUgR0xfTUFYX1ZBUllJTkdfRkxPQVRTICAgICAgICAgICAgIDB4OEI0QgorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgMHg4QjRDCisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIDB4OEI0RAorI2RlZmluZSBHTF9TSEFERVJfVFlQRSAgICAgICAgICAgICAgICAgICAgMHg4QjRGCisjZGVmaW5lIEdMX0ZMT0FUX1ZFQzIgICAgICAgICAgICAgICAgICAgICAweDhCNTAKKyNkZWZpbmUgR0xfRkxPQVRfVkVDMyAgICAgICAgICAgICAgICAgICAgIDB4OEI1MQorI2RlZmluZSBHTF9GTE9BVF9WRUM0ICAgICAgICAgICAgICAgICAgICAgMHg4QjUyCisjZGVmaW5lIEdMX0lOVF9WRUMyICAgICAgICAgICAgICAgICAgICAgICAweDhCNTMKKyNkZWZpbmUgR0xfSU5UX1ZFQzMgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NAorI2RlZmluZSBHTF9JTlRfVkVDNCAgICAgICAgICAgICAgICAgICAgICAgMHg4QjU1CisjZGVmaW5lIEdMX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCNTYKKyNkZWZpbmUgR0xfQk9PTF9WRUMyICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NworI2RlZmluZSBHTF9CT09MX1ZFQzMgICAgICAgICAgICAgICAgICAgICAgMHg4QjU4CisjZGVmaW5lIEdMX0JPT0xfVkVDNCAgICAgICAgICAgICAgICAgICAgICAweDhCNTkKKyNkZWZpbmUgR0xfRkxPQVRfTUFUMiAgICAgICAgICAgICAgICAgICAgIDB4OEI1QQorI2RlZmluZSBHTF9GTE9BVF9NQVQzICAgICAgICAgICAgICAgICAgICAgMHg4QjVCCisjZGVmaW5lIEdMX0ZMT0FUX01BVDQgICAgICAgICAgICAgICAgICAgICAweDhCNUMKKyNkZWZpbmUgR0xfU0FNUExFUl8xRCAgICAgICAgICAgICAgICAgICAgIDB4OEI1RAorI2RlZmluZSBHTF9TQU1QTEVSXzJEICAgICAgICAgICAgICAgICAgICAgMHg4QjVFCisjZGVmaW5lIEdMX1NBTVBMRVJfM0QgICAgICAgICAgICAgICAgICAgICAweDhCNUYKKyNkZWZpbmUgR0xfU0FNUExFUl9DVUJFICAgICAgICAgICAgICAgICAgIDB4OEI2MAorI2RlZmluZSBHTF9TQU1QTEVSXzFEX1NIQURPVyAgICAgICAgICAgICAgMHg4QjYxCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfU0hBRE9XICAgICAgICAgICAgICAweDhCNjIKKyNkZWZpbmUgR0xfREVMRVRFX1NUQVRVUyAgICAgICAgICAgICAgICAgIDB4OEI4MAorI2RlZmluZSBHTF9DT01QSUxFX1NUQVRVUyAgICAgICAgICAgICAgICAgMHg4QjgxCisjZGVmaW5lIEdMX0xJTktfU1RBVFVTICAgICAgICAgICAgICAgICAgICAweDhCODIKKyNkZWZpbmUgR0xfVkFMSURBVEVfU1RBVFVTICAgICAgICAgICAgICAgIDB4OEI4MworI2RlZmluZSBHTF9JTkZPX0xPR19MRU5HVEggICAgICAgICAgICAgICAgMHg4Qjg0CisjZGVmaW5lIEdMX0FUVEFDSEVEX1NIQURFUlMgICAgICAgICAgICAgICAweDhCODUKKyNkZWZpbmUgR0xfQUNUSVZFX1VOSUZPUk1TICAgICAgICAgICAgICAgIDB4OEI4NgorI2RlZmluZSBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIICAgICAgMHg4Qjg3CisjZGVmaW5lIEdMX1NIQURFUl9TT1VSQ0VfTEVOR1RIICAgICAgICAgICAweDhCODgKKyNkZWZpbmUgR0xfQUNUSVZFX0FUVFJJQlVURVMgICAgICAgICAgICAgIDB4OEI4OQorI2RlZmluZSBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEggICAgMHg4QjhBCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1NIQURFUl9ERVJJVkFUSVZFX0hJTlQgMHg4QjhCCisjZGVmaW5lIEdMX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTiAgICAgICAweDhCOEMKKyNkZWZpbmUgR0xfQ1VSUkVOVF9QUk9HUkFNICAgICAgICAgICAgICAgIDB4OEI4RAorI2RlZmluZSBHTF9QT0lOVF9TUFJJVEVfQ09PUkRfT1JJR0lOICAgICAgMHg4Q0EwCisjZGVmaW5lIEdMX0xPV0VSX0xFRlQgICAgICAgICAgICAgICAgICAgICAweDhDQTEKKyNkZWZpbmUgR0xfVVBQRVJfTEVGVCAgICAgICAgICAgICAgICAgICAgIDB4OENBMgorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfUkVGICAgICAgICAgICAgICAgMHg4Q0EzCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19WQUxVRV9NQVNLICAgICAgICAweDhDQTQKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1dSSVRFTUFTSyAgICAgICAgIDB4OENBNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8yXzBfREVQUkVDQVRFRAorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9UV09fU0lERSAgICAgICAgMHg4NjQzCisjZGVmaW5lIEdMX1BPSU5UX1NQUklURSAgICAgICAgICAgICAgICAgICAweDg4NjEKKyNkZWZpbmUgR0xfQ09PUkRfUkVQTEFDRSAgICAgICAgICAgICAgICAgIDB4ODg2MgorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9DT09SRFMgICAgICAgICAgICAgMHg4ODcxCisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzJfMQorI2RlZmluZSBHTF9QSVhFTF9QQUNLX0JVRkZFUiAgICAgICAgICAgICAgMHg4OEVCCisjZGVmaW5lIEdMX1BJWEVMX1VOUEFDS19CVUZGRVIgICAgICAgICAgICAweDg4RUMKKyNkZWZpbmUgR0xfUElYRUxfUEFDS19CVUZGRVJfQklORElORyAgICAgIDB4ODhFRAorI2RlZmluZSBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkcgICAgMHg4OEVGCisjZGVmaW5lIEdMX0ZMT0FUX01BVDJ4MyAgICAgICAgICAgICAgICAgICAweDhCNjUKKyNkZWZpbmUgR0xfRkxPQVRfTUFUMng0ICAgICAgICAgICAgICAgICAgIDB4OEI2NgorI2RlZmluZSBHTF9GTE9BVF9NQVQzeDIgICAgICAgICAgICAgICAgICAgMHg4QjY3CisjZGVmaW5lIEdMX0ZMT0FUX01BVDN4NCAgICAgICAgICAgICAgICAgICAweDhCNjgKKyNkZWZpbmUgR0xfRkxPQVRfTUFUNHgyICAgICAgICAgICAgICAgICAgIDB4OEI2OQorI2RlZmluZSBHTF9GTE9BVF9NQVQ0eDMgICAgICAgICAgICAgICAgICAgMHg4QjZBCisjZGVmaW5lIEdMX1NSR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDNDAKKyNkZWZpbmUgR0xfU1JHQjggICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM0MQorI2RlZmluZSBHTF9TUkdCX0FMUEhBICAgICAgICAgICAgICAgICAgICAgMHg4QzQyCisjZGVmaW5lIEdMX1NSR0I4X0FMUEhBOCAgICAgICAgICAgICAgICAgICAweDhDNDMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCICAgICAgICAgICAgICAgIDB4OEM0OAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0JfQUxQSEEgICAgICAgICAgMHg4QzQ5CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzJfMV9ERVBSRUNBVEVECisjZGVmaW5lIEdMX0NVUlJFTlRfUkFTVEVSX1NFQ09OREFSWV9DT0xPUiAweDg0NUYKKyNkZWZpbmUgR0xfU0xVTUlOQU5DRV9BTFBIQSAgICAgICAgICAgICAgIDB4OEM0NAorI2RlZmluZSBHTF9TTFVNSU5BTkNFOF9BTFBIQTggICAgICAgICAgICAgMHg4QzQ1CisjZGVmaW5lIEdMX1NMVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAweDhDNDYKKyNkZWZpbmUgR0xfU0xVTUlOQU5DRTggICAgICAgICAgICAgICAgICAgIDB4OEM0NworI2RlZmluZSBHTF9DT01QUkVTU0VEX1NMVU1JTkFOQ0UgICAgICAgICAgMHg4QzRBCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU0xVTUlOQU5DRV9BTFBIQSAgICAweDhDNEIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fM18wCisjZGVmaW5lIEdMX0NPTVBBUkVfUkVGX1RPX1RFWFRVUkUgICAgICAgICAweDg4NEUKKyNkZWZpbmUgR0xfQ0xJUF9ESVNUQU5DRTAgICAgICAgICAgICAgICAgIDB4MzAwMAorI2RlZmluZSBHTF9DTElQX0RJU1RBTkNFMSAgICAgICAgICAgICAgICAgMHgzMDAxCisjZGVmaW5lIEdMX0NMSVBfRElTVEFOQ0UyICAgICAgICAgICAgICAgICAweDMwMDIKKyNkZWZpbmUgR0xfQ0xJUF9ESVNUQU5DRTMgICAgICAgICAgICAgICAgIDB4MzAwMworI2RlZmluZSBHTF9DTElQX0RJU1RBTkNFNCAgICAgICAgICAgICAgICAgMHgzMDA0CisjZGVmaW5lIEdMX0NMSVBfRElTVEFOQ0U1ICAgICAgICAgICAgICAgICAweDMwMDUKKyNkZWZpbmUgR0xfQ0xJUF9ESVNUQU5DRTYgICAgICAgICAgICAgICAgIDB4MzAwNgorI2RlZmluZSBHTF9DTElQX0RJU1RBTkNFNyAgICAgICAgICAgICAgICAgMHgzMDA3CisjZGVmaW5lIEdMX01BWF9DTElQX0RJU1RBTkNFUyAgICAgICAgICAgICAweDBEMzIKKyNkZWZpbmUgR0xfTUFKT1JfVkVSU0lPTiAgICAgICAgICAgICAgICAgIDB4ODIxQgorI2RlZmluZSBHTF9NSU5PUl9WRVJTSU9OICAgICAgICAgICAgICAgICAgMHg4MjFDCisjZGVmaW5lIEdMX05VTV9FWFRFTlNJT05TICAgICAgICAgICAgICAgICAweDgyMUQKKyNkZWZpbmUgR0xfQ09OVEVYVF9GTEFHUyAgICAgICAgICAgICAgICAgIDB4ODIxRQorI2RlZmluZSBHTF9ERVBUSF9CVUZGRVIgICAgICAgICAgICAgICAgICAgMHg4MjIzCisjZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSICAgICAgICAgICAgICAgICAweDgyMjQKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SRUQgICAgICAgICAgICAgICAgIDB4ODIyNQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHICAgICAgICAgICAgICAgICAgMHg4MjI2CisjZGVmaW5lIEdMX0NPTlRFWFRfRkxBR19GT1JXQVJEX0NPTVBBVElCTEVfQklUIDB4MDAwMQorI2RlZmluZSBHTF9SR0JBMzJGICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODE0CisjZGVmaW5lIEdMX1JHQjMyRiAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MTUKKyNkZWZpbmUgR0xfUkdCQTE2RiAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxQQorI2RlZmluZSBHTF9SR0IxNkYgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFCCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfSU5URUdFUiAgICAweDg4RkQKKyNkZWZpbmUgR0xfTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTICAgICAgIDB4ODhGRgorI2RlZmluZSBHTF9NSU5fUFJPR1JBTV9URVhFTF9PRkZTRVQgICAgICAgMHg4OTA0CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1RFWEVMX09GRlNFVCAgICAgICAweDg5MDUKKyNkZWZpbmUgR0xfQ0xBTVBfUkVBRF9DT0xPUiAgICAgICAgICAgICAgIDB4ODkxQworI2RlZmluZSBHTF9GSVhFRF9PTkxZICAgICAgICAgICAgICAgICAgICAgMHg4OTFECisjZGVmaW5lIEdMX01BWF9WQVJZSU5HX0NPTVBPTkVOVFMgICAgICAgICAweDhCNEIKKyNkZWZpbmUgR0xfVEVYVFVSRV8xRF9BUlJBWSAgICAgICAgICAgICAgIDB4OEMxOAorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzFEX0FSUkFZICAgICAgICAgMHg4QzE5CisjZGVmaW5lIEdMX1RFWFRVUkVfMkRfQVJSQVkgICAgICAgICAgICAgICAweDhDMUEKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8yRF9BUlJBWSAgICAgICAgIDB4OEMxQgorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMURfQVJSQVkgICAgICAgMHg4QzFDCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18yRF9BUlJBWSAgICAgICAweDhDMUQKKyNkZWZpbmUgR0xfUjExRl9HMTFGX0IxMEYgICAgICAgICAgICAgICAgIDB4OEMzQQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWICAgMHg4QzNCCisjZGVmaW5lIEdMX1JHQjlfRTUgICAgICAgICAgICAgICAgICAgICAgICAweDhDM0QKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzVfOV85XzlfUkVWICAgICAgIDB4OEMzRQorI2RlZmluZSBHTF9URVhUVVJFX1NIQVJFRF9TSVpFICAgICAgICAgICAgMHg4QzNGCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19WQVJZSU5HX01BWF9MRU5HVEggMHg4Qzc2CisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTU9ERSAweDhDN0YKKyNkZWZpbmUgR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19TRVBBUkFURV9DT01QT05FTlRTIDB4OEM4MAorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfVkFSWUlOR1MgICAgMHg4QzgzCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU1RBUlQgMHg4Qzg0CisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU0laRSAweDhDODUKKyNkZWZpbmUgR0xfUFJJTUlUSVZFU19HRU5FUkFURUQgICAgICAgICAgIDB4OEM4NworI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfUFJJTUlUSVZFU19XUklUVEVOIDB4OEM4OAorI2RlZmluZSBHTF9SQVNURVJJWkVSX0RJU0NBUkQgICAgICAgICAgICAgMHg4Qzg5CisjZGVmaW5lIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfSU5URVJMRUFWRURfQ09NUE9ORU5UUyAweDhDOEEKKyNkZWZpbmUgR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19TRVBBUkFURV9BVFRSSUJTIDB4OEM4QgorI2RlZmluZSBHTF9JTlRFUkxFQVZFRF9BVFRSSUJTICAgICAgICAgICAgMHg4QzhDCisjZGVmaW5lIEdMX1NFUEFSQVRFX0FUVFJJQlMgICAgICAgICAgICAgICAweDhDOEQKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUiAgICAgIDB4OEM4RQorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX0JJTkRJTkcgMHg4QzhGCisjZGVmaW5lIEdMX1JHQkEzMlVJICAgICAgICAgICAgICAgICAgICAgICAweDhENzAKKyNkZWZpbmUgR0xfUkdCMzJVSSAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ3MQorI2RlZmluZSBHTF9SR0JBMTZVSSAgICAgICAgICAgICAgICAgICAgICAgMHg4RDc2CisjZGVmaW5lIEdMX1JHQjE2VUkgICAgICAgICAgICAgICAgICAgICAgICAweDhENzcKKyNkZWZpbmUgR0xfUkdCQThVSSAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ3QworI2RlZmluZSBHTF9SR0I4VUkgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDdECisjZGVmaW5lIEdMX1JHQkEzMkkgICAgICAgICAgICAgICAgICAgICAgICAweDhEODIKKyNkZWZpbmUgR0xfUkdCMzJJICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ4MworI2RlZmluZSBHTF9SR0JBMTZJICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDg4CisjZGVmaW5lIEdMX1JHQjE2SSAgICAgICAgICAgICAgICAgICAgICAgICAweDhEODkKKyNkZWZpbmUgR0xfUkdCQThJICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ4RQorI2RlZmluZSBHTF9SR0I4SSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDhGCisjZGVmaW5lIEdMX1JFRF9JTlRFR0VSICAgICAgICAgICAgICAgICAgICAweDhEOTQKKyNkZWZpbmUgR0xfR1JFRU5fSU5URUdFUiAgICAgICAgICAgICAgICAgIDB4OEQ5NQorI2RlZmluZSBHTF9CTFVFX0lOVEVHRVIgICAgICAgICAgICAgICAgICAgMHg4RDk2CisjZGVmaW5lIEdMX1JHQl9JTlRFR0VSICAgICAgICAgICAgICAgICAgICAweDhEOTgKKyNkZWZpbmUgR0xfUkdCQV9JTlRFR0VSICAgICAgICAgICAgICAgICAgIDB4OEQ5OQorI2RlZmluZSBHTF9CR1JfSU5URUdFUiAgICAgICAgICAgICAgICAgICAgMHg4RDlBCisjZGVmaW5lIEdMX0JHUkFfSU5URUdFUiAgICAgICAgICAgICAgICAgICAweDhEOUIKKyNkZWZpbmUgR0xfU0FNUExFUl8xRF9BUlJBWSAgICAgICAgICAgICAgIDB4OERDMAorI2RlZmluZSBHTF9TQU1QTEVSXzJEX0FSUkFZICAgICAgICAgICAgICAgMHg4REMxCisjZGVmaW5lIEdMX1NBTVBMRVJfMURfQVJSQVlfU0hBRE9XICAgICAgICAweDhEQzMKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9BUlJBWV9TSEFET1cgICAgICAgIDB4OERDNAorI2RlZmluZSBHTF9TQU1QTEVSX0NVQkVfU0hBRE9XICAgICAgICAgICAgMHg4REM1CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9WRUMyICAgICAgICAgICAgICAweDhEQzYKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1ZFQzMgICAgICAgICAgICAgIDB4OERDNworI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfVkVDNCAgICAgICAgICAgICAgMHg4REM4CisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSXzFEICAgICAgICAgICAgICAgICAweDhEQzkKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfMkQgICAgICAgICAgICAgICAgIDB4OERDQQorI2RlZmluZSBHTF9JTlRfU0FNUExFUl8zRCAgICAgICAgICAgICAgICAgMHg4RENCCisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSX0NVQkUgICAgICAgICAgICAgICAweDhEQ0MKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfMURfQVJSQVkgICAgICAgICAgIDB4OERDRQorI2RlZmluZSBHTF9JTlRfU0FNUExFUl8yRF9BUlJBWSAgICAgICAgICAgMHg4RENGCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzFEICAgICAgICAweDhERDEKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkQgICAgICAgIDB4OEREMgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8zRCAgICAgICAgMHg4REQzCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkUgICAgICAweDhERDQKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMURfQVJSQVkgIDB4OERENgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9BUlJBWSAgMHg4REQ3CisjZGVmaW5lIEdMX1FVRVJZX1dBSVQgICAgICAgICAgICAgICAgICAgICAweDhFMTMKKyNkZWZpbmUgR0xfUVVFUllfTk9fV0FJVCAgICAgICAgICAgICAgICAgIDB4OEUxNAorI2RlZmluZSBHTF9RVUVSWV9CWV9SRUdJT05fV0FJVCAgICAgICAgICAgMHg4RTE1CisjZGVmaW5lIEdMX1FVRVJZX0JZX1JFR0lPTl9OT19XQUlUICAgICAgICAweDhFMTYKKyNkZWZpbmUgR0xfQlVGRkVSX0FDQ0VTU19GTEFHUyAgICAgICAgICAgIDB4OTExRgorI2RlZmluZSBHTF9CVUZGRVJfTUFQX0xFTkdUSCAgICAgICAgICAgICAgMHg5MTIwCisjZGVmaW5lIEdMX0JVRkZFUl9NQVBfT0ZGU0VUICAgICAgICAgICAgICAweDkxMjEKKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9kZXB0aF9idWZmZXJfZmxvYXQgKi8KKy8qIHJldXNlIEdMX0RFUFRIX0NPTVBPTkVOVDMyRiAqLworLyogcmV1c2UgR0xfREVQVEgzMkZfU1RFTkNJTDggKi8KKy8qIHJldXNlIEdMX0ZMT0FUXzMyX1VOU0lHTkVEX0lOVF8yNF84X1JFViAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2ZyYW1lYnVmZmVyX29iamVjdCAqLworLyogcmV1c2UgR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04gKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09MT1JfRU5DT0RJTkcgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09NUE9ORU5UX1RZUEUgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfUkVEX1NJWkUgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfR1JFRU5fU0laRSAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9CTFVFX1NJWkUgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQUxQSEFfU0laRSAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9ERVBUSF9TSVpFICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1NURU5DSUxfU0laRSAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfREVGQVVMVCAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfVU5ERUZJTkVEICovCisvKiByZXVzZSBHTF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQgKi8KKy8qIHJldXNlIEdMX0lOREVYICovCisvKiByZXVzZSBHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkUgKi8KKy8qIHJldXNlIEdMX0RFUFRIX1NURU5DSUwgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX0lOVF8yNF84ICovCisvKiByZXVzZSBHTF9ERVBUSDI0X1NURU5DSUw4ICovCisvKiByZXVzZSBHTF9URVhUVVJFX1NURU5DSUxfU0laRSAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9SRURfVFlQRSAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9HUkVFTl9UWVBFICovCisvKiByZXVzZSBHTF9URVhUVVJFX0JMVUVfVFlQRSAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9BTFBIQV9UWVBFICovCisvKiByZXVzZSBHTF9URVhUVVJFX0RFUFRIX1RZUEUgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX05PUk1BTElaRUQgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkcgKi8KKy8qIHJldXNlIEdMX0RSQVdfRlJBTUVCVUZGRVJfQklORElORyAqLworLyogcmV1c2UgR0xfUkVOREVSQlVGRkVSX0JJTkRJTkcgKi8KKy8qIHJldXNlIEdMX1JFQURfRlJBTUVCVUZGRVIgKi8KKy8qIHJldXNlIEdMX0RSQVdfRlJBTUVCVUZGRVIgKi8KKy8qIHJldXNlIEdMX1JFQURfRlJBTUVCVUZGRVJfQklORElORyAqLworLyogcmV1c2UgR0xfUkVOREVSQlVGRkVSX1NBTVBMRVMgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUUgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTCAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0UgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MQVlFUiAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVCAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVIgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfUkVBRF9CVUZGRVIgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEICovCisvKiByZXVzZSBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFMgKi8KKy8qIHJldXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQwICovCisvKiByZXVzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMSAqLworLyogcmV1c2UgR0xfQ09MT1JfQVRUQUNITUVOVDIgKi8KKy8qIHJldXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQzICovCisvKiByZXVzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNCAqLworLyogcmV1c2UgR0xfQ09MT1JfQVRUQUNITUVOVDUgKi8KKy8qIHJldXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQ2ICovCisvKiByZXVzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNyAqLworLyogcmV1c2UgR0xfQ09MT1JfQVRUQUNITUVOVDggKi8KKy8qIHJldXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQ5ICovCisvKiByZXVzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTAgKi8KKy8qIHJldXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQxMSAqLworLyogcmV1c2UgR0xfQ09MT1JfQVRUQUNITUVOVDEyICovCisvKiByZXVzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTMgKi8KKy8qIHJldXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQxNCAqLworLyogcmV1c2UgR0xfQ09MT1JfQVRUQUNITUVOVDE1ICovCisvKiByZXVzZSBHTF9ERVBUSF9BVFRBQ0hNRU5UICovCisvKiByZXVzZSBHTF9TVEVOQ0lMX0FUVEFDSE1FTlQgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSICovCisvKiByZXVzZSBHTF9SRU5ERVJCVUZGRVIgKi8KKy8qIHJldXNlIEdMX1JFTkRFUkJVRkZFUl9XSURUSCAqLworLyogcmV1c2UgR0xfUkVOREVSQlVGRkVSX0hFSUdIVCAqLworLyogcmV1c2UgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVCAqLworLyogcmV1c2UgR0xfU1RFTkNJTF9JTkRFWDEgKi8KKy8qIHJldXNlIEdMX1NURU5DSUxfSU5ERVg0ICovCisvKiByZXVzZSBHTF9TVEVOQ0lMX0lOREVYOCAqLworLyogcmV1c2UgR0xfU1RFTkNJTF9JTkRFWDE2ICovCisvKiByZXVzZSBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkUgKi8KKy8qIHJldXNlIEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFICovCisvKiByZXVzZSBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFICovCisvKiByZXVzZSBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRSAqLworLyogcmV1c2UgR0xfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkUgKi8KKy8qIHJldXNlIEdMX1JFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkUgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEUgKi8KKy8qIHJldXNlIEdMX01BWF9TQU1QTEVTICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfZnJhbWVidWZmZXJfc1JHQiAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfU1JHQiAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2hhbGZfZmxvYXRfdmVydGV4ICovCisvKiByZXVzZSBHTF9IQUxGX0ZMT0FUICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfbWFwX2J1ZmZlcl9yYW5nZSAqLworLyogcmV1c2UgR0xfTUFQX1JFQURfQklUICovCisvKiByZXVzZSBHTF9NQVBfV1JJVEVfQklUICovCisvKiByZXVzZSBHTF9NQVBfSU5WQUxJREFURV9SQU5HRV9CSVQgKi8KKy8qIHJldXNlIEdMX01BUF9JTlZBTElEQVRFX0JVRkZFUl9CSVQgKi8KKy8qIHJldXNlIEdMX01BUF9GTFVTSF9FWFBMSUNJVF9CSVQgKi8KKy8qIHJldXNlIEdMX01BUF9VTlNZTkNIUk9OSVpFRF9CSVQgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGMgKi8KKy8qIHJldXNlIEdMX0NPTVBSRVNTRURfUkVEX1JHVEMxICovCisvKiByZXVzZSBHTF9DT01QUkVTU0VEX1NJR05FRF9SRURfUkdUQzEgKi8KKy8qIHJldXNlIEdMX0NPTVBSRVNTRURfUkdfUkdUQzIgKi8KKy8qIHJldXNlIEdMX0NPTVBSRVNTRURfU0lHTkVEX1JHX1JHVEMyICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdGV4dHVyZV9yZyAqLworLyogcmV1c2UgR0xfUkcgKi8KKy8qIHJldXNlIEdMX1JHX0lOVEVHRVIgKi8KKy8qIHJldXNlIEdMX1I4ICovCisvKiByZXVzZSBHTF9SMTYgKi8KKy8qIHJldXNlIEdMX1JHOCAqLworLyogcmV1c2UgR0xfUkcxNiAqLworLyogcmV1c2UgR0xfUjE2RiAqLworLyogcmV1c2UgR0xfUjMyRiAqLworLyogcmV1c2UgR0xfUkcxNkYgKi8KKy8qIHJldXNlIEdMX1JHMzJGICovCisvKiByZXVzZSBHTF9SOEkgKi8KKy8qIHJldXNlIEdMX1I4VUkgKi8KKy8qIHJldXNlIEdMX1IxNkkgKi8KKy8qIHJldXNlIEdMX1IxNlVJICovCisvKiByZXVzZSBHTF9SMzJJICovCisvKiByZXVzZSBHTF9SMzJVSSAqLworLyogcmV1c2UgR0xfUkc4SSAqLworLyogcmV1c2UgR0xfUkc4VUkgKi8KKy8qIHJldXNlIEdMX1JHMTZJICovCisvKiByZXVzZSBHTF9SRzE2VUkgKi8KKy8qIHJldXNlIEdMX1JHMzJJICovCisvKiByZXVzZSBHTF9SRzMyVUkgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl92ZXJ0ZXhfYXJyYXlfb2JqZWN0ICovCisvKiByZXVzZSBHTF9WRVJURVhfQVJSQVlfQklORElORyAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8zXzBfREVQUkVDQVRFRAorI2RlZmluZSBHTF9DTEFNUF9WRVJURVhfQ09MT1IgICAgICAgICAgICAgMHg4OTFBCisjZGVmaW5lIEdMX0NMQU1QX0ZSQUdNRU5UX0NPTE9SICAgICAgICAgICAweDg5MUIKKyNkZWZpbmUgR0xfQUxQSEFfSU5URUdFUiAgICAgICAgICAgICAgICAgIDB4OEQ5NworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2ZyYW1lYnVmZmVyX29iamVjdCAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9MVU1JTkFOQ0VfVFlQRSAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9JTlRFTlNJVFlfVFlQRSAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8zXzEKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9SRUNUICAgICAgICAgICAgICAgIDB4OEI2MworI2RlZmluZSBHTF9TQU1QTEVSXzJEX1JFQ1RfU0hBRE9XICAgICAgICAgMHg4QjY0CisjZGVmaW5lIEdMX1NBTVBMRVJfQlVGRkVSICAgICAgICAgICAgICAgICAweDhEQzIKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfMkRfUkVDVCAgICAgICAgICAgIDB4OERDRAorI2RlZmluZSBHTF9JTlRfU0FNUExFUl9CVUZGRVIgICAgICAgICAgICAgMHg4REQwCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX1JFQ1QgICAweDhERDUKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfQlVGRkVSICAgIDB4OEREOAorI2RlZmluZSBHTF9URVhUVVJFX0JVRkZFUiAgICAgICAgICAgICAgICAgMHg4QzJBCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX0JVRkZFUl9TSVpFICAgICAgICAweDhDMkIKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0JVRkZFUiAgICAgICAgIDB4OEMyQworI2RlZmluZSBHTF9URVhUVVJFX0JVRkZFUl9EQVRBX1NUT1JFX0JJTkRJTkcgMHg4QzJECisjZGVmaW5lIEdMX1RFWFRVUkVfQlVGRkVSX0ZPUk1BVCAgICAgICAgICAweDhDMkUKKyNkZWZpbmUgR0xfVEVYVFVSRV9SRUNUQU5HTEUgICAgICAgICAgICAgIDB4ODRGNQorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfUkVDVEFOR0xFICAgICAgMHg4NEY2CisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfUkVDVEFOR0xFICAgICAgICAweDg0RjcKKyNkZWZpbmUgR0xfTUFYX1JFQ1RBTkdMRV9URVhUVVJFX1NJWkUgICAgIDB4ODRGOAorI2RlZmluZSBHTF9SRURfU05PUk0gICAgICAgICAgICAgICAgICAgICAgMHg4RjkwCisjZGVmaW5lIEdMX1JHX1NOT1JNICAgICAgICAgICAgICAgICAgICAgICAweDhGOTEKKyNkZWZpbmUgR0xfUkdCX1NOT1JNICAgICAgICAgICAgICAgICAgICAgIDB4OEY5MgorI2RlZmluZSBHTF9SR0JBX1NOT1JNICAgICAgICAgICAgICAgICAgICAgMHg4RjkzCisjZGVmaW5lIEdMX1I4X1NOT1JNICAgICAgICAgICAgICAgICAgICAgICAweDhGOTQKKyNkZWZpbmUgR0xfUkc4X1NOT1JNICAgICAgICAgICAgICAgICAgICAgIDB4OEY5NQorI2RlZmluZSBHTF9SR0I4X1NOT1JNICAgICAgICAgICAgICAgICAgICAgMHg4Rjk2CisjZGVmaW5lIEdMX1JHQkE4X1NOT1JNICAgICAgICAgICAgICAgICAgICAweDhGOTcKKyNkZWZpbmUgR0xfUjE2X1NOT1JNICAgICAgICAgICAgICAgICAgICAgIDB4OEY5OAorI2RlZmluZSBHTF9SRzE2X1NOT1JNICAgICAgICAgICAgICAgICAgICAgMHg4Rjk5CisjZGVmaW5lIEdMX1JHQjE2X1NOT1JNICAgICAgICAgICAgICAgICAgICAweDhGOUEKKyNkZWZpbmUgR0xfUkdCQTE2X1NOT1JNICAgICAgICAgICAgICAgICAgIDB4OEY5QgorI2RlZmluZSBHTF9TSUdORURfTk9STUFMSVpFRCAgICAgICAgICAgICAgMHg4RjlDCisjZGVmaW5lIEdMX1BSSU1JVElWRV9SRVNUQVJUICAgICAgICAgICAgICAweDhGOUQKKyNkZWZpbmUgR0xfUFJJTUlUSVZFX1JFU1RBUlRfSU5ERVggICAgICAgIDB4OEY5RQorLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2NvcHlfYnVmZmVyICovCisvKiByZXVzZSBHTF9DT1BZX1JFQURfQlVGRkVSICovCisvKiByZXVzZSBHTF9DT1BZX1dSSVRFX0JVRkZFUiAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2RyYXdfaW5zdGFuY2VkIChub25lKSAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3VuaWZvcm1fYnVmZmVyX29iamVjdCAqLworLyogcmV1c2UgR0xfVU5JRk9STV9CVUZGRVIgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkcgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fQlVGRkVSX1NUQVJUICovCisvKiByZXVzZSBHTF9VTklGT1JNX0JVRkZFUl9TSVpFICovCisvKiByZXVzZSBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQkxPQ0tTICovCisvKiByZXVzZSBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9CTE9DS1MgKi8KKy8qIHJldXNlIEdMX01BWF9DT01CSU5FRF9VTklGT1JNX0JMT0NLUyAqLworLyogcmV1c2UgR0xfTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTICovCisvKiByZXVzZSBHTF9NQVhfVU5JRk9STV9CTE9DS19TSVpFICovCisvKiByZXVzZSBHTF9NQVhfQ09NQklORURfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUyAqLworLyogcmV1c2UgR0xfTUFYX0NPTUJJTkVEX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UUyAqLworLyogcmV1c2UgR0xfVU5JRk9STV9CVUZGRVJfT0ZGU0VUX0FMSUdOTUVOVCAqLworLyogcmV1c2UgR0xfQUNUSVZFX1VOSUZPUk1fQkxPQ0tfTUFYX05BTUVfTEVOR1RIICovCisvKiByZXVzZSBHTF9BQ1RJVkVfVU5JRk9STV9CTE9DS1MgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fVFlQRSAqLworLyogcmV1c2UgR0xfVU5JRk9STV9TSVpFICovCisvKiByZXVzZSBHTF9VTklGT1JNX05BTUVfTEVOR1RIICovCisvKiByZXVzZSBHTF9VTklGT1JNX0JMT0NLX0lOREVYICovCisvKiByZXVzZSBHTF9VTklGT1JNX09GRlNFVCAqLworLyogcmV1c2UgR0xfVU5JRk9STV9BUlJBWV9TVFJJREUgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fTUFUUklYX1NUUklERSAqLworLyogcmV1c2UgR0xfVU5JRk9STV9JU19ST1dfTUFKT1IgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fQkxPQ0tfQklORElORyAqLworLyogcmV1c2UgR0xfVU5JRk9STV9CTE9DS19EQVRBX1NJWkUgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fQkxPQ0tfTkFNRV9MRU5HVEggKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1TICovCisvKiByZXVzZSBHTF9VTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNX0lORElDRVMgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fQkxPQ0tfUkVGRVJFTkNFRF9CWV9WRVJURVhfU0hBREVSICovCisvKiByZXVzZSBHTF9VTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSICovCisvKiByZXVzZSBHTF9JTlZBTElEX0lOREVYICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzNfMgorI2RlZmluZSBHTF9DT05URVhUX0NPUkVfUFJPRklMRV9CSVQgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTF9DT05URVhUX0NPTVBBVElCSUxJVFlfUFJPRklMRV9CSVQgMHgwMDAwMDAwMgorI2RlZmluZSBHTF9MSU5FU19BREpBQ0VOQ1kgICAgICAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lIEdMX0xJTkVfU1RSSVBfQURKQUNFTkNZICAgICAgICAgICAweDAwMEIKKyNkZWZpbmUgR0xfVFJJQU5HTEVTX0FESkFDRU5DWSAgICAgICAgICAgIDB4MDAwQworI2RlZmluZSBHTF9UUklBTkdMRV9TVFJJUF9BREpBQ0VOQ1kgICAgICAgMHgwMDBECisjZGVmaW5lIEdMX1BST0dSQU1fUE9JTlRfU0laRSAgICAgICAgICAgICAweDg2NDIKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1RFWFRVUkVfSU1BR0VfVU5JVFMgMHg4QzI5CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfTEFZRVJFRCAweDhEQTcKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9MQVlFUl9UQVJHRVRTIDB4OERBOAorI2RlZmluZSBHTF9HRU9NRVRSWV9TSEFERVIgICAgICAgICAgICAgICAgMHg4REQ5CisjZGVmaW5lIEdMX0dFT01FVFJZX1ZFUlRJQ0VTX09VVCAgICAgICAgICAweDg5MTYKKyNkZWZpbmUgR0xfR0VPTUVUUllfSU5QVVRfVFlQRSAgICAgICAgICAgIDB4ODkxNworI2RlZmluZSBHTF9HRU9NRVRSWV9PVVRQVVRfVFlQRSAgICAgICAgICAgMHg4OTE4CisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9VTklGT1JNX0NPTVBPTkVOVFMgMHg4RERGCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9PVVRQVVRfVkVSVElDRVMgICAweDhERTAKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1RPVEFMX09VVFBVVF9DT01QT05FTlRTIDB4OERFMQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX09VVFBVVF9DT01QT05FTlRTICAgMHg5MTIyCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9JTlBVVF9DT01QT05FTlRTICAweDkxMjMKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX09VVFBVVF9DT01QT05FTlRTIDB4OTEyNAorI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfSU5QVVRfQ09NUE9ORU5UUyAgMHg5MTI1CisjZGVmaW5lIEdMX0NPTlRFWFRfUFJPRklMRV9NQVNLICAgICAgICAgICAweDkxMjYKKy8qIHJldXNlIEdMX01BWF9WQVJZSU5HX0NPTVBPTkVOVFMgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MQVlFUiAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2RlcHRoX2NsYW1wICovCisvKiByZXVzZSBHTF9ERVBUSF9DTEFNUCAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2RyYXdfZWxlbWVudHNfYmFzZV92ZXJ0ZXggKG5vbmUpICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfZnJhZ21lbnRfY29vcmRfY29udmVudGlvbnMgKG5vbmUpICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfcHJvdm9raW5nX3ZlcnRleCAqLworLyogcmV1c2UgR0xfUVVBRFNfRk9MTE9XX1BST1ZPS0lOR19WRVJURVhfQ09OVkVOVElPTiAqLworLyogcmV1c2UgR0xfRklSU1RfVkVSVEVYX0NPTlZFTlRJT04gKi8KKy8qIHJldXNlIEdMX0xBU1RfVkVSVEVYX0NPTlZFTlRJT04gKi8KKy8qIHJldXNlIEdMX1BST1ZPS0lOR19WRVJURVggKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9zZWFtbGVzc19jdWJlX21hcCAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9DVUJFX01BUF9TRUFNTEVTUyAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3N5bmMgKi8KKy8qIHJldXNlIEdMX01BWF9TRVJWRVJfV0FJVF9USU1FT1VUICovCisvKiByZXVzZSBHTF9PQkpFQ1RfVFlQRSAqLworLyogcmV1c2UgR0xfU1lOQ19DT05ESVRJT04gKi8KKy8qIHJldXNlIEdMX1NZTkNfU1RBVFVTICovCisvKiByZXVzZSBHTF9TWU5DX0ZMQUdTICovCisvKiByZXVzZSBHTF9TWU5DX0ZFTkNFICovCisvKiByZXVzZSBHTF9TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSAqLworLyogcmV1c2UgR0xfVU5TSUdOQUxFRCAqLworLyogcmV1c2UgR0xfU0lHTkFMRUQgKi8KKy8qIHJldXNlIEdMX0FMUkVBRFlfU0lHTkFMRUQgKi8KKy8qIHJldXNlIEdMX1RJTUVPVVRfRVhQSVJFRCAqLworLyogcmV1c2UgR0xfQ09ORElUSU9OX1NBVElTRklFRCAqLworLyogcmV1c2UgR0xfV0FJVF9GQUlMRUQgKi8KKy8qIHJldXNlIEdMX1RJTUVPVVRfSUdOT1JFRCAqLworLyogcmV1c2UgR0xfU1lOQ19GTFVTSF9DT01NQU5EU19CSVQgKi8KKy8qIHJldXNlIEdMX1RJTUVPVVRfSUdOT1JFRCAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3RleHR1cmVfbXVsdGlzYW1wbGUgKi8KKy8qIHJldXNlIEdMX1NBTVBMRV9QT1NJVElPTiAqLworLyogcmV1c2UgR0xfU0FNUExFX01BU0sgKi8KKy8qIHJldXNlIEdMX1NBTVBMRV9NQVNLX1ZBTFVFICovCisvKiByZXVzZSBHTF9NQVhfU0FNUExFX01BU0tfV09SRFMgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfMkRfTVVMVElTQU1QTEUgKi8KKy8qIHJldXNlIEdMX1BST1hZX1RFWFRVUkVfMkRfTVVMVElTQU1QTEUgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfMkRfTVVMVElTQU1QTEVfQVJSQVkgKi8KKy8qIHJldXNlIEdMX1BST1hZX1RFWFRVUkVfMkRfTVVMVElTQU1QTEVfQVJSQVkgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfQklORElOR18yRF9NVUxUSVNBTVBMRSAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9CSU5ESU5HXzJEX01VTFRJU0FNUExFX0FSUkFZICovCisvKiByZXVzZSBHTF9URVhUVVJFX1NBTVBMRVMgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfRklYRURfU0FNUExFX0xPQ0FUSU9OUyAqLworLyogcmV1c2UgR0xfU0FNUExFUl8yRF9NVUxUSVNBTVBMRSAqLworLyogcmV1c2UgR0xfSU5UX1NBTVBMRVJfMkRfTVVMVElTQU1QTEUgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX01VTFRJU0FNUExFICovCisvKiByZXVzZSBHTF9TQU1QTEVSXzJEX01VTFRJU0FNUExFX0FSUkFZICovCisvKiByZXVzZSBHTF9JTlRfU0FNUExFUl8yRF9NVUxUSVNBTVBMRV9BUlJBWSAqLworLyogcmV1c2UgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfTVVMVElTQU1QTEVfQVJSQVkgKi8KKy8qIHJldXNlIEdMX01BWF9DT0xPUl9URVhUVVJFX1NBTVBMRVMgKi8KKy8qIHJldXNlIEdMX01BWF9ERVBUSF9URVhUVVJFX1NBTVBMRVMgKi8KKy8qIHJldXNlIEdMX01BWF9JTlRFR0VSX1NBTVBMRVMgKi8KKy8qIERvbid0IG5lZWQgdG8gcmV1c2UgdG9rZW5zIGZyb20gQVJCX3ZlcnRleF9hcnJheV9iZ3JhIHNpbmNlIHRoZXkncmUgYWxyZWFkeSBpbiAxLjIgY29yZSAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8zXzMKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9ESVZJU09SICAgIDB4ODhGRQorLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2JsZW5kX2Z1bmNfZXh0ZW5kZWQgKi8KKy8qIHJldXNlIEdMX1NSQzFfQ09MT1IgKi8KKy8qIHJldXNlIEdMX09ORV9NSU5VU19TUkMxX0NPTE9SICovCisvKiByZXVzZSBHTF9PTkVfTUlOVVNfU1JDMV9BTFBIQSAqLworLyogcmV1c2UgR0xfTUFYX0RVQUxfU09VUkNFX0RSQVdfQlVGRkVSUyAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2V4cGxpY2l0X2F0dHJpYl9sb2NhdGlvbiAobm9uZSkgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9vY2NsdXNpb25fcXVlcnkyICovCisvKiByZXVzZSBHTF9BTllfU0FNUExFU19QQVNTRUQgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9zYW1wbGVyX29iamVjdHMgKi8KKy8qIHJldXNlIEdMX1NBTVBMRVJfQklORElORyAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3NoYWRlcl9iaXRfZW5jb2RpbmcgKG5vbmUpICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdGV4dHVyZV9yZ2IxMF9hMnVpICovCisvKiByZXVzZSBHTF9SR0IxMF9BMlVJICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdGV4dHVyZV9zd2l6emxlICovCisvKiByZXVzZSBHTF9URVhUVVJFX1NXSVpaTEVfUiAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9TV0laWkxFX0cgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfU1dJWlpMRV9CICovCisvKiByZXVzZSBHTF9URVhUVVJFX1NXSVpaTEVfQSAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9TV0laWkxFX1JHQkEgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl90aW1lcl9xdWVyeSAqLworLyogcmV1c2UgR0xfVElNRV9FTEFQU0VEICovCisvKiByZXVzZSBHTF9USU1FU1RBTVAgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl92ZXJ0ZXhfdHlwZV8yXzEwXzEwXzEwX3JldiAqLworLyogcmV1c2UgR0xfSU5UXzJfMTBfMTBfMTBfUkVWICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzRfMAorI2RlZmluZSBHTF9TQU1QTEVfU0hBRElORyAgICAgICAgICAgICAgICAgMHg4QzM2CisjZGVmaW5lIEdMX01JTl9TQU1QTEVfU0hBRElOR19WQUxVRSAgICAgICAweDhDMzcKKyNkZWZpbmUgR0xfTUlOX1BST0dSQU1fVEVYVFVSRV9HQVRIRVJfT0ZGU0VUIDB4OEU1RQorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9URVhUVVJFX0dBVEhFUl9PRkZTRVQgMHg4RTVGCisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJSQVkgICAgICAgICAweDkwMDkKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQX0FSUkFZIDB4OTAwQQorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX0NVQkVfTUFQX0FSUkFZICAgMHg5MDBCCisjZGVmaW5lIEdMX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVkgICAgICAgICAweDkwMEMKKyNkZWZpbmUgR0xfU0FNUExFUl9DVUJFX01BUF9BUlJBWV9TSEFET1cgIDB4OTAwRAorI2RlZmluZSBHTF9JTlRfU0FNUExFUl9DVUJFX01BUF9BUlJBWSAgICAgMHg5MDBFCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkVfTUFQX0FSUkFZIDB4OTAwRgorLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3RleHR1cmVfcXVlcnlfbG9kIChub25lKSAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2RyYXdfYnVmZmVyc19ibGVuZCAobm9uZSkgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9kcmF3X2luZGlyZWN0ICovCisvKiByZXVzZSBHTF9EUkFXX0lORElSRUNUX0JVRkZFUiAqLworLyogcmV1c2UgR0xfRFJBV19JTkRJUkVDVF9CVUZGRVJfQklORElORyAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2dwdV9zaGFkZXI1ICovCisvKiByZXVzZSBHTF9HRU9NRVRSWV9TSEFERVJfSU5WT0NBVElPTlMgKi8KKy8qIHJldXNlIEdMX01BWF9HRU9NRVRSWV9TSEFERVJfSU5WT0NBVElPTlMgKi8KKy8qIHJldXNlIEdMX01JTl9GUkFHTUVOVF9JTlRFUlBPTEFUSU9OX09GRlNFVCAqLworLyogcmV1c2UgR0xfTUFYX0ZSQUdNRU5UX0lOVEVSUE9MQVRJT05fT0ZGU0VUICovCisvKiByZXVzZSBHTF9GUkFHTUVOVF9JTlRFUlBPTEFUSU9OX09GRlNFVF9CSVRTICovCisvKiByZXVzZSBHTF9NQVhfVkVSVEVYX1NUUkVBTVMgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9ncHVfc2hhZGVyX2ZwNjQgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9WRUMyICovCisvKiByZXVzZSBHTF9ET1VCTEVfVkVDMyAqLworLyogcmV1c2UgR0xfRE9VQkxFX1ZFQzQgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQyICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUMyAqLworLyogcmV1c2UgR0xfRE9VQkxFX01BVDQgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQyeDMgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQyeDQgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQzeDIgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQzeDQgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQ0eDIgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQ0eDMgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9zaGFkZXJfc3Vicm91dGluZSAqLworLyogcmV1c2UgR0xfQUNUSVZFX1NVQlJPVVRJTkVTICovCisvKiByZXVzZSBHTF9BQ1RJVkVfU1VCUk9VVElORV9VTklGT1JNUyAqLworLyogcmV1c2UgR0xfQUNUSVZFX1NVQlJPVVRJTkVfVU5JRk9STV9MT0NBVElPTlMgKi8KKy8qIHJldXNlIEdMX0FDVElWRV9TVUJST1VUSU5FX01BWF9MRU5HVEggKi8KKy8qIHJldXNlIEdMX0FDVElWRV9TVUJST1VUSU5FX1VOSUZPUk1fTUFYX0xFTkdUSCAqLworLyogcmV1c2UgR0xfTUFYX1NVQlJPVVRJTkVTICovCisvKiByZXVzZSBHTF9NQVhfU1VCUk9VVElORV9VTklGT1JNX0xPQ0FUSU9OUyAqLworLyogcmV1c2UgR0xfTlVNX0NPTVBBVElCTEVfU1VCUk9VVElORVMgKi8KKy8qIHJldXNlIEdMX0NPTVBBVElCTEVfU1VCUk9VVElORVMgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl90ZXNzZWxsYXRpb25fc2hhZGVyICovCisvKiByZXVzZSBHTF9QQVRDSEVTICovCisvKiByZXVzZSBHTF9QQVRDSF9WRVJUSUNFUyAqLworLyogcmV1c2UgR0xfUEFUQ0hfREVGQVVMVF9JTk5FUl9MRVZFTCAqLworLyogcmV1c2UgR0xfUEFUQ0hfREVGQVVMVF9PVVRFUl9MRVZFTCAqLworLyogcmV1c2UgR0xfVEVTU19DT05UUk9MX09VVFBVVF9WRVJUSUNFUyAqLworLyogcmV1c2UgR0xfVEVTU19HRU5fTU9ERSAqLworLyogcmV1c2UgR0xfVEVTU19HRU5fU1BBQ0lORyAqLworLyogcmV1c2UgR0xfVEVTU19HRU5fVkVSVEVYX09SREVSICovCisvKiByZXVzZSBHTF9URVNTX0dFTl9QT0lOVF9NT0RFICovCisvKiByZXVzZSBHTF9JU09MSU5FUyAqLworLyogcmV1c2UgR0xfRlJBQ1RJT05BTF9PREQgKi8KKy8qIHJldXNlIEdMX0ZSQUNUSU9OQUxfRVZFTiAqLworLyogcmV1c2UgR0xfTUFYX1BBVENIX1ZFUlRJQ0VTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19HRU5fTEVWRUwgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX0NPTlRST0xfVU5JRk9STV9DT01QT05FTlRTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX1VOSUZPUk1fQ09NUE9ORU5UUyAqLworLyogcmV1c2UgR0xfTUFYX1RFU1NfQ09OVFJPTF9URVhUVVJFX0lNQUdFX1VOSVRTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX1RFWFRVUkVfSU1BR0VfVU5JVFMgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX0NPTlRST0xfT1VUUFVUX0NPTVBPTkVOVFMgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX1BBVENIX0NPTVBPTkVOVFMgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX0NPTlRST0xfVE9UQUxfT1VUUFVUX0NPTVBPTkVOVFMgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX0VWQUxVQVRJT05fT1VUUFVUX0NPTVBPTkVOVFMgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX0NPTlRST0xfVU5JRk9STV9CTE9DS1MgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX0VWQUxVQVRJT05fVU5JRk9STV9CTE9DS1MgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX0NPTlRST0xfSU5QVVRfQ09NUE9ORU5UUyAqLworLyogcmV1c2UgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9JTlBVVF9DT01QT05FTlRTICovCisvKiByZXVzZSBHTF9NQVhfQ09NQklORURfVEVTU19DT05UUk9MX1VOSUZPUk1fQ09NUE9ORU5UUyAqLworLyogcmV1c2UgR0xfTUFYX0NPTUJJTkVEX1RFU1NfRVZBTFVBVElPTl9VTklGT1JNX0NPTVBPTkVOVFMgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fQkxPQ0tfUkVGRVJFTkNFRF9CWV9URVNTX0NPTlRST0xfU0hBREVSICovCisvKiByZXVzZSBHTF9VTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVEVTU19FVkFMVUFUSU9OX1NIQURFUiAqLworLyogcmV1c2UgR0xfVEVTU19FVkFMVUFUSU9OX1NIQURFUiAqLworLyogcmV1c2UgR0xfVEVTU19DT05UUk9MX1NIQURFUiAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3RleHR1cmVfYnVmZmVyX29iamVjdF9yZ2IzMiAobm9uZSkgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl90cmFuc2Zvcm1fZmVlZGJhY2syICovCisvKiByZXVzZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0sgKi8KKy8qIHJldXNlIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfUEFVU0VEICovCisvKiByZXVzZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX0FDVElWRSAqLworLyogcmV1c2UgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JJTkRJTkcgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl90cmFuc2Zvcm1fZmVlZGJhY2szICovCisvKiByZXVzZSBHTF9NQVhfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUlMgKi8KKy8qIHJldXNlIEdMX01BWF9WRVJURVhfU1RSRUFNUyAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl80XzEKKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9FUzJfY29tcGF0aWJpbGl0eSAqLworLyogcmV1c2UgR0xfRklYRUQgKi8KKy8qIHJldXNlIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSAqLworLyogcmV1c2UgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQgKi8KKy8qIHJldXNlIEdMX0xPV19GTE9BVCAqLworLyogcmV1c2UgR0xfTUVESVVNX0ZMT0FUICovCisvKiByZXVzZSBHTF9ISUdIX0ZMT0FUICovCisvKiByZXVzZSBHTF9MT1dfSU5UICovCisvKiByZXVzZSBHTF9NRURJVU1fSU5UICovCisvKiByZXVzZSBHTF9ISUdIX0lOVCAqLworLyogcmV1c2UgR0xfU0hBREVSX0NPTVBJTEVSICovCisvKiByZXVzZSBHTF9OVU1fU0hBREVSX0JJTkFSWV9GT1JNQVRTICovCisvKiByZXVzZSBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyAqLworLyogcmV1c2UgR0xfTUFYX1ZBUllJTkdfVkVDVE9SUyAqLworLyogcmV1c2UgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2dldF9wcm9ncmFtX2JpbmFyeSAqLworLyogcmV1c2UgR0xfUFJPR1JBTV9CSU5BUllfUkVUUklFVkFCTEVfSElOVCAqLworLyogcmV1c2UgR0xfUFJPR1JBTV9CSU5BUllfTEVOR1RIICovCisvKiByZXVzZSBHTF9OVU1fUFJPR1JBTV9CSU5BUllfRk9STUFUUyAqLworLyogcmV1c2UgR0xfUFJPR1JBTV9CSU5BUllfRk9STUFUUyAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzICovCisvKiByZXVzZSBHTF9WRVJURVhfU0hBREVSX0JJVCAqLworLyogcmV1c2UgR0xfRlJBR01FTlRfU0hBREVSX0JJVCAqLworLyogcmV1c2UgR0xfR0VPTUVUUllfU0hBREVSX0JJVCAqLworLyogcmV1c2UgR0xfVEVTU19DT05UUk9MX1NIQURFUl9CSVQgKi8KKy8qIHJldXNlIEdMX1RFU1NfRVZBTFVBVElPTl9TSEFERVJfQklUICovCisvKiByZXVzZSBHTF9BTExfU0hBREVSX0JJVFMgKi8KKy8qIHJldXNlIEdMX1BST0dSQU1fU0VQQVJBQkxFICovCisvKiByZXVzZSBHTF9BQ1RJVkVfUFJPR1JBTSAqLworLyogcmV1c2UgR0xfUFJPR1JBTV9QSVBFTElORV9CSU5ESU5HICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfc2hhZGVyX3ByZWNpc2lvbiAobm9uZSkgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl92ZXJ0ZXhfYXR0cmliXzY0Yml0IC0gYWxsIGFyZSBpbiBHTCAzLjAgYW5kIDQuMCBhbHJlYWR5ICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdmlld3BvcnRfYXJyYXkgLSBzb21lIGFyZSBpbiBHTCAxLjEgYW5kIEFSQl9wcm92b2tpbmdfdmVydGV4IGFscmVhZHkgKi8KKy8qIHJldXNlIEdMX01BWF9WSUVXUE9SVFMgKi8KKy8qIHJldXNlIEdMX1ZJRVdQT1JUX1NVQlBJWEVMX0JJVFMgKi8KKy8qIHJldXNlIEdMX1ZJRVdQT1JUX0JPVU5EU19SQU5HRSAqLworLyogcmV1c2UgR0xfTEFZRVJfUFJPVk9LSU5HX1ZFUlRFWCAqLworLyogcmV1c2UgR0xfVklFV1BPUlRfSU5ERVhfUFJPVk9LSU5HX1ZFUlRFWCAqLworLyogcmV1c2UgR0xfVU5ERUZJTkVEX1ZFUlRFWCAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl80XzIKKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9iYXNlX2luc3RhbmNlIChub25lKSAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFjayAobm9uZSkgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl90cmFuc2Zvcm1fZmVlZGJhY2tfaW5zdGFuY2VkIChub25lKSAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2NvbXByZXNzZWRfdGV4dHVyZV9waXhlbF9zdG9yYWdlICovCisvKiByZXVzZSBHTF9VTlBBQ0tfQ09NUFJFU1NFRF9CTE9DS19XSURUSCAqLworLyogcmV1c2UgR0xfVU5QQUNLX0NPTVBSRVNTRURfQkxPQ0tfSEVJR0hUICovCisvKiByZXVzZSBHTF9VTlBBQ0tfQ09NUFJFU1NFRF9CTE9DS19ERVBUSCAqLworLyogcmV1c2UgR0xfVU5QQUNLX0NPTVBSRVNTRURfQkxPQ0tfU0laRSAqLworLyogcmV1c2UgR0xfUEFDS19DT01QUkVTU0VEX0JMT0NLX1dJRFRIICovCisvKiByZXVzZSBHTF9QQUNLX0NPTVBSRVNTRURfQkxPQ0tfSEVJR0hUICovCisvKiByZXVzZSBHTF9QQUNLX0NPTVBSRVNTRURfQkxPQ0tfREVQVEggKi8KKy8qIHJldXNlIEdMX1BBQ0tfQ09NUFJFU1NFRF9CTE9DS19TSVpFICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfY29uc2VydmF0aXZlX2RlcHRoIChub25lKSAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2ludGVybmFsZm9ybWF0X3F1ZXJ5ICovCisvKiByZXVzZSBHTF9OVU1fU0FNUExFX0NPVU5UUyAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX21hcF9idWZmZXJfYWxpZ25tZW50ICovCisvKiByZXVzZSBHTF9NSU5fTUFQX0JVRkZFUl9BTElHTk1FTlQgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9zaGFkZXJfYXRvbWljX2NvdW50ZXJzICovCisvKiByZXVzZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVIgKi8KKy8qIHJldXNlIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9CSU5ESU5HICovCisvKiByZXVzZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfU1RBUlQgKi8KKy8qIHJldXNlIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9TSVpFICovCisvKiByZXVzZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfREFUQV9TSVpFICovCisvKiByZXVzZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfQUNUSVZFX0FUT01JQ19DT1VOVEVSUyAqLworLyogcmV1c2UgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX0FDVElWRV9BVE9NSUNfQ09VTlRFUl9JTkRJQ0VTICovCisvKiByZXVzZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfUkVGRVJFTkNFRF9CWV9WRVJURVhfU0hBREVSICovCisvKiByZXVzZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfUkVGRVJFTkNFRF9CWV9URVNTX0NPTlRST0xfU0hBREVSICovCisvKiByZXVzZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfUkVGRVJFTkNFRF9CWV9URVNTX0VWQUxVQVRJT05fU0hBREVSICovCisvKiByZXVzZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfUkVGRVJFTkNFRF9CWV9HRU9NRVRSWV9TSEFERVIgKi8KKy8qIHJldXNlIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9SRUZFUkVOQ0VEX0JZX0ZSQUdNRU5UX1NIQURFUiAqLworLyogcmV1c2UgR0xfTUFYX1ZFUlRFWF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19DT05UUk9MX0FUT01JQ19DT1VOVEVSX0JVRkZFUlMgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX0VWQUxVQVRJT05fQVRPTUlDX0NPVU5URVJfQlVGRkVSUyAqLworLyogcmV1c2UgR0xfTUFYX0dFT01FVFJZX0FUT01JQ19DT1VOVEVSX0JVRkZFUlMgKi8KKy8qIHJldXNlIEdMX01BWF9GUkFHTUVOVF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTICovCisvKiByZXVzZSBHTF9NQVhfQ09NQklORURfQVRPTUlDX0NPVU5URVJfQlVGRkVSUyAqLworLyogcmV1c2UgR0xfTUFYX1ZFUlRFWF9BVE9NSUNfQ09VTlRFUlMgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX0NPTlRST0xfQVRPTUlDX0NPVU5URVJTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX0FUT01JQ19DT1VOVEVSUyAqLworLyogcmV1c2UgR0xfTUFYX0dFT01FVFJZX0FUT01JQ19DT1VOVEVSUyAqLworLyogcmV1c2UgR0xfTUFYX0ZSQUdNRU5UX0FUT01JQ19DT1VOVEVSUyAqLworLyogcmV1c2UgR0xfTUFYX0NPTUJJTkVEX0FUT01JQ19DT1VOVEVSUyAqLworLyogcmV1c2UgR0xfTUFYX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9TSVpFICovCisvKiByZXVzZSBHTF9NQVhfQVRPTUlDX0NPVU5URVJfQlVGRkVSX0JJTkRJTkdTICovCisvKiByZXVzZSBHTF9BQ1RJVkVfQVRPTUlDX0NPVU5URVJfQlVGRkVSUyAqLworLyogcmV1c2UgR0xfVU5JRk9STV9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfSU5ERVggKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX0lOVF9BVE9NSUNfQ09VTlRFUiAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlICovCisvKiByZXVzZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JBUlJJRVJfQklUICovCisvKiByZXVzZSBHTF9FTEVNRU5UX0FSUkFZX0JBUlJJRVJfQklUICovCisvKiByZXVzZSBHTF9VTklGT1JNX0JBUlJJRVJfQklUICovCisvKiByZXVzZSBHTF9URVhUVVJFX0ZFVENIX0JBUlJJRVJfQklUICovCisvKiByZXVzZSBHTF9TSEFERVJfSU1BR0VfQUNDRVNTX0JBUlJJRVJfQklUICovCisvKiByZXVzZSBHTF9DT01NQU5EX0JBUlJJRVJfQklUICovCisvKiByZXVzZSBHTF9QSVhFTF9CVUZGRVJfQkFSUklFUl9CSVQgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfVVBEQVRFX0JBUlJJRVJfQklUICovCisvKiByZXVzZSBHTF9CVUZGRVJfVVBEQVRFX0JBUlJJRVJfQklUICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9CQVJSSUVSX0JJVCAqLworLyogcmV1c2UgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JBUlJJRVJfQklUICovCisvKiByZXVzZSBHTF9BVE9NSUNfQ09VTlRFUl9CQVJSSUVSX0JJVCAqLworLyogcmV1c2UgR0xfQUxMX0JBUlJJRVJfQklUUyAqLworLyogcmV1c2UgR0xfTUFYX0lNQUdFX1VOSVRTICovCisvKiByZXVzZSBHTF9NQVhfQ09NQklORURfSU1BR0VfVU5JVFNfQU5EX0ZSQUdNRU5UX09VVFBVVFMgKi8KKy8qIHJldXNlIEdMX0lNQUdFX0JJTkRJTkdfTkFNRSAqLworLyogcmV1c2UgR0xfSU1BR0VfQklORElOR19MRVZFTCAqLworLyogcmV1c2UgR0xfSU1BR0VfQklORElOR19MQVlFUkVEICovCisvKiByZXVzZSBHTF9JTUFHRV9CSU5ESU5HX0xBWUVSICovCisvKiByZXVzZSBHTF9JTUFHRV9CSU5ESU5HX0FDQ0VTUyAqLworLyogcmV1c2UgR0xfSU1BR0VfMUQgKi8KKy8qIHJldXNlIEdMX0lNQUdFXzJEICovCisvKiByZXVzZSBHTF9JTUFHRV8zRCAqLworLyogcmV1c2UgR0xfSU1BR0VfMkRfUkVDVCAqLworLyogcmV1c2UgR0xfSU1BR0VfQ1VCRSAqLworLyogcmV1c2UgR0xfSU1BR0VfQlVGRkVSICovCisvKiByZXVzZSBHTF9JTUFHRV8xRF9BUlJBWSAqLworLyogcmV1c2UgR0xfSU1BR0VfMkRfQVJSQVkgKi8KKy8qIHJldXNlIEdMX0lNQUdFX0NVQkVfTUFQX0FSUkFZICovCisvKiByZXVzZSBHTF9JTUFHRV8yRF9NVUxUSVNBTVBMRSAqLworLyogcmV1c2UgR0xfSU1BR0VfMkRfTVVMVElTQU1QTEVfQVJSQVkgKi8KKy8qIHJldXNlIEdMX0lOVF9JTUFHRV8xRCAqLworLyogcmV1c2UgR0xfSU5UX0lNQUdFXzJEICovCisvKiByZXVzZSBHTF9JTlRfSU1BR0VfM0QgKi8KKy8qIHJldXNlIEdMX0lOVF9JTUFHRV8yRF9SRUNUICovCisvKiByZXVzZSBHTF9JTlRfSU1BR0VfQ1VCRSAqLworLyogcmV1c2UgR0xfSU5UX0lNQUdFX0JVRkZFUiAqLworLyogcmV1c2UgR0xfSU5UX0lNQUdFXzFEX0FSUkFZICovCisvKiByZXVzZSBHTF9JTlRfSU1BR0VfMkRfQVJSQVkgKi8KKy8qIHJldXNlIEdMX0lOVF9JTUFHRV9DVUJFX01BUF9BUlJBWSAqLworLyogcmV1c2UgR0xfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFICovCisvKiByZXVzZSBHTF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEVfQVJSQVkgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8xRCAqLworLyogcmV1c2UgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEICovCisvKiByZXVzZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfM0QgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRF9SRUNUICovCisvKiByZXVzZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfQ1VCRSAqLworLyogcmV1c2UgR0xfVU5TSUdORURfSU5UX0lNQUdFX0JVRkZFUiAqLworLyogcmV1c2UgR0xfVU5TSUdORURfSU5UX0lNQUdFXzFEX0FSUkFZICovCisvKiByZXVzZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfQVJSQVkgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV9DVUJFX01BUF9BUlJBWSAqLworLyogcmV1c2UgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFICovCisvKiByZXVzZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEVfQVJSQVkgKi8KKy8qIHJldXNlIEdMX01BWF9JTUFHRV9TQU1QTEVTICovCisvKiByZXVzZSBHTF9JTUFHRV9CSU5ESU5HX0ZPUk1BVCAqLworLyogcmV1c2UgR0xfSU1BR0VfRk9STUFUX0NPTVBBVElCSUxJVFlfVFlQRSAqLworLyogcmV1c2UgR0xfSU1BR0VfRk9STUFUX0NPTVBBVElCSUxJVFlfQllfU0laRSAqLworLyogcmV1c2UgR0xfSU1BR0VfRk9STUFUX0NPTVBBVElCSUxJVFlfQllfQ0xBU1MgKi8KKy8qIHJldXNlIEdMX01BWF9WRVJURVhfSU1BR0VfVU5JRk9STVMgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX0NPTlRST0xfSU1BR0VfVU5JRk9STVMgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX0VWQUxVQVRJT05fSU1BR0VfVU5JRk9STVMgKi8KKy8qIHJldXNlIEdMX01BWF9HRU9NRVRSWV9JTUFHRV9VTklGT1JNUyAqLworLyogcmV1c2UgR0xfTUFYX0ZSQUdNRU5UX0lNQUdFX1VOSUZPUk1TICovCisvKiByZXVzZSBHTF9NQVhfQ09NQklORURfSU1BR0VfVU5JRk9STVMgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9zaGFkaW5nX2xhbmd1YWdlX3BhY2tpbmcgKG5vbmUpICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdGV4dHVyZV9zdG9yYWdlICovCisvKiByZXVzZSBHTF9URVhUVVJFX0lNTVVUQUJMRV9GT1JNQVQgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9tdWx0aXRleHR1cmUKKyNkZWZpbmUgR0xfVEVYVFVSRTBfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDMAorI2RlZmluZSBHTF9URVhUVVJFMV9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEMxCisjZGVmaW5lIEdMX1RFWFRVUkUyX0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzIKKyNkZWZpbmUgR0xfVEVYVFVSRTNfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDMworI2RlZmluZSBHTF9URVhUVVJFNF9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEM0CisjZGVmaW5lIEdMX1RFWFRVUkU1X0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzUKKyNkZWZpbmUgR0xfVEVYVFVSRTZfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDNgorI2RlZmluZSBHTF9URVhUVVJFN19BUkIgICAgICAgICAgICAgICAgICAgMHg4NEM3CisjZGVmaW5lIEdMX1RFWFRVUkU4X0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzgKKyNkZWZpbmUgR0xfVEVYVFVSRTlfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDOQorI2RlZmluZSBHTF9URVhUVVJFMTBfQVJCICAgICAgICAgICAgICAgICAgMHg4NENBCisjZGVmaW5lIEdMX1RFWFRVUkUxMV9BUkIgICAgICAgICAgICAgICAgICAweDg0Q0IKKyNkZWZpbmUgR0xfVEVYVFVSRTEyX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRDQworI2RlZmluZSBHTF9URVhUVVJFMTNfQVJCICAgICAgICAgICAgICAgICAgMHg4NENECisjZGVmaW5lIEdMX1RFWFRVUkUxNF9BUkIgICAgICAgICAgICAgICAgICAweDg0Q0UKKyNkZWZpbmUgR0xfVEVYVFVSRTE1X0FSQiAgICAgICAgICAgICAgICAgIDB4ODRDRgorI2RlZmluZSBHTF9URVhUVVJFMTZfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQwCisjZGVmaW5lIEdMX1RFWFRVUkUxN19BUkIgICAgICAgICAgICAgICAgICAweDg0RDEKKyNkZWZpbmUgR0xfVEVYVFVSRTE4X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREMgorI2RlZmluZSBHTF9URVhUVVJFMTlfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQzCisjZGVmaW5lIEdMX1RFWFRVUkUyMF9BUkIgICAgICAgICAgICAgICAgICAweDg0RDQKKyNkZWZpbmUgR0xfVEVYVFVSRTIxX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRENQorI2RlZmluZSBHTF9URVhUVVJFMjJfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQ2CisjZGVmaW5lIEdMX1RFWFRVUkUyM19BUkIgICAgICAgICAgICAgICAgICAweDg0RDcKKyNkZWZpbmUgR0xfVEVYVFVSRTI0X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREOAorI2RlZmluZSBHTF9URVhUVVJFMjVfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQ5CisjZGVmaW5lIEdMX1RFWFRVUkUyNl9BUkIgICAgICAgICAgICAgICAgICAweDg0REEKKyNkZWZpbmUgR0xfVEVYVFVSRTI3X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREQgorI2RlZmluZSBHTF9URVhUVVJFMjhfQVJCICAgICAgICAgICAgICAgICAgMHg4NERDCisjZGVmaW5lIEdMX1RFWFRVUkUyOV9BUkIgICAgICAgICAgICAgICAgICAweDg0REQKKyNkZWZpbmUgR0xfVEVYVFVSRTMwX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRERQorI2RlZmluZSBHTF9URVhUVVJFMzFfQVJCICAgICAgICAgICAgICAgICAgMHg4NERGCisjZGVmaW5lIEdMX0FDVElWRV9URVhUVVJFX0FSQiAgICAgICAgICAgICAweDg0RTAKKyNkZWZpbmUgR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFX0FSQiAgICAgIDB4ODRFMQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9VTklUU19BUkIgICAgICAgICAgMHg4NEUyCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdHJhbnNwb3NlX21hdHJpeAorI2RlZmluZSBHTF9UUkFOU1BPU0VfTU9ERUxWSUVXX01BVFJJWF9BUkIgMHg4NEUzCisjZGVmaW5lIEdMX1RSQU5TUE9TRV9QUk9KRUNUSU9OX01BVFJJWF9BUkIgMHg4NEU0CisjZGVmaW5lIEdMX1RSQU5TUE9TRV9URVhUVVJFX01BVFJJWF9BUkIgICAweDg0RTUKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX0NPTE9SX01BVFJJWF9BUkIgICAgIDB4ODRFNgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0FSQiAgICAgICAgICAgICAgICAweDgwOUQKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFX0FSQiAgIDB4ODA5RQorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FX0FSQiAgICAgICAgMHg4MDlGCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9BUkIgICAgICAgICAgICAweDgwQTAKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlNfQVJCICAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTX0FSQiAgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRV9BUkIgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVF9BUkIgICAgIDB4ODBBQgorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CSVRfQVJCICAgICAgICAgICAgMHgyMDAwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZW52X2FkZAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfY3ViZV9tYXAKKyNkZWZpbmUgR0xfTk9STUFMX01BUF9BUkIgICAgICAgICAgICAgICAgIDB4ODUxMQorI2RlZmluZSBHTF9SRUZMRUNUSU9OX01BUF9BUkIgICAgICAgICAgICAgMHg4NTEyCisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCICAgICAgICAgICAweDg1MTMKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQX0FSQiAgIDB4ODUxNAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfQVJCIDB4ODUxNQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfQVJCIDB4ODUxNgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfQVJCIDB4ODUxNworI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfQVJCIDB4ODUxOAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfQVJCIDB4ODUxOQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfQVJCIDB4ODUxQQorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX0NVQkVfTUFQX0FSQiAgICAgMHg4NTFCCisjZGVmaW5lIEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkVfQVJCICAweDg1MUMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfQUxQSEFfQVJCICAgICAgICAgICAweDg0RTkKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0VfQVJCICAgICAgIDB4ODRFQQorI2RlZmluZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9BTFBIQV9BUkIgMHg4NEVCCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfSU5URU5TSVRZX0FSQiAgICAgICAweDg0RUMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfQVJCICAgICAgICAgICAgIDB4ODRFRAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfQVJCICAgICAgICAgICAgMHg4NEVFCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUFJFU1NJT05fSElOVF9BUkIgICAweDg0RUYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0VEX0lNQUdFX1NJWkVfQVJCIDB4ODZBMAorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTRURfQVJCICAgICAgICAgMHg4NkExCisjZGVmaW5lIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUU19BUkIgMHg4NkEyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTX0FSQiAweDg2QTMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2JvcmRlcl9jbGFtcAorI2RlZmluZSBHTF9DTEFNUF9UT19CT1JERVJfQVJCICAgICAgICAgICAgMHg4MTJECisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfcG9pbnRfcGFyYW1ldGVycworI2RlZmluZSBHTF9QT0lOVF9TSVpFX01JTl9BUkIgICAgICAgICAgICAgMHg4MTI2CisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUFYX0FSQiAgICAgICAgICAgICAweDgxMjcKKyNkZWZpbmUgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRV9BUkIgIDB4ODEyOAorI2RlZmluZSBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTl9BUkIgMHg4MTI5CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X2JsZW5kCisjZGVmaW5lIEdMX01BWF9WRVJURVhfVU5JVFNfQVJCICAgICAgICAgICAweDg2QTQKKyNkZWZpbmUgR0xfQUNUSVZFX1ZFUlRFWF9VTklUU19BUkIgICAgICAgIDB4ODZBNQorI2RlZmluZSBHTF9XRUlHSFRfU1VNX1VOSVRZX0FSQiAgICAgICAgICAgMHg4NkE2CisjZGVmaW5lIEdMX1ZFUlRFWF9CTEVORF9BUkIgICAgICAgICAgICAgICAweDg2QTcKKyNkZWZpbmUgR0xfQ1VSUkVOVF9XRUlHSFRfQVJCICAgICAgICAgICAgIDB4ODZBOAorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfVFlQRV9BUkIgICAgICAgICAgMHg4NkE5CisjZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfQVJCICAgICAgICAweDg2QUEKKyNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX1NJWkVfQVJCICAgICAgICAgIDB4ODZBQgorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9BUkIgICAgICAgMHg4NkFDCisjZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9BUkIgICAgICAgICAgICAgICAweDg2QUQKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMF9BUkIgICAgICAgICAgICAgICAgIDB4MTcwMAorI2RlZmluZSBHTF9NT0RFTFZJRVcxX0FSQiAgICAgICAgICAgICAgICAgMHg4NTBBCisjZGVmaW5lIEdMX01PREVMVklFVzJfQVJCICAgICAgICAgICAgICAgICAweDg3MjIKKyNkZWZpbmUgR0xfTU9ERUxWSUVXM19BUkIgICAgICAgICAgICAgICAgIDB4ODcyMworI2RlZmluZSBHTF9NT0RFTFZJRVc0X0FSQiAgICAgICAgICAgICAgICAgMHg4NzI0CisjZGVmaW5lIEdMX01PREVMVklFVzVfQVJCICAgICAgICAgICAgICAgICAweDg3MjUKKyNkZWZpbmUgR0xfTU9ERUxWSUVXNl9BUkIgICAgICAgICAgICAgICAgIDB4ODcyNgorI2RlZmluZSBHTF9NT0RFTFZJRVc3X0FSQiAgICAgICAgICAgICAgICAgMHg4NzI3CisjZGVmaW5lIEdMX01PREVMVklFVzhfQVJCICAgICAgICAgICAgICAgICAweDg3MjgKKyNkZWZpbmUgR0xfTU9ERUxWSUVXOV9BUkIgICAgICAgICAgICAgICAgIDB4ODcyOQorI2RlZmluZSBHTF9NT0RFTFZJRVcxMF9BUkIgICAgICAgICAgICAgICAgMHg4NzJBCisjZGVmaW5lIEdMX01PREVMVklFVzExX0FSQiAgICAgICAgICAgICAgICAweDg3MkIKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMTJfQVJCICAgICAgICAgICAgICAgIDB4ODcyQworI2RlZmluZSBHTF9NT0RFTFZJRVcxM19BUkIgICAgICAgICAgICAgICAgMHg4NzJECisjZGVmaW5lIEdMX01PREVMVklFVzE0X0FSQiAgICAgICAgICAgICAgICAweDg3MkUKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMTVfQVJCICAgICAgICAgICAgICAgIDB4ODcyRgorI2RlZmluZSBHTF9NT0RFTFZJRVcxNl9BUkIgICAgICAgICAgICAgICAgMHg4NzMwCisjZGVmaW5lIEdMX01PREVMVklFVzE3X0FSQiAgICAgICAgICAgICAgICAweDg3MzEKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMThfQVJCICAgICAgICAgICAgICAgIDB4ODczMgorI2RlZmluZSBHTF9NT0RFTFZJRVcxOV9BUkIgICAgICAgICAgICAgICAgMHg4NzMzCisjZGVmaW5lIEdMX01PREVMVklFVzIwX0FSQiAgICAgICAgICAgICAgICAweDg3MzQKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMjFfQVJCICAgICAgICAgICAgICAgIDB4ODczNQorI2RlZmluZSBHTF9NT0RFTFZJRVcyMl9BUkIgICAgICAgICAgICAgICAgMHg4NzM2CisjZGVmaW5lIEdMX01PREVMVklFVzIzX0FSQiAgICAgICAgICAgICAgICAweDg3MzcKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMjRfQVJCICAgICAgICAgICAgICAgIDB4ODczOAorI2RlZmluZSBHTF9NT0RFTFZJRVcyNV9BUkIgICAgICAgICAgICAgICAgMHg4NzM5CisjZGVmaW5lIEdMX01PREVMVklFVzI2X0FSQiAgICAgICAgICAgICAgICAweDg3M0EKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMjdfQVJCICAgICAgICAgICAgICAgIDB4ODczQgorI2RlZmluZSBHTF9NT0RFTFZJRVcyOF9BUkIgICAgICAgICAgICAgICAgMHg4NzNDCisjZGVmaW5lIEdMX01PREVMVklFVzI5X0FSQiAgICAgICAgICAgICAgICAweDg3M0QKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMzBfQVJCICAgICAgICAgICAgICAgIDB4ODczRQorI2RlZmluZSBHTF9NT0RFTFZJRVczMV9BUkIgICAgICAgICAgICAgICAgMHg4NzNGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfbWF0cml4X3BhbGV0dGUKKyNkZWZpbmUgR0xfTUFUUklYX1BBTEVUVEVfQVJCICAgICAgICAgICAgIDB4ODg0MAorI2RlZmluZSBHTF9NQVhfTUFUUklYX1BBTEVUVEVfU1RBQ0tfREVQVEhfQVJCIDB4ODg0MQorI2RlZmluZSBHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19BUkIgICAgICAgMHg4ODQyCisjZGVmaW5lIEdMX0NVUlJFTlRfUEFMRVRURV9NQVRSSVhfQVJCICAgICAweDg4NDMKKyNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX0FSQiAgICAgICAgIDB4ODg0NAorI2RlZmluZSBHTF9DVVJSRU5UX01BVFJJWF9JTkRFWF9BUkIgICAgICAgMHg4ODQ1CisjZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX0FSQiAgICAweDg4NDYKKyNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfQVJCICAgIDB4ODg0NworI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX0FSQiAgMHg4ODQ4CisjZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9QT0lOVEVSX0FSQiAweDg4NDkKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9jb21iaW5lCisjZGVmaW5lIEdMX0NPTUJJTkVfQVJCICAgICAgICAgICAgICAgICAgICAweDg1NzAKKyNkZWZpbmUgR0xfQ09NQklORV9SR0JfQVJCICAgICAgICAgICAgICAgIDB4ODU3MQorI2RlZmluZSBHTF9DT01CSU5FX0FMUEhBX0FSQiAgICAgICAgICAgICAgMHg4NTcyCisjZGVmaW5lIEdMX1NPVVJDRTBfUkdCX0FSQiAgICAgICAgICAgICAgICAweDg1ODAKKyNkZWZpbmUgR0xfU09VUkNFMV9SR0JfQVJCICAgICAgICAgICAgICAgIDB4ODU4MQorI2RlZmluZSBHTF9TT1VSQ0UyX1JHQl9BUkIgICAgICAgICAgICAgICAgMHg4NTgyCisjZGVmaW5lIEdMX1NPVVJDRTBfQUxQSEFfQVJCICAgICAgICAgICAgICAweDg1ODgKKyNkZWZpbmUgR0xfU09VUkNFMV9BTFBIQV9BUkIgICAgICAgICAgICAgIDB4ODU4OQorI2RlZmluZSBHTF9TT1VSQ0UyX0FMUEhBX0FSQiAgICAgICAgICAgICAgMHg4NThBCisjZGVmaW5lIEdMX09QRVJBTkQwX1JHQl9BUkIgICAgICAgICAgICAgICAweDg1OTAKKyNkZWZpbmUgR0xfT1BFUkFORDFfUkdCX0FSQiAgICAgICAgICAgICAgIDB4ODU5MQorI2RlZmluZSBHTF9PUEVSQU5EMl9SR0JfQVJCICAgICAgICAgICAgICAgMHg4NTkyCisjZGVmaW5lIEdMX09QRVJBTkQwX0FMUEhBX0FSQiAgICAgICAgICAgICAweDg1OTgKKyNkZWZpbmUgR0xfT1BFUkFORDFfQUxQSEFfQVJCICAgICAgICAgICAgIDB4ODU5OQorI2RlZmluZSBHTF9PUEVSQU5EMl9BTFBIQV9BUkIgICAgICAgICAgICAgMHg4NTlBCisjZGVmaW5lIEdMX1JHQl9TQ0FMRV9BUkIgICAgICAgICAgICAgICAgICAweDg1NzMKKyNkZWZpbmUgR0xfQUREX1NJR05FRF9BUkIgICAgICAgICAgICAgICAgIDB4ODU3NAorI2RlZmluZSBHTF9JTlRFUlBPTEFURV9BUkIgICAgICAgICAgICAgICAgMHg4NTc1CisjZGVmaW5lIEdMX1NVQlRSQUNUX0FSQiAgICAgICAgICAgICAgICAgICAweDg0RTcKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQVJCICAgICAgICAgICAgICAgICAgIDB4ODU3NgorI2RlZmluZSBHTF9QUklNQVJZX0NPTE9SX0FSQiAgICAgICAgICAgICAgMHg4NTc3CisjZGVmaW5lIEdMX1BSRVZJT1VTX0FSQiAgICAgICAgICAgICAgICAgICAweDg1NzgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9jcm9zc2JhcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZW52X2RvdDMKKyNkZWZpbmUgR0xfRE9UM19SR0JfQVJCICAgICAgICAgICAgICAgICAgIDB4ODZBRQorI2RlZmluZSBHTF9ET1QzX1JHQkFfQVJCICAgICAgICAgICAgICAgICAgMHg4NkFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQKKyNkZWZpbmUgR0xfTUlSUk9SRURfUkVQRUFUX0FSQiAgICAgICAgICAgIDB4ODM3MAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RlcHRoX3RleHR1cmUKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMTZfQVJCICAgICAgICAgIDB4ODFBNQorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQyNF9BUkIgICAgICAgICAgMHg4MUE2CisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDMyX0FSQiAgICAgICAgICAweDgxQTcKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSF9TSVpFX0FSQiAgICAgICAgIDB4ODg0QQorI2RlZmluZSBHTF9ERVBUSF9URVhUVVJFX01PREVfQVJCICAgICAgICAgMHg4ODRCCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZG93CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9NT0RFX0FSQiAgICAgICAweDg4NEMKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX0ZVTkNfQVJCICAgICAgIDB4ODg0RAorI2RlZmluZSBHTF9DT01QQVJFX1JfVE9fVEVYVFVSRV9BUkIgICAgICAgMHg4ODRFCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZG93X2FtYmllbnQKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX0ZBSUxfVkFMVUVfQVJCIDB4ODBCRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3dpbmRvd19wb3MKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfcHJvZ3JhbQorI2RlZmluZSBHTF9DT0xPUl9TVU1fQVJCICAgICAgICAgICAgICAgICAgMHg4NDU4CisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiAgICAgICAgICAgICAweDg2MjAKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEX0FSQiAweDg2MjIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFX0FSQiAgIDB4ODYyMworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NUUklERV9BUkIgMHg4NjI0CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRV9BUkIgICAweDg2MjUKKyNkZWZpbmUgR0xfQ1VSUkVOVF9WRVJURVhfQVRUUklCX0FSQiAgICAgIDB4ODYyNgorI2RlZmluZSBHTF9QUk9HUkFNX0xFTkdUSF9BUkIgICAgICAgICAgICAgMHg4NjI3CisjZGVmaW5lIEdMX1BST0dSQU1fU1RSSU5HX0FSQiAgICAgICAgICAgICAweDg2MjgKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTUFUUklYX1NUQUNLX0RFUFRIX0FSQiAweDg2MkUKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTUFUUklDRVNfQVJCICAgICAgIDB4ODYyRgorI2RlZmluZSBHTF9DVVJSRU5UX01BVFJJWF9TVEFDS19ERVBUSF9BUkIgMHg4NjQwCisjZGVmaW5lIEdMX0NVUlJFTlRfTUFUUklYX0FSQiAgICAgICAgICAgICAweDg2NDEKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRV9BUkIgIDB4ODY0MgorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9UV09fU0lERV9BUkIgICAgMHg4NjQzCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUl9BUkIgMHg4NjQ1CisjZGVmaW5lIEdMX1BST0dSQU1fRVJST1JfUE9TSVRJT05fQVJCICAgICAweDg2NEIKKyNkZWZpbmUgR0xfUFJPR1JBTV9CSU5ESU5HX0FSQiAgICAgICAgICAgIDB4ODY3NworI2RlZmluZSBHTF9NQVhfVkVSVEVYX0FUVFJJQlNfQVJCICAgICAgICAgMHg4ODY5CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRF9BUkIgMHg4ODZBCisjZGVmaW5lIEdMX1BST0dSQU1fRVJST1JfU1RSSU5HX0FSQiAgICAgICAweDg4NzQKKyNkZWZpbmUgR0xfUFJPR1JBTV9GT1JNQVRfQVNDSUlfQVJCICAgICAgIDB4ODg3NQorI2RlZmluZSBHTF9QUk9HUkFNX0ZPUk1BVF9BUkIgICAgICAgICAgICAgMHg4ODc2CisjZGVmaW5lIEdMX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAgICAgICAweDg4QTAKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAgIDB4ODhBMQorI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9JTlNUUlVDVElPTlNfQVJCIDB4ODhBMgorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfSU5TVFJVQ1RJT05TX0FSQiAweDg4QTMKKyNkZWZpbmUgR0xfUFJPR1JBTV9URU1QT1JBUklFU19BUkIgICAgICAgIDB4ODhBNAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9URU1QT1JBUklFU19BUkIgICAgMHg4OEE1CisjZGVmaW5lIEdMX1BST0dSQU1fTkFUSVZFX1RFTVBPUkFSSUVTX0FSQiAweDg4QTYKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFTVBPUkFSSUVTX0FSQiAweDg4QTcKKyNkZWZpbmUgR0xfUFJPR1JBTV9QQVJBTUVURVJTX0FSQiAgICAgICAgIDB4ODhBOAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9QQVJBTUVURVJTX0FSQiAgICAgMHg4OEE5CisjZGVmaW5lIEdMX1BST0dSQU1fTkFUSVZFX1BBUkFNRVRFUlNfQVJCICAweDg4QUEKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX1BBUkFNRVRFUlNfQVJCIDB4ODhBQgorI2RlZmluZSBHTF9QUk9HUkFNX0FUVFJJQlNfQVJCICAgICAgICAgICAgMHg4OEFDCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0FUVFJJQlNfQVJCICAgICAgICAweDg4QUQKKyNkZWZpbmUgR0xfUFJPR1JBTV9OQVRJVkVfQVRUUklCU19BUkIgICAgIDB4ODhBRQorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfQVRUUklCU19BUkIgMHg4OEFGCisjZGVmaW5lIEdMX1BST0dSQU1fQUREUkVTU19SRUdJU1RFUlNfQVJCICAweDg4QjAKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fQUREUkVTU19SRUdJU1RFUlNfQVJCIDB4ODhCMQorI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9BRERSRVNTX1JFR0lTVEVSU19BUkIgMHg4OEIyCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX05BVElWRV9BRERSRVNTX1JFR0lTVEVSU19BUkIgMHg4OEIzCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0xPQ0FMX1BBUkFNRVRFUlNfQVJCIDB4ODhCNAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9FTlZfUEFSQU1FVEVSU19BUkIgMHg4OEI1CisjZGVmaW5lIEdMX1BST0dSQU1fVU5ERVJfTkFUSVZFX0xJTUlUU19BUkIgMHg4OEI2CisjZGVmaW5lIEdMX1RSQU5TUE9TRV9DVVJSRU5UX01BVFJJWF9BUkIgICAweDg4QjcKKyNkZWZpbmUgR0xfTUFUUklYMF9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDMAorI2RlZmluZSBHTF9NQVRSSVgxX0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEMxCisjZGVmaW5lIEdMX01BVFJJWDJfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzIKKyNkZWZpbmUgR0xfTUFUUklYM19BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDMworI2RlZmluZSBHTF9NQVRSSVg0X0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEM0CisjZGVmaW5lIEdMX01BVFJJWDVfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzUKKyNkZWZpbmUgR0xfTUFUUklYNl9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDNgorI2RlZmluZSBHTF9NQVRSSVg3X0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEM3CisjZGVmaW5lIEdMX01BVFJJWDhfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzgKKyNkZWZpbmUgR0xfTUFUUklYOV9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDOQorI2RlZmluZSBHTF9NQVRSSVgxMF9BUkIgICAgICAgICAgICAgICAgICAgMHg4OENBCisjZGVmaW5lIEdMX01BVFJJWDExX0FSQiAgICAgICAgICAgICAgICAgICAweDg4Q0IKKyNkZWZpbmUgR0xfTUFUUklYMTJfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhDQworI2RlZmluZSBHTF9NQVRSSVgxM19BUkIgICAgICAgICAgICAgICAgICAgMHg4OENECisjZGVmaW5lIEdMX01BVFJJWDE0X0FSQiAgICAgICAgICAgICAgICAgICAweDg4Q0UKKyNkZWZpbmUgR0xfTUFUUklYMTVfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhDRgorI2RlZmluZSBHTF9NQVRSSVgxNl9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQwCisjZGVmaW5lIEdMX01BVFJJWDE3X0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDEKKyNkZWZpbmUgR0xfTUFUUklYMThfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEMgorI2RlZmluZSBHTF9NQVRSSVgxOV9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQzCisjZGVmaW5lIEdMX01BVFJJWDIwX0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDQKKyNkZWZpbmUgR0xfTUFUUklYMjFfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhENQorI2RlZmluZSBHTF9NQVRSSVgyMl9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQ2CisjZGVmaW5lIEdMX01BVFJJWDIzX0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDcKKyNkZWZpbmUgR0xfTUFUUklYMjRfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEOAorI2RlZmluZSBHTF9NQVRSSVgyNV9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQ5CisjZGVmaW5lIEdMX01BVFJJWDI2X0FSQiAgICAgICAgICAgICAgICAgICAweDg4REEKKyNkZWZpbmUgR0xfTUFUUklYMjdfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEQgorI2RlZmluZSBHTF9NQVRSSVgyOF9BUkIgICAgICAgICAgICAgICAgICAgMHg4OERDCisjZGVmaW5lIEdMX01BVFJJWDI5X0FSQiAgICAgICAgICAgICAgICAgICAweDg4REQKKyNkZWZpbmUgR0xfTUFUUklYMzBfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhERQorI2RlZmluZSBHTF9NQVRSSVgzMV9BUkIgICAgICAgICAgICAgICAgICAgMHg4OERGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbQorI2RlZmluZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQiAgICAgICAgICAgMHg4ODA0CisjZGVmaW5lIEdMX1BST0dSQU1fQUxVX0lOU1RSVUNUSU9OU19BUkIgICAweDg4MDUKKyNkZWZpbmUgR0xfUFJPR1JBTV9URVhfSU5TVFJVQ1RJT05TX0FSQiAgIDB4ODgwNgorI2RlZmluZSBHTF9QUk9HUkFNX1RFWF9JTkRJUkVDVElPTlNfQVJCICAgMHg4ODA3CisjZGVmaW5lIEdMX1BST0dSQU1fTkFUSVZFX0FMVV9JTlNUUlVDVElPTlNfQVJCIDB4ODgwOAorI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9URVhfSU5TVFJVQ1RJT05TX0FSQiAweDg4MDkKKyNkZWZpbmUgR0xfUFJPR1JBTV9OQVRJVkVfVEVYX0lORElSRUNUSU9OU19BUkIgMHg4ODBBCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0FMVV9JTlNUUlVDVElPTlNfQVJCIDB4ODgwQgorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9URVhfSU5TVFJVQ1RJT05TX0FSQiAweDg4MEMKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fVEVYX0lORElSRUNUSU9OU19BUkIgMHg4ODBECisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX05BVElWRV9BTFVfSU5TVFJVQ1RJT05TX0FSQiAweDg4MEUKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFWF9JTlNUUlVDVElPTlNfQVJCIDB4ODgwRgorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfVEVYX0lORElSRUNUSU9OU19BUkIgMHg4ODEwCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX0NPT1JEU19BUkIgICAgICAgICAweDg4NzEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCICAgIDB4ODg3MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0JVRkZFUl9TSVpFX0FSQiAgICAgICAgICAgICAgICAweDg3NjQKKyNkZWZpbmUgR0xfQlVGRkVSX1VTQUdFX0FSQiAgICAgICAgICAgICAgIDB4ODc2NQorI2RlZmluZSBHTF9BUlJBWV9CVUZGRVJfQVJCICAgICAgICAgICAgICAgMHg4ODkyCisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0FSQiAgICAgICAweDg4OTMKKyNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCICAgICAgIDB4ODg5NAorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OTUKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OTYKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OTcKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5OAorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODk5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5QQorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5QgorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5QworI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODlECisjZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODlFCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5RgorI2RlZmluZSBHTF9SRUFEX09OTFlfQVJCICAgICAgICAgICAgICAgICAgMHg4OEI4CisjZGVmaW5lIEdMX1dSSVRFX09OTFlfQVJCICAgICAgICAgICAgICAgICAweDg4QjkKKyNkZWZpbmUgR0xfUkVBRF9XUklURV9BUkIgICAgICAgICAgICAgICAgIDB4ODhCQQorI2RlZmluZSBHTF9CVUZGRVJfQUNDRVNTX0FSQiAgICAgICAgICAgICAgMHg4OEJCCisjZGVmaW5lIEdMX0JVRkZFUl9NQVBQRURfQVJCICAgICAgICAgICAgICAweDg4QkMKKyNkZWZpbmUgR0xfQlVGRkVSX01BUF9QT0lOVEVSX0FSQiAgICAgICAgIDB4ODhCRAorI2RlZmluZSBHTF9TVFJFQU1fRFJBV19BUkIgICAgICAgICAgICAgICAgMHg4OEUwCisjZGVmaW5lIEdMX1NUUkVBTV9SRUFEX0FSQiAgICAgICAgICAgICAgICAweDg4RTEKKyNkZWZpbmUgR0xfU1RSRUFNX0NPUFlfQVJCICAgICAgICAgICAgICAgIDB4ODhFMgorI2RlZmluZSBHTF9TVEFUSUNfRFJBV19BUkIgICAgICAgICAgICAgICAgMHg4OEU0CisjZGVmaW5lIEdMX1NUQVRJQ19SRUFEX0FSQiAgICAgICAgICAgICAgICAweDg4RTUKKyNkZWZpbmUgR0xfU1RBVElDX0NPUFlfQVJCICAgICAgICAgICAgICAgIDB4ODhFNgorI2RlZmluZSBHTF9EWU5BTUlDX0RSQVdfQVJCICAgICAgICAgICAgICAgMHg4OEU4CisjZGVmaW5lIEdMX0RZTkFNSUNfUkVBRF9BUkIgICAgICAgICAgICAgICAweDg4RTkKKyNkZWZpbmUgR0xfRFlOQU1JQ19DT1BZX0FSQiAgICAgICAgICAgICAgIDB4ODhFQQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX29jY2x1c2lvbl9xdWVyeQorI2RlZmluZSBHTF9RVUVSWV9DT1VOVEVSX0JJVFNfQVJCICAgICAgICAgMHg4ODY0CisjZGVmaW5lIEdMX0NVUlJFTlRfUVVFUllfQVJCICAgICAgICAgICAgICAweDg4NjUKKyNkZWZpbmUgR0xfUVVFUllfUkVTVUxUX0FSQiAgICAgICAgICAgICAgIDB4ODg2NgorI2RlZmluZSBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFX0FSQiAgICAgMHg4ODY3CisjZGVmaW5lIEdMX1NBTVBMRVNfUEFTU0VEX0FSQiAgICAgICAgICAgICAweDg5MTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkZXJfb2JqZWN0cworI2RlZmluZSBHTF9QUk9HUkFNX09CSkVDVF9BUkIgICAgICAgICAgICAgMHg4QjQwCisjZGVmaW5lIEdMX1NIQURFUl9PQkpFQ1RfQVJCICAgICAgICAgICAgICAweDhCNDgKKyNkZWZpbmUgR0xfT0JKRUNUX1RZUEVfQVJCICAgICAgICAgICAgICAgIDB4OEI0RQorI2RlZmluZSBHTF9PQkpFQ1RfU1VCVFlQRV9BUkIgICAgICAgICAgICAgMHg4QjRGCisjZGVmaW5lIEdMX0ZMT0FUX1ZFQzJfQVJCICAgICAgICAgICAgICAgICAweDhCNTAKKyNkZWZpbmUgR0xfRkxPQVRfVkVDM19BUkIgICAgICAgICAgICAgICAgIDB4OEI1MQorI2RlZmluZSBHTF9GTE9BVF9WRUM0X0FSQiAgICAgICAgICAgICAgICAgMHg4QjUyCisjZGVmaW5lIEdMX0lOVF9WRUMyX0FSQiAgICAgICAgICAgICAgICAgICAweDhCNTMKKyNkZWZpbmUgR0xfSU5UX1ZFQzNfQVJCICAgICAgICAgICAgICAgICAgIDB4OEI1NAorI2RlZmluZSBHTF9JTlRfVkVDNF9BUkIgICAgICAgICAgICAgICAgICAgMHg4QjU1CisjZGVmaW5lIEdMX0JPT0xfQVJCICAgICAgICAgICAgICAgICAgICAgICAweDhCNTYKKyNkZWZpbmUgR0xfQk9PTF9WRUMyX0FSQiAgICAgICAgICAgICAgICAgIDB4OEI1NworI2RlZmluZSBHTF9CT09MX1ZFQzNfQVJCICAgICAgICAgICAgICAgICAgMHg4QjU4CisjZGVmaW5lIEdMX0JPT0xfVkVDNF9BUkIgICAgICAgICAgICAgICAgICAweDhCNTkKKyNkZWZpbmUgR0xfRkxPQVRfTUFUMl9BUkIgICAgICAgICAgICAgICAgIDB4OEI1QQorI2RlZmluZSBHTF9GTE9BVF9NQVQzX0FSQiAgICAgICAgICAgICAgICAgMHg4QjVCCisjZGVmaW5lIEdMX0ZMT0FUX01BVDRfQVJCICAgICAgICAgICAgICAgICAweDhCNUMKKyNkZWZpbmUgR0xfU0FNUExFUl8xRF9BUkIgICAgICAgICAgICAgICAgIDB4OEI1RAorI2RlZmluZSBHTF9TQU1QTEVSXzJEX0FSQiAgICAgICAgICAgICAgICAgMHg4QjVFCisjZGVmaW5lIEdMX1NBTVBMRVJfM0RfQVJCICAgICAgICAgICAgICAgICAweDhCNUYKKyNkZWZpbmUgR0xfU0FNUExFUl9DVUJFX0FSQiAgICAgICAgICAgICAgIDB4OEI2MAorI2RlZmluZSBHTF9TQU1QTEVSXzFEX1NIQURPV19BUkIgICAgICAgICAgMHg4QjYxCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfU0hBRE9XX0FSQiAgICAgICAgICAweDhCNjIKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9SRUNUX0FSQiAgICAgICAgICAgIDB4OEI2MworI2RlZmluZSBHTF9TQU1QTEVSXzJEX1JFQ1RfU0hBRE9XX0FSQiAgICAgMHg4QjY0CisjZGVmaW5lIEdMX09CSkVDVF9ERUxFVEVfU1RBVFVTX0FSQiAgICAgICAweDhCODAKKyNkZWZpbmUgR0xfT0JKRUNUX0NPTVBJTEVfU1RBVFVTX0FSQiAgICAgIDB4OEI4MQorI2RlZmluZSBHTF9PQkpFQ1RfTElOS19TVEFUVVNfQVJCICAgICAgICAgMHg4QjgyCisjZGVmaW5lIEdMX09CSkVDVF9WQUxJREFURV9TVEFUVVNfQVJCICAgICAweDhCODMKKyNkZWZpbmUgR0xfT0JKRUNUX0lORk9fTE9HX0xFTkdUSF9BUkIgICAgIDB4OEI4NAorI2RlZmluZSBHTF9PQkpFQ1RfQVRUQUNIRURfT0JKRUNUU19BUkIgICAgMHg4Qjg1CisjZGVmaW5lIEdMX09CSkVDVF9BQ1RJVkVfVU5JRk9STVNfQVJCICAgICAweDhCODYKKyNkZWZpbmUgR0xfT0JKRUNUX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEhfQVJCIDB4OEI4NworI2RlZmluZSBHTF9PQkpFQ1RfU0hBREVSX1NPVVJDRV9MRU5HVEhfQVJCIDB4OEI4OAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9zaGFkZXIKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9BUkIgICAgICAgICAgICAgIDB4OEIzMQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UU19BUkIgMHg4QjRBCisjZGVmaW5lIEdMX01BWF9WQVJZSU5HX0ZMT0FUU19BUkIgICAgICAgICAweDhCNEIKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiAweDhCNEMKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCIDB4OEI0RAorI2RlZmluZSBHTF9PQkpFQ1RfQUNUSVZFX0FUVFJJQlVURVNfQVJCICAgMHg4Qjg5CisjZGVmaW5lIEdMX09CSkVDVF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEhfQVJCIDB4OEI4QQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfQVJCICAgICAgICAgICAgMHg4QjMwCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFNfQVJCIDB4OEI0OQorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UX0FSQiAweDhCOEIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzEwMAorI2RlZmluZSBHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT05fQVJCICAgMHg4QjhDCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfcG9pbnRfc3ByaXRlCisjZGVmaW5lIEdMX1BPSU5UX1NQUklURV9BUkIgICAgICAgICAgICAgICAweDg4NjEKKyNkZWZpbmUgR0xfQ09PUkRfUkVQTEFDRV9BUkIgICAgICAgICAgICAgIDB4ODg2MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW1fc2hhZG93CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZHJhd19idWZmZXJzCisjZGVmaW5lIEdMX01BWF9EUkFXX0JVRkZFUlNfQVJCICAgICAgICAgICAweDg4MjQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIwX0FSQiAgICAgICAgICAgICAgIDB4ODgyNQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjFfQVJCICAgICAgICAgICAgICAgMHg4ODI2CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMl9BUkIgICAgICAgICAgICAgICAweDg4MjcKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIzX0FSQiAgICAgICAgICAgICAgIDB4ODgyOAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjRfQVJCICAgICAgICAgICAgICAgMHg4ODI5CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNV9BUkIgICAgICAgICAgICAgICAweDg4MkEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI2X0FSQiAgICAgICAgICAgICAgIDB4ODgyQgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjdfQVJCICAgICAgICAgICAgICAgMHg4ODJDCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSOF9BUkIgICAgICAgICAgICAgICAweDg4MkQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI5X0FSQiAgICAgICAgICAgICAgIDB4ODgyRQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEwX0FSQiAgICAgICAgICAgICAgMHg4ODJGCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTFfQVJCICAgICAgICAgICAgICAweDg4MzAKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMl9BUkIgICAgICAgICAgICAgIDB4ODgzMQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEzX0FSQiAgICAgICAgICAgICAgMHg4ODMyCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTRfQVJCICAgICAgICAgICAgICAweDg4MzMKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxNV9BUkIgICAgICAgICAgICAgIDB4ODgzNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfcmVjdGFuZ2xlCisjZGVmaW5lIEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQiAgICAgICAgICAweDg0RjUKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX1JFQ1RBTkdMRV9BUkIgIDB4ODRGNgorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX1JFQ1RBTkdMRV9BUkIgICAgMHg4NEY3CisjZGVmaW5lIEdMX01BWF9SRUNUQU5HTEVfVEVYVFVSRV9TSVpFX0FSQiAweDg0RjgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9jb2xvcl9idWZmZXJfZmxvYXQKKyNkZWZpbmUgR0xfUkdCQV9GTE9BVF9NT0RFX0FSQiAgICAgICAgICAgIDB4ODgyMAorI2RlZmluZSBHTF9DTEFNUF9WRVJURVhfQ09MT1JfQVJCICAgICAgICAgMHg4OTFBCisjZGVmaW5lIEdMX0NMQU1QX0ZSQUdNRU5UX0NPTE9SX0FSQiAgICAgICAweDg5MUIKKyNkZWZpbmUgR0xfQ0xBTVBfUkVBRF9DT0xPUl9BUkIgICAgICAgICAgIDB4ODkxQworI2RlZmluZSBHTF9GSVhFRF9PTkxZX0FSQiAgICAgICAgICAgICAgICAgMHg4OTFECisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfaGFsZl9mbG9hdF9waXhlbAorI2RlZmluZSBHTF9IQUxGX0ZMT0FUX0FSQiAgICAgICAgICAgICAgICAgMHgxNDBCCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9mbG9hdAorI2RlZmluZSBHTF9URVhUVVJFX1JFRF9UWVBFX0FSQiAgICAgICAgICAgMHg4QzEwCisjZGVmaW5lIEdMX1RFWFRVUkVfR1JFRU5fVFlQRV9BUkIgICAgICAgICAweDhDMTEKKyNkZWZpbmUgR0xfVEVYVFVSRV9CTFVFX1RZUEVfQVJCICAgICAgICAgIDB4OEMxMgorI2RlZmluZSBHTF9URVhUVVJFX0FMUEhBX1RZUEVfQVJCICAgICAgICAgMHg4QzEzCisjZGVmaW5lIEdMX1RFWFRVUkVfTFVNSU5BTkNFX1RZUEVfQVJCICAgICAweDhDMTQKKyNkZWZpbmUgR0xfVEVYVFVSRV9JTlRFTlNJVFlfVFlQRV9BUkIgICAgIDB4OEMxNQorI2RlZmluZSBHTF9URVhUVVJFX0RFUFRIX1RZUEVfQVJCICAgICAgICAgMHg4QzE2CisjZGVmaW5lIEdMX1VOU0lHTkVEX05PUk1BTElaRURfQVJCICAgICAgICAweDhDMTcKKyNkZWZpbmUgR0xfUkdCQTMyRl9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODgxNAorI2RlZmluZSBHTF9SR0IzMkZfQVJCICAgICAgICAgICAgICAgICAgICAgMHg4ODE1CisjZGVmaW5lIEdMX0FMUEhBMzJGX0FSQiAgICAgICAgICAgICAgICAgICAweDg4MTYKKyNkZWZpbmUgR0xfSU5URU5TSVRZMzJGX0FSQiAgICAgICAgICAgICAgIDB4ODgxNworI2RlZmluZSBHTF9MVU1JTkFOQ0UzMkZfQVJCICAgICAgICAgICAgICAgMHg4ODE4CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQTMyRl9BUkIgICAgICAgICAweDg4MTkKKyNkZWZpbmUgR0xfUkdCQTE2Rl9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODgxQQorI2RlZmluZSBHTF9SR0IxNkZfQVJCICAgICAgICAgICAgICAgICAgICAgMHg4ODFCCisjZGVmaW5lIEdMX0FMUEhBMTZGX0FSQiAgICAgICAgICAgICAgICAgICAweDg4MUMKKyNkZWZpbmUgR0xfSU5URU5TSVRZMTZGX0FSQiAgICAgICAgICAgICAgIDB4ODgxRAorI2RlZmluZSBHTF9MVU1JTkFOQ0UxNkZfQVJCICAgICAgICAgICAgICAgMHg4ODFFCisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQTE2Rl9BUkIgICAgICAgICAweDg4MUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9waXhlbF9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX1BJWEVMX1BBQ0tfQlVGRkVSX0FSQiAgICAgICAgICAweDg4RUIKKyNkZWZpbmUgR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9BUkIgICAgICAgIDB4ODhFQworI2RlZmluZSBHTF9QSVhFTF9QQUNLX0JVRkZFUl9CSU5ESU5HX0FSQiAgMHg4OEVECisjZGVmaW5lIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfQklORElOR19BUkIgMHg4OEVGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZGVwdGhfYnVmZmVyX2Zsb2F0CisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDMyRiAgICAgICAgICAgICAweDhDQUMKKyNkZWZpbmUgR0xfREVQVEgzMkZfU1RFTkNJTDggICAgICAgICAgICAgIDB4OENBRAorI2RlZmluZSBHTF9GTE9BVF8zMl9VTlNJR05FRF9JTlRfMjRfOF9SRVYgMHg4REFECisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZHJhd19pbnN0YW5jZWQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9mcmFtZWJ1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04gIDB4MDUwNgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTE9SX0VOQ09ESU5HIDB4ODIxMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTVBPTkVOVF9UWVBFIDB4ODIxMQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1JFRF9TSVpFIDB4ODIxMgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0dSRUVOX1NJWkUgMHg4MjEzCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQkxVRV9TSVpFIDB4ODIxNAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0FMUEhBX1NJWkUgMHg4MjE1CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfREVQVEhfU0laRSAweDgyMTYKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9TVEVOQ0lMX1NJWkUgMHg4MjE3CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0RFRkFVTFQgICAgICAgICAgICAweDgyMTgKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfVU5ERUZJTkVEICAgICAgICAgIDB4ODIxOQorI2RlZmluZSBHTF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQgICAgICAgMHg4MjFBCisjZGVmaW5lIEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRSAgICAgICAgICAweDg0RTgKKyNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTCAgICAgICAgICAgICAgICAgIDB4ODRGOQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMjRfOCAgICAgICAgICAgICAgMHg4NEZBCisjZGVmaW5lIEdMX0RFUFRIMjRfU1RFTkNJTDggICAgICAgICAgICAgICAweDg4RjAKKyNkZWZpbmUgR0xfVEVYVFVSRV9TVEVOQ0lMX1NJWkUgICAgICAgICAgIDB4ODhGMQorI2RlZmluZSBHTF9URVhUVVJFX1JFRF9UWVBFICAgICAgICAgICAgICAgMHg4QzEwCisjZGVmaW5lIEdMX1RFWFRVUkVfR1JFRU5fVFlQRSAgICAgICAgICAgICAweDhDMTEKKyNkZWZpbmUgR0xfVEVYVFVSRV9CTFVFX1RZUEUgICAgICAgICAgICAgIDB4OEMxMgorI2RlZmluZSBHTF9URVhUVVJFX0FMUEhBX1RZUEUgICAgICAgICAgICAgMHg4QzEzCisjZGVmaW5lIEdMX1RFWFRVUkVfREVQVEhfVFlQRSAgICAgICAgICAgICAweDhDMTYKKyNkZWZpbmUgR0xfVU5TSUdORURfTk9STUFMSVpFRCAgICAgICAgICAgIDB4OEMxNworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HICAgICAgICAgICAgMHg4Q0E2CisjZGVmaW5lIEdMX0RSQVdfRlJBTUVCVUZGRVJfQklORElORyAgICAgICBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HICAgICAgICAgICAweDhDQTcKKyNkZWZpbmUgR0xfUkVBRF9GUkFNRUJVRkZFUiAgICAgICAgICAgICAgIDB4OENBOAorI2RlZmluZSBHTF9EUkFXX0ZSQU1FQlVGRkVSICAgICAgICAgICAgICAgMHg4Q0E5CisjZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfQklORElORyAgICAgICAweDhDQUEKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NBTVBMRVMgICAgICAgICAgIDB4OENBQgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFIDB4OENEMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FIDB4OENEMQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUwgMHg4Q0QyCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFIDB4OENEMworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVIgMHg4Q0Q0CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFICAgICAgICAgICAweDhDRDUKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UIDB4OENENgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVCAweDhDRDcKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9EUkFXX0JVRkZFUiAweDhDREIKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9SRUFEX0JVRkZFUiAweDhDREMKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQgICAgICAgIDB4OENERAorI2RlZmluZSBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFMgICAgICAgICAgMHg4Q0RGCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQwICAgICAgICAgICAgICAweDhDRTAKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEgICAgICAgICAgICAgIDB4OENFMQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMiAgICAgICAgICAgICAgMHg4Q0UyCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQzICAgICAgICAgICAgICAweDhDRTMKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDQgICAgICAgICAgICAgIDB4OENFNAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNSAgICAgICAgICAgICAgMHg4Q0U1CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ2ICAgICAgICAgICAgICAweDhDRTYKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDcgICAgICAgICAgICAgIDB4OENFNworI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UOCAgICAgICAgICAgICAgMHg4Q0U4CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ5ICAgICAgICAgICAgICAweDhDRTkKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEwICAgICAgICAgICAgIDB4OENFQQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTEgICAgICAgICAgICAgMHg4Q0VCCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMiAgICAgICAgICAgICAweDhDRUMKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEzICAgICAgICAgICAgIDB4OENFRAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTQgICAgICAgICAgICAgMHg4Q0VFCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxNSAgICAgICAgICAgICAweDhDRUYKKyNkZWZpbmUgR0xfREVQVEhfQVRUQUNITUVOVCAgICAgICAgICAgICAgIDB4OEQwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0FUVEFDSE1FTlQgICAgICAgICAgICAgMHg4RDIwCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSICAgICAgICAgICAgICAgICAgICAweDhENDAKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSICAgICAgICAgICAgICAgICAgIDB4OEQ0MQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfV0lEVEggICAgICAgICAgICAgMHg4RDQyCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9IRUlHSFQgICAgICAgICAgICAweDhENDMKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVCAgIDB4OEQ0NAorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYMSAgICAgICAgICAgICAgICAgMHg4RDQ2CisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg0ICAgICAgICAgICAgICAgICAweDhENDcKKyNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDggICAgICAgICAgICAgICAgIDB4OEQ0OAorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYMTYgICAgICAgICAgICAgICAgMHg4RDQ5CisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9SRURfU0laRSAgICAgICAgICAweDhENTAKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0dSRUVOX1NJWkUgICAgICAgIDB4OEQ1MQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFICAgICAgICAgMHg4RDUyCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFICAgICAgICAweDhENTMKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkUgICAgICAgIDB4OEQ1NAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFICAgICAgMHg4RDU1CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEUgMHg4RDU2CisjZGVmaW5lIEdMX01BWF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAweDhENTcKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9mcmFtZWJ1ZmZlcl9vYmplY3RfREVQUkVDQVRFRAorI2RlZmluZSBHTF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjIyCisjZGVmaW5lIEdMX1RFWFRVUkVfTFVNSU5BTkNFX1RZUEUgICAgICAgICAweDhDMTQKKyNkZWZpbmUgR0xfVEVYVFVSRV9JTlRFTlNJVFlfVFlQRSAgICAgICAgIDB4OEMxNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYW1lYnVmZmVyX3NSR0IKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfU1JHQiAgICAgICAgICAgICAgIDB4OERCOQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2dlb21ldHJ5X3NoYWRlcjQKKyNkZWZpbmUgR0xfTElORVNfQURKQUNFTkNZX0FSQiAgICAgICAgICAgIDB4MDAwQQorI2RlZmluZSBHTF9MSU5FX1NUUklQX0FESkFDRU5DWV9BUkIgICAgICAgMHgwMDBCCisjZGVmaW5lIEdMX1RSSUFOR0xFU19BREpBQ0VOQ1lfQVJCICAgICAgICAweDAwMEMKKyNkZWZpbmUgR0xfVFJJQU5HTEVfU1RSSVBfQURKQUNFTkNZX0FSQiAgIDB4MDAwRAorI2RlZmluZSBHTF9QUk9HUkFNX1BPSU5UX1NJWkVfQVJCICAgICAgICAgMHg4NjQyCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiAweDhDMjkKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9MQVlFUkVEX0FSQiAweDhEQTcKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9MQVlFUl9UQVJHRVRTX0FSQiAweDhEQTgKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9MQVlFUl9DT1VOVF9BUkIgMHg4REE5CisjZGVmaW5lIEdMX0dFT01FVFJZX1NIQURFUl9BUkIgICAgICAgICAgICAweDhERDkKKyNkZWZpbmUgR0xfR0VPTUVUUllfVkVSVElDRVNfT1VUX0FSQiAgICAgIDB4OEREQQorI2RlZmluZSBHTF9HRU9NRVRSWV9JTlBVVF9UWVBFX0FSQiAgICAgICAgMHg4RERCCisjZGVmaW5lIEdMX0dFT01FVFJZX09VVFBVVF9UWVBFX0FSQiAgICAgICAweDhEREMKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1ZBUllJTkdfQ09NUE9ORU5UU19BUkIgMHg4RERECisjZGVmaW5lIEdMX01BWF9WRVJURVhfVkFSWUlOR19DT01QT05FTlRTX0FSQiAweDhEREUKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1VOSUZPUk1fQ09NUE9ORU5UU19BUkIgMHg4RERGCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9PVVRQVVRfVkVSVElDRVNfQVJCIDB4OERFMAorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfVE9UQUxfT1VUUFVUX0NPTVBPTkVOVFNfQVJCIDB4OERFMQorLyogcmV1c2UgR0xfTUFYX1ZBUllJTkdfQ09NUE9ORU5UUyAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfaGFsZl9mbG9hdF92ZXJ0ZXgKKyNkZWZpbmUgR0xfSEFMRl9GTE9BVCAgICAgICAgICAgICAgICAgICAgIDB4MTQwQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2luc3RhbmNlZF9hcnJheXMKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9ESVZJU09SX0FSQiAweDg4RkUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9tYXBfYnVmZmVyX3JhbmdlCisjZGVmaW5lIEdMX01BUF9SRUFEX0JJVCAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgR0xfTUFQX1dSSVRFX0JJVCAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBHTF9NQVBfSU5WQUxJREFURV9SQU5HRV9CSVQgICAgICAgMHgwMDA0CisjZGVmaW5lIEdMX01BUF9JTlZBTElEQVRFX0JVRkZFUl9CSVQgICAgICAweDAwMDgKKyNkZWZpbmUgR0xfTUFQX0ZMVVNIX0VYUExJQ0lUX0JJVCAgICAgICAgIDB4MDAxMAorI2RlZmluZSBHTF9NQVBfVU5TWU5DSFJPTklaRURfQklUICAgICAgICAgMHgwMDIwCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX1RFWFRVUkVfQlVGRkVSX0FSQiAgICAgICAgICAgICAweDhDMkEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfQlVGRkVSX1NJWkVfQVJCICAgIDB4OEMyQgorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfQlVGRkVSX0FSQiAgICAgMHg4QzJDCisjZGVmaW5lIEdMX1RFWFRVUkVfQlVGRkVSX0RBVEFfU1RPUkVfQklORElOR19BUkIgMHg4QzJECisjZGVmaW5lIEdMX1RFWFRVUkVfQlVGRkVSX0ZPUk1BVF9BUkIgICAgICAweDhDMkUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SRURfUkdUQzEgICAgICAgICAgIDB4OERCQgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NJR05FRF9SRURfUkdUQzEgICAgMHg4REJDCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdfUkdUQzIgICAgICAgICAgICAweDhEQkQKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TSUdORURfUkdfUkdUQzIgICAgIDB4OERCRQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfcmcKKyNkZWZpbmUgR0xfUkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyNworI2RlZmluZSBHTF9SR19JTlRFR0VSICAgICAgICAgICAgICAgICAgICAgMHg4MjI4CisjZGVmaW5lIEdMX1I4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMjkKKyNkZWZpbmUgR0xfUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyQQorI2RlZmluZSBHTF9SRzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjJCCisjZGVmaW5lIEdMX1JHMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMkMKKyNkZWZpbmUgR0xfUjE2RiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyRAorI2RlZmluZSBHTF9SMzJGICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjJFCisjZGVmaW5lIEdMX1JHMTZGICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMkYKKyNkZWZpbmUgR0xfUkczMkYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzMAorI2RlZmluZSBHTF9SOEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjMxCisjZGVmaW5lIEdMX1I4VUkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzIKKyNkZWZpbmUgR0xfUjE2SSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzMworI2RlZmluZSBHTF9SMTZVSSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjM0CisjZGVmaW5lIEdMX1IzMkkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzUKKyNkZWZpbmUgR0xfUjMyVUkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzNgorI2RlZmluZSBHTF9SRzhJICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjM3CisjZGVmaW5lIEdMX1JHOFVJICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzgKKyNkZWZpbmUgR0xfUkcxNkkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzOQorI2RlZmluZSBHTF9SRzE2VUkgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjNBCisjZGVmaW5lIEdMX1JHMzJJICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyM0IKKyNkZWZpbmUgR0xfUkczMlVJICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzQworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9hcnJheV9vYmplY3QKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkcgICAgICAgICAgIDB4ODVCNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3VuaWZvcm1fYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9VTklGT1JNX0JVRkZFUiAgICAgICAgICAgICAgICAgMHg4QTExCisjZGVmaW5lIEdMX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkcgICAgICAgICAweDhBMjgKKyNkZWZpbmUgR0xfVU5JRk9STV9CVUZGRVJfU1RBUlQgICAgICAgICAgIDB4OEEyOQorI2RlZmluZSBHTF9VTklGT1JNX0JVRkZFUl9TSVpFICAgICAgICAgICAgMHg4QTJBCisjZGVmaW5lIEdMX01BWF9WRVJURVhfVU5JRk9STV9CTE9DS1MgICAgICAweDhBMkIKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1VOSUZPUk1fQkxPQ0tTICAgIDB4OEEyQworI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9CTE9DS1MgICAgMHg4QTJECisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9VTklGT1JNX0JMT0NLUyAgICAweDhBMkUKKyNkZWZpbmUgR0xfTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTICAgIDB4OEEyRgorI2RlZmluZSBHTF9NQVhfVU5JRk9STV9CTE9DS19TSVpFICAgICAgICAgMHg4QTMwCisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTIDB4OEEzMQorI2RlZmluZSBHTF9NQVhfQ09NQklORURfR0VPTUVUUllfVU5JRk9STV9DT01QT05FTlRTIDB4OEEzMgorI2RlZmluZSBHTF9NQVhfQ09NQklORURfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTIDB4OEEzMworI2RlZmluZSBHTF9VTklGT1JNX0JVRkZFUl9PRkZTRVRfQUxJR05NRU5UIDB4OEEzNAorI2RlZmluZSBHTF9BQ1RJVkVfVU5JRk9STV9CTE9DS19NQVhfTkFNRV9MRU5HVEggMHg4QTM1CisjZGVmaW5lIEdMX0FDVElWRV9VTklGT1JNX0JMT0NLUyAgICAgICAgICAweDhBMzYKKyNkZWZpbmUgR0xfVU5JRk9STV9UWVBFICAgICAgICAgICAgICAgICAgIDB4OEEzNworI2RlZmluZSBHTF9VTklGT1JNX1NJWkUgICAgICAgICAgICAgICAgICAgMHg4QTM4CisjZGVmaW5lIEdMX1VOSUZPUk1fTkFNRV9MRU5HVEggICAgICAgICAgICAweDhBMzkKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19JTkRFWCAgICAgICAgICAgIDB4OEEzQQorI2RlZmluZSBHTF9VTklGT1JNX09GRlNFVCAgICAgICAgICAgICAgICAgMHg4QTNCCisjZGVmaW5lIEdMX1VOSUZPUk1fQVJSQVlfU1RSSURFICAgICAgICAgICAweDhBM0MKKyNkZWZpbmUgR0xfVU5JRk9STV9NQVRSSVhfU1RSSURFICAgICAgICAgIDB4OEEzRAorI2RlZmluZSBHTF9VTklGT1JNX0lTX1JPV19NQUpPUiAgICAgICAgICAgMHg4QTNFCisjZGVmaW5lIEdMX1VOSUZPUk1fQkxPQ0tfQklORElORyAgICAgICAgICAweDhBM0YKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19EQVRBX1NJWkUgICAgICAgIDB4OEE0MAorI2RlZmluZSBHTF9VTklGT1JNX0JMT0NLX05BTUVfTEVOR1RIICAgICAgMHg4QTQxCisjZGVmaW5lIEdMX1VOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1TICAweDhBNDIKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19BQ1RJVkVfVU5JRk9STV9JTkRJQ0VTIDB4OEE0MworI2RlZmluZSBHTF9VTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUiAweDhBNDQKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX0dFT01FVFJZX1NIQURFUiAweDhBNDUKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX0ZSQUdNRU5UX1NIQURFUiAweDhBNDYKKyNkZWZpbmUgR0xfSU5WQUxJRF9JTkRFWCAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkZ1CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfY29tcGF0aWJpbGl0eQorLyogQVJCX2NvbXBhdGliaWxpdHkganVzdCBkZWZpbmVzIHRva2VucyBmcm9tIGNvcmUgMy4wICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfY29weV9idWZmZXIKKyNkZWZpbmUgR0xfQ09QWV9SRUFEX0JVRkZFUiAgICAgICAgICAgICAgIDB4OEYzNgorI2RlZmluZSBHTF9DT1BZX1dSSVRFX0JVRkZFUiAgICAgICAgICAgICAgMHg4RjM3CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGVyX3RleHR1cmVfbG9kCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZGVwdGhfY2xhbXAKKyNkZWZpbmUgR0xfREVQVEhfQ0xBTVAgICAgICAgICAgICAgICAgICAgIDB4ODY0RgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RyYXdfZWxlbWVudHNfYmFzZV92ZXJ0ZXgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9ucworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3Byb3Zva2luZ192ZXJ0ZXgKKyNkZWZpbmUgR0xfUVVBRFNfRk9MTE9XX1BST1ZPS0lOR19WRVJURVhfQ09OVkVOVElPTiAweDhFNEMKKyNkZWZpbmUgR0xfRklSU1RfVkVSVEVYX0NPTlZFTlRJT04gICAgICAgIDB4OEU0RAorI2RlZmluZSBHTF9MQVNUX1ZFUlRFWF9DT05WRU5USU9OICAgICAgICAgMHg4RTRFCisjZGVmaW5lIEdMX1BST1ZPS0lOR19WRVJURVggICAgICAgICAgICAgICAweDhFNEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zZWFtbGVzc19jdWJlX21hcAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1NFQU1MRVNTICAgICAgMHg4ODRGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc3luYworI2RlZmluZSBHTF9NQVhfU0VSVkVSX1dBSVRfVElNRU9VVCAgICAgICAgMHg5MTExCisjZGVmaW5lIEdMX09CSkVDVF9UWVBFICAgICAgICAgICAgICAgICAgICAweDkxMTIKKyNkZWZpbmUgR0xfU1lOQ19DT05ESVRJT04gICAgICAgICAgICAgICAgIDB4OTExMworI2RlZmluZSBHTF9TWU5DX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHg5MTE0CisjZGVmaW5lIEdMX1NZTkNfRkxBR1MgICAgICAgICAgICAgICAgICAgICAweDkxMTUKKyNkZWZpbmUgR0xfU1lOQ19GRU5DRSAgICAgICAgICAgICAgICAgICAgIDB4OTExNgorI2RlZmluZSBHTF9TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSAgICAgMHg5MTE3CisjZGVmaW5lIEdMX1VOU0lHTkFMRUQgICAgICAgICAgICAgICAgICAgICAweDkxMTgKKyNkZWZpbmUgR0xfU0lHTkFMRUQgICAgICAgICAgICAgICAgICAgICAgIDB4OTExOQorI2RlZmluZSBHTF9BTFJFQURZX1NJR05BTEVEICAgICAgICAgICAgICAgMHg5MTFBCisjZGVmaW5lIEdMX1RJTUVPVVRfRVhQSVJFRCAgICAgICAgICAgICAgICAweDkxMUIKKyNkZWZpbmUgR0xfQ09ORElUSU9OX1NBVElTRklFRCAgICAgICAgICAgIDB4OTExQworI2RlZmluZSBHTF9XQUlUX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgMHg5MTFECisjZGVmaW5lIEdMX1NZTkNfRkxVU0hfQ09NTUFORFNfQklUICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMX1RJTUVPVVRfSUdOT1JFRCAgICAgICAgICAgICAgICAweEZGRkZGRkZGRkZGRkZGRkZ1bGwKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX1NBTVBMRV9QT1NJVElPTiAgICAgICAgICAgICAgICAweDhFNTAKKyNkZWZpbmUgR0xfU0FNUExFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4OEU1MQorI2RlZmluZSBHTF9TQU1QTEVfTUFTS19WQUxVRSAgICAgICAgICAgICAgMHg4RTUyCisjZGVmaW5lIEdMX01BWF9TQU1QTEVfTUFTS19XT1JEUyAgICAgICAgICAweDhFNTkKKyNkZWZpbmUgR0xfVEVYVFVSRV8yRF9NVUxUSVNBTVBMRSAgICAgICAgIDB4OTEwMAorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzJEX01VTFRJU0FNUExFICAgMHg5MTAxCisjZGVmaW5lIEdMX1RFWFRVUkVfMkRfTVVMVElTQU1QTEVfQVJSQVkgICAweDkxMDIKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8yRF9NVUxUSVNBTVBMRV9BUlJBWSAweDkxMDMKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HXzJEX01VTFRJU0FNUExFIDB4OTEwNAorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMkRfTVVMVElTQU1QTEVfQVJSQVkgMHg5MTA1CisjZGVmaW5lIEdMX1RFWFRVUkVfU0FNUExFUyAgICAgICAgICAgICAgICAweDkxMDYKKyNkZWZpbmUgR0xfVEVYVFVSRV9GSVhFRF9TQU1QTEVfTE9DQVRJT05TIDB4OTEwNworI2RlZmluZSBHTF9TQU1QTEVSXzJEX01VTFRJU0FNUExFICAgICAgICAgMHg5MTA4CisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSXzJEX01VTFRJU0FNUExFICAgICAweDkxMDkKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfTVVMVElTQU1QTEUgMHg5MTBBCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfTVVMVElTQU1QTEVfQVJSQVkgICAweDkxMEIKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfMkRfTVVMVElTQU1QTEVfQVJSQVkgMHg5MTBDCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX01VTFRJU0FNUExFX0FSUkFZIDB4OTEwRAorI2RlZmluZSBHTF9NQVhfQ09MT1JfVEVYVFVSRV9TQU1QTEVTICAgICAgMHg5MTBFCisjZGVmaW5lIEdMX01BWF9ERVBUSF9URVhUVVJFX1NBTVBMRVMgICAgICAweDkxMEYKKyNkZWZpbmUgR0xfTUFYX0lOVEVHRVJfU0FNUExFUyAgICAgICAgICAgIDB4OTExMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9hcnJheV9iZ3JhCisvKiByZXVzZSBHTF9CR1JBICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZHJhd19idWZmZXJzX2JsZW5kCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2FtcGxlX3NoYWRpbmcKKyNkZWZpbmUgR0xfU0FNUExFX1NIQURJTkdfQVJCICAgICAgICAgICAgIDB4OEMzNgorI2RlZmluZSBHTF9NSU5fU0FNUExFX1NIQURJTkdfVkFMVUVfQVJCICAgMHg4QzM3CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9jdWJlX21hcF9hcnJheQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX0FSUkFZX0FSQiAgICAgMHg5MDA5CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUF9BUlJBWV9BUkIgMHg5MDBBCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfQ1VCRV9NQVBfQVJSQVlfQVJCIDB4OTAwQgorI2RlZmluZSBHTF9TQU1QTEVSX0NVQkVfTUFQX0FSUkFZX0FSQiAgICAgMHg5MDBDCisjZGVmaW5lIEdMX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVlfU0hBRE9XX0FSQiAweDkwMEQKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVlfQVJCIDB4OTAwRQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFX01BUF9BUlJBWV9BUkIgMHg5MDBGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9nYXRoZXIKKyNkZWZpbmUgR0xfTUlOX1BST0dSQU1fVEVYVFVSRV9HQVRIRVJfT0ZGU0VUX0FSQiAweDhFNUUKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fVEVYVFVSRV9HQVRIRVJfT0ZGU0VUX0FSQiAweDhFNUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX3F1ZXJ5X2xvZAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfaW5jbHVkZQorI2RlZmluZSBHTF9TSEFERVJfSU5DTFVERV9BUkIgICAgICAgICAgICAgMHg4REFFCisjZGVmaW5lIEdMX05BTUVEX1NUUklOR19MRU5HVEhfQVJCICAgICAgICAweDhERTkKKyNkZWZpbmUgR0xfTkFNRURfU1RSSU5HX1RZUEVfQVJCICAgICAgICAgIDB4OERFQQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb25fYnB0YworI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfQlBUQ19VTk9STV9BUkIgMHg4RThDCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQV9CUFRDX1VOT1JNX0FSQiAweDhFOEQKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfQlBUQ19TSUdORURfRkxPQVRfQVJCIDB4OEU4RQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQl9CUFRDX1VOU0lHTkVEX0ZMT0FUX0FSQiAweDhFOEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9ibGVuZF9mdW5jX2V4dGVuZGVkCisjZGVmaW5lIEdMX1NSQzFfQ09MT1IgICAgICAgICAgICAgICAgICAgICAweDg4RjkKKy8qIHJldXNlIEdMX1NSQzFfQUxQSEEgKi8KKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQzFfQ09MT1IgICAgICAgICAgIDB4ODhGQQorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDMV9BTFBIQSAgICAgICAgICAgMHg4OEZCCisjZGVmaW5lIEdMX01BWF9EVUFMX1NPVVJDRV9EUkFXX0JVRkZFUlMgICAweDg4RkMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9vY2NsdXNpb25fcXVlcnkyCisjZGVmaW5lIEdMX0FOWV9TQU1QTEVTX1BBU1NFRCAgICAgICAgICAgICAweDhDMkYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zYW1wbGVyX29iamVjdHMKKyNkZWZpbmUgR0xfU0FNUExFUl9CSU5ESU5HICAgICAgICAgICAgICAgIDB4ODkxOQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRlcl9iaXRfZW5jb2RpbmcKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX3JnYjEwX2EydWkKKyNkZWZpbmUgR0xfUkdCMTBfQTJVSSAgICAgICAgICAgICAgICAgICAgIDB4OTA2RgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfc3dpenpsZQorI2RlZmluZSBHTF9URVhUVVJFX1NXSVpaTEVfUiAgICAgICAgICAgICAgMHg4RTQyCisjZGVmaW5lIEdMX1RFWFRVUkVfU1dJWlpMRV9HICAgICAgICAgICAgICAweDhFNDMKKyNkZWZpbmUgR0xfVEVYVFVSRV9TV0laWkxFX0IgICAgICAgICAgICAgIDB4OEU0NAorI2RlZmluZSBHTF9URVhUVVJFX1NXSVpaTEVfQSAgICAgICAgICAgICAgMHg4RTQ1CisjZGVmaW5lIEdMX1RFWFRVUkVfU1dJWlpMRV9SR0JBICAgICAgICAgICAweDhFNDYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90aW1lcl9xdWVyeQorI2RlZmluZSBHTF9USU1FX0VMQVBTRUQgICAgICAgICAgICAgICAgICAgMHg4OEJGCisjZGVmaW5lIEdMX1RJTUVTVEFNUCAgICAgICAgICAgICAgICAgICAgICAweDhFMjgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfdHlwZV8yXzEwXzEwXzEwX3JldgorLyogcmV1c2UgR0xfVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWICovCisjZGVmaW5lIEdMX0lOVF8yXzEwXzEwXzEwX1JFViAgICAgICAgICAgICAweDhEOUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9kcmF3X2luZGlyZWN0CisjZGVmaW5lIEdMX0RSQVdfSU5ESVJFQ1RfQlVGRkVSICAgICAgICAgICAweDhGM0YKKyNkZWZpbmUgR0xfRFJBV19JTkRJUkVDVF9CVUZGRVJfQklORElORyAgIDB4OEY0MworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2dwdV9zaGFkZXI1CisjZGVmaW5lIEdMX0dFT01FVFJZX1NIQURFUl9JTlZPQ0FUSU9OUyAgICAweDg4N0YKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1NIQURFUl9JTlZPQ0FUSU9OUyAweDhFNUEKKyNkZWZpbmUgR0xfTUlOX0ZSQUdNRU5UX0lOVEVSUE9MQVRJT05fT0ZGU0VUIDB4OEU1QgorI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfSU5URVJQT0xBVElPTl9PRkZTRVQgMHg4RTVDCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0lOVEVSUE9MQVRJT05fT0ZGU0VUX0JJVFMgMHg4RTVECisvKiByZXVzZSBHTF9NQVhfVkVSVEVYX1NUUkVBTVMgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9ncHVfc2hhZGVyX2ZwNjQKKy8qIHJldXNlIEdMX0RPVUJMRSAqLworI2RlZmluZSBHTF9ET1VCTEVfVkVDMiAgICAgICAgICAgICAgICAgICAgMHg4RkZDCisjZGVmaW5lIEdMX0RPVUJMRV9WRUMzICAgICAgICAgICAgICAgICAgICAweDhGRkQKKyNkZWZpbmUgR0xfRE9VQkxFX1ZFQzQgICAgICAgICAgICAgICAgICAgIDB4OEZGRQorI2RlZmluZSBHTF9ET1VCTEVfTUFUMiAgICAgICAgICAgICAgICAgICAgMHg4RjQ2CisjZGVmaW5lIEdMX0RPVUJMRV9NQVQzICAgICAgICAgICAgICAgICAgICAweDhGNDcKKyNkZWZpbmUgR0xfRE9VQkxFX01BVDQgICAgICAgICAgICAgICAgICAgIDB4OEY0OAorI2RlZmluZSBHTF9ET1VCTEVfTUFUMngzICAgICAgICAgICAgICAgICAgMHg4RjQ5CisjZGVmaW5lIEdMX0RPVUJMRV9NQVQyeDQgICAgICAgICAgICAgICAgICAweDhGNEEKKyNkZWZpbmUgR0xfRE9VQkxFX01BVDN4MiAgICAgICAgICAgICAgICAgIDB4OEY0QgorI2RlZmluZSBHTF9ET1VCTEVfTUFUM3g0ICAgICAgICAgICAgICAgICAgMHg4RjRDCisjZGVmaW5lIEdMX0RPVUJMRV9NQVQ0eDIgICAgICAgICAgICAgICAgICAweDhGNEQKKyNkZWZpbmUgR0xfRE9VQkxFX01BVDR4MyAgICAgICAgICAgICAgICAgIDB4OEY0RQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRlcl9zdWJyb3V0aW5lCisjZGVmaW5lIEdMX0FDVElWRV9TVUJST1VUSU5FUyAgICAgICAgICAgICAweDhERTUKKyNkZWZpbmUgR0xfQUNUSVZFX1NVQlJPVVRJTkVfVU5JRk9STVMgICAgIDB4OERFNgorI2RlZmluZSBHTF9BQ1RJVkVfU1VCUk9VVElORV9VTklGT1JNX0xPQ0FUSU9OUyAweDhFNDcKKyNkZWZpbmUgR0xfQUNUSVZFX1NVQlJPVVRJTkVfTUFYX0xFTkdUSCAgIDB4OEU0OAorI2RlZmluZSBHTF9BQ1RJVkVfU1VCUk9VVElORV9VTklGT1JNX01BWF9MRU5HVEggMHg4RTQ5CisjZGVmaW5lIEdMX01BWF9TVUJST1VUSU5FUyAgICAgICAgICAgICAgICAweDhERTcKKyNkZWZpbmUgR0xfTUFYX1NVQlJPVVRJTkVfVU5JRk9STV9MT0NBVElPTlMgMHg4REU4CisjZGVmaW5lIEdMX05VTV9DT01QQVRJQkxFX1NVQlJPVVRJTkVTICAgICAweDhFNEEKKyNkZWZpbmUgR0xfQ09NUEFUSUJMRV9TVUJST1VUSU5FUyAgICAgICAgIDB4OEU0QgorLyogcmV1c2UgR0xfVU5JRk9STV9TSVpFICovCisvKiByZXVzZSBHTF9VTklGT1JNX05BTUVfTEVOR1RIICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGVzc2VsbGF0aW9uX3NoYWRlcgorI2RlZmluZSBHTF9QQVRDSEVTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBFCisjZGVmaW5lIEdMX1BBVENIX1ZFUlRJQ0VTICAgICAgICAgICAgICAgICAweDhFNzIKKyNkZWZpbmUgR0xfUEFUQ0hfREVGQVVMVF9JTk5FUl9MRVZFTCAgICAgIDB4OEU3MworI2RlZmluZSBHTF9QQVRDSF9ERUZBVUxUX09VVEVSX0xFVkVMICAgICAgMHg4RTc0CisjZGVmaW5lIEdMX1RFU1NfQ09OVFJPTF9PVVRQVVRfVkVSVElDRVMgICAweDhFNzUKKyNkZWZpbmUgR0xfVEVTU19HRU5fTU9ERSAgICAgICAgICAgICAgICAgIDB4OEU3NgorI2RlZmluZSBHTF9URVNTX0dFTl9TUEFDSU5HICAgICAgICAgICAgICAgMHg4RTc3CisjZGVmaW5lIEdMX1RFU1NfR0VOX1ZFUlRFWF9PUkRFUiAgICAgICAgICAweDhFNzgKKyNkZWZpbmUgR0xfVEVTU19HRU5fUE9JTlRfTU9ERSAgICAgICAgICAgIDB4OEU3OQorLyogcmV1c2UgR0xfVFJJQU5HTEVTICovCisvKiByZXVzZSBHTF9RVUFEUyAqLworI2RlZmluZSBHTF9JU09MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgMHg4RTdBCisvKiByZXVzZSBHTF9FUVVBTCAqLworI2RlZmluZSBHTF9GUkFDVElPTkFMX09ERCAgICAgICAgICAgICAgICAgMHg4RTdCCisjZGVmaW5lIEdMX0ZSQUNUSU9OQUxfRVZFTiAgICAgICAgICAgICAgICAweDhFN0MKKy8qIHJldXNlIEdMX0NDVyAqLworLyogcmV1c2UgR0xfQ1cgKi8KKyNkZWZpbmUgR0xfTUFYX1BBVENIX1ZFUlRJQ0VTICAgICAgICAgICAgIDB4OEU3RAorI2RlZmluZSBHTF9NQVhfVEVTU19HRU5fTEVWRUwgICAgICAgICAgICAgMHg4RTdFCisjZGVmaW5lIEdMX01BWF9URVNTX0NPTlRST0xfVU5JRk9STV9DT01QT05FTlRTIDB4OEU3RgorI2RlZmluZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX1VOSUZPUk1fQ09NUE9ORU5UUyAweDhFODAKKyNkZWZpbmUgR0xfTUFYX1RFU1NfQ09OVFJPTF9URVhUVVJFX0lNQUdFX1VOSVRTIDB4OEU4MQorI2RlZmluZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX1RFWFRVUkVfSU1BR0VfVU5JVFMgMHg4RTgyCisjZGVmaW5lIEdMX01BWF9URVNTX0NPTlRST0xfT1VUUFVUX0NPTVBPTkVOVFMgMHg4RTgzCisjZGVmaW5lIEdMX01BWF9URVNTX1BBVENIX0NPTVBPTkVOVFMgICAgICAweDhFODQKKyNkZWZpbmUgR0xfTUFYX1RFU1NfQ09OVFJPTF9UT1RBTF9PVVRQVVRfQ09NUE9ORU5UUyAweDhFODUKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9PVVRQVVRfQ09NUE9ORU5UUyAweDhFODYKKyNkZWZpbmUgR0xfTUFYX1RFU1NfQ09OVFJPTF9VTklGT1JNX0JMT0NLUyAweDhFODkKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9VTklGT1JNX0JMT0NLUyAweDhFOEEKKyNkZWZpbmUgR0xfTUFYX1RFU1NfQ09OVFJPTF9JTlBVVF9DT01QT05FTlRTIDB4ODg2QworI2RlZmluZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX0lOUFVUX0NPTVBPTkVOVFMgMHg4ODZECisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9URVNTX0NPTlRST0xfVU5JRk9STV9DT01QT05FTlRTIDB4OEUxRQorI2RlZmluZSBHTF9NQVhfQ09NQklORURfVEVTU19FVkFMVUFUSU9OX1VOSUZPUk1fQ09NUE9ORU5UUyAweDhFMUYKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX1RFU1NfQ09OVFJPTF9TSEFERVIgMHg4NEYwCisjZGVmaW5lIEdMX1VOSUZPUk1fQkxPQ0tfUkVGRVJFTkNFRF9CWV9URVNTX0VWQUxVQVRJT05fU0hBREVSIDB4ODRGMQorI2RlZmluZSBHTF9URVNTX0VWQUxVQVRJT05fU0hBREVSICAgICAgICAgMHg4RTg3CisjZGVmaW5lIEdMX1RFU1NfQ09OVFJPTF9TSEFERVIgICAgICAgICAgICAweDhFODgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2J1ZmZlcl9vYmplY3RfcmdiMzIKKy8qIHJldXNlIEdMX1JHQjMyRiAqLworLyogcmV1c2UgR0xfUkdCMzJVSSAqLworLyogcmV1c2UgR0xfUkdCMzJJICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdHJhbnNmb3JtX2ZlZWRiYWNrMgorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0sgICAgICAgICAgICAgMHg4RTIyCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfUEFVU0VEIDB4OEUyMworI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX0FDVElWRSAweDhFMjQKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JJTkRJTkcgICAgIDB4OEUyNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RyYW5zZm9ybV9mZWVkYmFjazMKKyNkZWZpbmUgR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJTIDB4OEU3MAorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1NUUkVBTVMgICAgICAgICAgICAgMHg4RTcxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfRVMyX2NvbXBhdGliaWxpdHkKKyNkZWZpbmUgR0xfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwQworI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUgMHg4QjlBCisjZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUIDB4OEI5QgorI2RlZmluZSBHTF9MT1dfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgMHg4REYwCisjZGVmaW5lIEdMX01FRElVTV9GTE9BVCAgICAgICAgICAgICAgICAgICAweDhERjEKKyNkZWZpbmUgR0xfSElHSF9GTE9BVCAgICAgICAgICAgICAgICAgICAgIDB4OERGMgorI2RlZmluZSBHTF9MT1dfSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHg4REYzCisjZGVmaW5lIEdMX01FRElVTV9JTlQgICAgICAgICAgICAgICAgICAgICAweDhERjQKKyNkZWZpbmUgR0xfSElHSF9JTlQgICAgICAgICAgICAgICAgICAgICAgIDB4OERGNQorI2RlZmluZSBHTF9TSEFERVJfQ09NUElMRVIgICAgICAgICAgICAgICAgMHg4REZBCisjZGVmaW5lIEdMX05VTV9TSEFERVJfQklOQVJZX0ZPUk1BVFMgICAgICAweDhERjkKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMgICAgIDB4OERGQgorI2RlZmluZSBHTF9NQVhfVkFSWUlOR19WRUNUT1JTICAgICAgICAgICAgMHg4REZDCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgICAweDhERkQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9nZXRfcHJvZ3JhbV9iaW5hcnkKKyNkZWZpbmUgR0xfUFJPR1JBTV9CSU5BUllfUkVUUklFVkFCTEVfSElOVCAweDgyNTcKKyNkZWZpbmUgR0xfUFJPR1JBTV9CSU5BUllfTEVOR1RIICAgICAgICAgIDB4ODc0MQorI2RlZmluZSBHTF9OVU1fUFJPR1JBTV9CSU5BUllfRk9STUFUUyAgICAgMHg4N0ZFCisjZGVmaW5lIEdMX1BST0dSQU1fQklOQVJZX0ZPUk1BVFMgICAgICAgICAweDg3RkYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cworI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX0JJVCAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfQklUICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF9HRU9NRVRSWV9TSEFERVJfQklUICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF9URVNTX0NPTlRST0xfU0hBREVSX0JJVCAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBHTF9URVNTX0VWQUxVQVRJT05fU0hBREVSX0JJVCAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBHTF9BTExfU0hBREVSX0JJVFMgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBHTF9QUk9HUkFNX1NFUEFSQUJMRSAgICAgICAgICAgICAgMHg4MjU4CisjZGVmaW5lIEdMX0FDVElWRV9QUk9HUkFNICAgICAgICAgICAgICAgICAweDgyNTkKKyNkZWZpbmUgR0xfUFJPR1JBTV9QSVBFTElORV9CSU5ESU5HICAgICAgIDB4ODI1QQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRlcl9wcmVjaXNpb24KKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfYXR0cmliXzY0Yml0CisvKiByZXVzZSBHTF9SR0IzMkkgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9WRUMyICovCisvKiByZXVzZSBHTF9ET1VCTEVfVkVDMyAqLworLyogcmV1c2UgR0xfRE9VQkxFX1ZFQzQgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQyICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUMyAqLworLyogcmV1c2UgR0xfRE9VQkxFX01BVDQgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQyeDMgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQyeDQgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQzeDIgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQzeDQgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQ0eDIgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQ0eDMgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92aWV3cG9ydF9hcnJheQorLyogcmV1c2UgR0xfU0NJU1NPUl9CT1ggKi8KKy8qIHJldXNlIEdMX1ZJRVdQT1JUICovCisvKiByZXVzZSBHTF9ERVBUSF9SQU5HRSAqLworLyogcmV1c2UgR0xfU0NJU1NPUl9URVNUICovCisjZGVmaW5lIEdMX01BWF9WSUVXUE9SVFMgICAgICAgICAgICAgICAgICAweDgyNUIKKyNkZWZpbmUgR0xfVklFV1BPUlRfU1VCUElYRUxfQklUUyAgICAgICAgIDB4ODI1QworI2RlZmluZSBHTF9WSUVXUE9SVF9CT1VORFNfUkFOR0UgICAgICAgICAgMHg4MjVECisjZGVmaW5lIEdMX0xBWUVSX1BST1ZPS0lOR19WRVJURVggICAgICAgICAweDgyNUUKKyNkZWZpbmUgR0xfVklFV1BPUlRfSU5ERVhfUFJPVk9LSU5HX1ZFUlRFWCAweDgyNUYKKyNkZWZpbmUgR0xfVU5ERUZJTkVEX1ZFUlRFWCAgICAgICAgICAgICAgIDB4ODI2MAorLyogcmV1c2UgR0xfRklSU1RfVkVSVEVYX0NPTlZFTlRJT04gKi8KKy8qIHJldXNlIEdMX0xBU1RfVkVSVEVYX0NPTlZFTlRJT04gKi8KKy8qIHJldXNlIEdMX1BST1ZPS0lOR19WRVJURVggKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9jbF9ldmVudAorI2RlZmluZSBHTF9TWU5DX0NMX0VWRU5UX0FSQiAgICAgICAgICAgICAgMHg4MjQwCisjZGVmaW5lIEdMX1NZTkNfQ0xfRVZFTlRfQ09NUExFVEVfQVJCICAgICAweDgyNDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9kZWJ1Z19vdXRwdXQKKyNkZWZpbmUgR0xfREVCVUdfT1VUUFVUX1NZTkNIUk9OT1VTX0FSQiAgIDB4ODI0MgorI2RlZmluZSBHTF9ERUJVR19ORVhUX0xPR0dFRF9NRVNTQUdFX0xFTkdUSF9BUkIgMHg4MjQzCisjZGVmaW5lIEdMX0RFQlVHX0NBTExCQUNLX0ZVTkNUSU9OX0FSQiAgICAweDgyNDQKKyNkZWZpbmUgR0xfREVCVUdfQ0FMTEJBQ0tfVVNFUl9QQVJBTV9BUkIgIDB4ODI0NQorI2RlZmluZSBHTF9ERUJVR19TT1VSQ0VfQVBJX0FSQiAgICAgICAgICAgMHg4MjQ2CisjZGVmaW5lIEdMX0RFQlVHX1NPVVJDRV9XSU5ET1dfU1lTVEVNX0FSQiAweDgyNDcKKyNkZWZpbmUgR0xfREVCVUdfU09VUkNFX1NIQURFUl9DT01QSUxFUl9BUkIgMHg4MjQ4CisjZGVmaW5lIEdMX0RFQlVHX1NPVVJDRV9USElSRF9QQVJUWV9BUkIgICAweDgyNDkKKyNkZWZpbmUgR0xfREVCVUdfU09VUkNFX0FQUExJQ0FUSU9OX0FSQiAgIDB4ODI0QQorI2RlZmluZSBHTF9ERUJVR19TT1VSQ0VfT1RIRVJfQVJCICAgICAgICAgMHg4MjRCCisjZGVmaW5lIEdMX0RFQlVHX1RZUEVfRVJST1JfQVJCICAgICAgICAgICAweDgyNEMKKyNkZWZpbmUgR0xfREVCVUdfVFlQRV9ERVBSRUNBVEVEX0JFSEFWSU9SX0FSQiAweDgyNEQKKyNkZWZpbmUgR0xfREVCVUdfVFlQRV9VTkRFRklORURfQkVIQVZJT1JfQVJCIDB4ODI0RQorI2RlZmluZSBHTF9ERUJVR19UWVBFX1BPUlRBQklMSVRZX0FSQiAgICAgMHg4MjRGCisjZGVmaW5lIEdMX0RFQlVHX1RZUEVfUEVSRk9STUFOQ0VfQVJCICAgICAweDgyNTAKKyNkZWZpbmUgR0xfREVCVUdfVFlQRV9PVEhFUl9BUkIgICAgICAgICAgIDB4ODI1MQorI2RlZmluZSBHTF9NQVhfREVCVUdfTUVTU0FHRV9MRU5HVEhfQVJCICAgMHg5MTQzCisjZGVmaW5lIEdMX01BWF9ERUJVR19MT0dHRURfTUVTU0FHRVNfQVJCICAweDkxNDQKKyNkZWZpbmUgR0xfREVCVUdfTE9HR0VEX01FU1NBR0VTX0FSQiAgICAgIDB4OTE0NQorI2RlZmluZSBHTF9ERUJVR19TRVZFUklUWV9ISUdIX0FSQiAgICAgICAgMHg5MTQ2CisjZGVmaW5lIEdMX0RFQlVHX1NFVkVSSVRZX01FRElVTV9BUkIgICAgICAweDkxNDcKKyNkZWZpbmUgR0xfREVCVUdfU0VWRVJJVFlfTE9XX0FSQiAgICAgICAgIDB4OTE0OAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3JvYnVzdG5lc3MKKy8qIHJldXNlIEdMX05PX0VSUk9SICovCisjZGVmaW5lIEdMX0NPTlRFWFRfRkxBR19ST0JVU1RfQUNDRVNTX0JJVF9BUkIgMHgwMDAwMDAwNAorI2RlZmluZSBHTF9MT1NFX0NPTlRFWFRfT05fUkVTRVRfQVJCICAgICAgMHg4MjUyCisjZGVmaW5lIEdMX0dVSUxUWV9DT05URVhUX1JFU0VUX0FSQiAgICAgICAweDgyNTMKKyNkZWZpbmUgR0xfSU5OT0NFTlRfQ09OVEVYVF9SRVNFVF9BUkIgICAgIDB4ODI1NAorI2RlZmluZSBHTF9VTktOT1dOX0NPTlRFWFRfUkVTRVRfQVJCICAgICAgMHg4MjU1CisjZGVmaW5lIEdMX1JFU0VUX05PVElGSUNBVElPTl9TVFJBVEVHWV9BUkIgMHg4MjU2CisjZGVmaW5lIEdMX05PX1JFU0VUX05PVElGSUNBVElPTl9BUkIgICAgICAweDgyNjEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkZXJfc3RlbmNpbF9leHBvcnQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9iYXNlX2luc3RhbmNlCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdHJhbnNmb3JtX2ZlZWRiYWNrX2luc3RhbmNlZAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2NvbXByZXNzZWRfdGV4dHVyZV9waXhlbF9zdG9yYWdlCisjZGVmaW5lIEdMX1VOUEFDS19DT01QUkVTU0VEX0JMT0NLX1dJRFRIICAweDkxMjcKKyNkZWZpbmUgR0xfVU5QQUNLX0NPTVBSRVNTRURfQkxPQ0tfSEVJR0hUIDB4OTEyOAorI2RlZmluZSBHTF9VTlBBQ0tfQ09NUFJFU1NFRF9CTE9DS19ERVBUSCAgMHg5MTI5CisjZGVmaW5lIEdMX1VOUEFDS19DT01QUkVTU0VEX0JMT0NLX1NJWkUgICAweDkxMkEKKyNkZWZpbmUgR0xfUEFDS19DT01QUkVTU0VEX0JMT0NLX1dJRFRIICAgIDB4OTEyQgorI2RlZmluZSBHTF9QQUNLX0NPTVBSRVNTRURfQkxPQ0tfSEVJR0hUICAgMHg5MTJDCisjZGVmaW5lIEdMX1BBQ0tfQ09NUFJFU1NFRF9CTE9DS19ERVBUSCAgICAweDkxMkQKKyNkZWZpbmUgR0xfUEFDS19DT01QUkVTU0VEX0JMT0NLX1NJWkUgICAgIDB4OTEyRQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2NvbnNlcnZhdGl2ZV9kZXB0aAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ludGVybmFsZm9ybWF0X3F1ZXJ5CisjZGVmaW5lIEdMX05VTV9TQU1QTEVfQ09VTlRTICAgICAgICAgICAgICAweDkzODAKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9tYXBfYnVmZmVyX2FsaWdubWVudAorI2RlZmluZSBHTF9NSU5fTUFQX0JVRkZFUl9BTElHTk1FTlQgICAgICAgMHg5MEJDCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGVyX2F0b21pY19jb3VudGVycworI2RlZmluZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVIgICAgICAgICAgMHg5MkMwCisjZGVmaW5lIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9CSU5ESU5HICAweDkyQzEKKyNkZWZpbmUgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1NUQVJUICAgIDB4OTJDMgorI2RlZmluZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfU0laRSAgICAgMHg5MkMzCisjZGVmaW5lIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9EQVRBX1NJWkUgMHg5MkM0CisjZGVmaW5lIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9BQ1RJVkVfQVRPTUlDX0NPVU5URVJTIDB4OTJDNQorI2RlZmluZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfQUNUSVZFX0FUT01JQ19DT1VOVEVSX0lORElDRVMgMHg5MkM2CisjZGVmaW5lIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9SRUZFUkVOQ0VEX0JZX1ZFUlRFWF9TSEFERVIgMHg5MkM3CisjZGVmaW5lIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9SRUZFUkVOQ0VEX0JZX1RFU1NfQ09OVFJPTF9TSEFERVIgMHg5MkM4CisjZGVmaW5lIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9SRUZFUkVOQ0VEX0JZX1RFU1NfRVZBTFVBVElPTl9TSEFERVIgMHg5MkM5CisjZGVmaW5lIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9SRUZFUkVOQ0VEX0JZX0dFT01FVFJZX1NIQURFUiAweDkyQ0EKKyNkZWZpbmUgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSIDB4OTJDQgorI2RlZmluZSBHTF9NQVhfVkVSVEVYX0FUT01JQ19DT1VOVEVSX0JVRkZFUlMgMHg5MkNDCisjZGVmaW5lIEdMX01BWF9URVNTX0NPTlRST0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSUyAweDkyQ0QKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTIDB4OTJDRQorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfQVRPTUlDX0NPVU5URVJfQlVGRkVSUyAweDkyQ0YKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX0FUT01JQ19DT1VOVEVSX0JVRkZFUlMgMHg5MkQwCisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTIDB4OTJEMQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX0FUT01JQ19DT1VOVEVSUyAgICAgMHg5MkQyCisjZGVmaW5lIEdMX01BWF9URVNTX0NPTlRST0xfQVRPTUlDX0NPVU5URVJTIDB4OTJEMworI2RlZmluZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX0FUT01JQ19DT1VOVEVSUyAweDkyRDQKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX0FUT01JQ19DT1VOVEVSUyAgIDB4OTJENQorI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfQVRPTUlDX0NPVU5URVJTICAgMHg5MkQ2CisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9BVE9NSUNfQ09VTlRFUlMgICAweDkyRDcKKyNkZWZpbmUgR0xfTUFYX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9TSVpFIDB4OTJEOAorI2RlZmluZSBHTF9NQVhfQVRPTUlDX0NPVU5URVJfQlVGRkVSX0JJTkRJTkdTIDB4OTJEQworI2RlZmluZSBHTF9BQ1RJVkVfQVRPTUlDX0NPVU5URVJfQlVGRkVSUyAgMHg5MkQ5CisjZGVmaW5lIEdMX1VOSUZPUk1fQVRPTUlDX0NPVU5URVJfQlVGRkVSX0lOREVYIDB4OTJEQQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfQVRPTUlDX0NPVU5URVIgICAgMHg5MkRCCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmUKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CQVJSSUVSX0JJVCAweDAwMDAwMDAxCisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQkFSUklFUl9CSVQgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdMX1VOSUZPUk1fQkFSUklFUl9CSVQgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEdMX1RFWFRVUkVfRkVUQ0hfQkFSUklFUl9CSVQgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEdMX1NIQURFUl9JTUFHRV9BQ0NFU1NfQkFSUklFUl9CSVQgMHgwMDAwMDAyMAorI2RlZmluZSBHTF9DT01NQU5EX0JBUlJJRVJfQklUICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBHTF9QSVhFTF9CVUZGRVJfQkFSUklFUl9CSVQgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBHTF9URVhUVVJFX1VQREFURV9CQVJSSUVSX0JJVCAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBHTF9CVUZGRVJfVVBEQVRFX0JBUlJJRVJfQklUICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9CQVJSSUVSX0JJVCAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQkFSUklFUl9CSVQgMHgwMDAwMDgwMAorI2RlZmluZSBHTF9BVE9NSUNfQ09VTlRFUl9CQVJSSUVSX0JJVCAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBHTF9BTExfQkFSUklFUl9CSVRTICAgICAgICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBHTF9NQVhfSU1BR0VfVU5JVFMgICAgICAgICAgICAgICAgMHg4RjM4CisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9JTUFHRV9VTklUU19BTkRfRlJBR01FTlRfT1VUUFVUUyAweDhGMzkKKyNkZWZpbmUgR0xfSU1BR0VfQklORElOR19OQU1FICAgICAgICAgICAgIDB4OEYzQQorI2RlZmluZSBHTF9JTUFHRV9CSU5ESU5HX0xFVkVMICAgICAgICAgICAgMHg4RjNCCisjZGVmaW5lIEdMX0lNQUdFX0JJTkRJTkdfTEFZRVJFRCAgICAgICAgICAweDhGM0MKKyNkZWZpbmUgR0xfSU1BR0VfQklORElOR19MQVlFUiAgICAgICAgICAgIDB4OEYzRAorI2RlZmluZSBHTF9JTUFHRV9CSU5ESU5HX0FDQ0VTUyAgICAgICAgICAgMHg4RjNFCisjZGVmaW5lIEdMX0lNQUdFXzFEICAgICAgICAgICAgICAgICAgICAgICAweDkwNEMKKyNkZWZpbmUgR0xfSU1BR0VfMkQgICAgICAgICAgICAgICAgICAgICAgIDB4OTA0RAorI2RlZmluZSBHTF9JTUFHRV8zRCAgICAgICAgICAgICAgICAgICAgICAgMHg5MDRFCisjZGVmaW5lIEdMX0lNQUdFXzJEX1JFQ1QgICAgICAgICAgICAgICAgICAweDkwNEYKKyNkZWZpbmUgR0xfSU1BR0VfQ1VCRSAgICAgICAgICAgICAgICAgICAgIDB4OTA1MAorI2RlZmluZSBHTF9JTUFHRV9CVUZGRVIgICAgICAgICAgICAgICAgICAgMHg5MDUxCisjZGVmaW5lIEdMX0lNQUdFXzFEX0FSUkFZICAgICAgICAgICAgICAgICAweDkwNTIKKyNkZWZpbmUgR0xfSU1BR0VfMkRfQVJSQVkgICAgICAgICAgICAgICAgIDB4OTA1MworI2RlZmluZSBHTF9JTUFHRV9DVUJFX01BUF9BUlJBWSAgICAgICAgICAgMHg5MDU0CisjZGVmaW5lIEdMX0lNQUdFXzJEX01VTFRJU0FNUExFICAgICAgICAgICAweDkwNTUKKyNkZWZpbmUgR0xfSU1BR0VfMkRfTVVMVElTQU1QTEVfQVJSQVkgICAgIDB4OTA1NgorI2RlZmluZSBHTF9JTlRfSU1BR0VfMUQgICAgICAgICAgICAgICAgICAgMHg5MDU3CisjZGVmaW5lIEdMX0lOVF9JTUFHRV8yRCAgICAgICAgICAgICAgICAgICAweDkwNTgKKyNkZWZpbmUgR0xfSU5UX0lNQUdFXzNEICAgICAgICAgICAgICAgICAgIDB4OTA1OQorI2RlZmluZSBHTF9JTlRfSU1BR0VfMkRfUkVDVCAgICAgICAgICAgICAgMHg5MDVBCisjZGVmaW5lIEdMX0lOVF9JTUFHRV9DVUJFICAgICAgICAgICAgICAgICAweDkwNUIKKyNkZWZpbmUgR0xfSU5UX0lNQUdFX0JVRkZFUiAgICAgICAgICAgICAgIDB4OTA1QworI2RlZmluZSBHTF9JTlRfSU1BR0VfMURfQVJSQVkgICAgICAgICAgICAgMHg5MDVECisjZGVmaW5lIEdMX0lOVF9JTUFHRV8yRF9BUlJBWSAgICAgICAgICAgICAweDkwNUUKKyNkZWZpbmUgR0xfSU5UX0lNQUdFX0NVQkVfTUFQX0FSUkFZICAgICAgIDB4OTA1RgorI2RlZmluZSBHTF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEUgICAgICAgMHg5MDYwCisjZGVmaW5lIEdMX0lOVF9JTUFHRV8yRF9NVUxUSVNBTVBMRV9BUlJBWSAweDkwNjEKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzFEICAgICAgICAgIDB4OTA2MgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkQgICAgICAgICAgMHg5MDYzCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8zRCAgICAgICAgICAweDkwNjQKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX1JFQ1QgICAgIDB4OTA2NQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfQ1VCRSAgICAgICAgMHg5MDY2CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV9CVUZGRVIgICAgICAweDkwNjcKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzFEX0FSUkFZICAgIDB4OTA2OAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfQVJSQVkgICAgMHg5MDY5CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV9DVUJFX01BUF9BUlJBWSAweDkwNkEKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFIDB4OTA2QgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEVfQVJSQVkgMHg5MDZDCisjZGVmaW5lIEdMX01BWF9JTUFHRV9TQU1QTEVTICAgICAgICAgICAgICAweDkwNkQKKyNkZWZpbmUgR0xfSU1BR0VfQklORElOR19GT1JNQVQgICAgICAgICAgIDB4OTA2RQorI2RlZmluZSBHTF9JTUFHRV9GT1JNQVRfQ09NUEFUSUJJTElUWV9UWVBFIDB4OTBDNworI2RlZmluZSBHTF9JTUFHRV9GT1JNQVRfQ09NUEFUSUJJTElUWV9CWV9TSVpFIDB4OTBDOAorI2RlZmluZSBHTF9JTUFHRV9GT1JNQVRfQ09NUEFUSUJJTElUWV9CWV9DTEFTUyAweDkwQzkKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9JTUFHRV9VTklGT1JNUyAgICAgIDB4OTBDQQorI2RlZmluZSBHTF9NQVhfVEVTU19DT05UUk9MX0lNQUdFX1VOSUZPUk1TIDB4OTBDQgorI2RlZmluZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX0lNQUdFX1VOSUZPUk1TIDB4OTBDQworI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfSU1BR0VfVU5JRk9STVMgICAgMHg5MENECisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9JTUFHRV9VTklGT1JNUyAgICAweDkwQ0UKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX0lNQUdFX1VOSUZPUk1TICAgIDB4OTBDRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfcGFja2luZworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfc3RvcmFnZQorI2RlZmluZSBHTF9URVhUVVJFX0lNTVVUQUJMRV9GT1JNQVQgICAgICAgMHg5MTJGCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYWJncgorI2RlZmluZSBHTF9BQkdSX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfY29sb3IKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQ09MT1JfRVhUICAgICAgICAgICAgIDB4ODAwMQorI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1JfRVhUICAgMHg4MDAyCisjZGVmaW5lIEdMX0NPTlNUQU5UX0FMUEhBX0VYVCAgICAgICAgICAgICAweDgwMDMKKyNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBX0VYVCAgIDB4ODAwNAorI2RlZmluZSBHTF9CTEVORF9DT0xPUl9FWFQgICAgICAgICAgICAgICAgMHg4MDA1CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcG9seWdvbl9vZmZzZXQKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRVhUICAgICAgICAgICAgIDB4ODAzNworI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1JfRVhUICAgICAgMHg4MDM4CisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0JJQVNfRVhUICAgICAgICAweDgwMzkKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlCisjZGVmaW5lIEdMX0FMUEhBNF9FWFQgICAgICAgICAgICAgICAgICAgICAweDgwM0IKKyNkZWZpbmUgR0xfQUxQSEE4X0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODAzQworI2RlZmluZSBHTF9BTFBIQTEyX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MDNECisjZGVmaW5lIEdMX0FMUEhBMTZfRVhUICAgICAgICAgICAgICAgICAgICAweDgwM0UKKyNkZWZpbmUgR0xfTFVNSU5BTkNFNF9FWFQgICAgICAgICAgICAgICAgIDB4ODAzRgorI2RlZmluZSBHTF9MVU1JTkFOQ0U4X0VYVCAgICAgICAgICAgICAgICAgMHg4MDQwCisjZGVmaW5lIEdMX0xVTUlOQU5DRTEyX0VYVCAgICAgICAgICAgICAgICAweDgwNDEKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTZfRVhUICAgICAgICAgICAgICAgIDB4ODA0MgorI2RlZmluZSBHTF9MVU1JTkFOQ0U0X0FMUEhBNF9FWFQgICAgICAgICAgMHg4MDQzCisjZGVmaW5lIEdMX0xVTUlOQU5DRTZfQUxQSEEyX0VYVCAgICAgICAgICAweDgwNDQKKyNkZWZpbmUgR0xfTFVNSU5BTkNFOF9BTFBIQThfRVhUICAgICAgICAgIDB4ODA0NQorI2RlZmluZSBHTF9MVU1JTkFOQ0UxMl9BTFBIQTRfRVhUICAgICAgICAgMHg4MDQ2CisjZGVmaW5lIEdMX0xVTUlOQU5DRTEyX0FMUEhBMTJfRVhUICAgICAgICAweDgwNDcKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTZfQUxQSEExNl9FWFQgICAgICAgIDB4ODA0OAorI2RlZmluZSBHTF9JTlRFTlNJVFlfRVhUICAgICAgICAgICAgICAgICAgMHg4MDQ5CisjZGVmaW5lIEdMX0lOVEVOU0lUWTRfRVhUICAgICAgICAgICAgICAgICAweDgwNEEKKyNkZWZpbmUgR0xfSU5URU5TSVRZOF9FWFQgICAgICAgICAgICAgICAgIDB4ODA0QgorI2RlZmluZSBHTF9JTlRFTlNJVFkxMl9FWFQgICAgICAgICAgICAgICAgMHg4MDRDCisjZGVmaW5lIEdMX0lOVEVOU0lUWTE2X0VYVCAgICAgICAgICAgICAgICAweDgwNEQKKyNkZWZpbmUgR0xfUkdCMl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODA0RQorI2RlZmluZSBHTF9SR0I0X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDRGCisjZGVmaW5lIEdMX1JHQjVfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwNTAKKyNkZWZpbmUgR0xfUkdCOF9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1MQorI2RlZmluZSBHTF9SR0IxMF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDUyCisjZGVmaW5lIEdMX1JHQjEyX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgwNTMKKyNkZWZpbmUgR0xfUkdCMTZfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NAorI2RlZmluZSBHTF9SR0JBMl9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDU1CisjZGVmaW5lIEdMX1JHQkE0X0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgwNTYKKyNkZWZpbmUgR0xfUkdCNV9BMV9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODA1NworI2RlZmluZSBHTF9SR0JBOF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDU4CisjZGVmaW5lIEdMX1JHQjEwX0EyX0VYVCAgICAgICAgICAgICAgICAgICAweDgwNTkKKyNkZWZpbmUgR0xfUkdCQTEyX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODA1QQorI2RlZmluZSBHTF9SR0JBMTZfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4MDVCCisjZGVmaW5lIEdMX1RFWFRVUkVfUkVEX1NJWkVfRVhUICAgICAgICAgICAweDgwNUMKKyNkZWZpbmUgR0xfVEVYVFVSRV9HUkVFTl9TSVpFX0VYVCAgICAgICAgIDB4ODA1RAorI2RlZmluZSBHTF9URVhUVVJFX0JMVUVfU0laRV9FWFQgICAgICAgICAgMHg4MDVFCisjZGVmaW5lIEdMX1RFWFRVUkVfQUxQSEFfU0laRV9FWFQgICAgICAgICAweDgwNUYKKyNkZWZpbmUgR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRV9FWFQgICAgIDB4ODA2MAorI2RlZmluZSBHTF9URVhUVVJFX0lOVEVOU0lUWV9TSVpFX0VYVCAgICAgMHg4MDYxCisjZGVmaW5lIEdMX1JFUExBQ0VfRVhUICAgICAgICAgICAgICAgICAgICAweDgwNjIKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8xRF9FWFQgICAgICAgICAgIDB4ODA2MworI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzJEX0VYVCAgICAgICAgICAgMHg4MDY0CisjZGVmaW5lIEdMX1RFWFRVUkVfVE9PX0xBUkdFX0VYVCAgICAgICAgICAweDgwNjUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlM0QKKyNkZWZpbmUgR0xfUEFDS19TS0lQX0lNQUdFU19FWFQgICAgICAgICAgIDB4ODA2QgorI2RlZmluZSBHTF9QQUNLX0lNQUdFX0hFSUdIVF9FWFQgICAgICAgICAgMHg4MDZDCisjZGVmaW5lIEdMX1VOUEFDS19TS0lQX0lNQUdFU19FWFQgICAgICAgICAweDgwNkQKKyNkZWZpbmUgR0xfVU5QQUNLX0lNQUdFX0hFSUdIVF9FWFQgICAgICAgIDB4ODA2RQorI2RlZmluZSBHTF9URVhUVVJFXzNEX0VYVCAgICAgICAgICAgICAgICAgMHg4MDZGCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfM0RfRVhUICAgICAgICAgICAweDgwNzAKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSF9FWFQgICAgICAgICAgICAgIDB4ODA3MQorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUl9FWFQgICAgICAgICAgICAgMHg4MDcyCisjZGVmaW5lIEdMX01BWF8zRF9URVhUVVJFX1NJWkVfRVhUICAgICAgICAweDgwNzMKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9maWx0ZXI0CisjZGVmaW5lIEdMX0ZJTFRFUjRfU0dJUyAgICAgICAgICAgICAgICAgICAweDgxNDYKKyNkZWZpbmUgR0xfVEVYVFVSRV9GSUxURVI0X1NJWkVfU0dJUyAgICAgIDB4ODE0NworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3N1YnRleHR1cmUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jb3B5X3RleHR1cmUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9oaXN0b2dyYW0KKyNkZWZpbmUgR0xfSElTVE9HUkFNX0VYVCAgICAgICAgICAgICAgICAgIDB4ODAyNAorI2RlZmluZSBHTF9QUk9YWV9ISVNUT0dSQU1fRVhUICAgICAgICAgICAgMHg4MDI1CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9XSURUSF9FWFQgICAgICAgICAgICAweDgwMjYKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0ZPUk1BVF9FWFQgICAgICAgICAgIDB4ODAyNworI2RlZmluZSBHTF9ISVNUT0dSQU1fUkVEX1NJWkVfRVhUICAgICAgICAgMHg4MDI4CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9HUkVFTl9TSVpFX0VYVCAgICAgICAweDgwMjkKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0JMVUVfU0laRV9FWFQgICAgICAgIDB4ODAyQQorI2RlZmluZSBHTF9ISVNUT0dSQU1fQUxQSEFfU0laRV9FWFQgICAgICAgMHg4MDJCCisjZGVmaW5lIEdMX0hJU1RPR1JBTV9MVU1JTkFOQ0VfU0laRV9FWFQgICAweDgwMkMKKyNkZWZpbmUgR0xfSElTVE9HUkFNX1NJTktfRVhUICAgICAgICAgICAgIDB4ODAyRAorI2RlZmluZSBHTF9NSU5NQVhfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4MDJFCisjZGVmaW5lIEdMX01JTk1BWF9GT1JNQVRfRVhUICAgICAgICAgICAgICAweDgwMkYKKyNkZWZpbmUgR0xfTUlOTUFYX1NJTktfRVhUICAgICAgICAgICAgICAgIDB4ODAzMAorI2RlZmluZSBHTF9UQUJMRV9UT09fTEFSR0VfRVhUICAgICAgICAgICAgMHg4MDMxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY29udm9sdXRpb24KKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fMURfRVhUICAgICAgICAgICAgIDB4ODAxMAorI2RlZmluZSBHTF9DT05WT0xVVElPTl8yRF9FWFQgICAgICAgICAgICAgMHg4MDExCisjZGVmaW5lIEdMX1NFUEFSQUJMRV8yRF9FWFQgICAgICAgICAgICAgICAweDgwMTIKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fQk9SREVSX01PREVfRVhUICAgIDB4ODAxMworI2RlZmluZSBHTF9DT05WT0xVVElPTl9GSUxURVJfU0NBTEVfRVhUICAgMHg4MDE0CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0ZJTFRFUl9CSUFTX0VYVCAgICAweDgwMTUKKyNkZWZpbmUgR0xfUkVEVUNFX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODAxNgorI2RlZmluZSBHTF9DT05WT0xVVElPTl9GT1JNQVRfRVhUICAgICAgICAgMHg4MDE3CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX1dJRFRIX0VYVCAgICAgICAgICAweDgwMTgKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fSEVJR0hUX0VYVCAgICAgICAgIDB4ODAxOQorI2RlZmluZSBHTF9NQVhfQ09OVk9MVVRJT05fV0lEVEhfRVhUICAgICAgMHg4MDFBCisjZGVmaW5lIEdMX01BWF9DT05WT0xVVElPTl9IRUlHSFRfRVhUICAgICAweDgwMUIKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9SRURfU0NBTEVfRVhUIDB4ODAxQworI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX1NDQUxFX0VYVCAweDgwMUQKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX1NDQUxFX0VYVCAweDgwMUUKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9TQ0FMRV9FWFQgMHg4MDFGCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX0JJQVNfRVhUICAweDgwMjAKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9CSUFTX0VYVCAweDgwMjEKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX0JJQVNfRVhUIDB4ODAyMgorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0FMUEhBX0JJQVNfRVhUIDB4ODAyMworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJX2NvbG9yX21hdHJpeAorI2RlZmluZSBHTF9DT0xPUl9NQVRSSVhfU0dJICAgICAgICAgICAgICAgMHg4MEIxCisjZGVmaW5lIEdMX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSF9TR0kgICAweDgwQjIKKyNkZWZpbmUgR0xfTUFYX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSF9TR0kgMHg4MEIzCisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX1JFRF9TQ0FMRV9TR0kgMHg4MEI0CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0dSRUVOX1NDQUxFX1NHSSAweDgwQjUKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9TQ0FMRV9TR0kgMHg4MEI2CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0FMUEhBX1NDQUxFX1NHSSAweDgwQjcKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfUkVEX0JJQVNfU0dJIDB4ODBCOAorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9CSUFTX1NHSSAweDgwQjkKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9CSUFTX1NHSSAweDgwQkEKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfQklBU19TR0kgMHg4MEJCCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lfY29sb3JfdGFibGUKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfU0dJICAgICAgICAgICAgICAgIDB4ODBEMAorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFX1NHSSAweDgwRDEKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEVfU0dJIDB4ODBEMgorI2RlZmluZSBHTF9QUk9YWV9DT0xPUl9UQUJMRV9TR0kgICAgICAgICAgMHg4MEQzCisjZGVmaW5lIEdMX1BST1hZX1BPU1RfQ09OVk9MVVRJT05fQ09MT1JfVEFCTEVfU0dJIDB4ODBENAorI2RlZmluZSBHTF9QUk9YWV9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRV9TR0kgMHg4MEQ1CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1NDQUxFX1NHSSAgICAgICAgICAweDgwRDYKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQklBU19TR0kgICAgICAgICAgIDB4ODBENworI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9GT1JNQVRfU0dJICAgICAgICAgMHg4MEQ4CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1dJRFRIX1NHSSAgICAgICAgICAweDgwRDkKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkVfU0dJICAgICAgIDB4ODBEQQorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9HUkVFTl9TSVpFX1NHSSAgICAgMHg4MERCCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRV9TR0kgICAgICAweDgwREMKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRV9TR0kgICAgIDB4ODBERAorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9MVU1JTkFOQ0VfU0laRV9TR0kgMHg4MERFCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFX1NHSSAweDgwREYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfcGl4ZWxfdGV4dHVyZQorI2RlZmluZSBHTF9QSVhFTF9URVhUVVJFX1NHSVMgICAgICAgICAgICAgMHg4MzUzCisjZGVmaW5lIEdMX1BJWEVMX0ZSQUdNRU5UX1JHQl9TT1VSQ0VfU0dJUyAweDgzNTQKKyNkZWZpbmUgR0xfUElYRUxfRlJBR01FTlRfQUxQSEFfU09VUkNFX1NHSVMgMHg4MzU1CisjZGVmaW5lIEdMX1BJWEVMX0dST1VQX0NPTE9SX1NHSVMgICAgICAgICAweDgzNTYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcGl4ZWxfdGV4dHVyZQorI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX1NHSVggICAgICAgICAgICAgMHg4MTM5CisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fTU9ERV9TR0lYICAgICAgICAweDgzMkIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZTRECisjZGVmaW5lIEdMX1BBQ0tfU0tJUF9WT0xVTUVTX1NHSVMgICAgICAgICAweDgxMzAKKyNkZWZpbmUgR0xfUEFDS19JTUFHRV9ERVBUSF9TR0lTICAgICAgICAgIDB4ODEzMQorI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9WT0xVTUVTX1NHSVMgICAgICAgMHg4MTMyCisjZGVmaW5lIEdMX1VOUEFDS19JTUFHRV9ERVBUSF9TR0lTICAgICAgICAweDgxMzMKKyNkZWZpbmUgR0xfVEVYVFVSRV80RF9TR0lTICAgICAgICAgICAgICAgIDB4ODEzNAorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzREX1NHSVMgICAgICAgICAgMHg4MTM1CisjZGVmaW5lIEdMX1RFWFRVUkVfNERTSVpFX1NHSVMgICAgICAgICAgICAweDgxMzYKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1FfU0dJUyAgICAgICAgICAgIDB4ODEzNworI2RlZmluZSBHTF9NQVhfNERfVEVYVFVSRV9TSVpFX1NHSVMgICAgICAgMHg4MTM4CisjZGVmaW5lIEdMX1RFWFRVUkVfNERfQklORElOR19TR0lTICAgICAgICAweDgxNEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSV90ZXh0dXJlX2NvbG9yX3RhYmxlCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09MT1JfVEFCTEVfU0dJICAgICAgICAweDgwQkMKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV9DT0xPUl9UQUJMRV9TR0kgIDB4ODBCRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NteWthCisjZGVmaW5lIEdMX0NNWUtfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwMEMKKyNkZWZpbmUgR0xfQ01ZS0FfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODAwRAorI2RlZmluZSBHTF9QQUNLX0NNWUtfSElOVF9FWFQgICAgICAgICAgICAgMHg4MDBFCisjZGVmaW5lIEdMX1VOUEFDS19DTVlLX0hJTlRfRVhUICAgICAgICAgICAweDgwMEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX29iamVjdAorI2RlZmluZSBHTF9URVhUVVJFX1BSSU9SSVRZX0VYVCAgICAgICAgICAgMHg4MDY2CisjZGVmaW5lIEdMX1RFWFRVUkVfUkVTSURFTlRfRVhUICAgICAgICAgICAweDgwNjcKKyNkZWZpbmUgR0xfVEVYVFVSRV8xRF9CSU5ESU5HX0VYVCAgICAgICAgIDB4ODA2OAorI2RlZmluZSBHTF9URVhUVVJFXzJEX0JJTkRJTkdfRVhUICAgICAgICAgMHg4MDY5CisjZGVmaW5lIEdMX1RFWFRVUkVfM0RfQklORElOR19FWFQgICAgICAgICAweDgwNkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfZGV0YWlsX3RleHR1cmUKKyNkZWZpbmUgR0xfREVUQUlMX1RFWFRVUkVfMkRfU0dJUyAgICAgICAgIDB4ODA5NQorI2RlZmluZSBHTF9ERVRBSUxfVEVYVFVSRV8yRF9CSU5ESU5HX1NHSVMgMHg4MDk2CisjZGVmaW5lIEdMX0xJTkVBUl9ERVRBSUxfU0dJUyAgICAgICAgICAgICAweDgwOTcKKyNkZWZpbmUgR0xfTElORUFSX0RFVEFJTF9BTFBIQV9TR0lTICAgICAgIDB4ODA5OAorI2RlZmluZSBHTF9MSU5FQVJfREVUQUlMX0NPTE9SX1NHSVMgICAgICAgMHg4MDk5CisjZGVmaW5lIEdMX0RFVEFJTF9URVhUVVJFX0xFVkVMX1NHSVMgICAgICAweDgwOUEKKyNkZWZpbmUgR0xfREVUQUlMX1RFWFRVUkVfTU9ERV9TR0lTICAgICAgIDB4ODA5QgorI2RlZmluZSBHTF9ERVRBSUxfVEVYVFVSRV9GVU5DX1BPSU5UU19TR0lTIDB4ODA5QworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19zaGFycGVuX3RleHR1cmUKKyNkZWZpbmUgR0xfTElORUFSX1NIQVJQRU5fU0dJUyAgICAgICAgICAgIDB4ODBBRAorI2RlZmluZSBHTF9MSU5FQVJfU0hBUlBFTl9BTFBIQV9TR0lTICAgICAgMHg4MEFFCisjZGVmaW5lIEdMX0xJTkVBUl9TSEFSUEVOX0NPTE9SX1NHSVMgICAgICAweDgwQUYKKyNkZWZpbmUgR0xfU0hBUlBFTl9URVhUVVJFX0ZVTkNfUE9JTlRTX1NHSVMgMHg4MEIwCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFja2VkX3BpeGVscworI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFXzNfM18yX0VYVCAgICAgICAgMHg4MDMyCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfRVhUICAgICAweDgwMzMKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMV9FWFQgICAgIDB4ODAzNAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9FWFQgICAgICAgMHg4MDM1CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8xMF8xMF8xMF8yX0VYVCAgICAweDgwMzYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9sb2QKKyNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fTE9EX1NHSVMgICAgICAgICAgIDB4ODEzQQorI2RlZmluZSBHTF9URVhUVVJFX01BWF9MT0RfU0dJUyAgICAgICAgICAgMHg4MTNCCisjZGVmaW5lIEdMX1RFWFRVUkVfQkFTRV9MRVZFTF9TR0lTICAgICAgICAweDgxM0MKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfTEVWRUxfU0dJUyAgICAgICAgIDB4ODEzRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9TR0lTICAgICAgICAgICAgICAgMHg4MDlECisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19NQVNLX1NHSVMgICAgICAweDgwOUUKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORV9TR0lTICAgICAgIDB4ODA5RgorI2RlZmluZSBHTF9TQU1QTEVfTUFTS19TR0lTICAgICAgICAgICAgICAgMHg4MEEwCisjZGVmaW5lIEdMXzFQQVNTX1NHSVMgICAgICAgICAgICAgICAgICAgICAweDgwQTEKKyNkZWZpbmUgR0xfMlBBU1NfMF9TR0lTICAgICAgICAgICAgICAgICAgIDB4ODBBMgorI2RlZmluZSBHTF8yUEFTU18xX1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MEEzCisjZGVmaW5lIEdMXzRQQVNTXzBfU0dJUyAgICAgICAgICAgICAgICAgICAweDgwQTQKKyNkZWZpbmUgR0xfNFBBU1NfMV9TR0lTICAgICAgICAgICAgICAgICAgIDB4ODBBNQorI2RlZmluZSBHTF80UEFTU18yX1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MEE2CisjZGVmaW5lIEdMXzRQQVNTXzNfU0dJUyAgICAgICAgICAgICAgICAgICAweDgwQTcKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlNfU0dJUyAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTX1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9NQVNLX1ZBTFVFX1NHSVMgICAgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX01BU0tfSU5WRVJUX1NHSVMgICAgICAgIDB4ODBBQgorI2RlZmluZSBHTF9TQU1QTEVfUEFUVEVSTl9TR0lTICAgICAgICAgICAgMHg4MEFDCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcmVzY2FsZV9ub3JtYWwKKyNkZWZpbmUgR0xfUkVTQ0FMRV9OT1JNQUxfRVhUICAgICAgICAgICAgIDB4ODAzQQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF9hcnJheQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfRVhUICAgICAgICAgICAgICAgMHg4MDc0CisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9FWFQgICAgICAgICAgICAgICAweDgwNzUKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfRVhUICAgICAgICAgICAgICAgIDB4ODA3NgorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9FWFQgICAgICAgICAgICAgICAgMHg4MDc3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfRVhUICAgICAgICAweDgwNzgKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX0VYVCAgICAgICAgICAgIDB4ODA3OQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfU0laRV9FWFQgICAgICAgICAgMHg4MDdBCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9UWVBFX0VYVCAgICAgICAgICAweDgwN0IKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1NUUklERV9FWFQgICAgICAgIDB4ODA3QworI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfQ09VTlRfRVhUICAgICAgICAgMHg4MDdECisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9UWVBFX0VYVCAgICAgICAgICAweDgwN0UKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1NUUklERV9FWFQgICAgICAgIDB4ODA3RgorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfQ09VTlRfRVhUICAgICAgICAgMHg4MDgwCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1NJWkVfRVhUICAgICAgICAgICAweDgwODEKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfVFlQRV9FWFQgICAgICAgICAgIDB4ODA4MgorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9TVFJJREVfRVhUICAgICAgICAgMHg4MDgzCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0NPVU5UX0VYVCAgICAgICAgICAweDgwODQKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfVFlQRV9FWFQgICAgICAgICAgIDB4ODA4NQorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9TVFJJREVfRVhUICAgICAgICAgMHg4MDg2CisjZGVmaW5lIEdMX0lOREVYX0FSUkFZX0NPVU5UX0VYVCAgICAgICAgICAweDgwODcKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFX0VYVCAgIDB4ODA4OAorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEVfRVhUICAgMHg4MDg5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFX0VYVCAweDgwOEEKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9DT1VOVF9FWFQgIDB4ODA4QgorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFX0VYVCAgICAgMHg4MDhDCisjZGVmaW5lIEdMX0VER0VfRkxBR19BUlJBWV9DT1VOVF9FWFQgICAgICAweDgwOEQKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVJfRVhUICAgICAgIDB4ODA4RQorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUl9FWFQgICAgICAgMHg4MDhGCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1BPSU5URVJfRVhUICAgICAgICAweDgwOTAKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfUE9JTlRFUl9FWFQgICAgICAgIDB4ODA5MQorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVJfRVhUIDB4ODA5MgorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfUE9JTlRFUl9FWFQgICAgMHg4MDkzCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfbWlzY19hdHRyaWJ1dGUKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwCisjZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUF9TR0lTICAgICAgICAgICAweDgxOTEKKyNkZWZpbmUgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlRfU0dJUyAgICAgIDB4ODE5MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9jbGlwbWFwCisjZGVmaW5lIEdMX0xJTkVBUl9DTElQTUFQX0xJTkVBUl9TR0lYICAgICAweDgxNzAKKyNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX0NFTlRFUl9TR0lYICAgIDB4ODE3MQorI2RlZmluZSBHTF9URVhUVVJFX0NMSVBNQVBfRlJBTUVfU0dJWCAgICAgMHg4MTcyCisjZGVmaW5lIEdMX1RFWFRVUkVfQ0xJUE1BUF9PRkZTRVRfU0dJWCAgICAweDgxNzMKKyNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWCAweDgxNzQKKyNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX0xPRF9PRkZTRVRfU0dJWCAweDgxNzUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX0RFUFRIX1NHSVggICAgIDB4ODE3NgorI2RlZmluZSBHTF9NQVhfQ0xJUE1BUF9ERVBUSF9TR0lYICAgICAgICAgMHg4MTc3CisjZGVmaW5lIEdMX01BWF9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWCAweDgxNzgKKyNkZWZpbmUgR0xfTkVBUkVTVF9DTElQTUFQX05FQVJFU1RfU0dJWCAgIDB4ODQ0RAorI2RlZmluZSBHTF9ORUFSRVNUX0NMSVBNQVBfTElORUFSX1NHSVggICAgMHg4NDRFCisjZGVmaW5lIEdMX0xJTkVBUl9DTElQTUFQX05FQVJFU1RfU0dJWCAgICAweDg0NEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfc2hhZG93CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9TR0lYICAgICAgICAgICAweDgxOUEKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX09QRVJBVE9SX1NHSVggIDB4ODE5QgorI2RlZmluZSBHTF9URVhUVVJFX0xFUVVBTF9SX1NHSVggICAgICAgICAgMHg4MTlDCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VRVUFMX1JfU0dJWCAgICAgICAgICAweDgxOUQKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9lZGdlX2NsYW1wCisjZGVmaW5lIEdMX0NMQU1QX1RPX0VER0VfU0dJUyAgICAgICAgICAgICAweDgxMkYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9ib3JkZXJfY2xhbXAKKyNkZWZpbmUgR0xfQ0xBTVBfVE9fQk9SREVSX1NHSVMgICAgICAgICAgIDB4ODEyRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX21pbm1heAorI2RlZmluZSBHTF9GVU5DX0FERF9FWFQgICAgICAgICAgICAgICAgICAgMHg4MDA2CisjZGVmaW5lIEdMX01JTl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDcKKyNkZWZpbmUgR0xfTUFYX0VYVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwOAorI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9FWFQgICAgICAgICAgICAgMHg4MDA5CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfc3VidHJhY3QKKyNkZWZpbmUgR0xfRlVOQ19TVUJUUkFDVF9FWFQgICAgICAgICAgICAgIDB4ODAwQQorI2RlZmluZSBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1RfRVhUICAgICAgMHg4MDBCCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfbG9naWNfb3AKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaW50ZXJsYWNlCisjZGVmaW5lIEdMX0lOVEVSTEFDRV9TR0lYICAgICAgICAgICAgICAgICAweDgwOTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcGl4ZWxfdGlsZXMKKyNkZWZpbmUgR0xfUElYRUxfVElMRV9CRVNUX0FMSUdOTUVOVF9TR0lYIDB4ODEzRQorI2RlZmluZSBHTF9QSVhFTF9USUxFX0NBQ0hFX0lOQ1JFTUVOVF9TR0lYIDB4ODEzRgorI2RlZmluZSBHTF9QSVhFTF9USUxFX1dJRFRIX1NHSVggICAgICAgICAgMHg4MTQwCisjZGVmaW5lIEdMX1BJWEVMX1RJTEVfSEVJR0hUX1NHSVggICAgICAgICAweDgxNDEKKyNkZWZpbmUgR0xfUElYRUxfVElMRV9HUklEX1dJRFRIX1NHSVggICAgIDB4ODE0MgorI2RlZmluZSBHTF9QSVhFTF9USUxFX0dSSURfSEVJR0hUX1NHSVggICAgMHg4MTQzCisjZGVmaW5lIEdMX1BJWEVMX1RJTEVfR1JJRF9ERVBUSF9TR0lYICAgICAweDgxNDQKKyNkZWZpbmUgR0xfUElYRUxfVElMRV9DQUNIRV9TSVpFX1NHSVggICAgIDB4ODE0NQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU190ZXh0dXJlX3NlbGVjdAorI2RlZmluZSBHTF9EVUFMX0FMUEhBNF9TR0lTICAgICAgICAgICAgICAgMHg4MTEwCisjZGVmaW5lIEdMX0RVQUxfQUxQSEE4X1NHSVMgICAgICAgICAgICAgICAweDgxMTEKKyNkZWZpbmUgR0xfRFVBTF9BTFBIQTEyX1NHSVMgICAgICAgICAgICAgIDB4ODExMgorI2RlZmluZSBHTF9EVUFMX0FMUEhBMTZfU0dJUyAgICAgICAgICAgICAgMHg4MTEzCisjZGVmaW5lIEdMX0RVQUxfTFVNSU5BTkNFNF9TR0lTICAgICAgICAgICAweDgxMTQKKyNkZWZpbmUgR0xfRFVBTF9MVU1JTkFOQ0U4X1NHSVMgICAgICAgICAgIDB4ODExNQorI2RlZmluZSBHTF9EVUFMX0xVTUlOQU5DRTEyX1NHSVMgICAgICAgICAgMHg4MTE2CisjZGVmaW5lIEdMX0RVQUxfTFVNSU5BTkNFMTZfU0dJUyAgICAgICAgICAweDgxMTcKKyNkZWZpbmUgR0xfRFVBTF9JTlRFTlNJVFk0X1NHSVMgICAgICAgICAgIDB4ODExOAorI2RlZmluZSBHTF9EVUFMX0lOVEVOU0lUWThfU0dJUyAgICAgICAgICAgMHg4MTE5CisjZGVmaW5lIEdMX0RVQUxfSU5URU5TSVRZMTJfU0dJUyAgICAgICAgICAweDgxMUEKKyNkZWZpbmUgR0xfRFVBTF9JTlRFTlNJVFkxNl9TR0lTICAgICAgICAgIDB4ODExQgorI2RlZmluZSBHTF9EVUFMX0xVTUlOQU5DRV9BTFBIQTRfU0dJUyAgICAgMHg4MTFDCisjZGVmaW5lIEdMX0RVQUxfTFVNSU5BTkNFX0FMUEhBOF9TR0lTICAgICAweDgxMUQKKyNkZWZpbmUgR0xfUVVBRF9BTFBIQTRfU0dJUyAgICAgICAgICAgICAgIDB4ODExRQorI2RlZmluZSBHTF9RVUFEX0FMUEhBOF9TR0lTICAgICAgICAgICAgICAgMHg4MTFGCisjZGVmaW5lIEdMX1FVQURfTFVNSU5BTkNFNF9TR0lTICAgICAgICAgICAweDgxMjAKKyNkZWZpbmUgR0xfUVVBRF9MVU1JTkFOQ0U4X1NHSVMgICAgICAgICAgIDB4ODEyMQorI2RlZmluZSBHTF9RVUFEX0lOVEVOU0lUWTRfU0dJUyAgICAgICAgICAgMHg4MTIyCisjZGVmaW5lIEdMX1FVQURfSU5URU5TSVRZOF9TR0lTICAgICAgICAgICAweDgxMjMKKyNkZWZpbmUgR0xfRFVBTF9URVhUVVJFX1NFTEVDVF9TR0lTICAgICAgIDB4ODEyNAorI2RlZmluZSBHTF9RVUFEX1RFWFRVUkVfU0VMRUNUX1NHSVMgICAgICAgMHg4MTI1CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3Nwcml0ZQorI2RlZmluZSBHTF9TUFJJVEVfU0dJWCAgICAgICAgICAgICAgICAgICAgMHg4MTQ4CisjZGVmaW5lIEdMX1NQUklURV9NT0RFX1NHSVggICAgICAgICAgICAgICAweDgxNDkKKyNkZWZpbmUgR0xfU1BSSVRFX0FYSVNfU0dJWCAgICAgICAgICAgICAgIDB4ODE0QQorI2RlZmluZSBHTF9TUFJJVEVfVFJBTlNMQVRJT05fU0dJWCAgICAgICAgMHg4MTRCCisjZGVmaW5lIEdMX1NQUklURV9BWElBTF9TR0lYICAgICAgICAgICAgICAweDgxNEMKKyNkZWZpbmUgR0xfU1BSSVRFX09CSkVDVF9BTElHTkVEX1NHSVggICAgIDB4ODE0RAorI2RlZmluZSBHTF9TUFJJVEVfRVlFX0FMSUdORURfU0dJWCAgICAgICAgMHg4MTRFCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfbXVsdGlfYnVmZmVyCisjZGVmaW5lIEdMX1RFWFRVUkVfTVVMVElfQlVGRkVSX0hJTlRfU0dJWCAweDgxMkUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9wb2ludF9wYXJhbWV0ZXJzCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUlOX0VYVCAgICAgICAgICAgICAweDgxMjYKKyNkZWZpbmUgR0xfUE9JTlRfU0laRV9NQVhfRVhUICAgICAgICAgICAgIDB4ODEyNworI2RlZmluZSBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFX0VYVCAgMHg4MTI4CisjZGVmaW5lIEdMX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0VYVCAgICAgICAweDgxMjkKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfcG9pbnRfcGFyYW1ldGVycworI2RlZmluZSBHTF9QT0lOVF9TSVpFX01JTl9TR0lTICAgICAgICAgICAgMHg4MTI2CisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUFYX1NHSVMgICAgICAgICAgICAweDgxMjcKKyNkZWZpbmUgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRV9TR0lTIDB4ODEyOAorI2RlZmluZSBHTF9ESVNUQU5DRV9BVFRFTlVBVElPTl9TR0lTICAgICAgMHg4MTI5CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2luc3RydW1lbnRzCisjZGVmaW5lIEdMX0lOU1RSVU1FTlRfQlVGRkVSX1BPSU5URVJfU0dJWCAweDgxODAKKyNkZWZpbmUgR0xfSU5TVFJVTUVOVF9NRUFTVVJFTUVOVFNfU0dJWCAgIDB4ODE4MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX3NjYWxlX2JpYXMKKyNkZWZpbmUgR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9CSUFTX1NHSVggIDB4ODE3OQorI2RlZmluZSBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX1NDQUxFX1NHSVggMHg4MTdBCisjZGVmaW5lIEdMX1BPU1RfVEVYVFVSRV9GSUxURVJfQklBU19SQU5HRV9TR0lYIDB4ODE3QgorI2RlZmluZSBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX1NDQUxFX1JBTkdFX1NHSVggMHg4MTdDCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZyYW1lem9vbQorI2RlZmluZSBHTF9GUkFNRVpPT01fU0dJWCAgICAgICAgICAgICAgICAgMHg4MThCCisjZGVmaW5lIEdMX0ZSQU1FWk9PTV9GQUNUT1JfU0dJWCAgICAgICAgICAweDgxOEMKKyNkZWZpbmUgR0xfTUFYX0ZSQU1FWk9PTV9GQUNUT1JfU0dJWCAgICAgIDB4ODE4RAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90YWdfc2FtcGxlX2J1ZmZlcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRmZkTWFza1NHSVgKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERUZPUk1BVElPTl9CSVRfU0dJWCAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xfR0VPTUVUUllfREVGT1JNQVRJT05fQklUX1NHSVggIDB4MDAwMDAwMDIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcG9seW5vbWlhbF9mZmQKKyNkZWZpbmUgR0xfR0VPTUVUUllfREVGT1JNQVRJT05fU0dJWCAgICAgIDB4ODE5NAorI2RlZmluZSBHTF9URVhUVVJFX0RFRk9STUFUSU9OX1NHSVggICAgICAgMHg4MTk1CisjZGVmaW5lIEdMX0RFRk9STUFUSU9OU19NQVNLX1NHSVggICAgICAgICAweDgxOTYKKyNkZWZpbmUgR0xfTUFYX0RFRk9STUFUSU9OX09SREVSX1NHSVggICAgIDB4ODE5NworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9yZWZlcmVuY2VfcGxhbmUKKyNkZWZpbmUgR0xfUkVGRVJFTkNFX1BMQU5FX1NHSVggICAgICAgICAgIDB4ODE3RAorI2RlZmluZSBHTF9SRUZFUkVOQ0VfUExBTkVfRVFVQVRJT05fU0dJWCAgMHg4MTdFCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZsdXNoX3Jhc3RlcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9kZXB0aF90ZXh0dXJlCisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDE2X1NHSVggICAgICAgICAweDgxQTUKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMjRfU0dJWCAgICAgICAgIDB4ODFBNgorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQzMl9TR0lYICAgICAgICAgMHg4MUE3CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX2ZvZ19mdW5jdGlvbgorI2RlZmluZSBHTF9GT0dfRlVOQ19TR0lTICAgICAgICAgICAgICAgICAgMHg4MTJBCisjZGVmaW5lIEdMX0ZPR19GVU5DX1BPSU5UU19TR0lTICAgICAgICAgICAweDgxMkIKKyNkZWZpbmUgR0xfTUFYX0ZPR19GVU5DX1BPSU5UU19TR0lTICAgICAgIDB4ODEyQworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9mb2dfb2Zmc2V0CisjZGVmaW5lIEdMX0ZPR19PRkZTRVRfU0dJWCAgICAgICAgICAgICAgICAweDgxOTgKKyNkZWZpbmUgR0xfRk9HX09GRlNFVF9WQUxVRV9TR0lYICAgICAgICAgIDB4ODE5OQorI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfaW1hZ2VfdHJhbnNmb3JtCisjZGVmaW5lIEdMX0lNQUdFX1NDQUxFX1hfSFAgICAgICAgICAgICAgICAweDgxNTUKKyNkZWZpbmUgR0xfSU1BR0VfU0NBTEVfWV9IUCAgICAgICAgICAgICAgIDB4ODE1NgorI2RlZmluZSBHTF9JTUFHRV9UUkFOU0xBVEVfWF9IUCAgICAgICAgICAgMHg4MTU3CisjZGVmaW5lIEdMX0lNQUdFX1RSQU5TTEFURV9ZX0hQICAgICAgICAgICAweDgxNTgKKyNkZWZpbmUgR0xfSU1BR0VfUk9UQVRFX0FOR0xFX0hQICAgICAgICAgIDB4ODE1OQorI2RlZmluZSBHTF9JTUFHRV9ST1RBVEVfT1JJR0lOX1hfSFAgICAgICAgMHg4MTVBCisjZGVmaW5lIEdMX0lNQUdFX1JPVEFURV9PUklHSU5fWV9IUCAgICAgICAweDgxNUIKKyNkZWZpbmUgR0xfSU1BR0VfTUFHX0ZJTFRFUl9IUCAgICAgICAgICAgIDB4ODE1QworI2RlZmluZSBHTF9JTUFHRV9NSU5fRklMVEVSX0hQICAgICAgICAgICAgMHg4MTVECisjZGVmaW5lIEdMX0lNQUdFX0NVQklDX1dFSUdIVF9IUCAgICAgICAgICAweDgxNUUKKyNkZWZpbmUgR0xfQ1VCSUNfSFAgICAgICAgICAgICAgICAgICAgICAgIDB4ODE1RgorI2RlZmluZSBHTF9BVkVSQUdFX0hQICAgICAgICAgICAgICAgICAgICAgMHg4MTYwCisjZGVmaW5lIEdMX0lNQUdFX1RSQU5TRk9STV8yRF9IUCAgICAgICAgICAweDgxNjEKKyNkZWZpbmUgR0xfUE9TVF9JTUFHRV9UUkFOU0ZPUk1fQ09MT1JfVEFCTEVfSFAgMHg4MTYyCisjZGVmaW5lIEdMX1BST1hZX1BPU1RfSU1BR0VfVFJBTlNGT1JNX0NPTE9SX1RBQkxFX0hQIDB4ODE2MworI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfY29udm9sdXRpb25fYm9yZGVyX21vZGVzCisjZGVmaW5lIEdMX0lHTk9SRV9CT1JERVJfSFAgICAgICAgICAgICAgICAweDgxNTAKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQk9SREVSX0hQICAgICAgICAgICAgIDB4ODE1MQorI2RlZmluZSBHTF9SRVBMSUNBVEVfQk9SREVSX0hQICAgICAgICAgICAgMHg4MTUzCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9DT0xPUl9IUCAgICAweDgxNTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lOR1JfcGFsZXR0ZV9idWZmZXIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9hZGRfZW52CisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WX0JJQVNfU0dJWCAgICAgICAgICAweDgwQkUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jb2xvcl9zdWJ0YWJsZQorI2VuZGlmCisKKyNpZm5kZWYgR0xfUEdJX3ZlcnRleF9oaW50cworI2RlZmluZSBHTF9WRVJURVhfREFUQV9ISU5UX1BHSSAgICAgICAgICAgMHgxQTIyQQorI2RlZmluZSBHTF9WRVJURVhfQ09OU0lTVEVOVF9ISU5UX1BHSSAgICAgMHgxQTIyQgorI2RlZmluZSBHTF9NQVRFUklBTF9TSURFX0hJTlRfUEdJICAgICAgICAgMHgxQTIyQworI2RlZmluZSBHTF9NQVhfVkVSVEVYX0hJTlRfUEdJICAgICAgICAgICAgMHgxQTIyRAorI2RlZmluZSBHTF9DT0xPUjNfQklUX1BHSSAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBHTF9DT0xPUjRfQklUX1BHSSAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBHTF9FREdFRkxBR19CSVRfUEdJICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBHTF9JTkRFWF9CSVRfUEdJICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBHTF9NQVRfQU1CSUVOVF9CSVRfUEdJICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBHTF9NQVRfQU1CSUVOVF9BTkRfRElGRlVTRV9CSVRfUEdJIDB4MDAyMDAwMDAKKyNkZWZpbmUgR0xfTUFUX0RJRkZVU0VfQklUX1BHSSAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgR0xfTUFUX0VNSVNTSU9OX0JJVF9QR0kgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgR0xfTUFUX0NPTE9SX0lOREVYRVNfQklUX1BHSSAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgR0xfTUFUX1NISU5JTkVTU19CSVRfUEdJICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgR0xfTUFUX1NQRUNVTEFSX0JJVF9QR0kgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgR0xfTk9STUFMX0JJVF9QR0kgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgR0xfVEVYQ09PUkQxX0JJVF9QR0kgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgR0xfVEVYQ09PUkQyX0JJVF9QR0kgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgR0xfVEVYQ09PUkQzX0JJVF9QR0kgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgR0xfVEVYQ09PUkQ0X0JJVF9QR0kgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgR0xfVkVSVEVYMjNfQklUX1BHSSAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xfVkVSVEVYNF9CSVRfUEdJICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNlbmRpZgorCisjaWZuZGVmIEdMX1BHSV9taXNjX2hpbnRzCisjZGVmaW5lIEdMX1BSRUZFUl9ET1VCTEVCVUZGRVJfSElOVF9QR0kgICAweDFBMUY4CisjZGVmaW5lIEdMX0NPTlNFUlZFX01FTU9SWV9ISU5UX1BHSSAgICAgICAweDFBMUZECisjZGVmaW5lIEdMX1JFQ0xBSU1fTUVNT1JZX0hJTlRfUEdJICAgICAgICAweDFBMUZFCisjZGVmaW5lIEdMX05BVElWRV9HUkFQSElDU19IQU5ETEVfUEdJICAgICAweDFBMjAyCisjZGVmaW5lIEdMX05BVElWRV9HUkFQSElDU19CRUdJTl9ISU5UX1BHSSAweDFBMjAzCisjZGVmaW5lIEdMX05BVElWRV9HUkFQSElDU19FTkRfSElOVF9QR0kgICAweDFBMjA0CisjZGVmaW5lIEdMX0FMV0FZU19GQVNUX0hJTlRfUEdJICAgICAgICAgICAweDFBMjBDCisjZGVmaW5lIEdMX0FMV0FZU19TT0ZUX0hJTlRfUEdJICAgICAgICAgICAweDFBMjBECisjZGVmaW5lIEdMX0FMTE9XX0RSQVdfT0JKX0hJTlRfUEdJICAgICAgICAweDFBMjBFCisjZGVmaW5lIEdMX0FMTE9XX0RSQVdfV0lOX0hJTlRfUEdJICAgICAgICAweDFBMjBGCisjZGVmaW5lIEdMX0FMTE9XX0RSQVdfRlJHX0hJTlRfUEdJICAgICAgICAweDFBMjEwCisjZGVmaW5lIEdMX0FMTE9XX0RSQVdfTUVNX0hJTlRfUEdJICAgICAgICAweDFBMjExCisjZGVmaW5lIEdMX1NUUklDVF9ERVBUSEZVTkNfSElOVF9QR0kgICAgICAweDFBMjE2CisjZGVmaW5lIEdMX1NUUklDVF9MSUdIVElOR19ISU5UX1BHSSAgICAgICAweDFBMjE3CisjZGVmaW5lIEdMX1NUUklDVF9TQ0lTU09SX0hJTlRfUEdJICAgICAgICAweDFBMjE4CisjZGVmaW5lIEdMX0ZVTExfU1RJUFBMRV9ISU5UX1BHSSAgICAgICAgICAweDFBMjE5CisjZGVmaW5lIEdMX0NMSVBfTkVBUl9ISU5UX1BHSSAgICAgICAgICAgICAweDFBMjIwCisjZGVmaW5lIEdMX0NMSVBfRkFSX0hJTlRfUEdJICAgICAgICAgICAgICAweDFBMjIxCisjZGVmaW5lIEdMX1dJREVfTElORV9ISU5UX1BHSSAgICAgICAgICAgICAweDFBMjIyCisjZGVmaW5lIEdMX0JBQ0tfTk9STUFMU19ISU5UX1BHSSAgICAgICAgICAweDFBMjIzCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZQorI2RlZmluZSBHTF9DT0xPUl9JTkRFWDFfRVhUICAgICAgICAgICAgICAgMHg4MEUyCisjZGVmaW5lIEdMX0NPTE9SX0lOREVYMl9FWFQgICAgICAgICAgICAgICAweDgwRTMKKyNkZWZpbmUgR0xfQ09MT1JfSU5ERVg0X0VYVCAgICAgICAgICAgICAgIDB4ODBFNAorI2RlZmluZSBHTF9DT0xPUl9JTkRFWDhfRVhUICAgICAgICAgICAgICAgMHg4MEU1CisjZGVmaW5lIEdMX0NPTE9SX0lOREVYMTJfRVhUICAgICAgICAgICAgICAweDgwRTYKKyNkZWZpbmUgR0xfQ09MT1JfSU5ERVgxNl9FWFQgICAgICAgICAgICAgIDB4ODBFNworI2RlZmluZSBHTF9URVhUVVJFX0lOREVYX1NJWkVfRVhUICAgICAgICAgMHg4MEVECisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY2xpcF92b2x1bWVfaGludAorI2RlZmluZSBHTF9DTElQX1ZPTFVNRV9DTElQUElOR19ISU5UX0VYVCAgMHg4MEYwCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2xpc3RfcHJpb3JpdHkKKyNkZWZpbmUgR0xfTElTVF9QUklPUklUWV9TR0lYICAgICAgICAgICAgIDB4ODE4MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9pcl9pbnN0cnVtZW50MQorI2RlZmluZSBHTF9JUl9JTlNUUlVNRU5UMV9TR0lYICAgICAgICAgICAgMHg4MTdGCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2NhbGxpZ3JhcGhpY19mcmFnbWVudAorI2RlZmluZSBHTF9DQUxMSUdSQVBISUNfRlJBR01FTlRfU0dJWCAgICAgMHg4MTgzCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfbG9kX2JpYXMKKyNkZWZpbmUgR0xfVEVYVFVSRV9MT0RfQklBU19TX1NHSVggICAgICAgIDB4ODE4RQorI2RlZmluZSBHTF9URVhUVVJFX0xPRF9CSUFTX1RfU0dJWCAgICAgICAgMHg4MThGCisjZGVmaW5lIEdMX1RFWFRVUkVfTE9EX0JJQVNfUl9TR0lYICAgICAgICAweDgxOTAKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfc2hhZG93X2FtYmllbnQKKyNkZWZpbmUgR0xfU0hBRE9XX0FNQklFTlRfU0dJWCAgICAgICAgICAgIDB4ODBCRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2luZGV4X3RleHR1cmUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9pbmRleF9tYXRlcmlhbAorI2RlZmluZSBHTF9JTkRFWF9NQVRFUklBTF9FWFQgICAgICAgICAgICAgMHg4MUI4CisjZGVmaW5lIEdMX0lOREVYX01BVEVSSUFMX1BBUkFNRVRFUl9FWFQgICAweDgxQjkKKyNkZWZpbmUgR0xfSU5ERVhfTUFURVJJQUxfRkFDRV9FWFQgICAgICAgIDB4ODFCQQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2luZGV4X2Z1bmMKKyNkZWZpbmUgR0xfSU5ERVhfVEVTVF9FWFQgICAgICAgICAgICAgICAgIDB4ODFCNQorI2RlZmluZSBHTF9JTkRFWF9URVNUX0ZVTkNfRVhUICAgICAgICAgICAgMHg4MUI2CisjZGVmaW5lIEdMX0lOREVYX1RFU1RfUkVGX0VYVCAgICAgICAgICAgICAweDgxQjcKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9pbmRleF9hcnJheV9mb3JtYXRzCisjZGVmaW5lIEdMX0lVSV9WMkZfRVhUICAgICAgICAgICAgICAgICAgICAweDgxQUQKKyNkZWZpbmUgR0xfSVVJX1YzRl9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODFBRQorI2RlZmluZSBHTF9JVUlfTjNGX1YyRl9FWFQgICAgICAgICAgICAgICAgMHg4MUFGCisjZGVmaW5lIEdMX0lVSV9OM0ZfVjNGX0VYVCAgICAgICAgICAgICAgICAweDgxQjAKKyNkZWZpbmUgR0xfVDJGX0lVSV9WMkZfRVhUICAgICAgICAgICAgICAgIDB4ODFCMQorI2RlZmluZSBHTF9UMkZfSVVJX1YzRl9FWFQgICAgICAgICAgICAgICAgMHg4MUIyCisjZGVmaW5lIEdMX1QyRl9JVUlfTjNGX1YyRl9FWFQgICAgICAgICAgICAweDgxQjMKKyNkZWZpbmUgR0xfVDJGX0lVSV9OM0ZfVjNGX0VYVCAgICAgICAgICAgIDB4ODFCNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NvbXBpbGVkX3ZlcnRleF9hcnJheQorI2RlZmluZSBHTF9BUlJBWV9FTEVNRU5UX0xPQ0tfRklSU1RfRVhUICAgMHg4MUE4CisjZGVmaW5lIEdMX0FSUkFZX0VMRU1FTlRfTE9DS19DT1VOVF9FWFQgICAweDgxQTkKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jdWxsX3ZlcnRleAorI2RlZmluZSBHTF9DVUxMX1ZFUlRFWF9FWFQgICAgICAgICAgICAgICAgMHg4MUFBCisjZGVmaW5lIEdMX0NVTExfVkVSVEVYX0VZRV9QT1NJVElPTl9FWFQgICAweDgxQUIKKyNkZWZpbmUgR0xfQ1VMTF9WRVJURVhfT0JKRUNUX1BPU0lUSU9OX0VYVCAweDgxQUMKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfeWNyY2IKKyNkZWZpbmUgR0xfWUNSQ0JfNDIyX1NHSVggICAgICAgICAgICAgICAgIDB4ODFCQgorI2RlZmluZSBHTF9ZQ1JDQl80NDRfU0dJWCAgICAgICAgICAgICAgICAgMHg4MUJDCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZyYWdtZW50X2xpZ2h0aW5nCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUSU5HX1NHSVggICAgICAgICAweDg0MDAKKyNkZWZpbmUgR0xfRlJBR01FTlRfQ09MT1JfTUFURVJJQUxfU0dJWCAgIDB4ODQwMQorI2RlZmluZSBHTF9GUkFHTUVOVF9DT0xPUl9NQVRFUklBTF9GQUNFX1NHSVggMHg4NDAyCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0NPTE9SX01BVEVSSUFMX1BBUkFNRVRFUl9TR0lYIDB4ODQwMworI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfTElHSFRTX1NHSVggICAgICAgMHg4NDA0CisjZGVmaW5lIEdMX01BWF9BQ1RJVkVfTElHSFRTX1NHSVggICAgICAgICAweDg0MDUKKyNkZWZpbmUgR0xfQ1VSUkVOVF9SQVNURVJfTk9STUFMX1NHSVggICAgIDB4ODQwNgorI2RlZmluZSBHTF9MSUdIVF9FTlZfTU9ERV9TR0lYICAgICAgICAgICAgMHg4NDA3CisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUX01PREVMX0xPQ0FMX1ZJRVdFUl9TR0lYIDB4ODQwOAorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVF9NT0RFTF9UV09fU0lERV9TR0lYIDB4ODQwOQorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVF9NT0RFTF9BTUJJRU5UX1NHSVggMHg4NDBBCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUX01PREVMX05PUk1BTF9JTlRFUlBPTEFUSU9OX1NHSVggMHg4NDBCCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUMF9TR0lYICAgICAgICAgICAweDg0MEMKKyNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFQxX1NHSVggICAgICAgICAgIDB4ODQwRAorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVDJfU0dJWCAgICAgICAgICAgMHg4NDBFCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUM19TR0lYICAgICAgICAgICAweDg0MEYKKyNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFQ0X1NHSVggICAgICAgICAgIDB4ODQxMAorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVDVfU0dJWCAgICAgICAgICAgMHg4NDExCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUNl9TR0lYICAgICAgICAgICAweDg0MTIKKyNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFQ3X1NHSVggICAgICAgICAgIDB4ODQxMworI2VuZGlmCisKKyNpZm5kZWYgR0xfSUJNX3Jhc3RlcnBvc19jbGlwCisjZGVmaW5lIEdMX1JBU1RFUl9QT1NJVElPTl9VTkNMSVBQRURfSUJNICAweDE5MjYyCisjZW5kaWYKKworI2lmbmRlZiBHTF9IUF90ZXh0dXJlX2xpZ2h0aW5nCisjZGVmaW5lIEdMX1RFWFRVUkVfTElHSFRJTkdfTU9ERV9IUCAgICAgICAweDgxNjcKKyNkZWZpbmUgR0xfVEVYVFVSRV9QT1NUX1NQRUNVTEFSX0hQICAgICAgIDB4ODE2OAorI2RlZmluZSBHTF9URVhUVVJFX1BSRV9TUEVDVUxBUl9IUCAgICAgICAgMHg4MTY5CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZHJhd19yYW5nZV9lbGVtZW50cworI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVNfRVhUICAgICAgMHg4MEU4CisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTX0VYVCAgICAgICAweDgwRTkKKyNlbmRpZgorCisjaWZuZGVmIEdMX1dJTl9waG9uZ19zaGFkaW5nCisjZGVmaW5lIEdMX1BIT05HX1dJTiAgICAgICAgICAgICAgICAgICAgICAweDgwRUEKKyNkZWZpbmUgR0xfUEhPTkdfSElOVF9XSU4gICAgICAgICAgICAgICAgIDB4ODBFQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfV0lOX3NwZWN1bGFyX2ZvZworI2RlZmluZSBHTF9GT0dfU1BFQ1VMQVJfVEVYVFVSRV9XSU4gICAgICAgMHg4MEVDCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfbGlnaHRfdGV4dHVyZQorI2RlZmluZSBHTF9GUkFHTUVOVF9NQVRFUklBTF9FWFQgICAgICAgICAgMHg4MzQ5CisjZGVmaW5lIEdMX0ZSQUdNRU5UX05PUk1BTF9FWFQgICAgICAgICAgICAweDgzNEEKKyNkZWZpbmUgR0xfRlJBR01FTlRfQ09MT1JfRVhUICAgICAgICAgICAgIDB4ODM0QworI2RlZmluZSBHTF9BVFRFTlVBVElPTl9FWFQgICAgICAgICAgICAgICAgMHg4MzRECisjZGVmaW5lIEdMX1NIQURPV19BVFRFTlVBVElPTl9FWFQgICAgICAgICAweDgzNEUKKyNkZWZpbmUgR0xfVEVYVFVSRV9BUFBMSUNBVElPTl9NT0RFX0VYVCAgIDB4ODM0RgorI2RlZmluZSBHTF9URVhUVVJFX0xJR0hUX0VYVCAgICAgICAgICAgICAgMHg4MzUwCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFURVJJQUxfRkFDRV9FWFQgICAgICAweDgzNTEKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVRFUklBTF9QQVJBTUVURVJfRVhUIDB4ODM1MgorLyogcmV1c2UgR0xfRlJBR01FTlRfREVQVEhfRVhUICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2JsZW5kX2FscGhhX21pbm1heAorI2RlZmluZSBHTF9BTFBIQV9NSU5fU0dJWCAgICAgICAgICAgICAgICAgMHg4MzIwCisjZGVmaW5lIEdMX0FMUEhBX01BWF9TR0lYICAgICAgICAgICAgICAgICAweDgzMjEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaW1wYWN0X3BpeGVsX3RleHR1cmUKKyNkZWZpbmUgR0xfUElYRUxfVEVYX0dFTl9RX0NFSUxJTkdfU0dJWCAgIDB4ODE4NAorI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX1FfUk9VTkRfU0dJWCAgICAgMHg4MTg1CisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fUV9GTE9PUl9TR0lYICAgICAweDgxODYKKyNkZWZpbmUgR0xfUElYRUxfVEVYX0dFTl9BTFBIQV9SRVBMQUNFX1NHSVggMHg4MTg3CisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fQUxQSEFfTk9fUkVQTEFDRV9TR0lYIDB4ODE4OAorI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX0FMUEhBX0xTX1NHSVggICAgMHg4MTg5CisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fQUxQSEFfTVNfU0dJWCAgICAweDgxOEEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9iZ3JhCisjZGVmaW5lIEdMX0JHUl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTAKKyNkZWZpbmUgR0xfQkdSQV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODBFMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9hc3luYworI2RlZmluZSBHTF9BU1lOQ19NQVJLRVJfU0dJWCAgICAgICAgICAgICAgMHg4MzI5CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2FzeW5jX3BpeGVsCisjZGVmaW5lIEdMX0FTWU5DX1RFWF9JTUFHRV9TR0lYICAgICAgICAgICAweDgzNUMKKyNkZWZpbmUgR0xfQVNZTkNfRFJBV19QSVhFTFNfU0dJWCAgICAgICAgIDB4ODM1RAorI2RlZmluZSBHTF9BU1lOQ19SRUFEX1BJWEVMU19TR0lYICAgICAgICAgMHg4MzVFCisjZGVmaW5lIEdMX01BWF9BU1lOQ19URVhfSU1BR0VfU0dJWCAgICAgICAweDgzNUYKKyNkZWZpbmUgR0xfTUFYX0FTWU5DX0RSQVdfUElYRUxTX1NHSVggICAgIDB4ODM2MAorI2RlZmluZSBHTF9NQVhfQVNZTkNfUkVBRF9QSVhFTFNfU0dJWCAgICAgMHg4MzYxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2FzeW5jX2hpc3RvZ3JhbQorI2RlZmluZSBHTF9BU1lOQ19ISVNUT0dSQU1fU0dJWCAgICAgICAgICAgMHg4MzJDCisjZGVmaW5lIEdMX01BWF9BU1lOQ19ISVNUT0dSQU1fU0dJWCAgICAgICAweDgzMkQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lOVEVMX3RleHR1cmVfc2Npc3NvcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfSU5URUxfcGFyYWxsZWxfYXJyYXlzCisjZGVmaW5lIEdMX1BBUkFMTEVMX0FSUkFZU19JTlRFTCAgICAgICAgICAweDgzRjQKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1BBUkFMTEVMX1BPSU5URVJTX0lOVEVMIDB4ODNGNQorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfUEFSQUxMRUxfUE9JTlRFUlNfSU5URUwgMHg4M0Y2CisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1BBUkFMTEVMX1BPSU5URVJTX0lOVEVMIDB4ODNGNworI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BBUkFMTEVMX1BPSU5URVJTX0lOVEVMIDB4ODNGOAorI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfb2NjbHVzaW9uX3Rlc3QKKyNkZWZpbmUgR0xfT0NDTFVTSU9OX1RFU1RfSFAgICAgICAgICAgICAgIDB4ODE2NQorI2RlZmluZSBHTF9PQ0NMVVNJT05fVEVTVF9SRVNVTFRfSFAgICAgICAgMHg4MTY2CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGl4ZWxfdHJhbnNmb3JtCisjZGVmaW5lIEdMX1BJWEVMX1RSQU5TRk9STV8yRF9FWFQgICAgICAgICAweDgzMzAKKyNkZWZpbmUgR0xfUElYRUxfTUFHX0ZJTFRFUl9FWFQgICAgICAgICAgIDB4ODMzMQorI2RlZmluZSBHTF9QSVhFTF9NSU5fRklMVEVSX0VYVCAgICAgICAgICAgMHg4MzMyCisjZGVmaW5lIEdMX1BJWEVMX0NVQklDX1dFSUdIVF9FWFQgICAgICAgICAweDgzMzMKKyNkZWZpbmUgR0xfQ1VCSUNfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODMzNAorI2RlZmluZSBHTF9BVkVSQUdFX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MzM1CisjZGVmaW5lIEdMX1BJWEVMX1RSQU5TRk9STV8yRF9TVEFDS19ERVBUSF9FWFQgMHg4MzM2CisjZGVmaW5lIEdMX01BWF9QSVhFTF9UUkFOU0ZPUk1fMkRfU1RBQ0tfREVQVEhfRVhUIDB4ODMzNworI2RlZmluZSBHTF9QSVhFTF9UUkFOU0ZPUk1fMkRfTUFUUklYX0VYVCAgMHg4MzM4CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGl4ZWxfdHJhbnNmb3JtX2NvbG9yX3RhYmxlCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2hhcmVkX3RleHR1cmVfcGFsZXR0ZQorI2RlZmluZSBHTF9TSEFSRURfVEVYVFVSRV9QQUxFVFRFX0VYVCAgICAgMHg4MUZCCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2VwYXJhdGVfc3BlY3VsYXJfY29sb3IKKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTF9FWFQgIDB4ODFGOAorI2RlZmluZSBHTF9TSU5HTEVfQ09MT1JfRVhUICAgICAgICAgICAgICAgMHg4MUY5CisjZGVmaW5lIEdMX1NFUEFSQVRFX1NQRUNVTEFSX0NPTE9SX0VYVCAgICAweDgxRkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zZWNvbmRhcnlfY29sb3IKKyNkZWZpbmUgR0xfQ09MT1JfU1VNX0VYVCAgICAgICAgICAgICAgICAgIDB4ODQ1OAorI2RlZmluZSBHTF9DVVJSRU5UX1NFQ09OREFSWV9DT0xPUl9FWFQgICAgMHg4NDU5CisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9TSVpFX0VYVCAweDg0NUEKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1RZUEVfRVhUIDB4ODQ1QgorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU1RSSURFX0VYVCAweDg0NUMKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1BPSU5URVJfRVhUIDB4ODQ1RAorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfRVhUICAgICAgMHg4NDVFCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9wZXJ0dXJiX25vcm1hbAorI2RlZmluZSBHTF9QRVJUVVJCX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4NUFFCisjZGVmaW5lIEdMX1RFWFRVUkVfTk9STUFMX0VYVCAgICAgICAgICAgICAweDg1QUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZvZ19jb29yZAorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0VfRVhUICAgICAgMHg4NDUwCisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0VYVCAgICAgICAgICAgICAweDg0NTEKKyNkZWZpbmUgR0xfRlJBR01FTlRfREVQVEhfRVhUICAgICAgICAgICAgIDB4ODQ1MgorI2RlZmluZSBHTF9DVVJSRU5UX0ZPR19DT09SRElOQVRFX0VYVCAgICAgMHg4NDUzCisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1RZUEVfRVhUICAweDg0NTQKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfU1RSSURFX0VYVCAweDg0NTUKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfUE9JTlRFUl9FWFQgMHg4NDU2CisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0VYVCAgICAgICAweDg0NTcKKyNlbmRpZgorCisjaWZuZGVmIEdMX1JFTkRfc2NyZWVuX2Nvb3JkaW5hdGVzCisjZGVmaW5lIEdMX1NDUkVFTl9DT09SRElOQVRFU19SRU5EICAgICAgICAweDg0OTAKKyNkZWZpbmUgR0xfSU5WRVJURURfU0NSRUVOX1dfUkVORCAgICAgICAgIDB4ODQ5MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2Nvb3JkaW5hdGVfZnJhbWUKKyNkZWZpbmUgR0xfVEFOR0VOVF9BUlJBWV9FWFQgICAgICAgICAgICAgIDB4ODQzOQorI2RlZmluZSBHTF9CSU5PUk1BTF9BUlJBWV9FWFQgICAgICAgICAgICAgMHg4NDNBCisjZGVmaW5lIEdMX0NVUlJFTlRfVEFOR0VOVF9FWFQgICAgICAgICAgICAweDg0M0IKKyNkZWZpbmUgR0xfQ1VSUkVOVF9CSU5PUk1BTF9FWFQgICAgICAgICAgIDB4ODQzQworI2RlZmluZSBHTF9UQU5HRU5UX0FSUkFZX1RZUEVfRVhUICAgICAgICAgMHg4NDNFCisjZGVmaW5lIEdMX1RBTkdFTlRfQVJSQVlfU1RSSURFX0VYVCAgICAgICAweDg0M0YKKyNkZWZpbmUgR0xfQklOT1JNQUxfQVJSQVlfVFlQRV9FWFQgICAgICAgIDB4ODQ0MAorI2RlZmluZSBHTF9CSU5PUk1BTF9BUlJBWV9TVFJJREVfRVhUICAgICAgMHg4NDQxCisjZGVmaW5lIEdMX1RBTkdFTlRfQVJSQVlfUE9JTlRFUl9FWFQgICAgICAweDg0NDIKKyNkZWZpbmUgR0xfQklOT1JNQUxfQVJSQVlfUE9JTlRFUl9FWFQgICAgIDB4ODQ0MworI2RlZmluZSBHTF9NQVAxX1RBTkdFTlRfRVhUICAgICAgICAgICAgICAgMHg4NDQ0CisjZGVmaW5lIEdMX01BUDJfVEFOR0VOVF9FWFQgICAgICAgICAgICAgICAweDg0NDUKKyNkZWZpbmUgR0xfTUFQMV9CSU5PUk1BTF9FWFQgICAgICAgICAgICAgIDB4ODQ0NgorI2RlZmluZSBHTF9NQVAyX0JJTk9STUFMX0VYVCAgICAgICAgICAgICAgMHg4NDQ3CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9lbnZfY29tYmluZQorI2RlZmluZSBHTF9DT01CSU5FX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4NTcwCisjZGVmaW5lIEdMX0NPTUJJTkVfUkdCX0VYVCAgICAgICAgICAgICAgICAweDg1NzEKKyNkZWZpbmUgR0xfQ09NQklORV9BTFBIQV9FWFQgICAgICAgICAgICAgIDB4ODU3MgorI2RlZmluZSBHTF9SR0JfU0NBTEVfRVhUICAgICAgICAgICAgICAgICAgMHg4NTczCisjZGVmaW5lIEdMX0FERF9TSUdORURfRVhUICAgICAgICAgICAgICAgICAweDg1NzQKKyNkZWZpbmUgR0xfSU5URVJQT0xBVEVfRVhUICAgICAgICAgICAgICAgIDB4ODU3NQorI2RlZmluZSBHTF9DT05TVEFOVF9FWFQgICAgICAgICAgICAgICAgICAgMHg4NTc2CisjZGVmaW5lIEdMX1BSSU1BUllfQ09MT1JfRVhUICAgICAgICAgICAgICAweDg1NzcKKyNkZWZpbmUgR0xfUFJFVklPVVNfRVhUICAgICAgICAgICAgICAgICAgIDB4ODU3OAorI2RlZmluZSBHTF9TT1VSQ0UwX1JHQl9FWFQgICAgICAgICAgICAgICAgMHg4NTgwCisjZGVmaW5lIEdMX1NPVVJDRTFfUkdCX0VYVCAgICAgICAgICAgICAgICAweDg1ODEKKyNkZWZpbmUgR0xfU09VUkNFMl9SR0JfRVhUICAgICAgICAgICAgICAgIDB4ODU4MgorI2RlZmluZSBHTF9TT1VSQ0UwX0FMUEhBX0VYVCAgICAgICAgICAgICAgMHg4NTg4CisjZGVmaW5lIEdMX1NPVVJDRTFfQUxQSEFfRVhUICAgICAgICAgICAgICAweDg1ODkKKyNkZWZpbmUgR0xfU09VUkNFMl9BTFBIQV9FWFQgICAgICAgICAgICAgIDB4ODU4QQorI2RlZmluZSBHTF9PUEVSQU5EMF9SR0JfRVhUICAgICAgICAgICAgICAgMHg4NTkwCisjZGVmaW5lIEdMX09QRVJBTkQxX1JHQl9FWFQgICAgICAgICAgICAgICAweDg1OTEKKyNkZWZpbmUgR0xfT1BFUkFORDJfUkdCX0VYVCAgICAgICAgICAgICAgIDB4ODU5MgorI2RlZmluZSBHTF9PUEVSQU5EMF9BTFBIQV9FWFQgICAgICAgICAgICAgMHg4NTk4CisjZGVmaW5lIEdMX09QRVJBTkQxX0FMUEhBX0VYVCAgICAgICAgICAgICAweDg1OTkKKyNkZWZpbmUgR0xfT1BFUkFORDJfQUxQSEFfRVhUICAgICAgICAgICAgIDB4ODU5QQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfc3BlY3VsYXJfdmVjdG9yCisjZGVmaW5lIEdMX0xJR0hUX01PREVMX1NQRUNVTEFSX1ZFQ1RPUl9BUFBMRSAweDg1QjAKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3RyYW5zZm9ybV9oaW50CisjZGVmaW5lIEdMX1RSQU5TRk9STV9ISU5UX0FQUExFICAgICAgICAgICAweDg1QjEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZm9nX3NjYWxlCisjZGVmaW5lIEdMX0ZPR19TQ0FMRV9TR0lYICAgICAgICAgICAgICAgICAweDgxRkMKKyNkZWZpbmUgR0xfRk9HX1NDQUxFX1ZBTFVFX1NHSVggICAgICAgICAgIDB4ODFGRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOWF9jb25zdGFudF9kYXRhCisjZGVmaW5lIEdMX1VOUEFDS19DT05TVEFOVF9EQVRBX1NVTlggICAgICAweDgxRDUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT05TVEFOVF9EQVRBX1NVTlggICAgIDB4ODFENgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX2dsb2JhbF9hbHBoYQorI2RlZmluZSBHTF9HTE9CQUxfQUxQSEFfU1VOICAgICAgICAgICAgICAgMHg4MUQ5CisjZGVmaW5lIEdMX0dMT0JBTF9BTFBIQV9GQUNUT1JfU1VOICAgICAgICAweDgxREEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl90cmlhbmdsZV9saXN0CisjZGVmaW5lIEdMX1JFU1RBUlRfU1VOICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgR0xfUkVQTEFDRV9NSURETEVfU1VOICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBHTF9SRVBMQUNFX09MREVTVF9TVU4gICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEdMX1RSSUFOR0xFX0xJU1RfU1VOICAgICAgICAgICAgICAweDgxRDcKKyNkZWZpbmUgR0xfUkVQTEFDRU1FTlRfQ09ERV9TVU4gICAgICAgICAgIDB4ODFEOAorI2RlZmluZSBHTF9SRVBMQUNFTUVOVF9DT0RFX0FSUkFZX1NVTiAgICAgMHg4NUMwCisjZGVmaW5lIEdMX1JFUExBQ0VNRU5UX0NPREVfQVJSQVlfVFlQRV9TVU4gMHg4NUMxCisjZGVmaW5lIEdMX1JFUExBQ0VNRU5UX0NPREVfQVJSQVlfU1RSSURFX1NVTiAweDg1QzIKKyNkZWZpbmUgR0xfUkVQTEFDRU1FTlRfQ09ERV9BUlJBWV9QT0lOVEVSX1NVTiAweDg1QzMKKyNkZWZpbmUgR0xfUjFVSV9WM0ZfU1VOICAgICAgICAgICAgICAgICAgIDB4ODVDNAorI2RlZmluZSBHTF9SMVVJX0M0VUJfVjNGX1NVTiAgICAgICAgICAgICAgMHg4NUM1CisjZGVmaW5lIEdMX1IxVUlfQzNGX1YzRl9TVU4gICAgICAgICAgICAgICAweDg1QzYKKyNkZWZpbmUgR0xfUjFVSV9OM0ZfVjNGX1NVTiAgICAgICAgICAgICAgIDB4ODVDNworI2RlZmluZSBHTF9SMVVJX0M0Rl9OM0ZfVjNGX1NVTiAgICAgICAgICAgMHg4NUM4CisjZGVmaW5lIEdMX1IxVUlfVDJGX1YzRl9TVU4gICAgICAgICAgICAgICAweDg1QzkKKyNkZWZpbmUgR0xfUjFVSV9UMkZfTjNGX1YzRl9TVU4gICAgICAgICAgIDB4ODVDQQorI2RlZmluZSBHTF9SMVVJX1QyRl9DNEZfTjNGX1YzRl9TVU4gICAgICAgMHg4NUNCCisjZW5kaWYKKworI2lmbmRlZiBHTF9TVU5fdmVydGV4CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfZnVuY19zZXBhcmF0ZQorI2RlZmluZSBHTF9CTEVORF9EU1RfUkdCX0VYVCAgICAgICAgICAgICAgMHg4MEM4CisjZGVmaW5lIEdMX0JMRU5EX1NSQ19SR0JfRVhUICAgICAgICAgICAgICAweDgwQzkKKyNkZWZpbmUgR0xfQkxFTkRfRFNUX0FMUEhBX0VYVCAgICAgICAgICAgIDB4ODBDQQorI2RlZmluZSBHTF9CTEVORF9TUkNfQUxQSEFfRVhUICAgICAgICAgICAgMHg4MENCCisjZW5kaWYKKworI2lmbmRlZiBHTF9JTkdSX2NvbG9yX2NsYW1wCisjZGVmaW5lIEdMX1JFRF9NSU5fQ0xBTVBfSU5HUiAgICAgICAgICAgICAweDg1NjAKKyNkZWZpbmUgR0xfR1JFRU5fTUlOX0NMQU1QX0lOR1IgICAgICAgICAgIDB4ODU2MQorI2RlZmluZSBHTF9CTFVFX01JTl9DTEFNUF9JTkdSICAgICAgICAgICAgMHg4NTYyCisjZGVmaW5lIEdMX0FMUEhBX01JTl9DTEFNUF9JTkdSICAgICAgICAgICAweDg1NjMKKyNkZWZpbmUgR0xfUkVEX01BWF9DTEFNUF9JTkdSICAgICAgICAgICAgIDB4ODU2NAorI2RlZmluZSBHTF9HUkVFTl9NQVhfQ0xBTVBfSU5HUiAgICAgICAgICAgMHg4NTY1CisjZGVmaW5lIEdMX0JMVUVfTUFYX0NMQU1QX0lOR1IgICAgICAgICAgICAweDg1NjYKKyNkZWZpbmUgR0xfQUxQSEFfTUFYX0NMQU1QX0lOR1IgICAgICAgICAgIDB4ODU2NworI2VuZGlmCisKKyNpZm5kZWYgR0xfSU5HUl9pbnRlcmxhY2VfcmVhZAorI2RlZmluZSBHTF9JTlRFUkxBQ0VfUkVBRF9JTkdSICAgICAgICAgICAgMHg4NTY4CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc3RlbmNpbF93cmFwCisjZGVmaW5lIEdMX0lOQ1JfV1JBUF9FWFQgICAgICAgICAgICAgICAgICAweDg1MDcKKyNkZWZpbmUgR0xfREVDUl9XUkFQX0VYVCAgICAgICAgICAgICAgICAgIDB4ODUwOAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUXzQyMl9waXhlbHMKKyNkZWZpbmUgR0xfNDIyX0VYVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDQworI2RlZmluZSBHTF80MjJfUkVWX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MENECisjZGVmaW5lIEdMXzQyMl9BVkVSQUdFX0VYVCAgICAgICAgICAgICAgICAweDgwQ0UKKyNkZWZpbmUgR0xfNDIyX1JFVl9BVkVSQUdFX0VYVCAgICAgICAgICAgIDB4ODBDRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4Z2VuX3JlZmxlY3Rpb24KKyNkZWZpbmUgR0xfTk9STUFMX01BUF9OViAgICAgICAgICAgICAgICAgIDB4ODUxMQorI2RlZmluZSBHTF9SRUZMRUNUSU9OX01BUF9OViAgICAgICAgICAgICAgMHg4NTEyCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9jdWJlX21hcAorI2RlZmluZSBHTF9OT1JNQUxfTUFQX0VYVCAgICAgICAgICAgICAgICAgMHg4NTExCisjZGVmaW5lIEdMX1JFRkxFQ1RJT05fTUFQX0VYVCAgICAgICAgICAgICAweDg1MTIKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9FWFQgICAgICAgICAgIDB4ODUxMworI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVBfRVhUICAgMHg4NTE0CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF9FWFQgMHg4NTE1CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWF9FWFQgMHg4NTE2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWV9FWFQgMHg4NTE3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV9FWFQgMHg4NTE4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWl9FWFQgMHg4NTE5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWl9FWFQgMHg4NTFBCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfQ1VCRV9NQVBfRVhUICAgICAweDg1MUIKKyNkZWZpbmUgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRV9FWFQgIDB4ODUxQworI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX2NvbnZvbHV0aW9uX2JvcmRlcl9tb2RlcworI2RlZmluZSBHTF9XUkFQX0JPUkRFUl9TVU4gICAgICAgICAgICAgICAgMHg4MUQ0CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9lbnZfYWRkCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcworI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9MT0RfQklBU19FWFQgICAgICAgMHg4NEZECisjZGVmaW5lIEdMX1RFWFRVUkVfRklMVEVSX0NPTlRST0xfRVhUICAgICAweDg1MDAKKyNkZWZpbmUgR0xfVEVYVFVSRV9MT0RfQklBU19FWFQgICAgICAgICAgIDB4ODUwMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICAgICAweDg0RkUKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUIDB4ODRGRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF93ZWlnaHRpbmcKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMF9TVEFDS19ERVBUSF9FWFQgICAgIEdMX01PREVMVklFV19TVEFDS19ERVBUSAorI2RlZmluZSBHTF9NT0RFTFZJRVcxX1NUQUNLX0RFUFRIX0VYVCAgICAgMHg4NTAyCisjZGVmaW5lIEdMX01PREVMVklFVzBfTUFUUklYX0VYVCAgICAgICAgICBHTF9NT0RFTFZJRVdfTUFUUklYCisjZGVmaW5lIEdMX01PREVMVklFVzFfTUFUUklYX0VYVCAgICAgICAgICAweDg1MDYKKyNkZWZpbmUgR0xfVkVSVEVYX1dFSUdIVElOR19FWFQgICAgICAgICAgIDB4ODUwOQorI2RlZmluZSBHTF9NT0RFTFZJRVcwX0VYVCAgICAgICAgICAgICAgICAgR0xfTU9ERUxWSUVXCisjZGVmaW5lIEdMX01PREVMVklFVzFfRVhUICAgICAgICAgICAgICAgICAweDg1MEEKKyNkZWZpbmUgR0xfQ1VSUkVOVF9WRVJURVhfV0VJR0hUX0VYVCAgICAgIDB4ODUwQgorI2RlZmluZSBHTF9WRVJURVhfV0VJR0hUX0FSUkFZX0VYVCAgICAgICAgMHg4NTBDCisjZGVmaW5lIEdMX1ZFUlRFWF9XRUlHSFRfQVJSQVlfU0laRV9FWFQgICAweDg1MEQKKyNkZWZpbmUgR0xfVkVSVEVYX1dFSUdIVF9BUlJBWV9UWVBFX0VYVCAgIDB4ODUwRQorI2RlZmluZSBHTF9WRVJURVhfV0VJR0hUX0FSUkFZX1NUUklERV9FWFQgMHg4NTBGCisjZGVmaW5lIEdMX1ZFUlRFWF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9FWFQgMHg4NTEwCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9saWdodF9tYXhfZXhwb25lbnQKKyNkZWZpbmUgR0xfTUFYX1NISU5JTkVTU19OViAgICAgICAgICAgICAgIDB4ODUwNAorI2RlZmluZSBHTF9NQVhfU1BPVF9FWFBPTkVOVF9OViAgICAgICAgICAgMHg4NTA1CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX05WICAgICAgICAgIDB4ODUxRAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfTEVOR1RIX05WICAgMHg4NTFFCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9SQU5HRV9WQUxJRF9OViAgICAweDg1MUYKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9BUlJBWV9SQU5HRV9FTEVNRU5UX05WIDB4ODUyMAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfUE9JTlRFUl9OViAgMHg4NTIxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMKKyNkZWZpbmUgR0xfUkVHSVNURVJfQ09NQklORVJTX05WICAgICAgICAgIDB4ODUyMgorI2RlZmluZSBHTF9WQVJJQUJMRV9BX05WICAgICAgICAgICAgICAgICAgMHg4NTIzCisjZGVmaW5lIEdMX1ZBUklBQkxFX0JfTlYgICAgICAgICAgICAgICAgICAweDg1MjQKKyNkZWZpbmUgR0xfVkFSSUFCTEVfQ19OViAgICAgICAgICAgICAgICAgIDB4ODUyNQorI2RlZmluZSBHTF9WQVJJQUJMRV9EX05WICAgICAgICAgICAgICAgICAgMHg4NTI2CisjZGVmaW5lIEdMX1ZBUklBQkxFX0VfTlYgICAgICAgICAgICAgICAgICAweDg1MjcKKyNkZWZpbmUgR0xfVkFSSUFCTEVfRl9OViAgICAgICAgICAgICAgICAgIDB4ODUyOAorI2RlZmluZSBHTF9WQVJJQUJMRV9HX05WICAgICAgICAgICAgICAgICAgMHg4NTI5CisjZGVmaW5lIEdMX0NPTlNUQU5UX0NPTE9SMF9OViAgICAgICAgICAgICAweDg1MkEKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQ09MT1IxX05WICAgICAgICAgICAgIDB4ODUyQgorI2RlZmluZSBHTF9QUklNQVJZX0NPTE9SX05WICAgICAgICAgICAgICAgMHg4NTJDCisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9OViAgICAgICAgICAgICAweDg1MkQKKyNkZWZpbmUgR0xfU1BBUkUwX05WICAgICAgICAgICAgICAgICAgICAgIDB4ODUyRQorI2RlZmluZSBHTF9TUEFSRTFfTlYgICAgICAgICAgICAgICAgICAgICAgMHg4NTJGCisjZGVmaW5lIEdMX0RJU0NBUkRfTlYgICAgICAgICAgICAgICAgICAgICAweDg1MzAKKyNkZWZpbmUgR0xfRV9USU1FU19GX05WICAgICAgICAgICAgICAgICAgIDB4ODUzMQorI2RlZmluZSBHTF9TUEFSRTBfUExVU19TRUNPTkRBUllfQ09MT1JfTlYgMHg4NTMyCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lERU5USVRZX05WICAgICAgICAgICAweDg1MzYKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5WRVJUX05WICAgICAgICAgICAgIDB4ODUzNworI2RlZmluZSBHTF9FWFBBTkRfTk9STUFMX05WICAgICAgICAgICAgICAgMHg4NTM4CisjZGVmaW5lIEdMX0VYUEFORF9ORUdBVEVfTlYgICAgICAgICAgICAgICAweDg1MzkKKyNkZWZpbmUgR0xfSEFMRl9CSUFTX05PUk1BTF9OViAgICAgICAgICAgIDB4ODUzQQorI2RlZmluZSBHTF9IQUxGX0JJQVNfTkVHQVRFX05WICAgICAgICAgICAgMHg4NTNCCisjZGVmaW5lIEdMX1NJR05FRF9JREVOVElUWV9OViAgICAgICAgICAgICAweDg1M0MKKyNkZWZpbmUgR0xfU0lHTkVEX05FR0FURV9OViAgICAgICAgICAgICAgIDB4ODUzRAorI2RlZmluZSBHTF9TQ0FMRV9CWV9UV09fTlYgICAgICAgICAgICAgICAgMHg4NTNFCisjZGVmaW5lIEdMX1NDQUxFX0JZX0ZPVVJfTlYgICAgICAgICAgICAgICAweDg1M0YKKyNkZWZpbmUgR0xfU0NBTEVfQllfT05FX0hBTEZfTlYgICAgICAgICAgIDB4ODU0MAorI2RlZmluZSBHTF9CSUFTX0JZX05FR0FUSVZFX09ORV9IQUxGX05WICAgMHg4NTQxCisjZGVmaW5lIEdMX0NPTUJJTkVSX0lOUFVUX05WICAgICAgICAgICAgICAweDg1NDIKKyNkZWZpbmUgR0xfQ09NQklORVJfTUFQUElOR19OViAgICAgICAgICAgIDB4ODU0MworI2RlZmluZSBHTF9DT01CSU5FUl9DT01QT05FTlRfVVNBR0VfTlYgICAgMHg4NTQ0CisjZGVmaW5lIEdMX0NPTUJJTkVSX0FCX0RPVF9QUk9EVUNUX05WICAgICAweDg1NDUKKyNkZWZpbmUgR0xfQ09NQklORVJfQ0RfRE9UX1BST0RVQ1RfTlYgICAgIDB4ODU0NgorI2RlZmluZSBHTF9DT01CSU5FUl9NVVhfU1VNX05WICAgICAgICAgICAgMHg4NTQ3CisjZGVmaW5lIEdMX0NPTUJJTkVSX1NDQUxFX05WICAgICAgICAgICAgICAweDg1NDgKKyNkZWZpbmUgR0xfQ09NQklORVJfQklBU19OViAgICAgICAgICAgICAgIDB4ODU0OQorI2RlZmluZSBHTF9DT01CSU5FUl9BQl9PVVRQVVRfTlYgICAgICAgICAgMHg4NTRBCisjZGVmaW5lIEdMX0NPTUJJTkVSX0NEX09VVFBVVF9OViAgICAgICAgICAweDg1NEIKKyNkZWZpbmUgR0xfQ09NQklORVJfU1VNX09VVFBVVF9OViAgICAgICAgIDB4ODU0QworI2RlZmluZSBHTF9NQVhfR0VORVJBTF9DT01CSU5FUlNfTlYgICAgICAgMHg4NTRECisjZGVmaW5lIEdMX05VTV9HRU5FUkFMX0NPTUJJTkVSU19OViAgICAgICAweDg1NEUKKyNkZWZpbmUgR0xfQ09MT1JfU1VNX0NMQU1QX05WICAgICAgICAgICAgIDB4ODU0RgorI2RlZmluZSBHTF9DT01CSU5FUjBfTlYgICAgICAgICAgICAgICAgICAgMHg4NTUwCisjZGVmaW5lIEdMX0NPTUJJTkVSMV9OViAgICAgICAgICAgICAgICAgICAweDg1NTEKKyNkZWZpbmUgR0xfQ09NQklORVIyX05WICAgICAgICAgICAgICAgICAgIDB4ODU1MgorI2RlZmluZSBHTF9DT01CSU5FUjNfTlYgICAgICAgICAgICAgICAgICAgMHg4NTUzCisjZGVmaW5lIEdMX0NPTUJJTkVSNF9OViAgICAgICAgICAgICAgICAgICAweDg1NTQKKyNkZWZpbmUgR0xfQ09NQklORVI1X05WICAgICAgICAgICAgICAgICAgIDB4ODU1NQorI2RlZmluZSBHTF9DT01CSU5FUjZfTlYgICAgICAgICAgICAgICAgICAgMHg4NTU2CisjZGVmaW5lIEdMX0NPTUJJTkVSN19OViAgICAgICAgICAgICAgICAgICAweDg1NTcKKy8qIHJldXNlIEdMX1RFWFRVUkUwX0FSQiAqLworLyogcmV1c2UgR0xfVEVYVFVSRTFfQVJCICovCisvKiByZXVzZSBHTF9aRVJPICovCisvKiByZXVzZSBHTF9OT05FICovCisvKiByZXVzZSBHTF9GT0cgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZvZ19kaXN0YW5jZQorI2RlZmluZSBHTF9GT0dfRElTVEFOQ0VfTU9ERV9OViAgICAgICAgICAgMHg4NTVBCisjZGVmaW5lIEdMX0VZRV9SQURJQUxfTlYgICAgICAgICAgICAgICAgICAweDg1NUIKKyNkZWZpbmUgR0xfRVlFX1BMQU5FX0FCU09MVVRFX05WICAgICAgICAgIDB4ODU1QworLyogcmV1c2UgR0xfRVlFX1BMQU5FICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXhnZW5fZW1ib3NzCisjZGVmaW5lIEdMX0VNQk9TU19MSUdIVF9OViAgICAgICAgICAgICAgICAweDg1NUQKKyNkZWZpbmUgR0xfRU1CT1NTX0NPTlNUQU5UX05WICAgICAgICAgICAgIDB4ODU1RQorI2RlZmluZSBHTF9FTUJPU1NfTUFQX05WICAgICAgICAgICAgICAgICAgMHg4NTVGCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9ibGVuZF9zcXVhcmUKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfZW52X2NvbWJpbmU0CisjZGVmaW5lIEdMX0NPTUJJTkU0X05WICAgICAgICAgICAgICAgICAgICAweDg1MDMKKyNkZWZpbmUgR0xfU09VUkNFM19SR0JfTlYgICAgICAgICAgICAgICAgIDB4ODU4MworI2RlZmluZSBHTF9TT1VSQ0UzX0FMUEhBX05WICAgICAgICAgICAgICAgMHg4NThCCisjZGVmaW5lIEdMX09QRVJBTkQzX1JHQl9OViAgICAgICAgICAgICAgICAweDg1OTMKKyNkZWZpbmUgR0xfT1BFUkFORDNfQUxQSEFfTlYgICAgICAgICAgICAgIDB4ODU5QgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV9yZXNpemVfYnVmZmVycworI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV93aW5kb3dfcG9zCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQgICAweDgzRjAKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQgIDB4ODNGMQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVCAgMHg4M0YyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUICAweDgzRjMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lCTV9jdWxsX3ZlcnRleAorI2RlZmluZSBHTF9DVUxMX1ZFUlRFWF9JQk0gICAgICAgICAgICAgICAgMTAzMDUwCisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fbXVsdGltb2RlX2RyYXdfYXJyYXlzCisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fdmVydGV4X2FycmF5X2xpc3RzCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9MSVNUX0lCTSAgICAgICAgICAxMDMwNzAKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX0xJU1RfSUJNICAgICAgICAgIDEwMzA3MQorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9MSVNUX0lCTSAgICAgICAgICAgMTAzMDcyCisjZGVmaW5lIEdMX0lOREVYX0FSUkFZX0xJU1RfSUJNICAgICAgICAgICAxMDMwNzMKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9MSVNUX0lCTSAgIDEwMzA3NAorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfTElTVF9JQk0gICAgICAgMTAzMDc1CisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0xJU1RfSUJNICAxMDMwNzYKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0xJU1RfSUJNIDEwMzA3NworI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfTElTVF9TVFJJREVfSUJNICAgMTAzMDgwCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9MSVNUX1NUUklERV9JQk0gICAxMDMwODEKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfTElTVF9TVFJJREVfSUJNICAgIDEwMzA4MgorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9MSVNUX1NUUklERV9JQk0gICAgMTAzMDgzCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfTElTVF9TVFJJREVfSUJNIDEwMzA4NAorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfTElTVF9TVFJJREVfSUJNIDEwMzA4NQorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9MSVNUX1NUUklERV9JQk0gMTAzMDg2CisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9MSVNUX1NUUklERV9JQk0gMTAzMDg3CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3N1YnNhbXBsZQorI2RlZmluZSBHTF9QQUNLX1NVQlNBTVBMRV9SQVRFX1NHSVggICAgICAgMHg4NUEwCisjZGVmaW5lIEdMX1VOUEFDS19TVUJTQU1QTEVfUkFURV9TR0lYICAgICAweDg1QTEKKyNkZWZpbmUgR0xfUElYRUxfU1VCU0FNUExFXzQ0NDRfU0dJWCAgICAgIDB4ODVBMgorI2RlZmluZSBHTF9QSVhFTF9TVUJTQU1QTEVfMjQyNF9TR0lYICAgICAgMHg4NUEzCisjZGVmaW5lIEdMX1BJWEVMX1NVQlNBTVBMRV80MjQyX1NHSVggICAgICAweDg1QTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfeWNyY2Jfc3Vic2FtcGxlCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3ljcmNiYQorI2RlZmluZSBHTF9ZQ1JDQl9TR0lYICAgICAgICAgICAgICAgICAgICAgMHg4MzE4CisjZGVmaW5lIEdMX1lDUkNCQV9TR0lYICAgICAgICAgICAgICAgICAgICAweDgzMTkKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSV9kZXB0aF9wYXNzX2luc3RydW1lbnQKKyNkZWZpbmUgR0xfREVQVEhfUEFTU19JTlNUUlVNRU5UX1NHSVggICAgIDB4ODMxMAorI2RlZmluZSBHTF9ERVBUSF9QQVNTX0lOU1RSVU1FTlRfQ09VTlRFUlNfU0dJWCAweDgzMTEKKyNkZWZpbmUgR0xfREVQVEhfUEFTU19JTlNUUlVNRU5UX01BWF9TR0lYIDB4ODMxMgorI2VuZGlmCisKKyNpZm5kZWYgR0xfM0RGWF90ZXh0dXJlX2NvbXByZXNzaW9uX0ZYVDEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfRlhUMV8zREZYICAgICAgIDB4ODZCMAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfRlhUMV8zREZYICAgICAgMHg4NkIxCisjZW5kaWYKKworI2lmbmRlZiBHTF8zREZYX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX01VTFRJU0FNUExFXzNERlggICAgICAgICAgICAgICAweDg2QjIKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlNfM0RGWCAgICAgICAgICAgIDB4ODZCMworI2RlZmluZSBHTF9TQU1QTEVTXzNERlggICAgICAgICAgICAgICAgICAgMHg4NkI0CisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0JJVF8zREZYICAgICAgICAgICAweDIwMDAwMDAwCisjZW5kaWYKKworI2lmbmRlZiBHTF8zREZYX3RidWZmZXIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9FWFQgICAgICAgICAgICAgICAgMHg4MDlECisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19NQVNLX0VYVCAgICAgICAweDgwOUUKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORV9FWFQgICAgICAgIDB4ODA5RgorI2RlZmluZSBHTF9TQU1QTEVfTUFTS19FWFQgICAgICAgICAgICAgICAgMHg4MEEwCisjZGVmaW5lIEdMXzFQQVNTX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgwQTEKKyNkZWZpbmUgR0xfMlBBU1NfMF9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBBMgorI2RlZmluZSBHTF8yUEFTU18xX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MEEzCisjZGVmaW5lIEdMXzRQQVNTXzBfRVhUICAgICAgICAgICAgICAgICAgICAweDgwQTQKKyNkZWZpbmUgR0xfNFBBU1NfMV9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBBNQorI2RlZmluZSBHTF80UEFTU18yX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MEE2CisjZGVmaW5lIEdMXzRQQVNTXzNfRVhUICAgICAgICAgICAgICAgICAgICAweDgwQTcKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlNfRVhUICAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9NQVNLX1ZBTFVFX0VYVCAgICAgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX01BU0tfSU5WRVJUX0VYVCAgICAgICAgIDB4ODBBQgorI2RlZmluZSBHTF9TQU1QTEVfUEFUVEVSTl9FWFQgICAgICAgICAgICAgMHg4MEFDCisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0JJVF9FWFQgICAgICAgICAgICAweDIwMDAwMDAwCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3ZlcnRleF9wcmVjbGlwCisjZGVmaW5lIEdMX1ZFUlRFWF9QUkVDTElQX1NHSVggICAgICAgICAgICAweDgzRUUKKyNkZWZpbmUgR0xfVkVSVEVYX1BSRUNMSVBfSElOVF9TR0lYICAgICAgIDB4ODNFRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9jb252b2x1dGlvbl9hY2N1cmFjeQorI2RlZmluZSBHTF9DT05WT0xVVElPTl9ISU5UX1NHSVggICAgICAgICAgMHg4MzE2CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3Jlc2FtcGxlCisjZGVmaW5lIEdMX1BBQ0tfUkVTQU1QTEVfU0dJWCAgICAgICAgICAgICAweDg0MkMKKyNkZWZpbmUgR0xfVU5QQUNLX1JFU0FNUExFX1NHSVggICAgICAgICAgIDB4ODQyRAorI2RlZmluZSBHTF9SRVNBTVBMRV9SRVBMSUNBVEVfU0dJWCAgICAgICAgMHg4NDJFCisjZGVmaW5lIEdMX1JFU0FNUExFX1pFUk9fRklMTF9TR0lYICAgICAgICAweDg0MkYKKyNkZWZpbmUgR0xfUkVTQU1QTEVfREVDSU1BVEVfU0dJWCAgICAgICAgIDB4ODQzMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19wb2ludF9saW5lX3RleGdlbgorI2RlZmluZSBHTF9FWUVfRElTVEFOQ0VfVE9fUE9JTlRfU0dJUyAgICAgMHg4MUYwCisjZGVmaW5lIEdMX09CSkVDVF9ESVNUQU5DRV9UT19QT0lOVF9TR0lTICAweDgxRjEKKyNkZWZpbmUgR0xfRVlFX0RJU1RBTkNFX1RPX0xJTkVfU0dJUyAgICAgIDB4ODFGMgorI2RlZmluZSBHTF9PQkpFQ1RfRElTVEFOQ0VfVE9fTElORV9TR0lTICAgMHg4MUYzCisjZGVmaW5lIEdMX0VZRV9QT0lOVF9TR0lTICAgICAgICAgICAgICAgICAweDgxRjQKKyNkZWZpbmUgR0xfT0JKRUNUX1BPSU5UX1NHSVMgICAgICAgICAgICAgIDB4ODFGNQorI2RlZmluZSBHTF9FWUVfTElORV9TR0lTICAgICAgICAgICAgICAgICAgMHg4MUY2CisjZGVmaW5lIEdMX09CSkVDVF9MSU5FX1NHSVMgICAgICAgICAgICAgICAweDgxRjcKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9jb2xvcl9tYXNrCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09MT1JfV1JJVEVNQVNLX1NHSVMgICAweDgxRUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2Vudl9kb3QzCisjZGVmaW5lIEdMX0RPVDNfUkdCX0VYVCAgICAgICAgICAgICAgICAgICAweDg3NDAKKyNkZWZpbmUgR0xfRE9UM19SR0JBX0VYVCAgICAgICAgICAgICAgICAgIDB4ODc0MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHR1cmVfbWlycm9yX29uY2UKKyNkZWZpbmUgR0xfTUlSUk9SX0NMQU1QX0FUSSAgICAgICAgICAgICAgIDB4ODc0MgorI2RlZmluZSBHTF9NSVJST1JfQ0xBTVBfVE9fRURHRV9BVEkgICAgICAgMHg4NzQzCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mZW5jZQorI2RlZmluZSBHTF9BTExfQ09NUExFVEVEX05WICAgICAgICAgICAgICAgMHg4NEYyCisjZGVmaW5lIEdMX0ZFTkNFX1NUQVRVU19OViAgICAgICAgICAgICAgICAweDg0RjMKKyNkZWZpbmUgR0xfRkVOQ0VfQ09ORElUSU9OX05WICAgICAgICAgICAgIDB4ODRGNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfSUJNX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0CisjZGVmaW5lIEdMX01JUlJPUkVEX1JFUEVBVF9JQk0gICAgICAgICAgICAweDgzNzAKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2V2YWx1YXRvcnMKKyNkZWZpbmUgR0xfRVZBTF8yRF9OViAgICAgICAgICAgICAgICAgICAgIDB4ODZDMAorI2RlZmluZSBHTF9FVkFMX1RSSUFOR1VMQVJfMkRfTlYgICAgICAgICAgMHg4NkMxCisjZGVmaW5lIEdMX01BUF9URVNTRUxMQVRJT05fTlYgICAgICAgICAgICAweDg2QzIKKyNkZWZpbmUgR0xfTUFQX0FUVFJJQl9VX09SREVSX05WICAgICAgICAgIDB4ODZDMworI2RlZmluZSBHTF9NQVBfQVRUUklCX1ZfT1JERVJfTlYgICAgICAgICAgMHg4NkM0CisjZGVmaW5lIEdMX0VWQUxfRlJBQ1RJT05BTF9URVNTRUxMQVRJT05fTlYgMHg4NkM1CisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjBfTlYgICAgICAgICAweDg2QzYKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMV9OViAgICAgICAgIDB4ODZDNworI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIyX05WICAgICAgICAgMHg4NkM4CisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjNfTlYgICAgICAgICAweDg2QzkKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCNF9OViAgICAgICAgIDB4ODZDQQorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUI1X05WICAgICAgICAgMHg4NkNCCisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjZfTlYgICAgICAgICAweDg2Q0MKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCN19OViAgICAgICAgIDB4ODZDRAorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUI4X05WICAgICAgICAgMHg4NkNFCisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjlfTlYgICAgICAgICAweDg2Q0YKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMTBfTlYgICAgICAgIDB4ODZEMAorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIxMV9OViAgICAgICAgMHg4NkQxCisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjEyX05WICAgICAgICAweDg2RDIKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMTNfTlYgICAgICAgIDB4ODZEMworI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIxNF9OViAgICAgICAgMHg4NkQ0CisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjE1X05WICAgICAgICAweDg2RDUKKyNkZWZpbmUgR0xfTUFYX01BUF9URVNTRUxMQVRJT05fTlYgICAgICAgIDB4ODZENgorI2RlZmluZSBHTF9NQVhfUkFUSU9OQUxfRVZBTF9PUkRFUl9OViAgICAgMHg4NkQ3CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wYWNrZWRfZGVwdGhfc3RlbmNpbAorI2RlZmluZSBHTF9ERVBUSF9TVEVOQ0lMX05WICAgICAgICAgICAgICAgMHg4NEY5CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8yNF84X05WICAgICAgICAgICAweDg0RkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3JlZ2lzdGVyX2NvbWJpbmVyczIKKyNkZWZpbmUgR0xfUEVSX1NUQUdFX0NPTlNUQU5UU19OViAgICAgICAgIDB4ODUzNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl92dGMKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfcmVjdGFuZ2xlCisjZGVmaW5lIEdMX1RFWFRVUkVfUkVDVEFOR0xFX05WICAgICAgICAgICAweDg0RjUKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX1JFQ1RBTkdMRV9OViAgIDB4ODRGNgorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX1JFQ1RBTkdMRV9OViAgICAgMHg4NEY3CisjZGVmaW5lIEdMX01BWF9SRUNUQU5HTEVfVEVYVFVSRV9TSVpFX05WICAweDg0RjgKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfc2hhZGVyCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFX1JFQ1RBTkdMRV9OViAgICAweDg2NEMKKyNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfUkVDVEFOR0xFX1NDQUxFX05WIDB4ODY0RAorI2RlZmluZSBHTF9ET1RfUFJPRFVDVF9URVhUVVJFX1JFQ1RBTkdMRV9OViAweDg2NEUKKyNkZWZpbmUgR0xfUkdCQV9VTlNJR05FRF9ET1RfUFJPRFVDVF9NQVBQSU5HX05WIDB4ODZEOQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfUzhfUzhfOF84X05WICAgICAgMHg4NkRBCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF84XzhfUzhfUzhfUkVWX05WICAweDg2REIKKyNkZWZpbmUgR0xfRFNEVF9NQUdfSU5URU5TSVRZX05WICAgICAgICAgIDB4ODZEQworI2RlZmluZSBHTF9TSEFERVJfQ09OU0lTVEVOVF9OViAgICAgICAgICAgMHg4NkRECisjZGVmaW5lIEdMX1RFWFRVUkVfU0hBREVSX05WICAgICAgICAgICAgICAweDg2REUKKyNkZWZpbmUgR0xfU0hBREVSX09QRVJBVElPTl9OViAgICAgICAgICAgIDB4ODZERgorI2RlZmluZSBHTF9DVUxMX01PREVTX05WICAgICAgICAgICAgICAgICAgMHg4NkUwCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFX01BVFJJWF9OViAgICAgICAweDg2RTEKKyNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfU0NBTEVfTlYgICAgICAgIDB4ODZFMgorI2RlZmluZSBHTF9PRkZTRVRfVEVYVFVSRV9CSUFTX05WICAgICAgICAgMHg4NkUzCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFXzJEX01BVFJJWF9OViAgICBHTF9PRkZTRVRfVEVYVFVSRV9NQVRSSVhfTlYKKyNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfMkRfU0NBTEVfTlYgICAgIEdMX09GRlNFVF9URVhUVVJFX1NDQUxFX05WCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFXzJEX0JJQVNfTlYgICAgICBHTF9PRkZTRVRfVEVYVFVSRV9CSUFTX05WCisjZGVmaW5lIEdMX1BSRVZJT1VTX1RFWFRVUkVfSU5QVVRfTlYgICAgICAweDg2RTQKKyNkZWZpbmUgR0xfQ09OU1RfRVlFX05WICAgICAgICAgICAgICAgICAgIDB4ODZFNQorI2RlZmluZSBHTF9QQVNTX1RIUk9VR0hfTlYgICAgICAgICAgICAgICAgMHg4NkU2CisjZGVmaW5lIEdMX0NVTExfRlJBR01FTlRfTlYgICAgICAgICAgICAgICAweDg2RTcKKyNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfMkRfTlYgICAgICAgICAgIDB4ODZFOAorI2RlZmluZSBHTF9ERVBFTkRFTlRfQVJfVEVYVFVSRV8yRF9OViAgICAgMHg4NkU5CisjZGVmaW5lIEdMX0RFUEVOREVOVF9HQl9URVhUVVJFXzJEX05WICAgICAweDg2RUEKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfTlYgICAgICAgICAgICAgICAgIDB4ODZFQworI2RlZmluZSBHTF9ET1RfUFJPRFVDVF9ERVBUSF9SRVBMQUNFX05WICAgMHg4NkVECisjZGVmaW5lIEdMX0RPVF9QUk9EVUNUX1RFWFRVUkVfMkRfTlYgICAgICAweDg2RUUKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfVEVYVFVSRV9DVUJFX01BUF9OViAweDg2RjAKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfRElGRlVTRV9DVUJFX01BUF9OViAweDg2RjEKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfUkVGTEVDVF9DVUJFX01BUF9OViAweDg2RjIKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfQ09OU1RfRVlFX1JFRkxFQ1RfQ1VCRV9NQVBfTlYgMHg4NkYzCisjZGVmaW5lIEdMX0hJTE9fTlYgICAgICAgICAgICAgICAgICAgICAgICAweDg2RjQKKyNkZWZpbmUgR0xfRFNEVF9OViAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZGNQorI2RlZmluZSBHTF9EU0RUX01BR19OViAgICAgICAgICAgICAgICAgICAgMHg4NkY2CisjZGVmaW5lIEdMX0RTRFRfTUFHX1ZJQl9OViAgICAgICAgICAgICAgICAweDg2RjcKKyNkZWZpbmUgR0xfSElMTzE2X05WICAgICAgICAgICAgICAgICAgICAgIDB4ODZGOAorI2RlZmluZSBHTF9TSUdORURfSElMT19OViAgICAgICAgICAgICAgICAgMHg4NkY5CisjZGVmaW5lIEdMX1NJR05FRF9ISUxPMTZfTlYgICAgICAgICAgICAgICAweDg2RkEKKyNkZWZpbmUgR0xfU0lHTkVEX1JHQkFfTlYgICAgICAgICAgICAgICAgIDB4ODZGQgorI2RlZmluZSBHTF9TSUdORURfUkdCQThfTlYgICAgICAgICAgICAgICAgMHg4NkZDCisjZGVmaW5lIEdMX1NJR05FRF9SR0JfTlYgICAgICAgICAgICAgICAgICAweDg2RkUKKyNkZWZpbmUgR0xfU0lHTkVEX1JHQjhfTlYgICAgICAgICAgICAgICAgIDB4ODZGRgorI2RlZmluZSBHTF9TSUdORURfTFVNSU5BTkNFX05WICAgICAgICAgICAgMHg4NzAxCisjZGVmaW5lIEdMX1NJR05FRF9MVU1JTkFOQ0U4X05WICAgICAgICAgICAweDg3MDIKKyNkZWZpbmUgR0xfU0lHTkVEX0xVTUlOQU5DRV9BTFBIQV9OViAgICAgIDB4ODcwMworI2RlZmluZSBHTF9TSUdORURfTFVNSU5BTkNFOF9BTFBIQThfTlYgICAgMHg4NzA0CisjZGVmaW5lIEdMX1NJR05FRF9BTFBIQV9OViAgICAgICAgICAgICAgICAweDg3MDUKKyNkZWZpbmUgR0xfU0lHTkVEX0FMUEhBOF9OViAgICAgICAgICAgICAgIDB4ODcwNgorI2RlZmluZSBHTF9TSUdORURfSU5URU5TSVRZX05WICAgICAgICAgICAgMHg4NzA3CisjZGVmaW5lIEdMX1NJR05FRF9JTlRFTlNJVFk4X05WICAgICAgICAgICAweDg3MDgKKyNkZWZpbmUgR0xfRFNEVDhfTlYgICAgICAgICAgICAgICAgICAgICAgIDB4ODcwOQorI2RlZmluZSBHTF9EU0RUOF9NQUc4X05WICAgICAgICAgICAgICAgICAgMHg4NzBBCisjZGVmaW5lIEdMX0RTRFQ4X01BRzhfSU5URU5TSVRZOF9OViAgICAgICAweDg3MEIKKyNkZWZpbmUgR0xfU0lHTkVEX1JHQl9VTlNJR05FRF9BTFBIQV9OViAgIDB4ODcwQworI2RlZmluZSBHTF9TSUdORURfUkdCOF9VTlNJR05FRF9BTFBIQThfTlYgMHg4NzBECisjZGVmaW5lIEdMX0hJX1NDQUxFX05WICAgICAgICAgICAgICAgICAgICAweDg3MEUKKyNkZWZpbmUgR0xfTE9fU0NBTEVfTlYgICAgICAgICAgICAgICAgICAgIDB4ODcwRgorI2RlZmluZSBHTF9EU19TQ0FMRV9OViAgICAgICAgICAgICAgICAgICAgMHg4NzEwCisjZGVmaW5lIEdMX0RUX1NDQUxFX05WICAgICAgICAgICAgICAgICAgICAweDg3MTEKKyNkZWZpbmUgR0xfTUFHTklUVURFX1NDQUxFX05WICAgICAgICAgICAgIDB4ODcxMgorI2RlZmluZSBHTF9WSUJSQU5DRV9TQ0FMRV9OViAgICAgICAgICAgICAgMHg4NzEzCisjZGVmaW5lIEdMX0hJX0JJQVNfTlYgICAgICAgICAgICAgICAgICAgICAweDg3MTQKKyNkZWZpbmUgR0xfTE9fQklBU19OViAgICAgICAgICAgICAgICAgICAgIDB4ODcxNQorI2RlZmluZSBHTF9EU19CSUFTX05WICAgICAgICAgICAgICAgICAgICAgMHg4NzE2CisjZGVmaW5lIEdMX0RUX0JJQVNfTlYgICAgICAgICAgICAgICAgICAgICAweDg3MTcKKyNkZWZpbmUgR0xfTUFHTklUVURFX0JJQVNfTlYgICAgICAgICAgICAgIDB4ODcxOAorI2RlZmluZSBHTF9WSUJSQU5DRV9CSUFTX05WICAgICAgICAgICAgICAgMHg4NzE5CisjZGVmaW5lIEdMX1RFWFRVUkVfQk9SREVSX1ZBTFVFU19OViAgICAgICAweDg3MUEKKyNkZWZpbmUgR0xfVEVYVFVSRV9ISV9TSVpFX05WICAgICAgICAgICAgIDB4ODcxQgorI2RlZmluZSBHTF9URVhUVVJFX0xPX1NJWkVfTlYgICAgICAgICAgICAgMHg4NzFDCisjZGVmaW5lIEdMX1RFWFRVUkVfRFNfU0laRV9OViAgICAgICAgICAgICAweDg3MUQKKyNkZWZpbmUgR0xfVEVYVFVSRV9EVF9TSVpFX05WICAgICAgICAgICAgIDB4ODcxRQorI2RlZmluZSBHTF9URVhUVVJFX01BR19TSVpFX05WICAgICAgICAgICAgMHg4NzFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX3NoYWRlcjIKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfVEVYVFVSRV8zRF9OViAgICAgIDB4ODZFRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X2FycmF5X3JhbmdlMgorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfV0lUSE9VVF9GTFVTSF9OViAweDg1MzMKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtCisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX05WICAgICAgICAgICAgICAweDg2MjAKKyNkZWZpbmUgR0xfVkVSVEVYX1NUQVRFX1BST0dSQU1fTlYgICAgICAgIDB4ODYyMQorI2RlZmluZSBHTF9BVFRSSUJfQVJSQVlfU0laRV9OViAgICAgICAgICAgMHg4NjIzCisjZGVmaW5lIEdMX0FUVFJJQl9BUlJBWV9TVFJJREVfTlYgICAgICAgICAweDg2MjQKKyNkZWZpbmUgR0xfQVRUUklCX0FSUkFZX1RZUEVfTlYgICAgICAgICAgIDB4ODYyNQorI2RlZmluZSBHTF9DVVJSRU5UX0FUVFJJQl9OViAgICAgICAgICAgICAgMHg4NjI2CisjZGVmaW5lIEdMX1BST0dSQU1fTEVOR1RIX05WICAgICAgICAgICAgICAweDg2MjcKKyNkZWZpbmUgR0xfUFJPR1JBTV9TVFJJTkdfTlYgICAgICAgICAgICAgIDB4ODYyOAorI2RlZmluZSBHTF9NT0RFTFZJRVdfUFJPSkVDVElPTl9OViAgICAgICAgMHg4NjI5CisjZGVmaW5lIEdMX0lERU5USVRZX05WICAgICAgICAgICAgICAgICAgICAweDg2MkEKKyNkZWZpbmUgR0xfSU5WRVJTRV9OViAgICAgICAgICAgICAgICAgICAgIDB4ODYyQgorI2RlZmluZSBHTF9UUkFOU1BPU0VfTlYgICAgICAgICAgICAgICAgICAgMHg4NjJDCisjZGVmaW5lIEdMX0lOVkVSU0VfVFJBTlNQT1NFX05WICAgICAgICAgICAweDg2MkQKKyNkZWZpbmUgR0xfTUFYX1RSQUNLX01BVFJJWF9TVEFDS19ERVBUSF9OViAweDg2MkUKKyNkZWZpbmUgR0xfTUFYX1RSQUNLX01BVFJJQ0VTX05WICAgICAgICAgIDB4ODYyRgorI2RlZmluZSBHTF9NQVRSSVgwX05WICAgICAgICAgICAgICAgICAgICAgMHg4NjMwCisjZGVmaW5lIEdMX01BVFJJWDFfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MzEKKyNkZWZpbmUgR0xfTUFUUklYMl9OViAgICAgICAgICAgICAgICAgICAgIDB4ODYzMgorI2RlZmluZSBHTF9NQVRSSVgzX05WICAgICAgICAgICAgICAgICAgICAgMHg4NjMzCisjZGVmaW5lIEdMX01BVFJJWDRfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MzQKKyNkZWZpbmUgR0xfTUFUUklYNV9OViAgICAgICAgICAgICAgICAgICAgIDB4ODYzNQorI2RlZmluZSBHTF9NQVRSSVg2X05WICAgICAgICAgICAgICAgICAgICAgMHg4NjM2CisjZGVmaW5lIEdMX01BVFJJWDdfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MzcKKyNkZWZpbmUgR0xfQ1VSUkVOVF9NQVRSSVhfU1RBQ0tfREVQVEhfTlYgIDB4ODY0MAorI2RlZmluZSBHTF9DVVJSRU5UX01BVFJJWF9OViAgICAgICAgICAgICAgMHg4NjQxCisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5UX1NJWkVfTlYgICAweDg2NDIKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fVFdPX1NJREVfTlYgICAgIDB4ODY0MworI2RlZmluZSBHTF9QUk9HUkFNX1BBUkFNRVRFUl9OViAgICAgICAgICAgMHg4NjQ0CisjZGVmaW5lIEdMX0FUVFJJQl9BUlJBWV9QT0lOVEVSX05WICAgICAgICAweDg2NDUKKyNkZWZpbmUgR0xfUFJPR1JBTV9UQVJHRVRfTlYgICAgICAgICAgICAgIDB4ODY0NgorI2RlZmluZSBHTF9QUk9HUkFNX1JFU0lERU5UX05WICAgICAgICAgICAgMHg4NjQ3CisjZGVmaW5lIEdMX1RSQUNLX01BVFJJWF9OViAgICAgICAgICAgICAgICAweDg2NDgKKyNkZWZpbmUgR0xfVFJBQ0tfTUFUUklYX1RSQU5TRk9STV9OViAgICAgIDB4ODY0OQorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9CSU5ESU5HX05WICAgICAgMHg4NjRBCisjZGVmaW5lIEdMX1BST0dSQU1fRVJST1JfUE9TSVRJT05fTlYgICAgICAweDg2NEIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTBfTlYgICAgICAgIDB4ODY1MAorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMV9OViAgICAgICAgMHg4NjUxCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkyX05WICAgICAgICAweDg2NTIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTNfTlYgICAgICAgIDB4ODY1MworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZNF9OViAgICAgICAgMHg4NjU0CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk1X05WICAgICAgICAweDg2NTUKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTZfTlYgICAgICAgIDB4ODY1NgorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZN19OViAgICAgICAgMHg4NjU3CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk4X05WICAgICAgICAweDg2NTgKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTlfTlYgICAgICAgIDB4ODY1OQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTBfTlYgICAgICAgMHg4NjVBCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxMV9OViAgICAgICAweDg2NUIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTEyX05WICAgICAgIDB4ODY1QworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTNfTlYgICAgICAgMHg4NjVECisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxNF9OViAgICAgICAweDg2NUUKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTE1X05WICAgICAgIDB4ODY1RgorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIwXzRfTlYgICAgICAgMHg4NjYwCisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjFfNF9OViAgICAgICAweDg2NjEKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMl80X05WICAgICAgIDB4ODY2MgorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIzXzRfTlYgICAgICAgMHg4NjYzCisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjRfNF9OViAgICAgICAweDg2NjQKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCNV80X05WICAgICAgIDB4ODY2NQorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI2XzRfTlYgICAgICAgMHg4NjY2CisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjdfNF9OViAgICAgICAweDg2NjcKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCOF80X05WICAgICAgIDB4ODY2OAorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI5XzRfTlYgICAgICAgMHg4NjY5CisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjEwXzRfTlYgICAgICAweDg2NkEKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMTFfNF9OViAgICAgIDB4ODY2QgorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxMl80X05WICAgICAgMHg4NjZDCisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjEzXzRfTlYgICAgICAweDg2NkQKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMTRfNF9OViAgICAgIDB4ODY2RQorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxNV80X05WICAgICAgMHg4NjZGCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjBfNF9OViAgICAgICAweDg2NzAKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMV80X05WICAgICAgIDB4ODY3MQorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIyXzRfTlYgICAgICAgMHg4NjcyCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjNfNF9OViAgICAgICAweDg2NzMKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCNF80X05WICAgICAgIDB4ODY3NAorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI1XzRfTlYgICAgICAgMHg4Njc1CisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjZfNF9OViAgICAgICAweDg2NzYKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCN180X05WICAgICAgIDB4ODY3NworI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI4XzRfTlYgICAgICAgMHg4Njc4CisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjlfNF9OViAgICAgICAweDg2NzkKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMTBfNF9OViAgICAgIDB4ODY3QQorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxMV80X05WICAgICAgMHg4NjdCCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjEyXzRfTlYgICAgICAweDg2N0MKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMTNfNF9OViAgICAgIDB4ODY3RAorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxNF80X05WICAgICAgMHg4NjdFCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjE1XzRfTlYgICAgICAweDg2N0YKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9jb29yZGluYXRlX2NsYW1wCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0NMQU1QX1NfU0dJWCAgICAgICAweDgzNjkKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfQ0xBTVBfVF9TR0lYICAgICAgIDB4ODM2QQorI2RlZmluZSBHTF9URVhUVVJFX01BWF9DTEFNUF9SX1NHSVggICAgICAgMHg4MzZCCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3NjYWxlYmlhc19oaW50CisjZGVmaW5lIEdMX1NDQUxFQklBU19ISU5UX1NHSVggICAgICAgICAgICAweDgzMjIKKyNlbmRpZgorCisjaWZuZGVmIEdMX09NTF9pbnRlcmxhY2UKKyNkZWZpbmUgR0xfSU5URVJMQUNFX09NTCAgICAgICAgICAgICAgICAgIDB4ODk4MAorI2RlZmluZSBHTF9JTlRFUkxBQ0VfUkVBRF9PTUwgICAgICAgICAgICAgMHg4OTgxCisjZW5kaWYKKworI2lmbmRlZiBHTF9PTUxfc3Vic2FtcGxlCisjZGVmaW5lIEdMX0ZPUk1BVF9TVUJTQU1QTEVfMjRfMjRfT01MICAgICAweDg5ODIKKyNkZWZpbmUgR0xfRk9STUFUX1NVQlNBTVBMRV8yNDRfMjQ0X09NTCAgIDB4ODk4MworI2VuZGlmCisKKyNpZm5kZWYgR0xfT01MX3Jlc2FtcGxlCisjZGVmaW5lIEdMX1BBQ0tfUkVTQU1QTEVfT01MICAgICAgICAgICAgICAweDg5ODQKKyNkZWZpbmUgR0xfVU5QQUNLX1JFU0FNUExFX09NTCAgICAgICAgICAgIDB4ODk4NQorI2RlZmluZSBHTF9SRVNBTVBMRV9SRVBMSUNBVEVfT01MICAgICAgICAgMHg4OTg2CisjZGVmaW5lIEdMX1JFU0FNUExFX1pFUk9fRklMTF9PTUwgICAgICAgICAweDg5ODcKKyNkZWZpbmUgR0xfUkVTQU1QTEVfQVZFUkFHRV9PTUwgICAgICAgICAgIDB4ODk4OAorI2RlZmluZSBHTF9SRVNBTVBMRV9ERUNJTUFURV9PTUwgICAgICAgICAgMHg4OTg5CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9jb3B5X2RlcHRoX3RvX2NvbG9yCisjZGVmaW5lIEdMX0RFUFRIX1NURU5DSUxfVE9fUkdCQV9OViAgICAgICAweDg4NkUKKyNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTF9UT19CR1JBX05WICAgICAgIDB4ODg2RgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2Vudm1hcF9idW1wbWFwCisjZGVmaW5lIEdMX0JVTVBfUk9UX01BVFJJWF9BVEkgICAgICAgICAgICAweDg3NzUKKyNkZWZpbmUgR0xfQlVNUF9ST1RfTUFUUklYX1NJWkVfQVRJICAgICAgIDB4ODc3NgorI2RlZmluZSBHTF9CVU1QX05VTV9URVhfVU5JVFNfQVRJICAgICAgICAgMHg4Nzc3CisjZGVmaW5lIEdMX0JVTVBfVEVYX1VOSVRTX0FUSSAgICAgICAgICAgICAweDg3NzgKKyNkZWZpbmUgR0xfRFVEVl9BVEkgICAgICAgICAgICAgICAgICAgICAgIDB4ODc3OQorI2RlZmluZSBHTF9EVThEVjhfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4NzdBCisjZGVmaW5lIEdMX0JVTVBfRU5WTUFQX0FUSSAgICAgICAgICAgICAgICAweDg3N0IKKyNkZWZpbmUgR0xfQlVNUF9UQVJHRVRfQVRJICAgICAgICAgICAgICAgIDB4ODc3QworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfQVRJICAgICAgICAgICAgMHg4OTIwCisjZGVmaW5lIEdMX1JFR18wX0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjEKKyNkZWZpbmUgR0xfUkVHXzFfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyMgorI2RlZmluZSBHTF9SRUdfMl9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTIzCisjZGVmaW5lIEdMX1JFR18zX0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjQKKyNkZWZpbmUgR0xfUkVHXzRfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyNQorI2RlZmluZSBHTF9SRUdfNV9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTI2CisjZGVmaW5lIEdMX1JFR182X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjcKKyNkZWZpbmUgR0xfUkVHXzdfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyOAorI2RlZmluZSBHTF9SRUdfOF9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTI5CisjZGVmaW5lIEdMX1JFR185X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MkEKKyNkZWZpbmUgR0xfUkVHXzEwX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkyQgorI2RlZmluZSBHTF9SRUdfMTFfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTJDCisjZGVmaW5lIEdMX1JFR18xMl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MkQKKyNkZWZpbmUgR0xfUkVHXzEzX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkyRQorI2RlZmluZSBHTF9SRUdfMTRfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTJGCisjZGVmaW5lIEdMX1JFR18xNV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzAKKyNkZWZpbmUgR0xfUkVHXzE2X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzMQorI2RlZmluZSBHTF9SRUdfMTdfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTMyCisjZGVmaW5lIEdMX1JFR18xOF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzMKKyNkZWZpbmUgR0xfUkVHXzE5X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzNAorI2RlZmluZSBHTF9SRUdfMjBfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTM1CisjZGVmaW5lIEdMX1JFR18yMV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzYKKyNkZWZpbmUgR0xfUkVHXzIyX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzNworI2RlZmluZSBHTF9SRUdfMjNfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTM4CisjZGVmaW5lIEdMX1JFR18yNF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzkKKyNkZWZpbmUgR0xfUkVHXzI1X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzQQorI2RlZmluZSBHTF9SRUdfMjZfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTNCCisjZGVmaW5lIEdMX1JFR18yN19BVEkgICAgICAgICAgICAgICAgICAgICAweDg5M0MKKyNkZWZpbmUgR0xfUkVHXzI4X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzRAorI2RlZmluZSBHTF9SRUdfMjlfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTNFCisjZGVmaW5lIEdMX1JFR18zMF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5M0YKKyNkZWZpbmUgR0xfUkVHXzMxX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk0MAorI2RlZmluZSBHTF9DT05fMF9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQxCisjZGVmaW5lIEdMX0NPTl8xX0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDIKKyNkZWZpbmUgR0xfQ09OXzJfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0MworI2RlZmluZSBHTF9DT05fM19BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQ0CisjZGVmaW5lIEdMX0NPTl80X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDUKKyNkZWZpbmUgR0xfQ09OXzVfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0NgorI2RlZmluZSBHTF9DT05fNl9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQ3CisjZGVmaW5lIEdMX0NPTl83X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDgKKyNkZWZpbmUgR0xfQ09OXzhfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0OQorI2RlZmluZSBHTF9DT05fOV9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTRBCisjZGVmaW5lIEdMX0NPTl8xMF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NEIKKyNkZWZpbmUgR0xfQ09OXzExX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk0QworI2RlZmluZSBHTF9DT05fMTJfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTRECisjZGVmaW5lIEdMX0NPTl8xM19BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NEUKKyNkZWZpbmUgR0xfQ09OXzE0X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk0RgorI2RlZmluZSBHTF9DT05fMTVfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTUwCisjZGVmaW5lIEdMX0NPTl8xNl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTEKKyNkZWZpbmUgR0xfQ09OXzE3X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1MgorI2RlZmluZSBHTF9DT05fMThfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTUzCisjZGVmaW5lIEdMX0NPTl8xOV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTQKKyNkZWZpbmUgR0xfQ09OXzIwX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1NQorI2RlZmluZSBHTF9DT05fMjFfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTU2CisjZGVmaW5lIEdMX0NPTl8yMl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTcKKyNkZWZpbmUgR0xfQ09OXzIzX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1OAorI2RlZmluZSBHTF9DT05fMjRfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTU5CisjZGVmaW5lIEdMX0NPTl8yNV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NUEKKyNkZWZpbmUgR0xfQ09OXzI2X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1QgorI2RlZmluZSBHTF9DT05fMjdfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTVDCisjZGVmaW5lIEdMX0NPTl8yOF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NUQKKyNkZWZpbmUgR0xfQ09OXzI5X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1RQorI2RlZmluZSBHTF9DT05fMzBfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTVGCisjZGVmaW5lIEdMX0NPTl8zMV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NjAKKyNkZWZpbmUgR0xfTU9WX0FUSSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2MQorI2RlZmluZSBHTF9BRERfQVRJICAgICAgICAgICAgICAgICAgICAgICAgMHg4OTYzCisjZGVmaW5lIEdMX01VTF9BVEkgICAgICAgICAgICAgICAgICAgICAgICAweDg5NjQKKyNkZWZpbmUgR0xfU1VCX0FUSSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2NQorI2RlZmluZSBHTF9ET1QzX0FUSSAgICAgICAgICAgICAgICAgICAgICAgMHg4OTY2CisjZGVmaW5lIEdMX0RPVDRfQVRJICAgICAgICAgICAgICAgICAgICAgICAweDg5NjcKKyNkZWZpbmUgR0xfTUFEX0FUSSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2OAorI2RlZmluZSBHTF9MRVJQX0FUSSAgICAgICAgICAgICAgICAgICAgICAgMHg4OTY5CisjZGVmaW5lIEdMX0NORF9BVEkgICAgICAgICAgICAgICAgICAgICAgICAweDg5NkEKKyNkZWZpbmUgR0xfQ05EMF9BVEkgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2QgorI2RlZmluZSBHTF9ET1QyX0FERF9BVEkgICAgICAgICAgICAgICAgICAgMHg4OTZDCisjZGVmaW5lIEdMX1NFQ09OREFSWV9JTlRFUlBPTEFUT1JfQVRJICAgICAweDg5NkQKKyNkZWZpbmUgR0xfTlVNX0ZSQUdNRU5UX1JFR0lTVEVSU19BVEkgICAgIDB4ODk2RQorI2RlZmluZSBHTF9OVU1fRlJBR01FTlRfQ09OU1RBTlRTX0FUSSAgICAgMHg4OTZGCisjZGVmaW5lIEdMX05VTV9QQVNTRVNfQVRJICAgICAgICAgICAgICAgICAweDg5NzAKKyNkZWZpbmUgR0xfTlVNX0lOU1RSVUNUSU9OU19QRVJfUEFTU19BVEkgIDB4ODk3MQorI2RlZmluZSBHTF9OVU1fSU5TVFJVQ1RJT05TX1RPVEFMX0FUSSAgICAgMHg4OTcyCisjZGVmaW5lIEdMX05VTV9JTlBVVF9JTlRFUlBPTEFUT1JfQ09NUE9ORU5UU19BVEkgMHg4OTczCisjZGVmaW5lIEdMX05VTV9MT09QQkFDS19DT01QT05FTlRTX0FUSSAgICAweDg5NzQKKyNkZWZpbmUgR0xfQ09MT1JfQUxQSEFfUEFJUklOR19BVEkgICAgICAgIDB4ODk3NQorI2RlZmluZSBHTF9TV0laWkxFX1NUUl9BVEkgICAgICAgICAgICAgICAgMHg4OTc2CisjZGVmaW5lIEdMX1NXSVpaTEVfU1RRX0FUSSAgICAgICAgICAgICAgICAweDg5NzcKKyNkZWZpbmUgR0xfU1dJWlpMRV9TVFJfRFJfQVRJICAgICAgICAgICAgIDB4ODk3OAorI2RlZmluZSBHTF9TV0laWkxFX1NUUV9EUV9BVEkgICAgICAgICAgICAgMHg4OTc5CisjZGVmaW5lIEdMX1NXSVpaTEVfU1RSUV9BVEkgICAgICAgICAgICAgICAweDg5N0EKKyNkZWZpbmUgR0xfU1dJWlpMRV9TVFJRX0RRX0FUSSAgICAgICAgICAgIDB4ODk3QgorI2RlZmluZSBHTF9SRURfQklUX0FUSSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTF9HUkVFTl9CSVRfQVRJICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF9CTFVFX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF8yWF9CSVRfQVRJICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTF80WF9CSVRfQVRJICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF84WF9CSVRfQVRJICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF9IQUxGX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBHTF9RVUFSVEVSX0JJVF9BVEkgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBHTF9FSUdIVEhfQklUX0FUSSAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBHTF9TQVRVUkFURV9CSVRfQVRJICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBHTF9DT01QX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF9ORUdBVEVfQklUX0FUSSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF9CSUFTX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3BuX3RyaWFuZ2xlcworI2RlZmluZSBHTF9QTl9UUklBTkdMRVNfQVRJICAgICAgICAgICAgICAgMHg4N0YwCisjZGVmaW5lIEdMX01BWF9QTl9UUklBTkdMRVNfVEVTU0VMQVRJT05fTEVWRUxfQVRJIDB4ODdGMQorI2RlZmluZSBHTF9QTl9UUklBTkdMRVNfUE9JTlRfTU9ERV9BVEkgICAgMHg4N0YyCisjZGVmaW5lIEdMX1BOX1RSSUFOR0xFU19OT1JNQUxfTU9ERV9BVEkgICAweDg3RjMKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX1RFU1NFTEFUSU9OX0xFVkVMX0FUSSAweDg3RjQKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX1BPSU5UX01PREVfTElORUFSX0FUSSAweDg3RjUKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX1BPSU5UX01PREVfQ1VCSUNfQVRJIDB4ODdGNgorI2RlZmluZSBHTF9QTl9UUklBTkdMRVNfTk9STUFMX01PREVfTElORUFSX0FUSSAweDg3RjcKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX05PUk1BTF9NT0RFX1FVQURSQVRJQ19BVEkgMHg4N0Y4CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdmVydGV4X2FycmF5X29iamVjdAorI2RlZmluZSBHTF9TVEFUSUNfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4NzYwCisjZGVmaW5lIEdMX0RZTkFNSUNfQVRJICAgICAgICAgICAgICAgICAgICAweDg3NjEKKyNkZWZpbmUgR0xfUFJFU0VSVkVfQVRJICAgICAgICAgICAgICAgICAgIDB4ODc2MgorI2RlZmluZSBHTF9ESVNDQVJEX0FUSSAgICAgICAgICAgICAgICAgICAgMHg4NzYzCisjZGVmaW5lIEdMX09CSkVDVF9CVUZGRVJfU0laRV9BVEkgICAgICAgICAweDg3NjQKKyNkZWZpbmUgR0xfT0JKRUNUX0JVRkZFUl9VU0FHRV9BVEkgICAgICAgIDB4ODc2NQorI2RlZmluZSBHTF9BUlJBWV9PQkpFQ1RfQlVGRkVSX0FUSSAgICAgICAgMHg4NzY2CisjZGVmaW5lIEdMX0FSUkFZX09CSkVDVF9PRkZTRVRfQVRJICAgICAgICAweDg3NjcKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfc2hhZGVyCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfRVhUICAgICAgICAgICAgICAweDg3ODAKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9CSU5ESU5HX0VYVCAgICAgIDB4ODc4MQorI2RlZmluZSBHTF9PUF9JTkRFWF9FWFQgICAgICAgICAgICAgICAgICAgMHg4NzgyCisjZGVmaW5lIEdMX09QX05FR0FURV9FWFQgICAgICAgICAgICAgICAgICAweDg3ODMKKyNkZWZpbmUgR0xfT1BfRE9UM19FWFQgICAgICAgICAgICAgICAgICAgIDB4ODc4NAorI2RlZmluZSBHTF9PUF9ET1Q0X0VYVCAgICAgICAgICAgICAgICAgICAgMHg4Nzg1CisjZGVmaW5lIEdMX09QX01VTF9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3ODYKKyNkZWZpbmUgR0xfT1BfQUREX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc4NworI2RlZmluZSBHTF9PUF9NQUREX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4Nzg4CisjZGVmaW5lIEdMX09QX0ZSQUNfRVhUICAgICAgICAgICAgICAgICAgICAweDg3ODkKKyNkZWZpbmUgR0xfT1BfTUFYX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc4QQorI2RlZmluZSBHTF9PUF9NSU5fRVhUICAgICAgICAgICAgICAgICAgICAgMHg4NzhCCisjZGVmaW5lIEdMX09QX1NFVF9HRV9FWFQgICAgICAgICAgICAgICAgICAweDg3OEMKKyNkZWZpbmUgR0xfT1BfU0VUX0xUX0VYVCAgICAgICAgICAgICAgICAgIDB4ODc4RAorI2RlZmluZSBHTF9PUF9DTEFNUF9FWFQgICAgICAgICAgICAgICAgICAgMHg4NzhFCisjZGVmaW5lIEdMX09QX0ZMT09SX0VYVCAgICAgICAgICAgICAgICAgICAweDg3OEYKKyNkZWZpbmUgR0xfT1BfUk9VTkRfRVhUICAgICAgICAgICAgICAgICAgIDB4ODc5MAorI2RlZmluZSBHTF9PUF9FWFBfQkFTRV8yX0VYVCAgICAgICAgICAgICAgMHg4NzkxCisjZGVmaW5lIEdMX09QX0xPR19CQVNFXzJfRVhUICAgICAgICAgICAgICAweDg3OTIKKyNkZWZpbmUgR0xfT1BfUE9XRVJfRVhUICAgICAgICAgICAgICAgICAgIDB4ODc5MworI2RlZmluZSBHTF9PUF9SRUNJUF9FWFQgICAgICAgICAgICAgICAgICAgMHg4Nzk0CisjZGVmaW5lIEdMX09QX1JFQ0lQX1NRUlRfRVhUICAgICAgICAgICAgICAweDg3OTUKKyNkZWZpbmUgR0xfT1BfU1VCX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc5NgorI2RlZmluZSBHTF9PUF9DUk9TU19QUk9EVUNUX0VYVCAgICAgICAgICAgMHg4Nzk3CisjZGVmaW5lIEdMX09QX01VTFRJUExZX01BVFJJWF9FWFQgICAgICAgICAweDg3OTgKKyNkZWZpbmUgR0xfT1BfTU9WX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc5OQorI2RlZmluZSBHTF9PVVRQVVRfVkVSVEVYX0VYVCAgICAgICAgICAgICAgMHg4NzlBCisjZGVmaW5lIEdMX09VVFBVVF9DT0xPUjBfRVhUICAgICAgICAgICAgICAweDg3OUIKKyNkZWZpbmUgR0xfT1VUUFVUX0NPTE9SMV9FWFQgICAgICAgICAgICAgIDB4ODc5QworI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDBfRVhUICAgICAgMHg4NzlECisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMV9FWFQgICAgICAweDg3OUUKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyX0VYVCAgICAgIDB4ODc5RgorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDNfRVhUICAgICAgMHg4N0EwCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JENF9FWFQgICAgICAweDg3QTEKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQ1X0VYVCAgICAgIDB4ODdBMgorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDZfRVhUICAgICAgMHg4N0EzCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEN19FWFQgICAgICAweDg3QTQKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQ4X0VYVCAgICAgIDB4ODdBNQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDlfRVhUICAgICAgMHg4N0E2CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTBfRVhUICAgICAweDg3QTcKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxMV9FWFQgICAgIDB4ODdBOAorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDEyX0VYVCAgICAgMHg4N0E5CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTNfRVhUICAgICAweDg3QUEKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxNF9FWFQgICAgIDB4ODdBQgorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDE1X0VYVCAgICAgMHg4N0FDCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTZfRVhUICAgICAweDg3QUQKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxN19FWFQgICAgIDB4ODdBRQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDE4X0VYVCAgICAgMHg4N0FGCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTlfRVhUICAgICAweDg3QjAKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyMF9FWFQgICAgIDB4ODdCMQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDIxX0VYVCAgICAgMHg4N0IyCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjJfRVhUICAgICAweDg3QjMKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyM19FWFQgICAgIDB4ODdCNAorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDI0X0VYVCAgICAgMHg4N0I1CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjVfRVhUICAgICAweDg3QjYKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyNl9FWFQgICAgIDB4ODdCNworI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDI3X0VYVCAgICAgMHg4N0I4CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjhfRVhUICAgICAweDg3QjkKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyOV9FWFQgICAgIDB4ODdCQQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDMwX0VYVCAgICAgMHg4N0JCCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMzFfRVhUICAgICAweDg3QkMKKyNkZWZpbmUgR0xfT1VUUFVUX0ZPR19FWFQgICAgICAgICAgICAgICAgIDB4ODdCRAorI2RlZmluZSBHTF9TQ0FMQVJfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4N0JFCisjZGVmaW5lIEdMX1ZFQ1RPUl9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3QkYKKyNkZWZpbmUgR0xfTUFUUklYX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODdDMAorI2RlZmluZSBHTF9WQVJJQU5UX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4N0MxCisjZGVmaW5lIEdMX0lOVkFSSUFOVF9FWFQgICAgICAgICAgICAgICAgICAweDg3QzIKKyNkZWZpbmUgR0xfTE9DQUxfQ09OU1RBTlRfRVhUICAgICAgICAgICAgIDB4ODdDMworI2RlZmluZSBHTF9MT0NBTF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4N0M0CisjZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX0lOU1RSVUNUSU9OU19FWFQgMHg4N0M1CisjZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX1ZBUklBTlRTX0VYVCAweDg3QzYKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9TSEFERVJfSU5WQVJJQU5UU19FWFQgMHg4N0M3CisjZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX0xPQ0FMX0NPTlNUQU5UU19FWFQgMHg4N0M4CisjZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX0xPQ0FMU19FWFQgICAweDg3QzkKKyNkZWZpbmUgR0xfTUFYX09QVElNSVpFRF9WRVJURVhfU0hBREVSX0lOU1RSVUNUSU9OU19FWFQgMHg4N0NBCisjZGVmaW5lIEdMX01BWF9PUFRJTUlaRURfVkVSVEVYX1NIQURFUl9WQVJJQU5UU19FWFQgMHg4N0NCCisjZGVmaW5lIEdMX01BWF9PUFRJTUlaRURfVkVSVEVYX1NIQURFUl9MT0NBTF9DT05TVEFOVFNfRVhUIDB4ODdDQworI2RlZmluZSBHTF9NQVhfT1BUSU1JWkVEX1ZFUlRFWF9TSEFERVJfSU5WQVJJQU5UU19FWFQgMHg4N0NECisjZGVmaW5lIEdMX01BWF9PUFRJTUlaRURfVkVSVEVYX1NIQURFUl9MT0NBTFNfRVhUIDB4ODdDRQorI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX0lOU1RSVUNUSU9OU19FWFQgMHg4N0NGCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfVkFSSUFOVFNfRVhUICAgICAweDg3RDAKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9JTlZBUklBTlRTX0VYVCAgIDB4ODdEMQorI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX0xPQ0FMX0NPTlNUQU5UU19FWFQgMHg4N0QyCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfTE9DQUxTX0VYVCAgICAgICAweDg3RDMKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9PUFRJTUlaRURfRVhUICAgIDB4ODdENAorI2RlZmluZSBHTF9YX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0Q1CisjZGVmaW5lIEdMX1lfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RDYKKyNkZWZpbmUgR0xfWl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODdENworI2RlZmluZSBHTF9XX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0Q4CisjZGVmaW5lIEdMX05FR0FUSVZFX1hfRVhUICAgICAgICAgICAgICAgICAweDg3RDkKKyNkZWZpbmUgR0xfTkVHQVRJVkVfWV9FWFQgICAgICAgICAgICAgICAgIDB4ODdEQQorI2RlZmluZSBHTF9ORUdBVElWRV9aX0VYVCAgICAgICAgICAgICAgICAgMHg4N0RCCisjZGVmaW5lIEdMX05FR0FUSVZFX1dfRVhUICAgICAgICAgICAgICAgICAweDg3REMKKyNkZWZpbmUgR0xfWkVST19FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODdERAorI2RlZmluZSBHTF9PTkVfRVhUICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0RFCisjZGVmaW5lIEdMX05FR0FUSVZFX09ORV9FWFQgICAgICAgICAgICAgICAweDg3REYKKyNkZWZpbmUgR0xfTk9STUFMSVpFRF9SQU5HRV9FWFQgICAgICAgICAgIDB4ODdFMAorI2RlZmluZSBHTF9GVUxMX1JBTkdFX0VYVCAgICAgICAgICAgICAgICAgMHg4N0UxCisjZGVmaW5lIEdMX0NVUlJFTlRfVkVSVEVYX0VYVCAgICAgICAgICAgICAweDg3RTIKKyNkZWZpbmUgR0xfTVZQX01BVFJJWF9FWFQgICAgICAgICAgICAgICAgIDB4ODdFMworI2RlZmluZSBHTF9WQVJJQU5UX1ZBTFVFX0VYVCAgICAgICAgICAgICAgMHg4N0U0CisjZGVmaW5lIEdMX1ZBUklBTlRfREFUQVRZUEVfRVhUICAgICAgICAgICAweDg3RTUKKyNkZWZpbmUgR0xfVkFSSUFOVF9BUlJBWV9TVFJJREVfRVhUICAgICAgIDB4ODdFNgorI2RlZmluZSBHTF9WQVJJQU5UX0FSUkFZX1RZUEVfRVhUICAgICAgICAgMHg4N0U3CisjZGVmaW5lIEdMX1ZBUklBTlRfQVJSQVlfRVhUICAgICAgICAgICAgICAweDg3RTgKKyNkZWZpbmUgR0xfVkFSSUFOVF9BUlJBWV9QT0lOVEVSX0VYVCAgICAgIDB4ODdFOQorI2RlZmluZSBHTF9JTlZBUklBTlRfVkFMVUVfRVhUICAgICAgICAgICAgMHg4N0VBCisjZGVmaW5lIEdMX0lOVkFSSUFOVF9EQVRBVFlQRV9FWFQgICAgICAgICAweDg3RUIKKyNkZWZpbmUgR0xfTE9DQUxfQ09OU1RBTlRfVkFMVUVfRVhUICAgICAgIDB4ODdFQworI2RlZmluZSBHTF9MT0NBTF9DT05TVEFOVF9EQVRBVFlQRV9FWFQgICAgMHg4N0VECisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdmVydGV4X3N0cmVhbXMKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9TVFJFQU1TX0FUSSAgICAgICAgIDB4ODc2QgorI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNMF9BVEkgICAgICAgICAgICAgMHg4NzZDCisjZGVmaW5lIEdMX1ZFUlRFWF9TVFJFQU0xX0FUSSAgICAgICAgICAgICAweDg3NkQKKyNkZWZpbmUgR0xfVkVSVEVYX1NUUkVBTTJfQVRJICAgICAgICAgICAgIDB4ODc2RQorI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNM19BVEkgICAgICAgICAgICAgMHg4NzZGCisjZGVmaW5lIEdMX1ZFUlRFWF9TVFJFQU00X0FUSSAgICAgICAgICAgICAweDg3NzAKKyNkZWZpbmUgR0xfVkVSVEVYX1NUUkVBTTVfQVRJICAgICAgICAgICAgIDB4ODc3MQorI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNNl9BVEkgICAgICAgICAgICAgMHg4NzcyCisjZGVmaW5lIEdMX1ZFUlRFWF9TVFJFQU03X0FUSSAgICAgICAgICAgICAweDg3NzMKKyNkZWZpbmUgR0xfVkVSVEVYX1NPVVJDRV9BVEkgICAgICAgICAgICAgIDB4ODc3NAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2VsZW1lbnRfYXJyYXkKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9BVEkgICAgICAgICAgICAgIDB4ODc2OAorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX1RZUEVfQVRJICAgICAgICAgMHg4NzY5CisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfUE9JTlRFUl9BVEkgICAgICAweDg3NkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl9tZXNoX2FycmF5CisjZGVmaW5lIEdMX1FVQURfTUVTSF9TVU4gICAgICAgICAgICAgICAgICAweDg2MTQKKyNkZWZpbmUgR0xfVFJJQU5HTEVfTUVTSF9TVU4gICAgICAgICAgICAgIDB4ODYxNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX3NsaWNlX2FjY3VtCisjZGVmaW5lIEdMX1NMSUNFX0FDQ1VNX1NVTiAgICAgICAgICAgICAgICAweDg1Q0MKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX211bHRpc2FtcGxlX2ZpbHRlcl9oaW50CisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0ZJTFRFUl9ISU5UX05WICAgICAweDg1MzQKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2RlcHRoX2NsYW1wCisjZGVmaW5lIEdMX0RFUFRIX0NMQU1QX05WICAgICAgICAgICAgICAgICAweDg2NEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX29jY2x1c2lvbl9xdWVyeQorI2RlZmluZSBHTF9QSVhFTF9DT1VOVEVSX0JJVFNfTlYgICAgICAgICAgMHg4ODY0CisjZGVmaW5lIEdMX0NVUlJFTlRfT0NDTFVTSU9OX1FVRVJZX0lEX05WICAweDg4NjUKKyNkZWZpbmUgR0xfUElYRUxfQ09VTlRfTlYgICAgICAgICAgICAgICAgIDB4ODg2NgorI2RlZmluZSBHTF9QSVhFTF9DT1VOVF9BVkFJTEFCTEVfTlYgICAgICAgMHg4ODY3CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wb2ludF9zcHJpdGUKKyNkZWZpbmUgR0xfUE9JTlRfU1BSSVRFX05WICAgICAgICAgICAgICAgIDB4ODg2MQorI2RlZmluZSBHTF9DT09SRF9SRVBMQUNFX05WICAgICAgICAgICAgICAgMHg4ODYyCisjZGVmaW5lIEdMX1BPSU5UX1NQUklURV9SX01PREVfTlYgICAgICAgICAweDg4NjMKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfc2hhZGVyMworI2RlZmluZSBHTF9PRkZTRVRfUFJPSkVDVElWRV9URVhUVVJFXzJEX05WIDB4ODg1MAorI2RlZmluZSBHTF9PRkZTRVRfUFJPSkVDVElWRV9URVhUVVJFXzJEX1NDQUxFX05WIDB4ODg1MQorI2RlZmluZSBHTF9PRkZTRVRfUFJPSkVDVElWRV9URVhUVVJFX1JFQ1RBTkdMRV9OViAweDg4NTIKKyNkZWZpbmUgR0xfT0ZGU0VUX1BST0pFQ1RJVkVfVEVYVFVSRV9SRUNUQU5HTEVfU0NBTEVfTlYgMHg4ODUzCisjZGVmaW5lIEdMX09GRlNFVF9ISUxPX1RFWFRVUkVfMkRfTlYgICAgICAweDg4NTQKKyNkZWZpbmUgR0xfT0ZGU0VUX0hJTE9fVEVYVFVSRV9SRUNUQU5HTEVfTlYgMHg4ODU1CisjZGVmaW5lIEdMX09GRlNFVF9ISUxPX1BST0pFQ1RJVkVfVEVYVFVSRV8yRF9OViAweDg4NTYKKyNkZWZpbmUgR0xfT0ZGU0VUX0hJTE9fUFJPSkVDVElWRV9URVhUVVJFX1JFQ1RBTkdMRV9OViAweDg4NTcKKyNkZWZpbmUgR0xfREVQRU5ERU5UX0hJTE9fVEVYVFVSRV8yRF9OViAgIDB4ODg1OAorI2RlZmluZSBHTF9ERVBFTkRFTlRfUkdCX1RFWFRVUkVfM0RfTlYgICAgMHg4ODU5CisjZGVmaW5lIEdMX0RFUEVOREVOVF9SR0JfVEVYVFVSRV9DVUJFX01BUF9OViAweDg4NUEKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfUEFTU19USFJPVUdIX05WICAgIDB4ODg1QgorI2RlZmluZSBHTF9ET1RfUFJPRFVDVF9URVhUVVJFXzFEX05WICAgICAgMHg4ODVDCisjZGVmaW5lIEdMX0RPVF9QUk9EVUNUX0FGRklORV9ERVBUSF9SRVBMQUNFX05WIDB4ODg1RAorI2RlZmluZSBHTF9ISUxPOF9OViAgICAgICAgICAgICAgICAgICAgICAgMHg4ODVFCisjZGVmaW5lIEdMX1NJR05FRF9ISUxPOF9OViAgICAgICAgICAgICAgICAweDg4NUYKKyNkZWZpbmUgR0xfRk9SQ0VfQkxVRV9UT19PTkVfTlYgICAgICAgICAgIDB4ODg2MAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0xXzEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zaGFkb3dfZnVuY3MKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zdGVuY2lsX3R3b19zaWRlCisjZGVmaW5lIEdMX1NURU5DSUxfVEVTVF9UV09fU0lERV9FWFQgICAgICAweDg5MTAKKyNkZWZpbmUgR0xfQUNUSVZFX1NURU5DSUxfRkFDRV9FWFQgICAgICAgIDB4ODkxMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHRfZnJhZ21lbnRfc2hhZGVyCisjZGVmaW5lIEdMX1RFWFRfRlJBR01FTlRfU0hBREVSX0FUSSAgICAgICAweDgyMDAKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2NsaWVudF9zdG9yYWdlCisjZGVmaW5lIEdMX1VOUEFDS19DTElFTlRfU1RPUkFHRV9BUFBMRSAgICAweDg1QjIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2VsZW1lbnRfYXJyYXkKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9BUFBMRSAgICAgICAgICAgIDB4OEEwQworI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX1RZUEVfQVBQTEUgICAgICAgMHg4QTBECisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfUE9JTlRFUl9BUFBMRSAgICAweDhBMEUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2ZlbmNlCisjZGVmaW5lIEdMX0RSQVdfUElYRUxTX0FQUExFICAgICAgICAgICAgICAweDhBMEEKKyNkZWZpbmUgR0xfRkVOQ0VfQVBQTEUgICAgICAgICAgICAgICAgICAgIDB4OEEwQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfdmVydGV4X2FycmF5X29iamVjdAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfQklORElOR19BUFBMRSAgICAgMHg4NUI1CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV92ZXJ0ZXhfYXJyYXlfcmFuZ2UKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX0FQUExFICAgICAgIDB4ODUxRAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfTEVOR1RIX0FQUExFIDB4ODUxRQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfU1RPUkFHRV9ISU5UX0FQUExFIDB4ODUxRgorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfUE9JTlRFUl9BUFBMRSAweDg1MjEKKyNkZWZpbmUgR0xfU1RPUkFHRV9DTElFTlRfQVBQTEUgICAgICAgICAgIDB4ODVCNAorI2RlZmluZSBHTF9TVE9SQUdFX0NBQ0hFRF9BUFBMRSAgICAgICAgICAgMHg4NUJFCisjZGVmaW5lIEdMX1NUT1JBR0VfU0hBUkVEX0FQUExFICAgICAgICAgICAweDg1QkYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3ljYmNyXzQyMgorI2RlZmluZSBHTF9ZQ0JDUl80MjJfQVBQTEUgICAgICAgICAgICAgICAgMHg4NUI5CisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9BUFBMRSAgICAgICAweDg1QkEKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfOF84X1JFVl9BUFBMRSAgIDB4ODVCQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfUzNfczN0YworI2RlZmluZSBHTF9SR0JfUzNUQyAgICAgICAgICAgICAgICAgICAgICAgMHg4M0EwCisjZGVmaW5lIEdMX1JHQjRfUzNUQyAgICAgICAgICAgICAgICAgICAgICAweDgzQTEKKyNkZWZpbmUgR0xfUkdCQV9TM1RDICAgICAgICAgICAgICAgICAgICAgIDB4ODNBMgorI2RlZmluZSBHTF9SR0JBNF9TM1RDICAgICAgICAgICAgICAgICAgICAgMHg4M0EzCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfZHJhd19idWZmZXJzCisjZGVmaW5lIEdMX01BWF9EUkFXX0JVRkZFUlNfQVRJICAgICAgICAgICAweDg4MjQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIwX0FUSSAgICAgICAgICAgICAgIDB4ODgyNQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjFfQVRJICAgICAgICAgICAgICAgMHg4ODI2CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMl9BVEkgICAgICAgICAgICAgICAweDg4MjcKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIzX0FUSSAgICAgICAgICAgICAgIDB4ODgyOAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjRfQVRJICAgICAgICAgICAgICAgMHg4ODI5CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNV9BVEkgICAgICAgICAgICAgICAweDg4MkEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI2X0FUSSAgICAgICAgICAgICAgIDB4ODgyQgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjdfQVRJICAgICAgICAgICAgICAgMHg4ODJDCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSOF9BVEkgICAgICAgICAgICAgICAweDg4MkQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI5X0FUSSAgICAgICAgICAgICAgIDB4ODgyRQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEwX0FUSSAgICAgICAgICAgICAgMHg4ODJGCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTFfQVRJICAgICAgICAgICAgICAweDg4MzAKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMl9BVEkgICAgICAgICAgICAgIDB4ODgzMQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEzX0FUSSAgICAgICAgICAgICAgMHg4ODMyCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTRfQVRJICAgICAgICAgICAgICAweDg4MzMKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxNV9BVEkgICAgICAgICAgICAgIDB4ODgzNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3BpeGVsX2Zvcm1hdF9mbG9hdAorI2RlZmluZSBHTF9UWVBFX1JHQkFfRkxPQVRfQVRJICAgICAgICAgICAgMHg4ODIwCisjZGVmaW5lIEdMX0NPTE9SX0NMRUFSX1VOQ0xBTVBFRF9WQUxVRV9BVEkgMHg4ODM1CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdGV4dHVyZV9lbnZfY29tYmluZTMKKyNkZWZpbmUgR0xfTU9EVUxBVEVfQUREX0FUSSAgICAgICAgICAgICAgIDB4ODc0NAorI2RlZmluZSBHTF9NT0RVTEFURV9TSUdORURfQUREX0FUSSAgICAgICAgMHg4NzQ1CisjZGVmaW5lIEdMX01PRFVMQVRFX1NVQlRSQUNUX0FUSSAgICAgICAgICAweDg3NDYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV90ZXh0dXJlX2Zsb2F0CisjZGVmaW5lIEdMX1JHQkFfRkxPQVQzMl9BVEkgICAgICAgICAgICAgICAweDg4MTQKKyNkZWZpbmUgR0xfUkdCX0ZMT0FUMzJfQVRJICAgICAgICAgICAgICAgIDB4ODgxNQorI2RlZmluZSBHTF9BTFBIQV9GTE9BVDMyX0FUSSAgICAgICAgICAgICAgMHg4ODE2CisjZGVmaW5lIEdMX0lOVEVOU0lUWV9GTE9BVDMyX0FUSSAgICAgICAgICAweDg4MTcKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0ZMT0FUMzJfQVRJICAgICAgICAgIDB4ODgxOAorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEFfRkxPQVQzMl9BVEkgICAgMHg4ODE5CisjZGVmaW5lIEdMX1JHQkFfRkxPQVQxNl9BVEkgICAgICAgICAgICAgICAweDg4MUEKKyNkZWZpbmUgR0xfUkdCX0ZMT0FUMTZfQVRJICAgICAgICAgICAgICAgIDB4ODgxQgorI2RlZmluZSBHTF9BTFBIQV9GTE9BVDE2X0FUSSAgICAgICAgICAgICAgMHg4ODFDCisjZGVmaW5lIEdMX0lOVEVOU0lUWV9GTE9BVDE2X0FUSSAgICAgICAgICAweDg4MUQKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0ZMT0FUMTZfQVRJICAgICAgICAgIDB4ODgxRQorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEFfRkxPQVQxNl9BVEkgICAgMHg4ODFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mbG9hdF9idWZmZXIKKyNkZWZpbmUgR0xfRkxPQVRfUl9OViAgICAgICAgICAgICAgICAgICAgIDB4ODg4MAorI2RlZmluZSBHTF9GTE9BVF9SR19OViAgICAgICAgICAgICAgICAgICAgMHg4ODgxCisjZGVmaW5lIEdMX0ZMT0FUX1JHQl9OViAgICAgICAgICAgICAgICAgICAweDg4ODIKKyNkZWZpbmUgR0xfRkxPQVRfUkdCQV9OViAgICAgICAgICAgICAgICAgIDB4ODg4MworI2RlZmluZSBHTF9GTE9BVF9SMTZfTlYgICAgICAgICAgICAgICAgICAgMHg4ODg0CisjZGVmaW5lIEdMX0ZMT0FUX1IzMl9OViAgICAgICAgICAgICAgICAgICAweDg4ODUKKyNkZWZpbmUgR0xfRkxPQVRfUkcxNl9OViAgICAgICAgICAgICAgICAgIDB4ODg4NgorI2RlZmluZSBHTF9GTE9BVF9SRzMyX05WICAgICAgICAgICAgICAgICAgMHg4ODg3CisjZGVmaW5lIEdMX0ZMT0FUX1JHQjE2X05WICAgICAgICAgICAgICAgICAweDg4ODgKKyNkZWZpbmUgR0xfRkxPQVRfUkdCMzJfTlYgICAgICAgICAgICAgICAgIDB4ODg4OQorI2RlZmluZSBHTF9GTE9BVF9SR0JBMTZfTlYgICAgICAgICAgICAgICAgMHg4ODhBCisjZGVmaW5lIEdMX0ZMT0FUX1JHQkEzMl9OViAgICAgICAgICAgICAgICAweDg4OEIKKyNkZWZpbmUgR0xfVEVYVFVSRV9GTE9BVF9DT01QT05FTlRTX05WICAgIDB4ODg4QworI2RlZmluZSBHTF9GTE9BVF9DTEVBUl9DT0xPUl9WQUxVRV9OViAgICAgMHg4ODhECisjZGVmaW5lIEdMX0ZMT0FUX1JHQkFfTU9ERV9OViAgICAgICAgICAgICAweDg4OEUKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZyYWdtZW50X3Byb2dyYW0KKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX1BST0dSQU1fTE9DQUxfUEFSQU1FVEVSU19OViAweDg4NjgKKyNkZWZpbmUgR0xfRlJBR01FTlRfUFJPR1JBTV9OViAgICAgICAgICAgIDB4ODg3MAorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9DT09SRFNfTlYgICAgICAgICAgMHg4ODcxCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTX05WICAgICAweDg4NzIKKyNkZWZpbmUgR0xfRlJBR01FTlRfUFJPR1JBTV9CSU5ESU5HX05WICAgIDB4ODg3MworI2RlZmluZSBHTF9QUk9HUkFNX0VSUk9SX1NUUklOR19OViAgICAgICAgMHg4ODc0CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9oYWxmX2Zsb2F0CisjZGVmaW5lIEdMX0hBTEZfRkxPQVRfTlYgICAgICAgICAgICAgICAgICAweDE0MEIKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3BpeGVsX2RhdGFfcmFuZ2UKKyNkZWZpbmUgR0xfV1JJVEVfUElYRUxfREFUQV9SQU5HRV9OViAgICAgIDB4ODg3OAorI2RlZmluZSBHTF9SRUFEX1BJWEVMX0RBVEFfUkFOR0VfTlYgICAgICAgMHg4ODc5CisjZGVmaW5lIEdMX1dSSVRFX1BJWEVMX0RBVEFfUkFOR0VfTEVOR1RIX05WIDB4ODg3QQorI2RlZmluZSBHTF9SRUFEX1BJWEVMX0RBVEFfUkFOR0VfTEVOR1RIX05WIDB4ODg3QgorI2RlZmluZSBHTF9XUklURV9QSVhFTF9EQVRBX1JBTkdFX1BPSU5URVJfTlYgMHg4ODdDCisjZGVmaW5lIEdMX1JFQURfUElYRUxfREFUQV9SQU5HRV9QT0lOVEVSX05WIDB4ODg3RAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcHJpbWl0aXZlX3Jlc3RhcnQKKyNkZWZpbmUgR0xfUFJJTUlUSVZFX1JFU1RBUlRfTlYgICAgICAgICAgIDB4ODU1OAorI2RlZmluZSBHTF9QUklNSVRJVkVfUkVTVEFSVF9JTkRFWF9OViAgICAgMHg4NTU5CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX2V4cGFuZF9ub3JtYWwKKyNkZWZpbmUgR0xfVEVYVFVSRV9VTlNJR05FRF9SRU1BUF9NT0RFX05WIDB4ODg4RgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0yCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfbWFwX29iamVjdF9idWZmZXIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9zZXBhcmF0ZV9zdGVuY2lsCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19GVU5DX0FUSSAgICAgICAgICAweDg4MDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX0ZBSUxfQVRJICAgICAgICAgIDB4ODgwMQorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMX0FUSSAweDg4MDIKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTU19BVEkgMHg4ODAzCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdmVydGV4X2F0dHJpYl9hcnJheV9vYmplY3QKKyNlbmRpZgorCisjaWZuZGVmIEdMX09FU19yZWFkX2Zvcm1hdAorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTIDB4OEI5QQorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMgMHg4QjlCCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZGVwdGhfYm91bmRzX3Rlc3QKKyNkZWZpbmUgR0xfREVQVEhfQk9VTkRTX1RFU1RfRVhUICAgICAgICAgIDB4ODg5MAorI2RlZmluZSBHTF9ERVBUSF9CT1VORFNfRVhUICAgICAgICAgICAgICAgMHg4ODkxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9taXJyb3JfY2xhbXAKKyNkZWZpbmUgR0xfTUlSUk9SX0NMQU1QX0VYVCAgICAgICAgICAgICAgIDB4ODc0MgorI2RlZmluZSBHTF9NSVJST1JfQ0xBTVBfVE9fRURHRV9FWFQgICAgICAgMHg4NzQzCisjZGVmaW5lIEdMX01JUlJPUl9DTEFNUF9UT19CT1JERVJfRVhUICAgICAweDg5MTIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZQorI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9SR0JfRVhUICAgICAgICAgMHg4MDA5CisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBX0VYVCAgICAgICAweDg4M0QKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0FfcGFja19pbnZlcnQKKyNkZWZpbmUgR0xfUEFDS19JTlZFUlRfTUVTQSAgICAgICAgICAgICAgIDB4ODc1OAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV95Y2Jjcl90ZXh0dXJlCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9NRVNBICAgICAgICAweDg1QkEKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfOF84X1JFVl9NRVNBICAgIDB4ODVCQgorI2RlZmluZSBHTF9ZQ0JDUl9NRVNBICAgICAgICAgICAgICAgICAgICAgMHg4NzU3CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGl4ZWxfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9QSVhFTF9QQUNLX0JVRkZFUl9FWFQgICAgICAgICAgMHg4OEVCCisjZGVmaW5lIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfRVhUICAgICAgICAweDg4RUMKKyNkZWZpbmUgR0xfUElYRUxfUEFDS19CVUZGRVJfQklORElOR19FWFQgIDB4ODhFRAorI2RlZmluZSBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkdfRVhUIDB4ODhFRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbV9vcHRpb24KKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZyYWdtZW50X3Byb2dyYW0yCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0VYRUNfSU5TVFJVQ1RJT05TX05WIDB4ODhGNAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9DQUxMX0RFUFRIX05WICAgICAgMHg4OEY1CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0lGX0RFUFRIX05WICAgICAgICAweDg4RjYKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTE9PUF9ERVBUSF9OViAgICAgIDB4ODhGNworI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9MT09QX0NPVU5UX05WICAgICAgMHg4OEY4CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTJfb3B0aW9uCisvKiByZXVzZSBHTF9NQVhfUFJPR1JBTV9FWEVDX0lOU1RSVUNUSU9OU19OViAqLworLyogcmV1c2UgR0xfTUFYX1BST0dSQU1fQ0FMTF9ERVBUSF9OViAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0zCisvKiByZXVzZSBHTF9NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OX0VYVCAweDA1MDYKKyNkZWZpbmUgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFX0VYVCAgICAgIDB4ODRFOAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCAgICAgICAgMHg4Q0E2CisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HX0VYVCAgICAgICAweDhDQTcKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRV9FWFQgMHg4Q0QwCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUVfRVhUIDB4OENEMQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxfRVhUIDB4OENEMgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV9FWFQgMHg4Q0QzCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV8zRF9aT0ZGU0VUX0VYVCAweDhDRDQKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfRVhUICAgICAgIDB4OENENQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRfRVhUIDB4OENENgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVF9FWFQgMHg4Q0Q3CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OU19FWFQgMHg4Q0Q5CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRk9STUFUU19FWFQgMHg4Q0RBCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVJfRVhUIDB4OENEQgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX1JFQURfQlVGRkVSX0VYVCAweDhDREMKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURURfRVhUICAgIDB4OENERAorI2RlZmluZSBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfRVhUICAgICAgMHg4Q0RGCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQwX0VYVCAgICAgICAgICAweDhDRTAKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDFfRVhUICAgICAgICAgIDB4OENFMQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMl9FWFQgICAgICAgICAgMHg4Q0UyCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQzX0VYVCAgICAgICAgICAweDhDRTMKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDRfRVhUICAgICAgICAgIDB4OENFNAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNV9FWFQgICAgICAgICAgMHg4Q0U1CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ2X0VYVCAgICAgICAgICAweDhDRTYKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDdfRVhUICAgICAgICAgIDB4OENFNworI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UOF9FWFQgICAgICAgICAgMHg4Q0U4CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ5X0VYVCAgICAgICAgICAweDhDRTkKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEwX0VYVCAgICAgICAgIDB4OENFQQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTFfRVhUICAgICAgICAgMHg4Q0VCCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMl9FWFQgICAgICAgICAweDhDRUMKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEzX0VYVCAgICAgICAgIDB4OENFRAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTRfRVhUICAgICAgICAgMHg4Q0VFCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxNV9FWFQgICAgICAgICAweDhDRUYKKyNkZWZpbmUgR0xfREVQVEhfQVRUQUNITUVOVF9FWFQgICAgICAgICAgIDB4OEQwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfRVhUICAgICAgICAgMHg4RDIwCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0VYVCAgICAgICAgICAgICAgICAweDhENDAKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0VYVCAgICAgICAgICAgICAgIDB4OEQ0MQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfV0lEVEhfRVhUICAgICAgICAgMHg4RDQyCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9IRUlHSFRfRVhUICAgICAgICAweDhENDMKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVF9FWFQgMHg4RDQ0CisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVgxX0VYVCAgICAgICAgICAgICAweDhENDYKKyNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDRfRVhUICAgICAgICAgICAgIDB4OEQ0NworI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYOF9FWFQgICAgICAgICAgICAgMHg4RDQ4CisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVgxNl9FWFQgICAgICAgICAgICAweDhENDkKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFX0VYVCAgICAgIDB4OEQ1MAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRV9FWFQgICAgMHg4RDUxCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9CTFVFX1NJWkVfRVhUICAgICAweDhENTIKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkVfRVhUICAgIDB4OEQ1MworI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9FWFQgICAgMHg4RDU0CisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkVfRVhUICAweDhENTUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0dSRU1FRFlfc3RyaW5nX21hcmtlcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BhY2tlZF9kZXB0aF9zdGVuY2lsCisjZGVmaW5lIEdMX0RFUFRIX1NURU5DSUxfRVhUICAgICAgICAgICAgICAweDg0RjkKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzI0XzhfRVhUICAgICAgICAgIDB4ODRGQQorI2RlZmluZSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVCAgICAgICAgICAgMHg4OEYwCisjZGVmaW5lIEdMX1RFWFRVUkVfU1RFTkNJTF9TSVpFX0VYVCAgICAgICAweDg4RjEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zdGVuY2lsX2NsZWFyX3RhZworI2RlZmluZSBHTF9TVEVOQ0lMX1RBR19CSVRTX0VYVCAgICAgICAgICAgMHg4OEYyCisjZGVmaW5lIEdMX1NURU5DSUxfQ0xFQVJfVEFHX1ZBTFVFX0VYVCAgICAweDg4RjMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3NSR0IKKyNkZWZpbmUgR0xfU1JHQl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4OEM0MAorI2RlZmluZSBHTF9TUkdCOF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4QzQxCisjZGVmaW5lIEdMX1NSR0JfQUxQSEFfRVhUICAgICAgICAgICAgICAgICAweDhDNDIKKyNkZWZpbmUgR0xfU1JHQjhfQUxQSEE4X0VYVCAgICAgICAgICAgICAgIDB4OEM0MworI2RlZmluZSBHTF9TTFVNSU5BTkNFX0FMUEhBX0VYVCAgICAgICAgICAgMHg4QzQ0CisjZGVmaW5lIEdMX1NMVU1JTkFOQ0U4X0FMUEhBOF9FWFQgICAgICAgICAweDhDNDUKKyNkZWZpbmUgR0xfU0xVTUlOQU5DRV9FWFQgICAgICAgICAgICAgICAgIDB4OEM0NgorI2RlZmluZSBHTF9TTFVNSU5BTkNFOF9FWFQgICAgICAgICAgICAgICAgMHg4QzQ3CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9FWFQgICAgICAgICAgICAweDhDNDgKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBX0VYVCAgICAgIDB4OEM0OQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NMVU1JTkFOQ0VfRVhUICAgICAgMHg4QzRBCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU0xVTUlOQU5DRV9BTFBIQV9FWFQgMHg4QzRCCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9TM1RDX0RYVDFfRVhUICAweDhDNEMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUMV9FWFQgMHg4QzRECisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDNfRVhUIDB4OEM0RQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQ1X0VYVCAweDhDNEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9mcmFtZWJ1ZmZlcl9ibGl0CisjZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfRVhUICAgICAgICAgICAweDhDQTgKKyNkZWZpbmUgR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQgICAgICAgICAgIDB4OENBOQorI2RlZmluZSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkdfRVhUICAgR0xfRlJBTUVCVUZGRVJfQklORElOR19FWFQKKyNkZWZpbmUgR0xfUkVBRF9GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCAgIDB4OENBQQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTX0VYVCAgICAgICAweDhDQUIKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRV9FWFQgMHg4RDU2CisjZGVmaW5lIEdMX01BWF9TQU1QTEVTX0VYVCAgICAgICAgICAgICAgICAweDhENTcKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0FYX3RleHR1cmVfc3RhY2sKKyNkZWZpbmUgR0xfVEVYVFVSRV8xRF9TVEFDS19NRVNBWCAgICAgICAgIDB4ODc1OQorI2RlZmluZSBHTF9URVhUVVJFXzJEX1NUQUNLX01FU0FYICAgICAgICAgMHg4NzVBCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfMURfU1RBQ0tfTUVTQVggICAweDg3NUIKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8yRF9TVEFDS19NRVNBWCAgIDB4ODc1QworI2RlZmluZSBHTF9URVhUVVJFXzFEX1NUQUNLX0JJTkRJTkdfTUVTQVggMHg4NzVECisjZGVmaW5lIEdMX1RFWFRVUkVfMkRfU1RBQ0tfQklORElOR19NRVNBWCAweDg3NUUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90aW1lcl9xdWVyeQorI2RlZmluZSBHTF9USU1FX0VMQVBTRURfRVhUICAgICAgICAgICAgICAgMHg4OEJGCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZ3B1X3Byb2dyYW1fcGFyYW1ldGVycworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfZmx1c2hfYnVmZmVyX3JhbmdlCisjZGVmaW5lIEdMX0JVRkZFUl9TRVJJQUxJWkVEX01PRElGWV9BUFBMRSAweDhBMTIKKyNkZWZpbmUgR0xfQlVGRkVSX0ZMVVNISU5HX1VOTUFQX0FQUExFICAgIDB4OEExMworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZ3B1X3Byb2dyYW00CisjZGVmaW5lIEdMX01JTl9QUk9HUkFNX1RFWEVMX09GRlNFVF9OViAgICAweDg5MDQKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fVEVYRUxfT0ZGU0VUX05WICAgIDB4ODkwNQorI2RlZmluZSBHTF9QUk9HUkFNX0FUVFJJQl9DT01QT05FTlRTX05WICAgMHg4OTA2CisjZGVmaW5lIEdMX1BST0dSQU1fUkVTVUxUX0NPTVBPTkVOVFNfTlYgICAweDg5MDcKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fQVRUUklCX0NPTVBPTkVOVFNfTlYgMHg4OTA4CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1JFU1VMVF9DT01QT05FTlRTX05WIDB4ODkwOQorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9HRU5FUklDX0FUVFJJQlNfTlYgMHg4REE1CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0dFTkVSSUNfUkVTVUxUU19OViAweDhEQTYKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2dlb21ldHJ5X3Byb2dyYW00CisjZGVmaW5lIEdMX0xJTkVTX0FESkFDRU5DWV9FWFQgICAgICAgICAgICAweDAwMEEKKyNkZWZpbmUgR0xfTElORV9TVFJJUF9BREpBQ0VOQ1lfRVhUICAgICAgIDB4MDAwQgorI2RlZmluZSBHTF9UUklBTkdMRVNfQURKQUNFTkNZX0VYVCAgICAgICAgMHgwMDBDCisjZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQX0FESkFDRU5DWV9FWFQgICAweDAwMEQKKyNkZWZpbmUgR0xfR0VPTUVUUllfUFJPR1JBTV9OViAgICAgICAgICAgIDB4OEMyNgorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9PVVRQVVRfVkVSVElDRVNfTlYgMHg4QzI3CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1RPVEFMX09VVFBVVF9DT01QT05FTlRTX05WIDB4OEMyOAorI2RlZmluZSBHTF9HRU9NRVRSWV9WRVJUSUNFU19PVVRfRVhUICAgICAgMHg4RERBCisjZGVmaW5lIEdMX0dFT01FVFJZX0lOUFVUX1RZUEVfRVhUICAgICAgICAweDhEREIKKyNkZWZpbmUgR0xfR0VPTUVUUllfT1VUUFVUX1RZUEVfRVhUICAgICAgIDB4OEREQworI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfVEVYVFVSRV9JTUFHRV9VTklUU19FWFQgMHg4QzI5CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfTEFZRVJFRF9FWFQgMHg4REE3CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTEFZRVJfVEFSR0VUU19FWFQgMHg4REE4CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTEFZRVJfQ09VTlRfRVhUIDB4OERBOQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVJfRVhUIDB4OENENAorI2RlZmluZSBHTF9QUk9HUkFNX1BPSU5UX1NJWkVfRVhUICAgICAgICAgMHg4NjQyCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZ2VvbWV0cnlfc2hhZGVyNAorI2RlZmluZSBHTF9HRU9NRVRSWV9TSEFERVJfRVhUICAgICAgICAgICAgMHg4REQ5CisvKiByZXVzZSBHTF9HRU9NRVRSWV9WRVJUSUNFU19PVVRfRVhUICovCisvKiByZXVzZSBHTF9HRU9NRVRSWV9JTlBVVF9UWVBFX0VYVCAqLworLyogcmV1c2UgR0xfR0VPTUVUUllfT1VUUFVUX1RZUEVfRVhUICovCisvKiByZXVzZSBHTF9NQVhfR0VPTUVUUllfVEVYVFVSRV9JTUFHRV9VTklUU19FWFQgKi8KKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1ZBUllJTkdfQ09NUE9ORU5UU19FWFQgMHg4RERECisjZGVmaW5lIEdMX01BWF9WRVJURVhfVkFSWUlOR19DT01QT05FTlRTX0VYVCAweDhEREUKKyNkZWZpbmUgR0xfTUFYX1ZBUllJTkdfQ09NUE9ORU5UU19FWFQgICAgIDB4OEI0QgorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfVU5JRk9STV9DT01QT05FTlRTX0VYVCAweDhEREYKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX09VVFBVVF9WRVJUSUNFU19FWFQgMHg4REUwCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9UT1RBTF9PVVRQVVRfQ09NUE9ORU5UU19FWFQgMHg4REUxCisvKiByZXVzZSBHTF9MSU5FU19BREpBQ0VOQ1lfRVhUICovCisvKiByZXVzZSBHTF9MSU5FX1NUUklQX0FESkFDRU5DWV9FWFQgKi8KKy8qIHJldXNlIEdMX1RSSUFOR0xFU19BREpBQ0VOQ1lfRVhUICovCisvKiByZXVzZSBHTF9UUklBTkdMRV9TVFJJUF9BREpBQ0VOQ1lfRVhUICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0xBWUVSX1RBUkdFVFNfRVhUICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0xBWUVSX0NPVU5UX0VYVCAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9MQVlFUkVEX0VYVCAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSX0VYVCAqLworLyogcmV1c2UgR0xfUFJPR1JBTV9QT0lOVF9TSVpFX0VYVCAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW00CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfSU5URUdFUl9OViAweDg4RkQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9ncHVfc2hhZGVyNAorI2RlZmluZSBHTF9TQU1QTEVSXzFEX0FSUkFZX0VYVCAgICAgICAgICAgMHg4REMwCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfQVJSQVlfRVhUICAgICAgICAgICAweDhEQzEKKyNkZWZpbmUgR0xfU0FNUExFUl9CVUZGRVJfRVhUICAgICAgICAgICAgIDB4OERDMgorI2RlZmluZSBHTF9TQU1QTEVSXzFEX0FSUkFZX1NIQURPV19FWFQgICAgMHg4REMzCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfQVJSQVlfU0hBRE9XX0VYVCAgICAweDhEQzQKKyNkZWZpbmUgR0xfU0FNUExFUl9DVUJFX1NIQURPV19FWFQgICAgICAgIDB4OERDNQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfVkVDMl9FWFQgICAgICAgICAgMHg4REM2CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9WRUMzX0VYVCAgICAgICAgICAweDhEQzcKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1ZFQzRfRVhUICAgICAgICAgIDB4OERDOAorI2RlZmluZSBHTF9JTlRfU0FNUExFUl8xRF9FWFQgICAgICAgICAgICAgMHg4REM5CisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSXzJEX0VYVCAgICAgICAgICAgICAweDhEQ0EKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfM0RfRVhUICAgICAgICAgICAgIDB4OERDQgorI2RlZmluZSBHTF9JTlRfU0FNUExFUl9DVUJFX0VYVCAgICAgICAgICAgMHg4RENDCisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSXzJEX1JFQ1RfRVhUICAgICAgICAweDhEQ0QKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfMURfQVJSQVlfRVhUICAgICAgIDB4OERDRQorI2RlZmluZSBHTF9JTlRfU0FNUExFUl8yRF9BUlJBWV9FWFQgICAgICAgMHg4RENGCisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSX0JVRkZFUl9FWFQgICAgICAgICAweDhERDAKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMURfRVhUICAgIDB4OEREMQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9FWFQgICAgMHg4REQyCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzNEX0VYVCAgICAweDhERDMKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfQ1VCRV9FWFQgIDB4OERENAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9SRUNUX0VYVCAweDhERDUKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMURfQVJSQVlfRVhUIDB4OERENgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9BUlJBWV9FWFQgMHg4REQ3CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0JVRkZFUl9FWFQgMHg4REQ4CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZHJhd19pbnN0YW5jZWQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9wYWNrZWRfZmxvYXQKKyNkZWZpbmUgR0xfUjExRl9HMTFGX0IxMEZfRVhUICAgICAgICAgICAgIDB4OEMzQQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWX0VYVCAweDhDM0IKKyNkZWZpbmUgR0xfUkdCQV9TSUdORURfQ09NUE9ORU5UU19FWFQgICAgIDB4OEMzQworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfYXJyYXkKKyNkZWZpbmUgR0xfVEVYVFVSRV8xRF9BUlJBWV9FWFQgICAgICAgICAgIDB4OEMxOAorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzFEX0FSUkFZX0VYVCAgICAgMHg4QzE5CisjZGVmaW5lIEdMX1RFWFRVUkVfMkRfQVJSQVlfRVhUICAgICAgICAgICAweDhDMUEKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8yRF9BUlJBWV9FWFQgICAgIDB4OEMxQgorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMURfQVJSQVlfRVhUICAgMHg4QzFDCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18yRF9BUlJBWV9FWFQgICAweDhDMUQKKyNkZWZpbmUgR0xfTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTX0VYVCAgIDB4ODhGRgorI2RlZmluZSBHTF9DT01QQVJFX1JFRl9ERVBUSF9UT19URVhUVVJFX0VYVCAweDg4NEUKKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MQVlFUl9FWFQgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xfVEVYVFVSRV9CVUZGRVJfRVhUICAgICAgICAgICAgIDB4OEMyQQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9CVUZGRVJfU0laRV9FWFQgICAgMHg4QzJCCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19CVUZGRVJfRVhUICAgICAweDhDMkMKKyNkZWZpbmUgR0xfVEVYVFVSRV9CVUZGRVJfREFUQV9TVE9SRV9CSU5ESU5HX0VYVCAweDhDMkQKKyNkZWZpbmUgR0xfVEVYVFVSRV9CVUZGRVJfRk9STUFUX0VYVCAgICAgIDB4OEMyRQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fbGF0YworI2RlZmluZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9MQVRDMV9FWFQgMHg4QzcwCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU0lHTkVEX0xVTUlOQU5DRV9MQVRDMV9FWFQgMHg4QzcxCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFX0FMUEhBX0xBVEMyX0VYVCAweDhDNzIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TSUdORURfTFVNSU5BTkNFX0FMUEhBX0xBVEMyX0VYVCAweDhDNzMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SRURfUkdUQzFfRVhUICAgICAgIDB4OERCQgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NJR05FRF9SRURfUkdUQzFfRVhUIDB4OERCQworI2RlZmluZSBHTF9DT01QUkVTU0VEX1JFRF9HUkVFTl9SR1RDMl9FWFQgMHg4REJECisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9FWFQgMHg4REJFCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zaGFyZWRfZXhwb25lbnQKKyNkZWZpbmUgR0xfUkdCOV9FNV9FWFQgICAgICAgICAgICAgICAgICAgIDB4OEMzRAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfNV85XzlfOV9SRVZfRVhUICAgMHg4QzNFCisjZGVmaW5lIEdMX1RFWFRVUkVfU0hBUkVEX1NJWkVfRVhUICAgICAgICAweDhDM0YKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2RlcHRoX2J1ZmZlcl9mbG9hdAorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQzMkZfTlYgICAgICAgICAgMHg4REFCCisjZGVmaW5lIEdMX0RFUFRIMzJGX1NURU5DSUw4X05WICAgICAgICAgICAweDhEQUMKKyNkZWZpbmUgR0xfRkxPQVRfMzJfVU5TSUdORURfSU5UXzI0XzhfUkVWX05WIDB4OERBRAorI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfRkxPQVRfTU9ERV9OViAgICAgMHg4REFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGVfY292ZXJhZ2UKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0NPVkVSQUdFX1NBTVBMRVNfTlYgMHg4Q0FCCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9DT0xPUl9TQU1QTEVTX05WICAweDhFMTAKKyNkZWZpbmUgR0xfTUFYX01VTFRJU0FNUExFX0NPVkVSQUdFX01PREVTX05WIDB4OEUxMQorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9DT1ZFUkFHRV9NT0RFU19OViAgMHg4RTEyCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZnJhbWVidWZmZXJfc1JHQgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9TUkdCX0VYVCAgICAgICAgICAgMHg4REI5CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX1NSR0JfQ0FQQUJMRV9FWFQgICAweDhEQkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2dlb21ldHJ5X3NoYWRlcjQKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3BhcmFtZXRlcl9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1BBUkFNRVRFUl9CVUZGRVJfQklORElOR1NfTlYgMHg4REEwCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1BBUkFNRVRFUl9CVUZGRVJfU0laRV9OViAweDhEQTEKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fUEFSQU1FVEVSX0JVRkZFUl9OViAweDhEQTIKKyNkZWZpbmUgR0xfR0VPTUVUUllfUFJPR1JBTV9QQVJBTUVURVJfQlVGRkVSX05WIDB4OERBMworI2RlZmluZSBHTF9GUkFHTUVOVF9QUk9HUkFNX1BBUkFNRVRFUl9CVUZGRVJfTlYgMHg4REE0CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZHJhd19idWZmZXJzMgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdHJhbnNmb3JtX2ZlZWRiYWNrCisjZGVmaW5lIEdMX0JBQ0tfUFJJTUFSWV9DT0xPUl9OViAgICAgICAgICAweDhDNzcKKyNkZWZpbmUgR0xfQkFDS19TRUNPTkRBUllfQ09MT1JfTlYgICAgICAgIDB4OEM3OAorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX05WICAgICAgICAgICAgICAgMHg4Qzc5CisjZGVmaW5lIEdMX0NMSVBfRElTVEFOQ0VfTlYgICAgICAgICAgICAgICAweDhDN0EKKyNkZWZpbmUgR0xfVkVSVEVYX0lEX05WICAgICAgICAgICAgICAgICAgIDB4OEM3QgorI2RlZmluZSBHTF9QUklNSVRJVkVfSURfTlYgICAgICAgICAgICAgICAgMHg4QzdDCisjZGVmaW5lIEdMX0dFTkVSSUNfQVRUUklCX05WICAgICAgICAgICAgICAweDhDN0QKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0FUVFJJQlNfTlYgIDB4OEM3RQorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX01PREVfTlYgMHg4QzdGCisjZGVmaW5lIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQ09NUE9ORU5UU19OViAweDhDODAKKyNkZWZpbmUgR0xfQUNUSVZFX1ZBUllJTkdTX05WICAgICAgICAgICAgIDB4OEM4MQorI2RlZmluZSBHTF9BQ1RJVkVfVkFSWUlOR19NQVhfTEVOR1RIX05WICAgMHg4QzgyCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19WQVJZSU5HU19OViAweDhDODMKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TVEFSVF9OViAweDhDODQKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TSVpFX05WIDB4OEM4NQorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfUkVDT1JEX05WICAgMHg4Qzg2CisjZGVmaW5lIEdMX1BSSU1JVElWRVNfR0VORVJBVEVEX05WICAgICAgICAweDhDODcKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1BSSU1JVElWRVNfV1JJVFRFTl9OViAweDhDODgKKyNkZWZpbmUgR0xfUkFTVEVSSVpFUl9ESVNDQVJEX05WICAgICAgICAgIDB4OEM4OQorI2RlZmluZSBHTF9NQVhfVFJBTlNGT1JNX0ZFRURCQUNLX0lOVEVSTEVBVkVEX0FUVFJJQlNfTlYgMHg4QzhBCisjZGVmaW5lIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQVRUUklCU19OViAweDhDOEIKKyNkZWZpbmUgR0xfSU5URVJMRUFWRURfQVRUUklCU19OViAgICAgICAgIDB4OEM4QworI2RlZmluZSBHTF9TRVBBUkFURV9BVFRSSUJTX05WICAgICAgICAgICAgMHg4QzhECisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTlYgICAweDhDOEUKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSU5ESU5HX05WIDB4OEM4RgorI2RlZmluZSBHTF9MQVlFUl9OViAgICAgICAgICAgICAgICAgICAgICAgMHg4REFBCisjZGVmaW5lIEdMX05FWFRfQlVGRkVSX05WICAgICAgICAgICAgICAgICAtMgorI2RlZmluZSBHTF9TS0lQX0NPTVBPTkVOVFM0X05WICAgICAgICAgICAgLTMKKyNkZWZpbmUgR0xfU0tJUF9DT01QT05FTlRTM19OViAgICAgICAgICAgIC00CisjZGVmaW5lIEdMX1NLSVBfQ09NUE9ORU5UUzJfTlYgICAgICAgICAgICAtNQorI2RlZmluZSBHTF9TS0lQX0NPTVBPTkVOVFMxX05WICAgICAgICAgICAgLTYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9iaW5kYWJsZV91bmlmb3JtCisjZGVmaW5lIEdMX01BWF9WRVJURVhfQklOREFCTEVfVU5JRk9STVNfRVhUIDB4OERFMgorI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfQklOREFCTEVfVU5JRk9STVNfRVhUIDB4OERFMworI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfQklOREFCTEVfVU5JRk9STVNfRVhUIDB4OERFNAorI2RlZmluZSBHTF9NQVhfQklOREFCTEVfVU5JRk9STV9TSVpFX0VYVCAgMHg4REVECisjZGVmaW5lIEdMX1VOSUZPUk1fQlVGRkVSX0VYVCAgICAgICAgICAgICAweDhERUUKKyNkZWZpbmUgR0xfVU5JRk9STV9CVUZGRVJfQklORElOR19FWFQgICAgIDB4OERFRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfaW50ZWdlcgorI2RlZmluZSBHTF9SR0JBMzJVSV9FWFQgICAgICAgICAgICAgICAgICAgMHg4RDcwCisjZGVmaW5lIEdMX1JHQjMyVUlfRVhUICAgICAgICAgICAgICAgICAgICAweDhENzEKKyNkZWZpbmUgR0xfQUxQSEEzMlVJX0VYVCAgICAgICAgICAgICAgICAgIDB4OEQ3MgorI2RlZmluZSBHTF9JTlRFTlNJVFkzMlVJX0VYVCAgICAgICAgICAgICAgMHg4RDczCisjZGVmaW5lIEdMX0xVTUlOQU5DRTMyVUlfRVhUICAgICAgICAgICAgICAweDhENzQKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBMzJVSV9FWFQgICAgICAgIDB4OEQ3NQorI2RlZmluZSBHTF9SR0JBMTZVSV9FWFQgICAgICAgICAgICAgICAgICAgMHg4RDc2CisjZGVmaW5lIEdMX1JHQjE2VUlfRVhUICAgICAgICAgICAgICAgICAgICAweDhENzcKKyNkZWZpbmUgR0xfQUxQSEExNlVJX0VYVCAgICAgICAgICAgICAgICAgIDB4OEQ3OAorI2RlZmluZSBHTF9JTlRFTlNJVFkxNlVJX0VYVCAgICAgICAgICAgICAgMHg4RDc5CisjZGVmaW5lIEdMX0xVTUlOQU5DRTE2VUlfRVhUICAgICAgICAgICAgICAweDhEN0EKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBMTZVSV9FWFQgICAgICAgIDB4OEQ3QgorI2RlZmluZSBHTF9SR0JBOFVJX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4RDdDCisjZGVmaW5lIEdMX1JHQjhVSV9FWFQgICAgICAgICAgICAgICAgICAgICAweDhEN0QKKyNkZWZpbmUgR0xfQUxQSEE4VUlfRVhUICAgICAgICAgICAgICAgICAgIDB4OEQ3RQorI2RlZmluZSBHTF9JTlRFTlNJVFk4VUlfRVhUICAgICAgICAgICAgICAgMHg4RDdGCisjZGVmaW5lIEdMX0xVTUlOQU5DRThVSV9FWFQgICAgICAgICAgICAgICAweDhEODAKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBOFVJX0VYVCAgICAgICAgIDB4OEQ4MQorI2RlZmluZSBHTF9SR0JBMzJJX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4RDgyCisjZGVmaW5lIEdMX1JHQjMySV9FWFQgICAgICAgICAgICAgICAgICAgICAweDhEODMKKyNkZWZpbmUgR0xfQUxQSEEzMklfRVhUICAgICAgICAgICAgICAgICAgIDB4OEQ4NAorI2RlZmluZSBHTF9JTlRFTlNJVFkzMklfRVhUICAgICAgICAgICAgICAgMHg4RDg1CisjZGVmaW5lIEdMX0xVTUlOQU5DRTMySV9FWFQgICAgICAgICAgICAgICAweDhEODYKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBMzJJX0VYVCAgICAgICAgIDB4OEQ4NworI2RlZmluZSBHTF9SR0JBMTZJX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4RDg4CisjZGVmaW5lIEdMX1JHQjE2SV9FWFQgICAgICAgICAgICAgICAgICAgICAweDhEODkKKyNkZWZpbmUgR0xfQUxQSEExNklfRVhUICAgICAgICAgICAgICAgICAgIDB4OEQ4QQorI2RlZmluZSBHTF9JTlRFTlNJVFkxNklfRVhUICAgICAgICAgICAgICAgMHg4RDhCCisjZGVmaW5lIEdMX0xVTUlOQU5DRTE2SV9FWFQgICAgICAgICAgICAgICAweDhEOEMKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBMTZJX0VYVCAgICAgICAgIDB4OEQ4RAorI2RlZmluZSBHTF9SR0JBOElfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4RDhFCisjZGVmaW5lIEdMX1JHQjhJX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDhEOEYKKyNkZWZpbmUgR0xfQUxQSEE4SV9FWFQgICAgICAgICAgICAgICAgICAgIDB4OEQ5MAorI2RlZmluZSBHTF9JTlRFTlNJVFk4SV9FWFQgICAgICAgICAgICAgICAgMHg4RDkxCisjZGVmaW5lIEdMX0xVTUlOQU5DRThJX0VYVCAgICAgICAgICAgICAgICAweDhEOTIKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBOElfRVhUICAgICAgICAgIDB4OEQ5MworI2RlZmluZSBHTF9SRURfSU5URUdFUl9FWFQgICAgICAgICAgICAgICAgMHg4RDk0CisjZGVmaW5lIEdMX0dSRUVOX0lOVEVHRVJfRVhUICAgICAgICAgICAgICAweDhEOTUKKyNkZWZpbmUgR0xfQkxVRV9JTlRFR0VSX0VYVCAgICAgICAgICAgICAgIDB4OEQ5NgorI2RlZmluZSBHTF9BTFBIQV9JTlRFR0VSX0VYVCAgICAgICAgICAgICAgMHg4RDk3CisjZGVmaW5lIEdMX1JHQl9JTlRFR0VSX0VYVCAgICAgICAgICAgICAgICAweDhEOTgKKyNkZWZpbmUgR0xfUkdCQV9JTlRFR0VSX0VYVCAgICAgICAgICAgICAgIDB4OEQ5OQorI2RlZmluZSBHTF9CR1JfSU5URUdFUl9FWFQgICAgICAgICAgICAgICAgMHg4RDlBCisjZGVmaW5lIEdMX0JHUkFfSU5URUdFUl9FWFQgICAgICAgICAgICAgICAweDhEOUIKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0lOVEVHRVJfRVhUICAgICAgICAgIDB4OEQ5QworI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEFfSU5URUdFUl9FWFQgICAgMHg4RDlECisjZGVmaW5lIEdMX1JHQkFfSU5URUdFUl9NT0RFX0VYVCAgICAgICAgICAweDhEOUUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0dSRU1FRFlfZnJhbWVfdGVybWluYXRvcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfY29uZGl0aW9uYWxfcmVuZGVyCisjZGVmaW5lIEdMX1FVRVJZX1dBSVRfTlYgICAgICAgICAgICAgICAgICAweDhFMTMKKyNkZWZpbmUgR0xfUVVFUllfTk9fV0FJVF9OViAgICAgICAgICAgICAgIDB4OEUxNAorI2RlZmluZSBHTF9RVUVSWV9CWV9SRUdJT05fV0FJVF9OViAgICAgICAgMHg4RTE1CisjZGVmaW5lIEdMX1FVRVJZX0JZX1JFR0lPTl9OT19XQUlUX05WICAgICAweDhFMTYKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ByZXNlbnRfdmlkZW8KKyNkZWZpbmUgR0xfRlJBTUVfTlYgICAgICAgICAgICAgICAgICAgICAgIDB4OEUyNgorI2RlZmluZSBHTF9GSUVMRFNfTlYgICAgICAgICAgICAgICAgICAgICAgMHg4RTI3CisjZGVmaW5lIEdMX0NVUlJFTlRfVElNRV9OViAgICAgICAgICAgICAgICAweDhFMjgKKyNkZWZpbmUgR0xfTlVNX0ZJTExfU1RSRUFNU19OViAgICAgICAgICAgIDB4OEUyOQorI2RlZmluZSBHTF9QUkVTRU5UX1RJTUVfTlYgICAgICAgICAgICAgICAgMHg4RTJBCisjZGVmaW5lIEdMX1BSRVNFTlRfRFVSQVRJT05fTlYgICAgICAgICAgICAweDhFMkIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2sKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9FWFQgIDB4OEM4RQorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1NUQVJUX0VYVCAweDhDODQKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TSVpFX0VYVCAweDhDODUKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSU5ESU5HX0VYVCAweDhDOEYKKyNkZWZpbmUgR0xfSU5URVJMRUFWRURfQVRUUklCU19FWFQgICAgICAgIDB4OEM4QworI2RlZmluZSBHTF9TRVBBUkFURV9BVFRSSUJTX0VYVCAgICAgICAgICAgMHg4QzhECisjZGVmaW5lIEdMX1BSSU1JVElWRVNfR0VORVJBVEVEX0VYVCAgICAgICAweDhDODcKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1BSSU1JVElWRVNfV1JJVFRFTl9FWFQgMHg4Qzg4CisjZGVmaW5lIEdMX1JBU1RFUklaRVJfRElTQ0FSRF9FWFQgICAgICAgICAweDhDODkKKyNkZWZpbmUgR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19JTlRFUkxFQVZFRF9DT01QT05FTlRTX0VYVCAweDhDOEEKKyNkZWZpbmUgR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19TRVBBUkFURV9BVFRSSUJTX0VYVCAweDhDOEIKKyNkZWZpbmUgR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19TRVBBUkFURV9DT01QT05FTlRTX0VYVCAweDhDODAKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkdTX0VYVCAweDhDODMKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9NT0RFX0VYVCAweDhDN0YKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkdfTUFYX0xFTkdUSF9FWFQgMHg4Qzc2CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZGlyZWN0X3N0YXRlX2FjY2VzcworI2RlZmluZSBHTF9QUk9HUkFNX01BVFJJWF9FWFQgICAgICAgICAgICAgMHg4RTJECisjZGVmaW5lIEdMX1RSQU5TUE9TRV9QUk9HUkFNX01BVFJJWF9FWFQgICAweDhFMkUKKyNkZWZpbmUgR0xfUFJPR1JBTV9NQVRSSVhfU1RBQ0tfREVQVEhfRVhUIDB4OEUyRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF9hcnJheV9iZ3JhCisvKiByZXVzZSBHTF9CR1JBICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zd2l6emxlCisjZGVmaW5lIEdMX1RFWFRVUkVfU1dJWlpMRV9SX0VYVCAgICAgICAgICAweDhFNDIKKyNkZWZpbmUgR0xfVEVYVFVSRV9TV0laWkxFX0dfRVhUICAgICAgICAgIDB4OEU0MworI2RlZmluZSBHTF9URVhUVVJFX1NXSVpaTEVfQl9FWFQgICAgICAgICAgMHg4RTQ0CisjZGVmaW5lIEdMX1RFWFRVUkVfU1dJWlpMRV9BX0VYVCAgICAgICAgICAweDhFNDUKKyNkZWZpbmUgR0xfVEVYVFVSRV9TV0laWkxFX1JHQkFfRVhUICAgICAgIDB4OEU0NgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZXhwbGljaXRfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfU0FNUExFX1BPU0lUSU9OX05WICAgICAgICAgICAgIDB4OEU1MAorI2RlZmluZSBHTF9TQU1QTEVfTUFTS19OViAgICAgICAgICAgICAgICAgMHg4RTUxCisjZGVmaW5lIEdMX1NBTVBMRV9NQVNLX1ZBTFVFX05WICAgICAgICAgICAweDhFNTIKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX1JFTkRFUkJVRkZFUl9OViAweDhFNTMKKyNkZWZpbmUgR0xfVEVYVFVSRV9SRU5ERVJCVUZGRVJfREFUQV9TVE9SRV9CSU5ESU5HX05WIDB4OEU1NAorI2RlZmluZSBHTF9URVhUVVJFX1JFTkRFUkJVRkZFUl9OViAgICAgICAgMHg4RTU1CisjZGVmaW5lIEdMX1NBTVBMRVJfUkVOREVSQlVGRkVSX05WICAgICAgICAweDhFNTYKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfUkVOREVSQlVGRkVSX05WICAgIDB4OEU1NworI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl9SRU5ERVJCVUZGRVJfTlYgMHg4RTU4CisjZGVmaW5lIEdMX01BWF9TQU1QTEVfTUFTS19XT1JEU19OViAgICAgICAweDhFNTkKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RyYW5zZm9ybV9mZWVkYmFjazIKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX05WICAgICAgICAgIDB4OEUyMgorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1BBVVNFRF9OViAweDhFMjMKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9BQ1RJVkVfTlYgMHg4RTI0CisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CSU5ESU5HX05WICAweDhFMjUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9tZW1pbmZvCisjZGVmaW5lIEdMX1ZCT19GUkVFX01FTU9SWV9BVEkgICAgICAgICAgICAweDg3RkIKKyNkZWZpbmUgR0xfVEVYVFVSRV9GUkVFX01FTU9SWV9BVEkgICAgICAgIDB4ODdGQworI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfRlJFRV9NRU1PUllfQVRJICAgMHg4N0ZECisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfcGVyZm9ybWFuY2VfbW9uaXRvcgorI2RlZmluZSBHTF9DT1VOVEVSX1RZUEVfQU1EICAgICAgICAgICAgICAgMHg4QkMwCisjZGVmaW5lIEdMX0NPVU5URVJfUkFOR0VfQU1EICAgICAgICAgICAgICAweDhCQzEKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UNjRfQU1EICAgICAgICAgICAgIDB4OEJDMgorI2RlZmluZSBHTF9QRVJDRU5UQUdFX0FNRCAgICAgICAgICAgICAgICAgMHg4QkMzCisjZGVmaW5lIEdMX1BFUkZNT05fUkVTVUxUX0FWQUlMQUJMRV9BTUQgICAweDhCQzQKKyNkZWZpbmUgR0xfUEVSRk1PTl9SRVNVTFRfU0laRV9BTUQgICAgICAgIDB4OEJDNQorI2RlZmluZSBHTF9QRVJGTU9OX1JFU1VMVF9BTUQgICAgICAgICAgICAgMHg4QkM2CisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfdGV4dHVyZV90ZXh0dXJlNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX3ZlcnRleF9zaGFkZXJfdGVzc2VsYXRvcgorI2RlZmluZSBHTF9TQU1QTEVSX0JVRkZFUl9BTUQgICAgICAgICAgICAgMHg5MDAxCisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSX0JVRkZFUl9BTUQgICAgICAgICAweDkwMDIKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfQlVGRkVSX0FNRCAweDkwMDMKKyNkZWZpbmUgR0xfVEVTU0VMTEFUSU9OX01PREVfQU1EICAgICAgICAgIDB4OTAwNAorI2RlZmluZSBHTF9URVNTRUxMQVRJT05fRkFDVE9SX0FNRCAgICAgICAgMHg5MDA1CisjZGVmaW5lIEdMX0RJU0NSRVRFX0FNRCAgICAgICAgICAgICAgICAgICAweDkwMDYKKyNkZWZpbmUgR0xfQ09OVElOVU9VU19BTUQgICAgICAgICAgICAgICAgIDB4OTAwNworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3Byb3Zva2luZ192ZXJ0ZXgKKyNkZWZpbmUgR0xfUVVBRFNfRk9MTE9XX1BST1ZPS0lOR19WRVJURVhfQ09OVkVOVElPTl9FWFQgMHg4RTRDCisjZGVmaW5lIEdMX0ZJUlNUX1ZFUlRFWF9DT05WRU5USU9OX0VYVCAgICAweDhFNEQKKyNkZWZpbmUgR0xfTEFTVF9WRVJURVhfQ09OVkVOVElPTl9FWFQgICAgIDB4OEU0RQorI2RlZmluZSBHTF9QUk9WT0tJTkdfVkVSVEVYX0VYVCAgICAgICAgICAgMHg4RTRGCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zbm9ybQorI2RlZmluZSBHTF9BTFBIQV9TTk9STSAgICAgICAgICAgICAgICAgICAgMHg5MDEwCisjZGVmaW5lIEdMX0xVTUlOQU5DRV9TTk9STSAgICAgICAgICAgICAgICAweDkwMTEKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBX1NOT1JNICAgICAgICAgIDB4OTAxMgorI2RlZmluZSBHTF9JTlRFTlNJVFlfU05PUk0gICAgICAgICAgICAgICAgMHg5MDEzCisjZGVmaW5lIEdMX0FMUEhBOF9TTk9STSAgICAgICAgICAgICAgICAgICAweDkwMTQKKyNkZWZpbmUgR0xfTFVNSU5BTkNFOF9TTk9STSAgICAgICAgICAgICAgIDB4OTAxNQorI2RlZmluZSBHTF9MVU1JTkFOQ0U4X0FMUEhBOF9TTk9STSAgICAgICAgMHg5MDE2CisjZGVmaW5lIEdMX0lOVEVOU0lUWThfU05PUk0gICAgICAgICAgICAgICAweDkwMTcKKyNkZWZpbmUgR0xfQUxQSEExNl9TTk9STSAgICAgICAgICAgICAgICAgIDB4OTAxOAorI2RlZmluZSBHTF9MVU1JTkFOQ0UxNl9TTk9STSAgICAgICAgICAgICAgMHg5MDE5CisjZGVmaW5lIEdMX0xVTUlOQU5DRTE2X0FMUEhBMTZfU05PUk0gICAgICAweDkwMUEKKyNkZWZpbmUgR0xfSU5URU5TSVRZMTZfU05PUk0gICAgICAgICAgICAgIDB4OTAxQgorLyogcmV1c2UgR0xfUkVEX1NOT1JNICovCisvKiByZXVzZSBHTF9SR19TTk9STSAqLworLyogcmV1c2UgR0xfUkdCX1NOT1JNICovCisvKiByZXVzZSBHTF9SR0JBX1NOT1JNICovCisvKiByZXVzZSBHTF9SOF9TTk9STSAqLworLyogcmV1c2UgR0xfUkc4X1NOT1JNICovCisvKiByZXVzZSBHTF9SR0I4X1NOT1JNICovCisvKiByZXVzZSBHTF9SR0JBOF9TTk9STSAqLworLyogcmV1c2UgR0xfUjE2X1NOT1JNICovCisvKiByZXVzZSBHTF9SRzE2X1NOT1JNICovCisvKiByZXVzZSBHTF9SR0IxNl9TTk9STSAqLworLyogcmV1c2UgR0xfUkdCQTE2X1NOT1JNICovCisvKiByZXVzZSBHTF9TSUdORURfTk9STUFMSVpFRCAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX2RyYXdfYnVmZmVyc19ibGVuZAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfdGV4dHVyZV9yYW5nZQorI2RlZmluZSBHTF9URVhUVVJFX1JBTkdFX0xFTkdUSF9BUFBMRSAgICAgMHg4NUI3CisjZGVmaW5lIEdMX1RFWFRVUkVfUkFOR0VfUE9JTlRFUl9BUFBMRSAgICAweDg1QjgKKyNkZWZpbmUgR0xfVEVYVFVSRV9TVE9SQUdFX0hJTlRfQVBQTEUgICAgIDB4ODVCQworI2RlZmluZSBHTF9TVE9SQUdFX1BSSVZBVEVfQVBQTEUgICAgICAgICAgMHg4NUJECisvKiByZXVzZSBHTF9TVE9SQUdFX0NBQ0hFRF9BUFBMRSAqLworLyogcmV1c2UgR0xfU1RPUkFHRV9TSEFSRURfQVBQTEUgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2Zsb2F0X3BpeGVscworI2RlZmluZSBHTF9IQUxGX0FQUExFICAgICAgICAgICAgICAgICAgICAgMHgxNDBCCisjZGVmaW5lIEdMX1JHQkFfRkxPQVQzMl9BUFBMRSAgICAgICAgICAgICAweDg4MTQKKyNkZWZpbmUgR0xfUkdCX0ZMT0FUMzJfQVBQTEUgICAgICAgICAgICAgIDB4ODgxNQorI2RlZmluZSBHTF9BTFBIQV9GTE9BVDMyX0FQUExFICAgICAgICAgICAgMHg4ODE2CisjZGVmaW5lIEdMX0lOVEVOU0lUWV9GTE9BVDMyX0FQUExFICAgICAgICAweDg4MTcKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0ZMT0FUMzJfQVBQTEUgICAgICAgIDB4ODgxOAorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEFfRkxPQVQzMl9BUFBMRSAgMHg4ODE5CisjZGVmaW5lIEdMX1JHQkFfRkxPQVQxNl9BUFBMRSAgICAgICAgICAgICAweDg4MUEKKyNkZWZpbmUgR0xfUkdCX0ZMT0FUMTZfQVBQTEUgICAgICAgICAgICAgIDB4ODgxQgorI2RlZmluZSBHTF9BTFBIQV9GTE9BVDE2X0FQUExFICAgICAgICAgICAgMHg4ODFDCisjZGVmaW5lIEdMX0lOVEVOU0lUWV9GTE9BVDE2X0FQUExFICAgICAgICAweDg4MUQKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0ZMT0FUMTZfQVBQTEUgICAgICAgIDB4ODgxRQorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEFfRkxPQVQxNl9BUFBMRSAgMHg4ODFGCisjZGVmaW5lIEdMX0NPTE9SX0ZMT0FUX0FQUExFICAgICAgICAgICAgICAweDhBMEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3ZlcnRleF9wcm9ncmFtX2V2YWx1YXRvcnMKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9NQVAxX0FQUExFICAgICAgIDB4OEEwMAorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX01BUDJfQVBQTEUgICAgICAgMHg4QTAxCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfTUFQMV9TSVpFX0FQUExFICAweDhBMDIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9NQVAxX0NPRUZGX0FQUExFIDB4OEEwMworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX01BUDFfT1JERVJfQVBQTEUgMHg4QTA0CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfTUFQMV9ET01BSU5fQVBQTEUgMHg4QTA1CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfTUFQMl9TSVpFX0FQUExFICAweDhBMDYKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9NQVAyX0NPRUZGX0FQUExFIDB4OEEwNworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX01BUDJfT1JERVJfQVBQTEUgMHg4QTA4CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfTUFQMl9ET01BSU5fQVBQTEUgMHg4QTA5CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9hdXhfZGVwdGhfc3RlbmNpbAorI2RlZmluZSBHTF9BVVhfREVQVEhfU1RFTkNJTF9BUFBMRSAgICAgICAgMHg4QTE0CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9vYmplY3RfcHVyZ2VhYmxlCisjZGVmaW5lIEdMX0JVRkZFUl9PQkpFQ1RfQVBQTEUgICAgICAgICAgICAweDg1QjMKKyNkZWZpbmUgR0xfUkVMRUFTRURfQVBQTEUgICAgICAgICAgICAgICAgIDB4OEExOQorI2RlZmluZSBHTF9WT0xBVElMRV9BUFBMRSAgICAgICAgICAgICAgICAgMHg4QTFBCisjZGVmaW5lIEdMX1JFVEFJTkVEX0FQUExFICAgICAgICAgICAgICAgICAweDhBMUIKKyNkZWZpbmUgR0xfVU5ERUZJTkVEX0FQUExFICAgICAgICAgICAgICAgIDB4OEExQworI2RlZmluZSBHTF9QVVJHRUFCTEVfQVBQTEUgICAgICAgICAgICAgICAgMHg4QTFECisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9yb3dfYnl0ZXMKKyNkZWZpbmUgR0xfUEFDS19ST1dfQllURVNfQVBQTEUgICAgICAgICAgIDB4OEExNQorI2RlZmluZSBHTF9VTlBBQ0tfUk9XX0JZVEVTX0FQUExFICAgICAgICAgMHg4QTE2CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9yZ2JfNDIyCisjZGVmaW5lIEdMX1JHQl80MjJfQVBQTEUgICAgICAgICAgICAgICAgICAweDhBMUYKKy8qIHJldXNlIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9BUFBMRSAqLworLyogcmV1c2UgR0xfVU5TSUdORURfU0hPUlRfOF84X1JFVl9BUFBMRSAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmlkZW9fY2FwdHVyZQorI2RlZmluZSBHTF9WSURFT19CVUZGRVJfTlYgICAgICAgICAgICAgICAgMHg5MDIwCisjZGVmaW5lIEdMX1ZJREVPX0JVRkZFUl9CSU5ESU5HX05WICAgICAgICAweDkwMjEKKyNkZWZpbmUgR0xfRklFTERfVVBQRVJfTlYgICAgICAgICAgICAgICAgIDB4OTAyMgorI2RlZmluZSBHTF9GSUVMRF9MT1dFUl9OViAgICAgICAgICAgICAgICAgMHg5MDIzCisjZGVmaW5lIEdMX05VTV9WSURFT19DQVBUVVJFX1NUUkVBTVNfTlYgICAweDkwMjQKKyNkZWZpbmUgR0xfTkVYVF9WSURFT19DQVBUVVJFX0JVRkZFUl9TVEFUVVNfTlYgMHg5MDI1CisjZGVmaW5lIEdMX1ZJREVPX0NBUFRVUkVfVE9fNDIyX1NVUFBPUlRFRF9OViAweDkwMjYKKyNkZWZpbmUgR0xfTEFTVF9WSURFT19DQVBUVVJFX1NUQVRVU19OViAgIDB4OTAyNworI2RlZmluZSBHTF9WSURFT19CVUZGRVJfUElUQ0hfTlYgICAgICAgICAgMHg5MDI4CisjZGVmaW5lIEdMX1ZJREVPX0NPTE9SX0NPTlZFUlNJT05fTUFUUklYX05WIDB4OTAyOQorI2RlZmluZSBHTF9WSURFT19DT0xPUl9DT05WRVJTSU9OX01BWF9OViAgMHg5MDJBCisjZGVmaW5lIEdMX1ZJREVPX0NPTE9SX0NPTlZFUlNJT05fTUlOX05WICAweDkwMkIKKyNkZWZpbmUgR0xfVklERU9fQ09MT1JfQ09OVkVSU0lPTl9PRkZTRVRfTlYgMHg5MDJDCisjZGVmaW5lIEdMX1ZJREVPX0JVRkZFUl9JTlRFUk5BTF9GT1JNQVRfTlYgMHg5MDJECisjZGVmaW5lIEdMX1BBUlRJQUxfU1VDQ0VTU19OViAgICAgICAgICAgICAweDkwMkUKKyNkZWZpbmUgR0xfU1VDQ0VTU19OViAgICAgICAgICAgICAgICAgICAgIDB4OTAyRgorI2RlZmluZSBHTF9GQUlMVVJFX05WICAgICAgICAgICAgICAgICAgICAgMHg5MDMwCisjZGVmaW5lIEdMX1lDQllDUjhfNDIyX05WICAgICAgICAgICAgICAgICAweDkwMzEKKyNkZWZpbmUgR0xfWUNCQVlDUjhBXzQyMjRfTlYgICAgICAgICAgICAgIDB4OTAzMgorI2RlZmluZSBHTF9aNlkxMFo2Q0IxMFo2WTEwWjZDUjEwXzQyMl9OViAgMHg5MDMzCisjZGVmaW5lIEdMX1o2WTEwWjZDQjEwWjZBMTBaNlkxMFo2Q1IxMFo2QTEwXzQyMjRfTlYgMHg5MDM0CisjZGVmaW5lIEdMX1o0WTEyWjRDQjEyWjRZMTJaNENSMTJfNDIyX05WICAweDkwMzUKKyNkZWZpbmUgR0xfWjRZMTJaNENCMTJaNEExMlo0WTEyWjRDUjEyWjRBMTJfNDIyNF9OViAweDkwMzYKKyNkZWZpbmUgR0xfWjRZMTJaNENCMTJaNENSMTJfNDQ0X05WICAgICAgIDB4OTAzNworI2RlZmluZSBHTF9WSURFT19DQVBUVVJFX0ZSQU1FX1dJRFRIX05WICAgMHg5MDM4CisjZGVmaW5lIEdMX1ZJREVPX0NBUFRVUkVfRlJBTUVfSEVJR0hUX05WICAweDkwMzkKKyNkZWZpbmUgR0xfVklERU9fQ0FQVFVSRV9GSUVMRF9VUFBFUl9IRUlHSFRfTlYgMHg5MDNBCisjZGVmaW5lIEdMX1ZJREVPX0NBUFRVUkVfRklFTERfTE9XRVJfSEVJR0hUX05WIDB4OTAzQgorI2RlZmluZSBHTF9WSURFT19DQVBUVVJFX1NVUkZBQ0VfT1JJR0lOX05WIDB4OTAzQworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfY29weV9pbWFnZQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzCisjZGVmaW5lIEdMX0FDVElWRV9QUk9HUkFNX0VYVCAgICAgICAgICAgICAweDhCOEQKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3BhcmFtZXRlcl9idWZmZXJfb2JqZWN0MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfc2hhZGVyX2J1ZmZlcl9sb2FkCisjZGVmaW5lIEdMX0JVRkZFUl9HUFVfQUREUkVTU19OViAgICAgICAgICAweDhGMUQKKyNkZWZpbmUgR0xfR1BVX0FERFJFU1NfTlYgICAgICAgICAgICAgICAgIDB4OEYzNAorI2RlZmluZSBHTF9NQVhfU0hBREVSX0JVRkZFUl9BRERSRVNTX05WICAgMHg4RjM1CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfYnVmZmVyX3VuaWZpZWRfbWVtb3J5CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVU5JRklFRF9OViAweDhGMUUKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9VTklGSUVEX05WICAgICAgIDB4OEYxRgorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0FERFJFU1NfTlYgMHg4RjIwCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9BRERSRVNTX05WICAgICAgICAweDhGMjEKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX0FERFJFU1NfTlYgICAgICAgIDB4OEYyMgorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9BRERSRVNTX05WICAgICAgICAgMHg4RjIzCisjZGVmaW5lIEdMX0lOREVYX0FSUkFZX0FERFJFU1NfTlYgICAgICAgICAweDhGMjQKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9BRERSRVNTX05WIDB4OEYyNQorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfQUREUkVTU19OViAgICAgMHg4RjI2CisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9BRERSRVNTX05WIDB4OEYyNworI2RlZmluZSBHTF9GT0dfQ09PUkRfQVJSQVlfQUREUkVTU19OViAgICAgMHg4RjI4CisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQUREUkVTU19OViAgICAgICAweDhGMjkKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9MRU5HVEhfTlYgIDB4OEYyQQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfTEVOR1RIX05WICAgICAgICAgMHg4RjJCCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9MRU5HVEhfTlYgICAgICAgICAweDhGMkMKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfTEVOR1RIX05WICAgICAgICAgIDB4OEYyRAorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9MRU5HVEhfTlYgICAgICAgICAgMHg4RjJFCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfTEVOR1RIX05WICAweDhGMkYKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX0xFTkdUSF9OViAgICAgIDB4OEYzMAorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfTEVOR1RIX05WIDB4OEYzMQorI2RlZmluZSBHTF9GT0dfQ09PUkRfQVJSQVlfTEVOR1RIX05WICAgICAgMHg4RjMyCisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfTEVOR1RIX05WICAgICAgICAweDhGMzMKKyNkZWZpbmUgR0xfRFJBV19JTkRJUkVDVF9VTklGSUVEX05WICAgICAgIDB4OEY0MAorI2RlZmluZSBHTF9EUkFXX0lORElSRUNUX0FERFJFU1NfTlYgICAgICAgMHg4RjQxCisjZGVmaW5lIEdMX0RSQVdfSU5ESVJFQ1RfTEVOR1RIX05WICAgICAgICAweDhGNDIKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfYmFycmllcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX3NoYWRlcl9zdGVuY2lsX2V4cG9ydAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX3NlYW1sZXNzX2N1YmVtYXBfcGVyX3RleHR1cmUKKy8qIHJldXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfU0VBTUxFU1MgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF9jb25zZXJ2YXRpdmVfZGVwdGgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZQorI2RlZmluZSBHTF9NQVhfSU1BR0VfVU5JVFNfRVhUICAgICAgICAgICAgMHg4RjM4CisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9JTUFHRV9VTklUU19BTkRfRlJBR01FTlRfT1VUUFVUU19FWFQgMHg4RjM5CisjZGVmaW5lIEdMX0lNQUdFX0JJTkRJTkdfTkFNRV9FWFQgICAgICAgICAweDhGM0EKKyNkZWZpbmUgR0xfSU1BR0VfQklORElOR19MRVZFTF9FWFQgICAgICAgIDB4OEYzQgorI2RlZmluZSBHTF9JTUFHRV9CSU5ESU5HX0xBWUVSRURfRVhUICAgICAgMHg4RjNDCisjZGVmaW5lIEdMX0lNQUdFX0JJTkRJTkdfTEFZRVJfRVhUICAgICAgICAweDhGM0QKKyNkZWZpbmUgR0xfSU1BR0VfQklORElOR19BQ0NFU1NfRVhUICAgICAgIDB4OEYzRQorI2RlZmluZSBHTF9JTUFHRV8xRF9FWFQgICAgICAgICAgICAgICAgICAgMHg5MDRDCisjZGVmaW5lIEdMX0lNQUdFXzJEX0VYVCAgICAgICAgICAgICAgICAgICAweDkwNEQKKyNkZWZpbmUgR0xfSU1BR0VfM0RfRVhUICAgICAgICAgICAgICAgICAgIDB4OTA0RQorI2RlZmluZSBHTF9JTUFHRV8yRF9SRUNUX0VYVCAgICAgICAgICAgICAgMHg5MDRGCisjZGVmaW5lIEdMX0lNQUdFX0NVQkVfRVhUICAgICAgICAgICAgICAgICAweDkwNTAKKyNkZWZpbmUgR0xfSU1BR0VfQlVGRkVSX0VYVCAgICAgICAgICAgICAgIDB4OTA1MQorI2RlZmluZSBHTF9JTUFHRV8xRF9BUlJBWV9FWFQgICAgICAgICAgICAgMHg5MDUyCisjZGVmaW5lIEdMX0lNQUdFXzJEX0FSUkFZX0VYVCAgICAgICAgICAgICAweDkwNTMKKyNkZWZpbmUgR0xfSU1BR0VfQ1VCRV9NQVBfQVJSQVlfRVhUICAgICAgIDB4OTA1NAorI2RlZmluZSBHTF9JTUFHRV8yRF9NVUxUSVNBTVBMRV9FWFQgICAgICAgMHg5MDU1CisjZGVmaW5lIEdMX0lNQUdFXzJEX01VTFRJU0FNUExFX0FSUkFZX0VYVCAweDkwNTYKKyNkZWZpbmUgR0xfSU5UX0lNQUdFXzFEX0VYVCAgICAgICAgICAgICAgIDB4OTA1NworI2RlZmluZSBHTF9JTlRfSU1BR0VfMkRfRVhUICAgICAgICAgICAgICAgMHg5MDU4CisjZGVmaW5lIEdMX0lOVF9JTUFHRV8zRF9FWFQgICAgICAgICAgICAgICAweDkwNTkKKyNkZWZpbmUgR0xfSU5UX0lNQUdFXzJEX1JFQ1RfRVhUICAgICAgICAgIDB4OTA1QQorI2RlZmluZSBHTF9JTlRfSU1BR0VfQ1VCRV9FWFQgICAgICAgICAgICAgMHg5MDVCCisjZGVmaW5lIEdMX0lOVF9JTUFHRV9CVUZGRVJfRVhUICAgICAgICAgICAweDkwNUMKKyNkZWZpbmUgR0xfSU5UX0lNQUdFXzFEX0FSUkFZX0VYVCAgICAgICAgIDB4OTA1RAorI2RlZmluZSBHTF9JTlRfSU1BR0VfMkRfQVJSQVlfRVhUICAgICAgICAgMHg5MDVFCisjZGVmaW5lIEdMX0lOVF9JTUFHRV9DVUJFX01BUF9BUlJBWV9FWFQgICAweDkwNUYKKyNkZWZpbmUgR0xfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFX0VYVCAgIDB4OTA2MAorI2RlZmluZSBHTF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEVfQVJSQVlfRVhUIDB4OTA2MQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMURfRVhUICAgICAgMHg5MDYyCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRF9FWFQgICAgICAweDkwNjMKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzNEX0VYVCAgICAgIDB4OTA2NAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfUkVDVF9FWFQgMHg5MDY1CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV9DVUJFX0VYVCAgICAweDkwNjYKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFX0JVRkZFUl9FWFQgIDB4OTA2NworI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMURfQVJSQVlfRVhUIDB4OTA2OAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfQVJSQVlfRVhUIDB4OTA2OQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfQ1VCRV9NQVBfQVJSQVlfRVhUIDB4OTA2QQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEVfRVhUIDB4OTA2QgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEVfQVJSQVlfRVhUIDB4OTA2QworI2RlZmluZSBHTF9NQVhfSU1BR0VfU0FNUExFU19FWFQgICAgICAgICAgMHg5MDZECisjZGVmaW5lIEdMX0lNQUdFX0JJTkRJTkdfRk9STUFUX0VYVCAgICAgICAweDkwNkUKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CQVJSSUVSX0JJVF9FWFQgMHgwMDAwMDAwMQorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JBUlJJRVJfQklUX0VYVCAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF9VTklGT1JNX0JBUlJJRVJfQklUX0VYVCAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF9URVhUVVJFX0ZFVENIX0JBUlJJRVJfQklUX0VYVCAgMHgwMDAwMDAwOAorI2RlZmluZSBHTF9TSEFERVJfSU1BR0VfQUNDRVNTX0JBUlJJRVJfQklUX0VYVCAweDAwMDAwMDIwCisjZGVmaW5lIEdMX0NPTU1BTkRfQkFSUklFUl9CSVRfRVhUICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEdMX1BJWEVMX0JVRkZFUl9CQVJSSUVSX0JJVF9FWFQgICAweDAwMDAwMDgwCisjZGVmaW5lIEdMX1RFWFRVUkVfVVBEQVRFX0JBUlJJRVJfQklUX0VYVCAweDAwMDAwMTAwCisjZGVmaW5lIEdMX0JVRkZFUl9VUERBVEVfQkFSUklFUl9CSVRfRVhUICAweDAwMDAwMjAwCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0JBUlJJRVJfQklUX0VYVCAgICAweDAwMDAwNDAwCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CQVJSSUVSX0JJVF9FWFQgMHgwMDAwMDgwMAorI2RlZmluZSBHTF9BVE9NSUNfQ09VTlRFUl9CQVJSSUVSX0JJVF9FWFQgMHgwMDAwMTAwMAorI2RlZmluZSBHTF9BTExfQkFSUklFUl9CSVRTX0VYVCAgICAgICAgICAgMHhGRkZGRkZGRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF9hdHRyaWJfNjRiaXQKKy8qIHJldXNlIEdMX0RPVUJMRSAqLworI2RlZmluZSBHTF9ET1VCTEVfVkVDMl9FWFQgICAgICAgICAgICAgICAgMHg4RkZDCisjZGVmaW5lIEdMX0RPVUJMRV9WRUMzX0VYVCAgICAgICAgICAgICAgICAweDhGRkQKKyNkZWZpbmUgR0xfRE9VQkxFX1ZFQzRfRVhUICAgICAgICAgICAgICAgIDB4OEZGRQorI2RlZmluZSBHTF9ET1VCTEVfTUFUMl9FWFQgICAgICAgICAgICAgICAgMHg4RjQ2CisjZGVmaW5lIEdMX0RPVUJMRV9NQVQzX0VYVCAgICAgICAgICAgICAgICAweDhGNDcKKyNkZWZpbmUgR0xfRE9VQkxFX01BVDRfRVhUICAgICAgICAgICAgICAgIDB4OEY0OAorI2RlZmluZSBHTF9ET1VCTEVfTUFUMngzX0VYVCAgICAgICAgICAgICAgMHg4RjQ5CisjZGVmaW5lIEdMX0RPVUJMRV9NQVQyeDRfRVhUICAgICAgICAgICAgICAweDhGNEEKKyNkZWZpbmUgR0xfRE9VQkxFX01BVDN4Ml9FWFQgICAgICAgICAgICAgIDB4OEY0QgorI2RlZmluZSBHTF9ET1VCTEVfTUFUM3g0X0VYVCAgICAgICAgICAgICAgMHg4RjRDCisjZGVmaW5lIEdMX0RPVUJMRV9NQVQ0eDJfRVhUICAgICAgICAgICAgICAweDhGNEQKKyNkZWZpbmUgR0xfRE9VQkxFX01BVDR4M19FWFQgICAgICAgICAgICAgIDB4OEY0RQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZ3B1X3Byb2dyYW01CisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9QUk9HUkFNX0lOVk9DQVRJT05TX05WIDB4OEU1QQorI2RlZmluZSBHTF9NSU5fRlJBR01FTlRfSU5URVJQT0xBVElPTl9PRkZTRVRfTlYgMHg4RTVCCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9JTlRFUlBPTEFUSU9OX09GRlNFVF9OViAweDhFNUMKKyNkZWZpbmUgR0xfRlJBR01FTlRfUFJPR1JBTV9JTlRFUlBPTEFUSU9OX09GRlNFVF9CSVRTX05WIDB4OEU1RAorI2RlZmluZSBHTF9NSU5fUFJPR1JBTV9URVhUVVJFX0dBVEhFUl9PRkZTRVRfTlYgMHg4RTVFCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1RFWFRVUkVfR0FUSEVSX09GRlNFVF9OViAweDhFNUYKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fU1VCUk9VVElORV9QQVJBTUVURVJTX05WIDB4OEY0NAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9TVUJST1VUSU5FX05VTV9OViAgMHg4RjQ1CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9ncHVfc2hhZGVyNQorI2RlZmluZSBHTF9JTlQ2NF9OViAgICAgICAgICAgICAgICAgICAgICAgMHgxNDBFCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVDY0X05WICAgICAgICAgICAgICAweDE0MEYKKyNkZWZpbmUgR0xfSU5UOF9OViAgICAgICAgICAgICAgICAgICAgICAgIDB4OEZFMAorI2RlZmluZSBHTF9JTlQ4X1ZFQzJfTlYgICAgICAgICAgICAgICAgICAgMHg4RkUxCisjZGVmaW5lIEdMX0lOVDhfVkVDM19OViAgICAgICAgICAgICAgICAgICAweDhGRTIKKyNkZWZpbmUgR0xfSU5UOF9WRUM0X05WICAgICAgICAgICAgICAgICAgIDB4OEZFMworI2RlZmluZSBHTF9JTlQxNl9OViAgICAgICAgICAgICAgICAgICAgICAgMHg4RkU0CisjZGVmaW5lIEdMX0lOVDE2X1ZFQzJfTlYgICAgICAgICAgICAgICAgICAweDhGRTUKKyNkZWZpbmUgR0xfSU5UMTZfVkVDM19OViAgICAgICAgICAgICAgICAgIDB4OEZFNgorI2RlZmluZSBHTF9JTlQxNl9WRUM0X05WICAgICAgICAgICAgICAgICAgMHg4RkU3CisjZGVmaW5lIEdMX0lOVDY0X1ZFQzJfTlYgICAgICAgICAgICAgICAgICAweDhGRTkKKyNkZWZpbmUgR0xfSU5UNjRfVkVDM19OViAgICAgICAgICAgICAgICAgIDB4OEZFQQorI2RlZmluZSBHTF9JTlQ2NF9WRUM0X05WICAgICAgICAgICAgICAgICAgMHg4RkVCCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVDhfTlYgICAgICAgICAgICAgICAweDhGRUMKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UOF9WRUMyX05WICAgICAgICAgIDB4OEZFRAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlQ4X1ZFQzNfTlYgICAgICAgICAgMHg4RkVFCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVDhfVkVDNF9OViAgICAgICAgICAweDhGRUYKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UMTZfTlYgICAgICAgICAgICAgIDB4OEZGMAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlQxNl9WRUMyX05WICAgICAgICAgMHg4RkYxCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVDE2X1ZFQzNfTlYgICAgICAgICAweDhGRjIKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UMTZfVkVDNF9OViAgICAgICAgIDB4OEZGMworI2RlZmluZSBHTF9VTlNJR05FRF9JTlQ2NF9WRUMyX05WICAgICAgICAgMHg4RkY1CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVDY0X1ZFQzNfTlYgICAgICAgICAweDhGRjYKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UNjRfVkVDNF9OViAgICAgICAgIDB4OEZGNworI2RlZmluZSBHTF9GTE9BVDE2X05WICAgICAgICAgICAgICAgICAgICAgMHg4RkY4CisjZGVmaW5lIEdMX0ZMT0FUMTZfVkVDMl9OViAgICAgICAgICAgICAgICAweDhGRjkKKyNkZWZpbmUgR0xfRkxPQVQxNl9WRUMzX05WICAgICAgICAgICAgICAgIDB4OEZGQQorI2RlZmluZSBHTF9GTE9BVDE2X1ZFQzRfTlYgICAgICAgICAgICAgICAgMHg4RkZCCisvKiByZXVzZSBHTF9QQVRDSEVTICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9zaGFkZXJfYnVmZmVyX3N0b3JlCisjZGVmaW5lIEdMX1NIQURFUl9HTE9CQUxfQUNDRVNTX0JBUlJJRVJfQklUX05WIDB4MDAwMDAwMTAKKy8qIHJldXNlIEdMX1JFQURfV1JJVEUgKi8KKy8qIHJldXNlIEdMX1dSSVRFX09OTFkgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3Rlc3NlbGxhdGlvbl9wcm9ncmFtNQorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9QQVRDSF9BVFRSSUJTX05WICAgMHg4NkQ4CisjZGVmaW5lIEdMX1RFU1NfQ09OVFJPTF9QUk9HUkFNX05WICAgICAgICAweDg5MUUKKyNkZWZpbmUgR0xfVEVTU19FVkFMVUFUSU9OX1BST0dSQU1fTlYgICAgIDB4ODkxRgorI2RlZmluZSBHTF9URVNTX0NPTlRST0xfUFJPR1JBTV9QQVJBTUVURVJfQlVGRkVSX05WIDB4OEM3NAorI2RlZmluZSBHTF9URVNTX0VWQUxVQVRJT05fUFJPR1JBTV9QQVJBTUVURVJfQlVGRkVSX05WIDB4OEM3NQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X2F0dHJpYl9pbnRlZ2VyXzY0Yml0CisvKiByZXVzZSBHTF9JTlQ2NF9OViAqLworLyogcmV1c2UgR0xfVU5TSUdORURfSU5UNjRfTlYgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX211bHRpc2FtcGxlX2NvdmVyYWdlCisjZGVmaW5lIEdMX0NPVkVSQUdFX1NBTVBMRVNfTlYgICAgICAgICAgICAweDgwQTkKKyNkZWZpbmUgR0xfQ09MT1JfU0FNUExFU19OViAgICAgICAgICAgICAgIDB4OEUyMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX25hbWVfZ2VuX2RlbGV0ZQorI2RlZmluZSBHTF9EQVRBX0JVRkZFUl9BTUQgICAgICAgICAgICAgICAgMHg5MTUxCisjZGVmaW5lIEdMX1BFUkZPUk1BTkNFX01PTklUT1JfQU1EICAgICAgICAweDkxNTIKKyNkZWZpbmUgR0xfUVVFUllfT0JKRUNUX0FNRCAgICAgICAgICAgICAgIDB4OTE1MworI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfT0JKRUNUX0FNRCAgICAgICAgMHg5MTU0CisjZGVmaW5lIEdMX1NBTVBMRVJfT0JKRUNUX0FNRCAgICAgICAgICAgICAweDkxNTUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF9kZWJ1Z19vdXRwdXQKKyNkZWZpbmUgR0xfTUFYX0RFQlVHX0xPR0dFRF9NRVNTQUdFU19BTUQgIDB4OTE0NAorI2RlZmluZSBHTF9ERUJVR19MT0dHRURfTUVTU0FHRVNfQU1EICAgICAgMHg5MTQ1CisjZGVmaW5lIEdMX0RFQlVHX1NFVkVSSVRZX0hJR0hfQU1EICAgICAgICAweDkxNDYKKyNkZWZpbmUgR0xfREVCVUdfU0VWRVJJVFlfTUVESVVNX0FNRCAgICAgIDB4OTE0NworI2RlZmluZSBHTF9ERUJVR19TRVZFUklUWV9MT1dfQU1EICAgICAgICAgMHg5MTQ4CisjZGVmaW5lIEdMX0RFQlVHX0NBVEVHT1JZX0FQSV9FUlJPUl9BTUQgICAweDkxNDkKKyNkZWZpbmUgR0xfREVCVUdfQ0FURUdPUllfV0lORE9XX1NZU1RFTV9BTUQgMHg5MTRBCisjZGVmaW5lIEdMX0RFQlVHX0NBVEVHT1JZX0RFUFJFQ0FUSU9OX0FNRCAweDkxNEIKKyNkZWZpbmUgR0xfREVCVUdfQ0FURUdPUllfVU5ERUZJTkVEX0JFSEFWSU9SX0FNRCAweDkxNEMKKyNkZWZpbmUgR0xfREVCVUdfQ0FURUdPUllfUEVSRk9STUFOQ0VfQU1EIDB4OTE0RAorI2RlZmluZSBHTF9ERUJVR19DQVRFR09SWV9TSEFERVJfQ09NUElMRVJfQU1EIDB4OTE0RQorI2RlZmluZSBHTF9ERUJVR19DQVRFR09SWV9BUFBMSUNBVElPTl9BTUQgMHg5MTRGCisjZGVmaW5lIEdMX0RFQlVHX0NBVEVHT1JZX09USEVSX0FNRCAgICAgICAweDkxNTAKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZkcGF1X2ludGVyb3AKKyNkZWZpbmUgR0xfU1VSRkFDRV9TVEFURV9OViAgICAgICAgICAgICAgIDB4ODZFQgorI2RlZmluZSBHTF9TVVJGQUNFX1JFR0lTVEVSRURfTlYgICAgICAgICAgMHg4NkZECisjZGVmaW5lIEdMX1NVUkZBQ0VfTUFQUEVEX05WICAgICAgICAgICAgICAweDg3MDAKKyNkZWZpbmUgR0xfV1JJVEVfRElTQ0FSRF9OViAgICAgICAgICAgICAgIDB4ODhCRQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX3RyYW5zZm9ybV9mZWVkYmFjazNfbGluZXNfdHJpYW5nbGVzCisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfZGVwdGhfY2xhbXBfc2VwYXJhdGUKKyNkZWZpbmUgR0xfREVQVEhfQ0xBTVBfTkVBUl9BTUQgICAgICAgICAgIDB4OTAxRQorI2RlZmluZSBHTF9ERVBUSF9DTEFNUF9GQVJfQU1EICAgICAgICAgICAgMHg5MDFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zUkdCX2RlY29kZQorI2RlZmluZSBHTF9URVhUVVJFX1NSR0JfREVDT0RFX0VYVCAgICAgICAgMHg4QTQ4CisjZGVmaW5lIEdMX0RFQ09ERV9FWFQgICAgICAgICAgICAgICAgICAgICAweDhBNDkKKyNkZWZpbmUgR0xfU0tJUF9ERUNPREVfRVhUICAgICAgICAgICAgICAgIDB4OEE0QQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9URVhUVVJFX0NPVkVSQUdFX1NBTVBMRVNfTlYgICAgMHg5MDQ1CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09MT1JfU0FNUExFU19OViAgICAgICAweDkwNDYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF9ibGVuZF9taW5tYXhfZmFjdG9yCisjZGVmaW5lIEdMX0ZBQ1RPUl9NSU5fQU1EICAgICAgICAgICAgICAgICAweDkwMUMKKyNkZWZpbmUgR0xfRkFDVE9SX01BWF9BTUQgICAgICAgICAgICAgICAgIDB4OTAxRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX3NhbXBsZV9wb3NpdGlvbnMKKyNkZWZpbmUgR0xfU1VCU0FNUExFX0RJU1RBTkNFX0FNRCAgICAgICAgIDB4ODgzRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3gxMV9zeW5jX29iamVjdAorI2RlZmluZSBHTF9TWU5DX1gxMV9GRU5DRV9FWFQgICAgICAgICAgICAgMHg5MEUxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfbXVsdGlfZHJhd19pbmRpcmVjdAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlX2JsaXRfc2NhbGVkCisjZGVmaW5lIEdMX1NDQUxFRF9SRVNPTFZFX0ZBU1RFU1RfRVhUICAgICAweDkwQkEKKyNkZWZpbmUgR0xfU0NBTEVEX1JFU09MVkVfTklDRVNUX0VYVCAgICAgIDB4OTBCQgorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZm5kZWYgR0xfVkVSU0lPTl8yXzAKKy8qIEdMIHR5cGUgZm9yIHByb2dyYW0vc2hhZGVyIHRleHQgKi8KK3R5cGVkZWYgY2hhciBHTGNoYXI7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfNQorLyogR0wgdHlwZXMgZm9yIGhhbmRsaW5nIGxhcmdlIHZlcnRleCBidWZmZXIgb2JqZWN0cyAqLwordHlwZWRlZiBwdHJkaWZmX3QgR0xpbnRwdHI7Cit0eXBlZGVmIHB0cmRpZmZfdCBHTHNpemVpcHRyOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0CisvKiBHTCB0eXBlcyBmb3IgaGFuZGxpbmcgbGFyZ2UgdmVydGV4IGJ1ZmZlciBvYmplY3RzICovCit0eXBlZGVmIHB0cmRpZmZfdCBHTGludHB0ckFSQjsKK3R5cGVkZWYgcHRyZGlmZl90IEdMc2l6ZWlwdHJBUkI7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGVyX29iamVjdHMKKy8qIEdMIHR5cGVzIGZvciBwcm9ncmFtL3NoYWRlciB0ZXh0IGFuZCBzaGFkZXIgb2JqZWN0IGhhbmRsZXMgKi8KK3R5cGVkZWYgY2hhciBHTGNoYXJBUkI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBHTGhhbmRsZUFSQjsKKyNlbmRpZgorCisvKiBHTCB0eXBlIGZvciAiaGFsZiIgcHJlY2lzaW9uIChzMTBlNSkgZmxvYXQgZGF0YSBpbiBob3N0IG1lbW9yeSAqLworI2lmbmRlZiBHTF9BUkJfaGFsZl9mbG9hdF9waXhlbAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBHTGhhbGZBUkI7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9oYWxmX2Zsb2F0Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IEdMaGFsZk5WOworI2VuZGlmCisKKyNpZm5kZWYgR0xFWFRfNjRfVFlQRVNfREVGSU5FRAorLyogVGhpcyBjb2RlIGJsb2NrIGlzIGR1cGxpY2F0ZWQgaW4gZ2x4ZXh0LmgsIHNvIG11c3QgYmUgcHJvdGVjdGVkICovCisjZGVmaW5lIEdMRVhUXzY0X1RZUEVTX0RFRklORUQKKy8qIERlZmluZSBpbnQzMl90LCBpbnQ2NF90LCBhbmQgdWludDY0X3QgdHlwZXMgZm9yIFVTVC9NU0MgKi8KKy8qIChhcyB1c2VkIGluIHRoZSBHTF9FWFRfdGltZXJfcXVlcnkgZXh0ZW5zaW9uKS4gKi8KKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBkZWZpbmVkKF9fc3VuX18pIHx8IGRlZmluZWQoX19kaWdpdGFsX18pCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpZiBkZWZpbmVkKF9fU1REQ19fKQorI2lmIGRlZmluZWQoX19hcmNoNjRfXykgfHwgZGVmaW5lZChfTFA2NCkKK3R5cGVkZWYgbG9uZyBpbnQgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgdWludDY0X3Q7CisjZWxzZQordHlwZWRlZiBsb25nIGxvbmcgaW50IGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgdWludDY0X3Q7CisjZW5kaWYgLyogX19hcmNoNjRfXyAqLworI2VuZGlmIC8qIF9fU1REQ19fICovCisjZWxpZiBkZWZpbmVkKCBfX1ZNUyApIHx8IGRlZmluZWQoX19zZ2kpCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbGlmIGRlZmluZWQoX19TQ09fXykgfHwgZGVmaW5lZChfX1VTTENfXykKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbGlmIGRlZmluZWQoX19VTklYT1MyX18pIHx8IGRlZmluZWQoX19TT0w2NF9fKQordHlwZWRlZiBsb25nIGludCBpbnQzMl90OwordHlwZWRlZiBsb25nIGxvbmcgaW50IGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgdWludDY0X3Q7CisjZWxpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChfX0dOVUNfXykKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbGlmIGRlZmluZWQoX1dJTjMyKQordHlwZWRlZiBfX2ludDMyIGludDMyX3Q7Cit0eXBlZGVmIF9faW50NjQgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjRfdDsKKyNlbHNlCisvKiBGYWxsYmFjayBpZiBub3RoaW5nIGFib3ZlIHdvcmtzICovCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RpbWVyX3F1ZXJ5Cit0eXBlZGVmIGludDY0X3QgR0xpbnQ2NEVYVDsKK3R5cGVkZWYgdWludDY0X3QgR0x1aW50NjRFWFQ7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc3luYwordHlwZWRlZiBpbnQ2NF90IEdMaW50NjQ7Cit0eXBlZGVmIHVpbnQ2NF90IEdMdWludDY0OwordHlwZWRlZiBzdHJ1Y3QgX19HTHN5bmMgKkdMc3luYzsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9jbF9ldmVudAorLyogVGhlc2UgaW5jb21wbGV0ZSB0eXBlcyBsZXQgdXMgZGVjbGFyZSB0eXBlcyBjb21wYXRpYmxlIHdpdGggT3BlbkNMJ3MgY2xfY29udGV4dCBhbmQgY2xfZXZlbnQgKi8KK3N0cnVjdCBfY2xfY29udGV4dDsKK3N0cnVjdCBfY2xfZXZlbnQ7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZGVidWdfb3V0cHV0Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZICpHTERFQlVHUFJPQ0FSQikoR0xlbnVtIHNvdXJjZSxHTGVudW0gdHlwZSxHTHVpbnQgaWQsR0xlbnVtIHNldmVyaXR5LEdMc2l6ZWkgbGVuZ3RoLGNvbnN0IEdMY2hhciAqbWVzc2FnZSxHTHZvaWQgKnVzZXJQYXJhbSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfZGVidWdfb3V0cHV0Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZICpHTERFQlVHUFJPQ0FNRCkoR0x1aW50IGlkLEdMZW51bSBjYXRlZ29yeSxHTGVudW0gc2V2ZXJpdHksR0xzaXplaSBsZW5ndGgsY29uc3QgR0xjaGFyICptZXNzYWdlLEdMdm9pZCAqdXNlclBhcmFtKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZkcGF1X2ludGVyb3AKK3R5cGVkZWYgR0xpbnRwdHIgR0x2ZHBhdVN1cmZhY2VOVjsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV8yCisjZGVmaW5lIEdMX1ZFUlNJT05fMV8yIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRDb2xvciAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRXF1YXRpb24gKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3UmFuZ2VFbGVtZW50cyAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4SW1hZ2UzRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN1YkltYWdlM0QgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UzRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5EQ09MT1JQUk9DKSAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OUFJPQykgKEdMZW51bSBtb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV1JBTkdFRUxFTUVOVFNQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWElNQUdFM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhTVUJJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWVRFWFNVQklNQUdFM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV8yX0RFUFJFQ0FURUQKKyNkZWZpbmUgR0xfVkVSU0lPTl8xXzJfREVQUkVDQVRFRCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yVGFibGUgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqdGFibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yVGFibGVQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yVGFibGVQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29sb3JUYWJsZSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0YWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yU3ViVGFibGUgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc3RhcnQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlDb2xvclN1YlRhYmxlIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHN0YXJ0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvbkZpbHRlcjFEIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmltYWdlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvbkZpbHRlcjJEIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbWFnZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIxRCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIyRCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25GaWx0ZXIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKmltYWdlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb252b2x1dGlvblBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTZXBhcmFibGVGaWx0ZXIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnJvdywgR0x2b2lkICpjb2x1bW4sIEdMdm9pZCAqc3Bhbik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2VwYXJhYmxlRmlsdGVyMkQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnJvdywgY29uc3QgR0x2b2lkICpjb2x1bW4pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEhpc3RvZ3JhbSAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp2YWx1ZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SGlzdG9ncmFtUGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWlubWF4IChHTGVudW0gdGFyZ2V0LCBHTGJvb2xlYW4gcmVzZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnZhbHVlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWlubWF4UGFyYW1ldGVyZnYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNaW5tYXhQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xIaXN0b2dyYW0gKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xib29sZWFuIHNpbmspOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1pbm1heCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGJvb2xlYW4gc2luayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVzZXRIaXN0b2dyYW0gKEdMZW51bSB0YXJnZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlc2V0TWlubWF4IChHTGVudW0gdGFyZ2V0KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SVEFCTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICp0YWJsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SVEFCTEVQQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SVEFCTEVQQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZQ09MT1JUQUJMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT0xPUlRBQkxFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRhYmxlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVBBUkFNRVRFUkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVBBUkFNRVRFUklWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SU1VCVEFCTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzdGFydCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT0xPUlNVQlRBQkxFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc3RhcnQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTkZJTFRFUjFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW1hZ2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTkZJTFRFUjJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmltYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05QQVJBTUVURVJGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05QQVJBTUVURVJJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05QQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZQ09OVk9MVVRJT05GSUxURVIxRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZQ09OVk9MVVRJT05GSUxURVIyRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09OVk9MVVRJT05GSUxURVJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqaW1hZ2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT05WT0xVVElPTlBBUkFNRVRFUkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09OVk9MVVRJT05QQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRTRVBBUkFCTEVGSUxURVJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcm93LCBHTHZvaWQgKmNvbHVtbiwgR0x2b2lkICpzcGFuKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VQQVJBQkxFRklMVEVSMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcm93LCBjb25zdCBHTHZvaWQgKmNvbHVtbik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEhJU1RPR1JBTVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGJvb2xlYW4gcmVzZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnZhbHVlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEhJU1RPR1JBTVBBUkFNRVRFUkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSElTVE9HUkFNUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUlOTUFYUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdmFsdWVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUlOTUFYUEFSQU1FVEVSRlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNSU5NQVhQQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xISVNUT0dSQU1QUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGJvb2xlYW4gc2luayk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1JTk1BWFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMYm9vbGVhbiBzaW5rKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVTRVRISVNUT0dSQU1QUk9DKSAoR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFU0VUTUlOTUFYUFJPQykgKEdMZW51bSB0YXJnZXQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzMKKyNkZWZpbmUgR0xfVkVSU0lPTl8xXzMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2UgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UzRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTFEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTNEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTFEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tcHJlc3NlZFRleEltYWdlIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0x2b2lkICppbWcpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQUNUSVZFVEVYVFVSRVBST0MpIChHTGVudW0gdGV4dHVyZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRUNPVkVSQUdFUFJPQykgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UxRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYU1VCSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYU1VCSU1BR0UyRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYU1VCSU1BR0UxRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTVBSRVNTRURURVhJTUFHRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0x2b2lkICppbWcpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzNfREVQUkVDQVRFRAorI2RlZmluZSBHTF9WRVJTSU9OXzFfM19ERVBSRUNBVEVEIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSAoR0xlbnVtIHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZCAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFkdiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWZ2IChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWkgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaXYgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMXMgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFzdiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmR2IChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJmIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJmdiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMml2IChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzdiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNkIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0LCBHTGRvdWJsZSByKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2R2IChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNmIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2Z2IChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2kgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQsIEdMaW50IHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaXYgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM3MgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0LCBHTHNob3J0IHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzc3YgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZCAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgciwgR0xkb3VibGUgcSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRkdiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGZ2IChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGkgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQsIEdMaW50IHIsIEdMaW50IHEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aXYgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHMgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0LCBHTHNob3J0IHIsIEdMc2hvcnQgcSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRzdiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRUcmFuc3Bvc2VNYXRyaXhkIChjb25zdCBHTGRvdWJsZSAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdFRyYW5zcG9zZU1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhkIChjb25zdCBHTGRvdWJsZSAqbSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTElFTlRBQ1RJVkVURVhUVVJFUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMURWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMVNWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQyRFZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMklQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQySVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMlNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMlNWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzRFZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0ZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzRlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDREUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIsIEdMZG91YmxlIHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENERWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByLCBHTGludCBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0U1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByLCBHTHNob3J0IHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFNWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMT0FEVFJBTlNQT1NFTUFUUklYRlBST0MpIChjb25zdCBHTGZsb2F0ICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRFRSQU5TUE9TRU1BVFJJWERQUk9DKSAoY29uc3QgR0xkb3VibGUgKm0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUVFJBTlNQT1NFTUFUUklYRlBST0MpIChjb25zdCBHTGZsb2F0ICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVFRSQU5TUE9TRU1BVFJJWERQUk9DKSAoY29uc3QgR0xkb3VibGUgKm0pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzQKKyNkZWZpbmUgR0xfVkVSU0lPTl8xXzQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSAoR0xlbnVtIHNmYWN0b3JSR0IsIEdMZW51bSBkZmFjdG9yUkdCLCBHTGVudW0gc2ZhY3RvckFscGhhLCBHTGVudW0gZGZhY3RvckFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aURyYXdBcnJheXMgKEdMZW51bSBtb2RlLCBjb25zdCBHTGludCAqZmlyc3QsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlEcmF3RWxlbWVudHMgKEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmYgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmdiAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyaSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJpdiAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ1NFUEFSQVRFUFJPQykgKEdMZW51bSBzZmFjdG9yUkdCLCBHTGVudW0gZGZhY3RvclJHQiwgR0xlbnVtIHNmYWN0b3JBbHBoYSwgR0xlbnVtIGRmYWN0b3JBbHBoYSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0FSUkFZU1BST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSURSQVdFTEVNRU5UU1BST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSRlBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZWUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJJUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUklWUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfNF9ERVBSRUNBVEVECisjZGVmaW5lIEdMX1ZFUlNJT05fMV80X0RFUFJFQ0FURUQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGYgKEdMZmxvYXQgY29vcmQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkZnYgKGNvbnN0IEdMZmxvYXQgKmNvb3JkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGQgKEdMZG91YmxlIGNvb3JkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGR2IChjb25zdCBHTGRvdWJsZSAqY29vcmQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkUG9pbnRlciAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2IgKEdMYnl0ZSByZWQsIEdMYnl0ZSBncmVlbiwgR0xieXRlIGJsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2J2IChjb25zdCBHTGJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2QgKEdMZG91YmxlIHJlZCwgR0xkb3VibGUgZ3JlZW4sIEdMZG91YmxlIGJsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2R2IChjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZiAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZnYgKGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2kgKEdMaW50IHJlZCwgR0xpbnQgZ3JlZW4sIEdMaW50IGJsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2l2IChjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzcyAoR0xzaG9ydCByZWQsIEdMc2hvcnQgZ3JlZW4sIEdMc2hvcnQgYmx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3Izc3YgKGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3ViIChHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1YnYgKGNvbnN0IEdMdWJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VpIChHTHVpbnQgcmVkLCBHTHVpbnQgZ3JlZW4sIEdMdWludCBibHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1aXYgKGNvbnN0IEdMdWludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdXMgKEdMdXNob3J0IHJlZCwgR0x1c2hvcnQgZ3JlZW4sIEdMdXNob3J0IGJsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VzdiAoY29uc3QgR0x1c2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yUG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJkIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZHYgKGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZiAoR0xmbG9hdCB4LCBHTGZsb2F0IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJmdiAoY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmkgKEdMaW50IHgsIEdMaW50IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJpdiAoY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJzIChHTHNob3J0IHgsIEdMc2hvcnQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMnN2IChjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZCAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2R2IChjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2YgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNmdiAoY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2kgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNpdiAoY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNzIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Mzc3YgKGNvbnN0IEdMc2hvcnQgKnYpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRGUFJPQykgKEdMZmxvYXQgY29vcmQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SREZWUFJPQykgKGNvbnN0IEdMZmxvYXQgKmNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkREUFJPQykgKEdMZG91YmxlIGNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkREVlBST0MpIChjb25zdCBHTGRvdWJsZSAqY29vcmQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SRFBPSU5URVJQUk9DKSAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNCUFJPQykgKEdMYnl0ZSByZWQsIEdMYnl0ZSBncmVlbiwgR0xieXRlIGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNCVlBST0MpIChjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNEUFJPQykgKEdMZG91YmxlIHJlZCwgR0xkb3VibGUgZ3JlZW4sIEdMZG91YmxlIGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNEVlBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0ZQUk9DKSAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0ZWUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNJUFJPQykgKEdMaW50IHJlZCwgR0xpbnQgZ3JlZW4sIEdMaW50IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNJVlBST0MpIChjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1NQUk9DKSAoR0xzaG9ydCByZWQsIEdMc2hvcnQgZ3JlZW4sIEdMc2hvcnQgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1NWUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVQlBST0MpIChHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUJWUFJPQykgKGNvbnN0IEdMdWJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVSVBST0MpIChHTHVpbnQgcmVkLCBHTHVpbnQgZ3JlZW4sIEdMdWludCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUlWUFJPQykgKGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VTUFJPQykgKEdMdXNob3J0IHJlZCwgR0x1c2hvcnQgZ3JlZW4sIEdMdXNob3J0IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVU1ZQUk9DKSAoY29uc3QgR0x1c2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUlBPSU5URVJQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRFBST0MpIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkRWUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkZQUk9DKSAoR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRlZQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJJUFJPQykgKEdMaW50IHgsIEdMaW50IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MySVZQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyU1BST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJTVlBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0RQUk9DKSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNEVlBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNGUFJPQykgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRlZQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNJUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzSVZQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzU1BST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM1NWUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzUKKyNkZWZpbmUgR0xfVkVSU0lPTl8xXzUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5RdWVyaWVzIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVRdWVyaWVzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUXVlcnkgKEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5RdWVyeSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmRRdWVyeSAoR0xlbnVtIHRhcmdldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRRdWVyeU9iamVjdGl2IChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3R1aXYgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEJ1ZmZlciAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlQnVmZmVycyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbkJ1ZmZlcnMgKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzQnVmZmVyIChHTHVpbnQgYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCdWZmZXJEYXRhIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCdWZmZXJTdWJEYXRhIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJTdWJEYXRhIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgR0x2b2lkICpkYXRhKTsKK0dMQVBJIEdMdm9pZCogQVBJRU5UUlkgZ2xNYXBCdWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsVW5tYXBCdWZmZXIgKEdMZW51bSB0YXJnZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJ1ZmZlclBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJ1ZmZlclBvaW50ZXJ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5RVUVSSUVTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVRVUVSSUVTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICppZHMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTUVVFUllQUk9DKSAoR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkVHSU5RVUVSWVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRRVUVSWVBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUVVFUllJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWU9CSkVDVElWUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUVVFUllPQkpFQ1RVSVZQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREJVRkZFUlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFQlVGRkVSU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTkJVRkZFUlNQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTQlVGRkVSUFJPQykgKEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCVUZGRVJEQVRBUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCVUZGRVJTVUJEQVRBUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJTVUJEQVRBUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiBHTHZvaWQqIChBUElFTlRSWVAgUEZOR0xNQVBCVUZGRVJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2Vzcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMVU5NQVBCVUZGRVJQUk9DKSAoR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEJVRkZFUlBBUkFNRVRFUklWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEJVRkZFUlBPSU5URVJWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMl8wCisjZGVmaW5lIEdMX1ZFUlNJT05fMl8wIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0J1ZmZlcnMgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsT3BTZXBhcmF0ZSAoR0xlbnVtIGZhY2UsIEdMZW51bSBzZmFpbCwgR0xlbnVtIGRwZmFpbCwgR0xlbnVtIGRwcGFzcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSAoR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsTWFza1NlcGFyYXRlIChHTGVudW0gZmFjZSwgR0x1aW50IG1hc2spOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEF0dGFjaFNoYWRlciAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRBdHRyaWJMb2NhdGlvbiAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21waWxlU2hhZGVyIChHTHVpbnQgc2hhZGVyKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbENyZWF0ZVByb2dyYW0gKHZvaWQpOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsQ3JlYXRlU2hhZGVyIChHTGVudW0gdHlwZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVNoYWRlciAoR0x1aW50IHNoYWRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGV0YWNoU2hhZGVyIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5IChHTHVpbnQgaW5kZXgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5IChHTHVpbnQgaW5kZXgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZUF0dHJpYiAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QWN0aXZlVW5pZm9ybSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QXR0YWNoZWRTaGFkZXJzIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBtYXhDb3VudCwgR0xzaXplaSAqY291bnQsIEdMdWludCAqb2JqKTsKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsR2V0QXR0cmliTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1pdiAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUluZm9Mb2cgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICppbmZvTG9nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTaGFkZXJpdiAoR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTaGFkZXJJbmZvTG9nIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICppbmZvTG9nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTaGFkZXJTb3VyY2UgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKnNvdXJjZSk7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbEdldFVuaWZvcm1Mb2NhdGlvbiAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VW5pZm9ybWZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VW5pZm9ybWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmR2IChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliZnYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYml2IChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwb2ludGVyKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNTaGFkZXIgKEdMdWludCBzaGFkZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpbmtQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyU291cmNlIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqICpzdHJpbmcsIGNvbnN0IEdMaW50ICpsZW5ndGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVzZVByb2dyYW0gKEdMdWludCBwcm9ncmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMmYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2YgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGZsb2F0IHYzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWkgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2kgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGkgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyLCBHTGludCB2Myk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMmZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0zZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMml2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2l2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4MmZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgzZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDRmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYWxpZGF0ZVByb2dyYW0gKEdMdWludCBwcm9ncmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZCAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZHYgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWZ2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFzIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMXN2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJkIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJkdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmYgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIycyAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMnN2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNkIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNkdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2YgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2Z2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNzIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNzdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TmJ2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5pdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5zdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnViIChHTHVpbnQgaW5kZXgsIEdMdWJ5dGUgeCwgR0x1Ynl0ZSB5LCBHTHVieXRlIHosIEdMdWJ5dGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51YnYgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51aXYgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnVzdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGJ2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGQgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGR2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZiAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0aXYgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHN2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjR1YnYgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHVpdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjR1c3YgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXIgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05TRVBBUkFURVBST0MpIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdCVUZGRVJTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RFTkNJTE9QU0VQQVJBVEVQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBzZmFpbCwgR0xlbnVtIGRwZmFpbCwgR0xlbnVtIGRwcGFzcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNURU5DSUxGVU5DU0VQQVJBVEVQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RFTkNJTE1BU0tTRVBBUkFURVBST0MpIChHTGVudW0gZmFjZSwgR0x1aW50IG1hc2spOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBVFRBQ0hTSEFERVJQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EQVRUUklCTE9DQVRJT05QUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUElMRVNIQURFUlBST0MpIChHTHVpbnQgc2hhZGVyKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xDUkVBVEVQUk9HUkFNUFJPQykgKHZvaWQpOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTENSRUFURVNIQURFUlBST0MpIChHTGVudW0gdHlwZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVBST0dSQU1QUk9DKSAoR0x1aW50IHByb2dyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVTSEFERVJQUk9DKSAoR0x1aW50IHNoYWRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFVEFDSFNIQURFUlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERJU0FCTEVWRVJURVhBVFRSSUJBUlJBWVBST0MpIChHTHVpbnQgaW5kZXgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkFCTEVWRVJURVhBVFRSSUJBUlJBWVBST0MpIChHTHVpbnQgaW5kZXgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVBVFRSSUJQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVVOSUZPUk1QUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFUVEFDSEVEU0hBREVSU1BST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBtYXhDb3VudCwgR0xzaXplaSAqY291bnQsIEdMdWludCAqb2JqKTsKK3R5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVEFUVFJJQkxPQ0FUSU9OUFJPQykgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNSVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1JTkZPTE9HUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICppbmZvTG9nKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0hBREVSSVZQUk9DKSAoR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0hBREVSSU5GT0xPR1BST0MpIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICppbmZvTG9nKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0hBREVSU09VUkNFUFJPQykgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKnNvdXJjZSk7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNTE9DQVRJT05QUk9DKSAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1GVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1JVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJEVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkZWUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJJVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQlBPSU5URVJWUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwb2ludGVyKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1BST0dSQU1QUk9DKSAoR0x1aW50IHByb2dyYW0pOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTU0hBREVSUFJPQykgKEdMdWludCBzaGFkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMSU5LUFJPR1JBTVBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNIQURFUlNPVVJDRVBST0MpIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqICpzdHJpbmcsIGNvbnN0IEdMaW50ICpsZW5ndGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVU0VQUk9HUkFNUFJPQykgKEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFGUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJGUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNGUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRGUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGZsb2F0IHYzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFJUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0ySVBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNJUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRJUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyLCBHTGludCB2Myk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xRlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0ZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00RlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFJVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJJVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNJVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRJVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDJGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYM0ZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVg0RlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFMSURBVEVQUk9HUkFNUFJPQykgKEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMURQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMURWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFGVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxU1BST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFTVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRFZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJGUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMlNQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRFZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzU1BST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzU1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5CVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROSVZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROU1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5VQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWJ5dGUgeCwgR0x1Ynl0ZSB5LCBHTHVieXRlIHosIEdMdWJ5dGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUJWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUlWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5VU1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRCVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjREUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjREVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNElWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0U1BST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRTVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VUJWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRVSVZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VVNWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQT0lOVEVSUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMl8xCisjZGVmaW5lIEdMX1ZFUlNJT05fMl8xIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDJ4M2Z2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgzeDJmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4Mng0ZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDR4MmZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgzeDRmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4NHgzZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYMlgzRlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDNYMkZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVgyWDRGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYNFgyRlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDNYNEZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVg0WDNGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8zXzAKKyNkZWZpbmUgR0xfVkVSU0lPTl8zXzAgMQorLyogT3BlbkdMIDMuMCBhbHNvIHJldXNlcyBlbnRyeSBwb2ludHMgZnJvbSB0aGVzZSBleHRlbnNpb25zOiAqLworLyogQVJCX2ZyYW1lYnVmZmVyX29iamVjdCAqLworLyogQVJCX21hcF9idWZmZXJfcmFuZ2UgKi8KKy8qIEFSQl92ZXJ0ZXhfYXJyYXlfb2JqZWN0ICovCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yTWFza2kgKEdMdWludCBpbmRleCwgR0xib29sZWFuIHIsIEdMYm9vbGVhbiBnLCBHTGJvb2xlYW4gYiwgR0xib29sZWFuIGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJvb2xlYW5pX3YgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xib29sZWFuICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnRlZ2VyaV92IChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMaW50ICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERpc2FibGVpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNFbmFibGVkaSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpblRyYW5zZm9ybUZlZWRiYWNrIChHTGVudW0gcHJpbWl0aXZlTW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kVHJhbnNmb3JtRmVlZGJhY2sgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRCdWZmZXJSYW5nZSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgYnVmZmVyLCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEJ1ZmZlckJhc2UgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncyAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciogKnZhcnlpbmdzLCBHTGVudW0gYnVmZmVyTW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xzaXplaSAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsYW1wQ29sb3IgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBjbGFtcCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5Db25kaXRpb25hbFJlbmRlciAoR0x1aW50IGlkLCBHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kQ29uZGl0aW9uYWxSZW5kZXIgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYklQb2ludGVyIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJJaXYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJJdWl2IChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkxaSAoR0x1aW50IGluZGV4LCBHTGludCB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMmkgKEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTNpIChHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0aSAoR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMXVpIChHTHVpbnQgaW5kZXgsIEdMdWludCB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMnVpIChHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTN1aSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNHVpIChHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHosIEdMdWludCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMWl2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMml2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJM2l2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNGl2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMXVpdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkydWl2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTN1aXYgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNHVpdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0YnYgKEdMdWludCBpbmRleCwgY29uc3QgR0xieXRlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNHN2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0dWJ2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0dXN2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdXNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtdWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kRnJhZ0RhdGFMb2NhdGlvbiAoR0x1aW50IHByb2dyYW0sIEdMdWludCBjb2xvciwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsR2V0RnJhZ0RhdGFMb2NhdGlvbiAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTF1aSAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJ1aSAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM3VpIChHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEsIEdMdWludCB2Mik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTR1aSAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIsIEdMdWludCB2Myk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTF1aXYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMnVpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0zdWl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTR1aXYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJJaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVySXVpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVySWl2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRleFBhcmFtZXRlckl1aXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyQnVmZmVyaXYgKEdMZW51bSBidWZmZXIsIEdMaW50IGRyYXdidWZmZXIsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJCdWZmZXJ1aXYgKEdMZW51bSBidWZmZXIsIEdMaW50IGRyYXdidWZmZXIsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyQnVmZmVyZnYgKEdMZW51bSBidWZmZXIsIEdMaW50IGRyYXdidWZmZXIsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckJ1ZmZlcmZpIChHTGVudW0gYnVmZmVyLCBHTGludCBkcmF3YnVmZmVyLCBHTGZsb2F0IGRlcHRoLCBHTGludCBzdGVuY2lsKTsKK0dMQVBJIGNvbnN0IEdMdWJ5dGUgKiBBUElFTlRSWSBnbEdldFN0cmluZ2kgKEdMZW51bSBuYW1lLCBHTHVpbnQgaW5kZXgpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JNQVNLSVBST0MpIChHTHVpbnQgaW5kZXgsIEdMYm9vbGVhbiByLCBHTGJvb2xlYW4gZywgR0xib29sZWFuIGIsIEdMYm9vbGVhbiBhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQk9PTEVBTklfVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMYm9vbGVhbiAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVElOVEVHRVJJX1ZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVOQUJMRUlQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRElTQUJMRUlQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0VOQUJMRURJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOVFJBTlNGT1JNRkVFREJBQ0tQUk9DKSAoR0xlbnVtIHByaW1pdGl2ZU1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRUUkFOU0ZPUk1GRUVEQkFDS1BST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREJVRkZFUlJBTkdFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EQlVGRkVSQkFTRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUUkFOU0ZPUk1GRUVEQkFDS1ZBUllJTkdTUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqICp2YXJ5aW5ncywgR0xlbnVtIGJ1ZmZlck1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRUUkFOU0ZPUk1GRUVEQkFDS1ZBUllJTkdQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMc2l6ZWkgKnNpemUsIEdMZW51bSAqdHlwZSwgR0xjaGFyICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xBTVBDT0xPUlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gY2xhbXApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTkNPTkRJVElPTkFMUkVOREVSUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIG1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRDT05ESVRJT05BTFJFTkRFUlBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSVBPSU5URVJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQklJVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQklVSVZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTFJUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkySVBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJM0lQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTRJUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkxVUlQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkyVUlQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJM1VJUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0VUlQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB6LCBHTHVpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkxSVZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkySVZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkzSVZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0SVZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkxVUlWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTJVSVZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJM1VJVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0VUlWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTRCVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0U1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTRVQlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTRVU1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1VSVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRGUkFHREFUQUxPQ0FUSU9OUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgY29sb3IsIGNvbnN0IEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRGUkFHREFUQUxPQ0FUSU9OUFJPQykgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMVVJUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMlVJUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zVUlQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNFVJUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyLCBHTHVpbnQgdjMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMVVJVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0yVUlWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNVSVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNFVJVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFBBUkFNRVRFUklJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhQQVJBTUVURVJJVUlWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhQQVJBTUVURVJJSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYUEFSQU1FVEVSSVVJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xFQVJCVUZGRVJJVlBST0MpIChHTGVudW0gYnVmZmVyLCBHTGludCBkcmF3YnVmZmVyLCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTEVBUkJVRkZFUlVJVlBST0MpIChHTGVudW0gYnVmZmVyLCBHTGludCBkcmF3YnVmZmVyLCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xFQVJCVUZGRVJGVlBST0MpIChHTGVudW0gYnVmZmVyLCBHTGludCBkcmF3YnVmZmVyLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENMRUFSQlVGRkVSRklQUk9DKSAoR0xlbnVtIGJ1ZmZlciwgR0xpbnQgZHJhd2J1ZmZlciwgR0xmbG9hdCBkZXB0aCwgR0xpbnQgc3RlbmNpbCk7Cit0eXBlZGVmIGNvbnN0IEdMdWJ5dGUgKiAoQVBJRU5UUllQIFBGTkdMR0VUU1RSSU5HSVBST0MpIChHTGVudW0gbmFtZSwgR0x1aW50IGluZGV4KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fM18xCisjZGVmaW5lIEdMX1ZFUlNJT05fM18xIDEKKy8qIE9wZW5HTCAzLjEgYWxzbyByZXVzZXMgZW50cnkgcG9pbnRzIGZyb20gdGhlc2UgZXh0ZW5zaW9uczogKi8KKy8qIEFSQl9jb3B5X2J1ZmZlciAqLworLyogQVJCX3VuaWZvcm1fYnVmZmVyX29iamVjdCAqLworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3QXJyYXlzSW5zdGFuY2VkIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3RWxlbWVudHNJbnN0YW5jZWQgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4QnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMdWludCBidWZmZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByaW1pdGl2ZVJlc3RhcnRJbmRleCAoR0x1aW50IGluZGV4KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdBUlJBWVNJTlNUQU5DRURQUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdFTEVNRU5UU0lOU1RBTkNFRFBST0MpIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhCVUZGRVJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJJTUlUSVZFUkVTVEFSVElOREVYUFJPQykgKEdMdWludCBpbmRleCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzNfMgorI2RlZmluZSBHTF9WRVJTSU9OXzNfMiAxCisvKiBPcGVuR0wgMy4yIGFsc28gcmV1c2VzIGVudHJ5IHBvaW50cyBmcm9tIHRoZXNlIGV4dGVuc2lvbnM6ICovCisvKiBBUkJfZHJhd19lbGVtZW50c19iYXNlX3ZlcnRleCAqLworLyogQVJCX3Byb3Zva2luZ192ZXJ0ZXggKi8KKy8qIEFSQl9zeW5jICovCisvKiBBUkJfdGV4dHVyZV9tdWx0aXNhbXBsZSAqLworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnRlZ2VyNjRpX3YgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQ2NCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QnVmZmVyUGFyYW1ldGVyaTY0diAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludDY0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTlRFR0VSNjRJX1ZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludDY0ICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSUEFSQU1FVEVSSTY0VlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50NjQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fM18zCisjZGVmaW5lIEdMX1ZFUlNJT05fM18zIDEKKy8qIE9wZW5HTCAzLjMgYWxzbyByZXVzZXMgZW50cnkgcG9pbnRzIGZyb20gdGhlc2UgZXh0ZW5zaW9uczogKi8KKy8qIEFSQl9ibGVuZF9mdW5jX2V4dGVuZGVkICovCisvKiBBUkJfc2FtcGxlcl9vYmplY3RzICovCisvKiBBUkJfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uLCBidXQgaXQgaGFzIG5vbmUgKi8KKy8qIEFSQl9vY2NsdXNpb25fcXVlcnkyIChubyBlbnRyeSBwb2ludHMpICovCisvKiBBUkJfc2hhZGVyX2JpdF9lbmNvZGluZyAobm8gZW50cnkgcG9pbnRzKSAqLworLyogQVJCX3RleHR1cmVfcmdiMTBfYTJ1aSAobm8gZW50cnkgcG9pbnRzKSAqLworLyogQVJCX3RleHR1cmVfc3dpenpsZSAobm8gZW50cnkgcG9pbnRzKSAqLworLyogQVJCX3RpbWVyX3F1ZXJ5ICovCisvKiBBUkJfdmVydGV4X3R5cGVfMl8xMF8xMF8xMF9yZXYgKi8KKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliRGl2aXNvciAoR0x1aW50IGluZGV4LCBHTHVpbnQgZGl2aXNvcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJESVZJU09SUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IGRpdmlzb3IpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl80XzAKKyNkZWZpbmUgR0xfVkVSU0lPTl80XzAgMQorLyogT3BlbkdMIDQuMCBhbHNvIHJldXNlcyBlbnRyeSBwb2ludHMgZnJvbSB0aGVzZSBleHRlbnNpb25zOiAqLworLyogQVJCX3RleHR1cmVfcXVlcnlfbG9kIChubyBlbnRyeSBwb2ludHMpICovCisvKiBBUkJfZHJhd19pbmRpcmVjdCAqLworLyogQVJCX2dwdV9zaGFkZXI1IChubyBlbnRyeSBwb2ludHMpICovCisvKiBBUkJfZ3B1X3NoYWRlcl9mcDY0ICovCisvKiBBUkJfc2hhZGVyX3N1YnJvdXRpbmUgKi8KKy8qIEFSQl90ZXNzZWxsYXRpb25fc2hhZGVyICovCisvKiBBUkJfdGV4dHVyZV9idWZmZXJfb2JqZWN0X3JnYjMyIChubyBlbnRyeSBwb2ludHMpICovCisvKiBBUkJfdGV4dHVyZV9jdWJlX21hcF9hcnJheSAobm8gZW50cnkgcG9pbnRzKSAqLworLyogQVJCX3RleHR1cmVfZ2F0aGVyIChubyBlbnRyeSBwb2ludHMpICovCisvKiBBUkJfdHJhbnNmb3JtX2ZlZWRiYWNrMiAqLworLyogQVJCX3RyYW5zZm9ybV9mZWVkYmFjazMgKi8KKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWluU2FtcGxlU2hhZGluZyAoR0xjbGFtcGYgdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRXF1YXRpb25pIChHTHVpbnQgYnVmLCBHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlaSAoR0x1aW50IGJ1ZiwgR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRnVuY2kgKEdMdWludCBidWYsIEdMZW51bSBzcmMsIEdMZW51bSBkc3QpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRnVuY1NlcGFyYXRlaSAoR0x1aW50IGJ1ZiwgR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUlOU0FNUExFU0hBRElOR1BST0MpIChHTGNsYW1wZiB2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05JUFJPQykgKEdMdWludCBidWYsIEdMZW51bSBtb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTlNFUEFSQVRFSVBST0MpIChHTHVpbnQgYnVmLCBHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ0lQUk9DKSAoR0x1aW50IGJ1ZiwgR0xlbnVtIHNyYywgR0xlbnVtIGRzdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ1NFUEFSQVRFSVBST0MpIChHTHVpbnQgYnVmLCBHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzRfMQorI2RlZmluZSBHTF9WRVJTSU9OXzRfMSAxCisvKiBPcGVuR0wgNC4xIHJldXNlcyBlbnRyeSBwb2ludHMgZnJvbSB0aGVzZSBleHRlbnNpb25zOiAqLworLyogQVJCX0VTMl9jb21wYXRpYmlsaXR5ICovCisvKiBBUkJfZ2V0X3Byb2dyYW1fYmluYXJ5ICovCisvKiBBUkJfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMgKi8KKy8qIEFSQl9zaGFkZXJfcHJlY2lzaW9uIChubyBlbnRyeSBwb2ludHMpICovCisvKiBBUkJfdmVydGV4X2F0dHJpYl82NGJpdCAqLworLyogQVJCX3ZpZXdwb3J0X2FycmF5ICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzRfMgorI2RlZmluZSBHTF9WRVJTSU9OXzRfMiAxCisvKiBPcGVuR0wgNC4yIHJldXNlcyBlbnRyeSBwb2ludHMgZnJvbSB0aGVzZSBleHRlbnNpb25zOiAqLworLyogQVJCX2Jhc2VfaW5zdGFuY2UgKi8KKy8qIEFSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2sgKG5vIGVudHJ5IHBvaW50cykgKi8KKy8qIEFSQl90cmFuc2Zvcm1fZmVlZGJhY2tfaW5zdGFuY2VkICovCisvKiBBUkJfY29tcHJlc3NlZF90ZXh0dXJlX3BpeGVsX3N0b3JhZ2UgKG5vIGVudHJ5IHBvaW50cykgKi8KKy8qIEFSQl9jb25zZXJ2YXRpdmVfZGVwdGggKG5vIGVudHJ5IHBvaW50cykgKi8KKy8qIEFSQl9pbnRlcm5hbGZvcm1hdF9xdWVyeSAqLworLyogQVJCX21hcF9idWZmZXJfYWxpZ25tZW50IChubyBlbnRyeSBwb2ludHMpICovCisvKiBBUkJfc2hhZGVyX2F0b21pY19jb3VudGVycyAqLworLyogQVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlICovCisvKiBBUkJfc2hhZGluZ19sYW5ndWFnZV9wYWNraW5nIChubyBlbnRyeSBwb2ludHMpICovCisvKiBBUkJfdGV4dHVyZV9zdG9yYWdlICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfbXVsdGl0ZXh0dXJlCisjZGVmaW5lIEdMX0FSQl9tdWx0aXRleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlQVJCIChHTGVudW0gdGV4dHVyZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xpZW50QWN0aXZlVGV4dHVyZUFSQiAoR0xlbnVtIHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZEFSQiAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFkdkFSQiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZkFSQiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWZ2QVJCIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWlBUkIgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaXZBUkIgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMXNBUkIgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFzdkFSQiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkQVJCIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmR2QVJCIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJmQVJCIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJmdkFSQiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJpQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMml2QVJCIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzQVJCIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzdkFSQiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNkQVJCIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0LCBHTGRvdWJsZSByKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2R2QVJCIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNmQVJCIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2Z2QVJCIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2lBUkIgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQsIEdMaW50IHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaXZBUkIgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM3NBUkIgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0LCBHTHNob3J0IHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzc3ZBUkIgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZEFSQiAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgciwgR0xkb3VibGUgcSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRkdkFSQiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZkFSQiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGZ2QVJCIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGlBUkIgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQsIEdMaW50IHIsIEdMaW50IHEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aXZBUkIgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHNBUkIgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0LCBHTHNob3J0IHIsIEdMc2hvcnQgcSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRzdkFSQiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBQ1RJVkVURVhUVVJFQVJCUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xJRU5UQUNUSVZFVEVYVFVSRUFSQlBST0MpIChHTGVudW0gdGV4dHVyZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxREFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFEVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUlBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMVNBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFTVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkRWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJJQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMklWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0RWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0ZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0lBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM1NBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzU1ZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0REFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0LCBHTGRvdWJsZSByLCBHTGRvdWJsZSBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDREVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENEZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENElBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgciwgR0xpbnQgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFNBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgciwgR0xzaG9ydCBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRTVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90cmFuc3Bvc2VfbWF0cml4CisjZGVmaW5lIEdMX0FSQl90cmFuc3Bvc2VfbWF0cml4IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGZBUkIgKGNvbnN0IEdMZmxvYXQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRUcmFuc3Bvc2VNYXRyaXhkQVJCIChjb25zdCBHTGRvdWJsZSAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdFRyYW5zcG9zZU1hdHJpeGZBUkIgKGNvbnN0IEdMZmxvYXQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhkQVJCIChjb25zdCBHTGRvdWJsZSAqbSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMT0FEVFJBTlNQT1NFTUFUUklYRkFSQlBST0MpIChjb25zdCBHTGZsb2F0ICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRFRSQU5TUE9TRU1BVFJJWERBUkJQUk9DKSAoY29uc3QgR0xkb3VibGUgKm0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUVFJBTlNQT1NFTUFUUklYRkFSQlBST0MpIChjb25zdCBHTGZsb2F0ICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVFRSQU5TUE9TRU1BVFJJWERBUkJQUk9DKSAoY29uc3QgR0xkb3VibGUgKm0pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX0FSQl9tdWx0aXNhbXBsZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdlQVJCIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVDT1ZFUkFHRUFSQlBST0MpIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfYWRkCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2Vudl9hZGQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfY3ViZV9tYXAKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfY3ViZV9tYXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb24KKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb24gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UzREFSQiAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlMkRBUkIgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTFEQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTNEQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTFEQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tcHJlc3NlZFRleEltYWdlQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0x2b2lkICppbWcpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFM0RBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTJEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UxREFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYU1VCSU1BR0UzREFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYU1VCSU1BR0UyREFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYU1VCSU1BR0UxREFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTVBSRVNTRURURVhJTUFHRUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0x2b2lkICppbWcpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfYm9yZGVyX2NsYW1wCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2JvcmRlcl9jbGFtcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfcG9pbnRfcGFyYW1ldGVycworI2RlZmluZSBHTF9BUkJfcG9pbnRfcGFyYW1ldGVycyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZkFSQiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmZ2QVJCIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZBUkJQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJGVkFSQlBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X2JsZW5kCisjZGVmaW5lIEdMX0FSQl92ZXJ0ZXhfYmxlbmQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXZWlnaHRidkFSQiAoR0xpbnQgc2l6ZSwgY29uc3QgR0xieXRlICp3ZWlnaHRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXZWlnaHRzdkFSQiAoR0xpbnQgc2l6ZSwgY29uc3QgR0xzaG9ydCAqd2VpZ2h0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0aXZBUkIgKEdMaW50IHNpemUsIGNvbnN0IEdMaW50ICp3ZWlnaHRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXZWlnaHRmdkFSQiAoR0xpbnQgc2l6ZSwgY29uc3QgR0xmbG9hdCAqd2VpZ2h0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0ZHZBUkIgKEdMaW50IHNpemUsIGNvbnN0IEdMZG91YmxlICp3ZWlnaHRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXZWlnaHR1YnZBUkIgKEdMaW50IHNpemUsIGNvbnN0IEdMdWJ5dGUgKndlaWdodHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdlaWdodHVzdkFSQiAoR0xpbnQgc2l6ZSwgY29uc3QgR0x1c2hvcnQgKndlaWdodHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdlaWdodHVpdkFSQiAoR0xpbnQgc2l6ZSwgY29uc3QgR0x1aW50ICp3ZWlnaHRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXZWlnaHRQb2ludGVyQVJCIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QmxlbmRBUkIgKEdMaW50IGNvdW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdFSUdIVEJWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMYnl0ZSAqd2VpZ2h0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdFSUdIVFNWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMc2hvcnQgKndlaWdodHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRJVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTGludCAqd2VpZ2h0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdFSUdIVEZWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMZmxvYXQgKndlaWdodHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFREVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTGRvdWJsZSAqd2VpZ2h0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdFSUdIVFVCVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHVieXRlICp3ZWlnaHRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0VJR0hUVVNWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMdXNob3J0ICp3ZWlnaHRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0VJR0hUVUlWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMdWludCAqd2VpZ2h0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdFSUdIVFBPSU5URVJBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhCTEVOREFSQlBST0MpIChHTGludCBjb3VudCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfbWF0cml4X3BhbGV0dGUKKyNkZWZpbmUgR0xfQVJCX21hdHJpeF9wYWxldHRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhBUkIgKEdMaW50IGluZGV4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhJbmRleHVidkFSQiAoR0xpbnQgc2l6ZSwgY29uc3QgR0x1Ynl0ZSAqaW5kaWNlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4SW5kZXh1c3ZBUkIgKEdMaW50IHNpemUsIGNvbnN0IEdMdXNob3J0ICppbmRpY2VzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhJbmRleHVpdkFSQiAoR0xpbnQgc2l6ZSwgY29uc3QgR0x1aW50ICppbmRpY2VzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhJbmRleFBvaW50ZXJBUkIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENVUlJFTlRQQUxFVFRFTUFUUklYQVJCUFJPQykgKEdMaW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYSU5ERVhVQlZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0x1Ynl0ZSAqaW5kaWNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWElOREVYVVNWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMdXNob3J0ICppbmRpY2VzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYSU5ERVhVSVZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0x1aW50ICppbmRpY2VzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYSU5ERVhQT0lOVEVSQVJCUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9jb21iaW5lCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2Vudl9jb21iaW5lIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9jcm9zc2JhcgorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9lbnZfY3Jvc3NiYXIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZW52X2RvdDMKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfZW52X2RvdDMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0CisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX21pcnJvcmVkX3JlcGVhdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZGVwdGhfdGV4dHVyZQorI2RlZmluZSBHTF9BUkJfZGVwdGhfdGV4dHVyZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZG93CisjZGVmaW5lIEdMX0FSQl9zaGFkb3cgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRvd19hbWJpZW50CisjZGVmaW5lIEdMX0FSQl9zaGFkb3dfYW1iaWVudCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfd2luZG93X3BvcworI2RlZmluZSBHTF9BUkJfd2luZG93X3BvcyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJkQVJCIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZHZBUkIgKGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZkFSQiAoR0xmbG9hdCB4LCBHTGZsb2F0IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJmdkFSQiAoY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmlBUkIgKEdMaW50IHgsIEdMaW50IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJpdkFSQiAoY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJzQVJCIChHTHNob3J0IHgsIEdMc2hvcnQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMnN2QVJCIChjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZEFSQiAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2R2QVJCIChjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2ZBUkIgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNmdkFSQiAoY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2lBUkIgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNpdkFSQiAoY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNzQVJCIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Mzc3ZBUkIgKGNvbnN0IEdMc2hvcnQgKnYpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkRBUkJQUk9DKSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJEVkFSQlBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJGQVJCUFJPQykgKEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkZWQVJCUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MySUFSQlBST0MpIChHTGludCB4LCBHTGludCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMklWQVJCUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMlNBUkJQUk9DKSAoR0xzaG9ydCB4LCBHTHNob3J0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyU1ZBUkJQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNEQVJCUFJPQykgKEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRFZBUkJQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRkFSQlBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0ZWQVJCUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzSUFSQlBST0MpIChHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0lWQVJCUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM1NBUkJQUk9DKSAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNTVkFSQlBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfcHJvZ3JhbQorI2RlZmluZSBHTF9BUkJfdmVydGV4X3Byb2dyYW0gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZEFSQiAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZHZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmQVJCIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWZ2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFzQVJCIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMXN2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJkQVJCIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJkdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmZBUkIgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyc0FSQiAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMnN2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNkQVJCIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNkdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2ZBUkIgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2Z2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNzQVJCIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNzdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TmJ2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5pdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5zdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnViQVJCIChHTHVpbnQgaW5kZXgsIEdMdWJ5dGUgeCwgR0x1Ynl0ZSB5LCBHTHVieXRlIHosIEdMdWJ5dGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51YnZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51aXZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnVzdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGJ2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGRBUkIgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGR2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZkFSQiAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0aXZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzQVJCIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHN2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjR1YnZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHVpdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjR1c3ZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXJBUkIgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheUFSQiAoR0x1aW50IGluZGV4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXlBUkIgKEdMdWludCBpbmRleCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVN0cmluZ0FSQiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdm9pZCAqc3RyaW5nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kUHJvZ3JhbUFSQiAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHByb2dyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVByb2dyYW1zQVJCIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcHJvZ3JhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblByb2dyYW1zQVJCIChHTHNpemVpIG4sIEdMdWludCAqcHJvZ3JhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXI0ZEFSQiAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyNGR2QVJCIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXI0ZkFSQiAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXI0ZnZBUkIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZEFSQiAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZHZBUkIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGZBUkIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZnZBUkIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtRW52UGFyYW1ldGVyZHZBUkIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUVudlBhcmFtZXRlcmZ2QVJCIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUxvY2FsUGFyYW1ldGVyZHZBUkIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUxvY2FsUGFyYW1ldGVyZnZBUkIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtaXZBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbVN0cmluZ0FSQiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKnN0cmluZyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliZHZBUkIgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJmdkFSQiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliaXZBUkIgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydkFSQiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBvaW50ZXIpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNQcm9ncmFtQVJCIChHTHVpbnQgcHJvZ3JhbSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxREFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRFZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFGQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUZWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFTQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMVNWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJEQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJEVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJGVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyU0FSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMlNWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNEQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNEVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0ZWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNTQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNTVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TkJWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5JVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5TVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlVCQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0x1Ynl0ZSB4LCBHTHVieXRlIHksIEdMdWJ5dGUgeiwgR0x1Ynl0ZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5VQlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5VSVZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlVTVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdXNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEJWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNERBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNERWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRGVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0SVZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRTQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFNWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRVQlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFVJVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRVU1ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlBPSU5URVJBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkFCTEVWRVJURVhBVFRSSUJBUlJBWUFSQlBST0MpIChHTHVpbnQgaW5kZXgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xESVNBQkxFVkVSVEVYQVRUUklCQVJSQVlBUkJQUk9DKSAoR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVNUUklOR0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGxlbiwgY29uc3QgR0x2b2lkICpzdHJpbmcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EUFJPR1JBTUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVBST0dSQU1TQVJCUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwcm9ncmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlBST0dSQU1TQVJCUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpwcm9ncmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1FTlZQQVJBTUVURVI0REFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNRU5WUEFSQU1FVEVSNERWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1FTlZQQVJBTUVURVI0RkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1FTlZQQVJBTUVURVI0RlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTE9DQUxQQVJBTUVURVI0REFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTE9DQUxQQVJBTUVURVI0RFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSNEZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTE9DQUxQQVJBTUVURVI0RlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNRU5WUEFSQU1FVEVSRFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUVOVlBBUkFNRVRFUkZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUxPQ0FMUEFSQU1FVEVSRFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUxPQ0FMUEFSQU1FVEVSRlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNSVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVNUUklOR0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqc3RyaW5nKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCRFZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJGVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCSVZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJQT0lOVEVSVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcG9pbnRlcik7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNQUk9HUkFNQVJCUFJPQykgKEdMdWludCBwcm9ncmFtKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9mcmFnbWVudF9wcm9ncmFtCisjZGVmaW5lIEdMX0FSQl9mcmFnbWVudF9wcm9ncmFtIDEKKy8qIEFsbCBBUkJfZnJhZ21lbnRfcHJvZ3JhbSBlbnRyeSBwb2ludHMgYXJlIHNoYXJlZCB3aXRoIEFSQl92ZXJ0ZXhfcHJvZ3JhbS4gKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kQnVmZmVyQVJCIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVCdWZmZXJzQVJCIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuQnVmZmVyc0FSQiAoR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNCdWZmZXJBUkIgKEdMdWludCBidWZmZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJ1ZmZlckRhdGFBUkIgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHJBUkIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJ1ZmZlclN1YkRhdGFBUkIgKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyQVJCIG9mZnNldCwgR0xzaXplaXB0ckFSQiBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJ1ZmZlclN1YkRhdGFBUkIgKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyQVJCIG9mZnNldCwgR0xzaXplaXB0ckFSQiBzaXplLCBHTHZvaWQgKmRhdGEpOworR0xBUEkgR0x2b2lkKiBBUElFTlRSWSBnbE1hcEJ1ZmZlckFSQiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2Vzcyk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xVbm1hcEJ1ZmZlckFSQiAoR0xlbnVtIHRhcmdldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXZBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QnVmZmVyUG9pbnRlcnZBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRCVUZGRVJBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUJVRkZFUlNBUkJQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5CVUZGRVJTQVJCUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0JVRkZFUkFSQlBST0MpIChHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQlVGRkVSREFUQUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyQVJCIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQlVGRkVSU1VCREFUQUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ckFSQiBvZmZzZXQsIEdMc2l6ZWlwdHJBUkIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSU1VCREFUQUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ckFSQiBvZmZzZXQsIEdMc2l6ZWlwdHJBUkIgc2l6ZSwgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgR0x2b2lkKiAoQVBJRU5UUllQIFBGTkdMTUFQQlVGRkVSQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTFVOTUFQQlVGRkVSQVJCUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQQVJBTUVURVJJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQT0lOVEVSVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfb2NjbHVzaW9uX3F1ZXJ5CisjZGVmaW5lIEdMX0FSQl9vY2NsdXNpb25fcXVlcnkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5RdWVyaWVzQVJCIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVRdWVyaWVzQVJCIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUXVlcnlBUkIgKEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5RdWVyeUFSQiAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmRRdWVyeUFSQiAoR0xlbnVtIHRhcmdldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlpdkFSQiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRRdWVyeU9iamVjdGl2QVJCIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3R1aXZBUkIgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5RVUVSSUVTQVJCUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVRVUVSSUVTQVJCUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICppZHMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTUVVFUllBUkJQUk9DKSAoR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkVHSU5RVUVSWUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRRVUVSWUFSQlBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUVVFUllJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWU9CSkVDVElWQVJCUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUVVFUllPQkpFQ1RVSVZBUkJQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkZXJfb2JqZWN0cworI2RlZmluZSBHTF9BUkJfc2hhZGVyX29iamVjdHMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVPYmplY3RBUkIgKEdMaGFuZGxlQVJCIG9iaik7CitHTEFQSSBHTGhhbmRsZUFSQiBBUElFTlRSWSBnbEdldEhhbmRsZUFSQiAoR0xlbnVtIHBuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXRhY2hPYmplY3RBUkIgKEdMaGFuZGxlQVJCIGNvbnRhaW5lck9iaiwgR0xoYW5kbGVBUkIgYXR0YWNoZWRPYmopOworR0xBUEkgR0xoYW5kbGVBUkIgQVBJRU5UUlkgZ2xDcmVhdGVTaGFkZXJPYmplY3RBUkIgKEdMZW51bSBzaGFkZXJUeXBlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTaGFkZXJTb3VyY2VBUkIgKEdMaGFuZGxlQVJCIHNoYWRlck9iaiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyQVJCKiAqc3RyaW5nLCBjb25zdCBHTGludCAqbGVuZ3RoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21waWxlU2hhZGVyQVJCIChHTGhhbmRsZUFSQiBzaGFkZXJPYmopOworR0xBUEkgR0xoYW5kbGVBUkIgQVBJRU5UUlkgZ2xDcmVhdGVQcm9ncmFtT2JqZWN0QVJCICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBdHRhY2hPYmplY3RBUkIgKEdMaGFuZGxlQVJCIGNvbnRhaW5lck9iaiwgR0xoYW5kbGVBUkIgb2JqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaW5rUHJvZ3JhbUFSQiAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVXNlUHJvZ3JhbU9iamVjdEFSQiAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFsaWRhdGVQcm9ncmFtQVJCIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWZBUkIgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMmZBUkIgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2ZBUkIgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGZBUkIgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGZsb2F0IHYzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWlBUkIgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJpQVJCIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2lBUkIgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGlBUkIgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyLCBHTGludCB2Myk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFmdkFSQiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMmZ2QVJCIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0zZnZBUkIgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRmdkFSQiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWl2QVJCIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMml2QVJCIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2l2QVJCIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGl2QVJCIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4MmZ2QVJCIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgzZnZBUkIgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDRmdkFSQiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPYmplY3RQYXJhbWV0ZXJmdkFSQiAoR0xoYW5kbGVBUkIgb2JqLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0T2JqZWN0UGFyYW1ldGVyaXZBUkIgKEdMaGFuZGxlQVJCIG9iaiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbmZvTG9nQVJCIChHTGhhbmRsZUFSQiBvYmosIEdMc2l6ZWkgbWF4TGVuZ3RoLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhckFSQiAqaW5mb0xvZyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QXR0YWNoZWRPYmplY3RzQVJCIChHTGhhbmRsZUFSQiBjb250YWluZXJPYmosIEdMc2l6ZWkgbWF4Q291bnQsIEdMc2l6ZWkgKmNvdW50LCBHTGhhbmRsZUFSQiAqb2JqKTsKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsR2V0VW5pZm9ybUxvY2F0aW9uQVJCIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBjb25zdCBHTGNoYXJBUkIgKm5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm1BUkIgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIEdMdWludCBpbmRleCwgR0xzaXplaSBtYXhMZW5ndGgsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnNpemUsIEdMZW51bSAqdHlwZSwgR0xjaGFyQVJCICpuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtZnZBUkIgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFVuaWZvcm1pdkFSQiAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaiwgR0xpbnQgbG9jYXRpb24sIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFNoYWRlclNvdXJjZUFSQiAoR0xoYW5kbGVBUkIgb2JqLCBHTHNpemVpIG1heExlbmd0aCwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXJBUkIgKnNvdXJjZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVPQkpFQ1RBUkJQUk9DKSAoR0xoYW5kbGVBUkIgb2JqKTsKK3R5cGVkZWYgR0xoYW5kbGVBUkIgKEFQSUVOVFJZUCBQRk5HTEdFVEhBTkRMRUFSQlBST0MpIChHTGVudW0gcG5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERVRBQ0hPQkpFQ1RBUkJQUk9DKSAoR0xoYW5kbGVBUkIgY29udGFpbmVyT2JqLCBHTGhhbmRsZUFSQiBhdHRhY2hlZE9iaik7Cit0eXBlZGVmIEdMaGFuZGxlQVJCIChBUElFTlRSWVAgUEZOR0xDUkVBVEVTSEFERVJPQkpFQ1RBUkJQUk9DKSAoR0xlbnVtIHNoYWRlclR5cGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTSEFERVJTT1VSQ0VBUkJQUk9DKSAoR0xoYW5kbGVBUkIgc2hhZGVyT2JqLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXJBUkIqICpzdHJpbmcsIGNvbnN0IEdMaW50ICpsZW5ndGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QSUxFU0hBREVSQVJCUFJPQykgKEdMaGFuZGxlQVJCIHNoYWRlck9iaik7Cit0eXBlZGVmIEdMaGFuZGxlQVJCIChBUElFTlRSWVAgUEZOR0xDUkVBVEVQUk9HUkFNT0JKRUNUQVJCUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBVFRBQ0hPQkpFQ1RBUkJQUk9DKSAoR0xoYW5kbGVBUkIgY29udGFpbmVyT2JqLCBHTGhhbmRsZUFSQiBvYmopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMSU5LUFJPR1JBTUFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVVNFUFJPR1JBTU9CSkVDVEFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFMSURBVEVQUk9HUkFNQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMkZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0ZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNEZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIsIEdMZmxvYXQgdjMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUlBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJJQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0lBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSwgR0xpbnQgdjIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNElBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSwgR0xpbnQgdjIsIEdMaW50IHYzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFGVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMkZWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zRlZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRGVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUlWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMklWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0lWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNElWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYMkZWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVgzRlZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDRGVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRPQkpFQ1RQQVJBTUVURVJGVkFSQlBST0MpIChHTGhhbmRsZUFSQiBvYmosIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0JKRUNUUEFSQU1FVEVSSVZBUkJQUk9DKSAoR0xoYW5kbGVBUkIgb2JqLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTkZPTE9HQVJCUFJPQykgKEdMaGFuZGxlQVJCIG9iaiwgR0xzaXplaSBtYXhMZW5ndGgsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyQVJCICppbmZvTG9nKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQVRUQUNIRURPQkpFQ1RTQVJCUFJPQykgKEdMaGFuZGxlQVJCIGNvbnRhaW5lck9iaiwgR0xzaXplaSBtYXhDb3VudCwgR0xzaXplaSAqY291bnQsIEdMaGFuZGxlQVJCICpvYmopOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STUxPQ0FUSU9OQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIGNvbnN0IEdMY2hhckFSQiAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVVOSUZPUk1BUkJQUk9DKSAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaiwgR0x1aW50IGluZGV4LCBHTHNpemVpIG1heExlbmd0aCwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXJBUkIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNRlZBUkJQUk9DKSAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaiwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1JVkFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQURFUlNPVVJDRUFSQlBST0MpIChHTGhhbmRsZUFSQiBvYmosIEdMc2l6ZWkgbWF4TGVuZ3RoLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhckFSQiAqc291cmNlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyCisjZGVmaW5lIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEF0dHJpYkxvY2F0aW9uQVJCIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhckFSQiAqbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QWN0aXZlQXR0cmliQVJCIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgbWF4TGVuZ3RoLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhckFSQiAqbmFtZSk7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbEdldEF0dHJpYkxvY2F0aW9uQVJCIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBjb25zdCBHTGNoYXJBUkIgKm5hbWUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREFUVFJJQkxPQ0FUSU9OQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyQVJCICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQUNUSVZFQVRUUklCQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIEdMdWludCBpbmRleCwgR0xzaXplaSBtYXhMZW5ndGgsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnNpemUsIEdMZW51bSAqdHlwZSwgR0xjaGFyQVJCICpuYW1lKTsKK3R5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVEFUVFJJQkxPQ0FUSU9OQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIGNvbnN0IEdMY2hhckFSQiAqbmFtZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhZ21lbnRfc2hhZGVyCisjZGVmaW5lIEdMX0FSQl9mcmFnbWVudF9zaGFkZXIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfMTAwCisjZGVmaW5lIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzEwMCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX25vbl9wb3dlcl9vZl90d28gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3BvaW50X3Nwcml0ZQorI2RlZmluZSBHTF9BUkJfcG9pbnRfc3ByaXRlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9mcmFnbWVudF9wcm9ncmFtX3NoYWRvdworI2RlZmluZSBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbV9zaGFkb3cgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RyYXdfYnVmZmVycworI2RlZmluZSBHTF9BUkJfZHJhd19idWZmZXJzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0J1ZmZlcnNBUkIgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdCVUZGRVJTQVJCUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX3JlY3RhbmdsZQorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9yZWN0YW5nbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2NvbG9yX2J1ZmZlcl9mbG9hdAorI2RlZmluZSBHTF9BUkJfY29sb3JfYnVmZmVyX2Zsb2F0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xhbXBDb2xvckFSQiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGNsYW1wKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENMQU1QQ09MT1JBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGNsYW1wKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9oYWxmX2Zsb2F0X3BpeGVsCisjZGVmaW5lIEdMX0FSQl9oYWxmX2Zsb2F0X3BpeGVsIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Zsb2F0CisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2Zsb2F0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9waXhlbF9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0FSQl9waXhlbF9idWZmZXJfb2JqZWN0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9kZXB0aF9idWZmZXJfZmxvYXQKKyNkZWZpbmUgR0xfQVJCX2RlcHRoX2J1ZmZlcl9mbG9hdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZHJhd19pbnN0YW5jZWQKKyNkZWZpbmUgR0xfQVJCX2RyYXdfaW5zdGFuY2VkIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0FycmF5c0luc3RhbmNlZEFSQiAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRzSW5zdGFuY2VkQVJCIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0FSUkFZU0lOU1RBTkNFREFSQlBST0MpIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0VMRU1FTlRTSU5TVEFOQ0VEQVJCUFJPQykgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhbWVidWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0FSQl9mcmFtZWJ1ZmZlcl9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUmVuZGVyYnVmZmVyIChHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kUmVuZGVyYnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVSZW5kZXJidWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcmVuZGVyYnVmZmVycyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuUmVuZGVyYnVmZmVycyAoR0xzaXplaSBuLCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNGcmFtZWJ1ZmZlciAoR0x1aW50IGZyYW1lYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kRnJhbWVidWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlRnJhbWVidWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZnJhbWVidWZmZXJzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5GcmFtZWJ1ZmZlcnMgKEdMc2l6ZWkgbiwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMpOworR0xBUEkgR0xlbnVtIEFQSUVOVFJZIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyAoR0xlbnVtIHRhcmdldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlMUQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUzRCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuZXJhdGVNaXBtYXAgKEdMZW51bSB0YXJnZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsaXRGcmFtZWJ1ZmZlciAoR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsIEdMaW50IGRzdFgwLCBHTGludCBkc3RZMCwgR0xpbnQgZHN0WDEsIEdMaW50IGRzdFkxLCBHTGJpdGZpZWxkIG1hc2ssIEdMZW51bSBmaWx0ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmVMYXllciAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgbGF5ZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1JFTkRFUkJVRkZFUlBST0MpIChHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFJFTkRFUkJVRkZFUlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFUkVOREVSQlVGRkVSU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcmVuZGVyYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlJFTkRFUkJVRkZFUlNQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRSRU5ERVJCVUZGRVJQQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTRlJBTUVCVUZGRVJQUk9DKSAoR0x1aW50IGZyYW1lYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREZSQU1FQlVGRkVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUZSQU1FQlVGRkVSU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZnJhbWVidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VORlJBTUVCVUZGRVJTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMpOwordHlwZWRlZiBHTGVudW0gKEFQSUVOVFJZUCBQRk5HTENIRUNLRlJBTUVCVUZGRVJTVEFUVVNQUk9DKSAoR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUyRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSUkVOREVSQlVGRkVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURlJBTUVCVUZGRVJBVFRBQ0hNRU5UUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTkVSQVRFTUlQTUFQUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTElURlJBTUVCVUZGRVJQUk9DKSAoR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsIEdMaW50IGRzdFgwLCBHTGludCBkc3RZMCwgR0xpbnQgZHN0WDEsIEdMaW50IGRzdFkxLCBHTGJpdGZpZWxkIG1hc2ssIEdMZW51bSBmaWx0ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFTEFZRVJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgbGF5ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYW1lYnVmZmVyX3NSR0IKKyNkZWZpbmUgR0xfQVJCX2ZyYW1lYnVmZmVyX3NSR0IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2dlb21ldHJ5X3NoYWRlcjQKKyNkZWZpbmUgR0xfQVJCX2dlb21ldHJ5X3NoYWRlcjQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyaUFSQiAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZUFSQiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlTGF5ZXJBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IGxheWVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmVGYWNlQVJCIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGVudW0gZmFjZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNUEFSQU1FVEVSSUFSQlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCB2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFTEFZRVJBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgbGF5ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkVGQUNFQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBmYWNlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9oYWxmX2Zsb2F0X3ZlcnRleAorI2RlZmluZSBHTF9BUkJfaGFsZl9mbG9hdF92ZXJ0ZXggMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2luc3RhbmNlZF9hcnJheXMKKyNkZWZpbmUgR0xfQVJCX2luc3RhbmNlZF9hcnJheXMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJEaXZpc29yQVJCIChHTHVpbnQgaW5kZXgsIEdMdWludCBkaXZpc29yKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkRJVklTT1JBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgZGl2aXNvcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfbWFwX2J1ZmZlcl9yYW5nZQorI2RlZmluZSBHTF9BUkJfbWFwX2J1ZmZlcl9yYW5nZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgR0x2b2lkKiBBUElFTlRSWSBnbE1hcEJ1ZmZlclJhbmdlIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgbGVuZ3RoLCBHTGJpdGZpZWxkIGFjY2Vzcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmx1c2hNYXBwZWRCdWZmZXJSYW5nZSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIGxlbmd0aCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTHZvaWQqIChBUElFTlRSWVAgUEZOR0xNQVBCVUZGRVJSQU5HRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgbGVuZ3RoLCBHTGJpdGZpZWxkIGFjY2Vzcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZMVVNITUFQUEVEQlVGRkVSUkFOR0VQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIGxlbmd0aCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2J1ZmZlcl9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhCdWZmZXJBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0x1aW50IGJ1ZmZlcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhCVUZGRVJBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHVpbnQgYnVmZmVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGMKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb25fcmd0YyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9yZworI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9yZyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X2FycmF5X29iamVjdAorI2RlZmluZSBHTF9BUkJfdmVydGV4X2FycmF5X29iamVjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRWZXJ0ZXhBcnJheSAoR0x1aW50IGFycmF5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVWZXJ0ZXhBcnJheXMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICphcnJheXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblZlcnRleEFycmF5cyAoR0xzaXplaSBuLCBHTHVpbnQgKmFycmF5cyk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1ZlcnRleEFycmF5IChHTHVpbnQgYXJyYXkpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFZFUlRFWEFSUkFZUFJPQykgKEdMdWludCBhcnJheSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVZFUlRFWEFSUkFZU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOVkVSVEVYQVJSQVlTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTVkVSVEVYQVJSQVlQUk9DKSAoR0x1aW50IGFycmF5KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xfQVJCX3VuaWZvcm1fYnVmZmVyX29iamVjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFVuaWZvcm1JbmRpY2VzIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSB1bmlmb3JtQ291bnQsIGNvbnN0IEdMY2hhciogKnVuaWZvcm1OYW1lcywgR0x1aW50ICp1bmlmb3JtSW5kaWNlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QWN0aXZlVW5pZm9ybXNpdiAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgdW5pZm9ybUNvdW50LCBjb25zdCBHTHVpbnQgKnVuaWZvcm1JbmRpY2VzLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm1OYW1lIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHVuaWZvcm1JbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqdW5pZm9ybU5hbWUpOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2V0VW5pZm9ybUJsb2NrSW5kZXggKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKnVuaWZvcm1CbG9ja05hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm1CbG9ja2l2IChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHVuaWZvcm1CbG9ja0luZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm1CbG9ja05hbWUgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgdW5pZm9ybUJsb2NrSW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKnVuaWZvcm1CbG9ja05hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1CbG9ja0JpbmRpbmcgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgdW5pZm9ybUJsb2NrSW5kZXgsIEdMdWludCB1bmlmb3JtQmxvY2tCaW5kaW5nKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1JTkRJQ0VTUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIHVuaWZvcm1Db3VudCwgY29uc3QgR0xjaGFyKiAqdW5pZm9ybU5hbWVzLCBHTHVpbnQgKnVuaWZvcm1JbmRpY2VzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQUNUSVZFVU5JRk9STVNJVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSB1bmlmb3JtQ291bnQsIGNvbnN0IEdMdWludCAqdW5pZm9ybUluZGljZXMsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVVOSUZPUk1OQU1FUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgdW5pZm9ybUluZGV4LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICp1bmlmb3JtTmFtZSk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STUJMT0NLSU5ERVhQUk9DKSAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqdW5pZm9ybUJsb2NrTmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVVOSUZPUk1CTE9DS0lWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgdW5pZm9ybUJsb2NrSW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVVOSUZPUk1CTE9DS05BTUVQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCB1bmlmb3JtQmxvY2tJbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqdW5pZm9ybUJsb2NrTmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1CTE9DS0JJTkRJTkdQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCB1bmlmb3JtQmxvY2tJbmRleCwgR0x1aW50IHVuaWZvcm1CbG9ja0JpbmRpbmcpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2NvbXBhdGliaWxpdHkKKyNkZWZpbmUgR0xfQVJCX2NvbXBhdGliaWxpdHkgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2NvcHlfYnVmZmVyCisjZGVmaW5lIEdMX0FSQl9jb3B5X2J1ZmZlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlCdWZmZXJTdWJEYXRhIChHTGVudW0gcmVhZFRhcmdldCwgR0xlbnVtIHdyaXRlVGFyZ2V0LCBHTGludHB0ciByZWFkT2Zmc2V0LCBHTGludHB0ciB3cml0ZU9mZnNldCwgR0xzaXplaXB0ciBzaXplKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlCVUZGRVJTVUJEQVRBUFJPQykgKEdMZW51bSByZWFkVGFyZ2V0LCBHTGVudW0gd3JpdGVUYXJnZXQsIEdMaW50cHRyIHJlYWRPZmZzZXQsIEdMaW50cHRyIHdyaXRlT2Zmc2V0LCBHTHNpemVpcHRyIHNpemUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRlcl90ZXh0dXJlX2xvZAorI2RlZmluZSBHTF9BUkJfc2hhZGVyX3RleHR1cmVfbG9kIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9kZXB0aF9jbGFtcAorI2RlZmluZSBHTF9BUkJfZGVwdGhfY2xhbXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RyYXdfZWxlbWVudHNfYmFzZV92ZXJ0ZXgKKyNkZWZpbmUgR0xfQVJCX2RyYXdfZWxlbWVudHNfYmFzZV92ZXJ0ZXggMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3RWxlbWVudHNCYXNlVmVydGV4IChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcywgR0xpbnQgYmFzZXZlcnRleCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd1JhbmdlRWxlbWVudHNCYXNlVmVydGV4IChHTGVudW0gbW9kZSwgR0x1aW50IHN0YXJ0LCBHTHVpbnQgZW5kLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzLCBHTGludCBiYXNldmVydGV4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3RWxlbWVudHNJbnN0YW5jZWRCYXNlVmVydGV4IChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQsIEdMaW50IGJhc2V2ZXJ0ZXgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd0VsZW1lbnRzQmFzZVZlcnRleCAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQsIGNvbnN0IEdMaW50ICpiYXNldmVydGV4KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdFTEVNRU5UU0JBU0VWRVJURVhQUk9DKSAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMsIEdMaW50IGJhc2V2ZXJ0ZXgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXUkFOR0VFTEVNRU5UU0JBU0VWRVJURVhQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcywgR0xpbnQgYmFzZXZlcnRleCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdFTEVNRU5UU0lOU1RBTkNFREJBU0VWRVJURVhQUk9DKSAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50LCBHTGludCBiYXNldmVydGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXRUxFTUVOVFNCQVNFVkVSVEVYUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50LCBjb25zdCBHTGludCAqYmFzZXZlcnRleCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhZ21lbnRfY29vcmRfY29udmVudGlvbnMKKyNkZWZpbmUgR0xfQVJCX2ZyYWdtZW50X2Nvb3JkX2NvbnZlbnRpb25zIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9wcm92b2tpbmdfdmVydGV4CisjZGVmaW5lIEdMX0FSQl9wcm92b2tpbmdfdmVydGV4IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvdm9raW5nVmVydGV4IChHTGVudW0gbW9kZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9WT0tJTkdWRVJURVhQUk9DKSAoR0xlbnVtIG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NlYW1sZXNzX2N1YmVfbWFwCisjZGVmaW5lIEdMX0FSQl9zZWFtbGVzc19jdWJlX21hcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc3luYworI2RlZmluZSBHTF9BUkJfc3luYyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgR0xzeW5jIEFQSUVOVFJZIGdsRmVuY2VTeW5jIChHTGVudW0gY29uZGl0aW9uLCBHTGJpdGZpZWxkIGZsYWdzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzU3luYyAoR0xzeW5jIHN5bmMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVN5bmMgKEdMc3luYyBzeW5jKTsKK0dMQVBJIEdMZW51bSBBUElFTlRSWSBnbENsaWVudFdhaXRTeW5jIChHTHN5bmMgc3luYywgR0xiaXRmaWVsZCBmbGFncywgR0x1aW50NjQgdGltZW91dCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2FpdFN5bmMgKEdMc3luYyBzeW5jLCBHTGJpdGZpZWxkIGZsYWdzLCBHTHVpbnQ2NCB0aW1lb3V0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnRlZ2VyNjR2IChHTGVudW0gcG5hbWUsIEdMaW50NjQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U3luY2l2IChHTHN5bmMgc3luYywgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnZhbHVlcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTHN5bmMgKEFQSUVOVFJZUCBQRk5HTEZFTkNFU1lOQ1BST0MpIChHTGVudW0gY29uZGl0aW9uLCBHTGJpdGZpZWxkIGZsYWdzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1NZTkNQUk9DKSAoR0xzeW5jIHN5bmMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVTWU5DUFJPQykgKEdMc3luYyBzeW5jKTsKK3R5cGVkZWYgR0xlbnVtIChBUElFTlRSWVAgUEZOR0xDTElFTlRXQUlUU1lOQ1BST0MpIChHTHN5bmMgc3luYywgR0xiaXRmaWVsZCBmbGFncywgR0x1aW50NjQgdGltZW91dCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdBSVRTWU5DUFJPQykgKEdMc3luYyBzeW5jLCBHTGJpdGZpZWxkIGZsYWdzLCBHTHVpbnQ2NCB0aW1lb3V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU5URUdFUjY0VlBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50NjQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNZTkNJVlBST0MpIChHTHN5bmMgc3luYywgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnZhbHVlcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9tdWx0aXNhbXBsZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEltYWdlMkRNdWx0aXNhbXBsZSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMYm9vbGVhbiBmaXhlZHNhbXBsZWxvY2F0aW9ucyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4SW1hZ2UzRE11bHRpc2FtcGxlIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xib29sZWFuIGZpeGVkc2FtcGxlbG9jYXRpb25zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNdWx0aXNhbXBsZWZ2IChHTGVudW0gcG5hbWUsIEdMdWludCBpbmRleCwgR0xmbG9hdCAqdmFsKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVNYXNraSAoR0x1aW50IGluZGV4LCBHTGJpdGZpZWxkIG1hc2spOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYSU1BR0UyRE1VTFRJU0FNUExFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGJvb2xlYW4gZml4ZWRzYW1wbGVsb2NhdGlvbnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhJTUFHRTNETVVMVElTQU1QTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMYm9vbGVhbiBmaXhlZHNhbXBsZWxvY2F0aW9ucyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1VTFRJU0FNUExFRlZQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKnZhbCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRU1BU0tJUFJPQykgKEdMdWludCBpbmRleCwgR0xiaXRmaWVsZCBtYXNrKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfYXJyYXlfYmdyYQorI2RlZmluZSBHTF9BUkJfdmVydGV4X2FycmF5X2JncmEgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RyYXdfYnVmZmVyc19ibGVuZAorI2RlZmluZSBHTF9BUkJfZHJhd19idWZmZXJzX2JsZW5kIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRFcXVhdGlvbmlBUkIgKEdMdWludCBidWYsIEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVpQVJCIChHTHVpbnQgYnVmLCBHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRGdW5jaUFSQiAoR0x1aW50IGJ1ZiwgR0xlbnVtIHNyYywgR0xlbnVtIGRzdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRGdW5jU2VwYXJhdGVpQVJCIChHTHVpbnQgYnVmLCBHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OSUFSQlBST0MpIChHTHVpbnQgYnVmLCBHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05TRVBBUkFURUlBUkJQUk9DKSAoR0x1aW50IGJ1ZiwgR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREZVTkNJQVJCUFJPQykgKEdMdWludCBidWYsIEdMZW51bSBzcmMsIEdMZW51bSBkc3QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREZVTkNTRVBBUkFURUlBUkJQUk9DKSAoR0x1aW50IGJ1ZiwgR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NhbXBsZV9zaGFkaW5nCisjZGVmaW5lIEdMX0FSQl9zYW1wbGVfc2hhZGluZyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1pblNhbXBsZVNoYWRpbmdBUkIgKEdMY2xhbXBmIHZhbHVlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1JTlNBTVBMRVNIQURJTkdBUkJQUk9DKSAoR0xjbGFtcGYgdmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfY3ViZV9tYXBfYXJyYXkKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfY3ViZV9tYXBfYXJyYXkgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZ2F0aGVyCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2dhdGhlciAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9xdWVyeV9sb2QKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfcXVlcnlfbG9kIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlX2luY2x1ZGUKKyNkZWZpbmUgR0xfQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfaW5jbHVkZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkU3RyaW5nQVJCIChHTGVudW0gdHlwZSwgR0xpbnQgbmFtZWxlbiwgY29uc3QgR0xjaGFyICpuYW1lLCBHTGludCBzdHJpbmdsZW4sIGNvbnN0IEdMY2hhciAqc3RyaW5nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVOYW1lZFN0cmluZ0FSQiAoR0xpbnQgbmFtZWxlbiwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21waWxlU2hhZGVySW5jbHVkZUFSQiAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiAqcGF0aCwgY29uc3QgR0xpbnQgKmxlbmd0aCk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc05hbWVkU3RyaW5nQVJCIChHTGludCBuYW1lbGVuLCBjb25zdCBHTGNoYXIgKm5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE5hbWVkU3RyaW5nQVJCIChHTGludCBuYW1lbGVuLCBjb25zdCBHTGNoYXIgKm5hbWUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnN0cmluZ2xlbiwgR0xjaGFyICpzdHJpbmcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE5hbWVkU3RyaW5naXZBUkIgKEdMaW50IG5hbWVsZW4sIGNvbnN0IEdMY2hhciAqbmFtZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVEU1RSSU5HQVJCUFJPQykgKEdMZW51bSB0eXBlLCBHTGludCBuYW1lbGVuLCBjb25zdCBHTGNoYXIgKm5hbWUsIEdMaW50IHN0cmluZ2xlbiwgY29uc3QgR0xjaGFyICpzdHJpbmcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVOQU1FRFNUUklOR0FSQlBST0MpIChHTGludCBuYW1lbGVuLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QSUxFU0hBREVSSU5DTFVERUFSQlBST0MpIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqICpwYXRoLCBjb25zdCBHTGludCAqbGVuZ3RoKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU05BTUVEU1RSSU5HQVJCUFJPQykgKEdMaW50IG5hbWVsZW4sIGNvbnN0IEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5BTUVEU1RSSU5HQVJCUFJPQykgKEdMaW50IG5hbWVsZW4sIGNvbnN0IEdMY2hhciAqbmFtZSwgR0xzaXplaSBidWZTaXplLCBHTGludCAqc3RyaW5nbGVuLCBHTGNoYXIgKnN0cmluZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5BTUVEU1RSSU5HSVZBUkJQUk9DKSAoR0xpbnQgbmFtZWxlbiwgY29uc3QgR0xjaGFyICpuYW1lLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb25fYnB0YworI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9ibGVuZF9mdW5jX2V4dGVuZGVkCisjZGVmaW5lIEdMX0FSQl9ibGVuZF9mdW5jX2V4dGVuZGVkIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEZyYWdEYXRhTG9jYXRpb25JbmRleGVkIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGNvbG9yTnVtYmVyLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbEdldEZyYWdEYXRhSW5kZXggKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREZSQUdEQVRBTE9DQVRJT05JTkRFWEVEUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgY29sb3JOdW1iZXIsIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyICpuYW1lKTsKK3R5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQUdEQVRBSU5ERVhQUk9DKSAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uCisjZGVmaW5lIEdMX0FSQl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX29jY2x1c2lvbl9xdWVyeTIKKyNkZWZpbmUgR0xfQVJCX29jY2x1c2lvbl9xdWVyeTIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NhbXBsZXJfb2JqZWN0cworI2RlZmluZSBHTF9BUkJfc2FtcGxlcl9vYmplY3RzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuU2FtcGxlcnMgKEdMc2l6ZWkgY291bnQsIEdMdWludCAqc2FtcGxlcnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVNhbXBsZXJzIChHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnNhbXBsZXJzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzU2FtcGxlciAoR0x1aW50IHNhbXBsZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRTYW1wbGVyIChHTHVpbnQgdW5pdCwgR0x1aW50IHNhbXBsZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZXJQYXJhbWV0ZXJpIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlclBhcmFtZXRlcml2IChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZXJQYXJhbWV0ZXJmIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVyUGFyYW1ldGVyZnYgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVyUGFyYW1ldGVySWl2IChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZXJQYXJhbWV0ZXJJdWl2IChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTHVpbnQgKnBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTYW1wbGVyUGFyYW1ldGVyaXYgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFNhbXBsZXJQYXJhbWV0ZXJJaXYgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFNhbXBsZXJQYXJhbWV0ZXJmdiAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTYW1wbGVyUGFyYW1ldGVySXVpdiAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOU0FNUExFUlNQUk9DKSAoR0xzaXplaSBjb3VudCwgR0x1aW50ICpzYW1wbGVycyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVNBTVBMRVJTUFJPQykgKEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqc2FtcGxlcnMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTU0FNUExFUlBST0MpIChHTHVpbnQgc2FtcGxlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRTQU1QTEVSUFJPQykgKEdMdWludCB1bml0LCBHTHVpbnQgc2FtcGxlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRVJQQVJBTUVURVJJUFJPQykgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFUlBBUkFNRVRFUklWUFJPQykgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRVJQQVJBTUVURVJGUFJPQykgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVSUEFSQU1FVEVSRlZQUk9DKSAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVSUEFSQU1FVEVSSUlWUFJPQykgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRVJQQVJBTUVURVJJVUlWUFJPQykgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMdWludCAqcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRTQU1QTEVSUEFSQU1FVEVSSVZQUk9DKSAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNBTVBMRVJQQVJBTUVURVJJSVZQUk9DKSAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNBTVBMRVJQQVJBTUVURVJGVlBST0MpIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRTQU1QTEVSUEFSQU1FVEVSSVVJVlBST0MpIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGVyX2JpdF9lbmNvZGluZworI2RlZmluZSBHTF9BUkJfc2hhZGVyX2JpdF9lbmNvZGluZyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9yZ2IxMF9hMnVpCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX3JnYjEwX2EydWkgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfc3dpenpsZQorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9zd2l6emxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90aW1lcl9xdWVyeQorI2RlZmluZSBHTF9BUkJfdGltZXJfcXVlcnkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xRdWVyeUNvdW50ZXIgKEdMdWludCBpZCwgR0xlbnVtIHRhcmdldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3RpNjR2IChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xpbnQ2NCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRRdWVyeU9iamVjdHVpNjR2IChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50NjQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xRVUVSWUNPVU5URVJQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUVVFUllPQkpFQ1RJNjRWUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludDY0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWU9CSkVDVFVJNjRWUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQ2NCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfdHlwZV8yXzEwXzEwXzEwX3JldgorI2RlZmluZSBHTF9BUkJfdmVydGV4X3R5cGVfMl8xMF8xMF8xMF9yZXYgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhQMnVpIChHTGVudW0gdHlwZSwgR0x1aW50IHZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhQMnVpdiAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFAzdWkgKEdMZW51bSB0eXBlLCBHTHVpbnQgdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFAzdWl2IChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UDR1aSAoR0xlbnVtIHR5cGUsIEdMdWludCB2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UDR1aXYgKEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFAxdWkgKEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFAxdWl2IChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkUDJ1aSAoR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkUDJ1aXYgKEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQM3VpIChHTGVudW0gdHlwZSwgR0x1aW50IGNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQM3VpdiAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFA0dWkgKEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFA0dWl2IChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmRQMXVpIChHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmRQMXVpdiAoR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZFAydWkgKEdMZW51bSB0ZXh0dXJlLCBHTGVudW0gdHlwZSwgR0x1aW50IGNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZFAydWl2IChHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkUDN1aSAoR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkUDN1aXYgKEdMZW51bSB0ZXh0dXJlLCBHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmRQNHVpIChHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmRQNHVpdiAoR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsUDN1aSAoR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFAzdWl2IChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUDN1aSAoR0xlbnVtIHR5cGUsIEdMdWludCBjb2xvcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JQM3VpdiAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29sb3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUDR1aSAoR0xlbnVtIHR5cGUsIEdMdWludCBjb2xvcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JQNHVpdiAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29sb3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yUDN1aSAoR0xlbnVtIHR5cGUsIEdMdWludCBjb2xvcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3JQM3VpdiAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29sb3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlAxdWkgKEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHVpbnQgdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlAxdWl2IChHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliUDJ1aSAoR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMdWludCB2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliUDJ1aXYgKEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJQM3VpIChHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0x1aW50IHZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJQM3VpdiAoR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlA0dWkgKEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHVpbnQgdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlA0dWl2IChHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhQMlVJUFJPQykgKEdMZW51bSB0eXBlLCBHTHVpbnQgdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhQMlVJVlBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFAzVUlQUk9DKSAoR0xlbnVtIHR5cGUsIEdMdWludCB2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFAzVUlWUFJPQykgKEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYUDRVSVBST0MpIChHTGVudW0gdHlwZSwgR0x1aW50IHZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYUDRVSVZQUk9DKSAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRFAxVUlQUk9DKSAoR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRFAxVUlWUFJPQykgKEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEUDJVSVBST0MpIChHTGVudW0gdHlwZSwgR0x1aW50IGNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEUDJVSVZQUk9DKSAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkRQM1VJUFJPQykgKEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkRQM1VJVlBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRFA0VUlQUk9DKSAoR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRFA0VUlWUFJPQykgKEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkRQMVVJUFJPQykgKEdMZW51bSB0ZXh0dXJlLCBHTGVudW0gdHlwZSwgR0x1aW50IGNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkRQMVVJVlBST0MpIChHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRFAyVUlQUk9DKSAoR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRFAyVUlWUFJPQykgKEdMZW51bSB0ZXh0dXJlLCBHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEUDNVSVBST0MpIChHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEUDNVSVZQUk9DKSAoR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkRQNFVJUFJPQykgKEdMZW51bSB0ZXh0dXJlLCBHTGVudW0gdHlwZSwgR0x1aW50IGNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkRQNFVJVlBST0MpIChHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMUDNVSVBST0MpIChHTGVudW0gdHlwZSwgR0x1aW50IGNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFAzVUlWUFJPQykgKEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SUDNVSVBST0MpIChHTGVudW0gdHlwZSwgR0x1aW50IGNvbG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JQM1VJVlBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb2xvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SUDRVSVBST0MpIChHTGVudW0gdHlwZSwgR0x1aW50IGNvbG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JQNFVJVlBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb2xvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SUDNVSVBST0MpIChHTGVudW0gdHlwZSwgR0x1aW50IGNvbG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1JQM1VJVlBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb2xvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlAxVUlQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMdWludCB2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlAxVUlWUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUDJVSVBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0x1aW50IHZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUDJVSVZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQM1VJUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHVpbnQgdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQM1VJVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlA0VUlQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMdWludCB2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlA0VUlWUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9kcmF3X2luZGlyZWN0CisjZGVmaW5lIEdMX0FSQl9kcmF3X2luZGlyZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0FycmF5c0luZGlyZWN0IChHTGVudW0gbW9kZSwgY29uc3QgR0x2b2lkICppbmRpcmVjdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRzSW5kaXJlY3QgKEdMZW51bSBtb2RlLCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpcmVjdCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXQVJSQVlTSU5ESVJFQ1RQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMdm9pZCAqaW5kaXJlY3QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXRUxFTUVOVFNJTkRJUkVDVFBST0MpIChHTGVudW0gbW9kZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaXJlY3QpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2dwdV9zaGFkZXI1CisjZGVmaW5lIEdMX0FSQl9ncHVfc2hhZGVyNSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZ3B1X3NoYWRlcl9mcDY0CisjZGVmaW5lIEdMX0FSQl9ncHVfc2hhZGVyX2ZwNjQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWQgKEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMmQgKEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2QgKEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGQgKEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWR2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMmR2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2R2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGR2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4MmR2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M2R2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4NGR2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4MngzZHYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgyeDRkdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDN4MmR2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M3g0ZHYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXg0eDJkdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDR4M2R2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtZHYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMURQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMkRQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0RQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNERQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMURWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMkRWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0RWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNERWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYMkRWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYM0RWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYNERWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYMlgzRFZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVgyWDREVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDNYMkRWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYM1g0RFZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVg0WDJEVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDRYM0RWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNRFZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkZXJfc3Vicm91dGluZQorI2RlZmluZSBHTF9BUkJfc2hhZGVyX3N1YnJvdXRpbmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsR2V0U3Vicm91dGluZVVuaWZvcm1Mb2NhdGlvbiAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBjb25zdCBHTGNoYXIgKm5hbWUpOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2V0U3Vicm91dGluZUluZGV4IChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QWN0aXZlU3Vicm91dGluZVVuaWZvcm1pdiAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnZhbHVlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QWN0aXZlU3Vicm91dGluZVVuaWZvcm1OYW1lIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QWN0aXZlU3Vicm91dGluZU5hbWUgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtU3Vicm91dGluZXN1aXYgKEdMZW51bSBzaGFkZXJ0eXBlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKmluZGljZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFVuaWZvcm1TdWJyb3V0aW5ldWl2IChHTGVudW0gc2hhZGVydHlwZSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtU3RhZ2VpdiAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcG5hbWUsIEdMaW50ICp2YWx1ZXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVFNVQlJPVVRJTkVVTklGT1JNTE9DQVRJT05QUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVFNVQlJPVVRJTkVJTkRFWFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIGNvbnN0IEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVNVQlJPVVRJTkVVTklGT1JNSVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnZhbHVlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVNVQlJPVVRJTkVVTklGT1JNTkFNRVBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVNVQlJPVVRJTkVOQU1FUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STVNVQlJPVVRJTkVTVUlWUFJPQykgKEdMZW51bSBzaGFkZXJ0eXBlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKmluZGljZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNU1VCUk9VVElORVVJVlBST0MpIChHTGVudW0gc2hhZGVydHlwZSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVNUQUdFSVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcG5hbWUsIEdMaW50ICp2YWx1ZXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3Rlc3NlbGxhdGlvbl9zaGFkZXIKKyNkZWZpbmUgR0xfQVJCX3Rlc3NlbGxhdGlvbl9zaGFkZXIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQYXRjaFBhcmFtZXRlcmkgKEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBhdGNoUGFyYW1ldGVyZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqdmFsdWVzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBBVENIUEFSQU1FVEVSSVBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUEFUQ0hQQVJBTUVURVJGVlBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnZhbHVlcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9idWZmZXJfb2JqZWN0X3JnYjMyCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2J1ZmZlcl9vYmplY3RfcmdiMzIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RyYW5zZm9ybV9mZWVkYmFjazIKKyNkZWZpbmUgR0xfQVJCX3RyYW5zZm9ybV9mZWVkYmFjazIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVHJhbnNmb3JtRmVlZGJhY2sgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlVHJhbnNmb3JtRmVlZGJhY2tzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5UcmFuc2Zvcm1GZWVkYmFja3MgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNUcmFuc2Zvcm1GZWVkYmFjayAoR0x1aW50IGlkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQYXVzZVRyYW5zZm9ybUZlZWRiYWNrICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXN1bWVUcmFuc2Zvcm1GZWVkYmFjayAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd1RyYW5zZm9ybUZlZWRiYWNrIChHTGVudW0gbW9kZSwgR0x1aW50IGlkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRUUkFOU0ZPUk1GRUVEQkFDS1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVUUkFOU0ZPUk1GRUVEQkFDS1NQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlRSQU5TRk9STUZFRURCQUNLU1BST0MpIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1RSQU5TRk9STUZFRURCQUNLUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBBVVNFVFJBTlNGT1JNRkVFREJBQ0tQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFU1VNRVRSQU5TRk9STUZFRURCQUNLUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXVFJBTlNGT1JNRkVFREJBQ0tQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBpZCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdHJhbnNmb3JtX2ZlZWRiYWNrMworI2RlZmluZSBHTF9BUkJfdHJhbnNmb3JtX2ZlZWRiYWNrMyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbSAoR0xlbnVtIG1vZGUsIEdMdWludCBpZCwgR0x1aW50IHN0cmVhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5RdWVyeUluZGV4ZWQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGlkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmRRdWVyeUluZGV4ZWQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlJbmRleGVkaXYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdUUkFOU0ZPUk1GRUVEQkFDS1NUUkVBTVBST0MpIChHTGVudW0gbW9kZSwgR0x1aW50IGlkLCBHTHVpbnQgc3RyZWFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkVHSU5RVUVSWUlOREVYRURQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRRVUVSWUlOREVYRURQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUVVFUllJTkRFWEVESVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX0VTMl9jb21wYXRpYmlsaXR5CisjZGVmaW5lIEdMX0FSQl9FUzJfY29tcGF0aWJpbGl0eSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlbGVhc2VTaGFkZXJDb21waWxlciAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyQmluYXJ5IChHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnNoYWRlcnMsIEdMZW51bSBiaW5hcnlmb3JtYXQsIGNvbnN0IEdMdm9pZCAqYmluYXJ5LCBHTHNpemVpIGxlbmd0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0IChHTGVudW0gc2hhZGVydHlwZSwgR0xlbnVtIHByZWNpc2lvbnR5cGUsIEdMaW50ICpyYW5nZSwgR0xpbnQgKnByZWNpc2lvbik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhSYW5nZWYgKEdMY2xhbXBmIG4sIEdMY2xhbXBmIGYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyRGVwdGhmIChHTGNsYW1wZiBkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFTEVBU0VTSEFERVJDT01QSUxFUlBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0hBREVSQklOQVJZUFJPQykgKEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqc2hhZGVycywgR0xlbnVtIGJpbmFyeWZvcm1hdCwgY29uc3QgR0x2b2lkICpiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0hBREVSUFJFQ0lTSU9ORk9STUFUUFJPQykgKEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcHJlY2lzaW9udHlwZSwgR0xpbnQgKnJhbmdlLCBHTGludCAqcHJlY2lzaW9uKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVQVEhSQU5HRUZQUk9DKSAoR0xjbGFtcGYgbiwgR0xjbGFtcGYgZik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENMRUFSREVQVEhGUFJPQykgKEdMY2xhbXBmIGQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2dldF9wcm9ncmFtX2JpbmFyeQorI2RlZmluZSBHTF9BUkJfZ2V0X3Byb2dyYW1fYmluYXJ5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUJpbmFyeSAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGVudW0gKmJpbmFyeUZvcm1hdCwgR0x2b2lkICpiaW5hcnkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1CaW5hcnkgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gYmluYXJ5Rm9ybWF0LCBjb25zdCBHTHZvaWQgKmJpbmFyeSwgR0xzaXplaSBsZW5ndGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXJpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCB2YWx1ZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNQklOQVJZUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xlbnVtICpiaW5hcnlGb3JtYXQsIEdMdm9pZCAqYmluYXJ5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUJJTkFSWVBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIGJpbmFyeUZvcm1hdCwgY29uc3QgR0x2b2lkICpiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUklQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzCisjZGVmaW5lIEdMX0FSQl9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVzZVByb2dyYW1TdGFnZXMgKEdMdWludCBwaXBlbGluZSwgR0xiaXRmaWVsZCBzdGFnZXMsIEdMdWludCBwcm9ncmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBY3RpdmVTaGFkZXJQcm9ncmFtIChHTHVpbnQgcGlwZWxpbmUsIEdMdWludCBwcm9ncmFtKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbENyZWF0ZVNoYWRlclByb2dyYW12IChHTGVudW0gdHlwZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiAqc3RyaW5ncyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFByb2dyYW1QaXBlbGluZSAoR0x1aW50IHBpcGVsaW5lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVQcm9ncmFtUGlwZWxpbmVzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcGlwZWxpbmVzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5Qcm9ncmFtUGlwZWxpbmVzIChHTHNpemVpIG4sIEdMdWludCAqcGlwZWxpbmVzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUHJvZ3JhbVBpcGVsaW5lIChHTHVpbnQgcGlwZWxpbmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1QaXBlbGluZWl2IChHTHVpbnQgcGlwZWxpbmUsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xaSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xaXYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTFmIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTFkIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHYwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTFkdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMXVpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xdWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMmkgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJpdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMmYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMmQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgdjAsIEdMZG91YmxlIHYxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJkdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMnVpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJ1aXYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zaSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTNpdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2YgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2Mik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2QgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgdjAsIEdMZG91YmxlIHYxLCBHTGRvdWJsZSB2Mik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zZHYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTN1aSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTN1aXYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00aSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyLCBHTGludCB2Myk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00aXYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTRmIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIsIEdMZmxvYXQgdjMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTRkIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHYwLCBHTGRvdWJsZSB2MSwgR0xkb3VibGUgdjIsIEdMZG91YmxlIHYzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTRkdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNHVpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIsIEdMdWludCB2Myk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00dWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MmZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MmR2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZHYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDRkdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MngzZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M3gyZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4Mng0ZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NHgyZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M3g0ZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NHgzZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MngzZHYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDN4MmR2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDRkdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NHgyZHYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDN4NGR2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDNkdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhbGlkYXRlUHJvZ3JhbVBpcGVsaW5lIChHTHVpbnQgcGlwZWxpbmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1QaXBlbGluZUluZm9Mb2cgKEdMdWludCBwaXBlbGluZSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVU0VQUk9HUkFNU1RBR0VTUFJPQykgKEdMdWludCBwaXBlbGluZSwgR0xiaXRmaWVsZCBzdGFnZXMsIEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQUNUSVZFU0hBREVSUFJPR1JBTVBST0MpIChHTHVpbnQgcGlwZWxpbmUsIEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xDUkVBVEVTSEFERVJQUk9HUkFNVlBST0MpIChHTGVudW0gdHlwZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiAqc3RyaW5ncyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRQUk9HUkFNUElQRUxJTkVQUk9DKSAoR0x1aW50IHBpcGVsaW5lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFUFJPR1JBTVBJUEVMSU5FU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcGlwZWxpbmVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOUFJPR1JBTVBJUEVMSU5FU1BST0MpIChHTHNpemVpIG4sIEdMdWludCAqcGlwZWxpbmVzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1BST0dSQU1QSVBFTElORVBST0MpIChHTHVpbnQgcGlwZWxpbmUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNUElQRUxJTkVJVlBST0MpIChHTHVpbnQgcGlwZWxpbmUsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMUlQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMUlWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xRlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFGVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xRFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHYwKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xRFZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFVSVBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMVVJVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJJUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0ySVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJGUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMkZWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJEUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgdjAsIEdMZG91YmxlIHYxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yRFZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJVSVBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yVUlWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0lQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zSVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNGUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2Mik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0ZWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNEUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgdjAsIEdMZG91YmxlIHYxLCBHTGRvdWJsZSB2Mik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0RWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zVUlQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zVUlWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNElQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyLCBHTGludCB2Myk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNElWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00RlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIsIEdMZmxvYXQgdjMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRGVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00RFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHYwLCBHTGRvdWJsZSB2MSwgR0xkb3VibGUgdjIsIEdMZG91YmxlIHYzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00RFZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRVSVBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIsIEdMdWludCB2Myk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNFVJVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJGVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgzRlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYNEZWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJEVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYM0RWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVg0RFZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJYM0ZWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDNYMkZWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJYNEZWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDRYMkZWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDNYNEZWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDRYM0ZWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJYM0RWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgzWDJEVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYMlg0RFZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDRYMkRWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgzWDREVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYNFgzRFZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQUxJREFURVBST0dSQU1QSVBFTElORVBST0MpIChHTHVpbnQgcGlwZWxpbmUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNUElQRUxJTkVJTkZPTE9HUFJPQykgKEdMdWludCBwaXBlbGluZSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X2F0dHJpYl82NGJpdAorI2RlZmluZSBHTF9BUkJfdmVydGV4X2F0dHJpYl82NGJpdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwxZCAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMMmQgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDNkIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkw0ZCAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMMWR2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMMmR2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMM2R2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMNGR2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMUG9pbnRlciAoR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliTGR2IChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMMURQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDJEUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkwzRFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMNERQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDFEVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDJEVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDNEVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDREVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTFBPSU5URVJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkxEVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmlld3BvcnRfYXJyYXkKKyNkZWZpbmUgR0xfQVJCX3ZpZXdwb3J0X2FycmF5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmlld3BvcnRBcnJheXYgKEdMdWludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmlld3BvcnRJbmRleGVkZiAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB3LCBHTGZsb2F0IGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZpZXdwb3J0SW5kZXhlZGZ2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNjaXNzb3JBcnJheXYgKEdMdWludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNjaXNzb3JJbmRleGVkIChHTHVpbnQgaW5kZXgsIEdMaW50IGxlZnQsIEdMaW50IGJvdHRvbSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNjaXNzb3JJbmRleGVkdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhSYW5nZUFycmF5diAoR0x1aW50IGZpcnN0LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNsYW1wZCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhSYW5nZUluZGV4ZWQgKEdMdWludCBpbmRleCwgR0xjbGFtcGQgbiwgR0xjbGFtcGQgZik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RmxvYXRpX3YgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RG91YmxlaV92IChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlICpkYXRhKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZJRVdQT1JUQVJSQVlWUFJPQykgKEdMdWludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZJRVdQT1JUSU5ERVhFREZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB3LCBHTGZsb2F0IGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWSUVXUE9SVElOREVYRURGVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQ0lTU09SQVJSQVlWUFJPQykgKEdMdWludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQ0lTU09SSU5ERVhFRFBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IGxlZnQsIEdMaW50IGJvdHRvbSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQ0lTU09SSU5ERVhFRFZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFUFRIUkFOR0VBUlJBWVZQUk9DKSAoR0x1aW50IGZpcnN0LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNsYW1wZCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFUFRIUkFOR0VJTkRFWEVEUFJPQykgKEdMdWludCBpbmRleCwgR0xjbGFtcGQgbiwgR0xjbGFtcGQgZik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZMT0FUSV9WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVERPVUJMRUlfVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlICpkYXRhKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9jbF9ldmVudAorI2RlZmluZSBHTF9BUkJfY2xfZXZlbnQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMc3luYyBBUElFTlRSWSBnbENyZWF0ZVN5bmNGcm9tQ0xldmVudEFSQiAoc3RydWN0IF9jbF9jb250ZXh0ICogY29udGV4dCwgc3RydWN0IF9jbF9ldmVudCAqIGV2ZW50LCBHTGJpdGZpZWxkIGZsYWdzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMc3luYyAoQVBJRU5UUllQIFBGTkdMQ1JFQVRFU1lOQ0ZST01DTEVWRU5UQVJCUFJPQykgKHN0cnVjdCBfY2xfY29udGV4dCAqIGNvbnRleHQsIHN0cnVjdCBfY2xfZXZlbnQgKiBldmVudCwgR0xiaXRmaWVsZCBmbGFncyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZGVidWdfb3V0cHV0CisjZGVmaW5lIEdMX0FSQl9kZWJ1Z19vdXRwdXQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWJ1Z01lc3NhZ2VDb250cm9sQVJCIChHTGVudW0gc291cmNlLCBHTGVudW0gdHlwZSwgR0xlbnVtIHNldmVyaXR5LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKmlkcywgR0xib29sZWFuIGVuYWJsZWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlYnVnTWVzc2FnZUluc2VydEFSQiAoR0xlbnVtIHNvdXJjZSwgR0xlbnVtIHR5cGUsIEdMdWludCBpZCwgR0xlbnVtIHNldmVyaXR5LCBHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICpidWYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlYnVnTWVzc2FnZUNhbGxiYWNrQVJCIChHTERFQlVHUFJPQ0FSQiBjYWxsYmFjaywgY29uc3QgR0x2b2lkICp1c2VyUGFyYW0pOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2V0RGVidWdNZXNzYWdlTG9nQVJCIChHTHVpbnQgY291bnQsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xlbnVtICpzb3VyY2VzLCBHTGVudW0gKnR5cGVzLCBHTHVpbnQgKmlkcywgR0xlbnVtICpzZXZlcml0aWVzLCBHTHNpemVpICpsZW5ndGhzLCBHTGNoYXIgKm1lc3NhZ2VMb2cpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVCVUdNRVNTQUdFQ09OVFJPTEFSQlBST0MpIChHTGVudW0gc291cmNlLCBHTGVudW0gdHlwZSwgR0xlbnVtIHNldmVyaXR5LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKmlkcywgR0xib29sZWFuIGVuYWJsZWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUJVR01FU1NBR0VJTlNFUlRBUkJQUk9DKSAoR0xlbnVtIHNvdXJjZSwgR0xlbnVtIHR5cGUsIEdMdWludCBpZCwgR0xlbnVtIHNldmVyaXR5LCBHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICpidWYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUJVR01FU1NBR0VDQUxMQkFDS0FSQlBST0MpIChHTERFQlVHUFJPQ0FSQiBjYWxsYmFjaywgY29uc3QgR0x2b2lkICp1c2VyUGFyYW0pOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVERFQlVHTUVTU0FHRUxPR0FSQlBST0MpIChHTHVpbnQgY291bnQsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xlbnVtICpzb3VyY2VzLCBHTGVudW0gKnR5cGVzLCBHTHVpbnQgKmlkcywgR0xlbnVtICpzZXZlcml0aWVzLCBHTHNpemVpICpsZW5ndGhzLCBHTGNoYXIgKm1lc3NhZ2VMb2cpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3JvYnVzdG5lc3MKKyNkZWZpbmUgR0xfQVJCX3JvYnVzdG5lc3MgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMZW51bSBBUElFTlRSWSBnbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNBUkIgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldG5NYXBkdkFSQiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHF1ZXJ5LCBHTHNpemVpIGJ1ZlNpemUsIEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRuTWFwZnZBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBxdWVyeSwgR0xzaXplaSBidWZTaXplLCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRuTWFwaXZBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBxdWVyeSwgR0xzaXplaSBidWZTaXplLCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0blBpeGVsTWFwZnZBUkIgKEdMZW51bSBtYXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xmbG9hdCAqdmFsdWVzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRuUGl4ZWxNYXB1aXZBUkIgKEdMZW51bSBtYXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x1aW50ICp2YWx1ZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldG5QaXhlbE1hcHVzdkFSQiAoR0xlbnVtIG1hcCwgR0xzaXplaSBidWZTaXplLCBHTHVzaG9ydCAqdmFsdWVzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRuUG9seWdvblN0aXBwbGVBUkIgKEdMc2l6ZWkgYnVmU2l6ZSwgR0x1Ynl0ZSAqcGF0dGVybik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0bkNvbG9yVGFibGVBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIEdMdm9pZCAqdGFibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldG5Db252b2x1dGlvbkZpbHRlckFSQiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x2b2lkICppbWFnZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0blNlcGFyYWJsZUZpbHRlckFSQiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgcm93QnVmU2l6ZSwgR0x2b2lkICpyb3csIEdMc2l6ZWkgY29sdW1uQnVmU2l6ZSwgR0x2b2lkICpjb2x1bW4sIEdMdm9pZCAqc3Bhbik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0bkhpc3RvZ3JhbUFSQiAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCBHTHZvaWQgKnZhbHVlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0bk1pbm1heEFSQiAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCBHTHZvaWQgKnZhbHVlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0blRleEltYWdlQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x2b2lkICppbWcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlYWRuUGl4ZWxzQVJCIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRuQ29tcHJlc3NlZFRleEltYWdlQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludCBsb2QsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x2b2lkICppbWcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldG5Vbmlmb3JtZnZBUkIgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldG5Vbmlmb3JtaXZBUkIgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRuVW5pZm9ybXVpdkFSQiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRuVW5pZm9ybWR2QVJCIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xkb3VibGUgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTGVudW0gKEFQSUVOVFJZUCBQRk5HTEdFVEdSQVBISUNTUkVTRVRTVEFUVVNBUkJQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5NQVBEVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcXVlcnksIEdMc2l6ZWkgYnVmU2l6ZSwgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROTUFQRlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHF1ZXJ5LCBHTHNpemVpIGJ1ZlNpemUsIEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROTUFQSVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHF1ZXJ5LCBHTHNpemVpIGJ1ZlNpemUsIEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTlBJWEVMTUFQRlZBUkJQUk9DKSAoR0xlbnVtIG1hcCwgR0xzaXplaSBidWZTaXplLCBHTGZsb2F0ICp2YWx1ZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROUElYRUxNQVBVSVZBUkJQUk9DKSAoR0xlbnVtIG1hcCwgR0xzaXplaSBidWZTaXplLCBHTHVpbnQgKnZhbHVlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5QSVhFTE1BUFVTVkFSQlBST0MpIChHTGVudW0gbWFwLCBHTHNpemVpIGJ1ZlNpemUsIEdMdXNob3J0ICp2YWx1ZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROUE9MWUdPTlNUSVBQTEVBUkJQUk9DKSAoR0xzaXplaSBidWZTaXplLCBHTHVieXRlICpwYXR0ZXJuKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTkNPTE9SVEFCTEVBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x2b2lkICp0YWJsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5DT05WT0xVVElPTkZJTFRFUkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCBHTHZvaWQgKmltYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTlNFUEFSQUJMRUZJTFRFUkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSByb3dCdWZTaXplLCBHTHZvaWQgKnJvdywgR0xzaXplaSBjb2x1bW5CdWZTaXplLCBHTHZvaWQgKmNvbHVtbiwgR0x2b2lkICpzcGFuKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTkhJU1RPR1JBTUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGJvb2xlYW4gcmVzZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIEdMdm9pZCAqdmFsdWVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTk1JTk1BWEFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGJvb2xlYW4gcmVzZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIEdMdm9pZCAqdmFsdWVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTlRFWElNQUdFQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCBHTHZvaWQgKmltZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFQUROUElYRUxTQVJCUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROQ09NUFJFU1NFRFRFWElNQUdFQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxvZCwgR0xzaXplaSBidWZTaXplLCBHTHZvaWQgKmltZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5VTklGT1JNRlZBUkJQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5VTklGT1JNSVZBUkJQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROVU5JRk9STVVJVkFSQlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROVU5JRk9STURWQVJCUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGRvdWJsZSAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkZXJfc3RlbmNpbF9leHBvcnQKKyNkZWZpbmUgR0xfQVJCX3NoYWRlcl9zdGVuY2lsX2V4cG9ydCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfYmFzZV9pbnN0YW5jZQorI2RlZmluZSBHTF9BUkJfYmFzZV9pbnN0YW5jZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdBcnJheXNJbnN0YW5jZWRCYXNlSW5zdGFuY2UgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgR0xzaXplaSBwcmltY291bnQsIEdMdWludCBiYXNlaW5zdGFuY2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdFbGVtZW50c0luc3RhbmNlZEJhc2VJbnN0YW5jZSAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCwgR0x1aW50IGJhc2VpbnN0YW5jZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRzSW5zdGFuY2VkQmFzZVZlcnRleEJhc2VJbnN0YW5jZSAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCwgR0xpbnQgYmFzZXZlcnRleCwgR0x1aW50IGJhc2VpbnN0YW5jZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXQVJSQVlTSU5TVEFOQ0VEQkFTRUlOU1RBTkNFUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgR0xzaXplaSBwcmltY291bnQsIEdMdWludCBiYXNlaW5zdGFuY2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXRUxFTUVOVFNJTlNUQU5DRURCQVNFSU5TVEFOQ0VQUk9DKSAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCwgR0x1aW50IGJhc2VpbnN0YW5jZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdFTEVNRU5UU0lOU1RBTkNFREJBU0VWRVJURVhCQVNFSU5TVEFOQ0VQUk9DKSAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCwgR0xpbnQgYmFzZXZlcnRleCwgR0x1aW50IGJhc2VpbnN0YW5jZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrCisjZGVmaW5lIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2sgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RyYW5zZm9ybV9mZWVkYmFja19pbnN0YW5jZWQKKyNkZWZpbmUgR0xfQVJCX3RyYW5zZm9ybV9mZWVkYmFja19pbnN0YW5jZWQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3VHJhbnNmb3JtRmVlZGJhY2tJbnN0YW5jZWQgKEdMZW51bSBtb2RlLCBHTHVpbnQgaWQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1JbnN0YW5jZWQgKEdMZW51bSBtb2RlLCBHTHVpbnQgaWQsIEdMdWludCBzdHJlYW0sIEdMc2l6ZWkgcHJpbWNvdW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdUUkFOU0ZPUk1GRUVEQkFDS0lOU1RBTkNFRFBST0MpIChHTGVudW0gbW9kZSwgR0x1aW50IGlkLCBHTHNpemVpIHByaW1jb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdUUkFOU0ZPUk1GRUVEQkFDS1NUUkVBTUlOU1RBTkNFRFBST0MpIChHTGVudW0gbW9kZSwgR0x1aW50IGlkLCBHTHVpbnQgc3RyZWFtLCBHTHNpemVpIHByaW1jb3VudCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfY29tcHJlc3NlZF90ZXh0dXJlX3BpeGVsX3N0b3JhZ2UKKyNkZWZpbmUgR0xfQVJCX2NvbXByZXNzZWRfdGV4dHVyZV9waXhlbF9zdG9yYWdlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9jb25zZXJ2YXRpdmVfZGVwdGgKKyNkZWZpbmUgR0xfQVJCX2NvbnNlcnZhdGl2ZV9kZXB0aCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfaW50ZXJuYWxmb3JtYXRfcXVlcnkKKyNkZWZpbmUgR0xfQVJCX2ludGVybmFsZm9ybWF0X3F1ZXJ5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW50ZXJuYWxmb3JtYXRpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTlRFUk5BTEZPUk1BVElWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGJ1ZlNpemUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX21hcF9idWZmZXJfYWxpZ25tZW50CisjZGVmaW5lIEdMX0FSQl9tYXBfYnVmZmVyX2FsaWdubWVudCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGVyX2F0b21pY19jb3VudGVycworI2RlZmluZSBHTF9BUkJfc2hhZGVyX2F0b21pY19jb3VudGVycyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZUF0b21pY0NvdW50ZXJCdWZmZXJpdiAoR0x1aW50IHByb2dyYW0sIEdMdWludCBidWZmZXJJbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRUFUT01JQ0NPVU5URVJCVUZGRVJJVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGJ1ZmZlckluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlCisjZGVmaW5lIEdMX0FSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRJbWFnZVRleHR1cmUgKEdMdWludCB1bml0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMYm9vbGVhbiBsYXllcmVkLCBHTGludCBsYXllciwgR0xlbnVtIGFjY2VzcywgR0xlbnVtIGZvcm1hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWVtb3J5QmFycmllciAoR0xiaXRmaWVsZCBiYXJyaWVycyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5ESU1BR0VURVhUVVJFUFJPQykgKEdMdWludCB1bml0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMYm9vbGVhbiBsYXllcmVkLCBHTGludCBsYXllciwgR0xlbnVtIGFjY2VzcywgR0xlbnVtIGZvcm1hdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1FTU9SWUJBUlJJRVJQUk9DKSAoR0xiaXRmaWVsZCBiYXJyaWVycyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV9wYWNraW5nCisjZGVmaW5lIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlX3BhY2tpbmcgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfc3RvcmFnZQorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9zdG9yYWdlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3RvcmFnZTFEIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhTdG9yYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhTdG9yYWdlM0QgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlU3RvcmFnZTFERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZVN0b3JhZ2UyREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlU3RvcmFnZTNERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1RPUkFHRTFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhTVE9SQUdFMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhTVE9SQUdFM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFU1RPUkFHRTFERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRVNUT1JBR0UyREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFU1RPUkFHRTNERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYWJncgorI2RlZmluZSBHTF9FWFRfYWJnciAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfY29sb3IKKyNkZWZpbmUgR0xfRVhUX2JsZW5kX2NvbG9yIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRDb2xvckVYVCAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRDT0xPUkVYVFBST0MpIChHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcG9seWdvbl9vZmZzZXQKKyNkZWZpbmUgR0xfRVhUX3BvbHlnb25fb2Zmc2V0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9seWdvbk9mZnNldEVYVCAoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgYmlhcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0xZR09OT0ZGU0VURVhUUFJPQykgKEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IGJpYXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmUKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmUzRAorI2RlZmluZSBHTF9FWFRfdGV4dHVyZTNEIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4SW1hZ2UzREVYVCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTNERVhUIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhJTUFHRTNERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFNVQklNQUdFM0RFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU190ZXh0dXJlX2ZpbHRlcjQKKyNkZWZpbmUgR0xfU0dJU190ZXh0dXJlX2ZpbHRlcjQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXhGaWx0ZXJGdW5jU0dJUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZpbHRlciwgR0xmbG9hdCAqd2VpZ2h0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RmlsdGVyRnVuY1NHSVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmaWx0ZXIsIEdMc2l6ZWkgbiwgY29uc3QgR0xmbG9hdCAqd2VpZ2h0cyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhGSUxURVJGVU5DU0dJU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZmlsdGVyLCBHTGZsb2F0ICp3ZWlnaHRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYRklMVEVSRlVOQ1NHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZpbHRlciwgR0xzaXplaSBuLCBjb25zdCBHTGZsb2F0ICp3ZWlnaHRzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zdWJ0ZXh0dXJlCisjZGVmaW5lIEdMX0VYVF9zdWJ0ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UxREVYVCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UyREVYVCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0UxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0UyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY29weV90ZXh0dXJlCisjZGVmaW5lIEdMX0VYVF9jb3B5X3RleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UxREVYVCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyREVYVCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMURFWFQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UyREVYVCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UzREVYVCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhJTUFHRTFERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhJTUFHRTJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYU1VCSU1BR0UxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhTVUJJTUFHRTJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhTVUJJTUFHRTNERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfaGlzdG9ncmFtCisjZGVmaW5lIEdMX0VYVF9oaXN0b2dyYW0gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW1FWFQgKEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdmFsdWVzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW1QYXJhbWV0ZXJmdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcml2RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1pbm1heEVYVCAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp2YWx1ZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1pbm1heFBhcmFtZXRlcmZ2RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWlubWF4UGFyYW1ldGVyaXZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSGlzdG9ncmFtRVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMYm9vbGVhbiBzaW5rKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNaW5tYXhFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xib29sZWFuIHNpbmspOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlc2V0SGlzdG9ncmFtRVhUIChHTGVudW0gdGFyZ2V0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXNldE1pbm1heEVYVCAoR0xlbnVtIHRhcmdldCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRISVNUT0dSQU1FWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp2YWx1ZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRISVNUT0dSQU1QQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEhJU1RPR1JBTVBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1JTk1BWEVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGJvb2xlYW4gcmVzZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnZhbHVlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1JTk1BWFBBUkFNRVRFUkZWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUlOTUFYUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSElTVE9HUkFNRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xib29sZWFuIHNpbmspOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNSU5NQVhFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGJvb2xlYW4gc2luayk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFU0VUSElTVE9HUkFNRVhUUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVNFVE1JTk1BWEVYVFBST0MpIChHTGVudW0gdGFyZ2V0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jb252b2x1dGlvbgorI2RlZmluZSBHTF9FWFRfY29udm9sdXRpb24gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvbkZpbHRlcjFERVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmltYWdlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvbkZpbHRlcjJERVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbWFnZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcmZ2RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIxREVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIyREVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25GaWx0ZXJFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKmltYWdlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb252b2x1dGlvblBhcmFtZXRlcmZ2RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJpdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTZXBhcmFibGVGaWx0ZXJFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnJvdywgR0x2b2lkICpjb2x1bW4sIEdMdm9pZCAqc3Bhbik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2VwYXJhYmxlRmlsdGVyMkRFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnJvdywgY29uc3QgR0x2b2lkICpjb2x1bW4pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05GSUxURVIxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmltYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05GSUxURVIyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbWFnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSRkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05QQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSSUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTlZPTFVUSU9ORklMVEVSMURFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTlZPTFVUSU9ORklMVEVSMkRFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTlZPTFVUSU9ORklMVEVSRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKmltYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09OVk9MVVRJT05QQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTlZPTFVUSU9OUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0VQQVJBQkxFRklMVEVSRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnJvdywgR0x2b2lkICpjb2x1bW4sIEdMdm9pZCAqc3Bhbik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFUEFSQUJMRUZJTFRFUjJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnJvdywgY29uc3QgR0x2b2lkICpjb2x1bW4pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJX2NvbG9yX21hdHJpeAorI2RlZmluZSBHTF9TR0lfY29sb3JfbWF0cml4IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSV9jb2xvcl90YWJsZQorI2RlZmluZSBHTF9TR0lfY29sb3JfdGFibGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlU0dJIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnRhYmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlUGFyYW1ldGVyZnZTR0kgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlUGFyYW1ldGVyaXZTR0kgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbG9yVGFibGVTR0kgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVNHSSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGFibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJmdlNHSSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJpdlNHSSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SVEFCTEVTR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICp0YWJsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SVEFCTEVQQVJBTUVURVJGVlNHSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SVEFCTEVQQVJBTUVURVJJVlNHSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZQ09MT1JUQUJMRVNHSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT0xPUlRBQkxFU0dJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRhYmxlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVBBUkFNRVRFUkZWU0dJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVBBUkFNRVRFUklWU0dJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3BpeGVsX3RleHR1cmUKKyNkZWZpbmUgR0xfU0dJWF9waXhlbF90ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUZXhHZW5TR0lYIChHTGVudW0gbW9kZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRFWEdFTlNHSVhQUk9DKSAoR0xlbnVtIG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19waXhlbF90ZXh0dXJlCisjZGVmaW5lIEdMX1NHSVNfcGl4ZWxfdGV4dHVyZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVGV4R2VuUGFyYW1ldGVyaVNHSVMgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVGV4R2VuUGFyYW1ldGVyaXZTR0lTIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVGV4R2VuUGFyYW1ldGVyZlNHSVMgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUZXhHZW5QYXJhbWV0ZXJmdlNHSVMgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQaXhlbFRleEdlblBhcmFtZXRlcml2U0dJUyAoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQaXhlbFRleEdlblBhcmFtZXRlcmZ2U0dJUyAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUElYRUxURVhHRU5QQVJBTUVURVJJU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUElYRUxURVhHRU5QQVJBTUVURVJJVlNHSVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUElYRUxURVhHRU5QQVJBTUVURVJGU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRFWEdFTlBBUkFNRVRFUkZWU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBJWEVMVEVYR0VOUEFSQU1FVEVSSVZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBJWEVMVEVYR0VOUEFSQU1FVEVSRlZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZTRECisjZGVmaW5lIEdMX1NHSVNfdGV4dHVyZTREIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4SW1hZ2U0RFNHSVMgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTHNpemVpIHNpemU0ZCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN1YkltYWdlNERTR0lTIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgd29mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMc2l6ZWkgc2l6ZTRkLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYSU1BR0U0RFNHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMc2l6ZWkgc2l6ZTRkLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFNVQklNQUdFNERTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB3b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xzaXplaSBzaXplNGQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lfdGV4dHVyZV9jb2xvcl90YWJsZQorI2RlZmluZSBHTF9TR0lfdGV4dHVyZV9jb2xvcl90YWJsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY215a2EKKyNkZWZpbmUgR0xfRVhUX2NteWthIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX29iamVjdAorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbEFyZVRleHR1cmVzUmVzaWRlbnRFWFQgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcywgR0xib29sZWFuICpyZXNpZGVuY2VzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZUVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVRleHR1cmVzRVhUIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblRleHR1cmVzRVhUIChHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNUZXh0dXJlRVhUIChHTHVpbnQgdGV4dHVyZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJpb3JpdGl6ZVRleHR1cmVzRVhUIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMsIGNvbnN0IEdMY2xhbXBmICpwcmlvcml0aWVzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMQVJFVEVYVFVSRVNSRVNJREVOVEVYVFBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMsIEdMYm9vbGVhbiAqcmVzaWRlbmNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRURVhUVVJFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFVEVYVFVSRVNFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOVEVYVFVSRVNFWFRQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1RFWFRVUkVFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUklPUklUSVpFVEVYVFVSRVNFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzLCBjb25zdCBHTGNsYW1wZiAqcHJpb3JpdGllcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX2RldGFpbF90ZXh0dXJlCisjZGVmaW5lIEdMX1NHSVNfZGV0YWlsX3RleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXRhaWxUZXhGdW5jU0dJUyAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBuLCBjb25zdCBHTGZsb2F0ICpwb2ludHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldERldGFpbFRleEZ1bmNTR0lTIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0ICpwb2ludHMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVUQUlMVEVYRlVOQ1NHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBuLCBjb25zdCBHTGZsb2F0ICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRERVRBSUxURVhGVU5DU0dJU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0ICpwb2ludHMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19zaGFycGVuX3RleHR1cmUKKyNkZWZpbmUgR0xfU0dJU19zaGFycGVuX3RleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTaGFycGVuVGV4RnVuY1NHSVMgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbiwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTaGFycGVuVGV4RnVuY1NHSVMgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgKnBvaW50cyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTSEFSUEVOVEVYRlVOQ1NHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBuLCBjb25zdCBHTGZsb2F0ICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRTSEFSUEVOVEVYRlVOQ1NHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCAqcG9pbnRzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9wYWNrZWRfcGl4ZWxzCisjZGVmaW5lIEdMX0VYVF9wYWNrZWRfcGl4ZWxzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9sb2QKKyNkZWZpbmUgR0xfU0dJU190ZXh0dXJlX2xvZCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX1NHSVNfbXVsdGlzYW1wbGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVNYXNrU0dJUyAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZVBhdHRlcm5TR0lTIChHTGVudW0gcGF0dGVybik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVNQVNLU0dJU1BST0MpIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRVBBVFRFUk5TR0lTUFJPQykgKEdMZW51bSBwYXR0ZXJuKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9yZXNjYWxlX25vcm1hbAorI2RlZmluZSBHTF9FWFRfcmVzY2FsZV9ub3JtYWwgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF9hcnJheQorI2RlZmluZSBHTF9FWFRfdmVydGV4X2FycmF5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQXJyYXlFbGVtZW50RVhUIChHTGludCBpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclBvaW50ZXJFWFQgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3QXJyYXlzRVhUIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVkZ2VGbGFnUG9pbnRlckVYVCAoR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMYm9vbGVhbiAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UG9pbnRlcnZFWFQgKEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbmRleFBvaW50ZXJFWFQgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVyRVhUIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQb2ludGVyRVhUIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UG9pbnRlckVYVCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVJSQVlFTEVNRU5URVhUUFJPQykgKEdMaW50IGkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlBPSU5URVJFWFRQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXQVJSQVlTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVER0VGTEFHUE9JTlRFUkVYVFBST0MpIChHTHNpemVpIHN0cmlkZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xib29sZWFuICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUE9JTlRFUlZFWFRQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTkRFWFBPSU5URVJFWFRQUk9DKSAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxQT0lOVEVSRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkRQT0lOVEVSRVhUUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYUE9JTlRFUkVYVFBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfbWlzY19hdHRyaWJ1dGUKKyNkZWZpbmUgR0xfRVhUX21pc2NfYXR0cmlidXRlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwCisjZGVmaW5lIEdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfY2xpcG1hcAorI2RlZmluZSBHTF9TR0lYX2NsaXBtYXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9zaGFkb3cKKyNkZWZpbmUgR0xfU0dJWF9zaGFkb3cgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU190ZXh0dXJlX2VkZ2VfY2xhbXAKKyNkZWZpbmUgR0xfU0dJU190ZXh0dXJlX2VkZ2VfY2xhbXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU190ZXh0dXJlX2JvcmRlcl9jbGFtcAorI2RlZmluZSBHTF9TR0lTX3RleHR1cmVfYm9yZGVyX2NsYW1wIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9ibGVuZF9taW5tYXgKKyNkZWZpbmUgR0xfRVhUX2JsZW5kX21pbm1heCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRXF1YXRpb25FWFQgKEdMZW51bSBtb2RlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05FWFRQUk9DKSAoR0xlbnVtIG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX3N1YnRyYWN0CisjZGVmaW5lIEdMX0VYVF9ibGVuZF9zdWJ0cmFjdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfbG9naWNfb3AKKyNkZWZpbmUgR0xfRVhUX2JsZW5kX2xvZ2ljX29wIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaW50ZXJsYWNlCisjZGVmaW5lIEdMX1NHSVhfaW50ZXJsYWNlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcGl4ZWxfdGlsZXMKKyNkZWZpbmUgR0xfU0dJWF9waXhlbF90aWxlcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfc2VsZWN0CisjZGVmaW5lIEdMX1NHSVhfdGV4dHVyZV9zZWxlY3QgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9zcHJpdGUKKyNkZWZpbmUgR0xfU0dJWF9zcHJpdGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTcHJpdGVQYXJhbWV0ZXJmU0dJWCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTcHJpdGVQYXJhbWV0ZXJmdlNHSVggKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTcHJpdGVQYXJhbWV0ZXJpU0dJWCAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3ByaXRlUGFyYW1ldGVyaXZTR0lYIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1BSSVRFUEFSQU1FVEVSRlNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1BSSVRFUEFSQU1FVEVSRlZTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1BSSVRFUEFSQU1FVEVSSVNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNQUklURVBBUkFNRVRFUklWU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX211bHRpX2J1ZmZlcgorI2RlZmluZSBHTF9TR0lYX3RleHR1cmVfbXVsdGlfYnVmZmVyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9wb2ludF9wYXJhbWV0ZXJzCisjZGVmaW5lIEdMX0VYVF9wb2ludF9wYXJhbWV0ZXJzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmRVhUIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZnZFWFQgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSRkVYVFBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZWRVhUUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfcG9pbnRfcGFyYW1ldGVycworI2RlZmluZSBHTF9TR0lTX3BvaW50X3BhcmFtZXRlcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmZTR0lTIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZnZTR0lTIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSRlZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaW5zdHJ1bWVudHMKKyNkZWZpbmUgR0xfU0dJWF9pbnN0cnVtZW50cyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRJbnN0cnVtZW50c1NHSVggKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEluc3RydW1lbnRzQnVmZmVyU0dJWCAoR0xzaXplaSBzaXplLCBHTGludCAqYnVmZmVyKTsKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsUG9sbEluc3RydW1lbnRzU0dJWCAoR0xpbnQgKm1hcmtlcl9wKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZWFkSW5zdHJ1bWVudHNTR0lYIChHTGludCBtYXJrZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0YXJ0SW5zdHJ1bWVudHNTR0lYICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdG9wSW5zdHJ1bWVudHNTR0lYIChHTGludCBtYXJrZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVElOU1RSVU1FTlRTU0dJWFBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU5TVFJVTUVOVFNCVUZGRVJTR0lYUFJPQykgKEdMc2l6ZWkgc2l6ZSwgR0xpbnQgKmJ1ZmZlcik7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xQT0xMSU5TVFJVTUVOVFNTR0lYUFJPQykgKEdMaW50ICptYXJrZXJfcCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFQURJTlNUUlVNRU5UU1NHSVhQUk9DKSAoR0xpbnQgbWFya2VyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RBUlRJTlNUUlVNRU5UU1NHSVhQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNUT1BJTlNUUlVNRU5UU1NHSVhQUk9DKSAoR0xpbnQgbWFya2VyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9zY2FsZV9iaWFzCisjZGVmaW5lIEdMX1NHSVhfdGV4dHVyZV9zY2FsZV9iaWFzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZnJhbWV6b29tCisjZGVmaW5lIEdMX1NHSVhfZnJhbWV6b29tIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVab29tU0dJWCAoR0xpbnQgZmFjdG9yKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FWk9PTVNHSVhQUk9DKSAoR0xpbnQgZmFjdG9yKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGFnX3NhbXBsZV9idWZmZXIKKyNkZWZpbmUgR0xfU0dJWF90YWdfc2FtcGxlX2J1ZmZlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhZ1NhbXBsZUJ1ZmZlclNHSVggKHZvaWQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFHU0FNUExFQlVGRkVSU0dJWFBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcG9seW5vbWlhbF9mZmQKKyNkZWZpbmUgR0xfU0dJWF9wb2x5bm9taWFsX2ZmZCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlZm9ybWF0aW9uTWFwM2RTR0lYIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSB1MSwgR0xkb3VibGUgdTIsIEdMaW50IHVzdHJpZGUsIEdMaW50IHVvcmRlciwgR0xkb3VibGUgdjEsIEdMZG91YmxlIHYyLCBHTGludCB2c3RyaWRlLCBHTGludCB2b3JkZXIsIEdMZG91YmxlIHcxLCBHTGRvdWJsZSB3MiwgR0xpbnQgd3N0cmlkZSwgR0xpbnQgd29yZGVyLCBjb25zdCBHTGRvdWJsZSAqcG9pbnRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWZvcm1hdGlvbk1hcDNmU0dJWCAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCB1MSwgR0xmbG9hdCB1MiwgR0xpbnQgdXN0cmlkZSwgR0xpbnQgdW9yZGVyLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGludCB2c3RyaWRlLCBHTGludCB2b3JkZXIsIEdMZmxvYXQgdzEsIEdMZmxvYXQgdzIsIEdMaW50IHdzdHJpZGUsIEdMaW50IHdvcmRlciwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWZvcm1TR0lYIChHTGJpdGZpZWxkIG1hc2spOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRJZGVudGl0eURlZm9ybWF0aW9uTWFwU0dJWCAoR0xiaXRmaWVsZCBtYXNrKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFRk9STUFUSU9OTUFQM0RTR0lYUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHUxLCBHTGRvdWJsZSB1MiwgR0xpbnQgdXN0cmlkZSwgR0xpbnQgdW9yZGVyLCBHTGRvdWJsZSB2MSwgR0xkb3VibGUgdjIsIEdMaW50IHZzdHJpZGUsIEdMaW50IHZvcmRlciwgR0xkb3VibGUgdzEsIEdMZG91YmxlIHcyLCBHTGludCB3c3RyaWRlLCBHTGludCB3b3JkZXIsIGNvbnN0IEdMZG91YmxlICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUZPUk1BVElPTk1BUDNGU0dJWFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHUxLCBHTGZsb2F0IHUyLCBHTGludCB1c3RyaWRlLCBHTGludCB1b3JkZXIsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIsIEdMaW50IHZzdHJpZGUsIEdMaW50IHZvcmRlciwgR0xmbG9hdCB3MSwgR0xmbG9hdCB3MiwgR0xpbnQgd3N0cmlkZSwgR0xpbnQgd29yZGVyLCBjb25zdCBHTGZsb2F0ICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUZPUk1TR0lYUFJPQykgKEdMYml0ZmllbGQgbWFzayk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQURJREVOVElUWURFRk9STUFUSU9OTUFQU0dJWFBST0MpIChHTGJpdGZpZWxkIG1hc2spOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9yZWZlcmVuY2VfcGxhbmUKKyNkZWZpbmUgR0xfU0dJWF9yZWZlcmVuY2VfcGxhbmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZWZlcmVuY2VQbGFuZVNHSVggKGNvbnN0IEdMZG91YmxlICplcXVhdGlvbik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRUZFUkVOQ0VQTEFORVNHSVhQUk9DKSAoY29uc3QgR0xkb3VibGUgKmVxdWF0aW9uKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZmx1c2hfcmFzdGVyCisjZGVmaW5lIEdMX1NHSVhfZmx1c2hfcmFzdGVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmx1c2hSYXN0ZXJTR0lYICh2b2lkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZMVVNIUkFTVEVSU0dJWFBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZGVwdGhfdGV4dHVyZQorI2RlZmluZSBHTF9TR0lYX2RlcHRoX3RleHR1cmUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19mb2dfZnVuY3Rpb24KKyNkZWZpbmUgR0xfU0dJU19mb2dfZnVuY3Rpb24gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dGdW5jU0dJUyAoR0xzaXplaSBuLCBjb25zdCBHTGZsb2F0ICpwb2ludHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZvZ0Z1bmNTR0lTIChHTGZsb2F0ICpwb2ludHMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HRlVOQ1NHSVNQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTGZsb2F0ICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRGT0dGVU5DU0dJU1BST0MpIChHTGZsb2F0ICpwb2ludHMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9mb2dfb2Zmc2V0CisjZGVmaW5lIEdMX1NHSVhfZm9nX29mZnNldCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9IUF9pbWFnZV90cmFuc2Zvcm0KKyNkZWZpbmUgR0xfSFBfaW1hZ2VfdHJhbnNmb3JtIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJpSFAgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyZkhQIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyaXZIUCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmZ2SFAgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcml2SFAgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJmdkhQIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTUFHRVRSQU5TRk9STVBBUkFNRVRFUklIUFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU1BR0VUUkFOU0ZPUk1QQVJBTUVURVJGSFBQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU1BR0VUUkFOU0ZPUk1QQVJBTUVURVJJVkhQUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElNQUdFVFJBTlNGT1JNUEFSQU1FVEVSRlZIUFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVElNQUdFVFJBTlNGT1JNUEFSQU1FVEVSSVZIUFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTUFHRVRSQU5TRk9STVBBUkFNRVRFUkZWSFBQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfY29udm9sdXRpb25fYm9yZGVyX21vZGVzCisjZGVmaW5lIEdMX0hQX2NvbnZvbHV0aW9uX2JvcmRlcl9tb2RlcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfYWRkX2VudgorI2RlZmluZSBHTF9TR0lYX3RleHR1cmVfYWRkX2VudiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY29sb3Jfc3VidGFibGUKKyNkZWZpbmUgR0xfRVhUX2NvbG9yX3N1YnRhYmxlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JTdWJUYWJsZUVYVCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzdGFydCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbG9yU3ViVGFibGVFWFQgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc3RhcnQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JTVUJUQUJMRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHN0YXJ0LCBHTHNpemVpIGNvdW50LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTE9SU1VCVEFCTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzdGFydCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9QR0lfdmVydGV4X2hpbnRzCisjZGVmaW5lIEdMX1BHSV92ZXJ0ZXhfaGludHMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfUEdJX21pc2NfaGludHMKKyNkZWZpbmUgR0xfUEdJX21pc2NfaGludHMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xIaW50UEdJIChHTGVudW0gdGFyZ2V0LCBHTGludCBtb2RlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEhJTlRQR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbW9kZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZQorI2RlZmluZSBHTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yVGFibGVFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbEZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqdGFibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJpdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyZnZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SVEFCTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsRm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICp0YWJsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT0xPUlRBQkxFUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NsaXBfdm9sdW1lX2hpbnQKKyNkZWZpbmUgR0xfRVhUX2NsaXBfdm9sdW1lX2hpbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9saXN0X3ByaW9yaXR5CisjZGVmaW5lIEdMX1NHSVhfbGlzdF9wcmlvcml0eSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldExpc3RQYXJhbWV0ZXJmdlNHSVggKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TGlzdFBhcmFtZXRlcml2U0dJWCAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlzdFBhcmFtZXRlcmZTR0lYIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaXN0UGFyYW1ldGVyZnZTR0lYIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpc3RQYXJhbWV0ZXJpU0dJWCAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpc3RQYXJhbWV0ZXJpdlNHSVggKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTElTVFBBUkFNRVRFUkZWU0dJWFBST0MpIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRMSVNUUEFSQU1FVEVSSVZTR0lYUFJPQykgKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMSVNUUEFSQU1FVEVSRlNHSVhQUk9DKSAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExJU1RQQVJBTUVURVJGVlNHSVhQUk9DKSAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElTVFBBUkFNRVRFUklTR0lYUFJPQykgKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElTVFBBUkFNRVRFUklWU0dJWFBST0MpIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaXJfaW5zdHJ1bWVudDEKKyNkZWZpbmUgR0xfU0dJWF9pcl9pbnN0cnVtZW50MSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2NhbGxpZ3JhcGhpY19mcmFnbWVudAorI2RlZmluZSBHTF9TR0lYX2NhbGxpZ3JhcGhpY19mcmFnbWVudCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfbG9kX2JpYXMKKyNkZWZpbmUgR0xfU0dJWF90ZXh0dXJlX2xvZF9iaWFzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfc2hhZG93X2FtYmllbnQKKyNkZWZpbmUgR0xfU0dJWF9zaGFkb3dfYW1iaWVudCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfaW5kZXhfdGV4dHVyZQorI2RlZmluZSBHTF9FWFRfaW5kZXhfdGV4dHVyZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfaW5kZXhfbWF0ZXJpYWwKKyNkZWZpbmUgR0xfRVhUX2luZGV4X21hdGVyaWFsIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW5kZXhNYXRlcmlhbEVYVCAoR0xlbnVtIGZhY2UsIEdMZW51bSBtb2RlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElOREVYTUFURVJJQUxFWFRQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBtb2RlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9pbmRleF9mdW5jCisjZGVmaW5lIEdMX0VYVF9pbmRleF9mdW5jIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW5kZXhGdW5jRVhUIChHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElOREVYRlVOQ0VYVFBST0MpIChHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9pbmRleF9hcnJheV9mb3JtYXRzCisjZGVmaW5lIEdMX0VYVF9pbmRleF9hcnJheV9mb3JtYXRzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jb21waWxlZF92ZXJ0ZXhfYXJyYXkKKyNkZWZpbmUgR0xfRVhUX2NvbXBpbGVkX3ZlcnRleF9hcnJheSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvY2tBcnJheXNFWFQgKEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmxvY2tBcnJheXNFWFQgKHZvaWQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9DS0FSUkFZU0VYVFBST0MpIChHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOTE9DS0FSUkFZU0VYVFBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jdWxsX3ZlcnRleAorI2RlZmluZSBHTF9FWFRfY3VsbF92ZXJ0ZXggMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDdWxsUGFyYW1ldGVyZHZFWFQgKEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ3VsbFBhcmFtZXRlcmZ2RVhUIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDVUxMUEFSQU1FVEVSRFZFWFRQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ1VMTFBBUkFNRVRFUkZWRVhUUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfeWNyY2IKKyNkZWZpbmUgR0xfU0dJWF95Y3JjYiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZyYWdtZW50X2xpZ2h0aW5nCisjZGVmaW5lIEdMX1NHSVhfZnJhZ21lbnRfbGlnaHRpbmcgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudENvbG9yTWF0ZXJpYWxTR0lYIChHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRmU0dJWCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRmdlNHSVggKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRpU0dJWCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudExpZ2h0aXZTR0lYIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRMaWdodE1vZGVsZlNHSVggKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRMaWdodE1vZGVsZnZTR0lYIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRMaWdodE1vZGVsaVNHSVggKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRNb2RlbGl2U0dJWCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudE1hdGVyaWFsZlNHSVggKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TWF0ZXJpYWxmdlNHSVggKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRNYXRlcmlhbGlTR0lYIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRNYXRlcmlhbGl2U0dJWCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RnJhZ21lbnRMaWdodGZ2U0dJWCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RnJhZ21lbnRMaWdodGl2U0dJWCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZyYWdtZW50TWF0ZXJpYWxmdlNHSVggKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RnJhZ21lbnRNYXRlcmlhbGl2U0dJWCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRFbnZpU0dJWCAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVENPTE9STUFURVJJQUxTR0lYUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRGU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRGVlNHSVhQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRJU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVExJR0hUSVZTR0lYUFJPQykgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRMSUdIVE1PREVMRlNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRMSUdIVE1PREVMRlZTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRMSUdIVE1PREVMSVNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRNT0RFTElWU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVE1BVEVSSUFMRlNHSVhQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTUFURVJJQUxGVlNHSVhQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRNQVRFUklBTElTR0lYUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRNQVRFUklBTElWU0dJWFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURlJBR01FTlRMSUdIVEZWU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURlJBR01FTlRMSUdIVElWU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQUdNRU5UTUFURVJJQUxGVlNHSVhQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURlJBR01FTlRNQVRFUklBTElWU0dJWFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElHSFRFTlZJU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lCTV9yYXN0ZXJwb3NfY2xpcAorI2RlZmluZSBHTF9JQk1fcmFzdGVycG9zX2NsaXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfdGV4dHVyZV9saWdodGluZworI2RlZmluZSBHTF9IUF90ZXh0dXJlX2xpZ2h0aW5nIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9kcmF3X3JhbmdlX2VsZW1lbnRzCisjZGVmaW5lIEdMX0VYVF9kcmF3X3JhbmdlX2VsZW1lbnRzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd1JhbmdlRWxlbWVudHNFWFQgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV1JBTkdFRUxFTUVOVFNFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9XSU5fcGhvbmdfc2hhZGluZworI2RlZmluZSBHTF9XSU5fcGhvbmdfc2hhZGluZyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9XSU5fc3BlY3VsYXJfZm9nCisjZGVmaW5lIEdMX1dJTl9zcGVjdWxhcl9mb2cgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2xpZ2h0X3RleHR1cmUKKyNkZWZpbmUgR0xfRVhUX2xpZ2h0X3RleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBcHBseVRleHR1cmVFWFQgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlTGlnaHRFWFQgKEdMZW51bSBwbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZU1hdGVyaWFsRVhUIChHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVBQTFlURVhUVVJFRVhUUFJPQykgKEdMZW51bSBtb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRUxJR0hURVhUUFJPQykgKEdMZW51bSBwbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVNQVRFUklBTEVYVFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9ibGVuZF9hbHBoYV9taW5tYXgKKyNkZWZpbmUgR0xfU0dJWF9ibGVuZF9hbHBoYV9taW5tYXggMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JncmEKKyNkZWZpbmUgR0xfRVhUX2JncmEgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9hc3luYworI2RlZmluZSBHTF9TR0lYX2FzeW5jIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQXN5bmNNYXJrZXJTR0lYIChHTHVpbnQgbWFya2VyKTsKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsRmluaXNoQXN5bmNTR0lYIChHTHVpbnQgKm1hcmtlcnApOworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xQb2xsQXN5bmNTR0lYIChHTHVpbnQgKm1hcmtlcnApOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2VuQXN5bmNNYXJrZXJzU0dJWCAoR0xzaXplaSByYW5nZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlQXN5bmNNYXJrZXJzU0dJWCAoR0x1aW50IG1hcmtlciwgR0xzaXplaSByYW5nZSk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0FzeW5jTWFya2VyU0dJWCAoR0x1aW50IG1hcmtlcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBU1lOQ01BUktFUlNHSVhQUk9DKSAoR0x1aW50IG1hcmtlcik7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xGSU5JU0hBU1lOQ1NHSVhQUk9DKSAoR0x1aW50ICptYXJrZXJwKTsKK3R5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTFBPTExBU1lOQ1NHSVhQUk9DKSAoR0x1aW50ICptYXJrZXJwKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xHRU5BU1lOQ01BUktFUlNTR0lYUFJPQykgKEdMc2l6ZWkgcmFuZ2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVBU1lOQ01BUktFUlNTR0lYUFJPQykgKEdMdWludCBtYXJrZXIsIEdMc2l6ZWkgcmFuZ2UpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTQVNZTkNNQVJLRVJTR0lYUFJPQykgKEdMdWludCBtYXJrZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9hc3luY19waXhlbAorI2RlZmluZSBHTF9TR0lYX2FzeW5jX3BpeGVsIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfYXN5bmNfaGlzdG9ncmFtCisjZGVmaW5lIEdMX1NHSVhfYXN5bmNfaGlzdG9ncmFtIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lOVEVMX3BhcmFsbGVsX2FycmF5cworI2RlZmluZSBHTF9JTlRFTF9wYXJhbGxlbF9hcnJheXMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhQb2ludGVydklOVEVMIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsUG9pbnRlcnZJTlRFTCAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUG9pbnRlcnZJTlRFTCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkUG9pbnRlcnZJTlRFTCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYUE9JTlRFUlZJTlRFTFBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFBPSU5URVJWSU5URUxQUk9DKSAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlBPSU5URVJWSU5URUxQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRFBPSU5URVJWSU5URUxQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfb2NjbHVzaW9uX3Rlc3QKKyNkZWZpbmUgR0xfSFBfb2NjbHVzaW9uX3Rlc3QgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BpeGVsX3RyYW5zZm9ybQorI2RlZmluZSBHTF9FWFRfcGl4ZWxfdHJhbnNmb3JtIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJpRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcmZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJpdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcmZ2RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRSQU5TRk9STVBBUkFNRVRFUklFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMVFJBTlNGT1JNUEFSQU1FVEVSRkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRSQU5TRk9STVBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMVFJBTlNGT1JNUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BpeGVsX3RyYW5zZm9ybV9jb2xvcl90YWJsZQorI2RlZmluZSBHTF9FWFRfcGl4ZWxfdHJhbnNmb3JtX2NvbG9yX3RhYmxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zaGFyZWRfdGV4dHVyZV9wYWxldHRlCisjZGVmaW5lIEdMX0VYVF9zaGFyZWRfdGV4dHVyZV9wYWxldHRlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zZXBhcmF0ZV9zcGVjdWxhcl9jb2xvcgorI2RlZmluZSBHTF9FWFRfc2VwYXJhdGVfc3BlY3VsYXJfY29sb3IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3NlY29uZGFyeV9jb2xvcgorI2RlZmluZSBHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzYkVYVCAoR0xieXRlIHJlZCwgR0xieXRlIGdyZWVuLCBHTGJ5dGUgYmx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzYnZFWFQgKGNvbnN0IEdMYnl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZEVYVCAoR0xkb3VibGUgcmVkLCBHTGRvdWJsZSBncmVlbiwgR0xkb3VibGUgYmx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZHZFWFQgKGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNmRVhUIChHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNmdkVYVCAoY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzaUVYVCAoR0xpbnQgcmVkLCBHTGludCBncmVlbiwgR0xpbnQgYmx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzaXZFWFQgKGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNzRVhUIChHTHNob3J0IHJlZCwgR0xzaG9ydCBncmVlbiwgR0xzaG9ydCBibHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNzdkVYVCAoY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdWJFWFQgKEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VidkVYVCAoY29uc3QgR0x1Ynl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdWlFWFQgKEdMdWludCByZWQsIEdMdWludCBncmVlbiwgR0x1aW50IGJsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VpdkVYVCAoY29uc3QgR0x1aW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1c0VYVCAoR0x1c2hvcnQgcmVkLCBHTHVzaG9ydCBncmVlbiwgR0x1c2hvcnQgYmx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdXN2RVhUIChjb25zdCBHTHVzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3JQb2ludGVyRVhUIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNCRVhUUFJPQykgKEdMYnl0ZSByZWQsIEdMYnl0ZSBncmVlbiwgR0xieXRlIGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNCVkVYVFBST0MpIChjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNERVhUUFJPQykgKEdMZG91YmxlIHJlZCwgR0xkb3VibGUgZ3JlZW4sIEdMZG91YmxlIGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNEVkVYVFBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0ZFWFRQUk9DKSAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0ZWRVhUUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNJRVhUUFJPQykgKEdMaW50IHJlZCwgR0xpbnQgZ3JlZW4sIEdMaW50IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNJVkVYVFBST0MpIChjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1NFWFRQUk9DKSAoR0xzaG9ydCByZWQsIEdMc2hvcnQgZ3JlZW4sIEdMc2hvcnQgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1NWRVhUUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVQkVYVFBST0MpIChHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUJWRVhUUFJPQykgKGNvbnN0IEdMdWJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVSUVYVFBST0MpIChHTHVpbnQgcmVkLCBHTHVpbnQgZ3JlZW4sIEdMdWludCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUlWRVhUUFJPQykgKGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VTRVhUUFJPQykgKEdMdXNob3J0IHJlZCwgR0x1c2hvcnQgZ3JlZW4sIEdMdXNob3J0IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVU1ZFWFRQUk9DKSAoY29uc3QgR0x1c2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUlBPSU5URVJFWFRQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfcGVydHVyYl9ub3JtYWwKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfcGVydHVyYl9ub3JtYWwgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlTm9ybWFsRVhUIChHTGVudW0gbW9kZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFTk9STUFMRVhUUFJPQykgKEdMZW51bSBtb2RlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cworI2RlZmluZSBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aURyYXdBcnJheXNFWFQgKEdMZW51bSBtb2RlLCBjb25zdCBHTGludCAqZmlyc3QsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlEcmF3RWxlbWVudHNFWFQgKEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0FSUkFZU0VYVFBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSURSQVdFTEVNRU5UU0VYVFBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZm9nX2Nvb3JkCisjZGVmaW5lIEdMX0VYVF9mb2dfY29vcmQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGZFWFQgKEdMZmxvYXQgY29vcmQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkZnZFWFQgKGNvbnN0IEdMZmxvYXQgKmNvb3JkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGRFWFQgKEdMZG91YmxlIGNvb3JkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGR2RVhUIChjb25zdCBHTGRvdWJsZSAqY29vcmQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkUG9pbnRlckVYVCAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRGRVhUUFJPQykgKEdMZmxvYXQgY29vcmQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SREZWRVhUUFJPQykgKGNvbnN0IEdMZmxvYXQgKmNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRERVhUUFJPQykgKEdMZG91YmxlIGNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkREVkVYVFBST0MpIChjb25zdCBHTGRvdWJsZSAqY29vcmQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SRFBPSU5URVJFWFRQUk9DKSAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfUkVORF9zY3JlZW5fY29vcmRpbmF0ZXMKKyNkZWZpbmUgR0xfUkVORF9zY3JlZW5fY29vcmRpbmF0ZXMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2Nvb3JkaW5hdGVfZnJhbWUKKyNkZWZpbmUgR0xfRVhUX2Nvb3JkaW5hdGVfZnJhbWUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2JFWFQgKEdMYnl0ZSB0eCwgR0xieXRlIHR5LCBHTGJ5dGUgdHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzYnZFWFQgKGNvbnN0IEdMYnl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNkRVhUIChHTGRvdWJsZSB0eCwgR0xkb3VibGUgdHksIEdMZG91YmxlIHR6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2R2RVhUIChjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNmRVhUIChHTGZsb2F0IHR4LCBHTGZsb2F0IHR5LCBHTGZsb2F0IHR6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2Z2RVhUIChjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2lFWFQgKEdMaW50IHR4LCBHTGludCB0eSwgR0xpbnQgdHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzaXZFWFQgKGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M3NFWFQgKEdMc2hvcnQgdHgsIEdMc2hvcnQgdHksIEdMc2hvcnQgdHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzc3ZFWFQgKGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM2JFWFQgKEdMYnl0ZSBieCwgR0xieXRlIGJ5LCBHTGJ5dGUgYnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM2J2RVhUIChjb25zdCBHTGJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM2RFWFQgKEdMZG91YmxlIGJ4LCBHTGRvdWJsZSBieSwgR0xkb3VibGUgYnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM2R2RVhUIChjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzZkVYVCAoR0xmbG9hdCBieCwgR0xmbG9hdCBieSwgR0xmbG9hdCBieik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzZnZFWFQgKGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM2lFWFQgKEdMaW50IGJ4LCBHTGludCBieSwgR0xpbnQgYnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM2l2RVhUIChjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzc0VYVCAoR0xzaG9ydCBieCwgR0xzaG9ydCBieSwgR0xzaG9ydCBieik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzc3ZFWFQgKGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnRQb2ludGVyRVhUIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWxQb2ludGVyRVhUIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0JFWFRQUk9DKSAoR0xieXRlIHR4LCBHTGJ5dGUgdHksIEdMYnl0ZSB0eik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlQzQlZFWFRQUk9DKSAoY29uc3QgR0xieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNERVhUUFJPQykgKEdMZG91YmxlIHR4LCBHTGRvdWJsZSB0eSwgR0xkb3VibGUgdHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0RWRVhUUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNGRVhUUFJPQykgKEdMZmxvYXQgdHgsIEdMZmxvYXQgdHksIEdMZmxvYXQgdHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0ZWRVhUUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0lFWFRQUk9DKSAoR0xpbnQgdHgsIEdMaW50IHR5LCBHTGludCB0eik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlQzSVZFWFRQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM1NFWFRQUk9DKSAoR0xzaG9ydCB0eCwgR0xzaG9ydCB0eSwgR0xzaG9ydCB0eik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlQzU1ZFWFRQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0JFWFRQUk9DKSAoR0xieXRlIGJ4LCBHTGJ5dGUgYnksIEdMYnl0ZSBieik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0JWRVhUUFJPQykgKGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0RFWFRQUk9DKSAoR0xkb3VibGUgYngsIEdMZG91YmxlIGJ5LCBHTGRvdWJsZSBieik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0RWRVhUUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUwzRkVYVFBST0MpIChHTGZsb2F0IGJ4LCBHTGZsb2F0IGJ5LCBHTGZsb2F0IGJ6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUwzRlZFWFRQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0lFWFRQUk9DKSAoR0xpbnQgYngsIEdMaW50IGJ5LCBHTGludCBieik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0lWRVhUUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUwzU0VYVFBST0MpIChHTHNob3J0IGJ4LCBHTHNob3J0IGJ5LCBHTHNob3J0IGJ6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUwzU1ZFWFRQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlRQT0lOVEVSRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUxQT0lOVEVSRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2Vudl9jb21iaW5lCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2Vudl9jb21iaW5lIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3NwZWN1bGFyX3ZlY3RvcgorI2RlZmluZSBHTF9BUFBMRV9zcGVjdWxhcl92ZWN0b3IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfdHJhbnNmb3JtX2hpbnQKKyNkZWZpbmUgR0xfQVBQTEVfdHJhbnNmb3JtX2hpbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9mb2dfc2NhbGUKKyNkZWZpbmUgR0xfU0dJWF9mb2dfc2NhbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOWF9jb25zdGFudF9kYXRhCisjZGVmaW5lIEdMX1NVTlhfY29uc3RhbnRfZGF0YSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZpbmlzaFRleHR1cmVTVU5YICh2b2lkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZJTklTSFRFWFRVUkVTVU5YUFJPQykgKHZvaWQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX2dsb2JhbF9hbHBoYQorI2RlZmluZSBHTF9TVU5fZ2xvYmFsX2FscGhhIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3JiU1VOIChHTGJ5dGUgZmFjdG9yKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHbG9iYWxBbHBoYUZhY3RvcnNTVU4gKEdMc2hvcnQgZmFjdG9yKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHbG9iYWxBbHBoYUZhY3RvcmlTVU4gKEdMaW50IGZhY3Rvcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3JmU1VOIChHTGZsb2F0IGZhY3Rvcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3JkU1VOIChHTGRvdWJsZSBmYWN0b3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdsb2JhbEFscGhhRmFjdG9ydWJTVU4gKEdMdWJ5dGUgZmFjdG9yKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHbG9iYWxBbHBoYUZhY3RvcnVzU1VOIChHTHVzaG9ydCBmYWN0b3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdsb2JhbEFscGhhRmFjdG9ydWlTVU4gKEdMdWludCBmYWN0b3IpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JCU1VOUFJPQykgKEdMYnl0ZSBmYWN0b3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHTE9CQUxBTFBIQUZBQ1RPUlNTVU5QUk9DKSAoR0xzaG9ydCBmYWN0b3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHTE9CQUxBTFBIQUZBQ1RPUklTVU5QUk9DKSAoR0xpbnQgZmFjdG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JGU1VOUFJPQykgKEdMZmxvYXQgZmFjdG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JEU1VOUFJPQykgKEdMZG91YmxlIGZhY3Rvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SVUJTVU5QUk9DKSAoR0x1Ynl0ZSBmYWN0b3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHTE9CQUxBTFBIQUZBQ1RPUlVTU1VOUFJPQykgKEdMdXNob3J0IGZhY3Rvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SVUlTVU5QUk9DKSAoR0x1aW50IGZhY3Rvcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TVU5fdHJpYW5nbGVfbGlzdAorI2RlZmluZSBHTF9TVU5fdHJpYW5nbGVfbGlzdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpU1VOIChHTHVpbnQgY29kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldXNTVU4gKEdMdXNob3J0IGNvZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXViU1VOIChHTHVieXRlIGNvZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpdlNVTiAoY29uc3QgR0x1aW50ICpjb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1c3ZTVU4gKGNvbnN0IEdMdXNob3J0ICpjb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1YnZTVU4gKGNvbnN0IEdMdWJ5dGUgKmNvZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZVBvaW50ZXJTVU4gKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVNVTlBST0MpIChHTHVpbnQgY29kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVTU1VOUFJPQykgKEdMdXNob3J0IGNvZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVQlNVTlBST0MpIChHTHVieXRlIGNvZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpjb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVVNWU1VOUFJPQykgKGNvbnN0IEdMdXNob3J0ICpjb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUJWU1VOUFJPQykgKGNvbnN0IEdMdWJ5dGUgKmNvZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVQT0lOVEVSU1VOUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TVU5fdmVydGV4CisjZGVmaW5lIEdMX1NVTl92ZXJ0ZXggMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjR1YlZlcnRleDJmU1VOIChHTHVieXRlIHIsIEdMdWJ5dGUgZywgR0x1Ynl0ZSBiLCBHTHVieXRlIGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjR1YlZlcnRleDJmdlNVTiAoY29uc3QgR0x1Ynl0ZSAqYywgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0dWJWZXJ0ZXgzZlNVTiAoR0x1Ynl0ZSByLCBHTHVieXRlIGcsIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjR1YlZlcnRleDNmdlNVTiAoY29uc3QgR0x1Ynl0ZSAqYywgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3IzZlZlcnRleDNmU1VOIChHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjNmVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWwzZlZlcnRleDNmU1VOIChHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4gKEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmVmVydGV4M2ZTVU4gKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQ0ZlZlcnRleDRmU1VOIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCBwLCBHTGZsb2F0IHEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQ0ZlZlcnRleDRmdlNVTiAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmZDb2xvcjR1YlZlcnRleDNmU1VOIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0x1Ynl0ZSByLCBHTHVieXRlIGcsIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmQ29sb3I0dWJWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTHVieXRlICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmQ29sb3IzZlZlcnRleDNmU1VOIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZkNvbG9yM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmTm9ybWFsM2ZWZXJ0ZXgzZlNVTiAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTiAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkNGZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXg0ZlNVTiAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcCwgR0xmbG9hdCBxLCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IGEsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQ0ZkNvbG9yNGZOb3JtYWwzZlZlcnRleDRmdlNVTiAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVmVydGV4M2ZTVU4gKEdMdWludCByYywgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpQ29sb3I0dWJWZXJ0ZXgzZlNVTiAoR0x1aW50IHJjLCBHTHVieXRlIHIsIEdMdWJ5dGUgZywgR0x1Ynl0ZSBiLCBHTHVieXRlIGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpQ29sb3I0dWJWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMdWJ5dGUgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpQ29sb3IzZlZlcnRleDNmU1VOIChHTHVpbnQgcmMsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpQ29sb3IzZlZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlOb3JtYWwzZlZlcnRleDNmU1VOIChHTHVpbnQgcmMsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4gKEdMdWludCByYywgR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCBhLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmVmVydGV4M2ZTVU4gKEdMdWludCByYywgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZlZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZk5vcm1hbDNmVmVydGV4M2ZTVU4gKEdMdWludCByYywgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZk5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4gKEdMdWludCByYywgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjRVQlZFUlRFWDJGU1VOUFJPQykgKEdMdWJ5dGUgciwgR0x1Ynl0ZSBnLCBHTHVieXRlIGIsIEdMdWJ5dGUgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjRVQlZFUlRFWDJGVlNVTlBST0MpIChjb25zdCBHTHVieXRlICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0VUJWRVJURVgzRlNVTlBST0MpIChHTHVieXRlIHIsIEdMdWJ5dGUgZywgR0x1Ynl0ZSBiLCBHTHVieXRlIGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjRVQlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVieXRlICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1IzRlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUwzRlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUwzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCBhLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQ0RlZFUlRFWDRGU1VOUFJPQykgKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHAsIEdMZmxvYXQgcSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQ0RlZFUlRFWDRGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZDT0xPUjRVQlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTHVieXRlIHIsIEdMdWJ5dGUgZywgR0x1Ynl0ZSBiLCBHTHVieXRlIGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGQ09MT1I0VUJWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMdWJ5dGUgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGQ09MT1IzRlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRkNPTE9SM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZOT1JNQUwzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCBhLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRkNPTE9SNEZOT1JNQUwzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JENEZDT0xPUjRGTk9STUFMM0ZWRVJURVg0RlNVTlBST0MpIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCBwLCBHTGZsb2F0IHEsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQ0RkNPTE9SNEZOT1JNQUwzRlZFUlRFWDRGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJQ09MT1I0VUJWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMdWJ5dGUgciwgR0x1Ynl0ZSBnLCBHTHVieXRlIGIsIEdMdWJ5dGUgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJQ09MT1I0VUJWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0x1Ynl0ZSAqYywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJQ09MT1IzRlZFUlRFWDNGU1VOUFJPQykgKEdMdWludCByYywgR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJQ09MT1IzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlOT1JNQUwzRlZFUlRFWDNGU1VOUFJPQykgKEdMdWludCByYywgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJTk9STUFMM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IGEsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSUNPTE9SNEZOT1JNQUwzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlURVhDT09SRDJGVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJVEVYQ09PUkQyRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJVEVYQ09PUkQyRk5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJVEVYQ09PUkQyRk5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlURVhDT09SRDJGQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCBhLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlURVhDT09SRDJGQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9ibGVuZF9mdW5jX3NlcGFyYXRlCisjZGVmaW5lIEdMX0VYVF9ibGVuZF9mdW5jX3NlcGFyYXRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRGdW5jU2VwYXJhdGVFWFQgKEdMZW51bSBzZmFjdG9yUkdCLCBHTGVudW0gZGZhY3RvclJHQiwgR0xlbnVtIHNmYWN0b3JBbHBoYSwgR0xlbnVtIGRmYWN0b3JBbHBoYSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREZVTkNTRVBBUkFURUVYVFBST0MpIChHTGVudW0gc2ZhY3RvclJHQiwgR0xlbnVtIGRmYWN0b3JSR0IsIEdMZW51bSBzZmFjdG9yQWxwaGEsIEdMZW51bSBkZmFjdG9yQWxwaGEpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfSU5HUl9ibGVuZF9mdW5jX3NlcGFyYXRlCisjZGVmaW5lIEdMX0lOR1JfYmxlbmRfZnVuY19zZXBhcmF0ZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRnVuY1NlcGFyYXRlSU5HUiAoR0xlbnVtIHNmYWN0b3JSR0IsIEdMZW51bSBkZmFjdG9yUkdCLCBHTGVudW0gc2ZhY3RvckFscGhhLCBHTGVudW0gZGZhY3RvckFscGhhKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ1NFUEFSQVRFSU5HUlBST0MpIChHTGVudW0gc2ZhY3RvclJHQiwgR0xlbnVtIGRmYWN0b3JSR0IsIEdMZW51bSBzZmFjdG9yQWxwaGEsIEdMZW51bSBkZmFjdG9yQWxwaGEpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfSU5HUl9jb2xvcl9jbGFtcAorI2RlZmluZSBHTF9JTkdSX2NvbG9yX2NsYW1wIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lOR1JfaW50ZXJsYWNlX3JlYWQKKyNkZWZpbmUgR0xfSU5HUl9pbnRlcmxhY2VfcmVhZCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc3RlbmNpbF93cmFwCisjZGVmaW5lIEdMX0VYVF9zdGVuY2lsX3dyYXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUXzQyMl9waXhlbHMKKyNkZWZpbmUgR0xfRVhUXzQyMl9waXhlbHMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4Z2VuX3JlZmxlY3Rpb24KKyNkZWZpbmUgR0xfTlZfdGV4Z2VuX3JlZmxlY3Rpb24gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX2NvbnZvbHV0aW9uX2JvcmRlcl9tb2RlcworI2RlZmluZSBHTF9TVU5fY29udm9sdXRpb25fYm9yZGVyX21vZGVzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2Vudl9hZGQKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfZW52X2FkZCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcworI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfd2VpZ2h0aW5nCisjZGVmaW5lIEdMX0VYVF92ZXJ0ZXhfd2VpZ2h0aW5nIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4V2VpZ2h0ZkVYVCAoR0xmbG9hdCB3ZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFdlaWdodGZ2RVhUIChjb25zdCBHTGZsb2F0ICp3ZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFdlaWdodFBvaW50ZXJFWFQgKEdMc2l6ZWkgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYV0VJR0hURkVYVFBST0MpIChHTGZsb2F0IHdlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFdFSUdIVEZWRVhUUFJPQykgKGNvbnN0IEdMZmxvYXQgKndlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFdFSUdIVFBPSU5URVJFWFRQUk9DKSAoR0xzaXplaSBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9saWdodF9tYXhfZXhwb25lbnQKKyNkZWZpbmUgR0xfTlZfbGlnaHRfbWF4X2V4cG9uZW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9hcnJheV9yYW5nZQorI2RlZmluZSBHTF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGbHVzaFZlcnRleEFycmF5UmFuZ2VOViAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXJyYXlSYW5nZU5WIChHTHNpemVpIGxlbmd0aCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZMVVNIVkVSVEVYQVJSQVlSQU5HRU5WUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBUlJBWVJBTkdFTlZQUk9DKSAoR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMKKyNkZWZpbmUgR0xfTlZfcmVnaXN0ZXJfY29tYmluZXJzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJQYXJhbWV0ZXJmdk5WIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJQYXJhbWV0ZXJmTlYgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJQYXJhbWV0ZXJpdk5WIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbWJpbmVyUGFyYW1ldGVyaU5WIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21iaW5lcklucHV0TlYgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIGlucHV0LCBHTGVudW0gbWFwcGluZywgR0xlbnVtIGNvbXBvbmVudFVzYWdlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21iaW5lck91dHB1dE5WIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwb3J0aW9uLCBHTGVudW0gYWJPdXRwdXQsIEdMZW51bSBjZE91dHB1dCwgR0xlbnVtIHN1bU91dHB1dCwgR0xlbnVtIHNjYWxlLCBHTGVudW0gYmlhcywgR0xib29sZWFuIGFiRG90UHJvZHVjdCwgR0xib29sZWFuIGNkRG90UHJvZHVjdCwgR0xib29sZWFuIG11eFN1bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmluYWxDb21iaW5lcklucHV0TlYgKEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIGlucHV0LCBHTGVudW0gbWFwcGluZywgR0xlbnVtIGNvbXBvbmVudFVzYWdlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb21iaW5lcklucHV0UGFyYW1ldGVyZnZOViAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG9ydGlvbiwgR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tYmluZXJJbnB1dFBhcmFtZXRlcml2TlYgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb21iaW5lck91dHB1dFBhcmFtZXRlcmZ2TlYgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb21iaW5lck91dHB1dFBhcmFtZXRlcml2TlYgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RmluYWxDb21iaW5lcklucHV0UGFyYW1ldGVyZnZOViAoR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RmluYWxDb21iaW5lcklucHV0UGFyYW1ldGVyaXZOViAoR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NQklORVJQQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NQklORVJQQVJBTUVURVJGTlZQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NQklORVJQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVSUEFSQU1FVEVSSU5WUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01CSU5FUklOUFVUTlZQUk9DKSAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG9ydGlvbiwgR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gaW5wdXQsIEdMZW51bSBtYXBwaW5nLCBHTGVudW0gY29tcG9uZW50VXNhZ2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01CSU5FUk9VVFBVVE5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSBhYk91dHB1dCwgR0xlbnVtIGNkT3V0cHV0LCBHTGVudW0gc3VtT3V0cHV0LCBHTGVudW0gc2NhbGUsIEdMZW51bSBiaWFzLCBHTGJvb2xlYW4gYWJEb3RQcm9kdWN0LCBHTGJvb2xlYW4gY2REb3RQcm9kdWN0LCBHTGJvb2xlYW4gbXV4U3VtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRklOQUxDT01CSU5FUklOUFVUTlZQUk9DKSAoR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gaW5wdXQsIEdMZW51bSBtYXBwaW5nLCBHTGVudW0gY29tcG9uZW50VXNhZ2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT01CSU5FUklOUFVUUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwb3J0aW9uLCBHTGVudW0gdmFyaWFibGUsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NQklORVJJTlBVVFBBUkFNRVRFUklWTlZQUk9DKSAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG9ydGlvbiwgR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT01CSU5FUk9VVFBVVFBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG9ydGlvbiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT01CSU5FUk9VVFBVVFBBUkFNRVRFUklWTlZQUk9DKSAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG9ydGlvbiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURklOQUxDT01CSU5FUklOUFVUUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gdmFyaWFibGUsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURklOQUxDT01CSU5FUklOUFVUUEFSQU1FVEVSSVZOVlBST0MpIChHTGVudW0gdmFyaWFibGUsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mb2dfZGlzdGFuY2UKKyNkZWZpbmUgR0xfTlZfZm9nX2Rpc3RhbmNlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleGdlbl9lbWJvc3MKKyNkZWZpbmUgR0xfTlZfdGV4Z2VuX2VtYm9zcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9ibGVuZF9zcXVhcmUKKyNkZWZpbmUgR0xfTlZfYmxlbmRfc3F1YXJlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfZW52X2NvbWJpbmU0CisjZGVmaW5lIEdMX05WX3RleHR1cmVfZW52X2NvbWJpbmU0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0FfcmVzaXplX2J1ZmZlcnMKKyNkZWZpbmUgR0xfTUVTQV9yZXNpemVfYnVmZmVycyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlc2l6ZUJ1ZmZlcnNNRVNBICh2b2lkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFU0laRUJVRkZFUlNNRVNBUFJPQykgKHZvaWQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV93aW5kb3dfcG9zCisjZGVmaW5lIEdMX01FU0Ffd2luZG93X3BvcyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJkTUVTQSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmR2TUVTQSAoY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJmTUVTQSAoR0xmbG9hdCB4LCBHTGZsb2F0IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJmdk1FU0EgKGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJpTUVTQSAoR0xpbnQgeCwgR0xpbnQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMml2TUVTQSAoY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJzTUVTQSAoR0xzaG9ydCB4LCBHTHNob3J0IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJzdk1FU0EgKGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNkTUVTQSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2R2TUVTQSAoY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNmTUVTQSAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2Z2TUVTQSAoY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2lNRVNBIChHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzaXZNRVNBIChjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM3NNRVNBIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Mzc3ZNRVNBIChjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3M0ZE1FU0EgKEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRkdk1FU0EgKGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3M0Zk1FU0EgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNGZ2TUVTQSAoY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNGlNRVNBIChHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3M0aXZNRVNBIChjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNHNNRVNBIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRzdk1FU0EgKGNvbnN0IEdMc2hvcnQgKnYpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkRNRVNBUFJPQykgKEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRFZNRVNBUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkZNRVNBUFJPQykgKEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkZWTUVTQVBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMklNRVNBUFJPQykgKEdMaW50IHgsIEdMaW50IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MySVZNRVNBUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMlNNRVNBUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMlNWTUVTQVBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0RNRVNBUFJPQykgKEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRFZNRVNBUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0ZNRVNBUFJPQykgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRlZNRVNBUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzSU1FU0FQUk9DKSAoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNJVk1FU0FQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzU01FU0FQUk9DKSAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNTVk1FU0FQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzRETUVTQVBST0MpIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNERWTUVTQVBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzRGTUVTQVBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0RlZNRVNBUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0SU1FU0FQUk9DKSAoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzRJVk1FU0FQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0U01FU0FQUk9DKSAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNFNWTUVTQVBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lCTV9jdWxsX3ZlcnRleAorI2RlZmluZSBHTF9JQk1fY3VsbF92ZXJ0ZXggMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfSUJNX211bHRpbW9kZV9kcmF3X2FycmF5cworI2RlZmluZSBHTF9JQk1fbXVsdGltb2RlX2RyYXdfYXJyYXlzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlNb2RlRHJhd0FycmF5c0lCTSAoY29uc3QgR0xlbnVtICptb2RlLCBjb25zdCBHTGludCAqZmlyc3QsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCwgR0xpbnQgbW9kZXN0cmlkZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlNb2RlRHJhd0VsZW1lbnRzSUJNIChjb25zdCBHTGVudW0gKm1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBjb25zdCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQsIEdMaW50IG1vZGVzdHJpZGUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElNT0RFRFJBV0FSUkFZU0lCTVBST0MpIChjb25zdCBHTGVudW0gKm1vZGUsIGNvbnN0IEdMaW50ICpmaXJzdCwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50LCBHTGludCBtb2Rlc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElNT0RFRFJBV0VMRU1FTlRTSUJNUFJPQykgKGNvbnN0IEdMZW51bSAqbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIGNvbnN0ICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCwgR0xpbnQgbW9kZXN0cmlkZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fdmVydGV4X2FycmF5X2xpc3RzCisjZGVmaW5lIEdMX0lCTV92ZXJ0ZXhfYXJyYXlfbGlzdHMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclBvaW50ZXJMaXN0SUJNIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yUG9pbnRlckxpc3RJQk0gKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRWRnZUZsYWdQb2ludGVyTGlzdElCTSAoR0xpbnQgc3RyaWRlLCBjb25zdCBHTGJvb2xlYW4qICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkUG9pbnRlckxpc3RJQk0gKEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW5kZXhQb2ludGVyTGlzdElCTSAoR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVyTGlzdElCTSAoR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXJMaXN0SUJNIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFBvaW50ZXJMaXN0SUJNIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JQT0lOVEVSTElTVElCTVBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUlBPSU5URVJMSVNUSUJNUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVER0VGTEFHUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xpbnQgc3RyaWRlLCBjb25zdCBHTGJvb2xlYW4qICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SRFBPSU5URVJMSVNUSUJNUFJPQykgKEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElOREVYUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkRQT0lOVEVSTElTVElCTVBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhQT0lOVEVSTElTVElCTVBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9zdWJzYW1wbGUKKyNkZWZpbmUgR0xfU0dJWF9zdWJzYW1wbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF95Y3JjYmEKKyNkZWZpbmUgR0xfU0dJWF95Y3JjYmEgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF95Y3JjYl9zdWJzYW1wbGUKKyNkZWZpbmUgR0xfU0dJWF95Y3JjYl9zdWJzYW1wbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9kZXB0aF9wYXNzX2luc3RydW1lbnQKKyNkZWZpbmUgR0xfU0dJWF9kZXB0aF9wYXNzX2luc3RydW1lbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfM0RGWF90ZXh0dXJlX2NvbXByZXNzaW9uX0ZYVDEKKyNkZWZpbmUgR0xfM0RGWF90ZXh0dXJlX2NvbXByZXNzaW9uX0ZYVDEgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfM0RGWF9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF8zREZYX211bHRpc2FtcGxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMXzNERlhfdGJ1ZmZlcgorI2RlZmluZSBHTF8zREZYX3RidWZmZXIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYnVmZmVyTWFzazNERlggKEdMdWludCBtYXNrKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRCVUZGRVJNQVNLM0RGWFBST0MpIChHTHVpbnQgbWFzayk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfRVhUX211bHRpc2FtcGxlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlTWFza0VYVCAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZVBhdHRlcm5FWFQgKEdMZW51bSBwYXR0ZXJuKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRU1BU0tFWFRQUk9DKSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVQQVRURVJORVhUUFJPQykgKEdMZW51bSBwYXR0ZXJuKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdmVydGV4X3ByZWNsaXAKKyNkZWZpbmUgR0xfU0dJWF92ZXJ0ZXhfcHJlY2xpcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2NvbnZvbHV0aW9uX2FjY3VyYWN5CisjZGVmaW5lIEdMX1NHSVhfY29udm9sdXRpb25fYWNjdXJhY3kgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9yZXNhbXBsZQorI2RlZmluZSBHTF9TR0lYX3Jlc2FtcGxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfcG9pbnRfbGluZV90ZXhnZW4KKyNkZWZpbmUgR0xfU0dJU19wb2ludF9saW5lX3RleGdlbiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfY29sb3JfbWFzaworI2RlZmluZSBHTF9TR0lTX3RleHR1cmVfY29sb3JfbWFzayAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVDb2xvck1hc2tTR0lTIChHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRUNPTE9STUFTS1NHSVNQUk9DKSAoR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaWdsb29faW50ZXJmYWNlCisjZGVmaW5lIEdMX1NHSVhfaWdsb29faW50ZXJmYWNlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSWdsb29JbnRlcmZhY2VTR0lYIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMdm9pZCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElHTE9PSU5URVJGQUNFU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMdm9pZCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2Vudl9kb3QzCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2Vudl9kb3QzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV90ZXh0dXJlX21pcnJvcl9vbmNlCisjZGVmaW5lIEdMX0FUSV90ZXh0dXJlX21pcnJvcl9vbmNlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZlbmNlCisjZGVmaW5lIEdMX05WX2ZlbmNlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlRmVuY2VzTlYgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbkZlbmNlc05WIChHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzRmVuY2VOViAoR0x1aW50IGZlbmNlKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbFRlc3RGZW5jZU5WIChHTHVpbnQgZmVuY2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZlbmNlaXZOViAoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZpbmlzaEZlbmNlTlYgKEdMdWludCBmZW5jZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2V0RmVuY2VOViAoR0x1aW50IGZlbmNlLCBHTGVudW0gY29uZGl0aW9uKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUZFTkNFU05WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5GRU5DRVNOVlBST0MpIChHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0ZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xURVNURkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRGRU5DRUlWTlZQUk9DKSAoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGSU5JU0hGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFVEZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlLCBHTGVudW0gY29uZGl0aW9uKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2V2YWx1YXRvcnMKKyNkZWZpbmUgR0xfTlZfZXZhbHVhdG9ycyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hcENvbnRyb2xQb2ludHNOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xzaXplaSB1c3RyaWRlLCBHTHNpemVpIHZzdHJpZGUsIEdMaW50IHVvcmRlciwgR0xpbnQgdm9yZGVyLCBHTGJvb2xlYW4gcGFja2VkLCBjb25zdCBHTHZvaWQgKnBvaW50cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWFwUGFyYW1ldGVyaXZOViAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXBQYXJhbWV0ZXJmdk5WIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWFwQ29udHJvbFBvaW50c05WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTHNpemVpIHVzdHJpZGUsIEdMc2l6ZWkgdnN0cmlkZSwgR0xib29sZWFuIHBhY2tlZCwgR0x2b2lkICpwb2ludHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1hcFBhcmFtZXRlcml2TlYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWFwUGFyYW1ldGVyZnZOViAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1hcEF0dHJpYlBhcmFtZXRlcml2TlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNYXBBdHRyaWJQYXJhbWV0ZXJmdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFdmFsTWFwc05WIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVBDT05UUk9MUE9JTlRTTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xzaXplaSB1c3RyaWRlLCBHTHNpemVpIHZzdHJpZGUsIEdMaW50IHVvcmRlciwgR0xpbnQgdm9yZGVyLCBHTGJvb2xlYW4gcGFja2VkLCBjb25zdCBHTHZvaWQgKnBvaW50cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BUFBBUkFNRVRFUklWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFQUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1BUENPTlRST0xQT0lOVFNOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTHNpemVpIHVzdHJpZGUsIEdMc2l6ZWkgdnN0cmlkZSwgR0xib29sZWFuIHBhY2tlZCwgR0x2b2lkICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNQVBQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1BUFBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNQVBBVFRSSUJQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUFQQVRUUklCUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRVZBTE1BUFNOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wYWNrZWRfZGVwdGhfc3RlbmNpbAorI2RlZmluZSBHTF9OVl9wYWNrZWRfZGVwdGhfc3RlbmNpbCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMyCisjZGVmaW5lIEdMX05WX3JlZ2lzdGVyX2NvbWJpbmVyczIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21iaW5lclN0YWdlUGFyYW1ldGVyZnZOViAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tYmluZXJTdGFnZVBhcmFtZXRlcmZ2TlYgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NQklORVJTVEFHRVBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTUJJTkVSU1RBR0VQQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl92dGMKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl92dGMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9yZWN0YW5nbGUKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9yZWN0YW5nbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9zaGFkZXIKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9zaGFkZXIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9zaGFkZXIyCisjZGVmaW5lIEdMX05WX3RleHR1cmVfc2hhZGVyMiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UyCisjZGVmaW5lIEdMX05WX3ZlcnRleF9hcnJheV9yYW5nZTIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0KKyNkZWZpbmUgR0xfTlZfdmVydGV4X3Byb2dyYW0gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbEFyZVByb2dyYW1zUmVzaWRlbnROViAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnByb2dyYW1zLCBHTGJvb2xlYW4gKnJlc2lkZW5jZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRQcm9ncmFtTlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUHJvZ3JhbXNOViAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnByb2dyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFeGVjdXRlUHJvZ3JhbU5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuUHJvZ3JhbXNOViAoR0xzaXplaSBuLCBHTHVpbnQgKnByb2dyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtUGFyYW1ldGVyZHZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1QYXJhbWV0ZXJmdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtaXZOViAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1TdHJpbmdOViAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWJ5dGUgKnByb2dyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRyYWNrTWF0cml4aXZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGFkZHJlc3MsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliZHZOViAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmZ2TlYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYml2TlYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydk5WIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcG9pbnRlcik7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1Byb2dyYW1OViAoR0x1aW50IGlkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkUHJvZ3JhbU5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpwcm9ncmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyNGROViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyNGR2TlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXI0Zk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVBhcmFtZXRlcjRmdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXJzNGR2TlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXJzNGZ2TlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVxdWVzdFJlc2lkZW50UHJvZ3JhbXNOViAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnByb2dyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFja01hdHJpeE5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYWRkcmVzcywgR0xlbnVtIG1hdHJpeCwgR0xlbnVtIHRyYW5zZm9ybSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliUG9pbnRlck5WIChHTHVpbnQgaW5kZXgsIEdMaW50IGZzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWROViAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZHZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWZOViAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmdk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFzTlYgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxc3ZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZE5WIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJkdk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZk5WIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZnZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyc05WIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyc3ZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZE5WIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNkdk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZk5WIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmdk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNzTlYgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM3N2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGROViAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZHZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGZOViAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmdk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzTlYgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0c3ZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dWJOViAoR0x1aW50IGluZGV4LCBHTHVieXRlIHgsIEdMdWJ5dGUgeSwgR0x1Ynl0ZSB6LCBHTHVieXRlIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjR1YnZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVieXRlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzMWR2TlYgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMxZnZOViAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzMXN2TlYgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczJkdk5WIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzMmZ2TlYgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczJzdk5WIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMzZHZOViAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczNmdk5WIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMzc3ZOViAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzNGR2TlYgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnM0ZnZOViAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzNHN2TlYgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczR1YnZOViAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVieXRlICp2KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMQVJFUFJPR1JBTVNSRVNJREVOVE5WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwcm9ncmFtcywgR0xib29sZWFuICpyZXNpZGVuY2VzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFBST0dSQU1OVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVQUk9HUkFNU05WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwcm9ncmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVYRUNVVEVQUk9HUkFNTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5QUk9HUkFNU05WUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpwcm9ncmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1QQVJBTUVURVJEVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1JVk5WUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVNUUklOR05WUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVieXRlICpwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVFJBQ0tNQVRSSVhJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBhZGRyZXNzLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJEVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCRlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCSVZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQlBPSU5URVJWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBvaW50ZXIpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTUFJPR1JBTU5WUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQURQUk9HUkFNTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1QQVJBTUVURVI0RE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1QQVJBTUVURVI0RFZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUjRGTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNUEFSQU1FVEVSNEZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUlM0RFZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUlM0RlZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVFVRVNUUkVTSURFTlRQUk9HUkFNU05WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwcm9ncmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRSQUNLTUFUUklYTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGFkZHJlc3MsIEdMZW51bSBtYXRyaXgsIEdMZW51bSB0cmFuc2Zvcm0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQT0lOVEVSTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCBmc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFEVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMVNOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFTVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJETlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJGTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJGVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNETlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0RWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0ZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM1NOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzU1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjREVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0Rk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFNOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRTVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRVQk5WUFJPQykgKEdMdWludCBpbmRleCwgR0x1Ynl0ZSB4LCBHTHVieXRlIHksIEdMdWJ5dGUgeiwgR0x1Ynl0ZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFVCVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMxRFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzFGVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMxU1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMkRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMyRlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMlNWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzNEVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTM0ZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzNTVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlM0RFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzRGVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlM0U1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTNFVCVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1Ynl0ZSAqdik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfY29vcmRpbmF0ZV9jbGFtcAorI2RlZmluZSBHTF9TR0lYX3RleHR1cmVfY29vcmRpbmF0ZV9jbGFtcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3NjYWxlYmlhc19oaW50CisjZGVmaW5lIEdMX1NHSVhfc2NhbGViaWFzX2hpbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfT01MX2ludGVybGFjZQorI2RlZmluZSBHTF9PTUxfaW50ZXJsYWNlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX09NTF9zdWJzYW1wbGUKKyNkZWZpbmUgR0xfT01MX3N1YnNhbXBsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9PTUxfcmVzYW1wbGUKKyNkZWZpbmUgR0xfT01MX3Jlc2FtcGxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2NvcHlfZGVwdGhfdG9fY29sb3IKKyNkZWZpbmUgR0xfTlZfY29weV9kZXB0aF90b19jb2xvciAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfZW52bWFwX2J1bXBtYXAKKyNkZWZpbmUgR0xfQVRJX2Vudm1hcF9idW1wbWFwIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4QnVtcFBhcmFtZXRlcml2QVRJIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4QnVtcFBhcmFtZXRlcmZ2QVRJIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXhCdW1wUGFyYW1ldGVyaXZBVEkgKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXhCdW1wUGFyYW1ldGVyZnZBVEkgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQlVNUFBBUkFNRVRFUklWQVRJUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQlVNUFBBUkFNRVRFUkZWQVRJUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhCVU1QUEFSQU1FVEVSSVZBVElQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhCVU1QUEFSQU1FVEVSRlZBVElQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfZnJhZ21lbnRfc2hhZGVyCisjZGVmaW5lIEdMX0FUSV9mcmFnbWVudF9zaGFkZXIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEdlbkZyYWdtZW50U2hhZGVyc0FUSSAoR0x1aW50IHJhbmdlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kRnJhZ21lbnRTaGFkZXJBVEkgKEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlRnJhZ21lbnRTaGFkZXJBVEkgKEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5GcmFnbWVudFNoYWRlckFUSSAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kRnJhZ21lbnRTaGFkZXJBVEkgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBhc3NUZXhDb29yZEFUSSAoR0x1aW50IGRzdCwgR0x1aW50IGNvb3JkLCBHTGVudW0gc3dpenpsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlTWFwQVRJIChHTHVpbnQgZHN0LCBHTHVpbnQgaW50ZXJwLCBHTGVudW0gc3dpenpsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JGcmFnbWVudE9wMUFUSSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TWFzaywgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JGcmFnbWVudE9wMkFUSSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TWFzaywgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCwgR0x1aW50IGFyZzIsIEdMdWludCBhcmcyUmVwLCBHTHVpbnQgYXJnMk1vZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JGcmFnbWVudE9wM0FUSSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TWFzaywgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCwgR0x1aW50IGFyZzIsIEdMdWludCBhcmcyUmVwLCBHTHVpbnQgYXJnMk1vZCwgR0x1aW50IGFyZzMsIEdMdWludCBhcmczUmVwLCBHTHVpbnQgYXJnM01vZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGcmFnbWVudE9wMUFUSSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TW9kLCBHTHVpbnQgYXJnMSwgR0x1aW50IGFyZzFSZXAsIEdMdWludCBhcmcxTW9kKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBbHBoYUZyYWdtZW50T3AyQVRJIChHTGVudW0gb3AsIEdMdWludCBkc3QsIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMlJlcCwgR0x1aW50IGFyZzJNb2QpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFscGhhRnJhZ21lbnRPcDNBVEkgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCwgR0x1aW50IGFyZzIsIEdMdWludCBhcmcyUmVwLCBHTHVpbnQgYXJnMk1vZCwgR0x1aW50IGFyZzMsIEdMdWludCBhcmczUmVwLCBHTHVpbnQgYXJnM01vZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2V0RnJhZ21lbnRTaGFkZXJDb25zdGFudEFUSSAoR0x1aW50IGRzdCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xHRU5GUkFHTUVOVFNIQURFUlNBVElQUk9DKSAoR0x1aW50IHJhbmdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREZSQUdNRU5UU0hBREVSQVRJUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUZSQUdNRU5UU0hBREVSQVRJUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lORlJBR01FTlRTSEFERVJBVElQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVOREZSQUdNRU5UU0hBREVSQVRJUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQQVNTVEVYQ09PUkRBVElQUk9DKSAoR0x1aW50IGRzdCwgR0x1aW50IGNvb3JkLCBHTGVudW0gc3dpenpsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRU1BUEFUSVBST0MpIChHTHVpbnQgZHN0LCBHTHVpbnQgaW50ZXJwLCBHTGVudW0gc3dpenpsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SRlJBR01FTlRPUDFBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TWFzaywgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SRlJBR01FTlRPUDJBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TWFzaywgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCwgR0x1aW50IGFyZzIsIEdMdWludCBhcmcyUmVwLCBHTHVpbnQgYXJnMk1vZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SRlJBR01FTlRPUDNBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TWFzaywgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCwgR0x1aW50IGFyZzIsIEdMdWludCBhcmcyUmVwLCBHTHVpbnQgYXJnMk1vZCwgR0x1aW50IGFyZzMsIEdMdWludCBhcmczUmVwLCBHTHVpbnQgYXJnM01vZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFMUEhBRlJBR01FTlRPUDFBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TW9kLCBHTHVpbnQgYXJnMSwgR0x1aW50IGFyZzFSZXAsIEdMdWludCBhcmcxTW9kKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQUxQSEFGUkFHTUVOVE9QMkFUSVBST0MpIChHTGVudW0gb3AsIEdMdWludCBkc3QsIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMlJlcCwgR0x1aW50IGFyZzJNb2QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBTFBIQUZSQUdNRU5UT1AzQVRJUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCwgR0x1aW50IGFyZzIsIEdMdWludCBhcmcyUmVwLCBHTHVpbnQgYXJnMk1vZCwgR0x1aW50IGFyZzMsIEdMdWludCBhcmczUmVwLCBHTHVpbnQgYXJnM01vZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFVEZSQUdNRU5UU0hBREVSQ09OU1RBTlRBVElQUk9DKSAoR0x1aW50IGRzdCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3BuX3RyaWFuZ2xlcworI2RlZmluZSBHTF9BVElfcG5fdHJpYW5nbGVzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUE5UcmlhbmdsZXNpQVRJIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQTlRyaWFuZ2xlc2ZBVEkgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQTlRSSUFOR0xFU0lBVElQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBOVFJJQU5HTEVTRkFUSVBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3ZlcnRleF9hcnJheV9vYmplY3QKKyNkZWZpbmUgR0xfQVRJX3ZlcnRleF9hcnJheV9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbE5ld09iamVjdEJ1ZmZlckFUSSAoR0xzaXplaSBzaXplLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMZW51bSB1c2FnZSk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc09iamVjdEJ1ZmZlckFUSSAoR0x1aW50IGJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVXBkYXRlT2JqZWN0QnVmZmVyQVRJIChHTHVpbnQgYnVmZmVyLCBHTHVpbnQgb2Zmc2V0LCBHTHNpemVpIHNpemUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xlbnVtIHByZXNlcnZlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPYmplY3RCdWZmZXJmdkFUSSAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE9iamVjdEJ1ZmZlcml2QVRJIChHTHVpbnQgYnVmZmVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyZWVPYmplY3RCdWZmZXJBVEkgKEdMdWludCBidWZmZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFycmF5T2JqZWN0QVRJIChHTGVudW0gYXJyYXksIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0x1aW50IGJ1ZmZlciwgR0x1aW50IG9mZnNldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QXJyYXlPYmplY3RmdkFUSSAoR0xlbnVtIGFycmF5LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QXJyYXlPYmplY3RpdkFUSSAoR0xlbnVtIGFycmF5LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnRBcnJheU9iamVjdEFUSSAoR0x1aW50IGlkLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBidWZmZXIsIEdMdWludCBvZmZzZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZhcmlhbnRBcnJheU9iamVjdGZ2QVRJIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWYXJpYW50QXJyYXlPYmplY3RpdkFUSSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xORVdPQkpFQ1RCVUZGRVJBVElQUk9DKSAoR0xzaXplaSBzaXplLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMZW51bSB1c2FnZSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNPQkpFQ1RCVUZGRVJBVElQUk9DKSAoR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVQREFURU9CSkVDVEJVRkZFUkFUSVBST0MpIChHTHVpbnQgYnVmZmVyLCBHTHVpbnQgb2Zmc2V0LCBHTHNpemVpIHNpemUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xlbnVtIHByZXNlcnZlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0JKRUNUQlVGRkVSRlZBVElQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRPQkpFQ1RCVUZGRVJJVkFUSVBST0MpIChHTHVpbnQgYnVmZmVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkVFT0JKRUNUQlVGRkVSQVRJUFJPQykgKEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBUlJBWU9CSkVDVEFUSVBST0MpIChHTGVudW0gYXJyYXksIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0x1aW50IGJ1ZmZlciwgR0x1aW50IG9mZnNldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFSUkFZT0JKRUNURlZBVElQUk9DKSAoR0xlbnVtIGFycmF5LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFSUkFZT0JKRUNUSVZBVElQUk9DKSAoR0xlbnVtIGFycmF5LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UQVJSQVlPQkpFQ1RBVElQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBidWZmZXIsIEdMdWludCBvZmZzZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWQVJJQU5UQVJSQVlPQkpFQ1RGVkFUSVBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSSUFOVEFSUkFZT0JKRUNUSVZBVElQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF9zaGFkZXIKKyNkZWZpbmUgR0xfRVhUX3ZlcnRleF9zaGFkZXIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpblZlcnRleFNoYWRlckVYVCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kVmVydGV4U2hhZGVyRVhUICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVmVydGV4U2hhZGVyRVhUIChHTHVpbnQgaWQpOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2VuVmVydGV4U2hhZGVyc0VYVCAoR0x1aW50IHJhbmdlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVWZXJ0ZXhTaGFkZXJFWFQgKEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyT3AxRVhUIChHTGVudW0gb3AsIEdMdWludCByZXMsIEdMdWludCBhcmcxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTaGFkZXJPcDJFWFQgKEdMZW51bSBvcCwgR0x1aW50IHJlcywgR0x1aW50IGFyZzEsIEdMdWludCBhcmcyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTaGFkZXJPcDNFWFQgKEdMZW51bSBvcCwgR0x1aW50IHJlcywgR0x1aW50IGFyZzEsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3dpenpsZUVYVCAoR0x1aW50IHJlcywgR0x1aW50IGluLCBHTGVudW0gb3V0WCwgR0xlbnVtIG91dFksIEdMZW51bSBvdXRaLCBHTGVudW0gb3V0Vyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV3JpdGVNYXNrRVhUIChHTHVpbnQgcmVzLCBHTHVpbnQgaW4sIEdMZW51bSBvdXRYLCBHTGVudW0gb3V0WSwgR0xlbnVtIG91dFosIEdMZW51bSBvdXRXKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbnNlcnRDb21wb25lbnRFWFQgKEdMdWludCByZXMsIEdMdWludCBzcmMsIEdMdWludCBudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEV4dHJhY3RDb21wb25lbnRFWFQgKEdMdWludCByZXMsIEdMdWludCBzcmMsIEdMdWludCBudW0pOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2VuU3ltYm9sc0VYVCAoR0xlbnVtIGRhdGF0eXBlLCBHTGVudW0gc3RvcmFnZXR5cGUsIEdMZW51bSByYW5nZSwgR0x1aW50IGNvbXBvbmVudHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNldEludmFyaWFudEVYVCAoR0x1aW50IGlkLCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICphZGRyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZXRMb2NhbENvbnN0YW50RVhUIChHTHVpbnQgaWQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmFkZHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnRidkVYVCAoR0x1aW50IGlkLCBjb25zdCBHTGJ5dGUgKmFkZHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnRzdkVYVCAoR0x1aW50IGlkLCBjb25zdCBHTHNob3J0ICphZGRyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50aXZFWFQgKEdMdWludCBpZCwgY29uc3QgR0xpbnQgKmFkZHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnRmdkVYVCAoR0x1aW50IGlkLCBjb25zdCBHTGZsb2F0ICphZGRyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50ZHZFWFQgKEdMdWludCBpZCwgY29uc3QgR0xkb3VibGUgKmFkZHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnR1YnZFWFQgKEdMdWludCBpZCwgY29uc3QgR0x1Ynl0ZSAqYWRkcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudHVzdkVYVCAoR0x1aW50IGlkLCBjb25zdCBHTHVzaG9ydCAqYWRkcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudHVpdkVYVCAoR0x1aW50IGlkLCBjb25zdCBHTHVpbnQgKmFkZHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnRQb2ludGVyRVhUIChHTHVpbnQgaWQsIEdMZW51bSB0eXBlLCBHTHVpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQgKmFkZHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuYWJsZVZhcmlhbnRDbGllbnRTdGF0ZUVYVCAoR0x1aW50IGlkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlVmFyaWFudENsaWVudFN0YXRlRVhUIChHTHVpbnQgaWQpOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsQmluZExpZ2h0UGFyYW1ldGVyRVhUIChHTGVudW0gbGlnaHQsIEdMZW51bSB2YWx1ZSk7CitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xCaW5kTWF0ZXJpYWxQYXJhbWV0ZXJFWFQgKEdMZW51bSBmYWNlLCBHTGVudW0gdmFsdWUpOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsQmluZFRleEdlblBhcmFtZXRlckVYVCAoR0xlbnVtIHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHZhbHVlKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEJpbmRUZXh0dXJlVW5pdFBhcmFtZXRlckVYVCAoR0xlbnVtIHVuaXQsIEdMZW51bSB2YWx1ZSk7CitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xCaW5kUGFyYW1ldGVyRVhUIChHTGVudW0gdmFsdWUpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNWYXJpYW50RW5hYmxlZEVYVCAoR0x1aW50IGlkLCBHTGVudW0gY2FwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWYXJpYW50Qm9vbGVhbnZFWFQgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGJvb2xlYW4gKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZhcmlhbnRJbnRlZ2VydkVYVCAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMaW50ICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWYXJpYW50RmxvYXR2RVhUIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xmbG9hdCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmFyaWFudFBvaW50ZXJ2RVhUIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0x2b2lkKiAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW52YXJpYW50Qm9vbGVhbnZFWFQgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGJvb2xlYW4gKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEludmFyaWFudEludGVnZXJ2RVhUIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xpbnQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEludmFyaWFudEZsb2F0dkVYVCAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMZmxvYXQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldExvY2FsQ29uc3RhbnRCb29sZWFudkVYVCAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMYm9vbGVhbiAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TG9jYWxDb25zdGFudEludGVnZXJ2RVhUIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xpbnQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldExvY2FsQ29uc3RhbnRGbG9hdHZFWFQgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGZsb2F0ICpkYXRhKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOVkVSVEVYU0hBREVSRVhUUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRWRVJURVhTSEFERVJFWFRQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRWRVJURVhTSEFERVJFWFRQUk9DKSAoR0x1aW50IGlkKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xHRU5WRVJURVhTSEFERVJTRVhUUFJPQykgKEdMdWludCByYW5nZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVZFUlRFWFNIQURFUkVYVFBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTSEFERVJPUDFFWFRQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgcmVzLCBHTHVpbnQgYXJnMSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNIQURFUk9QMkVYVFBST0MpIChHTGVudW0gb3AsIEdMdWludCByZXMsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNIQURFUk9QM0VYVFBST0MpIChHTGVudW0gb3AsIEdMdWludCByZXMsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMiwgR0x1aW50IGFyZzMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTV0laWkxFRVhUUFJPQykgKEdMdWludCByZXMsIEdMdWludCBpbiwgR0xlbnVtIG91dFgsIEdMZW51bSBvdXRZLCBHTGVudW0gb3V0WiwgR0xlbnVtIG91dFcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXUklURU1BU0tFWFRQUk9DKSAoR0x1aW50IHJlcywgR0x1aW50IGluLCBHTGVudW0gb3V0WCwgR0xlbnVtIG91dFksIEdMZW51bSBvdXRaLCBHTGVudW0gb3V0Vyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElOU0VSVENPTVBPTkVOVEVYVFBST0MpIChHTHVpbnQgcmVzLCBHTHVpbnQgc3JjLCBHTHVpbnQgbnVtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRVhUUkFDVENPTVBPTkVOVEVYVFBST0MpIChHTHVpbnQgcmVzLCBHTHVpbnQgc3JjLCBHTHVpbnQgbnVtKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xHRU5TWU1CT0xTRVhUUFJPQykgKEdMZW51bSBkYXRhdHlwZSwgR0xlbnVtIHN0b3JhZ2V0eXBlLCBHTGVudW0gcmFuZ2UsIEdMdWludCBjb21wb25lbnRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VUSU5WQVJJQU5URVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFVExPQ0FMQ09OU1RBTlRFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVEJWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0xieXRlICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVFNWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0xzaG9ydCAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBUklBTlRJVkVYVFBST0MpIChHTHVpbnQgaWQsIGNvbnN0IEdMaW50ICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVEZWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0xmbG9hdCAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBUklBTlREVkVYVFBST0MpIChHTHVpbnQgaWQsIGNvbnN0IEdMZG91YmxlICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVFVCVkVYVFBST0MpIChHTHVpbnQgaWQsIGNvbnN0IEdMdWJ5dGUgKmFkZHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UVVNWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0x1c2hvcnQgKmFkZHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UVUlWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0x1aW50ICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVFBPSU5URVJFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdHlwZSwgR0x1aW50IHN0cmlkZSwgY29uc3QgR0x2b2lkICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5BQkxFVkFSSUFOVENMSUVOVFNUQVRFRVhUUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERJU0FCTEVWQVJJQU5UQ0xJRU5UU1RBVEVFWFRQUk9DKSAoR0x1aW50IGlkKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xCSU5ETElHSFRQQVJBTUVURVJFWFRQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gdmFsdWUpOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEJJTkRNQVRFUklBTFBBUkFNRVRFUkVYVFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHZhbHVlKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xCSU5EVEVYR0VOUEFSQU1FVEVSRVhUUFJPQykgKEdMZW51bSB1bml0LCBHTGVudW0gY29vcmQsIEdMZW51bSB2YWx1ZSk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMQklORFRFWFRVUkVVTklUUEFSQU1FVEVSRVhUUFJPQykgKEdMZW51bSB1bml0LCBHTGVudW0gdmFsdWUpOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEJJTkRQQVJBTUVURVJFWFRQUk9DKSAoR0xlbnVtIHZhbHVlKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1ZBUklBTlRFTkFCTEVERVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIGNhcCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZBUklBTlRCT09MRUFOVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xib29sZWFuICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSSUFOVElOVEVHRVJWRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGludCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZBUklBTlRGTE9BVFZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMZmxvYXQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWQVJJQU5UUE9JTlRFUlZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMdm9pZCogKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTlZBUklBTlRCT09MRUFOVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xib29sZWFuICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU5WQVJJQU5USU5URUdFUlZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMaW50ICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU5WQVJJQU5URkxPQVRWRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGZsb2F0ICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTE9DQUxDT05TVEFOVEJPT0xFQU5WRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGJvb2xlYW4gKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRMT0NBTENPTlNUQU5USU5URUdFUlZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMaW50ICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTE9DQUxDT05TVEFOVEZMT0FUVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xmbG9hdCAqZGF0YSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdmVydGV4X3N0cmVhbXMKKyNkZWZpbmUgR0xfQVRJX3ZlcnRleF9zdHJlYW1zIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMXNBVEkgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMXN2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTHNob3J0ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTFpQVRJIChHTGVudW0gc3RyZWFtLCBHTGludCB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xaXZBVEkgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMaW50ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTFmQVRJIChHTGVudW0gc3RyZWFtLCBHTGZsb2F0IHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTFmdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xZEFUSSAoR0xlbnVtIHN0cmVhbSwgR0xkb3VibGUgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMWR2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGRvdWJsZSAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0yc0FUSSAoR0xlbnVtIHN0cmVhbSwgR0xzaG9ydCB4LCBHTHNob3J0IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTJzdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0yaUFUSSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgeCwgR0xpbnQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMml2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0yZkFUSSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTJmdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0yZEFUSSAoR0xlbnVtIHN0cmVhbSwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMmR2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGRvdWJsZSAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0zc0FUSSAoR0xlbnVtIHN0cmVhbSwgR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtM3N2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTHNob3J0ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNpQVRJIChHTGVudW0gc3RyZWFtLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0zaXZBVEkgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMaW50ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNmQVRJIChHTGVudW0gc3RyZWFtLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0zZnZBVEkgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtM2RBVEkgKEdMZW51bSBzdHJlYW0sIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNkdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xkb3VibGUgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtNHNBVEkgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtNHN2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTHNob3J0ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTRpQVRJIChHTGVudW0gc3RyZWFtLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00aXZBVEkgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMaW50ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTRmQVRJIChHTGVudW0gc3RyZWFtLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTRmdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00ZEFUSSAoR0xlbnVtIHN0cmVhbSwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtNGR2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGRvdWJsZSAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zYkFUSSAoR0xlbnVtIHN0cmVhbSwgR0xieXRlIG54LCBHTGJ5dGUgbnksIEdMYnl0ZSBueik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2J2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGJ5dGUgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM3NBVEkgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgbngsIEdMc2hvcnQgbnksIEdMc2hvcnQgbnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFN0cmVhbTNzdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zaUFUSSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgbngsIEdMaW50IG55LCBHTGludCBueik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2l2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zZkFUSSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2Z2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGZsb2F0ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFN0cmVhbTNkQVRJIChHTGVudW0gc3RyZWFtLCBHTGRvdWJsZSBueCwgR0xkb3VibGUgbnksIEdMZG91YmxlIG56KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zZHZBVEkgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZG91YmxlICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsaWVudEFjdGl2ZVZlcnRleFN0cmVhbUFUSSAoR0xlbnVtIHN0cmVhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QmxlbmRFbnZpQVRJIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhCbGVuZEVudmZBVEkgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xU0FUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTHNob3J0IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xU1ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMUlBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTFJVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMUZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMUZWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTFEQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZG91YmxlIHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xRFZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xkb3VibGUgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJTQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgeCwgR0xzaG9ydCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMlNWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMc2hvcnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJJQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMaW50IHgsIEdMaW50IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0ySVZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJGQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMkZWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJEQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0yRFZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xkb3VibGUgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTNTQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0zU1ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM0lBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTNJVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM0ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTNGVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGZsb2F0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0zREFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM0RWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZG91YmxlICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00U0FUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00U1ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNNElBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTRJVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNNEZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNNEZWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTREQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00RFZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xkb3VibGUgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNCQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMYnl0ZSBueCwgR0xieXRlIG55LCBHTGJ5dGUgbnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zQlZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xieXRlICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zU0FUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTHNob3J0IG54LCBHTHNob3J0IG55LCBHTHNob3J0IG56KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM1NWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMc2hvcnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNJQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMaW50IG54LCBHTGludCBueSwgR0xpbnQgbnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zSVZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNGQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zRlZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM0RBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xkb3VibGUgbngsIEdMZG91YmxlIG55LCBHTGRvdWJsZSBueik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNEVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGRvdWJsZSAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xJRU5UQUNUSVZFVkVSVEVYU1RSRUFNQVRJUFJPQykgKEdMZW51bSBzdHJlYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhCTEVOREVOVklBVElQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEJMRU5ERU5WRkFUSVBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2VsZW1lbnRfYXJyYXkKKyNkZWZpbmUgR0xfQVRJX2VsZW1lbnRfYXJyYXkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbGVtZW50UG9pbnRlckFUSSAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRBcnJheUFUSSAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdSYW5nZUVsZW1lbnRBcnJheUFUSSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xzaXplaSBjb3VudCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTEVNRU5UUE9JTlRFUkFUSVBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0VMRU1FTlRBUlJBWUFUSVBST0MpIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdSQU5HRUVMRU1FTlRBUlJBWUFUSVBST0MpIChHTGVudW0gbW9kZSwgR0x1aW50IHN0YXJ0LCBHTHVpbnQgZW5kLCBHTHNpemVpIGNvdW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl9tZXNoX2FycmF5CisjZGVmaW5lIEdMX1NVTl9tZXNoX2FycmF5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd01lc2hBcnJheXNTVU4gKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgR0xzaXplaSB3aWR0aCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXTUVTSEFSUkFZU1NVTlBST0MpIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQsIEdMc2l6ZWkgd2lkdGgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX3NsaWNlX2FjY3VtCisjZGVmaW5lIEdMX1NVTl9zbGljZV9hY2N1bSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9tdWx0aXNhbXBsZV9maWx0ZXJfaGludAorI2RlZmluZSBHTF9OVl9tdWx0aXNhbXBsZV9maWx0ZXJfaGludCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9kZXB0aF9jbGFtcAorI2RlZmluZSBHTF9OVl9kZXB0aF9jbGFtcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9vY2NsdXNpb25fcXVlcnkKKyNkZWZpbmUgR0xfTlZfb2NjbHVzaW9uX3F1ZXJ5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuT2NjbHVzaW9uUXVlcmllc05WIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVPY2NsdXNpb25RdWVyaWVzTlYgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICppZHMpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNPY2NsdXNpb25RdWVyeU5WIChHTHVpbnQgaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJlZ2luT2NjbHVzaW9uUXVlcnlOViAoR0x1aW50IGlkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmRPY2NsdXNpb25RdWVyeU5WICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPY2NsdXNpb25RdWVyeWl2TlYgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPY2NsdXNpb25RdWVyeXVpdk5WIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOT0NDTFVTSU9OUVVFUklFU05WUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVPQ0NMVVNJT05RVUVSSUVTTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNPQ0NMVVNJT05RVUVSWU5WUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOT0NDTFVTSU9OUVVFUllOVlBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRPQ0NMVVNJT05RVUVSWU5WUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRPQ0NMVVNJT05RVUVSWUlWTlZQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRPQ0NMVVNJT05RVUVSWVVJVk5WUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wb2ludF9zcHJpdGUKKyNkZWZpbmUgR0xfTlZfcG9pbnRfc3ByaXRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJpTlYgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyaXZOViAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSSU5WUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUklWTlZQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfc2hhZGVyMworI2RlZmluZSBHTF9OVl90ZXh0dXJlX3NoYWRlcjMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0xXzEKKyNkZWZpbmUgR0xfTlZfdmVydGV4X3Byb2dyYW0xXzEgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3NoYWRvd19mdW5jcworI2RlZmluZSBHTF9FWFRfc2hhZG93X2Z1bmNzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zdGVuY2lsX3R3b19zaWRlCisjZGVmaW5lIEdMX0VYVF9zdGVuY2lsX3R3b19zaWRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWN0aXZlU3RlbmNpbEZhY2VFWFQgKEdMZW51bSBmYWNlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFDVElWRVNURU5DSUxGQUNFRVhUUFJPQykgKEdMZW51bSBmYWNlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV90ZXh0X2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBHTF9BVElfdGV4dF9mcmFnbWVudF9zaGFkZXIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfY2xpZW50X3N0b3JhZ2UKKyNkZWZpbmUgR0xfQVBQTEVfY2xpZW50X3N0b3JhZ2UgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfZWxlbWVudF9hcnJheQorI2RlZmluZSBHTF9BUFBMRV9lbGVtZW50X2FycmF5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRWxlbWVudFBvaW50ZXJBUFBMRSAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRBcnJheUFQUExFIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdSYW5nZUVsZW1lbnRBcnJheUFQUExFIChHTGVudW0gbW9kZSwgR0x1aW50IHN0YXJ0LCBHTHVpbnQgZW5kLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlEcmF3RWxlbWVudEFycmF5QVBQTEUgKEdMZW51bSBtb2RlLCBjb25zdCBHTGludCAqZmlyc3QsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlEcmF3UmFuZ2VFbGVtZW50QXJyYXlBUFBMRSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRUxFTUVOVFBPSU5URVJBUFBMRVBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0VMRU1FTlRBUlJBWUFQUExFUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdSQU5HRUVMRU1FTlRBUlJBWUFQUExFUFJPQykgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXRUxFTUVOVEFSUkFZQVBQTEVQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMaW50ICpmaXJzdCwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXUkFOR0VFTEVNRU5UQVJSQVlBUFBMRVBST0MpIChHTGVudW0gbW9kZSwgR0x1aW50IHN0YXJ0LCBHTHVpbnQgZW5kLCBjb25zdCBHTGludCAqZmlyc3QsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9mZW5jZQorI2RlZmluZSBHTF9BUFBMRV9mZW5jZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbkZlbmNlc0FQUExFIChHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVGZW5jZXNBUFBMRSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZlbmNlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2V0RmVuY2VBUFBMRSAoR0x1aW50IGZlbmNlKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzRmVuY2VBUFBMRSAoR0x1aW50IGZlbmNlKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbFRlc3RGZW5jZUFQUExFIChHTHVpbnQgZmVuY2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZpbmlzaEZlbmNlQVBQTEUgKEdMdWludCBmZW5jZSk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xUZXN0T2JqZWN0QVBQTEUgKEdMZW51bSBvYmplY3QsIEdMdWludCBuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5pc2hPYmplY3RBUFBMRSAoR0xlbnVtIG9iamVjdCwgR0xpbnQgbmFtZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5GRU5DRVNBUFBMRVBST0MpIChHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFRkVOQ0VTQVBQTEVQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZlbmNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFVEZFTkNFQVBQTEVQUk9DKSAoR0x1aW50IGZlbmNlKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0ZFTkNFQVBQTEVQUk9DKSAoR0x1aW50IGZlbmNlKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xURVNURkVOQ0VBUFBMRVBST0MpIChHTHVpbnQgZmVuY2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGSU5JU0hGRU5DRUFQUExFUFJPQykgKEdMdWludCBmZW5jZSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMVEVTVE9CSkVDVEFQUExFUFJPQykgKEdMZW51bSBvYmplY3QsIEdMdWludCBuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRklOSVNIT0JKRUNUQVBQTEVQUk9DKSAoR0xlbnVtIG9iamVjdCwgR0xpbnQgbmFtZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV92ZXJ0ZXhfYXJyYXlfb2JqZWN0CisjZGVmaW5lIEdMX0FQUExFX3ZlcnRleF9hcnJheV9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVmVydGV4QXJyYXlBUFBMRSAoR0x1aW50IGFycmF5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVWZXJ0ZXhBcnJheXNBUFBMRSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuVmVydGV4QXJyYXlzQVBQTEUgKEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNWZXJ0ZXhBcnJheUFQUExFIChHTHVpbnQgYXJyYXkpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFZFUlRFWEFSUkFZQVBQTEVQUk9DKSAoR0x1aW50IGFycmF5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFVkVSVEVYQVJSQVlTQVBQTEVQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlZFUlRFWEFSUkFZU0FQUExFUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTVkVSVEVYQVJSQVlBUFBMRVBST0MpIChHTHVpbnQgYXJyYXkpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfdmVydGV4X2FycmF5X3JhbmdlCisjZGVmaW5lIEdMX0FQUExFX3ZlcnRleF9hcnJheV9yYW5nZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEFycmF5UmFuZ2VBUFBMRSAoR0xzaXplaSBsZW5ndGgsIEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmx1c2hWZXJ0ZXhBcnJheVJhbmdlQVBQTEUgKEdMc2l6ZWkgbGVuZ3RoLCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEFycmF5UGFyYW1ldGVyaUFQUExFIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFSUkFZUkFOR0VBUFBMRVBST0MpIChHTHNpemVpIGxlbmd0aCwgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRkxVU0hWRVJURVhBUlJBWVJBTkdFQVBQTEVQUk9DKSAoR0xzaXplaSBsZW5ndGgsIEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFSUkFZUEFSQU1FVEVSSUFQUExFUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfeWNiY3JfNDIyCisjZGVmaW5lIEdMX0FQUExFX3ljYmNyXzQyMiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TM19zM3RjCisjZGVmaW5lIEdMX1MzX3MzdGMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2RyYXdfYnVmZmVycworI2RlZmluZSBHTF9BVElfZHJhd19idWZmZXJzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0J1ZmZlcnNBVEkgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdCVUZGRVJTQVRJUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9waXhlbF9mb3JtYXRfZmxvYXQKKyNkZWZpbmUgR0xfQVRJX3BpeGVsX2Zvcm1hdF9mbG9hdCAxCisvKiBUaGlzIGlzIHJlYWxseSBhIFdHTCBleHRlbnNpb24sIGJ1dCBkZWZpbmVzIHNvbWUgYXNzb2NpYXRlZCBHTCBlbnVtcy4KKyAqIEFUSSBkb2VzIG5vdCBleHBvcnQgIkdMX0FUSV9waXhlbF9mb3JtYXRfZmxvYXQiIGluIHRoZSBHTF9FWFRFTlNJT05TIHN0cmluZy4KKyAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHR1cmVfZW52X2NvbWJpbmUzCisjZGVmaW5lIEdMX0FUSV90ZXh0dXJlX2Vudl9jb21iaW5lMyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdGV4dHVyZV9mbG9hdAorI2RlZmluZSBHTF9BVElfdGV4dHVyZV9mbG9hdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mbG9hdF9idWZmZXIKKyNkZWZpbmUgR0xfTlZfZmxvYXRfYnVmZmVyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZyYWdtZW50X3Byb2dyYW0KKyNkZWZpbmUgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbSAxCisvKiBTb21lIE5WX2ZyYWdtZW50X3Byb2dyYW0gZW50cnkgcG9pbnRzIGFyZSBzaGFyZWQgd2l0aCBBUkJfdmVydGV4X3Byb2dyYW0uICovCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRmTlYgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGROViAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGZ2TlYgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRkdk5WIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbU5hbWVkUGFyYW1ldGVyZnZOViAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtTmFtZWRQYXJhbWV0ZXJkdk5WIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1OQU1FRFBBUkFNRVRFUjRGTlZQUk9DKSAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTU5BTUVEUEFSQU1FVEVSNEROVlBST0MpIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTU5BTUVEUEFSQU1FVEVSNEZWTlZQUk9DKSAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1OQU1FRFBBUkFNRVRFUjREVk5WUFJPQykgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTU5BTUVEUEFSQU1FVEVSRlZOVlBST0MpIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNTkFNRURQQVJBTUVURVJEVk5WUFJPQykgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIEdMZG91YmxlICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfaGFsZl9mbG9hdAorI2RlZmluZSBHTF9OVl9oYWxmX2Zsb2F0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4MmhOViAoR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4Mmh2TlYgKGNvbnN0IEdMaGFsZk5WICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXgzaE5WIChHTGhhbGZOViB4LCBHTGhhbGZOViB5LCBHTGhhbGZOViB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXgzaHZOViAoY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleDRoTlYgKEdMaGFsZk5WIHgsIEdMaGFsZk5WIHksIEdMaGFsZk5WIHosIEdMaGFsZk5WIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleDRodk5WIChjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM2hOViAoR0xoYWxmTlYgbngsIEdMaGFsZk5WIG55LCBHTGhhbGZOViBueik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM2h2TlYgKGNvbnN0IEdMaGFsZk5WICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjNoTlYgKEdMaGFsZk5WIHJlZCwgR0xoYWxmTlYgZ3JlZW4sIEdMaGFsZk5WIGJsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yM2h2TlYgKGNvbnN0IEdMaGFsZk5WICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjRoTlYgKEdMaGFsZk5WIHJlZCwgR0xoYWxmTlYgZ3JlZW4sIEdMaGFsZk5WIGJsdWUsIEdMaGFsZk5WIGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjRodk5WIChjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQxaE5WIChHTGhhbGZOViBzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDFodk5WIChjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyaE5WIChHTGhhbGZOViBzLCBHTGhhbGZOViB0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJodk5WIChjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQzaE5WIChHTGhhbGZOViBzLCBHTGhhbGZOViB0LCBHTGhhbGZOViByKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDNodk5WIChjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQ0aE5WIChHTGhhbGZOViBzLCBHTGhhbGZOViB0LCBHTGhhbGZOViByLCBHTGhhbGZOViBxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDRodk5WIChjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFoTlYgKEdMZW51bSB0YXJnZXQsIEdMaGFsZk5WIHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaHZOViAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaE5WIChHTGVudW0gdGFyZ2V0LCBHTGhhbGZOViBzLCBHTGhhbGZOViB0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmh2TlYgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaGFsZk5WICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2hOViAoR0xlbnVtIHRhcmdldCwgR0xoYWxmTlYgcywgR0xoYWxmTlYgdCwgR0xoYWxmTlYgcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNodk5WIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRoTlYgKEdMZW51bSB0YXJnZXQsIEdMaGFsZk5WIHMsIEdMaGFsZk5WIHQsIEdMaGFsZk5WIHIsIEdMaGFsZk5WIHEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aHZOViAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkaE5WIChHTGhhbGZOViBmb2cpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkaHZOViAoY29uc3QgR0xoYWxmTlYgKmZvZyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzaE5WIChHTGhhbGZOViByZWQsIEdMaGFsZk5WIGdyZWVuLCBHTGhhbGZOViBibHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNodk5WIChjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4V2VpZ2h0aE5WIChHTGhhbGZOViB3ZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFdlaWdodGh2TlYgKGNvbnN0IEdMaGFsZk5WICp3ZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFoTlYgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWh2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJoTlYgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmh2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNoTlYgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSwgR0xoYWxmTlYgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2h2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRoTlYgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSwgR0xoYWxmTlYgeiwgR0xoYWxmTlYgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGh2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMxaHZOViAoR0x1aW50IGluZGV4LCBHTHNpemVpIG4sIGNvbnN0IEdMaGFsZk5WICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzMmh2TlYgKEdMdWludCBpbmRleCwgR0xzaXplaSBuLCBjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczNodk5WIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgbiwgY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnM0aHZOViAoR0x1aW50IGluZGV4LCBHTHNpemVpIG4sIGNvbnN0IEdMaGFsZk5WICp2KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWDJITlZQUk9DKSAoR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWDJIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYM0hOVlBST0MpIChHTGhhbGZOViB4LCBHTGhhbGZOViB5LCBHTGhhbGZOViB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYM0hWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVg0SE5WUFJPQykgKEdMaGFsZk5WIHgsIEdMaGFsZk5WIHksIEdMaGFsZk5WIHosIEdMaGFsZk5WIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVg0SFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTDNITlZQUk9DKSAoR0xoYWxmTlYgbngsIEdMaGFsZk5WIG55LCBHTGhhbGZOViBueik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTDNIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1IzSE5WUFJPQykgKEdMaGFsZk5WIHJlZCwgR0xoYWxmTlYgZ3JlZW4sIEdMaGFsZk5WIGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjNIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0SE5WUFJPQykgKEdMaGFsZk5WIHJlZCwgR0xoYWxmTlYgZ3JlZW4sIEdMaGFsZk5WIGJsdWUsIEdMaGFsZk5WIGFscGhhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0SFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMUhOVlBST0MpIChHTGhhbGZOViBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQxSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkhOVlBST0MpIChHTGhhbGZOViBzLCBHTGhhbGZOViB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQySFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEM0hOVlBST0MpIChHTGhhbGZOViBzLCBHTGhhbGZOViB0LCBHTGhhbGZOViByKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQzSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JENEhOVlBST0MpIChHTGhhbGZOViBzLCBHTGhhbGZOViB0LCBHTGhhbGZOViByLCBHTGhhbGZOViBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQ0SFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaGFsZk5WIHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUhWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkhOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGhhbGZOViBzLCBHTGhhbGZOViB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJIVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNITlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xoYWxmTlYgcywgR0xoYWxmTlYgdCwgR0xoYWxmTlYgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSFZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaGFsZk5WIHMsIEdMaGFsZk5WIHQsIEdMaGFsZk5WIHIsIEdMaGFsZk5WIHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENEhWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SREhOVlBST0MpIChHTGhhbGZOViBmb2cpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SREhWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKmZvZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0hOVlBST0MpIChHTGhhbGZOViByZWQsIEdMaGFsZk5WIGdyZWVuLCBHTGhhbGZOViBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFdFSUdIVEhOVlBST0MpIChHTGhhbGZOViB3ZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhXRUlHSFRIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp3ZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxSE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFIVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIySE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJIVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzSE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSwgR0xoYWxmTlYgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNIVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0SE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSwgR0xoYWxmTlYgeiwgR0xoYWxmTlYgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRIVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMUhWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIG4sIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzJIVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBuLCBjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMzSFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgbiwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTNEhWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIG4sIGNvbnN0IEdMaGFsZk5WICp2KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3BpeGVsX2RhdGFfcmFuZ2UKKyNkZWZpbmUgR0xfTlZfcGl4ZWxfZGF0YV9yYW5nZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsRGF0YVJhbmdlTlYgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGVuZ3RoLCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoUGl4ZWxEYXRhUmFuZ2VOViAoR0xlbnVtIHRhcmdldCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTERBVEFSQU5HRU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGVuZ3RoLCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGTFVTSFBJWEVMREFUQVJBTkdFTlZQUk9DKSAoR0xlbnVtIHRhcmdldCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wcmltaXRpdmVfcmVzdGFydAorI2RlZmluZSBHTF9OVl9wcmltaXRpdmVfcmVzdGFydCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByaW1pdGl2ZVJlc3RhcnROViAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJpbWl0aXZlUmVzdGFydEluZGV4TlYgKEdMdWludCBpbmRleCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUklNSVRJVkVSRVNUQVJUTlZQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBSSU1JVElWRVJFU1RBUlRJTkRFWE5WUFJPQykgKEdMdWludCBpbmRleCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX2V4cGFuZF9ub3JtYWwKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9leHBhbmRfbm9ybWFsIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtMgorI2RlZmluZSBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX21hcF9vYmplY3RfYnVmZmVyCisjZGVmaW5lIEdMX0FUSV9tYXBfb2JqZWN0X2J1ZmZlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgR0x2b2lkKiBBUElFTlRSWSBnbE1hcE9iamVjdEJ1ZmZlckFUSSAoR0x1aW50IGJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5tYXBPYmplY3RCdWZmZXJBVEkgKEdMdWludCBidWZmZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0x2b2lkKiAoQVBJRU5UUllQIFBGTkdMTUFQT0JKRUNUQlVGRkVSQVRJUFJPQykgKEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTk1BUE9CSkVDVEJVRkZFUkFUSVBST0MpIChHTHVpbnQgYnVmZmVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9zZXBhcmF0ZV9zdGVuY2lsCisjZGVmaW5lIEdMX0FUSV9zZXBhcmF0ZV9zdGVuY2lsIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbE9wU2VwYXJhdGVBVEkgKEdMZW51bSBmYWNlLCBHTGVudW0gc2ZhaWwsIEdMZW51bSBkcGZhaWwsIEdMZW51bSBkcHBhc3MpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxGdW5jU2VwYXJhdGVBVEkgKEdMZW51bSBmcm9udGZ1bmMsIEdMZW51bSBiYWNrZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTVEVOQ0lMT1BTRVBBUkFURUFUSVBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHNmYWlsLCBHTGVudW0gZHBmYWlsLCBHTGVudW0gZHBwYXNzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RFTkNJTEZVTkNTRVBBUkFURUFUSVBST0MpIChHTGVudW0gZnJvbnRmdW5jLCBHTGVudW0gYmFja2Z1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3ZlcnRleF9hdHRyaWJfYXJyYXlfb2JqZWN0CisjZGVmaW5lIEdMX0FUSV92ZXJ0ZXhfYXR0cmliX2FycmF5X29iamVjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkFycmF5T2JqZWN0QVRJIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBidWZmZXIsIEdMdWludCBvZmZzZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYkFycmF5T2JqZWN0ZnZBVEkgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYkFycmF5T2JqZWN0aXZBVEkgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkFSUkFZT0JKRUNUQVRJUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgR0x1aW50IGJ1ZmZlciwgR0x1aW50IG9mZnNldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkFSUkFZT0JKRUNURlZBVElQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkFSUkFZT0JKRUNUSVZBVElQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfT0VTX3JlYWRfZm9ybWF0CisjZGVmaW5lIEdMX09FU19yZWFkX2Zvcm1hdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZGVwdGhfYm91bmRzX3Rlc3QKKyNkZWZpbmUgR0xfRVhUX2RlcHRoX2JvdW5kc190ZXN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhCb3VuZHNFWFQgKEdMY2xhbXBkIHptaW4sIEdMY2xhbXBkIHptYXgpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVQVEhCT1VORFNFWFRQUk9DKSAoR0xjbGFtcGQgem1pbiwgR0xjbGFtcGQgem1heCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9taXJyb3JfY2xhbXAKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfbWlycm9yX2NsYW1wIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZQorI2RlZmluZSBHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVFWFQgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05TRVBBUkFURUVYVFBST0MpIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9NRVNBX3BhY2tfaW52ZXJ0CisjZGVmaW5lIEdMX01FU0FfcGFja19pbnZlcnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV95Y2Jjcl90ZXh0dXJlCisjZGVmaW5lIEdMX01FU0FfeWNiY3JfdGV4dHVyZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGl4ZWxfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9FWFRfcGl4ZWxfYnVmZmVyX29iamVjdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtX29wdGlvbgorI2RlZmluZSBHTF9OVl9mcmFnbWVudF9wcm9ncmFtX29wdGlvbiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtMgorI2RlZmluZSBHTF9OVl9mcmFnbWVudF9wcm9ncmFtMiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTJfb3B0aW9uCisjZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtMl9vcHRpb24gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0zCisjZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtMyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0VYVF9mcmFtZWJ1ZmZlcl9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUmVuZGVyYnVmZmVyRVhUIChHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kUmVuZGVyYnVmZmVyRVhUIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVSZW5kZXJidWZmZXJzRVhUIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcmVuZGVyYnVmZmVycyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuUmVuZGVyYnVmZmVyc0VYVCAoR0xzaXplaSBuLCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNGcmFtZWJ1ZmZlckVYVCAoR0x1aW50IGZyYW1lYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kRnJhbWVidWZmZXJFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlRnJhbWVidWZmZXJzRVhUIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZnJhbWVidWZmZXJzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5GcmFtZWJ1ZmZlcnNFWFQgKEdMc2l6ZWkgbiwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMpOworR0xBUEkgR0xlbnVtIEFQSUVOVFJZIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VYVCAoR0xlbnVtIHRhcmdldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlMURFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUzREVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuZXJhdGVNaXBtYXBFWFQgKEdMZW51bSB0YXJnZXQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1JFTkRFUkJVRkZFUkVYVFBST0MpIChHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFJFTkRFUkJVRkZFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFUkVOREVSQlVGRkVSU0VYVFBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcmVuZGVyYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlJFTkRFUkJVRkZFUlNFWFRQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRSRU5ERVJCVUZGRVJQQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTRlJBTUVCVUZGRVJFWFRQUk9DKSAoR0x1aW50IGZyYW1lYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREZSQU1FQlVGRkVSRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUZSQU1FQlVGRkVSU0VYVFBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZnJhbWVidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VORlJBTUVCVUZGRVJTRVhUUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMpOwordHlwZWRlZiBHTGVudW0gKEFQSUVOVFJZUCBQRk5HTENIRUNLRlJBTUVCVUZGRVJTVEFUVVNFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTFERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFM0RFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSUkVOREVSQlVGRkVSRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURlJBTUVCVUZGRVJBVFRBQ0hNRU5UUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTkVSQVRFTUlQTUFQRVhUUFJPQykgKEdMZW51bSB0YXJnZXQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfR1JFTUVEWV9zdHJpbmdfbWFya2VyCisjZGVmaW5lIEdMX0dSRU1FRFlfc3RyaW5nX21hcmtlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0cmluZ01hcmtlckdSRU1FRFkgKEdMc2l6ZWkgbGVuLCBjb25zdCBHTHZvaWQgKnN0cmluZyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTVFJJTkdNQVJLRVJHUkVNRURZUFJPQykgKEdMc2l6ZWkgbGVuLCBjb25zdCBHTHZvaWQgKnN0cmluZyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFja2VkX2RlcHRoX3N0ZW5jaWwKKyNkZWZpbmUgR0xfRVhUX3BhY2tlZF9kZXB0aF9zdGVuY2lsIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zdGVuY2lsX2NsZWFyX3RhZworI2RlZmluZSBHTF9FWFRfc3RlbmNpbF9jbGVhcl90YWcgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsQ2xlYXJUYWdFWFQgKEdMc2l6ZWkgc3RlbmNpbFRhZ0JpdHMsIEdMdWludCBzdGVuY2lsQ2xlYXJUYWcpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RFTkNJTENMRUFSVEFHRVhUUFJPQykgKEdMc2l6ZWkgc3RlbmNpbFRhZ0JpdHMsIEdMdWludCBzdGVuY2lsQ2xlYXJUYWcpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfc1JHQgorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9zUkdCIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9mcmFtZWJ1ZmZlcl9ibGl0CisjZGVmaW5lIEdMX0VYVF9mcmFtZWJ1ZmZlcl9ibGl0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxpdEZyYW1lYnVmZmVyRVhUIChHTGludCBzcmNYMCwgR0xpbnQgc3JjWTAsIEdMaW50IHNyY1gxLCBHTGludCBzcmNZMSwgR0xpbnQgZHN0WDAsIEdMaW50IGRzdFkwLCBHTGludCBkc3RYMSwgR0xpbnQgZHN0WTEsIEdMYml0ZmllbGQgbWFzaywgR0xlbnVtIGZpbHRlcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTElURlJBTUVCVUZGRVJFWFRQUk9DKSAoR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsIEdMaW50IGRzdFgwLCBHTGludCBkc3RZMCwgR0xpbnQgZHN0WDEsIEdMaW50IGRzdFkxLCBHTGJpdGZpZWxkIG1hc2ssIEdMZW51bSBmaWx0ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX0VYVF9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFTkRFUkJVRkZFUlNUT1JBR0VNVUxUSVNBTVBMRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQVhfdGV4dHVyZV9zdGFjaworI2RlZmluZSBHTF9NRVNBWF90ZXh0dXJlX3N0YWNrIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90aW1lcl9xdWVyeQorI2RlZmluZSBHTF9FWFRfdGltZXJfcXVlcnkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRRdWVyeU9iamVjdGk2NHZFWFQgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludDY0RVhUICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFF1ZXJ5T2JqZWN0dWk2NHZFWFQgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQ2NEVYVCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZT0JKRUNUSTY0VkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xpbnQ2NEVYVCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUVVFUllPQkpFQ1RVSTY0VkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50NjRFWFQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZ3B1X3Byb2dyYW1fcGFyYW1ldGVycworI2RlZmluZSBHTF9FWFRfZ3B1X3Byb2dyYW1fcGFyYW1ldGVycyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJzNGZ2RVhUIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyczRmdkVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUlM0RlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTE9DQUxQQVJBTUVURVJTNEZWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2ZsdXNoX2J1ZmZlcl9yYW5nZQorI2RlZmluZSBHTF9BUFBMRV9mbHVzaF9idWZmZXJfcmFuZ2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCdWZmZXJQYXJhbWV0ZXJpQVBQTEUgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoTWFwcGVkQnVmZmVyUmFuZ2VBUFBMRSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQlVGRkVSUEFSQU1FVEVSSUFQUExFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGTFVTSE1BUFBFREJVRkZFUlJBTkdFQVBQTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZ3B1X3Byb2dyYW00CisjZGVmaW5lIEdMX05WX2dwdV9wcm9ncmFtNCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0aU5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0aXZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJzSTRpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0dWlOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB6LCBHTHVpbnQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTR1aXZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyc0k0dWl2TlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJJNGlOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVySTRpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJzSTRpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJJNHVpTlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgeiwgR0x1aW50IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJJNHVpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyc0k0dWl2TlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlcklpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlckl1aXZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUVudlBhcmFtZXRlcklpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1FbnZQYXJhbWV0ZXJJdWl2TlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSSTRJTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSSTRJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1MT0NBTFBBUkFNRVRFUlNJNElWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSSTRVSU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgeiwgR0x1aW50IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTE9DQUxQQVJBTUVURVJJNFVJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTE9DQUxQQVJBTUVURVJTSTRVSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUkk0SU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1FTlZQQVJBTUVURVJJNElWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUlNJNElWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUkk0VUlOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHosIEdMdWludCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUkk0VUlWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1FTlZQQVJBTUVURVJTSTRVSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUxPQ0FMUEFSQU1FVEVSSUlWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUxPQ0FMUEFSQU1FVEVSSVVJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNRU5WUEFSQU1FVEVSSUlWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUVOVlBBUkFNRVRFUklVSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2dlb21ldHJ5X3Byb2dyYW00CisjZGVmaW5lIEdMX05WX2dlb21ldHJ5X3Byb2dyYW00IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVZlcnRleExpbWl0TlYgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxpbWl0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmVFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZUxheWVyRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGludCBsYXllcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlRmFjZUVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xlbnVtIGZhY2UpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVZFUlRFWExJTUlUTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGltaXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRUxBWUVSRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IGxheWVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFRkFDRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGVudW0gZmFjZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZ2VvbWV0cnlfc2hhZGVyNAorI2RlZmluZSBHTF9FWFRfZ2VvbWV0cnlfc2hhZGVyNCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXJpRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCB2YWx1ZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNUEFSQU1FVEVSSUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCB2YWx1ZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTQKKyNkZWZpbmUgR0xfTlZfdmVydGV4X3Byb2dyYW00IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTFpRVhUIChHTHVpbnQgaW5kZXgsIEdMaW50IHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkyaUVYVCAoR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJM2lFWFQgKEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTRpRVhUIChHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkxdWlFWFQgKEdMdWludCBpbmRleCwgR0x1aW50IHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkydWlFWFQgKEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJM3VpRVhUIChHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0dWlFWFQgKEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgeiwgR0x1aW50IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkxaXZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkyaXZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkzaXZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0aXZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkxdWl2RVhUIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTJ1aXZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJM3VpdkVYVCAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0dWl2RVhUIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTRidkVYVCAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0c3ZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTR1YnZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTR1c3ZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYklQb2ludGVyRVhUIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJJaXZFWFQgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJJdWl2RVhUIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTFJRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkySUVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJM0lFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTRJRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkxVUlFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkyVUlFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJM1VJRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0VUlFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB6LCBHTHVpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkxSVZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkySVZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkzSVZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0SVZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkxVUlWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTJVSVZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJM1VJVkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0VUlWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTRCVkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0U1ZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTRVQlZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTRVU1ZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQklQT0lOVEVSRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJJSVZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJJVUlWRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZ3B1X3NoYWRlcjQKKyNkZWZpbmUgR0xfRVhUX2dwdV9zaGFkZXI0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VW5pZm9ybXVpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEZyYWdEYXRhTG9jYXRpb25FWFQgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgY29sb3IsIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbEdldEZyYWdEYXRhTG9jYXRpb25FWFQgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xdWlFWFQgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0ydWlFWFQgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTN1aUVYVCAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00dWlFWFQgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyLCBHTHVpbnQgdjMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xdWl2RVhUIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJ1aXZFWFQgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM3VpdkVYVCAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00dWl2RVhUIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNVUlWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5ERlJBR0RBVEFMT0NBVElPTkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGNvbG9yLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMR0VURlJBR0RBVEFMT0NBVElPTkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFVSUVYVFBST0MpIChHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJVSUVYVFBST0MpIChHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM1VJRVhUUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRVSUVYVFBST0MpIChHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEsIEdMdWludCB2MiwgR0x1aW50IHYzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFVSVZFWFRQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMlVJVkVYVFBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zVUlWRVhUUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRVSVZFWFRQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2RyYXdfaW5zdGFuY2VkCisjZGVmaW5lIEdMX0VYVF9kcmF3X2luc3RhbmNlZCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdBcnJheXNJbnN0YW5jZWRFWFQgKEdMZW51bSBtb2RlLCBHTGludCBzdGFydCwgR0xzaXplaSBjb3VudCwgR0xzaXplaSBwcmltY291bnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdFbGVtZW50c0luc3RhbmNlZEVYVCAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdBUlJBWVNJTlNUQU5DRURFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50IHN0YXJ0LCBHTHNpemVpIGNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdFTEVNRU5UU0lOU1RBTkNFREVYVFBST0MpIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BhY2tlZF9mbG9hdAorI2RlZmluZSBHTF9FWFRfcGFja2VkX2Zsb2F0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2FycmF5CisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2FycmF5IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfYnVmZmVyX29iamVjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEJ1ZmZlckVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHVpbnQgYnVmZmVyKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWEJVRkZFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMdWludCBidWZmZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fbGF0YworI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9sYXRjIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGMKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fcmd0YyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zaGFyZWRfZXhwb25lbnQKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfc2hhcmVkX2V4cG9uZW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2RlcHRoX2J1ZmZlcl9mbG9hdAorI2RlZmluZSBHTF9OVl9kZXB0aF9idWZmZXJfZmxvYXQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aFJhbmdlZE5WIChHTGRvdWJsZSB6TmVhciwgR0xkb3VibGUgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJEZXB0aGROViAoR0xkb3VibGUgZGVwdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoQm91bmRzZE5WIChHTGRvdWJsZSB6bWluLCBHTGRvdWJsZSB6bWF4KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFUFRIUkFOR0VETlZQUk9DKSAoR0xkb3VibGUgek5lYXIsIEdMZG91YmxlIHpGYXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTEVBUkRFUFRIRE5WUFJPQykgKEdMZG91YmxlIGRlcHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVQVEhCT1VORFNETlZQUk9DKSAoR0xkb3VibGUgem1pbiwgR0xkb3VibGUgem1heCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtNAorI2RlZmluZSBHTF9OVl9mcmFnbWVudF9wcm9ncmFtNCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZV9jb3ZlcmFnZQorI2RlZmluZSBHTF9OVl9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZV9jb3ZlcmFnZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUNvdmVyYWdlTlYgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgY292ZXJhZ2VTYW1wbGVzLCBHTHNpemVpIGNvbG9yU2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVDT1ZFUkFHRU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgY292ZXJhZ2VTYW1wbGVzLCBHTHNpemVpIGNvbG9yU2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZnJhbWVidWZmZXJfc1JHQgorI2RlZmluZSBHTF9FWFRfZnJhbWVidWZmZXJfc1JHQiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9nZW9tZXRyeV9zaGFkZXI0CisjZGVmaW5lIEdMX05WX2dlb21ldHJ5X3NoYWRlcjQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcGFyYW1ldGVyX2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xfTlZfcGFyYW1ldGVyX2J1ZmZlcl9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtQnVmZmVyUGFyYW1ldGVyc2Z2TlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtQnVmZmVyUGFyYW1ldGVyc0lpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1CdWZmZXJQYXJhbWV0ZXJzSXVpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1CVUZGRVJQQVJBTUVURVJTRlZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1CVUZGRVJQQVJBTUVURVJTSUlWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlciwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUJVRkZFUlBBUkFNRVRFUlNJVUlWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlciwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZHJhd19idWZmZXJzMgorI2RlZmluZSBHTF9FWFRfZHJhd19idWZmZXJzMiAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yTWFza0luZGV4ZWRFWFQgKEdMdWludCBpbmRleCwgR0xib29sZWFuIHIsIEdMYm9vbGVhbiBnLCBHTGJvb2xlYW4gYiwgR0xib29sZWFuIGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJvb2xlYW5JbmRleGVkdkVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGJvb2xlYW4gKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEludGVnZXJJbmRleGVkdkVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlSW5kZXhlZEVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlSW5kZXhlZEVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4KTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzRW5hYmxlZEluZGV4ZWRFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUk1BU0tJTkRFWEVERVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xib29sZWFuIHIsIEdMYm9vbGVhbiBnLCBHTGJvb2xlYW4gYiwgR0xib29sZWFuIGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRCT09MRUFOSU5ERVhFRFZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGJvb2xlYW4gKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTlRFR0VSSU5ERVhFRFZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVOQUJMRUlOREVYRURFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRElTQUJMRUlOREVYRURFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0VOQUJMRURJTkRFWEVERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90cmFuc2Zvcm1fZmVlZGJhY2sKKyNkZWZpbmUgR0xfTlZfdHJhbnNmb3JtX2ZlZWRiYWNrIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5UcmFuc2Zvcm1GZWVkYmFja05WIChHTGVudW0gcHJpbWl0aXZlTW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kVHJhbnNmb3JtRmVlZGJhY2tOViAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVHJhbnNmb3JtRmVlZGJhY2tBdHRyaWJzTlYgKEdMdWludCBjb3VudCwgY29uc3QgR0xpbnQgKmF0dHJpYnMsIEdMZW51bSBidWZmZXJNb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kQnVmZmVyUmFuZ2VOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgYnVmZmVyLCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEJ1ZmZlck9mZnNldE5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBidWZmZXIsIEdMaW50cHRyIG9mZnNldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEJ1ZmZlckJhc2VOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzTlYgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqbG9jYXRpb25zLCBHTGVudW0gYnVmZmVyTW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWN0aXZlVmFyeWluZ05WIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsR2V0VmFyeWluZ0xvY2F0aW9uTlYgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVZhcnlpbmdOViAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMc2l6ZWkgKnNpemUsIEdMZW51bSAqdHlwZSwgR0xjaGFyICpuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdOViAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xpbnQgKmxvY2F0aW9uKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbUF0dHJpYnNOViAoR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKmF0dHJpYnMsIEdMc2l6ZWkgbmJ1ZmZlcnMsIGNvbnN0IEdMaW50ICpidWZzdHJlYW1zLCBHTGVudW0gYnVmZmVyTW9kZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTlRSQU5TRk9STUZFRURCQUNLTlZQUk9DKSAoR0xlbnVtIHByaW1pdGl2ZU1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRUUkFOU0ZPUk1GRUVEQkFDS05WUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUUkFOU0ZPUk1GRUVEQkFDS0FUVFJJQlNOVlBST0MpIChHTHVpbnQgY291bnQsIGNvbnN0IEdMaW50ICphdHRyaWJzLCBHTGVudW0gYnVmZmVyTW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRCVUZGRVJSQU5HRU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EQlVGRkVST0ZGU0VUTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgYnVmZmVyLCBHTGludHB0ciBvZmZzZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EQlVGRkVSQkFTRU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRSQU5TRk9STUZFRURCQUNLVkFSWUlOR1NOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKmxvY2F0aW9ucywgR0xlbnVtIGJ1ZmZlck1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBQ1RJVkVWQVJZSU5HTlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRWQVJZSU5HTE9DQVRJT05OVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQUNUSVZFVkFSWUlOR05WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTHNpemVpICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFRSQU5TRk9STUZFRURCQUNLVkFSWUlOR05WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMaW50ICpsb2NhdGlvbik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRSQU5TRk9STUZFRURCQUNLU1RSRUFNQVRUUklCU05WUFJPQykgKEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICphdHRyaWJzLCBHTHNpemVpIG5idWZmZXJzLCBjb25zdCBHTGludCAqYnVmc3RyZWFtcywgR0xlbnVtIGJ1ZmZlck1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JpbmRhYmxlX3VuaWZvcm0KKyNkZWZpbmUgR0xfRVhUX2JpbmRhYmxlX3VuaWZvcm0gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtQnVmZmVyRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCBidWZmZXIpOworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtQnVmZmVyU2l6ZUVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uKTsKK0dMQVBJIEdMaW50cHRyIEFQSUVOVFJZIGdsR2V0VW5pZm9ybU9mZnNldEVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1CVUZGRVJFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1CVUZGRVJTSVpFRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbik7Cit0eXBlZGVmIEdMaW50cHRyIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNT0ZGU0VURVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9pbnRlZ2VyCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2ludGVnZXIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJJaXZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVySXVpdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVySWl2RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRleFBhcmFtZXRlckl1aXZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyQ29sb3JJaUVYVCAoR0xpbnQgcmVkLCBHTGludCBncmVlbiwgR0xpbnQgYmx1ZSwgR0xpbnQgYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyQ29sb3JJdWlFWFQgKEdMdWludCByZWQsIEdMdWludCBncmVlbiwgR0x1aW50IGJsdWUsIEdMdWludCBhbHBoYSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhQQVJBTUVURVJJSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYUEFSQU1FVEVSSVVJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYUEFSQU1FVEVSSUlWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFRFWFBBUkFNRVRFUklVSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENMRUFSQ09MT1JJSUVYVFBST0MpIChHTGludCByZWQsIEdMaW50IGdyZWVuLCBHTGludCBibHVlLCBHTGludCBhbHBoYSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENMRUFSQ09MT1JJVUlFWFRQUk9DKSAoR0x1aW50IHJlZCwgR0x1aW50IGdyZWVuLCBHTHVpbnQgYmx1ZSwgR0x1aW50IGFscGhhKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0dSRU1FRFlfZnJhbWVfdGVybWluYXRvcgorI2RlZmluZSBHTF9HUkVNRURZX2ZyYW1lX3Rlcm1pbmF0b3IgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZVRlcm1pbmF0b3JHUkVNRURZICh2b2lkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FVEVSTUlOQVRPUkdSRU1FRFlQUk9DKSAodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9jb25kaXRpb25hbF9yZW5kZXIKKyNkZWZpbmUgR0xfTlZfY29uZGl0aW9uYWxfcmVuZGVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5Db25kaXRpb25hbFJlbmRlck5WIChHTHVpbnQgaWQsIEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmRDb25kaXRpb25hbFJlbmRlck5WICh2b2lkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOQ09ORElUSU9OQUxSRU5ERVJOVlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBtb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5EQ09ORElUSU9OQUxSRU5ERVJOVlBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ByZXNlbnRfdmlkZW8KKyNkZWZpbmUgR0xfTlZfcHJlc2VudF92aWRlbyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByZXNlbnRGcmFtZUtleWVkTlYgKEdMdWludCB2aWRlb19zbG90LCBHTHVpbnQ2NEVYVCBtaW5QcmVzZW50VGltZSwgR0x1aW50IGJlZ2luUHJlc2VudFRpbWVJZCwgR0x1aW50IHByZXNlbnREdXJhdGlvbklkLCBHTGVudW0gdHlwZSwgR0xlbnVtIHRhcmdldDAsIEdMdWludCBmaWxsMCwgR0x1aW50IGtleTAsIEdMZW51bSB0YXJnZXQxLCBHTHVpbnQgZmlsbDEsIEdMdWludCBrZXkxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcmVzZW50RnJhbWVEdWFsRmlsbE5WIChHTHVpbnQgdmlkZW9fc2xvdCwgR0x1aW50NjRFWFQgbWluUHJlc2VudFRpbWUsIEdMdWludCBiZWdpblByZXNlbnRUaW1lSWQsIEdMdWludCBwcmVzZW50RHVyYXRpb25JZCwgR0xlbnVtIHR5cGUsIEdMZW51bSB0YXJnZXQwLCBHTHVpbnQgZmlsbDAsIEdMZW51bSB0YXJnZXQxLCBHTHVpbnQgZmlsbDEsIEdMZW51bSB0YXJnZXQyLCBHTHVpbnQgZmlsbDIsIEdMZW51bSB0YXJnZXQzLCBHTHVpbnQgZmlsbDMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZpZGVvaXZOViAoR0x1aW50IHZpZGVvX3Nsb3QsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmlkZW91aXZOViAoR0x1aW50IHZpZGVvX3Nsb3QsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZpZGVvaTY0dk5WIChHTHVpbnQgdmlkZW9fc2xvdCwgR0xlbnVtIHBuYW1lLCBHTGludDY0RVhUICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZpZGVvdWk2NHZOViAoR0x1aW50IHZpZGVvX3Nsb3QsIEdMZW51bSBwbmFtZSwgR0x1aW50NjRFWFQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUkVTRU5URlJBTUVLRVlFRE5WUFJPQykgKEdMdWludCB2aWRlb19zbG90LCBHTHVpbnQ2NEVYVCBtaW5QcmVzZW50VGltZSwgR0x1aW50IGJlZ2luUHJlc2VudFRpbWVJZCwgR0x1aW50IHByZXNlbnREdXJhdGlvbklkLCBHTGVudW0gdHlwZSwgR0xlbnVtIHRhcmdldDAsIEdMdWludCBmaWxsMCwgR0x1aW50IGtleTAsIEdMZW51bSB0YXJnZXQxLCBHTHVpbnQgZmlsbDEsIEdMdWludCBrZXkxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJFU0VOVEZSQU1FRFVBTEZJTExOVlBST0MpIChHTHVpbnQgdmlkZW9fc2xvdCwgR0x1aW50NjRFWFQgbWluUHJlc2VudFRpbWUsIEdMdWludCBiZWdpblByZXNlbnRUaW1lSWQsIEdMdWludCBwcmVzZW50RHVyYXRpb25JZCwgR0xlbnVtIHR5cGUsIEdMZW51bSB0YXJnZXQwLCBHTHVpbnQgZmlsbDAsIEdMZW51bSB0YXJnZXQxLCBHTHVpbnQgZmlsbDEsIEdMZW51bSB0YXJnZXQyLCBHTHVpbnQgZmlsbDIsIEdMZW51bSB0YXJnZXQzLCBHTHVpbnQgZmlsbDMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWSURFT0lWTlZQUk9DKSAoR0x1aW50IHZpZGVvX3Nsb3QsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZJREVPVUlWTlZQUk9DKSAoR0x1aW50IHZpZGVvX3Nsb3QsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWSURFT0k2NFZOVlBST0MpIChHTHVpbnQgdmlkZW9fc2xvdCwgR0xlbnVtIHBuYW1lLCBHTGludDY0RVhUICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWSURFT1VJNjRWTlZQUk9DKSAoR0x1aW50IHZpZGVvX3Nsb3QsIEdMZW51bSBwbmFtZSwgR0x1aW50NjRFWFQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrCisjZGVmaW5lIEdMX0VYVF90cmFuc2Zvcm1fZmVlZGJhY2sgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUIChHTGVudW0gcHJpbWl0aXZlTW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kVHJhbnNmb3JtRmVlZGJhY2tFWFQgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRCdWZmZXJSYW5nZUVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgYnVmZmVyLCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEJ1ZmZlck9mZnNldEVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgYnVmZmVyLCBHTGludHB0ciBvZmZzZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRCdWZmZXJCYXNlRVhUIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBidWZmZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3NFWFQgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqICp2YXJ5aW5ncywgR0xlbnVtIGJ1ZmZlck1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ0VYVCAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMc2l6ZWkgKnNpemUsIEdMZW51bSAqdHlwZSwgR0xjaGFyICpuYW1lKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOVFJBTlNGT1JNRkVFREJBQ0tFWFRQUk9DKSAoR0xlbnVtIHByaW1pdGl2ZU1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRUUkFOU0ZPUk1GRUVEQkFDS0VYVFBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREJVRkZFUlJBTkdFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EQlVGRkVST0ZGU0VURVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREJVRkZFUkJBU0VFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVFJBTlNGT1JNRkVFREJBQ0tWQVJZSU5HU0VYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiAqdmFyeWluZ3MsIEdMZW51bSBidWZmZXJNb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVFJBTlNGT1JNRkVFREJBQ0tWQVJZSU5HRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTHNpemVpICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZGlyZWN0X3N0YXRlX2FjY2VzcworI2RlZmluZSBHTF9FWFRfZGlyZWN0X3N0YXRlX2FjY2VzcyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsaWVudEF0dHJpYkRlZmF1bHRFWFQgKEdMYml0ZmllbGQgbWFzayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHVzaENsaWVudEF0dHJpYkRlZmF1bHRFWFQgKEdMYml0ZmllbGQgbWFzayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4TG9hZGZFWFQgKEdMZW51bSBtb2RlLCBjb25zdCBHTGZsb2F0ICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhMb2FkZEVYVCAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMZG91YmxlICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhNdWx0ZkVYVCAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMZmxvYXQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeE11bHRkRVhUIChHTGVudW0gbW9kZSwgY29uc3QgR0xkb3VibGUgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeExvYWRJZGVudGl0eUVYVCAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeFJvdGF0ZWZFWFQgKEdMZW51bSBtb2RlLCBHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhSb3RhdGVkRVhUIChHTGVudW0gbW9kZSwgR0xkb3VibGUgYW5nbGUsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeFNjYWxlZkVYVCAoR0xlbnVtIG1vZGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeFNjYWxlZEVYVCAoR0xlbnVtIG1vZGUsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeFRyYW5zbGF0ZWZFWFQgKEdMZW51bSBtb2RlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhUcmFuc2xhdGVkRVhUIChHTGVudW0gbW9kZSwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4RnJ1c3R1bUVYVCAoR0xlbnVtIG1vZGUsIEdMZG91YmxlIGxlZnQsIEdMZG91YmxlIHJpZ2h0LCBHTGRvdWJsZSBib3R0b20sIEdMZG91YmxlIHRvcCwgR0xkb3VibGUgek5lYXIsIEdMZG91YmxlIHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeE9ydGhvRVhUIChHTGVudW0gbW9kZSwgR0xkb3VibGUgbGVmdCwgR0xkb3VibGUgcmlnaHQsIEdMZG91YmxlIGJvdHRvbSwgR0xkb3VibGUgdG9wLCBHTGRvdWJsZSB6TmVhciwgR0xkb3VibGUgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4UG9wRVhUIChHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4UHVzaEVYVCAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeExvYWRUcmFuc3Bvc2VmRVhUIChHTGVudW0gbW9kZSwgY29uc3QgR0xmbG9hdCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4TG9hZFRyYW5zcG9zZWRFWFQgKEdMZW51bSBtb2RlLCBjb25zdCBHTGRvdWJsZSAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4TXVsdFRyYW5zcG9zZWZFWFQgKEdMZW51bSBtb2RlLCBjb25zdCBHTGZsb2F0ICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhNdWx0VHJhbnNwb3NlZEVYVCAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMZG91YmxlICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlUGFyYW1ldGVyZkVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZVBhcmFtZXRlcmZ2RVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVQYXJhbWV0ZXJpRVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZVBhcmFtZXRlcml2RVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlSW1hZ2UxREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlSW1hZ2UyREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZVN1YkltYWdlMURFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlU3ViSW1hZ2UyREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4dHVyZUltYWdlMURFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlUZXh0dXJlSW1hZ2UyREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlUZXh0dXJlU3ViSW1hZ2UxREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4dHVyZVN1YkltYWdlMkRFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRleHR1cmVJbWFnZUVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRleHR1cmVQYXJhbWV0ZXJmdkVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXh0dXJlUGFyYW1ldGVyaXZFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRleHR1cmVMZXZlbFBhcmFtZXRlcmZ2RVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXh0dXJlTGV2ZWxQYXJhbWV0ZXJpdkVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVJbWFnZTNERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlU3ViSW1hZ2UzREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4dHVyZVN1YkltYWdlM0RFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4UGFyYW1ldGVyZkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhQYXJhbWV0ZXJmdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleFBhcmFtZXRlcmlFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleFBhcmFtZXRlcml2RVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleEltYWdlMURFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhJbWFnZTJERVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleFN1YkltYWdlMURFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleFN1YkltYWdlMkRFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weU11bHRpVGV4SW1hZ2UxREVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weU11bHRpVGV4SW1hZ2UyREVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlNdWx0aVRleFN1YkltYWdlMURFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weU11bHRpVGV4U3ViSW1hZ2UyREVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TXVsdGlUZXhJbWFnZUVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE11bHRpVGV4UGFyYW1ldGVyZnZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TXVsdGlUZXhQYXJhbWV0ZXJpdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TXVsdGlUZXhMZXZlbFBhcmFtZXRlcmZ2RVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNdWx0aVRleExldmVsUGFyYW1ldGVyaXZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleEltYWdlM0RFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4U3ViSW1hZ2UzREVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5TXVsdGlUZXhTdWJJbWFnZTNERVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kTXVsdGlUZXh0dXJlRVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuYWJsZUNsaWVudFN0YXRlSW5kZXhlZEVYVCAoR0xlbnVtIGFycmF5LCBHTHVpbnQgaW5kZXgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERpc2FibGVDbGllbnRTdGF0ZUluZGV4ZWRFWFQgKEdMZW51bSBhcnJheSwgR0x1aW50IGluZGV4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkUG9pbnRlckVYVCAoR0xlbnVtIHRleHVuaXQsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleEVudmZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4RW52ZnZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhFbnZpRVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhFbnZpdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhHZW5kRVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZG91YmxlIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleEdlbmR2RVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZG91YmxlICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4R2VuZkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleEdlbmZ2RVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhHZW5pRVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleEdlbml2RVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE11bHRpVGV4RW52ZnZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TXVsdGlUZXhFbnZpdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TXVsdGlUZXhHZW5kdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNdWx0aVRleEdlbmZ2RVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TXVsdGlUZXhHZW5pdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGbG9hdEluZGV4ZWR2RVhUIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldERvdWJsZUluZGV4ZWR2RVhUIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQb2ludGVySW5kZXhlZHZFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x2b2lkKiAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleHR1cmVJbWFnZTNERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleHR1cmVJbWFnZTJERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleHR1cmVJbWFnZTFERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpiaXRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4dHVyZVN1YkltYWdlM0RFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXh0dXJlU3ViSW1hZ2UyREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleHR1cmVTdWJJbWFnZTFERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbXByZXNzZWRUZXh0dXJlSW1hZ2VFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsb2QsIEdMdm9pZCAqaW1nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkTXVsdGlUZXhJbWFnZTNERVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZE11bHRpVGV4SW1hZ2UyREVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRNdWx0aVRleEltYWdlMURFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRNdWx0aVRleFN1YkltYWdlM0RFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRNdWx0aVRleFN1YkltYWdlMkRFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRNdWx0aVRleFN1YkltYWdlMURFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tcHJlc3NlZE11bHRpVGV4SW1hZ2VFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsb2QsIEdMdm9pZCAqaW1nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZFByb2dyYW1TdHJpbmdFWFQgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGxlbiwgY29uc3QgR0x2b2lkICpzdHJpbmcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGRFWFQgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGR2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRmRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyZHZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TmFtZWRQcm9ncmFtaXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE5hbWVkUHJvZ3JhbVN0cmluZ0VYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkICpzdHJpbmcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyczRmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0aUVYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNGl2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcnNJNGl2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0dWlFWFQgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHosIEdMdWludCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0dWl2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJzSTR1aXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXROYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcklpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJdWl2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZVBhcmFtZXRlcklpdkVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZVBhcmFtZXRlckl1aXZFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXh0dXJlUGFyYW1ldGVySWl2RVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXh0dXJlUGFyYW1ldGVySXVpdkVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4UGFyYW1ldGVySWl2RVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleFBhcmFtZXRlckl1aXZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNdWx0aVRleFBhcmFtZXRlcklpdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TXVsdGlUZXhQYXJhbWV0ZXJJdWl2RVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xZkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJmRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2ZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2Mik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00ZkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGZsb2F0IHYzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTFpRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJpRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zaUVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTRpRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSwgR0xpbnQgdjIsIEdMaW50IHYzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTFmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2Z2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTRmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xaXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2l2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00aXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4M2Z2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDN4MmZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4NGZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4MmZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDN4NGZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4M2Z2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTF1aUVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMnVpRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTN1aUVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTR1aUVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyLCBHTHVpbnQgdjMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMXVpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJ1aXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zdWl2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNHVpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZEJ1ZmZlckRhdGFFWFQgKEdMdWludCBidWZmZXIsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkQnVmZmVyU3ViRGF0YUVYVCAoR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTEFQSSBHTHZvaWQqIEFQSUVOVFJZIGdsTWFwTmFtZWRCdWZmZXJFWFQgKEdMdWludCBidWZmZXIsIEdMZW51bSBhY2Nlc3MpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsVW5tYXBOYW1lZEJ1ZmZlckVYVCAoR0x1aW50IGJ1ZmZlcik7CitHTEFQSSBHTHZvaWQqIEFQSUVOVFJZIGdsTWFwTmFtZWRCdWZmZXJSYW5nZUVYVCAoR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIGxlbmd0aCwgR0xiaXRmaWVsZCBhY2Nlc3MpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoTWFwcGVkTmFtZWRCdWZmZXJSYW5nZUVYVCAoR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIGxlbmd0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRDb3B5QnVmZmVyU3ViRGF0YUVYVCAoR0x1aW50IHJlYWRCdWZmZXIsIEdMdWludCB3cml0ZUJ1ZmZlciwgR0xpbnRwdHIgcmVhZE9mZnNldCwgR0xpbnRwdHIgd3JpdGVPZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TmFtZWRCdWZmZXJQYXJhbWV0ZXJpdkVYVCAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXROYW1lZEJ1ZmZlclBvaW50ZXJ2RVhUIChHTHVpbnQgYnVmZmVyLCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TmFtZWRCdWZmZXJTdWJEYXRhRVhUIChHTHVpbnQgYnVmZmVyLCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlQnVmZmVyRVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHVpbnQgYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleEJ1ZmZlckVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0x1aW50IGJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRSZW5kZXJidWZmZXJTdG9yYWdlRVhUIChHTHVpbnQgcmVuZGVyYnVmZmVyLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXROYW1lZFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2RVhUIChHTHVpbnQgcmVuZGVyYnVmZmVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgR0xlbnVtIEFQSUVOVFJZIGdsQ2hlY2tOYW1lZEZyYW1lYnVmZmVyU3RhdHVzRVhUIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSB0YXJnZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkRnJhbWVidWZmZXJUZXh0dXJlMURFWFQgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmUyREVYVCAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZEZyYW1lYnVmZmVyVGV4dHVyZTNERVhUIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE5hbWVkRnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZFWFQgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuZXJhdGVUZXh0dXJlTWlwbWFwRVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuZXJhdGVNdWx0aVRleE1pcG1hcEVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyRHJhd0J1ZmZlckVYVCAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJEcmF3QnVmZmVyc0VYVCAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJSZWFkQnVmZmVyRVhUIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGcmFtZWJ1ZmZlclBhcmFtZXRlcml2RVhUIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQgKEdMdWludCByZW5kZXJidWZmZXIsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVDb3ZlcmFnZUVYVCAoR0x1aW50IHJlbmRlcmJ1ZmZlciwgR0xzaXplaSBjb3ZlcmFnZVNhbXBsZXMsIEdMc2l6ZWkgY29sb3JTYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZEZyYW1lYnVmZmVyVGV4dHVyZUVYVCAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZEZyYW1lYnVmZmVyVGV4dHVyZUxheWVyRVhUIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IGxheWVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZEZyYW1lYnVmZmVyVGV4dHVyZUZhY2VFWFQgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xlbnVtIGZhY2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVSZW5kZXJidWZmZXJFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleFJlbmRlcmJ1ZmZlckVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWRFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yZEVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTNkRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGRFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xZHZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJkdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2R2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00ZHZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJkdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M2R2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZHZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4M2R2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDRkdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M3gyZHZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDN4NGR2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDJkdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NHgzZHZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENMSUVOVEFUVFJJQkRFRkFVTFRFWFRQUk9DKSAoR0xiaXRmaWVsZCBtYXNrKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFVTSENMSUVOVEFUVFJJQkRFRkFVTFRFWFRQUk9DKSAoR0xiaXRmaWVsZCBtYXNrKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYTE9BREZFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMZmxvYXQgKm0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhMT0FEREVYVFBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xkb3VibGUgKm0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhNVUxURkVYVFBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWE1VTFRERVhUUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTGRvdWJsZSAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWExPQURJREVOVElUWUVYVFBST0MpIChHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWFJPVEFURUZFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhST1RBVEVERVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTGRvdWJsZSBhbmdsZSwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWFNDQUxFRkVYVFBST0MpIChHTGVudW0gbW9kZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWFNDQUxFREVYVFBST0MpIChHTGVudW0gbW9kZSwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWFRSQU5TTEFURUZFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhUUkFOU0xBVEVERVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYRlJVU1RVTUVYVFBST0MpIChHTGVudW0gbW9kZSwgR0xkb3VibGUgbGVmdCwgR0xkb3VibGUgcmlnaHQsIEdMZG91YmxlIGJvdHRvbSwgR0xkb3VibGUgdG9wLCBHTGRvdWJsZSB6TmVhciwgR0xkb3VibGUgekZhcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWE9SVEhPRVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTGRvdWJsZSBsZWZ0LCBHTGRvdWJsZSByaWdodCwgR0xkb3VibGUgYm90dG9tLCBHTGRvdWJsZSB0b3AsIEdMZG91YmxlIHpOZWFyLCBHTGRvdWJsZSB6RmFyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYUE9QRVhUUFJPQykgKEdMZW51bSBtb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYUFVTSEVYVFBST0MpIChHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWExPQURUUkFOU1BPU0VGRVhUUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTGZsb2F0ICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYTE9BRFRSQU5TUE9TRURFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMZG91YmxlICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYTVVMVFRSQU5TUE9TRUZFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMZmxvYXQgKm0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhNVUxUVFJBTlNQT1NFREVYVFBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xkb3VibGUgKm0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFUEFSQU1FVEVSRkVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRVBBUkFNRVRFUkZWRVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVQQVJBTUVURVJJRVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRVBBUkFNRVRFUklWRVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFSU1BR0UxREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFSU1BR0UyREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRVNVQklNQUdFMURFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFU1VCSU1BR0UyREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYVFVSRUlNQUdFMURFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhUVVJFSU1BR0UyREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhUVVJFU1VCSU1BR0UxREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYVFVSRVNVQklNQUdFMkRFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFRFWFRVUkVJTUFHRUVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFRFWFRVUkVQQVJBTUVURVJGVkVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhUVVJFUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFRFWFRVUkVMRVZFTFBBUkFNRVRFUkZWRVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhUVVJFTEVWRUxQQVJBTUVURVJJVkVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVJTUFHRTNERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFU1VCSU1BR0UzREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYVFVSRVNVQklNQUdFM0RFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYUEFSQU1FVEVSRkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhQQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWFBBUkFNRVRFUklFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWFBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWElNQUdFMURFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhJTUFHRTJERVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWFNVQklNQUdFMURFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWFNVQklNQUdFMkRFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWU1VTFRJVEVYSU1BR0UxREVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWU1VTFRJVEVYSU1BR0UyREVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlNVUxUSVRFWFNVQklNQUdFMURFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWU1VTFRJVEVYU1VCSU1BR0UyREVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTVVMVElURVhJTUFHRUVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1VTFRJVEVYUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTVVMVElURVhQQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTVVMVElURVhMRVZFTFBBUkFNRVRFUkZWRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNVUxUSVRFWExFVkVMUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWElNQUdFM0RFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYU1VCSU1BR0UzREVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZTVVMVElURVhTVUJJTUFHRTNERVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5ETVVMVElURVhUVVJFRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVOQUJMRUNMSUVOVFNUQVRFSU5ERVhFREVYVFBST0MpIChHTGVudW0gYXJyYXksIEdMdWludCBpbmRleCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERJU0FCTEVDTElFTlRTVEFURUlOREVYRURFWFRQUk9DKSAoR0xlbnVtIGFycmF5LCBHTHVpbnQgaW5kZXgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEUE9JTlRFUkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWEVOVkZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYRU5WRlZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhFTlZJRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhFTlZJVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhHRU5ERVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWEdFTkRWRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYR0VORkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWEdFTkZWRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhHRU5JRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWEdFTklWRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1VTFRJVEVYRU5WRlZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTVVMVElURVhFTlZJVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTVVMVElURVhHRU5EVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNVUxUSVRFWEdFTkZWRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTVVMVElURVhHRU5JVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRGTE9BVElOREVYRURWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVERPVUJMRUlOREVYRURWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQT0lOVEVSSU5ERVhFRFZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHZvaWQqICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFRVUkVJTUFHRTNERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpiaXRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFRVUkVJTUFHRTJERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpiaXRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFRVUkVJTUFHRTFERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYVFVSRVNVQklNQUdFM0RFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhUVVJFU1VCSU1BR0UyREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpiaXRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFRVUkVTVUJJTUFHRTFERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTVBSRVNTRURURVhUVVJFSU1BR0VFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxvZCwgR0x2b2lkICppbWcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VETVVMVElURVhJTUFHRTNERVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpiaXRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRE1VTFRJVEVYSU1BR0UyREVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURNVUxUSVRFWElNQUdFMURFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURNVUxUSVRFWFNVQklNQUdFM0RFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURNVUxUSVRFWFNVQklNQUdFMkRFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURNVUxUSVRFWFNVQklNQUdFMURFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpiaXRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NUFJFU1NFRE1VTFRJVEVYSU1BR0VFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxvZCwgR0x2b2lkICppbWcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FRFBST0dSQU1TVFJJTkdFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHZvaWQgKnN0cmluZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVEUFJPR1JBTUxPQ0FMUEFSQU1FVEVSNERFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVEUFJPR1JBTUxPQ0FMUEFSQU1FVEVSNERWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FRFBST0dSQU1MT0NBTFBBUkFNRVRFUjRGRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVEUFJPR1JBTUxPQ0FMUEFSQU1FVEVSNEZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5BTUVEUFJPR1JBTUxPQ0FMUEFSQU1FVEVSRFZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5BTUVEUFJPR1JBTUxPQ0FMUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTkFNRURQUk9HUkFNSVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5BTUVEUFJPR1JBTVNUUklOR0VYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKnN0cmluZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVEUFJPR1JBTUxPQ0FMUEFSQU1FVEVSUzRGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FRFBST0dSQU1MT0NBTFBBUkFNRVRFUkk0SUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURQUk9HUkFNTE9DQUxQQVJBTUVURVJJNElWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FRFBST0dSQU1MT0NBTFBBUkFNRVRFUlNJNElWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FRFBST0dSQU1MT0NBTFBBUkFNRVRFUkk0VUlFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgeiwgR0x1aW50IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FRFBST0dSQU1MT0NBTFBBUkFNRVRFUkk0VUlWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURQUk9HUkFNTE9DQUxQQVJBTUVURVJTSTRVSVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROQU1FRFBST0dSQU1MT0NBTFBBUkFNRVRFUklJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTkFNRURQUk9HUkFNTE9DQUxQQVJBTUVURVJJVUlWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRVBBUkFNRVRFUklJVkVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRVBBUkFNRVRFUklVSVZFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhUVVJFUEFSQU1FVEVSSUlWRVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhUVVJFUEFSQU1FVEVSSVVJVkVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYUEFSQU1FVEVSSUlWRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWFBBUkFNRVRFUklVSVZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNVUxUSVRFWFBBUkFNRVRFUklJVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTVVMVElURVhQQVJBTUVURVJJVUlWRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xRkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJGRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0ZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00RkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIsIEdMZmxvYXQgdjMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFJRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJJRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zSUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSwgR0xpbnQgdjIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRJRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2MiwgR0xpbnQgdjMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yRlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0ZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xSVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0lWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00SVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgzRlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYNEZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJYM0ZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDNYMkZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJYNEZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDRYMkZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDNYNEZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDRYM0ZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFVSUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMlVJRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNVSUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRVSUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIsIEdMdWludCB2Myk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMVVJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJVSVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zVUlWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNFVJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FREJVRkZFUkRBVEFFWFRQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVEQlVGRkVSU1VCREFUQUVYVFBST0MpIChHTHVpbnQgYnVmZmVyLCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgR0x2b2lkKiAoQVBJRU5UUllQIFBGTkdMTUFQTkFNRURCVUZGRVJFWFRQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIGFjY2Vzcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMVU5NQVBOQU1FREJVRkZFUkVYVFBST0MpIChHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgR0x2b2lkKiAoQVBJRU5UUllQIFBGTkdMTUFQTkFNRURCVUZGRVJSQU5HRUVYVFBST0MpIChHTHVpbnQgYnVmZmVyLCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgbGVuZ3RoLCBHTGJpdGZpZWxkIGFjY2Vzcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZMVVNITUFQUEVETkFNRURCVUZGRVJSQU5HRUVYVFBST0MpIChHTHVpbnQgYnVmZmVyLCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgbGVuZ3RoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURDT1BZQlVGRkVSU1VCREFUQUVYVFBST0MpIChHTHVpbnQgcmVhZEJ1ZmZlciwgR0x1aW50IHdyaXRlQnVmZmVyLCBHTGludHB0ciByZWFkT2Zmc2V0LCBHTGludHB0ciB3cml0ZU9mZnNldCwgR0xzaXplaXB0ciBzaXplKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTkFNRURCVUZGRVJQQVJBTUVURVJJVkVYVFBST0MpIChHTHVpbnQgYnVmZmVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROQU1FREJVRkZFUlBPSU5URVJWRVhUUFJPQykgKEdMdWludCBidWZmZXIsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTkFNRURCVUZGRVJTVUJEQVRBRVhUUFJPQykgKEdMdWludCBidWZmZXIsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFQlVGRkVSRVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWEJVRkZFUkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURSRU5ERVJCVUZGRVJTVE9SQUdFRVhUUFJPQykgKEdMdWludCByZW5kZXJidWZmZXIsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROQU1FRFJFTkRFUkJVRkZFUlBBUkFNRVRFUklWRVhUUFJPQykgKEdMdWludCByZW5kZXJidWZmZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIEdMZW51bSAoQVBJRU5UUllQIFBGTkdMQ0hFQ0tOQU1FREZSQU1FQlVGRkVSU1RBVFVTRVhUUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVERlJBTUVCVUZGRVJURVhUVVJFMURFWFRQUk9DKSAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURGUkFNRUJVRkZFUlRFWFRVUkUyREVYVFBST0MpIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FREZSQU1FQlVGRkVSVEVYVFVSRTNERVhUUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVERlJBTUVCVUZGRVJSRU5ERVJCVUZGRVJFWFRQUk9DKSAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5BTUVERlJBTUVCVUZGRVJBVFRBQ0hNRU5UUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VORVJBVEVURVhUVVJFTUlQTUFQRVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VORVJBVEVNVUxUSVRFWE1JUE1BUEVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSRFJBV0JVRkZFUkVYVFBST0MpIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBtb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJEUkFXQlVGRkVSU0VYVFBST0MpIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJSRUFEQlVGRkVSRVhUUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIG1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRGUkFNRUJVRkZFUlBBUkFNRVRFUklWRVhUUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVFWFRQUk9DKSAoR0x1aW50IHJlbmRlcmJ1ZmZlciwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVDT1ZFUkFHRUVYVFBST0MpIChHTHVpbnQgcmVuZGVyYnVmZmVyLCBHTHNpemVpIGNvdmVyYWdlU2FtcGxlcywgR0xzaXplaSBjb2xvclNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FREZSQU1FQlVGRkVSVEVYVFVSRUVYVFBST0MpIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FREZSQU1FQlVGRkVSVEVYVFVSRUxBWUVSRVhUUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgbGF5ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FREZSQU1FQlVGRkVSVEVYVFVSRUZBQ0VFWFRQUk9DKSAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGVudW0gZmFjZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVSRU5ERVJCVUZGRVJFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWFJFTkRFUkJVRkZFUkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMURFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yREVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNERVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNERFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xRFZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJEVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0RWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00RFZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJEVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYM0RWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVg0RFZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJYM0RWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgyWDREVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYM1gyRFZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDNYNERWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVg0WDJEVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYNFgzRFZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF9hcnJheV9iZ3JhCisjZGVmaW5lIEdMX0VYVF92ZXJ0ZXhfYXJyYXlfYmdyYSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zd2l6emxlCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX3N3aXp6bGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZXhwbGljaXRfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfTlZfZXhwbGljaXRfbXVsdGlzYW1wbGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNdWx0aXNhbXBsZWZ2TlYgKEdMZW51bSBwbmFtZSwgR0x1aW50IGluZGV4LCBHTGZsb2F0ICp2YWwpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZU1hc2tJbmRleGVkTlYgKEdMdWludCBpbmRleCwgR0xiaXRmaWVsZCBtYXNrKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhSZW5kZXJidWZmZXJOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNVUxUSVNBTVBMRUZWTlZQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKnZhbCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRU1BU0tJTkRFWEVETlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGJpdGZpZWxkIG1hc2spOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhSRU5ERVJCVUZGRVJOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RyYW5zZm9ybV9mZWVkYmFjazIKKyNkZWZpbmUgR0xfTlZfdHJhbnNmb3JtX2ZlZWRiYWNrMiAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRUcmFuc2Zvcm1GZWVkYmFja05WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVRyYW5zZm9ybUZlZWRiYWNrc05WIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5UcmFuc2Zvcm1GZWVkYmFja3NOViAoR0xzaXplaSBuLCBHTHVpbnQgKmlkcyk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1RyYW5zZm9ybUZlZWRiYWNrTlYgKEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGF1c2VUcmFuc2Zvcm1GZWVkYmFja05WICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXN1bWVUcmFuc2Zvcm1GZWVkYmFja05WICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3VHJhbnNmb3JtRmVlZGJhY2tOViAoR0xlbnVtIG1vZGUsIEdMdWludCBpZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EVFJBTlNGT1JNRkVFREJBQ0tOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVUUkFOU0ZPUk1GRUVEQkFDS1NOVlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOVFJBTlNGT1JNRkVFREJBQ0tTTlZQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmlkcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNUUkFOU0ZPUk1GRUVEQkFDS05WUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBBVVNFVFJBTlNGT1JNRkVFREJBQ0tOVlBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVTVU1FVFJBTlNGT1JNRkVFREJBQ0tOVlBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV1RSQU5TRk9STUZFRURCQUNLTlZQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBpZCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfbWVtaW5mbworI2RlZmluZSBHTF9BVElfbWVtaW5mbyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfcGVyZm9ybWFuY2VfbW9uaXRvcgorI2RlZmluZSBHTF9BTURfcGVyZm9ybWFuY2VfbW9uaXRvciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFBlcmZNb25pdG9yR3JvdXBzQU1EIChHTGludCAqbnVtR3JvdXBzLCBHTHNpemVpIGdyb3Vwc1NpemUsIEdMdWludCAqZ3JvdXBzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1EIChHTHVpbnQgZ3JvdXAsIEdMaW50ICpudW1Db3VudGVycywgR0xpbnQgKm1heEFjdGl2ZUNvdW50ZXJzLCBHTHNpemVpIGNvdW50ZXJTaXplLCBHTHVpbnQgKmNvdW50ZXJzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1EIChHTHVpbnQgZ3JvdXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmdyb3VwU3RyaW5nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQgKEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmNvdW50ZXJTdHJpbmcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQgKEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMZW51bSBwbmFtZSwgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5QZXJmTW9uaXRvcnNBTUQgKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUGVyZk1vbml0b3JzQU1EIChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlbGVjdFBlcmZNb25pdG9yQ291bnRlcnNBTUQgKEdMdWludCBtb25pdG9yLCBHTGJvb2xlYW4gZW5hYmxlLCBHTHVpbnQgZ3JvdXAsIEdMaW50IG51bUNvdW50ZXJzLCBHTHVpbnQgKmNvdW50ZXJMaXN0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpblBlcmZNb25pdG9yQU1EIChHTHVpbnQgbW9uaXRvcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kUGVyZk1vbml0b3JBTUQgKEdMdWludCBtb25pdG9yKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJEYXRhQU1EIChHTHVpbnQgbW9uaXRvciwgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGRhdGFTaXplLCBHTHVpbnQgKmRhdGEsIEdMaW50ICpieXRlc1dyaXR0ZW4pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUEVSRk1PTklUT1JHUk9VUFNBTURQUk9DKSAoR0xpbnQgKm51bUdyb3VwcywgR0xzaXplaSBncm91cHNTaXplLCBHTHVpbnQgKmdyb3Vwcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SQ09VTlRFUlNBTURQUk9DKSAoR0x1aW50IGdyb3VwLCBHTGludCAqbnVtQ291bnRlcnMsIEdMaW50ICptYXhBY3RpdmVDb3VudGVycywgR0xzaXplaSBjb3VudGVyU2l6ZSwgR0x1aW50ICpjb3VudGVycyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SR1JPVVBTVFJJTkdBTURQUk9DKSAoR0x1aW50IGdyb3VwLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpncm91cFN0cmluZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SQ09VTlRFUlNUUklOR0FNRFBST0MpIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpjb3VudGVyU3RyaW5nKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUEVSRk1PTklUT1JDT1VOVEVSSU5GT0FNRFBST0MpIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlBFUkZNT05JVE9SU0FNRFBST0MpIChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVQRVJGTU9OSVRPUlNBTURQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKm1vbml0b3JzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VMRUNUUEVSRk1PTklUT1JDT1VOVEVSU0FNRFBST0MpIChHTHVpbnQgbW9uaXRvciwgR0xib29sZWFuIGVuYWJsZSwgR0x1aW50IGdyb3VwLCBHTGludCBudW1Db3VudGVycywgR0x1aW50ICpjb3VudGVyTGlzdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOUEVSRk1PTklUT1JBTURQUk9DKSAoR0x1aW50IG1vbml0b3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRQRVJGTU9OSVRPUkFNRFBST0MpIChHTHVpbnQgbW9uaXRvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SQ09VTlRFUkRBVEFBTURQUk9DKSAoR0x1aW50IG1vbml0b3IsIEdMZW51bSBwbmFtZSwgR0xzaXplaSBkYXRhU2l6ZSwgR0x1aW50ICpkYXRhLCBHTGludCAqYnl0ZXNXcml0dGVuKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF90ZXh0dXJlX3RleHR1cmU0CisjZGVmaW5lIEdMX0FNRF90ZXh0dXJlX3RleHR1cmU0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF92ZXJ0ZXhfc2hhZGVyX3Rlc3NlbGF0b3IKKyNkZWZpbmUgR0xfQU1EX3ZlcnRleF9zaGFkZXJfdGVzc2VsYXRvciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRlc3NlbGxhdGlvbkZhY3RvckFNRCAoR0xmbG9hdCBmYWN0b3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRlc3NlbGxhdGlvbk1vZGVBTUQgKEdMZW51bSBtb2RlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFU1NFTExBVElPTkZBQ1RPUkFNRFBST0MpIChHTGZsb2F0IGZhY3Rvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFU1NFTExBVElPTk1PREVBTURQUk9DKSAoR0xlbnVtIG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3Byb3Zva2luZ192ZXJ0ZXgKKyNkZWZpbmUgR0xfRVhUX3Byb3Zva2luZ192ZXJ0ZXggMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm92b2tpbmdWZXJ0ZXhFWFQgKEdMZW51bSBtb2RlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST1ZPS0lOR1ZFUlRFWEVYVFBST0MpIChHTGVudW0gbW9kZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zbm9ybQorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9zbm9ybSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfZHJhd19idWZmZXJzX2JsZW5kCisjZGVmaW5lIEdMX0FNRF9kcmF3X2J1ZmZlcnNfYmxlbmQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEZ1bmNJbmRleGVkQU1EIChHTHVpbnQgYnVmLCBHTGVudW0gc3JjLCBHTGVudW0gZHN0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEZ1bmNTZXBhcmF0ZUluZGV4ZWRBTUQgKEdMdWludCBidWYsIEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uSW5kZXhlZEFNRCAoR0x1aW50IGJ1ZiwgR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZUluZGV4ZWRBTUQgKEdMdWludCBidWYsIEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ0lOREVYRURBTURQUk9DKSAoR0x1aW50IGJ1ZiwgR0xlbnVtIHNyYywgR0xlbnVtIGRzdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ1NFUEFSQVRFSU5ERVhFREFNRFBST0MpIChHTHVpbnQgYnVmLCBHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05JTkRFWEVEQU1EUFJPQykgKEdMdWludCBidWYsIEdMZW51bSBtb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTlNFUEFSQVRFSU5ERVhFREFNRFBST0MpIChHTHVpbnQgYnVmLCBHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV90ZXh0dXJlX3JhbmdlCisjZGVmaW5lIEdMX0FQUExFX3RleHR1cmVfcmFuZ2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlUmFuZ2VBUFBMRSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVyUG9pbnRlcnZBUFBMRSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRVJBTkdFQVBQTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFRFWFBBUkFNRVRFUlBPSU5URVJWQVBQTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfZmxvYXRfcGl4ZWxzCisjZGVmaW5lIEdMX0FQUExFX2Zsb2F0X3BpeGVscyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV92ZXJ0ZXhfcHJvZ3JhbV9ldmFsdWF0b3JzCisjZGVmaW5lIEdMX0FQUExFX3ZlcnRleF9wcm9ncmFtX2V2YWx1YXRvcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBUFBMRSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBUFBMRSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNWZXJ0ZXhBdHRyaWJFbmFibGVkQVBQTEUgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXBWZXJ0ZXhBdHRyaWIxZEFQUExFIChHTHVpbnQgaW5kZXgsIEdMdWludCBzaXplLCBHTGRvdWJsZSB1MSwgR0xkb3VibGUgdTIsIEdMaW50IHN0cmlkZSwgR0xpbnQgb3JkZXIsIGNvbnN0IEdMZG91YmxlICpwb2ludHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hcFZlcnRleEF0dHJpYjFmQVBQTEUgKEdMdWludCBpbmRleCwgR0x1aW50IHNpemUsIEdMZmxvYXQgdTEsIEdMZmxvYXQgdTIsIEdMaW50IHN0cmlkZSwgR0xpbnQgb3JkZXIsIGNvbnN0IEdMZmxvYXQgKnBvaW50cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWFwVmVydGV4QXR0cmliMmRBUFBMRSAoR0x1aW50IGluZGV4LCBHTHVpbnQgc2l6ZSwgR0xkb3VibGUgdTEsIEdMZG91YmxlIHUyLCBHTGludCB1c3RyaWRlLCBHTGludCB1b3JkZXIsIEdMZG91YmxlIHYxLCBHTGRvdWJsZSB2MiwgR0xpbnQgdnN0cmlkZSwgR0xpbnQgdm9yZGVyLCBjb25zdCBHTGRvdWJsZSAqcG9pbnRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXBWZXJ0ZXhBdHRyaWIyZkFQUExFIChHTHVpbnQgaW5kZXgsIEdMdWludCBzaXplLCBHTGZsb2F0IHUxLCBHTGZsb2F0IHUyLCBHTGludCB1c3RyaWRlLCBHTGludCB1b3JkZXIsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIsIEdMaW50IHZzdHJpZGUsIEdMaW50IHZvcmRlciwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVOQUJMRVZFUlRFWEFUVFJJQkFQUExFUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRElTQUJMRVZFUlRFWEFUVFJJQkFQUExFUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1ZFUlRFWEFUVFJJQkVOQUJMRURBUFBMRVBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BUFZFUlRFWEFUVFJJQjFEQVBQTEVQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgc2l6ZSwgR0xkb3VibGUgdTEsIEdMZG91YmxlIHUyLCBHTGludCBzdHJpZGUsIEdMaW50IG9yZGVyLCBjb25zdCBHTGRvdWJsZSAqcG9pbnRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFQVkVSVEVYQVRUUklCMUZBUFBMRVBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWludCBzaXplLCBHTGZsb2F0IHUxLCBHTGZsb2F0IHUyLCBHTGludCBzdHJpZGUsIEdMaW50IG9yZGVyLCBjb25zdCBHTGZsb2F0ICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVBWRVJURVhBVFRSSUIyREFQUExFUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IHNpemUsIEdMZG91YmxlIHUxLCBHTGRvdWJsZSB1MiwgR0xpbnQgdXN0cmlkZSwgR0xpbnQgdW9yZGVyLCBHTGRvdWJsZSB2MSwgR0xkb3VibGUgdjIsIEdMaW50IHZzdHJpZGUsIEdMaW50IHZvcmRlciwgY29uc3QgR0xkb3VibGUgKnBvaW50cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BUFZFUlRFWEFUVFJJQjJGQVBQTEVQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgc2l6ZSwgR0xmbG9hdCB1MSwgR0xmbG9hdCB1MiwgR0xpbnQgdXN0cmlkZSwgR0xpbnQgdW9yZGVyLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGludCB2c3RyaWRlLCBHTGludCB2b3JkZXIsIGNvbnN0IEdMZmxvYXQgKnBvaW50cyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9hdXhfZGVwdGhfc3RlbmNpbAorI2RlZmluZSBHTF9BUFBMRV9hdXhfZGVwdGhfc3RlbmNpbCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9vYmplY3RfcHVyZ2VhYmxlCisjZGVmaW5lIEdMX0FQUExFX29iamVjdF9wdXJnZWFibGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMZW51bSBBUElFTlRSWSBnbE9iamVjdFB1cmdlYWJsZUFQUExFIChHTGVudW0gb2JqZWN0VHlwZSwgR0x1aW50IG5hbWUsIEdMZW51bSBvcHRpb24pOworR0xBUEkgR0xlbnVtIEFQSUVOVFJZIGdsT2JqZWN0VW5wdXJnZWFibGVBUFBMRSAoR0xlbnVtIG9iamVjdFR5cGUsIEdMdWludCBuYW1lLCBHTGVudW0gb3B0aW9uKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPYmplY3RQYXJhbWV0ZXJpdkFQUExFIChHTGVudW0gb2JqZWN0VHlwZSwgR0x1aW50IG5hbWUsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTGVudW0gKEFQSUVOVFJZUCBQRk5HTE9CSkVDVFBVUkdFQUJMRUFQUExFUFJPQykgKEdMZW51bSBvYmplY3RUeXBlLCBHTHVpbnQgbmFtZSwgR0xlbnVtIG9wdGlvbik7Cit0eXBlZGVmIEdMZW51bSAoQVBJRU5UUllQIFBGTkdMT0JKRUNUVU5QVVJHRUFCTEVBUFBMRVBST0MpIChHTGVudW0gb2JqZWN0VHlwZSwgR0x1aW50IG5hbWUsIEdMZW51bSBvcHRpb24pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRPQkpFQ1RQQVJBTUVURVJJVkFQUExFUFJPQykgKEdMZW51bSBvYmplY3RUeXBlLCBHTHVpbnQgbmFtZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3Jvd19ieXRlcworI2RlZmluZSBHTF9BUFBMRV9yb3dfYnl0ZXMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfcmdiXzQyMgorI2RlZmluZSBHTF9BUFBMRV9yZ2JfNDIyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZpZGVvX2NhcHR1cmUKKyNkZWZpbmUgR0xfTlZfdmlkZW9fY2FwdHVyZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJlZ2luVmlkZW9DYXB0dXJlTlYgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRWaWRlb0NhcHR1cmVTdHJlYW1CdWZmZXJOViAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50IHN0cmVhbSwgR0xlbnVtIGZyYW1lX3JlZ2lvbiwgR0xpbnRwdHJBUkIgb2Zmc2V0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVmlkZW9DYXB0dXJlU3RyZWFtVGV4dHVyZU5WIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTHVpbnQgc3RyZWFtLCBHTGVudW0gZnJhbWVfcmVnaW9uLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kVmlkZW9DYXB0dXJlTlYgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZpZGVvQ2FwdHVyZWl2TlYgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmlkZW9DYXB0dXJlU3RyZWFtaXZOViAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50IHN0cmVhbSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWaWRlb0NhcHR1cmVTdHJlYW1mdk5WIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTHVpbnQgc3RyZWFtLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmlkZW9DYXB0dXJlU3RyZWFtZHZOViAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50IHN0cmVhbSwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK0dMQVBJIEdMZW51bSBBUElFTlRSWSBnbFZpZGVvQ2FwdHVyZU5WIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTHVpbnQgKnNlcXVlbmNlX251bSwgR0x1aW50NjRFWFQgKmNhcHR1cmVfdGltZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmlkZW9DYXB0dXJlU3RyZWFtUGFyYW1ldGVyaXZOViAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50IHN0cmVhbSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWaWRlb0NhcHR1cmVTdHJlYW1QYXJhbWV0ZXJmdk5WIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTHVpbnQgc3RyZWFtLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmlkZW9DYXB0dXJlU3RyZWFtUGFyYW1ldGVyZHZOViAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50IHN0cmVhbSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGRvdWJsZSAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOVklERU9DQVBUVVJFTlZQUk9DKSAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRWSURFT0NBUFRVUkVTVFJFQU1CVUZGRVJOVlBST0MpIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTHVpbnQgc3RyZWFtLCBHTGVudW0gZnJhbWVfcmVnaW9uLCBHTGludHB0ckFSQiBvZmZzZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EVklERU9DQVBUVVJFU1RSRUFNVEVYVFVSRU5WUFJPQykgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QsIEdMdWludCBzdHJlYW0sIEdMZW51bSBmcmFtZV9yZWdpb24sIEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5EVklERU9DQVBUVVJFTlZQUk9DKSAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZJREVPQ0FQVFVSRUlWTlZQUk9DKSAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVklERU9DQVBUVVJFU1RSRUFNSVZOVlBST0MpIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTHVpbnQgc3RyZWFtLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWSURFT0NBUFRVUkVTVFJFQU1GVk5WUFJPQykgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QsIEdMdWludCBzdHJlYW0sIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVklERU9DQVBUVVJFU1RSRUFNRFZOVlBST0MpIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTHVpbnQgc3RyZWFtLCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiBHTGVudW0gKEFQSUVOVFJZUCBQRk5HTFZJREVPQ0FQVFVSRU5WUFJPQykgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QsIEdMdWludCAqc2VxdWVuY2VfbnVtLCBHTHVpbnQ2NEVYVCAqY2FwdHVyZV90aW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVklERU9DQVBUVVJFU1RSRUFNUEFSQU1FVEVSSVZOVlBST0MpIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTHVpbnQgc3RyZWFtLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWSURFT0NBUFRVUkVTVFJFQU1QQVJBTUVURVJGVk5WUFJPQykgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QsIEdMdWludCBzdHJlYW0sIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVklERU9DQVBUVVJFU1RSRUFNUEFSQU1FVEVSRFZOVlBST0MpIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTHVpbnQgc3RyZWFtLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZG91YmxlICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfY29weV9pbWFnZQorI2RlZmluZSBHTF9OVl9jb3B5X2ltYWdlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUltYWdlU3ViRGF0YU5WIChHTHVpbnQgc3JjTmFtZSwgR0xlbnVtIHNyY1RhcmdldCwgR0xpbnQgc3JjTGV2ZWwsIEdMaW50IHNyY1gsIEdMaW50IHNyY1ksIEdMaW50IHNyY1osIEdMdWludCBkc3ROYW1lLCBHTGVudW0gZHN0VGFyZ2V0LCBHTGludCBkc3RMZXZlbCwgR0xpbnQgZHN0WCwgR0xpbnQgZHN0WSwgR0xpbnQgZHN0WiwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUlNQUdFU1VCREFUQU5WUFJPQykgKEdMdWludCBzcmNOYW1lLCBHTGVudW0gc3JjVGFyZ2V0LCBHTGludCBzcmNMZXZlbCwgR0xpbnQgc3JjWCwgR0xpbnQgc3JjWSwgR0xpbnQgc3JjWiwgR0x1aW50IGRzdE5hbWUsIEdMZW51bSBkc3RUYXJnZXQsIEdMaW50IGRzdExldmVsLCBHTGludCBkc3RYLCBHTGludCBkc3RZLCBHTGludCBkc3RaLCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMKKyNkZWZpbmUgR0xfRVhUX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVXNlU2hhZGVyUHJvZ3JhbUVYVCAoR0xlbnVtIHR5cGUsIEdMdWludCBwcm9ncmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBY3RpdmVQcm9ncmFtRVhUIChHTHVpbnQgcHJvZ3JhbSk7CitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xDcmVhdGVTaGFkZXJQcm9ncmFtRVhUIChHTGVudW0gdHlwZSwgY29uc3QgR0xjaGFyICpzdHJpbmcpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVVNFU0hBREVSUFJPR1JBTUVYVFBST0MpIChHTGVudW0gdHlwZSwgR0x1aW50IHByb2dyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBQ1RJVkVQUk9HUkFNRVhUUFJPQykgKEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xDUkVBVEVTSEFERVJQUk9HUkFNRVhUUFJPQykgKEdMZW51bSB0eXBlLCBjb25zdCBHTGNoYXIgKnN0cmluZyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wYXJhbWV0ZXJfYnVmZmVyX29iamVjdDIKKyNkZWZpbmUgR0xfTlZfcGFyYW1ldGVyX2J1ZmZlcl9vYmplY3QyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3NoYWRlcl9idWZmZXJfbG9hZAorI2RlZmluZSBHTF9OVl9zaGFkZXJfYnVmZmVyX2xvYWQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYWtlQnVmZmVyUmVzaWRlbnROViAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2Vzcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWFrZUJ1ZmZlck5vblJlc2lkZW50TlYgKEdMZW51bSB0YXJnZXQpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNCdWZmZXJSZXNpZGVudE5WIChHTGVudW0gdGFyZ2V0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYWtlTmFtZWRCdWZmZXJSZXNpZGVudE5WIChHTHVpbnQgYnVmZmVyLCBHTGVudW0gYWNjZXNzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYWtlTmFtZWRCdWZmZXJOb25SZXNpZGVudE5WIChHTHVpbnQgYnVmZmVyKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzTmFtZWRCdWZmZXJSZXNpZGVudE5WIChHTHVpbnQgYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJ1aTY0dk5WIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdWludDY0RVhUICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE5hbWVkQnVmZmVyUGFyYW1ldGVydWk2NHZOViAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTHVpbnQ2NEVYVCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnRlZ2VydWk2NHZOViAoR0xlbnVtIHZhbHVlLCBHTHVpbnQ2NEVYVCAqcmVzdWx0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtdWk2NE5WIChHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm11aTY0dk5WIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50NjRFWFQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtdWk2NHZOViAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybXVpNjROViAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCB2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm11aTY0dk5WIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQUtFQlVGRkVSUkVTSURFTlROVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFLRUJVRkZFUk5PTlJFU0lERU5UTlZQUk9DKSAoR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNCVUZGRVJSRVNJREVOVE5WUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQUtFTkFNRURCVUZGRVJSRVNJREVOVE5WUFJPQykgKEdMdWludCBidWZmZXIsIEdMZW51bSBhY2Nlc3MpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQUtFTkFNRURCVUZGRVJOT05SRVNJREVOVE5WUFJPQykgKEdMdWludCBidWZmZXIpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTTkFNRURCVUZGRVJSRVNJREVOVE5WUFJPQykgKEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQQVJBTUVURVJVSTY0Vk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x1aW50NjRFWFQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5BTUVEQlVGRkVSUEFSQU1FVEVSVUk2NFZOVlBST0MpIChHTHVpbnQgYnVmZmVyLCBHTGVudW0gcG5hbWUsIEdMdWludDY0RVhUICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTlRFR0VSVUk2NFZOVlBST0MpIChHTGVudW0gdmFsdWUsIEdMdWludDY0RVhUICpyZXN1bHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNVUk2NE5WUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCB2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1VSTY0Vk5WUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQ2NEVYVCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNVUk2NFZOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludDY0RVhUICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STVVJNjROVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludDY0RVhUIHZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1VSTY0Vk5WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50NjRFWFQgKnZhbHVlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9idWZmZXJfdW5pZmllZF9tZW1vcnkKKyNkZWZpbmUgR0xfTlZfdmVydGV4X2J1ZmZlcl91bmlmaWVkX21lbW9yeSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJ1ZmZlckFkZHJlc3NSYW5nZU5WIChHTGVudW0gcG5hbWUsIEdMdWludCBpbmRleCwgR0x1aW50NjRFWFQgYWRkcmVzcywgR0xzaXplaXB0ciBsZW5ndGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEZvcm1hdE5WIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbEZvcm1hdE5WIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yRm9ybWF0TlYgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW5kZXhGb3JtYXROViAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZEZvcm1hdE5WIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVkZ2VGbGFnRm9ybWF0TlYgKEdMc2l6ZWkgc3RyaWRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvckZvcm1hdE5WIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkRm9ybWF0TlYgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliRm9ybWF0TlYgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSUZvcm1hdE5WIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW50ZWdlcnVpNjRpX3ZOViAoR0xlbnVtIHZhbHVlLCBHTHVpbnQgaW5kZXgsIEdMdWludDY0RVhUICpyZXN1bHQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQlVGRkVSQUREUkVTU1JBTkdFTlZQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTHVpbnQgaW5kZXgsIEdMdWludDY0RVhUIGFkZHJlc3MsIEdMc2l6ZWlwdHIgbGVuZ3RoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYRk9STUFUTlZQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMRk9STUFUTlZQUk9DKSAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JGT1JNQVROVlBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTkRFWEZPUk1BVE5WUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JERk9STUFUTlZQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRURHRUZMQUdGT1JNQVROVlBST0MpIChHTHNpemVpIHN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SRk9STUFUTlZQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRGT1JNQVROVlBST0MpIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJGT1JNQVROVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJRk9STUFUTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTlRFR0VSVUk2NElfVk5WUFJPQykgKEdMZW51bSB2YWx1ZSwgR0x1aW50IGluZGV4LCBHTHVpbnQ2NEVYVCAqcmVzdWx0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfYmFycmllcgorI2RlZmluZSBHTF9OVl90ZXh0dXJlX2JhcnJpZXIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlQmFycmllck5WICh2b2lkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVCQVJSSUVSTlZQUk9DKSAodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0CisjZGVmaW5lIEdMX0FNRF9zaGFkZXJfc3RlbmNpbF9leHBvcnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX3NlYW1sZXNzX2N1YmVtYXBfcGVyX3RleHR1cmUKKyNkZWZpbmUgR0xfQU1EX3NlYW1sZXNzX2N1YmVtYXBfcGVyX3RleHR1cmUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX2NvbnNlcnZhdGl2ZV9kZXB0aAorI2RlZmluZSBHTF9BTURfY29uc2VydmF0aXZlX2RlcHRoIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZQorI2RlZmluZSBHTF9FWFRfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kSW1hZ2VUZXh0dXJlRVhUIChHTHVpbnQgaW5kZXgsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xib29sZWFuIGxheWVyZWQsIEdMaW50IGxheWVyLCBHTGVudW0gYWNjZXNzLCBHTGludCBmb3JtYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1lbW9yeUJhcnJpZXJFWFQgKEdMYml0ZmllbGQgYmFycmllcnMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORElNQUdFVEVYVFVSRUVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xib29sZWFuIGxheWVyZWQsIEdMaW50IGxheWVyLCBHTGVudW0gYWNjZXNzLCBHTGludCBmb3JtYXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNRU1PUllCQVJSSUVSRVhUUFJPQykgKEdMYml0ZmllbGQgYmFycmllcnMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF9hdHRyaWJfNjRiaXQKKyNkZWZpbmUgR0xfRVhUX3ZlcnRleF9hdHRyaWJfNjRiaXQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMMWRFWFQgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDJkRVhUIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwzZEVYVCAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMNGRFWFQgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDFkdkVYVCAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDJkdkVYVCAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDNkdkVYVCAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDRkdkVYVCAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTFBvaW50ZXJFWFQgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYkxkdkVYVCAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEFycmF5VmVydGV4QXR0cmliTE9mZnNldEVYVCAoR0x1aW50IHZhb2JqLCBHTHVpbnQgYnVmZmVyLCBHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnRwdHIgb2Zmc2V0KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkwxREVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMMkRFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDNERVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkw0REVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMMURWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMMkRWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMM0RWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMNERWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMUE9JTlRFUkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCTERWRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVJSQVlWRVJURVhBVFRSSUJMT0ZGU0VURVhUUFJPQykgKEdMdWludCB2YW9iaiwgR0x1aW50IGJ1ZmZlciwgR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50cHRyIG9mZnNldCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9ncHVfcHJvZ3JhbTUKKyNkZWZpbmUgR0xfTlZfZ3B1X3Byb2dyYW01IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVN1YnJvdXRpbmVQYXJhbWV0ZXJzdWl2TlYgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtU3Vicm91dGluZVBhcmFtZXRlcnVpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCAqcGFyYW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVNVQlJPVVRJTkVQQVJBTUVURVJTVUlWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNU1VCUk9VVElORVBBUkFNRVRFUlVJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50ICpwYXJhbSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9ncHVfc2hhZGVyNQorI2RlZmluZSBHTF9OVl9ncHVfc2hhZGVyNSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xaTY0TlYgKEdMaW50IGxvY2F0aW9uLCBHTGludDY0RVhUIHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0yaTY0TlYgKEdMaW50IGxvY2F0aW9uLCBHTGludDY0RVhUIHgsIEdMaW50NjRFWFQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNpNjROViAoR0xpbnQgbG9jYXRpb24sIEdMaW50NjRFWFQgeCwgR0xpbnQ2NEVYVCB5LCBHTGludDY0RVhUIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00aTY0TlYgKEdMaW50IGxvY2F0aW9uLCBHTGludDY0RVhUIHgsIEdMaW50NjRFWFQgeSwgR0xpbnQ2NEVYVCB6LCBHTGludDY0RVhUIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xaTY0dk5WIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0yaTY0dk5WIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0zaTY0dk5WIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00aTY0dk5WIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xdWk2NE5WIChHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJ1aTY0TlYgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM3VpNjROViAoR0xpbnQgbG9jYXRpb24sIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHksIEdMdWludDY0RVhUIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00dWk2NE5WIChHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgeCwgR0x1aW50NjRFWFQgeSwgR0x1aW50NjRFWFQgeiwgR0x1aW50NjRFWFQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTF1aTY0dk5WIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50NjRFWFQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMnVpNjR2TlYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQ2NEVYVCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0zdWk2NHZOViAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTR1aTY0dk5WIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50NjRFWFQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtaTY0dk5WIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50NjRFWFQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xaTY0TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJpNjROViAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludDY0RVhUIHgsIEdMaW50NjRFWFQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zaTY0TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHksIEdMaW50NjRFWFQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00aTY0TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHksIEdMaW50NjRFWFQgeiwgR0xpbnQ2NEVYVCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTFpNjR2TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMmk2NHZOViAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludDY0RVhUICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zaTY0dk5WIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTRpNjR2TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMXVpNjROViAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJ1aTY0TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgeCwgR0x1aW50NjRFWFQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zdWk2NE5WIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHksIEdMdWludDY0RVhUIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNHVpNjROViAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5LCBHTHVpbnQ2NEVYVCB6LCBHTHVpbnQ2NEVYVCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTF1aTY0dk5WIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0ydWk2NHZOViAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQ2NEVYVCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM3VpNjR2TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50NjRFWFQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTR1aTY0dk5WIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUk2NE5WUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludDY0RVhUIHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMkk2NE5WUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludDY0RVhUIHgsIEdMaW50NjRFWFQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zSTY0TlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50NjRFWFQgeCwgR0xpbnQ2NEVYVCB5LCBHTGludDY0RVhUIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNEk2NE5WUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludDY0RVhUIHgsIEdMaW50NjRFWFQgeSwgR0xpbnQ2NEVYVCB6LCBHTGludDY0RVhUIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUk2NFZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMkk2NFZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0k2NFZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNEk2NFZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMVVJNjROVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0yVUk2NE5WUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNVSTY0TlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHksIEdMdWludDY0RVhUIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNFVJNjROVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgeCwgR0x1aW50NjRFWFQgeSwgR0x1aW50NjRFWFQgeiwgR0x1aW50NjRFWFQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xVUk2NFZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50NjRFWFQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJVSTY0Vk5WUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQ2NEVYVCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM1VJNjRWTlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00VUk2NFZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50NjRFWFQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STUk2NFZOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50NjRFWFQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMUk2NE5WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0ySTY0TlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludDY0RVhUIHgsIEdMaW50NjRFWFQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0k2NE5WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHksIEdMaW50NjRFWFQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNEk2NE5WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHksIEdMaW50NjRFWFQgeiwgR0xpbnQ2NEVYVCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xSTY0Vk5WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJJNjRWTlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludDY0RVhUICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0k2NFZOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00STY0Vk5WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFVSTY0TlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yVUk2NE5WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgeCwgR0x1aW50NjRFWFQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM1VJNjROVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHksIEdMdWludDY0RVhUIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRVSTY0TlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5LCBHTHVpbnQ2NEVYVCB6LCBHTHVpbnQ2NEVYVCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xVUk2NFZOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMlVJNjRWTlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQ2NEVYVCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNVSTY0Vk5WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50NjRFWFQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00VUk2NFZOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9zaGFkZXJfYnVmZmVyX3N0b3JlCisjZGVmaW5lIEdMX05WX3NoYWRlcl9idWZmZXJfc3RvcmUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGVzc2VsbGF0aW9uX3Byb2dyYW01CisjZGVmaW5lIEdMX05WX3Rlc3NlbGxhdGlvbl9wcm9ncmFtNSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfYXR0cmliX2ludGVnZXJfNjRiaXQKKyNkZWZpbmUgR0xfTlZfdmVydGV4X2F0dHJpYl9pbnRlZ2VyXzY0Yml0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDFpNjROViAoR0x1aW50IGluZGV4LCBHTGludDY0RVhUIHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwyaTY0TlYgKEdMdWludCBpbmRleCwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwzaTY0TlYgKEdMdWludCBpbmRleCwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHksIEdMaW50NjRFWFQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDRpNjROViAoR0x1aW50IGluZGV4LCBHTGludDY0RVhUIHgsIEdMaW50NjRFWFQgeSwgR0xpbnQ2NEVYVCB6LCBHTGludDY0RVhUIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwxaTY0dk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50NjRFWFQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwyaTY0dk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50NjRFWFQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwzaTY0dk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50NjRFWFQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkw0aTY0dk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50NjRFWFQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwxdWk2NE5WIChHTHVpbnQgaW5kZXgsIEdMdWludDY0RVhUIHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwydWk2NE5WIChHTHVpbnQgaW5kZXgsIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwzdWk2NE5WIChHTHVpbnQgaW5kZXgsIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHksIEdMdWludDY0RVhUIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkw0dWk2NE5WIChHTHVpbnQgaW5kZXgsIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHksIEdMdWludDY0RVhUIHosIEdMdWludDY0RVhUIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwxdWk2NHZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQ2NEVYVCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDJ1aTY0dk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludDY0RVhUICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMM3VpNjR2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50NjRFWFQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkw0dWk2NHZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQ2NEVYVCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliTGk2NHZOViAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50NjRFWFQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliTHVpNjR2TlYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQ2NEVYVCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMRm9ybWF0TlYgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkwxSTY0TlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludDY0RVhUIHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMMkk2NE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMM0k2NE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHksIEdMaW50NjRFWFQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkw0STY0TlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludDY0RVhUIHgsIEdMaW50NjRFWFQgeSwgR0xpbnQ2NEVYVCB6LCBHTGludDY0RVhUIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMMUk2NFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50NjRFWFQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMMkk2NFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50NjRFWFQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMM0k2NFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50NjRFWFQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMNEk2NFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50NjRFWFQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMMVVJNjROVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWludDY0RVhUIHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMMlVJNjROVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMM1VJNjROVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHksIEdMdWludDY0RVhUIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMNFVJNjROVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHksIEdMdWludDY0RVhUIHosIEdMdWludDY0RVhUIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMMVVJNjRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQ2NEVYVCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkwyVUk2NFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludDY0RVhUICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDNVSTY0Vk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50NjRFWFQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMNFVJNjRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQ2NEVYVCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkxJNjRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50NjRFWFQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkxVSTY0Vk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQ2NEVYVCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTEZPUk1BVE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX211bHRpc2FtcGxlX2NvdmVyYWdlCisjZGVmaW5lIEdMX05WX211bHRpc2FtcGxlX2NvdmVyYWdlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF9uYW1lX2dlbl9kZWxldGUKKyNkZWZpbmUgR0xfQU1EX25hbWVfZ2VuX2RlbGV0ZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbk5hbWVzQU1EIChHTGVudW0gaWRlbnRpZmllciwgR0x1aW50IG51bSwgR0x1aW50ICpuYW1lcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlTmFtZXNBTUQgKEdMZW51bSBpZGVudGlmaWVyLCBHTHVpbnQgbnVtLCBjb25zdCBHTHVpbnQgKm5hbWVzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzTmFtZUFNRCAoR0xlbnVtIGlkZW50aWZpZXIsIEdMdWludCBuYW1lKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTk5BTUVTQU1EUFJPQykgKEdMZW51bSBpZGVudGlmaWVyLCBHTHVpbnQgbnVtLCBHTHVpbnQgKm5hbWVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFTkFNRVNBTURQUk9DKSAoR0xlbnVtIGlkZW50aWZpZXIsIEdMdWludCBudW0sIGNvbnN0IEdMdWludCAqbmFtZXMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTTkFNRUFNRFBST0MpIChHTGVudW0gaWRlbnRpZmllciwgR0x1aW50IG5hbWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX2RlYnVnX291dHB1dAorI2RlZmluZSBHTF9BTURfZGVidWdfb3V0cHV0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVidWdNZXNzYWdlRW5hYmxlQU1EIChHTGVudW0gY2F0ZWdvcnksIEdMZW51bSBzZXZlcml0eSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICppZHMsIEdMYm9vbGVhbiBlbmFibGVkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWJ1Z01lc3NhZ2VJbnNlcnRBTUQgKEdMZW51bSBjYXRlZ29yeSwgR0xlbnVtIHNldmVyaXR5LCBHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKmJ1Zik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVidWdNZXNzYWdlQ2FsbGJhY2tBTUQgKEdMREVCVUdQUk9DQU1EIGNhbGxiYWNrLCBHTHZvaWQgKnVzZXJQYXJhbSk7CitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xHZXREZWJ1Z01lc3NhZ2VMb2dBTUQgKEdMdWludCBjb3VudCwgR0xzaXplaSBidWZzaXplLCBHTGVudW0gKmNhdGVnb3JpZXMsIEdMdWludCAqc2V2ZXJpdGllcywgR0x1aW50ICppZHMsIEdMc2l6ZWkgKmxlbmd0aHMsIEdMY2hhciAqbWVzc2FnZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUJVR01FU1NBR0VFTkFCTEVBTURQUk9DKSAoR0xlbnVtIGNhdGVnb3J5LCBHTGVudW0gc2V2ZXJpdHksIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqaWRzLCBHTGJvb2xlYW4gZW5hYmxlZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFQlVHTUVTU0FHRUlOU0VSVEFNRFBST0MpIChHTGVudW0gY2F0ZWdvcnksIEdMZW51bSBzZXZlcml0eSwgR0x1aW50IGlkLCBHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICpidWYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUJVR01FU1NBR0VDQUxMQkFDS0FNRFBST0MpIChHTERFQlVHUFJPQ0FNRCBjYWxsYmFjaywgR0x2b2lkICp1c2VyUGFyYW0pOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVERFQlVHTUVTU0FHRUxPR0FNRFBST0MpIChHTHVpbnQgY291bnQsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xlbnVtICpjYXRlZ29yaWVzLCBHTHVpbnQgKnNldmVyaXRpZXMsIEdMdWludCAqaWRzLCBHTHNpemVpICpsZW5ndGhzLCBHTGNoYXIgKm1lc3NhZ2UpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmRwYXVfaW50ZXJvcAorI2RlZmluZSBHTF9OVl92ZHBhdV9pbnRlcm9wIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVkRQQVVJbml0TlYgKGNvbnN0IEdMdm9pZCAqdmRwRGV2aWNlLCBjb25zdCBHTHZvaWQgKmdldFByb2NBZGRyZXNzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWRFBBVUZpbmlOViAodm9pZCk7CitHTEFQSSBHTHZkcGF1U3VyZmFjZU5WIEFQSUVOVFJZIGdsVkRQQVVSZWdpc3RlclZpZGVvU3VyZmFjZU5WIChHTHZvaWQgKnZkcFN1cmZhY2UsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbnVtVGV4dHVyZU5hbWVzLCBjb25zdCBHTHVpbnQgKnRleHR1cmVOYW1lcyk7CitHTEFQSSBHTHZkcGF1U3VyZmFjZU5WIEFQSUVOVFJZIGdsVkRQQVVSZWdpc3Rlck91dHB1dFN1cmZhY2VOViAoR0x2b2lkICp2ZHBTdXJmYWNlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bVRleHR1cmVOYW1lcywgY29uc3QgR0x1aW50ICp0ZXh0dXJlTmFtZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZEUEFVSXNTdXJmYWNlTlYgKEdMdmRwYXVTdXJmYWNlTlYgc3VyZmFjZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVkRQQVVVbnJlZ2lzdGVyU3VyZmFjZU5WIChHTHZkcGF1U3VyZmFjZU5WIHN1cmZhY2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZEUEFVR2V0U3VyZmFjZWl2TlYgKEdMdmRwYXVTdXJmYWNlTlYgc3VyZmFjZSwgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnZhbHVlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVkRQQVVTdXJmYWNlQWNjZXNzTlYgKEdMdmRwYXVTdXJmYWNlTlYgc3VyZmFjZSwgR0xlbnVtIGFjY2Vzcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVkRQQVVNYXBTdXJmYWNlc05WIChHTHNpemVpIG51bVN1cmZhY2VzLCBjb25zdCBHTHZkcGF1U3VyZmFjZU5WICpzdXJmYWNlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVkRQQVVVbm1hcFN1cmZhY2VzTlYgKEdMc2l6ZWkgbnVtU3VyZmFjZSwgY29uc3QgR0x2ZHBhdVN1cmZhY2VOViAqc3VyZmFjZXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkRQQVVJTklUTlZQUk9DKSAoY29uc3QgR0x2b2lkICp2ZHBEZXZpY2UsIGNvbnN0IEdMdm9pZCAqZ2V0UHJvY0FkZHJlc3MpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRFBBVUZJTklOVlBST0MpICh2b2lkKTsKK3R5cGVkZWYgR0x2ZHBhdVN1cmZhY2VOViAoQVBJRU5UUllQIFBGTkdMVkRQQVVSRUdJU1RFUlZJREVPU1VSRkFDRU5WUFJPQykgKEdMdm9pZCAqdmRwU3VyZmFjZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1UZXh0dXJlTmFtZXMsIGNvbnN0IEdMdWludCAqdGV4dHVyZU5hbWVzKTsKK3R5cGVkZWYgR0x2ZHBhdVN1cmZhY2VOViAoQVBJRU5UUllQIFBGTkdMVkRQQVVSRUdJU1RFUk9VVFBVVFNVUkZBQ0VOVlBST0MpIChHTHZvaWQgKnZkcFN1cmZhY2UsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbnVtVGV4dHVyZU5hbWVzLCBjb25zdCBHTHVpbnQgKnRleHR1cmVOYW1lcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZEUEFVSVNTVVJGQUNFTlZQUk9DKSAoR0x2ZHBhdVN1cmZhY2VOViBzdXJmYWNlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkRQQVVVTlJFR0lTVEVSU1VSRkFDRU5WUFJPQykgKEdMdmRwYXVTdXJmYWNlTlYgc3VyZmFjZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZEUEFVR0VUU1VSRkFDRUlWTlZQUk9DKSAoR0x2ZHBhdVN1cmZhY2VOViBzdXJmYWNlLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqdmFsdWVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkRQQVVTVVJGQUNFQUNDRVNTTlZQUk9DKSAoR0x2ZHBhdVN1cmZhY2VOViBzdXJmYWNlLCBHTGVudW0gYWNjZXNzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkRQQVVNQVBTVVJGQUNFU05WUFJPQykgKEdMc2l6ZWkgbnVtU3VyZmFjZXMsIGNvbnN0IEdMdmRwYXVTdXJmYWNlTlYgKnN1cmZhY2VzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkRQQVVVTk1BUFNVUkZBQ0VTTlZQUk9DKSAoR0xzaXplaSBudW1TdXJmYWNlLCBjb25zdCBHTHZkcGF1U3VyZmFjZU5WICpzdXJmYWNlcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfdHJhbnNmb3JtX2ZlZWRiYWNrM19saW5lc190cmlhbmdsZXMKKyNkZWZpbmUgR0xfQU1EX3RyYW5zZm9ybV9mZWVkYmFjazNfbGluZXNfdHJpYW5nbGVzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF9kZXB0aF9jbGFtcF9zZXBhcmF0ZQorI2RlZmluZSBHTF9BTURfZGVwdGhfY2xhbXBfc2VwYXJhdGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfc1JHQl9kZWNvZGUKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfc1JHQl9kZWNvZGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9OVl90ZXh0dXJlX211bHRpc2FtcGxlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4SW1hZ2UyRE11bHRpc2FtcGxlQ292ZXJhZ2VOViAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBjb3ZlcmFnZVNhbXBsZXMsIEdMc2l6ZWkgY29sb3JTYW1wbGVzLCBHTGludCBpbnRlcm5hbEZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMYm9vbGVhbiBmaXhlZFNhbXBsZUxvY2F0aW9ucyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4SW1hZ2UzRE11bHRpc2FtcGxlQ292ZXJhZ2VOViAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBjb3ZlcmFnZVNhbXBsZXMsIEdMc2l6ZWkgY29sb3JTYW1wbGVzLCBHTGludCBpbnRlcm5hbEZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMYm9vbGVhbiBmaXhlZFNhbXBsZUxvY2F0aW9ucyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZUltYWdlMkRNdWx0aXNhbXBsZU5WIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGludCBpbnRlcm5hbEZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMYm9vbGVhbiBmaXhlZFNhbXBsZUxvY2F0aW9ucyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZUltYWdlM0RNdWx0aXNhbXBsZU5WIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGludCBpbnRlcm5hbEZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMYm9vbGVhbiBmaXhlZFNhbXBsZUxvY2F0aW9ucyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZUltYWdlMkRNdWx0aXNhbXBsZUNvdmVyYWdlTlYgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGNvdmVyYWdlU2FtcGxlcywgR0xzaXplaSBjb2xvclNhbXBsZXMsIEdMaW50IGludGVybmFsRm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xib29sZWFuIGZpeGVkU2FtcGxlTG9jYXRpb25zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlSW1hZ2UzRE11bHRpc2FtcGxlQ292ZXJhZ2VOViAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgY292ZXJhZ2VTYW1wbGVzLCBHTHNpemVpIGNvbG9yU2FtcGxlcywgR0xpbnQgaW50ZXJuYWxGb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGJvb2xlYW4gZml4ZWRTYW1wbGVMb2NhdGlvbnMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYSU1BR0UyRE1VTFRJU0FNUExFQ09WRVJBR0VOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGNvdmVyYWdlU2FtcGxlcywgR0xzaXplaSBjb2xvclNhbXBsZXMsIEdMaW50IGludGVybmFsRm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xib29sZWFuIGZpeGVkU2FtcGxlTG9jYXRpb25zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYSU1BR0UzRE1VTFRJU0FNUExFQ09WRVJBR0VOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGNvdmVyYWdlU2FtcGxlcywgR0xzaXplaSBjb2xvclNhbXBsZXMsIEdMaW50IGludGVybmFsRm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xib29sZWFuIGZpeGVkU2FtcGxlTG9jYXRpb25zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRUlNQUdFMkRNVUxUSVNBTVBMRU5WUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMaW50IGludGVybmFsRm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xib29sZWFuIGZpeGVkU2FtcGxlTG9jYXRpb25zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRUlNQUdFM0RNVUxUSVNBTVBMRU5WUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMaW50IGludGVybmFsRm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xib29sZWFuIGZpeGVkU2FtcGxlTG9jYXRpb25zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRUlNQUdFMkRNVUxUSVNBTVBMRUNPVkVSQUdFTlZQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgY292ZXJhZ2VTYW1wbGVzLCBHTHNpemVpIGNvbG9yU2FtcGxlcywgR0xpbnQgaW50ZXJuYWxGb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGJvb2xlYW4gZml4ZWRTYW1wbGVMb2NhdGlvbnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFSU1BR0UzRE1VTFRJU0FNUExFQ09WRVJBR0VOVlBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBjb3ZlcmFnZVNhbXBsZXMsIEdMc2l6ZWkgY29sb3JTYW1wbGVzLCBHTGludCBpbnRlcm5hbEZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMYm9vbGVhbiBmaXhlZFNhbXBsZUxvY2F0aW9ucyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfYmxlbmRfbWlubWF4X2ZhY3RvcgorI2RlZmluZSBHTF9BTURfYmxlbmRfbWlubWF4X2ZhY3RvciAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfc2FtcGxlX3Bvc2l0aW9ucworI2RlZmluZSBHTF9BTURfc2FtcGxlX3Bvc2l0aW9ucyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNldE11bHRpc2FtcGxlZnZBTUQgKEdMZW51bSBwbmFtZSwgR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2YWwpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VUTVVMVElTQU1QTEVGVkFNRFBST0MpIChHTGVudW0gcG5hbWUsIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdmFsKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF94MTFfc3luY19vYmplY3QKKyNkZWZpbmUgR0xfRVhUX3gxMV9zeW5jX29iamVjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgR0xzeW5jIEFQSUVOVFJZIGdsSW1wb3J0U3luY0VYVCAoR0xlbnVtIGV4dGVybmFsX3N5bmNfdHlwZSwgR0xpbnRwdHIgZXh0ZXJuYWxfc3luYywgR0xiaXRmaWVsZCBmbGFncyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTHN5bmMgKEFQSUVOVFJZUCBQRk5HTElNUE9SVFNZTkNFWFRQUk9DKSAoR0xlbnVtIGV4dGVybmFsX3N5bmNfdHlwZSwgR0xpbnRwdHIgZXh0ZXJuYWxfc3luYywgR0xiaXRmaWVsZCBmbGFncyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfbXVsdGlfZHJhd19pbmRpcmVjdAorI2RlZmluZSBHTF9BTURfbXVsdGlfZHJhd19pbmRpcmVjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd0FycmF5c0luZGlyZWN0QU1EIChHTGVudW0gbW9kZSwgY29uc3QgR0x2b2lkICppbmRpcmVjdCwgR0xzaXplaSBwcmltY291bnQsIEdMc2l6ZWkgc3RyaWRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aURyYXdFbGVtZW50c0luZGlyZWN0QU1EIChHTGVudW0gbW9kZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaXJlY3QsIEdMc2l6ZWkgcHJpbWNvdW50LCBHTHNpemVpIHN0cmlkZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSURSQVdBUlJBWVNJTkRJUkVDVEFNRFBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0x2b2lkICppbmRpcmVjdCwgR0xzaXplaSBwcmltY291bnQsIEdMc2l6ZWkgc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXRUxFTUVOVFNJTkRJUkVDVEFNRFBST0MpIChHTGVudW0gbW9kZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaXJlY3QsIEdMc2l6ZWkgcHJpbWNvdW50LCBHTHNpemVpIHN0cmlkZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGVfYmxpdF9zY2FsZWQKKyNkZWZpbmUgR0xfRVhUX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlX2JsaXRfc2NhbGVkIDEKKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbHguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2x4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhN2Q5NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2x4LmgKQEAgLTAsMCArMSw1MjYgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKiBWZXJzaW9uOiAgNi41CisgKiAKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEJSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKyNpZm5kZWYgR0xYX0gKKyNkZWZpbmUgR0xYX0gKKworCisjaWZkZWYgX19WTVMKKyNpbmNsdWRlIDxHTC92bXNfeF9maXguaD4KKyMgaWZkZWYgX19jcGx1c3BsdXMKKy8qIFZNUyBYbGliLmggZ2l2ZXMgcHJvYmxlbXMgd2l0aCBDKysuCisgKiB0aGlzIGF2b2lkcyBhIGJ1bmNoIG9mIHRyaXZpYWwgd2FybmluZ3MgKi8KKyNwcmFnbWEgbWVzc2FnZSBkaXNhYmxlIG5vc2ltcGludAorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2lmZGVmIF9fVk1TCisjIGlmZGVmIF9fY3BsdXNwbHVzCisjcHJhZ21hIG1lc3NhZ2UgZW5hYmxlIG5vc2ltcGludAorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxHTC9nbC5oPgorCisKKyNpZiBkZWZpbmVkKFVTRV9NR0xfTkFNRVNQQUNFKQorI2luY2x1ZGUgImdseF9tYW5nbGUuaCIKKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjZGVmaW5lIEdMWF9WRVJTSU9OXzFfMQkJMQorI2RlZmluZSBHTFhfVkVSU0lPTl8xXzIJCTEKKyNkZWZpbmUgR0xYX1ZFUlNJT05fMV8zCQkxCisjZGVmaW5lIEdMWF9WRVJTSU9OXzFfNAkJMQorCisjZGVmaW5lIEdMWF9FWFRFTlNJT05fTkFNRSAgICJHTFgiCisKKworCisvKgorICogVG9rZW5zIGZvciBnbFhDaG9vc2VWaXN1YWwgYW5kIGdsWEdldENvbmZpZzoKKyAqLworI2RlZmluZSBHTFhfVVNFX0dMCQkxCisjZGVmaW5lIEdMWF9CVUZGRVJfU0laRQkJMgorI2RlZmluZSBHTFhfTEVWRUwJCTMKKyNkZWZpbmUgR0xYX1JHQkEJCTQKKyNkZWZpbmUgR0xYX0RPVUJMRUJVRkZFUgk1CisjZGVmaW5lIEdMWF9TVEVSRU8JCTYKKyNkZWZpbmUgR0xYX0FVWF9CVUZGRVJTCQk3CisjZGVmaW5lIEdMWF9SRURfU0laRQkJOAorI2RlZmluZSBHTFhfR1JFRU5fU0laRQkJOQorI2RlZmluZSBHTFhfQkxVRV9TSVpFCQkxMAorI2RlZmluZSBHTFhfQUxQSEFfU0laRQkJMTEKKyNkZWZpbmUgR0xYX0RFUFRIX1NJWkUJCTEyCisjZGVmaW5lIEdMWF9TVEVOQ0lMX1NJWkUJMTMKKyNkZWZpbmUgR0xYX0FDQ1VNX1JFRF9TSVpFCTE0CisjZGVmaW5lIEdMWF9BQ0NVTV9HUkVFTl9TSVpFCTE1CisjZGVmaW5lIEdMWF9BQ0NVTV9CTFVFX1NJWkUJMTYKKyNkZWZpbmUgR0xYX0FDQ1VNX0FMUEhBX1NJWkUJMTcKKworCisvKgorICogRXJyb3IgY29kZXMgcmV0dXJuZWQgYnkgZ2xYR2V0Q29uZmlnOgorICovCisjZGVmaW5lIEdMWF9CQURfU0NSRUVOCQkxCisjZGVmaW5lIEdMWF9CQURfQVRUUklCVVRFCTIKKyNkZWZpbmUgR0xYX05PX0VYVEVOU0lPTgkzCisjZGVmaW5lIEdMWF9CQURfVklTVUFMCQk0CisjZGVmaW5lIEdMWF9CQURfQ09OVEVYVAkJNQorI2RlZmluZSBHTFhfQkFEX1ZBTFVFICAgICAgIAk2CisjZGVmaW5lIEdMWF9CQURfRU5VTQkJNworCisKKy8qCisgKiBHTFggMS4xIGFuZCBsYXRlcjoKKyAqLworI2RlZmluZSBHTFhfVkVORE9SCQkxCisjZGVmaW5lIEdMWF9WRVJTSU9OCQkyCisjZGVmaW5lIEdMWF9FWFRFTlNJT05TIAkJMworCisKKy8qCisgKiBHTFggMS4zIGFuZCBsYXRlcjoKKyAqLworI2RlZmluZSBHTFhfQ09ORklHX0NBVkVBVAkJMHgyMAorI2RlZmluZSBHTFhfRE9OVF9DQVJFCQkJMHhGRkZGRkZGRgorI2RlZmluZSBHTFhfWF9WSVNVQUxfVFlQRQkJMHgyMgorI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfVFlQRQkJMHgyMworI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfSU5ERVhfVkFMVUUJMHgyNAorI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFCTB4MjUKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFCTB4MjYKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUJMHgyNworI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfQUxQSEFfVkFMVUUJMHgyOAorI2RlZmluZSBHTFhfV0lORE9XX0JJVAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgR0xYX1BJWE1BUF9CSVQJCQkweDAwMDAwMDAyCisjZGVmaW5lIEdMWF9QQlVGRkVSX0JJVAkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgR0xYX0FVWF9CVUZGRVJTX0JJVAkJMHgwMDAwMDAxMAorI2RlZmluZSBHTFhfRlJPTlRfTEVGVF9CVUZGRVJfQklUCTB4MDAwMDAwMDEKKyNkZWZpbmUgR0xYX0ZST05UX1JJR0hUX0JVRkZFUl9CSVQJMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfQkFDS19MRUZUX0JVRkZFUl9CSVQJMHgwMDAwMDAwNAorI2RlZmluZSBHTFhfQkFDS19SSUdIVF9CVUZGRVJfQklUCTB4MDAwMDAwMDgKKyNkZWZpbmUgR0xYX0RFUFRIX0JVRkZFUl9CSVQJCTB4MDAwMDAwMjAKKyNkZWZpbmUgR0xYX1NURU5DSUxfQlVGRkVSX0JJVAkJMHgwMDAwMDA0MAorI2RlZmluZSBHTFhfQUNDVU1fQlVGRkVSX0JJVAkJMHgwMDAwMDA4MAorI2RlZmluZSBHTFhfTk9ORQkJCTB4ODAwMAorI2RlZmluZSBHTFhfU0xPV19DT05GSUcJCQkweDgwMDEKKyNkZWZpbmUgR0xYX1RSVUVfQ09MT1IJCQkweDgwMDIKKyNkZWZpbmUgR0xYX0RJUkVDVF9DT0xPUgkJMHg4MDAzCisjZGVmaW5lIEdMWF9QU0VVRE9fQ09MT1IJCTB4ODAwNAorI2RlZmluZSBHTFhfU1RBVElDX0NPTE9SCQkweDgwMDUKKyNkZWZpbmUgR0xYX0dSQVlfU0NBTEUJCQkweDgwMDYKKyNkZWZpbmUgR0xYX1NUQVRJQ19HUkFZCQkJMHg4MDA3CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9SR0IJCTB4ODAwOAorI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfSU5ERVgJCTB4ODAwOQorI2RlZmluZSBHTFhfVklTVUFMX0lECQkJMHg4MDBCCisjZGVmaW5lIEdMWF9TQ1JFRU4JCQkweDgwMEMKKyNkZWZpbmUgR0xYX05PTl9DT05GT1JNQU5UX0NPTkZJRwkweDgwMEQKKyNkZWZpbmUgR0xYX0RSQVdBQkxFX1RZUEUJCTB4ODAxMAorI2RlZmluZSBHTFhfUkVOREVSX1RZUEUJCQkweDgwMTEKKyNkZWZpbmUgR0xYX1hfUkVOREVSQUJMRQkJMHg4MDEyCisjZGVmaW5lIEdMWF9GQkNPTkZJR19JRAkJCTB4ODAxMworI2RlZmluZSBHTFhfUkdCQV9UWVBFCQkJMHg4MDE0CisjZGVmaW5lIEdMWF9DT0xPUl9JTkRFWF9UWVBFCQkweDgwMTUKKyNkZWZpbmUgR0xYX01BWF9QQlVGRkVSX1dJRFRICQkweDgwMTYKKyNkZWZpbmUgR0xYX01BWF9QQlVGRkVSX0hFSUdIVAkJMHg4MDE3CisjZGVmaW5lIEdMWF9NQVhfUEJVRkZFUl9QSVhFTFMJCTB4ODAxOAorI2RlZmluZSBHTFhfUFJFU0VSVkVEX0NPTlRFTlRTCQkweDgwMUIKKyNkZWZpbmUgR0xYX0xBUkdFU1RfUEJVRkZFUgkJMHg4MDFDCisjZGVmaW5lIEdMWF9XSURUSAkJCTB4ODAxRAorI2RlZmluZSBHTFhfSEVJR0hUCQkJMHg4MDFFCisjZGVmaW5lIEdMWF9FVkVOVF9NQVNLCQkJMHg4MDFGCisjZGVmaW5lIEdMWF9EQU1BR0VECQkJMHg4MDIwCisjZGVmaW5lIEdMWF9TQVZFRAkJCTB4ODAyMQorI2RlZmluZSBHTFhfV0lORE9XCQkJMHg4MDIyCisjZGVmaW5lIEdMWF9QQlVGRkVSCQkJMHg4MDIzCisjZGVmaW5lIEdMWF9QQlVGRkVSX0hFSUdIVCAgICAgICAgICAgICAgMHg4MDQwCisjZGVmaW5lIEdMWF9QQlVGRkVSX1dJRFRIICAgICAgICAgICAgICAgMHg4MDQxCisjZGVmaW5lIEdMWF9SR0JBX0JJVAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgR0xYX0NPTE9SX0lOREVYX0JJVAkJMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfUEJVRkZFUl9DTE9CQkVSX01BU0sJMHgwODAwMDAwMAorCisKKy8qCisgKiBHTFggMS40IGFuZCBsYXRlcjoKKyAqLworI2RlZmluZSBHTFhfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgIDB4MTg2YTAgLyoxMDAwMDAqLworI2RlZmluZSBHTFhfU0FNUExFUyAgICAgICAgICAgICAgICAgICAgIDB4MTg2YTEgLyoxMDAwMDEqLworCisKKwordHlwZWRlZiBzdHJ1Y3QgX19HTFhjb250ZXh0UmVjICpHTFhDb250ZXh0OwordHlwZWRlZiBYSUQgR0xYUGl4bWFwOwordHlwZWRlZiBYSUQgR0xYRHJhd2FibGU7CisvKiBHTFggMS4zIGFuZCBsYXRlciAqLwordHlwZWRlZiBzdHJ1Y3QgX19HTFhGQkNvbmZpZ1JlYyAqR0xYRkJDb25maWc7Cit0eXBlZGVmIFhJRCBHTFhGQkNvbmZpZ0lEOwordHlwZWRlZiBYSUQgR0xYQ29udGV4dElEOwordHlwZWRlZiBYSUQgR0xYV2luZG93OwordHlwZWRlZiBYSUQgR0xYUGJ1ZmZlcjsKKworCisvKgorKiogRXZlbnRzLgorKiogX19HTFhfTlVNQkVSX0VWRU5UUyBpcyBzZXQgdG8gMTcgdG8gYWNjb3VudCBmb3IgdGhlIEJ1ZmZlckNsb2JiZXJTR0lYCisqKiAgZXZlbnQgLSB0aGlzIGhlbHBzIGluaXRpYWxpemF0aW9uIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdGhlIHBidWZmZXIKKyoqICBleHRlbnNpb24gYW5kIHRoZSBjbGllbnQgZG9lc24ndC4KKyovCisjZGVmaW5lIEdMWF9QYnVmZmVyQ2xvYmJlcgkwCisjZGVmaW5lIEdMWF9CdWZmZXJTd2FwQ29tcGxldGUJMQorCisjZGVmaW5lIF9fR0xYX05VTUJFUl9FVkVOVFMgMTcKKworZXh0ZXJuIFhWaXN1YWxJbmZvKiBnbFhDaG9vc2VWaXN1YWwoIERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwKKwkJCQkgICAgIGludCAqYXR0cmliTGlzdCApOworCitleHRlcm4gR0xYQ29udGV4dCBnbFhDcmVhdGVDb250ZXh0KCBEaXNwbGF5ICpkcHksIFhWaXN1YWxJbmZvICp2aXMsCisJCQkJICAgIEdMWENvbnRleHQgc2hhcmVMaXN0LCBCb29sIGRpcmVjdCApOworCitleHRlcm4gdm9pZCBnbFhEZXN0cm95Q29udGV4dCggRGlzcGxheSAqZHB5LCBHTFhDb250ZXh0IGN0eCApOworCitleHRlcm4gQm9vbCBnbFhNYWtlQ3VycmVudCggRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwKKwkJCSAgICBHTFhDb250ZXh0IGN0eCk7CisKK2V4dGVybiB2b2lkIGdsWENvcHlDb250ZXh0KCBEaXNwbGF5ICpkcHksIEdMWENvbnRleHQgc3JjLCBHTFhDb250ZXh0IGRzdCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIG1hc2sgKTsKKworZXh0ZXJuIHZvaWQgZ2xYU3dhcEJ1ZmZlcnMoIERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUgKTsKKworZXh0ZXJuIEdMWFBpeG1hcCBnbFhDcmVhdGVHTFhQaXhtYXAoIERpc3BsYXkgKmRweSwgWFZpc3VhbEluZm8gKnZpc3VhbCwKKwkJCQkgICAgIFBpeG1hcCBwaXhtYXAgKTsKKworZXh0ZXJuIHZvaWQgZ2xYRGVzdHJveUdMWFBpeG1hcCggRGlzcGxheSAqZHB5LCBHTFhQaXhtYXAgcGl4bWFwICk7CisKK2V4dGVybiBCb29sIGdsWFF1ZXJ5RXh0ZW5zaW9uKCBEaXNwbGF5ICpkcHksIGludCAqZXJyb3JiLCBpbnQgKmV2ZW50ICk7CisKK2V4dGVybiBCb29sIGdsWFF1ZXJ5VmVyc2lvbiggRGlzcGxheSAqZHB5LCBpbnQgKm1haiwgaW50ICptaW4gKTsKKworZXh0ZXJuIEJvb2wgZ2xYSXNEaXJlY3QoIERpc3BsYXkgKmRweSwgR0xYQ29udGV4dCBjdHggKTsKKworZXh0ZXJuIGludCBnbFhHZXRDb25maWcoIERpc3BsYXkgKmRweSwgWFZpc3VhbEluZm8gKnZpc3VhbCwKKwkJCSBpbnQgYXR0cmliLCBpbnQgKnZhbHVlICk7CisKK2V4dGVybiBHTFhDb250ZXh0IGdsWEdldEN1cnJlbnRDb250ZXh0KCB2b2lkICk7CisKK2V4dGVybiBHTFhEcmF3YWJsZSBnbFhHZXRDdXJyZW50RHJhd2FibGUoIHZvaWQgKTsKKworZXh0ZXJuIHZvaWQgZ2xYV2FpdEdMKCB2b2lkICk7CisKK2V4dGVybiB2b2lkIGdsWFdhaXRYKCB2b2lkICk7CisKK2V4dGVybiB2b2lkIGdsWFVzZVhGb250KCBGb250IGZvbnQsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdCApOworCisKKworLyogR0xYIDEuMSBhbmQgbGF0ZXIgKi8KK2V4dGVybiBjb25zdCBjaGFyICpnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcoIERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiApOworCitleHRlcm4gY29uc3QgY2hhciAqZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoIERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgaW50IG5hbWUgKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmdsWEdldENsaWVudFN0cmluZyggRGlzcGxheSAqZHB5LCBpbnQgbmFtZSApOworCisKKy8qIEdMWCAxLjIgYW5kIGxhdGVyICovCitleHRlcm4gRGlzcGxheSAqZ2xYR2V0Q3VycmVudERpc3BsYXkoIHZvaWQgKTsKKworCisvKiBHTFggMS4zIGFuZCBsYXRlciAqLworZXh0ZXJuIEdMWEZCQ29uZmlnICpnbFhDaG9vc2VGQkNvbmZpZyggRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICphdHRyaWJMaXN0LCBpbnQgKm5pdGVtcyApOworCitleHRlcm4gaW50IGdsWEdldEZCQ29uZmlnQXR0cmliKCBEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdHRyaWJ1dGUsIGludCAqdmFsdWUgKTsKKworZXh0ZXJuIEdMWEZCQ29uZmlnICpnbFhHZXRGQkNvbmZpZ3MoIERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5lbGVtZW50cyApOworCitleHRlcm4gWFZpc3VhbEluZm8gKmdsWEdldFZpc3VhbEZyb21GQkNvbmZpZyggRGlzcGxheSAqZHB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMWEZCQ29uZmlnIGNvbmZpZyApOworCitleHRlcm4gR0xYV2luZG93IGdsWENyZWF0ZVdpbmRvdyggRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93IHdpbiwgY29uc3QgaW50ICphdHRyaWJMaXN0ICk7CisKK2V4dGVybiB2b2lkIGdsWERlc3Ryb3lXaW5kb3coIERpc3BsYXkgKmRweSwgR0xYV2luZG93IHdpbmRvdyApOworCitleHRlcm4gR0xYUGl4bWFwIGdsWENyZWF0ZVBpeG1hcCggRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4bWFwIHBpeG1hcCwgY29uc3QgaW50ICphdHRyaWJMaXN0ICk7CisKK2V4dGVybiB2b2lkIGdsWERlc3Ryb3lQaXhtYXAoIERpc3BsYXkgKmRweSwgR0xYUGl4bWFwIHBpeG1hcCApOworCitleHRlcm4gR0xYUGJ1ZmZlciBnbFhDcmVhdGVQYnVmZmVyKCBEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqYXR0cmliTGlzdCApOworCitleHRlcm4gdm9pZCBnbFhEZXN0cm95UGJ1ZmZlciggRGlzcGxheSAqZHB5LCBHTFhQYnVmZmVyIHBidWYgKTsKKworZXh0ZXJuIHZvaWQgZ2xYUXVlcnlEcmF3YWJsZSggRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCBpbnQgYXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICp2YWx1ZSApOworCitleHRlcm4gR0xYQ29udGV4dCBnbFhDcmVhdGVOZXdDb250ZXh0KCBEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZW5kZXJUeXBlLCBHTFhDb250ZXh0IHNoYXJlTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2wgZGlyZWN0ICk7CisKK2V4dGVybiBCb29sIGdsWE1ha2VDb250ZXh0Q3VycmVudCggRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTFhEcmF3YWJsZSByZWFkLCBHTFhDb250ZXh0IGN0eCApOworCitleHRlcm4gR0xYRHJhd2FibGUgZ2xYR2V0Q3VycmVudFJlYWREcmF3YWJsZSggdm9pZCApOworCitleHRlcm4gaW50IGdsWFF1ZXJ5Q29udGV4dCggRGlzcGxheSAqZHB5LCBHTFhDb250ZXh0IGN0eCwgaW50IGF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnZhbHVlICk7CisKK2V4dGVybiB2b2lkIGdsWFNlbGVjdEV2ZW50KCBEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbWFzayApOworCitleHRlcm4gdm9pZCBnbFhHZXRTZWxlY3RlZEV2ZW50KCBEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqbWFzayApOworCisvKiBHTFggMS4zIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZnMgKi8KK3R5cGVkZWYgR0xYRkJDb25maWcgKiAoKiBQRk5HTFhHRVRGQkNPTkZJR1NQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgKm5lbGVtZW50cyk7Cit0eXBlZGVmIEdMWEZCQ29uZmlnICogKCogUEZOR0xYQ0hPT1NFRkJDT05GSUdQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0LCBpbnQgKm5lbGVtZW50cyk7Cit0eXBlZGVmIGludCAoKiBQRk5HTFhHRVRGQkNPTkZJR0FUVFJJQlBST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgaW50IGF0dHJpYnV0ZSwgaW50ICp2YWx1ZSk7Cit0eXBlZGVmIFhWaXN1YWxJbmZvICogKCogUEZOR0xYR0VUVklTVUFMRlJPTUZCQ09ORklHUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnKTsKK3R5cGVkZWYgR0xYV2luZG93ICgqIFBGTkdMWENSRUFURVdJTkRPV1BST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgV2luZG93IHdpbiwgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7Cit0eXBlZGVmIHZvaWQgKCogUEZOR0xYREVTVFJPWVdJTkRPV1BST0MpIChEaXNwbGF5ICpkcHksIEdMWFdpbmRvdyB3aW4pOwordHlwZWRlZiBHTFhQaXhtYXAgKCogUEZOR0xYQ1JFQVRFUElYTUFQUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBQaXhtYXAgcGl4bWFwLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKK3R5cGVkZWYgdm9pZCAoKiBQRk5HTFhERVNUUk9ZUElYTUFQUFJPQykgKERpc3BsYXkgKmRweSwgR0xYUGl4bWFwIHBpeG1hcCk7Cit0eXBlZGVmIEdMWFBidWZmZXIgKCogUEZOR0xYQ1JFQVRFUEJVRkZFUlBST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7Cit0eXBlZGVmIHZvaWQgKCogUEZOR0xYREVTVFJPWVBCVUZGRVJQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhQYnVmZmVyIHBidWYpOwordHlwZWRlZiB2b2lkICgqIFBGTkdMWFFVRVJZRFJBV0FCTEVQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCBpbnQgYXR0cmlidXRlLCB1bnNpZ25lZCBpbnQgKnZhbHVlKTsKK3R5cGVkZWYgR0xYQ29udGV4dCAoKiBQRk5HTFhDUkVBVEVORVdDT05URVhUUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBpbnQgcmVuZGVyX3R5cGUsIEdMWENvbnRleHQgc2hhcmVfbGlzdCwgQm9vbCBkaXJlY3QpOwordHlwZWRlZiBCb29sICgqIFBGTkdMWE1BS0VDT05URVhUQ1VSUkVOVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXcsIEdMWERyYXdhYmxlIHJlYWQsIEdMWENvbnRleHQgY3R4KTsKK3R5cGVkZWYgR0xYRHJhd2FibGUgKCogUEZOR0xYR0VUQ1VSUkVOVFJFQUREUkFXQUJMRVBST0MpICh2b2lkKTsKK3R5cGVkZWYgRGlzcGxheSAqICgqIFBGTkdMWEdFVENVUlJFTlRESVNQTEFZUFJPQykgKHZvaWQpOwordHlwZWRlZiBpbnQgKCogUEZOR0xYUVVFUllDT05URVhUUFJPQykgKERpc3BsYXkgKmRweSwgR0xYQ29udGV4dCBjdHgsIGludCBhdHRyaWJ1dGUsIGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkICgqIFBGTkdMWFNFTEVDVEVWRU5UUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgdW5zaWduZWQgbG9uZyBldmVudF9tYXNrKTsKK3R5cGVkZWYgdm9pZCAoKiBQRk5HTFhHRVRTRUxFQ1RFREVWRU5UUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgdW5zaWduZWQgbG9uZyAqZXZlbnRfbWFzayk7CisKKworLyoKKyAqIEFSQiAyLiBHTFhfQVJCX2dldF9wcm9jX2FkZHJlc3MKKyAqLworI2lmbmRlZiBHTFhfQVJCX2dldF9wcm9jX2FkZHJlc3MKKyNkZWZpbmUgR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzIDEKKwordHlwZWRlZiB2b2lkICgqX19HTFhleHRGdW5jUHRyKSh2b2lkKTsKK2V4dGVybiBfX0dMWGV4dEZ1bmNQdHIgZ2xYR2V0UHJvY0FkZHJlc3NBUkIgKGNvbnN0IEdMdWJ5dGUgKik7CisKKyNlbmRpZiAvKiBHTFhfQVJCX2dldF9wcm9jX2FkZHJlc3MgKi8KKworCisKKy8qIEdMWCAxLjQgYW5kIGxhdGVyICovCitleHRlcm4gdm9pZCAoKmdsWEdldFByb2NBZGRyZXNzKGNvbnN0IEdMdWJ5dGUgKnByb2NuYW1lKSkoIHZvaWQgKTsKKworLyogR0xYIDEuNCBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWZzICovCit0eXBlZGVmIF9fR0xYZXh0RnVuY1B0ciAoKiBQRk5HTFhHRVRQUk9DQUREUkVTU1BST0MpIChjb25zdCBHTHVieXRlICpwcm9jTmFtZSk7CisKKworI2lmbmRlZiBHTFhfR0xYRVhUX0xFR0FDWQorCisjaW5jbHVkZSA8R0wvZ2x4ZXh0Lmg+CisKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX0xFR0FDWSAqLworCisKKy8qKgorICoqIFRoZSBmb2xsb3dpbmcgYXJlbid0IGluIGdseGV4dC5oIHlldC4KKyAqKi8KKworCisvKgorICogPz8/LiBHTFhfTlZfdmVydGV4X2FycmF5X3JhbmdlCisgKi8KKyNpZm5kZWYgR0xYX05WX3ZlcnRleF9hcnJheV9yYW5nZQorI2RlZmluZSBHTFhfTlZfdmVydGV4X2FycmF5X3JhbmdlCisKK2V4dGVybiB2b2lkICpnbFhBbGxvY2F0ZU1lbW9yeU5WKEdMc2l6ZWkgc2l6ZSwgR0xmbG9hdCByZWFkZnJlcSwgR0xmbG9hdCB3cml0ZWZyZXEsIEdMZmxvYXQgcHJpb3JpdHkpOworZXh0ZXJuIHZvaWQgZ2xYRnJlZU1lbW9yeU5WKEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKiAoICogUEZOR0xYQUxMT0NBVEVNRU1PUllOVlBST0MpIChHTHNpemVpIHNpemUsIEdMZmxvYXQgcmVhZGZyZXEsIEdMZmxvYXQgd3JpdGVmcmVxLCBHTGZsb2F0IHByaW9yaXR5KTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYRlJFRU1FTU9SWU5WUFJPQykgKEdMdm9pZCAqcG9pbnRlcik7CisKKyNlbmRpZiAvKiBHTFhfTlZfdmVydGV4X2FycmF5X3JhbmdlICovCisKKworLyoKKyAqIEFSQiA/LiBHTFhfQVJCX3JlbmRlcl90ZXh0dXJlCisgKiBYWFggVGhpcyB3YXMgbmV2ZXIgZmluYWxpemVkIQorICovCisjaWZuZGVmIEdMWF9BUkJfcmVuZGVyX3RleHR1cmUKKyNkZWZpbmUgR0xYX0FSQl9yZW5kZXJfdGV4dHVyZSAxCisKK2V4dGVybiBCb29sIGdsWEJpbmRUZXhJbWFnZUFSQihEaXNwbGF5ICpkcHksIEdMWFBidWZmZXIgcGJ1ZmZlciwgaW50IGJ1ZmZlcik7CitleHRlcm4gQm9vbCBnbFhSZWxlYXNlVGV4SW1hZ2VBUkIoRGlzcGxheSAqZHB5LCBHTFhQYnVmZmVyIHBidWZmZXIsIGludCBidWZmZXIpOworZXh0ZXJuIEJvb2wgZ2xYRHJhd2FibGVBdHRyaWJBUkIoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCBjb25zdCBpbnQgKmF0dHJpYkxpc3QpOworCisjZW5kaWYgLyogR0xYX0FSQl9yZW5kZXJfdGV4dHVyZSAqLworCisKKy8qCisgKiBSZW1vdmUgdGhpcyB3aGVuIGdseGV4dC5oIGlzIHVwZGF0ZWQuCisgKi8KKyNpZm5kZWYgR0xYX05WX2Zsb2F0X2J1ZmZlcgorI2RlZmluZSBHTFhfTlZfZmxvYXRfYnVmZmVyIDEKKworI2RlZmluZSBHTFhfRkxPQVRfQ09NUE9ORU5UU19OViAgICAgICAgIDB4MjBCMAorCisjZW5kaWYgLyogR0xYX05WX2Zsb2F0X2J1ZmZlciAqLworCisKKworLyoKKyAqICM/LiBHTFhfTUVTQV9zd2FwX2ZyYW1lX3VzYWdlCisgKi8KKyNpZm5kZWYgR0xYX01FU0Ffc3dhcF9mcmFtZV91c2FnZQorI2RlZmluZSBHTFhfTUVTQV9zd2FwX2ZyYW1lX3VzYWdlIDEKKworZXh0ZXJuIGludCBnbFhHZXRGcmFtZVVzYWdlTUVTQShEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBmbG9hdCAqdXNhZ2UpOworZXh0ZXJuIGludCBnbFhCZWdpbkZyYW1lVHJhY2tpbmdNRVNBKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUpOworZXh0ZXJuIGludCBnbFhFbmRGcmFtZVRyYWNraW5nTUVTQShEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlKTsKK2V4dGVybiBpbnQgZ2xYUXVlcnlGcmFtZVRyYWNraW5nTUVTQShEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQ2NF90ICpzd2FwQ291bnQsIGludDY0X3QgKm1pc3NlZEZyYW1lcywgZmxvYXQgKmxhc3RNaXNzZWRVc2FnZSk7CisKK3R5cGVkZWYgaW50ICgqUEZOR0xYR0VURlJBTUVVU0FHRU1FU0FQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgZmxvYXQgKnVzYWdlKTsKK3R5cGVkZWYgaW50ICgqUEZOR0xYQkVHSU5GUkFNRVRSQUNLSU5HTUVTQVBST0MpKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUpOwordHlwZWRlZiBpbnQgKCpQRk5HTFhFTkRGUkFNRVRSQUNLSU5HTUVTQVBST0MpKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUpOwordHlwZWRlZiBpbnQgKCpQRk5HTFhRVUVSWUZSQU1FVFJBQ0tJTkdNRVNBUFJPQykoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50NjRfdCAqc3dhcENvdW50LCBpbnQ2NF90ICptaXNzZWRGcmFtZXMsIGZsb2F0ICpsYXN0TWlzc2VkVXNhZ2UpOworCisjZW5kaWYgLyogR0xYX01FU0Ffc3dhcF9mcmFtZV91c2FnZSAqLworCisKKworLyoKKyAqICM/LiBHTFhfTUVTQV9zd2FwX2NvbnRyb2wKKyAqLworI2lmbmRlZiBHTFhfTUVTQV9zd2FwX2NvbnRyb2wKKyNkZWZpbmUgR0xYX01FU0Ffc3dhcF9jb250cm9sIDEKKworZXh0ZXJuIGludCBnbFhTd2FwSW50ZXJ2YWxNRVNBKHVuc2lnbmVkIGludCBpbnRlcnZhbCk7CitleHRlcm4gaW50IGdsWEdldFN3YXBJbnRlcnZhbE1FU0Eodm9pZCk7CisKK3R5cGVkZWYgaW50ICgqUEZOR0xYU1dBUElOVEVSVkFMTUVTQVBST0MpKHVuc2lnbmVkIGludCBpbnRlcnZhbCk7Cit0eXBlZGVmIGludCAoKlBGTkdMWEdFVFNXQVBJTlRFUlZBTE1FU0FQUk9DKSh2b2lkKTsKKworI2VuZGlmIC8qIEdMWF9NRVNBX3N3YXBfY29udHJvbCAqLworCisKKworLyoKKyAqICM/LiBHTFhfRVhUX3RleHR1cmVfZnJvbV9waXhtYXAKKyAqIFhYWCBub3QgZmluaXNoZWQ/CisgKi8KKyNpZm5kZWYgR0xYX0VYVF90ZXh0dXJlX2Zyb21fcGl4bWFwCisjZGVmaW5lIEdMWF9FWFRfdGV4dHVyZV9mcm9tX3BpeG1hcCAxCisKKyNkZWZpbmUgR0xYX0JJTkRfVE9fVEVYVFVSRV9SR0JfRVhUICAgICAgICAweDIwRDAKKyNkZWZpbmUgR0xYX0JJTkRfVE9fVEVYVFVSRV9SR0JBX0VYVCAgICAgICAweDIwRDEKKyNkZWZpbmUgR0xYX0JJTkRfVE9fTUlQTUFQX1RFWFRVUkVfRVhUICAgICAweDIwRDIKKyNkZWZpbmUgR0xYX0JJTkRfVE9fVEVYVFVSRV9UQVJHRVRTX0VYVCAgICAweDIwRDMKKyNkZWZpbmUgR0xYX1lfSU5WRVJURURfRVhUICAgICAgICAgICAgICAgICAweDIwRDQKKworI2RlZmluZSBHTFhfVEVYVFVSRV9GT1JNQVRfRVhUICAgICAgICAgICAgIDB4MjBENQorI2RlZmluZSBHTFhfVEVYVFVSRV9UQVJHRVRfRVhUICAgICAgICAgICAgIDB4MjBENgorI2RlZmluZSBHTFhfTUlQTUFQX1RFWFRVUkVfRVhUICAgICAgICAgICAgIDB4MjBENworCisjZGVmaW5lIEdMWF9URVhUVVJFX0ZPUk1BVF9OT05FX0VYVCAgICAgICAgMHgyMEQ4CisjZGVmaW5lIEdMWF9URVhUVVJFX0ZPUk1BVF9SR0JfRVhUICAgICAgICAgMHgyMEQ5CisjZGVmaW5lIEdMWF9URVhUVVJFX0ZPUk1BVF9SR0JBX0VYVCAgICAgICAgMHgyMERBCisKKyNkZWZpbmUgR0xYX1RFWFRVUkVfMURfQklUX0VYVCAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9URVhUVVJFXzJEX0JJVF9FWFQgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfVEVYVFVSRV9SRUNUQU5HTEVfQklUX0VYVCAgICAgIDB4MDAwMDAwMDQKKworI2RlZmluZSBHTFhfVEVYVFVSRV8xRF9FWFQgICAgICAgICAgICAgICAgIDB4MjBEQgorI2RlZmluZSBHTFhfVEVYVFVSRV8yRF9FWFQgICAgICAgICAgICAgICAgIDB4MjBEQworI2RlZmluZSBHTFhfVEVYVFVSRV9SRUNUQU5HTEVfRVhUICAgICAgICAgIDB4MjBERAorCisjZGVmaW5lIEdMWF9GUk9OVF9MRUZUX0VYVCAgICAgICAgICAgICAgICAgMHgyMERFCisjZGVmaW5lIEdMWF9GUk9OVF9SSUdIVF9FWFQgICAgICAgICAgICAgICAgMHgyMERGCisjZGVmaW5lIEdMWF9CQUNLX0xFRlRfRVhUICAgICAgICAgICAgICAgICAgMHgyMEUwCisjZGVmaW5lIEdMWF9CQUNLX1JJR0hUX0VYVCAgICAgICAgICAgICAgICAgMHgyMEUxCisjZGVmaW5lIEdMWF9GUk9OVF9FWFQgICAgICAgICAgICAgICAgICAgICAgR0xYX0ZST05UX0xFRlRfRVhUCisjZGVmaW5lIEdMWF9CQUNLX0VYVCAgICAgICAgICAgICAgICAgICAgICAgR0xYX0JBQ0tfTEVGVF9FWFQKKyNkZWZpbmUgR0xYX0FVWDBfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTIKKyNkZWZpbmUgR0xYX0FVWDFfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTMgCisjZGVmaW5lIEdMWF9BVVgyX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEU0IAorI2RlZmluZSBHTFhfQVVYM19FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFNSAKKyNkZWZpbmUgR0xYX0FVWDRfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTYgCisjZGVmaW5lIEdMWF9BVVg1X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEU3IAorI2RlZmluZSBHTFhfQVVYNl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFOAorI2RlZmluZSBHTFhfQVVYN19FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFOSAKKyNkZWZpbmUgR0xYX0FVWDhfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRUEgCisjZGVmaW5lIEdMWF9BVVg5X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEVCCisKK2V4dGVybiB2b2lkIGdsWEJpbmRUZXhJbWFnZUVYVChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQgYnVmZmVyLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKK2V4dGVybiB2b2lkIGdsWFJlbGVhc2VUZXhJbWFnZUVYVChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQgYnVmZmVyKTsKKworI2VuZGlmIC8qIEdMWF9FWFRfdGV4dHVyZV9mcm9tX3BpeG1hcCAqLworCisKKworCisvKioqIFNob3VsZCB0aGVzZSBnbyBoZXJlLCBvciBpbiBhbm90aGVyIGhlYWRlcj8gKi8KKy8qCisqKiBHTFggRXZlbnRzCisqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBldmVudF90eXBlOwkJLyogR0xYX0RBTUFHRUQgb3IgR0xYX1NBVkVEICovCisgICAgaW50IGRyYXdfdHlwZTsJCS8qIEdMWF9XSU5ET1cgb3IgR0xYX1BCVUZGRVIgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgc2VuZF9ldmVudDsJCS8qIHRydWUgaWYgdGhpcyBjYW1lIGZvciBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CQkvKiBkaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgR0xYRHJhd2FibGUgZHJhd2FibGU7CS8qIFhJRCBvZiBEcmF3YWJsZSAqLworICAgIHVuc2lnbmVkIGludCBidWZmZXJfbWFzazsJLyogbWFzayBpbmRpY2F0aW5nIHdoaWNoIGJ1ZmZlcnMgYXJlIGFmZmVjdGVkICovCisgICAgdW5zaWduZWQgaW50IGF1eF9idWZmZXI7CS8qIHdoaWNoIGF1eCBidWZmZXIgd2FzIGFmZmVjdGVkICovCisgICAgaW50IHgsIHk7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGNvdW50OwkJCS8qIGlmIG5vbnplcm8sIGF0IGxlYXN0IHRoaXMgbWFueSBtb3JlICovCit9IEdMWFBidWZmZXJDbG9iYmVyRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdHlwZTsKKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgc2VuZF9ldmVudDsJCS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CQkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgR0xYRHJhd2FibGUgZHJhd2FibGU7CS8qIGRyYXdhYmxlIG9uIHdoaWNoIGV2ZW50IHdhcyByZXF1ZXN0ZWQgaW4gZXZlbnQgbWFzayAqLworICAgIGludCBldmVudF90eXBlOworICAgIGludDY0X3QgdXN0OworICAgIGludDY0X3QgbXNjOworICAgIGludDY0X3Qgc2JjOworfSBHTFhCdWZmZXJTd2FwQ29tcGxldGU7CisKK3R5cGVkZWYgdW5pb24gX19HTFhFdmVudCB7CisgICAgR0xYUGJ1ZmZlckNsb2JiZXJFdmVudCBnbHhwYnVmZmVyY2xvYmJlcjsKKyAgICBHTFhCdWZmZXJTd2FwQ29tcGxldGUgZ2x4YnVmZmVyc3dhcGNvbXBsZXRlOworICAgIGxvbmcgcGFkWzI0XTsKK30gR0xYRXZlbnQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbHhfbWFuZ2xlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL0dML2dseF9tYW5nbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTY2NGE3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbHhfbWFuZ2xlLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqIFZlcnNpb246ICA2LjUKKyAqIAorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDYgIEJyaWFuIFBhdWwgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogQlJJQU4gUEFVTCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBHTFhfTUFOR0xFX0gKKyNkZWZpbmUgR0xYX01BTkdMRV9ICisKKyNkZWZpbmUgZ2xYQ2hvb3NlVmlzdWFsIG1nbFhDaG9vc2VWaXN1YWwKKyNkZWZpbmUgZ2xYQ3JlYXRlQ29udGV4dCBtZ2xYQ3JlYXRlQ29udGV4dAorI2RlZmluZSBnbFhEZXN0cm95Q29udGV4dCBtZ2xYRGVzdHJveUNvbnRleHQKKyNkZWZpbmUgZ2xYTWFrZUN1cnJlbnQgbWdsWE1ha2VDdXJyZW50CisjZGVmaW5lIGdsWENvcHlDb250ZXh0IG1nbFhDb3B5Q29udGV4dAorI2RlZmluZSBnbFhTd2FwQnVmZmVycyBtZ2xYU3dhcEJ1ZmZlcnMKKyNkZWZpbmUgZ2xYQ3JlYXRlR0xYUGl4bWFwIG1nbFhDcmVhdGVHTFhQaXhtYXAKKyNkZWZpbmUgZ2xYRGVzdHJveUdMWFBpeG1hcCBtZ2xYRGVzdHJveUdMWFBpeG1hcAorI2RlZmluZSBnbFhRdWVyeUV4dGVuc2lvbiBtZ2xYUXVlcnlFeHRlbnNpb24KKyNkZWZpbmUgZ2xYUXVlcnlWZXJzaW9uIG1nbFhRdWVyeVZlcnNpb24KKyNkZWZpbmUgZ2xYSXNEaXJlY3QgbWdsWElzRGlyZWN0CisjZGVmaW5lIGdsWEdldENvbmZpZyBtZ2xYR2V0Q29uZmlnCisjZGVmaW5lIGdsWEdldEN1cnJlbnRDb250ZXh0IG1nbFhHZXRDdXJyZW50Q29udGV4dAorI2RlZmluZSBnbFhHZXRDdXJyZW50RHJhd2FibGUgbWdsWEdldEN1cnJlbnREcmF3YWJsZQorI2RlZmluZSBnbFhXYWl0R0wgbWdsWFdhaXRHTAorI2RlZmluZSBnbFhXYWl0WCBtZ2xYV2FpdFgKKyNkZWZpbmUgZ2xYVXNlWEZvbnQgbWdsWFVzZVhGb250CisjZGVmaW5lIGdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyBtZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nCisjZGVmaW5lIGdsWFF1ZXJ5U2VydmVyU3RyaW5nIG1nbFhRdWVyeVNlcnZlclN0cmluZworI2RlZmluZSBnbFhHZXRDbGllbnRTdHJpbmcgbWdsWEdldENsaWVudFN0cmluZworI2RlZmluZSBnbFhDcmVhdGVHTFhQaXhtYXBNRVNBIG1nbFhDcmVhdGVHTFhQaXhtYXBNRVNBCisjZGVmaW5lIGdsWFJlbGVhc2VCdWZmZXJzTUVTQSBtZ2xYUmVsZWFzZUJ1ZmZlcnNNRVNBCisjZGVmaW5lIGdsWENvcHlTdWJCdWZmZXJNRVNBIG1nbFhDb3B5U3ViQnVmZmVyTUVTQQorI2RlZmluZSBnbFhHZXRWaWRlb1N5bmNTR0kgbWdsWEdldFZpZGVvU3luY1NHSQorI2RlZmluZSBnbFhXYWl0VmlkZW9TeW5jU0dJIG1nbFhXYWl0VmlkZW9TeW5jU0dJCisKKy8qIEdMWCAxLjIgKi8KKyNkZWZpbmUgZ2xYR2V0Q3VycmVudERpc3BsYXkgbWdsWEdldEN1cnJlbnREaXNwbGF5IAorCisvKiBHTFggMS4zICovCisjZGVmaW5lIGdsWENob29zZUZCQ29uZmlnIG1nbFhDaG9vc2VGQkNvbmZpZyAgICAgICAgICAKKyNkZWZpbmUgZ2xYR2V0RkJDb25maWdBdHRyaWIgbWdsWEdldEZCQ29uZmlnQXR0cmliICAgICAgIAorI2RlZmluZSBnbFhHZXRGQkNvbmZpZ3MgbWdsWEdldEZCQ29uZmlncyAgICAgICAgICAgIAorI2RlZmluZSBnbFhHZXRWaXN1YWxGcm9tRkJDb25maWcgbWdsWEdldFZpc3VhbEZyb21GQkNvbmZpZyAgIAorI2RlZmluZSBnbFhDcmVhdGVXaW5kb3cgbWdsWENyZWF0ZVdpbmRvdyAgICAgICAgICAgIAorI2RlZmluZSBnbFhEZXN0cm95V2luZG93IG1nbFhEZXN0cm95V2luZG93ICAgICAgICAgICAKKyNkZWZpbmUgZ2xYQ3JlYXRlUGl4bWFwIG1nbFhDcmVhdGVQaXhtYXAgICAgICAgICAgICAKKyNkZWZpbmUgZ2xYRGVzdHJveVBpeG1hcCBtZ2xYRGVzdHJveVBpeG1hcCAgICAgICAgICAgCisjZGVmaW5lIGdsWENyZWF0ZVBidWZmZXIgbWdsWENyZWF0ZVBidWZmZXIgICAgICAgICAgIAorI2RlZmluZSBnbFhEZXN0cm95UGJ1ZmZlciBtZ2xYRGVzdHJveVBidWZmZXIgICAgICAgICAgCisjZGVmaW5lIGdsWFF1ZXJ5RHJhd2FibGUgbWdsWFF1ZXJ5RHJhd2FibGUgICAgICAgICAgIAorI2RlZmluZSBnbFhDcmVhdGVOZXdDb250ZXh0IG1nbFhDcmVhdGVOZXdDb250ZXh0ICAgICAgICAKKyNkZWZpbmUgZ2xYTWFrZUNvbnRleHRDdXJyZW50IG1nbFhNYWtlQ29udGV4dEN1cnJlbnQgICAgICAKKyNkZWZpbmUgZ2xYR2V0Q3VycmVudFJlYWREcmF3YWJsZSBtZ2xYR2V0Q3VycmVudFJlYWREcmF3YWJsZSAgCisjZGVmaW5lIGdsWFF1ZXJ5Q29udGV4dCBtZ2xYUXVlcnlDb250ZXh0ICAgICAgICAgICAgCisjZGVmaW5lIGdsWFNlbGVjdEV2ZW50IG1nbFhTZWxlY3RFdmVudCAgICAgICAgICAgICAKKyNkZWZpbmUgZ2xYR2V0U2VsZWN0ZWRFdmVudCBtZ2xYR2V0U2VsZWN0ZWRFdmVudCAgICAKKworLyogR0xYIDEuNCAqLworI2RlZmluZSBnbFhHZXRQcm9jQWRkcmVzcyBtZ2xYR2V0UHJvY0FkZHJlc3MKKyNkZWZpbmUgZ2xYR2V0UHJvY0FkZHJlc3NBUkIgbWdsWEdldFByb2NBZGRyZXNzQVJCCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL0dML2dseGV4dC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbHhleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzQ3ZGMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbHhleHQuaApAQCAtMCwwICsxLDk5MyBAQAorI2lmbmRlZiBfX2dseGV4dF9oXworI2RlZmluZSBfX2dseGV4dF9oXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKiAKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKiAKKyoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisqKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCisqKiAKKyoqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyoqIE1BVEVSSUFMUyBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCisqLworCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbiBtYWNyb3MgLSB0byBtb3ZlIGludG8gZ2xwbGF0Zm9ybS5oICovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoQVBJRU5UUlkpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIEFQSUVOVFJZCisjZGVmaW5lIEFQSUVOVFJZCisjZW5kaWYKKyNpZm5kZWYgQVBJRU5UUllQCisjZGVmaW5lIEFQSUVOVFJZUCBBUElFTlRSWSAqCisjZW5kaWYKKyNpZm5kZWYgR0xBUEkKKyNkZWZpbmUgR0xBUEkgZXh0ZXJuCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhlYWRlciBmaWxlIHZlcnNpb24gbnVtYmVyLCByZXF1aXJlZCBieSBPcGVuR0wgQUJJIGZvciBMaW51eCAqLworLyogZ2x4ZXh0LmggbGFzdCB1cGRhdGVkIDIwMTAvMDgvMDYgKi8KKy8qIEN1cnJlbnQgdmVyc2lvbiBhdCBodHRwOi8vd3d3Lm9wZW5nbC5vcmcvcmVnaXN0cnkvICovCisjZGVmaW5lIEdMWF9HTFhFWFRfVkVSU0lPTiAzMgorCisjaWZuZGVmIEdMWF9WRVJTSU9OXzFfMworI2RlZmluZSBHTFhfV0lORE9XX0JJVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xYX1BJWE1BUF9CSVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdMWF9QQlVGRkVSX0JJVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTFhfUkdCQV9CSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xYX0NPTE9SX0lOREVYX0JJVCAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdMWF9QQlVGRkVSX0NMT0JCRVJfTUFTSyAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBHTFhfRlJPTlRfTEVGVF9CVUZGRVJfQklUICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xYX0ZST05UX1JJR0hUX0JVRkZFUl9CSVQgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdMWF9CQUNLX0xFRlRfQlVGRkVSX0JJVCAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTFhfQkFDS19SSUdIVF9CVUZGRVJfQklUICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgR0xYX0FVWF9CVUZGRVJTX0JJVCAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEdMWF9ERVBUSF9CVUZGRVJfQklUICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBHTFhfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgR0xYX0FDQ1VNX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEdMWF9DT05GSUdfQ0FWRUFUICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBHTFhfWF9WSVNVQUxfVFlQRSAgICAgICAgICAgICAgICAgIDB4MjIKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX1RZUEUgICAgICAgICAgICAgICAweDIzCisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9JTkRFWF9WQUxVRSAgICAgICAgMHgyNAorI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFICAgICAgICAgIDB4MjUKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFICAgICAgICAweDI2CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFICAgICAgICAgMHgyNworI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfQUxQSEFfVkFMVUUgICAgICAgIDB4MjgKKyNkZWZpbmUgR0xYX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCisjZGVmaW5lIEdMWF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIEdMWF9TTE9XX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgMHg4MDAxCisjZGVmaW5lIEdMWF9UUlVFX0NPTE9SICAgICAgICAgICAgICAgICAgICAgMHg4MDAyCisjZGVmaW5lIEdMWF9ESVJFQ1RfQ09MT1IgICAgICAgICAgICAgICAgICAgMHg4MDAzCisjZGVmaW5lIEdMWF9QU0VVRE9fQ09MT1IgICAgICAgICAgICAgICAgICAgMHg4MDA0CisjZGVmaW5lIEdMWF9TVEFUSUNfQ09MT1IgICAgICAgICAgICAgICAgICAgMHg4MDA1CisjZGVmaW5lIEdMWF9HUkFZX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMHg4MDA2CisjZGVmaW5lIEdMWF9TVEFUSUNfR1JBWSAgICAgICAgICAgICAgICAgICAgMHg4MDA3CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9SR0IgICAgICAgICAgICAgICAgMHg4MDA4CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9JTkRFWCAgICAgICAgICAgICAgMHg4MDA5CisjZGVmaW5lIEdMWF9WSVNVQUxfSUQgICAgICAgICAgICAgICAgICAgICAgMHg4MDBCCisjZGVmaW5lIEdMWF9TQ1JFRU4gICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDBDCisjZGVmaW5lIEdMWF9OT05fQ09ORk9STUFOVF9DT05GSUcgICAgICAgICAgMHg4MDBECisjZGVmaW5lIEdMWF9EUkFXQUJMRV9UWVBFICAgICAgICAgICAgICAgICAgMHg4MDEwCisjZGVmaW5lIEdMWF9SRU5ERVJfVFlQRSAgICAgICAgICAgICAgICAgICAgMHg4MDExCisjZGVmaW5lIEdMWF9YX1JFTkRFUkFCTEUgICAgICAgICAgICAgICAgICAgMHg4MDEyCisjZGVmaW5lIEdMWF9GQkNPTkZJR19JRCAgICAgICAgICAgICAgICAgICAgMHg4MDEzCisjZGVmaW5lIEdMWF9SR0JBX1RZUEUgICAgICAgICAgICAgICAgICAgICAgMHg4MDE0CisjZGVmaW5lIEdMWF9DT0xPUl9JTkRFWF9UWVBFICAgICAgICAgICAgICAgMHg4MDE1CisjZGVmaW5lIEdMWF9NQVhfUEJVRkZFUl9XSURUSCAgICAgICAgICAgICAgMHg4MDE2CisjZGVmaW5lIEdMWF9NQVhfUEJVRkZFUl9IRUlHSFQgICAgICAgICAgICAgMHg4MDE3CisjZGVmaW5lIEdMWF9NQVhfUEJVRkZFUl9QSVhFTFMgICAgICAgICAgICAgMHg4MDE4CisjZGVmaW5lIEdMWF9QUkVTRVJWRURfQ09OVEVOVFMgICAgICAgICAgICAgMHg4MDFCCisjZGVmaW5lIEdMWF9MQVJHRVNUX1BCVUZGRVIgICAgICAgICAgICAgICAgMHg4MDFDCisjZGVmaW5lIEdMWF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDFECisjZGVmaW5lIEdMWF9IRUlHSFQgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDFFCisjZGVmaW5lIEdMWF9FVkVOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHg4MDFGCisjZGVmaW5lIEdMWF9EQU1BR0VEICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDIwCisjZGVmaW5lIEdMWF9TQVZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDIxCisjZGVmaW5lIEdMWF9XSU5ET1cgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDIyCisjZGVmaW5lIEdMWF9QQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDIzCisjZGVmaW5lIEdMWF9QQlVGRkVSX0hFSUdIVCAgICAgICAgICAgICAgICAgMHg4MDQwCisjZGVmaW5lIEdMWF9QQlVGRkVSX1dJRFRIICAgICAgICAgICAgICAgICAgMHg4MDQxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfVkVSU0lPTl8xXzQKKyNkZWZpbmUgR0xYX1NBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAgICAxMDAwMDAKKyNkZWZpbmUgR0xYX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9BUkJfZ2V0X3Byb2NfYWRkcmVzcworI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl9tdWx0aXNhbXBsZQorI2RlZmluZSBHTFhfU0FNUExFX0JVRkZFUlNfQVJCICAgICAgICAgICAgIDEwMDAwMAorI2RlZmluZSBHTFhfU0FNUExFU19BUkIgICAgICAgICAgICAgICAgICAgIDEwMDAwMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTFhfQ09OVEVYVF9BTExPV19CVUZGRVJfQllURV9PUkRFUl9NSVNNQVRDSF9BUkIgMHgyMDk1CisjZW5kaWYKKworI2lmbmRlZiBHTFhfQVJCX2ZiY29uZmlnX2Zsb2F0CisjZGVmaW5lIEdMWF9SR0JBX0ZMT0FUX1RZUEVfQVJCICAgICAgICAgICAgMHgyMEI5CisjZGVmaW5lIEdMWF9SR0JBX0ZMT0FUX0JJVF9BUkIgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl9mcmFtZWJ1ZmZlcl9zUkdCCisjZGVmaW5lIEdMWF9GUkFNRUJVRkZFUl9TUkdCX0NBUEFCTEVfQVJCICAgMHgyMEIyCisjZW5kaWYKKworI2lmbmRlZiBHTFhfQVJCX2NyZWF0ZV9jb250ZXh0CisjZGVmaW5lIEdMWF9DT05URVhUX0RFQlVHX0JJVF9BUkIgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTFhfQ09OVEVYVF9GT1JXQVJEX0NPTVBBVElCTEVfQklUX0FSQiAweDAwMDAwMDAyCisjZGVmaW5lIEdMWF9DT05URVhUX01BSk9SX1ZFUlNJT05fQVJCICAgICAgMHgyMDkxCisjZGVmaW5lIEdMWF9DT05URVhUX01JTk9SX1ZFUlNJT05fQVJCICAgICAgMHgyMDkyCisjZGVmaW5lIEdMWF9DT05URVhUX0ZMQUdTX0FSQiAgICAgICAgICAgICAgMHgyMDk0CisjZW5kaWYKKworI2lmbmRlZiBHTFhfQVJCX2NyZWF0ZV9jb250ZXh0X3Byb2ZpbGUKKyNkZWZpbmUgR0xYX0NPTlRFWFRfQ09SRV9QUk9GSUxFX0JJVF9BUkIgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9DT05URVhUX0NPTVBBVElCSUxJVFlfUFJPRklMRV9CSVRfQVJCIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX0NPTlRFWFRfUFJPRklMRV9NQVNLX0FSQiAgICAgICAweDkxMjYKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9BUkJfY3JlYXRlX2NvbnRleHRfcm9idXN0bmVzcworI2RlZmluZSBHTFhfQ09OVEVYVF9ST0JVU1RfQUNDRVNTX0JJVF9BUkIgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xYX0xPU0VfQ09OVEVYVF9PTl9SRVNFVF9BUkIgICAgICAweDgyNTIKKyNkZWZpbmUgR0xYX0NPTlRFWFRfUkVTRVRfTk9USUZJQ0FUSU9OX1NUUkFURUdZX0FSQiAweDgyNTYKKyNkZWZpbmUgR0xYX05PX1JFU0VUX05PVElGSUNBVElPTl9BUkIgICAgICAweDgyNjEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lTX211bHRpc2FtcGxlCisjZGVmaW5lIEdMWF9TQU1QTEVfQlVGRkVSU19TR0lTICAgICAgICAgICAgMTAwMDAwCisjZGVmaW5lIEdMWF9TQU1QTEVTX1NHSVMgICAgICAgICAgICAgICAgICAgMTAwMDAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX3Zpc3VhbF9pbmZvCisjZGVmaW5lIEdMWF9YX1ZJU1VBTF9UWVBFX0VYVCAgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfVFlQRV9FWFQgICAgICAgICAgIDB4MjMKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFX0VYVCAgICAweDI0CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9SRURfVkFMVUVfRVhUICAgICAgMHgyNQorI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUVfRVhUICAgIDB4MjYKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUVfRVhUICAgICAweDI3CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9BTFBIQV9WQUxVRV9FWFQgICAgMHgyOAorI2RlZmluZSBHTFhfTk9ORV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBHTFhfVFJVRV9DT0xPUl9FWFQgICAgICAgICAgICAgICAgIDB4ODAwMgorI2RlZmluZSBHTFhfRElSRUNUX0NPTE9SX0VYVCAgICAgICAgICAgICAgIDB4ODAwMworI2RlZmluZSBHTFhfUFNFVURPX0NPTE9SX0VYVCAgICAgICAgICAgICAgIDB4ODAwNAorI2RlZmluZSBHTFhfU1RBVElDX0NPTE9SX0VYVCAgICAgICAgICAgICAgIDB4ODAwNQorI2RlZmluZSBHTFhfR1JBWV9TQ0FMRV9FWFQgICAgICAgICAgICAgICAgIDB4ODAwNgorI2RlZmluZSBHTFhfU1RBVElDX0dSQVlfRVhUICAgICAgICAgICAgICAgIDB4ODAwNworI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfUkdCX0VYVCAgICAgICAgICAgIDB4ODAwOAorI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfSU5ERVhfRVhUICAgICAgICAgIDB4ODAwOQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSV9zd2FwX2NvbnRyb2wKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lfdmlkZW9fc3luYworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSV9tYWtlX2N1cnJlbnRfcmVhZAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfdmlkZW9fc291cmNlCisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX3Zpc3VhbF9yYXRpbmcKKyNkZWZpbmUgR0xYX1ZJU1VBTF9DQVZFQVRfRVhUICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIEdMWF9TTE9XX1ZJU1VBTF9FWFQgICAgICAgICAgICAgICAgMHg4MDAxCisjZGVmaW5lIEdMWF9OT05fQ09ORk9STUFOVF9WSVNVQUxfRVhUICAgICAgMHg4MDBECisvKiByZXVzZSBHTFhfTk9ORV9FWFQgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMWF9FWFRfaW1wb3J0X2NvbnRleHQKKyNkZWZpbmUgR0xYX1NIQVJFX0NPTlRFWFRfRVhUICAgICAgICAgICAgICAweDgwMEEKKyNkZWZpbmUgR0xYX1ZJU1VBTF9JRF9FWFQgICAgICAgICAgICAgICAgICAweDgwMEIKKyNkZWZpbmUgR0xYX1NDUkVFTl9FWFQgICAgICAgICAgICAgICAgICAgICAweDgwMEMKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX2ZiY29uZmlnCisjZGVmaW5lIEdMWF9XSU5ET1dfQklUX1NHSVggICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTFhfUElYTUFQX0JJVF9TR0lYICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX1JHQkFfQklUX1NHSVggICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9DT0xPUl9JTkRFWF9CSVRfU0dJWCAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfRFJBV0FCTEVfVFlQRV9TR0lYICAgICAgICAgICAgIDB4ODAxMAorI2RlZmluZSBHTFhfUkVOREVSX1RZUEVfU0dJWCAgICAgICAgICAgICAgIDB4ODAxMQorI2RlZmluZSBHTFhfWF9SRU5ERVJBQkxFX1NHSVggICAgICAgICAgICAgIDB4ODAxMgorI2RlZmluZSBHTFhfRkJDT05GSUdfSURfU0dJWCAgICAgICAgICAgICAgIDB4ODAxMworI2RlZmluZSBHTFhfUkdCQV9UWVBFX1NHSVggICAgICAgICAgICAgICAgIDB4ODAxNAorI2RlZmluZSBHTFhfQ09MT1JfSU5ERVhfVFlQRV9TR0lYICAgICAgICAgIDB4ODAxNQorLyogcmV1c2UgR0xYX1NDUkVFTl9FWFQgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3BidWZmZXIKKyNkZWZpbmUgR0xYX1BCVUZGRVJfQklUX1NHSVggICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEdMWF9CVUZGRVJfQ0xPQkJFUl9NQVNLX1NHSVggICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBHTFhfRlJPTlRfTEVGVF9CVUZGRVJfQklUX1NHSVggICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xYX0ZST05UX1JJR0hUX0JVRkZFUl9CSVRfU0dJWCAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdMWF9CQUNLX0xFRlRfQlVGRkVSX0JJVF9TR0lYICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTFhfQkFDS19SSUdIVF9CVUZGRVJfQklUX1NHSVggICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgR0xYX0FVWF9CVUZGRVJTX0JJVF9TR0lYICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEdMWF9ERVBUSF9CVUZGRVJfQklUX1NHSVggICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBHTFhfU1RFTkNJTF9CVUZGRVJfQklUX1NHSVggICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgR0xYX0FDQ1VNX0JVRkZFUl9CSVRfU0dJWCAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEdMWF9TQU1QTEVfQlVGRkVSU19CSVRfU0dJWCAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBHTFhfTUFYX1BCVUZGRVJfV0lEVEhfU0dJWCAgICAgICAgIDB4ODAxNgorI2RlZmluZSBHTFhfTUFYX1BCVUZGRVJfSEVJR0hUX1NHSVggICAgICAgIDB4ODAxNworI2RlZmluZSBHTFhfTUFYX1BCVUZGRVJfUElYRUxTX1NHSVggICAgICAgIDB4ODAxOAorI2RlZmluZSBHTFhfT1BUSU1BTF9QQlVGRkVSX1dJRFRIX1NHSVggICAgIDB4ODAxOQorI2RlZmluZSBHTFhfT1BUSU1BTF9QQlVGRkVSX0hFSUdIVF9TR0lYICAgIDB4ODAxQQorI2RlZmluZSBHTFhfUFJFU0VSVkVEX0NPTlRFTlRTX1NHSVggICAgICAgIDB4ODAxQgorI2RlZmluZSBHTFhfTEFSR0VTVF9QQlVGRkVSX1NHSVggICAgICAgICAgIDB4ODAxQworI2RlZmluZSBHTFhfV0lEVEhfU0dJWCAgICAgICAgICAgICAgICAgICAgIDB4ODAxRAorI2RlZmluZSBHTFhfSEVJR0hUX1NHSVggICAgICAgICAgICAgICAgICAgIDB4ODAxRQorI2RlZmluZSBHTFhfRVZFTlRfTUFTS19TR0lYICAgICAgICAgICAgICAgIDB4ODAxRgorI2RlZmluZSBHTFhfREFNQUdFRF9TR0lYICAgICAgICAgICAgICAgICAgIDB4ODAyMAorI2RlZmluZSBHTFhfU0FWRURfU0dJWCAgICAgICAgICAgICAgICAgICAgIDB4ODAyMQorI2RlZmluZSBHTFhfV0lORE9XX1NHSVggICAgICAgICAgICAgICAgICAgIDB4ODAyMgorI2RlZmluZSBHTFhfUEJVRkZFUl9TR0lYICAgICAgICAgICAgICAgICAgIDB4ODAyMworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSV9jdXNoaW9uCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF92aWRlb19yZXNpemUKKyNkZWZpbmUgR0xYX1NZTkNfRlJBTUVfU0dJWCAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEdMWF9TWU5DX1NXQVBfU0dJWCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfZG1idWZmZXIKKyNkZWZpbmUgR0xYX0RJR0lUQUxfTUVESUFfUEJVRkZFUl9TR0lYICAgICAweDgwMjQKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3N3YXBfZ3JvdXAKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3N3YXBfYmFycmllcgorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVNfYmxlbmRlZF9vdmVybGF5CisjZGVmaW5lIEdMWF9CTEVOREVEX1JHQkFfU0dJUyAgICAgICAgICAgICAgMHg4MDI1CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJU19zaGFyZWRfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xYX01VTFRJU0FNUExFX1NVQl9SRUNUX1dJRFRIX1NHSVMgMHg4MDI2CisjZGVmaW5lIEdMWF9NVUxUSVNBTVBMRV9TVUJfUkVDVF9IRUlHSFRfU0dJUyAweDgwMjcKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TVU5fZ2V0X3RyYW5zcGFyZW50X2luZGV4CisjZW5kaWYKKworI2lmbmRlZiBHTFhfM0RGWF9tdWx0aXNhbXBsZQorI2RlZmluZSBHTFhfU0FNUExFX0JVRkZFUlNfM0RGWCAgICAgICAgICAgIDB4ODA1MAorI2RlZmluZSBHTFhfU0FNUExFU18zREZYICAgICAgICAgICAgICAgICAgIDB4ODA1MQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX01FU0FfY29weV9zdWJfYnVmZmVyCisjZW5kaWYKKworI2lmbmRlZiBHTFhfTUVTQV9waXhtYXBfY29sb3JtYXAKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9NRVNBX3JlbGVhc2VfYnVmZmVycworI2VuZGlmCisKKyNpZm5kZWYgR0xYX01FU0Ffc2V0XzNkZnhfbW9kZQorI2RlZmluZSBHTFhfM0RGWF9XSU5ET1dfTU9ERV9NRVNBICAgICAgICAgIDB4MQorI2RlZmluZSBHTFhfM0RGWF9GVUxMU0NSRUVOX01PREVfTUVTQSAgICAgIDB4MgorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfdmlzdWFsX3NlbGVjdF9ncm91cAorI2RlZmluZSBHTFhfVklTVUFMX1NFTEVDVF9HUk9VUF9TR0lYICAgICAgIDB4ODAyOAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX09NTF9zd2FwX21ldGhvZAorI2RlZmluZSBHTFhfU1dBUF9NRVRIT0RfT01MICAgICAgICAgICAgICAgIDB4ODA2MAorI2RlZmluZSBHTFhfU1dBUF9FWENIQU5HRV9PTUwgICAgICAgICAgICAgIDB4ODA2MQorI2RlZmluZSBHTFhfU1dBUF9DT1BZX09NTCAgICAgICAgICAgICAgICAgIDB4ODA2MgorI2RlZmluZSBHTFhfU1dBUF9VTkRFRklORURfT01MICAgICAgICAgICAgIDB4ODA2MworI2VuZGlmCisKKyNpZm5kZWYgR0xYX09NTF9zeW5jX2NvbnRyb2wKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl9mbG9hdF9idWZmZXIKKyNkZWZpbmUgR0xYX0ZMT0FUX0NPTVBPTkVOVFNfTlYgICAgICAgICAgICAweDIwQjAKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX2h5cGVycGlwZQorI2RlZmluZSBHTFhfSFlQRVJQSVBFX1BJUEVfTkFNRV9MRU5HVEhfU0dJWCA4MAorI2RlZmluZSBHTFhfQkFEX0hZUEVSUElQRV9DT05GSUdfU0dJWCAgICAgIDkxCisjZGVmaW5lIEdMWF9CQURfSFlQRVJQSVBFX1NHSVggICAgICAgICAgICAgOTIKKyNkZWZpbmUgR0xYX0hZUEVSUElQRV9ESVNQTEFZX1BJUEVfU0dJWCAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9IWVBFUlBJUEVfUkVOREVSX1BJUEVfU0dJWCAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfUElQRV9SRUNUX1NHSVggICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xYX1BJUEVfUkVDVF9MSU1JVFNfU0dJWCAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdMWF9IWVBFUlBJUEVfU1RFUkVPX1NHSVggICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBHTFhfSFlQRVJQSVBFX1BJWEVMX0FWRVJBR0VfU0dJWCAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xYX0hZUEVSUElQRV9JRF9TR0lYICAgICAgICAgICAgICAweDgwMzAKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9NRVNBX2FncF9vZmZzZXQKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9FWFRfZmJjb25maWdfcGFja2VkX2Zsb2F0CisjZGVmaW5lIEdMWF9SR0JBX1VOU0lHTkVEX0ZMT0FUX1RZUEVfRVhUICAgMHgyMEIxCisjZGVmaW5lIEdMWF9SR0JBX1VOU0lHTkVEX0ZMT0FUX0JJVF9FWFQgICAgMHgwMDAwMDAwOAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF9mcmFtZWJ1ZmZlcl9zUkdCCisjZGVmaW5lIEdMWF9GUkFNRUJVRkZFUl9TUkdCX0NBUEFCTEVfRVhUICAgMHgyMEIyCisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX3RleHR1cmVfZnJvbV9waXhtYXAKKyNkZWZpbmUgR0xYX1RFWFRVUkVfMURfQklUX0VYVCAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9URVhUVVJFXzJEX0JJVF9FWFQgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfVEVYVFVSRV9SRUNUQU5HTEVfQklUX0VYVCAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xYX0JJTkRfVE9fVEVYVFVSRV9SR0JfRVhUICAgICAgICAweDIwRDAKKyNkZWZpbmUgR0xYX0JJTkRfVE9fVEVYVFVSRV9SR0JBX0VYVCAgICAgICAweDIwRDEKKyNkZWZpbmUgR0xYX0JJTkRfVE9fTUlQTUFQX1RFWFRVUkVfRVhUICAgICAweDIwRDIKKyNkZWZpbmUgR0xYX0JJTkRfVE9fVEVYVFVSRV9UQVJHRVRTX0VYVCAgICAweDIwRDMKKyNkZWZpbmUgR0xYX1lfSU5WRVJURURfRVhUICAgICAgICAgICAgICAgICAweDIwRDQKKyNkZWZpbmUgR0xYX1RFWFRVUkVfRk9STUFUX0VYVCAgICAgICAgICAgICAweDIwRDUKKyNkZWZpbmUgR0xYX1RFWFRVUkVfVEFSR0VUX0VYVCAgICAgICAgICAgICAweDIwRDYKKyNkZWZpbmUgR0xYX01JUE1BUF9URVhUVVJFX0VYVCAgICAgICAgICAgICAweDIwRDcKKyNkZWZpbmUgR0xYX1RFWFRVUkVfRk9STUFUX05PTkVfRVhUICAgICAgICAweDIwRDgKKyNkZWZpbmUgR0xYX1RFWFRVUkVfRk9STUFUX1JHQl9FWFQgICAgICAgICAweDIwRDkKKyNkZWZpbmUgR0xYX1RFWFRVUkVfRk9STUFUX1JHQkFfRVhUICAgICAgICAweDIwREEKKyNkZWZpbmUgR0xYX1RFWFRVUkVfMURfRVhUICAgICAgICAgICAgICAgICAweDIwREIKKyNkZWZpbmUgR0xYX1RFWFRVUkVfMkRfRVhUICAgICAgICAgICAgICAgICAweDIwREMKKyNkZWZpbmUgR0xYX1RFWFRVUkVfUkVDVEFOR0xFX0VYVCAgICAgICAgICAweDIwREQKKyNkZWZpbmUgR0xYX0ZST05UX0xFRlRfRVhUICAgICAgICAgICAgICAgICAweDIwREUKKyNkZWZpbmUgR0xYX0ZST05UX1JJR0hUX0VYVCAgICAgICAgICAgICAgICAweDIwREYKKyNkZWZpbmUgR0xYX0JBQ0tfTEVGVF9FWFQgICAgICAgICAgICAgICAgICAweDIwRTAKKyNkZWZpbmUgR0xYX0JBQ0tfUklHSFRfRVhUICAgICAgICAgICAgICAgICAweDIwRTEKKyNkZWZpbmUgR0xYX0ZST05UX0VYVCAgICAgICAgICAgICAgICAgICAgICBHTFhfRlJPTlRfTEVGVF9FWFQKKyNkZWZpbmUgR0xYX0JBQ0tfRVhUICAgICAgICAgICAgICAgICAgICAgICBHTFhfQkFDS19MRUZUX0VYVAorI2RlZmluZSBHTFhfQVVYMF9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFMgorI2RlZmluZSBHTFhfQVVYMV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFMworI2RlZmluZSBHTFhfQVVYMl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFNAorI2RlZmluZSBHTFhfQVVYM19FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFNQorI2RlZmluZSBHTFhfQVVYNF9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFNgorI2RlZmluZSBHTFhfQVVYNV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFNworI2RlZmluZSBHTFhfQVVYNl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFOAorI2RlZmluZSBHTFhfQVVYN19FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFOQorI2RlZmluZSBHTFhfQVVYOF9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFQQorI2RlZmluZSBHTFhfQVVYOV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFQgorI2VuZGlmCisKKyNpZm5kZWYgR0xYX05WX3ByZXNlbnRfdmlkZW8KKyNkZWZpbmUgR0xYX05VTV9WSURFT19TTE9UU19OViAgICAgICAgICAgICAweDIwRjAKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl92aWRlb19vdXQKKyNkZWZpbmUgR0xYX1ZJREVPX09VVF9DT0xPUl9OViAgICAgICAgICAgICAweDIwQzMKKyNkZWZpbmUgR0xYX1ZJREVPX09VVF9BTFBIQV9OViAgICAgICAgICAgICAweDIwQzQKKyNkZWZpbmUgR0xYX1ZJREVPX09VVF9ERVBUSF9OViAgICAgICAgICAgICAweDIwQzUKKyNkZWZpbmUgR0xYX1ZJREVPX09VVF9DT0xPUl9BTkRfQUxQSEFfTlYgICAweDIwQzYKKyNkZWZpbmUgR0xYX1ZJREVPX09VVF9DT0xPUl9BTkRfREVQVEhfTlYgICAweDIwQzcKKyNkZWZpbmUgR0xYX1ZJREVPX09VVF9GUkFNRV9OViAgICAgICAgICAgICAweDIwQzgKKyNkZWZpbmUgR0xYX1ZJREVPX09VVF9GSUVMRF8xX05WICAgICAgICAgICAweDIwQzkKKyNkZWZpbmUgR0xYX1ZJREVPX09VVF9GSUVMRF8yX05WICAgICAgICAgICAweDIwQ0EKKyNkZWZpbmUgR0xYX1ZJREVPX09VVF9TVEFDS0VEX0ZJRUxEU18xXzJfTlYgMHgyMENCCisjZGVmaW5lIEdMWF9WSURFT19PVVRfU1RBQ0tFRF9GSUVMRFNfMl8xX05WIDB4MjBDQworI2VuZGlmCisKKyNpZm5kZWYgR0xYX05WX3N3YXBfZ3JvdXAKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl92aWRlb19jYXB0dXJlCisjZGVmaW5lIEdMWF9ERVZJQ0VfSURfTlYgICAgICAgICAgICAgICAgICAgMHgyMENECisjZGVmaW5lIEdMWF9VTklRVUVfSURfTlYgICAgICAgICAgICAgICAgICAgMHgyMENFCisjZGVmaW5lIEdMWF9OVU1fVklERU9fQ0FQVFVSRV9TTE9UU19OViAgICAgMHgyMENGCisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX3N3YXBfY29udHJvbAorI2RlZmluZSBHTFhfU1dBUF9JTlRFUlZBTF9FWFQgICAgICAgICAgICAgIDB4MjBGMQorI2RlZmluZSBHTFhfTUFYX1NXQVBfSU5URVJWQUxfRVhUICAgICAgICAgIDB4MjBGMgorI2VuZGlmCisKKyNpZm5kZWYgR0xYX05WX2NvcHlfaW1hZ2UKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9JTlRFTF9zd2FwX2V2ZW50CisjZGVmaW5lIEdMWF9CVUZGRVJfU1dBUF9DT01QTEVURV9JTlRFTF9NQVNLIDB4MDQwMDAwMDAKKyNkZWZpbmUgR0xYX0VYQ0hBTkdFX0NPTVBMRVRFX0lOVEVMICAgICAgICAweDgxODAKKyNkZWZpbmUgR0xYX0NPUFlfQ09NUExFVEVfSU5URUwgICAgICAgICAgICAweDgxODEKKyNkZWZpbmUgR0xYX0ZMSVBfQ09NUExFVEVfSU5URUwgICAgICAgICAgICAweDgxODIKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl9tdWx0aXNhbXBsZV9jb3ZlcmFnZQorI2RlZmluZSBHTFhfQ09WRVJBR0VfU0FNUExFU19OViAgICAgICAgICAgIDEwMDAwMQorI2RlZmluZSBHTFhfQ09MT1JfU0FNUExFU19OViAgICAgICAgICAgICAgIDB4MjBCMworI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FNRF9ncHVfYXNzb2NpYXRpb24KKyNkZWZpbmUgR0xYX0dQVV9WRU5ET1JfQU1EICAgICAgICAgICAgICAgICAweDFGMDAKKyNkZWZpbmUgR0xYX0dQVV9SRU5ERVJFUl9TVFJJTkdfQU1EICAgICAgICAweDFGMDEKKyNkZWZpbmUgR0xYX0dQVV9PUEVOR0xfVkVSU0lPTl9TVFJJTkdfQU1EICAweDFGMDIKKyNkZWZpbmUgR0xYX0dQVV9GQVNURVNUX1RBUkdFVF9HUFVTX0FNRCAgICAweDIxQTIKKyNkZWZpbmUgR0xYX0dQVV9SQU1fQU1EICAgICAgICAgICAgICAgICAgICAweDIxQTMKKyNkZWZpbmUgR0xYX0dQVV9DTE9DS19BTUQgICAgICAgICAgICAgICAgICAweDIxQTQKKyNkZWZpbmUgR0xYX0dQVV9OVU1fUElQRVNfQU1EICAgICAgICAgICAgICAweDIxQTUKKyNkZWZpbmUgR0xYX0dQVV9OVU1fU0lNRF9BTUQgICAgICAgICAgICAgICAweDIxQTYKKyNkZWZpbmUgR0xYX0dQVV9OVU1fUkJfQU1EICAgICAgICAgICAgICAgICAweDIxQTcKKyNkZWZpbmUgR0xYX0dQVV9OVU1fU1BJX0FNRCAgICAgICAgICAgICAgICAweDIxQTgKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9FWFRfY3JlYXRlX2NvbnRleHRfZXMyX3Byb2ZpbGUKKyNkZWZpbmUgR0xYX0NPTlRFWFRfRVMyX1BST0ZJTEVfQklUX0VYVCAgICAweDAwMDAwMDA0CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBHTFhfQVJCX2dldF9wcm9jX2FkZHJlc3MKK3R5cGVkZWYgdm9pZCAoKl9fR0xYZXh0RnVuY1B0cikodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF92aWRlb19zb3VyY2UKK3R5cGVkZWYgWElEIEdMWFZpZGVvU291cmNlU0dJWDsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX2ZiY29uZmlnCit0eXBlZGVmIFhJRCBHTFhGQkNvbmZpZ0lEU0dJWDsKK3R5cGVkZWYgc3RydWN0IF9fR0xYRkJDb25maWdSZWMgKkdMWEZCQ29uZmlnU0dJWDsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3BidWZmZXIKK3R5cGVkZWYgWElEIEdMWFBidWZmZXJTR0lYOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0eXBlOworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOwkgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sIHNlbmRfZXZlbnQ7CQkgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZvciBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CQkgIC8qIGRpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBHTFhEcmF3YWJsZSBkcmF3YWJsZTsJICAvKiBpLmQuIG9mIERyYXdhYmxlICovCisgICAgaW50IGV2ZW50X3R5cGU7CQkgIC8qIEdMWF9EQU1BR0VEX1NHSVggb3IgR0xYX1NBVkVEX1NHSVggKi8KKyAgICBpbnQgZHJhd190eXBlOwkJICAvKiBHTFhfV0lORE9XX1NHSVggb3IgR0xYX1BCVUZGRVJfU0dJWCAqLworICAgIHVuc2lnbmVkIGludCBtYXNrOwkgIC8qIG1hc2sgaW5kaWNhdGluZyB3aGljaCBidWZmZXJzIGFyZSBhZmZlY3RlZCovCisgICAgaW50IHgsIHk7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGNvdW50OwkJICAvKiBpZiBub256ZXJvLCBhdCBsZWFzdCB0aGlzIG1hbnkgbW9yZSAqLworfSBHTFhCdWZmZXJDbG9iYmVyRXZlbnRTR0lYOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX05WX3ZpZGVvX291dHB1dAordHlwZWRlZiB1bnNpZ25lZCBpbnQgR0xYVmlkZW9EZXZpY2VOVjsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl92aWRlb19jYXB0dXJlCit0eXBlZGVmIFhJRCBHTFhWaWRlb0NhcHR1cmVEZXZpY2VOVjsKKyNlbmRpZgorCisjaWZuZGVmIEdMRVhUXzY0X1RZUEVTX0RFRklORUQKKy8qIFRoaXMgY29kZSBibG9jayBpcyBkdXBsaWNhdGVkIGluIGdsZXh0LmgsIHNvIG11c3QgYmUgcHJvdGVjdGVkICovCisjZGVmaW5lIEdMRVhUXzY0X1RZUEVTX0RFRklORUQKKy8qIERlZmluZSBpbnQzMl90LCBpbnQ2NF90LCBhbmQgdWludDY0X3QgdHlwZXMgZm9yIFVTVC9NU0MgKi8KKy8qIChhcyB1c2VkIGluIHRoZSBHTFhfT01MX3N5bmNfY29udHJvbCBleHRlbnNpb24pLiAqLworI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbGlmIGRlZmluZWQoX19zdW5fXykgfHwgZGVmaW5lZChfX2RpZ2l0YWxfXykKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2lmIGRlZmluZWQoX19TVERDX18pCisjaWYgZGVmaW5lZChfX2FyY2g2NF9fKSB8fCBkZWZpbmVkKF9MUDY0KQordHlwZWRlZiBsb25nIGludCBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCB1aW50NjRfdDsKKyNlbHNlCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCB1aW50NjRfdDsKKyNlbmRpZiAvKiBfX2FyY2g2NF9fICovCisjZW5kaWYgLyogX19TVERDX18gKi8KKyNlbGlmIGRlZmluZWQoIF9fVk1TICkgfHwgZGVmaW5lZChfX3NnaSkKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgZGVmaW5lZChfX1NDT19fKSB8fCBkZWZpbmVkKF9fVVNMQ19fKQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VsaWYgZGVmaW5lZChfX1VOSVhPUzJfXykgfHwgZGVmaW5lZChfX1NPTDY0X18pCit0eXBlZGVmIGxvbmcgaW50IGludDMyX3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpbnQgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCB1aW50NjRfdDsKKyNlbGlmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKF9fR05VQ19fKQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VsaWYgZGVmaW5lZChfV0lOMzIpCit0eXBlZGVmIF9faW50MzIgaW50MzJfdDsKK3R5cGVkZWYgX19pbnQ2NCBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVpbnQ2NF90OworI2Vsc2UKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPiAgICAgLyogRmFsbGJhY2sgb3B0aW9uICovCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9WRVJTSU9OXzFfMworI2RlZmluZSBHTFhfVkVSU0lPTl8xXzMgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEdMWEZCQ29uZmlnICogZ2xYR2V0RkJDb25maWdzIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGludCAqbmVsZW1lbnRzKTsKK2V4dGVybiBHTFhGQkNvbmZpZyAqIGdsWENob29zZUZCQ29uZmlnIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGNvbnN0IGludCAqYXR0cmliX2xpc3QsIGludCAqbmVsZW1lbnRzKTsKK2V4dGVybiBpbnQgZ2xYR2V0RkJDb25maWdBdHRyaWIgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBpbnQgYXR0cmlidXRlLCBpbnQgKnZhbHVlKTsKK2V4dGVybiBYVmlzdWFsSW5mbyAqIGdsWEdldFZpc3VhbEZyb21GQkNvbmZpZyAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcpOworZXh0ZXJuIEdMWFdpbmRvdyBnbFhDcmVhdGVXaW5kb3cgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBXaW5kb3cgd2luLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKK2V4dGVybiB2b2lkIGdsWERlc3Ryb3lXaW5kb3cgKERpc3BsYXkgKmRweSwgR0xYV2luZG93IHdpbik7CitleHRlcm4gR0xYUGl4bWFwIGdsWENyZWF0ZVBpeG1hcCAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsIFBpeG1hcCBwaXhtYXAsIGNvbnN0IGludCAqYXR0cmliX2xpc3QpOworZXh0ZXJuIHZvaWQgZ2xYRGVzdHJveVBpeG1hcCAoRGlzcGxheSAqZHB5LCBHTFhQaXhtYXAgcGl4bWFwKTsKK2V4dGVybiBHTFhQYnVmZmVyIGdsWENyZWF0ZVBidWZmZXIgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKK2V4dGVybiB2b2lkIGdsWERlc3Ryb3lQYnVmZmVyIChEaXNwbGF5ICpkcHksIEdMWFBidWZmZXIgcGJ1Zik7CitleHRlcm4gdm9pZCBnbFhRdWVyeURyYXdhYmxlIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXcsIGludCBhdHRyaWJ1dGUsIHVuc2lnbmVkIGludCAqdmFsdWUpOworZXh0ZXJuIEdMWENvbnRleHQgZ2xYQ3JlYXRlTmV3Q29udGV4dCAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsIGludCByZW5kZXJfdHlwZSwgR0xYQ29udGV4dCBzaGFyZV9saXN0LCBCb29sIGRpcmVjdCk7CitleHRlcm4gQm9vbCBnbFhNYWtlQ29udGV4dEN1cnJlbnQgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgR0xYRHJhd2FibGUgcmVhZCwgR0xYQ29udGV4dCBjdHgpOworZXh0ZXJuIEdMWERyYXdhYmxlIGdsWEdldEN1cnJlbnRSZWFkRHJhd2FibGUgKHZvaWQpOworZXh0ZXJuIERpc3BsYXkgKiBnbFhHZXRDdXJyZW50RGlzcGxheSAodm9pZCk7CitleHRlcm4gaW50IGdsWFF1ZXJ5Q29udGV4dCAoRGlzcGxheSAqZHB5LCBHTFhDb250ZXh0IGN0eCwgaW50IGF0dHJpYnV0ZSwgaW50ICp2YWx1ZSk7CitleHRlcm4gdm9pZCBnbFhTZWxlY3RFdmVudCAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCB1bnNpZ25lZCBsb25nIGV2ZW50X21hc2spOworZXh0ZXJuIHZvaWQgZ2xYR2V0U2VsZWN0ZWRFdmVudCAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCB1bnNpZ25lZCBsb25nICpldmVudF9tYXNrKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xYRkJDb25maWcgKiAoICogUEZOR0xYR0VURkJDT05GSUdTUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgaW50ICpuZWxlbWVudHMpOwordHlwZWRlZiBHTFhGQkNvbmZpZyAqICggKiBQRk5HTFhDSE9PU0VGQkNPTkZJR1BST0MpIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGNvbnN0IGludCAqYXR0cmliX2xpc3QsIGludCAqbmVsZW1lbnRzKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhHRVRGQkNPTkZJR0FUVFJJQlBST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgaW50IGF0dHJpYnV0ZSwgaW50ICp2YWx1ZSk7Cit0eXBlZGVmIFhWaXN1YWxJbmZvICogKCAqIFBGTkdMWEdFVFZJU1VBTEZST01GQkNPTkZJR1BST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZyk7Cit0eXBlZGVmIEdMWFdpbmRvdyAoICogUEZOR0xYQ1JFQVRFV0lORE9XUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBXaW5kb3cgd2luLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYREVTVFJPWVdJTkRPV1BST0MpIChEaXNwbGF5ICpkcHksIEdMWFdpbmRvdyB3aW4pOwordHlwZWRlZiBHTFhQaXhtYXAgKCAqIFBGTkdMWENSRUFURVBJWE1BUFBST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgUGl4bWFwIHBpeG1hcCwgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7Cit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWERFU1RST1lQSVhNQVBQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhQaXhtYXAgcGl4bWFwKTsKK3R5cGVkZWYgR0xYUGJ1ZmZlciAoICogUEZOR0xYQ1JFQVRFUEJVRkZFUlBST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7Cit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWERFU1RST1lQQlVGRkVSUFJPQykgKERpc3BsYXkgKmRweSwgR0xYUGJ1ZmZlciBwYnVmKTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYUVVFUllEUkFXQUJMRVBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXcsIGludCBhdHRyaWJ1dGUsIHVuc2lnbmVkIGludCAqdmFsdWUpOwordHlwZWRlZiBHTFhDb250ZXh0ICggKiBQRk5HTFhDUkVBVEVORVdDT05URVhUUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBpbnQgcmVuZGVyX3R5cGUsIEdMWENvbnRleHQgc2hhcmVfbGlzdCwgQm9vbCBkaXJlY3QpOwordHlwZWRlZiBCb29sICggKiBQRk5HTFhNQUtFQ09OVEVYVENVUlJFTlRQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCBHTFhEcmF3YWJsZSByZWFkLCBHTFhDb250ZXh0IGN0eCk7Cit0eXBlZGVmIEdMWERyYXdhYmxlICggKiBQRk5HTFhHRVRDVVJSRU5UUkVBRERSQVdBQkxFUFJPQykgKHZvaWQpOwordHlwZWRlZiBEaXNwbGF5ICogKCAqIFBGTkdMWEdFVENVUlJFTlRESVNQTEFZUFJPQykgKHZvaWQpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWFFVRVJZQ09OVEVYVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWENvbnRleHQgY3R4LCBpbnQgYXR0cmlidXRlLCBpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYU0VMRUNURVZFTlRQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCB1bnNpZ25lZCBsb25nIGV2ZW50X21hc2spOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhHRVRTRUxFQ1RFREVWRU5UUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgdW5zaWduZWQgbG9uZyAqZXZlbnRfbWFzayk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfVkVSU0lPTl8xXzQKKyNkZWZpbmUgR0xYX1ZFUlNJT05fMV80IDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBfX0dMWGV4dEZ1bmNQdHIgZ2xYR2V0UHJvY0FkZHJlc3MgKGNvbnN0IEdMdWJ5dGUgKnByb2NOYW1lKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgX19HTFhleHRGdW5jUHRyICggKiBQRk5HTFhHRVRQUk9DQUREUkVTU1BST0MpIChjb25zdCBHTHVieXRlICpwcm9jTmFtZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfQVJCX2dldF9wcm9jX2FkZHJlc3MKKyNkZWZpbmUgR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBfX0dMWGV4dEZ1bmNQdHIgZ2xYR2V0UHJvY0FkZHJlc3NBUkIgKGNvbnN0IEdMdWJ5dGUgKnByb2NOYW1lKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgX19HTFhleHRGdW5jUHRyICggKiBQRk5HTFhHRVRQUk9DQUREUkVTU0FSQlBST0MpIChjb25zdCBHTHVieXRlICpwcm9jTmFtZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfQVJCX211bHRpc2FtcGxlCisjZGVmaW5lIEdMWF9BUkJfbXVsdGlzYW1wbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl9mYmNvbmZpZ19mbG9hdAorI2RlZmluZSBHTFhfQVJCX2ZiY29uZmlnX2Zsb2F0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9BUkJfZnJhbWVidWZmZXJfc1JHQgorI2RlZmluZSBHTFhfQVJCX2ZyYW1lYnVmZmVyX3NSR0IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl9jcmVhdGVfY29udGV4dAorI2RlZmluZSBHTFhfQVJCX2NyZWF0ZV9jb250ZXh0IDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBHTFhDb250ZXh0IGdsWENyZWF0ZUNvbnRleHRBdHRyaWJzQVJCIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgR0xYQ29udGV4dCBzaGFyZV9jb250ZXh0LCBCb29sIGRpcmVjdCwgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMWENvbnRleHQgKCAqIFBGTkdMWENSRUFURUNPTlRFWFRBVFRSSUJTQVJCUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBHTFhDb250ZXh0IHNoYXJlX2NvbnRleHQsIEJvb2wgZGlyZWN0LCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9BUkJfY3JlYXRlX2NvbnRleHRfcHJvZmlsZQorI2RlZmluZSBHTFhfQVJCX2NyZWF0ZV9jb250ZXh0X3Byb2ZpbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl9jcmVhdGVfY29udGV4dF9yb2J1c3RuZXNzCisjZGVmaW5lIEdMWF9BUkJfY3JlYXRlX2NvbnRleHRfcm9idXN0bmVzcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJU19tdWx0aXNhbXBsZQorI2RlZmluZSBHTFhfU0dJU19tdWx0aXNhbXBsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX3Zpc3VhbF9pbmZvCisjZGVmaW5lIEdMWF9FWFRfdmlzdWFsX2luZm8gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSV9zd2FwX2NvbnRyb2wKKyNkZWZpbmUgR0xYX1NHSV9zd2FwX2NvbnRyb2wgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIGludCBnbFhTd2FwSW50ZXJ2YWxTR0kgKGludCBpbnRlcnZhbCk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIGludCAoICogUEZOR0xYU1dBUElOVEVSVkFMU0dJUFJPQykgKGludCBpbnRlcnZhbCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJX3ZpZGVvX3N5bmMKKyNkZWZpbmUgR0xYX1NHSV92aWRlb19zeW5jIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBpbnQgZ2xYR2V0VmlkZW9TeW5jU0dJICh1bnNpZ25lZCBpbnQgKmNvdW50KTsKK2V4dGVybiBpbnQgZ2xYV2FpdFZpZGVvU3luY1NHSSAoaW50IGRpdmlzb3IsIGludCByZW1haW5kZXIsIHVuc2lnbmVkIGludCAqY291bnQpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWEdFVFZJREVPU1lOQ1NHSVBST0MpICh1bnNpZ25lZCBpbnQgKmNvdW50KTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhXQUlUVklERU9TWU5DU0dJUFJPQykgKGludCBkaXZpc29yLCBpbnQgcmVtYWluZGVyLCB1bnNpZ25lZCBpbnQgKmNvdW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lfbWFrZV9jdXJyZW50X3JlYWQKKyNkZWZpbmUgR0xYX1NHSV9tYWtlX2N1cnJlbnRfcmVhZCAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gQm9vbCBnbFhNYWtlQ3VycmVudFJlYWRTR0kgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgR0xYRHJhd2FibGUgcmVhZCwgR0xYQ29udGV4dCBjdHgpOworZXh0ZXJuIEdMWERyYXdhYmxlIGdsWEdldEN1cnJlbnRSZWFkRHJhd2FibGVTR0kgKHZvaWQpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBCb29sICggKiBQRk5HTFhNQUtFQ1VSUkVOVFJFQURTR0lQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCBHTFhEcmF3YWJsZSByZWFkLCBHTFhDb250ZXh0IGN0eCk7Cit0eXBlZGVmIEdMWERyYXdhYmxlICggKiBQRk5HTFhHRVRDVVJSRU5UUkVBRERSQVdBQkxFU0dJUFJPQykgKHZvaWQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfdmlkZW9fc291cmNlCisjZGVmaW5lIEdMWF9TR0lYX3ZpZGVvX3NvdXJjZSAxCisjaWZkZWYgX1ZMX0gKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBHTFhWaWRlb1NvdXJjZVNHSVggZ2xYQ3JlYXRlR0xYVmlkZW9Tb3VyY2VTR0lYIChEaXNwbGF5ICpkaXNwbGF5LCBpbnQgc2NyZWVuLCBWTFNlcnZlciBzZXJ2ZXIsIFZMUGF0aCBwYXRoLCBpbnQgbm9kZUNsYXNzLCBWTE5vZGUgZHJhaW5Ob2RlKTsKK2V4dGVybiB2b2lkIGdsWERlc3Ryb3lHTFhWaWRlb1NvdXJjZVNHSVggKERpc3BsYXkgKmRweSwgR0xYVmlkZW9Tb3VyY2VTR0lYIGdseHZpZGVvc291cmNlKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xYVmlkZW9Tb3VyY2VTR0lYICggKiBQRk5HTFhDUkVBVEVHTFhWSURFT1NPVVJDRVNHSVhQUk9DKSAoRGlzcGxheSAqZGlzcGxheSwgaW50IHNjcmVlbiwgVkxTZXJ2ZXIgc2VydmVyLCBWTFBhdGggcGF0aCwgaW50IG5vZGVDbGFzcywgVkxOb2RlIGRyYWluTm9kZSk7Cit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWERFU1RST1lHTFhWSURFT1NPVVJDRVNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhWaWRlb1NvdXJjZVNHSVggZ2x4dmlkZW9zb3VyY2UpOworI2VuZGlmIC8qIF9WTF9IICovCisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX3Zpc3VhbF9yYXRpbmcKKyNkZWZpbmUgR0xYX0VYVF92aXN1YWxfcmF0aW5nIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9FWFRfaW1wb3J0X2NvbnRleHQKKyNkZWZpbmUgR0xYX0VYVF9pbXBvcnRfY29udGV4dCAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gRGlzcGxheSAqIGdsWEdldEN1cnJlbnREaXNwbGF5RVhUICh2b2lkKTsKK2V4dGVybiBpbnQgZ2xYUXVlcnlDb250ZXh0SW5mb0VYVCAoRGlzcGxheSAqZHB5LCBHTFhDb250ZXh0IGNvbnRleHQsIGludCBhdHRyaWJ1dGUsIGludCAqdmFsdWUpOworZXh0ZXJuIEdMWENvbnRleHRJRCBnbFhHZXRDb250ZXh0SURFWFQgKGNvbnN0IEdMWENvbnRleHQgY29udGV4dCk7CitleHRlcm4gR0xYQ29udGV4dCBnbFhJbXBvcnRDb250ZXh0RVhUIChEaXNwbGF5ICpkcHksIEdMWENvbnRleHRJRCBjb250ZXh0SUQpOworZXh0ZXJuIHZvaWQgZ2xYRnJlZUNvbnRleHRFWFQgKERpc3BsYXkgKmRweSwgR0xYQ29udGV4dCBjb250ZXh0KTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgRGlzcGxheSAqICggKiBQRk5HTFhHRVRDVVJSRU5URElTUExBWUVYVFBST0MpICh2b2lkKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhRVUVSWUNPTlRFWFRJTkZPRVhUUFJPQykgKERpc3BsYXkgKmRweSwgR0xYQ29udGV4dCBjb250ZXh0LCBpbnQgYXR0cmlidXRlLCBpbnQgKnZhbHVlKTsKK3R5cGVkZWYgR0xYQ29udGV4dElEICggKiBQRk5HTFhHRVRDT05URVhUSURFWFRQUk9DKSAoY29uc3QgR0xYQ29udGV4dCBjb250ZXh0KTsKK3R5cGVkZWYgR0xYQ29udGV4dCAoICogUEZOR0xYSU1QT1JUQ09OVEVYVEVYVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWENvbnRleHRJRCBjb250ZXh0SUQpOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhGUkVFQ09OVEVYVEVYVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWENvbnRleHQgY29udGV4dCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9mYmNvbmZpZworI2RlZmluZSBHTFhfU0dJWF9mYmNvbmZpZyAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gaW50IGdsWEdldEZCQ29uZmlnQXR0cmliU0dJWCAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZ1NHSVggY29uZmlnLCBpbnQgYXR0cmlidXRlLCBpbnQgKnZhbHVlKTsKK2V4dGVybiBHTFhGQkNvbmZpZ1NHSVggKiBnbFhDaG9vc2VGQkNvbmZpZ1NHSVggKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgaW50ICphdHRyaWJfbGlzdCwgaW50ICpuZWxlbWVudHMpOworZXh0ZXJuIEdMWFBpeG1hcCBnbFhDcmVhdGVHTFhQaXhtYXBXaXRoQ29uZmlnU0dJWCAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZ1NHSVggY29uZmlnLCBQaXhtYXAgcGl4bWFwKTsKK2V4dGVybiBHTFhDb250ZXh0IGdsWENyZWF0ZUNvbnRleHRXaXRoQ29uZmlnU0dJWCAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZ1NHSVggY29uZmlnLCBpbnQgcmVuZGVyX3R5cGUsIEdMWENvbnRleHQgc2hhcmVfbGlzdCwgQm9vbCBkaXJlY3QpOworZXh0ZXJuIFhWaXN1YWxJbmZvICogZ2xYR2V0VmlzdWFsRnJvbUZCQ29uZmlnU0dJWCAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZ1NHSVggY29uZmlnKTsKK2V4dGVybiBHTFhGQkNvbmZpZ1NHSVggZ2xYR2V0RkJDb25maWdGcm9tVmlzdWFsU0dJWCAoRGlzcGxheSAqZHB5LCBYVmlzdWFsSW5mbyAqdmlzKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgaW50ICggKiBQRk5HTFhHRVRGQkNPTkZJR0FUVFJJQlNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZ1NHSVggY29uZmlnLCBpbnQgYXR0cmlidXRlLCBpbnQgKnZhbHVlKTsKK3R5cGVkZWYgR0xYRkJDb25maWdTR0lYICogKCAqIFBGTkdMWENIT09TRUZCQ09ORklHU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGludCAqYXR0cmliX2xpc3QsIGludCAqbmVsZW1lbnRzKTsKK3R5cGVkZWYgR0xYUGl4bWFwICggKiBQRk5HTFhDUkVBVEVHTFhQSVhNQVBXSVRIQ09ORklHU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnU0dJWCBjb25maWcsIFBpeG1hcCBwaXhtYXApOwordHlwZWRlZiBHTFhDb250ZXh0ICggKiBQRk5HTFhDUkVBVEVDT05URVhUV0lUSENPTkZJR1NHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZ1NHSVggY29uZmlnLCBpbnQgcmVuZGVyX3R5cGUsIEdMWENvbnRleHQgc2hhcmVfbGlzdCwgQm9vbCBkaXJlY3QpOwordHlwZWRlZiBYVmlzdWFsSW5mbyAqICggKiBQRk5HTFhHRVRWSVNVQUxGUk9NRkJDT05GSUdTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWdTR0lYIGNvbmZpZyk7Cit0eXBlZGVmIEdMWEZCQ29uZmlnU0dJWCAoICogUEZOR0xYR0VURkJDT05GSUdGUk9NVklTVUFMU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIFhWaXN1YWxJbmZvICp2aXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfcGJ1ZmZlcgorI2RlZmluZSBHTFhfU0dJWF9wYnVmZmVyIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBHTFhQYnVmZmVyU0dJWCBnbFhDcmVhdGVHTFhQYnVmZmVyU0dJWCAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZ1NHSVggY29uZmlnLCB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIGludCAqYXR0cmliX2xpc3QpOworZXh0ZXJuIHZvaWQgZ2xYRGVzdHJveUdMWFBidWZmZXJTR0lYIChEaXNwbGF5ICpkcHksIEdMWFBidWZmZXJTR0lYIHBidWYpOworZXh0ZXJuIGludCBnbFhRdWVyeUdMWFBidWZmZXJTR0lYIChEaXNwbGF5ICpkcHksIEdMWFBidWZmZXJTR0lYIHBidWYsIGludCBhdHRyaWJ1dGUsIHVuc2lnbmVkIGludCAqdmFsdWUpOworZXh0ZXJuIHZvaWQgZ2xYU2VsZWN0RXZlbnRTR0lYIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCB1bnNpZ25lZCBsb25nIG1hc2spOworZXh0ZXJuIHZvaWQgZ2xYR2V0U2VsZWN0ZWRFdmVudFNHSVggKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIHVuc2lnbmVkIGxvbmcgKm1hc2spOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTFhQYnVmZmVyU0dJWCAoICogUEZOR0xYQ1JFQVRFR0xYUEJVRkZFUlNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZ1NHSVggY29uZmlnLCB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIGludCAqYXR0cmliX2xpc3QpOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhERVNUUk9ZR0xYUEJVRkZFUlNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhQYnVmZmVyU0dJWCBwYnVmKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhRVUVSWUdMWFBCVUZGRVJTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgR0xYUGJ1ZmZlclNHSVggcGJ1ZiwgaW50IGF0dHJpYnV0ZSwgdW5zaWduZWQgaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWFNFTEVDVEVWRU5UU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCB1bnNpZ25lZCBsb25nIG1hc2spOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhHRVRTRUxFQ1RFREVWRU5UU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCB1bnNpZ25lZCBsb25nICptYXNrKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lfY3VzaGlvbgorI2RlZmluZSBHTFhfU0dJX2N1c2hpb24gMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIHZvaWQgZ2xYQ3VzaGlvblNHSSAoRGlzcGxheSAqZHB5LCBXaW5kb3cgd2luZG93LCBmbG9hdCBjdXNoaW9uKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYQ1VTSElPTlNHSVBST0MpIChEaXNwbGF5ICpkcHksIFdpbmRvdyB3aW5kb3csIGZsb2F0IGN1c2hpb24pOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfdmlkZW9fcmVzaXplCisjZGVmaW5lIEdMWF9TR0lYX3ZpZGVvX3Jlc2l6ZSAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gaW50IGdsWEJpbmRDaGFubmVsVG9XaW5kb3dTR0lYIChEaXNwbGF5ICpkaXNwbGF5LCBpbnQgc2NyZWVuLCBpbnQgY2hhbm5lbCwgV2luZG93IHdpbmRvdyk7CitleHRlcm4gaW50IGdsWENoYW5uZWxSZWN0U0dJWCAoRGlzcGxheSAqZGlzcGxheSwgaW50IHNjcmVlbiwgaW50IGNoYW5uZWwsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKK2V4dGVybiBpbnQgZ2xYUXVlcnlDaGFubmVsUmVjdFNHSVggKERpc3BsYXkgKmRpc3BsYXksIGludCBzY3JlZW4sIGludCBjaGFubmVsLCBpbnQgKmR4LCBpbnQgKmR5LCBpbnQgKmR3LCBpbnQgKmRoKTsKK2V4dGVybiBpbnQgZ2xYUXVlcnlDaGFubmVsRGVsdGFzU0dJWCAoRGlzcGxheSAqZGlzcGxheSwgaW50IHNjcmVlbiwgaW50IGNoYW5uZWwsIGludCAqeCwgaW50ICp5LCBpbnQgKncsIGludCAqaCk7CitleHRlcm4gaW50IGdsWENoYW5uZWxSZWN0U3luY1NHSVggKERpc3BsYXkgKmRpc3BsYXksIGludCBzY3JlZW4sIGludCBjaGFubmVsLCBHTGVudW0gc3luY3R5cGUpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWEJJTkRDSEFOTkVMVE9XSU5ET1dTR0lYUFJPQykgKERpc3BsYXkgKmRpc3BsYXksIGludCBzY3JlZW4sIGludCBjaGFubmVsLCBXaW5kb3cgd2luZG93KTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhDSEFOTkVMUkVDVFNHSVhQUk9DKSAoRGlzcGxheSAqZGlzcGxheSwgaW50IHNjcmVlbiwgaW50IGNoYW5uZWwsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhRVUVSWUNIQU5ORUxSRUNUU0dJWFBST0MpIChEaXNwbGF5ICpkaXNwbGF5LCBpbnQgc2NyZWVuLCBpbnQgY2hhbm5lbCwgaW50ICpkeCwgaW50ICpkeSwgaW50ICpkdywgaW50ICpkaCk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYUVVFUllDSEFOTkVMREVMVEFTU0dJWFBST0MpIChEaXNwbGF5ICpkaXNwbGF5LCBpbnQgc2NyZWVuLCBpbnQgY2hhbm5lbCwgaW50ICp4LCBpbnQgKnksIGludCAqdywgaW50ICpoKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhDSEFOTkVMUkVDVFNZTkNTR0lYUFJPQykgKERpc3BsYXkgKmRpc3BsYXksIGludCBzY3JlZW4sIGludCBjaGFubmVsLCBHTGVudW0gc3luY3R5cGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfZG1idWZmZXIKKyNkZWZpbmUgR0xYX1NHSVhfZG1idWZmZXIgMQorI2lmZGVmIF9ETV9CVUZGRVJfSF8KKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBCb29sIGdsWEFzc29jaWF0ZURNUGJ1ZmZlclNHSVggKERpc3BsYXkgKmRweSwgR0xYUGJ1ZmZlclNHSVggcGJ1ZmZlciwgRE1wYXJhbXMgKnBhcmFtcywgRE1idWZmZXIgZG1idWZmZXIpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBCb29sICggKiBQRk5HTFhBU1NPQ0lBVEVETVBCVUZGRVJTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgR0xYUGJ1ZmZlclNHSVggcGJ1ZmZlciwgRE1wYXJhbXMgKnBhcmFtcywgRE1idWZmZXIgZG1idWZmZXIpOworI2VuZGlmIC8qIF9ETV9CVUZGRVJfSF8gKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3N3YXBfZ3JvdXAKKyNkZWZpbmUgR0xYX1NHSVhfc3dhcF9ncm91cCAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gdm9pZCBnbFhKb2luU3dhcEdyb3VwU0dJWCAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgR0xYRHJhd2FibGUgbWVtYmVyKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYSk9JTlNXQVBHUk9VUFNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgR0xYRHJhd2FibGUgbWVtYmVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3N3YXBfYmFycmllcgorI2RlZmluZSBHTFhfU0dJWF9zd2FwX2JhcnJpZXIgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIHZvaWQgZ2xYQmluZFN3YXBCYXJyaWVyU0dJWCAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50IGJhcnJpZXIpOworZXh0ZXJuIEJvb2wgZ2xYUXVlcnlNYXhTd2FwQmFycmllcnNTR0lYIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGludCAqbWF4KTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYQklORFNXQVBCQVJSSUVSU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQgYmFycmllcik7Cit0eXBlZGVmIEJvb2wgKCAqIFBGTkdMWFFVRVJZTUFYU1dBUEJBUlJJRVJTU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGludCAqbWF4KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TVU5fZ2V0X3RyYW5zcGFyZW50X2luZGV4CisjZGVmaW5lIEdMWF9TVU5fZ2V0X3RyYW5zcGFyZW50X2luZGV4IDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBTdGF0dXMgZ2xYR2V0VHJhbnNwYXJlbnRJbmRleFNVTiAoRGlzcGxheSAqZHB5LCBXaW5kb3cgb3ZlcmxheSwgV2luZG93IHVuZGVybGF5LCBsb25nICpwVHJhbnNwYXJlbnRJbmRleCk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIFN0YXR1cyAoICogUEZOR0xYR0VUVFJBTlNQQVJFTlRJTkRFWFNVTlBST0MpIChEaXNwbGF5ICpkcHksIFdpbmRvdyBvdmVybGF5LCBXaW5kb3cgdW5kZXJsYXksIGxvbmcgKnBUcmFuc3BhcmVudEluZGV4KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9NRVNBX2NvcHlfc3ViX2J1ZmZlcgorI2RlZmluZSBHTFhfTUVTQV9jb3B5X3N1Yl9idWZmZXIgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIHZvaWQgZ2xYQ29weVN1YkJ1ZmZlck1FU0EgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYQ09QWVNVQkJVRkZFUk1FU0FQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX01FU0FfcGl4bWFwX2NvbG9ybWFwCisjZGVmaW5lIEdMWF9NRVNBX3BpeG1hcF9jb2xvcm1hcCAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gR0xYUGl4bWFwIGdsWENyZWF0ZUdMWFBpeG1hcE1FU0EgKERpc3BsYXkgKmRweSwgWFZpc3VhbEluZm8gKnZpc3VhbCwgUGl4bWFwIHBpeG1hcCwgQ29sb3JtYXAgY21hcCk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMWFBpeG1hcCAoICogUEZOR0xYQ1JFQVRFR0xYUElYTUFQTUVTQVBST0MpIChEaXNwbGF5ICpkcHksIFhWaXN1YWxJbmZvICp2aXN1YWwsIFBpeG1hcCBwaXhtYXAsIENvbG9ybWFwIGNtYXApOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX01FU0FfcmVsZWFzZV9idWZmZXJzCisjZGVmaW5lIEdMWF9NRVNBX3JlbGVhc2VfYnVmZmVycyAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gQm9vbCBnbFhSZWxlYXNlQnVmZmVyc01FU0EgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBCb29sICggKiBQRk5HTFhSRUxFQVNFQlVGRkVSU01FU0FQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfTUVTQV9zZXRfM2RmeF9tb2RlCisjZGVmaW5lIEdMWF9NRVNBX3NldF8zZGZ4X21vZGUgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEJvb2wgZ2xYU2V0M0RmeE1vZGVNRVNBIChpbnQgbW9kZSk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEJvb2wgKCAqIFBGTkdMWFNFVDNERlhNT0RFTUVTQVBST0MpIChpbnQgbW9kZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF92aXN1YWxfc2VsZWN0X2dyb3VwCisjZGVmaW5lIEdMWF9TR0lYX3Zpc3VhbF9zZWxlY3RfZ3JvdXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX09NTF9zd2FwX21ldGhvZAorI2RlZmluZSBHTFhfT01MX3N3YXBfbWV0aG9kIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9PTUxfc3luY19jb250cm9sCisjZGVmaW5lIEdMWF9PTUxfc3luY19jb250cm9sIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBCb29sIGdsWEdldFN5bmNWYWx1ZXNPTUwgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludDY0X3QgKnVzdCwgaW50NjRfdCAqbXNjLCBpbnQ2NF90ICpzYmMpOworZXh0ZXJuIEJvb2wgZ2xYR2V0TXNjUmF0ZU9NTCAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50MzJfdCAqbnVtZXJhdG9yLCBpbnQzMl90ICpkZW5vbWluYXRvcik7CitleHRlcm4gaW50NjRfdCBnbFhTd2FwQnVmZmVyc01zY09NTCAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50NjRfdCB0YXJnZXRfbXNjLCBpbnQ2NF90IGRpdmlzb3IsIGludDY0X3QgcmVtYWluZGVyKTsKK2V4dGVybiBCb29sIGdsWFdhaXRGb3JNc2NPTUwgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludDY0X3QgdGFyZ2V0X21zYywgaW50NjRfdCBkaXZpc29yLCBpbnQ2NF90IHJlbWFpbmRlciwgaW50NjRfdCAqdXN0LCBpbnQ2NF90ICptc2MsIGludDY0X3QgKnNiYyk7CitleHRlcm4gQm9vbCBnbFhXYWl0Rm9yU2JjT01MIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQ2NF90IHRhcmdldF9zYmMsIGludDY0X3QgKnVzdCwgaW50NjRfdCAqbXNjLCBpbnQ2NF90ICpzYmMpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBCb29sICggKiBQRk5HTFhHRVRTWU5DVkFMVUVTT01MUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludDY0X3QgKnVzdCwgaW50NjRfdCAqbXNjLCBpbnQ2NF90ICpzYmMpOwordHlwZWRlZiBCb29sICggKiBQRk5HTFhHRVRNU0NSQVRFT01MUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludDMyX3QgKm51bWVyYXRvciwgaW50MzJfdCAqZGVub21pbmF0b3IpOwordHlwZWRlZiBpbnQ2NF90ICggKiBQRk5HTFhTV0FQQlVGRkVSU01TQ09NTFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQ2NF90IHRhcmdldF9tc2MsIGludDY0X3QgZGl2aXNvciwgaW50NjRfdCByZW1haW5kZXIpOwordHlwZWRlZiBCb29sICggKiBQRk5HTFhXQUlURk9STVNDT01MUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludDY0X3QgdGFyZ2V0X21zYywgaW50NjRfdCBkaXZpc29yLCBpbnQ2NF90IHJlbWFpbmRlciwgaW50NjRfdCAqdXN0LCBpbnQ2NF90ICptc2MsIGludDY0X3QgKnNiYyk7Cit0eXBlZGVmIEJvb2wgKCAqIFBGTkdMWFdBSVRGT1JTQkNPTUxQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50NjRfdCB0YXJnZXRfc2JjLCBpbnQ2NF90ICp1c3QsIGludDY0X3QgKm1zYywgaW50NjRfdCAqc2JjKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl9mbG9hdF9idWZmZXIKKyNkZWZpbmUgR0xYX05WX2Zsb2F0X2J1ZmZlciAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9oeXBlcnBpcGUKKyNkZWZpbmUgR0xYX1NHSVhfaHlwZXJwaXBlIDEKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgICAgcGlwZU5hbWVbR0xYX0hZUEVSUElQRV9QSVBFX05BTUVfTEVOR1RIX1NHSVhdOworICAgIGludCAgICAgbmV0d29ya0lkOworfSBHTFhIeXBlcnBpcGVOZXR3b3JrU0dJWDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgICAgcGlwZU5hbWVbR0xYX0hZUEVSUElQRV9QSVBFX05BTUVfTEVOR1RIX1NHSVhdOworICAgIGludCAgICAgY2hhbm5lbDsKKyAgICB1bnNpZ25lZCBpbnQKKyAgICAgIHBhcnRpY2lwYXRpb25UeXBlOworICAgIGludCAgICAgdGltZVNsaWNlOworfSBHTFhIeXBlcnBpcGVDb25maWdTR0lYOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciBwaXBlTmFtZVtHTFhfSFlQRVJQSVBFX1BJUEVfTkFNRV9MRU5HVEhfU0dJWF07CisgICAgaW50IHNyY1hPcmlnaW4sIHNyY1lPcmlnaW4sIHNyY1dpZHRoLCBzcmNIZWlnaHQ7CisgICAgaW50IGRlc3RYT3JpZ2luLCBkZXN0WU9yaWdpbiwgZGVzdFdpZHRoLCBkZXN0SGVpZ2h0OworfSBHTFhQaXBlUmVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgcGlwZU5hbWVbR0xYX0hZUEVSUElQRV9QSVBFX05BTUVfTEVOR1RIX1NHSVhdOworICAgIGludCBYT3JpZ2luLCBZT3JpZ2luLCBtYXhIZWlnaHQsIG1heFdpZHRoOworfSBHTFhQaXBlUmVjdExpbWl0czsKKworI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEdMWEh5cGVycGlwZU5ldHdvcmtTR0lYICogZ2xYUXVlcnlIeXBlcnBpcGVOZXR3b3JrU0dJWCAoRGlzcGxheSAqZHB5LCBpbnQgKm5waXBlcyk7CitleHRlcm4gaW50IGdsWEh5cGVycGlwZUNvbmZpZ1NHSVggKERpc3BsYXkgKmRweSwgaW50IG5ldHdvcmtJZCwgaW50IG5waXBlcywgR0xYSHlwZXJwaXBlQ29uZmlnU0dJWCAqY2ZnLCBpbnQgKmhwSWQpOworZXh0ZXJuIEdMWEh5cGVycGlwZUNvbmZpZ1NHSVggKiBnbFhRdWVyeUh5cGVycGlwZUNvbmZpZ1NHSVggKERpc3BsYXkgKmRweSwgaW50IGhwSWQsIGludCAqbnBpcGVzKTsKK2V4dGVybiBpbnQgZ2xYRGVzdHJveUh5cGVycGlwZUNvbmZpZ1NHSVggKERpc3BsYXkgKmRweSwgaW50IGhwSWQpOworZXh0ZXJuIGludCBnbFhCaW5kSHlwZXJwaXBlU0dJWCAoRGlzcGxheSAqZHB5LCBpbnQgaHBJZCk7CitleHRlcm4gaW50IGdsWFF1ZXJ5SHlwZXJwaXBlQmVzdEF0dHJpYlNHSVggKERpc3BsYXkgKmRweSwgaW50IHRpbWVTbGljZSwgaW50IGF0dHJpYiwgaW50IHNpemUsIHZvaWQgKmF0dHJpYkxpc3QsIHZvaWQgKnJldHVybkF0dHJpYkxpc3QpOworZXh0ZXJuIGludCBnbFhIeXBlcnBpcGVBdHRyaWJTR0lYIChEaXNwbGF5ICpkcHksIGludCB0aW1lU2xpY2UsIGludCBhdHRyaWIsIGludCBzaXplLCB2b2lkICphdHRyaWJMaXN0KTsKK2V4dGVybiBpbnQgZ2xYUXVlcnlIeXBlcnBpcGVBdHRyaWJTR0lYIChEaXNwbGF5ICpkcHksIGludCB0aW1lU2xpY2UsIGludCBhdHRyaWIsIGludCBzaXplLCB2b2lkICpyZXR1cm5BdHRyaWJMaXN0KTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xYSHlwZXJwaXBlTmV0d29ya1NHSVggKiAoICogUEZOR0xYUVVFUllIWVBFUlBJUEVORVRXT1JLU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIGludCAqbnBpcGVzKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhIWVBFUlBJUEVDT05GSUdTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgaW50IG5ldHdvcmtJZCwgaW50IG5waXBlcywgR0xYSHlwZXJwaXBlQ29uZmlnU0dJWCAqY2ZnLCBpbnQgKmhwSWQpOwordHlwZWRlZiBHTFhIeXBlcnBpcGVDb25maWdTR0lYICogKCAqIFBGTkdMWFFVRVJZSFlQRVJQSVBFQ09ORklHU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIGludCBocElkLCBpbnQgKm5waXBlcyk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYREVTVFJPWUhZUEVSUElQRUNPTkZJR1NHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgaHBJZCk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYQklOREhZUEVSUElQRVNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgaHBJZCk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYUVVFUllIWVBFUlBJUEVCRVNUQVRUUklCU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIGludCB0aW1lU2xpY2UsIGludCBhdHRyaWIsIGludCBzaXplLCB2b2lkICphdHRyaWJMaXN0LCB2b2lkICpyZXR1cm5BdHRyaWJMaXN0KTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhIWVBFUlBJUEVBVFRSSUJTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHRpbWVTbGljZSwgaW50IGF0dHJpYiwgaW50IHNpemUsIHZvaWQgKmF0dHJpYkxpc3QpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWFFVRVJZSFlQRVJQSVBFQVRUUklCU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIGludCB0aW1lU2xpY2UsIGludCBhdHRyaWIsIGludCBzaXplLCB2b2lkICpyZXR1cm5BdHRyaWJMaXN0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9NRVNBX2FncF9vZmZzZXQKKyNkZWZpbmUgR0xYX01FU0FfYWdwX29mZnNldCAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gdW5zaWduZWQgaW50IGdsWEdldEFHUE9mZnNldE1FU0EgKGNvbnN0IHZvaWQgKnBvaW50ZXIpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgKCAqIFBGTkdMWEdFVEFHUE9GRlNFVE1FU0FQUk9DKSAoY29uc3Qgdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX2ZiY29uZmlnX3BhY2tlZF9mbG9hdAorI2RlZmluZSBHTFhfRVhUX2ZiY29uZmlnX3BhY2tlZF9mbG9hdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX2ZyYW1lYnVmZmVyX3NSR0IKKyNkZWZpbmUgR0xYX0VYVF9mcmFtZWJ1ZmZlcl9zUkdCIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9FWFRfdGV4dHVyZV9mcm9tX3BpeG1hcAorI2RlZmluZSBHTFhfRVhUX3RleHR1cmVfZnJvbV9waXhtYXAgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIHZvaWQgZ2xYQmluZFRleEltYWdlRVhUIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQgYnVmZmVyLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKK2V4dGVybiB2b2lkIGdsWFJlbGVhc2VUZXhJbWFnZUVYVCAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50IGJ1ZmZlcik7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWEJJTkRURVhJTUFHRUVYVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQgYnVmZmVyLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYUkVMRUFTRVRFWElNQUdFRVhUUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludCBidWZmZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX05WX3ByZXNlbnRfdmlkZW8KKyNkZWZpbmUgR0xYX05WX3ByZXNlbnRfdmlkZW8gMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIHVuc2lnbmVkIGludCAqIGdsWEVudW1lcmF0ZVZpZGVvRGV2aWNlc05WIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGludCAqbmVsZW1lbnRzKTsKK2V4dGVybiBpbnQgZ2xYQmluZFZpZGVvRGV2aWNlTlYgKERpc3BsYXkgKmRweSwgdW5zaWduZWQgaW50IHZpZGVvX3Nsb3QsIHVuc2lnbmVkIGludCB2aWRlb19kZXZpY2UsIGNvbnN0IGludCAqYXR0cmliX2xpc3QpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgKiAoICogUEZOR0xYRU5VTUVSQVRFVklERU9ERVZJQ0VTTlZQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgKm5lbGVtZW50cyk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYQklORFZJREVPREVWSUNFTlZQUk9DKSAoRGlzcGxheSAqZHB5LCB1bnNpZ25lZCBpbnQgdmlkZW9fc2xvdCwgdW5zaWduZWQgaW50IHZpZGVvX2RldmljZSwgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfTlZfdmlkZW9fb3V0cHV0CisjZGVmaW5lIEdMWF9OVl92aWRlb19vdXRwdXQgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIGludCBnbFhHZXRWaWRlb0RldmljZU5WIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGludCBudW1WaWRlb0RldmljZXMsIEdMWFZpZGVvRGV2aWNlTlYgKnBWaWRlb0RldmljZSk7CitleHRlcm4gaW50IGdsWFJlbGVhc2VWaWRlb0RldmljZU5WIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIEdMWFZpZGVvRGV2aWNlTlYgVmlkZW9EZXZpY2UpOworZXh0ZXJuIGludCBnbFhCaW5kVmlkZW9JbWFnZU5WIChEaXNwbGF5ICpkcHksIEdMWFZpZGVvRGV2aWNlTlYgVmlkZW9EZXZpY2UsIEdMWFBidWZmZXIgcGJ1ZiwgaW50IGlWaWRlb0J1ZmZlcik7CitleHRlcm4gaW50IGdsWFJlbGVhc2VWaWRlb0ltYWdlTlYgKERpc3BsYXkgKmRweSwgR0xYUGJ1ZmZlciBwYnVmKTsKK2V4dGVybiBpbnQgZ2xYU2VuZFBidWZmZXJUb1ZpZGVvTlYgKERpc3BsYXkgKmRweSwgR0xYUGJ1ZmZlciBwYnVmLCBpbnQgaUJ1ZmZlclR5cGUsIHVuc2lnbmVkIGxvbmcgKnB1bENvdW50ZXJQYnVmZmVyLCBHTGJvb2xlYW4gYkJsb2NrKTsKK2V4dGVybiBpbnQgZ2xYR2V0VmlkZW9JbmZvTlYgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgR0xYVmlkZW9EZXZpY2VOViBWaWRlb0RldmljZSwgdW5zaWduZWQgbG9uZyAqcHVsQ291bnRlck91dHB1dFBidWZmZXIsIHVuc2lnbmVkIGxvbmcgKnB1bENvdW50ZXJPdXRwdXRWaWRlbyk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIGludCAoICogUEZOR0xYR0VUVklERU9ERVZJQ0VOVlBST0MpIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGludCBudW1WaWRlb0RldmljZXMsIEdMWFZpZGVvRGV2aWNlTlYgKnBWaWRlb0RldmljZSk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYUkVMRUFTRVZJREVPREVWSUNFTlZQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBHTFhWaWRlb0RldmljZU5WIFZpZGVvRGV2aWNlKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhCSU5EVklERU9JTUFHRU5WUFJPQykgKERpc3BsYXkgKmRweSwgR0xYVmlkZW9EZXZpY2VOViBWaWRlb0RldmljZSwgR0xYUGJ1ZmZlciBwYnVmLCBpbnQgaVZpZGVvQnVmZmVyKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhSRUxFQVNFVklERU9JTUFHRU5WUFJPQykgKERpc3BsYXkgKmRweSwgR0xYUGJ1ZmZlciBwYnVmKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhTRU5EUEJVRkZFUlRPVklERU9OVlBST0MpIChEaXNwbGF5ICpkcHksIEdMWFBidWZmZXIgcGJ1ZiwgaW50IGlCdWZmZXJUeXBlLCB1bnNpZ25lZCBsb25nICpwdWxDb3VudGVyUGJ1ZmZlciwgR0xib29sZWFuIGJCbG9jayk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYR0VUVklERU9JTkZPTlZQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBHTFhWaWRlb0RldmljZU5WIFZpZGVvRGV2aWNlLCB1bnNpZ25lZCBsb25nICpwdWxDb3VudGVyT3V0cHV0UGJ1ZmZlciwgdW5zaWduZWQgbG9uZyAqcHVsQ291bnRlck91dHB1dFZpZGVvKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl9zd2FwX2dyb3VwCisjZGVmaW5lIEdMWF9OVl9zd2FwX2dyb3VwIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBCb29sIGdsWEpvaW5Td2FwR3JvdXBOViAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgR0x1aW50IGdyb3VwKTsKK2V4dGVybiBCb29sIGdsWEJpbmRTd2FwQmFycmllck5WIChEaXNwbGF5ICpkcHksIEdMdWludCBncm91cCwgR0x1aW50IGJhcnJpZXIpOworZXh0ZXJuIEJvb2wgZ2xYUXVlcnlTd2FwR3JvdXBOViAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgR0x1aW50ICpncm91cCwgR0x1aW50ICpiYXJyaWVyKTsKK2V4dGVybiBCb29sIGdsWFF1ZXJ5TWF4U3dhcEdyb3Vwc05WIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIEdMdWludCAqbWF4R3JvdXBzLCBHTHVpbnQgKm1heEJhcnJpZXJzKTsKK2V4dGVybiBCb29sIGdsWFF1ZXJ5RnJhbWVDb3VudE5WIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIEdMdWludCAqY291bnQpOworZXh0ZXJuIEJvb2wgZ2xYUmVzZXRGcmFtZUNvdW50TlYgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbik7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEJvb2wgKCAqIFBGTkdMWEpPSU5TV0FQR1JPVVBOVlBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBHTHVpbnQgZ3JvdXApOwordHlwZWRlZiBCb29sICggKiBQRk5HTFhCSU5EU1dBUEJBUlJJRVJOVlBST0MpIChEaXNwbGF5ICpkcHksIEdMdWludCBncm91cCwgR0x1aW50IGJhcnJpZXIpOwordHlwZWRlZiBCb29sICggKiBQRk5HTFhRVUVSWVNXQVBHUk9VUE5WUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIEdMdWludCAqZ3JvdXAsIEdMdWludCAqYmFycmllcik7Cit0eXBlZGVmIEJvb2wgKCAqIFBGTkdMWFFVRVJZTUFYU1dBUEdST1VQU05WUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgR0x1aW50ICptYXhHcm91cHMsIEdMdWludCAqbWF4QmFycmllcnMpOwordHlwZWRlZiBCb29sICggKiBQRk5HTFhRVUVSWUZSQU1FQ09VTlROVlBST0MpIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIEdMdWludCAqY291bnQpOwordHlwZWRlZiBCb29sICggKiBQRk5HTFhSRVNFVEZSQU1FQ09VTlROVlBST0MpIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4pOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX05WX3ZpZGVvX2NhcHR1cmUKKyNkZWZpbmUgR0xYX05WX3ZpZGVvX2NhcHR1cmUgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIGludCBnbFhCaW5kVmlkZW9DYXB0dXJlRGV2aWNlTlYgKERpc3BsYXkgKmRweSwgdW5zaWduZWQgaW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0xYVmlkZW9DYXB0dXJlRGV2aWNlTlYgZGV2aWNlKTsKK2V4dGVybiBHTFhWaWRlb0NhcHR1cmVEZXZpY2VOViAqIGdsWEVudW1lcmF0ZVZpZGVvQ2FwdHVyZURldmljZXNOViAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgKm5lbGVtZW50cyk7CitleHRlcm4gdm9pZCBnbFhMb2NrVmlkZW9DYXB0dXJlRGV2aWNlTlYgKERpc3BsYXkgKmRweSwgR0xYVmlkZW9DYXB0dXJlRGV2aWNlTlYgZGV2aWNlKTsKK2V4dGVybiBpbnQgZ2xYUXVlcnlWaWRlb0NhcHR1cmVEZXZpY2VOViAoRGlzcGxheSAqZHB5LCBHTFhWaWRlb0NhcHR1cmVEZXZpY2VOViBkZXZpY2UsIGludCBhdHRyaWJ1dGUsIGludCAqdmFsdWUpOworZXh0ZXJuIHZvaWQgZ2xYUmVsZWFzZVZpZGVvQ2FwdHVyZURldmljZU5WIChEaXNwbGF5ICpkcHksIEdMWFZpZGVvQ2FwdHVyZURldmljZU5WIGRldmljZSk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIGludCAoICogUEZOR0xYQklORFZJREVPQ0FQVFVSRURFVklDRU5WUFJPQykgKERpc3BsYXkgKmRweSwgdW5zaWduZWQgaW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0xYVmlkZW9DYXB0dXJlRGV2aWNlTlYgZGV2aWNlKTsKK3R5cGVkZWYgR0xYVmlkZW9DYXB0dXJlRGV2aWNlTlYgKiAoICogUEZOR0xYRU5VTUVSQVRFVklERU9DQVBUVVJFREVWSUNFU05WUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgaW50ICpuZWxlbWVudHMpOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhMT0NLVklERU9DQVBUVVJFREVWSUNFTlZQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhWaWRlb0NhcHR1cmVEZXZpY2VOViBkZXZpY2UpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWFFVRVJZVklERU9DQVBUVVJFREVWSUNFTlZQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhWaWRlb0NhcHR1cmVEZXZpY2VOViBkZXZpY2UsIGludCBhdHRyaWJ1dGUsIGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhSRUxFQVNFVklERU9DQVBUVVJFREVWSUNFTlZQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhWaWRlb0NhcHR1cmVEZXZpY2VOViBkZXZpY2UpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF9zd2FwX2NvbnRyb2wKKyNkZWZpbmUgR0xYX0VYVF9zd2FwX2NvbnRyb2wgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIGludCBnbFhTd2FwSW50ZXJ2YWxFWFQgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludCBpbnRlcnZhbCk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIGludCAoICogUEZOR0xYU1dBUElOVEVSVkFMRVhUUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludCBpbnRlcnZhbCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfTlZfY29weV9pbWFnZQorI2RlZmluZSBHTFhfTlZfY29weV9pbWFnZSAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gdm9pZCBnbFhDb3B5SW1hZ2VTdWJEYXRhTlYgKERpc3BsYXkgKmRweSwgR0xYQ29udGV4dCBzcmNDdHgsIEdMdWludCBzcmNOYW1lLCBHTGVudW0gc3JjVGFyZ2V0LCBHTGludCBzcmNMZXZlbCwgR0xpbnQgc3JjWCwgR0xpbnQgc3JjWSwgR0xpbnQgc3JjWiwgR0xYQ29udGV4dCBkc3RDdHgsIEdMdWludCBkc3ROYW1lLCBHTGVudW0gZHN0VGFyZ2V0LCBHTGludCBkc3RMZXZlbCwgR0xpbnQgZHN0WCwgR0xpbnQgZHN0WSwgR0xpbnQgZHN0WiwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhDT1BZSU1BR0VTVUJEQVRBTlZQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhDb250ZXh0IHNyY0N0eCwgR0x1aW50IHNyY05hbWUsIEdMZW51bSBzcmNUYXJnZXQsIEdMaW50IHNyY0xldmVsLCBHTGludCBzcmNYLCBHTGludCBzcmNZLCBHTGludCBzcmNaLCBHTFhDb250ZXh0IGRzdEN0eCwgR0x1aW50IGRzdE5hbWUsIEdMZW51bSBkc3RUYXJnZXQsIEdMaW50IGRzdExldmVsLCBHTGludCBkc3RYLCBHTGludCBkc3RZLCBHTGludCBkc3RaLCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfSU5URUxfc3dhcF9ldmVudAorI2RlZmluZSBHTFhfSU5URUxfc3dhcF9ldmVudCAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfTlZfbXVsdGlzYW1wbGVfY292ZXJhZ2UKKyNkZWZpbmUgR0xYX05WX211bHRpc2FtcGxlX2NvdmVyYWdlIDEKKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9pbnRlcm5hbC9kcmlfaW50ZXJmYWNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL0dML2ludGVybmFsL2RyaV9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjE0NDVmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9pbnRlcm5hbC9kcmlfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw5ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0xOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMDggUmVkIEhhdCwgSW5jLgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIG9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIKKyAqIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIFRIRUlSIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIFxmaWxlIGRyaV9pbnRlcmZhY2UuaAorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIHR5cGVzIGFuZCBmdW5jdGlvbnMgdGhhdCBkZWZpbmUgdGhlIGludGVyZmFjZQorICogYmV0d2VlbiBhIERSSSBkcml2ZXIgYW5kIGRyaXZlciBsb2FkZXIuICBDdXJyZW50bHksIHRoZSBtb3N0IGNvbW1vbiBkcml2ZXIKKyAqIGxvYWRlciBpcyB0aGUgWEZyZWU4NiBsaWJHTC5zby4gIEhvd2V2ZXIsIG90aGVyIGxvYWRlcnMgZG8gZXhpc3QsIGFuZCBpbgorICogdGhlIGZ1dHVyZSB0aGUgc2VydmVyLXNpZGUgbGliZ2x4LmEgd2lsbCBhbHNvIGJlIGEgbG9hZGVyLgorICogCisgKiBcYXV0aG9yIEtldmluIEUuIE1hcnRpbiA8a2V2aW5AcHJlY2lzaW9uaW5zaWdodC5jb20+CisgKiBcYXV0aG9yIElhbiBSb21hbmljayA8aWRyQHVzLmlibS5jb20+CisgKiBcYXV0aG9yIEtyaXN0aWFuIEjDuGdzYmVyZyA8a3JoQHJlZGhhdC5jb20+CisgKi8KKworI2lmbmRlZiBEUklfSU5URVJGQUNFX0gKKyNkZWZpbmUgRFJJX0lOVEVSRkFDRV9ICisKKy8qIEZvciBhcmNocyB3aXRoIG5vIGRybS5oICovCisjaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX0dOVV9fKQorI2lmbmRlZiBfX05PVF9IQVZFX0RSTV9ICisjZGVmaW5lIF9fTk9UX0hBVkVfRFJNX0gKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX19OT1RfSEFWRV9EUk1fSAorI2luY2x1ZGUgPGRybS5oPgorI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgaW50IGRybV9jb250ZXh0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBkcm1fZHJhd2FibGVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jbGlwX3JlY3QgZHJtX2NsaXBfcmVjdF90OworI2VuZGlmCisKKy8qKgorICogXG5hbWUgRFJJIGludGVyZmFjZSBzdHJ1Y3R1cmVzCisgKgorICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIGRlZmluZSB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIEdMWCBjbGllbnQKKyAqIHNpZGUgbGlicmFyeSBhbmQgdGhlIERSSSAoZGlyZWN0IHJlbmRlcmluZyBpbmZyYXN0cnVjdHVyZSkuCisgKi8KKy8qQHsqLwordHlwZWRlZiBzdHJ1Y3QgX19EUklkaXNwbGF5UmVjCQlfX0RSSWRpc3BsYXk7Cit0eXBlZGVmIHN0cnVjdCBfX0RSSXNjcmVlblJlYwkJX19EUklzY3JlZW47Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWNvbnRleHRSZWMJCV9fRFJJY29udGV4dDsKK3R5cGVkZWYgc3RydWN0IF9fRFJJZHJhd2FibGVSZWMJCV9fRFJJZHJhd2FibGU7Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWNvbmZpZ1JlYwkJX19EUkljb25maWc7Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWZyYW1lYnVmZmVyUmVjCV9fRFJJZnJhbWVidWZmZXI7Cit0eXBlZGVmIHN0cnVjdCBfX0RSSXZlcnNpb25SZWMJCV9fRFJJdmVyc2lvbjsKKwordHlwZWRlZiBzdHJ1Y3QgX19EUkljb3JlRXh0ZW5zaW9uUmVjCQlfX0RSSWNvcmVFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWV4dGVuc2lvblJlYwkJX19EUklleHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWNvcHlTdWJCdWZmZXJFeHRlbnNpb25SZWMJX19EUkljb3B5U3ViQnVmZmVyRXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUklzd2FwQ29udHJvbEV4dGVuc2lvblJlYwlfX0RSSXN3YXBDb250cm9sRXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUklmcmFtZVRyYWNraW5nRXh0ZW5zaW9uUmVjCV9fRFJJZnJhbWVUcmFja2luZ0V4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJbWVkaWFTdHJlYW1Db3VudGVyRXh0ZW5zaW9uUmVjCV9fRFJJbWVkaWFTdHJlYW1Db3VudGVyRXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUkl0ZXhPZmZzZXRFeHRlbnNpb25SZWMJX19EUkl0ZXhPZmZzZXRFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSXRleEJ1ZmZlckV4dGVuc2lvblJlYwlfX0RSSXRleEJ1ZmZlckV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJbGVnYWN5RXh0ZW5zaW9uUmVjCQlfX0RSSWxlZ2FjeUV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJc3dyYXN0RXh0ZW5zaW9uUmVjCQlfX0RSSXN3cmFzdEV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJYnVmZmVyUmVjCQkJX19EUklidWZmZXI7Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWRyaTJFeHRlbnNpb25SZWMJCV9fRFJJZHJpMkV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJZHJpMkxvYWRlckV4dGVuc2lvblJlYwlfX0RSSWRyaTJMb2FkZXJFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSTJmbHVzaEV4dGVuc2lvblJlYwlfX0RSSTJmbHVzaEV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJMnRocm90dGxlRXh0ZW5zaW9uUmVjCV9fRFJJMnRocm90dGxlRXh0ZW5zaW9uOworCisvKkB9Ki8KKworCisvKioKKyAqIEV4dGVuc2lvbiBzdHJ1Y3QuICBEcml2ZXJzICdpbmhlcml0JyBmcm9tIHRoaXMgc3RydWN0IGJ5IGVtYmVkZGluZworICogaXQgYXMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGV4dGVuc2lvbiBzdHJ1Y3QuCisgKgorICogV2UgbmV2ZXIgYnJlYWsgQVBJIGluIGZvciBhIERSSSBleHRlbnNpb24uICBJZiB3ZSBuZWVkIHRvIGNoYW5nZQorICogdGhlIHdheSB0aGluZ3Mgd29yayBpbiBhIG5vbi1iYWNrd2FyZHMgY29tcGF0aWJsZSBtYW5uZXIsIHdlCisgKiBpbnRyb2R1Y2UgYSBuZXcgZXh0ZW5zaW9uLiAgRHVyaW5nIGEgdHJhbnNpdGlvbiBwZXJpb2QsIHdlIGNhbgorICogbGVhdmUgYm90aCB0aGUgb2xkIGFuZCB0aGUgbmV3IGV4dGVuc2lvbiBpbiB0aGUgZHJpdmVyLCB3aGljaAorICogYWxsb3dzIHVzIHRvIG1vdmUgdG8gdGhlIG5ldyBpbnRlcmZhY2Ugd2l0aG91dCBoYXZpbmcgdG8gdXBkYXRlIHRoZQorICogbG9hZGVyKHMpIGluIGxvY2sgc3RlcC4KKyAqCisgKiBIb3dldmVyLCB3ZSBjYW4gYWRkIGVudHJ5IHBvaW50cyB0byBhbiBleHRlbnNpb24gb3ZlciB0aW1lIGFzIGxvbmcKKyAqIGFzIHdlIGRvbid0IGJyZWFrIHRoZSBvbGQgb25lcy4gIEFzIHdlIGFkZCBlbnRyeSBwb2ludHMgdG8gYW4KKyAqIGV4dGVuc2lvbiwgd2UgaW5jcmVhc2UgdGhlIHZlcnNpb24gbnVtYmVyLiAgVGhlIGNvcnJlc3BvbmRpbmcKKyAqICNkZWZpbmUgY2FuIGJlIHVzZWQgdG8gZ3VhcmQgY29kZSB0aGF0IGFjY2Vzc2VzIHRoZSBuZXcgZW50cnkKKyAqIHBvaW50cyBhdCBjb21waWxlIHRpbWUgYW5kIHRoZSB2ZXJzaW9uIGZpZWxkIGluIHRoZSBleHRlbnNpb24KKyAqIHN0cnVjdCBjYW4gYmUgdXNlZCBhdCBydW4tdGltZSB0byBkZXRlcm1pbmUgaG93IHRvIHVzZSB0aGUKKyAqIGV4dGVuc2lvbi4KKyAqLworc3RydWN0IF9fRFJJZXh0ZW5zaW9uUmVjIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludCB2ZXJzaW9uOworfTsKKworLyoqCisgKiBUaGUgZmlyc3Qgc2V0IG9mIGV4dGVuc2lvbiBhcmUgdGhlIHNjcmVlbiBleHRlbnNpb25zLCByZXR1cm5lZCBieQorICogX19EUkljb3JlOjpnZXRFeHRlbnNpb25zKCkuICBUaGlzIGVudHJ5IHBvaW50IHdpbGwgcmV0dXJuIGEgbGlzdCBvZgorICogZXh0ZW5zaW9ucyBhbmQgdGhlIGxvYWRlciBjYW4gdXNlIHRoZSBvbmVzIGl0IGtub3dzIGFib3V0IGJ5CisgKiBjYXN0aW5nIHRoZW0gdG8gbW9yZSBzcGVjaWZpYyBleHRlbnNpb25zIGFuZCBhZHZlcnRpc2luZyBhbnkgR0xYCisgKiBleHRlbnNpb25zIHRoZSBEUkkgZXh0ZW5zaW9ucyBlbmFibGVzLgorICovCisKKy8qKgorICogVXNlZCBieSBkcml2ZXJzIHRvIGluZGljYXRlIHN1cHBvcnQgZm9yIHNldHRpbmcgdGhlIHJlYWQgZHJhd2FibGUuCisgKi8KKyNkZWZpbmUgX19EUklfUkVBRF9EUkFXQUJMRSAiRFJJX1JlYWREcmF3YWJsZSIKKyNkZWZpbmUgX19EUklfUkVBRF9EUkFXQUJMRV9WRVJTSU9OIDEKKworLyoqCisgKiBVc2VkIGJ5IGRyaXZlcnMgdGhhdCBpbXBsZW1lbnQgdGhlIEdMWF9NRVNBX2NvcHlfc3ViX2J1ZmZlciBleHRlbnNpb24uCisgKi8KKyNkZWZpbmUgX19EUklfQ09QWV9TVUJfQlVGRkVSICJEUklfQ29weVN1YkJ1ZmZlciIKKyNkZWZpbmUgX19EUklfQ09QWV9TVUJfQlVGRkVSX1ZFUlNJT04gMQorc3RydWN0IF9fRFJJY29weVN1YkJ1ZmZlckV4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKyAgICB2b2lkICgqY29weVN1YkJ1ZmZlcikoX19EUklkcmF3YWJsZSAqZHJhd2FibGUsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKK307CisKKy8qKgorICogVXNlZCBieSBkcml2ZXJzIHRoYXQgaW1wbGVtZW50IHRoZSBHTFhfU0dJX3N3YXBfY29udHJvbCBvcgorICogR0xYX01FU0Ffc3dhcF9jb250cm9sIGV4dGVuc2lvbi4KKyAqLworI2RlZmluZSBfX0RSSV9TV0FQX0NPTlRST0wgIkRSSV9Td2FwQ29udHJvbCIKKyNkZWZpbmUgX19EUklfU1dBUF9DT05UUk9MX1ZFUlNJT04gMQorc3RydWN0IF9fRFJJc3dhcENvbnRyb2xFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisgICAgdm9pZCAoKnNldFN3YXBJbnRlcnZhbCkoX19EUklkcmF3YWJsZSAqZHJhd2FibGUsIHVuc2lnbmVkIGludCBpbnRldmFsKTsKKyAgICB1bnNpZ25lZCBpbnQgKCpnZXRTd2FwSW50ZXJ2YWwpKF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlKTsKK307CisKKy8qKgorICogVXNlZCBieSBkcml2ZXJzIHRoYXQgaW1wbGVtZW50IHRoZSBHTFhfTUVTQV9zd2FwX2ZyYW1lX3VzYWdlIGV4dGVuc2lvbi4KKyAqLworI2RlZmluZSBfX0RSSV9GUkFNRV9UUkFDS0lORyAiRFJJX0ZyYW1lVHJhY2tpbmciCisjZGVmaW5lIF9fRFJJX0ZSQU1FX1RSQUNLSU5HX1ZFUlNJT04gMQorc3RydWN0IF9fRFJJZnJhbWVUcmFja2luZ0V4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKworICAgIC8qKgorICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGZyYW1lIHVzYWdlIHRyYWNraW5nLgorICAgICAqIAorICAgICAqIFxzaW5jZSBJbnRlcm5hbCBBUEkgdmVyc2lvbiAyMDAzMDMxNy4KKyAgICAgKi8KKyAgICBpbnQgKCpmcmFtZVRyYWNraW5nKShfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSwgR0xib29sZWFuIGVuYWJsZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBmcmFtZSB1c2FnZSBpbmZvcm1hdGlvbi4KKyAgICAgKiAKKyAgICAgKiBcc2luY2UgSW50ZXJuYWwgQVBJIHZlcnNpb24gMjAwMzAzMTcuCisgICAgICovCisgICAgaW50ICgqcXVlcnlGcmFtZVRyYWNraW5nKShfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSwKKwkJCSAgICAgIGludDY0X3QgKiBzYmMsIGludDY0X3QgKiBtaXNzZWRGcmFtZXMsCisJCQkgICAgICBmbG9hdCAqIGxhc3RNaXNzZWRVc2FnZSwgZmxvYXQgKiB1c2FnZSk7Cit9OworCisKKy8qKgorICogVXNlZCBieSBkcml2ZXJzIHRoYXQgaW1wbGVtZW50IHRoZSBHTFhfU0dJX3ZpZGVvX3N5bmMgZXh0ZW5zaW9uLgorICovCisjZGVmaW5lIF9fRFJJX01FRElBX1NUUkVBTV9DT1VOVEVSICJEUklfTWVkaWFTdHJlYW1Db3VudGVyIgorI2RlZmluZSBfX0RSSV9NRURJQV9TVFJFQU1fQ09VTlRFUl9WRVJTSU9OIDEKK3N0cnVjdCBfX0RSSW1lZGlhU3RyZWFtQ291bnRlckV4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKworICAgIC8qKgorICAgICAqIFdhaXQgZm9yIHRoZSBNU0MgdG8gZXF1YWwgdGFyZ2V0X21zYywgb3IsIGlmIHRoYXQgaGFzIGFscmVhZHkgcGFzc2VkLAorICAgICAqIHRoZSBuZXh0IHRpbWUgKE1TQyAlIGRpdmlzb3IpIGlzIGVxdWFsIHRvIHJlbWFpbmRlci4gIElmIGRpdmlzb3IgaXMKKyAgICAgKiB6ZXJvLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYXMgc29vbiBhcyBNU0MgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgICAgICogdG8gdGFyZ2V0X21zYy4KKyAgICAgKi8KKyAgICBpbnQgKCp3YWl0Rm9yTVNDKShfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSwKKwkJICAgICAgaW50NjRfdCB0YXJnZXRfbXNjLCBpbnQ2NF90IGRpdmlzb3IsIGludDY0X3QgcmVtYWluZGVyLAorCQkgICAgICBpbnQ2NF90ICogbXNjLCBpbnQ2NF90ICogc2JjKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHZlcnRpY2FsIHJlZnJlc2hlcyBzaW5jZSBzb21lIHBvaW50IGluIHRpbWUgYmVmb3JlCisgICAgICogdGhpcyBmdW5jdGlvbiB3YXMgZmlyc3QgY2FsbGVkIChpLmUuLCBzeXN0ZW0gc3RhcnQgdXApLgorICAgICAqLworICAgIGludCAoKmdldERyYXdhYmxlTVNDKShfX0RSSXNjcmVlbiAqc2NyZWVuLCBfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSwKKwkJCSAgaW50NjRfdCAqbXNjKTsKK307CisKKworI2RlZmluZSBfX0RSSV9URVhfT0ZGU0VUICJEUklfVGV4T2Zmc2V0IgorI2RlZmluZSBfX0RSSV9URVhfT0ZGU0VUX1ZFUlNJT04gMQorc3RydWN0IF9fRFJJdGV4T2Zmc2V0RXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgLyoqCisgICAgICogTWV0aG9kIHRvIG92ZXJyaWRlIGJhc2UgdGV4dHVyZSBpbWFnZSB3aXRoIGEgZHJpdmVyIHNwZWNpZmljICdvZmZzZXQnLgorICAgICAqIFRoZSBkZXB0aCBwYXNzZWQgaW4gYWxsb3dzIGUuZy4gdG8gaWdub3JlIHRoZSBhbHBoYSBjaGFubmVsIG9mIHRleHR1cmUKKyAgICAgKiBpbWFnZXMgd2hlcmUgdGhlIG5vbi1hbHBoYSBjb21wb25lbnRzIGRvbid0IG9jY3VweSBhIHdob2xlIHRleGVsLgorICAgICAqCisgICAgICogRm9yIEdMWF9FWFRfdGV4dHVyZV9mcm9tX3BpeG1hcCB3aXRoIEFJR0xYLgorICAgICAqLworICAgIHZvaWQgKCpzZXRUZXhPZmZzZXQpKF9fRFJJY29udGV4dCAqcERSSUN0eCwgR0xpbnQgdGV4bmFtZSwKKwkJCSB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCBHTGludCBkZXB0aCwgR0x1aW50IHBpdGNoKTsKK307CisKKworLyogVmFsaWQgdmFsdWVzIGZvciBmb3JtYXQgaW4gdGhlIHNldFRleEJ1ZmZlcjIgZnVuY3Rpb24gYmVsb3cuICBUaGVzZQorICogdmFsdWVzIG1hdGNoIHRoZSBHTFggdG9rZW5zIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIGJ1dCB3ZQorICogZGVmaW5lIHRoZW0gaGVyZSBzaW5jZSB0aGUgRFJJIGludGVyZmFjZSBjYW4ndCBkZXBlbmQgb24gR0xYLiAqLworI2RlZmluZSBfX0RSSV9URVhUVVJFX0ZPUk1BVF9OT05FICAgICAgICAweDIwRDgKKyNkZWZpbmUgX19EUklfVEVYVFVSRV9GT1JNQVRfUkdCICAgICAgICAgMHgyMEQ5CisjZGVmaW5lIF9fRFJJX1RFWFRVUkVfRk9STUFUX1JHQkEgICAgICAgIDB4MjBEQQorCisjZGVmaW5lIF9fRFJJX1RFWF9CVUZGRVIgIkRSSV9UZXhCdWZmZXIiCisjZGVmaW5lIF9fRFJJX1RFWF9CVUZGRVJfVkVSU0lPTiAyCitzdHJ1Y3QgX19EUkl0ZXhCdWZmZXJFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdG8gb3ZlcnJpZGUgYmFzZSB0ZXh0dXJlIGltYWdlIHdpdGggdGhlIGNvbnRlbnRzIG9mIGEKKyAgICAgKiBfX0RSSWRyYXdhYmxlLiAKKyAgICAgKgorICAgICAqIEZvciBHTFhfRVhUX3RleHR1cmVfZnJvbV9waXhtYXAgd2l0aCBBSUdMWC4gIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YKKyAgICAgKiBzZXRUZXhCdWZmZXIyIGluIHZlcnNpb24gMiBvZiB0aGlzIGludGVyZmFjZQorICAgICAqLworICAgIHZvaWQgKCpzZXRUZXhCdWZmZXIpKF9fRFJJY29udGV4dCAqcERSSUN0eCwKKwkJCSBHTGludCB0YXJnZXQsCisJCQkgX19EUklkcmF3YWJsZSAqcERyYXcpOworCisgICAgLyoqCisgICAgICogTWV0aG9kIHRvIG92ZXJyaWRlIGJhc2UgdGV4dHVyZSBpbWFnZSB3aXRoIHRoZSBjb250ZW50cyBvZiBhCisgICAgICogX19EUklkcmF3YWJsZSwgaW5jbHVkaW5nIHRoZSByZXF1aXJlZCB0ZXh0dXJlIGZvcm1hdCBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBGb3IgR0xYX0VYVF90ZXh0dXJlX2Zyb21fcGl4bWFwIHdpdGggQUlHTFguCisgICAgICovCisgICAgdm9pZCAoKnNldFRleEJ1ZmZlcjIpKF9fRFJJY29udGV4dCAqcERSSUN0eCwKKwkJCSAgR0xpbnQgdGFyZ2V0LAorCQkJICBHTGludCBmb3JtYXQsCisJCQkgIF9fRFJJZHJhd2FibGUgKnBEcmF3KTsKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdG8gcmVsZWFzZSB0ZXh0dXJlIGJ1ZmZlciBpbiBjYXNlIHNvbWUgc3BlY2lhbCBwbGF0Zm9ybQorICAgICAqIG5lZWQgdGhpcy4KKyAgICAgKgorICAgICAqIEZvciBHTFhfRVhUX3RleHR1cmVfZnJvbV9waXhtYXAgd2l0aCBBSUdMWC4KKyAgICAgKi8KKyAgICB2b2lkICgqcmVsZWFzZVRleEJ1ZmZlcikoX19EUkljb250ZXh0ICpwRFJJQ3R4LAorCQkJR0xpbnQgdGFyZ2V0LAorCQkJX19EUklkcmF3YWJsZSAqcERyYXcpOworfTsKKworLyoqCisgKiBVc2VkIGJ5IGRyaXZlcnMgdGhhdCBpbXBsZW1lbnQgRFJJMgorICovCisjZGVmaW5lIF9fRFJJMl9GTFVTSCAiRFJJMl9GbHVzaCIKKyNkZWZpbmUgX19EUkkyX0ZMVVNIX1ZFUlNJT04gMworc3RydWN0IF9fRFJJMmZsdXNoRXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworICAgIHZvaWQgKCpmbHVzaCkoX19EUklkcmF3YWJsZSAqZHJhd2FibGUpOworCisgICAgLyoqCisgICAgICogQXNrIHRoZSBkcml2ZXIgdG8gY2FsbCBnZXRCdWZmZXJzL2dldEJ1ZmZlcnNXaXRoRm9ybWF0IGJlZm9yZQorICAgICAqIGl0IHN0YXJ0cyByZW5kZXJpbmcgYWdhaW4uCisgICAgICoKKyAgICAgKiBccGFyYW0gZHJhd2FibGUgdGhlIGRyYXdhYmxlIHRvIGludmFsaWRhdGUKKyAgICAgKgorICAgICAqIFxzaW5jZSAzCisgICAgICovCisgICAgdm9pZCAoKmludmFsaWRhdGUpKF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlKTsKK307CisKKworLyoqCisgKiBFeHRlbnNpb24gdGhhdCB0aGUgZHJpdmVyIHVzZXMgdG8gcmVxdWVzdAorICogdGhyb3R0bGUgY2FsbGJhY2tzLgorICovCisKKyNkZWZpbmUgX19EUkkyX1RIUk9UVExFICJEUkkyX1Rocm90dGxlIgorI2RlZmluZSBfX0RSSTJfVEhST1RUTEVfVkVSU0lPTiAxCisKK2VudW0gX19EUkkydGhyb3R0bGVSZWFzb24geworICAgX19EUkkyX1RIUk9UVExFX1NXQVBCVUZGRVIsCisgICBfX0RSSTJfVEhST1RUTEVfQ09QWVNVQkJVRkZFUiwKKyAgIF9fRFJJMl9USFJPVFRMRV9GTFVTSEZST05UCit9OworCitzdHJ1Y3QgX19EUkkydGhyb3R0bGVFeHRlbnNpb25SZWMgeworICAgX19EUklleHRlbnNpb24gYmFzZTsKKyAgIHZvaWQgKCp0aHJvdHRsZSkoX19EUkljb250ZXh0ICpjdHgsCisJCSAgICBfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSwKKwkJICAgIGVudW0gX19EUkkydGhyb3R0bGVSZWFzb24gcmVhc29uKTsKK307CisKKy8qKgorICogWE1MIGRvY3VtZW50IGRlc2NyaWJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlCisgKiBkcml2ZXIuCisgKi8KK2V4dGVybiBjb25zdCBjaGFyIF9fZHJpQ29uZmlnT3B0aW9uc1tdOworCisvKkB9Ki8KKworLyoqCisgKiBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbnMgZGVzY3JpYmUgbG9hZGVyIGZlYXR1cmVzIHRoYXQgdGhlIERSSQorICogZHJpdmVyIGNhbiBtYWtlIHVzZSBvZi4gIFNvbWUgb2YgdGhlc2UgYXJlIG1hbmRhdG9yeSwgc3VjaCBhcyB0aGUKKyAqIGdldERyYXdhYmxlSW5mbyBleHRlbnNpb24gZm9yIERSSSBhbmQgdGhlIERSSSBMb2FkZXIgZXh0ZW5zaW9ucyBmb3IKKyAqIERSSTIsIHdoaWxlIG90aGVycyBhcmUgb3B0aW9uYWwsIGFuZCBpZiBwcmVzZW50IGFsbG93IHRoZSBkcml2ZXIgdG8KKyAqIGV4cG9zZSBjZXJ0YWluIGZlYXR1cmVzLiAgVGhlIGxvYWRlciBwYXNzIGluIGEgTlVMTCB0ZXJtaW5hdGVkCisgKiBhcnJheSBvZiB0aGVzZSBleHRlbnNpb25zIHRvIHRoZSBkcml2ZXIgaW4gdGhlIGNyZWF0ZU5ld1NjcmVlbgorICogY29uc3RydWN0b3IuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX19EUklnZXREcmF3YWJsZUluZm9FeHRlbnNpb25SZWMgX19EUklnZXREcmF3YWJsZUluZm9FeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSXN5c3RlbVRpbWVFeHRlbnNpb25SZWMgX19EUklzeXN0ZW1UaW1lRXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUklkYW1hZ2VFeHRlbnNpb25SZWMgX19EUklkYW1hZ2VFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWxvYWRlckV4dGVuc2lvblJlYyBfX0RSSWxvYWRlckV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJc3dyYXN0TG9hZGVyRXh0ZW5zaW9uUmVjIF9fRFJJc3dyYXN0TG9hZGVyRXh0ZW5zaW9uOworCisKKy8qKgorICogQ2FsbGJhY2sgdG8gZ2V0RHJhd2FibGVJbmZvIHByb3RvY29sCisgKi8KKyNkZWZpbmUgX19EUklfR0VUX0RSQVdBQkxFX0lORk8gIkRSSV9HZXREcmF3YWJsZUluZm8iCisjZGVmaW5lIF9fRFJJX0dFVF9EUkFXQUJMRV9JTkZPX1ZFUlNJT04gMQorc3RydWN0IF9fRFJJZ2V0RHJhd2FibGVJbmZvRXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9zaXRpb24sIHNpemUsIGFuZAorICAgICAqIGNsaXAgcmVjdHMgb2YgYSBkcmF3YWJsZS4KKyAgICAgKi8KKyAgICBHTGJvb2xlYW4gKCogZ2V0RHJhd2FibGVJbmZvKSAoIF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlLAorCXVuc2lnbmVkIGludCAqIGluZGV4LCB1bnNpZ25lZCBpbnQgKiBzdGFtcCwKKyAgICAgICAgaW50ICogeCwgaW50ICogeSwgaW50ICogd2lkdGgsIGludCAqIGhlaWdodCwKKyAgICAgICAgaW50ICogbnVtQ2xpcFJlY3RzLCBkcm1fY2xpcF9yZWN0X3QgKiogcENsaXBSZWN0cywKKyAgICAgICAgaW50ICogYmFja1gsIGludCAqIGJhY2tZLAorCWludCAqIG51bUJhY2tDbGlwUmVjdHMsIGRybV9jbGlwX3JlY3RfdCAqKiBwQmFja0NsaXBSZWN0cywKKwl2b2lkICpsb2FkZXJQcml2YXRlKTsKK307CisKKy8qKgorICogQ2FsbGJhY2sgdG8gZ2V0IHN5c3RlbSB0aW1lIGZvciBtZWRpYSBzdHJlYW0gY291bnRlciBleHRlbnNpb25zLgorICovCisjZGVmaW5lIF9fRFJJX1NZU1RFTV9USU1FICJEUklfU3lzdGVtVGltZSIKKyNkZWZpbmUgX19EUklfU1lTVEVNX1RJTUVfVkVSU0lPTiAxCitzdHJ1Y3QgX19EUklzeXN0ZW1UaW1lRXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSA2NC1iaXQgdW5hZGp1c3RlZCBzeXN0ZW0gdGltZSAoVVNUKS4KKyAgICAgKi8KKyAgICBpbnQgKCpnZXRVU1QpKGludDY0X3QgKiB1c3QpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtZWRpYSBzdHJlYW0gY291bnRlciAoTVNDKSByYXRlLgorICAgICAqIAorICAgICAqIE1hdGNoaW5nIHRoZSBkZWZpbml0aW9uIGluIEdMWF9PTUxfc3luY19jb250cm9sLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgICAgKiB0aGUgcmF0ZSBvZiB0aGUgIm1lZGlhIHN0cmVhbSBjb3VudGVyIi4gIEluIHByYWN0aWNhbCB0ZXJtcywgdGhpcyBpcworICAgICAqIHRoZSBmcmFtZSByZWZyZXNoIHJhdGUgb2YgdGhlIGRpc3BsYXkuCisgICAgICovCisgICAgR0xib29sZWFuICgqZ2V0TVNDUmF0ZSkoX19EUklkcmF3YWJsZSAqZHJhdywKKwkJCSAgICBpbnQzMl90ICogbnVtZXJhdG9yLCBpbnQzMl90ICogZGVub21pbmF0b3IsCisJCQkgICAgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7Cit9OworCisvKioKKyAqIERhbWFnZSByZXBvcnRpbmcKKyAqLworI2RlZmluZSBfX0RSSV9EQU1BR0UgIkRSSV9EYW1hZ2UiCisjZGVmaW5lIF9fRFJJX0RBTUFHRV9WRVJTSU9OIDEKK3N0cnVjdCBfX0RSSWRhbWFnZUV4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKworICAgIC8qKgorICAgICAqIFJlcG9ydHMgYXJlYXMgb2YgdGhlIGdpdmVuIGRyYXdhYmxlIHdoaWNoIGhhdmUgYmVlbiBtb2RpZmllZCBieSB0aGUKKyAgICAgKiBkcml2ZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gZHJhd2FibGUgd2hpY2ggdGhlIGRyYXdpbmcgd2FzIGRvbmUgdG8uCisgICAgICogXHBhcmFtIHJlY3RzIHJlY3RhbmdsZXMgYWZmZWN0ZWQsIHdpdGggdGhlIGRyYXdhYmxlIG9yaWdpbiBhcyB0aGUKKyAgICAgKgkgICAgICBvcmlnaW4uCisgICAgICogXHBhcmFtIHggWCBvZmZzZXQgb2YgdGhlIGRyYXdhYmxlIHdpdGhpbiB0aGUgc2NyZWVuICh1c2VkIGluIHRoZQorICAgICAqCSAgICAgIGZyb250X2J1ZmZlciBjYXNlKQorICAgICAqIFxwYXJhbSB5IFkgb2Zmc2V0IG9mIHRoZSBkcmF3YWJsZSB3aXRoaW4gdGhlIHNjcmVlbi4KKyAgICAgKiBccGFyYW0gZnJvbnRfYnVmZmVyIGJvb2xlYW4gZmxhZyBmb3Igd2hldGhlciB0aGUgZHJhd2luZyB0byB0aGUKKyAgICAgKiAJICAgICAgZHJhd2FibGUgd2FzIGFjdHVhbGx5IGRvbmUgZGlyZWN0bHkgdG8gdGhlIGZyb250IGJ1ZmZlciAoaW5zdGVhZAorICAgICAqCSAgICAgIG9mIGJhY2tpbmcgc3RvcmFnZSwgZm9yIGV4YW1wbGUpCisgICAgICogXHBhcmFtIGxvYWRlclByaXZhdGUgdGhlIGRhdGEgcGFzc2VkIGluIGF0IGNyZWF0ZU5ld0RyYXdhYmxlIHRpbWUKKyAgICAgKi8KKyAgICB2b2lkICgqcmVwb3J0RGFtYWdlKShfX0RSSWRyYXdhYmxlICpkcmF3LAorCQkJIGludCB4LCBpbnQgeSwKKwkJCSBkcm1fY2xpcF9yZWN0X3QgKnJlY3RzLCBpbnQgbnVtX3JlY3RzLAorCQkJIEdMYm9vbGVhbiBmcm9udF9idWZmZXIsCisJCQkgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7Cit9OworCisjZGVmaW5lIF9fRFJJX1NXUkFTVF9JTUFHRV9PUF9EUkFXCTEKKyNkZWZpbmUgX19EUklfU1dSQVNUX0lNQUdFX09QX0NMRUFSCTIKKyNkZWZpbmUgX19EUklfU1dSQVNUX0lNQUdFX09QX1NXQVAJMworCisvKioKKyAqIFNXUmFzdCBMb2FkZXIgZXh0ZW5zaW9uLgorICovCisjZGVmaW5lIF9fRFJJX1NXUkFTVF9MT0FERVIgIkRSSV9TV1Jhc3RMb2FkZXIiCisjZGVmaW5lIF9fRFJJX1NXUkFTVF9MT0FERVJfVkVSU0lPTiAxCitzdHJ1Y3QgX19EUklzd3Jhc3RMb2FkZXJFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisKKyAgICAvKgorICAgICAqIERyYXdhYmxlIHBvc2l0aW9uIGFuZCBzaXplCisgICAgICovCisgICAgdm9pZCAoKmdldERyYXdhYmxlSW5mbykoX19EUklkcmF3YWJsZSAqZHJhd2FibGUsCisJCQkgICAgaW50ICp4LCBpbnQgKnksIGludCAqd2lkdGgsIGludCAqaGVpZ2h0LAorCQkJICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgLyoqCisgICAgICogUHV0IGltYWdlIHRvIGRyYXdhYmxlCisgICAgICovCisgICAgdm9pZCAoKnB1dEltYWdlKShfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSwgaW50IG9wLAorCQkgICAgIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkgICAgIGNoYXIgKmRhdGEsIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgLyoqCisgICAgICogR2V0IGltYWdlIGZyb20gcmVhZGFibGUKKyAgICAgKi8KKyAgICB2b2lkICgqZ2V0SW1hZ2UpKF9fRFJJZHJhd2FibGUgKnJlYWRhYmxlLAorCQkgICAgIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkgICAgIGNoYXIgKmRhdGEsIHZvaWQgKmxvYWRlclByaXZhdGUpOworfTsKKworLyoqCisgKiBJbnZhbGlkYXRlIGxvYWRlciBleHRlbnNpb24uICBUaGUgcHJlc2VuY2Ugb2YgdGhpcyBleHRlbnNpb24KKyAqIGluZGljYXRlcyB0byB0aGUgRFJJIGRyaXZlciB0aGF0IHRoZSBsb2FkZXIgd2lsbCBjYWxsIGludmFsaWRhdGUgaW4KKyAqIHRoZSBfX0RSSTJfRkxVU0ggZXh0ZW5zaW9uLCB3aGVuZXZlciB0aGUgbmVlZHMgdG8gcXVlcnkgZm9yIG5ldworICogYnVmZmVycy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgRFJJIGRyaXZlciBjYW4gZHJvcCB0aGUgcG9sbGluZyBpbgorICogZ2xWaWV3cG9ydCgpLgorICoKKyAqIFRoZSBleHRlbnNpb24gZG9lc24ndCBwcm92aWRlIGFueSBmdW5jdGlvbmFsaXR5LCBpdCdzIG9ubHkgdXNlIHRvCisgKiBpbmRpY2F0ZSB0byB0aGUgZHJpdmVyIHRoYXQgaXQgY2FuIHVzZSB0aGUgbmV3IHNlbWFudGljcy4gIEEgRFJJCisgKiBkcml2ZXIgY2FuIHVzZSB0aGlzIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgc2VtYW50aWNzIG9yCisgKiBqdXN0IHJlZnVzZSB0byBpbml0aWFsaXplIGlmIHRoaXMgZXh0ZW5zaW9uIGlzbid0IHByZXNlbnQuCisgKi8KKyNkZWZpbmUgX19EUklfVVNFX0lOVkFMSURBVEUgIkRSSV9Vc2VJbnZhbGlkYXRlIgorI2RlZmluZSBfX0RSSV9VU0VfSU5WQUxJREFURV9WRVJTSU9OIDEKKwordHlwZWRlZiBzdHJ1Y3QgX19EUkl1c2VJbnZhbGlkYXRlRXh0ZW5zaW9uUmVjIF9fRFJJdXNlSW52YWxpZGF0ZUV4dGVuc2lvbjsKK3N0cnVjdCBfX0RSSXVzZUludmFsaWRhdGVFeHRlbnNpb25SZWMgeworICAgX19EUklleHRlbnNpb24gYmFzZTsKK307CisKKy8qKgorICogVGhlIHJlbWFpbmluZyBleHRlbnNpb25zIGRlc2NyaWJlIGRyaXZlciBleHRlbnNpb25zLCBpbW1lZGlhdGVseQorICogYXZhaWxhYmxlIGludGVyZmFjZXMgcHJvdmlkZWQgYnkgdGhlIGRyaXZlci4gIFRvIHN0YXJ0IHVzaW5nIHRoZQorICogZHJpdmVyLCBkbHN5bSgpIGZvciB0aGUgX19EUklfRFJJVkVSX0VYVEVOU0lPTlMgc3ltYm9sIGFuZCBsb29rIGZvcgorICogdGhlIGV4dGVuc2lvbiB5b3UgbmVlZCBpbiB0aGUgYXJyYXkuCisgKi8KKyNkZWZpbmUgX19EUklfRFJJVkVSX0VYVEVOU0lPTlMgIl9fZHJpRHJpdmVyRXh0ZW5zaW9ucyIKKworLyoqCisgKiBUb2tlbnMgZm9yIF9fRFJJY29uZmlnIGF0dHJpYnMuICBBIG51bWJlciBvZiBhdHRyaWJ1dGVzIGRlZmluZWQgYnkKKyAqIEdMWCBvciBFR0wgc3RhbmRhcmRzIGFyZSBub3QgaW4gdGhlIHRhYmxlLCBhcyB0aGV5IG11c3QgYmUgcHJvdmlkZWQKKyAqIGJ5IHRoZSBsb2FkZXIuICBGb3IgZXhhbXBsZSwgRkJDb25maWcgSUQgb3IgdmlzdWFsIElELCBkcmF3YWJsZSB0eXBlLgorICovCisKKyNkZWZpbmUgX19EUklfQVRUUklCX0JVRkZFUl9TSVpFCQkgMQorI2RlZmluZSBfX0RSSV9BVFRSSUJfTEVWRUwJCQkgMgorI2RlZmluZSBfX0RSSV9BVFRSSUJfUkVEX1NJWkUJCQkgMworI2RlZmluZSBfX0RSSV9BVFRSSUJfR1JFRU5fU0laRQkJCSA0CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9CTFVFX1NJWkUJCQkgNQorI2RlZmluZSBfX0RSSV9BVFRSSUJfTFVNSU5BTkNFX1NJWkUJCSA2CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9BTFBIQV9TSVpFCQkJIDcKKyNkZWZpbmUgX19EUklfQVRUUklCX0FMUEhBX01BU0tfU0laRQkJIDgKKyNkZWZpbmUgX19EUklfQVRUUklCX0RFUFRIX1NJWkUJCQkgOQorI2RlZmluZSBfX0RSSV9BVFRSSUJfU1RFTkNJTF9TSVpFCQkxMAorI2RlZmluZSBfX0RSSV9BVFRSSUJfQUNDVU1fUkVEX1NJWkUJCTExCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9BQ0NVTV9HUkVFTl9TSVpFCQkxMgorI2RlZmluZSBfX0RSSV9BVFRSSUJfQUNDVU1fQkxVRV9TSVpFCQkxMworI2RlZmluZSBfX0RSSV9BVFRSSUJfQUNDVU1fQUxQSEFfU0laRQkJMTQKKyNkZWZpbmUgX19EUklfQVRUUklCX1NBTVBMRV9CVUZGRVJTCQkxNQorI2RlZmluZSBfX0RSSV9BVFRSSUJfU0FNUExFUwkJCTE2CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9SRU5ERVJfVFlQRQkJMTcKKyNkZWZpbmUgX19EUklfQVRUUklCX0NPTkZJR19DQVZFQVQJCTE4CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9DT05GT1JNQU5UCQkJMTkKKyNkZWZpbmUgX19EUklfQVRUUklCX0RPVUJMRV9CVUZGRVIJCTIwCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9TVEVSRU8JCQkyMQorI2RlZmluZSBfX0RSSV9BVFRSSUJfQVVYX0JVRkZFUlMJCTIyCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9UUkFOU1BBUkVOVF9UWVBFCQkyMworI2RlZmluZSBfX0RSSV9BVFRSSUJfVFJBTlNQQVJFTlRfSU5ERVhfVkFMVUUJMjQKKyNkZWZpbmUgX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX1JFRF9WQUxVRQkyNQorI2RlZmluZSBfX0RSSV9BVFRSSUJfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUJMjYKKyNkZWZpbmUgX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUJMjcKKyNkZWZpbmUgX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX0FMUEhBX1ZBTFVFCTI4CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9GTE9BVF9NT0RFCQkJMjkKKyNkZWZpbmUgX19EUklfQVRUUklCX1JFRF9NQVNLCQkJMzAKKyNkZWZpbmUgX19EUklfQVRUUklCX0dSRUVOX01BU0sJCQkzMQorI2RlZmluZSBfX0RSSV9BVFRSSUJfQkxVRV9NQVNLCQkJMzIKKyNkZWZpbmUgX19EUklfQVRUUklCX0FMUEhBX01BU0sJCQkzMworI2RlZmluZSBfX0RSSV9BVFRSSUJfTUFYX1BCVUZGRVJfV0lEVEgJCTM0CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9NQVhfUEJVRkZFUl9IRUlHSFQJCTM1CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9NQVhfUEJVRkZFUl9QSVhFTFMJCTM2CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9PUFRJTUFMX1BCVUZGRVJfV0lEVEgJMzcKKyNkZWZpbmUgX19EUklfQVRUUklCX09QVElNQUxfUEJVRkZFUl9IRUlHSFQJMzgKKyNkZWZpbmUgX19EUklfQVRUUklCX1ZJU1VBTF9TRUxFQ1RfR1JPVVAJMzkKKyNkZWZpbmUgX19EUklfQVRUUklCX1NXQVBfTUVUSE9ECQk0MAorI2RlZmluZSBfX0RSSV9BVFRSSUJfTUFYX1NXQVBfSU5URVJWQUwJCTQxCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9NSU5fU1dBUF9JTlRFUlZBTAkJNDIKKyNkZWZpbmUgX19EUklfQVRUUklCX0JJTkRfVE9fVEVYVFVSRV9SR0IJNDMKKyNkZWZpbmUgX19EUklfQVRUUklCX0JJTkRfVE9fVEVYVFVSRV9SR0JBCTQ0CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9CSU5EX1RPX01JUE1BUF9URVhUVVJFCTQ1CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9CSU5EX1RPX1RFWFRVUkVfVEFSR0VUUwk0NgorI2RlZmluZSBfX0RSSV9BVFRSSUJfWUlOVkVSVEVECQkJNDcKKyNkZWZpbmUgX19EUklfQVRUUklCX0ZSQU1FQlVGRkVSX1NSR0JfQ0FQQUJMRQk0OAorCisvKiBfX0RSSV9BVFRSSUJfUkVOREVSX1RZUEUgKi8KKyNkZWZpbmUgX19EUklfQVRUUklCX1JHQkFfQklUCQkJMHgwMQkKKyNkZWZpbmUgX19EUklfQVRUUklCX0NPTE9SX0lOREVYX0JJVAkJMHgwMgorI2RlZmluZSBfX0RSSV9BVFRSSUJfTFVNSU5BTkNFX0JJVAkJMHgwNAorCisvKiBfX0RSSV9BVFRSSUJfQ09ORklHX0NBVkVBVCAqLworI2RlZmluZSBfX0RSSV9BVFRSSUJfU0xPV19CSVQJCQkweDAxCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9OT05fQ09ORk9STUFOVF9DT05GSUcJMHgwMgorCisvKiBfX0RSSV9BVFRSSUJfVFJBTlNQQVJFTlRfVFlQRSAqLworI2RlZmluZSBfX0RSSV9BVFRSSUJfVFJBTlNQQVJFTlRfUkdCCQkweDAwCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9UUkFOU1BBUkVOVF9JTkRFWAkJMHgwMQorCisvKiBfX0RSSV9BVFRSSUJfQklORF9UT19URVhUVVJFX1RBUkdFVFMJICovCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9URVhUVVJFXzFEX0JJVAkJMHgwMQorI2RlZmluZSBfX0RSSV9BVFRSSUJfVEVYVFVSRV8yRF9CSVQJCTB4MDIKKyNkZWZpbmUgX19EUklfQVRUUklCX1RFWFRVUkVfUkVDVEFOR0xFX0JJVAkweDA0CisKKy8qKgorICogVGhpcyBleHRlbnNpb24gZGVmaW5lcyB0aGUgY29yZSBEUkkgZnVuY3Rpb25hbGl0eS4KKyAqLworI2RlZmluZSBfX0RSSV9DT1JFICJEUklfQ29yZSIKKyNkZWZpbmUgX19EUklfQ09SRV9WRVJTSU9OIDEKKworc3RydWN0IF9fRFJJY29yZUV4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKworICAgIF9fRFJJc2NyZWVuICooKmNyZWF0ZU5ld1NjcmVlbikoaW50IHNjcmVlbiwgaW50IGZkLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgc2FyZWFfaGFuZGxlLAorCQkJCSAgICBjb25zdCBfX0RSSWV4dGVuc2lvbiAqKmV4dGVuc2lvbnMsCisJCQkJICAgIGNvbnN0IF9fRFJJY29uZmlnICoqKmRyaXZlckNvbmZpZ3MsCisJCQkJICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgdm9pZCAoKmRlc3Ryb3lTY3JlZW4pKF9fRFJJc2NyZWVuICpzY3JlZW4pOworCisgICAgY29uc3QgX19EUklleHRlbnNpb24gKiooKmdldEV4dGVuc2lvbnMpKF9fRFJJc2NyZWVuICpzY3JlZW4pOworCisgICAgaW50ICgqZ2V0Q29uZmlnQXR0cmliKShjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLAorCQkJICAgdW5zaWduZWQgaW50IGF0dHJpYiwKKwkJCSAgIHVuc2lnbmVkIGludCAqdmFsdWUpOworCisgICAgaW50ICgqaW5kZXhDb25maWdBdHRyaWIpKGNvbnN0IF9fRFJJY29uZmlnICpjb25maWcsIGludCBpbmRleCwKKwkJCSAgICAgdW5zaWduZWQgaW50ICphdHRyaWIsIHVuc2lnbmVkIGludCAqdmFsdWUpOworCisgICAgX19EUklkcmF3YWJsZSAqKCpjcmVhdGVOZXdEcmF3YWJsZSkoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkJY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJCQkJdW5zaWduZWQgaW50IGRyYXdhYmxlX2lkLAorCQkJCQl1bnNpZ25lZCBpbnQgaGVhZCwKKwkJCQkJdm9pZCAqbG9hZGVyUHJpdmF0ZSk7CisKKyAgICB2b2lkICgqZGVzdHJveURyYXdhYmxlKShfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSk7CisKKyAgICB2b2lkICgqc3dhcEJ1ZmZlcnMpKF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlKTsKKworICAgIF9fRFJJY29udGV4dCAqKCpjcmVhdGVOZXdDb250ZXh0KShfX0RSSXNjcmVlbiAqc2NyZWVuLAorCQkJCSAgICAgIGNvbnN0IF9fRFJJY29uZmlnICpjb25maWcsCisJCQkJICAgICAgX19EUkljb250ZXh0ICpzaGFyZWQsCisJCQkJICAgICAgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7CisKKyAgICBpbnQgKCpjb3B5Q29udGV4dCkoX19EUkljb250ZXh0ICpkZXN0LAorCQkgICAgICAgX19EUkljb250ZXh0ICpzcmMsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIG1hc2spOworCisgICAgdm9pZCAoKmRlc3Ryb3lDb250ZXh0KShfX0RSSWNvbnRleHQgKmNvbnRleHQpOworCisgICAgaW50ICgqYmluZENvbnRleHQpKF9fRFJJY29udGV4dCAqY3R4LAorCQkgICAgICAgX19EUklkcmF3YWJsZSAqcGRyYXcsCisJCSAgICAgICBfX0RSSWRyYXdhYmxlICpwcmVhZCk7CisKKyAgICBpbnQgKCp1bmJpbmRDb250ZXh0KShfX0RSSWNvbnRleHQgKmN0eCk7Cit9OworCisvKioKKyAqIFN0b3JlZCB2ZXJzaW9uIG9mIHNvbWUgY29tcG9uZW50IChpLmUuLCBzZXJ2ZXItc2lkZSBEUkkgbW9kdWxlLCBrZXJuZWwtc2lkZQorICogRFJNLCBldGMuKS4KKyAqIAorICogXHRvZG8KKyAqIFRoZXJlIGFyZSBzZXZlcmFsIGRhdGEgc3RydWN0dXJlcyB0aGF0IGV4cGxpY2l0bHkgc3RvcmUgYSBtYWpvciB2ZXJzaW9uLAorICogbWlub3IgdmVyc2lvbiwgYW5kIHBhdGNoIGxldmVsLiAgVGhlc2Ugc3RydWN0dXJlcyBzaG91bGQgYmUgbW9kaWZpZWQgdG8KKyAqIGhhdmUgYSBcYyBfX0RSSXZlcnNpb25SZWMgaW5zdGVhZC4KKyAqLworc3RydWN0IF9fRFJJdmVyc2lvblJlYyB7CisgICAgaW50ICAgIG1ham9yOyAgICAgICAgLyoqPCBNYWpvciB2ZXJzaW9uIG51bWJlci4gKi8KKyAgICBpbnQgICAgbWlub3I7ICAgICAgICAvKio8IE1pbm9yIHZlcnNpb24gbnVtYmVyLiAqLworICAgIGludCAgICBwYXRjaDsgICAgICAgIC8qKjwgUGF0Y2gtbGV2ZWwuICovCit9OworCisvKioKKyAqIEZyYW1lYnVmZmVyIGluZm9ybWF0aW9uIHJlY29yZC4gIFVzZWQgYnkgbGliR0wgdG8gY29tbXVuaWNhdGUgaW5mb3JtYXRpb24KKyAqIGFib3V0IHRoZSBmcmFtZWJ1ZmZlciB0byB0aGUgZHJpdmVyJ3MgXGMgX19kcmlDcmVhdGVOZXdTY3JlZW4gZnVuY3Rpb24uCisgKiAKKyAqIEluIFhGcmVlODYsIG1vc3Qgb2YgdGhpcyBpbmZvcm1hdGlvbiBpcyBkZXJyaXZlZCBmcm9tIGRhdGEgcmV0dXJuZWQgYnkKKyAqIGNhbGxpbmcgXGMgWEY4NkRSSUdldERldmljZUluZm8uCisgKgorICogXHNhIFhGODZEUklHZXREZXZpY2VJbmZvIF9fRFJJZGlzcGxheVJlYzo6Y3JlYXRlTmV3U2NyZWVuCisgKiAgICAgX19kcmlVdGlsQ3JlYXRlTmV3U2NyZWVuIENhbGxDcmVhdGVOZXdTY3JlZW4KKyAqCisgKiBcYnVnIFRoaXMgc3RydWN0dXJlIGNvdWxkIGJlIGJldHRlciBuYW1lZC4KKyAqLworc3RydWN0IF9fRFJJZnJhbWVidWZmZXJSZWMgeworICAgIHVuc2lnbmVkIGNoYXIgKmJhc2U7ICAgIC8qKjwgRnJhbWVidWZmZXIgYmFzZSBhZGRyZXNzIGluIHRoZSBDUFUncworCQkJICAgICAqIGFkZHJlc3Mgc3BhY2UuICBUaGlzIHZhbHVlIGlzIGNhbGN1bGF0ZWQgYnkKKwkJCSAgICAgKiBjYWxsaW5nIFxjIGRybU1hcCBvbiB0aGUgZnJhbWVidWZmZXIgaGFuZGxlCisJCQkgICAgICogcmV0dXJuZWQgYnkgXGMgWEY4NkRSSUdldERldmljZUluZm8gKG9yIGEKKwkJCSAgICAgKiBzaW1pbGFyIGZ1bmN0aW9uKS4KKwkJCSAgICAgKi8KKyAgICBpbnQgc2l6ZTsgICAgICAgICAgICAgICAvKio8IEZyYW1lYnVmZmVyIHNpemUsIGluIGJ5dGVzLiAqLworICAgIGludCBzdHJpZGU7ICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIGZyb20gb25lIGxpbmUgdG8gdGhlIG5leHQuICovCisgICAgaW50IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCBQaXhlbCB3aWR0aCBvZiB0aGUgZnJhbWVidWZmZXIuICovCisgICAgaW50IGhlaWdodDsgICAgICAgICAgICAgLyoqPCBQaXhlbCBoZWlnaHQgb2YgdGhlIGZyYW1lYnVmZmVyLiAqLworICAgIGludCBkZXZfcHJpdl9zaXplOyAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgZHJpdmVyJ3MgZGV2LXByaXYgc3RydWN0dXJlLiAqLworICAgIHZvaWQgKmRldl9wcml2OyAgICAgICAgIC8qKjwgUG9pbnRlciB0byB0aGUgZHJpdmVyJ3MgZGV2LXByaXYgc3RydWN0dXJlLiAqLworfTsKKworCisvKioKKyAqIFRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHNjcmVlbiwgZHJhd2FibGUgYW5kIGNvbnRleHQKKyAqIGNvbnN0cnVjdG9ycyBmb3IgbGVnYWN5IERSSSBmdW5jdGlvbmFsaXR5LiAgVGhpcyBpcyB1c2VkIGluCisgKiBjb25qdW5jdGlvbiB3aXRoIHRoZSBjb3JlIGV4dGVuc2lvbi4KKyAqLworI2RlZmluZSBfX0RSSV9MRUdBQ1kgIkRSSV9MZWdhY3kiCisjZGVmaW5lIF9fRFJJX0xFR0FDWV9WRVJTSU9OIDEKKworc3RydWN0IF9fRFJJbGVnYWN5RXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgX19EUklzY3JlZW4gKigqY3JlYXRlTmV3U2NyZWVuKShpbnQgc2NyZWVuLAorCQkJCSAgICBjb25zdCBfX0RSSXZlcnNpb24gKmRkeF92ZXJzaW9uLAorCQkJCSAgICBjb25zdCBfX0RSSXZlcnNpb24gKmRyaV92ZXJzaW9uLAorCQkJCSAgICBjb25zdCBfX0RSSXZlcnNpb24gKmRybV92ZXJzaW9uLAorCQkJCSAgICBjb25zdCBfX0RSSWZyYW1lYnVmZmVyICpmcmFtZV9idWZmZXIsCisJCQkJICAgIHZvaWQgKnBTQVJFQSwgaW50IGZkLCAKKwkJCQkgICAgY29uc3QgX19EUklleHRlbnNpb24gKipleHRlbnNpb25zLAorCQkJCSAgICBjb25zdCBfX0RSSWNvbmZpZyAqKipkcml2ZXJfY29uZmlncywKKwkJCQkgICAgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7CisKKyAgICBfX0RSSWRyYXdhYmxlICooKmNyZWF0ZU5ld0RyYXdhYmxlKShfX0RSSXNjcmVlbiAqc2NyZWVuLAorCQkJCQljb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLAorCQkJCQlkcm1fZHJhd2FibGVfdCBod0RyYXdhYmxlLAorCQkJCQlpbnQgcmVuZGVyVHlwZSwgY29uc3QgaW50ICphdHRycywKKwkJCQkJdm9pZCAqbG9hZGVyUHJpdmF0ZSk7CisKKyAgICBfX0RSSWNvbnRleHQgKigqY3JlYXRlTmV3Q29udGV4dCkoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkgICAgICBjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLAorCQkJCSAgICAgIGludCByZW5kZXJfdHlwZSwKKwkJCQkgICAgICBfX0RSSWNvbnRleHQgKnNoYXJlZCwKKwkJCQkgICAgICBkcm1fY29udGV4dF90IGh3Q29udGV4dCwKKwkJCQkgICAgICB2b2lkICpsb2FkZXJQcml2YXRlKTsKK307CisKKy8qKgorICogVGhpcyBleHRlbnNpb24gcHJvdmlkZXMgYWx0ZXJuYXRpdmUgc2NyZWVuLCBkcmF3YWJsZSBhbmQgY29udGV4dAorICogY29uc3RydWN0b3JzIGZvciBzd3Jhc3QgRFJJIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGlzIHVzZWQgaW4KKyAqIGNvbmp1bmN0aW9uIHdpdGggdGhlIGNvcmUgZXh0ZW5zaW9uLgorICovCisjZGVmaW5lIF9fRFJJX1NXUkFTVCAiRFJJX1NXUmFzdCIKKyNkZWZpbmUgX19EUklfU1dSQVNUX1ZFUlNJT04gMworCitzdHJ1Y3QgX19EUklzd3Jhc3RFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisKKyAgICBfX0RSSXNjcmVlbiAqKCpjcmVhdGVOZXdTY3JlZW4pKGludCBzY3JlZW4sCisJCQkJICAgIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICoqZXh0ZW5zaW9ucywKKwkJCQkgICAgY29uc3QgX19EUkljb25maWcgKioqZHJpdmVyX2NvbmZpZ3MsCisJCQkJICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgX19EUklkcmF3YWJsZSAqKCpjcmVhdGVOZXdEcmF3YWJsZSkoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkJY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJCQkJdm9pZCAqbG9hZGVyUHJpdmF0ZSk7CisKKyAgIC8qIFNpbmNlIHZlcnNpb24gMiAqLworICAgX19EUkljb250ZXh0ICooKmNyZWF0ZU5ld0NvbnRleHRGb3JBUEkpKF9fRFJJc2NyZWVuICpzY3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRFJJY29udGV4dCAqc2hhcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpOworCisgICAvKioKKyAgICAqIENyZWF0ZSBhIGNvbnRleHQgZm9yIGEgcGFydGljdWxhciBBUEkgd2l0aCBhIHNldCBvZiBhdHRyaWJ1dGVzCisgICAgKgorICAgICogXHNpbmNlIHZlcnNpb24gMworICAgICoKKyAgICAqIFxzYSBfX0RSSWRyaTJFeHRlbnNpb25SZWM6OmNyZWF0ZUNvbnRleHRBdHRyaWJzCisgICAgKi8KKyAgIF9fRFJJY29udGV4dCAqKCpjcmVhdGVDb250ZXh0QXR0cmlicykoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkJIGludCBhcGksCisJCQkJCSBjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLAorCQkJCQkgX19EUkljb250ZXh0ICpzaGFyZWQsCisJCQkJCSB1bnNpZ25lZCBudW1fYXR0cmlicywKKwkJCQkJIGNvbnN0IHVpbnQzMl90ICphdHRyaWJzLAorCQkJCQkgdW5zaWduZWQgKmVycm9yLAorCQkJCQkgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7Cit9OworCisvKioKKyAqIERSSTIgTG9hZGVyIGV4dGVuc2lvbi4KKyAqLworI2RlZmluZSBfX0RSSV9CVUZGRVJfRlJPTlRfTEVGVAkJMAorI2RlZmluZSBfX0RSSV9CVUZGRVJfQkFDS19MRUZUCQkxCisjZGVmaW5lIF9fRFJJX0JVRkZFUl9GUk9OVF9SSUdIVAkyCisjZGVmaW5lIF9fRFJJX0JVRkZFUl9CQUNLX1JJR0hUCQkzCisjZGVmaW5lIF9fRFJJX0JVRkZFUl9ERVBUSAkJNAorI2RlZmluZSBfX0RSSV9CVUZGRVJfU1RFTkNJTAkJNQorI2RlZmluZSBfX0RSSV9CVUZGRVJfQUNDVU0JCTYKKyNkZWZpbmUgX19EUklfQlVGRkVSX0ZBS0VfRlJPTlRfTEVGVAk3CisjZGVmaW5lIF9fRFJJX0JVRkZFUl9GQUtFX0ZST05UX1JJR0hUCTgKKyNkZWZpbmUgX19EUklfQlVGRkVSX0RFUFRIX1NURU5DSUwJOSAgLyoqPCBPbmx5IGF2YWlsYWJsZSB3aXRoIERSSTIgMS4xICovCisjZGVmaW5lIF9fRFJJX0JVRkZFUl9ISVoJCTEwCisKKy8qIElub2ZmaWNpYWwgYW5kIGZvciBpbnRlcm5hbCB1c2UuIEluY3JlYXNlIHdoZW4gYWRkaW5nIGEgbmV3IGJ1ZmZlciB0b2tlbi4gKi8KKyNkZWZpbmUgX19EUklfQlVGRkVSX0NPVU5UCQkxMQorCitzdHJ1Y3QgX19EUklidWZmZXJSZWMgeworICAgIHVuc2lnbmVkIGludCBhdHRhY2htZW50OworICAgIHVuc2lnbmVkIGludCBuYW1lOworICAgIHVuc2lnbmVkIGludCBwaXRjaDsKKyAgICB1bnNpZ25lZCBpbnQgY3BwOworICAgIHVuc2lnbmVkIGludCBmbGFnczsKK307CisKKyNkZWZpbmUgX19EUklfRFJJMl9MT0FERVIgIkRSSV9EUkkyTG9hZGVyIgorI2RlZmluZSBfX0RSSV9EUkkyX0xPQURFUl9WRVJTSU9OIDMKK3N0cnVjdCBfX0RSSWRyaTJMb2FkZXJFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisKKyAgICBfX0RSSWJ1ZmZlciAqKCpnZXRCdWZmZXJzKShfX0RSSWRyYXdhYmxlICpkcmlEcmF3YWJsZSwKKwkJCSAgICAgICBpbnQgKndpZHRoLCBpbnQgKmhlaWdodCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmF0dGFjaG1lbnRzLCBpbnQgY291bnQsCisJCQkgICAgICAgaW50ICpvdXRfY291bnQsIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgLyoqCisgICAgICogRmx1c2ggcGVuZGluZyBmcm9udC1idWZmZXIgcmVuZGVyaW5nCisgICAgICoKKyAgICAgKiBBbnkgcmVuZGVyaW5nIHRoYXQgaGFzIGJlZW4gcGVyZm9ybWVkIHRvIHRoZQorICAgICAqIFxjIF9fRFJJX0JVRkZFUl9GQUtFX0ZST05UX0xFRlQgd2lsbCBiZSBmbHVzaGVkIHRvIHRoZQorICAgICAqIFxjIF9fRFJJX0JVRkZFUl9GUk9OVF9MRUZULgorICAgICAqCisgICAgICogXHBhcmFtIGRyaURyYXdhYmxlICAgIERyYXdhYmxlIHdob3NlIGZyb250LWJ1ZmZlciBpcyB0byBiZSBmbHVzaGVkCisgICAgICogXHBhcmFtIGxvYWRlclByaXZhdGUgIExvYWRlcidzIHByaXZhdGUgZGF0YSB0aGF0IHdhcyBwcmV2aW91c2x5IHBhc3NlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBpbnRvIF9fRFJJZHJpMkV4dGVuc2lvblJlYzo6Y3JlYXRlTmV3RHJhd2FibGUKKyAgICAgKi8KKyAgICB2b2lkICgqZmx1c2hGcm9udEJ1ZmZlcikoX19EUklkcmF3YWJsZSAqZHJpRHJhd2FibGUsIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQgbGlzdCBvZiBidWZmZXJzIGZyb20gdGhlIHNlcnZlcgorICAgICAqCisgICAgICogR2V0cyBhIGxpc3Qgb2YgYnVmZmVyIGZvciB0aGUgc3BlY2lmaWVkIHNldCBvZiBhdHRhY2htZW50cy4gIFVubGlrZQorICAgICAqIFxjIDo6Z2V0QnVmZmVycywgdGhpcyBmdW5jdGlvbiB0YWtlcyBhIGxpc3Qgb2YgYXR0YWNobWVudHMgcGFpcmVkIHdpdGgKKyAgICAgKiBvcGFxdWUgXGMgdW5zaWduZWQgXGMgaW50IHZhbHVlIGRlc2NyaWJpbmcgdGhlIGZvcm1hdCBvZiB0aGUgYnVmZmVyLgorICAgICAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGtub3cgd2hhdCB0aGUgc2VydmljZSB0aGF0CisgICAgICogYWxsb2NhdGVzIHRoZSBidWZmZXJzIHdpbGwgZXhwZWN0IHRvIHJlY2VpdmUgZm9yIHRoZSBmb3JtYXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gZHJpRHJhd2FibGUgICAgRHJhd2FibGUgd2hvc2UgYnVmZmVycyBhcmUgYmVpbmcgcXVlcmllZC4KKyAgICAgKiBccGFyYW0gd2lkdGggICAgICAgICAgT3V0cHV0IHdoZXJlIHRoZSB3aWR0aCBvZiB0aGUgYnVmZmVycyBpcyBzdG9yZWQuCisgICAgICogXHBhcmFtIGhlaWdodCAgICAgICAgIE91dHB1dCB3aGVyZSB0aGUgaGVpZ2h0IG9mIHRoZSBidWZmZXJzIGlzIHN0b3JlZC4KKyAgICAgKiBccGFyYW0gYXR0YWNobWVudHMgICAgTGlzdCBvZiBwYWlycyBvZiBhdHRhY2htZW50IElEIGFuZCBvcGFxdWUgZm9ybWF0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCBmb3IgdGhlIGRyYXdhYmxlLgorICAgICAqIFxwYXJhbSBjb3VudCAgICAgICAgICBOdW1iZXIgb2YgYXR0YWNobWVudCAvIGZvcm1hdCBwYWlycyBzdG9yZWQgaW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgXGMgYXR0YWNobWVudHMuCisgICAgICogXHBhcmFtIGxvYWRlclByaXZhdGUgIExvYWRlcidzIHByaXZhdGUgZGF0YSB0aGF0IHdhcyBwcmV2aW91c2x5IHBhc3NlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBpbnRvIF9fRFJJZHJpMkV4dGVuc2lvblJlYzo6Y3JlYXRlTmV3RHJhd2FibGUuCisgICAgICovCisgICAgX19EUklidWZmZXIgKigqZ2V0QnVmZmVyc1dpdGhGb3JtYXQpKF9fRFJJZHJhd2FibGUgKmRyaURyYXdhYmxlLAorCQkJCQkgaW50ICp3aWR0aCwgaW50ICpoZWlnaHQsCisJCQkJCSB1bnNpZ25lZCBpbnQgKmF0dGFjaG1lbnRzLCBpbnQgY291bnQsCisJCQkJCSBpbnQgKm91dF9jb3VudCwgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7Cit9OworCisvKioKKyAqIFRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHNjcmVlbiwgZHJhd2FibGUgYW5kIGNvbnRleHQKKyAqIGNvbnN0cnVjdG9ycyBmb3IgRFJJMi4KKyAqLworI2RlZmluZSBfX0RSSV9EUkkyICJEUklfRFJJMiIKKyNkZWZpbmUgX19EUklfRFJJMl9WRVJTSU9OIDMKKworI2RlZmluZSBfX0RSSV9BUElfT1BFTkdMCTAJLyoqPCBPcGVuR0wgY29tcGF0aWJpbGl0eSBwcm9maWxlICovCisjZGVmaW5lIF9fRFJJX0FQSV9HTEVTCQkxCisjZGVmaW5lIF9fRFJJX0FQSV9HTEVTMgkJMgorI2RlZmluZSBfX0RSSV9BUElfT1BFTkdMX0NPUkUJMwkvKio8IE9wZW5HTCAzLjIrIGNvcmUgcHJvZmlsZSAqLworCisjZGVmaW5lIF9fRFJJX0NUWF9BVFRSSUJfTUFKT1JfVkVSU0lPTgkJMAorI2RlZmluZSBfX0RSSV9DVFhfQVRUUklCX01JTk9SX1ZFUlNJT04JCTEKKyNkZWZpbmUgX19EUklfQ1RYX0FUVFJJQl9GTEFHUwkJCTIKKworI2RlZmluZSBfX0RSSV9DVFhfRkxBR19ERUJVRwkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgX19EUklfQ1RYX0ZMQUdfRk9SV0FSRF9DT01QQVRJQkxFCTB4MDAwMDAwMDIKKworLyoqCisgKiBcbmFtZSBSZWFzb25zIHRoYXQgX19EUklkcmkyRXh0ZW5zaW9uOjpjcmVhdGVDb250ZXh0QXR0cmlicyBtaWdodCBmYWlsCisgKi8KKy8qQHsqLworLyoqIFN1Y2Nlc3MhICovCisjZGVmaW5lIF9fRFJJX0NUWF9FUlJPUl9TVUNDRVNTCQkJMAorCisvKiogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSAqLworI2RlZmluZSBfX0RSSV9DVFhfRVJST1JfTk9fTUVNT1JZCQkxCisKKy8qKiBDbGllbnQgcmVxdWVzdGVkIGFuIEFQSSAoZS5nLiwgT3BlbkdMIEVTIDIuMCkgdGhhdCB0aGUgZHJpdmVyIGNhbid0IGRvLiAqLworI2RlZmluZSBfX0RSSV9DVFhfRVJST1JfQkFEX0FQSQkJCTIKKworLyoqIENsaWVudCByZXF1ZXN0ZWQgYW4gQVBJIHZlcnNpb24gdGhhdCB0aGUgZHJpdmVyIGNhbid0IGRvLiAqLworI2RlZmluZSBfX0RSSV9DVFhfRVJST1JfQkFEX1ZFUlNJT04JCTMKKworLyoqIENsaWVudCByZXF1ZXN0ZWQgYSBmbGFnIG9yIGNvbWJpbmF0aW9uIG9mIGZsYWdzIHRoZSBkcml2ZXIgY2FuJ3QgZG8uICovCisjZGVmaW5lIF9fRFJJX0NUWF9FUlJPUl9CQURfRkxBRwkJNAorCisvKiogQ2xpZW50IHJlcXVlc3RlZCBhbiBhdHRyaWJ1dGUgdGhlIGRyaXZlciBkb2Vzbid0IHVuZGVyc3RhbmQuICovCisjZGVmaW5lIF9fRFJJX0NUWF9FUlJPUl9VTktOT1dOX0FUVFJJQlVURQk1CisKKy8qKiBDbGllbnQgcmVxdWVzdGVkIGEgZmxhZyB0aGUgZHJpdmVyIGRvZXNuJ3QgdW5kZXJzdGFuZC4gKi8KKyNkZWZpbmUgX19EUklfQ1RYX0VSUk9SX1VOS05PV05fRkxBRwkJNgorLypAfSovCisKK3N0cnVjdCBfX0RSSWRyaTJFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisKKyAgICBfX0RSSXNjcmVlbiAqKCpjcmVhdGVOZXdTY3JlZW4pKGludCBzY3JlZW4sIGludCBmZCwKKwkJCQkgICAgY29uc3QgX19EUklleHRlbnNpb24gKipleHRlbnNpb25zLAorCQkJCSAgICBjb25zdCBfX0RSSWNvbmZpZyAqKipkcml2ZXJfY29uZmlncywKKwkJCQkgICAgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7CisKKyAgICBfX0RSSWRyYXdhYmxlICooKmNyZWF0ZU5ld0RyYXdhYmxlKShfX0RSSXNjcmVlbiAqc2NyZWVuLAorCQkJCQljb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLAorCQkJCQl2b2lkICpsb2FkZXJQcml2YXRlKTsKKworICAgIF9fRFJJY29udGV4dCAqKCpjcmVhdGVOZXdDb250ZXh0KShfX0RSSXNjcmVlbiAqc2NyZWVuLAorCQkJCSAgICAgIGNvbnN0IF9fRFJJY29uZmlnICpjb25maWcsCisJCQkJICAgICAgX19EUkljb250ZXh0ICpzaGFyZWQsCisJCQkJICAgICAgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7CisKKyAgIC8qIFNpbmNlIHZlcnNpb24gMiAqLworICAgdW5zaWduZWQgaW50ICgqZ2V0QVBJTWFzaykoX19EUklzY3JlZW4gKnNjcmVlbik7CisKKyAgIF9fRFJJY29udGV4dCAqKCpjcmVhdGVOZXdDb250ZXh0Rm9yQVBJKShfX0RSSXNjcmVlbiAqc2NyZWVuLAorCQkJCQkgICBpbnQgYXBpLAorCQkJCQkgICBjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLAorCQkJCQkgICBfX0RSSWNvbnRleHQgKnNoYXJlZCwKKwkJCQkJICAgdm9pZCAqZGF0YSk7CisKKyAgIF9fRFJJYnVmZmVyICooKmFsbG9jYXRlQnVmZmVyKShfX0RSSXNjcmVlbiAqc2NyZWVuLAorCQkJCSAgdW5zaWduZWQgaW50IGF0dGFjaG1lbnQsCisJCQkJICB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCSAgaW50IHdpZHRoLAorCQkJCSAgaW50IGhlaWdodCk7CisgICB2b2lkICgqcmVsZWFzZUJ1ZmZlcikoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCSBfX0RSSWJ1ZmZlciAqYnVmZmVyKTsKKworICAgLyoqCisgICAgKiBDcmVhdGUgYSBjb250ZXh0IGZvciBhIHBhcnRpY3VsYXIgQVBJIHdpdGggYSBzZXQgb2YgYXR0cmlidXRlcworICAgICoKKyAgICAqIFxzaW5jZSB2ZXJzaW9uIDMKKyAgICAqCisgICAgKiBcc2EgX19EUklzd3Jhc3RFeHRlbnNpb25SZWM6OmNyZWF0ZUNvbnRleHRBdHRyaWJzCisgICAgKi8KKyAgIF9fRFJJY29udGV4dCAqKCpjcmVhdGVDb250ZXh0QXR0cmlicykoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkJIGludCBhcGksCisJCQkJCSBjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLAorCQkJCQkgX19EUkljb250ZXh0ICpzaGFyZWQsCisJCQkJCSB1bnNpZ25lZCBudW1fYXR0cmlicywKKwkJCQkJIGNvbnN0IHVpbnQzMl90ICphdHRyaWJzLAorCQkJCQkgdW5zaWduZWQgKmVycm9yLAorCQkJCQkgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7Cit9OworCisKKy8qKgorICogVGhpcyBleHRlbnNpb24gcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSB0byBlbmFibGUgdmFyaW91cyBFR0xJbWFnZQorICogZXh0ZW5zaW9ucy4KKyAqLworI2RlZmluZSBfX0RSSV9JTUFHRSAiRFJJX0lNQUdFIgorI2RlZmluZSBfX0RSSV9JTUFHRV9WRVJTSU9OIDEKKworLyoqCisgKiBUaGVzZSBmb3JtYXRzIGNvcnJlc3BvbmQgdG8gdGhlIHNpbWlsYXJseSBuYW1lZCBNRVNBX0ZPUk1BVF8qCisgKiB0b2tlbnMsIGV4Y2VwdCBpbiB0aGUgbmF0aXZlIGVuZGlhbiBvZiB0aGUgQ1BVLiAgRm9yIGV4YW1wbGUsIG9uCisgKiBsaXR0bGUgZW5kaWFuIF9fRFJJX0lNQUdFX0ZPUk1BVF9YUkdCODg4OCBjb3JyZXNwb25kcyB0bworICogTUVTQV9GT1JNQVRfWFJHQjg4ODgsIGJ1dCBNRVNBX0ZPUk1BVF9YUkdCODg4OF9SRVYgb24gYmlnIGVuZGlhbi4KKyAqLworI2RlZmluZSBfX0RSSV9JTUFHRV9GT1JNQVRfUkdCNTY1ICAgICAgIDB4MTAwMQorI2RlZmluZSBfX0RSSV9JTUFHRV9GT1JNQVRfWFJHQjg4ODggICAgIDB4MTAwMgorI2RlZmluZSBfX0RSSV9JTUFHRV9GT1JNQVRfQVJHQjg4ODggICAgIDB4MTAwMworI2RlZmluZSBfX0RSSV9JTUFHRV9GT1JNQVRfQUJHUjg4ODggICAgIDB4MTAwNAorCisjZGVmaW5lIF9fRFJJX0lNQUdFX1VTRV9TSEFSRQkJMHgwMDAxCisjZGVmaW5lIF9fRFJJX0lNQUdFX1VTRV9TQ0FOT1VUCQkweDAwMDIKKyNkZWZpbmUgX19EUklfSU1BR0VfVVNFX0NVUlNPUgkJMHgwMDA0CisKKy8qKgorICogcXVlcnlJbWFnZSBhdHRyaWJ1dGVzCisgKi8KKworI2RlZmluZSBfX0RSSV9JTUFHRV9BVFRSSUJfU1RSSURFCTB4MjAwMAorI2RlZmluZSBfX0RSSV9JTUFHRV9BVFRSSUJfSEFORExFCTB4MjAwMQorI2RlZmluZSBfX0RSSV9JTUFHRV9BVFRSSUJfTkFNRQkJMHgyMDAyCisKK3R5cGVkZWYgc3RydWN0IF9fRFJJaW1hZ2VSZWMgICAgICAgICAgX19EUklpbWFnZTsKK3R5cGVkZWYgc3RydWN0IF9fRFJJaW1hZ2VFeHRlbnNpb25SZWMgX19EUklpbWFnZUV4dGVuc2lvbjsKK3N0cnVjdCBfX0RSSWltYWdlRXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgX19EUklpbWFnZSAqKCpjcmVhdGVJbWFnZUZyb21OYW1lKShfX0RSSXNjcmVlbiAqc2NyZWVuLAorCQkJCSAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsCisJCQkJICAgICAgIGludCBuYW1lLCBpbnQgcGl0Y2gsCisJCQkJICAgICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgX19EUklpbWFnZSAqKCpjcmVhdGVJbWFnZUZyb21SZW5kZXJidWZmZXIpKF9fRFJJY29udGV4dCAqY29udGV4dCwKKwkJCQkJICAgICAgIGludCByZW5kZXJidWZmZXIsCisJCQkJCSAgICAgICB2b2lkICpsb2FkZXJQcml2YXRlKTsKKworICAgIHZvaWQgKCpkZXN0cm95SW1hZ2UpKF9fRFJJaW1hZ2UgKmltYWdlKTsKKworICAgIF9fRFJJaW1hZ2UgKigqY3JlYXRlSW1hZ2UpKF9fRFJJc2NyZWVuICpzY3JlZW4sCisJCQkgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LAorCQkJICAgICAgIHVuc2lnbmVkIGludCB1c2UsCisJCQkgICAgICAgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7CisKKyAgIEdMYm9vbGVhbiAoKnF1ZXJ5SW1hZ2UpKF9fRFJJaW1hZ2UgKmltYWdlLCBpbnQgYXR0cmliLCBpbnQgKnZhbHVlKTsKKworICAgLyoqCisgICAgKiBUaGUgbmV3IF9fRFJJaW1hZ2Ugd2lsbCBzaGFyZSB0aGUgY29udGVudCB3aXRoIHRoZSBvbGQgb25lLCBzZWUgZHVwKDIpLgorICAgICovCisgICBfX0RSSWltYWdlICooKmR1cEltYWdlKShfX0RSSWltYWdlICppbWFnZSwgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7Cit9OworCisKKy8qKgorICogVGhpcyBleHRlbnNpb24gbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgbG9hZGVyIGFuZCBwYXNzZWQgdG8gdGhlCisgKiBkcml2ZXIgYXQgc2NyZWVuIGNyZWF0aW9uIHRpbWUuICBUaGUgRUdMSW1hZ2UgZW50cnkgcG9pbnRzIGluIHRoZQorICogdmFyaW91cyBjbGllbnQgQVBJcyB0YWtlIG9wYXF1ZSBFR0xJbWFnZSBoYW5kbGVzIGFuZCB1c2UgdGhpcworICogZXh0ZW5zaW9uIHRvIG1hcCB0aGVtIHRvIGEgX19EUklpbWFnZS4gIEF0IHZlcnNpb24gMSwgdGhpcworICogZXh0ZW5zaW9ucyBhbGxvd3MgbWFwcGluZyBFR0xJbWFnZSBwb2ludGVycyB0byBfX0RSSWltYWdlIHBvaW50ZXJzLAorICogYnV0IGZ1dHVyZSB2ZXJzaW9ucyBjb3VsZCBzdXBwb3J0IG90aGVyIEVHTEltYWdlLWxpa2UsIG9wYXF1ZSB0eXBlcworICogd2l0aCBuZXcgbG9va3VwIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBfX0RSSV9JTUFHRV9MT09LVVAgIkRSSV9JTUFHRV9MT09LVVAiCisjZGVmaW5lIF9fRFJJX0lNQUdFX0xPT0tVUF9WRVJTSU9OIDEKKwordHlwZWRlZiBzdHJ1Y3QgX19EUklpbWFnZUxvb2t1cEV4dGVuc2lvblJlYyBfX0RSSWltYWdlTG9va3VwRXh0ZW5zaW9uOworc3RydWN0IF9fRFJJaW1hZ2VMb29rdXBFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisKKyAgICBfX0RSSWltYWdlICooKmxvb2t1cEVHTEltYWdlKShfX0RSSXNjcmVlbiAqc2NyZWVuLCB2b2lkICppbWFnZSwKKwkJCQkgIHZvaWQgKmxvYWRlclByaXZhdGUpOworfTsKKworLyoqCisgKiBUaGlzIGV4dGVuc2lvbiBhbGxvd3MgZm9yIGNvbW1vbiBEUkkyIG9wdGlvbnMKKyAqLworI2RlZmluZSBfX0RSSTJfQ09ORklHX1FVRVJZICJEUklfQ09ORklHX1FVRVJZIgorI2RlZmluZSBfX0RSSTJfQ09ORklHX1FVRVJZX1ZFUlNJT04gMQorCit0eXBlZGVmIHN0cnVjdCBfX0RSSTJjb25maWdRdWVyeUV4dGVuc2lvblJlYyBfX0RSSTJjb25maWdRdWVyeUV4dGVuc2lvbjsKK3N0cnVjdCBfX0RSSTJjb25maWdRdWVyeUV4dGVuc2lvblJlYyB7CisgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICBpbnQgKCpjb25maWdRdWVyeWIpKF9fRFJJc2NyZWVuICpzY3JlZW4sIGNvbnN0IGNoYXIgKnZhciwgR0xib29sZWFuICp2YWwpOworICAgaW50ICgqY29uZmlnUXVlcnlpKShfX0RSSXNjcmVlbiAqc2NyZWVuLCBjb25zdCBjaGFyICp2YXIsIEdMaW50ICp2YWwpOworICAgaW50ICgqY29uZmlnUXVlcnlmKShfX0RSSXNjcmVlbiAqc2NyZWVuLCBjb25zdCBjaGFyICp2YXIsIEdMZmxvYXQgKnZhbCk7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9ERUNrZXlzeW0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL0RFQ2tleXN5bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MzA3MTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9ERUNrZXlzeW0uaApAQCAtMCwwICsxLDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODgsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKworQ29weXJpZ2h0IDE5ODggYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAorZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAKK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgRGlnaXRhbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgCisKK0RJR0lUQUwgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCitESUdJVEFMIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAorQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERFQyBwcml2YXRlIGtleXN5bXMKKyAqICgyOXRoIGJpdCBzZXQpCisgKi8KKworLyogdHdvLWtleSBjb21wb3NlIHNlcXVlbmNlIGluaXRpYXRvcnMsIGNob3NlbiB0byBtYXAgdG8gTGF0aW4xIGNoYXJhY3RlcnMgKi8KKworI2RlZmluZSBEWEtfcmluZ19hY2NlbnQgICAgICAgICAweDEwMDBGRUIwCisjZGVmaW5lIERYS19jaXJjdW1mbGV4X2FjY2VudCAgIDB4MTAwMEZFNUUKKyNkZWZpbmUgRFhLX2NlZGlsbGFfYWNjZW50ICAgICAgMHgxMDAwRkUyQworI2RlZmluZSBEWEtfYWN1dGVfYWNjZW50ICAgICAgICAweDEwMDBGRTI3CisjZGVmaW5lIERYS19ncmF2ZV9hY2NlbnQgICAgICAgIDB4MTAwMEZFNjAKKyNkZWZpbmUgRFhLX3RpbGRlICAgICAgICAgICAgICAgMHgxMDAwRkU3RQorI2RlZmluZSBEWEtfZGlhZXJlc2lzICAgICAgICAgICAweDEwMDBGRTIyCisKKy8qIHNwZWNpYWwga2V5c3ltIGZvciBMSzIqKiAiUmVtb3ZlIiBrZXkgb24gZWRpdGluZyBrZXlwYWQgKi8KKworI2RlZmluZSBEWEtfUmVtb3ZlCTB4MTAwMEZGMDAgICAvKiBSZW1vdmUgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL0hQa2V5c3ltLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9IUGtleXN5bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMDAwYjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9IUGtleXN5bS5oCkBAIC0wLDAgKzEsMTY0IEBACisvKgorCitDb3B5cmlnaHQgMTk4NywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gVGhlIE9wZW4gR3JvdXAuCisKK0NvcHlyaWdodCAxOTg3IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLAorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBIZXdsZXR0IFBhY2thcmQKK29yIERpZ2l0YWwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworSEVXTEVUVC1QQUNLQVJEIE1BS0VTIE5PIFdBUlJBTlRZIE9GIEFOWSBLSU5EIFdJVEggUkVHQVJECitUTyBUSElTIFNPRldBUkUsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIEhld2xldHQtUGFja2FyZCBzaGFsbCBub3QgYmUgbGlhYmxlIGZvciBlcnJvcnMKK2NvbnRhaW5lZCBoZXJlaW4gb3IgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBvcgorY29uc2VxdWVudGlhbCBkYW1hZ2VzIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgZnVybmlzaGluZywKK3BlcmZvcm1hbmNlLCBvciB1c2Ugb2YgdGhpcyBtYXRlcmlhbC4KKworKi8KKworI2lmbmRlZiBfSFBLRVlTWU1fSAorCisjZGVmaW5lIF9IUEtFWVNZTQorCisjZGVmaW5lIGhwWEtfQ2xlYXJMaW5lCQkweDEwMDBGRjZGCisjZGVmaW5lIGhwWEtfSW5zZXJ0TGluZQkJMHgxMDAwRkY3MAorI2RlZmluZSBocFhLX0RlbGV0ZUxpbmUJCTB4MTAwMEZGNzEKKyNkZWZpbmUgaHBYS19JbnNlcnRDaGFyCQkweDEwMDBGRjcyCisjZGVmaW5lIGhwWEtfRGVsZXRlQ2hhcgkJMHgxMDAwRkY3MworI2RlZmluZSBocFhLX0JhY2tUYWIJCTB4MTAwMEZGNzQKKyNkZWZpbmUgaHBYS19LUF9CYWNrVGFiCQkweDEwMDBGRjc1CisjZGVmaW5lIGhwWEtfTW9kZWxvY2sxCQkweDEwMDBGRjQ4CisjZGVmaW5lIGhwWEtfTW9kZWxvY2syCQkweDEwMDBGRjQ5CisjZGVmaW5lIGhwWEtfUmVzZXQJCTB4MTAwMEZGNkMKKyNkZWZpbmUgaHBYS19TeXN0ZW0JCTB4MTAwMEZGNkQKKyNkZWZpbmUgaHBYS19Vc2VyCQkweDEwMDBGRjZFCisjZGVmaW5lIGhwWEtfbXV0ZV9hY3V0ZQkJMHgxMDAwMDBBOAorI2RlZmluZSBocFhLX211dGVfZ3JhdmUJCTB4MTAwMDAwQTkKKyNkZWZpbmUgaHBYS19tdXRlX2FzY2lpY2lyY3VtCTB4MTAwMDAwQUEKKyNkZWZpbmUgaHBYS19tdXRlX2RpYWVyZXNpcwkweDEwMDAwMEFCCisjZGVmaW5lIGhwWEtfbXV0ZV9hc2NpaXRpbGRlCTB4MTAwMDAwQUMKKyNkZWZpbmUgaHBYS19saXJhCQkweDEwMDAwMEFGCisjZGVmaW5lIGhwWEtfZ3VpbGRlcgkJMHgxMDAwMDBCRQorI2RlZmluZSBocFhLX1lkaWFlcmVzaXMJCTB4MTAwMDAwRUUKKyNkZWZpbmUgaHBYS19JTwkJCTB4MTAwMDAwRUUKKyNkZWZpbmUgaHBYS19sb25nbWludXMJCTB4MTAwMDAwRjYKKyNkZWZpbmUgaHBYS19ibG9jawkJMHgxMDAwMDBGQworCisKKyNpZm5kZWYgX09TRl9LZXlzeW1zCisjZGVmaW5lIF9PU0ZfS2V5c3ltcworCisjZGVmaW5lIG9zZlhLX0NvcHkJCTB4MTAwNEZGMDIKKyNkZWZpbmUgb3NmWEtfQ3V0CQkweDEwMDRGRjAzCisjZGVmaW5lIG9zZlhLX1Bhc3RlCQkweDEwMDRGRjA0CisjZGVmaW5lIG9zZlhLX0JhY2tUYWIJCTB4MTAwNEZGMDcKKyNkZWZpbmUgb3NmWEtfQmFja1NwYWNlCQkweDEwMDRGRjA4CisjZGVmaW5lIG9zZlhLX0NsZWFyCQkweDEwMDRGRjBCCisjZGVmaW5lIG9zZlhLX0VzY2FwZQkJMHgxMDA0RkYxQgorI2RlZmluZSBvc2ZYS19BZGRNb2RlCQkweDEwMDRGRjMxCisjZGVmaW5lIG9zZlhLX1ByaW1hcnlQYXN0ZQkweDEwMDRGRjMyCisjZGVmaW5lIG9zZlhLX1F1aWNrUGFzdGUJMHgxMDA0RkYzMworI2RlZmluZSBvc2ZYS19QYWdlTGVmdAkJMHgxMDA0RkY0MAorI2RlZmluZSBvc2ZYS19QYWdlVXAJCTB4MTAwNEZGNDEKKyNkZWZpbmUgb3NmWEtfUGFnZURvd24JCTB4MTAwNEZGNDIKKyNkZWZpbmUgb3NmWEtfUGFnZVJpZ2h0CQkweDEwMDRGRjQzCisjZGVmaW5lIG9zZlhLX0FjdGl2YXRlCQkweDEwMDRGRjQ0CisjZGVmaW5lIG9zZlhLX01lbnVCYXIJCTB4MTAwNEZGNDUKKyNkZWZpbmUgb3NmWEtfTGVmdAkJMHgxMDA0RkY1MQorI2RlZmluZSBvc2ZYS19VcAkJMHgxMDA0RkY1MgorI2RlZmluZSBvc2ZYS19SaWdodAkJMHgxMDA0RkY1MworI2RlZmluZSBvc2ZYS19Eb3duCQkweDEwMDRGRjU0CisjZGVmaW5lIG9zZlhLX0VuZExpbmUJCTB4MTAwNEZGNTcKKyNkZWZpbmUgb3NmWEtfQmVnaW5MaW5lCQkweDEwMDRGRjU4CisjZGVmaW5lIG9zZlhLX0VuZERhdGEJCTB4MTAwNEZGNTkKKyNkZWZpbmUgb3NmWEtfQmVnaW5EYXRhCQkweDEwMDRGRjVBCisjZGVmaW5lIG9zZlhLX1ByZXZNZW51CQkweDEwMDRGRjVCCisjZGVmaW5lIG9zZlhLX05leHRNZW51CQkweDEwMDRGRjVDCisjZGVmaW5lIG9zZlhLX1ByZXZGaWVsZAkJMHgxMDA0RkY1RAorI2RlZmluZSBvc2ZYS19OZXh0RmllbGQJCTB4MTAwNEZGNUUKKyNkZWZpbmUgb3NmWEtfU2VsZWN0CQkweDEwMDRGRjYwCisjZGVmaW5lIG9zZlhLX0luc2VydAkJMHgxMDA0RkY2MworI2RlZmluZSBvc2ZYS19VbmRvCQkweDEwMDRGRjY1CisjZGVmaW5lIG9zZlhLX01lbnUJCTB4MTAwNEZGNjcKKyNkZWZpbmUgb3NmWEtfQ2FuY2VsCQkweDEwMDRGRjY5CisjZGVmaW5lIG9zZlhLX0hlbHAJCTB4MTAwNEZGNkEKKyNkZWZpbmUgb3NmWEtfU2VsZWN0QWxsCQkweDEwMDRGRjcxCisjZGVmaW5lIG9zZlhLX0Rlc2VsZWN0QWxsCTB4MTAwNEZGNzIKKyNkZWZpbmUgb3NmWEtfUmVzZWxlY3QJCTB4MTAwNEZGNzMKKyNkZWZpbmUgb3NmWEtfRXh0ZW5kCQkweDEwMDRGRjc0CisjZGVmaW5lIG9zZlhLX1Jlc3RvcmUJCTB4MTAwNEZGNzgKKyNkZWZpbmUgb3NmWEtfRGVsZXRlCQkweDEwMDRGRkZGCisKKyNlbmRpZiAvKiBfT1NGX0tleXN5bXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSB1c2Ugb2YgdGhlIGZvbGxvd2luZyBtYWNyb3MgaXMgZGVwcmVjYXRlZC4KKyAqIFRoZXkgYXJlIGxpc3RlZCBiZWxvdyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAqLworI2RlZmluZSBYS19SZXNldCAgICAgICAgICAgICAgICAweDEwMDBGRjZDCisjZGVmaW5lIFhLX1N5c3RlbSAgICAgICAgICAgICAgIDB4MTAwMEZGNkQKKyNkZWZpbmUgWEtfVXNlciAgICAgICAgICAgICAgICAgMHgxMDAwRkY2RQorI2RlZmluZSBYS19DbGVhckxpbmUgICAgICAgICAgICAweDEwMDBGRjZGCisjZGVmaW5lIFhLX0luc2VydExpbmUgICAgICAgICAgIDB4MTAwMEZGNzAKKyNkZWZpbmUgWEtfRGVsZXRlTGluZSAgICAgICAgICAgMHgxMDAwRkY3MQorI2RlZmluZSBYS19JbnNlcnRDaGFyICAgICAgICAgICAweDEwMDBGRjcyCisjZGVmaW5lIFhLX0RlbGV0ZUNoYXIgICAgICAgICAgIDB4MTAwMEZGNzMKKyNkZWZpbmUgWEtfQmFja1RhYiAgICAgICAgICAgICAgMHgxMDAwRkY3NAorI2RlZmluZSBYS19LUF9CYWNrVGFiICAgICAgICAgICAweDEwMDBGRjc1CisjZGVmaW5lIFhLX0V4dDE2Yml0X0wgICAgICAgICAgIDB4MTAwMEZGNzYKKyNkZWZpbmUgWEtfRXh0MTZiaXRfUiAgICAgICAgICAgMHgxMDAwRkY3NworI2RlZmluZSBYS19tdXRlX2FjdXRlICAgICAgICAgICAweDEwMDAwMGE4CisjZGVmaW5lIFhLX211dGVfZ3JhdmUgICAgICAgICAgIDB4MTAwMDAwYTkKKyNkZWZpbmUgWEtfbXV0ZV9hc2NpaWNpcmN1bSAgICAgMHgxMDAwMDBhYQorI2RlZmluZSBYS19tdXRlX2RpYWVyZXNpcyAgICAgICAweDEwMDAwMGFiCisjZGVmaW5lIFhLX211dGVfYXNjaWl0aWxkZSAgICAgIDB4MTAwMDAwYWMKKyNkZWZpbmUgWEtfbGlyYSAgICAgICAgICAgICAgICAgMHgxMDAwMDBhZgorI2RlZmluZSBYS19ndWlsZGVyICAgICAgICAgICAgICAweDEwMDAwMGJlCisjaWZuZGVmIFhLX1lkaWFlcmVzaXMKKyNkZWZpbmUgWEtfWWRpYWVyZXNpcyAgICAgICAgICAgMHgxMDAwMDBlZQorI2VuZGlmCisjZGVmaW5lIFhLX0lPICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwZWUKKyNkZWZpbmUgWEtfbG9uZ21pbnVzICAgICAgICAgICAgMHgxMDAwMDBmNgorI2RlZmluZSBYS19ibG9jayAgICAgICAgICAgICAgICAweDEwMDAwMGZjCisKKyNlbmRpZiAvKiBfSFBLRVlTWU1fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvSW1VdGlsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9JbVV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmRiYTFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvSW1VdGlsLmgKQEAgLTAsMCArMSwzMCBAQAorCisjaWZuZGVmIF9YMTFfSU1VVElMX0hfCisjZGVmaW5lIF9YMTFfSU1VVElMX0hfCisKK2V4dGVybiBpbnQKK19YR2V0U2NhbmxpbmVQYWQoCisgICAgRGlzcGxheSAqZHB5LAorICAgIGludCBkZXB0aCk7CisKK2V4dGVybiBpbnQKK19YR2V0Qml0c1BlclBpeGVsKAorIERpc3BsYXkgKmRweSwKKyBpbnQgZGVwdGgpOworCitleHRlcm4gaW50CitfWFNldEltYWdlKAorICAgIFhJbWFnZSAqc3JjaW1nLAorICAgIHJlZ2lzdGVyIFhJbWFnZSAqZHN0aW1nLAorICAgIHJlZ2lzdGVyIGludCB4LAorICAgIHJlZ2lzdGVyIGludCB5KTsKKworZXh0ZXJuIGludAorX1hSZXZlcnNlX0J5dGVzKAorICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmJwdCwKKyAgICByZWdpc3RlciBpbnQgbmIpOworZXh0ZXJuIHZvaWQKK19YSW5pdEltYWdlRnVuY1B0cnMoCisgICAgcmVnaXN0ZXIgWEltYWdlICppbWFnZSk7CisKKyNlbmRpZiAvKiBfWDExX0lNVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvU3Vua2V5c3ltLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9TdW5rZXlzeW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGQxMjg2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvU3Vua2V5c3ltLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTkxLCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEZsb2F0aW5nIEFjY2VudAorICovCisKKyNkZWZpbmUJU3VuWEtfRkFfR3JhdmUJCTB4MTAwNUZGMDAKKyNkZWZpbmUJU3VuWEtfRkFfQ2lyY3VtCQkweDEwMDVGRjAxCisjZGVmaW5lCVN1blhLX0ZBX1RpbGRlCQkweDEwMDVGRjAyCisjZGVmaW5lCVN1blhLX0ZBX0FjdXRlCQkweDEwMDVGRjAzCisjZGVmaW5lCVN1blhLX0ZBX0RpYWVyZXNpcwkweDEwMDVGRjA0CisjZGVmaW5lCVN1blhLX0ZBX0NlZGlsbGEJMHgxMDA1RkYwNQorCisvKgorICogTWlzY2VsbGFuZW91cyBGdW5jdGlvbnMKKyAqLworCisjZGVmaW5lCVN1blhLX0YzNgkJMHgxMDA1RkYxMAkvKiBMYWJlbGVkIEYxMSAqLworI2RlZmluZQlTdW5YS19GMzcJCTB4MTAwNUZGMTEJLyogTGFiZWxlZCBGMTIgKi8KKworI2RlZmluZSBTdW5YS19TeXNfUmVxICAgCTB4MTAwNUZGNjAKKyNkZWZpbmUgU3VuWEtfUHJpbnRfU2NyZWVuCTB4MDAwMEZGNjEJLyogU2FtZSBhcyBYS19QcmludCAqLworCisvKgorICogSW50ZXJuYXRpb25hbCAmIE11bHRpLUtleSBDaGFyYWN0ZXIgQ29tcG9zaXRpb24KKyAqLworCisjZGVmaW5lIFN1blhLX0NvbXBvc2UJCTB4MDAwMEZGMjAJLyogU2FtZSBhcyBYS19NdWx0aV9rZXkgKi8KKyNkZWZpbmUgU3VuWEtfQWx0R3JhcGgJCTB4MDAwMEZGN0UJLyogU2FtZSBhcyBYS19Nb2RlX3N3aXRjaCAqLworCisvKgorICogQ3Vyc29yIENvbnRyb2wKKyAqLworCisjZGVmaW5lIFN1blhLX1BhZ2VVcAkJMHgwMDAwRkY1NSAJLyogU2FtZSBhcyBYS19QcmlvciAqLworI2RlZmluZSBTdW5YS19QYWdlRG93bgkJMHgwMDAwRkY1NgkvKiBTYW1lIGFzIFhLX05leHQgKi8KKworLyoKKyAqIE9wZW4gTG9vayBGdW5jdGlvbnMKKyAqLworCisjZGVmaW5lIFN1blhLX1VuZG8JCTB4MDAwMEZGNjUJLyogU2FtZSBhcyBYS19VbmRvICovCisjZGVmaW5lIFN1blhLX0FnYWluCQkweDAwMDBGRjY2CS8qIFNhbWUgYXMgWEtfUmVkbyAqLworI2RlZmluZSBTdW5YS19GaW5kCQkweDAwMDBGRjY4CS8qIFNhbWUgYXMgWEtfRmluZCAqLworI2RlZmluZSBTdW5YS19TdG9wCQkweDAwMDBGRjY5CS8qIFNhbWUgYXMgWEtfQ2FuY2VsICovCisjZGVmaW5lIFN1blhLX1Byb3BzCQkweDEwMDVGRjcwCisjZGVmaW5lIFN1blhLX0Zyb250CQkweDEwMDVGRjcxCisjZGVmaW5lIFN1blhLX0NvcHkJCTB4MTAwNUZGNzIKKyNkZWZpbmUgU3VuWEtfT3BlbgkJMHgxMDA1RkY3MworI2RlZmluZSBTdW5YS19QYXN0ZQkJMHgxMDA1RkY3NAorI2RlZmluZSBTdW5YS19DdXQJCTB4MTAwNUZGNzUKKworI2RlZmluZSBTdW5YS19Qb3dlclN3aXRjaAkJMHgxMDA1RkY3NgorI2RlZmluZSBTdW5YS19BdWRpb0xvd2VyVm9sdW1lCQkweDEwMDVGRjc3CisjZGVmaW5lIFN1blhLX0F1ZGlvTXV0ZQkJCTB4MTAwNUZGNzgKKyNkZWZpbmUgU3VuWEtfQXVkaW9SYWlzZVZvbHVtZQkJMHgxMDA1RkY3OQorI2RlZmluZSBTdW5YS19WaWRlb0RlZ2F1c3MJCTB4MTAwNUZGN0EKKyNkZWZpbmUgU3VuWEtfVmlkZW9Mb3dlckJyaWdodG5lc3MJMHgxMDA1RkY3QgorI2RlZmluZSBTdW5YS19WaWRlb1JhaXNlQnJpZ2h0bmVzcwkweDEwMDVGRjdDCisjZGVmaW5lIFN1blhLX1Bvd2VyU3dpdGNoU2hpZnQJCTB4MTAwNUZGN0QKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1guaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2Y2OTVkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWC5oCkBAIC0wLDAgKzEsNzE3IEBACisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIFggd2luZG93IHN5c3RlbSBsaWtlbHkgdG8gYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMgKi8KKworI2lmbmRlZiBYX0gKKyNkZWZpbmUgWF9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4NywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFhfUFJPVE9DT0wJMTEJCS8qIGN1cnJlbnQgcHJvdG9jb2wgdmVyc2lvbiAqLworI2RlZmluZSBYX1BST1RPQ09MX1JFVklTSU9OIDAJCS8qIGN1cnJlbnQgbWlub3IgdmVyc2lvbiAqLworCisvKiBSZXNvdXJjZXMgKi8KKworLyoKKyAqIF9YU0VSVkVSNjQgbXVzdCBPTkxZIGJlIGRlZmluZWQgd2hlbiBjb21waWxpbmcgWCBzZXJ2ZXIgc291cmNlcyBvbgorICogc3lzdGVtcyB3aGVyZSB1bnNpZ25lZCBsb25nIGlzIG5vdCAzMiBiaXRzLCBtdXN0IE5PVCBiZSB1c2VkIGluCisgKiBjbGllbnQgb3IgbGlicmFyeSBjb2RlLgorICovCisjaWZuZGVmIF9YU0VSVkVSNjQKKyMgIGlmbmRlZiBfWFRZUEVERUZfWElECisjICAgIGRlZmluZSBfWFRZUEVERUZfWElECit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgWElEOworIyAgZW5kaWYKKyMgIGlmbmRlZiBfWFRZUEVERUZfTUFTSworIyAgICBkZWZpbmUgX1hUWVBFREVGX01BU0sKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBNYXNrOworIyAgZW5kaWYKKyMgIGlmbmRlZiBfWFRZUEVERUZfQVRPTQorIyAgICBkZWZpbmUgX1hUWVBFREVGX0FUT00KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBBdG9tOwkJLyogQWxzbyBpbiBYZGVmcy5oICovCisjICBlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBsb25nIFZpc3VhbElEOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFRpbWU7CisjZWxzZQorIyAgaW5jbHVkZSA8WDExL1htZC5oPgorIyAgaWZuZGVmIF9YVFlQRURFRl9YSUQKKyMgICAgZGVmaW5lIF9YVFlQRURFRl9YSUQKK3R5cGVkZWYgQ0FSRDMyIFhJRDsKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hUWVBFREVGX01BU0sKKyMgICAgZGVmaW5lIF9YVFlQRURFRl9NQVNLCit0eXBlZGVmIENBUkQzMiBNYXNrOworIyAgZW5kaWYKKyMgIGlmbmRlZiBfWFRZUEVERUZfQVRPTQorIyAgICBkZWZpbmUgX1hUWVBFREVGX0FUT00KK3R5cGVkZWYgQ0FSRDMyIEF0b207CisjICBlbmRpZgordHlwZWRlZiBDQVJEMzIgVmlzdWFsSUQ7Cit0eXBlZGVmIENBUkQzMiBUaW1lOworI2VuZGlmCisKK3R5cGVkZWYgWElEIFdpbmRvdzsKK3R5cGVkZWYgWElEIERyYXdhYmxlOworI2lmbmRlZiBfWFRZUEVERUZfRk9OVAorIyAgZGVmaW5lIF9YVFlQRURFRl9GT05UCit0eXBlZGVmIFhJRCBGb250OworI2VuZGlmCit0eXBlZGVmIFhJRCBQaXhtYXA7Cit0eXBlZGVmIFhJRCBDdXJzb3I7Cit0eXBlZGVmIFhJRCBDb2xvcm1hcDsKK3R5cGVkZWYgWElEIEdDb250ZXh0OwordHlwZWRlZiBYSUQgS2V5U3ltOworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgS2V5Q29kZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSRVNFUlZFRCBSRVNPVVJDRSBBTkQgQ09OU1RBTlQgREVGSU5JVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBOb25lCisjZGVmaW5lIE5vbmUgICAgICAgICAgICAgICAgIDBMCS8qIHVuaXZlcnNhbCBudWxsIHJlc291cmNlIG9yIG51bGwgYXRvbSAqLworI2VuZGlmCisKKyNkZWZpbmUgUGFyZW50UmVsYXRpdmUgICAgICAgMUwJLyogYmFja2dyb3VuZCBwaXhtYXAgaW4gQ3JlYXRlV2luZG93CisJCQkJICAgIGFuZCBDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzICovCisKKyNkZWZpbmUgQ29weUZyb21QYXJlbnQgICAgICAgMEwJLyogYm9yZGVyIHBpeG1hcCBpbiBDcmVhdGVXaW5kb3cKKwkJCQkgICAgICAgYW5kIENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMKKwkJCQkgICBzcGVjaWFsIFZpc3VhbElEIGFuZCBzcGVjaWFsIHdpbmRvdworCQkJCSAgICAgICBjbGFzcyBwYXNzZWQgdG8gQ3JlYXRlV2luZG93ICovCisKKyNkZWZpbmUgUG9pbnRlcldpbmRvdyAgICAgICAgMEwJLyogZGVzdGluYXRpb24gd2luZG93IGluIFNlbmRFdmVudCAqLworI2RlZmluZSBJbnB1dEZvY3VzICAgICAgICAgICAxTAkvKiBkZXN0aW5hdGlvbiB3aW5kb3cgaW4gU2VuZEV2ZW50ICovCisKKyNkZWZpbmUgUG9pbnRlclJvb3QgICAgICAgICAgMUwJLyogZm9jdXMgd2luZG93IGluIFNldElucHV0Rm9jdXMgKi8KKworI2RlZmluZSBBbnlQcm9wZXJ0eVR5cGUgICAgICAwTAkvKiBzcGVjaWFsIEF0b20sIHBhc3NlZCB0byBHZXRQcm9wZXJ0eSAqLworCisjZGVmaW5lIEFueUtleQkJICAgICAwTAkvKiBzcGVjaWFsIEtleSBDb2RlLCBwYXNzZWQgdG8gR3JhYktleSAqLworCisjZGVmaW5lIEFueUJ1dHRvbiAgICAgICAgICAgIDBMCS8qIHNwZWNpYWwgQnV0dG9uIENvZGUsIHBhc3NlZCB0byBHcmFiQnV0dG9uICovCisKKyNkZWZpbmUgQWxsVGVtcG9yYXJ5ICAgICAgICAgMEwJLyogc3BlY2lhbCBSZXNvdXJjZSBJRCBwYXNzZWQgdG8gS2lsbENsaWVudCAqLworCisjZGVmaW5lIEN1cnJlbnRUaW1lICAgICAgICAgIDBMCS8qIHNwZWNpYWwgVGltZSAqLworCisjZGVmaW5lIE5vU3ltYm9sCSAgICAgMEwJLyogc3BlY2lhbCBLZXlTeW0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogRVZFTlQgREVGSU5JVElPTlMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIElucHV0IEV2ZW50IE1hc2tzLiBVc2VkIGFzIGV2ZW50LW1hc2sgd2luZG93IGF0dHJpYnV0ZSBhbmQgYXMgYXJndW1lbnRzCisgICB0byBHcmFiIHJlcXVlc3RzLiAgTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggZXZlbnQgbmFtZXMuICAqLworCisjZGVmaW5lIE5vRXZlbnRNYXNrCQkJMEwKKyNkZWZpbmUgS2V5UHJlc3NNYXNrCQkJKDFMPDwwKSAgCisjZGVmaW5lIEtleVJlbGVhc2VNYXNrCQkJKDFMPDwxKSAgCisjZGVmaW5lIEJ1dHRvblByZXNzTWFzawkJCSgxTDw8MikgIAorI2RlZmluZSBCdXR0b25SZWxlYXNlTWFzawkJKDFMPDwzKSAgCisjZGVmaW5lIEVudGVyV2luZG93TWFzawkJCSgxTDw8NCkgIAorI2RlZmluZSBMZWF2ZVdpbmRvd01hc2sJCQkoMUw8PDUpICAKKyNkZWZpbmUgUG9pbnRlck1vdGlvbk1hc2sJCSgxTDw8NikgIAorI2RlZmluZSBQb2ludGVyTW90aW9uSGludE1hc2sJCSgxTDw8NykgIAorI2RlZmluZSBCdXR0b24xTW90aW9uTWFzawkJKDFMPDw4KSAgCisjZGVmaW5lIEJ1dHRvbjJNb3Rpb25NYXNrCQkoMUw8PDkpICAKKyNkZWZpbmUgQnV0dG9uM01vdGlvbk1hc2sJCSgxTDw8MTApIAorI2RlZmluZSBCdXR0b240TW90aW9uTWFzawkJKDFMPDwxMSkgCisjZGVmaW5lIEJ1dHRvbjVNb3Rpb25NYXNrCQkoMUw8PDEyKSAKKyNkZWZpbmUgQnV0dG9uTW90aW9uTWFzawkJKDFMPDwxMykgCisjZGVmaW5lIEtleW1hcFN0YXRlTWFzawkJCSgxTDw8MTQpCisjZGVmaW5lIEV4cG9zdXJlTWFzawkJCSgxTDw8MTUpIAorI2RlZmluZSBWaXNpYmlsaXR5Q2hhbmdlTWFzawkJKDFMPDwxNikgCisjZGVmaW5lIFN0cnVjdHVyZU5vdGlmeU1hc2sJCSgxTDw8MTcpIAorI2RlZmluZSBSZXNpemVSZWRpcmVjdE1hc2sJCSgxTDw8MTgpIAorI2RlZmluZSBTdWJzdHJ1Y3R1cmVOb3RpZnlNYXNrCQkoMUw8PDE5KSAKKyNkZWZpbmUgU3Vic3RydWN0dXJlUmVkaXJlY3RNYXNrCSgxTDw8MjApIAorI2RlZmluZSBGb2N1c0NoYW5nZU1hc2sJCQkoMUw8PDIxKSAKKyNkZWZpbmUgUHJvcGVydHlDaGFuZ2VNYXNrCQkoMUw8PDIyKSAKKyNkZWZpbmUgQ29sb3JtYXBDaGFuZ2VNYXNrCQkoMUw8PDIzKSAKKyNkZWZpbmUgT3duZXJHcmFiQnV0dG9uTWFzawkJKDFMPDwyNCkgCisKKy8qIEV2ZW50IG5hbWVzLiAgVXNlZCBpbiAidHlwZSIgZmllbGQgaW4gWEV2ZW50IHN0cnVjdHVyZXMuICBOb3QgdG8gYmUKK2NvbmZ1c2VkIHdpdGggZXZlbnQgbWFza3MgYWJvdmUuICBUaGV5IHN0YXJ0IGZyb20gMiBiZWNhdXNlIDAgYW5kIDEKK2FyZSByZXNlcnZlZCBpbiB0aGUgcHJvdG9jb2wgZm9yIGVycm9ycyBhbmQgcmVwbGllcy4gKi8KKworI2RlZmluZSBLZXlQcmVzcwkJMgorI2RlZmluZSBLZXlSZWxlYXNlCQkzCisjZGVmaW5lIEJ1dHRvblByZXNzCQk0CisjZGVmaW5lIEJ1dHRvblJlbGVhc2UJCTUKKyNkZWZpbmUgTW90aW9uTm90aWZ5CQk2CisjZGVmaW5lIEVudGVyTm90aWZ5CQk3CisjZGVmaW5lIExlYXZlTm90aWZ5CQk4CisjZGVmaW5lIEZvY3VzSW4JCQk5CisjZGVmaW5lIEZvY3VzT3V0CQkxMAorI2RlZmluZSBLZXltYXBOb3RpZnkJCTExCisjZGVmaW5lIEV4cG9zZQkJCTEyCisjZGVmaW5lIEdyYXBoaWNzRXhwb3NlCQkxMworI2RlZmluZSBOb0V4cG9zZQkJMTQKKyNkZWZpbmUgVmlzaWJpbGl0eU5vdGlmeQkxNQorI2RlZmluZSBDcmVhdGVOb3RpZnkJCTE2CisjZGVmaW5lIERlc3Ryb3lOb3RpZnkJCTE3CisjZGVmaW5lIFVubWFwTm90aWZ5CQkxOAorI2RlZmluZSBNYXBOb3RpZnkJCTE5CisjZGVmaW5lIE1hcFJlcXVlc3QJCTIwCisjZGVmaW5lIFJlcGFyZW50Tm90aWZ5CQkyMQorI2RlZmluZSBDb25maWd1cmVOb3RpZnkJCTIyCisjZGVmaW5lIENvbmZpZ3VyZVJlcXVlc3QJMjMKKyNkZWZpbmUgR3Jhdml0eU5vdGlmeQkJMjQKKyNkZWZpbmUgUmVzaXplUmVxdWVzdAkJMjUKKyNkZWZpbmUgQ2lyY3VsYXRlTm90aWZ5CQkyNgorI2RlZmluZSBDaXJjdWxhdGVSZXF1ZXN0CTI3CisjZGVmaW5lIFByb3BlcnR5Tm90aWZ5CQkyOAorI2RlZmluZSBTZWxlY3Rpb25DbGVhcgkJMjkKKyNkZWZpbmUgU2VsZWN0aW9uUmVxdWVzdAkzMAorI2RlZmluZSBTZWxlY3Rpb25Ob3RpZnkJCTMxCisjZGVmaW5lIENvbG9ybWFwTm90aWZ5CQkzMgorI2RlZmluZSBDbGllbnRNZXNzYWdlCQkzMworI2RlZmluZSBNYXBwaW5nTm90aWZ5CQkzNAorI2RlZmluZSBHZW5lcmljRXZlbnQJCTM1CisjZGVmaW5lIExBU1RFdmVudAkJMzYJLyogbXVzdCBiZSBiaWdnZXIgdGhhbiBhbnkgZXZlbnQgIyAqLworCisKKy8qIEtleSBtYXNrcy4gVXNlZCBhcyBtb2RpZmllcnMgdG8gR3JhYkJ1dHRvbiBhbmQgR3JhYktleSwgcmVzdWx0cyBvZiBRdWVyeVBvaW50ZXIsCisgICBzdGF0ZSBpbiB2YXJpb3VzIGtleS0sIG1vdXNlLSwgYW5kIGJ1dHRvbi1yZWxhdGVkIGV2ZW50cy4gKi8KKworI2RlZmluZSBTaGlmdE1hc2sJCSgxPDwwKQorI2RlZmluZSBMb2NrTWFzawkJKDE8PDEpCisjZGVmaW5lIENvbnRyb2xNYXNrCQkoMTw8MikKKyNkZWZpbmUgTW9kMU1hc2sJCSgxPDwzKQorI2RlZmluZSBNb2QyTWFzawkJKDE8PDQpCisjZGVmaW5lIE1vZDNNYXNrCQkoMTw8NSkKKyNkZWZpbmUgTW9kNE1hc2sJCSgxPDw2KQorI2RlZmluZSBNb2Q1TWFzawkJKDE8PDcpCisKKy8qIG1vZGlmaWVyIG5hbWVzLiAgVXNlZCB0byBidWlsZCBhIFNldE1vZGlmaWVyTWFwcGluZyByZXF1ZXN0IG9yCisgICB0byByZWFkIGEgR2V0TW9kaWZpZXJNYXBwaW5nIHJlcXVlc3QuICBUaGVzZSBjb3JyZXNwb25kIHRvIHRoZQorICAgbWFza3MgZGVmaW5lZCBhYm92ZS4gKi8KKyNkZWZpbmUgU2hpZnRNYXBJbmRleAkJMAorI2RlZmluZSBMb2NrTWFwSW5kZXgJCTEKKyNkZWZpbmUgQ29udHJvbE1hcEluZGV4CQkyCisjZGVmaW5lIE1vZDFNYXBJbmRleAkJMworI2RlZmluZSBNb2QyTWFwSW5kZXgJCTQKKyNkZWZpbmUgTW9kM01hcEluZGV4CQk1CisjZGVmaW5lIE1vZDRNYXBJbmRleAkJNgorI2RlZmluZSBNb2Q1TWFwSW5kZXgJCTcKKworCisvKiBidXR0b24gbWFza3MuICBVc2VkIGluIHNhbWUgbWFubmVyIGFzIEtleSBtYXNrcyBhYm92ZS4gTm90IHRvIGJlIGNvbmZ1c2VkCisgICB3aXRoIGJ1dHRvbiBuYW1lcyBiZWxvdy4gKi8KKworI2RlZmluZSBCdXR0b24xTWFzawkJKDE8PDgpCisjZGVmaW5lIEJ1dHRvbjJNYXNrCQkoMTw8OSkKKyNkZWZpbmUgQnV0dG9uM01hc2sJCSgxPDwxMCkKKyNkZWZpbmUgQnV0dG9uNE1hc2sJCSgxPDwxMSkKKyNkZWZpbmUgQnV0dG9uNU1hc2sJCSgxPDwxMikKKworI2RlZmluZSBBbnlNb2RpZmllcgkJKDE8PDE1KSAgLyogdXNlZCBpbiBHcmFiQnV0dG9uLCBHcmFiS2V5ICovCisKKworLyogYnV0dG9uIG5hbWVzLiBVc2VkIGFzIGFyZ3VtZW50cyB0byBHcmFiQnV0dG9uIGFuZCBhcyBkZXRhaWwgaW4gQnV0dG9uUHJlc3MKKyAgIGFuZCBCdXR0b25SZWxlYXNlIGV2ZW50cy4gIE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGJ1dHRvbiBtYXNrcyBhYm92ZS4KKyAgIE5vdGUgdGhhdCAwIGlzIGFscmVhZHkgZGVmaW5lZCBhYm92ZSBhcyAiQW55QnV0dG9uIi4gICovCisKKyNkZWZpbmUgQnV0dG9uMQkJCTEKKyNkZWZpbmUgQnV0dG9uMgkJCTIKKyNkZWZpbmUgQnV0dG9uMwkJCTMKKyNkZWZpbmUgQnV0dG9uNAkJCTQKKyNkZWZpbmUgQnV0dG9uNQkJCTUKKworLyogTm90aWZ5IG1vZGVzICovCisKKyNkZWZpbmUgTm90aWZ5Tm9ybWFsCQkwCisjZGVmaW5lIE5vdGlmeUdyYWIJCTEKKyNkZWZpbmUgTm90aWZ5VW5ncmFiCQkyCisjZGVmaW5lIE5vdGlmeVdoaWxlR3JhYmJlZAkzCisKKyNkZWZpbmUgTm90aWZ5SGludAkJMQkvKiBmb3IgTW90aW9uTm90aWZ5IGV2ZW50cyAqLworCQkgICAgICAgCisvKiBOb3RpZnkgZGV0YWlsICovCisKKyNkZWZpbmUgTm90aWZ5QW5jZXN0b3IJCTAKKyNkZWZpbmUgTm90aWZ5VmlydHVhbAkJMQorI2RlZmluZSBOb3RpZnlJbmZlcmlvcgkJMgorI2RlZmluZSBOb3RpZnlOb25saW5lYXIJCTMKKyNkZWZpbmUgTm90aWZ5Tm9ubGluZWFyVmlydHVhbAk0CisjZGVmaW5lIE5vdGlmeVBvaW50ZXIJCTUKKyNkZWZpbmUgTm90aWZ5UG9pbnRlclJvb3QJNgorI2RlZmluZSBOb3RpZnlEZXRhaWxOb25lCTcKKworLyogVmlzaWJpbGl0eSBub3RpZnkgKi8KKworI2RlZmluZSBWaXNpYmlsaXR5VW5vYnNjdXJlZAkJMAorI2RlZmluZSBWaXNpYmlsaXR5UGFydGlhbGx5T2JzY3VyZWQJMQorI2RlZmluZSBWaXNpYmlsaXR5RnVsbHlPYnNjdXJlZAkJMgorCisvKiBDaXJjdWxhdGlvbiByZXF1ZXN0ICovCisKKyNkZWZpbmUgUGxhY2VPblRvcAkJMAorI2RlZmluZSBQbGFjZU9uQm90dG9tCQkxCisKKy8qIHByb3RvY29sIGZhbWlsaWVzICovCisKKyNkZWZpbmUgRmFtaWx5SW50ZXJuZXQJCTAJLyogSVB2NCAqLworI2RlZmluZSBGYW1pbHlERUNuZXQJCTEKKyNkZWZpbmUgRmFtaWx5Q2hhb3MJCTIKKyNkZWZpbmUgRmFtaWx5SW50ZXJuZXQ2CQk2CS8qIElQdjYgKi8KKworLyogYXV0aGVudGljYXRpb24gZmFtaWxpZXMgbm90IHRpZWQgdG8gYSBzcGVjaWZpYyBwcm90b2NvbCAqLworI2RlZmluZSBGYW1pbHlTZXJ2ZXJJbnRlcnByZXRlZCA1CisKKy8qIFByb3BlcnR5IG5vdGlmaWNhdGlvbiAqLworCisjZGVmaW5lIFByb3BlcnR5TmV3VmFsdWUJMAorI2RlZmluZSBQcm9wZXJ0eURlbGV0ZQkJMQorCisvKiBDb2xvciBNYXAgbm90aWZpY2F0aW9uICovCisKKyNkZWZpbmUgQ29sb3JtYXBVbmluc3RhbGxlZAkwCisjZGVmaW5lIENvbG9ybWFwSW5zdGFsbGVkCTEKKworLyogR3JhYlBvaW50ZXIsIEdyYWJCdXR0b24sIEdyYWJLZXlib2FyZCwgR3JhYktleSBNb2RlcyAqLworCisjZGVmaW5lIEdyYWJNb2RlU3luYwkJMAorI2RlZmluZSBHcmFiTW9kZUFzeW5jCQkxCisKKy8qIEdyYWJQb2ludGVyLCBHcmFiS2V5Ym9hcmQgcmVwbHkgc3RhdHVzICovCisKKyNkZWZpbmUgR3JhYlN1Y2Nlc3MJCTAKKyNkZWZpbmUgQWxyZWFkeUdyYWJiZWQJCTEKKyNkZWZpbmUgR3JhYkludmFsaWRUaW1lCQkyCisjZGVmaW5lIEdyYWJOb3RWaWV3YWJsZQkJMworI2RlZmluZSBHcmFiRnJvemVuCQk0CisKKy8qIEFsbG93RXZlbnRzIG1vZGVzICovCisKKyNkZWZpbmUgQXN5bmNQb2ludGVyCQkwCisjZGVmaW5lIFN5bmNQb2ludGVyCQkxCisjZGVmaW5lIFJlcGxheVBvaW50ZXIJCTIKKyNkZWZpbmUgQXN5bmNLZXlib2FyZAkJMworI2RlZmluZSBTeW5jS2V5Ym9hcmQJCTQKKyNkZWZpbmUgUmVwbGF5S2V5Ym9hcmQJCTUKKyNkZWZpbmUgQXN5bmNCb3RoCQk2CisjZGVmaW5lIFN5bmNCb3RoCQk3CisKKy8qIFVzZWQgaW4gU2V0SW5wdXRGb2N1cywgR2V0SW5wdXRGb2N1cyAqLworCisjZGVmaW5lIFJldmVydFRvTm9uZQkJKGludClOb25lCisjZGVmaW5lIFJldmVydFRvUG9pbnRlclJvb3QJKGludClQb2ludGVyUm9vdAorI2RlZmluZSBSZXZlcnRUb1BhcmVudAkJMgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVSUk9SIENPREVTIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFN1Y2Nlc3MJCSAgIDAJLyogZXZlcnl0aGluZydzIG9rYXkgKi8KKyNkZWZpbmUgQmFkUmVxdWVzdAkgICAxCS8qIGJhZCByZXF1ZXN0IGNvZGUgKi8KKyNkZWZpbmUgQmFkVmFsdWUJICAgMgkvKiBpbnQgcGFyYW1ldGVyIG91dCBvZiByYW5nZSAqLworI2RlZmluZSBCYWRXaW5kb3cJICAgMwkvKiBwYXJhbWV0ZXIgbm90IGEgV2luZG93ICovCisjZGVmaW5lIEJhZFBpeG1hcAkgICA0CS8qIHBhcmFtZXRlciBub3QgYSBQaXhtYXAgKi8KKyNkZWZpbmUgQmFkQXRvbQkJICAgNQkvKiBwYXJhbWV0ZXIgbm90IGFuIEF0b20gKi8KKyNkZWZpbmUgQmFkQ3Vyc29yCSAgIDYJLyogcGFyYW1ldGVyIG5vdCBhIEN1cnNvciAqLworI2RlZmluZSBCYWRGb250CQkgICA3CS8qIHBhcmFtZXRlciBub3QgYSBGb250ICovCisjZGVmaW5lIEJhZE1hdGNoCSAgIDgJLyogcGFyYW1ldGVyIG1pc21hdGNoICovCisjZGVmaW5lIEJhZERyYXdhYmxlCSAgIDkJLyogcGFyYW1ldGVyIG5vdCBhIFBpeG1hcCBvciBXaW5kb3cgKi8KKyNkZWZpbmUgQmFkQWNjZXNzCSAgMTAJLyogZGVwZW5kaW5nIG9uIGNvbnRleHQ6CisJCQkJIC0ga2V5L2J1dHRvbiBhbHJlYWR5IGdyYWJiZWQKKwkJCQkgLSBhdHRlbXB0IHRvIGZyZWUgYW4gaWxsZWdhbCAKKwkJCQkgICBjbWFwIGVudHJ5IAorCQkJCS0gYXR0ZW1wdCB0byBzdG9yZSBpbnRvIGEgcmVhZC1vbmx5IAorCQkJCSAgIGNvbG9yIG1hcCBlbnRyeS4KKyAJCQkJLSBhdHRlbXB0IHRvIG1vZGlmeSB0aGUgYWNjZXNzIGNvbnRyb2wKKwkJCQkgICBsaXN0IGZyb20gb3RoZXIgdGhhbiB0aGUgbG9jYWwgaG9zdC4KKwkJCQkqLworI2RlZmluZSBCYWRBbGxvYwkgIDExCS8qIGluc3VmZmljaWVudCByZXNvdXJjZXMgKi8KKyNkZWZpbmUgQmFkQ29sb3IJICAxMgkvKiBubyBzdWNoIGNvbG9ybWFwICovCisjZGVmaW5lIEJhZEdDCQkgIDEzCS8qIHBhcmFtZXRlciBub3QgYSBHQyAqLworI2RlZmluZSBCYWRJRENob2ljZQkgIDE0CS8qIGNob2ljZSBub3QgaW4gcmFuZ2Ugb3IgYWxyZWFkeSB1c2VkICovCisjZGVmaW5lIEJhZE5hbWUJCSAgMTUJLyogZm9udCBvciBjb2xvciBuYW1lIGRvZXNuJ3QgZXhpc3QgKi8KKyNkZWZpbmUgQmFkTGVuZ3RoCSAgMTYJLyogUmVxdWVzdCBsZW5ndGggaW5jb3JyZWN0ICovCisjZGVmaW5lIEJhZEltcGxlbWVudGF0aW9uIDE3CS8qIHNlcnZlciBpcyBkZWZlY3RpdmUgKi8KKworI2RlZmluZSBGaXJzdEV4dGVuc2lvbkVycm9yCTEyOAorI2RlZmluZSBMYXN0RXh0ZW5zaW9uRXJyb3IJMjU1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV0lORE9XIERFRklOSVRJT05TIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBXaW5kb3cgY2xhc3NlcyB1c2VkIGJ5IENyZWF0ZVdpbmRvdyAqLworLyogTm90ZSB0aGF0IENvcHlGcm9tUGFyZW50IGlzIGFscmVhZHkgZGVmaW5lZCBhcyAwIGFib3ZlICovCisKKyNkZWZpbmUgSW5wdXRPdXRwdXQJCTEKKyNkZWZpbmUgSW5wdXRPbmx5CQkyCisKKy8qIFdpbmRvdyBhdHRyaWJ1dGVzIGZvciBDcmVhdGVXaW5kb3cgYW5kIENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMgKi8KKworI2RlZmluZSBDV0JhY2tQaXhtYXAJCSgxTDw8MCkKKyNkZWZpbmUgQ1dCYWNrUGl4ZWwJCSgxTDw8MSkKKyNkZWZpbmUgQ1dCb3JkZXJQaXhtYXAJCSgxTDw8MikKKyNkZWZpbmUgQ1dCb3JkZXJQaXhlbCAgICAgICAgICAgKDFMPDwzKQorI2RlZmluZSBDV0JpdEdyYXZpdHkJCSgxTDw8NCkKKyNkZWZpbmUgQ1dXaW5HcmF2aXR5CQkoMUw8PDUpCisjZGVmaW5lIENXQmFja2luZ1N0b3JlICAgICAgICAgICgxTDw8NikKKyNkZWZpbmUgQ1dCYWNraW5nUGxhbmVzCSAgICAgICAgKDFMPDw3KQorI2RlZmluZSBDV0JhY2tpbmdQaXhlbAkgICAgICAgICgxTDw8OCkKKyNkZWZpbmUgQ1dPdmVycmlkZVJlZGlyZWN0CSgxTDw8OSkKKyNkZWZpbmUgQ1dTYXZlVW5kZXIJCSgxTDw8MTApCisjZGVmaW5lIENXRXZlbnRNYXNrCQkoMUw8PDExKQorI2RlZmluZSBDV0RvbnRQcm9wYWdhdGUJICAgICAgICAoMUw8PDEyKQorI2RlZmluZSBDV0NvbG9ybWFwCQkoMUw8PDEzKQorI2RlZmluZSBDV0N1cnNvcgkgICAgICAgICgxTDw8MTQpCisKKy8qIENvbmZpZ3VyZVdpbmRvdyBzdHJ1Y3R1cmUgKi8KKworI2RlZmluZSBDV1gJCQkoMTw8MCkKKyNkZWZpbmUgQ1dZCQkJKDE8PDEpCisjZGVmaW5lIENXV2lkdGgJCQkoMTw8MikKKyNkZWZpbmUgQ1dIZWlnaHQJCSgxPDwzKQorI2RlZmluZSBDV0JvcmRlcldpZHRoCQkoMTw8NCkKKyNkZWZpbmUgQ1dTaWJsaW5nCQkoMTw8NSkKKyNkZWZpbmUgQ1dTdGFja01vZGUJCSgxPDw2KQorCisKKy8qIEJpdCBHcmF2aXR5ICovCisKKyNkZWZpbmUgRm9yZ2V0R3Jhdml0eQkJMAorI2RlZmluZSBOb3J0aFdlc3RHcmF2aXR5CTEKKyNkZWZpbmUgTm9ydGhHcmF2aXR5CQkyCisjZGVmaW5lIE5vcnRoRWFzdEdyYXZpdHkJMworI2RlZmluZSBXZXN0R3Jhdml0eQkJNAorI2RlZmluZSBDZW50ZXJHcmF2aXR5CQk1CisjZGVmaW5lIEVhc3RHcmF2aXR5CQk2CisjZGVmaW5lIFNvdXRoV2VzdEdyYXZpdHkJNworI2RlZmluZSBTb3V0aEdyYXZpdHkJCTgKKyNkZWZpbmUgU291dGhFYXN0R3Jhdml0eQk5CisjZGVmaW5lIFN0YXRpY0dyYXZpdHkJCTEwCisKKy8qIFdpbmRvdyBncmF2aXR5ICsgYml0IGdyYXZpdHkgYWJvdmUgKi8KKworI2RlZmluZSBVbm1hcEdyYXZpdHkJCTAKKworLyogVXNlZCBpbiBDcmVhdGVXaW5kb3cgZm9yIGJhY2tpbmctc3RvcmUgaGludCAqLworCisjZGVmaW5lIE5vdFVzZWZ1bCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV2hlbk1hcHBlZCAgICAgICAgICAgICAgMQorI2RlZmluZSBBbHdheXMgICAgICAgICAgICAgICAgICAyCisKKy8qIFVzZWQgaW4gR2V0V2luZG93QXR0cmlidXRlcyByZXBseSAqLworCisjZGVmaW5lIElzVW5tYXBwZWQJCTAKKyNkZWZpbmUgSXNVbnZpZXdhYmxlCQkxCisjZGVmaW5lIElzVmlld2FibGUJCTIKKworLyogVXNlZCBpbiBDaGFuZ2VTYXZlU2V0ICovCisKKyNkZWZpbmUgU2V0TW9kZUluc2VydCAgICAgICAgICAgMAorI2RlZmluZSBTZXRNb2RlRGVsZXRlICAgICAgICAgICAxCisKKy8qIFVzZWQgaW4gQ2hhbmdlQ2xvc2VEb3duTW9kZSAqLworCisjZGVmaW5lIERlc3Ryb3lBbGwgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUmV0YWluUGVybWFuZW50ICAgICAgICAgMQorI2RlZmluZSBSZXRhaW5UZW1wb3JhcnkgICAgICAgICAyCisKKy8qIFdpbmRvdyBzdGFja2luZyBtZXRob2QgKGluIGNvbmZpZ3VyZVdpbmRvdykgKi8KKworI2RlZmluZSBBYm92ZSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJlbG93ICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVG9wSWYgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCb3R0b21JZiAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE9wcG9zaXRlICAgICAgICAgICAgICAgIDQKKworLyogQ2lyY3VsYXRpb24gZGlyZWN0aW9uICovCisKKyNkZWZpbmUgUmFpc2VMb3dlc3QgICAgICAgICAgICAgMAorI2RlZmluZSBMb3dlckhpZ2hlc3QgICAgICAgICAgICAxCisKKy8qIFByb3BlcnR5IG1vZGVzICovCisKKyNkZWZpbmUgUHJvcE1vZGVSZXBsYWNlICAgICAgICAgMAorI2RlZmluZSBQcm9wTW9kZVByZXBlbmQgICAgICAgICAxCisjZGVmaW5lIFByb3BNb2RlQXBwZW5kICAgICAgICAgIDIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHUkFQSElDUyBERUZJTklUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBncmFwaGljcyBmdW5jdGlvbnMsIGFzIGluIEdDLmFsdSAqLworCisjZGVmaW5lCUdYY2xlYXIJCQkweDAJCS8qIDAgKi8KKyNkZWZpbmUgR1hhbmQJCQkweDEJCS8qIHNyYyBBTkQgZHN0ICovCisjZGVmaW5lIEdYYW5kUmV2ZXJzZQkJMHgyCQkvKiBzcmMgQU5EIE5PVCBkc3QgKi8KKyNkZWZpbmUgR1hjb3B5CQkJMHgzCQkvKiBzcmMgKi8KKyNkZWZpbmUgR1hhbmRJbnZlcnRlZAkJMHg0CQkvKiBOT1Qgc3JjIEFORCBkc3QgKi8KKyNkZWZpbmUJR1hub29wCQkJMHg1CQkvKiBkc3QgKi8KKyNkZWZpbmUgR1h4b3IJCQkweDYJCS8qIHNyYyBYT1IgZHN0ICovCisjZGVmaW5lIEdYb3IJCQkweDcJCS8qIHNyYyBPUiBkc3QgKi8KKyNkZWZpbmUgR1hub3IJCQkweDgJCS8qIE5PVCBzcmMgQU5EIE5PVCBkc3QgKi8KKyNkZWZpbmUgR1hlcXVpdgkJCTB4OQkJLyogTk9UIHNyYyBYT1IgZHN0ICovCisjZGVmaW5lIEdYaW52ZXJ0CQkweGEJCS8qIE5PVCBkc3QgKi8KKyNkZWZpbmUgR1hvclJldmVyc2UJCTB4YgkJLyogc3JjIE9SIE5PVCBkc3QgKi8KKyNkZWZpbmUgR1hjb3B5SW52ZXJ0ZWQJCTB4YwkJLyogTk9UIHNyYyAqLworI2RlZmluZSBHWG9ySW52ZXJ0ZWQJCTB4ZAkJLyogTk9UIHNyYyBPUiBkc3QgKi8KKyNkZWZpbmUgR1huYW5kCQkJMHhlCQkvKiBOT1Qgc3JjIE9SIE5PVCBkc3QgKi8KKyNkZWZpbmUgR1hzZXQJCQkweGYJCS8qIDEgKi8KKworLyogTGluZVN0eWxlICovCisKKyNkZWZpbmUgTGluZVNvbGlkCQkwCisjZGVmaW5lIExpbmVPbk9mZkRhc2gJCTEKKyNkZWZpbmUgTGluZURvdWJsZURhc2gJCTIKKworLyogY2FwU3R5bGUgKi8KKworI2RlZmluZSBDYXBOb3RMYXN0CQkwCisjZGVmaW5lIENhcEJ1dHQJCQkxCisjZGVmaW5lIENhcFJvdW5kCQkyCisjZGVmaW5lIENhcFByb2plY3RpbmcJCTMKKworLyogam9pblN0eWxlICovCisKKyNkZWZpbmUgSm9pbk1pdGVyCQkwCisjZGVmaW5lIEpvaW5Sb3VuZAkJMQorI2RlZmluZSBKb2luQmV2ZWwJCTIKKworLyogZmlsbFN0eWxlICovCisKKyNkZWZpbmUgRmlsbFNvbGlkCQkwCisjZGVmaW5lIEZpbGxUaWxlZAkJMQorI2RlZmluZSBGaWxsU3RpcHBsZWQJCTIKKyNkZWZpbmUgRmlsbE9wYXF1ZVN0aXBwbGVkCTMKKworLyogZmlsbFJ1bGUgKi8KKworI2RlZmluZSBFdmVuT2RkUnVsZQkJMAorI2RlZmluZSBXaW5kaW5nUnVsZQkJMQorCisvKiBzdWJ3aW5kb3cgbW9kZSAqLworCisjZGVmaW5lIENsaXBCeUNoaWxkcmVuCQkwCisjZGVmaW5lIEluY2x1ZGVJbmZlcmlvcnMJMQorCisvKiBTZXRDbGlwUmVjdGFuZ2xlcyBvcmRlcmluZyAqLworCisjZGVmaW5lIFVuc29ydGVkCQkwCisjZGVmaW5lIFlTb3J0ZWQJCQkxCisjZGVmaW5lIFlYU29ydGVkCQkyCisjZGVmaW5lIFlYQmFuZGVkCQkzCisKKy8qIENvb3JkaW5hdGVNb2RlIGZvciBkcmF3aW5nIHJvdXRpbmVzICovCisKKyNkZWZpbmUgQ29vcmRNb2RlT3JpZ2luCQkwCS8qIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW4gKi8KKyNkZWZpbmUgQ29vcmRNb2RlUHJldmlvdXMgICAgICAgMQkvKiByZWxhdGl2ZSB0byBwcmV2aW91cyBwb2ludCAqLworCisvKiBQb2x5Z29uIHNoYXBlcyAqLworCisjZGVmaW5lIENvbXBsZXgJCQkwCS8qIHBhdGhzIG1heSBpbnRlcnNlY3QgKi8KKyNkZWZpbmUgTm9uY29udmV4CQkxCS8qIG5vIHBhdGhzIGludGVyc2VjdCwgYnV0IG5vdCBjb252ZXggKi8KKyNkZWZpbmUgQ29udmV4CQkJMgkvKiB3aG9sbHkgY29udmV4ICovCisKKy8qIEFyYyBtb2RlcyBmb3IgUG9seUZpbGxBcmMgKi8KKworI2RlZmluZSBBcmNDaG9yZAkJMAkvKiBqb2luIGVuZHBvaW50cyBvZiBhcmMgKi8KKyNkZWZpbmUgQXJjUGllU2xpY2UJCTEJLyogam9pbiBlbmRwb2ludHMgdG8gY2VudGVyIG9mIGFyYyAqLworCisvKiBHQyBjb21wb25lbnRzOiBtYXNrcyB1c2VkIGluIENyZWF0ZUdDLCBDb3B5R0MsIENoYW5nZUdDLCBPUidlZCBpbnRvCisgICBHQy5zdGF0ZUNoYW5nZXMgKi8KKworI2RlZmluZSBHQ0Z1bmN0aW9uICAgICAgICAgICAgICAoMUw8PDApCisjZGVmaW5lIEdDUGxhbmVNYXNrICAgICAgICAgICAgICgxTDw8MSkKKyNkZWZpbmUgR0NGb3JlZ3JvdW5kICAgICAgICAgICAgKDFMPDwyKQorI2RlZmluZSBHQ0JhY2tncm91bmQgICAgICAgICAgICAoMUw8PDMpCisjZGVmaW5lIEdDTGluZVdpZHRoICAgICAgICAgICAgICgxTDw8NCkKKyNkZWZpbmUgR0NMaW5lU3R5bGUgICAgICAgICAgICAgKDFMPDw1KQorI2RlZmluZSBHQ0NhcFN0eWxlICAgICAgICAgICAgICAoMUw8PDYpCisjZGVmaW5lIEdDSm9pblN0eWxlCQkoMUw8PDcpCisjZGVmaW5lIEdDRmlsbFN0eWxlCQkoMUw8PDgpCisjZGVmaW5lIEdDRmlsbFJ1bGUJCSgxTDw8OSkgCisjZGVmaW5lIEdDVGlsZQkJCSgxTDw8MTApCisjZGVmaW5lIEdDU3RpcHBsZQkJKDFMPDwxMSkKKyNkZWZpbmUgR0NUaWxlU3RpcFhPcmlnaW4JKDFMPDwxMikKKyNkZWZpbmUgR0NUaWxlU3RpcFlPcmlnaW4JKDFMPDwxMykKKyNkZWZpbmUgR0NGb250IAkJCSgxTDw8MTQpCisjZGVmaW5lIEdDU3Vid2luZG93TW9kZQkJKDFMPDwxNSkKKyNkZWZpbmUgR0NHcmFwaGljc0V4cG9zdXJlcyAgICAgKDFMPDwxNikKKyNkZWZpbmUgR0NDbGlwWE9yaWdpbgkJKDFMPDwxNykKKyNkZWZpbmUgR0NDbGlwWU9yaWdpbgkJKDFMPDwxOCkKKyNkZWZpbmUgR0NDbGlwTWFzawkJKDFMPDwxOSkKKyNkZWZpbmUgR0NEYXNoT2Zmc2V0CQkoMUw8PDIwKQorI2RlZmluZSBHQ0Rhc2hMaXN0CQkoMUw8PDIxKQorI2RlZmluZSBHQ0FyY01vZGUJCSgxTDw8MjIpCisKKyNkZWZpbmUgR0NMYXN0Qml0CQkyMgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGT05UUyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogdXNlZCBpbiBRdWVyeUZvbnQgLS0gZHJhdyBkaXJlY3Rpb24gKi8KKworI2RlZmluZSBGb250TGVmdFRvUmlnaHQJCTAKKyNkZWZpbmUgRm9udFJpZ2h0VG9MZWZ0CQkxCisKKyNkZWZpbmUgRm9udENoYW5nZQkJMjU1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIElNQUdJTkcgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEltYWdlRm9ybWF0IC0tIFB1dEltYWdlLCBHZXRJbWFnZSAqLworCisjZGVmaW5lIFhZQml0bWFwCQkwCS8qIGRlcHRoIDEsIFhZRm9ybWF0ICovCisjZGVmaW5lIFhZUGl4bWFwCQkxCS8qIGRlcHRoID09IGRyYXdhYmxlIGRlcHRoICovCisjZGVmaW5lIFpQaXhtYXAJCQkyCS8qIGRlcHRoID09IGRyYXdhYmxlIGRlcHRoICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENPTE9SIE1BUCBTVFVGRiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRm9yIENyZWF0ZUNvbG9ybWFwICovCisKKyNkZWZpbmUgQWxsb2NOb25lCQkwCS8qIGNyZWF0ZSBtYXAgd2l0aCBubyBlbnRyaWVzICovCisjZGVmaW5lIEFsbG9jQWxsCQkxCS8qIGFsbG9jYXRlIGVudGlyZSBtYXAgd3JpdGVhYmxlICovCisKKworLyogRmxhZ3MgdXNlZCBpbiBTdG9yZU5hbWVkQ29sb3IsIFN0b3JlQ29sb3JzICovCisKKyNkZWZpbmUgRG9SZWQJCQkoMTw8MCkKKyNkZWZpbmUgRG9HcmVlbgkJCSgxPDwxKQorI2RlZmluZSBEb0JsdWUJCQkoMTw8MikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDVVJTT1IgU1RVRkYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUXVlcnlCZXN0U2l6ZSBDbGFzcyAqLworCisjZGVmaW5lIEN1cnNvclNoYXBlCQkwCS8qIGxhcmdlc3Qgc2l6ZSB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgKi8KKyNkZWZpbmUgVGlsZVNoYXBlCQkxCS8qIHNpemUgdGlsZWQgZmFzdGVzdCAqLworI2RlZmluZSBTdGlwcGxlU2hhcGUJCTIJLyogc2l6ZSBzdGlwcGxlZCBmYXN0ZXN0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIEtFWUJPQVJEL1BPSU5URVIgU1RVRkYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBBdXRvUmVwZWF0TW9kZU9mZgkwCisjZGVmaW5lIEF1dG9SZXBlYXRNb2RlT24JMQorI2RlZmluZSBBdXRvUmVwZWF0TW9kZURlZmF1bHQJMgorCisjZGVmaW5lIExlZE1vZGVPZmYJCTAKKyNkZWZpbmUgTGVkTW9kZU9uCQkxCisKKy8qIG1hc2tzIGZvciBDaGFuZ2VLZXlib2FyZENvbnRyb2wgKi8KKworI2RlZmluZSBLQktleUNsaWNrUGVyY2VudAkoMUw8PDApCisjZGVmaW5lIEtCQmVsbFBlcmNlbnQJCSgxTDw8MSkKKyNkZWZpbmUgS0JCZWxsUGl0Y2gJCSgxTDw8MikKKyNkZWZpbmUgS0JCZWxsRHVyYXRpb24JCSgxTDw8MykKKyNkZWZpbmUgS0JMZWQJCQkoMUw8PDQpCisjZGVmaW5lIEtCTGVkTW9kZQkJKDFMPDw1KQorI2RlZmluZSBLQktleQkJCSgxTDw8NikKKyNkZWZpbmUgS0JBdXRvUmVwZWF0TW9kZQkoMUw8PDcpCisKKyNkZWZpbmUgTWFwcGluZ1N1Y2Nlc3MgICAgIAkwCisjZGVmaW5lIE1hcHBpbmdCdXN5ICAgICAgICAJMQorI2RlZmluZSBNYXBwaW5nRmFpbGVkCQkyCisKKyNkZWZpbmUgTWFwcGluZ01vZGlmaWVyCQkwCisjZGVmaW5lIE1hcHBpbmdLZXlib2FyZAkJMQorI2RlZmluZSBNYXBwaW5nUG9pbnRlcgkJMgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNDUkVFTiBTQVZFUiBTVFVGRiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBEb250UHJlZmVyQmxhbmtpbmcJMAorI2RlZmluZSBQcmVmZXJCbGFua2luZwkJMQorI2RlZmluZSBEZWZhdWx0QmxhbmtpbmcJCTIKKworI2RlZmluZSBEaXNhYmxlU2NyZWVuU2F2ZXIJMAorI2RlZmluZSBEaXNhYmxlU2NyZWVuSW50ZXJ2YWwJMAorCisjZGVmaW5lIERvbnRBbGxvd0V4cG9zdXJlcwkwCisjZGVmaW5lIEFsbG93RXhwb3N1cmVzCQkxCisjZGVmaW5lIERlZmF1bHRFeHBvc3VyZXMJMgorCisvKiBmb3IgRm9yY2VTY3JlZW5TYXZlciAqLworCisjZGVmaW5lIFNjcmVlblNhdmVyUmVzZXQgMAorI2RlZmluZSBTY3JlZW5TYXZlckFjdGl2ZSAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSE9TVFMgQU5EIENPTk5FQ1RJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGZvciBDaGFuZ2VIb3N0cyAqLworCisjZGVmaW5lIEhvc3RJbnNlcnQJCTAKKyNkZWZpbmUgSG9zdERlbGV0ZQkJMQorCisvKiBmb3IgQ2hhbmdlQWNjZXNzQ29udHJvbCAqLworCisjZGVmaW5lIEVuYWJsZUFjY2VzcwkJMSAgICAgIAorI2RlZmluZSBEaXNhYmxlQWNjZXNzCQkwCisKKy8qIERpc3BsYXkgY2xhc3NlcyAgdXNlZCBpbiBvcGVuaW5nIHRoZSBjb25uZWN0aW9uIAorICogTm90ZSB0aGF0IHRoZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBvbmVzIGFyZSBldmVuIG51bWJlcmVkIGFuZCB0aGUKKyAqIGR5bmFtaWNhbGx5IGNoYW5nZWFibGUgb25lcyBhcmUgb2RkIG51bWJlcmVkICovCisKKyNkZWZpbmUgU3RhdGljR3JheQkJMAorI2RlZmluZSBHcmF5U2NhbGUJCTEKKyNkZWZpbmUgU3RhdGljQ29sb3IJCTIKKyNkZWZpbmUgUHNldWRvQ29sb3IJCTMKKyNkZWZpbmUgVHJ1ZUNvbG9yCQk0CisjZGVmaW5lIERpcmVjdENvbG9yCQk1CisKKworLyogQnl0ZSBvcmRlciAgdXNlZCBpbiBpbWFnZUJ5dGVPcmRlciBhbmQgYml0bWFwQml0T3JkZXIgKi8KKworI2RlZmluZSBMU0JGaXJzdAkJMAorI2RlZmluZSBNU0JGaXJzdAkJMQorCisjZW5kaWYgLyogWF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YRjg2a2V5c3ltLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YRjg2a2V5c3ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1ZTljYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hGODZrZXlzeW0uaApAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIFhGcmVlODYgdmVuZG9yIHNwZWNpZmljIGtleXN5bXMuCisgKgorICogVGhlIFhGcmVlODYga2V5c3ltIHJhbmdlIGlzIDB4MTAwODAwMDEgLSAweDEwMDhGRkZGLgorICoKKyAqIFdoZW4gYWRkaW5nIG5ldyBlbnRyaWVzLCB0aGUgeGMvbGliL1hLZXlzeW1EQiBmaWxlIHNob3VsZCBhbHNvIGJlCisgKiB1cGRhdGVkIHRvIG1ha2UgdGhlIG5ldyBlbnRyaWVzIHZpc2libGUgdG8gWGxpYi4KKyAqLworCisvKgorICogTW9kZUxvY2sKKyAqCisgKiBUaGlzIG9uZSBpcyBvbGQsIGFuZCBub3QgcmVhbGx5IHVzZWQgYW55IG1vcmUgc2luY2UgWEtCIG9mZmVycyB0aGlzCisgKiBmdW5jdGlvbmFsaXR5LgorICovCisKKyNkZWZpbmUgWEY4NlhLX01vZGVMb2NrCQkweDEwMDhGRjAxCS8qIE1vZGUgU3dpdGNoIExvY2sgKi8KKworLyoKKyAqIE5vdGUsIDB4MTAwOEZGMDcgLSAweDEwMDhGRjBGIGFyZSBmcmVlIGFuZCBzaG91bGQgYmUgdXNlZCBmb3IgbWlzYyBuZXcKKyAqIGtleXN5bXMgdGhhdCBkb24ndCBmaXQgaW50byBhbnkgb2YgdGhlIGdyb3VwcyBiZWxvdy4KKyAqCisgKiAweDEwMDhGRjY0LCAweDEwMDhGRjZGLCAweDEwMDhGRjcxLCAweDEwMDhGRjgzIGFyZSBubyBsb25nZXIgdXNlZCwKKyAqIGFuZCBzaG91bGQgYmUgdXNlZCBmaXJzdCBmb3IgbmV3IGtleXN5bXMuCisgKgorICogQ2hlY2sgaW4ga2V5c3ltZGVmLmggZm9yIGdlbmVyaWMgc3ltYm9scyBiZWZvcmUgYWRkaW5nIG5ldyBYRnJlZTg2LXNwZWNpZmljCisgKiBzeW1ib2xzIGhlcmUuCisgKgorICogWC5Pcmcgd2lsbCBub3QgYmUgYWRkaW5nIHRvIHRoZSBYRjg2IHNldCBvZiBrZXlzeW1zLCB0aG91Z2ggdGhleSBoYXZlCisgKiBiZWVuIGFkb3B0ZWQgYW5kIGFyZSBjb25zaWRlcmVkIGEgInN0YW5kYXJkIiBwYXJ0IG9mIFgga2V5c3ltIGRlZmluaXRpb25zLgorICogWEZyZWU4NiBuZXZlciBwcm9wZXJseSBjb21tZW50ZWQgdGhlc2Uga2V5c3ltcywgc28gd2UgaGF2ZSBkb25lIG91cgorICogYmVzdCB0byBleHBsYWluIHRoZSBzZW1hbnRpYyBtZWFuaW5nIG9mIHRoZXNlIGtleXMuCisgKgorICogWEZyZWU4NiBoYXMgcmVtb3ZlZCB0aGVpciBtYWlsIGFyY2hpdmVzIG9mIHRoZSBwZXJpb2QsIHRoYXQgbWlnaHQgaGF2ZQorICogc2hlZCBtb3JlIGxpZ2h0IG9uIHNvbWUgb2YgdGhlc2UgZGVmaW5pdGlvbnMuIFVudGlsL3VubGVzcyB3ZSByZXN1cnJlY3QKKyAqIHRoZXNlIGFyY2hpdmVzLCB0aGVzZSBhcmUgZnJvbSBtZW1vcnkgYW5kIHVzYWdlLgorICovCisKKworLyogQmFja2xpZ2h0IGNvbnRyb2xzLiAqLworI2RlZmluZSBYRjg2WEtfTW9uQnJpZ2h0bmVzc1VwICAgMHgxMDA4RkYwMiAgLyogTW9uaXRvci9wYW5lbCBicmlnaHRuZXNzICovCisjZGVmaW5lIFhGODZYS19Nb25CcmlnaHRuZXNzRG93biAweDEwMDhGRjAzICAvKiBNb25pdG9yL3BhbmVsIGJyaWdodG5lc3MgKi8KKyNkZWZpbmUgWEY4NlhLX0tiZExpZ2h0T25PZmYgICAgIDB4MTAwOEZGMDQgIC8qIEtleWJvYXJkcyBtYXkgYmUgbGl0ICAgICAqLworI2RlZmluZSBYRjg2WEtfS2JkQnJpZ2h0bmVzc1VwICAgMHgxMDA4RkYwNSAgLyogS2V5Ym9hcmRzIG1heSBiZSBsaXQgICAgICovCisjZGVmaW5lIFhGODZYS19LYmRCcmlnaHRuZXNzRG93biAweDEwMDhGRjA2ICAvKiBLZXlib2FyZHMgbWF5IGJlIGxpdCAgICAgKi8KKworLyoKKyAqIEtleXMgZm91bmQgb24gc29tZSAiSW50ZXJuZXQiIGtleWJvYXJkcy4KKyAqLworI2RlZmluZSBYRjg2WEtfU3RhbmRieQkJMHgxMDA4RkYxMCAgIC8qIFN5c3RlbSBpbnRvIHN0YW5kYnkgbW9kZSAgICovCisjZGVmaW5lIFhGODZYS19BdWRpb0xvd2VyVm9sdW1lCTB4MTAwOEZGMTEgICAvKiBWb2x1bWUgY29udHJvbCBkb3duICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfQXVkaW9NdXRlCTB4MTAwOEZGMTIgICAvKiBNdXRlIHNvdW5kIGZyb20gdGhlIHN5c3RlbSAqLworI2RlZmluZSBYRjg2WEtfQXVkaW9SYWlzZVZvbHVtZQkweDEwMDhGRjEzICAgLyogVm9sdW1lIGNvbnRyb2wgdXAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvUGxheQkweDEwMDhGRjE0ICAgLyogU3RhcnQgcGxheWluZyBvZiBhdWRpbyA+ICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvU3RvcAkweDEwMDhGRjE1ICAgLyogU3RvcCBwbGF5aW5nIGF1ZGlvICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvUHJldgkweDEwMDhGRjE2ICAgLyogUHJldmlvdXMgdHJhY2sgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvTmV4dAkweDEwMDhGRjE3ICAgLyogTmV4dCB0cmFjayAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0hvbWVQYWdlCQkweDEwMDhGRjE4ICAgLyogRGlzcGxheSB1c2VyJ3MgaG9tZSBwYWdlICAgKi8KKyNkZWZpbmUgWEY4NlhLX01haWwJCTB4MTAwOEZGMTkgICAvKiBJbnZva2UgdXNlcidzIG1haWwgcHJvZ3JhbSAqLworI2RlZmluZSBYRjg2WEtfU3RhcnQJCTB4MTAwOEZGMUEgICAvKiBTdGFydCBhcHBsaWNhdGlvbiAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfU2VhcmNoCQkweDEwMDhGRjFCICAgLyogU2VhcmNoICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvUmVjb3JkCTB4MTAwOEZGMUMgICAvKiBSZWNvcmQgYXVkaW8gYXBwbGljYXRpb24gICAqLworCisvKiBUaGVzZSBhcmUgc29tZXRpbWVzIGZvdW5kIG9uIFBEQSdzIChlLmcuIFBhbG0sIFBvY2tldFBDIG9yIGVsc2V3aGVyZSkgICAqLworI2RlZmluZSBYRjg2WEtfQ2FsY3VsYXRvcgkweDEwMDhGRjFEICAgLyogSW52b2tlIGNhbGN1bGF0b3IgcHJvZ3JhbSAgKi8KKyNkZWZpbmUgWEY4NlhLX01lbW8JCTB4MTAwOEZGMUUgICAvKiBJbnZva2UgTWVtbyB0YWtpbmcgcHJvZ3JhbSAqLworI2RlZmluZSBYRjg2WEtfVG9Eb0xpc3QJCTB4MTAwOEZGMUYgICAvKiBJbnZva2UgVG8gRG8gTGlzdCBwcm9ncmFtICAqLworI2RlZmluZSBYRjg2WEtfQ2FsZW5kYXIJCTB4MTAwOEZGMjAgICAvKiBJbnZva2UgQ2FsZW5kYXIgcHJvZ3JhbSAgICAqLworI2RlZmluZSBYRjg2WEtfUG93ZXJEb3duCTB4MTAwOEZGMjEgICAvKiBEZWVwIHNsZWVwIHRoZSBzeXN0ZW0gICAgICAqLworI2RlZmluZSBYRjg2WEtfQ29udHJhc3RBZGp1c3QJMHgxMDA4RkYyMiAgIC8qIEFkanVzdCBzY3JlZW4gY29udHJhc3QgICAgICovCisjZGVmaW5lIFhGODZYS19Sb2NrZXJVcAkJMHgxMDA4RkYyMyAgIC8qIFJvY2tlciBzd2l0Y2hlcyBleGlzdCB1cCAgICovCisjZGVmaW5lIFhGODZYS19Sb2NrZXJEb3duCTB4MTAwOEZGMjQgICAvKiBhbmQgZG93biAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfUm9ja2VyRW50ZXIJMHgxMDA4RkYyNSAgIC8qIGFuZCBsZXQgeW91IHByZXNzIHRoZW0gICAgICovCisKKy8qIFNvbWUgbW9yZSAiSW50ZXJuZXQiIGtleWJvYXJkIHN5bWJvbHMgKi8KKyNkZWZpbmUgWEY4NlhLX0JhY2sJCTB4MTAwOEZGMjYgICAvKiBMaWtlIGJhY2sgb24gYSBicm93c2VyICAgICAqLworI2RlZmluZSBYRjg2WEtfRm9yd2FyZAkJMHgxMDA4RkYyNyAgIC8qIExpa2UgZm9yd2FyZCBvbiBhIGJyb3dzZXIgICovCisjZGVmaW5lIFhGODZYS19TdG9wCQkweDEwMDhGRjI4ICAgLyogU3RvcCBjdXJyZW50IG9wZXJhdGlvbiAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1JlZnJlc2gJCTB4MTAwOEZGMjkgICAvKiBSZWZyZXNoIHRoZSBwYWdlICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfUG93ZXJPZmYJCTB4MTAwOEZGMkEgICAvKiBQb3dlciBvZmYgc3lzdGVtIGVudGlyZWx5ICAqLworI2RlZmluZSBYRjg2WEtfV2FrZVVwCQkweDEwMDhGRjJCICAgLyogV2FrZSB1cCBzeXN0ZW0gZnJvbSBzbGVlcCAgKi8KKyNkZWZpbmUgWEY4NlhLX0VqZWN0ICAgICAgICAgICAgMHgxMDA4RkYyQyAgIC8qIEVqZWN0IGRldmljZSAoZS5nLiBEVkQpICAgICovCisjZGVmaW5lIFhGODZYS19TY3JlZW5TYXZlciAgICAgIDB4MTAwOEZGMkQgICAvKiBJbnZva2Ugc2NyZWVuc2F2ZXIgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfV1dXICAgICAgICAgICAgICAweDEwMDhGRjJFICAgLyogSW52b2tlIHdlYiBicm93c2VyICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1NsZWVwICAgICAgICAgICAgMHgxMDA4RkYyRiAgIC8qIFB1dCBzeXN0ZW0gdG8gc2xlZXAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19GYXZvcml0ZXMJMHgxMDA4RkYzMCAgIC8qIFNob3cgZmF2b3JpdGUgbG9jYXRpb25zICAgICovCisjZGVmaW5lIFhGODZYS19BdWRpb1BhdXNlCTB4MTAwOEZGMzEgICAvKiBQYXVzZSBhdWRpbyBwbGF5aW5nICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfQXVkaW9NZWRpYQkweDEwMDhGRjMyICAgLyogTGF1bmNoIG1lZGlhIGNvbGxlY3Rpb24gYXBwICovCisjZGVmaW5lIFhGODZYS19NeUNvbXB1dGVyCTB4MTAwOEZGMzMgICAvKiBEaXNwbGF5ICJNeSBDb21wdXRlciIgd2luZG93ICovCisjZGVmaW5lIFhGODZYS19WZW5kb3JIb21lCTB4MTAwOEZGMzQgICAvKiBEaXNwbGF5IHZlbmRvciBob21lIHdlYiBzaXRlICovCisjZGVmaW5lIFhGODZYS19MaWdodEJ1bGIJMHgxMDA4RkYzNSAgIC8qIExpZ2h0IGJ1bGIga2V5cyBleGlzdCAgICAgICAqLworI2RlZmluZSBYRjg2WEtfU2hvcAkJMHgxMDA4RkYzNiAgIC8qIERpc3BsYXkgc2hvcHBpbmcgd2ViIHNpdGUgICAqLworI2RlZmluZSBYRjg2WEtfSGlzdG9yeQkJMHgxMDA4RkYzNyAgIC8qIFNob3cgaGlzdG9yeSBvZiB3ZWIgc3VyZmluZyAqLworI2RlZmluZSBYRjg2WEtfT3BlblVSTAkJMHgxMDA4RkYzOCAgIC8qIE9wZW4gc2VsZWN0ZWQgVVJMICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfQWRkRmF2b3JpdGUJMHgxMDA4RkYzOSAgIC8qIEFkZCBVUkwgdG8gZmF2b3JpdGVzIGxpc3QgICAqLworI2RlZmluZSBYRjg2WEtfSG90TGlua3MJCTB4MTAwOEZGM0EgICAvKiBTaG93ICJob3QiIGxpbmtzICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0JyaWdodG5lc3NBZGp1c3QJMHgxMDA4RkYzQiAgIC8qIEludm9rZSBicmlnaHRuZXNzIGFkai4gVUkgICAqLworI2RlZmluZSBYRjg2WEtfRmluYW5jZQkJMHgxMDA4RkYzQyAgIC8qIERpc3BsYXkgZmluYW5jaWFsIHNpdGUgICAgICAqLworI2RlZmluZSBYRjg2WEtfQ29tbXVuaXR5CTB4MTAwOEZGM0QgICAvKiBEaXNwbGF5IHVzZXIncyBjb21tdW5pdHkgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvUmV3aW5kCTB4MTAwOEZGM0UgICAvKiAicmV3aW5kIiBhdWRpbyB0cmFjayAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0JhY2tGb3J3YXJkCTB4MTAwOEZGM0YgICAvKiA/Pz8gKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaDAJCTB4MTAwOEZGNDAgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaDEJCTB4MTAwOEZGNDEgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaDIJCTB4MTAwOEZGNDIgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaDMJCTB4MTAwOEZGNDMgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaDQJCTB4MTAwOEZGNDQgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaDUJCTB4MTAwOEZGNDUgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaDYJCTB4MTAwOEZGNDYgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaDcJCTB4MTAwOEZGNDcgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaDgJCTB4MTAwOEZGNDggICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaDkJCTB4MTAwOEZGNDkgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaEEJCTB4MTAwOEZGNEEgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaEIJCTB4MTAwOEZGNEIgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaEMJCTB4MTAwOEZGNEMgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaEQJCTB4MTAwOEZGNEQgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaEUJCTB4MTAwOEZGNEUgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xhdW5jaEYJCTB4MTAwOEZGNEYgICAvKiBMYXVuY2ggQXBwbGljYXRpb24gICAgICAgICAgKi8KKworI2RlZmluZSBYRjg2WEtfQXBwbGljYXRpb25MZWZ0CTB4MTAwOEZGNTAgICAvKiBzd2l0Y2ggdG8gYXBwbGljYXRpb24sIGxlZnQgKi8KKyNkZWZpbmUgWEY4NlhLX0FwcGxpY2F0aW9uUmlnaHQJMHgxMDA4RkY1MSAgIC8qIHN3aXRjaCB0byBhcHBsaWNhdGlvbiwgcmlnaHQqLworI2RlZmluZSBYRjg2WEtfQm9vawkJMHgxMDA4RkY1MiAgIC8qIExhdW5jaCBib29rcmVhZGVyICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfQ0QJCTB4MTAwOEZGNTMgICAvKiBMYXVuY2ggQ0QvRFZEIHBsYXllciAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0NhbGN1bGF0ZXIJMHgxMDA4RkY1NCAgIC8qIExhdW5jaCBDYWxjdWxhdGVyICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfQ2xlYXIJCTB4MTAwOEZGNTUgICAvKiBDbGVhciB3aW5kb3csIHNjcmVlbiAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0Nsb3NlCQkweDEwMDhGRjU2ICAgLyogQ2xvc2Ugd2luZG93ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19Db3B5CQkweDEwMDhGRjU3ICAgLyogQ29weSBzZWxlY3Rpb24gICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19DdXQJCTB4MTAwOEZGNTggICAvKiBDdXQgc2VsZWN0aW9uICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0Rpc3BsYXkJCTB4MTAwOEZGNTkgICAvKiBPdXRwdXQgc3dpdGNoIGtleSAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0RPUwkJMHgxMDA4RkY1QSAgIC8qIExhdW5jaCBET1MgKGVtdWxhdGlvbikgICAgICAqLworI2RlZmluZSBYRjg2WEtfRG9jdW1lbnRzCTB4MTAwOEZGNUIgICAvKiBPcGVuIGRvY3VtZW50cyB3aW5kb3cgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0V4Y2VsCQkweDEwMDhGRjVDICAgLyogTGF1bmNoIHNwcmVhZCBzaGVldCAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19FeHBsb3JlcgkJMHgxMDA4RkY1RCAgIC8qIExhdW5jaCBmaWxlIGV4cGxvcmVyICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfR2FtZQkJMHgxMDA4RkY1RSAgIC8qIExhdW5jaCBnYW1lICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfR28JCTB4MTAwOEZGNUYgICAvKiBHbyB0byBVUkwgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX2lUb3VjaAkJMHgxMDA4RkY2MCAgIC8qIExvZ2l0Y2ggaVRvdWNoLSBkb24ndCB1c2UgICAqLworI2RlZmluZSBYRjg2WEtfTG9nT2ZmCQkweDEwMDhGRjYxICAgLyogTG9nIG9mZiBzeXN0ZW0gICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19NYXJrZXQJCTB4MTAwOEZGNjIgICAvKiA/PyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX01lZXRpbmcJCTB4MTAwOEZGNjMgICAvKiBlbnRlciBtZWV0aW5nIGluIGNhbGVuZGFyICAgKi8KKyNkZWZpbmUgWEY4NlhLX01lbnVLQgkJMHgxMDA4RkY2NSAgIC8qIGRpc3Rpbmd1c2gga2V5Ym9hcmQgZnJvbSBQQiAqLworI2RlZmluZSBYRjg2WEtfTWVudVBCCQkweDEwMDhGRjY2ICAgLyogZGlzdGludWlzaCBQQiBmcm9tIGtleWJvYXJkICovCisjZGVmaW5lIFhGODZYS19NeVNpdGVzCQkweDEwMDhGRjY3ICAgLyogRmF2b3VyaXRlcyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19OZXcJCTB4MTAwOEZGNjggICAvKiBOZXcgKGZvbGRlciwgZG9jdW1lbnQuLi4gICAgKi8KKyNkZWZpbmUgWEY4NlhLX05ld3MJCTB4MTAwOEZGNjkgICAvKiBOZXdzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX09mZmljZUhvbWUJMHgxMDA4RkY2QSAgIC8qIE9mZmljZSBob21lIChvbGQgU3Rhcm9mZmljZSkqLworI2RlZmluZSBYRjg2WEtfT3BlbgkJMHgxMDA4RkY2QiAgIC8qIE9wZW4gICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfT3B0aW9uCQkweDEwMDhGRjZDICAgLyogPz8gKi8KKyNkZWZpbmUgWEY4NlhLX1Bhc3RlCQkweDEwMDhGRjZEICAgLyogUGFzdGUgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19QaG9uZQkJMHgxMDA4RkY2RSAgIC8qIExhdW5jaCBwaG9uZTsgZGlhbCBudW1iZXIgICAqLworI2RlZmluZSBYRjg2WEtfUQkJMHgxMDA4RkY3MCAgIC8qIENvbXBhcSdzIFEgLSBkb24ndCB1c2UgICAgICAqLworI2RlZmluZSBYRjg2WEtfUmVwbHkJCTB4MTAwOEZGNzIgICAvKiBSZXBseSBlLmcuLCBtYWlsICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1JlbG9hZAkJMHgxMDA4RkY3MyAgIC8qIFJlbG9hZCB3ZWIgcGFnZSwgZmlsZSwgZXRjLiAqLworI2RlZmluZSBYRjg2WEtfUm90YXRlV2luZG93cwkweDEwMDhGRjc0ICAgLyogUm90YXRlIHdpbmRvd3MgZS5nLiB4cmFuZHIgICovCisjZGVmaW5lIFhGODZYS19Sb3RhdGlvblBCCTB4MTAwOEZGNzUgICAvKiBkb24ndCB1c2UgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1JvdGF0aW9uS0IJMHgxMDA4RkY3NiAgIC8qIGRvbid0IHVzZSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfU2F2ZQkJMHgxMDA4RkY3NyAgIC8qIFNhdmUgKGZpbGUsIGRvY3VtZW50LCBzdGF0ZSAqLworI2RlZmluZSBYRjg2WEtfU2Nyb2xsVXAJCTB4MTAwOEZGNzggICAvKiBTY3JvbGwgd2luZG93L2NvbnRlbnRzIHVwICAgKi8KKyNkZWZpbmUgWEY4NlhLX1Njcm9sbERvd24JMHgxMDA4RkY3OSAgIC8qIFNjcm9vbCB3aW5kb3cvY29udGVudGQgZG93biAqLworI2RlZmluZSBYRjg2WEtfU2Nyb2xsQ2xpY2sJMHgxMDA4RkY3QSAgIC8qIFVzZSBYS0IgbW91c2VrZXlzIGluc3RlYWQgICAqLworI2RlZmluZSBYRjg2WEtfU2VuZAkJMHgxMDA4RkY3QiAgIC8qIFNlbmQgbWFpbCwgZmlsZSwgb2JqZWN0ICAgICAqLworI2RlZmluZSBYRjg2WEtfU3BlbGwJCTB4MTAwOEZGN0MgICAvKiBTcGVsbCBjaGVja2VyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1NwbGl0U2NyZWVuCTB4MTAwOEZGN0QgICAvKiBTcGxpdCB3aW5kb3cgb3Igc2NyZWVuICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1N1cHBvcnQJCTB4MTAwOEZGN0UgICAvKiBHZXQgc3VwcG9ydCAoPz8pICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1Rhc2tQYW5lCQkweDEwMDhGRjdGICAgLyogU2hvdyB0YXNrcyAqLworI2RlZmluZSBYRjg2WEtfVGVybWluYWwJCTB4MTAwOEZGODAgICAvKiBMYXVuY2ggdGVybWluYWwgZW11bGF0b3IgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1Rvb2xzCQkweDEwMDhGRjgxICAgLyogdG9vbGJveCBvZiBkZXNrdG9wL2FwcC4gICAgICovCisjZGVmaW5lIFhGODZYS19UcmF2ZWwJCTB4MTAwOEZGODIgICAvKiA/PyAqLworI2RlZmluZSBYRjg2WEtfVXNlclBCCQkweDEwMDhGRjg0ICAgLyogPz8gKi8KKyNkZWZpbmUgWEY4NlhLX1VzZXIxS0IJCTB4MTAwOEZGODUgICAvKiA/PyAqLworI2RlZmluZSBYRjg2WEtfVXNlcjJLQgkJMHgxMDA4RkY4NiAgIC8qID8/ICovCisjZGVmaW5lIFhGODZYS19WaWRlbwkJMHgxMDA4RkY4NyAgIC8qIExhdW5jaCB2aWRlbyBwbGF5ZXIgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1doZWVsQnV0dG9uCTB4MTAwOEZGODggICAvKiBidXR0b24gZnJvbSBhIG1vdXNlIHdoZWVsICovCisjZGVmaW5lIFhGODZYS19Xb3JkCQkweDEwMDhGRjg5ICAgLyogTGF1bmNoIHdvcmQgcHJvY2Vzc29yICAgICAqLworI2RlZmluZSBYRjg2WEtfWGZlcgkJMHgxMDA4RkY4QQorI2RlZmluZSBYRjg2WEtfWm9vbUluCQkweDEwMDhGRjhCICAgLyogem9vbSBpbiB2aWV3LCBtYXAsIGV0Yy4gICAqLworI2RlZmluZSBYRjg2WEtfWm9vbU91dAkJMHgxMDA4RkY4QyAgIC8qIHpvb20gb3V0IHZpZXcsIG1hcCwgZXRjLiAgKi8KKworI2RlZmluZSBYRjg2WEtfQXdheQkJMHgxMDA4RkY4RCAgIC8qIG1hcmsgeW91cnNlbGYgYXMgYXdheSAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX01lc3NlbmdlcgkweDEwMDhGRjhFICAgLyogYXMgaW4gaW5zdGFudCBtZXNzYWdpbmcgICAqLworI2RlZmluZSBYRjg2WEtfV2ViQ2FtCQkweDEwMDhGRjhGICAgLyogTGF1bmNoIHdlYiBjYW1lcmEgYXBwLiAgICAqLworI2RlZmluZSBYRjg2WEtfTWFpbEZvcndhcmQJMHgxMDA4RkY5MCAgIC8qIEZvcndhcmQgaW4gbWFpbCAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1BpY3R1cmVzCQkweDEwMDhGRjkxICAgLyogU2hvdyBwaWN0dXJlcyAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfTXVzaWMJCTB4MTAwOEZGOTIgICAvKiBMYXVuY2ggbXVzaWMgYXBwbGljYXRpb24gICovCisKKyNkZWZpbmUgWEY4NlhLX0JhdHRlcnkJCTB4MTAwOEZGOTMgICAvKiBEaXNwbGF5IGJhdHRlcnkgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgWEY4NlhLX0JsdWV0b290aAkweDEwMDhGRjk0ICAgLyogRW5hYmxlL2Rpc2FibGUgQmx1ZXRvb3RoICAgICovCisjZGVmaW5lIFhGODZYS19XTEFOCQkweDEwMDhGRjk1ICAgLyogRW5hYmxlL2Rpc2FibGUgV0xBTiAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19VV0IJCTB4MTAwOEZGOTYgICAvKiBFbmFibGUvZGlzYWJsZSBVV0IJICAgICovCisKKyNkZWZpbmUgWEY4NlhLX0F1ZGlvRm9yd2FyZAkweDEwMDhGRjk3ICAgLyogZmFzdC1mb3J3YXJkIGF1ZGlvIHRyYWNrICAgICovCisjZGVmaW5lIFhGODZYS19BdWRpb1JlcGVhdAkweDEwMDhGRjk4ICAgLyogdG9nZ2xlIHJlcGVhdCBtb2RlICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19BdWRpb1JhbmRvbVBsYXkJMHgxMDA4RkY5OSAgIC8qIHRvZ2dsZSBzaHVmZmxlIG1vZGUgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfU3VidGl0bGUJCTB4MTAwOEZGOUEgICAvKiBjeWNsZSB0aHJvdWdoIHN1YnRpdGxlICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvQ3ljbGVUcmFjawkweDEwMDhGRjlCICAgLyogY3ljbGUgdGhyb3VnaCBhdWRpbyB0cmFja3MgICovCisjZGVmaW5lIFhGODZYS19DeWNsZUFuZ2xlCTB4MTAwOEZGOUMgICAvKiBjeWNsZSB0aHJvdWdoIGFuZ2xlcyAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0ZyYW1lQmFjawkweDEwMDhGRjlEICAgLyogdmlkZW86IGdvIG9uZSBmcmFtZSBiYWNrICAgICovCisjZGVmaW5lIFhGODZYS19GcmFtZUZvcndhcmQJMHgxMDA4RkY5RSAgIC8qIHZpZGVvOiBnbyBvbmUgZnJhbWUgZm9yd2FyZCAqLworI2RlZmluZSBYRjg2WEtfVGltZQkJMHgxMDA4RkY5RiAgIC8qIGRpc3BsYXksIG9yIHNob3dzIGFuIGVudHJ5IGZvciB0aW1lIHNlZWtpbmcgKi8KKyNkZWZpbmUgWEY4NlhLX1NlbGVjdAkJMHgxMDA4RkZBMCAgIC8qIFNlbGVjdCBidXR0b24gb24gam95cGFkcyBhbmQgcmVtb3RlcyAqLworI2RlZmluZSBYRjg2WEtfVmlldwkJMHgxMDA4RkZBMSAgIC8qIFNob3cgYSB2aWV3IG9wdGlvbnMvcHJvcGVydGllcyAqLworI2RlZmluZSBYRjg2WEtfVG9wTWVudQkJMHgxMDA4RkZBMiAgIC8qIEdvIHRvIGEgdG9wLWxldmVsIG1lbnUgaW4gYSB2aWRlbyAqLworCisjZGVmaW5lIFhGODZYS19SZWQJCTB4MTAwOEZGQTMgICAvKiBSZWQgYnV0dG9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0dyZWVuCQkweDEwMDhGRkE0ICAgLyogR3JlZW4gYnV0dG9uICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19ZZWxsb3cJCTB4MTAwOEZGQTUgICAvKiBZZWxsb3cgYnV0dG9uICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0JsdWUgICAgICAgICAgICAgMHgxMDA4RkZBNiAgIC8qIEJsdWUgYnV0dG9uICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFhGODZYS19TdXNwZW5kCQkweDEwMDhGRkE3ICAgLyogU2xlZXAgdG8gUkFNICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19IaWJlcm5hdGUJMHgxMDA4RkZBOCAgIC8qIFNsZWVwIHRvIGRpc2sgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfVG91Y2hwYWRUb2dnbGUJMHgxMDA4RkZBOSAgIC8qIFRvZ2dsZSBiZXR3ZWVuIHRvdWNocGFkL3RyYWNrc3RpY2sgKi8KKyNkZWZpbmUgWEY4NlhLX1RvdWNocGFkT24JMHgxMDA4RkZCMCAgIC8qIFRoZSB0b3VjaHBhZCBnb3Qgc3dpdGNoZWQgb24gKi8KKyNkZWZpbmUgWEY4NlhLX1RvdWNocGFkT2ZmCTB4MTAwOEZGQjEgICAvKiBUaGUgdG91Y2hwYWQgZ290IHN3aXRjaGVkIG9mZiAqLworCisvKiBLZXlzIGZvciBzcGVjaWFsIGFjdGlvbiBrZXlzIChob3Qga2V5cykgKi8KKy8qIFZpcnR1YWwgdGVybWluYWxzIG9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgKi8KKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF8xCTB4MTAwOEZFMDEKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF8yCTB4MTAwOEZFMDIKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF8zCTB4MTAwOEZFMDMKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF80CTB4MTAwOEZFMDQKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF81CTB4MTAwOEZFMDUKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF82CTB4MTAwOEZFMDYKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF83CTB4MTAwOEZFMDcKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF84CTB4MTAwOEZFMDgKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF85CTB4MTAwOEZFMDkKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF8xMAkweDEwMDhGRTBBCisjZGVmaW5lIFhGODZYS19Td2l0Y2hfVlRfMTEJMHgxMDA4RkUwQgorI2RlZmluZSBYRjg2WEtfU3dpdGNoX1ZUXzEyCTB4MTAwOEZFMEMKKworI2RlZmluZSBYRjg2WEtfVW5ncmFiCQkweDEwMDhGRTIwICAgLyogZm9yY2UgdW5ncmFiICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0NsZWFyR3JhYgkweDEwMDhGRTIxICAgLyoga2lsbCBhcHBsaWNhdGlvbiB3aXRoIGdyYWIgKi8KKyNkZWZpbmUgWEY4NlhLX05leHRfVk1vZGUJMHgxMDA4RkUyMiAgIC8qIG5leHQgdmlkZW8gbW9kZSBhdmFpbGFibGUgICovCisjZGVmaW5lIFhGODZYS19QcmV2X1ZNb2RlCTB4MTAwOEZFMjMgICAvKiBwcmV2LiB2aWRlbyBtb2RlIGF2YWlsYWJsZSAqLworI2RlZmluZSBYRjg2WEtfTG9nV2luZG93VHJlZQkweDEwMDhGRTI0ICAgLyogcHJpbnQgd2luZG93IHRyZWUgdG8gbG9nICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xvZ0dyYWJJbmZvCTB4MTAwOEZFMjUgICAvKiBwcmludCBhbGwgYWN0aXZlIGdyYWJzIHRvIGxvZyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWEtCbGliLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YS0JsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjZjNzJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWEtCbGliLmgKQEAgLTAsMCArMSwxMTQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDE5OTMgYnkgU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKK2ZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24KK29mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1NpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5CitvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgord2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCitTSUxJQ09OIEdSQVBISUNTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTCitTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCitBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIElOIE5PIEVWRU5UIFNIQUxMIFNJTElDT04KK0dSQVBISUNTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKK0RBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UKK09SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiAgV0lUSAorVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfWDExX1hLQkxJQl9IXworI2RlZmluZSBfWDExX1hLQkxJQl9IXworCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YS0JzdHIuaD4KKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkFueUV2ZW50IHsKKwlpbnQgCQl0eXBlOwkJLyogWGtiQW55RXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIAlzZXJpYWw7CQkvKiAjIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3Q/ICovCisJRGlzcGxheSAqCWRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlUaW1lIAkJdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCAJCXhrYl90eXBlOwkvKiBYS0IgZXZlbnQgbWlub3IgY29kZSAqLworCXVuc2lnbmVkIGludCAJZGV2aWNlOwkJLyogZGV2aWNlIElEICovCit9IFhrYkFueUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfWGtiTmV3S2V5Ym9hcmROb3RpZnkgeworCWludCAJCXR5cGU7CQkvKiBYa2JBbnlFdmVudCAqLworCXVuc2lnbmVkIGxvbmcgCXNlcmlhbDsJCS8qIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3Q/ICovCisJRGlzcGxheSAqCWRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlUaW1lIAkJdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCAJCXhrYl90eXBlOwkvKiBYa2JOZXdLZXlib2FyZE5vdGlmeSAqLworCWludAkgCWRldmljZTsJCS8qIGRldmljZSBJRCAqLworCWludAkgCW9sZF9kZXZpY2U7CS8qIGRldmljZSBJRCBvZiBwcmV2aW91cyBrZXlib2FyZCAqLworCWludAkgCW1pbl9rZXlfY29kZTsJLyogbWluaW11bSBrZXkgY29kZSAqLworCWludAkJbWF4X2tleV9jb2RlOwkvKiBtYXhpbXVtIGtleSBjb2RlICovCisJaW50CSAJb2xkX21pbl9rZXlfY29kZTsvKiBtaW4ga2V5IGNvZGUgb2YgcHJldmlvdXMga2JkICovCisJaW50CQlvbGRfbWF4X2tleV9jb2RlOy8qIG1heCBrZXkgY29kZSBvZiBwcmV2aW91cyBrYmQgKi8KKwl1bnNpZ25lZCBpbnQJY2hhbmdlZDsJLyogY2hhbmdlZCBhc3BlY3RzIG9mIHRoZSBrZXlib2FyZCAqLworCWNoYXIJIAlyZXFfbWFqb3I7CS8qIG1ham9yIGFuZCBtaW5vciBvcGNvZGUgb2YgcmVxICovCisJY2hhcgkgCXJlcV9taW5vcjsJLyogdGhhdCBjYXVzZWQgY2hhbmdlLCBpZiBhcHBsaWNhYmxlICovCit9IFhrYk5ld0tleWJvYXJkTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JNYXBOb3RpZnlFdmVudCB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogb2YgbGFzdCByZXEgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgCQlzZW5kX2V2ZW50OwkvKiBpcyB0aGlzIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKglkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJVGltZSAJCXRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgCQl4a2JfdHlwZTsJLyogWGtiTWFwTm90aWZ5ICovCisJaW50IAkJZGV2aWNlOwkJLyogZGV2aWNlIElEICovCisJdW5zaWduZWQgaW50IAljaGFuZ2VkOwkvKiBmaWVsZHMgd2hpY2ggaGF2ZSBiZWVuIGNoYW5nZWQgKi8KKwl1bnNpZ25lZCBpbnQgCWZsYWdzOwkJLyogcmVzZXJ2ZWQgKi8KKwlpbnQgCQlmaXJzdF90eXBlOwkvKiBmaXJzdCBjaGFuZ2VkIGtleSB0eXBlICovCisJaW50IAkJbnVtX3R5cGVzOwkvKiBudW1iZXIgb2YgY2hhbmdlZCBrZXkgdHlwZXMgKi8KKwlLZXlDb2RlCQltaW5fa2V5X2NvZGU7CisJS2V5Q29kZQkJbWF4X2tleV9jb2RlOworCUtleUNvZGUJCWZpcnN0X2tleV9zeW07CisJS2V5Q29kZQkJZmlyc3Rfa2V5X2FjdDsKKwlLZXlDb2RlCQlmaXJzdF9rZXlfYmVoYXZpb3I7CisJS2V5Q29kZQkJZmlyc3Rfa2V5X2V4cGxpY2l0OworCUtleUNvZGUJCWZpcnN0X21vZG1hcF9rZXk7CisJS2V5Q29kZQkJZmlyc3Rfdm1vZG1hcF9rZXk7CisJaW50CQludW1fa2V5X3N5bXM7CisJaW50CQludW1fa2V5X2FjdHM7CisJaW50CQludW1fa2V5X2JlaGF2aW9yczsKKwlpbnQJCW51bV9rZXlfZXhwbGljaXQ7CisJaW50IAkJbnVtX21vZG1hcF9rZXlzOworCWludCAJCW51bV92bW9kbWFwX2tleXM7CisJdW5zaWduZWQgaW50IAl2bW9kczsJCS8qIG1hc2sgb2YgY2hhbmdlZCB2aXJ0dWFsIG1vZHMgKi8KK30gWGtiTWFwTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTdGF0ZU5vdGlmeUV2ZW50IHsKKwlpbnQgCQl0eXBlOwkJLyogWGtiQW55RXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIAlzZXJpYWw7CQkvKiAjIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3Q/ICovCisJRGlzcGxheSAqCWRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlUaW1lIAkJdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCAJCXhrYl90eXBlOwkvKiBYa2JTdGF0ZU5vdGlmeSAqLworCWludCAJCWRldmljZTsJCS8qIGRldmljZSBJRCAqLworCXVuc2lnbmVkIGludCAJY2hhbmdlZDsJLyogbWFzayBvZiBjaGFuZ2VkIHN0YXRlIGNvbXBvbmVudHMgKi8KKwlpbnQgCQlncm91cDsJCS8qIGtleWJvYXJkIGdyb3VwICovCisJaW50IAkJYmFzZV9ncm91cDsJLyogYmFzZSBrZXlib2FyZCBncm91cCAqLworCWludCAJCWxhdGNoZWRfZ3JvdXA7CS8qIGxhdGNoZWQga2V5Ym9hcmQgZ3JvdXAgKi8KKwlpbnQgCQlsb2NrZWRfZ3JvdXA7CS8qIGxvY2tlZCBrZXlib2FyZCBncm91cCAqLworCXVuc2lnbmVkIGludAltb2RzOwkJLyogbW9kaWZpZXIgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgCWJhc2VfbW9kczsJLyogYmFzZSBtb2RpZmllciBzdGF0ZSAqLworCXVuc2lnbmVkIGludAlsYXRjaGVkX21vZHM7CS8qIGxhdGNoZWQgbW9kaWZpZXJzICovCisJdW5zaWduZWQgaW50CWxvY2tlZF9tb2RzOwkvKiBsb2NrZWQgbW9kaWZpZXJzICovCisJaW50IAkJY29tcGF0X3N0YXRlOwkvKiBjb21wYXRpYmlsaXR5IHN0YXRlICovCisJdW5zaWduZWQgY2hhcglncmFiX21vZHM7CS8qIG1vZHMgdXNlZCBmb3IgZ3JhYnMgKi8KKwl1bnNpZ25lZCBjaGFyCWNvbXBhdF9ncmFiX21vZHM7LyogZ3JhYiBtb2RzIGZvciBub24tWEtCIGNsaWVudHMgKi8KKwl1bnNpZ25lZCBjaGFyCWxvb2t1cF9tb2RzOwkvKiBtb2RzIHNlbnQgdG8gY2xpZW50cyAqLworCXVuc2lnbmVkIGNoYXIJY29tcGF0X2xvb2t1cF9tb2RzOyAvKiBtb2RzIHNlbnQgdG8gbm9uLVhLQiBjbGllbnRzICovCisJaW50IAkJcHRyX2J1dHRvbnM7CS8qIHBvaW50ZXIgYnV0dG9uIHN0YXRlICovCisJS2V5Q29kZQkJa2V5Y29kZTsJLyoga2V5Y29kZSB0aGF0IGNhdXNlZCB0aGUgY2hhbmdlICovCisJY2hhciAJCWV2ZW50X3R5cGU7CS8qIEtleVByZXNzIG9yIEtleVJlbGVhc2UgKi8KKwljaGFyIAkJcmVxX21ham9yOwkvKiBNYWpvciBvcGNvZGUgb2YgcmVxdWVzdCAqLworCWNoYXIgCQlyZXFfbWlub3I7CS8qIE1pbm9yIG9wY29kZSBvZiByZXF1ZXN0ICovCit9IFhrYlN0YXRlTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDb250cm9sc05vdGlmeSB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogb2YgbGFzdCByZXEgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgCQlzZW5kX2V2ZW50OwkvKiBpcyB0aGlzIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdD8gKi8KKwlEaXNwbGF5ICoJZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVRpbWUgCQl0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IAkJeGtiX3R5cGU7CS8qIFhrYkNvbnRyb2xzTm90aWZ5ICovCisJaW50IAkJZGV2aWNlOwkJLyogZGV2aWNlIElEICovCisJdW5zaWduZWQgaW50CWNoYW5nZWRfY3RybHM7CS8qIGNvbnRyb2xzIHdpdGggY2hhbmdlZCBzdWItdmFsdWVzICovCisJdW5zaWduZWQgaW50IAllbmFibGVkX2N0cmxzOwkvKiBjb250cm9scyBjdXJyZW50bHkgZW5hYmxlZCAqLworCXVuc2lnbmVkIGludAllbmFibGVkX2N0cmxfY2hhbmdlczsvKiBjb250cm9scyBqdXN0IHtlbixkaXN9YWJsZWQgKi8KKwlpbnQgCQludW1fZ3JvdXBzOwkvKiB0b3RhbCBncm91cHMgb24ga2V5Ym9hcmQgKi8KKwlLZXlDb2RlCQlrZXljb2RlOwkvKiBrZXkgdGhhdCBjYXVzZWQgY2hhbmdlIG9yIDAgKi8KKwljaGFyIAkJZXZlbnRfdHlwZTsJLyogdHlwZSBvZiBldmVudCB0aGF0IGNhdXNlZCBjaGFuZ2UgKi8KKwljaGFyIAkJcmVxX21ham9yOwkvKiBpZiBrZXljb2RlPT0wLCBtYWpvciBhbmQgbWlub3IgKi8KKwljaGFyIAkJcmVxX21pbm9yOwkvKiBvcGNvZGUgb2YgcmVxIHRoYXQgY2F1c2VkIGNoYW5nZSAqLworfSBYa2JDb250cm9sc05vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfWGtiSW5kaWNhdG9yTm90aWZ5IHsKKwlpbnQgCQl0eXBlOwkJLyogWGtiQW55RXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIAlzZXJpYWw7CQkvKiBvZiBsYXN0IHJlcSBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCAJCXNlbmRfZXZlbnQ7CS8qIGlzIHRoaXMgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0PyAqLworCURpc3BsYXkgKglkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJVGltZSAJCXRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgCQl4a2JfdHlwZTsJLyogWGtiSW5kaWNhdG9yTm90aWZ5ICovCisJaW50IAkJZGV2aWNlOwkJLyogZGV2aWNlIElEICovCisJdW5zaWduZWQgaW50CWNoYW5nZWQ7CS8qIGluZGljYXRvcnMgd2l0aCBuZXcgc3RhdGUgb3IgbWFwICovCisJdW5zaWduZWQgaW50CXN0YXRlOwkgCS8qIGN1cnJlbnQgc3RhdGUgb2YgYWxsIGluZGljYXRvcnMgKi8KK30gWGtiSW5kaWNhdG9yTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JOYW1lc05vdGlmeSB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogb2YgbGFzdCByZXEgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgCQlzZW5kX2V2ZW50OwkvKiBpcyB0aGlzIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdD8gKi8KKwlEaXNwbGF5ICoJZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVRpbWUgCQl0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IAkJeGtiX3R5cGU7CS8qIFhrYk5hbWVzTm90aWZ5ICovCisJaW50CSAJZGV2aWNlOwkJLyogZGV2aWNlIElEICovCisJdW5zaWduZWQgaW50IAljaGFuZ2VkOwkvKiBuYW1lcyB0aGF0IGhhdmUgY2hhbmdlZCAqLworCWludAkgCWZpcnN0X3R5cGU7CS8qIGZpcnN0IGtleSB0eXBlIHdpdGggbmV3IG5hbWUgKi8KKwlpbnQJIAludW1fdHlwZXM7CS8qIG51bWJlciBvZiBrZXkgdHlwZXMgd2l0aCBuZXcgbmFtZXMgKi8KKwlpbnQJIAlmaXJzdF9sdmw7CS8qIGZpcnN0IGtleSB0eXBlIG5ldyBuZXcgbGV2ZWwgbmFtZXMgKi8KKwlpbnQJIAludW1fbHZsczsJLyogIyBvZiBrZXkgdHlwZXMgdy9uZXcgbGV2ZWwgbmFtZXMgKi8KKwlpbnQJIAludW1fYWxpYXNlczsJLyogdG90YWwgbnVtYmVyIG9mIGtleSBhbGlhc2VzKi8KKwlpbnQJIAludW1fcmFkaW9fZ3JvdXBzOy8qIHRvdGFsIG51bWJlciBvZiByYWRpbyBncm91cHMgKi8KKwl1bnNpZ25lZCBpbnQgCWNoYW5nZWRfdm1vZHM7CS8qIHZpcnR1YWwgbW9kaWZpZXJzIHdpdGggbmV3IG5hbWVzICovCisJdW5zaWduZWQgaW50IAljaGFuZ2VkX2dyb3VwczsJLyogZ3JvdXBzIHdpdGggbmV3IG5hbWVzICovCisJdW5zaWduZWQgaW50IAljaGFuZ2VkX2luZGljYXRvcnM7LyogaW5kaWNhdG9ycyB3aXRoIG5ldyBuYW1lcyAqLworCWludAkJZmlyc3Rfa2V5OwkvKiBmaXJzdCBrZXkgd2l0aCBuZXcgbmFtZSAqLworCWludAkJbnVtX2tleXM7CS8qIG51bWJlciBvZiBrZXlzIHdpdGggbmV3IG5hbWVzICovCit9IFhrYk5hbWVzTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDb21wYXRNYXBOb3RpZnkgeworCWludCAJCXR5cGU7CQkvKiBYa2JBbnlFdmVudCAqLworCXVuc2lnbmVkIGxvbmcgCXNlcmlhbDsJCS8qIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3Q/ICovCisJRGlzcGxheSAqCWRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlUaW1lIAkJdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCAJCXhrYl90eXBlOwkvKiBYa2JDb21wYXRNYXBOb3RpZnkgKi8KKwlpbnQJIAlkZXZpY2U7CQkvKiBkZXZpY2UgSUQgKi8KKwl1bnNpZ25lZCBpbnQgCWNoYW5nZWRfZ3JvdXBzOyAvKiBncm91cHMgd2l0aCBuZXcgY29tcGF0IG1hcHMgKi8KKwlpbnQJIAlmaXJzdF9zaTsJLyogZmlyc3QgbmV3IHN5bWJvbCBpbnRlcnAgKi8KKwlpbnQJIAludW1fc2k7CQkvKiBudW1iZXIgb2YgbmV3IHN5bWJvbCBpbnRlcnBzICovCisJaW50CSAJbnVtX3RvdGFsX3NpOwkvKiB0b3RhbCAjIG9mIHN5bWJvbCBpbnRlcnBzICovCit9IFhrYkNvbXBhdE1hcE5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfWGtiQmVsbE5vdGlmeSB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogb2YgbGFzdCByZXEgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgCQlzZW5kX2V2ZW50OwkvKiBpcyB0aGlzIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdD8gKi8KKwlEaXNwbGF5ICoJZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVRpbWUgCQl0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IAkJeGtiX3R5cGU7CS8qIFhrYkJlbGxOb3RpZnkgKi8KKwlpbnQJIAlkZXZpY2U7CQkvKiBkZXZpY2UgSUQgKi8KKwlpbnQJIAlwZXJjZW50OwkvKiByZXF1ZXN0ZWQgdm9sdW1lIGFzIGEgJSBvZiBtYXhpbXVtICovCisJaW50CSAJcGl0Y2g7CQkvKiByZXF1ZXN0ZWQgcGl0Y2ggaW4gSHogKi8KKwlpbnQJIAlkdXJhdGlvbjsJLyogcmVxdWVzdGVkIGR1cmF0aW9uIGluIHVzZWNvbmRzICovCisJaW50CSAJYmVsbF9jbGFzczsJLyogKGlucHV0IGV4dGVuc2lvbikgZmVlZGJhY2sgY2xhc3MgKi8KKwlpbnQJIAliZWxsX2lkOwkvKiAoaW5wdXQgZXh0ZW5zaW9uKSBJRCBvZiBmZWVkYmFjayAqLworCUF0b20gCQluYW1lOwkJLyogIm5hbWUiIG9mIHJlcXVlc3RlZCBiZWxsICovCisJV2luZG93IAkJd2luZG93OwkJLyogd2luZG93IGFzc29jaWF0ZWQgd2l0aCBldmVudCAqLworCUJvb2wJCWV2ZW50X29ubHk7CS8qICJldmVudCBvbmx5IiByZXF1ZXN0ZWQgKi8KK30gWGtiQmVsbE5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfWGtiQWN0aW9uTWVzc2FnZSB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogb2YgbGFzdCByZXEgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgCQlzZW5kX2V2ZW50OwkvKiBpcyB0aGlzIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdD8gKi8KKwlEaXNwbGF5ICoJZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVRpbWUgCQl0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IAkJeGtiX3R5cGU7CS8qIFhrYkFjdGlvbk1lc3NhZ2UgKi8KKwlpbnQJIAlkZXZpY2U7CQkvKiBkZXZpY2UgSUQgKi8KKwlLZXlDb2RlCQlrZXljb2RlOwkvKiBrZXkgdGhhdCBnZW5lcmF0ZWQgdGhlIGV2ZW50ICovCisJQm9vbCAJCXByZXNzOwkJLyogdHJ1ZSBpZiBhY3QgY2F1c2VkIGJ5IGtleSBwcmVzcyAqLworCUJvb2wgCQlrZXlfZXZlbnRfZm9sbG93czsvKiB0cnVlIGlmIGtleSBldmVudCBhbHNvIGdlbmVyYXRlZCAqLworCWludAkJZ3JvdXA7CQkvKiBlZmZlY3RpdmUgZ3JvdXAgKi8KKwl1bnNpZ25lZCBpbnQJbW9kczsJCS8qIGVmZmVjdGl2ZSBtb2RzICovCisJY2hhciAJCW1lc3NhZ2VbWGtiQWN0aW9uTWVzc2FnZUxlbmd0aCsxXTsKKwkJCQkJLyogbWVzc2FnZSAtLSBsZWF2ZSBzcGFjZSBmb3IgTlVMICovCit9IFhrYkFjdGlvbk1lc3NhZ2VFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkFjY2Vzc1hOb3RpZnkgeworCWludCAJCXR5cGU7CQkvKiBYa2JBbnlFdmVudCAqLworCXVuc2lnbmVkIGxvbmcgCXNlcmlhbDsJCS8qIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3Q/ICovCisJRGlzcGxheSAqCWRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlUaW1lIAkJdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCAJCXhrYl90eXBlOwkvKiBYa2JBY2Nlc3NYTm90aWZ5ICovCisJaW50CSAJZGV2aWNlOwkJLyogZGV2aWNlIElEICovCisJaW50CSAJZGV0YWlsOwkJLyogWGtiQVhOXyogKi8KKwlpbnQJIAlrZXljb2RlOwkvKiBrZXkgb2YgZXZlbnQgKi8KKwlpbnQJIAlza19kZWxheTsJLyogY3VycmVudCBzbG93IGtleXMgZGVsYXkgKi8KKwlpbnQJCWRlYm91bmNlX2RlbGF5OwkvKiBjdXJyZW50IGRlYm91bmNlIGRlbGF5ICovCit9IFhrYkFjY2Vzc1hOb3RpZnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkV4dGVuc2lvbkRldmljZU5vdGlmeSB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogb2YgbGFzdCByZXEgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgCQlzZW5kX2V2ZW50OwkvKiBpcyB0aGlzIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdD8gKi8KKwlEaXNwbGF5ICoJZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVRpbWUgCQl0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IAkJeGtiX3R5cGU7CS8qIFhrYkV4dGVuc2lvbkRldmljZU5vdGlmeSAqLworCWludAkgCWRldmljZTsJCS8qIGRldmljZSBJRCAqLworCXVuc2lnbmVkIGludAlyZWFzb247CQkvKiByZWFzb24gZm9yIHRoZSBldmVudCAqLworCXVuc2lnbmVkIGludAlzdXBwb3J0ZWQ7CS8qIG1hc2sgb2Ygc3VwcG9ydGVkIGZlYXR1cmVzICovCisJdW5zaWduZWQgaW50CXVuc3VwcG9ydGVkOwkvKiBtYXNrIG9mIHVuc3VwcG9ydGVkIGZlYXR1cmVzICovCisJCQkJCS8qIHRoYXQgc29tZSBhcHAgdHJpZWQgdG8gdXNlICovCisJaW50CSAJZmlyc3RfYnRuOwkvKiBmaXJzdCBidXR0b24gdGhhdCBjaGFuZ2VkICovCisJaW50CSAJbnVtX2J0bnM7CS8qIHJhbmdlIG9mIGJ1dHRvbnMgY2hhbmdlZCAqLworCXVuc2lnbmVkIGludAlsZWRzX2RlZmluZWQ7ICAgLyogaW5kaWNhdG9ycyB3aXRoIG5hbWVzIG9yIG1hcHMgKi8KKwl1bnNpZ25lZCBpbnQJbGVkX3N0YXRlOwkvKiBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbmRpY2F0b3JzICovCisJaW50CQlsZWRfY2xhc3M7CS8qIGZlZWRiYWNrIGNsYXNzIGZvciBsZWQgY2hhbmdlcyAqLworCWludAkJbGVkX2lkOyAgIAkvKiBmZWVkYmFjayBpZCBmb3IgbGVkIGNoYW5nZXMgKi8KK30gWGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgdW5pb24gX1hrYkV2ZW50IHsKKwlpbnQJCQkJdHlwZTsKKwlYa2JBbnlFdmVudAkJCWFueTsKKwlYa2JOZXdLZXlib2FyZE5vdGlmeUV2ZW50CW5ld19rYmQ7CisJWGtiTWFwTm90aWZ5RXZlbnQJCW1hcDsKKwlYa2JTdGF0ZU5vdGlmeUV2ZW50CQlzdGF0ZTsKKwlYa2JDb250cm9sc05vdGlmeUV2ZW50CQljdHJsczsKKwlYa2JJbmRpY2F0b3JOb3RpZnlFdmVudCAJaW5kaWNhdG9yczsKKwlYa2JOYW1lc05vdGlmeUV2ZW50CQluYW1lczsKKwlYa2JDb21wYXRNYXBOb3RpZnlFdmVudAkJY29tcGF0OworCVhrYkJlbGxOb3RpZnlFdmVudAkJYmVsbDsKKwlYa2JBY3Rpb25NZXNzYWdlRXZlbnQJCW1lc3NhZ2U7CisJWGtiQWNjZXNzWE5vdGlmeUV2ZW50CQlhY2Nlc3N4OworCVhrYkV4dGVuc2lvbkRldmljZU5vdGlmeUV2ZW50IAlkZXZpY2U7CisJWEV2ZW50CQkJCWNvcmU7Cit9IFhrYkV2ZW50OworCit0eXBlZGVmIHN0cnVjdAlfWGtiS2JkRHB5U3RhdGUJWGtiS2JkRHB5U3RhdGVSZWMsKlhrYktiZERweVN0YXRlUHRyOworCisJLyogWGtiT3BlbkRpc3BsYXkgZXJyb3IgY29kZXMgKi8KKyNkZWZpbmUJWGtiT0RfU3VjY2VzcwkJMAorI2RlZmluZQlYa2JPRF9CYWRMaWJyYXJ5VmVyc2lvbgkxCisjZGVmaW5lCVhrYk9EX0Nvbm5lY3Rpb25SZWZ1c2VkCTIKKyNkZWZpbmUJWGtiT0RfTm9uWGtiU2VydmVyCTMKKyNkZWZpbmUJWGtiT0RfQmFkU2VydmVyVmVyc2lvbgk0CisKKwkvKiBWYWx1ZXMgZm9yIFhsaWJGbGFncyAqLworI2RlZmluZQlYa2JMQ19Gb3JjZUxhdGluMUxvb2t1cAkJKDE8PDApCisjZGVmaW5lCVhrYkxDX0NvbnN1bWVMb29rdXBNb2RzCQkoMTw8MSkKKyNkZWZpbmUJWGtiTENfQWx3YXlzQ29uc3VtZVNoaWZ0QW5kTG9jayAoMTw8MikKKyNkZWZpbmUJWGtiTENfSWdub3JlTmV3S2V5Ym9hcmRzCSgxPDwzKQorI2RlZmluZQlYa2JMQ19Db250cm9sRmFsbGJhY2sJCSgxPDw0KQorI2RlZmluZQlYa2JMQ19Db25zdW1lS2V5c09uQ29tcG9zZUZhaWwJKDE8PDI5KQorI2RlZmluZQlYa2JMQ19Db21wb3NlTEVECQkoMTw8MzApCisjZGVmaW5lCVhrYkxDX0JlZXBPbkNvbXBvc2VGYWlsCQkoMTw8MzEpCisKKyNkZWZpbmUJWGtiTENfQWxsQ29tcG9zZUNvbnRyb2xzCSgweGMwMDAwMDAwKQorI2RlZmluZQlYa2JMQ19BbGxDb250cm9scwkJKDB4YzAwMDAwMWYpCisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuCUJvb2wJWGtiSWdub3JlRXh0ZW5zaW9uKAorCUJvb2wJCQkvKiBpZ25vcmUgKi8KKyk7CisKK2V4dGVybglEaXNwbGF5ICpYa2JPcGVuRGlzcGxheSgKKwljaGFyICoJCQkvKiBuYW1lICovLAorCWludCAqCQkJLyogZXZfcnRybiAqLywKKwlpbnQgKgkJCS8qIGVycl9ydHJuICovLAorCWludCAqCQkJLyogbWFqb3JfcnRybiAqLywKKwlpbnQgKgkJCS8qIG1pbm9yX3J0cm4gKi8sCisJaW50ICoJCQkvKiByZWFzb24gKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlF1ZXJ5RXh0ZW5zaW9uKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCWludCAqCQkJLyogb3Bjb2RlUmV0dXJuICovLAorCWludCAqCQkJLyogZXZlbnRCYXNlUmV0dXJuICovLAorCWludCAqCQkJLyogZXJyb3JCYXNlUmV0dXJuICovLAorCWludCAqCQkJLyogbWFqb3JSdHJuICovLAorCWludCAqCQkJLyogbWlub3JSdHJuICovCispOworCitleHRlcm4JQm9vbAlYa2JVc2VFeHRlbnNpb24oCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJaW50ICoJCQkvKiBtYWpvcl9ydHJuICovLAorCWludCAqCQkJLyogbWlub3JfcnRybiAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiTGlicmFyeVZlcnNpb24oCisJaW50ICoJCQkvKiBsaWJNYWpvclJ0cm4gKi8sCisJaW50ICoJCQkvKiBsaWJNaW5vclJ0cm4gKi8KKyk7CisKK2V4dGVybgl1bnNpZ25lZCBpbnQJWGtiU2V0WGxpYkNvbnRyb2xzKAorCURpc3BsYXkqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBhZmZlY3QgKi8sCisJdW5zaWduZWQgaW50CQkvKiB2YWx1ZXMgKi8KKyk7CisKK2V4dGVybgl1bnNpZ25lZCBpbnQJWGtiR2V0WGxpYkNvbnRyb2xzKAorCURpc3BsYXkqCQkvKiBkcHkgKi8KKyk7CisKK2V4dGVybgl1bnNpZ25lZCBpbnQJWGtiWGxpYkNvbnRyb2xzSW1wbGVtZW50ZWQodm9pZCk7CisKK3R5cGVkZWYJQXRvbQkoKlhrYkludGVybkF0b21GdW5jKSgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlfWGNvbnN0IGNoYXIgKgkJLyogbmFtZSAqLywKKwlCb29sCQkJLyogb25seV9pZl9leGlzdHMgKi8KKyk7CisKK3R5cGVkZWYgY2hhciAqCSgqWGtiR2V0QXRvbU5hbWVGdW5jKSgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlBdG9tCQkJLyogYXRvbSAqLworKTsKKworZXh0ZXJuIHZvaWQJCVhrYlNldEF0b21GdW5jcygKKwlYa2JJbnRlcm5BdG9tRnVuYwkvKiBnZXRBdG9tICovLAorCVhrYkdldEF0b21OYW1lRnVuYwkvKiBnZXROYW1lICovCispOworCitleHRlcm4JS2V5U3ltIFhrYktleWNvZGVUb0tleXN5bSgKKwkJRGlzcGxheSAqCS8qIGRweSAqLywKKyNpZiBOZWVkV2lkZVByb3RvdHlwZXMKKwkJIHVuc2lnbmVkIGludCAJLyoga2MgKi8sCisjZWxzZQorCQkgS2V5Q29kZSAJLyoga2MgKi8sCisjZW5kaWYKKwkJIGludCAJCS8qIGdyb3VwICovLAorCQkgaW50CQkvKiBsZXZlbCAqLworKTsKKworZXh0ZXJuCXVuc2lnbmVkIGludAlYa2JLZXlzeW1Ub01vZGlmaWVycygKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgS2V5U3ltIAkJCS8qIGtzICovCispOworCitleHRlcm4JQm9vbAkJWGtiTG9va3VwS2V5U3ltKAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICBLZXlDb2RlIAkJCS8qIGtleWNvZGUgKi8sCisgICAgdW5zaWduZWQgaW50IAkJLyogbW9kaWZpZXJzICovLAorICAgIHVuc2lnbmVkIGludCAqCQkvKiBtb2RpZmllcnNfcmV0dXJuICovLAorICAgIEtleVN5bSAqCQkJLyoga2V5c3ltX3JldHVybiAqLworKTsKKworZXh0ZXJuCWludAkJWGtiTG9va3VwS2V5QmluZGluZygKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgS2V5U3ltIAkJCS8qIHN5bV9ydHJuICovLAorICAgIHVuc2lnbmVkIGludCAJCS8qIG1vZHMgKi8sCisgICAgY2hhciAqCQkJLyogYnVmZmVyICovLAorICAgIGludCAJCQkvKiBuYnl0ZXMgKi8sCisgICAgaW50ICogCQkJLyogZXh0cmFfcnRybiAqLworKTsKKworZXh0ZXJuCUJvb2wJCVhrYlRyYW5zbGF0ZUtleUNvZGUoCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICBLZXlDb2RlIAkJCS8qIGtleWNvZGUgKi8sCisgICAgdW5zaWduZWQgaW50IAkJLyogbW9kaWZpZXJzICovLAorICAgIHVuc2lnbmVkIGludCAqCQkvKiBtb2RpZmllcnNfcmV0dXJuICovLAorICAgIEtleVN5bSAqCQkJLyoga2V5c3ltX3JldHVybiAqLworKTsKKworZXh0ZXJuCWludAkJWGtiVHJhbnNsYXRlS2V5U3ltKAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICByZWdpc3RlciBLZXlTeW0gKgkJLyogc3ltX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQgCQkvKiBtb2RpZmllcnMgKi8sCisgICAgY2hhciAqCQkJLyogYnVmZmVyICovLAorICAgIGludCAJCQkvKiBuYnl0ZXMgKi8sCisgICAgaW50ICoJCQkvKiBleHRyYV9ydHJuICovCispOworCitleHRlcm4JQm9vbAlYa2JTZXRBdXRvUmVwZWF0UmF0ZSgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBkZWxheSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGludGVydmFsICovCispOworCitleHRlcm4JQm9vbAlYa2JHZXRBdXRvUmVwZWF0UmF0ZSgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50ICoJCS8qIGRlbGF5UnRybiAqLywKKwl1bnNpZ25lZCBpbnQgKgkJLyogaW50ZXJ2YWxSdHJuICovCispOworCitleHRlcm4JQm9vbAlYa2JDaGFuZ2VFbmFibGVkQ29udHJvbHMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludAkJLyogYWZmZWN0ICovLAorCXVuc2lnbmVkIGludAkJLyogdmFsdWVzICovCispOworCitleHRlcm4JQm9vbAlYa2JEZXZpY2VCZWxsKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCVdpbmRvdwkJCS8qIHdpbiAqLywKKwlpbnQJCQkvKiBkZXZpY2VTcGVjICovLAorCWludAkJCS8qIGJlbGxDbGFzcyAqLywKKwlpbnQJCQkvKiBiZWxsSUQgKi8sCisJaW50CQkJLyogcGVyY2VudCAqLywKKwlBdG9tCQkJLyogbmFtZSAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiRm9yY2VEZXZpY2VCZWxsKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCWludAkJCS8qIGRldmljZVNwZWMgKi8sCisJaW50CQkJLyogYmVsbENsYXNzICovLAorCWludAkJCS8qIGJlbGxJRCAqLywKKwlpbnQJCQkvKiBwZXJjZW50ICovCispOworCitleHRlcm4JQm9vbAlYa2JEZXZpY2VCZWxsRXZlbnQoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJV2luZG93CQkJLyogd2luICovLAorCWludAkJCS8qIGRldmljZVNwZWMgKi8sCisJaW50CQkJLyogYmVsbENsYXNzICovLAorCWludAkJCS8qIGJlbGxJRCAqLywKKwlpbnQJCQkvKiBwZXJjZW50ICovLAorCUF0b20JCQkvKiBuYW1lICovCispOworCitleHRlcm4JQm9vbAlYa2JCZWxsKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCVdpbmRvdwkJCS8qIHdpbiAqLywKKwlpbnQJCQkvKiBwZXJjZW50ICovLAorCUF0b20JCQkvKiBuYW1lICovCispOworCitleHRlcm4JQm9vbAlYa2JGb3JjZUJlbGwoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJaW50CQkJLyogcGVyY2VudCAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiQmVsbEV2ZW50KAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCVdpbmRvdwkJCS8qIHdpbiAqLywKKwlpbnQJCQkvKiBwZXJjZW50ICovLAorCUF0b20JCQkvKiBuYW1lICovCispOworCitleHRlcm4JQm9vbAlYa2JTZWxlY3RFdmVudHMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBkZXZpY2VJRCAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBhZmZlY3QgKi8sCisJdW5zaWduZWQgaW50IAkJLyogdmFsdWVzICovCispOworCitleHRlcm4JQm9vbAlYa2JTZWxlY3RFdmVudERldGFpbHMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZGV2aWNlSUQgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZXZlbnRUeXBlICovLAorCXVuc2lnbmVkIGxvbmcgCQkvKiBhZmZlY3QgKi8sCisJdW5zaWduZWQgbG9uZyAJCS8qIGRldGFpbHMgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYk5vdGVNYXBDaGFuZ2VzKAorICAgIFhrYk1hcENoYW5nZXNQdHIJCS8qIG9sZCAqLywKKyAgICBYa2JNYXBOb3RpZnlFdmVudAkqCS8qIG5ldyAqLywKKyAgICB1bnNpZ25lZCBpbnQJIAkvKiB3YW50ZWQgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYk5vdGVOYW1lQ2hhbmdlcygKKyAgICBYa2JOYW1lQ2hhbmdlc1B0cgkJLyogb2xkICovLAorICAgIFhrYk5hbWVzTm90aWZ5RXZlbnQJKgkvKiBuZXcgKi8sCisgICAgdW5zaWduZWQgaW50CSAJLyogd2FudGVkICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldEluZGljYXRvclN0YXRlKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQgKgkJLyogcFN0YXRlUnRybiAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXREZXZpY2VJbmRpY2F0b3JTdGF0ZSgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRDbGFzcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZElEICovLAorCXVuc2lnbmVkIGludCAqCQkvKiBwU3RhdGVSdHJuICovCispOworCitleHRlcm4JU3RhdHVzCSBYa2JHZXRJbmRpY2F0b3JNYXAoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgbG9uZwkJLyogd2hpY2ggKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworZXh0ZXJuCUJvb2wJIFhrYlNldEluZGljYXRvck1hcCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBsb25nIAkJLyogd2hpY2ggKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworI2RlZmluZQlYa2JOb3RlSW5kaWNhdG9yTWFwQ2hhbmdlcyhvLG4sdykgXAorCQkJCSgobyktPm1hcF9jaGFuZ2VzfD0oKG4pLT5tYXBfY2hhbmdlcyYodykpKQorI2RlZmluZQlYa2JOb3RlSW5kaWNhdG9yU3RhdGVDaGFuZ2VzKG8sbix3KVwKKwkJCQkoKG8pLT5zdGF0ZV9jaGFuZ2VzfD0oKG4pLT5zdGF0ZV9jaGFuZ2VzJih3KSkpCisjZGVmaW5lCVhrYkdldEluZGljYXRvck1hcENoYW5nZXMoZCx4LGMpIFwKKwkJCQkoWGtiR2V0SW5kaWNhdG9yTWFwKChkKSwoYyktPm1hcF9jaGFuZ2VzLHgpKQorI2RlZmluZQlYa2JDaGFuZ2VJbmRpY2F0b3JNYXBzKGQseCxjKSBcCisJCQkJKFhrYlNldEluZGljYXRvck1hcCgoZCksKGMpLT5tYXBfY2hhbmdlcyx4KSkKKworZXh0ZXJuCUJvb2wJWGtiR2V0TmFtZWRJbmRpY2F0b3IoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJQXRvbQkJCS8qIG5hbWUgKi8sCisJaW50ICoJCQkvKiBwTmR4UnRybiAqLywKKwlCb29sICoJCQkvKiBwU3RhdGVSdHJuICovLAorCVhrYkluZGljYXRvck1hcFB0cgkvKiBwTWFwUnRybiAqLywKKwlCb29sICoJCQkvKiBwUmVhbFJ0cm4gKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkdldE5hbWVkRGV2aWNlSW5kaWNhdG9yKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZENsYXNzICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkSUQgKi8sCisJQXRvbQkJCS8qIG5hbWUgKi8sCisJaW50ICoJCQkvKiBwTmR4UnRybiAqLywKKwlCb29sICoJCQkvKiBwU3RhdGVSdHJuICovLAorCVhrYkluZGljYXRvck1hcFB0cgkvKiBwTWFwUnRybiAqLywKKwlCb29sICoJCQkvKiBwUmVhbFJ0cm4gKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlNldE5hbWVkSW5kaWNhdG9yKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCUF0b20JCQkvKiBuYW1lICovLAorCUJvb2wJCQkvKiBjaGFuZ2VTdGF0ZSAqLywKKwlCb29sIAkJCS8qIHN0YXRlICovLAorCUJvb2wJCQkvKiBjcmVhdGVOZXdNYXAgKi8sCisJWGtiSW5kaWNhdG9yTWFwUHRyCS8qIHBNYXAgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlNldE5hbWVkRGV2aWNlSW5kaWNhdG9yKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZENsYXNzICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkSUQgKi8sCisJQXRvbQkJCS8qIG5hbWUgKi8sCisJQm9vbAkJCS8qIGNoYW5nZVN0YXRlICovLAorCUJvb2wgCQkJLyogc3RhdGUgKi8sCisJQm9vbAkJCS8qIGNyZWF0ZU5ld01hcCAqLywKKwlYa2JJbmRpY2F0b3JNYXBQdHIJLyogcE1hcCAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiTG9ja01vZGlmaWVycygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludCAJCS8qIGFmZmVjdCAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiB2YWx1ZXMgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkxhdGNoTW9kaWZpZXJzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50IAkJLyogYWZmZWN0ICovLAorCXVuc2lnbmVkIGludCAJCS8qIHZhbHVlcyAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiTG9ja0dyb3VwKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZ3JvdXAgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkxhdGNoR3JvdXAoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBncm91cCAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2V0U2VydmVySW50ZXJuYWxNb2RzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50IAkJLyogYWZmZWN0UmVhbCAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiByZWFsVmFsdWVzICovLAorCXVuc2lnbmVkIGludAkJLyogYWZmZWN0VmlydHVhbCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHZpcnR1YWxWYWx1ZXMgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlNldElnbm9yZUxvY2tNb2RzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50IAkJLyogYWZmZWN0UmVhbCAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiByZWFsVmFsdWVzICovLAorCXVuc2lnbmVkIGludAkJLyogYWZmZWN0VmlydHVhbCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHZpcnR1YWxWYWx1ZXMgKi8KKyk7CisKKworZXh0ZXJuCUJvb2wJWGtiVmlydHVhbE1vZHNUb1JlYWwoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogdmlydHVhbF9tYXNrICovLAorCXVuc2lnbmVkIGludCAqCQkvKiBtYXNrX3J0cm4gKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkNvbXB1dGVFZmZlY3RpdmVNYXAoCisJWGtiRGVzY1B0ciAJCS8qIHhrYiAqLywKKwlYa2JLZXlUeXBlUHRyCQkvKiB0eXBlICovLAorCXVuc2lnbmVkIGNoYXIgKgkJLyogbWFwX3J0cm4gKi8KKyk7CisKK2V4dGVybglTdGF0dXMgWGtiSW5pdENhbm9uaWNhbEtleVR5cGVzKAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKyAgICBpbnQJCQkJLyoga2V5cGFkVk1vZCAqLworKTsKKworZXh0ZXJuCVhrYkRlc2NQdHIgWGtiQWxsb2NLZXlib2FyZCgKKwl2b2lkCispOworCitleHRlcm4Jdm9pZAlYa2JGcmVlS2V5Ym9hcmQoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJQm9vbAkJCS8qIGZyZWVEZXNjICovCispOworCitleHRlcm4JU3RhdHVzIFhrYkFsbG9jQ2xpZW50TWFwKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCXVuc2lnbmVkIGludAkJLyogblR5cGVzICovCispOworCitleHRlcm4JU3RhdHVzIFhrYkFsbG9jU2VydmVyTWFwKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCXVuc2lnbmVkIGludAkJLyogbkFjdGlvbnMgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYkZyZWVDbGllbnRNYXAoCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIHdoYXQgKi8sCisgICAgQm9vbAkJCS8qIGZyZWVNYXAgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYkZyZWVTZXJ2ZXJNYXAoCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIHdoYXQgKi8sCisgICAgQm9vbAkJCS8qIGZyZWVNYXAgKi8KKyk7CisKK2V4dGVybglYa2JLZXlUeXBlUHRyCVhrYkFkZEtleVR5cGUoCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICBBdG9tCQkJLyogbmFtZSAqLywKKyAgICBpbnQJCQkJLyogbWFwX2NvdW50ICovLAorICAgIEJvb2wJCQkvKiB3YW50X3ByZXNlcnZlICovLAorICAgIGludAkJCQkvKiBudW1fbHZscyAqLworKTsKKworZXh0ZXJuCVN0YXR1cyBYa2JBbGxvY0luZGljYXRvck1hcHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovCispOworCitleHRlcm4Jdm9pZCBYa2JGcmVlSW5kaWNhdG9yTWFwcygKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovCispOworCitleHRlcm4JWGtiRGVzY1B0ciBYa2JHZXRNYXAoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogd2hpY2ggKi8sCisJdW5zaWduZWQgaW50IAkJLyogZGV2aWNlU3BlYyAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXRVcGRhdGVkTWFwKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIHdoaWNoICovLAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0TWFwQ2hhbmdlcygKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICBYa2JNYXBDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovCispOworCisKK2V4dGVybglTdGF0dXMJWGtiUmVmcmVzaEtleWJvYXJkTWFwcGluZygKKyAgICBYa2JNYXBOb3RpZnlFdmVudCAqCQkvKiBldmVudCAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXRLZXlUeXBlcygKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBmaXJzdCAqLywKKyAgICB1bnNpZ25lZCBpbnQgCQkvKiBudW0gKi8sCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXRLZXlTeW1zKAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGZpcnN0ICovLAorICAgIHVuc2lnbmVkIGludAkJLyogbnVtICovLAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0S2V5QWN0aW9ucygKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgdW5zaWduZWQgaW50IAkJLyogZmlyc3QgKi8sCisgICAgdW5zaWduZWQgaW50IAkJLyogbnVtICovLAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0S2V5QmVoYXZpb3JzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIGZpcnN0S2V5ICovLAorCXVuc2lnbmVkIGludAkJLyogbktleXMgKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXRWaXJ0dWFsTW9kcygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiB3aGljaCAqLywKKwlYa2JEZXNjUHRyCQkvKiBkZXNjICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldEtleUV4cGxpY2l0Q29tcG9uZW50cygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBmaXJzdEtleSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5LZXlzICovLAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0S2V5TW9kaWZpZXJNYXAoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZmlyc3RLZXkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBuS2V5cyAqLywKKwlYa2JEZXNjUHRyCQkvKiBkZXNjICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldEtleVZpcnR1YWxNb2RNYXAoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBmaXJzdCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG51bSAqLywKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiQWxsb2NDb250cm9scygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCovCispOworCitleHRlcm4Jdm9pZAlYa2JGcmVlQ29udHJvbHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJQm9vbAkJCS8qIGZyZWVNYXAgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0Q29udHJvbHMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgbG9uZwkJLyogd2hpY2ggKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2V0Q29udHJvbHMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgbG9uZwkJLyogd2hpY2ggKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworZXh0ZXJuCXZvaWQJWGtiTm90ZUNvbnRyb2xzQ2hhbmdlcygKKyAgICBYa2JDb250cm9sc0NoYW5nZXNQdHIJLyogb2xkICovLAorICAgIFhrYkNvbnRyb2xzTm90aWZ5RXZlbnQgKgkvKiBuZXcgKi8sCisgICAgdW5zaWduZWQgaW50CSAJLyogd2FudGVkICovCispOworCisjZGVmaW5lCVhrYkdldENvbnRyb2xzQ2hhbmdlcyhkLHgsYykJWGtiR2V0Q29udHJvbHMoZCwoYyktPmNoYW5nZWRfY3RybHMseCkKKyNkZWZpbmUJWGtiQ2hhbmdlQ29udHJvbHMoZCx4LGMpCVhrYlNldENvbnRyb2xzKGQsKGMpLT5jaGFuZ2VkX2N0cmxzLHgpCisKK2V4dGVybglTdGF0dXMJWGtiQWxsb2NDb21wYXRNYXAoCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorICAgIHVuc2lnbmVkIGludAkJLyogbkludGVycHJldCAqLworKTsKKworZXh0ZXJuCXZvaWQJWGtiRnJlZUNvbXBhdE1hcCgKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisgICAgQm9vbAkJCS8qIGZyZWVNYXAgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGtiR2V0Q29tcGF0TWFwKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIHdoaWNoICovLAorCVhrYkRlc2NQdHIgCQkvKiB4a2IgKi8KKyk7CisKK2V4dGVybiBCb29sIFhrYlNldENvbXBhdE1hcCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiB3aGljaCAqLywKKwlYa2JEZXNjUHRyIAkJLyogeGtiICovLAorCUJvb2wJCQkvKiB1cGRhdGVBY3Rpb25zICovCispOworCitleHRlcm4JWGtiU3ltSW50ZXJwcmV0UHRyIFhrYkFkZFN5bUludGVycHJldCgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJWGtiU3ltSW50ZXJwcmV0UHRyCS8qIHNpICovLAorCUJvb2wJCQkvKiB1cGRhdGVNYXAgKi8sCisJWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuCVN0YXR1cyBYa2JBbGxvY05hbWVzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCWludAkJCS8qIG5Ub3RhbFJHICovLAorCWludAkJCS8qIG5Ub3RhbEFsaWFzZXMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0TmFtZXMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlYa2JEZXNjUHRyCQkvKiBkZXNjICovCispOworCitleHRlcm4JQm9vbAlYa2JTZXROYW1lcygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCXVuc2lnbmVkIGludAkJLyogZmlyc3RUeXBlICovLAorCXVuc2lnbmVkIGludAkJLyogblR5cGVzICovLAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkNoYW5nZU5hbWVzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlYa2JOYW1lQ2hhbmdlc1B0cgkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4Jdm9pZCBYa2JGcmVlTmFtZXMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJQm9vbAkJCS8qIGZyZWVNYXAgKi8KKyk7CisKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXRTdGF0ZSgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBkZXZpY2VTcGVjICovLAorCVhrYlN0YXRlUHRyCQkvKiBydHJuU3RhdGUgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlNldE1hcCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkNoYW5nZU1hcCgKKwlEaXNwbGF5KgkJLyogZHB5ICovLAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8sCisJWGtiTWFwQ2hhbmdlc1B0cgkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4JQm9vbAlYa2JTZXREZXRlY3RhYmxlQXV0b1JlcGVhdCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlCb29sCQkJLyogZGV0ZWN0YWJsZSAqLywKKwlCb29sICoJCQkvKiBzdXBwb3J0ZWQgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkdldERldGVjdGFibGVBdXRvUmVwZWF0KAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCUJvb2wgKgkJCS8qIHN1cHBvcnRlZCAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2V0QXV0b1Jlc2V0Q29udHJvbHMoCisgICAgRGlzcGxheSAqCQkJLyogZHB5ICovLAorICAgIHVuc2lnbmVkIGludCAJCS8qIGNoYW5nZXMgKi8sCisgICAgdW5zaWduZWQgaW50ICoJCS8qIGF1dG9fY3RybHMgKi8sCisgICAgdW5zaWduZWQgaW50ICoJCS8qIGF1dG9fdmFsdWVzICovCispOworCitleHRlcm4JQm9vbAlYa2JHZXRBdXRvUmVzZXRDb250cm9scygKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgdW5zaWduZWQgaW50ICoJCS8qIGF1dG9fY3RybHMgKi8sCisgICAgdW5zaWduZWQgaW50ICoJCS8qIGF1dG9fY3RybF92YWx1ZXMgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlNldFBlckNsaWVudENvbnRyb2xzKAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGNoYW5nZSAqLywKKyAgICB1bnNpZ25lZCBpbnQgKgkJLyogdmFsdWVzICovCispOworCitleHRlcm4JQm9vbAlYa2JHZXRQZXJDbGllbnRDb250cm9scygKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgdW5zaWduZWQgaW50ICoJCS8qIGN0cmxzICovCispOworCitleHRlcm4gU3RhdHVzIFhrYkNvcHlLZXlUeXBlKAorICAgIFhrYktleVR5cGVQdHIJLyogZnJvbSAqLywKKyAgICBYa2JLZXlUeXBlUHRyCS8qIGludG8gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGtiQ29weUtleVR5cGVzKAorICAgIFhrYktleVR5cGVQdHIJLyogZnJvbSAqLywKKyAgICBYa2JLZXlUeXBlUHRyCS8qIGludG8gKi8sCisgICAgaW50CQkJLyogbnVtX3R5cGVzICovCispOworCitleHRlcm4JU3RhdHVzCVhrYlJlc2l6ZUtleVR5cGUoCisgICAgWGtiRGVzY1B0cgkJLyogeGtiICovLAorICAgIGludAkJCS8qIHR5cGVfbmR4ICovLAorICAgIGludAkJCS8qIG1hcF9jb3VudCAqLywKKyAgICBCb29sCQkvKiB3YW50X3ByZXNlcnZlICovLAorICAgIGludAkJCS8qIG5ld19udW1fbHZscyAqLworKTsKKworZXh0ZXJuCUtleVN5bSAqWGtiUmVzaXplS2V5U3ltcygKKwlYa2JEZXNjUHRyCQkvKiBkZXNjICovLAorCWludCAJCQkvKiBmb3JLZXkgKi8sCisJaW50IAkJCS8qIHN5bXNOZWVkZWQgKi8KKyk7CisKK2V4dGVybglYa2JBY3Rpb24gKlhrYlJlc2l6ZUtleUFjdGlvbnMoCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLywKKwlpbnQgCQkJLyogZm9yS2V5ICovLAorCWludCAJCQkvKiBhY3RzTmVlZGVkICovCispOworCitleHRlcm4JU3RhdHVzIFhrYkNoYW5nZVR5cGVzT2ZLZXkoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCWludCAJCQkvKiBrZXkgKi8sCisJaW50CQkJLyogbnVtX2dyb3VwcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGdyb3VwcyAqLywKKwlpbnQgKgkJCS8qIG5ld1R5cGVzICovLAorCVhrYk1hcENoYW5nZXNQdHIJLyogcENoYW5nZXMgKi8KKyk7CisKK2V4dGVybiAgU3RhdHVzICAgWGtiQ2hhbmdlS2V5Y29kZVJhbmdlKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlpbnQJCQkvKiBtaW5LQyAqLywKKwlpbnQJCQkvKiBtYXhLQyAqLywKKwlYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovCispOworCisvKioqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qKiovCisKK2V4dGVybglYa2JDb21wb25lbnRMaXN0UHRyCVhrYkxpc3RDb21wb25lbnRzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludAkJLyogZGV2aWNlU3BlYyAqLywKKwlYa2JDb21wb25lbnROYW1lc1B0cgkvKiBwdHJucyAqLywKKwlpbnQgKgkJCS8qIG1heF9pbm91dCAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiRnJlZUNvbXBvbmVudExpc3QoCisJWGtiQ29tcG9uZW50TGlzdFB0cgkvKiBsaXN0ICovCispOworCitleHRlcm4JWGtiRGVzY1B0ciBYa2JHZXRLZXlib2FyZCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiB3aGljaCAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBkZXZpY2VTcGVjICovCispOworCitleHRlcm4gWGtiRGVzY1B0ciBYa2JHZXRLZXlib2FyZEJ5TmFtZSgKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBkZXZpY2VTcGVjICovLAorICAgIFhrYkNvbXBvbmVudE5hbWVzUHRyCS8qIG5hbWVzICovLAorICAgIHVuc2lnbmVkIGludCAJCS8qIHdhbnQgKi8sCisgICAgdW5zaWduZWQgaW50IAkJLyogbmVlZCAqLywKKyAgICBCb29sCQkJLyogbG9hZCAqLworKTsKKworLyoqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KioqLworCitleHRlcm4JaW50CVhrYktleVR5cGVzRm9yQ29yZVN5bWJvbHMoCS8qIHJldHVybnMgIyBvZiBncm91cHMgKi8KKyAgICBYa2JEZXNjUHRyCS8qIHhrYiAqLywJCQkvKiBrZXlib2FyZCBkZXZpY2UgKi8KKyAgICBpbnQJCS8qIG1hcF93aWR0aCAqLywJCS8qIHdpZHRoIG9mIGNvcmUgS2V5U3ltIGFycmF5ICovCisgICAgS2V5U3ltICoJLyogY29yZV9zeW1zICovLAkJLyogYWx3YXlzIG1hcFdpZHRoIHN5bWJvbHMgKi8KKyAgICB1bnNpZ25lZCBpbnQJLyogcHJvdGVjdGVkICovLAkvKiBleHBsaWNpdCBrZXkgdHlwZXMgKi8KKyAgICBpbnQgKgkvKiB0eXBlc19pbm91dCAqLywJCS8qIGFsd2F5cyBmb3VyIHR5cGUgaW5kaWNlcyAqLworICAgIEtleVN5bSAqIAkvKiB4a2Jfc3ltc19ydHJuICovCQkvKiBtdXN0IGhhdmUgZW5vdWdoIHNwYWNlICovCispOworCitleHRlcm4JQm9vbAlYa2JBcHBseUNvbXBhdE1hcFRvS2V5KAkvKiBGYWxzZSBvbmx5IG9uIGVycm9yICovCisgICAgWGtiRGVzY1B0cgkJLyogeGtiICovLAkJLyoga2V5bWFwIHRvIGJlIGVkaXRlZCAqLworICAgIEtleUNvZGUJCS8qIGtleSAqLywJCS8qIGtleSB0byBiZSB1cGRhdGVkICovCisgICAgWGtiQ2hhbmdlc1B0cgkvKiBjaGFuZ2VzICovCQkvKiByZXN1bHRpbmcgY2hhbmdlcyB0byBtYXAgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlVwZGF0ZU1hcEZyb21Db3JlKCAvKiBGYWxzZSBvbmx5IG9uIGVycm9yICovCisgICAgWGtiRGVzY1B0cgkJLyogeGtiICovLAkJLyogWEtCIGtleWJvYXJkIHRvIGJlIGVkaXRlZCAqLworICAgIEtleUNvZGUJCS8qIGZpcnN0X2tleSAqLywJLyogZmlyc3QgY2hhbmdlZCBrZXkgKi8KKyAgICBpbnQJCQkvKiBudW1fa2V5cyAqLywgCS8qIG51bWJlciBvZiBjaGFuZ2VkIGtleXMgKi8KKyAgICBpbnQJCQkvKiBtYXBfd2lkdGggKi8sCS8qIHdpZHRoIG9mIGNvcmUga2V5bWFwICovCisgICAgS2V5U3ltICoJCS8qIGNvcmVfa2V5c3ltcyAqLywJLyogc3ltYm9scyBmcm9tIGNvcmUga2V5bWFwICovCisgICAgWGtiQ2hhbmdlc1B0cgkvKiBjaGFuZ2VzICovCQkvKiByZXN1bHRpbmcgY2hhbmdlcyAqLworKTsKKworLyoqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KioqLworCitleHRlcm4JWGtiRGV2aWNlTGVkSW5mb1B0cglYa2JBZGREZXZpY2VMZWRJbmZvKAorCVhrYkRldmljZUluZm9QdHIJLyogZGV2aSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZENsYXNzICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkSWQgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJCQlYa2JSZXNpemVEZXZpY2VCdXR0b25BY3Rpb25zKAorCVhrYkRldmljZUluZm9QdHIJLyogZGV2aSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5ld1RvdGFsICovCispOworCitleHRlcm4JWGtiRGV2aWNlSW5mb1B0cglYa2JBbGxvY0RldmljZUluZm8oCisJdW5zaWduZWQgaW50CQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludAkJLyogbkJ1dHRvbnMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBzekxlZHMgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYkZyZWVEZXZpY2VJbmZvKAorCVhrYkRldmljZUluZm9QdHIJLyogZGV2aSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCUJvb2wJCQkvKiBmcmVlRGV2SSAqLworKTsKKworZXh0ZXJuCXZvaWQJWGtiTm90ZURldmljZUNoYW5nZXMoCisgICAgWGtiRGV2aWNlQ2hhbmdlc1B0cgkJCS8qIG9sZCAqLywKKyAgICBYa2JFeHRlbnNpb25EZXZpY2VOb3RpZnlFdmVudCAqCS8qIG5ldyAqLywKKyAgICB1bnNpZ25lZCBpbnQJIAkJLyogd2FudGVkICovCispOworCitleHRlcm4JWGtiRGV2aWNlSW5mb1B0ciBYa2JHZXREZXZpY2VJbmZvKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIHdoaWNoICovLAorCXVuc2lnbmVkIGludAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZENsYXNzICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkSUQgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0RGV2aWNlSW5mb0NoYW5nZXMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJWGtiRGV2aWNlSW5mb1B0cgkvKiBkZXZpICovLAorCVhrYkRldmljZUNoYW5nZXNQdHIgCS8qIGNoYW5nZXMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0RGV2aWNlQnV0dG9uQWN0aW9ucygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlYa2JEZXZpY2VJbmZvUHRyCS8qIGRldmkgKi8sCisJQm9vbAkJCS8qIGFsbCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGZpcnN0ICovLAorCXVuc2lnbmVkIGludAkJLyogbkJ0bnMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0RGV2aWNlTGVkSW5mbygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlYa2JEZXZpY2VJbmZvUHRyCS8qIGRldmkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRDbGFzcyAoY2xhc3MsIFhJRGZsdCwgWElBbGwpICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkSWQgKGlkLCBYSURmbHQsIFhJQWxsKSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoIChYa2JYSV9JbmRpY2F0b3J7TmFtZXMsTWFwfU1hc2sgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlNldERldmljZUluZm8oCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlYa2JEZXZpY2VJbmZvUHRyCS8qIGRldmkgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkNoYW5nZURldmljZUluZm8oCisJRGlzcGxheSoJCS8qIGRweSAqLywKKwlYa2JEZXZpY2VJbmZvUHRyCS8qIGRlc2MgKi8sCisJWGtiRGV2aWNlQ2hhbmdlc1B0cgkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4gIEJvb2wgWGtiU2V0RGV2aWNlTGVkSW5mbygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlYa2JEZXZpY2VJbmZvUHRyCS8qIGRldmkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogbGVkQ2xhc3MgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRJRCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovCispOworCitleHRlcm4JQm9vbCBYa2JTZXREZXZpY2VCdXR0b25BY3Rpb25zKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCVhrYkRldmljZUluZm9QdHIJLyogZGV2aSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGZpcnN0ICovLAorCXVuc2lnbmVkIGludAkJLyogbkJ0bnMgKi8KKyk7CisKKy8qKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoqKi8KKworZXh0ZXJuCWNoYXIJWGtiVG9Db250cm9sKAorCWNoYXIJCS8qIGMgKi8KKyk7CisKKy8qKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoqKi8KKworZXh0ZXJuCUJvb2wgWGtiU2V0RGVidWdnaW5nRmxhZ3MoCisgICAgRGlzcGxheSAqCQkvKiBkcHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG1hc2sgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGZsYWdzICovLAorICAgIGNoYXIgKgkJLyogbXNnICovLAorICAgIHVuc2lnbmVkIGludAkvKiBjdHJsc19tYXNrICovLAorICAgIHVuc2lnbmVkIGludAkvKiBjdHJscyAqLywKKyAgICB1bnNpZ25lZCBpbnQgKgkvKiBydHJuX2ZsYWdzICovLAorICAgIHVuc2lnbmVkIGludCAqCS8qIHJ0cm5fY3RybHMgKi8KKyk7CisKK2V4dGVybglCb29sIFhrYkFwcGx5VmlydHVhbE1vZENoYW5nZXMoCisgICBYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisgICB1bnNpZ25lZCBpbnQJCS8qIGNoYW5nZWQgKi8sCisgICBYa2JDaGFuZ2VzUHRyCS8qIGNoYW5nZXMgKi8KKyk7CisKK2V4dGVybiBCb29sIFhrYlVwZGF0ZUFjdGlvblZpcnR1YWxNb2RzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlYa2JBY3Rpb24gKgkJLyogYWN0ICovLAorCXVuc2lnbmVkIGludAkJLyogY2hhbmdlZCAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiVXBkYXRlS2V5VHlwZVZpcnR1YWxNb2RzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlYa2JLZXlUeXBlUHRyCQkvKiB0eXBlICovLAorCXVuc2lnbmVkIGludAkJLyogY2hhbmdlZCAqLywKKwlYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX1gxMV9YS0JMSUJfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hXREZpbGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hXREZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGUxN2RmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWFdERmlsZS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorCitDb3B5cmlnaHQgMTk4NSwgMTk4NiwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworLyoKKyAqIFhXREZpbGUuaAlNSVQgUHJvamVjdCBBdGhlbmEsIFggV2luZG93IHN5c3RlbSB3aW5kb3cgcmFzdGVyCisgKgkJaW1hZ2UgZHVtcGVyLCBkdW1wIGZpbGUgZm9ybWF0IGhlYWRlciBmaWxlLgorICoKKyAqICBBdXRob3I6CVRvbnkgRGVsbGEgRmVyYSwgREVDCisgKgkJMjctSnVuLTg1CisgKiAKKyAqIE1vZGlmaWVyOiAgICBXaWxsaWFtIEYuIFd5YXR0LCBTQU8KKyAqICAgICAgICAgICAgICAxOC1Ob3YtODYgIC0gdmVyc2lvbiA2IGZvciBzYXZpbmcvcmVzdG9yaW5nIGNvbG9yIG1hcHMKKyAqLworCisjaWZuZGVmIFhXREZJTEVfSAorI2RlZmluZSBYV0RGSUxFX0gKKworI2luY2x1ZGUgPFgxMS9YbWQuaD4KKworI2RlZmluZSBYV0RfRklMRV9WRVJTSU9OIDcKKyNkZWZpbmUgc3pfWFdEaGVhZGVyIDEwMAorI2RlZmluZSBzel9YV0RDb2xvciAxMgorCit0eXBlZGVmIENBUkQzMiB4d2R2YWw7CQkvKiBmb3Igb2xkIGJyb2tlbiBwcm9ncmFtcyAqLworCisvKiBWYWx1ZXMgaW4gdGhlIGZpbGUgYXJlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdC4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3h3ZF9maWxlX2hlYWRlciB7CisJLyogaGVhZGVyX3NpemUgPSBTSVpFT0YoWFdEaGVhZGVyKSArIGxlbmd0aCBvZiBudWxsLXRlcm1pbmF0ZWQKKwkgKiB3aW5kb3cgbmFtZS4gKi8KKwlDQVJEMzIgaGVhZGVyX3NpemUgQjMyOwkJCisKKwlDQVJEMzIgZmlsZV92ZXJzaW9uIEIzMjsJLyogPSBYV0RfRklMRV9WRVJTSU9OIGFib3ZlICovCisJQ0FSRDMyIHBpeG1hcF9mb3JtYXQgQjMyOwkvKiBaUGl4bWFwIG9yIFhZUGl4bWFwICovCisJQ0FSRDMyIHBpeG1hcF9kZXB0aCBCMzI7CS8qIFBpeG1hcCBkZXB0aCAqLworCUNBUkQzMiBwaXhtYXBfd2lkdGggQjMyOwkvKiBQaXhtYXAgd2lkdGggKi8KKwlDQVJEMzIgcGl4bWFwX2hlaWdodCBCMzI7CS8qIFBpeG1hcCBoZWlnaHQgKi8KKwlDQVJEMzIgeG9mZnNldCBCMzI7CQkvKiBCaXRtYXAgeCBvZmZzZXQsIG5vcm1hbGx5IDAgKi8KKwlDQVJEMzIgYnl0ZV9vcmRlciBCMzI7CQkvKiBvZiBpbWFnZSBkYXRhOiBNU0JGaXJzdCwgTFNCRmlyc3QgKi8KKworCS8qIGJpdG1hcF91bml0IGFwcGxpZXMgdG8gYml0bWFwcyAoZGVwdGggMSBmb3JtYXQgWFkpIG9ubHkuCisJICogSXQgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQgZWFjaCBzY2FubGluZSBpcyBwYWRkZWQgdG8uICovCisJQ0FSRDMyIGJpdG1hcF91bml0IEIzMjsJCQorCisJQ0FSRDMyIGJpdG1hcF9iaXRfb3JkZXIgQjMyOwkvKiBiaXRtYXBzIG9ubHk6IE1TQkZpcnN0LCBMU0JGaXJzdCAqLworCisJLyogYml0bWFwX3BhZCBhcHBsaWVzIHRvIHBpeG1hcHMgKG5vbi1iaXRtYXBzKSBvbmx5LgorCSAqIEl0IGlzIHRoZSBudW1iZXIgb2YgYml0cyB0aGF0IGVhY2ggc2NhbmxpbmUgaXMgcGFkZGVkIHRvLiAqLworCUNBUkQzMiBiaXRtYXBfcGFkIEIzMjsJCQorCisJQ0FSRDMyIGJpdHNfcGVyX3BpeGVsIEIzMjsJLyogQml0cyBwZXIgcGl4ZWwgKi8KKworCS8qIGJ5dGVzX3Blcl9saW5lIGlzIHBpeG1hcF93aWR0aCBwYWRkZWQgdG8gYml0bWFwX3VuaXQgKGJpdG1hcHMpCisJICogb3IgYml0bWFwX3BhZCAocGl4bWFwcykuICBJdCBpcyB0aGUgZGVsdGEgKGluIGJ5dGVzKSB0byBnZXQKKwkgKiB0byB0aGUgc2FtZSB4IHBvc2l0aW9uIG9uIGFuIGFkamFjZW50IHJvdy4gKi8KKwlDQVJEMzIgYnl0ZXNfcGVyX2xpbmUgQjMyOworCUNBUkQzMiB2aXN1YWxfY2xhc3MgQjMyOwkvKiBDbGFzcyBvZiBjb2xvcm1hcCAqLworCUNBUkQzMiByZWRfbWFzayBCMzI7CQkvKiBaIHJlZCBtYXNrICovCisJQ0FSRDMyIGdyZWVuX21hc2sgQjMyOwkJLyogWiBncmVlbiBtYXNrICovCisJQ0FSRDMyIGJsdWVfbWFzayBCMzI7CQkvKiBaIGJsdWUgbWFzayAqLworCUNBUkQzMiBiaXRzX3Blcl9yZ2IgQjMyOwkvKiBMb2cyIG9mIGRpc3RpbmN0IGNvbG9yIHZhbHVlcyAqLworCUNBUkQzMiBjb2xvcm1hcF9lbnRyaWVzIEIzMjsJLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gY29sb3JtYXA7IG5vdCB1c2VkPyAqLworCUNBUkQzMiBuY29sb3JzIEIzMjsJCS8qIE51bWJlciBvZiBYV0RDb2xvciBzdHJ1Y3R1cmVzICovCisJQ0FSRDMyIHdpbmRvd193aWR0aCBCMzI7CS8qIFdpbmRvdyB3aWR0aCAqLworCUNBUkQzMiB3aW5kb3dfaGVpZ2h0IEIzMjsJLyogV2luZG93IGhlaWdodCAqLworCUNBUkQzMiB3aW5kb3dfeCBCMzI7CQkvKiBXaW5kb3cgdXBwZXIgbGVmdCBYIGNvb3JkaW5hdGUgKi8KKwlDQVJEMzIgd2luZG93X3kgQjMyOwkJLyogV2luZG93IHVwcGVyIGxlZnQgWSBjb29yZGluYXRlICovCisJQ0FSRDMyIHdpbmRvd19iZHJ3aWR0aCBCMzI7CS8qIFdpbmRvdyBib3JkZXIgd2lkdGggKi8KK30gWFdERmlsZUhlYWRlcjsKKworLyogTnVsbC10ZXJtaW5hdGVkIHdpbmRvdyBuYW1lIGZvbGxvd3MgdGhlIGFib3ZlIHN0cnVjdHVyZS4gKi8KKworLyogTmV4dCBjb21lcyBYV0RDb2xvciBzdHJ1Y3R1cmVzLCBhdCBvZmZzZXQgWFdERmlsZUhlYWRlci5oZWFkZXJfc2l6ZSBpbgorICogdGhlIGZpbGUuICBYV0RGaWxlSGVhZGVyLm5jb2xvcnMgdGVsbHMgaG93IG1hbnkgWFdEQ29sb3Igc3RydWN0dXJlcworICogdGhlcmUgYXJlLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgQ0FSRDMyCXBpeGVsIEIzMjsKKyAgICAgICAgQ0FSRDE2CXJlZCBCMTY7CisJQ0FSRDE2CWdyZWVuIEIxNjsKKwlDQVJEMTYJYmx1ZSBCMTY7CisgICAgICAgIENBUkQ4CWZsYWdzOworICAgICAgICBDQVJEOAlwYWQ7Cit9IFhXRENvbG9yOworCisvKiBMYXN0IGNvbWVzIHRoZSBpbWFnZSBkYXRhIGluIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGJ5IFhXREZpbGVIZWFkZXIuICovCisKKyNlbmRpZiAvKiBYV0RGSUxFX0ggKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGFsbG9jYS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGFsbG9jYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MTk4ODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YYWxsb2NhLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisKK0NvcHlyaWdodCAxOTk1LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKy8qCisgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGhlYWRlciBpcyB0byBkZWZpbmUgdGhlIG1hY3JvcyBBTExPQ0FURV9MT0NBTCBhbmQKKyAqIERFQUxMT0NBVEVfTE9DQUwgYXBwcm9wcmlhdGVseSBmb3IgdGhlIHBsYXRmb3JtIGJlaW5nIGNvbXBpbGVkIG9uLgorICogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIHRvIG1ha2UgZmFzdCwgZnVuY3Rpb24tbG9jYWwgbWVtb3J5IGFsbG9jYXRpb25zLgorICogVGhlaXIgY2hhcmFjdGVyaXN0aWNzIGFyZSBhcyBmb2xsb3dzOgorICoKKyAqIHZvaWQgKkFMTE9DQVRFX0xPQ0FMKGludCBzaXplKQorICogICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gc2l6ZSBieXRlcyBvZiBtZW1vcnksIG9yIE5VTEwgaWYgdGhlIGFsbG9jYXRpb24KKyAqICAgIGZhaWxlZC4gIFRoZSBtZW1vcnkgbXVzdCBiZSBmcmVlZCB3aXRoIERFQUxMT0NBVEVfTE9DQUwgYmVmb3JlIHRoZQorICogICAgZnVuY3Rpb24gdGhhdCBtYWRlIHRoZSBhbGxvY2F0aW9uIHJldHVybnMuICBZb3Ugc2hvdWxkIG5vdCBhc2sgZm9yCisgKiAgICBsYXJnZSBibG9ja3Mgb2YgbWVtb3J5IHdpdGggdGhpcyBmdW5jdGlvbiwgc2luY2Ugb24gbWFueSBwbGF0Zm9ybXMKKyAqICAgIHRoZSBtZW1vcnkgY29tZXMgZnJvbSB0aGUgc3RhY2ssIHdoaWNoIG1heSBoYXZlIGxpbWl0ZWQgc2l6ZS4KKyAqCisgKiB2b2lkIERFQUxMT0NBVEVfTE9DQUwodm9pZCAqKQorICogICAgRnJlZXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgQUxMT0NBVEVfTE9DQUwuICBPbWlzc2lvbiBvZiB0aGlzCisgKiAgICBzdGVwIG1heSBiZSBoYXJtbGVzcyBvbiBzb21lIHBsYXRmb3JtcywgYnV0IHdpbGwgcmVzdWx0IGluCisgKiAgICBtZW1vcnkgbGVha3Mgb3Igd29yc2Ugb24gb3RoZXJzLgorICoKKyAqIEJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlLCB5b3Ugc2hvdWxkIGRlZmluZSB0d28gbWFjcm9zLAorICogQUxMT0NBVEVfTE9DQUxfRkFMTEJBQ0sgYW5kIERFQUxMT0NBVEVfTE9DQUxfRkFMTEJBQ0ssIHRoYXQgaGF2ZSB0aGUKKyAqIHNhbWUgY2hhcmFjdGVyaXN0aWNzIGFzIEFMTE9DQVRFX0xPQ0FMIGFuZCBERUFMTE9DQVRFX0xPQ0FMLiAgVGhlCisgKiBoZWFkZXIgdXNlcyB0aGUgZmFsbGJhY2tzIGlmIGl0IGRvZXNuJ3Qga25vdyBhICJiZXR0ZXIiIHdheSB0byBkZWZpbmUKKyAqIEFMTE9DQVRFX0xPQ0FMIGFuZCBERUFMTE9DQVRFX0xPQ0FMLiAgVHlwaWNhbCB1c2FnZSB3b3VsZCBiZToKKyAqCisgKiAgICAjZGVmaW5lIEFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLKF9zaXplKSBtYWxsb2MoX3NpemUpCisgKiAgICAjZGVmaW5lIERFQUxMT0NBVEVfTE9DQUxfRkFMTEJBQ0soX3B0cikgZnJlZShfcHRyKQorICogICAgI2luY2x1ZGUgIlhhbGxvY2EuaCIKKyAqLworCisjaWZuZGVmIFhBTExPQ0FfSAorI2RlZmluZSBYQUxMT0NBX0ggMQorCisjaWZuZGVmIElOQ0xVREVfQUxMT0NBX0gKKy8qIE5lZWQgdG8gYWRkIG1vcmUgaGVyZSB0byBtYXRjaCBJbWFrZSAqLmNmJ3MgKi8KKyMgaWYgZGVmaW5lZChIQVZFX0FMTE9DQV9IKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0MpIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCisjICBkZWZpbmUgSU5DTFVERV9BTExPQ0FfSAorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBJTkNMVURFX0FMTE9DQV9ICisjICBpbmNsdWRlIDxhbGxvY2EuaD4KKyNlbmRpZgorCisjaWZuZGVmIE5PX0FMTE9DQQorLyoKKyAqIG9zLWRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGxvY2FsIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbgorICogSWYgeW91IHdhbnQgc29tZXRoaW5nIG90aGVyIHRoYW4gKERFKUFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLCisgKiBmb3IgQUxMT0NBVEUvREVBTExPQ0FURV9MT0NBTCB0aGVuIHlvdSBhZGQgdGhhdCBpbiBoZXJlLgorICovCisKKworIyAgaWZkZWYgX19HTlVDX18KKyMgICAgaWZuZGVmIGFsbG9jYQorIyAgICAgIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorIyAgICBlbmRpZiAvKiAhYWxsb2NhICovCisjICAgIGRlZmluZSBBTExPQ0FURV9MT0NBTChzaXplKSBhbGxvY2EoKGludCkoc2l6ZSkpCisjICBlbHNlIC8qICEgX19HTlVDX18gKi8KKworLyoKKyAqIHdhcm5pbmc6IG9sZCBtaXBzIGFsbG9jYSAocHJlIDIuMTApIGlzIHVudXNhYmxlLCBuZXcgb25lIGlzIGJ1aWx0IGluCisgKiBUZXN0IGlzIGVhc3ksIHRoZSBuZXcgb25lIGlzIG5hbWVkIF9fYnVpbHRpbl9hbGxvY2EgYW5kIGNvbWVzCisgKiBmcm9tIGFsbG9jYS5oIHdoaWNoICNkZWZpbmVzIGFsbG9jYS4KKyAqLworIyAgICAgIGlmIGRlZmluZWQoX19zdW4pIHx8IGRlZmluZWQoYWxsb2NhKQorLyoKKyAqIFNvbWUgU3lzdGVtIFYgYm94ZXMgZXh0cmFjdCBhbGxvY2EubyBmcm9tIC9saWIvbGliUFcuYTsgaWYgeW91CisgKiBkZWNpZGUgdGhhdCB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgYWxsb2NhLCB5b3UgbWlnaHQgd2FudCB0byBmaXggaXQgaGVyZS4KKyAqLworLyogYWxsb2NhIG1pZ2h0IGJlIGEgbWFjcm8gdGFraW5nIG9uZSBhcmcgKGhpLCBTdW4hKSwgc28gZ2l2ZSBpdCBvbmUuICovCisjICAgICAgICBpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgICAgICAgICAgZGVmaW5lIF9fWG51bGxhcmcJCS8qIGFzIG5vdGhpbmcgKi8KKyAgICAgICAgICAgZXh0ZXJuIHZvaWQgKmFsbG9jYShfX1hudWxsYXJnKTsKKyMgICAgICAgIGVuZGlmCisjICAgICAgICBkZWZpbmUgQUxMT0NBVEVfTE9DQUwoc2l6ZSkgYWxsb2NhKChpbnQpKHNpemUpKQorIyAgICAgIGVuZGlmIC8qIHdobyBkb2VzIGFsbG9jYSAqLworIyAgZW5kaWYgLyogX19HTlVDX18gKi8KKworI2VuZGlmIC8qIE5PX0FMTE9DQSAqLworCisjaWYgIWRlZmluZWQoQUxMT0NBVEVfTE9DQUwpCisjICBpZiBkZWZpbmVkKEFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLKSAmJiBkZWZpbmVkKERFQUxMT0NBVEVfTE9DQUxfRkFMTEJBQ0spCisjICAgIGRlZmluZSBBTExPQ0FURV9MT0NBTChfc2l6ZSkgIEFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLKF9zaXplKQorIyAgICBkZWZpbmUgREVBTExPQ0FURV9MT0NBTChfcHRyKSBERUFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLKF9wdHIpCisjICBlbHNlIC8qIG5vIGZhbGxiYWNrcyBzdXBwbGllZDsgZXJyb3IgKi8KKyMgICAgZGVmaW5lIEFMTE9DQVRFX0xPQ0FMKF9zaXplKSAgQUxMT0NBVEVfTE9DQUxfRkFMTEJBQ0sgdW5kZWZpbmVkIQorIyAgICBkZWZpbmUgREVBTExPQ0FURV9MT0NBTChfcHRyKSBERUFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLIHVuZGVmaW5lZCEKKyMgIGVuZGlmIC8qIGRlZmluZWQoQUxMT0NBVEVfTE9DQUxfRkFMTEJBQ0sgJiYgREVBTExPQ0FURV9MT0NBTF9GQUxMQkFDSykgKi8KKyNlbHNlCisjICBpZiAhZGVmaW5lZChERUFMTE9DQVRFX0xPQ0FMKQorIyAgICBkZWZpbmUgREVBTExPQ0FURV9MT0NBTChfcHRyKSBkbyB7fSB3aGlsZSgwKQorIyAgZW5kaWYKKyNlbmRpZiAvKiBkZWZpbmVkKEFMTE9DQVRFX0xPQ0FMKSAqLworCisjZW5kaWYgLyogWEFMTE9DQV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YYXJjaC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGFyY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODBjNTgwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGFyY2guaApAQCAtMCwwICsxLDk0IEBACisjaWZuZGVmIF9YQVJDSF9IXworIyBkZWZpbmUgX1hBUkNIX0hfCisKKy8qCisgKiBDb3B5cmlnaHQgMTk5NyBNZXRybyBMaW5rIEluY29ycG9yYXRlZAorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZSBsaXN0ZWQgY29weXJpZ2h0IGhvbGRlcihzKQorICogbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mCisgKiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGFib3ZlIGxpc3RlZAorICogY29weXJpZ2h0IGhvbGRlcihzKSBtYWtlKHMpIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IKKyAqIGltcGxpZWQgd2FycmFudHkuCisgKgorICogVEhFIEFCT1ZFIExJU1RFRCBDT1BZUklHSFQgSE9MREVSKFMpIERJU0NMQUlNKFMpIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJECisgKiBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKyAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgTElTVEVEIENPUFlSSUdIVCBIT0xERVIoUykgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkKKyAqIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisKKy8qCisgKiBEZXRlcm1pbmUgdGhlIG1hY2hpbmUncyBieXRlIG9yZGVyLgorICovCisKKy8qIFNlZSBpZiBpdCBpcyBzZXQgaW4gdGhlIGltYWtlIGNvbmZpZyBmaXJzdCAqLworIyBpZmRlZiBYX0JZVEVfT1JERVIKKworIyAgZGVmaW5lIFhfQklHX0VORElBTiA0MzIxCisjICBkZWZpbmUgWF9MSVRUTEVfRU5ESUFOIDEyMzQKKworIyBlbHNlCisKKyMgIGlmIGRlZmluZWQoU1ZSNCkgfHwgZGVmaW5lZChfX1NWUjQpCisjICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICAgaW5jbHVkZSA8c3lzL2J5dGVvcmRlci5oPgorIyAgZWxpZiBkZWZpbmVkKENTUkdfQkFTRUQpCisjICAgaWYgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKQorIyAgICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgICBlbmRpZgorIyAgIGluY2x1ZGUgPG1hY2hpbmUvZW5kaWFuLmg+CisjICBlbGlmIGRlZmluZWQobGludXgpCisjICAgaWYgZGVmaW5lZCBfX1NUUklDVF9BTlNJX18KKyMgICAgdW5kZWYgX19TVFJJQ1RfQU5TSV9fCisjICAgIGluY2x1ZGUgPGVuZGlhbi5oPgorIyAgICBkZWZpbmUgX19TVFJJQ1RfQU5TSV9fCisjICAgZWxzZQorIyAgICBpbmNsdWRlIDxlbmRpYW4uaD4KKyMgICBlbmRpZgorLyogJ2VuZGlhbi5oJyBtaWdodCBoYXZlIGJlZW4gaW5jbHVkZWQgYmVmb3JlICdYYXJjaC5oJyAqLworIyAgIGlmICFkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorIyAgICBkZWZpbmUgTElUVExFX0VORElBTiBfX0xJVFRMRV9FTkRJQU4KKyMgICBlbmRpZgorIyAgIGlmICFkZWZpbmVkKEJJR19FTkRJQU4pICYmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorIyAgICBkZWZpbmUgQklHX0VORElBTiBfX0JJR19FTkRJQU4KKyMgICBlbmRpZgorIyAgIGlmICFkZWZpbmVkKFBEUF9FTkRJQU4pICYmIGRlZmluZWQoX19QRFBfRU5ESUFOKQorIyAgICBkZWZpbmUgUERQX0VORElBTiBfX1BEUF9FTkRJQU4KKyMgICBlbmRpZgorIyAgIGlmICFkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoX19CWVRFX09SREVSKQorIyAgICBkZWZpbmUgQllURV9PUkRFUiBfX0JZVEVfT1JERVIKKyMgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWZuZGVmIEJZVEVfT1JERVIKKyMgICBkZWZpbmUgTElUVExFX0VORElBTiAxMjM0CisjICAgZGVmaW5lIEJJR19FTkRJQU4gICAgNDMyMQorCisjICAgaWYgZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfX1NWUjQpCisjICAgIGluY2x1ZGUgPHN5cy9pc2FfZGVmcy5oPgorIyAgICBpZmRlZiBfTElUVExFX0VORElBTgorIyAgICAgZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgorIyAgICBlbmRpZgorIyAgICBpZmRlZiBfQklHX0VORElBTgorIyAgICAgZGVmaW5lIEJZVEVfT1JERVIgQklHX0VORElBTgorIyAgICBlbmRpZgorIyAgIGVuZGlmIC8qIHN1biAqLworIyAgZW5kaWYgLyogQllURV9PUkRFUiAqLworCisjICBkZWZpbmUgWF9CWVRFX09SREVSIEJZVEVfT1JERVIKKyMgIGRlZmluZSBYX0JJR19FTkRJQU4gQklHX0VORElBTgorIyAgZGVmaW5lIFhfTElUVExFX0VORElBTiBMSVRUTEVfRU5ESUFOCisKKyMgZW5kaWYgLyogbm90IGluIGltYWtlIGNvbmZpZyAqLworCisjZW5kaWYgLyogX1hBUkNIX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YYXRvbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGF0b20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODVhNDIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGF0b20uaApAQCAtMCwwICsxLDc5IEBACisjaWZuZGVmIFhBVE9NX0gKKyNkZWZpbmUgWEFUT01fSCAxCisKKy8qIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRQorICoKKyAqIERvIG5vdCBjaGFuZ2UhICBDaGFuZ2luZyB0aGlzIGZpbGUgaW1wbGllcyBhIHByb3RvY29sIGNoYW5nZSEKKyAqLworCisjZGVmaW5lIFhBX1BSSU1BUlkgKChBdG9tKSAxKQorI2RlZmluZSBYQV9TRUNPTkRBUlkgKChBdG9tKSAyKQorI2RlZmluZSBYQV9BUkMgKChBdG9tKSAzKQorI2RlZmluZSBYQV9BVE9NICgoQXRvbSkgNCkKKyNkZWZpbmUgWEFfQklUTUFQICgoQXRvbSkgNSkKKyNkZWZpbmUgWEFfQ0FSRElOQUwgKChBdG9tKSA2KQorI2RlZmluZSBYQV9DT0xPUk1BUCAoKEF0b20pIDcpCisjZGVmaW5lIFhBX0NVUlNPUiAoKEF0b20pIDgpCisjZGVmaW5lIFhBX0NVVF9CVUZGRVIwICgoQXRvbSkgOSkKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjEgKChBdG9tKSAxMCkKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjIgKChBdG9tKSAxMSkKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjMgKChBdG9tKSAxMikKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjQgKChBdG9tKSAxMykKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjUgKChBdG9tKSAxNCkKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjYgKChBdG9tKSAxNSkKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjcgKChBdG9tKSAxNikKKyNkZWZpbmUgWEFfRFJBV0FCTEUgKChBdG9tKSAxNykKKyNkZWZpbmUgWEFfRk9OVCAoKEF0b20pIDE4KQorI2RlZmluZSBYQV9JTlRFR0VSICgoQXRvbSkgMTkpCisjZGVmaW5lIFhBX1BJWE1BUCAoKEF0b20pIDIwKQorI2RlZmluZSBYQV9QT0lOVCAoKEF0b20pIDIxKQorI2RlZmluZSBYQV9SRUNUQU5HTEUgKChBdG9tKSAyMikKKyNkZWZpbmUgWEFfUkVTT1VSQ0VfTUFOQUdFUiAoKEF0b20pIDIzKQorI2RlZmluZSBYQV9SR0JfQ09MT1JfTUFQICgoQXRvbSkgMjQpCisjZGVmaW5lIFhBX1JHQl9CRVNUX01BUCAoKEF0b20pIDI1KQorI2RlZmluZSBYQV9SR0JfQkxVRV9NQVAgKChBdG9tKSAyNikKKyNkZWZpbmUgWEFfUkdCX0RFRkFVTFRfTUFQICgoQXRvbSkgMjcpCisjZGVmaW5lIFhBX1JHQl9HUkFZX01BUCAoKEF0b20pIDI4KQorI2RlZmluZSBYQV9SR0JfR1JFRU5fTUFQICgoQXRvbSkgMjkpCisjZGVmaW5lIFhBX1JHQl9SRURfTUFQICgoQXRvbSkgMzApCisjZGVmaW5lIFhBX1NUUklORyAoKEF0b20pIDMxKQorI2RlZmluZSBYQV9WSVNVQUxJRCAoKEF0b20pIDMyKQorI2RlZmluZSBYQV9XSU5ET1cgKChBdG9tKSAzMykKKyNkZWZpbmUgWEFfV01fQ09NTUFORCAoKEF0b20pIDM0KQorI2RlZmluZSBYQV9XTV9ISU5UUyAoKEF0b20pIDM1KQorI2RlZmluZSBYQV9XTV9DTElFTlRfTUFDSElORSAoKEF0b20pIDM2KQorI2RlZmluZSBYQV9XTV9JQ09OX05BTUUgKChBdG9tKSAzNykKKyNkZWZpbmUgWEFfV01fSUNPTl9TSVpFICgoQXRvbSkgMzgpCisjZGVmaW5lIFhBX1dNX05BTUUgKChBdG9tKSAzOSkKKyNkZWZpbmUgWEFfV01fTk9STUFMX0hJTlRTICgoQXRvbSkgNDApCisjZGVmaW5lIFhBX1dNX1NJWkVfSElOVFMgKChBdG9tKSA0MSkKKyNkZWZpbmUgWEFfV01fWk9PTV9ISU5UUyAoKEF0b20pIDQyKQorI2RlZmluZSBYQV9NSU5fU1BBQ0UgKChBdG9tKSA0MykKKyNkZWZpbmUgWEFfTk9STV9TUEFDRSAoKEF0b20pIDQ0KQorI2RlZmluZSBYQV9NQVhfU1BBQ0UgKChBdG9tKSA0NSkKKyNkZWZpbmUgWEFfRU5EX1NQQUNFICgoQXRvbSkgNDYpCisjZGVmaW5lIFhBX1NVUEVSU0NSSVBUX1ggKChBdG9tKSA0NykKKyNkZWZpbmUgWEFfU1VQRVJTQ1JJUFRfWSAoKEF0b20pIDQ4KQorI2RlZmluZSBYQV9TVUJTQ1JJUFRfWCAoKEF0b20pIDQ5KQorI2RlZmluZSBYQV9TVUJTQ1JJUFRfWSAoKEF0b20pIDUwKQorI2RlZmluZSBYQV9VTkRFUkxJTkVfUE9TSVRJT04gKChBdG9tKSA1MSkKKyNkZWZpbmUgWEFfVU5ERVJMSU5FX1RISUNLTkVTUyAoKEF0b20pIDUyKQorI2RlZmluZSBYQV9TVFJJS0VPVVRfQVNDRU5UICgoQXRvbSkgNTMpCisjZGVmaW5lIFhBX1NUUklLRU9VVF9ERVNDRU5UICgoQXRvbSkgNTQpCisjZGVmaW5lIFhBX0lUQUxJQ19BTkdMRSAoKEF0b20pIDU1KQorI2RlZmluZSBYQV9YX0hFSUdIVCAoKEF0b20pIDU2KQorI2RlZmluZSBYQV9RVUFEX1dJRFRIICgoQXRvbSkgNTcpCisjZGVmaW5lIFhBX1dFSUdIVCAoKEF0b20pIDU4KQorI2RlZmluZSBYQV9QT0lOVF9TSVpFICgoQXRvbSkgNTkpCisjZGVmaW5lIFhBX1JFU09MVVRJT04gKChBdG9tKSA2MCkKKyNkZWZpbmUgWEFfQ09QWVJJR0hUICgoQXRvbSkgNjEpCisjZGVmaW5lIFhBX05PVElDRSAoKEF0b20pIDYyKQorI2RlZmluZSBYQV9GT05UX05BTUUgKChBdG9tKSA2MykKKyNkZWZpbmUgWEFfRkFNSUxZX05BTUUgKChBdG9tKSA2NCkKKyNkZWZpbmUgWEFfRlVMTF9OQU1FICgoQXRvbSkgNjUpCisjZGVmaW5lIFhBX0NBUF9IRUlHSFQgKChBdG9tKSA2NikKKyNkZWZpbmUgWEFfV01fQ0xBU1MgKChBdG9tKSA2NykKKyNkZWZpbmUgWEFfV01fVFJBTlNJRU5UX0ZPUiAoKEF0b20pIDY4KQorCisjZGVmaW5lIFhBX0xBU1RfUFJFREVGSU5FRCAoKEF0b20pIDY4KQorI2VuZGlmIC8qIFhBVE9NX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hjbXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hjbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTUxZmQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGNtcy5oCkBAIC0wLDAgKzEsODAzIEBACisKKy8qCisgKiBDb2RlIGFuZCBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24gKGMpIENvcHlyaWdodCAxOTkwIDE5OTEgVGVrdHJvbml4LCBJbmMuCisgKiAJQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBhIGNvbXBvbmVudCBvZiBhbiBYIFdpbmRvdyBTeXN0ZW0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24KKyAqIG9mIFhjbXMgYmFzZWQgb24gdGhlIFRla0NvbG9yIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtLiAgUGVybWlzc2lvbiBpcworICogaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBvdGhlcndpc2UgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgdGhpcyBjb3B5cmlnaHQsIHBlcm1pc3Npb24sIGFuZCBkaXNjbGFpbWVyIG5vdGljZSBpcyByZXByb2R1Y2VkIGluCisgKiBhbGwgY29waWVzIG9mIHRoaXMgc29mdHdhcmUgYW5kIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFRla0NvbG9yCisgKiBpcyBhIHRyYWRlbWFyayBvZiBUZWt0cm9uaXgsIEluYy4KKyAqCisgKiBUZWt0cm9uaXggbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUKKyAqIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgYW5kIHdpdGggYWxsIGZhdWx0cy4KKyAqCisgKiBURUtUUk9OSVggRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIEFQUExJQ0FCTEUgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorICogUEFSVElDVUxBUiBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgU0hBTEwgVEVLVFJPTklYIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgorICogUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GCisgKiBDT05UUkFDVCwgTkVHTElHRU5DRSwgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgVEhFIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICoKKyAqCURFU0NSSVBUSU9OCisgKgkJUHVibGljIGluY2x1ZGUgZmlsZSBmb3IgWCBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorICovCisjaWZuZGVmIF9YMTFfWENNU19IXworI2RlZmluZSBfWDExX1hDTVNfSF8KKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisKKyAgICAvKgorICAgICAqIFhDTVMgU3RhdHVzIFZhbHVlcworICAgICAqLworI2RlZmluZSBYY21zRmFpbHVyZQkJCTAKKyNkZWZpbmUgWGNtc1N1Y2Nlc3MJCQkxCisjZGVmaW5lIFhjbXNTdWNjZXNzV2l0aENvbXByZXNzaW9uCTIKKworICAgIC8qCisgICAgICogQ29sb3IgU3BhY2UgRm9ybWF0IElEJ3MKKyAgICAgKiAgICBDb2xvciBTcGFjZSBJRCdzIGFyZSBvZiBYY21zQ29sb3JGb3JtYXQgdHlwZS4KKyAgICAgKgorICAgICAqICAgIGJpdCAzMQorICAgICAqCSAgICAwID09IERldmljZS1JbmRlcGVuZGVudAorICAgICAqCSAgICAxID09IERldmljZS1EZXBlbmRlbnQKKyAgICAgKgorICAgICAqICAgIGJpdCAzMDoKKyAgICAgKgkgICAgMCA9PSBSZWdpc3RlcmVkIHdpdGggWCBDb25zb3J0aXVtCisgICAgICoJICAgIDEgPT0gVW5yZWdpc3RlcmVkCisgICAgICovCisjZGVmaW5lIFhjbXNVbmRlZmluZWRGb3JtYXQJKFhjbXNDb2xvckZvcm1hdCkweDAwMDAwMDAwCisjZGVmaW5lIFhjbXNDSUVYWVpGb3JtYXQJKFhjbXNDb2xvckZvcm1hdCkweDAwMDAwMDAxCisjZGVmaW5lIFhjbXNDSUV1dllGb3JtYXQJKFhjbXNDb2xvckZvcm1hdCkweDAwMDAwMDAyCisjZGVmaW5lIFhjbXNDSUV4eVlGb3JtYXQJKFhjbXNDb2xvckZvcm1hdCkweDAwMDAwMDAzCisjZGVmaW5lIFhjbXNDSUVMYWJGb3JtYXQJKFhjbXNDb2xvckZvcm1hdCkweDAwMDAwMDA0CisjZGVmaW5lIFhjbXNDSUVMdXZGb3JtYXQJKFhjbXNDb2xvckZvcm1hdCkweDAwMDAwMDA1CisjZGVmaW5lIFhjbXNUZWtIVkNGb3JtYXQJKFhjbXNDb2xvckZvcm1hdCkweDAwMDAwMDA2CisjZGVmaW5lIFhjbXNSR0JGb3JtYXQJCShYY21zQ29sb3JGb3JtYXQpMHg4MDAwMDAwMAorI2RlZmluZSBYY21zUkdCaUZvcm1hdAkJKFhjbXNDb2xvckZvcm1hdCkweDgwMDAwMDAxCisKKyAgICAvKgorICAgICAqIFN0YXRlIG9mIFhjbXNQZXJTY3JuSW5mbworICAgICAqLworI2RlZmluZSBYY21zSW5pdE5vbmUJCTB4MDAJLyogbm8gaW5pdGlhbGl6YXRpb24gYXR0ZW1wdGVkICovCisjZGVmaW5lIFhjbXNJbml0U3VjY2VzcwkJMHgwMQkvKiBpbml0aWFsaXphdGlvbiBzdWNjZXNzZnVsICovCisjZGVmaW5lIFhjbXNJbml0RmFpbHVyZQkJMHhmZgkvKiBmYWlsdXJlLCB1c2UgZGVmYXVsdHMgKi8KKworI2RlZmluZSBEaXNwbGF5T2ZDQ0MoY2NjKQkJKChjY2MpLT5kcHkpCisjZGVmaW5lIFNjcmVlbk51bWJlck9mQ0NDKGNjYykJCSgoY2NjKS0+c2NyZWVuTnVtYmVyKQorI2RlZmluZSBWaXN1YWxPZkNDQyhjY2MpCQkoKGNjYyktPnZpc3VhbCkKKyNkZWZpbmUgQ2xpZW50V2hpdGVQb2ludE9mQ0NDKGNjYykJKCYoY2NjKS0+Y2xpZW50V2hpdGVQdCkKKyNkZWZpbmUgU2NyZWVuV2hpdGVQb2ludE9mQ0NDKGNjYykJKCYoY2NjKS0+cFBlclNjcm5JbmZvLT5zY3JlZW5XaGl0ZVB0KQorI2RlZmluZSBGdW5jdGlvblNldE9mQ0NDKGNjYykJCSgoY2NjKS0+cFBlclNjcm5JbmZvLT5mdW5jdGlvblNldCkKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFhjbXNDb2xvckZvcm1hdDsJLyogQ29sb3IgU3BhY2UgRm9ybWF0IElEICovCisKK3R5cGVkZWYgZG91YmxlIFhjbXNGbG9hdDsKKworICAgIC8qCisgICAgICogRGV2aWNlIFJHQgorICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIHNob3J0IHJlZDsJCS8qIHNjYWxlZCBmcm9tIDB4MDAwMCB0byAweGZmZmYgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBncmVlbjsJLyogc2NhbGVkIGZyb20gMHgwMDAwIHRvIDB4ZmZmZiAqLworICAgIHVuc2lnbmVkIHNob3J0IGJsdWU7CS8qIHNjYWxlZCBmcm9tIDB4MDAwMCB0byAweGZmZmYgKi8KK30gWGNtc1JHQjsKKworICAgIC8qCisgICAgICogUkdCIEludGVuc2l0eQorICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhjbXNGbG9hdCByZWQ7CS8qIDAuMCAtIDEuMCAqLworICAgIFhjbXNGbG9hdCBncmVlbjsJLyogMC4wIC0gMS4wICovCisgICAgWGNtc0Zsb2F0IGJsdWU7CS8qIDAuMCAtIDEuMCAqLworfSBYY21zUkdCaTsKKworICAgIC8qCisgICAgICogQ0lFIFhZWgorICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhjbXNGbG9hdCBYOworICAgIFhjbXNGbG9hdCBZOworICAgIFhjbXNGbG9hdCBaOworfSBYY21zQ0lFWFlaOworCisgICAgLyoKKyAgICAgKiBDSUUgdSd2J1kKKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYY21zRmxvYXQgdV9wcmltZTsJCS8qIDAuMCAtIDEuMCAqLworICAgIFhjbXNGbG9hdCB2X3ByaW1lOwkJLyogMC4wIC0gMS4wICovCisgICAgWGNtc0Zsb2F0IFk7CQkvKiAwLjAgLSAxLjAgKi8KK30gWGNtc0NJRXV2WTsKKworICAgIC8qCisgICAgICogQ0lFIHh5WQorICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhjbXNGbG9hdCB4OwkJLyogMC4wIC0gMS4wICovCisgICAgWGNtc0Zsb2F0IHk7CQkvKiAwLjAgLSAxLjAgKi8KKyAgICBYY21zRmxvYXQgWTsJCS8qIDAuMCAtIDEuMCAqLworfSBYY21zQ0lFeHlZOworCisgICAgLyoKKyAgICAgKiBDSUUgTCphKmIqCisgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWGNtc0Zsb2F0IExfc3RhcjsJCS8qIDAuMCAtIDEwMC4wICovCisgICAgWGNtc0Zsb2F0IGFfc3RhcjsKKyAgICBYY21zRmxvYXQgYl9zdGFyOworfSBYY21zQ0lFTGFiOworCisgICAgLyoKKyAgICAgKiBDSUUgTCp1KnYqCisgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWGNtc0Zsb2F0IExfc3RhcjsJCS8qIDAuMCAtIDEwMC4wICovCisgICAgWGNtc0Zsb2F0IHVfc3RhcjsKKyAgICBYY21zRmxvYXQgdl9zdGFyOworfSBYY21zQ0lFTHV2OworCisgICAgLyoKKyAgICAgKiBUZWtIVkMKKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYY21zRmxvYXQgSDsJCS8qIDAuMCAtIDM2MC4wICovCisgICAgWGNtc0Zsb2F0IFY7CQkvKiAwLjAgLSAxMDAuMCAqLworICAgIFhjbXNGbG9hdCBDOwkJLyogMC4wIC0gMTAwLjAgKi8KK30gWGNtc1Rla0hWQzsKKworICAgIC8qCisgICAgICogUEFECisgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWGNtc0Zsb2F0IHBhZDA7CisgICAgWGNtc0Zsb2F0IHBhZDE7CisgICAgWGNtc0Zsb2F0IHBhZDI7CisgICAgWGNtc0Zsb2F0IHBhZDM7Cit9IFhjbXNQYWQ7CisKKworICAgIC8qCisgICAgICogWENNUyBDb2xvciBTdHJ1Y3R1cmUKKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmlvbiB7CisJWGNtc1JHQiBSR0I7CisJWGNtc1JHQmkgUkdCaTsKKwlYY21zQ0lFWFlaIENJRVhZWjsKKwlYY21zQ0lFdXZZIENJRXV2WTsKKwlYY21zQ0lFeHlZIENJRXh5WTsKKwlYY21zQ0lFTGFiIENJRUxhYjsKKwlYY21zQ0lFTHV2IENJRUx1djsKKwlYY21zVGVrSFZDIFRla0hWQzsKKwlYY21zUGFkIFBhZDsKKyAgICB9IHNwZWM7CQkJLyogdGhlIGNvbG9yIHNwZWNpZmljYXRpb24JKi8KKyAgICB1bnNpZ25lZCBsb25nIHBpeGVsOwkvKiBwaXhlbCB2YWx1ZSAoYXMgbmVlZGVkKQkqLworICAgIFhjbXNDb2xvckZvcm1hdAlmb3JtYXQ7CQkvKiB0aGUgc3BlY2lmaWNhdGlvbiBmb3JtYXQJKi8KK30gWGNtc0NvbG9yOworCisKKyAgICAvKgorICAgICAqIFhDTVMgUGVyIFNjcmVlbiByZWxhdGVkIGRhdGEKKyAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1hjbXNQZXJTY3JuSW5mbyB7CisgICAgWGNtc0NvbG9yCXNjcmVlbldoaXRlUHQ7CS8qIFNjcmVlbiBXaGl0ZSBwb2ludCAqLworICAgIFhQb2ludGVyCWZ1bmN0aW9uU2V0OwkvKiBwb2ludGVyIHRvIFNjcmVlbiBDb2xvciBDaGFyYWN0ZXJpemF0aW9uICovCisJCQkJLyogICAgICBGdW5jdGlvbiBTZXQgc3RydWN0dXJlCQkqLworICAgIFhQb2ludGVyCXNjcmVlbkRhdGE7CS8qIHBvaW50ZXIgdG8gY29ycmVzcG9uZGluZyBTY3JlZW4gQ29sb3IqLworCQkJCS8qCUNoYXJhY3Rlcml6YXRpb24gRGF0YQkJKi8KKyAgICB1bnNpZ25lZCBjaGFyIHN0YXRlOyAgIC8qIFhjbXNJbml0Tm9uZSwgWGNtc0luaXRTdWNjZXNzLCBYY21zSW5pdEZhaWx1cmUgKi8KKyAgICBjaGFyCXBhZFszXTsKK30gWGNtc1BlclNjcm5JbmZvOworCit0eXBlZGVmIHN0cnVjdCBfWGNtc0NDQyAqWGNtc0NDQzsKKwordHlwZWRlZiBTdGF0dXMgKCpYY21zQ29tcHJlc3Npb25Qcm9jKSgJCS8qIEdhbXV0IENvbXByZXNzaW9uIFByb2MgKi8KKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaW5kZXggKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKwordHlwZWRlZiBTdGF0dXMgKCpYY21zV2hpdGVBZGp1c3RQcm9jKSgJIAkvKiBXaGl0ZSBQb2ludCBBZGp1c3QgUHJvYyAqLworICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBpbml0aWFsX3doaXRlX3BvaW50Ki8sCisgICAgWGNtc0NvbG9yKgkJLyogdGFyZ2V0X3doaXRlX3BvaW50Ki8sCisgICAgWGNtc0NvbG9yRm9ybWF0CS8qIHRhcmdldF9mb3JtYXQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCisgICAgLyoKKyAgICAgKiBYQ01TIENvbG9yIENvbnZlcnNpb24gQ29udGV4dAorICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX1hjbXNDQ0MgeworICAgIERpc3BsYXkJKmRweTsJCQkvKiBYIERpc3BsYXkgKi8KKyAgICBpbnQJCXNjcmVlbk51bWJlcjsJCS8qIFggc2NyZWVuIG51bWJlciAqLworICAgIFZpc3VhbAkqdmlzdWFsOwkJLyogWCBWaXN1YWwgKi8KKyAgICBYY21zQ29sb3IJY2xpZW50V2hpdGVQdDsJCS8qIENsaWVudCBXaGl0ZSBQb2ludCAqLworICAgIFhjbXNDb21wcmVzc2lvblByb2MJZ2FtdXRDb21wUHJvYzsJLyogR2FtdXQgQ29tcHJlc3Npb24gRnVuY3Rpb24gKi8KKyAgICBYUG9pbnRlcglnYW11dENvbXBDbGllbnREYXRhOwkvKiBHYW11dCBDb21wIEZ1bmMgQ2xpZW50IERhdGEgKi8KKyAgICBYY21zV2hpdGVBZGp1c3RQcm9jCXdoaXRlUHRBZGpQcm9jOwkvKiBXaGl0ZSBQb2ludCBBZGp1c3RtZW50IEZ1bmN0aW9uICovCisgICAgWFBvaW50ZXIJd2hpdGVQdEFkakNsaWVudERhdGE7CS8qIFdoaXRlIFB0IEFkaiBGdW5jIENsaWVudCBEYXRhICovCisgICAgWGNtc1BlclNjcm5JbmZvICpwUGVyU2NybkluZm87CS8qIHBvaW50ZXIgdG8gcGVyIHNjcmVlbiBpbmZvcm1hdGlvbiAqLworCQkJCQkvKiAgYXNzb2NpYXRlZCB3aXRoIHRoZSBhYm92ZSBkaXNwbGF5ICovCisJCQkJCS8qICBzY3JlZW5OdW1iZXIgKi8KK30gWGNtc0NDQ1JlYzsKKwordHlwZWRlZiBTdGF0dXMgKCpYY21zU2NyZWVuSW5pdFByb2MpKAkvKiBTY3JlZW4gSW5pdGlhbGl6YXRpb24gUHJvYyAqLworICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLywKKyAgICBYY21zUGVyU2NybkluZm8qCS8qIHNjcmVlbl9pbmZvICovCispOworCit0eXBlZGVmIHZvaWQgKCpYY21zU2NyZWVuRnJlZVByb2MpKAorICAgIFhQb2ludGVyCQkvKiBzY3JlZW5EYXRhICovCispOworCisgICAgLyoKKyAgICAgKiBGdW5jdGlvbiBMaXN0IFBvaW50ZXIgLS0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycy4KKyAgICAgKiAgICBUaGUgZW5kIG9mIGxpc3QgaXMgaW5kaWNhdGVkIGJ5IGEgTlVMTCBwb2ludGVyLgorICAgICAqLworLyoKKyAqIFhYWDogIFRoZSB1c2Ugb2YgdGhlIFhjbXNDb252ZXJzaW9uUHJvYyB0eXBlIGlzIGJyb2tlbi4gIFRoZQorICogICAgICAgZGV2aWNlLWluZGVwZW5kZW50IGNvbG91ciBjb252ZXJzaW9uIGNvZGUgdXNlcyBpdCBhczoKKwordHlwZWRlZiBTdGF0dXMgKCpYY21zQ29udmVyc2lvblByb2MpKFhjbXNDQ0MsIFhjbXNDb2xvciAqLCBYY21zQ29sb3IgKiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCk7CisKKyAqICAgICAgIHdoaWxlIHRoZSBkZXZpY2UtZGVwZW5kZW50IGNvZGUgdXNlcyBpdCBhczoKKwordHlwZWRlZiBTdGF0dXMgKCpYY21zQ29udmVyc2lvblByb2MpKFhjbXNDQ0MsIFhjbXNDb2xvciAqLCB1bnNpZ25lZCBpbnQsCisJCQkJICAgICBCb29sICopOworCisgKiAgICAgICBVbnRpbCB0aGlzIGlzIHJld29ya2VkLCBpdCdzIHByb2JhYmx5IGJlc3QgdG8gbGVhdmUgaXQgdW5wcm90b2l6ZWQuCisgKiAgICAgICBUaGUgY29kZSB3b3JrcyByZWdhcmRsZXNzLgorICovCit0eXBlZGVmIFN0YXR1cyAoKlhjbXNERENvbnZlcnNpb25Qcm9jKSggLyogdXNpbmcgZGV2aWNlLWRlcGVuZGVudCB2ZXJzaW9uICovCisgICAgWGNtc0NDQyAgICAgICAgICAgICAvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKiAgICAgICAgICAvKiBwY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgIC8qIG5jb2xvcnMgKi8sCisgICAgQm9vbCogICAgICAgICAgICAgICAvKiBwQ29tcHJlc3NlZCAqLworICAgICk7CisKK3R5cGVkZWYgU3RhdHVzICgqWGNtc0RJQ29udmVyc2lvblByb2MpKCAvKiB1c2luZyBkZXZpY2UtaW5kZXBlbmRlbnQgdmVyc2lvbiAqLworICAgIFhjbXNDQ0MgICAgICAgICAgICAgLyogY2NjICovLAorICAgIFhjbXNDb2xvciogICAgICAgICAgLyogd2hpdGVfcG9pbnQgKi8sCisgICAgWGNtc0NvbG9yKiAgICAgICAgICAvKiBwY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgIC8qIG5jb2xvcnMgKi8KKyAgICApOworCit0eXBlZGVmIFhjbXNESUNvbnZlcnNpb25Qcm9jIFhjbXNDb252ZXJzaW9uUHJvYzsKK3R5cGVkZWYgWGNtc0NvbnZlcnNpb25Qcm9jICpYY21zRnVuY0xpc3RQdHI7CisKK3R5cGVkZWYgaW50ICgqWGNtc1BhcnNlU3RyaW5nUHJvYykoCS8qIENvbG9yIFN0cmluZyBQYXJzaW5nIFByb2MgKi8KKyAgICBjaGFyKgkJLyogY29sb3Jfc3RyaW5nICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworICAgIC8qCisgICAgICogQ29sb3IgU3BhY2UgLS0gcGVyIENvbG9yIFNwYWNlIHJlbGF0ZWQgZGF0YSAoRGV2aWNlLUluZGVwZW5kZW50CisgICAgICogICAgb3IgRGV2aWNlLURlcGVuZGVudCkKKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9YY21zQ29sb3JTcGFjZSB7CisgICAgY29uc3QgY2hhciAqcHJlZml4OwkJLyogUHJlZml4IG9mIHN0cmluZyBmb3JtYXQuCQkqLworICAgIFhjbXNDb2xvckZvcm1hdCBpZDsJCS8qIEZvcm1hdCBJRCBudW1iZXIuCQkJKi8KKyAgICBYY21zUGFyc2VTdHJpbmdQcm9jIHBhcnNlU3RyaW5nOworCQkJCS8qIFN0cmluZyBmb3JtYXQgcGFyc2luZyBmdW5jdGlvbgkqLworICAgIFhjbXNGdW5jTGlzdFB0ciB0b19DSUVYWVo7CS8qIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZnVuY3Rpb24gCSovCisJCQkJLyogICBwb2ludGVycyBzdWNoIHRoYXQgd2hlbiB0aGUJKi8KKwkJCQkvKiAgIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWQgaW4gc2VxdWVuY2UJKi8KKwkJCQkvKiAgIHdpbGwgY29udmVydCBhIFhjbXNDb2xvciBzdHJ1Y3R1cmUJKi8KKwkJCQkvKiAgIGZyb20gdGhpcyBjb2xvciBzcGFjZSB0byBDSUVYWVoJKi8KKwkJCQkvKiAgIHNwYWNlLgkJCQkqLworICAgIFhjbXNGdW5jTGlzdFB0ciBmcm9tX0NJRVhZWjsvKiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGZ1bmN0aW9uIAkqLworCQkJCS8qICAgcG9pbnRlcnMgc3VjaCB0aGF0IHdoZW4gdGhlCSovCisJCQkJLyogICBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkIGluIHNlcXVlbmNlCSovCisJCQkJLyogICB3aWxsIGNvbnZlcnQgYSBYY21zQ29sb3Igc3RydWN0dXJlCSovCisJCQkJLyogICBmcm9tIENJRVhZWiBzcGFjZSB0byB0aGlzIGNvbG9yCSovCisJCQkJLyogICBzcGFjZS4JCQkJKi8KKyAgICBpbnQgaW52ZXJzZV9mbGFnOwkJLyogSWYgMSwgaW5kaWNhdGVzIHRoYXQgZm9yIDAgPD0gaSA8IG4JKi8KKwkJCQkvKiAgIHdoZXJlIG4gaXMgdGhlIG51bWJlciBvZiBmdW5jdGlvbgkqLworCQkJCS8qICAgcG9pbnRlcnMgaW4gdGhlIGxpc3RzIHRvX0NJRVhZWgkqLworCQkJCS8qICAgYW5kIGZyb21fQ0lFWFlaOyBmb3IgZWFjaCBmdW5jdGlvbiAqLworCQkJCS8qICAgdG9fQ0lFWFlaW2ldIGl0cyBpbnZlcnNlIGZ1bmN0aW9uCSovCisJCQkJLyogICBpcyBmcm9tX0NJRVhZWltuIC0gaV0uCQkqLworCit9IFhjbXNDb2xvclNwYWNlOworCisgICAgLyoKKyAgICAgKiBTY3JlZW4gQ29sb3IgQ2hhcmFjdGVyaXphdGlvbiBGdW5jdGlvbiBTZXQgLS0gcGVyIGRldmljZSBjbGFzcworICAgICAqICAgIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gZnVuY3Rpb25zLgorICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX1hjbXNGdW5jdGlvblNldCB7CisgICAgWGNtc0NvbG9yU3BhY2UgKipERENvbG9yU3BhY2VzOworCQkJCS8qIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8JKi8KKwkJCQkvKiAgIERldmljZS1ERVBFTkRFTlQgY29sb3Igc3BhY2VzCSovCisJCQkJLyogICB1bmRlcnN0b29kIGJ5IHRoaXMgU0NDRnVuY1NldC4JKi8KKyAgICBYY21zU2NyZWVuSW5pdFByb2Mgc2NyZWVuSW5pdFByb2M7CisJCQkJLyogU2NyZWVuIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHRoYXQJKi8KKwkJCQkvKiAgIHJlYWRzIFNjcmVlbiBDb2xvciBDaGFyYWN0ZXJpemF0aW9uKi8KKwkJCQkvKiAgIERhdGEgb2ZmIHByb3BlcnRpZXMgb24gdGhlIHNjcmVlbidzKi8KKwkJCQkvKiAgIHJvb3Qgd2luZG93LgkJCSovCisgICAgWGNtc1NjcmVlbkZyZWVQcm9jIHNjcmVlbkZyZWVQcm9jOworCQkJCS8qIEZ1bmN0aW9uIHRoYXQgZnJlZXMgdGhlIFNDQ0RhdGEJKi8KKwkJCQkvKiAgIHN0cnVjdHVyZXMuCQkJKi8KK30gWGNtc0Z1bmN0aW9uU2V0OworCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiBTdGF0dXMgWGNtc0FkZENvbG9yU3BhY2UgKAorICAgIFhjbXNDb2xvclNwYWNlKgkvKiBwQ29sb3JTcGFjZSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQWRkRnVuY3Rpb25TZXQgKAorICAgIFhjbXNGdW5jdGlvblNldCoJLyogZnVuY3Rpb25TZXQgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0FsbG9jQ29sb3IgKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX2luX291dCAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJCS8qIHJlc3VsdF9mb3JtYXQgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0FsbG9jTmFtZWRDb2xvciAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBjb2xvcl9zdHJpbmcgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3Jfc2Nybl9yZXR1cm4gKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfZXhhY3RfcmV0dXJuICovLAorICAgIFhjbXNDb2xvckZvcm1hdAkJLyogcmVzdWx0X2Zvcm1hdCAqLworKTsKKworZXh0ZXJuIFhjbXNDQ0MgWGNtc0NDQ09mQ29sb3JtYXAgKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMYWJDbGlwYWIoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGluZGV4ICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUxhYkNsaXBMKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBpbmRleCAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMYWJDbGlwTGFiKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBpbmRleCAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMYWJRdWVyeU1heEMgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zRmxvYXQJCS8qIGh1ZV9hbmdsZSAqLywKKyAgICBYY21zRmxvYXQJCS8qIExfc3RhciAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUxhYlF1ZXJ5TWF4TCAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNGbG9hdAkJLyogaHVlX2FuZ2xlICovLAorICAgIFhjbXNGbG9hdAkJLyogY2hyb21hICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTGFiUXVlcnlNYXhMQyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNGbG9hdAkJLyogaHVlX2FuZ2xlICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTGFiUXVlcnlNaW5MICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWVfYW5nbGUgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBjaHJvbWEgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMYWJUb0NJRVhZWiAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIHdoaXRlX3BvaW50ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTGFiV2hpdGVTaGlmdENvbG9ycygKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogaW5pdGlhbF93aGl0ZV9wb2ludCovLAorICAgIFhjbXNDb2xvcioJCS8qIHRhcmdldF93aGl0ZV9wb2ludCovLAorICAgIFhjbXNDb2xvckZvcm1hdAkvKiB0YXJnZXRfZm9ybWF0ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTHV2Q2xpcEwoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGluZGV4ICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUx1dkNsaXBMdXYoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGluZGV4ICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUx1dkNsaXB1digKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaW5kZXggKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTHV2UXVlcnlNYXhDICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWVfYW5nbGUgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBMX3N0YXIgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMdXZRdWVyeU1heEwgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zRmxvYXQJCS8qIGh1ZV9hbmdsZSAqLywKKyAgICBYY21zRmxvYXQJCS8qIGNocm9tYSAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUx1dlF1ZXJ5TWF4TEMgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zRmxvYXQJCS8qIGh1ZV9hbmdsZSAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUx1dlF1ZXJ5TWluTCAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNGbG9hdAkJLyogaHVlX2FuZ2xlICovLAorICAgIFhjbXNGbG9hdAkJLyogY2hyb21hICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTHV2VG9DSUV1dlkgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiB3aGl0ZV9wb2ludCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUx1dldoaXRlU2hpZnRDb2xvcnMoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGluaXRpYWxfd2hpdGVfcG9pbnQqLywKKyAgICBYY21zQ29sb3IqCQkvKiB0YXJnZXRfd2hpdGVfcG9pbnQqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJLyogdGFyZ2V0X2Zvcm1hdCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRVhZWlRvQ0lFTGFiICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogd2hpdGVfcG9pbnQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVYWVpUb0NJRXV2WSAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIHdoaXRlX3BvaW50ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFWFlaVG9DSUV4eVkgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiB3aGl0ZV9wb2ludCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRVhZWlRvUkdCaSAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUV1dllUb0NJRUx1diAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIHdoaXRlX3BvaW50ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFdXZZVG9DSUVYWVogKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiB3aGl0ZV9wb2ludCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRXV2WVRvVGVrSFZDICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogd2hpdGVfcG9pbnQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUV4eVlUb0NJRVhZWiAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIHdoaXRlX3BvaW50ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLworKTsKKworZXh0ZXJuIFhjbXNDb2xvciAqWGNtc0NsaWVudFdoaXRlUG9pbnRPZkNDQyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDb252ZXJ0Q29sb3JzICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JBcnJ5X2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbkNvbG9ycyAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJCS8qIHRhcmdldEZvcm1hdCAqLywKKyAgICBCb29sKgkJLyogY29tcEFycnlfcmV0dXJuICovCispOworCitleHRlcm4gWGNtc0NDQyBYY21zQ3JlYXRlQ0NDICgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludAkJCS8qIHNjcmVlbk51bWJlciAqLywKKyAgICBWaXN1YWwqCQkvKiB2aXN1YWwgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY2xpZW50V2hpdGVQdCAqLywKKyAgICBYY21zQ29tcHJlc3Npb25Qcm9jIC8qIGdhbXV0Q29tcFByb2MgKi8sCisgICAgWFBvaW50ZXIJCS8qIGdhbXV0Q29tcENsaWVudERhdGEgKi8sCisgICAgWGNtc1doaXRlQWRqdXN0UHJvYwkvKiB3aGl0ZVB0QWRqUHJvYyAqLywKKyAgICBYUG9pbnRlcgkJLyogd2hpdGVQdEFkakNsaWVudERhdGEgKi8KKyk7CisKK2V4dGVybiBYY21zQ0NDIFhjbXNEZWZhdWx0Q0NDICgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludAkJCS8qIHNjcmVlbk51bWJlciAqLworKTsKKworZXh0ZXJuIERpc3BsYXkgKlhjbXNEaXNwbGF5T2ZDQ0MgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLworKTsKKworZXh0ZXJuIFhjbXNDb2xvckZvcm1hdCBYY21zRm9ybWF0T2ZQcmVmaXggKAorICAgIGNoYXIqCQkvKiBwcmVmaXggKi8KKyk7CisKK2V4dGVybiB2b2lkIFhjbXNGcmVlQ0NDICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0xvb2t1cENvbG9yICgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGNvbG9yX3N0cmluZyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBwQ29sb3JfZXhhY3RfaW5fb3V0ICovLAorICAgIFhjbXNDb2xvcioJCS8qIHBDb2xvcl9zY3JuX2luX291dCAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJCS8qIHJlc3VsdF9mb3JtYXQgKi8KKyk7CisKK2V4dGVybiBjaGFyICpYY21zUHJlZml4T2ZGb3JtYXQgKAorICAgIFhjbXNDb2xvckZvcm1hdAkJLyogaWQgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1F1ZXJ5QmxhY2sgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJLyogdGFyZ2V0X2Zvcm1hdCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1F1ZXJ5Qmx1ZSAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvckZvcm1hdAkvKiB0YXJnZXRfZm9ybWF0ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zUXVlcnlDb2xvciAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogcENvbG9yX2luX291dCAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJCS8qIHJlc3VsdF9mb3JtYXQgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1F1ZXJ5Q29sb3JzICgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvckFycnlfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuQ29sb3JzICovLAorICAgIFhjbXNDb2xvckZvcm1hdAkvKiByZXN1bHRfZm9ybWF0ICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNRdWVyeUdyZWVuICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yRm9ybWF0CS8qIHRhcmdldF9mb3JtYXQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNRdWVyeVJlZCAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvckZvcm1hdAkvKiB0YXJnZXRfZm9ybWF0ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zUXVlcnlXaGl0ZSAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvckZvcm1hdAkvKiB0YXJnZXRfZm9ybWF0ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zUkdCaVRvQ0lFWFlaICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1JHQmlUb1JHQiAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNSR0JUb1JHQmkgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYY21zU2NyZWVuTnVtYmVyT2ZDQ0MgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLworKTsKKworZXh0ZXJuIFhjbXNDb2xvciAqWGNtc1NjcmVlbldoaXRlUG9pbnRPZkNDQyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovCispOworCitleHRlcm4gWGNtc0NDQyBYY21zU2V0Q0NDT2ZDb2xvcm1hcCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8KKyk7CisKK2V4dGVybiBYY21zQ29tcHJlc3Npb25Qcm9jIFhjbXNTZXRDb21wcmVzc2lvblByb2MgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29tcHJlc3Npb25Qcm9jCS8qIGNvbXByZXNzaW9uX3Byb2MgKi8sCisgICAgWFBvaW50ZXIJCS8qIGNsaWVudF9kYXRhICovCispOworCitleHRlcm4gWGNtc1doaXRlQWRqdXN0UHJvYyBYY21zU2V0V2hpdGVBZGp1c3RQcm9jICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc1doaXRlQWRqdXN0UHJvYwkvKiB3aGl0ZV9hZGp1c3RfcHJvYyAqLywKKyAgICBYUG9pbnRlcgkJLyogY2xpZW50X2RhdGEgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1NldFdoaXRlUG9pbnQgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvciAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zU3RvcmVDb2xvciAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogcENvbG9yX2luICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNTdG9yZUNvbG9ycyAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JBcnJ5X2luICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuQ29sb3JzICovLAorICAgIEJvb2wqCQkvKiBjb21wQXJyeV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1Rla0hWQ0NsaXBDKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBpbmRleCAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNUZWtIVkNDbGlwVigKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaW5kZXggKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zVGVrSFZDQ2xpcFZDKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBpbmRleCAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNUZWtIVkNRdWVyeU1heEMgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zRmxvYXQJCS8qIGh1ZSAqLywKKyAgICBYY21zRmxvYXQJCS8qIHZhbHVlICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zVGVrSFZDUXVlcnlNYXhWICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWUgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBjaHJvbWEgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNUZWtIVkNRdWVyeU1heFZDICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWUgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNUZWtIVkNRdWVyeU1heFZTYW1wbGVzICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWUgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbnNhbXBsZXMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1Rla0hWQ1F1ZXJ5TWluViAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNGbG9hdAkJLyogaHVlICovLAorICAgIFhjbXNGbG9hdAkJLyogY2hyb21hICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zVGVrSFZDVG9DSUV1dlkgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiB3aGl0ZV9wb2ludCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1Rla0hWQ1doaXRlU2hpZnRDb2xvcnMoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGluaXRpYWxfd2hpdGVfcG9pbnQqLywKKyAgICBYY21zQ29sb3IqCQkvKiB0YXJnZXRfd2hpdGVfcG9pbnQqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJLyogdGFyZ2V0X2Zvcm1hdCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBWaXN1YWwgKlhjbXNWaXN1YWxPZkNDQyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX1gxMV9YQ01TX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YZGVmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmZmZGFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGRlZnMuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgMTk5OSAgVGhlIFhGcmVlODYgUHJvamVjdCBJbmMuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0CitJbmMuIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZQorc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCithdXRob3JpemF0aW9uIGZyb20gVGhlIFhGcmVlODYgUHJvamVjdCBJbmMuLgorCisqLworCisvKioKKyAqKiBUeXBlcyBkZWZpbml0aW9ucyBzaGFyZWQgYmV0d2VlbiBzZXJ2ZXIgYW5kIGNsaWVudHMgCisgKiovCisKKyNpZm5kZWYgX1hERUZTX0gKKyNkZWZpbmUgX1hERUZTX0gKKworI2lmZGVmIF9YU0VSVkVSNjQKKyNpbmNsdWRlIDxYMTEvWG1kLmg+CisjZW5kaWYgCisKKyNpZm5kZWYgX1hUWVBFREVGX0FUT00KKyMgIGRlZmluZSBfWFRZUEVERUZfQVRPTQorIyAgaWZuZGVmIF9YU0VSVkVSNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBBdG9tOworIyAgZWxzZQordHlwZWRlZiBDQVJEMzIgQXRvbTsKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBCb29sCisjICBpZm5kZWYgX1hUWVBFREVGX0JPT0wKKyMgICBkZWZpbmUgX1hUWVBFREVGX0JPT0wKK3R5cGVkZWYgaW50IEJvb2w7CisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX1hUWVBFREVGX1BPSU5URVIKKyMgIGRlZmluZSBfWFRZUEVERUZfUE9JTlRFUgordHlwZWRlZiB2b2lkICpwb2ludGVyOworI2VuZGlmCisKKyNpZm5kZWYgX1hUWVBFREVGX0NMSUVOVFBUUgordHlwZWRlZiBzdHJ1Y3QgX0NsaWVudCAqQ2xpZW50UHRyOworIyAgZGVmaW5lIF9YVFlQRURFRl9DTElFTlRQVFIKKyNlbmRpZgorCisjaWZuZGVmIF9YVFlQRURFRl9YSUQKKyMgIGRlZmluZSBfWFRZUEVERUZfWElECisjICBpZm5kZWYgX1hTRVJWRVI2NAordHlwZWRlZiB1bnNpZ25lZCBsb25nIFhJRDsKKyMgIGVsc2UKK3R5cGVkZWYgQ0FSRDMyIFhJRDsKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfWFRZUEVERUZfTUFTSworIyAgZGVmaW5lIF9YVFlQRURFRl9NQVNLCisjICBpZm5kZWYgX1hTRVJWRVI2NAordHlwZWRlZiB1bnNpZ25lZCBsb25nIE1hc2s7CisjICBlbHNlCit0eXBlZGVmIENBUkQzMiBNYXNrOworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9YVFlQRURFRl9GT05UUFRSCisjICBkZWZpbmUgX1hUWVBFREVGX0ZPTlRQVFIKK3R5cGVkZWYgc3RydWN0IF9Gb250ICpGb250UHRyOyAvKiBhbHNvIGluIGZvbnRzL2luY2x1ZGUvZm9udC5oICovCisjZW5kaWYKKworI2lmbmRlZiBfWFRZUEVERUZfRk9OVAorIyAgZGVmaW5lIF9YVFlQRURFRl9GT05UCit0eXBlZGVmIFhJRAlGb250OworI2VuZGlmCisKKyNpZm5kZWYgX1hUWVBFREVGX0ZTSUQKKyMgIGlmbmRlZiBfWFNFUlZFUjY0Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgRlNJRDsKKyMgIGVsc2UKK3R5cGVkZWYgQ0FSRDMyIEZTSUQ7CisjICBlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgRlNJRCBBY2NDb250ZXh0OworCisvKiBPUyBpbmRlcGVuZGVudCB0aW1lIHZhbHVlIAorICAgWFhYIFNob3VsZCBwcm9iYWJseSBnbyBpbiBYb3MuaCAqLwordHlwZWRlZiBzdHJ1Y3QgdGltZXZhbCAqKk9TVGltZVB0cjsKKworCit0eXBlZGVmIHZvaWQgKCogQmxvY2tIYW5kbGVyUHJvY1B0cikocG9pbnRlciAvKiBibG9ja0RhdGEgKi8sCisJCQkJICAgICBPU1RpbWVQdHIgLyogcFRpbWVvdXQgKi8sCisJCQkJICAgICBwb2ludGVyIC8qIHBSZWFkbWFzayAqLyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGZ1bmNwcm90by5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGZ1bmNwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWM3OTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YZnVuY3Byb3RvLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qIFhmdW5jcHJvdG8uaC4gIEdlbmVyYXRlZCBmcm9tIFhmdW5jcHJvdG8uaC5pbiBieSBjb25maWd1cmUuICAqLworLyoKKyAqCitDb3B5cmlnaHQgMTk4OSwgMTk5MSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKyAqCisgKi8KKworLyogRGVmaW5pdGlvbnMgdG8gbWFrZSBmdW5jdGlvbiBwcm90b3R5cGVzIG1hbmFnZWFibGUgKi8KKworI2lmbmRlZiBfWEZVTkNQUk9UT19IXworI2RlZmluZSBfWEZVTkNQUk9UT19IXworCisjaWZuZGVmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKyNkZWZpbmUgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcyAxCisjZW5kaWYgLyogTmVlZEZ1bmN0aW9uUHJvdG90eXBlcyAqLworCisjaWZuZGVmIE5lZWRWYXJhcmdzUHJvdG90eXBlcworI2RlZmluZSBOZWVkVmFyYXJnc1Byb3RvdHlwZXMgMQorI2VuZGlmIC8qIE5lZWRWYXJhcmdzUHJvdG90eXBlcyAqLworCisjaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworCisjaWZuZGVmIE5lZWROZXN0ZWRQcm90b3R5cGVzCisjZGVmaW5lIE5lZWROZXN0ZWRQcm90b3R5cGVzIDEKKyNlbmRpZiAvKiBOZWVkTmVzdGVkUHJvdG90eXBlcyAqLworCisjaWZuZGVmIF9YY29uc3QKKyNkZWZpbmUgX1hjb25zdCBjb25zdAorI2VuZGlmIC8qIF9YY29uc3QgKi8KKworLyogRnVuY3Rpb24gcHJvdG90eXBlIGNvbmZpZ3VyYXRpb24gKHNlZSBjb25maWd1cmUgZm9yIG1vcmUgaW5mbykgKi8KKyNpZm5kZWYgTkFSUk9XUFJPVE8KKyNkZWZpbmUgTkFSUk9XUFJPVE8gLyoqLworI2VuZGlmCisjaWZuZGVmIEZVTkNQUk9UTworI2RlZmluZSBGVU5DUFJPVE8gMTUKKyNlbmRpZgorCisjaWZuZGVmIE5lZWRXaWRlUHJvdG90eXBlcworI2lmZGVmIE5BUlJPV1BST1RPCisjZGVmaW5lIE5lZWRXaWRlUHJvdG90eXBlcyAwCisjZWxzZQorI2RlZmluZSBOZWVkV2lkZVByb3RvdHlwZXMgMQkJLyogZGVmYXVsdCB0byBtYWtlIGludGVycm9wdC4gZWFzaWVyICovCisjZW5kaWYKKyNlbmRpZiAvKiBOZWVkV2lkZVByb3RvdHlwZXMgKi8KKworI2VuZGlmIC8qIE5lZWRGdW5jdGlvblByb3RvdHlwZXMgKi8KKworI2lmbmRlZiBfWEZVTkNQUk9UT0JFR0lOCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKSAvKiBmb3IgQysrIFYyLjAgKi8KKyNkZWZpbmUgX1hGVU5DUFJPVE9CRUdJTiBleHRlcm4gIkMiIHsJLyogZG8gbm90IGxlYXZlIG9wZW4gYWNyb3NzIGluY2x1ZGVzICovCisjZGVmaW5lIF9YRlVOQ1BST1RPRU5EIH0KKyNlbHNlCisjZGVmaW5lIF9YRlVOQ1BST1RPQkVHSU4KKyNkZWZpbmUgX1hGVU5DUFJPVE9FTkQKKyNlbmRpZgorI2VuZGlmIC8qIF9YRlVOQ1BST1RPQkVHSU4gKi8KKworLyogQWRkZWQgaW4gWDExUjYuOSwgc28gYXZhaWxhYmxlIGluIGFueSB2ZXJzaW9uIG9mIG1vZHVsYXIgeHByb3RvICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDQpCisjIGRlZmluZSBfWF9TRU5USU5FTCh4KSBfX2F0dHJpYnV0ZV9fICgoX19zZW50aW5lbF9fKHgpKSkKKyNlbHNlCisjIGRlZmluZSBfWF9TRU5USU5FTCh4KQorI2VuZGlmIC8qIEdOVUMgPj0gNCAqLworCisvKiBBZGRlZCBpbiBYMTFSNi45LCBzbyBhdmFpbGFibGUgaW4gYW55IHZlcnNpb24gb2YgbW9kdWxhciB4cHJvdG8gKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gNCkgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyMgZGVmaW5lIF9YX0VYUE9SVCAgICAgIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjIGRlZmluZSBfWF9ISURERU4gICAgICBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjIGRlZmluZSBfWF9JTlRFUk5BTCAgICBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJpbnRlcm5hbCIpKSkKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1NTApCisjIGRlZmluZSBfWF9FWFBPUlQgICAgICBfX2dsb2JhbAorIyBkZWZpbmUgX1hfSElEREVOICAgICAgX19oaWRkZW4KKyMgZGVmaW5lIF9YX0lOVEVSTkFMICAgIF9faGlkZGVuCisjZWxzZSAvKiBub3QgZ2NjID49IDQgYW5kIG5vdCBTdW4gU3R1ZGlvID49IDggKi8KKyMgZGVmaW5lIF9YX0VYUE9SVAorIyBkZWZpbmUgX1hfSElEREVOCisjIGRlZmluZSBfWF9JTlRFUk5BTAorI2VuZGlmIC8qIEdOVUMgPj0gNCAqLworCisvKiByZXF1aXJlcyB4cHJvdG8gPj0gNy4wLjkgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKF9fR05VQ19fICogMTAwICsgX19HTlVDX01JTk9SX18pID49IDMwMykKKyMgZGVmaW5lIF9YX0xJS0VMWSh4KSAgIF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDEpCisjIGRlZmluZSBfWF9VTkxJS0VMWSh4KSBfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAwKQorI2Vsc2UgLyogbm90IGdjYyA+PSAzLjMgKi8KKyMgZGVmaW5lIF9YX0xJS0VMWSh4KSAgICh4KQorIyBkZWZpbmUgX1hfVU5MSUtFTFkoeCkgKHgpCisjZW5kaWYKKworLyogQWRkZWQgaW4gWDExUjYuOSwgc28gYXZhaWxhYmxlIGluIGFueSB2ZXJzaW9uIG9mIG1vZHVsYXIgeHByb3RvICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fKSA+PSAzMDEpCisjIGRlZmluZSBfWF9ERVBSRUNBVEVEICBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKKyNlbHNlIC8qIG5vdCBnY2MgPj0gMy4xICovCisjIGRlZmluZSBfWF9ERVBSRUNBVEVECisjZW5kaWYKKworLyogcmVxdWlyZXMgeHByb3RvID49IDcuMC4xNyAqLworI2lmIChkZWZpbmVkKF9fR05VQ19fKSAmJiAoKF9fR05VQ19fICogMTAwICsgX19HTlVDX01JTk9SX18pID49IDIwNSkpIFwKKwl8fCAoZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkpCisjIGRlZmluZSBfWF9OT1JFVFVSTiBfX2F0dHJpYnV0ZSgobm9yZXR1cm4pKQorI2Vsc2UKKyMgZGVmaW5lIF9YX05PUkVUVVJOCisjZW5kaWYgLyogR05VQyAgKi8KKworLyogQWRkZWQgaW4gWDExUjYuOSwgc28gYXZhaWxhYmxlIGluIGFueSB2ZXJzaW9uIG9mIG1vZHVsYXIgeHByb3RvICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fKSA+PSAyMDMpCisjIGRlZmluZSBfWF9BVFRSSUJVVEVfUFJJTlRGKHgseSkgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLHgseSkpKQorI2Vsc2UgLyogbm90IGdjYyA+PSAyLjMgKi8KKyMgZGVmaW5lIF9YX0FUVFJJQlVURV9QUklOVEYoeCx5KQorI2VuZGlmCisKKy8qIHJlcXVpcmVzIHhwcm90byA+PSA3LjAuMjIgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAgKChfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fKSA+PSAzMDMpCisjZGVmaW5lIF9YX05PTk5VTEwoYXJncy4uLikgIF9fYXR0cmlidXRlX18oKG5vbm51bGwoYXJncykpKQorI2Vsc2UKKyNkZWZpbmUgX1hfTk9OTlVMTCguLi4pICAvKiAqLworI2VuZGlmCisKKy8qIHJlcXVpcmVzIHhwcm90byA+PSA3LjAuMjIgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAgKChfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fKSA+PSAyMDUpCisjZGVmaW5lIF9YX1VOVVNFRCAgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCisjZWxzZQorI2RlZmluZSBfWF9VTlVTRUQgIC8qICovCisjZW5kaWYKKworLyogQzk5IGtleXdvcmQgImlubGluZSIgb3IgZXF1aXZhbGVudCBleHRlbnNpb25zIGluIHByZS1DOTkgY29tcGlsZXJzICovCisvKiByZXF1aXJlcyB4cHJvdG8gPj0gNy4wLjkKKyAgIChpbnRyb2R1Y2VkIGluIDcuMC44IGJ1dCBkaWRuJ3Qgc3VwcG9ydCBhbGwgY29tcGlsZXJzIHVudGlsIDcuMC45KSAqLworI2lmIGRlZmluZWQoaW5saW5lKSAvKiBhc3N1bWUgYXV0b2NvbmYgc2V0IGl0IGNvcnJlY3RseSAqLyB8fCBcCisgICAoZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiAoX19TVERDX1ZFUlNJT05fXyAtIDAgPj0gMTk5OTAxTCkpIC8qIEM5OSAqLyB8fCBcCisgICAoZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU1MCkpCisjIGRlZmluZSBfWF9JTkxJTkUgaW5saW5lCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIC8qIGdjYyB3L0M4OStleHRlbnNpb25zICovCisjIGRlZmluZSBfWF9JTkxJTkUgX19pbmxpbmVfXworI2Vsc2UKKyMgZGVmaW5lIF9YX0lOTElORQorI2VuZGlmCisKKy8qIEM5OSBrZXl3b3JkICJyZXN0cmljdCIgb3IgZXF1aXZhbGVudCBleHRlbnNpb25zIGluIHByZS1DOTkgY29tcGlsZXJzICovCisvKiByZXF1aXJlcyB4cHJvdG8gPj0gNy4wLjIxICovCisjaWZuZGVmIF9YX1JFU1RSSUNUX0tZV0QKKyMgaWYgZGVmaW5lZChyZXN0cmljdCkgLyogYXNzdW1lIGF1dG9jb25mIHNldCBpdCBjb3JyZWN0bHkgKi8gfHwgXAorICAgKGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgKF9fU1REQ19WRVJTSU9OX18gLSAwID49IDE5OTkwMUwpKSAvKiBDOTkgKi8KKyMgIGRlZmluZSBfWF9SRVNUUklDVF9LWVdEICByZXN0cmljdAorIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgLyogZ2NjIHcvQzg5K2V4dGVuc2lvbnMgKi8KKyMgIGRlZmluZSBfWF9SRVNUUklDVF9LWVdEIF9fcmVzdHJpY3RfXworIyBlbHNlCisjICBkZWZpbmUgX1hfUkVTVFJJQ1RfS1lXRAorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBfWEZVTkNQUk9UT19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGZ1bmNzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YZnVuY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTRiNjYzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGZ1bmNzLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIAorQ29weXJpZ2h0IDE5OTAsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisgKgorICovCisKKyNpZm5kZWYgX1hGVU5DU19IXworIyBkZWZpbmUgX1hGVU5DU19IXworCisjIGluY2x1ZGUgPFgxMS9Yb3NkZWZzLmg+CisKKy8qIHRoZSBvbGQgWGZ1bmNzLmgsIGZvciBwcmUtUjYgKi8KKyMgaWYgIShkZWZpbmVkKFhGcmVlODZMT0FERVIpICYmIGRlZmluZWQoSU5fTU9EVUxFKSkKKworIyAgaWZkZWYgWF9VU0VCRlVOQ1MKK3ZvaWQgYmNvcHkoKTsKK3ZvaWQgYnplcm8oKTsKK2ludCBiY21wKCk7CisjICBlbHNlCisjICAgaWYgZGVmaW5lZChTWVNWKSAmJiAhZGVmaW5lZChfX1NDT19fKSAmJiAhZGVmaW5lZChfX3N1bikgJiYgIWRlZmluZWQoX19VTklYV0FSRV9fKQorIyAgICBpbmNsdWRlIDxtZW1vcnkuaD4KK3ZvaWQgYmNvcHkoKTsKKyMgICAgZGVmaW5lIGJ6ZXJvKGIsbGVuKSBtZW1zZXQoYiwgMCwgbGVuKQorIyAgICBkZWZpbmUgYmNtcChiMSxiMixsZW4pIG1lbWNtcChiMSwgYjIsIGxlbikKKyMgICBlbHNlCisjICAgIGluY2x1ZGUgPHN0cmluZy5oPgorIyAgICBpZiBkZWZpbmVkKF9fU0NPX18pIHx8IGRlZmluZWQoX19zdW4pIHx8IGRlZmluZWQoX19VTklYV0FSRV9fKQorIyAgICAgaW5jbHVkZSA8c3RyaW5ncy5oPgorIyAgICBlbmRpZgorIyAgICBkZWZpbmUgX1hGVU5DU19IX0lOQ0xVREVEX1NUUklOR19ICisjICAgZW5kaWYKKyMgIGVuZGlmIC8qIFhfVVNFQkZVTkNTICovCisKKy8qIHRoZSBuZXcgWGZ1bmNzLmggKi8KKworLyogdGhlIEFOU0kgQyB3YXkgKi8KKyMgIGlmbmRlZiBfWEZVTkNTX0hfSU5DTFVERURfU1RSSU5HX0gKKyMgICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgIGVuZGlmCisjICB1bmRlZiBiemVybworIyAgZGVmaW5lIGJ6ZXJvKGIsbGVuKSBtZW1zZXQoYiwwLGxlbikKKworIyAgaWYgZGVmaW5lZCBXSU4zMiAmJiBkZWZpbmVkIF9fTUlOR1czMl9fCisjICAgZGVmaW5lIGJjb3B5KGIxLGIyLGxlbikgbWVtbW92ZShiMiwgYjEsIChzaXplX3QpKGxlbikpCisjICBlbmRpZgorCisjIGVuZGlmIC8qICEoZGVmaW5lZChYRnJlZTg2TE9BREVSKSAmJiBkZWZpbmVkKElOX01PRFVMRSkpICovCisKKyNlbmRpZiAvKiBfWEZVTkNTX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbGliLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0YzdjNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hsaWIuaApAQCAtMCwwICsxLDQwMjQgQEAKKy8qCisKK0NvcHlyaWdodCAxOTg1LCAxOTg2LCAxOTg3LCAxOTkxLCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisKKy8qCisgKglYbGliLmggLSBIZWFkZXIgZGVmaW5pdGlvbiBhbmQgc3VwcG9ydCBmaWxlIGZvciB0aGUgQyBzdWJyb3V0aW5lCisgKglpbnRlcmZhY2UgbGlicmFyeSAoWGxpYikgdG8gdGhlIFggV2luZG93IFN5c3RlbSBQcm90b2NvbCAoVjExKS4KKyAqCVN0cnVjdHVyZXMgYW5kIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCAiXyIgYXJlIHByaXZhdGUgdG8gdGhlIGxpYnJhcnkuCisgKi8KKyNpZm5kZWYgX1gxMV9YTElCX0hfCisjZGVmaW5lIF9YMTFfWExJQl9IXworCisjZGVmaW5lIFhsaWJTcGVjaWZpY2F0aW9uUmVsZWFzZSA2CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmIGRlZmluZWQoX19TQ09fXykgfHwgZGVmaW5lZChfX1VOSVhXQVJFX18pCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPFgxMS9YLmg+CisKKy8qIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IGRlcGVuZCBvbiB0aGVzZSB0d28gaGVhZGVycyBiZWluZyBpbmNsdWRlZCEgKi8KKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9Yb3NkZWZzLmg+CisKKyNpZm5kZWYgWF9XQ0hBUgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyNpZmRlZiBfX1VOSVhPUzJfXworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2Vsc2UKKy8qIHJlcGxhY2UgdGhpcyB3aXRoICNpbmNsdWRlIG9yIHR5cGVkZWYgYXBwcm9wcmlhdGUgZm9yIHlvdXIgc3lzdGVtICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgd2NoYXJfdDsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKElTQykgJiYgZGVmaW5lZChVU0VfWE1CVE9XQykKKyNkZWZpbmUgd2N0b21iKGEsYikJX1h3Y3RvbWIoYSxiKQorI2RlZmluZSBtYmxlbihhLGIpCV9YbWJsZW4oYSxiKQorI2lmbmRlZiBVU0VfWFdDSEFSX1NUUklORworI2RlZmluZSBtYnRvd2MoYSxiLGMpCV9YbWJ0b3djKGEsYixjKQorI2VuZGlmCisjZW5kaWYKKworZXh0ZXJuIGludAorX1htYmxlbigKKyNpZmRlZiBJU0MKKyAgICBjaGFyIGNvbnN0ICpzdHIsCisgICAgc2l6ZV90IGxlbgorI2Vsc2UKKyAgICBjaGFyICpzdHIsCisgICAgaW50IGxlbgorI2VuZGlmCisgICAgKTsKKworLyogQVBJIG1lbnRpb25pbmcgIlVURjgiIG9yICJ1dGY4IiBpcyBhbiBYRnJlZTg2IGV4dGVuc2lvbiwgaW50cm9kdWNlZCBpbgorICAgTm92ZW1iZXIgMjAwMC4gSXRzIHByZXNlbmNlIGlzIGluZGljYXRlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgbWFjcm8uICovCisjZGVmaW5lIFhfSEFWRV9VVEY4X1NUUklORyAxCisKK3R5cGVkZWYgY2hhciAqWFBvaW50ZXI7CisKKyNkZWZpbmUgQm9vbCBpbnQKKyNkZWZpbmUgU3RhdHVzIGludAorI2RlZmluZSBUcnVlIDEKKyNkZWZpbmUgRmFsc2UgMAorCisjZGVmaW5lIFF1ZXVlZEFscmVhZHkgMAorI2RlZmluZSBRdWV1ZWRBZnRlclJlYWRpbmcgMQorI2RlZmluZSBRdWV1ZWRBZnRlckZsdXNoIDIKKworI2RlZmluZSBDb25uZWN0aW9uTnVtYmVyKGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+ZmQpCisjZGVmaW5lIFJvb3RXaW5kb3coZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5yb290KQorI2RlZmluZSBEZWZhdWx0U2NyZWVuKGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+ZGVmYXVsdF9zY3JlZW4pCisjZGVmaW5lIERlZmF1bHRSb290V2luZG93KGRweSkgCShTY3JlZW5PZkRpc3BsYXkoZHB5LERlZmF1bHRTY3JlZW4oZHB5KSktPnJvb3QpCisjZGVmaW5lIERlZmF1bHRWaXN1YWwoZHB5LCBzY3IpIChTY3JlZW5PZkRpc3BsYXkoZHB5LHNjciktPnJvb3RfdmlzdWFsKQorI2RlZmluZSBEZWZhdWx0R0MoZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5kZWZhdWx0X2djKQorI2RlZmluZSBCbGFja1BpeGVsKGRweSwgc2NyKSAJKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+YmxhY2tfcGl4ZWwpCisjZGVmaW5lIFdoaXRlUGl4ZWwoZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT53aGl0ZV9waXhlbCkKKyNkZWZpbmUgQWxsUGxhbmVzIAkJKCh1bnNpZ25lZCBsb25nKX4wTCkKKyNkZWZpbmUgUUxlbmd0aChkcHkpIAkJKCgoX1hQcml2RGlzcGxheSlkcHkpLT5xbGVuKQorI2RlZmluZSBEaXNwbGF5V2lkdGgoZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT53aWR0aCkKKyNkZWZpbmUgRGlzcGxheUhlaWdodChkcHksIHNjcikgKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+aGVpZ2h0KQorI2RlZmluZSBEaXNwbGF5V2lkdGhNTShkcHksIHNjcikoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5td2lkdGgpCisjZGVmaW5lIERpc3BsYXlIZWlnaHRNTShkcHksIHNjcikoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5taGVpZ2h0KQorI2RlZmluZSBEaXNwbGF5UGxhbmVzKGRweSwgc2NyKSAoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5yb290X2RlcHRoKQorI2RlZmluZSBEaXNwbGF5Q2VsbHMoZHB5LCBzY3IpIAkoRGVmYXVsdFZpc3VhbChkcHksc2NyKS0+bWFwX2VudHJpZXMpCisjZGVmaW5lIFNjcmVlbkNvdW50KGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+bnNjcmVlbnMpCisjZGVmaW5lIFNlcnZlclZlbmRvcihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPnZlbmRvcikKKyNkZWZpbmUgUHJvdG9jb2xWZXJzaW9uKGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+cHJvdG9fbWFqb3JfdmVyc2lvbikKKyNkZWZpbmUgUHJvdG9jb2xSZXZpc2lvbihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPnByb3RvX21pbm9yX3ZlcnNpb24pCisjZGVmaW5lIFZlbmRvclJlbGVhc2UoZHB5KSAJKCgoX1hQcml2RGlzcGxheSlkcHkpLT5yZWxlYXNlKQorI2RlZmluZSBEaXNwbGF5U3RyaW5nKGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+ZGlzcGxheV9uYW1lKQorI2RlZmluZSBEZWZhdWx0RGVwdGgoZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5yb290X2RlcHRoKQorI2RlZmluZSBEZWZhdWx0Q29sb3JtYXAoZHB5LCBzY3IpKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+Y21hcCkKKyNkZWZpbmUgQml0bWFwVW5pdChkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPmJpdG1hcF91bml0KQorI2RlZmluZSBCaXRtYXBCaXRPcmRlcihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPmJpdG1hcF9iaXRfb3JkZXIpCisjZGVmaW5lIEJpdG1hcFBhZChkcHkpIAkJKCgoX1hQcml2RGlzcGxheSlkcHkpLT5iaXRtYXBfcGFkKQorI2RlZmluZSBJbWFnZUJ5dGVPcmRlcihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPmJ5dGVfb3JkZXIpCisjaWZkZWYgQ1JBWSAvKiB1bmFibGUgdG8gZ2V0IFdPUkQ2NCB3aXRob3V0IHB1bGxpbmcgaW4gb3RoZXIgc3ltYm9scyAqLworI2RlZmluZSBOZXh0UmVxdWVzdChkcHkpCVhOZXh0UmVxdWVzdChkcHkpCisjZWxzZQorI2RlZmluZSBOZXh0UmVxdWVzdChkcHkpCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+cmVxdWVzdCArIDEpCisjZW5kaWYKKyNkZWZpbmUgTGFzdEtub3duUmVxdWVzdFByb2Nlc3NlZChkcHkpCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+bGFzdF9yZXF1ZXN0X3JlYWQpCisKKy8qIG1hY3JvcyBmb3Igc2NyZWVuIG9yaWVudGVkIGFwcGxpY2F0aW9ucyAodG9vbGtpdCkgKi8KKyNkZWZpbmUgU2NyZWVuT2ZEaXNwbGF5KGRweSwgc2NyKSgmKChfWFByaXZEaXNwbGF5KWRweSktPnNjcmVlbnNbc2NyXSkKKyNkZWZpbmUgRGVmYXVsdFNjcmVlbk9mRGlzcGxheShkcHkpIFNjcmVlbk9mRGlzcGxheShkcHksRGVmYXVsdFNjcmVlbihkcHkpKQorI2RlZmluZSBEaXNwbGF5T2ZTY3JlZW4ocykJKChzKS0+ZGlzcGxheSkKKyNkZWZpbmUgUm9vdFdpbmRvd09mU2NyZWVuKHMpCSgocyktPnJvb3QpCisjZGVmaW5lIEJsYWNrUGl4ZWxPZlNjcmVlbihzKQkoKHMpLT5ibGFja19waXhlbCkKKyNkZWZpbmUgV2hpdGVQaXhlbE9mU2NyZWVuKHMpCSgocyktPndoaXRlX3BpeGVsKQorI2RlZmluZSBEZWZhdWx0Q29sb3JtYXBPZlNjcmVlbihzKSgocyktPmNtYXApCisjZGVmaW5lIERlZmF1bHREZXB0aE9mU2NyZWVuKHMpCSgocyktPnJvb3RfZGVwdGgpCisjZGVmaW5lIERlZmF1bHRHQ09mU2NyZWVuKHMpCSgocyktPmRlZmF1bHRfZ2MpCisjZGVmaW5lIERlZmF1bHRWaXN1YWxPZlNjcmVlbihzKSgocyktPnJvb3RfdmlzdWFsKQorI2RlZmluZSBXaWR0aE9mU2NyZWVuKHMpCSgocyktPndpZHRoKQorI2RlZmluZSBIZWlnaHRPZlNjcmVlbihzKQkoKHMpLT5oZWlnaHQpCisjZGVmaW5lIFdpZHRoTU1PZlNjcmVlbihzKQkoKHMpLT5td2lkdGgpCisjZGVmaW5lIEhlaWdodE1NT2ZTY3JlZW4ocykJKChzKS0+bWhlaWdodCkKKyNkZWZpbmUgUGxhbmVzT2ZTY3JlZW4ocykJKChzKS0+cm9vdF9kZXB0aCkKKyNkZWZpbmUgQ2VsbHNPZlNjcmVlbihzKQkoRGVmYXVsdFZpc3VhbE9mU2NyZWVuKChzKSktPm1hcF9lbnRyaWVzKQorI2RlZmluZSBNaW5DbWFwc09mU2NyZWVuKHMpCSgocyktPm1pbl9tYXBzKQorI2RlZmluZSBNYXhDbWFwc09mU2NyZWVuKHMpCSgocyktPm1heF9tYXBzKQorI2RlZmluZSBEb2VzU2F2ZVVuZGVycyhzKQkoKHMpLT5zYXZlX3VuZGVycykKKyNkZWZpbmUgRG9lc0JhY2tpbmdTdG9yZShzKQkoKHMpLT5iYWNraW5nX3N0b3JlKQorI2RlZmluZSBFdmVudE1hc2tPZlNjcmVlbihzKQkoKHMpLT5yb290X2lucHV0X21hc2spCisKKy8qCisgKiBFeHRlbnNpb25zIG5lZWQgYSB3YXkgdG8gaGFuZyBwcml2YXRlIGRhdGEgb24gc29tZSBzdHJ1Y3R1cmVzLgorICovCit0eXBlZGVmIHN0cnVjdCBfWEV4dERhdGEgeworCWludCBudW1iZXI7CQkvKiBudW1iZXIgcmV0dXJuZWQgYnkgWFJlZ2lzdGVyRXh0ZW5zaW9uICovCisJc3RydWN0IF9YRXh0RGF0YSAqbmV4dDsJLyogbmV4dCBpdGVtIG9uIGxpc3Qgb2YgZGF0YSBmb3Igc3RydWN0dXJlICovCisJaW50ICgqZnJlZV9wcml2YXRlKSgJLyogY2FsbGVkIHRvIGZyZWUgcHJpdmF0ZSBzdG9yYWdlICovCisJc3RydWN0IF9YRXh0RGF0YSAqZXh0ZW5zaW9uCisJKTsKKwlYUG9pbnRlciBwcml2YXRlX2RhdGE7CS8qIGRhdGEgcHJpdmF0ZSB0byB0aGlzIGV4dGVuc2lvbi4gKi8KK30gWEV4dERhdGE7CisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBleHRlbnNpb24gbWVjaGFuaXNtLgorICovCit0eXBlZGVmIHN0cnVjdCB7CQkvKiBwdWJsaWMgdG8gZXh0ZW5zaW9uLCBjYW5ub3QgYmUgY2hhbmdlZCAqLworCWludCBleHRlbnNpb247CQkvKiBleHRlbnNpb24gbnVtYmVyICovCisJaW50IG1ham9yX29wY29kZTsJLyogbWFqb3Igb3AtY29kZSBhc3NpZ25lZCBieSBzZXJ2ZXIgKi8KKwlpbnQgZmlyc3RfZXZlbnQ7CS8qIGZpcnN0IGV2ZW50IG51bWJlciBmb3IgdGhlIGV4dGVuc2lvbiAqLworCWludCBmaXJzdF9lcnJvcjsJLyogZmlyc3QgZXJyb3IgbnVtYmVyIGZvciB0aGUgZXh0ZW5zaW9uICovCit9IFhFeHRDb2RlczsKKworLyoKKyAqIERhdGEgc3RydWN0dXJlIGZvciByZXRyaWV2aW5nIGluZm8gYWJvdXQgcGl4bWFwIGZvcm1hdHMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBkZXB0aDsKKyAgICBpbnQgYml0c19wZXJfcGl4ZWw7CisgICAgaW50IHNjYW5saW5lX3BhZDsKK30gWFBpeG1hcEZvcm1hdFZhbHVlczsKKworCisvKgorICogRGF0YSBzdHJ1Y3R1cmUgZm9yIHNldHRpbmcgZ3JhcGhpY3MgY29udGV4dC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBmdW5jdGlvbjsJCS8qIGxvZ2ljYWwgb3BlcmF0aW9uICovCisJdW5zaWduZWQgbG9uZyBwbGFuZV9tYXNrOy8qIHBsYW5lIG1hc2sgKi8KKwl1bnNpZ25lZCBsb25nIGZvcmVncm91bmQ7LyogZm9yZWdyb3VuZCBwaXhlbCAqLworCXVuc2lnbmVkIGxvbmcgYmFja2dyb3VuZDsvKiBiYWNrZ3JvdW5kIHBpeGVsICovCisJaW50IGxpbmVfd2lkdGg7CQkvKiBsaW5lIHdpZHRoICovCisJaW50IGxpbmVfc3R5bGU7CSAJLyogTGluZVNvbGlkLCBMaW5lT25PZmZEYXNoLCBMaW5lRG91YmxlRGFzaCAqLworCWludCBjYXBfc3R5bGU7CSAgCS8qIENhcE5vdExhc3QsIENhcEJ1dHQsCisJCQkJICAgQ2FwUm91bmQsIENhcFByb2plY3RpbmcgKi8KKwlpbnQgam9pbl9zdHlsZTsJIAkvKiBKb2luTWl0ZXIsIEpvaW5Sb3VuZCwgSm9pbkJldmVsICovCisJaW50IGZpbGxfc3R5bGU7CSAJLyogRmlsbFNvbGlkLCBGaWxsVGlsZWQsCisJCQkJICAgRmlsbFN0aXBwbGVkLCBGaWxsT3BhZXVlU3RpcHBsZWQgKi8KKwlpbnQgZmlsbF9ydWxlOwkgIAkvKiBFdmVuT2RkUnVsZSwgV2luZGluZ1J1bGUgKi8KKwlpbnQgYXJjX21vZGU7CQkvKiBBcmNDaG9yZCwgQXJjUGllU2xpY2UgKi8KKwlQaXhtYXAgdGlsZTsJCS8qIHRpbGUgcGl4bWFwIGZvciB0aWxpbmcgb3BlcmF0aW9ucyAqLworCVBpeG1hcCBzdGlwcGxlOwkJLyogc3RpcHBsZSAxIHBsYW5lIHBpeG1hcCBmb3Igc3RpcHBpbmcgKi8KKwlpbnQgdHNfeF9vcmlnaW47CS8qIG9mZnNldCBmb3IgdGlsZSBvciBzdGlwcGxlIG9wZXJhdGlvbnMgKi8KKwlpbnQgdHNfeV9vcmlnaW47CisgICAgICAgIEZvbnQgZm9udDsJICAgICAgICAvKiBkZWZhdWx0IHRleHQgZm9udCBmb3IgdGV4dCBvcGVyYXRpb25zICovCisJaW50IHN1YndpbmRvd19tb2RlOyAgICAgLyogQ2xpcEJ5Q2hpbGRyZW4sIEluY2x1ZGVJbmZlcmlvcnMgKi8KKwlCb29sIGdyYXBoaWNzX2V4cG9zdXJlczsvKiBib29sZWFuLCBzaG91bGQgZXhwb3N1cmVzIGJlIGdlbmVyYXRlZCAqLworCWludCBjbGlwX3hfb3JpZ2luOwkvKiBvcmlnaW4gZm9yIGNsaXBwaW5nICovCisJaW50IGNsaXBfeV9vcmlnaW47CisJUGl4bWFwIGNsaXBfbWFzazsJLyogYml0bWFwIGNsaXBwaW5nOyBvdGhlciBjYWxscyBmb3IgcmVjdHMgKi8KKwlpbnQgZGFzaF9vZmZzZXQ7CS8qIHBhdHRlcm5lZC9kYXNoZWQgbGluZSBpbmZvcm1hdGlvbiAqLworCWNoYXIgZGFzaGVzOworfSBYR0NWYWx1ZXM7CisKKy8qCisgKiBHcmFwaGljcyBjb250ZXh0LiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RydWN0dXJlIGFyZSBpbXBsZW1lbnRhdGlvbgorICogZGVwZW5kZW50LiAgQSBHQyBzaG91bGQgYmUgdHJlYXRlZCBhcyBvcGFxdWUgYnkgYXBwbGljYXRpb24gY29kZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBfWEdDCisjaWZkZWYgWExJQl9JTExFR0FMX0FDQ0VTUworeworICAgIFhFeHREYXRhICpleHRfZGF0YTsJLyogaG9vayBmb3IgZXh0ZW5zaW9uIHRvIGhhbmcgZGF0YSAqLworICAgIEdDb250ZXh0IGdpZDsJLyogcHJvdG9jb2wgSUQgZm9yIGdyYXBoaWNzIGNvbnRleHQgKi8KKyAgICAvKiB0aGVyZSBpcyBtb3JlIHRvIHRoaXMgc3RydWN0dXJlLCBidXQgaXQgaXMgcHJpdmF0ZSB0byBYbGliICovCit9CisjZW5kaWYKKypHQzsKKworLyoKKyAqIFZpc3VhbCBzdHJ1Y3R1cmU7IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGNvbG9ybWFwcGluZyBwb3NzaWJsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCVhFeHREYXRhICpleHRfZGF0YTsJLyogaG9vayBmb3IgZXh0ZW5zaW9uIHRvIGhhbmcgZGF0YSAqLworCVZpc3VhbElEIHZpc3VhbGlkOwkvKiB2aXN1YWwgaWQgb2YgdGhpcyB2aXN1YWwgKi8KKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisJaW50IGNfY2xhc3M7CQkvKiBDKysgY2xhc3Mgb2Ygc2NyZWVuIChtb25vY2hyb21lLCBldGMuKSAqLworI2Vsc2UKKwlpbnQgY2xhc3M7CQkvKiBjbGFzcyBvZiBzY3JlZW4gKG1vbm9jaHJvbWUsIGV0Yy4pICovCisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2s7CS8qIG1hc2sgdmFsdWVzICovCisJaW50IGJpdHNfcGVyX3JnYjsJLyogbG9nIGJhc2UgMiBvZiBkaXN0aW5jdCBjb2xvciB2YWx1ZXMgKi8KKwlpbnQgbWFwX2VudHJpZXM7CS8qIGNvbG9yIG1hcCBlbnRyaWVzICovCit9IFZpc3VhbDsKKworLyoKKyAqIERlcHRoIHN0cnVjdHVyZTsgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIGVhY2ggcG9zc2libGUgZGVwdGguCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgZGVwdGg7CQkvKiB0aGlzIGRlcHRoIChaKSBvZiB0aGUgZGVwdGggKi8KKwlpbnQgbnZpc3VhbHM7CQkvKiBudW1iZXIgb2YgVmlzdWFsIHR5cGVzIGF0IHRoaXMgZGVwdGggKi8KKwlWaXN1YWwgKnZpc3VhbHM7CS8qIGxpc3Qgb2YgdmlzdWFscyBwb3NzaWJsZSBhdCB0aGlzIGRlcHRoICovCit9IERlcHRoOworCisvKgorICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjcmVlbi4gIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUKKyAqIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4gIEEgU2NyZWVuIHNob3VsZCBiZSB0cmVhdGVkIGFzIG9wYXF1ZQorICogYnkgYXBwbGljYXRpb24gY29kZS4KKyAqLworCitzdHJ1Y3QgX1hEaXNwbGF5OwkJLyogRm9yd2FyZCBkZWNsYXJlIGJlZm9yZSB1c2UgZm9yIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCisJc3RydWN0IF9YRGlzcGxheSAqZGlzcGxheTsvKiBiYWNrIHBvaW50ZXIgdG8gZGlzcGxheSBzdHJ1Y3R1cmUgKi8KKwlXaW5kb3cgcm9vdDsJCS8qIFJvb3Qgd2luZG93IGlkLiAqLworCWludCB3aWR0aCwgaGVpZ2h0OwkvKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHNjcmVlbiAqLworCWludCBtd2lkdGgsIG1oZWlnaHQ7CS8qIHdpZHRoIGFuZCBoZWlnaHQgb2YgIGluIG1pbGxpbWV0ZXJzICovCisJaW50IG5kZXB0aHM7CQkvKiBudW1iZXIgb2YgZGVwdGhzIHBvc3NpYmxlICovCisJRGVwdGggKmRlcHRoczsJCS8qIGxpc3Qgb2YgYWxsb3dhYmxlIGRlcHRocyBvbiB0aGUgc2NyZWVuICovCisJaW50IHJvb3RfZGVwdGg7CQkvKiBiaXRzIHBlciBwaXhlbCAqLworCVZpc3VhbCAqcm9vdF92aXN1YWw7CS8qIHJvb3QgdmlzdWFsICovCisJR0MgZGVmYXVsdF9nYzsJCS8qIEdDIGZvciB0aGUgcm9vdCByb290IHZpc3VhbCAqLworCUNvbG9ybWFwIGNtYXA7CQkvKiBkZWZhdWx0IGNvbG9yIG1hcCAqLworCXVuc2lnbmVkIGxvbmcgd2hpdGVfcGl4ZWw7CisJdW5zaWduZWQgbG9uZyBibGFja19waXhlbDsJLyogV2hpdGUgYW5kIEJsYWNrIHBpeGVsIHZhbHVlcyAqLworCWludCBtYXhfbWFwcywgbWluX21hcHM7CS8qIG1heCBhbmQgbWluIGNvbG9yIG1hcHMgKi8KKwlpbnQgYmFja2luZ19zdG9yZTsJLyogTmV2ZXIsIFdoZW5NYXBwZWQsIEFsd2F5cyAqLworCUJvb2wgc2F2ZV91bmRlcnM7CisJbG9uZyByb290X2lucHV0X21hc2s7CS8qIGluaXRpYWwgcm9vdCBpbnB1dCBtYXNrICovCit9IFNjcmVlbjsKKworLyoKKyAqIEZvcm1hdCBzdHJ1Y3R1cmU7IGRlc2NyaWJlcyBaRm9ybWF0IGRhdGEgdGhlIHNjcmVlbiB3aWxsIHVuZGVyc3RhbmQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlYRXh0RGF0YSAqZXh0X2RhdGE7CS8qIGhvb2sgZm9yIGV4dGVuc2lvbiB0byBoYW5nIGRhdGEgKi8KKwlpbnQgZGVwdGg7CQkvKiBkZXB0aCBvZiB0aGlzIGltYWdlIGZvcm1hdCAqLworCWludCBiaXRzX3Blcl9waXhlbDsJLyogYml0cy9waXhlbCBhdCB0aGlzIGRlcHRoICovCisJaW50IHNjYW5saW5lX3BhZDsJLyogc2NhbmxpbmUgbXVzdCBwYWRkZWQgdG8gdGhpcyBtdWx0aXBsZSAqLworfSBTY3JlZW5Gb3JtYXQ7CisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZSBmb3Igc2V0dGluZyB3aW5kb3cgYXR0cmlidXRlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFBpeG1hcCBiYWNrZ3JvdW5kX3BpeG1hcDsJLyogYmFja2dyb3VuZCBvciBOb25lIG9yIFBhcmVudFJlbGF0aXZlICovCisgICAgdW5zaWduZWQgbG9uZyBiYWNrZ3JvdW5kX3BpeGVsOwkvKiBiYWNrZ3JvdW5kIHBpeGVsICovCisgICAgUGl4bWFwIGJvcmRlcl9waXhtYXA7CS8qIGJvcmRlciBvZiB0aGUgd2luZG93ICovCisgICAgdW5zaWduZWQgbG9uZyBib3JkZXJfcGl4ZWw7CS8qIGJvcmRlciBwaXhlbCB2YWx1ZSAqLworICAgIGludCBiaXRfZ3Jhdml0eTsJCS8qIG9uZSBvZiBiaXQgZ3Jhdml0eSB2YWx1ZXMgKi8KKyAgICBpbnQgd2luX2dyYXZpdHk7CQkvKiBvbmUgb2YgdGhlIHdpbmRvdyBncmF2aXR5IHZhbHVlcyAqLworICAgIGludCBiYWNraW5nX3N0b3JlOwkJLyogTm90VXNlZnVsLCBXaGVuTWFwcGVkLCBBbHdheXMgKi8KKyAgICB1bnNpZ25lZCBsb25nIGJhY2tpbmdfcGxhbmVzOy8qIHBsYW5lcyB0byBiZSBwcmVzZXZlZCBpZiBwb3NzaWJsZSAqLworICAgIHVuc2lnbmVkIGxvbmcgYmFja2luZ19waXhlbDsvKiB2YWx1ZSB0byB1c2UgaW4gcmVzdG9yaW5nIHBsYW5lcyAqLworICAgIEJvb2wgc2F2ZV91bmRlcjsJCS8qIHNob3VsZCBiaXRzIHVuZGVyIGJlIHNhdmVkPyAocG9wdXBzKSAqLworICAgIGxvbmcgZXZlbnRfbWFzazsJCS8qIHNldCBvZiBldmVudHMgdGhhdCBzaG91bGQgYmUgc2F2ZWQgKi8KKyAgICBsb25nIGRvX25vdF9wcm9wYWdhdGVfbWFzazsJLyogc2V0IG9mIGV2ZW50cyB0aGF0IHNob3VsZCBub3QgcHJvcGFnYXRlICovCisgICAgQm9vbCBvdmVycmlkZV9yZWRpcmVjdDsJLyogYm9vbGVhbiB2YWx1ZSBmb3Igb3ZlcnJpZGUtcmVkaXJlY3QgKi8KKyAgICBDb2xvcm1hcCBjb2xvcm1hcDsJCS8qIGNvbG9yIG1hcCB0byBiZSBhc3NvY2lhdGVkIHdpdGggd2luZG93ICovCisgICAgQ3Vyc29yIGN1cnNvcjsJCS8qIGN1cnNvciB0byBiZSBkaXNwbGF5ZWQgKG9yIE5vbmUpICovCit9IFhTZXRXaW5kb3dBdHRyaWJ1dGVzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHgsIHk7CQkJLyogbG9jYXRpb24gb2Ygd2luZG93ICovCisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CQkvKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHdpbmRvdyAqLworICAgIGludCBib3JkZXJfd2lkdGg7CQkvKiBib3JkZXIgd2lkdGggb2Ygd2luZG93ICovCisgICAgaW50IGRlcHRoOyAgICAgICAgICAJLyogZGVwdGggb2Ygd2luZG93ICovCisgICAgVmlzdWFsICp2aXN1YWw7CQkvKiB0aGUgYXNzb2NpYXRlZCB2aXN1YWwgc3RydWN0dXJlICovCisgICAgV2luZG93IHJvb3Q7ICAgICAgICAJLyogcm9vdCBvZiBzY3JlZW4gY29udGFpbmluZyB3aW5kb3cgKi8KKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgaW50IGNfY2xhc3M7CQkvKiBDKysgSW5wdXRPdXRwdXQsIElucHV0T25seSovCisjZWxzZQorICAgIGludCBjbGFzczsJCQkvKiBJbnB1dE91dHB1dCwgSW5wdXRPbmx5Ki8KKyNlbmRpZgorICAgIGludCBiaXRfZ3Jhdml0eTsJCS8qIG9uZSBvZiBiaXQgZ3Jhdml0eSB2YWx1ZXMgKi8KKyAgICBpbnQgd2luX2dyYXZpdHk7CQkvKiBvbmUgb2YgdGhlIHdpbmRvdyBncmF2aXR5IHZhbHVlcyAqLworICAgIGludCBiYWNraW5nX3N0b3JlOwkJLyogTm90VXNlZnVsLCBXaGVuTWFwcGVkLCBBbHdheXMgKi8KKyAgICB1bnNpZ25lZCBsb25nIGJhY2tpbmdfcGxhbmVzOy8qIHBsYW5lcyB0byBiZSBwcmVzZXJ2ZWQgaWYgcG9zc2libGUgKi8KKyAgICB1bnNpZ25lZCBsb25nIGJhY2tpbmdfcGl4ZWw7LyogdmFsdWUgdG8gYmUgdXNlZCB3aGVuIHJlc3RvcmluZyBwbGFuZXMgKi8KKyAgICBCb29sIHNhdmVfdW5kZXI7CQkvKiBib29sZWFuLCBzaG91bGQgYml0cyB1bmRlciBiZSBzYXZlZD8gKi8KKyAgICBDb2xvcm1hcCBjb2xvcm1hcDsJCS8qIGNvbG9yIG1hcCB0byBiZSBhc3NvY2lhdGVkIHdpdGggd2luZG93ICovCisgICAgQm9vbCBtYXBfaW5zdGFsbGVkOwkJLyogYm9vbGVhbiwgaXMgY29sb3IgbWFwIGN1cnJlbnRseSBpbnN0YWxsZWQqLworICAgIGludCBtYXBfc3RhdGU7CQkvKiBJc1VubWFwcGVkLCBJc1Vudmlld2FibGUsIElzVmlld2FibGUgKi8KKyAgICBsb25nIGFsbF9ldmVudF9tYXNrczsJLyogc2V0IG9mIGV2ZW50cyBhbGwgcGVvcGxlIGhhdmUgaW50ZXJlc3QgaW4qLworICAgIGxvbmcgeW91cl9ldmVudF9tYXNrOwkvKiBteSBldmVudCBtYXNrICovCisgICAgbG9uZyBkb19ub3RfcHJvcGFnYXRlX21hc2s7IC8qIHNldCBvZiBldmVudHMgdGhhdCBzaG91bGQgbm90IHByb3BhZ2F0ZSAqLworICAgIEJvb2wgb3ZlcnJpZGVfcmVkaXJlY3Q7CS8qIGJvb2xlYW4gdmFsdWUgZm9yIG92ZXJyaWRlLXJlZGlyZWN0ICovCisgICAgU2NyZWVuICpzY3JlZW47CQkvKiBiYWNrIHBvaW50ZXIgdG8gY29ycmVjdCBzY3JlZW4gKi8KK30gWFdpbmRvd0F0dHJpYnV0ZXM7CisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZSBmb3IgaG9zdCBzZXR0aW5nOyBnZXR0aW5nIHJvdXRpbmVzLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGZhbWlseTsJCS8qIGZvciBleGFtcGxlIEZhbWlseUludGVybmV0ICovCisJaW50IGxlbmd0aDsJCS8qIGxlbmd0aCBvZiBhZGRyZXNzLCBpbiBieXRlcyAqLworCWNoYXIgKmFkZHJlc3M7CQkvKiBwb2ludGVyIHRvIHdoZXJlIHRvIGZpbmQgdGhlIGJ5dGVzICovCit9IFhIb3N0QWRkcmVzczsKKworLyoKKyAqIERhdGEgc3RydWN0dXJlIGZvciBTZXJ2ZXJGYW1pbHlJbnRlcnByZXRlZCBhZGRyZXNzZXMgaW4gaG9zdCByb3V0aW5lcworICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGVsZW5ndGg7CQkvKiBsZW5ndGggb2YgdHlwZSBzdHJpbmcsIGluIGJ5dGVzICovCisJaW50IHZhbHVlbGVuZ3RoOwkvKiBsZW5ndGggb2YgdmFsdWUgc3RyaW5nLCBpbiBieXRlcyAqLworCWNoYXIgKnR5cGU7CQkvKiBwb2ludGVyIHRvIHdoZXJlIHRvIGZpbmQgdGhlIHR5cGUgc3RyaW5nICovCisJY2hhciAqdmFsdWU7CQkvKiBwb2ludGVyIHRvIHdoZXJlIHRvIGZpbmQgdGhlIGFkZHJlc3MgKi8KK30gWFNlcnZlckludGVycHJldGVkQWRkcmVzczsKKworLyoKKyAqIERhdGEgc3RydWN0dXJlIGZvciAiaW1hZ2UiIGRhdGEsIHVzZWQgYnkgaW1hZ2UgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLgorICovCit0eXBlZGVmIHN0cnVjdCBfWEltYWdlIHsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsJCS8qIHNpemUgb2YgaW1hZ2UgKi8KKyAgICBpbnQgeG9mZnNldDsJCS8qIG51bWJlciBvZiBwaXhlbHMgb2Zmc2V0IGluIFggZGlyZWN0aW9uICovCisgICAgaW50IGZvcm1hdDsJCQkvKiBYWUJpdG1hcCwgWFlQaXhtYXAsIFpQaXhtYXAgKi8KKyAgICBjaGFyICpkYXRhOwkJCS8qIHBvaW50ZXIgdG8gaW1hZ2UgZGF0YSAqLworICAgIGludCBieXRlX29yZGVyOwkJLyogZGF0YSBieXRlIG9yZGVyLCBMU0JGaXJzdCwgTVNCRmlyc3QgKi8KKyAgICBpbnQgYml0bWFwX3VuaXQ7CQkvKiBxdWFudC4gb2Ygc2NhbmxpbmUgOCwgMTYsIDMyICovCisgICAgaW50IGJpdG1hcF9iaXRfb3JkZXI7CS8qIExTQkZpcnN0LCBNU0JGaXJzdCAqLworICAgIGludCBiaXRtYXBfcGFkOwkJLyogOCwgMTYsIDMyIGVpdGhlciBYWSBvciBaUGl4bWFwICovCisgICAgaW50IGRlcHRoOwkJCS8qIGRlcHRoIG9mIGltYWdlICovCisgICAgaW50IGJ5dGVzX3Blcl9saW5lOwkJLyogYWNjZWxhcmF0b3IgdG8gbmV4dCBsaW5lICovCisgICAgaW50IGJpdHNfcGVyX3BpeGVsOwkJLyogYml0cyBwZXIgcGl4ZWwgKFpQaXhtYXApICovCisgICAgdW5zaWduZWQgbG9uZyByZWRfbWFzazsJLyogYml0cyBpbiB6IGFycmFuZ21lbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIGdyZWVuX21hc2s7CisgICAgdW5zaWduZWQgbG9uZyBibHVlX21hc2s7CisgICAgWFBvaW50ZXIgb2JkYXRhOwkJLyogaG9vayBmb3IgdGhlIG9iamVjdCByb3V0aW5lcyB0byBoYW5nIG9uICovCisgICAgc3RydWN0IGZ1bmNzIHsJCS8qIGltYWdlIG1hbmlwdWxhdGlvbiByb3V0aW5lcyAqLworCXN0cnVjdCBfWEltYWdlICooKmNyZWF0ZV9pbWFnZSkoCisJCXN0cnVjdCBfWERpc3BsYXkqIC8qIGRpc3BsYXkgKi8sCisJCVZpc3VhbCoJCS8qIHZpc3VhbCAqLywKKwkJdW5zaWduZWQgaW50CS8qIGRlcHRoICovLAorCQlpbnQJCS8qIGZvcm1hdCAqLywKKwkJaW50CQkvKiBvZmZzZXQgKi8sCisJCWNoYXIqCQkvKiBkYXRhICovLAorCQl1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisJCXVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisJCWludAkJLyogYml0bWFwX3BhZCAqLywKKwkJaW50CQkvKiBieXRlc19wZXJfbGluZSAqLyk7CisJaW50ICgqZGVzdHJveV9pbWFnZSkgICAgICAgIChzdHJ1Y3QgX1hJbWFnZSAqKTsKKwl1bnNpZ25lZCBsb25nICgqZ2V0X3BpeGVsKSAgKHN0cnVjdCBfWEltYWdlICosIGludCwgaW50KTsKKwlpbnQgKCpwdXRfcGl4ZWwpICAgICAgICAgICAgKHN0cnVjdCBfWEltYWdlICosIGludCwgaW50LCB1bnNpZ25lZCBsb25nKTsKKwlzdHJ1Y3QgX1hJbWFnZSAqKCpzdWJfaW1hZ2UpKHN0cnVjdCBfWEltYWdlICosIGludCwgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CisJaW50ICgqYWRkX3BpeGVsKSAgICAgICAgICAgIChzdHJ1Y3QgX1hJbWFnZSAqLCBsb25nKTsKKwl9IGY7Cit9IFhJbWFnZTsKKworLyoKKyAqIERhdGEgc3RydWN0dXJlIGZvciBYUmVjb25maWd1cmVXaW5kb3cKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB4LCB5OworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGludCBib3JkZXJfd2lkdGg7CisgICAgV2luZG93IHNpYmxpbmc7CisgICAgaW50IHN0YWNrX21vZGU7Cit9IFhXaW5kb3dDaGFuZ2VzOworCisvKgorICogRGF0YSBzdHJ1Y3R1cmUgdXNlZCBieSBjb2xvciBvcGVyYXRpb25zCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIHBpeGVsOworCXVuc2lnbmVkIHNob3J0IHJlZCwgZ3JlZW4sIGJsdWU7CisJY2hhciBmbGFnczsgIC8qIGRvX3JlZCwgZG9fZ3JlZW4sIGRvX2JsdWUgKi8KKwljaGFyIHBhZDsKK30gWENvbG9yOworCisvKgorICogRGF0YSBzdHJ1Y3R1cmVzIGZvciBncmFwaGljcyBvcGVyYXRpb25zLiAgT24gbW9zdCBtYWNoaW5lcywgdGhlc2UgYXJlCisgKiBjb25ncnVlbnQgd2l0aCB0aGUgd2lyZSBwcm90b2NvbCBzdHJ1Y3R1cmVzLCBzbyByZWZvcm1hdHRpbmcgdGhlIGRhdGEKKyAqIGNhbiBiZSBhdm9pZGVkIG9uIHRoZXNlIGFyY2hpdGVjdHVyZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydCB4MSwgeTEsIHgyLCB5MjsKK30gWFNlZ21lbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydCB4LCB5OworfSBYUG9pbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydCB4LCB5OworICAgIHVuc2lnbmVkIHNob3J0IHdpZHRoLCBoZWlnaHQ7Cit9IFhSZWN0YW5nbGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydCB4LCB5OworICAgIHVuc2lnbmVkIHNob3J0IHdpZHRoLCBoZWlnaHQ7CisgICAgc2hvcnQgYW5nbGUxLCBhbmdsZTI7Cit9IFhBcmM7CisKKworLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIFhDaGFuZ2VLZXlib2FyZENvbnRyb2wgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBpbnQga2V5X2NsaWNrX3BlcmNlbnQ7CisgICAgICAgIGludCBiZWxsX3BlcmNlbnQ7CisgICAgICAgIGludCBiZWxsX3BpdGNoOworICAgICAgICBpbnQgYmVsbF9kdXJhdGlvbjsKKyAgICAgICAgaW50IGxlZDsKKyAgICAgICAgaW50IGxlZF9tb2RlOworICAgICAgICBpbnQga2V5OworICAgICAgICBpbnQgYXV0b19yZXBlYXRfbW9kZTsgICAvKiBPbiwgT2ZmLCBEZWZhdWx0ICovCit9IFhLZXlib2FyZENvbnRyb2w7CisKKy8qIERhdGEgc3RydWN0dXJlIGZvciBYR2V0S2V5Ym9hcmRDb250cm9sICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50IGtleV9jbGlja19wZXJjZW50OworCWludCBiZWxsX3BlcmNlbnQ7CisJdW5zaWduZWQgaW50IGJlbGxfcGl0Y2gsIGJlbGxfZHVyYXRpb247CisJdW5zaWduZWQgbG9uZyBsZWRfbWFzazsKKwlpbnQgZ2xvYmFsX2F1dG9fcmVwZWF0OworCWNoYXIgYXV0b19yZXBlYXRzWzMyXTsKK30gWEtleWJvYXJkU3RhdGU7CisKKy8qIERhdGEgc3RydWN0dXJlIGZvciBYR2V0TW90aW9uRXZlbnRzLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBUaW1lIHRpbWU7CisJc2hvcnQgeCwgeTsKK30gWFRpbWVDb29yZDsKKworLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIFh7U2V0LEdldH1Nb2RpZmllck1hcHBpbmcgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworIAlpbnQgbWF4X2tleXBlcm1vZDsJLyogVGhlIHNlcnZlcidzIG1heCAjIG9mIGtleXMgcGVyIG1vZGlmaWVyICovCisgCUtleUNvZGUgKm1vZGlmaWVybWFwOwkvKiBBbiA4IGJ5IG1heF9rZXlwZXJtb2QgYXJyYXkgb2YgbW9kaWZpZXJzICovCit9IFhNb2RpZmllcktleW1hcDsKKworCisvKgorICogRGlzcGxheSBkYXRhdHlwZSBtYWludGFpbmluZyBkaXNwbGF5IHNwZWNpZmljIGRhdGEuCisgKiBUaGUgY29udGVudHMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4KKyAqIEEgRGlzcGxheSBzaG91bGQgYmUgdHJlYXRlZCBhcyBvcGFxdWUgYnkgYXBwbGljYXRpb24gY29kZS4KKyAqLworI2lmbmRlZiBYTElCX0lMTEVHQUxfQUNDRVNTCit0eXBlZGVmIHN0cnVjdCBfWERpc3BsYXkgRGlzcGxheTsKKyNlbmRpZgorCitzdHJ1Y3QgX1hQcml2YXRlOwkJLyogRm9yd2FyZCBkZWNsYXJlIGJlZm9yZSB1c2UgZm9yIEMrKyAqLworc3RydWN0IF9Ycm1IYXNoQnVja2V0UmVjOworCit0eXBlZGVmIHN0cnVjdAorI2lmZGVmIFhMSUJfSUxMRUdBTF9BQ0NFU1MKK19YRGlzcGxheQorI2VuZGlmCit7CisJWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCisJc3RydWN0IF9YUHJpdmF0ZSAqcHJpdmF0ZTE7CisJaW50IGZkOwkJCS8qIE5ldHdvcmsgc29ja2V0LiAqLworCWludCBwcml2YXRlMjsKKwlpbnQgcHJvdG9fbWFqb3JfdmVyc2lvbjsvKiBtYWpvciB2ZXJzaW9uIG9mIHNlcnZlcidzIFggcHJvdG9jb2wgKi8KKwlpbnQgcHJvdG9fbWlub3JfdmVyc2lvbjsvKiBtaW5vciB2ZXJzaW9uIG9mIHNlcnZlcnMgWCBwcm90b2NvbCAqLworCWNoYXIgKnZlbmRvcjsJCS8qIHZlbmRvciBvZiB0aGUgc2VydmVyIGhhcmR3YXJlICovCisgICAgICAgIFhJRCBwcml2YXRlMzsKKwlYSUQgcHJpdmF0ZTQ7CisJWElEIHByaXZhdGU1OworCWludCBwcml2YXRlNjsKKwlYSUQgKCpyZXNvdXJjZV9hbGxvYykoCS8qIGFsbG9jYXRvciBmdW5jdGlvbiAqLworCQlzdHJ1Y3QgX1hEaXNwbGF5KgorCSk7CisJaW50IGJ5dGVfb3JkZXI7CQkvKiBzY3JlZW4gYnl0ZSBvcmRlciwgTFNCRmlyc3QsIE1TQkZpcnN0ICovCisJaW50IGJpdG1hcF91bml0OwkvKiBwYWRkaW5nIGFuZCBkYXRhIHJlcXVpcmVtZW50cyAqLworCWludCBiaXRtYXBfcGFkOwkJLyogcGFkZGluZyByZXF1aXJlbWVudHMgb24gYml0bWFwcyAqLworCWludCBiaXRtYXBfYml0X29yZGVyOwkvKiBMZWFzdFNpZ25pZmljYW50IG9yIE1vc3RTaWduaWZpY2FudCAqLworCWludCBuZm9ybWF0czsJCS8qIG51bWJlciBvZiBwaXhtYXAgZm9ybWF0cyBpbiBsaXN0ICovCisJU2NyZWVuRm9ybWF0ICpwaXhtYXBfZm9ybWF0OwkvKiBwaXhtYXAgZm9ybWF0IGxpc3QgKi8KKwlpbnQgcHJpdmF0ZTg7CisJaW50IHJlbGVhc2U7CQkvKiByZWxlYXNlIG9mIHRoZSBzZXJ2ZXIgKi8KKwlzdHJ1Y3QgX1hQcml2YXRlICpwcml2YXRlOSwgKnByaXZhdGUxMDsKKwlpbnQgcWxlbjsJCS8qIExlbmd0aCBvZiBpbnB1dCBldmVudCBxdWV1ZSAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9yZXF1ZXN0X3JlYWQ7IC8qIHNlcSBudW1iZXIgb2YgbGFzdCBldmVudCByZWFkICovCisJdW5zaWduZWQgbG9uZyByZXF1ZXN0OwkvKiBzZXF1ZW5jZSBudW1iZXIgb2YgbGFzdCByZXF1ZXN0LiAqLworCVhQb2ludGVyIHByaXZhdGUxMTsKKwlYUG9pbnRlciBwcml2YXRlMTI7CisJWFBvaW50ZXIgcHJpdmF0ZTEzOworCVhQb2ludGVyIHByaXZhdGUxNDsKKwl1bnNpZ25lZCBtYXhfcmVxdWVzdF9zaXplOyAvKiBtYXhpbXVtIG51bWJlciAzMiBiaXQgd29yZHMgaW4gcmVxdWVzdCovCisJc3RydWN0IF9Ycm1IYXNoQnVja2V0UmVjICpkYjsKKwlpbnQgKCpwcml2YXRlMTUpKAorCQlzdHJ1Y3QgX1hEaXNwbGF5KgorCQkpOworCWNoYXIgKmRpc3BsYXlfbmFtZTsJLyogImhvc3Q6ZGlzcGxheSIgc3RyaW5nIHVzZWQgb24gdGhpcyBjb25uZWN0Ki8KKwlpbnQgZGVmYXVsdF9zY3JlZW47CS8qIGRlZmF1bHQgc2NyZWVuIGZvciBvcGVyYXRpb25zICovCisJaW50IG5zY3JlZW5zOwkJLyogbnVtYmVyIG9mIHNjcmVlbnMgb24gdGhpcyBzZXJ2ZXIqLworCVNjcmVlbiAqc2NyZWVuczsJLyogcG9pbnRlciB0byBsaXN0IG9mIHNjcmVlbnMgKi8KKwl1bnNpZ25lZCBsb25nIG1vdGlvbl9idWZmZXI7CS8qIHNpemUgb2YgbW90aW9uIGJ1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZTE2OworCWludCBtaW5fa2V5Y29kZTsJLyogbWluaW11bSBkZWZpbmVkIGtleWNvZGUgKi8KKwlpbnQgbWF4X2tleWNvZGU7CS8qIG1heGltdW0gZGVmaW5lZCBrZXljb2RlICovCisJWFBvaW50ZXIgcHJpdmF0ZTE3OworCVhQb2ludGVyIHByaXZhdGUxODsKKwlpbnQgcHJpdmF0ZTE5OworCWNoYXIgKnhkZWZhdWx0czsJLyogY29udGVudHMgb2YgZGVmYXVsdHMgZnJvbSBzZXJ2ZXIgKi8KKwkvKiB0aGVyZSBpcyBtb3JlIHRvIHRoaXMgc3RydWN0dXJlLCBidXQgaXQgaXMgcHJpdmF0ZSB0byBYbGliICovCit9CisjaWZkZWYgWExJQl9JTExFR0FMX0FDQ0VTUworRGlzcGxheSwKKyNlbmRpZgorKl9YUHJpdkRpc3BsYXk7CisKKyN1bmRlZiBfWEVWRU5UXworI2lmbmRlZiBfWEVWRU5UXworLyoKKyAqIERlZmluaXRpb25zIG9mIHNwZWNpZmljIGV2ZW50cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOwkJLyogb2YgZXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CSAgICAgICAgLyogImV2ZW50IiB3aW5kb3cgaXQgaXMgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gKi8KKwlXaW5kb3cgcm9vdDsJICAgICAgICAvKiByb290IHdpbmRvdyB0aGF0IHRoZSBldmVudCBvY2N1cnJlZCBvbiAqLworCVdpbmRvdyBzdWJ3aW5kb3c7CS8qIGNoaWxkIHdpbmRvdyAqLworCVRpbWUgdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCB4LCB5OwkJLyogcG9pbnRlciB4LCB5IGNvb3JkaW5hdGVzIGluIGV2ZW50IHdpbmRvdyAqLworCWludCB4X3Jvb3QsIHlfcm9vdDsJLyogY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gcm9vdCAqLworCXVuc2lnbmVkIGludCBzdGF0ZTsJLyoga2V5IG9yIGJ1dHRvbiBtYXNrICovCisJdW5zaWduZWQgaW50IGtleWNvZGU7CS8qIGRldGFpbCAqLworCUJvb2wgc2FtZV9zY3JlZW47CS8qIHNhbWUgc2NyZWVuIGZsYWcgKi8KK30gWEtleUV2ZW50OwordHlwZWRlZiBYS2V5RXZlbnQgWEtleVByZXNzZWRFdmVudDsKK3R5cGVkZWYgWEtleUV2ZW50IFhLZXlSZWxlYXNlZEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CQkvKiBvZiBldmVudCAqLworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHdpbmRvdzsJICAgICAgICAvKiAiZXZlbnQiIHdpbmRvdyBpdCBpcyByZXBvcnRlZCByZWxhdGl2ZSB0byAqLworCVdpbmRvdyByb290OwkgICAgICAgIC8qIHJvb3Qgd2luZG93IHRoYXQgdGhlIGV2ZW50IG9jY3VycmVkIG9uICovCisJV2luZG93IHN1YndpbmRvdzsJLyogY2hpbGQgd2luZG93ICovCisJVGltZSB0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IHgsIHk7CQkvKiBwb2ludGVyIHgsIHkgY29vcmRpbmF0ZXMgaW4gZXZlbnQgd2luZG93ICovCisJaW50IHhfcm9vdCwgeV9yb290OwkvKiBjb29yZGluYXRlcyByZWxhdGl2ZSB0byByb290ICovCisJdW5zaWduZWQgaW50IHN0YXRlOwkvKiBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KKwl1bnNpZ25lZCBpbnQgYnV0dG9uOwkvKiBkZXRhaWwgKi8KKwlCb29sIHNhbWVfc2NyZWVuOwkvKiBzYW1lIHNjcmVlbiBmbGFnICovCit9IFhCdXR0b25FdmVudDsKK3R5cGVkZWYgWEJ1dHRvbkV2ZW50IFhCdXR0b25QcmVzc2VkRXZlbnQ7Cit0eXBlZGVmIFhCdXR0b25FdmVudCBYQnV0dG9uUmVsZWFzZWRFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOwkJLyogb2YgZXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CSAgICAgICAgLyogImV2ZW50IiB3aW5kb3cgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gKi8KKwlXaW5kb3cgcm9vdDsJICAgICAgICAvKiByb290IHdpbmRvdyB0aGF0IHRoZSBldmVudCBvY2N1cnJlZCBvbiAqLworCVdpbmRvdyBzdWJ3aW5kb3c7CS8qIGNoaWxkIHdpbmRvdyAqLworCVRpbWUgdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCB4LCB5OwkJLyogcG9pbnRlciB4LCB5IGNvb3JkaW5hdGVzIGluIGV2ZW50IHdpbmRvdyAqLworCWludCB4X3Jvb3QsIHlfcm9vdDsJLyogY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gcm9vdCAqLworCXVuc2lnbmVkIGludCBzdGF0ZTsJLyoga2V5IG9yIGJ1dHRvbiBtYXNrICovCisJY2hhciBpc19oaW50OwkJLyogZGV0YWlsICovCisJQm9vbCBzYW1lX3NjcmVlbjsJLyogc2FtZSBzY3JlZW4gZmxhZyAqLworfSBYTW90aW9uRXZlbnQ7Cit0eXBlZGVmIFhNb3Rpb25FdmVudCBYUG9pbnRlck1vdmVkRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsJCS8qIG9mIGV2ZW50ICovCisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OwkgICAgICAgIC8qICJldmVudCIgd2luZG93IHJlcG9ydGVkIHJlbGF0aXZlIHRvICovCisJV2luZG93IHJvb3Q7CSAgICAgICAgLyogcm9vdCB3aW5kb3cgdGhhdCB0aGUgZXZlbnQgb2NjdXJyZWQgb24gKi8KKwlXaW5kb3cgc3Vid2luZG93OwkvKiBjaGlsZCB3aW5kb3cgKi8KKwlUaW1lIHRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgeCwgeTsJCS8qIHBvaW50ZXIgeCwgeSBjb29yZGluYXRlcyBpbiBldmVudCB3aW5kb3cgKi8KKwlpbnQgeF9yb290LCB5X3Jvb3Q7CS8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KKwlpbnQgbW9kZTsJCS8qIE5vdGlmeU5vcm1hbCwgTm90aWZ5R3JhYiwgTm90aWZ5VW5ncmFiICovCisJaW50IGRldGFpbDsKKwkvKgorCSAqIE5vdGlmeUFuY2VzdG9yLCBOb3RpZnlWaXJ0dWFsLCBOb3RpZnlJbmZlcmlvciwKKwkgKiBOb3RpZnlOb25saW5lYXIsTm90aWZ5Tm9ubGluZWFyVmlydHVhbAorCSAqLworCUJvb2wgc2FtZV9zY3JlZW47CS8qIHNhbWUgc2NyZWVuIGZsYWcgKi8KKwlCb29sIGZvY3VzOwkJLyogYm9vbGVhbiBmb2N1cyAqLworCXVuc2lnbmVkIGludCBzdGF0ZTsJLyoga2V5IG9yIGJ1dHRvbiBtYXNrICovCit9IFhDcm9zc2luZ0V2ZW50OwordHlwZWRlZiBYQ3Jvc3NpbmdFdmVudCBYRW50ZXJXaW5kb3dFdmVudDsKK3R5cGVkZWYgWENyb3NzaW5nRXZlbnQgWExlYXZlV2luZG93RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsJCS8qIEZvY3VzSW4gb3IgRm9jdXNPdXQgKi8KKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CQkvKiB3aW5kb3cgb2YgZXZlbnQgKi8KKwlpbnQgbW9kZTsJCS8qIE5vdGlmeU5vcm1hbCwgTm90aWZ5V2hpbGVHcmFiYmVkLAorCQkJCSAgIE5vdGlmeUdyYWIsIE5vdGlmeVVuZ3JhYiAqLworCWludCBkZXRhaWw7CisJLyoKKwkgKiBOb3RpZnlBbmNlc3RvciwgTm90aWZ5VmlydHVhbCwgTm90aWZ5SW5mZXJpb3IsCisJICogTm90aWZ5Tm9ubGluZWFyLE5vdGlmeU5vbmxpbmVhclZpcnR1YWwsIE5vdGlmeVBvaW50ZXIsCisJICogTm90aWZ5UG9pbnRlclJvb3QsIE5vdGlmeURldGFpbE5vbmUKKwkgKi8KK30gWEZvY3VzQ2hhbmdlRXZlbnQ7Cit0eXBlZGVmIFhGb2N1c0NoYW5nZUV2ZW50IFhGb2N1c0luRXZlbnQ7Cit0eXBlZGVmIFhGb2N1c0NoYW5nZUV2ZW50IFhGb2N1c091dEV2ZW50OworCisvKiBnZW5lcmF0ZWQgb24gRW50ZXJXaW5kb3cgYW5kIEZvY3VzSW4gIHdoZW4gS2V5TWFwU3RhdGUgc2VsZWN0ZWQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CisJY2hhciBrZXlfdmVjdG9yWzMyXTsKK30gWEtleW1hcEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OworCWludCB4LCB5OworCWludCB3aWR0aCwgaGVpZ2h0OworCWludCBjb3VudDsJCS8qIGlmIG5vbi16ZXJvLCBhdCBsZWFzdCB0aGlzIG1hbnkgbW9yZSAqLworfSBYRXhwb3NlRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCURyYXdhYmxlIGRyYXdhYmxlOworCWludCB4LCB5OworCWludCB3aWR0aCwgaGVpZ2h0OworCWludCBjb3VudDsJCS8qIGlmIG5vbi16ZXJvLCBhdCBsZWFzdCB0aGlzIG1hbnkgbW9yZSAqLworCWludCBtYWpvcl9jb2RlOwkJLyogY29yZSBpcyBDb3B5QXJlYSBvciBDb3B5UGxhbmUgKi8KKwlpbnQgbWlub3JfY29kZTsJCS8qIG5vdCBkZWZpbmVkIGluIHRoZSBjb3JlICovCit9IFhHcmFwaGljc0V4cG9zZUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlEcmF3YWJsZSBkcmF3YWJsZTsKKwlpbnQgbWFqb3JfY29kZTsJCS8qIGNvcmUgaXMgQ29weUFyZWEgb3IgQ29weVBsYW5lICovCisJaW50IG1pbm9yX2NvZGU7CQkvKiBub3QgZGVmaW5lZCBpbiB0aGUgY29yZSAqLworfSBYTm9FeHBvc2VFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHdpbmRvdzsKKwlpbnQgc3RhdGU7CQkvKiBWaXNpYmlsaXR5IHN0YXRlICovCit9IFhWaXNpYmlsaXR5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyBwYXJlbnQ7CQkvKiBwYXJlbnQgb2YgdGhlIHdpbmRvdyAqLworCVdpbmRvdyB3aW5kb3c7CQkvKiB3aW5kb3cgaWQgb2Ygd2luZG93IGNyZWF0ZWQgKi8KKwlpbnQgeCwgeTsJCS8qIHdpbmRvdyBsb2NhdGlvbiAqLworCWludCB3aWR0aCwgaGVpZ2h0OwkvKiBzaXplIG9mIHdpbmRvdyAqLworCWludCBib3JkZXJfd2lkdGg7CS8qIGJvcmRlciB3aWR0aCAqLworCUJvb2wgb3ZlcnJpZGVfcmVkaXJlY3Q7CS8qIGNyZWF0aW9uIHNob3VsZCBiZSBvdmVycmlkZGVuICovCit9IFhDcmVhdGVXaW5kb3dFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IGV2ZW50OworCVdpbmRvdyB3aW5kb3c7Cit9IFhEZXN0cm95V2luZG93RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyBldmVudDsKKwlXaW5kb3cgd2luZG93OworCUJvb2wgZnJvbV9jb25maWd1cmU7Cit9IFhVbm1hcEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgZXZlbnQ7CisJV2luZG93IHdpbmRvdzsKKwlCb29sIG92ZXJyaWRlX3JlZGlyZWN0OwkvKiBib29sZWFuLCBpcyBvdmVycmlkZSBzZXQuLi4gKi8KK30gWE1hcEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgcGFyZW50OworCVdpbmRvdyB3aW5kb3c7Cit9IFhNYXBSZXF1ZXN0RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyBldmVudDsKKwlXaW5kb3cgd2luZG93OworCVdpbmRvdyBwYXJlbnQ7CisJaW50IHgsIHk7CisJQm9vbCBvdmVycmlkZV9yZWRpcmVjdDsKK30gWFJlcGFyZW50RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyBldmVudDsKKwlXaW5kb3cgd2luZG93OworCWludCB4LCB5OworCWludCB3aWR0aCwgaGVpZ2h0OworCWludCBib3JkZXJfd2lkdGg7CisJV2luZG93IGFib3ZlOworCUJvb2wgb3ZlcnJpZGVfcmVkaXJlY3Q7Cit9IFhDb25maWd1cmVFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IGV2ZW50OworCVdpbmRvdyB3aW5kb3c7CisJaW50IHgsIHk7Cit9IFhHcmF2aXR5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CisJaW50IHdpZHRoLCBoZWlnaHQ7Cit9IFhSZXNpemVSZXF1ZXN0RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyBwYXJlbnQ7CisJV2luZG93IHdpbmRvdzsKKwlpbnQgeCwgeTsKKwlpbnQgd2lkdGgsIGhlaWdodDsKKwlpbnQgYm9yZGVyX3dpZHRoOworCVdpbmRvdyBhYm92ZTsKKwlpbnQgZGV0YWlsOwkJLyogQWJvdmUsIEJlbG93LCBUb3BJZiwgQm90dG9tSWYsIE9wcG9zaXRlICovCisJdW5zaWduZWQgbG9uZyB2YWx1ZV9tYXNrOworfSBYQ29uZmlndXJlUmVxdWVzdEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgZXZlbnQ7CisJV2luZG93IHdpbmRvdzsKKwlpbnQgcGxhY2U7CQkvKiBQbGFjZU9uVG9wLCBQbGFjZU9uQm90dG9tICovCit9IFhDaXJjdWxhdGVFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHBhcmVudDsKKwlXaW5kb3cgd2luZG93OworCWludCBwbGFjZTsJCS8qIFBsYWNlT25Ub3AsIFBsYWNlT25Cb3R0b20gKi8KK30gWENpcmN1bGF0ZVJlcXVlc3RFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHdpbmRvdzsKKwlBdG9tIGF0b207CisJVGltZSB0aW1lOworCWludCBzdGF0ZTsJCS8qIE5ld1ZhbHVlLCBEZWxldGVkICovCit9IFhQcm9wZXJ0eUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OworCUF0b20gc2VsZWN0aW9uOworCVRpbWUgdGltZTsKK30gWFNlbGVjdGlvbkNsZWFyRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyBvd25lcjsKKwlXaW5kb3cgcmVxdWVzdG9yOworCUF0b20gc2VsZWN0aW9uOworCUF0b20gdGFyZ2V0OworCUF0b20gcHJvcGVydHk7CisJVGltZSB0aW1lOworfSBYU2VsZWN0aW9uUmVxdWVzdEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgcmVxdWVzdG9yOworCUF0b20gc2VsZWN0aW9uOworCUF0b20gdGFyZ2V0OworCUF0b20gcHJvcGVydHk7CQkvKiBBVE9NIG9yIE5vbmUgKi8KKwlUaW1lIHRpbWU7Cit9IFhTZWxlY3Rpb25FdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHdpbmRvdzsKKwlDb2xvcm1hcCBjb2xvcm1hcDsJLyogQ09MT1JNQVAgb3IgTm9uZSAqLworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKwlCb29sIGNfbmV3OwkJLyogQysrICovCisjZWxzZQorCUJvb2wgbmV3OworI2VuZGlmCisJaW50IHN0YXRlOwkJLyogQ29sb3JtYXBJbnN0YWxsZWQsIENvbG9ybWFwVW5pbnN0YWxsZWQgKi8KK30gWENvbG9ybWFwRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CisJQXRvbSBtZXNzYWdlX3R5cGU7CisJaW50IGZvcm1hdDsKKwl1bmlvbiB7CisJCWNoYXIgYlsyMF07CisJCXNob3J0IHNbMTBdOworCQlsb25nIGxbNV07CisJCX0gZGF0YTsKK30gWENsaWVudE1lc3NhZ2VFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHdpbmRvdzsJCS8qIHVudXNlZCAqLworCWludCByZXF1ZXN0OwkJLyogb25lIG9mIE1hcHBpbmdNb2RpZmllciwgTWFwcGluZ0tleWJvYXJkLAorCQkJCSAgIE1hcHBpbmdQb2ludGVyICovCisJaW50IGZpcnN0X2tleWNvZGU7CS8qIGZpcnN0IGtleWNvZGUgKi8KKwlpbnQgY291bnQ7CQkvKiBkZWZpbmVzIHJhbmdlIG9mIGNoYW5nZSB3LiBmaXJzdF9rZXljb2RlKi8KK30gWE1hcHBpbmdFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlYSUQgcmVzb3VyY2VpZDsJCS8qIHJlc291cmNlIGlkICovCisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qIHNlcmlhbCBudW1iZXIgb2YgZmFpbGVkIHJlcXVlc3QgKi8KKwl1bnNpZ25lZCBjaGFyIGVycm9yX2NvZGU7CS8qIGVycm9yIGNvZGUgb2YgZmFpbGVkIHJlcXVlc3QgKi8KKwl1bnNpZ25lZCBjaGFyIHJlcXVlc3RfY29kZTsJLyogTWFqb3Igb3AtY29kZSBvZiBmYWlsZWQgcmVxdWVzdCAqLworCXVuc2lnbmVkIGNoYXIgbWlub3JfY29kZTsJLyogTWlub3Igb3AtY29kZSBvZiBmYWlsZWQgcmVxdWVzdCAqLworfSBYRXJyb3JFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5Oy8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OwkvKiB3aW5kb3cgb24gd2hpY2ggZXZlbnQgd2FzIHJlcXVlc3RlZCBpbiBldmVudCBtYXNrICovCit9IFhBbnlFdmVudDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2VuZXJpY0V2ZW50LiAgVGhpcyBldmVudCBpcyB0aGUgc3RhbmRhcmQgZXZlbnQgZm9yIGFsbCBuZXdlciBleHRlbnNpb25zLgorICovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGludCAgICAgICAgICAgIHR5cGU7ICAgICAgICAgLyogb2YgZXZlbnQuIEFsd2F5cyBHZW5lcmljRXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nICBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCAqLworICAgIEJvb2wgICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiBmcm9tIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAgICAgICAgKmRpc3BsYXk7ICAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgaW50ICAgICAgICAgICAgZXh0ZW5zaW9uOyAgICAvKiBtYWpvciBvcGNvZGUgb2YgZXh0ZW5zaW9uIHRoYXQgY2F1c2VkIHRoZSBldmVudCAqLworICAgIGludCAgICAgICAgICAgIGV2dHlwZTsgICAgICAgLyogYWN0dWFsIGV2ZW50IHR5cGUuICovCisgICAgfSBYR2VuZXJpY0V2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgdHlwZTsgICAgICAgICAvKiBvZiBldmVudC4gQWx3YXlzIEdlbmVyaWNFdmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkICovCisgICAgQm9vbCAgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIGZyb20gU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICAqZGlzcGxheTsgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBpbnQgICAgICAgICAgICBleHRlbnNpb247ICAgIC8qIG1ham9yIG9wY29kZSBvZiBleHRlbnNpb24gdGhhdCBjYXVzZWQgdGhlIGV2ZW50ICovCisgICAgaW50ICAgICAgICAgICAgZXZ0eXBlOyAgICAgICAvKiBhY3R1YWwgZXZlbnQgdHlwZS4gKi8KKyAgICB1bnNpZ25lZCBpbnQgICBjb29raWU7CisgICAgdm9pZCAgICAgICAgICAgKmRhdGE7Cit9IFhHZW5lcmljRXZlbnRDb29raWU7CisKKy8qCisgKiB0aGlzIHVuaW9uIGlzIGRlZmluZWQgc28gWGxpYiBjYW4gYWx3YXlzIHVzZSB0aGUgc2FtZSBzaXplZAorICogZXZlbnQgc3RydWN0dXJlIGludGVybmFsbHksIHRvIGF2b2lkIG1lbW9yeSBmcmFnbWVudGF0aW9uLgorICovCit0eXBlZGVmIHVuaW9uIF9YRXZlbnQgeworICAgICAgICBpbnQgdHlwZTsJCS8qIG11c3Qgbm90IGJlIGNoYW5nZWQ7IGZpcnN0IGVsZW1lbnQgKi8KKwlYQW55RXZlbnQgeGFueTsKKwlYS2V5RXZlbnQgeGtleTsKKwlYQnV0dG9uRXZlbnQgeGJ1dHRvbjsKKwlYTW90aW9uRXZlbnQgeG1vdGlvbjsKKwlYQ3Jvc3NpbmdFdmVudCB4Y3Jvc3Npbmc7CisJWEZvY3VzQ2hhbmdlRXZlbnQgeGZvY3VzOworCVhFeHBvc2VFdmVudCB4ZXhwb3NlOworCVhHcmFwaGljc0V4cG9zZUV2ZW50IHhncmFwaGljc2V4cG9zZTsKKwlYTm9FeHBvc2VFdmVudCB4bm9leHBvc2U7CisJWFZpc2liaWxpdHlFdmVudCB4dmlzaWJpbGl0eTsKKwlYQ3JlYXRlV2luZG93RXZlbnQgeGNyZWF0ZXdpbmRvdzsKKwlYRGVzdHJveVdpbmRvd0V2ZW50IHhkZXN0cm95d2luZG93OworCVhVbm1hcEV2ZW50IHh1bm1hcDsKKwlYTWFwRXZlbnQgeG1hcDsKKwlYTWFwUmVxdWVzdEV2ZW50IHhtYXByZXF1ZXN0OworCVhSZXBhcmVudEV2ZW50IHhyZXBhcmVudDsKKwlYQ29uZmlndXJlRXZlbnQgeGNvbmZpZ3VyZTsKKwlYR3Jhdml0eUV2ZW50IHhncmF2aXR5OworCVhSZXNpemVSZXF1ZXN0RXZlbnQgeHJlc2l6ZXJlcXVlc3Q7CisJWENvbmZpZ3VyZVJlcXVlc3RFdmVudCB4Y29uZmlndXJlcmVxdWVzdDsKKwlYQ2lyY3VsYXRlRXZlbnQgeGNpcmN1bGF0ZTsKKwlYQ2lyY3VsYXRlUmVxdWVzdEV2ZW50IHhjaXJjdWxhdGVyZXF1ZXN0OworCVhQcm9wZXJ0eUV2ZW50IHhwcm9wZXJ0eTsKKwlYU2VsZWN0aW9uQ2xlYXJFdmVudCB4c2VsZWN0aW9uY2xlYXI7CisJWFNlbGVjdGlvblJlcXVlc3RFdmVudCB4c2VsZWN0aW9ucmVxdWVzdDsKKwlYU2VsZWN0aW9uRXZlbnQgeHNlbGVjdGlvbjsKKwlYQ29sb3JtYXBFdmVudCB4Y29sb3JtYXA7CisJWENsaWVudE1lc3NhZ2VFdmVudCB4Y2xpZW50OworCVhNYXBwaW5nRXZlbnQgeG1hcHBpbmc7CisJWEVycm9yRXZlbnQgeGVycm9yOworCVhLZXltYXBFdmVudCB4a2V5bWFwOworCVhHZW5lcmljRXZlbnQgeGdlbmVyaWM7CisJWEdlbmVyaWNFdmVudENvb2tpZSB4Y29va2llOworCWxvbmcgcGFkWzI0XTsKK30gWEV2ZW50OworI2VuZGlmCisKKyNkZWZpbmUgWEFsbG9jSUQoZHB5KSAoKCooKF9YUHJpdkRpc3BsYXkpZHB5KS0+cmVzb3VyY2VfYWxsb2MpKChkcHkpKSkKKworLyoKKyAqIHBlciBjaGFyYWN0ZXIgZm9udCBtZXRyaWMgaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydAlsYmVhcmluZzsJLyogb3JpZ2luIHRvIGxlZnQgZWRnZSBvZiByYXN0ZXIgKi8KKyAgICBzaG9ydAlyYmVhcmluZzsJLyogb3JpZ2luIHRvIHJpZ2h0IGVkZ2Ugb2YgcmFzdGVyICovCisgICAgc2hvcnQJd2lkdGg7CQkvKiBhZHZhbmNlIHRvIG5leHQgY2hhcidzIG9yaWdpbiAqLworICAgIHNob3J0CWFzY2VudDsJCS8qIGJhc2VsaW5lIHRvIHRvcCBlZGdlIG9mIHJhc3RlciAqLworICAgIHNob3J0CWRlc2NlbnQ7CS8qIGJhc2VsaW5lIHRvIGJvdHRvbSBlZGdlIG9mIHJhc3RlciAqLworICAgIHVuc2lnbmVkIHNob3J0IGF0dHJpYnV0ZXM7CS8qIHBlciBjaGFyIGZsYWdzIChub3QgcHJlZGVmaW5lZCkgKi8KK30gWENoYXJTdHJ1Y3Q7CisKKy8qCisgKiBUbyBhbGxvdyBhcmJpdHJhcnkgaW5mb3JtYXRpb24gd2l0aCBmb250cywgdGhlcmUgYXJlIGFkZGl0aW9uYWwgcHJvcGVydGllcworICogcmV0dXJuZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBdG9tIG5hbWU7CisgICAgdW5zaWduZWQgbG9uZyBjYXJkMzI7Cit9IFhGb250UHJvcDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhFeHREYXRhCSpleHRfZGF0YTsJLyogaG9vayBmb3IgZXh0ZW5zaW9uIHRvIGhhbmcgZGF0YSAqLworICAgIEZvbnQgICAgICAgIGZpZDsgICAgICAgICAgICAvKiBGb250IGlkIGZvciB0aGlzIGZvbnQgKi8KKyAgICB1bnNpZ25lZAlkaXJlY3Rpb247CS8qIGhpbnQgYWJvdXQgZGlyZWN0aW9uIHRoZSBmb250IGlzIHBhaW50ZWQgKi8KKyAgICB1bnNpZ25lZAltaW5fY2hhcl9vcl9ieXRlMjsvKiBmaXJzdCBjaGFyYWN0ZXIgKi8KKyAgICB1bnNpZ25lZAltYXhfY2hhcl9vcl9ieXRlMjsvKiBsYXN0IGNoYXJhY3RlciAqLworICAgIHVuc2lnbmVkCW1pbl9ieXRlMTsJLyogZmlyc3Qgcm93IHRoYXQgZXhpc3RzICovCisgICAgdW5zaWduZWQJbWF4X2J5dGUxOwkvKiBsYXN0IHJvdyB0aGF0IGV4aXN0cyAqLworICAgIEJvb2wJYWxsX2NoYXJzX2V4aXN0Oy8qIGZsYWcgaWYgYWxsIGNoYXJhY3RlcnMgaGF2ZSBub24temVybyBzaXplKi8KKyAgICB1bnNpZ25lZAlkZWZhdWx0X2NoYXI7CS8qIGNoYXIgdG8gcHJpbnQgZm9yIHVuZGVmaW5lZCBjaGFyYWN0ZXIgKi8KKyAgICBpbnQgICAgICAgICBuX3Byb3BlcnRpZXM7ICAgLyogaG93IG1hbnkgcHJvcGVydGllcyB0aGVyZSBhcmUgKi8KKyAgICBYRm9udFByb3AJKnByb3BlcnRpZXM7CS8qIHBvaW50ZXIgdG8gYXJyYXkgb2YgYWRkaXRpb25hbCBwcm9wZXJ0aWVzKi8KKyAgICBYQ2hhclN0cnVjdAltaW5fYm91bmRzOwkvKiBtaW5pbXVtIGJvdW5kcyBvdmVyIGFsbCBleGlzdGluZyBjaGFyKi8KKyAgICBYQ2hhclN0cnVjdAltYXhfYm91bmRzOwkvKiBtYXhpbXVtIGJvdW5kcyBvdmVyIGFsbCBleGlzdGluZyBjaGFyKi8KKyAgICBYQ2hhclN0cnVjdAkqcGVyX2NoYXI7CS8qIGZpcnN0X2NoYXIgdG8gbGFzdF9jaGFyIGluZm9ybWF0aW9uICovCisgICAgaW50CQlhc2NlbnQ7CQkvKiBsb2cuIGV4dGVudCBhYm92ZSBiYXNlbGluZSBmb3Igc3BhY2luZyAqLworICAgIGludAkJZGVzY2VudDsJLyogbG9nLiBkZXNjZW50IGJlbG93IGJhc2VsaW5lIGZvciBzcGFjaW5nICovCit9IFhGb250U3RydWN0OworCisvKgorICogUG9seVRleHQgcm91dGluZXMgdGFrZSB0aGVzZSBhcyBhcmd1bWVudHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICpjaGFyczsJCS8qIHBvaW50ZXIgdG8gc3RyaW5nICovCisgICAgaW50IG5jaGFyczsJCQkvKiBudW1iZXIgb2YgY2hhcmFjdGVycyAqLworICAgIGludCBkZWx0YTsJCQkvKiBkZWx0YSBiZXR3ZWVuIHN0cmluZ3MgKi8KKyAgICBGb250IGZvbnQ7CQkJLyogZm9udCB0byBwcmludCBpdCBpbiwgTm9uZSBkb24ndCBjaGFuZ2UgKi8KK30gWFRleHRJdGVtOworCit0eXBlZGVmIHN0cnVjdCB7CQkvKiBub3JtYWwgMTYgYml0IGNoYXJhY3RlcnMgYXJlIHR3byBieXRlcyAqLworICAgIHVuc2lnbmVkIGNoYXIgYnl0ZTE7CisgICAgdW5zaWduZWQgY2hhciBieXRlMjsKK30gWENoYXIyYjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhDaGFyMmIgKmNoYXJzOwkJLyogdHdvIGJ5dGUgY2hhcmFjdGVycyAqLworICAgIGludCBuY2hhcnM7CQkJLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgKi8KKyAgICBpbnQgZGVsdGE7CQkJLyogZGVsdGEgYmV0d2VlbiBzdHJpbmdzICovCisgICAgRm9udCBmb250OwkJCS8qIGZvbnQgdG8gcHJpbnQgaXQgaW4sIE5vbmUgZG9uJ3QgY2hhbmdlICovCit9IFhUZXh0SXRlbTE2OworCisKK3R5cGVkZWYgdW5pb24geyBEaXNwbGF5ICpkaXNwbGF5OworCQlHQyBnYzsKKwkJVmlzdWFsICp2aXN1YWw7CisJCVNjcmVlbiAqc2NyZWVuOworCQlTY3JlZW5Gb3JtYXQgKnBpeG1hcF9mb3JtYXQ7CisJCVhGb250U3RydWN0ICpmb250OyB9IFhFRGF0YU9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhSZWN0YW5nbGUgICAgICBtYXhfaW5rX2V4dGVudDsKKyAgICBYUmVjdGFuZ2xlICAgICAgbWF4X2xvZ2ljYWxfZXh0ZW50OworfSBYRm9udFNldEV4dGVudHM7CisKKy8qIHVudXNlZDoKK3R5cGVkZWYgdm9pZCAoKlhPTVByb2MpKCk7CisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1hPTSAqWE9NOwordHlwZWRlZiBzdHJ1Y3QgX1hPQyAqWE9DLCAqWEZvbnRTZXQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICAgICAgICAgICAqY2hhcnM7CisgICAgaW50ICAgICAgICAgICAgIG5jaGFyczsKKyAgICBpbnQgICAgICAgICAgICAgZGVsdGE7CisgICAgWEZvbnRTZXQgICAgICAgIGZvbnRfc2V0OworfSBYbWJUZXh0SXRlbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHdjaGFyX3QgICAgICAgICpjaGFyczsKKyAgICBpbnQgICAgICAgICAgICAgbmNoYXJzOworICAgIGludCAgICAgICAgICAgICBkZWx0YTsKKyAgICBYRm9udFNldCAgICAgICAgZm9udF9zZXQ7Cit9IFh3Y1RleHRJdGVtOworCisjZGVmaW5lIFhOUmVxdWlyZWRDaGFyU2V0ICJyZXF1aXJlZENoYXJTZXQiCisjZGVmaW5lIFhOUXVlcnlPcmllbnRhdGlvbiAicXVlcnlPcmllbnRhdGlvbiIKKyNkZWZpbmUgWE5CYXNlRm9udE5hbWUgImJhc2VGb250TmFtZSIKKyNkZWZpbmUgWE5PTUF1dG9tYXRpYyAib21BdXRvbWF0aWMiCisjZGVmaW5lIFhOTWlzc2luZ0NoYXJTZXQgIm1pc3NpbmdDaGFyU2V0IgorI2RlZmluZSBYTkRlZmF1bHRTdHJpbmcgImRlZmF1bHRTdHJpbmciCisjZGVmaW5lIFhOT3JpZW50YXRpb24gIm9yaWVudGF0aW9uIgorI2RlZmluZSBYTkRpcmVjdGlvbmFsRGVwZW5kZW50RHJhd2luZyAiZGlyZWN0aW9uYWxEZXBlbmRlbnREcmF3aW5nIgorI2RlZmluZSBYTkNvbnRleHR1YWxEcmF3aW5nICJjb250ZXh0dWFsRHJhd2luZyIKKyNkZWZpbmUgWE5Gb250SW5mbyAiZm9udEluZm8iCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgY2hhcnNldF9jb3VudDsKKyAgICBjaGFyICoqY2hhcnNldF9saXN0OworfSBYT01DaGFyU2V0TGlzdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBYT01PcmllbnRhdGlvbl9MVFJfVFRCLAorICAgIFhPTU9yaWVudGF0aW9uX1JUTF9UVEIsCisgICAgWE9NT3JpZW50YXRpb25fVFRCX0xUUiwKKyAgICBYT01PcmllbnRhdGlvbl9UVEJfUlRMLAorICAgIFhPTU9yaWVudGF0aW9uX0NvbnRleHQKK30gWE9yaWVudGF0aW9uOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IG51bV9vcmllbnRhdGlvbjsKKyAgICBYT3JpZW50YXRpb24gKm9yaWVudGF0aW9uOwkvKiBJbnB1dCBUZXh0IGRlc2NyaXB0aW9uICovCit9IFhPTU9yaWVudGF0aW9uOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IG51bV9mb250OworICAgIFhGb250U3RydWN0ICoqZm9udF9zdHJ1Y3RfbGlzdDsKKyAgICBjaGFyICoqZm9udF9uYW1lX2xpc3Q7Cit9IFhPTUZvbnRJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfWElNICpYSU07Cit0eXBlZGVmIHN0cnVjdCBfWElDICpYSUM7CisKK3R5cGVkZWYgdm9pZCAoKlhJTVByb2MpKAorICAgIFhJTSwKKyAgICBYUG9pbnRlciwKKyAgICBYUG9pbnRlcgorKTsKKwordHlwZWRlZiBCb29sICgqWElDUHJvYykoCisgICAgWElDLAorICAgIFhQb2ludGVyLAorICAgIFhQb2ludGVyCispOworCit0eXBlZGVmIHZvaWQgKCpYSURQcm9jKSgKKyAgICBEaXNwbGF5KiwKKyAgICBYUG9pbnRlciwKKyAgICBYUG9pbnRlcgorKTsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFhJTVN0eWxlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgc2hvcnQgY291bnRfc3R5bGVzOworICAgIFhJTVN0eWxlICpzdXBwb3J0ZWRfc3R5bGVzOworfSBYSU1TdHlsZXM7CisKKyNkZWZpbmUgWElNUHJlZWRpdEFyZWEJCTB4MDAwMUwKKyNkZWZpbmUgWElNUHJlZWRpdENhbGxiYWNrcwkweDAwMDJMCisjZGVmaW5lIFhJTVByZWVkaXRQb3NpdGlvbgkweDAwMDRMCisjZGVmaW5lIFhJTVByZWVkaXROb3RoaW5nCTB4MDAwOEwKKyNkZWZpbmUgWElNUHJlZWRpdE5vbmUJCTB4MDAxMEwKKyNkZWZpbmUgWElNU3RhdHVzQXJlYQkJMHgwMTAwTAorI2RlZmluZSBYSU1TdGF0dXNDYWxsYmFja3MJMHgwMjAwTAorI2RlZmluZSBYSU1TdGF0dXNOb3RoaW5nCTB4MDQwMEwKKyNkZWZpbmUgWElNU3RhdHVzTm9uZQkJMHgwODAwTAorCisjZGVmaW5lIFhOVmFOZXN0ZWRMaXN0ICJYTlZhTmVzdGVkTGlzdCIKKyNkZWZpbmUgWE5RdWVyeUlucHV0U3R5bGUgInF1ZXJ5SW5wdXRTdHlsZSIKKyNkZWZpbmUgWE5DbGllbnRXaW5kb3cgImNsaWVudFdpbmRvdyIKKyNkZWZpbmUgWE5JbnB1dFN0eWxlICJpbnB1dFN0eWxlIgorI2RlZmluZSBYTkZvY3VzV2luZG93ICJmb2N1c1dpbmRvdyIKKyNkZWZpbmUgWE5SZXNvdXJjZU5hbWUgInJlc291cmNlTmFtZSIKKyNkZWZpbmUgWE5SZXNvdXJjZUNsYXNzICJyZXNvdXJjZUNsYXNzIgorI2RlZmluZSBYTkdlb21ldHJ5Q2FsbGJhY2sgImdlb21ldHJ5Q2FsbGJhY2siCisjZGVmaW5lIFhORGVzdHJveUNhbGxiYWNrICJkZXN0cm95Q2FsbGJhY2siCisjZGVmaW5lIFhORmlsdGVyRXZlbnRzICJmaWx0ZXJFdmVudHMiCisjZGVmaW5lIFhOUHJlZWRpdFN0YXJ0Q2FsbGJhY2sgInByZWVkaXRTdGFydENhbGxiYWNrIgorI2RlZmluZSBYTlByZWVkaXREb25lQ2FsbGJhY2sgInByZWVkaXREb25lQ2FsbGJhY2siCisjZGVmaW5lIFhOUHJlZWRpdERyYXdDYWxsYmFjayAicHJlZWRpdERyYXdDYWxsYmFjayIKKyNkZWZpbmUgWE5QcmVlZGl0Q2FyZXRDYWxsYmFjayAicHJlZWRpdENhcmV0Q2FsbGJhY2siCisjZGVmaW5lIFhOUHJlZWRpdFN0YXRlTm90aWZ5Q2FsbGJhY2sgInByZWVkaXRTdGF0ZU5vdGlmeUNhbGxiYWNrIgorI2RlZmluZSBYTlByZWVkaXRBdHRyaWJ1dGVzICJwcmVlZGl0QXR0cmlidXRlcyIKKyNkZWZpbmUgWE5TdGF0dXNTdGFydENhbGxiYWNrICJzdGF0dXNTdGFydENhbGxiYWNrIgorI2RlZmluZSBYTlN0YXR1c0RvbmVDYWxsYmFjayAic3RhdHVzRG9uZUNhbGxiYWNrIgorI2RlZmluZSBYTlN0YXR1c0RyYXdDYWxsYmFjayAic3RhdHVzRHJhd0NhbGxiYWNrIgorI2RlZmluZSBYTlN0YXR1c0F0dHJpYnV0ZXMgInN0YXR1c0F0dHJpYnV0ZXMiCisjZGVmaW5lIFhOQXJlYSAiYXJlYSIKKyNkZWZpbmUgWE5BcmVhTmVlZGVkICJhcmVhTmVlZGVkIgorI2RlZmluZSBYTlNwb3RMb2NhdGlvbiAic3BvdExvY2F0aW9uIgorI2RlZmluZSBYTkNvbG9ybWFwICJjb2xvck1hcCIKKyNkZWZpbmUgWE5TdGRDb2xvcm1hcCAic3RkQ29sb3JNYXAiCisjZGVmaW5lIFhORm9yZWdyb3VuZCAiZm9yZWdyb3VuZCIKKyNkZWZpbmUgWE5CYWNrZ3JvdW5kICJiYWNrZ3JvdW5kIgorI2RlZmluZSBYTkJhY2tncm91bmRQaXhtYXAgImJhY2tncm91bmRQaXhtYXAiCisjZGVmaW5lIFhORm9udFNldCAiZm9udFNldCIKKyNkZWZpbmUgWE5MaW5lU3BhY2UgImxpbmVTcGFjZSIKKyNkZWZpbmUgWE5DdXJzb3IgImN1cnNvciIKKworI2RlZmluZSBYTlF1ZXJ5SU1WYWx1ZXNMaXN0ICJxdWVyeUlNVmFsdWVzTGlzdCIKKyNkZWZpbmUgWE5RdWVyeUlDVmFsdWVzTGlzdCAicXVlcnlJQ1ZhbHVlc0xpc3QiCisjZGVmaW5lIFhOVmlzaWJsZVBvc2l0aW9uICJ2aXNpYmxlUG9zaXRpb24iCisjZGVmaW5lIFhOUjZQcmVlZGl0Q2FsbGJhY2sgInI2UHJlZWRpdENhbGxiYWNrIgorI2RlZmluZSBYTlN0cmluZ0NvbnZlcnNpb25DYWxsYmFjayAic3RyaW5nQ29udmVyc2lvbkNhbGxiYWNrIgorI2RlZmluZSBYTlN0cmluZ0NvbnZlcnNpb24gInN0cmluZ0NvbnZlcnNpb24iCisjZGVmaW5lIFhOUmVzZXRTdGF0ZSAicmVzZXRTdGF0ZSIKKyNkZWZpbmUgWE5Ib3RLZXkgImhvdEtleSIKKyNkZWZpbmUgWE5Ib3RLZXlTdGF0ZSAiaG90S2V5U3RhdGUiCisjZGVmaW5lIFhOUHJlZWRpdFN0YXRlICJwcmVlZGl0U3RhdGUiCisjZGVmaW5lIFhOU2VwYXJhdG9yb2ZOZXN0ZWRMaXN0ICJzZXBhcmF0b3JvZk5lc3RlZExpc3QiCisKKyNkZWZpbmUgWEJ1ZmZlck92ZXJmbG93CQktMQorI2RlZmluZSBYTG9va3VwTm9uZQkJMQorI2RlZmluZSBYTG9va3VwQ2hhcnMJCTIKKyNkZWZpbmUgWExvb2t1cEtleVN5bQkJMworI2RlZmluZSBYTG9va3VwQm90aAkJNAorCit0eXBlZGVmIHZvaWQgKlhWYU5lc3RlZExpc3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYUG9pbnRlciBjbGllbnRfZGF0YTsKKyAgICBYSU1Qcm9jIGNhbGxiYWNrOworfSBYSU1DYWxsYmFjazsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhQb2ludGVyIGNsaWVudF9kYXRhOworICAgIFhJQ1Byb2MgY2FsbGJhY2s7Cit9IFhJQ0NhbGxiYWNrOworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgWElNRmVlZGJhY2s7CisKKyNkZWZpbmUgWElNUmV2ZXJzZQkJMUwKKyNkZWZpbmUgWElNVW5kZXJsaW5lCQkoMUw8PDEpCisjZGVmaW5lIFhJTUhpZ2hsaWdodAkJKDFMPDwyKQorI2RlZmluZSBYSU1QcmltYXJ5CSAJKDFMPDw1KQorI2RlZmluZSBYSU1TZWNvbmRhcnkJCSgxTDw8NikKKyNkZWZpbmUgWElNVGVydGlhcnkJIAkoMUw8PDcpCisjZGVmaW5lIFhJTVZpc2libGVUb0ZvcndhcmQgCSgxTDw8OCkKKyNkZWZpbmUgWElNVmlzaWJsZVRvQmFja3dvcmQgCSgxTDw8OSkKKyNkZWZpbmUgWElNVmlzaWJsZVRvQ2VudGVyIAkoMUw8PDEwKQorCit0eXBlZGVmIHN0cnVjdCBfWElNVGV4dCB7CisgICAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworICAgIFhJTUZlZWRiYWNrICpmZWVkYmFjazsKKyAgICBCb29sIGVuY29kaW5nX2lzX3djaGFyOworICAgIHVuaW9uIHsKKwljaGFyICptdWx0aV9ieXRlOworCXdjaGFyX3QgKndpZGVfY2hhcjsKKyAgICB9IHN0cmluZzsKK30gWElNVGV4dDsKKwordHlwZWRlZgl1bnNpZ25lZCBsb25nCSBYSU1QcmVlZGl0U3RhdGU7CisKKyNkZWZpbmUJWElNUHJlZWRpdFVuS25vd24JMEwKKyNkZWZpbmUJWElNUHJlZWRpdEVuYWJsZQkxTAorI2RlZmluZQlYSU1QcmVlZGl0RGlzYWJsZQkoMUw8PDEpCisKK3R5cGVkZWYJc3RydWN0CV9YSU1QcmVlZGl0U3RhdGVOb3RpZnlDYWxsYmFja1N0cnVjdCB7CisgICAgWElNUHJlZWRpdFN0YXRlIHN0YXRlOworfSBYSU1QcmVlZGl0U3RhdGVOb3RpZnlDYWxsYmFja1N0cnVjdDsKKwordHlwZWRlZgl1bnNpZ25lZCBsb25nCSBYSU1SZXNldFN0YXRlOworCisjZGVmaW5lCVhJTUluaXRpYWxTdGF0ZQkJMUwKKyNkZWZpbmUJWElNUHJlc2VydmVTdGF0ZQkoMUw8PDEpCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBYSU1TdHJpbmdDb252ZXJzaW9uRmVlZGJhY2s7CisKKyNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvbkxlZnRFZGdlCSgweDAwMDAwMDAxKQorI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uUmlnaHRFZGdlCSgweDAwMDAwMDAyKQorI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uVG9wRWRnZQkoMHgwMDAwMDAwNCkKKyNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvbkJvdHRvbUVkZ2UJKDB4MDAwMDAwMDgpCisjZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25Db25jZWFsZWQJKDB4MDAwMDAwMTApCisjZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25XcmFwcGVkCSgweDAwMDAwMDIwKQorCit0eXBlZGVmIHN0cnVjdCBfWElNU3RyaW5nQ29udmVyc2lvblRleHQgeworICAgIHVuc2lnbmVkIHNob3J0IGxlbmd0aDsKKyAgICBYSU1TdHJpbmdDb252ZXJzaW9uRmVlZGJhY2sgKmZlZWRiYWNrOworICAgIEJvb2wgZW5jb2RpbmdfaXNfd2NoYXI7CisgICAgdW5pb24geworCWNoYXIgKm1iczsKKwl3Y2hhcl90ICp3Y3M7CisgICAgfSBzdHJpbmc7Cit9IFhJTVN0cmluZ0NvbnZlcnNpb25UZXh0OworCit0eXBlZGVmCXVuc2lnbmVkIHNob3J0CVhJTVN0cmluZ0NvbnZlcnNpb25Qb3NpdGlvbjsKKwordHlwZWRlZgl1bnNpZ25lZCBzaG9ydAlYSU1TdHJpbmdDb252ZXJzaW9uVHlwZTsKKworI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uQnVmZmVyCSgweDAwMDEpCisjZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25MaW5lCQkoMHgwMDAyKQorI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uV29yZAkJKDB4MDAwMykKKyNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvbkNoYXIJCSgweDAwMDQpCisKK3R5cGVkZWYJdW5zaWduZWQgc2hvcnQJWElNU3RyaW5nQ29udmVyc2lvbk9wZXJhdGlvbjsKKworI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uU3Vic3RpdHV0aW9uCSgweDAwMDEpCisjZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25SZXRyaWV2YWwJKDB4MDAwMikKKwordHlwZWRlZiBlbnVtIHsKKyAgICBYSU1Gb3J3YXJkQ2hhciwgWElNQmFja3dhcmRDaGFyLAorICAgIFhJTUZvcndhcmRXb3JkLCBYSU1CYWNrd2FyZFdvcmQsCisgICAgWElNQ2FyZXRVcCwgWElNQ2FyZXREb3duLAorICAgIFhJTU5leHRMaW5lLCBYSU1QcmV2aW91c0xpbmUsCisgICAgWElNTGluZVN0YXJ0LCBYSU1MaW5lRW5kLAorICAgIFhJTUFic29sdXRlUG9zaXRpb24sCisgICAgWElNRG9udENoYW5nZQorfSBYSU1DYXJldERpcmVjdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hJTVN0cmluZ0NvbnZlcnNpb25DYWxsYmFja1N0cnVjdCB7CisgICAgWElNU3RyaW5nQ29udmVyc2lvblBvc2l0aW9uIHBvc2l0aW9uOworICAgIFhJTUNhcmV0RGlyZWN0aW9uIGRpcmVjdGlvbjsKKyAgICBYSU1TdHJpbmdDb252ZXJzaW9uT3BlcmF0aW9uIG9wZXJhdGlvbjsKKyAgICB1bnNpZ25lZCBzaG9ydCBmYWN0b3I7CisgICAgWElNU3RyaW5nQ29udmVyc2lvblRleHQgKnRleHQ7Cit9IFhJTVN0cmluZ0NvbnZlcnNpb25DYWxsYmFja1N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX1hJTVByZWVkaXREcmF3Q2FsbGJhY2tTdHJ1Y3QgeworICAgIGludCBjYXJldDsJCS8qIEN1cnNvciBvZmZzZXQgd2l0aGluIHByZS1lZGl0IHN0cmluZyAqLworICAgIGludCBjaGdfZmlyc3Q7CS8qIFN0YXJ0aW5nIGNoYW5nZSBwb3NpdGlvbiAqLworICAgIGludCBjaGdfbGVuZ3RoOwkvKiBMZW5ndGggb2YgdGhlIGNoYW5nZSBpbiBjaGFyYWN0ZXIgY291bnQgKi8KKyAgICBYSU1UZXh0ICp0ZXh0OworfSBYSU1QcmVlZGl0RHJhd0NhbGxiYWNrU3RydWN0OworCit0eXBlZGVmIGVudW0geworICAgIFhJTUlzSW52aXNpYmxlLAkvKiBEaXNhYmxlIGNhcmV0IGZlZWRiYWNrICovCisgICAgWElNSXNQcmltYXJ5LAkvKiBVSSBkZWZpbmVkIGNhcmV0IGZlZWRiYWNrICovCisgICAgWElNSXNTZWNvbmRhcnkJLyogVUkgZGVmaW5lZCBjYXJldCBmZWVkYmFjayAqLworfSBYSU1DYXJldFN0eWxlOworCit0eXBlZGVmIHN0cnVjdCBfWElNUHJlZWRpdENhcmV0Q2FsbGJhY2tTdHJ1Y3QgeworICAgIGludCBwb3NpdGlvbjsJCSAvKiBDYXJldCBvZmZzZXQgd2l0aGluIHByZS1lZGl0IHN0cmluZyAqLworICAgIFhJTUNhcmV0RGlyZWN0aW9uIGRpcmVjdGlvbjsgLyogQ2FyZXQgbW92ZXMgZGlyZWN0aW9uICovCisgICAgWElNQ2FyZXRTdHlsZSBzdHlsZTsJIC8qIEZlZWRiYWNrIG9mIHRoZSBjYXJldCAqLworfSBYSU1QcmVlZGl0Q2FyZXRDYWxsYmFja1N0cnVjdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBYSU1UZXh0VHlwZSwKKyAgICBYSU1CaXRtYXBUeXBlCit9IFhJTVN0YXR1c0RhdGFUeXBlOworCit0eXBlZGVmIHN0cnVjdCBfWElNU3RhdHVzRHJhd0NhbGxiYWNrU3RydWN0IHsKKyAgICBYSU1TdGF0dXNEYXRhVHlwZSB0eXBlOworICAgIHVuaW9uIHsKKwlYSU1UZXh0ICp0ZXh0OworCVBpeG1hcCAgYml0bWFwOworICAgIH0gZGF0YTsKK30gWElNU3RhdHVzRHJhd0NhbGxiYWNrU3RydWN0OworCit0eXBlZGVmIHN0cnVjdCBfWElNSG90S2V5VHJpZ2dlciB7CisgICAgS2V5U3ltCSBrZXlzeW07CisgICAgaW50CQkgbW9kaWZpZXI7CisgICAgaW50CQkgbW9kaWZpZXJfbWFzazsKK30gWElNSG90S2V5VHJpZ2dlcjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hJTUhvdEtleVRyaWdnZXJzIHsKKyAgICBpbnQJCQkgbnVtX2hvdF9rZXk7CisgICAgWElNSG90S2V5VHJpZ2dlcgkqa2V5OworfSBYSU1Ib3RLZXlUcmlnZ2VyczsKKwordHlwZWRlZgl1bnNpZ25lZCBsb25nCSBYSU1Ib3RLZXlTdGF0ZTsKKworI2RlZmluZQlYSU1Ib3RLZXlTdGF0ZU9OCSgweDAwMDFMKQorI2RlZmluZQlYSU1Ib3RLZXlTdGF0ZU9GRgkoMHgwMDAyTCkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIHNob3J0IGNvdW50X3ZhbHVlczsKKyAgICBjaGFyICoqc3VwcG9ydGVkX3ZhbHVlczsKK30gWElNVmFsdWVzTGlzdDsKKworX1hGVU5DUFJPVE9CRUdJTgorCisjaWYgZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoX1hMSUJJTlRfKQorI2RlZmluZSBfWGRlYnVnICgqX1hkZWJ1Z19wKQorI2VuZGlmCisKK2V4dGVybiBpbnQgX1hkZWJ1ZzsKKworZXh0ZXJuIFhGb250U3RydWN0ICpYTG9hZFF1ZXJ5Rm9udCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIG5hbWUgKi8KKyk7CisKK2V4dGVybiBYRm9udFN0cnVjdCAqWFF1ZXJ5Rm9udCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYSUQJCQkvKiBmb250X0lEICovCispOworCisKK2V4dGVybiBYVGltZUNvb3JkICpYR2V0TW90aW9uRXZlbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBUaW1lCQkvKiBzdGFydCAqLywKKyAgICBUaW1lCQkvKiBzdG9wICovLAorICAgIGludCoJCS8qIG5ldmVudHNfcmV0dXJuICovCispOworCitleHRlcm4gWE1vZGlmaWVyS2V5bWFwICpYRGVsZXRlTW9kaWZpZXJtYXBFbnRyeSgKKyAgICBYTW9kaWZpZXJLZXltYXAqCS8qIG1vZG1hcCAqLywKKyNpZiBOZWVkV2lkZVByb3RvdHlwZXMKKyAgICB1bnNpZ25lZCBpbnQJLyoga2V5Y29kZV9lbnRyeSAqLywKKyNlbHNlCisgICAgS2V5Q29kZQkJLyoga2V5Y29kZV9lbnRyeSAqLywKKyNlbmRpZgorICAgIGludAkJCS8qIG1vZGlmaWVyICovCispOworCitleHRlcm4gWE1vZGlmaWVyS2V5bWFwCSpYR2V0TW9kaWZpZXJNYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gWE1vZGlmaWVyS2V5bWFwCSpYSW5zZXJ0TW9kaWZpZXJtYXBFbnRyeSgKKyAgICBYTW9kaWZpZXJLZXltYXAqCS8qIG1vZG1hcCAqLywKKyNpZiBOZWVkV2lkZVByb3RvdHlwZXMKKyAgICB1bnNpZ25lZCBpbnQJLyoga2V5Y29kZV9lbnRyeSAqLywKKyNlbHNlCisgICAgS2V5Q29kZQkJLyoga2V5Y29kZV9lbnRyeSAqLywKKyNlbmRpZgorICAgIGludAkJCS8qIG1vZGlmaWVyICovCispOworCitleHRlcm4gWE1vZGlmaWVyS2V5bWFwICpYTmV3TW9kaWZpZXJtYXAoCisgICAgaW50CQkJLyogbWF4X2tleXNfcGVyX21vZCAqLworKTsKKworZXh0ZXJuIFhJbWFnZSAqWENyZWF0ZUltYWdlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFZpc3VhbCoJCS8qIHZpc3VhbCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogZGVwdGggKi8sCisgICAgaW50CQkJLyogZm9ybWF0ICovLAorICAgIGludAkJCS8qIG9mZnNldCAqLywKKyAgICBjaGFyKgkJLyogZGF0YSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICBpbnQJCQkvKiBiaXRtYXBfcGFkICovLAorICAgIGludAkJCS8qIGJ5dGVzX3Blcl9saW5lICovCispOworZXh0ZXJuIFN0YXR1cyBYSW5pdEltYWdlKAorICAgIFhJbWFnZSoJCS8qIGltYWdlICovCispOworZXh0ZXJuIFhJbWFnZSAqWEdldEltYWdlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHBsYW5lX21hc2sgKi8sCisgICAgaW50CQkJLyogZm9ybWF0ICovCispOworZXh0ZXJuIFhJbWFnZSAqWEdldFN1YkltYWdlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHBsYW5lX21hc2sgKi8sCisgICAgaW50CQkJLyogZm9ybWF0ICovLAorICAgIFhJbWFnZSoJCS8qIGRlc3RfaW1hZ2UgKi8sCisgICAgaW50CQkJLyogZGVzdF94ICovLAorICAgIGludAkJCS8qIGRlc3RfeSAqLworKTsKKworLyoKKyAqIFggZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorICovCitleHRlcm4gRGlzcGxheSAqWE9wZW5EaXNwbGF5KAorICAgIF9YY29uc3QgY2hhcioJLyogZGlzcGxheV9uYW1lICovCispOworCitleHRlcm4gdm9pZCBYcm1Jbml0aWFsaXplKAorICAgIHZvaWQKKyk7CisKK2V4dGVybiBjaGFyICpYRmV0Y2hCeXRlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBuYnl0ZXNfcmV0dXJuICovCispOworZXh0ZXJuIGNoYXIgKlhGZXRjaEJ1ZmZlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBuYnl0ZXNfcmV0dXJuICovLAorICAgIGludAkJCS8qIGJ1ZmZlciAqLworKTsKK2V4dGVybiBjaGFyICpYR2V0QXRvbU5hbWUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQXRvbQkJLyogYXRvbSAqLworKTsKK2V4dGVybiBTdGF0dXMgWEdldEF0b21OYW1lcygKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIEF0b20qCQkvKiBhdG9tcyAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBjaGFyKioJCS8qIG5hbWVzX3JldHVybiAqLworKTsKK2V4dGVybiBjaGFyICpYR2V0RGVmYXVsdCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHByb2dyYW0gKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBvcHRpb24gKi8KKyk7CitleHRlcm4gY2hhciAqWERpc3BsYXlOYW1lKAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovCispOworZXh0ZXJuIGNoYXIgKlhLZXlzeW1Ub1N0cmluZygKKyAgICBLZXlTeW0JCS8qIGtleXN5bSAqLworKTsKKworZXh0ZXJuIGludCAoKlhTeW5jaHJvbml6ZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBCb29sCQkvKiBvbm9mZiAqLworKSkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CitleHRlcm4gaW50ICgqWFNldEFmdGVyRnVuY3Rpb24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50ICgqKSAoCisJICAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovCisgICAgICAgICAgICApCQkvKiBwcm9jZWR1cmUgKi8KKykpKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIEF0b20gWEludGVybkF0b20oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBhdG9tX25hbWUgKi8sCisgICAgQm9vbAkJLyogb25seV9pZl9leGlzdHMgKi8KKyk7CitleHRlcm4gU3RhdHVzIFhJbnRlcm5BdG9tcygKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGNoYXIqKgkJLyogbmFtZXMgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQm9vbAkJLyogb25seUlmRXhpc3RzICovLAorICAgIEF0b20qCQkvKiBhdG9tc19yZXR1cm4gKi8KKyk7CitleHRlcm4gQ29sb3JtYXAgWENvcHlDb2xvcm1hcEFuZEZyZWUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovCispOworZXh0ZXJuIENvbG9ybWFwIFhDcmVhdGVDb2xvcm1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgVmlzdWFsKgkJLyogdmlzdWFsICovLAorICAgIGludAkJCS8qIGFsbG9jICovCispOworZXh0ZXJuIEN1cnNvciBYQ3JlYXRlUGl4bWFwQ3Vyc29yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFBpeG1hcAkJLyogc291cmNlICovLAorICAgIFBpeG1hcAkJLyogbWFzayAqLywKKyAgICBYQ29sb3IqCQkvKiBmb3JlZ3JvdW5kX2NvbG9yICovLAorICAgIFhDb2xvcioJCS8qIGJhY2tncm91bmRfY29sb3IgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHkgKi8KKyk7CitleHRlcm4gQ3Vyc29yIFhDcmVhdGVHbHlwaEN1cnNvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBGb250CQkvKiBzb3VyY2VfZm9udCAqLywKKyAgICBGb250CQkvKiBtYXNrX2ZvbnQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHNvdXJjZV9jaGFyICovLAorICAgIHVuc2lnbmVkIGludAkvKiBtYXNrX2NoYXIgKi8sCisgICAgWENvbG9yIF9YY29uc3QgKgkvKiBmb3JlZ3JvdW5kX2NvbG9yICovLAorICAgIFhDb2xvciBfWGNvbnN0ICoJLyogYmFja2dyb3VuZF9jb2xvciAqLworKTsKK2V4dGVybiBDdXJzb3IgWENyZWF0ZUZvbnRDdXJzb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHNoYXBlICovCispOworZXh0ZXJuIEZvbnQgWExvYWRGb250KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogbmFtZSAqLworKTsKK2V4dGVybiBHQyBYQ3JlYXRlR0MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiB2YWx1ZW1hc2sgKi8sCisgICAgWEdDVmFsdWVzKgkJLyogdmFsdWVzICovCispOworZXh0ZXJuIEdDb250ZXh0IFhHQ29udGV4dEZyb21HQygKKyAgICBHQwkJCS8qIGdjICovCispOworZXh0ZXJuIHZvaWQgWEZsdXNoR0MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLworKTsKK2V4dGVybiBQaXhtYXAgWENyZWF0ZVBpeG1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogZGVwdGggKi8KKyk7CitleHRlcm4gUGl4bWFwIFhDcmVhdGVCaXRtYXBGcm9tRGF0YSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGRhdGEgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8KKyk7CitleHRlcm4gUGl4bWFwIFhDcmVhdGVQaXhtYXBGcm9tQml0bWFwRGF0YSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBjaGFyKgkJLyogZGF0YSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGZnICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogYmcgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGRlcHRoICovCispOworZXh0ZXJuIFdpbmRvdyBYQ3JlYXRlU2ltcGxlV2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogcGFyZW50ICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogYm9yZGVyX3dpZHRoICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogYm9yZGVyICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogYmFja2dyb3VuZCAqLworKTsKK2V4dGVybiBXaW5kb3cgWEdldFNlbGVjdGlvbk93bmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEF0b20JCS8qIHNlbGVjdGlvbiAqLworKTsKK2V4dGVybiBXaW5kb3cgWENyZWF0ZVdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHBhcmVudCAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGJvcmRlcl93aWR0aCAqLywKKyAgICBpbnQJCQkvKiBkZXB0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogY2xhc3MgKi8sCisgICAgVmlzdWFsKgkJLyogdmlzdWFsICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogdmFsdWVtYXNrICovLAorICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzKgkvKiBhdHRyaWJ1dGVzICovCispOworZXh0ZXJuIENvbG9ybWFwICpYTGlzdEluc3RhbGxlZENvbG9ybWFwcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50KgkJLyogbnVtX3JldHVybiAqLworKTsKK2V4dGVybiBjaGFyICoqWExpc3RGb250cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHBhdHRlcm4gKi8sCisgICAgaW50CQkJLyogbWF4bmFtZXMgKi8sCisgICAgaW50KgkJLyogYWN0dWFsX2NvdW50X3JldHVybiAqLworKTsKK2V4dGVybiBjaGFyICoqWExpc3RGb250c1dpdGhJbmZvKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogcGF0dGVybiAqLywKKyAgICBpbnQJCQkvKiBtYXhuYW1lcyAqLywKKyAgICBpbnQqCQkvKiBjb3VudF9yZXR1cm4gKi8sCisgICAgWEZvbnRTdHJ1Y3QqKgkvKiBpbmZvX3JldHVybiAqLworKTsKK2V4dGVybiBjaGFyICoqWEdldEZvbnRQYXRoKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludCoJCS8qIG5wYXRoc19yZXR1cm4gKi8KKyk7CitleHRlcm4gY2hhciAqKlhMaXN0RXh0ZW5zaW9ucygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBuZXh0ZW5zaW9uc19yZXR1cm4gKi8KKyk7CitleHRlcm4gQXRvbSAqWExpc3RQcm9wZXJ0aWVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBpbnQqCQkvKiBudW1fcHJvcF9yZXR1cm4gKi8KKyk7CitleHRlcm4gWEhvc3RBZGRyZXNzICpYTGlzdEhvc3RzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludCoJCS8qIG5ob3N0c19yZXR1cm4gKi8sCisgICAgQm9vbCoJCS8qIHN0YXRlX3JldHVybiAqLworKTsKK19YX0RFUFJFQ0FURUQKK2V4dGVybiBLZXlTeW0gWEtleWNvZGVUb0tleXN5bSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyNpZiBOZWVkV2lkZVByb3RvdHlwZXMKKyAgICB1bnNpZ25lZCBpbnQJLyoga2V5Y29kZSAqLywKKyNlbHNlCisgICAgS2V5Q29kZQkJLyoga2V5Y29kZSAqLywKKyNlbmRpZgorICAgIGludAkJCS8qIGluZGV4ICovCispOworZXh0ZXJuIEtleVN5bSBYTG9va3VwS2V5c3ltKAorICAgIFhLZXlFdmVudCoJCS8qIGtleV9ldmVudCAqLywKKyAgICBpbnQJCQkvKiBpbmRleCAqLworKTsKK2V4dGVybiBLZXlTeW0gKlhHZXRLZXlib2FyZE1hcHBpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisjaWYgTmVlZFdpZGVQcm90b3R5cGVzCisgICAgdW5zaWduZWQgaW50CS8qIGZpcnN0X2tleWNvZGUgKi8sCisjZWxzZQorICAgIEtleUNvZGUJCS8qIGZpcnN0X2tleWNvZGUgKi8sCisjZW5kaWYKKyAgICBpbnQJCQkvKiBrZXljb2RlX2NvdW50ICovLAorICAgIGludCoJCS8qIGtleXN5bXNfcGVyX2tleWNvZGVfcmV0dXJuICovCispOworZXh0ZXJuIEtleVN5bSBYU3RyaW5nVG9LZXlzeW0oCisgICAgX1hjb25zdCBjaGFyKgkvKiBzdHJpbmcgKi8KKyk7CitleHRlcm4gbG9uZyBYTWF4UmVxdWVzdFNpemUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CitleHRlcm4gbG9uZyBYRXh0ZW5kZWRNYXhSZXF1ZXN0U2l6ZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKK2V4dGVybiBjaGFyICpYUmVzb3VyY2VNYW5hZ2VyU3RyaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIGNoYXIgKlhTY3JlZW5SZXNvdXJjZVN0cmluZygKKwlTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBYRGlzcGxheU1vdGlvbkJ1ZmZlclNpemUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CitleHRlcm4gVmlzdWFsSUQgWFZpc3VhbElERnJvbVZpc3VhbCgKKyAgICBWaXN1YWwqCQkvKiB2aXN1YWwgKi8KKyk7CisKKy8qIG11bHRpdGhyZWFkIHJvdXRpbmVzICovCisKK2V4dGVybiBTdGF0dXMgWEluaXRUaHJlYWRzKAorICAgIHZvaWQKKyk7CisKK2V4dGVybiB2b2lkIFhMb2NrRGlzcGxheSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIHZvaWQgWFVubG9ja0Rpc3BsYXkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKKy8qIHJvdXRpbmVzIGZvciBkZWFsaW5nIHdpdGggZXh0ZW5zaW9ucyAqLworCitleHRlcm4gWEV4dENvZGVzICpYSW5pdEV4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIG5hbWUgKi8KKyk7CisKK2V4dGVybiBYRXh0Q29kZXMgKlhBZGRFeHRlbnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CitleHRlcm4gWEV4dERhdGEgKlhGaW5kT25FeHRlbnNpb25MaXN0KAorICAgIFhFeHREYXRhKioJCS8qIHN0cnVjdHVyZSAqLywKKyAgICBpbnQJCQkvKiBudW1iZXIgKi8KKyk7CitleHRlcm4gWEV4dERhdGEgKipYRUhlYWRPZkV4dGVuc2lvbkxpc3QoCisgICAgWEVEYXRhT2JqZWN0CS8qIG9iamVjdCAqLworKTsKKworLyogdGhlc2UgYXJlIHJvdXRpbmVzIGZvciB3aGljaCB0aGVyZSBhcmUgYWxzbyBtYWNyb3MgKi8KK2V4dGVybiBXaW5kb3cgWFJvb3RXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLworKTsKK2V4dGVybiBXaW5kb3cgWERlZmF1bHRSb290V2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIFdpbmRvdyBYUm9vdFdpbmRvd09mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKK2V4dGVybiBWaXN1YWwgKlhEZWZhdWx0VmlzdWFsKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CitleHRlcm4gVmlzdWFsICpYRGVmYXVsdFZpc3VhbE9mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKK2V4dGVybiBHQyBYRGVmYXVsdEdDKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CitleHRlcm4gR0MgWERlZmF1bHRHQ09mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIFhCbGFja1BpeGVsKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBYV2hpdGVQaXhlbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgWEFsbFBsYW5lcygKKyAgICB2b2lkCispOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgWEJsYWNrUGl4ZWxPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBYV2hpdGVQaXhlbE9mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIFhOZXh0UmVxdWVzdCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIFhMYXN0S25vd25SZXF1ZXN0UHJvY2Vzc2VkKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIGNoYXIgKlhTZXJ2ZXJWZW5kb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CitleHRlcm4gY2hhciAqWERpc3BsYXlTdHJpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CitleHRlcm4gQ29sb3JtYXAgWERlZmF1bHRDb2xvcm1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworZXh0ZXJuIENvbG9ybWFwIFhEZWZhdWx0Q29sb3JtYXBPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CitleHRlcm4gRGlzcGxheSAqWERpc3BsYXlPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CitleHRlcm4gU2NyZWVuICpYU2NyZWVuT2ZEaXNwbGF5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CitleHRlcm4gU2NyZWVuICpYRGVmYXVsdFNjcmVlbk9mRGlzcGxheSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKK2V4dGVybiBsb25nIFhFdmVudE1hc2tPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFNjcmVlbk51bWJlck9mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKwordHlwZWRlZiBpbnQgKCpYRXJyb3JIYW5kbGVyKSAoCSAgICAvKiBXQVJOSU5HLCB0aGlzIHR5cGUgbm90IGluIFhsaWIgc3BlYyAqLworICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhFcnJvckV2ZW50KgkvKiBlcnJvcl9ldmVudCAqLworKTsKKworZXh0ZXJuIFhFcnJvckhhbmRsZXIgWFNldEVycm9ySGFuZGxlciAoCisgICAgWEVycm9ySGFuZGxlcgkvKiBoYW5kbGVyICovCispOworCisKK3R5cGVkZWYgaW50ICgqWElPRXJyb3JIYW5kbGVyKSAoICAgIC8qIFdBUk5JTkcsIHRoaXMgdHlwZSBub3QgaW4gWGxpYiBzcGVjICovCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBYSU9FcnJvckhhbmRsZXIgWFNldElPRXJyb3JIYW5kbGVyICgKKyAgICBYSU9FcnJvckhhbmRsZXIJLyogaGFuZGxlciAqLworKTsKKworCitleHRlcm4gWFBpeG1hcEZvcm1hdFZhbHVlcyAqWExpc3RQaXhtYXBGb3JtYXRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludCoJCS8qIGNvdW50X3JldHVybiAqLworKTsKK2V4dGVybiBpbnQgKlhMaXN0RGVwdGhzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8sCisgICAgaW50KgkJLyogY291bnRfcmV0dXJuICovCispOworCisvKiBJQ0NDTSByb3V0aW5lcyBmb3IgdGhpbmdzIHRoYXQgZG9uJ3QgcmVxdWlyZSBzcGVjaWFsIGluY2x1ZGUgZmlsZXM7ICovCisvKiBvdGhlciBkZWNsYXJhdGlvbnMgYXJlIGdpdmVuIGluIFh1dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitleHRlcm4gU3RhdHVzIFhSZWNvbmZpZ3VyZVdNV2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovLAorICAgIHVuc2lnbmVkIGludAkvKiBtYXNrICovLAorICAgIFhXaW5kb3dDaGFuZ2VzKgkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRXTVByb3RvY29scygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgQXRvbSoqCQkvKiBwcm90b2NvbHNfcmV0dXJuICovLAorICAgIGludCoJCS8qIGNvdW50X3JldHVybiAqLworKTsKK2V4dGVybiBTdGF0dXMgWFNldFdNUHJvdG9jb2xzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBBdG9tKgkJLyogcHJvdG9jb2xzICovLAorICAgIGludAkJCS8qIGNvdW50ICovCispOworZXh0ZXJuIFN0YXR1cyBYSWNvbmlmeVdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLworKTsKK2V4dGVybiBTdGF0dXMgWFdpdGhkcmF3V2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworZXh0ZXJuIFN0YXR1cyBYR2V0Q29tbWFuZCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgY2hhcioqKgkJLyogYXJndl9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogYXJnY19yZXR1cm4gKi8KKyk7CitleHRlcm4gU3RhdHVzIFhHZXRXTUNvbG9ybWFwV2luZG93cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgV2luZG93KioJCS8qIHdpbmRvd3NfcmV0dXJuICovLAorICAgIGludCoJCS8qIGNvdW50X3JldHVybiAqLworKTsKK2V4dGVybiBTdGF0dXMgWFNldFdNQ29sb3JtYXBXaW5kb3dzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBXaW5kb3cqCQkvKiBjb2xvcm1hcF93aW5kb3dzICovLAorICAgIGludAkJCS8qIGNvdW50ICovCispOworZXh0ZXJuIHZvaWQgWEZyZWVTdHJpbmdMaXN0KAorICAgIGNoYXIqKgkJLyogbGlzdCAqLworKTsKK2V4dGVybiBpbnQgWFNldFRyYW5zaWVudEZvckhpbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFdpbmRvdwkJLyogcHJvcF93aW5kb3cgKi8KKyk7CisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGdpdmVuIGluIGFscGhhYmV0aWNhbCBvcmRlciAqLworCitleHRlcm4gaW50IFhBY3RpdmF0ZVNjcmVlblNhdmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhBZGRIb3N0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhIb3N0QWRkcmVzcyoJLyogaG9zdCAqLworKTsKKworZXh0ZXJuIGludCBYQWRkSG9zdHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWEhvc3RBZGRyZXNzKgkvKiBob3N0cyAqLywKKyAgICBpbnQJCQkvKiBudW1faG9zdHMgKi8KKyk7CisKK2V4dGVybiBpbnQgWEFkZFRvRXh0ZW5zaW9uTGlzdCgKKyAgICBzdHJ1Y3QgX1hFeHREYXRhKioJLyogc3RydWN0dXJlICovLAorICAgIFhFeHREYXRhKgkJLyogZXh0X2RhdGEgKi8KKyk7CisKK2V4dGVybiBpbnQgWEFkZFRvU2F2ZVNldCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEFsbG9jQ29sb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIFhDb2xvcioJCS8qIHNjcmVlbl9pbl9vdXQgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEFsbG9jQ29sb3JDZWxscygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgQm9vbAkgICAgICAgIC8qIGNvbnRpZyAqLywKKyAgICB1bnNpZ25lZCBsb25nKgkvKiBwbGFuZV9tYXNrc19yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5wbGFuZXMgKi8sCisgICAgdW5zaWduZWQgbG9uZyoJLyogcGl4ZWxzX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQgCS8qIG5waXhlbHMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEFsbG9jQ29sb3JQbGFuZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIEJvb2wJCS8qIGNvbnRpZyAqLywKKyAgICB1bnNpZ25lZCBsb25nKgkvKiBwaXhlbHNfcmV0dXJuICovLAorICAgIGludAkJCS8qIG5jb2xvcnMgKi8sCisgICAgaW50CQkJLyogbnJlZHMgKi8sCisgICAgaW50CQkJLyogbmdyZWVucyAqLywKKyAgICBpbnQJCQkvKiBuYmx1ZXMgKi8sCisgICAgdW5zaWduZWQgbG9uZyoJLyogcm1hc2tfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGxvbmcqCS8qIGdtYXNrX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBsb25nKgkvKiBibWFza19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEFsbG9jTmFtZWRDb2xvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBjb2xvcl9uYW1lICovLAorICAgIFhDb2xvcioJCS8qIHNjcmVlbl9kZWZfcmV0dXJuICovLAorICAgIFhDb2xvcioJCS8qIGV4YWN0X2RlZl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEFsbG93RXZlbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV2ZW50X21vZGUgKi8sCisgICAgVGltZQkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludCBYQXV0b1JlcGVhdE9mZigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYQXV0b1JlcGVhdE9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhCZWxsKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHBlcmNlbnQgKi8KKyk7CisKK2V4dGVybiBpbnQgWEJpdG1hcEJpdE9yZGVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhCaXRtYXBQYWQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWEJpdG1hcFVuaXQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWENlbGxzT2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworCitleHRlcm4gaW50IFhDaGFuZ2VBY3RpdmVQb2ludGVyR3JhYigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogZXZlbnRfbWFzayAqLywKKyAgICBDdXJzb3IJCS8qIGN1cnNvciAqLywKKyAgICBUaW1lCQkvKiB0aW1lICovCispOworCitleHRlcm4gaW50IFhDaGFuZ2VHQygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogdmFsdWVtYXNrICovLAorICAgIFhHQ1ZhbHVlcyoJCS8qIHZhbHVlcyAqLworKTsKKworZXh0ZXJuIGludCBYQ2hhbmdlS2V5Ym9hcmRDb250cm9sKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogdmFsdWVfbWFzayAqLywKKyAgICBYS2V5Ym9hcmRDb250cm9sKgkvKiB2YWx1ZXMgKi8KKyk7CisKK2V4dGVybiBpbnQgWENoYW5nZUtleWJvYXJkTWFwcGluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBmaXJzdF9rZXljb2RlICovLAorICAgIGludAkJCS8qIGtleXN5bXNfcGVyX2tleWNvZGUgKi8sCisgICAgS2V5U3ltKgkJLyoga2V5c3ltcyAqLywKKyAgICBpbnQJCQkvKiBudW1fY29kZXMgKi8KKyk7CisKK2V4dGVybiBpbnQgWENoYW5nZVBvaW50ZXJDb250cm9sKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEJvb2wJCS8qIGRvX2FjY2VsICovLAorICAgIEJvb2wJCS8qIGRvX3RocmVzaG9sZCAqLywKKyAgICBpbnQJCQkvKiBhY2NlbF9udW1lcmF0b3IgKi8sCisgICAgaW50CQkJLyogYWNjZWxfZGVub21pbmF0b3IgKi8sCisgICAgaW50CQkJLyogdGhyZXNob2xkICovCispOworCitleHRlcm4gaW50IFhDaGFuZ2VQcm9wZXJ0eSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8sCisgICAgQXRvbQkJLyogdHlwZSAqLywKKyAgICBpbnQJCQkvKiBmb3JtYXQgKi8sCisgICAgaW50CQkJLyogbW9kZSAqLywKKyAgICBfWGNvbnN0IHVuc2lnbmVkIGNoYXIqCS8qIGRhdGEgKi8sCisgICAgaW50CQkJLyogbmVsZW1lbnRzICovCispOworCitleHRlcm4gaW50IFhDaGFuZ2VTYXZlU2V0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBpbnQJCQkvKiBjaGFuZ2VfbW9kZSAqLworKTsKKworZXh0ZXJuIGludCBYQ2hhbmdlV2luZG93QXR0cmlidXRlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiB2YWx1ZW1hc2sgKi8sCisgICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMqIC8qIGF0dHJpYnV0ZXMgKi8KKyk7CisKK2V4dGVybiBCb29sIFhDaGVja0lmRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWEV2ZW50KgkJLyogZXZlbnRfcmV0dXJuICovLAorICAgIEJvb2wgKCopICgKKwkgICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICAgWEV2ZW50KgkJCS8qIGV2ZW50ICovLAorICAgICAgICAgICAgICAgWFBvaW50ZXIJCQkvKiBhcmcgKi8KKyAgICAgICAgICAgICApCQkvKiBwcmVkaWNhdGUgKi8sCisgICAgWFBvaW50ZXIJCS8qIGFyZyAqLworKTsKKworZXh0ZXJuIEJvb2wgWENoZWNrTWFza0V2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGxvbmcJCS8qIGV2ZW50X21hc2sgKi8sCisgICAgWEV2ZW50KgkJLyogZXZlbnRfcmV0dXJuICovCispOworCitleHRlcm4gQm9vbCBYQ2hlY2tUeXBlZEV2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV2ZW50X3R5cGUgKi8sCisgICAgWEV2ZW50KgkJLyogZXZlbnRfcmV0dXJuICovCispOworCitleHRlcm4gQm9vbCBYQ2hlY2tUeXBlZFdpbmRvd0V2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBpbnQJCQkvKiBldmVudF90eXBlICovLAorICAgIFhFdmVudCoJCS8qIGV2ZW50X3JldHVybiAqLworKTsKKworZXh0ZXJuIEJvb2wgWENoZWNrV2luZG93RXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGxvbmcJCS8qIGV2ZW50X21hc2sgKi8sCisgICAgWEV2ZW50KgkJLyogZXZlbnRfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhDaXJjdWxhdGVTdWJ3aW5kb3dzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBpbnQJCQkvKiBkaXJlY3Rpb24gKi8KKyk7CisKK2V4dGVybiBpbnQgWENpcmN1bGF0ZVN1YndpbmRvd3NEb3duKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYQ2lyY3VsYXRlU3Vid2luZG93c1VwKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYQ2xlYXJBcmVhKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgQm9vbAkJLyogZXhwb3N1cmVzICovCispOworCitleHRlcm4gaW50IFhDbGVhcldpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWENsb3NlRGlzcGxheSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYQ29uZmlndXJlV2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogdmFsdWVfbWFzayAqLywKKyAgICBYV2luZG93Q2hhbmdlcyoJLyogdmFsdWVzICovCispOworCitleHRlcm4gaW50IFhDb25uZWN0aW9uTnVtYmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhDb252ZXJ0U2VsZWN0aW9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEF0b20JCS8qIHNlbGVjdGlvbiAqLywKKyAgICBBdG9tIAkJLyogdGFyZ2V0ICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovLAorICAgIFdpbmRvdwkJLyogcmVxdWVzdG9yICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBpbnQgWENvcHlBcmVhKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBzcmMgKi8sCisgICAgRHJhd2FibGUJCS8qIGRlc3QgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiBzcmNfeCAqLywKKyAgICBpbnQJCQkvKiBzcmNfeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICBpbnQJCQkvKiBkZXN0X3ggKi8sCisgICAgaW50CQkJLyogZGVzdF95ICovCispOworCitleHRlcm4gaW50IFhDb3B5R0MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBzcmMgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiB2YWx1ZW1hc2sgKi8sCisgICAgR0MJCQkvKiBkZXN0ICovCispOworCitleHRlcm4gaW50IFhDb3B5UGxhbmUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIHNyYyAqLywKKyAgICBEcmF3YWJsZQkJLyogZGVzdCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHNyY194ICovLAorICAgIGludAkJCS8qIHNyY195ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIGludAkJCS8qIGRlc3RfeCAqLywKKyAgICBpbnQJCQkvKiBkZXN0X3kgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBwbGFuZSAqLworKTsKKworZXh0ZXJuIGludCBYRGVmYXVsdERlcHRoKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CisKK2V4dGVybiBpbnQgWERlZmF1bHREZXB0aE9mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKworZXh0ZXJuIGludCBYRGVmYXVsdFNjcmVlbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYRGVmaW5lQ3Vyc29yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBDdXJzb3IJCS8qIGN1cnNvciAqLworKTsKKworZXh0ZXJuIGludCBYRGVsZXRlUHJvcGVydHkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovCispOworCitleHRlcm4gaW50IFhEZXN0cm95V2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYRGVzdHJveVN1YndpbmRvd3MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovCispOworCitleHRlcm4gaW50IFhEb2VzQmFja2luZ1N0b3JlKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKworZXh0ZXJuIEJvb2wgWERvZXNTYXZlVW5kZXJzKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKworZXh0ZXJuIGludCBYRGlzYWJsZUFjY2Vzc0NvbnRyb2woCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKKworZXh0ZXJuIGludCBYRGlzcGxheUNlbGxzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CisKK2V4dGVybiBpbnQgWERpc3BsYXlIZWlnaHQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLworKTsKKworZXh0ZXJuIGludCBYRGlzcGxheUhlaWdodE1NKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CisKK2V4dGVybiBpbnQgWERpc3BsYXlLZXljb2RlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBtaW5fa2V5Y29kZXNfcmV0dXJuICovLAorICAgIGludCoJCS8qIG1heF9rZXljb2Rlc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWERpc3BsYXlQbGFuZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLworKTsKKworZXh0ZXJuIGludCBYRGlzcGxheVdpZHRoKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CisKK2V4dGVybiBpbnQgWERpc3BsYXlXaWR0aE1NKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CisKK2V4dGVybiBpbnQgWERyYXdBcmMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgaW50CQkJLyogYW5nbGUxICovLAorICAgIGludAkJCS8qIGFuZ2xlMiAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd0FyY3MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYQXJjKgkJLyogYXJjcyAqLywKKyAgICBpbnQJCQkvKiBuYXJjcyAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd0ltYWdlU3RyaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIGxlbmd0aCAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd0ltYWdlU3RyaW5nMTYoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgX1hjb25zdCBYQ2hhcjJiKgkvKiBzdHJpbmcgKi8sCisgICAgaW50CQkJLyogbGVuZ3RoICovCispOworCitleHRlcm4gaW50IFhEcmF3TGluZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHgxICovLAorICAgIGludAkJCS8qIHkxICovLAorICAgIGludAkJCS8qIHgyICovLAorICAgIGludAkJCS8qIHkyICovCispOworCitleHRlcm4gaW50IFhEcmF3TGluZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYUG9pbnQqCQkvKiBwb2ludHMgKi8sCisgICAgaW50CQkJLyogbnBvaW50cyAqLywKKyAgICBpbnQJCQkvKiBtb2RlICovCispOworCitleHRlcm4gaW50IFhEcmF3UG9pbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8KKyk7CisKK2V4dGVybiBpbnQgWERyYXdQb2ludHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYUG9pbnQqCQkvKiBwb2ludHMgKi8sCisgICAgaW50CQkJLyogbnBvaW50cyAqLywKKyAgICBpbnQJCQkvKiBtb2RlICovCispOworCitleHRlcm4gaW50IFhEcmF3UmVjdGFuZ2xlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCispOworCitleHRlcm4gaW50IFhEcmF3UmVjdGFuZ2xlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiByZWN0YW5nbGVzICovLAorICAgIGludAkJCS8qIG5yZWN0YW5nbGVzICovCispOworCitleHRlcm4gaW50IFhEcmF3U2VnbWVudHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYU2VnbWVudCoJCS8qIHNlZ21lbnRzICovLAorICAgIGludAkJCS8qIG5zZWdtZW50cyAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd1N0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLywKKyAgICBpbnQJCQkvKiBsZW5ndGggKi8KKyk7CisKK2V4dGVybiBpbnQgWERyYXdTdHJpbmcxNigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICBfWGNvbnN0IFhDaGFyMmIqCS8qIHN0cmluZyAqLywKKyAgICBpbnQJCQkvKiBsZW5ndGggKi8KKyk7CisKK2V4dGVybiBpbnQgWERyYXdUZXh0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIFhUZXh0SXRlbSoJCS8qIGl0ZW1zICovLAorICAgIGludAkJCS8qIG5pdGVtcyAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd1RleHQxNigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICBYVGV4dEl0ZW0xNioJLyogaXRlbXMgKi8sCisgICAgaW50CQkJLyogbml0ZW1zICovCispOworCitleHRlcm4gaW50IFhFbmFibGVBY2Nlc3NDb250cm9sKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhFdmVudHNRdWV1ZWQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogbW9kZSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYRmV0Y2hOYW1lKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBjaGFyKioJCS8qIHdpbmRvd19uYW1lX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYRmlsbEFyYygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICBpbnQJCQkvKiBhbmdsZTEgKi8sCisgICAgaW50CQkJLyogYW5nbGUyICovCispOworCitleHRlcm4gaW50IFhGaWxsQXJjcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFhBcmMqCQkvKiBhcmNzICovLAorICAgIGludAkJCS8qIG5hcmNzICovCispOworCitleHRlcm4gaW50IFhGaWxsUG9seWdvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFhQb2ludCoJCS8qIHBvaW50cyAqLywKKyAgICBpbnQJCQkvKiBucG9pbnRzICovLAorICAgIGludAkJCS8qIHNoYXBlICovLAorICAgIGludAkJCS8qIG1vZGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZpbGxSZWN0YW5nbGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZpbGxSZWN0YW5nbGVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIHJlY3RhbmdsZXMgKi8sCisgICAgaW50CQkJLyogbnJlY3RhbmdsZXMgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZsdXNoKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhGb3JjZVNjcmVlblNhdmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIG1vZGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZyZWUoCisgICAgdm9pZCoJCS8qIGRhdGEgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZyZWVDb2xvcm1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZyZWVDb2xvcnMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIHVuc2lnbmVkIGxvbmcqCS8qIHBpeGVscyAqLywKKyAgICBpbnQJCQkvKiBucGl4ZWxzICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogcGxhbmVzICovCispOworCitleHRlcm4gaW50IFhGcmVlQ3Vyc29yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEN1cnNvcgkJLyogY3Vyc29yICovCispOworCitleHRlcm4gaW50IFhGcmVlRXh0ZW5zaW9uTGlzdCgKKyAgICBjaGFyKioJCS8qIGxpc3QgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZyZWVGb250KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhGb250U3RydWN0KgkvKiBmb250X3N0cnVjdCAqLworKTsKKworZXh0ZXJuIGludCBYRnJlZUZvbnRJbmZvKAorICAgIGNoYXIqKgkJLyogbmFtZXMgKi8sCisgICAgWEZvbnRTdHJ1Y3QqCS8qIGZyZWVfaW5mbyAqLywKKyAgICBpbnQJCQkvKiBhY3R1YWxfY291bnQgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZyZWVGb250TmFtZXMoCisgICAgY2hhcioqCQkvKiBsaXN0ICovCispOworCitleHRlcm4gaW50IFhGcmVlRm9udFBhdGgoCisgICAgY2hhcioqCQkvKiBsaXN0ICovCispOworCitleHRlcm4gaW50IFhGcmVlR0MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLworKTsKKworZXh0ZXJuIGludCBYRnJlZU1vZGlmaWVybWFwKAorICAgIFhNb2RpZmllcktleW1hcCoJLyogbW9kbWFwICovCispOworCitleHRlcm4gaW50IFhGcmVlUGl4bWFwKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFBpeG1hcAkJLyogcGl4bWFwICovCispOworCitleHRlcm4gaW50IFhHZW9tZXRyeSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW4gKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBwb3NpdGlvbiAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGRlZmF1bHRfcG9zaXRpb24gKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGJ3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogZndpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBmaGVpZ2h0ICovLAorICAgIGludAkJCS8qIHhhZGRlciAqLywKKyAgICBpbnQJCQkvKiB5YWRkZXIgKi8sCisgICAgaW50KgkJLyogeF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogeV9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogd2lkdGhfcmV0dXJuICovLAorICAgIGludCoJCS8qIGhlaWdodF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEdldEVycm9yRGF0YWJhc2VUZXh0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogbmFtZSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIG1lc3NhZ2UgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBkZWZhdWx0X3N0cmluZyAqLywKKyAgICBjaGFyKgkJLyogYnVmZmVyX3JldHVybiAqLywKKyAgICBpbnQJCQkvKiBsZW5ndGggKi8KKyk7CisKK2V4dGVybiBpbnQgWEdldEVycm9yVGV4dCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBjb2RlICovLAorICAgIGNoYXIqCQkvKiBidWZmZXJfcmV0dXJuICovLAorICAgIGludAkJCS8qIGxlbmd0aCAqLworKTsKKworZXh0ZXJuIEJvb2wgWEdldEZvbnRQcm9wZXJ0eSgKKyAgICBYRm9udFN0cnVjdCoJLyogZm9udF9zdHJ1Y3QgKi8sCisgICAgQXRvbQkJLyogYXRvbSAqLywKKyAgICB1bnNpZ25lZCBsb25nKgkvKiB2YWx1ZV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldEdDVmFsdWVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiB2YWx1ZW1hc2sgKi8sCisgICAgWEdDVmFsdWVzKgkJLyogdmFsdWVzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0R2VvbWV0cnkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgV2luZG93KgkJLyogcm9vdF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogeF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogeV9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiB3aWR0aF9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiBoZWlnaHRfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCoJLyogYm9yZGVyX3dpZHRoX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGRlcHRoX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0SWNvbk5hbWUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGNoYXIqKgkJLyogaWNvbl9uYW1lX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYR2V0SW5wdXRGb2N1cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cqCQkvKiBmb2N1c19yZXR1cm4gKi8sCisgICAgaW50KgkJLyogcmV2ZXJ0X3RvX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYR2V0S2V5Ym9hcmRDb250cm9sKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhLZXlib2FyZFN0YXRlKgkvKiB2YWx1ZXNfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhHZXRQb2ludGVyQ29udHJvbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBhY2NlbF9udW1lcmF0b3JfcmV0dXJuICovLAorICAgIGludCoJCS8qIGFjY2VsX2Rlbm9taW5hdG9yX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiB0aHJlc2hvbGRfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhHZXRQb2ludGVyTWFwcGluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICB1bnNpZ25lZCBjaGFyKgkvKiBtYXBfcmV0dXJuICovLAorICAgIGludAkJCS8qIG5tYXAgKi8KKyk7CisKK2V4dGVybiBpbnQgWEdldFNjcmVlblNhdmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludCoJCS8qIHRpbWVvdXRfcmV0dXJuICovLAorICAgIGludCoJCS8qIGludGVydmFsX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBwcmVmZXJfYmxhbmtpbmdfcmV0dXJuICovLAorICAgIGludCoJCS8qIGFsbG93X2V4cG9zdXJlc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFRyYW5zaWVudEZvckhpbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFdpbmRvdyoJCS8qIHByb3Bfd2luZG93X3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYR2V0V2luZG93UHJvcGVydHkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovLAorICAgIGxvbmcJCS8qIGxvbmdfb2Zmc2V0ICovLAorICAgIGxvbmcJCS8qIGxvbmdfbGVuZ3RoICovLAorICAgIEJvb2wJCS8qIGRlbGV0ZSAqLywKKyAgICBBdG9tCQkvKiByZXFfdHlwZSAqLywKKyAgICBBdG9tKgkJLyogYWN0dWFsX3R5cGVfcmV0dXJuICovLAorICAgIGludCoJCS8qIGFjdHVhbF9mb3JtYXRfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGxvbmcqCS8qIG5pdGVtc19yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgbG9uZyoJLyogYnl0ZXNfYWZ0ZXJfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGNoYXIqKgkvKiBwcm9wX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0V2luZG93QXR0cmlidXRlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFdpbmRvd0F0dHJpYnV0ZXMqCS8qIHdpbmRvd19hdHRyaWJ1dGVzX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYR3JhYkJ1dHRvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogYnV0dG9uICovLAorICAgIHVuc2lnbmVkIGludAkvKiBtb2RpZmllcnMgKi8sCisgICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLywKKyAgICBCb29sCQkvKiBvd25lcl9ldmVudHMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGV2ZW50X21hc2sgKi8sCisgICAgaW50CQkJLyogcG9pbnRlcl9tb2RlICovLAorICAgIGludAkJCS8qIGtleWJvYXJkX21vZGUgKi8sCisgICAgV2luZG93CQkvKiBjb25maW5lX3RvICovLAorICAgIEN1cnNvcgkJLyogY3Vyc29yICovCispOworCitleHRlcm4gaW50IFhHcmFiS2V5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGtleWNvZGUgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG1vZGlmaWVycyAqLywKKyAgICBXaW5kb3cJCS8qIGdyYWJfd2luZG93ICovLAorICAgIEJvb2wJCS8qIG93bmVyX2V2ZW50cyAqLywKKyAgICBpbnQJCQkvKiBwb2ludGVyX21vZGUgKi8sCisgICAgaW50CQkJLyoga2V5Ym9hcmRfbW9kZSAqLworKTsKKworZXh0ZXJuIGludCBYR3JhYktleWJvYXJkKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogZ3JhYl93aW5kb3cgKi8sCisgICAgQm9vbAkJLyogb3duZXJfZXZlbnRzICovLAorICAgIGludAkJCS8qIHBvaW50ZXJfbW9kZSAqLywKKyAgICBpbnQJCQkvKiBrZXlib2FyZF9tb2RlICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBpbnQgWEdyYWJQb2ludGVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogZ3JhYl93aW5kb3cgKi8sCisgICAgQm9vbAkJLyogb3duZXJfZXZlbnRzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBldmVudF9tYXNrICovLAorICAgIGludAkJCS8qIHBvaW50ZXJfbW9kZSAqLywKKyAgICBpbnQJCQkvKiBrZXlib2FyZF9tb2RlICovLAorICAgIFdpbmRvdwkJLyogY29uZmluZV90byAqLywKKyAgICBDdXJzb3IJCS8qIGN1cnNvciAqLywKKyAgICBUaW1lCQkvKiB0aW1lICovCispOworCitleHRlcm4gaW50IFhHcmFiU2VydmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhIZWlnaHRNTU9mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKworZXh0ZXJuIGludCBYSGVpZ2h0T2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworCitleHRlcm4gaW50IFhJZkV2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhFdmVudCoJCS8qIGV2ZW50X3JldHVybiAqLywKKyAgICBCb29sICgqKSAoCisJICAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgIFhFdmVudCoJCQkvKiBldmVudCAqLywKKyAgICAgICAgICAgICAgIFhQb2ludGVyCQkJLyogYXJnICovCisgICAgICAgICAgICAgKQkJLyogcHJlZGljYXRlICovLAorICAgIFhQb2ludGVyCQkvKiBhcmcgKi8KKyk7CisKK2V4dGVybiBpbnQgWEltYWdlQnl0ZU9yZGVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhJbnN0YWxsQ29sb3JtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovCispOworCitleHRlcm4gS2V5Q29kZSBYS2V5c3ltVG9LZXljb2RlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEtleVN5bQkJLyoga2V5c3ltICovCispOworCitleHRlcm4gaW50IFhLaWxsQ2xpZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhJRAkJCS8qIHJlc291cmNlICovCispOworCitleHRlcm4gU3RhdHVzIFhMb29rdXBDb2xvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBjb2xvcl9uYW1lICovLAorICAgIFhDb2xvcioJCS8qIGV4YWN0X2RlZl9yZXR1cm4gKi8sCisgICAgWENvbG9yKgkJLyogc2NyZWVuX2RlZl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWExvd2VyV2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYTWFwUmFpc2VkKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYTWFwU3Vid2luZG93cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWE1hcFdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWE1hc2tFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBsb25nCQkvKiBldmVudF9tYXNrICovLAorICAgIFhFdmVudCoJCS8qIGV2ZW50X3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYTWF4Q21hcHNPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK2V4dGVybiBpbnQgWE1pbkNtYXBzT2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworCitleHRlcm4gaW50IFhNb3ZlUmVzaXplV2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8KKyk7CisKK2V4dGVybiBpbnQgWE1vdmVXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLworKTsKKworZXh0ZXJuIGludCBYTmV4dEV2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhFdmVudCoJCS8qIGV2ZW50X3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYTm9PcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYUGFyc2VDb2xvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBzcGVjICovLAorICAgIFhDb2xvcioJCS8qIGV4YWN0X2RlZl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFBhcnNlR2VvbWV0cnkoCisgICAgX1hjb25zdCBjaGFyKgkvKiBwYXJzZXN0cmluZyAqLywKKyAgICBpbnQqCQkvKiB4X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiB5X3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGhlaWdodF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFBlZWtFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFBlZWtJZkV2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhFdmVudCoJCS8qIGV2ZW50X3JldHVybiAqLywKKyAgICBCb29sICgqKSAoCisJICAgICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICAgWEV2ZW50KgkJLyogZXZlbnQgKi8sCisgICAgICAgICAgICAgICBYUG9pbnRlcgkJLyogYXJnICovCisgICAgICAgICAgICAgKQkJLyogcHJlZGljYXRlICovLAorICAgIFhQb2ludGVyCQkvKiBhcmcgKi8KKyk7CisKK2V4dGVybiBpbnQgWFBlbmRpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWFBsYW5lc09mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKworZXh0ZXJuIGludCBYUHJvdG9jb2xSZXZpc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYUHJvdG9jb2xWZXJzaW9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCisKK2V4dGVybiBpbnQgWFB1dEJhY2tFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudCAqLworKTsKKworZXh0ZXJuIGludCBYUHV0SW1hZ2UoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYSW1hZ2UqCQkvKiBpbWFnZSAqLywKKyAgICBpbnQJCQkvKiBzcmNfeCAqLywKKyAgICBpbnQJCQkvKiBzcmNfeSAqLywKKyAgICBpbnQJCQkvKiBkZXN0X3ggKi8sCisgICAgaW50CQkJLyogZGVzdF95ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCispOworCitleHRlcm4gaW50IFhRTGVuZ3RoKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gU3RhdHVzIFhRdWVyeUJlc3RDdXJzb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgdW5zaWduZWQgaW50ICAgICAgICAvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYUXVlcnlCZXN0U2l6ZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBjbGFzcyAqLywKKyAgICBEcmF3YWJsZQkJLyogd2hpY2hfc2NyZWVuICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYUXVlcnlCZXN0U3RpcHBsZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogd2hpY2hfc2NyZWVuICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYUXVlcnlCZXN0VGlsZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogd2hpY2hfc2NyZWVuICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYUXVlcnlDb2xvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgWENvbG9yKgkJLyogZGVmX2luX291dCAqLworKTsKKworZXh0ZXJuIGludCBYUXVlcnlDb2xvcnMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIFhDb2xvcioJCS8qIGRlZnNfaW5fb3V0ICovLAorICAgIGludAkJCS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBCb29sIFhRdWVyeUV4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIG5hbWUgKi8sCisgICAgaW50KgkJLyogbWFqb3Jfb3Bjb2RlX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBmaXJzdF9ldmVudF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZmlyc3RfZXJyb3JfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhRdWVyeUtleW1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBjaGFyIFszMl0JCS8qIGtleXNfcmV0dXJuICovCispOworCitleHRlcm4gQm9vbCBYUXVlcnlQb2ludGVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBXaW5kb3cqCQkvKiByb290X3JldHVybiAqLywKKyAgICBXaW5kb3cqCQkvKiBjaGlsZF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogcm9vdF94X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiByb290X3lfcmV0dXJuICovLAorICAgIGludCoJCS8qIHdpbl94X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiB3aW5feV9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50KiAgICAgICAvKiBtYXNrX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYUXVlcnlUZXh0RXh0ZW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYSUQJCQkvKiBmb250X0lEICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIG5jaGFycyAqLywKKyAgICBpbnQqCQkvKiBkaXJlY3Rpb25fcmV0dXJuICovLAorICAgIGludCoJCS8qIGZvbnRfYXNjZW50X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBmb250X2Rlc2NlbnRfcmV0dXJuICovLAorICAgIFhDaGFyU3RydWN0KgkvKiBvdmVyYWxsX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYUXVlcnlUZXh0RXh0ZW50czE2KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhJRAkJCS8qIGZvbnRfSUQgKi8sCisgICAgX1hjb25zdCBYQ2hhcjJiKgkvKiBzdHJpbmcgKi8sCisgICAgaW50CQkJLyogbmNoYXJzICovLAorICAgIGludCoJCS8qIGRpcmVjdGlvbl9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZm9udF9hc2NlbnRfcmV0dXJuICovLAorICAgIGludCoJCS8qIGZvbnRfZGVzY2VudF9yZXR1cm4gKi8sCisgICAgWENoYXJTdHJ1Y3QqCS8qIG92ZXJhbGxfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhRdWVyeVRyZWUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFdpbmRvdyoJCS8qIHJvb3RfcmV0dXJuICovLAorICAgIFdpbmRvdyoJCS8qIHBhcmVudF9yZXR1cm4gKi8sCisgICAgV2luZG93KioJCS8qIGNoaWxkcmVuX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIG5jaGlsZHJlbl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFJhaXNlV2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYUmVhZEJpdG1hcEZpbGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUgCQkvKiBkICovLAorICAgIF9YY29uc3QgY2hhcioJLyogZmlsZW5hbWUgKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiB3aWR0aF9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiBoZWlnaHRfcmV0dXJuICovLAorICAgIFBpeG1hcCoJCS8qIGJpdG1hcF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogeF9ob3RfcmV0dXJuICovLAorICAgIGludCoJCS8qIHlfaG90X3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYUmVhZEJpdG1hcEZpbGVEYXRhKAorICAgIF9YY29uc3QgY2hhcioJLyogZmlsZW5hbWUgKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiB3aWR0aF9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiBoZWlnaHRfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGNoYXIqKgkvKiBkYXRhX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiB4X2hvdF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogeV9ob3RfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhSZWJpbmRLZXlzeW0oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgS2V5U3ltCQkvKiBrZXlzeW0gKi8sCisgICAgS2V5U3ltKgkJLyogbGlzdCAqLywKKyAgICBpbnQJCQkvKiBtb2RfY291bnQgKi8sCisgICAgX1hjb25zdCB1bnNpZ25lZCBjaGFyKgkvKiBzdHJpbmcgKi8sCisgICAgaW50CQkJLyogYnl0ZXNfc3RyaW5nICovCispOworCitleHRlcm4gaW50IFhSZWNvbG9yQ3Vyc29yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEN1cnNvcgkJLyogY3Vyc29yICovLAorICAgIFhDb2xvcioJCS8qIGZvcmVncm91bmRfY29sb3IgKi8sCisgICAgWENvbG9yKgkJLyogYmFja2dyb3VuZF9jb2xvciAqLworKTsKKworZXh0ZXJuIGludCBYUmVmcmVzaEtleWJvYXJkTWFwcGluZygKKyAgICBYTWFwcGluZ0V2ZW50KgkvKiBldmVudF9tYXAgKi8KKyk7CisKK2V4dGVybiBpbnQgWFJlbW92ZUZyb21TYXZlU2V0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYUmVtb3ZlSG9zdCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYSG9zdEFkZHJlc3MqCS8qIGhvc3QgKi8KKyk7CisKK2V4dGVybiBpbnQgWFJlbW92ZUhvc3RzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhIb3N0QWRkcmVzcyoJLyogaG9zdHMgKi8sCisgICAgaW50CQkJLyogbnVtX2hvc3RzICovCispOworCitleHRlcm4gaW50IFhSZXBhcmVudFdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgV2luZG93CQkvKiBwYXJlbnQgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovCispOworCitleHRlcm4gaW50IFhSZXNldFNjcmVlblNhdmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhSZXNpemVXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCispOworCitleHRlcm4gaW50IFhSZXN0YWNrV2luZG93cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cqCQkvKiB3aW5kb3dzICovLAorICAgIGludAkJCS8qIG53aW5kb3dzICovCispOworCitleHRlcm4gaW50IFhSb3RhdGVCdWZmZXJzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHJvdGF0ZSAqLworKTsKKworZXh0ZXJuIGludCBYUm90YXRlV2luZG93UHJvcGVydGllcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgQXRvbSoJCS8qIHByb3BlcnRpZXMgKi8sCisgICAgaW50CQkJLyogbnVtX3Byb3AgKi8sCisgICAgaW50CQkJLyogbnBvc2l0aW9ucyAqLworKTsKKworZXh0ZXJuIGludCBYU2NyZWVuQ291bnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNlbGVjdElucHV0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBsb25nCQkvKiBldmVudF9tYXNrICovCispOworCitleHRlcm4gU3RhdHVzIFhTZW5kRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIEJvb2wJCS8qIHByb3BhZ2F0ZSAqLywKKyAgICBsb25nCQkvKiBldmVudF9tYXNrICovLAorICAgIFhFdmVudCoJCS8qIGV2ZW50X3NlbmQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldEFjY2Vzc0NvbnRyb2woCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogbW9kZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0QXJjTW9kZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIGFyY19tb2RlICovCispOworCitleHRlcm4gaW50IFhTZXRCYWNrZ3JvdW5kKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBiYWNrZ3JvdW5kICovCispOworCitleHRlcm4gaW50IFhTZXRDbGlwTWFzaygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFBpeG1hcAkJLyogcGl4bWFwICovCispOworCitleHRlcm4gaW50IFhTZXRDbGlwT3JpZ2luKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogY2xpcF94X29yaWdpbiAqLywKKyAgICBpbnQJCQkvKiBjbGlwX3lfb3JpZ2luICovCispOworCitleHRlcm4gaW50IFhTZXRDbGlwUmVjdGFuZ2xlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIGNsaXBfeF9vcmlnaW4gKi8sCisgICAgaW50CQkJLyogY2xpcF95X29yaWdpbiAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogcmVjdGFuZ2xlcyAqLywKKyAgICBpbnQJCQkvKiBuICovLAorICAgIGludAkJCS8qIG9yZGVyaW5nICovCispOworCitleHRlcm4gaW50IFhTZXRDbG9zZURvd25Nb2RlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGNsb3NlX21vZGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldENvbW1hbmQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGNoYXIqKgkJLyogYXJndiAqLywKKyAgICBpbnQJCQkvKiBhcmdjICovCispOworCitleHRlcm4gaW50IFhTZXREYXNoZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiBkYXNoX29mZnNldCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGRhc2hfbGlzdCAqLywKKyAgICBpbnQJCQkvKiBuICovCispOworCitleHRlcm4gaW50IFhTZXRGaWxsUnVsZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIGZpbGxfcnVsZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0RmlsbFN0eWxlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogZmlsbF9zdHlsZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0Rm9udCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIEZvbnQJCS8qIGZvbnQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldEZvbnRQYXRoKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGNoYXIqKgkJLyogZGlyZWN0b3JpZXMgKi8sCisgICAgaW50CQkJLyogbmRpcnMgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldEZvcmVncm91bmQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGZvcmVncm91bmQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldEZ1bmN0aW9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogZnVuY3Rpb24gKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldEdyYXBoaWNzRXhwb3N1cmVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgQm9vbAkJLyogZ3JhcGhpY3NfZXhwb3N1cmVzICovCispOworCitleHRlcm4gaW50IFhTZXRJY29uTmFtZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBpY29uX25hbWUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldElucHV0Rm9jdXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiBmb2N1cyAqLywKKyAgICBpbnQJCQkvKiByZXZlcnRfdG8gKi8sCisgICAgVGltZQkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0TGluZUF0dHJpYnV0ZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbGluZV93aWR0aCAqLywKKyAgICBpbnQJCQkvKiBsaW5lX3N0eWxlICovLAorICAgIGludAkJCS8qIGNhcF9zdHlsZSAqLywKKyAgICBpbnQJCQkvKiBqb2luX3N0eWxlICovCispOworCitleHRlcm4gaW50IFhTZXRNb2RpZmllck1hcHBpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWE1vZGlmaWVyS2V5bWFwKgkvKiBtb2RtYXAgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFBsYW5lTWFzaygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogcGxhbmVfbWFzayAqLworKTsKKworZXh0ZXJuIGludCBYU2V0UG9pbnRlck1hcHBpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCB1bnNpZ25lZCBjaGFyKgkvKiBtYXAgKi8sCisgICAgaW50CQkJLyogbm1hcCAqLworKTsKKworZXh0ZXJuIGludCBYU2V0U2NyZWVuU2F2ZXIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogdGltZW91dCAqLywKKyAgICBpbnQJCQkvKiBpbnRlcnZhbCAqLywKKyAgICBpbnQJCQkvKiBwcmVmZXJfYmxhbmtpbmcgKi8sCisgICAgaW50CQkJLyogYWxsb3dfZXhwb3N1cmVzICovCispOworCitleHRlcm4gaW50IFhTZXRTZWxlY3Rpb25Pd25lcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBBdG9tCSAgICAgICAgLyogc2VsZWN0aW9uICovLAorICAgIFdpbmRvdwkJLyogb3duZXIgKi8sCisgICAgVGltZQkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0U3RhdGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICB1bnNpZ25lZCBsb25nIAkvKiBmb3JlZ3JvdW5kICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogYmFja2dyb3VuZCAqLywKKyAgICBpbnQJCQkvKiBmdW5jdGlvbiAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHBsYW5lX21hc2sgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFN0aXBwbGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBQaXhtYXAJCS8qIHN0aXBwbGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFN1YndpbmRvd01vZGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiBzdWJ3aW5kb3dfbW9kZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0VFNPcmlnaW4oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB0c194X29yaWdpbiAqLywKKyAgICBpbnQJCQkvKiB0c195X29yaWdpbiAqLworKTsKKworZXh0ZXJuIGludCBYU2V0VGlsZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFBpeG1hcAkJLyogdGlsZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0V2luZG93QmFja2dyb3VuZCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBiYWNrZ3JvdW5kX3BpeGVsICovCispOworCitleHRlcm4gaW50IFhTZXRXaW5kb3dCYWNrZ3JvdW5kUGl4bWFwKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBQaXhtYXAJCS8qIGJhY2tncm91bmRfcGl4bWFwICovCispOworCitleHRlcm4gaW50IFhTZXRXaW5kb3dCb3JkZXIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogYm9yZGVyX3BpeGVsICovCispOworCitleHRlcm4gaW50IFhTZXRXaW5kb3dCb3JkZXJQaXhtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFBpeG1hcAkJLyogYm9yZGVyX3BpeG1hcCAqLworKTsKKworZXh0ZXJuIGludCBYU2V0V2luZG93Qm9yZGVyV2lkdGgoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLworKTsKKworZXh0ZXJuIGludCBYU2V0V2luZG93Q29sb3JtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLworKTsKKworZXh0ZXJuIGludCBYU3RvcmVCdWZmZXIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBieXRlcyAqLywKKyAgICBpbnQJCQkvKiBuYnl0ZXMgKi8sCisgICAgaW50CQkJLyogYnVmZmVyICovCispOworCitleHRlcm4gaW50IFhTdG9yZUJ5dGVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogYnl0ZXMgKi8sCisgICAgaW50CQkJLyogbmJ5dGVzICovCispOworCitleHRlcm4gaW50IFhTdG9yZUNvbG9yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBYQ29sb3IqCQkvKiBjb2xvciAqLworKTsKKworZXh0ZXJuIGludCBYU3RvcmVDb2xvcnMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIFhDb2xvcioJCS8qIGNvbG9yICovLAorICAgIGludAkJCS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBpbnQgWFN0b3JlTmFtZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB3aW5kb3dfbmFtZSAqLworKTsKKworZXh0ZXJuIGludCBYU3RvcmVOYW1lZENvbG9yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGNvbG9yICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogcGl4ZWwgKi8sCisgICAgaW50CQkJLyogZmxhZ3MgKi8KKyk7CisKK2V4dGVybiBpbnQgWFN5bmMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQm9vbAkJLyogZGlzY2FyZCAqLworKTsKKworZXh0ZXJuIGludCBYVGV4dEV4dGVudHMoCisgICAgWEZvbnRTdHJ1Y3QqCS8qIGZvbnRfc3RydWN0ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIG5jaGFycyAqLywKKyAgICBpbnQqCQkvKiBkaXJlY3Rpb25fcmV0dXJuICovLAorICAgIGludCoJCS8qIGZvbnRfYXNjZW50X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBmb250X2Rlc2NlbnRfcmV0dXJuICovLAorICAgIFhDaGFyU3RydWN0KgkvKiBvdmVyYWxsX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYVGV4dEV4dGVudHMxNigKKyAgICBYRm9udFN0cnVjdCoJLyogZm9udF9zdHJ1Y3QgKi8sCisgICAgX1hjb25zdCBYQ2hhcjJiKgkvKiBzdHJpbmcgKi8sCisgICAgaW50CQkJLyogbmNoYXJzICovLAorICAgIGludCoJCS8qIGRpcmVjdGlvbl9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZm9udF9hc2NlbnRfcmV0dXJuICovLAorICAgIGludCoJCS8qIGZvbnRfZGVzY2VudF9yZXR1cm4gKi8sCisgICAgWENoYXJTdHJ1Y3QqCS8qIG92ZXJhbGxfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhUZXh0V2lkdGgoCisgICAgWEZvbnRTdHJ1Y3QqCS8qIGZvbnRfc3RydWN0ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIGNvdW50ICovCispOworCitleHRlcm4gaW50IFhUZXh0V2lkdGgxNigKKyAgICBYRm9udFN0cnVjdCoJLyogZm9udF9zdHJ1Y3QgKi8sCisgICAgX1hjb25zdCBYQ2hhcjJiKgkvKiBzdHJpbmcgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8KKyk7CisKK2V4dGVybiBCb29sIFhUcmFuc2xhdGVDb29yZGluYXRlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHNyY193ICovLAorICAgIFdpbmRvdwkJLyogZGVzdF93ICovLAorICAgIGludAkJCS8qIHNyY194ICovLAorICAgIGludAkJCS8qIHNyY195ICovLAorICAgIGludCoJCS8qIGRlc3RfeF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZGVzdF95X3JldHVybiAqLywKKyAgICBXaW5kb3cqCQkvKiBjaGlsZF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFVuZGVmaW5lQ3Vyc29yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYVW5ncmFiQnV0dG9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBidXR0b24gKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG1vZGlmaWVycyAqLywKKyAgICBXaW5kb3cJCS8qIGdyYWJfd2luZG93ICovCispOworCitleHRlcm4gaW50IFhVbmdyYWJLZXkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyoga2V5Y29kZSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbW9kaWZpZXJzICovLAorICAgIFdpbmRvdwkJLyogZ3JhYl93aW5kb3cgKi8KKyk7CisKK2V4dGVybiBpbnQgWFVuZ3JhYktleWJvYXJkKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFVuZ3JhYlBvaW50ZXIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgVGltZQkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludCBYVW5ncmFiU2VydmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhVbmluc3RhbGxDb2xvcm1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8KKyk7CisKK2V4dGVybiBpbnQgWFVubG9hZEZvbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRm9udAkJLyogZm9udCAqLworKTsKKworZXh0ZXJuIGludCBYVW5tYXBTdWJ3aW5kb3dzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYVW5tYXBXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovCispOworCitleHRlcm4gaW50IFhWZW5kb3JSZWxlYXNlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhXYXJwUG9pbnRlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHNyY193ICovLAorICAgIFdpbmRvdwkJLyogZGVzdF93ICovLAorICAgIGludAkJCS8qIHNyY194ICovLAorICAgIGludAkJCS8qIHNyY195ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBzcmNfd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHNyY19oZWlnaHQgKi8sCisgICAgaW50CQkJLyogZGVzdF94ICovLAorICAgIGludAkJCS8qIGRlc3RfeSAqLworKTsKKworZXh0ZXJuIGludCBYV2lkdGhNTU9mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKworZXh0ZXJuIGludCBYV2lkdGhPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFdpbmRvd0V2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBsb25nCQkvKiBldmVudF9tYXNrICovLAorICAgIFhFdmVudCoJCS8qIGV2ZW50X3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYV3JpdGVCaXRtYXBGaWxlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogZmlsZW5hbWUgKi8sCisgICAgUGl4bWFwCQkvKiBiaXRtYXAgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgaW50CQkJLyogeF9ob3QgKi8sCisgICAgaW50CQkJLyogeV9ob3QgKi8KKyk7CisKK2V4dGVybiBCb29sIFhTdXBwb3J0c0xvY2FsZSAodm9pZCk7CisKK2V4dGVybiBjaGFyICpYU2V0TG9jYWxlTW9kaWZpZXJzKAorICAgIGNvbnN0IGNoYXIqCQkvKiBtb2RpZmllcl9saXN0ICovCispOworCitleHRlcm4gWE9NIFhPcGVuT00oCisgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgIHN0cnVjdCBfWHJtSGFzaEJ1Y2tldFJlYyoJLyogcmRiICovLAorICAgIF9YY29uc3QgY2hhcioJCS8qIHJlc19uYW1lICovLAorICAgIF9YY29uc3QgY2hhcioJCS8qIHJlc19jbGFzcyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYQ2xvc2VPTSgKKyAgICBYT00JCQkvKiBvbSAqLworKTsKKworZXh0ZXJuIGNoYXIgKlhTZXRPTVZhbHVlcygKKyAgICBYT00JCQkvKiBvbSAqLywKKyAgICAuLi4KKykgX1hfU0VOVElORUwoMCk7CisKK2V4dGVybiBjaGFyICpYR2V0T01WYWx1ZXMoCisgICAgWE9NCQkJLyogb20gKi8sCisgICAgLi4uCispIF9YX1NFTlRJTkVMKDApOworCitleHRlcm4gRGlzcGxheSAqWERpc3BsYXlPZk9NKAorICAgIFhPTQkJCS8qIG9tICovCispOworCitleHRlcm4gY2hhciAqWExvY2FsZU9mT00oCisgICAgWE9NCQkJLyogb20gKi8KKyk7CisKK2V4dGVybiBYT0MgWENyZWF0ZU9DKAorICAgIFhPTQkJCS8qIG9tICovLAorICAgIC4uLgorKSBfWF9TRU5USU5FTCgwKTsKKworZXh0ZXJuIHZvaWQgWERlc3Ryb3lPQygKKyAgICBYT0MJCQkvKiBvYyAqLworKTsKKworZXh0ZXJuIFhPTSBYT01PZk9DKAorICAgIFhPQwkJCS8qIG9jICovCispOworCitleHRlcm4gY2hhciAqWFNldE9DVmFsdWVzKAorICAgIFhPQwkJCS8qIG9jICovLAorICAgIC4uLgorKSBfWF9TRU5USU5FTCgwKTsKKworZXh0ZXJuIGNoYXIgKlhHZXRPQ1ZhbHVlcygKKyAgICBYT0MJCQkvKiBvYyAqLywKKyAgICAuLi4KKykgX1hfU0VOVElORUwoMCk7CisKK2V4dGVybiBYRm9udFNldCBYQ3JlYXRlRm9udFNldCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGJhc2VfZm9udF9uYW1lX2xpc3QgKi8sCisgICAgY2hhcioqKgkJLyogbWlzc2luZ19jaGFyc2V0X2xpc3QgKi8sCisgICAgaW50KgkJLyogbWlzc2luZ19jaGFyc2V0X2NvdW50ICovLAorICAgIGNoYXIqKgkJLyogZGVmX3N0cmluZyAqLworKTsKKworZXh0ZXJuIHZvaWQgWEZyZWVGb250U2V0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLworKTsKKworZXh0ZXJuIGludCBYRm9udHNPZkZvbnRTZXQoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIFhGb250U3RydWN0KioqCS8qIGZvbnRfc3RydWN0X2xpc3QgKi8sCisgICAgY2hhcioqKgkJLyogZm9udF9uYW1lX2xpc3QgKi8KKyk7CisKK2V4dGVybiBjaGFyICpYQmFzZUZvbnROYW1lTGlzdE9mRm9udFNldCgKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KKyk7CisKK2V4dGVybiBjaGFyICpYTG9jYWxlT2ZGb250U2V0KAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLworKTsKKworZXh0ZXJuIEJvb2wgWENvbnRleHREZXBlbmRlbnREcmF3aW5nKAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLworKTsKKworZXh0ZXJuIEJvb2wgWERpcmVjdGlvbmFsRGVwZW5kZW50RHJhd2luZygKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KKyk7CisKK2V4dGVybiBCb29sIFhDb250ZXh0dWFsRHJhd2luZygKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KKyk7CisKK2V4dGVybiBYRm9udFNldEV4dGVudHMgKlhFeHRlbnRzT2ZGb250U2V0KAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLworKTsKKworZXh0ZXJuIGludCBYbWJUZXh0RXNjYXBlbWVudCgKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8KKyk7CisKK2V4dGVybiBpbnQgWHdjVGV4dEVzY2FwZW1lbnQoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIF9YY29uc3Qgd2NoYXJfdCoJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBudW1fd2NoYXJzICovCispOworCitleHRlcm4gaW50IFh1dGY4VGV4dEVzY2FwZW1lbnQoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovCispOworCitleHRlcm4gaW50IFhtYlRleHRFeHRlbnRzKAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHRleHQgKi8sCisgICAgaW50CQkJLyogYnl0ZXNfdGV4dCAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9pbmtfcmV0dXJuICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBvdmVyYWxsX2xvZ2ljYWxfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFh3Y1RleHRFeHRlbnRzKAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKKyAgICBfWGNvbnN0IHdjaGFyX3QqCS8qIHRleHQgKi8sCisgICAgaW50CQkJLyogbnVtX3djaGFycyAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9pbmtfcmV0dXJuICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBvdmVyYWxsX2xvZ2ljYWxfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFh1dGY4VGV4dEV4dGVudHMoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBvdmVyYWxsX2lua19yZXR1cm4gKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfbG9naWNhbF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWG1iVGV4dFBlckNoYXJFeHRlbnRzKAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHRleHQgKi8sCisgICAgaW50CQkJLyogYnl0ZXNfdGV4dCAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogaW5rX2V4dGVudHNfYnVmZmVyICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBsb2dpY2FsX2V4dGVudHNfYnVmZmVyICovLAorICAgIGludAkJCS8qIGJ1ZmZlcl9zaXplICovLAorICAgIGludCoJCS8qIG51bV9jaGFycyAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9pbmtfcmV0dXJuICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBvdmVyYWxsX2xvZ2ljYWxfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFh3Y1RleHRQZXJDaGFyRXh0ZW50cygKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgX1hjb25zdCB3Y2hhcl90KgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIG51bV93Y2hhcnMgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIGlua19leHRlbnRzX2J1ZmZlciAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogbG9naWNhbF9leHRlbnRzX2J1ZmZlciAqLywKKyAgICBpbnQJCQkvKiBidWZmZXJfc2l6ZSAqLywKKyAgICBpbnQqCQkvKiBudW1fY2hhcnMgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfaW5rX3JldHVybiAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9sb2dpY2FsX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYdXRmOFRleHRQZXJDaGFyRXh0ZW50cygKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIGlua19leHRlbnRzX2J1ZmZlciAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogbG9naWNhbF9leHRlbnRzX2J1ZmZlciAqLywKKyAgICBpbnQJCQkvKiBidWZmZXJfc2l6ZSAqLywKKyAgICBpbnQqCQkvKiBudW1fY2hhcnMgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfaW5rX3JldHVybiAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9sb2dpY2FsX3JldHVybiAqLworKTsKKworZXh0ZXJuIHZvaWQgWG1iRHJhd1RleHQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgWG1iVGV4dEl0ZW0qCS8qIHRleHRfaXRlbXMgKi8sCisgICAgaW50CQkJLyogbml0ZW1zICovCispOworCitleHRlcm4gdm9pZCBYd2NEcmF3VGV4dCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICBYd2NUZXh0SXRlbSoJLyogdGV4dF9pdGVtcyAqLywKKyAgICBpbnQJCQkvKiBuaXRlbXMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFh1dGY4RHJhd1RleHQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgWG1iVGV4dEl0ZW0qCS8qIHRleHRfaXRlbXMgKi8sCisgICAgaW50CQkJLyogbml0ZW1zICovCispOworCitleHRlcm4gdm9pZCBYbWJEcmF3U3RyaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHRleHQgKi8sCisgICAgaW50CQkJLyogYnl0ZXNfdGV4dCAqLworKTsKKworZXh0ZXJuIHZvaWQgWHdjRHJhd1N0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgX1hjb25zdCB3Y2hhcl90KgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIG51bV93Y2hhcnMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFh1dGY4RHJhd1N0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhtYkRyYXdJbWFnZVN0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8KKyk7CisKK2V4dGVybiB2b2lkIFh3Y0RyYXdJbWFnZVN0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgX1hjb25zdCB3Y2hhcl90KgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIG51bV93Y2hhcnMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFh1dGY4RHJhd0ltYWdlU3RyaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHRleHQgKi8sCisgICAgaW50CQkJLyogYnl0ZXNfdGV4dCAqLworKTsKKworZXh0ZXJuIFhJTSBYT3BlbklNKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIHN0cnVjdCBfWHJtSGFzaEJ1Y2tldFJlYyoJLyogcmRiICovLAorICAgIGNoYXIqCQkJLyogcmVzX25hbWUgKi8sCisgICAgY2hhcioJCQkvKiByZXNfY2xhc3MgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWENsb3NlSU0oCisgICAgWElNIC8qIGltICovCispOworCitleHRlcm4gY2hhciAqWEdldElNVmFsdWVzKAorICAgIFhJTSAvKiBpbSAqLywgLi4uCispIF9YX1NFTlRJTkVMKDApOworCitleHRlcm4gY2hhciAqWFNldElNVmFsdWVzKAorICAgIFhJTSAvKiBpbSAqLywgLi4uCispIF9YX1NFTlRJTkVMKDApOworCitleHRlcm4gRGlzcGxheSAqWERpc3BsYXlPZklNKAorICAgIFhJTSAvKiBpbSAqLworKTsKKworZXh0ZXJuIGNoYXIgKlhMb2NhbGVPZklNKAorICAgIFhJTSAvKiBpbSovCispOworCitleHRlcm4gWElDIFhDcmVhdGVJQygKKyAgICBYSU0gLyogaW0gKi8sIC4uLgorKSBfWF9TRU5USU5FTCgwKTsKKworZXh0ZXJuIHZvaWQgWERlc3Ryb3lJQygKKyAgICBYSUMgLyogaWMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTZXRJQ0ZvY3VzKAorICAgIFhJQyAvKiBpYyAqLworKTsKKworZXh0ZXJuIHZvaWQgWFVuc2V0SUNGb2N1cygKKyAgICBYSUMgLyogaWMgKi8KKyk7CisKK2V4dGVybiB3Y2hhcl90ICpYd2NSZXNldElDKAorICAgIFhJQyAvKiBpYyAqLworKTsKKworZXh0ZXJuIGNoYXIgKlhtYlJlc2V0SUMoCisgICAgWElDIC8qIGljICovCispOworCitleHRlcm4gY2hhciAqWHV0ZjhSZXNldElDKAorICAgIFhJQyAvKiBpYyAqLworKTsKKworZXh0ZXJuIGNoYXIgKlhTZXRJQ1ZhbHVlcygKKyAgICBYSUMgLyogaWMgKi8sIC4uLgorKSBfWF9TRU5USU5FTCgwKTsKKworZXh0ZXJuIGNoYXIgKlhHZXRJQ1ZhbHVlcygKKyAgICBYSUMgLyogaWMgKi8sIC4uLgorKSBfWF9TRU5USU5FTCgwKTsKKworZXh0ZXJuIFhJTSBYSU1PZklDKAorICAgIFhJQyAvKiBpYyAqLworKTsKKworZXh0ZXJuIEJvb2wgWEZpbHRlckV2ZW50KAorICAgIFhFdmVudCoJLyogZXZlbnQgKi8sCisgICAgV2luZG93CS8qIHdpbmRvdyAqLworKTsKKworZXh0ZXJuIGludCBYbWJMb29rdXBTdHJpbmcoCisgICAgWElDCQkJLyogaWMgKi8sCisgICAgWEtleVByZXNzZWRFdmVudCoJLyogZXZlbnQgKi8sCisgICAgY2hhcioJCS8qIGJ1ZmZlcl9yZXR1cm4gKi8sCisgICAgaW50CQkJLyogYnl0ZXNfYnVmZmVyICovLAorICAgIEtleVN5bSoJCS8qIGtleXN5bV9yZXR1cm4gKi8sCisgICAgU3RhdHVzKgkJLyogc3RhdHVzX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYd2NMb29rdXBTdHJpbmcoCisgICAgWElDCQkJLyogaWMgKi8sCisgICAgWEtleVByZXNzZWRFdmVudCoJLyogZXZlbnQgKi8sCisgICAgd2NoYXJfdCoJCS8qIGJ1ZmZlcl9yZXR1cm4gKi8sCisgICAgaW50CQkJLyogd2NoYXJzX2J1ZmZlciAqLywKKyAgICBLZXlTeW0qCQkvKiBrZXlzeW1fcmV0dXJuICovLAorICAgIFN0YXR1cyoJCS8qIHN0YXR1c19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWHV0ZjhMb29rdXBTdHJpbmcoCisgICAgWElDCQkJLyogaWMgKi8sCisgICAgWEtleVByZXNzZWRFdmVudCoJLyogZXZlbnQgKi8sCisgICAgY2hhcioJCS8qIGJ1ZmZlcl9yZXR1cm4gKi8sCisgICAgaW50CQkJLyogYnl0ZXNfYnVmZmVyICovLAorICAgIEtleVN5bSoJCS8qIGtleXN5bV9yZXR1cm4gKi8sCisgICAgU3RhdHVzKgkJLyogc3RhdHVzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFhWYU5lc3RlZExpc3QgWFZhQ3JlYXRlTmVzdGVkTGlzdCgKKyAgICBpbnQgLyp1bnVzZWQqLywgLi4uCispIF9YX1NFTlRJTkVMKDApOworCisvKiBpbnRlcm5hbCBjb25uZWN0aW9ucyBmb3IgSU1zICovCisKK2V4dGVybiBCb29sIFhSZWdpc3RlcklNSW5zdGFudGlhdGVDYWxsYmFjaygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBzdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWMqCS8qIHJkYiAqLywKKyAgICBjaGFyKgkJCS8qIHJlc19uYW1lICovLAorICAgIGNoYXIqCQkJLyogcmVzX2NsYXNzICovLAorICAgIFhJRFByb2MJCQkvKiBjYWxsYmFjayAqLywKKyAgICBYUG9pbnRlcgkJCS8qIGNsaWVudF9kYXRhICovCispOworCitleHRlcm4gQm9vbCBYVW5yZWdpc3RlcklNSW5zdGFudGlhdGVDYWxsYmFjaygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBzdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWMqCS8qIHJkYiAqLywKKyAgICBjaGFyKgkJCS8qIHJlc19uYW1lICovLAorICAgIGNoYXIqCQkJLyogcmVzX2NsYXNzICovLAorICAgIFhJRFByb2MJCQkvKiBjYWxsYmFjayAqLywKKyAgICBYUG9pbnRlcgkJCS8qIGNsaWVudF9kYXRhICovCispOworCit0eXBlZGVmIHZvaWQgKCpYQ29ubmVjdGlvbldhdGNoUHJvYykoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgWFBvaW50ZXIJCQkvKiBjbGllbnRfZGF0YSAqLywKKyAgICBpbnQJCQkJLyogZmQgKi8sCisgICAgQm9vbAkJCS8qIG9wZW5pbmcgKi8sCSAvKiBvcGVuIG9yIGNsb3NlIGZsYWcgKi8KKyAgICBYUG9pbnRlcioJCQkvKiB3YXRjaF9kYXRhICovIC8qIG9wZW4gc2V0cywgY2xvc2UgdXNlcyAqLworKTsKKworCitleHRlcm4gU3RhdHVzIFhJbnRlcm5hbENvbm5lY3Rpb25OdW1iZXJzKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIGludCoqCQkJLyogZmRfcmV0dXJuICovLAorICAgIGludCoJCQkvKiBjb3VudF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiB2b2lkIFhQcm9jZXNzSW50ZXJuYWxDb25uZWN0aW9uKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIGludAkJCQkvKiBmZCAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYQWRkQ29ubmVjdGlvbldhdGNoKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFhDb25uZWN0aW9uV2F0Y2hQcm9jCS8qIGNhbGxiYWNrICovLAorICAgIFhQb2ludGVyCQkJLyogY2xpZW50X2RhdGEgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhSZW1vdmVDb25uZWN0aW9uV2F0Y2goCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgWENvbm5lY3Rpb25XYXRjaFByb2MJLyogY2FsbGJhY2sgKi8sCisgICAgWFBvaW50ZXIJCQkvKiBjbGllbnRfZGF0YSAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNldEF1dGhvcml6YXRpb24oCisgICAgY2hhciAqCQkJLyogbmFtZSAqLywKKyAgICBpbnQJCQkJLyogbmFtZWxlbiAqLywKKyAgICBjaGFyICoJCQkvKiBkYXRhICovLAorICAgIGludAkJCQkvKiBkYXRhbGVuICovCispOworCitleHRlcm4gaW50IF9YbWJ0b3djKAorICAgIHdjaGFyX3QgKgkJCS8qIHdzdHIgKi8sCisjaWZkZWYgSVNDCisgICAgY2hhciBjb25zdCAqCQkvKiBzdHIgKi8sCisgICAgc2l6ZV90CQkJLyogbGVuICovCisjZWxzZQorICAgIGNoYXIgKgkJCS8qIHN0ciAqLywKKyAgICBpbnQJCQkJLyogbGVuICovCisjZW5kaWYKKyk7CisKK2V4dGVybiBpbnQgX1h3Y3RvbWIoCisgICAgY2hhciAqCQkJLyogc3RyICovLAorICAgIHdjaGFyX3QJCQkvKiB3YyAqLworKTsKKworZXh0ZXJuIEJvb2wgWEdldEV2ZW50RGF0YSgKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBYR2VuZXJpY0V2ZW50Q29va2llKgkvKiBjb29raWUqLworKTsKKworZXh0ZXJuIHZvaWQgWEZyZWVFdmVudERhdGEoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgWEdlbmVyaWNFdmVudENvb2tpZSoJLyogY29va2llKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBfWDExX1hMSUJfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hsaWJDb25mLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbGliQ29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOWI5NDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbGliQ29uZi5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIGluY2x1ZGUvWDExL1hsaWJDb25mLmguICBHZW5lcmF0ZWQgZnJvbSBYbGliQ29uZi5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisvKgorICogQ29weXJpZ2h0IMKpIDIwMDUgS2VpdGggUGFja2FyZAorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CisgKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfWExJQkNPTkZfSF8KKyNkZWZpbmUgX1hMSUJDT05GX0hfCisvKgorICogVGhpcyBoZWFkZXIgZmlsZSBleHBvcnRzIGRlZmluZXMgbmVjZXNzYXJ5IHRvIGNvcnJlY3RseQorICogdXNlIFhsaWJpbnQuaCBib3RoIGluc2lkZSBYbGliIGFuZCBieSBleHRlcm5hbCBsaWJyYXJpZXMKKyAqIHN1Y2ggYXMgZXh0ZW5zaW9ucy4KKyAqLworCisvKiBUaHJlYWRpbmcgc3VwcG9ydD8gKi8KKyNkZWZpbmUgWFRIUkVBRFMgMQorCisvKiBVc2UgbXVsdGktdGhyZWFkZWQgbGliYyBmdW5jdGlvbnM/ICovCisjZGVmaW5lIFhVU0VfTVRTQUZFX0FQSSAxCisKKyNlbmRpZiAvKiBfWExJQkNPTkZfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hsaWJpbnQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hsaWJpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGVkZWVjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxpYmludC5oCkBAIC0wLDAgKzEsMTM2OSBAQAorCisvKgorCitDb3B5cmlnaHQgMTk4NCwgMTk4NSwgMTk4NywgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gVGhlIE9wZW4gR3JvdXAuCisKKyovCisKKyNpZm5kZWYgX1gxMV9YTElCSU5UX0hfCisjZGVmaW5lIF9YMTFfWExJQklOVF9IXyAxCisKKy8qCisgKglYbGliaW50LmggLSBIZWFkZXIgZGVmaW5pdGlvbiBhbmQgc3VwcG9ydCBmaWxlIGZvciB0aGUgaW50ZXJuYWwKKyAqCXN1cHBvcnQgcm91dGluZXMgdXNlZCBieSB0aGUgQyBzdWJyb3V0aW5lIGludGVyZmFjZQorICoJbGlicmFyeSAoWGxpYikgdG8gdGhlIFggV2luZG93IFN5c3RlbS4KKyAqCisgKglXYXJuaW5nLCB0aGVyZSBiZSBkcmFnb25zIGhlcmUuLi4uCisgKi8KKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL1hwcm90by5oPgkJLyogdG8gZGVjbGFyZSB4RXZlbnQgKi8KKyNpbmNsdWRlIDxYMTEvWGxpYkNvbmYuaD4JLyogZm9yIGNvbmZpZ3VyZWQgb3B0aW9ucyBsaWtlIFhUSFJFQURTICovCisKKyNpZmRlZiBXSU4zMgorI2RlZmluZSBfWEZsdXNoIF9YRmx1c2hJdAorI2VuZGlmCisKKy8qCisgKiBJZiB5b3VyIEJ5dGVzUmVhZGFibGUgY29ycmVjdGx5IGRldGVjdHMgYnJva2VuIGNvbm5lY3Rpb25zLCB0aGVuCisgKiB5b3Ugc2hvdWxkIE5PVCBkZWZpbmUgWENPTk5fQ0hFQ0tfRlJFUS4KKyAqLworI2lmbmRlZiBYQ09OTl9DSEVDS19GUkVRCisjZGVmaW5lIFhDT05OX0NIRUNLX0ZSRVEgMjU2CisjZW5kaWYKKworc3RydWN0IF9YR0MKK3sKKyAgICBYRXh0RGF0YSAqZXh0X2RhdGE7CS8qIGhvb2sgZm9yIGV4dGVuc2lvbiB0byBoYW5nIGRhdGEgKi8KKyAgICBHQ29udGV4dCBnaWQ7CS8qIHByb3RvY29sIElEIGZvciBncmFwaGljcyBjb250ZXh0ICovCisgICAgQm9vbCByZWN0czsJCS8qIGJvb2xlYW46IFRSVUUgaWYgY2xpcG1hc2sgaXMgbGlzdCBvZiByZWN0YW5nbGVzICovCisgICAgQm9vbCBkYXNoZXM7CS8qIGJvb2xlYW46IFRSVUUgaWYgZGFzaC1saXN0IGlzIHJlYWxseSBhIGxpc3QgKi8KKyAgICB1bnNpZ25lZCBsb25nIGRpcnR5Oy8qIGNhY2hlIGRpcnR5IGJpdHMgKi8KKyAgICBYR0NWYWx1ZXMgdmFsdWVzOwkvKiBzaGFkb3cgc3RydWN0dXJlIG9mIHZhbHVlcyAqLworfTsKKworc3RydWN0IF9YRGlzcGxheQoreworCVhFeHREYXRhICpleHRfZGF0YTsJLyogaG9vayBmb3IgZXh0ZW5zaW9uIHRvIGhhbmcgZGF0YSAqLworCXN0cnVjdCBfWEZyZWVGdW5jcyAqZnJlZV9mdW5jczsgLyogaW50ZXJuYWwgZnJlZSBmdW5jdGlvbnMgKi8KKwlpbnQgZmQ7CQkJLyogTmV0d29yayBzb2NrZXQuICovCisJaW50IGNvbm5fY2hlY2tlcjsgICAgICAgICAvKiB1Z2x5IHRoaW5nIHVzZWQgYnkgX1hFdmVudHNRdWV1ZWQgKi8KKwlpbnQgcHJvdG9fbWFqb3JfdmVyc2lvbjsvKiBtYWouIHZlcnNpb24gb2Ygc2VydmVyJ3MgWCBwcm90b2NvbCAqLworCWludCBwcm90b19taW5vcl92ZXJzaW9uOy8qIG1pbm9yIHZlcnNpb24gb2Ygc2VydmVyJ3MgWCBwcm90b2NvbCAqLworCWNoYXIgKnZlbmRvcjsJCS8qIHZlbmRvciBvZiB0aGUgc2VydmVyIGhhcmR3YXJlICovCisgICAgICAgIFhJRCByZXNvdXJjZV9iYXNlOwkvKiByZXNvdXJjZSBJRCBiYXNlICovCisJWElEIHJlc291cmNlX21hc2s7CS8qIHJlc291cmNlIElEIG1hc2sgYml0cyAqLworCVhJRCByZXNvdXJjZV9pZDsJLyogYWxsb2NhdG9yIGN1cnJlbnQgSUQgKi8KKwlpbnQgcmVzb3VyY2Vfc2hpZnQ7CS8qIGFsbG9jYXRvciBzaGlmdCB0byBjb3JyZWN0IGJpdHMgKi8KKwlYSUQgKCpyZXNvdXJjZV9hbGxvYykoCS8qIGFsbG9jYXRvciBmdW5jdGlvbiAqLworCQlzdHJ1Y3QgX1hEaXNwbGF5KgorCQkpOworCWludCBieXRlX29yZGVyOwkJLyogc2NyZWVuIGJ5dGUgb3JkZXIsIExTQkZpcnN0LCBNU0JGaXJzdCAqLworCWludCBiaXRtYXBfdW5pdDsJLyogcGFkZGluZyBhbmQgZGF0YSByZXF1aXJlbWVudHMgKi8KKwlpbnQgYml0bWFwX3BhZDsJCS8qIHBhZGRpbmcgcmVxdWlyZW1lbnRzIG9uIGJpdG1hcHMgKi8KKwlpbnQgYml0bWFwX2JpdF9vcmRlcjsJLyogTGVhc3RTaWduaWZpY2FudCBvciBNb3N0U2lnbmlmaWNhbnQgKi8KKwlpbnQgbmZvcm1hdHM7CQkvKiBudW1iZXIgb2YgcGl4bWFwIGZvcm1hdHMgaW4gbGlzdCAqLworCVNjcmVlbkZvcm1hdCAqcGl4bWFwX2Zvcm1hdDsJLyogcGl4bWFwIGZvcm1hdCBsaXN0ICovCisJaW50IHZudW1iZXI7CQkvKiBYbGliJ3MgWCBwcm90b2NvbCB2ZXJzaW9uIG51bWJlci4gKi8KKwlpbnQgcmVsZWFzZTsJCS8qIHJlbGVhc2Ugb2YgdGhlIHNlcnZlciAqLworCXN0cnVjdCBfWFNRRXZlbnQgKmhlYWQsICp0YWlsOwkvKiBJbnB1dCBldmVudCBxdWV1ZS4gKi8KKwlpbnQgcWxlbjsJCS8qIExlbmd0aCBvZiBpbnB1dCBldmVudCBxdWV1ZSAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9yZXF1ZXN0X3JlYWQ7IC8qIHNlcSBudW1iZXIgb2YgbGFzdCBldmVudCByZWFkICovCisJdW5zaWduZWQgbG9uZyByZXF1ZXN0OwkvKiBzZXF1ZW5jZSBudW1iZXIgb2YgbGFzdCByZXF1ZXN0LiAqLworCWNoYXIgKmxhc3RfcmVxOwkJLyogYmVnaW5uaW5nIG9mIGxhc3QgcmVxdWVzdCwgb3IgZHVtbXkgKi8KKwljaGFyICpidWZmZXI7CQkvKiBPdXRwdXQgYnVmZmVyIHN0YXJ0aW5nIGFkZHJlc3MuICovCisJY2hhciAqYnVmcHRyOwkJLyogT3V0cHV0IGJ1ZmZlciBpbmRleCBwb2ludGVyLiAqLworCWNoYXIgKmJ1Zm1heDsJCS8qIE91dHB1dCBidWZmZXIgbWF4aW11bSsxIGFkZHJlc3MuICovCisJdW5zaWduZWQgbWF4X3JlcXVlc3Rfc2l6ZTsgLyogbWF4aW11bSBudW1iZXIgMzIgYml0IHdvcmRzIGluIHJlcXVlc3QqLworCXN0cnVjdCBfWHJtSGFzaEJ1Y2tldFJlYyAqZGI7CisJaW50ICgqc3luY2hhbmRsZXIpKAkvKiBTeW5jaHJvbml6YXRpb24gaGFuZGxlciAqLworCQlzdHJ1Y3QgX1hEaXNwbGF5KgorCQkpOworCWNoYXIgKmRpc3BsYXlfbmFtZTsJLyogImhvc3Q6ZGlzcGxheSIgc3RyaW5nIHVzZWQgb24gdGhpcyBjb25uZWN0Ki8KKwlpbnQgZGVmYXVsdF9zY3JlZW47CS8qIGRlZmF1bHQgc2NyZWVuIGZvciBvcGVyYXRpb25zICovCisJaW50IG5zY3JlZW5zOwkJLyogbnVtYmVyIG9mIHNjcmVlbnMgb24gdGhpcyBzZXJ2ZXIqLworCVNjcmVlbiAqc2NyZWVuczsJLyogcG9pbnRlciB0byBsaXN0IG9mIHNjcmVlbnMgKi8KKwl1bnNpZ25lZCBsb25nIG1vdGlvbl9idWZmZXI7CS8qIHNpemUgb2YgbW90aW9uIGJ1ZmZlciAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CSAgIC8qIGludGVybmFsIGNvbm5lY3Rpb24gZmxhZ3MgKi8KKwlpbnQgbWluX2tleWNvZGU7CS8qIG1pbmltdW0gZGVmaW5lZCBrZXljb2RlICovCisJaW50IG1heF9rZXljb2RlOwkvKiBtYXhpbXVtIGRlZmluZWQga2V5Y29kZSAqLworCUtleVN5bSAqa2V5c3ltczsJLyogVGhpcyBzZXJ2ZXIncyBrZXlzeW1zICovCisJWE1vZGlmaWVyS2V5bWFwICptb2RpZmllcm1hcDsJLyogVGhpcyBzZXJ2ZXIncyBtb2RpZmllciBrZXltYXAgKi8KKwlpbnQga2V5c3ltc19wZXJfa2V5Y29kZTsvKiBudW1iZXIgb2Ygcm93cyAqLworCWNoYXIgKnhkZWZhdWx0czsJLyogY29udGVudHMgb2YgZGVmYXVsdHMgZnJvbSBzZXJ2ZXIgKi8KKwljaGFyICpzY3JhdGNoX2J1ZmZlcjsJLyogcGxhY2UgdG8gaGFuZyBzY3JhdGNoIGJ1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcgc2NyYXRjaF9sZW5ndGg7CS8qIGxlbmd0aCBvZiBzY3JhdGNoIGJ1ZmZlciAqLworCWludCBleHRfbnVtYmVyOwkJLyogZXh0ZW5zaW9uIG51bWJlciBvbiB0aGlzIGRpc3BsYXkgKi8KKwlzdHJ1Y3QgX1hFeHRlbiAqZXh0X3Byb2NzOyAvKiBleHRlbnNpb25zIGluaXRpYWxpemVkIG9uIHRoaXMgZGlzcGxheSAqLworCS8qCisJICogdGhlIGZvbGxvd2luZyBjYW4gYmUgZml4ZWQgc2l6ZSwgYXMgdGhlIHByb3RvY29sIGRlZmluZXMgaG93CisJICogbXVjaCBhZGRyZXNzIHNwYWNlIGlzIGF2YWlsYWJsZS4KKwkgKiBXaGlsZSB0aGlzIGNvdWxkIGJlIGRvbmUgdXNpbmcgdGhlIGV4dGVuc2lvbiB2ZWN0b3IsIHRoZXJlCisJICogbWF5IGJlIE1BTlkgZXZlbnRzIHByb2Nlc3NlZCwgc28gYSBzZWFyY2ggdGhyb3VnaCB0aGUgZXh0ZW5zaW9uCisJICogbGlzdCB0byBmaW5kIHRoZSByaWdodCBwcm9jZWR1cmUgZm9yIGVhY2ggZXZlbnQgbWlnaHQgYmUKKwkgKiBleHBlbnNpdmUgaWYgbWFueSBleHRlbnNpb25zIGFyZSBiZWluZyB1c2VkLgorCSAqLworCUJvb2wgKCpldmVudF92ZWNbMTI4XSkoCS8qIHZlY3RvciBmb3Igd2lyZSB0byBldmVudCAqLworCQlEaXNwbGF5ICoJLyogZHB5ICovLAorCQlYRXZlbnQgKgkvKiByZSAqLywKKwkJeEV2ZW50ICoJLyogZXZlbnQgKi8KKwkJKTsKKwlTdGF0dXMgKCp3aXJlX3ZlY1sxMjhdKSggLyogdmVjdG9yIGZvciBldmVudCB0byB3aXJlICovCisJCURpc3BsYXkgKgkvKiBkcHkgKi8sCisJCVhFdmVudCAqCS8qIHJlICovLAorCQl4RXZlbnQgKgkvKiBldmVudCAqLworCQkpOworCUtleVN5bSBsb2NrX21lYW5pbmc7CSAgIC8qIGZvciBYTG9va3VwU3RyaW5nICovCisJc3RydWN0IF9YTG9ja0luZm8gKmxvY2s7ICAgLyogbXVsdGktdGhyZWFkIHN0YXRlLCBkaXNwbGF5IGxvY2sgKi8KKwlzdHJ1Y3QgX1hJbnRlcm5hbEFzeW5jICphc3luY19oYW5kbGVyczsgLyogZm9yIGludGVybmFsIGFzeW5jICovCisJdW5zaWduZWQgbG9uZyBiaWdyZXFfc2l6ZTsgLyogbWF4IHNpemUgb2YgYmlnIHJlcXVlc3RzICovCisJc3RydWN0IF9YTG9ja1B0cnMgKmxvY2tfZm5zOyAvKiBwb2ludGVycyB0byB0aHJlYWRzIGZ1bmN0aW9ucyAqLworCXZvaWQgKCppZGxpc3RfYWxsb2MpKAkgICAvKiBYSUQgbGlzdCBhbGxvY2F0b3IgZnVuY3Rpb24gKi8KKwkJRGlzcGxheSAqCS8qIGRweSAqLywKKwkJWElEICoJCS8qIGlkcyAqLywKKwkJaW50CQkvKiBjb3VudCAqLworCQkpOworCS8qIHRoaW5ncyBhYm92ZSB0aGlzIGxpbmUgc2hvdWxkIG5vdCBtb3ZlLCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgKi8KKwlzdHJ1Y3QgX1hLZXl0cmFucyAqa2V5X2JpbmRpbmdzOyAvKiBmb3IgWExvb2t1cFN0cmluZyAqLworCUZvbnQgY3Vyc29yX2ZvbnQ7CSAgIC8qIGZvciBYQ3JlYXRlRm9udEN1cnNvciAqLworCXN0cnVjdCBfWERpc3BsYXlBdG9tcyAqYXRvbXM7IC8qIGZvciBYSW50ZXJuQXRvbSAqLworCXVuc2lnbmVkIGludCBtb2RlX3N3aXRjaDsgIC8qIGtleWJvYXJkIGdyb3VwIG1vZGlmaWVycyAqLworCXVuc2lnbmVkIGludCBudW1fbG9jazsgIC8qIGtleWJvYXJkIG51bWxvY2sgbW9kaWZpZXJzICovCisJc3RydWN0IF9YQ29udGV4dERCICpjb250ZXh0X2RiOyAvKiBjb250ZXh0IGRhdGFiYXNlICovCisJQm9vbCAoKiplcnJvcl92ZWMpKAkvKiB2ZWN0b3IgZm9yIHdpcmUgdG8gZXJyb3IgKi8KKwkJRGlzcGxheSAgICAgKgkvKiBkaXNwbGF5ICovLAorCQlYRXJyb3JFdmVudCAqCS8qIGhlICovLAorCQl4RXJyb3IgICAgICAqCS8qIHdlICovCisJCSk7CisJLyoKKwkgKiBYY21zIGluZm9ybWF0aW9uCisJICovCisJc3RydWN0IHsKKwkgICBYUG9pbnRlciBkZWZhdWx0Q0NDczsgIC8qIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGVmYXVsdCBYY21zQ0NDICovCisJICAgWFBvaW50ZXIgY2xpZW50Q21hcHM7ICAvKiBwb2ludGVyIHRvIGxpbmtlZCBsaXN0IG9mIFhjbXNDbWFwUmVjICovCisJICAgWFBvaW50ZXIgcGVyVmlzdWFsSW50ZW5zaXR5TWFwczsKKwkJCQkgIC8qIGxpbmtlZCBsaXN0IG9mIFhjbXNJbnRlbnNpdHlNYXAgKi8KKwl9IGNtczsKKwlzdHJ1Y3QgX1hJTUZpbHRlciAqaW1fZmlsdGVyczsKKwlzdHJ1Y3QgX1hTUUV2ZW50ICpxZnJlZTsgLyogdW5hbGxvY2F0ZWQgZXZlbnQgcXVldWUgZWxlbWVudHMgKi8KKwl1bnNpZ25lZCBsb25nIG5leHRfZXZlbnRfc2VyaWFsX251bTsgLyogaW5zZXJ0ZWQgaW50byBuZXh0IHF1ZXVlIGVsdCAqLworCXN0cnVjdCBfWEV4dGVuICpmbHVzaGVzOyAvKiBGbHVzaCBob29rcyAqLworCXN0cnVjdCBfWENvbm5lY3Rpb25JbmZvICppbV9mZF9pbmZvOyAvKiBfWFJlZ2lzdGVySW50ZXJuYWxDb25uZWN0aW9uICovCisJaW50IGltX2ZkX2xlbmd0aDsJLyogbnVtYmVyIG9mIGltX2ZkX2luZm8gKi8KKwlzdHJ1Y3QgX1hDb25uV2F0Y2hJbmZvICpjb25uX3dhdGNoZXJzOyAvKiBYQWRkQ29ubmVjdGlvbldhdGNoICovCisJaW50IHdhdGNoZXJfY291bnQ7CS8qIG51bWJlciBvZiBjb25uX3dhdGNoZXJzICovCisJWFBvaW50ZXIgZmlsZWRlczsJLyogc3RydWN0IHBvbGxmZCBjYWNoZSBmb3IgX1hXYWl0Rm9yUmVhZGFibGUgKi8KKwlpbnQgKCpzYXZlZHN5bmNoYW5kbGVyKSggLyogdXNlciBzeW5jaGFuZGxlciB3aGVuIFhsaWIgdXN1cnBzICovCisJCURpc3BsYXkgKgkvKiBkcHkgKi8KKwkJKTsKKwlYSUQgcmVzb3VyY2VfbWF4OwkvKiBhbGxvY2F0b3IgbWF4IElEICovCisJaW50IHhjbWlzY19vcGNvZGU7CS8qIG1ham9yIG9wY29kZSBmb3IgWEMtTUlTQyAqLworCXN0cnVjdCBfWGtiSW5mb1JlYyAqeGtiX2luZm87IC8qIFhLQiBpbmZvICovCisJc3RydWN0IF9YdHJhbnNDb25uSW5mbyAqdHJhbnNfY29ubjsgLyogdHJhbnNwb3J0IGNvbm5lY3Rpb24gb2JqZWN0ICovCisJc3RydWN0IF9YMTFYQ0JQcml2YXRlICp4Y2I7IC8qIFhDQiBnbHVlIHByaXZhdGUgZGF0YSAqLworCisJLyogR2VuZXJpYyBldmVudCBjb29raWUgaGFuZGxpbmcgKi8KKwl1bnNpZ25lZCBpbnQgbmV4dF9jb29raWU7IC8qIG5leHQgZXZlbnQgY29va2llICovCisJLyogdmVjdG9yIGZvciB3aXJlIHRvIGdlbmVyaWMgZXZlbnQsIGluZGV4IGlzIChleHRlbnNpb24gLSAxMjgpICovCisJQm9vbCAoKmdlbmVyaWNfZXZlbnRfdmVjWzEyOF0pKAorCQlEaXNwbGF5ICoJLyogZHB5ICovLAorCQlYR2VuZXJpY0V2ZW50Q29va2llICoJLyogWGxpYiBldmVudCAqLywKKwkJeEV2ZW50ICoJLyogd2lyZSBldmVudCAqLyk7CisJLyogdmVjdG9yIGZvciBldmVudCBjb3B5LCBpbmRleCBpcyAoZXh0ZW5zaW9uIC0gMTI4KSAqLworCUJvb2wgKCpnZW5lcmljX2V2ZW50X2NvcHlfdmVjWzEyOF0pKAorCQlEaXNwbGF5ICoJLyogZHB5ICovLAorCQlYR2VuZXJpY0V2ZW50Q29va2llICoJLyogaW4gKi8sCisJCVhHZW5lcmljRXZlbnRDb29raWUgKiAgIC8qIG91dCovKTsKKwl2b2lkICpjb29raWVqYXI7ICAvKiBjb29raWUgZXZlbnRzIHJldHVybmVkIGJ1dCBub3QgY2xhaW1lZCAqLworfTsKKworI2RlZmluZSBYQWxsb2NJRHMoZHB5LGlkcyxuKSAoKihkcHkpLT5pZGxpc3RfYWxsb2MpKGRweSxpZHMsbikKKworLyoKKyAqIGRlZmluZSB0aGUgZm9sbG93aW5nIGlmIHlvdSB3YW50IHRoZSBEYXRhIG1hY3JvIHRvIGJlIGEgcHJvY2VkdXJlIGluc3RlYWQKKyAqLworI2lmZGVmIENSQVkKKyNkZWZpbmUgRGF0YVJvdXRpbmVJc1Byb2NlZHVyZQorI2VuZGlmIC8qIENSQVkgKi8KKworI2lmbmRlZiBfWEVWRU5UXworLyoKKyAqIF9RRXZlbnQgZGF0YXR5cGUgZm9yIHVzZSBpbiBpbnB1dCBxdWV1ZWluZy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1hTUUV2ZW50Cit7CisgICAgc3RydWN0IF9YU1FFdmVudCAqbmV4dDsKKyAgICBYRXZlbnQgZXZlbnQ7CisgICAgdW5zaWduZWQgbG9uZyBxc2VyaWFsX251bTsJLyogc28gbXVsdGktdGhyZWFkZWQgY29kZSBjYW4gZmluZCBuZXcgb25lcyAqLworfSBfWFFFdmVudDsKKyNlbmRpZgorCisjaW5jbHVkZSA8WDExL1hwcm90by5oPgorI2lmZGVmIF9fc2dpCisjZGVmaW5lIF9TR0lfTVBfU09VUkNFICAvKiB0dXJuIHRoaXMgb24gdG8gZ2V0IE1QIHNhZmUgZXJybm8gKi8KKyNlbmRpZgorI2luY2x1ZGUgPGVycm5vLmg+CisjZGVmaW5lIF9YQkNPUFlGVU5DIF9YYmNvcHkKKyNpbmNsdWRlIDxYMTEvWGZ1bmNzLmg+CisjaW5jbHVkZSA8WDExL1hvc2RlZnMuaD4KKworLyogVXRlayBsZWF2ZXMga2VybmVsIG1hY3JvcyBhcm91bmQgaW4gaW5jbHVkZSBmaWxlcyAoYmxlYWgpICovCisjaWZkZWYgZGlydHkKKyN1bmRlZiBkaXJ0eQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisKK19YRlVOQ1BST1RPQkVHSU4KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgY2FuIGJlIHVzZWQgZm9yIGxvY2tpbmcgcmVxdWVzdHMgaW4gbXVsdGktdGhyZWFkZWQKKyAqIGFkZHJlc3Mgc3BhY2VzLgorICovCisjaWZkZWYgWFRIUkVBRFMKKy8qIEF1dGhvcjogU3RlcGhlbiBHaWxkZWEsIE1JVCBYIENvbnNvcnRpdW0KKyAqCisgKiBkZWNsYXJhdGlvbnMgZm9yIEMgVGhyZWFkcyBsb2NraW5nCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0xvY2tJbmZvUmVjICpMb2NrSW5mb1B0cjsKKworLyogaW50ZXJmYWNlcyBmb3IgbG9ja2luZy5jICovCitzdHJ1Y3QgX1hMb2NrUHRycyB7CisgICAgLyogdXNlZCBieSBhbGwsIGluY2x1ZGluZyBleHRlbnNpb25zOyBkbyBub3QgbW92ZSAqLworICAgIHZvaWQgKCpsb2NrX2Rpc3BsYXkpKAorCQlEaXNwbGF5ICpkcHkKKyNpZiBkZWZpbmVkKFhUSFJFQURTX1dBUk4pIHx8IGRlZmluZWQoWFRIUkVBRFNfRklMRV9MSU5FKQorCQksIGNoYXIgKmZpbGUKKwkJLCBpbnQgbGluZQorI2VuZGlmCisJKTsKKyAgICB2b2lkICgqdW5sb2NrX2Rpc3BsYXkpKAorCQlEaXNwbGF5ICpkcHkKKyNpZiBkZWZpbmVkKFhUSFJFQURTX1dBUk4pIHx8IGRlZmluZWQoWFRIUkVBRFNfRklMRV9MSU5FKQorCQksIGNoYXIgKmZpbGUKKwkJLCBpbnQgbGluZQorI2VuZGlmCisJKTsKK307CisKKyNpZiBkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChfWExJQklOVF8pCisjZGVmaW5lIF9YQ3JlYXRlTXV0ZXhfZm4gKCpfWENyZWF0ZU11dGV4X2ZuX3ApCisjZGVmaW5lIF9YRnJlZU11dGV4X2ZuICgqX1hGcmVlTXV0ZXhfZm5fcCkKKyNkZWZpbmUgX1hMb2NrTXV0ZXhfZm4gKCpfWExvY2tNdXRleF9mbl9wKQorI2RlZmluZSBfWFVubG9ja011dGV4X2ZuICgqX1hVbmxvY2tNdXRleF9mbl9wKQorI2RlZmluZSBfWGdsb2JhbF9sb2NrICgqX1hnbG9iYWxfbG9ja19wKQorI2VuZGlmCisKKy8qIGluIFhsaWJJbnQuYyAqLworZXh0ZXJuIHZvaWQgKCpfWENyZWF0ZU11dGV4X2ZuKSgKKyAgICBMb2NrSW5mb1B0ciAvKiBsb2NrICovCispOworZXh0ZXJuIHZvaWQgKCpfWEZyZWVNdXRleF9mbikoCisgICAgTG9ja0luZm9QdHIgLyogbG9jayAqLworKTsKK2V4dGVybiB2b2lkICgqX1hMb2NrTXV0ZXhfZm4pKAorICAgIExvY2tJbmZvUHRyCS8qIGxvY2sgKi8KKyNpZiBkZWZpbmVkKFhUSFJFQURTX1dBUk4pIHx8IGRlZmluZWQoWFRIUkVBRFNfRklMRV9MSU5FKQorICAgICwgY2hhciAqIC8qIGZpbGUgKi8KKyAgICAsIGludCAvKiBsaW5lICovCisjZW5kaWYKKyk7CitleHRlcm4gdm9pZCAoKl9YVW5sb2NrTXV0ZXhfZm4pKAorICAgIExvY2tJbmZvUHRyCS8qIGxvY2sgKi8KKyNpZiBkZWZpbmVkKFhUSFJFQURTX1dBUk4pIHx8IGRlZmluZWQoWFRIUkVBRFNfRklMRV9MSU5FKQorICAgICwgY2hhciAqIC8qIGZpbGUgKi8KKyAgICAsIGludCAvKiBsaW5lICovCisjZW5kaWYKKyk7CisKK2V4dGVybiBMb2NrSW5mb1B0ciBfWGdsb2JhbF9sb2NrOworCisjaWYgZGVmaW5lZChYVEhSRUFEU19XQVJOKSB8fCBkZWZpbmVkKFhUSFJFQURTX0ZJTEVfTElORSkKKyNkZWZpbmUgTG9ja0Rpc3BsYXkoZCkJICAgICBpZiAoKGQpLT5sb2NrX2ZucykgKCooZCktPmxvY2tfZm5zLT5sb2NrX2Rpc3BsYXkpKChkKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgVW5sb2NrRGlzcGxheShkKSAgICAgaWYgKChkKS0+bG9ja19mbnMpICgqKGQpLT5sb2NrX2Zucy0+dW5sb2NrX2Rpc3BsYXkpKChkKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgX1hMb2NrTXV0ZXgobG9jaykJCWlmIChfWExvY2tNdXRleF9mbikgKCpfWExvY2tNdXRleF9mbikobG9jayxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgX1hVbmxvY2tNdXRleChsb2NrKQlpZiAoX1hVbmxvY2tNdXRleF9mbikgKCpfWFVubG9ja011dGV4X2ZuKShsb2NrLF9fRklMRV9fLF9fTElORV9fKQorI2Vsc2UKKy8qIHVzZWQgZXZlcnl3aGVyZSwgc28gbXVzdCBiZSBmYXN0IGlmIG5vdCB1c2luZyB0aHJlYWRzICovCisjZGVmaW5lIExvY2tEaXNwbGF5KGQpCSAgICAgaWYgKChkKS0+bG9ja19mbnMpICgqKGQpLT5sb2NrX2Zucy0+bG9ja19kaXNwbGF5KShkKQorI2RlZmluZSBVbmxvY2tEaXNwbGF5KGQpICAgICBpZiAoKGQpLT5sb2NrX2ZucykgKCooZCktPmxvY2tfZm5zLT51bmxvY2tfZGlzcGxheSkoZCkKKyNkZWZpbmUgX1hMb2NrTXV0ZXgobG9jaykJCWlmIChfWExvY2tNdXRleF9mbikgKCpfWExvY2tNdXRleF9mbikobG9jaykKKyNkZWZpbmUgX1hVbmxvY2tNdXRleChsb2NrKQlpZiAoX1hVbmxvY2tNdXRleF9mbikgKCpfWFVubG9ja011dGV4X2ZuKShsb2NrKQorI2VuZGlmCisjZGVmaW5lIF9YQ3JlYXRlTXV0ZXgobG9jaykJaWYgKF9YQ3JlYXRlTXV0ZXhfZm4pICgqX1hDcmVhdGVNdXRleF9mbikobG9jayk7CisjZGVmaW5lIF9YRnJlZU11dGV4KGxvY2spCWlmIChfWEZyZWVNdXRleF9mbikgKCpfWEZyZWVNdXRleF9mbikobG9jayk7CisKKyNlbHNlIC8qIFhUSFJFQURTICovCisjZGVmaW5lIExvY2tEaXNwbGF5KGRpcykKKyNkZWZpbmUgX1hMb2NrTXV0ZXgobG9jaykKKyNkZWZpbmUgX1hVbmxvY2tNdXRleChsb2NrKQorI2RlZmluZSBVbmxvY2tEaXNwbGF5KGRpcykKKyNkZWZpbmUgX1hDcmVhdGVNdXRleChsb2NrKQorI2RlZmluZSBfWEZyZWVNdXRleChsb2NrKQorI2VuZGlmCisKKyNkZWZpbmUgWGZyZWUocHRyKSBmcmVlKChwdHIpKQorCisvKgorICogTm90ZSB0aGF0IHNvbWUgbWFjaGluZXMgZG8gbm90IHJldHVybiBhIHZhbGlkIHBvaW50ZXIgZm9yIG1hbGxvYygwKSwgaW4KKyAqIHdoaWNoIGNhc2Ugd2UgcHJvdmlkZSBhbiBhbHRlcm5hdGUgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlCisgKiBkZWZpbmUgTUFMTE9DXzBfUkVUVVJOU19OVUxMLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lCisgKiBYbGliIGNvZGUgZXhwZWN0cyBtYWxsb2MoMCkgdG8gcmV0dXJuIGEgdmFsaWQgcG9pbnRlciB0byBzdG9yYWdlLgorICovCisjaWYgZGVmaW5lZChNQUxMT0NfMF9SRVRVUk5TX05VTEwpIHx8IGRlZmluZWQoX19jbGFuZ19hbmFseXplcl9fKQorCisjIGRlZmluZSBYbWFsbG9jKHNpemUpIG1hbGxvYygoKHNpemUpID09IDAgPyAxIDogKHNpemUpKSkKKyMgZGVmaW5lIFhyZWFsbG9jKHB0ciwgc2l6ZSkgcmVhbGxvYygocHRyKSwgKChzaXplKSA9PSAwID8gMSA6IChzaXplKSkpCisjIGRlZmluZSBYY2FsbG9jKG5lbGVtLCBlbHNpemUpIGNhbGxvYygoKG5lbGVtKSA9PSAwID8gMSA6IChuZWxlbSkpLCAoZWxzaXplKSkKKworI2Vsc2UKKworIyBkZWZpbmUgWG1hbGxvYyhzaXplKSBtYWxsb2MoKHNpemUpKQorIyBkZWZpbmUgWHJlYWxsb2MocHRyLCBzaXplKSByZWFsbG9jKChwdHIpLCAoc2l6ZSkpCisjIGRlZmluZSBYY2FsbG9jKG5lbGVtLCBlbHNpemUpIGNhbGxvYygobmVsZW0pLCAoZWxzaXplKSkKKworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2RlZmluZSBMT0NLRUQgMQorI2RlZmluZSBVTkxPQ0tFRCAwCisKKyNpZm5kZWYgQlVGU0laRQorI2RlZmluZSBCVUZTSVpFIDIwNDgJCQkvKiBYIG91dHB1dCBidWZmZXIgc2l6ZS4gKi8KKyNlbmRpZgorI2lmbmRlZiBQVFNQRVJCQVRDSAorI2RlZmluZSBQVFNQRVJCQVRDSCAxMDI0CQkvKiBwb2ludCBiYXRjaGluZyAqLworI2VuZGlmCisjaWZuZGVmIFdMTlNQRVJCQVRDSAorI2RlZmluZSBXTE5TUEVSQkFUQ0ggNTAJCQkvKiB3aWRlIGxpbmUgYmF0Y2hpbmcgKi8KKyNlbmRpZgorI2lmbmRlZiBaTE5TUEVSQkFUQ0gKKyNkZWZpbmUgWkxOU1BFUkJBVENIIDEwMjQJCS8qIHRoaW4gbGluZSBiYXRjaGluZyAqLworI2VuZGlmCisjaWZuZGVmIFdSQ1RTUEVSQkFUQ0gKKyNkZWZpbmUgV1JDVFNQRVJCQVRDSCAxMAkJLyogd2lkZSBsaW5lIHJlY3RhbmdsZSBiYXRjaGluZyAqLworI2VuZGlmCisjaWZuZGVmIFpSQ1RTUEVSQkFUQ0gKKyNkZWZpbmUgWlJDVFNQRVJCQVRDSCAyNTYJCS8qIHRoaW4gbGluZSByZWN0YW5nbGUgYmF0Y2hpbmcgKi8KKyNlbmRpZgorI2lmbmRlZiBGUkNUU1BFUkJBVENICisjZGVmaW5lIEZSQ1RTUEVSQkFUQ0ggMjU2CQkvKiBmaWxsZWQgcmVjdGFuZ2xlIGJhdGNoaW5nICovCisjZW5kaWYKKyNpZm5kZWYgRkFSQ1NQRVJCQVRDSAorI2RlZmluZSBGQVJDU1BFUkJBVENIIDI1NgkJLyogZmlsbGVkIGFyYyBiYXRjaGluZyAqLworI2VuZGlmCisjaWZuZGVmIENVUlNPUkZPTlQKKyNkZWZpbmUgQ1VSU09SRk9OVCAiY3Vyc29yIgkJLyogc3RhbmRhcmQgY3Vyc29yIGZvbnRzICovCisjZW5kaWYKKworLyoKKyAqIERpc3BsYXkgZmxhZ3MKKyAqLworI2RlZmluZSBYbGliRGlzcGxheUlPRXJyb3IJKDFMIDw8IDApCisjZGVmaW5lIFhsaWJEaXNwbGF5Q2xvc2luZwkoMUwgPDwgMSkKKyNkZWZpbmUgWGxpYkRpc3BsYXlOb1hrYgkoMUwgPDwgMikKKyNkZWZpbmUgWGxpYkRpc3BsYXlQcml2U3luYwkoMUwgPDwgMykKKyNkZWZpbmUgWGxpYkRpc3BsYXlQcm9jQ29ubmkJKDFMIDw8IDQpIC8qIGluIF9YUHJvY2Vzc0ludGVybmFsQ29ubmVjdGlvbiAqLworI2RlZmluZSBYbGliRGlzcGxheVJlYWRFdmVudHMJKDFMIDw8IDUpIC8qIGluIF9YUmVhZEV2ZW50cyAqLworI2RlZmluZSBYbGliRGlzcGxheVJlcGx5CSgxTCA8PCA1KSAvKiBpbiBfWFJlcGx5ICovCisjZGVmaW5lIFhsaWJEaXNwbGF5V3JpdGluZwkoMUwgPDwgNikgLyogaW4gX1hGbHVzaEludCwgX1hTZW5kICovCisjZGVmaW5lIFhsaWJEaXNwbGF5RGZsdFJNREIgICAgICgxTCA8PCA3KSAvKiBtYXJrIGlmIFJNIGRiIGZyb20gWEdldERlZmF1bHQgKi8KKworLyoKKyAqIFggUHJvdG9jb2wgcGFja2V0aXppbmcgbWFjcm9zLgorICovCisKKy8qICAgTmVlZCB0byBzdGFydCByZXF1ZXN0cyBvbiA2NCBiaXQgd29yZCBib3VuZGFyaWVzCisgKiAgIG9uIGEgQ1JBWSBjb21wdXRlciBzbyBhZGQgYSBOb09wICgxMjcpIGlmIG5lZWRlZC4KKyAqICAgQSBjaGFyYWN0ZXIgcG9pbnRlciBvbiBhIENSQVkgY29tcHV0ZXIgd2lsbCBiZSBub24temVybworICogICBhZnRlciBzaGlmdGluZyByaWdodCA2MSBiaXRzIG9mIGl0IGlzIG5vdCBwb2ludGluZyB0bworICogICBhIHdvcmQgYm91bmRhcnkuCisgKi8KKyNpZmRlZiBXT1JENjQKKyNkZWZpbmUgV09SRDY0QUxJR04gaWYgKChsb25nKWRweS0+YnVmcHRyID4+IDYxKSB7XAorICAgICAgICAgICBkcHktPmxhc3RfcmVxID0gZHB5LT5idWZwdHI7XAorICAgICAgICAgICAqKGRweS0+YnVmcHRyKSAgID0gWF9Ob09wZXJhdGlvbjtcCisgICAgICAgICAgICooZHB5LT5idWZwdHIrMSkgPSAgMDtcCisgICAgICAgICAgICooZHB5LT5idWZwdHIrMikgPSAgMDtcCisgICAgICAgICAgICooZHB5LT5idWZwdHIrMykgPSAgMTtcCisgICAgICAgICAgICAgZHB5LT5yZXF1ZXN0Kys7XAorICAgICAgICAgICAgIGRweS0+YnVmcHRyICs9IDQ7XAorICAgICAgICAgfQorI2Vsc2UgLyogZWxzZSBkb2VzIG5vdCByZXF1aXJlIGFsaWdubWVudCBvbiA2NC1iaXQgYm91bmRhcmllcyAqLworI2RlZmluZSBXT1JENjRBTElHTgorI2VuZGlmIC8qIFdPUkQ2NCAqLworCisvKioKKyAqIFJldHVybiBhIGxlbi1zaXplZCByZXF1ZXN0IGJ1ZmZlciBmb3IgdGhlIHJlcXVlc3QgdHlwZS4gVGhpcyBmdW5jdGlvbiBtYXkKKyAqIGZsdXNoIHRoZSBvdXRwdXQgcXVldWUuCisgKgorICogQHBhcmFtIGRweSBUaGUgZGlzcGxheSBjb25uZWN0aW9uCisgKiBAcGFyYW0gdHlwZSBUaGUgcmVxdWVzdCB0eXBlCisgKiBAcGFyYW0gbGVuIExlbmd0aCBvZiB0aGUgcmVxdWVzdCBpbiBieXRlcworICoKKyAqIEByZXR1cm5zIEEgcG9pbnRlciB0byB0aGUgcmVxdWVzdCBidWZmZXIgd2l0aCBhIGZldyBkZWZhdWx0IHZhbHVlcworICogaW5pdGlhbGl6ZWQuCisgKi8KK2V4dGVybiB2b2lkICpfWEdldFJlcXVlc3QoRGlzcGxheSAqZHB5LCBDQVJEOCB0eXBlLCBzaXplX3QgbGVuKTsKKworLyogR2V0UmVxU2l6ZWQgaXMgdGhlIHNhbWUgYXMgR2V0UmVxIGJ1dCBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IHRoZQorICogc2l6ZSBpbiBieXRlcy4gJ3N6JyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCEgKi8KKworI2lmICFkZWZpbmVkKFVOSVhDUFApIHx8IGRlZmluZWQoQU5TSUNQUCkKKyNkZWZpbmUgR2V0UmVxU2l6ZWQobmFtZSwgc3osIHJlcSkgXAorCXJlcSA9ICh4IyNuYW1lIyNSZXEgKikgX1hHZXRSZXF1ZXN0KGRweSwgWF8jI25hbWUsIHN6KQorI2Vsc2UKKyNkZWZpbmUgR2V0UmVxU2l6ZWQobmFtZSwgc3osIHJlcSkgXAorCXJlcSA9ICh4LyoqL25hbWUvKiovUmVxICopIF9YR2V0UmVxdWVzdChkcHksIFhfLyoqL25hbWUsIHN6KQorI2VuZGlmCisKKworLyoKKyAqIEdldFJlcSAtIEdldCB0aGUgbmV4dCBhdmFpbGFibGUgWCByZXF1ZXN0IHBhY2tldCBpbiB0aGUgYnVmZmVyIGFuZAorICogcmV0dXJuIGl0LgorICoKKyAqICJuYW1lIiBpcyB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdCwgZS5nLiBDcmVhdGVQaXhtYXAsIE9wZW5Gb250LCBldGMuCisgKiAicmVxIiBpcyB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdCBwb2ludGVyLgorICoKKyAqLworCisjaWYgIWRlZmluZWQoVU5JWENQUCkgfHwgZGVmaW5lZChBTlNJQ1BQKQorI2RlZmluZSBHZXRSZXEobmFtZSwgcmVxKSBcCisJR2V0UmVxU2l6ZWQobmFtZSwgU0laRU9GKHgjI25hbWUjI1JlcSksIHJlcSkKKyNlbHNlICAvKiBub24tQU5TSSBDIHVzZXMgZW1wdHkgY29tbWVudCBpbnN0ZWFkIG9mICIjIyIgZm9yIHRva2VuIGNvbmNhdGVuYXRpb24gKi8KKyNkZWZpbmUgR2V0UmVxKG5hbWUsIHJlcSkgXAorCUdldFJlcVNpemVkKG5hbWUsIFNJWkVPRih4LyoqL25hbWUvKiovUmVxKSwgcmVxKQorI2VuZGlmCisKKy8qIEdldFJlcUV4dHJhIGlzIHRoZSBzYW1lIGFzIEdldFJlcSwgYnV0IGFsbG9jYXRlcyAibiIgYWRkaXRpb25hbAorICAgYnl0ZXMgYWZ0ZXIgdGhlIHJlcXVlc3QuICJuIiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCEgICovCisKKyNpZiAhZGVmaW5lZChVTklYQ1BQKSB8fCBkZWZpbmVkKEFOU0lDUFApCisjZGVmaW5lIEdldFJlcUV4dHJhKG5hbWUsIG4sIHJlcSkgXAorICAgICAgICBHZXRSZXFTaXplZChuYW1lLCBTSVpFT0YoeCMjbmFtZSMjUmVxKSArIG4sIHJlcSkKKyNlbHNlCisjZGVmaW5lIEdldFJlcUV4dHJhKG5hbWUsIG4sIHJlcSkgXAorICAgICAgICBHZXRSZXFTaXplZChuYW1lLCBTSVpFT0YoeC8qKi9uYW1lLyoqL1JlcSkgKyBuLCByZXEpCisjZW5kaWYKKworCisvKgorICogR2V0UmVzUmVxIGlzIGZvciB0aG9zZSByZXF1ZXN0cyB0aGF0IGhhdmUgYSByZXNvdXJjZSBJRAorICogKFdpbmRvdywgUGl4bWFwLCBHQ29udGV4dCwgZXRjLikgYXMgdGhlaXIgc2luZ2xlIGFyZ3VtZW50LgorICogInJpZCIgaXMgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLgorICovCisKKyNpZiAhZGVmaW5lZChVTklYQ1BQKSB8fCBkZWZpbmVkKEFOU0lDUFApCisjZGVmaW5lIEdldFJlc1JlcShuYW1lLCByaWQsIHJlcSkgXAorCXJlcSA9ICh4UmVzb3VyY2VSZXEgKikgX1hHZXRSZXF1ZXN0KGRweSwgWF8jI25hbWUsIFNJWkVPRih4UmVzb3VyY2VSZXEpKTsgXAorCXJlcS0+aWQgPSAocmlkKQorI2Vsc2UKKyNkZWZpbmUgR2V0UmVzUmVxKG5hbWUsIHJpZCwgcmVxKSBcCisJcmVxID0gKHhSZXNvdXJjZVJlcSAqKSBfWEdldFJlcXVlc3QoZHB5LCBYXy8qKi9uYW1lLCBTSVpFT0YoeFJlc291cmNlUmVxKSk7IFwKKwlyZXEtPmlkID0gKHJpZCkKKyNlbmRpZgorCisvKgorICogR2V0RW1wdHlSZXEgaXMgZm9yIHRob3NlIHJlcXVlc3RzIHRoYXQgaGF2ZSBubyBhcmd1bWVudHMKKyAqIGF0IGFsbC4KKyAqLworI2lmICFkZWZpbmVkKFVOSVhDUFApIHx8IGRlZmluZWQoQU5TSUNQUCkKKyNkZWZpbmUgR2V0RW1wdHlSZXEobmFtZSwgcmVxKSBcCisJcmVxID0gKHhSZXEgKikgX1hHZXRSZXF1ZXN0KGRweSwgWF8jI25hbWUsIFNJWkVPRih4UmVxKSkKKyNlbHNlCisjZGVmaW5lIEdldEVtcHR5UmVxKG5hbWUsIHJlcSkgXAorCXJlcSA9ICh4UmVxICopIF9YR2V0UmVxdWVzdChkcHksIFhfLyoqL25hbWUsIFNJWkVPRih4UmVxKSkKKyNlbmRpZgorCisjaWZkZWYgV09SRDY0CisjZGVmaW5lIE1ha2VCaWdSZXEocmVxLG4pIFwKKyAgICB7IFwKKyAgICBjaGFyIF9CUmRhdFs0XTsgXAorICAgIHVuc2lnbmVkIGxvbmcgX0JSbGVuID0gcmVxLT5sZW5ndGggLSAxOyBcCisgICAgcmVxLT5sZW5ndGggPSAwOyBcCisgICAgbWVtY3B5KF9CUmRhdCwgKChjaGFyICopcmVxKSArIChfQlJsZW4gPDwgMiksIDQpOyBcCisgICAgbWVtbW92ZSgoKGNoYXIgKilyZXEpICsgOCwgKChjaGFyICopcmVxKSArIDQsIF9CUmxlbiA8PCAyKTsgXAorICAgIG1lbWNweSgoKGNoYXIgKilyZXEpICsgNCwgX0JSZGF0LCA0KTsgXAorICAgIERhdGEzMihkcHksIChsb25nICopJl9CUmRhdCwgNCk7IFwKKyAgICB9CisjZWxzZQorI2lmZGVmIExPTkc2NAorI2RlZmluZSBNYWtlQmlnUmVxKHJlcSxuKSBcCisgICAgeyBcCisgICAgQ0FSRDY0IF9CUmRhdDsgXAorICAgIENBUkQzMiBfQlJsZW4gPSByZXEtPmxlbmd0aCAtIDE7IFwKKyAgICByZXEtPmxlbmd0aCA9IDA7IFwKKyAgICBfQlJkYXQgPSAoKENBUkQzMiAqKXJlcSlbX0JSbGVuXTsgXAorICAgIG1lbW1vdmUoKChjaGFyICopcmVxKSArIDgsICgoY2hhciAqKXJlcSkgKyA0LCBfQlJsZW4gPDwgMik7IFwKKyAgICAoKENBUkQzMiAqKXJlcSlbMV0gPSBfQlJsZW4gKyBuICsgMjsgXAorICAgIERhdGEzMihkcHksICZfQlJkYXQsIDQpOyBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgTWFrZUJpZ1JlcShyZXEsbikgXAorICAgIHsgXAorICAgIENBUkQzMiBfQlJkYXQ7IFwKKyAgICBDQVJEMzIgX0JSbGVuID0gcmVxLT5sZW5ndGggLSAxOyBcCisgICAgcmVxLT5sZW5ndGggPSAwOyBcCisgICAgX0JSZGF0ID0gKChDQVJEMzIgKilyZXEpW19CUmxlbl07IFwKKyAgICBtZW1tb3ZlKCgoY2hhciAqKXJlcSkgKyA4LCAoKGNoYXIgKilyZXEpICsgNCwgX0JSbGVuIDw8IDIpOyBcCisgICAgKChDQVJEMzIgKilyZXEpWzFdID0gX0JSbGVuICsgbiArIDI7IFwKKyAgICBEYXRhMzIoZHB5LCAmX0JSZGF0LCA0KTsgXAorICAgIH0KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX19jbGFuZ19hbmFseXplcl9fCisjZGVmaW5lIFNldFJlcUxlbihyZXEsbixiYWRsZW4pIFwKKyAgICBpZiAoKHJlcS0+bGVuZ3RoICsgbikgPiAodW5zaWduZWQpNjU1MzUpIHsgXAorCWlmIChkcHktPmJpZ3JlcV9zaXplKSB7IFwKKwkgICAgTWFrZUJpZ1JlcShyZXEsbikgXAorCX0gZWxzZSB7IFwKKwkgICAgbiA9IGJhZGxlbjsgXAorCSAgICByZXEtPmxlbmd0aCArPSBuOyBcCisJfSBcCisgICAgfSBlbHNlIFwKKwlyZXEtPmxlbmd0aCArPSBuCisjZWxzZQorI2RlZmluZSBTZXRSZXFMZW4ocmVxLG4sYmFkbGVuKSBcCisgICAgcmVxLT5sZW5ndGggKz0gbgorI2VuZGlmCisKKyNkZWZpbmUgU3luY0hhbmRsZSgpIFwKKwlpZiAoZHB5LT5zeW5jaGFuZGxlcikgKCpkcHktPnN5bmNoYW5kbGVyKShkcHkpCisKK2V4dGVybiB2b2lkIF9YRmx1c2hHQ0NhY2hlKERpc3BsYXkgKmRweSwgR0MgZ2MpOworI2RlZmluZSBGbHVzaEdDKGRweSwgZ2MpIFwKKwlpZiAoKGdjKS0+ZGlydHkpIF9YRmx1c2hHQ0NhY2hlKChkcHkpLCAoZ2MpKQorLyoKKyAqIERhdGEgLSBQbGFjZSBkYXRhIGluIHRoZSBidWZmZXIgYW5kIHBhZCB0aGUgZW5kIHRvIHByb3ZpZGUKKyAqIDMyIGJpdCB3b3JkIGFsaWdubWVudC4gIFRyYW5zbWl0IGlmIHRoZSBidWZmZXIgZmlsbHMuCisgKgorICogImRweSIgaXMgYSBwb2ludGVyIHRvIGEgRGlzcGxheS4KKyAqICJkYXRhIiBpcyBhIHBpbnRlciB0byBhIGRhdGEgYnVmZmVyLgorICogImxlbiIgaXMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIuCisgKi8KKyNpZm5kZWYgRGF0YVJvdXRpbmVJc1Byb2NlZHVyZQorI2RlZmluZSBEYXRhKGRweSwgZGF0YSwgbGVuKSB7XAorCWlmIChkcHktPmJ1ZnB0ciArIChsZW4pIDw9IGRweS0+YnVmbWF4KSB7XAorCQltZW1jcHkoZHB5LT5idWZwdHIsIGRhdGEsIChpbnQpbGVuKTtcCisJCWRweS0+YnVmcHRyICs9ICgobGVuKSArIDMpICYgfjM7XAorCX0gZWxzZVwKKwkJX1hTZW5kKGRweSwgZGF0YSwgbGVuKTtcCisJfQorI2VuZGlmIC8qIERhdGFSb3V0aW5lSXNQcm9jZWR1cmUgKi8KKworCisvKiBBbGxvY2F0ZSBieXRlcyBmcm9tIHRoZSBidWZmZXIuICBObyBwYWRkaW5nIGlzIGRvbmUsIHNvIGlmCisgKiB0aGUgbGVuZ3RoIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQsIHRoZSBjYWxsZXIgbXVzdCBiZQorICogY2FyZWZ1bCB0byBsZWF2ZSB0aGUgYnVmZmVyIGFsaWduZWQgYWZ0ZXIgc2VuZGluZyB0aGUKKyAqIGN1cnJlbnQgcmVxdWVzdC4KKyAqCisgKiAidHlwZSIgaXMgdGhlIHR5cGUgb2YgdGhlIHBvaW50ZXIgYmVpbmcgYXNzaWduZWQgdG8uCisgKiAicHRyIiBpcyB0aGUgcG9pbnRlciBiZWluZyBhc3NpZ25lZCB0by4KKyAqICJuIiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlLgorICoKKyAqIEV4YW1wbGU6CisgKiAgICB4VGV4dEVsdCAqZWx0OworICogICAgQnVmQWxsb2MgKHhUZXh0RWx0ICosIGVsdCwgbmJ5dGVzKQorICovCisKKyNkZWZpbmUgQnVmQWxsb2ModHlwZSwgcHRyLCBuKSBcCisgICAgaWYgKGRweS0+YnVmcHRyICsgKG4pID4gZHB5LT5idWZtYXgpIFwKKyAgICAgICAgX1hGbHVzaCAoZHB5KTsgXAorICAgIHB0ciA9ICh0eXBlKSBkcHktPmJ1ZnB0cjsgXAorICAgIG1lbXNldChwdHIsICdcMCcsIG4pOyBcCisgICAgZHB5LT5idWZwdHIgKz0gKG4pOworCisjaWZkZWYgV09SRDY0CisjZGVmaW5lIERhdGExNihkcHksIGRhdGEsIGxlbikgX1hEYXRhMTYoZHB5LCAoc2hvcnQgKilkYXRhLCBsZW4pCisjZGVmaW5lIERhdGEzMihkcHksIGRhdGEsIGxlbikgX1hEYXRhMzIoZHB5LCAobG9uZyAqKWRhdGEsIGxlbikKKyNlbHNlCisjZGVmaW5lIERhdGExNihkcHksIGRhdGEsIGxlbikgRGF0YSgoZHB5KSwgKGNoYXIgKikoZGF0YSksIChsZW4pKQorI2RlZmluZSBfWFJlYWQxNlBhZChkcHksIGRhdGEsIGxlbikgX1hSZWFkUGFkKChkcHkpLCAoY2hhciAqKShkYXRhKSwgKGxlbikpCisjZGVmaW5lIF9YUmVhZDE2KGRweSwgZGF0YSwgbGVuKSBfWFJlYWQoKGRweSksIChjaGFyICopKGRhdGEpLCAobGVuKSkKKyNpZmRlZiBMT05HNjQKKyNkZWZpbmUgRGF0YTMyKGRweSwgZGF0YSwgbGVuKSBfWERhdGEzMihkcHksIChsb25nICopZGF0YSwgbGVuKQorZXh0ZXJuIGludCBfWERhdGEzMigKKwkgICAgIERpc3BsYXkgKmRweSwKKwkgICAgIHJlZ2lzdGVyIGxvbmcgKmRhdGEsCisJICAgICB1bnNpZ25lZCBsZW4KKyk7CitleHRlcm4gdm9pZCBfWFJlYWQzMigKKwkgICAgIERpc3BsYXkgKmRweSwKKwkgICAgIHJlZ2lzdGVyIGxvbmcgKmRhdGEsCisJICAgICBsb25nIGxlbgorKTsKKyNlbHNlCisjZGVmaW5lIERhdGEzMihkcHksIGRhdGEsIGxlbikgRGF0YSgoZHB5KSwgKGNoYXIgKikoZGF0YSksIChsZW4pKQorI2RlZmluZSBfWFJlYWQzMihkcHksIGRhdGEsIGxlbikgX1hSZWFkKChkcHkpLCAoY2hhciAqKShkYXRhKSwgKGxlbikpCisjZW5kaWYKKyNlbmRpZiAvKiBub3QgV09SRDY0ICovCisKKyNkZWZpbmUgUGFja0RhdGExNihkcHksZGF0YSxsZW4pIERhdGExNiAoZHB5LCBkYXRhLCBsZW4pCisjZGVmaW5lIFBhY2tEYXRhMzIoZHB5LGRhdGEsbGVuKSBEYXRhMzIgKGRweSwgZGF0YSwgbGVuKQorCisvKiBYbGliIG1hbnVhbCBpcyBib2d1cyAqLworI2RlZmluZSBQYWNrRGF0YShkcHksZGF0YSxsZW4pIFBhY2tEYXRhMTYgKGRweSwgZGF0YSwgbGVuKQorCisjZGVmaW5lIG1pbihhLGIpICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgbWF4KGEsYikgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorCisjZGVmaW5lIENJX05PTkVYSVNUQ0hBUihjcykgKCgoY3MpLT53aWR0aCA9PSAwKSAmJiBcCisJCQkgICAgICgoKGNzKS0+cmJlYXJpbmd8KGNzKS0+bGJlYXJpbmd8IFwKKwkJCSAgICAgICAoY3MpLT5hc2NlbnR8KGNzKS0+ZGVzY2VudCkgPT0gMCkpCisKKy8qCisgKiBDSV9HRVRfQ0hBUl9JTkZPXzFEIC0gcmV0dXJuIHRoZSBjaGFyaW5mbyBzdHJ1Y3QgZm9yIHRoZSBpbmRpY2F0ZWQgOGJpdAorICogY2hhcmFjdGVyLiAgSWYgdGhlIGNoYXJhY3RlciBpcyBpbiB0aGUgY29sdW1uIGFuZCBleGlzdHMsIHRoZW4gcmV0dXJuIHRoZQorICogYXBwcm9wcmlhdGUgbWV0cmljcyAobm90ZSB0aGF0IGZvbnRzIHdpdGggY29tbW9uIHBlci1jaGFyYWN0ZXIgbWV0cmljcyB3aWxsCisgKiByZXR1cm4gbWluX2JvdW5kcykuICBJZiBub25lIG9mIHRoZXNlIGhvbGQgdHJ1ZSwgdHJ5IGFnYWluIHdpdGggdGhlIGRlZmF1bHQKKyAqIGNoYXIuCisgKi8KKyNkZWZpbmUgQ0lfR0VUX0NIQVJfSU5GT18xRChmcyxjb2wsZGVmLGNzKSBcCit7IFwKKyAgICBjcyA9IGRlZjsgXAorICAgIGlmIChjb2wgPj0gZnMtPm1pbl9jaGFyX29yX2J5dGUyICYmIGNvbCA8PSBmcy0+bWF4X2NoYXJfb3JfYnl0ZTIpIHsgXAorCWlmIChmcy0+cGVyX2NoYXIgPT0gTlVMTCkgeyBcCisJICAgIGNzID0gJmZzLT5taW5fYm91bmRzOyBcCisJfSBlbHNlIHsgXAorCSAgICBjcyA9ICZmcy0+cGVyX2NoYXJbKGNvbCAtIGZzLT5taW5fY2hhcl9vcl9ieXRlMildOyBcCisJICAgIGlmIChDSV9OT05FWElTVENIQVIoY3MpKSBjcyA9IGRlZjsgXAorCX0gXAorICAgIH0gXAorfQorCisjZGVmaW5lIENJX0dFVF9ERUZBVUxUX0lORk9fMUQoZnMsY3MpIFwKKyAgQ0lfR0VUX0NIQVJfSU5GT18xRCAoZnMsIGZzLT5kZWZhdWx0X2NoYXIsIE5VTEwsIGNzKQorCisKKworLyoKKyAqIENJX0dFVF9DSEFSX0lORk9fMkQgLSByZXR1cm4gdGhlIGNoYXJpbmZvIHN0cnVjdCBmb3IgdGhlIGluZGljYXRlZCByb3cgYW5kCisgKiBjb2x1bW4uICBUaGlzIGlzIHVzZWQgZm9yIGZvbnRzIHRoYXQgaGF2ZSBtb3JlIHRoYW4gcm93IHplcm8uCisgKi8KKyNkZWZpbmUgQ0lfR0VUX0NIQVJfSU5GT18yRChmcyxyb3csY29sLGRlZixjcykgXAoreyBcCisgICAgY3MgPSBkZWY7IFwKKyAgICBpZiAocm93ID49IGZzLT5taW5fYnl0ZTEgJiYgcm93IDw9IGZzLT5tYXhfYnl0ZTEgJiYgXAorCWNvbCA+PSBmcy0+bWluX2NoYXJfb3JfYnl0ZTIgJiYgY29sIDw9IGZzLT5tYXhfY2hhcl9vcl9ieXRlMikgeyBcCisJaWYgKGZzLT5wZXJfY2hhciA9PSBOVUxMKSB7IFwKKwkgICAgY3MgPSAmZnMtPm1pbl9ib3VuZHM7IFwKKwl9IGVsc2UgeyBcCisJICAgIGNzID0gJmZzLT5wZXJfY2hhclsoKHJvdyAtIGZzLT5taW5fYnl0ZTEpICogXAorCQkJICAgICAgICAoZnMtPm1heF9jaGFyX29yX2J5dGUyIC0gXAorCQkJCSBmcy0+bWluX2NoYXJfb3JfYnl0ZTIgKyAxKSkgKyBcCisJCQkgICAgICAgKGNvbCAtIGZzLT5taW5fY2hhcl9vcl9ieXRlMildOyBcCisJICAgIGlmIChDSV9OT05FWElTVENIQVIoY3MpKSBjcyA9IGRlZjsgXAorICAgICAgICB9IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBDSV9HRVRfREVGQVVMVF9JTkZPXzJEKGZzLGNzKSBcCit7IFwKKyAgICB1bnNpZ25lZCBpbnQgciA9IChmcy0+ZGVmYXVsdF9jaGFyID4+IDgpOyBcCisgICAgdW5zaWduZWQgaW50IGMgPSAoZnMtPmRlZmF1bHRfY2hhciAmIDB4ZmYpOyBcCisgICAgQ0lfR0VUX0NIQVJfSU5GT18yRCAoZnMsIHIsIGMsIE5VTEwsIGNzKTsgXAorfQorCisKKyNpZmRlZiBNVVNUQ09QWQorCisvKiBmb3Igd2hlbiAzMi1iaXQgYWxpZ25tZW50IGlzIG5vdCBnb29kIGVub3VnaCAqLworI2RlZmluZSBPbmVEYXRhQ2FyZDMyKGRweSxkc3RhZGRyLHNyY3ZhcikgXAorICB7IGRweS0+YnVmcHRyIC09IDQ7IERhdGEzMiAoZHB5LCAoY2hhciAqKSAmKHNyY3ZhciksIDQpOyB9CisKKyNlbHNlCisKKy8qIHNyY3ZhciBtdXN0IGJlIGEgdmFyaWFibGUgZm9yIGxhcmdlIGFyY2hpdGVjdHVyZSB2ZXJzaW9uICovCisjZGVmaW5lIE9uZURhdGFDYXJkMzIoZHB5LGRzdGFkZHIsc3JjdmFyKSBcCisgIHsgKihDQVJEMzIgKikoZHN0YWRkcikgPSAoc3JjdmFyKTsgfQorCisjZW5kaWYgLyogTVVTVENPUFkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1hJbnRlcm5hbEFzeW5jIHsKKyAgICBzdHJ1Y3QgX1hJbnRlcm5hbEFzeW5jICpuZXh0OworICAgIC8qCisgICAgICogaGFuZGxlciBhcmd1bWVudHM6CisgICAgICogcmVwIGlzIHRoZSBnZW5lcmljIHJlcGx5IHRoYXQgY2F1c2VkIHRoaXMgaGFuZGxlcgorICAgICAqIHRvIGJlIGludm9rZWQuICBJdCBtdXN0IGFsc28gYmUgcGFzc2VkIHRvIF9YR2V0QXN5bmNSZXBseS4KKyAgICAgKiBidWYgYW5kIGxlbiBhcmUgb3BhcXVlIHZhbHVlcyB0aGF0IG11c3QgYmUgcGFzc2VkIHRvCisgICAgICogX1hHZXRBc3luY1JlcGx5IG9yIF9YR2V0QXN5bmNEYXRhLgorICAgICAqIGRhdGEgaXMgdGhlIGNsb3N1cmUgc3RvcmVkIGluIHRoaXMgc3RydWN0LgorICAgICAqIFRoZSBoYW5kbGVyIHJldHVybnMgVHJ1ZSBpZmYgaXQgaGFuZGxlZCB0aGlzIHJlcGx5LgorICAgICAqLworICAgIEJvb2wgKCpoYW5kbGVyKSgKKwkJICAgIERpc3BsYXkqCS8qIGRweSAqLywKKwkJICAgIHhSZXBseSoJLyogcmVwICovLAorCQkgICAgY2hhcioJLyogYnVmICovLAorCQkgICAgaW50CQkvKiBsZW4gKi8sCisJCSAgICBYUG9pbnRlcgkvKiBkYXRhICovCisJCSAgICApOworICAgIFhQb2ludGVyIGRhdGE7Cit9IF9YQXN5bmNIYW5kbGVyOworCit0eXBlZGVmIHN0cnVjdCBfWEFzeW5jRVN0YXRlIHsKKyAgICB1bnNpZ25lZCBsb25nIG1pbl9zZXF1ZW5jZV9udW1iZXI7CisgICAgdW5zaWduZWQgbG9uZyBtYXhfc2VxdWVuY2VfbnVtYmVyOworICAgIHVuc2lnbmVkIGNoYXIgZXJyb3JfY29kZTsKKyAgICB1bnNpZ25lZCBjaGFyIG1ham9yX29wY29kZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBtaW5vcl9vcGNvZGU7CisgICAgdW5zaWduZWQgY2hhciBsYXN0X2Vycm9yX3JlY2VpdmVkOworICAgIGludCBlcnJvcl9jb3VudDsKK30gX1hBc3luY0Vycm9yU3RhdGU7CisKK2V4dGVybiB2b2lkIF9YRGVxQXN5bmNIYW5kbGVyKERpc3BsYXkgKmRweSwgX1hBc3luY0hhbmRsZXIgKmhhbmRsZXIpOworI2RlZmluZSBEZXFBc3luY0hhbmRsZXIoZHB5LGhhbmRsZXIpIHsgXAorICAgIGlmIChkcHktPmFzeW5jX2hhbmRsZXJzID09IChoYW5kbGVyKSkgXAorCWRweS0+YXN5bmNfaGFuZGxlcnMgPSAoaGFuZGxlciktPm5leHQ7IFwKKyAgICBlbHNlIFwKKwlfWERlcUFzeW5jSGFuZGxlcihkcHksIGhhbmRsZXIpOyBcCisgICAgfQorCit0eXBlZGVmIHZvaWQgKCpGcmVlRnVuY1R5cGUpICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovCispOworCit0eXBlZGVmIGludCAoKkZyZWVNb2RtYXBUeXBlKSAoCisgICAgWE1vZGlmaWVyS2V5bWFwKgkvKiBtb2RtYXAgKi8KKyk7CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBwcml2YXRlIHRvIHRoZSBsaWJyYXJ5LgorICovCit0eXBlZGVmIHN0cnVjdCBfWEZyZWVGdW5jcyB7CisgICAgRnJlZUZ1bmNUeXBlIGF0b21zOwkJLyogX1hGcmVlQXRvbVRhYmxlICovCisgICAgRnJlZU1vZG1hcFR5cGUgbW9kaWZpZXJtYXA7CS8qIFhGcmVlTW9kaWZpZXJtYXAgKi8KKyAgICBGcmVlRnVuY1R5cGUga2V5X2JpbmRpbmdzOwkvKiBfWEZyZWVLZXlCaW5kaW5ncyAqLworICAgIEZyZWVGdW5jVHlwZSBjb250ZXh0X2RiOwkvKiBfWEZyZWVDb250ZXh0REIgKi8KKyAgICBGcmVlRnVuY1R5cGUgZGVmYXVsdENDQ3M7CS8qIF9YY21zRnJlZURlZmF1bHRDQ0NzICovCisgICAgRnJlZUZ1bmNUeXBlIGNsaWVudENtYXBzOwkvKiBfWGNtc0ZyZWVDbGllbnRDbWFwcyAqLworICAgIEZyZWVGdW5jVHlwZSBpbnRlbnNpdHlNYXBzOwkvKiBfWGNtc0ZyZWVJbnRlbnNpdHlNYXBzICovCisgICAgRnJlZUZ1bmNUeXBlIGltX2ZpbHRlcnM7CS8qIF9YRnJlZUlNRmlsdGVycyAqLworICAgIEZyZWVGdW5jVHlwZSB4a2I7CQkvKiBfWGtiRnJlZUluZm8gKi8KK30gX1hGcmVlRnVuY1JlYzsKKworLyogdHlwZXMgZm9yIEluaXRFeHQuYyAqLwordHlwZWRlZiBpbnQgKCpDcmVhdGVHQ1R5cGUpICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkvKiBnYyAqLywKKyAgICBYRXh0Q29kZXMqCS8qIGNvZGVzICovCispOworCit0eXBlZGVmIGludCAoKkNvcHlHQ1R5cGUpKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCS8qIGdjICovLAorICAgIFhFeHRDb2RlcyoJLyogY29kZXMgKi8KKyk7CisKK3R5cGVkZWYgaW50ICgqRmx1c2hHQ1R5cGUpICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkvKiBnYyAqLywKKyAgICBYRXh0Q29kZXMqCS8qIGNvZGVzICovCispOworCit0eXBlZGVmIGludCAoKkZyZWVHQ1R5cGUpICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkvKiBnYyAqLywKKyAgICBYRXh0Q29kZXMqCS8qIGNvZGVzICovCispOworCit0eXBlZGVmIGludCAoKkNyZWF0ZUZvbnRUeXBlKSAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBYRm9udFN0cnVjdCogLyogZnMgKi8sCisgICAgWEV4dENvZGVzKgkvKiBjb2RlcyAqLworKTsKKwordHlwZWRlZiBpbnQgKCpGcmVlRm9udFR5cGUpICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIFhGb250U3RydWN0KiAvKiBmcyAqLywKKyAgICBYRXh0Q29kZXMqCS8qIGNvZGVzICovCispOworCit0eXBlZGVmIGludCAoKkNsb3NlRGlzcGxheVR5cGUpICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIFhFeHRDb2RlcyoJLyogY29kZXMgKi8KKyk7CisKK3R5cGVkZWYgaW50ICgqRXJyb3JUeXBlKSAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICB4RXJyb3IqCS8qIGVyciAqLywKKyAgICBYRXh0Q29kZXMqCS8qIGNvZGVzICovLAorICAgIGludCoJLyogcmV0X2NvZGUgKi8KKyk7CisKK3R5cGVkZWYgY2hhciogKCpFcnJvclN0cmluZ1R5cGUpICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIGludAkJLyogY29kZSAqLywKKyAgICBYRXh0Q29kZXMqCS8qIGNvZGVzICovLAorICAgIGNoYXIqCS8qIGJ1ZmZlciAqLywKKyAgICBpbnQJCS8qIG5ieXRlcyAqLworKTsKKwordHlwZWRlZiB2b2lkICgqUHJpbnRFcnJvclR5cGUpKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgWEVycm9yRXZlbnQqIC8qIGV2ICovLAorICAgIHZvaWQqCS8qIGZwICovCispOworCit0eXBlZGVmIHZvaWQgKCpCZWZvcmVGbHVzaFR5cGUpKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgWEV4dENvZGVzKgkvKiBjb2RlcyAqLywKKyAgICBfWGNvbnN0IGNoYXIqIC8qIGRhdGEgKi8sCisgICAgbG9uZwkvKiBsZW4gKi8KKyk7CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBwcml2YXRlIHRvIHRoZSBsaWJyYXJ5LgorICovCit0eXBlZGVmIHN0cnVjdCBfWEV4dGVuIHsJCS8qIHByaXZhdGUgdG8gZXh0ZW5zaW9uIG1lY2hhbmlzbSAqLworCXN0cnVjdCBfWEV4dGVuICpuZXh0OwkJLyogbmV4dCBpbiBsaXN0ICovCisJWEV4dENvZGVzIGNvZGVzOwkJLyogcHVibGljIGluZm9ybWF0aW9uLCBhbGwgZXh0ZW5zaW9uIHRvbGQgKi8KKwlDcmVhdGVHQ1R5cGUgY3JlYXRlX0dDOwkJLyogcm91dGluZSB0byBjYWxsIHdoZW4gR0MgY3JlYXRlZCAqLworCUNvcHlHQ1R5cGUgY29weV9HQzsJCS8qIHJvdXRpbmUgdG8gY2FsbCB3aGVuIEdDIGNvcGllZCAqLworCUZsdXNoR0NUeXBlIGZsdXNoX0dDOwkJLyogcm91dGluZSB0byBjYWxsIHdoZW4gR0MgZmx1c2hlZCAqLworCUZyZWVHQ1R5cGUgZnJlZV9HQzsJCS8qIHJvdXRpbmUgdG8gY2FsbCB3aGVuIEdDIGZyZWVkICovCisJQ3JlYXRlRm9udFR5cGUgY3JlYXRlX0ZvbnQ7CS8qIHJvdXRpbmUgdG8gY2FsbCB3aGVuIEZvbnQgY3JlYXRlZCAqLworCUZyZWVGb250VHlwZSBmcmVlX0ZvbnQ7CQkvKiByb3V0aW5lIHRvIGNhbGwgd2hlbiBGb250IGZyZWVkICovCisJQ2xvc2VEaXNwbGF5VHlwZSBjbG9zZV9kaXNwbGF5OwkvKiByb3V0aW5lIHRvIGNhbGwgd2hlbiBjb25uZWN0aW9uIGNsb3NlZCAqLworCUVycm9yVHlwZSBlcnJvcjsJCS8qIHdobyB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzICovCisJRXJyb3JTdHJpbmdUeXBlIGVycm9yX3N0cmluZzsJLyogcm91dGluZSB0byBzdXBwbHkgZXJyb3Igc3RyaW5nICovCisJY2hhciAqbmFtZTsJCQkvKiBuYW1lIG9mIHRoaXMgZXh0ZW5zaW9uICovCisJUHJpbnRFcnJvclR5cGUgZXJyb3JfdmFsdWVzOwkvKiByb3V0aW5lIHRvIHN1cHBseSBlcnJvciB2YWx1ZXMgKi8KKwlCZWZvcmVGbHVzaFR5cGUgYmVmb3JlX2ZsdXNoOwkvKiByb3V0aW5lIHRvIGNhbGwgd2hlbiBzZW5kaW5nIGRhdGEgKi8KKwlzdHJ1Y3QgX1hFeHRlbiAqbmV4dF9mbHVzaDsJLyogbmV4dCBpbiBsaXN0IG9mIHRob3NlIHdpdGggZmx1c2hlcyAqLworfSBfWEV4dGVuc2lvbjsKKworLyogZXh0ZW5zaW9uIGhvb2tzICovCisKKyNpZmRlZiBEYXRhUm91dGluZUlzUHJvY2VkdXJlCitleHRlcm4gdm9pZCBEYXRhKERpc3BsYXkgKmRweSwgY2hhciAqZGF0YSwgbG9uZyBsZW4pOworI2VuZGlmCitleHRlcm4gaW50IF9YRXJyb3IoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIHhFcnJvcioJLyogcmVwICovCispOworZXh0ZXJuIGludCBfWElPRXJyb3IoCisgICAgRGlzcGxheSoJLyogZHB5ICovCispIF9YX05PUkVUVVJOOworZXh0ZXJuIGludCAoKl9YSU9FcnJvckZ1bmN0aW9uKSgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8KKyk7CitleHRlcm4gaW50ICgqX1hFcnJvckZ1bmN0aW9uKSgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIFhFcnJvckV2ZW50KgkvKiBlcnJvcl9ldmVudCAqLworKTsKK2V4dGVybiB2b2lkIF9YRWF0RGF0YSgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogbiAqLworKTsKK2V4dGVybiBjaGFyICpfWEFsbG9jU2NyYXRjaCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogbmJ5dGVzICovCispOworZXh0ZXJuIGNoYXIgKl9YQWxsb2NUZW1wKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBuYnl0ZXMgKi8KKyk7CitleHRlcm4gdm9pZCBfWEZyZWVUZW1wKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgY2hhcioJCS8qIGJ1ZiAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIG5ieXRlcyAqLworKTsKK2V4dGVybiBWaXN1YWwgKl9YVklEdG9WaXN1YWwoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIFZpc3VhbElECS8qIGlkICovCispOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX1hTZXRMYXN0UmVxdWVzdFJlYWQoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICB4R2VuZXJpY1JlcGx5KgkvKiByZXAgKi8KKyk7CitleHRlcm4gaW50IF9YR2V0SG9zdG5hbWUoCisgICAgY2hhcioJLyogYnVmICovLAorICAgIGludAkJLyogbWF4bGVuICovCispOworZXh0ZXJuIFNjcmVlbiAqX1hTY3JlZW5PZldpbmRvdygKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgV2luZG93CS8qIHcgKi8KKyk7CitleHRlcm4gQm9vbCBfWEFzeW5jRXJyb3JIYW5kbGVyKAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICB4UmVwbHkqCS8qIHJlcCAqLywKKyAgICBjaGFyKgkvKiBidWYgKi8sCisgICAgaW50CQkvKiBsZW4gKi8sCisgICAgWFBvaW50ZXIJLyogZGF0YSAqLworKTsKK2V4dGVybiBjaGFyICpfWEdldEFzeW5jUmVwbHkoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIGNoYXIqCS8qIHJlcGxidWYgKi8sCisgICAgeFJlcGx5KgkvKiByZXAgKi8sCisgICAgY2hhcioJLyogYnVmICovLAorICAgIGludAkJLyogbGVuICovLAorICAgIGludAkJLyogZXh0cmEgKi8sCisgICAgQm9vbAkvKiBkaXNjYXJkICovCispOworZXh0ZXJuIHZvaWQgX1hHZXRBc3luY0RhdGEoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIGNoYXIgKgkvKiBkYXRhICovLAorICAgIGNoYXIgKgkvKiBidWYgKi8sCisgICAgaW50CQkvKiBsZW4gKi8sCisgICAgaW50CQkvKiBza2lwICovLAorICAgIGludAkJLyogZGF0YWxlbiAqLywKKyAgICBpbnQJCS8qIGRpc2NhcmR0b3RhbCAqLworKTsKK2V4dGVybiB2b2lkIF9YRmx1c2goCisgICAgRGlzcGxheSoJLyogZHB5ICovCispOworZXh0ZXJuIGludCBfWEV2ZW50c1F1ZXVlZCgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgaW50IAkvKiBtb2RlICovCispOworZXh0ZXJuIHZvaWQgX1hSZWFkRXZlbnRzKAorICAgIERpc3BsYXkqCS8qIGRweSAqLworKTsKK2V4dGVybiBpbnQgX1hSZWFkKAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICBjaGFyKgkvKiBkYXRhICovLAorICAgIGxvbmcJLyogc2l6ZSAqLworKTsKK2V4dGVybiB2b2lkIF9YUmVhZFBhZCgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgY2hhcioJLyogZGF0YSAqLywKKyAgICBsb25nCS8qIHNpemUgKi8KKyk7CitleHRlcm4gdm9pZCBfWFNlbmQoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGRhdGEgKi8sCisgICAgbG9uZwkJLyogc2l6ZSAqLworKTsKK2V4dGVybiBTdGF0dXMgX1hSZXBseSgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgeFJlcGx5KgkvKiByZXAgKi8sCisgICAgaW50CQkvKiBleHRyYSAqLywKKyAgICBCb29sCS8qIGRpc2NhcmQgKi8KKyk7CitleHRlcm4gdm9pZCBfWEVucSgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgeEV2ZW50KgkvKiBldmVudCAqLworKTsKK2V4dGVybiB2b2lkIF9YRGVxKAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICBfWFFFdmVudCoJLyogcHJldiAqLywKKyAgICBfWFFFdmVudCoJLyogcWVsdCAqLworKTsKKworZXh0ZXJuIEJvb2wgX1hVbmtub3duV2lyZUV2ZW50KAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICBYRXZlbnQqCS8qIHJlICovLAorICAgIHhFdmVudCoJLyogZXZlbnQgKi8KKyk7CisKK2V4dGVybiBCb29sIF9YVW5rbm93bldpcmVFdmVudENvb2tpZSgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgWEdlbmVyaWNFdmVudENvb2tpZSoJLyogcmUgKi8sCisgICAgeEV2ZW50KgkvKiBldmVudCAqLworKTsKKworZXh0ZXJuIEJvb2wgX1hVbmtub3duQ29weUV2ZW50Q29va2llKAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICBYR2VuZXJpY0V2ZW50Q29va2llKgkvKiBpbiAqLywKKyAgICBYR2VuZXJpY0V2ZW50Q29va2llKgkvKiBvdXQgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgX1hVbmtub3duTmF0aXZlRXZlbnQoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIFhFdmVudCoJLyogcmUgKi8sCisgICAgeEV2ZW50KgkvKiBldmVudCAqLworKTsKKworZXh0ZXJuIEJvb2wgX1hXaXJlVG9FdmVudChEaXNwbGF5ICpkcHksIFhFdmVudCAqcmUsIHhFdmVudCAqZXZlbnQpOworZXh0ZXJuIEJvb2wgX1hEZWZhdWx0V2lyZUVycm9yKERpc3BsYXkgKmRpc3BsYXksIFhFcnJvckV2ZW50ICpoZSwgeEVycm9yICp3ZSk7CitleHRlcm4gQm9vbCBfWFBvbGxmZENhY2hlSW5pdChEaXNwbGF5ICpkcHkpOworZXh0ZXJuIHZvaWQgX1hQb2xsZmRDYWNoZUFkZChEaXNwbGF5ICpkcHksIGludCBmZCk7CitleHRlcm4gdm9pZCBfWFBvbGxmZENhY2hlRGVsKERpc3BsYXkgKmRweSwgaW50IGZkKTsKK2V4dGVybiBYSUQgX1hBbGxvY0lEKERpc3BsYXkgKmRweSk7CitleHRlcm4gdm9pZCBfWEFsbG9jSURzKERpc3BsYXkgKmRweSwgWElEICppZHMsIGludCBjb3VudCk7CisKK2V4dGVybiBpbnQgX1hGcmVlRXh0RGF0YSgKKyAgICBYRXh0RGF0YSoJLyogZXh0ZW5zaW9uICovCispOworCitleHRlcm4gaW50ICgqWEVTZXRDcmVhdGVHQygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBleHRlbnNpb24gKi8sCisgICAgaW50ICgqKSAoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorCSAgICAgIEdDCQkJLyogZ2MgKi8sCisJICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKwkgICAgKQkJLyogcHJvYyAqLworKSkoCisgICAgRGlzcGxheSosIEdDLCBYRXh0Q29kZXMqCispOworCitleHRlcm4gaW50ICgqWEVTZXRDb3B5R0MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIGludCAoKikgKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgR0MJCQkvKiBnYyAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyAgICAgICAgICAgICkJCS8qIHByb2MgKi8KKykpKAorICAgIERpc3BsYXkqLCBHQywgWEV4dENvZGVzKgorKTsKKworZXh0ZXJuIGludCAoKlhFU2V0Rmx1c2hHQygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBleHRlbnNpb24gKi8sCisgICAgaW50ICgqKSAoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBHQwkJCS8qIGdjICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworICAgICAgICAgICAgKQkJLyogcHJvYyAqLworKSkoCisgICAgRGlzcGxheSosIEdDLCBYRXh0Q29kZXMqCispOworCitleHRlcm4gaW50ICgqWEVTZXRGcmVlR0MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIGludCAoKikgKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgR0MJCQkvKiBnYyAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyAgICAgICAgICAgICkJCS8qIHByb2MgKi8KKykpKAorICAgIERpc3BsYXkqLCBHQywgWEV4dENvZGVzKgorKTsKKworZXh0ZXJuIGludCAoKlhFU2V0Q3JlYXRlRm9udCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBleHRlbnNpb24gKi8sCisgICAgaW50ICgqKSAoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBYRm9udFN0cnVjdCoJCS8qIGZzICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworICAgICAgICAgICAgKQkJLyogcHJvYyAqLworKSkoCisgICAgRGlzcGxheSosIFhGb250U3RydWN0KiwgWEV4dENvZGVzKgorKTsKKworZXh0ZXJuIGludCAoKlhFU2V0RnJlZUZvbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIGludCAoKikgKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgWEZvbnRTdHJ1Y3QqCQkvKiBmcyAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyAgICAgICAgICAgICkJCS8qIHByb2MgKi8KKykpKAorICAgIERpc3BsYXkqLCBYRm9udFN0cnVjdCosIFhFeHRDb2RlcyoKKyk7CisKK2V4dGVybiBpbnQgKCpYRVNldENsb3NlRGlzcGxheSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBleHRlbnNpb24gKi8sCisgICAgaW50ICgqKSAoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworICAgICAgICAgICAgKQkJLyogcHJvYyAqLworKSkoCisgICAgRGlzcGxheSosIFhFeHRDb2RlcyoKKyk7CisKK2V4dGVybiBpbnQgKCpYRVNldEVycm9yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV4dGVuc2lvbiAqLywKKyAgICBpbnQgKCopICgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIHhFcnJvcioJCQkvKiBlcnIgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovLAorICAgICAgICAgICAgICBpbnQqCQkJLyogcmV0X2NvZGUgKi8KKyAgICAgICAgICAgICkJCS8qIHByb2MgKi8KKykpKAorICAgIERpc3BsYXkqLCB4RXJyb3IqLCBYRXh0Q29kZXMqLCBpbnQqCispOworCitleHRlcm4gY2hhciogKCpYRVNldEVycm9yU3RyaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV4dGVuc2lvbiAqLywKKyAgICBjaGFyKiAoKikgKAorCSAgICAgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgICAgaW50CQkJLyogY29kZSAqLywKKyAgICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLywKKyAgICAgICAgICAgICAgICBjaGFyKgkJCS8qIGJ1ZmZlciAqLywKKyAgICAgICAgICAgICAgICBpbnQJCQkvKiBuYnl0ZXMgKi8KKyAgICAgICAgICAgICAgKQkJLyogcHJvYyAqLworKSkoCisgICAgRGlzcGxheSosIGludCwgWEV4dENvZGVzKiwgY2hhciosIGludAorKTsKKworZXh0ZXJuIHZvaWQgKCpYRVNldFByaW50RXJyb3JWYWx1ZXMgKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV4dGVuc2lvbiAqLywKKyAgICB2b2lkICgqKSgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisJICAgICAgWEVycm9yRXZlbnQqCQkvKiBldiAqLywKKwkgICAgICB2b2lkKgkJCS8qIGZwICovCisJICAgICApCQkvKiBwcm9jICovCispKSgKKyAgICBEaXNwbGF5KiwgWEVycm9yRXZlbnQqLCB2b2lkKgorKTsKKworZXh0ZXJuIEJvb2wgKCpYRVNldFdpcmVUb0V2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV2ZW50X251bWJlciAqLywKKyAgICBCb29sICgqKSAoCisJICAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgIFhFdmVudCoJCQkvKiByZSAqLywKKyAgICAgICAgICAgICAgIHhFdmVudCoJCQkvKiBldmVudCAqLworICAgICAgICAgICAgICkJCS8qIHByb2MgKi8KKykpKAorICAgIERpc3BsYXkqLCBYRXZlbnQqLCB4RXZlbnQqCispOworCitleHRlcm4gQm9vbCAoKlhFU2V0V2lyZVRvRXZlbnRDb29raWUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIEJvb2wgKCopICgKKwkgICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICAgWEdlbmVyaWNFdmVudENvb2tpZSoJLyogcmUgKi8sCisgICAgICAgICAgICAgICB4RXZlbnQqCQkJLyogZXZlbnQgKi8KKyAgICAgICAgICAgICApCQkvKiBwcm9jICovCispKSgKKyAgICBEaXNwbGF5KiwgWEdlbmVyaWNFdmVudENvb2tpZSosIHhFdmVudCoKKyk7CisKK2V4dGVybiBCb29sICgqWEVTZXRDb3B5RXZlbnRDb29raWUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIEJvb2wgKCopICgKKwkgICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICAgWEdlbmVyaWNFdmVudENvb2tpZSoJLyogaW4gKi8sCisgICAgICAgICAgICAgICBYR2VuZXJpY0V2ZW50Q29va2llKgkvKiBvdXQgKi8KKyAgICAgICAgICAgICApCQkvKiBwcm9jICovCispKSgKKyAgICBEaXNwbGF5KiwgWEdlbmVyaWNFdmVudENvb2tpZSosIFhHZW5lcmljRXZlbnRDb29raWUqCispOworCisKK2V4dGVybiBTdGF0dXMgKCpYRVNldEV2ZW50VG9XaXJlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV2ZW50X251bWJlciAqLywKKyAgICBTdGF0dXMgKCopICgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIFhFdmVudCoJCQkvKiByZSAqLywKKyAgICAgICAgICAgICAgeEV2ZW50KgkJCS8qIGV2ZW50ICovCisgICAgICAgICAgICApCQkvKiBwcm9jICovCispKSgKKyAgICBEaXNwbGF5KiwgWEV2ZW50KiwgeEV2ZW50KgorKTsKKworZXh0ZXJuIEJvb2wgKCpYRVNldFdpcmVUb0Vycm9yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGVycm9yX251bWJlciAqLywKKyAgICBCb29sICgqKSAoCisJICAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKwkgICAgICAgWEVycm9yRXZlbnQqCQkvKiBoZSAqLywKKwkgICAgICAgeEVycm9yKgkJCS8qIHdlICovCisgICAgICAgICAgICApCQkvKiBwcm9jICovCispKSgKKyAgICBEaXNwbGF5KiwgWEVycm9yRXZlbnQqLCB4RXJyb3IqCispOworCitleHRlcm4gdm9pZCAoKlhFU2V0QmVmb3JlRmx1c2goCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXJyb3JfbnVtYmVyICovLAorICAgIHZvaWQgKCopICgKKwkgICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorCSAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLywKKwkgICAgICAgX1hjb25zdCBjaGFyKgkJLyogZGF0YSAqLywKKwkgICAgICAgbG9uZwkJCS8qIGxlbiAqLworICAgICAgICAgICAgKQkJLyogcHJvYyAqLworKSkoCisgICAgRGlzcGxheSosIFhFeHRDb2RlcyosIF9YY29uc3QgY2hhciosIGxvbmcKKyk7CisKKy8qIGludGVybmFsIGNvbm5lY3Rpb25zIGZvciBJTXMgKi8KKwordHlwZWRlZiB2b2lkICgqX1hJbnRlcm5hbENvbm5lY3Rpb25Qcm9jKSgKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBpbnQJCQkJLyogZmQgKi8sCisgICAgWFBvaW50ZXIJCQkvKiBjYWxsX2RhdGEgKi8KKyk7CisKKworZXh0ZXJuIFN0YXR1cyBfWFJlZ2lzdGVySW50ZXJuYWxDb25uZWN0aW9uKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIGludAkJCQkvKiBmZCAqLywKKyAgICBfWEludGVybmFsQ29ubmVjdGlvblByb2MJLyogY2FsbGJhY2sgKi8sCisgICAgWFBvaW50ZXIJCQkvKiBjYWxsX2RhdGEgKi8KKyk7CisKK2V4dGVybiB2b2lkIF9YVW5yZWdpc3RlckludGVybmFsQ29ubmVjdGlvbigKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBpbnQJCQkJLyogZmQgKi8KKyk7CisKK2V4dGVybiB2b2lkIF9YUHJvY2Vzc0ludGVybmFsQ29ubmVjdGlvbigKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBzdHJ1Y3QgX1hDb25uZWN0aW9uSW5mbyoJLyogY29ubl9pbmZvICovCispOworCisvKiBEaXNwbGF5IHN0cnVjdHVyZSBoYXMgcG9pbnRlcnMgdG8gdGhlc2UgKi8KKworc3RydWN0IF9YQ29ubmVjdGlvbkluZm8gewkvKiBpbmZvIGZyb20gX1hSZWdpc3RlckludGVybmFsQ29ubmVjdGlvbiAqLworICAgIGludCBmZDsKKyAgICBfWEludGVybmFsQ29ubmVjdGlvblByb2MgcmVhZF9jYWxsYmFjazsKKyAgICBYUG9pbnRlciBjYWxsX2RhdGE7CisgICAgWFBvaW50ZXIgKndhdGNoX2RhdGE7CS8qIHNldC91c2VkIGJ5IFhDb25uZWN0aW9uV2F0Y2hQcm9jICovCisgICAgc3RydWN0IF9YQ29ubmVjdGlvbkluZm8gKm5leHQ7Cit9OworCitzdHJ1Y3QgX1hDb25uV2F0Y2hJbmZvIHsJLyogaW5mbyBmcm9tIFhBZGRDb25uZWN0aW9uV2F0Y2ggKi8KKyAgICBYQ29ubmVjdGlvbldhdGNoUHJvYyBmbjsKKyAgICBYUG9pbnRlciBjbGllbnRfZGF0YTsKKyAgICBzdHJ1Y3QgX1hDb25uV2F0Y2hJbmZvICpuZXh0OworfTsKKworI2lmZGVmIF9fVU5JWE9TMl9fCitleHRlcm4gY2hhciogX19YT1MyUmVkaXJSb290KAorICAgIGNoYXIqCispOworI2VuZGlmCisKK2V4dGVybiBpbnQgX1hUZXh0SGVpZ2h0KAorICAgIFhGb250U3RydWN0KgkvKiBmb250X3N0cnVjdCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLworKTsKKworZXh0ZXJuIGludCBfWFRleHRIZWlnaHQxNigKKyAgICBYRm9udFN0cnVjdCoJLyogZm9udF9zdHJ1Y3QgKi8sCisgICAgX1hjb25zdCBYQ2hhcjJiKgkvKiBzdHJpbmcgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8KKyk7CisKKyNpZiBkZWZpbmVkKFdJTjMyKQorCitleHRlcm4gaW50IF9YT3BlbkZpbGUoCisgICAgX1hjb25zdCBjaGFyKgkvKiBwYXRoICovLAorICAgIGludAkJCS8qIGZsYWdzICovCispOworCitleHRlcm4gaW50IF9YT3BlbkZpbGVNb2RlKAorICAgIF9YY29uc3QgY2hhcioJLyogcGF0aCAqLywKKyAgICBpbnQJCQkvKiBmbGFncyAqLywKKyAgICBtb2RlX3QgICAgICAgICAgICAgIC8qIG1vZGUgKi8KKyk7CisKK2V4dGVybiB2b2lkKiBfWEZvcGVuRmlsZSgKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHBhdGggKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBtb2RlICovCispOworCitleHRlcm4gaW50IF9YQWNjZXNzRmlsZSgKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHBhdGggKi8KKyk7CisjZWxzZQorI2RlZmluZSBfWE9wZW5GaWxlKHBhdGgsZmxhZ3MpIG9wZW4ocGF0aCxmbGFncykKKyNkZWZpbmUgX1hPcGVuRmlsZU1vZGUocGF0aCxmbGFncyxtb2RlKSBvcGVuKHBhdGgsZmxhZ3MsbW9kZSkKKyNkZWZpbmUgX1hGb3BlbkZpbGUocGF0aCxtb2RlKSBmb3BlbihwYXRoLG1vZGUpCisjZW5kaWYKKworLyogRXZUb1dpcmUuYyAqLworZXh0ZXJuIFN0YXR1cyBfWEV2ZW50VG9XaXJlKERpc3BsYXkgKmRweSwgWEV2ZW50ICpyZSwgeEV2ZW50ICpldmVudCk7CisKK2V4dGVybiBpbnQgX1hGODZMb2FkUXVlcnlMb2NhbGVGb250KAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBuYW1lKi8sCisgICAgWEZvbnRTdHJ1Y3QqKgkvKiB4ZnAqLywKKyAgICBGb250KgkJLyogZmlkcCAqLworKTsKKworZXh0ZXJuIHZvaWQgX1hQcm9jZXNzV2luZG93QXR0cmlidXRlcyAoCisgICAgcmVnaXN0ZXIgRGlzcGxheSAqZHB5LAorICAgIHhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzUmVxICpyZXEsCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyB2YWx1ZW1hc2ssCisgICAgcmVnaXN0ZXIgWFNldFdpbmRvd0F0dHJpYnV0ZXMgKmF0dHJpYnV0ZXMpOworCitleHRlcm4gaW50IF9YRGVmYXVsdEVycm9yKAorICAgICAgICBEaXNwbGF5ICpkcHksCisgICAgICAgIFhFcnJvckV2ZW50ICpldmVudCk7CisKK2V4dGVybiBpbnQgX1hEZWZhdWx0SU9FcnJvcigKKyAgICAgICAgRGlzcGxheSAqZHB5KTsKKworZXh0ZXJuIHZvaWQgX1hTZXRDbGlwUmVjdGFuZ2xlcyAoCisgICAgcmVnaXN0ZXIgRGlzcGxheSAqZHB5LAorICAgIEdDIGdjLAorICAgIGludCBjbGlwX3hfb3JpZ2luLCBpbnQgY2xpcF95X29yaWdpbiwKKyAgICBYUmVjdGFuZ2xlICpyZWN0YW5nbGVzLAorICAgIGludCBuLAorICAgIGludCBvcmRlcmluZyk7CisKK1N0YXR1cyBfWEdldFdpbmRvd0F0dHJpYnV0ZXMoCisgICAgcmVnaXN0ZXIgRGlzcGxheSAqZHB5LAorICAgIFdpbmRvdyB3LAorICAgIFhXaW5kb3dBdHRyaWJ1dGVzICphdHRyKTsKKworaW50IF9YUHV0QmFja0V2ZW50ICgKKyAgICByZWdpc3RlciBEaXNwbGF5ICpkcHksCisgICAgcmVnaXN0ZXIgWEV2ZW50ICpldmVudCk7CisKK2V4dGVybiBCb29sIF9YSXNFdmVudENvb2tpZSgKKyAgICAgICAgRGlzcGxheSAqZHB5LAorICAgICAgICBYRXZlbnQgKmV2KTsKKworZXh0ZXJuIHZvaWQgX1hGcmVlRXZlbnRDb29raWVzKAorICAgICAgICBEaXNwbGF5ICpkcHkpOworCitleHRlcm4gdm9pZCBfWFN0b3JlRXZlbnRDb29raWUoCisgICAgICAgIERpc3BsYXkgKmRweSwKKyAgICAgICAgWEV2ZW50ICpldik7CisKK2V4dGVybiBCb29sIF9YRmV0Y2hFdmVudENvb2tpZSgKKyAgICAgICAgRGlzcGxheSAqZHB5LAorICAgICAgICBYR2VuZXJpY0V2ZW50Q29va2llICpldik7CisKK2V4dGVybiBCb29sIF9YQ29weUV2ZW50Q29va2llKAorICAgICAgICBEaXNwbGF5ICpkcHksCisgICAgICAgIFhHZW5lcmljRXZlbnRDb29raWUgKmluLAorICAgICAgICBYR2VuZXJpY0V2ZW50Q29va2llICpvdXQpOworCisvKiBsY0ZpbGUuYyAqLworCitleHRlcm4gdm9pZCB4bG9jYWxlZGlyKAorICAgIGNoYXIgKmJ1ZiwKKyAgICBpbnQgYnVmX2xlbgorKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YMTFfWExJQklOVF9IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxvY2FsZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OTQ2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbG9jYWxlLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKworQ29weXJpZ2h0IDE5OTEsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisjaWZuZGVmIF9YMTFfWExPQ0FMRV9IXworI2RlZmluZSBfWDExX1hMT0NBTEVfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisjaW5jbHVkZSA8WDExL1hvc2RlZnMuaD4KKworI2lmbmRlZiBYX0xPQ0FMRQorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2Vsc2UKKworI2RlZmluZSBMQ19BTEwgICAgICAwCisjZGVmaW5lIExDX0NPTExBVEUgIDEKKyNkZWZpbmUgTENfQ1RZUEUgICAgMgorI2RlZmluZSBMQ19NT05FVEFSWSAzCisjZGVmaW5lIExDX05VTUVSSUMgIDQKKyNkZWZpbmUgTENfVElNRSAgICAgNQorCitfWEZVTkNQUk9UT0JFR0lOCitleHRlcm4gY2hhciAqX1hzZXRsb2NhbGUoCisgICAgaW50IC8qIGNhdGVnb3J5ICovLAorICAgIF9YY29uc3QgY2hhciogLyogbmFtZSAqLworKTsKK19YRlVOQ1BST1RPRU5ECisKKyNkZWZpbmUgc2V0bG9jYWxlIF9Yc2V0bG9jYWxlCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2VuZGlmIC8qIFhfTE9DQUxFICovCisKKyNlbmRpZiAvKiBfWDExX1hMT0NBTEVfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1htZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWG1kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4NjhiMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1htZC5oCkBAIC0wLDAgKzEsMTg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODcsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKworQ29weXJpZ2h0IDE5ODcgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgRGlnaXRhbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFhNRF9ICisjIGRlZmluZSBYTURfSCAxCisvKgorICogIFhtZC5oOiBNQUNISU5FIERFUEVOREVOVCBERUNMQVJBVElPTlMuCisgKi8KKworLyoKKyAqIFNwZWNpYWwgcGVyLW1hY2hpbmUgY29uZmlndXJhdGlvbiBmbGFncy4KKyAqLworIyBpZiBkZWZpbmVkKF9fc3VuKSAmJiBkZWZpbmVkKF9fU1ZSNCkKKyMgIGluY2x1ZGUgPHN5cy9pc2FfZGVmcy5oPiAvKiBTb2xhcmlzOiBkZWZpbmVzIF9MUDY0IGlmIG5lY2Vzc2FyeSAqLworIyBlbmRpZgorCisjIGlmIGRlZmluZWQgKF9MUDY0KSB8fCBkZWZpbmVkKF9fTFA2NF9fKSB8fCBcCisgICAgIGRlZmluZWQoX19hbHBoYSkgfHwgZGVmaW5lZChfX2FscGhhX18pIHx8IFwKKyAgICAgZGVmaW5lZChfX2lhNjRfXykgfHwgZGVmaW5lZChpYTY0KSB8fCBcCisgICAgIGRlZmluZWQoX19zcGFyYzY0X18pIHx8IFwKKyAgICAgZGVmaW5lZChfX3MzOTB4X18pIHx8IFwKKyAgICAgZGVmaW5lZChfX2FtZDY0X18pIHx8IGRlZmluZWQoYW1kNjQpIHx8IFwKKyAgICAgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQorIyAgZGVmaW5lIExPTkc2NAkJCQkvKiAzMi82NC1iaXQgYXJjaGl0ZWN0dXJlICovCisjIGVuZGlmCisKKy8qCisgKiBTdHVmZiB0byBoYW5kbGUgbGFyZ2UgYXJjaGl0ZWN0dXJlIG1hY2hpbmVzOyB0aGUgY29uc3RhbnRzIHdlcmUgZ2VuZXJhdGVkCisgKiBvbiBhIDMyLWJpdCBtYWNoaW5lIGFuZCBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHByb3RvY29sLgorICovCisjIGlmZGVmIFdPUkQ2NAorIyAgZGVmaW5lIE1VU1RDT1BZCisjIGVuZGlmIC8qIFdPUkQ2NCAqLworCisKKy8qCisgKiBEZWZpbml0aW9uIG9mIG1hY3JvIHVzZWQgdG8gc2V0IGNvbnN0YW50cyBmb3Igc2l6ZSBvZiBuZXR3b3JrIHN0cnVjdHVyZXM7CisgKiBtYWNoaW5lcyB3aXRoIHByZXByb2Nlc3NvcnMgdGhhdCBjYW4ndCBoYW5kbGUgYWxsIG9mIHRoZSBzel8gc3ltYm9scworICogY2FuIGRlZmluZSB0aGlzIG1hY3JvIHRvIGJlIHNpemVvZih4KSBpZiBhbmQgb25seSBpZiB0aGVpciBjb21waWxlciBkb2Vzbid0CisgKiBwYWQgb3V0IHN0cnVjdHVyZXMgKGVzcC4gdGhlIHhUZXh0RWx0IHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBvbmx5IHR3bworICogb25lLWJ5dGUgZmllbGRzKS4gIE5ldHdvcmsgc3RydWN0dXJlcyBzaG91bGQgYWx3YXlzIGRlZmluZSBzel9zeW1ib2xzLgorICoKKyAqIFRoZSBzel8gcHJlZml4IGlzIHVzZWQgaW5zdGVhZCBvZiBzb21ldGhpbmcgbW9yZSBkZXNjcmlwdGl2ZSBzbyB0aGF0IHRoZQorICogc3ltYm9scyBhcmUgbm8gbW9yZSB0aGFuIDMyIGNoYXJhY3RlcnMgbG9uZyAod2hpY2ggY2F1c2VzIHByb2JsZW1zIGZvciBzb21lCisgKiBjb21waWxlcnMgYW5kIHByZXByb2Nlc3NvcnMpLgorICoKKyAqIFRoZSBleHRyYSBpbmRpcmVjdGlvbiBpcyB0byBnZXQgbWFjcm8gYXJndW1lbnRzIHRvIGV4cGFuZCBjb3JyZWN0bHkgYmVmb3JlCisgKiB0aGUgY29uY2F0ZW5hdGlvbiwgcmF0aGVyIHRoYW4gYWZ0ZXJ3YXJkLgorICovCisjIGRlZmluZSBfU0laRU9GKHgpIHN6XyMjeAorIyBkZWZpbmUgU0laRU9GKHgpIF9TSVpFT0YoeCkKKworLyoKKyAqIEJpdGZpZWxkIHN1ZmZpeGVzIGZvciB0aGUgcHJvdG9jb2wgc3RydWN0dXJlIGVsZW1lbnRzLCBpZiB5b3UKKyAqIG5lZWQgdGhlbS4gIE5vdGUgdGhhdCBiaXRmaWVsZHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIHNpZ25lZAorICogKG9yIGV2ZW4gdW5zaWduZWQpIGFjY29yZGluZyB0byBBTlNJIEMuCisgKi8KKyMgaWZkZWYgV09SRDY0Cit0eXBlZGVmIGxvbmcgSU5UNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQ0FSRDY0OworIyAgZGVmaW5lIEIzMiA6MzIKKyMgIGRlZmluZSBCMTYgOjE2CisjICBpZmRlZiBVTlNJR05FREJJVEZJRUxEUwordHlwZWRlZiB1bnNpZ25lZCBpbnQgSU5UMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBJTlQxNjsKKyMgIGVsc2UKK3R5cGVkZWYgc2lnbmVkIGludCBJTlQzMjsKK3R5cGVkZWYgc2lnbmVkIGludCBJTlQxNjsKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBCMzIKKyMgIGRlZmluZSBCMTYKKyMgIGlmZGVmIExPTkc2NAordHlwZWRlZiBsb25nIElOVDY0OwordHlwZWRlZiBpbnQgSU5UMzI7CisjICBlbHNlCit0eXBlZGVmIGxvbmcgSU5UMzI7CisjICBlbmRpZgordHlwZWRlZiBzaG9ydCBJTlQxNjsKKyMgZW5kaWYKKwordHlwZWRlZiBzaWduZWQgY2hhciAgICBJTlQ4OworCisjIGlmZGVmIExPTkc2NAordHlwZWRlZiB1bnNpZ25lZCBsb25nIENBUkQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IENBUkQzMjsKKyMgZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIENBUkQzMjsKKyMgZW5kaWYKKyMgaWYgIWRlZmluZWQoV09SRDY0KSAmJiAhZGVmaW5lZChMT05HNjQpCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBDQVJENjQ7CisjIGVuZGlmCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IENBUkQxNjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgQ0FSRDg7CisKK3R5cGVkZWYgQ0FSRDMyCQlCSVRTMzI7Cit0eXBlZGVmIENBUkQxNgkJQklUUzE2OworCit0eXBlZGVmIENBUkQ4CQlCWVRFOwordHlwZWRlZiBDQVJEOAkJQk9PTDsKKworLyoKKyAqIGRlZmluaXRpb25zIGZvciBzaWduLWV4dGVuZGluZyBiaXRmaWVsZHMgb24gNjQtYml0IGFyY2hpdGVjdHVyZXMKKyAqLworIyBpZiBkZWZpbmVkKFdPUkQ2NCkgJiYgZGVmaW5lZChVTlNJR05FREJJVEZJRUxEUykKKyMgIGRlZmluZSBjdnRJTlQ4dG9JbnQodmFsKSAgICgoKHZhbCkgJiAweDAwMDAwMDgwKSA/ICgodmFsKSB8IDB4ZmZmZmZmZmZmZmZmZmYwMCkgOiAodmFsKSkKKyMgIGRlZmluZSBjdnRJTlQxNnRvSW50KHZhbCkgICgoKHZhbCkgJiAweDAwMDA4MDAwKSA/ICgodmFsKSB8IDB4ZmZmZmZmZmZmZmZmMDAwMCkgOiAodmFsKSkKKyMgIGRlZmluZSBjdnRJTlQzMnRvSW50KHZhbCkgICgoKHZhbCkgJiAweDgwMDAwMDAwKSA/ICgodmFsKSB8IDB4ZmZmZmZmZmYwMDAwMDAwMCkgOiAodmFsKSkKKyMgIGRlZmluZSBjdnRJTlQ4dG9TaG9ydCh2YWwpICBjdnRJTlQ4dG9JbnQodmFsKQorIyAgZGVmaW5lIGN2dElOVDE2dG9TaG9ydCh2YWwpIGN2dElOVDE2dG9JbnQodmFsKQorIyAgZGVmaW5lIGN2dElOVDMydG9TaG9ydCh2YWwpIGN2dElOVDMydG9JbnQodmFsKQorIyAgZGVmaW5lIGN2dElOVDh0b0xvbmcodmFsKSAgY3Z0SU5UOHRvSW50KHZhbCkKKyMgIGRlZmluZSBjdnRJTlQxNnRvTG9uZyh2YWwpIGN2dElOVDE2dG9JbnQodmFsKQorIyAgZGVmaW5lIGN2dElOVDMydG9Mb25nKHZhbCkgY3Z0SU5UMzJ0b0ludCh2YWwpCisjIGVsc2UKKyMgIGRlZmluZSBjdnRJTlQ4dG9JbnQodmFsKSAodmFsKQorIyAgZGVmaW5lIGN2dElOVDE2dG9JbnQodmFsKSAodmFsKQorIyAgZGVmaW5lIGN2dElOVDMydG9JbnQodmFsKSAodmFsKQorIyAgZGVmaW5lIGN2dElOVDh0b1Nob3J0KHZhbCkgKHZhbCkKKyMgIGRlZmluZSBjdnRJTlQxNnRvU2hvcnQodmFsKSAodmFsKQorIyAgZGVmaW5lIGN2dElOVDMydG9TaG9ydCh2YWwpICh2YWwpCisjICBkZWZpbmUgY3Z0SU5UOHRvTG9uZyh2YWwpICh2YWwpCisjICBkZWZpbmUgY3Z0SU5UMTZ0b0xvbmcodmFsKSAodmFsKQorIyAgZGVmaW5lIGN2dElOVDMydG9Mb25nKHZhbCkgKHZhbCkKKyMgZW5kaWYgLyogV09SRDY0IGFuZCBVTlNJR05FREJJVEZJRUxEUyAqLworCisKKworIyBpZmRlZiBNVVNUQ09QWQorLyoKKyAqIFRoaXMgbWFjcm8gbXVzdCBub3QgY2FzdCBvciBlbHNlIHBvaW50ZXJzIHdpbGwgZ2V0IGFsaWduZWQgYW5kIGJlIHdyb25nCisgKi8KKyMgIGRlZmluZSBORVhUUFRSKHAsdCkgICgoKGNoYXIgKikgcCkgKyBTSVpFT0YodCkpCisjIGVsc2UgLyogZWxzZSBub3QgTVVTVENPUFksIHRoaXMgaXMgdXNlZCBmb3IgMzItYml0IG1hY2hpbmVzICovCisvKgorICogdGhpcyB2ZXJzaW9uIHNob3VsZCBsZWF2ZSByZXN1bHQgb2YgdHlwZSAodCAqKSwgYnV0IHRoYXQgc2hvdWxkIG9ubHkgYmUKKyAqIHVzZWQgd2hlbiBub3QgaW4gTVVTVENPUFkKKyAqLworIyAgZGVmaW5lIE5FWFRQVFIocCx0KSAoKCh0ICopKHApKSArIDEpCisjIGVuZGlmIC8qIE1VU1RDT1BZIC0gdXNlZCBtYWNoaW5lcyB3aG9zZSBDIHN0cnVjdHMgZG9uJ3QgbGluZSB1cCB3aXRoIHByb3RvICovCisKKyNlbmRpZiAvKiBYTURfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWG9zLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDY3MTZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWG9zLmgKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKgorQ29weXJpZ2h0IDE5ODcsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisgKgorICogVGhlIFggV2luZG93IFN5c3RlbSBpcyBhIFRyYWRlbWFyayBvZiBUaGUgT3BlbiBHcm91cC4KKyAqCisgKi8KKworLyogVGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHRvIHRyeSBhbmQgbWluaW1pemUgc3lzdGVtIGRlcGVuZGVuY2llcworICogaW4gYSAic2lnbmlmaWNhbnQiIG51bWJlciBvZiBzb3VyY2UgZmlsZXMuCisgKi8KKworI2lmbmRlZiBfWE9TX0hfCisjIGRlZmluZSBfWE9TX0hfCisKKyMgaW5jbHVkZSA8WDExL1hvc2RlZnMuaD4KKworLyoKKyAqIEdldCBtYWpvciBkYXRhIHR5cGVzIChlc3AuIGNhZGRyX3QpCisgKi8KKworIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworIyBpZiBkZWZpbmVkKF9fU0NPX18pIHx8IGRlZmluZWQoX19VTklYV0FSRV9fKQorIyAgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGVuZGlmCisKKworLyoKKyAqIEp1c3QgYWJvdXQgZXZlcnlvbmUgbmVlZHMgdGhlIHN0cmluZ3Mgcm91dGluZXMuICBXZSBwcm92aWRlIGJvdGggZm9ybXMgaGVyZSwKKyAqIGluZGV4L3JpbmRleCBhbmQgc3RyY2hyL3N0cnJjaHIsIHNvIGFueSBzeXN0ZW1zIHRoYXQgZG9uJ3QgcHJvdmlkZSB0aGVtIGFsbAorICogbmVlZCB0byBoYXZlICNkZWZpbmVzIGhlcmUuCisgKgorICogVGhlc2UgbWFjcm9zIGFyZSBkZWZpbmVkIHRoaXMgd2F5LCByYXRoZXIgdGhhbiwgZS5nLjoKKyAqICAgICNkZWZpbmVkIGluZGV4KHMsYykgc3RyY2hyKHMsYykKKyAqIGJlY2F1c2Ugc29tZW9uZSBtaWdodCBiZSB1c2luZyB0aGVtIGFzIGZ1bmN0aW9uIHBvaW50ZXJzLCBhbmQgc3VjaAorICogYSBjaGFuZ2Ugd291bGQgYnJlYWsgY29tcGF0aWJpbGl0eSBmb3IgYW55b25lIHdobydzIHJlbHlpbmcgb24gdGhlbQorICogYmVpbmcgdGhlIHdheSB0aGV5IGN1cnJlbnRseSBhcmUuIFNvIHdlJ3JlIHN0dWNrIHdpdGggdGhlbSB0aGlzIHdheSwKKyAqIHdoaWNoIGNhbiBiZSByZWFsbHkgaW5jb252ZW5pZW50LiA6LSgKKyAqLworCisjIGluY2x1ZGUgPHN0cmluZy5oPgorIyBpZiBkZWZpbmVkKF9fU0NPX18pIHx8IGRlZmluZWQoX19VTklYV0FSRV9fKSB8fCBkZWZpbmVkKF9fc3VuKQorIyAgaW5jbHVkZSA8c3RyaW5ncy5oPgorIyBlbHNlCisjICBpZm5kZWYgaW5kZXgKKyMgICBkZWZpbmUgaW5kZXgocyxjKSAoc3RyY2hyKChzKSwoYykpKQorIyAgZW5kaWYKKyMgIGlmbmRlZiByaW5kZXgKKyMgICBkZWZpbmUgcmluZGV4KHMsYykgKHN0cnJjaHIoKHMpLChjKSkpCisjICBlbmRpZgorIyBlbmRpZgorCisvKgorICogR2V0IG9wZW4oMikgY29uc3RhbnRzCisgKi8KKyMgaWYgZGVmaW5lZChYX05PVF9QT1NJWCkKKyMgIGluY2x1ZGUgPGZjbnRsLmg+CisjICBpZiBkZWZpbmVkKFVTTCkgfHwgZGVmaW5lZChfX2kzODZfXykgJiYgKGRlZmluZWQoU1lTVikgfHwgZGVmaW5lZChTVlI0KSkKKyMgICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgIGVuZGlmCisjICBpZmRlZiBXSU4zMgorIyAgIGluY2x1ZGUgPFgxMS9YdzMyZGVmcy5oPgorIyAgZWxzZQorIyAgIGluY2x1ZGUgPHN5cy9maWxlLmg+CisjICBlbmRpZgorIyBlbHNlIC8qIFhfTk9UX1BPU0lYICovCisjICBpbmNsdWRlIDxmY250bC5oPgorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmIC8qIFhfTk9UX1BPU0lYIGVsc2UgKi8KKworLyoKKyAqIEdldCBzdHJ1Y3QgdGltZXZhbCBhbmQgc3RydWN0IHRtCisgKi8KKworIyBpZiBkZWZpbmVkKF9QT1NJWF9TT1VSQ0UpICYmIGRlZmluZWQoU1ZSNCkKKy8qIG5lZWQgdG8gb21pdCBfUE9TSVhfU09VUkNFIGluIG9yZGVyIHRvIGdldCB3aGF0IHdlIHdhbnQgaW4gU1ZSNCAqLworIyAgdW5kZWYgX1BPU0lYX1NPVVJDRQorIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgIGRlZmluZSBfUE9TSVhfU09VUkNFCisjIGVsaWYgZGVmaW5lZChXSU4zMikKKyMgIGluY2x1ZGUgPHRpbWUuaD4KKyMgIGlmICFkZWZpbmVkKF9XSU5TT0NLQVBJXykgJiYgIWRlZmluZWQoX1dJTExXSU5TT0NLXykgJiYgIWRlZmluZWQoX1RJTUVWQUxfREVGSU5FRCkgJiYgIWRlZmluZWQoX1NUUlVDVF9USU1FVkFMKQorc3RydWN0IHRpbWV2YWwgeworICAgIGxvbmcgICAgdHZfc2VjOyAgICAgICAgIC8qIHNlY29uZHMgKi8KKyAgICBsb25nICAgIHR2X3VzZWM7ICAgICAgICAvKiBhbmQgbWljcm9zZWNvbmRzICovCit9OworIyAgIGRlZmluZSBfVElNRVZBTF9ERUZJTkVECisjICBlbmRpZgorIyAgaW5jbHVkZSA8c3lzL3RpbWViLmg+CisjICBkZWZpbmUgZ2V0dGltZW9mZGF5KHQpIFwKK3sgXAorICAgIHN0cnVjdCBfdGltZWIgX2d0b2R0bXA7IFwKKyAgICBfZnRpbWUgKCZfZ3RvZHRtcCk7IFwKKyAgICAodCktPnR2X3NlYyA9IF9ndG9kdG1wLnRpbWU7IFwKKyAgICAodCktPnR2X3VzZWMgPSBfZ3RvZHRtcC5taWxsaXRtICogMTAwMDsgXAorfQorIyBlbHNlCisjICBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyAgaW5jbHVkZSA8dGltZS5oPgorIyBlbmRpZiAvKiBkZWZpbmVkKF9QT1NJWF9TT1VSQ0UpICYmIGRlZmluZWQoU1ZSNCkgKi8KKworLyogZGVmaW5lIFhfR0VUVElNRU9GREFZIG1hY3JvLCBhIHBvcnRhYmxlIGdldHRpbWVvZmRheSgpICovCisjIGlmIGRlZmluZWQoX1hPUEVOX1hQRzQpIHx8IGRlZmluZWQoX1hPUEVOX1VOSVgpIC8qIF9YT1BFTl9VTklYIGlzIFhQRzQuMiAqLworIyAgZGVmaW5lIFhfR0VUVElNRU9GREFZKHQpIGdldHRpbWVvZmRheSh0LCAoc3RydWN0IHRpbWV6b25lKikwKQorIyBlbHNlCisjICBpZiBkZWZpbmVkKFNWUjQpIHx8IGRlZmluZWQoX19TVlI0KSB8fCBkZWZpbmVkKFdJTjMyKQorIyAgIGRlZmluZSBYX0dFVFRJTUVPRkRBWSh0KSBnZXR0aW1lb2ZkYXkodCkKKyMgIGVsc2UKKyMgICBkZWZpbmUgWF9HRVRUSU1FT0ZEQVkodCkgZ2V0dGltZW9mZGF5KHQsIChzdHJ1Y3QgdGltZXpvbmUqKTApCisjICBlbmRpZgorIyBlbmRpZiAvKiBYUEc0IGVsc2UgKi8KKworCisjIGlmZGVmIF9fR05VX18KKyMgIGRlZmluZSBQQVRIX01BWCA0MDk2CisjICBkZWZpbmUgTUFYUEFUSExFTiA0MDk2CisjICBkZWZpbmUgT1BFTl9NQVggMjU2IC8qIFdlIGRlZmluZSBhIHJlYXNvbmFibGUgbGltaXQuICAqLworIyBlbmRpZgorCisvKiB1c2UgUE9TSVggbmFtZSBmb3Igc2lnbmFsICovCisjIGlmIGRlZmluZWQoWF9OT1RfUE9TSVgpICYmIGRlZmluZWQoU1lTVikgJiYgIWRlZmluZWQoU0lHQ0hMRCkKKyMgIGRlZmluZSBTSUdDSExEIFNJR0NMRAorIyBlbmRpZgorCisjIGluY2x1ZGUgPFgxMS9YYXJjaC5oPgorCisjZW5kaWYgLyogX1hPU19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWG9zX3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hvc19yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2M2I2NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hvc19yLmgKQEAgLTAsMCArMSwxMDk1IEBACisvKgorQ29weXJpZ2h0IDE5OTYsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisqLworCisvKgorICogVmFyaW91cyBhbmQgc3VuZHJ5IFRocmVhZC1TYWZlIGZ1bmN0aW9ucyB1c2VkIGJ5IFgxMSwgTW90aWYsIGFuZCBDREUuCisgKgorICogVXNlIHRoaXMgZmlsZSBpbiBNVC1zYWZlIGNvZGUgd2hlcmUgeW91IHdvdWxkIGhhdmUgaW5jbHVkZWQKKyAqCTxkaXJlbnQuaD4JZm9yIHJlYWRkaXIoKQorICoJPGdycC5oPgkJZm9yIGdldGdyZ2lkKCkgb3IgZ2V0Z3JuYW0oKQorICoJPG5ldGRiLmg+CWZvciBnZXRob3N0YnluYW1lKCksIGdldGhvc3RieWFkZHIoKSwgb3IgZ2V0c2VydmJ5bmFtZSgpCisgKgk8cHdkLmg+CQlmb3IgZ2V0cHduYW0oKSBvciBnZXRwd3VpZCgpCisgKgk8c3RyaW5nLmg+CWZvciBzdHJ0b2soKQorICoJPHRpbWUuaD4JZm9yIGFzY3RpbWUoKSwgY3RpbWUoKSwgbG9jYWx0aW1lKCksIG9yIGdtdGltZSgpCisgKgk8dW5pc3RkLmg+CWZvciBnZXRsb2dpbigpIG9yIHR0eW5hbWUoKQorICogb3IgdGhlaXIgdGhyZWFkLXNhZmUgYW5hbG9ncy4KKyAqCisgKiBJZiB5b3UgYXJlIG9uIGEgcGxhdGZvcm0gdGhhdCBkZWZpbmVzIFhUSFJFQURTIGJ1dCBkb2VzIG5vdCBoYXZlCisgKiBNVC1zYWZlIHN5c3RlbSBBUEkgKGUuZy4gVW5peFdhcmUpIHlvdSBtdXN0IGRlZmluZSBfWG9zX3Byb2Nlc3NMb2NrCisgKiBhbmQgX1hvc19wcm9jZXNzVW5sb2NrIG1hY3JvcyBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyLgorICoKKyAqIEZvciBjb252ZW5pZW5jZSBYT1NfVVNFX1hMSUJfTE9DS0lORyBvciBYT1NfVVNFX1hUX0xPQ0tJTkcgbWF5IGJlIGRlZmluZWQKKyAqIHRvIG9idGFpbiBlaXRoZXIgWGxpYi1vbmx5IG9yIFh0LWJhc2VkIHZlcnNpb25zIG9mIHRoZXNlIG1hY3Jvcy4gIFRoZXNlCisgKiBtYWNyb3Mgd29uJ3QgcmVzdWx0IGluIHRydWx5IHRocmVhZC1zYWZlIGNhbGxzLCBidXQgdGhleSBhcmUgYmV0dGVyIHRoYW4KKyAqIG5vdGhpbmcuICBJZiB5b3UgZG8gbm90IHdhbnQgbG9ja2luZyBpbiB0aGlzIHNpdHVhdGlvbiBkZWZpbmUKKyAqIFhPU19VU0VfTk9fTE9DS0lORy4KKyAqCisgKiBOT1RFOiBPbiBzeXN0ZW1zIGxhY2tpbmcgYXBwcm9wcmlhdGUgX3IgZnVuY3Rpb25zIEdldGhvc3RieW5hbWUoKSwKKyAqCUdldGhvc3RieWFkZHIoKSwgYW5kIEdldHNlcnZieW5hbWUoKSBkbyBOT1QgY29weSB0aGUgaG9zdCBvcgorICoJcHJvdG9jb2wgbGlzdHMhCisgKgorICogTk9URTogT24gc3lzdGVtcyBsYWNraW5nIGFwcHJvcHJpYXRlIF9yIGZ1bmN0aW9ucyBHZXRncmdpZCgpIGFuZAorICoJR2V0Z3JuYW0oKSBkbyBOT1QgY29weSB0aGUgbGlzdCBvZiBncm91cCBtZW1iZXJzIQorICoKKyAqIFRoaXMgaGVhZGVyIGlzIG5vbWluYWxseSBpbnRlbmRlZCB0byBzaW1wbGlmeSBwb3J0aW5nIFgxMSwgTW90aWYsIGFuZAorICogQ0RFOyBpdCBtYXkgYmUgdXNlZnVsIHRvIG90aGVyIHBlb3BsZSB0b28uICBUaGUgc3RydWN0dXJlIGJlbG93IGlzCisgKiBjb21wbGljYXRlZCwgbW9zdGx5IGJlY2F1c2UgUDEwMDMuMWMgKHRoZSBJRUVFIFBPU0lYIFRocmVhZHMgc3BlYykKKyAqIHdlbnQgdGhyb3VnaCBsb3RzIG9mIGRyYWZ0cywgYW5kIHNvbWUgdmVuZG9ycyBzaGlwcGVkIHN5c3RlbXMgYmFzZWQKKyAqIG9uIGRyYWZ0IEFQSSB0aGF0IHdlcmUgY2hhbmdlZCBsYXRlci4gIFVuZm9ydHVuYXRlbHkgUE9TSVggZGlkIG5vdAorICogcHJvdmlkZSBhIGZlYXR1cmUtdGVzdCBtYWNybyBmb3IgZGlzdGluZ3Vpc2hpbmcgZWFjaCBvZiB0aGUgZHJhZnRzLgorICovCisKKy8qCisgKiBUaGlzIGhlYWRlciBoYXMgc2V2ZXJhbCBwYXJ0cy4gIFNlYXJjaCBmb3IgIkVmZmVjdGl2ZSBwcm90b3R5cGVzIgorICogdG8gbG9jYXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBzZWN0aW9uLgorICovCisKKy8qIFRoaXMgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCBkZWZpbmVzISAqLworI2lmbmRlZiBfWE9TX1JfSF8KKyMgZGVmaW5lIF9YT1NfUl9IXworCisjIGluY2x1ZGUgPFgxMS9Yb3MuaD4KKyMgaW5jbHVkZSA8WDExL1hmdW5jcy5oPgorCisjIGlmbmRlZiBYX05PVF9QT1NJWAorIyAgaWZkZWYgX1BPU0lYX1NPVVJDRQorIyAgIGluY2x1ZGUgPGxpbWl0cy5oPgorIyAgZWxzZQorIyAgIGRlZmluZSBfUE9TSVhfU09VUkNFCisjICAgaW5jbHVkZSA8bGltaXRzLmg+CisjICAgdW5kZWYgX1BPU0lYX1NPVVJDRQorIyAgZW5kaWYKKyMgIGlmbmRlZiBMSU5FX01BWAorIyAgIGRlZmluZSBYX0xJTkVfTUFYIDIwNDgKKyMgIGVsc2UKKyMgICBkZWZpbmUgWF9MSU5FX01BWCBMSU5FX01BWAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZiAvKiBfWE9TX1JfSCAqLworCisjaWZuZGVmIFdJTjMyCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworIyBpZiBkZWZpbmVkKFhPU19VU0VfWExJQl9MT0NLSU5HKQorIyAgaWZuZGVmIFhBbGxvY0lEcyAvKiBYbGliaW50LmggZG9lcyBub3QgaGF2ZSBtdWx0aXBsZSBpbmNsdWRlIHByb3RlY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IF9Mb2NrSW5mb1JlYyAqTG9ja0luZm9QdHI7CitleHRlcm4gTG9ja0luZm9QdHIgX1hnbG9iYWxfbG9jazsKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hvc19pc1RocmVhZEluaXRpYWxpemVkCisjICAgZGVmaW5lIF9Yb3NfaXNUaHJlYWRJbml0aWFsaXplZAkoX1hnbG9iYWxfbG9jaykKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkKFhUSFJFQURTX1dBUk4pIHx8IGRlZmluZWQoWFRIUkVBRFNfRklMRV9MSU5FKQorIyAgIGlmbmRlZiBYQWxsb2NJRHMgLyogWGxpYmludC5oIGRvZXMgbm90IGhhdmUgbXVsdGlwbGUgaW5jbHVkZSBwcm90ZWN0aW9uICovCisjICAgIGluY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CS8qIGZvciBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzICovCitleHRlcm4gdm9pZCAoKl9YTG9ja011dGV4X2ZuKSgKKyMgICAgaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICAgIExvY2tJbmZvUHRyCS8qIGxvY2sgKi8sIGNoYXIgKiAvKiBmaWxlICovLCBpbnQgLyogbGluZSAqLworIyAgICBlbmRpZgorKTsKK2V4dGVybiB2b2lkICgqX1hVbmxvY2tNdXRleF9mbikoCisjICAgIGlmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKyAgICBMb2NrSW5mb1B0cgkvKiBsb2NrICovLCBjaGFyICogLyogZmlsZSAqLywgaW50IC8qIGxpbmUgKi8KKyMgICAgZW5kaWYKKyk7CisjICAgZW5kaWYKKyMgICBpZm5kZWYgX1hvc19wcm9jZXNzTG9jaworIyAgICBkZWZpbmUgX1hvc19wcm9jZXNzTG9jawlcCisgIChfWExvY2tNdXRleF9mbiA/ICgqX1hMb2NrTXV0ZXhfZm4pKF9YZ2xvYmFsX2xvY2ssX19GSUxFX18sX19MSU5FX18pIDogMCkKKyMgICBlbmRpZgorIyAgIGlmbmRlZiBfWG9zX3Byb2Nlc3NVbmxvY2sKKyMgICAgZGVmaW5lIF9Yb3NfcHJvY2Vzc1VubG9jawlcCisgIChfWFVubG9ja011dGV4X2ZuID8gKCpfWFVubG9ja011dGV4X2ZuKShfWGdsb2JhbF9sb2NrLF9fRklMRV9fLF9fTElORV9fKSA6IDApCisjICAgZW5kaWYKKyMgIGVsc2UKKyMgICBpZm5kZWYgWEFsbG9jSURzIC8qIFhsaWJpbnQuaCBkb2VzIG5vdCBoYXZlIG11bHRpcGxlIGluY2x1ZGUgcHJvdGVjdGlvbiAqLworIyAgICBpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgkvKiBmb3IgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcyAqLworZXh0ZXJuIHZvaWQgKCpfWExvY2tNdXRleF9mbikoCisjICAgIGlmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKyAgICBMb2NrSW5mb1B0cgkvKiBsb2NrICovCisjICAgIGVuZGlmCispOworZXh0ZXJuIHZvaWQgKCpfWFVubG9ja011dGV4X2ZuKSgKKyMgICAgaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICAgIExvY2tJbmZvUHRyCS8qIGxvY2sgKi8KKyMgICAgZW5kaWYKKyk7CisjICAgZW5kaWYKKyMgICBpZm5kZWYgX1hvc19wcm9jZXNzTG9jaworIyAgICBkZWZpbmUgX1hvc19wcm9jZXNzTG9jawlcCisgIChfWExvY2tNdXRleF9mbiA/ICgoKl9YTG9ja011dGV4X2ZuKShfWGdsb2JhbF9sb2NrKSwgMCkgOiAwKQorIyAgIGVuZGlmCisjICAgaWZuZGVmIF9Yb3NfcHJvY2Vzc1VubG9jaworIyAgICBkZWZpbmUgX1hvc19wcm9jZXNzVW5sb2NrCVwKKyAgKF9YVW5sb2NrTXV0ZXhfZm4gPyAoKCpfWFVubG9ja011dGV4X2ZuKShfWGdsb2JhbF9sb2NrKSwgMCkgOiAwKQorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbGlmIGRlZmluZWQoWE9TX1VTRV9YVF9MT0NLSU5HKQorIyAgaWZuZGVmIF9YdFRocmVhZHNJX2gKK2V4dGVybiB2b2lkICgqX1h0UHJvY2Vzc0xvY2spKHZvaWQpOworIyAgZW5kaWYKKyMgIGlmbmRlZiBfWHRpbnRyaW5zaWNQX2gKKyMgICBpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgkvKiBmb3IgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcyAqLworZXh0ZXJuIHZvaWQgWHRQcm9jZXNzTG9jaygKKyMgICBpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCisgICAgdm9pZAorIyAgIGVuZGlmCispOworZXh0ZXJuIHZvaWQgWHRQcm9jZXNzVW5sb2NrKAorIyAgIGlmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKyAgICB2b2lkCisjICAgZW5kaWYKKyk7CisjICBlbmRpZgorIyAgaWZuZGVmIF9Yb3NfaXNUaHJlYWRJbml0aWFsaXplZAorIyAgIGRlZmluZSBfWG9zX2lzVGhyZWFkSW5pdGlhbGl6ZWQJX1h0UHJvY2Vzc0xvY2sKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hvc19wcm9jZXNzTG9jaworIyAgIGRlZmluZSBfWG9zX3Byb2Nlc3NMb2NrCQlYdFByb2Nlc3NMb2NrKCkKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hvc19wcm9jZXNzVW5sb2NrCisjICAgZGVmaW5lIF9Yb3NfcHJvY2Vzc1VubG9jawkJWHRQcm9jZXNzVW5sb2NrKCkKKyMgIGVuZGlmCisjIGVsaWYgZGVmaW5lZChYT1NfVVNFX05PX0xPQ0tJTkcpCisjICBpZm5kZWYgX1hvc19pc1RocmVhZEluaXRpYWxpemVkCisjICAgZGVmaW5lIF9Yb3NfaXNUaHJlYWRJbml0aWFsaXplZAkwCisjICBlbmRpZgorIyAgaWZuZGVmIF9Yb3NfcHJvY2Vzc0xvY2sKKyMgICBkZWZpbmUgX1hvc19wcm9jZXNzTG9jawkJMAorIyAgZW5kaWYKKyMgIGlmbmRlZiBfWG9zX3Byb2Nlc3NVbmxvY2sKKyMgICBkZWZpbmUgX1hvc19wcm9jZXNzVW5sb2NrCQkwCisjICBlbmRpZgorIyBlbmRpZgorCisjZW5kaWYgLyogIWRlZmluZWQgV0lOMzIgKi8KKworLyoKKyAqIFNvbGFyaXMgZGVmaW5lcyB0aGUgUE9TSVggdGhyZWFkLXNhZmUgZmVhdHVyZSB0ZXN0IG1hY3JvLCBidXQKKyAqIHVzZXMgdGhlIG9sZGVyIFNWUjQgdGhyZWFkLXNhZmUgZnVuY3Rpb25zIHVubGVzcyB0aGUgUE9TSVggb25lcworICogYXJlIHNwZWNpZmljYWxseSByZXF1ZXN0ZWQuICBGaXggdGhlIGZlYXR1cmUgdGVzdCBtYWNyby4KKyAqLworI2lmIGRlZmluZWQoX19zdW4pICYmIGRlZmluZWQoX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUykgJiYgXAorCShfUE9TSVhfQ19TT1VSQ0UgLSAwIDwgMTk5NTA2TCkgJiYgIWRlZmluZWQoX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTKQorIyB1bmRlZiBfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TCisjZW5kaWYKKworLyoqKioqIDxwd2QuaD4gd3JhcHBlcnMgKioqKiovCisKKy8qCisgKiBFZmZlY3RpdmUgcHJvdG90eXBlcyBmb3IgPHB3ZC5oPiB3cmFwcGVyczoKKyAqCisgKiAjZGVmaW5lIFhfSU5DTFVERV9QV0RfSAorICogI2RlZmluZSBYT1NfVVNFXy4uLl9MT0NLSU5HCisgKiAjaW5jbHVkZSA8WDExL1hvc19yLmg+CisgKgorICogdHlwZWRlZiAuLi4gX1hnZXRwd3BhcmFtczsKKyAqCisgKiBzdHJ1Y3QgcGFzc3dkKiBfWEdldHB3bmFtKGNvbnN0IGNoYXIgKm5hbWUsIF9YZ2V0cHdwYXJhbXMpOworICogc3RydWN0IHBhc3N3ZCogX1hHZXRwd3VpZCh1aWRfdCB1aWQsIF9YZ2V0cHdwYXJhbXMpOworICovCisKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9QV0RfSCkgJiYgIWRlZmluZWQoX1hPU19JTkNMVURFRF9QV0RfSCkKKyMgaW5jbHVkZSA8cHdkLmg+CisjIGlmIGRlZmluZWQoWFVTRV9NVFNBRkVfQVBJKSB8fCBkZWZpbmVkKFhVU0VfTVRTQUZFX1BXREFQSSkKKyMgIGRlZmluZSBYT1NfVVNFX01UU0FGRV9QV0RBUEkgMQorIyBlbmRpZgorI2VuZGlmCisKKyN1bmRlZiBYX05FRURTX1BXUEFSQU1TCisjaWYgIWRlZmluZWQoWF9JTkNMVURFX1BXRF9IKSB8fCBkZWZpbmVkKF9YT1NfSU5DTFVERURfUFdEX0gpCisvKiBEbyBub3RoaW5nICovCisKKyNlbGlmICFkZWZpbmVkKFhUSFJFQURTKSAmJiAhZGVmaW5lZChYX0ZPUkNFX1VTRV9NVFNBRkVfQVBJKQorLyogVXNlIHJlZ3VsYXIsIHVuc2FmZSBBUEkuICovCisjIGlmIGRlZmluZWQoWF9OT1RfUE9TSVgpICYmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChTWVNWKQorZXh0ZXJuIHN0cnVjdCBwYXNzd2QgKmdldHB3dWlkKCksICpnZXRwd25hbSgpOworIyBlbmRpZgordHlwZWRlZiBpbnQgX1hnZXRwd3BhcmFtczsJLyogZHVtbXkgKi8KKyMgZGVmaW5lIF9YR2V0cHd1aWQodSxwKQlnZXRwd3VpZCgodSkpCisjIGRlZmluZSBfWEdldHB3bmFtKHUscCkJZ2V0cHduYW0oKHUpKQorCisjZWxpZiAhZGVmaW5lZChYT1NfVVNFX01UU0FGRV9QV0RBUEkpIHx8IGRlZmluZWQoWE5PX01UU0FGRV9QV0RBUEkpCisvKiBVbml4V2FyZSAyLjAsIG9yIG90aGVyIHN5c3RlbXMgd2l0aCB0aHJlYWQgc3VwcG9ydCBidXQgbm8gX3IgQVBJLiAqLworIyBkZWZpbmUgWF9ORUVEU19QV1BBUkFNUwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgcGFzc3dkIHB3czsKKyAgY2hhciAgIHB3YnVmWzEwMjRdOworICBzdHJ1Y3QgcGFzc3dkKiBwd3A7CisgIHNpemVfdCBsZW47Cit9IF9YZ2V0cHdwYXJhbXM7CisKKy8qCisgKiBOZXRCU0QgYW5kIEZyZWVCU0QsIGF0IGxlYXN0LCBhcmUgbWlzc2luZyBzZXZlcmFsIG9mIHRoZSB1bml4d2FyZSBwYXNzd2QKKyAqIGZpZWxkcy4KKyAqLworCisjaWYgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBcCisgICAgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX19EcmFnb25GbHlfXykKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX1hwd19jb3B5UGFzc3dkKF9YZ2V0cHdwYXJhbXMgcCkKK3sKKyAgIG1lbWNweSgmKHApLnB3cywgKHApLnB3cCwgc2l6ZW9mKHN0cnVjdCBwYXNzd2QpKTsKKworICAgKHApLnB3cy5wd19uYW1lID0gKHApLnB3YnVmOworICAgKHApLmxlbiA9IHN0cmxlbigocCkucHdwLT5wd19uYW1lKTsKKyAgIHN0cmNweSgocCkucHdzLnB3X25hbWUsIChwKS5wd3AtPnB3X25hbWUpOworCisgICAocCkucHdzLnB3X3Bhc3N3ZCA9IChwKS5wd3MucHdfbmFtZSArIChwKS5sZW4gKyAxOworICAgKHApLmxlbiA9IHN0cmxlbigocCkucHdwLT5wd19wYXNzd2QpOworICAgc3RyY3B5KChwKS5wd3MucHdfcGFzc3dkLChwKS5wd3AtPnB3X3Bhc3N3ZCk7CisKKyAgIChwKS5wd3MucHdfY2xhc3MgPSAocCkucHdzLnB3X3Bhc3N3ZCArIChwKS5sZW4gKyAxOworICAgKHApLmxlbiA9IHN0cmxlbigocCkucHdwLT5wd19jbGFzcyk7CisgICBzdHJjcHkoKHApLnB3cy5wd19jbGFzcywgKHApLnB3cC0+cHdfY2xhc3MpOworCisgICAocCkucHdzLnB3X2dlY29zID0gKHApLnB3cy5wd19jbGFzcyArIChwKS5sZW4gKyAxOworICAgKHApLmxlbiA9IHN0cmxlbigocCkucHdwLT5wd19nZWNvcyk7CisgICBzdHJjcHkoKHApLnB3cy5wd19nZWNvcywgKHApLnB3cC0+cHdfZ2Vjb3MpOworCisgICAocCkucHdzLnB3X2RpciA9IChwKS5wd3MucHdfZ2Vjb3MgKyAocCkubGVuICsgMTsKKyAgIChwKS5sZW4gPSBzdHJsZW4oKHApLnB3cC0+cHdfZGlyKTsKKyAgIHN0cmNweSgocCkucHdzLnB3X2RpciwgKHApLnB3cC0+cHdfZGlyKTsKKworICAgKHApLnB3cy5wd19zaGVsbCA9IChwKS5wd3MucHdfZGlyICsgKHApLmxlbiArIDE7CisgICAocCkubGVuID0gc3RybGVuKChwKS5wd3AtPnB3X3NoZWxsKTsKKyAgIHN0cmNweSgocCkucHdzLnB3X3NoZWxsLCAocCkucHdwLT5wd19zaGVsbCk7CisKKyAgIChwKS5wd3AgPSAmKHApLnB3czsKK30KKworI2Vsc2UKKyMgZGVmaW5lIF9YcHdfY29weVBhc3N3ZChwKSBcCisgICAobWVtY3B5KCYocCkucHdzLCAocCkucHdwLCBzaXplb2Yoc3RydWN0IHBhc3N3ZCkpLCBcCisgICAgKChwKS5wd3MucHdfbmFtZSA9IChwKS5wd2J1ZiksIFwKKyAgICAoKHApLmxlbiA9IHN0cmxlbigocCkucHdwLT5wd19uYW1lKSksIFwKKyAgICBzdHJjcHkoKHApLnB3cy5wd19uYW1lLCAocCkucHdwLT5wd19uYW1lKSwgXAorICAgICgocCkucHdzLnB3X3Bhc3N3ZCA9IChwKS5wd3MucHdfbmFtZSArIChwKS5sZW4gKyAxKSwgXAorICAgICgocCkubGVuID0gc3RybGVuKChwKS5wd3AtPnB3X3Bhc3N3ZCkpLCBcCisgICAgc3RyY3B5KChwKS5wd3MucHdfcGFzc3dkLChwKS5wd3AtPnB3X3Bhc3N3ZCksIFwKKyAgICAoKHApLnB3cy5wd19hZ2UgPSAocCkucHdzLnB3X3Bhc3N3ZCArIChwKS5sZW4gKyAxKSwgXAorICAgICgocCkubGVuID0gc3RybGVuKChwKS5wd3AtPnB3X2FnZSkpLCBcCisgICAgc3RyY3B5KChwKS5wd3MucHdfYWdlLCAocCkucHdwLT5wd19hZ2UpLCBcCisgICAgKChwKS5wd3MucHdfY29tbWVudCA9IChwKS5wd3MucHdfYWdlICsgKHApLmxlbiArIDEpLCBcCisgICAgKChwKS5sZW4gPSBzdHJsZW4oKHApLnB3cC0+cHdfY29tbWVudCkpLCBcCisgICAgc3RyY3B5KChwKS5wd3MucHdfY29tbWVudCwgKHApLnB3cC0+cHdfY29tbWVudCksIFwKKyAgICAoKHApLnB3cy5wd19nZWNvcyA9IChwKS5wd3MucHdfY29tbWVudCArIChwKS5sZW4gKyAxKSwgXAorICAgICgocCkubGVuID0gc3RybGVuKChwKS5wd3AtPnB3X2dlY29zKSksIFwKKyAgICBzdHJjcHkoKHApLnB3cy5wd19nZWNvcywgKHApLnB3cC0+cHdfZ2Vjb3MpLCBcCisgICAgKChwKS5wd3MucHdfZGlyID0gKHApLnB3cy5wd19jb21tZW50ICsgKHApLmxlbiArIDEpLCBcCisgICAgKChwKS5sZW4gPSBzdHJsZW4oKHApLnB3cC0+cHdfZGlyKSksIFwKKyAgICBzdHJjcHkoKHApLnB3cy5wd19kaXIsIChwKS5wd3AtPnB3X2RpciksIFwKKyAgICAoKHApLnB3cy5wd19zaGVsbCA9IChwKS5wd3MucHdfZGlyICsgKHApLmxlbiArIDEpLCBcCisgICAgKChwKS5sZW4gPSBzdHJsZW4oKHApLnB3cC0+cHdfc2hlbGwpKSwgXAorICAgIHN0cmNweSgocCkucHdzLnB3X3NoZWxsLCAocCkucHdwLT5wd19zaGVsbCksIFwKKyAgICAoKHApLnB3cCA9ICYocCkucHdzKSwgXAorICAgIDAgKQorI2VuZGlmCisjIGRlZmluZSBfWEdldHB3dWlkKHUscCkgXAorKCAoX1hvc19wcm9jZXNzTG9jayksIFwKKyAgKCgocCkucHdwID0gZ2V0cHd1aWQoKHUpKSkgPyBfWHB3X2NvcHlQYXNzd2QocCksIDAgOiAwKSwgXAorICAoX1hvc19wcm9jZXNzVW5sb2NrKSwgXAorICAocCkucHdwICkKKyMgZGVmaW5lIF9YR2V0cHduYW0odSxwKSBcCisoIChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAoKChwKS5wd3AgPSBnZXRwd25hbSgodSkpKSA/IF9YcHdfY29weVBhc3N3ZChwKSwgMCA6IDApLCBcCisgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgIChwKS5wd3AgKQorCisjZWxpZiAhZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKSAmJiAhZGVmaW5lZChfX0FQUExFX18pCisjIGRlZmluZSBYX05FRURTX1BXUEFSQU1TCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBwYXNzd2QgcHdzOworICBjaGFyIHB3YnVmW1hfTElORV9NQVhdOworfSBfWGdldHB3cGFyYW1zOworIyBpZiBkZWZpbmVkKF9QT1NJWF9SRUVOVFJBTlRfRlVOQ1RJT05TKSB8fCAhZGVmaW5lZChTVlI0KQorIyAgIGRlZmluZSBfWEdldHB3dWlkKHUscCkgXAorKChnZXRwd3VpZF9yKCh1KSwmKHApLnB3cywocCkucHdidWYsc2l6ZW9mKChwKS5wd2J1ZikpID09IC0xKSA/IE5VTEwgOiAmKHApLnB3cykKKyMgICBkZWZpbmUgX1hHZXRwd25hbSh1LHApIFwKKygoZ2V0cHduYW1fcigodSksJihwKS5wd3MsKHApLnB3YnVmLHNpemVvZigocCkucHdidWYpKSA9PSAtMSkgPyBOVUxMIDogJihwKS5wd3MpCisjIGVsc2UgLyogU1ZSNCAqLworIyAgZGVmaW5lIF9YR2V0cHd1aWQodSxwKSBcCisoKGdldHB3dWlkX3IoKHUpLCYocCkucHdzLChwKS5wd2J1ZixzaXplb2YoKHApLnB3YnVmKSkgPT0gTlVMTCkgPyBOVUxMIDogJihwKS5wd3MpCisjICBkZWZpbmUgX1hHZXRwd25hbSh1LHApIFwKKygoZ2V0cHduYW1fcigodSksJihwKS5wd3MsKHApLnB3YnVmLHNpemVvZigocCkucHdidWYpKSA9PSBOVUxMKSA/IE5VTEwgOiAmKHApLnB3cykKKyMgZW5kaWYgLyogU1ZSNCAqLworCisjZWxzZSAvKiBfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TICovCisjIGRlZmluZSBYX05FRURTX1BXUEFSQU1TCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBwYXNzd2QgcHdzOworICBjaGFyIHB3YnVmW1hfTElORV9NQVhdOworICBzdHJ1Y3QgcGFzc3dkKiBwd3A7Cit9IF9YZ2V0cHdwYXJhbXM7Cit0eXBlZGVmIGludCBfWGdldHB3cmV0OworIyBkZWZpbmUgX1hHZXRwd3VpZCh1LHApIFwKKygoZ2V0cHd1aWRfcigodSksJihwKS5wd3MsKHApLnB3YnVmLHNpemVvZigocCkucHdidWYpLCYocCkucHdwKSA9PSAwKSA/IFwKKyAocCkucHdwIDogTlVMTCkKKyMgZGVmaW5lIF9YR2V0cHduYW0odSxwKSBcCisoKGdldHB3bmFtX3IoKHUpLCYocCkucHdzLChwKS5wd2J1ZixzaXplb2YoKHApLnB3YnVmKSwmKHApLnB3cCkgPT0gMCkgPyBcCisgKHApLnB3cCA6IE5VTEwpCisjZW5kaWYgLyogWF9JTkNMVURFX1BXRF9IICovCisKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9QV0RfSCkgJiYgIWRlZmluZWQoX1hPU19JTkNMVURFRF9QV0RfSCkKKyMgZGVmaW5lIF9YT1NfSU5DTFVERURfUFdEX0gKKyNlbmRpZgorCisKKy8qKioqKiA8bmV0ZGIuaD4gd3JhcHBlcnMgKioqKiovCisKKy8qCisgKiBFZmZlY3RpdmUgcHJvdG90eXBlcyBmb3IgPG5ldGRiLmg+IHdyYXBwZXJzOgorICoKKyAqIE5PVEU6IE9uIHN5c3RlbXMgbGFja2luZyB0aGUgYXBwcm9wcmlhdGUgX3IgZnVuY3Rpb25zIEdldGhvc3RieW5hbWUoKSwKKyAqCUdldGhvc3RieWFkZHIoKSwgYW5kIEdldHNlcnZieW5hbWUoKSBkbyBOT1QgY29weSB0aGUgaG9zdCBvcgorICoJcHJvdG9jb2wgbGlzdHMhCisgKgorICogI2RlZmluZSBYX0lOQ0xVREVfTkVUREJfSAorICogI2RlZmluZSBYT1NfVVNFXy4uLl9MT0NLSU5HCisgKiAjaW5jbHVkZSA8WDExL1hvc19yLmg+CisgKgorICogdHlwZWRlZiAuLi4gX1hnZXRob3N0YnluYW1lcGFyYW1zOworICogdHlwZWRlZiAuLi4gX1hnZXRzZXJ2YnluYW1lcGFyYW1zOworICoKKyAqIHN0cnVjdCBob3N0ZW50KiBfWEdldGhvc3RieW5hbWUoY29uc3QgY2hhciogbmFtZSxfWGdldGhvc3RieW5hbWVwYXJhbXMpOworICogc3RydWN0IGhvc3RlbnQqIF9YR2V0aG9zdGJ5YWRkcihjb25zdCBjaGFyKiBhZGRyLCBpbnQgbGVuLCBpbnQgdHlwZSwKKyAqCQkJCSAgIF9YZ2V0aG9zdGJ5bmFtZXBhcmFtcyk7CisgKiBzdHJ1Y3Qgc2VydmVudCogX1hHZXRzZXJ2YnluYW1lKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHByb3RvLAorICoJCQkJIF9YZ2V0c2VydmJ5bmFtZXBhcmFtcyk7CisgKi8KKworI3VuZGVmIFhUSFJFQURTX05FRURTX0JZTkFNRVBBUkFNUworI2lmIGRlZmluZWQoWF9JTkNMVURFX05FVERCX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfTkVUREJfSCkgXAorICAgICYmICFkZWZpbmVkKFdJTjMyKQorIyBpbmNsdWRlIDxuZXRkYi5oPgorIyBpZiBkZWZpbmVkKFhVU0VfTVRTQUZFX0FQSSkgfHwgZGVmaW5lZChYVVNFX01UU0FGRV9ORVREQkFQSSkKKyMgIGRlZmluZSBYT1NfVVNFX01UU0FGRV9ORVREQkFQSSAxCisjIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFhfSU5DTFVERV9ORVREQl9IKSB8fCBkZWZpbmVkKF9YT1NfSU5DTFVERURfTkVUREJfSCkKKy8qIERvIG5vdGhpbmcuICovCisKKyNlbGlmICFkZWZpbmVkKFhUSFJFQURTKSAmJiAhZGVmaW5lZChYX0ZPUkNFX1VTRV9NVFNBRkVfQVBJKQorLyogVXNlIHJlZ3VsYXIsIHVuc2FmZSBBUEkuICovCit0eXBlZGVmIGludCBfWGdldGhvc3RieW5hbWVwYXJhbXM7IC8qIGR1bW15ICovCit0eXBlZGVmIGludCBfWGdldHNlcnZieW5hbWVwYXJhbXM7IC8qIGR1bW15ICovCisjIGRlZmluZSBfWEdldGhvc3RieW5hbWUoaCxocCkJCWdldGhvc3RieW5hbWUoKGgpKQorIyBkZWZpbmUgX1hHZXRob3N0YnlhZGRyKGEsYWwsdCxocCkJZ2V0aG9zdGJ5YWRkcigoYSksKGFsKSwodCkpCisjIGRlZmluZSBfWEdldHNlcnZieW5hbWUocyxwLHNwKQlnZXRzZXJ2YnluYW1lKChzKSwocCkpCisKKyNlbGlmICFkZWZpbmVkKFhPU19VU0VfTVRTQUZFX05FVERCQVBJKSB8fCBkZWZpbmVkKFhOT19NVFNBRkVfTkVUREJBUEkpCisvKiBXQVJOSU5HOiAgVGhlIGhfYWRkcl9saXN0IGFuZCBzX2FsaWFzZXMgdmFsdWVzIGFyZSAqbm90KiBjb3BpZWQhICovCisKKyNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19EcmFnb25GbHlfXykKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBob3N0ZW50IGhlbnQ7CisgIGNoYXIgICAgICAgICAgIGhfbmFtZVtNQVhIT1NUTkFNRUxFTl07CisgIHN0cnVjdCBob3N0ZW50ICpocHRyOworfSBfWGdldGhvc3RieW5hbWVwYXJhbXM7Cit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBzZXJ2ZW50IHNlbnQ7CisgIGNoYXIgICAgICAgICAgIHNfbmFtZVsyNTVdOworICBjaGFyCQkgc19wcm90b1syNTVdOworICBzdHJ1Y3Qgc2VydmVudCAqc3B0cjsKK30gX1hnZXRzZXJ2YnluYW1lcGFyYW1zOworCisjIGRlZmluZSBYVEhSRUFEU19ORUVEU19CWU5BTUVQQVJBTVMKKworIyBkZWZpbmUgX1hnX2NvcHlIb3N0ZW50KGhwKSBcCisgICAobWVtY3B5KCYoaHApLmhlbnQsIChocCkuaHB0ciwgc2l6ZW9mKHN0cnVjdCBob3N0ZW50KSksIFwKKyAgICBzdHJjcHkoKGhwKS5oX25hbWUsIChocCkuaHB0ci0+aF9uYW1lKSwgXAorICAgICgoaHApLmhlbnQuaF9uYW1lID0gKGhwKS5oX25hbWUpLCBcCisgICAgKChocCkuaHB0ciA9ICYoaHApLmhlbnQpLCBcCisgICAgIDAgKQorIyBkZWZpbmUgX1hnX2NvcHlTZXJ2ZW50KHNwKSBcCisgICAobWVtY3B5KCYoc3ApLnNlbnQsIChzcCkuc3B0ciwgc2l6ZW9mKHN0cnVjdCBzZXJ2ZW50KSksIFwKKyAgICBzdHJjcHkoKHNwKS5zX25hbWUsIChzcCkuc3B0ci0+c19uYW1lKSwgXAorICAgICgoc3ApLnNlbnQuc19uYW1lID0gKHNwKS5zX25hbWUpLCBcCisgICAgc3RyY3B5KChzcCkuc19wcm90bywgKHNwKS5zcHRyLT5zX3Byb3RvKSwgXAorICAgICgoc3ApLnNlbnQuc19wcm90byA9IChzcCkuc19wcm90byksIFwKKyAgICAoKHNwKS5zcHRyID0gJihzcCkuc2VudCksIFwKKyAgICAwICkKKyMgZGVmaW5lIF9YR2V0aG9zdGJ5bmFtZShoLGhwKSBcCisgICAoKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICAgKCgoaHApLmhwdHIgPSBnZXRob3N0YnluYW1lKChoKSkpID8gX1hnX2NvcHlIb3N0ZW50KGhwKSA6IDApLCBcCisgICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgICAoaHApLmhwdHIgKQorIyBkZWZpbmUgX1hHZXRob3N0YnlhZGRyKGEsYWwsdCxocCkgXAorICAgKChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAgICgoKGhwKS5ocHRyID0gZ2V0aG9zdGJ5YWRkcigoYSksKGFsKSwodCkpKSA/IF9YZ19jb3B5SG9zdGVudChocCkgOiAwKSwgXAorICAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgICAgKGhwKS5ocHRyICkKKyMgZGVmaW5lIF9YR2V0c2VydmJ5bmFtZShzLHAsc3ApIFwKKyAgICgoX1hvc19wcm9jZXNzTG9jayksIFwKKyAgICAoKChzcCkuc3B0ciA9IGdldHNlcnZieW5hbWUoKHMpLChwKSkpID8gX1hnX2NvcHlTZXJ2ZW50KHNwKSA6IDApLCBcCisgICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgICAoc3ApLnNwdHIgKQorCisjZWxpZiBkZWZpbmVkKFhVU0VfTkVUREJfUl9BUEkpCisvKgorICogUE9TSVggZG9lcyBub3Qgc3BlY2lmeSBfciBlcXVpdmFsZW50cyBmb3IgPG5ldGRiLmg+IEFQSSwgYnV0IHNvbWUKKyAqIHZlbmRvcnMgcHJvdmlkZSB0aGVtIGFueXdheS4gIFVzZSB0aGVtIG9ubHkgd2hlbiBleHBsaWNpdGx5IGFza2VkLgorICovCisjIGlmZGVmIF9QT1NJWF9SRUVOVFJBTlRfRlVOQ1RJT05TCisjICBpZm5kZWYgX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUworIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUworIyAgZGVmaW5lIFhfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TIDEKKyMgZW5kaWYKKworIyBkZWZpbmUgWFRIUkVBRFNfTkVFRFNfQllOQU1FUEFSQU1TCisKKyMgaWZuZGVmIFhfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc3RydWN0IGhvc3RlbnQgICAgICBoZW50OworICAgIGNoYXIgICAgICAgICAgICAgICAgaGJ1ZltYX0xJTkVfTUFYXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGhlcnI7Cit9IF9YZ2V0aG9zdGJ5bmFtZXBhcmFtczsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzdHJ1Y3Qgc2VydmVudCAgICAgIHNlbnQ7CisgICAgY2hhciAgICAgICAgICAgICAgICBzYnVmW1hfTElORV9NQVhdOworfSBfWGdldHNlcnZieW5hbWVwYXJhbXM7CisjICBkZWZpbmUgX1hHZXRob3N0YnluYW1lKGgsaHApIFwKKyAgZ2V0aG9zdGJ5bmFtZV9yKChoKSwmKGhwKS5oZW50LChocCkuaGJ1ZixzaXplb2YoKGhwKS5oYnVmKSwmKGhwKS5oZXJyKQorIyAgZGVmaW5lIF9YR2V0aG9zdGJ5YWRkcihhLGFsLHQsaHApIFwKKyAgZ2V0aG9zdGJ5YWRkcl9yKChhKSwoYWwpLCh0KSwmKGhwKS5oZW50LChocCkuaGJ1ZixzaXplb2YoKGhwKS5oYnVmKSwmKGhwKS5oZXJyKQorIyAgZGVmaW5lIF9YR2V0c2VydmJ5bmFtZShzLHAsc3ApIFwKKyAgZ2V0c2VydmJ5bmFtZV9yKChzKSwocCksJihzcCkuc2VudCwoc3ApLnNidWYsc2l6ZW9mKChzcCkuc2J1ZikpCisjIGVsc2UKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGhvc3RlbnQgICAgICBoZW50OworICBzdHJ1Y3QgaG9zdGVudF9kYXRhIGhkYXRhOworfSBfWGdldGhvc3RieW5hbWVwYXJhbXM7Cit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBzZXJ2ZW50ICAgICAgc2VudDsKKyAgc3RydWN0IHNlcnZlbnRfZGF0YSBzZGF0YTsKK30gX1hnZXRzZXJ2YnluYW1lcGFyYW1zOworIyAgZGVmaW5lIF9YR2V0aG9zdGJ5bmFtZShoLGhwKSBcCisgIChiemVybygoY2hhciopJihocCkuaGRhdGEsc2l6ZW9mKChocCkuaGRhdGEpKSwJXAorICAgKChnZXRob3N0YnluYW1lX3IoKGgpLCYoaHApLmhlbnQsJihocCkuaGRhdGEpID09IC0xKSA/IE5VTEwgOiAmKGhwKS5oZW50KSkKKyMgIGRlZmluZSBfWEdldGhvc3RieWFkZHIoYSxhbCx0LGhwKSBcCisgIChiemVybygoY2hhciopJihocCkuaGRhdGEsc2l6ZW9mKChocCkuaGRhdGEpKSwJXAorICAgKChnZXRob3N0YnlhZGRyX3IoKGEpLChhbCksKHQpLCYoaHApLmhlbnQsJihocCkuaGRhdGEpID09IC0xKSA/IE5VTEwgOiAmKGhwKS5oZW50KSkKKyMgIGRlZmluZSBfWEdldHNlcnZieW5hbWUocyxwLHNwKSBcCisgIChiemVybygoY2hhciopJihzcCkuc2RhdGEsc2l6ZW9mKChzcCkuc2RhdGEpKSwJXAorICAgKChnZXRzZXJ2YnluYW1lX3IoKHMpLChwKSwmKHNwKS5zZW50LCYoc3ApLnNkYXRhKSA9PSAtMSkgPyBOVUxMIDogJihzcCkuc2VudCkgKQorIyBlbmRpZgorIyBpZmRlZiBYX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUworIyAgdW5kZWYgWF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMKKyMgZW5kaWYKKworI2Vsc2UKKy8qIFRoZSByZWd1bGFyIEFQSSBpcyBhc3N1bWVkIHRvIGJlIE1ULXNhZmUgdW5kZXIgUE9TSVguICovCit0eXBlZGVmIGludCBfWGdldGhvc3RieW5hbWVwYXJhbXM7IC8qIGR1bW15ICovCit0eXBlZGVmIGludCBfWGdldHNlcnZieW5hbWVwYXJhbXM7IC8qIGR1bW15ICovCisjIGRlZmluZSBfWEdldGhvc3RieW5hbWUoaCxocCkJCWdldGhvc3RieW5hbWUoKGgpKQorIyBkZWZpbmUgX1hHZXRob3N0YnlhZGRyKGEsYWwsdCxocCkJZ2V0aG9zdGJ5YWRkcigoYSksKGFsKSwodCkpCisjIGRlZmluZSBfWEdldHNlcnZieW5hbWUocyxwLHNwKQlnZXRzZXJ2YnluYW1lKChzKSwocCkpCisjZW5kaWYgLyogWF9JTkNMVURFX05FVERCX0ggKi8KKworI2lmIGRlZmluZWQoWF9JTkNMVURFX05FVERCX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfTkVUREJfSCkKKyMgZGVmaW5lIF9YT1NfSU5DTFVERURfTkVUREJfSAorI2VuZGlmCisKKworLyoqKioqIDxkaXJlbnQuaD4gd3JhcHBlcnMgKioqKiovCisKKy8qCisgKiBFZmZlY3RpdmUgcHJvdG90eXBlcyBmb3IgPGRpcmVudC5oPiB3cmFwcGVyczoKKyAqCisgKiAjZGVmaW5lIFhfSU5DTFVERV9ESVJFTlRfSAorICogI2RlZmluZSBYT1NfVVNFXy4uLl9MT0NLSU5HCisgKiAjaW5jbHVkZSA8WDExL1hvc19yLmg+CisgKgorICogdHlwZWRlZiAuLi4gX1hyZWFkZGlycGFyYW1zOworICoKKyAqIHN0cnVjdCBkaXJlbnQgKl9YUmVhZGRpcihESVIgKmRpcl9wb2ludGVyLCBfWHJlYWRkaXJwYXJhbXMpOworICovCisKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9ESVJFTlRfSCkgJiYgIWRlZmluZWQoX1hPU19JTkNMVURFRF9ESVJFTlRfSCkKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGlmICFkZWZpbmVkKFhfTk9UX1BPU0lYKSB8fCBkZWZpbmVkKFNZU1YpCisjICBpbmNsdWRlIDxkaXJlbnQuaD4KKyMgZWxzZQorIyAgaW5jbHVkZSA8c3lzL2Rpci5oPgorIyAgaWZuZGVmIGRpcmVudAorIyAgIGRlZmluZSBkaXJlbnQgZGlyZWN0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKFhVU0VfTVRTQUZFX0FQSSkgfHwgZGVmaW5lZChYVVNFX01UU0FGRV9ESVJFTlRBUEkpCisjICBkZWZpbmUgWE9TX1VTRV9NVFNBRkVfRElSRU5UQVBJIDEKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWF9JTkNMVURFX0RJUkVOVF9IKSB8fCBkZWZpbmVkKF9YT1NfSU5DTFVERURfRElSRU5UX0gpCisvKiBEbyBub3RoaW5nLiAqLworCisjZWxpZiAhZGVmaW5lZChYVEhSRUFEUykgJiYgIWRlZmluZWQoWF9GT1JDRV9VU0VfTVRTQUZFX0FQSSkKKy8qIFVzZSByZWd1bGFyLCB1bnNhZmUgQVBJLiAqLwordHlwZWRlZiBpbnQgX1hyZWFkZGlycGFyYW1zOwkvKiBkdW1teSAqLworIyBkZWZpbmUgX1hSZWFkZGlyKGQscCkJcmVhZGRpcihkKQorCisjZWxpZiAhZGVmaW5lZChYT1NfVVNFX01UU0FGRV9ESVJFTlRBUEkpIHx8IGRlZmluZWQoWE5PX01UU0FGRV9ESVJFTlRBUEkpCisvKiBTeXN0ZW1zIHdpdGggdGhyZWFkIHN1cHBvcnQgYnV0IG5vIF9yIEFQSS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGRpcmVudCAqcmVzdWx0OworICBzdHJ1Y3QgZGlyZW50IGRpcl9lbnRyeTsKKyMgaWZkZWYgX1BPU0lYX1BBVEhfTUFYCisgIGNoYXIgYnVmW19QT1NJWF9QQVRIX01BWF07CisjIGVsaWYgZGVmaW5lZChOQU1FX01BWCkKKyAgY2hhciBidWZbTkFNRV9NQVhdOworIyBlbHNlCisgIGNoYXIgYnVmWzI1NV07CisjIGVuZGlmCit9IF9YcmVhZGRpcnBhcmFtczsKKworIyBkZWZpbmUgX1hSZWFkZGlyKGQscCkJXAorICggKF9Yb3NfcHJvY2Vzc0xvY2spLAkJCQkJCSBcCisgICAoKChwKS5yZXN1bHQgPSByZWFkZGlyKChkKSkpID8JCQkJIFwKKyAgICAobWVtY3B5KCYoKHApLmRpcl9lbnRyeSksIChwKS5yZXN1bHQsIChwKS5yZXN1bHQtPmRfcmVjbGVuKSwgXAorICAgICAoKHApLnJlc3VsdCA9ICYocCkuZGlyX2VudHJ5KSwgMCkgOgkJCSBcCisgICAgMCksCQkJCQkJCQkgXAorICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksCQkJCQkgXAorICAgKHApLnJlc3VsdCApCisKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBkaXJlbnQgKnJlc3VsdDsKKyAgc3RydWN0IGRpcmVudCBkaXJfZW50cnk7CisjIGlmZGVmIF9QT1NJWF9QQVRIX01BWAorICBjaGFyIGJ1ZltfUE9TSVhfUEFUSF9NQVhdOworIyBlbGlmIGRlZmluZWQoTkFNRV9NQVgpCisgIGNoYXIgYnVmW05BTUVfTUFYXTsKKyMgZWxzZQorICBjaGFyIGJ1ZlsyNTVdOworIyBlbmRpZgorfSBfWHJlYWRkaXJwYXJhbXM7CisKKyMgaWYgZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKKy8qIFBPU0lYIGZpbmFsIEFQSSwgcmV0dXJucyAoaW50KTAgb24gc3VjY2Vzcy4gKi8KKyMgIGRlZmluZSBfWFJlYWRkaXIoZCxwKQkJCQkJCVwKKyAgICAocmVhZGRpcl9yKChkKSwgJigocCkuZGlyX2VudHJ5KSwgJigocCkucmVzdWx0KSkgPyBOVUxMIDogKHApLnJlc3VsdCkKKyMgZWxpZiBkZWZpbmVkKF9QT1NJWF9SRUVOVFJBTlRfRlVOQ1RJT05TKQorLyogUE9TSVggZHJhZnQgQVBJLCByZXR1cm5zIChpbnQpMCBvbiBzdWNjZXNzLiAqLworIyAgZGVmaW5lIF9YUmVhZGRpcihkLHApCVwKKyAgICAocmVhZGRpcl9yKChkKSwmKChwKS5kaXJfZW50cnkpKSA/IE5VTEwgOiAmKChwKS5kaXJfZW50cnkpKQorIyBlbGlmIGRlZmluZWQoU1ZSNCkKKy8qIFByZS1QT1NJWCBBUEksIHJldHVybnMgbm9uLU5VTEwgb24gc3VjY2Vzcy4gKi8KKyMgIGRlZmluZSBfWFJlYWRkaXIoZCxwKQkocmVhZGRpcl9yKChkKSwgJihwKS5kaXJfZW50cnkpKQorIyBlbHNlCisvKiBXZSBoYXZlIG5vIGlkZWEgd2hhdCBpcyBnb2luZyBvbi4gIEZha2UgaXQgYWxsIHVzaW5nIHByb2Nlc3MgbG9ja3MuICovCisjICBkZWZpbmUgX1hSZWFkZGlyKGQscCkJXAorICAgICggKF9Yb3NfcHJvY2Vzc0xvY2spLAkJCQkJCVwKKyAgICAgICgoKHApLnJlc3VsdCA9IHJlYWRkaXIoKGQpKSkgPwkJCQkJXAorICAgICAgIChtZW1jcHkoJigocCkuZGlyX2VudHJ5KSwgKHApLnJlc3VsdCwgKHApLnJlc3VsdC0+ZF9yZWNsZW4pLAlcCisJKChwKS5yZXN1bHQgPSAmKHApLmRpcl9lbnRyeSksIDApIDoJCQkJXAorICAgICAgIDApLAkJCQkJCQkJXAorICAgICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksCQkJCQkJXAorICAgICAgKHApLnJlc3VsdCApCisjIGVuZGlmCisjZW5kaWYgLyogWF9JTkNMVURFX0RJUkVOVF9IICovCisKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9ESVJFTlRfSCkgJiYgIWRlZmluZWQoX1hPU19JTkNMVURFRF9ESVJFTlRfSCkKKyMgZGVmaW5lIF9YT1NfSU5DTFVERURfRElSRU5UX0gKKyNlbmRpZgorCisKKy8qKioqKiA8dW5pc3RkLmg+IHdyYXBwZXJzICoqKioqLworCisvKgorICogRWZmZWN0aXZlIHByb3RvdHlwZXMgZm9yIDx1bmlzdGQuaD4gd3JhcHBlcnM6CisgKgorICogI2RlZmluZSBYX0lOQ0xVREVfVU5JU1REX0gKKyAqICNkZWZpbmUgWE9TX1VTRV8uLi5fTE9DS0lORworICogI2luY2x1ZGUgPFgxMS9Yb3Nfci5oPgorICoKKyAqIHR5cGVkZWYgLi4uIF9YZ2V0bG9naW5wYXJhbXM7CisgKiB0eXBlZGVmIC4uLiBfWHR0eW5hbWVwYXJhbXM7CisgKgorICogY2hhciAqX1hHZXRsb2dpbihfWGdldGxvZ2lucGFyYW1zKTsKKyAqIGNoYXIgKl9YVHR5bmFtZShpbnQsIF9YdHR5bmFtZXBhcmFtcyk7CisgKi8KKworI2lmIGRlZmluZWQoWF9JTkNMVURFX1VOSVNURF9IKSAmJiAhZGVmaW5lZChfWE9TX0lOQ0xVREVEX1VOSVNURF9IKQorLyogPHVuaXN0ZC5oPiBhbHJlYWR5IGluY2x1ZGVkIGJ5IDxYMTEvWG9zLmg+ICovCisjIGlmIGRlZmluZWQoWFVTRV9NVFNBRkVfQVBJKSB8fCBkZWZpbmVkKFhVU0VfTVRTQUZFX1VOSVNUREFQSSkKKyMgIGRlZmluZSBYT1NfVVNFX01UU0FGRV9VTklTVERBUEkgMQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChYX0lOQ0xVREVfVU5JU1REX0gpIHx8IGRlZmluZWQoX1hPU19JTkNMVURFRF9VTklTVERfSCkKKy8qIERvIG5vdGhpbmcuICovCisKKyNlbGlmICFkZWZpbmVkKFhUSFJFQURTKSAmJiAhZGVmaW5lZChYX0ZPUkNFX1VTRV9NVFNBRkVfQVBJKQorLyogVXNlIHJlZ3VsYXIsIHVuc2FmZSBBUEkuICovCit0eXBlZGVmIGludCBfWGdldGxvZ2lucGFyYW1zOwkvKiBkdW1teSAqLwordHlwZWRlZiBpbnQgX1h0dHluYW1lcGFyYW1zOwkvKiBkdW1teSAqLworIyBkZWZpbmUgX1hHZXRsb2dpbihwKQlnZXRsb2dpbigpCisjIGRlZmluZSBfWFR0eW5hbWUoZikJdHR5bmFtZSgoZikpCisKKyNlbGlmICFkZWZpbmVkKFhPU19VU0VfTVRTQUZFX1VOSVNUREFQSSkgfHwgZGVmaW5lZChYTk9fTVRTQUZFX1VOSVNUREFQSSkKKy8qIFN5c3RlbXMgd2l0aCB0aHJlYWQgc3VwcG9ydCBidXQgbm8gX3IgQVBJLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyICpyZXN1bHQ7CisjIGlmIGRlZmluZWQoTUFYTE9HTkFNRSkKKyAgY2hhciBidWZbTUFYTE9HTkFNRV07CisjIGVsaWYgZGVmaW5lZChMT0dJTl9OQU1FX01BWCkKKyAgY2hhciBidWZbTE9HSU5fTkFNRV9NQVhdOworIyBlbHNlCisgIGNoYXIgYnVmWzY0XTsKKyMgZW5kaWYKK30gX1hnZXRsb2dpbnBhcmFtczsKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciAqcmVzdWx0OworIyBpZmRlZiBUVFlfTkFNRV9NQVgKKyAgY2hhciBidWZbVFRZX05BTUVfTUFYXTsKKyMgZWxpZiBkZWZpbmVkKF9QT1NJWF9UVFlfTkFNRV9NQVgpCisgIGNoYXIgYnVmW19QT1NJWF9UVFlfTkFNRV9NQVhdOworIyBlbGlmIGRlZmluZWQoX1BPU0lYX1BBVEhfTUFYKQorICBjaGFyIGJ1ZltfUE9TSVhfUEFUSF9NQVhdOworIyBlbHNlCisgIGNoYXIgYnVmWzI1Nl07CisjIGVuZGlmCit9IF9YdHR5bmFtZXBhcmFtczsKKworIyBkZWZpbmUgX1hHZXRsb2dpbihwKSBcCisgKCAoX1hvc19wcm9jZXNzTG9jayksIFwKKyAgICgoKHApLnJlc3VsdCA9IGdldGxvZ2luKCkpID8gXAorICAgIChzdHJuY3B5KChwKS5idWYsIChwKS5yZXN1bHQsIHNpemVvZigocCkuYnVmKSksIFwKKyAgICAgKChwKS5idWZbc2l6ZW9mKChwKS5idWYpLTFdID0gJ1wwJyksIFwKKyAgICAgKChwKS5yZXN1bHQgPSAocCkuYnVmKSwgMCkgOiAwKSwgXAorICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgIChwKS5yZXN1bHQgKQorI2RlZmluZSBfWFR0eW5hbWUoZixwKSBcCisgKCAoX1hvc19wcm9jZXNzTG9jayksIFwKKyAgICgoKHApLnJlc3VsdCA9IHR0eW5hbWUoZikpID8gXAorICAgIChzdHJuY3B5KChwKS5idWYsIChwKS5yZXN1bHQsIHNpemVvZigocCkuYnVmKSksIFwKKyAgICAgKChwKS5idWZbc2l6ZW9mKChwKS5idWYpLTFdID0gJ1wwJyksIFwKKyAgICAgKChwKS5yZXN1bHQgPSAocCkuYnVmKSwgMCkgOiAwKSwgXAorICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgIChwKS5yZXN1bHQgKQorCisjZWxpZiBkZWZpbmVkKF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMpIHx8IGRlZmluZWQoX1BPU0lYX1JFRU5UUkFOVF9GVU5DVElPTlMpCisvKiBQT1NJWCBBUEkuCisgKgorICogZXh0ZXJuIGludCBnZXRsb2dpbl9yKGNoYXIgKiwgc2l6ZV90KTsKKyAqIGV4dGVybiBpbnQgdHR5bmFtZV9yKGludCwgY2hhciAqLCBzaXplX3QpOworICovCit0eXBlZGVmIHN0cnVjdCB7CisjIGlmIGRlZmluZWQoTUFYTE9HTkFNRSkKKyAgY2hhciBidWZbTUFYTE9HTkFNRV07CisjIGVsaWYgZGVmaW5lZChMT0dJTl9OQU1FX01BWCkKKyAgY2hhciBidWZbTE9HSU5fTkFNRV9NQVhdOworIyBlbHNlCisgIGNoYXIgYnVmWzY0XTsKKyMgZW5kaWYKK30gX1hnZXRsb2dpbnBhcmFtczsKK3R5cGVkZWYgc3RydWN0IHsKKyMgaWZkZWYgVFRZX05BTUVfTUFYCisgIGNoYXIgYnVmW1RUWV9OQU1FX01BWF07CisjIGVsaWYgZGVmaW5lZChfUE9TSVhfVFRZX05BTUVfTUFYKQorICBjaGFyIGJ1ZltfUE9TSVhfVFRZX05BTUVfTUFYXTsKKyMgZWxpZiBkZWZpbmVkKF9QT1NJWF9QQVRIX01BWCkKKyAgY2hhciBidWZbX1BPU0lYX1BBVEhfTUFYXTsKKyMgZWxzZQorICBjaGFyIGJ1ZlsyNTZdOworIyBlbmRpZgorfSBfWHR0eW5hbWVwYXJhbXM7CisKKyMgZGVmaW5lIF9YR2V0bG9naW4ocCkJKGdldGxvZ2luX3IoKHApLmJ1Ziwgc2l6ZW9mKChwKS5idWYpKSA/IE5VTEwgOiAocCkuYnVmKQorIyBkZWZpbmUgX1hUdHluYW1lKGYscCkJXAorCSh0dHluYW1lX3IoKGYpLCAocCkuYnVmLCBzaXplb2YoKHApLmJ1ZikpID8gTlVMTCA6IChwKS5idWYpCisKKyNlbHNlCisvKiBQcmUtUE9TSVggQVBJLgorICoKKyAqIGV4dGVybiBjaGFyICpnZXRsb2dpbl9yKGNoYXIgKiwgc2l6ZV90KTsKKyAqIGV4dGVybiBjaGFyICp0dHluYW1lX3IoaW50LCBjaGFyICosIHNpemVfdCk7CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyMgaWYgZGVmaW5lZChNQVhMT0dOQU1FKQorICBjaGFyIGJ1ZltNQVhMT0dOQU1FXTsKKyMgZWxpZiBkZWZpbmVkKExPR0lOX05BTUVfTUFYKQorICBjaGFyIGJ1ZltMT0dJTl9OQU1FX01BWF07CisjIGVsc2UKKyAgY2hhciBidWZbNjRdOworIyBlbmRpZgorfSBfWGdldGxvZ2lucGFyYW1zOwordHlwZWRlZiBzdHJ1Y3QgeworIyBpZmRlZiBUVFlfTkFNRV9NQVgKKyAgY2hhciBidWZbVFRZX05BTUVfTUFYXTsKKyMgZWxpZiBkZWZpbmVkKF9QT1NJWF9UVFlfTkFNRV9NQVgpCisgIGNoYXIgYnVmW19QT1NJWF9UVFlfTkFNRV9NQVhdOworIyBlbGlmIGRlZmluZWQoX1BPU0lYX1BBVEhfTUFYKQorICBjaGFyIGJ1ZltfUE9TSVhfUEFUSF9NQVhdOworIyBlbHNlCisgIGNoYXIgYnVmWzI1Nl07CisjIGVuZGlmCit9IF9YdHR5bmFtZXBhcmFtczsKKworIyBkZWZpbmUgX1hHZXRsb2dpbihwKQlnZXRsb2dpbl9yKChwKS5idWYsIHNpemVvZigocCkuYnVmKSkKKyMgZGVmaW5lIF9YVHR5bmFtZShmLHApCXR0eW5hbWVfcigoZiksIChwKS5idWYsIHNpemVvZigocCkuYnVmKSkKKyNlbmRpZiAvKiBYX0lOQ0xVREVfVU5JU1REX0ggKi8KKworI2lmIGRlZmluZWQoWF9JTkNMVURFX1VOSVNURF9IKSAmJiAhZGVmaW5lZChfWE9TX0lOQ0xVREVEX1VOSVNURF9IKQorIyBkZWZpbmUgX1hPU19JTkNMVURFRF9VTklTVERfSAorI2VuZGlmCisKKworLyoqKioqIDxzdHJpbmcuaD4gd3JhcHBlcnMgKioqKiovCisKKy8qCisgKiBFZmZlY3RpdmUgcHJvdG90eXBlcyBmb3IgPHN0cmluZy5oPiB3cmFwcGVyczoKKyAqCisgKiAjZGVmaW5lIFhfSU5DTFVERV9TVFJJTkdfSAorICogI2RlZmluZSBYT1NfVVNFXy4uLl9MT0NLSU5HCisgKiAjaW5jbHVkZSA8WDExL1hvc19yLmg+CisgKgorICogdHlwZWRlZiAuLi4gX1hzdHJ0b2twYXJhbXM7CisgKgorICogY2hhciAqX1hTdHJ0b2soY2hhciAqLCBjb25zdCBjaGFyKiwgX1hzdHJ0b2twYXJhbXMpOworICovCisKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9TVFJJTkdfSCkgJiYgIWRlZmluZWQoX1hPU19JTkNMVURFRF9TVFJJTkdfSCkKKy8qIDxzdHJpbmcuaD4gaGFzIGFscmVhZHkgYmVlbiBpbmNsdWRlZCBieSA8WDExL1hvcy5oPiAqLworIyBpZiBkZWZpbmVkKFhVU0VfTVRTQUZFX0FQSSkgfHwgZGVmaW5lZChYVVNFX01UU0FGRV9TVFJJTkdBUEkpCisjICBkZWZpbmUgWE9TX1VTRV9NVFNBRkVfU1RSSU5HQVBJIDEKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWF9JTkNMVURFX1NUUklOR19IKSB8fCBkZWZpbmVkKF9YT1NfSU5DTFVERURfU1RSSU5HX0gpCisvKiBEbyBub3RoaW5nLiAqLworCisjZWxpZiAhZGVmaW5lZChYVEhSRUFEUykgJiYgIWRlZmluZWQoWF9GT1JDRV9VU0VfTVRTQUZFX0FQSSkKKy8qIFVzZSByZWd1bGFyLCB1bnNhZmUgQVBJLiAqLwordHlwZWRlZiBpbnQgX1hzdHJ0b2twYXJhbXM7CS8qIGR1bW15ICovCisjIGRlZmluZSBfWFN0cnRvayhzMSxzMixwKSBcCisgKCBwID0gMCwgKHZvaWQpcCwgc3RydG9rKChzMSksKHMyKSkgKQorCisjZWxpZiAhZGVmaW5lZChYT1NfVVNFX01UU0FGRV9TVFJJTkdBUEkpIHx8IGRlZmluZWQoWE5PX01UU0FGRV9TVFJJTkdBUEkpCisvKiBTeXN0ZW1zIHdpdGggdGhyZWFkIHN1cHBvcnQgYnV0IG5vIF9yIEFQSS4gKi8KK3R5cGVkZWYgY2hhciAqX1hzdHJ0b2twYXJhbXM7CisjIGRlZmluZSBfWFN0cnRvayhzMSxzMixwKSBcCisgKCAoX1hvc19wcm9jZXNzTG9jayksIFwKKyAgICgocCkgPSBzdHJ0b2soKHMxKSwoczIpKSksIFwKKyAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgICAocCkgKQorCisjZWxzZQorLyogUE9TSVggb3IgcHJlLVBPU0lYIEFQSS4gKi8KK3R5cGVkZWYgY2hhciAqIF9Yc3RydG9rcGFyYW1zOworIyBkZWZpbmUgX1hTdHJ0b2soczEsczIscCkJc3RydG9rX3IoKHMxKSwoczIpLCYocCkpCisjZW5kaWYgLyogWF9JTkNMVURFX1NUUklOR19IICovCisKKworLyoqKioqIDx0aW1lLmg+IHdyYXBwZXJzICoqKioqLworCisvKgorICogRWZmZWN0aXZlIHByb3RvdHlwZXMgZm9yIDx0aW1lLmg+IHdyYXBwZXJzOgorICoKKyAqICNkZWZpbmUgWF9JTkNMVURFX1RJTUVfSAorICogI2RlZmluZSBYT1NfVVNFXy4uLl9MT0NLSU5HCisgKiAjaW5jbHVkZSA8WDExL1hvc19yLmg+CisgKgorICogdHlwZWRlZiAuLi4gX1hhdGltZXBhcmFtczsKKyAqIHR5cGVkZWYgLi4uIF9YY3RpbWVwYXJhbXM7CisgKiB0eXBlZGVmIC4uLiBfWGd0aW1lcGFyYW1zOworICogdHlwZWRlZiAuLi4gX1hsdGltZXBhcmFtczsKKyAqCisgKiBjaGFyICpfWEFzY3RpbWUoY29uc3Qgc3RydWN0IHRtICosIF9YYXRpbWVwYXJhbXMpOworICogY2hhciAqX1hDdGltZShjb25zdCB0aW1lX3QgKiwgX1hjdGltZXBhcmFtcyk7CisgKiBzdHJ1Y3QgdG0gKl9YR210aW1lKGNvbnN0IHRpbWVfdCAqLCBfWGd0aW1lcGFyYW1zKTsKKyAqIHN0cnVjdCB0bSAqX1hMb2NhbHRpbWUoY29uc3QgdGltZV90ICosIF9YbHRpbWVwYXJhbXMpOworICovCisKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9USU1FX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfVElNRV9IKQorIyBpbmNsdWRlIDx0aW1lLmg+CisjIGlmIGRlZmluZWQoWFVTRV9NVFNBRkVfQVBJKSB8fCBkZWZpbmVkKFhVU0VfTVRTQUZFX1RJTUVBUEkpCisjICBkZWZpbmUgWE9TX1VTRV9NVFNBRkVfVElNRUFQSSAxCisjIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFhfSU5DTFVERV9USU1FX0gpIHx8IGRlZmluZWQoX1hPU19JTkNMVURFRF9USU1FX0gpCisvKiBEbyBub3RoaW5nLiAqLworCisjZWxpZiAhZGVmaW5lZChYVEhSRUFEUykgJiYgIWRlZmluZWQoWF9GT1JDRV9VU0VfTVRTQUZFX0FQSSkKKy8qIFVzZSByZWd1bGFyLCB1bnNhZmUgQVBJLiAqLwordHlwZWRlZiBpbnQgX1hhdGltZXBhcmFtczsJLyogZHVtbXkgKi8KKyMgZGVmaW5lIF9YQXNjdGltZSh0LHApCQlhc2N0aW1lKCh0KSkKK3R5cGVkZWYgaW50IF9YY3RpbWVwYXJhbXM7CS8qIGR1bW15ICovCisjIGRlZmluZSBfWEN0aW1lKHQscCkJCWN0aW1lKCh0KSkKK3R5cGVkZWYgaW50IF9YZ3RpbWVwYXJhbXM7CS8qIGR1bW15ICovCisjIGRlZmluZSBfWEdtdGltZSh0LHApCQlnbXRpbWUoKHQpKQordHlwZWRlZiBpbnQgX1hsdGltZXBhcmFtczsJLyogZHVtbXkgKi8KKyMgZGVmaW5lIF9YTG9jYWx0aW1lKHQscCkJbG9jYWx0aW1lKCh0KSkKKworI2VsaWYgIWRlZmluZWQoWE9TX1VTRV9NVFNBRkVfVElNRUFQSSkgfHwgZGVmaW5lZChYTk9fTVRTQUZFX1RJTUVBUEkpCisvKiBTeXN0ZW1zIHdpdGggdGhyZWFkIHN1cHBvcnQgYnV0IG5vIF9yIEFQSS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyMgaWZkZWYgVElNRUxFTgorICBjaGFyIGJ1ZltUSU1FTEVOXTsKKyMgZWxzZQorICBjaGFyIGJ1ZlsyNl07CisjIGVuZGlmCisgIGNoYXIgKnJlc3VsdDsKK30gX1hjdGltZXBhcmFtcywgX1hhdGltZXBhcmFtczsKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IHRtIGJ1ZjsKKyAgc3RydWN0IHRtICpyZXN1bHQ7Cit9IF9YZ3RpbWVwYXJhbXMsIF9YbHRpbWVwYXJhbXM7CisjIGRlZmluZSBfWEFzY3RpbWUodCxwKSBcCisgKCAoX1hvc19wcm9jZXNzTG9jayksIFwKKyAgICgoKHApLnJlc3VsdCA9IGFzY3RpbWUoKHQpKSkgPyBcCisgICAgKHN0cm5jcHkoKHApLmJ1ZiwgKHApLnJlc3VsdCwgc2l6ZW9mKChwKS5idWYpKSwgKHApLnJlc3VsdCA9ICYocCkuYnVmKSA6IFwKKyAgICAwKSwgXAorICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgIChwKS5yZXN1bHQgKQorIyBkZWZpbmUgX1hDdGltZSh0LHApIFwKKyAoIChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAgKCgocCkucmVzdWx0ID0gY3RpbWUoKHQpKSkgPyBcCisgICAgKHN0cm5jcHkoKHApLmJ1ZiwgKHApLnJlc3VsdCwgc2l6ZW9mKChwKS5idWYpKSwgKHApLnJlc3VsdCA9ICYocCkuYnVmKSA6IFwKKyAgICAwKSwgXAorICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgIChwKS5yZXN1bHQgKQorIyBkZWZpbmUgX1hHbXRpbWUodCxwKSBcCisgKCAoX1hvc19wcm9jZXNzTG9jayksIFwKKyAgICgoKHApLnJlc3VsdCA9IGdtdGltZSh0KSkgPyBcCisgICAgKG1lbWNweSgmKHApLmJ1ZiwgKHApLnJlc3VsdCwgc2l6ZW9mKChwKS5idWYpKSwgKHApLnJlc3VsdCA9ICYocCkuYnVmKSA6IFwKKyAgICAwKSwgXAorICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgIChwKS5yZXN1bHQgKQorIyBkZWZpbmUgX1hMb2NhbHRpbWUodCxwKSBcCisgKCAoX1hvc19wcm9jZXNzTG9jayksIFwKKyAgICgoKHApLnJlc3VsdCA9IGxvY2FsdGltZSh0KSkgPyBcCisgICAgKG1lbWNweSgmKHApLmJ1ZiwgKHApLnJlc3VsdCwgc2l6ZW9mKChwKS5idWYpKSwgKHApLnJlc3VsdCA9ICYocCkuYnVmKSA6IFwKKyAgICAwKSwgXAorICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgIChwKS5yZXN1bHQgKQorCisjZWxpZiAhZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKSAmJiAgZGVmaW5lZChocFY0KQorLyogUmV0dXJucyAoaW50KTAgb24gc3VjY2Vzcy4KKyAqCisgKiBleHRlcm4gaW50IGFzY3RpbWVfcihjb25zdCBzdHJ1Y3QgdG0gKnRpbWVwdHIsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1Zmxlbik7CisgKiBleHRlcm4gaW50IGN0aW1lX3IoY29uc3QgdGltZV90ICp0aW1lciwgY2hhciAqYnVmZmVyLCBpbnQgYnVmbGVuKTsKKyAqIGV4dGVybiBpbnQgZ210aW1lX3IoY29uc3QgdGltZV90ICp0aW1lciwgc3RydWN0IHRtICpyZXN1bHQpOworICogZXh0ZXJuIGludCBsb2NhbHRpbWVfcihjb25zdCB0aW1lX3QgKnRpbWVyLCBzdHJ1Y3QgdG0gKnJlc3VsdCk7CisgKi8KKyMgaWZkZWYgVElNRUxFTgordHlwZWRlZiBjaGFyIF9YYXRpbWVwYXJhbXNbVElNRUxFTl07Cit0eXBlZGVmIGNoYXIgX1hjdGltZXBhcmFtc1tUSU1FTEVOXTsKKyMgZWxzZQordHlwZWRlZiBjaGFyIF9YYXRpbWVwYXJhbXNbMjZdOwordHlwZWRlZiBjaGFyIF9YY3RpbWVwYXJhbXNbMjZdOworIyBlbmRpZgordHlwZWRlZiBzdHJ1Y3QgdG0gX1hndGltZXBhcmFtczsKK3R5cGVkZWYgc3RydWN0IHRtIF9YbHRpbWVwYXJhbXM7CisjIGRlZmluZSBfWEFzY3RpbWUodCxwKQkJKGFzY3RpbWVfcigodCksKHApLHNpemVvZigocCkpKSA/IE5VTEwgOiAocCkpCisjIGRlZmluZSBfWEN0aW1lKHQscCkJCShjdGltZV9yKCh0KSwocCksc2l6ZW9mKChwKSkpID8gTlVMTCA6IChwKSkKKyMgZGVmaW5lIF9YR210aW1lKHQscCkJCShnbXRpbWVfcigodCksJihwKSkgPyBOVUxMIDogJihwKSkKKyMgZGVmaW5lIF9YTG9jYWx0aW1lKHQscCkJKGxvY2FsdGltZV9yKCh0KSwmKHApKSA/IE5VTEwgOiAmKHApKQorCisjZWxpZiAhZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKSAmJiBkZWZpbmVkKF9fc3VuKQorLyogUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuICBTb2xhcmlzIDIuNQorICoKKyAqIGV4dGVybiBjaGFyICphc2N0aW1lX3IoY29uc3Qgc3RydWN0IHRtICp0bSxjaGFyICpidWYsIGludCBidWZsZW4pOworICogZXh0ZXJuIGNoYXIgKmN0aW1lX3IoY29uc3QgdGltZV90ICpjbG9jaywgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKKyAqIGV4dGVybiBzdHJ1Y3QgdG0gKmdtdGltZV9yKGNvbnN0IHRpbWVfdCAqY2xvY2ssIHN0cnVjdCB0bSAqcmVzKTsKKyAqIGV4dGVybiBzdHJ1Y3QgdG0gKmxvY2FsdGltZV9yKGNvbnN0IHRpbWVfdCAqY2xvY2ssIHN0cnVjdCB0bSAqcmVzKTsKKyAqLworIyBpZmRlZiBUSU1FTEVOCit0eXBlZGVmIGNoYXIgX1hhdGltZXBhcmFtc1tUSU1FTEVOXTsKK3R5cGVkZWYgY2hhciBfWGN0aW1lcGFyYW1zW1RJTUVMRU5dOworIyBlbHNlCit0eXBlZGVmIGNoYXIgX1hhdGltZXBhcmFtc1syNl07Cit0eXBlZGVmIGNoYXIgX1hjdGltZXBhcmFtc1syNl07CisjIGVuZGlmCit0eXBlZGVmIHN0cnVjdCB0bSBfWGd0aW1lcGFyYW1zOwordHlwZWRlZiBzdHJ1Y3QgdG0gX1hsdGltZXBhcmFtczsKKyMgZGVmaW5lIF9YQXNjdGltZSh0LHApCQlhc2N0aW1lX3IoKHQpLChwKSxzaXplb2YoKHApKSkKKyMgZGVmaW5lIF9YQ3RpbWUodCxwKQkJY3RpbWVfcigodCksKHApLHNpemVvZigocCkpKQorIyBkZWZpbmUgX1hHbXRpbWUodCxwKQkJZ210aW1lX3IoKHQpLCYocCkpCisjIGRlZmluZSBfWExvY2FsdGltZSh0LHApCWxvY2FsdGltZV9yKCh0KSwmKHApKQorCisjZWxzZSAvKiBkZWZpbmVkKF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMpICovCisvKiBQT1NJWCBmaW5hbCBBUEkuCisgKiBleHRlcm4gY2hhciAqYXNjdGltZV9yKGNvbnN0IHN0cnVjdCB0bSAqdGltZXB0ciwgY2hhciAqYnVmZmVyKTsKKyAqIGV4dGVybiBjaGFyICpjdGltZV9yKGNvbnN0IHRpbWVfdCAqdGltZXIsIGNoYXIgKmJ1ZmZlcik7CisgKiBleHRlcm4gc3RydWN0IHRtICpnbXRpbWVfcihjb25zdCB0aW1lX3QgKnRpbWVyLCBzdHJ1Y3QgdG0gKnJlc3VsdCk7CisgKiBleHRlcm4gc3RydWN0IHRtICpsb2NhbHRpbWVfcihjb25zdCB0aW1lX3QgKnRpbWVyLCBzdHJ1Y3QgdG0gKnJlc3VsdCk7CisgKi8KKyMgaWZkZWYgVElNRUxFTgordHlwZWRlZiBjaGFyIF9YYXRpbWVwYXJhbXNbVElNRUxFTl07Cit0eXBlZGVmIGNoYXIgX1hjdGltZXBhcmFtc1tUSU1FTEVOXTsKKyMgZWxzZQordHlwZWRlZiBjaGFyIF9YYXRpbWVwYXJhbXNbMjZdOwordHlwZWRlZiBjaGFyIF9YY3RpbWVwYXJhbXNbMjZdOworIyBlbmRpZgordHlwZWRlZiBzdHJ1Y3QgdG0gX1hndGltZXBhcmFtczsKK3R5cGVkZWYgc3RydWN0IHRtIF9YbHRpbWVwYXJhbXM7CisjIGRlZmluZSBfWEFzY3RpbWUodCxwKQkJYXNjdGltZV9yKCh0KSwocCkpCisjIGRlZmluZSBfWEN0aW1lKHQscCkJCWN0aW1lX3IoKHQpLChwKSkKKyMgZGVmaW5lIF9YR210aW1lKHQscCkJCWdtdGltZV9yKCh0KSwmKHApKQorIyBkZWZpbmUgX1hMb2NhbHRpbWUodCxwKQlsb2NhbHRpbWVfcigodCksJihwKSkKKyNlbmRpZiAvKiBYX0lOQ0xVREVfVElNRV9IICovCisKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9USU1FX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfVElNRV9IKQorIyBkZWZpbmUgX1hPU19JTkNMVURFRF9USU1FX0gKKyNlbmRpZgorCisKKy8qKioqKiA8Z3JwLmg+IHdyYXBwZXJzICoqKioqLworCisvKgorICogRWZmZWN0aXZlIHByb3RvdHlwZXMgZm9yIDxncnAuaD4gd3JhcHBlcnM6CisgKgorICogTk9URTogT24gc3lzdGVtcyBsYWNraW5nIGFwcHJvcHJpYXRlIF9yIGZ1bmN0aW9ucyBHZXRncmdpZCgpIGFuZAorICoJR2V0Z3JuYW0oKSBkbyBOT1QgY29weSB0aGUgbGlzdCBvZiBncm91cCBtZW1iZXJzIQorICoKKyAqIFJlbWVtYmVyIHRoYXQgZmdldGdyZW50KCksIHNldGdyZW50KCksIGdldGdyZW50KCksIGFuZCBlbmRncmVudCgpCisgKiBhcmUgbm90IGluY2x1ZGVkIGluIFBPU0lYLgorICoKKyAqICNkZWZpbmUgWF9JTkNMVURFX0dSUF9ICisgKiAjZGVmaW5lIFhPU19VU0VfLi4uX0xPQ0tJTkcKKyAqICNpbmNsdWRlIDxYMTEvWG9zX3IuaD4KKyAqCisgKiB0eXBlZGVmIC4uLiBfWGdldGdycGFyYW1zOworICoKKyAqIHN0cnVjdCBncm91cCAqX1hHZXRncmdpZChnaWRfdCwgX1hnZXRncnBhcmFtcyk7CisgKiBzdHJ1Y3QgZ3JvdXAgKl9YR2V0Z3JuYW0oY29uc3QgY2hhciAqLCBfWGdldGdycGFyYW1zKTsKKyAqLworCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfR1JQX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfR1JQX0gpCisjIGluY2x1ZGUgPGdycC5oPgorIyBpZiBkZWZpbmVkKFhVU0VfTVRTQUZFX0FQSSkgfHwgZGVmaW5lZChYVVNFX01UU0FGRV9HUlBBUEkpCisjICBkZWZpbmUgWE9TX1VTRV9NVFNBRkVfR1JQQVBJIDEKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWF9JTkNMVURFX0dSUF9IKSB8fCBkZWZpbmVkKF9YT1NfSU5DTFVERURfR1JQX0gpCisvKiBEbyBub3RoaW5nLiAqLworCisjZWxpZiAhZGVmaW5lZChYVEhSRUFEUykgJiYgIWRlZmluZWQoWF9GT1JDRV9VU0VfTVRTQUZFX0FQSSkKKy8qIFVzZSByZWd1bGFyLCB1bnNhZmUgQVBJLiAqLwordHlwZWRlZiBpbnQgX1hnZXRncnBhcmFtczsJLyogZHVtbXkgKi8KKyNkZWZpbmUgX1hHZXRncmdpZChnLHApCWdldGdyZ2lkKChnKSkKKyNkZWZpbmUgX1hHZXRncm5hbShuLHApCWdldGdybmFtKChuKSkKKworI2VsaWYgIWRlZmluZWQoWE9TX1VTRV9NVFNBRkVfR1JQQVBJKSB8fCBkZWZpbmVkKFhOT19NVFNBRkVfR1JQQVBJKQorLyogU3lzdGVtcyB3aXRoIHRocmVhZCBzdXBwb3J0IGJ1dCBubyBfciBBUEkuICBVbml4V2FyZSAyLjAuICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBncm91cCBncnA7CisgIGNoYXIgYnVmW1hfTElORV9NQVhdOwkvKiBTaG91bGQgYmUgc3lzY29uZihfU0NfR0VUR1JfUl9TSVpFX01BWCk/ICovCisgIHN0cnVjdCBncm91cCAqcGdycDsKKyAgc2l6ZV90IGxlbjsKK30gX1hnZXRncnBhcmFtczsKKyNpZmRlZiBTVlI0CisvKiBDb3B5IHRoZSBncl9wYXNzd2QgZmllbGQgdG9vLiAqLworIyBkZWZpbmUgX1hncnBfY29weUdyb3VwKHApIFwKKyAoIG1lbWNweSgmKHApLmdycCwgKHApLnBncnAsIHNpemVvZihzdHJ1Y3QgZ3JvdXApKSwgXAorICAgKChwKS5ncnAuZ3JfbmFtZSA9IChwKS5idWYpLCBcCisgICAoKHApLmxlbiA9IHN0cmxlbigocCkucGdycC0+Z3JfbmFtZSkpLCBcCisgICBzdHJjcHkoKHApLmdycC5ncl9uYW1lLCAocCkucGdycC0+Z3JfbmFtZSksIFwKKyAgICgocCkuZ3JwLmdyX3Bhc3N3ZCA9IChwKS5ncnAuZ3JfbmFtZSArIChwKS5sZW4gKyAxKSwgXAorICAgKChwKS5wZ3JwID0gJihwKS5ncnApLCBcCisgICAwICkKKyNlbHNlCisjIGRlZmluZSBfWGdycF9jb3B5R3JvdXAocCkgXAorICggbWVtY3B5KCYocCkuZ3JwLCAocCkucGdycCwgc2l6ZW9mKHN0cnVjdCBncm91cCkpLCBcCisgICAoKHApLmdycC5ncl9uYW1lID0gKHApLmJ1ZiksIFwKKyAgIHN0cmNweSgocCkuZ3JwLmdyX25hbWUsIChwKS5wZ3JwLT5ncl9uYW1lKSwgXAorICAgKChwKS5wZ3JwID0gJihwKS5ncnApLCBcCisgICAwICkKKyNlbmRpZgorI2RlZmluZSBfWEdldGdyZ2lkKGcscCkgXAorICggKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICAoKChwKS5wZ3JwID0gZ2V0Z3JnaWQoKGcpKSkgPyBfWGdycF9jb3B5R3JvdXAocCkgOiAwKSwgXAorICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgIChwKS5wZ3JwICkKKyNkZWZpbmUgX1hHZXRncm5hbShuLHApIFwKKyAoIChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAgKCgocCkucGdycCA9IGdldGdybmFtKChuKSkpID8gX1hncnBfY29weUdyb3VwKHApIDogMCksIFwKKyAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgICAocCkucGdycCApCisKKyNlbGlmICFkZWZpbmVkKF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMpICYmIGRlZmluZWQoX19zdW4pCisvKiBOb24tUE9TSVggQVBJLiAgU29sYXJpcy4KKyAqCisgKiBleHRlcm4gc3RydWN0IGdyb3VwICpnZXRncmdpZF9yKGdpZF90LCBzdHJ1Y3QgZ3JvdXAgKiwgY2hhciAqLCBpbnQpOworICogZXh0ZXJuIHN0cnVjdCBncm91cCAqZ2V0Z3JuYW1fcihjb25zdCBjaGFyICosIHN0cnVjdCBncm91cCAqLCBjaGFyICosIGludCk7CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGdyb3VwIGdycDsKKyAgY2hhciBidWZbWF9MSU5FX01BWF07CS8qIFNob3VsZCBiZSBzeXNjb25mKF9TQ19HRVRHUl9SX1NJWkVfTUFYKT8gKi8KK30gX1hnZXRncnBhcmFtczsKKyNkZWZpbmUgX1hHZXRncmdpZChnLHApCWdldGdyZ2lkX3IoKGcpLCAmKHApLmdycCwgKHApLmJ1Ziwgc2l6ZW9mKChwKS5idWYpKQorI2RlZmluZSBfWEdldGdybmFtKG4scCkJZ2V0Z3JuYW1fcigobiksICYocCkuZ3JwLCAocCkuYnVmLCBzaXplb2YoKHApLmJ1ZikpCisKKyNlbGlmICFkZWZpbmVkKF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMpCisvKiBOb24tUE9TSVggQVBJLgorICogZXh0ZXJuIGludCBnZXRncmdpZF9yKGdpZF90LCBzdHJ1Y3QgZ3JvdXAgKiwgY2hhciAqLCBpbnQpOworICogZXh0ZXJuIGludCBnZXRncm5hbV9yKGNvbnN0IGNoYXIgKiwgc3RydWN0IGdyb3VwICosIGNoYXIgKiwgaW50KTsKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgZ3JvdXAgZ3JwOworICBjaGFyIGJ1ZltYX0xJTkVfTUFYXTsJLyogU2hvdWxkIGJlIHN5c2NvbmYoX1NDX0dFVEdSX1JfU0laRV9NQVgpPyAqLworfSBfWGdldGdycGFyYW1zOworI2RlZmluZSBfWEdldGdyZ2lkKGcscCkJXAorICgoZ2V0Z3JnaWRfcigoZyksICYocCkuZ3JwLCAocCkuYnVmLCBzaXplb2YoKHApLmJ1ZikpID8gTlVMTCA6ICYocCkuZ3JwKSkKKyNkZWZpbmUgX1hHZXRncm5hbShuLHApCVwKKyAoKGdldGdybmFtX3IoKG4pLCAmKHApLmdycCwgKHApLmJ1Ziwgc2l6ZW9mKChwKS5idWYpKSA/IE5VTEwgOiAmKHApLmdycCkpCisKKyNlbHNlCisvKiBQT1NJWCBmaW5hbCBBUEkuCisgKgorICogaW50IGdldGdyZ2lkX3IoZ2lkX3QsIHN0cnVjdCBncm91cCAqLCBjaGFyICosIHNpemVfdCwgc3RydWN0IGdyb3VwICoqKTsKKyAqIGludCBnZXRncm5hbV9yKGNvbnN0IGNoYXIgKiwgc3RydWN0IGdyb3VwICosIGNoYXIgKiwgc2l6ZV90LCBzdHJ1Y3QgZ3JvdXAgKiopOworICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBncm91cCBncnA7CisgIGNoYXIgYnVmW1hfTElORV9NQVhdOwkvKiBTaG91bGQgYmUgc3lzY29uZihfU0NfR0VUR1JfUl9TSVpFX01BWCk/ICovCisgIHN0cnVjdCBncm91cCAqcmVzdWx0OworfSBfWGdldGdycGFyYW1zOworCisjZGVmaW5lIF9YR2V0Z3JnaWQoZyxwKQlcCisgKChnZXRncmdpZF9yKChnKSwgJihwKS5ncnAsIChwKS5idWYsIHNpemVvZigocCkuYnVmKSwgJihwKS5yZXN1bHQpID8gXAorICAgTlVMTCA6IChwKS5yZXN1bHQpKQorI2RlZmluZSBfWEdldGdybmFtKG4scCkJXAorICgoZ2V0Z3JuYW1fcigobiksICYocCkuZ3JwLCAocCkuYnVmLCBzaXplb2YoKHApLmJ1ZiksICYocCkucmVzdWx0KSA/IFwKKyAgIE5VTEwgOiAocCkucmVzdWx0KSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfR1JQX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfR1JQX0gpCisjIGRlZmluZSBfWE9TX0lOQ0xVREVEX0dSUF9ICisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gIC8qIENsb3NlIHNjb3BlIG9mICdleHRlcm4gIkMiJyBkZWNsYXJhdGlvbiB3aGljaCBlbmNsb3NlcyBmaWxlLiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yb3NkZWZzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yb3NkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlYWVlNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hvc2RlZnMuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIE8vUy1kZXBlbmRlbnQgKG1pcylmZWF0dXJlIG1hY3JvIGRlZmluaXRpb25zCisgKgorQ29weXJpZ2h0IDE5OTEsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisgKi8KKworI2lmbmRlZiBfWE9TREVGU19IXworIyBkZWZpbmUgX1hPU0RFRlNfSF8KKworLyoKKyAqIFhfTk9UX1BPU0lYIG1lYW5zIGRvZXMgbm90IGhhdmUgUE9TSVggaGVhZGVyIGZpbGVzLiAgTGFjayBvZiB0aGlzCisgKiBzeW1ib2wgZG9lcyBOT1QgbWVhbiB0aGF0IHRoZSBQT1NJWCBlbnZpcm9ubWVudCBpcyB0aGUgZGVmYXVsdC4KKyAqIFlvdSBtYXkgc3RpbGwgaGF2ZSB0byBkZWZpbmUgX1BPU0lYX1NPVVJDRSB0byBnZXQgaXQuCisgKi8KKworCisjIGlmZGVmIF9TQ09fRFMKKyMgIGlmbmRlZiBfX1NDT19fCisjICAgZGVmaW5lIF9fU0NPX18KKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgX19pMzg2X18KKyMgIGlmZGVmIFNZU1YKKyMgICBpZiAhZGVmaW5lZChfX1NDT19fKSAmJiBcCisJIWRlZmluZWQoX19VTklYV0FSRV9fKSAmJiAhZGVmaW5lZChfX3N1bikKKyMgICAgaWYgIWRlZmluZWQoX1BPU0lYX1NPVVJDRSkKKyMgICAgIGRlZmluZSBYX05PVF9QT1NJWAorIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmZGVmIF9fc3VuCisvKiBJbWFrZSBjb25maWdzIGRlZmluZSBTVlI0IG9uIFNvbGFyaXMsIGJ1dCBjYyAmIGdjYyBvbmx5IGRlZmluZSBfX1NWUjQKKyAqIFRoaXMgY2hlY2sgYWxsb3dzIG5vbi1JbWFrZSBjb25maWd1cmVkIHByb2dyYW1zIHRvIGJ1aWxkIGNvcnJlY3RseS4KKyAqLworIyAgaWYgZGVmaW5lZChfX1NWUjQpICYmICFkZWZpbmVkKFNWUjQpCisjICAgZGVmaW5lIFNWUjQgMQorIyAgZW5kaWYKKyMgIGlmZGVmIFNWUjQKKy8qIGRlZmluZSB0aGlzIHRvIHdoYXRldmVyIGl0IG5lZWRzIHRvIGJlICovCisjICAgZGVmaW5lIFhfUE9TSVhfQ19TT1VSQ0UgMTk5MzAwTAorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBXSU4zMgorIyAgaWZuZGVmIF9QT1NJWF8KKyMgICBkZWZpbmUgWF9OT1RfUE9TSVgKKyMgIGVuZGlmCisjIGVuZGlmCisKKworIyBpZmRlZiBfX0FQUExFX18KKyMgIGRlZmluZSBOVUxMX05PVF9aRVJPCisKKy8qIERlZmluaW5nIGFueSBvZiB0aGVzZSB3aWxsIHNhbml0aXplIHRoZSBuYW1lc3BhY2UgdG8gSlVTVCB3YW50IGlzIGRlZmluZWQgYnkKKyAqIHRoYXQgcGFydGljdWxhciBzdGFuZGFyZC4gIElmIHRoYXQgaGFwcGVucywgd2UgZG9uJ3QgZ2V0IHNvbWUgZXhwZWN0ZWQKKyAqIHByb3RvdHlwZXMsIHR5cGVkZWZzLCBldGMgKGxpa2UgZmRfbWFzaykuICBXZSBjYW4gZGVmaW5lIF9EQVJXSU5fQ19TT1VSQ0UgdG8KKyAqIGxvb3NlbiBvdXIgYmVsdHMgYSB0YWQuCisgKi8KKyMgIGlmIGRlZmluZWQoX1hPUEVOX1NPVVJDRSkgfHwgZGVmaW5lZChfUE9TSVhfU09VUkNFKSB8fCBkZWZpbmVkKF9QT1NJWF9DX1NPVVJDRSkKKyMgICBpZm5kZWYgX0RBUldJTl9DX1NPVVJDRQorIyAgICBkZWZpbmUgX0RBUldJTl9DX1NPVVJDRQorIyAgIGVuZGlmCisjICBlbmRpZgorCisjIGVuZGlmCisKKyMgaWZkZWYgX19HTlVfXworIyAgaWZuZGVmIFBBVEhfTUFYCisjICAgZGVmaW5lIFBBVEhfTUFYIDQwOTYKKyMgIGVuZGlmCisjICBpZm5kZWYgTUFYUEFUSExFTgorIyAgIGRlZmluZSBNQVhQQVRITEVOIDQwOTYKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZChfX1NDT19fKSB8fCBkZWZpbmVkKF9fVU5JWFdBUkVfXykKKyMgIGlmbmRlZiBQQVRIX01BWAorIyAgIGRlZmluZSBQQVRIX01BWAkxMDI0CisjICBlbmRpZgorIyAgaWZuZGVmIE1BWFBBVEhMRU4KKyMgICBkZWZpbmUgTUFYUEFUSExFTgkxMDI0CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgXAorCXx8IGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCisjICBpZm5kZWYgQ1NSR19CQVNFRAorIyAgIGRlZmluZSBDU1JHX0JBU0VECisjICBlbmRpZgorIyBlbmRpZgorCisjZW5kaWYgLyogX1hPU0RFRlNfSF8gKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHBvbGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hwb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2ZWExMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hwb2xsLmgKQEAgLTAsMCArMSwyMTggQEAKKy8qCisKK0NvcHlyaWdodCAxOTk0LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworLyoKKyAqIENvcHlyaWdodCDCqSAyMDA1IERhbmllbCBTdG9uZQorICogCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERhbmllbCBTdG9uZSBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZworICogb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorICogd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgRGFuaWVsIFN0b25lIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKKyAqIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorICogd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogREFOSUVMIFNUT05FIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKKyAqIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorICogREFOSUVMIFNUT05FIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyovCisKKyNpZm5kZWYgX1hQT0xMX0hfCisjZGVmaW5lIF9YUE9MTF9IXworCisjaWZuZGVmIFdJTjMyCisKKyNpZm5kZWYgVVNFX1BPTEwKKworI2luY2x1ZGUgPFgxMS9Yb3MuaD4KKworI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4gIC8qIEdldCB0aGUgRkRfKiBtYWNyb3MuICovCisKKyNpbmNsdWRlIDxYMTEvWG1kLmg+CisKKyNpZmRlZiBDU1JHX0JBU0VECisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjIGlmIEJTRCA8IDE5OTEwMwordHlwZWRlZiBsb25nIGZkX21hc2s7CisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBYRkRfU0VUU0laRQkyNTYKKworI2lmbmRlZiBGRF9TRVRTSVpFCisjZGVmaW5lIEZEX1NFVFNJWkUJWEZEX1NFVFNJWkUKKyNlbmRpZgorCisjaWZuZGVmIE5CQlkKKyNkZWZpbmUgTkJCWQk4CQkvKiBudW1iZXIgb2YgYml0cyBpbiBhIGJ5dGUgKi8KKyNlbmRpZgorCisjaWZuZGVmIE5GREJJVFMKKyNkZWZpbmUgTkZEQklUUyAoc2l6ZW9mKGZkX21hc2spICogTkJCWSkJLyogYml0cyBwZXIgbWFzayAqLworI2VuZGlmCisKKyNpZm5kZWYgaG93bWFueQorI2RlZmluZSBob3dtYW55KHgseSkJKCgoeCkrKCh5KS0xKSkvKHkpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJTRCkgJiYgQlNEIDwgMTk4OTExIAordHlwZWRlZiBzdHJ1Y3QgZmRfc2V0IHsKKwlmZF9tYXNrIGZkc19iaXRzW2hvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUyldOworfSBmZF9zZXQ7CisjZW5kaWYKKworIyBkZWZpbmUgU2VsZWN0KG4scix3LGUsdCkgc2VsZWN0KG4sKGZkX3NldCopciwoZmRfc2V0Kil3LChmZF9zZXQqKWUsKHN0cnVjdCB0aW1ldmFsKil0KQorCisjZGVmaW5lIF9fWF9GRFNfQklUUyBfX2Zkc19iaXRzCisKKyNpZm5kZWYgX19GRFNfQklUUworIyBkZWZpbmUgX19GRFNfQklUUyhwKSAgKChwKS0+X19YX0ZEU19CSVRTKQorI2VuZGlmCisKKyNkZWZpbmUgX19YRkRTX0JJVFMocCwgbikgKF9fRkRTX0JJVFMocCkpW25dCisKKyNpZm5kZWYgRkRfU0VUCisjZGVmaW5lIEZEX1NFVChuLCBwKSAgICAoX19YRkRTX0JJVFMocCwgKChuKS9ORkRCSVRTKSkgfD0gKChmZF9tYXNrKTEgPDwgKChuKSAlIE5GREJJVFMpKSkKKyNlbmRpZgorI2lmbmRlZiBGRF9DTFIKKyNkZWZpbmUgRkRfQ0xSKG4sIHApICAgIChfX1hGRFNfQklUUygocCksICgobikvTkZEQklUUykpICY9IH4oKGZkX21hc2spMSA8PCAoKG4pICUgTkZEQklUUykpKQorI2VuZGlmCisjaWZuZGVmIEZEX0lTU0VUCisjZGVmaW5lIEZEX0lTU0VUKG4sIHApICAoKF9fWEZEU19CSVRTKChwKSwgKChuKS9ORkRCSVRTKSkpICYgKChmZF9tYXNrKTEgPDwgKChuKSAlIE5GREJJVFMpKSkKKyNlbmRpZgorI2lmbmRlZiBGRF9aRVJPCisjZGVmaW5lIEZEX1pFUk8ocCkgICAgICBiemVybygoY2hhciAqKShwKSwgc2l6ZW9mKCoocCkpKQorI2VuZGlmCisKKy8qCisgKiBUaGUgaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKSBjb21wdXRlcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQorICogYXJyYXkuIGJlZm9yZSBhY2Nlc3NpbmcgYW4gZWxlbWVudCBpbiB0aGUgYXJyYXkgd2UgY2hlY2sgaXQgZXhpc3RzLgorICogSWYgaXQgZG9lcyBub3QgZXhpc3QgdGhlbiB0aGUgY29tcGlsZXIgZGlzY2FyZHMgdGhlIGNvZGUgdG8gYWNjZXNzIGl0LiAKKyAqLworI2RlZmluZSBYRkRfQU5ZU0VUKHApIFwKKyAgICAgICAgKChob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpID4gMCAmJiAoX19YRkRTX0JJVFMocCwgMCkpKSB8fCBcCisgICAgICAgIChob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpID4gMSAmJiAoX19YRkRTX0JJVFMocCwgMSkpKSB8fCBcCisgICAgICAgIChob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpID4gMiAmJiAoX19YRkRTX0JJVFMocCwgMikpKSB8fCBcCisgICAgICAgIChob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpID4gMyAmJiAoX19YRkRTX0JJVFMocCwgMykpKSB8fCBcCisgICAgICAgIChob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpID4gNCAmJiAoX19YRkRTX0JJVFMocCwgNCkpKSB8fCBcCisgICAgICAgIChob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpID4gNSAmJiAoX19YRkRTX0JJVFMocCwgNSkpKSB8fCBcCisgICAgICAgIChob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpID4gNiAmJiAoX19YRkRTX0JJVFMocCwgNikpKSB8fCBcCisgICAgICAgIChob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpID4gNyAmJiAoX19YRkRTX0JJVFMocCwgNykpKSkKKworI2RlZmluZSBYRkRfQ09QWVNFVChzcmMsZHN0KSB7IFwKKyAgICAgICAgaW50IF9faV9fOyBcCisJCWZvciAoX19pX18gPSAwOyBfX2lfXyA8IGhvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUyk7IF9faV9fKyspIFwKKyAgICAgICAgICAgIF9fWEZEU19CSVRTKChkc3QpLCBfX2lfXykgPSBfX1hGRFNfQklUUygoc3JjKSwgX19pX18pOyBcCisgICAgICAgIH0KKyNkZWZpbmUgWEZEX0FORFNFVChkc3QsYjEsYjIpIHsgXAorICAgICAgICBpbnQgX19pX187IFwKKyAgICAgICAgZm9yIChfX2lfXyA9IDA7IF9faV9fIDwgaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKTsgX19pX18rKykgXAorICAgICAgICAgICAgX19YRkRTX0JJVFMoKGRzdCksIF9faV9fKSA9ICgoX19YRkRTX0JJVFMoKGIxKSwgX19pX18pKSAmIChfX1hGRFNfQklUUygoYjIpLCBfX2lfXykpKTsgXAorICAgICAgICB9CisjZGVmaW5lIFhGRF9PUlNFVChkc3QsYjEsYjIpIHsgXAorICAgICAgICBpbnQgX19pX187IFwKKyAgICAgICAgZm9yIChfX2lfXyA9IDA7IF9faV9fIDwgaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKTsgX19pX18rKykgXAorCQlfX1hGRFNfQklUUygoZHN0KSwgX19pX18pID0gKChfX1hGRFNfQklUUygoYjEpLCBfX2lfXykpIHwgKF9fWEZEU19CSVRTKChiMiksIF9faV9fKSkpOyBcCisgICAgICAgIH0gICAgICAgIAorI2RlZmluZSBYRkRfVU5TRVQoZHN0LGIxKSB7IFwKKyAgICAgICAgaW50IF9faV9fOyBcCisgICAgICAgIGZvciAoX19pX18gPSAwOyBfX2lfXyA8IGhvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUyk7IF9faV9fKyspIFwKKyAgICAJCV9fWEZEU19CSVRTKChkc3QpLCBfX2lfXykgJj0gfihfX1hGRFNfQklUUygoYjEpLCBfX2lfXykpOyBcCisgICAgICAgIH0KKworI2Vsc2UgLyogVVNFX1BPTEwgKi8KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2VuZGlmIC8qIFVTRV9QT0xMICovCisKKyNlbHNlIC8qIFdJTjMyICovCisKKyNkZWZpbmUgWEZEX1NFVFNJWkUJMjU2CisjaWZuZGVmIEZEX1NFVFNJWkUKKyNkZWZpbmUgRkRfU0VUU0laRQlYRkRfU0VUU0laRQorI2VuZGlmCisjaW5jbHVkZSA8WDExL1h3aW5zb2NrLmg+CisKKyNkZWZpbmUgU2VsZWN0KG4scix3LGUsdCkgc2VsZWN0KDAsKGZkX3NldCopciwoZmRfc2V0Kil3LChmZF9zZXQqKWUsKHN0cnVjdCB0aW1ldmFsKil0KQorCisjZGVmaW5lIFhGRF9TRVRDT1VOVChwKQkoKChmZF9zZXQgRkFSICopKHApKS0+ZmRfY291bnQpCisjZGVmaW5lIFhGRF9GRChwLGkpICgoKGZkX3NldCBGQVIgKikocCkpLT5mZF9hcnJheVtpXSkKKyNkZWZpbmUgWEZEX0FOWVNFVChwKQlYRkRfU0VUQ09VTlQocCkKKworI2RlZmluZSBYRkRfQ09QWVNFVChzcmMsZHN0KSB7IFwKKyAgICB1X2ludCBfX2k7IFwKKyAgICBGRF9aRVJPKGRzdCk7IFwKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IFhGRF9TRVRDT1VOVChzcmMpIDsgX19pKyspIHsgXAorICAgICAgICBYRkRfRkQoZHN0LF9faSkgPSBYRkRfRkQoc3JjLF9faSk7IFwKKyAgICB9IFwKKyAgICBYRkRfU0VUQ09VTlQoZHN0KSA9IFhGRF9TRVRDT1VOVChzcmMpOyBcCit9CisKKyNkZWZpbmUgWEZEX0FORFNFVChkc3QsYjEsYjIpIHsgXAorICAgIHVfaW50IF9faTsgXAorICAgIEZEX1pFUk8oZHN0KTsgXAorICAgIGZvciAoX19pID0gMDsgX19pIDwgWEZEX1NFVENPVU5UKGIxKSA7IF9faSsrKSB7IFwKKyAgICAgICAgaWYgKEZEX0lTU0VUKFhGRF9GRChiMSxfX2kpLCBiMikpIFwKKwkgICBGRF9TRVQoWEZEX0ZEKGIxLF9faSksIGRzdCk7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBYRkRfT1JTRVQoZHN0LGIxLGIyKSB7IFwKKyAgICB1X2ludCBfX2k7IFwKKyAgICBpZiAoZHN0ICE9IGIxKSBYRkRfQ09QWVNFVChiMSxkc3QpOyBcCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBYRkRfU0VUQ09VTlQoYjIpIDsgX19pKyspIHsgXAorICAgICAgICBpZiAoIUZEX0lTU0VUKFhGRF9GRChiMixfX2kpLCBkc3QpKSBcCisJICAgRkRfU0VUKFhGRF9GRChiMixfX2kpLCBkc3QpOyBcCisgICAgfSBcCit9CisKKy8qIHRoaXMgb25lIGlzIHJlYWxseSBzdWItb3B0aW1hbCAqLworI2RlZmluZSBYRkRfVU5TRVQoZHN0LGIxKSB7IFwKKyAgICB1X2ludCBfX2k7IFwKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IFhGRF9TRVRDT1VOVChiMSkgOyBfX2krKykgeyBcCisJRkRfQ0xSKFhGRF9GRChiMSxfX2kpLCBkc3QpOyBcCisgICAgfSBcCit9CisKKy8qIHdlIGhhdmUgdG8gcGF5IHRoZSBwcmljZSBvZiBoYXZpbmcgYW4gYXJyYXkgaGVyZSwgdW5saWtlIHdpdGggYml0bWFza3MKKyAgIGNhbGxpbmcgdHdpY2UgRkRfU0VUIHdpdGggdGhlIHNhbWUgZmQgaXMgbm90IHRyYW5zcGFyZW50LCBzbyBiZSBjYXJlZnVsICovCisjdW5kZWYgRkRfU0VUCisjZGVmaW5lIEZEX1NFVChmZCxzZXQpIGRvIHsgXAorICAgIGlmIChYRkRfU0VUQ09VTlQoc2V0KSA8IEZEX1NFVFNJWkUgJiYgIUZEX0lTU0VUKGZkLHNldCkpIFwKKyAgICAgICAgWEZEX0ZEKHNldCxYRkRfU0VUQ09VTlQoc2V0KSsrKT0oZmQpOyBcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgZ2V0ZHRhYmxlc2l6ZSgpIEZEX1NFVFNJWkUgCisKKyNlbmRpZiAvKiBXSU4zMiAqLworCisjZW5kaWYgLyogX1hQT0xMX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcHJvdG8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NWQ0NDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcHJvdG8uaApAQCAtMCwwICsxLDIxNTcgQEAKKy8qIERlZmluaXRpb25zIGZvciB0aGUgWCB3aW5kb3cgc3lzdGVtIHVzZWQgYnkgc2VydmVyIGFuZCBjIGJpbmRpbmdzICovCisKKy8qCisgKiBUaGlzIHBhY2tldC1jb25zdHJ1Y3Rpb24gc2NoZW1lIG1ha2VzIHRoZSBmb2xsb3dpbmcgYXNzdW1wdGlvbnM6CisgKgorICogMS4gVGhlIGNvbXBpbGVyIGlzIGFibGUKKyAqIHRvIGdlbmVyYXRlIGNvZGUgd2hpY2ggYWRkcmVzc2VzIG9uZS0gYW5kIHR3by1ieXRlIHF1YW50aXRpZXMuCisgKiBJbiB0aGUgd29yc3QgY2FzZSwgdGhpcyB3b3VsZCBiZSBkb25lIHdpdGggYml0LWZpZWxkcy4gIElmIGJpdC1maWVsZHMKKyAqIGFyZSB1c2VkIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gcmVvcmRlciB0aGUgcmVxdWVzdCBmaWVsZHMgaW4gdGhpcyBmaWxlLAorICogZGVwZW5kaW5nIG9uIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgbWFjaGluZSBhc3NpZ25zIGJpdCBmaWVsZHMgdG8KKyAqIG1hY2hpbmUgd29yZHMuICBUaGVyZSBtYXkgYWxzbyBiZSBhIHByb2JsZW0gd2l0aCBzaWduIGV4dGVuc2lvbiwKKyAqIGFzIEsrUiBzcGVjaWZ5IHRoYXQgYml0ZmllbGRzIGFyZSBhbHdheXMgdW5zaWduZWQuCisgKgorICogMi4gMi0gYW5kIDQtYnl0ZSBmaWVsZHMgaW4gcGFja2V0IHN0cnVjdHVyZXMgbXVzdCBiZSBvcmRlcmVkIGJ5IGhhbmQKKyAqIHN1Y2ggdGhhdCB0aGV5IGFyZSBuYXR1cmFsbHktYWxpZ25lZCwgc28gdGhhdCBubyBjb21waWxlciB3aWxsIGV2ZXIKKyAqIGluc2VydCBwYWRkaW5nIGJ5dGVzLgorICoKKyAqIDMuIEFsbCBwYWNrZXRzIGFyZSBoYW5kLXBhZGRlZCB0byBhIG11bHRpcGxlIG9mIDQgYnl0ZXMsIGZvcgorICogdGhlIHNhbWUgcmVhc29uLgorICovCisKKyNpZm5kZWYgWFBST1RPX0gKKyNkZWZpbmUgWFBST1RPX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg3LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisKK0NvcHlyaWdodCAxOTg3IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAorCitESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxYMTEvWG1kLmg+CisjaW5jbHVkZSA8WDExL1hwcm90b3N0ci5oPgorCisvKgorICogRGVmaW5lIGNvbnN0YW50cyBmb3IgdGhlIHNpemVzIG9mIHRoZSBuZXR3b3JrIHBhY2tldHMuICBUaGUgc3pfIHByZWZpeCBpcworICogdXNlZCBpbnN0ZWFkIG9mIHNvbWV0aGluZyBtb3JlIGRlc2NyaXB0aXZlIHNvIHRoYXQgdGhlIHN5bWJvbHMgYXJlIG5vIG1vcmUKKyAqIHRoYW4gMzIgY2hhcmFjdGVycyBpbiBsZW5ndGggKHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBmb3Igc29tZSBjb21waWxlcnMpLgorICovCisjZGVmaW5lIHN6X3hTZWdtZW50IDgKKyNkZWZpbmUgc3pfeFBvaW50IDQKKyNkZWZpbmUgc3pfeFJlY3RhbmdsZSA4CisjZGVmaW5lIHN6X3hBcmMgMTIKKyNkZWZpbmUgc3pfeENvbm5DbGllbnRQcmVmaXggMTIKKyNkZWZpbmUgc3pfeENvbm5TZXR1cFByZWZpeCA4CisjZGVmaW5lIHN6X3hDb25uU2V0dXAgMzIKKyNkZWZpbmUgc3pfeFBpeG1hcEZvcm1hdCA4CisjZGVmaW5lIHN6X3hEZXB0aCA4CisjZGVmaW5lIHN6X3hWaXN1YWxUeXBlIDI0CisjZGVmaW5lIHN6X3hXaW5kb3dSb290IDQwCisjZGVmaW5lIHN6X3hUaW1lY29vcmQgOAorI2RlZmluZSBzel94SG9zdEVudHJ5IDQKKyNkZWZpbmUgc3pfeENoYXJJbmZvIDEyCisjZGVmaW5lIHN6X3hGb250UHJvcCA4CisjZGVmaW5lIHN6X3hUZXh0RWx0IDIKKyNkZWZpbmUgc3pfeENvbG9ySXRlbSAxMgorI2RlZmluZSBzel94cmdiIDgKKyNkZWZpbmUgc3pfeEdlbmVyaWNSZXBseSAzMgorI2RlZmluZSBzel94R2V0V2luZG93QXR0cmlidXRlc1JlcGx5IDQ0CisjZGVmaW5lIHN6X3hHZXRHZW9tZXRyeVJlcGx5IDMyCisjZGVmaW5lIHN6X3hRdWVyeVRyZWVSZXBseSAzMgorI2RlZmluZSBzel94SW50ZXJuQXRvbVJlcGx5IDMyCisjZGVmaW5lIHN6X3hHZXRBdG9tTmFtZVJlcGx5IDMyCisjZGVmaW5lIHN6X3hHZXRQcm9wZXJ0eVJlcGx5IDMyCisjZGVmaW5lIHN6X3hMaXN0UHJvcGVydGllc1JlcGx5IDMyCisjZGVmaW5lIHN6X3hHZXRTZWxlY3Rpb25Pd25lclJlcGx5IDMyCisjZGVmaW5lIHN6X3hHcmFiUG9pbnRlclJlcGx5IDMyCisjZGVmaW5lIHN6X3hRdWVyeVBvaW50ZXJSZXBseSAzMgorI2RlZmluZSBzel94R2V0TW90aW9uRXZlbnRzUmVwbHkgMzIKKyNkZWZpbmUgc3pfeFRyYW5zbGF0ZUNvb3Jkc1JlcGx5IDMyCisjZGVmaW5lIHN6X3hHZXRJbnB1dEZvY3VzUmVwbHkgMzIKKyNkZWZpbmUgc3pfeFF1ZXJ5S2V5bWFwUmVwbHkgNDAKKyNkZWZpbmUgc3pfeFF1ZXJ5Rm9udFJlcGx5IDYwCisjZGVmaW5lIHN6X3hRdWVyeVRleHRFeHRlbnRzUmVwbHkgMzIKKyNkZWZpbmUgc3pfeExpc3RGb250c1JlcGx5IDMyCisjZGVmaW5lIHN6X3hHZXRGb250UGF0aFJlcGx5IDMyCisjZGVmaW5lIHN6X3hHZXRJbWFnZVJlcGx5IDMyCisjZGVmaW5lIHN6X3hMaXN0SW5zdGFsbGVkQ29sb3JtYXBzUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEFsbG9jQ29sb3JSZXBseSAzMgorI2RlZmluZSBzel94QWxsb2NOYW1lZENvbG9yUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEFsbG9jQ29sb3JDZWxsc1JlcGx5IDMyCisjZGVmaW5lIHN6X3hBbGxvY0NvbG9yUGxhbmVzUmVwbHkgMzIKKyNkZWZpbmUgc3pfeFF1ZXJ5Q29sb3JzUmVwbHkgMzIKKyNkZWZpbmUgc3pfeExvb2t1cENvbG9yUmVwbHkgMzIKKyNkZWZpbmUgc3pfeFF1ZXJ5QmVzdFNpemVSZXBseSAzMgorI2RlZmluZSBzel94UXVlcnlFeHRlbnNpb25SZXBseSAzMgorI2RlZmluZSBzel94TGlzdEV4dGVuc2lvbnNSZXBseSAzMgorI2RlZmluZSBzel94U2V0TWFwcGluZ1JlcGx5IDMyCisjZGVmaW5lIHN6X3hHZXRLZXlib2FyZENvbnRyb2xSZXBseSA1MgorI2RlZmluZSBzel94R2V0UG9pbnRlckNvbnRyb2xSZXBseSAzMgorI2RlZmluZSBzel94R2V0U2NyZWVuU2F2ZXJSZXBseSAzMgorI2RlZmluZSBzel94TGlzdEhvc3RzUmVwbHkgMzIKKyNkZWZpbmUgc3pfeFNldE1vZGlmaWVyTWFwcGluZ1JlcGx5IDMyCisjZGVmaW5lIHN6X3hFcnJvciAzMgorI2RlZmluZSBzel94RXZlbnQgMzIKKyNkZWZpbmUgc3pfeEtleW1hcEV2ZW50IDMyCisjZGVmaW5lIHN6X3hSZXEgNAorI2RlZmluZSBzel94UmVzb3VyY2VSZXEgOAorI2RlZmluZSBzel94Q3JlYXRlV2luZG93UmVxIDMyCisjZGVmaW5lIHN6X3hDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzUmVxIDEyCisjZGVmaW5lIHN6X3hDaGFuZ2VTYXZlU2V0UmVxIDgKKyNkZWZpbmUgc3pfeFJlcGFyZW50V2luZG93UmVxIDE2CisjZGVmaW5lIHN6X3hDb25maWd1cmVXaW5kb3dSZXEgMTIKKyNkZWZpbmUgc3pfeENpcmN1bGF0ZVdpbmRvd1JlcSA4CisjZGVmaW5lIHN6X3hJbnRlcm5BdG9tUmVxIDgKKyNkZWZpbmUgc3pfeENoYW5nZVByb3BlcnR5UmVxIDI0CisjZGVmaW5lIHN6X3hEZWxldGVQcm9wZXJ0eVJlcSAxMgorI2RlZmluZSBzel94R2V0UHJvcGVydHlSZXEgMjQKKyNkZWZpbmUgc3pfeFNldFNlbGVjdGlvbk93bmVyUmVxIDE2CisjZGVmaW5lIHN6X3hDb252ZXJ0U2VsZWN0aW9uUmVxIDI0CisjZGVmaW5lIHN6X3hTZW5kRXZlbnRSZXEgNDQKKyNkZWZpbmUgc3pfeEdyYWJQb2ludGVyUmVxIDI0CisjZGVmaW5lIHN6X3hHcmFiQnV0dG9uUmVxIDI0CisjZGVmaW5lIHN6X3hVbmdyYWJCdXR0b25SZXEgMTIKKyNkZWZpbmUgc3pfeENoYW5nZUFjdGl2ZVBvaW50ZXJHcmFiUmVxIDE2CisjZGVmaW5lIHN6X3hHcmFiS2V5Ym9hcmRSZXEgMTYKKyNkZWZpbmUgc3pfeEdyYWJLZXlSZXEgMTYKKyNkZWZpbmUgc3pfeFVuZ3JhYktleVJlcSAxMgorI2RlZmluZSBzel94QWxsb3dFdmVudHNSZXEgOAorI2RlZmluZSBzel94R2V0TW90aW9uRXZlbnRzUmVxIDE2CisjZGVmaW5lIHN6X3hUcmFuc2xhdGVDb29yZHNSZXEgMTYKKyNkZWZpbmUgc3pfeFdhcnBQb2ludGVyUmVxIDI0CisjZGVmaW5lIHN6X3hTZXRJbnB1dEZvY3VzUmVxIDEyCisjZGVmaW5lIHN6X3hPcGVuRm9udFJlcSAxMgorI2RlZmluZSBzel94UXVlcnlUZXh0RXh0ZW50c1JlcSA4CisjZGVmaW5lIHN6X3hMaXN0Rm9udHNSZXEgOAorI2RlZmluZSBzel94U2V0Rm9udFBhdGhSZXEgOAorI2RlZmluZSBzel94Q3JlYXRlUGl4bWFwUmVxIDE2CisjZGVmaW5lIHN6X3hDcmVhdGVHQ1JlcSAxNgorI2RlZmluZSBzel94Q2hhbmdlR0NSZXEgMTIKKyNkZWZpbmUgc3pfeENvcHlHQ1JlcSAxNgorI2RlZmluZSBzel94U2V0RGFzaGVzUmVxIDEyCisjZGVmaW5lIHN6X3hTZXRDbGlwUmVjdGFuZ2xlc1JlcSAxMgorI2RlZmluZSBzel94Q29weUFyZWFSZXEgMjgKKyNkZWZpbmUgc3pfeENvcHlQbGFuZVJlcSAzMgorI2RlZmluZSBzel94UG9seVBvaW50UmVxIDEyCisjZGVmaW5lIHN6X3hQb2x5U2VnbWVudFJlcSAxMgorI2RlZmluZSBzel94RmlsbFBvbHlSZXEgMTYKKyNkZWZpbmUgc3pfeFB1dEltYWdlUmVxIDI0CisjZGVmaW5lIHN6X3hHZXRJbWFnZVJlcSAyMAorI2RlZmluZSBzel94UG9seVRleHRSZXEgMTYKKyNkZWZpbmUgc3pfeEltYWdlVGV4dFJlcSAxNgorI2RlZmluZSBzel94Q3JlYXRlQ29sb3JtYXBSZXEgMTYKKyNkZWZpbmUgc3pfeENvcHlDb2xvcm1hcEFuZEZyZWVSZXEgMTIKKyNkZWZpbmUgc3pfeEFsbG9jQ29sb3JSZXEgMTYKKyNkZWZpbmUgc3pfeEFsbG9jTmFtZWRDb2xvclJlcSAxMgorI2RlZmluZSBzel94QWxsb2NDb2xvckNlbGxzUmVxIDEyCisjZGVmaW5lIHN6X3hBbGxvY0NvbG9yUGxhbmVzUmVxIDE2CisjZGVmaW5lIHN6X3hGcmVlQ29sb3JzUmVxIDEyCisjZGVmaW5lIHN6X3hTdG9yZUNvbG9yc1JlcSA4CisjZGVmaW5lIHN6X3hTdG9yZU5hbWVkQ29sb3JSZXEgMTYKKyNkZWZpbmUgc3pfeFF1ZXJ5Q29sb3JzUmVxIDgKKyNkZWZpbmUgc3pfeExvb2t1cENvbG9yUmVxIDEyCisjZGVmaW5lIHN6X3hDcmVhdGVDdXJzb3JSZXEgMzIKKyNkZWZpbmUgc3pfeENyZWF0ZUdseXBoQ3Vyc29yUmVxIDMyCisjZGVmaW5lIHN6X3hSZWNvbG9yQ3Vyc29yUmVxIDIwCisjZGVmaW5lIHN6X3hRdWVyeUJlc3RTaXplUmVxIDEyCisjZGVmaW5lIHN6X3hRdWVyeUV4dGVuc2lvblJlcSA4CisjZGVmaW5lIHN6X3hDaGFuZ2VLZXlib2FyZENvbnRyb2xSZXEgOAorI2RlZmluZSBzel94QmVsbFJlcSA0CisjZGVmaW5lIHN6X3hDaGFuZ2VQb2ludGVyQ29udHJvbFJlcSAxMgorI2RlZmluZSBzel94U2V0U2NyZWVuU2F2ZXJSZXEgMTIKKyNkZWZpbmUgc3pfeENoYW5nZUhvc3RzUmVxIDgKKyNkZWZpbmUgc3pfeExpc3RIb3N0c1JlcSA0CisjZGVmaW5lIHN6X3hDaGFuZ2VNb2RlUmVxIDQKKyNkZWZpbmUgc3pfeFJvdGF0ZVByb3BlcnRpZXNSZXEgMTIKKyNkZWZpbmUgc3pfeFJlcGx5IDMyCisjZGVmaW5lIHN6X3hHcmFiS2V5Ym9hcmRSZXBseSAzMgorI2RlZmluZSBzel94TGlzdEZvbnRzV2l0aEluZm9SZXBseSA2MAorI2RlZmluZSBzel94U2V0UG9pbnRlck1hcHBpbmdSZXBseSAzMgorI2RlZmluZSBzel94R2V0S2V5Ym9hcmRNYXBwaW5nUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEdldFBvaW50ZXJNYXBwaW5nUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEdldE1vZGlmaWVyTWFwcGluZ1JlcGx5IDMyCisjZGVmaW5lIHN6X3hMaXN0Rm9udHNXaXRoSW5mb1JlcSA4CisjZGVmaW5lIHN6X3hQb2x5TGluZVJlcSAxMgorI2RlZmluZSBzel94UG9seUFyY1JlcSAxMgorI2RlZmluZSBzel94UG9seVJlY3RhbmdsZVJlcSAxMgorI2RlZmluZSBzel94UG9seUZpbGxSZWN0YW5nbGVSZXEgMTIKKyNkZWZpbmUgc3pfeFBvbHlGaWxsQXJjUmVxIDEyCisjZGVmaW5lIHN6X3hQb2x5VGV4dDhSZXEgMTYKKyNkZWZpbmUgc3pfeFBvbHlUZXh0MTZSZXEgMTYKKyNkZWZpbmUgc3pfeEltYWdlVGV4dDhSZXEgMTYKKyNkZWZpbmUgc3pfeEltYWdlVGV4dDE2UmVxIDE2CisjZGVmaW5lIHN6X3hTZXRQb2ludGVyTWFwcGluZ1JlcSA0CisjZGVmaW5lIHN6X3hGb3JjZVNjcmVlblNhdmVyUmVxIDQKKyNkZWZpbmUgc3pfeFNldENsb3NlRG93bk1vZGVSZXEgNAorI2RlZmluZSBzel94Q2xlYXJBcmVhUmVxIDE2CisjZGVmaW5lIHN6X3hTZXRBY2Nlc3NDb250cm9sUmVxIDQKKyNkZWZpbmUgc3pfeEdldEtleWJvYXJkTWFwcGluZ1JlcSA4CisjZGVmaW5lIHN6X3hTZXRNb2RpZmllck1hcHBpbmdSZXEgNAorI2RlZmluZSBzel94UHJvcEljb25TaXplIDI0CisjZGVmaW5lIHN6X3hDaGFuZ2VLZXlib2FyZE1hcHBpbmdSZXEgOAorCisKKy8qIEZvciB0aGUgcHVycG9zZSBvZiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZSwKK3dlIG11c3QgcmVkZWZpbmUgdGhlIGZvbGxvd2luZyB0eXBlcyBpbiB0ZXJtcyBvZiBYbWQuaCdzIHR5cGVzLCB3aGljaCBtYXkKK2luY2x1ZGUgYml0IGZpZWxkcy4gIEFsbCBvZiB0aGVzZSBhcmUgI3VuZGVmJ2QgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUsCityZXN0b3JpbmcgdGhlIGRlZmluaXRpb25zIGluIFguaC4gICovCisKKyNkZWZpbmUgV2luZG93IENBUkQzMgorI2RlZmluZSBEcmF3YWJsZSBDQVJEMzIKKyNkZWZpbmUgRm9udCBDQVJEMzIKKyNkZWZpbmUgUGl4bWFwIENBUkQzMgorI2RlZmluZSBDdXJzb3IgQ0FSRDMyCisjZGVmaW5lIENvbG9ybWFwIENBUkQzMgorI2RlZmluZSBHQ29udGV4dCBDQVJEMzIKKyNkZWZpbmUgQXRvbSBDQVJEMzIKKyNkZWZpbmUgVmlzdWFsSUQgQ0FSRDMyCisjZGVmaW5lIFRpbWUgQ0FSRDMyCisjZGVmaW5lIEtleUNvZGUgQ0FSRDgKKyNkZWZpbmUgS2V5U3ltIENBUkQzMgorCisjZGVmaW5lIFhfVENQX1BPUlQgNjAwMCAgICAgLyogYWRkIGRpc3BsYXkgbnVtYmVyICovCisKKyNkZWZpbmUgeFRydWUgICAgICAgIDEKKyNkZWZpbmUgeEZhbHNlICAgICAgIDAKKworCit0eXBlZGVmIENBUkQxNiBLZXlCdXRNYXNrOworCisvKioqKioqKioqKioqKioqKiogCisgICBjb25uZWN0aW9uIHNldHVwIHN0cnVjdHVyZS4gIFRoaXMgaXMgZm9sbG93ZWQgYnkKKyAgIG51bVJvb3RzIHhXaW5kb3dSb290IHN0cnVjdHMuCisqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CWJ5dGVPcmRlcjsKKyAgICBCWVRFCXBhZDsKKyAgICBDQVJEMTYJbWFqb3JWZXJzaW9uIEIxNiwgbWlub3JWZXJzaW9uIEIxNjsKKyAgICBDQVJEMTYJbmJ5dGVzQXV0aFByb3RvIEIxNjsJLyogQXV0aG9yaXphdGlvbiBwcm90b2NvbCAqLworICAgIENBUkQxNgluYnl0ZXNBdXRoU3RyaW5nIEIxNjsJLyogQXV0aG9yaXphdGlvbiBzdHJpbmcgKi8KKyAgICBDQVJEMTYJcGFkMiBCMTY7Cit9IHhDb25uQ2xpZW50UHJlZml4OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICAgICAgICAgc3VjY2VzczsKKyAgICBCWVRFICAgICAgICAgICBsZW5ndGhSZWFzb247IC8qbnVtIGJ5dGVzIGluIHN0cmluZyBmb2xsb3dpbmcgaWYgZmFpbHVyZSAqLworICAgIENBUkQxNiAgICAgICAgIG1ham9yVmVyc2lvbiBCMTYsIAorICAgICAgICAgICAgICAgICAgIG1pbm9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2ICAgICAgICAgbGVuZ3RoIEIxNjsgIC8qIDEvNCBhZGRpdGlvbmFsIGJ5dGVzIGluIHNldHVwIGluZm8gKi8KK30geENvbm5TZXR1cFByZWZpeDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDMyICAgICAgICAgcmVsZWFzZSBCMzI7CisgICAgQ0FSRDMyICAgICAgICAgcmlkQmFzZSBCMzIsIAorICAgICAgICAgICAgICAgICAgIHJpZE1hc2sgQjMyOworICAgIENBUkQzMiAgICAgICAgIG1vdGlvbkJ1ZmZlclNpemUgQjMyOworICAgIENBUkQxNiAgICAgICAgIG5ieXRlc1ZlbmRvciBCMTY7ICAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdmVuZG9yIHN0cmluZyAqLworICAgIENBUkQxNiAgICAgICAgIG1heFJlcXVlc3RTaXplIEIxNjsKKyAgICBDQVJEOCAgICAgICAgICBudW1Sb290czsgICAgICAgICAgLyogbnVtYmVyIG9mIHJvb3RzIHN0cnVjdHMgdG8gZm9sbG93ICovCisgICAgQ0FSRDggICAgICAgICAgbnVtRm9ybWF0czsgICAgICAgIC8qIG51bWJlciBvZiBwaXhtYXAgZm9ybWF0cyAqLworICAgIENBUkQ4ICAgICAgICAgIGltYWdlQnl0ZU9yZGVyOyAgICAgICAgLyogTFNCRmlyc3QsIE1TQkZpcnN0ICovCisgICAgQ0FSRDggICAgICAgICAgYml0bWFwQml0T3JkZXI7ICAgICAgICAvKiBMZWFzdFNpZ25pZmljYW50LCBNb3N0U2lnbi4uLiovCisgICAgQ0FSRDggICAgICAgICAgYml0bWFwU2NhbmxpbmVVbml0LCAgICAgLyogOCwgMTYsIDMyICovCisgICAgICAgICAgICAgICAgICAgYml0bWFwU2NhbmxpbmVQYWQ7ICAgICAvKiA4LCAxNiwgMzIgKi8KKyAgICBLZXlDb2RlCSAgIG1pbktleUNvZGUsIG1heEtleUNvZGU7CisgICAgQ0FSRDMyCSAgIHBhZDIgQjMyOworfSB4Q29ublNldHVwOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICAgICAgICAgZGVwdGg7CisgICAgQ0FSRDggICAgICAgICAgYml0c1BlclBpeGVsOworICAgIENBUkQ4ICAgICAgICAgIHNjYW5MaW5lUGFkOworICAgIENBUkQ4ICAgICAgICAgIHBhZDE7CisgICAgQ0FSRDMyCSAgIHBhZDIgQjMyOworfSB4UGl4bWFwRm9ybWF0OworCisvKiB3aW5kb3cgcm9vdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggCWRlcHRoOworICAgIENBUkQ4IAlwYWQxOworICAgIENBUkQxNgluVmlzdWFscyBCMTY7ICAvKiBudW1iZXIgb2YgeFZpc3VhbFR5cGUgc3RydWN0dXJlcyBmb2xsb3dpbmcgKi8KKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgfSB4RGVwdGg7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBWaXN1YWxJRCB2aXN1YWxJRCBCMzI7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4IGNfY2xhc3M7CisjZWxzZQorICAgIENBUkQ4IGNsYXNzOworI2VuZGlmCisgICAgQ0FSRDggYml0c1BlclJHQjsKKyAgICBDQVJEMTYgY29sb3JtYXBFbnRyaWVzIEIxNjsKKyAgICBDQVJEMzIgcmVkTWFzayBCMzIsIGdyZWVuTWFzayBCMzIsIGJsdWVNYXNrIEIzMjsKKyAgICBDQVJEMzIgcGFkIEIzMjsKKyAgICB9IHhWaXN1YWxUeXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgV2luZG93ICAgICAgICAgd2luZG93SWQgQjMyOworICAgIENvbG9ybWFwICAgICAgIGRlZmF1bHRDb2xvcm1hcCBCMzI7CisgICAgQ0FSRDMyICAgICAgICAgd2hpdGVQaXhlbCBCMzIsIGJsYWNrUGl4ZWwgQjMyOworICAgIENBUkQzMiAgICAgICAgIGN1cnJlbnRJbnB1dE1hc2sgQjMyOyAgIAorICAgIENBUkQxNiAgICAgICAgIHBpeFdpZHRoIEIxNiwgcGl4SGVpZ2h0IEIxNjsKKyAgICBDQVJEMTYgICAgICAgICBtbVdpZHRoIEIxNiwgbW1IZWlnaHQgQjE2OworICAgIENBUkQxNiAgICAgICAgIG1pbkluc3RhbGxlZE1hcHMgQjE2LCBtYXhJbnN0YWxsZWRNYXBzIEIxNjsKKyAgICBWaXN1YWxJRCAgICAgICByb290VmlzdWFsSUQgQjMyOworICAgIENBUkQ4ICAgICAgICAgIGJhY2tpbmdTdG9yZTsKKyAgICBCT09MICAgICAgICAgICBzYXZlVW5kZXJzOworICAgIENBUkQ4ICAgICAgICAgIHJvb3REZXB0aDsKKyAgICBDQVJEOCAgICAgICAgICBuRGVwdGhzOyAgLyogbnVtYmVyIG9mIHhEZXB0aCBzdHJ1Y3R1cmVzIGZvbGxvd2luZyAqLworfSB4V2luZG93Um9vdDsKKwwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdHJ1Y3R1cmUgRGVmbnMKKyAqICAgU3RydWN0dXJlcyBuZWVkZWQgZm9yIHJlcGxpZXMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFVzZWQgaW4gR2V0TW90aW9uRXZlbnRzICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEMzIgdGltZSBCMzI7CisgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworfSB4VGltZWNvb3JkOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggZmFtaWx5OworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworfSB4SG9zdEVudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgSU5UMTYgbGVmdFNpZGVCZWFyaW5nIEIxNiwKKwkgIHJpZ2h0U2lkZUJlYXJpbmcgQjE2LAorCSAgY2hhcmFjdGVyV2lkdGggQjE2LAorCSAgYXNjZW50IEIxNiwKKwkgIGRlc2NlbnQgQjE2OworICAgIENBUkQxNiBhdHRyaWJ1dGVzIEIxNjsKK30geENoYXJJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQXRvbSBuYW1lIEIzMjsKKyAgICBDQVJEMzIgdmFsdWUgQjMyOworfSB4Rm9udFByb3A7CisKKy8qCisgKiBub24tYWxpZ25lZCBiaWctZW5kaWFuIGZvbnQgSUQgZm9sbG93cyB0aGlzIHN0cnVjdAorICovCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAvKiBmb2xsb3dlZCBieSBzdHJpbmcgKi8KKyAgICBDQVJEOCBsZW47CS8qIG51bWJlciBvZiAqY2hhcmFjdGVycyogaW4gc3RyaW5nLCBvciBGb250Q2hhbmdlICgyNTUpCisJCSAgIGZvciBmb250IGNoYW5nZSwgb3IgMCBpZiBqdXN0IGRlbHRhIGdpdmVuICovCisgICAgSU5UOCBkZWx0YTsKK30geFRleHRFbHQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgCisgICAgQ0FSRDMyIHBpeGVsIEIzMjsKKyAgICBDQVJEMTYgcmVkIEIxNiwgZ3JlZW4gQjE2LCBibHVlIEIxNjsKKyAgICBDQVJEOCBmbGFnczsgIC8qIERvUmVkLCBEb0dyZWVuLCBEb0JsdWUgYm9vbGVhbnMgKi8KKyAgICBDQVJEOCBwYWQ7Cit9IHhDb2xvckl0ZW07CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQxNiByZWQgQjE2LCBncmVlbiBCMTYsIGJsdWUgQjE2LCBwYWQgQjE2OworfSB4cmdiOworCit0eXBlZGVmIENBUkQ4IEtFWUNPREU7CisMCisKKy8qKioqKioqKioqKioqKioqKgorICogWFJlcDoKKyAqICAgIG1lYW50IHRvIGJlIDMyIGJ5dGUgcXVhbnRpdHkgCisgKioqKioqKioqKioqKioqKiovCisKKy8qIEdlbmVyaWNSZXBseSBpcyB0aGUgY29tbW9uIGZvcm1hdCBvZiBhbGwgcmVwbGllcy4gIFRoZSAiZGF0YSIgaXRlbXMKKyAgIGFyZSBzcGVjaWZpYyB0byBlYWNoIGluZGl2aWR1YWwgcmVwbHkgdHlwZS4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgewkKKyAgICBCWVRFIHR5cGU7ICAgICAgICAgICAgICAvKiBYX1JlcGx5ICovCisgICAgQllURSBkYXRhMTsgICAgICAgICAgICAgLyogZGVwZW5kcyBvbiByZXBseSB0eXBlICovCisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsgIC8qIG9mIGxhc3QgcmVxdWVzdCByZWNlaXZlZCBieSBzZXJ2ZXIgKi8KKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgICAgICAvKiA0IGJ5dGUgcXVhbnRpdGllcyBiZXlvbmQgc2l6ZSBvZiBHZW5lcmljUmVwbHkgKi8KKyAgICBDQVJEMzIgZGF0YTAwIEIzMjsKKyAgICBDQVJEMzIgZGF0YTAxIEIzMjsKKyAgICBDQVJEMzIgZGF0YTAyIEIzMjsKKyAgICBDQVJEMzIgZGF0YTAzIEIzMjsKKyAgICBDQVJEMzIgZGF0YTA0IEIzMjsKKyAgICBDQVJEMzIgZGF0YTA1IEIzMjsKKyAgICB9IHhHZW5lcmljUmVwbHk7CisKKy8qIEluZGl2aWR1YWwgcmVwbHkgZm9ybWF0cy4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOCBiYWNraW5nU3RvcmU7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsJLyogTk9UIDA7IHRoaXMgaXMgYW4gZXh0cmEtbGFyZ2UgcmVwbHkgKi8KKyAgICBWaXN1YWxJRCB2aXN1YWxJRCBCMzI7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQxNiBjX2NsYXNzIEIxNjsKKyNlbHNlCisgICAgQ0FSRDE2IGNsYXNzIEIxNjsKKyNlbmRpZgorICAgIENBUkQ4IGJpdEdyYXZpdHk7CisgICAgQ0FSRDggd2luR3Jhdml0eTsKKyAgICBDQVJEMzIgYmFja2luZ0JpdFBsYW5lcyBCMzI7CisgICAgQ0FSRDMyIGJhY2tpbmdQaXhlbCBCMzI7CisgICAgQk9PTCBzYXZlVW5kZXI7CisgICAgQk9PTCBtYXBJbnN0YWxsZWQ7CisgICAgQ0FSRDggbWFwU3RhdGU7CisgICAgQk9PTCBvdmVycmlkZTsKKyAgICBDb2xvcm1hcCBjb2xvcm1hcCBCMzI7CisgICAgQ0FSRDMyIGFsbEV2ZW50TWFza3MgQjMyOworICAgIENBUkQzMiB5b3VyRXZlbnRNYXNrIEIzMjsKKyAgICBDQVJEMTYgZG9Ob3RQcm9wYWdhdGVNYXNrIEIxNjsKKyAgICBDQVJEMTYgcGFkIEIxNjsKKyAgICB9IHhHZXRXaW5kb3dBdHRyaWJ1dGVzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAgLyogWF9SZXBseSAqLworICAgIENBUkQ4IGRlcHRoOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiAwICovCisgICAgV2luZG93IHJvb3QgQjMyOworICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKyAgICBDQVJEMTYgd2lkdGggQjE2LCBoZWlnaHQgQjE2OworICAgIENBUkQxNiBib3JkZXJXaWR0aCBCMTY7CisgICAgQ0FSRDE2IHBhZDEgQjE2OworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgfSB4R2V0R2VvbWV0cnlSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBXaW5kb3cgcm9vdCBCMzIsIHBhcmVudCBCMzI7CisgICAgQ0FSRDE2IG5DaGlsZHJlbiBCMTY7CisgICAgQ0FSRDE2IHBhZDIgQjE2OworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIH0geFF1ZXJ5VHJlZVJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAvKiAwICovCisgICAgQXRvbSBhdG9tIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIH0geEludGVybkF0b21SZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIG9mIGFkZGl0aW9uYWwgYnl0ZXMgKi8KKyAgICBDQVJEMTYgbmFtZUxlbmd0aCBCMTY7ICAvKiAjIG9mIGNoYXJhY3RlcnMgaW4gbmFtZSAqLworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geEdldEF0b21OYW1lUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggZm9ybWF0OworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7IC8qIG9mIGFkZGl0aW9uYWwgYnl0ZXMgKi8KKyAgICBBdG9tIHByb3BlcnR5VHlwZSBCMzI7CisgICAgQ0FSRDMyIGJ5dGVzQWZ0ZXIgQjMyOworICAgIENBUkQzMiBuSXRlbXMgQjMyOyAvKiAjIG9mIDgsIDE2LCBvciAzMi1iaXQgZW50aXRpZXMgaW4gcmVwbHkgKi8KKyAgICBDQVJEMzIgcGFkMSBCMzI7CisgICAgQ0FSRDMyIHBhZDIgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICB9IHhHZXRQcm9wZXJ0eVJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQxNiBuUHJvcGVydGllcyBCMTY7CisgICAgQ0FSRDE2IHBhZDIgQjE2OworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICBDQVJEMzIgcGFkNyBCMzI7CisgICAgfSB4TGlzdFByb3BlcnRpZXNSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBXaW5kb3cgb3duZXIgQjMyOworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgfSB4R2V0U2VsZWN0aW9uT3duZXJSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHN0YXR1czsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgLyogMCAqLworICAgIENBUkQzMiBwYWQxIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIH0geEdyYWJQb2ludGVyUmVwbHk7CisKK3R5cGVkZWYgeEdyYWJQb2ludGVyUmVwbHkgeEdyYWJLZXlib2FyZFJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIEJPT0wgc2FtZVNjcmVlbjsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgLyogMCAqLworICAgIFdpbmRvdyByb290IEIzMiwgY2hpbGQgQjMyOworICAgIElOVDE2IHJvb3RYIEIxNiwgcm9vdFkgQjE2LCB3aW5YIEIxNiwgd2luWSBCMTY7CisgICAgQ0FSRDE2IG1hc2sgQjE2OworICAgIENBUkQxNiBwYWQxIEIxNjsKKyAgICBDQVJEMzIgcGFkIEIzMjsKKyAgICB9IHhRdWVyeVBvaW50ZXJSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIgbkV2ZW50cyBCMzI7CisgICAgQ0FSRDMyIHBhZDIgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICB9IHhHZXRNb3Rpb25FdmVudHNSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCT09MIHNhbWVTY3JlZW47CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgLyogMCAqLworICAgIFdpbmRvdyBjaGlsZCBCMzI7CisgICAgSU5UMTYgZHN0WCBCMTYsIGRzdFkgQjE2OworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICB9IHhUcmFuc2xhdGVDb29yZHNSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOCByZXZlcnRUbzsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgLyogMCAqLworICAgIFdpbmRvdyBmb2N1cyBCMzI7CisgICAgQ0FSRDMyIHBhZDEgQjMyOworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICB9IHhHZXRJbnB1dEZvY3VzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiAyLCBOT1QgMDsgdGhpcyBpcyBhbiBleHRyYS1sYXJnZSByZXBseSAqLworICAgIEJZVEUgbWFwWzMyXTsKKyAgICB9IHhRdWVyeUtleW1hcFJlcGx5OworCisvKiBXYXJuaW5nOiB0aGlzIE1VU1QgbWF0Y2ggKHVwIHRvIGNvbXBvbmVudCByZW5hbWluZykgeExpc3RGb250c1dpdGhJbmZvUmVwbHkgKi8KK3R5cGVkZWYgc3RydWN0IF94UXVlcnlGb250UmVwbHkgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIGRlZmluaXRlbHkgPiAwLCBldmVuIGlmICJuQ2hhckluZm9zIiBpcyAwICovCisgICAgeENoYXJJbmZvIG1pbkJvdW5kczsgCisjaWZuZGVmIFdPUkQ2NAorICAgIENBUkQzMiB3YWxpZ24xIEIzMjsKKyNlbmRpZgorICAgIHhDaGFySW5mbyBtYXhCb3VuZHM7IAorI2lmbmRlZiBXT1JENjQKKyAgICBDQVJEMzIgd2FsaWduMiBCMzI7CisjZW5kaWYKKyAgICBDQVJEMTYgbWluQ2hhck9yQnl0ZTIgQjE2LCBtYXhDaGFyT3JCeXRlMiBCMTY7CisgICAgQ0FSRDE2IGRlZmF1bHRDaGFyIEIxNjsKKyAgICBDQVJEMTYgbkZvbnRQcm9wcyBCMTY7ICAvKiBmb2xsb3dlZCBieSB0aGlzIG1hbnkgeEZvbnRQcm9wIHN0cnVjdHVyZXMgKi8KKyAgICBDQVJEOCBkcmF3RGlyZWN0aW9uOworICAgIENBUkQ4IG1pbkJ5dGUxLCBtYXhCeXRlMTsKKyAgICBCT09MIGFsbENoYXJzRXhpc3Q7CisgICAgSU5UMTYgZm9udEFzY2VudCBCMTYsIGZvbnREZXNjZW50IEIxNjsKKyAgICBDQVJEMzIgbkNoYXJJbmZvcyBCMzI7IC8qIGZvbGxvd2VkIGJ5IHRoaXMgbWFueSB4Q2hhckluZm8gc3RydWN0dXJlcyAqLworfSB4UXVlcnlGb250UmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggZHJhd0RpcmVjdGlvbjsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgLyogMCAqLworICAgIElOVDE2IGZvbnRBc2NlbnQgQjE2LCBmb250RGVzY2VudCBCMTY7CisgICAgSU5UMTYgb3ZlcmFsbEFzY2VudCBCMTYsIG92ZXJhbGxEZXNjZW50IEIxNjsKKyAgICBJTlQzMiBvdmVyYWxsV2lkdGggQjMyLCBvdmVyYWxsTGVmdCBCMzIsIG92ZXJhbGxSaWdodCBCMzI7CisgICAgQ0FSRDMyIHBhZCBCMzI7CisgICAgfSB4UXVlcnlUZXh0RXh0ZW50c1JlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQxNiBuRm9udHMgQjE2OworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geExpc3RGb250c1JlcGx5OworCisvKiBXYXJuaW5nOiB0aGlzIE1VU1QgbWF0Y2ggKHVwIHRvIGNvbXBvbmVudCByZW5hbWluZykgeFF1ZXJ5Rm9udFJlcGx5ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4IG5hbWVMZW5ndGg7ICAvKiAwIGluZGljYXRlcyBlbmQtb2YtcmVwbHktc2VxdWVuY2UgKi8KKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgLyogZGVmaW5pdGVseSA+IDAsIGV2ZW4gaWYgIm5hbWVMZW5ndGgiIGlzIDAgKi8KKyAgICB4Q2hhckluZm8gbWluQm91bmRzOyAKKyNpZm5kZWYgV09SRDY0CisgICAgQ0FSRDMyIHdhbGlnbjEgQjMyOworI2VuZGlmCisgICAgeENoYXJJbmZvIG1heEJvdW5kczsgCisjaWZuZGVmIFdPUkQ2NAorICAgIENBUkQzMiB3YWxpZ24yIEIzMjsKKyNlbmRpZgorICAgIENBUkQxNiBtaW5DaGFyT3JCeXRlMiBCMTYsIG1heENoYXJPckJ5dGUyIEIxNjsKKyAgICBDQVJEMTYgZGVmYXVsdENoYXIgQjE2OworICAgIENBUkQxNiBuRm9udFByb3BzIEIxNjsgIC8qIGZvbGxvd2VkIGJ5IHRoaXMgbWFueSB4Rm9udFByb3Agc3RydWN0dXJlcyAqLworICAgIENBUkQ4IGRyYXdEaXJlY3Rpb247CisgICAgQ0FSRDggbWluQnl0ZTEsIG1heEJ5dGUxOworICAgIEJPT0wgYWxsQ2hhcnNFeGlzdDsKKyAgICBJTlQxNiBmb250QXNjZW50IEIxNiwgZm9udERlc2NlbnQgQjE2OworICAgIENBUkQzMiBuUmVwbGllcyBCMzI7ICAgLyogaGludCBhcyB0byBob3cgbWFueSBtb3JlIHJlcGxpZXMgbWlnaHQgYmUgY29taW5nICovCit9IHhMaXN0Rm9udHNXaXRoSW5mb1JlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQxNiBuUGF0aHMgQjE2OworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geEdldEZvbnRQYXRoUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggZGVwdGg7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBWaXN1YWxJRCB2aXN1YWwgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICBDQVJEMzIgcGFkNyBCMzI7CisgICAgfSB4R2V0SW1hZ2VSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgbkNvbG9ybWFwcyBCMTY7CisgICAgQ0FSRDE2IHBhZDIgQjE2OworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICBDQVJEMzIgcGFkNyBCMzI7CisgICAgfSB4TGlzdEluc3RhbGxlZENvbG9ybWFwc1JlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAgLyogMCAqLworICAgIENBUkQxNiByZWQgQjE2LCBncmVlbiBCMTYsIGJsdWUgQjE2OworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGl4ZWwgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIH0geEFsbG9jQ29sb3JSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgLyogMCAqLworICAgIENBUkQzMiBwaXhlbCBCMzI7CisgICAgQ0FSRDE2IGV4YWN0UmVkIEIxNiwgZXhhY3RHcmVlbiBCMTYsIGV4YWN0Qmx1ZSBCMTY7CisgICAgQ0FSRDE2IHNjcmVlblJlZCBCMTYsIHNjcmVlbkdyZWVuIEIxNiwgc2NyZWVuQmx1ZSBCMTY7CisgICAgQ0FSRDMyIHBhZDIgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICB9IHhBbGxvY05hbWVkQ29sb3JSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgblBpeGVscyBCMTYsIG5NYXNrcyBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhBbGxvY0NvbG9yQ2VsbHNSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQxNiBuUGl4ZWxzIEIxNjsKKyAgICBDQVJEMTYgcGFkMiBCMTY7CisgICAgQ0FSRDMyIHJlZE1hc2sgQjMyLCBncmVlbk1hc2sgQjMyLCBibHVlTWFzayBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICB9IHhBbGxvY0NvbG9yUGxhbmVzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7IC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgbkNvbG9ycyBCMTY7CisgICAgQ0FSRDE2IHBhZDIgQjE2OworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICBDQVJEMzIgcGFkNyBCMzI7CisgICAgfSB4UXVlcnlDb2xvcnNSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBDQVJEMTYgZXhhY3RSZWQgQjE2LCBleGFjdEdyZWVuIEIxNiwgZXhhY3RCbHVlIEIxNjsKKyAgICBDQVJEMTYgc2NyZWVuUmVkIEIxNiwgc2NyZWVuR3JlZW4gQjE2LCBzY3JlZW5CbHVlIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICB9IHhMb29rdXBDb2xvclJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgLyogMCAqLworICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhRdWVyeUJlc3RTaXplUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7IC8qIDAgKi8KKyAgICBCT09MICBwcmVzZW50OworICAgIENBUkQ4IG1ham9yX29wY29kZTsKKyAgICBDQVJEOCBmaXJzdF9ldmVudDsKKyAgICBDQVJEOCBmaXJzdF9lcnJvcjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geFF1ZXJ5RXh0ZW5zaW9uUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggbkV4dGVuc2lvbnM7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhMaXN0RXh0ZW5zaW9uc1JlcGx5OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFICAgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOCAgc3VjY2VzczsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geFNldE1hcHBpbmdSZXBseTsKK3R5cGVkZWYgeFNldE1hcHBpbmdSZXBseSB4U2V0UG9pbnRlck1hcHBpbmdSZXBseTsKK3R5cGVkZWYgeFNldE1hcHBpbmdSZXBseSB4U2V0TW9kaWZpZXJNYXBwaW5nUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggbkVsdHM7ICAvKiBob3cgbWFueSBlbGVtZW50cyBkb2VzIHRoZSBtYXAgaGF2ZSAqLworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDMyIHBhZDIgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICBDQVJEMzIgcGFkNyBCMzI7CisgICAgfSB4R2V0UG9pbnRlck1hcHBpbmdSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsKKyAgICBDQVJEOCBrZXlTeW1zUGVyS2V5Q29kZTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworfSB4R2V0S2V5Ym9hcmRNYXBwaW5nUmVwbHk7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOworICAgIENBUkQ4IG51bUtleVBlck1vZGlmaWVyOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDMyIHBhZDEgQjMyOworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7Cit9IHhHZXRNb2RpZmllck1hcHBpbmdSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCT09MIGdsb2JhbEF1dG9SZXBlYXQ7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDUgKi8KKyAgICBDQVJEMzIgbGVkTWFzayBCMzI7CisgICAgQ0FSRDgga2V5Q2xpY2tQZXJjZW50LCBiZWxsUGVyY2VudDsKKyAgICBDQVJEMTYgYmVsbFBpdGNoIEIxNiwgYmVsbER1cmF0aW9uIEIxNjsKKyAgICBDQVJEMTYgcGFkIEIxNjsKKyAgICBCWVRFIG1hcFszMl07ICAvKiBiaXQgbWFza3Mgc3RhcnQgaGVyZSAqLworICAgIH0geEdldEtleWJvYXJkQ29udHJvbFJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgLyogMCAqLworICAgIENBUkQxNiBhY2NlbE51bWVyYXRvciBCMTYsIGFjY2VsRGVub21pbmF0b3IgQjE2OworICAgIENBUkQxNiB0aHJlc2hvbGQgQjE2OworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgfSB4R2V0UG9pbnRlckNvbnRyb2xSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBDQVJEMTYgdGltZW91dCBCMTYsIGludGVydmFsIEIxNjsKKyAgICBCT09MIHByZWZlckJsYW5raW5nOworICAgIEJPT0wgYWxsb3dFeHBvc3VyZXM7CisgICAgQ0FSRDE2IHBhZDIgQjE2OworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICB9IHhHZXRTY3JlZW5TYXZlclJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIEJPT0wgZW5hYmxlZDsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQxNiBuSG9zdHMgQjE2OworICAgIENBUkQxNiBwYWQxIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geExpc3RIb3N0c1JlcGx5OworCisMCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBYZXJyb3IKKyAqICAgIEFsbCBlcnJvcnMgIGFyZSAzMiBieXRlcyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgICAgICAgICAgICAgICAgICAvKiBYX0Vycm9yICovCisgICAgQllURSBlcnJvckNvZGU7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsgICAgICAgLyogdGhlIG50aCByZXF1ZXN0IGZyb20gdGhpcyBjbGllbnQgKi8KKyAgICBDQVJEMzIgcmVzb3VyY2VJRCBCMzI7CisgICAgQ0FSRDE2IG1pbm9yQ29kZSBCMTY7CisgICAgQ0FSRDggbWFqb3JDb2RlOworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworfSB4RXJyb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogeEV2ZW50CisgKiAgICBBbGwgZXZlbnRzIGFyZSAzMiBieXRlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfeEV2ZW50IHsKKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgQllURSB0eXBlOworCSAgICBCWVRFIGRldGFpbDsKKwkgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKwkgICAgfSB1OworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBUaW1lIHRpbWUgQjMyOworCSAgICBXaW5kb3cgcm9vdCBCMzIsIGV2ZW50IEIzMiwgY2hpbGQgQjMyOworCSAgICBJTlQxNiByb290WCBCMTYsIHJvb3RZIEIxNiwgZXZlbnRYIEIxNiwgZXZlbnRZIEIxNjsKKwkgICAgS2V5QnV0TWFzayBzdGF0ZSBCMTY7CisJICAgIEJPT0wgc2FtZVNjcmVlbjsJCQorCSAgICBCWVRFIHBhZDE7CisJfSBrZXlCdXR0b25Qb2ludGVyOworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworICAgICAgICAgICAgVGltZSB0aW1lIEIzMjsKKwkgICAgV2luZG93IHJvb3QgQjMyLCBldmVudCBCMzIsIGNoaWxkIEIzMjsKKwkgICAgSU5UMTYgcm9vdFggQjE2LCByb290WSBCMTYsIGV2ZW50WCBCMTYsIGV2ZW50WSBCMTY7CisJICAgIEtleUJ1dE1hc2sgc3RhdGUgQjE2OworCSAgICBCWVRFIG1vZGU7IAkJCS8qIHJlYWxseSBYTW9kZSAqLworCSAgICBCWVRFIGZsYWdzOwkJLyogc2FtZVNjcmVlbiBhbmQgZm9jdXMgYm9vbGVhbnMsIHBhY2tlZCB0b2dldGhlciAqLworI2RlZmluZSBFTEZsYWdGb2N1cyAgICAgICAgKDE8PDApCisjZGVmaW5lIEVMRmxhZ1NhbWVTY3JlZW4gICAoMTw8MSkKKwl9IGVudGVyTGVhdmU7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyB3aW5kb3cgQjMyOworCSAgICBCWVRFIG1vZGU7IAkJCS8qIHJlYWxseSBYTW9kZSAqLworCSAgICBCWVRFIHBhZDEsIHBhZDIsIHBhZDM7CisJfSBmb2N1czsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IHdpbmRvdyBCMzI7CisJICAgIENBUkQxNiB4IEIxNiwgeSBCMTYsIHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKwkgICAgQ0FSRDE2IGNvdW50IEIxNjsKKwkgICAgQ0FSRDE2IHBhZDIgQjE2OworCX0gZXhwb3NlOworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBEcmF3YWJsZSBkcmF3YWJsZSBCMzI7CisJICAgIENBUkQxNiB4IEIxNiwgeSBCMTYsIHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKwkgICAgQ0FSRDE2IG1pbm9yRXZlbnQgQjE2OworCSAgICBDQVJEMTYgY291bnQgQjE2OworCSAgICBCWVRFIG1ham9yRXZlbnQ7CisJICAgIEJZVEUgcGFkMSwgcGFkMiwgcGFkMzsKKwl9IGdyYXBoaWNzRXhwb3N1cmU7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIERyYXdhYmxlIGRyYXdhYmxlIEIzMjsKKwkgICAgQ0FSRDE2IG1pbm9yRXZlbnQgQjE2OworCSAgICBCWVRFIG1ham9yRXZlbnQ7CisJICAgIEJZVEUgYnBhZDsKKwl9IG5vRXhwb3N1cmU7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyB3aW5kb3cgQjMyOworCSAgICBDQVJEOCBzdGF0ZTsKKwkgICAgQllURSBwYWQxLCBwYWQyLCBwYWQzOworCX0gdmlzaWJpbGl0eTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IHBhcmVudCBCMzIsIHdpbmRvdyBCMzI7CisJICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKwkgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNiwgYm9yZGVyV2lkdGggQjE2OworCSAgICBCT09MIG92ZXJyaWRlOworCSAgICBCWVRFIGJwYWQ7CisgICAgICAgIH0gY3JlYXRlTm90aWZ5OworLyoKKyAqIFRoZSBldmVudCBmaWVsZHMgaW4gdGhlIHN0cnVjdHVyZXMgZm9yIERlc3Ryb3lOb3RpZnksIFVubWFwTm90aWZ5LAorICogTWFwTm90aWZ5LCBSZXBhcmVudE5vdGlmeSwgQ29uZmlndXJlTm90aWZ5LCBDaXJjdWxhdGVOb3RpZnksIEdyYXZpdHlOb3RpZnksCisgKiBtdXN0IGJlIGF0IHRoZSBzYW1lIG9mZnNldCBiZWNhdXNlIHNlcnZlciBpbnRlcm5hbCBjb2RlIGlzIGRlcGVuZGluZyB1cG9uCisgKiB0aGlzIHRvIHBhdGNoIHVwIHRoZSBldmVudHMgYmVmb3JlIHRoZXkgYXJlIGRlbGl2ZXJlZC4KKyAqIEFsc28gbm90ZSB0aGF0IE1hcFJlcXVlc3QsIENvbmZpZ3VyZVJlcXVlc3QgYW5kIENpcmN1bGF0ZVJlcXVlc3QgaGF2ZQorICogdGhlIHNhbWUgb2Zmc2V0IGZvciB0aGUgZXZlbnQgd2luZG93LgorICovCisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBldmVudCBCMzIsIHdpbmRvdyBCMzI7CisJfSBkZXN0cm95Tm90aWZ5OworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgZXZlbnQgQjMyLCB3aW5kb3cgQjMyOworCSAgICBCT09MIGZyb21Db25maWd1cmU7CisJICAgIEJZVEUgcGFkMSwgcGFkMiwgcGFkMzsKKyAgICAgICAgfSB1bm1hcE5vdGlmeTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IGV2ZW50IEIzMiwgd2luZG93IEIzMjsKKwkgICAgQk9PTCBvdmVycmlkZTsKKwkgICAgQllURSBwYWQxLCBwYWQyLCBwYWQzOworICAgICAgICB9IG1hcE5vdGlmeTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IHBhcmVudCBCMzIsIHdpbmRvdyBCMzI7CisgICAgICAgIH0gbWFwUmVxdWVzdDsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IGV2ZW50IEIzMiwgd2luZG93IEIzMiwgcGFyZW50IEIzMjsKKwkgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworCSAgICBCT09MIG92ZXJyaWRlOworCSAgICBCWVRFIHBhZDEsIHBhZDIsIHBhZDM7CisJfSByZXBhcmVudDsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IGV2ZW50IEIzMiwgd2luZG93IEIzMiwgYWJvdmVTaWJsaW5nIEIzMjsKKwkgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworCSAgICBDQVJEMTYgd2lkdGggQjE2LCBoZWlnaHQgQjE2LCBib3JkZXJXaWR0aCBCMTY7CisJICAgIEJPT0wgb3ZlcnJpZGU7CQkKKwkgICAgQllURSBicGFkOworCX0gY29uZmlndXJlTm90aWZ5OworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgcGFyZW50IEIzMiwgd2luZG93IEIzMiwgc2libGluZyBCMzI7CisJICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKwkgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNiwgYm9yZGVyV2lkdGggQjE2OworCSAgICBDQVJEMTYgdmFsdWVNYXNrIEIxNjsKKwkgICAgQ0FSRDMyIHBhZDEgQjMyOworCX0gY29uZmlndXJlUmVxdWVzdDsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IGV2ZW50IEIzMiwgd2luZG93IEIzMjsKKwkgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworCSAgICBDQVJEMzIgcGFkMSBCMzIsIHBhZDIgQjMyLCBwYWQzIEIzMiwgcGFkNCBCMzI7CisJfSBncmF2aXR5OworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgd2luZG93IEIzMjsKKwkgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKwl9IHJlc2l6ZVJlcXVlc3Q7CisJc3RydWN0IHsKKy8qIFRoZSBldmVudCBmaWVsZCBpbiB0aGUgY2lyY3VsYXRlIHJlY29yZCBpcyByZWFsbHkgdGhlIHBhcmVudCB3aGVuIHRoaXMKKyAgIGlzIHVzZWQgYXMgYSBDaXJjdWxhdGVSZXF1ZXN0IGluc3RlYWQgb2YgYSBDaXJjdWxhdGVOb3RpZnkgKi8KKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBldmVudCBCMzIsIHdpbmRvdyBCMzIsIHBhcmVudCBCMzI7CisJICAgIEJZVEUgcGxhY2U7CQkJLyogVG9wIG9yIEJvdHRvbSAqLworCSAgICBCWVRFIHBhZDEsIHBhZDIsIHBhZDM7CisJfSBjaXJjdWxhdGU7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyB3aW5kb3cgQjMyOworCSAgICBBdG9tIGF0b20gQjMyOworCSAgICBUaW1lIHRpbWUgQjMyOworCSAgICBCWVRFIHN0YXRlOwkJCS8qIE5ld1ZhbHVlIG9yIERlbGV0ZWQgKi8KKwkgICAgQllURSBwYWQxOworCSAgICBDQVJEMTYgcGFkMiBCMTY7CisJfSBwcm9wZXJ0eTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKyAgICAgICAgICAgIFRpbWUgdGltZSBCMzI7ICAgICAKKwkgICAgV2luZG93IHdpbmRvdyBCMzI7CisJICAgIEF0b20gYXRvbSBCMzI7CisJfSBzZWxlY3Rpb25DbGVhcjsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKyAgICAgICAgICAgIFRpbWUgdGltZSBCMzI7ICAgIAorCSAgICBXaW5kb3cgb3duZXIgQjMyLCByZXF1ZXN0b3IgQjMyOworCSAgICBBdG9tIHNlbGVjdGlvbiBCMzIsIHRhcmdldCBCMzIsIHByb3BlcnR5IEIzMjsKKwl9IHNlbGVjdGlvblJlcXVlc3Q7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisgICAgICAgICAgICBUaW1lIHRpbWUgQjMyOyAgIAorCSAgICBXaW5kb3cgcmVxdWVzdG9yIEIzMjsKKwkgICAgQXRvbSBzZWxlY3Rpb24gQjMyLCB0YXJnZXQgQjMyLCBwcm9wZXJ0eSBCMzI7CisJfSBzZWxlY3Rpb25Ob3RpZnk7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyB3aW5kb3cgQjMyOworCSAgICBDb2xvcm1hcCBjb2xvcm1hcCBCMzI7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorCSAgICBCT09MIGNfbmV3OworI2Vsc2UKKwkgICAgQk9PTCBuZXc7CisjZW5kaWYKKwkgICAgQllURSBzdGF0ZTsJCQkvKiBJbnN0YWxsZWQgb3IgVW5JbnN0YWxsZWQgKi8KKwkgICAgQllURSBwYWQxLCBwYWQyOworCX0gY29sb3JtYXA7CisJc3RydWN0IHsKKwkgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgQ0FSRDggcmVxdWVzdDsKKwkgICAgS2V5Q29kZSBmaXJzdEtleUNvZGU7CisJICAgIENBUkQ4IGNvdW50OworCSAgICBCWVRFIHBhZDE7CisJfSBtYXBwaW5nTm90aWZ5OworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgd2luZG93IEIzMjsKKwkgICAgdW5pb24geworCQlzdHJ1Y3QgeworCQkgICAgQXRvbSB0eXBlIEIzMjsKKwkJICAgIElOVDMyIGxvbmdzMCBCMzI7CisJCSAgICBJTlQzMiBsb25nczEgQjMyOworCQkgICAgSU5UMzIgbG9uZ3MyIEIzMjsKKwkJICAgIElOVDMyIGxvbmdzMyBCMzI7CisJCSAgICBJTlQzMiBsb25nczQgQjMyOworCQl9IGw7CisJCXN0cnVjdCB7CisJCSAgICBBdG9tIHR5cGUgQjMyOworCQkgICAgSU5UMTYgc2hvcnRzMCBCMTY7CisJCSAgICBJTlQxNiBzaG9ydHMxIEIxNjsKKwkJICAgIElOVDE2IHNob3J0czIgQjE2OworCQkgICAgSU5UMTYgc2hvcnRzMyBCMTY7CisJCSAgICBJTlQxNiBzaG9ydHM0IEIxNjsKKwkJICAgIElOVDE2IHNob3J0czUgQjE2OworCQkgICAgSU5UMTYgc2hvcnRzNiBCMTY7CisJCSAgICBJTlQxNiBzaG9ydHM3IEIxNjsKKwkJICAgIElOVDE2IHNob3J0czggQjE2OworCQkgICAgSU5UMTYgc2hvcnRzOSBCMTY7CisJCX0gczsKKwkJc3RydWN0IHsKKwkJICAgIEF0b20gdHlwZSBCMzI7CisJCSAgICBJTlQ4IGJ5dGVzWzIwXTsKKwkJfSBiOworCSAgICB9IHU7IAorCX0gY2xpZW50TWVzc2FnZTsKKyAgICB9IHU7Cit9IHhFdmVudDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdlbmVyaWMgZXZlbnQKKyAqIAorICogVGhvc2UgZXZlbnRzIGFyZSBub3QgcGFydCBvZiB0aGUgY29yZSBwcm90b2NvbCBzcGVjIGFuZCBjYW4gYmUgdXNlZCBieQorICogdmFyaW91cyBleHRlbnNpb25zLgorICogdHlwZSBpcyBhbHdheXMgR2VuZXJpY0V2ZW50CisgKiBleHRlbnNpb24gaXMgdGhlIG1pbm9yIG9wY29kZSBvZiB0aGUgZXh0ZW5zaW9uIHRoZSBldmVudCBiZWxvbmdzIHRvLgorICogZXZ0eXBlIGlzIHRoZSBhY3R1YWwgZXZlbnQgdHlwZSwgdW5pcXVlIF9fcGVyIGV4dGVuc2lvbl9fLiAKKyAqCisgKiBHZW5lcmljRXZlbnRzIGNhbiBiZSBsb25nZXIgdGhhbiAzMiBieXRlcywgd2l0aCB0aGUgbGVuZ3RoIGZpZWxkCisgKiBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgNCBieXRlIGJsb2NrcyBhZnRlciB0aGUgZmlyc3QgMzIgYnl0ZXMuIAorICoKKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0IAoreworICAgIEJZVEUgICAgdHlwZTsKKyAgICBDQVJEOCAgIGV4dGVuc2lvbjsKKyAgICBDQVJEMTYgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgIGxlbmd0aCBCMzI7CisgICAgQ0FSRDE2ICBldnR5cGUgQjE2OworICAgIENBUkQxNiAgcGFkMiBCMTY7CisgICAgQ0FSRDMyICBwYWQzIEIzMjsKKyAgICBDQVJEMzIgIHBhZDQgQjMyOworICAgIENBUkQzMiAgcGFkNSBCMzI7CisgICAgQ0FSRDMyICBwYWQ2IEIzMjsKKyAgICBDQVJEMzIgIHBhZDcgQjMyOworfSB4R2VuZXJpY0V2ZW50OworCisKKworLyogS2V5bWFwTm90aWZ5IGV2ZW50cyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBhYm92ZSB1bmlvbiBiZWNhdXNlIHRoZXkKKyAgIGFyZSBkaWZmZXJlbnQgZnJvbSBhbGwgb3RoZXIgZXZlbnRzOiB0aGV5IGRvIG5vdCBoYXZlIGEgImRldGFpbCIKKyAgIG9yICJzZXF1ZW5jZU51bWJlciIsIHNvIHRoZXJlIGlzIHJvb20gZm9yIGEgMjQ4LWJpdCBrZXkgbWFzay4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsKKyAgICBCWVRFIG1hcFszMV07CisgICAgfSB4S2V5bWFwRXZlbnQ7CisKKyNkZWZpbmUgWEV2ZW50U2l6ZSAoc2l6ZW9mKHhFdmVudCkpCisKKy8qIFhSZXBseSBpcyB0aGUgdW5pb24gb2YgYWxsIHRoZSByZXBsaWVzIGFib3ZlIHdob3NlICJmaXhlZCBwYXJ0IgorZml0cyBpbiAzMiBieXRlcy4gIEl0IGRvZXMgTk9UIGluY2x1ZGUgR2V0V2luZG93QXR0cmlidXRlc1JlcGx5LAorUXVlcnlGb250UmVwbHksIFF1ZXJ5S2V5bWFwUmVwbHksIG9yIEdldEtleWJvYXJkQ29udHJvbFJlcGx5IAorTGlzdEZvbnRzV2l0aEluZm9SZXBseSAqLworCit0eXBlZGVmIHVuaW9uIHsKKyAgICB4R2VuZXJpY1JlcGx5IGdlbmVyaWM7CisgICAgeEdldEdlb21ldHJ5UmVwbHkgZ2VvbTsKKyAgICB4UXVlcnlUcmVlUmVwbHkgdHJlZTsKKyAgICB4SW50ZXJuQXRvbVJlcGx5IGF0b207CisgICAgeEdldEF0b21OYW1lUmVwbHkgYXRvbU5hbWU7CisgICAgeEdldFByb3BlcnR5UmVwbHkgcHJvcGVydHk7CisgICAgeExpc3RQcm9wZXJ0aWVzUmVwbHkgbGlzdFByb3BlcnRpZXM7CisgICAgeEdldFNlbGVjdGlvbk93bmVyUmVwbHkgc2VsZWN0aW9uOworICAgIHhHcmFiUG9pbnRlclJlcGx5IGdyYWJQb2ludGVyOworICAgIHhHcmFiS2V5Ym9hcmRSZXBseSBncmFiS2V5Ym9hcmQ7CisgICAgeFF1ZXJ5UG9pbnRlclJlcGx5IHBvaW50ZXI7CisgICAgeEdldE1vdGlvbkV2ZW50c1JlcGx5IG1vdGlvbkV2ZW50czsKKyAgICB4VHJhbnNsYXRlQ29vcmRzUmVwbHkgY29vcmRzOworICAgIHhHZXRJbnB1dEZvY3VzUmVwbHkgaW5wdXRGb2N1czsKKyAgICB4UXVlcnlUZXh0RXh0ZW50c1JlcGx5IHRleHRFeHRlbnRzOworICAgIHhMaXN0Rm9udHNSZXBseSBmb250czsKKyAgICB4R2V0Rm9udFBhdGhSZXBseSBmb250UGF0aDsKKyAgICB4R2V0SW1hZ2VSZXBseSBpbWFnZTsKKyAgICB4TGlzdEluc3RhbGxlZENvbG9ybWFwc1JlcGx5IGNvbG9ybWFwczsKKyAgICB4QWxsb2NDb2xvclJlcGx5IGFsbG9jQ29sb3I7CisgICAgeEFsbG9jTmFtZWRDb2xvclJlcGx5IGFsbG9jTmFtZWRDb2xvcjsKKyAgICB4QWxsb2NDb2xvckNlbGxzUmVwbHkgY29sb3JDZWxsczsKKyAgICB4QWxsb2NDb2xvclBsYW5lc1JlcGx5IGNvbG9yUGxhbmVzOworICAgIHhRdWVyeUNvbG9yc1JlcGx5IGNvbG9yczsKKyAgICB4TG9va3VwQ29sb3JSZXBseSBsb29rdXBDb2xvcjsKKyAgICB4UXVlcnlCZXN0U2l6ZVJlcGx5IGJlc3RTaXplOworICAgIHhRdWVyeUV4dGVuc2lvblJlcGx5IGV4dGVuc2lvbjsKKyAgICB4TGlzdEV4dGVuc2lvbnNSZXBseSBleHRlbnNpb25zOworICAgIHhTZXRNb2RpZmllck1hcHBpbmdSZXBseSBzZXRNb2RpZmllck1hcHBpbmc7CisgICAgeEdldE1vZGlmaWVyTWFwcGluZ1JlcGx5IGdldE1vZGlmaWVyTWFwcGluZzsKKyAgICB4U2V0UG9pbnRlck1hcHBpbmdSZXBseSBzZXRQb2ludGVyTWFwcGluZzsKKyAgICB4R2V0S2V5Ym9hcmRNYXBwaW5nUmVwbHkgZ2V0S2V5Ym9hcmRNYXBwaW5nOworICAgIHhHZXRQb2ludGVyTWFwcGluZ1JlcGx5IGdldFBvaW50ZXJNYXBwaW5nOworICAgIHhHZXRQb2ludGVyQ29udHJvbFJlcGx5IHBvaW50ZXJDb250cm9sOworICAgIHhHZXRTY3JlZW5TYXZlclJlcGx5IHNjcmVlblNhdmVyOworICAgIHhMaXN0SG9zdHNSZXBseSBob3N0czsKKyAgICB4RXJyb3IgZXJyb3I7CisgICAgeEV2ZW50IGV2ZW50OworfSB4UmVwbHk7CisKKwwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSRVFVRVNUUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIFJlcXVlc3Qgc3RydWN0dXJlICovCisKK3R5cGVkZWYgc3RydWN0IF94UmVxIHsKKwlDQVJEOCByZXFUeXBlOworCUNBUkQ4IGRhdGE7ICAgICAgICAgICAgLyogbWVhbmluZyBkZXBlbmRzIG9uIHJlcXVlc3QgdHlwZSAqLworCUNBUkQxNiBsZW5ndGggQjE2OyAgICAgICAgIC8qIGxlbmd0aCBpbiA0IGJ5dGVzIHF1YW50aXRpZXMgCisJCQkJICBvZiB3aG9sZSByZXF1ZXN0LCBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgKi8KK30geFJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgc3RydWN0dXJlcyB0aGF0IGZvbGxvdyByZXF1ZXN0LiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVzb3VyY2VSZXEgaXMgdXNlZCBmb3IgYW55IHJlcXVlc3Qgd2hpY2ggaGFzIGEgcmVzb3VyY2UgSUQgCisgICAob3IgQXRvbSBvciBUaW1lKSBhcyBpdHMgb25lIGFuZCBvbmx5IGFyZ3VtZW50LiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDMyIGlkIEIzMjsgIC8qIGEgV2luZG93LCBEcmF3YWJsZSwgRm9udCwgR0NvbnRleHQsIFBpeG1hcCwgZXRjLiAqLworICAgIH0geFJlc291cmNlUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBDQVJEOCBkZXB0aDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgd2lkIEIzMiwgcGFyZW50IEIzMjsKKyAgICBJTlQxNiB4IEIxNiwgeSBCMTY7CisgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNiwgYm9yZGVyV2lkdGggQjE2OyAgCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQxNiBjX2NsYXNzIEIxNjsKKyNlbHNlCisgICAgQ0FSRDE2IGNsYXNzIEIxNjsKKyNlbmRpZgorICAgIFZpc3VhbElEIHZpc3VhbCBCMzI7CisgICAgQ0FSRDMyIG1hc2sgQjMyOworfSB4Q3JlYXRlV2luZG93UmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgd2luZG93IEIzMjsKKyAgICBDQVJEMzIgdmFsdWVNYXNrIEIzMjsgCit9IHhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIG1vZGU7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzI7Cit9IHhDaGFuZ2VTYXZlU2V0UmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgd2luZG93IEIzMiwgcGFyZW50IEIzMjsKKyAgICBJTlQxNiB4IEIxNiwgeSBCMTY7Cit9IHhSZXBhcmVudFdpbmRvd1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyB3aW5kb3cgQjMyOworICAgIENBUkQxNiBtYXNrIEIxNjsKKyAgICBDQVJEMTYgcGFkMiBCMTY7Cit9IHhDb25maWd1cmVXaW5kb3dSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IGRpcmVjdGlvbjsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgd2luZG93IEIzMjsKK30geENpcmN1bGF0ZVdpbmRvd1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAvKiBmb2xsb3dlZCBieSBwYWRkZWQgc3RyaW5nICovCisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCT09MIG9ubHlJZkV4aXN0czsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYgbmJ5dGVzICBCMTY7ICAgIC8qIG51bWJlciBvZiBieXRlcyBpbiBzdHJpbmcgKi8KKyAgICBDQVJEMTYgcGFkIEIxNjsKK30geEludGVybkF0b21SZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IG1vZGU7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzI7CisgICAgQXRvbSBwcm9wZXJ0eSBCMzIsIHR5cGUgQjMyOworICAgIENBUkQ4IGZvcm1hdDsKKyAgICBCWVRFIHBhZFszXTsKKyAgICBDQVJEMzIgblVuaXRzIEIzMjsgICAgIC8qIGxlbmd0aCBvZiBzdHVmZiBmb2xsb3dpbmcsIGRlcGVuZHMgb24gZm9ybWF0ICovCit9IHhDaGFuZ2VQcm9wZXJ0eVJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzI7CisgICAgQXRvbSBwcm9wZXJ0eSBCMzI7Cit9IHhEZWxldGVQcm9wZXJ0eVJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIEJPT0wgY19kZWxldGU7CisjZWxzZQorICAgIEJPT0wgZGVsZXRlOworI2VuZGlmCisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzI7CisgICAgQXRvbSBwcm9wZXJ0eSBCMzIsIHR5cGUgQjMyOworICAgIENBUkQzMiBsb25nT2Zmc2V0IEIzMjsKKyAgICBDQVJEMzIgbG9uZ0xlbmd0aCBCMzI7Cit9IHhHZXRQcm9wZXJ0eVJlcTsKKyAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyB3aW5kb3cgQjMyOworICAgIEF0b20gc2VsZWN0aW9uIEIzMjsKKyAgICBUaW1lIHRpbWUgQjMyOworfSB4U2V0U2VsZWN0aW9uT3duZXJSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyByZXF1ZXN0b3IgQjMyOworICAgIEF0b20gc2VsZWN0aW9uIEIzMiwgdGFyZ2V0IEIzMiwgcHJvcGVydHkgQjMyOworICAgIFRpbWUgdGltZSBCMzI7CisgICAgfSB4Q29udmVydFNlbGVjdGlvblJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQk9PTCBwcm9wYWdhdGU7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IGRlc3RpbmF0aW9uIEIzMjsKKyAgICBDQVJEMzIgZXZlbnRNYXNrIEIzMjsKKyNpZmRlZiBXT1JENjQKKyAgICAvKiB0aGUgc3RydWN0dXJlIHNob3VsZCBoYXZlIGJlZW4gcXVhZC1hbGlnbmVkICovCisgICAgQllURSBldmVudGRhdGFbU0laRU9GKHhFdmVudCldOworI2Vsc2UKKyAgICB4RXZlbnQgZXZlbnQ7CisjZW5kaWYgLyogV09SRDY0ICovCit9IHhTZW5kRXZlbnRSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJPT0wgb3duZXJFdmVudHM7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IGdyYWJXaW5kb3cgQjMyOworICAgIENBUkQxNiBldmVudE1hc2sgQjE2OworICAgIEJZVEUgcG9pbnRlck1vZGUsIGtleWJvYXJkTW9kZTsKKyAgICBXaW5kb3cgY29uZmluZVRvIEIzMjsKKyAgICBDdXJzb3IgY3Vyc29yIEIzMjsKKyAgICBUaW1lIHRpbWUgQjMyOworfSB4R3JhYlBvaW50ZXJSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJPT0wgb3duZXJFdmVudHM7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IGdyYWJXaW5kb3cgQjMyOworICAgIENBUkQxNiBldmVudE1hc2sgQjE2OworICAgIEJZVEUgcG9pbnRlck1vZGUsIGtleWJvYXJkTW9kZTsKKyAgICBXaW5kb3cgY29uZmluZVRvIEIzMjsKKyAgICBDdXJzb3IgY3Vyc29yIEIzMjsKKyAgICBDQVJEOCBidXR0b247CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IG1vZGlmaWVycyBCMTY7Cit9IHhHcmFiQnV0dG9uUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBDQVJEOCBidXR0b247CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IGdyYWJXaW5kb3cgQjMyOworICAgIENBUkQxNiBtb2RpZmllcnMgQjE2OworICAgIENBUkQxNiBwYWQgQjE2OworfSB4VW5ncmFiQnV0dG9uUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDdXJzb3IgY3Vyc29yIEIzMjsKKyAgICBUaW1lIHRpbWUgQjMyOworICAgIENBUkQxNiBldmVudE1hc2sgQjE2OworICAgIENBUkQxNiBwYWQyIEIxNjsKK30geENoYW5nZUFjdGl2ZVBvaW50ZXJHcmFiUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCT09MIG93bmVyRXZlbnRzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBncmFiV2luZG93IEIzMjsKKyAgICBUaW1lIHRpbWUgQjMyOworICAgIEJZVEUgcG9pbnRlck1vZGUsIGtleWJvYXJkTW9kZTsgIAorICAgIENBUkQxNiBwYWQgQjE2OworfSB4R3JhYktleWJvYXJkUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCT09MIG93bmVyRXZlbnRzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBncmFiV2luZG93IEIzMjsKKyAgICBDQVJEMTYgbW9kaWZpZXJzIEIxNjsKKyAgICBDQVJEOCBrZXk7CisgICAgQllURSBwb2ludGVyTW9kZSwga2V5Ym9hcmRNb2RlOyAgCisgICAgQllURSBwYWQxLCBwYWQyLCBwYWQzOworfSB4R3JhYktleVJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDgga2V5OworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBncmFiV2luZG93IEIzMjsKKyAgICBDQVJEMTYgbW9kaWZpZXJzIEIxNjsKKyAgICBDQVJEMTYgcGFkIEIxNjsKK30geFVuZ3JhYktleVJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggbW9kZTsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBUaW1lIHRpbWUgQjMyOworfSB4QWxsb3dFdmVudHNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyB3aW5kb3cgQjMyOworICAgIFRpbWUgc3RhcnQgQjMyLCBzdG9wIEIzMjsKK30geEdldE1vdGlvbkV2ZW50c1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHNyY1dpZCBCMzIsIGRzdFdpZCBCMzI7CisgICAgSU5UMTYgc3JjWCBCMTYsIHNyY1kgQjE2OworfSB4VHJhbnNsYXRlQ29vcmRzUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgc3JjV2lkIEIzMiwgZHN0V2lkIEIzMjsKKyAgICBJTlQxNiBzcmNYIEIxNiwgc3JjWSBCMTY7CisgICAgQ0FSRDE2IHNyY1dpZHRoIEIxNiwgc3JjSGVpZ2h0IEIxNjsKKyAgICBJTlQxNiBkc3RYIEIxNiwgZHN0WSBCMTY7Cit9IHhXYXJwUG9pbnRlclJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggcmV2ZXJ0VG87CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IGZvY3VzIEIzMjsKKyAgICBUaW1lIHRpbWUgQjMyOworfSB4U2V0SW5wdXRGb2N1c1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgRm9udCBmaWQgQjMyOworICAgIENBUkQxNiBuYnl0ZXMgQjE2OworICAgIEJZVEUgcGFkMSwgcGFkMjsJLyogc3RyaW5nIGZvbGxvd3Mgb24gd29yZCBib3VuZGFyeSAqLworfSB4T3BlbkZvbnRSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJPT0wgb2RkTGVuZ3RoOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEZvbnQgZmlkIEIzMjsKKyAgICB9IHhRdWVyeVRleHRFeHRlbnRzUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYgbWF4TmFtZXMgQjE2OworICAgIENBUkQxNiBuYnl0ZXMgQjE2OyAgLyogZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkgc3RyaW5nIGJ5dGVzICovCit9IHhMaXN0Rm9udHNSZXE7CisKK3R5cGVkZWYgeExpc3RGb250c1JlcSB4TGlzdEZvbnRzV2l0aEluZm9SZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENBUkQxNiBuRm9udHMgQjE2OworICAgIEJZVEUgcGFkMSwgcGFkMjsJLyogTElTVG9mU1RSSU5HOCBmb2xsb3dzIG9uIHdvcmQgYm91bmRhcnkgKi8KK30geFNldEZvbnRQYXRoUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBDQVJEOCBkZXB0aDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBQaXhtYXAgcGlkIEIzMjsKKyAgICBEcmF3YWJsZSBkcmF3YWJsZSBCMzI7CisgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKK30geENyZWF0ZVBpeG1hcFJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgR0NvbnRleHQgZ2MgQjMyOworICAgIERyYXdhYmxlIGRyYXdhYmxlIEIzMjsKKyAgICBDQVJEMzIgbWFzayBCMzI7Cit9IHhDcmVhdGVHQ1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgR0NvbnRleHQgZ2MgQjMyOworICAgIENBUkQzMiBtYXNrIEIzMjsKK30geENoYW5nZUdDUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgR0NvbnRleHQgc3JjR0MgQjMyLCBkc3RHQyBCMzI7CisgICAgQ0FSRDMyIG1hc2sgQjMyOworfSB4Q29weUdDUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgR0NvbnRleHQgZ2MgQjMyOworICAgIENBUkQxNiBkYXNoT2Zmc2V0IEIxNjsKKyAgICBDQVJEMTYgbkRhc2hlcyBCMTY7ICAgICAgICAvKiBsZW5ndGggTElTVG9mQ0FSRDggb2YgdmFsdWVzIGZvbGxvd2luZyAqLworfSB4U2V0RGFzaGVzUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBvcmRlcmluZzsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBHQ29udGV4dCBnYyBCMzI7CisgICAgSU5UMTYgeE9yaWdpbiBCMTYsIHlPcmlnaW4gQjE2OworfSB4U2V0Q2xpcFJlY3RhbmdsZXNSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCT09MIGV4cG9zdXJlczsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgd2luZG93IEIzMjsKKyAgICBJTlQxNiB4IEIxNiwgeSBCMTY7CisgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKK30geENsZWFyQXJlYVJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUgc3JjRHJhd2FibGUgQjMyLCBkc3REcmF3YWJsZSBCMzI7CisgICAgR0NvbnRleHQgZ2MgQjMyOworICAgIElOVDE2IHNyY1ggQjE2LCBzcmNZIEIxNiwgZHN0WCBCMTYsIGRzdFkgQjE2OworICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTY7Cit9IHhDb3B5QXJlYVJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIERyYXdhYmxlIHNyY0RyYXdhYmxlIEIzMiwgZHN0RHJhd2FibGUgQjMyOworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBJTlQxNiBzcmNYIEIxNiwgc3JjWSBCMTYsIGRzdFggQjE2LCBkc3RZIEIxNjsKKyAgICBDQVJEMTYgd2lkdGggQjE2LCBoZWlnaHQgQjE2OworICAgIENBUkQzMiBiaXRQbGFuZSBCMzI7Cit9IHhDb3B5UGxhbmVSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIGNvb3JkTW9kZTsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBEcmF3YWJsZSBkcmF3YWJsZSBCMzI7CisgICAgR0NvbnRleHQgZ2MgQjMyOworfSB4UG9seVBvaW50UmVxOyAgICAKKwordHlwZWRlZiB4UG9seVBvaW50UmVxIHhQb2x5TGluZVJlcTsgIC8qIHNhbWUgcmVxdWVzdCBzdHJ1Y3R1cmUgKi8KKworLyogVGhlIGZvbGxvd2luZyB1c2VkIGZvciBQb2x5U2VnbWVudCwgUG9seVJlY3RhbmdsZSwgUG9seUFyYywgUG9seUZpbGxSZWN0YW5nbGUsIFBvbHlGaWxsQXJjICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIERyYXdhYmxlIGRyYXdhYmxlIEIzMjsKKyAgICBHQ29udGV4dCBnYyBCMzI7Cit9IHhQb2x5U2VnbWVudFJlcTsgICAgCisKK3R5cGVkZWYgeFBvbHlTZWdtZW50UmVxIHhQb2x5QXJjUmVxOwordHlwZWRlZiB4UG9seVNlZ21lbnRSZXEgeFBvbHlSZWN0YW5nbGVSZXE7Cit0eXBlZGVmIHhQb2x5U2VnbWVudFJlcSB4UG9seUZpbGxSZWN0YW5nbGVSZXE7Cit0eXBlZGVmIHhQb2x5U2VnbWVudFJlcSB4UG9seUZpbGxBcmNSZXE7CisKK3R5cGVkZWYgc3RydWN0IF9GaWxsUG9seVJlcSB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBEcmF3YWJsZSBkcmF3YWJsZSBCMzI7CisgICAgR0NvbnRleHQgZ2MgQjMyOworICAgIEJZVEUgc2hhcGU7CisgICAgQllURSBjb29yZE1vZGU7CisgICAgQ0FSRDE2IHBhZDEgQjE2OworfSB4RmlsbFBvbHlSZXE7ICAgIAorCisKK3R5cGVkZWYgc3RydWN0IF9QdXRJbWFnZVJlcSB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBDQVJEOCBmb3JtYXQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBDQVJEMTYgd2lkdGggQjE2LCBoZWlnaHQgQjE2OworICAgIElOVDE2IGRzdFggQjE2LCBkc3RZIEIxNjsKKyAgICBDQVJEOCBsZWZ0UGFkOworICAgIENBUkQ4IGRlcHRoOworICAgIENBUkQxNiBwYWQgQjE2OworfSB4UHV0SW1hZ2VSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBDQVJEOCBmb3JtYXQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKyAgICBDQVJEMTYgd2lkdGggQjE2LCBoZWlnaHQgQjE2OworICAgIENBUkQzMiBwbGFuZU1hc2sgQjMyOworfSB4R2V0SW1hZ2VSZXE7ICAgIAorCisvKiB0aGUgZm9sbG93aW5nIHVzZWQgYnkgUG9seVRleHQ4IGFuZCBQb2x5VGV4dDE2ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBEcmF3YWJsZSBkcmF3YWJsZSBCMzI7CisgICAgR0NvbnRleHQgZ2MgQjMyOworICAgIElOVDE2IHggQjE2LCB5IEIxNjsJCS8qIGl0ZW1zICh4VGV4dEVsdCkgc3RhcnQgYWZ0ZXIgc3RydWN0ICovCit9IHhQb2x5VGV4dFJlcTsgICAgCisKK3R5cGVkZWYgeFBvbHlUZXh0UmVxIHhQb2x5VGV4dDhSZXE7Cit0eXBlZGVmIHhQb2x5VGV4dFJlcSB4UG9seVRleHQxNlJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBuQ2hhcnM7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBJTlQxNiB4IEIxNiwgeSBCMTY7Cit9IHhJbWFnZVRleHRSZXE7ICAgIAorCit0eXBlZGVmIHhJbWFnZVRleHRSZXEgeEltYWdlVGV4dDhSZXE7Cit0eXBlZGVmIHhJbWFnZVRleHRSZXEgeEltYWdlVGV4dDE2UmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIGFsbG9jOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIG1pZCBCMzI7CisgICAgV2luZG93IHdpbmRvdyBCMzI7CisgICAgVmlzdWFsSUQgdmlzdWFsIEIzMjsKK30geENyZWF0ZUNvbG9ybWFwUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAgbWlkIEIzMjsKKyAgICBDb2xvcm1hcCBzcmNDbWFwIEIzMjsKK30geENvcHlDb2xvcm1hcEFuZEZyZWVSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDb2xvcm1hcCBjbWFwIEIzMjsKKyAgICBDQVJEMTYgcmVkIEIxNiwgZ3JlZW4gQjE2LCBibHVlIEIxNjsKKyAgICBDQVJEMTYgcGFkMiBCMTY7Cit9IHhBbGxvY0NvbG9yUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAgY21hcCBCMzI7CisgICAgQ0FSRDE2IG5ieXRlcyBCMTY7ICAvKiBmb2xsb3dlZCBieSBzdHJ1Y3R1cmUgKi8KKyAgICBCWVRFIHBhZDEsIHBhZDI7Cit9IHhBbGxvY05hbWVkQ29sb3JSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCT09MIGNvbnRpZ3VvdXM7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAgY21hcCBCMzI7CisgICAgQ0FSRDE2IGNvbG9ycyBCMTYsIHBsYW5lcyBCMTY7Cit9IHhBbGxvY0NvbG9yQ2VsbHNSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCT09MIGNvbnRpZ3VvdXM7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAgY21hcCBCMzI7CisgICAgQ0FSRDE2IGNvbG9ycyBCMTYsIHJlZCBCMTYsIGdyZWVuIEIxNiwgYmx1ZSBCMTY7Cit9IHhBbGxvY0NvbG9yUGxhbmVzUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAgY21hcCBCMzI7CisgICAgQ0FSRDMyIHBsYW5lTWFzayBCMzI7Cit9IHhGcmVlQ29sb3JzUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAgY21hcCBCMzI7Cit9IHhTdG9yZUNvbG9yc1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IGZsYWdzOyAgIC8qIERvUmVkLCBEb0dyZWVuLCBEb0JsdWUsIGFzIGluIHhDb2xvckl0ZW0gKi8KKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDb2xvcm1hcCBjbWFwIEIzMjsKKyAgICBDQVJEMzIgcGl4ZWwgQjMyOworICAgIENBUkQxNiBuYnl0ZXMgQjE2OyAgLyogbnVtYmVyIG9mIG5hbWUgc3RyaW5nIGJ5dGVzIGZvbGxvd2luZyBzdHJ1Y3R1cmUgKi8KKyAgICBCWVRFIHBhZDEsIHBhZDI7CisgICAgfSB4U3RvcmVOYW1lZENvbG9yUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDb2xvcm1hcCBjbWFwIEIzMjsKK30geFF1ZXJ5Q29sb3JzUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAvKiBmb2xsb3dlZCAgYnkgc3RyaW5nIG9mIGxlbmd0aCBsZW4gKi8KKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIGNtYXAgQjMyOworICAgIENBUkQxNiBuYnl0ZXMgQjE2OyAgLyogbnVtYmVyIG9mIHN0cmluZyBieXRlcyBmb2xsb3dpbmcgc3RydWN0dXJlKi8KKyAgICBCWVRFIHBhZDEsIHBhZDI7Cit9IHhMb29rdXBDb2xvclJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEN1cnNvciBjaWQgQjMyOworICAgIFBpeG1hcCBzb3VyY2UgQjMyLCBtYXNrIEIzMjsKKyAgICBDQVJEMTYgZm9yZVJlZCBCMTYsIGZvcmVHcmVlbiBCMTYsIGZvcmVCbHVlIEIxNjsKKyAgICBDQVJEMTYgYmFja1JlZCBCMTYsIGJhY2tHcmVlbiBCMTYsIGJhY2tCbHVlIEIxNjsKKyAgICBDQVJEMTYgeCBCMTYsIHkgQjE2OworfSB4Q3JlYXRlQ3Vyc29yUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ3Vyc29yIGNpZCBCMzI7CisgICAgRm9udCBzb3VyY2UgQjMyLCBtYXNrIEIzMjsKKyAgICBDQVJEMTYgc291cmNlQ2hhciBCMTYsIG1hc2tDaGFyIEIxNjsKKyAgICBDQVJEMTYgZm9yZVJlZCBCMTYsIGZvcmVHcmVlbiBCMTYsIGZvcmVCbHVlIEIxNjsKKyAgICBDQVJEMTYgYmFja1JlZCBCMTYsIGJhY2tHcmVlbiBCMTYsIGJhY2tCbHVlIEIxNjsKK30geENyZWF0ZUdseXBoQ3Vyc29yUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ3Vyc29yIGN1cnNvciBCMzI7CisgICAgQ0FSRDE2IGZvcmVSZWQgQjE2LCBmb3JlR3JlZW4gQjE2LCBmb3JlQmx1ZSBCMTY7CisgICAgQ0FSRDE2IGJhY2tSZWQgQjE2LCBiYWNrR3JlZW4gQjE2LCBiYWNrQmx1ZSBCMTY7Cit9IHhSZWNvbG9yQ3Vyc29yUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4IGNfY2xhc3M7CisjZWxzZQorICAgIENBUkQ4IGNsYXNzOworI2VuZGlmCisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTY7Cit9IHhRdWVyeUJlc3RTaXplUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDE2IG5ieXRlcyBCMTY7ICAvKiBudW1iZXIgb2Ygc3RyaW5nIGJ5dGVzIGZvbGxvd2luZyBzdHJ1Y3R1cmUgKi8KKyAgICBCWVRFIHBhZDEsIHBhZDI7Cit9IHhRdWVyeUV4dGVuc2lvblJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIG51bUtleVBlck1vZGlmaWVyOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKK30geFNldE1vZGlmaWVyTWFwcGluZ1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggbkVsdHM7ICAvKiBob3cgbWFueSBlbGVtZW50cyBpbiB0aGUgbWFwICovCisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7Cit9IHhTZXRQb2ludGVyTWFwcGluZ1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgS2V5Q29kZSBmaXJzdEtleUNvZGU7CisgICAgQ0FSRDggY291bnQ7CisgICAgQ0FSRDE2IHBhZDEgQjE2OworfSB4R2V0S2V5Ym9hcmRNYXBwaW5nUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDgga2V5Q29kZXM7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgS2V5Q29kZSBmaXJzdEtleUNvZGU7CisgICAgQ0FSRDgga2V5U3ltc1BlcktleUNvZGU7CisgICAgQ0FSRDE2IHBhZDEgQjE2OworfSB4Q2hhbmdlS2V5Ym9hcmRNYXBwaW5nUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIgbWFzayBCMzI7Cit9IHhDaGFuZ2VLZXlib2FyZENvbnRyb2xSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBJTlQ4IHBlcmNlbnQ7ICAvKiAtMTAwIHRvIDEwMCAqLworICAgIENBUkQxNiBsZW5ndGggQjE2OworfSB4QmVsbFJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIElOVDE2IGFjY2VsTnVtIEIxNiwgYWNjZWxEZW51bSBCMTY7CisgICAgSU5UMTYgdGhyZXNob2xkIEIxNjsgICAgICAgICAgICAgCisgICAgQk9PTCBkb0FjY2VsLCBkb1RocmVzaDsKK30geENoYW5nZVBvaW50ZXJDb250cm9sUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgSU5UMTYgdGltZW91dCBCMTYsIGludGVydmFsIEIxNjsKKyAgICBCWVRFIHByZWZlckJsYW5rLCBhbGxvd0V4cG9zZTsgIAorICAgIENBUkQxNiBwYWQyIEIxNjsKK30geFNldFNjcmVlblNhdmVyUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBtb2RlOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENBUkQ4IGhvc3RGYW1pbHk7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGhvc3RMZW5ndGggQjE2OworfSB4Q2hhbmdlSG9zdHNSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICB9IHhMaXN0SG9zdHNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgbW9kZTsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICB9IHhDaGFuZ2VNb2RlUmVxOworCit0eXBlZGVmIHhDaGFuZ2VNb2RlUmVxIHhTZXRBY2Nlc3NDb250cm9sUmVxOwordHlwZWRlZiB4Q2hhbmdlTW9kZVJlcSB4U2V0Q2xvc2VEb3duTW9kZVJlcTsKK3R5cGVkZWYgeENoYW5nZU1vZGVSZXEgeEZvcmNlU2NyZWVuU2F2ZXJSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsgLyogZm9sbG93ZWQgYnkgTElTVCBvZiBBVE9NICovCisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgd2luZG93IEIzMjsKKyAgICBDQVJEMTYgbkF0b21zIEIxNjsKKyAgICBJTlQxNiBuUG9zaXRpb25zIEIxNjsKKyAgICB9IHhSb3RhdGVQcm9wZXJ0aWVzUmVxOworICAgIAorDAorCisvKiBSZXBseSBjb2RlcyAqLworCisjZGVmaW5lIFhfUmVwbHkJCTEJCS8qIE5vcm1hbCByZXBseSAqLworI2RlZmluZSBYX0Vycm9yCQkwCQkvKiBFcnJvciAqLworCisvKiBSZXF1ZXN0IGNvZGVzICovCisKKyNkZWZpbmUgWF9DcmVhdGVXaW5kb3cgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAKKyNkZWZpbmUgWF9DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzICAgICAgICAyICAgICAgICAKKyNkZWZpbmUgWF9HZXRXaW5kb3dBdHRyaWJ1dGVzICAgICAgICAgICAzICAgICAKKyNkZWZpbmUgWF9EZXN0cm95V2luZG93ICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFhfRGVzdHJveVN1YndpbmRvd3MgICAgICAgICAgICAgNSAgIAorI2RlZmluZSBYX0NoYW5nZVNhdmVTZXQgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgWF9SZXBhcmVudFdpbmRvdyAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFhfTWFwV2luZG93ICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBYX01hcFN1YndpbmRvd3MgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgWF9Vbm1hcFdpbmRvdyAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFhfVW5tYXBTdWJ3aW5kb3dzICAgICAgICAgICAgICAxMSAgCisjZGVmaW5lIFhfQ29uZmlndXJlV2luZG93ICAgICAgICAgICAgICAxMiAgCisjZGVmaW5lIFhfQ2lyY3VsYXRlV2luZG93ICAgICAgICAgICAgICAxMyAgCisjZGVmaW5lIFhfR2V0R2VvbWV0cnkgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBYX1F1ZXJ5VHJlZSAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgWF9JbnRlcm5BdG9tICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFhfR2V0QXRvbU5hbWUgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBYX0NoYW5nZVByb3BlcnR5ICAgICAgICAgICAgICAgMTggCisjZGVmaW5lIFhfRGVsZXRlUHJvcGVydHkgICAgICAgICAgICAgICAxOSAKKyNkZWZpbmUgWF9HZXRQcm9wZXJ0eSAgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFhfTGlzdFByb3BlcnRpZXMgICAgICAgICAgICAgICAyMSAKKyNkZWZpbmUgWF9TZXRTZWxlY3Rpb25Pd25lciAgICAgICAgICAgIDIyICAgIAorI2RlZmluZSBYX0dldFNlbGVjdGlvbk93bmVyICAgICAgICAgICAgMjMgICAgCisjZGVmaW5lIFhfQ29udmVydFNlbGVjdGlvbiAgICAgICAgICAgICAyNCAgIAorI2RlZmluZSBYX1NlbmRFdmVudCAgICAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgWF9HcmFiUG9pbnRlciAgICAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIFhfVW5ncmFiUG9pbnRlciAgICAgICAgICAgICAgICAyNworI2RlZmluZSBYX0dyYWJCdXR0b24gICAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgWF9VbmdyYWJCdXR0b24gICAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIFhfQ2hhbmdlQWN0aXZlUG9pbnRlckdyYWIgICAgICAzMCAgICAgICAgICAKKyNkZWZpbmUgWF9HcmFiS2V5Ym9hcmQgICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIFhfVW5ncmFiS2V5Ym9hcmQgICAgICAgICAgICAgICAzMiAKKyNkZWZpbmUgWF9HcmFiS2V5ICAgICAgICAgICAgICAgICAgICAgIDMzCisjZGVmaW5lIFhfVW5ncmFiS2V5ICAgICAgICAgICAgICAgICAgICAzNAorI2RlZmluZSBYX0FsbG93RXZlbnRzICAgICAgICAgICAgICAgICAgMzUgICAgICAgCisjZGVmaW5lIFhfR3JhYlNlcnZlciAgICAgICAgICAgICAgICAgICAzNiAgICAgIAorI2RlZmluZSBYX1VuZ3JhYlNlcnZlciAgICAgICAgICAgICAgICAgMzcgICAgICAgIAorI2RlZmluZSBYX1F1ZXJ5UG9pbnRlciAgICAgICAgICAgICAgICAgMzggICAgICAgIAorI2RlZmluZSBYX0dldE1vdGlvbkV2ZW50cyAgICAgICAgICAgICAgMzkgICAgICAgICAgIAorI2RlZmluZSBYX1RyYW5zbGF0ZUNvb3JkcyAgICAgICAgICAgICAgNDAgICAgICAgICAgICAgICAgCisjZGVmaW5lIFhfV2FycFBvaW50ZXIgICAgICAgICAgICAgICAgICA0MSAgICAgICAKKyNkZWZpbmUgWF9TZXRJbnB1dEZvY3VzICAgICAgICAgICAgICAgIDQyICAgICAgICAgCisjZGVmaW5lIFhfR2V0SW5wdXRGb2N1cyAgICAgICAgICAgICAgICA0MyAgICAgICAgIAorI2RlZmluZSBYX1F1ZXJ5S2V5bWFwICAgICAgICAgICAgICAgICAgNDQgICAgICAgCisjZGVmaW5lIFhfT3BlbkZvbnQgICAgICAgICAgICAgICAgICAgICA0NSAgICAKKyNkZWZpbmUgWF9DbG9zZUZvbnQgICAgICAgICAgICAgICAgICAgIDQ2ICAgICAKKyNkZWZpbmUgWF9RdWVyeUZvbnQgICAgICAgICAgICAgICAgICAgIDQ3CisjZGVmaW5lIFhfUXVlcnlUZXh0RXh0ZW50cyAgICAgICAgICAgICA0OCAgICAgCisjZGVmaW5lIFhfTGlzdEZvbnRzICAgICAgICAgICAgICAgICAgICA0OSAgCisjZGVmaW5lIFhfTGlzdEZvbnRzV2l0aEluZm8gICAgCSAgICAgICA1MCAKKyNkZWZpbmUgWF9TZXRGb250UGF0aCAgICAgICAgICAgICAgICAgIDUxIAorI2RlZmluZSBYX0dldEZvbnRQYXRoICAgICAgICAgICAgICAgICAgNTIgCisjZGVmaW5lIFhfQ3JlYXRlUGl4bWFwICAgICAgICAgICAgICAgICA1MyAgICAgICAgCisjZGVmaW5lIFhfRnJlZVBpeG1hcCAgICAgICAgICAgICAgICAgICA1NCAgICAgIAorI2RlZmluZSBYX0NyZWF0ZUdDICAgICAgICAgICAgICAgICAgICAgNTUgICAgCisjZGVmaW5lIFhfQ2hhbmdlR0MgICAgICAgICAgICAgICAgICAgICA1NiAgICAKKyNkZWZpbmUgWF9Db3B5R0MgICAgICAgICAgICAgICAgICAgICAgIDU3ICAKKyNkZWZpbmUgWF9TZXREYXNoZXMgICAgICAgICAgICAgICAgICAgIDU4ICAgICAKKyNkZWZpbmUgWF9TZXRDbGlwUmVjdGFuZ2xlcyAgICAgICAgICAgIDU5ICAgICAgICAgICAgIAorI2RlZmluZSBYX0ZyZWVHQyAgICAgICAgICAgICAgICAgICAgICAgNjAgIAorI2RlZmluZSBYX0NsZWFyQXJlYSAgICAgICAgICAgICAgICAgICAgNjEgICAgICAgICAgICAgCisjZGVmaW5lIFhfQ29weUFyZWEgICAgICAgICAgICAgICAgICAgICA2MiAgICAKKyNkZWZpbmUgWF9Db3B5UGxhbmUgICAgICAgICAgICAgICAgICAgIDYzICAgICAKKyNkZWZpbmUgWF9Qb2x5UG9pbnQgICAgICAgICAgICAgICAgICAgIDY0ICAgICAKKyNkZWZpbmUgWF9Qb2x5TGluZSAgICAgICAgICAgICAgICAgICAgIDY1ICAgIAorI2RlZmluZSBYX1BvbHlTZWdtZW50ICAgICAgICAgICAgICAgICAgNjYgICAgICAgCisjZGVmaW5lIFhfUG9seVJlY3RhbmdsZSAgICAgICAgICAgICAgICA2NyAgICAgICAgIAorI2RlZmluZSBYX1BvbHlBcmMgICAgICAgICAgICAgICAgICAgICAgNjggICAKKyNkZWZpbmUgWF9GaWxsUG9seSAgICAgICAgICAgICAgICAgICAgIDY5ICAgIAorI2RlZmluZSBYX1BvbHlGaWxsUmVjdGFuZ2xlICAgICAgICAgICAgNzAgICAgICAgICAgICAgCisjZGVmaW5lIFhfUG9seUZpbGxBcmMgICAgICAgICAgICAgICAgICA3MSAgICAgICAKKyNkZWZpbmUgWF9QdXRJbWFnZSAgICAgICAgICAgICAgICAgICAgIDcyICAgIAorI2RlZmluZSBYX0dldEltYWdlICAgICAgICAgICAgICAgICAgICAgNzMgCisjZGVmaW5lIFhfUG9seVRleHQ4ICAgICAgICAgICAgICAgICAgICA3NCAgICAgCisjZGVmaW5lIFhfUG9seVRleHQxNiAgICAgICAgICAgICAgICAgICA3NSAgICAgIAorI2RlZmluZSBYX0ltYWdlVGV4dDggICAgICAgICAgICAgICAgICAgNzYgICAgICAKKyNkZWZpbmUgWF9JbWFnZVRleHQxNiAgICAgICAgICAgICAgICAgIDc3ICAgICAgIAorI2RlZmluZSBYX0NyZWF0ZUNvbG9ybWFwICAgICAgICAgICAgICAgNzggICAgICAgICAgCisjZGVmaW5lIFhfRnJlZUNvbG9ybWFwICAgICAgICAgICAgICAgICA3OSAgICAgICAgCisjZGVmaW5lIFhfQ29weUNvbG9ybWFwQW5kRnJlZSAgICAgICAgICA4MCAgICAgICAgICAgICAgIAorI2RlZmluZSBYX0luc3RhbGxDb2xvcm1hcCAgICAgICAgICAgICAgODEgICAgICAgICAgIAorI2RlZmluZSBYX1VuaW5zdGFsbENvbG9ybWFwICAgICAgICAgICAgODIgICAgICAgICAgICAgCisjZGVmaW5lIFhfTGlzdEluc3RhbGxlZENvbG9ybWFwcyAgICAgICA4MyAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBYX0FsbG9jQ29sb3IgICAgICAgICAgICAgICAgICAgODQgICAgICAKKyNkZWZpbmUgWF9BbGxvY05hbWVkQ29sb3IgICAgICAgICAgICAgIDg1ICAgICAgICAgICAKKyNkZWZpbmUgWF9BbGxvY0NvbG9yQ2VsbHMgICAgICAgICAgICAgIDg2ICAgICAgICAgICAKKyNkZWZpbmUgWF9BbGxvY0NvbG9yUGxhbmVzICAgICAgICAgICAgIDg3ICAgICAgICAgICAgCisjZGVmaW5lIFhfRnJlZUNvbG9ycyAgICAgICAgICAgICAgICAgICA4OCAgICAgIAorI2RlZmluZSBYX1N0b3JlQ29sb3JzICAgICAgICAgICAgICAgICAgODkgICAgICAgCisjZGVmaW5lIFhfU3RvcmVOYW1lZENvbG9yICAgICAgICAgICAgICA5MCAgICAgICAgICAgCisjZGVmaW5lIFhfUXVlcnlDb2xvcnMgICAgICAgICAgICAgICAgICA5MSAgICAgICAKKyNkZWZpbmUgWF9Mb29rdXBDb2xvciAgICAgICAgICAgICAgICAgIDkyICAgICAgIAorI2RlZmluZSBYX0NyZWF0ZUN1cnNvciAgICAgICAgICAgICAgICAgOTMgICAgICAgIAorI2RlZmluZSBYX0NyZWF0ZUdseXBoQ3Vyc29yICAgICAgICAgICAgOTQgICAgICAgICAgICAgCisjZGVmaW5lIFhfRnJlZUN1cnNvciAgICAgICAgICAgICAgICAgICA5NSAgICAgIAorI2RlZmluZSBYX1JlY29sb3JDdXJzb3IgICAgICAgICAgICAgICAgOTYgICAgICAgICAKKyNkZWZpbmUgWF9RdWVyeUJlc3RTaXplICAgICAgICAgICAgICAgIDk3ICAgICAgICAgCisjZGVmaW5lIFhfUXVlcnlFeHRlbnNpb24gICAgICAgICAgICAgICA5OCAgICAgICAgICAKKyNkZWZpbmUgWF9MaXN0RXh0ZW5zaW9ucyAgICAgICAgICAgICAgIDk5ICAgICAgICAgIAorI2RlZmluZSBYX0NoYW5nZUtleWJvYXJkTWFwcGluZyAgICAgICAgMTAwCisjZGVmaW5lIFhfR2V0S2V5Ym9hcmRNYXBwaW5nICAgICAgICAgICAxMDEKKyNkZWZpbmUgWF9DaGFuZ2VLZXlib2FyZENvbnRyb2wgICAgICAgIDEwMiAgICAgICAgICAgICAgICAKKyNkZWZpbmUgWF9HZXRLZXlib2FyZENvbnRyb2wgICAgICAgICAgIDEwMyAgICAgICAgICAgICAKKyNkZWZpbmUgWF9CZWxsICAgICAgICAgICAgICAgICAgICAgICAgIDEwNAorI2RlZmluZSBYX0NoYW5nZVBvaW50ZXJDb250cm9sICAgICAgICAgMTA1CisjZGVmaW5lIFhfR2V0UG9pbnRlckNvbnRyb2wgICAgICAgICAgICAxMDYKKyNkZWZpbmUgWF9TZXRTY3JlZW5TYXZlciAgICAgICAgICAgICAgIDEwNyAgICAgICAgICAKKyNkZWZpbmUgWF9HZXRTY3JlZW5TYXZlciAgICAgICAgICAgICAgIDEwOCAgICAgICAgICAKKyNkZWZpbmUgWF9DaGFuZ2VIb3N0cyAgICAgICAgICAgICAgICAgIDEwOSAgICAgICAKKyNkZWZpbmUgWF9MaXN0SG9zdHMgICAgICAgICAgICAgICAgICAgIDExMCAgICAgCisjZGVmaW5lIFhfU2V0QWNjZXNzQ29udHJvbCAgICAgICAgICAgICAxMTEgICAgICAgICAgICAgICAKKyNkZWZpbmUgWF9TZXRDbG9zZURvd25Nb2RlICAgICAgICAgICAgIDExMgorI2RlZmluZSBYX0tpbGxDbGllbnQgICAgICAgICAgICAgICAgICAgMTEzIAorI2RlZmluZSBYX1JvdGF0ZVByb3BlcnRpZXMJICAgICAgIDExNAorI2RlZmluZSBYX0ZvcmNlU2NyZWVuU2F2ZXIJICAgICAgIDExNQorI2RlZmluZSBYX1NldFBvaW50ZXJNYXBwaW5nICAgICAgICAgICAgMTE2CisjZGVmaW5lIFhfR2V0UG9pbnRlck1hcHBpbmcgICAgICAgICAgICAxMTcKKyNkZWZpbmUgWF9TZXRNb2RpZmllck1hcHBpbmcJICAgICAgIDExOAorI2RlZmluZSBYX0dldE1vZGlmaWVyTWFwcGluZwkgICAgICAgMTE5CisjZGVmaW5lIFhfTm9PcGVyYXRpb24gICAgICAgICAgICAgICAgICAxMjcKKworLyogcmVzdG9yZSB0aGVzZSBkZWZpbml0aW9ucyBiYWNrIHRvIHRoZSB0eXBlZGVmcyBpbiBYLmggKi8KKyN1bmRlZiBXaW5kb3cKKyN1bmRlZiBEcmF3YWJsZQorI3VuZGVmIEZvbnQKKyN1bmRlZiBQaXhtYXAKKyN1bmRlZiBDdXJzb3IKKyN1bmRlZiBDb2xvcm1hcAorI3VuZGVmIEdDb250ZXh0CisjdW5kZWYgQXRvbQorI3VuZGVmIFZpc3VhbElECisjdW5kZWYgVGltZQorI3VuZGVmIEtleUNvZGUKKyN1bmRlZiBLZXlTeW0KKworI2VuZGlmIC8qIFhQUk9UT19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcHJvdG9zdHIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hwcm90b3N0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTg1NGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcHJvdG9zdHIuaApAQCAtMCwwICsxLDc3IEBACisjaWZuZGVmIFhQUk9UT1NUUlVDVFNfSAorI2RlZmluZSBYUFJPVE9TVFJVQ1RTX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg3LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisKK0NvcHlyaWdodCAxOTg3IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAorCitESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8WDExL1htZC5oPgorCisvKiBVc2VkIGJ5IFBvbHlTZWdtZW50ICovCisKK3R5cGVkZWYgc3RydWN0IF94U2VnbWVudCB7CisgICAgSU5UMTYgeDEgQjE2LCB5MSBCMTYsIHgyIEIxNiwgeTIgQjE2OworfSB4U2VnbWVudDsKKworLyogUE9JTlQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3hQb2ludCB7CisJSU5UMTYJCXggQjE2LCB5IEIxNjsKK30geFBvaW50OworCit0eXBlZGVmIHN0cnVjdCBfeFJlY3RhbmdsZSB7CisgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworICAgIENBUkQxNiAgd2lkdGggQjE2LCBoZWlnaHQgQjE2OworfSB4UmVjdGFuZ2xlOworCisvKiAgQVJDICAqLworCit0eXBlZGVmIHN0cnVjdCBfeEFyYyB7CisgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworICAgIENBUkQxNiAgIHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKyAgICBJTlQxNiAgIGFuZ2xlMSBCMTYsIGFuZ2xlMiBCMTY7Cit9IHhBcmM7CisKKyNlbmRpZiAvKiBYUFJPVE9TVFJVQ1RTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hyZWdpb24uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hyZWdpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjVkNzBiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHJlZ2lvbi5oCkBAIC0wLDAgKzEsMTg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg3LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisKK0NvcHlyaWdodCAxOTg3IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9YMTFfWFJFR0lPTl9IXworI2RlZmluZSBfWDExX1hSRUdJT05fSF8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHNob3J0IHgxLCB4MiwgeTEsIHkyOworfSBCb3gsIEJPWCwgQm94UmVjLCAqQm94UHRyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2hvcnQgeCwgeSwgd2lkdGgsIGhlaWdodDsKK31SRUNUQU5HTEUsIFJlY3RhbmdsZVJlYywgKlJlY3RhbmdsZVB0cjsKKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBNQVhTSE9SVCAzMjc2NworI2RlZmluZSBNSU5TSE9SVCAtTUFYU0hPUlQKKyNpZm5kZWYgTUFYCisjZGVmaW5lIE1BWChhLGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKyNlbmRpZgorI2lmbmRlZiBNSU4KKyNkZWZpbmUgTUlOKGEsYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKworLyoKKyAqICAgY2xpcCByZWdpb24KKyAqLworCit0eXBlZGVmIHN0cnVjdCBfWFJlZ2lvbiB7CisgICAgbG9uZyBzaXplOworICAgIGxvbmcgbnVtUmVjdHM7CisgICAgQk9YICpyZWN0czsKKyAgICBCT1ggZXh0ZW50czsKK30gUkVHSU9OOworCisvKiBYdXRpbC5oIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbjoKKyAqIHR5cGVkZWYgc3RydWN0IF9YUmVnaW9uICpSZWdpb247CisgKi8KKworLyogIDEgaWYgdHdvIEJPWHMgb3ZlcmxhcC4KKyAqICAwIGlmIHR3byBCT1hzIGRvIG5vdCBvdmVybGFwLgorICogIFJlbWVtYmVyLCB4MiBhbmQgeTIgYXJlIG5vdCBpbiB0aGUgcmVnaW9uCisgKi8KKyNkZWZpbmUgRVhURU5UQ0hFQ0socjEsIHIyKSBcCisJKChyMSktPngyID4gKHIyKS0+eDEgJiYgXAorCSAocjEpLT54MSA8IChyMiktPngyICYmIFwKKwkgKHIxKS0+eTIgPiAocjIpLT55MSAmJiBcCisJIChyMSktPnkxIDwgKHIyKS0+eTIpCisKKy8qCisgKiAgdXBkYXRlIHJlZ2lvbiBleHRlbnRzCisgKi8KKyNkZWZpbmUgRVhURU5UUyhyLGlkUmVjdCl7XAorICAgICAgICAgICAgaWYoKHIpLT54MSA8IChpZFJlY3QpLT5leHRlbnRzLngxKVwKKyAgICAgICAgICAgICAgKGlkUmVjdCktPmV4dGVudHMueDEgPSAociktPngxO1wKKyAgICAgICAgICAgIGlmKChyKS0+eTEgPCAoaWRSZWN0KS0+ZXh0ZW50cy55MSlcCisgICAgICAgICAgICAgIChpZFJlY3QpLT5leHRlbnRzLnkxID0gKHIpLT55MTtcCisgICAgICAgICAgICBpZigociktPngyID4gKGlkUmVjdCktPmV4dGVudHMueDIpXAorICAgICAgICAgICAgICAoaWRSZWN0KS0+ZXh0ZW50cy54MiA9IChyKS0+eDI7XAorICAgICAgICAgICAgaWYoKHIpLT55MiA+IChpZFJlY3QpLT5leHRlbnRzLnkyKVwKKyAgICAgICAgICAgICAgKGlkUmVjdCktPmV4dGVudHMueTIgPSAociktPnkyO1wKKyAgICAgICAgfQorCisvKgorICogICBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgZW5vdWdoIG1lbW9yeSBpbiB0aGUgcHJlc2VudCByZWdpb24uCisgKi8KKyNkZWZpbmUgTUVNQ0hFQ0socmVnLCByZWN0LCBmaXJzdHJlY3Qpe1wKKyAgICAgICAgaWYgKChyZWcpLT5udW1SZWN0cyA+PSAoKHJlZyktPnNpemUgLSAxKSl7XAorICAgICAgICAgIChmaXJzdHJlY3QpID0gKEJPWCAqKSBYcmVhbGxvYyBcCisgICAgICAgICAgKChjaGFyICopKGZpcnN0cmVjdCksICh1bnNpZ25lZCkgKDIgKiAoc2l6ZW9mKEJPWCkpICogKChyZWcpLT5zaXplKSkpO1wKKyAgICAgICAgICBpZiAoKGZpcnN0cmVjdCkgPT0gMClcCisgICAgICAgICAgICByZXR1cm4oMCk7XAorICAgICAgICAgIChyZWcpLT5zaXplICo9IDI7XAorICAgICAgICAgIChyZWN0KSA9ICYoZmlyc3RyZWN0KVsocmVnKS0+bnVtUmVjdHNdO1wKKyAgICAgICAgIH1cCisgICAgICAgfQorCisvKiAgdGhpcyByb3V0aW5lIGNoZWNrcyB0byBzZWUgaWYgdGhlIHByZXZpb3VzIHJlY3RhbmdsZSBpcyB0aGUgc2FtZQorICogIG9yIHN1YnN1bWVzIHRoZSBuZXcgcmVjdGFuZ2xlIHRvIGFkZC4KKyAqLworCisjZGVmaW5lIENIRUNLX1BSRVZJT1VTKFJlZywgUiwgUngxLCBSeTEsIFJ4MiwgUnkyKVwKKyAgICAgICAgICAgICAgICghKCgoUmVnKS0+bnVtUmVjdHMgPiAwKSYmXAorICAgICAgICAgICAgICAgICAgKChSLTEpLT55MSA9PSAoUnkxKSkgJiZcCisgICAgICAgICAgICAgICAgICAoKFItMSktPnkyID09IChSeTIpKSAmJlwKKyAgICAgICAgICAgICAgICAgICgoUi0xKS0+eDEgPD0gKFJ4MSkpICYmXAorICAgICAgICAgICAgICAgICAgKChSLTEpLT54MiA+PSAoUngyKSkpKQorCisvKiAgYWRkIGEgcmVjdGFuZ2xlIHRvIHRoZSBnaXZlbiBSZWdpb24gKi8KKyNkZWZpbmUgQUREUkVDVChyZWcsIHIsIHJ4MSwgcnkxLCByeDIsIHJ5Mil7XAorICAgIGlmICgoKHJ4MSkgPCAocngyKSkgJiYgKChyeTEpIDwgKHJ5MikpICYmXAorICAgICAgICBDSEVDS19QUkVWSU9VUygocmVnKSwgKHIpLCAocngxKSwgKHJ5MSksIChyeDIpLCAocnkyKSkpe1wKKyAgICAgICAgICAgICAgKHIpLT54MSA9IChyeDEpO1wKKyAgICAgICAgICAgICAgKHIpLT55MSA9IChyeTEpO1wKKyAgICAgICAgICAgICAgKHIpLT54MiA9IChyeDIpO1wKKyAgICAgICAgICAgICAgKHIpLT55MiA9IChyeTIpO1wKKyAgICAgICAgICAgICAgRVhURU5UUygociksIChyZWcpKTtcCisgICAgICAgICAgICAgIChyZWcpLT5udW1SZWN0cysrO1wKKyAgICAgICAgICAgICAgKHIpKys7XAorICAgICAgICAgICAgfVwKKyAgICAgICAgfQorCisKKworLyogIGFkZCBhIHJlY3RhbmdsZSB0byB0aGUgZ2l2ZW4gUmVnaW9uICovCisjZGVmaW5lIEFERFJFQ1ROT1gocmVnLCByLCByeDEsIHJ5MSwgcngyLCByeTIpe1wKKyAgICAgICAgICAgIGlmICgocngxIDwgcngyKSAmJiAocnkxIDwgcnkyKSAmJlwKKyAgICAgICAgICAgICAgICBDSEVDS19QUkVWSU9VUygocmVnKSwgKHIpLCAocngxKSwgKHJ5MSksIChyeDIpLCAocnkyKSkpe1wKKyAgICAgICAgICAgICAgKHIpLT54MSA9IChyeDEpO1wKKyAgICAgICAgICAgICAgKHIpLT55MSA9IChyeTEpO1wKKyAgICAgICAgICAgICAgKHIpLT54MiA9IChyeDIpO1wKKyAgICAgICAgICAgICAgKHIpLT55MiA9IChyeTIpO1wKKyAgICAgICAgICAgICAgKHJlZyktPm51bVJlY3RzKys7XAorICAgICAgICAgICAgICAocikrKztcCisgICAgICAgICAgICB9XAorICAgICAgICB9CisKKyNkZWZpbmUgRU1QVFlfUkVHSU9OKHBSZWcpIHBSZWctPm51bVJlY3RzID0gMAorCisjZGVmaW5lIFJFR0lPTl9OT1RfRU1QVFkocFJlZykgcFJlZy0+bnVtUmVjdHMKKworI2RlZmluZSBJTkJPWChyLCB4LCB5KSBcCisgICAgICAoICggKChyKS54MiA+ICB4KSkgJiYgXAorICAgICAgICAoICgocikueDEgPD0geCkpICYmIFwKKyAgICAgICAgKCAoKHIpLnkyID4gIHkpKSAmJiBcCisgICAgICAgICggKChyKS55MSA8PSB5KSkgKQorCisvKgorICogbnVtYmVyIG9mIHBvaW50cyB0byBidWZmZXIgYmVmb3JlIHNlbmRpbmcgdGhlbSBvZmYKKyAqIHRvIHNjYW5saW5lcygpIDogIE11c3QgYmUgYW4gZXZlbiBudW1iZXIKKyAqLworI2RlZmluZSBOVU1QVFNUT0JVRkZFUiAyMDAKKworLyoKKyAqIHVzZWQgdG8gYWxsb2NhdGUgYnVmZmVycyBmb3IgcG9pbnRzIGFuZCBsaW5rCisgKiB0aGUgYnVmZmVycyB0b2dldGhlcgorICovCit0eXBlZGVmIHN0cnVjdCBfUE9JTlRCTE9DSyB7CisgICAgWFBvaW50IHB0c1tOVU1QVFNUT0JVRkZFUl07CisgICAgc3RydWN0IF9QT0lOVEJMT0NLICpuZXh0OworfSBQT0lOVEJMT0NLOworCisjZW5kaWYgLyogX1gxMV9YUkVHSU9OX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcmVzb3VyY2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hyZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYmIzY2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcmVzb3VyY2UuaApAQCAtMCwwICsxLDM1OCBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODcsIDE5ODgsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKworQ29weXJpZ2h0IDE5ODcsIDE5ODggYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgRGlnaXRhbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1gxMV9YUkVTT1VSQ0VfSF8KKyNkZWZpbmUgX1gxMV9YUkVTT1VSQ0VfSF8KKworI2lmbmRlZiBfWFBfUFJJTlRfU0VSVkVSXworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKgorICoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioKKyAqKiogICAgICAgICAgWCBSZXNvdXJjZSBNYW5hZ2VyIEludHJpbnNpY3MgICAgICAgICAgICAgICAgICAgKioqCisgKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKgorICoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworX1hGVU5DUFJPVE9CRUdJTgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1lbW9yeSBNYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBjaGFyICpYcGVybWFsbG9jKAorICAgIHVuc2lnbmVkIGludAkvKiBzaXplICovCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFF1YXJrIE1hbmFnZW1lbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBpbnQgICAgICAgWHJtUXVhcmssICpYcm1RdWFya0xpc3Q7CisjZGVmaW5lIE5VTExRVUFSSyAoKFhybVF1YXJrKSAwKQorCit0eXBlZGVmIGNoYXIgKlhybVN0cmluZzsKKyNkZWZpbmUgTlVMTFNUUklORyAoKFhybVN0cmluZykgMCkKKworLyogZmluZCBxdWFyayBmb3Igc3RyaW5nLCBjcmVhdGUgbmV3IHF1YXJrIGlmIG5vbmUgYWxyZWFkeSBleGlzdHMgKi8KK2V4dGVybiBYcm1RdWFyayBYcm1TdHJpbmdUb1F1YXJrKAorICAgIF9YY29uc3QgY2hhciogCS8qIHN0cmluZyAqLworKTsKKworZXh0ZXJuIFhybVF1YXJrIFhybVBlcm1TdHJpbmdUb1F1YXJrKAorICAgIF9YY29uc3QgY2hhciogCS8qIHN0cmluZyAqLworKTsKKworLyogZmluZCBzdHJpbmcgZm9yIHF1YXJrICovCitleHRlcm4gWHJtU3RyaW5nIFhybVF1YXJrVG9TdHJpbmcoCisgICAgWHJtUXVhcmsgCQkvKiBxdWFyayAqLworKTsKKworZXh0ZXJuIFhybVF1YXJrIFhybVVuaXF1ZVF1YXJrKAorICAgIHZvaWQKKyk7CisKKyNkZWZpbmUgWHJtU3RyaW5nc0VxdWFsKGExLCBhMikgKHN0cmNtcChhMSwgYTIpID09IDApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb252ZXJzaW9uIG9mIFN0cmluZ3MgdG8gTGlzdHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBlbnVtIHtYcm1CaW5kVGlnaHRseSwgWHJtQmluZExvb3NlbHl9IFhybUJpbmRpbmcsICpYcm1CaW5kaW5nTGlzdDsKKworZXh0ZXJuIHZvaWQgWHJtU3RyaW5nVG9RdWFya0xpc3QoCisgICAgX1hjb25zdCBjaGFyKgkvKiBzdHJpbmcgKi8sCisgICAgWHJtUXVhcmtMaXN0CS8qIHF1YXJrc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiB2b2lkIFhybVN0cmluZ1RvQmluZGluZ1F1YXJrTGlzdCgKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLywKKyAgICBYcm1CaW5kaW5nTGlzdAkvKiBiaW5kaW5nc19yZXR1cm4gKi8sCisgICAgWHJtUXVhcmtMaXN0CS8qIHF1YXJrc19yZXR1cm4gKi8KKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZSBhbmQgQ2xhc3MgbGlzdHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgWHJtUXVhcmsgICAgIFhybU5hbWU7Cit0eXBlZGVmIFhybVF1YXJrTGlzdCBYcm1OYW1lTGlzdDsKKyNkZWZpbmUgWHJtTmFtZVRvU3RyaW5nKG5hbWUpCQlYcm1RdWFya1RvU3RyaW5nKG5hbWUpCisjZGVmaW5lIFhybVN0cmluZ1RvTmFtZShzdHJpbmcpCQlYcm1TdHJpbmdUb1F1YXJrKHN0cmluZykKKyNkZWZpbmUgWHJtU3RyaW5nVG9OYW1lTGlzdChzdHIsIG5hbWUpCVhybVN0cmluZ1RvUXVhcmtMaXN0KHN0ciwgbmFtZSkKKwordHlwZWRlZiBYcm1RdWFyayAgICAgWHJtQ2xhc3M7Cit0eXBlZGVmIFhybVF1YXJrTGlzdCBYcm1DbGFzc0xpc3Q7CisjZGVmaW5lIFhybUNsYXNzVG9TdHJpbmcoY19jbGFzcykJWHJtUXVhcmtUb1N0cmluZyhjX2NsYXNzKQorI2RlZmluZSBYcm1TdHJpbmdUb0NsYXNzKGNfY2xhc3MpCVhybVN0cmluZ1RvUXVhcmsoY19jbGFzcykKKyNkZWZpbmUgWHJtU3RyaW5nVG9DbGFzc0xpc3Qoc3RyLGNfY2xhc3MpIFhybVN0cmluZ1RvUXVhcmtMaXN0KHN0ciwgY19jbGFzcykKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVzb3VyY2UgUmVwcmVzZW50YXRpb24gVHlwZXMgYW5kIFZhbHVlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIFhybVF1YXJrICAgICBYcm1SZXByZXNlbnRhdGlvbjsKKyNkZWZpbmUgWHJtU3RyaW5nVG9SZXByZXNlbnRhdGlvbihzdHJpbmcpICAgWHJtU3RyaW5nVG9RdWFyayhzdHJpbmcpCisjZGVmaW5lCVhybVJlcHJlc2VudGF0aW9uVG9TdHJpbmcodHlwZSkgICBYcm1RdWFya1RvU3RyaW5nKHR5cGUpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgICAgc2l6ZTsKKyAgICBYUG9pbnRlcgkgICAgYWRkcjsKK30gWHJtVmFsdWUsICpYcm1WYWx1ZVB0cjsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJlc291cmNlIE1hbmFnZXIgRnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9Ycm1IYXNoQnVja2V0UmVjICpYcm1IYXNoQnVja2V0OwordHlwZWRlZiBYcm1IYXNoQnVja2V0ICpYcm1IYXNoVGFibGU7Cit0eXBlZGVmIFhybUhhc2hUYWJsZSBYcm1TZWFyY2hMaXN0W107Cit0eXBlZGVmIHN0cnVjdCBfWHJtSGFzaEJ1Y2tldFJlYyAqWHJtRGF0YWJhc2U7CisKKworZXh0ZXJuIHZvaWQgWHJtRGVzdHJveURhdGFiYXNlKAorICAgIFhybURhdGFiYXNlCQkvKiBkYXRhYmFzZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWHJtUVB1dFJlc291cmNlKAorICAgIFhybURhdGFiYXNlKgkvKiBkYXRhYmFzZSAqLywKKyAgICBYcm1CaW5kaW5nTGlzdAkvKiBiaW5kaW5ncyAqLywKKyAgICBYcm1RdWFya0xpc3QJLyogcXVhcmtzICovLAorICAgIFhybVJlcHJlc2VudGF0aW9uCS8qIHR5cGUgKi8sCisgICAgWHJtVmFsdWUqCQkvKiB2YWx1ZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWHJtUHV0UmVzb3VyY2UoCisgICAgWHJtRGF0YWJhc2UqCS8qIGRhdGFiYXNlICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3BlY2lmaWVyICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdHlwZSAqLywKKyAgICBYcm1WYWx1ZSoJCS8qIHZhbHVlICovCispOworCitleHRlcm4gdm9pZCBYcm1RUHV0U3RyaW5nUmVzb3VyY2UoCisgICAgWHJtRGF0YWJhc2UqCS8qIGRhdGFiYXNlICovLAorICAgIFhybUJpbmRpbmdMaXN0ICAgICAgLyogYmluZGluZ3MgKi8sCisgICAgWHJtUXVhcmtMaXN0CS8qIHF1YXJrcyAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHZhbHVlICovCispOworCitleHRlcm4gdm9pZCBYcm1QdXRTdHJpbmdSZXNvdXJjZSgKKyAgICBYcm1EYXRhYmFzZSoJLyogZGF0YWJhc2UgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBzcGVjaWZpZXIgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB2YWx1ZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWHJtUHV0TGluZVJlc291cmNlKAorICAgIFhybURhdGFiYXNlKgkvKiBkYXRhYmFzZSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGxpbmUgKi8KKyk7CisKK2V4dGVybiBCb29sIFhybVFHZXRSZXNvdXJjZSgKKyAgICBYcm1EYXRhYmFzZQkJLyogZGF0YWJhc2UgKi8sCisgICAgWHJtTmFtZUxpc3QJCS8qIHF1YXJrX25hbWUgKi8sCisgICAgWHJtQ2xhc3NMaXN0CS8qIHF1YXJrX2NsYXNzICovLAorICAgIFhybVJlcHJlc2VudGF0aW9uKgkvKiBxdWFya190eXBlX3JldHVybiAqLywKKyAgICBYcm1WYWx1ZSoJCS8qIHZhbHVlX3JldHVybiAqLworKTsKKworZXh0ZXJuIEJvb2wgWHJtR2V0UmVzb3VyY2UoCisgICAgWHJtRGF0YWJhc2UJCS8qIGRhdGFiYXNlICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyX25hbWUgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBzdHJfY2xhc3MgKi8sCisgICAgY2hhcioqCQkvKiBzdHJfdHlwZV9yZXR1cm4gKi8sCisgICAgWHJtVmFsdWUqCQkvKiB2YWx1ZV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBCb29sIFhybVFHZXRTZWFyY2hMaXN0KAorICAgIFhybURhdGFiYXNlCQkvKiBkYXRhYmFzZSAqLywKKyAgICBYcm1OYW1lTGlzdAkJLyogbmFtZXMgKi8sCisgICAgWHJtQ2xhc3NMaXN0CS8qIGNsYXNzZXMgKi8sCisgICAgWHJtU2VhcmNoTGlzdAkvKiBsaXN0X3JldHVybiAqLywKKyAgICBpbnQJCQkvKiBsaXN0X2xlbmd0aCAqLworKTsKKworZXh0ZXJuIEJvb2wgWHJtUUdldFNlYXJjaFJlc291cmNlKAorICAgIFhybVNlYXJjaExpc3QJLyogbGlzdCAqLywKKyAgICBYcm1OYW1lCQkvKiBuYW1lICovLAorICAgIFhybUNsYXNzCQkvKiBjbGFzcyAqLywKKyAgICBYcm1SZXByZXNlbnRhdGlvbioJLyogdHlwZV9yZXR1cm4gKi8sCisgICAgWHJtVmFsdWUqCQkvKiB2YWx1ZV9yZXR1cm4gKi8KKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVzb3VyY2UgRGF0YWJhc2UgTWFuYWdlbWVudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9YUF9QUklOVF9TRVJWRVJfCisKK2V4dGVybiB2b2lkIFhybVNldERhdGFiYXNlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhybURhdGFiYXNlCQkvKiBkYXRhYmFzZSAqLworKTsKKworZXh0ZXJuIFhybURhdGFiYXNlIFhybUdldERhdGFiYXNlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCisjZW5kaWYgLyogIV9YUF9QUklOVF9TRVJWRVJfICovCisKK2V4dGVybiBYcm1EYXRhYmFzZSBYcm1HZXRGaWxlRGF0YWJhc2UoCisgICAgX1hjb25zdCBjaGFyKgkvKiBmaWxlbmFtZSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYcm1Db21iaW5lRmlsZURhdGFiYXNlKAorICAgIF9YY29uc3QgY2hhciogCS8qIGZpbGVuYW1lICovLAorICAgIFhybURhdGFiYXNlKgkvKiB0YXJnZXQgKi8sCisgICAgQm9vbAkJLyogb3ZlcnJpZGUgKi8KKyk7CisKK2V4dGVybiBYcm1EYXRhYmFzZSBYcm1HZXRTdHJpbmdEYXRhYmFzZSgKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGRhdGEgKi8gIC8qICBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nICovCispOworCitleHRlcm4gdm9pZCBYcm1QdXRGaWxlRGF0YWJhc2UoCisgICAgWHJtRGF0YWJhc2UJCS8qIGRhdGFiYXNlICovLAorICAgIF9YY29uc3QgY2hhcioJLyogZmlsZW5hbWUgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhybU1lcmdlRGF0YWJhc2VzKAorICAgIFhybURhdGFiYXNlCQkvKiBzb3VyY2VfZGIgKi8sCisgICAgWHJtRGF0YWJhc2UqCS8qIHRhcmdldF9kYiAqLworKTsKKworZXh0ZXJuIHZvaWQgWHJtQ29tYmluZURhdGFiYXNlKAorICAgIFhybURhdGFiYXNlCQkvKiBzb3VyY2VfZGIgKi8sCisgICAgWHJtRGF0YWJhc2UqCS8qIHRhcmdldF9kYiAqLywKKyAgICBCb29sCQkvKiBvdmVycmlkZSAqLworKTsKKworI2RlZmluZSBYcm1FbnVtQWxsTGV2ZWxzIDAKKyNkZWZpbmUgWHJtRW51bU9uZUxldmVsICAxCisKK2V4dGVybiBCb29sIFhybUVudW1lcmF0ZURhdGFiYXNlKAorICAgIFhybURhdGFiYXNlCQkvKiBkYiAqLywKKyAgICBYcm1OYW1lTGlzdAkJLyogbmFtZV9wcmVmaXggKi8sCisgICAgWHJtQ2xhc3NMaXN0CS8qIGNsYXNzX3ByZWZpeCAqLywKKyAgICBpbnQJCQkvKiBtb2RlICovLAorICAgIEJvb2wgKCopKAorCSAgICAgWHJtRGF0YWJhc2UqCS8qIGRiICovLAorCSAgICAgWHJtQmluZGluZ0xpc3QJLyogYmluZGluZ3MgKi8sCisJICAgICBYcm1RdWFya0xpc3QJLyogcXVhcmtzICovLAorCSAgICAgWHJtUmVwcmVzZW50YXRpb24qCS8qIHR5cGUgKi8sCisJICAgICBYcm1WYWx1ZSoJCS8qIHZhbHVlICovLAorCSAgICAgWFBvaW50ZXIJCS8qIGNsb3N1cmUgKi8KKwkgICAgICkJCS8qIHByb2MgKi8sCisgICAgWFBvaW50ZXIJCS8qIGNsb3N1cmUgKi8KKyk7CisKK2V4dGVybiBjb25zdCBjaGFyICpYcm1Mb2NhbGVPZkRhdGFiYXNlKAorICAgIFhybURhdGFiYXNlIAkvKiBkYXRhYmFzZSAqLworKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvbW1hbmQgbGluZSBvcHRpb24gbWFwcGluZyB0byByZXNvdXJjZSBlbnRyaWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgZW51bSB7CisgICAgWHJtb3B0aW9uTm9BcmcsCS8qIFZhbHVlIGlzIHNwZWNpZmllZCBpbiBPcHRpb25EZXNjUmVjLnZhbHVlCSAgICAqLworICAgIFhybW9wdGlvbklzQXJnLCAgICAgLyogVmFsdWUgaXMgdGhlIG9wdGlvbiBzdHJpbmcgaXRzZWxmCQkgICAgKi8KKyAgICBYcm1vcHRpb25TdGlja3lBcmcsIC8qIFZhbHVlIGlzIGNoYXJhY3RlcnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIG9wdGlvbiAqLworICAgIFhybW9wdGlvblNlcEFyZywgICAgLyogVmFsdWUgaXMgbmV4dCBhcmd1bWVudCBpbiBhcmd2CQkgICAgKi8KKyAgICBYcm1vcHRpb25SZXNBcmcsCS8qIFJlc291cmNlIGFuZCB2YWx1ZSBpbiBuZXh0IGFyZ3VtZW50IGluIGFyZ3YgICAgICAqLworICAgIFhybW9wdGlvblNraXBBcmcsICAgLyogSWdub3JlIHRoaXMgb3B0aW9uIGFuZCB0aGUgbmV4dCBhcmd1bWVudCBpbiBhcmd2ICovCisgICAgWHJtb3B0aW9uU2tpcExpbmUsICAvKiBJZ25vcmUgdGhpcyBvcHRpb24gYW5kIHRoZSByZXN0IG9mIGFyZ3YJICAgICovCisgICAgWHJtb3B0aW9uU2tpcE5BcmdzCS8qIElnbm9yZSB0aGlzIG9wdGlvbiBhbmQgdGhlIG5leHQKKwkJCSAgIE9wdGlvbkRlc2NSZXMudmFsdWUgYXJndW1lbnRzIGluIGFyZ3YgKi8KK30gWHJtT3B0aW9uS2luZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIJICAgICpvcHRpb247CSAgICAvKiBPcHRpb24gYWJicmV2aWF0aW9uIGluIGFyZ3YJICAgICovCisgICAgY2hhcgkgICAgKnNwZWNpZmllcjsgICAgIC8qIFJlc291cmNlIHNwZWNpZmllcgkJICAgICovCisgICAgWHJtT3B0aW9uS2luZCAgIGFyZ0tpbmQ7CSAgICAvKiBXaGljaCBzdHlsZSBvZiBvcHRpb24gaXQgaXMJICAgICovCisgICAgWFBvaW50ZXIJICAgIHZhbHVlOwkgICAgLyogVmFsdWUgdG8gcHJvdmlkZSBpZiBYcm1vcHRpb25Ob0FyZyAgICovCit9IFhybU9wdGlvbkRlc2NSZWMsICpYcm1PcHRpb25EZXNjTGlzdDsKKworCitleHRlcm4gdm9pZCBYcm1QYXJzZUNvbW1hbmQoCisgICAgWHJtRGF0YWJhc2UqCS8qIGRhdGFiYXNlICovLAorICAgIFhybU9wdGlvbkRlc2NMaXN0CS8qIHRhYmxlICovLAorICAgIGludAkJCS8qIHRhYmxlX2NvdW50ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogbmFtZSAqLywKKyAgICBpbnQqCQkvKiBhcmdjX2luX291dCAqLywKKyAgICBjaGFyKioJCS8qIGFyZ3ZfaW5fb3V0ICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX1gxMV9YUkVTT1VSQ0VfSF8gKi8KKy8qIERPTidUIEFERCBTVFVGRiBBRlRFUiBUSElTICNlbmRpZiAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHRocmVhZHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h0aHJlYWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0NDIwOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h0aHJlYWRzLmgKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKgorQ29weXJpZ2h0IDE5OTMsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisgKiAqCisgKi8KKworI2lmbmRlZiBfWFRIUkVBRFNfSF8KKyMgZGVmaW5lIF9YVEhSRUFEU19IXworCisvKiBSZWRlZmluZSB0aGVzZSB0byBYdE1hbGxvYy9YdEZyZWUgb3Igd2hhdGV2ZXIgeW91IHdhbnQgYmVmb3JlIGluY2x1ZGluZworICogdGhpcyBoZWFkZXIgZmlsZS4KKyAqLworIyBpZm5kZWYgeG1hbGxvYworIyAgZGVmaW5lIHhtYWxsb2MgbWFsbG9jCisjIGVuZGlmCisjIGlmbmRlZiB4ZnJlZQorIyAgZGVmaW5lIHhmcmVlIGZyZWUKKyMgZW5kaWYKKworIyBpZmRlZiBDVEhSRUFEUworIyAgaW5jbHVkZSA8Y3RocmVhZHMuaD4KK3R5cGVkZWYgY3RocmVhZF90IHh0aHJlYWRfdDsKK3R5cGVkZWYgc3RydWN0IGNvbmRpdGlvbiB4Y29uZGl0aW9uX3JlYzsKK3R5cGVkZWYgc3RydWN0IG11dGV4IHhtdXRleF9yZWM7CisjICBkZWZpbmUgeHRocmVhZF9pbml0KCkgY3RocmVhZF9pbml0KCkKKyMgIGRlZmluZSB4dGhyZWFkX3NlbGYgY3RocmVhZF9zZWxmCisjICBkZWZpbmUgeHRocmVhZF9mb3JrKGZ1bmMsY2xvc3VyZSkgY3RocmVhZF9mb3JrKGZ1bmMsY2xvc3VyZSkKKyMgIGRlZmluZSB4dGhyZWFkX3lpZWxkKCkgY3RocmVhZF95aWVsZCgpCisjICBkZWZpbmUgeHRocmVhZF9leGl0KHYpIGN0aHJlYWRfZXhpdCh2KQorIyAgZGVmaW5lIHh0aHJlYWRfc2V0X25hbWUodCxzdHIpIGN0aHJlYWRfc2V0X25hbWUodCxzdHIpCisjICBkZWZpbmUgeG11dGV4X2luaXQobSkgbXV0ZXhfaW5pdChtKQorIyAgZGVmaW5lIHhtdXRleF9jbGVhcihtKSBtdXRleF9jbGVhcihtKQorIyAgZGVmaW5lIHhtdXRleF9sb2NrKG0pIG11dGV4X2xvY2sobSkKKyMgIGRlZmluZSB4bXV0ZXhfdW5sb2NrKG0pIG11dGV4X3VubG9jayhtKQorIyAgZGVmaW5lIHhtdXRleF9zZXRfbmFtZShtLHN0cikgbXV0ZXhfc2V0X25hbWUobSxzdHIpCisjICBkZWZpbmUgeGNvbmRpdGlvbl9pbml0KGN2KSBjb25kaXRpb25faW5pdChjdikKKyMgIGRlZmluZSB4Y29uZGl0aW9uX2NsZWFyKGN2KSBjb25kaXRpb25fY2xlYXIoY3YpCisjICBkZWZpbmUgeGNvbmRpdGlvbl93YWl0KGN2LG0pIGNvbmRpdGlvbl93YWl0KGN2LG0pCisjICBkZWZpbmUgeGNvbmRpdGlvbl9zaWduYWwoY3YpIGNvbmRpdGlvbl9zaWduYWwoY3YpCisjICBkZWZpbmUgeGNvbmRpdGlvbl9icm9hZGNhc3QoY3YpIGNvbmRpdGlvbl9icm9hZGNhc3QoY3YpCisjICBkZWZpbmUgeGNvbmRpdGlvbl9zZXRfbmFtZShjdixzdHIpIGNvbmRpdGlvbl9zZXRfbmFtZShjdixzdHIpCisjIGVsc2UgLyogIUNUSFJFQURTICovCisjICBpZiBkZWZpbmVkKFNWUjQpCisjICAgaW5jbHVkZSA8dGhyZWFkLmg+CisjICAgaW5jbHVkZSA8c3luY2guaD4KK3R5cGVkZWYgdGhyZWFkX3QgeHRocmVhZF90OwordHlwZWRlZiB0aHJlYWRfa2V5X3QgeHRocmVhZF9rZXlfdDsKK3R5cGVkZWYgY29uZF90IHhjb25kaXRpb25fcmVjOwordHlwZWRlZiBtdXRleF90IHhtdXRleF9yZWM7CisjICAgaWYgZGVmaW5lZChfX1VOSVhXQVJFX18pCitleHRlcm4geHRocmVhZF90ICgqX3gxMV90aHJfc2VsZikoKTsKKyMgICAgZGVmaW5lIHh0aHJlYWRfc2VsZiAgKF94MTFfdGhyX3NlbGYpCisjICAgZWxzZQorIyAgICBkZWZpbmUgeHRocmVhZF9zZWxmIHRocl9zZWxmCisjICAgZW5kaWYKKyMgICBkZWZpbmUgeHRocmVhZF9mb3JrKGZ1bmMsY2xvc3VyZSkgdGhyX2NyZWF0ZShOVUxMLDAsZnVuYyxjbG9zdXJlLFRIUl9ORVdfTFdQfFRIUl9ERVRBQ0hFRCxOVUxMKQorIyAgIGRlZmluZSB4dGhyZWFkX3lpZWxkKCkgdGhyX3lpZWxkKCkKKyMgICBkZWZpbmUgeHRocmVhZF9leGl0KHYpIHRocl9leGl0KHYpCisjICAgZGVmaW5lIHh0aHJlYWRfa2V5X2NyZWF0ZShrcCxkKSB0aHJfa2V5Y3JlYXRlKGtwLGQpCisjICAgaWZkZWYgX19zdW4KKyMgICAgZGVmaW5lIHh0aHJlYWRfa2V5X2RlbGV0ZShrKSAwCisjICAgZWxzZQorIyAgICBkZWZpbmUgeHRocmVhZF9rZXlfZGVsZXRlKGspIHRocl9rZXlkZWxldGUoaykKKyMgICBlbmRpZgorIyAgIGRlZmluZSB4dGhyZWFkX3NldF9zcGVjaWZpYyhrLHYpIHRocl9zZXRzcGVjaWZpYyhrLHYpCisjICAgZGVmaW5lIHh0aHJlYWRfZ2V0X3NwZWNpZmljKGssdnApIHRocl9nZXRzcGVjaWZpYyhrLHZwKQorIyAgIGRlZmluZSB4bXV0ZXhfaW5pdChtKSBtdXRleF9pbml0KG0sVVNZTkNfVEhSRUFELDApCisjICAgZGVmaW5lIHhtdXRleF9jbGVhcihtKSBtdXRleF9kZXN0cm95KG0pCisjICAgZGVmaW5lIHhtdXRleF9sb2NrKG0pIG11dGV4X2xvY2sobSkKKyMgICBkZWZpbmUgeG11dGV4X3VubG9jayhtKSBtdXRleF91bmxvY2sobSkKKyMgICBkZWZpbmUgeGNvbmRpdGlvbl9pbml0KGN2KSBjb25kX2luaXQoY3YsVVNZTkNfVEhSRUFELDApCisjICAgZGVmaW5lIHhjb25kaXRpb25fY2xlYXIoY3YpIGNvbmRfZGVzdHJveShjdikKKyMgICBkZWZpbmUgeGNvbmRpdGlvbl93YWl0KGN2LG0pIGNvbmRfd2FpdChjdixtKQorIyAgIGRlZmluZSB4Y29uZGl0aW9uX3NpZ25hbChjdikgY29uZF9zaWduYWwoY3YpCisjICAgZGVmaW5lIHhjb25kaXRpb25fYnJvYWRjYXN0KGN2KSBjb25kX2Jyb2FkY2FzdChjdikKKyMgIGVsc2UgLyogIVNWUjQgKi8KKyMgICBpZmRlZiBXSU4zMgorIyAgICBpbmNsdWRlIDxYMTEvWHdpbmRvd3MuaD4KK3R5cGVkZWYgRFdPUkQgeHRocmVhZF90OwordHlwZWRlZiBEV09SRCB4dGhyZWFkX2tleV90Oworc3RydWN0IF94dGhyZWFkX3dhaXRlciB7CisgICAgSEFORExFIHNlbTsKKyAgICBzdHJ1Y3QgX3h0aHJlYWRfd2FpdGVyICpuZXh0OworfTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDUklUSUNBTF9TRUNUSU9OIGNzOworICAgIHN0cnVjdCBfeHRocmVhZF93YWl0ZXIgKndhaXRlcnM7Cit9IHhjb25kaXRpb25fcmVjOwordHlwZWRlZiBDUklUSUNBTF9TRUNUSU9OIHhtdXRleF9yZWM7CisjICAgIGRlZmluZSB4dGhyZWFkX2luaXQoKSBfWHRocmVhZF9pbml0KCkKKyMgICAgZGVmaW5lIHh0aHJlYWRfc2VsZiBHZXRDdXJyZW50VGhyZWFkSWQKKyMgICAgZGVmaW5lIHh0aHJlYWRfZm9yayhmdW5jLGNsb3N1cmUpIHsgXAorICAgIERXT1JEIF90bXB0aWQ7IFwKKyAgICBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpZnVuYywgKExQVk9JRCljbG9zdXJlLCAwLCBcCisJCSAmX3RtcHRpZCk7IFwKK30KKyMgICAgZGVmaW5lIHh0aHJlYWRfeWllbGQoKSBTbGVlcCgwKQorIyAgICBkZWZpbmUgeHRocmVhZF9leGl0KHYpIEV4aXRUaHJlYWQoKERXT1JEKSh2KSkKKyMgICAgZGVmaW5lIHh0aHJlYWRfa2V5X2NyZWF0ZShrcCxkKSAqKGtwKSA9IFRsc0FsbG9jKCkKKyMgICAgZGVmaW5lIHh0aHJlYWRfa2V5X2RlbGV0ZShrKSBUbHNGcmVlKGspCisjICAgIGRlZmluZSB4dGhyZWFkX3NldF9zcGVjaWZpYyhrLHYpIFRsc1NldFZhbHVlKGssdikKKyMgICAgZGVmaW5lIHh0aHJlYWRfZ2V0X3NwZWNpZmljKGssdnApIFRsc0dldFZhbHVlKGspCisjICAgIGRlZmluZSB4bXV0ZXhfaW5pdChtKSBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKG0pCisjICAgIGRlZmluZSB4bXV0ZXhfY2xlYXIobSkgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKG0pCisjICAgIGRlZmluZSBfWE1VVEVYX05FU1RTCisjICAgIGRlZmluZSB4bXV0ZXhfbG9jayhtKSBFbnRlckNyaXRpY2FsU2VjdGlvbihtKQorIyAgICBkZWZpbmUgeG11dGV4X3VubG9jayhtKSBMZWF2ZUNyaXRpY2FsU2VjdGlvbihtKQorIyAgICBkZWZpbmUgeGNvbmRpdGlvbl9pbml0KGN2KSB7IFwKKyAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCYoY3YpLT5jcyk7IFwKKyAgICAoY3YpLT53YWl0ZXJzID0gTlVMTDsgXAorfQorIyAgICBkZWZpbmUgeGNvbmRpdGlvbl9jbGVhcihjdikgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCYoY3YpLT5jcykKK2V4dGVybiBzdHJ1Y3QgX3h0aHJlYWRfd2FpdGVyICpfWHRocmVhZF93YWl0ZXIoKTsKKyMgICAgZGVmaW5lIHhjb25kaXRpb25fd2FpdChjdixtKSB7IFwKKyAgICBzdHJ1Y3QgX3h0aHJlYWRfd2FpdGVyICpfdG1wdGhyID0gX1h0aHJlYWRfd2FpdGVyKCk7IFwKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmKGN2KS0+Y3MpOyBcCisgICAgX3RtcHRoci0+bmV4dCA9IChjdiktPndhaXRlcnM7IFwKKyAgICAoY3YpLT53YWl0ZXJzID0gX3RtcHRocjsgXAorICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCYoY3YpLT5jcyk7IFwKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbihtKTsgXAorICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoX3RtcHRoci0+c2VtLCBJTkZJTklURSk7IFwKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbihtKTsgXAorfQorIyAgICBkZWZpbmUgeGNvbmRpdGlvbl9zaWduYWwoY3YpIHsgXAorICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCYoY3YpLT5jcyk7IFwKKyAgICBpZiAoKGN2KS0+d2FpdGVycykgeyBcCisgICAgICAgIFJlbGVhc2VTZW1hcGhvcmUoKGN2KS0+d2FpdGVycy0+c2VtLCAxLCBOVUxMKTsgXAorCShjdiktPndhaXRlcnMgPSAoY3YpLT53YWl0ZXJzLT5uZXh0OyBcCisgICAgfSBcCisgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJihjdiktPmNzKTsgXAorfQorIyAgICBkZWZpbmUgeGNvbmRpdGlvbl9icm9hZGNhc3QoY3YpIHsgXAorICAgIHN0cnVjdCBfeHRocmVhZF93YWl0ZXIgKl90bXB0aHI7IFwKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmKGN2KS0+Y3MpOyBcCisgICAgZm9yIChfdG1wdGhyID0gKGN2KS0+d2FpdGVyczsgX3RtcHRocjsgX3RtcHRociA9IF90bXB0aHItPm5leHQpIFwKKwlSZWxlYXNlU2VtYXBob3JlKF90bXB0aHItPnNlbSwgMSwgTlVMTCk7IFwKKyAgICAoY3YpLT53YWl0ZXJzID0gTlVMTDsgXAorICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCYoY3YpLT5jcyk7IFwKK30KKyMgICBlbHNlIC8qICFXSU4zMiAqLworIyAgICBpZmRlZiBVU0VfVElTX1NVUFBPUlQKKy8qCisgKiBUSVMgc3VwcG9ydCBpcyBpbnRlbmRlZCBmb3IgdGhyZWFkIHNhZmUgbGlicmFyaWVzLgorICogVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGdlbmVyYWwgY2xpZW50IHByb2dyYW1taW5nLgorICovCisjICAgICBpbmNsdWRlIDx0aXMuaD4KK3R5cGVkZWYgcHRocmVhZF90IHh0aHJlYWRfdDsKK3R5cGVkZWYgcHRocmVhZF9rZXlfdCB4dGhyZWFkX2tleV90OwordHlwZWRlZiBwdGhyZWFkX2NvbmRfdCB4Y29uZGl0aW9uX3JlYzsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IHhtdXRleF9yZWM7CisjICAgICBkZWZpbmUgeHRocmVhZF9zZWxmIHRpc19zZWxmCisjICAgICBkZWZpbmUgeHRocmVhZF9mb3JrKGZ1bmMsY2xvc3VyZSkgeyBwdGhyZWFkX3QgX3RtcHh0aHI7IFwKKyAgICAgICAgcHRocmVhZF9jcmVhdGUoJl90bXB4dGhyLE5VTEwsZnVuYyxjbG9zdXJlKTsgfQorIyAgICAgZGVmaW5lIHh0aHJlYWRfeWllbGQoKSBwdGhyZWFkX3lpZWxkX25wKCkKKyMgICAgIGRlZmluZSB4dGhyZWFkX2V4aXQodikgcHRocmVhZF9leGl0KHYpCisjICAgICBkZWZpbmUgeHRocmVhZF9rZXlfY3JlYXRlKGtwLGQpIHRpc19rZXlfY3JlYXRlKGtwLGQpCisjICAgICBkZWZpbmUgeHRocmVhZF9rZXlfZGVsZXRlKGspIHRpc19rZXlfZGVsZXRlKGspCisjICAgICBkZWZpbmUgeHRocmVhZF9zZXRfc3BlY2lmaWMoayx2KSB0aXNfc2V0c3BlY2lmaWMoayx2KQorIyAgICAgZGVmaW5lIHh0aHJlYWRfZ2V0X3NwZWNpZmljKGssdnApICoodnApID0gdGlzX2dldHNwZWNpZmljKGspCisjICAgICBkZWZpbmUgWE1VVEVYX0lOSVRJQUxJWkVSIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIKKyMgICAgIGRlZmluZSB4bXV0ZXhfaW5pdChtKSB0aXNfbXV0ZXhfaW5pdChtKQorIyAgICAgZGVmaW5lIHhtdXRleF9jbGVhcihtKSB0aXNfbXV0ZXhfZGVzdHJveShtKQorIyAgICAgZGVmaW5lIHhtdXRleF9sb2NrKG0pIHRpc19tdXRleF9sb2NrKG0pCisjICAgICBkZWZpbmUgeG11dGV4X3VubG9jayhtKSB0aXNfbXV0ZXhfdW5sb2NrKG0pCisjICAgICBkZWZpbmUgeGNvbmRpdGlvbl9pbml0KGMpIHRpc19jb25kX2luaXQoYykKKyMgICAgIGRlZmluZSB4Y29uZGl0aW9uX2NsZWFyKGMpIHRpc19jb25kX2Rlc3Ryb3koYykKKyMgICAgIGRlZmluZSB4Y29uZGl0aW9uX3dhaXQoYyxtKSB0aXNfY29uZF93YWl0KGMsbSkKKyMgICAgIGRlZmluZSB4Y29uZGl0aW9uX3NpZ25hbChjKSB0aXNfY29uZF9zaWduYWwoYykKKyMgICAgIGRlZmluZSB4Y29uZGl0aW9uX2Jyb2FkY2FzdChjKSB0aXNfY29uZF9icm9hZGNhc3QoYykKKyMgICAgZWxzZQorIyAgICAgaWZkZWYgVVNFX05CU0RfVEhSRUFETElCCisvKgorICogTmV0QlNEIHRocmVhZGxpYiBzdXBwb3J0IGlzIGludGVuZGVkIGZvciB0aHJlYWQgc2FmZSBsaWJyYXJpZXMuCisgKiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgZ2VuZXJhbCBjbGllbnQgcHJvZ3JhbW1pbmcuCisgKi8KKyMgICAgICBpbmNsdWRlIDx0aHJlYWRsaWIuaD4KK3R5cGVkZWYgdGhyX3QgeHRocmVhZF90OwordHlwZWRlZiB0aHJlYWRfa2V5X3QgeHRocmVhZF9rZXlfdDsKK3R5cGVkZWYgY29uZF90IHhjb25kaXRpb25fcmVjOwordHlwZWRlZiBtdXRleF90IHhtdXRleF9yZWM7CisjICAgICAgZGVmaW5lIHh0aHJlYWRfc2VsZiB0aHJfc2VsZgorIyAgICAgIGRlZmluZSB4dGhyZWFkX2ZvcmsoZnVuYyxjbG9zdXJlKSB7IHRocl90IF90bXB4dGhyOyBcCisJLyogWFhYIENyZWF0ZSBpdCBkZXRhY2hlZD8gIC0tdGhvcnBlaiAqLyBcCisJdGhyX2NyZWF0ZSgmX3RtcHh0aHIsTlVMTCxmdW5jLGNsb3N1cmUpOyB9CisjICAgICAgZGVmaW5lIHh0aHJlYWRfeWllbGQoKSB0aHJfeWllbGQoKQorIyAgICAgIGRlZmluZSB4dGhyZWFkX2V4aXQodikgdGhyX2V4aXQodikKKyMgICAgICBkZWZpbmUgeHRocmVhZF9rZXlfY3JlYXRlKGtwLGQpIHRocl9rZXljcmVhdGUoa3AsZCkKKyMgICAgICBkZWZpbmUgeHRocmVhZF9rZXlfZGVsZXRlKGspIHRocl9rZXlkZWxldGUoaykKKyMgICAgICBkZWZpbmUgeHRocmVhZF9zZXRfc3BlY2lmaWMoayx2KSB0aHJfc2V0c3BlY2lmaWMoayx2KQorIyAgICAgIGRlZmluZSB4dGhyZWFkX2dldF9zcGVjaWZpYyhrLHZwKSAqKHZwKSA9IHRocl9nZXRzcGVjaWZpYyhrKQorIyAgICAgIGRlZmluZSBYTVVURVhfSU5JVElBTElaRVIgTVVURVhfSU5JVElBTElaRVIKKyMgICAgICBkZWZpbmUgeG11dGV4X2luaXQobSkgbXV0ZXhfaW5pdChtLCAwKQorIyAgICAgIGRlZmluZSB4bXV0ZXhfY2xlYXIobSkgbXV0ZXhfZGVzdHJveShtKQorIyAgICAgIGRlZmluZSB4bXV0ZXhfbG9jayhtKSBtdXRleF9sb2NrKG0pCisjICAgICAgZGVmaW5lIHhtdXRleF91bmxvY2sobSkgbXV0ZXhfdW5sb2NrKG0pCisjICAgICAgZGVmaW5lIHhjb25kaXRpb25faW5pdChjKSBjb25kX2luaXQoYywgMCwgMCkKKyMgICAgICBkZWZpbmUgeGNvbmRpdGlvbl9jbGVhcihjKSBjb25kX2Rlc3Ryb3koYykKKyMgICAgICBkZWZpbmUgeGNvbmRpdGlvbl93YWl0KGMsbSkgY29uZF93YWl0KGMsbSkKKyMgICAgICBkZWZpbmUgeGNvbmRpdGlvbl9zaWduYWwoYykgY29uZF9zaWduYWwoYykKKyMgICAgICBkZWZpbmUgeGNvbmRpdGlvbl9icm9hZGNhc3QoYykgY29uZF9icm9hZGNhc3QoYykKKyMgICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIDxwdGhyZWFkLmg+Cit0eXBlZGVmIHB0aHJlYWRfdCB4dGhyZWFkX3Q7Cit0eXBlZGVmIHB0aHJlYWRfa2V5X3QgeHRocmVhZF9rZXlfdDsKK3R5cGVkZWYgcHRocmVhZF9jb25kX3QgeGNvbmRpdGlvbl9yZWM7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCB4bXV0ZXhfcmVjOworIyAgICAgIGRlZmluZSB4dGhyZWFkX3NlbGYgcHRocmVhZF9zZWxmCisjICAgICAgZGVmaW5lIHh0aHJlYWRfeWllbGQoKSBwdGhyZWFkX3lpZWxkKCkKKyMgICAgICBkZWZpbmUgeHRocmVhZF9leGl0KHYpIHB0aHJlYWRfZXhpdCh2KQorIyAgICAgIGRlZmluZSB4dGhyZWFkX3NldF9zcGVjaWZpYyhrLHYpIHB0aHJlYWRfc2V0c3BlY2lmaWMoayx2KQorIyAgICAgIGRlZmluZSB4bXV0ZXhfY2xlYXIobSkgcHRocmVhZF9tdXRleF9kZXN0cm95KG0pCisjICAgICAgZGVmaW5lIHhtdXRleF9sb2NrKG0pIHB0aHJlYWRfbXV0ZXhfbG9jayhtKQorIyAgICAgIGRlZmluZSB4bXV0ZXhfdW5sb2NrKG0pIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG0pCisjICAgICAgaWZuZGVmIFhQUkVfU1RBTkRBUkRfQVBJCisjICAgICAgIGRlZmluZSB4dGhyZWFkX2tleV9jcmVhdGUoa3AsZCkgcHRocmVhZF9rZXlfY3JlYXRlKGtwLGQpCisjICAgICAgIGRlZmluZSB4dGhyZWFkX2tleV9kZWxldGUoaykgcHRocmVhZF9rZXlfZGVsZXRlKGspCisjICAgICAgIGRlZmluZSB4dGhyZWFkX2dldF9zcGVjaWZpYyhrLHZwKSAqKHZwKSA9IHB0aHJlYWRfZ2V0c3BlY2lmaWMoaykKKyMgICAgICAgZGVmaW5lIHh0aHJlYWRfZm9yayhmdW5jLGNsb3N1cmUpIHsgcHRocmVhZF90IF90bXB4dGhyOyBcCisJcHRocmVhZF9jcmVhdGUoJl90bXB4dGhyLE5VTEwsZnVuYyxjbG9zdXJlKTsgfQorIyAgICAgICBkZWZpbmUgWE1VVEVYX0lOSVRJQUxJWkVSIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIKKyMgICAgICAgZGVmaW5lIHhtdXRleF9pbml0KG0pIHB0aHJlYWRfbXV0ZXhfaW5pdChtLCBOVUxMKQorIyAgICAgICBkZWZpbmUgeGNvbmRpdGlvbl9pbml0KGMpIHB0aHJlYWRfY29uZF9pbml0KGMsIE5VTEwpCisjICAgICAgZWxzZSAvKiBYUFJFX1NUQU5EQVJEX0FQSSAqLworIyAgICAgICBkZWZpbmUgeHRocmVhZF9rZXlfY3JlYXRlKGtwLGQpIHB0aHJlYWRfa2V5Y3JlYXRlKGtwLGQpCisjICAgICAgIGRlZmluZSB4dGhyZWFkX2tleV9kZWxldGUoaykgMAorIyAgICAgICBkZWZpbmUgeHRocmVhZF9nZXRfc3BlY2lmaWMoayx2cCkgcHRocmVhZF9nZXRzcGVjaWZpYyhrLHZwKQorIyAgICAgICBkZWZpbmUgeHRocmVhZF9mb3JrKGZ1bmMsY2xvc3VyZSkgeyBwdGhyZWFkX3QgX3RtcHh0aHI7IFwKKwlwdGhyZWFkX2NyZWF0ZSgmX3RtcHh0aHIscHRocmVhZF9hdHRyX2RlZmF1bHQsZnVuYyxjbG9zdXJlKTsgfQorIyAgICAgICBkZWZpbmUgeG11dGV4X2luaXQobSkgcHRocmVhZF9tdXRleF9pbml0KG0sIHB0aHJlYWRfbXV0ZXhhdHRyX2RlZmF1bHQpCisjICAgICAgIGRlZmluZSB4Y29uZGl0aW9uX2luaXQoYykgcHRocmVhZF9jb25kX2luaXQoYywgcHRocmVhZF9jb25kYXR0cl9kZWZhdWx0KQorIyAgICAgIGVuZGlmIC8qIFhQUkVfU1RBTkRBUkRfQVBJICovCisjICAgICAgZGVmaW5lIHhjb25kaXRpb25fY2xlYXIoYykgcHRocmVhZF9jb25kX2Rlc3Ryb3koYykKKyMgICAgICBkZWZpbmUgeGNvbmRpdGlvbl93YWl0KGMsbSkgcHRocmVhZF9jb25kX3dhaXQoYyxtKQorIyAgICAgIGRlZmluZSB4Y29uZGl0aW9uX3NpZ25hbChjKSBwdGhyZWFkX2NvbmRfc2lnbmFsKGMpCisjICAgICAgZGVmaW5lIHhjb25kaXRpb25fYnJvYWRjYXN0KGMpIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoYykKKyMgICAgICBpZiBkZWZpbmVkKF9ERUNUSFJFQURTXykKK3N0YXRpYyB4dGhyZWFkX3QgX1hfbm9fdGhyZWFkX2lkOworIyAgICAgICBkZWZpbmUgeHRocmVhZF9oYXZlX2lkKGlkKSAhcHRocmVhZF9lcXVhbChpZCwgX1hfbm9fdGhyZWFkX2lkKQorIyAgICAgICBkZWZpbmUgeHRocmVhZF9jbGVhcl9pZChpZCkgaWQgPSBfWF9ub190aHJlYWRfaWQKKyMgICAgICAgZGVmaW5lIHh0aHJlYWRfZXF1YWwoaWQxLGlkMikgcHRocmVhZF9lcXVhbChpZDEsIGlkMikKKyMgICAgICBlbmRpZiAvKiBfREVDVEhSRUFEU18gKi8KKyMgICAgICBpZiBkZWZpbmVkKF9fbGludXhfXykKKyMgICAgICAgZGVmaW5lIHh0aHJlYWRfaGF2ZV9pZChpZCkgIXB0aHJlYWRfZXF1YWwoaWQsIDApCisjICAgICAgIGRlZmluZSB4dGhyZWFkX2NsZWFyX2lkKGlkKSBpZCA9IDAKKyMgICAgICAgZGVmaW5lIHh0aHJlYWRfZXF1YWwoaWQxLGlkMikgcHRocmVhZF9lcXVhbChpZDEsIGlkMikKKyMgICAgICBlbmRpZiAvKiBsaW51eCAqLworIyAgICAgIGlmIGRlZmluZWQoX0NNQV9WRU5ET1JfKSAmJiBkZWZpbmVkKF9DTUFfX0lCTSkgJiYgKF9DTUFfVkVORE9SXyA9PSBfQ01BX19JQk0pCisjICAgICAgIGlmZGVmIERFQlVHCQkvKiB0b28gbXVjaCBvZiBhIGhhY2sgdG8gZW5hYmxlIG5vcm1hbGx5ICovCisvKiBzZWUgYWxzbyBjbWFfX29ial9zZXRfbmFtZSgpICovCisjICAgICAgICBkZWZpbmUgeG11dGV4X3NldF9uYW1lKG0sc3RyKSAoKGNoYXIqKikobSktPmZpZWxkMSlbNV0gPSAoc3RyKQorIyAgICAgICAgZGVmaW5lIHhjb25kaXRpb25fc2V0X25hbWUoY3Ysc3RyKSAoKGNoYXIqKikoY3YpLT5maWVsZDEpWzVdID0gKHN0cikKKyMgICAgICAgZW5kaWYgLyogREVCVUcgKi8KKyMgICAgICBlbmRpZiAvKiBfQ01BX1ZFTkRPUl8gPT0gX0NNQV9fSUJNICovCisjICAgICBlbmRpZiAvKiBVU0VfTkJTRF9USFJFQURMSUIgKi8KKyMgICAgZW5kaWYgLyogVVNFX1RJU19TVVBQT1JUICovCisjICAgZW5kaWYgLyogV0lOMzIgKi8KKyMgIGVuZGlmIC8qIFNWUjQgKi8KKyMgZW5kaWYgLyogQ1RIUkVBRFMgKi8KK3R5cGVkZWYgeGNvbmRpdGlvbl9yZWMgKnhjb25kaXRpb25fdDsKK3R5cGVkZWYgeG11dGV4X3JlYyAqeG11dGV4X3Q7CisjIGlmbmRlZiB4Y29uZGl0aW9uX21hbGxvYworIyAgZGVmaW5lIHhjb25kaXRpb25fbWFsbG9jKCkgKHhjb25kaXRpb25fdCl4bWFsbG9jKHNpemVvZih4Y29uZGl0aW9uX3JlYykpCisjIGVuZGlmCisjIGlmbmRlZiB4Y29uZGl0aW9uX2ZyZWUKKyMgIGRlZmluZSB4Y29uZGl0aW9uX2ZyZWUoYykgeGZyZWUoKGNoYXIgKiljKQorIyBlbmRpZgorIyBpZm5kZWYgeG11dGV4X21hbGxvYworIyAgZGVmaW5lIHhtdXRleF9tYWxsb2MoKSAoeG11dGV4X3QpeG1hbGxvYyhzaXplb2YoeG11dGV4X3JlYykpCisjIGVuZGlmCisjIGlmbmRlZiB4bXV0ZXhfZnJlZQorIyAgZGVmaW5lIHhtdXRleF9mcmVlKG0pIHhmcmVlKChjaGFyICopbSkKKyMgZW5kaWYKKyMgaWZuZGVmIHh0aHJlYWRfaGF2ZV9pZAorIyAgZGVmaW5lIHh0aHJlYWRfaGF2ZV9pZChpZCkgaWQKKyMgZW5kaWYKKyMgaWZuZGVmIHh0aHJlYWRfY2xlYXJfaWQKKyMgIGRlZmluZSB4dGhyZWFkX2NsZWFyX2lkKGlkKSBpZCA9IDAKKyMgZW5kaWYKKyMgaWZuZGVmIHh0aHJlYWRfZXF1YWwKKyMgIGRlZmluZSB4dGhyZWFkX2VxdWFsKGlkMSxpZDIpICgoaWQxKSA9PSAoaWQyKSkKKyMgZW5kaWYKKy8qIGFpZHMgdW5kZXJzdG9vZCBieSBzb21lIGRlYnVnZ2VycyAqLworIyBpZm5kZWYgeHRocmVhZF9zZXRfbmFtZQorIyAgZGVmaW5lIHh0aHJlYWRfc2V0X25hbWUodCxzdHIpCisjIGVuZGlmCisjIGlmbmRlZiB4bXV0ZXhfc2V0X25hbWUKKyMgIGRlZmluZSB4bXV0ZXhfc2V0X25hbWUobSxzdHIpCisjIGVuZGlmCisjIGlmbmRlZiB4Y29uZGl0aW9uX3NldF9uYW1lCisjICBkZWZpbmUgeGNvbmRpdGlvbl9zZXRfbmFtZShjdixzdHIpCisjIGVuZGlmCisKKyNlbmRpZiAvKiBfWFRIUkVBRFNfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h1dGlsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYWI1MGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YdXRpbC5oCkBAIC0wLDAgKzEsODI2IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4NywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisKK0RJR0lUQUwgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCitESUdJVEFMIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAorQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfWDExX1hVVElMX0hfCisjZGVmaW5lIF9YMTFfWFVUSUxfSF8KKworLyogWW91IG11c3QgaW5jbHVkZSA8WDExL1hsaWIuaD4gYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUgKi8KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4KKworLyoKKyAqIEJpdG1hc2sgcmV0dXJuZWQgYnkgWFBhcnNlR2VvbWV0cnkoKS4gIEVhY2ggYml0IHRlbGxzIGlmIHRoZSBjb3JyZXNwb25kaW5nCisgKiB2YWx1ZSAoeCwgeSwgd2lkdGgsIGhlaWdodCkgd2FzIGZvdW5kIGluIHRoZSBwYXJzZWQgc3RyaW5nLgorICovCisjZGVmaW5lIE5vVmFsdWUJCTB4MDAwMAorI2RlZmluZSBYVmFsdWUgIAkweDAwMDEKKyNkZWZpbmUgWVZhbHVlCQkweDAwMDIKKyNkZWZpbmUgV2lkdGhWYWx1ZSAgCTB4MDAwNAorI2RlZmluZSBIZWlnaHRWYWx1ZSAgCTB4MDAwOAorI2RlZmluZSBBbGxWYWx1ZXMgCTB4MDAwRgorI2RlZmluZSBYTmVnYXRpdmUgCTB4MDAxMAorI2RlZmluZSBZTmVnYXRpdmUgCTB4MDAyMAorCisvKgorICogbmV3IHZlcnNpb24gY29udGFpbmluZyBiYXNlX3dpZHRoLCBiYXNlX2hlaWdodCwgYW5kIHdpbl9ncmF2aXR5IGZpZWxkczsKKyAqIHVzZWQgd2l0aCBXTV9OT1JNQUxfSElOVFMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAJbG9uZyBmbGFnczsJLyogbWFya3Mgd2hpY2ggZmllbGRzIGluIHRoaXMgc3RydWN0dXJlIGFyZSBkZWZpbmVkICovCisJaW50IHgsIHk7CQkvKiBvYnNvbGV0ZSBmb3IgbmV3IHdpbmRvdyBtZ3JzLCBidXQgY2xpZW50cyAqLworCWludCB3aWR0aCwgaGVpZ2h0OwkvKiBzaG91bGQgc2V0IHNvIG9sZCB3bSdzIGRvbid0IG1lc3MgdXAgKi8KKwlpbnQgbWluX3dpZHRoLCBtaW5faGVpZ2h0OworCWludCBtYXhfd2lkdGgsIG1heF9oZWlnaHQ7CisgICAgCWludCB3aWR0aF9pbmMsIGhlaWdodF9pbmM7CisJc3RydWN0IHsKKwkJaW50IHg7CS8qIG51bWVyYXRvciAqLworCQlpbnQgeTsJLyogZGVub21pbmF0b3IgKi8KKwl9IG1pbl9hc3BlY3QsIG1heF9hc3BlY3Q7CisJaW50IGJhc2Vfd2lkdGgsIGJhc2VfaGVpZ2h0OwkJLyogYWRkZWQgYnkgSUNDQ00gdmVyc2lvbiAxICovCisJaW50IHdpbl9ncmF2aXR5OwkJCS8qIGFkZGVkIGJ5IElDQ0NNIHZlcnNpb24gMSAqLworfSBYU2l6ZUhpbnRzOworCisvKgorICogVGhlIG5leHQgYmxvY2sgb2YgZGVmaW5pdGlvbnMgYXJlIGZvciB3aW5kb3cgbWFuYWdlciBwcm9wZXJ0aWVzIHRoYXQKKyAqIGNsaWVudHMgYW5kIGFwcGxpY2F0aW9ucyB1c2UgZm9yIGNvbW11bmljYXRpb24uCisgKi8KKworLyogZmxhZ3MgYXJndW1lbnQgaW4gc2l6ZSBoaW50cyAqLworI2RlZmluZSBVU1Bvc2l0aW9uCSgxTCA8PCAwKSAvKiB1c2VyIHNwZWNpZmllZCB4LCB5ICovCisjZGVmaW5lIFVTU2l6ZQkJKDFMIDw8IDEpIC8qIHVzZXIgc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQgKi8KKworI2RlZmluZSBQUG9zaXRpb24JKDFMIDw8IDIpIC8qIHByb2dyYW0gc3BlY2lmaWVkIHBvc2l0aW9uICovCisjZGVmaW5lIFBTaXplCQkoMUwgPDwgMykgLyogcHJvZ3JhbSBzcGVjaWZpZWQgc2l6ZSAqLworI2RlZmluZSBQTWluU2l6ZQkoMUwgPDwgNCkgLyogcHJvZ3JhbSBzcGVjaWZpZWQgbWluaW11bSBzaXplICovCisjZGVmaW5lIFBNYXhTaXplCSgxTCA8PCA1KSAvKiBwcm9ncmFtIHNwZWNpZmllZCBtYXhpbXVtIHNpemUgKi8KKyNkZWZpbmUgUFJlc2l6ZUluYwkoMUwgPDwgNikgLyogcHJvZ3JhbSBzcGVjaWZpZWQgcmVzaXplIGluY3JlbWVudHMgKi8KKyNkZWZpbmUgUEFzcGVjdAkJKDFMIDw8IDcpIC8qIHByb2dyYW0gc3BlY2lmaWVkIG1pbiBhbmQgbWF4IGFzcGVjdCByYXRpb3MgKi8KKyNkZWZpbmUgUEJhc2VTaXplCSgxTCA8PCA4KSAvKiBwcm9ncmFtIHNwZWNpZmllZCBiYXNlIGZvciBpbmNyZW1lbnRpbmcgKi8KKyNkZWZpbmUgUFdpbkdyYXZpdHkJKDFMIDw8IDkpIC8qIHByb2dyYW0gc3BlY2lmaWVkIHdpbmRvdyBncmF2aXR5ICovCisKKy8qIG9ic29sZXRlICovCisjZGVmaW5lIFBBbGxIaW50cyAoUFBvc2l0aW9ufFBTaXplfFBNaW5TaXplfFBNYXhTaXplfFBSZXNpemVJbmN8UEFzcGVjdCkKKworCisKK3R5cGVkZWYgc3RydWN0IHsKKwlsb25nIGZsYWdzOwkvKiBtYXJrcyB3aGljaCBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3R1cmUgYXJlIGRlZmluZWQgKi8KKwlCb29sIGlucHV0OwkvKiBkb2VzIHRoaXMgYXBwbGljYXRpb24gcmVseSBvbiB0aGUgd2luZG93IG1hbmFnZXIgdG8KKwkJCWdldCBrZXlib2FyZCBpbnB1dD8gKi8KKwlpbnQgaW5pdGlhbF9zdGF0ZTsJLyogc2VlIGJlbG93ICovCisJUGl4bWFwIGljb25fcGl4bWFwOwkvKiBwaXhtYXAgdG8gYmUgdXNlZCBhcyBpY29uICovCisJV2luZG93IGljb25fd2luZG93OyAJLyogd2luZG93IHRvIGJlIHVzZWQgYXMgaWNvbiAqLworCWludCBpY29uX3gsIGljb25feTsgCS8qIGluaXRpYWwgcG9zaXRpb24gb2YgaWNvbiAqLworCVBpeG1hcCBpY29uX21hc2s7CS8qIGljb24gbWFzayBiaXRtYXAgKi8KKwlYSUQgd2luZG93X2dyb3VwOwkvKiBpZCBvZiByZWxhdGVkIHdpbmRvdyBncm91cCAqLworCS8qIHRoaXMgc3RydWN0dXJlIG1heSBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlICovCit9IFhXTUhpbnRzOworCisvKiBkZWZpbml0aW9uIGZvciBmbGFncyBvZiBYV01IaW50cyAqLworCisjZGVmaW5lIElucHV0SGludCAJCSgxTCA8PCAwKQorI2RlZmluZSBTdGF0ZUhpbnQgCQkoMUwgPDwgMSkKKyNkZWZpbmUgSWNvblBpeG1hcEhpbnQJCSgxTCA8PCAyKQorI2RlZmluZSBJY29uV2luZG93SGludAkJKDFMIDw8IDMpCisjZGVmaW5lIEljb25Qb3NpdGlvbkhpbnQgCSgxTCA8PCA0KQorI2RlZmluZSBJY29uTWFza0hpbnQJCSgxTCA8PCA1KQorI2RlZmluZSBXaW5kb3dHcm91cEhpbnQJCSgxTCA8PCA2KQorI2RlZmluZSBBbGxIaW50cyAoSW5wdXRIaW50fFN0YXRlSGludHxJY29uUGl4bWFwSGludHxJY29uV2luZG93SGludHwgXAorSWNvblBvc2l0aW9uSGludHxJY29uTWFza0hpbnR8V2luZG93R3JvdXBIaW50KQorI2RlZmluZSBYVXJnZW5jeUhpbnQJCSgxTCA8PCA4KQorCisvKiBkZWZpbml0aW9ucyBmb3IgaW5pdGlhbCB3aW5kb3cgc3RhdGUgKi8KKyNkZWZpbmUgV2l0aGRyYXduU3RhdGUgMAkvKiBmb3Igd2luZG93cyB0aGF0IGFyZSBub3QgbWFwcGVkICovCisjZGVmaW5lIE5vcm1hbFN0YXRlIDEJLyogbW9zdCBhcHBsaWNhdGlvbnMgd2FudCB0byBzdGFydCB0aGlzIHdheSAqLworI2RlZmluZSBJY29uaWNTdGF0ZSAzCS8qIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHN0YXJ0IGFzIGFuIGljb24gKi8KKworLyoKKyAqIE9ic29sZXRlIHN0YXRlcyBubyBsb25nZXIgZGVmaW5lZCBieSBJQ0NDTQorICovCisjZGVmaW5lIERvbnRDYXJlU3RhdGUgMAkvKiBkb24ndCBrbm93IG9yIGNhcmUgKi8KKyNkZWZpbmUgWm9vbVN0YXRlIDIJLyogYXBwbGljYXRpb24gd2FudHMgdG8gc3RhcnQgem9vbWVkICovCisjZGVmaW5lIEluYWN0aXZlU3RhdGUgNAkvKiBhcHBsaWNhdGlvbiBiZWxpZXZlcyBpdCBpcyBzZWxkb20gdXNlZDsgKi8KKwkJCS8qIHNvbWUgd20ncyBtYXkgcHV0IGl0IG9uIGluYWN0aXZlIG1lbnUgKi8KKworCisvKgorICogbmV3IHN0cnVjdHVyZSBmb3IgbWFuaXB1bGF0aW5nIFRFWFQgcHJvcGVydGllczsgdXNlZCB3aXRoIFdNX05BTUUsCisgKiBXTV9JQ09OX05BTUUsIFdNX0NMSUVOVF9NQUNISU5FLCBhbmQgV01fQ09NTUFORC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgKnZhbHVlOwkJLyogc2FtZSBhcyBQcm9wZXJ0eSByb3V0aW5lcyAqLworICAgIEF0b20gZW5jb2Rpbmc7CQkJLyogcHJvcCB0eXBlICovCisgICAgaW50IGZvcm1hdDsJCQkJLyogcHJvcCBkYXRhIGZvcm1hdDogOCwgMTYsIG9yIDMyICovCisgICAgdW5zaWduZWQgbG9uZyBuaXRlbXM7CQkvKiBudW1iZXIgb2YgZGF0YSBpdGVtcyBpbiB2YWx1ZSAqLworfSBYVGV4dFByb3BlcnR5OworCisjZGVmaW5lIFhOb01lbW9yeSAtMQorI2RlZmluZSBYTG9jYWxlTm90U3VwcG9ydGVkIC0yCisjZGVmaW5lIFhDb252ZXJ0ZXJOb3RGb3VuZCAtMworCit0eXBlZGVmIGVudW0geworICAgIFhTdHJpbmdTdHlsZSwJCS8qIFNUUklORyAqLworICAgIFhDb21wb3VuZFRleHRTdHlsZSwJCS8qIENPTVBPVU5EX1RFWFQgKi8KKyAgICBYVGV4dFN0eWxlLAkJCS8qIHRleHQgaW4gb3duZXIncyBlbmNvZGluZyAoY3VycmVudCBsb2NhbGUpKi8KKyAgICBYU3RkSUNDVGV4dFN0eWxlLAkJLyogU1RSSU5HLCBlbHNlIENPTVBPVU5EX1RFWFQgKi8KKyAgICAvKiBUaGUgZm9sbG93aW5nIGlzIGFuIFhGcmVlODYgZXh0ZW5zaW9uLCBpbnRyb2R1Y2VkIGluIE5vdmVtYmVyIDIwMDAgKi8KKyAgICBYVVRGOFN0cmluZ1N0eWxlCQkvKiBVVEY4X1NUUklORyAqLworfSBYSUNDRW5jb2RpbmdTdHlsZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBtaW5fd2lkdGgsIG1pbl9oZWlnaHQ7CisJaW50IG1heF93aWR0aCwgbWF4X2hlaWdodDsKKwlpbnQgd2lkdGhfaW5jLCBoZWlnaHRfaW5jOworfSBYSWNvblNpemU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyICpyZXNfbmFtZTsKKwljaGFyICpyZXNfY2xhc3M7Cit9IFhDbGFzc0hpbnQ7CisKKyNpZmRlZiBYVVRJTF9ERUZJTkVfRlVOQ1RJT05TCitleHRlcm4gaW50IFhEZXN0cm95SW1hZ2UoCisgICAgICAgIFhJbWFnZSAqeGltYWdlKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIFhHZXRQaXhlbCgKKyAgICAgICAgWEltYWdlICp4aW1hZ2UsCisgICAgICAgIGludCB4LCBpbnQgeSk7CitleHRlcm4gaW50IFhQdXRQaXhlbCgKKyAgICAgICAgWEltYWdlICp4aW1hZ2UsCisgICAgICAgIGludCB4LCBpbnQgeSwKKyAgICAgICAgdW5zaWduZWQgbG9uZyBwaXhlbCk7CitleHRlcm4gWEltYWdlICpYU3ViSW1hZ2UoCisgICAgICAgIFhJbWFnZSAqeGltYWdlLAorICAgICAgICBpbnQgeCwgaW50IHksCisgICAgICAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCk7CitleHRlcm4gaW50IFhBZGRQaXhlbCgKKyAgICAgICAgWEltYWdlICp4aW1hZ2UsCisgICAgICAgIGxvbmcgdmFsdWUpOworI2Vsc2UKKy8qCisgKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgdG8gZ2l2ZSBzb21lIHN1Z2FyIHRvIHRoZSBpbWFnZSByb3V0aW5lcyBzbyB0aGF0CisgKiBuYWl2ZSBwZW9wbGUgYXJlIG1vcmUgY29tZm9ydGFibGUgd2l0aCB0aGVtLgorICovCisjZGVmaW5lIFhEZXN0cm95SW1hZ2UoeGltYWdlKSBcCisJKCgqKCh4aW1hZ2UpLT5mLmRlc3Ryb3lfaW1hZ2UpKSgoeGltYWdlKSkpCisjZGVmaW5lIFhHZXRQaXhlbCh4aW1hZ2UsIHgsIHkpIFwKKwkoKCooKHhpbWFnZSktPmYuZ2V0X3BpeGVsKSkoKHhpbWFnZSksICh4KSwgKHkpKSkKKyNkZWZpbmUgWFB1dFBpeGVsKHhpbWFnZSwgeCwgeSwgcGl4ZWwpIFwKKwkoKCooKHhpbWFnZSktPmYucHV0X3BpeGVsKSkoKHhpbWFnZSksICh4KSwgKHkpLCAocGl4ZWwpKSkKKyNkZWZpbmUgWFN1YkltYWdlKHhpbWFnZSwgeCwgeSwgd2lkdGgsIGhlaWdodCkgIFwKKwkoKCooKHhpbWFnZSktPmYuc3ViX2ltYWdlKSkoKHhpbWFnZSksICh4KSwgKHkpLCAod2lkdGgpLCAoaGVpZ2h0KSkpCisjZGVmaW5lIFhBZGRQaXhlbCh4aW1hZ2UsIHZhbHVlKSBcCisJKCgqKCh4aW1hZ2UpLT5mLmFkZF9waXhlbCkpKCh4aW1hZ2UpLCAodmFsdWUpKSkKKyNlbmRpZgorCisvKgorICogQ29tcG9zZSBzZXF1ZW5jZSBzdGF0dXMgc3RydWN0dXJlLCB1c2VkIGluIGNhbGxpbmcgWExvb2t1cFN0cmluZy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1hDb21wb3NlU3RhdHVzIHsKKyAgICBYUG9pbnRlciBjb21wb3NlX3B0cjsJLyogc3RhdGUgdGFibGUgcG9pbnRlciAqLworICAgIGludCBjaGFyc19tYXRjaGVkOwkJLyogbWF0Y2ggc3RhdGUgKi8KK30gWENvbXBvc2VTdGF0dXM7CisKKy8qCisgKiBLZXlzeW0gbWFjcm9zLCB1c2VkIG9uIEtleXN5bXMgdG8gdGVzdCBmb3IgY2xhc3NlcyBvZiBzeW1ib2xzCisgKi8KKyNkZWZpbmUgSXNLZXlwYWRLZXkoa2V5c3ltKSBcCisgICgoKEtleVN5bSkoa2V5c3ltKSA+PSBYS19LUF9TcGFjZSkgJiYgKChLZXlTeW0pKGtleXN5bSkgPD0gWEtfS1BfRXF1YWwpKQorCisjZGVmaW5lIElzUHJpdmF0ZUtleXBhZEtleShrZXlzeW0pIFwKKyAgKCgoS2V5U3ltKShrZXlzeW0pID49IDB4MTEwMDAwMDApICYmICgoS2V5U3ltKShrZXlzeW0pIDw9IDB4MTEwMEZGRkYpKQorCisjZGVmaW5lIElzQ3Vyc29yS2V5KGtleXN5bSkgXAorICAoKChLZXlTeW0pKGtleXN5bSkgPj0gWEtfSG9tZSkgICAgICYmICgoS2V5U3ltKShrZXlzeW0pIDwgIFhLX1NlbGVjdCkpCisKKyNkZWZpbmUgSXNQRktleShrZXlzeW0pIFwKKyAgKCgoS2V5U3ltKShrZXlzeW0pID49IFhLX0tQX0YxKSAgICAgJiYgKChLZXlTeW0pKGtleXN5bSkgPD0gWEtfS1BfRjQpKQorCisjZGVmaW5lIElzRnVuY3Rpb25LZXkoa2V5c3ltKSBcCisgICgoKEtleVN5bSkoa2V5c3ltKSA+PSBYS19GMSkgICAgICAgJiYgKChLZXlTeW0pKGtleXN5bSkgPD0gWEtfRjM1KSkKKworI2RlZmluZSBJc01pc2NGdW5jdGlvbktleShrZXlzeW0pIFwKKyAgKCgoS2V5U3ltKShrZXlzeW0pID49IFhLX1NlbGVjdCkgICAmJiAoKEtleVN5bSkoa2V5c3ltKSA8PSBYS19CcmVhaykpCisKKyNpZmRlZiBYS19YS0JfS0VZUworI2RlZmluZSBJc01vZGlmaWVyS2V5KGtleXN5bSkgXAorICAoKCgoS2V5U3ltKShrZXlzeW0pID49IFhLX1NoaWZ0X0wpICYmICgoS2V5U3ltKShrZXlzeW0pIDw9IFhLX0h5cGVyX1IpKSBcCisgICB8fCAoKChLZXlTeW0pKGtleXN5bSkgPj0gWEtfSVNPX0xvY2spICYmIFwKKyAgICAgICAoKEtleVN5bSkoa2V5c3ltKSA8PSBYS19JU09fTGV2ZWw1X0xvY2spKSBcCisgICB8fCAoKEtleVN5bSkoa2V5c3ltKSA9PSBYS19Nb2RlX3N3aXRjaCkgXAorICAgfHwgKChLZXlTeW0pKGtleXN5bSkgPT0gWEtfTnVtX0xvY2spKQorI2Vsc2UKKyNkZWZpbmUgSXNNb2RpZmllcktleShrZXlzeW0pIFwKKyAgKCgoKEtleVN5bSkoa2V5c3ltKSA+PSBYS19TaGlmdF9MKSAmJiAoKEtleVN5bSkoa2V5c3ltKSA8PSBYS19IeXBlcl9SKSkgXAorICAgfHwgKChLZXlTeW0pKGtleXN5bSkgPT0gWEtfTW9kZV9zd2l0Y2gpIFwKKyAgIHx8ICgoS2V5U3ltKShrZXlzeW0pID09IFhLX051bV9Mb2NrKSkKKyNlbmRpZgorLyoKKyAqIG9wYXF1ZSByZWZlcmVuY2UgdG8gUmVnaW9uIGRhdGEgdHlwZQorICovCit0eXBlZGVmIHN0cnVjdCBfWFJlZ2lvbiAqUmVnaW9uOworCisvKiBSZXR1cm4gdmFsdWVzIGZyb20gWFJlY3RJblJlZ2lvbigpICovCisKKyNkZWZpbmUgUmVjdGFuZ2xlT3V0IDAKKyNkZWZpbmUgUmVjdGFuZ2xlSW4gIDEKKyNkZWZpbmUgUmVjdGFuZ2xlUGFydCAyCisKKworLyoKKyAqIEluZm9ybWF0aW9uIHVzZWQgYnkgdGhlIHZpc3VhbCB1dGlsaXR5IHJvdXRpbmVzIHRvIGZpbmQgZGVzaXJlZCB2aXN1YWwKKyAqIHR5cGUgZnJvbSB0aGUgbWFueSB2aXN1YWxzIGEgZGlzcGxheSBtYXkgc3VwcG9ydC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIFZpc3VhbCAqdmlzdWFsOworICBWaXN1YWxJRCB2aXN1YWxpZDsKKyAgaW50IHNjcmVlbjsKKyAgaW50IGRlcHRoOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgaW50IGNfY2xhc3M7CQkJCQkvKiBDKysgKi8KKyNlbHNlCisgIGludCBjbGFzczsKKyNlbmRpZgorICB1bnNpZ25lZCBsb25nIHJlZF9tYXNrOworICB1bnNpZ25lZCBsb25nIGdyZWVuX21hc2s7CisgIHVuc2lnbmVkIGxvbmcgYmx1ZV9tYXNrOworICBpbnQgY29sb3JtYXBfc2l6ZTsKKyAgaW50IGJpdHNfcGVyX3JnYjsKK30gWFZpc3VhbEluZm87CisKKyNkZWZpbmUgVmlzdWFsTm9NYXNrCQkweDAKKyNkZWZpbmUgVmlzdWFsSURNYXNrIAkJMHgxCisjZGVmaW5lIFZpc3VhbFNjcmVlbk1hc2sJMHgyCisjZGVmaW5lIFZpc3VhbERlcHRoTWFzawkJMHg0CisjZGVmaW5lIFZpc3VhbENsYXNzTWFzawkJMHg4CisjZGVmaW5lIFZpc3VhbFJlZE1hc2tNYXNrCTB4MTAKKyNkZWZpbmUgVmlzdWFsR3JlZW5NYXNrTWFzawkweDIwCisjZGVmaW5lIFZpc3VhbEJsdWVNYXNrTWFzawkweDQwCisjZGVmaW5lIFZpc3VhbENvbG9ybWFwU2l6ZU1hc2sJMHg4MAorI2RlZmluZSBWaXN1YWxCaXRzUGVyUkdCTWFzawkweDEwMAorI2RlZmluZSBWaXN1YWxBbGxNYXNrCQkweDFGRgorCisvKgorICogVGhpcyBkZWZpbmVzIGEgd2luZG93IG1hbmFnZXIgcHJvcGVydHkgdGhhdCBjbGllbnRzIG1heSB1c2UgdG8KKyAqIHNoYXJlIHN0YW5kYXJkIGNvbG9yIG1hcHMgb2YgdHlwZSBSR0JfQ09MT1JfTUFQOgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQ29sb3JtYXAgY29sb3JtYXA7CisJdW5zaWduZWQgbG9uZyByZWRfbWF4OworCXVuc2lnbmVkIGxvbmcgcmVkX211bHQ7CisJdW5zaWduZWQgbG9uZyBncmVlbl9tYXg7CisJdW5zaWduZWQgbG9uZyBncmVlbl9tdWx0OworCXVuc2lnbmVkIGxvbmcgYmx1ZV9tYXg7CisJdW5zaWduZWQgbG9uZyBibHVlX211bHQ7CisJdW5zaWduZWQgbG9uZyBiYXNlX3BpeGVsOworCVZpc3VhbElEIHZpc3VhbGlkOwkJLyogYWRkZWQgYnkgSUNDQ00gdmVyc2lvbiAxICovCisJWElEIGtpbGxpZDsJCQkvKiBhZGRlZCBieSBJQ0NDTSB2ZXJzaW9uIDEgKi8KK30gWFN0YW5kYXJkQ29sb3JtYXA7CisKKyNkZWZpbmUgUmVsZWFzZUJ5RnJlZWluZ0NvbG9ybWFwICgoWElEKSAxTCkgIC8qIGZvciBraWxsaWQgZmllbGQgYWJvdmUgKi8KKworCisvKgorICogcmV0dXJuIGNvZGVzIGZvciBYUmVhZEJpdG1hcEZpbGUgYW5kIFhXcml0ZUJpdG1hcEZpbGUKKyAqLworI2RlZmluZSBCaXRtYXBTdWNjZXNzCQkwCisjZGVmaW5lIEJpdG1hcE9wZW5GYWlsZWQgCTEKKyNkZWZpbmUgQml0bWFwRmlsZUludmFsaWQgCTIKKyNkZWZpbmUgQml0bWFwTm9NZW1vcnkJCTMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb250ZXh0IE1hbmFnZW1lbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBBc3NvY2lhdGl2ZSBsb29rdXAgdGFibGUgcmV0dXJuIGNvZGVzICovCisKKyNkZWZpbmUgWENTVUNDRVNTIDAJLyogTm8gZXJyb3IuICovCisjZGVmaW5lIFhDTk9NRU0gICAxICAgIC8qIE91dCBvZiBtZW1vcnkgKi8KKyNkZWZpbmUgWENOT0VOVCAgIDIgICAgLyogTm8gZW50cnkgaW4gdGFibGUgKi8KKwordHlwZWRlZiBpbnQgWENvbnRleHQ7CisKKyNkZWZpbmUgWFVuaXF1ZUNvbnRleHQoKSAgICAgICAoKFhDb250ZXh0KSBYcm1VbmlxdWVRdWFyaygpKQorI2RlZmluZSBYU3RyaW5nVG9Db250ZXh0KHN0cmluZykgICAoKFhDb250ZXh0KSBYcm1TdHJpbmdUb1F1YXJrKHN0cmluZykpCisKK19YRlVOQ1BST1RPQkVHSU4KKworLyogVGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnMgYXJlIGFscGhhYmV0aXplZC4gKi8KKworZXh0ZXJuIFhDbGFzc0hpbnQgKlhBbGxvY0NsYXNzSGludCAoCisgICAgdm9pZAorKTsKKworZXh0ZXJuIFhJY29uU2l6ZSAqWEFsbG9jSWNvblNpemUgKAorICAgIHZvaWQKKyk7CisKK2V4dGVybiBYU2l6ZUhpbnRzICpYQWxsb2NTaXplSGludHMgKAorICAgIHZvaWQKKyk7CisKK2V4dGVybiBYU3RhbmRhcmRDb2xvcm1hcCAqWEFsbG9jU3RhbmRhcmRDb2xvcm1hcCAoCisgICAgdm9pZAorKTsKKworZXh0ZXJuIFhXTUhpbnRzICpYQWxsb2NXTUhpbnRzICgKKyAgICB2b2lkCispOworCitleHRlcm4gaW50IFhDbGlwQm94KAorICAgIFJlZ2lvbgkJLyogciAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogcmVjdF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBSZWdpb24gWENyZWF0ZVJlZ2lvbigKKyAgICB2b2lkCispOworCitleHRlcm4gY29uc3QgY2hhciAqWERlZmF1bHRTdHJpbmcgKHZvaWQpOworCitleHRlcm4gaW50IFhEZWxldGVDb250ZXh0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhJRAkJCS8qIHJpZCAqLywKKyAgICBYQ29udGV4dAkJLyogY29udGV4dCAqLworKTsKKworZXh0ZXJuIGludCBYRGVzdHJveVJlZ2lvbigKKyAgICBSZWdpb24JCS8qIHIgKi8KKyk7CisKK2V4dGVybiBpbnQgWEVtcHR5UmVnaW9uKAorICAgIFJlZ2lvbgkJLyogciAqLworKTsKKworZXh0ZXJuIGludCBYRXF1YWxSZWdpb24oCisgICAgUmVnaW9uCQkvKiByMSAqLywKKyAgICBSZWdpb24JCS8qIHIyICovCispOworCitleHRlcm4gaW50IFhGaW5kQ29udGV4dCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYSUQJCQkvKiByaWQgKi8sCisgICAgWENvbnRleHQJCS8qIGNvbnRleHQgKi8sCisgICAgWFBvaW50ZXIqCQkvKiBkYXRhX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0Q2xhc3NIaW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYQ2xhc3NIaW50KgkJLyogY2xhc3NfaGludHNfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRJY29uU2l6ZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhJY29uU2l6ZSoqCQkvKiBzaXplX2xpc3RfcmV0dXJuICovLAorICAgIGludCoJCS8qIGNvdW50X3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0Tm9ybWFsSGludHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTaXplSGludHMqCQkvKiBoaW50c19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFJHQkNvbG9ybWFwcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFN0YW5kYXJkQ29sb3JtYXAqKiAvKiBzdGRjbWFwX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBjb3VudF9yZXR1cm4gKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFNpemVIaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIGhpbnRzX3JldHVybiAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0U3RhbmRhcmRDb2xvcm1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFN0YW5kYXJkQ29sb3JtYXAqCS8qIGNvbG9ybWFwX3JldHVybiAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0VGV4dFByb3BlcnR5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogd2luZG93ICovLAorICAgIFhUZXh0UHJvcGVydHkqCS8qIHRleHRfcHJvcF9yZXR1cm4gKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8KKyk7CisKK2V4dGVybiBYVmlzdWFsSW5mbyAqWEdldFZpc3VhbEluZm8oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgbG9uZwkJLyogdmluZm9fbWFzayAqLywKKyAgICBYVmlzdWFsSW5mbyoJLyogdmluZm9fdGVtcGxhdGUgKi8sCisgICAgaW50KgkJLyogbml0ZW1zX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0V01DbGllbnRNYWNoaW5lKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYVGV4dFByb3BlcnR5KgkvKiB0ZXh0X3Byb3BfcmV0dXJuICovCispOworCitleHRlcm4gWFdNSGludHMgKlhHZXRXTUhpbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0V01JY29uTmFtZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0V01OYW1lKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYVGV4dFByb3BlcnR5KgkvKiB0ZXh0X3Byb3BfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRXTU5vcm1hbEhpbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogaGludHNfcmV0dXJuICovLAorICAgIGxvbmcqCQkvKiBzdXBwbGllZF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFdNU2l6ZUhpbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogaGludHNfcmV0dXJuICovLAorICAgIGxvbmcqCQkvKiBzdXBwbGllZF9yZXR1cm4gKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFpvb21IaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIHpoaW50c19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEludGVyc2VjdFJlZ2lvbigKKyAgICBSZWdpb24JCS8qIHNyYSAqLywKKyAgICBSZWdpb24JCS8qIHNyYiAqLywKKyAgICBSZWdpb24JCS8qIGRyX3JldHVybiAqLworKTsKKworZXh0ZXJuIHZvaWQgWENvbnZlcnRDYXNlKAorICAgIEtleVN5bQkJLyogc3ltICovLAorICAgIEtleVN5bSoJCS8qIGxvd2VyICovLAorICAgIEtleVN5bSoJCS8qIHVwcGVyICovCispOworCitleHRlcm4gaW50IFhMb29rdXBTdHJpbmcoCisgICAgWEtleUV2ZW50KgkJLyogZXZlbnRfc3RydWN0ICovLAorICAgIGNoYXIqCQkvKiBidWZmZXJfcmV0dXJuICovLAorICAgIGludAkJCS8qIGJ5dGVzX2J1ZmZlciAqLywKKyAgICBLZXlTeW0qCQkvKiBrZXlzeW1fcmV0dXJuICovLAorICAgIFhDb21wb3NlU3RhdHVzKgkvKiBzdGF0dXNfaW5fb3V0ICovCispOworCitleHRlcm4gU3RhdHVzIFhNYXRjaFZpc3VhbEluZm8oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuICovLAorICAgIGludAkJCS8qIGRlcHRoICovLAorICAgIGludAkJCS8qIGNsYXNzICovLAorICAgIFhWaXN1YWxJbmZvKgkvKiB2aW5mb19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWE9mZnNldFJlZ2lvbigKKyAgICBSZWdpb24JCS8qIHIgKi8sCisgICAgaW50CQkJLyogZHggKi8sCisgICAgaW50CQkJLyogZHkgKi8KKyk7CisKK2V4dGVybiBCb29sIFhQb2ludEluUmVnaW9uKAorICAgIFJlZ2lvbgkJLyogciAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8KKyk7CisKK2V4dGVybiBSZWdpb24gWFBvbHlnb25SZWdpb24oCisgICAgWFBvaW50KgkJLyogcG9pbnRzICovLAorICAgIGludAkJCS8qIG4gKi8sCisgICAgaW50CQkJLyogZmlsbF9ydWxlICovCispOworCitleHRlcm4gaW50IFhSZWN0SW5SZWdpb24oCisgICAgUmVnaW9uCQkvKiByICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLworKTsKKworZXh0ZXJuIGludCBYU2F2ZUNvbnRleHQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWElECQkJLyogcmlkICovLAorICAgIFhDb250ZXh0CQkvKiBjb250ZXh0ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogZGF0YSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0Q2xhc3NIaW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYQ2xhc3NIaW50KgkJLyogY2xhc3NfaGludHMgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldEljb25TaXplcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWEljb25TaXplKgkJLyogc2l6ZV9saXN0ICovLAorICAgIGludAkJCS8qIGNvdW50ICovCispOworCitleHRlcm4gaW50IFhTZXROb3JtYWxIaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIGhpbnRzICovCispOworCitleHRlcm4gdm9pZCBYU2V0UkdCQ29sb3JtYXBzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYU3RhbmRhcmRDb2xvcm1hcCoJLyogc3RkY21hcHMgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFNpemVIaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIGhpbnRzICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovCispOworCitleHRlcm4gaW50IFhTZXRTdGFuZGFyZFByb3BlcnRpZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogd2luZG93X25hbWUgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBpY29uX25hbWUgKi8sCisgICAgUGl4bWFwCQkvKiBpY29uX3BpeG1hcCAqLywKKyAgICBjaGFyKioJCS8qIGFyZ3YgKi8sCisgICAgaW50CQkJLyogYXJnYyAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogaGludHMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTZXRUZXh0UHJvcGVydHkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhUZXh0UHJvcGVydHkqCS8qIHRleHRfcHJvcCAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNldFdNQ2xpZW50TWFjaGluZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wICovCispOworCitleHRlcm4gaW50IFhTZXRXTUhpbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYV01IaW50cyoJCS8qIHdtX2hpbnRzICovCispOworCitleHRlcm4gdm9pZCBYU2V0V01JY29uTmFtZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wICovCispOworCitleHRlcm4gdm9pZCBYU2V0V01OYW1lKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYVGV4dFByb3BlcnR5KgkvKiB0ZXh0X3Byb3AgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTZXRXTU5vcm1hbEhpbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogaGludHMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTZXRXTVByb3BlcnRpZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhUZXh0UHJvcGVydHkqCS8qIHdpbmRvd19uYW1lICovLAorICAgIFhUZXh0UHJvcGVydHkqCS8qIGljb25fbmFtZSAqLywKKyAgICBjaGFyKioJCS8qIGFyZ3YgKi8sCisgICAgaW50CQkJLyogYXJnYyAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogbm9ybWFsX2hpbnRzICovLAorICAgIFhXTUhpbnRzKgkJLyogd21faGludHMgKi8sCisgICAgWENsYXNzSGludCoJCS8qIGNsYXNzX2hpbnRzICovCispOworCitleHRlcm4gdm9pZCBYbWJTZXRXTVByb3BlcnRpZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogd2luZG93X25hbWUgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBpY29uX25hbWUgKi8sCisgICAgY2hhcioqCQkvKiBhcmd2ICovLAorICAgIGludAkJCS8qIGFyZ2MgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIG5vcm1hbF9oaW50cyAqLywKKyAgICBYV01IaW50cyoJCS8qIHdtX2hpbnRzICovLAorICAgIFhDbGFzc0hpbnQqCQkvKiBjbGFzc19oaW50cyAqLworKTsKKworZXh0ZXJuIHZvaWQgWHV0ZjhTZXRXTVByb3BlcnRpZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogd2luZG93X25hbWUgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBpY29uX25hbWUgKi8sCisgICAgY2hhcioqCQkvKiBhcmd2ICovLAorICAgIGludAkJCS8qIGFyZ2MgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIG5vcm1hbF9oaW50cyAqLywKKyAgICBYV01IaW50cyoJCS8qIHdtX2hpbnRzICovLAorICAgIFhDbGFzc0hpbnQqCQkvKiBjbGFzc19oaW50cyAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNldFdNU2l6ZUhpbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogaGludHMgKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFJlZ2lvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFJlZ2lvbgkJLyogciAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNldFN0YW5kYXJkQ29sb3JtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTdGFuZGFyZENvbG9ybWFwKgkvKiBjb2xvcm1hcCAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0Wm9vbUhpbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogemhpbnRzICovCispOworCitleHRlcm4gaW50IFhTaHJpbmtSZWdpb24oCisgICAgUmVnaW9uCQkvKiByICovLAorICAgIGludAkJCS8qIGR4ICovLAorICAgIGludAkJCS8qIGR5ICovCispOworCitleHRlcm4gU3RhdHVzIFhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoCisgICAgY2hhcioqCQkvKiBsaXN0ICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIFhUZXh0UHJvcGVydHkqCS8qIHRleHRfcHJvcF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFN1YnRyYWN0UmVnaW9uKAorICAgIFJlZ2lvbgkJLyogc3JhICovLAorICAgIFJlZ2lvbgkJLyogc3JiICovLAorICAgIFJlZ2lvbgkJLyogZHJfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhtYlRleHRMaXN0VG9UZXh0UHJvcGVydHkoCisgICAgRGlzcGxheSoJCWRpc3BsYXksCisgICAgY2hhcioqCQlsaXN0LAorICAgIGludAkJCWNvdW50LAorICAgIFhJQ0NFbmNvZGluZ1N0eWxlCXN0eWxlLAorICAgIFhUZXh0UHJvcGVydHkqCXRleHRfcHJvcF9yZXR1cm4KKyk7CisKK2V4dGVybiBpbnQgWHdjVGV4dExpc3RUb1RleHRQcm9wZXJ0eSgKKyAgICBEaXNwbGF5KgkJZGlzcGxheSwKKyAgICB3Y2hhcl90KioJCWxpc3QsCisgICAgaW50CQkJY291bnQsCisgICAgWElDQ0VuY29kaW5nU3R5bGUJc3R5bGUsCisgICAgWFRleHRQcm9wZXJ0eSoJdGV4dF9wcm9wX3JldHVybgorKTsKKworZXh0ZXJuIGludCBYdXRmOFRleHRMaXN0VG9UZXh0UHJvcGVydHkoCisgICAgRGlzcGxheSoJCWRpc3BsYXksCisgICAgY2hhcioqCQlsaXN0LAorICAgIGludAkJCWNvdW50LAorICAgIFhJQ0NFbmNvZGluZ1N0eWxlCXN0eWxlLAorICAgIFhUZXh0UHJvcGVydHkqCXRleHRfcHJvcF9yZXR1cm4KKyk7CisKK2V4dGVybiB2b2lkIFh3Y0ZyZWVTdHJpbmdMaXN0KAorICAgIHdjaGFyX3QqKgkJbGlzdAorKTsKKworZXh0ZXJuIFN0YXR1cyBYVGV4dFByb3BlcnR5VG9TdHJpbmdMaXN0KAorICAgIFhUZXh0UHJvcGVydHkqCS8qIHRleHRfcHJvcCAqLywKKyAgICBjaGFyKioqCQkvKiBsaXN0X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBjb3VudF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWG1iVGV4dFByb3BlcnR5VG9UZXh0TGlzdCgKKyAgICBEaXNwbGF5KgkJZGlzcGxheSwKKyAgICBjb25zdCBYVGV4dFByb3BlcnR5KiB0ZXh0X3Byb3AsCisgICAgY2hhcioqKgkJbGlzdF9yZXR1cm4sCisgICAgaW50KgkJY291bnRfcmV0dXJuCispOworCitleHRlcm4gaW50IFh3Y1RleHRQcm9wZXJ0eVRvVGV4dExpc3QoCisgICAgRGlzcGxheSoJCWRpc3BsYXksCisgICAgY29uc3QgWFRleHRQcm9wZXJ0eSogdGV4dF9wcm9wLAorICAgIHdjaGFyX3QqKioJCWxpc3RfcmV0dXJuLAorICAgIGludCoJCWNvdW50X3JldHVybgorKTsKKworZXh0ZXJuIGludCBYdXRmOFRleHRQcm9wZXJ0eVRvVGV4dExpc3QoCisgICAgRGlzcGxheSoJCWRpc3BsYXksCisgICAgY29uc3QgWFRleHRQcm9wZXJ0eSogdGV4dF9wcm9wLAorICAgIGNoYXIqKioJCWxpc3RfcmV0dXJuLAorICAgIGludCoJCWNvdW50X3JldHVybgorKTsKKworZXh0ZXJuIGludCBYVW5pb25SZWN0V2l0aFJlZ2lvbigKKyAgICBYUmVjdGFuZ2xlKgkJLyogcmVjdGFuZ2xlICovLAorICAgIFJlZ2lvbgkJLyogc3JjX3JlZ2lvbiAqLywKKyAgICBSZWdpb24JCS8qIGRlc3RfcmVnaW9uX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYVW5pb25SZWdpb24oCisgICAgUmVnaW9uCQkvKiBzcmEgKi8sCisgICAgUmVnaW9uCQkvKiBzcmIgKi8sCisgICAgUmVnaW9uCQkvKiBkcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFdNR2VvbWV0cnkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHVzZXJfZ2VvbWV0cnkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBkZWZhdWx0X2dlb21ldHJ5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBib3JkZXJfd2lkdGggKi8sCisgICAgWFNpemVIaW50cyoJCS8qIGhpbnRzICovLAorICAgIGludCoJCS8qIHhfcmV0dXJuICovLAorICAgIGludCoJCS8qIHlfcmV0dXJuICovLAorICAgIGludCoJCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBoZWlnaHRfcmV0dXJuICovLAorICAgIGludCoJCS8qIGdyYXZpdHlfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhYb3JSZWdpb24oCisgICAgUmVnaW9uCQkvKiBzcmEgKi8sCisgICAgUmVnaW9uCQkvKiBzcmIgKi8sCisgICAgUmVnaW9uCQkvKiBkcl9yZXR1cm4gKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBfWDExX1hVVElMX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YdzMyZGVmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHczMmRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmU0YjMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHczMmRlZnMuaApAQCAtMCwwICsxLDc5IEBACisjaWZuZGVmIF9YVzMyREVGU19ICisjIGRlZmluZSAgX1hXMzJERUZTX0gKKworIyBpZmRlZiBfX0dOVUNfXyAvKiBtaW5ndyBpcyBtb3JlIGNsb3NlIHRvIHVuaXggdGhhbiBtc3ZjICovCisjICBpZiAhZGVmaW5lZChfX2RhZGRyX3RfZGVmaW5lZCkgCit0eXBlZGVmIGNoYXIgKmNhZGRyX3Q7CisjICBlbmRpZgorIyAgZGVmaW5lIGxzdGF0IHN0YXQKKworIyBlbHNlCit0eXBlZGVmIGNoYXIgKmNhZGRyX3Q7CisKKyMgIGRlZmluZSBhY2Nlc3MJICAgX2FjY2VzcworIyAgZGVmaW5lIGFsbG9jYQkgICBfYWxsb2NhCisjICBkZWZpbmUgY2hkaXIJX2NoZGlyCisjICBkZWZpbmUgY2htb2QJICAgX2NobW9kCisjICBkZWZpbmUgY2xvc2UJICAgX2Nsb3NlCisjICBkZWZpbmUgY3JlYXQJICAgX2NyZWF0CisjICBkZWZpbmUgZHVwCSAgIF9kdXAKKyMgIGRlZmluZSBkdXAyCSAgIF9kdXAyCisjICBkZWZpbmUgZW52aXJvbiAgICAgX2Vudmlyb24KKyMgIGRlZmluZSBleGVjbAkgX2V4ZWNsCisjICBkZWZpbmUgZXhlY2xlCSBfZXhlY2xlCisjICBkZWZpbmUgZXhlY2xwCSBfZXhlY2xwCisjICBkZWZpbmUgZXhlY2xwZSAgX2V4ZWNscGUKKyMgIGRlZmluZSBleGVjdgkgX2V4ZWN2CisjICBkZWZpbmUgZXhlY3ZlCSBfZXhlY3ZlCisjICBkZWZpbmUgZXhlY3ZwCSBfZXhlY3ZwCisjICBkZWZpbmUgZXhlY3ZwZSAgX2V4ZWN2cGUKKyMgIGRlZmluZSBmZG9wZW4JICBfZmRvcGVuCisjICBkZWZpbmUgZmlsZW5vCSAgX2ZpbGVubworIyAgZGVmaW5lIGZzdGF0CSBfZnN0YXQKKyMgIGRlZmluZSBnZXRjd2QJX2dldGN3ZAorIyAgZGVmaW5lIGdldHBpZAkgX2dldHBpZAorIyAgZGVmaW5lIGh5cG90CQlfaHlwb3QKKyMgIGRlZmluZSBpc2FzY2lpIF9faXNhc2NpaQorIyAgZGVmaW5lIGlzYXR0eQkgICBfaXNhdHR5CisjICBkZWZpbmUgbHNlZWsJICAgX2xzZWVrCisjICBkZWZpbmUgbWtkaXIJX21rZGlyCisjICBkZWZpbmUgbWt0ZW1wCSAgIF9ta3RlbXAKKyMgIGRlZmluZSBvcGVuCSAgIF9vcGVuCisjICBkZWZpbmUgcHV0ZW52CSAgICBfcHV0ZW52CisjICBkZWZpbmUgcmVhZAkgICBfcmVhZAorIyAgZGVmaW5lIHJtZGlyCV9ybWRpcgorIyAgZGVmaW5lIHNsZWVwKHgpIFNsZWVwKCh4KSAqIDEwMDApCisjICBkZWZpbmUgc3RhdAkgX3N0YXQKKyMgIGRlZmluZSBzeXNfZXJybGlzdCBfc3lzX2Vycmxpc3QKKyMgIGRlZmluZSBzeXNfbmVyciAgICBfc3lzX25lcnIKKyMgIGRlZmluZSB1bWFzawkgICBfdW1hc2sKKyMgIGRlZmluZSB1bmxpbmsJICAgX3VubGluaworIyAgZGVmaW5lIHdyaXRlCSAgIF93cml0ZQorIyAgZGVmaW5lIHJhbmRvbSAgIHJhbmQKKyMgIGRlZmluZSBzcmFuZG9tICBzcmFuZAorCisjICBkZWZpbmUgT19SRE9OTFkgICAgX09fUkRPTkxZCisjICBkZWZpbmUgT19XUk9OTFkgICAgX09fV1JPTkxZCisjICBkZWZpbmUgT19SRFdSCSAgICBfT19SRFdSCisjICBkZWZpbmUgT19BUFBFTkQgICAgX09fQVBQRU5ECisjICBkZWZpbmUgT19DUkVBVCAgICAgX09fQ1JFQVQKKyMgIGRlZmluZSBPX1RSVU5DICAgICBfT19UUlVOQworIyAgZGVmaW5lIE9fRVhDTAkgICAgX09fRVhDTAorIyAgZGVmaW5lIE9fVEVYVAkgICAgX09fVEVYVAorIyAgZGVmaW5lIE9fQklOQVJZICAgIF9PX0JJTkFSWQorIyAgZGVmaW5lIE9fUkFXCSAgICBfT19CSU5BUlkKKworIyAgZGVmaW5lIFNfSUZNVAkgX1NfSUZNVAorIyAgZGVmaW5lIFNfSUZESVIgIF9TX0lGRElSCisjICBkZWZpbmUgU19JRkNIUiAgX1NfSUZDSFIKKyMgIGRlZmluZSBTX0lGUkVHICBfU19JRlJFRworIyAgZGVmaW5lIFNfSVJFQUQgIF9TX0lSRUFECisjICBkZWZpbmUgU19JV1JJVEUgX1NfSVdSSVRFCisjICBkZWZpbmUgU19JRVhFQyAgX1NfSUVYRUMKKworIyAgZGVmaW5lCUZfT0sJMAorIyAgZGVmaW5lCVhfT0sJMQorIyAgZGVmaW5lCVdfT0sJMgorIyAgZGVmaW5lCVJfT0sJNAorIyBlbmRpZiAvKiBfX0dOVUNfXyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yd2luZG93cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHdpbmRvd3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE4MTU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHdpbmRvd3MuaApAQCAtMCwwICsxLDkxIEBACisvKgorCitDb3B5cmlnaHQgMTk5NiwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTC0KK0lUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UCitTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUwtCitJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tCitUaGUgT3BlbiBHcm91cC4KKworKi8KKworLyoKKyAqIFRoaXMgaGVhZGVyIGZpbGUgaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdGhlIGluY2x1c2lvbiBvZgorICogd2luZG93cy5oIHdpdGhvdXQgZ2V0dGluZyBhbnkgbmFtZSBjb25mbGljdHMgd2l0aCBYIGhlYWRlcnMgY29kZSwgYnkKKyAqIHJlbmFtaW5nIHRoZSBjb25mbGljdGluZyBkZWZpbml0aW9ucyBmcm9tIHdpbmRvd3MuaAorICoKKyAqIFNvbWUgKG5vbi1NaWNyb3NvZnQpIHZlcnNpb25zIG9mIHRoZSBXaW5kb3dzIEFQSSBoZWFkZXJzIGFjdHVhbGx5IGF2b2lkCisgKiBtYWtpbmcgdGhlIGNvbmZsaWN0aW5nIGRlZmluaXRpb25zIGlmIFhGcmVlODZTZXJ2ZXIgaXMgZGVmaW5lZCwgc28gd2UKKyAqIG5lZWQgdG8gcmVtZW1iZXIgaWYgdGhhdCB3YXMgZGVmaW5lZCBhbmQgdW5kZWZpbmUgaXQgZHVyaW5nIGluY2x1ZGluZworICogd2luZG93cy5oIChzbyB0aGUgY29uZmxpY3RpbmcgZGVmaW5pdGlvbnMgZ2V0IHdyYXBwZWQgY29ycmVjdGx5KSwgYW5kCisgKiB0aGVuIHJlZGVmaW5lIGl0IGFmdGVyd2FyZHMuLi4KKyAqCisgKiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBnb29kIHdheSB0byB3cmFwIHRoZSBtaW4vbWF4IG1hY3JvcyBmcm9tCisgKiB3aW5kb3dzLmgsIHNvIHdlIHNpbXBseSBhdm9pZCBkZWZpbmluZyB0aGVtIGNvbXBsZXRlbHksIGFsbG93aW5nIGFueQorICogcHJlLWV4aXN0aW5nIGRlZmluaXRpb24gdG8gc3RhbmQuCisgKgorICovCisKKyN1bmRlZiBfWEZyZWU4NlNlcnZlcgorI2lmZGVmIFhGcmVlODZTZXJ2ZXIKKyMgZGVmaW5lIF9YRnJlZTg2U2VydmVyCisjIHVuZGVmIFhGcmVlODZTZXJ2ZXIKKyNlbmRpZgorCisjZGVmaW5lIE5PTUlOTUFYCisjZGVmaW5lIEJPT0wgd0JPT0wKKyNkZWZpbmUgSU5UMzIgd0lOVDMyCisjdW5kZWYgU3RhdHVzCisjZGVmaW5lIFN0YXR1cyB3U3RhdHVzCisjZGVmaW5lIEFUT00gd0FUT00KKyNkZWZpbmUgQllURSB3QllURQorI2RlZmluZSBGcmVlUmVzb3VyY2Ugd0ZyZWVSZXNvdXJjZQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyN1bmRlZiBOT01JTk1BWAorI3VuZGVmIFN0YXR1cworI2RlZmluZSBTdGF0dXMgaW50CisjdW5kZWYgQllURQorI3VuZGVmIEJPT0wKKyN1bmRlZiBJTlQzMgorI3VuZGVmIEFUT00KKyN1bmRlZiBGcmVlUmVzb3VyY2UKKyN1bmRlZiBDcmVhdGVXaW5kb3dBCisKKyNpZmRlZiBSRVNPVVJDRV9ICisjIHVuZGVmIFJUX0ZPTlQKKyMgdW5kZWYgUlRfQ1VSU09SCisjIGRlZmluZSBSVF9GT05UICAgICAgICAgKChSRVNUWVBFKTQpCisjIGRlZmluZSBSVF9DVVJTT1IgICAgICAgKChSRVNUWVBFKTUpCisjZW5kaWYKKworI2lmbmRlZiBfX0NZR1dJTl9fCisjZGVmaW5lIHNsZWVwKHgpIFNsZWVwKCh4KSAqIDEwMDApCisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lOMzIpICYmICghZGVmaW5lZChQQVRIX01BWCkgfHwgUEFUSF9NQVggPCAxMDI0KQorIyB1bmRlZiBQQVRIX01BWAorIyBkZWZpbmUgUEFUSF9NQVggMTAyNAorI2VuZGlmCisKKyNpZmRlZiBfWEZyZWU4NlNlcnZlcgorIyBkZWZpbmUgWEZyZWU4NlNlcnZlcgorIyB1bmRlZiBfWEZyZWU4NlNlcnZlcgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h3aW5zb2NrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yd2luc29jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Y2E3YjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yd2luc29jay5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisKK0NvcHlyaWdodCAxOTk2LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMLQorSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQKK1NIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTC0KK0lUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCitJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20KK1RoZSBPcGVuIEdyb3VwLgorCisqLworCisvKgorICogVGhpcyBoZWFkZXIgZmlsZSBoYXMgZm9yIHNvbGUgcHVycG9zZSB0byBhbGxvdyB0byBpbmNsdWRlIHdpbnNvY2suaAorICogd2l0aG91dCBnZXR0aW5nIGFueSBuYW1lIGNvbmZsaWN0cyB3aXRoIG91ciBjb2RlLgorICogQ29uZmxpY3RzIGNvbWUgZnJvbSB0aGUgZmFjdCB0aGF0IGluY2x1ZGluZyB3aW5zb2NrLmggYWN0dWFsbHkgcHVsbHMKKyAqIGluIHRoZSB3aG9sZSBXaW5kb3dzIEFQSS4uLgorICovCisKKyN1bmRlZiBfWEZyZWU4NlNlcnZlcgorI2lmZGVmIFhGcmVlODZTZXJ2ZXIgCisjIGRlZmluZSBfWEZyZWU4NlNlcnZlcgorIyB1bmRlZiBYRnJlZTg2U2VydmVyCisjZW5kaWYKKworI2RlZmluZSBCT09MIHdCT09MCisjZGVmaW5lIElOVDMyIHdJTlQzMgorI3VuZGVmIFN0YXR1cworI2RlZmluZSBTdGF0dXMgd1N0YXR1cworI2RlZmluZSBBVE9NIHdBVE9NCisjZGVmaW5lIEJZVEUgd0JZVEUKKyNkZWZpbmUgRnJlZVJlc291cmNlIHdGcmVlUmVzb3VyY2UKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI3VuZGVmIFN0YXR1cworI2RlZmluZSBTdGF0dXMgaW50CisjdW5kZWYgQllURQorI3VuZGVmIEJPT0wKKyN1bmRlZiBJTlQzMgorI3VuZGVmIEFUT00KKyN1bmRlZiBGcmVlUmVzb3VyY2UKKyN1bmRlZiBDcmVhdGVXaW5kb3dBCisjdW5kZWYgUlRfRk9OVAorI3VuZGVmIFJUX0NVUlNPUgorCisjaWZkZWYgX1hGcmVlODZTZXJ2ZXIKKyMgZGVmaW5lIFhGcmVlODZTZXJ2ZXIKKyMgdW5kZWYgX1hGcmVlODZTZXJ2ZXIKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9hcF9rZXlzeW0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2FwX2tleXN5bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTE5NzEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9hcF9rZXlzeW0uaApAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgMTk4NyBieSBBcG9sbG8gQ29tcHV0ZXIgSW5jLiwgQ2hlbG1zZm9yZCwgTWFzc2FjaHVzZXR0cy4KK0NvcHlyaWdodCAxOTg5IGJ5IEhld2xldHQtUGFja2FyZCBDb21wYW55LgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBkdXBsaWNhdGUsIGNoYW5nZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKK2l0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgZ3JhbnRlZCwgcHJvdmlkZWQKK3RoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIHN1Y2ggY29weSBhbmQgdGhhdCB0aGlzCitjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUKK25hbWVzIG9mIEFwb2xsbyBDb21wdXRlciBJbmMuLCB0aGUgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnksIG9yIHRoZSBYCitDb25zb3J0aXVtIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCitkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitIRVdMRVRULVBBQ0tBUkQgTUFLRVMgTk8gV0FSUkFOVFkgT0YgQU5ZIEtJTkQgV0lUSCBSRUdBUkQKK1RPIFRISVMgU09GV0FSRSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKK1BVUlBPU0UuICBIZXdsZXR0LVBhY2thcmQgc2hhbGwgbm90IGJlIGxpYWJsZSBmb3IgZXJyb3JzIAorY29udGFpbmVkIGhlcmVpbiBvciBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIG9yIAorY29uc2VxdWVudGlhbCBkYW1hZ2VzIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgZnVybmlzaGluZywgCitwZXJmb3JtYW5jZSwgb3IgdXNlIG9mIHRoaXMgbWF0ZXJpYWwuCisKK1RoaXMgc29mdHdhcmUgaXMgbm90IHN1YmplY3QgdG8gYW55IGxpY2Vuc2Ugb2YgdGhlIEFtZXJpY2FuCitUZWxlcGhvbmUgYW5kIFRlbGVncmFwaCBDb21wYW55IG9yIG9mIHRoZSBSZWdlbnRzIG9mIHRoZQorVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGFwWEtfTGluZURlbCAgICAgICAgICAgIDB4MTAwMEZGMDAKKyNkZWZpbmUgYXBYS19DaGFyRGVsICAgICAgICAgICAgMHgxMDAwRkYwMQorI2RlZmluZSBhcFhLX0NvcHkgICAgICAgICAgICAgICAweDEwMDBGRjAyCisjZGVmaW5lIGFwWEtfQ3V0ICAgICAgICAgICAgICAgIDB4MTAwMEZGMDMKKyNkZWZpbmUgYXBYS19QYXN0ZSAgICAgICAgICAgICAgMHgxMDAwRkYwNAorI2RlZmluZSBhcFhLX01vdmUgICAgICAgICAgICAgICAweDEwMDBGRjA1CisjZGVmaW5lIGFwWEtfR3JvdyAgICAgICAgICAgICAgIDB4MTAwMEZGMDYKKyNkZWZpbmUgYXBYS19DbWQgICAgICAgICAgICAgICAgMHgxMDAwRkYwNworI2RlZmluZSBhcFhLX1NoZWxsICAgICAgICAgICAgICAweDEwMDBGRjA4CisjZGVmaW5lIGFwWEtfTGVmdEJhciAgICAgICAgICAgIDB4MTAwMEZGMDkKKyNkZWZpbmUgYXBYS19SaWdodEJhciAgICAgICAgICAgMHgxMDAwRkYwQQorI2RlZmluZSBhcFhLX0xlZnRCb3ggICAgICAgICAgICAweDEwMDBGRjBCCisjZGVmaW5lIGFwWEtfUmlnaHRCb3ggICAgICAgICAgIDB4MTAwMEZGMEMKKyNkZWZpbmUgYXBYS19VcEJveCAgICAgICAgICAgICAgMHgxMDAwRkYwRAorI2RlZmluZSBhcFhLX0Rvd25Cb3ggICAgICAgICAgICAweDEwMDBGRjBFCisjZGVmaW5lIGFwWEtfUG9wICAgICAgICAgICAgICAgIDB4MTAwMEZGMEYKKyNkZWZpbmUgYXBYS19SZWFkICAgICAgICAgICAgICAgMHgxMDAwRkYxMAorI2RlZmluZSBhcFhLX0VkaXQgICAgICAgICAgICAgICAweDEwMDBGRjExCisjZGVmaW5lIGFwWEtfU2F2ZSAgICAgICAgICAgICAgIDB4MTAwMEZGMTIKKyNkZWZpbmUgYXBYS19FeGl0ICAgICAgICAgICAgICAgMHgxMDAwRkYxMworI2RlZmluZSBhcFhLX1JlcGVhdCAgICAgICAgICAgICAweDEwMDBGRjE0CisKKyNkZWZpbmUgYXBYS19LUF9wYXJlbmxlZnQgICAgICAgMHgxMDAwRkZBOAorI2RlZmluZSBhcFhLX0tQX3BhcmVucmlnaHQgICAgICAweDEwMDBGRkE5CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9jdXJzb3Jmb250LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9jdXJzb3Jmb250LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5ZDUwOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2N1cnNvcmZvbnQuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKworQ29weXJpZ2h0IDE5ODcsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisjaWZuZGVmIF9YMTFfQ1VSU09SRk9OVF9IXworI2RlZmluZSBfWDExX0NVUlNPUkZPTlRfSF8KKworI2RlZmluZSBYQ19udW1fZ2x5cGhzIDE1NAorI2RlZmluZSBYQ19YX2N1cnNvciAwCisjZGVmaW5lIFhDX2Fycm93IDIKKyNkZWZpbmUgWENfYmFzZWRfYXJyb3dfZG93biA0CisjZGVmaW5lIFhDX2Jhc2VkX2Fycm93X3VwIDYKKyNkZWZpbmUgWENfYm9hdCA4CisjZGVmaW5lIFhDX2JvZ29zaXR5IDEwCisjZGVmaW5lIFhDX2JvdHRvbV9sZWZ0X2Nvcm5lciAxMgorI2RlZmluZSBYQ19ib3R0b21fcmlnaHRfY29ybmVyIDE0CisjZGVmaW5lIFhDX2JvdHRvbV9zaWRlIDE2CisjZGVmaW5lIFhDX2JvdHRvbV90ZWUgMTgKKyNkZWZpbmUgWENfYm94X3NwaXJhbCAyMAorI2RlZmluZSBYQ19jZW50ZXJfcHRyIDIyCisjZGVmaW5lIFhDX2NpcmNsZSAyNAorI2RlZmluZSBYQ19jbG9jayAyNgorI2RlZmluZSBYQ19jb2ZmZWVfbXVnIDI4CisjZGVmaW5lIFhDX2Nyb3NzIDMwCisjZGVmaW5lIFhDX2Nyb3NzX3JldmVyc2UgMzIKKyNkZWZpbmUgWENfY3Jvc3NoYWlyIDM0CisjZGVmaW5lIFhDX2RpYW1vbmRfY3Jvc3MgMzYKKyNkZWZpbmUgWENfZG90IDM4CisjZGVmaW5lIFhDX2RvdGJveCA0MAorI2RlZmluZSBYQ19kb3VibGVfYXJyb3cgNDIKKyNkZWZpbmUgWENfZHJhZnRfbGFyZ2UgNDQKKyNkZWZpbmUgWENfZHJhZnRfc21hbGwgNDYKKyNkZWZpbmUgWENfZHJhcGVkX2JveCA0OAorI2RlZmluZSBYQ19leGNoYW5nZSA1MAorI2RlZmluZSBYQ19mbGV1ciA1MgorI2RlZmluZSBYQ19nb2JibGVyIDU0CisjZGVmaW5lIFhDX2d1bWJ5IDU2CisjZGVmaW5lIFhDX2hhbmQxIDU4CisjZGVmaW5lIFhDX2hhbmQyIDYwCisjZGVmaW5lIFhDX2hlYXJ0IDYyCisjZGVmaW5lIFhDX2ljb24gNjQKKyNkZWZpbmUgWENfaXJvbl9jcm9zcyA2NgorI2RlZmluZSBYQ19sZWZ0X3B0ciA2OAorI2RlZmluZSBYQ19sZWZ0X3NpZGUgNzAKKyNkZWZpbmUgWENfbGVmdF90ZWUgNzIKKyNkZWZpbmUgWENfbGVmdGJ1dHRvbiA3NAorI2RlZmluZSBYQ19sbF9hbmdsZSA3NgorI2RlZmluZSBYQ19scl9hbmdsZSA3OAorI2RlZmluZSBYQ19tYW4gODAKKyNkZWZpbmUgWENfbWlkZGxlYnV0dG9uIDgyCisjZGVmaW5lIFhDX21vdXNlIDg0CisjZGVmaW5lIFhDX3BlbmNpbCA4NgorI2RlZmluZSBYQ19waXJhdGUgODgKKyNkZWZpbmUgWENfcGx1cyA5MAorI2RlZmluZSBYQ19xdWVzdGlvbl9hcnJvdyA5MgorI2RlZmluZSBYQ19yaWdodF9wdHIgOTQKKyNkZWZpbmUgWENfcmlnaHRfc2lkZSA5NgorI2RlZmluZSBYQ19yaWdodF90ZWUgOTgKKyNkZWZpbmUgWENfcmlnaHRidXR0b24gMTAwCisjZGVmaW5lIFhDX3J0bF9sb2dvIDEwMgorI2RlZmluZSBYQ19zYWlsYm9hdCAxMDQKKyNkZWZpbmUgWENfc2JfZG93bl9hcnJvdyAxMDYKKyNkZWZpbmUgWENfc2JfaF9kb3VibGVfYXJyb3cgMTA4CisjZGVmaW5lIFhDX3NiX2xlZnRfYXJyb3cgMTEwCisjZGVmaW5lIFhDX3NiX3JpZ2h0X2Fycm93IDExMgorI2RlZmluZSBYQ19zYl91cF9hcnJvdyAxMTQKKyNkZWZpbmUgWENfc2Jfdl9kb3VibGVfYXJyb3cgMTE2CisjZGVmaW5lIFhDX3NodXR0bGUgMTE4CisjZGVmaW5lIFhDX3NpemluZyAxMjAKKyNkZWZpbmUgWENfc3BpZGVyIDEyMgorI2RlZmluZSBYQ19zcHJheWNhbiAxMjQKKyNkZWZpbmUgWENfc3RhciAxMjYKKyNkZWZpbmUgWENfdGFyZ2V0IDEyOAorI2RlZmluZSBYQ190Y3Jvc3MgMTMwCisjZGVmaW5lIFhDX3RvcF9sZWZ0X2Fycm93IDEzMgorI2RlZmluZSBYQ190b3BfbGVmdF9jb3JuZXIgMTM0CisjZGVmaW5lIFhDX3RvcF9yaWdodF9jb3JuZXIgMTM2CisjZGVmaW5lIFhDX3RvcF9zaWRlIDEzOAorI2RlZmluZSBYQ190b3BfdGVlIDE0MAorI2RlZmluZSBYQ190cmVrIDE0MgorI2RlZmluZSBYQ191bF9hbmdsZSAxNDQKKyNkZWZpbmUgWENfdW1icmVsbGEgMTQ2CisjZGVmaW5lIFhDX3VyX2FuZ2xlIDE0OAorI2RlZmluZSBYQ193YXRjaCAxNTAKKyNkZWZpbmUgWENfeHRlcm0gMTUyCisKKyNlbmRpZiAvKiBfWDExX0NVUlNPUkZPTlRfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvRVZJLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL0VWSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmM2Y3MzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL0VWSS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMTk5NyBieSBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKK2ZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24KK29mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1NpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5CitvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgord2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorU0lMSUNPTiBHUkFQSElDUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUworU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCitHUkFQSElDUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMCitEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCitEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFCitPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gIFdJVEgKK1RIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FVklfSF8KKyNkZWZpbmUgX0VWSV9IXworCisjZGVmaW5lIFhFVklfVFJBTlNQQVJFTkNZX05PTkUJCTAKKyNkZWZpbmUgWEVWSV9UUkFOU1BBUkVOQ1lfUElYRUwJCTEKKyNkZWZpbmUgWEVWSV9UUkFOU1BBUkVOQ1lfTUFTSwkJMgorCisjZGVmaW5lIEVWSU5BTUUgIkV4dGVuZGVkLVZpc3VhbC1JbmZvcm1hdGlvbiIKKworI2RlZmluZSBYRVZJX01BSk9SX1ZFUlNJT04JMQkvKiBjdXJyZW50IHZlcnNpb24gbnVtYmVycyAqLworI2RlZmluZSBYRVZJX01JTk9SX1ZFUlNJT04JMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvRVZJcHJvdG8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvRVZJcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmEyODJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9FVklwcm90by5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMTk5NyBieSBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKK2ZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24KK29mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1NpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5CitvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgord2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorU0lMSUNPTiBHUkFQSElDUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUworU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCitHUkFQSElDUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMCitEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCitEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFCitPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gIFdJVEgKK1RIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FVklQUk9UT19IXworI2RlZmluZSBfRVZJUFJPVE9fSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL0VWSS5oPgorCisjZGVmaW5lIFhfRVZJUXVlcnlWZXJzaW9uCQkwCisjZGVmaW5lIFhfRVZJR2V0VmlzdWFsSW5mbwkJMQorCisjZGVmaW5lIFZpc3VhbElEIENBUkQzMgorCit0eXBlZGVmIENBUkQzMiBWaXN1YWxJRDMyOworI2RlZmluZSBzel9WaXN1YWxJRDMyIDQKKwordHlwZWRlZiBzdHJ1Y3QgX3hFeHRlbmRlZFZpc3VhbEluZm8geworICAgIFZpc3VhbElECWNvcmVfdmlzdWFsX2lkIEIzMjsKKyAgICBJTlQ4CXNjcmVlbjsKKyAgICBJTlQ4CWxldmVsOworICAgIENBUkQ4CXRyYW5zcGFyZW5jeV90eXBlOworICAgIENBUkQ4CXBhZDA7CisgICAgQ0FSRDMyCXRyYW5zcGFyZW5jeV92YWx1ZSBCMzI7CisgICAgQ0FSRDgJbWluX2h3X2NvbG9ybWFwczsKKyAgICBDQVJEOAltYXhfaHdfY29sb3JtYXBzOworICAgIENBUkQxNgludW1fY29sb3JtYXBfY29uZmxpY3RzIEIxNjsKK30geEV4dGVuZGVkVmlzdWFsSW5mbzsKKyNkZWZpbmUgc3pfeEV4dGVuZGVkVmlzdWFsSW5mbyAxNgorCit0eXBlZGVmIHN0cnVjdCBfWEVWSVF1ZXJ5VmVyc2lvbiB7CisgICAgQ0FSRDgJcmVxVHlwZTsJCS8qIGFsd2F5cyBYRVZJUmVxQ29kZSAqLworICAgIENBUkQ4CXhldmlSZXFUeXBlOwkJLyogYWx3YXlzIFhfRVZJUXVlcnlWZXJzaW9uICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhFVklRdWVyeVZlcnNpb25SZXE7CisjZGVmaW5lIHN6X3hFVklRdWVyeVZlcnNpb25SZXEJNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOCAJdW51c2VkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CW1ham9yVmVyc2lvbiBCMTY7CS8qIG1ham9yIHZlcnNpb24gb2YgRVZJIHByb3RvY29sICovCisgICAgQ0FSRDE2CW1pbm9yVmVyc2lvbiBCMTY7CS8qIG1pbm9yIHZlcnNpb24gb2YgRVZJIHByb3RvY29sICovCisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geEVWSVF1ZXJ5VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94RVZJUXVlcnlWZXJzaW9uUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1hFVklHZXRWaXN1YWxJbmZvUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWEVWSVJlcUNvZGUgKi8KKyAgICBDQVJEOAl4ZXZpUmVxVHlwZTsJLyogYWx3YXlzIFhfRVZJR2V0VmlzdWFsSW5mbyAqLworICAgIENBUkQxNiAgICAgIGxlbmd0aCBCMTY7CisgICAgQ0FSRDMyIAluX3Zpc3VhbCBCMzI7Cit9IHhFVklHZXRWaXN1YWxJbmZvUmVxOworI2RlZmluZSBzel94RVZJR2V0VmlzdWFsSW5mb1JlcQk4CisKK3R5cGVkZWYgc3RydWN0IF9YRVZJR2V0VmlzdWFsSW5mb1JlcGx5IHsKKyAgICBCWVRFCXR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJdW51c2VkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCW5faW5mbyBCMzI7CisgICAgQ0FSRDMyCW5fY29uZmxpY3RzIEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhFVklHZXRWaXN1YWxJbmZvUmVwbHk7CisjZGVmaW5lIHN6X3hFVklHZXRWaXN1YWxJbmZvUmVwbHkJMzIKKworI3VuZGVmIFZpc3VhbElECisKKyNlbmRpZiAvKiBfRVZJUFJPVE9fSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvTUlUTWlzYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9NSVRNaXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmYjMzNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvTUlUTWlzYy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSQU5ET00gQ1JVRlQhIFRISVMgSEFTIE5PIE9GRklDSUFMIFggQ09OU09SVElVTSBPUiBYIFBST0pFQ1QgVEVBTSBCTEVTU0lORyAqLworCisjaWZuZGVmIF9YTUlUTUlTQ19IXworI2RlZmluZSBfWE1JVE1JU0NfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvbWl0bWlzY2NvbnN0Lmg+CisKK19YRlVOQ1BST1RPQkVHSU4KKworQm9vbCBYTUlUTWlzY1F1ZXJ5RXh0ZW5zaW9uKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgaW50KgkJLyogZXZlbnRfYmFzZXAgKi8sCisgICAgaW50KgkJLyogZXJyb3JfYmFzZXAgKi8KKyk7CisKK1N0YXR1cyBYTUlUTWlzY1NldEJ1Z01vZGUoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBCb29sCQkvKiBvbk9mZiAqLworKTsKKworQm9vbCBYTUlUTWlzY0dldEJ1Z01vZGUoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hFVkkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEVWSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYTQ0MTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hFVkkuaApAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDE5OTcgYnkgU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU2lsaWNvbiBHcmFwaGljcyBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uCitvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eQorb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKK3dpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KK1NJTElDT04gR1JBUEhJQ1MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMKK1NPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKK0FORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorR1JBUEhJQ1MgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTAorREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRQorT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OICBXSVRICitUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfWEVWSV9IXworI2RlZmluZSBfWEVWSV9IXworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvRVZJLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBWaXN1YWxJRAkJY29yZV92aXN1YWxfaWQ7CisgICAgaW50CQkJc2NyZWVuOworICAgIGludAkJCWxldmVsOworICAgIHVuc2lnbmVkIGludAl0cmFuc3BhcmVuY3lfdHlwZTsKKyAgICB1bnNpZ25lZCBpbnQJdHJhbnNwYXJlbmN5X3ZhbHVlOworICAgIHVuc2lnbmVkIGludAltaW5faHdfY29sb3JtYXBzOworICAgIHVuc2lnbmVkIGludAltYXhfaHdfY29sb3JtYXBzOworICAgIHVuc2lnbmVkIGludAludW1fY29sb3JtYXBfY29uZmxpY3RzOworICAgIFZpc3VhbElEKgkJY29sb3JtYXBfY29uZmxpY3RzOworfSBFeHRlbmRlZFZpc3VhbEluZm87CisKK19YRlVOQ1BST1RPQkVHSU4KKworQm9vbCBYZXZpUXVlcnlFeHRlbnNpb24oCisgICAgRGlzcGxheSogICAgICAgICAgICAvKiBkcHkgKi8KKyk7CitTdGF0dXMgWGV2aVF1ZXJ5VmVyc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludCoJCS8qIG1ham9yVmVyc2lvbiAqLywKKyAgICBpbnQqCQkvKiBtaW5vclZlcnNpb24gKi8KKyk7CitTdGF0dXMgWGV2aUdldFZpc3VhbEluZm8oCisgICAgRGlzcGxheSoJCSAJLyogZHB5ICovLAorICAgIFZpc3VhbElEKgkJCS8qIHZpc3VhbF9xdWVyeSAqLywKKyAgICBpbnQJCQkJLyogblZpc3VhbF9xdWVyeSAqLywKKyAgICBFeHRlbmRlZFZpc3VhbEluZm8qKgkvKiBleHRlbmRlZFZpc3VhbEluZm9fcmV0dXJuICovLAorICAgIGludCoJCQkvKiBuSW5mb19yZXR1cm4gKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YSS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNDQzOTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJLmgKQEAgLTAsMCArMSwzMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKK0NvcHlyaWdodCAxOTg5IGJ5IEhld2xldHQtUGFja2FyZCBDb21wYW55LCBQYWxvIEFsdG8sIENhbGlmb3JuaWEuCisKKwkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgSGV3bGV0dC1QYWNrYXJkIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisKK0hFV0xFVFQtUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0hFV0xFVFQtUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgc2VydmVyLCBsaWJyYXJ5IGFuZCBjbGllbnQgKi8KKworI2lmbmRlZiBfWElfSF8KKyNkZWZpbmUgX1hJX0hfCisKKyNkZWZpbmUgc3pfeEdldEV4dGVuc2lvblZlcnNpb25SZXEgICAgICAgICAgICAgOAorI2RlZmluZSBzel94R2V0RXh0ZW5zaW9uVmVyc2lvblJlcGx5ICAgICAgICAgICAzMgorI2RlZmluZSBzel94TGlzdElucHV0RGV2aWNlc1JlcQkJCTQKKyNkZWZpbmUgc3pfeExpc3RJbnB1dERldmljZXNSZXBseQkJMzIKKyNkZWZpbmUgc3pfeE9wZW5EZXZpY2VSZXEJCQk4CisjZGVmaW5lIHN6X3hPcGVuRGV2aWNlUmVwbHkJCQkzMgorI2RlZmluZSBzel94Q2xvc2VEZXZpY2VSZXEJCQk4CisjZGVmaW5lIHN6X3hTZXREZXZpY2VNb2RlUmVxCQkJOAorI2RlZmluZSBzel94U2V0RGV2aWNlTW9kZVJlcGx5CQkJMzIKKyNkZWZpbmUgc3pfeFNlbGVjdEV4dGVuc2lvbkV2ZW50UmVxCQkxMgorI2RlZmluZSBzel94R2V0U2VsZWN0ZWRFeHRlbnNpb25FdmVudHNSZXEJOAorI2RlZmluZSBzel94R2V0U2VsZWN0ZWRFeHRlbnNpb25FdmVudHNSZXBseQkzMgorI2RlZmluZSBzel94Q2hhbmdlRGV2aWNlRG9udFByb3BhZ2F0ZUxpc3RSZXEJMTIKKyNkZWZpbmUgc3pfeEdldERldmljZURvbnRQcm9wYWdhdGVMaXN0UmVxCTgKKyNkZWZpbmUgc3pfeEdldERldmljZURvbnRQcm9wYWdhdGVMaXN0UmVwbHkJMzIKKyNkZWZpbmUgc3pfeEdldERldmljZU1vdGlvbkV2ZW50c1JlcQkJMTYKKyNkZWZpbmUgc3pfeEdldERldmljZU1vdGlvbkV2ZW50c1JlcGx5CQkzMgorI2RlZmluZSBzel94Q2hhbmdlS2V5Ym9hcmREZXZpY2VSZXEJCTgKKyNkZWZpbmUgc3pfeENoYW5nZUtleWJvYXJkRGV2aWNlUmVwbHkJCTMyCisjZGVmaW5lIHN6X3hDaGFuZ2VQb2ludGVyRGV2aWNlUmVxCQk4CisjZGVmaW5lIHN6X3hDaGFuZ2VQb2ludGVyRGV2aWNlUmVwbHkJCTMyCisjZGVmaW5lIHN6X3hHcmFiRGV2aWNlUmVxCQkJMjAKKyNkZWZpbmUgc3pfeEdyYWJEZXZpY2VSZXBseQkJCTMyCisjZGVmaW5lIHN6X3hVbmdyYWJEZXZpY2VSZXEJCQkxMgorI2RlZmluZSBzel94R3JhYkRldmljZUtleVJlcQkJCTIwCisjZGVmaW5lIHN6X3hHcmFiRGV2aWNlS2V5UmVwbHkJCQkzMgorI2RlZmluZSBzel94VW5ncmFiRGV2aWNlS2V5UmVxCQkJMTYKKyNkZWZpbmUgc3pfeEdyYWJEZXZpY2VCdXR0b25SZXEJCQkyMAorI2RlZmluZSBzel94R3JhYkRldmljZUJ1dHRvblJlcGx5CQkzMgorI2RlZmluZSBzel94VW5ncmFiRGV2aWNlQnV0dG9uUmVxCQkxNgorI2RlZmluZSBzel94QWxsb3dEZXZpY2VFdmVudHNSZXEJCTEyCisjZGVmaW5lIHN6X3hHZXREZXZpY2VGb2N1c1JlcQkJCTgKKyNkZWZpbmUgc3pfeEdldERldmljZUZvY3VzUmVwbHkJCQkzMgorI2RlZmluZSBzel94U2V0RGV2aWNlRm9jdXNSZXEJCQkxNgorI2RlZmluZSBzel94R2V0RmVlZGJhY2tDb250cm9sUmVxCQk4CisjZGVmaW5lIHN6X3hHZXRGZWVkYmFja0NvbnRyb2xSZXBseQkJMzIKKyNkZWZpbmUgc3pfeENoYW5nZUZlZWRiYWNrQ29udHJvbFJlcQkJMTIKKyNkZWZpbmUgc3pfeEdldERldmljZUtleU1hcHBpbmdSZXEJCTgKKyNkZWZpbmUgc3pfeEdldERldmljZUtleU1hcHBpbmdSZXBseQkJMzIKKyNkZWZpbmUgc3pfeENoYW5nZURldmljZUtleU1hcHBpbmdSZXEJCTgKKyNkZWZpbmUgc3pfeEdldERldmljZU1vZGlmaWVyTWFwcGluZ1JlcQkJOAorI2RlZmluZSBzel94U2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nUmVxCQk4CisjZGVmaW5lIHN6X3hTZXREZXZpY2VNb2RpZmllck1hcHBpbmdSZXBseQkzMgorI2RlZmluZSBzel94R2V0RGV2aWNlQnV0dG9uTWFwcGluZ1JlcQkJOAorI2RlZmluZSBzel94R2V0RGV2aWNlQnV0dG9uTWFwcGluZ1JlcGx5CQkzMgorI2RlZmluZSBzel94U2V0RGV2aWNlQnV0dG9uTWFwcGluZ1JlcQkJOAorI2RlZmluZSBzel94U2V0RGV2aWNlQnV0dG9uTWFwcGluZ1JlcGx5CQkzMgorI2RlZmluZSBzel94UXVlcnlEZXZpY2VTdGF0ZVJlcQkJCTgKKyNkZWZpbmUgc3pfeFF1ZXJ5RGV2aWNlU3RhdGVSZXBseQkJMzIKKyNkZWZpbmUgc3pfeFNlbmRFeHRlbnNpb25FdmVudFJlcQkJMTYKKyNkZWZpbmUgc3pfeERldmljZUJlbGxSZXEJCQk4CisjZGVmaW5lIHN6X3hTZXREZXZpY2VWYWx1YXRvcnNSZXEJCTgKKyNkZWZpbmUgc3pfeFNldERldmljZVZhbHVhdG9yc1JlcGx5CQkzMgorI2RlZmluZSBzel94R2V0RGV2aWNlQ29udHJvbFJlcQkJCTgKKyNkZWZpbmUgc3pfeEdldERldmljZUNvbnRyb2xSZXBseQkJMzIKKyNkZWZpbmUgc3pfeENoYW5nZURldmljZUNvbnRyb2xSZXEJCTgKKyNkZWZpbmUgc3pfeENoYW5nZURldmljZUNvbnRyb2xSZXBseQkJMzIKKyNkZWZpbmUgc3pfeExpc3REZXZpY2VQcm9wZXJ0aWVzUmVxICAgICAgICAgICAgIDgKKyNkZWZpbmUgc3pfeExpc3REZXZpY2VQcm9wZXJ0aWVzUmVwbHkgICAgICAgICAgIDMyCisjZGVmaW5lIHN6X3hDaGFuZ2VEZXZpY2VQcm9wZXJ0eVJlcSAgICAgICAgICAgICAyMAorI2RlZmluZSBzel94RGVsZXRlRGV2aWNlUHJvcGVydHlSZXEgICAgICAgICAgICAgMTIKKyNkZWZpbmUgc3pfeEdldERldmljZVByb3BlcnR5UmVxICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIHN6X3hHZXREZXZpY2VQcm9wZXJ0eVJlcGx5ICAgICAgICAgICAgICAzMgorCisjZGVmaW5lIElOQU1FCQkiWElucHV0RXh0ZW5zaW9uIgorCisjZGVmaW5lIFhJX0tFWUJPQVJECSJLRVlCT0FSRCIKKyNkZWZpbmUgWElfTU9VU0UJIk1PVVNFIgorI2RlZmluZSBYSV9UQUJMRVQJIlRBQkxFVCIKKyNkZWZpbmUgWElfVE9VQ0hTQ1JFRU4JIlRPVUNIU0NSRUVOIgorI2RlZmluZSBYSV9UT1VDSFBBRAkiVE9VQ0hQQUQiCisjZGVmaW5lIFhJX0JBUkNPREUJIkJBUkNPREUiCisjZGVmaW5lIFhJX0JVVFRPTkJPWAkiQlVUVE9OQk9YIgorI2RlZmluZSBYSV9LTk9CX0JPWAkiS05PQl9CT1giCisjZGVmaW5lIFhJX09ORV9LTk9CCSJPTkVfS05PQiIKKyNkZWZpbmUgWElfTklORV9LTk9CCSJOSU5FX0tOT0IiCisjZGVmaW5lIFhJX1RSQUNLQkFMTAkiVFJBQ0tCQUxMIgorI2RlZmluZSBYSV9RVUFEUkFUVVJFCSJRVUFEUkFUVVJFIgorI2RlZmluZSBYSV9JRF9NT0RVTEUJIklEX01PRFVMRSIKKyNkZWZpbmUgWElfU1BBQ0VCQUxMCSJTUEFDRUJBTEwiCisjZGVmaW5lIFhJX0RBVEFHTE9WRQkiREFUQUdMT1ZFIgorI2RlZmluZSBYSV9FWUVUUkFDS0VSCSJFWUVUUkFDS0VSIgorI2RlZmluZSBYSV9DVVJTT1JLRVlTCSJDVVJTT1JLRVlTIgorI2RlZmluZSBYSV9GT09UTU9VU0UJIkZPT1RNT1VTRSIKKyNkZWZpbmUgWElfSk9ZU1RJQ0sJIkpPWVNUSUNLIgorCisvKiBJbmRpY2VzIGludG8gdGhlIHZlcnNpb25zW10gYXJyYXkgKFhFeHRJbnQuYykuIFVzZWQgYXMgYSBpbmRleCB0bworICogcmV0cmlldmUgdGhlIG1pbmltdW0gdmVyc2lvbiBvZiBYSSBmcm9tIF9YaUNoZWNrRXh0SW5pdCAqLworI2RlZmluZSBEb250X0NoZWNrCQkJMAorI2RlZmluZSBYSW5wdXRfSW5pdGlhbF9SZWxlYXNlCQkxCisjZGVmaW5lIFhJbnB1dF9BZGRfWERldmljZUJlbGwJCTIKKyNkZWZpbmUgWElucHV0X0FkZF9YU2V0RGV2aWNlVmFsdWF0b3JzCTMKKyNkZWZpbmUgWElucHV0X0FkZF9YQ2hhbmdlRGV2aWNlQ29udHJvbAk0CisjZGVmaW5lIFhJbnB1dF9BZGRfRGV2aWNlUHJlc2VuY2VOb3RpZnkJNQorI2RlZmluZSBYSW5wdXRfQWRkX0RldmljZVByb3BlcnRpZXMJNgorLyogRE8gTk9UIEFERCBUTyBIRVJFIC0+IFhJMiAqLworCisjZGVmaW5lIFhJX0Fic2VudAkJMAorI2RlZmluZSBYSV9QcmVzZW50CQkxCisKKyNkZWZpbmUgWElfSW5pdGlhbF9SZWxlYXNlX01ham9yCQkxCisjZGVmaW5lIFhJX0luaXRpYWxfUmVsZWFzZV9NaW5vcgkJMAorCisjZGVmaW5lIFhJX0FkZF9YRGV2aWNlQmVsbF9NYWpvcgkJMQorI2RlZmluZSBYSV9BZGRfWERldmljZUJlbGxfTWlub3IJCTEKKworI2RlZmluZSBYSV9BZGRfWFNldERldmljZVZhbHVhdG9yc19NYWpvcgkxCisjZGVmaW5lIFhJX0FkZF9YU2V0RGV2aWNlVmFsdWF0b3JzX01pbm9yCTIKKworI2RlZmluZSBYSV9BZGRfWENoYW5nZURldmljZUNvbnRyb2xfTWFqb3IJMQorI2RlZmluZSBYSV9BZGRfWENoYW5nZURldmljZUNvbnRyb2xfTWlub3IJMworCisjZGVmaW5lIFhJX0FkZF9EZXZpY2VQcmVzZW5jZU5vdGlmeV9NYWpvcgkxCisjZGVmaW5lIFhJX0FkZF9EZXZpY2VQcmVzZW5jZU5vdGlmeV9NaW5vcgk0CisKKyNkZWZpbmUgWElfQWRkX0RldmljZVByb3BlcnRpZXNfTWFqb3IJCTEKKyNkZWZpbmUgWElfQWRkX0RldmljZVByb3BlcnRpZXNfTWlub3IJCTUKKworI2RlZmluZSBERVZJQ0VfUkVTT0xVVElPTgkxCisjZGVmaW5lIERFVklDRV9BQlNfQ0FMSUIgICAgICAgIDIKKyNkZWZpbmUgREVWSUNFX0NPUkUgICAgICAgICAgICAgMworI2RlZmluZSBERVZJQ0VfRU5BQkxFICAgICAgICAgICA0CisjZGVmaW5lIERFVklDRV9BQlNfQVJFQSAgICAgICAgIDUKKworI2RlZmluZSBOb1N1Y2hFeHRlbnNpb24JCTEKKworI2RlZmluZSBDT1VOVAkJCTAKKyNkZWZpbmUgQ1JFQVRFCQkJMQorCisjZGVmaW5lIE5ld1BvaW50ZXIJCTAKKyNkZWZpbmUgTmV3S2V5Ym9hcmQJCTEKKworI2RlZmluZSBYUE9JTlRFUgkJMAorI2RlZmluZSBYS0VZQk9BUkQJCTEKKworI2RlZmluZSBVc2VYS2V5Ym9hcmQJCTB4RkYKKworI2RlZmluZSBJc1hQb2ludGVyCQkwCisjZGVmaW5lIElzWEtleWJvYXJkCQkxCisjZGVmaW5lIElzWEV4dGVuc2lvbkRldmljZQkyCisjZGVmaW5lIElzWEV4dGVuc2lvbktleWJvYXJkICAgIDMKKyNkZWZpbmUgSXNYRXh0ZW5zaW9uUG9pbnRlciAgICAgNAorCisjZGVmaW5lIEFzeW5jVGhpc0RldmljZQkJMAorI2RlZmluZSBTeW5jVGhpc0RldmljZQkJMQorI2RlZmluZSBSZXBsYXlUaGlzRGV2aWNlCTIKKyNkZWZpbmUgQXN5bmNPdGhlckRldmljZXMJMworI2RlZmluZSBBc3luY0FsbAkJNAorI2RlZmluZSBTeW5jQWxsCQkJNQorCisjZGVmaW5lIEZvbGxvd0tleWJvYXJkIAkJMworI2lmbmRlZiBSZXZlcnRUb0ZvbGxvd0tleWJvYXJkCisjZGVmaW5lIFJldmVydFRvRm9sbG93S2V5Ym9hcmQgCTMKKyNlbmRpZgorCisjZGVmaW5lIER2QWNjZWxOdW0gICAgICAgICAgICAgICgxTCA8PCAwKQorI2RlZmluZSBEdkFjY2VsRGVub20gICAgICAgICAgICAoMUwgPDwgMSkKKyNkZWZpbmUgRHZUaHJlc2hvbGQgICAgICAgICAgICAgKDFMIDw8IDIpCisKKyNkZWZpbmUgRHZLZXlDbGlja1BlcmNlbnQJKDFMPDwwKQorI2RlZmluZSBEdlBlcmNlbnQJCSgxTDw8MSkKKyNkZWZpbmUgRHZQaXRjaAkJCSgxTDw8MikKKyNkZWZpbmUgRHZEdXJhdGlvbgkJKDFMPDwzKQorI2RlZmluZSBEdkxlZAkJCSgxTDw8NCkKKyNkZWZpbmUgRHZMZWRNb2RlCQkoMUw8PDUpCisjZGVmaW5lIER2S2V5CQkJKDFMPDw2KQorI2RlZmluZSBEdkF1dG9SZXBlYXRNb2RlCSgxTDw8NykKKworI2RlZmluZSBEdlN0cmluZyAgICAgICAgICAgICAgICAoMUwgPDwgMCkKKworI2RlZmluZSBEdkludGVnZXIgICAgICAgICAgICAgICAoMUwgPDwgMCkKKworI2RlZmluZSBEZXZpY2VNb2RlICAgICAgICAgICAgICAoMUwgPDwgMCkKKyNkZWZpbmUgUmVsYXRpdmUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBYnNvbHV0ZSAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgUHJveGltaXR5U3RhdGUgICAgICAgICAgKDFMIDw8IDEpCisjZGVmaW5lIEluUHJveGltaXR5ICAgICAgICAgICAgICgwTCA8PCAxKQorI2RlZmluZSBPdXRPZlByb3hpbWl0eSAgICAgICAgICAoMUwgPDwgMSkKKworI2RlZmluZSBBZGRUb0xpc3QgICAgICAgICAgICAgICAwCisjZGVmaW5lIERlbGV0ZUZyb21MaXN0ICAgICAgICAgIDEKKworI2RlZmluZSBLZXlDbGFzcyAgCQkwCisjZGVmaW5lIEJ1dHRvbkNsYXNzICAJCTEKKyNkZWZpbmUgVmFsdWF0b3JDbGFzcyAgCQkyCisjZGVmaW5lIEZlZWRiYWNrQ2xhc3MgIAkJMworI2RlZmluZSBQcm94aW1pdHlDbGFzcyAgCTQKKyNkZWZpbmUgRm9jdXNDbGFzcyAgCQk1CisjZGVmaW5lIE90aGVyQ2xhc3MgIAkJNgorI2RlZmluZSBBdHRhY2hDbGFzcyAgICAgICAgICAgICA3CisKKyNkZWZpbmUgS2JkRmVlZGJhY2tDbGFzcyAgCTAKKyNkZWZpbmUgUHRyRmVlZGJhY2tDbGFzcyAgCTEKKyNkZWZpbmUgU3RyaW5nRmVlZGJhY2tDbGFzcyAgCTIKKyNkZWZpbmUgSW50ZWdlckZlZWRiYWNrQ2xhc3MgIAkzCisjZGVmaW5lIExlZEZlZWRiYWNrQ2xhc3MgIAk0CisjZGVmaW5lIEJlbGxGZWVkYmFja0NsYXNzICAJNQorCisjZGVmaW5lIF9kZXZpY2VQb2ludGVyTW90aW9uSGludCAwCisjZGVmaW5lIF9kZXZpY2VCdXR0b24xTW90aW9uCSAxCisjZGVmaW5lIF9kZXZpY2VCdXR0b24yTW90aW9uCSAyCisjZGVmaW5lIF9kZXZpY2VCdXR0b24zTW90aW9uCSAzCisjZGVmaW5lIF9kZXZpY2VCdXR0b240TW90aW9uCSA0CisjZGVmaW5lIF9kZXZpY2VCdXR0b241TW90aW9uCSA1CisjZGVmaW5lIF9kZXZpY2VCdXR0b25Nb3Rpb24JIDYKKyNkZWZpbmUgX2RldmljZUJ1dHRvbkdyYWIJIDcKKyNkZWZpbmUgX2RldmljZU93bmVyR3JhYkJ1dHRvbgkgOAorI2RlZmluZSBfbm9FeHRlbnNpb25FdmVudAkgOQorCisjZGVmaW5lIF9kZXZpY2VQcmVzZW5jZQkJIDAKKworI2RlZmluZSBfZGV2aWNlRW50ZXIgICAgICAgICAgICAgMAorI2RlZmluZSBfZGV2aWNlTGVhdmUgICAgICAgICAgICAgMQorCisvKiBEZXZpY2UgcHJlc2VuY2Ugbm90aWZ5IHN0YXRlcyAqLworI2RlZmluZSBEZXZpY2VBZGRlZCAgICAgICAgICAgICAgMAorI2RlZmluZSBEZXZpY2VSZW1vdmVkICAgICAgICAgICAgMQorI2RlZmluZSBEZXZpY2VFbmFibGVkICAgICAgICAgICAgMgorI2RlZmluZSBEZXZpY2VEaXNhYmxlZCAgICAgICAgICAgMworI2RlZmluZSBEZXZpY2VVbnJlY292ZXJhYmxlICAgICAgNAorI2RlZmluZSBEZXZpY2VDb250cm9sQ2hhbmdlZCAgICAgNQorCisvKiBYSSBFcnJvcnMgKi8KKyNkZWZpbmUgWElfQmFkRGV2aWNlCTAKKyNkZWZpbmUgWElfQmFkRXZlbnQJMQorI2RlZmluZSBYSV9CYWRNb2RlCTIKKyNkZWZpbmUgWElfRGV2aWNlQnVzeQkzCisjZGVmaW5lIFhJX0JhZENsYXNzCTQKKworLyoKKyAqIE1ha2UgWEV2ZW50Q2xhc3MgYmUgYSBDQVJEMzIgZm9yIDY0IGJpdCBzZXJ2ZXJzLiAgRG9uJ3QgYWZmZWN0IGNsaWVudAorICogZGVmaW5pdGlvbiBvZiBYRXZlbnRDbGFzcyBzaW5jZSB0aGF0IHdvdWxkIGJlIGEgbGlicmFyeSBpbnRlcmZhY2UgY2hhbmdlLgorICogU2VlIHRoZSB0b3Agb2YgWC5oIGZvciBtb3JlIF9YU0VSVkVSNjQgbWFnaWMuCisgKgorICogQnV0LCBkb24ndCBhY3R1YWxseSB1c2UgdGhlIENBUkQzMiB0eXBlLiAgV2UgY2FuJ3QgZ2V0IGl0IGRlZmluZWQgaGVyZQorICogd2l0aG91dCBwb2xsdXRpbmcgdGhlIG5hbWVzcGFjZS4KKyAqLworI2lmZGVmIF9YU0VSVkVSNjQKK3R5cGVkZWYJdW5zaWduZWQgaW50CVhFdmVudENsYXNzOworI2Vsc2UKK3R5cGVkZWYJdW5zaWduZWQgbG9uZwlYRXZlbnRDbGFzczsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEV4dGVuc2lvbiB2ZXJzaW9uIHN0cnVjdHVyZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBpbnQgICAJcHJlc2VudDsKKyAgICAgICAgc2hvcnQJbWFqb3JfdmVyc2lvbjsKKyAgICAgICAgc2hvcnQJbWlub3JfdmVyc2lvbjsKK30gWEV4dGVuc2lvblZlcnNpb247CisKKyNlbmRpZiAvKiBfWElfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEkyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NjRiMDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJMi5oCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDkgUmVkIEhhdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfWEkyX0hfCisjZGVmaW5lIF9YSTJfSF8KKworI2RlZmluZSBYSW5wdXRfMl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworLyogRE8gTk9UIEFERCBUTyBUSElTIExJU1QuIFRoZXNlIGFyZSBsaWJYaS1zcGVjaWZpYyBkZWZpbmVzLgorICAgU2VlIGNvbW1pdCBsaWJYaS0xLjQuMi0yMS1nZTg1MzFkZCAqLworCisjZGVmaW5lIFhJXzJfTWFqb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhJXzJfTWlub3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKy8qIFByb3BlcnR5IGV2ZW50IGZsYWdzICovCisjZGVmaW5lIFhJUHJvcGVydHlEZWxldGVkICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFhJUHJvcGVydHlDcmVhdGVkICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhJUHJvcGVydHlNb2RpZmllZCAgICAgICAgICAgICAgICAgICAgICAyCisKKy8qIFByb3BlcnR5IG1vZGVzICovCisjZGVmaW5lIFhJUHJvcE1vZGVSZXBsYWNlICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFhJUHJvcE1vZGVQcmVwZW5kICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhJUHJvcE1vZGVBcHBlbmQgICAgICAgICAgICAgICAgICAgICAgICAyCisKKy8qIFNwZWNpYWwgcHJvcGVydHkgdHlwZSB1c2VkIGZvciBYSUdldFByb3BlcnR5ICovCisjZGVmaW5lIFhJQW55UHJvcGVydHlUeXBlICAgICAgICAgICAgICAgICAgICAgICAwTAorCisvKiBFbnRlci9MZWF2ZSBhbmQgRm9jdXMgSW4vT3V0IG1vZGVzICovCisjZGVmaW5lIFhJTm90aWZ5Tm9ybWFsICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFhJTm90aWZ5R3JhYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhJTm90aWZ5VW5ncmFiICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhJTm90aWZ5V2hpbGVHcmFiYmVkICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFhJTm90aWZ5UGFzc2l2ZUdyYWIgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFhJTm90aWZ5UGFzc2l2ZVVuZ3JhYiAgICAgICAgICAgICAgICAgICA1CisKKy8qIEVudGVyL0xlYXZlIGFuZCBmb2N1cyBJbi9vdXQgZGV0YWlsICovCisjZGVmaW5lIFhJTm90aWZ5QW5jZXN0b3IgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFhJTm90aWZ5VmlydHVhbCAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhJTm90aWZ5SW5mZXJpb3IgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhJTm90aWZ5Tm9ubGluZWFyICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFhJTm90aWZ5Tm9ubGluZWFyVmlydHVhbCAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFhJTm90aWZ5UG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFhJTm90aWZ5UG9pbnRlclJvb3QgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFhJTm90aWZ5RGV0YWlsTm9uZSAgICAgICAgICAgICAgICAgICAgICA3CisKKy8qIEdyYWIgbW9kZXMgKi8KKyNkZWZpbmUgWElHcmFiTW9kZVN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWElHcmFiTW9kZUFzeW5jICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWElHcmFiTW9kZVRvdWNoICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworLyogR3JhYiByZXBseSBzdGF0dXMgY29kZXMgKi8KKyNkZWZpbmUgWElHcmFiU3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWElBbHJlYWR5R3JhYmJlZCAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWElHcmFiSW52YWxpZFRpbWUgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWElHcmFiTm90Vmlld2FibGUgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWElHcmFiRnJvemVuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKworLyogR3JhYiBvd25lciBldmVudHMgdmFsdWVzICovCisjZGVmaW5lIFhJT3duZXJFdmVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlCisjZGVmaW5lIFhJTm9Pd25lckV2ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZQorCisvKiBQYXNzaXZlIGdyYWIgdHlwZXMgKi8KKyNkZWZpbmUgWElHcmFidHlwZUJ1dHRvbiAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWElHcmFidHlwZUtleWNvZGUgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWElHcmFidHlwZUVudGVyICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWElHcmFidHlwZUZvY3VzSW4gICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWElHcmFidHlwZVRvdWNoQmVnaW4gICAgICAgICAgICAgICAgICAgIDQKKworLyogUGFzc2l2ZSBncmFiIG1vZGlmaWVyICovCisjZGVmaW5lIFhJQW55TW9kaWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAoMVUgPDwgMzEpCisjZGVmaW5lIFhJQW55QnV0dG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFhJQW55S2V5Y29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIFhJQWxsb3dFdmVudHMgZXZlbnQtbW9kZXMgKi8KKyNkZWZpbmUgWElBc3luY0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWElTeW5jRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWElSZXBsYXlEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWElBc3luY1BhaXJlZERldmljZSAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWElBc3luY1BhaXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWElTeW5jUGFpciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgWElBY2NlcHRUb3VjaCAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgWElSZWplY3RUb3VjaCAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKworLyogRGV2aWNlQ2hhbmdlZEV2ZW50IGNoYW5nZSByZWFzb25zICovCisjZGVmaW5lIFhJU2xhdmVTd2l0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhJRGV2aWNlQ2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKy8qIEhpZXJhcmNoeSBmbGFncyAqLworI2RlZmluZSBYSU1hc3RlckFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgWElNYXN0ZXJSZW1vdmVkICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIFhJU2xhdmVBZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBYSVNsYXZlUmVtb3ZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgWElTbGF2ZUF0dGFjaGVkICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDQpCisjZGVmaW5lIFhJU2xhdmVEZXRhY2hlZCAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBYSURldmljZUVuYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNikKKyNkZWZpbmUgWElEZXZpY2VEaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDcpCisKKy8qIENoYW5nZUhpZXJhcmNoeSBjb25zdGFudHMgKi8KKyNkZWZpbmUgWElBZGRNYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWElSZW1vdmVNYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWElBdHRhY2hTbGF2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWElEZXRhY2hTbGF2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBYSUF0dGFjaFRvTWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBYSUZsb2F0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisvKiBWYWx1YXRvciBtb2RlcyAqLworI2RlZmluZSBYSU1vZGVSZWxhdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBYSU1vZGVBYnNvbHV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiBEZXZpY2UgdHlwZXMgKi8KKyNkZWZpbmUgWElNYXN0ZXJQb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWElNYXN0ZXJLZXlib2FyZCAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWElTbGF2ZVBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWElTbGF2ZUtleWJvYXJkICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWElGbG9hdGluZ1NsYXZlICAgICAgICAgICAgICAgICAgICAgICAgIDUKKworLyogRGV2aWNlIGNsYXNzZXM6IGNsYXNzZXMgdGhhdCBhcmUgbm90IGlkZW50aWNhbCB0byBYaSAxLnggY2xhc3NlcyBtdXN0IGJlCisgKiBudW1iZXJlZCBzdGFydGluZyBmcm9tIDguICovCisjZGVmaW5lIFhJS2V5Q2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFhJQnV0dG9uQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhJVmFsdWF0b3JDbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhJU2Nyb2xsQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFhJVG91Y2hDbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisKKy8qIFNjcm9sbCBjbGFzcyB0eXBlcyAqLworI2RlZmluZSBYSVNjcm9sbFR5cGVWZXJ0aWNhbCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBYSVNjcm9sbFR5cGVIb3Jpem9udGFsICAgICAgICAgICAgICAgICAgMgorCisvKiBTY3JvbGwgY2xhc3MgZmxhZ3MgKi8KKyNkZWZpbmUgWElTY3JvbGxGbGFnTm9FbXVsYXRpb24gICAgICAgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIFhJU2Nyb2xsRmxhZ1ByZWZlcnJlZCAgICAgICAgICAgICAgICAgICAoMSA8PCAxKQorCisvKiBEZXZpY2UgZXZlbnQgZmxhZ3MgKGNvbW1vbikgKi8KKy8qIERldmljZSBldmVudCBmbGFncyAoa2V5IGV2ZW50cyBvbmx5KSAqLworI2RlZmluZSBYSUtleVJlcGVhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTYpCisvKiBEZXZpY2UgZXZlbnQgZmxhZ3MgKHBvaW50ZXIgZXZlbnRzIG9ubHkpICovCisjZGVmaW5lIFhJUG9pbnRlckVtdWxhdGVkICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNikKKy8qIERldmljZSBldmVudCBmbGFncyAodG91Y2ggZXZlbnRzIG9ubHkpICovCisjZGVmaW5lIFhJVG91Y2hQZW5kaW5nRW5kICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgWElUb3VjaEVtdWxhdGluZ1BvaW50ZXIgICAgICAgICAgICAgICAgICgxIDw8IDE3KQorCisvKiBUb3VjaCBtb2RlcyAqLworI2RlZmluZSBYSURpcmVjdFRvdWNoICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBYSURlcGVuZGVudFRvdWNoICAgICAgICAgICAgICAgICAgICAgICAgMgorCisvKiBYSTIgZXZlbnQgbWFzayBtYWNyb3MgKi8KKyNkZWZpbmUgWElTZXRNYXNrKHB0ciwgZXZlbnQpICAgKCgodW5zaWduZWQgY2hhciopKHB0cikpWyhldmVudCk+PjNdIHw9ICAoMSA8PCAoKGV2ZW50KSAmIDcpKSkKKyNkZWZpbmUgWElDbGVhck1hc2socHRyLCBldmVudCkgKCgodW5zaWduZWQgY2hhciopKHB0cikpWyhldmVudCk+PjNdICY9IH4oMSA8PCAoKGV2ZW50KSAmIDcpKSkKKyNkZWZpbmUgWElNYXNrSXNTZXQocHRyLCBldmVudCkgKCgodW5zaWduZWQgY2hhciopKHB0cikpWyhldmVudCk+PjNdICYgICAoMSA8PCAoKGV2ZW50KSAmIDcpKSkKKyNkZWZpbmUgWElNYXNrTGVuKGV2ZW50KSAgICAgICAgKCgoZXZlbnQpID4+IDMpICsgMSkKKworLyogRmFrZSBkZXZpY2UgSUQncyBmb3IgZXZlbnQgc2VsZWN0aW9uICovCisjZGVmaW5lIFhJQWxsRGV2aWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFhJQWxsTWFzdGVyRGV2aWNlcyAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIEV2ZW50IHR5cGVzICovCisjZGVmaW5lIFhJX0RldmljZUNoYW5nZWQgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWElfS2V5UHJlc3MgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBYSV9LZXlSZWxlYXNlICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFhJX0J1dHRvblByZXNzICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWElfQnV0dG9uUmVsZWFzZSAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBYSV9Nb3Rpb24gICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFhJX0VudGVyICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgWElfTGVhdmUgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBYSV9Gb2N1c0luICAgICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFhJX0ZvY3VzT3V0ICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFhJX0hpZXJhcmNoeUNoYW5nZWQgICAgICAgICAgICAgIDExCisjZGVmaW5lIFhJX1Byb3BlcnR5RXZlbnQgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFhJX1Jhd0tleVByZXNzICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFhJX1Jhd0tleVJlbGVhc2UgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFhJX1Jhd0J1dHRvblByZXNzICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFhJX1Jhd0J1dHRvblJlbGVhc2UgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFhJX1Jhd01vdGlvbiAgICAgICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIFhJX1RvdWNoQmVnaW4gICAgICAgICAgICAgICAgICAgIDE4IC8qIFhJIDIuMiAqLworI2RlZmluZSBYSV9Ub3VjaFVwZGF0ZSAgICAgICAgICAgICAgICAgICAxOQorI2RlZmluZSBYSV9Ub3VjaEVuZCAgICAgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBYSV9Ub3VjaE93bmVyc2hpcCAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBYSV9SYXdUb3VjaEJlZ2luICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBYSV9SYXdUb3VjaFVwZGF0ZSAgICAgICAgICAgICAgICAyMworI2RlZmluZSBYSV9SYXdUb3VjaEVuZCAgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBYSV9MQVNURVZFTlQgICAgICAgICAgICAgICAgICAgICBYSV9SYXdUb3VjaEVuZAorLyogTk9URTogWEkyTEFTVEVWRU5UIGluIHhzZXJ2ZXIvaW5jbHVkZS9pbnB1dHN0ci5oIG11c3QgYmUgdGhlIHNhbWUgdmFsdWUKKyAqIGFzIFhJX0xBU1RFVkVOVCBpZiB0aGUgc2VydmVyIGlzIHN1cHBvc2VkIHRvIGhhbmRsZSBtYXNrcyBldGMuIGZvciB0aGlzCisgKiB0eXBlIG9mIGV2ZW50LiAqLworCisvKiBFdmVudCBtYXNrcy4KKyAqIE5vdGU6IHRoZSBwcm90b2NvbCBzcGVjIGRlZmluZXMgYSBtYXNrIHRvIGJlIG9mICgxIDw8IHR5cGUpLiBDbGllbnRzIGFyZQorICogZnJlZSB0byBjcmVhdGUgbWFza3MgYnkgYml0c2hpZnRpbmcgaW5zdGVhZCBvZiB1c2luZyB0aGVzZSBkZWZpbmVzLgorICovCisjZGVmaW5lIFhJX0RldmljZUNoYW5nZWRNYXNrICAgICAgICAgICAgICgxIDw8IFhJX0RldmljZUNoYW5nZWQpCisjZGVmaW5lIFhJX0tleVByZXNzTWFzayAgICAgICAgICAgICAgICAgICgxIDw8IFhJX0tleVByZXNzKQorI2RlZmluZSBYSV9LZXlSZWxlYXNlTWFzayAgICAgICAgICAgICAgICAoMSA8PCBYSV9LZXlSZWxlYXNlKQorI2RlZmluZSBYSV9CdXR0b25QcmVzc01hc2sgICAgICAgICAgICAgICAoMSA8PCBYSV9CdXR0b25QcmVzcykKKyNkZWZpbmUgWElfQnV0dG9uUmVsZWFzZU1hc2sgICAgICAgICAgICAgKDEgPDwgWElfQnV0dG9uUmVsZWFzZSkKKyNkZWZpbmUgWElfTW90aW9uTWFzayAgICAgICAgICAgICAgICAgICAgKDEgPDwgWElfTW90aW9uKQorI2RlZmluZSBYSV9FbnRlck1hc2sgICAgICAgICAgICAgICAgICAgICAoMSA8PCBYSV9FbnRlcikKKyNkZWZpbmUgWElfTGVhdmVNYXNrICAgICAgICAgICAgICAgICAgICAgKDEgPDwgWElfTGVhdmUpCisjZGVmaW5lIFhJX0ZvY3VzSW5NYXNrICAgICAgICAgICAgICAgICAgICgxIDw8IFhJX0ZvY3VzSW4pCisjZGVmaW5lIFhJX0ZvY3VzT3V0TWFzayAgICAgICAgICAgICAgICAgICgxIDw8IFhJX0ZvY3VzT3V0KQorI2RlZmluZSBYSV9IaWVyYXJjaHlDaGFuZ2VkTWFzayAgICAgICAgICAoMSA8PCBYSV9IaWVyYXJjaHlDaGFuZ2VkKQorI2RlZmluZSBYSV9Qcm9wZXJ0eUV2ZW50TWFzayAgICAgICAgICAgICAoMSA8PCBYSV9Qcm9wZXJ0eUV2ZW50KQorI2RlZmluZSBYSV9SYXdLZXlQcmVzc01hc2sgICAgICAgICAgICAgICAoMSA8PCBYSV9SYXdLZXlQcmVzcykKKyNkZWZpbmUgWElfUmF3S2V5UmVsZWFzZU1hc2sgICAgICAgICAgICAgKDEgPDwgWElfUmF3S2V5UmVsZWFzZSkKKyNkZWZpbmUgWElfUmF3QnV0dG9uUHJlc3NNYXNrICAgICAgICAgICAgKDEgPDwgWElfUmF3QnV0dG9uUHJlc3MpCisjZGVmaW5lIFhJX1Jhd0J1dHRvblJlbGVhc2VNYXNrICAgICAgICAgICgxIDw8IFhJX1Jhd0J1dHRvblJlbGVhc2UpCisjZGVmaW5lIFhJX1Jhd01vdGlvbk1hc2sgICAgICAgICAgICAgICAgICgxIDw8IFhJX1Jhd01vdGlvbikKKyNkZWZpbmUgWElfVG91Y2hCZWdpbk1hc2sgICAgICAgICAgICAgICAgKDEgPDwgWElfVG91Y2hCZWdpbikKKyNkZWZpbmUgWElfVG91Y2hFbmRNYXNrICAgICAgICAgICAgICAgICAgKDEgPDwgWElfVG91Y2hFbmQpCisjZGVmaW5lIFhJX1RvdWNoT3duZXJzaGlwQ2hhbmdlZE1hc2sgICAgICgxIDw8IFhJX1RvdWNoT3duZXJzaGlwQ2hhbmdlZCkKKyNkZWZpbmUgWElfVG91Y2hVcGRhdGVNYXNrICAgICAgICAgICAgICAgKDEgPDwgWElfVG91Y2hVcGRhdGUpCisjZGVmaW5lIFhJX1Jhd1RvdWNoQmVnaW5NYXNrICAgICAgICAgICAgICgxIDw8IFhJX1Jhd1RvdWNoQmVnaW4pCisjZGVmaW5lIFhJX1Jhd1RvdWNoRW5kTWFzayAgICAgICAgICAgICAgICgxIDw8IFhJX1Jhd1RvdWNoRW5kKQorI2RlZmluZSBYSV9SYXdUb3VjaFVwZGF0ZU1hc2sgICAgICAgICAgICAoMSA8PCBYSV9SYXdUb3VjaFVwZGF0ZSkKKworI2VuZGlmIC8qIF9YSTJfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEkycHJvdG8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEkycHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzNmOTIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YSTJwcm90by5oCkBAIC0wLDAgKzEsMTA0NCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA5IFJlZCBIYXQsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKy8qIENvbnZlbnRpb25zIGZvciB0aGlzIGZpbGU6CisgKiBOYW1lczoKKyAqIHN0cnVjdHM6IGFsd2F5cyB0eXBlZGVmJ2QsIHByZWZpeGVkIHdpdGggeFhJLCBDYW1lbENhc2UKKyAqIHN0cnVjdCBtZW1iZXJzOiBsb3dlcl9jYXNlX3dpdGhfdW5kZXJzY29yZXMKKyAqICAgICAgICBFeGNlcHRpb25zOiByZXFUeXBlLCBSZXFUeXBlLCByZXBUeXBlLCBSZXBUeXBlLCBzZXF1ZW5jZU51bWJlciBhcmUKKyAqICAgICAgICBuYW1lZCBhcyBzdWNoIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuCisgKiByZXF1ZXN0IG9wY29kZXM6IFhfWElSZXF1ZXN0TmFtZSBhcyBDYW1lbENhc2UKKyAqIGRlZmluZXM6IGRlZmluZXMgdXNlZCBpbiBjbGllbnQgYXBwbGljYXRpb25zIG11c3QgZ28gaW4gWEkyLmgKKyAqICAgICAgICAgIGRlZmluZXMgdXNlZCBvbmx5IGluIHByb3RvY29sIGhhbmRsaW5nOiBYSVNPTUVOQU1FCisgKgorICogRGF0YSB0eXBlczogdW5sZXNzIHRoZXJlIGlzIGEgaGlzdG9yaWNhbCBuYW1lIGZvciBhIGRhdGF0eXBlIChlLmcuCisgKiBXaW5kb3cpLCB1c2Ugc3RkaW50IHR5cGVzIHNwZWNpZnlpbmcgdGhlIHNpemUgb2YgdGhlIGRhdGF0eXBlLgorICogaGlzdG9yaWNhbCBkYXRhIHR5cGUgbmFtZXMgbXVzdCBiZSBkZWZpbmVkIGFuZCB1bmRlZmluZWQgYXQgdGhlIHRvcCBhbmQKKyAqIGVuZCBvZiB0aGUgZmlsZS4KKyAqCisgKiBHZW5lcmFsOgorICogc3BhY2VzLCBub3QgdGFicy4KKyAqIHN0cnVjdHMgc3BlY2lmaWMgdG8gYSByZXF1ZXN0IG9yIHJlcGx5IGFkZGVkIGJlZm9yZSB0aGUgcmVxdWVzdAorICogICAgICBkZWZpbml0aW9uLiBzdHJ1Y3RzIHVzZWQgaW4gbW9yZSB0aGFuIG9uZSByZXF1ZXN0LCByZXBseSBvciBldmVudAorICogICAgICBhcHBlbmRlZCB0byB0aGUgY29tbW9uIHN0cnVjdHMgc2VjdGlvbiBiZWZvcmUgdGhlIGRlZmluaXRpb24gb2YgdGhlCisgKiAgICAgIGZpcnN0IHJlcXVlc3QuCisgKiBtZW1iZXJzIG9mIHN0cnVjdHMgdmVydGljYWxseSBhbGlnbmVkIG9uIGNvbHVtbiAxNiBpZiBkYXRhdHlwZXMgcGVybWl0LgorICogICAgICBvdGhlcndpc2UgYWxpbmduZWQgb24gbmV4dCBhdmFpbGFibGUgOG4gY29sdW1uLgorICovCisKKy8qKgorICogUHJvdG9jb2wgZGVmaW5pdGlvbnMgZm9yIHRoZSBYSTIgcHJvdG9jb2wuCisgKiBUaGlzIGZpbGUgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBieSBjbGllbnRzIHRoYXQgbWVyZWx5IHVzZSBYSTIsIGJ1dCBkbyBub3QKKyAqIG5lZWQgdGhlIHdpcmUgcHJvdG9jb2wuIFN1Y2ggY2xpZW50cyBzaG91bGQgaW5jbHVkZSBYSTIuaCwgb3IgdGhlIG1hdGNoaW5nCisgKiBoZWFkZXIgZnJvbSB0aGUgbGlicmFyeS4KKyAqCisgKi8KKyNpZm5kZWYgX1hJMlBST1RPX0hfCisjZGVmaW5lIF9YSTJQUk9UT19IXworCisjaW5jbHVkZSA8WDExL1hwcm90by5oPgorI2luY2x1ZGUgPFgxMS9YLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWEkyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIG1ha2Ugc3VyZSB0eXBlcyBoYXZlIHJpZ2h0IHNpemVzIGZvciBwcm90b2NvbCBzdHJ1Y3R1cmVzLiAqLworI2RlZmluZSBXaW5kb3cgIHVpbnQzMl90CisjZGVmaW5lIFRpbWUgICAgdWludDMyX3QKKyNkZWZpbmUgQXRvbSAgICB1aW50MzJfdAorI2RlZmluZSBDdXJzb3IgIHVpbnQzMl90CisKKy8qKgorICogWEkyIFJlcXVlc3Qgb3Bjb2RlcworICovCisjZGVmaW5lIFhfWElRdWVyeVBvaW50ZXIgICAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgWF9YSVdhcnBQb2ludGVyICAgICAgICAgICAgICAgICA0MQorI2RlZmluZSBYX1hJQ2hhbmdlQ3Vyc29yICAgICAgICAgICAgICAgIDQyCisjZGVmaW5lIFhfWElDaGFuZ2VIaWVyYXJjaHkgICAgICAgICAgICAgNDMKKyNkZWZpbmUgWF9YSVNldENsaWVudFBvaW50ZXIgICAgICAgICAgICA0NAorI2RlZmluZSBYX1hJR2V0Q2xpZW50UG9pbnRlciAgICAgICAgICAgIDQ1CisjZGVmaW5lIFhfWElTZWxlY3RFdmVudHMgICAgICAgICAgICAgICAgNDYKKyNkZWZpbmUgWF9YSVF1ZXJ5VmVyc2lvbiAgICAgICAgICAgICAgICA0NworI2RlZmluZSBYX1hJUXVlcnlEZXZpY2UgICAgICAgICAgICAgICAgIDQ4CisjZGVmaW5lIFhfWElTZXRGb2N1cyAgICAgICAgICAgICAgICAgICAgNDkKKyNkZWZpbmUgWF9YSUdldEZvY3VzICAgICAgICAgICAgICAgICAgICA1MAorI2RlZmluZSBYX1hJR3JhYkRldmljZSAgICAgICAgICAgICAgICAgIDUxCisjZGVmaW5lIFhfWElVbmdyYWJEZXZpY2UgICAgICAgICAgICAgICAgNTIKKyNkZWZpbmUgWF9YSUFsbG93RXZlbnRzICAgICAgICAgICAgICAgICA1MworI2RlZmluZSBYX1hJUGFzc2l2ZUdyYWJEZXZpY2UgICAgICAgICAgIDU0CisjZGVmaW5lIFhfWElQYXNzaXZlVW5ncmFiRGV2aWNlICAgICAgICAgNTUKKyNkZWZpbmUgWF9YSUxpc3RQcm9wZXJ0aWVzICAgICAgICAgICAgICA1NgorI2RlZmluZSBYX1hJQ2hhbmdlUHJvcGVydHkgICAgICAgICAgICAgIDU3CisjZGVmaW5lIFhfWElEZWxldGVQcm9wZXJ0eSAgICAgICAgICAgICAgNTgKKyNkZWZpbmUgWF9YSUdldFByb3BlcnR5ICAgICAgICAgICAgICAgICA1OQorI2RlZmluZSBYX1hJR2V0U2VsZWN0ZWRFdmVudHMgICAgICAgICAgIDYwCisKKy8qKiBOdW1iZXIgb2YgWEkgcmVxdWVzdHMgKi8KKyNkZWZpbmUgWEkyUkVRVUVTVFMgKFhfWElHZXRTZWxlY3RlZEV2ZW50cyAtIFhfWElRdWVyeVBvaW50ZXIgKyAxKQorLyoqIE51bWJlciBvZiBYSTIgZXZlbnRzICovCisjZGVmaW5lIFhJMkVWRU5UUyAgIChYSV9MQVNURVZFTlQgKyAxKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1PTiBTVFJVQ1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogRml4ZWQgcG9pbnQgMTYuMTYgKi8KK3R5cGVkZWYgaW50MzJfdCBGUDE2MTY7CisKKy8qKiBGaXhlZCBwb2ludCAzMi4zMiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgICAgIGludGVncmFsOworICAgIHVpbnQzMl90ICAgIGZyYWM7Cit9IEZQMzIzMjsKKworLyoqCisgKiBTdHJ1Y3QgdG8gZGVzY3JpYmUgYSBkZXZpY2UuCisgKgorICogRm9yIGEgTWFzdGVyUG9pbnRlciBvciBhIE1hc3RlcktleWJvYXJkLCAnYXR0YWNobWVudCcgc3BlY2lmaWVzIHRoZQorICogcGFpcmVkIG1hc3RlciBkZXZpY2UuCisgKiBGb3IgYSBTbGF2ZUtleWJvYXJkIG9yIFNsYXZlUG9pbnRlciwgJ2F0dGFjaG1lbnQnIHNwZWNpZmllcyB0aGUgbWFzdGVyCisgKiBkZXZpY2UgdGhpcyBkZXZpY2UgaXMgYXR0YWNoZWQgdG8uCisgKiBGb3IgYSBGbG9hdGluZ1NsYXZlLCAnYXR0YWNobWVudCcgaXMgdW5kZWZpbmVkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDE2X3QgICAgdXNlOyAgICAgICAgICAgIC8qKjwgOjpYSU1hc3RlclBvaW50ZXIsIDo6WElNYXN0ZXJLZXlib2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OlhJU2xhdmVQb2ludGVyLCA6OlhJU2xhdmVLZXlib2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OlhJRmxvYXRpbmdTbGF2ZSAqLworICAgIHVpbnQxNl90ICAgIGF0dGFjaG1lbnQ7ICAgICAvKio8IEN1cnJlbnQgYXR0YWNobWVudCBvciBwYWlyaW5nLiovCisgICAgdWludDE2X3QgICAgbnVtX2NsYXNzZXM7ICAgIC8qKjwgTnVtYmVyIG9mIGNsYXNzZXMgZm9sbG93aW5nIHRoaXMgc3RydWN0LiAqLworICAgIHVpbnQxNl90ICAgIG5hbWVfbGVuOyAgICAgICAvKio8IExlbmd0aCBvZiBuYW1lIGluIGJ5dGVzLiAqLworICAgIHVpbnQ4X3QgICAgIGVuYWJsZWQ7ICAgICAgICAvKio8IFRSVUUgaWYgZGV2aWNlIGlzIGVuYWJsZWQuICovCisgICAgdWludDhfdCAgICAgcGFkOworfSB4WElEZXZpY2VJbmZvOworCisvKioKKyAqIERlZmF1bHQgdGVtcGxhdGUgZm9yIGEgZGV2aWNlIGNsYXNzLgorICogQSBkZXZpY2UgY2xhc3MgaXMgZXF1aXZhbGVudCB0byBhIGRldmljZSdzIGNhcGFiaWxpdGllcy4gTXVsdGlwbGUgY2xhc3NlcworICogYXJlIHN1cHBvcnRlZCBwZXIgZGV2aWNlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgICAgdHlwZTsgICAgICAgICAgIC8qKjwgT25lIG9mICpjbGFzcyAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICB1aW50MTZfdCAgICBzb3VyY2VpZDsgICAgICAgLyoqPCBzb3VyY2UgZGV2aWNlIGZvciB0aGlzIGNsYXNzICovCisgICAgdWludDE2X3QgICAgcGFkOworfSB4WElBbnlJbmZvOworCisvKioKKyAqIERlbm90ZXMgYnV0dG9uIGNhcGFiaWxpdHkgb24gYSBkZXZpY2UuCisgKiBTdHJ1Y3QgaXMgZm9sbG93ZWQgYnkgbnVtX2J1dHRvbnMgKiBBdG9tIHRoYXQgbmFtZXMgdGhlIGJ1dHRvbnMgaW4gdGhlCisgKiBkZXZpY2UtbmF0aXZlIHNldHVwIChpLmUuIGlnbm9yaW5nIGJ1dHRvbiBtYXBwaW5ncykuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCAgICB0eXBlOyAgICAgICAgICAgLyoqPCBBbHdheXMgQnV0dG9uQ2xhc3MgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDE2X3QgICAgc291cmNlaWQ7ICAgICAgIC8qKjwgc291cmNlIGRldmljZSBmb3IgdGhpcyBjbGFzcyAqLworICAgIHVpbnQxNl90ICAgIG51bV9idXR0b25zOyAgICAvKio8IE51bWJlciBvZiBidXR0b25zIHByb3ZpZGUgKi8KK30geFhJQnV0dG9uSW5mbzsKKworLyoqCisgKiBEZW5vdGVzIGtleSBjYXBhYmlsaXR5IG9uIGEgZGV2aWNlLgorICogU3RydWN0IGlzIGZvbGxvd2VkIGJ5IG51bV9rZXlzICogQ0FSRDMyIHRoYXQgbGlzdHMgdGhlIGtleWNvZGVzIGF2YWlsYWJsZQorICogb24gdGhlIGRldmljZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90ICAgIHR5cGU7ICAgICAgICAgICAvKio8IEFsd2F5cyBLZXlDbGFzcyAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICB1aW50MTZfdCAgICBzb3VyY2VpZDsgICAgICAgLyoqPCBzb3VyY2UgZGV2aWNlIGZvciB0aGlzIGNsYXNzICovCisgICAgdWludDE2X3QgICAgbnVtX2tleWNvZGVzOyAgIC8qKjwgTnVtYmVyIG9mIGtleXMgcHJvdmlkZWQgKi8KK30geFhJS2V5SW5mbzsKKworLyoqCisgKiBEZW5vdGVzIGFuIHZhbHVhdG9yIGNhcGFiaWxpdHkgb24gYSBkZXZpY2UuCisgKiBPbmUgWElWYWx1YXRvckluZm8gZGVzY3JpYmVzIGV4YWN0bHkgb25lIHZhbHVhdG9yIChheGlzKSBvbiB0aGUgZGV2aWNlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgICAgdHlwZTsgICAgICAgICAgIC8qKjwgQWx3YXlzIFZhbHVhdG9yQ2xhc3MgICAgICAgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDE2X3QgICAgc291cmNlaWQ7ICAgICAgIC8qKjwgc291cmNlIGRldmljZSBmb3IgdGhpcyBjbGFzcyAqLworICAgIHVpbnQxNl90ICAgIG51bWJlcjsgICAgICAgICAvKio8IFZhbHVhdG9yIG51bWJlciAgICAgICAgICAgICovCisgICAgQXRvbSAgICAgICAgbGFiZWw7ICAgICAgICAgIC8qKjwgQXhpcyBsYWJlbCAgICAgICAgICAgICAgICAgKi8KKyAgICBGUDMyMzIgICAgICBtaW47ICAgICAgICAgICAgLyoqPCBNaW4gdmFsdWUgICAgICAgICAgICAgICAgICAqLworICAgIEZQMzIzMiAgICAgIG1heDsgICAgICAgICAgICAvKio8IE1heCB2YWx1ZSAgICAgICAgICAgICAgICAgICovCisgICAgRlAzMjMyICAgICAgdmFsdWU7ICAgICAgICAgIC8qKjwgTGFzdCBwdWJsaXNoZWQgdmFsdWUgICAgICAgKi8KKyAgICB1aW50MzJfdCAgICByZXNvbHV0aW9uOyAgICAgLyoqPCBSZXNvbHV0aW9ucyBpbiB1bml0cy9tICAgICAqLworICAgIHVpbnQ4X3QgICAgIG1vZGU7ICAgICAgICAgICAvKio8IE1vZGVSZWxhdGl2ZSBvciBNb2RlQWJzb2x1dGUgKi8KKyAgICB1aW50OF90ICAgICBwYWQxOworICAgIHVpbnQxNl90ICAgIHBhZDI7Cit9IHhYSVZhbHVhdG9ySW5mbzsKKworLyoqKgorICogRGVub3RlcyBhIHNjcm9sbCB2YWx1YXRvciBvbiBhIGRldmljZS4KKyAqIE9uZSBYSVNjcm9sbEluZm8gZGVzY3JpYmVzIGV4YWN0bHkgb25lIHNjcm9sbCB2YWx1YXRvciB0aGF0IG11c3QgaGF2ZSBhCisgKiBYSVZhbHVhdG9ySW5mbyBzdHJ1Y3QuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCAgICB0eXBlOyAgICAgICAgICAgLyoqPCBBbHdheXMgVmFsdWF0b3JDbGFzcyAgICAgICAgICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAgICAgICAqLworICAgIHVpbnQxNl90ICAgIHNvdXJjZWlkOyAgICAgICAvKio8IHNvdXJjZSBkZXZpY2UgZm9yIHRoaXMgY2xhc3MgKi8KKyAgICB1aW50MTZfdCAgICBudW1iZXI7ICAgICAgICAgLyoqPCBWYWx1YXRvciBudW1iZXIgICAgICAgICAgICAgICovCisgICAgdWludDE2X3QgICAgc2Nyb2xsX3R5cGU7ICAgIC8qKjwgOjpYSVNjcm9sbFR5cGVWZXJ0aWNhbCwgOjpYSVNjcm9sbFR5cGVIb3Jpem9udGFsICovCisgICAgdWludDE2X3QgICAgcGFkMDsKKyAgICB1aW50MzJfdCAgICBmbGFnczsgICAgICAgICAgLyoqPCA6OlhJU2Nyb2xsRmxhZ0VtdWxhdGUsIDo6WElTY3JvbGxGbGFnUHJlZmVycmVkICAgKi8KKyAgICBGUDMyMzIgICAgICBpbmNyZW1lbnQ7ICAgICAgLyoqPCBJbmNyZW1lbnQgZm9yIG9uZSB1bml0IG9mIHNjcm9sbGluZyAgICAgICAgICAgICAgKi8KK30geFhJU2Nyb2xsSW5mbzsKKworLyoqCisgKiBEZW5vdGVzIG11bHRpdG91Y2ggY2FwYWJpbGl0eSBvbiBhIGRldmljZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90ICAgIHR5cGU7ICAgICAgICAgICAvKio8IEFsd2F5cyBUb3VjaENsYXNzICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIHVpbnQxNl90ICAgIHNvdXJjZWlkOyAgICAgICAvKio8IHNvdXJjZSBkZXZpY2UgZm9yIHRoaXMgY2xhc3MgKi8KKyAgICB1aW50OF90ICAgICBtb2RlOyAgICAgICAgICAgLyoqPCBEaXJlY3RUb3VjaCBvciBEZXBlbmRlbnRUb3VjaCAqLworICAgIHVpbnQ4X3QgICAgIG51bV90b3VjaGVzOyAgICAvKio8IE1heGltdW0gbnVtYmVyIG9mIHRvdWNoZXMgKDA9PXVubGltaXRlZCkgKi8KK30geFhJVG91Y2hJbmZvOworCisvKioKKyAqIFVzZWQgdG8gc2VsZWN0IGZvciBldmVudHMgb24gYSBnaXZlbiB3aW5kb3cuCisgKiBTdHJ1Y3QgaXMgZm9sbG93ZWQgYnkgKG1hc2tfbGVuICogQ0FSRDgpLCB3aXRoIGVhY2ggYml0IHNldCByZXByZXNlbnRpbmcKKyAqIHRoZSBldmVudCBtYXNrIGZvciB0aGUgZ2l2ZW4gdHlwZS4gQSBtYXNrIGJpdCByZXByZXNlbnRzIGFuIGV2ZW50IHR5cGUgaWYKKyAqIChtYXNrID09ICgxIDw8IHR5cGUpKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOyAgICAgICAvKio8IERldmljZSBpZCB0byBzZWxlY3QgZm9yICAgICAgICAqLworICAgIHVpbnQxNl90ICAgIG1hc2tfbGVuOyAgICAgICAvKio8IExlbmd0aCBvZiBtYXNrIGluIDQgYnl0ZSB1bml0cyAqLworfSB4WElFdmVudE1hc2s7CisKKy8qKgorICogWEtCIG1vZGlmaWVyIGluZm9ybWF0aW9uLgorICogVGhlIGVmZmVjdGl2ZSBtb2RpZmllciBpcyBhIGJpbmFyeSBtYXNrIG9mIGJhc2UsIGxhdGNoZWQsIGFuZCBsb2NrZWQKKyAqIG1vZGlmaWVycy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MzJfdCAgICBiYXNlX21vZHM7ICAgICAgICAgICAgICAvKio8IExvZ2ljYWxseSBwcmVzc2VkIG1vZGlmaWVycyAqLworICAgIHVpbnQzMl90ICAgIGxhdGNoZWRfbW9kczsgICAgICAgICAgIC8qKjwgTG9naWNhbGx5IGxhdGNoZWQgbW9kaWZpZXJzICovCisgICAgdWludDMyX3QgICAgbG9ja2VkX21vZHM7ICAgICAgICAgICAgLyoqPCBMb2dpY2FsbHkgbG9ja2VkIG1vZGlmaWVycyAqLworICAgIHVpbnQzMl90ICAgIGVmZmVjdGl2ZV9tb2RzOyAgICAgICAgIC8qKjwgRWZmZWN0aXZlIG1vZGlmaWVycyAqLworfSB4WElNb2RpZmllckluZm87CisKKy8qKgorICogWEtCIGdyb3VwIGluZm9ybWF0aW9uLgorICogVGhlIGVmZmVjdGl2ZSBncm91cCBpcyB0aGUgbWF0aGVtYXRpY2FsIHN1bSBvZiBiYXNlLCBsYXRjaGVkLCBhbmQgbG9ja2VkCisgKiBncm91cCBhZnRlciBncm91cCB3cmFwcGluZyBpcyB0YWtlbiBpbnRvIGFjY291bnQuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCAgICAgYmFzZV9ncm91cDsgICAgICAgICAgICAgLyoqPCBMb2dpY2FsbHkgInByZXNzZWQiIGdyb3VwICovCisgICAgdWludDhfdCAgICAgbGF0Y2hlZF9ncm91cDsgICAgICAgICAgLyoqPCBMb2dpY2FsbHkgbGF0Y2hlZCBncm91cCAqLworICAgIHVpbnQ4X3QgICAgIGxvY2tlZF9ncm91cDsgICAgICAgICAgIC8qKjwgTG9naWNhbGx5IGxvY2tlZCBncm91cCAqLworICAgIHVpbnQ4X3QgICAgIGVmZmVjdGl2ZV9ncm91cDsgICAgICAgIC8qKjwgRWZmZWN0aXZlIGdyb3VwICovCit9IHhYSUdyb3VwSW5mbzsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVFVRVNUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogUXVlcnkgdGhlIHNlcnZlciBmb3IgdGhlIHN1cHBvcnRlZCBYIElucHV0IGV4dGVuc2lvbiB2ZXJzaW9uLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IElucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICovCisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJUXVlcnlWZXJzaW9uICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDE2X3QgICAgbWFqb3JfdmVyc2lvbjsKKyAgICB1aW50MTZfdCAgICBtaW5vcl92ZXJzaW9uOworfSB4WElRdWVyeVZlcnNpb25SZXE7CisjZGVmaW5lIHN6X3hYSVF1ZXJ5VmVyc2lvblJlcSAgICAgICAgICAgICAgICAgICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcFR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgOjpYX1JlcGx5ICovCisgICAgdWludDhfdCAgICAgUmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJUXVlcnlWZXJzaW9uICovCisgICAgdWludDE2X3QgICAgc2VxdWVuY2VOdW1iZXI7CisgICAgdWludDMyX3QgICAgbGVuZ3RoOworICAgIHVpbnQxNl90ICAgIG1ham9yX3ZlcnNpb247CisgICAgdWludDE2X3QgICAgbWlub3JfdmVyc2lvbjsKKyAgICB1aW50MzJfdCAgICBwYWQxOworICAgIHVpbnQzMl90ICAgIHBhZDI7CisgICAgdWludDMyX3QgICAgcGFkMzsKKyAgICB1aW50MzJfdCAgICBwYWQ0OworICAgIHVpbnQzMl90ICAgIHBhZDU7Cit9IHhYSVF1ZXJ5VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94WElRdWVyeVZlcnNpb25SZXBseSAgICAgICAgICAgICAzMgorCisvKioKKyAqIFF1ZXJ5IHRoZSBzZXJ2ZXIgZm9yIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgZGV2aWNlIG9yIGFsbCBpbnB1dAorICogZGV2aWNlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgSW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUgKi8KKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElRdWVyeURldmljZSAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIHVpbnQxNl90ICAgIHBhZDsKK30geFhJUXVlcnlEZXZpY2VSZXE7CisjZGVmaW5lIHN6X3hYSVF1ZXJ5RGV2aWNlUmVxICAgICAgICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXBUeXBlOyAgICAgICAgICAgICAgICAvKio8IDo6WF9SZXBseSAqLworICAgIHVpbnQ4X3QgICAgIFJlcFR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSVF1ZXJ5RGV2aWNlICovCisgICAgdWludDE2X3QgICAgc2VxdWVuY2VOdW1iZXI7CisgICAgdWludDMyX3QgICAgbGVuZ3RoOworICAgIHVpbnQxNl90ICAgIG51bV9kZXZpY2VzOworICAgIHVpbnQxNl90ICAgIHBhZDA7CisgICAgdWludDMyX3QgICAgcGFkMTsKKyAgICB1aW50MzJfdCAgICBwYWQyOworICAgIHVpbnQzMl90ICAgIHBhZDM7CisgICAgdWludDMyX3QgICAgcGFkNDsKKyAgICB1aW50MzJfdCAgICBwYWQ1OworfSB4WElRdWVyeURldmljZVJlcGx5OworI2RlZmluZSBzel94WElRdWVyeURldmljZVJlcGx5ICAgICAgICAgICAgICAgICAgMzIKKworLyoqCisgKiBTZWxlY3QgZm9yIGV2ZW50cyBvbiBhIGdpdmVuIHdpbmRvdy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgSW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUgKi8KKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElTZWxlY3RFdmVudHMgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICBXaW5kb3cgICAgICB3aW47CisgICAgdWludDE2X3QgICAgbnVtX21hc2tzOworICAgIHVpbnQxNl90ICAgIHBhZDsKK30geFhJU2VsZWN0RXZlbnRzUmVxOworI2RlZmluZSBzel94WElTZWxlY3RFdmVudHNSZXEgICAgICAgICAgICAgICAgICAxMgorCisvKioKKyAqIFF1ZXJ5IGZvciBzZWxlY3RlZCBldmVudHMgb24gYSBnaXZlbiB3aW5kb3cuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IElucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICovCisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJR2V0U2VsZWN0ZWRFdmVudHMgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICBXaW5kb3cgICAgICB3aW47Cit9IHhYSUdldFNlbGVjdGVkRXZlbnRzUmVxOworI2RlZmluZSBzel94WElHZXRTZWxlY3RlZEV2ZW50c1JlcSAgICAgICAgICAgICAgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCBleHRlbnNpb24gbWFqb3Igb3Bjb2RlICovCisgICAgdWludDhfdCAgICAgUmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJR2V0U2VsZWN0ZWRFdmVudHMgKi8KKyAgICB1aW50MTZfdCAgICBzZXF1ZW5jZU51bWJlcjsKKyAgICB1aW50MzJfdCAgICBsZW5ndGg7CisgICAgdWludDE2X3QgICAgbnVtX21hc2tzOyAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgeFhJRXZlbnRNYXNrIHN0cnVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nIHRoZSByZXBseSAqLworICAgIHVpbnQxNl90ICAgIHBhZDA7CisgICAgdWludDMyX3QgICAgcGFkMTsKKyAgICB1aW50MzJfdCAgICBwYWQyOworICAgIHVpbnQzMl90ICAgIHBhZDM7CisgICAgdWludDMyX3QgICAgcGFkNDsKKyAgICB1aW50MzJfdCAgICBwYWQ1OworfSB4WElHZXRTZWxlY3RlZEV2ZW50c1JlcGx5OworI2RlZmluZSBzel94WElHZXRTZWxlY3RlZEV2ZW50c1JlcGx5ICAgICAgICAgICAgMzIKKworLyoqCisgKiBRdWVyeSB0aGUgZ2l2ZW4gZGV2aWNlJ3Mgc2NyZWVuL3dpbmRvdyBjb29yZGluYXRlcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZSAqLworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSVF1ZXJ5UG9pbnRlciAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIFdpbmRvdyAgICAgIHdpbjsKKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50MTZfdCAgICBwYWQxOworfSB4WElRdWVyeVBvaW50ZXJSZXE7CisjZGVmaW5lIHN6X3hYSVF1ZXJ5UG9pbnRlclJlcSAgICAgICAgICAgICAgICAgICAxMgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXBUeXBlOyAgICAgICAgICAgICAgICAvKio8IElucHV0IGV4dGVuc2lvbiBtYWpvciBvcGNvZGUgKi8KKyAgICB1aW50OF90ICAgICBSZXBUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElRdWVyeVBvaW50ZXIgKi8KKyAgICB1aW50MTZfdCAgICBzZXF1ZW5jZU51bWJlcjsKKyAgICB1aW50MzJfdCAgICBsZW5ndGg7CisgICAgV2luZG93ICAgICAgcm9vdDsKKyAgICBXaW5kb3cgICAgICBjaGlsZDsKKyAgICBGUDE2MTYgICAgICByb290X3g7CisgICAgRlAxNjE2ICAgICAgcm9vdF95OworICAgIEZQMTYxNiAgICAgIHdpbl94OworICAgIEZQMTYxNiAgICAgIHdpbl95OworICAgIHVpbnQ4X3QgICAgIHNhbWVfc2NyZWVuOworICAgIHVpbnQ4X3QgICAgIHBhZDA7CisgICAgdWludDE2X3QgICAgYnV0dG9uc19sZW47CisgICAgeFhJTW9kaWZpZXJJbmZvIG1vZHM7CisgICAgeFhJR3JvdXBJbmZvIGdyb3VwOworfSB4WElRdWVyeVBvaW50ZXJSZXBseTsKKyNkZWZpbmUgc3pfeFhJUXVlcnlQb2ludGVyUmVwbHkgICAgICAgICAgICAgICAgIDU2CisKKy8qKgorICogV2FycCB0aGUgZ2l2ZW4gZGV2aWNlJ3MgcG9pbnRlciB0byB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IElucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICovCisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJV2FycFBvaW50ZXIgICAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIFdpbmRvdyAgICAgIHNyY193aW47CisgICAgV2luZG93ICAgICAgZHN0X3dpbjsKKyAgICBGUDE2MTYgICAgICBzcmNfeDsKKyAgICBGUDE2MTYgICAgICBzcmNfeTsKKyAgICB1aW50MTZfdCAgICBzcmNfd2lkdGg7CisgICAgdWludDE2X3QgICAgc3JjX2hlaWdodDsKKyAgICBGUDE2MTYgICAgICBkc3RfeDsKKyAgICBGUDE2MTYgICAgICBkc3RfeTsKKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50MTZfdCAgICBwYWQxOworfSB4WElXYXJwUG9pbnRlclJlcTsKKyNkZWZpbmUgc3pfeFhJV2FycFBvaW50ZXJSZXEgICAgICAgICAgICAgICAgICAgIDM2CisKKy8qKgorICogQ2hhbmdlIHRoZSBnaXZlbiBkZXZpY2UncyBzcHJpdGUgdG8gdGhlIGdpdmVuIGN1cnNvci4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZSAqLworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSUNoYW5nZUN1cnNvciAgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICBXaW5kb3cgICAgICB3aW47CisgICAgQ3Vyc29yICAgICAgY3Vyc29yOworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIHVpbnQxNl90ICAgIHBhZDE7Cit9IHhYSUNoYW5nZUN1cnNvclJlcTsKKyNkZWZpbmUgc3pfeFhJQ2hhbmdlQ3Vyc29yUmVxICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKworLyoqCisgKiBNb2RpZnkgdGhlIGRldmljZSBoaWVyYXJjaHkuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgSW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUgKi8KKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElDaGFuZ2VIaWVyYXJjaHkgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICB1aW50OF90ICAgICBudW1fY2hhbmdlczsKKyAgICB1aW50OF90ICAgICBwYWQwOworICAgIHVpbnQxNl90ICAgIHBhZDE7Cit9IHhYSUNoYW5nZUhpZXJhcmNoeVJlcTsKKyNkZWZpbmUgc3pfeFhJQ2hhbmdlSGllcmFyY2h5UmVxICAgICAgICAgICAgICAgICAgICAgICAgOAorCisvKioKKyAqIEdlbmVyaWMgaGVhZGVyIGZvciBhbnkgaGllcmFyY2h5IGNoYW5nZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90ICAgIHR5cGU7CisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCit9IHhYSUFueUhpZXJhcmNoeUNoYW5nZUluZm87CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IG1hc3RlciBkZXZpY2UuCisgKiBOYW1lIG9mIG5ldyBtYXN0ZXIgZm9sbG93cyBzdHJ1Y3QgKDQtYnl0ZSBwYWRkZWQpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCAgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhJQWRkTWFzdGVyICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCAyICsgKG5hbWVsZW4gKyBwYWRkaW5nKS80ICovCisgICAgdWludDE2X3QgICAgbmFtZV9sZW47CisgICAgdWludDhfdCAgICAgc2VuZF9jb3JlOworICAgIHVpbnQ4X3QgICAgIGVuYWJsZTsKK30geFhJQWRkTWFzdGVySW5mbzsKKworLyoqCisgKiBEZWxldGUgYSBtYXN0ZXIgZGV2aWNlLiBXaWxsIGF1dG9tYXRpY2FsbHkgZGVsZXRlIHRoZSBtYXN0ZXIgZGV2aWNlIHBhaXJlZAorICogd2l0aCB0aGUgZ2l2ZW4gbWFzdGVyIGRldmljZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90ICAgIHR5cGU7ICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYSVJlbW92ZU1hc3RlciAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgLyoqPCAzICovCisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDhfdCAgICAgcmV0dXJuX21vZGU7ICAgICAvKio8IDo6WElBdHRhY2hUb01hc3RlciwgOjpYSUZsb2F0aW5nICovCisgICAgdWludDhfdCAgICAgcGFkOworICAgIHVpbnQxNl90ICAgIHJldHVybl9wb2ludGVyOyAgLyoqPCBQb2ludGVyIHRvIGF0dGFjaCBzbGF2ZSBwdHIgZGV2aWNlcyB0byAqLworICAgIHVpbnQxNl90ICAgIHJldHVybl9rZXlib2FyZDsgLyoqPCBrZXlib2FyZCB0byBhdHRhY2ggc2xhdmUga2V5YmQgZGV2aWNlcyB0byovCit9IHhYSVJlbW92ZU1hc3RlckluZm87CisKKy8qKgorICogQXR0YWNoIGFuIFNEIHRvIGEgbmV3IGRldmljZS4KKyAqIE5ld01hc3RlciBoYXMgdG8gYmUgb2Ygc2FtZSB0eXBlIChwb2ludGVyLT5wb2ludGVyLCBrZXlib2FyZC0+a2V5Ym9hcmQpOworICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgICAgdHlwZTsgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WElBdHRhY2hTbGF2ZSAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAvKio8IDIgKi8KKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50MTZfdCAgICBuZXdfbWFzdGVyOyAgICAgLyoqPCBpZCBvZiBuZXcgbWFzdGVyIGRldmljZSAqLworfSB4WElBdHRhY2hTbGF2ZUluZm87CisKKy8qKgorICogRGV0YWNoIGFuIFNEIGZyb20gaXRzIGN1cnJlbnQgbWFzdGVyIGRldmljZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90ICAgIHR5cGU7ICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhJRGV0YWNoU2xhdmUgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgLyoqPCAyICovCisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDE2X3QgICAgcGFkOworfSB4WElEZXRhY2hTbGF2ZUluZm87CisKKworLyoqCisgKiBTZXQgdGhlIHdpbmRvdy9jbGllbnQncyBDbGllbnRQb2ludGVyLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsKKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElTZXRDbGllbnRQb2ludGVyICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgV2luZG93ICAgICAgd2luOworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIHVpbnQxNl90ICAgIHBhZDE7Cit9IHhYSVNldENsaWVudFBvaW50ZXJSZXE7CisjZGVmaW5lIHN6X3hYSVNldENsaWVudFBvaW50ZXJSZXEgICAgICAgICAgICAgICAgIDEyCisKKy8qKgorICogUXVlcnkgdGhlIGdpdmVuIHdpbmRvdy9jbGllbnQncyBDbGllbnRQb2ludGVyIHNldHRpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9HZXRDbGllbnRQb2ludGVyICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgV2luZG93ICAgICAgd2luOworfSB4WElHZXRDbGllbnRQb2ludGVyUmVxOworI2RlZmluZSBzel94WElHZXRDbGllbnRQb2ludGVyUmVxICAgICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXBUeXBlOyAgICAgICAgICAgICAgICAvKio8IElucHV0IGV4dGVuc2lvbiBtYWpvciBvcGNvZGUgKi8KKyAgICB1aW50OF90ICAgICBSZXBUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfR2V0Q2xpZW50UG9pbnRlciAqLworICAgIHVpbnQxNl90ICAgIHNlcXVlbmNlTnVtYmVyOworICAgIHVpbnQzMl90ICAgIGxlbmd0aDsKKyAgICBCT09MICAgICAgICBzZXQ7ICAgICAgICAgICAgICAgICAgICAvKio8IGNsaWVudCBwb2ludGVyIGlzIHNldD8gKi8KKyAgICB1aW50OF90ICAgICBwYWQwOworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIHVpbnQzMl90ICAgIHBhZDE7CisgICAgdWludDMyX3QgICAgcGFkMjsKKyAgICB1aW50MzJfdCAgICBwYWQzOworICAgIHVpbnQzMl90ICAgIHBhZDQ7CisgICAgdWludDMyX3QgICAgcGFkNTsKK30geFhJR2V0Q2xpZW50UG9pbnRlclJlcGx5OworI2RlZmluZSBzel94WElHZXRDbGllbnRQb2ludGVyUmVwbHkgICAgICAgICAgICAgICAzMgorCisvKioKKyAqIFNldCB0aGUgaW5wdXQgZm9jdXMgdG8gdGhlIHNwZWNpZmllZCB3aW5kb3cuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSVNldEZvY3VzICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgV2luZG93ICAgICAgZm9jdXM7CisgICAgVGltZSAgICAgICAgdGltZTsKKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50MTZfdCAgICBwYWQwOworfSB4WElTZXRGb2N1c1JlcTsKKyNkZWZpbmUgc3pfeFhJU2V0Rm9jdXNSZXEgICAgICAgICAgICAgICAgICAgICAgIDE2CisKKy8qKgorICogUXVlcnkgdGhlIGN1cnJlbnQgaW5wdXQgZm9jdXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSUdldERldmljZUZvY3VzICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDE2X3QgICAgcGFkMDsKK30geFhJR2V0Rm9jdXNSZXE7CisjZGVmaW5lIHN6X3hYSUdldEZvY3VzUmVxICAgICAgICAgICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXBUeXBlOyAgICAgICAgICAgICAgICAvKio8IElucHV0IGV4dGVuc2lvbiBtYWpvciBvcGNvZGUgKi8KKyAgICB1aW50OF90ICAgICBSZXBUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElHZXRGb2N1cyAqLworICAgIHVpbnQxNl90ICAgIHNlcXVlbmNlTnVtYmVyOworICAgIHVpbnQzMl90ICAgIGxlbmd0aDsKKyAgICBXaW5kb3cgICAgICBmb2N1czsKKyAgICB1aW50MzJfdCAgICBwYWQxOworICAgIHVpbnQzMl90ICAgIHBhZDI7CisgICAgdWludDMyX3QgICAgcGFkMzsKKyAgICB1aW50MzJfdCAgICBwYWQ0OworICAgIHVpbnQzMl90ICAgIHBhZDU7Cit9IHhYSUdldEZvY3VzUmVwbHk7CisjZGVmaW5lIHN6X3hYSUdldEZvY3VzUmVwbHkgICAgICAgICAgICAgICAgICAgICAzMgorCisKKy8qKgorICogR3JhYiB0aGUgZ2l2ZW4gZGV2aWNlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsKKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElHcmFiRGV2aWNlICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgV2luZG93ICAgICAgZ3JhYl93aW5kb3c7CisgICAgVGltZSAgICAgICAgdGltZTsKKyAgICBDdXJzb3IgICAgICBjdXJzb3I7CisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDhfdCAgICAgZ3JhYl9tb2RlOworICAgIHVpbnQ4X3QgICAgIHBhaXJlZF9kZXZpY2VfbW9kZTsKKyAgICB1aW50OF90ICAgICBvd25lcl9ldmVudHM7CisgICAgdWludDhfdCAgICAgcGFkOworICAgIHVpbnQxNl90ICAgIG1hc2tfbGVuOworfSB4WElHcmFiRGV2aWNlUmVxOworI2RlZmluZSBzel94WElHcmFiRGV2aWNlUmVxICAgICAgICAgICAgICAgICAgICAgMjQKKworLyoqCisgKiBSZXR1cm4gY29kZXMgZnJvbSBhIFhJUGFzc2l2ZUdyYWJEZXZpY2UgcmVxdWVzdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90ICAgIG1vZGlmaWVyczsgICAgICAgICAgICAgIC8qKjwgTW9kaWZpZXIgc3RhdGUgKi8KKyAgICB1aW50OF90ICAgICBzdGF0dXM7ICAgICAgICAgICAgICAgICAvKio8IEdyYWIgc3RhdHVzIGNvZGUgKi8KKyAgICB1aW50OF90ICAgICBwYWQwOworICAgIHVpbnQxNl90ICAgIHBhZDE7Cit9IHhYSUdyYWJNb2RpZmllckluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXBUeXBlOyAgICAgICAgICAgICAgICAvKio8IElucHV0IGV4dGVuc2lvbiBtYWpvciBvcGNvZGUgKi8KKyAgICB1aW50OF90ICAgICBSZXBUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElHcmFiRGV2aWNlICovCisgICAgdWludDE2X3QgICAgc2VxdWVuY2VOdW1iZXI7CisgICAgdWludDMyX3QgICAgbGVuZ3RoOworICAgIHVpbnQ4X3QgICAgIHN0YXR1czsKKyAgICB1aW50OF90ICAgICBwYWQwOworICAgIHVpbnQxNl90ICAgIHBhZDE7CisgICAgdWludDMyX3QgICAgcGFkMjsKKyAgICB1aW50MzJfdCAgICBwYWQzOworICAgIHVpbnQzMl90ICAgIHBhZDQ7CisgICAgdWludDMyX3QgICAgcGFkNTsKKyAgICB1aW50MzJfdCAgICBwYWQ2OworfSB4WElHcmFiRGV2aWNlUmVwbHk7CisjZGVmaW5lIHN6X3hYSUdyYWJEZXZpY2VSZXBseSAgICAgICAgICAgICAgICAgIDMyCisKKy8qKgorICogVW5ncmFiIHRoZSBzcGVjaWZpZWQgZGV2aWNlLgorICoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcVR5cGU7CisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJVW5ncmFiRGV2aWNlICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgVGltZSAgICAgICAgdGltZTsKKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50MTZfdCAgICBwYWQ7Cit9IHhYSVVuZ3JhYkRldmljZVJlcTsKKyNkZWZpbmUgc3pfeFhJVW5ncmFiRGV2aWNlUmVxICAgICAgICAgICAgICAgICAgIDEyCisKKworLyoqCisgKiBBbGxvdyBvciByZXBsYXkgZXZlbnRzIG9uIHRoZSBzcGVjaWZpZWQgZ3JhYmJlZCBkZXZpY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSUFsbG93RXZlbnRzICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgVGltZSAgICAgICAgdGltZTsKKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50OF90ICAgICBtb2RlOworICAgIHVpbnQ4X3QgICAgIHBhZDsKK30geFhJQWxsb3dFdmVudHNSZXE7CisjZGVmaW5lIHN6X3hYSUFsbG93RXZlbnRzUmVxICAgICAgICAgICAgICAgICAgIDEyCisKKy8qKgorICogQWxsb3cgb3IgcmVwbGF5IGV2ZW50cyBvbiB0aGUgc3BlY2lmaWVkIGdyYWJiZWQgZGV2aWNlLgorICogU2luY2UgWEkgMi4yCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSUFsbG93RXZlbnRzICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgVGltZSAgICAgICAgdGltZTsKKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50OF90ICAgICBtb2RlOworICAgIHVpbnQ4X3QgICAgIHBhZDsKKyAgICB1aW50MzJfdCAgICB0b3VjaGlkOyAgICAgICAgICAgICAgICAvKio8IFNpbmNlIFhJIDIuMiAqLworICAgIFdpbmRvdyAgICAgIGdyYWJfd2luZG93OyAgICAgICAgICAgIC8qKjwgU2luY2UgWEkgMi4yICovCit9IHhYSTJfMkFsbG93RXZlbnRzUmVxOworI2RlZmluZSBzel94WEkyXzJBbGxvd0V2ZW50c1JlcSAgICAgICAgICAgICAgICAyMAorCisKKy8qKgorICogUGFzc2l2ZWx5IGdyYWIgdGhlIGRldmljZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcVR5cGU7CisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJUGFzc2l2ZUdyYWJEZXZpY2UgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICBUaW1lICAgICAgICB0aW1lOworICAgIFdpbmRvdyAgICAgIGdyYWJfd2luZG93OworICAgIEN1cnNvciAgICAgIGN1cnNvcjsKKyAgICB1aW50MzJfdCAgICBkZXRhaWw7CisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDE2X3QgICAgbnVtX21vZGlmaWVyczsKKyAgICB1aW50MTZfdCAgICBtYXNrX2xlbjsKKyAgICB1aW50OF90ICAgICBncmFiX3R5cGU7CisgICAgdWludDhfdCAgICAgZ3JhYl9tb2RlOworICAgIHVpbnQ4X3QgICAgIHBhaXJlZF9kZXZpY2VfbW9kZTsKKyAgICB1aW50OF90ICAgICBvd25lcl9ldmVudHM7CisgICAgdWludDE2X3QgICAgcGFkMTsKK30geFhJUGFzc2l2ZUdyYWJEZXZpY2VSZXE7CisjZGVmaW5lIHN6X3hYSVBhc3NpdmVHcmFiRGV2aWNlUmVxICAgICAgICAgICAgICAzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCBleHRlbnNpb24gbWFqb3Igb3Bjb2RlICovCisgICAgdWludDhfdCAgICAgUmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJUGFzc2l2ZUdyYWJEZXZpY2UgKi8KKyAgICB1aW50MTZfdCAgICBzZXF1ZW5jZU51bWJlcjsKKyAgICB1aW50MzJfdCAgICBsZW5ndGg7CisgICAgdWludDE2X3QgICAgbnVtX21vZGlmaWVyczsKKyAgICB1aW50MTZfdCAgICBwYWQxOworICAgIHVpbnQzMl90ICAgIHBhZDI7CisgICAgdWludDMyX3QgICAgcGFkMzsKKyAgICB1aW50MzJfdCAgICBwYWQ0OworICAgIHVpbnQzMl90ICAgIHBhZDU7CisgICAgdWludDMyX3QgICAgcGFkNjsKK30geFhJUGFzc2l2ZUdyYWJEZXZpY2VSZXBseTsKKyNkZWZpbmUgc3pfeFhJUGFzc2l2ZUdyYWJEZXZpY2VSZXBseSAgICAgICAgICAgIDMyCisKKy8qKgorICogRGVsZXRlIGEgcGFzc2l2ZSBncmFiIGZvciB0aGUgZ2l2ZW4gZGV2aWNlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsKKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElQYXNzaXZlVW5ncmFiRGV2aWNlICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgV2luZG93ICAgICAgZ3JhYl93aW5kb3c7CisgICAgdWludDMyX3QgICAgZGV0YWlsOworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIHVpbnQxNl90ICAgIG51bV9tb2RpZmllcnM7CisgICAgdWludDhfdCAgICAgZ3JhYl90eXBlOworICAgIHVpbnQ4X3QgICAgIHBhZDA7CisgICAgdWludDE2X3QgICAgcGFkMTsKK30geFhJUGFzc2l2ZVVuZ3JhYkRldmljZVJlcTsKKyNkZWZpbmUgc3pfeFhJUGFzc2l2ZVVuZ3JhYkRldmljZVJlcSAgICAgICAgICAgIDIwCisKKy8qKgorICogTGlzdCBhbGwgZGV2aWNlIHByb3BlcnRpZXMgb24gdGhlIHNwZWNpZmllZCBkZXZpY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSUxpc3RQcm9wZXJ0aWVzICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDE2X3QgICAgcGFkOworfSB4WElMaXN0UHJvcGVydGllc1JlcTsKKyNkZWZpbmUgc3pfeFhJTGlzdFByb3BlcnRpZXNSZXEgICAgICAgICAgICAgICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcFR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgSW5wdXQgZXh0ZW5zaW9uIG1ham9yIG9wY29kZSAqLworICAgIHVpbnQ4X3QgICAgIFJlcFR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSUxpc3RQcm9wZXJ0aWVzICovCisgICAgdWludDE2X3QgICAgc2VxdWVuY2VOdW1iZXI7CisgICAgdWludDMyX3QgICAgbGVuZ3RoOworICAgIHVpbnQxNl90ICAgIG51bV9wcm9wZXJ0aWVzOworICAgIHVpbnQxNl90ICAgIHBhZDA7CisgICAgdWludDMyX3QgICAgcGFkMTsKKyAgICB1aW50MzJfdCAgICBwYWQyOworICAgIHVpbnQzMl90ICAgIHBhZDM7CisgICAgdWludDMyX3QgICAgcGFkNDsKKyAgICB1aW50MzJfdCAgICBwYWQ1OworfSB4WElMaXN0UHJvcGVydGllc1JlcGx5OworI2RlZmluZSBzel94WElMaXN0UHJvcGVydGllc1JlcGx5ICAgICAgICAgICAgICAgMzIKKworLyoqCisgKiBDaGFuZ2UgYSBwcm9wZXJ0eSBvbiB0aGUgc3BlY2lmaWVkIGRldmljZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcVR5cGU7CisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJQ2hhbmdlUHJvcGVydHkgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50OF90ICAgICBtb2RlOworICAgIHVpbnQ4X3QgICAgIGZvcm1hdDsKKyAgICBBdG9tICAgICAgICBwcm9wZXJ0eTsKKyAgICBBdG9tICAgICAgICB0eXBlOworICAgIHVpbnQzMl90ICAgIG51bV9pdGVtczsKK30geFhJQ2hhbmdlUHJvcGVydHlSZXE7CisjZGVmaW5lIHN6X3hYSUNoYW5nZVByb3BlcnR5UmVxICAgICAgICAgICAgICAgICAyMAorCisvKioKKyAqIERlbGV0ZSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsKKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyBYX1hJRGVsZXRlUHJvcGVydHkgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50MTZfdCAgICBwYWQwOworICAgIEF0b20gICAgICAgIHByb3BlcnR5OworfSB4WElEZWxldGVQcm9wZXJ0eVJlcTsKKyNkZWZpbmUgc3pfeFhJRGVsZXRlUHJvcGVydHlSZXEgICAgICAgICAgICAgICAgIDEyCisKKy8qKgorICogUXVlcnkgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSdzIHZhbHVlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcVR5cGU7CisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgWF9YSUdldFByb3BlcnR5ICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIHVpbnQ4X3QgICAgIGNfZGVsZXRlOworI2Vsc2UKKyAgICB1aW50OF90ICAgICBkZWxldGU7CisjZW5kaWYKKyAgICB1aW50OF90ICAgICBwYWQwOworICAgIEF0b20gICAgICAgIHByb3BlcnR5OworICAgIEF0b20gICAgICAgIHR5cGU7CisgICAgdWludDMyX3QgICAgb2Zmc2V0OworICAgIHVpbnQzMl90ICAgIGxlbjsKK30geFhJR2V0UHJvcGVydHlSZXE7CisjZGVmaW5lIHN6X3hYSUdldFByb3BlcnR5UmVxICAgICAgICAgICAgICAgICAgICAyNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCBleHRlbnNpb24gbWFqb3Igb3Bjb2RlICovCisgICAgdWludDhfdCAgICAgUmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgWF9YSUdldFByb3BlcnR5ICovCisgICAgdWludDE2X3QgICAgc2VxdWVuY2VOdW1iZXI7CisgICAgdWludDMyX3QgICAgbGVuZ3RoOworICAgIEF0b20gICAgICAgIHR5cGU7CisgICAgdWludDMyX3QgICAgYnl0ZXNfYWZ0ZXI7CisgICAgdWludDMyX3QgICAgbnVtX2l0ZW1zOworICAgIHVpbnQ4X3QgICAgIGZvcm1hdDsKKyAgICB1aW50OF90ICAgICBwYWQwOworICAgIHVpbnQxNl90ICAgIHBhZDE7CisgICAgdWludDMyX3QgICAgcGFkMjsKKyAgICB1aW50MzJfdCAgICBwYWQzOworfSB4WElHZXRQcm9wZXJ0eVJlcGx5OworI2RlZmluZSBzel94WElHZXRQcm9wZXJ0eVJlcGx5ICAgICAgICAgICAgICAgMzIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZFTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEdlbmVyaWMgWEkyIGV2ZW50IGhlYWRlci4gQWxsIFhJMiBldmVudHMgdXNlIHRoZSBzYW1lIGhlYWRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICAgICB0eXBlOworICAgIHVpbnQ4X3QgICAgIGV4dGVuc2lvbjsgICAgICAgICAgICAgIC8qKjwgWEkgZXh0ZW5zaW9uIG9mZnNldCAqLworICAgIHVpbnQxNl90ICAgIHNlcXVlbmNlTnVtYmVyOworICAgIHVpbnQzMl90ICAgIGxlbmd0aDsKKyAgICB1aW50MTZfdCAgICBldnR5cGU7CisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgVGltZSAgICAgICAgdGltZTsKK30geFhJR2VuZXJpY0RldmljZUV2ZW50OworCisvKioKKyAqIERldmljZSBoaWVyYXJjaHkgaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDE2X3QgICAgYXR0YWNobWVudDsgICAgICAgICAgICAgLyoqPCBJRCBvZiBtYXN0ZXIgb3IgcGFpcmVkIGRldmljZSAqLworICAgIHVpbnQ4X3QgICAgIHVzZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgOjpYSU1hc3RlcktleWJvYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpYSU1hc3RlclBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OlhJU2xhdmVLZXlib2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6WElTbGF2ZVBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OlhJRmxvYXRpbmdTbGF2ZSAqLworICAgIEJPT0wgICAgICAgIGVuYWJsZWQ7ICAgICAgICAgICAgICAgIC8qKjwgVFJVRSBpZiB0aGUgZGV2aWNlIGlzIGVuYWJsZWQgKi8KKyAgICB1aW50MTZfdCAgICBwYWQ7CisgICAgdWludDMyX3QgICAgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCA6OlhJTWFzdGVyQWRkZWQsIDo6WElNYXN0ZXJSZW1vdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpYSVNsYXZlQXR0YWNoZWQsIDo6WElTbGF2ZURldGFjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpYSVNsYXZlQWRkZWQsIDo6WElTbGF2ZVJlbW92ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OlhJRGV2aWNlRW5hYmxlZCwgOjpYSURldmljZURpc2FibGVkICovCit9IHhYSUhpZXJhcmNoeUluZm87CisKKy8qKgorICogVGhlIGRldmljZSBoaWVyYXJjaHkgaGFzIGJlZW4gbW9kaWZpZWQuIFRoaXMgZXZlbnQgaW5jbHVkZXMgdGhlIGRldmljZQorICogaGllcmFyY2h5IGFmdGVyIHRoZSBtb2RpZmljYXRpb24gaGFzIGJlZW4gYXBwbGllZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICAgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyBHZW5lcmljRXZlbnQgKi8KKyAgICB1aW50OF90ICAgICBleHRlbnNpb247ICAgICAgICAgICAgICAvKio8IFhJIGV4dGVuc2lvbiBvZmZzZXQgKi8KKyAgICB1aW50MTZfdCAgICBzZXF1ZW5jZU51bWJlcjsKKyAgICB1aW50MzJfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICB1aW50MTZfdCAgICBldnR5cGU7ICAgICAgICAgICAgICAgICAvKio8IDo6WElfSGllcmFyY2h5ICovCisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgVGltZSAgICAgICAgdGltZTsKKyAgICB1aW50MzJfdCAgICBmbGFnczsgICAgICAgICAgICAgICAgICAvKio8IDo6WElNYXN0ZXJBZGRlZCwgOjpYSU1hc3RlckRlbGV0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OlhJU2xhdmVBdHRhY2hlZCwgOjpYSVNsYXZlRGV0YWNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OlhJU2xhdmVBZGRlZCwgOjpYSVNsYXZlUmVtb3ZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6WElEZXZpY2VFbmFibGVkLCA6OlhJRGV2aWNlRGlzYWJsZWQgKi8KKyAgICB1aW50MTZfdCAgICBudW1faW5mbzsKKyAgICB1aW50MTZfdCAgICBwYWQwOworICAgIHVpbnQzMl90ICAgIHBhZDE7CisgICAgdWludDMyX3QgICAgcGFkMjsKK30geFhJSGllcmFyY2h5RXZlbnQ7CisKKy8qKgorICogQSBkZXZpY2UgaGFzIGNoYW5nZWQgY2FwYWJpbGl0aWVzLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQ4X3QgICAgIHR5cGU7ICAgICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIEdlbmVyaWNFdmVudCAqLworICAgIHVpbnQ4X3QgICAgIGV4dGVuc2lvbjsgICAgICAgICAgICAgIC8qKjwgWEkgZXh0ZW5zaW9uIG9mZnNldCAqLworICAgIHVpbnQxNl90ICAgIHNlcXVlbmNlTnVtYmVyOworICAgIHVpbnQzMl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIHVpbnQxNl90ICAgIGV2dHlwZTsgICAgICAgICAgICAgICAgIC8qKjwgWElfRGV2aWNlQ2hhbmdlZCAqLworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOyAgICAgICAgICAgICAgIC8qKjwgRGV2aWNlIHRoYXQgaGFzIGNoYW5nZWQgKi8KKyAgICBUaW1lICAgICAgICB0aW1lOworICAgIHVpbnQxNl90ICAgIG51bV9jbGFzc2VzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNsYXNzZXMgdGhhdCBoYXZlIGNoYW5nZWQgKi8KKyAgICB1aW50MTZfdCAgICBzb3VyY2VpZDsgICAgICAgICAgICAgICAvKio8IFNvdXJjZSBvZiB0aGUgbmV3IGNsYXNzZXMgKi8KKyAgICB1aW50OF90ICAgICByZWFzb247ICAgICAgICAgICAgICAgICAvKio8IDo6WElTbGF2ZVN3aXRjaCwgOjpYSURldmljZUNoYW5nZSAqLworICAgIHVpbnQ4X3QgICAgIHBhZDA7CisgICAgdWludDE2X3QgICAgcGFkMTsKKyAgICB1aW50MzJfdCAgICBwYWQyOworICAgIHVpbnQzMl90ICAgIHBhZDM7Cit9IHhYSURldmljZUNoYW5nZWRFdmVudDsKKworLyoqCisgKiBUaGUgb3duZXIgb2YgYSB0b3VjaCBzdHJlYW0gaGFzIHBhc3NlZCBvbiBvd25lcnNoaXAgdG8gYW5vdGhlciBjbGllbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCAgICAgdHlwZTsgICAgICAgICAgICAgICAvKio8IEFsd2F5cyBHZW5lcmljRXZlbnQgKi8KKyAgICB1aW50OF90ICAgICBleHRlbnNpb247ICAgICAgICAgIC8qKjwgWEkgZXh0ZW5zaW9uIG9mZnNldCAqLworICAgIHVpbnQxNl90ICAgIHNlcXVlbmNlTnVtYmVyOworICAgIHVpbnQzMl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDE2X3QgICAgZXZ0eXBlOyAgICAgICAgICAgICAvKio8IFhJX1RvdWNoT3duZXJzaGlwICovCisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7ICAgICAgICAgICAvKio8IERldmljZSB0aGF0IGhhcyBjaGFuZ2VkICovCisgICAgVGltZSAgICAgICAgdGltZTsKKyAgICB1aW50MzJfdCAgICB0b3VjaGlkOworICAgIFdpbmRvdyAgICAgIHJvb3Q7CisgICAgV2luZG93ICAgICAgZXZlbnQ7CisgICAgV2luZG93ICAgICAgY2hpbGQ7CisvKiDilJTilIDilIDilIDilIDilIDilIDilIDilIAgMzIgYnl0ZSBib3VuZGFyeSDilIDilIDilIDilIDilIDilIDilIDilIDilJggKi8KKyAgICB1aW50MTZfdCAgICBzb3VyY2VpZDsKKyAgICB1aW50MTZfdCAgICBwYWQwOworICAgIHVpbnQzMl90ICAgIGZsYWdzOworICAgIHVpbnQzMl90ICAgIHBhZDE7CisgICAgdWludDMyX3QgICAgcGFkMjsKK30geFhJVG91Y2hPd25lcnNoaXBFdmVudDsKKworLyoqCisgKiBEZWZhdWx0IGlucHV0IGV2ZW50IGZvciBwb2ludGVyLCBrZXlib2FyZCBvciB0b3VjaCBpbnB1dC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICAgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyBHZW5lcmljRXZlbnQgKi8KKyAgICB1aW50OF90ICAgICBleHRlbnNpb247ICAgICAgICAgICAgICAvKio8IFhJIGV4dGVuc2lvbiBvZmZzZXQgKi8KKyAgICB1aW50MTZfdCAgICBzZXF1ZW5jZU51bWJlcjsKKyAgICB1aW50MzJfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdWludHMgKi8KKyAgICB1aW50MTZfdCAgICBldnR5cGU7CisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgVGltZSAgICAgICAgdGltZTsKKyAgICB1aW50MzJfdCAgICBkZXRhaWw7ICAgICAgICAgICAgICAgICAvKio8IEtleWNvZGUgb3IgYnV0dG9uICovCisgICAgV2luZG93ICAgICAgcm9vdDsKKyAgICBXaW5kb3cgICAgICBldmVudDsKKyAgICBXaW5kb3cgICAgICBjaGlsZDsKKy8qIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAzMiBieXRlIGJvdW5kYXJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAqLworICAgIEZQMTYxNiAgICAgIHJvb3RfeDsgICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIHNjcmVlbiBjb29yZHMsIDE2LjE2IGZpeGVkIHBvaW50ICovCisgICAgRlAxNjE2ICAgICAgcm9vdF95OworICAgIEZQMTYxNiAgICAgIGV2ZW50X3g7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIHNjcmVlbiBjb29yZHMsIDE2LjE2IGZpeGVkIHBvaW50ICovCisgICAgRlAxNjE2ICAgICAgZXZlbnRfeTsKKyAgICB1aW50MTZfdCAgICBidXR0b25zX2xlbjsgICAgICAgICAgICAvKio8IExlbiBvZiBidXR0b24gZmxhZ3MgaW4gNCBiIHVuaXRzICovCisgICAgdWludDE2X3QgICAgdmFsdWF0b3JzX2xlbjsgICAgICAgICAgLyoqPCBMZW4gb2YgdmFsLiBmbGFncyBpbiA0IGIgdW5pdHMgKi8KKyAgICB1aW50MTZfdCAgICBzb3VyY2VpZDsgICAgICAgICAgICAgICAvKio8IFRoZSBzb3VyY2UgZGV2aWNlICovCisgICAgdWludDE2X3QgICAgcGFkMDsKKyAgICB1aW50MzJfdCAgICBmbGFnczsgICAgICAgICAgICAgICAgICAvKio8IDo6WElLZXlSZXBlYXQgKi8KKyAgICB4WElNb2RpZmllckluZm8gICAgIG1vZHM7CisgICAgeFhJR3JvdXBJbmZvICAgICAgICBncm91cDsKK30geFhJRGV2aWNlRXZlbnQ7CisKKworLyoqCisgKiBTZW50IHdoZW4gYW4gaW5wdXQgZXZlbnQgaXMgZ2VuZXJhdGVkLiBSYXdFdmVudHMgaW5jbHVkZSB2YWx1YXRvcgorICogaW5mb3JtYXRpb24gaW4gYm90aCBkZXZpY2Utc3BlY2lmaWMgZGF0YSAoaS5lLiB1bmFjY2VsZXJhdGVkKSBhbmQKKyAqIHByb2Nlc3NlZCBkYXRhIChpLmUuIGFjY2VsZXJhdGVkLCBpZiBhcHBsaWNhYmxlKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICAgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyBHZW5lcmljRXZlbnQgKi8KKyAgICB1aW50OF90ICAgICBleHRlbnNpb247ICAgICAgICAgICAgICAvKio8IFhJIGV4dGVuc2lvbiBvZmZzZXQgKi8KKyAgICB1aW50MTZfdCAgICBzZXF1ZW5jZU51bWJlcjsKKyAgICB1aW50MzJfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdWludHMgKi8KKyAgICB1aW50MTZfdCAgICBldnR5cGU7ICAgICAgICAgICAgICAgICAvKio8IDo6WElfUmF3RXZlbnQgKi8KKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICBUaW1lICAgICAgICB0aW1lOworICAgIHVpbnQzMl90ICAgIGRldGFpbDsKKyAgICB1aW50MTZfdCAgICBzb3VyY2VpZDsgICAgICAgICAgICAgICAvKio8IFRoZSBzb3VyY2UgZGV2aWNlIChYSSAyLjEpICovCisgICAgdWludDE2X3QgICAgdmFsdWF0b3JzX2xlbjsgICAgICAgICAgLyoqPCBMZW5ndGggb2YgdHJhaWxpbmcgdmFsdWF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDMyX3QgICAgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCA6OlhJS2V5UmVwZWF0ICovCisgICAgdWludDMyX3QgICAgcGFkMjsKK30geFhJUmF3RXZlbnQ7CisKKy8qKgorICogTm90ZSB0aGF0IHRoZSBsYXlvdXQgb2Ygcm9vdCwgZXZlbnQsIGNoaWxkLCByb290X3gsIHJvb3RfeSwgZXZlbnRfeCwKKyAqIGV2ZW50X3kgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIHhYSURldmljZUV2ZW50LgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQ4X3QgICAgIHR5cGU7ICAgICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIEdlbmVyaWNFdmVudCAqLworICAgIHVpbnQ4X3QgICAgIGV4dGVuc2lvbjsgICAgICAgICAgICAgIC8qKjwgWEkgZXh0ZW5zaW9uIG9mZnNldCAqLworICAgIHVpbnQxNl90ICAgIHNlcXVlbmNlTnVtYmVyOworICAgIHVpbnQzMl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1aW50cyAqLworICAgIHVpbnQxNl90ICAgIGV2dHlwZTsgICAgICAgICAgICAgICAgIC8qKjwgOjpYSV9FbnRlciAqLworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIFRpbWUgICAgICAgIHRpbWU7CisgICAgdWludDE2X3QgICAgc291cmNlaWQ7CisgICAgdWludDhfdCAgICAgbW9kZTsKKyAgICB1aW50OF90ICAgICBkZXRhaWw7CisgICAgV2luZG93ICAgICAgcm9vdDsKKyAgICBXaW5kb3cgICAgICBldmVudDsKKyAgICBXaW5kb3cgICAgICBjaGlsZDsKKy8qIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAzMiBieXRlIGJvdW5kYXJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAqLworICAgIEZQMTYxNiAgICAgIHJvb3RfeDsKKyAgICBGUDE2MTYgICAgICByb290X3k7CisgICAgRlAxNjE2ICAgICAgZXZlbnRfeDsKKyAgICBGUDE2MTYgICAgICBldmVudF95OworICAgIEJPT0wgICAgICAgIHNhbWVfc2NyZWVuOworICAgIEJPT0wgICAgICAgIGZvY3VzOworICAgIHVpbnQxNl90ICAgIGJ1dHRvbnNfbGVuOyAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHRyYWlsaW5nIGJ1dHRvbiBtYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICB4WElNb2RpZmllckluZm8gICAgIG1vZHM7CisgICAgeFhJR3JvdXBJbmZvICAgICAgICBncm91cDsKK30geFhJRW50ZXJFdmVudDsKKwordHlwZWRlZiB4WElFbnRlckV2ZW50IHhYSUxlYXZlRXZlbnQ7Cit0eXBlZGVmIHhYSUVudGVyRXZlbnQgeFhJRm9jdXNJbkV2ZW50OwordHlwZWRlZiB4WElFbnRlckV2ZW50IHhYSUZvY3VzT3V0RXZlbnQ7CisKKy8qKgorICogU2VudCB3aGVuIGEgZGV2aWNlIHByb3BlcnR5IGlzIGNyZWF0ZWQsIG1vZGlmaWVkIG9yIGRlbGV0ZWQuIERvZXMgbm90CisgKiBpbmNsdWRlIHByb3BlcnR5IGRhdGEsIHRoZSBjbGllbnQgaXMgcmVxdWlyZWQgdG8gcXVlcnkgdGhlIGRhdGEuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCAgICAgdHlwZTsgICAgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgR2VuZXJpY0V2ZW50ICovCisgICAgdWludDhfdCAgICAgZXh0ZW5zaW9uOyAgICAgICAgICAgICAgLyoqPCBYSSBleHRlbnNpb24gb2Zmc2V0ICovCisgICAgdWludDE2X3QgICAgc2VxdWVuY2VOdW1iZXI7CisgICAgdWludDMyX3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVpbnRzICovCisgICAgdWludDE2X3QgICAgZXZ0eXBlOyAgICAgICAgICAgICAgICAgLyoqPCA6OlhJX1Byb3BlcnR5RXZlbnQgKi8KKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICBUaW1lICAgICAgICB0aW1lOworICAgIEF0b20gICAgICAgIHByb3BlcnR5OworICAgIHVpbnQ4X3QgICAgIHdoYXQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgOjpYSVByb3BlcnR5RGVsZXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6WElQcm9wZXJ0eUNyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OlhJUHJvcGVydHlNb3RpZmllZCAqLworICAgIHVpbnQ4X3QgICAgIHBhZDA7CisgICAgdWludDE2X3QgICAgcGFkMTsKKyAgICB1aW50MzJfdCAgICBwYWQyOworICAgIHVpbnQzMl90ICAgIHBhZDM7Cit9IHhYSVByb3BlcnR5RXZlbnQ7CisKKworI3VuZGVmIFdpbmRvdworI3VuZGVmIFRpbWUKKyN1bmRlZiBBdG9tCisjdW5kZWYgQ3Vyc29yCisKKyNlbmRpZiAvKiBfWEkyUFJPVE9fSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWElucHV0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxN2YzODgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJbnB1dC5oCkBAIC0wLDAgKzEsMTI3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworQ29weXJpZ2h0IDE5ODkgYnkgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnksIFBhbG8gQWx0bywgQ2FsaWZvcm5pYS4KKworCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBIZXdsZXR0LVBhY2thcmQgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworSEVXTEVUVC1QQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorSEVXTEVUVC1QQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAorQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZpbml0aW9ucyB1c2VkIGJ5IHRoZSBsaWJyYXJ5IGFuZCBjbGllbnQgKi8KKworI2lmbmRlZiBfWElOUFVUX0hfCisjZGVmaW5lIF9YSU5QVVRfSF8KKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWEkuaD4KKworI2RlZmluZSBfZGV2aWNlS2V5UHJlc3MJCTAKKyNkZWZpbmUgX2RldmljZUtleVJlbGVhc2UJMQorCisjZGVmaW5lIF9kZXZpY2VCdXR0b25QcmVzcwkwCisjZGVmaW5lIF9kZXZpY2VCdXR0b25SZWxlYXNlCTEKKworI2RlZmluZSBfZGV2aWNlTW90aW9uTm90aWZ5CTAKKworI2RlZmluZSBfZGV2aWNlRm9jdXNJbgkJMAorI2RlZmluZSBfZGV2aWNlRm9jdXNPdXQJCTEKKworI2RlZmluZSBfcHJveGltaXR5SW4JCTAKKyNkZWZpbmUgX3Byb3hpbWl0eU91dAkJMQorCisjZGVmaW5lIF9kZXZpY2VTdGF0ZU5vdGlmeQkwCisjZGVmaW5lIF9kZXZpY2VNYXBwaW5nTm90aWZ5CTEKKyNkZWZpbmUgX2NoYW5nZURldmljZU5vdGlmeQkyCisvKiBTcGFjZSBvZiAzIGJldHdlZW4gaXMgbmVjZXNzYXJ5ISBSZXNlcnZlZCBmb3IgRGV2aWNlS2V5U3RhdGVOb3RpZnksCisgICBEZXZpY2VCdXR0b25TdGF0ZU5vdGlmeSwgRGV2aWNlUHJlc2VuY2VOb3RpZnkgKGVzc2VudGlhbGx5IHVudXNlZCkuIFRoaXMKKyAgIGNvZGUgaGFzIHRvIGJlIGluIHN5bmMgd2l0aCBGaXhFeHRlbnNpb25FdmVudHMoKSBpbiB4c2VydmVyL1hpL2V4dGluaXQuYyAqLworI2RlZmluZSBfcHJvcGVydHlOb3RpZnkJCTYKKworI2RlZmluZSBGaW5kVHlwZUFuZENsYXNzKGQsdHlwZSxfY2xhc3MsY2xhc3NpZCxvZmZzZXQpIFwKKyAgICB7IGludCBfaTsgWElucHV0Q2xhc3NJbmZvICpfaXA7IFwKKyAgICB0eXBlID0gMDsgX2NsYXNzID0gMDsgXAorICAgIGZvciAoX2k9MCwgX2lwPSAoKFhEZXZpY2UgKikgZCktPmNsYXNzZXM7IFwKKwkgX2k8ICgoWERldmljZSAqKSBkKS0+bnVtX2NsYXNzZXM7IFwKKwkgX2krKywgX2lwKyspIFwKKwlpZiAoX2lwLT5pbnB1dF9jbGFzcyA9PSBjbGFzc2lkKSBcCisJICAgIHt0eXBlID0gIF9pcC0+ZXZlbnRfdHlwZV9iYXNlICsgb2Zmc2V0OyBcCisJICAgICBfY2xhc3MgPSAgKChYRGV2aWNlICopIGQpLT5kZXZpY2VfaWQgPDwgOCB8IHR5cGU7fX0KKworI2RlZmluZSBEZXZpY2VLZXlQcmVzcyhkLHR5cGUsX2NsYXNzKSBcCisgICAgRmluZFR5cGVBbmRDbGFzcyhkLCB0eXBlLCBfY2xhc3MsIEtleUNsYXNzLCBfZGV2aWNlS2V5UHJlc3MpCisKKyNkZWZpbmUgRGV2aWNlS2V5UmVsZWFzZShkLHR5cGUsX2NsYXNzKSBcCisgICAgRmluZFR5cGVBbmRDbGFzcyhkLCB0eXBlLCBfY2xhc3MsIEtleUNsYXNzLCBfZGV2aWNlS2V5UmVsZWFzZSkKKworI2RlZmluZSBEZXZpY2VCdXR0b25QcmVzcyhkLHR5cGUsX2NsYXNzKSBcCisgICAgRmluZFR5cGVBbmRDbGFzcyhkLCB0eXBlLCBfY2xhc3MsIEJ1dHRvbkNsYXNzLCBfZGV2aWNlQnV0dG9uUHJlc3MpCisKKyNkZWZpbmUgRGV2aWNlQnV0dG9uUmVsZWFzZShkLHR5cGUsX2NsYXNzKSBcCisgICAgRmluZFR5cGVBbmRDbGFzcyhkLCB0eXBlLCBfY2xhc3MsIEJ1dHRvbkNsYXNzLCBfZGV2aWNlQnV0dG9uUmVsZWFzZSkKKworI2RlZmluZSBEZXZpY2VNb3Rpb25Ob3RpZnkoZCx0eXBlLF9jbGFzcykgXAorICAgIEZpbmRUeXBlQW5kQ2xhc3MoZCwgdHlwZSwgX2NsYXNzLCBWYWx1YXRvckNsYXNzLCBfZGV2aWNlTW90aW9uTm90aWZ5KQorCisjZGVmaW5lIERldmljZUZvY3VzSW4oZCx0eXBlLF9jbGFzcykgXAorICAgIEZpbmRUeXBlQW5kQ2xhc3MoZCwgdHlwZSwgX2NsYXNzLCBGb2N1c0NsYXNzLCBfZGV2aWNlRm9jdXNJbikKKworI2RlZmluZSBEZXZpY2VGb2N1c091dChkLHR5cGUsX2NsYXNzKSBcCisgICAgRmluZFR5cGVBbmRDbGFzcyhkLCB0eXBlLCBfY2xhc3MsIEZvY3VzQ2xhc3MsIF9kZXZpY2VGb2N1c091dCkKKworI2RlZmluZSBQcm94aW1pdHlJbihkLHR5cGUsX2NsYXNzKSBcCisgICAgRmluZFR5cGVBbmRDbGFzcyhkLCB0eXBlLCBfY2xhc3MsIFByb3hpbWl0eUNsYXNzLCBfcHJveGltaXR5SW4pCisKKyNkZWZpbmUgUHJveGltaXR5T3V0KGQsdHlwZSxfY2xhc3MpIFwKKyAgICBGaW5kVHlwZUFuZENsYXNzKGQsIHR5cGUsIF9jbGFzcywgUHJveGltaXR5Q2xhc3MsIF9wcm94aW1pdHlPdXQpCisKKyNkZWZpbmUgRGV2aWNlU3RhdGVOb3RpZnkoZCx0eXBlLF9jbGFzcykgXAorICAgIEZpbmRUeXBlQW5kQ2xhc3MoZCwgdHlwZSwgX2NsYXNzLCBPdGhlckNsYXNzLCBfZGV2aWNlU3RhdGVOb3RpZnkpCisKKyNkZWZpbmUgRGV2aWNlTWFwcGluZ05vdGlmeShkLHR5cGUsX2NsYXNzKSBcCisgICAgRmluZFR5cGVBbmRDbGFzcyhkLCB0eXBlLCBfY2xhc3MsIE90aGVyQ2xhc3MsIF9kZXZpY2VNYXBwaW5nTm90aWZ5KQorCisjZGVmaW5lIENoYW5nZURldmljZU5vdGlmeShkLHR5cGUsX2NsYXNzKSBcCisgICAgRmluZFR5cGVBbmRDbGFzcyhkLCB0eXBlLCBfY2xhc3MsIE90aGVyQ2xhc3MsIF9jaGFuZ2VEZXZpY2VOb3RpZnkpCisKKyNkZWZpbmUgRGV2aWNlUHJvcGVydHlOb3RpZnkoZCwgdHlwZSwgX2NsYXNzKSBcCisgICAgRmluZFR5cGVBbmRDbGFzcyhkLCB0eXBlLCBfY2xhc3MsIE90aGVyQ2xhc3MsIF9wcm9wZXJ0eU5vdGlmeSkKKworI2RlZmluZSBEZXZpY2VQb2ludGVyTW90aW9uSGludChkLHR5cGUsX2NsYXNzKSBcCisgICAgeyBfY2xhc3MgPSAgKChYRGV2aWNlICopIGQpLT5kZXZpY2VfaWQgPDwgOCB8IF9kZXZpY2VQb2ludGVyTW90aW9uSGludDt9CisKKyNkZWZpbmUgRGV2aWNlQnV0dG9uMU1vdGlvbihkLHR5cGUsX2NsYXNzKSBcCisgICAgeyBfY2xhc3MgPSAgKChYRGV2aWNlICopIGQpLT5kZXZpY2VfaWQgPDwgOCB8IF9kZXZpY2VCdXR0b24xTW90aW9uO30KKworI2RlZmluZSBEZXZpY2VCdXR0b24yTW90aW9uKGQsdHlwZSxfY2xhc3MpIFwKKyAgICB7IF9jbGFzcyA9ICAoKFhEZXZpY2UgKikgZCktPmRldmljZV9pZCA8PCA4IHwgX2RldmljZUJ1dHRvbjJNb3Rpb247fQorCisjZGVmaW5lIERldmljZUJ1dHRvbjNNb3Rpb24oZCx0eXBlLF9jbGFzcykgXAorICAgIHsgX2NsYXNzID0gICgoWERldmljZSAqKSBkKS0+ZGV2aWNlX2lkIDw8IDggfCBfZGV2aWNlQnV0dG9uM01vdGlvbjt9CisKKyNkZWZpbmUgRGV2aWNlQnV0dG9uNE1vdGlvbihkLHR5cGUsIF9jbGFzcykgXAorICAgIHsgX2NsYXNzID0gICgoWERldmljZSAqKSBkKS0+ZGV2aWNlX2lkIDw8IDggfCBfZGV2aWNlQnV0dG9uNE1vdGlvbjt9CisKKyNkZWZpbmUgRGV2aWNlQnV0dG9uNU1vdGlvbihkLHR5cGUsX2NsYXNzKSBcCisgICAgeyBfY2xhc3MgPSAgKChYRGV2aWNlICopIGQpLT5kZXZpY2VfaWQgPDwgOCB8IF9kZXZpY2VCdXR0b241TW90aW9uO30KKworI2RlZmluZSBEZXZpY2VCdXR0b25Nb3Rpb24oZCx0eXBlLCBfY2xhc3MpIFwKKyAgICB7IF9jbGFzcyA9ICAoKFhEZXZpY2UgKikgZCktPmRldmljZV9pZCA8PCA4IHwgX2RldmljZUJ1dHRvbk1vdGlvbjt9CisKKyNkZWZpbmUgRGV2aWNlT3duZXJHcmFiQnV0dG9uKGQsdHlwZSxfY2xhc3MpIFwKKyAgICB7IF9jbGFzcyA9ICAoKFhEZXZpY2UgKikgZCktPmRldmljZV9pZCA8PCA4IHwgX2RldmljZU93bmVyR3JhYkJ1dHRvbjt9CisKKyNkZWZpbmUgRGV2aWNlQnV0dG9uUHJlc3NHcmFiKGQsdHlwZSxfY2xhc3MpIFwKKyAgICB7IF9jbGFzcyA9ICAoKFhEZXZpY2UgKikgZCktPmRldmljZV9pZCA8PCA4IHwgX2RldmljZUJ1dHRvbkdyYWI7fQorCisjZGVmaW5lIE5vRXh0ZW5zaW9uRXZlbnQoZCx0eXBlLF9jbGFzcykgXAorICAgIHsgX2NsYXNzID0gICgoWERldmljZSAqKSBkKS0+ZGV2aWNlX2lkIDw8IDggfCBfbm9FeHRlbnNpb25FdmVudDt9CisKKworLyogV2UgbmVlZCB0aGUgZGVjbGFyYXRpb24gZm9yIERldmljZVByZXNlbmNlLiAqLworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisgICAgZXh0ZXJuIGludCBfWGlHZXREZXZpY2VQcmVzZW5jZU5vdGlmeUV2ZW50KERpc3BsYXkgKik7CisgICAgZXh0ZXJuIHZvaWQgX3hpYmFkZGV2aWNlKCBEaXNwbGF5ICpkcHksIGludCAqZXJyb3IpOworICAgIGV4dGVybiB2b2lkIF94aWJhZGNsYXNzKCBEaXNwbGF5ICpkcHksIGludCAqZXJyb3IpOworICAgIGV4dGVybiB2b2lkIF94aWJhZGV2ZW50KCBEaXNwbGF5ICpkcHksIGludCAqZXJyb3IpOworICAgIGV4dGVybiB2b2lkIF94aWJhZG1vZGUoIERpc3BsYXkgKmRweSwgaW50ICplcnJvcik7CisgICAgZXh0ZXJuIHZvaWQgX3hpZGV2aWNlYnVzeSggRGlzcGxheSAqZHB5LCBpbnQgKmVycm9yKTsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2RlZmluZSBEZXZpY2VQcmVzZW5jZShkcHksIHR5cGUsIF9jbGFzcykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHR5cGUgPSBfWGlHZXREZXZpY2VQcmVzZW5jZU5vdGlmeUV2ZW50KGRweSk7ICAgICAgICAgICAgXAorICAgICAgICBfY2xhc3MgPSAgKDB4MTAwMDAgfCBfZGV2aWNlUHJlc2VuY2UpOyAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8qIEVycm9ycyAqLworI2RlZmluZSBCYWREZXZpY2UoZHB5LGVycm9yKSBfeGliYWRkZXZpY2UoZHB5LCAmZXJyb3IpCisKKyNkZWZpbmUgQmFkQ2xhc3MoZHB5LGVycm9yKSBfeGliYWRjbGFzcyhkcHksICZlcnJvcikKKworI2RlZmluZSBCYWRFdmVudChkcHksZXJyb3IpIF94aWJhZGV2ZW50KGRweSwgJmVycm9yKQorCisjZGVmaW5lIEJhZE1vZGUoZHB5LGVycm9yKSBfeGliYWRtb2RlKGRweSwgJmVycm9yKQorCisjZGVmaW5lIERldmljZUJ1c3koZHB5LGVycm9yKSBfeGlkZXZpY2VidXN5KGRweSwgJmVycm9yKQorCit0eXBlZGVmIHN0cnVjdCBfWEFueUNsYXNzaW5mbyAqWEFueUNsYXNzUHRyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlS2V5IGV2ZW50cy4gIFRoZXNlIGV2ZW50cyBhcmUgc2VudCBieSBpbnB1dCBkZXZpY2VzIHRoYXQKKyAqIHN1cHBvcnQgaW5wdXQgY2xhc3MgS2V5cy4KKyAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgWCBwb2ludGVyIGlzIHJlcG9ydGVkIGluIHRoZSBjb29yZGluYXRlCisgKiBmaWVsZHMgb2YgdGhlIHgseSBhbmQgeF9yb290LHlfcm9vdCBmaWVsZHMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IAorICAgIHsKKyAgICBpbnQgICAgICAgICAgICB0eXBlOyAgICAgICAgIC8qIG9mIGV2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyAgc2VyaWFsOyAgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgKi8KKyAgICBCb29sICAgICAgICAgICBzZW5kX2V2ZW50OyAgIC8qIHRydWUgaWYgZnJvbSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFdpbmRvdyAgICAgICAgIHdpbmRvdzsgICAgICAgLyogImV2ZW50IiB3aW5kb3cgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gKi8KKyAgICBYSUQgICAgICAgICAgICBkZXZpY2VpZDsKKyAgICBXaW5kb3cgICAgICAgICByb290OyAgICAgICAgIC8qIHJvb3Qgd2luZG93IGV2ZW50IG9jY3VyZWQgb24gKi8KKyAgICBXaW5kb3cgICAgICAgICBzdWJ3aW5kb3c7ICAgIC8qIGNoaWxkIHdpbmRvdyAqLworICAgIFRpbWUgICAgICAgICAgIHRpbWU7ICAgICAgICAgLyogbWlsbGlzZWNvbmRzICovCisgICAgaW50ICAgICAgICAgICAgeCwgeTsgICAgICAgICAvKiB4LCB5IGNvb3JkaW5hdGVzIGluIGV2ZW50IHdpbmRvdyAqLworICAgIGludCAgICAgICAgICAgIHhfcm9vdDsgICAgICAgLyogY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gcm9vdCAqLworICAgIGludCAgICAgICAgICAgIHlfcm9vdDsgICAgICAgLyogY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gcm9vdCAqLworICAgIHVuc2lnbmVkIGludCAgIHN0YXRlOyAgICAgICAgLyoga2V5IG9yIGJ1dHRvbiBtYXNrICovCisgICAgdW5zaWduZWQgaW50ICAga2V5Y29kZTsgICAgICAvKiBkZXRhaWwgKi8KKyAgICBCb29sICAgICAgICAgICBzYW1lX3NjcmVlbjsgIC8qIHNhbWUgc2NyZWVuIGZsYWcgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBkZXZpY2Vfc3RhdGU7IC8qIGRldmljZSBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KKyAgICB1bnNpZ25lZCBjaGFyICBheGVzX2NvdW50OworICAgIHVuc2lnbmVkIGNoYXIgIGZpcnN0X2F4aXM7CisgICAgaW50ICAgICAgICAgICAgYXhpc19kYXRhWzZdOworICAgIH0gWERldmljZUtleUV2ZW50OworCit0eXBlZGVmIFhEZXZpY2VLZXlFdmVudCBYRGV2aWNlS2V5UHJlc3NlZEV2ZW50OwordHlwZWRlZiBYRGV2aWNlS2V5RXZlbnQgWERldmljZUtleVJlbGVhc2VkRXZlbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlQnV0dG9uIGV2ZW50cy4gIFRoZXNlIGV2ZW50cyBhcmUgc2VudCBieSBleHRlbnNpb24gZGV2aWNlcworICogdGhhdCBzdXBwb3J0IGlucHV0IGNsYXNzIEJ1dHRvbnMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7ICAgICAgICAgLyogb2YgZXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgV2luZG93ICAgICAgICB3aW5kb3c7ICAgICAgIC8qICJldmVudCIgd2luZG93IHJlcG9ydGVkIHJlbGF0aXZlIHRvICovCisgICAgWElEICAgICAgICAgICBkZXZpY2VpZDsKKyAgICBXaW5kb3cgICAgICAgIHJvb3Q7ICAgICAgICAgLyogcm9vdCB3aW5kb3cgdGhhdCB0aGUgZXZlbnQgb2NjdXJlZCBvbiAqLworICAgIFdpbmRvdyAgICAgICAgc3Vid2luZG93OyAgICAvKiBjaGlsZCB3aW5kb3cgKi8KKyAgICBUaW1lICAgICAgICAgIHRpbWU7ICAgICAgICAgLyogbWlsbGlzZWNvbmRzICovCisgICAgaW50ICAgICAgICAgICB4LCB5OyAgICAgICAgIC8qIHgsIHkgY29vcmRpbmF0ZXMgaW4gZXZlbnQgd2luZG93ICovCisgICAgaW50ICAgICAgICAgICB4X3Jvb3Q7ICAgICAgIC8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KKyAgICBpbnQgICAgICAgICAgIHlfcm9vdDsgICAgICAgLyogY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gcm9vdCAqLworICAgIHVuc2lnbmVkIGludCAgc3RhdGU7ICAgICAgICAvKiBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KKyAgICB1bnNpZ25lZCBpbnQgIGJ1dHRvbjsgICAgICAgLyogZGV0YWlsICovCisgICAgQm9vbCAgICAgICAgICBzYW1lX3NjcmVlbjsgIC8qIHNhbWUgc2NyZWVuIGZsYWcgKi8KKyAgICB1bnNpZ25lZCBpbnQgIGRldmljZV9zdGF0ZTsgLyogZGV2aWNlIGtleSBvciBidXR0b24gbWFzayAqLworICAgIHVuc2lnbmVkIGNoYXIgYXhlc19jb3VudDsKKyAgICB1bnNpZ25lZCBjaGFyIGZpcnN0X2F4aXM7CisgICAgaW50ICAgICAgICAgICBheGlzX2RhdGFbNl07CisgICAgfSBYRGV2aWNlQnV0dG9uRXZlbnQ7CisKK3R5cGVkZWYgWERldmljZUJ1dHRvbkV2ZW50IFhEZXZpY2VCdXR0b25QcmVzc2VkRXZlbnQ7Cit0eXBlZGVmIFhEZXZpY2VCdXR0b25FdmVudCBYRGV2aWNlQnV0dG9uUmVsZWFzZWRFdmVudDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2VNb3Rpb25Ob3RpZnkgZXZlbnQuICBUaGVzZSBldmVudHMgYXJlIHNlbnQgYnkgZXh0ZW5zaW9uIGRldmljZXMKKyAqIHRoYXQgc3VwcG9ydCBpbnB1dCBjbGFzcyBWYWx1YXRvcnMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IAorICAgIHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7ICAgICAgICAvKiBvZiBldmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAvKiB0cnVlIGlmIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgICAgICAgIHdpbmRvdzsgICAgICAvKiAiZXZlbnQiIHdpbmRvdyByZXBvcnRlZCByZWxhdGl2ZSB0byAqLworICAgIFhJRCAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgV2luZG93ICAgICAgICByb290OyAgICAgICAgLyogcm9vdCB3aW5kb3cgdGhhdCB0aGUgZXZlbnQgb2NjdXJlZCBvbiAqLworICAgIFdpbmRvdyAgICAgICAgc3Vid2luZG93OyAgIC8qIGNoaWxkIHdpbmRvdyAqLworICAgIFRpbWUgICAgICAgICAgdGltZTsgICAgICAgIC8qIG1pbGxpc2Vjb25kcyAqLworICAgIGludCAgICAgICAgICAgeCwgeTsgICAgICAgIC8qIHgsIHkgY29vcmRpbmF0ZXMgaW4gZXZlbnQgd2luZG93ICovCisgICAgaW50ICAgICAgICAgICB4X3Jvb3Q7ICAgICAgLyogY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gcm9vdCAqLworICAgIGludCAgICAgICAgICAgeV9yb290OyAgICAgIC8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KKyAgICB1bnNpZ25lZCBpbnQgIHN0YXRlOyAgICAgICAvKiBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KKyAgICBjaGFyICAgICAgICAgIGlzX2hpbnQ7ICAgICAvKiBkZXRhaWwgKi8KKyAgICBCb29sICAgICAgICAgIHNhbWVfc2NyZWVuOyAvKiBzYW1lIHNjcmVlbiBmbGFnICovCisgICAgdW5zaWduZWQgaW50ICBkZXZpY2Vfc3RhdGU7IC8qIGRldmljZSBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGF4ZXNfY291bnQ7CisgICAgdW5zaWduZWQgY2hhciBmaXJzdF9heGlzOworICAgIGludCAgICAgICAgICAgYXhpc19kYXRhWzZdOworICAgIH0gWERldmljZU1vdGlvbkV2ZW50OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZUZvY3VzQ2hhbmdlIGV2ZW50cy4gIFRoZXNlIGV2ZW50cyBhcmUgc2VudCB3aGVuIHRoZSBmb2N1cworICogb2YgYW4gZXh0ZW5zaW9uIGRldmljZSB0aGF0IGNhbiBiZSBmb2N1c2VkIGlzIGNoYW5nZWQuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IAorICAgIHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7ICAgICAgIC8qIG9mIGV2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICBzZW5kX2V2ZW50OyAvKiB0cnVlIGlmIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFdpbmRvdyAgICAgICAgd2luZG93OyAgICAgLyogImV2ZW50IiB3aW5kb3cgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gKi8KKyAgICBYSUQgICAgICAgICAgIGRldmljZWlkOworICAgIGludCAgICAgICAgICAgbW9kZTsgICAgICAgLyogTm90aWZ5Tm9ybWFsLCBOb3RpZnlHcmFiLCBOb3RpZnlVbmdyYWIgKi8KKyAgICBpbnQgICAgICAgICAgIGRldGFpbDsKKwkvKgorCSAqIE5vdGlmeUFuY2VzdG9yLCBOb3RpZnlWaXJ0dWFsLCBOb3RpZnlJbmZlcmlvciwgCisJICogTm90aWZ5Tm9uTGluZWFyLE5vdGlmeU5vbkxpbmVhclZpcnR1YWwsIE5vdGlmeVBvaW50ZXIsCisJICogTm90aWZ5UG9pbnRlclJvb3QsIE5vdGlmeURldGFpbE5vbmUgCisJICovCisgICAgVGltZSAgICAgICAgICAgICAgICB0aW1lOworICAgIH0gWERldmljZUZvY3VzQ2hhbmdlRXZlbnQ7CisKK3R5cGVkZWYgWERldmljZUZvY3VzQ2hhbmdlRXZlbnQgWERldmljZUZvY3VzSW5FdmVudDsKK3R5cGVkZWYgWERldmljZUZvY3VzQ2hhbmdlRXZlbnQgWERldmljZUZvY3VzT3V0RXZlbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUHJveGltaXR5Tm90aWZ5IGV2ZW50cy4gIFRoZXNlIGV2ZW50cyBhcmUgc2VudCBieSB0aG9zZSBhYnNvbHV0ZQorICogcG9zaXRpb25pbmcgZGV2aWNlcyB0aGF0IGFyZSBjYXBhYmxlIG9mIGdlbmVyYXRpbmcgcHJveGltaXR5IGluZm9ybWF0aW9uLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCAKKyAgICB7CisgICAgaW50ICAgICAgICAgICAgIHR5cGU7ICAgICAgLyogUHJveGltaXR5SW4gb3IgUHJveGltaXR5T3V0ICovICAgICAgICAKKyAgICB1bnNpZ25lZCBsb25nICAgc2VyaWFsOyAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICAgIHNlbmRfZXZlbnQ7IC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgICAqZGlzcGxheTsgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgICAgICAgICAgd2luZG93OyAgICAgIAorICAgIFhJRAkgICAgICAgICAgICBkZXZpY2VpZDsKKyAgICBXaW5kb3cgICAgICAgICAgcm9vdDsgICAgICAgICAgICAKKyAgICBXaW5kb3cgICAgICAgICAgc3Vid2luZG93OyAgICAgIAorICAgIFRpbWUgICAgICAgICAgICB0aW1lOyAgICAgICAgICAgIAorICAgIGludCAgICAgICAgICAgICB4LCB5OyAgICAgICAgICAgIAorICAgIGludCAgICAgICAgICAgICB4X3Jvb3QsIHlfcm9vdDsgIAorICAgIHVuc2lnbmVkIGludCAgICBzdGF0ZTsgICAgICAgICAgIAorICAgIEJvb2wgICAgICAgICAgICBzYW1lX3NjcmVlbjsgICAgIAorICAgIHVuc2lnbmVkIGludCAgICBkZXZpY2Vfc3RhdGU7IC8qIGRldmljZSBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KKyAgICB1bnNpZ25lZCBjaGFyICAgYXhlc19jb3VudDsKKyAgICB1bnNpZ25lZCBjaGFyICAgZmlyc3RfYXhpczsKKyAgICBpbnQgICAgICAgICAgICAgYXhpc19kYXRhWzZdOworICAgIH0gWFByb3hpbWl0eU5vdGlmeUV2ZW50OwordHlwZWRlZiBYUHJveGltaXR5Tm90aWZ5RXZlbnQgWFByb3hpbWl0eUluRXZlbnQ7Cit0eXBlZGVmIFhQcm94aW1pdHlOb3RpZnlFdmVudCBYUHJveGltaXR5T3V0RXZlbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlU3RhdGVOb3RpZnkgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgb24gRW50ZXJXaW5kb3cgYW5kIEZvY3VzSW4gCisgKiBmb3IgdGhvc2UgY2xpZW50cyB3aG8gaGF2ZSBzZWxlY3RlZCBEZXZpY2VTdGF0ZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIHVuc2lnbmVkIGNoYXIJY19jbGFzczsKKyNlbHNlCisgICAgdW5zaWduZWQgY2hhcgljbGFzczsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIJbGVuZ3RoOworICAgIH0gWElucHV0Q2xhc3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7CisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAgICAgICAqZGlzcGxheTsgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgICAgICAgIHdpbmRvdzsKKyAgICBYSUQgICAgICAgICAgIGRldmljZWlkOworICAgIFRpbWUgICAgICAgICAgdGltZTsKKyAgICBpbnQgICAgICAgICAgIG51bV9jbGFzc2VzOworICAgIGNoYXIJICBkYXRhWzY0XTsKK30gWERldmljZVN0YXRlTm90aWZ5RXZlbnQ7CQorCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIHVuc2lnbmVkIGNoYXIJY19jbGFzczsKKyNlbHNlCisgICAgdW5zaWduZWQgY2hhcgljbGFzczsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIJbGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIJbnVtX3ZhbHVhdG9yczsKKyAgICB1bnNpZ25lZCBjaGFyCW1vZGU7CisgICAgaW50ICAgICAgICAJCXZhbHVhdG9yc1s2XTsKK30gWFZhbHVhdG9yU3RhdHVzOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIHVuc2lnbmVkIGNoYXIJY19jbGFzczsKKyNlbHNlCisgICAgdW5zaWduZWQgY2hhcgljbGFzczsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIJbGVuZ3RoOworICAgIHNob3J0CQludW1fa2V5czsKKyAgICBjaGFyICAgICAgICAJa2V5c1szMl07Cit9IFhLZXlTdGF0dXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgdW5zaWduZWQgY2hhcgljX2NsYXNzOworI2Vsc2UKKyAgICB1bnNpZ25lZCBjaGFyCWNsYXNzOworI2VuZGlmCisgICAgdW5zaWduZWQgY2hhcglsZW5ndGg7CisgICAgc2hvcnQJCW51bV9idXR0b25zOworICAgIGNoYXIgICAgICAgIAlidXR0b25zWzMyXTsKK30gWEJ1dHRvblN0YXR1czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2VNYXBwaW5nTm90aWZ5IGV2ZW50LiAgVGhpcyBldmVudCBpcyBzZW50IHdoZW4gdGhlIGtleSBtYXBwaW5nLAorICogbW9kaWZpZXIgbWFwcGluZywgb3IgYnV0dG9uIG1hcHBpbmcgb2YgYW4gZXh0ZW5zaW9uIGRldmljZSBpcyBjaGFuZ2VkLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICB0eXBlOworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICBzZW5kX2V2ZW50OyAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgV2luZG93ICAgICAgICB3aW5kb3c7ICAgICAgIC8qIHVudXNlZCAqLworICAgIFhJRCAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgVGltZSAgICAgICAgICB0aW1lOworICAgIGludCAgICAgICAgICAgcmVxdWVzdDsgICAgICAvKiBvbmUgb2YgTWFwcGluZ01vZGlmaWVyLCBNYXBwaW5nS2V5Ym9hcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nUG9pbnRlciAqLworICAgIGludCAgICAgICAgICAgZmlyc3Rfa2V5Y29kZTsvKiBmaXJzdCBrZXljb2RlICovCisgICAgaW50ICAgICAgICAgICBjb3VudDsgICAgICAgIC8qIGRlZmluZXMgcmFuZ2Ugb2YgY2hhbmdlIHcuIGZpcnN0X2tleWNvZGUqLworfSBYRGV2aWNlTWFwcGluZ0V2ZW50OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENoYW5nZURldmljZU5vdGlmeSBldmVudC4gIFRoaXMgZXZlbnQgaXMgc2VudCB3aGVuIGFuIAorICogWENoYW5nZUtleWJvYXJkIG9yIFhDaGFuZ2VQb2ludGVyIHJlcXVlc3QgaXMgbWFkZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgdHlwZTsKKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFdpbmRvdyAgICAgICAgd2luZG93OyAgICAgICAvKiB1bnVzZWQgKi8KKyAgICBYSUQgICAgICAgICAgIGRldmljZWlkOworICAgIFRpbWUgICAgICAgICAgdGltZTsKKyAgICBpbnQgICAgICAgICAgIHJlcXVlc3Q7ICAgICAgLyogTmV3UG9pbnRlciBvciBOZXdLZXlib2FyZCAqLworfSBYQ2hhbmdlRGV2aWNlTm90aWZ5RXZlbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlUHJlc2VuY2VOb3RpZnkgZXZlbnQuICBUaGlzIGV2ZW50IGlzIHNlbnQgd2hlbiB0aGUgbGlzdCBvZgorICogaW5wdXQgZGV2aWNlcyBjaGFuZ2VzLCBpbiB3aGljaCBjYXNlIGRldmNoYW5nZSB3aWxsIGJlIGZhbHNlLCBhbmQKKyAqIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFuZ2Ugd2lsbCBiZSBjb250YWluZWQgaW4gdGhlIGV2ZW50OworICogdGhlIGNsaWVudCBzaG91bGQgdXNlIFhMaXN0SW5wdXREZXZpY2VzKCkgdG8gbGVhcm4gd2hhdCBoYXMgY2hhbmdlZC4KKyAqCisgKiBJZiBkZXZjaGFuZ2UgaXMgdHJ1ZSwgYW4gYXR0cmlidXRlIHRoYXQgdGhlIHNlcnZlciBiZWxpZXZlcyBpcworICogaW1wb3J0YW50IGhhcyBjaGFuZ2VkIG9uIGEgZGV2aWNlLCBhbmQgdGhlIGNsaWVudCBzaG91bGQgdXNlCisgKiBYR2V0RGV2aWNlQ29udHJvbCB0byBleGFtaW5lIHRoZSBkZXZpY2UuICBJZiBjb250cm9sIGlzIG5vbi16ZXJvLAorICogdGhlbiB0aGF0IGNvbnRyb2wgaGFzIGNoYW5nZWQgbWVhbmluZ2Z1bGx5LgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7CisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAgICAgICAqZGlzcGxheTsgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgICAgICAgIHdpbmRvdzsgICAgICAgLyogdW51c2VkICovCisgICAgVGltZSAgICAgICAgICB0aW1lOworICAgIEJvb2wgICAgICAgICAgZGV2Y2hhbmdlOworICAgIFhJRCAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgWElEICAgICAgICAgICBjb250cm9sOworfSBYRGV2aWNlUHJlc2VuY2VOb3RpZnlFdmVudDsKKworLyoKKyAqIE5vdGlmaWVzIHRoZSBjbGllbnQgdGhhdCBhIHByb3BlcnR5IG9uIGEgZGV2aWNlIGhhcyBjaGFuZ2VkIHZhbHVlLiBUaGUKKyAqIGNsaWVudCBpcyBleHBlY3RlZCB0byBxdWVyeSB0aGUgc2VydmVyIGZvciB1cGRhdGVkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgdHlwZTsKKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFdpbmRvdyAgICAgICAgd2luZG93OyAgICAgICAvKiB1bnVzZWQgKi8KKyAgICBUaW1lICAgICAgICAgIHRpbWU7CisgICAgWElEICAgICAgICAgICBkZXZpY2VpZDsgICAgIC8qIGlkIG9mIHRoZSBkZXZpY2UgdGhhdCBjaGFuZ2VkICovCisgICAgQXRvbSAgICAgICAgICBhdG9tOyAgICAgICAgIC8qIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQgKi8KKyAgICBpbnQgICAgICAgICAgIHN0YXRlOyAgICAgICAgLyogUHJvcGVydHlOZXdWYWx1ZSBvciBQcm9wZXJ0eURlbGV0ZWQgKi8KK30gWERldmljZVByb3BlcnR5Tm90aWZ5RXZlbnQ7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb250cm9sIHN0cnVjdHVyZXMgZm9yIGlucHV0IGRldmljZXMgdGhhdCBzdXBwb3J0IGlucHV0IGNsYXNzCisgKiBGZWVkYmFjay4gIFRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBYR2V0RmVlZGJhY2tDb250cm9sIGFuZCAKKyAqIFhDaGFuZ2VGZWVkYmFja0NvbnRyb2wgZnVuY3Rpb25zLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgICBYSUQgICAgICAgICAgICBjX2NsYXNzOworI2Vsc2UKKyAgICAgWElEICAgICAgICAgICAgY2xhc3M7CisjZW5kaWYKKyAgICAgaW50ICAgICAgICAgICAgbGVuZ3RoOworICAgICBYSUQgICAgICAgICAgICBpZDsKK30gWEZlZWRiYWNrU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElEICAgICBjX2NsYXNzOworI2Vsc2UKKyAgICBYSUQgICAgIGNsYXNzOworI2VuZGlmCisgICAgaW50ICAgICBsZW5ndGg7CisgICAgWElEICAgICBpZDsKKyAgICBpbnQgICAgIGNsaWNrOworICAgIGludCAgICAgcGVyY2VudDsKKyAgICBpbnQgICAgIHBpdGNoOworICAgIGludCAgICAgZHVyYXRpb247CisgICAgaW50ICAgICBsZWRfbWFzazsKKyAgICBpbnQgICAgIGdsb2JhbF9hdXRvX3JlcGVhdDsKKyAgICBjaGFyICAgIGF1dG9fcmVwZWF0c1szMl07Cit9IFhLYmRGZWVkYmFja1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRCAgICAgY19jbGFzczsKKyNlbHNlCisgICAgWElEICAgICBjbGFzczsKKyNlbmRpZgorICAgIGludCAgICAgbGVuZ3RoOworICAgIFhJRCAgICAgaWQ7CisgICAgaW50ICAgICBhY2NlbE51bTsKKyAgICBpbnQgICAgIGFjY2VsRGVub207CisgICAgaW50ICAgICB0aHJlc2hvbGQ7Cit9IFhQdHJGZWVkYmFja1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRCAgICAgY19jbGFzczsKKyNlbHNlCisgICAgWElEICAgICBjbGFzczsKKyNlbmRpZgorICAgIGludCAgICAgbGVuZ3RoOworICAgIFhJRCAgICAgaWQ7CisgICAgaW50ICAgICByZXNvbHV0aW9uOworICAgIGludCAgICAgbWluVmFsOworICAgIGludCAgICAgbWF4VmFsOworfSBYSW50ZWdlckZlZWRiYWNrU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElEICAgICBjX2NsYXNzOworI2Vsc2UKKyAgICBYSUQgICAgIGNsYXNzOworI2VuZGlmCisgICAgaW50ICAgICBsZW5ndGg7CisgICAgWElEICAgICBpZDsKKyAgICBpbnQgICAgIG1heF9zeW1ib2xzOworICAgIGludCAgICAgbnVtX3N5bXNfc3VwcG9ydGVkOworICAgIEtleVN5bSAgKnN5bXNfc3VwcG9ydGVkOworfSBYU3RyaW5nRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgICAgIGNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAgICAgY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgICAgIGxlbmd0aDsKKyAgICBYSUQgICAgIGlkOworICAgIGludCAgICAgcGVyY2VudDsKKyAgICBpbnQgICAgIHBpdGNoOworICAgIGludCAgICAgZHVyYXRpb247Cit9IFhCZWxsRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgICAgIGNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAgICAgY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgICAgIGxlbmd0aDsKKyAgICBYSUQgICAgIGlkOworICAgIGludCAgICAgbGVkX3ZhbHVlczsKKyAgICBpbnQgICAgIGxlZF9tYXNrOworfSBYTGVkRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICAgWElEICAgICAgICAgICAgY19jbGFzczsKKyNlbHNlCisgICAgIFhJRCAgICAgICAgICAgIGNsYXNzOworI2VuZGlmCisgICAgIGludCAgICAgICAgICAgIGxlbmd0aDsKKyAgICAgWElECSAgICBpZDsKK30gWEZlZWRiYWNrQ29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgICAgIGNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAgICAgY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgICAgIGxlbmd0aDsKKyAgICBYSUQgICAgIGlkOworICAgIGludCAgICAgYWNjZWxOdW07CisgICAgaW50ICAgICBhY2NlbERlbm9tOworICAgIGludCAgICAgdGhyZXNob2xkOworfSBYUHRyRmVlZGJhY2tDb250cm9sOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRCAgICAgY19jbGFzczsKKyNlbHNlCisgICAgWElEICAgICBjbGFzczsKKyNlbmRpZgorICAgIGludCAgICAgbGVuZ3RoOworICAgIFhJRCAgICAgaWQ7CisgICAgaW50ICAgICBjbGljazsKKyAgICBpbnQgICAgIHBlcmNlbnQ7CisgICAgaW50ICAgICBwaXRjaDsKKyAgICBpbnQgICAgIGR1cmF0aW9uOworICAgIGludCAgICAgbGVkX21hc2s7CisgICAgaW50ICAgICBsZWRfdmFsdWU7CisgICAgaW50ICAgICBrZXk7CisgICAgaW50ICAgICBhdXRvX3JlcGVhdF9tb2RlOworfSBYS2JkRmVlZGJhY2tDb250cm9sOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRCAgICAgY19jbGFzczsKKyNlbHNlCisgICAgWElEICAgICBjbGFzczsKKyNlbmRpZgorICAgIGludCAgICAgbGVuZ3RoOworICAgIFhJRCAgICAgaWQ7CisgICAgaW50ICAgICBudW1fa2V5c3ltczsKKyAgICBLZXlTeW0gICpzeW1zX3RvX2Rpc3BsYXk7Cit9IFhTdHJpbmdGZWVkYmFja0NvbnRyb2w7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElEICAgICBjX2NsYXNzOworI2Vsc2UKKyAgICBYSUQgICAgIGNsYXNzOworI2VuZGlmCisgICAgaW50ICAgICBsZW5ndGg7CisgICAgWElEICAgICBpZDsKKyAgICBpbnQgICAgIGludF90b19kaXNwbGF5OworfSBYSW50ZWdlckZlZWRiYWNrQ29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgICAgIGNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAgICAgY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgICAgIGxlbmd0aDsKKyAgICBYSUQgICAgIGlkOworICAgIGludCAgICAgcGVyY2VudDsKKyAgICBpbnQgICAgIHBpdGNoOworICAgIGludCAgICAgZHVyYXRpb247Cit9IFhCZWxsRmVlZGJhY2tDb250cm9sOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRCAgICAgY19jbGFzczsKKyNlbHNlCisgICAgWElEICAgICBjbGFzczsKKyNlbmRpZgorICAgIGludCAgICAgbGVuZ3RoOworICAgIFhJRCAgICAgaWQ7CisgICAgaW50ICAgICBsZWRfbWFzazsKKyAgICBpbnQgICAgIGxlZF92YWx1ZXM7Cit9IFhMZWRGZWVkYmFja0NvbnRyb2w7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlIGNvbnRyb2wgc3RydWN0dXJlcy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICBYSUQgICAgICAgICAgICBjb250cm9sOworICAgICBpbnQgICAgICAgICAgICBsZW5ndGg7Cit9IFhEZXZpY2VDb250cm9sOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgIFhJRCAgICAgICAgICAgIGNvbnRyb2w7CisgICAgIGludCAgICAgICAgICAgIGxlbmd0aDsKKyAgICAgaW50ICAgICAgICAgICAgZmlyc3RfdmFsdWF0b3I7CisgICAgIGludCAgICAgICAgICAgIG51bV92YWx1YXRvcnM7CisgICAgIGludCAgICAgICAgICAgICpyZXNvbHV0aW9uczsKK30gWERldmljZVJlc29sdXRpb25Db250cm9sOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgIFhJRCAgICAgICAgICAgIGNvbnRyb2w7CisgICAgIGludCAgICAgICAgICAgIGxlbmd0aDsKKyAgICAgaW50ICAgICAgICAgICAgbnVtX3ZhbHVhdG9yczsKKyAgICAgaW50ICAgICAgICAgICAgKnJlc29sdXRpb25zOworICAgICBpbnQgICAgICAgICAgICAqbWluX3Jlc29sdXRpb25zOworICAgICBpbnQgICAgICAgICAgICAqbWF4X3Jlc29sdXRpb25zOworfSBYRGV2aWNlUmVzb2x1dGlvblN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWElEICAgICAgICAgICAgIGNvbnRyb2w7CisgICAgaW50ICAgICAgICAgICAgIGxlbmd0aDsKKyAgICBpbnQgICAgICAgICAgICAgbWluX3g7CisgICAgaW50ICAgICAgICAgICAgIG1heF94OworICAgIGludCAgICAgICAgICAgICBtaW5feTsKKyAgICBpbnQgICAgICAgICAgICAgbWF4X3k7CisgICAgaW50ICAgICAgICAgICAgIGZsaXBfeDsKKyAgICBpbnQgICAgICAgICAgICAgZmxpcF95OworICAgIGludCAgICAgICAgICAgICByb3RhdGlvbjsKKyAgICBpbnQgICAgICAgICAgICAgYnV0dG9uX3RocmVzaG9sZDsKK30gWERldmljZUFic0NhbGliQ29udHJvbCwgWERldmljZUFic0NhbGliU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYSUQgICAgICAgICAgICAgY29udHJvbDsKKyAgICBpbnQgICAgICAgICAgICAgbGVuZ3RoOworICAgIGludCAgICAgICAgICAgICBvZmZzZXRfeDsKKyAgICBpbnQgICAgICAgICAgICAgb2Zmc2V0X3k7CisgICAgaW50ICAgICAgICAgICAgIHdpZHRoOworICAgIGludCAgICAgICAgICAgICBoZWlnaHQ7CisgICAgaW50ICAgICAgICAgICAgIHNjcmVlbjsKKyAgICBYSUQgICAgICAgICAgICAgZm9sbG93aW5nOworfSBYRGV2aWNlQWJzQXJlYUNvbnRyb2wsIFhEZXZpY2VBYnNBcmVhU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYSUQgICAgICAgICAgICAgY29udHJvbDsKKyAgICBpbnQgICAgICAgICAgICAgbGVuZ3RoOworICAgIGludCAgICAgICAgICAgICBzdGF0dXM7Cit9IFhEZXZpY2VDb3JlQ29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhJRCAgICAgICAgICAgICBjb250cm9sOworICAgIGludCAgICAgICAgICAgICBsZW5ndGg7CisgICAgaW50ICAgICAgICAgICAgIHN0YXR1czsKKyAgICBpbnQgICAgICAgICAgICAgaXNjb3JlOworfSBYRGV2aWNlQ29yZVN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWElEICAgICAgICAgICAgIGNvbnRyb2w7CisgICAgaW50ICAgICAgICAgICAgIGxlbmd0aDsKKyAgICBpbnQgICAgICAgICAgICAgZW5hYmxlOworfSBYRGV2aWNlRW5hYmxlQ29udHJvbCwgWERldmljZUVuYWJsZVN0YXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEFuIGFycmF5IG9mIFhEZXZpY2VMaXN0IHN0cnVjdHVyZXMgaXMgcmV0dXJuZWQgYnkgdGhlIAorICogWExpc3RJbnB1dERldmljZXMgZnVuY3Rpb24uICBFYWNoIGVudHJ5IGNvbnRhaW5zIGluZm9ybWF0aW9uCisgKiBhYm91dCBvbmUgaW5wdXQgZGV2aWNlLiAgQW1vbmcgdGhhdCBpbmZvcm1hdGlvbiBpcyBhbiBhcnJheSBvZiAKKyAqIHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgdGhhdCBkZXNjcmliZSB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIAorICogdGhlIGlucHV0IGRldmljZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1hBbnlDbGFzc2luZm8geworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgCWNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAJY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgCWxlbmd0aDsKKyAgICB9IFhBbnlDbGFzc0luZm87CisKK3R5cGVkZWYgc3RydWN0IF9YRGV2aWNlSW5mbyAqWERldmljZUluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF9YRGV2aWNlSW5mbworICAgIHsKKyAgICBYSUQgICAgICAgICAgICAgICAgIGlkOyAgICAgICAgCisgICAgQXRvbSAgICAgICAgICAgICAgICB0eXBlOworICAgIGNoYXIgICAgICAgICAgICAgICAgKm5hbWU7CisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fY2xhc3NlczsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHVzZTsKKyAgICBYQW55Q2xhc3NQdHIgCWlucHV0Y2xhc3NpbmZvOworICAgIH0gWERldmljZUluZm87CisKK3R5cGVkZWYgc3RydWN0IF9YS2V5SW5mbyAqWEtleUluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF9YS2V5SW5mbworICAgIHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElECQkJY19jbGFzczsKKyNlbHNlCisgICAgWElECQkJY2xhc3M7CisjZW5kaWYKKyAgICBpbnQJCQlsZW5ndGg7CisgICAgdW5zaWduZWQgc2hvcnQgICAgICBtaW5fa2V5Y29kZTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgICAgIG1heF9rZXljb2RlOworICAgIHVuc2lnbmVkIHNob3J0ICAgICAgbnVtX2tleXM7CisgICAgfSBYS2V5SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX1hCdXR0b25JbmZvICpYQnV0dG9uSW5mb1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hCdXR0b25JbmZvIHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElECQljX2NsYXNzOworI2Vsc2UKKyAgICBYSUQJCWNsYXNzOworI2VuZGlmCisgICAgaW50CQlsZW5ndGg7CisgICAgc2hvcnQgCW51bV9idXR0b25zOworICAgIH0gWEJ1dHRvbkluZm87CisKK3R5cGVkZWYgc3RydWN0IF9YQXhpc0luZm8gKlhBeGlzSW5mb1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hBeGlzSW5mbyB7CisgICAgaW50IAlyZXNvbHV0aW9uOworICAgIGludCAJbWluX3ZhbHVlOworICAgIGludCAJbWF4X3ZhbHVlOworICAgIH0gWEF4aXNJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfWFZhbHVhdG9ySW5mbyAqWFZhbHVhdG9ySW5mb1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QJX1hWYWx1YXRvckluZm8KKyAgICB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRAkJCWNfY2xhc3M7CisjZWxzZQorICAgIFhJRAkJCWNsYXNzOworI2VuZGlmCisgICAgaW50CQkJbGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIgICAgICAgbnVtX2F4ZXM7CisgICAgdW5zaWduZWQgY2hhciAgICAgICBtb2RlOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgbW90aW9uX2J1ZmZlcjsKKyAgICBYQXhpc0luZm9QdHIgICAgICAgIGF4ZXM7CisgICAgfSBYVmFsdWF0b3JJbmZvOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEFuIFhEZXZpY2Ugc3RydWN0dXJlIGlzIHJldHVybmVkIGJ5IHRoZSBYT3BlbkRldmljZSBmdW5jdGlvbi4gIAorICogSXQgY29udGFpbnMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gWElucHV0Q2xhc3NJbmZvIHN0cnVjdHVyZXMuCisgKiBFYWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgY2xhc3Mgb2YgaW5wdXQgc3VwcG9ydGVkIGJ5IHRoZQorICogZGV2aWNlLCBpbmNsdWRpbmcgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRhdGEgZm9yIGVhY2ggdHlwZSBvZiBldmVudAorICogdGhlIGRldmljZSByZXBvcnRzLgorICoKKyAqLworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgIGlucHV0X2NsYXNzOworICAgICAgICB1bnNpZ25lZCBjaGFyICAgZXZlbnRfdHlwZV9iYXNlOworfSBYSW5wdXRDbGFzc0luZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgWElEICAgICAgICAgICAgICAgICAgICBkZXZpY2VfaWQ7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgbnVtX2NsYXNzZXM7CisgICAgICAgIFhJbnB1dENsYXNzSW5mbyAgICAgICAgKmNsYXNzZXM7Cit9IFhEZXZpY2U7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHVybiBpbmZvcm1hdGlvbiBmb3IgdGhlIAorICogWEdldFNlbGVjdGVkRXh0ZW5zaW9uRXZlbnRzIGZ1bmN0aW9uLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFhFdmVudENsYXNzICAgICBldmVudF90eXBlOworICAgICAgICBYSUQgICAgICAgICAgICAgZGV2aWNlOworfSBYRXZlbnRMaXN0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0dXJuIG1vdGlvbiBoaXN0b3J5IGRhdGEgZnJvbSAKKyAqIGFuIGlucHV0IGRldmljZSB0aGF0IHN1cHBvcnRzIHRoZSBpbnB1dCBjbGFzcyBWYWx1YXRvcnMuCisgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGJ5IHRoZSBYR2V0RGV2aWNlTW90aW9uRXZlbnRzIGZ1bmN0aW9uLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFRpbWUgICB0aW1lOworICAgICAgICBpbnQgICAgKmRhdGE7Cit9IFhEZXZpY2VUaW1lQ29vcmQ7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2Ugc3RhdGUgc3RydWN0dXJlLgorICogVGhpcyBpcyByZXR1cm5lZCBieSB0aGUgWFF1ZXJ5RGV2aWNlU3RhdGUgcmVxdWVzdC4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBYSUQJCWRldmljZV9pZDsKKyAgICAgICAgaW50CQludW1fY2xhc3NlczsKKyAgICAgICAgWElucHV0Q2xhc3MJKmRhdGE7Cit9IFhEZXZpY2VTdGF0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOb3RlIHRoYXQgdGhlIG1vZGUgZmllbGQgaXMgYSBiaXRmaWVsZCB0aGF0IHJlcG9ydHMgdGhlIFByb3hpbWl0eQorICogc3RhdHVzIG9mIHRoZSBkZXZpY2UgYXMgd2VsbCBhcyB0aGUgbW9kZS4gIFRoZSBtb2RlIGZpZWxkIHNob3VsZAorICogYmUgT1InZCB3aXRoIHRoZSBtYXNrIERldmljZU1vZGUgYW5kIGNvbXBhcmVkIHdpdGggdGhlIHZhbHVlcworICogQWJzb2x1dGUgYW5kIFJlbGF0aXZlIHRvIGRldGVybWluZSB0aGUgbW9kZSwgYW5kIHNob3VsZCBiZSBPUidkCisgKiB3aXRoIHRoZSBtYXNrIFByb3hpbWl0eVN0YXRlIGFuZCBjb21wYXJlZCB3aXRoIHRoZSB2YWx1ZXMgSW5Qcm94aW1pdHkKKyAqIGFuZCBPdXRPZlByb3hpbWl0eSB0byBkZXRlcm1pbmUgdGhlIHByb3hpbWl0eSBzdGF0ZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICB1bnNpZ25lZCBjaGFyCWNfY2xhc3M7CisjZWxzZQorICAgIHVuc2lnbmVkIGNoYXIJY2xhc3M7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBjaGFyCWxlbmd0aDsKKyAgICB1bnNpZ25lZCBjaGFyCW51bV92YWx1YXRvcnM7CisgICAgdW5zaWduZWQgY2hhcgltb2RlOworICAgIGludCAgICAgICAgCQkqdmFsdWF0b3JzOworfSBYVmFsdWF0b3JTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICB1bnNpZ25lZCBjaGFyCWNfY2xhc3M7CisjZWxzZQorICAgIHVuc2lnbmVkIGNoYXIJY2xhc3M7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBjaGFyCWxlbmd0aDsKKyAgICBzaG9ydAkJbnVtX2tleXM7CisgICAgY2hhciAgICAgICAgCWtleXNbMzJdOworfSBYS2V5U3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgdW5zaWduZWQgY2hhcgljX2NsYXNzOworI2Vsc2UKKyAgICB1bnNpZ25lZCBjaGFyCWNsYXNzOworI2VuZGlmCisgICAgdW5zaWduZWQgY2hhcglsZW5ndGg7CisgICAgc2hvcnQJCW51bV9idXR0b25zOworICAgIGNoYXIgICAgICAgIAlidXR0b25zWzMyXTsKK30gWEJ1dHRvblN0YXRlOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGdW5jdGlvbiBkZWZpbml0aW9ucy4KKyAqCisgKi8KKworX1hGVU5DUFJPVE9CRUdJTgorCitleHRlcm4gaW50CVhDaGFuZ2VLZXlib2FyZERldmljZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovCispOworCitleHRlcm4gaW50CVhDaGFuZ2VQb2ludGVyRGV2aWNlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgaW50CQkJLyogeGF4aXMgKi8sCisgICAgaW50CQkJLyogeWF4aXMgKi8KKyk7CisKK2V4dGVybiBpbnQJWEdyYWJEZXZpY2UoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBXaW5kb3cJCS8qIGdyYWJfd2luZG93ICovLAorICAgIEJvb2wJCS8qIG93bmVyRXZlbnRzICovLAorICAgIGludAkJCS8qIGV2ZW50IGNvdW50ICovLAorICAgIFhFdmVudENsYXNzKgkvKiBldmVudF9saXN0ICovLAorICAgIGludAkJCS8qIHRoaXNfZGV2aWNlX21vZGUgKi8sCisgICAgaW50CQkJLyogb3RoZXJfZGV2aWNlc19tb2RlICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBpbnQJWFVuZ3JhYkRldmljZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIFRpbWUgCQkvKiB0aW1lICovCispOworCitleHRlcm4gaW50CVhHcmFiRGV2aWNlS2V5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGtleSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbW9kaWZpZXJzICovLAorICAgIFhEZXZpY2UqCQkvKiBtb2RpZmllcl9kZXZpY2UgKi8sCisgICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLywKKyAgICBCb29sCQkvKiBvd25lcl9ldmVudHMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGV2ZW50X2NvdW50ICovLAorICAgIFhFdmVudENsYXNzKgkvKiBldmVudF9saXN0ICovLAorICAgIGludAkJCS8qIHRoaXNfZGV2aWNlX21vZGUgKi8sCisgICAgaW50CQkJLyogb3RoZXJfZGV2aWNlc19tb2RlICovCispOworCitleHRlcm4gaW50CVhVbmdyYWJEZXZpY2VLZXkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyoga2V5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBtb2RpZmllcnMgKi8sCisgICAgWERldmljZSoJCS8qIG1vZGlmaWVyX2RldiAqLywKKyAgICBXaW5kb3cJCS8qIGdyYWJfd2luZG93ICovCispOworCitleHRlcm4gaW50CVhHcmFiRGV2aWNlQnV0dG9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGJ1dHRvbiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbW9kaWZpZXJzICovLAorICAgIFhEZXZpY2UqCQkvKiBtb2RpZmllcl9kZXZpY2UgKi8sCisgICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLywKKyAgICBCb29sCQkvKiBvd25lcl9ldmVudHMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGV2ZW50X2NvdW50ICovLAorICAgIFhFdmVudENsYXNzKgkvKiBldmVudF9saXN0ICovLAorICAgIGludAkJCS8qIHRoaXNfZGV2aWNlX21vZGUgKi8sCisgICAgaW50CQkJLyogb3RoZXJfZGV2aWNlc19tb2RlICovCispOworCitleHRlcm4gaW50CVhVbmdyYWJEZXZpY2VCdXR0b24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogYnV0dG9uICovLAorICAgIHVuc2lnbmVkIGludAkvKiBtb2RpZmllcnMgKi8sCisgICAgWERldmljZSoJCS8qIG1vZGlmaWVyX2RldiAqLywKKyAgICBXaW5kb3cJCS8qIGdyYWJfd2luZG93ICovCispOworCitleHRlcm4gaW50CVhBbGxvd0RldmljZUV2ZW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIGludAkJCS8qIGV2ZW50X21vZGUgKi8sCisgICAgVGltZQkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludAlYR2V0RGV2aWNlRm9jdXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBXaW5kb3cqCQkvKiBmb2N1cyAqLywKKyAgICBpbnQqCQkvKiByZXZlcnRfdG8gKi8sCisgICAgVGltZSoJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBpbnQJWFNldERldmljZUZvY3VzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgV2luZG93CQkvKiBmb2N1cyAqLywKKyAgICBpbnQJCQkvKiByZXZlcnRfdG8gKi8sCisgICAgVGltZQkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIFhGZWVkYmFja1N0YXRlCSpYR2V0RmVlZGJhY2tDb250cm9sKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgaW50KgkJLyogbnVtX2ZlZWRiYWNrcyAqLworKTsKKworZXh0ZXJuIHZvaWQJWEZyZWVGZWVkYmFja0xpc3QoCisgICAgWEZlZWRiYWNrU3RhdGUqCS8qIGxpc3QgKi8KKyk7CisKK2V4dGVybiBpbnQJWENoYW5nZUZlZWRiYWNrQ29udHJvbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogbWFzayAqLywKKyAgICBYRmVlZGJhY2tDb250cm9sKgkvKiBmICovCispOworCitleHRlcm4gaW50CVhEZXZpY2VCZWxsKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgWElECQkJLyogZmVlZGJhY2tjbGFzcyAqLywKKyAgICBYSUQJCQkvKiBmZWVkYmFja2lkICovLAorICAgIGludAkJCS8qIHBlcmNlbnQgKi8KKyk7CisKK2V4dGVybiBLZXlTeW0JKlhHZXREZXZpY2VLZXlNYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisjaWYgTmVlZFdpZGVQcm90b3R5cGVzCisgICAgdW5zaWduZWQgaW50CS8qIGZpcnN0ICovLAorI2Vsc2UKKyAgICBLZXlDb2RlCQkvKiBmaXJzdCAqLywKKyNlbmRpZgorICAgIGludAkJCS8qIGtleWNvdW50ICovLAorICAgIGludCoJCS8qIHN5bXNfcGVyX2NvZGUgKi8KKyk7CisKK2V4dGVybiBpbnQJWENoYW5nZURldmljZUtleU1hcHBpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBzeW1zX3Blcl9jb2RlICovLAorICAgIEtleVN5bSoJCS8qIGtleXN5bXMgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8KKyk7CisKK2V4dGVybiBYTW9kaWZpZXJLZXltYXAJKlhHZXREZXZpY2VNb2RpZmllck1hcHBpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLworKTsKKworZXh0ZXJuIGludAlYU2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgWE1vZGlmaWVyS2V5bWFwKgkvKiBtb2RtYXAgKi8KKyk7CisKK2V4dGVybiBpbnQJWFNldERldmljZUJ1dHRvbk1hcHBpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICB1bnNpZ25lZCBjaGFyKgkvKiBtYXBbXSAqLywKKyAgICBpbnQJCQkvKiBubWFwICovCispOworCitleHRlcm4gaW50CVhHZXREZXZpY2VCdXR0b25NYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgdW5zaWduZWQgY2hhcioJLyogbWFwW10gKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5tYXAgKi8KKyk7CisKK2V4dGVybiBYRGV2aWNlU3RhdGUJKlhRdWVyeURldmljZVN0YXRlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8KKyk7CisKK2V4dGVybiB2b2lkCVhGcmVlRGV2aWNlU3RhdGUoCisgICAgWERldmljZVN0YXRlKgkvKiBsaXN0ICovCispOworCitleHRlcm4gWEV4dGVuc2lvblZlcnNpb24JKlhHZXRFeHRlbnNpb25WZXJzaW9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogbmFtZSAqLworKTsKKworZXh0ZXJuIFhEZXZpY2VJbmZvCSpYTGlzdElucHV0RGV2aWNlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBuZGV2aWNlcyAqLworKTsKKworZXh0ZXJuIHZvaWQJWEZyZWVEZXZpY2VMaXN0KAorICAgIFhEZXZpY2VJbmZvKgkvKiBsaXN0ICovCispOworCitleHRlcm4gWERldmljZQkqWE9wZW5EZXZpY2UoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWElECQkJLyogaWQgKi8KKyk7CisKK2V4dGVybiBpbnQJWENsb3NlRGV2aWNlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8KKyk7CisKK2V4dGVybiBpbnQJWFNldERldmljZU1vZGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBpbnQJCQkvKiBtb2RlICovCispOworCitleHRlcm4gaW50CVhTZXREZXZpY2VWYWx1YXRvcnMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBpbnQqCQkvKiB2YWx1YXRvcnMgKi8sCisgICAgaW50CQkJLyogZmlyc3RfdmFsdWF0b3IgKi8sCisgICAgaW50CQkJLyogbnVtX3ZhbHVhdG9ycyAqLworKTsKKworZXh0ZXJuIFhEZXZpY2VDb250cm9sCSpYR2V0RGV2aWNlQ29udHJvbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIGludAkJCS8qIGNvbnRyb2wgKi8KKyk7CisKK2V4dGVybiBpbnQJWENoYW5nZURldmljZUNvbnRyb2woCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBpbnQJCQkvKiBjb250cm9sICovLAorICAgIFhEZXZpY2VDb250cm9sKgkvKiBkICovCispOworCitleHRlcm4gaW50CVhTZWxlY3RFeHRlbnNpb25FdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWEV2ZW50Q2xhc3MqCS8qIGV2ZW50X2xpc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8KKyk7CisKK2V4dGVybiBpbnQgWEdldFNlbGVjdGVkRXh0ZW5zaW9uRXZlbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBpbnQqCQkvKiB0aGlzX2NsaWVudF9jb3VudCAqLywKKyAgICBYRXZlbnRDbGFzcyoqCS8qIHRoaXNfY2xpZW50X2xpc3QgKi8sCisgICAgaW50KgkJLyogYWxsX2NsaWVudHNfY291bnQgKi8sCisgICAgWEV2ZW50Q2xhc3MqKgkvKiBhbGxfY2xpZW50c19saXN0ICovCispOworCitleHRlcm4gaW50CVhDaGFuZ2VEZXZpY2VEb250UHJvcGFnYXRlTGlzdCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHdpbmRvdyAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBYRXZlbnRDbGFzcyoJLyogZXZlbnRzICovLAorICAgIGludAkJCS8qIG1vZGUgKi8KKyk7CisKK2V4dGVybiBYRXZlbnRDbGFzcwkqWEdldERldmljZURvbnRQcm9wYWdhdGVMaXN0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogd2luZG93ICovLAorICAgIGludCoJCS8qIGNvdW50ICovCispOworCitleHRlcm4gU3RhdHVzCVhTZW5kRXh0ZW5zaW9uRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBXaW5kb3cJCS8qIGRlc3QgKi8sCisgICAgQm9vbAkJLyogcHJvcCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBYRXZlbnRDbGFzcyoJLyogbGlzdCAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudCAqLworKTsKKworZXh0ZXJuIFhEZXZpY2VUaW1lQ29vcmQJKlhHZXREZXZpY2VNb3Rpb25FdmVudHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBUaW1lCQkvKiBzdGFydCAqLywKKyAgICBUaW1lCQkvKiBzdG9wICovLAorICAgIGludCoJCS8qIG5FdmVudHMgKi8sCisgICAgaW50KgkJLyogbW9kZSAqLywKKyAgICBpbnQqCQkvKiBheGlzX2NvdW50ICovCispOworCitleHRlcm4gdm9pZAlYRnJlZURldmljZU1vdGlvbkV2ZW50cygKKyAgICBYRGV2aWNlVGltZUNvb3JkKgkvKiBldmVudHMgKi8KKyk7CisKK2V4dGVybiB2b2lkCVhGcmVlRGV2aWNlQ29udHJvbCgKKyAgICBYRGV2aWNlQ29udHJvbCoJLyogY29udHJvbCAqLworKTsKKworZXh0ZXJuIEF0b20qICAgWExpc3REZXZpY2VQcm9wZXJ0aWVzKAorICAgIERpc3BsYXkqICAgICAgICAgICAgLyogZHB5ICovLAorICAgIFhEZXZpY2UqICAgICAgICAgICAgLyogZGV2ICovLAorICAgIGludCogICAgICAgICAgICAgICAgLyogbnByb3BzX3JldHVybiAqLworKTsKKworZXh0ZXJuIHZvaWQgWENoYW5nZURldmljZVByb3BlcnR5KAorICAgIERpc3BsYXkqICAgICAgICAgICAgLyogZHB5ICovLAorICAgIFhEZXZpY2UqICAgICAgICAgICAgLyogZGV2ICovLAorICAgIEF0b20gICAgICAgICAgICAgICAgLyogcHJvcGVydHkgKi8sCisgICAgQXRvbSAgICAgICAgICAgICAgICAvKiB0eXBlICovLAorICAgIGludCAgICAgICAgICAgICAgICAgLyogZm9ybWF0ICovLAorICAgIGludCAgICAgICAgICAgICAgICAgLyogbW9kZSAqLywKKyAgICBfWGNvbnN0IHVuc2lnbmVkIGNoYXIgKiAvKmRhdGEgKi8sCisgICAgaW50ICAgICAgICAgICAgICAgICAvKiBuZWxlbWVudHMgKi8KKyk7CisKK2V4dGVybiB2b2lkCitYRGVsZXRlRGV2aWNlUHJvcGVydHkoCisgICAgRGlzcGxheSogICAgICAgICAgICAvKiBkcHkgKi8sCisgICAgWERldmljZSogICAgICAgICAgICAvKiBkZXYgKi8sCisgICAgQXRvbSAgICAgICAgICAgICAgICAvKiBwcm9wZXJ0eSAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWEdldERldmljZVByb3BlcnR5KAorICAgICBEaXNwbGF5KiAgICAgICAgICAgLyogZHB5Ki8sCisgICAgIFhEZXZpY2UqICAgICAgICAgICAvKiBkZXYqLywKKyAgICAgQXRvbSAgICAgICAgICAgICAgIC8qIHByb3BlcnR5Ki8sCisgICAgIGxvbmcgICAgICAgICAgICAgICAvKiBvZmZzZXQqLywKKyAgICAgbG9uZyAgICAgICAgICAgICAgIC8qIGxlbmd0aCovLAorICAgICBCb29sICAgICAgICAgICAgICAgLyogZGVsZXRlKi8sCisgICAgIEF0b20gICAgICAgICAgICAgICAvKiByZXFfdHlwZSovLAorICAgICBBdG9tKiAgICAgICAgICAgICAgLyogYWN0dWFsX3R5cGUqLywKKyAgICAgaW50KiAgICAgICAgICAgICAgIC8qIGFjdHVhbF9mb3JtYXQqLywKKyAgICAgdW5zaWduZWQgbG9uZyogICAgIC8qIG5pdGVtcyovLAorICAgICB1bnNpZ25lZCBsb25nKiAgICAgLyogYnl0ZXNfYWZ0ZXIqLywKKyAgICAgdW5zaWduZWQgY2hhcioqICAgIC8qIHByb3AqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YSU5QVVRfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWElucHV0Mi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YSW5wdXQyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkZTY5NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWElucHV0Mi5oCkBAIC0wLDAgKzEsNjEwIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDkgUmVkIEhhdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgbGlicmFyeSBhbmQgY2xpZW50ICovCisKKyNpZm5kZWYgX1hJTlBVVDJfSF8KKyNkZWZpbmUgX1hJTlBVVDJfSF8KKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWEkyLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWGdlLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgICAgICB0eXBlOworICAgIGNoYXIqICAgICAgICAgICAgICAgbmFtZTsKKyAgICBCb29sICAgICAgICAgICAgICAgIHNlbmRfY29yZTsKKyAgICBCb29sICAgICAgICAgICAgICAgIGVuYWJsZTsKK30gWElBZGRNYXN0ZXJJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgICAgICB0eXBlOworICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXR1cm5fbW9kZTsgLyogQXR0YWNoVG9NYXN0ZXIsIEZsb2F0aW5nICovCisgICAgaW50ICAgICAgICAgICAgICAgICByZXR1cm5fcG9pbnRlcjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJldHVybl9rZXlib2FyZDsKK30gWElSZW1vdmVNYXN0ZXJJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgICAgICB0eXBlOworICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBuZXdfbWFzdGVyOworfSBYSUF0dGFjaFNsYXZlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgICAgICAgdHlwZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkOworfSBYSURldGFjaFNsYXZlSW5mbzsKKwordHlwZWRlZiB1bmlvbiB7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIHR5cGU7IC8qIG11c3QgYmUgZmlyc3QgZWxlbWVudCAqLworICAgIFhJQWRkTWFzdGVySW5mbyAgICAgICBhZGQ7CisgICAgWElSZW1vdmVNYXN0ZXJJbmZvICAgIHJlbW92ZTsKKyAgICBYSUF0dGFjaFNsYXZlSW5mbyAgICAgYXR0YWNoOworICAgIFhJRGV0YWNoU2xhdmVJbmZvICAgICBkZXRhY2g7Cit9IFhJQW55SGllcmFyY2h5Q2hhbmdlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgICAgYmFzZTsKKyAgICBpbnQgICAgbGF0Y2hlZDsKKyAgICBpbnQgICAgbG9ja2VkOworICAgIGludCAgICBlZmZlY3RpdmU7Cit9IFhJTW9kaWZpZXJTdGF0ZTsKKwordHlwZWRlZiBYSU1vZGlmaWVyU3RhdGUgWElHcm91cFN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICBtYXNrX2xlbjsKKyAgICB1bnNpZ25lZCBjaGFyICptYXNrOworfSBYSUJ1dHRvblN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICBtYXNrX2xlbjsKKyAgICB1bnNpZ25lZCBjaGFyICptYXNrOworICAgIGRvdWJsZSAgICAgICAgKnZhbHVlczsKK30gWElWYWx1YXRvclN0YXRlOworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1hc2tfbGVuOworICAgIHVuc2lnbmVkIGNoYXIqICAgICAgbWFzazsKK30gWElFdmVudE1hc2s7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50ICAgICAgICAgdHlwZTsKKyAgICBpbnQgICAgICAgICBzb3VyY2VpZDsKK30gWElBbnlDbGFzc0luZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50ICAgICAgICAgdHlwZTsKKyAgICBpbnQgICAgICAgICBzb3VyY2VpZDsKKyAgICBpbnQgICAgICAgICBudW1fYnV0dG9uczsKKyAgICBBdG9tICAgICAgICAqbGFiZWxzOworICAgIFhJQnV0dG9uU3RhdGUgc3RhdGU7Cit9IFhJQnV0dG9uQ2xhc3NJbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCAgICAgICAgIHR5cGU7CisgICAgaW50ICAgICAgICAgc291cmNlaWQ7CisgICAgaW50ICAgICAgICAgbnVtX2tleWNvZGVzOworICAgIGludCAgICAgICAgICprZXljb2RlczsKK30gWElLZXlDbGFzc0luZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50ICAgICAgICAgdHlwZTsKKyAgICBpbnQgICAgICAgICBzb3VyY2VpZDsKKyAgICBpbnQgICAgICAgICBudW1iZXI7CisgICAgQXRvbSAgICAgICAgbGFiZWw7CisgICAgZG91YmxlICAgICAgbWluOworICAgIGRvdWJsZSAgICAgIG1heDsKKyAgICBkb3VibGUgICAgICB2YWx1ZTsKKyAgICBpbnQgICAgICAgICByZXNvbHV0aW9uOworICAgIGludCAgICAgICAgIG1vZGU7Cit9IFhJVmFsdWF0b3JDbGFzc0luZm87CisKKy8qIG5ldyBpbiBYSSAyLjEgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50ICAgICAgICAgdHlwZTsKKyAgICBpbnQgICAgICAgICBzb3VyY2VpZDsKKyAgICBpbnQgICAgICAgICBudW1iZXI7CisgICAgaW50ICAgICAgICAgc2Nyb2xsX3R5cGU7CisgICAgZG91YmxlICAgICAgaW5jcmVtZW50OworICAgIGludCAgICAgICAgIGZsYWdzOworfSBYSVNjcm9sbENsYXNzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgICAgICAgICB0eXBlOworICAgIGludCAgICAgICAgIHNvdXJjZWlkOworICAgIGludCAgICAgICAgIG1vZGU7CisgICAgaW50ICAgICAgICAgbnVtX3RvdWNoZXM7Cit9IFhJVG91Y2hDbGFzc0luZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZDsKKyAgICBjaGFyICAgICAgICAgICAgICAgICpuYW1lOworICAgIGludCAgICAgICAgICAgICAgICAgdXNlOworICAgIGludCAgICAgICAgICAgICAgICAgYXR0YWNobWVudDsKKyAgICBCb29sICAgICAgICAgICAgICAgIGVuYWJsZWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fY2xhc3NlczsKKyAgICBYSUFueUNsYXNzSW5mbyAgICAgICoqY2xhc3NlczsKK30gWElEZXZpY2VJbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCAgICAgICAgICAgICAgICAgbW9kaWZpZXJzOworICAgIGludCAgICAgICAgICAgICAgICAgc3RhdHVzOworfSBYSUdyYWJNb2RpZmllcnM7CisKKy8qKgorICogR2VuZXJpYyBYSTIgZXZlbnQuIEFsbCBYSTIgZXZlbnRzIGhhdmUgdGhlIHNhbWUgaGVhZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICB0eXBlOyAgICAgICAgIC8qIEdlbmVyaWNFdmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICBzZW5kX2V2ZW50OyAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgaW50ICAgICAgICAgICBleHRlbnNpb247ICAgIC8qIFhJIGV4dGVuc2lvbiBvZmZzZXQgKi8KKyAgICBpbnQgICAgICAgICAgIGV2dHlwZTsKKyAgICBUaW1lICAgICAgICAgIHRpbWU7Cit9IFhJRXZlbnQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgaW50ICAgICAgICAgICBhdHRhY2htZW50OworICAgIGludCAgICAgICAgICAgdXNlOworICAgIEJvb2wgICAgICAgICAgZW5hYmxlZDsKKyAgICBpbnQgICAgICAgICAgIGZsYWdzOworfSBYSUhpZXJhcmNoeUluZm87CisKKy8qCisgKiBOb3RpZmllcyB0aGUgY2xpZW50IHRoYXQgdGhlIGRldmljZSBoaWVyYXJjaHkgaGFzIGJlZW4gY2hhbmdlZC4gVGhlIGNsaWVudAorICogaXMgZXhwZWN0ZWQgdG8gcmUtcXVlcnkgdGhlIHNlcnZlciBmb3IgdGhlIGRldmljZSBoaWVyYXJjaHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7ICAgICAgICAgLyogR2VuZXJpY0V2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAgICAgICAqZGlzcGxheTsgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBpbnQgICAgICAgICAgIGV4dGVuc2lvbjsgICAgLyogWEkgZXh0ZW5zaW9uIG9mZnNldCAqLworICAgIGludCAgICAgICAgICAgZXZ0eXBlOyAgICAgICAvKiBYSV9IaWVyYXJjaHlDaGFuZ2VkICovCisgICAgVGltZSAgICAgICAgICB0aW1lOworICAgIGludCAgICAgICAgICAgZmxhZ3M7CisgICAgaW50ICAgICAgICAgICBudW1faW5mbzsKKyAgICBYSUhpZXJhcmNoeUluZm8gKmluZm87Cit9IFhJSGllcmFyY2h5RXZlbnQ7CisKKy8qCisgKiBOb3RpZmllcyB0aGUgY2xpZW50IHRoYXQgdGhlIGNsYXNzZXMgaGF2ZSBiZWVuIGNoYW5nZWQuIFRoaXMgaGFwcGVucyB3aGVuCisgKiB0aGUgc2xhdmUgZGV2aWNlIHRoYXQgc2VuZHMgdGhyb3VnaCB0aGUgbWFzdGVyIGNoYW5nZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7ICAgICAgICAgLyogR2VuZXJpY0V2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAgICAgICAqZGlzcGxheTsgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBpbnQgICAgICAgICAgIGV4dGVuc2lvbjsgICAgLyogWEkgZXh0ZW5zaW9uIG9mZnNldCAqLworICAgIGludCAgICAgICAgICAgZXZ0eXBlOyAgICAgICAvKiBYSV9EZXZpY2VDaGFuZ2VkICovCisgICAgVGltZSAgICAgICAgICB0aW1lOworICAgIGludCAgICAgICAgICAgZGV2aWNlaWQ7ICAgICAvKiBpZCBvZiB0aGUgZGV2aWNlIHRoYXQgY2hhbmdlZCAqLworICAgIGludCAgICAgICAgICAgc291cmNlaWQ7ICAgICAvKiBTb3VyY2UgZm9yIHRoZSBuZXcgY2xhc3Nlcy4gKi8KKyAgICBpbnQgICAgICAgICAgIHJlYXNvbjsgICAgICAgLyogUmVhc29uIGZvciB0aGUgY2hhbmdlICovCisgICAgaW50ICAgICAgICAgICBudW1fY2xhc3NlczsKKyAgICBYSUFueUNsYXNzSW5mbyAqKmNsYXNzZXM7IC8qIHNhbWUgYXMgaW4gWElEZXZpY2VJbmZvICovCit9IFhJRGV2aWNlQ2hhbmdlZEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICB0eXBlOyAgICAgICAgIC8qIEdlbmVyaWNFdmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICBzZW5kX2V2ZW50OyAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgaW50ICAgICAgICAgICBleHRlbnNpb247ICAgIC8qIFhJIGV4dGVuc2lvbiBvZmZzZXQgKi8KKyAgICBpbnQgICAgICAgICAgIGV2dHlwZTsKKyAgICBUaW1lICAgICAgICAgIHRpbWU7CisgICAgaW50ICAgICAgICAgICBkZXZpY2VpZDsKKyAgICBpbnQgICAgICAgICAgIHNvdXJjZWlkOworICAgIGludCAgICAgICAgICAgZGV0YWlsOworICAgIFdpbmRvdyAgICAgICAgcm9vdDsKKyAgICBXaW5kb3cgICAgICAgIGV2ZW50OworICAgIFdpbmRvdyAgICAgICAgY2hpbGQ7CisgICAgZG91YmxlICAgICAgICByb290X3g7CisgICAgZG91YmxlICAgICAgICByb290X3k7CisgICAgZG91YmxlICAgICAgICBldmVudF94OworICAgIGRvdWJsZSAgICAgICAgZXZlbnRfeTsKKyAgICBpbnQgICAgICAgICAgIGZsYWdzOworICAgIFhJQnV0dG9uU3RhdGUgICAgICAgYnV0dG9uczsKKyAgICBYSVZhbHVhdG9yU3RhdGUgICAgIHZhbHVhdG9yczsKKyAgICBYSU1vZGlmaWVyU3RhdGUgICAgIG1vZHM7CisgICAgWElHcm91cFN0YXRlICAgICAgICBncm91cDsKK30gWElEZXZpY2VFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgdHlwZTsgICAgICAgICAvKiBHZW5lcmljRXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIGludCAgICAgICAgICAgZXh0ZW5zaW9uOyAgICAvKiBYSSBleHRlbnNpb24gb2Zmc2V0ICovCisgICAgaW50ICAgICAgICAgICBldnR5cGU7ICAgICAgIC8qIFhJX1Jhd0tleVByZXNzLCBYSV9SYXdLZXlSZWxlYXNlLCBldGMuICovCisgICAgVGltZSAgICAgICAgICB0aW1lOworICAgIGludCAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgaW50ICAgICAgICAgICBzb3VyY2VpZDsgICAgIC8qIEJ1ZzogQWx3YXlzIDAuIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvL3Nob3dfYnVnLmNnaT9pZD0zNDI0MCAqLworICAgIGludCAgICAgICAgICAgZGV0YWlsOworICAgIGludCAgICAgICAgICAgZmxhZ3M7CisgICAgWElWYWx1YXRvclN0YXRlIHZhbHVhdG9yczsKKyAgICBkb3VibGUgICAgICAgICpyYXdfdmFsdWVzOworfSBYSVJhd0V2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICB0eXBlOyAgICAgICAgIC8qIEdlbmVyaWNFdmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICBzZW5kX2V2ZW50OyAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgaW50ICAgICAgICAgICBleHRlbnNpb247ICAgIC8qIFhJIGV4dGVuc2lvbiBvZmZzZXQgKi8KKyAgICBpbnQgICAgICAgICAgIGV2dHlwZTsKKyAgICBUaW1lICAgICAgICAgIHRpbWU7CisgICAgaW50ICAgICAgICAgICBkZXZpY2VpZDsKKyAgICBpbnQgICAgICAgICAgIHNvdXJjZWlkOworICAgIGludCAgICAgICAgICAgZGV0YWlsOworICAgIFdpbmRvdyAgICAgICAgcm9vdDsKKyAgICBXaW5kb3cgICAgICAgIGV2ZW50OworICAgIFdpbmRvdyAgICAgICAgY2hpbGQ7CisgICAgZG91YmxlICAgICAgICByb290X3g7CisgICAgZG91YmxlICAgICAgICByb290X3k7CisgICAgZG91YmxlICAgICAgICBldmVudF94OworICAgIGRvdWJsZSAgICAgICAgZXZlbnRfeTsKKyAgICBpbnQgICAgICAgICAgIG1vZGU7CisgICAgQm9vbCAgICAgICAgICBmb2N1czsKKyAgICBCb29sICAgICAgICAgIHNhbWVfc2NyZWVuOworICAgIFhJQnV0dG9uU3RhdGUgICAgICAgYnV0dG9uczsKKyAgICBYSU1vZGlmaWVyU3RhdGUgICAgIG1vZHM7CisgICAgWElHcm91cFN0YXRlICAgICAgICBncm91cDsKK30gWElFbnRlckV2ZW50OworCit0eXBlZGVmIFhJRW50ZXJFdmVudCBYSUxlYXZlRXZlbnQ7Cit0eXBlZGVmIFhJRW50ZXJFdmVudCBYSUZvY3VzSW5FdmVudDsKK3R5cGVkZWYgWElFbnRlckV2ZW50IFhJRm9jdXNPdXRFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgdHlwZTsgICAgICAgICAvKiBHZW5lcmljRXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIGludCAgICAgICAgICAgZXh0ZW5zaW9uOyAgICAvKiBYSSBleHRlbnNpb24gb2Zmc2V0ICovCisgICAgaW50ICAgICAgICAgICBldnR5cGU7ICAgICAgIC8qIFhJX1Byb3BlcnR5RXZlbnQgKi8KKyAgICBUaW1lICAgICAgICAgIHRpbWU7CisgICAgaW50ICAgICAgICAgICBkZXZpY2VpZDsgICAgIC8qIGlkIG9mIHRoZSBkZXZpY2UgdGhhdCBjaGFuZ2VkICovCisgICAgQXRvbSAgICAgICAgICBwcm9wZXJ0eTsKKyAgICBpbnQgICAgICAgICAgIHdoYXQ7Cit9IFhJUHJvcGVydHlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgdHlwZTsgICAgICAgICAvKiBHZW5lcmljRXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIGludCAgICAgICAgICAgZXh0ZW5zaW9uOyAgICAvKiBYSSBleHRlbnNpb24gb2Zmc2V0ICovCisgICAgaW50ICAgICAgICAgICBldnR5cGU7CisgICAgVGltZSAgICAgICAgICB0aW1lOworICAgIGludCAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgaW50ICAgICAgICAgICBzb3VyY2VpZDsKKyAgICB1bnNpZ25lZCBpbnQgIHRvdWNoaWQ7CisgICAgV2luZG93ICAgICAgICByb290OworICAgIFdpbmRvdyAgICAgICAgZXZlbnQ7CisgICAgV2luZG93ICAgICAgICBjaGlsZDsKKyAgICBpbnQgICAgICAgICAgIGZsYWdzOworfSBYSVRvdWNoT3duZXJzaGlwRXZlbnQ7CisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIEJvb2wgICAgIFhJUXVlcnlQb2ludGVyKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgIFdpbmRvdyAgICAgICAgICAgICAgd2luLAorICAgIFdpbmRvdyogICAgICAgICAgICAgcm9vdCwKKyAgICBXaW5kb3cqICAgICAgICAgICAgIGNoaWxkLAorICAgIGRvdWJsZSogICAgICAgICAgICAgcm9vdF94LAorICAgIGRvdWJsZSogICAgICAgICAgICAgcm9vdF95LAorICAgIGRvdWJsZSogICAgICAgICAgICAgd2luX3gsCisgICAgZG91YmxlKiAgICAgICAgICAgICB3aW5feSwKKyAgICBYSUJ1dHRvblN0YXRlICAgICAgICpidXR0b25zLAorICAgIFhJTW9kaWZpZXJTdGF0ZSAgICAgKm1vZHMsCisgICAgWElHcm91cFN0YXRlICAgICAgICAqZ3JvdXAKKyk7CisKK2V4dGVybiBCb29sICAgICBYSVdhcnBQb2ludGVyKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgIFdpbmRvdyAgICAgICAgICAgICAgc3JjX3dpbiwKKyAgICBXaW5kb3cgICAgICAgICAgICAgIGRzdF93aW4sCisgICAgZG91YmxlICAgICAgICAgICAgICBzcmNfeCwKKyAgICBkb3VibGUgICAgICAgICAgICAgIHNyY195LAorICAgIHVuc2lnbmVkIGludCAgICAgICAgc3JjX3dpZHRoLAorICAgIHVuc2lnbmVkIGludCAgICAgICAgc3JjX2hlaWdodCwKKyAgICBkb3VibGUgICAgICAgICAgICAgIGRzdF94LAorICAgIGRvdWJsZSAgICAgICAgICAgICAgZHN0X3kKKyk7CisKK2V4dGVybiBTdGF0dXMgICBYSURlZmluZUN1cnNvcigKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRpc3BsYXksCisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICBXaW5kb3cgICAgICAgICAgICAgIHdpbiwKKyAgICBDdXJzb3IgICAgICAgICAgICAgIGN1cnNvcgorKTsKKworZXh0ZXJuIFN0YXR1cyAgIFhJVW5kZWZpbmVDdXJzb3IoCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgV2luZG93ICAgICAgICAgICAgICB3aW4KKyk7CisKK2V4dGVybiBTdGF0dXMgICBYSUNoYW5nZUhpZXJhcmNoeSgKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRpc3BsYXksCisgICAgWElBbnlIaWVyYXJjaHlDaGFuZ2VJbmZvKiAgY2hhbmdlcywKKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bV9jaGFuZ2VzCispOworCitleHRlcm4gU3RhdHVzICAgWElTZXRDbGllbnRQb2ludGVyKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZHB5LAorICAgIFdpbmRvdyAgICAgICAgICAgICAgd2luLAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQKKyk7CisKK2V4dGVybiBCb29sICAgICBYSUdldENsaWVudFBvaW50ZXIoCisgICAgRGlzcGxheSogICAgICAgICAgICBkcHksCisgICAgV2luZG93ICAgICAgICAgICAgICB3aW4sCisgICAgaW50KiAgICAgICAgICAgICAgICBkZXZpY2VpZAorKTsKKworZXh0ZXJuIGludCAgICAgIFhJU2VsZWN0RXZlbnRzKAorICAgICBEaXNwbGF5KiAgICAgICAgICAgIGRweSwKKyAgICAgV2luZG93ICAgICAgICAgICAgICB3aW4sCisgICAgIFhJRXZlbnRNYXNrICAgICAgICAgKm1hc2tzLAorICAgICBpbnQgICAgICAgICAgICAgICAgIG51bV9tYXNrcworKTsKKworZXh0ZXJuIFhJRXZlbnRNYXNrICpYSUdldFNlbGVjdGVkRXZlbnRzKAorICAgICBEaXNwbGF5KiAgICAgICAgICAgIGRweSwKKyAgICAgV2luZG93ICAgICAgICAgICAgICB3aW4sCisgICAgIGludCAgICAgICAgICAgICAgICAgKm51bV9tYXNrc19yZXR1cm4KKyk7CisKK2V4dGVybiBTdGF0dXMgWElRdWVyeVZlcnNpb24oCisgICAgIERpc3BsYXkqICAgICAgICAgICBkcHksCisgICAgIGludCogICAgICAgICAgICAgICBtYWpvcl92ZXJzaW9uX2lub3V0LAorICAgICBpbnQqICAgICAgICAgICAgICAgbWlub3JfdmVyc2lvbl9pbm91dAorKTsKKworZXh0ZXJuIFhJRGV2aWNlSW5mbyogWElRdWVyeURldmljZSgKKyAgICAgRGlzcGxheSogICAgICAgICAgIGRweSwKKyAgICAgaW50ICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgICBpbnQqICAgICAgICAgICAgICAgbmRldmljZXNfcmV0dXJuCispOworCitleHRlcm4gU3RhdHVzIFhJU2V0Rm9jdXMoCisgICAgIERpc3BsYXkqICAgICAgICAgICBkcHksCisgICAgIGludCAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICAgV2luZG93ICAgICAgICAgICAgIGZvY3VzLAorICAgICBUaW1lICAgICAgICAgICAgICAgdGltZQorKTsKKworZXh0ZXJuIFN0YXR1cyBYSUdldEZvY3VzKAorICAgICBEaXNwbGF5KiAgICAgICAgICAgZHB5LAorICAgICBpbnQgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgIFdpbmRvdyAgICAgICAgICAgICAqZm9jdXNfcmV0dXJuKTsKKworZXh0ZXJuIFN0YXR1cyBYSUdyYWJEZXZpY2UoCisgICAgIERpc3BsYXkqICAgICAgICAgICBkcHksCisgICAgIGludCAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICAgV2luZG93ICAgICAgICAgICAgIGdyYWJfd2luZG93LAorICAgICBUaW1lICAgICAgICAgICAgICAgdGltZSwKKyAgICAgQ3Vyc29yICAgICAgICAgICAgIGN1cnNvciwKKyAgICAgaW50ICAgICAgICAgICAgICAgIGdyYWJfbW9kZSwKKyAgICAgaW50ICAgICAgICAgICAgICAgIHBhaXJlZF9kZXZpY2VfbW9kZSwKKyAgICAgQm9vbCAgICAgICAgICAgICAgIG93bmVyX2V2ZW50cywKKyAgICAgWElFdmVudE1hc2sgICAgICAgICptYXNrCispOworCitleHRlcm4gU3RhdHVzIFhJVW5ncmFiRGV2aWNlKAorICAgICBEaXNwbGF5KiAgICAgICAgICAgZHB5LAorICAgICBpbnQgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgIFRpbWUgICAgICAgICAgICAgICB0aW1lCispOworCitleHRlcm4gU3RhdHVzIFhJQWxsb3dFdmVudHMoCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgaW50ICAgICAgICAgICAgICAgICBldmVudF9tb2RlLAorICAgIFRpbWUgICAgICAgICAgICAgICAgdGltZQorKTsKKworZXh0ZXJuIFN0YXR1cyBYSUFsbG93VG91Y2hFdmVudHMoCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgdW5zaWduZWQgaW50ICAgICAgICB0b3VjaGlkLAorICAgIFdpbmRvdyAgICAgICAgICAgICAgZ3JhYl93aW5kb3csCisgICAgaW50ICAgICAgICAgICAgICAgICBldmVudF9tb2RlCispOworCitleHRlcm4gaW50IFhJR3JhYkJ1dHRvbigKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRpc3BsYXksCisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGJ1dHRvbiwKKyAgICBXaW5kb3cgICAgICAgICAgICAgIGdyYWJfd2luZG93LAorICAgIEN1cnNvciAgICAgICAgICAgICAgY3Vyc29yLAorICAgIGludCAgICAgICAgICAgICAgICAgZ3JhYl9tb2RlLAorICAgIGludCAgICAgICAgICAgICAgICAgcGFpcmVkX2RldmljZV9tb2RlLAorICAgIGludCAgICAgICAgICAgICAgICAgb3duZXJfZXZlbnRzLAorICAgIFhJRXZlbnRNYXNrICAgICAgICAgKm1hc2ssCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fbW9kaWZpZXJzLAorICAgIFhJR3JhYk1vZGlmaWVycyAgICAgKm1vZGlmaWVyc19pbm91dAorKTsKKworZXh0ZXJuIGludCBYSUdyYWJLZXljb2RlKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgIGludCAgICAgICAgICAgICAgICAga2V5Y29kZSwKKyAgICBXaW5kb3cgICAgICAgICAgICAgIGdyYWJfd2luZG93LAorICAgIGludCAgICAgICAgICAgICAgICAgZ3JhYl9tb2RlLAorICAgIGludCAgICAgICAgICAgICAgICAgcGFpcmVkX2RldmljZV9tb2RlLAorICAgIGludCAgICAgICAgICAgICAgICAgb3duZXJfZXZlbnRzLAorICAgIFhJRXZlbnRNYXNrICAgICAgICAgKm1hc2ssCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fbW9kaWZpZXJzLAorICAgIFhJR3JhYk1vZGlmaWVycyAgICAgKm1vZGlmaWVyc19pbm91dAorKTsKKworZXh0ZXJuIGludCBYSUdyYWJFbnRlcigKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRpc3BsYXksCisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICBXaW5kb3cgICAgICAgICAgICAgIGdyYWJfd2luZG93LAorICAgIEN1cnNvciAgICAgICAgICAgICAgY3Vyc29yLAorICAgIGludCAgICAgICAgICAgICAgICAgZ3JhYl9tb2RlLAorICAgIGludCAgICAgICAgICAgICAgICAgcGFpcmVkX2RldmljZV9tb2RlLAorICAgIGludCAgICAgICAgICAgICAgICAgb3duZXJfZXZlbnRzLAorICAgIFhJRXZlbnRNYXNrICAgICAgICAgKm1hc2ssCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fbW9kaWZpZXJzLAorICAgIFhJR3JhYk1vZGlmaWVycyAgICAgKm1vZGlmaWVyc19pbm91dAorKTsKKworZXh0ZXJuIGludCBYSUdyYWJGb2N1c0luKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgIFdpbmRvdyAgICAgICAgICAgICAgZ3JhYl93aW5kb3csCisgICAgaW50ICAgICAgICAgICAgICAgICBncmFiX21vZGUsCisgICAgaW50ICAgICAgICAgICAgICAgICBwYWlyZWRfZGV2aWNlX21vZGUsCisgICAgaW50ICAgICAgICAgICAgICAgICBvd25lcl9ldmVudHMsCisgICAgWElFdmVudE1hc2sgICAgICAgICAqbWFzaywKKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bV9tb2RpZmllcnMsCisgICAgWElHcmFiTW9kaWZpZXJzICAgICAqbW9kaWZpZXJzX2lub3V0CispOworCitleHRlcm4gaW50IFhJR3JhYlRvdWNoQmVnaW4oCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgV2luZG93ICAgICAgICAgICAgICBncmFiX3dpbmRvdywKKyAgICBpbnQgICAgICAgICAgICAgICAgIG93bmVyX2V2ZW50cywKKyAgICBYSUV2ZW50TWFzayAgICAgICAgICptYXNrLAorICAgIGludCAgICAgICAgICAgICAgICAgbnVtX21vZGlmaWVycywKKyAgICBYSUdyYWJNb2RpZmllcnMgICAgICptb2RpZmllcnNfaW5vdXQKKyk7CisKK2V4dGVybiBTdGF0dXMgWElVbmdyYWJCdXR0b24oCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgaW50ICAgICAgICAgICAgICAgICBidXR0b24sCisgICAgV2luZG93ICAgICAgICAgICAgICBncmFiX3dpbmRvdywKKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bV9tb2RpZmllcnMsCisgICAgWElHcmFiTW9kaWZpZXJzICAgICAqbW9kaWZpZXJzCispOworCitleHRlcm4gU3RhdHVzIFhJVW5ncmFiS2V5Y29kZSgKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRpc3BsYXksCisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGtleWNvZGUsCisgICAgV2luZG93ICAgICAgICAgICAgICBncmFiX3dpbmRvdywKKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bV9tb2RpZmllcnMsCisgICAgWElHcmFiTW9kaWZpZXJzICAgICAqbW9kaWZpZXJzCispOworCitleHRlcm4gU3RhdHVzIFhJVW5ncmFiRW50ZXIoCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgV2luZG93ICAgICAgICAgICAgICBncmFiX3dpbmRvdywKKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bV9tb2RpZmllcnMsCisgICAgWElHcmFiTW9kaWZpZXJzICAgICAqbW9kaWZpZXJzCispOworCitleHRlcm4gU3RhdHVzIFhJVW5ncmFiRm9jdXNJbigKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRpc3BsYXksCisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICBXaW5kb3cgICAgICAgICAgICAgIGdyYWJfd2luZG93LAorICAgIGludCAgICAgICAgICAgICAgICAgbnVtX21vZGlmaWVycywKKyAgICBYSUdyYWJNb2RpZmllcnMgICAgICptb2RpZmllcnMKKyk7CisKK2V4dGVybiBTdGF0dXMgWElVbmdyYWJUb3VjaEJlZ2luKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgIFdpbmRvdyAgICAgICAgICAgICAgZ3JhYl93aW5kb3csCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fbW9kaWZpZXJzLAorICAgIFhJR3JhYk1vZGlmaWVycyAgICAgKm1vZGlmaWVycworKTsKKworZXh0ZXJuIEF0b20gKlhJTGlzdFByb3BlcnRpZXMoCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgaW50ICAgICAgICAgICAgICAgICAqbnVtX3Byb3BzX3JldHVybgorKTsKKworZXh0ZXJuIHZvaWQgWElDaGFuZ2VQcm9wZXJ0eSgKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRpc3BsYXksCisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICBBdG9tICAgICAgICAgICAgICAgIHByb3BlcnR5LAorICAgIEF0b20gICAgICAgICAgICAgICAgdHlwZSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1vZGUsCisgICAgdW5zaWduZWQgY2hhciAgICAgICAqZGF0YSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bV9pdGVtcworKTsKKworZXh0ZXJuIHZvaWQKK1hJRGVsZXRlUHJvcGVydHkoCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgQXRvbSAgICAgICAgICAgICAgICBwcm9wZXJ0eQorKTsKKworZXh0ZXJuIFN0YXR1cworWElHZXRQcm9wZXJ0eSgKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRpc3BsYXksCisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICBBdG9tICAgICAgICAgICAgICAgIHByb3BlcnR5LAorICAgIGxvbmcgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgIGxvbmcgICAgICAgICAgICAgICAgbGVuZ3RoLAorICAgIEJvb2wgICAgICAgICAgICAgICAgZGVsZXRlX3Byb3BlcnR5LAorICAgIEF0b20gICAgICAgICAgICAgICAgdHlwZSwKKyAgICBBdG9tICAgICAgICAgICAgICAgICp0eXBlX3JldHVybiwKKyAgICBpbnQgICAgICAgICAgICAgICAgICpmb3JtYXRfcmV0dXJuLAorICAgIHVuc2lnbmVkIGxvbmcgICAgICAgKm51bV9pdGVtc19yZXR1cm4sCisgICAgdW5zaWduZWQgbG9uZyAgICAgICAqYnl0ZXNfYWZ0ZXJfcmV0dXJuLAorICAgIHVuc2lnbmVkIGNoYXIgICAgICAgKipkYXRhCispOworCitleHRlcm4gdm9pZCBYSUZyZWVEZXZpY2VJbmZvKFhJRGV2aWNlSW5mbyAgICAgICAqaW5mbyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBYSU5QVVQyX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWElwcm90by5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YSXByb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwYWI2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWElwcm90by5oCkBAIC0wLDAgKzEsMTc1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworQ29weXJpZ2h0IDE5ODkgYnkgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnksIFBhbG8gQWx0bywgQ2FsaWZvcm5pYS4KKworCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBIZXdsZXR0LVBhY2thcmQgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworSEVXTEVUVC1QQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorSEVXTEVUVC1QQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAorQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9YSVBST1RPX0gKKyNkZWZpbmUgX1hJUFJPVE9fSAorCisjaW5jbHVkZSA8WDExL1hwcm90by5oPgorI2luY2x1ZGUgPFgxMS9YLmg+CisKKy8qIG1ha2Ugc3VyZSB0eXBlcyBoYXZlIHJpZ2h0IHNpemVzIGZvciBwcm90b2NvbCBzdHJ1Y3R1cmVzLiAqLworI2RlZmluZSBXaW5kb3cgQ0FSRDMyCisjZGVmaW5lIFRpbWUgQ0FSRDMyCisjZGVmaW5lIEtleUNvZGUgQ0FSRDgKKyNkZWZpbmUgTWFzayBDQVJEMzIKKyNkZWZpbmUgQXRvbSBDQVJEMzIKKyNkZWZpbmUgQ3Vyc29yIENBUkQzMgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogbnVtYmVyIG9mIGV2ZW50cywgZXJyb3JzLCBhbmQgZXh0ZW5zaW9uIG5hbWUuCisgKgorICovCisKKyNkZWZpbmUgTU9SRV9FVkVOVFMJMHg4MAorI2RlZmluZSBERVZJQ0VfQklUUwkweDdGCisKKyNkZWZpbmUgSW5wdXRDbGFzc0JpdHMJMHgzRgkvKiBiaXRzIGluIG1vZGUgZmllbGQgZm9yIGlucHV0IGNsYXNzZXMgKi8KKyNkZWZpbmUgTW9kZUJpdHNTaGlmdAk2CS8qIGFtb3VudCB0byBzaGlmdCB0aGUgcmVtYWluaW5nIGJpdHMgICAqLworCisjZGVmaW5lIG51bUlucHV0Q2xhc3NlcyA3CisKKyNkZWZpbmUgSUVWRU5UUyAgICAgICAgIDE3ICAgICAgIC8qIGRvZXMgTk9UIGluY2x1ZGUgZ2VuZXJpYyBldmVudHMgKi8KKyNkZWZpbmUgSUVSUk9SUyAgICAgICAgIDUKKyNkZWZpbmUgSVJFUVVFU1RTICAgICAgIDM5CisKKyNkZWZpbmUgQ0xJRU5UX1JFUSAgICAgIDEKKwordHlwZWRlZiBzdHJ1Y3QgIF9YRXh0RXZlbnRJbmZvCisgICAgeworICAgIE1hc2sJbWFzazsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl3b3JkOworICAgIH0gWEV4dEV2ZW50SW5mbzsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICpQb2ludGVyOworCitzdHJ1Y3QgdG1hc2sKKyAgICB7CisgICAgTWFzawltYXNrOworICAgIFBvaW50ZXIgICAgIGRldjsKKyAgICB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRXZlbnQgY29uc3RhbnRzIHVzZWQgYnkgbGlicmFyeS4KKyAqCisgKi8KKworI2RlZmluZSBYSV9EZXZpY2VWYWx1YXRvcgkJMAorI2RlZmluZSBYSV9EZXZpY2VLZXlQcmVzcwkJMQorI2RlZmluZSBYSV9EZXZpY2VLZXlSZWxlYXNlCQkyCisjZGVmaW5lIFhJX0RldmljZUJ1dHRvblByZXNzCQkzCisjZGVmaW5lIFhJX0RldmljZUJ1dHRvblJlbGVhc2UJCTQKKyNkZWZpbmUgWElfRGV2aWNlTW90aW9uTm90aWZ5CQk1CisjZGVmaW5lIFhJX0RldmljZUZvY3VzSW4JCTYKKyNkZWZpbmUgWElfRGV2aWNlRm9jdXNPdXQJCTcKKyNkZWZpbmUgWElfUHJveGltaXR5SW4JCQk4CisjZGVmaW5lIFhJX1Byb3hpbWl0eU91dAkJCTkKKyNkZWZpbmUgWElfRGV2aWNlU3RhdGVOb3RpZnkJCTEwCisjZGVmaW5lIFhJX0RldmljZU1hcHBpbmdOb3RpZnkJCTExCisjZGVmaW5lIFhJX0NoYW5nZURldmljZU5vdGlmeQkJMTIKKyNkZWZpbmUgWElfRGV2aWNlS2V5c3RhdGVOb3RpZnkJCTEzCisjZGVmaW5lIFhJX0RldmljZUJ1dHRvbnN0YXRlTm90aWZ5CTE0CisjZGVmaW5lIFhJX0RldmljZVByZXNlbmNlTm90aWZ5CQkxNQorI2RlZmluZSBYSV9EZXZpY2VQcm9wZXJ0eU5vdGlmeSAgICAgICAgIDE2CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQcm90b2NvbCByZXF1ZXN0IGNvbnN0YW50cworICoKKyAqLworCisjZGVmaW5lIFhfR2V0RXh0ZW5zaW9uVmVyc2lvbgkJMQorI2RlZmluZSBYX0xpc3RJbnB1dERldmljZXMJCTIKKyNkZWZpbmUgWF9PcGVuRGV2aWNlCQkJMworI2RlZmluZSBYX0Nsb3NlRGV2aWNlCQkJNAorI2RlZmluZSBYX1NldERldmljZU1vZGUJCQk1CisjZGVmaW5lIFhfU2VsZWN0RXh0ZW5zaW9uRXZlbnQJCTYKKyNkZWZpbmUgWF9HZXRTZWxlY3RlZEV4dGVuc2lvbkV2ZW50cwk3CisjZGVmaW5lIFhfQ2hhbmdlRGV2aWNlRG9udFByb3BhZ2F0ZUxpc3QgOAorI2RlZmluZSBYX0dldERldmljZURvbnRQcm9wYWdhdGVMaXN0CTkKKyNkZWZpbmUgWF9HZXREZXZpY2VNb3Rpb25FdmVudHMJCTEwCisjZGVmaW5lIFhfQ2hhbmdlS2V5Ym9hcmREZXZpY2UJCTExCisjZGVmaW5lIFhfQ2hhbmdlUG9pbnRlckRldmljZQkJMTIKKyNkZWZpbmUgWF9HcmFiRGV2aWNlCQkJMTMKKyNkZWZpbmUgWF9VbmdyYWJEZXZpY2UJCQkxNAorI2RlZmluZSBYX0dyYWJEZXZpY2VLZXkJCQkxNQorI2RlZmluZSBYX1VuZ3JhYkRldmljZUtleQkJMTYKKyNkZWZpbmUgWF9HcmFiRGV2aWNlQnV0dG9uCQkxNworI2RlZmluZSBYX1VuZ3JhYkRldmljZUJ1dHRvbgkJMTgKKyNkZWZpbmUgWF9BbGxvd0RldmljZUV2ZW50cwkJMTkKKyNkZWZpbmUgWF9HZXREZXZpY2VGb2N1cwkJMjAKKyNkZWZpbmUgWF9TZXREZXZpY2VGb2N1cwkJMjEKKyNkZWZpbmUgWF9HZXRGZWVkYmFja0NvbnRyb2wJCTIyCisjZGVmaW5lIFhfQ2hhbmdlRmVlZGJhY2tDb250cm9sCQkyMworI2RlZmluZSBYX0dldERldmljZUtleU1hcHBpbmcJCTI0CisjZGVmaW5lIFhfQ2hhbmdlRGV2aWNlS2V5TWFwcGluZwkyNQorI2RlZmluZSBYX0dldERldmljZU1vZGlmaWVyTWFwcGluZwkyNgorI2RlZmluZSBYX1NldERldmljZU1vZGlmaWVyTWFwcGluZwkyNworI2RlZmluZSBYX0dldERldmljZUJ1dHRvbk1hcHBpbmcJMjgKKyNkZWZpbmUgWF9TZXREZXZpY2VCdXR0b25NYXBwaW5nCTI5CisjZGVmaW5lIFhfUXVlcnlEZXZpY2VTdGF0ZQkJMzAKKyNkZWZpbmUgWF9TZW5kRXh0ZW5zaW9uRXZlbnQJCTMxCisjZGVmaW5lIFhfRGV2aWNlQmVsbAkJCTMyCisjZGVmaW5lIFhfU2V0RGV2aWNlVmFsdWF0b3JzCQkzMworI2RlZmluZSBYX0dldERldmljZUNvbnRyb2wJCTM0CisjZGVmaW5lIFhfQ2hhbmdlRGV2aWNlQ29udHJvbAkJMzUKKy8qIFhJIDEuNSAqLworI2RlZmluZSBYX0xpc3REZXZpY2VQcm9wZXJ0aWVzICAgICAgICAgIDM2CisjZGVmaW5lIFhfQ2hhbmdlRGV2aWNlUHJvcGVydHkgICAgICAgICAgMzcKKyNkZWZpbmUgWF9EZWxldGVEZXZpY2VQcm9wZXJ0eSAgICAgICAgICAzOAorI2RlZmluZSBYX0dldERldmljZVByb3BlcnR5ICAgICAgICAgICAgIDM5CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQcm90b2NvbCByZXF1ZXN0IGFuZCByZXBseSBzdHJ1Y3R1cmVzLgorICoKKyAqIEdldEV4dGVuc2lvblZlcnNpb24uCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOyAgICAgICAvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZSAgICovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgLyogYWx3YXlzIFhfR2V0RXh0ZW5zaW9uVmVyc2lvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNgluYnl0ZXMgQjE2OworICAgIENBUkQ4CXBhZDEsIHBhZDI7Cit9IHhHZXRFeHRlbnNpb25WZXJzaW9uUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVwVHlwZTsJLyogWF9SZXBseQkJCSovCisgICAgQ0FSRDgJUmVwVHlwZTsJLyogYWx3YXlzIFhfR2V0RXh0ZW5zaW9uVmVyc2lvbiAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CW1ham9yX3ZlcnNpb24gQjE2OworICAgIENBUkQxNgltaW5vcl92ZXJzaW9uIEIxNjsKKyAgICBCT09MCXByZXNlbnQ7CisgICAgQ0FSRDgJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworfSB4R2V0RXh0ZW5zaW9uVmVyc2lvblJlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTGlzdElucHV0RGV2aWNlcy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsJLyogYWx3YXlzIFhfTGlzdElucHV0RGV2aWNlcwkqLworICAgIENBUkQxNglsZW5ndGggQjE2OworfSB4TGlzdElucHV0RGV2aWNlc1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CS8qIFhfUmVwbHkJCQkqLworICAgIENBUkQ4CVJlcFR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9MaXN0SW5wdXREZXZpY2VzCSovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEOAluZGV2aWNlczsKKyAgICBDQVJEOAlwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQzMglwYWQwMSBCMzI7CisgICAgQ0FSRDMyCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIJcGFkMDMgQjMyOworICAgIENBUkQzMglwYWQwNCBCMzI7CisgICAgQ0FSRDMyCXBhZDA1IEIzMjsKK30geExpc3RJbnB1dERldmljZXNSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgX3hEZXZpY2VJbmZvICp4RGV2aWNlSW5mb1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX3hBbnlDbGFzc2luZm8gKnhBbnlDbGFzc1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX3hBbnlDbGFzc2luZm8geworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsKKyNlbmRpZgorICAgIENBUkQ4CWxlbmd0aDsKKyAgICB9IHhBbnlDbGFzc0luZm87CisKK3R5cGVkZWYgc3RydWN0IF94RGV2aWNlSW5mbyB7CisgICAgQ0FSRDMyCXR5cGUgQjMyOworICAgIENBUkQ4CWlkOworICAgIENBUkQ4CW51bV9jbGFzc2VzOworICAgIENBUkQ4CXVzZTsgICAgICAvKiBJc1hQb2ludGVyIHwgSXNYS2V5Ym9hcmQgfCBJc1hFeHRlbnNpb24uLi4gKi8KKyAgICBDQVJEOAlhdHRhY2hlZDsgLyogaWQgb2YgbWFzdGVyIGRldiAoaWYgSXNYRXh0ZW5zaW9uLi4pICovCisgICAgfSB4RGV2aWNlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX3hLZXlJbmZvICp4S2V5SW5mb1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX3hLZXlJbmZvIHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDgJY19jbGFzczsKKyNlbHNlCisgICAgQ0FSRDgJY2xhc3M7CisjZW5kaWYKKyAgICBDQVJEOAlsZW5ndGg7CisgICAgS2V5Q29kZQltaW5fa2V5Y29kZTsKKyAgICBLZXlDb2RlCW1heF9rZXljb2RlOworICAgIENBUkQxNgludW1fa2V5cyBCMTY7CisgICAgQ0FSRDgJcGFkMSxwYWQyOworICAgIH0geEtleUluZm87CisKK3R5cGVkZWYgc3RydWN0IF94QnV0dG9uSW5mbyAqeEJ1dHRvbkluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF94QnV0dG9uSW5mbyB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CisjZWxzZQorICAgIENBUkQ4CWNsYXNzOworI2VuZGlmCisgICAgQ0FSRDgJbGVuZ3RoOworICAgIENBUkQxNgludW1fYnV0dG9ucyBCMTY7CisgICAgfSB4QnV0dG9uSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX3hWYWx1YXRvckluZm8gKnhWYWx1YXRvckluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF94VmFsdWF0b3JJbmZvIHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDgJY19jbGFzczsKKyNlbHNlCisgICAgQ0FSRDgJY2xhc3M7CisjZW5kaWYKKyAgICBDQVJEOAlsZW5ndGg7CisgICAgQ0FSRDgJbnVtX2F4ZXM7CisgICAgQ0FSRDgJbW9kZTsKKyAgICBDQVJEMzIJbW90aW9uX2J1ZmZlcl9zaXplIEIzMjsKKyAgICB9IHhWYWx1YXRvckluZm87CisKK3R5cGVkZWYgc3RydWN0IF94QXhpc0luZm8gKnhBeGlzSW5mb1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX3hBeGlzSW5mbyB7CisgICAgQ0FSRDMyCXJlc29sdXRpb24gQjMyOworICAgIENBUkQzMgltaW5fdmFsdWUgQjMyOworICAgIENBUkQzMgltYXhfdmFsdWUgQjMyOworICAgIH0geEF4aXNJbmZvOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogT3BlbkRldmljZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX09wZW5EZXZpY2UJCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworfSB4T3BlbkRldmljZVJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CS8qIFhfUmVwbHkJCQkqLworICAgIENBUkQ4CVJlcFR5cGU7CS8qIGFsd2F5cyBYX09wZW5EZXZpY2UJCSovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEOAludW1fY2xhc3NlczsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7CisgICAgQ0FSRDMyCXBhZDAwIEIzMjsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworICAgIH0geE9wZW5EZXZpY2VSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsKKyNlbmRpZgorICAgIENBUkQ4CWV2ZW50X3R5cGVfYmFzZTsKKyAgICB9IHhJbnB1dENsYXNzSW5mbzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENsb3NlRGV2aWNlLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfQ2xvc2VEZXZpY2UJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOCAgICAgICBkZXZpY2VpZDsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7Cit9IHhDbG9zZURldmljZVJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNldERldmljZU1vZGUuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NldERldmljZU1vZGUJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOCAgICAgICBkZXZpY2VpZDsKKyAgICBDQVJEOCAgICAgICBtb2RlOworICAgIEJZVEUJcGFkMSwgcGFkMjsKK30geFNldERldmljZU1vZGVSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5CQkJKi8KKyAgICBDQVJEOAlSZXBUeXBlOwkvKiBhbHdheXMgWF9TZXREZXZpY2VNb2RlCSovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEOAlzdGF0dXM7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQzMglwYWQwMSBCMzI7CisgICAgQ0FSRDMyCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIJcGFkMDMgQjMyOworICAgIENBUkQzMglwYWQwNCBCMzI7CisgICAgQ0FSRDMyCXBhZDA1IEIzMjsKK30geFNldERldmljZU1vZGVSZXBseTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNlbGVjdEV4dGVuc2lvbkV2ZW50LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfU2VsZWN0RXh0ZW5zaW9uRXZlbnQgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cJd2luZG93IEIzMjsKKyAgICBDQVJEMTYJY291bnQgQjE2OworICAgIENBUkQxNglwYWQwMCBCMTY7Cit9IHhTZWxlY3RFeHRlbnNpb25FdmVudFJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldFNlbGVjdGVkRXh0ZW5zaW9uRXZlbnQuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBYX0dldFNlbGVjdGVkRXh0ZW5zaW9uRXZlbnRzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgV2luZG93CXdpbmRvdyBCMzI7Cit9IHhHZXRTZWxlY3RlZEV4dGVuc2lvbkV2ZW50c1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CS8qIFhfUmVwbHkJCQkqLworICAgIENBUkQ4CVJlcFR5cGU7CS8qIEdldFNlbGVjdGVkRXh0ZW5zaW9uRXZlbnRzCSovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJdGhpc19jbGllbnRfY291bnQgQjE2OworICAgIENBUkQxNglhbGxfY2xpZW50c19jb3VudCBCMTY7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIJcGFkMDUgQjMyOworfSB4R2V0U2VsZWN0ZWRFeHRlbnNpb25FdmVudHNSZXBseTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENoYW5nZURldmljZURvbnRQcm9wYWdhdGVMaXN0LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogWF9DaGFuZ2VEZXZpY2VEb250UHJvcGFnYXRlTGlzdCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwl3aW5kb3cgQjMyOworICAgIENBUkQxNgljb3VudCBCMTY7CisgICAgQ0FSRDgJbW9kZTsKKyAgICBCWVRFCXBhZDsKK30geENoYW5nZURldmljZURvbnRQcm9wYWdhdGVMaXN0UmVxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0RGV2aWNlRG9udFByb3BhZ2F0ZUxpc3QuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBYX0dldERldmljZURvbnRQcm9wYWdhdGVMaXN0ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgV2luZG93CXdpbmRvdyBCMzI7Cit9IHhHZXREZXZpY2VEb250UHJvcGFnYXRlTGlzdFJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CS8qIFhfUmVwbHkJCQkqLworICAgIENBUkQ4CVJlcFR5cGU7ICAgICAgICAvKiBHZXREZXZpY2VEb250UHJvcGFnYXRlTGlzdCAgICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJY291bnQgQjE2OworICAgIENBUkQxNglwYWQwMCBCMTY7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIJcGFkMDUgQjMyOworICAgIH0geEdldERldmljZURvbnRQcm9wYWdhdGVMaXN0UmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXREZXZpY2VNb3Rpb25FdmVudHMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9HZXREZXZpY2VNb3Rpb25FdmVudHMqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFRpbWUJc3RhcnQgQjMyOworICAgIFRpbWUJc3RvcCBCMzI7CisgICAgQ0FSRDgJZGV2aWNlaWQ7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworfSB4R2V0RGV2aWNlTW90aW9uRXZlbnRzUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVwVHlwZTsJLyogWF9SZXBseSAqLworICAgIENBUkQ4CVJlcFR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9HZXREZXZpY2VNb3Rpb25FdmVudHMgICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJbkV2ZW50cyBCMzI7CisgICAgQ0FSRDgJYXhlczsKKyAgICBDQVJEOAltb2RlOworICAgIEJZVEUJcGFkMSwgcGFkMjsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworfSB4R2V0RGV2aWNlTW90aW9uRXZlbnRzUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDaGFuZ2VLZXlib2FyZERldmljZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIFhfQ2hhbmdlS2V5Ym9hcmREZXZpY2UJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAlkZXZpY2VpZDsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7Cit9IHhDaGFuZ2VLZXlib2FyZERldmljZVJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CS8qIFhfUmVwbHkJCQkqLworICAgIENBUkQ4CVJlcFR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9DaGFuZ2VLZXlib2FyZERldmljZSovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBDQVJEOAlzdGF0dXM7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQzMglwYWQwMSBCMzI7CisgICAgQ0FSRDMyCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIJcGFkMDMgQjMyOworICAgIENBUkQzMglwYWQwNCBCMzI7CisgICAgQ0FSRDMyCXBhZDA1IEIzMjsKKyAgICB9IHhDaGFuZ2VLZXlib2FyZERldmljZVJlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2hhbmdlUG9pbnRlckRldmljZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIFhfQ2hhbmdlUG9pbnRlckRldmljZQkqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CXhheGlzOworICAgIENBUkQ4CXlheGlzOworICAgIENBUkQ4CWRldmljZWlkOworICAgIEJZVEUJcGFkMTsKK30geENoYW5nZVBvaW50ZXJEZXZpY2VSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5CQkJKi8KKyAgICBDQVJEOAlSZXBUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfQ2hhbmdlUG9pbnRlckRldmljZSAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7ICAvKiAwICovCisgICAgQ0FSRDgJc3RhdHVzOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworICAgIENBUkQzMglwYWQwNSBCMzI7CisgICAgfSB4Q2hhbmdlUG9pbnRlckRldmljZVJlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR3JhYkRldmljZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dyYWJEZXZpY2UgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cJZ3JhYldpbmRvdyBCMzI7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEMTYJZXZlbnRfY291bnQgQjE2OworICAgIENBUkQ4CXRoaXNfZGV2aWNlX21vZGU7CisgICAgQ0FSRDgJb3RoZXJfZGV2aWNlc19tb2RlOworICAgIEJPT0wJb3duZXJFdmVudHM7CisgICAgQ0FSRDgJZGV2aWNlaWQ7CisgICAgQ0FSRDE2CXBhZDAxIEIxNjsKK30geEdyYWJEZXZpY2VSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5CQkJKi8KKyAgICBDQVJEOAlSZXBUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR3JhYkRldmljZQkqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7ICAvKiAwICovCisgICAgQ0FSRDgJc3RhdHVzOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworICAgIENBUkQzMglwYWQwNSBCMzI7CisgICAgfSB4R3JhYkRldmljZVJlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVW5ncmFiRGV2aWNlLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfVW5HcmFiRGV2aWNlCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VpZDsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7Cit9IHhVbmdyYWJEZXZpY2VSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHcmFiRGV2aWNlS2V5LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR3JhYkRldmljZUtleQkqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwlncmFiV2luZG93IEIzMjsKKyAgICBDQVJEMTYJZXZlbnRfY291bnQgQjE2OworICAgIENBUkQxNgltb2RpZmllcnMgQjE2OworICAgIENBUkQ4CW1vZGlmaWVyX2RldmljZTsKKyAgICBDQVJEOAlncmFiYmVkX2RldmljZTsKKyAgICBDQVJEOAlrZXk7CisgICAgQllURQl0aGlzX2RldmljZV9tb2RlOworICAgIEJZVEUJb3RoZXJfZGV2aWNlc19tb2RlOworICAgIEJPT0wJb3duZXJFdmVudHM7CisgICAgQllURQlwYWQxLCBwYWQyOworfSB4R3JhYkRldmljZUtleVJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFVuZ3JhYkRldmljZUtleS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX1VuZ3JhYkRldmljZUtleQkqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwlncmFiV2luZG93IEIzMjsKKyAgICBDQVJEMTYJbW9kaWZpZXJzIEIxNjsKKyAgICBDQVJEOAltb2RpZmllcl9kZXZpY2U7CisgICAgQ0FSRDgJa2V5OworICAgIENBUkQ4CWdyYWJiZWRfZGV2aWNlOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geFVuZ3JhYkRldmljZUtleVJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdyYWJEZXZpY2VCdXR0b24uCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9HcmFiRGV2aWNlQnV0dG9uCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgV2luZG93CWdyYWJXaW5kb3cgQjMyOworICAgIENBUkQ4CWdyYWJiZWRfZGV2aWNlOworICAgIENBUkQ4CW1vZGlmaWVyX2RldmljZTsKKyAgICBDQVJEMTYJZXZlbnRfY291bnQgQjE2OworICAgIENBUkQxNgltb2RpZmllcnMgQjE2OworICAgIEJZVEUJdGhpc19kZXZpY2VfbW9kZTsKKyAgICBCWVRFCW90aGVyX2RldmljZXNfbW9kZTsKKyAgICBDQVJEOAlidXR0b247CisgICAgQk9PTAlvd25lckV2ZW50czsKKyAgICBCWVRFCXBhZDEsIHBhZDI7Cit9IHhHcmFiRGV2aWNlQnV0dG9uUmVxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVW5ncmFiRGV2aWNlQnV0dG9uLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfVW5ncmFiRGV2aWNlQnV0dG9uCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgV2luZG93CWdyYWJXaW5kb3cgQjMyOworICAgIENBUkQxNgltb2RpZmllcnMgQjE2OworICAgIENBUkQ4CW1vZGlmaWVyX2RldmljZTsKKyAgICBDQVJEOAlidXR0b247CisgICAgQ0FSRDgJZ3JhYmJlZF9kZXZpY2U7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworfSB4VW5ncmFiRGV2aWNlQnV0dG9uUmVxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQWxsb3dEZXZpY2VFdmVudHMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9BbGxvd0RldmljZUV2ZW50cwkqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFRpbWUJdGltZSBCMzI7CisgICAgQ0FSRDgJbW9kZTsKKyAgICBDQVJEOAlkZXZpY2VpZDsKKyAgICBCWVRFCXBhZDEsIHBhZDI7Cit9IHhBbGxvd0RldmljZUV2ZW50c1JlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldERldmljZUZvY3VzLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsgICAgICAgIC8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICAgKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR2V0RGV2aWNlRm9jdXMJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAlkZXZpY2VpZDsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7Cit9IHhHZXREZXZpY2VGb2N1c1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CS8qIFhfUmVwbHkJCQkqLworICAgIENBUkQ4CVJlcFR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9HZXREZXZpY2VGb2N1cwkqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCWZvY3VzIEIzMjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CXJldmVydFRvOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICB9IHhHZXREZXZpY2VGb2N1c1JlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2V0RGV2aWNlRm9jdXMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOyAgICAgICAgLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUgICAqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9TZXREZXZpY2VGb2N1cwkqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwlmb2N1cyBCMzI7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlyZXZlcnRUbzsKKyAgICBDQVJEOAlkZXZpY2U7CisgICAgQ0FSRDE2CXBhZDAxIEIxNjsKK30geFNldERldmljZUZvY3VzUmVxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0RmVlZGJhY2tDb250cm9sLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogWF9HZXRGZWVkYmFja0NvbnRyb2wJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAlkZXZpY2VpZDsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7Cit9IHhHZXRGZWVkYmFja0NvbnRyb2xSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5CQkJKi8KKyAgICBDQVJEOAlSZXBUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR2V0RmVlZGJhY2tDb250cm9sCSovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJbnVtX2ZlZWRiYWNrcyBCMTY7CisgICAgQ0FSRDE2CXBhZDAxIEIxNjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIJcGFkMDUgQjMyOworICAgIENBUkQzMglwYWQwNiBCMzI7Cit9IHhHZXRGZWVkYmFja0NvbnRyb2xSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOwkvKiBmZWVkYmFjayBjbGFzcwkJKi8KKyNlbHNlCisgICAgQ0FSRDgJY2xhc3M7CQkvKiBmZWVkYmFjayBjbGFzcwkJKi8KKyNlbmRpZgorICAgIENBUkQ4CWlkOwkJLyogZmVlZGJhY2sgaWQJCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIGZlZWRiYWNrIGxlbmd0aAkJKi8KK30geEZlZWRiYWNrU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDggICBjX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOCAgIGNsYXNzOworI2VuZGlmCisgICAgQ0FSRDggICBpZDsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgQ0FSRDE2ICBwaXRjaCBCMTY7CisgICAgQ0FSRDE2ICBkdXJhdGlvbiBCMTY7CisgICAgQ0FSRDMyICBsZWRfbWFzayBCMzI7CisgICAgQ0FSRDMyICBsZWRfdmFsdWVzIEIzMjsKKyAgICBCT09MICAgIGdsb2JhbF9hdXRvX3JlcGVhdDsKKyAgICBDQVJEOCAgIGNsaWNrOworICAgIENBUkQ4ICAgcGVyY2VudDsKKyAgICBCWVRFICAgIHBhZDsKKyAgICBCWVRFICAgIGF1dG9fcmVwZWF0c1szMl07Cit9IHhLYmRGZWVkYmFja1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4ICAgY19jbGFzczsKKyNlbHNlCisgICAgQ0FSRDggICBjbGFzczsKKyNlbmRpZgorICAgIENBUkQ4ICAgaWQ7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIENBUkQ4ICAgcGFkMSxwYWQyOworICAgIENBUkQxNiAgYWNjZWxOdW0gQjE2OworICAgIENBUkQxNiAgYWNjZWxEZW5vbSBCMTY7CisgICAgQ0FSRDE2ICB0aHJlc2hvbGQgQjE2OworfSB4UHRyRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOwkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbHNlCisgICAgQ0FSRDgJY2xhc3M7CQkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbmRpZgorICAgIENBUkQ4CWlkOworICAgIENBUkQxNglsZW5ndGggQjE2OwkvKiBmZWVkYmFjayBsZW5ndGgJCSovCisgICAgQ0FSRDMyCXJlc29sdXRpb24gQjMyOworICAgIElOVDMyCW1pbl92YWx1ZSBCMzI7CisgICAgSU5UMzIJbWF4X3ZhbHVlIEIzMjsKK30geEludGVnZXJGZWVkYmFja1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsJCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDgJaWQ7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIGZlZWRiYWNrIGxlbmd0aAkJKi8KKyAgICBDQVJEMTYJbWF4X3N5bWJvbHMgQjE2OworICAgIENBUkQxNgludW1fc3ltc19zdXBwb3J0ZWQgQjE2OworfSB4U3RyaW5nRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOwkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbHNlCisgICAgQ0FSRDgJY2xhc3M7CQkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbmRpZgorICAgIENBUkQ4CWlkOworICAgIENBUkQxNglsZW5ndGggQjE2OwkvKiBmZWVkYmFjayBsZW5ndGgJCSovCisgICAgQ0FSRDgJcGVyY2VudDsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7CisgICAgQ0FSRDE2CXBpdGNoIEIxNjsKKyAgICBDQVJEMTYJZHVyYXRpb24gQjE2OworfSB4QmVsbEZlZWRiYWNrU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDgJY19jbGFzczsJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZWxzZQorICAgIENBUkQ4CWNsYXNzOwkJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZW5kaWYKKyAgICBDQVJEOAlpZDsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJLyogZmVlZGJhY2sgbGVuZ3RoCQkqLworICAgIENBUkQzMglsZWRfbWFzayBCMzI7CisgICAgQ0FSRDMyCWxlZF92YWx1ZXMgQjMyOworfSB4TGVkRmVlZGJhY2tTdGF0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENoYW5nZUZlZWRiYWNrQ29udHJvbC4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIFhfQ2hhbmdlRmVlZGJhY2tDb250cm9sCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCW1hc2sgQjMyOworICAgIENBUkQ4CWRldmljZWlkOworICAgIENBUkQ4CWZlZWRiYWNraWQ7CisgICAgQllURQlwYWQxLCBwYWQyOworfSB4Q2hhbmdlRmVlZGJhY2tDb250cm9sUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsJCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDgJaWQ7CQkvKiBmZWVkYmFjayBpZAkJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJLyogZmVlZGJhY2sgbGVuZ3RoCQkqLworfSB4RmVlZGJhY2tDdGw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDgJY19jbGFzczsJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZWxzZQorICAgIENBUkQ4CWNsYXNzOwkJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZW5kaWYKKyAgICBDQVJEOAlpZDsJCS8qIGZlZWRiYWNrIGxlbmd0aAkJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJLyogZmVlZGJhY2sgbGVuZ3RoCQkqLworICAgIEtleUNvZGUJa2V5OworICAgIENBUkQ4CWF1dG9fcmVwZWF0X21vZGU7CisgICAgSU5UOAljbGljazsKKyAgICBJTlQ4CXBlcmNlbnQ7CisgICAgSU5UMTYJcGl0Y2ggQjE2OworICAgIElOVDE2CWR1cmF0aW9uIEIxNjsKKyAgICBDQVJEMzIJbGVkX21hc2sgQjMyOworICAgIENBUkQzMglsZWRfdmFsdWVzIEIzMjsKK30geEtiZEZlZWRiYWNrQ3RsOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsJCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDgJaWQ7CQkvKiBmZWVkYmFjayBpZAkJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJLyogZmVlZGJhY2sgbGVuZ3RoCQkqLworICAgIENBUkQ4CXBhZDEscGFkMjsKKyAgICBJTlQxNgludW0gQjE2OworICAgIElOVDE2CWRlbm9tIEIxNjsKKyAgICBJTlQxNgl0aHJlc2ggQjE2OworfSB4UHRyRmVlZGJhY2tDdGw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDgJY19jbGFzczsJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZWxzZQorICAgIENBUkQ4CWNsYXNzOwkJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZW5kaWYKKyAgICBDQVJEOAlpZDsJCS8qIGZlZWRiYWNrIGlkCQkqLworICAgIENBUkQxNglsZW5ndGggQjE2OwkvKiBmZWVkYmFjayBsZW5ndGgJCSovCisgICAgSU5UMzIJaW50X3RvX2Rpc3BsYXkgQjMyOworfSB4SW50ZWdlckZlZWRiYWNrQ3RsOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsJCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDgJaWQ7CQkvKiBmZWVkYmFjayBpZAkJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJLyogZmVlZGJhY2sgbGVuZ3RoCQkqLworICAgIENBUkQ4CXBhZDEscGFkMjsKKyAgICBDQVJEMTYJbnVtX2tleXN5bXMgQjE2OworfSB4U3RyaW5nRmVlZGJhY2tDdGw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDgJY19jbGFzczsJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZWxzZQorICAgIENBUkQ4CWNsYXNzOwkJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZW5kaWYKKyAgICBDQVJEOAlpZDsJCS8qIGZlZWRiYWNrIGlkCQkqLworICAgIENBUkQxNglsZW5ndGggQjE2OwkvKiBmZWVkYmFjayBsZW5ndGgJCSovCisgICAgSU5UOAlwZXJjZW50OworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBJTlQxNglwaXRjaCBCMTY7CisgICAgSU5UMTYJZHVyYXRpb24gQjE2OworfSB4QmVsbEZlZWRiYWNrQ3RsOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsJCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDgJaWQ7CQkvKiBmZWVkYmFjayBpZAkJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJLyogZmVlZGJhY2sgbGVuZ3RoCQkqLworICAgIENBUkQzMglsZWRfbWFzayBCMzI7CisgICAgQ0FSRDMyCWxlZF92YWx1ZXMgQjMyOworfSB4TGVkRmVlZGJhY2tDdGw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXREZXZpY2VLZXlNYXBwaW5nLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsgICAgICAgIC8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICAgKi8KKyAgICBDQVJEOAlSZXFUeXBlOwkvKiBhbHdheXMgWF9HZXREZXZpY2VLZXlNYXBwaW5nICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJZGV2aWNlaWQ7CisgICAgS2V5Q29kZQlmaXJzdEtleUNvZGU7CisgICAgQ0FSRDgJY291bnQ7CisgICAgQllURQlwYWQxOworfSB4R2V0RGV2aWNlS2V5TWFwcGluZ1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CS8qIFhfUmVwbHkJCQkqLworICAgIENBUkQ4CVJlcFR5cGU7CS8qIGFsd2F5cyBYX0dldERldmljZUtleU1hcHBpbmcgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQ4CWtleVN5bXNQZXJLZXlDb2RlOworICAgIENBUkQ4CXBhZDA7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7Cit9IHhHZXREZXZpY2VLZXlNYXBwaW5nUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDaGFuZ2VEZXZpY2VLZXlNYXBwaW5nLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsgICAgICAgIC8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICAgKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfQ2hhbmdlRGV2aWNlS2V5TWFwcGluZyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWRldmljZWlkOworICAgIEtleUNvZGUJZmlyc3RLZXlDb2RlOworICAgIENBUkQ4CWtleVN5bXNQZXJLZXlDb2RlOworICAgIENBUkQ4CWtleUNvZGVzOworfSB4Q2hhbmdlRGV2aWNlS2V5TWFwcGluZ1JlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldERldmljZU1vZGlmaWVyTWFwcGluZy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7ICAgICAgICAvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZSAgICovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dldERldmljZU1vZGlmaWVyTWFwcGluZyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWRldmljZWlkOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geEdldERldmljZU1vZGlmaWVyTWFwcGluZ1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlSZXBUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEOAludW1LZXlQZXJNb2RpZmllcjsKKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworfSB4R2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZXREZXZpY2VNb2RpZmllck1hcHBpbmcuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOyAgICAgICAgLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUgICAqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9TZXREZXZpY2VNb2RpZmllck1hcHBpbmcgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAlkZXZpY2VpZDsKKyAgICBDQVJEOAludW1LZXlQZXJNb2RpZmllcjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7Cit9IHhTZXREZXZpY2VNb2RpZmllck1hcHBpbmdSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJUmVwVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX1NldERldmljZU1vZGlmaWVyTWFwcGluZyAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJc3VjY2VzczsKKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworfSB4U2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXREZXZpY2VCdXR0b25NYXBwaW5nLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogWF9HZXREZXZpY2VCdXR0b25NYXBwaW5nICAgICAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWRldmljZWlkOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geEdldERldmljZUJ1dHRvbk1hcHBpbmdSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJUmVwVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dldERldmljZUJ1dHRvbk1hcHBpbmcgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQ4CW5FbHRzOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworICAgIENBUkQzMglwYWQwNSBCMzI7Cit9IHhHZXREZXZpY2VCdXR0b25NYXBwaW5nUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZXREZXZpY2VCdXR0b25NYXBwaW5nLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogWF9TZXREZXZpY2VCdXR0b25NYXBwaW5nICAgICAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWRldmljZWlkOworICAgIENBUkQ4CW1hcF9sZW5ndGg7CisgICAgQllURQlwYWQxLCBwYWQyOworfSB4U2V0RGV2aWNlQnV0dG9uTWFwcGluZ1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJUmVwVHlwZTsJLyogYWx3YXlzIFhfU2V0RGV2aWNlQnV0dG9uTWFwcGluZyAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJc3RhdHVzOworICAgIEJZVEUJcGFkMDsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geFNldERldmljZUJ1dHRvbk1hcHBpbmdSZXBseTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFF1ZXJ5RGV2aWNlU3RhdGUuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9RdWVyeURldmljZVN0YXRlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJZGV2aWNlaWQ7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworfSB4UXVlcnlEZXZpY2VTdGF0ZVJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJUmVwVHlwZTsJLyogYWx3YXlzIFhfUXVlcnlEZXZpY2VTdGF0ZQkqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJbnVtX2NsYXNzZXM7CisgICAgQllURQlwYWQwOworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworfSB4UXVlcnlEZXZpY2VTdGF0ZVJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CisjZWxzZQorICAgIENBUkQ4CWNsYXNzOworI2VuZGlmCisgICAgQ0FSRDgJbGVuZ3RoOworICAgIENBUkQ4CW51bV9rZXlzOworICAgIEJZVEUJcGFkMTsKKyAgICBDQVJEOAlrZXlzWzMyXTsKK30geEtleVN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CisjZWxzZQorICAgIENBUkQ4CWNsYXNzOworI2VuZGlmCisgICAgQ0FSRDgJbGVuZ3RoOworICAgIENBUkQ4CW51bV9idXR0b25zOworICAgIEJZVEUJcGFkMTsKKyAgICBDQVJEOAlidXR0b25zWzMyXTsKK30geEJ1dHRvblN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CisjZWxzZQorICAgIENBUkQ4CWNsYXNzOworI2VuZGlmCisgICAgQ0FSRDgJbGVuZ3RoOworICAgIENBUkQ4CW51bV92YWx1YXRvcnM7CisgICAgQ0FSRDgJbW9kZTsKK30geFZhbHVhdG9yU3RhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZW5kRXh0ZW5zaW9uRXZlbnQuCisgKiBUSElTIFJFUVVFU1QgTVVTVCBCRSBLRVBUIEEgTVVMVElQTEUgT0YgOCBCWVRFUyBJTiBMRU5HVEghCisgKiBNT1JFIEVWRU5UUyBNQVkgRk9MTE9XIEFORCBUSEVZIE1VU1QgQkUgUVVBRC1BTElHTkVEIQorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfU2VuZEV4dGVuc2lvbkV2ZW50ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgV2luZG93CWRlc3RpbmF0aW9uIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VpZDsKKyAgICBCT09MCXByb3BhZ2F0ZTsKKyAgICBDQVJEMTYJY291bnQgQjE2OworICAgIENBUkQ4CW51bV9ldmVudHM7CisgICAgQllURQlwYWQxLHBhZDIscGFkMzsKK30geFNlbmRFeHRlbnNpb25FdmVudFJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZUJlbGwuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9EZXZpY2VCZWxsICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJZGV2aWNlaWQ7CisgICAgQ0FSRDgJZmVlZGJhY2tpZDsKKyAgICBDQVJEOAlmZWVkYmFja2NsYXNzOworICAgIElOVDgJcGVyY2VudDsKK30geERldmljZUJlbGxSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZXREZXZpY2VWYWx1YXRvcnMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NldERldmljZVZhbHVhdG9ycwkqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworICAgIENBUkQ4ICAgICAgIGZpcnN0X3ZhbHVhdG9yOworICAgIENBUkQ4ICAgICAgIG51bV92YWx1YXRvcnM7CisgICAgQllURQlwYWQxOworfSB4U2V0RGV2aWNlVmFsdWF0b3JzUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVwVHlwZTsJLyogWF9SZXBseQkJCSovCisgICAgQ0FSRDgJUmVwVHlwZTsJLyogYWx3YXlzIFhfU2V0RGV2aWNlVmFsdWF0b3JzCSovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEOAlzdGF0dXM7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQzMglwYWQwMSBCMzI7CisgICAgQ0FSRDMyCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIJcGFkMDMgQjMyOworICAgIENBUkQzMglwYWQwNCBCMzI7CisgICAgQ0FSRDMyCXBhZDA1IEIzMjsKK30geFNldERldmljZVZhbHVhdG9yc1JlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0RGV2aWNlQ29udHJvbC4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsJLyogYWx3YXlzIFhfR2V0RGV2aWNlQ29udHJvbAkqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNiAgICAgIGNvbnRyb2wgQjE2OworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworICAgIEJZVEUJcGFkMjsKK30geEdldERldmljZUNvbnRyb2xSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5CQkJKi8KKyAgICBDQVJEOAlSZXBUeXBlOwkvKiBhbHdheXMgWF9HZXREZXZpY2VDb250cm9sCSovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEOAlzdGF0dXM7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQzMglwYWQwMSBCMzI7CisgICAgQ0FSRDMyCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIJcGFkMDMgQjMyOworICAgIENBUkQzMglwYWQwNCBCMzI7CisgICAgQ0FSRDMyCXBhZDA1IEIzMjsKK30geEdldERldmljZUNvbnRyb2xSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQxNgljb250cm9sIEIxNjsJLyogY29udHJvbCB0eXBlCQkqLworICAgIENBUkQxNglsZW5ndGggQjE2OwkvKiBjb250cm9sIGxlbmd0aAkJKi8KK30geERldmljZVN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDE2CWNvbnRyb2wgQjE2OwkJLyogY29udHJvbCB0eXBlCQkqLworICAgIENBUkQxNglsZW5ndGggQjE2OwkJLyogY29udHJvbCBsZW5ndGgJCSovCisgICAgQ0FSRDMyCW51bV92YWx1YXRvcnMgQjMyOwkvKiBudW1iZXIgb2YgdmFsdWF0b3JzCQkqLworfSB4RGV2aWNlUmVzb2x1dGlvblN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgIENBUkQxNiAgICAgICAgIGNvbnRyb2wgQjE2OworICAgICBDQVJEMTYgICAgICAgICBsZW5ndGggQjE2OworICAgICBJTlQzMiAgICAgICAgICBtaW5feCBCMzI7CisgICAgIElOVDMyICAgICAgICAgIG1heF94IEIzMjsKKyAgICAgSU5UMzIgICAgICAgICAgbWluX3kgQjMyOworICAgICBJTlQzMiAgICAgICAgICBtYXhfeSBCMzI7CisgICAgIENBUkQzMiAgICAgICAgIGZsaXBfeCBCMzI7CisgICAgIENBUkQzMiAgICAgICAgIGZsaXBfeSBCMzI7CisgICAgIENBUkQzMiAgICAgICAgIHJvdGF0aW9uIEIzMjsKKyAgICAgQ0FSRDMyICAgICAgICAgYnV0dG9uX3RocmVzaG9sZCBCMzI7Cit9IHhEZXZpY2VBYnNDYWxpYlN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgIENBUkQxNiAgICAgICAgIGNvbnRyb2wgQjE2OworICAgICBDQVJEMTYgICAgICAgICBsZW5ndGggQjE2OworICAgICBDQVJEMzIgICAgICAgICBvZmZzZXRfeCBCMzI7CisgICAgIENBUkQzMiAgICAgICAgIG9mZnNldF95IEIzMjsKKyAgICAgQ0FSRDMyICAgICAgICAgd2lkdGggQjMyOworICAgICBDQVJEMzIgICAgICAgICBoZWlnaHQgQjMyOworICAgICBDQVJEMzIgICAgICAgICBzY3JlZW4gQjMyOworICAgICBDQVJEMzIgICAgICAgICBmb2xsb3dpbmcgQjMyOworfSB4RGV2aWNlQWJzQXJlYVN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDE2ICAgICAgY29udHJvbCBCMTY7ICAgICAgICAgICAgLyogY29udHJvbCB0eXBlICAgICAgICAgICAgICAgICAqLworICAgIENBUkQxNiAgICAgIGxlbmd0aCAgQjE2OyAgICAgICAgICAgIC8qIGNvbnRyb2wgbGVuZ3RoICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEOCAgICAgICBzdGF0dXM7CisgICAgQ0FSRDggICAgICAgaXNjb3JlOworICAgIENBUkQxNiAgICAgIHBhZDEgQjE2OworfSB4RGV2aWNlQ29yZVN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDE2ICAgICAgY29udHJvbCBCMTY7ICAgICAgICAgICAgLyogY29udHJvbCB0eXBlICAgICAgICAgICAgICAgICAqLworICAgIENBUkQxNiAgICAgIGxlbmd0aCAgQjE2OyAgICAgICAgICAgIC8qIGNvbnRyb2wgbGVuZ3RoICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEOCAgICAgICBlbmFibGU7CisgICAgQ0FSRDggICAgICAgcGFkMDsKKyAgICBDQVJEMTYgICAgICBwYWQxIEIxNjsKK30geERldmljZUVuYWJsZVN0YXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2hhbmdlRGV2aWNlQ29udHJvbC4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsJLyogYWx3YXlzIFhfQ2hhbmdlRGV2aWNlQ29udHJvbCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNiAgICAgIGNvbnRyb2wgQjE2OworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworICAgIEJZVEUgICAgICAgIHBhZDA7Cit9IHhDaGFuZ2VEZXZpY2VDb250cm9sUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVwVHlwZTsJLyogWF9SZXBseQkJCSovCisgICAgQ0FSRDgJUmVwVHlwZTsJLyogYWx3YXlzIFhfQ2hhbmdlRGV2aWNlQ29udHJvbAkqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJc3RhdHVzOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworICAgIENBUkQzMglwYWQwNSBCMzI7Cit9IHhDaGFuZ2VEZXZpY2VDb250cm9sUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEMTYJY29udHJvbCBCMTY7CS8qIGNvbnRyb2wgdHlwZQkJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJLyogY29udHJvbCBsZW5ndGgJCSovCit9IHhEZXZpY2VDdGw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEMTYJY29udHJvbCBCMTY7CQkvKiBjb250cm9sIHR5cGUJCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CQkvKiBjb250cm9sIGxlbmd0aAkJKi8KKyAgICBDQVJEOAlmaXJzdF92YWx1YXRvcjsJCS8qIGZpcnN0IHZhbHVhdG9yIHRvIGNoYW5nZSAgICAgKi8KKyAgICBDQVJEOAludW1fdmFsdWF0b3JzOwkJLyogbnVtYmVyIG9mIHZhbHVhdG9ycyB0byBjaGFuZ2UqLworICAgIENBUkQ4CXBhZDEscGFkMjsKK30geERldmljZVJlc29sdXRpb25DdGw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgQ0FSRDE2ICAgICAgICAgY29udHJvbCBCMTY7CisgICAgIENBUkQxNiAgICAgICAgIGxlbmd0aCBCMTY7CisgICAgIElOVDMyICAgICAgICAgIG1pbl94OworICAgICBJTlQzMiAgICAgICAgICBtYXhfeDsKKyAgICAgSU5UMzIgICAgICAgICAgbWluX3k7CisgICAgIElOVDMyICAgICAgICAgIG1heF95OworICAgICBDQVJEMzIgICAgICAgICBmbGlwX3g7CisgICAgIENBUkQzMiAgICAgICAgIGZsaXBfeTsKKyAgICAgQ0FSRDMyICAgICAgICAgcm90YXRpb247CisgICAgIENBUkQzMiAgICAgICAgIGJ1dHRvbl90aHJlc2hvbGQ7Cit9IHhEZXZpY2VBYnNDYWxpYkN0bDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICBDQVJEMTYgICAgICAgICBjb250cm9sIEIxNjsKKyAgICAgQ0FSRDE2ICAgICAgICAgbGVuZ3RoIEIxNjsKKyAgICAgQ0FSRDMyICAgICAgICAgb2Zmc2V0X3g7CisgICAgIENBUkQzMiAgICAgICAgIG9mZnNldF95OworICAgICBJTlQzMiAgICAgICAgICB3aWR0aDsKKyAgICAgSU5UMzIgICAgICAgICAgaGVpZ2h0OworICAgICBJTlQzMiAgICAgICAgICBzY3JlZW47CisgICAgIENBUkQzMiAgICAgICAgIGZvbGxvd2luZzsKK30geERldmljZUFic0FyZWFDdGw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEMTYgICAgICAgICAgY29udHJvbCBCMTY7CisgICAgQ0FSRDE2ICAgICAgICAgIGxlbmd0aCAgQjE2OworICAgIENBUkQ4ICAgICAgICAgICBzdGF0dXM7CisgICAgQ0FSRDggICAgICAgICAgIHBhZDA7CisgICAgQ0FSRDE2ICAgICAgICAgIHBhZDEgQjE2OworfSB4RGV2aWNlQ29yZUN0bDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQxNiAgICAgICAgICBjb250cm9sIEIxNjsKKyAgICBDQVJEMTYgICAgICAgICAgbGVuZ3RoICBCMTY7CisgICAgQ0FSRDggICAgICAgICAgIGVuYWJsZTsKKyAgICBDQVJEOCAgICAgICAgICAgcGFkMDsKKyAgICBDQVJEMTYgICAgICAgICAgcGFkMSBCMTY7Cit9IHhEZXZpY2VFbmFibGVDdGw7CisKKy8qIFhJIDEuNSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTGlzdERldmljZVByb3BlcnRpZXMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgICAgICByZXFUeXBlOyAgICAgICAgLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIG9wY29kZSAqLworICAgIENBUkQ4ICAgICAgIFJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9MaXN0RGV2aWNlUHJvcGVydGllcyAqLworICAgIENBUkQxNiAgICAgIGxlbmd0aCBCMTY7CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDggICAgICAgcGFkMDsKKyAgICBDQVJEMTYgICAgICBwYWQxIEIxNjsKK30geExpc3REZXZpY2VQcm9wZXJ0aWVzUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICAgICAgcmVwVHlwZTsgICAgICAgIC8qIFhfUmVwbHkgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDggICAgICAgUmVwVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0xpc3REZXZpY2VQcm9wZXJ0aWVzICovCisgICAgQ0FSRDE2ICAgICAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAgICAgIGxlbmd0aCBCMzI7CisgICAgQ0FSRDE2ICAgICAgbkF0b21zIEIxNjsKKyAgICBDQVJEMTYgICAgICBwYWQxIEIxNjsKKyAgICBDQVJEMzIgICAgICBwYWQyIEIzMjsKKyAgICBDQVJEMzIgICAgICBwYWQzIEIzMjsKKyAgICBDQVJEMzIgICAgICBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgICAgICBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgICAgICBwYWQ2IEIzMjsKK30geExpc3REZXZpY2VQcm9wZXJ0aWVzUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDaGFuZ2VEZXZpY2VQcm9wZXJ0eS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICAgIHJlcVR5cGU7ICAgICAgICAvKiBpbnB1dCBleHRlbnNpb24gbWFqb3Igb3Bjb2RlICovCisgICAgQ0FSRDggICAgICAgUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0NoYW5nZURldmljZVByb3BlcnR5ICovCisgICAgQ0FSRDE2ICAgICAgbGVuZ3RoIEIxNjsKKyAgICBBdG9tICAgICAgICBwcm9wZXJ0eSBCMzI7CisgICAgQXRvbSAgICAgICAgdHlwZSBCMzI7CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDggICAgICAgZm9ybWF0OworICAgIENBUkQ4ICAgICAgIG1vZGU7CisgICAgQ0FSRDggICAgICAgcGFkOworICAgIENBUkQzMiAgICAgIG5Vbml0cyBCMzI7Cit9IHhDaGFuZ2VEZXZpY2VQcm9wZXJ0eVJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlbGV0ZURldmljZVByb3BlcnR5LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICAgICAgcmVxVHlwZTsgICAgICAgIC8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBvcGNvZGUgKi8KKyAgICBDQVJEOCAgICAgICBSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfRGVsZXRlRGV2aWNlUHJvcGVydHkgKi8KKyAgICBDQVJEMTYgICAgICBsZW5ndGggQjE2OworICAgIEF0b20gICAgICAgIHByb3BlcnR5IEIzMjsKKyAgICBDQVJEOCAgICAgICBkZXZpY2VpZDsKKyAgICBDQVJEOCAgICAgICBwYWQwOworICAgIENBUkQxNiAgICAgIHBhZDEgQjE2OworfSB4RGVsZXRlRGV2aWNlUHJvcGVydHlSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXREZXZpY2VQcm9wZXJ0eS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICAgIHJlcVR5cGU7ICAgICAgICAvKiBpbnB1dCBleHRlbnNpb24gbWFqb3Igb3Bjb2RlICovCisgICAgQ0FSRDggICAgICAgUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dldERldmljZVByb3BlcnR5ICovCisgICAgQ0FSRDE2ICAgICAgbGVuZ3RoIEIxNjsKKyAgICBBdG9tICAgICAgICBwcm9wZXJ0eSBCMzI7CisgICAgQXRvbSAgICAgICAgdHlwZSBCMzI7CisgICAgQ0FSRDMyICAgICAgbG9uZ09mZnNldCBCMzI7CisgICAgQ0FSRDMyICAgICAgbG9uZ0xlbmd0aCBCMzI7CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIEJPT0wgICAgICAgIGNfZGVsZXRlOworI2Vsc2UKKyAgICBCT09MICAgICAgICBkZWxldGU7CisjZW5kaWYKKyAgICBDQVJEMTYgICAgICBwYWQ7Cit9IHhHZXREZXZpY2VQcm9wZXJ0eVJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICAgIHJlcFR5cGU7ICAgICAgICAvKiBYX1JlcGx5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEOCAgICAgICBSZXBUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR2V0RGV2aWNlUHJvcGVydHkgICAqLworICAgIENBUkQxNiAgICAgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgICAgICBsZW5ndGggQjMyOworICAgIEF0b20gICAgICAgIHByb3BlcnR5VHlwZSBCMzI7CisgICAgQ0FSRDMyICAgICAgYnl0ZXNBZnRlciBCMzI7CisgICAgQ0FSRDMyICAgICAgbkl0ZW1zIEIzMjsKKyAgICBDQVJEOCAgICAgICBmb3JtYXQ7CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDE2ICAgICAgcGFkMSBCMTY7CisgICAgQ0FSRDMyICAgICAgcGFkMiBCMzI7CisgICAgQ0FSRDMyICAgICAgcGFkMyBCMzI7Cit9IHhHZXREZXZpY2VQcm9wZXJ0eVJlcGx5OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW5wdXQgZXh0ZW5zaW9uIGV2ZW50cy4KKyAqCisgKiBEZXZpY2VWYWx1YXRvcgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBCWVRFCXR5cGU7CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBLZXlCdXRNYXNrICBkZXZpY2Vfc3RhdGUgQjE2OworICAgIENBUkQ4CW51bV92YWx1YXRvcnM7CisgICAgQ0FSRDggICAgICAgZmlyc3RfdmFsdWF0b3I7CisgICAgSU5UMzIJdmFsdWF0b3IwIEIzMjsKKyAgICBJTlQzMgl2YWx1YXRvcjEgQjMyOworICAgIElOVDMyCXZhbHVhdG9yMiBCMzI7CisgICAgSU5UMzIJdmFsdWF0b3IzIEIzMjsKKyAgICBJTlQzMgl2YWx1YXRvcjQgQjMyOworICAgIElOVDMyCXZhbHVhdG9yNSBCMzI7CisgICAgfSAgZGV2aWNlVmFsdWF0b3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlS2V5QnV0dG9uUG9pbnRlci4KKyAqCisgKiBVc2VkIGZvcjogRGV2aWNlS2V5UHJlc3MsIERldmljZUtleVJlbGVhc2UsCisgKgkgICAgIERldmljZUJ1dHRvblByZXNzLCBEZXZpY2VCdXR0b25SZWxlYXNlLAorICoJICAgICBQcm94aW1pdHlJbiwgUHJveGltaXR5T3V0CisgKgkgICAgIERldmljZU1vdGlvbk5vdGlmeSwKKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgQllURQl0eXBlOworICAgIEJZVEUgICAgICAgIGRldGFpbDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIFRpbWUgICAgICAgIHRpbWUgQjMyOworICAgIFdpbmRvdyAgICAgIHJvb3QgQjMyOworICAgIFdpbmRvdyAgICAgIGV2ZW50IEIzMjsKKyAgICBXaW5kb3cgICAgICBjaGlsZCBCMzI7CisgICAgSU5UMTYgICAgICAgcm9vdF94IEIxNjsKKyAgICBJTlQxNiAgICAgICByb290X3kgQjE2OworICAgIElOVDE2ICAgICAgIGV2ZW50X3ggQjE2OworICAgIElOVDE2ICAgICAgIGV2ZW50X3kgQjE2OworICAgIEtleUJ1dE1hc2sgIHN0YXRlIEIxNjsKKyAgICBCT09MICAgICAgICBzYW1lX3NjcmVlbjsKKyAgICBDQVJEOCAgICAgICBkZXZpY2VpZDsKKyAgICB9ICBkZXZpY2VLZXlCdXR0b25Qb2ludGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZUZvY3VzLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURSAgICAgICAgZGV0YWlsOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZSAgICAgICAgdGltZSBCMzI7CisgICAgV2luZG93ICAgICAgd2luZG93IEIzMjsKKyAgICBCWVRFCW1vZGU7CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgQllURQlwYWQxLCBwYWQyOworICAgIENBUkQzMglwYWQwMCBCMzI7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgfSAgZGV2aWNlRm9jdXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlU3RhdGVOb3RpZnkuCisgKgorICogTm90ZSB0aGF0IHRoZSB0d28gaGlnaC1vcmRlciBiaXRzIGluIHRoZSBjbGFzc2VzX3JlcG9ydGVkCisgKiBmaWVsZCBhcmUgdGhlIHByb3hpbWl0eSBzdGF0ZSAoSW5Qcm94aW1pdHkgb3IgT3V0T2ZQcm94aW1pdHkpLAorICogYW5kIHRoZSBkZXZpY2UgbW9kZSAoQWJzb2x1dGUgb3IgUmVsYXRpdmUpLCByZXNwZWN0aXZlbHkuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFICAgICAgICBkZXZpY2VpZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIFRpbWUgICAgICAgIHRpbWUgQjMyOworICAgIENBUkQ4CW51bV9rZXlzOworICAgIENBUkQ4CW51bV9idXR0b25zOworICAgIENBUkQ4CW51bV92YWx1YXRvcnM7CisgICAgQ0FSRDggICAgICAgY2xhc3Nlc19yZXBvcnRlZDsKKyAgICBDQVJEOCAgICAgICBidXR0b25zWzRdOworICAgIENBUkQ4ICAgICAgIGtleXNbNF07CisgICAgSU5UMzIJdmFsdWF0b3IwIEIzMjsKKyAgICBJTlQzMgl2YWx1YXRvcjEgQjMyOworICAgIElOVDMyCXZhbHVhdG9yMiBCMzI7CisgICAgfSAgZGV2aWNlU3RhdGVOb3RpZnk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlS2V5U3RhdGVOb3RpZnkuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFICAgICAgICBkZXZpY2VpZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQ4ICAgICAgIGtleXNbMjhdOworICAgIH0gIGRldmljZUtleVN0YXRlTm90aWZ5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZUJ1dHRvblN0YXRlTm90aWZ5LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURSAgICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEOCAgICAgICBidXR0b25zWzI4XTsKKyAgICB9ICBkZXZpY2VCdXR0b25TdGF0ZU5vdGlmeTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2VNYXBwaW5nTm90aWZ5LgorICogRmllbGRzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggY29yZSBtYXBwaW5nbm90aWZ5IGV2ZW50LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURSAgICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEOCAgICAgICByZXF1ZXN0OworICAgIEtleUNvZGUgICAgIGZpcnN0S2V5Q29kZTsKKyAgICBDQVJEOCAgICAgICBjb3VudDsKKyAgICBCWVRFICAgICAgICBwYWQxOworICAgIFRpbWUgICAgICAgIHRpbWUgQjMyOworICAgIENBUkQzMglwYWQwMCBCMzI7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKKyAgICB9ICBkZXZpY2VNYXBwaW5nTm90aWZ5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENoYW5nZURldmljZU5vdGlmeS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgQllURQl0eXBlOworICAgIEJZVEUgICAgICAgIGRldmljZWlkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZSAgICAgICAgdGltZSBCMzI7CisgICAgQ0FSRDggICAgICAgcmVxdWVzdDsKKyAgICBCWVRFICAgICAgICBwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQzMglwYWQwMCBCMzI7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKKyAgICB9ICBjaGFuZ2VEZXZpY2VOb3RpZnk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZGV2aWNlUHJlc2VuY2VOb3RpZnkuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFICAgICAgICBwYWQwMDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIFRpbWUgICAgICAgIHRpbWUgQjMyOworICAgIEJZVEUgICAgICAgIGRldmNoYW5nZTsgLyogRGV2aWNle0FkZGVkfFJlbW92ZWR8RW5hYmxlZHxEaXNhYmxlZHxDb250cm9sQ2hhbmdlZH0gKi8KKyAgICBCWVRFICAgICAgICBkZXZpY2VpZDsKKyAgICBDQVJEMTYgICAgICBjb250cm9sIEIxNjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIJcGFkMDUgQjMyOworICAgIENBUkQzMglwYWQwNiBCMzI7CisgICAgfSAgZGV2aWNlUHJlc2VuY2VOb3RpZnk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGV2aWNlUHJvcGVydHlOb3RpZnlFdmVudAorICoKKyAqIFNlbnQgd2hlbmV2ZXIgYSBkZXZpY2UncyBwcm9wZXJ0eSBjaGFuZ2VzLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBCWVRFICAgICAgICB0eXBlOworICAgIEJZVEUgICAgICAgIHN0YXRlOyAgICAgICAgICAgICAgIC8qIE5ld1ZhbHVlIG9yIERlbGV0ZWQgKi8KKyAgICBDQVJEMTYgICAgICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyICAgICAgdGltZSBCMzI7CisgICAgQXRvbSAgICAgICAgYXRvbSBCMzI7ICAgICAgICAgICAgLyogYWZmZWN0ZWQgcHJvcGVydHkgKi8KKyAgICBDQVJEMzIgICAgICBwYWQwIEIzMjsKKyAgICBDQVJEMzIgICAgICBwYWQxIEIzMjsKKyAgICBDQVJEMzIgICAgICBwYWQyIEIzMjsKKyAgICBDQVJEMzIgICAgICBwYWQzIEIzMjsKKyAgICBDQVJEMTYgICAgICBwYWQ1IEIxNjsKKyAgICBDQVJEOCAgICAgICBwYWQ0OworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOyAgICAgICAgICAgIC8qIGlkIG9mIGRldmljZSAqLworICAgIH0gZGV2aWNlUHJvcGVydHlOb3RpZnk7CisKKyN1bmRlZiBXaW5kb3cKKyN1bmRlZiBUaW1lCisjdW5kZWYgS2V5Q29kZQorI3VuZGVmIE1hc2sKKyN1bmRlZiBBdG9tCisjdW5kZWYgQ3Vyc29yCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiM2JjMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCLmgKQEAgLTAsMCArMSw3ODggQEAKKy8qICRYb3JnOiBYS0IuaCx2IDEuMyAyMDAwLzA4LzE4IDA0OjA1OjQ1IGNvc2tyZXkgRXhwICQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMTk5MyBieSBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAorZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0Citub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3Mgbm90IGJlIAordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gCitvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSAKK29mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCit3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKK1NJTElDT04gR1JBUEhJQ1MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgCitTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIAorQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCitHUkFQSElDUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIAorREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCAKK0RBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgCitPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gIFdJVEgKK1RIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL1hLQi5oLHYgMS41dHNpIEV4cCAkICovCisKKyNpZm5kZWYgX1hLQl9IXworI2RlZmluZQlfWEtCX0hfCisKKyAgICAvKgorICAgICAqIFhLQiByZXF1ZXN0IGNvZGVzLCB1c2VkIGluOgorICAgICAqICAtICB4a2JSZXFUeXBlIGZpZWxkIG9mIGFsbCByZXF1ZXN0cworICAgICAqICAtICByZXF1ZXN0TWlub3IgZmllbGQgb2Ygc29tZSBldmVudHMKKyAgICAgKi8KKyNkZWZpbmUJWF9rYlVzZUV4dGVuc2lvbgkJIDAKKyNkZWZpbmUJWF9rYlNlbGVjdEV2ZW50cwkgCSAxCisjZGVmaW5lCVhfa2JCZWxsCQkJIDMKKyNkZWZpbmUJWF9rYkdldFN0YXRlCQkJIDQKKyNkZWZpbmUJWF9rYkxhdGNoTG9ja1N0YXRlCQkgNQorI2RlZmluZQlYX2tiR2V0Q29udHJvbHMJCQkgNgorI2RlZmluZQlYX2tiU2V0Q29udHJvbHMJCQkgNworI2RlZmluZQlYX2tiR2V0TWFwCQkJIDgKKyNkZWZpbmUJWF9rYlNldE1hcAkJCSA5CisjZGVmaW5lCVhfa2JHZXRDb21wYXRNYXAJCTEwCisjZGVmaW5lCVhfa2JTZXRDb21wYXRNYXAJCTExCisjZGVmaW5lCVhfa2JHZXRJbmRpY2F0b3JTdGF0ZQkJMTIKKyNkZWZpbmUJWF9rYkdldEluZGljYXRvck1hcAkJMTMKKyNkZWZpbmUJWF9rYlNldEluZGljYXRvck1hcAkJMTQKKyNkZWZpbmUJWF9rYkdldE5hbWVkSW5kaWNhdG9yCQkxNQorI2RlZmluZQlYX2tiU2V0TmFtZWRJbmRpY2F0b3IJCTE2CisjZGVmaW5lCVhfa2JHZXROYW1lcwkJCTE3CisjZGVmaW5lCVhfa2JTZXROYW1lcwkJCTE4CisjZGVmaW5lCVhfa2JHZXRHZW9tZXRyeQkJCTE5CisjZGVmaW5lCVhfa2JTZXRHZW9tZXRyeQkJCTIwCisjZGVmaW5lCVhfa2JQZXJDbGllbnRGbGFncwkJMjEKKyNkZWZpbmUJWF9rYkxpc3RDb21wb25lbnRzCQkyMgorI2RlZmluZQlYX2tiR2V0S2JkQnlOYW1lCQkyMworI2RlZmluZQlYX2tiR2V0RGV2aWNlSW5mbwkJMjQKKyNkZWZpbmUJWF9rYlNldERldmljZUluZm8JCTI1CisjZGVmaW5lCVhfa2JTZXREZWJ1Z2dpbmdGbGFncwkJMTAxCisKKyAgICAvKgorICAgICAqIEluIHRoZSBYIHNlbnNlLCBYS0IgcmVwb3J0cyBvbmx5IG9uZSBldmVudC4KKyAgICAgKiBUaGUgdHlwZSBmaWVsZCBvZiBhbGwgWEtCIGV2ZW50cyBpcyBYa2JFdmVudENvZGUKKyAgICAgKi8KKyNkZWZpbmUJWGtiRXZlbnRDb2RlCQkJMAorI2RlZmluZQlYa2JOdW1iZXJFdmVudHMJCQkoWGtiRXZlbnRDb2RlKzEpCisKKyAgICAvKgorICAgICAqIFhLQiBoYXMgYSBtaW5vciBldmVudCBjb2RlIHNvIGl0IGNhbiB1c2Ugb25lIFggZXZlbnQgY29kZSBmb3IgCisgICAgICogbXVsdGlwbGUgcHVycG9zZXMuICAKKyAgICAgKiAgLSByZXBvcnRlZCBpbiB0aGUgeGtiVHlwZSBmaWVsZCBvZiBhbGwgWEtCIGV2ZW50cy4KKyAgICAgKiAgLSBYa2JTZWxlY3RFdmVudERldGFpbHM6IEluZGljYXRlcyB0aGUgZXZlbnQgZm9yIHdoaWNoIGV2ZW50IGRldGFpbHMgCisgICAgICogICAgYXJlIGJlaW5nIGNoYW5nZWQKKyAgICAgKi8KKyNkZWZpbmUJWGtiTmV3S2V5Ym9hcmROb3RpZnkJCTAKKyNkZWZpbmUgWGtiTWFwTm90aWZ5CQkJMQorI2RlZmluZQlYa2JTdGF0ZU5vdGlmeQkJCTIKKyNkZWZpbmUgWGtiQ29udHJvbHNOb3RpZnkJCTMKKyNkZWZpbmUJWGtiSW5kaWNhdG9yU3RhdGVOb3RpZnkJCTQKKyNkZWZpbmUJWGtiSW5kaWNhdG9yTWFwTm90aWZ5CQk1CisjZGVmaW5lCVhrYk5hbWVzTm90aWZ5CQkJNgorI2RlZmluZSBYa2JDb21wYXRNYXBOb3RpZnkJCTcKKyNkZWZpbmUJWGtiQmVsbE5vdGlmeQkJCTgKKyNkZWZpbmUJWGtiQWN0aW9uTWVzc2FnZQkJOQorI2RlZmluZQlYa2JBY2Nlc3NYTm90aWZ5CQkxMAorI2RlZmluZQlYa2JFeHRlbnNpb25EZXZpY2VOb3RpZnkJMTEKKworICAgIC8qCisgICAgICogRXZlbnQgTWFzazoKKyAgICAgKiAgLSBYa2JTZWxlY3RFdmVudHM6ICBTcGVjaWZpZXMgZXZlbnQgaW50ZXJlc3QuCisgICAgICovCisjZGVmaW5lCVhrYk5ld0tleWJvYXJkTm90aWZ5TWFzawkoMUwgPDwgMCkKKyNkZWZpbmUgWGtiTWFwTm90aWZ5TWFzawkJKDFMIDw8IDEpCisjZGVmaW5lCVhrYlN0YXRlTm90aWZ5TWFzawkJKDFMIDw8IDIpCisjZGVmaW5lIFhrYkNvbnRyb2xzTm90aWZ5TWFzawkJKDFMIDw8IDMpCisjZGVmaW5lCVhrYkluZGljYXRvclN0YXRlTm90aWZ5TWFzawkoMUwgPDwgNCkKKyNkZWZpbmUJWGtiSW5kaWNhdG9yTWFwTm90aWZ5TWFzawkoMUwgPDwgNSkKKyNkZWZpbmUJWGtiTmFtZXNOb3RpZnlNYXNrCQkoMUwgPDwgNikKKyNkZWZpbmUgWGtiQ29tcGF0TWFwTm90aWZ5TWFzawkJKDFMIDw8IDcpCisjZGVmaW5lCVhrYkJlbGxOb3RpZnlNYXNrCQkoMUwgPDwgOCkKKyNkZWZpbmUJWGtiQWN0aW9uTWVzc2FnZU1hc2sJCSgxTCA8PCA5KQorI2RlZmluZQlYa2JBY2Nlc3NYTm90aWZ5TWFzawkJKDFMIDw8IDEwKQorI2RlZmluZQlYa2JFeHRlbnNpb25EZXZpY2VOb3RpZnlNYXNrCSgxTCA8PCAxMSkKKyNkZWZpbmUJWGtiQWxsRXZlbnRzTWFzawkJKDB4RkZGKQorCisgICAgLyoKKyAgICAgKiBOZXdLZXlib2FyZE5vdGlmeSBldmVudCBkZXRhaWxzOgorICAgICAqLworI2RlZmluZQlYa2JOS05fS2V5Y29kZXNNYXNrCQkoMUwgPDwgMCkKKyNkZWZpbmUJWGtiTktOX0dlb21ldHJ5TWFzawkJKDFMIDw8IDEpCisjZGVmaW5lCVhrYk5LTl9EZXZpY2VJRE1hc2sJCSgxTCA8PCAyKQorI2RlZmluZQlYa2JBbGxOZXdLZXlib2FyZEV2ZW50c01hc2sJKDB4NykKKworICAgIC8qCisgICAgICogQWNjZXNzWE5vdGlmeSBldmVudCB0eXBlczoKKyAgICAgKiAgLSBUaGUgJ3doYXQnIGZpZWxkIG9mIEFjY2Vzc1hOb3RpZnkgZXZlbnRzIHJlcG9ydHMgdGhlCisgICAgICogICAgcmVhc29uIHRoYXQgdGhlIGV2ZW50IHdhcyBnZW5lcmF0ZWQuCisgICAgICovCisjZGVmaW5lCVhrYkFYTl9TS1ByZXNzCQkJMAorI2RlZmluZQlYa2JBWE5fU0tBY2NlcHQJCQkxCisjZGVmaW5lCVhrYkFYTl9TS1JlamVjdAkJCTIKKyNkZWZpbmUJWGtiQVhOX1NLUmVsZWFzZQkJMworI2RlZmluZQlYa2JBWE5fQktBY2NlcHQJCQk0CisjZGVmaW5lCVhrYkFYTl9CS1JlamVjdAkJCTUKKyNkZWZpbmUJWGtiQVhOX0FYS1dhcm5pbmcJCTYKKworICAgIC8qCisgICAgICogQWNjZXNzWE5vdGlmeSBkZXRhaWxzOgorICAgICAqIC0gVXNlZCBhcyBhbiBldmVudCBkZXRhaWwgbWFzayB0byBsaW1pdCB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaAorICAgICAqICAgQWNjZXNzWE5vdGlmeSBldmVudHMgYXJlIHJlcG9ydGVkCisgICAgICovCisjZGVmaW5lCVhrYkFYTl9TS1ByZXNzTWFzawkJKDFMIDw8IDApCisjZGVmaW5lCVhrYkFYTl9TS0FjY2VwdE1hc2sJCSgxTCA8PCAxKQorI2RlZmluZQlYa2JBWE5fU0tSZWplY3RNYXNrCQkoMUwgPDwgMikKKyNkZWZpbmUJWGtiQVhOX1NLUmVsZWFzZU1hc2sJCSgxTCA8PCAzKQorI2RlZmluZQlYa2JBWE5fQktBY2NlcHRNYXNrCQkoMUwgPDwgNCkKKyNkZWZpbmUJWGtiQVhOX0JLUmVqZWN0TWFzawkJKDFMIDw8IDUpCisjZGVmaW5lCVhrYkFYTl9BWEtXYXJuaW5nTWFzawkJKDFMIDw8IDYpCisjZGVmaW5lCVhrYkFsbEFjY2Vzc1hFdmVudHNNYXNrCQkoMHg3ZikKKworICAgIC8qCisgICAgICogTWlzY2VsbGFuZW91cyBldmVudCBkZXRhaWxzOgorICAgICAqIC0gZXZlbnQgZGV0YWlsIG1hc2tzIGZvciBhc3NvcnRlZCBldmVudHMgdGhhdCBkb24ndCByZWFsbAorICAgICAqICAgaGF2ZSBhbnkgZGV0YWlscy4KKyAgICAgKi8KKyNkZWZpbmUJWGtiQWxsU3RhdGVFdmVudHNNYXNrCQlYa2JBbGxTdGF0ZUNvbXBvbmVudHNNYXNrCisjZGVmaW5lCVhrYkFsbE1hcEV2ZW50c01hc2sJCVhrYkFsbE1hcENvbXBvbmVudHNNYXNrCisjZGVmaW5lCVhrYkFsbENvbnRyb2xFdmVudHNNYXNrCQlYa2JBbGxDb250cm9sc01hc2sKKyNkZWZpbmUJWGtiQWxsSW5kaWNhdG9yRXZlbnRzTWFzawlYa2JBbGxJbmRpY2F0b3JzTWFzaworI2RlZmluZQlYa2JBbGxOYW1lRXZlbnRzTWFzawkJWGtiQWxsTmFtZXNNYXNrCisjZGVmaW5lCVhrYkFsbENvbXBhdE1hcEV2ZW50c01hc2sJWGtiQWxsQ29tcGF0TWFzaworI2RlZmluZQlYa2JBbGxCZWxsRXZlbnRzTWFzawkJKDFMIDw8IDApCisjZGVmaW5lCVhrYkFsbEFjdGlvbk1lc3NhZ2VzTWFzawkoMUwgPDwgMCkKKworICAgIC8qCisgICAgICogWEtCIHJlcG9ydHMgb25lIGVycm9yOiAgQmFkS2V5Ym9hcmQKKyAgICAgKiBBIGZ1cnRoZXIgcmVhc29uIGZvciB0aGUgZXJyb3IgaXMgZW5jb2RlZCBpbnRvIHRvIG1vc3Qgc2lnbmlmaWNhbnQKKyAgICAgKiBieXRlIG9mIHRoZSByZXNvdXJjZUlEIGZvciB0aGUgZXJyb3I6CisgICAgICogICAgWGtiRXJyX0JhZERldmljZSAtIHRoZSBkZXZpY2UgaW4gcXVlc3Rpb24gd2FzIG5vdCBmb3VuZAorICAgICAqICAgIFhrYkVycl9CYWRDbGFzcyAgLSB0aGUgZGV2aWNlIHdhcyBmb3VuZCBidXQgaXQgZG9lc24ndCBiZWxvbmcgdG8gCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBjbGFzcy4KKyAgICAgKiAgICBYa2JFcnJfQmFkSWQgICAgIC0gdGhlIGRldmljZSB3YXMgZm91bmQgYW5kIGJlbG9uZ3MgdG8gdGhlIHJpZ2h0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLCBidXQgbm90IGZlZWRiYWNrIHdpdGggYSBtYXRjaGluZyBpZCB3YXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgZm91bmQuCisgICAgICogVGhlIGxvdyBieXRlIG9mIHRoZSByZXNvdXJjZUlEIGZvciB0aGlzIGVycm9yIGNvbnRhaW5zIHRoZSBkZXZpY2UKKyAgICAgKiBpZCwgY2xhc3Mgc3BlY2lmaWVyIG9yIGZlZWRiYWNrIGlkIHRoYXQgZmFpbGVkLgorICAgICAqLworI2RlZmluZQlYa2JLZXlib2FyZAkJCTAKKyNkZWZpbmUJWGtiTnVtYmVyRXJyb3JzCQkJMQorCisjZGVmaW5lCVhrYkVycl9CYWREZXZpY2UJMHhmZgorI2RlZmluZQlYa2JFcnJfQmFkQ2xhc3MJCTB4ZmUKKyNkZWZpbmUJWGtiRXJyX0JhZElkCQkweGZkCisKKyAgICAvKgorICAgICAqIEtleWJvYXJkIENvbXBvbmVudHMgTWFzazoKKyAgICAgKiAtIFNwZWNpZmllcyB0aGUgY29tcG9uZW50cyB0aGF0IGZvbGxvdyBhIEdldEtleWJvYXJkQnlOYW1lUmVwbHkKKyAgICAgKi8KKyNkZWZpbmUJWGtiQ2xpZW50TWFwTWFzawkJKDFMIDw8IDApCisjZGVmaW5lCVhrYlNlcnZlck1hcE1hc2sJCSgxTCA8PCAxKQorI2RlZmluZQlYa2JDb21wYXRNYXBNYXNrCQkoMUwgPDwgMikKKyNkZWZpbmUJWGtiSW5kaWNhdG9yTWFwTWFzawkJKDFMIDw8IDMpCisjZGVmaW5lCVhrYk5hbWVzTWFzawkJCSgxTCA8PCA0KQorI2RlZmluZQlYa2JHZW9tZXRyeU1hc2sJCQkoMUwgPDwgNSkKKyNkZWZpbmUJWGtiQ29udHJvbHNNYXNrCQkJKDFMIDw8IDYpCisjZGVmaW5lCVhrYkFsbENvbXBvbmVudHNNYXNrCQkoMHg3ZikKKworICAgIC8qCisgICAgICogU3RhdGUgZGV0YWlsIG1hc2s6CisgICAgICogIC0gVGhlICdjaGFuZ2VkJyBmaWVsZCBvZiBTdGF0ZU5vdGlmeSBldmVudHMgcmVwb3J0cyB3aGljaCBvZgorICAgICAqICAgIHRoZSBrZXlib2FyZCBzdGF0ZSBjb21wb25lbnRzIGhhdmUgY2hhbmdlZC4KKyAgICAgKiAgLSBVc2VkIGFzIGFuIGV2ZW50IGRldGFpbCBtYXNrIHRvIGxpbWl0IHRoZSBjb25kaXRpb25zIHVuZGVyCisgICAgICogICAgd2hpY2ggU3RhdGVOb3RpZnkgZXZlbnRzIGFyZSByZXBvcnRlZC4KKyAgICAgKi8KKyNkZWZpbmUJWGtiTW9kaWZpZXJTdGF0ZU1hc2sJCSgxTCA8PCAwKQorI2RlZmluZQlYa2JNb2RpZmllckJhc2VNYXNrCQkoMUwgPDwgMSkKKyNkZWZpbmUJWGtiTW9kaWZpZXJMYXRjaE1hc2sJCSgxTCA8PCAyKQorI2RlZmluZQlYa2JNb2RpZmllckxvY2tNYXNrCQkoMUwgPDwgMykKKyNkZWZpbmUJWGtiR3JvdXBTdGF0ZU1hc2sJCSgxTCA8PCA0KQorI2RlZmluZQlYa2JHcm91cEJhc2VNYXNrCQkoMUwgPDwgNSkKKyNkZWZpbmUJWGtiR3JvdXBMYXRjaE1hc2sJCSgxTCA8PCA2KQorI2RlZmluZSBYa2JHcm91cExvY2tNYXNrCQkoMUwgPDwgNykKKyNkZWZpbmUJWGtiQ29tcGF0U3RhdGVNYXNrCQkoMUwgPDwgOCkKKyNkZWZpbmUJWGtiR3JhYk1vZHNNYXNrCQkJKDFMIDw8IDkpCisjZGVmaW5lCVhrYkNvbXBhdEdyYWJNb2RzTWFzawkJKDFMIDw8IDEwKQorI2RlZmluZQlYa2JMb29rdXBNb2RzTWFzawkJKDFMIDw8IDExKQorI2RlZmluZQlYa2JDb21wYXRMb29rdXBNb2RzTWFzawkJKDFMIDw8IDEyKQorI2RlZmluZQlYa2JQb2ludGVyQnV0dG9uTWFzawkJKDFMIDw8IDEzKQorI2RlZmluZQlYa2JBbGxTdGF0ZUNvbXBvbmVudHNNYXNrCSgweDNmZmYpCisKKyAgICAvKgorICAgICAqIENvbnRyb2xzIGRldGFpbCBtYXNrczoKKyAgICAgKiAgVGhlIGNvbnRyb2xzIHNwZWNpZmllZCBpbiBYa2JBbGxDb250cm9sc01hc2s6CisgICAgICogIC0gVGhlICdjaGFuZ2VkJyBmaWVsZCBvZiBDb250cm9sc05vdGlmeSBldmVudHMgcmVwb3J0cyB3aGljaCBvZiAKKyAgICAgKiAgICB0aGUga2V5Ym9hcmQgY29udHJvbHMgaGF2ZSBjaGFuZ2VkLgorICAgICAqICAtIFRoZSAnY2hhbmdlQ29udHJvbHMnIGZpZWxkIG9mIHRoZSBTZXRDb250cm9scyByZXF1ZXN0IHNwZWNpZmllcworICAgICAqICAgIHRoZSBjb250cm9scyBmb3Igd2hpY2ggdmFsdWVzIGFyZSB0byBiZSBjaGFuZ2VkLgorICAgICAqICAtIFVzZWQgYXMgYW4gZXZlbnQgZGV0YWlsIG1hc2sgdG8gbGltaXQgdGhlIGNvbmRpdGlvbnMgdW5kZXIgCisgICAgICogICAgd2hpY2ggQ29udHJvbHNOb3RpZnkgZXZlbnRzIGFyZSByZXBvcnRlZC4KKyAgICAgKgorICAgICAqICBUaGUgY29udHJvbHMgc3BlY2lmaWVkIGluIHRoZSBYa2JBbGxCb29sZWFuQ3RybHNNYXNrOgorICAgICAqICAtIFRoZSAnZW5hYmxlZENvbnRyb2xzJyBmaWVsZCBvZiBDb250cm9sc05vdGlmeSBldmVudHMgcmVwb3J0cyB0aGUKKyAgICAgKiAgICBjdXJyZW50IHN0YXR1cyBvZiB0aGUgYm9vbGVhbiBjb250cm9scy4KKyAgICAgKiAgLSBUaGUgJ2VuYWJsZWRDb250cm9sc0NoYW5nZXMnIGZpZWxkIG9mIENvbnRyb2xzTm90aWZ5IGV2ZW50cyByZXBvcnRzCisgICAgICogICAgYW55IGJvb2xlYW4gY29udHJvbHMgdGhhdCBoYXZlIGJlZW4gdHVybmVkIG9uIG9yIG9mZi4KKyAgICAgKiAgLSBUaGUgJ2FmZmVjdEVuYWJsZWRDb250cm9scycgYW5kICdlbmFibGVkQ29udHJvbHMnIGZpZWxkcyBvZiB0aGUKKyAgICAgKiAgICBrYlNldENvbnRyb2xzIHJlcXVlc3QgY2hhbmdlIHRoZSBzZXQgb2YgZW5hYmxlZCBjb250cm9scy4KKyAgICAgKiAgLSBUaGUgJ2FjY2Vzc1hUaW1lb3V0TWFzaycgYW5kICdhY2Nlc3NYVGltZW91dFZhbHVlcycgZmllbGRzIG9mCisgICAgICogICAgYW4gWGtiQ29udHJvbHNSZWMgc3BlY2lmeSB0aGUgY29udHJvbHMgdG8gYmUgY2hhbmdlZCBpZiB0aGUga2V5Ym9hcmQKKyAgICAgKiAgICB0aW1lcyBvdXQgYW5kIHRoZSB2YWx1ZXMgdG8gd2hpY2ggdGhleSBzaG91bGQgYmUgY2hhbmdlZC4KKyAgICAgKiAgLSBUaGUgJ2F1dG9DdHJscycgYW5kICdhdXRvQ3RybHNWYWx1ZXMnIGZpZWxkcyBvZiB0aGUgUGVyQ2xpZW50RmxhZ3MgCisgICAgICogICAgcmVxdWVzdCBzcGVjaWZpZXMgdGhlIHNwZWNpZnkgdGhlIGNvbnRyb2xzIHRvIGJlIHJlc2V0IHdoZW4gdGhlCisgICAgICogICAgY2xpZW50IGV4aXRzIGFuZCB0aGUgdmFsdWVzIHRvIHdoaWNoIHRoZXkgc2hvdWxkIGJlIHJlc2V0LgorICAgICAqICAtIFRoZSAnY3RybHMnIGZpZWxkIG9mIGFuIGluZGljYXRvciBtYXAgc3BlY2lmaWVzIHRoZSBjb250cm9scworICAgICAqICAgIHRoYXQgZHJpdmUgdGhlIGluZGljYXRvci4KKyAgICAgKiAgLSBTcGVjaWZpZXMgdGhlIGJvb2xlYW4gY29udHJvbHMgYWZmZWN0ZWQgYnkgdGhlIFNldENvbnRyb2xzIGFuZAorICAgICAqICAgIExvY2tDb250cm9scyBrZXkgYWN0aW9ucy4KKyAgICAgKi8KKyNkZWZpbmUJWGtiUmVwZWF0S2V5c01hc2sJICgxTCA8PCAwKQorI2RlZmluZQlYa2JTbG93S2V5c01hc2sJCSAoMUwgPDwgMSkKKyNkZWZpbmUJWGtiQm91bmNlS2V5c01hc2sJICgxTCA8PCAyKQorI2RlZmluZQlYa2JTdGlja3lLZXlzTWFzawkgKDFMIDw8IDMpCisjZGVmaW5lCVhrYk1vdXNlS2V5c01hc2sJICgxTCA8PCA0KQorI2RlZmluZQlYa2JNb3VzZUtleXNBY2NlbE1hc2sJICgxTCA8PCA1KQorI2RlZmluZQlYa2JBY2Nlc3NYS2V5c01hc2sJICgxTCA8PCA2KQorI2RlZmluZQlYa2JBY2Nlc3NYVGltZW91dE1hc2sJICgxTCA8PCA3KQorI2RlZmluZQlYa2JBY2Nlc3NYRmVlZGJhY2tNYXNrCSAoMUwgPDwgOCkKKyNkZWZpbmUJWGtiQXVkaWJsZUJlbGxNYXNrCSAoMUwgPDwgOSkKKyNkZWZpbmUJWGtiT3ZlcmxheTFNYXNrCQkgKDFMIDw8IDEwKQorI2RlZmluZQlYa2JPdmVybGF5Mk1hc2sJCSAoMUwgPDwgMTEpCisjZGVmaW5lCVhrYklnbm9yZUdyb3VwTG9ja01hc2sJICgxTCA8PCAxMikKKyNkZWZpbmUJWGtiR3JvdXBzV3JhcE1hc2sJICgxTCA8PCAyNykKKyNkZWZpbmUJWGtiSW50ZXJuYWxNb2RzTWFzawkgKDFMIDw8IDI4KQorI2RlZmluZQlYa2JJZ25vcmVMb2NrTW9kc01hc2sJICgxTCA8PCAyOSkKKyNkZWZpbmUJWGtiUGVyS2V5UmVwZWF0TWFzawkgKDFMIDw8IDMwKQorI2RlZmluZQlYa2JDb250cm9sc0VuYWJsZWRNYXNrCSAoMUwgPDwgMzEpCisKKyNkZWZpbmUJWGtiQWNjZXNzWE9wdGlvbnNNYXNrICAgIChYa2JTdGlja3lLZXlzTWFza3xYa2JBY2Nlc3NYRmVlZGJhY2tNYXNrKQorCisjZGVmaW5lCVhrYkFsbEJvb2xlYW5DdHJsc01hc2sJICgweDAwMDAxRkZGKQorI2RlZmluZQlYa2JBbGxDb250cm9sc01hc2sJICgweEY4MDAxRkZGKQorI2RlZmluZQlYa2JBbGxDb250cm9sRXZlbnRzTWFzawkgWGtiQWxsQ29udHJvbHNNYXNrCisKKyAgICAvKgorICAgICAqIEFjY2Vzc1ggT3B0aW9ucyBNYXNrCisgICAgICogIC0gVGhlICdhY2Nlc3NYT3B0aW9ucycgZmllbGQgb2YgYW4gWGtiQ29udHJvbHNSZWMgc3BlY2lmaWVzIHRoZQorICAgICAqICAgIEFjY2Vzc1ggb3B0aW9ucyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gZWZmZWN0LgorICAgICAqICAtIFRoZSAnYWNjZXNzWFRpbWVvdXRPcHRpb25zTWFzaycgYW5kICdhY2Nlc3NYVGltZW91dE9wdGlvbnNWYWx1ZXMnCisgICAgICogICAgZmllbGRzIG9mIGFuIFhrYkNvbnRyb2xzUmVjIHNwZWNpZnkgdGhlIEFjY2VzcyBYIG9wdGlvbnMgdG8gYmUgCisgICAgICogICAgY2hhbmdlZCBpZiB0aGUga2V5Ym9hcmQgdGltZXMgb3V0IGFuZCB0aGUgdmFsdWVzIHRvIHdoaWNoIHRoZXkgCisgICAgICogICAgc2hvdWxkIGJlIGNoYW5nZWQuCisgICAgICovCisjZGVmaW5lCVhrYkFYX1NLUHJlc3NGQk1hc2sJKDFMIDw8IDApCisjZGVmaW5lCVhrYkFYX1NLQWNjZXB0RkJNYXNrCSgxTCA8PCAxKQorI2RlZmluZQlYa2JBWF9GZWF0dXJlRkJNYXNrCSgxTCA8PCAyKQorI2RlZmluZQlYa2JBWF9TbG93V2FybkZCTWFzawkoMUwgPDwgMykKKyNkZWZpbmUJWGtiQVhfSW5kaWNhdG9yRkJNYXNrCSgxTCA8PCA0KQorI2RlZmluZQlYa2JBWF9TdGlja3lLZXlzRkJNYXNrCSgxTCA8PCA1KQorI2RlZmluZQlYa2JBWF9Ud29LZXlzTWFzawkoMUwgPDwgNikKKyNkZWZpbmUJWGtiQVhfTGF0Y2hUb0xvY2tNYXNrCSgxTCA8PCA3KQorI2RlZmluZQlYa2JBWF9TS1JlbGVhc2VGQk1hc2sJKDFMIDw8IDgpCisjZGVmaW5lCVhrYkFYX1NLUmVqZWN0RkJNYXNrCSgxTCA8PCA5KQorI2RlZmluZQlYa2JBWF9CS1JlamVjdEZCTWFzawkoMUwgPDwgMTApCisjZGVmaW5lCVhrYkFYX0R1bWJCZWxsRkJNYXNrCSgxTCA8PCAxMSkKKyNkZWZpbmUJWGtiQVhfRkJPcHRpb25zTWFzawkoMHhGM0YpCisjZGVmaW5lCVhrYkFYX1NLT3B0aW9uc01hc2sJKDB4MEMwKQorI2RlZmluZQlYa2JBWF9BbGxPcHRpb25zTWFzawkoMHhGRkYpCisKKyAgICAvKgorICAgICAqIFhrYlVzZUNvcmVLYmQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb3JlIGtleWJvYXJkIHdpdGhvdXQgaGF2aW5nCisgICAgICogCQkJdG8gbG9vayB1cCBpdHMgWCBpbnB1dCBleHRlbnNpb24gaWRlbnRpZmllci4KKyAgICAgKiBYa2JVc2VDb3JlUHRyIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29yZSBwb2ludGVyIHdpdGhvdXQgaGF2aW5nCisgICAgICoJCQl0byBsb29rIHVwIGl0cyBYIGlucHV0IGV4dGVuc2lvbiBpZGVudGlmaWVyLgorICAgICAqIFhrYkRmbHRYSUNsYXNzIGlzIHVzZWQgdG8gc3BlY2lmeSAiZG9uJ3QgY2FyZSIgYW55IHBsYWNlIHRoYXQgdGhlCisgICAgICoJCQlYS0IgcHJvdG9jb2wgaXMgbG9va2luZyBmb3IgYW4gWCBJbnB1dCBFeHRlbnNpb24gCisgICAgICoJCQlkZXZpY2UgY2xhc3MuCisgICAgICogWGtiRGZsdFhJSWQgaXMgdXNlZCB0byBzcGVjaWZ5ICJkb24ndCBjYXJlIiBhbnkgcGxhY2UgdGhhdCB0aGUKKyAgICAgKgkJCVhLQiBwcm90b2NvbCBpcyBsb29raW5nIGZvciBhbiBYIElucHV0IEV4dGVuc2lvbgorICAgICAqCQkJZmVlZGJhY2sgaWRlbnRpZmllci4KKyAgICAgKiBYa2JBbGxYSUNsYXNzZXMgaXMgdXNlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGRldmljZSBpbmRpY2F0b3JzLAorICAgICAqCQkJd2hldGhlciB0aGV5J3JlIHBhcnQgb2YgdGhlIGluZGljYXRvciBmZWVkYmFjayBjbGFzcworICAgICAqCQkJb3IgdGhlIGtleWJvYXJkIGZlZWRiYWNrIGNsYXNzLgorICAgICAqIFhrYkFsbFhJSWRzIGlzIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGFsbCBkZXZpY2UgaW5kaWNhdG9yCisgICAgICoJCQlmZWVkYmFja3Mgd2l0aG91dCBoYXZpbmcgdG8gbGlzdCB0aGVtLgorICAgICAqIFhrYlhJTm9uZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gY2xhc3Mgb3IgaWQgaGFzIGJlZW4gc3BlY2lmaWVkLgorICAgICAqIFhrYkxlZ2FsWElMZWRDbGFzcyhjKSAgVHJ1ZSBpZiAnYycgc3BlY2lmaWVzIGEgbGVnYWwgY2xhc3Mgd2l0aCBMRURzCisgICAgICogWGtiTGVnYWxYSUJlbGxDbGFzcyhjKSBUcnVlIGlmICdjJyBzcGVjaWZpZXMgYSBsZWdhbCBjbGFzcyB3aXRoIGJlbGxzCisgICAgICogWGtiRXhwbGljaXRYSURldmljZShkKSBUcnVlIGlmICdkJyBleHBsaWNpdGx5IHNwZWNpZmllcyBhIGRldmljZQorICAgICAqIFhrYkV4cGxpY2l0WElDbGFzcyhjKSAgVHJ1ZSBpZiAnYycgZXhwbGljaXRseSBzcGVjaWZpZXMgYSBkZXZpY2UgY2xhc3MKKyAgICAgKiBYa2JFeHBsaWNpdFhJSWQoYykgICAgIFRydWUgaWYgJ2knIGV4cGxpY2l0bHkgc3BlY2lmaWVzIGEgZGV2aWNlIGlkCisgICAgICogWGtiU2luZ2xlWElDbGFzcyhjKSAgICBUcnVlIGlmICdjJyBzcGVjaWZpZXMgZXhhY3RseSBvbmUgZGV2aWNlIGNsYXNzLCAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyB0aGUgZGVmYXVsdC4KKyAgICAgKiBYa2JTaW5nbGVYSUlkKGkpICAgICAgIFRydWUgaWYgJ2knIHNwZWNpZmllcyBleGFjdGx5IG9uZSBkZXZpY2UgCisgICAgICoJICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIsIGluY2x1ZGluZyB0aGUgZGVmYXVsdC4KKyAgICAgKi8KKyNkZWZpbmUJWGtiVXNlQ29yZUtiZAkJMHgwMTAwCisjZGVmaW5lCVhrYlVzZUNvcmVQdHIJCTB4MDIwMAorI2RlZmluZQlYa2JEZmx0WElDbGFzcwkJMHgwMzAwCisjZGVmaW5lCVhrYkRmbHRYSUlkCQkweDA0MDAKKyNkZWZpbmUJWGtiQWxsWElDbGFzc2VzCQkweDA1MDAKKyNkZWZpbmUJWGtiQWxsWElJZHMJCTB4MDYwMAorI2RlZmluZQlYa2JYSU5vbmUJCTB4ZmYwMAorCisjZGVmaW5lCVhrYkxlZ2FsWElMZWRDbGFzcyhjKQkoKChjKT09S2JkRmVlZGJhY2tDbGFzcyl8fFwKKwkJCQkJKChjKT09TGVkRmVlZGJhY2tDbGFzcyl8fFwKKwkJCQkJKChjKT09WGtiRGZsdFhJQ2xhc3MpfHxcCisJCQkJCSgoYyk9PVhrYkFsbFhJQ2xhc3NlcykpCisjZGVmaW5lCVhrYkxlZ2FsWElCZWxsQ2xhc3MoYykJKCgoYyk9PUtiZEZlZWRiYWNrQ2xhc3MpfHxcCisJCQkJCSgoYyk9PUJlbGxGZWVkYmFja0NsYXNzKXx8XAorCQkJCQkoKGMpPT1Ya2JEZmx0WElDbGFzcyl8fFwKKwkJCQkJKChjKT09WGtiQWxsWElDbGFzc2VzKSkKKyNkZWZpbmUJWGtiRXhwbGljaXRYSURldmljZShjKQkoKChjKSYofjB4ZmYpKT09MCkKKyNkZWZpbmUJWGtiRXhwbGljaXRYSUNsYXNzKGMpCSgoKGMpJih+MHhmZikpPT0wKQorI2RlZmluZQlYa2JFeHBsaWNpdFhJSWQoYykJKCgoYykmKH4weGZmKSk9PTApCisjZGVmaW5lCVhrYlNpbmdsZVhJQ2xhc3MoYykJKCgoKGMpJih+MHhmZikpPT0wKXx8KChjKT09WGtiRGZsdFhJQ2xhc3MpKQorI2RlZmluZQlYa2JTaW5nbGVYSUlkKGMpCSgoKChjKSYofjB4ZmYpKT09MCl8fCgoYyk9PVhrYkRmbHRYSUlkKSkKKworI2RlZmluZQlYa2JOb01vZGlmaWVyCQkweGZmCisjZGVmaW5lCVhrYk5vU2hpZnRMZXZlbAkJMHhmZgorI2RlZmluZQlYa2JOb1NoYXBlCQkweGZmCisjZGVmaW5lCVhrYk5vSW5kaWNhdG9yCQkweGZmCisKKyNkZWZpbmUJWGtiTm9Nb2RpZmllck1hc2sJMAorI2RlZmluZQlYa2JBbGxNb2RpZmllcnNNYXNrCTB4ZmYKKyNkZWZpbmUJWGtiQWxsVmlydHVhbE1vZHNNYXNrCTB4ZmZmZgorCisjZGVmaW5lCVhrYk51bUtiZEdyb3VwcwkJNAorI2RlZmluZQlYa2JNYXhLYmRHcm91cAkJKFhrYk51bUtiZEdyb3Vwcy0xKQorCisjZGVmaW5lCVhrYk1heE1vdXNlS2V5c0J0bgk0CisKKyAgICAvKgorICAgICAqIEdyb3VwIEluZGV4IGFuZCBNYXNrOgorICAgICAqICAtIEluZGljZXMgaW50byB0aGUga3RfaW5kZXggYXJyYXkgb2YgYSBrZXkgdHlwZS4KKyAgICAgKiAgLSBNYXNrIHNwZWNpZmllcyB0eXBlcyB0byBiZSBjaGFuZ2VkIGZvciBYa2JDaGFuZ2VUeXBlc09mS2V5CisgICAgICovCisjZGVmaW5lCVhrYkdyb3VwMUluZGV4CQkwCisjZGVmaW5lCVhrYkdyb3VwMkluZGV4CQkxCisjZGVmaW5lCVhrYkdyb3VwM0luZGV4CQkyCisjZGVmaW5lCVhrYkdyb3VwNEluZGV4CQkzCisjZGVmaW5lCVhrYkFueUdyb3VwCQkyNTQKKyNkZWZpbmUJWGtiQWxsR3JvdXBzCQkyNTUKKworI2RlZmluZQlYa2JHcm91cDFNYXNrCQkoMTw8MCkKKyNkZWZpbmUJWGtiR3JvdXAyTWFzawkJKDE8PDEpCisjZGVmaW5lCVhrYkdyb3VwM01hc2sJCSgxPDwyKQorI2RlZmluZQlYa2JHcm91cDRNYXNrCQkoMTw8MykKKyNkZWZpbmUJWGtiQW55R3JvdXBNYXNrCQkoMTw8NykKKyNkZWZpbmUJWGtiQWxsR3JvdXBzTWFzawkoMHhmKQorCisgICAgLyoKKyAgICAgKiBCdWlsZENvcmVTdGF0ZTogR2l2ZW4gYSBrZXlib2FyZCBncm91cCBhbmQgYSBtb2RpZmllciBzdGF0ZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgY29uc3RydWN0IHRoZSB2YWx1ZSB0byBiZSByZXBvcnRlZCBhbiBldmVudC4KKyAgICAgKiBHcm91cEZvckNvcmVTdGF0ZTogIEdpdmVuIHRoZSBzdGF0ZSByZXBvcnRlZCBpbiBhbiBldmVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lIHRoZSBrZXlib2FyZCBncm91cC4KKyAgICAgKiBJc0xlZ2FsR3JvdXA6ICAgUmV0dXJucyBUUlVFIGlmICdnJyBpcyBhIHZhbGlkIGdyb3VwIGluZGV4LgorICAgICAqLworI2RlZmluZQlYa2JCdWlsZENvcmVTdGF0ZShtLGcpCSgoKChnKSYweDMpPDwxMyl8KChtKSYweGZmKSkKKyNkZWZpbmUgWGtiR3JvdXBGb3JDb3JlU3RhdGUocykJKCgocyk+PjEzKSYweDMpCisjZGVmaW5lCVhrYklzTGVnYWxHcm91cChnKQkoKChnKT49MCkmJigoZyk8WGtiTnVtS2JkR3JvdXBzKSkKKworICAgIC8qCisgICAgICogR3JvdXBzV3JhcCB2YWx1ZXM6CisgICAgICogIC0gVGhlICdncm91cHNXcmFwJyBmaWVsZCBvZiBhbiBYa2JDb250cm9sc1JlYyBzcGVjaWZpZXMgdGhlCisgICAgICogICAgdHJlYXRtZW50IG9mIG91dCBvZiByYW5nZSBncm91cHMuCisgICAgICogIC0gQml0cyA2IGFuZCA3IG9mIHRoZSBncm91cCBpbmZvIGZpZWxkIG9mIGEga2V5IHN5bWJvbCBtYXAKKyAgICAgKiAgICBzcGVjaWZ5IHRoZSBpbnRlcnByZXRhdGlvbiBvZiBvdXQgb2YgcmFuZ2UgZ3JvdXBzIGZvciB0aGUKKyAgICAgKiAgICBjb3JyZXNwb25kaW5nIGtleS4KKyAgICAgKi8KKyNkZWZpbmUJWGtiV3JhcEludG9SYW5nZQkoMHgwMCkKKyNkZWZpbmUJWGtiQ2xhbXBJbnRvUmFuZ2UJKDB4NDApCisjZGVmaW5lCVhrYlJlZGlyZWN0SW50b1JhbmdlCSgweDgwKQorCisgICAgLyoKKyAgICAgKiBBY3Rpb24gZmxhZ3M6ICBSZXBvcnRlZCBpbiB0aGUgJ2ZsYWdzJyBmaWVsZCBvZiBtb3N0IGtleSBhY3Rpb25zLgorICAgICAqIEludGVycHJldGF0aW9uIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlIGFjdGlvbjsgbm90IGFsbCBhY3Rpb25zCisgICAgICogYWNjZXB0IGFsbCBmbGFncy4KKyAgICAgKgorICAgICAqIE9wdGlvbgkJCVVzZWQgZm9yIEFjdGlvbnMKKyAgICAgKiAtLS0tLS0JCQktLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ2xlYXJMb2NrcwkJU2V0TW9kcywgTGF0Y2hNb2RzLCBTZXRHcm91cCwgTGF0Y2hHcm91cAorICAgICAqIExhdGNoVG9Mb2NrCQlTZXRNb2RzLCBMYXRjaE1vZHMsIFNldEdyb3VwLCBMYXRjaEdyb3VwCisgICAgICogTG9ja05vTG9jawkJTG9ja01vZHMsIElTT0xvY2ssIExvY2tQdHJCdG4sIExvY2tEZXZpY2VCdG4KKyAgICAgKiBMb2NrTm9VbmxvY2sJCUxvY2tNb2RzLCBJU09Mb2NrLCBMb2NrUHRyQnRuLCBMb2NrRGV2aWNlQnRuCisgICAgICogVXNlTW9kTWFwTW9kcwkJU2V0TW9kcywgTGF0Y2hNb2RzLCBMb2NrTW9kcywgSVNPTG9jaworICAgICAqIEdyb3VwQWJzb2x1dGUJCVNldEdyb3VwLCBMYXRjaEdyb3VwLCBMb2NrR3JvdXAsIElTT0xvY2sKKyAgICAgKiBVc2VEZmx0QnV0dG9uCQlQdHJCdG4sIExvY2tQdHJCdG4KKyAgICAgKiBOb0FjY2VsZXJhdGlvbgkJTW92ZVB0cgorICAgICAqIE1vdmVBYnNvbHV0ZVgJCU1vdmVQdHIKKyAgICAgKiBNb3ZlQWJzb2x1dGVZCQlNb3ZlUHRyCisgICAgICogSVNPRGZsdElzR3JvdXAJCUlTT0xvY2sKKyAgICAgKiBJU09Ob0FmZmVjdE1vZHMJCUlTT0xvY2sKKyAgICAgKiBJU09Ob0FmZmVjdEdyb3VwCQlJU09Mb2NrCisgICAgICogSVNPTm9BZmZlY3RQdHIJCUlTT0xvY2sKKyAgICAgKiBJU09Ob0FmZmVjdEN0cmxzCQlJU09Mb2NrCisgICAgICogTWVzc2FnZU9uUHJlc3MJCUFjdGlvbk1lc3NhZ2UKKyAgICAgKiBNZXNzYWdlT25SZWxlYXNlCQlBY3Rpb25NZXNzYWdlCisgICAgICogTWVzc2FnZUdlbktleUV2ZW50CUFjdGlvbk1lc3NhZ2UKKyAgICAgKiBBZmZlY3REZmx0QnRuCQlTZXRQdHJEZmx0CisgICAgICogRGZsdEJ0bkFic29sdXRlCQlTZXRQdHJEZmx0CisgICAgICogU3dpdGNoQXBwbGljYXRpb24JU3dpdGNoU2NyZWVuCisgICAgICogU3dpdGNoQWJzb2x1dGUJCVN3aXRjaFNjcmVlbgorICAgICAqLworCisjZGVmaW5lCVhrYlNBX0NsZWFyTG9ja3MJKDFMIDw8IDApCisjZGVmaW5lCVhrYlNBX0xhdGNoVG9Mb2NrCSgxTCA8PCAxKQorCisjZGVmaW5lCVhrYlNBX0xvY2tOb0xvY2sJKDFMIDw8IDApCisjZGVmaW5lCVhrYlNBX0xvY2tOb1VubG9jawkoMUwgPDwgMSkKKworI2RlZmluZQlYa2JTQV9Vc2VNb2RNYXBNb2RzCSgxTCA8PCAyKQorCisjZGVmaW5lCVhrYlNBX0dyb3VwQWJzb2x1dGUJKDFMIDw8IDIpCisjZGVmaW5lCVhrYlNBX1VzZURmbHRCdXR0b24JMAorCisjZGVmaW5lCVhrYlNBX05vQWNjZWxlcmF0aW9uCSgxTCA8PCAwKQorI2RlZmluZQlYa2JTQV9Nb3ZlQWJzb2x1dGVYCSgxTCA8PCAxKQorI2RlZmluZQlYa2JTQV9Nb3ZlQWJzb2x1dGVZCSgxTCA8PCAyKQorCisjZGVmaW5lCVhrYlNBX0lTT0RmbHRJc0dyb3VwIAkgKDFMIDw8IDcpCisjZGVmaW5lCVhrYlNBX0lTT05vQWZmZWN0TW9kcwkgKDFMIDw8IDYpCisjZGVmaW5lCVhrYlNBX0lTT05vQWZmZWN0R3JvdXAJICgxTCA8PCA1KQorI2RlZmluZQlYa2JTQV9JU09Ob0FmZmVjdFB0cgkgKDFMIDw8IDQpCisjZGVmaW5lCVhrYlNBX0lTT05vQWZmZWN0Q3RybHMJICgxTCA8PCAzKQorI2RlZmluZQlYa2JTQV9JU09BZmZlY3RNYXNrCSAoMHg3OCkKKworI2RlZmluZQlYa2JTQV9NZXNzYWdlT25QcmVzcwkgKDFMIDw8IDApCisjZGVmaW5lCVhrYlNBX01lc3NhZ2VPblJlbGVhc2UJICgxTCA8PCAxKQorI2RlZmluZQlYa2JTQV9NZXNzYWdlR2VuS2V5RXZlbnQgKDFMIDw8IDIpCisKKyNkZWZpbmUJWGtiU0FfQWZmZWN0RGZsdEJ0bgkxCisjZGVmaW5lCVhrYlNBX0RmbHRCdG5BYnNvbHV0ZQkoMUwgPDwgMikKKworI2RlZmluZQlYa2JTQV9Td2l0Y2hBcHBsaWNhdGlvbgkoMUwgPDwgMCkKKyNkZWZpbmUJWGtiU0FfU3dpdGNoQWJzb2x1dGUJKDFMIDw8IDIpCisKKyAgICAvKgorICAgICAqIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFwcGx5IHRvIHRoZSBTQV9EZXZpY2VWYWx1YXRvciAKKyAgICAgKiBhY3Rpb24gb25seS4gIFZhbHVhdG9yIG9wZXJhdGlvbnMgc3BlY2lmeSB0aGUgYWN0aW9uIAorICAgICAqIHRvIGJlIHRha2VuLiAgIFZhbHVlcyBzcGVjaWZpZWQgaW4gdGhlIGFjdGlvbiBhcmUgCisgICAgICogbXVsdGlwbGllZCBieSAyXnNjYWxlIGJlZm9yZSB0aGV5IGFyZSBhcHBsaWVkLgorICAgICAqLworI2RlZmluZQlYa2JTQV9JZ25vcmVWYWwJCSgweDAwKQorI2RlZmluZQlYa2JTQV9TZXRWYWxNaW4JCSgweDEwKQorI2RlZmluZQlYa2JTQV9TZXRWYWxDZW50ZXIJKDB4MjApCisjZGVmaW5lCVhrYlNBX1NldFZhbE1heAkJKDB4MzApCisjZGVmaW5lCVhrYlNBX1NldFZhbFJlbGF0aXZlCSgweDQwKQorI2RlZmluZQlYa2JTQV9TZXRWYWxBYnNvbHV0ZQkoMHg1MCkKKyNkZWZpbmUJWGtiU0FfVmFsT3BNYXNrCQkoMHg3MCkKKyNkZWZpbmUJWGtiU0FfVmFsU2NhbGVNYXNrCSgweDA3KQorI2RlZmluZQlYa2JTQV9WYWxPcChhKQkJKChhKSZYa2JTQV9WYWxPcE1hc2spCisjZGVmaW5lCVhrYlNBX1ZhbFNjYWxlKGEpCSgoYSkmWGtiU0FfVmFsU2NhbGVNYXNrKQorCisgICAgLyoKKyAgICAgKiBBY3Rpb24gdHlwZXM6IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBhIGtleSBhY3Rpb24uICBSZXBvcnRlZCBpbiB0aGUKKyAgICAgKiB0eXBlIGZpZWxkIG9mIGFsbCBrZXkgYWN0aW9ucy4KKyAgICAgKi8KKyNkZWZpbmUJWGtiU0FfTm9BY3Rpb24JCTB4MDAKKyNkZWZpbmUJWGtiU0FfU2V0TW9kcwkJMHgwMQorI2RlZmluZQlYa2JTQV9MYXRjaE1vZHMJCTB4MDIKKyNkZWZpbmUJWGtiU0FfTG9ja01vZHMJCTB4MDMKKyNkZWZpbmUJWGtiU0FfU2V0R3JvdXAJCTB4MDQKKyNkZWZpbmUJWGtiU0FfTGF0Y2hHcm91cAkweDA1CisjZGVmaW5lCVhrYlNBX0xvY2tHcm91cAkJMHgwNgorI2RlZmluZQlYa2JTQV9Nb3ZlUHRyCQkweDA3CisjZGVmaW5lCVhrYlNBX1B0ckJ0bgkJMHgwOAorI2RlZmluZQlYa2JTQV9Mb2NrUHRyQnRuCTB4MDkKKyNkZWZpbmUJWGtiU0FfU2V0UHRyRGZsdAkweDBhCisjZGVmaW5lCVhrYlNBX0lTT0xvY2sJCTB4MGIKKyNkZWZpbmUJWGtiU0FfVGVybWluYXRlCQkweDBjCisjZGVmaW5lCVhrYlNBX1N3aXRjaFNjcmVlbgkweDBkCisjZGVmaW5lCVhrYlNBX1NldENvbnRyb2xzCTB4MGUKKyNkZWZpbmUJWGtiU0FfTG9ja0NvbnRyb2xzCTB4MGYKKyNkZWZpbmUJWGtiU0FfQWN0aW9uTWVzc2FnZQkweDEwCisjZGVmaW5lCVhrYlNBX1JlZGlyZWN0S2V5CTB4MTEKKyNkZWZpbmUJWGtiU0FfRGV2aWNlQnRuCQkweDEyCisjZGVmaW5lCVhrYlNBX0xvY2tEZXZpY2VCdG4JMHgxMworI2RlZmluZQlYa2JTQV9EZXZpY2VWYWx1YXRvcgkweDE0CisjZGVmaW5lCVhrYlNBX0xhc3RBY3Rpb24JWGtiU0FfRGV2aWNlVmFsdWF0b3IKKyNkZWZpbmUJWGtiU0FfTnVtQWN0aW9ucwkoWGtiU0FfTGFzdEFjdGlvbisxKQorCisjZGVmaW5lCVhrYlNBX1hGcmVlODZQcml2YXRlCTB4ODYKKworICAgIC8qCisgICAgICogU3BlY2lmaWVzIHRoZSBrZXkgYWN0aW9ucyB0aGF0IGNsZWFyIGxhdGNoZWQgZ3JvdXBzIG9yIG1vZGlmaWVycy4KKyAgICAgKi8KKyNkZWZpbmUJWGtiU0FfQnJlYWtMYXRjaCBcCisJKCgxPDxYa2JTQV9Ob0FjdGlvbil8KDE8PFhrYlNBX1B0ckJ0bil8KDE8PFhrYlNBX0xvY2tQdHJCdG4pfFwKKwkoMTw8WGtiU0FfVGVybWluYXRlKXwoMTw8WGtiU0FfU3dpdGNoU2NyZWVuKXwoMTw8WGtiU0FfU2V0Q29udHJvbHMpfFwKKwkoMTw8WGtiU0FfTG9ja0NvbnRyb2xzKXwoMTw8WGtiU0FfQWN0aW9uTWVzc2FnZSl8XAorCSgxPDxYa2JTQV9SZWRpcmVjdEtleSl8KDE8PFhrYlNBX0RldmljZUJ0bil8KDE8PFhrYlNBX0xvY2tEZXZpY2VCdG4pKQorCSAKKyAgICAvKgorICAgICAqIE1hY3JvcyB0byBjbGFzc2lmeSBrZXkgYWN0aW9ucworICAgICAqLworI2RlZmluZQlYa2JJc01vZEFjdGlvbihhKQkoKChhKS0+dHlwZT49WGtiX1NBU2V0TW9kcykmJigoYSktPnR5cGU8PVhrYlNBX0xvY2tNb2RzKSkKKyNkZWZpbmUJWGtiSXNHcm91cEFjdGlvbihhKQkoKChhKS0+dHlwZT49WGtiU0FfU2V0R3JvdXApJiYoKGEpLT50eXBlPD1Ya2JTQV9Mb2NrR3JvdXApKQorI2RlZmluZQlYa2JJc1B0ckFjdGlvbihhKQkoKChhKS0+dHlwZT49WGtiU0FfTW92ZVB0cikmJigoYSktPnR5cGU8PVhrYlNBX1NldFB0ckRmbHQpKQorCisKKyAgICAvKgorICAgICAqIEtleSBCZWhhdmlvciBRdWFsaWZpZXI6CisgICAgICogICAgS0JfUGVybWFuZW50IGluZGljYXRlcyB0aGF0IHRoZSBiZWhhdmlvciBkZXNjcmliZXMgYW4gdW5hbHRlcmFibGUKKyAgICAgKiAgICBjaGFyYWN0ZXJpc3RpYyBvZiB0aGUga2V5Ym9hcmQsIG5vdCBhbiBYS0Igc29mdHdhcmUtc2ltdWxhdGlvbiBvZgorICAgICAqICAgIHRoZSBsaXN0ZWQgYmVoYXZpb3IuCisgICAgICogS2V5IEJlaGF2aW9yIFR5cGVzOiAgCisgICAgICogICAgU3BlY2lmaWVzIHRoZSBiZWhhdmlvciBvZiB0aGUgdW5kZXJseWluZyBrZXkuCisgICAgICovCisjZGVmaW5lCVhrYktCX1Blcm1hbmVudAkJMHg4MAorI2RlZmluZQlYa2JLQl9PcE1hc2sJCTB4N2YKKworI2RlZmluZQlYa2JLQl9EZWZhdWx0CQkweDAwCisjZGVmaW5lCVhrYktCX0xvY2sJCTB4MDEKKyNkZWZpbmUJWGtiS0JfUmFkaW9Hcm91cAkweDAyCisjZGVmaW5lCVhrYktCX092ZXJsYXkxCQkweDAzCisjZGVmaW5lCVhrYktCX092ZXJsYXkyCQkweDA0CisKKyNkZWZpbmUJWGtiS0JfUkdBbGxvd05vbmUJMHg4MAorCisgICAgLyoKKyAgICAgKiBWYXJpb3VzIG1hY3JvcyB3aGljaCBkZXNjcmliZSB0aGUgcmFuZ2Ugb2YgbGVnYWwga2V5Y29kZXMuCisgICAgICovCisjZGVmaW5lCVhrYk1pbkxlZ2FsS2V5Q29kZQk4CisjZGVmaW5lCVhrYk1heExlZ2FsS2V5Q29kZQkyNTUKKyNkZWZpbmUJWGtiTWF4S2V5Q291bnQJCShYa2JNYXhMZWdhbEtleUNvZGUtWGtiTWluTGVnYWxLZXlDb2RlKzEpCisjZGVmaW5lCVhrYlBlcktleUJpdEFycmF5U2l6ZQkoKFhrYk1heExlZ2FsS2V5Q29kZSsxKS84KQorLyogU2VlbXMga2luZGEgc2lsbHkgdG8gY2hlY2sgdGhhdCBhbiB1bnNpZ25lZCBjaGFyIGlzIDw9IDI1NS4uLiAqLworI2RlZmluZQlYa2JJc0xlZ2FsS2V5Y29kZShrKQkoKGspPj1Ya2JNaW5MZWdhbEtleUNvZGUpCisKKyAgICAvKgorICAgICAqIEFzc29ydGVkIGNvbnN0YW50cyBhbmQgbGltaXRzLgorICAgICAqLworI2RlZmluZQlYa2JOdW1Nb2RpZmllcnMJCTgKKyNkZWZpbmUJWGtiTnVtVmlydHVhbE1vZHMJMTYKKyNkZWZpbmUJWGtiTnVtSW5kaWNhdG9ycwkzMgorI2RlZmluZQlYa2JBbGxJbmRpY2F0b3JzTWFzawkoMHhmZmZmZmZmZikKKyNkZWZpbmUJWGtiTWF4UmFkaW9Hcm91cHMJMzIKKyNkZWZpbmUJWGtiQWxsUmFkaW9Hcm91cHNNYXNrCSgweGZmZmZmZmZmKQorI2RlZmluZQlYa2JNYXhTaGlmdExldmVsCTYzCisjZGVmaW5lCVhrYk1heFN5bXNQZXJLZXkJKFhrYk1heFNoaWZ0TGV2ZWwqWGtiTnVtS2JkR3JvdXBzKQorI2RlZmluZQlYa2JSR01heE1lbWJlcnMJCTEyCisjZGVmaW5lCVhrYkFjdGlvbk1lc3NhZ2VMZW5ndGgJNgorI2RlZmluZQlYa2JLZXlOYW1lTGVuZ3RoCTQKKyNkZWZpbmUJWGtiTWF4UmVkaXJlY3RDb3VudAk4CisKKyNkZWZpbmUJWGtiR2VvbVB0c1Blck1NCQkxMAorI2RlZmluZQlYa2JHZW9tTWF4Q29sb3JzCTMyCisjZGVmaW5lCVhrYkdlb21NYXhMYWJlbENvbG9ycwkzCisjZGVmaW5lCVhrYkdlb21NYXhQcmlvcml0eQkyNTUKKworICAgIC8qCisgICAgICogS2V5IFR5cGUgaW5kZXggYW5kIG1hc2sgZm9yIHRoZSBmb3VyIHN0YW5kYXJkIGtleSB0eXBlcy4KKyAgICAgKi8KKyNkZWZpbmUJWGtiT25lTGV2ZWxJbmRleAkwCisjZGVmaW5lCVhrYlR3b0xldmVsSW5kZXgJMQorI2RlZmluZQlYa2JBbHBoYWJldGljSW5kZXgJMgorI2RlZmluZQlYa2JLZXlwYWRJbmRleAkJMworI2RlZmluZQlYa2JMYXN0UmVxdWlyZWRUeXBlCVhrYktleXBhZEluZGV4CisjZGVmaW5lCVhrYk51bVJlcXVpcmVkVHlwZXMJKFhrYkxhc3RSZXF1aXJlZFR5cGUrMSkKKyNkZWZpbmUJWGtiTWF4S2V5VHlwZXMJCTI1NQorCisjZGVmaW5lCVhrYk9uZUxldmVsTWFzawkJKDE8PDApCisjZGVmaW5lCVhrYlR3b0xldmVsTWFzawkJKDE8PDEpCisjZGVmaW5lCVhrYkFscGhhYmV0aWNNYXNrCSgxPDwyKQorI2RlZmluZQlYa2JLZXlwYWRNYXNrCQkoMTw8MykKKyNkZWZpbmUJWGtiQWxsUmVxdWlyZWRUeXBlcwkoMHhmKQorCisjZGVmaW5lCVhrYlNoaWZ0TGV2ZWwobikJKChuKS0xKQorI2RlZmluZQlYa2JTaGlmdExldmVsTWFzayhuKQkoMTw8KChuKS0xKSkKKworICAgIC8qCisgICAgICogRXh0ZW5zaW9uIG5hbWUgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24KKyAgICAgKi8KKyNkZWZpbmUJWGtiTmFtZSAiWEtFWUJPQVJEIgorI2RlZmluZQlYa2JNYWpvclZlcnNpb24JMQorI2RlZmluZQlYa2JNaW5vclZlcnNpb24JMAorCisgICAgLyoKKyAgICAgKiBFeHBsaWNpdCBtYXAgY29tcG9uZW50czoKKyAgICAgKiAgLSBVc2VkIGluIHRoZSAnZXhwbGljaXQnIGZpZWxkIG9mIGFuIFhrYlNlcnZlck1hcC4gIFNwZWNpZmllcworICAgICAqICAgIHRoZSBrZXlib2FyZCBjb21wb25lbnRzIHRoYXQgc2hvdWxkIF9ub3RfIGJlIHVwZGF0ZWQgYXV0b21hdGljYWxseQorICAgICAqICAgIGluIHJlc3BvbnNlIHRvIGNvcmUgcHJvdG9jb2wga2V5Ym9hcmQgbWFwcGluZyByZXF1ZXN0cy4KKyAgICAgKi8KKyNkZWZpbmUJWGtiRXhwbGljaXRLZXlUeXBlc01hc2sJICAoMHgwZikKKyNkZWZpbmUJWGtiRXhwbGljaXRLZXlUeXBlMU1hc2sJICAoMTw8MCkKKyNkZWZpbmUJWGtiRXhwbGljaXRLZXlUeXBlMk1hc2sJICAoMTw8MSkKKyNkZWZpbmUJWGtiRXhwbGljaXRLZXlUeXBlM01hc2sJICAoMTw8MikKKyNkZWZpbmUJWGtiRXhwbGljaXRLZXlUeXBlNE1hc2sJICAoMTw8MykKKyNkZWZpbmUJWGtiRXhwbGljaXRJbnRlcnByZXRNYXNrICAoMTw8NCkKKyNkZWZpbmUJWGtiRXhwbGljaXRBdXRvUmVwZWF0TWFzayAoMTw8NSkKKyNkZWZpbmUJWGtiRXhwbGljaXRCZWhhdmlvck1hc2sJICAoMTw8NikKKyNkZWZpbmUJWGtiRXhwbGljaXRWTW9kTWFwTWFzawkgICgxPDw3KQorI2RlZmluZQlYa2JBbGxFeHBsaWNpdE1hc2sJICAoMHhmZikKKworICAgIC8qCisgICAgICogTWFwIGNvbXBvbmVudHMgbWFza3M6CisgICAgICogVGhvc2UgaW4gQWxsTWFwQ29tcG9uZW50c01hc2s6CisgICAgICogIC0gU3BlY2lmaWVzIHRoZSBpbmRpdmlkdWFsIGZpZWxkcyB0byBiZSBsb2FkZWQgb3IgY2hhbmdlZCBmb3IgdGhlCisgICAgICogICAgR2V0TWFwIGFuZCBTZXRNYXAgcmVxdWVzdHMuCisgICAgICogVGhvc2UgaW4gQ2xpZW50SW5mb01hc2s6CisgICAgICogIC0gU3BlY2lmaWVzIHRoZSBjb21wb25lbnRzIHRvIGJlIGFsbG9jYXRlZCBieSBYa2JBbGxvY0NsaWVudE1hcC4KKyAgICAgKiBUaG9zZSBpbiBTZXJ2ZXJJbmZvTWFzazoKKyAgICAgKiAgLSBTcGVjaWZpZXMgdGhlIGNvbXBvbmVudHMgdG8gYmUgYWxsb2NhdGVkIGJ5IFhrYkFsbG9jU2VydmVyTWFwLgorICAgICAqLworI2RlZmluZQlYa2JLZXlUeXBlc01hc2sJCSgxPDwwKQorI2RlZmluZQlYa2JLZXlTeW1zTWFzawkJKDE8PDEpCisjZGVmaW5lCVhrYk1vZGlmaWVyTWFwTWFzawkoMTw8MikKKyNkZWZpbmUJWGtiRXhwbGljaXRDb21wb25lbnRzTWFzayAoMTw8MykKKyNkZWZpbmUgWGtiS2V5QWN0aW9uc01hc2sJKDE8PDQpCisjZGVmaW5lCVhrYktleUJlaGF2aW9yc01hc2sJKDE8PDUpCisjZGVmaW5lCVhrYlZpcnR1YWxNb2RzTWFzawkoMTw8NikKKyNkZWZpbmUJWGtiVmlydHVhbE1vZE1hcE1hc2sJKDE8PDcpCisKKyNkZWZpbmUJWGtiQWxsQ2xpZW50SW5mb01hc2sJKFhrYktleVR5cGVzTWFza3xYa2JLZXlTeW1zTWFza3xYa2JNb2RpZmllck1hcE1hc2spCisjZGVmaW5lCVhrYkFsbFNlcnZlckluZm9NYXNrCShYa2JFeHBsaWNpdENvbXBvbmVudHNNYXNrfFhrYktleUFjdGlvbnNNYXNrfFhrYktleUJlaGF2aW9yc01hc2t8WGtiVmlydHVhbE1vZHNNYXNrfFhrYlZpcnR1YWxNb2RNYXBNYXNrKQorI2RlZmluZQlYa2JBbGxNYXBDb21wb25lbnRzTWFzawkoWGtiQWxsQ2xpZW50SW5mb01hc2t8WGtiQWxsU2VydmVySW5mb01hc2spCisKKyAgICAvKgorICAgICAqIFN5bWJvbCBpbnRlcnByZXRhdGlvbnMgZmxhZ3M6CisgICAgICogIC0gVXNlZCBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzeW1ib2wgaW50ZXJwcmV0YXRpb24KKyAgICAgKi8KKyNkZWZpbmUJWGtiU0lfQXV0b1JlcGVhdAkoMTw8MCkKKyNkZWZpbmUJWGtiU0lfTG9ja2luZ0tleQkoMTw8MSkKKworICAgIC8qCisgICAgICogU3ltYm9sIGludGVycHJldGF0aW9ucyBtYXRjaCBzcGVjaWZpY2F0aW9uOgorICAgICAqICAtIFVzZWQgaW4gdGhlIG1hdGNoIGZpZWxkIG9mIGEgc3ltYm9sIGludGVycHJldGF0aW9uIHRvIHNwZWNpZnkgCisgICAgICogICAgdGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggYW4gaW50ZXJwcmV0YXRpb24gaXMgdXNlZC4KKyAgICAgKi8KKyNkZWZpbmUJWGtiU0lfTGV2ZWxPbmVPbmx5CSgweDgwKQorI2RlZmluZQlYa2JTSV9PcE1hc2sJCSgweDdmKQorI2RlZmluZQlYa2JTSV9Ob25lT2YJCSgwKQorI2RlZmluZQlYa2JTSV9BbnlPZk9yTm9uZQkoMSkKKyNkZWZpbmUJWGtiU0lfQW55T2YJCSgyKQorI2RlZmluZQlYa2JTSV9BbGxPZgkJKDMpCisjZGVmaW5lCVhrYlNJX0V4YWN0bHkJCSg0KQorCisgICAgLyoKKyAgICAgKiBJbmRpY2F0b3IgbWFwIGZsYWdzOgorICAgICAqICAtIFVzZWQgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIGFuIGluZGljYXRvciBtYXAgdG8gaW5kaWNhdGUgdGhlCisgICAgICogICAgY29uZGl0aW9ucyB1bmRlciB3aGljaCBhbmQgaW5kaWNhdG9yIGNhbiBiZSBjaGFuZ2VkIGFuZCB0aGUKKyAgICAgKiAgICBlZmZlY3RzIG9mIGNoYW5naW5nIHRoZSBpbmRpY2F0b3IuCisgICAgICovCisjZGVmaW5lCVhrYklNX05vRXhwbGljaXQJKDFMIDw8IDcpCisjZGVmaW5lCVhrYklNX05vQXV0b21hdGljCSgxTCA8PCA2KQorI2RlZmluZQlYa2JJTV9MRUREcml2ZXNLQgkoMUwgPDwgNSkKKworICAgIC8qCisgICAgICogSW5kaWNhdG9yIG1hcCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnM6CisgICAgICogIC0gVXNlZCBieSB0aGUgJ3doaWNoX2dyb3VwcycgYW5kICd3aGljaF9tb2RzJyBmaWVsZHMgb2YgYW4gaW5kaWNhdG9yCisgICAgICogICAgbWFwIHRvIHNwZWNpZnkgd2hpY2gga2V5Ym9hcmQgY29tcG9uZW50cyBzaG91bGQgYmUgdXNlZCB0byBkcml2ZQorICAgICAqICAgIHRoZSBpbmRpY2F0b3IuCisgICAgICovCisjZGVmaW5lCVhrYklNX1VzZUJhc2UJCSgxTCA8PCAwKQorI2RlZmluZQlYa2JJTV9Vc2VMYXRjaGVkCSgxTCA8PCAxKQorI2RlZmluZQlYa2JJTV9Vc2VMb2NrZWQJCSgxTCA8PCAyKQorI2RlZmluZQlYa2JJTV9Vc2VFZmZlY3RpdmUJKDFMIDw8IDMpCisjZGVmaW5lCVhrYklNX1VzZUNvbXBhdAkJKDFMIDw8IDQpCisKKyNkZWZpbmUJWGtiSU1fVXNlTm9uZQkgIDAKKyNkZWZpbmUJWGtiSU1fVXNlQW55R3JvdXAgKFhrYklNX1VzZUJhc2V8WGtiSU1fVXNlTGF0Y2hlZHxYa2JJTV9Vc2VMb2NrZWRcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8WGtiSU1fVXNlRWZmZWN0aXZlKQorI2RlZmluZQlYa2JJTV9Vc2VBbnlNb2RzICAoWGtiSU1fVXNlQW55R3JvdXB8WGtiSU1fVXNlQ29tcGF0KQorCisgICAgLyoKKyAgICAgKiBDb21wYXRpYmlsaXR5IE1hcCBDb21wb250ZW50czoKKyAgICAgKiAgLSBTcGVjaWZpZXMgdGhlIGNvbXBvbmVudHMgdG8gYmUgYWxsb2NhdGVkIGluIFhrYkFsbG9jQ29tcGF0TWFwLgorICAgICAqLworI2RlZmluZQlYa2JTeW1JbnRlcnBNYXNrCSgxPDwwKQorI2RlZmluZQlYa2JHcm91cENvbXBhdE1hc2sJKDE8PDEpCisjZGVmaW5lCVhrYkFsbENvbXBhdE1hc2sJKDB4MykKKworICAgIC8qCisgICAgICogTmFtZXMgY29tcG9uZW50IG1hc2s6CisgICAgICogIC0gU3BlY2lmaWVzIHRoZSBuYW1lcyB0byBiZSBsb2FkZWQgb3IgY2hhbmdlZCBmb3IgdGhlIEdldE5hbWVzIGFuZAorICAgICAqICAgIFNldE5hbWVzIHJlcXVlc3RzLgorICAgICAqICAtIFNwZWNpZmllcyB0aGUgbmFtZXMgdGhhdCBoYXZlIGNoYW5nZWQgaW4gYSBOYW1lc05vdGlmeSBldmVudC4KKyAgICAgKiAgLSBTcGVjaWZpZXMgdGhlIG5hbWVzIGNvbXBvbmVudHMgdG8gYmUgYWxsb2NhdGVkIGJ5IFhrYkFsbG9jTmFtZXMuCisgICAgICovCisjZGVmaW5lCVhrYktleWNvZGVzTmFtZU1hc2sJKDE8PDApCisjZGVmaW5lCVhrYkdlb21ldHJ5TmFtZU1hc2sJKDE8PDEpCisjZGVmaW5lCVhrYlN5bWJvbHNOYW1lTWFzawkoMTw8MikKKyNkZWZpbmUJWGtiUGh5c1N5bWJvbHNOYW1lTWFzawkoMTw8MykKKyNkZWZpbmUJWGtiVHlwZXNOYW1lTWFzawkoMTw8NCkKKyNkZWZpbmUJWGtiQ29tcGF0TmFtZU1hc2sgCSgxPDw1KQorI2RlZmluZQlYa2JLZXlUeXBlTmFtZXNNYXNrCSgxPDw2KQorI2RlZmluZQlYa2JLVExldmVsTmFtZXNNYXNrCSgxPDw3KQorI2RlZmluZQlYa2JJbmRpY2F0b3JOYW1lc01hc2sJKDE8PDgpCisjZGVmaW5lCVhrYktleU5hbWVzTWFzawkJKDE8PDkpCisjZGVmaW5lCVhrYktleUFsaWFzZXNNYXNrCSgxPDwxMCkKKyNkZWZpbmUJWGtiVmlydHVhbE1vZE5hbWVzTWFzawkoMTw8MTEpCisjZGVmaW5lCVhrYkdyb3VwTmFtZXNNYXNrCSgxPDwxMikKKyNkZWZpbmUJWGtiUkdOYW1lc01hc2sJCSgxPDwxMykKKyNkZWZpbmUJWGtiQ29tcG9uZW50TmFtZXNNYXNrCSgweDNmKQorI2RlZmluZQlYa2JBbGxOYW1lc01hc2sJCSgweDNmZmYpCisKKyAgICAvKgorICAgICAqIEdldEJ5TmFtZSBjb21wb25lbnRzOgorICAgICAqICAtIFNwZWNpZmllcyBkZXNpcmVkIG9yIG5lY2Vzc2FyeSBjb21wb25lbnRzIHRvIEdldEtiZEJ5TmFtZSByZXF1ZXN0LgorICAgICAqICAtIFJlcG9ydHMgdGhlIGNvbXBvbmVudHMgdGhhdCB3ZXJlIGZvdW5kIGluIGEgR2V0S2JkQnlOYW1lUmVwbHkKKyAgICAgKi8KKyNkZWZpbmUJWGtiR0JOX1R5cGVzTWFzawkJKDFMIDw8IDApCisjZGVmaW5lCVhrYkdCTl9Db21wYXRNYXBNYXNrCQkoMUwgPDwgMSkKKyNkZWZpbmUJWGtiR0JOX0NsaWVudFN5bWJvbHNNYXNrCSgxTCA8PCAyKQorI2RlZmluZQlYa2JHQk5fU2VydmVyU3ltYm9sc01hc2sJKDFMIDw8IDMpCisjZGVmaW5lCVhrYkdCTl9TeW1ib2xzTWFzayAoWGtiR0JOX0NsaWVudFN5bWJvbHNNYXNrfFhrYkdCTl9TZXJ2ZXJTeW1ib2xzTWFzaykKKyNkZWZpbmUJWGtiR0JOX0luZGljYXRvck1hcE1hc2sJCSgxTCA8PCA0KQorI2RlZmluZQlYa2JHQk5fS2V5TmFtZXNNYXNrCQkoMUwgPDwgNSkKKyNkZWZpbmUJWGtiR0JOX0dlb21ldHJ5TWFzawkJKDFMIDw8IDYpCisjZGVmaW5lCVhrYkdCTl9PdGhlck5hbWVzTWFzawkJKDFMIDw8IDcpCisjZGVmaW5lCVhrYkdCTl9BbGxDb21wb25lbnRzTWFzawkoMHhmZikKKworICAgICAvKgorICAgICAgKiBMaXN0Q29tcG9uZW50cyBmbGFncworICAgICAgKi8KKyNkZWZpbmUJWGtiTENfSGlkZGVuCQkJKDFMIDw8ICAwKQorI2RlZmluZQlYa2JMQ19EZWZhdWx0CQkJKDFMIDw8ICAxKQorI2RlZmluZQlYa2JMQ19QYXJ0aWFsCQkJKDFMIDw8ICAyKQorCisjZGVmaW5lCVhrYkxDX0FscGhhbnVtZXJpY0tleXMJCSgxTCA8PCAgOCkKKyNkZWZpbmUJWGtiTENfTW9kaWZpZXJLZXlzCQkoMUwgPDwgIDkpCisjZGVmaW5lCVhrYkxDX0tleXBhZEtleXMJCSgxTCA8PCAxMCkKKyNkZWZpbmUJWGtiTENfRnVuY3Rpb25LZXlzCQkoMUwgPDwgMTEpCisjZGVmaW5lCVhrYkxDX0FsdGVybmF0ZUdyb3VwCQkoMUwgPDwgMTIpCisKKyAgICAvKgorICAgICAqIFggSW5wdXQgRXh0ZW5zaW9uIEludGVyYWN0aW9ucworICAgICAqIC0gU3BlY2lmaWVzIHRoZSBwb3NzaWJsZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBYS0IgYW5kIHRoZSBYIGlucHV0CisgICAgICogICBleHRlbnNpb24KKyAgICAgKiAtIFVzZWQgdG8gcmVxdWVzdCAoWGtiR2V0RGV2aWNlSW5mbykgb3IgY2hhbmdlIChYS2JTZXREZXZpY2VJbmZvKQorICAgICAqICAgWEtCIGluZm9ybWF0aW9uIGFib3V0IGFuIGV4dGVuc2lvbiBkZXZpY2UuCisgICAgICogLSBSZXBvcnRzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyBpbiB0aGUgcmVwbHkgdG8KKyAgICAgKiAgIFhrYkdldERldmljZUluZm8gb3IgaW4gYW4gWGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5IGV2ZW50LgorICAgICAqIFhrYlhJX1Vuc3VwcG9ydGVkRmVhdHVyZSBpcyByZXBvcnRlZCBpbiBYa2JFeHRlbnNpb25EZXZpY2VOb3RpZnkKKyAgICAgKiBldmVudHMgdG8gaW5kaWNhdGUgYW4gYXR0ZW1wdCB0byB1c2UgYW4gdW5zdXBwb3J0ZWQgZmVhdHVyZS4KKyAgICAgKi8KKyNkZWZpbmUJWGtiWElfS2V5Ym9hcmRzTWFzawkJKDFMIDw8IDApCisjZGVmaW5lCVhrYlhJX0J1dHRvbkFjdGlvbnNNYXNrCQkoMUwgPDwgMSkKKyNkZWZpbmUJWGtiWElfSW5kaWNhdG9yTmFtZXNNYXNrCSgxTCA8PCAyKQorI2RlZmluZQlYa2JYSV9JbmRpY2F0b3JNYXBzTWFzawkJKDFMIDw8IDMpCisjZGVmaW5lCVhrYlhJX0luZGljYXRvclN0YXRlTWFzawkoMUwgPDwgNCkKKyNkZWZpbmUJWGtiWElfVW5zdXBwb3J0ZWRGZWF0dXJlTWFzawkoMUwgPDwgMTUpCisjZGVmaW5lCVhrYlhJX0FsbEZlYXR1cmVzTWFzawkJKDB4MDAxZikKKyNkZWZpbmUJWGtiWElfQWxsRGV2aWNlRmVhdHVyZXNNYXNrCSgweDAwMWUpCisKKyNkZWZpbmUJWGtiWElfSW5kaWNhdG9yc01hc2sJCSgweDAwMWMpCisjZGVmaW5lCVhrYkFsbEV4dGVuc2lvbkRldmljZUV2ZW50c01hc2sgKDB4ODAxZikKKworICAgIC8qCisgICAgICogUGVyLUNsaWVudCBGbGFnczoKKyAgICAgKiAgLSBTcGVjaWZpZXMgZmxhZ3MgdG8gYmUgY2hhbmdlZCBieSB0aGUgUGVyQ2xpZW50RmxhZ3MgcmVxdWVzdC4KKyAgICAgKi8KKyNkZWZpbmUJWGtiUENGX0RldGVjdGFibGVBdXRvUmVwZWF0TWFzawkoMUwgPDwgMCkKKyNkZWZpbmUJWGtiUENGX0dyYWJzVXNlWEtCU3RhdGVNYXNrCSgxTCA8PCAxKQorI2RlZmluZQlYa2JQQ0ZfQXV0b1Jlc2V0Q29udHJvbHNNYXNrCSgxTCA8PCAyKQorI2RlZmluZQlYa2JQQ0ZfTG9va3VwU3RhdGVXaGVuR3JhYmJlZAkoMUwgPDwgMykKKyNkZWZpbmUJWGtiUENGX1NlbmRFdmVudFVzZXNYS0JTdGF0ZQkoMUwgPDwgNCkKKyNkZWZpbmUJWGtiUENGX0FsbEZsYWdzTWFzawkJKDB4MUYpCisKKyAgICAvKgorICAgICAqIERlYnVnZ2luZyBmbGFncyBhbmQgY29udHJvbHMKKyAgICAgKi8KKyNkZWZpbmUJWGtiREZfRGlzYWJsZUxvY2tzCSgxPDwwKQorCisjZW5kaWYgLyogX1hLQl9IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0JnZW9tLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hLQmdlb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWY5MDJmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0JnZW9tLmgKQEAgLTAsMCArMSw2NTkgQEAKKy8qICRYb3JnOiBYS0JnZW9tLmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NSBjb3NrcmV5IEV4cCAkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDE5OTMgYnkgU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKK2ZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzIG5vdCBiZSAKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIAorb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgCitvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgord2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCitTSUxJQ09OIEdSQVBISUNTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIAorU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSAKK0FORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorR1JBUEhJQ1MgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCAKK0RBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgCitEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIAorT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OICBXSVRICitUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9YS0JnZW9tLmgsdiAzLjkgMjAwMi8wOS8xOCAxNzoxMTo0MCB0c2kgRXhwICQgKi8KKworI2lmbmRlZiBfWEtCR0VPTV9IXworI2RlZmluZQlfWEtCR0VPTV9IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWEtCc3RyLmg+CisKKyNpZmRlZiBYS0JfSU5fU0VSVkVSCisjZGVmaW5lIFhrYkFkZEdlb21LZXlBbGlhcyAJCVNydlhrYkFkZEdlb21LZXlBbGlhcworI2RlZmluZSBYa2JBZGRHZW9tQ29sb3IgCQlTcnZYa2JBZGRHZW9tQ29sb3IKKyNkZWZpbmUgWGtiQWRkR2VvbURvb2RhZAkJU3J2WGtiQWRkR2VvbURvb2RhZAorI2RlZmluZSBYa2JBZGRHZW9tS2V5CQkJU3J2WGtiQWRkR2VvbUtleQorI2RlZmluZSBYa2JBZGRHZW9tT3V0bGluZQkJU3J2WGtiQWRkR2VvbU91dGxpbmUKKyNkZWZpbmUgWGtiQWRkR2VvbU92ZXJsYXkJCVNydlhrYkFkZEdlb21PdmVybGF5CisjZGVmaW5lIFhrYkFkZEdlb21PdmVybGF5Um93CQlTcnZYa2JBZGRHZW9tT3ZlcmxheVJvdworI2RlZmluZQlYa2JBZGRHZW9tT3ZlcmxheUtleQkJU3J2WGtiQWRkR2VvbU92ZXJsYXlLZXkKKyNkZWZpbmUgWGtiQWRkR2VvbVByb3BlcnR5CQlTcnZYa2JBZGRHZW9tUHJvcGVydHkKKyNkZWZpbmUgWGtiQWRkR2VvbVJvdwkJCVNydlhrYkFkZEdlb21Sb3cKKyNkZWZpbmUgWGtiQWRkR2VvbVNlY3Rpb24JCVNydlhrYkFkZEdlb21TZWN0aW9uCisjZGVmaW5lIFhrYkFkZEdlb21TaGFwZQkJCVNydlhrYkFkZEdlb21TaGFwZQorI2RlZmluZSBYa2JBbGxvY0dlb21LZXlBbGlhc2VzCQlTcnZYa2JBbGxvY0dlb21LZXlBbGlhc2VzCisjZGVmaW5lIFhrYkFsbG9jR2VvbUNvbG9ycwkJU3J2WGtiQWxsb2NHZW9tQ29sb3JzCisjZGVmaW5lIFhrYkFsbG9jR2VvbURvb2RhZHMJCVNydlhrYkFsbG9jR2VvbURvb2RhZHMKKyNkZWZpbmUgWGtiQWxsb2NHZW9tS2V5cwkJU3J2WGtiQWxsb2NHZW9tS2V5cworI2RlZmluZSBYa2JBbGxvY0dlb21PdXRsaW5lcwkJU3J2WGtiQWxsb2NHZW9tT3V0bGluZXMKKyNkZWZpbmUgWGtiQWxsb2NHZW9tUG9pbnRzCQlTcnZYa2JBbGxvY0dlb21Qb2ludHMKKyNkZWZpbmUgWGtiQWxsb2NHZW9tUHJvcHMJCVNydlhrYkFsbG9jR2VvbVByb3BzCisjZGVmaW5lIFhrYkFsbG9jR2VvbVJvd3MJCVNydlhrYkFsbG9jR2VvbVJvd3MKKyNkZWZpbmUgWGtiQWxsb2NHZW9tU2VjdGlvbkRvb2RhZHMJU3J2WGtiQWxsb2NHZW9tU2VjdGlvbkRvb2RhZHMKKyNkZWZpbmUgWGtiQWxsb2NHZW9tU2VjdGlvbnMJCVNydlhrYkFsbG9jR2VvbVNlY3Rpb25zCisjZGVmaW5lCVhrYkFsbG9jR2VvbU92ZXJsYXlzCQlTcnZYa2JBbGxvY0dlb21PdmVybGF5cworI2RlZmluZQlYa2JBbGxvY0dlb21PdmVybGF5Um93cwkJU3J2WGtiQWxsb2NHZW9tT3ZlcmxheVJvd3MKKyNkZWZpbmUJWGtiQWxsb2NHZW9tT3ZlcmxheUtleXMJCVNydlhrYkFsbG9jR2VvbU92ZXJsYXlLZXlzCisjZGVmaW5lIFhrYkFsbG9jR2VvbVNoYXBlcwkJU3J2WGtiQWxsb2NHZW9tU2hhcGVzCisjZGVmaW5lIFhrYkFsbG9jR2VvbWV0cnkJCVNydlhrYkFsbG9jR2VvbWV0cnkKKyNkZWZpbmUgWGtiRnJlZUdlb21LZXlBbGlhc2VzCQlTcnZYa2JGcmVlR2VvbUtleUFsaWFzZXMKKyNkZWZpbmUgWGtiRnJlZUdlb21Db2xvcnMJCVNydlhrYkZyZWVHZW9tQ29sb3JzCisjZGVmaW5lIFhrYkZyZWVHZW9tRG9vZGFkcwkJU3J2WGtiRnJlZUdlb21Eb29kYWRzCisjZGVmaW5lIFhrYkZyZWVHZW9tUHJvcGVydGllcwkJU3J2WGtiRnJlZUdlb21Qcm9wZXJ0aWVzCisjZGVmaW5lCVhrYkZyZWVHZW9tT3ZlcmxheUtleXMJCVNydlhrYkZyZWVHZW9tT3ZlcmxheUtleXMKKyNkZWZpbmUJWGtiRnJlZUdlb21PdmVybGF5Um93cwkJU3J2WGtiRnJlZUdlb21PdmVybGF5Um93cworI2RlZmluZQlYa2JGcmVlR2VvbU92ZXJsYXlzCQlTcnZYa2JGcmVlR2VvbU92ZXJsYXlzCisjZGVmaW5lCVhrYkZyZWVHZW9tS2V5cwkJCVNydlhrYkZyZWVHZW9tS2V5cworI2RlZmluZQlYa2JGcmVlR2VvbVJvd3MJCQlTcnZYa2JGcmVlR2VvbVJvd3MKKyNkZWZpbmUgWGtiRnJlZUdlb21TZWN0aW9ucwkJU3J2WGtiRnJlZUdlb21TZWN0aW9ucworI2RlZmluZQlYa2JGcmVlR2VvbVBvaW50cwkJU3J2WGtiRnJlZUdlb21Qb2ludHMKKyNkZWZpbmUJWGtiRnJlZUdlb21PdXRsaW5lcwkJU3J2WGtiRnJlZUdlb21PdXRsaW5lcworI2RlZmluZSBYa2JGcmVlR2VvbVNoYXBlcwkJU3J2WGtiRnJlZUdlb21TaGFwZXMKKyNkZWZpbmUgWGtiRnJlZUdlb21ldHJ5CQkJU3J2WGtiRnJlZUdlb21ldHJ5CisjZW5kaWYKKwordHlwZWRlZglzdHJ1Y3QgX1hrYlByb3BlcnR5IHsKKwljaGFyCSpuYW1lOworCWNoYXIJKnZhbHVlOworfSBYa2JQcm9wZXJ0eVJlYywqWGtiUHJvcGVydHlQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDb2xvciB7CisJdW5zaWduZWQgaW50IAlwaXhlbDsKKwljaGFyICoJCXNwZWM7Cit9IFhrYkNvbG9yUmVjLCpYa2JDb2xvclB0cjsKKwordHlwZWRlZglzdHJ1Y3QgX1hrYlBvaW50IHsKKwlzaG9ydAl4OworCXNob3J0CXk7Cit9IFhrYlBvaW50UmVjLCAqWGtiUG9pbnRQdHI7CisKK3R5cGVkZWYgc3RydWN0CV9Ya2JCb3VuZHMgeworCXNob3J0CXgxLHkxOworCXNob3J0CXgyLHkyOworfSBYa2JCb3VuZHNSZWMsICpYa2JCb3VuZHNQdHI7CisjZGVmaW5lCVhrYkJvdW5kc1dpZHRoKGIpCSgoKGIpLT54MiktKChiKS0+eDEpKQorI2RlZmluZQlYa2JCb3VuZHNIZWlnaHQoYikJKCgoYiktPnkyKS0oKGIpLT55MSkpCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JPdXRsaW5lIHsKKwl1bnNpZ25lZCBzaG9ydAludW1fcG9pbnRzOworCXVuc2lnbmVkIHNob3J0CXN6X3BvaW50czsKKwl1bnNpZ25lZCBzaG9ydAljb3JuZXJfcmFkaXVzOworCVhrYlBvaW50UHRyCXBvaW50czsKK30gWGtiT3V0bGluZVJlYywgKlhrYk91dGxpbmVQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTaGFwZSB7CisJQXRvbQkgCSBuYW1lOworCXVuc2lnbmVkIHNob3J0CSBudW1fb3V0bGluZXM7CisJdW5zaWduZWQgc2hvcnQJIHN6X291dGxpbmVzOworCVhrYk91dGxpbmVQdHIJIG91dGxpbmVzOworCVhrYk91dGxpbmVQdHIJIGFwcHJveDsKKwlYa2JPdXRsaW5lUHRyCSBwcmltYXJ5OworCVhrYkJvdW5kc1JlYwkgYm91bmRzOworfSBYa2JTaGFwZVJlYywgKlhrYlNoYXBlUHRyOworI2RlZmluZQlYa2JPdXRsaW5lSW5kZXgocyxvKQkoKGludCkoKG8pLSYocyktPm91dGxpbmVzWzBdKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlNoYXBlRG9vZGFkIHsKKwlBdG9tCQkgbmFtZTsKKwl1bnNpZ25lZCBjaGFyCSB0eXBlOworCXVuc2lnbmVkIGNoYXIJIHByaW9yaXR5OworCXNob3J0CQkgdG9wOworCXNob3J0CQkgbGVmdDsKKwlzaG9ydAkgCSBhbmdsZTsKKwl1bnNpZ25lZCBzaG9ydAkgY29sb3JfbmR4OworCXVuc2lnbmVkIHNob3J0CSBzaGFwZV9uZHg7Cit9IFhrYlNoYXBlRG9vZGFkUmVjLCAqWGtiU2hhcGVEb29kYWRQdHI7CisjZGVmaW5lCVhrYlNoYXBlRG9vZGFkQ29sb3IoZyxkKQkoJihnKS0+Y29sb3JzWyhkKS0+Y29sb3JfbmR4XSkKKyNkZWZpbmUJWGtiU2hhcGVEb29kYWRTaGFwZShnLGQpCSgmKGcpLT5zaGFwZXNbKGQpLT5zaGFwZV9uZHhdKQorI2RlZmluZQlYa2JTZXRTaGFwZURvb2RhZENvbG9yKGcsZCxjKQkoKGQpLT5jb2xvcl9uZHg9IChjKS0mKGcpLT5jb2xvcnNbMF0pCisjZGVmaW5lCVhrYlNldFNoYXBlRG9vZGFkU2hhcGUoZyxkLHMpCSgoZCktPnNoYXBlX25keD0gKHMpLSYoZyktPnNoYXBlc1swXSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlRleHREb29kYWQgeworCUF0b20JCSBuYW1lOworCXVuc2lnbmVkIGNoYXIJIHR5cGU7CisJdW5zaWduZWQgY2hhcgkgcHJpb3JpdHk7CisJc2hvcnQJIAkgdG9wOworCXNob3J0CSAJIGxlZnQ7CisJc2hvcnQJIAkgYW5nbGU7CisJc2hvcnQJIAkgd2lkdGg7CisJc2hvcnQJCSBoZWlnaHQ7CisJdW5zaWduZWQgc2hvcnQJIGNvbG9yX25keDsKKwljaGFyICoJCSB0ZXh0OworCWNoYXIgKgkJIGZvbnQ7Cit9IFhrYlRleHREb29kYWRSZWMsICpYa2JUZXh0RG9vZGFkUHRyOworI2RlZmluZQlYa2JUZXh0RG9vZGFkQ29sb3IoZyxkKQkoJihnKS0+Y29sb3JzWyhkKS0+Y29sb3JfbmR4XSkKKyNkZWZpbmUJWGtiU2V0VGV4dERvb2RhZENvbG9yKGcsZCxjKQkoKGQpLT5jb2xvcl9uZHg9IChjKS0mKGcpLT5jb2xvcnNbMF0pCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JJbmRpY2F0b3JEb29kYWQgeworCUF0b20JCSBuYW1lOworCXVuc2lnbmVkIGNoYXIJIHR5cGU7CisJdW5zaWduZWQgY2hhcgkgcHJpb3JpdHk7CisJc2hvcnQJIAkgdG9wOworCXNob3J0CSAJIGxlZnQ7CisJc2hvcnQJCSBhbmdsZTsKKwl1bnNpZ25lZCBzaG9ydAkgc2hhcGVfbmR4OworCXVuc2lnbmVkIHNob3J0CSBvbl9jb2xvcl9uZHg7CisJdW5zaWduZWQgc2hvcnQJIG9mZl9jb2xvcl9uZHg7Cit9IFhrYkluZGljYXRvckRvb2RhZFJlYywgKlhrYkluZGljYXRvckRvb2RhZFB0cjsKKyNkZWZpbmUJWGtiSW5kaWNhdG9yRG9vZGFkU2hhcGUoZyxkKQkoJihnKS0+c2hhcGVzWyhkKS0+c2hhcGVfbmR4XSkKKyNkZWZpbmUJWGtiSW5kaWNhdG9yRG9vZGFkT25Db2xvcihnLGQpCSgmKGcpLT5jb2xvcnNbKGQpLT5vbl9jb2xvcl9uZHhdKQorI2RlZmluZQlYa2JJbmRpY2F0b3JEb29kYWRPZmZDb2xvcihnLGQpCSgmKGcpLT5jb2xvcnNbKGQpLT5vZmZfY29sb3JfbmR4XSkKKyNkZWZpbmUJWGtiU2V0SW5kaWNhdG9yRG9vZGFkT25Db2xvcihnLGQsYykgXAorCQkJCSgoZCktPm9uX2NvbG9yX25keD0gKGMpLSYoZyktPmNvbG9yc1swXSkKKyNkZWZpbmUJWGtiU2V0SW5kaWNhdG9yRG9vZGFkT2ZmQ29sb3IoZyxkLGMpIFwKKwkJCQkoKGQpLT5vZmZfY29sb3JfbmR4PSAoYyktJihnKS0+Y29sb3JzWzBdKQorI2RlZmluZQlYa2JTZXRJbmRpY2F0b3JEb29kYWRTaGFwZShnLGQscykgXAorCQkJCSgoZCktPnNoYXBlX25keD0gKHMpLSYoZyktPnNoYXBlc1swXSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkxvZ29Eb29kYWQgeworCUF0b20JCSBuYW1lOworCXVuc2lnbmVkIGNoYXIJIHR5cGU7CisJdW5zaWduZWQgY2hhcgkgcHJpb3JpdHk7CisJc2hvcnQJCSB0b3A7CisJc2hvcnQJCSBsZWZ0OworCXNob3J0CSAJIGFuZ2xlOworCXVuc2lnbmVkIHNob3J0CSBjb2xvcl9uZHg7CisJdW5zaWduZWQgc2hvcnQJIHNoYXBlX25keDsKKwljaGFyICoJCSBsb2dvX25hbWU7Cit9IFhrYkxvZ29Eb29kYWRSZWMsICpYa2JMb2dvRG9vZGFkUHRyOworI2RlZmluZQlYa2JMb2dvRG9vZGFkQ29sb3IoZyxkKQkJKCYoZyktPmNvbG9yc1soZCktPmNvbG9yX25keF0pCisjZGVmaW5lCVhrYkxvZ29Eb29kYWRTaGFwZShnLGQpCQkoJihnKS0+c2hhcGVzWyhkKS0+c2hhcGVfbmR4XSkKKyNkZWZpbmUJWGtiU2V0TG9nb0Rvb2RhZENvbG9yKGcsZCxjKQkoKGQpLT5jb2xvcl9uZHg9IChjKS0mKGcpLT5jb2xvcnNbMF0pCisjZGVmaW5lCVhrYlNldExvZ29Eb29kYWRTaGFwZShnLGQscykJKChkKS0+c2hhcGVfbmR4PSAocyktJihnKS0+c2hhcGVzWzBdKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiQW55RG9vZGFkIHsKKwlBdG9tCQkgbmFtZTsKKwl1bnNpZ25lZCBjaGFyCSB0eXBlOworCXVuc2lnbmVkIGNoYXIJIHByaW9yaXR5OworCXNob3J0CSAJIHRvcDsKKwlzaG9ydAkgCSBsZWZ0OworCXNob3J0CQkgYW5nbGU7Cit9IFhrYkFueURvb2RhZFJlYywgKlhrYkFueURvb2RhZFB0cjsKKwordHlwZWRlZiB1bmlvbiBfWGtiRG9vZGFkIHsKKwlYa2JBbnlEb29kYWRSZWMJCWFueTsKKwlYa2JTaGFwZURvb2RhZFJlYwlzaGFwZTsKKwlYa2JUZXh0RG9vZGFkUmVjCXRleHQ7CisJWGtiSW5kaWNhdG9yRG9vZGFkUmVjCWluZGljYXRvcjsKKwlYa2JMb2dvRG9vZGFkUmVjCWxvZ287Cit9IFhrYkRvb2RhZFJlYywgKlhrYkRvb2RhZFB0cjsKKworI2RlZmluZQlYa2JVbmtub3duRG9vZGFkCTAKKyNkZWZpbmUJWGtiT3V0bGluZURvb2RhZAkxCisjZGVmaW5lCVhrYlNvbGlkRG9vZGFkCQkyCisjZGVmaW5lCVhrYlRleHREb29kYWQJCTMKKyNkZWZpbmUJWGtiSW5kaWNhdG9yRG9vZGFkCTQKKyNkZWZpbmUJWGtiTG9nb0Rvb2RhZAkJNQorCit0eXBlZGVmIHN0cnVjdCBfWGtiS2V5IHsKKwlYa2JLZXlOYW1lUmVjCSBuYW1lOworCXNob3J0CQkgZ2FwOworCXVuc2lnbmVkIGNoYXIJIHNoYXBlX25keDsKKwl1bnNpZ25lZCBjaGFyCSBjb2xvcl9uZHg7Cit9IFhrYktleVJlYywgKlhrYktleVB0cjsKKyNkZWZpbmUJWGtiS2V5U2hhcGUoZyxrKQkoJihnKS0+c2hhcGVzWyhrKS0+c2hhcGVfbmR4XSkKKyNkZWZpbmUJWGtiS2V5Q29sb3IoZyxrKQkoJihnKS0+Y29sb3JzWyhrKS0+Y29sb3JfbmR4XSkKKyNkZWZpbmUJWGtiU2V0S2V5U2hhcGUoZyxrLHMpCSgoayktPnNoYXBlX25keD0gKHMpLSYoZyktPnNoYXBlc1swXSkKKyNkZWZpbmUJWGtiU2V0S2V5Q29sb3IoZyxrLGMpCSgoayktPmNvbG9yX25keD0gKGMpLSYoZyktPmNvbG9yc1swXSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlJvdyB7CisJc2hvcnQJIAl0b3A7CisJc2hvcnQJIAlsZWZ0OworCXVuc2lnbmVkIHNob3J0CW51bV9rZXlzOworCXVuc2lnbmVkIHNob3J0CXN6X2tleXM7CisJaW50CQl2ZXJ0aWNhbDsKKwlYa2JLZXlQdHIJa2V5czsKKwlYa2JCb3VuZHNSZWMJYm91bmRzOworfSBYa2JSb3dSZWMsICpYa2JSb3dQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTZWN0aW9uIHsKKwlBdG9tCQkgbmFtZTsKKwl1bnNpZ25lZCBjaGFyCSBwcmlvcml0eTsKKwlzaG9ydAkgCSB0b3A7CisJc2hvcnQJIAkgbGVmdDsKKwl1bnNpZ25lZCBzaG9ydAkgd2lkdGg7CisJdW5zaWduZWQgc2hvcnQJIGhlaWdodDsKKwlzaG9ydAkgCSBhbmdsZTsKKwl1bnNpZ25lZCBzaG9ydAkgbnVtX3Jvd3M7CisJdW5zaWduZWQgc2hvcnQJIG51bV9kb29kYWRzOworCXVuc2lnbmVkIHNob3J0CSBudW1fb3ZlcmxheXM7CisJdW5zaWduZWQgc2hvcnQJIHN6X3Jvd3M7CisJdW5zaWduZWQgc2hvcnQJIHN6X2Rvb2RhZHM7CisJdW5zaWduZWQgc2hvcnQJIHN6X292ZXJsYXlzOworCVhrYlJvd1B0cgkgcm93czsKKwlYa2JEb29kYWRQdHIJIGRvb2RhZHM7CisJWGtiQm91bmRzUmVjCSBib3VuZHM7CisJc3RydWN0IF9Ya2JPdmVybGF5ICpvdmVybGF5czsKK30gWGtiU2VjdGlvblJlYywgKlhrYlNlY3Rpb25QdHI7CisKK3R5cGVkZWYJc3RydWN0IF9Ya2JPdmVybGF5S2V5IHsKKwlYa2JLZXlOYW1lUmVjCW92ZXI7CisJWGtiS2V5TmFtZVJlYwl1bmRlcjsKK30gWGtiT3ZlcmxheUtleVJlYywqWGtiT3ZlcmxheUtleVB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYk92ZXJsYXlSb3cgeworCXVuc2lnbmVkIHNob3J0CQlyb3dfdW5kZXI7CisJdW5zaWduZWQgc2hvcnQJCW51bV9rZXlzOworCXVuc2lnbmVkIHNob3J0CQlzel9rZXlzOworCVhrYk92ZXJsYXlLZXlQdHIJa2V5czsKK30gWGtiT3ZlcmxheVJvd1JlYywqWGtiT3ZlcmxheVJvd1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYk92ZXJsYXkgeworCUF0b20JCQluYW1lOworCVhrYlNlY3Rpb25QdHIJCXNlY3Rpb25fdW5kZXI7CisJdW5zaWduZWQgc2hvcnQJCW51bV9yb3dzOworCXVuc2lnbmVkIHNob3J0CQlzel9yb3dzOworCVhrYk92ZXJsYXlSb3dQdHIJcm93czsKKwlYa2JCb3VuZHNQdHIJCWJvdW5kczsKK30gWGtiT3ZlcmxheVJlYywqWGtiT3ZlcmxheVB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkdlb21ldHJ5IHsKKwlBdG9tCQkgbmFtZTsKKwl1bnNpZ25lZCBzaG9ydAkgd2lkdGhfbW07CisJdW5zaWduZWQgc2hvcnQJIGhlaWdodF9tbTsKKwljaGFyICoJCSBsYWJlbF9mb250OworCVhrYkNvbG9yUHRyCSBsYWJlbF9jb2xvcjsKKwlYa2JDb2xvclB0cgkgYmFzZV9jb2xvcjsKKwl1bnNpZ25lZCBzaG9ydAkgc3pfcHJvcGVydGllczsKKwl1bnNpZ25lZCBzaG9ydAkgc3pfY29sb3JzOworCXVuc2lnbmVkIHNob3J0CSBzel9zaGFwZXM7CisJdW5zaWduZWQgc2hvcnQgICBzel9zZWN0aW9uczsKKwl1bnNpZ25lZCBzaG9ydAkgc3pfZG9vZGFkczsKKwl1bnNpZ25lZCBzaG9ydAkgc3pfa2V5X2FsaWFzZXM7CisJdW5zaWduZWQgc2hvcnQJIG51bV9wcm9wZXJ0aWVzOworCXVuc2lnbmVkIHNob3J0CSBudW1fY29sb3JzOworCXVuc2lnbmVkIHNob3J0CSBudW1fc2hhcGVzOworCXVuc2lnbmVkIHNob3J0CSBudW1fc2VjdGlvbnM7CisJdW5zaWduZWQgc2hvcnQJIG51bV9kb29kYWRzOworCXVuc2lnbmVkIHNob3J0CSBudW1fa2V5X2FsaWFzZXM7CisJWGtiUHJvcGVydHlQdHIJIHByb3BlcnRpZXM7CisJWGtiQ29sb3JQdHIJIGNvbG9yczsKKwlYa2JTaGFwZVB0cgkgc2hhcGVzOworCVhrYlNlY3Rpb25QdHIJIHNlY3Rpb25zOworCVhrYkRvb2RhZFB0cgkgZG9vZGFkczsKKwlYa2JLZXlBbGlhc1B0cgkga2V5X2FsaWFzZXM7Cit9IFhrYkdlb21ldHJ5UmVjOworI2RlZmluZQlYa2JHZW9tQ29sb3JJbmRleChnLGMpCSgoaW50KSgoYyktJihnKS0+Y29sb3JzWzBdKSkKKworI2RlZmluZQlYa2JHZW9tUHJvcGVydGllc01hc2sJKDE8PDApCisjZGVmaW5lCVhrYkdlb21Db2xvcnNNYXNrCSgxPDwxKQorI2RlZmluZQlYa2JHZW9tU2hhcGVzTWFzawkoMTw8MikKKyNkZWZpbmUJWGtiR2VvbVNlY3Rpb25zTWFzawkoMTw8MykKKyNkZWZpbmUJWGtiR2VvbURvb2RhZHNNYXNrCSgxPDw0KQorI2RlZmluZQlYa2JHZW9tS2V5QWxpYXNlc01hc2sJKDE8PDUpCisjZGVmaW5lCVhrYkdlb21BbGxNYXNrCQkoMHgzZikKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkdlb21ldHJ5U2l6ZXMgeworCXVuc2lnbmVkIGludAl3aGljaDsKKwl1bnNpZ25lZCBzaG9ydAludW1fcHJvcGVydGllczsKKwl1bnNpZ25lZCBzaG9ydAludW1fY29sb3JzOworCXVuc2lnbmVkIHNob3J0CW51bV9zaGFwZXM7CisJdW5zaWduZWQgc2hvcnQJbnVtX3NlY3Rpb25zOworCXVuc2lnbmVkIHNob3J0CW51bV9kb29kYWRzOworCXVuc2lnbmVkIHNob3J0CW51bV9rZXlfYWxpYXNlczsKK30gWGtiR2VvbWV0cnlTaXplc1JlYywqWGtiR2VvbWV0cnlTaXplc1B0cjsKKworX1hGVU5DUFJPVE9CRUdJTgorCitleHRlcm4JWGtiUHJvcGVydHlQdHIKK1hrYkFkZEdlb21Qcm9wZXJ0eSgKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGNoYXIgKgkJLyogbmFtZSAqLywKKyAgICBjaGFyICoJCS8qIHZhbHVlICovCispOworCitleHRlcm4JWGtiS2V5QWxpYXNQdHIKK1hrYkFkZEdlb21LZXlBbGlhcygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGNoYXIgKgkJLyogYWxpYXMgKi8sCisgICAgY2hhciAqCQkvKiByZWFsICovCispOworCitleHRlcm4JWGtiQ29sb3JQdHIKK1hrYkFkZEdlb21Db2xvcigKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGNoYXIgKgkJLyogc3BlYyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogcGl4ZWwgKi8KKyk7CisKK2V4dGVybglYa2JPdXRsaW5lUHRyCitYa2JBZGRHZW9tT3V0bGluZSgKKyAgICBYa2JTaGFwZVB0cgkJLyogc2hhcGUgKi8sCisgICAgaW50CQkJLyogc3pfcG9pbnRzICovCispOworCitleHRlcm4gWGtiU2hhcGVQdHIKK1hrYkFkZEdlb21TaGFwZSgKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIEF0b20JCS8qIG5hbWUgKi8sCisgICAgaW50CQkJLyogc3pfb3V0bGluZXMgKi8KKyk7CisKK2V4dGVybiBYa2JLZXlQdHIKK1hrYkFkZEdlb21LZXkoCisgICAgWGtiUm93UHRyCQkvKiByb3cgKi8KKyk7CisKK2V4dGVybiBYa2JSb3dQdHIKK1hrYkFkZEdlb21Sb3coCisgICAgWGtiU2VjdGlvblB0cgkvKiBzZWN0aW9uICovLAorICAgIGludAkJCS8qIHN6X2tleXMgKi8KKyk7CisKK2V4dGVybiBYa2JTZWN0aW9uUHRyCitYa2JBZGRHZW9tU2VjdGlvbigKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIEF0b20JCS8qIG5hbWUgKi8sCisgICAgaW50CQkJLyogc3pfcm93cyAqLywKKyAgICBpbnQJCQkvKiBzel9kb29kYWRzICovLAorICAgIGludAkJCS8qIHN6X292ZXJsYXlzICovCispOworCitleHRlcm4gWGtiT3ZlcmxheVB0cgorWGtiQWRkR2VvbU92ZXJsYXkoCisgICAgWGtiU2VjdGlvblB0cgkvKiBzZWN0aW9uICovLAorICAgIEF0b20JCS8qIG5hbWUgKi8sCisgICAgaW50CQkJLyogc3pfcm93cyAqLworKTsKKworZXh0ZXJuIFhrYk92ZXJsYXlSb3dQdHIKK1hrYkFkZEdlb21PdmVybGF5Um93KAorICAgIFhrYk92ZXJsYXlQdHIJLyogb3ZlcmxheSAqLywKKyAgICBpbnQJCQkvKiByb3dfdW5kZXIgKi8sCisgICAgaW50CQkJLyogc3pfa2V5cyAqLworKTsKKworZXh0ZXJuIFhrYk92ZXJsYXlLZXlQdHIKK1hrYkFkZEdlb21PdmVybGF5S2V5KAorICAgIFhrYk92ZXJsYXlQdHIJLyogb3ZlcmxheSAqLywKKyAgICBYa2JPdmVybGF5Um93UHRyCS8qIHJvdyAqLywKKyAgICBjaGFyICoJCS8qIG92ZXIgKi8sCisgICAgY2hhciAqCQkvKiB1bmRlciAqLworKTsKKworZXh0ZXJuIFhrYkRvb2RhZFB0cgorWGtiQWRkR2VvbURvb2RhZCgKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIFhrYlNlY3Rpb25QdHIJLyogc2VjdGlvbiAqLywKKyAgICBBdG9tCQkvKiBuYW1lICovCispOworCisKK2V4dGVybiB2b2lkCitYa2JGcmVlR2VvbUtleUFsaWFzZXMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21Db2xvcnMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21Eb29kYWRzKAorICAgIFhrYkRvb2RhZFB0cgkvKiBkb29kYWRzICovLAorICAgIGludAkJCS8qIG5Eb29kYWRzICovLAorICAgIEJvb2wJCS8qIGZyZWVBbGwgKi8KKyk7CisKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tUHJvcGVydGllcygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGludAkJCS8qIGZpcnN0ICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIEJvb2wJCS8qIGZyZWVBbGwgKi8KKyk7CisKK2V4dGVybiB2b2lkCitYa2JGcmVlR2VvbU92ZXJsYXlLZXlzKAorICAgIFhrYk92ZXJsYXlSb3dQdHIJLyogcm93ICovLAorICAgIGludAkJCS8qIGZpcnN0ICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIEJvb2wJCS8qIGZyZWVBbGwgKi8KKyk7CisKK2V4dGVybiB2b2lkCitYa2JGcmVlR2VvbU92ZXJsYXlSb3dzKAorICAgIFhrYk92ZXJsYXlQdHIJLyogb3ZlcmxheSAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21PdmVybGF5cygKKyAgICBYa2JTZWN0aW9uUHRyCS8qIHNlY3Rpb24gKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQm9vbAkJLyogZnJlZUFsbCAqLworKTsKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tS2V5cygKKyAgICBYa2JSb3dQdHIJCS8qIHJvdyAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21Sb3dzKAorICAgIFhrYlNlY3Rpb25QdHIJLyogc2VjdGlvbiAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21TZWN0aW9ucygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGludAkJCS8qIGZpcnN0ICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIEJvb2wJCS8qIGZyZWVBbGwgKi8KKyk7CisKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tUG9pbnRzKAorICAgIFhrYk91dGxpbmVQdHIJLyogb3V0bGluZSAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21PdXRsaW5lcygKKyAgICBYa2JTaGFwZVB0cgkJLyogc2hhcGUgKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQm9vbAkJLyogZnJlZUFsbCAqLworKTsKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tU2hhcGVzKAorICAgIFhrYkdlb21ldHJ5UHRyCS8qIGdlb20gKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQm9vbAkJLyogZnJlZUFsbCAqLworKTsKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tZXRyeSgKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aGljaCAqLywKKyAgICBCb29sCQkvKiBmcmVlTWFwICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21Qcm9wcygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGludAkJCS8qIG5Qcm9wcyAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tS2V5QWxpYXNlcygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGludAkJCS8qIG5BbGlhc2VzICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21Db2xvcnMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBpbnQJCQkvKiBuQ29sb3JzICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21TaGFwZXMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBpbnQJCQkvKiBuU2hhcGVzICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21TZWN0aW9ucygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGludAkJCS8qIG5TZWN0aW9ucyAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tT3ZlcmxheXMoCisgICAgWGtiU2VjdGlvblB0cgkvKiBzZWN0aW9uICovLAorICAgIGludAkJCS8qIG51bV9uZWVkZWQgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMKK1hrYkFsbG9jR2VvbU92ZXJsYXlSb3dzKAorICAgIFhrYk92ZXJsYXlQdHIJLyogb3ZlcmxheSAqLywKKyAgICBpbnQJCQkvKiBudW1fbmVlZGVkICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21PdmVybGF5S2V5cygKKyAgICBYa2JPdmVybGF5Um93UHRyCS8qIHJvdyAqLywKKyAgICBpbnQJCQkvKiBudW1fbmVlZGVkICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21Eb29kYWRzKAorICAgIFhrYkdlb21ldHJ5UHRyCS8qIGdlb20gKi8sCisgICAgaW50CQkJLyogbkRvb2RhZHMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMKK1hrYkFsbG9jR2VvbVNlY3Rpb25Eb29kYWRzKAorICAgIFhrYlNlY3Rpb25QdHIJLyogc2VjdGlvbiAqLywKKyAgICBpbnQJCQkvKiBuRG9vZGFkcyAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tT3V0bGluZXMoCisgICAgWGtiU2hhcGVQdHIJCS8qIHNoYXBlICovLAorICAgIGludAkJCS8qIG5PTCAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tUm93cygKKyAgICBYa2JTZWN0aW9uUHRyCS8qIHNlY3Rpb24gKi8sCisgICAgaW50CQkJLyogblJvd3MgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMKK1hrYkFsbG9jR2VvbVBvaW50cygKKyAgICBYa2JPdXRsaW5lUHRyCS8qIG9sICovLAorICAgIGludAkJCS8qIG5QdHMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMKK1hrYkFsbG9jR2VvbUtleXMoCisgICAgWGtiUm93UHRyCQkvKiByb3cgKi8sCisgICAgaW50CQkJLyogbktleXMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMKK1hrYkFsbG9jR2VvbWV0cnkoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCVhrYkdlb21ldHJ5U2l6ZXNQdHIJLyogc2l6ZXMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMKK1hrYlNldEdlb21ldHJ5KAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkCQkvKiBkZXZpY2VTcGVjICovLAorCVhrYkdlb21ldHJ5UHRyCQkvKiBnZW9tICovCispOworCitleHRlcm4JQm9vbAorWGtiQ29tcHV0ZVNoYXBlVG9wKAorCVhrYlNoYXBlUHRyCQkvKiBzaGFwZSAqLywKKwlYa2JCb3VuZHNQdHIJCS8qIGJvdW5kcyAqLworKTsKKworZXh0ZXJuCUJvb2wKK1hrYkNvbXB1dGVTaGFwZUJvdW5kcygKKwlYa2JTaGFwZVB0cgkJLyogc2hhcGUgKi8KKyk7CisKK2V4dGVybglCb29sCitYa2JDb21wdXRlUm93Qm91bmRzKAorCVhrYkdlb21ldHJ5UHRyCQkvKiBnZW9tICovLAorCVhrYlNlY3Rpb25QdHIJCS8qIHNlY3Rpb24gKi8sCisJWGtiUm93UHRyCQkvKiByb3cgKi8KKyk7CisKK2V4dGVybglCb29sCitYa2JDb21wdXRlU2VjdGlvbkJvdW5kcygKKwlYa2JHZW9tZXRyeVB0cgkJLyogZ2VvbSAqLywKKwlYa2JTZWN0aW9uUHRyCQkvKiBzZWN0aW9uICovCispOworCitleHRlcm4JY2hhciAqCitYa2JGaW5kT3ZlcmxheUZvcktleSgKKwlYa2JHZW9tZXRyeVB0cgkJLyogZ2VvbSAqLywKKwlYa2JTZWN0aW9uUHRyCQkvKiB3YW50ZWQgKi8sCisJY2hhciAqCQkJLyogdW5kZXIgKi8KKyk7CisKK2V4dGVybglTdGF0dXMKK1hrYkdldEdlb21ldHJ5KAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovCispOworCitleHRlcm4JU3RhdHVzCitYa2JHZXROYW1lZEdlb21ldHJ5KAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovLAorICAgIEF0b20JCQkvKiBuYW1lICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX1hLQlNUUl9IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0Jwcm90by5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0Jwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZGQ0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hLQnByb3RvLmgKQEAgLTAsMCArMSwxMjgyIEBACisvKiAkWG9yZzogWEtCcHJvdG8uaCx2IDEuMyAyMDAwLzA4LzE4IDA0OjA1OjQ1IGNvc2tyZXkgRXhwICQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMTk5MyBieSBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAorZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0Citub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3Mgbm90IGJlIAordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gCitvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSAKK29mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCit3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKK1NJTElDT04gR1JBUEhJQ1MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgCitTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIAorQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCitHUkFQSElDUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIAorREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCAKK0RBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgCitPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gIFdJVEgKK1RIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1hLQlBST1RPX0hfCisjZGVmaW5lCV9YS0JQUk9UT19IXworCisjaW5jbHVkZSA8WDExL1htZC5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hLQi5oPgorCisjZGVmaW5lIFdpbmRvdyBDQVJEMzIKKyNkZWZpbmUgQXRvbSBDQVJEMzIKKyNkZWZpbmUgVGltZSBDQVJEMzIKKyNkZWZpbmUgS2V5Q29kZSBDQVJEOAorI2RlZmluZSBLZXlTeW0gQ0FSRDMyCisKKyNkZWZpbmUJWGtiUGFkZGVkU2l6ZShuKQkoKCgodW5zaWduZWQgaW50KShuKSszKSA+PiAyKSA8PCAyKQorCit0eXBlZGVmIHN0cnVjdCBfeGtiVXNlRXh0ZW5zaW9uIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCVXNlRXh0ZW5zaW9uICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CXdhbnRlZE1ham9yIEIxNjsKKyAgICBDQVJEMTYJd2FudGVkTWlub3IgQjE2OworfSB4a2JVc2VFeHRlbnNpb25SZXE7CisjZGVmaW5lCXN6X3hrYlVzZUV4dGVuc2lvblJlcQk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JVc2VFeHRlbnNpb25SZXBseSB7CisgICAgQllURQl0eXBlOwkJLyogWF9SZXBseSAqLworICAgIEJPT0wJc3VwcG9ydGVkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CXNlcnZlck1ham9yIEIxNjsKKyAgICBDQVJEMTYJc2VydmVyTWlub3IgQjE2OworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7Cit9IHhrYlVzZUV4dGVuc2lvblJlcGx5OworI2RlZmluZQlzel94a2JVc2VFeHRlbnNpb25SZXBseQkzMgorCit0eXBlZGVmCXN0cnVjdCBfeGtiU2VsZWN0RXZlbnRzIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIFhfS0JTZWxlY3RFdmVudHMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CWFmZmVjdFdoaWNoIEIxNjsKKyAgICBDQVJEMTYJY2xlYXIgQjE2OworICAgIENBUkQxNglzZWxlY3RBbGwgQjE2OworICAgIENBUkQxNglhZmZlY3RNYXAgQjE2OworICAgIENBUkQxNgltYXAgQjE2OworfSB4a2JTZWxlY3RFdmVudHNSZXE7CisjZGVmaW5lCXN6X3hrYlNlbGVjdEV2ZW50c1JlcQkxNgorCit0eXBlZGVmIHN0cnVjdCBfeGtiQmVsbCB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBYX0tCQmVsbCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJYmVsbENsYXNzIEIxNjsKKyAgICBDQVJEMTYJYmVsbElEIEIxNjsKKyAgICBJTlQ4CXBlcmNlbnQ7CisgICAgQk9PTAlmb3JjZVNvdW5kOworICAgIEJPT0wJZXZlbnRPbmx5OworICAgIENBUkQ4CXBhZDE7CisgICAgSU5UMTYJcGl0Y2ggQjE2OworICAgIElOVDE2CWR1cmF0aW9uIEIxNjsKKyAgICBDQVJEMTYJcGFkMiBCMTY7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBXaW5kb3cJd2luZG93IEIzMjsKK30geGtiQmVsbFJlcTsKKyNkZWZpbmUJc3pfeGtiQmVsbFJlcQkJMjgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldFN0YXRlIHsKKwlDQVJEOAkJcmVxVHlwZTsKKwlDQVJEOAkJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JHZXRTdGF0ZSAqLworCUNBUkQxNgkJbGVuZ3RoIEIxNjsKKwlDQVJEMTYJCWRldmljZVNwZWMgQjE2OworCUNBUkQxNgkJcGFkIEIxNjsKK30geGtiR2V0U3RhdGVSZXE7CisjZGVmaW5lCXN6X3hrYkdldFN0YXRlUmVxCTgKKwordHlwZWRlZglzdHJ1Y3QgX3hrYkdldFN0YXRlUmVwbHkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCWRldmljZUlEOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJbW9kczsKKyAgICBDQVJEOAliYXNlTW9kczsKKyAgICBDQVJEOAlsYXRjaGVkTW9kczsKKyAgICBDQVJEOAlsb2NrZWRNb2RzOworICAgIENBUkQ4CWdyb3VwOworICAgIENBUkQ4CWxvY2tlZEdyb3VwOworICAgIElOVDE2CWJhc2VHcm91cCBCMTY7CisgICAgSU5UMTYJbGF0Y2hlZEdyb3VwIEIxNjsKKyAgICBDQVJEOAljb21wYXRTdGF0ZTsKKyAgICBDQVJEOAlncmFiTW9kczsKKyAgICBDQVJEOAljb21wYXRHcmFiTW9kczsKKyAgICBDQVJEOAlsb29rdXBNb2RzOworICAgIENBUkQ4CWNvbXBhdExvb2t1cE1vZHM7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMTYJcHRyQnRuU3RhdGUgQjE2OworICAgIENBUkQxNglwYWQyIEIxNjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhrYkdldFN0YXRlUmVwbHk7CisjZGVmaW5lCXN6X3hrYkdldFN0YXRlUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkxhdGNoTG9ja1N0YXRlIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCTGF0Y2hMb2NrU3RhdGUgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDgJYWZmZWN0TW9kTG9ja3M7CisgICAgQ0FSRDgJbW9kTG9ja3M7CisgICAgQk9PTAlsb2NrR3JvdXA7CisgICAgQ0FSRDgJZ3JvdXBMb2NrOworICAgIENBUkQ4CWFmZmVjdE1vZExhdGNoZXM7CisgICAgQ0FSRDgJbW9kTGF0Y2hlczsKKyAgICBDQVJEOAlwYWQ7CisgICAgQk9PTAlsYXRjaEdyb3VwOworICAgIElOVDE2CWdyb3VwTGF0Y2ggQjE2OworfSB4a2JMYXRjaExvY2tTdGF0ZVJlcTsKKyNkZWZpbmUJc3pfeGtiTGF0Y2hMb2NrU3RhdGVSZXEJCTE2CisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXRDb250cm9scyB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQkdldENvbnRyb2xzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNglwYWQgQjE2OworfSB4a2JHZXRDb250cm9sc1JlcTsKKyNkZWZpbmUJc3pfeGtiR2V0Q29udHJvbHNSZXEJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0Q29udHJvbHNSZXBseSB7CisgICAgQllURQl0eXBlOwkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJbWtEZmx0QnRuOworICAgIENBUkQ4CW51bUdyb3VwczsKKyAgICBDQVJEOAlncm91cHNXcmFwOworICAgIENBUkQ4CWludGVybmFsTW9kczsKKyAgICBDQVJEOAlpZ25vcmVMb2NrTW9kczsKKyAgICBDQVJEOAlpbnRlcm5hbFJlYWxNb2RzOworICAgIENBUkQ4CWlnbm9yZUxvY2tSZWFsTW9kczsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglpbnRlcm5hbFZNb2RzIEIxNjsKKyAgICBDQVJEMTYJaWdub3JlTG9ja1ZNb2RzIEIxNjsKKyAgICBDQVJEMTYJcmVwZWF0RGVsYXkgQjE2OworICAgIENBUkQxNglyZXBlYXRJbnRlcnZhbCBCMTY7CisgICAgQ0FSRDE2CXNsb3dLZXlzRGVsYXkgQjE2OworICAgIENBUkQxNglkZWJvdW5jZURlbGF5IEIxNjsKKyAgICBDQVJEMTYJbWtEZWxheSBCMTY7CisgICAgQ0FSRDE2CW1rSW50ZXJ2YWwgQjE2OworICAgIENBUkQxNglta1RpbWVUb01heCBCMTY7CisgICAgQ0FSRDE2CW1rTWF4U3BlZWQgQjE2OworICAgIElOVDE2CW1rQ3VydmUgQjE2OworICAgIENBUkQxNglheE9wdGlvbnMgQjE2OworICAgIENBUkQxNglheFRpbWVvdXQgQjE2OworICAgIENBUkQxNglheHRPcHRzTWFzayBCMTY7CisgICAgQ0FSRDE2CWF4dE9wdHNWYWx1ZXMgQjE2OworICAgIENBUkQxNglwYWQyIEIxNjsKKyAgICBDQVJEMzIJYXh0Q3RybHNNYXNrIEIzMjsKKyAgICBDQVJEMzIJYXh0Q3RybHNWYWx1ZXMgQjMyOworICAgIENBUkQzMgllbmFibGVkQ3RybHMgQjMyOworICAgIEJZVEUJcGVyS2V5UmVwZWF0W1hrYlBlcktleUJpdEFycmF5U2l6ZV07Cit9IHhrYkdldENvbnRyb2xzUmVwbHk7CisjZGVmaW5lCXN6X3hrYkdldENvbnRyb2xzUmVwbHkJOTIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNldENvbnRyb2xzIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCU2V0Q29udHJvbHMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDgJYWZmZWN0SW50ZXJuYWxNb2RzOworICAgIENBUkQ4CWludGVybmFsTW9kczsKKyAgICBDQVJEOAlhZmZlY3RJZ25vcmVMb2NrTW9kczsKKyAgICBDQVJEOAlpZ25vcmVMb2NrTW9kczsKKyAgICBDQVJEMTYJYWZmZWN0SW50ZXJuYWxWTW9kcyBCMTY7CisgICAgQ0FSRDE2CWludGVybmFsVk1vZHMgQjE2OworICAgIENBUkQxNglhZmZlY3RJZ25vcmVMb2NrVk1vZHMgQjE2OworICAgIENBUkQxNglpZ25vcmVMb2NrVk1vZHMgQjE2OworICAgIENBUkQ4CW1rRGZsdEJ0bjsKKyAgICBDQVJEOAlncm91cHNXcmFwOworICAgIENBUkQxNglheE9wdGlvbnMgQjE2OworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJYWZmZWN0RW5hYmxlZEN0cmxzIEIzMjsKKyAgICBDQVJEMzIJZW5hYmxlZEN0cmxzIEIzMjsKKyAgICBDQVJEMzIJY2hhbmdlQ3RybHMgQjMyOworICAgIENBUkQxNglyZXBlYXREZWxheSBCMTY7CisgICAgQ0FSRDE2CXJlcGVhdEludGVydmFsIEIxNjsKKyAgICBDQVJEMTYJc2xvd0tleXNEZWxheSBCMTY7CisgICAgQ0FSRDE2CWRlYm91bmNlRGVsYXkgQjE2OworICAgIENBUkQxNglta0RlbGF5IEIxNjsKKyAgICBDQVJEMTYJbWtJbnRlcnZhbCBCMTY7CisgICAgQ0FSRDE2CW1rVGltZVRvTWF4IEIxNjsKKyAgICBDQVJEMTYJbWtNYXhTcGVlZCBCMTY7CisgICAgSU5UMTYJbWtDdXJ2ZSBCMTY7CisgICAgQ0FSRDE2CWF4VGltZW91dCBCMTY7CisgICAgQ0FSRDMyCWF4dEN0cmxzTWFzayBCMzI7CisgICAgQ0FSRDMyCWF4dEN0cmxzVmFsdWVzIEIzMjsKKyAgICBDQVJEMTYJYXh0T3B0c01hc2sgQjE2OworICAgIENBUkQxNglheHRPcHRzVmFsdWVzIEIxNjsKKyAgICBCWVRFCXBlcktleVJlcGVhdFtYa2JQZXJLZXlCaXRBcnJheVNpemVdOworfSB4a2JTZXRDb250cm9sc1JlcTsKKyNkZWZpbmUJc3pfeGtiU2V0Q29udHJvbHNSZXEJMTAwCisKK3R5cGVkZWYJc3RydWN0IF94a2JLVE1hcEVudHJ5V2lyZURlc2MgeworICAgIEJPT0wJYWN0aXZlOworICAgIENBUkQ4CW1hc2s7CisgICAgQ0FSRDgJbGV2ZWw7CisgICAgQ0FSRDgJcmVhbE1vZHM7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKK30geGtiS1RNYXBFbnRyeVdpcmVEZXNjOworI2RlZmluZSBzel94a2JLVE1hcEVudHJ5V2lyZURlc2MJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiS1RTZXRNYXBFbnRyeVdpcmVEZXNjIHsKKyAgICBDQVJEOAlsZXZlbDsKKyAgICBDQVJEOAlyZWFsTW9kczsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworfSB4a2JLVFNldE1hcEVudHJ5V2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYktUU2V0TWFwRW50cnlXaXJlRGVzYwk0CisKK3R5cGVkZWYgc3RydWN0IF94a2JNb2RzV2lyZURlc2MgeworICAgIENBUkQ4CW1hc2s7CQkvKiBHZXRNYXAgb25seSAqLworICAgIENBUkQ4CXJlYWxNb2RzOworICAgIENBUkQxNgl2aXJ0dWFsTW9kcyBCMTY7Cit9IHhrYk1vZHNXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiTW9kc1dpcmVEZXNjCTQKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYktleVR5cGVXaXJlRGVzYyB7CisgICAgQ0FSRDgJbWFzazsKKyAgICBDQVJEOAlyZWFsTW9kczsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworICAgIENBUkQ4CW51bUxldmVsczsKKyAgICBDQVJEOAluTWFwRW50cmllczsKKyAgICBCT09MCXByZXNlcnZlOworICAgIENBUkQ4CXBhZDsKK30geGtiS2V5VHlwZVdpcmVEZXNjOworI2RlZmluZQlzel94a2JLZXlUeXBlV2lyZURlc2MJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiU3ltTWFwV2lyZURlc2MgeworICAgIENBUkQ4CWt0SW5kZXhbWGtiTnVtS2JkR3JvdXBzXTsKKyAgICBDQVJEOAlncm91cEluZm87CisgICAgQ0FSRDgJd2lkdGg7CisgICAgQ0FSRDE2CW5TeW1zIEIxNjsKK30geGtiU3ltTWFwV2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYlN5bU1hcFdpcmVEZXNjCTgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlZNb2RNYXBXaXJlRGVzYyB7CisgICAgS2V5Q29kZQlrZXk7CisgICAgQ0FSRDgJcGFkOworICAgIENBUkQxNgl2bW9kcyBCMTY7Cit9IHhrYlZNb2RNYXBXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiVk1vZE1hcFdpcmVEZXNjCTQKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkJlaGF2aW9yV2lyZURlc2MgeworCUNBUkQ4CWtleTsKKwlDQVJEOAl0eXBlOworCUNBUkQ4CWRhdGE7CisJQ0FSRDgJcGFkOworfSB4a2JCZWhhdmlvcldpcmVEZXNjOworI2RlZmluZQlzel94a2JCZWhhdmlvcldpcmVEZXNjCTQKKwordHlwZWRlZglzdHJ1Y3QgX3hrYkFjdGlvbldpcmVEZXNjIHsKKyAgICBDQVJEOAl0eXBlOworICAgIENBUkQ4CWRhdGFbN107Cit9IHhrYkFjdGlvbldpcmVEZXNjOworI2RlZmluZQlzel94a2JBY3Rpb25XaXJlRGVzYwk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXRNYXAgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JHZXRNYXAgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CWZ1bGwgQjE2OworICAgIENBUkQxNglwYXJ0aWFsIEIxNjsKKyAgICBDQVJEOAlmaXJzdFR5cGU7CisgICAgQ0FSRDgJblR5cGVzOworICAgIEtleUNvZGUJZmlyc3RLZXlTeW07CisgICAgQ0FSRDgJbktleVN5bXM7CisgICAgS2V5Q29kZQlmaXJzdEtleUFjdDsKKyAgICBDQVJEOAluS2V5QWN0czsKKyAgICBLZXlDb2RlCWZpcnN0S2V5QmVoYXZpb3I7CisgICAgQ0FSRDgJbktleUJlaGF2aW9yczsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworICAgIEtleUNvZGUJZmlyc3RLZXlFeHBsaWNpdDsKKyAgICBDQVJEOAluS2V5RXhwbGljaXQ7CisgICAgS2V5Q29kZQlmaXJzdE1vZE1hcEtleTsKKyAgICBDQVJEOAluTW9kTWFwS2V5czsKKyAgICBLZXlDb2RlCWZpcnN0Vk1vZE1hcEtleTsKKyAgICBDQVJEOAluVk1vZE1hcEtleXM7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworfSB4a2JHZXRNYXBSZXE7CisjZGVmaW5lCXN6X3hrYkdldE1hcFJlcQkyOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0TWFwUmVwbHkgeworICAgIENBUkQ4CXR5cGU7CQkvKiBhbHdheXMgWF9SZXBseSAqLworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworICAgIEtleUNvZGUJbWluS2V5Q29kZTsKKyAgICBLZXlDb2RlCW1heEtleUNvZGU7CisgICAgQ0FSRDE2CXByZXNlbnQgQjE2OworICAgIENBUkQ4CWZpcnN0VHlwZTsKKyAgICBDQVJEOAluVHlwZXM7CisgICAgQ0FSRDgJdG90YWxUeXBlczsKKyAgICBLZXlDb2RlCWZpcnN0S2V5U3ltOworICAgIENBUkQxNgl0b3RhbFN5bXMgQjE2OworICAgIENBUkQ4CW5LZXlTeW1zOworICAgIEtleUNvZGUJZmlyc3RLZXlBY3Q7CisgICAgQ0FSRDE2CXRvdGFsQWN0cyBCMTY7CisgICAgQ0FSRDgJbktleUFjdHM7CisgICAgS2V5Q29kZQlmaXJzdEtleUJlaGF2aW9yOworICAgIENBUkQ4CW5LZXlCZWhhdmlvcnM7CisgICAgQ0FSRDgJdG90YWxLZXlCZWhhdmlvcnM7CisgICAgS2V5Q29kZQlmaXJzdEtleUV4cGxpY2l0OworICAgIENBUkQ4CW5LZXlFeHBsaWNpdDsKKyAgICBDQVJEOAl0b3RhbEtleUV4cGxpY2l0OworICAgIEtleUNvZGUJZmlyc3RNb2RNYXBLZXk7CisgICAgQ0FSRDgJbk1vZE1hcEtleXM7CisgICAgQ0FSRDgJdG90YWxNb2RNYXBLZXlzOworICAgIEtleUNvZGUJZmlyc3RWTW9kTWFwS2V5OworICAgIENBUkQ4CW5WTW9kTWFwS2V5czsKKyAgICBDQVJEOAl0b3RhbFZNb2RNYXBLZXlzOworICAgIENBUkQ4CXBhZDI7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKK30geGtiR2V0TWFwUmVwbHk7CisjZGVmaW5lCXN6X3hrYkdldE1hcFJlcGx5CQk0MAorCisjZGVmaW5lCVhrYlNldE1hcFJlc2l6ZVR5cGVzCQkoMUw8PDApCisjZGVmaW5lCVhrYlNldE1hcFJlY29tcHV0ZUFjdGlvbnMJKDFMPDwxKQorI2RlZmluZQlYa2JTZXRNYXBBbGxGbGFncwkJKDB4MykKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNldE1hcCB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQlNldE1hcCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJcHJlc2VudCBCMTY7CisgICAgQ0FSRDE2CWZsYWdzIEIxNjsKKyAgICBLZXlDb2RlCW1pbktleUNvZGU7CisgICAgS2V5Q29kZQltYXhLZXlDb2RlOworICAgIENBUkQ4CWZpcnN0VHlwZTsKKyAgICBDQVJEOAluVHlwZXM7CisgICAgS2V5Q29kZQlmaXJzdEtleVN5bTsKKyAgICBDQVJEOAluS2V5U3ltczsKKyAgICBDQVJEMTYJdG90YWxTeW1zIEIxNjsKKyAgICBLZXlDb2RlCWZpcnN0S2V5QWN0OworICAgIENBUkQ4CW5LZXlBY3RzOworICAgIENBUkQxNgl0b3RhbEFjdHMgQjE2OworICAgIEtleUNvZGUJZmlyc3RLZXlCZWhhdmlvcjsKKyAgICBDQVJEOAluS2V5QmVoYXZpb3JzOworICAgIENBUkQ4CXRvdGFsS2V5QmVoYXZpb3JzOworICAgIEtleUNvZGUJZmlyc3RLZXlFeHBsaWNpdDsKKyAgICBDQVJEOAluS2V5RXhwbGljaXQ7CisgICAgQ0FSRDgJdG90YWxLZXlFeHBsaWNpdDsKKyAgICBLZXlDb2RlCWZpcnN0TW9kTWFwS2V5OworICAgIENBUkQ4CW5Nb2RNYXBLZXlzOworICAgIENBUkQ4CXRvdGFsTW9kTWFwS2V5czsKKyAgICBLZXlDb2RlCWZpcnN0Vk1vZE1hcEtleTsKKyAgICBDQVJEOAluVk1vZE1hcEtleXM7CisgICAgQ0FSRDgJdG90YWxWTW9kTWFwS2V5czsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworfSB4a2JTZXRNYXBSZXE7CisjZGVmaW5lCXN6X3hrYlNldE1hcFJlcQkzNgorCit0eXBlZGVmIHN0cnVjdCBfeGtiU3ltSW50ZXJwcmV0V2lyZURlc2MgeworICAgIENBUkQzMgkJc3ltIEIzMjsKKyAgICBDQVJEOAkJbW9kczsKKyAgICBDQVJEOAkJbWF0Y2g7CisgICAgQ0FSRDgJCXZpcnR1YWxNb2Q7CisgICAgQ0FSRDgJCWZsYWdzOworICAgIHhrYkFjdGlvbldpcmVEZXNjCWFjdDsKK30geGtiU3ltSW50ZXJwcmV0V2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYlN5bUludGVycHJldFdpcmVEZXNjCTE2CisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXRDb21wYXRNYXAgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JHZXRDb21wYXRNYXAgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDgJZ3JvdXBzOworICAgIEJPT0wJZ2V0QWxsU0k7CisgICAgQ0FSRDE2CWZpcnN0U0kgQjE2OworICAgIENBUkQxNgluU0kgQjE2OworfSB4a2JHZXRDb21wYXRNYXBSZXE7CisjZGVmaW5lCXN6X3hrYkdldENvbXBhdE1hcFJlcQkxMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0Q29tcGF0TWFwUmVwbHkgeworICAgIENBUkQ4CXR5cGU7CQkvKiBhbHdheXMgWF9SZXBseSAqLworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJZ3JvdXBzOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CWZpcnN0U0kgQjE2OworICAgIENBUkQxNgluU0kgQjE2OworICAgIENBUkQxNgluVG90YWxTSSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4a2JHZXRDb21wYXRNYXBSZXBseTsKKyNkZWZpbmUJc3pfeGtiR2V0Q29tcGF0TWFwUmVwbHkJCTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JTZXRDb21wYXRNYXAgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JTZXRDb21wYXRNYXAgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBCT09MCXJlY29tcHV0ZUFjdGlvbnM7CisgICAgQk9PTAl0cnVuY2F0ZVNJOworICAgIENBUkQ4CWdyb3VwczsKKyAgICBDQVJEMTYJZmlyc3RTSSBCMTY7CisgICAgQ0FSRDE2CW5TSSBCMTY7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworfSB4a2JTZXRDb21wYXRNYXBSZXE7CisjZGVmaW5lCXN6X3hrYlNldENvbXBhdE1hcFJlcQkxNgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0SW5kaWNhdG9yU3RhdGUgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JHZXRJbmRpY2F0b3JTdGF0ZSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7Cit9IHhrYkdldEluZGljYXRvclN0YXRlUmVxOworI2RlZmluZQlzel94a2JHZXRJbmRpY2F0b3JTdGF0ZVJlcQk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXRJbmRpY2F0b3JTdGF0ZVJlcGx5IHsKKyAgICBDQVJEOAl0eXBlOwkJLyogYWx3YXlzIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglzdGF0ZSBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKK30geGtiR2V0SW5kaWNhdG9yU3RhdGVSZXBseTsKKyNkZWZpbmUJc3pfeGtiR2V0SW5kaWNhdG9yU3RhdGVSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0SW5kaWNhdG9yTWFwIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCR2V0SW5kaWNhdG9yTWFwICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNglwYWQgQjE2OworICAgIENBUkQzMgl3aGljaCBCMzI7Cit9IHhrYkdldEluZGljYXRvck1hcFJlcTsKKyNkZWZpbmUJc3pfeGtiR2V0SW5kaWNhdG9yTWFwUmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXRJbmRpY2F0b3JNYXBSZXBseSB7CisgICAgQ0FSRDgJdHlwZTsJCS8qIGFsd2F5cyBYX1JlcGx5ICovCisgICAgQ0FSRDgJZGV2aWNlSUQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJd2hpY2ggQjMyOworICAgIENBUkQzMglyZWFsSW5kaWNhdG9ycyBCMzI7CisgICAgQ0FSRDgJbkluZGljYXRvcnM7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMTYJcGFkMiBCMTY7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7Cit9IHhrYkdldEluZGljYXRvck1hcFJlcGx5OworI2RlZmluZQlzel94a2JHZXRJbmRpY2F0b3JNYXBSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiSW5kaWNhdG9yTWFwV2lyZURlc2MgeworICAgIENBUkQ4CWZsYWdzOworICAgIENBUkQ4CXdoaWNoR3JvdXBzOworICAgIENBUkQ4CWdyb3VwczsKKyAgICBDQVJEOAl3aGljaE1vZHM7CisgICAgQ0FSRDgJbW9kczsKKyAgICBDQVJEOAlyZWFsTW9kczsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworICAgIENBUkQzMgljdHJscyBCMzI7Cit9IHhrYkluZGljYXRvck1hcFdpcmVEZXNjOworI2RlZmluZQlzel94a2JJbmRpY2F0b3JNYXBXaXJlRGVzYwkxMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiU2V0SW5kaWNhdG9yTWFwIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCU2V0SW5kaWNhdG9yTWFwICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJd2hpY2ggQjMyOworfSB4a2JTZXRJbmRpY2F0b3JNYXBSZXE7CisjZGVmaW5lCXN6X3hrYlNldEluZGljYXRvck1hcFJlcQkxMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0TmFtZWRJbmRpY2F0b3IgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogWF9LQkdldE5hbWVkSW5kaWNhdG9yICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNglsZWRDbGFzcyBCMTY7CisgICAgQ0FSRDE2CWxlZElEIEIxNjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQXRvbQlpbmRpY2F0b3IgQjMyOworfSB4a2JHZXROYW1lZEluZGljYXRvclJlcTsKKyNkZWZpbmUJc3pfeGtiR2V0TmFtZWRJbmRpY2F0b3JSZXEJCTE2CisKK3R5cGVkZWYJc3RydWN0IF94a2JHZXROYW1lZEluZGljYXRvclJlcGx5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIEF0b20JaW5kaWNhdG9yIEIzMjsKKyAgICBCT09MCWZvdW5kOworICAgIEJPT0wJb247CisgICAgQk9PTAlyZWFsSW5kaWNhdG9yOworICAgIENBUkQ4CW5keDsKKyAgICBDQVJEOAlmbGFnczsKKyAgICBDQVJEOAl3aGljaEdyb3VwczsKKyAgICBDQVJEOAlncm91cHM7CisgICAgQ0FSRDgJd2hpY2hNb2RzOworICAgIENBUkQ4CW1vZHM7CisgICAgQ0FSRDgJcmVhbE1vZHM7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKKyAgICBDQVJEMzIJY3RybHMgQjMyOworICAgIEJPT0wJc3VwcG9ydGVkOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworfSB4a2JHZXROYW1lZEluZGljYXRvclJlcGx5OworI2RlZmluZQlzel94a2JHZXROYW1lZEluZGljYXRvclJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JTZXROYW1lZEluZGljYXRvciB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBYX0tCU2V0TmFtZWRJbmRpY2F0b3IgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CWxlZENsYXNzIEIxNjsKKyAgICBDQVJEMTYJbGVkSUQgQjE2OworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBBdG9tCWluZGljYXRvciBCMzI7CisgICAgQk9PTAlzZXRTdGF0ZTsKKyAgICBCT09MCW9uOworICAgIEJPT0wJc2V0TWFwOworICAgIEJPT0wJY3JlYXRlTWFwOworICAgIENBUkQ4CXBhZDI7CisgICAgQ0FSRDgJZmxhZ3M7CisgICAgQ0FSRDgJd2hpY2hHcm91cHM7CisgICAgQ0FSRDgJZ3JvdXBzOworICAgIENBUkQ4CXdoaWNoTW9kczsKKyAgICBDQVJEOAlyZWFsTW9kczsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworICAgIENBUkQzMgljdHJscyBCMzI7Cit9IHhrYlNldE5hbWVkSW5kaWNhdG9yUmVxOworI2RlZmluZQlzel94a2JTZXROYW1lZEluZGljYXRvclJlcQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0TmFtZXMgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JHZXROYW1lcyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKKyAgICBDQVJEMzIJd2hpY2ggQjMyOworfSB4a2JHZXROYW1lc1JlcTsKKyNkZWZpbmUJc3pfeGtiR2V0TmFtZXNSZXEJCTEyCisKK3R5cGVkZWYJc3RydWN0IF94a2JHZXROYW1lc1JlcGx5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMgl3aGljaCBCMzI7CisgICAgS2V5Q29kZQltaW5LZXlDb2RlOworICAgIEtleUNvZGUJbWF4S2V5Q29kZTsKKyAgICBDQVJEOAluVHlwZXM7CisgICAgQ0FSRDgJZ3JvdXBOYW1lczsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworICAgIEtleUNvZGUJZmlyc3RLZXk7CisgICAgQ0FSRDgJbktleXM7CisgICAgQ0FSRDMyCWluZGljYXRvcnMgQjMyOworICAgIENBUkQ4CW5SYWRpb0dyb3VwczsKKyAgICBDQVJEOAluS2V5QWxpYXNlczsKKyAgICBDQVJEMTYJbktUTGV2ZWxzIEIxNjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhrYkdldE5hbWVzUmVwbHk7CisjZGVmaW5lCXN6X3hrYkdldE5hbWVzUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNldE5hbWVzIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCU2V0TmFtZXMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKKyAgICBDQVJEMzIJd2hpY2ggQjMyOworICAgIENBUkQ4CWZpcnN0VHlwZTsKKyAgICBDQVJEOAluVHlwZXM7CisgICAgQ0FSRDgJZmlyc3RLVExldmVsOworICAgIENBUkQ4CW5LVExldmVsczsKKyAgICBDQVJEMzIJaW5kaWNhdG9ycyBCMzI7CisgICAgQ0FSRDgJZ3JvdXBOYW1lczsKKyAgICBDQVJEOAluUmFkaW9Hcm91cHM7CisgICAgS2V5Q29kZQlmaXJzdEtleTsKKyAgICBDQVJEOAluS2V5czsKKyAgICBDQVJEOAluS2V5QWxpYXNlczsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNgl0b3RhbEtUTGV2ZWxOYW1lcyBCMTY7Cit9IHhrYlNldE5hbWVzUmVxOworI2RlZmluZQlzel94a2JTZXROYW1lc1JlcQkyOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiUG9pbnRXaXJlRGVzYyB7CisgICAgSU5UMTYJeCBCMTY7CisgICAgSU5UMTYJeSBCMTY7Cit9IHhrYlBvaW50V2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYlBvaW50V2lyZURlc2MJNAorCit0eXBlZGVmIHN0cnVjdCBfeGtiT3V0bGluZVdpcmVEZXNjIHsKKyAgICBDQVJEOAluUG9pbnRzOworICAgIENBUkQ4CWNvcm5lclJhZGl1czsKKyAgICBDQVJEMTYJcGFkIEIxNjsKK30geGtiT3V0bGluZVdpcmVEZXNjOworI2RlZmluZQlzel94a2JPdXRsaW5lV2lyZURlc2MJNAorCit0eXBlZGVmIHN0cnVjdCBfeGtiU2hhcGVXaXJlRGVzYyB7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBDQVJEOAluT3V0bGluZXM7CisgICAgQ0FSRDgJcHJpbWFyeU5keDsKKyAgICBDQVJEOAlhcHByb3hOZHg7CisgICAgQ0FSRDgJcGFkOworfSB4a2JTaGFwZVdpcmVEZXNjOworI2RlZmluZQlzel94a2JTaGFwZVdpcmVEZXNjCTgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNlY3Rpb25XaXJlRGVzYyB7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBJTlQxNgl0b3AgQjE2OworICAgIElOVDE2CWxlZnQgQjE2OworICAgIENBUkQxNgl3aWR0aCBCMTY7CisgICAgQ0FSRDE2CWhlaWdodCBCMTY7CisgICAgSU5UMTYJYW5nbGUgQjE2OworICAgIENBUkQ4CXByaW9yaXR5OworICAgIENBUkQ4CW5Sb3dzOworICAgIENBUkQ4CW5Eb29kYWRzOworICAgIENBUkQ4CW5PdmVybGF5czsKKyAgICBDQVJEMTYJcGFkIEIxNjsKK30geGtiU2VjdGlvbldpcmVEZXNjOworI2RlZmluZQlzel94a2JTZWN0aW9uV2lyZURlc2MJMjAKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlJvd1dpcmVEZXNjIHsKKyAgICBJTlQxNgl0b3AgQjE2OworICAgIElOVDE2CWxlZnQgQjE2OworICAgIENBUkQ4CW5LZXlzOworICAgIEJPT0wJdmVydGljYWw7CisgICAgQ0FSRDE2CXBhZCBCMTY7Cit9IHhrYlJvd1dpcmVEZXNjOworI2RlZmluZQlzel94a2JSb3dXaXJlRGVzYwk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JLZXlXaXJlRGVzYyB7CisgICAgQ0FSRDgJbmFtZVtYa2JLZXlOYW1lTGVuZ3RoXTsKKyAgICBJTlQxNglnYXAgQjE2OworICAgIENBUkQ4CXNoYXBlTmR4OworICAgIENBUkQ4CWNvbG9yTmR4OworfSB4a2JLZXlXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiS2V5V2lyZURlc2MJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiT3ZlcmxheVdpcmVEZXNjIHsKKyAgICBBdG9tCW5hbWUgQjMyOworICAgIENBUkQ4CW5Sb3dzOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworfSB4a2JPdmVybGF5V2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYk92ZXJsYXlXaXJlRGVzYwk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JPdmVybGF5Um93V2lyZURlc2MgeworICAgQ0FSRDgJcm93VW5kZXI7CisgICBDQVJEOAluS2V5czsKKyAgIENBUkQxNglwYWQxIEIxNjsKK30geGtiT3ZlcmxheVJvd1dpcmVEZXNjOworI2RlZmluZQlzel94a2JPdmVybGF5Um93V2lyZURlc2MJNAorCit0eXBlZGVmIHN0cnVjdCBfeGtiT3ZlcmxheUtleVdpcmVEZXNjIHsKKyAgIENBUkQ4CW92ZXJbWGtiS2V5TmFtZUxlbmd0aF07CisgICBDQVJEOAl1bmRlcltYa2JLZXlOYW1lTGVuZ3RoXTsKK30geGtiT3ZlcmxheUtleVdpcmVEZXNjOworI2RlZmluZQlzel94a2JPdmVybGF5S2V5V2lyZURlc2MJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiU2hhcGVEb29kYWRXaXJlRGVzYyB7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBDQVJEOAl0eXBlOworICAgIENBUkQ4CXByaW9yaXR5OworICAgIElOVDE2CXRvcCBCMTY7CisgICAgSU5UMTYJbGVmdCBCMTY7CisgICAgSU5UMTYJYW5nbGUgQjE2OworICAgIENBUkQ4CWNvbG9yTmR4OworICAgIENBUkQ4CXNoYXBlTmR4OworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7Cit9IHhrYlNoYXBlRG9vZGFkV2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYlNoYXBlRG9vZGFkV2lyZURlc2MJMjAKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlRleHREb29kYWRXaXJlRGVzYyB7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBDQVJEOAl0eXBlOworICAgIENBUkQ4CXByaW9yaXR5OworICAgIElOVDE2CXRvcCBCMTY7CisgICAgSU5UMTYJbGVmdCBCMTY7CisgICAgSU5UMTYJYW5nbGUgQjE2OworICAgIENBUkQxNgl3aWR0aCBCMTY7CisgICAgQ0FSRDE2CWhlaWdodCBCMTY7CisgICAgQ0FSRDgJY29sb3JOZHg7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMTYJcGFkMiBCMTY7Cit9IHhrYlRleHREb29kYWRXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiVGV4dERvb2RhZFdpcmVEZXNjCTIwCisKK3R5cGVkZWYgc3RydWN0IF94a2JJbmRpY2F0b3JEb29kYWRXaXJlRGVzYyB7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBDQVJEOAl0eXBlOworICAgIENBUkQ4CXByaW9yaXR5OworICAgIElOVDE2CXRvcCBCMTY7CisgICAgSU5UMTYJbGVmdCBCMTY7CisgICAgSU5UMTYJYW5nbGUgQjE2OworICAgIENBUkQ4CXNoYXBlTmR4OworICAgIENBUkQ4CW9uQ29sb3JOZHg7CisgICAgQ0FSRDgJb2ZmQ29sb3JOZHg7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMzIJcGFkMiBCMzI7Cit9IHhrYkluZGljYXRvckRvb2RhZFdpcmVEZXNjOworI2RlZmluZQlzel94a2JJbmRpY2F0b3JEb29kYWRXaXJlRGVzYwkyMAorCit0eXBlZGVmIHN0cnVjdCBfeGtiTG9nb0Rvb2RhZFdpcmVEZXNjIHsKKyAgICBBdG9tCW5hbWUgQjMyOworICAgIENBUkQ4CXR5cGU7CisgICAgQ0FSRDgJcHJpb3JpdHk7CisgICAgSU5UMTYJdG9wIEIxNjsKKyAgICBJTlQxNglsZWZ0IEIxNjsKKyAgICBJTlQxNglhbmdsZSBCMTY7CisgICAgQ0FSRDgJY29sb3JOZHg7CisgICAgQ0FSRDgJc2hhcGVOZHg7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworICAgIENBUkQzMglwYWQyIEIzMjsKK30geGtiTG9nb0Rvb2RhZFdpcmVEZXNjOworI2RlZmluZQlzel94a2JMb2dvRG9vZGFkV2lyZURlc2MJMjAKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkFueURvb2RhZFdpcmVEZXNjIHsKKyAgICBBdG9tCW5hbWUgQjMyOworICAgIENBUkQ4CXR5cGU7CisgICAgQ0FSRDgJcHJpb3JpdHk7CisgICAgSU5UMTYJdG9wIEIxNjsKKyAgICBJTlQxNglsZWZ0IEIxNjsKKyAgICBJTlQxNglhbmdsZSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKK30geGtiQW55RG9vZGFkV2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYkFueURvb2RhZFdpcmVEZXNjCTIwCisKK3R5cGVkZWYgdW5pb24gX3hrYkRvb2RhZFdpcmVEZXNjIHsKKyAgICB4a2JBbnlEb29kYWRXaXJlRGVzYwlhbnk7CisgICAgeGtiU2hhcGVEb29kYWRXaXJlRGVzYwlzaGFwZTsKKyAgICB4a2JUZXh0RG9vZGFkV2lyZURlc2MJdGV4dDsKKyAgICB4a2JJbmRpY2F0b3JEb29kYWRXaXJlRGVzYwlpbmRpY2F0b3I7CisgICAgeGtiTG9nb0Rvb2RhZFdpcmVEZXNjCWxvZ287Cit9IHhrYkRvb2RhZFdpcmVEZXNjOworI2RlZmluZQlzel94a2JEb29kYWRXaXJlRGVzYwkyMAorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0R2VvbWV0cnkgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JHZXRHZW9tZXRyeSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKKyAgICBBdG9tCW5hbWUgQjMyOworfSB4a2JHZXRHZW9tZXRyeVJlcTsKKyNkZWZpbmUJc3pfeGtiR2V0R2VvbWV0cnlSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldEdlb21ldHJ5UmVwbHkgeworICAgIENBUkQ4CXR5cGU7CQkvKiBhbHdheXMgWF9SZXBseSAqLworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBCT09MCWZvdW5kOworICAgIENBUkQ4CXBhZDsKKyAgICBDQVJEMTYJd2lkdGhNTSBCMTY7CisgICAgQ0FSRDE2CWhlaWdodE1NIEIxNjsKKyAgICBDQVJEMTYJblByb3BlcnRpZXMgQjE2OworICAgIENBUkQxNgluQ29sb3JzIEIxNjsKKyAgICBDQVJEMTYJblNoYXBlcyBCMTY7CisgICAgQ0FSRDE2CW5TZWN0aW9ucyBCMTY7CisgICAgQ0FSRDE2CW5Eb29kYWRzIEIxNjsKKyAgICBDQVJEMTYJbktleUFsaWFzZXMgQjE2OworICAgIENBUkQ4CWJhc2VDb2xvck5keDsKKyAgICBDQVJEOAlsYWJlbENvbG9yTmR4OworfSB4a2JHZXRHZW9tZXRyeVJlcGx5OworI2RlZmluZQlzel94a2JHZXRHZW9tZXRyeVJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JTZXRHZW9tZXRyeSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQlNldEdlb21ldHJ5ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQ4CW5TaGFwZXM7CisgICAgQ0FSRDgJblNlY3Rpb25zOworICAgIEF0b20JbmFtZSBCMzI7CisgICAgQ0FSRDE2CXdpZHRoTU0gQjE2OworICAgIENBUkQxNgloZWlnaHRNTSBCMTY7CisgICAgQ0FSRDE2CW5Qcm9wZXJ0aWVzIEIxNjsKKyAgICBDQVJEMTYJbkNvbG9ycyBCMTY7CisgICAgQ0FSRDE2CW5Eb29kYWRzIEIxNjsKKyAgICBDQVJEMTYJbktleUFsaWFzZXMgQjE2OworICAgIENBUkQ4CWJhc2VDb2xvck5keDsKKyAgICBDQVJEOAlsYWJlbENvbG9yTmR4OworICAgIENBUkQxNglwYWQgQjE2OworfSB4a2JTZXRHZW9tZXRyeVJlcTsKKyNkZWZpbmUJc3pfeGtiU2V0R2VvbWV0cnlSZXEJMjgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlBlckNsaWVudEZsYWdzIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7LyogYWx3YXlzIFhfS0JQZXJDbGllbnRGbGFncyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCWNoYW5nZSBCMzI7CisgICAgQ0FSRDMyCXZhbHVlIEIzMjsKKyAgICBDQVJEMzIJY3RybHNUb0NoYW5nZSBCMzI7CisgICAgQ0FSRDMyCWF1dG9DdHJscyBCMzI7CisgICAgQ0FSRDMyCWF1dG9DdHJsVmFsdWVzIEIzMjsKK30geGtiUGVyQ2xpZW50RmxhZ3NSZXE7CisjZGVmaW5lCXN6X3hrYlBlckNsaWVudEZsYWdzUmVxCTI4CisKK3R5cGVkZWYgc3RydWN0IF94a2JQZXJDbGllbnRGbGFnc1JlcGx5IHsKKyAgICBDQVJEOAl0eXBlOwkJLyogYWx3YXlzIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglzdXBwb3J0ZWQgQjMyOworICAgIENBUkQzMgl2YWx1ZSBCMzI7CisgICAgQ0FSRDMyCWF1dG9DdHJscyBCMzI7CisgICAgQ0FSRDMyCWF1dG9DdHJsVmFsdWVzIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworfSB4a2JQZXJDbGllbnRGbGFnc1JlcGx5OworI2RlZmluZQlzel94a2JQZXJDbGllbnRGbGFnc1JlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JMaXN0Q29tcG9uZW50cyB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQkxpc3RDb21wb25lbnRzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNgltYXhOYW1lcyBCMTY7Cit9IHhrYkxpc3RDb21wb25lbnRzUmVxOworI2RlZmluZQlzel94a2JMaXN0Q29tcG9uZW50c1JlcQk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JMaXN0Q29tcG9uZW50c1JlcGx5IHsKKyAgICBDQVJEOAl0eXBlOwkJLyogYWx3YXlzIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgluS2V5bWFwcyBCMTY7CisgICAgQ0FSRDE2CW5LZXljb2RlcyBCMTY7CisgICAgQ0FSRDE2CW5UeXBlcyBCMTY7CisgICAgQ0FSRDE2CW5Db21wYXRNYXBzIEIxNjsKKyAgICBDQVJEMTYJblN5bWJvbHMgQjE2OworICAgIENBUkQxNgluR2VvbWV0cmllcyBCMTY7CisgICAgQ0FSRDE2CWV4dHJhIEIxNjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKK30geGtiTGlzdENvbXBvbmVudHNSZXBseTsKKyNkZWZpbmUJc3pfeGtiTGlzdENvbXBvbmVudHNSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0S2JkQnlOYW1lIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCR2V0S2JkQnlOYW1lICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNgluZWVkIEIxNjsJLyogY29tYmluYXRpb24gb2YgWGtiR0JOXyogKi8KKyAgICBDQVJEMTYJd2FudCBCMTY7CS8qIGNvbWJpbmF0aW9uIG9mIFhrYkdCTl8qICovCisgICAgQk9PTAlsb2FkOworICAgIENBUkQ4CXBhZDsKK30geGtiR2V0S2JkQnlOYW1lUmVxOworI2RlZmluZQlzel94a2JHZXRLYmRCeU5hbWVSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldEtiZEJ5TmFtZVJlcGx5IHsKKyAgICBDQVJEOAl0eXBlOwkJLyogYWx3YXlzIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIEtleUNvZGUJbWluS2V5Q29kZTsKKyAgICBLZXlDb2RlCW1heEtleUNvZGU7CisgICAgQk9PTAlsb2FkZWQ7CisgICAgQk9PTAluZXdLZXlib2FyZDsKKyAgICBDQVJEMTYJZm91bmQgQjE2OwkvKiBjb21iaW5hdGlvbiBvZiBYa2JHQk5fKiAqLworICAgIENBUkQxNglyZXBvcnRlZCBCMTY7CS8qIGNvbWJpbmF0aW9uIG9mIFhrYkFsbENvbXBvbmVudHMgKi8KKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhrYkdldEtiZEJ5TmFtZVJlcGx5OworI2RlZmluZQlzel94a2JHZXRLYmRCeU5hbWVSZXBseQkzMgorCit0eXBlZGVmCXN0cnVjdCBfeGtiRGV2aWNlTGVkc1dpcmVEZXNjIHsKKyAgICBDQVJEMTYJbGVkQ2xhc3MgQjE2OworICAgIENBUkQxNglsZWRJRCBCMTY7CisgICAgQ0FSRDMyCW5hbWVzUHJlc2VudCBCMzI7CisgICAgQ0FSRDMyCW1hcHNQcmVzZW50IEIzMjsKKyAgICBDQVJEMzIJcGh5c0luZGljYXRvcnMgQjMyOworICAgIENBUkQzMglzdGF0ZSBCMzI7Cit9IHhrYkRldmljZUxlZHNXaXJlRGVzYzsKKyNkZWZpbmUgc3pfeGtiRGV2aWNlTGVkc1dpcmVEZXNjCTIwCisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXREZXZpY2VJbmZvIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCR2V0RGV2aWNlSW5mbyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJd2FudGVkIEIxNjsKKyAgICBCT09MCWFsbEJ0bnM7CisgICAgQ0FSRDgJZmlyc3RCdG47CisgICAgQ0FSRDgJbkJ0bnM7CisgICAgQ0FSRDgJcGFkOworICAgIENBUkQxNglsZWRDbGFzcyBCMTY7CisgICAgQ0FSRDE2CWxlZElEIEIxNjsKK30geGtiR2V0RGV2aWNlSW5mb1JlcTsKKyNkZWZpbmUJc3pfeGtiR2V0RGV2aWNlSW5mb1JlcQkxNgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0RGV2aWNlSW5mb1JlcGx5IHsKKyAgICBDQVJEOAl0eXBlOwkJLyogYWx3YXlzIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNglwcmVzZW50IEIxNjsKKyAgICBDQVJEMTYJc3VwcG9ydGVkIEIxNjsKKyAgICBDQVJEMTYJdW5zdXBwb3J0ZWQgQjE2OworICAgIENBUkQxNgluRGV2aWNlTGVkRkJzIEIxNjsKKyAgICBDQVJEOAlmaXJzdEJ0bldhbnRlZDsKKyAgICBDQVJEOAluQnRuc1dhbnRlZDsKKyAgICBDQVJEOAlmaXJzdEJ0blJ0cm47CisgICAgQ0FSRDgJbkJ0bnNSdHJuOworICAgIENBUkQ4CXRvdGFsQnRuczsKKyAgICBCT09MCWhhc093blN0YXRlOworICAgIENBUkQxNglkZmx0S2JkRkIgQjE2OworICAgIENBUkQxNglkZmx0TGVkRkIgQjE2OworICAgIENBUkQxNglwYWQgQjE2OworICAgIEF0b20JZGV2VHlwZSBCMzI7Cit9IHhrYkdldERldmljZUluZm9SZXBseTsKKyNkZWZpbmUJc3pfeGtiR2V0RGV2aWNlSW5mb1JlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JTZXREZXZpY2VJbmZvIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCU2V0RGV2aWNlSW5mbyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEOAlmaXJzdEJ0bjsKKyAgICBDQVJEOAluQnRuczsKKyAgICBDQVJEMTYJY2hhbmdlIEIxNjsKKyAgICBDQVJEMTYJbkRldmljZUxlZEZCcyBCMTY7Cit9IHhrYlNldERldmljZUluZm9SZXE7CisjZGVmaW5lCXN6X3hrYlNldERldmljZUluZm9SZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNldERlYnVnZ2luZ0ZsYWdzIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCU2V0RGVidWdnaW5nRmxhZ3MgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJbXNnTGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKKyAgICBDQVJEMzIJYWZmZWN0RmxhZ3MgQjMyOworICAgIENBUkQzMglmbGFncyBCMzI7CisgICAgQ0FSRDMyCWFmZmVjdEN0cmxzIEIzMjsKKyAgICBDQVJEMzIJY3RybHMgQjMyOworfSB4a2JTZXREZWJ1Z2dpbmdGbGFnc1JlcTsKKyNkZWZpbmUJc3pfeGtiU2V0RGVidWdnaW5nRmxhZ3NSZXEJMjQKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNldERlYnVnZ2luZ0ZsYWdzUmVwbHkgeworICAgIEJZVEUJdHlwZTsJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCWN1cnJlbnRGbGFncyBCMzI7CisgICAgQ0FSRDMyCWN1cnJlbnRDdHJscyBCMzI7CisgICAgQ0FSRDMyCXN1cHBvcnRlZEZsYWdzIEIzMjsKKyAgICBDQVJEMzIJc3VwcG9ydGVkQ3RybHMgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7Cit9IHhrYlNldERlYnVnZ2luZ0ZsYWdzUmVwbHk7CisjZGVmaW5lCXN6X3hrYlNldERlYnVnZ2luZ0ZsYWdzUmVwbHkJMzIKKworCS8qCisJICogWCBLRVlCT0FSRCBFWFRFTlNJT04gRVZFTlQgU1RSVUNUVVJFUworCSAqLworCit0eXBlZGVmIHN0cnVjdCBfeGtiQW55RXZlbnQgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKKyAgICBDQVJEMzIJcGFkNyBCMzI7Cit9IHhrYkFueUV2ZW50OworI2RlZmluZQlzel94a2JBbnlFdmVudCAzMgorCit0eXBlZGVmCXN0cnVjdCBfeGtiTmV3S2V5Ym9hcmROb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CW9sZERldmljZUlEOworICAgIEtleUNvZGUJbWluS2V5Q29kZTsKKyAgICBLZXlDb2RlCW1heEtleUNvZGU7CisgICAgS2V5Q29kZQlvbGRNaW5LZXlDb2RlOworICAgIEtleUNvZGUJb2xkTWF4S2V5Q29kZTsKKyAgICBDQVJEOAlyZXF1ZXN0TWFqb3I7CisgICAgQ0FSRDgJcmVxdWVzdE1pbm9yOworICAgIENBUkQxNgljaGFuZ2VkIEIxNjsKKyAgICBDQVJEOAlkZXRhaWw7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geGtiTmV3S2V5Ym9hcmROb3RpZnk7CisjZGVmaW5lCXN6X3hrYk5ld0tleWJvYXJkTm90aWZ5CTMyCisKK3R5cGVkZWYJc3RydWN0IF94a2JNYXBOb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CXB0ckJ0bkFjdGlvbnM7CisgICAgQ0FSRDE2CWNoYW5nZWQgQjE2OworICAgIEtleUNvZGUJbWluS2V5Q29kZTsKKyAgICBLZXlDb2RlCW1heEtleUNvZGU7CisgICAgQ0FSRDgJZmlyc3RUeXBlOworICAgIENBUkQ4CW5UeXBlczsKKyAgICBLZXlDb2RlCWZpcnN0S2V5U3ltOworICAgIENBUkQ4CW5LZXlTeW1zOworICAgIEtleUNvZGUJZmlyc3RLZXlBY3Q7CisgICAgQ0FSRDgJbktleUFjdHM7CisgICAgS2V5Q29kZQlmaXJzdEtleUJlaGF2aW9yOworICAgIENBUkQ4CW5LZXlCZWhhdmlvcnM7CisgICAgS2V5Q29kZQlmaXJzdEtleUV4cGxpY2l0OworICAgIENBUkQ4CW5LZXlFeHBsaWNpdDsKKyAgICBLZXlDb2RlCWZpcnN0TW9kTWFwS2V5OworICAgIENBUkQ4CW5Nb2RNYXBLZXlzOworICAgIEtleUNvZGUJZmlyc3RWTW9kTWFwS2V5OworICAgIENBUkQ4CW5WTW9kTWFwS2V5czsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworICAgIENBUkQxNglwYWQxIEIxNjsKK30geGtiTWFwTm90aWZ5OworI2RlZmluZQlzel94a2JNYXBOb3RpZnkJMzIKKwordHlwZWRlZglzdHJ1Y3QgX3hrYlN0YXRlTm90aWZ5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEOAltb2RzOworICAgIENBUkQ4CWJhc2VNb2RzOworICAgIENBUkQ4CWxhdGNoZWRNb2RzOworICAgIENBUkQ4CWxvY2tlZE1vZHM7CisgICAgQ0FSRDgJZ3JvdXA7CisgICAgSU5UMTYJYmFzZUdyb3VwIEIxNjsKKyAgICBJTlQxNglsYXRjaGVkR3JvdXAgQjE2OworICAgIENBUkQ4CWxvY2tlZEdyb3VwOworICAgIENBUkQ4CWNvbXBhdFN0YXRlOworICAgIENBUkQ4CWdyYWJNb2RzOworICAgIENBUkQ4CWNvbXBhdEdyYWJNb2RzOworICAgIENBUkQ4CWxvb2t1cE1vZHM7CisgICAgQ0FSRDgJY29tcGF0TG9va3VwTW9kczsKKyAgICBDQVJEMTYJcHRyQnRuU3RhdGUgQjE2OworICAgIENBUkQxNgljaGFuZ2VkIEIxNjsKKyAgICBLZXlDb2RlCWtleWNvZGU7CisgICAgQ0FSRDgJZXZlbnRUeXBlOworICAgIENBUkQ4CXJlcXVlc3RNYWpvcjsKKyAgICBDQVJEOAlyZXF1ZXN0TWlub3I7Cit9IHhrYlN0YXRlTm90aWZ5OworI2RlZmluZQlzel94a2JTdGF0ZU5vdGlmeQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiQ29udHJvbHNOb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CW51bUdyb3VwczsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCWNoYW5nZWRDb250cm9scyBCMzI7CisgICAgQ0FSRDMyCWVuYWJsZWRDb250cm9scyBCMzI7CisgICAgQ0FSRDMyCWVuYWJsZWRDb250cm9sQ2hhbmdlcyBCMzI7CisgICAgS2V5Q29kZQlrZXljb2RlOworICAgIENBUkQ4CWV2ZW50VHlwZTsKKyAgICBDQVJEOAlyZXF1ZXN0TWFqb3I7CisgICAgQ0FSRDgJcmVxdWVzdE1pbm9yOworICAgIENBUkQzMglwYWQyIEIzMjsKK30geGtiQ29udHJvbHNOb3RpZnk7CisjZGVmaW5lCXN6X3hrYkNvbnRyb2xzTm90aWZ5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JJbmRpY2F0b3JOb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworICAgIENBUkQzMglzdGF0ZSBCMzI7CisgICAgQ0FSRDMyCWNoYW5nZWQgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4a2JJbmRpY2F0b3JOb3RpZnk7CisjZGVmaW5lCXN6X3hrYkluZGljYXRvck5vdGlmeQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiTmFtZXNOb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CWNoYW5nZWQgQjE2OworICAgIENBUkQ4CWZpcnN0VHlwZTsKKyAgICBDQVJEOAluVHlwZXM7CisgICAgQ0FSRDgJZmlyc3RMZXZlbE5hbWU7CisgICAgQ0FSRDgJbkxldmVsTmFtZXM7CisgICAgQ0FSRDgJcGFkMjsKKyAgICBDQVJEOAluUmFkaW9Hcm91cHM7CisgICAgQ0FSRDgJbkFsaWFzZXM7CisgICAgQ0FSRDgJY2hhbmdlZEdyb3VwTmFtZXM7CisgICAgQ0FSRDE2CWNoYW5nZWRWaXJ0dWFsTW9kcyBCMTY7CisgICAgQ0FSRDgJZmlyc3RLZXk7CisgICAgQ0FSRDgJbktleXM7CisgICAgQ0FSRDMyCWNoYW5nZWRJbmRpY2F0b3JzIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhrYk5hbWVzTm90aWZ5OworI2RlZmluZQlzel94a2JOYW1lc05vdGlmeQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiQ29tcGF0TWFwTm90aWZ5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEOAljaGFuZ2VkR3JvdXBzOworICAgIENBUkQxNglmaXJzdFNJIEIxNjsKKyAgICBDQVJEMTYJblNJIEIxNjsKKyAgICBDQVJEMTYJblRvdGFsU0kgQjE2OworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geGtiQ29tcGF0TWFwTm90aWZ5OworI2RlZmluZSBzel94a2JDb21wYXRNYXBOb3RpZnkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkJlbGxOb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CWJlbGxDbGFzczsKKyAgICBDQVJEOAliZWxsSUQ7CisgICAgQ0FSRDgJcGVyY2VudDsKKyAgICBDQVJEMTYJcGl0Y2ggQjE2OworICAgIENBUkQxNglkdXJhdGlvbiBCMTY7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBXaW5kb3cJd2luZG93IEIzMjsKKyAgICBCT09MCWV2ZW50T25seTsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglwYWQyIEIxNjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhrYkJlbGxOb3RpZnk7CisjZGVmaW5lCXN6X3hrYkJlbGxOb3RpZnkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkFjdGlvbk1lc3NhZ2UgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIEtleUNvZGUJa2V5Y29kZTsKKyAgICBCT09MCXByZXNzOworICAgIEJPT0wJa2V5RXZlbnRGb2xsb3dzOworICAgIENBUkQ4CW1vZHM7CisgICAgQ0FSRDgJZ3JvdXA7CisgICAgQ0FSRDgJbWVzc2FnZVs4XTsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKK30geGtiQWN0aW9uTWVzc2FnZTsKKyNkZWZpbmUJc3pfeGtiQWN0aW9uTWVzc2FnZQkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkFjY2Vzc1hOb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIEtleUNvZGUJa2V5Y29kZTsKKyAgICBDQVJEMTYJZGV0YWlsIEIxNjsKKyAgICBDQVJEMTYJc2xvd0tleXNEZWxheSBCMTY7CisgICAgQ0FSRDE2CWRlYm91bmNlRGVsYXkgQjE2OworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geGtiQWNjZXNzWE5vdGlmeTsKKyNkZWZpbmUJc3pfeGtiQWNjZXNzWE5vdGlmeQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglyZWFzb24gQjE2OworICAgIENBUkQxNglsZWRDbGFzcyBCMTY7CisgICAgQ0FSRDE2CWxlZElEIEIxNjsKKyAgICBDQVJEMzIJbGVkc0RlZmluZWQgQjMyOworICAgIENBUkQzMglsZWRTdGF0ZSBCMzI7CisgICAgQ0FSRDgJZmlyc3RCdG47CisgICAgQ0FSRDgJbkJ0bnM7CisgICAgQ0FSRDE2CXN1cHBvcnRlZCBCMTY7CisgICAgQ0FSRDE2CXVuc3VwcG9ydGVkIEIxNjsKKyAgICBDQVJEMTYJcGFkMyBCMTY7Cit9IHhrYkV4dGVuc2lvbkRldmljZU5vdGlmeTsKKyNkZWZpbmUJc3pfeGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5CQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiRXZlbnQgeworICAgIHVuaW9uIHsKKwl4a2JBbnlFdmVudAkJYW55OworCXhrYk5ld0tleWJvYXJkTm90aWZ5CW5ld19rYmQ7CisJeGtiTWFwTm90aWZ5CQltYXA7CisJeGtiU3RhdGVOb3RpZnkJCXN0YXRlOworCXhrYkNvbnRyb2xzTm90aWZ5CWN0cmxzOworCXhrYkluZGljYXRvck5vdGlmeQlpbmRpY2F0b3JzOworCXhrYk5hbWVzTm90aWZ5CQluYW1lczsKKwl4a2JDb21wYXRNYXBOb3RpZnkJY29tcGF0OworCXhrYkJlbGxOb3RpZnkJCWJlbGw7CisJeGtiQWN0aW9uTWVzc2FnZQltZXNzYWdlOworCXhrYkFjY2Vzc1hOb3RpZnkJYWNjZXNzeDsKKwl4a2JFeHRlbnNpb25EZXZpY2VOb3RpZnkgZGV2aWNlOworICAgIH0gdTsKK30geGtiRXZlbnQ7CisjZGVmaW5lIHN6X3hrYkV2ZW50CTMyCisKKyN1bmRlZiBXaW5kb3cKKyN1bmRlZiBBdG9tCisjdW5kZWYgVGltZQorI3VuZGVmIEtleUNvZGUKKyN1bmRlZiBLZXlTeW0KKworI2VuZGlmIC8qIF9YS0JQUk9UT19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0JzcnYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCc3J2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhNGVkOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCc3J2LmgKQEAgLTAsMCArMSwxMTg3IEBACisvKiAkWG9yZzogWEtCc3J2LmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NSBjb3NrcmV5IEV4cCAkICovCisvKiAkWGRvdE9yZzogJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAxOTkzIGJ5IFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU2lsaWNvbiBHcmFwaGljcyBub3QgYmUgCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiAKK29mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1NpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IAorb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKK3dpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworU0lMSUNPTiBHUkFQSElDUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyAKK1NPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgCitBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIElOIE5PIEVWRU5UIFNIQUxMIFNJTElDT04KK0dSQVBISUNTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgCitEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIAorREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSAKK09SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiAgV0lUSAorVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvWEtCc3J2LmgsdiAzLjIyIDIwMDIvMTEvMjAgMDQ6NDk6MDEgZGF3ZXMgRXhwICQgKi8KKworI2lmbmRlZiBfWEtCU1JWX0hfCisjZGVmaW5lCV9YS0JTUlZfSF8KKworI2lmZGVmIFhLQl9JTl9TRVJWRVIKKyNkZWZpbmUgWGtiQWxsb2NDbGllbnRNYXAJCVNydlhrYkFsbG9jQ2xpZW50TWFwCisjZGVmaW5lIFhrYkFsbG9jU2VydmVyTWFwCQlTcnZYa2JBbGxvY1NlcnZlck1hcAorI2RlZmluZSBYa2JDaGFuZ2VUeXBlc09mS2V5CQlTcnZYa2JDaGFuZ2VUeXBlc09mS2V5CisjZGVmaW5lCVhrYkFkZEtleVR5cGUJCQlTcnZYa2JBZGRLZXlUeXBlCisjZGVmaW5lIFhrYkNvcHlLZXlUeXBlCQkJU3J2WGtiQ29weUtleVR5cGUKKyNkZWZpbmUgWGtiQ29weUtleVR5cGVzCQkJU3J2WGtiQ29weUtleVR5cGVzCisjZGVmaW5lIFhrYkZyZWVDbGllbnRNYXAJCVNydlhrYkZyZWVDbGllbnRNYXAKKyNkZWZpbmUgWGtiRnJlZVNlcnZlck1hcAkJU3J2WGtiRnJlZVNlcnZlck1hcAorI2RlZmluZSBYa2JJbml0Q2Fub25pY2FsS2V5VHlwZXMJU3J2WGtiSW5pdENhbm9uaWNhbEtleVR5cGVzCisjZGVmaW5lCVhrYktleVR5cGVzRm9yQ29yZVN5bWJvbHMJU3J2WGtiS2V5VHlwZXNGb3JDb3JlU3ltYm9scworI2RlZmluZQlYa2JBcHBseUNvbXBhdE1hcFRvS2V5CQlTcnZYa2JBcHBseUNvbXBhdE1hcFRvS2V5CisjZGVmaW5lCVhrYlVwZGF0ZU1hcEZyb21Db3JlCQlTcnZYa2JVcGRhdGVNYXBGcm9tQ29yZQorI2RlZmluZSBYa2JSZXNpemVLZXlBY3Rpb25zCQlTcnZYa2JSZXNpemVLZXlBY3Rpb25zCisjZGVmaW5lIFhrYlJlc2l6ZUtleVN5bXMJCVNydlhrYlJlc2l6ZUtleVN5bXMKKyNkZWZpbmUgWGtiUmVzaXplS2V5VHlwZQkJU3J2WGtiUmVzaXplS2V5VHlwZQorI2RlZmluZSBYa2JBbGxvY0NvbXBhdE1hcAkJU3J2WGtiQWxsb2NDb21wYXRNYXAKKyNkZWZpbmUgWGtiQWxsb2NDb250cm9scwkJU3J2WGtiQWxsb2NDb250cm9scworI2RlZmluZSBYa2JBbGxvY0luZGljYXRvck1hcHMJCVNydlhrYkFsbG9jSW5kaWNhdG9yTWFwcworI2RlZmluZSBYa2JBbGxvY0tleWJvYXJkCQlTcnZYa2JBbGxvY0tleWJvYXJkCisjZGVmaW5lIFhrYkFsbG9jTmFtZXMJCQlTcnZYa2JBbGxvY05hbWVzCisjZGVmaW5lIFhrYkZyZWVDb21wYXRNYXAJCVNydlhrYkZyZWVDb21wYXRNYXAKKyNkZWZpbmUgWGtiRnJlZUNvbnRyb2xzCQkJU3J2WGtiRnJlZUNvbnRyb2xzCisjZGVmaW5lIFhrYkZyZWVJbmRpY2F0b3JNYXBzCQlTcnZYa2JGcmVlSW5kaWNhdG9yTWFwcworI2RlZmluZSBYa2JGcmVlS2V5Ym9hcmQJCQlTcnZYa2JGcmVlS2V5Ym9hcmQKKyNkZWZpbmUgWGtiRnJlZU5hbWVzCQkJU3J2WGtiRnJlZU5hbWVzCisjZGVmaW5lCVhrYkFkZERldmljZUxlZEluZm8JCVNydlhrYkFkZERldmljZUxlZEluZm8KKyNkZWZpbmUJWGtiQWxsb2NEZXZpY2VJbmZvCQlTcnZYa2JBbGxvY0RldmljZUluZm8KKyNkZWZpbmUJWGtiRnJlZURldmljZUluZm8JCVNydlhrYkZyZWVEZXZpY2VJbmZvCisjZGVmaW5lCVhrYlJlc2l6ZURldmljZUJ1dHRvbkFjdGlvbnMJU3J2WGtiUmVzaXplRGV2aWNlQnV0dG9uQWN0aW9ucworI2RlZmluZSBYa2JMYXRjaE1vZGlmaWVycwkJU3J2WGtiTGF0Y2hNb2RpZmllcnMKKyNkZWZpbmUgWGtiTGF0Y2hHcm91cAkJCVNydlhrYkxhdGNoR3JvdXAKKyNkZWZpbmUgWGtiVmlydHVhbE1vZHNUb1JlYWwJCVNydlhrYlZpcnR1YWxNb2RzVG9SZWFsCisjZGVmaW5lCVhrYkNoYW5nZUtleWNvZGVSYW5nZQkJU3J2WGtiQ2hhbmdlS2V5Y29kZVJhbmdlCisjZGVmaW5lCVhrYkFwcGx5VmlydHVhbE1vZENoYW5nZXMJU3J2WGtiQXBwbHlWaXJ0dWFsTW9kQ2hhbmdlcworI2RlZmluZQlYa2JVcGRhdGVBY3Rpb25WaXJ0dWFsTW9kcwlTcnZYa2JVcGRhdGVBY3Rpb25WaXJ0dWFsTW9kcworI2RlZmluZSBYa2JVcGRhdGVLZXlUeXBlVmlydHVhbE1vZHMJU3J2WGtiVXBkYXRlS2V5VHlwZVZpcnR1YWxNb2RzCisjZW5kaWYKKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hLQnN0ci5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hLQnByb3RvLmg+CisjaW5jbHVkZSAiaW5wdXRzdHIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkludGVyZXN0IHsKKwlEZXZpY2VJbnRQdHIJCWRldjsKKwlDbGllbnRQdHIJCWNsaWVudDsKKwlYSUQJCQlyZXNvdXJjZTsKKwlzdHJ1Y3QgX1hrYkludGVyZXN0ICoJbmV4dDsKKwlDQVJEMTYJCQlleHREZXZOb3RpZnlNYXNrOworCUNBUkQxNgkJCXN0YXRlTm90aWZ5TWFzazsKKwlDQVJEMTYJCQluYW1lc05vdGlmeU1hc2s7CisJQ0FSRDMyIAkJCWN0cmxzTm90aWZ5TWFzazsKKwlDQVJEOAkJCWNvbXBhdE5vdGlmeU1hc2s7CisJQk9PTAkJCWJlbGxOb3RpZnlNYXNrOworCUJPT0wJCQlhY3Rpb25NZXNzYWdlTWFzazsKKwlDQVJEMTYJCQlhY2Nlc3NYTm90aWZ5TWFzazsKKwlDQVJEMzIJCQlpU3RhdGVOb3RpZnlNYXNrOworCUNBUkQzMgkJCWlNYXBOb3RpZnlNYXNrOworCUNBUkQxNgkJCWFsdFN5bXNOb3RpZnlNYXNrOworCUNBUkQzMgkJCWF1dG9DdHJsczsKKwlDQVJEMzIJCQlhdXRvQ3RybFZhbHVlczsKK30gWGtiSW50ZXJlc3RSZWMsKlhrYkludGVyZXN0UHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiUmFkaW9Hcm91cCB7CisJQ0FSRDgJCWZsYWdzOworCUNBUkQ4CQluTWVtYmVyczsKKwlDQVJEOAkJZGZsdERvd247CisJQ0FSRDgJCWN1cnJlbnREb3duOworCUNBUkQ4CQltZW1iZXJzW1hrYlJHTWF4TWVtYmVyc107Cit9IFhrYlJhZGlvR3JvdXBSZWMsICpYa2JSYWRpb0dyb3VwUHRyOworCit0eXBlZGVmIHN0cnVjdAlfWGtiRXZlbnRDYXVzZSB7CisJQ0FSRDgJCWtjOworCUNBUkQ4CQlldmVudDsKKwlDQVJEOAkJbWpyOworCUNBUkQ4CQltbnI7CisJQ2xpZW50UHRyCWNsaWVudDsKK30gWGtiRXZlbnRDYXVzZVJlYywqWGtiRXZlbnRDYXVzZVB0cjsKKyNkZWZpbmUJWGtiU2V0Q2F1c2VLZXkoYyxrLGUpCXsgKGMpLT5rYz0gKGspLChjKS0+ZXZlbnQ9IChlKSxcCisJCQkJICAoYyktPm1qcj0gKGMpLT5tbnI9IDA7IFwKKwkJCQkgIChjKS0+Y2xpZW50PSBOVUxMOyB9CisjZGVmaW5lCVhrYlNldENhdXNlUmVxKGMsaixuLGNsKSB7IChjKS0+a2M9IChjKS0+ZXZlbnQ9IDAsXAorCQkJCSAgKGMpLT5tanI9IChqKSwoYyktPm1ucj0gKG4pO1wKKwkJCQkgIChjKS0+Y2xpZW50PSAoY2wpOyB9CisjZGVmaW5lCVhrYlNldENhdXNlQ29yZVJlcShjLGUsY2wpIFhrYlNldENhdXNlUmVxKGMsZSwwLGNsKQorI2RlZmluZQlYa2JTZXRDYXVzZVhrYlJlcShjLGUsY2wpICBYa2JTZXRDYXVzZVJlcShjLFhrYlJlcUNvZGUsZSxjbCkKKyNkZWZpbmUJWGtiU2V0Q2F1c2VVbmtub3duKGMpCSAgIFhrYlNldENhdXNlS2V5KGMsMCwwKQorCisjZGVmaW5lCV9PRkZfVElNRVIJCTAKKyNkZWZpbmUJX0tSR19XQVJOX1RJTUVSCQkxCisjZGVmaW5lCV9LUkdfVElNRVIJCTIKKyNkZWZpbmUJX1NLX1RJTUVPVVRfVElNRVIJMworI2RlZmluZQlfQUxMX1RJTUVPVVRfVElNRVIJNAorCisjZGVmaW5lCV9CRUVQX05PTkUJCTAKKyNkZWZpbmUJX0JFRVBfRkVBVFVSRV9PTgkxCisjZGVmaW5lCV9CRUVQX0ZFQVRVUkVfT0ZGCTIKKyNkZWZpbmUJX0JFRVBfRkVBVFVSRV9DSEFOR0UJMworI2RlZmluZQlfQkVFUF9TTE9XX1dBUk4JCTQKKyNkZWZpbmUJX0JFRVBfU0xPV19QUkVTUwk1CisjZGVmaW5lCV9CRUVQX1NMT1dfQUNDRVBUCTYKKyNkZWZpbmUJX0JFRVBfU0xPV19SRUpFQ1QJNworI2RlZmluZQlfQkVFUF9TTE9XX1JFTEVBU0UJOAorI2RlZmluZQlfQkVFUF9TVElDS1lfTEFUQ0gJOQorI2RlZmluZQlfQkVFUF9TVElDS1lfTE9DSwkxMAorI2RlZmluZQlfQkVFUF9TVElDS1lfVU5MT0NLCTExCisjZGVmaW5lCV9CRUVQX0xFRF9PTgkJMTIKKyNkZWZpbmUJX0JFRVBfTEVEX09GRgkJMTMKKyNkZWZpbmUJX0JFRVBfTEVEX0NIQU5HRQkxNAorI2RlZmluZQlfQkVFUF9CT1VOQ0VfUkVKRUNUCTE1CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTcnZJbmZvIHsKKwlYa2JTdGF0ZVJlYwkgcHJldl9zdGF0ZTsKKwlYa2JTdGF0ZVJlYwkgc3RhdGU7CisJWGtiRGVzY1B0cgkgZGVzYzsKKworCURldmljZUludFB0cgkgZGV2aWNlOworCUtiZEN0cmxQcm9jUHRyCSBrYmRQcm9jOworCisJWGtiUmFkaW9Hcm91cFB0ciByYWRpb0dyb3VwczsKKwlDQVJEOAkJIG5SYWRpb0dyb3VwczsKKwlDQVJEOAkJIGNsZWFyTW9kczsKKwlDQVJEOAkJIHNldE1vZHM7CisJSU5UMTYJCSBncm91cENoYW5nZTsKKworCUNBUkQxNgkJIGRmbHRQdHJEZWx0YTsKKworCWRvdWJsZQkJIG1vdXNlS2V5c0N1cnZlOworCWRvdWJsZQkJIG1vdXNlS2V5c0N1cnZlRmFjdG9yOworCUlOVDE2CQkgbW91c2VLZXlzRFg7CisJSU5UMTYJCSBtb3VzZUtleXNEWTsKKwlDQVJEOAkJIG1vdXNlS2V5c0ZsYWdzOworCUJvb2wJCSBtb3VzZUtleXNBY2NlbDsKKwlDQVJEOAkJIG1vdXNlS2V5c0NvdW50ZXI7CisKKwlDQVJEOAkJIGxvY2tlZFB0ckJ1dHRvbnM7CisJQ0FSRDgJCSBzaGlmdEtleUNvdW50OworCUtleUNvZGUJCSBtb3VzZUtleTsKKwlLZXlDb2RlCQkgaW5hY3RpdmVLZXk7CisJS2V5Q29kZQkJIHNsb3dLZXk7CisJS2V5Q29kZQkJIHJlcGVhdEtleTsKKwlDQVJEOAkJIGtyZ1RpbWVyQWN0aXZlOworCUNBUkQ4CQkgYmVlcFR5cGU7CisJQ0FSRDgJCSBiZWVwQ291bnQ7CisKKwlDQVJEMzIJCSBmbGFnczsKKwlDQVJEMzIJCSBsYXN0UHRyRXZlbnRUaW1lOworCUNBUkQzMgkJIGxhc3RTaGlmdEV2ZW50VGltZTsKKwlPc1RpbWVyUHRyCSBiZWVwVGltZXI7CisJT3NUaW1lclB0cgkgbW91c2VLZXlUaW1lcjsKKwlPc1RpbWVyUHRyCSBzbG93S2V5c1RpbWVyOworCU9zVGltZXJQdHIJIGJvdW5jZUtleXNUaW1lcjsKKwlPc1RpbWVyUHRyCSByZXBlYXRLZXlUaW1lcjsKKwlPc1RpbWVyUHRyCSBrcmdUaW1lcjsKK30gWGtiU3J2SW5mb1JlYywgKlhrYlNydkluZm9QdHI7CisKKyNkZWZpbmUJWGtiU0xJX0lzRGVmYXVsdAkoMUw8PDApCisjZGVmaW5lCVhrYlNMSV9IYXNPd25TdGF0ZQkoMUw8PDEpCisKK3R5cGVkZWYgc3RydWN0CV9Ya2JTcnZMZWRJbmZvIHsKKwlDQVJEMTYJCQlmbGFnczsKKwlDQVJEMTYJCQljbGFzczsKKwlDQVJEMTYJCQlpZDsKKwl1bmlvbiB7CisJICAgIEtiZEZlZWRiYWNrUHRyCWtmOworCSAgICBMZWRGZWVkYmFja1B0cglsZjsKKwl9IAkJCWZiOworCisJQ0FSRDMyCQkJcGh5c0luZGljYXRvcnM7CisJQ0FSRDMyCQkJYXV0b1N0YXRlOworCUNBUkQzMgkJCWV4cGxpY2l0U3RhdGU7CisJQ0FSRDMyCQkJZWZmZWN0aXZlU3RhdGU7CisKKwlDQVJEMzIJCQltYXBzUHJlc2VudDsKKwlDQVJEMzIJCQluYW1lc1ByZXNlbnQ7CisJWGtiSW5kaWNhdG9yTWFwUHRyCW1hcHM7CisJQXRvbSAqCQkJbmFtZXM7CisKKwlDQVJEMzIJCQl1c2VzQmFzZTsKKwlDQVJEMzIJCQl1c2VzTGF0Y2hlZDsKKwlDQVJEMzIJCQl1c2VzTG9ja2VkOworCUNBUkQzMgkJCXVzZXNFZmZlY3RpdmU7CisJQ0FSRDMyCQkJdXNlc0NvbXBhdDsKKwlDQVJEMzIJCQl1c2VzQ29udHJvbHM7CisKKwlDQVJEMzIJCQl1c2VkQ29tcG9uZW50czsKK30gWGtiU3J2TGVkSW5mb1JlYywgKlhrYlNydkxlZEluZm9QdHI7CisKKy8qCisgKiBTZXR0aW5ncyBmb3IgeGtiQ2xpZW50RmxhZ3MgZmllbGQgKHVzZWQgYnkgRElYKQorICogVGhlc2UgZmxhZ3MgX211c3RfIG5vdCBvdmVybGFwIHdpdGggWGtiUENGXyoKKyAqLworI2RlZmluZQlfWGtiQ2xpZW50SW5pdGlhbGl6ZWQJCSgxPDwxNSkKKworI2RlZmluZQlfWGtiV2FudHNEZXRlY3RhYmxlQXV0b1JlcGVhdChjKVwKKwkoKGMpLT54a2JDbGllbnRGbGFncyZYa2JQQ0ZfRGV0ZWN0YWJsZUF1dG9SZXBlYXRNYXNrKQorCisvKgorICogU2V0dGluZ3MgZm9yIGZsYWdzIGZpZWxkCisgKi8KKyNkZWZpbmUJX1hrYlN0YXRlTm90aWZ5SW5Qcm9ncmVzcwkoMTw8MCkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQcm9jZXNzSW5wdXRQcm9jIHByb2Nlc3NJbnB1dFByb2M7CisgICAgUHJvY2Vzc0lucHV0UHJvYyByZWFsSW5wdXRQcm9jOworICAgIERldmljZVVud3JhcFByb2MgdW53cmFwUHJvYzsKK30geGtiRGV2aWNlSW5mb1JlYywgKnhrYkRldmljZUluZm9QdHI7CisKKyNkZWZpbmUgV1JBUF9QUk9DRVNTX0lOUFVUX1BST0MoZGV2aWNlLCBvbGRwcm9jcywgcHJvYywgdW53cmFwcHJvYykgXAorCWRldmljZS0+cHVibGljLnByb2Nlc3NJbnB1dFByb2MgPSBwcm9jOyBcCisJb2xkcHJvY3MtPnByb2Nlc3NJbnB1dFByb2MgPSBcCisJb2xkcHJvY3MtPnJlYWxJbnB1dFByb2MgPSBkZXZpY2UtPnB1YmxpYy5yZWFsSW5wdXRQcm9jOyBcCisJZGV2aWNlLT5wdWJsaWMucmVhbElucHV0UHJvYyA9IHByb2M7IFwKKwlvbGRwcm9jcy0+dW53cmFwUHJvYyA9IGRldmljZS0+dW53cmFwUHJvYzsgXAorCWRldmljZS0+dW53cmFwUHJvYyA9IHVud3JhcHByb2M7CisKKyNkZWZpbmUgQ09ORF9XUkFQX1BST0NFU1NfSU5QVVRfUFJPQyhkZXZpY2UsIG9sZHByb2NzLCBwcm9jLCB1bndyYXBwcm9jKSBcCisJaWYgKGRldmljZS0+cHVibGljLnByb2Nlc3NJbnB1dFByb2MgPT0gZGV2aWNlLT5wdWJsaWMucmVhbElucHV0UHJvYylcCisJICAgIGRldmljZS0+cHVibGljLnByb2Nlc3NJbnB1dFByb2MgPSBwcm9jOyBcCisJb2xkcHJvY3MtPnByb2Nlc3NJbnB1dFByb2MgPSBcCisJb2xkcHJvY3MtPnJlYWxJbnB1dFByb2MgPSBkZXZpY2UtPnB1YmxpYy5yZWFsSW5wdXRQcm9jOyBcCisJZGV2aWNlLT5wdWJsaWMucmVhbElucHV0UHJvYyA9IHByb2M7IFwKKwlvbGRwcm9jcy0+dW53cmFwUHJvYyA9IGRldmljZS0+dW53cmFwUHJvYzsgXAorCWRldmljZS0+dW53cmFwUHJvYyA9IHVud3JhcHByb2M7CisKKyNkZWZpbmUgVU5XUkFQX1BST0NFU1NfSU5QVVRfUFJPQyhkZXZpY2UsIG9sZHByb2NzKSBcCisJZGV2aWNlLT5wdWJsaWMucHJvY2Vzc0lucHV0UHJvYyA9IG9sZHByb2NzLT5wcm9jZXNzSW5wdXRQcm9jOyBcCisJZGV2aWNlLT5wdWJsaWMucmVhbElucHV0UHJvYyA9IG9sZHByb2NzLT5yZWFsSW5wdXRQcm9jOyBcCisJZGV2aWNlLT51bndyYXBQcm9jID0gb2xkcHJvY3MtPnVud3JhcFByb2M7CisKKyNkZWZpbmUgWEtCREVWSUNFSU5GTyhkZXYpICgoeGtiRGV2aWNlSW5mb1B0cikgKGRldiktPmRldlByaXZhdGVzW3hrYkRldmljZVByaXZhdGVJbmRleF0ucHRyKQorCisvKioqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qKiovCisKKworLyoqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KioqLworCisjZGVmaW5lIFhrYkFYX0tSR01hc2sJIChYa2JTbG93S2V5c01hc2t8WGtiQm91bmNlS2V5c01hc2spCisjZGVmaW5lCVhrYkFsbEZpbHRlcmVkRXZlbnRzTWFzayBcCisJKFhrYkFjY2Vzc1hLZXlzTWFza3xYa2JSZXBlYXRLZXlzTWFza3xYa2JNb3VzZUtleXNBY2NlbE1hc2t8WGtiQVhfS1JHTWFzaykKKworLyoqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KioqLworCitleHRlcm4gaW50CVhrYlJlcUNvZGU7CitleHRlcm4gaW50CVhrYkV2ZW50QmFzZTsKK2V4dGVybiBpbnQJWGtiS2V5Ym9hcmRFcnJvckNvZGU7CitleHRlcm4gaW50CVhrYkRpc2FibGVMb2NrQWN0aW9uczsKK2V4dGVybiBjaGFyICoJWGtiQmFzZURpcmVjdG9yeTsKK2V4dGVybiBjaGFyICoJWGtiQmluRGlyZWN0b3J5OworZXh0ZXJuIGNoYXIgKglYa2JJbml0aWFsTWFwOworZXh0ZXJuIGludAlfWGtiQ2xpZW50TWFqb3I7CitleHRlcm4gaW50CV9Ya2JDbGllbnRNaW5vcjsKK2V4dGVybiB1bnNpZ25lZAlpbnQgWGtiWElVbnN1cHBvcnRlZDsKKworZXh0ZXJuIGNoYXIgKglYa2JNb2RlbFVzZWQsKlhrYkxheW91dFVzZWQsKlhrYlZhcmlhbnRVc2VkLCpYa2JPcHRpb25zVXNlZDsKK2V4dGVybiBCb29sCW5vWGtiRXh0ZW5zaW9uOworZXh0ZXJuIEJvb2wJWGtiV2FudFJ1bGVzUHJvcDsKKworZXh0ZXJuIHBvaW50ZXIJWGtiTGFzdFJlcGVhdEV2ZW50OworCitleHRlcm4gQ0FSRDMyCXhrYkRlYnVnRmxhZ3M7CitleHRlcm4gQ0FSRDMyCXhrYkRlYnVnQ3RybHM7CisKKyNkZWZpbmUJX1hrYkFsbG9jKHMpCQl4YWxsb2MoKHMpKQorI2RlZmluZQlfWGtiQ2FsbG9jKG4scykJCVhjYWxsb2MoKG4pKihzKSkKKyNkZWZpbmUJX1hrYlJlYWxsb2MobyxzKQlYcmVhbGxvYygobyksKHMpKQorI2RlZmluZQlfWGtiVHlwZWRBbGxvYyh0KQkoKHQgKil4YWxsb2Moc2l6ZW9mKHQpKSkKKyNkZWZpbmUJX1hrYlR5cGVkQ2FsbG9jKG4sdCkJKCh0ICopWGNhbGxvYygobikqc2l6ZW9mKHQpKSkKKyNkZWZpbmUJX1hrYlR5cGVkUmVhbGxvYyhvLG4sdCkgXAorCSgobyk/KHQgKilYcmVhbGxvYygobyksKG4pKnNpemVvZih0KSk6X1hrYlR5cGVkQ2FsbG9jKG4sdCkpCisjZGVmaW5lCV9Ya2JDbGVhckVsZW1zKGEsZixsLHQpCWJ6ZXJvKCYoYSlbZl0sKChsKS0oZikrMSkqc2l6ZW9mKHQpKQorI2RlZmluZQlfWGtiRnJlZShwKQkJWGZyZWUocCkKKworI2RlZmluZQlfWGtiTGliRXJyb3IoYyxsLGQpIFwKKwl7IF9Ya2JFcnJDb2RlPSAoYyk7IF9Ya2JFcnJMb2NhdGlvbj0gKGwpOyBfWGtiRXJyRGF0YT0gKGQpOyB9CisjZGVmaW5lCV9Ya2JFcnJDb2RlMihhLGIpICgoWElEKSgoKCh1bnNpZ25lZCBpbnQpKGEpKTw8MjQpfCgoYikmMHhmZmZmZmYpKSkKKyNkZWZpbmUJX1hrYkVyckNvZGUzKGEsYixjKQlfWGtiRXJyQ29kZTIoYSwoKCh1bnNpZ25lZCBpbnQpKGIpKTw8MTYpfChjKSkKKyNkZWZpbmUJX1hrYkVyckNvZGU0KGEsYixjLGQpIF9Ya2JFcnJDb2RlMyhhLGIsKCgoKHVuc2lnbmVkIGludCkoYykpPDw4KXwoZCkpKQorCitleHRlcm4JaW50CURldmljZUtleVByZXNzLERldmljZUtleVJlbGVhc2U7CitleHRlcm4JaW50CURldmljZUJ1dHRvblByZXNzLERldmljZUJ1dHRvblJlbGVhc2U7CisKKyNpZmRlZiBYSU5QVVQKKyNkZWZpbmUJX1hrYklzUHJlc3NFdmVudCh0KQkoKCh0KT09S2V5UHJlc3MpfHwoKHQpPT1EZXZpY2VLZXlQcmVzcykpCisjZGVmaW5lCV9Ya2JJc1JlbGVhc2VFdmVudCh0KQkoKCh0KT09S2V5UmVsZWFzZSl8fCgodCk9PURldmljZUtleVJlbGVhc2UpKQorI2Vsc2UKKyNkZWZpbmUJX1hrYklzUHJlc3NFdmVudCh0KQkoKHQpPT1LZXlQcmVzcykKKyNkZWZpbmUJX1hrYklzUmVsZWFzZUV2ZW50KHQpCSgodCk9PUtleVJlbGVhc2UpCisjZW5kaWYKKworI2RlZmluZQlfWGtiQ29yZUtleWNvZGVJblJhbmdlKGMsaykJKCgoayk+PShjKS0+Y3VyS2V5U3ltcy5taW5LZXlDb2RlKSYmXAorCQkJCQkgKChrKTw9KGMpLT5jdXJLZXlTeW1zLm1heEtleUNvZGUpKQorI2RlZmluZQlfWGtiQ29yZU51bUtleXMoYykJKChjKS0+Y3VyS2V5U3ltcy5tYXhLZXlDb2RlLVwKKwkJCQkgKGMpLT5jdXJLZXlTeW1zLm1pbktleUNvZGUrMSkKKworI2RlZmluZQlYQ29udmVydENhc2UocyxsLHUpCVhrYkNvbnZlcnRDYXNlKHMsbCx1KQorI3VuZGVmCUlzS2V5cGFkS2V5CisjZGVmaW5lCUlzS2V5cGFkS2V5KHMpCQlYa2JLU0lzS2V5cGFkKHMpCisKK3R5cGVkZWYgaW50IFN0YXR1czsKK3R5cGVkZWYgcG9pbnRlciBYUG9pbnRlcjsKK3R5cGVkZWYgc3RydWN0IF9YRGlzcGxheSBEaXNwbGF5OworCisjaWZuZGVmIFRydWUKKyNkZWZpbmUJVHJ1ZQkxCisjZGVmaW5lCUZhbHNlCTAKKyNlbmRpZgorCisjaWZuZGVmIFBBVEhfTUFYCisjaWZkZWYgTUFYUEFUSExFTgorI2RlZmluZQlQQVRIX01BWCBNQVhQQVRITEVOCisjZWxzZQorI2RlZmluZQlQQVRIX01BWCAxMDI0CisjZW5kaWYKKyNlbmRpZgorCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiB2b2lkIFhrYlVzZU1zZygKKyAgICB2b2lkCispOworCitleHRlcm4gaW50IFhrYlByb2Nlc3NBcmd1bWVudHMoCisgICAgaW50CQkJCS8qIGFyZ2MgKi8sCisgICAgY2hhciAqKgkJCS8qIGFyZ3YgKi8sCisgICAgaW50CQkJCS8qIGkgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYlNldEV4dGVuc2lvbihEZXZpY2VJbnRQdHIgZGV2aWNlLCBQcm9jZXNzSW5wdXRQcm9jIHByb2MpOworCitleHRlcm4Jdm9pZAlYa2JGcmVlQ29tcGF0TWFwKAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKyAgICBCb29sCQkJLyogZnJlZU1hcCAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiRnJlZU5hbWVzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCUJvb2wJCQkvKiBmcmVlTWFwICovCispOworCitleHRlcm4gRGV2aWNlSW50UHRyIF9Ya2JMb29rdXBBbnlEZXZpY2UoCisgICAgaW50CQkJLyogaWQgKi8sCisgICAgaW50ICoJCS8qIHdoeV9ydHJuICovCispOworCitleHRlcm4gRGV2aWNlSW50UHRyIF9Ya2JMb29rdXBLZXlib2FyZCgKKyAgICBpbnQJCQkvKiBpZCAqLywKKyAgICBpbnQgKgkJLyogd2h5X3J0cm4gKi8KKyk7CisKK2V4dGVybiBEZXZpY2VJbnRQdHIgX1hrYkxvb2t1cEJlbGxEZXZpY2UoCisgICAgaW50CQkJLyogaWQgKi8sCisgICAgaW50ICoJCS8qIHdoeV9ydHJuICovCispOworCitleHRlcm4gRGV2aWNlSW50UHRyIF9Ya2JMb29rdXBMZWREZXZpY2UoCisgICAgaW50CQkJLyogaWQgKi8sCisgICAgaW50ICoJCS8qIHdoeV9ydHJuICovCispOworCitleHRlcm4gRGV2aWNlSW50UHRyIF9Ya2JMb29rdXBCdXR0b25EZXZpY2UoCisgICAgaW50CQkJLyogaWQgKi8sCisgICAgaW50ICoJCS8qIHdoeV9ydHJuICovCispOworCitleHRlcm4JWGtiRGVzY1B0ciBYa2JBbGxvY0tleWJvYXJkKAorCXZvaWQKKyk7CisKK2V4dGVybglTdGF0dXMgWGtiQWxsb2NDbGllbnRNYXAoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJdW5zaWduZWQgaW50CQkvKiBuVHlwZXMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMgWGtiQWxsb2NTZXJ2ZXJNYXAoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJdW5zaWduZWQgaW50CQkvKiBuTmV3QWN0aW9ucyAqLworKTsKKworZXh0ZXJuCXZvaWQJWGtiRnJlZUNsaWVudE1hcCgKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2hhdCAqLywKKyAgICBCb29sCQkJLyogZnJlZU1hcCAqLworKTsKKworZXh0ZXJuCXZvaWQJWGtiRnJlZVNlcnZlck1hcCgKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2hhdCAqLywKKyAgICBCb29sCQkJLyogZnJlZU1hcCAqLworKTsKKworZXh0ZXJuCVN0YXR1cyBYa2JBbGxvY0luZGljYXRvck1hcHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkFsbG9jQ29tcGF0TWFwKAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIG5JbnRlcnByZXQgKi8KKyk7CisKK2V4dGVybglTdGF0dXMgWGtiQWxsb2NOYW1lcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlpbnQJCQkvKiBuVG90YWxSRyAqLywKKwlpbnQJCQkvKiBuVG90YWxBbGlhc2VzICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkFsbG9jQ29udHJvbHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2gqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JDb3B5S2V5VHlwZSgKKyAgICBYa2JLZXlUeXBlUHRyCQkvKiBmcm9tICovLAorICAgIFhrYktleVR5cGVQdHIJCS8qIGludG8gKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiQ29weUtleVR5cGVzKAorICAgIFhrYktleVR5cGVQdHIJCS8qIGZyb20gKi8sCisgICAgWGtiS2V5VHlwZVB0cgkJLyogaW50byAqLywKKyAgICBpbnQJCQkJLyogbnVtX3R5cGVzICovCispOworCitleHRlcm4JU3RhdHVzCVhrYlJlc2l6ZUtleVR5cGUoCisgICAgWGtiRGVzY1B0cgkJLyogeGtiICovLAorICAgIGludAkJCS8qIHR5cGVfbmR4ICovLAorICAgIGludAkJCS8qIG1hcF9jb3VudCAqLywKKyAgICBCb29sCQkvKiB3YW50X3ByZXNlcnZlICovLAorICAgIGludAkJCS8qIG5ld19udW1fbHZscyAqLworKTsKKworZXh0ZXJuCXZvaWQJWGtiRnJlZUtleWJvYXJkKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCUJvb2wJCQkvKiBmcmVlRGVzYyAqLworKTsKKworZXh0ZXJuICB2b2lkIFhrYlNldEFjdGlvbktleU1vZHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCVhrYkFjdGlvbiAqCQkvKiBhY3QgKi8sCisJdW5zaWduZWQgaW50IAkJLyogbW9kcyAqLworKTsKKworZXh0ZXJuIEJvb2wgWGtiQ2hlY2tBY3Rpb25WTW9kcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJWGtiQWN0aW9uICoJCS8qIGFjdCAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBjaGFuZ2VkICovCispOworCitleHRlcm4gQm9vbCBYa2JBcHBseVZNb2RDaGFuZ2VzKAorICAgIFhrYlNydkluZm9QdHIJLyogeGtiaSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogY2hhbmdlZCAqLywKKyAgICBYa2JDaGFuZ2VzUHRyCS8qIHBDaGFuZ2VzICovLAorICAgIHVuc2lnbmVkIGludCAqCS8qIG5lZWRDaGVja3NSdHJuICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkFwcGx5Vk1vZENoYW5nZXNUb0FsbERldmljZXMoCisgICAgRGV2aWNlSW50UHRyCS8qIGRldiAqLywKKyAgICBYa2JEZXNjUHRyIAkJLyogeGtiICovLAorICAgIHVuc2lnbmVkIGludCAJLyogY2hhbmdlZCAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCS8qIGNhdXNlICovCispOworCitleHRlcm4JdW5zaWduZWQgaW50IFhrYk1hc2tGb3JWTWFzaygKKyAgICBYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHZtYXNrICovCispOworCitleHRlcm4gQm9vbCBYa2JWaXJ0dWFsTW9kc1RvUmVhbCgKKwlYa2JEZXNjUHRyCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJLyogdmlydHVhX21hc2sgKi8sCisJdW5zaWduZWQgaW50ICoJLyogbWFza19ydHJuICovCispOworCitleHRlcm4JdW5zaWduZWQgaW50CVhrYkFkanVzdEdyb3VwKAorICAgIGludAkJCS8qIGdyb3VwICovLAorICAgIFhrYkNvbnRyb2xzUHRyCS8qIGN0cmxzICovCispOworCitleHRlcm4gS2V5U3ltICpYa2JSZXNpemVLZXlTeW1zKAorICAgIFhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKyAgICBpbnQgCQkvKiBrZXkgKi8sCisgICAgaW50IAkJLyogbmVlZGVkICovCispOworCitleHRlcm4gWGtiQWN0aW9uICpYa2JSZXNpemVLZXlBY3Rpb25zKAorICAgIFhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKyAgICBpbnQgCQkvKiBrZXkgKi8sCisgICAgaW50IAkJLyogbmVlZGVkICovCispOworCitleHRlcm4gdm9pZCBYa2JVcGRhdGVLZXlUeXBlc0Zyb21Db3JlKAorICAgIERldmljZUludFB0cgkvKiBwWERldiAqLywKKyAgICBLZXlDb2RlIAkJLyogZmlyc3QgKi8sCisgICAgQ0FSRDggCQkvKiBudW0gKi8sCisgICAgWGtiQ2hhbmdlc1B0cgkvKiBwQ2hhbmdlcyAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiVXBkYXRlRGVzY0FjdGlvbnMoCQorICAgIFhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKyAgICBLZXlDb2RlCQkvKiBmaXJzdCAqLywKKyAgICBDQVJEOAkJLyogbnVtICovLAorICAgIFhrYkNoYW5nZXNQdHIJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiVXBkYXRlQWN0aW9ucygKKyAgICBEZXZpY2VJbnRQdHIJLyogcFhEZXYgKi8sCisgICAgS2V5Q29kZSAJCS8qIGZpcnN0ICovLAorICAgIENBUkQ4IAkJLyogbnVtICovLAorICAgIFhrYkNoYW5nZXNQdHIgIAkvKiBwQ2hhbmdlcyAqLywKKyAgICB1bnNpZ25lZCBpbnQgKgkvKiBuZWVkQ2hlY2tzUnRybiAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCS8qIGNhdXNlICovCispOworCitleHRlcm4gdm9pZCBYa2JVcGRhdGVDb3JlRGVzY3JpcHRpb24oCisgICAgRGV2aWNlSW50UHRyCS8qIGtleWJkICovLAorICAgIEJvb2wJCS8qIHJlc2l6ZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiQXBwbHlNYXBwaW5nQ2hhbmdlKAorICAgIERldmljZUludFB0cgkvKiBwWERldiAqLywKKyAgICBDQVJEOCAJCS8qIHJlcXVlc3QgKi8sCisgICAgS2V5Q29kZSAJCS8qIGZpcnN0S2V5ICovLAorICAgIENBUkQ4IAkJLyogbnVtICovLAorICAgIENsaWVudFB0cgkJLyogY2xpZW50ICovCispOworCitleHRlcm4gdm9pZCBYa2JTZXRJbmRpY2F0b3JzKAorICAgIERldmljZUludFB0cgkJLyogcFhEZXYgKi8sCisgICAgQ0FSRDMyCQkJLyogYWZmZWN0ICovLAorICAgIENBUkQzMgkJCS8qIHZhbHVlcyAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCQkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiVXBkYXRlSW5kaWNhdG9ycygKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGtleWJkICovLAorICAgIENBUkQzMgkJIAkvKiBjaGFuZ2VkICovLAorICAgIEJvb2wJCQkvKiBjaGVja19lZGV2cyAqLywKKyAgICBYa2JDaGFuZ2VzUHRyCQkvKiBwQ2hhbmdlcyAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCQkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuIFhrYlNydkxlZEluZm9QdHIgWGtiQWxsb2NTcnZMZWRJbmZvKAorICAgIERldmljZUludFB0cgkJLyogZGV2ICovLAorICAgIEtiZEZlZWRiYWNrUHRyCQkvKiBrZiAqLywKKyAgICBMZWRGZWVkYmFja1B0cgkJLyogbGYgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBuZWVkZWRfcGFydHMgKi8KKyk7CisKK2V4dGVybiBYa2JTcnZMZWRJbmZvUHRyIFhrYkZpbmRTcnZMZWRJbmZvKAorICAgIERldmljZUludFB0cgkJLyogZGV2ICovLAorICAgIHVuc2lnbmVkIGludAkJLyogY2xhc3MgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBpZCAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIG5lZWRlZF9wYXJ0cyAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiQXBwbHlMZWROYW1lQ2hhbmdlcygKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKyAgICBYa2JTcnZMZWRJbmZvUHRyCQkvKiBzbGkgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBjaGFuZ2VkX25hbWVzICovLAorICAgIHhrYkV4dGVuc2lvbkRldmljZU5vdGlmeSAqCS8qIGVkICovLAorICAgIFhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkFwcGx5TGVkTWFwQ2hhbmdlcygKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKyAgICBYa2JTcnZMZWRJbmZvUHRyCQkvKiBzbGkgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBjaGFuZ2VkX21hcHMgKi8sCisgICAgeGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5ICoJLyogZWQgKi8sCisgICAgWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCQkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiQXBwbHlMZWRTdGF0ZUNoYW5nZXMoCisgICAgRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisgICAgWGtiU3J2TGVkSW5mb1B0cgkJLyogc2xpICovLAorICAgIHVuc2lnbmVkIGludAkJLyogY2hhbmdlZF9sZWRzICovLAorICAgIHhrYkV4dGVuc2lvbkRldmljZU5vdGlmeSAqCS8qIGVkICovLAorICAgIFhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlVwZGF0ZUxlZEF1dG9TdGF0ZSgKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKyAgICBYa2JTcnZMZWRJbmZvUHRyCQkvKiBzbGkgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBtYXBzX3RvX2NoZWNrICovLAorICAgIHhrYkV4dGVuc2lvbkRldmljZU5vdGlmeSAqCS8qIGVkICovLAorICAgIFhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkZsdXNoTGVkRXZlbnRzKAkKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGtiZCAqLywKKyAgICBYa2JTcnZMZWRJbmZvUHRyCQkvKiBzbGkgKi8sCisgICAgeGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5ICoJLyogZWQgKi8sCisgICAgWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCQkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiVXBkYXRlQWxsRGV2aWNlSW5kaWNhdG9ycygKKyAgICBYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJCS8qIGNhdXNlICovCispOworCitleHRlcm4gdW5zaWduZWQgaW50IFhrYkluZGljYXRvcnNUb1VwZGF0ZSgKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKyAgICB1bnNpZ25lZCBsb25nCQkvKiBzdGF0ZV9jaGFuZ2VzICovLAorICAgIEJvb2wJCQkvKiBlbmFibGVkX2N0cmxfY2hhbmdlcyAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiQ29tcHV0ZURlcml2ZWRTdGF0ZSgKKyAgICBYa2JTcnZJbmZvUHRyCQkvKiB4a2JpICovCispOworCitleHRlcm4gdm9pZCBYa2JDaGVja1NlY29uZGFyeUVmZmVjdHMoCisgICAgWGtiU3J2SW5mb1B0cgkJLyogeGtiaSAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorICAgIFhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkNoZWNrSW5kaWNhdG9yTWFwcygKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKyAgICBYa2JTcnZMZWRJbmZvUHRyCQkvKiBzbGkgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLworKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBYa2JTdGF0ZUNoYW5nZWRGbGFncygKKyAgICBYa2JTdGF0ZVB0cgkJCS8qIG9sZCAqLywKKyAgICBYa2JTdGF0ZVB0cgkJCS8qIG5ldyAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiU2VuZFN0YXRlTm90aWZ5KAorICAgICAgIERldmljZUludFB0cgkvKiBrYmQgKi8sCisgICAgICAgeGtiU3RhdGVOb3RpZnkgKgkvKiBwU04gKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYlNlbmRNYXBOb3RpZnkoCisgICAgICAgRGV2aWNlSW50UHRyCS8qIGtiZCAqLywKKyAgICAgICB4a2JNYXBOb3RpZnkgKgkvKiBldiAqLworKTsKKworZXh0ZXJuCWludCAgWGtiQ29tcHV0ZUNvbnRyb2xzTm90aWZ5KAorCURldmljZUludFB0cgkJLyoga2JkICovLAorCVhrYkNvbnRyb2xzUHRyCQkvKiBvbGQgKi8sCisJWGtiQ29udHJvbHNQdHIJCS8qIG5ldyAqLywKKwl4a2JDb250cm9sc05vdGlmeSAqCS8qIHBDTiAqLywKKwlCb29sCQkJLyogZm9yY2VDdHJsUHJvYyAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiU2VuZENvbnRyb2xzTm90aWZ5KAorICAgICAgIERldmljZUludFB0cgkJLyoga2JkICovLAorICAgICAgIHhrYkNvbnRyb2xzTm90aWZ5ICoJLyogZXYgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYlNlbmRDb21wYXRNYXBOb3RpZnkoCisJRGV2aWNlSW50UHRyCQkvKiBrYmQgKi8sCisJeGtiQ29tcGF0TWFwTm90aWZ5ICoJLyogZXYgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYlNlbmRJbmRpY2F0b3JOb3RpZnkoCisgICAgICAgRGV2aWNlSW50UHRyCQkvKiBrYmQgKi8sCisgICAgICAgaW50CQkJLyogeGtiVHlwZSAqLywKKyAgICAgICB4a2JJbmRpY2F0b3JOb3RpZnkgKgkvKiBldiAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiSGFuZGxlQmVsbCgKKyAgICAgICBCT09MCQkvKiBmb3JjZSAqLywKKyAgICAgICBCT09MCQkvKiBldmVudE9ubHkgKi8sCisgICAgICAgRGV2aWNlSW50UHRyCS8qIGtiZCAqLywKKyAgICAgICBDQVJEOAkJLyogcGVyY2VudCAqLywKKyAgICAgICBwb2ludGVyIAkJLyogY3RybCAqLywKKyAgICAgICBDQVJEOAkJLyogY2xhc3MgKi8sCisgICAgICAgQXRvbQkJLyogbmFtZSAqLywKKyAgICAgICBXaW5kb3dQdHIJLyogcFdpbiAqLywKKyAgICAgICBDbGllbnRQdHIJLyogcENsaWVudCAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiU2VuZEFjY2Vzc1hOb3RpZnkoCisgICAgICAgRGV2aWNlSW50UHRyCQkvKiBrYmQgKi8sCisgICAgICAgeGtiQWNjZXNzWE5vdGlmeSAqCS8qIHBFdiAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiU2VuZE5hbWVzTm90aWZ5KAorICAgICAgIERldmljZUludFB0cgkvKiBrYmQgKi8sCisgICAgICAgeGtiTmFtZXNOb3RpZnkgKgkvKiBldiAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiU2VuZENvbXBhdE5vdGlmeSgKKyAgICAgICBEZXZpY2VJbnRQdHIJCS8qIGtiZCAqLywKKyAgICAgICB4a2JDb21wYXRNYXBOb3RpZnkgKgkvKiBldiAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiU2VuZEFjdGlvbk1lc3NhZ2UoCisgICAgICAgRGV2aWNlSW50UHRyCQkvKiBrYmQgKi8sCisgICAgICAgeGtiQWN0aW9uTWVzc2FnZSAqCS8qIGV2ICovCispOworCitleHRlcm4Jdm9pZCBYa2JTZW5kRXh0ZW5zaW9uRGV2aWNlTm90aWZ5KAorICAgICAgIERldmljZUludFB0cgkJCS8qIGtiZCAqLywKKyAgICAgICBDbGllbnRQdHIJCQkvKiBjbGllbnQgKi8sCisgICAgICAgeGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5ICoJLyogZXYgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlNlbmROb3RpZmljYXRpb24oCisgICAgRGV2aWNlSW50UHRyCQkvKiBrYmQgKi8sCisgICAgWGtiQ2hhbmdlc1B0cgkJLyogcENoYW5nZXMgKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlByb2Nlc3NLZXlib2FyZEV2ZW50KAorICAgIHN0cnVjdCBfeEV2ZW50ICogCQkvKiB4RSAqLywKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGtleWJkICovLAorICAgIGludCAJCQkvKiBjb3VudCAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiUHJvY2Vzc090aGVyRXZlbnQoCisgICAgc3RydWN0IF94RXZlbnQgKiAJCS8qIHhFICovLAorICAgIERldmljZUludFB0cgkJLyoga2V5YmQgKi8sCisgICAgaW50IAkJCS8qIGNvdW50ICovCispOworCitleHRlcm4gdm9pZCBYa2JIYW5kbGVBY3Rpb25zKAorICAgIERldmljZUludFB0cgkJLyogZGV2ICovLAorICAgIERldmljZUludFB0cgkJLyoga2JkICovLAorICAgIHN0cnVjdCBfeEV2ZW50ICogCQkvKiB4RSAqLywKKyAgICBpbnQgCQkJLyogY291bnQgKi8KKyk7CisKK2V4dGVybiBCb29sIFhrYkVuYWJsZURpc2FibGVDb250cm9scygKKyAgICBYa2JTcnZJbmZvUHRyCS8qIHhrYmkgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBjaGFuZ2UgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBuZXdWYWx1ZXMgKi8sCisgICAgWGtiQ2hhbmdlc1B0cgkvKiBjaGFuZ2VzICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybiB2b2lkIEFjY2Vzc1hJbml0KAorICAgIERldmljZUludFB0ciAgICAgICAgLyogZGV2ICovCispOworCitleHRlcm4gQm9vbCBBY2Nlc3NYRmlsdGVyUHJlc3NFdmVudCgKKyAgICByZWdpc3RlciBzdHJ1Y3QgX3hFdmVudCAqCS8qIHhFICovLAorICAgIHJlZ2lzdGVyIERldmljZUludFB0cgkvKiBrZXliZCAqLywKKyAgICBpbnQJCQkJLyogY291bnQgKi8KKyk7CisKK2V4dGVybiBCb29sIEFjY2Vzc1hGaWx0ZXJSZWxlYXNlRXZlbnQoCisgICAgcmVnaXN0ZXIgc3RydWN0IF94RXZlbnQgKgkvKiB4RSAqLywKKyAgICByZWdpc3RlciBEZXZpY2VJbnRQdHIJLyoga2V5YmQgKi8sCisgICAgaW50CQkJCS8qIGNvdW50ICovCispOworCitleHRlcm4gdm9pZCBBY2Nlc3NYQ2FuY2VsUmVwZWF0S2V5KAorICAgIFhrYlNydkluZm9QdHIJLyogeGtiaSAqLywKKyAgICBLZXlDb2RlCQkvKiBrZXkgKi8KKyk7CisKK2V4dGVybiB2b2lkIEFjY2Vzc1hDb21wdXRlQ3VydmVGYWN0b3IoCisgICAgWGtiU3J2SW5mb1B0cgkvKiB4a2JpICovLAorICAgIFhrYkNvbnRyb2xzUHRyCS8qIGN0cmxzICovCispOworCitleHRlcm4JWGtiRGV2aWNlTGVkSW5mb1B0cglYa2JBZGREZXZpY2VMZWRJbmZvKAorCVhrYkRldmljZUluZm9QdHIJLyogZGV2aSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZENsYXNzICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkSWQgKi8KKyk7CisKK2V4dGVybglYa2JEZXZpY2VJbmZvUHRyCVhrYkFsbG9jRGV2aWNlSW5mbygKKwl1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBuQnV0dG9ucyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHN6TGVkcyAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiRnJlZURldmljZUluZm8oCisJWGtiRGV2aWNlSW5mb1B0cgkvKiBkZXZpICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJQm9vbAkJCS8qIGZyZWVEZXZJICovCispOworCitleHRlcm4gU3RhdHVzIFhrYlJlc2l6ZURldmljZUJ1dHRvbkFjdGlvbnMoCisJWGtiRGV2aWNlSW5mb1B0ciAgICAgICAgLyogZGV2aSAqLywKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAvKiBuZXdUb3RhbCAqLworKTsKKworZXh0ZXJuCVhrYkludGVyZXN0UHRyIFhrYkZpbmRDbGllbnRSZXNvdXJjZSgKKyAgICAgICBEZXZpY2VQdHIJLyogaW5EZXYgKi8sCisgICAgICAgQ2xpZW50UHRyCS8qIGNsaWVudCAqLworKTsKKworZXh0ZXJuCVhrYkludGVyZXN0UHRyIFhrYkFkZENsaWVudFJlc291cmNlKAorICAgICAgIERldmljZVB0cgkvKiBpbkRldiAqLywKKyAgICAgICBDbGllbnRQdHIJLyogY2xpZW50ICovLAorICAgICAgIFhJRAkJLyogaWQgKi8KKyk7CisKK2V4dGVybglpbnQgWGtiUmVtb3ZlQ2xpZW50KAorICAgICAgIERldmljZVB0cgkvKiBpbkRldiAqLywKKyAgICAgICBDbGllbnRQdHIJLyogY2xpZW50ICovCispOworCitleHRlcm4JaW50IFhrYlJlbW92ZVJlc291cmNlQ2xpZW50KAorICAgICAgIERldmljZVB0cgkvKiBpbkRldiAqLywKKyAgICAgICBYSUQJCS8qIGlkICovCispOworCitleHRlcm4gaW50IFhrYkREWEluaXREZXZpY2UoCisgICAgRGV2aWNlSW50UHRyICAgICAgICAvKiBkZXYgKi8KKyk7CisKK2V4dGVybglpbnQgWGtiRERYQWNjZXNzWEJlZXAoCisgICAgRGV2aWNlSW50UHRyICAgICAgICAvKiBkZXYgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdoYXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdoaWNoICovCispOworCitleHRlcm4Jdm9pZCBYa2JERFhLZXlDbGljaygKKyAgICBEZXZpY2VJbnRQdHIJLyogZGV2ICovLAorICAgIGludAkJCS8qIGtleWNvZGUgKi8sCisgICAgaW50CQkJLyogc3ludGhldGljICovCispOworCitleHRlcm4gCWludCBYa2JERFhVc2VzU29mdFJlcGVhdCgKKyAgICBEZXZpY2VJbnRQdHIJLyogZGV2ICovCispOworCitleHRlcm4Jdm9pZCBYa2JERFhLZXliZEN0cmxQcm9jKAorCURldmljZUludFB0cgkvKiBkZXYgKi8sCisJS2V5YmRDdHJsICoJLyogY3RybCAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiRERYQ2hhbmdlQ29udHJvbHMoCisJRGV2aWNlSW50UHRyCS8qIGRldiAqLywKKwlYa2JDb250cm9sc1B0ciAJLyogb2xkICovLAorCVhrYkNvbnRyb2xzUHRyIAkvKiBuZXcgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkREWFVwZGF0ZUluZGljYXRvcnMoCisJRGV2aWNlSW50UHRyCS8qIGtleWJkICovLAorCUNBUkQzMgkJLyogbmV3U3RhdGUgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkREWFVwZGF0ZURldmljZUluZGljYXRvcnMoCisJRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisJWGtiU3J2TGVkSW5mb1B0cgkvKiBzbGkgKi8sCisJQ0FSRDMyCQkJLyogbmV3U3RhdGUgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkREWEZha2VQb2ludGVyQnV0dG9uKAorCWludCAJCS8qIGV2ZW50ICovLAorCWludAkJLyogYnV0dG9uICovCispOworCitleHRlcm4gdm9pZCBYa2JERFhGYWtlUG9pbnRlck1vdGlvbigKKyAJdW5zaWduZWQgaW50CS8qIGZsYWdzICovLAorCWludAkJLyogeCAqLywKKwlpbnQJCS8qIHkgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkREWEZha2VEZXZpY2VCdXR0b24oCisJRGV2aWNlSW50UHRyCS8qIGRldiAqLywKKwlCb29sCQkvKiBwcmVzcyAqLywKKwlpbnQJCS8qIGJ1dHRvbiAqLworKTsKKworZXh0ZXJuIGludCBYa2JERFhUZXJtaW5hdGVTZXJ2ZXIoCisJRGV2aWNlSW50UHRyCS8qIGRldiAqLywKKwlLZXlDb2RlCQkvKiBrZXkgKi8sCisJWGtiQWN0aW9uICoJLyogYWN0ICovCispOworCitleHRlcm4gaW50IFhrYkREWFN3aXRjaFNjcmVlbigKKwlEZXZpY2VJbnRQdHIJLyogZGV2ICovLAorCUtleUNvZGUJCS8qIGtleSAqLywKKwlYa2JBY3Rpb24gKgkvKiBhY3QgKi8KKyk7CisKK2V4dGVybiBpbnQgWGtiRERYUHJpdmF0ZSgKKwlEZXZpY2VJbnRQdHIJLyogZGV2ICovLAorCUtleUNvZGUJCS8qIGtleSAqLywKKwlYa2JBY3Rpb24gKgkvKiBhY3QgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkRpc2FibGVDb21wdXRlZEF1dG9SZXBlYXRzKAorCURldmljZUludFB0ciAJLyogcFhEZXYgKi8sCisJdW5zaWduZWQgaW50CS8qIGtleSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiU2V0UmVwZWF0S2V5cygKKwlEZXZpY2VJbnRQdHIgCS8qIHBYRGV2ICovLAorCWludAkJLyoga2V5ICovLAorCWludAkgCS8qIG9ub2ZmICovCispOworCitleHRlcm4JaW50IFhrYkxhdGNoTW9kaWZpZXJzKAorCURldmljZUludFB0ciAJLyogcFhEZXYgKi8sCisJQ0FSRDggCQkvKiBtYXNrICovLAorCUNBUkQ4IAkJLyogbGF0Y2hlcyAqLworKTsKKworZXh0ZXJuCWludCBYa2JMYXRjaEdyb3VwKAorCURldmljZUludFB0ciAgCS8qIHBYRGV2ICovLAorCWludAkgIAkvKiBncm91cCAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiQ2xlYXJBbGxMYXRjaGVzQW5kTG9ja3MoCisJRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisJWGtiU3J2SW5mb1B0cgkJLyogeGtiaSAqLywKKwlCb29sCQkJLyogZ2VuRXYgKi8sCisJWGtiRXZlbnRDYXVzZVB0cgkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuCXZvaWQJWGtiU2V0UnVsZXNEZmx0cygKKwljaGFyICoJCQkvKiBydWxlc0ZpbGUgKi8sCisJY2hhciAqCQkJLyogbW9kZWwgKi8sCisJY2hhciAqCQkJLyogbGF5b3V0ICovLAorCWNoYXIgKgkJCS8qIHZhcmlhbnQgKi8sCisJY2hhciAqCQkJLyogb3B0aW9ucyAqLworKTsKKworZXh0ZXJuCXZvaWQJWGtiSW5pdERldmljZSgKKwlEZXZpY2VJbnRQdHIgCS8qIHBYRGV2ICovCispOworCitleHRlcm4JQm9vbAlYa2JJbml0S2V5Ym9hcmREZXZpY2VTdHJ1Y3QoCisJRGV2aWNlSW50UHRyIAkJLyogcFhEZXYgKi8sCisJWGtiQ29tcG9uZW50TmFtZXNQdHIJLyogcE5hbWVzICovLAorCUtleVN5bXNQdHIJCS8qIHBTeW1zICovLAorCUNBUkQ4IAkJCS8qIHBNb2RzICovW10sCisJQmVsbFByb2NQdHIJCS8qIGJlbGxQcm9jICovLAorCUtiZEN0cmxQcm9jUHRyCQkvKiBjdHJsUHJvYyAqLworKTsKKworZXh0ZXJuCWludCBTUHJvY1hrYkRpc3BhdGNoKAorCUNsaWVudFB0cgkJLyogY2xpZW50ICovCispOworCitleHRlcm4gWGtiR2VvbWV0cnlQdHIgWGtiTG9va3VwTmFtZWRHZW9tZXRyeSgKKwlEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKwlBdG9tCQkJLyogbmFtZSAqLywKKwlCb29sICoJCQkvKiBzaG91bGRGcmVlICovCispOworCitleHRlcm4gY2hhciAqCV9Ya2JEdXBTdHJpbmcoCisJY2hhciAqCQkJLyogc3RyICovCispOworCitleHRlcm4gdm9pZAlYa2JDb252ZXJ0Q2FzZSgKKwlLZXlTeW0gCQkJLyogc3ltICovLAorCUtleVN5bSAqCQkvKiBsb3dlciAqLywKKwlLZXlTeW0gKgkJLyogdXBwZXIgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJIFhrYkNoYW5nZUtleWNvZGVSYW5nZSgJCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCWludCAJCQkvKiBtaW5LQyAqLywKKwlpbnQgCQkJLyogbWF4S0MgKi8sCisJWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuIGludCBYa2JGaW5pc2hEZXZpY2VJbml0KAorCURldmljZUludFB0cgkJLyogcFhEZXYgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkZyZWVTcnZMZWRJbmZvKAorCVhrYlNydkxlZEluZm9QdHIJLyogc2xpICovCispOworCitleHRlcm4gdm9pZCBYa2JGcmVlSW5mbygKKwlYa2JTcnZJbmZvUHRyCQkvKiB4a2JpICovCispOworCitleHRlcm4gU3RhdHVzIFhrYkNoYW5nZVR5cGVzT2ZLZXkoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCWludAkJCS8qIGtleSAqLywKKwlpbnQJCQkvKiBuR3JvdXBzICovLAorCXVuc2lnbmVkIGludAkJLyogZ3JvdXBzICovLAorCWludCAqCQkJLyogbmV3VHlwZXNJbiAqLywKKwlYa2JNYXBDaGFuZ2VzUHRyCS8qIGNoYW5nZXMgKi8KKyk7CisKK2V4dGVybiBYa2JLZXlUeXBlUHRyIFhrYkFkZEtleVR5cGUoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCUF0b20JCQkvKiBuYW1lICovLAorCWludAkJCS8qIG1hcF9jb3VudCAqLywKKwlCb29sCQkJLyogd2FudF9wcmVzZXJ2ZSAqLywKKwlpbnQJCQkvKiBudW1fbHZscyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYa2JJbml0Q2Fub25pY2FsS2V5VHlwZXMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJaW50CQkJLyoga2V5cGFkVk1vZCAqLworKTsKKworZXh0ZXJuIGludCBYa2JLZXlUeXBlc0ZvckNvcmVTeW1ib2xzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlpbnQJCQkvKiBtYXBfd2lkdGggKi8sCisJS2V5U3ltICoJCS8qIGNvcmVfc3ltcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHByb3RlY3RlZCAqLywKKwlpbnQgKgkJCS8qIHR5cGVzX2lub3V0ICovLAorCUtleVN5bSAqCQkvKiB4a2Jfc3ltc19ydHJuICovCispOworCitleHRlcm4gQm9vbCBYa2JBcHBseUNvbXBhdE1hcFRvS2V5KAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlLZXlDb2RlCQkJLyoga2V5ICovLAorCVhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8KKyk7CisKK2V4dGVybiBCb29sIFhrYlVwZGF0ZU1hcEZyb21Db3JlKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlLZXlDb2RlCQkJLyogZmlyc3Rfa2V5ICovLAorCWludAkJCS8qIG51bV9rZXlzICovLAorCWludAkJCS8qIG1hcF93aWR0aCAqLywKKwlLZXlTeW0gKgkJLyogY29yZV9rZXlzeW1zICovLAorCVhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkZyZWVDb250cm9scygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlCb29sCQkJLyogZnJlZU1hcCAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiRnJlZUluZGljYXRvck1hcHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovCispOworCitleHRlcm4gQm9vbCBYa2JBcHBseVZpcnR1YWxNb2RDaGFuZ2VzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGNoYW5nZWQgKi8sCisJWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuIEJvb2wgWGtiVXBkYXRlQWN0aW9uVmlydHVhbE1vZHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCVhrYkFjdGlvbiAqCQkvKiBhY3QgKi8sCisJdW5zaWduZWQgaW50CQkvKiBjaGFuZ2VkICovCispOworCitleHRlcm4gdm9pZCBYa2JVcGRhdGVLZXlUeXBlVmlydHVhbE1vZHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCVhrYktleVR5cGVQdHIJCS8qIHR5cGUgKi8sCisJdW5zaWduZWQgaW50CQkvKiBjaGFuZ2VkICovLAorCVhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlNlbmROZXdLZXlib2FyZE5vdGlmeSgKKwlEZXZpY2VJbnRQdHIJCS8qIGtiZCAqLywKKwl4a2JOZXdLZXlib2FyZE5vdGlmeSAqCS8qIHBOS04gKi8KKyk7CisKKyNpZmRlZiBYS0JTUlZfTkVFRF9GSUxFX0ZVTkNTCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YS01mb3JtYXQuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YS0JmaWxlLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWEtCcnVsZXMuaD4KKworI2RlZmluZQlfWGtiTGlzdEtleW1hcHMJCTAKKyNkZWZpbmUJX1hrYkxpc3RLZXljb2RlcwkxCisjZGVmaW5lCV9Ya2JMaXN0VHlwZXMJCTIKKyNkZWZpbmUJX1hrYkxpc3RDb21wYXQJCTMKKyNkZWZpbmUJX1hrYkxpc3RTeW1ib2xzCQk0CisjZGVmaW5lCV9Ya2JMaXN0R2VvbWV0cnkJNQorI2RlZmluZQlfWGtiTGlzdE51bUNvbXBvbmVudHMJNgorCit0eXBlZGVmIHN0cnVjdCBfWGtiU3J2TGlzdEluZm8geworCWludAkJc3pQb29sOworCWludAkJblBvb2w7CisJY2hhciAqCQlwb29sOworCisJaW50CQltYXhSdHJuOworCWludAkJblRvdGFsOworCisJY2hhciAqCQlwYXR0ZXJuW19Ya2JMaXN0TnVtQ29tcG9uZW50c107CisJaW50CQluRm91bmRbX1hrYkxpc3ROdW1Db21wb25lbnRzXTsKK30gWGtiU3J2TGlzdEluZm9SZWMsKlhrYlNydkxpc3RJbmZvUHRyOworCitjaGFyICoKK1hrYkdldFJ1bGVzRGZsdHMoCisJWGtiUkZfVmFyRGVmc1B0cgkvKiBkZWZzICovCispOworCitleHRlcm4gdm9pZAlYa2JTZXRSdWxlc1VzZWQoCisJWGtiUkZfVmFyRGVmc1B0cgkvKiBkZWZzICovCispOworCisKK2V4dGVybglTdGF0dXMJWGtiRERYTGlzdCgKKwlEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKwlYa2JTcnZMaXN0SW5mb1B0cgkvKiBsaXN0aW5nICovLAorCUNsaWVudFB0cgkJLyogY2xpZW50ICovCispOworCitleHRlcm4JdW5zaWduZWQgaW50IFhrYkREWExvYWRLZXltYXBCeU5hbWVzKAorCURldmljZUludFB0cgkJLyoga2V5YmQgKi8sCisJWGtiQ29tcG9uZW50TmFtZXNQdHIJLyogbmFtZXMgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3YW50ICovLAorCXVuc2lnbmVkIGludAkJLyogbmVlZCAqLywKKwlYa2JGaWxlSW5mb1B0cgkJLyogZmluZm9SdHJuICovLAorCWNoYXIgKgkJCS8qIGtleW1hcE5hbWVSdHJuICovLAorCWludCAJCQkvKiBrZXltYXBOYW1lUnRybkxlbiAqLworKTsKKworZXh0ZXJuCUJvb2wgWGtiRERYTmFtZXNGcm9tUnVsZXMoCisJRGV2aWNlSW50UHRyCQkvKiBrZXliZCAqLywKKwljaGFyICoJCQkvKiBydWxlcyAqLywKKwlYa2JSRl9WYXJEZWZzUHRyCS8qIGRlZnMgKi8sCisJWGtiQ29tcG9uZW50TmFtZXNQdHIJLyogbmFtZXMgKi8KKyk7CisKK2V4dGVybglGSUxFICpYa2JERFhPcGVuQ29uZmlnRmlsZSgKKwljaGFyICoJLyogbWFwTmFtZSAqLywKKwljaGFyICoJLyogZmlsZU5hbWVSdHJuICovLAorCWludAkvKiBmaWxlTmFtZVJ0cm5MZW4gKi8KKyk7CisKK2V4dGVybglCb29sIFhrYkREWEFwcGx5Q29uZmlnKAorCVhQb2ludGVyCS8qIGNmZ19pbiAqLywKKwlYa2JTcnZJbmZvUHRyCS8qIHhrYmkgKi8KKyk7CisKK2V4dGVybiBYUG9pbnRlciBYa2JERFhQcmVsb2FkQ29uZmlnKAorCWNoYXIgKioJCQkvKiBydWxlc0ZpbGVSdHJuICovLAorCVhrYlJGX1ZhckRlZnNQdHIJLyogZGVmcyAqLywKKwlYa2JDb21wb25lbnROYW1lc1B0cgkvKiBuYW1lcyAqLywKKwlEZXZpY2VJbnRQdHIJCS8qIGRldiAqLworKTsKKworZXh0ZXJuCWludCBfWGtiU3RyQ2FzZUNtcCgKKwljaGFyICoJCQkvKiBzdHIxICovLAorCWNoYXIgKgkJCS8qIHN0cjIgKi8KKyk7CisKKyNlbmRpZiAvKiBYS0JTUlZfTkVFRF9GSUxFX0ZVTkNTICovCisKKworX1hGVU5DUFJPVE9FTkQKKworI2RlZmluZQlYa2JBdG9tR2V0U3RyaW5nKGQscykJTmFtZUZvckF0b20ocykKKworI2VuZGlmIC8qIF9YS0JTUlZfSF8gKi8KKworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hLQnN0ci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0JzdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzYzZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0JzdHIuaApAQCAtMCwwICsxLDYxNCBAQAorLyogJFhvcmc6IFhLQnN0ci5oLHYgMS4zIDIwMDAvMDgvMTggMDQ6MDU6NDUgY29za3JleSBFeHAgJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAxOTkzIGJ5IFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU2lsaWNvbiBHcmFwaGljcyBub3QgYmUgCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiAKK29mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1NpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IAorb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKK3dpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworU0lMSUNPTiBHUkFQSElDUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyAKK1NPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgCitBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIElOIE5PIEVWRU5UIFNIQUxMIFNJTElDT04KK0dSQVBISUNTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgCitEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIAorREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSAKK09SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiAgV0lUSAorVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfWEtCU1RSX0hfCisjZGVmaW5lCV9YS0JTVFJfSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hLQi5oPgorCisjZGVmaW5lCVhrYkNoYXJUb0ludCh2KQkJKCh2KSYweDgwPyhpbnQpKCh2KXwofjB4ZmYpKTooaW50KSgodikmMHg3ZikpCisjZGVmaW5lCVhrYkludFRvMkNoYXJzKGksaCxsKQkoKChoKT0oKGk+PjgpJjB4ZmYpKSwoKGwpPSgoaSkmMHhmZikpKQorCisjaWYgZGVmaW5lZChXT1JENjQpICYmIGRlZmluZWQoVU5TSUdORURCSVRGSUVMRFMpCisjZGVmaW5lCVhrYjJDaGFyc1RvSW50KGgsbCkJKChoKSYweDgwPyhpbnQpKCgoaCk8PDgpfChsKXwofjB4ZmZmZikpOlwKKwkJCQkJICAoaW50KSgoKGgpPDw4KXwobCkmMHg3ZmZmKSkKKyNlbHNlCisjZGVmaW5lCVhrYjJDaGFyc1RvSW50KGgsbCkJKChzaG9ydCkoKChoKTw8OCl8KGwpKSkKKyNlbmRpZgorCisJLyoKKwkgKiBDb21tb24gZGF0YSBzdHJ1Y3R1cmVzIGFuZCBhY2Nlc3MgbWFjcm9zCisJICovCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTdGF0ZVJlYyB7CisJdW5zaWduZWQgY2hhcglncm91cDsKKwl1bnNpZ25lZCBjaGFyICAgbG9ja2VkX2dyb3VwOworCXVuc2lnbmVkIHNob3J0CWJhc2VfZ3JvdXA7CisJdW5zaWduZWQgc2hvcnQJbGF0Y2hlZF9ncm91cDsKKwl1bnNpZ25lZCBjaGFyCW1vZHM7CisJdW5zaWduZWQgY2hhcgliYXNlX21vZHM7CisJdW5zaWduZWQgY2hhcglsYXRjaGVkX21vZHM7CisJdW5zaWduZWQgY2hhcglsb2NrZWRfbW9kczsKKwl1bnNpZ25lZCBjaGFyCWNvbXBhdF9zdGF0ZTsKKwl1bnNpZ25lZCBjaGFyCWdyYWJfbW9kczsKKwl1bnNpZ25lZCBjaGFyCWNvbXBhdF9ncmFiX21vZHM7CisJdW5zaWduZWQgY2hhcglsb29rdXBfbW9kczsKKwl1bnNpZ25lZCBjaGFyCWNvbXBhdF9sb29rdXBfbW9kczsKKwl1bnNpZ25lZCBzaG9ydAlwdHJfYnV0dG9uczsKK30gWGtiU3RhdGVSZWMsKlhrYlN0YXRlUHRyOworI2RlZmluZQlYa2JNb2RMb2NrcyhzKQkgKChzKS0+bG9ja2VkX21vZHMpCisjZGVmaW5lCVhrYlN0YXRlTW9kcyhzKQkgKChzKS0+YmFzZV9tb2RzfChzKS0+bGF0Y2hlZF9tb2RzfFhrYk1vZExvY2tzKHMpKQorI2RlZmluZQlYa2JHcm91cExvY2socykJICgocyktPmxvY2tlZF9ncm91cCkKKyNkZWZpbmUJWGtiU3RhdGVHcm91cChzKSAoKHMpLT5iYXNlX2dyb3VwKyhzKS0+bGF0Y2hlZF9ncm91cCtYa2JHcm91cExvY2socykpCisjZGVmaW5lCVhrYlN0YXRlRmllbGRGcm9tUmVjKHMpCVhrYkJ1aWxkQ29yZVN0YXRlKChzKS0+bG9va3VwX21vZHMsKHMpLT5ncm91cCkKKyNkZWZpbmUJWGtiR3JhYlN0YXRlRnJvbVJlYyhzKQlYa2JCdWlsZENvcmVTdGF0ZSgocyktPmdyYWJfbW9kcywocyktPmdyb3VwKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiTW9kcyB7CisJdW5zaWduZWQgY2hhcgltYXNrOwkvKiBlZmZlY3RpdmUgbW9kcyAqLworCXVuc2lnbmVkIGNoYXIJcmVhbF9tb2RzOworCXVuc2lnbmVkIHNob3J0CXZtb2RzOworfSBYa2JNb2RzUmVjLCpYa2JNb2RzUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiS1RNYXBFbnRyeSB7CisJQm9vbAkJYWN0aXZlOworCXVuc2lnbmVkIGNoYXIJbGV2ZWw7CisJWGtiTW9kc1JlYwltb2RzOworfSBYa2JLVE1hcEVudHJ5UmVjLCpYa2JLVE1hcEVudHJ5UHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiS2V5VHlwZSB7CisJWGtiTW9kc1JlYwkJbW9kczsKKwl1bnNpZ25lZCBjaGFyCSAgCW51bV9sZXZlbHM7CisJdW5zaWduZWQgY2hhcgkgIAltYXBfY291bnQ7CisJWGtiS1RNYXBFbnRyeVB0ciAgCW1hcDsKKwlYa2JNb2RzUHRyICAJCXByZXNlcnZlOworCUF0b20JCSAgCW5hbWU7CisJQXRvbSAqCQkJbGV2ZWxfbmFtZXM7Cit9IFhrYktleVR5cGVSZWMsICpYa2JLZXlUeXBlUHRyOworCisjZGVmaW5lCVhrYk51bUdyb3VwcyhnKQkJCSgoZykmMHgwZikKKyNkZWZpbmUJWGtiT3V0T2ZSYW5nZUdyb3VwSW5mbyhnKQkoKGcpJjB4ZjApCisjZGVmaW5lCVhrYk91dE9mUmFuZ2VHcm91cEFjdGlvbihnKQkoKGcpJjB4YzApCisjZGVmaW5lCVhrYk91dE9mUmFuZ2VHcm91cE51bWJlcihnKQkoKChnKSYweDMwKT4+NCkKKyNkZWZpbmUJWGtiU2V0R3JvdXBJbmZvKGcsdyxuKQkoKCh3KSYweGMwKXwoKChuKSYzKTw8NCl8KChnKSYweDBmKSkKKyNkZWZpbmUJWGtiU2V0TnVtR3JvdXBzKGcsbikJKCgoZykmMHhmMCl8KChuKSYweDBmKSkKKworCS8qCisJICogU3RydWN0dXJlcyBhbmQgYWNjZXNzIG1hY3JvcyB1c2VkIHByaW1hcmlseSBieSB0aGUgc2VydmVyCisJICovCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JCZWhhdmlvciB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJZGF0YTsKK30gWGtiQmVoYXZpb3I7CisKKyNkZWZpbmUJWGtiQW55QWN0aW9uRGF0YVNpemUgNwordHlwZWRlZglzdHJ1Y3QgX1hrYkFueUFjdGlvbiB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJZGF0YVtYa2JBbnlBY3Rpb25EYXRhU2l6ZV07Cit9IFhrYkFueUFjdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYk1vZEFjdGlvbiB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgltYXNrOworCXVuc2lnbmVkIGNoYXIJcmVhbF9tb2RzOworCXVuc2lnbmVkIGNoYXIJdm1vZHMxOworCXVuc2lnbmVkIGNoYXIJdm1vZHMyOworfSBYa2JNb2RBY3Rpb247CisjZGVmaW5lCVhrYk1vZEFjdGlvblZNb2RzKGEpICAgICAgXAorCSgoc2hvcnQpKCgoYSktPnZtb2RzMTw8OCl8KChhKS0+dm1vZHMyKSkpCisjZGVmaW5lCVhrYlNldE1vZEFjdGlvblZNb2RzKGEsdikgXAorCSgoKGEpLT52bW9kczE9KCgodik+PjgpJjB4ZmYpKSwoYSktPnZtb2RzMj0oKHYpJjB4ZmYpKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiR3JvdXBBY3Rpb24geworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCWNoYXIJCWdyb3VwX1hYWDsKK30gWGtiR3JvdXBBY3Rpb247CisjZGVmaW5lCVhrYlNBR3JvdXAoYSkJCShYa2JDaGFyVG9JbnQoKGEpLT5ncm91cF9YWFgpKQorI2RlZmluZQlYa2JTQVNldEdyb3VwKGEsZykJKChhKS0+Z3JvdXBfWFhYPShnKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYklTT0FjdGlvbiB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgltYXNrOworCXVuc2lnbmVkIGNoYXIJcmVhbF9tb2RzOworCWNoYXIJCWdyb3VwX1hYWDsKKwl1bnNpZ25lZCBjaGFyCWFmZmVjdDsKKwl1bnNpZ25lZCBjaGFyCXZtb2RzMTsKKwl1bnNpZ25lZCBjaGFyCXZtb2RzMjsKK30gWGtiSVNPQWN0aW9uOworCit0eXBlZGVmIHN0cnVjdCBfWGtiUHRyQWN0aW9uIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwl1bnNpZ25lZCBjaGFyCWhpZ2hfWFhYOworCXVuc2lnbmVkIGNoYXIJbG93X1hYWDsKKwl1bnNpZ25lZCBjaGFyCWhpZ2hfWVlZOworCXVuc2lnbmVkIGNoYXIJbG93X1lZWTsKK30gWGtiUHRyQWN0aW9uOworI2RlZmluZQlYa2JQdHJBY3Rpb25YKGEpICAgICAgKFhrYjJDaGFyc1RvSW50KChhKS0+aGlnaF9YWFgsKGEpLT5sb3dfWFhYKSkKKyNkZWZpbmUJWGtiUHRyQWN0aW9uWShhKSAgICAgIChYa2IyQ2hhcnNUb0ludCgoYSktPmhpZ2hfWVlZLChhKS0+bG93X1lZWSkpCisjZGVmaW5lCVhrYlNldFB0ckFjdGlvblgoYSx4KSAoWGtiSW50VG8yQ2hhcnMoeCwoYSktPmhpZ2hfWFhYLChhKS0+bG93X1hYWCkpCisjZGVmaW5lCVhrYlNldFB0ckFjdGlvblkoYSx5KSAoWGtiSW50VG8yQ2hhcnMoeSwoYSktPmhpZ2hfWVlZLChhKS0+bG93X1lZWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JQdHJCdG5BY3Rpb24geworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJY291bnQ7CisJdW5zaWduZWQgY2hhcglidXR0b247Cit9IFhrYlB0ckJ0bkFjdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlB0ckRmbHRBY3Rpb24geworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJYWZmZWN0OworCWNoYXIJCXZhbHVlWFhYOworfSBYa2JQdHJEZmx0QWN0aW9uOworI2RlZmluZQlYa2JTQVB0ckRmbHRWYWx1ZShhKQkJKFhrYkNoYXJUb0ludCgoYSktPnZhbHVlWFhYKSkKKyNkZWZpbmUJWGtiU0FTZXRQdHJEZmx0VmFsdWUoYSxjKQkoKGEpLT52YWx1ZVhYWD0gKChjKSYweGZmKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlN3aXRjaFNjcmVlbkFjdGlvbiB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJY2hhcgkJc2NyZWVuWFhYOworfSBYa2JTd2l0Y2hTY3JlZW5BY3Rpb247CisjZGVmaW5lCVhrYlNBU2NyZWVuKGEpCQkJKFhrYkNoYXJUb0ludCgoYSktPnNjcmVlblhYWCkpCisjZGVmaW5lCVhrYlNBU2V0U2NyZWVuKGEscykJCSgoYSktPnNjcmVlblhYWD0gKChzKSYweGZmKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkN0cmxzQWN0aW9uIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwl1bnNpZ25lZCBjaGFyCWN0cmxzMzsKKwl1bnNpZ25lZCBjaGFyCWN0cmxzMjsKKwl1bnNpZ25lZCBjaGFyCWN0cmxzMTsKKwl1bnNpZ25lZCBjaGFyCWN0cmxzMDsKK30gWGtiQ3RybHNBY3Rpb247CisjZGVmaW5lCVhrYkFjdGlvblNldEN0cmxzKGEsYykJKCgoYSktPmN0cmxzMz0oKChjKT4+MjQpJjB4ZmYpKSxcCisJCQkJCSgoYSktPmN0cmxzMj0oKChjKT4+MTYpJjB4ZmYpKSxcCisJCQkJCSgoYSktPmN0cmxzMT0oKChjKT4+OCkmMHhmZikpLFwKKwkJCQkJKChhKS0+Y3RybHMwPSgoYykmMHhmZikpKQorI2RlZmluZQlYa2JBY3Rpb25DdHJscyhhKSAoKCgodW5zaWduZWQgaW50KShhKS0+Y3RybHMzKTw8MjQpfFwKKwkJCSAgICgoKHVuc2lnbmVkIGludCkoYSktPmN0cmxzMik8PDE2KXxcCisJCQkgICAoKCh1bnNpZ25lZCBpbnQpKGEpLT5jdHJsczEpPDw4KXxcCisJCQkgICAoKHVuc2lnbmVkIGludCkoKGEpLT5jdHJsczApKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYk1lc3NhZ2VBY3Rpb24geworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJbWVzc2FnZVs2XTsKK30gWGtiTWVzc2FnZUFjdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QJX1hrYlJlZGlyZWN0S2V5QWN0aW9uIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcgluZXdfa2V5OworCXVuc2lnbmVkIGNoYXIJbW9kc19tYXNrOworCXVuc2lnbmVkIGNoYXIJbW9kczsKKwl1bnNpZ25lZCBjaGFyCXZtb2RzX21hc2swOworCXVuc2lnbmVkIGNoYXIJdm1vZHNfbWFzazE7CisJdW5zaWduZWQgY2hhcgl2bW9kczA7CisJdW5zaWduZWQgY2hhcgl2bW9kczE7Cit9IFhrYlJlZGlyZWN0S2V5QWN0aW9uOworCisjZGVmaW5lCVhrYlNBUmVkaXJlY3RWTW9kcyhhKQkJKCgoKHVuc2lnbmVkIGludCkoYSktPnZtb2RzMSk8PDgpfFwKKwkJCQkJKCh1bnNpZ25lZCBpbnQpKGEpLT52bW9kczApKQorI2RlZmluZQlYa2JTQVJlZGlyZWN0U2V0Vk1vZHMoYSxtKQkoKChhKS0+dm1vZHNfbWFzazE9KCgobSk+PjgpJjB4ZmYpKSxcCisJCQkJCSAoKGEpLT52bW9kc19tYXNrMD0oKG0pJjB4ZmYpKSkKKyNkZWZpbmUJWGtiU0FSZWRpcmVjdFZNb2RzTWFzayhhKQkoKCgodW5zaWduZWQgaW50KShhKS0+dm1vZHNfbWFzazEpPDw4KXxcCisJCQkJCSgodW5zaWduZWQgaW50KShhKS0+dm1vZHNfbWFzazApKQorI2RlZmluZQlYa2JTQVJlZGlyZWN0U2V0Vk1vZHNNYXNrKGEsbSkJKCgoYSktPnZtb2RzX21hc2sxPSgoKG0pPj44KSYweGZmKSksXAorCQkJCQkgKChhKS0+dm1vZHNfbWFzazA9KChtKSYweGZmKSkpCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JEZXZpY2VCdG5BY3Rpb24geworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJY291bnQ7CisJdW5zaWduZWQgY2hhcglidXR0b247CisJdW5zaWduZWQgY2hhcglkZXZpY2U7Cit9IFhrYkRldmljZUJ0bkFjdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkRldmljZVZhbHVhdG9yQWN0aW9uIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcglkZXZpY2U7CisJdW5zaWduZWQgY2hhcgl2MV93aGF0OworCXVuc2lnbmVkIGNoYXIJdjFfbmR4OworCXVuc2lnbmVkIGNoYXIJdjFfdmFsdWU7CisJdW5zaWduZWQgY2hhcgl2Ml93aGF0OworCXVuc2lnbmVkIGNoYXIJdjJfbmR4OworCXVuc2lnbmVkIGNoYXIJdjJfdmFsdWU7Cit9IFhrYkRldmljZVZhbHVhdG9yQWN0aW9uOworCit0eXBlZGVmCXVuaW9uIF9Ya2JBY3Rpb24geworCVhrYkFueUFjdGlvbgkJYW55OworCVhrYk1vZEFjdGlvbgkJbW9kczsKKwlYa2JHcm91cEFjdGlvbgkJZ3JvdXA7CisJWGtiSVNPQWN0aW9uCQlpc287CisJWGtiUHRyQWN0aW9uCQlwdHI7CisJWGtiUHRyQnRuQWN0aW9uCQlidG47CisJWGtiUHRyRGZsdEFjdGlvbglkZmx0OworCVhrYlN3aXRjaFNjcmVlbkFjdGlvbglzY3JlZW47CisJWGtiQ3RybHNBY3Rpb24JCWN0cmxzOworCVhrYk1lc3NhZ2VBY3Rpb24JbXNnOworCVhrYlJlZGlyZWN0S2V5QWN0aW9uCXJlZGlyZWN0OworCVhrYkRldmljZUJ0bkFjdGlvbglkZXZidG47CisJWGtiRGV2aWNlVmFsdWF0b3JBY3Rpb24JZGV2dmFsOworCXVuc2lnbmVkIGNoYXIgCQl0eXBlOworfSBYa2JBY3Rpb247CisKK3R5cGVkZWYJc3RydWN0IF9Ya2JDb250cm9scyB7CisJdW5zaWduZWQgY2hhcglta19kZmx0X2J0bjsKKwl1bnNpZ25lZCBjaGFyCW51bV9ncm91cHM7CisJdW5zaWduZWQgY2hhcglncm91cHNfd3JhcDsKKwlYa2JNb2RzUmVjCWludGVybmFsOworCVhrYk1vZHNSZWMJaWdub3JlX2xvY2s7CisJdW5zaWduZWQgaW50CWVuYWJsZWRfY3RybHM7CisJdW5zaWduZWQgc2hvcnQJcmVwZWF0X2RlbGF5OworCXVuc2lnbmVkIHNob3J0CXJlcGVhdF9pbnRlcnZhbDsKKwl1bnNpZ25lZCBzaG9ydAlzbG93X2tleXNfZGVsYXk7CisJdW5zaWduZWQgc2hvcnQJZGVib3VuY2VfZGVsYXk7CisJdW5zaWduZWQgc2hvcnQJbWtfZGVsYXk7CisJdW5zaWduZWQgc2hvcnQJbWtfaW50ZXJ2YWw7CisJdW5zaWduZWQgc2hvcnQJbWtfdGltZV90b19tYXg7CisJdW5zaWduZWQgc2hvcnQJbWtfbWF4X3NwZWVkOworCQkgc2hvcnQJbWtfY3VydmU7CisJdW5zaWduZWQgc2hvcnQJYXhfb3B0aW9uczsKKwl1bnNpZ25lZCBzaG9ydAlheF90aW1lb3V0OworCXVuc2lnbmVkIHNob3J0CWF4dF9vcHRzX21hc2s7CisJdW5zaWduZWQgc2hvcnQJYXh0X29wdHNfdmFsdWVzOworCXVuc2lnbmVkIGludAlheHRfY3RybHNfbWFzazsKKwl1bnNpZ25lZCBpbnQJYXh0X2N0cmxzX3ZhbHVlczsKKwl1bnNpZ25lZCBjaGFyCXBlcl9rZXlfcmVwZWF0W1hrYlBlcktleUJpdEFycmF5U2l6ZV07Cit9IFhrYkNvbnRyb2xzUmVjLCAqWGtiQ29udHJvbHNQdHI7CisKKyNkZWZpbmUJWGtiQVhfQW55RmVlZGJhY2soYykJKChjKS0+ZW5hYmxlZF9jdHJscyZYa2JBY2Nlc3NYRmVlZGJhY2tNYXNrKQorI2RlZmluZQlYa2JBWF9OZWVkT3B0aW9uKGMsdykJKChjKS0+YXhfb3B0aW9ucyYodykpCisjZGVmaW5lCVhrYkFYX05lZWRGZWVkYmFjayhjLHcpCShYa2JBWF9BbnlGZWVkYmFjayhjKSYmWGtiQVhfTmVlZE9wdGlvbihjLHcpKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiU2VydmVyTWFwUmVjIHsKKwl1bnNpZ25lZCBzaG9ydAkJIG51bV9hY3RzOworCXVuc2lnbmVkIHNob3J0CQkgc2l6ZV9hY3RzOworCVhrYkFjdGlvbgkJKmFjdHM7CisKKwlYa2JCZWhhdmlvcgkJKmJlaGF2aW9yczsKKwl1bnNpZ25lZCBzaG9ydAkJKmtleV9hY3RzOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKwkvKiBleHBsaWNpdCBpcyBhIEMrKyByZXNlcnZlZCB3b3JkICovCisJdW5zaWduZWQgY2hhcgkJKmNfZXhwbGljaXQ7CisjZWxzZQorCXVuc2lnbmVkIGNoYXIJCSpleHBsaWNpdDsKKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIJCSB2bW9kc1tYa2JOdW1WaXJ0dWFsTW9kc107CisJdW5zaWduZWQgc2hvcnQJCSp2bW9kbWFwOworfSBYa2JTZXJ2ZXJNYXBSZWMsICpYa2JTZXJ2ZXJNYXBQdHI7CisKKyNkZWZpbmUJWGtiU01LZXlBY3Rpb25zUHRyKG0saykgKCYobSktPmFjdHNbKG0pLT5rZXlfYWN0c1trXV0pCisKKwkvKgorCSAqIFN0cnVjdHVyZXMgYW5kIGFjY2VzcyBtYWNyb3MgdXNlZCBwcmltYXJpbHkgYnkgY2xpZW50cworCSAqLworCit0eXBlZGVmCXN0cnVjdCBfWGtiU3ltTWFwUmVjIHsKKwl1bnNpZ25lZCBjaGFyCSBrdF9pbmRleFtYa2JOdW1LYmRHcm91cHNdOworCXVuc2lnbmVkIGNoYXIJIGdyb3VwX2luZm87CisJdW5zaWduZWQgY2hhcgkgd2lkdGg7CisJdW5zaWduZWQgc2hvcnQJIG9mZnNldDsKK30gWGtiU3ltTWFwUmVjLCAqWGtiU3ltTWFwUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiQ2xpZW50TWFwUmVjIHsKKwl1bnNpZ25lZCBjaGFyCQkgc2l6ZV90eXBlczsKKwl1bnNpZ25lZCBjaGFyCQkgbnVtX3R5cGVzOworCVhrYktleVR5cGVQdHIJCSB0eXBlczsKKworCXVuc2lnbmVkIHNob3J0CQkgc2l6ZV9zeW1zOworCXVuc2lnbmVkIHNob3J0CQkgbnVtX3N5bXM7CisJS2V5U3ltCQkJKnN5bXM7CisJWGtiU3ltTWFwUHRyCQkga2V5X3N5bV9tYXA7CisKKwl1bnNpZ25lZCBjaGFyCQkqbW9kbWFwOworfSBYa2JDbGllbnRNYXBSZWMsICpYa2JDbGllbnRNYXBQdHI7CisKKyNkZWZpbmUJWGtiQ01LZXlHcm91cEluZm8obSxrKSAgKChtKS0+a2V5X3N5bV9tYXBba10uZ3JvdXBfaW5mbykKKyNkZWZpbmUJWGtiQ01LZXlOdW1Hcm91cHMobSxrKQkgKFhrYk51bUdyb3VwcygobSktPmtleV9zeW1fbWFwW2tdLmdyb3VwX2luZm8pKQorI2RlZmluZQlYa2JDTUtleUdyb3VwV2lkdGgobSxrLGcpIChYa2JDTUtleVR5cGUobSxrLGcpLT5udW1fbGV2ZWxzKQorI2RlZmluZQlYa2JDTUtleUdyb3Vwc1dpZHRoKG0saykgKChtKS0+a2V5X3N5bV9tYXBba10ud2lkdGgpCisjZGVmaW5lCVhrYkNNS2V5VHlwZUluZGV4KG0sayxnKSAoKG0pLT5rZXlfc3ltX21hcFtrXS5rdF9pbmRleFtnJjB4M10pCisjZGVmaW5lCVhrYkNNS2V5VHlwZShtLGssZykJICgmKG0pLT50eXBlc1tYa2JDTUtleVR5cGVJbmRleChtLGssZyldKQorI2RlZmluZQlYa2JDTUtleU51bVN5bXMobSxrKSAoWGtiQ01LZXlHcm91cHNXaWR0aChtLGspKlhrYkNNS2V5TnVtR3JvdXBzKG0saykpCisjZGVmaW5lCVhrYkNNS2V5U3ltc09mZnNldChtLGspCSgobSktPmtleV9zeW1fbWFwW2tdLm9mZnNldCkKKyNkZWZpbmUJWGtiQ01LZXlTeW1zUHRyKG0saykJKCYobSktPnN5bXNbWGtiQ01LZXlTeW1zT2Zmc2V0KG0sayldKQorCisJLyoKKwkgKiBDb21wYXRpYmlsaXR5IHN0cnVjdHVyZXMgYW5kIGFjY2VzcyBtYWNyb3MKKwkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlN5bUludGVycHJldFJlYyB7CisJS2V5U3ltCQlzeW07CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwl1bnNpZ25lZCBjaGFyCW1hdGNoOworCXVuc2lnbmVkIGNoYXIJbW9kczsKKwl1bnNpZ25lZCBjaGFyCXZpcnR1YWxfbW9kOworCVhrYkFueUFjdGlvbglhY3Q7Cit9IFhrYlN5bUludGVycHJldFJlYywqWGtiU3ltSW50ZXJwcmV0UHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiQ29tcGF0TWFwUmVjIHsKKwlYa2JTeW1JbnRlcnByZXRQdHIJIHN5bV9pbnRlcnByZXQ7CisJWGtiTW9kc1JlYwkJIGdyb3Vwc1tYa2JOdW1LYmRHcm91cHNdOworCXVuc2lnbmVkIHNob3J0CQkgbnVtX3NpOworCXVuc2lnbmVkIHNob3J0CQkgc2l6ZV9zaTsKK30gWGtiQ29tcGF0TWFwUmVjLCAqWGtiQ29tcGF0TWFwUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiSW5kaWNhdG9yTWFwUmVjIHsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJd2hpY2hfZ3JvdXBzOworCXVuc2lnbmVkIGNoYXIJZ3JvdXBzOworCXVuc2lnbmVkIGNoYXIJd2hpY2hfbW9kczsKKwlYa2JNb2RzUmVjCW1vZHM7CisJdW5zaWduZWQgaW50CWN0cmxzOworfSBYa2JJbmRpY2F0b3JNYXBSZWMsICpYa2JJbmRpY2F0b3JNYXBQdHI7CisKKyNkZWZpbmUJWGtiSU1fSXNBdXRvKGkpCSgoKChpKS0+ZmxhZ3MmWGtiSU1fTm9BdXRvbWF0aWMpPT0wKSYmXAorCQkJICAgICgoKGkpLT53aGljaF9ncm91cHMmJihpKS0+Z3JvdXBzKXx8XAorCQkJICAgICAoKGkpLT53aGljaF9tb2RzJiYoaSktPm1vZHMubWFzayl8fFwKKwkJCSAgICAgKChpKS0+Y3RybHMpKSkKKyNkZWZpbmUJWGtiSU1fSW5Vc2UoaSkJKCgoaSktPmZsYWdzKXx8KChpKS0+d2hpY2hfZ3JvdXBzKXx8XAorCQkJCQkoKGkpLT53aGljaF9tb2RzKXx8KChpKS0+Y3RybHMpKQorCQorCit0eXBlZGVmIHN0cnVjdCBfWGtiSW5kaWNhdG9yUmVjIHsKKwl1bnNpZ25lZCBsb25nCSAgCXBoeXNfaW5kaWNhdG9yczsKKwlYa2JJbmRpY2F0b3JNYXBSZWMJbWFwc1tYa2JOdW1JbmRpY2F0b3JzXTsKK30gWGtiSW5kaWNhdG9yUmVjLCpYa2JJbmRpY2F0b3JQdHI7CisKK3R5cGVkZWYJc3RydWN0IF9Ya2JLZXlOYW1lUmVjIHsKKwljaGFyCW5hbWVbWGtiS2V5TmFtZUxlbmd0aF07Cit9IFhrYktleU5hbWVSZWMsKlhrYktleU5hbWVQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JLZXlBbGlhc1JlYyB7CisJY2hhcglyZWFsW1hrYktleU5hbWVMZW5ndGhdOworCWNoYXIJYWxpYXNbWGtiS2V5TmFtZUxlbmd0aF07Cit9IFhrYktleUFsaWFzUmVjLCpYa2JLZXlBbGlhc1B0cjsKKworCS8qCisJICogTmFtZXMgZm9yIGV2ZXJ5dGhpbmcgCisJICovCit0eXBlZGVmIHN0cnVjdCBfWGtiTmFtZXNSZWMgeworCUF0b20JCSAga2V5Y29kZXM7CisJQXRvbQkJICBnZW9tZXRyeTsKKwlBdG9tCQkgIHN5bWJvbHM7CisJQXRvbSAgICAgICAgICAgICAgdHlwZXM7CisJQXRvbQkJICBjb21wYXQ7CisJQXRvbQkJICB2bW9kc1tYa2JOdW1WaXJ0dWFsTW9kc107CisJQXRvbQkJICBpbmRpY2F0b3JzW1hrYk51bUluZGljYXRvcnNdOworCUF0b20JCSAgZ3JvdXBzW1hrYk51bUtiZEdyb3Vwc107CisJWGtiS2V5TmFtZVB0cgkgIGtleXM7CisJWGtiS2V5QWxpYXNQdHIJICBrZXlfYWxpYXNlczsKKwlBdG9tCQkgKnJhZGlvX2dyb3VwczsKKwlBdG9tCQkgIHBoeXNfc3ltYm9sczsKKworCXVuc2lnbmVkIGNoYXIJICBudW1fa2V5czsKKwl1bnNpZ25lZCBjaGFyCSAgbnVtX2tleV9hbGlhc2VzOworCXVuc2lnbmVkIHNob3J0CSAgbnVtX3JnOworfSBYa2JOYW1lc1JlYywqWGtiTmFtZXNQdHI7CisKK3R5cGVkZWYJc3RydWN0IF9Ya2JHZW9tZXRyeQkqWGtiR2VvbWV0cnlQdHI7CisJLyoKKwkgKiBUaWUgaXQgYWxsIHRvZ2V0aGVyIGludG8gb25lIGJpZyBrZXlib2FyZCBkZXNjcmlwdGlvbgorCSAqLwordHlwZWRlZglzdHJ1Y3QgX1hrYkRlc2MgeworCXN0cnVjdCBfWERpc3BsYXkgKglkcHk7CisJdW5zaWduZWQgc2hvcnQJIAlmbGFnczsKKwl1bnNpZ25lZCBzaG9ydAkJZGV2aWNlX3NwZWM7CisJS2V5Q29kZQkJCW1pbl9rZXlfY29kZTsKKwlLZXlDb2RlCQkJbWF4X2tleV9jb2RlOworCisJWGtiQ29udHJvbHNQdHIJCWN0cmxzOworCVhrYlNlcnZlck1hcFB0cgkJc2VydmVyOworCVhrYkNsaWVudE1hcFB0cgkJbWFwOworCVhrYkluZGljYXRvclB0cgkJaW5kaWNhdG9yczsKKwlYa2JOYW1lc1B0cgkJbmFtZXM7CisJWGtiQ29tcGF0TWFwUHRyCQljb21wYXQ7CisJWGtiR2VvbWV0cnlQdHIJCWdlb207Cit9IFhrYkRlc2NSZWMsICpYa2JEZXNjUHRyOworI2RlZmluZQlYa2JLZXlLZXlUeXBlSW5kZXgoZCxrLGcpCShYa2JDTUtleVR5cGVJbmRleCgoZCktPm1hcCxrLGcpKQorI2RlZmluZQlYa2JLZXlLZXlUeXBlKGQsayxnKQkJKFhrYkNNS2V5VHlwZSgoZCktPm1hcCxrLGcpKQorI2RlZmluZQlYa2JLZXlHcm91cFdpZHRoKGQsayxnKQkJKFhrYkNNS2V5R3JvdXBXaWR0aCgoZCktPm1hcCxrLGcpKQorI2RlZmluZQlYa2JLZXlHcm91cHNXaWR0aChkLGspCQkoWGtiQ01LZXlHcm91cHNXaWR0aCgoZCktPm1hcCxrKSkKKyNkZWZpbmUJWGtiS2V5R3JvdXBJbmZvKGQsaykJCShYa2JDTUtleUdyb3VwSW5mbygoZCktPm1hcCwoaykpKQorI2RlZmluZQlYa2JLZXlOdW1Hcm91cHMoZCxrKQkJKFhrYkNNS2V5TnVtR3JvdXBzKChkKS0+bWFwLChrKSkpCisjZGVmaW5lCVhrYktleU51bVN5bXMoZCxrKQkJKFhrYkNNS2V5TnVtU3ltcygoZCktPm1hcCwoaykpKQorI2RlZmluZQlYa2JLZXlTeW1zUHRyKGQsaykJCShYa2JDTUtleVN5bXNQdHIoKGQpLT5tYXAsKGspKSkKKyNkZWZpbmUJWGtiS2V5U3ltKGQsayxuKQkJKFhrYktleVN5bXNQdHIoZCxrKVtuXSkKKyNkZWZpbmUJWGtiS2V5U3ltRW50cnkoZCxrLHNsLGcpIFwKKwkoWGtiS2V5U3ltKGQsaywoKFhrYktleUdyb3Vwc1dpZHRoKGQsaykqKGcpKSsoc2wpKSkpCisjZGVmaW5lCVhrYktleUFjdGlvbihkLGssbikgXAorCShYa2JLZXlIYXNBY3Rpb25zKGQsayk/JlhrYktleUFjdGlvbnNQdHIoZCxrKVtuXTpOVUxMKQorI2RlZmluZQlYa2JLZXlBY3Rpb25FbnRyeShkLGssc2wsZykgXAorCShYa2JLZXlIYXNBY3Rpb25zKGQsayk/XAorCQlYa2JLZXlBY3Rpb24oZCxrLCgoWGtiS2V5R3JvdXBzV2lkdGgoZCxrKSooZykpKyhzbCkpKTpOVUxMKQorCisjZGVmaW5lCVhrYktleUhhc0FjdGlvbnMoZCxrKQkoKGQpLT5zZXJ2ZXItPmtleV9hY3RzW2tdIT0wKQorI2RlZmluZQlYa2JLZXlOdW1BY3Rpb25zKGQsaykJKFhrYktleUhhc0FjdGlvbnMoZCxrKT9Ya2JLZXlOdW1TeW1zKGQsayk6MSkKKyNkZWZpbmUJWGtiS2V5QWN0aW9uc1B0cihkLGspCShYa2JTTUtleUFjdGlvbnNQdHIoKGQpLT5zZXJ2ZXIsaykpCisjZGVmaW5lCVhrYktleWNvZGVJblJhbmdlKGQsaykJKCgoayk+PShkKS0+bWluX2tleV9jb2RlKSYmXAorCQkJCSAoKGspPD0oZCktPm1heF9rZXlfY29kZSkpCisjZGVmaW5lCVhrYk51bUtleXMoZCkJCSgoZCktPm1heF9rZXlfY29kZS0oZCktPm1pbl9rZXlfY29kZSsxKQorCisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyBjYW4gYmUgdXNlZCB0byB0cmFjayBjaGFuZ2VzCisJICogdG8gYSBrZXlib2FyZCBkZXZpY2UKKwkgKi8KK3R5cGVkZWYgc3RydWN0IF9Ya2JNYXBDaGFuZ2VzIHsKKwl1bnNpZ25lZCBzaG9ydAkJIGNoYW5nZWQ7CisJS2V5Q29kZQkJCSBtaW5fa2V5X2NvZGU7CisJS2V5Q29kZQkJCSBtYXhfa2V5X2NvZGU7CisJdW5zaWduZWQgY2hhcgkJIGZpcnN0X3R5cGU7CisJdW5zaWduZWQgY2hhcgkJIG51bV90eXBlczsKKwlLZXlDb2RlCQkJIGZpcnN0X2tleV9zeW07CisJdW5zaWduZWQgY2hhcgkJIG51bV9rZXlfc3ltczsKKwlLZXlDb2RlCQkJIGZpcnN0X2tleV9hY3Q7CisJdW5zaWduZWQgY2hhcgkJIG51bV9rZXlfYWN0czsKKwlLZXlDb2RlCQkJIGZpcnN0X2tleV9iZWhhdmlvcjsKKwl1bnNpZ25lZCBjaGFyCQkgbnVtX2tleV9iZWhhdmlvcnM7CisJS2V5Q29kZSAJCSBmaXJzdF9rZXlfZXhwbGljaXQ7CisJdW5zaWduZWQgY2hhcgkJIG51bV9rZXlfZXhwbGljaXQ7CisJS2V5Q29kZQkJCSBmaXJzdF9tb2RtYXBfa2V5OworCXVuc2lnbmVkIGNoYXIJCSBudW1fbW9kbWFwX2tleXM7CisJS2V5Q29kZQkJCSBmaXJzdF92bW9kbWFwX2tleTsKKwl1bnNpZ25lZCBjaGFyCQkgbnVtX3Ztb2RtYXBfa2V5czsKKwl1bnNpZ25lZCBjaGFyCQkgcGFkOworCXVuc2lnbmVkIHNob3J0CQkgdm1vZHM7Cit9IFhrYk1hcENoYW5nZXNSZWMsKlhrYk1hcENoYW5nZXNQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDb250cm9sc0NoYW5nZXMgeworCXVuc2lnbmVkIGludCAJCSBjaGFuZ2VkX2N0cmxzOworCXVuc2lnbmVkIGludAkJIGVuYWJsZWRfY3RybHNfY2hhbmdlczsKKwlCb29sCQkJIG51bV9ncm91cHNfY2hhbmdlZDsKK30gWGtiQ29udHJvbHNDaGFuZ2VzUmVjLCpYa2JDb250cm9sc0NoYW5nZXNQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JJbmRpY2F0b3JDaGFuZ2VzIHsKKwl1bnNpZ25lZCBpbnQJCSBzdGF0ZV9jaGFuZ2VzOworCXVuc2lnbmVkIGludAkJIG1hcF9jaGFuZ2VzOworfSBYa2JJbmRpY2F0b3JDaGFuZ2VzUmVjLCpYa2JJbmRpY2F0b3JDaGFuZ2VzUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiTmFtZUNoYW5nZXMgeworCXVuc2lnbmVkIGludCAJCWNoYW5nZWQ7CisJdW5zaWduZWQgY2hhcgkJZmlyc3RfdHlwZTsKKwl1bnNpZ25lZCBjaGFyCQludW1fdHlwZXM7CisJdW5zaWduZWQgY2hhcgkJZmlyc3RfbHZsOworCXVuc2lnbmVkIGNoYXIJCW51bV9sdmxzOworCXVuc2lnbmVkIGNoYXIJCW51bV9hbGlhc2VzOworCXVuc2lnbmVkIGNoYXIJCW51bV9yZzsKKwl1bnNpZ25lZCBjaGFyCQlmaXJzdF9rZXk7CisJdW5zaWduZWQgY2hhcgkJbnVtX2tleXM7CisJdW5zaWduZWQgc2hvcnQJCWNoYW5nZWRfdm1vZHM7CisJdW5zaWduZWQgbG9uZwkJY2hhbmdlZF9pbmRpY2F0b3JzOworCXVuc2lnbmVkIGNoYXIJCWNoYW5nZWRfZ3JvdXBzOworfSBYa2JOYW1lQ2hhbmdlc1JlYywqWGtiTmFtZUNoYW5nZXNQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDb21wYXRDaGFuZ2VzIHsKKwl1bnNpZ25lZCBjaGFyCQljaGFuZ2VkX2dyb3VwczsKKwl1bnNpZ25lZCBzaG9ydAkJZmlyc3Rfc2k7CisJdW5zaWduZWQgc2hvcnQJCW51bV9zaTsKK30gWGtiQ29tcGF0Q2hhbmdlc1JlYywqWGtiQ29tcGF0Q2hhbmdlc1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkNoYW5nZXMgeworCXVuc2lnbmVkIHNob3J0CQkgZGV2aWNlX3NwZWM7CisJdW5zaWduZWQgc2hvcnQJCSBzdGF0ZV9jaGFuZ2VzOworCVhrYk1hcENoYW5nZXNSZWMJIG1hcDsKKwlYa2JDb250cm9sc0NoYW5nZXNSZWMJIGN0cmxzOworCVhrYkluZGljYXRvckNoYW5nZXNSZWMJIGluZGljYXRvcnM7CisJWGtiTmFtZUNoYW5nZXNSZWMJIG5hbWVzOworCVhrYkNvbXBhdENoYW5nZXNSZWMJIGNvbXBhdDsKK30gWGtiQ2hhbmdlc1JlYywgKlhrYkNoYW5nZXNQdHI7CisKKwkvKgorCSAqIFRoZXNlIGRhdGEgc3RydWN0dXJlcyBhcmUgdXNlZCB0byBjb25zdHJ1Y3QgYSBrZXltYXAgZnJvbSAKKwkgKiBhIHNldCBvZiBjb21wb25lbnRzIG9yIHRvIGxpc3QgY29tcG9uZW50cyBpbiB0aGUgc2VydmVyCisJICogZGF0YWJhc2UuCisJICovCit0eXBlZGVmIHN0cnVjdCBfWGtiQ29tcG9uZW50TmFtZXMgeworCWNoYXIgKgkJCSBrZXltYXA7CisJY2hhciAqCQkJIGtleWNvZGVzOworCWNoYXIgKgkJCSB0eXBlczsKKwljaGFyICoJCQkgY29tcGF0OworCWNoYXIgKgkJCSBzeW1ib2xzOworCWNoYXIgKgkJCSBnZW9tZXRyeTsKK30gWGtiQ29tcG9uZW50TmFtZXNSZWMsICpYa2JDb21wb25lbnROYW1lc1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkNvbXBvbmVudE5hbWUgeworCXVuc2lnbmVkIHNob3J0CQlmbGFnczsKKwljaGFyICoJCQluYW1lOworfSBYa2JDb21wb25lbnROYW1lUmVjLCpYa2JDb21wb25lbnROYW1lUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiQ29tcG9uZW50TGlzdCB7CisJaW50CQkJbnVtX2tleW1hcHM7CisJaW50CQkJbnVtX2tleWNvZGVzOworCWludAkJCW51bV90eXBlczsKKwlpbnQJCQludW1fY29tcGF0OworCWludAkJCW51bV9zeW1ib2xzOworCWludAkJCW51bV9nZW9tZXRyeTsKKwlYa2JDb21wb25lbnROYW1lUHRyCWtleW1hcHM7CisJWGtiQ29tcG9uZW50TmFtZVB0ciAJa2V5Y29kZXM7CisJWGtiQ29tcG9uZW50TmFtZVB0cgl0eXBlczsKKwlYa2JDb21wb25lbnROYW1lUHRyCWNvbXBhdDsKKwlYa2JDb21wb25lbnROYW1lUHRyCXN5bWJvbHM7CisJWGtiQ29tcG9uZW50TmFtZVB0cglnZW9tZXRyeTsKK30gWGtiQ29tcG9uZW50TGlzdFJlYywgKlhrYkNvbXBvbmVudExpc3RQdHI7CisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmVzIGRlc2NyaWJlIGFuZCB0cmFjayBjaGFuZ2VzIHRvIGEgCisJICogbm9uLWtleWJvYXJkIGV4dGVuc2lvbiBkZXZpY2UgCisJICovCit0eXBlZGVmIHN0cnVjdCBfWGtiRGV2aWNlTGVkSW5mbyB7CisJdW5zaWduZWQgc2hvcnQJCQlsZWRfY2xhc3M7CisJdW5zaWduZWQgc2hvcnQJCQlsZWRfaWQ7CisJdW5zaWduZWQgaW50CQkJcGh5c19pbmRpY2F0b3JzOworCXVuc2lnbmVkIGludAkJCW1hcHNfcHJlc2VudDsKKwl1bnNpZ25lZCBpbnQJCQluYW1lc19wcmVzZW50OworCXVuc2lnbmVkIGludAkJCXN0YXRlOworCUF0b20gCQkJCW5hbWVzW1hrYk51bUluZGljYXRvcnNdOworCVhrYkluZGljYXRvck1hcFJlYwkJbWFwc1tYa2JOdW1JbmRpY2F0b3JzXTsKK30gWGtiRGV2aWNlTGVkSW5mb1JlYywqWGtiRGV2aWNlTGVkSW5mb1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkRldmljZUluZm8geworCWNoYXIgKgkJCW5hbWU7CisJQXRvbQkJCXR5cGU7CisJdW5zaWduZWQgc2hvcnQJCWRldmljZV9zcGVjOworCUJvb2wJCQloYXNfb3duX3N0YXRlOworCXVuc2lnbmVkIHNob3J0CQlzdXBwb3J0ZWQ7CisJdW5zaWduZWQgc2hvcnQJCXVuc3VwcG9ydGVkOworCisJdW5zaWduZWQgc2hvcnQJCW51bV9idG5zOworCVhrYkFjdGlvbiAqCQlidG5fYWN0czsKKworCXVuc2lnbmVkIHNob3J0CQlzel9sZWRzOworCXVuc2lnbmVkIHNob3J0CQludW1fbGVkczsKKwl1bnNpZ25lZCBzaG9ydAkJZGZsdF9rYmRfZmI7CisJdW5zaWduZWQgc2hvcnQJCWRmbHRfbGVkX2ZiOworCVhrYkRldmljZUxlZEluZm9QdHIJbGVkczsKK30gWGtiRGV2aWNlSW5mb1JlYywqWGtiRGV2aWNlSW5mb1B0cjsKKworI2RlZmluZQlYa2JYSV9EZXZIYXNCdG5BY3RzKGQpCSgoKGQpLT5udW1fYnRucz4wKSYmKChkKS0+YnRuX2FjdHMhPU5VTEwpKQorI2RlZmluZQlYa2JYSV9MZWdhbERldkJ0bihkLGIpCShYa2JYSV9EZXZIYXNCdG5BY3RzKGQpJiYoKGIpPChkKS0+bnVtX2J0bnMpKQorI2RlZmluZQlYa2JYSV9EZXZIYXNMZWRzKGQpCSgoKGQpLT5udW1fbGVkcz4wKSYmKChkKS0+bGVkcyE9TlVMTCkpCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JEZXZpY2VMZWRDaGFuZ2VzIHsKKwl1bnNpZ25lZCBzaG9ydAkJbGVkX2NsYXNzOworCXVuc2lnbmVkIHNob3J0CQlsZWRfaWQ7CisJdW5zaWduZWQgaW50CQlkZWZpbmVkOyAvKiBuYW1lcyBvciBtYXBzIGNoYW5nZWQgKi8KKwlzdHJ1Y3QgX1hrYkRldmljZUxlZENoYW5nZXMgKm5leHQ7Cit9IFhrYkRldmljZUxlZENoYW5nZXNSZWMsKlhrYkRldmljZUxlZENoYW5nZXNQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JEZXZpY2VDaGFuZ2VzIHsKKwl1bnNpZ25lZCBpbnQJCWNoYW5nZWQ7CisJdW5zaWduZWQgc2hvcnQJCWZpcnN0X2J0bjsKKwl1bnNpZ25lZCBzaG9ydAkJbnVtX2J0bnM7CisJWGtiRGV2aWNlTGVkQ2hhbmdlc1JlYyAJbGVkczsKK30gWGtiRGV2aWNlQ2hhbmdlc1JlYywqWGtiRGV2aWNlQ2hhbmdlc1B0cjsKKworI2VuZGlmIC8qIF9YS0JTVFJfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWExieC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YTGJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4YzgzNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWExieC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MiBOZXR3b3JrIENvbXB1dGluZyBEZXZpY2VzCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBOQ0QuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBOQ0QuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKKyAqIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorICogd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogTkNELiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTAorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgTkNELgorICogQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIAorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX1hMQlhfSF8KKyNkZWZpbmUgX1hMQlhfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisjaW5jbHVkZSA8WDExL1hkZWZzLmg+CisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9sYnguaD4KKworX1hGVU5DUFJPVE9CRUdJTgorCitCb29sIFhMYnhRdWVyeUV4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludCoJCS8qIHJlcXVlc3RwICovLAorICAgIGludCoJCS8qIGV2ZW50X2Jhc2VwICovLAorICAgIGludCoJCS8qIGVycm9yX2Jhc2VwICovCispOworCitCb29sIFhMYnhRdWVyeVZlcnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQqCQkvKiBtYWpvclZlcnNpb24gKi8sCisgICAgaW50KgkJLyogbWlub3JWZXJzaW9uICovCispOworCitpbnQgWExieEdldEV2ZW50QmFzZShEaXNwbGF5ICpkcHkpOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWFNobS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YU2htLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmMDY1MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWFNobS5oCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVEhJUyBJUyBOT1QgQU4gWCBDT05TT1JUSVVNIFNUQU5EQVJEIE9SIEFOIFggUFJPSkVDVCBURUFNIFNQRUNJRklDQVRJT04gKi8KKworI2lmbmRlZiBfWFNITV9IXworI2RlZmluZSBfWFNITV9IXworCisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9zaG0uaD4KKworI2lmbmRlZiBfWFNITV9TRVJWRVJfCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgU2htU2VnOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50CXR5cGU7CQkgICAgLyogb2YgZXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCBzZW5kX2V2ZW50OwkgICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbWUgYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CSAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgRHJhd2FibGUgZHJhd2FibGU7CSAgICAvKiBkcmF3YWJsZSBvZiByZXF1ZXN0ICovCisgICAgaW50IG1ham9yX2NvZGU7CSAgICAvKiBTaG1SZXFDb2RlICovCisgICAgaW50IG1pbm9yX2NvZGU7CSAgICAvKiBYX1NobVB1dEltYWdlICovCisgICAgU2htU2VnIHNobXNlZzsJICAgIC8qIHRoZSBTaG1TZWcgdXNlZCBpbiB0aGUgcmVxdWVzdCAqLworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OyAgIC8qIHRoZSBvZmZzZXQgaW50byBTaG1TZWcgdXNlZCBpbiB0aGUgcmVxdWVzdCAqLworfSBYU2htQ29tcGxldGlvbkV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgU2htU2VnIHNobXNlZzsJLyogcmVzb3VyY2UgaWQgKi8KKyAgICBpbnQgc2htaWQ7CQkvKiBrZXJuZWwgaWQgKi8KKyAgICBjaGFyICpzaG1hZGRyOwkvKiBhZGRyZXNzIGluIGNsaWVudCAqLworICAgIEJvb2wgcmVhZE9ubHk7CS8qIGhvdyB0aGUgc2VydmVyIHNob3VsZCBhdHRhY2ggaXQgKi8KK30gWFNobVNlZ21lbnRJbmZvOworCitfWEZVTkNQUk9UT0JFR0lOCisKK0Jvb2wgWFNobVF1ZXJ5RXh0ZW5zaW9uKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8KKyk7CisKK2ludCBYU2htR2V0RXZlbnRCYXNlKAorICAgIERpc3BsYXkqIAkJLyogZHB5ICovCispOworCitCb29sIFhTaG1RdWVyeVZlcnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQqCQkvKiBtYWpvclZlcnNpb24gKi8sCisgICAgaW50KgkJLyogbWlub3JWZXJzaW9uICovLAorICAgIEJvb2wqCQkvKiBzaGFyZWRQaXhtYXBzICovCispOworCitpbnQgWFNobVBpeG1hcEZvcm1hdCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovCispOworCitCb29sIFhTaG1BdHRhY2goCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBYU2htU2VnbWVudEluZm8qCS8qIHNobWluZm8gKi8KKyk7CisKK0Jvb2wgWFNobURldGFjaCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIFhTaG1TZWdtZW50SW5mbyoJLyogc2htaW5mbyAqLworKTsKKworQm9vbCBYU2htUHV0SW1hZ2UoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFhJbWFnZSoJCS8qIGltYWdlICovLAorICAgIGludAkJCS8qIHNyY194ICovLAorICAgIGludAkJCS8qIHNyY195ICovLAorICAgIGludAkJCS8qIGRzdF94ICovLAorICAgIGludAkJCS8qIGRzdF95ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBzcmNfd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHNyY19oZWlnaHQgKi8sCisgICAgQm9vbAkJLyogc2VuZF9ldmVudCAqLworKTsKKworQm9vbCBYU2htR2V0SW1hZ2UoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBYSW1hZ2UqCQkvKiBpbWFnZSAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBwbGFuZV9tYXNrICovCispOworCitYSW1hZ2UgKlhTaG1DcmVhdGVJbWFnZSgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIFZpc3VhbCoJCS8qIHZpc3VhbCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogZGVwdGggKi8sCisgICAgaW50CQkJLyogZm9ybWF0ICovLAorICAgIGNoYXIqCQkvKiBkYXRhICovLAorICAgIFhTaG1TZWdtZW50SW5mbyoJLyogc2htaW5mbyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLworKTsKKworUGl4bWFwIFhTaG1DcmVhdGVQaXhtYXAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBjaGFyKgkJLyogZGF0YSAqLywKKyAgICBYU2htU2VnbWVudEluZm8qCS8qIHNobWluZm8gKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGRlcHRoICovCispOworCitfWEZVTkNQUk9UT0VORAorI2VuZGlmIC8qIF9YU0hNX1NFUlZFUl8gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hhZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YYWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjY5Zjc4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YYWcuaApAQCAtMCwwICsxLDkwIEBACisvKgorQ29weXJpZ2h0IDE5OTYsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIFRoZSBPcGVuIEdyb3VwLgorKi8KKworI2lmbmRlZiBfWEFHX0hfCisjZGVmaW5lIF9YQUdfSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2FnLmg+CisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKK3R5cGVkZWYgWElEIFhBcHBHcm91cDsKKworQm9vbCBYYWdRdWVyeVZlcnNpb24oCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgaW50KgkJCS8qIG1ham9yX3ZlcnNpb24gKi8sCisgICAgaW50KgkJCS8qIG1pbm9yX3ZlcnNpb24gKi8KKyk7CisKK1N0YXR1cyBYYWdDcmVhdGVFbWJlZGRlZEFwcGxpY2F0aW9uR3JvdXAoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgVmlzdWFsSUQJCQkvKiByb290X3Zpc3VhbCAqLywKKyAgICBDb2xvcm1hcAkJCS8qIGRlZmF1bHRfY29sb3JtYXAgKi8sCisgICAgdW5zaWduZWQgbG9uZwkJLyogYmxhY2tfcGl4ZWwgKi8sCisgICAgdW5zaWduZWQgbG9uZwkJLyogd2hpdGVfcGl4ZWwgKi8sCisgICAgWEFwcEdyb3VwKgkJCS8qIGFwcF9ncm91cF9yZXR1cm4gKi8KKyk7CisKK1N0YXR1cyBYYWdDcmVhdGVOb25lbWJlZGRlZEFwcGxpY2F0aW9uR3JvdXAoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgWEFwcEdyb3VwKgkJCS8qIGFwcF9ncm91cF9yZXR1cm4gKi8KKyk7CisKK1N0YXR1cyBYYWdEZXN0cm95QXBwbGljYXRpb25Hcm91cCgKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBYQXBwR3JvdXAJCQkvKiBhcHBfZ3JvdXAgKi8KKyk7CisKK1N0YXR1cyBYYWdHZXRBcHBsaWNhdGlvbkdyb3VwQXR0cmlidXRlcygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBYQXBwR3JvdXAJCQkvKiBhcHBfZ3JvdXAgKi8sCisgICAgLi4uCispOworCitTdGF0dXMgWGFnUXVlcnlBcHBsaWNhdGlvbkdyb3VwKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFhJRAkJCQkvKiByZXNvdXJjZV9iYXNlICovLAorICAgIFhBcHBHcm91cCoJCQkvKiBhcHBfZ3JvdXBfcmV0ICovCispOworCitTdGF0dXMgWGFnQ3JlYXRlQXNzb2NpYXRpb24oCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgV2luZG93KgkJCS8qIHdpbmRvd19yZXQgKi8sCisgICAgdm9pZCoJCQkvKiBzeXN0ZW1fd2luZG93ICovCispOworCitTdGF0dXMgWGFnRGVzdHJveUFzc29jaWF0aW9uKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFdpbmRvdwkJCS8qIHdpbmRvdyAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YQUdfSF8gKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YY3VwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hjdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODA3NGNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YY3VwLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKworQ29weXJpZ2h0IDE5ODcsIDE5ODgsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyovCisKKyNpZm5kZWYgX1hDVVBfSF8KKyNkZWZpbmUgX1hDVVBfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvY3VwLmg+CisKK19YRlVOQ1BST1RPQkVHSU4KKworQm9vbCBYY3VwUXVlcnlWZXJzaW9uKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIGludCoJCQkvKiBtYWpvcl92ZXJzaW9uICovLAorICAgIGludCoJCQkvKiBtaW5vcl92ZXJzaW9uICovCispOworCitTdGF0dXMgWGN1cEdldFJlc2VydmVkQ29sb3JtYXBFbnRyaWVzKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIGludAkJCQkvKiBzY3JlZW4gKi8sCisgICAgWENvbG9yKioJCQkvKiBjb2xvcnNfb3V0ICovLAorICAgIGludCoJCQkvKiBuY29sb3JzICovCispOworCitTdGF0dXMgWGN1cFN0b3JlQ29sb3JzKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIENvbG9ybWFwCQkJLyogY29sb3JtYXAgKi8sCisgICAgWENvbG9yKgkJCS8qIGNvbG9ycyAqLywKKyAgICBpbnQJCQkJLyogbmNvbG9ycyAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YQ1VQX0hfICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGRiZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZGJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjZTUzZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGRiZS5oCkBAIC0wLDAgKzEsMTM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgSEVXTEVUVC1QQUNLQVJEIENPTVBBTlkgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIHRoZSBIZXdsZXR0LVBhY2thcmQKKyAqIENvbXBhbnkgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqIGF1dGhvcml6YXRpb24gZnJvbSB0aGUgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkuCisgKiAKKyAqICAgICBIZWFkZXIgZmlsZSBmb3IgWGxpYi1yZWxhdGVkIERCRQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBYREJFX0gKKyNkZWZpbmUgWERCRV9ICisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2RiZS5oPgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIFZpc3VhbElEICAgIHZpc3VhbDsgICAgLyogb25lIHZpc3VhbCBJRCB0aGF0IHN1cHBvcnRzIGRvdWJsZS1idWZmZXJpbmcgKi8KKyAgICBpbnQgICAgICAgICBkZXB0aDsgICAgIC8qIGRlcHRoIG9mIHZpc3VhbCBpbiBiaXRzICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50ICAgICAgICAgcGVyZmxldmVsOyAvKiBwZXJmb3JtYW5jZSBsZXZlbCBvZiB2aXN1YWwgICAgICAgICAgICAgICAgICAqLworfQorWGRiZVZpc3VhbEluZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50ICAgICAgICAgICAgICAgICBjb3VudDsgICAgICAgICAgLyogbnVtYmVyIG9mIGl0ZW1zIGluIHZpc3VhbF9kZXB0aCAgICovCisgICAgWGRiZVZpc3VhbEluZm8gICAgICAqdmlzaW5mbzsgICAgICAgLyogbGlzdCBvZiB2aXN1YWxzICYgZGVwdGhzIGZvciBzY3JuICovCit9CitYZGJlU2NyZWVuVmlzdWFsSW5mbzsKKworCit0eXBlZGVmIERyYXdhYmxlIFhkYmVCYWNrQnVmZmVyOworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgWGRiZVN3YXBBY3Rpb247CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgV2luZG93CQlzd2FwX3dpbmRvdzsgICAgLyogd2luZG93IGZvciB3aGljaCB0byBzd2FwIGJ1ZmZlcnMgICAqLworICAgIFhkYmVTd2FwQWN0aW9uCXN3YXBfYWN0aW9uOyAgICAvKiBzd2FwIGFjdGlvbiB0byB1c2UgZm9yIHN3YXBfd2luZG93ICovCit9CitYZGJlU3dhcEluZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgV2luZG93CXdpbmRvdzsJCQkvKiB3aW5kb3cgdGhhdCBidWZmZXIgYmVsb25ncyB0byAqLworfQorWGRiZUJhY2tCdWZmZXJBdHRyaWJ1dGVzOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludAkJCXR5cGU7CisgICAgRGlzcGxheQkJKmRpc3BsYXk7CS8qIGRpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBYZGJlQmFja0J1ZmZlcglidWZmZXI7CQkvKiByZXNvdXJjZSBpZCAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgbG9uZwlzZXJpYWw7CQkvKiBzZXJpYWwgbnVtYmVyIG9mIGZhaWxlZCByZXF1ZXN0ICovCisgICAgdW5zaWduZWQgY2hhcgllcnJvcl9jb2RlOwkvKiBlcnJvciBiYXNlICsgWGRiZUJhZEJ1ZmZlciAgICAgICovCisgICAgdW5zaWduZWQgY2hhcglyZXF1ZXN0X2NvZGU7CS8qIG1ham9yIG9wY29kZSBvZiBmYWlsZWQgcmVxdWVzdCAgKi8KKyAgICB1bnNpZ25lZCBjaGFyCW1pbm9yX2NvZGU7CS8qIG1pbm9yIG9wY29kZSBvZiBmYWlsZWQgcmVxdWVzdCAgKi8KK30KK1hkYmVCdWZmZXJFcnJvcjsKKworLyogX1hGVU5DUFJPVE9CRUdJTiBhbmQgX1hGVU5DUFJPVE9FTkQgYXJlIGRlZmluZWQgYXMgbm9vcHMKKyAqIChmb3Igbm9uLUMrKyBidWlsZHMpIGluIFgxMS9YZnVuY3Byb3RvLmguCisgKi8KK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIFN0YXR1cyBYZGJlUXVlcnlFeHRlbnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAgICAgICAgICAgICAgICAgICovLAorICAgIGludCoJCS8qIG1ham9yX3ZlcnNpb25fcmV0dXJuICovLAorICAgIGludCoJCS8qIG1pbm9yX3ZlcnNpb25fcmV0dXJuICovCispOworCitleHRlcm4gWGRiZUJhY2tCdWZmZXIgWGRiZUFsbG9jYXRlQmFja0J1ZmZlck5hbWUoCisgICAgRGlzcGxheSoJCS8qIGRweSAgICAgICAgICovLAorICAgIFdpbmRvdwkJLyogd2luZG93ICAgICAgKi8sCisgICAgWGRiZVN3YXBBY3Rpb24JLyogc3dhcF9hY3Rpb24gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGRiZURlYWxsb2NhdGVCYWNrQnVmZmVyTmFtZSgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICAgICovLAorICAgIFhkYmVCYWNrQnVmZmVyCS8qIGJ1ZmZlciAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYZGJlU3dhcEJ1ZmZlcnMoCisgICAgRGlzcGxheSoJCS8qIGRweSAgICAgICAgICovLAorICAgIFhkYmVTd2FwSW5mbyoJLyogc3dhcF9pbmZvICAgKi8sCisgICAgaW50CQkJLyogbnVtX3dpbmRvd3MgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGRiZUJlZ2luSWRpb20oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYZGJlRW5kSWRpb20oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLworKTsKKworZXh0ZXJuIFhkYmVTY3JlZW5WaXN1YWxJbmZvICpYZGJlR2V0VmlzdWFsSW5mbygKKyAgICBEaXNwbGF5KgkJLyogZHB5ICAgICAgICAgICAgICAgKi8sCisgICAgRHJhd2FibGUqCQkvKiBzY3JlZW5fc3BlY2lmaWVycyAqLywKKyAgICBpbnQqCQkvKiBudW1fc2NyZWVucyAgICAgICAqLworKTsKKworZXh0ZXJuIHZvaWQgWGRiZUZyZWVWaXN1YWxJbmZvKAorICAgIFhkYmVTY3JlZW5WaXN1YWxJbmZvKgkvKiB2aXN1YWxfaW5mbyAqLworKTsKKworZXh0ZXJuIFhkYmVCYWNrQnVmZmVyQXR0cmlidXRlcyAqWGRiZUdldEJhY2tCdWZmZXJBdHRyaWJ1dGVzKAorICAgIERpc3BsYXkqCQkvKiBkcHkgICAgKi8sCisgICAgWGRiZUJhY2tCdWZmZXIJLyogYnVmZmVyICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogWERCRV9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGV4dC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4NTkyYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGV4dC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKgorQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisgKi8KKworI2lmbmRlZiBfWEVYVF9IXworI2RlZmluZSBfWEVYVF9IXworCisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKworX1hGVU5DUFJPVE9CRUdJTgorCit0eXBlZGVmIGludCAoKlhleHRFcnJvckhhbmRsZXIpICgKKyAgICBEaXNwbGF5ICoJCS8qIGRweSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGV4dF9uYW1lICovLAorICAgIF9YY29uc3QgY2hhcioJLyogcmVhc29uICovCispOworCitleHRlcm4gWGV4dEVycm9ySGFuZGxlciBYU2V0RXh0ZW5zaW9uRXJyb3JIYW5kbGVyKAorICAgIFhleHRFcnJvckhhbmRsZXIJLyogaGFuZGxlciAqLworKTsKKworZXh0ZXJuIGludCBYTWlzc2luZ0V4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogZXh0X25hbWUgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNkZWZpbmUgWF9FWFRFTlNJT05fVU5LTk9XTiAidW5rbm93biIKKyNkZWZpbmUgWF9FWFRFTlNJT05fTUlTU0lORyAibWlzc2luZyIKKworI2VuZGlmIC8qIF9YRVhUX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hmaXhlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZml4ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzY5ZWNiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZml4ZXMuaApAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwMiBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CisgKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfWEZJWEVTX0hfCisjZGVmaW5lIF9YRklYRVNfSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3hmaXhlc3dpcmUuaD4KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKworLyoKKyAqIFRoaXMgcmV2aXNpb24gbnVtYmVyIGFsc28gYXBwZWFycyBpbiBjb25maWd1cmUuYWMsIHRoZXkgaGF2ZQorICogdG8gYmUgbWFudWFsbHkgc3luY2hyb25pemVkCisgKi8KKyNkZWZpbmUgWEZJWEVTX1JFVklTSU9OCTEKKyNkZWZpbmUgWEZJWEVTX1ZFUlNJT04JKChYRklYRVNfTUFKT1IgKiAxMDAwMCkgKyAoWEZJWEVTX01JTk9SICogMTAwKSArIChYRklYRVNfUkVWSVNJT04pKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHR5cGU7CQkJLyogZXZlbnQgYmFzZSAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOworICAgIEJvb2wgc2VuZF9ldmVudDsKKyAgICBEaXNwbGF5ICpkaXNwbGF5OworICAgIFdpbmRvdyB3aW5kb3c7CisgICAgaW50IHN1YnR5cGU7CisgICAgV2luZG93IG93bmVyOworICAgIEF0b20gc2VsZWN0aW9uOworICAgIFRpbWUgdGltZXN0YW1wOworICAgIFRpbWUgc2VsZWN0aW9uX3RpbWVzdGFtcDsKK30gWEZpeGVzU2VsZWN0aW9uTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdHlwZTsJCQkvKiBldmVudCBiYXNlICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7CisgICAgQm9vbCBzZW5kX2V2ZW50OworICAgIERpc3BsYXkgKmRpc3BsYXk7CisgICAgV2luZG93IHdpbmRvdzsKKyAgICBpbnQgc3VidHlwZTsKKyAgICB1bnNpZ25lZCBsb25nIGN1cnNvcl9zZXJpYWw7CisgICAgVGltZSB0aW1lc3RhbXA7CisgICAgQXRvbSBjdXJzb3JfbmFtZTsKK30gWEZpeGVzQ3Vyc29yTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydAkgICAgeCwgeTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgd2lkdGgsIGhlaWdodDsKKyAgICB1bnNpZ25lZCBzaG9ydCAgeGhvdCwgeWhvdDsKKyAgICB1bnNpZ25lZCBsb25nICAgY3Vyc29yX3NlcmlhbDsKKyAgICB1bnNpZ25lZCBsb25nICAgKnBpeGVsczsKKyNpZiBYRklYRVNfTUFKT1IgPj0gMgorICAgIEF0b20JICAgIGF0b207CQkgICAgLyogVmVyc2lvbiA+PSAyIG9ubHkgKi8KKyAgICBjb25zdCBjaGFyCSAgICAqbmFtZTsJCSAgICAvKiBWZXJzaW9uID49IDIgb25seSAqLworI2VuZGlmCit9IFhGaXhlc0N1cnNvckltYWdlOworCisjaWYgWEZJWEVTX01BSk9SID49IDIKKy8qIFZlcnNpb24gMiB0eXBlcyAqLworCit0eXBlZGVmIFhJRCBYc2VydmVyUmVnaW9uOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2hvcnQJICAgIHgsIHk7CisgICAgdW5zaWduZWQgc2hvcnQgIHdpZHRoLCBoZWlnaHQ7CisgICAgdW5zaWduZWQgc2hvcnQgIHhob3QsIHlob3Q7CisgICAgdW5zaWduZWQgbG9uZyAgIGN1cnNvcl9zZXJpYWw7CisgICAgdW5zaWduZWQgbG9uZyAgICpwaXhlbHM7CisgICAgQXRvbQkgICAgYXRvbTsKKyAgICBjb25zdCBjaGFyCSAgICAqbmFtZTsKK30gWEZpeGVzQ3Vyc29ySW1hZ2VBbmROYW1lOworCisjZW5kaWYKKworX1hGVU5DUFJPVE9CRUdJTgorCitCb29sIFhGaXhlc1F1ZXJ5RXh0ZW5zaW9uIChEaXNwbGF5ICpkcHksCisJCQkgICAgaW50ICpldmVudF9iYXNlX3JldHVybiwKKwkJCSAgICBpbnQgKmVycm9yX2Jhc2VfcmV0dXJuKTsKK1N0YXR1cyBYRml4ZXNRdWVyeVZlcnNpb24gKERpc3BsYXkgKmRweSwKKwkJCSAgICBpbnQgICAgICptYWpvcl92ZXJzaW9uX3JldHVybiwKKwkJCSAgICBpbnQgICAgICptaW5vcl92ZXJzaW9uX3JldHVybik7CisKK2ludCBYRml4ZXNWZXJzaW9uICh2b2lkKTsKKwordm9pZAorWEZpeGVzQ2hhbmdlU2F2ZVNldCAoRGlzcGxheQkqZHB5LAorCQkgICAgIFdpbmRvdwl3aW4sCisJCSAgICAgaW50CW1vZGUsCisJCSAgICAgaW50CXRhcmdldCwKKwkJICAgICBpbnQJbWFwKTsKKwordm9pZAorWEZpeGVzU2VsZWN0U2VsZWN0aW9uSW5wdXQgKERpc3BsYXkJICAgICpkcHksCisJCQkgICAgV2luZG93CSAgICB3aW4sCisJCQkgICAgQXRvbQkgICAgc2VsZWN0aW9uLCAKKwkJCSAgICB1bnNpZ25lZCBsb25nICAgZXZlbnRNYXNrKTsKKwordm9pZAorWEZpeGVzU2VsZWN0Q3Vyc29ySW5wdXQgKERpc3BsYXkJKmRweSwKKwkJCSBXaW5kb3cJCXdpbiwKKwkJCSB1bnNpZ25lZCBsb25nCWV2ZW50TWFzayk7CisKK1hGaXhlc0N1cnNvckltYWdlICoKK1hGaXhlc0dldEN1cnNvckltYWdlIChEaXNwbGF5ICpkcHkpOworCisjaWYgWEZJWEVTX01BSk9SID49IDIKKy8qIFZlcnNpb24gMiBmdW5jdGlvbnMgKi8KKworWHNlcnZlclJlZ2lvbgorWEZpeGVzQ3JlYXRlUmVnaW9uIChEaXNwbGF5ICpkcHksIFhSZWN0YW5nbGUgKnJlY3RhbmdsZXMsIGludCBucmVjdGFuZ2xlcyk7CisKK1hzZXJ2ZXJSZWdpb24KK1hGaXhlc0NyZWF0ZVJlZ2lvbkZyb21CaXRtYXAgKERpc3BsYXkgKmRweSwgUGl4bWFwIGJpdG1hcCk7CisKK1hzZXJ2ZXJSZWdpb24KK1hGaXhlc0NyZWF0ZVJlZ2lvbkZyb21XaW5kb3cgKERpc3BsYXkgKmRweSwgV2luZG93IHdpbmRvdywgaW50IGtpbmQpOworCitYc2VydmVyUmVnaW9uCitYRml4ZXNDcmVhdGVSZWdpb25Gcm9tR0MgKERpc3BsYXkgKmRweSwgR0MgZ2MpOworCitYc2VydmVyUmVnaW9uCitYRml4ZXNDcmVhdGVSZWdpb25Gcm9tUGljdHVyZSAoRGlzcGxheSAqZHB5LCBYSUQgcGljdHVyZSk7CisKK3ZvaWQKK1hGaXhlc0Rlc3Ryb3lSZWdpb24gKERpc3BsYXkgKmRweSwgWHNlcnZlclJlZ2lvbiByZWdpb24pOworCit2b2lkCitYRml4ZXNTZXRSZWdpb24gKERpc3BsYXkgKmRweSwgWHNlcnZlclJlZ2lvbiByZWdpb24sCisJCSBYUmVjdGFuZ2xlICpyZWN0YW5nbGVzLCBpbnQgbnJlY3RhbmdsZXMpOworCit2b2lkCitYRml4ZXNDb3B5UmVnaW9uIChEaXNwbGF5ICpkcHksIFhzZXJ2ZXJSZWdpb24gZHN0LCBYc2VydmVyUmVnaW9uIHNyYyk7CisKK3ZvaWQKK1hGaXhlc1VuaW9uUmVnaW9uIChEaXNwbGF5ICpkcHksIFhzZXJ2ZXJSZWdpb24gZHN0LAorCQkgICBYc2VydmVyUmVnaW9uIHNyYzEsIFhzZXJ2ZXJSZWdpb24gc3JjMik7CisKK3ZvaWQKK1hGaXhlc0ludGVyc2VjdFJlZ2lvbiAoRGlzcGxheSAqZHB5LCBYc2VydmVyUmVnaW9uIGRzdCwKKwkJICAgICAgIFhzZXJ2ZXJSZWdpb24gc3JjMSwgWHNlcnZlclJlZ2lvbiBzcmMyKTsKKwordm9pZAorWEZpeGVzU3VidHJhY3RSZWdpb24gKERpc3BsYXkgKmRweSwgWHNlcnZlclJlZ2lvbiBkc3QsCisJCSAgICAgIFhzZXJ2ZXJSZWdpb24gc3JjMSwgWHNlcnZlclJlZ2lvbiBzcmMyKTsKKwordm9pZAorWEZpeGVzSW52ZXJ0UmVnaW9uIChEaXNwbGF5ICpkcHksIFhzZXJ2ZXJSZWdpb24gZHN0LAorCQkgICAgWFJlY3RhbmdsZSAqcmVjdCwgWHNlcnZlclJlZ2lvbiBzcmMpOworCit2b2lkCitYRml4ZXNUcmFuc2xhdGVSZWdpb24gKERpc3BsYXkgKmRweSwgWHNlcnZlclJlZ2lvbiByZWdpb24sIGludCBkeCwgaW50IGR5KTsKKwordm9pZAorWEZpeGVzUmVnaW9uRXh0ZW50cyAoRGlzcGxheSAqZHB5LCBYc2VydmVyUmVnaW9uIGRzdCwgWHNlcnZlclJlZ2lvbiBzcmMpOworCitYUmVjdGFuZ2xlICoKK1hGaXhlc0ZldGNoUmVnaW9uIChEaXNwbGF5ICpkcHksIFhzZXJ2ZXJSZWdpb24gcmVnaW9uLCBpbnQgKm5yZWN0YW5nbGVzUmV0KTsKKworWFJlY3RhbmdsZSAqCitYRml4ZXNGZXRjaFJlZ2lvbkFuZEJvdW5kcyAoRGlzcGxheSAqZHB5LCBYc2VydmVyUmVnaW9uIHJlZ2lvbiwgCisJCQkgICAgaW50ICpucmVjdGFuZ2xlc1JldCwKKwkJCSAgICBYUmVjdGFuZ2xlICpib3VuZHMpOworCit2b2lkCitYRml4ZXNTZXRHQ0NsaXBSZWdpb24gKERpc3BsYXkgKmRweSwgR0MgZ2MsIAorCQkgICAgICAgaW50IGNsaXBfeF9vcmlnaW4sIGludCBjbGlwX3lfb3JpZ2luLAorCQkgICAgICAgWHNlcnZlclJlZ2lvbiByZWdpb24pOworCit2b2lkCitYRml4ZXNTZXRXaW5kb3dTaGFwZVJlZ2lvbiAoRGlzcGxheSAqZHB5LCBXaW5kb3cgd2luLCBpbnQgc2hhcGVfa2luZCwKKwkJCSAgICBpbnQgeF9vZmYsIGludCB5X29mZiwgWHNlcnZlclJlZ2lvbiByZWdpb24pOworCit2b2lkCitYRml4ZXNTZXRQaWN0dXJlQ2xpcFJlZ2lvbiAoRGlzcGxheSAqZHB5LCBYSUQgcGljdHVyZSwKKwkJCSAgICBpbnQgY2xpcF94X29yaWdpbiwgaW50IGNsaXBfeV9vcmlnaW4sCisJCQkgICAgWHNlcnZlclJlZ2lvbiByZWdpb24pOworCit2b2lkCitYRml4ZXNTZXRDdXJzb3JOYW1lIChEaXNwbGF5ICpkcHksIEN1cnNvciBjdXJzb3IsIGNvbnN0IGNoYXIgKm5hbWUpOworCitjb25zdCBjaGFyICoKK1hGaXhlc0dldEN1cnNvck5hbWUgKERpc3BsYXkgKmRweSwgQ3Vyc29yIGN1cnNvciwgQXRvbSAqYXRvbSk7CisKK3ZvaWQKK1hGaXhlc0NoYW5nZUN1cnNvciAoRGlzcGxheSAqZHB5LCBDdXJzb3Igc291cmNlLCBDdXJzb3IgZGVzdGluYXRpb24pOworCit2b2lkCitYRml4ZXNDaGFuZ2VDdXJzb3JCeU5hbWUgKERpc3BsYXkgKmRweSwgQ3Vyc29yIHNvdXJjZSwgY29uc3QgY2hhciAqbmFtZSk7CisKKyNlbmRpZgkvKiBYRklYRVNfTUFKT1IgPj0gMiAqLworCisjaWYgWEZJWEVTX01BSk9SID49IDMKKwordm9pZAorWEZpeGVzRXhwYW5kUmVnaW9uIChEaXNwbGF5ICpkcHksIFhzZXJ2ZXJSZWdpb24gZHN0LCBYc2VydmVyUmVnaW9uIHNyYywKKwkJICAgIHVuc2lnbmVkIGxlZnQsIHVuc2lnbmVkIHJpZ2h0LAorCQkgICAgdW5zaWduZWQgdG9wLCB1bnNpZ25lZCBib3R0b20pOworCisjZW5kaWYJLyogWEZJWEVTX01BSk9SID49IDMgKi8KKworI2lmIFhGSVhFU19NQUpPUiA+PSA0CisvKiBWZXJzaW9uIDQuMCBleHRlcm5zICovCisKK3ZvaWQKK1hGaXhlc0hpZGVDdXJzb3IgKERpc3BsYXkgKmRweSwgV2luZG93IHdpbik7CisKK3ZvaWQKK1hGaXhlc1Nob3dDdXJzb3IgKERpc3BsYXkgKmRweSwgV2luZG93IHdpbik7CisKKyNlbmRpZiAvKiBYRklYRVNfTUFKT1IgPj0gNCAqLworCisjaWYgWEZJWEVTX01BSk9SID49IDUKKwordHlwZWRlZiBYSUQgUG9pbnRlckJhcnJpZXI7CisKK1BvaW50ZXJCYXJyaWVyCitYRml4ZXNDcmVhdGVQb2ludGVyQmFycmllcihEaXNwbGF5ICpkcHksIFdpbmRvdyB3LCBpbnQgeDEsIGludCB5MSwKKwkJCSAgIGludCB4MiwgaW50IHkyLCBpbnQgZGlyZWN0aW9ucywKKwkJCSAgIGludCBudW1fZGV2aWNlcywgaW50ICpkZXZpY2VzKTsKKworUG9pbnRlckJhcnJpZXIKK1hGaXhlc0NyZWF0ZVBvaW50ZXJCYXJyaWVyVmVsb2NpdHkoRGlzcGxheSAqZHB5LCBXaW5kb3cgdywgaW50IHgxLCBpbnQgeTEsCisJCQkgICBpbnQgeDIsIGludCB5MiwgaW50IGRpcmVjdGlvbnMsIGludCB2ZWxvY2l0eSwKKwkJCSAgIGludCBudW1fZGV2aWNlcywgaW50ICpkZXZpY2VzKTsKKwordm9pZAorWEZpeGVzRGVzdHJveVBvaW50ZXJCYXJyaWVyKERpc3BsYXkgKmRweSwgUG9pbnRlckJhcnJpZXIgYik7CisKKyNlbmRpZiAvKiBYRklYRVNfTUFKT1IgPj0gNSAqLworCisjaWYgWEZJWEVTX01BSk9SID49IDYKKwordHlwZWRlZiBpbnQzMl90IEJhcnJpZXJFdmVudElEOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHR5cGU7CQkJLyogZXZlbnQgYmFzZSAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOworICAgIEJvb2wgc2VuZF9ldmVudDsKKyAgICBEaXNwbGF5ICpkaXNwbGF5OworICAgIFdpbmRvdyB3aW5kb3c7CisgICAgaW50IHN1YnR5cGU7CisgICAgQmFycmllckV2ZW50SUQgZXZlbnRfaWQ7CisgICAgaW50IGRpcmVjdGlvbnM7CisgICAgUG9pbnRlckJhcnJpZXIgYmFycmllcjsKKyAgICBpbnQgeDsKKyAgICBpbnQgeTsKKyAgICBpbnQgdmVsb2NpdHk7CisgICAgVGltZSB0aW1lc3RhbXA7Cit9IFhGaXhlc0JhcnJpZXJOb3RpZnlFdmVudDsKKwordm9pZAorWEZpeGVzU2VsZWN0QmFycmllcklucHV0IChEaXNwbGF5CSpkcHksCisJCQkgV2luZG93CQl3aW4sCisJCQkgdW5zaWduZWQgbG9uZwlldmVudE1hc2spOworCit2b2lkCitYRml4ZXNCYXJyaWVyUmVsZWFzZVBvaW50ZXIoRGlzcGxheSAqZHB5LAorCQkJICAgIFBvaW50ZXJCYXJyaWVyIGIsCisJCQkgICAgQmFycmllckV2ZW50SUQgZXZlbnRfaWQpOworCisjZW5kaWYKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YRklYRVNfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGdlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMzgyZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hnZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgqSAyMDA3LTIwMDggUGV0ZXIgSHV0dGVyZXIKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogUGV0ZXIgSHV0dGVyZXIsIFVuaXZlcnNpdHkgb2YgU291dGggQXVzdHJhbGlhLCBOSUNUQQorICoKKyAqLworCisKKy8qIFhHRSBDbGllbnQgaW50ZXJmYWNlcyAqLworCisjaWZuZGVmIF9YR0VfSF8KKyNkZWZpbmUgX1hHRV9IXworCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKKy8qKgorICogR2VuZXJpYyBFdmVudCBtYXNrLiAKKyAqIFRvIGJlIHVzZWQgd2hlbmV2ZXIgYSBsaXN0IG9mIG1hc2tzIHBlciBleHRlbnNpb24gaGFzIHRvIGJlIHByb3ZpZGVkLgorICoKKyAqIEJ1dCwgZG9uJ3QgYWN0dWFsbHkgdXNlIHRoZSBDQVJEezgsMTYsMzJ9IHR5cGVzLiAgV2UgY2FuJ3QgZ2V0IHRoZW0gdGhlbQorICogZGVmaW5lZCBoZXJlIHdpdGhvdXQgcG9sbHV0aW5nIHRoZSBuYW1lc3BhY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBjaGFyICAgICAgIGV4dGVuc2lvbjsKKyAgICB1bnNpZ25lZCBjaGFyICAgICAgIHBhZDA7CisgICAgdW5zaWduZWQgc2hvcnQgICAgICBwYWQxOworICAgIHVuc2lnbmVkIGludCAgICAgIGV2bWFzazsKK30gWEdlbmVyaWNFdmVudE1hc2s7CisKK0Jvb2wgWEdFUXVlcnlFeHRlbnNpb24oRGlzcGxheSogZHB5LCBpbnQgKmV2ZW50X2Jhc2VwLCBpbnQgKmVycl9iYXNlcCk7CitCb29sIFhHRVF1ZXJ5VmVyc2lvbihEaXNwbGF5KiBkcHksIGludCAqbWFqb3IsIGludCogbWlub3IpOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX1hHRV9IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9hZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9hZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNTg4M2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2FnLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKK0NvcHlyaWdodCAxOTk2LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKyovCisKKyNpZm5kZWYgX0FHX0hfCisjZGVmaW5lIF9BR19IXworCisjZGVmaW5lIFhBR05BTUUgIlhDLUFQUEdST1VQIgorCisjZGVmaW5lIFhBR19NQUpPUl9WRVJTSU9OCTEJLyogY3VycmVudCB2ZXJzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgWEFHX01JTk9SX1ZFUlNJT04JMAorCisjZGVmaW5lIFhhZ1dpbmRvd1R5cGVYMTEJMAorI2RlZmluZSBYYWdXaW5kb3dUeXBlTWFjaW50b3NoCTEKKyNkZWZpbmUgWGFnV2luZG93VHlwZVdpbjMyCTIKKyNkZWZpbmUgWGFnV2luZG93VHlwZVdpbjE2CTMKKworI2RlZmluZSBYYWdCYWRBcHBHcm91cAkJCTAKKyNkZWZpbmUgWGFnTnVtYmVyRXJyb3JzCQkJKFhhZ0JhZEFwcEdyb3VwICsgMSkKKworI2RlZmluZSBYYWdOc2luZ2xlU2NyZWVuCQk3CisjZGVmaW5lIFhhZ05kZWZhdWx0Um9vdAkJCTEKKyNkZWZpbmUgWGFnTnJvb3RWaXN1YWwJCQkyCisjZGVmaW5lIFhhZ05kZWZhdWx0Q29sb3JtYXAJCTMKKyNkZWZpbmUgWGFnTmJsYWNrUGl4ZWwJCQk0CisjZGVmaW5lIFhhZ053aGl0ZVBpeGVsCQkJNQorI2RlZmluZSBYYWdOYXBwR3JvdXBMZWFkZXIJCTYKKworI2VuZGlmIC8qIF9BR19IXyAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2FncHJvdG8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvYWdwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODY2NjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2FncHJvdG8uaApAQCAtMCwwICsxLDE3OCBAQAorLyoKK0NvcHlyaWdodCAxOTk2LCAxOTk4LCAyMDAxICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKyovCisKKyNpZm5kZWYgX0FHUFJPVE9fSF8gLyogeyAqLworI2RlZmluZSBfQUdQUk9UT19IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvYWcuaD4KKworI2RlZmluZSBYX1hhZ1F1ZXJ5VmVyc2lvbgkJMAorI2RlZmluZSBYX1hhZ0NyZWF0ZQkJCTEKKyNkZWZpbmUgWF9YYWdEZXN0cm95CQkJMgorI2RlZmluZSBYX1hhZ0dldEF0dHIJCQkzCisjZGVmaW5lIFhfWGFnUXVlcnkJCQk0CisjZGVmaW5lIFhfWGFnQ3JlYXRlQXNzb2MJCTUKKyNkZWZpbmUgWF9YYWdEZXN0cm95QXNzb2MJCTYKKworI2RlZmluZSBYQXBwR3JvdXAgQ0FSRDMyCisKKy8qCisqIFJlZGVmaW5lIHNvbWUgYmFzaWMgdHlwZXMgdXNlZCBieSBzdHJ1Y3R1cmVzIGRlZmluZWQgaGVyZWluLiAgVGhpcyBhbGxvd3MKKyogYm90aCB0aGUgbGlicmFyeSBhbmQgc2VydmVyIHRvIHZpZXcgY29tbXVuaWNhdGVkIGRhdGEgYXMgMzItYml0IGVudGl0aWVzLAorKiB0aHVzIHByZXZlbnRpbmcgcHJvYmxlbXMgb24gNjQtYml0IGFyY2hpdGVjdHVyZXMgd2hlcmUgbGliWGV4dCBzZWVzIHRoaXMKKyogZGF0YSBhcyA2NCBiaXRzIGFuZCB0aGUgc2VydmVyIHNlZXMgaXQgYXMgMzIgYml0cy4KKyovCisKKyNkZWZpbmUgQ29sb3JtYXAgQ0FSRDMyCisjZGVmaW5lIFZpc3VhbElEIENBUkQzMgorI2RlZmluZSBXaW5kb3cgQ0FSRDMyCisKK3R5cGVkZWYgc3RydWN0IF9YYWdRdWVyeVZlcnNpb24geworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYYWdSZXFDb2RlICovCisgICAgQ0FSRDgJeGFnUmVxVHlwZTsJLyogYWx3YXlzIFhfWGFnUXVlcnlWZXJzaW9uICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWNsaWVudF9tYWpvcl92ZXJzaW9uIEIxNjsKKyAgICBDQVJEMTYJY2xpZW50X21pbm9yX3ZlcnNpb24gQjE2OworfSB4WGFnUXVlcnlWZXJzaW9uUmVxOworI2RlZmluZSBzel94WGFnUXVlcnlWZXJzaW9uUmVxCQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBYX1JlcGx5ICovCisgICAgQk9PTAlwYWQxOworICAgIENBUkQxNglzZXF1ZW5jZV9udW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNglzZXJ2ZXJfbWFqb3JfdmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CXNlcnZlcl9taW5vcl92ZXJzaW9uIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworfSB4WGFnUXVlcnlWZXJzaW9uUmVwbHk7CisjZGVmaW5lIHN6X3hYYWdRdWVyeVZlcnNpb25SZXBseQkzMgorCisvKiBTZXQgQXBwR3JvdXAgQXR0cmlidXRlcyBtYXNrcyAqLworI2RlZmluZSBYYWdTaW5nbGVTY3JlZW5NYXNrCQkxIDw8IDAKKyNkZWZpbmUgWGFnRGVmYXVsdFJvb3RNYXNrCQkxIDw8IFhhZ05kZWZhdWx0Um9vdAorI2RlZmluZSBYYWdSb290VmlzdWFsTWFzawkJMSA8PCBYYWdOcm9vdFZpc3VhbAorI2RlZmluZSBYYWdEZWZhdWx0Q29sb3JtYXBNYXNrCQkxIDw8IFhhZ05kZWZhdWx0Q29sb3JtYXAKKyNkZWZpbmUgWGFnQmxhY2tQaXhlbE1hc2sJCTEgPDwgWGFnTmJsYWNrUGl4ZWwKKyNkZWZpbmUgWGFnV2hpdGVQaXhlbE1hc2sJCTEgPDwgWGFnTndoaXRlUGl4ZWwKKyNkZWZpbmUgWGFnQXBwR3JvdXBMZWFkZXJNYXNrCQkxIDw8IFhhZ05hcHBHcm91cExlYWRlcgorCit0eXBlZGVmIHN0cnVjdCBfWGFnQ3JlYXRlIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWGFnUmVxQ29kZSAqLworICAgIENBUkQ4CXhhZ1JlcVR5cGU7CS8qIGFsd2F5cyBYX1hhZ0NyZWF0ZSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhBcHBHcm91cAlhcHBfZ3JvdXAgQjMyOworICAgIENBUkQzMglhdHRyaWJfbWFzayBCMzI7IC8qIExJU1RvZlZBTFVFIGZvbGxvd3MgKi8KK30geFhhZ0NyZWF0ZVJlcTsKKyNkZWZpbmUgc3pfeFhhZ0NyZWF0ZVJlcQkJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX1hhZ0Rlc3Ryb3kgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYYWdSZXFDb2RlICovCisgICAgQ0FSRDgJeGFnUmVxVHlwZTsJLyogYWx3YXlzIFhfWGFnRGVzdHJveSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhBcHBHcm91cAlhcHBfZ3JvdXAgIEIzMjsKK30geFhhZ0Rlc3Ryb3lSZXE7CisjZGVmaW5lIHN6X3hYYWdEZXN0cm95UmVxCQk4CisKK3R5cGVkZWYgc3RydWN0IF9YYWdHZXRBdHRyIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWGFnUmVxQ29kZSAqLworICAgIENBUkQ4CXhhZ1JlcVR5cGU7CS8qIGFsd2F5cyBYX1hhZ0dldEF0dHIgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYQXBwR3JvdXAJYXBwX2dyb3VwIEIzMjsKK30geFhhZ0dldEF0dHJSZXE7CisjZGVmaW5lIHN6X3hYYWdHZXRBdHRyUmVxCQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBYX1JlcGx5ICovCisgICAgQk9PTAlwYWQxOworICAgIENBUkQxNglzZXF1ZW5jZV9udW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIFdpbmRvdwlkZWZhdWx0X3Jvb3QgQjMyOworICAgIFZpc3VhbElECXJvb3RfdmlzdWFsIEIzMjsKKyAgICBDb2xvcm1hcAlkZWZhdWx0X2NvbG9ybWFwIEIzMjsKKyAgICBDQVJEMzIJYmxhY2tfcGl4ZWwgQjMyOworICAgIENBUkQzMgl3aGl0ZV9waXhlbCBCMzI7CisgICAgQk9PTAlzaW5nbGVfc2NyZWVuOworICAgIEJPT0wJYXBwX2dyb3VwX2xlYWRlcjsKKyAgICBDQVJEMTYJcGFkMiBCMTY7Cit9IHhYYWdHZXRBdHRyUmVwbHk7CisjZGVmaW5lIHN6X3hYYWdHZXRBdHRyUmVwbHkJCTMyCisKK3R5cGVkZWYgc3RydWN0IF9YYWdRdWVyeSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhhZ1JlcUNvZGUgKi8KKyAgICBDQVJEOAl4YWdSZXFUeXBlOwkvKiBhbHdheXMgWF9YYWdRdWVyeSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMglyZXNvdXJjZSBCMzI7Cit9IHhYYWdRdWVyeVJlcTsKKyNkZWZpbmUgc3pfeFhhZ1F1ZXJ5UmVxCQkJOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJLyogWF9SZXBseSAqLworICAgIEJPT0wJcGFkMTsKKyAgICBDQVJEMTYJc2VxdWVuY2VfbnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBYQXBwR3JvdXAJYXBwX2dyb3VwIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworfSB4WGFnUXVlcnlSZXBseTsKKyNkZWZpbmUgc3pfeFhhZ1F1ZXJ5UmVwbHkJCTMyCisKK3R5cGVkZWYgc3RydWN0IF9YYWdDcmVhdGVBc3NvYyB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhhZ1JlcUNvZGUgKi8KKyAgICBDQVJEOAl4YWdSZXFUeXBlOwkvKiBhbHdheXMgWF9YYWdDcmVhdGVBc3NvYyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwl3aW5kb3cgQjMyOworICAgIENBUkQxNgl3aW5kb3dfdHlwZSBCMTY7CisgICAgQ0FSRDE2CXN5c3RlbV93aW5kb3dfbGVuIEIxNjsgLyogTElTVG9mQ0FSRDggZm9sbG93cyAqLworfSB4WGFnQ3JlYXRlQXNzb2NSZXE7CisjZGVmaW5lIHN6X3hYYWdDcmVhdGVBc3NvY1JlcQkJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX1hhZ0Rlc3Ryb3lBc3NvYyB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhhZ1JlcUNvZGUgKi8KKyAgICBDQVJEOAl4YWdSZXFUeXBlOwkvKiBhbHdheXMgWF9YYWdEZXN0cm95QXNzb2MgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cJd2luZG93IEIzMjsKK30geFhhZ0Rlc3Ryb3lBc3NvY1JlcTsKKyNkZWZpbmUgc3pfeFhhZ0Rlc3Ryb3lBc3NvY1JlcQkJOAorCisjdW5kZWYgWEFwcEdyb3VwCisvKgorICogQ2FuY2VsIHRoZSBwcmV2aW91cyByZWRlZmluaXRpb24gb2YgdGhlIGJhc2ljIHR5cGVzLCB0aHVzIHJlc3RvcmluZyB0aGVpcgorICogWC5oIGRlZmluaXRpb25zLgorICovCisKKyN1bmRlZiBXaW5kb3cKKyN1bmRlZiBDb2xvcm1hcAorI3VuZGVmIFZpc3VhbElECisKKyNlbmRpZiAvKiB9IF9BR1BST1RPX0hfICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvY3VwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2N1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYmMzNGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2N1cC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisKK0NvcHlyaWdodCAxOTg3LCAxOTg4LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisjaWZuZGVmIF9DVVBfSF8KKyNkZWZpbmUgX0NVUF9IXworCisjZGVmaW5lIFhDVVBOQU1FICJUT0ctQ1VQIgorCisjZGVmaW5lIFhDVVBfTUFKT1JfVkVSU0lPTgkxCS8qIGN1cnJlbnQgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIFhDVVBfTUlOT1JfVkVSU0lPTgkwCisKKyNkZWZpbmUgWGN1cE51bWJlckVycm9ycwkJCTAKKworI2VuZGlmIC8qIF9DVVBfSF8gKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9jdXBwcm90by5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9jdXBwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MWM5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2N1cHByb3RvLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisKK0NvcHlyaWdodCAxOTg3LCAxOTg4LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisjaWZuZGVmIF9YQ1VQUFJPVE9fSF8gLyogeyAqLworI2RlZmluZSBfWENVUFBST1RPX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9jdXAuaD4KKworI2RlZmluZSBYX1hjdXBRdWVyeVZlcnNpb24JCQkwCisjZGVmaW5lIFhfWGN1cEdldFJlc2VydmVkQ29sb3JtYXBFbnRyaWVzCTEKKyNkZWZpbmUgWF9YY3VwU3RvcmVDb2xvcnMJCQkyCisKK3R5cGVkZWYgc3RydWN0IF9YY3VwUXVlcnlWZXJzaW9uIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWGN1cFJlcUNvZGUgKi8KKyAgICBDQVJEOAl4Y3VwUmVxVHlwZTsJLyogYWx3YXlzIFhfWGN1cFF1ZXJ5VmVyc2lvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNgljbGllbnRfbWFqb3JfdmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CWNsaWVudF9taW5vcl92ZXJzaW9uIEIxNjsKK30geFhjdXBRdWVyeVZlcnNpb25SZXE7CisjZGVmaW5lIHN6X3hYY3VwUXVlcnlWZXJzaW9uUmVxCQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBYX1JlcGx5ICovCisgICAgQk9PTAlwYWQxOworICAgIENBUkQxNglzZXF1ZW5jZV9udW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNglzZXJ2ZXJfbWFqb3JfdmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CXNlcnZlcl9taW5vcl92ZXJzaW9uIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworfSB4WGN1cFF1ZXJ5VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94WGN1cFF1ZXJ5VmVyc2lvblJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9YY3VwR2V0UmVzZXJ2ZWRDb2xvcm1hcEVudHJpZXMgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYY3VwUmVxQ29kZSAqLworICAgIENBUkQ4CXhjdXBSZXFUeXBlOwkvKiBhbHdheXMgWF9YY3VwR2V0UmVzZXJ2ZWRDb2xvcm1hcEVudHJpZXMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJc2NyZWVuIEIzMjsKK30geFhjdXBHZXRSZXNlcnZlZENvbG9ybWFwRW50cmllc1JlcTsKKyNkZWZpbmUgc3pfeFhjdXBHZXRSZXNlcnZlZENvbG9ybWFwRW50cmllc1JlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBYX1JlcGx5ICovCisgICAgQk9PTAlwYWQxOworICAgIENBUkQxNglzZXF1ZW5jZV9udW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7CisgICAgQ0FSRDMyCXBhZDcgQjMyOworfSB4WGN1cEdldFJlc2VydmVkQ29sb3JtYXBFbnRyaWVzUmVwbHk7CisjZGVmaW5lIHN6X3hYY3VwR2V0UmVzZXJ2ZWRDb2xvcm1hcEVudHJpZXNSZXBseQkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1hjdXBTdG9yZUNvbG9ycyB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhjdXBSZXFDb2RlICovCisgICAgQ0FSRDgJeGN1cFJlcVR5cGU7CS8qIGFsd2F5cyBYX1hjdXBTdG9yZUNvbG9ycyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgljbWFwIEIzMjsKK30geFhjdXBTdG9yZUNvbG9yc1JlcTsKKyNkZWZpbmUgc3pfeFhjdXBTdG9yZUNvbG9yc1JlcQkJOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJLyogWF9SZXBseSAqLworICAgIEJPT0wJcGFkMTsKKyAgICBDQVJEMTYJc2VxdWVuY2VfbnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworICAgIENBUkQzMglwYWQ3IEIzMjsKK30geFhjdXBTdG9yZUNvbG9yc1JlcGx5OworI2RlZmluZSBzel94WGN1cFN0b3JlQ29sb3JzUmVwbHkJMzIKKworI2VuZGlmIC8qIH0gX1hDVVBQUk9UT19IXyAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2RiZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9kYmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTY4NTUyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9kYmUuaApAQCAtMCwwICsxLDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1ICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgSEVXTEVUVC1QQUNLQVJEIENPTVBBTlkgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIEhld2xldHQtUGFja2FyZAorICogQ29tcGFueSBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBIZXdsZXR0LVBhY2thcmQgQ29tcGFueS4KKyAqCisgKiAgICAgSGVhZGVyIGZpbGUgZm9yIFhsaWItcmVsYXRlZCBEQkUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgREJFX0gKKyNkZWZpbmUgREJFX0gKKworLyogVmFsdWVzIGZvciBzd2FwX2FjdGlvbiBmaWVsZCBvZiBYZGJlU3dhcEluZm8gc3RydWN0dXJlICovCisjZGVmaW5lIFhkYmVVbmRlZmluZWQgICAgMAorI2RlZmluZSBYZGJlQmFja2dyb3VuZCAgIDEKKyNkZWZpbmUgWGRiZVVudG91Y2hlZCAgICAyCisjZGVmaW5lIFhkYmVDb3BpZWQgICAgICAgMworCisvKiBFcnJvcnMgKi8KKyNkZWZpbmUgWGRiZUJhZEJ1ZmZlciAgICAwCisKKyNkZWZpbmUgREJFX1BST1RPQ09MX05BTUUgIkRPVUJMRS1CVUZGRVIiCisKKy8qIEN1cnJlbnQgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIERCRV9NQUpPUl9WRVJTSU9OICAgICAgIDEKKyNkZWZpbmUgREJFX01JTk9SX1ZFUlNJT04gICAgICAgMAorCisvKiBVc2VkIHdoZW4gYWRkaW5nIGV4dGVuc2lvbjsgYWxzbyB1c2VkIGluIFhkYmUgbWFjcm9zICovCisjZGVmaW5lIERiZU51bWJlckV2ZW50cwkJCTAKKyNkZWZpbmUgRGJlQmFkQnVmZmVyCQkJMAorI2RlZmluZSBEYmVOdW1iZXJFcnJvcnMJCQkoRGJlQmFkQnVmZmVyICsgMSkKKworI2VuZGlmIC8qIERCRV9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZGJlcHJvdG8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZGJlcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODQ5MjZlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9kYmVwcm90by5oCkBAIC0wLDAgKzEsMjI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1ICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgSEVXTEVUVC1QQUNLQVJEIENPTVBBTlkgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIEhld2xldHQtUGFja2FyZAorICogQ29tcGFueSBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBIZXdsZXR0LVBhY2thcmQgQ29tcGFueS4KKyAqCisgKiAgICAgSGVhZGVyIGZpbGUgZm9yIFhsaWItcmVsYXRlZCBEQkUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgREJFX1BST1RPX0gKKyNkZWZpbmUgREJFX1BST1RPX0gKKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2RiZS5oPgorCisvKiBSZXF1ZXN0IHZhbHVlcyB1c2VkIGluIChTKVByb2NEYmVEaXNwYXRjaCgpICovCisjZGVmaW5lIFhfRGJlR2V0VmVyc2lvbiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBYX0RiZUFsbG9jYXRlQmFja0J1ZmZlck5hbWUgICAgIDEKKyNkZWZpbmUgWF9EYmVEZWFsbG9jYXRlQmFja0J1ZmZlck5hbWUgICAyCisjZGVmaW5lIFhfRGJlU3dhcEJ1ZmZlcnMgICAgICAgICAgICAgICAgMworI2RlZmluZSBYX0RiZUJlZ2luSWRpb20gICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWF9EYmVFbmRJZGlvbSAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFhfRGJlR2V0VmlzdWFsSW5mbyAgICAgICAgICAgICAgNgorI2RlZmluZSBYX0RiZUdldEJhY2tCdWZmZXJBdHRyaWJ1dGVzICAgIDcKKwordHlwZWRlZiBDQVJEOCAgeERiZVN3YXBBY3Rpb247Cit0eXBlZGVmIENBUkQzMiB4RGJlQmFja0J1ZmZlcjsKKworLyogVFlQRURFRlMgKi8KKworLyogUHJvdG9jb2wgZGF0YSB0eXBlcyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQzMgkJd2luZG93IEIzMjsJLyogd2luZG93ICAgICAgKi8KKyAgICB4RGJlU3dhcEFjdGlvbglzd2FwQWN0aW9uOwkvKiBzd2FwIGFjdGlvbiAqLworICAgIENBUkQ4CQlwYWQxOwkJLyogdW51c2VkICAgICAgKi8KKyAgICBDQVJEMTYJCXBhZDIgQjE2OworCit9IHhEYmVTd2FwSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDQVJEMzIJdmlzdWFsSUQgQjMyOwkvKiBhc3NvY2lhdGVkIHZpc3VhbCAgICAgICovCisgICAgQ0FSRDgJZGVwdGg7CQkvKiBkZXB0aCBvZiB2aXN1YWwgICAgICAgICovCisgICAgQ0FSRDgJcGVyZkxldmVsOwkvKiBwZXJmb3JtYW5jZSBsZXZlbCBoaW50ICovCisgICAgQ0FSRDE2CXBhZDEgQjE2OworCit9IHhEYmVWaXNJbmZvOworI2RlZmluZSBzel94RGJlVmlzSW5mbwk4CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ0FSRDMyCW4gQjMyOwkvKiBudW1iZXIgb2YgdmlzdWFsIGluZm8gaXRlbXMgaW4gbGlzdCAgKi8KKworfSB4RGJlU2NyZWVuVmlzSW5mbzsJLyogZm9sbG93ZWQgYnkgbiB4RGJlVmlzSW5mbyBpdGVtcyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQzMgl3aW5kb3cgQjMyOwkvKiB3aW5kb3cgKi8KKworfSB4RGJlQnVmZmVyQXR0cmlidXRlczsKKworCisvKiBSZXF1ZXN0cyBhbmQgcmVwbGllcyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQ4CXJlcVR5cGU7CS8qIG1ham9yLW9wY29kZTogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAlkYmVSZXFUeXBlOwkvKiBtaW5vci1vcGNvZGU6IGFsd2F5cyBYX0RiZUdldFZlcnNpb24gKDApICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIHJlcXVlc3QgbGVuZ3RoOiAoMikgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEOAltYWpvclZlcnNpb247CS8qIGNsaWVudC1tYWpvci12ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEOAltaW5vclZlcnNpb247CS8qIGNsaWVudC1taW5vci12ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEMTYJdW51c2VkIEIxNjsJLyogdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit9IHhEYmVHZXRWZXJzaW9uUmVxOworI2RlZmluZSBzel94RGJlR2V0VmVyc2lvblJlcQk4CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQllURQl0eXBlOwkJCS8qIFJlcGx5OiBYX1JlcGx5ICgxKSAgICovCisgICAgQ0FSRDgJdW51c2VkOwkJCS8qIHVudXNlZCAgICAgICAgICAgICAgICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsJLyogc2VxdWVuY2UgbnVtYmVyICAgICAgKi8KKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsJCS8qIHJlcGx5IGxlbmd0aDogKDApICAgICovCisgICAgQ0FSRDgJbWFqb3JWZXJzaW9uOwkJLyogc2VydmVyLW1ham9yLXZlcnNpb24gKi8KKyAgICBDQVJEOAltaW5vclZlcnNpb247CQkvKiBzZXJ2ZXItbWlub3ItdmVyc2lvbiAqLworICAgIENBUkQxNglwYWQxIEIxNjsJCS8qIHVudXNlZCAgICAgICAgICAgICAgICovCisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKKworfSB4RGJlR2V0VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94RGJlR2V0VmVyc2lvblJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ0FSRDgJCXJlcVR5cGU7CS8qIG1ham9yLW9wY29kZTogY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CQlkYmVSZXFUeXBlOwkvKiBYX0RiZUFsbG9jYXRlQmFja0J1ZmZlck5hbWUgKDEpICAgKi8KKyAgICBDQVJEMTYJCWxlbmd0aCBCMTY7CS8qIHJlcXVlc3QgbGVuZ3RoOiAoNCkgICAgICAgICAgICAgICAqLworICAgIENBUkQzMgkJd2luZG93IEIzMjsJLyogd2luZG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgeERiZUJhY2tCdWZmZXIJYnVmZmVyIEIzMjsJLyogYmFjayBidWZmZXIgbmFtZSAgICAgICAgICAgICAgICAgICovCisgICAgeERiZVN3YXBBY3Rpb24Jc3dhcEFjdGlvbjsJLyogc3dhcCBhY3Rpb24gaGludCAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDgJCXBhZDE7CQkvKiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEMTYJCXBhZDIgQjE2OworCit9IHhEYmVBbGxvY2F0ZUJhY2tCdWZmZXJOYW1lUmVxOworI2RlZmluZSBzel94RGJlQWxsb2NhdGVCYWNrQnVmZmVyTmFtZVJlcQkxNgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQ4CQlyZXFUeXBlOwkvKiBtYWpvci1vcGNvZGU6IGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAkJZGJlUmVxVHlwZTsJLyogWF9EYmVEZWFsbG9jYXRlQmFja0J1ZmZlck5hbWUgKDIpICovCisgICAgQ0FSRDE2CQlsZW5ndGggQjE2OwkvKiByZXF1ZXN0IGxlbmd0aDogKDIpICAgICAgICAgICAgICAgKi8KKyAgICB4RGJlQmFja0J1ZmZlcglidWZmZXIgQjMyOwkvKiBiYWNrIGJ1ZmZlciBuYW1lICAgICAgICAgICAgICAgICAgKi8KKworfSB4RGJlRGVhbGxvY2F0ZUJhY2tCdWZmZXJOYW1lUmVxOworI2RlZmluZSBzel94RGJlRGVhbGxvY2F0ZUJhY2tCdWZmZXJOYW1lUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBtYWpvci1vcGNvZGU6IGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICAqLworICAgIENBUkQ4CWRiZVJlcVR5cGU7CS8qIG1pbm9yLW9wY29kZTogYWx3YXlzIFhfRGJlU3dhcEJ1ZmZlcnMgKDMpICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIHJlcXVlc3QgbGVuZ3RoOiAoMisybikgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDMyCW4gQjMyOwkJLyogbiwgbnVtYmVyIG9mIHdpbmRvdy9zd2FwIGFjdGlvbiBwYWlycyAgICAgKi8KKworfSB4RGJlU3dhcEJ1ZmZlcnNSZXE7CQkvKiBmb2xsb3dlZCBieSBuIHdpbmRvdy9zd2FwIGFjdGlvbiBwYWlycyAgICAqLworI2RlZmluZSBzel94RGJlU3dhcEJ1ZmZlcnNSZXEJOAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQ4CXJlcVR5cGU7CS8qIG1ham9yLW9wY29kZTogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAlkYmVSZXFUeXBlOwkvKiBtaW5vci1vcGNvZGU6IGFsd2F5cyBYX0RiZUJlZ2luSWRvbSAoNCkgICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIHJlcXVlc3QgbGVuZ3RoOiAoMSkgICAgICAgICAgICAgICAgICAgICAgKi8KKworfSB4RGJlQmVnaW5JZGlvbVJlcTsKKyNkZWZpbmUgc3pfeERiZUJlZ2luSWRpb21SZXEJNAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQ4CXJlcVR5cGU7CS8qIG1ham9yLW9wY29kZTogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAlkYmVSZXFUeXBlOwkvKiBtaW5vci1vcGNvZGU6IGFsd2F5cyBYX0RiZUVuZElkb20gKDUpICAgICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIHJlcXVlc3QgbGVuZ3RoOiAoMSkgICAgICAgICAgICAgICAgICAgICAgKi8KKworfSB4RGJlRW5kSWRpb21SZXE7CisjZGVmaW5lIHN6X3hEYmVFbmRJZGlvbVJlcQk0CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgICAgICovCisgICAgQ0FSRDgJZGJlUmVxVHlwZTsJLyogYWx3YXlzIFhfRGJlR2V0VmlzdWFsSW5mbyAoNikgICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIHJlcXVlc3QgbGVuZ3RoOiAoMituKSAgICAgICAgICAqLworICAgIENBUkQzMgluIEIzMjsJCS8qIG4sIG51bWJlciBvZiBkcmF3YWJsZXMgaW4gbGlzdCAqLworCit9IHhEYmVHZXRWaXN1YWxJbmZvUmVxOwkJLyogZm9sbG93ZWQgYnkgbiBkcmF3YWJsZXMgICAgICAgICovCisjZGVmaW5lIHN6X3hEYmVHZXRWaXN1YWxJbmZvUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCWVRFCXR5cGU7CQkJLyogUmVwbHk6IFhfUmVwbHkgKDEpICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDgJdW51c2VkOwkJCS8qIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CS8qIHNlcXVlbmNlIG51bWJlciAgICAgICAgICAgICAgICAgICAqLworICAgIENBUkQzMglsZW5ndGggQjMyOwkJLyogcmVwbHkgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDMyCW07CQkJLyogbSwgbnVtYmVyIG9mIHZpc3VhbCBpbmZvcyBpbiBsaXN0ICovCisgICAgQ0FSRDMyCXBhZDEgQjMyOwkJLyogdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworCit9IHhEYmVHZXRWaXN1YWxJbmZvUmVwbHk7CQkvKiBmb2xsb3dlZCBieSBtIHZpc3VhbCBpbmZvcyAgICAgICAgKi8KKyNkZWZpbmUgc3pfeERiZUdldFZpc3VhbEluZm9SZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQ4CQlyZXFUeXBlOwkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAgICAgICAqLworICAgIENBUkQ4CQlkYmVSZXFUeXBlOwkvKiBYX0RiZUdldEJhY2tCdWZmZXJBdHRyaWJ1dGVzICg3KSAqLworICAgIENBUkQxNgkJbGVuZ3RoIEIxNjsJLyogcmVxdWVzdCBsZW5ndGg6ICgyKSAgICAgICAgICAgICAgKi8KKyAgICB4RGJlQmFja0J1ZmZlcglidWZmZXIgQjMyOwkvKiBiYWNrIGJ1ZmZlciBuYW1lICAgICAgICAgICAgICAgICAqLworCit9IHhEYmVHZXRCYWNrQnVmZmVyQXR0cmlidXRlc1JlcTsKKyNkZWZpbmUgc3pfeERiZUdldEJhY2tCdWZmZXJBdHRyaWJ1dGVzUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCWVRFCXR5cGU7CQkJLyogUmVwbHk6IFhfUmVwbHkgKDEpICovCisgICAgQ0FSRDgJdW51c2VkOwkJCS8qIHVudXNlZCAgICAgICAgICAgICAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CS8qIHNlcXVlbmNlIG51bWJlciAgICAqLworICAgIENBUkQzMglsZW5ndGggQjMyOwkJLyogcmVwbHkgbGVuZ3RoOiAoMCkgICovCisgICAgQ0FSRDMyCWF0dHJpYnV0ZXM7CQkvKiBhdHRyaWJ1dGVzICAgICAgICAgKi8KKyAgICBDQVJEMzIJcGFkMSBCMzI7CQkvKiB1bnVzZWQgICAgICAgICAgICAgKi8KKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisKK30geERiZUdldEJhY2tCdWZmZXJBdHRyaWJ1dGVzUmVwbHk7CisjZGVmaW5lIHN6X3hEYmVHZXRCYWNrQnVmZmVyQXR0cmlidXRlc1JlcGx5CTMyCisKKyNlbmRpZiAvKiBEQkVfUFJPVE9fSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2RwbXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZHBtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZTk4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2RwbXMuaApAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSAxOTk2IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZS4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgRVFVSVBNRU5UIENPUlBPUkFUSU9OIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTLCBJTkNMVURJTkcsIAorQlVUIE5PVCBMSU1JVEVEIFRPIENPTlNFUVVFTlRJQUwgT1IgSU5DSURFTlRBTCBEQU1BR0VTLCBPUiBPVEhFUiBMSUFCSUxJVFksIAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiAKK0lOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIAorc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlcgorZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIERpZ2l0YWwgCitFcXVpcG1lbnQgQ29ycG9yYXRpb24uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfWDExX0VYVEVOU0lPTlNfRFBNU19ICisjZGVmaW5lIF9YMTFfRVhURU5TSU9OU19EUE1TX0ggMQorCisjaW5jbHVkZSA8WDExL1guaD4KKyNpbmNsdWRlIDxYMTEvWG1kLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvZHBtc2NvbnN0Lmg+CisKKyNpZm5kZWYgRFBNU19TRVJWRVIKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIEJvb2wgRFBNU1F1ZXJ5RXh0ZW5zaW9uKERpc3BsYXkgKiwgaW50ICosIGludCAqKTsKK2V4dGVybiBTdGF0dXMgRFBNU0dldFZlcnNpb24oRGlzcGxheSAqLCBpbnQgKiwgaW50ICopOworZXh0ZXJuIEJvb2wgRFBNU0NhcGFibGUoRGlzcGxheSAqKTsKK2V4dGVybiBTdGF0dXMgRFBNU1NldFRpbWVvdXRzKERpc3BsYXkgKiwgQ0FSRDE2LCBDQVJEMTYsIENBUkQxNik7CitleHRlcm4gQm9vbCBEUE1TR2V0VGltZW91dHMoRGlzcGxheSAqLCBDQVJEMTYgKiwgQ0FSRDE2ICosIENBUkQxNiAqKTsKK2V4dGVybiBTdGF0dXMgRFBNU0VuYWJsZShEaXNwbGF5ICopOworZXh0ZXJuIFN0YXR1cyBEUE1TRGlzYWJsZShEaXNwbGF5ICopOworZXh0ZXJuIFN0YXR1cyBEUE1TRm9yY2VMZXZlbChEaXNwbGF5ICosIENBUkQxNik7CitleHRlcm4gU3RhdHVzIERQTVNJbmZvKERpc3BsYXkgKiwgQ0FSRDE2ICosIEJPT0wgKik7CisKK19YRlVOQ1BST1RPRU5ECisjZW5kaWYKKworI2VuZGlmIC8qICFfWDExX0VYVEVOU0lPTlNfRFBNU19IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZHBtc2NvbnN0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2RwbXNjb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZjA1ODYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2RwbXNjb25zdC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIDE5OTYgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMsIElOQ0xVRElORywKK0JVVCBOT1QgTElNSVRFRCBUTyBDT05TRVFVRU5USUFMIE9SIElOQ0lERU5UQUwgREFNQUdFUywgT1IgT1RIRVIgTElBQklMSVRZLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUgorSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24KK3NoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIKK2RlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBEaWdpdGFsCitFcXVpcG1lbnQgQ29ycG9yYXRpb24uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRFBNU0NPTlNUX0gKKyNkZWZpbmUgX0RQTVNDT05TVF9IIDEKKworI2RlZmluZSBEUE1TTWFqb3JWZXJzaW9uCTEKKyNkZWZpbmUgRFBNU01pbm9yVmVyc2lvbgkxCisKKyNkZWZpbmUgRFBNU0V4dGVuc2lvbk5hbWUJIkRQTVMiCisKKyNkZWZpbmUgRFBNU01vZGVPbgkwCisjZGVmaW5lIERQTVNNb2RlU3RhbmRieQkxCisjZGVmaW5lIERQTVNNb2RlU3VzcGVuZAkyCisjZGVmaW5lIERQTVNNb2RlT2ZmCTMKKworI2VuZGlmIC8qICFfRFBNU0NPTlNUX0ggKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9kcG1zcHJvdG8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZHBtc3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmZDNmYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZHBtc3Byb3RvLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIDE5OTYgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMsIElOQ0xVRElORywKK0JVVCBOT1QgTElNSVRFRCBUTyBDT05TRVFVRU5USUFMIE9SIElOQ0lERU5UQUwgREFNQUdFUywgT1IgT1RIRVIgTElBQklMSVRZLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUgorSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24KK3NoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIKK2RlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBEaWdpdGFsCitFcXVpcG1lbnQgQ29ycG9yYXRpb24uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRFBNU1BST1RPX0hfCisjZGVmaW5lIF9EUE1TUFJPVE9fSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2RwbXNjb25zdC5oPgorCisjZGVmaW5lIFhfRFBNU0dldFZlcnNpb24JMAorI2RlZmluZSBYX0RQTVNDYXBhYmxlCQkxCisjZGVmaW5lIFhfRFBNU0dldFRpbWVvdXRzCTIKKyNkZWZpbmUgWF9EUE1TU2V0VGltZW91dHMJMworI2RlZmluZSBYX0RQTVNFbmFibGUJCTQKKyNkZWZpbmUgWF9EUE1TRGlzYWJsZQkJNQorI2RlZmluZSBYX0RQTVNGb3JjZUxldmVsICAgICAgIAk2CisjZGVmaW5lIFhfRFBNU0luZm8gICAgICAgCTcKKworI2RlZmluZSBEUE1TTnVtYmVyRXZlbnRzCTAKKworI2RlZmluZSBEUE1TTnVtYmVyRXJyb3JzCTAKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIERQTVNDb2RlICovCisgICAgQ0FSRDgJZHBtc1JlcVR5cGU7CS8qIGFsd2F5cyBYX0RQTVNHZXRWZXJzaW9uICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CW1ham9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CW1pbm9yVmVyc2lvbiBCMTY7Cit9IHhEUE1TR2V0VmVyc2lvblJlcTsKKyNkZWZpbmUgc3pfeERQTVNHZXRWZXJzaW9uUmVxIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgltYWpvclZlcnNpb24gQjE2OworICAgIENBUkQxNgltaW5vclZlcnNpb24gQjE2OworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7Cit9IHhEUE1TR2V0VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94RFBNU0dldFZlcnNpb25SZXBseSAzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIERQTVNDb2RlICovCisgICAgQ0FSRDgJZHBtc1JlcVR5cGU7CS8qIGFsd2F5cyBYX0RQTVNDYXBhYmxlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhEUE1TQ2FwYWJsZVJlcTsKKyNkZWZpbmUgc3pfeERQTVNDYXBhYmxlUmVxIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIEJPT0wJY2FwYWJsZTsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglwYWQyIEIxNjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7CisgICAgQ0FSRDMyCXBhZDcgQjMyOworfSB4RFBNU0NhcGFibGVSZXBseTsKKyNkZWZpbmUgc3pfeERQTVNDYXBhYmxlUmVwbHkgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBEUE1TQ29kZSAqLworICAgIENBUkQ4CWRwbXNSZXFUeXBlOwkvKiBhbHdheXMgWF9EUE1TR2V0VGltZW91dHMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geERQTVNHZXRUaW1lb3V0c1JlcTsKKyNkZWZpbmUgc3pfeERQTVNHZXRUaW1lb3V0c1JlcSA0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXBhZDA7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJc3RhbmRieSBCMTY7CisgICAgQ0FSRDE2CXN1c3BlbmQgQjE2OworICAgIENBUkQxNglvZmYgQjE2OworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7Cit9IHhEUE1TR2V0VGltZW91dHNSZXBseTsKKyNkZWZpbmUgc3pfeERQTVNHZXRUaW1lb3V0c1JlcGx5IDMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgRFBNU0NvZGUgKi8KKyAgICBDQVJEOAlkcG1zUmVxVHlwZTsJLyogYWx3YXlzIFhfRFBNU1NldFRpbWVvdXRzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CXN0YW5kYnkgQjE2OworICAgIENBUkQxNglzdXNwZW5kIEIxNjsKKyAgICBDQVJEMTYJb2ZmIEIxNjsKKyAgICBDQVJEMTYJcGFkMCBCMTY7Cit9IHhEUE1TU2V0VGltZW91dHNSZXE7CisjZGVmaW5lIHN6X3hEUE1TU2V0VGltZW91dHNSZXEgMTIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBEUE1TQ29kZSAqLworICAgIENBUkQ4CWRwbXNSZXFUeXBlOwkvKiBhbHdheXMgWF9EUE1TRW5hYmxlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhEUE1TRW5hYmxlUmVxOworI2RlZmluZSBzel94RFBNU0VuYWJsZVJlcSA0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgRFBNU0NvZGUgKi8KKyAgICBDQVJEOAlkcG1zUmVxVHlwZTsJLyogYWx3YXlzIFhfRFBNU0Rpc2FibGUgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geERQTVNEaXNhYmxlUmVxOworI2RlZmluZSBzel94RFBNU0Rpc2FibGVSZXEgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIERQTVNDb2RlICovCisgICAgQ0FSRDgJZHBtc1JlcVR5cGU7CS8qIGFsd2F5cyBYX0RQTVNGb3JjZUxldmVsICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWxldmVsIEIxNjsJLyogcG93ZXIgbGV2ZWwgcmVxdWVzdGVkICovCisgICAgQ0FSRDE2CXBhZDAgQjE2OworfSB4RFBNU0ZvcmNlTGV2ZWxSZXE7CisjZGVmaW5lIHN6X3hEUE1TRm9yY2VMZXZlbFJlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgRFBNU0NvZGUgKi8KKyAgICBDQVJEOAlkcG1zUmVxVHlwZTsJLyogYWx3YXlzIFhfRFBNU0luZm8gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geERQTVNJbmZvUmVxOworI2RlZmluZSBzel94RFBNU0luZm9SZXEgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CXBvd2VyX2xldmVsIEIxNjsKKyAgICBCT09MCXN0YXRlOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geERQTVNJbmZvUmVwbHk7CisjZGVmaW5lIHN6X3hEUE1TSW5mb1JlcGx5IDMyCisKKyNlbmRpZiAvKiBfRFBNU1BST1RPX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2V4dHV0aWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZXh0dXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMWM1MjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2V4dHV0aWwuaApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKyAqCisgKiBBdXRob3I6ICBKaW0gRnVsdG9uLCBNSVQgVGhlIE9wZW4gR3JvdXAKKyAqIAorICogICAgICAgICAgICAgICAgICAgICBYbGliIEV4dGVuc2lvbi1Xcml0aW5nIFV0aWxpdGllcworICoKKyAqIFRoaXMgcGFja2FnZSBjb250YWlucyB1dGlsaXRpZXMgZm9yIHdyaXRpbmcgdGhlIGNsaWVudCBBUEkgZm9yIHZhcmlvdXMKKyAqIHByb3RvY29sIGV4dGVuc2lvbnMuICBUSEVTRSBJTlRFUkZBQ0VTIEFSRSBOT1QgUEFSVCBPRiBUSEUgWCBTVEFOREFSRCBBTkQKKyAqIEFSRSBTVUJKRUNUIFRPIENIQU5HRSEKKyAqLworCisjaWZuZGVmIF9FWFRVVElMX0hfCisjZGVmaW5lIF9FWFRVVElMX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YZXh0Lmg+CisKKy8qCisgKiBXZSBuZWVkIHRvIGtlZXAgYSBsaXN0IG9mIG9wZW4gZGlzcGxheXMgc2luY2UgdGhlIFhsaWIgZGlzcGxheSBsaXN0IGlzbid0CisgKiBwdWJsaWMuICBXZSBhbHNvIGhhdmUgdG8gcGVyLWRpc3BsYXkgaW5mbyBpbiBhIHNlcGFyYXRlIGJsb2NrIHNpbmNlIGl0IGlzbid0CisgKiBzdG9yZWQgZGlyZWN0bHkgaW4gdGhlIERpc3BsYXkgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBfWEV4dERpc3BsYXlJbmZvIHsKKyAgICBzdHJ1Y3QgX1hFeHREaXNwbGF5SW5mbyAqbmV4dDsJLyoga2VlcCBhIGxpbmtlZCBsaXN0ICovCisgICAgRGlzcGxheSAqZGlzcGxheTsJCQkvKiB3aGljaCBkaXNwbGF5IHRoaXMgaXMgKi8KKyAgICBYRXh0Q29kZXMgKmNvZGVzOwkJCS8qIHRoZSBleHRlbnNpb24gcHJvdG9jb2wgY29kZXMgKi8KKyAgICBYUG9pbnRlciBkYXRhOwkJCS8qIGV4dHJhIGRhdGEgZm9yIGV4dGVuc2lvbiB0byB1c2UgKi8KK30gWEV4dERpc3BsYXlJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfWEV4dGVuc2lvbkluZm8geworICAgIFhFeHREaXNwbGF5SW5mbyAqaGVhZDsJCS8qIHN0YXJ0IG9mIGxpc3QgKi8KKyAgICBYRXh0RGlzcGxheUluZm8gKmN1cjsJCS8qIG1vc3QgcmVjZW50bHkgdXNlZCAqLworICAgIGludCBuZGlzcGxheXM7CQkJLyogbnVtYmVyIG9mIGRpc3BsYXlzICovCit9IFhFeHRlbnNpb25JbmZvOworCit0eXBlZGVmIHN0cnVjdCBfWEV4dGVuc2lvbkhvb2tzIHsKKyAgICBpbnQgKCpjcmVhdGVfZ2MpKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKwkgICAgICBHQwkJCS8qIGdjICovLAorCSAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCispOworICAgIGludCAoKmNvcHlfZ2MpKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgR0MJCQkvKiBnYyAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyk7CisgICAgaW50ICgqZmx1c2hfZ2MpKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgR0MJCQkvKiBnYyAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyk7CisgICAgaW50ICgqZnJlZV9nYykoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBHQwkJCS8qIGdjICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworKTsKKyAgICBpbnQgKCpjcmVhdGVfZm9udCkoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBYRm9udFN0cnVjdCoJCS8qIGZzICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworKTsKKyAgICBpbnQgKCpmcmVlX2ZvbnQpKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgWEZvbnRTdHJ1Y3QqCQkvKiBmcyAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyk7CisgICAgaW50ICgqY2xvc2VfZGlzcGxheSkoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworKTsKKyAgICBCb29sICgqd2lyZV90b19ldmVudCkoCisJICAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgIFhFdmVudCoJCQkvKiByZSAqLywKKyAgICAgICAgICAgICAgIHhFdmVudCoJCQkvKiBldmVudCAqLworKTsKKyAgICBTdGF0dXMgKCpldmVudF90b193aXJlKSgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIFhFdmVudCoJCQkvKiByZSAqLywKKyAgICAgICAgICAgICAgeEV2ZW50KgkJCS8qIGV2ZW50ICovCispOworICAgIGludCAoKmVycm9yKSgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIHhFcnJvcioJCQkvKiBlcnIgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovLAorICAgICAgICAgICAgICBpbnQqCQkJLyogcmV0X2NvZGUgKi8KKyk7CisgICAgY2hhciAqKCplcnJvcl9zdHJpbmcpKAorCSAgICAgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgICAgaW50CQkJLyogY29kZSAqLywKKyAgICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLywKKyAgICAgICAgICAgICAgICBjaGFyKgkJCS8qIGJ1ZmZlciAqLywKKyAgICAgICAgICAgICAgICBpbnQJCQkvKiBuYnl0ZXMgKi8KKyk7Cit9IFhFeHRlbnNpb25Ib29rczsKKworZXh0ZXJuIFhFeHRlbnNpb25JbmZvICpYZXh0Q3JlYXRlRXh0ZW5zaW9uKAorICAgIHZvaWQKKyk7CitleHRlcm4gdm9pZCBYZXh0RGVzdHJveUV4dGVuc2lvbigKKyAgICBYRXh0ZW5zaW9uSW5mbyoJLyogaW5mbyAqLworKTsKK2V4dGVybiBYRXh0RGlzcGxheUluZm8gKlhleHRBZGREaXNwbGF5KAorICAgIFhFeHRlbnNpb25JbmZvKgkvKiBleHRpbmZvICovLAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgY2hhcioJCS8qIGV4dF9uYW1lICovLAorICAgIFhFeHRlbnNpb25Ib29rcyoJLyogaG9va3MgKi8sCisgICAgaW50CQkJLyogbmV2ZW50cyAqLywKKyAgICBYUG9pbnRlcgkJLyogZGF0YSAqLworKTsKK2V4dGVybiBpbnQgWGV4dFJlbW92ZURpc3BsYXkoCisgICAgWEV4dGVuc2lvbkluZm8qCS8qIGV4dGluZm8gKi8sCisgICAgRGlzcGxheSoJCS8qIGRweSAqLworKTsKK2V4dGVybiBYRXh0RGlzcGxheUluZm8gKlhleHRGaW5kRGlzcGxheSgKKyAgICBYRXh0ZW5zaW9uSW5mbyoJLyogZXh0aW5mbyAqLywKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovCispOworCisjZGVmaW5lIFhleHRIYXNFeHRlbnNpb24oaSkgKChpKSAmJiAoKGkpLT5jb2RlcykpCisjZGVmaW5lIFhleHRDaGVja0V4dGVuc2lvbihkcHksaSxuYW1lLHZhbCkgXAorICBpZiAoIVhleHRIYXNFeHRlbnNpb24oaSkpIHsgWE1pc3NpbmdFeHRlbnNpb24gKGRweSwgbmFtZSk7IHJldHVybiB2YWw7IH0KKyNkZWZpbmUgWGV4dFNpbXBsZUNoZWNrRXh0ZW5zaW9uKGRweSxpLG5hbWUpIFwKKyAgaWYgKCFYZXh0SGFzRXh0ZW5zaW9uKGkpKSB7IFhNaXNzaW5nRXh0ZW5zaW9uIChkcHksIG5hbWUpOyByZXR1cm47IH0KKworCisvKgorICogaGVscGVyIG1hY3JvcyB0byBnZW5lcmF0ZSBjb2RlIHRoYXQgaXMgY29tbW9uIHRvIGFsbCBleHRlbnNpb25zOyBjYWxsZXIKKyAqIHNob3VsZCBwcmVmaXggaXQgd2l0aCBzdGF0aWMgaWYgZXh0ZW5zaW9uIHNvdXJjZSBpcyBpbiBvbmUgZmlsZTsgdGhpcworICogY291bGQgYmUgYSB1dGlsaXR5IGZ1bmN0aW9uLCBidXQgaGF2ZSB0byBzdGFjayA2IHVudXNlZCBhcmd1bWVudHMgZm9yIAorICogc29tZXRoaW5nIHRoYXQgaXMgY2FsbGVkIG1hbnksIG1hbnkgdGltZXMgd291bGQgYmUgYmFkLgorICovCisjZGVmaW5lIFhFWFRfR0VORVJBVEVfRklORF9ESVNQTEFZKHByb2MsZXh0aW5mbyxleHRuYW1lLGhvb2tzLG5ldixkYXRhKSBcCitYRXh0RGlzcGxheUluZm8gKnByb2MgKERpc3BsYXkgKmRweSkgXAoreyBcCisgICAgWEV4dERpc3BsYXlJbmZvICpkcHlpbmZvOyBcCisgICAgaWYgKCFleHRpbmZvKSB7IGlmICghKGV4dGluZm8gPSBYZXh0Q3JlYXRlRXh0ZW5zaW9uKCkpKSByZXR1cm4gTlVMTDsgfSBcCisgICAgaWYgKCEoZHB5aW5mbyA9IFhleHRGaW5kRGlzcGxheSAoZXh0aW5mbywgZHB5KSkpIFwKKyAgICAgIGRweWluZm8gPSBYZXh0QWRkRGlzcGxheSAoZXh0aW5mbyxkcHksZXh0bmFtZSxob29rcyxuZXYsZGF0YSk7IFwKKyAgICByZXR1cm4gZHB5aW5mbzsgXAorfQorCisjZGVmaW5lIFhFWFRfRklORF9ESVNQTEFZX1BST1RPKHByb2MpIFwKKwlYRXh0RGlzcGxheUluZm8gKnByb2MoRGlzcGxheSAqZHB5KQorCisjZGVmaW5lIFhFWFRfR0VORVJBVEVfQ0xPU0VfRElTUExBWShwcm9jLGV4dGluZm8pIFwKK2ludCBwcm9jIChEaXNwbGF5ICpkcHksIFhFeHRDb2RlcyAqY29kZXMpIFwKK3sgXAorICAgIHJldHVybiBYZXh0UmVtb3ZlRGlzcGxheSAoZXh0aW5mbywgZHB5KTsgXAorfQorCisjZGVmaW5lIFhFWFRfQ0xPU0VfRElTUExBWV9QUk9UTyhwcm9jKSBcCisJaW50IHByb2MoRGlzcGxheSAqZHB5LCBYRXh0Q29kZXMgKmNvZGVzKQorCisjZGVmaW5lIFhFWFRfR0VORVJBVEVfRVJST1JfU1RSSU5HKHByb2MsZXh0bmFtZSxuZXJyLGVycmwpIFwKK2NoYXIgKnByb2MgKERpc3BsYXkgKmRweSwgaW50IGNvZGUsIFhFeHRDb2RlcyAqY29kZXMsIGNoYXIgKmJ1ZiwgaW50IG4pIFwKK3sgIFwKKyAgICBjb2RlIC09IGNvZGVzLT5maXJzdF9lcnJvcjsgIFwKKyAgICBpZiAoY29kZSA+PSAwICYmIGNvZGUgPCBuZXJyKSB7IFwKKwljaGFyIHRtcFsyNTZdOyBcCisJc3ByaW50ZiAodG1wLCAiJXMuJWQiLCBleHRuYW1lLCBjb2RlKTsgXAorCVhHZXRFcnJvckRhdGFiYXNlVGV4dCAoZHB5LCAiWFByb3RvRXJyb3IiLCB0bXAsIGVycmxbY29kZV0sIGJ1Ziwgbik7IFwKKwlyZXR1cm4gYnVmOyBcCisgICAgfSBcCisgICAgcmV0dXJuIChjaGFyICopMDsgXAorfQorCisjZGVmaW5lIFhFWFRfRVJST1JfU1RSSU5HX1BST1RPKHByb2MpIFwKKwljaGFyICpwcm9jKERpc3BsYXkgKmRweSwgaW50IGNvZGUsIFhFeHRDb2RlcyAqY29kZXMsIGNoYXIgKmJ1ZiwgaW50IG4pCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZ2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2ExZDhhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9nZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwNy0yMDA4IFBldGVyIEh1dHRlcmVyCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFBldGVyIEh1dHRlcmVyLCBVbml2ZXJzaXR5IG9mIFNvdXRoIEF1c3RyYWxpYSwgTklDVEEKKyAqCisgKi8KKworI2lmbmRlZiBfR0VfSF8KKyNkZWZpbmUgX0dFX0hfCisKKyNkZWZpbmUgR0VfTkFNRSAgICAgICAgICJHZW5lcmljIEV2ZW50IEV4dGVuc2lvbiIKKyNkZWZpbmUgR0VfTUFKT1IgICAgICAgIDEKKyNkZWZpbmUgR0VfTUlOT1IgICAgICAgIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJlcXVlc3RzCisgKgorICovCisKKyNkZWZpbmUgWF9HRVF1ZXJ5VmVyc2lvbiAgICAgICAgMAorCisjZGVmaW5lIEdFTnVtYmVyUmVxdWVzdHMgICAgICAgKFhfR0VRdWVyeVZlcnNpb24gKyAxKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRXZlbnRzCisgKgorICovCisKKyNkZWZpbmUgR0VOdW1iZXJFdmVudHMgICAgICAgIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEVycm9ycworICoKKyAqLworCisjZGVmaW5lIEdFTnVtYmVyRXJyb3JzICAgICAgICAwCisKKyNlbmRpZiAvKiBfR0VfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZ2Vwcm90by5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9nZXByb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4NjBkZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZ2Vwcm90by5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwNy0yMDA4IFBldGVyIEh1dHRlcmVyCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFBldGVyIEh1dHRlcmVyLCBVbml2ZXJzaXR5IG9mIFNvdXRoIEF1c3RyYWxpYSwgTklDVEEKKyAqCisgKi8KKworI2lmbmRlZiBfR0VQUk9UT19IXworI2RlZmluZSBfR0VQUk9UT19IXworCisjaW5jbHVkZTxYMTEvWHByb3RvLmg+CisjaW5jbHVkZTxYMTEvWC5oPgorI2luY2x1ZGU8WDExL2V4dGVuc2lvbnMvZ2UuaD4KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUHJvdG9jb2wgcmVxdWVzdCBjb25zdGFudHMKKyAqCisgKi8KKworI2RlZmluZSBYX0dFR2V0RXh0ZW5zaW9uVmVyc2lvbiAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBYR0UgcHJvdG9jb2wgcmVxdWVzdHMvcmVwbGllcworICoKKyAqLworCisvKiBnZW5lcmljIHJlcXVlc3QgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICBSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKK30geEdFUmVxOworCisKKy8qIFF1ZXJ5VmVyc2lvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7ICAgICAgIC8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICAgKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAvKiBhbHdheXMgWF9HRVF1ZXJ5VmVyc2lvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNiAgICAgIG1ham9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2ICAgICAgbWlub3JWZXJzaW9uIEIxNjsKK30geEdFUXVlcnlWZXJzaW9uUmVxOworCisjZGVmaW5lIHN6X3hHRVF1ZXJ5VmVyc2lvblJlcSAgICA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5CQkJKi8KKyAgICBDQVJEOAlSZXBUeXBlOwkvKiBhbHdheXMgWF9HRVF1ZXJ5VmVyc2lvbiAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CW1ham9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CW1pbm9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDMyCXBhZDAwIEIzMjsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworfSB4R0VRdWVyeVZlcnNpb25SZXBseTsKKworI2RlZmluZSBzel94R0VRdWVyeVZlcnNpb25SZXBseSAgICAzMgorCisjZW5kaWYgLyogX0dFUFJPVE9fSF8gKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkMjRmZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkyIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE5DRC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE5DRC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQorICogc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCisgKiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBOQ0QuIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBOQ0QuCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX0xCWF9IXworI2RlZmluZSBfTEJYX0hfCisKKyNkZWZpbmUgTEJYTkFNRSAiTEJYIgorCisjZGVmaW5lIExCWF9NQUpPUl9WRVJTSU9OCTEKKyNkZWZpbmUgTEJYX01JTk9SX1ZFUlNJT04JMAorCisjZGVmaW5lIExieE51bWJlclJlcXMJCQk0NAorI2RlZmluZSBMYnhFdmVudAkJCTAKKyNkZWZpbmUgTGJ4UXVpY2tNb3Rpb25EZWx0YUV2ZW50CTEKKyNkZWZpbmUgTGJ4TnVtYmVyRXZlbnRzCQkJMgorCisvKiBUaGlzIGlzIGFsd2F5cyB0aGUgbWFzdGVyIGNsaWVudCAqLworI2RlZmluZSBMYnhNYXN0ZXJDbGllbnRJbmRleAkJMAorCisvKiBMYnhFdmVudCBsYnhUeXBlIHN1Yi1maWVsZHMgKi8KKyNkZWZpbmUgTGJ4U3dpdGNoRXZlbnQJCQkwCisjZGVmaW5lIExieENsb3NlRXZlbnQJCQkxCisjZGVmaW5lIExieERlbHRhRXZlbnQJCQkyCisjZGVmaW5lIExieEludmFsaWRhdGVUYWdFdmVudAkJMworI2RlZmluZSBMYnhTZW5kVGFnRGF0YUV2ZW50CQk0CisjZGVmaW5lIExieExpc3RlblRvT25lCQkJNQorI2RlZmluZSBMYnhMaXN0ZW5Ub0FsbAkJCTYKKyNkZWZpbmUgTGJ4TW90aW9uRGVsdGFFdmVudAkJNworI2RlZmluZSBMYnhSZWxlYXNlQ21hcEV2ZW50CQk4CisjZGVmaW5lIExieEZyZWVDZWxsc0V2ZW50CQk5CisKKy8qCisgKiBMYnggaW1hZ2UgY29tcHJlc3Npb24gbWV0aG9kcworICoKKyAqIE5vIGNvbXByZXNzaW9uIGlzIGFsd2F5cyBhc3NpZ25lZCB0aGUgdmFsdWUgb2YgMC4KKyAqCisgKiBUaGUgcmVzdCBvZiB0aGUgY29tcHJlc3Npb24gbWV0aG9kIG9wY29kZXMgYXJlIGFzc2lnbmVkIGR5bmFtaWNhbGx5CisgKiBhdCBvcHRpb24gbmVnb3RpYXRpb24gdGltZS4KKyAqLworCisjZGVmaW5lIExieEltYWdlQ29tcHJlc3NOb25lCQkwCisKKworI2RlZmluZSBCYWRMYnhDbGllbnQJCQkwCisjZGVmaW5lIExieE51bWJlckVycm9ycwkJCShCYWRMYnhDbGllbnQgKyAxKQorCisvKiB0YWdnZWQgZGF0YSB0eXBlcyAqLworI2RlZmluZQlMYnhUYWdUeXBlTW9kbWFwCQkxCisjZGVmaW5lCUxieFRhZ1R5cGVLZXltYXAJCTIKKyNkZWZpbmUJTGJ4VGFnVHlwZVByb3BlcnR5CQkzCisjZGVmaW5lCUxieFRhZ1R5cGVGb250CQkJNAorI2RlZmluZQlMYnhUYWdUeXBlQ29ubkluZm8JCTUKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2xieHByb3RvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2xieHByb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhZTYyYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4cHJvdG8uaApAQCAtMCwwICsxLDk3NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTkyIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE5DRC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE5DRC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQorICogc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCisgKiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBOQ0QuIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBOQ0QuCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX0xCWFBST1RPX0hfCisjZGVmaW5lIF9MQlhQUk9UT19IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvbGJ4Lmg+CisvKgorICogTk9URTogIGFueSBjaGFuZ2VzIG9yIGFkZGl0aW9ucyB0byB0aGUgb3Bjb2RlcyBuZWVkcyB0byBiZSByZWZsZWN0ZWQKKyAqIGluIHRoZSBsYnhDYWNoZWFibGUgYXJyYXkgaW4gWHNlcnZlci9sYngvbGJ4bWFpbi5jCisgKi8KKworI2RlZmluZSBYX0xieFF1ZXJ5VmVyc2lvbgkJMAorI2RlZmluZSBYX0xieFN0YXJ0UHJveHkJCQkxCisjZGVmaW5lIFhfTGJ4U3RvcFByb3h5CQkJMgorI2RlZmluZSBYX0xieFN3aXRjaAkJCTMKKyNkZWZpbmUgWF9MYnhOZXdDbGllbnQJCQk0CisjZGVmaW5lIFhfTGJ4Q2xvc2VDbGllbnQJCTUKKyNkZWZpbmUgWF9MYnhNb2RpZnlTZXF1ZW5jZQkJNgorI2RlZmluZSBYX0xieEFsbG93TW90aW9uCQk3CisjZGVmaW5lIFhfTGJ4SW5jcmVtZW50UGl4ZWwJCTgKKyNkZWZpbmUgWF9MYnhEZWx0YQkJCTkKKyNkZWZpbmUJWF9MYnhHZXRNb2RpZmllck1hcHBpbmcJCTEwCisjZGVmaW5lCVhfTGJ4SW52YWxpZGF0ZVRhZwkJMTIKKyNkZWZpbmUgWF9MYnhQb2x5UG9pbnQJCQkxMworI2RlZmluZSBYX0xieFBvbHlMaW5lCQkJMTQKKyNkZWZpbmUgWF9MYnhQb2x5U2VnbWVudAkJMTUKKyNkZWZpbmUgWF9MYnhQb2x5UmVjdGFuZ2xlCQkxNgorI2RlZmluZSBYX0xieFBvbHlBcmMJCQkxNworI2RlZmluZSBYX0xieEZpbGxQb2x5CQkJMTgKKyNkZWZpbmUgWF9MYnhQb2x5RmlsbFJlY3RhbmdsZQkJMTkKKyNkZWZpbmUgWF9MYnhQb2x5RmlsbEFyYwkJMjAKKyNkZWZpbmUJWF9MYnhHZXRLZXlib2FyZE1hcHBpbmcJCTIxCisjZGVmaW5lCVhfTGJ4UXVlcnlGb250CQkJMjIKKyNkZWZpbmUJWF9MYnhDaGFuZ2VQcm9wZXJ0eQkJMjMKKyNkZWZpbmUJWF9MYnhHZXRQcm9wZXJ0eQkJMjQKKyNkZWZpbmUJWF9MYnhUYWdEYXRhCQkJMjUKKworI2RlZmluZSBYX0xieENvcHlBcmVhCQkJMjYKKyNkZWZpbmUgWF9MYnhDb3B5UGxhbmUJCQkyNworI2RlZmluZSBYX0xieFBvbHlUZXh0OAkJCTI4CisjZGVmaW5lIFhfTGJ4UG9seVRleHQxNgkJCTI5CisjZGVmaW5lIFhfTGJ4SW1hZ2VUZXh0OAkJCTMwCisjZGVmaW5lIFhfTGJ4SW1hZ2VUZXh0MTYJCTMxCisKKyNkZWZpbmUgWF9MYnhRdWVyeUV4dGVuc2lvbgkJMzIKKyNkZWZpbmUgWF9MYnhQdXRJbWFnZQkJCTMzCisjZGVmaW5lIFhfTGJ4R2V0SW1hZ2UJCQkzNAorCisjZGVmaW5lIFhfTGJ4QmVnaW5MYXJnZVJlcXVlc3QJCTM1CisjZGVmaW5lIFhfTGJ4TGFyZ2VSZXF1ZXN0RGF0YQkJMzYKKyNkZWZpbmUgWF9MYnhFbmRMYXJnZVJlcXVlc3QJCTM3CisKKyNkZWZpbmUgWF9MYnhJbnRlcm5BdG9tcwkJMzgKKyNkZWZpbmUgWF9MYnhHZXRXaW5BdHRyQW5kR2VvbQkJMzkKKworI2RlZmluZSBYX0xieEdyYWJDbWFwCQkJNDAKKyNkZWZpbmUgWF9MYnhSZWxlYXNlQ21hcAkJNDEKKyNkZWZpbmUgWF9MYnhBbGxvY0NvbG9yCQkJNDIKKworI2RlZmluZSBYX0xieFN5bmMJCQk0MworCisvKgorICogUmVkZWZpbmUgc29tZSBiYXNpYyB0eXBlcyB1c2VkIGJ5IHN0cnVjdHVyZXMgZGVmaW5lZCBoZXJlaW4uICBUaGlzIHJlbW92ZXMKKyAqIGFueSBwb3NzaWJpbGl0eSBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcyBvZiBvbmUgZW50aXR5IHZpZXdpbmcgY29tbXVuaWNhdGVkCisgKiBkYXRhIGFzIDMyLWJpdCBxdWFudGl0aWVzIGFuZCBhbm90aGVyIGVudGl0eSB2aWV3aW5nIHRoZSBzYW1lIGRhdGEgYXMgNjQtYml0CisgKiBxdWFudGl0aWVzLgorICovCisjZGVmaW5lIFhJRCBDQVJEMzIKKyNkZWZpbmUgQXRvbSBDQVJEMzIKKyNkZWZpbmUgQ29sb3JtYXAgQ0FSRDMyCisjZGVmaW5lIERyYXdhYmxlIENBUkQzMgorI2RlZmluZSBWaXN1YWxJRCBDQVJEMzIKKyNkZWZpbmUgV2luZG93IENBUkQzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTAlzdWNjZXNzOwkJLyogVFJVRSAqLworICAgIEJPT0wJY2hhbmdlVHlwZTsKKyAgICBDQVJEMTYJbWFqb3JWZXJzaW9uIEIxNiwKKwkJbWlub3JWZXJzaW9uIEIxNjsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJCS8qIDEvNCBhZGRpdGlvbmFsIGJ5dGVzIGluIHNldHVwIGluZm8gKi8KKyAgICBDQVJEMzIJdGFnIEIzMjsKK30geExieENvbm5TZXR1cFByZWZpeDsKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFF1ZXJ5VmVyc2lvbiB7CisgICAgQ0FSRDgJcmVxVHlwZTsJCS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJCS8qIGFsd2F5cyBYX0xieFF1ZXJ5VmVyc2lvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworfSB4TGJ4UXVlcnlWZXJzaW9uUmVxOworI2RlZmluZSBzel94TGJ4UXVlcnlWZXJzaW9uUmVxCTQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJdW51c2VkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CW1ham9yVmVyc2lvbiBCMTY7CS8qIG1ham9yIHZlcnNpb24gb2YgTEJYIHByb3RvY29sICovCisgICAgQ0FSRDE2CW1pbm9yVmVyc2lvbiBCMTY7CS8qIG1pbm9yIHZlcnNpb24gb2YgTEJYIHByb3RvY29sICovCisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geExieFF1ZXJ5VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94TGJ4UXVlcnlWZXJzaW9uUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFN0YXJ0UHJveHkgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4U3RhcnRQcm94eSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworfSB4TGJ4U3RhcnRQcm94eVJlcTsKKyNkZWZpbmUgc3pfeExieFN0YXJ0UHJveHlSZXEJICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFN0b3BQcm94eSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhTdG9wUHJveHkgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geExieFN0b3BQcm94eVJlcTsKKyNkZWZpbmUgc3pfeExieFN0b3BQcm94eVJlcQkgICAgNAorCit0eXBlZGVmIHN0cnVjdCBfTGJ4U3dpdGNoIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieFN3aXRjaCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgljbGllbnQgQjMyOwkvKiBuZXcgY2xpZW50ICovCit9IHhMYnhTd2l0Y2hSZXE7CisjZGVmaW5lIHN6X3hMYnhTd2l0Y2hSZXEJOAorCit0eXBlZGVmIHN0cnVjdCBfTGJ4TmV3Q2xpZW50IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieE5ld0NsaWVudCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgljbGllbnQgQjMyOwkvKiBuZXcgY2xpZW50ICovCit9IHhMYnhOZXdDbGllbnRSZXE7CisjZGVmaW5lIHN6X3hMYnhOZXdDbGllbnRSZXEJOAorCit0eXBlZGVmIHN0cnVjdCBfTGJ4Q2xvc2VDbGllbnQgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4Q2xvc2VDbGllbnQgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJY2xpZW50IEIzMjsJLyogbmV3IGNsaWVudCAqLworfSB4TGJ4Q2xvc2VDbGllbnRSZXE7CisjZGVmaW5lIHN6X3hMYnhDbG9zZUNsaWVudFJlcQk4CisKK3R5cGVkZWYgc3RydWN0IF9MYnhNb2RpZnlTZXF1ZW5jZSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhNb2RpZnlTZXF1ZW5jZSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMglhZGp1c3QgQjMyOworfSB4TGJ4TW9kaWZ5U2VxdWVuY2VSZXE7CisjZGVmaW5lIHN6X3hMYnhNb2RpZnlTZXF1ZW5jZVJlcSAgICA4CisKK3R5cGVkZWYgc3RydWN0IF9MYnhBbGxvd01vdGlvbiB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhBbGxvd01vdGlvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgludW0gQjMyOworfSB4TGJ4QWxsb3dNb3Rpb25SZXE7CisjZGVmaW5lIHN6X3hMYnhBbGxvd01vdGlvblJlcSAgICA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEdyYWJDbWFwICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAJY21hcCBCMzI7Cit9IHhMYnhHcmFiQ21hcFJlcTsKKyNkZWZpbmUgc3pfeExieEdyYWJDbWFwUmVxCTgKKworI2RlZmluZSBMQlhfU01BUlRfR1JBQgkJMHg4MAorI2RlZmluZSBMQlhfQVVUT19SRUxFQVNFCTB4NDAKKyNkZWZpbmUgTEJYXzNDSEFOTkVMUwkJMHgyMAorI2RlZmluZSBMQlhfMkJZVEVfUElYRUxTCTB4MTAKKyNkZWZpbmUgTEJYX1JHQl9CSVRTX01BU0sJMHgwZgorCisjZGVmaW5lIExCWF9MSVNUX0VORAkJMAorI2RlZmluZSBMQlhfUElYRUxfUFJJVkFURQkxCisjZGVmaW5lIExCWF9QSVhFTF9TSEFSRUQJMgorI2RlZmluZSBMQlhfUElYRUxfUkFOR0VfUFJJVkFURQkzCisjZGVmaW5lIExCWF9QSVhFTF9SQU5HRV9TSEFSRUQJNAorI2RlZmluZSBMQlhfTkVYVF9DSEFOTkVMCTUKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJZmxhZ3M7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMTY7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIxNjsKK30geExieEdyYWJDbWFwUmVwbHk7CisjZGVmaW5lIHN6X3hMYnhHcmFiQ21hcFJlcGx5CTMyCisjZGVmaW5lIHN6X3hMYnhHcmFiQ21hcFJlcGx5SGRyCTgKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhSZWxlYXNlQ21hcCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENvbG9ybWFwCWNtYXAgQjMyOworfSB4TGJ4UmVsZWFzZUNtYXBSZXE7CisjZGVmaW5lIHN6X3hMYnhSZWxlYXNlQ21hcFJlcQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEFsbG9jQ29sb3IgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDb2xvcm1hcAljbWFwIEIzMjsKKyAgICBDQVJEMzIJcGl4ZWwgQjMyOworICAgIENBUkQxNglyZWQgQjE2LCBncmVlbiBCMTYsIGJsdWUgQjE2OworICAgIENBUkQxNglwYWQgQjE2OworfSB4TGJ4QWxsb2NDb2xvclJlcTsKKyNkZWZpbmUgc3pfeExieEFsbG9jQ29sb3JSZXEJMjAKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEluY3JlbWVudFBpeGVsIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEluY3JlbWVudFBpeGVsICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCWNtYXAgQjMyOworICAgIENBUkQzMglwaXhlbCBCMzI7Cit9IHhMYnhJbmNyZW1lbnRQaXhlbFJlcTsKKyNkZWZpbmUgc3pfeExieEluY3JlbWVudFBpeGVsUmVxICAgIDEyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhEZWx0YSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhEZWx0YSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWRpZmZzOwkJLyogbnVtYmVyIG9mIGRpZmZzICovCisgICAgQ0FSRDgJY2luZGV4OwkJLyogY2FjaGUgaW5kZXggKi8KKwkJCQkvKiBsaXN0IG9mIGRpZmZzIGZvbGxvd3MgKi8KK30geExieERlbHRhUmVxOworI2RlZmluZSBzel94TGJ4RGVsdGFSZXEgICAgNgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4R2V0TW9kaWZpZXJNYXBwaW5nIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEdldE1vZGlmaWVyTWFwcGluZyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworfSB4TGJ4R2V0TW9kaWZpZXJNYXBwaW5nUmVxOworI2RlZmluZQlzel94TGJ4R2V0TW9kaWZpZXJNYXBwaW5nUmVxCTQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJa2V5c3Blcm1vZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMgl0YWcgQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhMYnhHZXRNb2RpZmllck1hcHBpbmdSZXBseTsKKyNkZWZpbmUgc3pfeExieEdldE1vZGlmaWVyTWFwcGluZ1JlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhHZXRLZXlib2FyZE1hcHBpbmcgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4R2V0S2V5Ym9hcmRNYXBwaW5nICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgS2V5Q29kZQlmaXJzdEtleUNvZGU7CisgICAgQ0FSRDgJY291bnQ7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworfSB4TGJ4R2V0S2V5Ym9hcmRNYXBwaW5nUmVxOworI2RlZmluZQlzel94TGJ4R2V0S2V5Ym9hcmRNYXBwaW5nUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJa2V5c3BlcmtleWNvZGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJdGFnIEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworfSB4TGJ4R2V0S2V5Ym9hcmRNYXBwaW5nUmVwbHk7CisjZGVmaW5lIHN6X3hMYnhHZXRLZXlib2FyZE1hcHBpbmdSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4UXVlcnlGb250IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieFF1ZXJ5Rm9udCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMglmaWQgQjMyOworfSB4TGJ4UXVlcnlGb250UmVxOworI2RlZmluZQlzel94TGJ4UXVlcnlGb250UmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEludGVybkF0b21zIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEludGVybkF0b21zICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CW51bSBCMTY7Cit9IHhMYnhJbnRlcm5BdG9tc1JlcTsKKyNkZWZpbmUgc3pfeExieEludGVybkF0b21zUmVxCTYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAl1bnVzZWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJYXRvbXNTdGFydCBCMzI7CisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geExieEludGVybkF0b21zUmVwbHk7CisjZGVmaW5lIHN6X3hMYnhJbnRlcm5BdG9tc1JlcGx5CQkzMgorI2RlZmluZSBzel94TGJ4SW50ZXJuQXRvbXNSZXBseUhkcgk4CisKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEdldFdpbkF0dHJBbmRHZW9tIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEdldFdpbkF0dHJBbmRHZW9tICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCWlkIEIzMjsJCS8qIHdpbmRvdyBpZCAqLworfSB4TGJ4R2V0V2luQXR0ckFuZEdlb21SZXE7CisjZGVmaW5lIHN6X3hMYnhHZXRXaW5BdHRyQW5kR2VvbVJlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggYmFja2luZ1N0b3JlOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CS8qIE5PVCAwOyB0aGlzIGlzIGFuIGV4dHJhLWxhcmdlIHJlcGx5ICovCisgICAgVmlzdWFsSUQgdmlzdWFsSUQgQjMyOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEMTYgY19jbGFzcyBCMTY7CisjZWxzZQorICAgIENBUkQxNiBjbGFzcyBCMTY7CisjZW5kaWYKKyAgICBDQVJEOCBiaXRHcmF2aXR5OworICAgIENBUkQ4IHdpbkdyYXZpdHk7CisgICAgQ0FSRDMyIGJhY2tpbmdCaXRQbGFuZXMgQjMyOworICAgIENBUkQzMiBiYWNraW5nUGl4ZWwgQjMyOworICAgIEJPT0wgc2F2ZVVuZGVyOworICAgIEJPT0wgbWFwSW5zdGFsbGVkOworICAgIENBUkQ4IG1hcFN0YXRlOworICAgIEJPT0wgb3ZlcnJpZGU7CisgICAgQ29sb3JtYXAgY29sb3JtYXAgQjMyOworICAgIENBUkQzMiBhbGxFdmVudE1hc2tzIEIzMjsKKyAgICBDQVJEMzIgeW91ckV2ZW50TWFzayBCMzI7CisgICAgQ0FSRDE2IGRvTm90UHJvcGFnYXRlTWFzayBCMTY7CisgICAgQ0FSRDE2IHBhZDEgQjE2OworICAgIFdpbmRvdyByb290IEIzMjsKKyAgICBJTlQxNiB4IEIxNiwgeSBCMTY7CisgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKyAgICBDQVJEMTYgYm9yZGVyV2lkdGggQjE2OworICAgIENBUkQ4IGRlcHRoOworICAgIENBUkQ4IHBhZDI7Cit9IHhMYnhHZXRXaW5BdHRyQW5kR2VvbVJlcGx5OworI2RlZmluZSBzel94TGJ4R2V0V2luQXR0ckFuZEdlb21SZXBseSA2MAorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieFN5bmMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geExieFN5bmNSZXE7CisjZGVmaW5lIHN6X3hMYnhTeW5jUmVxCTQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworfSB4TGJ4U3luY1JlcGx5OworI2RlZmluZSBzel94TGJ4U3luY1JlcGx5IDMyCisKKworLyogYW4gTEJYIHNxdWlzaGVkIGNoYXJpbmZvIHBhY2tzIHRoZSBkYXRhIGluIGEgQ0FSRDMyIGFzIGZvbGxvd3MgKi8KKyNkZWZpbmUJTEJYX1dJRFRIX1NISUZUCQkyNgorI2RlZmluZQlMQlhfTEVGVF9TSElGVAkJMjAKKyNkZWZpbmUJTEJYX1JJR0hUX1NISUZUCQkxMworI2RlZmluZQlMQlhfQVNDRU5UX1NISUZUCTcKKyNkZWZpbmUJTEJYX0RFU0NFTlRfU0hJRlQJMAorCisjZGVmaW5lCUxCWF9XSURUSF9CSVRTCQk2CisjZGVmaW5lCUxCWF9MRUZUX0JJVFMJCTYKKyNkZWZpbmUJTEJYX1JJR0hUX0JJVFMJCTcKKyNkZWZpbmUJTEJYX0FTQ0VOVF9CSVRTCQk2CisjZGVmaW5lCUxCWF9ERVNDRU5UX0JJVFMJNworCisjZGVmaW5lCUxCWF9XSURUSF9NQVNLCQkweGZjMDAwMDAwCisjZGVmaW5lCUxCWF9MRUZUX01BU0sJCTB4MDNmMDAwMDAKKyNkZWZpbmUJTEJYX1JJR0hUX01BU0sJCTB4MDAwZmUwMDAKKyNkZWZpbmUJTEJYX0FTQ0VOVF9NQVNLCQkweDAwMDAxZjgwCisjZGVmaW5lCUxCWF9ERVNDRU5UX01BU0sJMHgwMDAwMDA3ZgorCisjZGVmaW5lCUxCWF9NQVNLX0JJVFModmFsLCBuKQkoKHVuc2lnbmVkIGludCkgKCh2YWwpICYgKCgxIDw8IChuKSkgLSAxKSkpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEMzIJbWV0cmljcyBCMzI7Cit9IHhMYnhDaGFySW5mbzsKKworLyogbm90ZSB0aGF0IHRoaXMgaXMgaWRlbnRpY2FsIHRvIHhRdWVyeUZvbnRSZXBseSBleGNlcHQgZm9yIG1pc3NpbmcKKyAqIGZpcnN0IDIgd29yZHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHhDaGFySW5mbyBtaW5Cb3VuZHM7CisvKiBYWFggZG8gd2UgbmVlZCB0byBsZWF2ZSB0aGlzIGd1bms/ICovCisjaWZuZGVmIFdPUkQ2NAorICAgIENBUkQzMiB3YWxpZ24xIEIzMjsKKyNlbmRpZgorICAgIHhDaGFySW5mbyBtYXhCb3VuZHM7CisjaWZuZGVmIFdPUkQ2NAorICAgIENBUkQzMiB3YWxpZ24yIEIzMjsKKyNlbmRpZgorICAgIENBUkQxNiBtaW5DaGFyT3JCeXRlMiBCMTYsIG1heENoYXJPckJ5dGUyIEIxNjsKKyAgICBDQVJEMTYgZGVmYXVsdENoYXIgQjE2OworICAgIENBUkQxNiBuRm9udFByb3BzIEIxNjsgIC8qIGZvbGxvd2VkIGJ5IHRoaXMgbWFueSB4Rm9udFByb3Agc3RydWN0dXJlcyAqLworICAgIENBUkQ4IGRyYXdEaXJlY3Rpb247CisgICAgQ0FSRDggbWluQnl0ZTEsIG1heEJ5dGUxOworICAgIEJPT0wgYWxsQ2hhcnNFeGlzdDsKKyAgICBJTlQxNiBmb250QXNjZW50IEIxNiwgZm9udERlc2NlbnQgQjE2OworICAgIENBUkQzMiBuQ2hhckluZm9zIEIzMjsgLyogZm9sbG93ZWQgYnkgdGhpcyBtYW55IHhMYnhDaGFySW5mbyBzdHJ1Y3R1cmVzICovCit9IHhMYnhGb250SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJY29tcHJlc3Npb247CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJdGFnIEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIC8qIFhfUXVlcnlGb250IHN0aWNrcyBtdWNoIG9mIHRoZSBkYXRhIGluIHRoZSBiYXNlIHJlcGx5IHBhY2tldCwKKyAgICAgKiBidXQgd2UgaG9wZSB0aGF0IGl0IHdvbid0IGJlIG5lZWRlZCwgKGFuZCBpdCB3b24ndCBmaXQgaW4gMzIgYnl0ZXMKKyAgICAgKiB3aXRoIHRoZSB0YWcgYW55d2F5cykKKyAgICAgKgorICAgICAqIGlmIGFueSBhZGRpdGlvbmFsIGRhdGEgaXMgbmVlZGVkLCBpdHMgc2VudCBpbiBhIHhMYnhGb250SW5mbworICAgICAqLworfSB4TGJ4UXVlcnlGb250UmVwbHk7CisjZGVmaW5lIHN6X3hMYnhRdWVyeUZvbnRSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4Q2hhbmdlUHJvcGVydHkgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4Q2hhbmdlUHJvcGVydHkgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cJd2luZG93IEIzMjsKKyAgICBBdG9tCXByb3BlcnR5IEIzMjsKKyAgICBBdG9tCXR5cGUgQjMyOworICAgIENBUkQ4CWZvcm1hdDsKKyAgICBDQVJEOAltb2RlOworICAgIEJZVEUJcGFkWzJdOworICAgIENBUkQzMgluVW5pdHMgQjMyOworfSB4TGJ4Q2hhbmdlUHJvcGVydHlSZXE7CisjZGVmaW5lCXN6X3hMYnhDaGFuZ2VQcm9wZXJ0eVJlcQkyNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlwYWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJdGFnIEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworfSB4TGJ4Q2hhbmdlUHJvcGVydHlSZXBseTsKKyNkZWZpbmUgc3pfeExieENoYW5nZVByb3BlcnR5UmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEdldFByb3BlcnR5IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEdldFByb3BlcnR5ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgV2luZG93CXdpbmRvdyBCMzI7CisgICAgQXRvbQlwcm9wZXJ0eSBCMzI7CisgICAgQXRvbQl0eXBlIEIzMjsKKyAgICBDQVJEOAlkZWxldGU7CisgICAgQllURQlwYWRbM107CisgICAgQ0FSRDMyCWxvbmdPZmZzZXQgQjMyOworICAgIENBUkQzMglsb25nTGVuZ3RoIEIzMjsKK30geExieEdldFByb3BlcnR5UmVxOworI2RlZmluZQlzel94TGJ4R2V0UHJvcGVydHlSZXEJMjgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJZm9ybWF0OworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQXRvbQlwcm9wZXJ0eVR5cGUgQjMyOworICAgIENBUkQzMglieXRlc0FmdGVyIEIzMjsKKyAgICBDQVJEMzIJbkl0ZW1zIEIzMjsKKyAgICBDQVJEMzIJdGFnIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworfSB4TGJ4R2V0UHJvcGVydHlSZXBseTsKKyNkZWZpbmUgc3pfeExieEdldFByb3BlcnR5UmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFRhZ0RhdGEgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4VGFnRGF0YSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhJRAkJdGFnIEIzMjsKKyAgICBDQVJEMzIJcmVhbF9sZW5ndGggQjMyOworICAgIC8qIGRhdGEgKi8KK30geExieFRhZ0RhdGFSZXE7CisjZGVmaW5lCXN6X3hMYnhUYWdEYXRhUmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhJbnZhbGlkYXRlVGFnIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEludmFsaWRhdGVUYWcgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJdGFnIEIzMjsKK30geExieEludmFsaWRhdGVUYWdSZXE7CisjZGVmaW5lCXN6X3hMYnhJbnZhbGlkYXRlVGFnUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFB1dEltYWdlIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieFB1dEltYWdlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJY29tcHJlc3Npb25NZXRob2Q7CisgICAgQ0FSRDgJY2FjaGVFbnRzOworICAgIENBUkQ4CWJpdFBhY2tlZDsKKyAgICAvKiByZXN0IGlzIHZhcmlhYmxlICovCit9IHhMYnhQdXRJbWFnZVJlcTsKKyNkZWZpbmUgc3pfeExieFB1dEltYWdlUmVxCTcKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4R2V0SW1hZ2UgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBEcmF3YWJsZQlkcmF3YWJsZSBCMzI7CisgICAgSU5UMTYJeCBCMTYsIHkgQjE2OworICAgIENBUkQxNgl3aWR0aCBCMTYsIGhlaWdodCBCMTY7CisgICAgQ0FSRDMyCXBsYW5lTWFzayBCMzI7CisgICAgQ0FSRDgJZm9ybWF0OworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworfSB4TGJ4R2V0SW1hZ2VSZXE7CisKKyNkZWZpbmUgc3pfeExieEdldEltYWdlUmVxIDI0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4IGRlcHRoOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxieExlbmd0aCBCMzI7CisgICAgQ0FSRDMyIHhMZW5ndGggQjMyOworICAgIFZpc3VhbElEIHZpc3VhbCBCMzI7CisgICAgQ0FSRDggY29tcHJlc3Npb25NZXRob2Q7CisgICAgQ0FSRDggcGFkMTsKKyAgICBDQVJEMTYgcGFkMiBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7Cit9IHhMYnhHZXRJbWFnZVJlcGx5OworCisjZGVmaW5lIHN6X3hMYnhHZXRJbWFnZVJlcGx5IDMyCisKKy8qIEZvbGxvd2luZyB1c2VkIGZvciBMYnhQb2x5UG9pbnQsIExieFBvbHlMaW5lLCBMYnhQb2x5U2VnbWVudCwKKyAgIExieFBvbHlSZWN0YW5nbGUsIExieFBvbHlBcmMsIExieFBvbHlGaWxsUmVjdGFuZ2xlIGFuZCBMYnhQb2x5RmlsbEFyYyAqLworCisjZGVmaW5lIEdGWF9DQUNIRV9TSVpFICAxNQorCisjZGVmaW5lIEdGWGRDYWNoZUVudChlKQkgICAgKChlKSAmIDB4ZikKKyNkZWZpbmUgR0ZYZ0NhY2hlRW50KGUpCSAgICAoKChlKSA+PiA0KSAmIDB4ZikKKyNkZWZpbmUgR0ZYQ2FjaGVFbnRzKGQsZykgICAoKChkKSAmIDB4ZikgfCAoKChnKSAmIDB4ZikgPDwgNCkpCisKKyNkZWZpbmUgR0ZYQ2FjaGVOb25lICAgMHhmCisKK3R5cGVkZWYgc3RydWN0IF9MYnhQb2x5UG9pbnQgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAljYWNoZUVudHM7CisgICAgQ0FSRDgJcGFkQnl0ZXM7Cit9IHhMYnhQb2x5UG9pbnRSZXE7CisKKyNkZWZpbmUgc3pfeExieFBvbHlQb2ludFJlcQk2CisKK3R5cGVkZWYgeExieFBvbHlQb2ludFJlcSB4TGJ4UG9seUxpbmVSZXE7Cit0eXBlZGVmIHhMYnhQb2x5UG9pbnRSZXEgeExieFBvbHlTZWdtZW50UmVxOwordHlwZWRlZiB4TGJ4UG9seVBvaW50UmVxIHhMYnhQb2x5UmVjdGFuZ2xlUmVxOwordHlwZWRlZiB4TGJ4UG9seVBvaW50UmVxIHhMYnhQb2x5QXJjUmVxOwordHlwZWRlZiB4TGJ4UG9seVBvaW50UmVxIHhMYnhQb2x5RmlsbFJlY3RhbmdsZVJlcTsKK3R5cGVkZWYgeExieFBvbHlQb2ludFJlcSB4TGJ4UG9seUZpbGxBcmNSZXE7CisKKyNkZWZpbmUgc3pfeExieFBvbHlMaW5lUmVxCQlzel94TGJ4UG9seVBvaW50UmVxCisjZGVmaW5lIHN6X3hMYnhQb2x5U2VnbWVudFJlcQkJc3pfeExieFBvbHlQb2ludFJlcQorI2RlZmluZSBzel94TGJ4UG9seVJlY3RhbmdsZVJlcQkJc3pfeExieFBvbHlQb2ludFJlcQorI2RlZmluZSBzel94TGJ4UG9seUFyY1JlcQkJc3pfeExieFBvbHlQb2ludFJlcQorI2RlZmluZSBzel94TGJ4UG9seUZpbGxSZWN0YW5nbGVSZXEJc3pfeExieFBvbHlQb2ludFJlcQorI2RlZmluZSBzel94TGJ4UG9seUZpbGxBcmMJCXN6X3hMYnhQb2x5UG9pbnRSZXEKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEZpbGxQb2x5IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJY2FjaGVFbnRzOworICAgIEJZVEUJc2hhcGU7CisgICAgQ0FSRDgJcGFkQnl0ZXM7Cit9IHhMYnhGaWxsUG9seVJlcTsKKyNkZWZpbmUgc3pfeExieEZpbGxQb2x5UmVxCTcKKwordHlwZWRlZiBzdHJ1Y3QgX0xieENvcHlBcmVhIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJc3JjQ2FjaGU7CS8qIHNvdXJjZSBkcmF3YWJsZSAqLworICAgIENBUkQ4CWNhY2hlRW50czsJLyogZGVzdCBkcmF3YWJsZSBhbmQgZ2MgKi8KKyAgICAvKiBmb2xsb3dlZCBieSBlbmNvZGVkIHNyYyB4LCBzcmMgeSwgZHN0IHgsIGRzdCB5LCB3aWR0aCwgaGVpZ2h0ICovCit9IHhMYnhDb3B5QXJlYVJlcTsKKworI2RlZmluZSBzel94TGJ4Q29weUFyZWFSZXEgIDYKKwordHlwZWRlZiBzdHJ1Y3QgX0xieENvcHlQbGFuZSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgliaXRQbGFuZSBCMzI7CisgICAgQ0FSRDgJc3JjQ2FjaGU7CS8qIHNvdXJjZSBkcmF3YWJsZSAqLworICAgIENBUkQ4CWNhY2hlRW50czsJLyogZGVzdCBkcmF3YWJsZSBhbmQgZ2MgKi8KKyAgICAvKiBmb2xsb3dlZCBieSBlbmNvZGVkIHNyYyB4LCBzcmMgeSwgZHN0IHgsIGRzdCB5LCB3aWR0aCwgaGVpZ2h0ICovCit9IHhMYnhDb3B5UGxhbmVSZXE7CisKKyNkZWZpbmUgc3pfeExieENvcHlQbGFuZVJlcSAgMTAKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFBvbHlUZXh0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJY2FjaGVFbnRzOworICAgIC8qIGZvbGxvd2VkIGJ5IGVuY29kZWQgc3JjIHgsIHNyYyB5IGNvb3JkaW5hdGVzIGFuZCB0ZXh0IGVsdHMgKi8KK30geExieFBvbHlUZXh0UmVxOworCisjZGVmaW5lIHN6X3hMYnhQb2x5VGV4dFJlcSAgNQorCit0eXBlZGVmIHhMYnhQb2x5VGV4dFJlcSB4TGJ4UG9seVRleHQ4UmVxOwordHlwZWRlZiB4TGJ4UG9seVRleHRSZXEgeExieFBvbHlUZXh0MTZSZXE7CisKKyNkZWZpbmUgc3pfeExieFBvbHlUZXh0UmVxCTUKKyNkZWZpbmUgc3pfeExieFBvbHlUZXh0OFJlcQk1CisjZGVmaW5lIHN6X3hMYnhQb2x5VGV4dDE2UmVxCTUKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEltYWdlVGV4dCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWNhY2hlRW50czsKKyAgICBDQVJEOAluQ2hhcnM7CisgICAgLyogZm9sbG93ZWQgYnkgZW5jb2RlZCBzcmMgeCwgc3JjIHkgY29vcmRpbmF0ZXMgYW5kIHN0cmluZyAqLworfSB4TGJ4SW1hZ2VUZXh0UmVxOworCit0eXBlZGVmIHhMYnhJbWFnZVRleHRSZXEgeExieEltYWdlVGV4dDhSZXE7Cit0eXBlZGVmIHhMYnhJbWFnZVRleHRSZXEgeExieEltYWdlVGV4dDE2UmVxOworCisjZGVmaW5lIHN6X3hMYnhJbWFnZVRleHRSZXEJNgorI2RlZmluZSBzel94TGJ4SW1hZ2VUZXh0OFJlcQk2CisjZGVmaW5lIHN6X3hMYnhJbWFnZVRleHQxNlJlcQk2CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgICAgICBvZmZzZXQ7CisgICAgQ0FSRDggICAgICAgZGlmZjsKK30geExieERpZmZJdGVtOworI2RlZmluZSBzel94TGJ4RGlmZkl0ZW0gICAgMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CW5PcHRzOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCW9wdERhdGFTdGFydCBCMzI7CisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geExieFN0YXJ0UmVwbHk7CisjZGVmaW5lIHN6X3hMYnhTdGFydFJlcGx5CTMyCisjZGVmaW5lIHN6X3hMYnhTdGFydFJlcGx5SGRyCTgKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFF1ZXJ5RXh0ZW5zaW9uIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieFF1ZXJ5RXh0ZW5zaW9uICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCW5ieXRlcyBCMzI7Cit9IHhMYnhRdWVyeUV4dGVuc2lvblJlcTsKKyNkZWZpbmUJc3pfeExieFF1ZXJ5RXh0ZW5zaW9uUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFF1ZXJ5RXh0ZW5zaW9uUmVwbHkgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJbnVtUmVxczsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIEJPT0wJcHJlc2VudDsKKyAgICBDQVJEOAltYWpvcl9vcGNvZGU7CisgICAgQ0FSRDgJZmlyc3RfZXZlbnQ7CisgICAgQ0FSRDgJZmlyc3RfZXJyb3I7CisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKworICAgIC8qIHJlcGx5ICYgZXZlbnQgZ2VuZXJhdGluZyByZXF1ZXN0cyAqLworfSB4TGJ4UXVlcnlFeHRlbnNpb25SZXBseTsKKyNkZWZpbmUgc3pfeExieFF1ZXJ5RXh0ZW5zaW9uUmVwbHkJMzIKKworCit0eXBlZGVmIHN0cnVjdCBfTGJ4QmVnaW5MYXJnZVJlcXVlc3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4QmVnaW5MYXJnZVJlcXVlc3QgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJbGFyZ2VSZXFMZW5ndGggQjMyOworfSB4TGJ4QmVnaW5MYXJnZVJlcXVlc3RSZXE7CisjZGVmaW5lCXN6X0JlZ2luTGFyZ2VSZXF1ZXN0UmVxIDgKKwordHlwZWRlZiBzdHJ1Y3QgX0xieExhcmdlUmVxdWVzdERhdGEgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4TGFyZ2VSZXF1ZXN0RGF0YSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIC8qIGZvbGxvd2VkIGJ5IExJU1RvZkNBUkQ4IGRhdGEgKi8KK30geExieExhcmdlUmVxdWVzdERhdGFSZXE7CisjZGVmaW5lCXN6X0xhcmdlUmVxdWVzdERhdGFSZXEgNAorCit0eXBlZGVmIHN0cnVjdCBfTGJ4RW5kTGFyZ2VSZXF1ZXN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEVuZExhcmdlUmVxdWVzdCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworfSB4TGJ4RW5kTGFyZ2VSZXF1ZXN0UmVxOworI2RlZmluZQlzel9FbmRMYXJnZVJlcXVlc3RSZXEgNAorCisKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFN3aXRjaEV2ZW50IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBhbHdheXMgZXZlbnRCYXNlICsgTGJ4RXZlbnQgKi8KKyAgICBCWVRFCWxieFR5cGU7CS8qIExieFN3aXRjaEV2ZW50ICovCisgICAgQ0FSRDE2CXBhZCBCMTY7CisgICAgQ0FSRDMyCWNsaWVudCBCMzI7Cit9IHhMYnhTd2l0Y2hFdmVudDsKKyNkZWZpbmUgc3pfeExieFN3aXRjaEV2ZW50CTgKKwordHlwZWRlZiBzdHJ1Y3QgX0xieENsb3NlRXZlbnQgeworICAgIEJZVEUJdHlwZTsJCS8qIGFsd2F5cyBldmVudEJhc2UgKyBMYnhFdmVudCAqLworICAgIEJZVEUJbGJ4VHlwZTsJLyogTGJ4Q2xvc2VFdmVudCAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWNsaWVudCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7Cit9IHhMYnhDbG9zZUV2ZW50OworI2RlZmluZSBzel94TGJ4Q2xvc2VFdmVudAkzMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4SW52YWxpZGF0ZVRhZ0V2ZW50IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBhbHdheXMgZXZlbnRCYXNlICsgTGJ4RXZlbnQgKi8KKyAgICBCWVRFCWxieFR5cGU7CS8qIExieEludmFsaWRhdGVUYWdFdmVudCAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCXRhZyBCMzI7CisgICAgQ0FSRDMyCXRhZ1R5cGUgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7Cit9IHhMYnhJbnZhbGlkYXRlVGFnRXZlbnQ7CisjZGVmaW5lIHN6X3hMYnhJbnZhbGlkYXRlVGFnRXZlbnQgMzIKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFNlbmRUYWdEYXRhRXZlbnQgeworICAgIEJZVEUJdHlwZTsJCS8qIGFsd2F5cyBldmVudEJhc2UgKyBMYnhFdmVudCAqLworICAgIEJZVEUJbGJ4VHlwZTsJLyogTGJ4U2VuZFRhZ0RhdGFFdmVudCAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCXRhZyBCMzI7CisgICAgQ0FSRDMyCXRhZ1R5cGUgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7Cit9IHhMYnhTZW5kVGFnRGF0YUV2ZW50OworI2RlZmluZSBzel94TGJ4U2VuZFRhZ0RhdGFFdmVudCAzMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4TGlzdGVuVG9PbmVFdmVudCB7CisgICAgQllURQl0eXBlOwkJLyogYWx3YXlzIGV2ZW50QmFzZSArIExieEV2ZW50ICovCisgICAgQllURQlsYnhUeXBlOwkvKiBMYnhMaXN0ZW5Ub09uZUV2ZW50ICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJY2xpZW50IEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geExieExpc3RlblRvT25lRXZlbnQ7CisjZGVmaW5lIHN6X3hMYnhMaXN0ZW5Ub09uZUV2ZW50IDMyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhMaXN0ZW5Ub0FsbEV2ZW50IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBhbHdheXMgZXZlbnRCYXNlICsgTGJ4RXZlbnQgKi8KKyAgICBCWVRFCWxieFR5cGU7CS8qIExieExpc3RlblRvQWxsRXZlbnQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworICAgIENBUkQzMglwYWQ3IEIzMjsKK30geExieExpc3RlblRvQWxsRXZlbnQ7CisjZGVmaW5lIHN6X3hMYnhMaXN0ZW5Ub09uZUV2ZW50IDMyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhSZWxlYXNlQ21hcEV2ZW50IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBhbHdheXMgZXZlbnRCYXNlICsgTGJ4RXZlbnQgKi8KKyAgICBCWVRFCWxieFR5cGU7CS8qIExieFJlbGVhc2VDbWFwRXZlbnQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENvbG9ybWFwCWNvbG9ybWFwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geExieFJlbGVhc2VDbWFwRXZlbnQ7CisjZGVmaW5lIHN6X3hMYnhSZWxlYXNlQ21hcEV2ZW50CTMyCisKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEZyZWVDZWxsc0V2ZW50IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBhbHdheXMgZXZlbnRCYXNlICsgTGJ4RXZlbnQgKi8KKyAgICBCWVRFCWxieFR5cGU7CS8qIExieEZyZWVDZWxsc0V2ZW50ICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDb2xvcm1hcAljb2xvcm1hcCBCMzI7CisgICAgQ0FSRDMyCXBpeGVsU3RhcnQgQjMyOworICAgIENBUkQzMglwaXhlbEVuZCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworfSB4TGJ4RnJlZUNlbGxzRXZlbnQ7CisjZGVmaW5lIHN6X3hMYnhGcmVlQ2VsbHNFdmVudAkzMgorCisKKy8qCisgKiBzcXVpc2hlZCBYIGV2ZW50IHNpemVzLiAgSWYgdGhlc2UgY2hhbmdlLCBiZSBzdXJlIHRvIHVwZGF0ZSBsYnhxdWlzaC5jCisgKiBhbmQgdW5zcXVpc2guYyBhcHByb3ByaWF0ZWx5CisgKgorICogbGJ4c3pfKiBpcyB0aGUgcGFkZGVkIHNxdWlzaGVkIGxlbmd0aAorICogbGJ4dXBzel8qIGlzIHRoZSB1bnBhZGRlZCBzcXVpc2hlZCBsZW5ndGgKKyAqLworCisjZGVmaW5lCSAgbGJ4c3pfS2V5QnV0dG9uRXZlbnQJCTMyCisjZGVmaW5lCWxieHVwc3pfS2V5QnV0dG9uRXZlbnQJCTMxCisKKyNkZWZpbmUJICBsYnhzel9FbnRlckxlYXZlRXZlbnQJCTMyCisjZGVmaW5lCWxieHVwc3pfRW50ZXJMZWF2ZUV2ZW50CQkzMgorCisjZGVmaW5lCSAgbGJ4c3pfRm9jdXNFdmVudAkJMTIKKyNkZWZpbmUJbGJ4dXBzel9Gb2N1c0V2ZW50CQk5CisKKyNkZWZpbmUJICBsYnhzel9LZXltYXBFdmVudAkJMzIKKyNkZWZpbmUJbGJ4dXBzel9LZXltYXBFdmVudAkJMzIKKworI2RlZmluZQkgIGxieHN6X0V4cG9zZUV2ZW50CQkyMAorI2RlZmluZQlsYnh1cHN6X0V4cG9zZUV2ZW50CQkxOAorCisjZGVmaW5lCSAgbGJ4c3pfR2Z4RXhwb3NlRXZlbnQJCTI0CisjZGVmaW5lCWxieHVwc3pfR2Z4RXhwb3NlRXZlbnQJCTIxCisKKyNkZWZpbmUJICBsYnhzel9Ob0V4cG9zZUV2ZW50CQkxMgorI2RlZmluZQlsYnh1cHN6X05vRXhwb3NlRXZlbnQJCTExCisKKyNkZWZpbmUJICBsYnhzel9WaXNpYmlsaXR5RXZlbnQJCTEyCisjZGVmaW5lCWxieHVwc3pfVmlzaWJpbGl0eUV2ZW50CQk5CisKKyNkZWZpbmUJICBsYnhzel9DcmVhdGVOb3RpZnlFdmVudAkyNAorI2RlZmluZQlsYnh1cHN6X0NyZWF0ZU5vdGlmeUV2ZW50CTIzCisKKyNkZWZpbmUJICBsYnhzel9EZXN0cm95Tm90aWZ5RXZlbnQJMTIKKyNkZWZpbmUJbGJ4dXBzel9EZXN0cm95Tm90aWZ5RXZlbnQJMTIKKworI2RlZmluZQkgIGxieHN6X1VubWFwTm90aWZ5RXZlbnQJMTYKKyNkZWZpbmUJbGJ4dXBzel9Vbm1hcE5vdGlmeUV2ZW50CTEzCisKKyNkZWZpbmUJICBsYnhzel9NYXBOb3RpZnlFdmVudAkJMTYKKyNkZWZpbmUJbGJ4dXBzel9NYXBOb3RpZnlFdmVudAkJMTMKKworI2RlZmluZQkgIGxieHN6X01hcFJlcXVlc3RFdmVudAkJMTIKKyNkZWZpbmUJbGJ4dXBzel9NYXBSZXF1ZXN0RXZlbnQJCTEyCisKKyNkZWZpbmUJICBsYnhzel9SZXBhcmVudEV2ZW50CQkyNAorI2RlZmluZQlsYnh1cHN6X1JlcGFyZW50RXZlbnQJCTIxCisKKyNkZWZpbmUJICBsYnhzel9Db25maWd1cmVOb3RpZnlFdmVudAkyOAorI2RlZmluZQlsYnh1cHN6X0NvbmZpZ3VyZU5vdGlmeUV2ZW50CTI3CisKKyNkZWZpbmUJICBsYnhzel9Db25maWd1cmVSZXF1ZXN0RXZlbnQJMjgKKyNkZWZpbmUJbGJ4dXBzel9Db25maWd1cmVSZXF1ZXN0RXZlbnQJMjgKKworI2RlZmluZQkgIGxieHN6X0dyYXZpdHlFdmVudAkJMTYKKyNkZWZpbmUJbGJ4dXBzel9HcmF2aXR5RXZlbnQJCTE2CisKKyNkZWZpbmUJICBsYnhzel9SZXNpemVSZXF1ZXN0RXZlbnQJMTIKKyNkZWZpbmUJbGJ4dXBzel9SZXNpemVSZXF1ZXN0RXZlbnQJMTIKKworI2RlZmluZQkgIGxieHN6X0NpcmN1bGF0ZUV2ZW50CQkyMAorI2RlZmluZQlsYnh1cHN6X0NpcmN1bGF0ZUV2ZW50CQkxNworCisjZGVmaW5lCSAgbGJ4c3pfUHJvcGVydHlFdmVudAkJMjAKKyNkZWZpbmUJbGJ4dXBzel9Qcm9wZXJ0eUV2ZW50CQkxNworCisjZGVmaW5lCSAgbGJ4c3pfU2VsZWN0aW9uQ2xlYXJFdmVudAkxNgorI2RlZmluZQlsYnh1cHN6X1NlbGVjdGlvbkNsZWFyRXZlbnQJMTYKKworI2RlZmluZQkgIGxieHN6X1NlbGVjdGlvblJlcXVlc3RFdmVudAkyOAorI2RlZmluZQlsYnh1cHN6X1NlbGVjdGlvblJlcXVlc3RFdmVudAkyOAorCisjZGVmaW5lCSAgbGJ4c3pfU2VsZWN0aW9uTm90aWZ5RXZlbnQJMjQKKyNkZWZpbmUJbGJ4dXBzel9TZWxlY3Rpb25Ob3RpZnlFdmVudAkyNAorCisjZGVmaW5lCSAgbGJ4c3pfQ29sb3JtYXBFdmVudAkJMTYKKyNkZWZpbmUJbGJ4dXBzel9Db2xvcm1hcEV2ZW50CQkxNAorCisjZGVmaW5lCSAgbGJ4c3pfTWFwcGluZ05vdGlmeUV2ZW50CTgKKyNkZWZpbmUJbGJ4dXBzel9NYXBwaW5nTm90aWZ5RXZlbnQJNworCisjZGVmaW5lCSAgbGJ4c3pfQ2xpZW50TWVzc2FnZUV2ZW50CTMyCisjZGVmaW5lCWxieHVwc3pfQ2xpZW50TWVzc2FnZUV2ZW50CTMyCisKKyNkZWZpbmUJbGJ4c3pfVW5rbm93bkV2ZW50CQkzMgorCisjaWZkZWYgREVCVUcKKworI2RlZmluZSBEQkdfU1dJVENICTB4MDAwMDAwMDEKKyNkZWZpbmUgREJHX0NMT1NFCTB4MDAwMDAwMDIKKyNkZWZpbmUgREJHX0lPCQkweDAwMDAwMDA0CisjZGVmaW5lIERCR19SRUFEX1JFUQkweDAwMDAwMDA4CisjZGVmaW5lIERCR19MRU4JCTB4MDAwMDAwMTAKKyNkZWZpbmUgREJHX0JMT0NLCTB4MDAwMDAwMjAKKyNkZWZpbmUgREJHX0NMSUVOVAkweDAwMDAwMDQwCisjZGVmaW5lIERCR19ERUxUQQkweDAwMDAwMDgwCisjZW5kaWYKKy8qCisgKiBDYW5jZWwgdGhlIHByZXZpb3VzIHJlZGVmaW5pdGlvbiBvZiB0aGUgYmFzaWMgdHlwZXMsIHRodXMgcmVzdG9yaW5nIHRoZWlyCisgKiBYLmggZGVmaW5pdGlvbnMuCisgKi8KKworI3VuZGVmIFhJRAorI3VuZGVmIEF0b20KKyN1bmRlZiBDb2xvcm1hcAorI3VuZGVmIERyYXdhYmxlCisjdW5kZWYgVmlzdWFsSUQKKyN1bmRlZiBXaW5kb3cKKworI2VuZGlmCS8qIF9MQlhQUk9UT19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9taXRtaXNjY29uc3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbWl0bWlzY2NvbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjNWY5NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbWl0bWlzY2NvbnN0LmgKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJBTkRPTSBDUlVGVCEgVEhJUyBIQVMgTk8gT0ZGSUNJQUwgWCBDT05TT1JUSVVNIE9SIFggUFJPSkVDVCBURUFNIEJMRVNTSU5HICovCisKKworI2lmbmRlZiBfTUlUTUlTQ0NPTlNUX0hfCisjZGVmaW5lIF9NSVRNSVNDQ09OU1RfSF8KKworI2RlZmluZSBNSVRNaXNjTnVtYmVyRXZlbnRzCQkwCisjZGVmaW5lIE1JVE1pc2NOdW1iZXJFcnJvcnMJCTAKKworI2RlZmluZSBNSVRNSVNDTkFNRSAiTUlULVNVTkRSWS1OT05TVEFOREFSRCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL21pdG1pc2Nwcm90by5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9taXRtaXNjcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGMyMDJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9taXRtaXNjcHJvdG8uaApAQCAtMCwwICsxLDY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUkFORE9NIENSVUZUISBUSElTIEhBUyBOTyBPRkZJQ0lBTCBYIENPTlNPUlRJVU0gT1IgWCBQUk9KRUNUIFRFQU0gQkxFU1NJTkcgKi8KKworI2lmbmRlZiBfTUlUTUlTQ1BST1RPX0hfCisjZGVmaW5lIF9NSVRNSVNDUFJPVE9fSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL21pdG1pc2Njb25zdC5oPgorCisjZGVmaW5lIFhfTUlUU2V0QnVnTW9kZQkJCTAKKyNkZWZpbmUgWF9NSVRHZXRCdWdNb2RlCQkJMQorCit0eXBlZGVmIHN0cnVjdCBfU2V0QnVnTW9kZSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIE1JVFJlcUNvZGUgKi8KKyAgICBDQVJEOAltaXRSZXFUeXBlOwkvKiBhbHdheXMgWF9NSVRTZXRCdWdNb2RlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQk9PTAlvbk9mZjsKKyAgICBCWVRFCXBhZDA7CisgICAgQ0FSRDE2CXBhZDE7Cit9IHhNSVRTZXRCdWdNb2RlUmVxOworI2RlZmluZSBzel94TUlUU2V0QnVnTW9kZVJlcQk4CisKK3R5cGVkZWYgc3RydWN0IF9HZXRCdWdNb2RlIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTUlUUmVxQ29kZSAqLworICAgIENBUkQ4CW1pdFJlcVR5cGU7CS8qIGFsd2F5cyBYX01JVEdldEJ1Z01vZGUgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geE1JVEdldEJ1Z01vZGVSZXE7CisjZGVmaW5lIHN6X3hNSVRHZXRCdWdNb2RlUmVxCTQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQk9PTAlvbk9mZjsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4TUlUR2V0QnVnTW9kZVJlcGx5OworI2RlZmluZSBzel94TUlUR2V0QnVnTW9kZVJlcGx5CTMyCisKKyNlbmRpZiAvKiBfTUlUTUlTQ1BST1RPX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL211bHRpYnVmLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL211bHRpYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmZGEzNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbXVsdGlidWYuaApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKyAqLworCisjaWZuZGVmIF9NVUxUSUJVRl9IXworI2RlZmluZSBfTVVMVElCVUZfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9tdWx0aWJ1ZmNvbnN0Lmg+CisKKyNpZiAhZGVmaW5lZChVTklYQ1BQKSB8fCBkZWZpbmVkKEFOU0lDUFApCisjZGVmaW5lIE1idWZHZXRSZXEobmFtZSxyZXEsaW5mbykgR2V0UmVxIChuYW1lLCByZXEpOyBcCisJcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsgXAorCXJlcS0+bWJ1ZlJlcVR5cGUgPSBYXyMjbmFtZTsKKyNlbHNlCisjZGVmaW5lIE1idWZHZXRSZXEobmFtZSxyZXEsaW5mbykgR2V0UmVxIChuYW1lLCByZXEpOyBcCisJcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsgXAorCXJlcS0+bWJ1ZlJlcVR5cGUgPSBYXy8qKi9uYW1lOworI2VuZGlmCisKKy8qCisgKiBFeHRyYSBkZWZpbml0aW9ucyB0aGF0IHdpbGwgb25seSBiZSBuZWVkZWQgaW4gdGhlIGNsaWVudAorICovCit0eXBlZGVmIFhJRCBNdWx0aWJ1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludAl0eXBlOwkJICAgIC8qIG9mIGV2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIGludCBzZW5kX2V2ZW50OwkgICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbWUgYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CSAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgTXVsdGlidWZmZXIgYnVmZmVyOwkgICAgLyogYnVmZmVyIG9mIGV2ZW50ICovCisgICAgaW50CXN0YXRlOwkJICAgIC8qIHNlZSBDbG9iYmVyZWQgY29uc3RhbnRzIGFib3ZlICovCit9IFhtYnVmQ2xvYmJlck5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50CXR5cGU7CQkgICAgLyogb2YgZXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgaW50IHNlbmRfZXZlbnQ7CSAgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tZSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAqZGlzcGxheTsJICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBNdWx0aWJ1ZmZlciBidWZmZXI7CSAgICAvKiBidWZmZXIgb2YgZXZlbnQgKi8KK30gWG1idWZVcGRhdGVOb3RpZnlFdmVudDsKKworCisvKgorICogcGVyLXdpbmRvdyBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIGdvdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGRpc3BsYXllZF9pbmRleDsJLyogd2hpY2ggYnVmZmVyIGlzIGJlaW5nIGRpc3BsYXllZCAqLworICAgIGludCB1cGRhdGVfYWN0aW9uOwkJLyogVW5kZWZpbmVkLCBCYWNrZ3JvdW5kLCBVbnRvdWNoZWQsIENvcGllZCAqLworICAgIGludCB1cGRhdGVfaGludDsJCS8qIEZyZXF1ZW50LCBJbnRlcm1pdHRlbnQsIFN0YXRpYyAqLworICAgIGludCB3aW5kb3dfbW9kZTsJCS8qIE1vbm8sIFN0ZXJlbyAqLworICAgIGludCBuYnVmZmVyczsJCS8qIE51bWJlciBvZiBidWZmZXJzICovCisgICAgTXVsdGlidWZmZXIgKmJ1ZmZlcnM7CS8qIEJ1ZmZlcnMgKi8KK30gWG1idWZXaW5kb3dBdHRyaWJ1dGVzOworCisvKgorICogcGVyLXdpbmRvdyBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHNldAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHVwZGF0ZV9oaW50OwkJLyogRnJlcXVlbnQsIEludGVybWl0dGVudCwgU3RhdGljICovCit9IFhtYnVmU2V0V2luZG93QXR0cmlidXRlczsKKworCisvKgorICogcGVyLWJ1ZmZlciBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIGdvdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgV2luZG93IHdpbmRvdzsJCS8qIHdoaWNoIHdpbmRvdyB0aGlzIGJlbG9uZ3MgdG8gKi8KKyAgICB1bnNpZ25lZCBsb25nIGV2ZW50X21hc2s7CS8qIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZCAqLworICAgIGludCBidWZmZXJfaW5kZXg7CQkvKiB3aGljaCBidWZmZXIgaXMgdGhpcyAqLworICAgIGludCBzaWRlOwkJCS8qIE1vbm8sIExlZnQsIFJpZ2h0ICovCit9IFhtYnVmQnVmZmVyQXR0cmlidXRlczsKKworLyoKKyAqIHBlci1idWZmZXIgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSBzZXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGxvbmcgZXZlbnRfbWFzazsJLyogZXZlbnRzIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkICovCit9IFhtYnVmU2V0QnVmZmVyQXR0cmlidXRlczsKKworCisvKgorICogcGVyLXNjcmVlbiBidWZmZXIgaW5mbyAodGhlcmUgd2lsbCBiZSBsaXN0cyBvZiB0aGVtKQorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVmlzdWFsSUQgdmlzdWFsaWQ7CQkvKiB2aXN1YWwgdXN1YWJsZSBhdCB0aGlzIGRlcHRoICovCisgICAgaW50IG1heF9idWZmZXJzOwkJLyogbW9zdCBidWZmZXJzIGZvciB0aGlzIHZpc3VhbCAqLworICAgIGludCBkZXB0aDsJCQkvKiBkZXB0aCBvZiBidWZmZXJzIHRvIGJlIGNyZWF0ZWQgKi8KK30gWG1idWZCdWZmZXJJbmZvOworCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiBCb29sIFhtYnVmUXVlcnlFeHRlbnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQqCQkvKiBldmVudF9iYXNlX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBlcnJvcl9iYXNlX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYbWJ1ZkdldFZlcnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQqCQkvKiBtYWpvcl92ZXJzaW9uX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBtaW5vcl92ZXJzaW9uX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYbWJ1ZkNyZWF0ZUJ1ZmZlcnMoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgaW50CQkJLyogdXBkYXRlX2FjdGlvbiAqLywKKyAgICBpbnQJCQkvKiB1cGRhdGVfaGludCAqLywKKyAgICBNdWx0aWJ1ZmZlcioJLyogYnVmZmVycyAqLworKTsKKworZXh0ZXJuIHZvaWQgWG1idWZEZXN0cm95QnVmZmVycygKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIFdpbmRvdwkJLyogd2luZG93ICovCispOworCitleHRlcm4gdm9pZCBYbWJ1ZkRpc3BsYXlCdWZmZXJzKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgTXVsdGlidWZmZXIqCS8qIGJ1ZmZlcnMgKi8sCisgICAgaW50CQkJLyogbWluX2RlbGF5ICovLAorICAgIGludAkJCS8qIG1heF9kZWxheSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYbWJ1ZkdldFdpbmRvd0F0dHJpYnV0ZXMoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgV2luZG93CQkJLyogdyAqLywKKyAgICBYbWJ1ZldpbmRvd0F0dHJpYnV0ZXMqCS8qIGF0dHIgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhtYnVmQ2hhbmdlV2luZG93QXR0cmlidXRlcygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBXaW5kb3cJCQkvKiB3ICovLAorICAgIHVuc2lnbmVkIGxvbmcJCS8qIHZhbHVlbWFzayAqLywKKyAgICBYbWJ1ZlNldFdpbmRvd0F0dHJpYnV0ZXMqCS8qIGF0dHIgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWG1idWZHZXRCdWZmZXJBdHRyaWJ1dGVzKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIE11bHRpYnVmZmVyCQkJLyogYiAqLywKKyAgICBYbWJ1ZkJ1ZmZlckF0dHJpYnV0ZXMqCS8qIGF0dHIgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhtYnVmQ2hhbmdlQnVmZmVyQXR0cmlidXRlcygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBNdWx0aWJ1ZmZlcgkJCS8qIGIgKi8sCisgICAgdW5zaWduZWQgbG9uZwkJLyogdmFsdWVtYXNrICovLAorICAgIFhtYnVmU2V0QnVmZmVyQXR0cmlidXRlcyoJLyogYXR0ciAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYbWJ1ZkdldFNjcmVlbkluZm8oCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgRHJhd2FibGUJCQkvKiBkICovLAorICAgIGludCoJCQkvKiBubW9ub19yZXR1cm4gKi8sCisgICAgWG1idWZCdWZmZXJJbmZvKioJCS8qIG1vbm9faW5mb19yZXR1cm4gKi8sCisgICAgaW50KgkJCS8qIG5zdGVyZW9fcmV0dXJuICovLAorICAgIFhtYnVmQnVmZmVySW5mbyoqCQkvKiBzdGVyZW9faW5mb19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBXaW5kb3cgWG1idWZDcmVhdGVTdGVyZW9XaW5kb3coCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgV2luZG93CQkJLyogcGFyZW50ICovLAorICAgIGludAkJCQkvKiB4ICovLAorICAgIGludAkJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBoZWlnaHQgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBib3JkZXJfd2lkdGggKi8sCisgICAgaW50CQkJCS8qIGRlcHRoICovLAorICAgIHVuc2lnbmVkIGludAkJLyogY2xhc3MgKi8sCisgICAgVmlzdWFsKgkJCS8qIHZpc3VhbCAqLywKKyAgICB1bnNpZ25lZCBsb25nCQkvKiB2YWx1ZW1hc2sgKi8sCisgICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMqCS8qIGF0dHIgKi8sCisgICAgTXVsdGlidWZmZXIqCQkvKiBsZWZ0cCAqLywKKyAgICBNdWx0aWJ1ZmZlcioJCS8qIHJpZ2h0cCAqLworKTsKKworZXh0ZXJuIHZvaWQgWG1idWZDbGVhckJ1ZmZlckFyZWEoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgTXVsdGlidWZmZXIJCQkvKiBidWZmZXIgKi8sCisgICAgaW50CQkJCS8qIHggKi8sCisgICAgaW50CQkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGhlaWdodCAqLywKKyAgICBCb29sCQkJLyogZXhwb3N1cmVzICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX01VTFRJQlVGX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL211bHRpYnVmY29uc3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbXVsdGlidWZjb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMTIzOGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL211bHRpYnVmY29uc3QuaApAQCAtMCwwICsxLDgzIEBACisvKgorQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisgKi8KKworI2lmbmRlZiBfTVVMVElCVUZDT05TVF9IXworI2RlZmluZSBfTVVMVElCVUZDT05TVF9IXworCisjZGVmaW5lIE1VTFRJQlVGRkVSX1BST1RPQ09MX05BTUUgIk11bHRpLUJ1ZmZlcmluZyIKKworI2RlZmluZSBNVUxUSUJVRkZFUl9NQUpPUl9WRVJTSU9OCTEJLyogY3VycmVudCB2ZXJzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgTVVMVElCVUZGRVJfTUlOT1JfVkVSU0lPTgkxCS8qIGhhcyBDbGVhckltYWdlQnVmZmVyQXJlYSAqLworCisvKgorICogdXBkYXRlX2FjdGlvbiBmaWVsZAorICovCisjZGVmaW5lIE11bHRpYnVmZmVyVXBkYXRlQWN0aW9uVW5kZWZpbmVkCTAKKyNkZWZpbmUgTXVsdGlidWZmZXJVcGRhdGVBY3Rpb25CYWNrZ3JvdW5kCTEKKyNkZWZpbmUgTXVsdGlidWZmZXJVcGRhdGVBY3Rpb25VbnRvdWNoZWQJMgorI2RlZmluZSBNdWx0aWJ1ZmZlclVwZGF0ZUFjdGlvbkNvcGllZAkJMworCisvKgorICogdXBkYXRlX2hpbnQgZmllbGQKKyAqLworI2RlZmluZSBNdWx0aWJ1ZmZlclVwZGF0ZUhpbnRGcmVxdWVudAkJMAorI2RlZmluZSBNdWx0aWJ1ZmZlclVwZGF0ZUhpbnRJbnRlcm1pdHRlbnQJMQorI2RlZmluZSBNdWx0aWJ1ZmZlclVwZGF0ZUhpbnRTdGF0aWMJCTIKKworLyoKKyAqIHZhbHVlbWFzayBmaWVsZHMKKyAqLworI2RlZmluZSBNdWx0aWJ1ZmZlcldpbmRvd1VwZGF0ZUhpbnQJKDFMIDw8IDApCisjZGVmaW5lIE11bHRpYnVmZmVyQnVmZmVyRXZlbnRNYXNrCSgxTCA8PCAwKQorCisvKgorICogbW9ubyB2cy4gc3RlcmVvIGFuZCBsZWZ0IHZzLiByaWdodAorICovCisjZGVmaW5lIE11bHRpYnVmZmVyTW9kZU1vbm8JCTAKKyNkZWZpbmUgTXVsdGlidWZmZXJNb2RlU3RlcmVvCQkxCisjZGVmaW5lIE11bHRpYnVmZmVyU2lkZU1vbm8JCTAKKyNkZWZpbmUgTXVsdGlidWZmZXJTaWRlTGVmdAkgIAkxCisjZGVmaW5lIE11bHRpYnVmZmVyU2lkZVJpZ2h0CQkyCisKKy8qCisgKiBjbG9iYmVyIHN0YXRlCisgKi8KKyNkZWZpbmUgTXVsdGlidWZmZXJVbmNsb2JiZXJlZAkJMAorI2RlZmluZSBNdWx0aWJ1ZmZlclBhcnRpYWxseUNsb2JiZXJlZAkxCisjZGVmaW5lIE11bHRpYnVmZmVyRnVsbHlDbG9iYmVyZWQJMgorCisvKgorICogZXZlbnQgc3R1ZmYKKyAqLworI2RlZmluZSBNdWx0aWJ1ZmZlckNsb2JiZXJOb3RpZnlNYXNrCTB4MDIwMDAwMDAKKyNkZWZpbmUgTXVsdGlidWZmZXJVcGRhdGVOb3RpZnlNYXNrCTB4MDQwMDAwMDAKKworI2RlZmluZSBNdWx0aWJ1ZmZlckNsb2JiZXJOb3RpZnkJMAorI2RlZmluZSBNdWx0aWJ1ZmZlclVwZGF0ZU5vdGlmeQkJMQorI2RlZmluZSBNdWx0aWJ1ZmZlck51bWJlckV2ZW50cwkJKE11bHRpYnVmZmVyVXBkYXRlTm90aWZ5ICsgMSkKKworI2RlZmluZSBNdWx0aWJ1ZmZlckJhZEJ1ZmZlcgkJMAorI2RlZmluZSBNdWx0aWJ1ZmZlck51bWJlckVycm9ycwkJKE11bHRpYnVmZmVyQmFkQnVmZmVyICsgMSkKKworI2VuZGlmIC8qIF9NVUxUSUJVRkNPTlNUX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL211bHRpYnVmcHJvdG8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbXVsdGlidWZwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTg0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL211bHRpYnVmcHJvdG8uaApAQCAtMCwwICsxLDI5NSBAQAorLyoKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorICovCisKKyNpZm5kZWYgX01VTFRJQlVGUFJPVE9fSF8KKyNkZWZpbmUgX01VTFRJQlVGUFJPVE9fSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL211bHRpYnVmY29uc3QuaD4KKworLyoKKyAqIFByb3RvY29sIHJlcXVlc3RzIGNvbnN0YW50cyBhbmQgYWxpZ25tZW50IHZhbHVlcworICovCisKKyNkZWZpbmUgV2luZG93IENBUkQzMgorI2RlZmluZSBEcmF3YWJsZSBDQVJEMzIKKyNkZWZpbmUgVmlzdWFsSUQgQ0FSRDMyCisjZGVmaW5lIE11bHRpYnVmZmVyIENBUkQzMgorCisjZGVmaW5lIFhfTWJ1ZkdldEJ1ZmZlclZlcnNpb24JCTAKKyNkZWZpbmUgWF9NYnVmQ3JlYXRlSW1hZ2VCdWZmZXJzCTEKKyNkZWZpbmUgWF9NYnVmRGVzdHJveUltYWdlQnVmZmVycwkyCisjZGVmaW5lIFhfTWJ1ZkRpc3BsYXlJbWFnZUJ1ZmZlcnMJMworI2RlZmluZSBYX01idWZTZXRNQnVmZmVyQXR0cmlidXRlcwk0CisjZGVmaW5lIFhfTWJ1ZkdldE1CdWZmZXJBdHRyaWJ1dGVzCTUKKyNkZWZpbmUgWF9NYnVmU2V0QnVmZmVyQXR0cmlidXRlcwk2CisjZGVmaW5lIFhfTWJ1ZkdldEJ1ZmZlckF0dHJpYnV0ZXMJNworI2RlZmluZSBYX01idWZHZXRCdWZmZXJJbmZvCQk4CisjZGVmaW5lIFhfTWJ1ZkNyZWF0ZVN0ZXJlb1dpbmRvdwk5CisjZGVmaW5lIFhfTWJ1ZkNsZWFySW1hZ2VCdWZmZXJBcmVhCTEwCisKKwordHlwZWRlZiBzdHJ1Y3QgeE1idWZCdWZmZXJJbmZvIHsKKwlDQVJEMzIJdmlzdWFsSUQgQjMyOwkJLyogYXNzb2NpYXRlZCB2aXN1YWwgKi8KKwlDQVJEMTYJbWF4QnVmZmVycyBCMTY7CQkvKiBtYXhpbXVtIHN1cHBvcnRlZCBidWZmZXJzICovCisJQ0FSRDgJZGVwdGg7CQkJLyogZGVwdGggb2YgdmlzdWFsIChyZWR1bmRhbnQpICovCisJQ0FSRDgJdW51c2VkOworfSB4TWJ1ZkJ1ZmZlckluZm87CisjZGVmaW5lIHN6X3hNYnVmQnVmZmVySW5mbyA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFICAgIHR5cGU7CisgICAgQllURSAgICB1bnVzZWQ7CisgICAgQ0FSRDE2ICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyICBidWZmZXIgQjMyOwkJCS8qIGFmZmVjdGVkIGJ1ZmZlciAqLworICAgIEJZVEUgICAgc3RhdGU7CQkJLyogY3VycmVudCBzdGF0dXMgKi8KKyAgICBDQVJEOCAgIHVudXNlZDE7CisgICAgQ0FSRDE2ICB1bnVzZWQyIEIxNjsKKyAgICBDQVJEMzIgIHVudXNlZDMgQjMyOworICAgIENBUkQzMiAgdW51c2VkNCBCMzI7CisgICAgQ0FSRDMyICB1bnVzZWQ1IEIzMjsKKyAgICBDQVJEMzIgIHVudXNlZDYgQjMyOworICAgIENBUkQzMiAgdW51c2VkNyBCMzI7Cit9IHhNYnVmQ2xvYmJlck5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSAgICB0eXBlOworICAgIEJZVEUgICAgdW51c2VkOworICAgIENBUkQxNiAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAgYnVmZmVyIEIzMjsJCQkvKiBhZmZlY3RlZCBidWZmZXIgKi8KKyAgICBDQVJEMzIgIHRpbWVTdGFtcCBCMzI7CQkvKiB1cGRhdGUgdGltZSAqLworICAgIENBUkQzMiAgdW51c2VkMSBCMzI7CisgICAgQ0FSRDMyICB1bnVzZWQyIEIzMjsKKyAgICBDQVJEMzIgIHVudXNlZDMgQjMyOworICAgIENBUkQzMiAgdW51c2VkNCBCMzI7CisgICAgQ0FSRDMyICB1bnVzZWQ1IEIzMjsKKyAgICBDQVJEMzIgIHVudXNlZDYgQjMyOworfSB4TWJ1ZlVwZGF0ZU5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJCS8qIGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICovCisgICAgQ0FSRDgJbWJ1ZlJlcVR5cGU7CQkvKiBhbHdheXMgWF9NYnVmR2V0QnVmZmVyVmVyc2lvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworfSB4TWJ1ZkdldEJ1ZmZlclZlcnNpb25SZXE7CisjZGVmaW5lIHN6X3hNYnVmR2V0QnVmZmVyVmVyc2lvblJlcQk0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXVudXNlZDsJCQkvKiBub3QgdXNlZCAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJbWFqb3JWZXJzaW9uOwkvKiBtYWpvciB2ZXJzaW9uIG9mIE11bHRpLUJ1ZmZlcmluZyBwcm90b2NvbCAqLworICAgIENBUkQ4CW1pbm9yVmVyc2lvbjsJLyogbWlub3IgdmVyc2lvbiBvZiBNdWx0aS1CdWZmZXJpbmcgcHJvdG9jb2wgKi8KKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geE1idWZHZXRCdWZmZXJWZXJzaW9uUmVwbHk7CisjZGVmaW5lIHN6X3hNYnVmR2V0QnVmZmVyVmVyc2lvblJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CW1idWZSZXFUeXBlOwkvKiBhbHdheXMgWF9NYnVmQ3JlYXRlSW1hZ2VCdWZmZXJzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCXdpbmRvdyBCMzI7CS8qIGFzc29jaWF0ZWQgd2luZG93ICovCisgICAgQ0FSRDgJdXBkYXRlQWN0aW9uOwkvKiBhY3Rpb24gYXQgdXBkYXRlICovCisgICAgQ0FSRDgJdXBkYXRlSGludDsJLyogaGludCBhcyB0byBmcmVxdWVuY3kgb2YgdXBkYXRlcyAqLworICAgIENBUkQxNgl1bnVzZWQ7Cit9IHhNYnVmQ3JlYXRlSW1hZ2VCdWZmZXJzUmVxOwkvKiBmb2xsb3dlZCBieSBidWZmZXIgaWRzICovCisjZGVmaW5lIHN6X3hNYnVmQ3JlYXRlSW1hZ2VCdWZmZXJzUmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXVudXNlZDsJCQkvKiBub3QgdXNlZCAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CW51bWJlckJ1ZmZlciBCMTY7CS8qIG51bWJlciBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkICovCisgICAgQ0FSRDE2CXVudXNlZDEgQjE2OworICAgIENBUkQzMgl1bnVzZWQyIEIzMjsKKyAgICBDQVJEMzIJdW51c2VkMyBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDQgQjMyOworICAgIENBUkQzMgl1bnVzZWQ1IEIzMjsKKyAgICBDQVJEMzIJdW51c2VkNiBCMzI7Cit9IHhNYnVmQ3JlYXRlSW1hZ2VCdWZmZXJzUmVwbHk7CisjZGVmaW5lIHN6X3hNYnVmQ3JlYXRlSW1hZ2VCdWZmZXJzUmVwbHkgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICovCisgICAgQ0FSRDgJbWJ1ZlJlcVR5cGU7CS8qIGFsd2F5cyBYX01idWZEZXN0cm95SW1hZ2VCdWZmZXJzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCXdpbmRvdyBCMzI7CS8qIGFzc29jaWF0ZWQgd2luZG93ICovCit9IHhNYnVmRGVzdHJveUltYWdlQnVmZmVyc1JlcTsKKyNkZWZpbmUgc3pfeE1idWZEZXN0cm95SW1hZ2VCdWZmZXJzUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICovCisgICAgQ0FSRDgJbWJ1ZlJlcVR5cGU7CS8qIGFsd2F5cyBYX01idWZEaXNwbGF5SW1hZ2VCdWZmZXJzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CW1pbkRlbGF5IEIxNjsJLyogbWluaW11bSB0aW1lIGJldHdlZW4gbGFzdCB1cGRhdGUgYW5kIG5vdyAqLworICAgIENBUkQxNgltYXhEZWxheSBCMTY7CS8qIG1heGltdW0gdGltZSBiZXR3ZWVuIGxhc3QgdXBkYXRlIGFuZCBub3cgKi8KK30geE1idWZEaXNwbGF5SW1hZ2VCdWZmZXJzUmVxOwkvKiBmb2xsb3dlZCBieSBsaXN0IG9mIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgc3pfeE1idWZEaXNwbGF5SW1hZ2VCdWZmZXJzUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICovCisgICAgQ0FSRDgJbWJ1ZlJlcVR5cGU7CS8qIGFsd2F5cyBYX01idWZTZXRNQnVmZmVyQXR0cmlidXRlcyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgl3aW5kb3cgQjMyOwkvKiBhc3NvY2lhdGVkIHdpbmRvdyAqLworICAgIENBUkQzMgl2YWx1ZU1hc2sgQjMyOwkvKiBtb2RpZmllZCBlbnRyaWVzICovCit9IHhNYnVmU2V0TUJ1ZmZlckF0dHJpYnV0ZXNSZXE7CS8qIGZvbGxvd2VkIGJ5IHZhbHVlcyAqLworI2RlZmluZSBzel94TWJ1ZlNldE1CdWZmZXJBdHRyaWJ1dGVzUmVxIDEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CW1idWZSZXFUeXBlOwkvKiBhbHdheXMgWF9NYnVmR2V0TUJ1ZmZlckF0dHJpYnV0ZXMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJd2luZG93IEIzMjsJLyogYXNzb2NpYXRlZCB3aW5kb3cgKi8KK30geE1idWZHZXRNQnVmZmVyQXR0cmlidXRlc1JlcTsKKyNkZWZpbmUgc3pfeE1idWZHZXRNQnVmZmVyQXR0cmlidXRlc1JlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXVudXNlZDsJCQkvKiBub3QgdXNlZCAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CWRpc3BsYXllZEJ1ZmZlciBCMTY7CS8qIGN1cnJlbnRseSB2aXNpYmxlIGJ1ZmZlciAqLworICAgIENBUkQ4CXVwZGF0ZUFjdGlvbjsKKyAgICBDQVJEOAl1cGRhdGVIaW50OworICAgIENBUkQ4CXdpbmRvd01vZGU7CisgICAgQ0FSRDgJdW51c2VkMDsKKyAgICBDQVJEMTYJdW51c2VkMSBCMTY7CisgICAgQ0FSRDMyCXVudXNlZDIgQjMyOworICAgIENBUkQzMgl1bnVzZWQzIEIzMjsKKyAgICBDQVJEMzIJdW51c2VkNCBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDUgQjMyOworfSB4TWJ1ZkdldE1CdWZmZXJBdHRyaWJ1dGVzUmVwbHk7CisjZGVmaW5lIHN6X3hNYnVmR2V0TUJ1ZmZlckF0dHJpYnV0ZXNSZXBseSAzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAltYnVmUmVxVHlwZTsJLyogYWx3YXlzIFhfTWJ1ZlNldEJ1ZmZlckF0dHJpYnV0ZXMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJYnVmZmVyIEIzMjsKKyAgICBDQVJEMzIJdmFsdWVNYXNrIEIzMjsKK30geE1idWZTZXRCdWZmZXJBdHRyaWJ1dGVzUmVxOwkvKiBmb2xsb3dlZCBieSB2YWx1ZXMgKi8KKyNkZWZpbmUgc3pfeE1idWZTZXRCdWZmZXJBdHRyaWJ1dGVzUmVxIDEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CW1idWZSZXFUeXBlOwkvKiBhbHdheXMgWF9NYnVmR2V0QnVmZmVyQXR0cmlidXRlcyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMglidWZmZXIgQjMyOworfSB4TWJ1ZkdldEJ1ZmZlckF0dHJpYnV0ZXNSZXE7CisjZGVmaW5lIHN6X3hNYnVmR2V0QnVmZmVyQXR0cmlidXRlc1JlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXVudXNlZDsJCQkvKiBub3QgdXNlZCAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCXdpbmRvdyBCMzI7CisgICAgQ0FSRDMyCWV2ZW50TWFzayBCMzI7CisgICAgQ0FSRDE2CWJ1ZmZlckluZGV4IEIxNjsKKyAgICBDQVJEOAlzaWRlOworICAgIENBUkQ4CXVudXNlZDA7CisgICAgQ0FSRDMyCXVudXNlZDEgQjMyOworICAgIENBUkQzMgl1bnVzZWQyIEIzMjsKKyAgICBDQVJEMzIJdW51c2VkMyBCMzI7Cit9IHhNYnVmR2V0QnVmZmVyQXR0cmlidXRlc1JlcGx5OworI2RlZmluZSBzel94TWJ1ZkdldEJ1ZmZlckF0dHJpYnV0ZXNSZXBseSAzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAltYnVmUmVxVHlwZTsJLyogYWx3YXlzIFhfTWJ1ZkdldEJ1ZmZlckluZm8gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBEcmF3YWJsZQlkcmF3YWJsZSBCMzI7Cit9IHhNYnVmR2V0QnVmZmVySW5mb1JlcTsKKyNkZWZpbmUgc3pfeE1idWZHZXRCdWZmZXJJbmZvUmVxIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJdW51c2VkOwkJCS8qIG5vdCB1c2VkICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJbm9ybWFsSW5mbyBCMTY7CisgICAgQ0FSRDE2CXN0ZXJlb0luZm8gQjE2OworICAgIENBUkQzMgl1bnVzZWQxIEIzMjsKKyAgICBDQVJEMzIJdW51c2VkMiBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDMgQjMyOworICAgIENBUkQzMgl1bnVzZWQ0IEIzMjsKKyAgICBDQVJEMzIJdW51c2VkNSBCMzI7Cit9IHhNYnVmR2V0QnVmZmVySW5mb1JlcGx5OwkJCS8qIGZvbGxvd2VkIGJ5IGJ1ZmZlciBpbmZvcyAqLworI2RlZmluZSBzel94TWJ1ZkdldEJ1ZmZlckluZm9SZXBseSAzMgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CW1idWZSZXFUeXBlOwkvKiBhbHdheXMgWF9NYnVmQ3JlYXRlU3RlcmVvV2luZG93ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJdW51c2VkMDsKKyAgICBDQVJEOAl1bnVzZWQxOworICAgIENBUkQ4CXVudXNlZDI7CisgICAgQ0FSRDgJZGVwdGg7CisgICAgV2luZG93CXdpZCBCMzI7CisgICAgV2luZG93CXBhcmVudCBCMzI7CisgICAgTXVsdGlidWZmZXIJbGVmdCBCMzI7CS8qIGFzc29jaWF0ZWQgYnVmZmVycyAqLworICAgIE11bHRpYnVmZmVyCXJpZ2h0IEIzMjsKKyAgICBJTlQxNgl4IEIxNjsKKyAgICBJTlQxNgl5IEIxNjsKKyAgICBDQVJEMTYJd2lkdGggQjE2OworICAgIENBUkQxNgloZWlnaHQgQjE2OworICAgIENBUkQxNglib3JkZXJXaWR0aCBCMTY7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQxNgljX2NsYXNzIEIxNjsKKyNlbHNlCisgICAgQ0FSRDE2CWNsYXNzIEIxNjsKKyNlbmRpZgorICAgIFZpc3VhbElECXZpc3VhbCBCMzI7CisgICAgQ0FSRDMyCW1hc2sgQjMyOworfSB4TWJ1ZkNyZWF0ZVN0ZXJlb1dpbmRvd1JlcTsJCS8qIGZvbGxvd2VkIGJ5IHZhbHVlIGxpc3QgKi8KKyNkZWZpbmUgc3pfeE1idWZDcmVhdGVTdGVyZW9XaW5kb3dSZXEgNDQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICByZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOCAgICAgbWJ1ZlJlcVR5cGU7ICAgIC8qIGFsd2F5cyBYX01idWZDbGVhckltYWdlQnVmZmVyQXJlYSAqLworICAgIENBUkQxNiAgICBsZW5ndGggQjE2OworICAgIE11bHRpYnVmZmVyICAgICAgIGJ1ZmZlciBCMzI7CisgICAgSU5UMTYgICAgIHggQjE2OworICAgIElOVDE2ICAgICB5IEIxNjsKKyAgICBDQVJEMTYgICAgd2lkdGggQjE2OworICAgIENBUkQxNiAgICBoZWlnaHQgQjE2OworICAgIENBUkQ4ICAgICB1bnVzZWQwOworICAgIENBUkQ4ICAgICB1bnVzZWQxOworICAgIENBUkQ4ICAgICB1bnVzZWQyOworICAgIEJPT0wgICAgICBleHBvc3VyZXM7Cit9IHhNYnVmQ2xlYXJJbWFnZUJ1ZmZlckFyZWFSZXE7CisjZGVmaW5lIHN6X3hNYnVmQ2xlYXJJbWFnZUJ1ZmZlckFyZWFSZXEgMjAKKworI3VuZGVmIFdpbmRvdworI3VuZGVmIERyYXdhYmxlCisjdW5kZWYgVmlzdWFsSUQKKyN1bmRlZiBNdWx0aWJ1ZmZlcgorCisjZW5kaWYgLyogX01VTFRJQlVGUFJPVE9fSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2VjdXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2VjdXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTI3YjI5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zZWN1ci5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCitDb3B5cmlnaHQgMTk5NiwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gVGhlIE9wZW4gR3JvdXAuCisqLworCisjaWZuZGVmIF9TRUNVUl9ICisjZGVmaW5lIF9TRUNVUl9ICisKKyNkZWZpbmUgU0VDVVJJVFlfRVhURU5TSU9OX05BTUUJCSJTRUNVUklUWSIKKyNkZWZpbmUgU0VDVVJJVFlfTUFKT1JfVkVSU0lPTgkJMQorI2RlZmluZSBTRUNVUklUWV9NSU5PUl9WRVJTSU9OCQkwCisKKyNkZWZpbmUgWFNlY3VyaXR5TnVtYmVyRXZlbnRzCQkxCisjZGVmaW5lIFhTZWN1cml0eU51bWJlckVycm9ycwkJMgorI2RlZmluZSBYU2VjdXJpdHlCYWRBdXRob3JpemF0aW9uCTAKKyNkZWZpbmUgWFNlY3VyaXR5QmFkQXV0aG9yaXphdGlvblByb3RvY29sIDEKKworLyogdHJ1c3QgbGV2ZWxzICovCisjZGVmaW5lIFhTZWN1cml0eUNsaWVudFRydXN0ZWQJCTAKKyNkZWZpbmUgWFNlY3VyaXR5Q2xpZW50VW50cnVzdGVkCTEKKworLyogYXV0aG9yaXphdGlvbiBhdHRyaWJ1dGUgbWFza3MgKi8KKyNkZWZpbmUgWFNlY3VyaXR5VGltZW91dAkJKDE8PDApCisjZGVmaW5lIFhTZWN1cml0eVRydXN0TGV2ZWwJCSgxPDwxKQorI2RlZmluZSBYU2VjdXJpdHlHcm91cCAgCQkoMTw8MikKKyNkZWZpbmUgWFNlY3VyaXR5RXZlbnRNYXNrCQkoMTw8MykKKyNkZWZpbmUgWFNlY3VyaXR5QWxsQXV0aG9yaXphdGlvbkF0dHJpYnV0ZXMgXAorIChYU2VjdXJpdHlUaW1lb3V0IHwgWFNlY3VyaXR5VHJ1c3RMZXZlbCB8IFhTZWN1cml0eUdyb3VwIHwgWFNlY3VyaXR5RXZlbnRNYXNrKQorCisvKiBldmVudCBtYXNrcyAqLworI2RlZmluZSBYU2VjdXJpdHlBdXRob3JpemF0aW9uUmV2b2tlZE1hc2sgKDE8PDApCisjZGVmaW5lIFhTZWN1cml0eUFsbEV2ZW50TWFza3MgWFNlY3VyaXR5QXV0aG9yaXphdGlvblJldm9rZWRNYXNrCisKKy8qIGV2ZW50IG9mZnNldHMgKi8KKyNkZWZpbmUgWFNlY3VyaXR5QXV0aG9yaXphdGlvblJldm9rZWQgMAorCisjZGVmaW5lIFhTZWN1cml0eUF1dGhvcml6YXRpb25OYW1lCSJYQy1RVUVSWS1TRUNVUklUWS0xIgorI2RlZmluZSBYU2VjdXJpdHlBdXRob3JpemF0aW9uTmFtZUxlbgkxOQorCisjZW5kaWYgLyogX1NFQ1VSX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2VjdXJpdHkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2VjdXJpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTU0MTMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zZWN1cml0eS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCitDb3B5cmlnaHQgMTk5NiwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gVGhlIE9wZW4gR3JvdXAuCisqLworCisjaWZuZGVmIF9TRUNVUklUWV9ICisjZGVmaW5lIF9TRUNVUklUWV9ICisKKyNkZWZpbmUgX1hBVVRIX1NUUlVDVF9PTkxZCisjaW5jbHVkZSA8WDExL1hhdXRoLmg+CisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9zZWN1ci5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKK1N0YXR1cyBYU2VjdXJpdHlRdWVyeUV4dGVuc2lvbiAoCisgICAgRGlzcGxheSAqZHB5LAorICAgIGludCAqbWFqb3JfdmVyc2lvbl9yZXR1cm4sCisgICAgaW50ICptaW5vcl92ZXJzaW9uX3JldHVybik7CisKK1hhdXRoICpYU2VjdXJpdHlBbGxvY1hhdXRoKHZvaWQpOworCit2b2lkIFhTZWN1cml0eUZyZWVYYXV0aChYYXV0aCAqYXV0aCk7CisKKy8qIHR5cGUgZm9yIHJldHVybmVkIGF1dGggaWRzICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgWFNlY3VyaXR5QXV0aG9yaXphdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCB0aW1lb3V0OworICAgIHVuc2lnbmVkIGludCB0cnVzdF9sZXZlbDsKKyAgICBYSUQgICAgICAgICAgZ3JvdXA7CisgICAgbG9uZwkgZXZlbnRfbWFzazsKK30gWFNlY3VyaXR5QXV0aG9yaXphdGlvbkF0dHJpYnV0ZXM7CisKK1hhdXRoICpYU2VjdXJpdHlHZW5lcmF0ZUF1dGhvcml6YXRpb24oCisgICAgRGlzcGxheSAqZHB5LAorICAgIFhhdXRoICphdXRoX2luLAorICAgIHVuc2lnbmVkIGxvbmcgdmFsdWVtYXNrLAorICAgIFhTZWN1cml0eUF1dGhvcml6YXRpb25BdHRyaWJ1dGVzICphdHRyaWJ1dGVzLAorICAgIFhTZWN1cml0eUF1dGhvcml6YXRpb24gKmF1dGhfaWRfcmV0dXJuKTsKKworU3RhdHVzIFhTZWN1cml0eVJldm9rZUF1dGhvcml6YXRpb24oCisgICAgRGlzcGxheSAqZHB5LAorICAgIFhTZWN1cml0eUF1dGhvcml6YXRpb24gYXV0aF9pZCk7CisKK19YRlVOQ1BST1RPRU5ECisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdHlwZTsJCSAgICAgIC8qIGV2ZW50IGJhc2UgKyBYU2VjdXJpdHlBdXRob3JpemF0aW9uUmV2b2tlZCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgc2VuZF9ldmVudDsJICAgICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAqZGlzcGxheTsJICAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFhTZWN1cml0eUF1dGhvcml6YXRpb24gYXV0aF9pZDsgLyogcmV2b2tlZCBhdXRob3JpemF0aW9uIGlkICovCit9IFhTZWN1cml0eUF1dGhvcml6YXRpb25SZXZva2VkRXZlbnQ7CisKKyNlbmRpZiAvKiBfU0VDVVJJVFlfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zZWN1cnByb3RvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NlY3VycHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDlhNGM1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zZWN1cnByb3RvLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCitDb3B5cmlnaHQgMTk5NiwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gVGhlIE9wZW4gR3JvdXAuCisqLworCisjaWZuZGVmIF9TRUNVUlBST1RPX0gKKyNkZWZpbmUgX1NFQ1VSUFJPVE9fSAorCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc2VjdXIuaD4KKworI2RlZmluZSBYX1NlY3VyaXR5UXVlcnlWZXJzaW9uCQkwCisjZGVmaW5lIFhfU2VjdXJpdHlHZW5lcmF0ZUF1dGhvcml6YXRpb24gMQorI2RlZmluZSBYX1NlY3VyaXR5UmV2b2tlQXV0aG9yaXphdGlvbiAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICAgIHJlcVR5cGU7CisgICAgQ0FSRDggICAgICAgc2VjdXJpdHlSZXFUeXBlOworICAgIENBUkQxNiAgICAgIGxlbmd0aCBCMTY7CisgICAgQ0FSRDE2ICAgICAgbWFqb3JWZXJzaW9uIEIxNjsKKyAgICBDQVJEMTYgICAgICBtaW5vclZlcnNpb24gQjE2OworfSB4U2VjdXJpdHlRdWVyeVZlcnNpb25SZXE7CisjZGVmaW5lIHN6X3hTZWN1cml0eVF1ZXJ5VmVyc2lvblJlcSAJOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICB0eXBlOworICAgIENBUkQ4ICAgcGFkMDsKKyAgICBDQVJEMTYgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgIGxlbmd0aAkgQjMyOworICAgIENBUkQxNiAgbWFqb3JWZXJzaW9uIEIxNjsKKyAgICBDQVJEMTYgIG1pbm9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDMyICBwYWQxCSBCMzI7CisgICAgQ0FSRDMyICBwYWQyCSBCMzI7CisgICAgQ0FSRDMyICBwYWQzCSBCMzI7CisgICAgQ0FSRDMyICBwYWQ0CSBCMzI7CisgICAgQ0FSRDMyICBwYWQ1CSBCMzI7CisgfSB4U2VjdXJpdHlRdWVyeVZlcnNpb25SZXBseTsKKyNkZWZpbmUgc3pfeFNlY3VyaXR5UXVlcnlWZXJzaW9uUmVwbHkgIAkzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICAgICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgICAgICBzZWN1cml0eVJlcVR5cGU7CisgICAgQ0FSRDE2ICAgICAgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJbmJ5dGVzQXV0aFByb3RvIEIxNjsKKyAgICBDQVJEMTYJbmJ5dGVzQXV0aERhdGEgQjE2OworICAgIENBUkQzMgl2YWx1ZU1hc2sgQjMyOworICAgIC8qIGF1dGggcHJvdG9jb2wgbmFtZSBwYWRkZWQgdG8gNCBieXRlcyAqLworICAgIC8qIGF1dGggcHJvdG9jb2wgZGF0YSBwYWRkZWQgdG8gNCBieXRlcyAqLworICAgIC8qIGxpc3Qgb2YgQ0FSRDMyIHZhbHVlcywgaWYgYW55ICovCit9IHhTZWN1cml0eUdlbmVyYXRlQXV0aG9yaXphdGlvblJlcTsKKyNkZWZpbmUgc3pfeFNlY3VyaXR5R2VuZXJhdGVBdXRob3JpemF0aW9uUmVxIDEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHR5cGU7CisgICAgQ0FSRDggICBwYWQwOworICAgIENBUkQxNiAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAgbGVuZ3RoCSBCMzI7CisgICAgQ0FSRDMyICBhdXRoSWQJIEIzMjsKKyAgICBDQVJEMTYgIGRhdGFMZW5ndGggICBCMTY7CisgICAgQ0FSRDE2ICBwYWQxCSBCMTY7CisgICAgQ0FSRDMyICBwYWQyCSBCMzI7CisgICAgQ0FSRDMyICBwYWQzCSBCMzI7CisgICAgQ0FSRDMyICBwYWQ0CSBCMzI7CisgICAgQ0FSRDMyICBwYWQ1CSBCMzI7CisgfSB4U2VjdXJpdHlHZW5lcmF0ZUF1dGhvcml6YXRpb25SZXBseTsKKyNkZWZpbmUgc3pfeFNlY3VyaXR5R2VuZXJhdGVBdXRob3JpemF0aW9uUmVwbHkgIAkzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICAgICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgICAgICBzZWN1cml0eVJlcVR5cGU7CisgICAgQ0FSRDE2ICAgICAgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJYXV0aElkIEIzMjsKK30geFNlY3VyaXR5UmV2b2tlQXV0aG9yaXphdGlvblJlcTsKKyNkZWZpbmUgc3pfeFNlY3VyaXR5UmV2b2tlQXV0aG9yaXphdGlvblJlcSA4CisKK3R5cGVkZWYgc3RydWN0IF94U2VjdXJpdHlBdXRob3JpemF0aW9uUmV2b2tlZEV2ZW50IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQlkZXRhaWw7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJYXV0aElkIEIzMjsKKyAgICBDQVJEMzIJcGFkMAkgQjMyOworICAgIENBUkQzMglwYWQxCSBCMzI7CisgICAgQ0FSRDMyCXBhZDIJIEIzMjsKKyAgICBDQVJEMzIJcGFkMwkgQjMyOworICAgIENBUkQzMglwYWQ0CSBCMzI7CisgICAgQ0FSRDMyCXBhZDUJIEIzMjsKK30geFNlY3VyaXR5QXV0aG9yaXphdGlvblJldm9rZWRFdmVudDsKKyNkZWZpbmUgc3pfeFNlY3VyaXR5QXV0aG9yaXphdGlvblJldm9rZWRFdmVudCAzMgorCisjZW5kaWYgLyogX1NFQ1VSUFJPVE9fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YWY1YjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NoYXBlLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TSEFQRV9IXworI2RlZmluZSBfU0hBUEVfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc2hhcGVjb25zdC5oPgorCisjaWZuZGVmIF9TSEFQRV9TRVJWRVJfCisjaW5jbHVkZSA8WDExL1h1dGlsLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQJdHlwZTsJCSAgICAvKiBvZiBldmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sIHNlbmRfZXZlbnQ7CSAgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tZSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAqZGlzcGxheTsJICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgd2luZG93OwkgICAgLyogd2luZG93IG9mIGV2ZW50ICovCisgICAgaW50IGtpbmQ7CQkgICAgLyogU2hhcGVCb3VuZGluZyBvciBTaGFwZUNsaXAgKi8KKyAgICBpbnQgeCwgeTsJCSAgICAvKiBleHRlbnRzIG9mIG5ldyByZWdpb24gKi8KKyAgICB1bnNpZ25lZCB3aWR0aCwgaGVpZ2h0OworICAgIFRpbWUgdGltZTsJCSAgICAvKiBzZXJ2ZXIgdGltZXN0YW1wIHdoZW4gcmVnaW9uIGNoYW5nZWQgKi8KKyAgICBCb29sIHNoYXBlZDsJICAgIC8qIHRydWUgaWYgdGhlIHJlZ2lvbiBleGlzdHMgKi8KK30gWFNoYXBlRXZlbnQ7CisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIEJvb2wgWFNoYXBlUXVlcnlFeHRlbnNpb24gKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgaW50KgkvKiBldmVudF9iYXNlICovLAorICAgIGludCoJLyogZXJyb3JfYmFzZSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU2hhcGVRdWVyeVZlcnNpb24gKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgaW50KgkvKiBtYWpvcl92ZXJzaW9uICovLAorICAgIGludCoJLyogbWlub3JfdmVyc2lvbiAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNoYXBlQ29tYmluZVJlZ2lvbiAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJLyogZGVzdCAqLywKKyAgICBpbnQJCS8qIGRlc3Rfa2luZCAqLywKKyAgICBpbnQJCS8qIHhfb2ZmICovLAorICAgIGludAkJLyogeV9vZmYgKi8sCisgICAgUmVnaW9uCS8qIHJlZ2lvbiAqLywKKyAgICBpbnQJCS8qIG9wICovCispOworCitleHRlcm4gdm9pZCBYU2hhcGVDb21iaW5lUmVjdGFuZ2xlcyAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJLyogZGVzdCAqLywKKyAgICBpbnQJCS8qIGRlc3Rfa2luZCAqLywKKyAgICBpbnQJCS8qIHhfb2ZmICovLAorICAgIGludAkJLyogeV9vZmYgKi8sCisgICAgWFJlY3RhbmdsZSoJLyogcmVjdGFuZ2xlcyAqLywKKyAgICBpbnQJCS8qIG5fcmVjdHMgKi8sCisgICAgaW50CQkvKiBvcCAqLywKKyAgICBpbnQJCS8qIG9yZGVyaW5nICovCispOworCitleHRlcm4gdm9pZCBYU2hhcGVDb21iaW5lTWFzayAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJLyogZGVzdCAqLywKKyAgICBpbnQJCS8qIGRlc3Rfa2luZCAqLywKKyAgICBpbnQJCS8qIHhfb2ZmICovLAorICAgIGludAkJLyogeV9vZmYgKi8sCisgICAgUGl4bWFwCS8qIHNyYyAqLywKKyAgICBpbnQJCS8qIG9wICovCispOworCitleHRlcm4gdm9pZCBYU2hhcGVDb21iaW5lU2hhcGUgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CS8qIGRlc3QgKi8sCisgICAgaW50CQkvKiBkZXN0X2tpbmQgKi8sCisgICAgaW50CQkvKiB4X29mZiAqLywKKyAgICBpbnQJCS8qIHlfb2ZmICovLAorICAgIFdpbmRvdwkvKiBzcmMgKi8sCisgICAgaW50CQkvKiBzcmNfa2luZCAqLywKKyAgICBpbnQJCS8qIG9wICovCispOworCitleHRlcm4gdm9pZCBYU2hhcGVPZmZzZXRTaGFwZSAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJLyogZGVzdCAqLywKKyAgICBpbnQJCS8qIGRlc3Rfa2luZCAqLywKKyAgICBpbnQJCS8qIHhfb2ZmICovLAorICAgIGludAkJLyogeV9vZmYgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFNoYXBlUXVlcnlFeHRlbnRzICgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHdpbmRvdyAqLywKKyAgICBCb29sKgkJLyogYm91bmRpbmdfc2hhcGVkICovLAorICAgIGludCoJCS8qIHhfYm91bmRpbmcgKi8sCisgICAgaW50KgkJLyogeV9ib3VuZGluZyAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdfYm91bmRpbmcgKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiBoX2JvdW5kaW5nICovLAorICAgIEJvb2wqCQkvKiBjbGlwX3NoYXBlZCAqLywKKyAgICBpbnQqCQkvKiB4X2NsaXAgKi8sCisgICAgaW50KgkJLyogeV9jbGlwICovLAorICAgIHVuc2lnbmVkIGludCoJLyogd19jbGlwICovLAorICAgIHVuc2lnbmVkIGludCoJLyogaF9jbGlwICovCispOworCitleHRlcm4gdm9pZCBYU2hhcGVTZWxlY3RJbnB1dCAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3aW5kb3cgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBtYXNrICovCispOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBYU2hhcGVJbnB1dFNlbGVjdGVkICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkvKiB3aW5kb3cgKi8KKyk7CisKK2V4dGVybiBYUmVjdGFuZ2xlICpYU2hhcGVHZXRSZWN0YW5nbGVzICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkvKiB3aW5kb3cgKi8sCisgICAgaW50CQkvKiBraW5kICovLAorICAgIGludCoJLyogY291bnQgKi8sCisgICAgaW50KgkvKiBvcmRlcmluZyAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qICFfU0hBUEVfU0VSVkVSXyAqLworCisjZW5kaWYgLyogX1NIQVBFX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NoYXBlY29uc3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2hhcGVjb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwODg5NTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NoYXBlY29uc3QuaApAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU0hBUEVDT05TVF9IXworI2RlZmluZSBfU0hBUEVDT05TVF9IXworCisvKgorICogUHJvdG9jb2wgcmVxdWVzdHMgY29uc3RhbnRzIGFuZCBhbGlnbm1lbnQgdmFsdWVzCisgKiBUaGVzZSB3b3VsZCByZWFsbHkgYmUgaW4gU0hBUEUncyBYLmggYW5kIFhwcm90by5oIGVxdWl2YWxlbnRzCisgKi8KKworI2RlZmluZSBTSEFQRU5BTUUgIlNIQVBFIgorCisjZGVmaW5lIFNIQVBFX01BSk9SX1ZFUlNJT04JMQkvKiBjdXJyZW50IHZlcnNpb24gbnVtYmVycyAqLworI2RlZmluZSBTSEFQRV9NSU5PUl9WRVJTSU9OCTEKKworI2RlZmluZSBTaGFwZVNldAkJCTAKKyNkZWZpbmUgU2hhcGVVbmlvbgkJCTEKKyNkZWZpbmUgU2hhcGVJbnRlcnNlY3QJCQkyCisjZGVmaW5lIFNoYXBlU3VidHJhY3QJCQkzCisjZGVmaW5lIFNoYXBlSW52ZXJ0CQkJNAorCisjZGVmaW5lIFNoYXBlQm91bmRpbmcJCQkwCisjZGVmaW5lIFNoYXBlQ2xpcAkJCTEKKyNkZWZpbmUgU2hhcGVJbnB1dAkJCTIKKworI2RlZmluZSBTaGFwZU5vdGlmeU1hc2sJCQkoMUwgPDwgMCkKKyNkZWZpbmUgU2hhcGVOb3RpZnkJCQkwCisKKyNkZWZpbmUgU2hhcGVOdW1iZXJFdmVudHMJCShTaGFwZU5vdGlmeSArIDEpCisKKyNlbmRpZiAvKiBfU0hBUEVDT05TVF9IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZXByb3RvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NoYXBlcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWJkMWExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZXByb3RvLmgKQEAgLTAsMCArMSwyMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TSEFQRVBST1RPX0hfCisjZGVmaW5lIF9TSEFQRVBST1RPX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9zaGFwZWNvbnN0Lmg+CisKKy8qCisgKiBQcm90b2NvbCByZXF1ZXN0cyBjb25zdGFudHMgYW5kIGFsaWdubWVudCB2YWx1ZXMKKyAqIFRoZXNlIHdvdWxkIHJlYWxseSBiZSBpbiBTSEFQRSdzIFguaCBhbmQgWHByb3RvLmggZXF1aXZhbGVudHMKKyAqLworCisjZGVmaW5lIFdpbmRvdyBDQVJEMzIKKyNkZWZpbmUgVGltZSBDQVJEMzIKKworI2RlZmluZSBYX1NoYXBlUXVlcnlWZXJzaW9uCQkwCisjZGVmaW5lIFhfU2hhcGVSZWN0YW5nbGVzCQkxCisjZGVmaW5lIFhfU2hhcGVNYXNrCQkJMgorI2RlZmluZSBYX1NoYXBlQ29tYmluZQkJCTMKKyNkZWZpbmUgWF9TaGFwZU9mZnNldAkJCTQKKyNkZWZpbmUgWF9TaGFwZVF1ZXJ5RXh0ZW50cwkJNQorI2RlZmluZSBYX1NoYXBlU2VsZWN0SW5wdXQJCTYKKyNkZWZpbmUgWF9TaGFwZUlucHV0U2VsZWN0ZWQJCTcKKyNkZWZpbmUgWF9TaGFwZUdldFJlY3RhbmdsZXMJCTgKKwordHlwZWRlZiBzdHJ1Y3QgX1NoYXBlUXVlcnlWZXJzaW9uIHsKKwlDQVJEOAlyZXFUeXBlOwkJLyogYWx3YXlzIFNoYXBlUmVxQ29kZSAqLworCUNBUkQ4CXNoYXBlUmVxVHlwZTsJCS8qIGFsd2F5cyBYX1NoYXBlUXVlcnlWZXJzaW9uICovCisJQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhTaGFwZVF1ZXJ5VmVyc2lvblJlcTsKKyNkZWZpbmUgc3pfeFNoYXBlUXVlcnlWZXJzaW9uUmVxCTQKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisJQ0FSRDgJdW51c2VkOwkJCS8qIG5vdCB1c2VkICovCisJQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKwlDQVJEMzIJbGVuZ3RoIEIzMjsKKwlDQVJEMTYJbWFqb3JWZXJzaW9uIEIxNjsJLyogbWFqb3IgdmVyc2lvbiBvZiBTSEFQRSBwcm90b2NvbCAqLworCUNBUkQxNgltaW5vclZlcnNpb24gQjE2OwkvKiBtaW5vciB2ZXJzaW9uIG9mIFNIQVBFIHByb3RvY29sICovCisJQ0FSRDMyCXBhZDAgQjMyOworCUNBUkQzMglwYWQxIEIzMjsKKwlDQVJEMzIJcGFkMiBCMzI7CisJQ0FSRDMyCXBhZDMgQjMyOworCUNBUkQzMglwYWQ0IEIzMjsKK30geFNoYXBlUXVlcnlWZXJzaW9uUmVwbHk7CisjZGVmaW5lIHN6X3hTaGFwZVF1ZXJ5VmVyc2lvblJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9TaGFwZVJlY3RhbmdsZXMgeworCUNBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBTaGFwZVJlcUNvZGUgKi8KKwlDQVJEOAlzaGFwZVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NoYXBlUmVjdGFuZ2xlcyAqLworCUNBUkQxNglsZW5ndGggQjE2OworCUNBUkQ4CW9wOwkJLyogU2V0LCAuLi4gKi8KKwlDQVJEOAlkZXN0S2luZDsJLyogU2hhcGVCb3VuZGluZyBvciBTaGFwZUNsaXAgKi8KKwlDQVJEOAlvcmRlcmluZzsJLyogVW5Tb3J0ZWQsIFlTb3J0ZWQsIFlYU29ydGVkLCBZWEJhbmRlZCAqLworCUNBUkQ4CXBhZDA7CQkvKiBub3QgdXNlZCAqLworCVdpbmRvdwlkZXN0IEIzMjsKKwlJTlQxNgl4T2ZmIEIxNjsKKwlJTlQxNgl5T2ZmIEIxNjsKK30geFNoYXBlUmVjdGFuZ2xlc1JlcTsJCS8qIGZvbGxvd2VkIGJ5IHhSZWN0cyAqLworI2RlZmluZSBzel94U2hhcGVSZWN0YW5nbGVzUmVxCTE2CisKK3R5cGVkZWYgc3RydWN0IF9TaGFwZU1hc2sgeworCUNBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBTaGFwZVJlcUNvZGUgKi8KKwlDQVJEOAlzaGFwZVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NoYXBlTWFzayAqLworCUNBUkQxNglsZW5ndGggQjE2OworCisJQ0FSRDgJb3A7CQkvKiBTZXQsIC4uLiAqLworCUNBUkQ4CWRlc3RLaW5kOwkvKiBTaGFwZUJvdW5kaW5nIG9yIFNoYXBlQ2xpcCAqLworCUNBUkQxNglqdW5rIEIxNjsJLyogbm90IHVzZWQgKi8KKworCVdpbmRvdwlkZXN0IEIzMjsKKwlJTlQxNgl4T2ZmIEIxNjsKKwlJTlQxNgl5T2ZmIEIxNjsKKwlDQVJEMzIJc3JjIEIzMjsJLyogMSBiaXQgcGl4bWFwICovCit9IHhTaGFwZU1hc2tSZXE7CisjZGVmaW5lIHN6X3hTaGFwZU1hc2tSZXEJMjAKKwordHlwZWRlZiBzdHJ1Y3QgX1NoYXBlQ29tYmluZSB7CisJQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFNoYXBlUmVxQ29kZSAqLworCUNBUkQ4CXNoYXBlUmVxVHlwZTsJLyogYWx3YXlzIFhfU2hhcGVDb21iaW5lICovCisJQ0FSRDE2CWxlbmd0aCBCMTY7CisJQ0FSRDgJb3A7CQkvKiBTZXQsIC4uLiAqLworCUNBUkQ4CWRlc3RLaW5kOwkvKiBTaGFwZUJvdW5kaW5nIG9yIFNoYXBlQ2xpcCAqLworCUNBUkQ4CXNyY0tpbmQ7CS8qIFNoYXBlQm91bmRpbmcgb3IgU2hhcGVDbGlwICovCisJQ0FSRDgJanVuazsJCS8qIG5vdCB1c2VkICovCisJV2luZG93CWRlc3QgQjMyOworCUlOVDE2CXhPZmYgQjE2OworCUlOVDE2CXlPZmYgQjE2OworCVdpbmRvdwlzcmMgQjMyOworfSB4U2hhcGVDb21iaW5lUmVxOworI2RlZmluZSBzel94U2hhcGVDb21iaW5lUmVxCTIwCisKK3R5cGVkZWYgc3RydWN0IF9TaGFwZU9mZnNldCB7CisJQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFNoYXBlUmVxQ29kZSAqLworCUNBUkQ4CXNoYXBlUmVxVHlwZTsJLyogYWx3YXlzIFhfU2hhcGVPZmZzZXQgKi8KKwlDQVJEMTYJbGVuZ3RoIEIxNjsKKwlDQVJEOAlkZXN0S2luZDsJLyogU2hhcGVCb3VuZGluZyBvciBTaGFwZUNsaXAgKi8KKwlDQVJEOAlqdW5rMTsJCS8qIG5vdCB1c2VkICovCisJQ0FSRDE2CWp1bmsyIEIxNjsJLyogbm90IHVzZWQgKi8KKwlXaW5kb3cJZGVzdCBCMzI7CisJSU5UMTYJeE9mZiBCMTY7CisJSU5UMTYJeU9mZiBCMTY7Cit9IHhTaGFwZU9mZnNldFJlcTsKKyNkZWZpbmUgc3pfeFNoYXBlT2Zmc2V0UmVxCTE2CisKK3R5cGVkZWYgc3RydWN0IF9TaGFwZVF1ZXJ5RXh0ZW50cyB7CisJQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFNoYXBlUmVxQ29kZSAqLworCUNBUkQ4CXNoYXBlUmVxVHlwZTsJLyogYWx3YXlzIFhfU2hhcGVRdWVyeUV4dGVudHMgKi8KKwlDQVJEMTYJbGVuZ3RoIEIxNjsKKwlXaW5kb3cJd2luZG93IEIzMjsKK30geFNoYXBlUXVlcnlFeHRlbnRzUmVxOworI2RlZmluZSBzel94U2hhcGVRdWVyeUV4dGVudHNSZXEJOAorCit0eXBlZGVmIHN0cnVjdCB7CisJQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKwlDQVJEOAl1bnVzZWQ7CQkJLyogbm90IHVzZWQgKi8KKwlDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworCUNBUkQzMglsZW5ndGggQjMyOwkJLyogMCAqLworCUNBUkQ4CWJvdW5kaW5nU2hhcGVkOwkJLyogd2luZG93IGhhcyBib3VuZGluZyBzaGFwZSAqLworCUNBUkQ4CWNsaXBTaGFwZWQ7CQkvKiB3aW5kb3cgaGFzIGNsaXAgc2hhcGUgKi8KKwlDQVJEMTYJdW51c2VkMSBCMTY7CisJSU5UMTYJeEJvdW5kaW5nU2hhcGUgQjE2OwkvKiBleHRlbnRzIG9mIGJvdW5kaW5nIHNoYXBlICovCisJSU5UMTYJeUJvdW5kaW5nU2hhcGUgQjE2OworCUNBUkQxNgl3aWR0aEJvdW5kaW5nU2hhcGUgQjE2OworCUNBUkQxNgloZWlnaHRCb3VuZGluZ1NoYXBlIEIxNjsKKwlJTlQxNgl4Q2xpcFNoYXBlIEIxNjsJCS8qIGV4dGVudHMgb2YgY2xpcCBzaGFwZSAqLworCUlOVDE2CXlDbGlwU2hhcGUgQjE2OworCUNBUkQxNgl3aWR0aENsaXBTaGFwZSBCMTY7CisJQ0FSRDE2CWhlaWdodENsaXBTaGFwZSBCMTY7CisJQ0FSRDMyCXBhZDEgQjMyOworfSB4U2hhcGVRdWVyeUV4dGVudHNSZXBseTsKKyNkZWZpbmUgc3pfeFNoYXBlUXVlcnlFeHRlbnRzUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1NoYXBlU2VsZWN0SW5wdXQgeworCUNBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBTaGFwZVJlcUNvZGUgKi8KKwlDQVJEOAlzaGFwZVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NoYXBlU2VsZWN0SW5wdXQgKi8KKwlDQVJEMTYJbGVuZ3RoIEIxNjsKKwlXaW5kb3cJd2luZG93IEIzMjsKKwlCWVRFCWVuYWJsZTsJCS8qIHhUcnVlIC0+IHNlbmQgZXZlbnRzICovCisJQllURQlwYWQxOworCUNBUkQxNglwYWQyIEIxNjsKK30geFNoYXBlU2VsZWN0SW5wdXRSZXE7CisjZGVmaW5lIHN6X3hTaGFwZVNlbGVjdElucHV0UmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IF9TaGFwZU5vdGlmeSB7CisJQllURQl0eXBlOwkJLyogYWx3YXlzIGV2ZW50QmFzZSArIFNoYXBlTm90aWZ5ICovCisJQllURQlraW5kOwkJLyogZWl0aGVyIFNoYXBlQm91bmRpbmcgb3IgU2hhcGVDbGlwICovCisJQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKwlXaW5kb3cJd2luZG93IEIzMjsKKwlJTlQxNgl4IEIxNjsKKwlJTlQxNgl5IEIxNjsJCS8qIGV4dGVudHMgb2YgbmV3IHNoYXBlICovCisJQ0FSRDE2CXdpZHRoIEIxNjsKKwlDQVJEMTYJaGVpZ2h0IEIxNjsKKwlUaW1lCXRpbWUgQjMyOwkvKiB0aW1lIG9mIGNoYW5nZSAqLworCUJZVEUJc2hhcGVkOwkJLyogc2V0IHdoZW4gYSBzaGFwZSBhY3R1YWwgZXhpc3RzICovCisJQllURQlwYWQwOworCUNBUkQxNglwYWQxIEIxNjsKKwlDQVJEMzIJcGFkMiBCMzI7CisJQ0FSRDMyCXBhZDMgQjMyOworfSB4U2hhcGVOb3RpZnlFdmVudDsKKyNkZWZpbmUgc3pfeFNoYXBlTm90aWZ5RXZlbnQJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1NoYXBlSW5wdXRTZWxlY3RlZCB7CisJQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFNoYXBlUmVxQ29kZSAqLworCUNBUkQ4CXNoYXBlUmVxVHlwZTsJLyogYWx3YXlzIFhfU2hhcGVJbnB1dFNlbGVjdGVkICovCisJQ0FSRDE2CWxlbmd0aCBCMTY7CisJV2luZG93CXdpbmRvdyBCMzI7Cit9IHhTaGFwZUlucHV0U2VsZWN0ZWRSZXE7CisjZGVmaW5lIHN6X3hTaGFwZUlucHV0U2VsZWN0ZWRSZXEgOAorCit0eXBlZGVmIHN0cnVjdCB7CisJQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKwlDQVJEOAllbmFibGVkOwkJLyogY3VycmVudCBzdGF0dXMgKi8KKwlDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworCUNBUkQzMglsZW5ndGggQjMyOwkJLyogMCAqLworCUNBUkQzMglwYWQxIEIzMjsJCS8qIHVudXNlZCAqLworCUNBUkQzMglwYWQyIEIzMjsKKwlDQVJEMzIJcGFkMyBCMzI7CisJQ0FSRDMyCXBhZDQgQjMyOworCUNBUkQzMglwYWQ1IEIzMjsKKwlDQVJEMzIJcGFkNiBCMzI7Cit9IHhTaGFwZUlucHV0U2VsZWN0ZWRSZXBseTsKKyNkZWZpbmUgc3pfeFNoYXBlSW5wdXRTZWxlY3RlZFJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9TaGFwZUdldFJlY3RhbmdsZXMgeworICAgIENBUkQ4ICAgcmVxVHlwZTsJCS8qIGFsd2F5cyBTaGFwZVJlcUNvZGUgKi8KKyAgICBDQVJEOCAgIHNoYXBlUmVxVHlwZTsJLyogYWx3YXlzIFhfU2hhcGVHZXRSZWN0YW5nbGVzICovCisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIFdpbmRvdyAgd2luZG93IEIzMjsKKyAgICBDQVJEOCAgIGtpbmQ7CQkvKiBTaGFwZUJvdW5kaW5nIG9yIFNoYXBlQ2xpcCAqLworICAgIENBUkQ4ICAganVuazE7CisgICAgQ0FSRDE2ICBqdW5rMiBCMTY7Cit9IHhTaGFwZUdldFJlY3RhbmdsZXNSZXE7CisjZGVmaW5lIHN6X3hTaGFwZUdldFJlY3RhbmdsZXNSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisJQ0FSRDgJb3JkZXJpbmc7CS8qIFVuU29ydGVkLCBZU29ydGVkLCBZWFNvcnRlZCwgWVhCYW5kZWQgKi8KKwlDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworCUNBUkQzMglsZW5ndGggQjMyOwkJLyogbm90IHplcm8gKi8KKwlDQVJEMzIJbnJlY3RzIEIzMjsJCS8qIG51bWJlciBvZiByZWN0YW5nbGVzICovCisJQ0FSRDMyIHBhZDEgQjMyOworCUNBUkQzMiBwYWQyIEIzMjsKKwlDQVJEMzIgcGFkMyBCMzI7CisJQ0FSRDMyIHBhZDQgQjMyOworCUNBUkQzMiBwYWQ1IEIzMjsKK30geFNoYXBlR2V0UmVjdGFuZ2xlc1JlcGx5OwkJLyogZm9sbG93ZWQgYnkgeFJlY3RhbmdsZXMgKi8KKyNkZWZpbmUgc3pfeFNoYXBlR2V0UmVjdGFuZ2xlc1JlcGx5IDMyCisKKyN1bmRlZiBXaW5kb3cKKyN1bmRlZiBUaW1lCisKKyNlbmRpZiAvKiBfU0hBUEVQUk9UT19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZXN0ci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZXN0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZmRlMWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NoYXBlc3RyLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9TSEFQRVNUUl9IXworI2RlZmluZSBfU0hBUEVTVFJfSF8KKworI3dhcm5pbmcgInNoYXBlc3RyLmggaXMgb2Jzb2xldGUgYW5kIG1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuIgorI3dhcm5pbmcgImluY2x1ZGUgPFgxMS9leHRlbnNpb25zL3NoYXBlcHJvdG8uaD4gZm9yIHRoZSBwcm90b2NvbCBkZWZpbmVzLiIKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9zaGFwZXByb3RvLmg+CisKKyNlbmRpZiAvKiBfU0hBUEVTVFJfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2htLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NobS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNzY0MDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NobS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUSElTIElTIE5PVCBBTiBYIENPTlNPUlRJVU0gU1RBTkRBUkQgT1IgQU4gWCBQUk9KRUNUIFRFQU0gU1BFQ0lGSUNBVElPTiAqLworCisjaWZuZGVmIF9TSE1fSF8KKyNkZWZpbmUgX1NITV9IXworCisjZGVmaW5lIFNITU5BTUUgIk1JVC1TSE0iCisKKyNkZWZpbmUgU0hNX01BSk9SX1ZFUlNJT04JMQkvKiBjdXJyZW50IHZlcnNpb24gbnVtYmVycyAqLworI2RlZmluZSBTSE1fTUlOT1JfVkVSU0lPTgkxCisKKyNkZWZpbmUgU2htQ29tcGxldGlvbgkJCTAKKyNkZWZpbmUgU2htTnVtYmVyRXZlbnRzCQkJKFNobUNvbXBsZXRpb24gKyAxKQorCisjZGVmaW5lIEJhZFNobVNlZwkJCTAKKyNkZWZpbmUgU2htTnVtYmVyRXJyb3JzCQkJKEJhZFNobVNlZyArIDEpCisKKworI2VuZGlmIC8qIF9TSE1fSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2htcHJvdG8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2htcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWRlMzc3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaG1wcm90by5oCkBAIC0wLDAgKzEsMTg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVEhJUyBJUyBOT1QgQU4gWCBDT05TT1JUSVVNIFNUQU5EQVJEIE9SIEFOIFggUFJPSkVDVCBURUFNIFNQRUNJRklDQVRJT04gKi8KKworI2lmbmRlZiBfU0hNUFJPVE9fSF8KKyNkZWZpbmUgX1NITVBST1RPX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9zaG0uaD4KKworI2RlZmluZSBTaG1TZWcgQ0FSRDMyCisjZGVmaW5lIERyYXdhYmxlIENBUkQzMgorI2RlZmluZSBWaXN1YWxJRCBDQVJEMzIKKyNkZWZpbmUgR0NvbnRleHQgQ0FSRDMyCisjZGVmaW5lIFBpeG1hcCBDQVJEMzIKKworI2RlZmluZSBYX1NobVF1ZXJ5VmVyc2lvbgkJMAorI2RlZmluZSBYX1NobUF0dGFjaAkJCTEKKyNkZWZpbmUgWF9TaG1EZXRhY2gJCQkyCisjZGVmaW5lIFhfU2htUHV0SW1hZ2UJCQkzCisjZGVmaW5lIFhfU2htR2V0SW1hZ2UJCQk0CisjZGVmaW5lIFhfU2htQ3JlYXRlUGl4bWFwCQk1CisKK3R5cGVkZWYgc3RydWN0IF9TaG1RdWVyeVZlcnNpb24geworICAgIENBUkQ4CXJlcVR5cGU7CQkvKiBhbHdheXMgU2htUmVxQ29kZSAqLworICAgIENBUkQ4CXNobVJlcVR5cGU7CQkvKiBhbHdheXMgWF9TaG1RdWVyeVZlcnNpb24gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geFNobVF1ZXJ5VmVyc2lvblJlcTsKKyNkZWZpbmUgc3pfeFNobVF1ZXJ5VmVyc2lvblJlcQk0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIEJPT0wJc2hhcmVkUGl4bWFwczsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgltYWpvclZlcnNpb24gQjE2OwkvKiBtYWpvciB2ZXJzaW9uIG9mIFNITSBwcm90b2NvbCAqLworICAgIENBUkQxNgltaW5vclZlcnNpb24gQjE2OwkvKiBtaW5vciB2ZXJzaW9uIG9mIFNITSBwcm90b2NvbCAqLworICAgIENBUkQxNgl1aWQgQjE2OworICAgIENBUkQxNglnaWQgQjE2OworICAgIENBUkQ4CXBpeG1hcEZvcm1hdDsKKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geFNobVF1ZXJ5VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94U2htUXVlcnlWZXJzaW9uUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1NobUF0dGFjaCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFNobVJlcUNvZGUgKi8KKyAgICBDQVJEOAlzaG1SZXFUeXBlOwkvKiBhbHdheXMgWF9TaG1BdHRhY2ggKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBTaG1TZWcJc2htc2VnIEIzMjsKKyAgICBDQVJEMzIJc2htaWQgQjMyOworICAgIEJPT0wJcmVhZE9ubHk7CisgICAgQllURQlwYWQwOworICAgIENBUkQxNglwYWQxIEIxNjsKK30geFNobUF0dGFjaFJlcTsKKyNkZWZpbmUgc3pfeFNobUF0dGFjaFJlcQkxNgorCit0eXBlZGVmIHN0cnVjdCBfU2htRGV0YWNoIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgU2htUmVxQ29kZSAqLworICAgIENBUkQ4CXNobVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NobURldGFjaCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFNobVNlZwlzaG1zZWcgQjMyOworfSB4U2htRGV0YWNoUmVxOworI2RlZmluZSBzel94U2htRGV0YWNoUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgX1NobVB1dEltYWdlIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgU2htUmVxQ29kZSAqLworICAgIENBUkQ4CXNobVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NobVB1dEltYWdlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUJZHJhd2FibGUgQjMyOworICAgIEdDb250ZXh0CWdjIEIzMjsKKyAgICBDQVJEMTYJdG90YWxXaWR0aCBCMTY7CisgICAgQ0FSRDE2CXRvdGFsSGVpZ2h0IEIxNjsKKyAgICBDQVJEMTYJc3JjWCBCMTY7CisgICAgQ0FSRDE2CXNyY1kgQjE2OworICAgIENBUkQxNglzcmNXaWR0aCBCMTY7CisgICAgQ0FSRDE2CXNyY0hlaWdodCBCMTY7CisgICAgSU5UMTYJZHN0WCBCMTY7CisgICAgSU5UMTYJZHN0WSBCMTY7CisgICAgQ0FSRDgJZGVwdGg7CisgICAgQ0FSRDgJZm9ybWF0OworICAgIENBUkQ4CXNlbmRFdmVudDsKKyAgICBDQVJEOAlicGFkOworICAgIFNobVNlZwlzaG1zZWcgQjMyOworICAgIENBUkQzMglvZmZzZXQgQjMyOworfSB4U2htUHV0SW1hZ2VSZXE7CisjZGVmaW5lIHN6X3hTaG1QdXRJbWFnZVJlcQk0MAorCit0eXBlZGVmIHN0cnVjdCBfU2htR2V0SW1hZ2UgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBTaG1SZXFDb2RlICovCisgICAgQ0FSRDgJc2htUmVxVHlwZTsJLyogYWx3YXlzIFhfU2htR2V0SW1hZ2UgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBEcmF3YWJsZQlkcmF3YWJsZSBCMzI7CisgICAgSU5UMTYJeCBCMTY7CisgICAgSU5UMTYJeSBCMTY7CisgICAgQ0FSRDE2CXdpZHRoIEIxNjsKKyAgICBDQVJEMTYJaGVpZ2h0IEIxNjsKKyAgICBDQVJEMzIJcGxhbmVNYXNrIEIzMjsKKyAgICBDQVJEOAlmb3JtYXQ7CisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQ4CXBhZDI7CisgICAgU2htU2VnCXNobXNlZyBCMzI7CisgICAgQ0FSRDMyCW9mZnNldCBCMzI7Cit9IHhTaG1HZXRJbWFnZVJlcTsKKyNkZWZpbmUgc3pfeFNobUdldEltYWdlUmVxCTMyCisKK3R5cGVkZWYgc3RydWN0IF9TaG1HZXRJbWFnZVJlcGx5IHsKKyAgICBCWVRFCXR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJZGVwdGg7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBWaXN1YWxJRAl2aXN1YWwgQjMyOworICAgIENBUkQzMglzaXplIEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhTaG1HZXRJbWFnZVJlcGx5OworI2RlZmluZSBzel94U2htR2V0SW1hZ2VSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfU2htQ3JlYXRlUGl4bWFwIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgU2htUmVxQ29kZSAqLworICAgIENBUkQ4CXNobVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NobUNyZWF0ZVBpeG1hcCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFBpeG1hcAlwaWQgQjMyOworICAgIERyYXdhYmxlCWRyYXdhYmxlIEIzMjsKKyAgICBDQVJEMTYJd2lkdGggQjE2OworICAgIENBUkQxNgloZWlnaHQgQjE2OworICAgIENBUkQ4CWRlcHRoOworICAgIENBUkQ4CXBhZDA7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEOAlwYWQyOworICAgIFNobVNlZwlzaG1zZWcgQjMyOworICAgIENBUkQzMglvZmZzZXQgQjMyOworfSB4U2htQ3JlYXRlUGl4bWFwUmVxOworI2RlZmluZSBzel94U2htQ3JlYXRlUGl4bWFwUmVxIDI4CisKK3R5cGVkZWYgc3RydWN0IF9TaG1Db21wbGV0aW9uIHsKKyAgICBCWVRFCXR5cGU7CQkvKiBhbHdheXMgZXZlbnRCYXNlICsgU2htQ29tcGxldGlvbiAqLworICAgIEJZVEUJYnBhZDA7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBEcmF3YWJsZQlkcmF3YWJsZSBCMzI7CisgICAgQ0FSRDE2CW1pbm9yRXZlbnQgQjE2OworICAgIEJZVEUJbWFqb3JFdmVudDsKKyAgICBCWVRFCWJwYWQxOworICAgIFNobVNlZwlzaG1zZWcgQjMyOworICAgIENBUkQzMglvZmZzZXQgQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworfSB4U2htQ29tcGxldGlvbkV2ZW50OworI2RlZmluZSBzel94U2htQ29tcGxldGlvbkV2ZW50CTMyCisKKyN1bmRlZiBTaG1TZWcKKyN1bmRlZiBEcmF3YWJsZQorI3VuZGVmIFZpc3VhbElECisjdW5kZWYgR0NvbnRleHQKKyN1bmRlZiBQaXhtYXAKKworI2VuZGlmIC8qIF9TSE1QUk9UT19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaG1zdHIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2htc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMzc1OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2htc3RyLmgKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRISVMgSVMgTk9UIEFOIFggQ09OU09SVElVTSBTVEFOREFSRCBPUiBBTiBYIFBST0pFQ1QgVEVBTSBTUEVDSUZJQ0FUSU9OICovCisKKyNpZm5kZWYgX1NITVNUUl9IXworI2RlZmluZSBfU0hNU1RSX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9zaG1wcm90by5oPgorCisjaWZkZWYgX1hTSE1fU0VSVkVSXworI2RlZmluZSBYU0hNX1BVVF9JTUFHRV9BUkdTIFwKKyAgICBEcmF3YWJsZVB0cgkJLyogZHN0ICovLCBcCisgICAgR0NQdHIJCS8qIHBHQyAqLywgXAorICAgIGludAkJCS8qIGRlcHRoICovLCBcCisgICAgdW5zaWduZWQgaW50CS8qIGZvcm1hdCAqLywgXAorICAgIGludAkJCS8qIHcgKi8sIFwKKyAgICBpbnQJCQkvKiBoICovLCBcCisgICAgaW50CQkJLyogc3ggKi8sIFwKKyAgICBpbnQJCQkvKiBzeSAqLywgXAorICAgIGludAkJCS8qIHN3ICovLCBcCisgICAgaW50CQkJLyogc2ggKi8sIFwKKyAgICBpbnQJCQkvKiBkeCAqLywgXAorICAgIGludAkJCS8qIGR5ICovLCBcCisgICAgY2hhciAqCQkvKiBkYXRhICovCisKKyNkZWZpbmUgWFNITV9DUkVBVEVfUElYTUFQX0FSR1MgXAorICAgIFNjcmVlblB0cgkvKiBwU2NyZWVuICovLCBcCisgICAgaW50CQkvKiB3aWR0aCAqLywgXAorICAgIGludAkJLyogaGVpZ2h0ICovLCBcCisgICAgaW50CQkvKiBkZXB0aCAqLywgXAorICAgIGNoYXIgKgkvKiBhZGRyICovCisKK3R5cGVkZWYgc3RydWN0IF9TaG1GdW5jcyB7CisgICAgUGl4bWFwUHRyCSgqIENyZWF0ZVBpeG1hcCkoWFNITV9DUkVBVEVfUElYTUFQX0FSR1MpOworICAgIHZvaWQJKCogUHV0SW1hZ2UpKFhTSE1fUFVUX0lNQUdFX0FSR1MpOworfSBTaG1GdW5jcywgKlNobUZ1bmNzUHRyOworI2VuZGlmCisKKyNlbmRpZiAvKiBfU0hNU1RSX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc3luYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMGQ5YzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmMuaApAQCAtMCwwICsxLDM3NSBAQAorLyoKKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IDE5OTEsMTk5MyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cywKK2FuZCBPbGl2ZXR0aSBSZXNlYXJjaCBMaW1pdGVkLCBDYW1icmlkZ2UsIEVuZ2xhbmQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAorZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAKK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIERpZ2l0YWwgb3IgT2xpdmV0dGkKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAorCitESUdJVEFMIEFORCBPTElWRVRUSSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTCitTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFWSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCitPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCitQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NZTkNfSF8KKyNkZWZpbmUgX1NZTkNfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc3luY2NvbnN0Lmg+CisKKyNpZmRlZiBfU1lOQ19TRVJWRVIKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9zeW5jcHJvdG8uaD4KKyNlbHNlCisKK19YRlVOQ1BST1RPQkVHSU4KKy8qIGdldCByaWQgb2YgbWFjcm9zIHNvIHdlIGNhbiBkZWZpbmUgY29ycmVzcG9uZGluZyBmdW5jdGlvbnMgKi8KKyN1bmRlZiBYU3luY0ludFRvVmFsdWUKKyN1bmRlZiBYU3luY0ludHNUb1ZhbHVlCisjdW5kZWYgWFN5bmNWYWx1ZUdyZWF0ZXJUaGFuCisjdW5kZWYgWFN5bmNWYWx1ZUxlc3NUaGFuCisjdW5kZWYgWFN5bmNWYWx1ZUdyZWF0ZXJPckVxdWFsCisjdW5kZWYgWFN5bmNWYWx1ZUxlc3NPckVxdWFsCisjdW5kZWYgWFN5bmNWYWx1ZUVxdWFsCisjdW5kZWYgWFN5bmNWYWx1ZUlzTmVnYXRpdmUKKyN1bmRlZiBYU3luY1ZhbHVlSXNaZXJvCisjdW5kZWYgWFN5bmNWYWx1ZUlzUG9zaXRpdmUKKyN1bmRlZiBYU3luY1ZhbHVlTG93MzIKKyN1bmRlZiBYU3luY1ZhbHVlSGlnaDMyCisjdW5kZWYgWFN5bmNWYWx1ZUFkZAorI3VuZGVmIFhTeW5jVmFsdWVTdWJ0cmFjdAorI3VuZGVmIFhTeW5jTWF4VmFsdWUKKyN1bmRlZiBYU3luY01pblZhbHVlCisKK2V4dGVybiB2b2lkIFhTeW5jSW50VG9WYWx1ZSgKKyAgICBYU3luY1ZhbHVlKiAvKnB2Ki8sCisgICAgaW50IC8qaSovCispOworCitleHRlcm4gdm9pZCBYU3luY0ludHNUb1ZhbHVlKAorICAgIFhTeW5jVmFsdWUqIC8qcHYqLywKKyAgICB1bnNpZ25lZCBpbnQgLypsKi8sCisgICAgaW50IC8qaCovCispOworCitleHRlcm4gQm9vbCBYU3luY1ZhbHVlR3JlYXRlclRoYW4oCisgICAgWFN5bmNWYWx1ZSAvKmEqLywKKyAgICBYU3luY1ZhbHVlIC8qYiovCispOworCitleHRlcm4gQm9vbCBYU3luY1ZhbHVlTGVzc1RoYW4oCisgICAgWFN5bmNWYWx1ZSAvKmEqLywKKyAgICBYU3luY1ZhbHVlIC8qYiovCispOworCitleHRlcm4gQm9vbCBYU3luY1ZhbHVlR3JlYXRlck9yRXF1YWwoCisgICAgWFN5bmNWYWx1ZSAvKmEqLywKKyAgICBYU3luY1ZhbHVlIC8qYiovCispOworCitleHRlcm4gQm9vbCBYU3luY1ZhbHVlTGVzc09yRXF1YWwoCisgICAgWFN5bmNWYWx1ZSAvKmEqLywKKyAgICBYU3luY1ZhbHVlIC8qYiovCispOworCitleHRlcm4gQm9vbCBYU3luY1ZhbHVlRXF1YWwoCisgICAgWFN5bmNWYWx1ZSAvKmEqLywKKyAgICBYU3luY1ZhbHVlIC8qYiovCispOworCitleHRlcm4gQm9vbCBYU3luY1ZhbHVlSXNOZWdhdGl2ZSgKKyAgICBYU3luY1ZhbHVlIC8qdiovCispOworCitleHRlcm4gQm9vbCBYU3luY1ZhbHVlSXNaZXJvKAorICAgIFhTeW5jVmFsdWUgLyphKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVJc1Bvc2l0aXZlKAorICAgIFhTeW5jVmFsdWUgLyp2Ki8KKyk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgWFN5bmNWYWx1ZUxvdzMyKAorICAgIFhTeW5jVmFsdWUgLyp2Ki8KKyk7CisKK2V4dGVybiBpbnQgWFN5bmNWYWx1ZUhpZ2gzMigKKyAgICBYU3luY1ZhbHVlIC8qdiovCispOworCitleHRlcm4gdm9pZCBYU3luY1ZhbHVlQWRkKAorICAgIFhTeW5jVmFsdWUqIC8qcHJlc3VsdCovLAorICAgIFhTeW5jVmFsdWUgLyphKi8sCisgICAgWFN5bmNWYWx1ZSAvKmIqLywKKyAgICBpbnQqIC8qcG92ZXJmbG93Ki8KKyk7CisKK2V4dGVybiB2b2lkIFhTeW5jVmFsdWVTdWJ0cmFjdCgKKyAgICBYU3luY1ZhbHVlKiAvKnByZXN1bHQqLywKKyAgICBYU3luY1ZhbHVlIC8qYSovLAorICAgIFhTeW5jVmFsdWUgLypiKi8sCisgICAgaW50KiAvKnBvdmVyZmxvdyovCispOworCitleHRlcm4gdm9pZCBYU3luY01heFZhbHVlKAorICAgIFhTeW5jVmFsdWUqIC8qcHYqLworKTsKKworZXh0ZXJuIHZvaWQgWFN5bmNNaW5WYWx1ZSgKKyAgICBYU3luY1ZhbHVlKiAvKnB2Ki8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKwordHlwZWRlZiBzdHJ1Y3QgX1hTeW5jU3lzdGVtQ291bnRlciB7CisgICAgY2hhciAqbmFtZTsJCQkvKiBudWxsLXRlcm1pbmF0ZWQgbmFtZSBvZiBzeXN0ZW0gY291bnRlciAqLworICAgIFhTeW5jQ291bnRlciBjb3VudGVyOwkvKiBjb3VudGVyIGlkIG9mIHRoaXMgc3lzdGVtIGNvdW50ZXIgKi8KKyAgICBYU3luY1ZhbHVlIHJlc29sdXRpb247CS8qIHJlc29sdXRpb24gb2YgdGhpcyBzeXN0ZW0gY291bnRlciAqLworfSBYU3luY1N5c3RlbUNvdW50ZXI7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhTeW5jQ291bnRlciBjb3VudGVyOwkvKiBjb3VudGVyIHRvIHRyaWdnZXIgb24gKi8KKyAgICBYU3luY1ZhbHVlVHlwZSB2YWx1ZV90eXBlOwkvKiBhYnNvbHV0ZS9yZWxhdGl2ZSAqLworICAgIFhTeW5jVmFsdWUgd2FpdF92YWx1ZTsJLyogdmFsdWUgdG8gY29tcGFyZSBjb3VudGVyIHRvICovCisgICAgWFN5bmNUZXN0VHlwZSB0ZXN0X3R5cGU7CS8qIHBvcy9uZWcgY29tcGFyaXNvbi90cmFuc3Rpb24gKi8KK30gWFN5bmNUcmlnZ2VyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWFN5bmNUcmlnZ2VyIHRyaWdnZXI7CS8qIHRyaWdnZXIgZm9yIGF3YWl0ICovCisgICAgWFN5bmNWYWx1ZSBldmVudF90aHJlc2hvbGQ7IC8qIHNlbmQgZXZlbnQgaWYgcGFzdCB0aHJlc2hvbGQgKi8KK30gWFN5bmNXYWl0Q29uZGl0aW9uOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYU3luY1RyaWdnZXIgdHJpZ2dlcjsKKyAgICBYU3luY1ZhbHVlICBkZWx0YTsKKyAgICBCb29sIGV2ZW50czsKKyAgICBYU3luY0FsYXJtU3RhdGUgc3RhdGU7Cit9IFhTeW5jQWxhcm1BdHRyaWJ1dGVzOworCisvKgorICogIEV2ZW50cworICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdHlwZTsJCQkvKiBldmVudCBiYXNlICsgWFN5bmNDb3VudGVyTm90aWZ5ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sIHNlbmRfZXZlbnQ7CQkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFhTeW5jQ291bnRlciBjb3VudGVyOwkvKiBjb3VudGVyIGludm9sdmVkIGluIGF3YWl0ICovCisgICAgWFN5bmNWYWx1ZSB3YWl0X3ZhbHVlOwkvKiB2YWx1ZSBiZWluZyB3YWl0ZWQgZm9yICovCisgICAgWFN5bmNWYWx1ZSBjb3VudGVyX3ZhbHVlOwkvKiBjb3VudGVyIHZhbHVlIHdoZW4gdGhpcyBldmVudCB3YXMgc2VudCAqLworICAgIFRpbWUgdGltZTsJCQkvKiBtaWxsaXNlY29uZHMgKi8KKyAgICBpbnQgY291bnQ7CQkJLyogaG93IG1hbnkgbW9yZSBldmVudHMgdG8gY29tZSAqLworICAgIEJvb2wgZGVzdHJveWVkOwkJLyogVHJ1ZSBpZiBjb3VudGVyIHdhcyBkZXN0cm95ZWQgKi8KK30gWFN5bmNDb3VudGVyTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdHlwZTsJCQkvKiBldmVudCBiYXNlICsgWFN5bmNDb3VudGVyTm90aWZ5ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sIHNlbmRfZXZlbnQ7CQkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFhTeW5jQWxhcm0gYWxhcm07CQkvKiBhbGFybSB0aGF0IHRyaWdnZXJlZCAqLworICAgIFhTeW5jVmFsdWUgY291bnRlcl92YWx1ZTsJLyogdmFsdWUgdGhhdCB0cmlnZ2VyZWQgdGhlIGFsYXJtICovCisgICAgWFN5bmNWYWx1ZSBhbGFybV92YWx1ZTsJLyogdGVzdCAgdmFsdWUgb2YgdHJpZ2dlciBpbiBhbGFybSAqLworICAgIFRpbWUgdGltZTsJCQkvKiBtaWxsaXNlY29uZHMgKi8KKyAgICBYU3luY0FsYXJtU3RhdGUgc3RhdGU7CS8qIG5ldyBzdGF0ZSBvZiBhbGFybSAqLworfSBYU3luY0FsYXJtTm90aWZ5RXZlbnQ7CisKKy8qCisgKiAgRXJyb3JzIAorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdHlwZTsJCQkKKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFhTeW5jQWxhcm0gYWxhcm07CQkvKiByZXNvdXJjZSBpZCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiBzZXJpYWwgbnVtYmVyIG9mIGZhaWxlZCByZXF1ZXN0ICovCisgICAgdW5zaWduZWQgY2hhciBlcnJvcl9jb2RlOwkvKiBlcnJvciBiYXNlICsgWFN5bmNCYWRBbGFybSAqLworICAgIHVuc2lnbmVkIGNoYXIgcmVxdWVzdF9jb2RlOwkvKiBNYWpvciBvcC1jb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICovCisgICAgdW5zaWduZWQgY2hhciBtaW5vcl9jb2RlOwkvKiBNaW5vciBvcC1jb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICovCit9IFhTeW5jQWxhcm1FcnJvcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0eXBlOwkJCQorICAgIERpc3BsYXkgKmRpc3BsYXk7CQkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgWFN5bmNDb3VudGVyIGNvdW50ZXI7CS8qIHJlc291cmNlIGlkICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qIHNlcmlhbCBudW1iZXIgb2YgZmFpbGVkIHJlcXVlc3QgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGVycm9yX2NvZGU7CS8qIGVycm9yIGJhc2UgKyBYU3luY0JhZENvdW50ZXIgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHJlcXVlc3RfY29kZTsJLyogTWFqb3Igb3AtY29kZSBvZiBmYWlsZWQgcmVxdWVzdCAqLworICAgIHVuc2lnbmVkIGNoYXIgbWlub3JfY29kZTsJLyogTWlub3Igb3AtY29kZSBvZiBmYWlsZWQgcmVxdWVzdCAqLworfSBYU3luY0NvdW50ZXJFcnJvcjsKKworLyogCisgKiAgUHJvdG90eXBlcworICovCisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIFN0YXR1cyBYU3luY1F1ZXJ5RXh0ZW5zaW9uKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgaW50KiAvKmV2ZW50X2Jhc2VfcmV0dXJuKi8sCisgICAgaW50KiAvKmVycm9yX2Jhc2VfcmV0dXJuKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNJbml0aWFsaXplKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgaW50KiAvKm1ham9yX3ZlcnNpb25fcmV0dXJuKi8sCisgICAgaW50KiAvKm1pbm9yX3ZlcnNpb25fcmV0dXJuKi8KKyk7CisKK2V4dGVybiBYU3luY1N5c3RlbUNvdW50ZXIgKlhTeW5jTGlzdFN5c3RlbUNvdW50ZXJzKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgaW50KiAvKm5fY291bnRlcnNfcmV0dXJuKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTeW5jRnJlZVN5c3RlbUNvdW50ZXJMaXN0KAorICAgIFhTeW5jU3lzdGVtQ291bnRlciogLypsaXN0Ki8KKyk7CisKK2V4dGVybiBYU3luY0NvdW50ZXIgWFN5bmNDcmVhdGVDb3VudGVyKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNWYWx1ZSAvKmluaXRpYWxfdmFsdWUqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY1NldENvdW50ZXIoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0NvdW50ZXIgLypjb3VudGVyKi8sCisgICAgWFN5bmNWYWx1ZSAvKnZhbHVlKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNDaGFuZ2VDb3VudGVyKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNDb3VudGVyIC8qY291bnRlciovLAorICAgIFhTeW5jVmFsdWUgLyp2YWx1ZSovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jRGVzdHJveUNvdW50ZXIoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0NvdW50ZXIgLypjb3VudGVyKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNRdWVyeUNvdW50ZXIoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0NvdW50ZXIgLypjb3VudGVyKi8sCisgICAgWFN5bmNWYWx1ZSogLyp2YWx1ZV9yZXR1cm4qLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY0F3YWl0KAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNXYWl0Q29uZGl0aW9uKiAvKndhaXRfbGlzdCovLAorICAgIGludCAvKm5fY29uZGl0aW9ucyovCispOworCitleHRlcm4gWFN5bmNBbGFybSBYU3luY0NyZWF0ZUFsYXJtKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgdW5zaWduZWQgbG9uZyAvKnZhbHVlc19tYXNrKi8sCisgICAgWFN5bmNBbGFybUF0dHJpYnV0ZXMqIC8qdmFsdWVzKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNEZXN0cm95QWxhcm0oCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0FsYXJtIC8qYWxhcm0qLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY1F1ZXJ5QWxhcm0oCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0FsYXJtIC8qYWxhcm0qLywKKyAgICBYU3luY0FsYXJtQXR0cmlidXRlcyogLyp2YWx1ZXNfcmV0dXJuKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNDaGFuZ2VBbGFybSgKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhTeW5jQWxhcm0gLyphbGFybSovLAorICAgIHVuc2lnbmVkIGxvbmcgLyp2YWx1ZXNfbWFzayovLAorICAgIFhTeW5jQWxhcm1BdHRyaWJ1dGVzKiAvKnZhbHVlcyovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jU2V0UHJpb3JpdHkoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYSUQgLypjbGllbnRfcmVzb3VyY2VfaWQqLywKKyAgICBpbnQgLypwcmlvcml0eSovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jR2V0UHJpb3JpdHkoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYSUQgLypjbGllbnRfcmVzb3VyY2VfaWQqLywKKyAgICBpbnQqIC8qcmV0dXJuX3ByaW9yaXR5Ki8KKyk7CisKK2V4dGVybiBYU3luY0ZlbmNlIFhTeW5jQ3JlYXRlRmVuY2UoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBEcmF3YWJsZSAvKmQqLywKKyAgICBCb29sIC8qaW5pdGlhbGx5X3RyaWdnZXJlZCovCispOworCitleHRlcm4gQm9vbCBYU3luY1RyaWdnZXJGZW5jZSgKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhTeW5jRmVuY2UgLypmZW5jZSovCispOworCitleHRlcm4gQm9vbCBYU3luY1Jlc2V0RmVuY2UoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0ZlbmNlIC8qZmVuY2UqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNEZXN0cm95RmVuY2UoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0ZlbmNlIC8qZmVuY2UqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNRdWVyeUZlbmNlKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNGZW5jZSAvKmZlbmNlKi8sCisgICAgQm9vbCogLyp0cmlnZ2VyZWQqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNBd2FpdEZlbmNlKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgY29uc3QgWFN5bmNGZW5jZSogLypmZW5jZV9saXN0Ki8sCisgICAgaW50IC8qbl9mZW5jZXMqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9TWU5DX1NFUlZFUiAqLworCisjZW5kaWYgLyogX1NZTkNfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc3luY2NvbnN0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmNjb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhY2MzODcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmNjb25zdC5oCkBAIC0wLDAgKzEsMTgxIEBACisvKgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgMTk5MSwxOTkzIGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLAorYW5kIE9saXZldHRpIFJlc2VhcmNoIExpbWl0ZWQsIENhbWJyaWRnZSwgRW5nbGFuZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgRGlnaXRhbCBvciBPbGl2ZXR0aQorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitESUdJVEFMIEFORCBPTElWRVRUSSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTCitTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFWSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCitPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCitQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NZTkNDT05TVF9IXworI2RlZmluZSBfU1lOQ0NPTlNUX0hfCisKKyNkZWZpbmUgU1lOQ19OQU1FICJTWU5DIgorCisjZGVmaW5lIFNZTkNfTUFKT1JfVkVSU0lPTgkzCisjZGVmaW5lIFNZTkNfTUlOT1JfVkVSU0lPTgkxCisKKworI2RlZmluZSBYU3luY0NvdW50ZXJOb3RpZnkgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWFN5bmNBbGFybU5vdGlmeQkJMQorI2RlZmluZSBYU3luY0FsYXJtTm90aWZ5TWFzayAJCSgxTCA8PCBYU3luY0FsYXJtTm90aWZ5KQorCisjZGVmaW5lIFhTeW5jTnVtYmVyRXZlbnRzCQkyTAorCisjZGVmaW5lIFhTeW5jQmFkQ291bnRlcgkJCTBMCisjZGVmaW5lIFhTeW5jQmFkQWxhcm0JCQkxTAorI2RlZmluZSBYU3luY0JhZEZlbmNlICAgICAgICAgICAyTAorI2RlZmluZSBYU3luY051bWJlckVycm9ycwkJKFhTeW5jQmFkRmVuY2UgKyAxKQorCisvKgorICogRmxhZ3MgZm9yIEFsYXJtIEF0dHJpYnV0ZXMKKyAqLworI2RlZmluZSBYU3luY0NBQ291bnRlcgkJCSgxTDw8MCkKKyNkZWZpbmUgWFN5bmNDQVZhbHVlVHlwZQkJKDFMPDwxKQorI2RlZmluZSBYU3luY0NBVmFsdWUJCQkoMUw8PDIpCisjZGVmaW5lIFhTeW5jQ0FUZXN0VHlwZQkJCSgxTDw8MykKKyNkZWZpbmUgWFN5bmNDQURlbHRhCQkJKDFMPDw0KQorI2RlZmluZSBYU3luY0NBRXZlbnRzCQkJKDFMPDw1KQorCisvKiAgVGhlIF9YU3luYyBtYWNyb3MgYmVsb3cgYXJlIGZvciBsaWJyYXJ5IGludGVybmFsIHVzZSBvbmx5LiAgVGhleSBleGlzdAorICogIHNvIHRoYXQgaWYgd2UgaGF2ZSB0byBtYWtlIGEgZml4LCB3ZSBjYW4gY2hhbmdlIGl0IGluIHRoaXMgb25lIHBsYWNlCisgKiAgYW5kIGhhdmUgYm90aCB0aGUgbWFjcm8gYW5kIGZ1bmN0aW9uIHZhcmlhbnRzIGluaGVyaXQgdGhlIGZpeC4KKyAqLworCisjZGVmaW5lIF9YU3luY0ludFRvVmFsdWUocHYsIGkpICAgICAoKHB2KS0+aGk9KChpPDApP34wOjApLChwdiktPmxvPShpKSkKKyNkZWZpbmUgX1hTeW5jSW50c1RvVmFsdWUocHYsIGwsIGgpICgocHYpLT5sbyA9IChsKSwgKHB2KS0+aGkgPSAoaCkpCisjZGVmaW5lIF9YU3luY1ZhbHVlR3JlYXRlclRoYW4oYSwgYilcCisgICAgKChhKS5oaT4oYikuaGkgfHwgKChhKS5oaT09KGIpLmhpICYmIChhKS5sbz4oYikubG8pKQorI2RlZmluZSBfWFN5bmNWYWx1ZUxlc3NUaGFuKGEsIGIpXAorICAgICgoYSkuaGk8KGIpLmhpIHx8ICgoYSkuaGk9PShiKS5oaSAmJiAoYSkubG88KGIpLmxvKSkKKyNkZWZpbmUgX1hTeW5jVmFsdWVHcmVhdGVyT3JFcXVhbChhLCBiKVwKKyAgICAoKGEpLmhpPihiKS5oaSB8fCAoKGEpLmhpPT0oYikuaGkgJiYgKGEpLmxvPj0oYikubG8pKQorI2RlZmluZSBfWFN5bmNWYWx1ZUxlc3NPckVxdWFsKGEsIGIpXAorICAgICgoYSkuaGk8KGIpLmhpIHx8ICgoYSkuaGk9PShiKS5oaSAmJiAoYSkubG88PShiKS5sbykpCisjZGVmaW5lIF9YU3luY1ZhbHVlRXF1YWwoYSwgYikJKChhKS5sbz09KGIpLmxvICYmIChhKS5oaT09KGIpLmhpKQorI2RlZmluZSBfWFN5bmNWYWx1ZUlzTmVnYXRpdmUodikgKCgodikuaGkgJiAweDgwMDAwMDAwKSA/IDEgOiAwKQorI2RlZmluZSBfWFN5bmNWYWx1ZUlzWmVybyhhKQkoKGEpLmxvPT0wICYmIChhKS5oaT09MCkKKyNkZWZpbmUgX1hTeW5jVmFsdWVJc1Bvc2l0aXZlKHYpICgoKHYpLmhpICYgMHg4MDAwMDAwMCkgPyAwIDogMSkKKyNkZWZpbmUgX1hTeW5jVmFsdWVMb3czMih2KQkoKHYpLmxvKQorI2RlZmluZSBfWFN5bmNWYWx1ZUhpZ2gzMih2KQkoKHYpLmhpKQorI2RlZmluZSBfWFN5bmNWYWx1ZUFkZChwcmVzdWx0LGEsYixwb3ZlcmZsb3cpIHtcCisJaW50IHQgPSAoYSkubG87XAorCUJvb2wgc2lnbmEgPSBYU3luY1ZhbHVlSXNOZWdhdGl2ZShhKTtcCisJQm9vbCBzaWduYiA9IFhTeW5jVmFsdWVJc05lZ2F0aXZlKGIpO1wKKwkoKHByZXN1bHQpLT5sbyA9IChhKS5sbyArIChiKS5sbyk7XAorCSgocHJlc3VsdCktPmhpID0gKGEpLmhpICsgKGIpLmhpKTtcCisJaWYgKHQ+KHByZXN1bHQpLT5sbykgKHByZXN1bHQpLT5oaSsrO1wKKwkqcG92ZXJmbG93ID0gKChzaWduYSA9PSBzaWduYikgJiYgIShzaWduYSA9PSBYU3luY1ZhbHVlSXNOZWdhdGl2ZSgqcHJlc3VsdCkpKTtcCisgICAgIH0KKyNkZWZpbmUgX1hTeW5jVmFsdWVTdWJ0cmFjdChwcmVzdWx0LGEsYixwb3ZlcmZsb3cpIHtcCisJaW50IHQgPSAoYSkubG87XAorCUJvb2wgc2lnbmEgPSBYU3luY1ZhbHVlSXNOZWdhdGl2ZShhKTtcCisJQm9vbCBzaWduYiA9IFhTeW5jVmFsdWVJc05lZ2F0aXZlKGIpO1wKKwkoKHByZXN1bHQpLT5sbyA9IChhKS5sbyAtIChiKS5sbyk7XAorCSgocHJlc3VsdCktPmhpID0gKGEpLmhpIC0gKGIpLmhpKTtcCisJaWYgKHQ8KHByZXN1bHQpLT5sbykgKHByZXN1bHQpLT5oaS0tO1wKKwkqcG92ZXJmbG93ID0gKChzaWduYSA9PSBzaWduYikgJiYgIShzaWduYSA9PSBYU3luY1ZhbHVlSXNOZWdhdGl2ZSgqcHJlc3VsdCkpKTtcCisgICAgIH0KKyNkZWZpbmUgX1hTeW5jTWF4VmFsdWUocHYpICgocHYpLT5oaSA9IDB4N2ZmZmZmZmYsIChwdiktPmxvID0gMHhmZmZmZmZmZikKKyNkZWZpbmUgX1hTeW5jTWluVmFsdWUocHYpICgocHYpLT5oaSA9IDB4ODAwMDAwMDAsIChwdiktPmxvID0gMCkKKworLyoKKyAqICBUaGVzZSBhcmUgdGhlIHB1YmxpY2FsbHkgdXNhYmxlIG1hY3Jvcy4gIElmIHlvdSB3YW50IHRoZSBmdW5jdGlvbiB2ZXJzaW9uCisgKiAgb2Ygb25lIG9mIHRoZXNlLCBqdXN0ICN1bmRlZiB0aGUgbWFjcm8gdG8gdW5jb3ZlciB0aGUgZnVuY3Rpb24uCisgKiAgKFRoaXMgaXMgdGhlIHNhbWUgY29udmVudGlvbiB0aGF0IHRoZSBBTlNJIEMgbGlicmFyeSB1c2VzLikKKyAqLworCisjZGVmaW5lIFhTeW5jSW50VG9WYWx1ZShwdiwgaSkgX1hTeW5jSW50VG9WYWx1ZShwdiwgaSkKKyNkZWZpbmUgWFN5bmNJbnRzVG9WYWx1ZShwdiwgbCwgaCkgX1hTeW5jSW50c1RvVmFsdWUocHYsIGwsIGgpCisjZGVmaW5lIFhTeW5jVmFsdWVHcmVhdGVyVGhhbihhLCBiKSBfWFN5bmNWYWx1ZUdyZWF0ZXJUaGFuKGEsIGIpCisjZGVmaW5lIFhTeW5jVmFsdWVMZXNzVGhhbihhLCBiKSBfWFN5bmNWYWx1ZUxlc3NUaGFuKGEsIGIpCisjZGVmaW5lIFhTeW5jVmFsdWVHcmVhdGVyT3JFcXVhbChhLCBiKSBfWFN5bmNWYWx1ZUdyZWF0ZXJPckVxdWFsKGEsIGIpCisjZGVmaW5lIFhTeW5jVmFsdWVMZXNzT3JFcXVhbChhLCBiKSBfWFN5bmNWYWx1ZUxlc3NPckVxdWFsKGEsIGIpCisjZGVmaW5lIFhTeW5jVmFsdWVFcXVhbChhLCBiKSBfWFN5bmNWYWx1ZUVxdWFsKGEsIGIpCisjZGVmaW5lIFhTeW5jVmFsdWVJc05lZ2F0aXZlKHYpIF9YU3luY1ZhbHVlSXNOZWdhdGl2ZSh2KQorI2RlZmluZSBYU3luY1ZhbHVlSXNaZXJvKGEpIF9YU3luY1ZhbHVlSXNaZXJvKGEpCisjZGVmaW5lIFhTeW5jVmFsdWVJc1Bvc2l0aXZlKHYpIF9YU3luY1ZhbHVlSXNQb3NpdGl2ZSh2KQorI2RlZmluZSBYU3luY1ZhbHVlTG93MzIodikgX1hTeW5jVmFsdWVMb3czMih2KQorI2RlZmluZSBYU3luY1ZhbHVlSGlnaDMyKHYpIF9YU3luY1ZhbHVlSGlnaDMyKHYpCisjZGVmaW5lIFhTeW5jVmFsdWVBZGQocHJlc3VsdCxhLGIscG92ZXJmbG93KSBfWFN5bmNWYWx1ZUFkZChwcmVzdWx0LGEsYixwb3ZlcmZsb3cpCisjZGVmaW5lIFhTeW5jVmFsdWVTdWJ0cmFjdChwcmVzdWx0LGEsYixwb3ZlcmZsb3cpIF9YU3luY1ZhbHVlU3VidHJhY3QocHJlc3VsdCxhLGIscG92ZXJmbG93KQorI2RlZmluZSBYU3luY01heFZhbHVlKHB2KSBfWFN5bmNNYXhWYWx1ZShwdikKKyNkZWZpbmUgWFN5bmNNaW5WYWx1ZShwdikgX1hTeW5jTWluVmFsdWUocHYpCisKKy8qCisgKiBDb25zdGFudHMgZm9yIHRoZSB2YWx1ZV90eXBlIGFyZ3VtZW50IG9mIHZhcmlvdXMgcmVxdWVzdHMKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBYU3luY0Fic29sdXRlLAorICAgIFhTeW5jUmVsYXRpdmUKK30gWFN5bmNWYWx1ZVR5cGU7CisKKy8qCisgKiBBbGFybSBUZXN0IHR5cGVzCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgWFN5bmNQb3NpdGl2ZVRyYW5zaXRpb24sCisgICAgWFN5bmNOZWdhdGl2ZVRyYW5zaXRpb24sCisgICAgWFN5bmNQb3NpdGl2ZUNvbXBhcmlzb24sCisgICAgWFN5bmNOZWdhdGl2ZUNvbXBhcmlzb24KK30gWFN5bmNUZXN0VHlwZTsKKworLyoKKyAqIEFsYXJtIHN0YXRlIGNvbnN0YW50cworICovCit0eXBlZGVmIGVudW0geworICAgIFhTeW5jQWxhcm1BY3RpdmUsCisgICAgWFN5bmNBbGFybUluYWN0aXZlLAorICAgIFhTeW5jQWxhcm1EZXN0cm95ZWQKK30gWFN5bmNBbGFybVN0YXRlOworCisKK3R5cGVkZWYgWElEIFhTeW5jQ291bnRlcjsKK3R5cGVkZWYgWElEIFhTeW5jQWxhcm07Cit0eXBlZGVmIFhJRCBYU3luY0ZlbmNlOwordHlwZWRlZiBzdHJ1Y3QgX1hTeW5jVmFsdWUgeworICAgIGludCBoaTsKKyAgICB1bnNpZ25lZCBpbnQgbG87Cit9IFhTeW5jVmFsdWU7CisjZW5kaWYgLyogX1NZTkNDT05TVF9IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zeW5jcHJvdG8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc3luY3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1M2U0NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc3luY3Byb3RvLmgKQEAgLTAsMCArMSw0NzQgQEAKKy8qCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAxOTkxLDE5OTMgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMsCithbmQgT2xpdmV0dGkgUmVzZWFyY2ggTGltaXRlZCwgQ2FtYnJpZGdlLCBFbmdsYW5kLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBEaWdpdGFsIG9yIE9saXZldHRpCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisKK0RJR0lUQUwgQU5EIE9MSVZFVFRJIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMKK1NPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECitGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEVZIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCitVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKK09USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKK1BFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU1lOQ1BST1RPX0hfCisjZGVmaW5lIF9TWU5DUFJPVE9fSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3N5bmNjb25zdC5oPgorCisjZGVmaW5lIFhfU3luY0luaXRpYWxpemUJCTAKKyNkZWZpbmUgWF9TeW5jTGlzdFN5c3RlbUNvdW50ZXJzCTEKKyNkZWZpbmUgWF9TeW5jQ3JlYXRlQ291bnRlcgkJMgorI2RlZmluZSBYX1N5bmNTZXRDb3VudGVyCQkzCisjZGVmaW5lIFhfU3luY0NoYW5nZUNvdW50ZXIJCTQKKyNkZWZpbmUgWF9TeW5jUXVlcnlDb3VudGVyICAgICAgICAgICAgICA1CisjZGVmaW5lIFhfU3luY0Rlc3Ryb3lDb3VudGVyCQk2CisjZGVmaW5lIFhfU3luY0F3YWl0CQkJNworI2RlZmluZSBYX1N5bmNDcmVhdGVBbGFybSAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWF9TeW5jQ2hhbmdlQWxhcm0JICAgICAgICA5CisjZGVmaW5lIFhfU3luY1F1ZXJ5QWxhcm0JICAgICAgIDEwCisjZGVmaW5lIFhfU3luY0Rlc3Ryb3lBbGFybQkgICAgICAgMTEKKyNkZWZpbmUgWF9TeW5jU2V0UHJpb3JpdHkgICAJICAgICAgIDEyCisjZGVmaW5lIFhfU3luY0dldFByaW9yaXR5ICAgCSAgICAgICAxMworI2RlZmluZSBYX1N5bmNDcmVhdGVGZW5jZQkgICAgICAgMTQKKyNkZWZpbmUgWF9TeW5jVHJpZ2dlckZlbmNlCSAgICAgICAxNQorI2RlZmluZSBYX1N5bmNSZXNldEZlbmNlCSAgICAgICAxNgorI2RlZmluZSBYX1N5bmNEZXN0cm95RmVuY2UJICAgICAgIDE3CisjZGVmaW5lIFhfU3luY1F1ZXJ5RmVuY2UJICAgICAgIDE4CisjZGVmaW5lIFhfU3luY0F3YWl0RmVuY2UJICAgICAgIDE5CisKKy8qIGNvdmVyIHVwIHR5cGVzIGZyb20gc3luYy5oIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIHRoZSByaWdodCBzaXplIGZvcgorICogcHJvdG9jb2wgcGFja2FnaW5nLiAgVGhlc2Ugd2lsbCBiZSB1bmRlZidlZCBhZnRlciBhbGwgdGhlIHByb3RvY29sCisgKiBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkLgorICovCisjZGVmaW5lIFhTeW5jQ291bnRlciBDQVJEMzIKKyNkZWZpbmUgWFN5bmNBbGFybSAgIENBUkQzMgorI2RlZmluZSBYU3luY0ZlbmNlICAgQ0FSRDMyCisjZGVmaW5lIERyYXdhYmxlICAgICBDQVJEMzIKKworLyoKKyAqIEluaXRpYWxpemUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jSW5pdGlhbGl6ZSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAltYWpvclZlcnNpb247CisgICAgQ0FSRDgJbWlub3JWZXJzaW9uOworICAgIENBUkQxNglwYWQgQjE2OworfSB4U3luY0luaXRpYWxpemVSZXE7CisjZGVmaW5lIHN6X3hTeW5jSW5pdGlhbGl6ZVJlcQkJOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOworICAgIENBUkQ4CXVudXNlZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQ4CW1ham9yVmVyc2lvbjsKKyAgICBDQVJEOAltaW5vclZlcnNpb247CisgICAgQ0FSRDE2CXBhZCBCMTY7CisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geFN5bmNJbml0aWFsaXplUmVwbHk7CisjZGVmaW5lIHN6X3hTeW5jSW5pdGlhbGl6ZVJlcGx5CTMyCisKKy8qCisgKiBMaXN0U3lzdGVtQ291bnRlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jTGlzdFN5c3RlbUNvdW50ZXJzCit7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geFN5bmNMaXN0U3lzdGVtQ291bnRlcnNSZXE7CisjZGVmaW5lIHN6X3hTeW5jTGlzdFN5c3RlbUNvdW50ZXJzUmVxCTQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsKKyAgICBDQVJEOAl1bnVzZWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBJTlQzMgluQ291bnRlcnMgQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhTeW5jTGlzdFN5c3RlbUNvdW50ZXJzUmVwbHk7CisjZGVmaW5lIHN6X3hTeW5jTGlzdFN5c3RlbUNvdW50ZXJzUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhTeW5jQ291bnRlciBjb3VudGVyIEIzMjsKKyAgICBJTlQzMglyZXNvbHV0aW9uX2hpIEIzMjsKKyAgICBDQVJEMzIJcmVzb2x1dGlvbl9sbyBCMzI7CisgICAgQ0FSRDE2CW5hbWVfbGVuZ3RoIEIxNjsKK30geFN5bmNTeXN0ZW1Db3VudGVyOworI2RlZmluZSBzel94U3luY1N5c3RlbUNvdW50ZXIgMTQKKworLyoKKyAqIENyZWF0ZSBDb3VudGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0NyZWF0ZUNvdW50ZXJSZXEgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgWFN5bmNDb3VudGVyIGNpZCBCMzI7CisgICAgSU5UMzIgICAgICAgaW5pdGlhbF92YWx1ZV9oaSBCMzI7CisgICAgQ0FSRDMyCWluaXRpYWxfdmFsdWVfbG8gQjMyOworfSB4U3luY0NyZWF0ZUNvdW50ZXJSZXE7CisjZGVmaW5lIHN6X3hTeW5jQ3JlYXRlQ291bnRlclJlcQkxNgorCisvKgorICogQ2hhbmdlIENvdW50ZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jQ2hhbmdlQ291bnRlclJlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYU3luY0NvdW50ZXIgY2lkIEIzMjsKKyAgICBJTlQzMiAgICAgICB2YWx1ZV9oaSBCMzI7CisgICAgQ0FSRDMyCXZhbHVlX2xvIEIzMjsKK30geFN5bmNDaGFuZ2VDb3VudGVyUmVxOworI2RlZmluZSBzel94U3luY0NoYW5nZUNvdW50ZXJSZXEJMTYKKworLyoKKyAqIFNldCBDb3VudGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY1NldENvdW50ZXJSZXEgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgWFN5bmNDb3VudGVyIGNpZCBCMzI7CisgICAgSU5UMzIgICAgICAgdmFsdWVfaGkgQjMyOworICAgIENBUkQzMgl2YWx1ZV9sbyBCMzI7Cit9IHhTeW5jU2V0Q291bnRlclJlcTsKKyNkZWZpbmUgc3pfeFN5bmNTZXRDb3VudGVyUmVxCTE2CisKKy8qCisgKiBEZXN0cm95IENvdW50ZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jRGVzdHJveUNvdW50ZXJSZXEgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgWFN5bmNDb3VudGVyIGNvdW50ZXIgQjMyOworfSB4U3luY0Rlc3Ryb3lDb3VudGVyUmVxOworI2RlZmluZSBzel94U3luY0Rlc3Ryb3lDb3VudGVyUmVxCTgKKworLyoKKyAqIFF1ZXJ5IENvdW50ZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jUXVlcnlDb3VudGVyUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jQ291bnRlciBjb3VudGVyIEIzMjsKK30geFN5bmNRdWVyeUNvdW50ZXJSZXE7CisjZGVmaW5lIHN6X3hTeW5jUXVlcnlDb3VudGVyUmVxCQk4CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsKKyAgICBDQVJEOAl1bnVzZWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBJTlQzMgl2YWx1ZV9oaSBCMzI7CisgICAgQ0FSRDMyCXZhbHVlX2xvIEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhTeW5jUXVlcnlDb3VudGVyUmVwbHk7CisjZGVmaW5lIHN6X3hTeW5jUXVlcnlDb3VudGVyUmVwbHkJMzIKKworLyoKKyAqIEF3YWl0CisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0F3YWl0UmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworfSB4U3luY0F3YWl0UmVxOworI2RlZmluZSBzel94U3luY0F3YWl0UmVxCQk0CisKK3R5cGVkZWYgc3RydWN0IF94U3luY1dhaXRDb25kaXRpb24geworICAgIFhTeW5jQ291bnRlciBjb3VudGVyIEIzMjsKKyAgICBDQVJEMzIJdmFsdWVfdHlwZSBCMzI7CisgICAgSU5UMzIgICAgICAgd2FpdF92YWx1ZV9oaSBCMzI7CisgICAgQ0FSRDMyICAgICAgd2FpdF92YWx1ZV9sbyBCMzI7CisgICAgQ0FSRDMyCXRlc3RfdHlwZSBCMzI7CisgICAgSU5UMzIJZXZlbnRfdGhyZXNob2xkX2hpIEIzMjsKKyAgICBDQVJEMzIJZXZlbnRfdGhyZXNob2xkX2xvIEIzMjsKK30geFN5bmNXYWl0Q29uZGl0aW9uOworI2RlZmluZSBzel94U3luY1dhaXRDb25kaXRpb24JCTI4CisKKy8qCisgKiBDcmVhdGUgQWxhcm0KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jQ3JlYXRlQWxhcm1SZXEgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgWFN5bmNBbGFybQlpZCBCMzI7CisgICAgQ0FSRDMyICAgICAgdmFsdWVNYXNrIEIzMjsKK30geFN5bmNDcmVhdGVBbGFybVJlcTsKKyNkZWZpbmUgc3pfeFN5bmNDcmVhdGVBbGFybVJlcQkJMTIKKworLyoKKyAqIERlc3Ryb3kgQWxhcm0KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jRGVzdHJveUFsYXJtUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jQWxhcm0JYWxhcm0gQjMyOworfSB4U3luY0Rlc3Ryb3lBbGFybVJlcTsKKyNkZWZpbmUgc3pfeFN5bmNEZXN0cm95QWxhcm1SZXEJCTgKKworLyoKKyAqIFF1ZXJ5IEFsYXJtCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY1F1ZXJ5QWxhcm1SZXEgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgWFN5bmNBbGFybQlhbGFybSBCMzI7Cit9IHhTeW5jUXVlcnlBbGFybVJlcTsKKyNkZWZpbmUgc3pfeFN5bmNRdWVyeUFsYXJtUmVxCQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQ0FSRDgJdW51c2VkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgWFN5bmNDb3VudGVyIGNvdW50ZXIgQjMyOworICAgIENBUkQzMgl2YWx1ZV90eXBlIEIzMjsKKyAgICBJTlQzMgl3YWl0X3ZhbHVlX2hpIEIzMjsKKyAgICBDQVJEMzIJd2FpdF92YWx1ZV9sbyBCMzI7CisgICAgQ0FSRDMyCXRlc3RfdHlwZSAgICAgIEIzMjsKKyAgICBJTlQzMglkZWx0YV9oaSBCMzI7CisgICAgQ0FSRDMyCWRlbHRhX2xvIEIzMjsKKyAgICBCT09MICAgICAgICBldmVudHM7CisgICAgQllURSAgICAgICAgc3RhdGU7CisgICAgQllURQlwYWQwOworICAgIEJZVEUJcGFkMTsKK30geFN5bmNRdWVyeUFsYXJtUmVwbHk7CisjZGVmaW5lIHN6X3hTeW5jUXVlcnlBbGFybVJlcGx5CQk0MAorCisvKgorICogQ2hhbmdlIEFsYXJtCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0NoYW5nZUFsYXJtUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jQWxhcm0JYWxhcm0gQjMyOworICAgIENBUkQzMgl2YWx1ZU1hc2sgQjMyOworfSB4U3luY0NoYW5nZUFsYXJtUmVxOworI2RlZmluZSBzel94U3luY0NoYW5nZUFsYXJtUmVxCQkxMgorCisvKgorICogU2V0UHJpb3JpdHkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jU2V0UHJpb3JpdHl7CisgICAgQ0FSRDggICAJcmVxVHlwZTsKKyAgICBDQVJEOCAgIAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYgIAlsZW5ndGggQjE2OworICAgIENBUkQzMiAgCWlkIEIzMjsKKyAgICBJTlQzMiAgCXByaW9yaXR5IEIzMjsKK30geFN5bmNTZXRQcmlvcml0eVJlcTsKKyNkZWZpbmUgc3pfeFN5bmNTZXRQcmlvcml0eVJlcQkgICAgCTEyCisKKy8qCisgKiBHZXQgUHJpb3JpdHkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jR2V0UHJpb3JpdHl7CisgICAgQ0FSRDggICAJcmVxVHlwZTsKKyAgICBDQVJEOCAgIAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYgIAlsZW5ndGggQjE2OworICAgIENBUkQzMiAgCWlkIEIzMjsgLypYWFggWElEPyAqLworfSB4U3luY0dldFByaW9yaXR5UmVxOworI2RlZmluZSBzel94U3luY0dldFByaW9yaXR5UmVxCSAgICAJIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsKKyAgICBDQVJEOAl1bnVzZWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBJTlQzMiAgCXByaW9yaXR5IEIzMjsKKyAgICBDQVJEMzIgIAlwYWQwIEIzMjsKKyAgICBDQVJEMzIgIAlwYWQxIEIzMjsKKyAgICBDQVJEMzIgIAlwYWQyIEIzMjsKKyAgICBDQVJEMzIgIAlwYWQzIEIzMjsKKyAgICBDQVJEMzIgIAlwYWQ0IEIzMjsKK30geFN5bmNHZXRQcmlvcml0eVJlcGx5OworI2RlZmluZSBzel94U3luY0dldFByaW9yaXR5UmVwbHkJMzIKKworLyoKKyAqIENyZWF0ZSBGZW5jZQorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNDcmVhdGVGZW5jZVJlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBEcmF3YWJsZQlkIEIzMjsKKyAgICBYU3luY0ZlbmNlCWZpZCBCMzI7CisgICAgQk9PTAlpbml0aWFsbHlfdHJpZ2dlcmVkOworICAgIENBUkQ4CXBhZDA7CisgICAgQ0FSRDE2CXBhZDE7Cit9IHhTeW5jQ3JlYXRlRmVuY2VSZXE7CisjZGVmaW5lIHN6X3hTeW5jQ3JlYXRlRmVuY2VSZXEJCTE2CisKKy8qCisgKiBQdXQgYSBmZW5jZSBvYmplY3QgaW4gdGhlICJ0cmlnZ2VyZWQiIHN0YXRlLgorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNUcmlnZ2VyRmVuY2VSZXEgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgWFN5bmNGZW5jZQlmaWQgQjMyOworfSB4U3luY1RyaWdnZXJGZW5jZVJlcTsKKyNkZWZpbmUgc3pfeFN5bmNUcmlnZ2VyRmVuY2VSZXEJCTgKKworLyoKKyAqIFB1dCBhIGZlbmNlIGluIHRoZSAidW50cmlnZ2VyZWQiIHN0YXRlLgorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNSZXNldEZlbmNlUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jRmVuY2UJZmlkIEIzMjsKK30geFN5bmNSZXNldEZlbmNlUmVxOworI2RlZmluZSBzel94U3luY1Jlc2V0RmVuY2VSZXEJCTgKKworLyoKKyAqIERlc3Ryb3kgYSBmZW5jZSBvYmplY3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jRGVzdHJveUZlbmNlUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jRmVuY2UJZmlkIEIzMjsKK30geFN5bmNEZXN0cm95RmVuY2VSZXE7CisjZGVmaW5lIHN6X3hTeW5jRGVzdHJveUZlbmNlUmVxCQk4CisKKy8qCisgKiBRdWVyeSBhIGZlbmNlIG9iamVjdAorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNRdWVyeUZlbmNlUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jRmVuY2UJZmlkIEIzMjsKK30geFN5bmNRdWVyeUZlbmNlUmVxOworI2RlZmluZSBzel94U3luY1F1ZXJ5RmVuY2VSZXEJCTgKKworLyoKKyAqIFdhaXQgZm9yIGFueSBvZiBhIGxpc3Qgb2YgZmVuY2Ugc3luYyBvYmplY3RzCisgKiB0byByZWFjaCB0aGUgInRyaWdnZXJlZCIgc3RhdGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0F3YWl0RmVuY2VSZXEgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhTeW5jQXdhaXRGZW5jZVJlcTsKKyNkZWZpbmUgc3pfeFN5bmNBd2FpdEZlbmNlUmVxCQk0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQ0FSRDgJdW51c2VkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQk9PTAl0cmlnZ2VyZWQ7CisgICAgQllURQlwYWQwOworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworfSB4U3luY1F1ZXJ5RmVuY2VSZXBseTsKKyNkZWZpbmUgc3pfeFN5bmNRdWVyeUZlbmNlUmVwbHkJCTMyCisKKy8qCisgKiBFdmVudHMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNDb3VudGVyTm90aWZ5RXZlbnQgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCWtpbmQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBYU3luY0NvdW50ZXIgY291bnRlciBCMzI7CisgICAgSU5UMzIJd2FpdF92YWx1ZV9oaSBCMzI7CisgICAgQ0FSRDMyCXdhaXRfdmFsdWVfbG8gQjMyOworICAgIElOVDMyCWNvdW50ZXJfdmFsdWVfaGkgQjMyOworICAgIENBUkQzMgljb3VudGVyX3ZhbHVlX2xvIEIzMjsKKyAgICBDQVJEMzIJdGltZSBCMzI7CisgICAgQ0FSRDE2CWNvdW50IEIxNjsKKyAgICBCT09MCWRlc3Ryb3llZDsKKyAgICBCWVRFICAgICAgICBwYWQwOworfSB4U3luY0NvdW50ZXJOb3RpZnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jQWxhcm1Ob3RpZnlFdmVudCB7CisgICAgQllURQl0eXBlOworICAgIEJZVEUJa2luZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIFhTeW5jQWxhcm0JYWxhcm0gQjMyOworICAgIElOVDMyCWNvdW50ZXJfdmFsdWVfaGkgQjMyOworICAgIENBUkQzMgljb3VudGVyX3ZhbHVlX2xvIEIzMjsKKyAgICBJTlQzMglhbGFybV92YWx1ZV9oaSBCMzI7CisgICAgQ0FSRDMyCWFsYXJtX3ZhbHVlX2xvIEIzMjsKKyAgICBDQVJEMzIJdGltZSBCMzI7CisgICAgQ0FSRDggICAgICAgc3RhdGU7CisgICAgQllURSAgICAgICAgcGFkMDsKKyAgICBCWVRFICAgICAgICBwYWQxOworICAgIEJZVEUgICAgICAgIHBhZDI7Cit9IHhTeW5jQWxhcm1Ob3RpZnlFdmVudDsKKworI3VuZGVmIFhTeW5jQ291bnRlcgorI3VuZGVmIFhTeW5jQWxhcm0KKyN1bmRlZiBYU3luY0ZlbmNlCisjdW5kZWYgRHJhd2FibGUKKworCisjZW5kaWYgLyogX1NZTkNQUk9UT19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zeW5jc3RyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmNzdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWE0ODI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zeW5jc3RyLmgKQEAgLTAsMCArMSwxODIgQEAKKy8qCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAxOTkxLDE5OTMgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMsCithbmQgT2xpdmV0dGkgUmVzZWFyY2ggTGltaXRlZCwgQ2FtYnJpZGdlLCBFbmdsYW5kLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBEaWdpdGFsIG9yIE9saXZldHRpCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBBTkQgT0xJVkVUVEkgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUworU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKK0ZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRVkgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKK1VTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TWU5DU1RSX0hfCisjZGVmaW5lIF9TWU5DU1RSX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9zeW5jcHJvdG8uaD4KKworI2lmZGVmIF9TWU5DX1NFUlZFUgorCisjZGVmaW5lIENBUkQ2NCBYU3luY1ZhbHVlIC8qIFhYWCB0ZW1wb3JhcnkhIG5lZWQgcmVhbCA2NCBiaXQgdmFsdWVzIGZvciBBbHBoYSAqLworCit0eXBlZGVmIHN0cnVjdCBfU3luY0NvdW50ZXIgeworICAgIENsaWVudFB0cgkJY2xpZW50OwkvKiBPd25pbmcgY2xpZW50LiAwIGZvciBzeXN0ZW0gY291bnRlcnMgKi8KKyAgICBYU3luY0NvdW50ZXIJaWQ7CQkvKiByZXNvdXJjZSBJRCAqLworICAgIENBUkQ2NAkJdmFsdWU7CQkvKiBjb3VudGVyIHZhbHVlICovCisgICAgc3RydWN0IF9TeW5jVHJpZ2dlckxpc3QgKnBUcmlnbGlzdDsJLyogbGlzdCBvZiB0cmlnZ2VycyAqLworICAgIEJvb2wJCWJlaW5nRGVzdHJveWVkOyAvKiBpbiBwcm9jZXNzIG9mIGdvaW5nIGF3YXkgKi8KKyAgICBzdHJ1Y3QgX1N5c0NvdW50ZXJJbmZvICpwU3lzQ291bnRlckluZm87IC8qIE5VTEwgaWYgbm90IGEgc3lzdGVtIGNvdW50ZXIgKi8KK30gU3luY0NvdW50ZXI7CisKKy8qCisgKiBUaGUgU3lzdGVtIENvdW50ZXIgaW50ZXJmYWNlCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBYU3luY0NvdW50ZXJOZXZlckNoYW5nZXMsCisgICAgWFN5bmNDb3VudGVyTmV2ZXJJbmNyZWFzZXMsCisgICAgWFN5bmNDb3VudGVyTmV2ZXJEZWNyZWFzZXMsCisgICAgWFN5bmNDb3VudGVyVW5yZXN0cmljdGVkCit9IFN5bmNDb3VudGVyVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgX1N5c0NvdW50ZXJJbmZvIHsKKyAgICBjaGFyCSpuYW1lOworICAgIENBUkQ2NAlyZXNvbHV0aW9uOworICAgIENBUkQ2NAlicmFja2V0X2dyZWF0ZXI7CisgICAgQ0FSRDY0CWJyYWNrZXRfbGVzczsKKyAgICBTeW5jQ291bnRlclR5cGUgY291bnRlclR5cGU7ICAvKiBob3cgY2FuIHRoaXMgY291bnRlciBjaGFuZ2UgKi8KKyAgICB2b2lkICAgICAgICAoKlF1ZXJ5VmFsdWUpKAorCQkJICAgICAgcG9pbnRlciAvKnBDb3VudGVyKi8sCisJCQkgICAgICBDQVJENjQgKiAvKmZyZXNodmFsdWUqLworKTsKKyAgICB2b2lkCSgqQnJhY2tldFZhbHVlcykoCisJCQkJIHBvaW50ZXIgLypwQ291bnRlciovLAorCQkJCSBDQVJENjQgKiAvKmxlc3N0aGFuKi8sCisJCQkJIENBUkQ2NCAqIC8qZ3JlYXRlcnRoYW4qLworKTsKK30gU3lzQ291bnRlckluZm87CisKKworCit0eXBlZGVmIHN0cnVjdCBfU3luY1RyaWdnZXIgeworICAgIFN5bmNDb3VudGVyICpwQ291bnRlcjsKKyAgICBDQVJENjQJd2FpdF92YWx1ZTsJLyogd2FpdCB2YWx1ZSAqLworICAgIHVuc2lnbmVkIGludCB2YWx1ZV90eXBlOyAgICAgLyogQWJzb2x1dGUgb3IgUmVsYXRpdmUgKi8KKyAgICB1bnNpZ25lZCBpbnQgdGVzdF90eXBlOwkvKiB0cmFuc2l0aW9uIG9yIENvbXBhcmlzaW9uIHR5cGUgKi8KKyAgICBDQVJENjQJdGVzdF92YWx1ZTsJLyogdHJpZ2dlciBldmVudCB0aHJlc2hvbGQgdmFsdWUgKi8KKyAgICBCb29sCSgqQ2hlY2tUcmlnZ2VyKSgKKwkJCQlzdHJ1Y3QgX1N5bmNUcmlnZ2VyICogLypwVHJpZ2dlciovLAorCQkJCUNBUkQ2NCAvKm5ld3ZhbCovCisJCQkJKTsKKyAgICB2b2lkCSgqVHJpZ2dlckZpcmVkKSgKKwkJCQlzdHJ1Y3QgX1N5bmNUcmlnZ2VyICogLypwVHJpZ2dlciovCisJCQkJKTsKKyAgICB2b2lkCSgqQ291bnRlckRlc3Ryb3llZCkoCisJCQkJc3RydWN0IF9TeW5jVHJpZ2dlciAqIC8qcFRyaWdnZXIqLworCQkJCSAgICApOworfSBTeW5jVHJpZ2dlcjsKKwordHlwZWRlZiBzdHJ1Y3QgX1N5bmNUcmlnZ2VyTGlzdCB7CisgICAgU3luY1RyaWdnZXIgKnBUcmlnZ2VyOworICAgIHN0cnVjdCBfU3luY1RyaWdnZXJMaXN0ICpuZXh0OworfSBTeW5jVHJpZ2dlckxpc3Q7CisKK3R5cGVkZWYgc3RydWN0IF9TeW5jQWxhcm1DbGllbnRMaXN0IHsKKyAgICBDbGllbnRQdHIJY2xpZW50OworICAgIFhJRAkJZGVsZXRlX2lkOworICAgIHN0cnVjdCBfU3luY0FsYXJtQ2xpZW50TGlzdCAqbmV4dDsKK30gU3luY0FsYXJtQ2xpZW50TGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgX1N5bmNBbGFybSB7CisgICAgU3luY1RyaWdnZXIgdHJpZ2dlcjsKKyAgICBDbGllbnRQdHIJY2xpZW50OworICAgIFhTeW5jQWxhcm0gCWFsYXJtX2lkOworICAgIENBUkQ2NAlkZWx0YTsKKyAgICBpbnQJCWV2ZW50czsKKyAgICBpbnQJCXN0YXRlOworICAgIFN5bmNBbGFybUNsaWVudExpc3QgKnBFdmVudENsaWVudHM7Cit9IFN5bmNBbGFybTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENsaWVudFB0cgljbGllbnQ7CisgICAgQ0FSRDMyIAlkZWxldGVfaWQ7CisgICAgaW50CQludW1fd2FpdGNvbmRpdGlvbnM7Cit9IFN5bmNBd2FpdEhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFN5bmNUcmlnZ2VyIHRyaWdnZXI7CisgICAgQ0FSRDY0CWV2ZW50X3RocmVzaG9sZDsKKyAgICBTeW5jQXdhaXRIZWFkZXIgKnBIZWFkZXI7Cit9IFN5bmNBd2FpdDsKKwordHlwZWRlZiB1bmlvbiB7CisgICAgU3luY0F3YWl0SGVhZGVyIGhlYWRlcjsKKyAgICBTeW5jQXdhaXQJICAgIGF3YWl0OworfSBTeW5jQXdhaXRVbmlvbjsKKworCitleHRlcm4gcG9pbnRlciBTeW5jQ3JlYXRlU3lzdGVtQ291bnRlcigKKyAgICBjaGFyICoJLyogbmFtZSAqLywKKyAgICBDQVJENjQgIAkvKiBpbml0YWxfdmFsdWUgKi8sCisgICAgQ0FSRDY0ICAJLyogcmVzb2x1dGlvbiAqLywKKyAgICBTeW5jQ291bnRlclR5cGUgLyogY2hhbmdlIGNoYXJhY3Rlcml6YXRpb24gKi8sCisgICAgdm9pZCAgICAgICAgKCogLypRdWVyeVZhbHVlKi8gKSAoCisgICAgICAgIHBvaW50ZXIgLyogcENvdW50ZXIgKi8sCisgICAgICAgIENBUkQ2NCAqIC8qIHBWYWx1ZV9yZXR1cm4gKi8pLCAvKiBYWFggcHJvdG90eXBlICovCisgICAgdm9pZCAgICAgICAgKCogLypCcmFja2V0VmFsdWVzKi8pICgKKyAgICAgICAgcG9pbnRlciAvKiBwQ291bnRlciAqLywgCisgICAgICAgIENBUkQ2NCAqIC8qIHBicmFja2V0X2xlc3MgKi8sCisgICAgICAgIENBUkQ2NCAqIC8qIHBicmFja2V0X2dyZWF0ZXIgKi8pCispOworCitleHRlcm4gdm9pZCBTeW5jQ2hhbmdlQ291bnRlcigKKyAgICBTeW5jQ291bnRlciAqCS8qIHBDb3VudGVyKi8sCisgICAgQ0FSRDY0ICAJCS8qIG5ld192YWx1ZSAqLworKTsKKworZXh0ZXJuIHZvaWQgU3luY0Rlc3Ryb3lTeXN0ZW1Db3VudGVyKAorICAgIHBvaW50ZXIgcENvdW50ZXIKKyk7CitleHRlcm4gdm9pZCBJbml0U2VydmVydGltZSh2b2lkKTsKKworI2VuZGlmIC8qIF9TWU5DX1NFUlZFUiAqLworCisjZW5kaWYgLyogX1NZTkNTVFJfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveGZpeGVzcHJvdG8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveGZpeGVzcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTg5YzE5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94Zml4ZXNwcm90by5oCkBAIC0wLDAgKzEsNjA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworLyoKKyAqIENvcHlyaWdodCDCqSAyMDAyIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKKyAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9YRklYRVNQUk9UT19IXworI2RlZmluZSBfWEZJWEVTUFJPVE9fSF8KKworI2luY2x1ZGUgPFgxMS9YbWQuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy94Zml4ZXN3aXJlLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc2hhcGVjb25zdC5oPgorCisjZGVmaW5lIFdpbmRvdyBDQVJEMzIKKyNkZWZpbmUgRHJhd2FibGUgQ0FSRDMyCisjZGVmaW5lIEZvbnQgQ0FSRDMyCisjZGVmaW5lIFBpeG1hcCBDQVJEMzIKKyNkZWZpbmUgQ3Vyc29yIENBUkQzMgorI2RlZmluZSBDb2xvcm1hcCBDQVJEMzIKKyNkZWZpbmUgR0NvbnRleHQgQ0FSRDMyCisjZGVmaW5lIEF0b20gQ0FSRDMyCisjZGVmaW5lIFZpc3VhbElEIENBUkQzMgorI2RlZmluZSBUaW1lIENBUkQzMgorI2RlZmluZSBLZXlDb2RlIENBUkQ4CisjZGVmaW5lIEtleVN5bSBDQVJEMzIKKyNkZWZpbmUgUGljdHVyZSBDQVJEMzIKKworLyoqKioqKioqKioqKioqKiBWZXJzaW9uIDEgKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7Cit9IHhYRml4ZXNSZXE7CisKKy8qIAorICogcmVxdWVzdHMgYW5kIHJlcGxpZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIENBUkQzMiAgbWFqb3JWZXJzaW9uIEIzMjsKKyAgICBDQVJEMzIgIG1pbm9yVmVyc2lvbiBCMzI7Cit9IHhYRml4ZXNRdWVyeVZlcnNpb25SZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc1F1ZXJ5VmVyc2lvblJlcSAgIDEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFICAgIHR5cGU7ICAgLyogWF9SZXBseSAqLworICAgIEJZVEUgICAgcGFkMTsKKyAgICBDQVJEMTYgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgIGxlbmd0aCBCMzI7CisgICAgQ0FSRDMyICBtYWpvclZlcnNpb24gQjMyOworICAgIENBUkQzMiAgbWlub3JWZXJzaW9uIEIzMjsKKyAgICBDQVJEMzIgIHBhZDIgQjMyOworICAgIENBUkQzMiAgcGFkMyBCMzI7CisgICAgQ0FSRDMyICBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgIHBhZDUgQjMyOworfSB4WEZpeGVzUXVlcnlWZXJzaW9uUmVwbHk7CisKKyNkZWZpbmUgc3pfeFhGaXhlc1F1ZXJ5VmVyc2lvblJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBCWVRFICAgIG1vZGU7CSAgICAvKiBTZXRNb2RlSW5zZXJ0L1NldE1vZGVEZWxldGUqLworICAgIEJZVEUgICAgdGFyZ2V0OwkgICAgLyogU2F2ZVNldE5lYXJlc3QvU2F2ZVNldFJvb3QqLworICAgIEJZVEUgICAgbWFwOwkgICAgLyogU2F2ZVNldE1hcC9TYXZlU2V0VW5tYXAgKi8KKyAgICBCWVRFICAgIHBhZDE7CisgICAgV2luZG93ICB3aW5kb3c7Cit9IHhYRml4ZXNDaGFuZ2VTYXZlU2V0UmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNDaGFuZ2VTYXZlU2V0UmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgIHdpbmRvdyAgQjMyOworICAgIEF0b20gICAgc2VsZWN0aW9uIEIzMjsKKyAgICBDQVJEMzIgIGV2ZW50TWFzayBCMzI7Cit9IHhYRml4ZXNTZWxlY3RTZWxlY3Rpb25JbnB1dFJlcTsKKworI2RlZmluZSBzel94WEZpeGVzU2VsZWN0U2VsZWN0aW9uSW5wdXRSZXEgICAxNgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICB0eXBlOworICAgIENBUkQ4ICAgc3VidHlwZTsKKyAgICBDQVJEMTYgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBXaW5kb3cgIHdpbmRvdyBCMzI7CisgICAgV2luZG93ICBvd25lciBCMzI7CisgICAgQXRvbSAgICBzZWxlY3Rpb24gQjMyOworICAgIFRpbWUgICAgdGltZXN0YW1wIEIzMjsKKyAgICBUaW1lICAgIHNlbGVjdGlvblRpbWVzdGFtcCBCMzI7CisgICAgQ0FSRDMyICBwYWQyIEIzMjsKKyAgICBDQVJEMzIgIHBhZDMgQjMyOworfSB4WEZpeGVzU2VsZWN0aW9uTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgIHdpbmRvdyBCMzI7CisgICAgQ0FSRDMyICBldmVudE1hc2sgQjMyOworfSB4WEZpeGVzU2VsZWN0Q3Vyc29ySW5wdXRSZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc1NlbGVjdEN1cnNvcklucHV0UmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHR5cGU7CisgICAgQ0FSRDggICBzdWJ0eXBlOworICAgIENBUkQxNiAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIFdpbmRvdyAgd2luZG93IEIzMjsKKyAgICBDQVJEMzIgIGN1cnNvclNlcmlhbCBCMzI7CisgICAgVGltZSAgICB0aW1lc3RhbXA7CisgICAgQXRvbSAgICBuYW1lIEIzMjsJICAgIC8qIFZlcnNpb24gMiAqLworICAgIENBUkQzMiAgcGFkMSBCMzI7CisgICAgQ0FSRDMyICBwYWQyIEIzMjsKKyAgICBDQVJEMzIgIHBhZDMgQjMyOworfSB4WEZpeGVzQ3Vyc29yTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKK30geFhGaXhlc0dldEN1cnNvckltYWdlUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNHZXRDdXJzb3JJbWFnZVJlcSA0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFICAgIHR5cGU7ICAgLyogWF9SZXBseSAqLworICAgIEJZVEUgICAgcGFkMTsKKyAgICBDQVJEMTYgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgIGxlbmd0aCBCMzI7CisgICAgSU5UMTYgICB4IEIxNjsKKyAgICBJTlQxNiAgIHkgQjE2OworICAgIENBUkQxNiAgd2lkdGggQjE2OworICAgIENBUkQxNiAgaGVpZ2h0IEIxNjsKKyAgICBDQVJEMTYgIHhob3QgQjE2OworICAgIENBUkQxNiAgeWhvdCBCMTY7CisgICAgQ0FSRDMyICBjdXJzb3JTZXJpYWwgQjMyOworICAgIENBUkQzMiAgcGFkMiBCMzI7CisgICAgQ0FSRDMyICBwYWQzIEIzMjsKK30geFhGaXhlc0dldEN1cnNvckltYWdlUmVwbHk7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0dldEN1cnNvckltYWdlUmVwbHkJMzIKKworLyoqKioqKioqKioqKioqKiBWZXJzaW9uIDIgKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFJlZ2lvbiBDQVJEMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIFJlZ2lvbiAgcmVnaW9uIEIzMjsKKyAgICAvKiBMSVNUb2ZSRUNUQU5HTEUgKi8KK30geFhGaXhlc0NyZWF0ZVJlZ2lvblJlcTsKKworI2RlZmluZSBzel94WEZpeGVzQ3JlYXRlUmVnaW9uUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIFJlZ2lvbiAgcmVnaW9uIEIzMjsKKyAgICBQaXhtYXAgIGJpdG1hcCBCMzI7Cit9IHhYRml4ZXNDcmVhdGVSZWdpb25Gcm9tQml0bWFwUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNDcmVhdGVSZWdpb25Gcm9tQml0bWFwUmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBSZWdpb24gIHJlZ2lvbiBCMzI7CisgICAgV2luZG93ICB3aW5kb3cgQjMyOworICAgIENBUkQ4ICAga2luZDsKKyAgICBDQVJEOCAgIHBhZDE7CisgICAgQ0FSRDE2ICBwYWQyIEIxNjsKK30geFhGaXhlc0NyZWF0ZVJlZ2lvbkZyb21XaW5kb3dSZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0NyZWF0ZVJlZ2lvbkZyb21XaW5kb3dSZXEJMTYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIFJlZ2lvbiAgcmVnaW9uIEIzMjsKKyAgICBHQ29udGV4dCBnYyBCMzI7Cit9IHhYRml4ZXNDcmVhdGVSZWdpb25Gcm9tR0NSZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0NyZWF0ZVJlZ2lvbkZyb21HQ1JlcQkxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgUmVnaW9uICByZWdpb24gQjMyOworICAgIFBpY3R1cmUgcGljdHVyZSBCMzI7Cit9IHhYRml4ZXNDcmVhdGVSZWdpb25Gcm9tUGljdHVyZVJlcTsKKworI2RlZmluZSBzel94WEZpeGVzQ3JlYXRlUmVnaW9uRnJvbVBpY3R1cmVSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIFJlZ2lvbiAgcmVnaW9uIEIzMjsKK30geFhGaXhlc0Rlc3Ryb3lSZWdpb25SZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0Rlc3Ryb3lSZWdpb25SZXEJOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgUmVnaW9uICByZWdpb24gQjMyOworICAgIC8qIExJU1RvZlJFQ1RBTkdMRSAqLworfSB4WEZpeGVzU2V0UmVnaW9uUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNTZXRSZWdpb25SZXEJCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIFJlZ2lvbiAgc291cmNlIEIzMjsKKyAgICBSZWdpb24gIGRlc3RpbmF0aW9uIEIzMjsKK30geFhGaXhlc0NvcHlSZWdpb25SZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0NvcHlSZWdpb25SZXEJCTEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBSZWdpb24gIHNvdXJjZTEgQjMyOworICAgIFJlZ2lvbiAgc291cmNlMiBCMzI7CisgICAgUmVnaW9uICBkZXN0aW5hdGlvbiBCMzI7Cit9IHhYRml4ZXNDb21iaW5lUmVnaW9uUmVxLAorICB4WEZpeGVzVW5pb25SZWdpb25SZXEsCisgIHhYRml4ZXNJbnRlcnNlY3RSZWdpb25SZXEsCisgIHhYRml4ZXNTdWJ0cmFjdFJlZ2lvblJlcTsKKworI2RlZmluZSBzel94WEZpeGVzQ29tYmluZVJlZ2lvblJlcQkxNgorI2RlZmluZSBzel94WEZpeGVzVW5pb25SZWdpb25SZXEJc3pfeFhGaXhlc0NvbWJpbmVSZWdpb25SZXEKKyNkZWZpbmUgc3pfeFhGaXhlc0ludGVyc2VjdFJlZ2lvblJlcQlzel94WEZpeGVzQ29tYmluZVJlZ2lvblJlcQorI2RlZmluZSBzel94WEZpeGVzU3VidHJhY3RSZWdpb25SZXEJc3pfeFhGaXhlc0NvbWJpbmVSZWdpb25SZXEKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIFJlZ2lvbiAgc291cmNlIEIzMjsKKyAgICBJTlQxNiAgIHggQjE2LCB5IEIxNjsKKyAgICBDQVJEMTYgIHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKyAgICBSZWdpb24gIGRlc3RpbmF0aW9uIEIzMjsKK30geFhGaXhlc0ludmVydFJlZ2lvblJlcTsKKworI2RlZmluZSBzel94WEZpeGVzSW52ZXJ0UmVnaW9uUmVxCTIwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBSZWdpb24gIHJlZ2lvbiBCMzI7CisgICAgSU5UMTYgICBkeCBCMTYsIGR5IEIxNjsKK30geFhGaXhlc1RyYW5zbGF0ZVJlZ2lvblJlcTsKKworI2RlZmluZSBzel94WEZpeGVzVHJhbnNsYXRlUmVnaW9uUmVxCTEyCisgICAgCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgUmVnaW9uICBzb3VyY2UgQjMyOworICAgIFJlZ2lvbiAgZGVzdGluYXRpb24gQjMyOworfSB4WEZpeGVzUmVnaW9uRXh0ZW50c1JlcTsKKworI2RlZmluZSBzel94WEZpeGVzUmVnaW9uRXh0ZW50c1JlcQkxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgUmVnaW9uICByZWdpb24gQjMyOworfSB4WEZpeGVzRmV0Y2hSZWdpb25SZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0ZldGNoUmVnaW9uUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgICAgdHlwZTsgICAvKiBYX1JlcGx5ICovCisgICAgQllURSAgICBwYWQxOworICAgIENBUkQxNiAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAgbGVuZ3RoIEIzMjsKKyAgICBJTlQxNiAgIHggQjE2LCB5IEIxNjsKKyAgICBDQVJEMTYgIHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKyAgICBDQVJEMzIgIHBhZDIgQjMyOworICAgIENBUkQzMiAgcGFkMyBCMzI7CisgICAgQ0FSRDMyICBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgIHBhZDUgQjMyOworfSB4WEZpeGVzRmV0Y2hSZWdpb25SZXBseTsKKworI2RlZmluZSBzel94WEZpeGVzRmV0Y2hSZWdpb25SZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgR0NvbnRleHQJZ2MgQjMyOworICAgIFJlZ2lvbiAgcmVnaW9uIEIzMjsKKyAgICBJTlQxNiAgIHhPcmlnaW4gQjE2LCB5T3JpZ2luIEIxNjsKK30geFhGaXhlc1NldEdDQ2xpcFJlZ2lvblJlcTsKKworI2RlZmluZSBzel94WEZpeGVzU2V0R0NDbGlwUmVnaW9uUmVxCTE2CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgIGRlc3Q7CisgICAgQllURSAgICBkZXN0S2luZDsKKyAgICBDQVJEOCAgIHBhZDE7CisgICAgQ0FSRDE2ICBwYWQyIEIxNjsKKyAgICBJTlQxNiAgIHhPZmYgQjE2LCB5T2ZmIEIxNjsKKyAgICBSZWdpb24gIHJlZ2lvbjsKK30geFhGaXhlc1NldFdpbmRvd1NoYXBlUmVnaW9uUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNTZXRXaW5kb3dTaGFwZVJlZ2lvblJlcQkyMAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgUGljdHVyZSBwaWN0dXJlIEIzMjsKKyAgICBSZWdpb24gIHJlZ2lvbiBCMzI7CisgICAgSU5UMTYgICB4T3JpZ2luIEIxNiwgeU9yaWdpbiBCMTY7Cit9IHhYRml4ZXNTZXRQaWN0dXJlQ2xpcFJlZ2lvblJlcTsKKworI2RlZmluZSBzel94WEZpeGVzU2V0UGljdHVyZUNsaXBSZWdpb25SZXEgICAxNgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgQ3Vyc29yICBjdXJzb3IgQjMyOworICAgIENBUkQxNiAgbmJ5dGVzIEIxNjsKKyAgICBDQVJEMTYgIHBhZCBCMTY7Cit9IHhYRml4ZXNTZXRDdXJzb3JOYW1lUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNTZXRDdXJzb3JOYW1lUmVxCSAgICAxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgQ3Vyc29yICBjdXJzb3IgQjMyOworfSB4WEZpeGVzR2V0Q3Vyc29yTmFtZVJlcTsKKworI2RlZmluZSBzel94WEZpeGVzR2V0Q3Vyc29yTmFtZVJlcQkgICAgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSAgICB0eXBlOyAgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFICAgIHBhZDE7CisgICAgQ0FSRDE2ICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyICBsZW5ndGggQjMyOworICAgIEF0b20gICAgYXRvbSBCMzI7CisgICAgQ0FSRDE2ICBuYnl0ZXMgQjE2OworICAgIENBUkQxNiAgcGFkMiBCMTY7CisgICAgQ0FSRDMyICBwYWQzIEIzMjsKKyAgICBDQVJEMzIgIHBhZDQgQjMyOworICAgIENBUkQzMiAgcGFkNSBCMzI7CisgICAgQ0FSRDMyICBwYWQ2IEIzMjsKK30geFhGaXhlc0dldEN1cnNvck5hbWVSZXBseTsKKworI2RlZmluZSBzel94WEZpeGVzR2V0Q3Vyc29yTmFtZVJlcGx5CSAgICAzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7Cit9IHhYRml4ZXNHZXRDdXJzb3JJbWFnZUFuZE5hbWVSZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0dldEN1cnNvckltYWdlQW5kTmFtZVJlcSAgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSAgICB0eXBlOyAgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFICAgIHBhZDE7CisgICAgQ0FSRDE2ICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyICBsZW5ndGggQjMyOworICAgIElOVDE2ICAgeCBCMTY7CisgICAgSU5UMTYgICB5IEIxNjsKKyAgICBDQVJEMTYgIHdpZHRoIEIxNjsKKyAgICBDQVJEMTYgIGhlaWdodCBCMTY7CisgICAgQ0FSRDE2ICB4aG90IEIxNjsKKyAgICBDQVJEMTYgIHlob3QgQjE2OworICAgIENBUkQzMiAgY3Vyc29yU2VyaWFsIEIzMjsKKyAgICBBdG9tICAgIGN1cnNvck5hbWUgQjMyOworICAgIENBUkQxNiAgbmJ5dGVzIEIxNjsKKyAgICBDQVJEMTYgIHBhZCBCMTY7Cit9IHhYRml4ZXNHZXRDdXJzb3JJbWFnZUFuZE5hbWVSZXBseTsKKworI2RlZmluZSBzel94WEZpeGVzR2V0Q3Vyc29ySW1hZ2VBbmROYW1lUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIEN1cnNvciAgc291cmNlIEIzMjsKKyAgICBDdXJzb3IgIGRlc3RpbmF0aW9uIEIzMjsKK30geFhGaXhlc0NoYW5nZUN1cnNvclJlcTsKKworI2RlZmluZSBzel94WEZpeGVzQ2hhbmdlQ3Vyc29yUmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBDdXJzb3IgIHNvdXJjZSBCMzI7CisgICAgQ0FSRDE2ICBuYnl0ZXM7CisgICAgQ0FSRDE2ICBwYWQ7Cit9IHhYRml4ZXNDaGFuZ2VDdXJzb3JCeU5hbWVSZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0NoYW5nZUN1cnNvckJ5TmFtZVJlcQkxMgorCisvKioqKioqKioqKioqKioqIFZlcnNpb24gMyAqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBSZWdpb24gIHNvdXJjZSBCMzI7CisgICAgUmVnaW9uICBkZXN0aW5hdGlvbiBCMzI7CisgICAgQ0FSRDE2ICBsZWZ0IEIxNjsKKyAgICBDQVJEMTYgIHJpZ2h0IEIxNjsKKyAgICBDQVJEMTYgIHRvcCBCMTY7CisgICAgQ0FSRDE2ICBib3R0b20gQjE2OworfSB4WEZpeGVzRXhwYW5kUmVnaW9uUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNFeHBhbmRSZWdpb25SZXEJMjAKKworLyoqKioqKioqKioqKioqKiBWZXJzaW9uIDQuMCAqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgIHdpbmRvdyBCMzI7Cit9IHhYRml4ZXNIaWRlQ3Vyc29yUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNIaWRlQ3Vyc29yUmVxCXNpemVvZih4WEZpeGVzSGlkZUN1cnNvclJlcSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIFdpbmRvdyAgd2luZG93IEIzMjsKK30geFhGaXhlc1Nob3dDdXJzb3JSZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc1Nob3dDdXJzb3JSZXEJc2l6ZW9mKHhYRml4ZXNTaG93Q3Vyc29yUmVxKQorCisvKioqKioqKioqKioqKioqIFZlcnNpb24gNS4wICoqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBCYXJyaWVyIENBUkQzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgQmFycmllciBiYXJyaWVyIEIzMjsKKyAgICBXaW5kb3cgIHdpbmRvdyBCMzI7CisgICAgSU5UMTYgICB4MSBCMTY7CisgICAgSU5UMTYgICB5MSBCMTY7CisgICAgSU5UMTYgICB4MiBCMTY7CisgICAgSU5UMTYgICB5MiBCMTY7CisgICAgQ0FSRDMyICBkaXJlY3Rpb25zOworICAgIENBUkQxNiAgcGFkIEIxNjsKKyAgICBDQVJEMTYgIG51bV9kZXZpY2VzIEIxNjsKKyAgICAvKiBhcnJheSBvZiBDQVJEMTYgZGV2aWNlcyAqLworfSB4WEZpeGVzQ3JlYXRlUG9pbnRlckJhcnJpZXJSZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0NyZWF0ZVBvaW50ZXJCYXJyaWVyUmVxIDI4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBCYXJyaWVyIGJhcnJpZXIgQjMyOworfSB4WEZpeGVzRGVzdHJveVBvaW50ZXJCYXJyaWVyUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNEZXN0cm95UG9pbnRlckJhcnJpZXJSZXEgOAorCisvKioqKioqKioqKioqKioqIFZlcnNpb24gNi4wICoqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBCYXJyaWVyRXZlbnRJRCBDQVJEMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBDQVJEOCAgIHR5cGU7CisgIENBUkQ4ICAgc3VidHlwZTsKKyAgQ0FSRDE2ICBzZXF1ZW5jZU51bWJlciBCMTY7CisgIFdpbmRvdyAgd2luZG93OyBCMzI7CisgIEJhcnJpZXJFdmVudElEIGV2ZW50X2lkIEIzMjsKKyAgQmFycmllciBiYXJyaWVyOworICBUaW1lICAgIHRpbWVzdGFtcCBCMzI7CisgIENBUkQzMiAgdmVsb2NpdHkgQjMyOworICBJTlQxNiAgIHggQjE2OworICBJTlQxNiAgIHkgQjE2OworfSB4WEZpeGVzQmFycmllck5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgQmFycmllciBiYXJyaWVyIEIzMjsKKyAgICBXaW5kb3cgIHdpbmRvdyBCMzI7CisgICAgSU5UMTYgICB4MSBCMTY7CisgICAgSU5UMTYgICB5MSBCMTY7CisgICAgSU5UMTYgICB4MiBCMTY7CisgICAgSU5UMTYgICB5MiBCMTY7CisgICAgQ0FSRDMyICBkaXJlY3Rpb25zOworICAgIENBUkQzMiAgdmVsb2NpdHk7CisgICAgQ0FSRDE2ICBwYWQgQjE2OworICAgIENBUkQxNiAgbnVtX2RldmljZXMgQjE2OworICAgIC8qIGFycmF5IG9mIENBUkQxNiBkZXZpY2VzICovCit9IHhYRml4ZXNDcmVhdGVQb2ludGVyQmFycmllclZlbG9jaXR5UmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNDcmVhdGVQb2ludGVyQmFycmllclZlbG9jaXR5UmVxIDMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgIHdpbmRvdyBCMzI7CisgICAgQ0FSRDMyICBldmVudE1hc2sgQjMyOworfSB4WEZpeGVzU2VsZWN0QmFycmllcklucHV0UmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNTZWxlY3RCYXJyaWVySW5wdXRSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIEJhcnJpZXIgYmFycmllciBCMzI7CisgICAgQmFycmllckV2ZW50SUQgZXZlbnRfaWQgQjMyOworfSB4WEZpeGVzQmFycmllclJlbGVhc2VQb2ludGVyUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNCYXJyaWVyUmVsZWFzZVBvaW50ZXJSZXEJMTIKKworI3VuZGVmIEJhcnJpZXJFdmVudElECisjdW5kZWYgQmFycmllcgorI3VuZGVmIFJlZ2lvbgorI3VuZGVmIFBpY3R1cmUKKyN1bmRlZiBXaW5kb3cKKyN1bmRlZiBEcmF3YWJsZQorI3VuZGVmIEZvbnQKKyN1bmRlZiBQaXhtYXAKKyN1bmRlZiBDdXJzb3IKKyN1bmRlZiBDb2xvcm1hcAorI3VuZGVmIEdDb250ZXh0CisjdW5kZWYgQXRvbQorI3VuZGVmIFZpc3VhbElECisjdW5kZWYgVGltZQorI3VuZGVmIEtleUNvZGUKKyN1bmRlZiBLZXlTeW0KKworI2VuZGlmIC8qIF9YRklYRVNQUk9UT19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94Zml4ZXN3aXJlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3hmaXhlc3dpcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjMwNTk1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94Zml4ZXN3aXJlLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisvKgorICogQ29weXJpZ2h0IMKpIDIwMDIgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAorICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBfWEZJWEVTV0lSRV9IXworI2RlZmluZSBfWEZJWEVTV0lSRV9IXworCisjZGVmaW5lIFhGSVhFU19OQU1FCSJYRklYRVMiCisjZGVmaW5lIFhGSVhFU19NQUpPUgk2CisjZGVmaW5lIFhGSVhFU19NSU5PUgkwCisKKy8qKioqKioqKioqKioqKiogVmVyc2lvbiAxICoqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWF9YRml4ZXNRdWVyeVZlcnNpb24JCSAgICAwCisjZGVmaW5lIFhfWEZpeGVzQ2hhbmdlU2F2ZVNldAkJICAgIDEKKyNkZWZpbmUgWF9YRml4ZXNTZWxlY3RTZWxlY3Rpb25JbnB1dAkgICAgMgorI2RlZmluZSBYX1hGaXhlc1NlbGVjdEN1cnNvcklucHV0CSAgICAzCisjZGVmaW5lIFhfWEZpeGVzR2V0Q3Vyc29ySW1hZ2UJCSAgICA0CisvKioqKioqKioqKioqKioqIFZlcnNpb24gMiAqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFhfWEZpeGVzQ3JlYXRlUmVnaW9uCQkgICAgNQorI2RlZmluZSBYX1hGaXhlc0NyZWF0ZVJlZ2lvbkZyb21CaXRtYXAJICAgIDYKKyNkZWZpbmUgWF9YRml4ZXNDcmVhdGVSZWdpb25Gcm9tV2luZG93CSAgICA3CisjZGVmaW5lIFhfWEZpeGVzQ3JlYXRlUmVnaW9uRnJvbUdDCSAgICA4CisjZGVmaW5lIFhfWEZpeGVzQ3JlYXRlUmVnaW9uRnJvbVBpY3R1cmUJICAgIDkKKyNkZWZpbmUgWF9YRml4ZXNEZXN0cm95UmVnaW9uCQkgICAgMTAKKyNkZWZpbmUgWF9YRml4ZXNTZXRSZWdpb24JCSAgICAxMQorI2RlZmluZSBYX1hGaXhlc0NvcHlSZWdpb24JCSAgICAxMgorI2RlZmluZSBYX1hGaXhlc1VuaW9uUmVnaW9uCQkgICAgMTMKKyNkZWZpbmUgWF9YRml4ZXNJbnRlcnNlY3RSZWdpb24JCSAgICAxNAorI2RlZmluZSBYX1hGaXhlc1N1YnRyYWN0UmVnaW9uCQkgICAgMTUKKyNkZWZpbmUgWF9YRml4ZXNJbnZlcnRSZWdpb24JCSAgICAxNgorI2RlZmluZSBYX1hGaXhlc1RyYW5zbGF0ZVJlZ2lvbgkJICAgIDE3CisjZGVmaW5lIFhfWEZpeGVzUmVnaW9uRXh0ZW50cwkJICAgIDE4CisjZGVmaW5lIFhfWEZpeGVzRmV0Y2hSZWdpb24JCSAgICAxOQorI2RlZmluZSBYX1hGaXhlc1NldEdDQ2xpcFJlZ2lvbgkJICAgIDIwCisjZGVmaW5lIFhfWEZpeGVzU2V0V2luZG93U2hhcGVSZWdpb24JICAgIDIxCisjZGVmaW5lIFhfWEZpeGVzU2V0UGljdHVyZUNsaXBSZWdpb24JICAgIDIyCisjZGVmaW5lIFhfWEZpeGVzU2V0Q3Vyc29yTmFtZQkJICAgIDIzCisjZGVmaW5lIFhfWEZpeGVzR2V0Q3Vyc29yTmFtZQkJICAgIDI0CisjZGVmaW5lIFhfWEZpeGVzR2V0Q3Vyc29ySW1hZ2VBbmROYW1lCSAgICAyNQorI2RlZmluZSBYX1hGaXhlc0NoYW5nZUN1cnNvcgkJICAgIDI2CisjZGVmaW5lIFhfWEZpeGVzQ2hhbmdlQ3Vyc29yQnlOYW1lCSAgICAyNworLyoqKioqKioqKioqKioqKiBWZXJzaW9uIDMgKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBYX1hGaXhlc0V4cGFuZFJlZ2lvbgkJICAgIDI4CisvKioqKioqKioqKioqKioqIFZlcnNpb24gNCAqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFhfWEZpeGVzSGlkZUN1cnNvcgkJICAgIDI5CisjZGVmaW5lIFhfWEZpeGVzU2hvd0N1cnNvcgkJICAgIDMwCisvKioqKioqKioqKioqKioqIFZlcnNpb24gNSAqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFhfWEZpeGVzQ3JlYXRlUG9pbnRlckJhcnJpZXIJICAgIDMxCisjZGVmaW5lIFhfWEZpeGVzRGVzdHJveVBvaW50ZXJCYXJyaWVyCSAgICAzMgorLyoqKioqKioqKioqKioqKiBWZXJzaW9uIDYgKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBYX1hGaXhlc0NyZWF0ZVBvaW50ZXJCYXJyaWVyVmVsb2NpdHkgMzMKKyNkZWZpbmUgWF9YRml4ZXNTZWxlY3RCYXJyaWVySW5wdXQgICAgICAgICAgMzQKKyNkZWZpbmUgWF9YRml4ZXNCYXJyaWVyUmVsZWFzZVBvaW50ZXIgICAgICAgMzUKKworI2RlZmluZSBYRml4ZXNOdW1iZXJSZXF1ZXN0cwkJICAgIChYX1hGaXhlc0JhcnJpZXJSZWxlYXNlUG9pbnRlcisxKQorCisvKiBTZWxlY3Rpb24gZXZlbnRzIHNoYXJlIG9uZSBldmVudCBudW1iZXIgKi8KKyNkZWZpbmUgWEZpeGVzU2VsZWN0aW9uTm90aWZ5CQkgICAgMAorCisvKiBXaXRoaW4gdGhlIHNlbGVjdGlvbiwgdGhlICdzdWJ0eXBlJyBmaWVsZCBkaXN0aW5ndWlzaGVzICovCisjZGVmaW5lIFhGaXhlc1NldFNlbGVjdGlvbk93bmVyTm90aWZ5CSAgICAwCisjZGVmaW5lIFhGaXhlc1NlbGVjdGlvbldpbmRvd0Rlc3Ryb3lOb3RpZnkgIDEKKyNkZWZpbmUgWEZpeGVzU2VsZWN0aW9uQ2xpZW50Q2xvc2VOb3RpZnkgICAgMgorCisjZGVmaW5lIFhGaXhlc1NldFNlbGVjdGlvbk93bmVyTm90aWZ5TWFzawkoMUwgPDwgMCkKKyNkZWZpbmUgWEZpeGVzU2VsZWN0aW9uV2luZG93RGVzdHJveU5vdGlmeU1hc2sJKDFMIDw8IDEpCisjZGVmaW5lIFhGaXhlc1NlbGVjdGlvbkNsaWVudENsb3NlTm90aWZ5TWFzawkoMUwgPDwgMikKKworLyogVGhlcmUncyBvbmx5IG9uZSBjdXJzb3IgZXZlbnQgc28gZmFyICovCisjZGVmaW5lIFhGaXhlc0N1cnNvck5vdGlmeQkJICAgIDEKKworI2RlZmluZSBYRml4ZXNEaXNwbGF5Q3Vyc29yTm90aWZ5CSAgICAwCisKKyNkZWZpbmUgWEZpeGVzRGlzcGxheUN1cnNvck5vdGlmeU1hc2sJICAgICgxTCA8PCAwKQorCisvKiBlcnJvcnMgKi8KKyNkZWZpbmUgQmFkUmVnaW9uCQkJICAgIDAKKyNkZWZpbmUgQmFkQmFycmllcgkJCSAgICAxCisjZGVmaW5lIFhGaXhlc051bWJlckVycm9ycwkJICAgIChCYWRCYXJyaWVyKzEpCisKKyNkZWZpbmUgU2F2ZVNldE5lYXJlc3QJCQkgICAgMAorI2RlZmluZSBTYXZlU2V0Um9vdAkJCSAgICAxCisKKyNkZWZpbmUgU2F2ZVNldE1hcAkJCSAgICAwCisjZGVmaW5lIFNhdmVTZXRVbm1hcAkJCSAgICAxCisKKy8qKioqKioqKioqKioqKiogVmVyc2lvbiAyICoqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBXaW5kb3dSZWdpb25Cb3VuZGluZwkJICAgIDAKKyNkZWZpbmUgV2luZG93UmVnaW9uQ2xpcAkJICAgIDEKKworLyoqKioqKioqKioqKioqKiBWZXJzaW9uIDUgKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEJhcnJpZXJQb3NpdGl2ZVgJCSAgICAoMUwgPDwgMCkKKyNkZWZpbmUgQmFycmllclBvc2l0aXZlWQkJICAgICgxTCA8PCAxKQorI2RlZmluZSBCYXJyaWVyTmVnYXRpdmVYCQkgICAgKDFMIDw8IDIpCisjZGVmaW5lIEJhcnJpZXJOZWdhdGl2ZVkJCSAgICAoMUwgPDwgMykKKworLyoqKioqKioqKioqKioqKiBWZXJzaW9uIDYgKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFhGaXhlc0JhcnJpZXJOb3RpZnkgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBYRml4ZXNCYXJyaWVySGl0Tm90aWZ5CQkJMAorI2RlZmluZSBYRml4ZXNCYXJyaWVyVGhyZXNob2xkRXhjZWVkZWROb3RpZnkJMQorCisjZGVmaW5lIFhGaXhlc0JhcnJpZXJIaXROb3RpZnlNYXNrCQkJKDFMIDw8IDApCisjZGVmaW5lIFhGaXhlc0JhcnJpZXJUaHJlc2hvbGRFeGNlZWRlZE5vdGlmeU1hc2sJKDFMIDw8IDEpCisKKyNkZWZpbmUgWEZpeGVzTnVtYmVyRXZlbnRzCQkgICAgKFhGaXhlc0JhcnJpZXJOb3RpZnkrMSkKKworCisjZW5kaWYJLyogX1hGSVhFU1dJUkVfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3Rjb25zdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94dGVzdGNvbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0YjkwNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3Rjb25zdC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisKK0NvcHlyaWdodCAxOTkyLCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisjaWZuZGVmIF9YVEVTVF9DT05TVF9IXworI2RlZmluZSBfWFRFU1RfQ09OU1RfSF8KKworI2RlZmluZSBYVGVzdE51bWJlckV2ZW50cwkwCisKKyNkZWZpbmUgWFRlc3ROdW1iZXJFcnJvcnMJMAorCisjZGVmaW5lIFhUZXN0Q3VycmVudEN1cnNvciAoKEN1cnNvcikxKQorCisjZGVmaW5lIFhUZXN0TWFqb3JWZXJzaW9uCTIKKyNkZWZpbmUgWFRlc3RNaW5vclZlcnNpb24JMgorCisjZGVmaW5lIFhUZXN0RXh0ZW5zaW9uTmFtZQkiWFRFU1QiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94dGVzdGV4dDEuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3RleHQxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljZGQxNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3RleHQxLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIHh0ZXN0ZXh0MS5oCisgKgorICogWDExIElucHV0IFN5bnRoZXNpcyBFeHRlbnNpb24gaW5jbHVkZSBmaWxlCisgKi8KKworLyoKKworCitDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OCBieSBIZXdsZXR0LVBhY2thcmQgQ29ycG9yYXRpb24KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAorZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0Citub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEhld2xldHQtUGFja2FyZCBub3QgYmUgdXNlZCBpbgorYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitIZXdsZXR0LVBhY2thcmQgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSAKK3N1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgCisiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCitUaGlzIHNvZnR3YXJlIGlzIG5vdCBzdWJqZWN0IHRvIGFueSBsaWNlbnNlIG9mIHRoZSBBbWVyaWNhbgorVGVsZXBob25lIGFuZCBUZWxlZ3JhcGggQ29tcGFueSBvciBvZiB0aGUgUmVnZW50cyBvZiB0aGUKK1VuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKworKi8KKworI2lmbmRlZiBfWFRFU1RFWFQxX0gKKyNkZWZpbmUgX1hURVNURVhUMV9ICisvKgorICogdGhlIHR5cGVkZWZzIGZvciBDQVJEOCwgQ0FSRDE2LCBhbmQgQ0FSRDMyIGFyZSBkZWZpbmVkIGluIFhtZC5oCisgKi8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3h0ZXN0ZXh0MWNvbnN0Lmg+CisvKgorICogVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBmb3IgdGhlIGlucHV0IGFjdGlvbiBob3N0IGZvcm1hdCBldmVudCBzdHJ1Y3R1cmUuCisgKiBUaGlzIGlzIHRoZSBmb3JtIHRoYXQgYSBjbGllbnQgdXNpbmcgdGhpcyBleHRlbnNpb24gd2lsbCBzZWUgd2hlbgorICogaXQgcmVjZWl2ZXMgYW4gaW5wdXQgYWN0aW9uIGV2ZW50LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGludCAgICAgdHlwZTsgICAgICAgICAgIC8qIGFsd2F5cyBYVGVzdElucHV0QWN0aW9uVHlwZSAqLworCURpc3BsYXkgKmRpc3BsYXk7CisJV2luZG93ICB3aW5kb3c7CisgICAgICAgIENBUkQ4ICAgYWN0aW9uc1tYVGVzdEFDVElPTlNfU0laRV07Cit9IFhUZXN0SW5wdXRBY3Rpb25FdmVudDsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gZm9yIHRoZSB4VGVzdEZha2VBY2sgaG9zdCBmb3JtYXQgZXZlbnQgc3RydWN0dXJlLgorICogVGhpcyBpcyB0aGUgZm9ybSB0aGF0IGEgY2xpZW50IHVzaW5nIHRoaXMgZXh0ZW5zaW9uIHdpbGwgc2VlIHdoZW4KKyAqIGl0IHJlY2VpdmVzIGFuIFhUZXN0RmFrZUFjayBldmVudC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBpbnQgICAgIHR5cGU7ICAgICAgICAgICAvKiBhbHdheXMgWFRlc3RGYWtlQWNrVHlwZSAqLworCURpc3BsYXkgKmRpc3BsYXk7CisJV2luZG93ICB3aW5kb3c7Cit9IFhUZXN0RmFrZUFja0V2ZW50OworCitfWEZVTkNQUk9UT0JFR0lOCisKK2ludCBYVGVzdEZha2VJbnB1dChyZWdpc3RlciBEaXNwbGF5ICpkcHksIGNoYXIgKmFjdGlvbl9saXN0X2FkZHIsIGludCBhY3Rpb25fbGlzdF9zaXplLCBpbnQgYWNrX2ZsYWcpOworaW50IFhUZXN0R2V0SW5wdXQocmVnaXN0ZXIgRGlzcGxheSAqZHB5LCBpbnQgYWN0aW9uX2hhbmRsaW5nKTsKK2ludCBYVGVzdFF1ZXJ5SW5wdXRTaXplKHJlZ2lzdGVyIERpc3BsYXkgKmRweSwgdW5zaWduZWQgbG9uZyAqc2l6ZV9yZXR1cm4pOworaW50IFhUZXN0UHJlc3NLZXkoRGlzcGxheSAqZGlzcGxheSwgaW50IGRldmljZV9pZCwgdW5zaWduZWQgbG9uZyBkZWxheSwgdW5zaWduZWQgaW50IGtleWNvZGUsIHVuc2lnbmVkIGludCBrZXlfYWN0aW9uKTsKK2ludCBYVGVzdFByZXNzQnV0dG9uKERpc3BsYXkgKiBkaXNwbGF5LCBpbnQgZGV2aWNlX2lkLCB1bnNpZ25lZCBsb25nIGRlbGF5LCB1bnNpZ25lZCBpbnQgYnV0dG9uX251bWJlciwgdW5zaWduZWQgaW50IGJ1dHRvbl9hY3Rpb24pOworaW50IFhUZXN0TW92ZVBvaW50ZXIoRGlzcGxheSAqZGlzcGxheSwgaW50IGRldmljZV9pZCwgdW5zaWduZWQgbG9uZyBkZWxheVtdLCBpbnQgeFtdLCBpbnQgeVtdLCB1bnNpZ25lZCBpbnQgY291bnQpOworaW50IFhUZXN0Rmx1c2goRGlzcGxheSAqZGlzcGxheSk7CitpbnQgWFRlc3RTdG9wSW5wdXQocmVnaXN0ZXIgRGlzcGxheSAqZHB5KTsKK2ludCBYVGVzdFJlc2V0KHJlZ2lzdGVyIERpc3BsYXkgKmRweSk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBfWFRFU1RFWFQxX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3RleHQxY29uc3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3RleHQxY29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTZlZGM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94dGVzdGV4dDFjb25zdC5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogeHRlc3RleHQxLmgKKyAqCisgKiBYMTEgSW5wdXQgU3ludGhlc2lzIEV4dGVuc2lvbiBpbmNsdWRlIGZpbGUKKyAqLworCisvKgorCisKK0NvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg4LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisKK0NvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg4IGJ5IEhld2xldHQtUGFja2FyZCBDb3Jwb3JhdGlvbgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgSGV3bGV0dC1QYWNrYXJkIG5vdCBiZSB1c2VkIGluCithZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisKK0hld2xldHQtUGFja2FyZCBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCitzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCisiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCitUaGlzIHNvZnR3YXJlIGlzIG5vdCBzdWJqZWN0IHRvIGFueSBsaWNlbnNlIG9mIHRoZSBBbWVyaWNhbgorVGVsZXBob25lIGFuZCBUZWxlZ3JhcGggQ29tcGFueSBvciBvZiB0aGUgUmVnZW50cyBvZiB0aGUKK1VuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKworKi8KKworI2lmbmRlZiBfWFRFU1RFWFQxQ09OU1RfSAorI2RlZmluZSBfWFRFU1RFWFQxQ09OU1RfSCAxCisKKyNkZWZpbmUgWFRlc3RNQVhfQUNUSU9OX0xJU1RfU0laRSAgICAgICA2NAorI2RlZmluZSBYVGVzdEFDVElPTlNfU0laRQkyOAorCisKKy8qCisgKiB1c2VkIGluIHRoZSBYVGVzdFByZXNzQnV0dG9uIGFuZCBYVGVzdFByZXNzS2V5IGZ1bmN0aW9ucworICovCisjZGVmaW5lIFhUZXN0UFJFU1MgICAgICAgICAgICAgICAgICAgICAgMSA8PCAwCisjZGVmaW5lIFhUZXN0UkVMRUFTRSAgICAgICAgICAgICAgICAgICAgMSA8PCAxCisjZGVmaW5lIFhUZXN0U1RST0tFICAgICAgICAgICAgICAgICAgICAgMSA8PCAyCisKKy8qCisgKiBXaGVuIGRvaW5nIGEga2V5IG9yIGJ1dHRvbiBzdHJva2UsIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCisgKiB0byBkZWxheSBiZXR3ZWVuIHRoZSBwcmVzcyBhbmQgdGhlIHJlbGVhc2Ugb2YgYSBrZXkgb3IgYnV0dG9uCisgKiBpbiB0aGUgWFRlc3RQcmVzc0J1dHRvbiBhbmQgWFRlc3RQcmVzc0tleSBmdW5jdGlvbnMuCisgKi8KKworI2RlZmluZSBYVGVzdFNUUk9LRV9ERUxBWV9USU1FCQkxMAorCisvKgorICogdXNlZCBpbiB0aGUgWFRlc3RHZXRJbnB1dCBmdW5jdGlvbgorICovCisjZGVmaW5lIFhUZXN0RVhDTFVTSVZFICAgICAgICAgICAgICAgICAgMSA8PCAwCisjZGVmaW5lIFhUZXN0UEFDS0VEX0FDVElPTlMgICAgICAgICAgICAgMSA8PCAxCisjZGVmaW5lIFhUZXN0UEFDS0VEX01PVElPTiAgICAgICAgICAgICAgMSA8PCAyCisKKy8qCisgKiB1c2VkIGluIHRoZSBYVGVzdEZha2VJbnB1dCBmdW5jdGlvbgorICovCisjZGVmaW5lIFhUZXN0RkFLRV9BQ0tfTk9UX05FRURFRCAgICAgICAgMAorI2RlZmluZSBYVGVzdEZBS0VfQUNLX1JFUVVFU1QgICAgICAgICAgIDEKKworLyoKKyAqIHVzZWQgaW4gdGhlIFhUZXN0IGV4dGVuc2lvbiBpbml0aWFsaXphdGlvbiByb3V0aW5lCisgKi8KKyNkZWZpbmUgWFRlc3RFWFRFTlNJT05fTkFNRSAgICAgICAgICAgICAiWFRlc3RFeHRlbnNpb24xIgorI2RlZmluZSBYVGVzdEVWRU5UX0NPVU5UICAgICAgICAgICAgICAgIDIKKworLyoKKyAqIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gZm9yIHRoZSBmb3JtYXQgb2YgdGhlIGhlYWRlciBieXRlCisgKiBpbiB0aGUgaW5wdXQgYWN0aW9uIHN0cnVjdHVyZXMuCisgKi8KKyNkZWZpbmUgWFRlc3RBQ1RJT05fVFlQRV9NQVNLICAgMHgwMyAgICAvKiBiaXRzIDAgYW5kIDEgICAgICAgICAgKi8KKyNkZWZpbmUgWFRlc3RLRVlfU1RBVEVfTUFTSyAgICAgMHgwNCAgICAvKiBiaXQgMiAoa2V5IGFjdGlvbikgICAgKi8KKyNkZWZpbmUgWFRlc3RYX1NJR05fQklUX01BU0sgICAgMHgwNCAgICAvKiBiaXQgMiAobW90aW9uIGFjdGlvbikgKi8KKyNkZWZpbmUgWFRlc3RZX1NJR05fQklUX01BU0sgICAgMHgwOCAgICAvKiBiaXQgMyAobW90aW9uIGFjdGlvbikgKi8KKyNkZWZpbmUgWFRlc3RERVZJQ0VfSURfTUFTSyAgICAgMHhmMCAgICAvKiBiaXRzIDQgdGhyb3VnaCA3ICAgICAgKi8KKworI2RlZmluZSBYVGVzdE1BWF9ERVZJQ0VfSUQJMHgwZgorI2RlZmluZSBYVGVzdFBhY2tEZXZpY2VJRCh4KQkoKCh4KSAmIFhUZXN0TUFYX0RFVklDRV9JRCkgPDwgNCkKKyNkZWZpbmUgWFRlc3RVbnBhY2tEZXZpY2VJRCh4KQkoKCh4KSAmIFhUZXN0REVWSUNFX0lEX01BU0spID4+IDQpCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHBvc3NpYmxlIGFjdGlvbiB0eXBlcy4KKyAqLworI2RlZmluZSBYVGVzdERFTEFZX0FDVElPTiAgICAgICAwCisjZGVmaW5lIFhUZXN0S0VZX0FDVElPTiAgICAgICAgIDEKKyNkZWZpbmUgWFRlc3RNT1RJT05fQUNUSU9OICAgICAgMgorI2RlZmluZSBYVGVzdEpVTVBfQUNUSU9OICAgICAgICAzCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRlZmluaXRpb25zIGZvciBrZXkvYnV0dG9uIG1vdGlvbiBpbnB1dCBhY3Rpb25zLgorICovCisjZGVmaW5lIFhUZXN0S0VZX1VQICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgWFRlc3RLRVlfRE9XTiAgICAgICAgICAgMHgwMAorCisvKgorICogVGhlc2UgYXJlIHRoZSBkZWZpbml0aW9ucyBmb3IgcG9pbnRlciByZWxhdGl2ZSBtb3Rpb24gaW5wdXQKKyAqIGFjdGlvbnMuCisgKgorICogVGhlIHNpZ24gYml0cyBmb3IgdGhlIHggYW5kIHkgcmVsYXRpdmUgbW90aW9ucyBhcmUgY29udGFpbmVkCisgKiBpbiB0aGUgaGVhZGVyIGJ5dGUuICBUaGUgeCBhbmQgeSByZWxhdGl2ZSBtb3Rpb25zIGFyZSBwYWNrZWQKKyAqIGludG8gb25lIGJ5dGUgdG8gbWFrZSB0aGluZ3MgZml0IGluIDMyIGJpdHMuICBJZiB0aGUgcmVsYXRpdmUKKyAqIG1vdGlvbiByYW5nZSBpcyBsYXJnZXIgdGhhbiArLy0xNSwgdXNlIHRoZSBwb2ludGVyIGp1bXAgYWN0aW9uLgorICovCisjZGVmaW5lIFhUZXN0TU9USU9OX01BWCAgICAgICAgICAgIDE1CisjZGVmaW5lIFhUZXN0TU9USU9OX01JTiAgICAgICAgICAgIC0xNQorCisjZGVmaW5lIFhUZXN0WF9ORUdBVElWRSAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgWFRlc3RZX05FR0FUSVZFICAgICAgICAgICAgMHgwOAorCisjZGVmaW5lIFhUZXN0WF9NT1RJT05fTUFTSyAgICAgICAgIDB4MGYKKyNkZWZpbmUgWFRlc3RZX01PVElPTl9NQVNLICAgICAgICAgMHhmMAorCisjZGVmaW5lIFhUZXN0UGFja1hNb3Rpb25WYWx1ZSh4KSAgICgoeCkgJiBYVGVzdFhfTU9USU9OX01BU0spCisjZGVmaW5lIFhUZXN0UGFja1lNb3Rpb25WYWx1ZSh4KSAgICgoKHgpIDw8IDQpICYgWFRlc3RZX01PVElPTl9NQVNLKQorCisjZGVmaW5lIFhUZXN0VW5wYWNrWE1vdGlvblZhbHVlKHgpICgoeCkgJiBYVGVzdFhfTU9USU9OX01BU0spCisjZGVmaW5lIFhUZXN0VW5wYWNrWU1vdGlvblZhbHVlKHgpICgoKHgpICYgWFRlc3RZX01PVElPTl9NQVNLKSA+PiA0KQorLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGVmaW5pdGlvbnMgZm9yIGEgbG9uZyBkZWxheSBpbnB1dCBhY3Rpb24uICBJdCBpcworICogdXNlZCB3aGVuIG1vcmUgdGhhbiBYVGVzdFNIT1JUX0RFTEFZX1RJTUUgbWlsbGlzZWNvbmRzIG9mIGRlbGF5CisgKiAoYXBwcm94aW1hdGVseSBvbmUgbWludXRlKSBpcyBuZWVkZWQuCisgKgorICogVGhlIGRldmljZSBJRCBmb3IgYSBkZWxheSBpcyBhbHdheXMgc2V0IHRvIFhUZXN0REVMQVlfREVWSUNFX0lELgorICogVGhpcyBndWFyYW50ZWVzIHRoYXQgYSBoZWFkZXIgYnl0ZSB3aXRoIGEgdmFsdWUgb2YgMCBpcyBub3QKKyAqIGEgdmFsaWQgaGVhZGVyLCBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhIGZsYWcgdG8gaW5kaWNhdGUgdGhhdAorICogdGhlcmUgYXJlIG5vIG1vcmUgaW5wdXQgYWN0aW9ucyBpbiBhbiBYVGVzdElucHV0QWN0aW9uIGV2ZW50LgorICovCisKKyNkZWZpbmUgWFRlc3RTSE9SVF9ERUxBWV9USU1FCTB4ZmZmZgorI2RlZmluZSBYVGVzdERFTEFZX0RFVklDRV9JRCAgICAweDBmCisKKyNlbmRpZiAvKiBfWFRFU1RFWFQxQ09OU1RfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94dGVzdGV4dDFwcm90by5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94dGVzdGV4dDFwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YmRlZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3h0ZXN0ZXh0MXByb3RvLmgKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiB4dGVzdGV4dDEuaAorICoKKyAqIFgxMSBJbnB1dCBTeW50aGVzaXMgRXh0ZW5zaW9uIGluY2x1ZGUgZmlsZQorICovCisKKy8qCitDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OCBieSBIZXdsZXR0LVBhY2thcmQgQ29ycG9yYXRpb24KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAorZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0Citub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEhld2xldHQtUGFja2FyZCBub3QgYmUgdXNlZCBpbgorYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitIZXdsZXR0LVBhY2thcmQgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQorc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAorImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworVGhpcyBzb2Z0d2FyZSBpcyBub3Qgc3ViamVjdCB0byBhbnkgbGljZW5zZSBvZiB0aGUgQW1lcmljYW4KK1RlbGVwaG9uZSBhbmQgVGVsZWdyYXBoIENvbXBhbnkgb3Igb2YgdGhlIFJlZ2VudHMgb2YgdGhlCitVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisKKyovCisKKyNpZm5kZWYgX1hURVNURVhUMVBST1RPX0gKKyNkZWZpbmUgX1hURVNURVhUMVBST1RPX0ggMQorCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMveHRlc3RleHQxY29uc3QuaD4KKworLyoKKyAqIHRoZSB0eXBlZGVmcyBmb3IgQ0FSRDgsIENBUkQxNiwgYW5kIENBUkQzMiBhcmUgZGVmaW5lZCBpbiBYbWQuaAorICovCisKKy8qCisgKiBYVGVzdCByZXF1ZXN0IHR5cGUgdmFsdWVzCisgKgorICogdXNlZCBpbiB0aGUgWFRlc3QgZXh0ZW5zaW9uIHByb3RvY29sIHJlcXVlc3RzCisgKi8KKyNkZWZpbmUgWF9UZXN0RmFrZUlucHV0ICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBYX1Rlc3RHZXRJbnB1dCAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhfVGVzdFN0b3BJbnB1dCAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWF9UZXN0UmVzZXQgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBYX1Rlc3RRdWVyeUlucHV0U2l6ZSAgICAgICAgICAgICA1CisKKy8qCisgKiBUaGlzIGRlZmluZXMgdGhlIG1heGltdW0gc2l6ZSBvZiBhIGxpc3Qgb2YgaW5wdXQgYWN0aW9ucworICogdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLiAgSXQgc2hvdWxkIGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mCisgKiA0IHNvIHRoYXQgdGhlIGVudGlyZSB4VGVzdEZha2VJbnB1dFJlcSBzdHJ1Y3R1cmUgc2l6ZSBpcyBhCisgKiBtdWx0aXBsZSBvZiA0LgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgQ0FSRDggICByZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhUZXN0UmVxQ29kZSAgICAgICAgICAgICAqLworICAgICAgICBDQVJEOCAgIFhUZXN0UmVxVHlwZTsgICAvKiBhbHdheXMgWF9UZXN0RmFrZUlucHV0ICAgICAgICAgICAqLworICAgICAgICBDQVJEMTYgIGxlbmd0aCBCMTY7ICAgICAvKiAyICsgWFRlc3RNQVhfQUNUSU9OX0xJU1RfU0laRS80ICovCisgICAgICAgIENBUkQzMiAgYWNrIEIzMjsKKyAgICAgICAgQ0FSRDggICBhY3Rpb25fbGlzdFtYVGVzdE1BWF9BQ1RJT05fTElTVF9TSVpFXTsKK30geFRlc3RGYWtlSW5wdXRSZXE7CisjZGVmaW5lIHN6X3hUZXN0RmFrZUlucHV0UmVxIChYVGVzdE1BWF9BQ1RJT05fTElTVF9TSVpFICsgOCkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBDQVJEOCAgIHJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWFRlc3RSZXFDb2RlICAqLworICAgICAgICBDQVJEOCAgIFhUZXN0UmVxVHlwZTsgICAvKiBhbHdheXMgWF9UZXN0R2V0SW5wdXQgKi8KKyAgICAgICAgQ0FSRDE2ICBsZW5ndGggQjE2OyAgICAgLyogMiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgQ0FSRDMyICBtb2RlIEIzMjsKK30geFRlc3RHZXRJbnB1dFJlcTsKKyNkZWZpbmUgc3pfeFRlc3RHZXRJbnB1dFJlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgQ0FSRDggICByZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhUZXN0UmVxQ29kZSAgICovCisgICAgICAgIENBUkQ4ICAgWFRlc3RSZXFUeXBlOyAgIC8qIGFsd2F5cyBYX1Rlc3RTdG9wSW5wdXQgKi8KKyAgICAgICAgQ0FSRDE2ICBsZW5ndGggQjMyOyAgICAgLyogMSAgICAgICAgICAgICAgICAgICAgICovCit9IHhUZXN0U3RvcElucHV0UmVxOworI2RlZmluZSBzel94VGVzdFN0b3BJbnB1dFJlcSA0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgQ0FSRDggICByZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhUZXN0UmVxQ29kZSAqLworICAgICAgICBDQVJEOCAgIFhUZXN0UmVxVHlwZTsgICAvKiBhbHdheXMgWF9UZXN0UmVzZXQgICAqLworICAgICAgICBDQVJEMTYgIGxlbmd0aCBCMTY7ICAgICAvKiAxICAgICAgICAgICAgICAgICAgICovCit9IHhUZXN0UmVzZXRSZXE7CisjZGVmaW5lIHN6X3hUZXN0UmVzZXRSZXEgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgcmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYVGVzdFJlcUNvZGUgICAgICAgICovCisgICAgICAgIENBUkQ4ICAgWFRlc3RSZXFUeXBlOyAgIC8qIGFsd2F5cyBYX1Rlc3RRdWVyeUlucHV0U2l6ZSAqLworICAgICAgICBDQVJEMTYgIGxlbmd0aCBCMTY7ICAgICAvKiAxICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSB4VGVzdFF1ZXJ5SW5wdXRTaXplUmVxOworI2RlZmluZSBzel94VGVzdFF1ZXJ5SW5wdXRTaXplUmVxIDQKKworLyoKKyAqIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIHJlcGx5IGZvciB0aGUgeFRlc3RRdWVyeUlucHV0U2l6ZQorICogcmVxdWVzdC4gIEl0IHNob3VsZCByZW1haW4gdGhlIHNhbWUgbWluaW11bSBzaXplIGFzIG90aGVyIHJlcGxpZXMKKyAqICgzMiBieXRlcykuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgQ0FSRDggICB0eXBlOyAgICAgICAgICAgLyogYWx3YXlzIFhfUmVwbHkgICovCisgICAgICAgIENBUkQ4ICAgcGFkMTsKKyAgICAgICAgQ0FSRDE2ICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgICAgIENBUkQzMiAgbGVuZ3RoIEIzMjsgICAgIC8qIGFsd2F5cyAwICovCisgICAgICAgIENBUkQzMiAgc2l6ZV9yZXR1cm4gQjMyOworICAgICAgICBDQVJEMzIgIHBhZDIgQjMyOworICAgICAgICBDQVJEMzIgIHBhZDMgQjMyOworICAgICAgICBDQVJEMzIgIHBhZDQgQjMyOworICAgICAgICBDQVJEMzIgIHBhZDUgQjMyOworICAgICAgICBDQVJEMzIgIHBhZDYgQjMyOworfSB4VGVzdFF1ZXJ5SW5wdXRTaXplUmVwbHk7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIGZvciB0aGUgaW5wdXQgYWN0aW9uIHdpcmUgZXZlbnQgc3RydWN0dXJlLgorICogVGhpcyBldmVudCBpcyBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiB0aGUgc2VydmVyIGhhcyBvbmUgb3IKKyAqIG1vcmUgdXNlciBpbnB1dCBhY3Rpb25zIHRvIHJlcG9ydCB0byB0aGUgY2xpZW50LiAgSXQgbXVzdAorICogcmVtYWluIHRoZSBzYW1lIHNpemUgYXMgYWxsIG90aGVyIHdpcmUgZXZlbnRzICgzMiBieXRlcykuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgQ0FSRDggICB0eXBlOyAgICAgICAgICAgLyogYWx3YXlzIFhUZXN0SW5wdXRBY3Rpb25UeXBlICovCisgICAgICAgIENBUkQ4ICAgcGFkMDA7CisgICAgICAgIENBUkQxNiAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgICAgICBDQVJEOCAgIGFjdGlvbnNbWFRlc3RBQ1RJT05TX1NJWkVdOworfSB4VGVzdElucHV0QWN0aW9uRXZlbnQ7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIGZvciB0aGUgeFRlc3RGYWtlQWNrIHdpcmUgZXZlbnQgc3RydWN0dXJlLgorICogVGhpcyBldmVudCBpcyBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiB0aGUgc2VydmVyIGhhcyBjb21wbGV0ZWx5CisgKiBwcm9jZXNzZWQgaXRzIGlucHV0IGFjdGlvbiBidWZmZXIsIGFuZCBpcyByZWFkeSBmb3IgbW9yZS4KKyAqIEl0IG11c3QgcmVtYWluIHRoZSBzYW1lIHNpemUgYXMgYWxsIG90aGVyIHdpcmUgZXZlbnRzICgzMiBieXRlcykuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgQ0FSRDggICB0eXBlOyAgICAgICAgICAgLyogYWx3YXlzIFhUZXN0RmFrZUFja1R5cGUgKi8KKyAgICAgICAgQ0FSRDggICBwYWQwMDsKKyAgICAgICAgQ0FSRDE2ICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgICAgIENBUkQzMiAgcGFkMDIgQjMyOworICAgICAgICBDQVJEMzIgIHBhZDAzIEIzMjsKKyAgICAgICAgQ0FSRDMyICBwYWQwNCBCMzI7CisgICAgICAgIENBUkQzMiAgcGFkMDUgQjMyOworICAgICAgICBDQVJEMzIgIHBhZDA2IEIzMjsKKyAgICAgICAgQ0FSRDMyICBwYWQwNyBCMzI7CisgICAgICAgIENBUkQzMiAgcGFkMDggQjMyOworfSB4VGVzdEZha2VBY2tFdmVudDsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGVmaW5pdGlvbnMgZm9yIGtleS9idXR0b24gbW90aW9uIGlucHV0IGFjdGlvbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgQ0FSRDggICBoZWFkZXI7ICAgICAgICAgLyogd2hpY2ggZGV2aWNlLCBrZXkgdXAvZG93biAqLworICAgICAgICBDQVJEOCAgIGtleWNvZGU7ICAgICAgICAvKiB3aGljaCBrZXkvYnV0dG9uIHRvIG1vdmUgICovCisgICAgICAgIENBUkQxNiAgZGVsYXlfdGltZSBCMTY7IC8qIGhvdyBsb25nIHRvIGRlbGF5IChpbiBtcykgKi8KK30gWFRlc3RLZXlJbmZvOworCisvKgorICogVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBmb3IgcG9pbnRlciBqdW1wIGlucHV0IGFjdGlvbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgQ0FSRDggICBoZWFkZXI7ICAgICAgICAgLyogd2hpY2ggcG9pbnRlciAgICAgICAgICAgICAqLworICAgICAgICBDQVJEOCAgIHBhZDE7ICAgICAgICAgICAvKiB1bnVzZWQgcGFkZGluZyBieXRlICAgICAgICovCisgICAgICAgIENBUkQxNiAganVtcHggQjE2OyAgICAgIC8qIHggY29vcmQgdG8ganVtcCB0byAgICAgICAgKi8KKyAgICAgICAgQ0FSRDE2ICBqdW1weSBCMTY7ICAgICAgLyogeSBjb29yZCB0byBqdW1wIHRvICAgICAgICAqLworICAgICAgICBDQVJEMTYgIGRlbGF5X3RpbWUgQjE2OyAvKiBob3cgbG9uZyB0byBkZWxheSAoaW4gbXMpICovCit9IFhUZXN0SnVtcEluZm87CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRlZmluaXRpb25zIGZvciBwb2ludGVyIHJlbGF0aXZlIG1vdGlvbiBpbnB1dAorICogYWN0aW9ucy4KKyAqCisgKiBUaGUgc2lnbiBiaXRzIGZvciB0aGUgeCBhbmQgeSByZWxhdGl2ZSBtb3Rpb25zIGFyZSBjb250YWluZWQKKyAqIGluIHRoZSBoZWFkZXIgYnl0ZS4gIFRoZSB4IGFuZCB5IHJlbGF0aXZlIG1vdGlvbnMgYXJlIHBhY2tlZAorICogaW50byBvbmUgYnl0ZSB0byBtYWtlIHRoaW5ncyBmaXQgaW4gMzIgYml0cy4gIElmIHRoZSByZWxhdGl2ZQorICogbW90aW9uIHJhbmdlIGlzIGxhcmdlciB0aGFuICsvLTE1LCB1c2UgdGhlIHBvaW50ZXIganVtcCBhY3Rpb24uCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBDQVJEOCAgIGhlYWRlcjsgICAgICAgICAvKiB3aGljaCBwb2ludGVyICAgICAgICAgICAgICovCisgICAgICAgIENBUkQ4ICAgbW90aW9uX2RhdGE7ICAgIC8qIHgseSByZWxhdGl2ZSBtb3Rpb24gICAgICAgKi8KKyAgICAgICAgQ0FSRDE2ICBkZWxheV90aW1lIEIxNjsgLyogaG93IGxvbmcgdG8gZGVsYXkgKGluIG1zKSAqLworfSBYVGVzdE1vdGlvbkluZm87CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRlZmluaXRpb25zIGZvciBhIGxvbmcgZGVsYXkgaW5wdXQgYWN0aW9uLiAgSXQgaXMKKyAqIHVzZWQgd2hlbiBtb3JlIHRoYW4gWFRlc3RTSE9SVF9ERUxBWV9USU1FIG1pbGxpc2Vjb25kcyBvZiBkZWxheQorICogKGFwcHJveGltYXRlbHkgb25lIG1pbnV0ZSkgaXMgbmVlZGVkLgorICoKKyAqIFRoZSBkZXZpY2UgSUQgZm9yIGEgZGVsYXkgaXMgYWx3YXlzIHNldCB0byBYVGVzdERFTEFZX0RFVklDRV9JRC4KKyAqIFRoaXMgZ3VhcmFudGVlcyB0aGF0IGEgaGVhZGVyIGJ5dGUgd2l0aCBhIHZhbHVlIG9mIDAgaXMgbm90CisgKiBhIHZhbGlkIGhlYWRlciwgc28gaXQgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIHRvIGluZGljYXRlIHRoYXQKKyAqIHRoZXJlIGFyZSBubyBtb3JlIGlucHV0IGFjdGlvbnMgaW4gYW4gWFRlc3RJbnB1dEFjdGlvbiBldmVudC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgaGVhZGVyOyAgICAgICAgIC8qIGFsd2F5cyBYVGVzdERFTEFZX0RFVklDRV9JRCAqLworICAgICAgICBDQVJEOCAgIHBhZDE7ICAgICAgICAgICAvKiB1bnVzZWQgcGFkZGluZyBieXRlICAgICAgICAgKi8KKyAgICAgICAgQ0FSRDE2ICBwYWQyIEIxNjsgICAgICAgLyogdW51c2VkIHBhZGRpbmcgd29yZCAgICAgICAgICovCisgICAgICAgIENBUkQzMiAgZGVsYXlfdGltZSBCMzI7IC8qIGhvdyBsb25nIHRvIGRlbGF5IChpbiBtcykgICAqLworfSBYVGVzdERlbGF5SW5mbzsKKworI2VuZGlmIC8qIF9YVEVTVEVYVDFQUk9UT19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3h0ZXN0cHJvdG8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3Rwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOGRiMjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3h0ZXN0cHJvdG8uaApAQCAtMCwwICsxLDEyNCBAQAorLyoKKworQ29weXJpZ2h0IDE5OTIsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyovCisKKyNpZm5kZWYgX1hURVNUUFJPVE9fSF8KKyNkZWZpbmUgX1hURVNUUFJPVE9fSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3h0ZXN0Y29uc3QuaD4KKworI2RlZmluZSBXaW5kb3cgQ0FSRDMyCisjZGVmaW5lIFRpbWUgQ0FSRDMyCisjZGVmaW5lIEN1cnNvciBDQVJEMzIKKworI2RlZmluZSBYX1hUZXN0R2V0VmVyc2lvbgkwCisjZGVmaW5lIFhfWFRlc3RDb21wYXJlQ3Vyc29yCTEKKyNkZWZpbmUgWF9YVGVzdEZha2VJbnB1dAkyCisjZGVmaW5lIFhfWFRlc3RHcmFiQ29udHJvbAkzCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWFRlc3RSZXFDb2RlICovCisgICAgQ0FSRDgJeHRSZXFUeXBlOwkvKiBhbHdheXMgWF9YVGVzdEdldFZlcnNpb24gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAltYWpvclZlcnNpb247CisgICAgQ0FSRDgJcGFkOworICAgIENBUkQxNgltaW5vclZlcnNpb24gQjE2OworfSB4WFRlc3RHZXRWZXJzaW9uUmVxOworI2RlZmluZSBzel94WFRlc3RHZXRWZXJzaW9uUmVxIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJbWFqb3JWZXJzaW9uOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CW1pbm9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CXBhZDAgQjE2OworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7Cit9IHhYVGVzdEdldFZlcnNpb25SZXBseTsKKyNkZWZpbmUgc3pfeFhUZXN0R2V0VmVyc2lvblJlcGx5IDMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWFRlc3RSZXFDb2RlICovCisgICAgQ0FSRDgJeHRSZXFUeXBlOwkvKiBhbHdheXMgWF9YVGVzdENvbXBhcmVDdXJzb3IgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cJd2luZG93IEIzMjsKKyAgICBDdXJzb3IJY3Vyc29yIEIzMjsKK30geFhUZXN0Q29tcGFyZUN1cnNvclJlcTsKKyNkZWZpbmUgc3pfeFhUZXN0Q29tcGFyZUN1cnNvclJlcSAxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBCT09MCXNhbWU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKK30geFhUZXN0Q29tcGFyZUN1cnNvclJlcGx5OworI2RlZmluZSBzel94WFRlc3RDb21wYXJlQ3Vyc29yUmVwbHkgMzIKKworLyogdXNlZCBvbmx5IG9uIHRoZSBjbGllbnQgc2lkZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYVGVzdFJlcUNvZGUgKi8KKyAgICBDQVJEOAl4dFJlcVR5cGU7CS8qIGFsd2F5cyBYX1hUZXN0RmFrZUlucHV0ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQllURQl0eXBlOworICAgIEJZVEUJZGV0YWlsOworICAgIENBUkQxNglwYWQwIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIFdpbmRvdwlyb290IEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIElOVDE2CXJvb3RYIEIxNiwgcm9vdFkgQjE2OworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMTYJcGFkNCBCMTY7CisgICAgQ0FSRDgJcGFkNTsKKyAgICBDQVJEOAlkZXZpY2VpZDsKK30geFhUZXN0RmFrZUlucHV0UmVxOworI2RlZmluZSBzel94WFRlc3RGYWtlSW5wdXRSZXEgMzYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYVGVzdFJlcUNvZGUgKi8KKyAgICBDQVJEOAl4dFJlcVR5cGU7CS8qIGFsd2F5cyBYX1hUZXN0R3JhYkNvbnRyb2wgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBCT09MCWltcGVydmlvdXM7CisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQ4CXBhZDI7Cit9IHhYVGVzdEdyYWJDb250cm9sUmVxOworI2RlZmluZSBzel94WFRlc3RHcmFiQ29udHJvbFJlcSA4CisKKyN1bmRlZiBXaW5kb3cKKyN1bmRlZiBUaW1lCisjdW5kZWYgQ3Vyc29yCisKKyNlbmRpZiAvKiBfWFRFU1RQUk9UT19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEva2V5c3ltLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9rZXlzeW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjU4NDg4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEva2V5c3ltLmgKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg3LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisKK0NvcHlyaWdodCAxOTg3IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAorCitESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRlZmF1bHQga2V5c3ltcyAqLworI2RlZmluZSBYS19NSVNDRUxMQU5ZCisjZGVmaW5lIFhLX1hLQl9LRVlTCisjZGVmaW5lIFhLX0xBVElOMQorI2RlZmluZSBYS19MQVRJTjIKKyNkZWZpbmUgWEtfTEFUSU4zCisjZGVmaW5lIFhLX0xBVElONAorI2RlZmluZSBYS19MQVRJTjgKKyNkZWZpbmUgWEtfTEFUSU45CisjZGVmaW5lIFhLX0NBVUNBU1VTCisjZGVmaW5lIFhLX0dSRUVLCisjZGVmaW5lIFhLX0tBVEFLQU5BCisjZGVmaW5lIFhLX0FSQUJJQworI2RlZmluZSBYS19DWVJJTExJQworI2RlZmluZSBYS19IRUJSRVcKKyNkZWZpbmUgWEtfVEhBSQorI2RlZmluZSBYS19LT1JFQU4KKyNkZWZpbmUgWEtfQVJNRU5JQU4KKyNkZWZpbmUgWEtfR0VPUkdJQU4KKyNkZWZpbmUgWEtfVklFVE5BTUVTRQorI2RlZmluZSBYS19DVVJSRU5DWQorI2RlZmluZSBYS19NQVRIRU1BVElDQUwKKyNkZWZpbmUgWEtfQlJBSUxMRQorI2RlZmluZSBYS19TSU5IQUxBCisKKyNpbmNsdWRlIDxYMTEva2V5c3ltZGVmLmg+CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2tleXN5bWRlZi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEva2V5c3ltZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiNTUzMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2tleXN5bWRlZi5oCkBAIC0wLDAgKzEsMjQ3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgMTk4NywgMTk5NCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gVGhlIE9wZW4gR3JvdXAuCisKKworQ29weXJpZ2h0IDE5ODcgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMKKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisKK0RJR0lUQUwgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCitESUdJVEFMIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAorQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoZSAiWDExIFdpbmRvdyBTeXN0ZW0gUHJvdG9jb2wiIHN0YW5kYXJkIGRlZmluZXMgaW4gQXBwZW5kaXggQSB0aGUKKyAqIGtleXN5bSBjb2Rlcy4gVGhlc2UgMjktYml0IGludGVnZXIgdmFsdWVzIGlkZW50aWZ5IGNoYXJhY3RlcnMgb3IKKyAqIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggZWFjaCBrZXkgKGUuZy4sIHZpYSB0aGUgdmlzaWJsZQorICogZW5ncmF2aW5nKSBvZiBhIGtleWJvYXJkIGxheW91dC4gVGhpcyBmaWxlIGFzc2lnbnMgbW5lbW9uaWMgbWFjcm8KKyAqIG5hbWVzIGZvciB0aGVzZSBrZXlzeW1zLgorICoKKyAqIFRoaXMgZmlsZSBpcyBhbHNvIGNvbXBpbGVkIChieSBzcmMvdXRpbC9tYWtla2V5cy5jIGluIGxpYlgxMSkgaW50bworICogaGFzaCB0YWJsZXMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgd2l0aCBYMTEgbGlicmFyeSBmdW5jdGlvbnMgc3VjaCBhcworICogWFN0cmluZ1RvS2V5c3ltKCkgYW5kIFhLZXlzeW1Ub1N0cmluZygpLgorICoKKyAqIFdoZXJlIGEga2V5c3ltIGNvcnJlc3BvbmRzIG9uZS10by1vbmUgdG8gYW4gSVNPIDEwNjQ2IC8gVW5pY29kZQorICogY2hhcmFjdGVyLCB0aGlzIGlzIG5vdGVkIGluIGEgY29tbWVudCB0aGF0IHByb3ZpZGVzIGJvdGggdGhlIFUreHh4eAorICogVW5pY29kZSBwb3NpdGlvbiwgYXMgd2VsbCBhcyB0aGUgb2ZmaWNpYWwgVW5pY29kZSBuYW1lIG9mIHRoZQorICogY2hhcmFjdGVyLgorICoKKyAqIFdoZXJlIHRoZSBjb3JyZXNwb25kZW5jZSBpcyBlaXRoZXIgbm90IG9uZS10by1vbmUgb3Igc2VtYW50aWNhbGx5CisgKiB1bmNsZWFyLCB0aGUgVW5pY29kZSBwb3NpdGlvbiBhbmQgbmFtZSBhcmUgZW5jbG9zZWQgaW4KKyAqIHBhcmVudGhlc2VzLiBTdWNoIGxlZ2FjeSBrZXlzeW1zIHNob3VsZCBiZSBjb25zaWRlcmVkIGRlcHJlY2F0ZWQKKyAqIGFuZCBhcmUgbm90IHJlY29tbWVuZGVkIGZvciB1c2UgaW4gZnV0dXJlIGtleWJvYXJkIG1hcHBpbmdzLgorICoKKyAqIEZvciBhbnkgZnV0dXJlIGV4dGVuc2lvbiBvZiB0aGUga2V5c3ltcyB3aXRoIGNoYXJhY3RlcnMgYWxyZWFkeQorICogZm91bmQgaW4gSVNPIDEwNjQ2IC8gVW5pY29kZSwgdGhlIGZvbGxvd2luZyBhbGdvcml0aG0gc2hhbGwgYmUKKyAqIHVzZWQuIFRoZSBuZXcga2V5c3ltIGNvZGUgcG9zaXRpb24gd2lsbCBzaW1wbHkgYmUgdGhlIGNoYXJhY3RlcidzCisgKiBVbmljb2RlIG51bWJlciBwbHVzIDB4MDEwMDAwMDAuIFRoZSBrZXlzeW0gdmFsdWVzIGluIHRoZSByYW5nZQorICogMHgwMTAwMDEwMCB0byAweDAxMTBmZmZmIGFyZSByZXNlcnZlZCB0byByZXByZXNlbnQgVW5pY29kZQorICogY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgVSswMTAwIHRvIFUrMTBGRkZGLgorICogCisgKiBXaGlsZSBtb3N0IG5ld2VyIFVuaWNvZGUtYmFzZWQgWDExIGNsaWVudHMgZG8gYWxyZWFkeSBhY2NlcHQKKyAqIFVuaWNvZGUtbWFwcGVkIGtleXN5bXMgaW4gdGhlIHJhbmdlIDB4MDEwMDAxMDAgdG8gMHgwMTEwZmZmZiwgaXQKKyAqIHdpbGwgcmVtYWluIG5lY2Vzc2FyeSBmb3IgY2xpZW50cyAtLSBpbiB0aGUgaW50ZXJlc3Qgb2YKKyAqIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBzZXJ2ZXJzIC0tIHRvIGFsc28gdW5kZXJzdGFuZCB0aGUKKyAqIGV4aXN0aW5nIGxlZ2FjeSBrZXlzeW0gdmFsdWVzIGluIHRoZSByYW5nZSAweDAxMDAgdG8gMHgyMGZmLgorICoKKyAqIFdoZXJlIHNldmVyYWwgbW5lbW9uaWMgbmFtZXMgYXJlIGRlZmluZWQgZm9yIHRoZSBzYW1lIGtleXN5bSBpbiB0aGlzCisgKiBmaWxlLCBhbGwgYnV0IHRoZSBmaXJzdCBvbmUgbGlzdGVkIHNob3VsZCBiZSBjb25zaWRlcmVkIGRlcHJlY2F0ZWQuCisgKgorICogTW5lbW9uaWMgbmFtZXMgZm9yIGtleXN5bXMgYXJlIGRlZmluZWQgaW4gdGhpcyBmaWxlIHdpdGggbGluZXMKKyAqIHRoYXQgbWF0Y2ggb25lIG9mIHRoZXNlIFBlcmwgcmVndWxhciBleHByZXNzaW9uczoKKyAqCisgKiAgICAvXlwjZGVmaW5lIFhLXyhbYS16QS1aXzAtOV0rKVxzKzB4KFswLTlhLWZdKylccypcL1wqIFUrKFswLTlBLUZdezQsNn0pICguKikgXCpcL1xzKiQvCisgKiAgICAvXlwjZGVmaW5lIFhLXyhbYS16QS1aXzAtOV0rKVxzKzB4KFswLTlhLWZdKylccypcL1wqXChVKyhbMC05QS1GXXs0LDZ9KSAoLiopXClcKlwvXHMqJC8KKyAqICAgIC9eXCNkZWZpbmUgWEtfKFthLXpBLVpfMC05XSspXHMrMHgoWzAtOWEtZl0rKVxzKihcL1wqXHMqKC4qKVxzKlwqXC8pP1xzKiQvCisgKgorICogQmVmb3JlIGFkZGluZyBuZXcga2V5c3ltcywgcGxlYXNlIGRvIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmc6IEluCisgKiBhZGRpdGlvbiB0byB0aGUga2V5c3ltIG5hbWVzIGRlZmluZWQgaW4gdGhpcyBmaWxlLCB0aGUKKyAqIFhTdHJpbmdUb0tleXN5bSgpIGFuZCBYS2V5c3ltVG9TdHJpbmcoKSBmdW5jdGlvbnMgd2lsbCBhbHNvIGhhbmRsZQorICogYW55IGtleXN5bSBzdHJpbmcgb2YgdGhlIGZvcm0gIlUwMDIwIiB0byAiVTAwN0UiIGFuZCAiVTAwQTAiIHRvCisgKiAiVTEwRkZGRiIgZm9yIGFsbCBwb3NzaWJsZSBVbmljb2RlIGNoYXJhY3RlcnMuIEluIG90aGVyIHdvcmRzLAorICogZXZlcnkgcG9zc2libGUgVW5pY29kZSBjaGFyYWN0ZXIgaGFzIGFscmVhZHkgYSBrZXlzeW0gc3RyaW5nCisgKiBkZWZpbmVkIGFsZ29yaXRobWljYWxseSwgZXZlbiBpZiBpdCBpcyBub3QgbGlzdGVkIGhlcmUuIFRoZXJlZm9yZSwKKyAqIGRlZmluaW5nIGFuIGFkZGl0aW9uYWwga2V5c3ltIG1hY3JvIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZXJlIGEKKyAqIG5vbi1oZXhhZGVjaW1hbCBtbmVtb25pYyBuYW1lIGlzIG5lZWRlZCwgb3Igd2hlcmUgdGhlIG5ldyBrZXlzeW0KKyAqIGRvZXMgbm90IHJlcHJlc2VudCBhbnkgZXhpc3RpbmcgVW5pY29kZSBjaGFyYWN0ZXIuCisgKgorICogV2hlbiBhZGRpbmcgbmV3IGtleXN5bXMgdG8gdGhpcyBmaWxlLCBkbyBub3QgZm9yZ2V0IHRvIGFsc28gdXBkYXRlIHRoZQorICogZm9sbG93aW5nOgorICoKKyAqICAgLSB0aGUgbWFwcGluZ3MgaW4gc3JjL0tleUJpbmQuYyBpbiB0aGUgcmVwbworICogICAgIGdpdDovL2Fub25naXQuZnJlZWRlc2t0b3Aub3JnL3hvcmcvbGliL2xpYlgxMQorICoKKyAqICAgLSB0aGUgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBpbiBzcGVjcy9YUHJvdG9jb2wvWDExLmtleXN5bXMKKyAqICAgICBpbiB0aGUgcmVwbyBnaXQ6Ly9hbm9uZ2l0LmZyZWVkZXNrdG9wLm9yZy94b3JnL2RvYy94b3JnLWRvY3MKKyAqCisgKi8KKworI2RlZmluZSBYS19Wb2lkU3ltYm9sICAgICAgICAgICAgICAgICAgMHhmZmZmZmYgIC8qIFZvaWQgc3ltYm9sICovCisKKyNpZmRlZiBYS19NSVNDRUxMQU5ZCisvKgorICogVFRZIGZ1bmN0aW9uIGtleXMsIGNsZXZlcmx5IGNob3NlbiB0byBtYXAgdG8gQVNDSUksIGZvciBjb252ZW5pZW5jZSBvZgorICogcHJvZ3JhbW1pbmcsIGJ1dCBjb3VsZCBoYXZlIGJlZW4gYXJiaXRyYXJ5IChhdCB0aGUgY29zdCBvZiBsb29rdXAKKyAqIHRhYmxlcyBpbiBjbGllbnQgY29kZSkuCisgKi8KKworI2RlZmluZSBYS19CYWNrU3BhY2UgICAgICAgICAgICAgICAgICAgICAweGZmMDggIC8qIEJhY2sgc3BhY2UsIGJhY2sgY2hhciAqLworI2RlZmluZSBYS19UYWIgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmMDkKKyNkZWZpbmUgWEtfTGluZWZlZWQgICAgICAgICAgICAgICAgICAgICAgMHhmZjBhICAvKiBMaW5lZmVlZCwgTEYgKi8KKyNkZWZpbmUgWEtfQ2xlYXIgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjBiCisjZGVmaW5lIFhLX1JldHVybiAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYwZCAgLyogUmV0dXJuLCBlbnRlciAqLworI2RlZmluZSBYS19QYXVzZSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmMTMgIC8qIFBhdXNlLCBob2xkICovCisjZGVmaW5lIFhLX1Njcm9sbF9Mb2NrICAgICAgICAgICAgICAgICAgIDB4ZmYxNAorI2RlZmluZSBYS19TeXNfUmVxICAgICAgICAgICAgICAgICAgICAgICAweGZmMTUKKyNkZWZpbmUgWEtfRXNjYXBlICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjFiCisjZGVmaW5lIFhLX0RlbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZiAgLyogRGVsZXRlLCBydWJvdXQgKi8KKworCisKKy8qIEludGVybmF0aW9uYWwgJiBtdWx0aS1rZXkgY2hhcmFjdGVyIGNvbXBvc2l0aW9uICovCisKKyNkZWZpbmUgWEtfTXVsdGlfa2V5ICAgICAgICAgICAgICAgICAgICAgMHhmZjIwICAvKiBNdWx0aS1rZXkgY2hhcmFjdGVyIGNvbXBvc2UgKi8KKyNkZWZpbmUgWEtfQ29kZWlucHV0ICAgICAgICAgICAgICAgICAgICAgMHhmZjM3CisjZGVmaW5lIFhLX1NpbmdsZUNhbmRpZGF0ZSAgICAgICAgICAgICAgIDB4ZmYzYworI2RlZmluZSBYS19NdWx0aXBsZUNhbmRpZGF0ZSAgICAgICAgICAgICAweGZmM2QKKyNkZWZpbmUgWEtfUHJldmlvdXNDYW5kaWRhdGUgICAgICAgICAgICAgMHhmZjNlCisKKy8qIEphcGFuZXNlIGtleWJvYXJkIHN1cHBvcnQgKi8KKworI2RlZmluZSBYS19LYW5qaSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmMjEgIC8qIEthbmppLCBLYW5qaSBjb252ZXJ0ICovCisjZGVmaW5lIFhLX011aGVua2FuICAgICAgICAgICAgICAgICAgICAgIDB4ZmYyMiAgLyogQ2FuY2VsIENvbnZlcnNpb24gKi8KKyNkZWZpbmUgWEtfSGVua2FuX01vZGUgICAgICAgICAgICAgICAgICAgMHhmZjIzICAvKiBTdGFydC9TdG9wIENvbnZlcnNpb24gKi8KKyNkZWZpbmUgWEtfSGVua2FuICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjIzICAvKiBBbGlhcyBmb3IgSGVua2FuX01vZGUgKi8KKyNkZWZpbmUgWEtfUm9tYWppICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjI0ICAvKiB0byBSb21hamkgKi8KKyNkZWZpbmUgWEtfSGlyYWdhbmEgICAgICAgICAgICAgICAgICAgICAgMHhmZjI1ICAvKiB0byBIaXJhZ2FuYSAqLworI2RlZmluZSBYS19LYXRha2FuYSAgICAgICAgICAgICAgICAgICAgICAweGZmMjYgIC8qIHRvIEthdGFrYW5hICovCisjZGVmaW5lIFhLX0hpcmFnYW5hX0thdGFrYW5hICAgICAgICAgICAgIDB4ZmYyNyAgLyogSGlyYWdhbmEvS2F0YWthbmEgdG9nZ2xlICovCisjZGVmaW5lIFhLX1plbmtha3UgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYyOCAgLyogdG8gWmVua2FrdSAqLworI2RlZmluZSBYS19IYW5rYWt1ICAgICAgICAgICAgICAgICAgICAgICAweGZmMjkgIC8qIHRvIEhhbmtha3UgKi8KKyNkZWZpbmUgWEtfWmVua2FrdV9IYW5rYWt1ICAgICAgICAgICAgICAgMHhmZjJhICAvKiBaZW5rYWt1L0hhbmtha3UgdG9nZ2xlICovCisjZGVmaW5lIFhLX1RvdXJva3UgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYyYiAgLyogQWRkIHRvIERpY3Rpb25hcnkgKi8KKyNkZWZpbmUgWEtfTWFzc3lvICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjJjICAvKiBEZWxldGUgZnJvbSBEaWN0aW9uYXJ5ICovCisjZGVmaW5lIFhLX0thbmFfTG9jayAgICAgICAgICAgICAgICAgICAgIDB4ZmYyZCAgLyogS2FuYSBMb2NrICovCisjZGVmaW5lIFhLX0thbmFfU2hpZnQgICAgICAgICAgICAgICAgICAgIDB4ZmYyZSAgLyogS2FuYSBTaGlmdCAqLworI2RlZmluZSBYS19FaXN1X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAweGZmMmYgIC8qIEFscGhhbnVtZXJpYyBTaGlmdCAqLworI2RlZmluZSBYS19FaXN1X3RvZ2dsZSAgICAgICAgICAgICAgICAgICAweGZmMzAgIC8qIEFscGhhbnVtZXJpYyB0b2dnbGUgKi8KKyNkZWZpbmUgWEtfS2FuamlfQmFuZ291ICAgICAgICAgICAgICAgICAgMHhmZjM3ICAvKiBDb2RlaW5wdXQgKi8KKyNkZWZpbmUgWEtfWmVuX0tvaG8gICAgICAgICAgICAgICAgICAgICAgMHhmZjNkICAvKiBNdWx0aXBsZS9BbGwgQ2FuZGlkYXRlKHMpICovCisjZGVmaW5lIFhLX01hZV9Lb2hvICAgICAgICAgICAgICAgICAgICAgIDB4ZmYzZSAgLyogUHJldmlvdXMgQ2FuZGlkYXRlICovCisKKy8qIDB4ZmYzMSB0aHJ1IDB4ZmYzZiBhcmUgdW5kZXIgWEtfS09SRUFOICovCisKKy8qIEN1cnNvciBjb250cm9sICYgbW90aW9uICovCisKKyNkZWZpbmUgWEtfSG9tZSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjUwCisjZGVmaW5lIFhLX0xlZnQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1MSAgLyogTW92ZSBsZWZ0LCBsZWZ0IGFycm93ICovCisjZGVmaW5lIFhLX1VwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1MiAgLyogTW92ZSB1cCwgdXAgYXJyb3cgKi8KKyNkZWZpbmUgWEtfUmlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjUzICAvKiBNb3ZlIHJpZ2h0LCByaWdodCBhcnJvdyAqLworI2RlZmluZSBYS19Eb3duICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNTQgIC8qIE1vdmUgZG93biwgZG93biBhcnJvdyAqLworI2RlZmluZSBYS19QcmlvciAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNTUgIC8qIFByaW9yLCBwcmV2aW91cyAqLworI2RlZmluZSBYS19QYWdlX1VwICAgICAgICAgICAgICAgICAgICAgICAweGZmNTUKKyNkZWZpbmUgWEtfTmV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjU2ICAvKiBOZXh0ICovCisjZGVmaW5lIFhLX1BhZ2VfRG93biAgICAgICAgICAgICAgICAgICAgIDB4ZmY1NgorI2RlZmluZSBYS19FbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNTcgIC8qIEVPTCAqLworI2RlZmluZSBYS19CZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNTggIC8qIEJPTCAqLworCisKKy8qIE1pc2MgZnVuY3Rpb25zICovCisKKyNkZWZpbmUgWEtfU2VsZWN0ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjYwICAvKiBTZWxlY3QsIG1hcmsgKi8KKyNkZWZpbmUgWEtfUHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjYxCisjZGVmaW5lIFhLX0V4ZWN1dGUgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2MiAgLyogRXhlY3V0ZSwgcnVuLCBkbyAqLworI2RlZmluZSBYS19JbnNlcnQgICAgICAgICAgICAgICAgICAgICAgICAweGZmNjMgIC8qIEluc2VydCwgaW5zZXJ0IGhlcmUgKi8KKyNkZWZpbmUgWEtfVW5kbyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjY1CisjZGVmaW5lIFhLX1JlZG8gICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2NiAgLyogUmVkbywgYWdhaW4gKi8KKyNkZWZpbmUgWEtfTWVudSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjY3CisjZGVmaW5lIFhLX0ZpbmQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2OCAgLyogRmluZCwgc2VhcmNoICovCisjZGVmaW5lIFhLX0NhbmNlbCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2OSAgLyogQ2FuY2VsLCBzdG9wLCBhYm9ydCwgZXhpdCAqLworI2RlZmluZSBYS19IZWxwICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNmEgIC8qIEhlbHAgKi8KKyNkZWZpbmUgWEtfQnJlYWsgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjZiCisjZGVmaW5lIFhLX01vZGVfc3dpdGNoICAgICAgICAgICAgICAgICAgIDB4ZmY3ZSAgLyogQ2hhcmFjdGVyIHNldCBzd2l0Y2ggKi8KKyNkZWZpbmUgWEtfc2NyaXB0X3N3aXRjaCAgICAgICAgICAgICAgICAgMHhmZjdlICAvKiBBbGlhcyBmb3IgbW9kZV9zd2l0Y2ggKi8KKyNkZWZpbmUgWEtfTnVtX0xvY2sgICAgICAgICAgICAgICAgICAgICAgMHhmZjdmCisKKy8qIEtleXBhZCBmdW5jdGlvbnMsIGtleXBhZCBudW1iZXJzIGNsZXZlcmx5IGNob3NlbiB0byBtYXAgdG8gQVNDSUkgKi8KKworI2RlZmluZSBYS19LUF9TcGFjZSAgICAgICAgICAgICAgICAgICAgICAweGZmODAgIC8qIFNwYWNlICovCisjZGVmaW5lIFhLX0tQX1RhYiAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY4OQorI2RlZmluZSBYS19LUF9FbnRlciAgICAgICAgICAgICAgICAgICAgICAweGZmOGQgIC8qIEVudGVyICovCisjZGVmaW5lIFhLX0tQX0YxICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5MSAgLyogUEYxLCBLUF9BLCAuLi4gKi8KKyNkZWZpbmUgWEtfS1BfRjIgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjkyCisjZGVmaW5lIFhLX0tQX0YzICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5MworI2RlZmluZSBYS19LUF9GNCAgICAgICAgICAgICAgICAgICAgICAgICAweGZmOTQKKyNkZWZpbmUgWEtfS1BfSG9tZSAgICAgICAgICAgICAgICAgICAgICAgMHhmZjk1CisjZGVmaW5lIFhLX0tQX0xlZnQgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5NgorI2RlZmluZSBYS19LUF9VcCAgICAgICAgICAgICAgICAgICAgICAgICAweGZmOTcKKyNkZWZpbmUgWEtfS1BfUmlnaHQgICAgICAgICAgICAgICAgICAgICAgMHhmZjk4CisjZGVmaW5lIFhLX0tQX0Rvd24gICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5OQorI2RlZmluZSBYS19LUF9QcmlvciAgICAgICAgICAgICAgICAgICAgICAweGZmOWEKKyNkZWZpbmUgWEtfS1BfUGFnZV9VcCAgICAgICAgICAgICAgICAgICAgMHhmZjlhCisjZGVmaW5lIFhLX0tQX05leHQgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5YgorI2RlZmluZSBYS19LUF9QYWdlX0Rvd24gICAgICAgICAgICAgICAgICAweGZmOWIKKyNkZWZpbmUgWEtfS1BfRW5kICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjljCisjZGVmaW5lIFhLX0tQX0JlZ2luICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5ZAorI2RlZmluZSBYS19LUF9JbnNlcnQgICAgICAgICAgICAgICAgICAgICAweGZmOWUKKyNkZWZpbmUgWEtfS1BfRGVsZXRlICAgICAgICAgICAgICAgICAgICAgMHhmZjlmCisjZGVmaW5lIFhLX0tQX0VxdWFsICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiZCAgLyogRXF1YWxzICovCisjZGVmaW5lIFhLX0tQX011bHRpcGx5ICAgICAgICAgICAgICAgICAgIDB4ZmZhYQorI2RlZmluZSBYS19LUF9BZGQgICAgICAgICAgICAgICAgICAgICAgICAweGZmYWIKKyNkZWZpbmUgWEtfS1BfU2VwYXJhdG9yICAgICAgICAgICAgICAgICAgMHhmZmFjICAvKiBTZXBhcmF0b3IsIG9mdGVuIGNvbW1hICovCisjZGVmaW5lIFhLX0tQX1N1YnRyYWN0ICAgICAgICAgICAgICAgICAgIDB4ZmZhZAorI2RlZmluZSBYS19LUF9EZWNpbWFsICAgICAgICAgICAgICAgICAgICAweGZmYWUKKyNkZWZpbmUgWEtfS1BfRGl2aWRlICAgICAgICAgICAgICAgICAgICAgMHhmZmFmCisKKyNkZWZpbmUgWEtfS1BfMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmIwCisjZGVmaW5lIFhLX0tQXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiMQorI2RlZmluZSBYS19LUF8yICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYjIKKyNkZWZpbmUgWEtfS1BfMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmIzCisjZGVmaW5lIFhLX0tQXzQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiNAorI2RlZmluZSBYS19LUF81ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYjUKKyNkZWZpbmUgWEtfS1BfNiAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmI2CisjZGVmaW5lIFhLX0tQXzcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiNworI2RlZmluZSBYS19LUF84ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYjgKKyNkZWZpbmUgWEtfS1BfOSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmI5CisKKworCisvKgorICogQXV4aWxpYXJ5IGZ1bmN0aW9uczsgbm90ZSB0aGUgZHVwbGljYXRlIGRlZmluaXRpb25zIGZvciBsZWZ0IGFuZCByaWdodAorICogZnVuY3Rpb24ga2V5czsgIFN1biBrZXlib2FyZHMgYW5kIGEgZmV3IG90aGVyIG1hbnVmYWN0dXJlcnMgaGF2ZSBzdWNoCisgKiBmdW5jdGlvbiBrZXkgZ3JvdXBzIG9uIHRoZSBsZWZ0IGFuZC9vciByaWdodCBzaWRlcyBvZiB0aGUga2V5Ym9hcmQuCisgKiBXZSd2ZSBub3QgZm91bmQgYSBrZXlib2FyZCB3aXRoIG1vcmUgdGhhbiAzNSBmdW5jdGlvbiBrZXlzIHRvdGFsLgorICovCisKKyNkZWZpbmUgWEtfRjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmJlCisjZGVmaW5lIFhLX0YyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiZgorI2RlZmluZSBYS19GMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzAKKyNkZWZpbmUgWEtfRjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmMxCisjZGVmaW5lIFhLX0Y1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjMgorI2RlZmluZSBYS19GNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzMKKyNkZWZpbmUgWEtfRjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmM0CisjZGVmaW5lIFhLX0Y4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjNQorI2RlZmluZSBYS19GOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzYKKyNkZWZpbmUgWEtfRjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmM3CisjZGVmaW5lIFhLX0YxMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjOAorI2RlZmluZSBYS19MMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzgKKyNkZWZpbmUgWEtfRjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmM5CisjZGVmaW5lIFhLX0wyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjOQorI2RlZmluZSBYS19GMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2EKKyNkZWZpbmUgWEtfTDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmNhCisjZGVmaW5lIFhLX0YxNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjYgorI2RlZmluZSBYS19MNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2IKKyNkZWZpbmUgWEtfRjE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmNjCisjZGVmaW5lIFhLX0w1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjYworI2RlZmluZSBYS19GMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2QKKyNkZWZpbmUgWEtfTDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmNkCisjZGVmaW5lIFhLX0YxNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjZQorI2RlZmluZSBYS19MNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2UKKyNkZWZpbmUgWEtfRjE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmNmCisjZGVmaW5lIFhLX0w4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjZgorI2RlZmluZSBYS19GMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDAKKyNkZWZpbmUgWEtfTDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQwCisjZGVmaW5lIFhLX0YyMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMQorI2RlZmluZSBYS19MMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDEKKyNkZWZpbmUgWEtfRjIxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQyCisjZGVmaW5lIFhLX1IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMgorI2RlZmluZSBYS19GMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDMKKyNkZWZpbmUgWEtfUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQzCisjZGVmaW5lIFhLX0YyMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNAorI2RlZmluZSBYS19SMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDQKKyNkZWZpbmUgWEtfRjI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQ1CisjZGVmaW5lIFhLX1I0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNQorI2RlZmluZSBYS19GMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDYKKyNkZWZpbmUgWEtfUjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQ2CisjZGVmaW5lIFhLX0YyNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNworI2RlZmluZSBYS19SNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDcKKyNkZWZpbmUgWEtfRjI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQ4CisjZGVmaW5lIFhLX1I3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkOAorI2RlZmluZSBYS19GMjggICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDkKKyNkZWZpbmUgWEtfUjggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQ5CisjZGVmaW5lIFhLX0YyOSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkYQorI2RlZmluZSBYS19SOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGEKKyNkZWZpbmUgWEtfRjMwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmRiCisjZGVmaW5lIFhLX1IxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkYgorI2RlZmluZSBYS19GMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGMKKyNkZWZpbmUgWEtfUjExICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmRjCisjZGVmaW5lIFhLX0YzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkZAorI2RlZmluZSBYS19SMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGQKKyNkZWZpbmUgWEtfRjMzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmRlCisjZGVmaW5lIFhLX1IxMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkZQorI2RlZmluZSBYS19GMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGYKKyNkZWZpbmUgWEtfUjE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmRmCisjZGVmaW5lIFhLX0YzNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlMAorI2RlZmluZSBYS19SMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZTAKKworLyogTW9kaWZpZXJzICovCisKKyNkZWZpbmUgWEtfU2hpZnRfTCAgICAgICAgICAgICAgICAgICAgICAgMHhmZmUxICAvKiBMZWZ0IHNoaWZ0ICovCisjZGVmaW5lIFhLX1NoaWZ0X1IgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlMiAgLyogUmlnaHQgc2hpZnQgKi8KKyNkZWZpbmUgWEtfQ29udHJvbF9MICAgICAgICAgICAgICAgICAgICAgMHhmZmUzICAvKiBMZWZ0IGNvbnRyb2wgKi8KKyNkZWZpbmUgWEtfQ29udHJvbF9SICAgICAgICAgICAgICAgICAgICAgMHhmZmU0ICAvKiBSaWdodCBjb250cm9sICovCisjZGVmaW5lIFhLX0NhcHNfTG9jayAgICAgICAgICAgICAgICAgICAgIDB4ZmZlNSAgLyogQ2FwcyBsb2NrICovCisjZGVmaW5lIFhLX1NoaWZ0X0xvY2sgICAgICAgICAgICAgICAgICAgIDB4ZmZlNiAgLyogU2hpZnQgbG9jayAqLworCisjZGVmaW5lIFhLX01ldGFfTCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlNyAgLyogTGVmdCBtZXRhICovCisjZGVmaW5lIFhLX01ldGFfUiAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlOCAgLyogUmlnaHQgbWV0YSAqLworI2RlZmluZSBYS19BbHRfTCAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZTkgIC8qIExlZnQgYWx0ICovCisjZGVmaW5lIFhLX0FsdF9SICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlYSAgLyogUmlnaHQgYWx0ICovCisjZGVmaW5lIFhLX1N1cGVyX0wgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlYiAgLyogTGVmdCBzdXBlciAqLworI2RlZmluZSBYS19TdXBlcl9SICAgICAgICAgICAgICAgICAgICAgICAweGZmZWMgIC8qIFJpZ2h0IHN1cGVyICovCisjZGVmaW5lIFhLX0h5cGVyX0wgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlZCAgLyogTGVmdCBoeXBlciAqLworI2RlZmluZSBYS19IeXBlcl9SICAgICAgICAgICAgICAgICAgICAgICAweGZmZWUgIC8qIFJpZ2h0IGh5cGVyICovCisjZW5kaWYgLyogWEtfTUlTQ0VMTEFOWSAqLworCisvKgorICogS2V5Ym9hcmQgKFhLQikgRXh0ZW5zaW9uIGZ1bmN0aW9uIGFuZCBtb2RpZmllciBrZXlzCisgKiAoZnJvbSBBcHBlbmRpeCBDIG9mICJUaGUgWCBLZXlib2FyZCBFeHRlbnNpb246IFByb3RvY29sIFNwZWNpZmljYXRpb24iKQorICogQnl0ZSAzID0gMHhmZQorICovCisKKyNpZmRlZiBYS19YS0JfS0VZUworI2RlZmluZSBYS19JU09fTG9jayAgICAgICAgICAgICAgICAgICAgICAweGZlMDEKKyNkZWZpbmUgWEtfSVNPX0xldmVsMl9MYXRjaCAgICAgICAgICAgICAgMHhmZTAyCisjZGVmaW5lIFhLX0lTT19MZXZlbDNfU2hpZnQgICAgICAgICAgICAgIDB4ZmUwMworI2RlZmluZSBYS19JU09fTGV2ZWwzX0xhdGNoICAgICAgICAgICAgICAweGZlMDQKKyNkZWZpbmUgWEtfSVNPX0xldmVsM19Mb2NrICAgICAgICAgICAgICAgMHhmZTA1CisjZGVmaW5lIFhLX0lTT19MZXZlbDVfU2hpZnQgICAgICAgICAgICAgIDB4ZmUxMQorI2RlZmluZSBYS19JU09fTGV2ZWw1X0xhdGNoICAgICAgICAgICAgICAweGZlMTIKKyNkZWZpbmUgWEtfSVNPX0xldmVsNV9Mb2NrICAgICAgICAgICAgICAgMHhmZTEzCisjZGVmaW5lIFhLX0lTT19Hcm91cF9TaGlmdCAgICAgICAgICAgICAgIDB4ZmY3ZSAgLyogQWxpYXMgZm9yIG1vZGVfc3dpdGNoICovCisjZGVmaW5lIFhLX0lTT19Hcm91cF9MYXRjaCAgICAgICAgICAgICAgIDB4ZmUwNgorI2RlZmluZSBYS19JU09fR3JvdXBfTG9jayAgICAgICAgICAgICAgICAweGZlMDcKKyNkZWZpbmUgWEtfSVNPX05leHRfR3JvdXAgICAgICAgICAgICAgICAgMHhmZTA4CisjZGVmaW5lIFhLX0lTT19OZXh0X0dyb3VwX0xvY2sgICAgICAgICAgIDB4ZmUwOQorI2RlZmluZSBYS19JU09fUHJldl9Hcm91cCAgICAgICAgICAgICAgICAweGZlMGEKKyNkZWZpbmUgWEtfSVNPX1ByZXZfR3JvdXBfTG9jayAgICAgICAgICAgMHhmZTBiCisjZGVmaW5lIFhLX0lTT19GaXJzdF9Hcm91cCAgICAgICAgICAgICAgIDB4ZmUwYworI2RlZmluZSBYS19JU09fRmlyc3RfR3JvdXBfTG9jayAgICAgICAgICAweGZlMGQKKyNkZWZpbmUgWEtfSVNPX0xhc3RfR3JvdXAgICAgICAgICAgICAgICAgMHhmZTBlCisjZGVmaW5lIFhLX0lTT19MYXN0X0dyb3VwX0xvY2sgICAgICAgICAgIDB4ZmUwZgorCisjZGVmaW5lIFhLX0lTT19MZWZ0X1RhYiAgICAgICAgICAgICAgICAgIDB4ZmUyMAorI2RlZmluZSBYS19JU09fTW92ZV9MaW5lX1VwICAgICAgICAgICAgICAweGZlMjEKKyNkZWZpbmUgWEtfSVNPX01vdmVfTGluZV9Eb3duICAgICAgICAgICAgMHhmZTIyCisjZGVmaW5lIFhLX0lTT19QYXJ0aWFsX0xpbmVfVXAgICAgICAgICAgIDB4ZmUyMworI2RlZmluZSBYS19JU09fUGFydGlhbF9MaW5lX0Rvd24gICAgICAgICAweGZlMjQKKyNkZWZpbmUgWEtfSVNPX1BhcnRpYWxfU3BhY2VfTGVmdCAgICAgICAgMHhmZTI1CisjZGVmaW5lIFhLX0lTT19QYXJ0aWFsX1NwYWNlX1JpZ2h0ICAgICAgIDB4ZmUyNgorI2RlZmluZSBYS19JU09fU2V0X01hcmdpbl9MZWZ0ICAgICAgICAgICAweGZlMjcKKyNkZWZpbmUgWEtfSVNPX1NldF9NYXJnaW5fUmlnaHQgICAgICAgICAgMHhmZTI4CisjZGVmaW5lIFhLX0lTT19SZWxlYXNlX01hcmdpbl9MZWZ0ICAgICAgIDB4ZmUyOQorI2RlZmluZSBYS19JU09fUmVsZWFzZV9NYXJnaW5fUmlnaHQgICAgICAweGZlMmEKKyNkZWZpbmUgWEtfSVNPX1JlbGVhc2VfQm90aF9NYXJnaW5zICAgICAgMHhmZTJiCisjZGVmaW5lIFhLX0lTT19GYXN0X0N1cnNvcl9MZWZ0ICAgICAgICAgIDB4ZmUyYworI2RlZmluZSBYS19JU09fRmFzdF9DdXJzb3JfUmlnaHQgICAgICAgICAweGZlMmQKKyNkZWZpbmUgWEtfSVNPX0Zhc3RfQ3Vyc29yX1VwICAgICAgICAgICAgMHhmZTJlCisjZGVmaW5lIFhLX0lTT19GYXN0X0N1cnNvcl9Eb3duICAgICAgICAgIDB4ZmUyZgorI2RlZmluZSBYS19JU09fQ29udGludW91c19VbmRlcmxpbmUgICAgICAweGZlMzAKKyNkZWZpbmUgWEtfSVNPX0Rpc2NvbnRpbnVvdXNfVW5kZXJsaW5lICAgMHhmZTMxCisjZGVmaW5lIFhLX0lTT19FbXBoYXNpemUgICAgICAgICAgICAgICAgIDB4ZmUzMgorI2RlZmluZSBYS19JU09fQ2VudGVyX09iamVjdCAgICAgICAgICAgICAweGZlMzMKKyNkZWZpbmUgWEtfSVNPX0VudGVyICAgICAgICAgICAgICAgICAgICAgMHhmZTM0CisKKyNkZWZpbmUgWEtfZGVhZF9ncmF2ZSAgICAgICAgICAgICAgICAgICAgMHhmZTUwCisjZGVmaW5lIFhLX2RlYWRfYWN1dGUgICAgICAgICAgICAgICAgICAgIDB4ZmU1MQorI2RlZmluZSBYS19kZWFkX2NpcmN1bWZsZXggICAgICAgICAgICAgICAweGZlNTIKKyNkZWZpbmUgWEtfZGVhZF90aWxkZSAgICAgICAgICAgICAgICAgICAgMHhmZTUzCisjZGVmaW5lIFhLX2RlYWRfcGVyaXNwb21lbmkgICAgICAgICAgICAgIDB4ZmU1MyAgLyogYWxpYXMgZm9yIGRlYWRfdGlsZGUgKi8KKyNkZWZpbmUgWEtfZGVhZF9tYWNyb24gICAgICAgICAgICAgICAgICAgMHhmZTU0CisjZGVmaW5lIFhLX2RlYWRfYnJldmUgICAgICAgICAgICAgICAgICAgIDB4ZmU1NQorI2RlZmluZSBYS19kZWFkX2Fib3ZlZG90ICAgICAgICAgICAgICAgICAweGZlNTYKKyNkZWZpbmUgWEtfZGVhZF9kaWFlcmVzaXMgICAgICAgICAgICAgICAgMHhmZTU3CisjZGVmaW5lIFhLX2RlYWRfYWJvdmVyaW5nICAgICAgICAgICAgICAgIDB4ZmU1OAorI2RlZmluZSBYS19kZWFkX2RvdWJsZWFjdXRlICAgICAgICAgICAgICAweGZlNTkKKyNkZWZpbmUgWEtfZGVhZF9jYXJvbiAgICAgICAgICAgICAgICAgICAgMHhmZTVhCisjZGVmaW5lIFhLX2RlYWRfY2VkaWxsYSAgICAgICAgICAgICAgICAgIDB4ZmU1YgorI2RlZmluZSBYS19kZWFkX29nb25layAgICAgICAgICAgICAgICAgICAweGZlNWMKKyNkZWZpbmUgWEtfZGVhZF9pb3RhICAgICAgICAgICAgICAgICAgICAgMHhmZTVkCisjZGVmaW5lIFhLX2RlYWRfdm9pY2VkX3NvdW5kICAgICAgICAgICAgIDB4ZmU1ZQorI2RlZmluZSBYS19kZWFkX3NlbWl2b2ljZWRfc291bmQgICAgICAgICAweGZlNWYKKyNkZWZpbmUgWEtfZGVhZF9iZWxvd2RvdCAgICAgICAgICAgICAgICAgMHhmZTYwCisjZGVmaW5lIFhLX2RlYWRfaG9vayAgICAgICAgICAgICAgICAgICAgIDB4ZmU2MQorI2RlZmluZSBYS19kZWFkX2hvcm4gICAgICAgICAgICAgICAgICAgICAweGZlNjIKKyNkZWZpbmUgWEtfZGVhZF9zdHJva2UgICAgICAgICAgICAgICAgICAgMHhmZTYzCisjZGVmaW5lIFhLX2RlYWRfYWJvdmVjb21tYSAgICAgICAgICAgICAgIDB4ZmU2NAorI2RlZmluZSBYS19kZWFkX3BzaWxpICAgICAgICAgICAgICAgICAgICAweGZlNjQgIC8qIGFsaWFzIGZvciBkZWFkX2Fib3ZlY29tbWEgKi8KKyNkZWZpbmUgWEtfZGVhZF9hYm92ZXJldmVyc2VkY29tbWEgICAgICAgMHhmZTY1CisjZGVmaW5lIFhLX2RlYWRfZGFzaWEgICAgICAgICAgICAgICAgICAgIDB4ZmU2NSAgLyogYWxpYXMgZm9yIGRlYWRfYWJvdmVyZXZlcnNlZGNvbW1hICovCisjZGVmaW5lIFhLX2RlYWRfZG91YmxlZ3JhdmUgICAgICAgICAgICAgIDB4ZmU2NgorI2RlZmluZSBYS19kZWFkX2JlbG93cmluZyAgICAgICAgICAgICAgICAweGZlNjcKKyNkZWZpbmUgWEtfZGVhZF9iZWxvd21hY3JvbiAgICAgICAgICAgICAgMHhmZTY4CisjZGVmaW5lIFhLX2RlYWRfYmVsb3djaXJjdW1mbGV4ICAgICAgICAgIDB4ZmU2OQorI2RlZmluZSBYS19kZWFkX2JlbG93dGlsZGUgICAgICAgICAgICAgICAweGZlNmEKKyNkZWZpbmUgWEtfZGVhZF9iZWxvd2JyZXZlICAgICAgICAgICAgICAgMHhmZTZiCisjZGVmaW5lIFhLX2RlYWRfYmVsb3dkaWFlcmVzaXMgICAgICAgICAgIDB4ZmU2YworI2RlZmluZSBYS19kZWFkX2ludmVydGVkYnJldmUgICAgICAgICAgICAweGZlNmQKKyNkZWZpbmUgWEtfZGVhZF9iZWxvd2NvbW1hICAgICAgICAgICAgICAgMHhmZTZlCisjZGVmaW5lIFhLX2RlYWRfY3VycmVuY3kgICAgICAgICAgICAgICAgIDB4ZmU2ZgorCisvKiBkZWFkIHZvd2VscyBmb3IgdW5pdmVyc2FsIHN5bGxhYmxlIGVudHJ5ICovCisjZGVmaW5lIFhLX2RlYWRfYSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmU4MAorI2RlZmluZSBYS19kZWFkX0EgICAgICAgICAgICAgICAgICAgICAgICAweGZlODEKKyNkZWZpbmUgWEtfZGVhZF9lICAgICAgICAgICAgICAgICAgICAgICAgMHhmZTgyCisjZGVmaW5lIFhLX2RlYWRfRSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmU4MworI2RlZmluZSBYS19kZWFkX2kgICAgICAgICAgICAgICAgICAgICAgICAweGZlODQKKyNkZWZpbmUgWEtfZGVhZF9JICAgICAgICAgICAgICAgICAgICAgICAgMHhmZTg1CisjZGVmaW5lIFhLX2RlYWRfbyAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmU4NgorI2RlZmluZSBYS19kZWFkX08gICAgICAgICAgICAgICAgICAgICAgICAweGZlODcKKyNkZWZpbmUgWEtfZGVhZF91ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZTg4CisjZGVmaW5lIFhLX2RlYWRfVSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmU4OQorI2RlZmluZSBYS19kZWFkX3NtYWxsX3NjaHdhICAgICAgICAgICAgICAweGZlOGEKKyNkZWZpbmUgWEtfZGVhZF9jYXBpdGFsX3NjaHdhICAgICAgICAgICAgMHhmZThiCisKKyNkZWZpbmUgWEtfRmlyc3RfVmlydHVhbF9TY3JlZW4gICAgICAgICAgMHhmZWQwCisjZGVmaW5lIFhLX1ByZXZfVmlydHVhbF9TY3JlZW4gICAgICAgICAgIDB4ZmVkMQorI2RlZmluZSBYS19OZXh0X1ZpcnR1YWxfU2NyZWVuICAgICAgICAgICAweGZlZDIKKyNkZWZpbmUgWEtfTGFzdF9WaXJ0dWFsX1NjcmVlbiAgICAgICAgICAgMHhmZWQ0CisjZGVmaW5lIFhLX1Rlcm1pbmF0ZV9TZXJ2ZXIgICAgICAgICAgICAgIDB4ZmVkNQorCisjZGVmaW5lIFhLX0FjY2Vzc1hfRW5hYmxlICAgICAgICAgICAgICAgIDB4ZmU3MAorI2RlZmluZSBYS19BY2Nlc3NYX0ZlZWRiYWNrX0VuYWJsZSAgICAgICAweGZlNzEKKyNkZWZpbmUgWEtfUmVwZWF0S2V5c19FbmFibGUgICAgICAgICAgICAgMHhmZTcyCisjZGVmaW5lIFhLX1Nsb3dLZXlzX0VuYWJsZSAgICAgICAgICAgICAgIDB4ZmU3MworI2RlZmluZSBYS19Cb3VuY2VLZXlzX0VuYWJsZSAgICAgICAgICAgICAweGZlNzQKKyNkZWZpbmUgWEtfU3RpY2t5S2V5c19FbmFibGUgICAgICAgICAgICAgMHhmZTc1CisjZGVmaW5lIFhLX01vdXNlS2V5c19FbmFibGUgICAgICAgICAgICAgIDB4ZmU3NgorI2RlZmluZSBYS19Nb3VzZUtleXNfQWNjZWxfRW5hYmxlICAgICAgICAweGZlNzcKKyNkZWZpbmUgWEtfT3ZlcmxheTFfRW5hYmxlICAgICAgICAgICAgICAgMHhmZTc4CisjZGVmaW5lIFhLX092ZXJsYXkyX0VuYWJsZSAgICAgICAgICAgICAgIDB4ZmU3OQorI2RlZmluZSBYS19BdWRpYmxlQmVsbF9FbmFibGUgICAgICAgICAgICAweGZlN2EKKworI2RlZmluZSBYS19Qb2ludGVyX0xlZnQgICAgICAgICAgICAgICAgICAweGZlZTAKKyNkZWZpbmUgWEtfUG9pbnRlcl9SaWdodCAgICAgICAgICAgICAgICAgMHhmZWUxCisjZGVmaW5lIFhLX1BvaW50ZXJfVXAgICAgICAgICAgICAgICAgICAgIDB4ZmVlMgorI2RlZmluZSBYS19Qb2ludGVyX0Rvd24gICAgICAgICAgICAgICAgICAweGZlZTMKKyNkZWZpbmUgWEtfUG9pbnRlcl9VcExlZnQgICAgICAgICAgICAgICAgMHhmZWU0CisjZGVmaW5lIFhLX1BvaW50ZXJfVXBSaWdodCAgICAgICAgICAgICAgIDB4ZmVlNQorI2RlZmluZSBYS19Qb2ludGVyX0Rvd25MZWZ0ICAgICAgICAgICAgICAweGZlZTYKKyNkZWZpbmUgWEtfUG9pbnRlcl9Eb3duUmlnaHQgICAgICAgICAgICAgMHhmZWU3CisjZGVmaW5lIFhLX1BvaW50ZXJfQnV0dG9uX0RmbHQgICAgICAgICAgIDB4ZmVlOAorI2RlZmluZSBYS19Qb2ludGVyX0J1dHRvbjEgICAgICAgICAgICAgICAweGZlZTkKKyNkZWZpbmUgWEtfUG9pbnRlcl9CdXR0b24yICAgICAgICAgICAgICAgMHhmZWVhCisjZGVmaW5lIFhLX1BvaW50ZXJfQnV0dG9uMyAgICAgICAgICAgICAgIDB4ZmVlYgorI2RlZmluZSBYS19Qb2ludGVyX0J1dHRvbjQgICAgICAgICAgICAgICAweGZlZWMKKyNkZWZpbmUgWEtfUG9pbnRlcl9CdXR0b241ICAgICAgICAgICAgICAgMHhmZWVkCisjZGVmaW5lIFhLX1BvaW50ZXJfRGJsQ2xpY2tfRGZsdCAgICAgICAgIDB4ZmVlZQorI2RlZmluZSBYS19Qb2ludGVyX0RibENsaWNrMSAgICAgICAgICAgICAweGZlZWYKKyNkZWZpbmUgWEtfUG9pbnRlcl9EYmxDbGljazIgICAgICAgICAgICAgMHhmZWYwCisjZGVmaW5lIFhLX1BvaW50ZXJfRGJsQ2xpY2szICAgICAgICAgICAgIDB4ZmVmMQorI2RlZmluZSBYS19Qb2ludGVyX0RibENsaWNrNCAgICAgICAgICAgICAweGZlZjIKKyNkZWZpbmUgWEtfUG9pbnRlcl9EYmxDbGljazUgICAgICAgICAgICAgMHhmZWYzCisjZGVmaW5lIFhLX1BvaW50ZXJfRHJhZ19EZmx0ICAgICAgICAgICAgIDB4ZmVmNAorI2RlZmluZSBYS19Qb2ludGVyX0RyYWcxICAgICAgICAgICAgICAgICAweGZlZjUKKyNkZWZpbmUgWEtfUG9pbnRlcl9EcmFnMiAgICAgICAgICAgICAgICAgMHhmZWY2CisjZGVmaW5lIFhLX1BvaW50ZXJfRHJhZzMgICAgICAgICAgICAgICAgIDB4ZmVmNworI2RlZmluZSBYS19Qb2ludGVyX0RyYWc0ICAgICAgICAgICAgICAgICAweGZlZjgKKyNkZWZpbmUgWEtfUG9pbnRlcl9EcmFnNSAgICAgICAgICAgICAgICAgMHhmZWZkCisKKyNkZWZpbmUgWEtfUG9pbnRlcl9FbmFibGVLZXlzICAgICAgICAgICAgMHhmZWY5CisjZGVmaW5lIFhLX1BvaW50ZXJfQWNjZWxlcmF0ZSAgICAgICAgICAgIDB4ZmVmYQorI2RlZmluZSBYS19Qb2ludGVyX0RmbHRCdG5OZXh0ICAgICAgICAgICAweGZlZmIKKyNkZWZpbmUgWEtfUG9pbnRlcl9EZmx0QnRuUHJldiAgICAgICAgICAgMHhmZWZjCisKKyNlbmRpZiAvKiBYS19YS0JfS0VZUyAqLworCisvKgorICogMzI3MCBUZXJtaW5hbCBLZXlzCisgKiBCeXRlIDMgPSAweGZkCisgKi8KKworI2lmZGVmIFhLXzMyNzAKKyNkZWZpbmUgWEtfMzI3MF9EdXBsaWNhdGUgICAgICAgICAgICAgICAgMHhmZDAxCisjZGVmaW5lIFhLXzMyNzBfRmllbGRNYXJrICAgICAgICAgICAgICAgIDB4ZmQwMgorI2RlZmluZSBYS18zMjcwX1JpZ2h0MiAgICAgICAgICAgICAgICAgICAweGZkMDMKKyNkZWZpbmUgWEtfMzI3MF9MZWZ0MiAgICAgICAgICAgICAgICAgICAgMHhmZDA0CisjZGVmaW5lIFhLXzMyNzBfQmFja1RhYiAgICAgICAgICAgICAgICAgIDB4ZmQwNQorI2RlZmluZSBYS18zMjcwX0VyYXNlRU9GICAgICAgICAgICAgICAgICAweGZkMDYKKyNkZWZpbmUgWEtfMzI3MF9FcmFzZUlucHV0ICAgICAgICAgICAgICAgMHhmZDA3CisjZGVmaW5lIFhLXzMyNzBfUmVzZXQgICAgICAgICAgICAgICAgICAgIDB4ZmQwOAorI2RlZmluZSBYS18zMjcwX1F1aXQgICAgICAgICAgICAgICAgICAgICAweGZkMDkKKyNkZWZpbmUgWEtfMzI3MF9QQTEgICAgICAgICAgICAgICAgICAgICAgMHhmZDBhCisjZGVmaW5lIFhLXzMyNzBfUEEyICAgICAgICAgICAgICAgICAgICAgIDB4ZmQwYgorI2RlZmluZSBYS18zMjcwX1BBMyAgICAgICAgICAgICAgICAgICAgICAweGZkMGMKKyNkZWZpbmUgWEtfMzI3MF9UZXN0ICAgICAgICAgICAgICAgICAgICAgMHhmZDBkCisjZGVmaW5lIFhLXzMyNzBfQXR0biAgICAgICAgICAgICAgICAgICAgIDB4ZmQwZQorI2RlZmluZSBYS18zMjcwX0N1cnNvckJsaW5rICAgICAgICAgICAgICAweGZkMGYKKyNkZWZpbmUgWEtfMzI3MF9BbHRDdXJzb3IgICAgICAgICAgICAgICAgMHhmZDEwCisjZGVmaW5lIFhLXzMyNzBfS2V5Q2xpY2sgICAgICAgICAgICAgICAgIDB4ZmQxMQorI2RlZmluZSBYS18zMjcwX0p1bXAgICAgICAgICAgICAgICAgICAgICAweGZkMTIKKyNkZWZpbmUgWEtfMzI3MF9JZGVudCAgICAgICAgICAgICAgICAgICAgMHhmZDEzCisjZGVmaW5lIFhLXzMyNzBfUnVsZSAgICAgICAgICAgICAgICAgICAgIDB4ZmQxNAorI2RlZmluZSBYS18zMjcwX0NvcHkgICAgICAgICAgICAgICAgICAgICAweGZkMTUKKyNkZWZpbmUgWEtfMzI3MF9QbGF5ICAgICAgICAgICAgICAgICAgICAgMHhmZDE2CisjZGVmaW5lIFhLXzMyNzBfU2V0dXAgICAgICAgICAgICAgICAgICAgIDB4ZmQxNworI2RlZmluZSBYS18zMjcwX1JlY29yZCAgICAgICAgICAgICAgICAgICAweGZkMTgKKyNkZWZpbmUgWEtfMzI3MF9DaGFuZ2VTY3JlZW4gICAgICAgICAgICAgMHhmZDE5CisjZGVmaW5lIFhLXzMyNzBfRGVsZXRlV29yZCAgICAgICAgICAgICAgIDB4ZmQxYQorI2RlZmluZSBYS18zMjcwX0V4U2VsZWN0ICAgICAgICAgICAgICAgICAweGZkMWIKKyNkZWZpbmUgWEtfMzI3MF9DdXJzb3JTZWxlY3QgICAgICAgICAgICAgMHhmZDFjCisjZGVmaW5lIFhLXzMyNzBfUHJpbnRTY3JlZW4gICAgICAgICAgICAgIDB4ZmQxZAorI2RlZmluZSBYS18zMjcwX0VudGVyICAgICAgICAgICAgICAgICAgICAweGZkMWUKKyNlbmRpZiAvKiBYS18zMjcwICovCisKKy8qCisgKiBMYXRpbiAxCisgKiAoSVNPL0lFQyA4ODU5LTEgPSBVbmljb2RlIFUrMDAyMC4uVSswMEZGKQorICogQnl0ZSAzID0gMAorICovCisjaWZkZWYgWEtfTEFUSU4xCisjZGVmaW5lIFhLX3NwYWNlICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogVSswMDIwIFNQQUNFICovCisjZGVmaW5lIFhLX2V4Y2xhbSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMSAgLyogVSswMDIxIEVYQ0xBTUFUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfcXVvdGVkYmwgICAgICAgICAgICAgICAgICAgICAgMHgwMDIyICAvKiBVKzAwMjIgUVVPVEFUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfbnVtYmVyc2lnbiAgICAgICAgICAgICAgICAgICAgMHgwMDIzICAvKiBVKzAwMjMgTlVNQkVSIFNJR04gKi8KKyNkZWZpbmUgWEtfZG9sbGFyICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDI0ICAvKiBVKzAwMjQgRE9MTEFSIFNJR04gKi8KKyNkZWZpbmUgWEtfcGVyY2VudCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDI1ICAvKiBVKzAwMjUgUEVSQ0VOVCBTSUdOICovCisjZGVmaW5lIFhLX2FtcGVyc2FuZCAgICAgICAgICAgICAgICAgICAgIDB4MDAyNiAgLyogVSswMDI2IEFNUEVSU0FORCAqLworI2RlZmluZSBYS19hcG9zdHJvcGhlICAgICAgICAgICAgICAgICAgICAweDAwMjcgIC8qIFUrMDAyNyBBUE9TVFJPUEhFICovCisjZGVmaW5lIFhLX3F1b3RlcmlnaHQgICAgICAgICAgICAgICAgICAgIDB4MDAyNyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19wYXJlbmxlZnQgICAgICAgICAgICAgICAgICAgICAweDAwMjggIC8qIFUrMDAyOCBMRUZUIFBBUkVOVEhFU0lTICovCisjZGVmaW5lIFhLX3BhcmVucmlnaHQgICAgICAgICAgICAgICAgICAgIDB4MDAyOSAgLyogVSswMDI5IFJJR0hUIFBBUkVOVEhFU0lTICovCisjZGVmaW5lIFhLX2FzdGVyaXNrICAgICAgICAgICAgICAgICAgICAgIDB4MDAyYSAgLyogVSswMDJBIEFTVEVSSVNLICovCisjZGVmaW5lIFhLX3BsdXMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyYiAgLyogVSswMDJCIFBMVVMgU0lHTiAqLworI2RlZmluZSBYS19jb21tYSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMmMgIC8qIFUrMDAyQyBDT01NQSAqLworI2RlZmluZSBYS19taW51cyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMmQgIC8qIFUrMDAyRCBIWVBIRU4tTUlOVVMgKi8KKyNkZWZpbmUgWEtfcGVyaW9kICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDJlICAvKiBVKzAwMkUgRlVMTCBTVE9QICovCisjZGVmaW5lIFhLX3NsYXNoICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyZiAgLyogVSswMDJGIFNPTElEVVMgKi8KKyNkZWZpbmUgWEtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDMwICAvKiBVKzAwMzAgRElHSVQgWkVSTyAqLworI2RlZmluZSBYS18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzEgIC8qIFUrMDAzMSBESUdJVCBPTkUgKi8KKyNkZWZpbmUgWEtfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDMyICAvKiBVKzAwMzIgRElHSVQgVFdPICovCisjZGVmaW5lIFhLXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMyAgLyogVSswMDMzIERJR0lUIFRIUkVFICovCisjZGVmaW5lIFhLXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzNCAgLyogVSswMDM0IERJR0lUIEZPVVIgKi8KKyNkZWZpbmUgWEtfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM1ICAvKiBVKzAwMzUgRElHSVQgRklWRSAqLworI2RlZmluZSBYS182ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzYgIC8qIFUrMDAzNiBESUdJVCBTSVggKi8KKyNkZWZpbmUgWEtfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM3ICAvKiBVKzAwMzcgRElHSVQgU0VWRU4gKi8KKyNkZWZpbmUgWEtfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM4ICAvKiBVKzAwMzggRElHSVQgRUlHSFQgKi8KKyNkZWZpbmUgWEtfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM5ICAvKiBVKzAwMzkgRElHSVQgTklORSAqLworI2RlZmluZSBYS19jb2xvbiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwM2EgIC8qIFUrMDAzQSBDT0xPTiAqLworI2RlZmluZSBYS19zZW1pY29sb24gICAgICAgICAgICAgICAgICAgICAweDAwM2IgIC8qIFUrMDAzQiBTRU1JQ09MT04gKi8KKyNkZWZpbmUgWEtfbGVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDNjICAvKiBVKzAwM0MgTEVTUy1USEFOIFNJR04gKi8KKyNkZWZpbmUgWEtfZXF1YWwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDNkICAvKiBVKzAwM0QgRVFVQUxTIFNJR04gKi8KKyNkZWZpbmUgWEtfZ3JlYXRlciAgICAgICAgICAgICAgICAgICAgICAgMHgwMDNlICAvKiBVKzAwM0UgR1JFQVRFUi1USEFOIFNJR04gKi8KKyNkZWZpbmUgWEtfcXVlc3Rpb24gICAgICAgICAgICAgICAgICAgICAgMHgwMDNmICAvKiBVKzAwM0YgUVVFU1RJT04gTUFSSyAqLworI2RlZmluZSBYS19hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFUrMDA0MCBDT01NRVJDSUFMIEFUICovCisjZGVmaW5lIFhLX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MSAgLyogVSswMDQxIExBVElOIENBUElUQUwgTEVUVEVSIEEgKi8KKyNkZWZpbmUgWEtfQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQyICAvKiBVKzAwNDIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiAqLworI2RlZmluZSBYS19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDMgIC8qIFUrMDA0MyBMQVRJTiBDQVBJVEFMIExFVFRFUiBDICovCisjZGVmaW5lIFhLX0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0NCAgLyogVSswMDQ0IExBVElOIENBUElUQUwgTEVUVEVSIEQgKi8KKyNkZWZpbmUgWEtfRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQ1ICAvKiBVKzAwNDUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSAqLworI2RlZmluZSBYS19GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDYgIC8qIFUrMDA0NiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGICovCisjZGVmaW5lIFhLX0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0NyAgLyogVSswMDQ3IExBVElOIENBUElUQUwgTEVUVEVSIEcgKi8KKyNkZWZpbmUgWEtfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQ4ICAvKiBVKzAwNDggTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCAqLworI2RlZmluZSBYS19JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDkgIC8qIFUrMDA0OSBMQVRJTiBDQVBJVEFMIExFVFRFUiBJICovCisjZGVmaW5lIFhLX0ogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0YSAgLyogVSswMDRBIExBVElOIENBUElUQUwgTEVUVEVSIEogKi8KKyNkZWZpbmUgWEtfSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDRiICAvKiBVKzAwNEIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyAqLworI2RlZmluZSBYS19MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNGMgIC8qIFUrMDA0QyBMQVRJTiBDQVBJVEFMIExFVFRFUiBMICovCisjZGVmaW5lIFhLX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0ZCAgLyogVSswMDREIExBVElOIENBUElUQUwgTEVUVEVSIE0gKi8KKyNkZWZpbmUgWEtfTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDRlICAvKiBVKzAwNEUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiAqLworI2RlZmluZSBYS19PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNGYgIC8qIFUrMDA0RiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPICovCisjZGVmaW5lIFhLX1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1MCAgLyogVSswMDUwIExBVElOIENBUElUQUwgTEVUVEVSIFAgKi8KKyNkZWZpbmUgWEtfUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDUxICAvKiBVKzAwNTEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUSAqLworI2RlZmluZSBYS19SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTIgIC8qIFUrMDA1MiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSICovCisjZGVmaW5lIFhLX1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1MyAgLyogVSswMDUzIExBVElOIENBUElUQUwgTEVUVEVSIFMgKi8KKyNkZWZpbmUgWEtfVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDU0ICAvKiBVKzAwNTQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCAqLworI2RlZmluZSBYS19VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTUgIC8qIFUrMDA1NSBMQVRJTiBDQVBJVEFMIExFVFRFUiBVICovCisjZGVmaW5lIFhLX1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1NiAgLyogVSswMDU2IExBVElOIENBUElUQUwgTEVUVEVSIFYgKi8KKyNkZWZpbmUgWEtfVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDU3ICAvKiBVKzAwNTcgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyAqLworI2RlZmluZSBYS19YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTggIC8qIFUrMDA1OCBMQVRJTiBDQVBJVEFMIExFVFRFUiBYICovCisjZGVmaW5lIFhLX1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1OSAgLyogVSswMDU5IExBVElOIENBUElUQUwgTEVUVEVSIFkgKi8KKyNkZWZpbmUgWEtfWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDVhICAvKiBVKzAwNUEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiAqLworI2RlZmluZSBYS19icmFja2V0bGVmdCAgICAgICAgICAgICAgICAgICAweDAwNWIgIC8qIFUrMDA1QiBMRUZUIFNRVUFSRSBCUkFDS0VUICovCisjZGVmaW5lIFhLX2JhY2tzbGFzaCAgICAgICAgICAgICAgICAgICAgIDB4MDA1YyAgLyogVSswMDVDIFJFVkVSU0UgU09MSURVUyAqLworI2RlZmluZSBYS19icmFja2V0cmlnaHQgICAgICAgICAgICAgICAgICAweDAwNWQgIC8qIFUrMDA1RCBSSUdIVCBTUVVBUkUgQlJBQ0tFVCAqLworI2RlZmluZSBYS19hc2NpaWNpcmN1bSAgICAgICAgICAgICAgICAgICAweDAwNWUgIC8qIFUrMDA1RSBDSVJDVU1GTEVYIEFDQ0VOVCAqLworI2RlZmluZSBYS191bmRlcnNjb3JlICAgICAgICAgICAgICAgICAgICAweDAwNWYgIC8qIFUrMDA1RiBMT1cgTElORSAqLworI2RlZmluZSBYS19ncmF2ZSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjAgIC8qIFUrMDA2MCBHUkFWRSBBQ0NFTlQgKi8KKyNkZWZpbmUgWEtfcXVvdGVsZWZ0ICAgICAgICAgICAgICAgICAgICAgMHgwMDYwICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MSAgLyogVSswMDYxIExBVElOIFNNQUxMIExFVFRFUiBBICovCisjZGVmaW5lIFhLX2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MiAgLyogVSswMDYyIExBVElOIFNNQUxMIExFVFRFUiBCICovCisjZGVmaW5lIFhLX2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MyAgLyogVSswMDYzIExBVElOIFNNQUxMIExFVFRFUiBDICovCisjZGVmaW5lIFhLX2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2NCAgLyogVSswMDY0IExBVElOIFNNQUxMIExFVFRFUiBEICovCisjZGVmaW5lIFhLX2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2NSAgLyogVSswMDY1IExBVElOIFNNQUxMIExFVFRFUiBFICovCisjZGVmaW5lIFhLX2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2NiAgLyogVSswMDY2IExBVElOIFNNQUxMIExFVFRFUiBGICovCisjZGVmaW5lIFhLX2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2NyAgLyogVSswMDY3IExBVElOIFNNQUxMIExFVFRFUiBHICovCisjZGVmaW5lIFhLX2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2OCAgLyogVSswMDY4IExBVElOIFNNQUxMIExFVFRFUiBIICovCisjZGVmaW5lIFhLX2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2OSAgLyogVSswMDY5IExBVElOIFNNQUxMIExFVFRFUiBJICovCisjZGVmaW5lIFhLX2ogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2YSAgLyogVSswMDZBIExBVElOIFNNQUxMIExFVFRFUiBKICovCisjZGVmaW5lIFhLX2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2YiAgLyogVSswMDZCIExBVElOIFNNQUxMIExFVFRFUiBLICovCisjZGVmaW5lIFhLX2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2YyAgLyogVSswMDZDIExBVElOIFNNQUxMIExFVFRFUiBMICovCisjZGVmaW5lIFhLX20gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2ZCAgLyogVSswMDZEIExBVElOIFNNQUxMIExFVFRFUiBNICovCisjZGVmaW5lIFhLX24gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2ZSAgLyogVSswMDZFIExBVElOIFNNQUxMIExFVFRFUiBOICovCisjZGVmaW5lIFhLX28gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2ZiAgLyogVSswMDZGIExBVElOIFNNQUxMIExFVFRFUiBPICovCisjZGVmaW5lIFhLX3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MCAgLyogVSswMDcwIExBVElOIFNNQUxMIExFVFRFUiBQICovCisjZGVmaW5lIFhLX3EgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MSAgLyogVSswMDcxIExBVElOIFNNQUxMIExFVFRFUiBRICovCisjZGVmaW5lIFhLX3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MiAgLyogVSswMDcyIExBVElOIFNNQUxMIExFVFRFUiBSICovCisjZGVmaW5lIFhLX3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MyAgLyogVSswMDczIExBVElOIFNNQUxMIExFVFRFUiBTICovCisjZGVmaW5lIFhLX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3NCAgLyogVSswMDc0IExBVElOIFNNQUxMIExFVFRFUiBUICovCisjZGVmaW5lIFhLX3UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3NSAgLyogVSswMDc1IExBVElOIFNNQUxMIExFVFRFUiBVICovCisjZGVmaW5lIFhLX3YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3NiAgLyogVSswMDc2IExBVElOIFNNQUxMIExFVFRFUiBWICovCisjZGVmaW5lIFhLX3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3NyAgLyogVSswMDc3IExBVElOIFNNQUxMIExFVFRFUiBXICovCisjZGVmaW5lIFhLX3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3OCAgLyogVSswMDc4IExBVElOIFNNQUxMIExFVFRFUiBYICovCisjZGVmaW5lIFhLX3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3OSAgLyogVSswMDc5IExBVElOIFNNQUxMIExFVFRFUiBZICovCisjZGVmaW5lIFhLX3ogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3YSAgLyogVSswMDdBIExBVElOIFNNQUxMIExFVFRFUiBaICovCisjZGVmaW5lIFhLX2JyYWNlbGVmdCAgICAgICAgICAgICAgICAgICAgIDB4MDA3YiAgLyogVSswMDdCIExFRlQgQ1VSTFkgQlJBQ0tFVCAqLworI2RlZmluZSBYS19iYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwN2MgIC8qIFUrMDA3QyBWRVJUSUNBTCBMSU5FICovCisjZGVmaW5lIFhLX2JyYWNlcmlnaHQgICAgICAgICAgICAgICAgICAgIDB4MDA3ZCAgLyogVSswMDdEIFJJR0hUIENVUkxZIEJSQUNLRVQgKi8KKyNkZWZpbmUgWEtfYXNjaWl0aWxkZSAgICAgICAgICAgICAgICAgICAgMHgwMDdlICAvKiBVKzAwN0UgVElMREUgKi8KKworI2RlZmluZSBYS19ub2JyZWFrc3BhY2UgICAgICAgICAgICAgICAgICAweDAwYTAgIC8qIFUrMDBBMCBOTy1CUkVBSyBTUEFDRSAqLworI2RlZmluZSBYS19leGNsYW1kb3duICAgICAgICAgICAgICAgICAgICAweDAwYTEgIC8qIFUrMDBBMSBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLICovCisjZGVmaW5lIFhLX2NlbnQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBhMiAgLyogVSswMEEyIENFTlQgU0lHTiAqLworI2RlZmluZSBYS19zdGVybGluZyAgICAgICAgICAgICAgICAgICAgICAweDAwYTMgIC8qIFUrMDBBMyBQT1VORCBTSUdOICovCisjZGVmaW5lIFhLX2N1cnJlbmN5ICAgICAgICAgICAgICAgICAgICAgIDB4MDBhNCAgLyogVSswMEE0IENVUlJFTkNZIFNJR04gKi8KKyNkZWZpbmUgWEtfeWVuICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGE1ICAvKiBVKzAwQTUgWUVOIFNJR04gKi8KKyNkZWZpbmUgWEtfYnJva2VuYmFyICAgICAgICAgICAgICAgICAgICAgMHgwMGE2ICAvKiBVKzAwQTYgQlJPS0VOIEJBUiAqLworI2RlZmluZSBYS19zZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAweDAwYTcgIC8qIFUrMDBBNyBTRUNUSU9OIFNJR04gKi8KKyNkZWZpbmUgWEtfZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAgMHgwMGE4ICAvKiBVKzAwQTggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX2NvcHlyaWdodCAgICAgICAgICAgICAgICAgICAgIDB4MDBhOSAgLyogVSswMEE5IENPUFlSSUdIVCBTSUdOICovCisjZGVmaW5lIFhLX29yZGZlbWluaW5lICAgICAgICAgICAgICAgICAgIDB4MDBhYSAgLyogVSswMEFBIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SICovCisjZGVmaW5lIFhLX2d1aWxsZW1vdGxlZnQgICAgICAgICAgICAgICAgIDB4MDBhYiAgLyogVSswMEFCIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCisjZGVmaW5lIFhLX25vdHNpZ24gICAgICAgICAgICAgICAgICAgICAgIDB4MDBhYyAgLyogVSswMEFDIE5PVCBTSUdOICovCisjZGVmaW5lIFhLX2h5cGhlbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBhZCAgLyogVSswMEFEIFNPRlQgSFlQSEVOICovCisjZGVmaW5lIFhLX3JlZ2lzdGVyZWQgICAgICAgICAgICAgICAgICAgIDB4MDBhZSAgLyogVSswMEFFIFJFR0lTVEVSRUQgU0lHTiAqLworI2RlZmluZSBYS19tYWNyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAwYWYgIC8qIFUrMDBBRiBNQUNST04gKi8KKyNkZWZpbmUgWEtfZGVncmVlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGIwICAvKiBVKzAwQjAgREVHUkVFIFNJR04gKi8KKyNkZWZpbmUgWEtfcGx1c21pbnVzICAgICAgICAgICAgICAgICAgICAgMHgwMGIxICAvKiBVKzAwQjEgUExVUy1NSU5VUyBTSUdOICovCisjZGVmaW5lIFhLX3R3b3N1cGVyaW9yICAgICAgICAgICAgICAgICAgIDB4MDBiMiAgLyogVSswMEIyIFNVUEVSU0NSSVBUIFRXTyAqLworI2RlZmluZSBYS190aHJlZXN1cGVyaW9yICAgICAgICAgICAgICAgICAweDAwYjMgIC8qIFUrMDBCMyBTVVBFUlNDUklQVCBUSFJFRSAqLworI2RlZmluZSBYS19hY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYjQgIC8qIFUrMDBCNCBBQ1VURSBBQ0NFTlQgKi8KKyNkZWZpbmUgWEtfbXUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGI1ICAvKiBVKzAwQjUgTUlDUk8gU0lHTiAqLworI2RlZmluZSBYS19wYXJhZ3JhcGggICAgICAgICAgICAgICAgICAgICAweDAwYjYgIC8qIFUrMDBCNiBQSUxDUk9XIFNJR04gKi8KKyNkZWZpbmUgWEtfcGVyaW9kY2VudGVyZWQgICAgICAgICAgICAgICAgMHgwMGI3ICAvKiBVKzAwQjcgTUlERExFIERPVCAqLworI2RlZmluZSBYS19jZWRpbGxhICAgICAgICAgICAgICAgICAgICAgICAweDAwYjggIC8qIFUrMDBCOCBDRURJTExBICovCisjZGVmaW5lIFhLX29uZXN1cGVyaW9yICAgICAgICAgICAgICAgICAgIDB4MDBiOSAgLyogVSswMEI5IFNVUEVSU0NSSVBUIE9ORSAqLworI2RlZmluZSBYS19tYXNjdWxpbmUgICAgICAgICAgICAgICAgICAgICAweDAwYmEgIC8qIFUrMDBCQSBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IgKi8KKyNkZWZpbmUgWEtfZ3VpbGxlbW90cmlnaHQgICAgICAgICAgICAgICAgMHgwMGJiICAvKiBVKzAwQkIgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCisjZGVmaW5lIFhLX29uZXF1YXJ0ZXIgICAgICAgICAgICAgICAgICAgIDB4MDBiYyAgLyogVSswMEJDIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUiAqLworI2RlZmluZSBYS19vbmVoYWxmICAgICAgICAgICAgICAgICAgICAgICAweDAwYmQgIC8qIFUrMDBCRCBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYgKi8KKyNkZWZpbmUgWEtfdGhyZWVxdWFydGVycyAgICAgICAgICAgICAgICAgMHgwMGJlICAvKiBVKzAwQkUgVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTICovCisjZGVmaW5lIFhLX3F1ZXN0aW9uZG93biAgICAgICAgICAgICAgICAgIDB4MDBiZiAgLyogVSswMEJGIElOVkVSVEVEIFFVRVNUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfQWdyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGMwICAvKiBVKzAwQzAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFICovCisjZGVmaW5lIFhLX0FhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBjMSAgLyogVSswMEMxIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19BY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAwYzIgIC8qIFUrMDBDMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19BdGlsZGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwYzMgIC8qIFUrMDBDMyBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfQWRpYWVyZXNpcyAgICAgICAgICAgICAgICAgICAgMHgwMGM0ICAvKiBVKzAwQzQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUyAqLworI2RlZmluZSBYS19BcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYzUgIC8qIFUrMDBDNSBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRSAqLworI2RlZmluZSBYS19BRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYzYgIC8qIFUrMDBDNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRSAqLworI2RlZmluZSBYS19DY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAwYzcgIC8qIFUrMDBDNyBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19FZ3JhdmUgICAgICAgICAgICAgICAgICAgICAgICAweDAwYzggIC8qIFUrMDBDOCBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUgKi8KKyNkZWZpbmUgWEtfRWFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGM5ICAvKiBVKzAwQzkgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX0VjaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDBjYSAgLyogVSswMENBIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX0VkaWFlcmVzaXMgICAgICAgICAgICAgICAgICAgIDB4MDBjYiAgLyogVSswMENCIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMgKi8KKyNkZWZpbmUgWEtfSWdyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGNjICAvKiBVKzAwQ0MgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFICovCisjZGVmaW5lIFhLX0lhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBjZCAgLyogVSswMENEIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19JY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAwY2UgIC8qIFUrMDBDRSBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19JZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwY2YgIC8qIFUrMDBDRiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX0VUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkMCAgLyogVSswMEQwIExBVElOIENBUElUQUwgTEVUVEVSIEVUSCAqLworI2RlZmluZSBYS19FdGggICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZDAgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfTnRpbGRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGQxICAvKiBVKzAwRDEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX09ncmF2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkMiAgLyogVSswMEQyIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS19PYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZDMgIC8qIFUrMDBEMyBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfT2NpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMGQ0ICAvKiBVKzAwRDQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfT3RpbGRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGQ1ICAvKiBVKzAwRDUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX09kaWFlcmVzaXMgICAgICAgICAgICAgICAgICAgIDB4MDBkNiAgLyogVSswMEQ2IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMgKi8KKyNkZWZpbmUgWEtfbXVsdGlwbHkgICAgICAgICAgICAgICAgICAgICAgMHgwMGQ3ICAvKiBVKzAwRDcgTVVMVElQTElDQVRJT04gU0lHTiAqLworI2RlZmluZSBYS19Pc2xhc2ggICAgICAgICAgICAgICAgICAgICAgICAweDAwZDggIC8qIFUrMDBEOCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX09vYmxpcXVlICAgICAgICAgICAgICAgICAgICAgIDB4MDBkOCAgLyogVSswMEQ4IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfVWdyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGQ5ICAvKiBVKzAwRDkgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFICovCisjZGVmaW5lIFhLX1VhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkYSAgLyogVSswMERBIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19VY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAwZGIgIC8qIFUrMDBEQiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19VZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwZGMgIC8qIFUrMDBEQyBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX1lhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkZCAgLyogVSswMEREIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19USE9STiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZGUgIC8qIFUrMDBERSBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STiAqLworI2RlZmluZSBYS19UaG9ybiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZGUgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfc3NoYXJwICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGRmICAvKiBVKzAwREYgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKi8KKyNkZWZpbmUgWEtfYWdyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGUwICAvKiBVKzAwRTAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS19hYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZTEgIC8qIFUrMDBFMSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX2FjaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDBlMiAgLyogVSswMEUyIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19hdGlsZGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZTMgIC8qIFUrMDBFMyBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX2FkaWFlcmVzaXMgICAgICAgICAgICAgICAgICAgIDB4MDBlNCAgLyogVSswMEU0IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX2FyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlNSAgLyogVSswMEU1IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRSAqLworI2RlZmluZSBYS19hZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZTYgIC8qIFUrMDBFNiBMQVRJTiBTTUFMTCBMRVRURVIgQUUgKi8KKyNkZWZpbmUgWEtfY2NlZGlsbGEgICAgICAgICAgICAgICAgICAgICAgMHgwMGU3ICAvKiBVKzAwRTcgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX2VncmF2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlOCAgLyogVSswMEU4IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUgKi8KKyNkZWZpbmUgWEtfZWFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGU5ICAvKiBVKzAwRTkgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19lY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAwZWEgIC8qIFUrMDBFQSBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfZWRpYWVyZXNpcyAgICAgICAgICAgICAgICAgICAgMHgwMGViICAvKiBVKzAwRUIgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMgKi8KKyNkZWZpbmUgWEtfaWdyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGVjICAvKiBVKzAwRUMgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS19pYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZWQgIC8qIFUrMDBFRCBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX2ljaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDBlZSAgLyogVSswMEVFIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19pZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwZWYgIC8qIFUrMDBFRiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUyAqLworI2RlZmluZSBYS19ldGggICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZjAgIC8qIFUrMDBGMCBMQVRJTiBTTUFMTCBMRVRURVIgRVRIICovCisjZGVmaW5lIFhLX250aWxkZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmMSAgLyogVSswMEYxIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfb2dyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGYyICAvKiBVKzAwRjIgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS19vYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZjMgIC8qIFUrMDBGMyBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX29jaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDBmNCAgLyogVSswMEY0IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19vdGlsZGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZjUgIC8qIFUrMDBGNSBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX29kaWFlcmVzaXMgICAgICAgICAgICAgICAgICAgIDB4MDBmNiAgLyogVSswMEY2IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX2RpdmlzaW9uICAgICAgICAgICAgICAgICAgICAgIDB4MDBmNyAgLyogVSswMEY3IERJVklTSU9OIFNJR04gKi8KKyNkZWZpbmUgWEtfb3NsYXNoICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGY4ICAvKiBVKzAwRjggTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfb29ibGlxdWUgICAgICAgICAgICAgICAgICAgICAgMHgwMGY4ICAvKiBVKzAwRjggTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfdWdyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGY5ICAvKiBVKzAwRjkgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS191YWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZmEgIC8qIFUrMDBGQSBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX3VjaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDBmYiAgLyogVSswMEZCIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS191ZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwZmMgIC8qIFUrMDBGQyBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyAqLworI2RlZmluZSBYS195YWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZmQgIC8qIFUrMDBGRCBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX3Rob3JuICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmZSAgLyogVSswMEZFIExBVElOIFNNQUxMIExFVFRFUiBUSE9STiAqLworI2RlZmluZSBYS195ZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwZmYgIC8qIFUrMDBGRiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUyAqLworI2VuZGlmIC8qIFhLX0xBVElOMSAqLworCisvKgorICogTGF0aW4gMgorICogQnl0ZSAzID0gMQorICovCisKKyNpZmRlZiBYS19MQVRJTjIKKyNkZWZpbmUgWEtfQW9nb25layAgICAgICAgICAgICAgICAgICAgICAgMHgwMWExICAvKiBVKzAxMDQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSyAqLworI2RlZmluZSBYS19icmV2ZSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTIgIC8qIFUrMDJEOCBCUkVWRSAqLworI2RlZmluZSBYS19Mc3Ryb2tlICAgICAgICAgICAgICAgICAgICAgICAweDAxYTMgIC8qIFUrMDE0MSBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX0xjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhNSAgLyogVSswMTNEIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19TYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTYgIC8qIFUrMDE1QSBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfU2Nhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWE5ICAvKiBVKzAxNjAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX1NjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDFhYSAgLyogVSswMTVFIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX1RjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhYiAgLyogVSswMTY0IExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19aYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAxYWMgIC8qIFUrMDE3OSBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfWmNhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWFlICAvKiBVKzAxN0QgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX1phYm92ZWRvdCAgICAgICAgICAgICAgICAgICAgIDB4MDFhZiAgLyogVSswMTdCIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfYW9nb25layAgICAgICAgICAgICAgICAgICAgICAgMHgwMWIxICAvKiBVKzAxMDUgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsgKi8KKyNkZWZpbmUgWEtfb2dvbmVrICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWIyICAvKiBVKzAyREIgT0dPTkVLICovCisjZGVmaW5lIFhLX2xzdHJva2UgICAgICAgICAgICAgICAgICAgICAgIDB4MDFiMyAgLyogVSswMTQyIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX2xjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFiNSAgLyogVSswMTNFIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfc2FjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWI2ICAvKiBVKzAxNUIgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19jYXJvbiAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYjcgIC8qIFUrMDJDNyBDQVJPTiAqLworI2RlZmluZSBYS19zY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxYjkgIC8qIFUrMDE2MSBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX3NjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDFiYSAgLyogVSswMTVGIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS190Y2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxYmIgIC8qIFUrMDE2NSBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX3phY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFiYyAgLyogVSswMTdBIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfZG91YmxlYWN1dGUgICAgICAgICAgICAgICAgICAgMHgwMWJkICAvKiBVKzAyREQgRE9VQkxFIEFDVVRFIEFDQ0VOVCAqLworI2RlZmluZSBYS196Y2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxYmUgIC8qIFUrMDE3RSBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX3phYm92ZWRvdCAgICAgICAgICAgICAgICAgICAgIDB4MDFiZiAgLyogVSswMTdDIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX1JhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFjMCAgLyogVSswMTU0IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19BYnJldmUgICAgICAgICAgICAgICAgICAgICAgICAweDAxYzMgIC8qIFUrMDEwMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUgKi8KKyNkZWZpbmUgWEtfTGFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWM1ICAvKiBVKzAxMzkgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX0NhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFjNiAgLyogVSswMTA2IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19DY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxYzggIC8qIFUrMDEwQyBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfRW9nb25layAgICAgICAgICAgICAgICAgICAgICAgMHgwMWNhICAvKiBVKzAxMTggTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSyAqLworI2RlZmluZSBYS19FY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxY2MgIC8qIFUrMDExQSBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfRGNhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWNmICAvKiBVKzAxMEUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX0RzdHJva2UgICAgICAgICAgICAgICAgICAgICAgIDB4MDFkMCAgLyogVSswMTEwIExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfTmFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWQxICAvKiBVKzAxNDMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX05jYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFkMiAgLyogVSswMTQ3IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19PZG91YmxlYWN1dGUgICAgICAgICAgICAgICAgICAweDAxZDUgIC8qIFUrMDE1MCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFICovCisjZGVmaW5lIFhLX1JjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFkOCAgLyogVSswMTU4IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19VcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxZDkgIC8qIFUrMDE2RSBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRSAqLworI2RlZmluZSBYS19VZG91YmxlYWN1dGUgICAgICAgICAgICAgICAgICAweDAxZGIgIC8qIFUrMDE3MCBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFICovCisjZGVmaW5lIFhLX1RjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDFkZSAgLyogVSswMTYyIExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX3JhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFlMCAgLyogVSswMTU1IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfYWJyZXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWUzICAvKiBVKzAxMDMgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRSAqLworI2RlZmluZSBYS19sYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAxZTUgIC8qIFUrMDEzQSBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX2NhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFlNiAgLyogVSswMTA3IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfY2Nhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWU4ICAvKiBVKzAxMEQgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19lb2dvbmVrICAgICAgICAgICAgICAgICAgICAgICAweDAxZWEgIC8qIFUrMDExOSBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSyAqLworI2RlZmluZSBYS19lY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxZWMgIC8qIFUrMDExQiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX2RjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFlZiAgLyogVSswMTBGIExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfZHN0cm9rZSAgICAgICAgICAgICAgICAgICAgICAgMHgwMWYwICAvKiBVKzAxMTEgTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfbmFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWYxICAvKiBVKzAxNDQgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19uY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxZjIgIC8qIFUrMDE0OCBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX29kb3VibGVhY3V0ZSAgICAgICAgICAgICAgICAgIDB4MDFmNSAgLyogVSswMTUxIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFICovCisjZGVmaW5lIFhLX3JjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFmOCAgLyogVSswMTU5IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfdXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWY5ICAvKiBVKzAxNkYgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFICovCisjZGVmaW5lIFhLX3Vkb3VibGVhY3V0ZSAgICAgICAgICAgICAgICAgIDB4MDFmYiAgLyogVSswMTcxIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFICovCisjZGVmaW5lIFhLX3RjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDFmZSAgLyogVSswMTYzIExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19hYm92ZWRvdCAgICAgICAgICAgICAgICAgICAgICAweDAxZmYgIC8qIFUrMDJEOSBET1QgQUJPVkUgKi8KKyNlbmRpZiAvKiBYS19MQVRJTjIgKi8KKworLyoKKyAqIExhdGluIDMKKyAqIEJ5dGUgMyA9IDIKKyAqLworCisjaWZkZWYgWEtfTEFUSU4zCisjZGVmaW5lIFhLX0hzdHJva2UgICAgICAgICAgICAgICAgICAgICAgIDB4MDJhMSAgLyogVSswMTI2IExBVElOIENBUElUQUwgTEVUVEVSIEggV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfSGNpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmE2ICAvKiBVKzAxMjQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfSWFib3ZlZG90ICAgICAgICAgICAgICAgICAgICAgMHgwMmE5ICAvKiBVKzAxMzAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19HYnJldmUgICAgICAgICAgICAgICAgICAgICAgICAweDAyYWIgIC8qIFUrMDExRSBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQlJFVkUgKi8KKyNkZWZpbmUgWEtfSmNpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmFjICAvKiBVKzAxMzQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSiBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfaHN0cm9rZSAgICAgICAgICAgICAgICAgICAgICAgMHgwMmIxICAvKiBVKzAxMjcgTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfaGNpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmI2ICAvKiBVKzAxMjUgTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX2lkb3RsZXNzICAgICAgICAgICAgICAgICAgICAgIDB4MDJiOSAgLyogVSswMTMxIExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkgKi8KKyNkZWZpbmUgWEtfZ2JyZXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMmJiICAvKiBVKzAxMUYgTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBCUkVWRSAqLworI2RlZmluZSBYS19qY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAyYmMgIC8qIFUrMDEzNSBMQVRJTiBTTUFMTCBMRVRURVIgSiBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfQ2Fib3ZlZG90ICAgICAgICAgICAgICAgICAgICAgMHgwMmM1ICAvKiBVKzAxMEEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19DY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAyYzYgIC8qIFUrMDEwOCBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19HYWJvdmVkb3QgICAgICAgICAgICAgICAgICAgICAweDAyZDUgIC8qIFUrMDEyMCBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX0djaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDJkOCAgLyogVSswMTFDIExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX1VicmV2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDJkZCAgLyogVSswMTZDIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBCUkVWRSAqLworI2RlZmluZSBYS19TY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAyZGUgIC8qIFUrMDE1QyBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19jYWJvdmVkb3QgICAgICAgICAgICAgICAgICAgICAweDAyZTUgIC8qIFUrMDEwQiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19jY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAyZTYgIC8qIFUrMDEwOSBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfZ2Fib3ZlZG90ICAgICAgICAgICAgICAgICAgICAgMHgwMmY1ICAvKiBVKzAxMjEgTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfZ2NpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmY4ICAvKiBVKzAxMUQgTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX3VicmV2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDJmZCAgLyogVSswMTZEIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQlJFVkUgKi8KKyNkZWZpbmUgWEtfc2NpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmZlICAvKiBVKzAxNUQgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDSVJDVU1GTEVYICovCisjZW5kaWYgLyogWEtfTEFUSU4zICovCisKKworLyoKKyAqIExhdGluIDQKKyAqIEJ5dGUgMyA9IDMKKyAqLworCisjaWZkZWYgWEtfTEFUSU40CisjZGVmaW5lIFhLX2tyYSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNhMiAgLyogVSswMTM4IExBVElOIFNNQUxMIExFVFRFUiBLUkEgKi8KKyNkZWZpbmUgWEtfa2FwcGEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwM2EyICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX1JjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDNhMyAgLyogVSswMTU2IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX0l0aWxkZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNhNSAgLyogVSswMTI4IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBUSUxERSAqLworI2RlZmluZSBYS19MY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAzYTYgIC8qIFUrMDEzQiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19FbWFjcm9uICAgICAgICAgICAgICAgICAgICAgICAweDAzYWEgIC8qIFUrMDExMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OICovCisjZGVmaW5lIFhLX0djZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDNhYiAgLyogVSswMTIyIExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX1RzbGFzaCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNhYyAgLyogVSswMTY2IExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfcmNlZGlsbGEgICAgICAgICAgICAgICAgICAgICAgMHgwM2IzICAvKiBVKzAxNTcgTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX2l0aWxkZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNiNSAgLyogVSswMTI5IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfbGNlZGlsbGEgICAgICAgICAgICAgICAgICAgICAgMHgwM2I2ICAvKiBVKzAxM0MgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX2VtYWNyb24gICAgICAgICAgICAgICAgICAgICAgIDB4MDNiYSAgLyogVSswMTEzIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OICovCisjZGVmaW5lIFhLX2djZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDNiYiAgLyogVSswMTIzIExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS190c2xhc2ggICAgICAgICAgICAgICAgICAgICAgICAweDAzYmMgIC8qIFUrMDE2NyBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIFNUUk9LRSAqLworI2RlZmluZSBYS19FTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzYmQgIC8qIFUrMDE0QSBMQVRJTiBDQVBJVEFMIExFVFRFUiBFTkcgKi8KKyNkZWZpbmUgWEtfZW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwM2JmICAvKiBVKzAxNEIgTEFUSU4gU01BTEwgTEVUVEVSIEVORyAqLworI2RlZmluZSBYS19BbWFjcm9uICAgICAgICAgICAgICAgICAgICAgICAweDAzYzAgIC8qIFUrMDEwMCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggTUFDUk9OICovCisjZGVmaW5lIFhLX0lvZ29uZWsgICAgICAgICAgICAgICAgICAgICAgIDB4MDNjNyAgLyogVSswMTJFIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBPR09ORUsgKi8KKyNkZWZpbmUgWEtfRWFib3ZlZG90ICAgICAgICAgICAgICAgICAgICAgMHgwM2NjICAvKiBVKzAxMTYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19JbWFjcm9uICAgICAgICAgICAgICAgICAgICAgICAweDAzY2YgIC8qIFUrMDEyQSBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggTUFDUk9OICovCisjZGVmaW5lIFhLX05jZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDNkMSAgLyogVSswMTQ1IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX09tYWNyb24gICAgICAgICAgICAgICAgICAgICAgIDB4MDNkMiAgLyogVSswMTRDIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST04gKi8KKyNkZWZpbmUgWEtfS2NlZGlsbGEgICAgICAgICAgICAgICAgICAgICAgMHgwM2QzICAvKiBVKzAxMzYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEgKi8KKyNkZWZpbmUgWEtfVW9nb25layAgICAgICAgICAgICAgICAgICAgICAgMHgwM2Q5ICAvKiBVKzAxNzIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE9HT05FSyAqLworI2RlZmluZSBYS19VdGlsZGUgICAgICAgICAgICAgICAgICAgICAgICAweDAzZGQgIC8qIFUrMDE2OCBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfVW1hY3JvbiAgICAgICAgICAgICAgICAgICAgICAgMHgwM2RlICAvKiBVKzAxNkEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE1BQ1JPTiAqLworI2RlZmluZSBYS19hbWFjcm9uICAgICAgICAgICAgICAgICAgICAgICAweDAzZTAgIC8qIFUrMDEwMSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE1BQ1JPTiAqLworI2RlZmluZSBYS19pb2dvbmVrICAgICAgICAgICAgICAgICAgICAgICAweDAzZTcgIC8qIFUrMDEyRiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE9HT05FSyAqLworI2RlZmluZSBYS19lYWJvdmVkb3QgICAgICAgICAgICAgICAgICAgICAweDAzZWMgIC8qIFUrMDExNyBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19pbWFjcm9uICAgICAgICAgICAgICAgICAgICAgICAweDAzZWYgIC8qIFUrMDEyQiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE1BQ1JPTiAqLworI2RlZmluZSBYS19uY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAzZjEgIC8qIFUrMDE0NiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENFRElMTEEgKi8KKyNkZWZpbmUgWEtfb21hY3JvbiAgICAgICAgICAgICAgICAgICAgICAgMHgwM2YyICAvKiBVKzAxNEQgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST04gKi8KKyNkZWZpbmUgWEtfa2NlZGlsbGEgICAgICAgICAgICAgICAgICAgICAgMHgwM2YzICAvKiBVKzAxMzcgTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX3VvZ29uZWsgICAgICAgICAgICAgICAgICAgICAgIDB4MDNmOSAgLyogVSswMTczIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggT0dPTkVLICovCisjZGVmaW5lIFhLX3V0aWxkZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNmZCAgLyogVSswMTY5IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfdW1hY3JvbiAgICAgICAgICAgICAgICAgICAgICAgMHgwM2ZlICAvKiBVKzAxNkIgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST04gKi8KKyNlbmRpZiAvKiBYS19MQVRJTjQgKi8KKworLyoKKyAqIExhdGluIDgKKyAqLworI2lmZGVmIFhLX0xBVElOOAorI2RlZmluZSBYS19XY2lyY3VtZmxleCAgICAgICAgICAgICAgICAweDEwMDAxNzQgIC8qIFUrMDE3NCBMQVRJTiBDQVBJVEFMIExFVFRFUiBXIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS193Y2lyY3VtZmxleCAgICAgICAgICAgICAgICAweDEwMDAxNzUgIC8qIFUrMDE3NSBMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfWWNpcmN1bWZsZXggICAgICAgICAgICAgICAgMHgxMDAwMTc2ICAvKiBVKzAxNzYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfeWNpcmN1bWZsZXggICAgICAgICAgICAgICAgMHgxMDAwMTc3ICAvKiBVKzAxNzcgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX0JhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWUwMiAgLyogVSsxRTAyIExBVElOIENBUElUQUwgTEVUVEVSIEIgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfYmFib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZTAzICAvKiBVKzFFMDMgTEFUSU4gU01BTEwgTEVUVEVSIEIgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfRGFib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZTBhICAvKiBVKzFFMEEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19kYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlMGIgIC8qIFUrMUUwQiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19GYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlMWUgIC8qIFUrMUUxRSBMQVRJTiBDQVBJVEFMIExFVFRFUiBGIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX2ZhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWUxZiAgLyogVSsxRTFGIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX01hYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU0MCAgLyogVSsxRTQwIExBVElOIENBUElUQUwgTEVUVEVSIE0gV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfbWFib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZTQxICAvKiBVKzFFNDEgTEFUSU4gU01BTEwgTEVUVEVSIE0gV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfUGFib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZTU2ICAvKiBVKzFFNTYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUCBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19wYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlNTcgIC8qIFUrMUU1NyBMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19TYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlNjAgIC8qIFUrMUU2MCBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX3NhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU2MSAgLyogVSsxRTYxIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX1RhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU2YSAgLyogVSsxRTZBIExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfdGFib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZTZiICAvKiBVKzFFNkIgTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfV2dyYXZlICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZTgwICAvKiBVKzFFODAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEdSQVZFICovCisjZGVmaW5lIFhLX3dncmF2ZSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWU4MSAgLyogVSsxRTgxIExBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggR1JBVkUgKi8KKyNkZWZpbmUgWEtfV2FjdXRlICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZTgyICAvKiBVKzFFODIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX3dhY3V0ZSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWU4MyAgLyogVSsxRTgzIExBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfV2RpYWVyZXNpcyAgICAgICAgICAgICAgICAgMHgxMDAxZTg0ICAvKiBVKzFFODQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIERJQUVSRVNJUyAqLworI2RlZmluZSBYS193ZGlhZXJlc2lzICAgICAgICAgICAgICAgICAweDEwMDFlODUgIC8qIFUrMUU4NSBMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIERJQUVSRVNJUyAqLworI2RlZmluZSBYS19ZZ3JhdmUgICAgICAgICAgICAgICAgICAgICAweDEwMDFlZjIgIC8qIFUrMUVGMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggR1JBVkUgKi8KKyNkZWZpbmUgWEtfeWdyYXZlICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWYzICAvKiBVKzFFRjMgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBHUkFWRSAqLworI2VuZGlmIC8qIFhLX0xBVElOOCAqLworCisvKgorICogTGF0aW4gOQorICogQnl0ZSAzID0gMHgxMworICovCisKKyNpZmRlZiBYS19MQVRJTjkKKyNkZWZpbmUgWEtfT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxM2JjICAvKiBVKzAxNTIgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRSAqLworI2RlZmluZSBYS19vZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEzYmQgIC8qIFUrMDE1MyBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRSAqLworI2RlZmluZSBYS19ZZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDEzYmUgIC8qIFUrMDE3OCBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTICovCisjZW5kaWYgLyogWEtfTEFUSU45ICovCisKKy8qCisgKiBLYXRha2FuYQorICogQnl0ZSAzID0gNAorICovCisKKyNpZmRlZiBYS19LQVRBS0FOQQorI2RlZmluZSBYS19vdmVybGluZSAgICAgICAgICAgICAgICAgICAgICAweDA0N2UgIC8qIFUrMjAzRSBPVkVSTElORSAqLworI2RlZmluZSBYS19rYW5hX2Z1bGxzdG9wICAgICAgICAgICAgICAgICAweDA0YTEgIC8qIFUrMzAwMiBJREVPR1JBUEhJQyBGVUxMIFNUT1AgKi8KKyNkZWZpbmUgWEtfa2FuYV9vcGVuaW5nYnJhY2tldCAgICAgICAgICAgMHgwNGEyICAvKiBVKzMwMEMgTEVGVCBDT1JORVIgQlJBQ0tFVCAqLworI2RlZmluZSBYS19rYW5hX2Nsb3NpbmdicmFja2V0ICAgICAgICAgICAweDA0YTMgIC8qIFUrMzAwRCBSSUdIVCBDT1JORVIgQlJBQ0tFVCAqLworI2RlZmluZSBYS19rYW5hX2NvbW1hICAgICAgICAgICAgICAgICAgICAweDA0YTQgIC8qIFUrMzAwMSBJREVPR1JBUEhJQyBDT01NQSAqLworI2RlZmluZSBYS19rYW5hX2Nvbmp1bmN0aXZlICAgICAgICAgICAgICAweDA0YTUgIC8qIFUrMzBGQiBLQVRBS0FOQSBNSURETEUgRE9UICovCisjZGVmaW5lIFhLX2thbmFfbWlkZGxlZG90ICAgICAgICAgICAgICAgIDB4MDRhNSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19rYW5hX1dPICAgICAgICAgICAgICAgICAgICAgICAweDA0YTYgIC8qIFUrMzBGMiBLQVRBS0FOQSBMRVRURVIgV08gKi8KKyNkZWZpbmUgWEtfa2FuYV9hICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGE3ICAvKiBVKzMwQTEgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIEEgKi8KKyNkZWZpbmUgWEtfa2FuYV9pICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGE4ICAvKiBVKzMwQTMgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIEkgKi8KKyNkZWZpbmUgWEtfa2FuYV91ICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGE5ICAvKiBVKzMwQTUgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIFUgKi8KKyNkZWZpbmUgWEtfa2FuYV9lICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGFhICAvKiBVKzMwQTcgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIEUgKi8KKyNkZWZpbmUgWEtfa2FuYV9vICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGFiICAvKiBVKzMwQTkgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIE8gKi8KKyNkZWZpbmUgWEtfa2FuYV95YSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGFjICAvKiBVKzMwRTMgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIFlBICovCisjZGVmaW5lIFhLX2thbmFfeXUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRhZCAgLyogVSszMEU1IEtBVEFLQU5BIExFVFRFUiBTTUFMTCBZVSAqLworI2RlZmluZSBYS19rYW5hX3lvICAgICAgICAgICAgICAgICAgICAgICAweDA0YWUgIC8qIFUrMzBFNyBLQVRBS0FOQSBMRVRURVIgU01BTEwgWU8gKi8KKyNkZWZpbmUgWEtfa2FuYV90c3UgICAgICAgICAgICAgICAgICAgICAgMHgwNGFmICAvKiBVKzMwQzMgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIFRVICovCisjZGVmaW5lIFhLX2thbmFfdHUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRhZiAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19wcm9sb25nZWRzb3VuZCAgICAgICAgICAgICAgICAweDA0YjAgIC8qIFUrMzBGQyBLQVRBS0FOQS1ISVJBR0FOQSBQUk9MT05HRUQgU09VTkQgTUFSSyAqLworI2RlZmluZSBYS19rYW5hX0EgICAgICAgICAgICAgICAgICAgICAgICAweDA0YjEgIC8qIFUrMzBBMiBLQVRBS0FOQSBMRVRURVIgQSAqLworI2RlZmluZSBYS19rYW5hX0kgICAgICAgICAgICAgICAgICAgICAgICAweDA0YjIgIC8qIFUrMzBBNCBLQVRBS0FOQSBMRVRURVIgSSAqLworI2RlZmluZSBYS19rYW5hX1UgICAgICAgICAgICAgICAgICAgICAgICAweDA0YjMgIC8qIFUrMzBBNiBLQVRBS0FOQSBMRVRURVIgVSAqLworI2RlZmluZSBYS19rYW5hX0UgICAgICAgICAgICAgICAgICAgICAgICAweDA0YjQgIC8qIFUrMzBBOCBLQVRBS0FOQSBMRVRURVIgRSAqLworI2RlZmluZSBYS19rYW5hX08gICAgICAgICAgICAgICAgICAgICAgICAweDA0YjUgIC8qIFUrMzBBQSBLQVRBS0FOQSBMRVRURVIgTyAqLworI2RlZmluZSBYS19rYW5hX0tBICAgICAgICAgICAgICAgICAgICAgICAweDA0YjYgIC8qIFUrMzBBQiBLQVRBS0FOQSBMRVRURVIgS0EgKi8KKyNkZWZpbmUgWEtfa2FuYV9LSSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGI3ICAvKiBVKzMwQUQgS0FUQUtBTkEgTEVUVEVSIEtJICovCisjZGVmaW5lIFhLX2thbmFfS1UgICAgICAgICAgICAgICAgICAgICAgIDB4MDRiOCAgLyogVSszMEFGIEtBVEFLQU5BIExFVFRFUiBLVSAqLworI2RlZmluZSBYS19rYW5hX0tFICAgICAgICAgICAgICAgICAgICAgICAweDA0YjkgIC8qIFUrMzBCMSBLQVRBS0FOQSBMRVRURVIgS0UgKi8KKyNkZWZpbmUgWEtfa2FuYV9LTyAgICAgICAgICAgICAgICAgICAgICAgMHgwNGJhICAvKiBVKzMwQjMgS0FUQUtBTkEgTEVUVEVSIEtPICovCisjZGVmaW5lIFhLX2thbmFfU0EgICAgICAgICAgICAgICAgICAgICAgIDB4MDRiYiAgLyogVSszMEI1IEtBVEFLQU5BIExFVFRFUiBTQSAqLworI2RlZmluZSBYS19rYW5hX1NISSAgICAgICAgICAgICAgICAgICAgICAweDA0YmMgIC8qIFUrMzBCNyBLQVRBS0FOQSBMRVRURVIgU0kgKi8KKyNkZWZpbmUgWEtfa2FuYV9TVSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGJkICAvKiBVKzMwQjkgS0FUQUtBTkEgTEVUVEVSIFNVICovCisjZGVmaW5lIFhLX2thbmFfU0UgICAgICAgICAgICAgICAgICAgICAgIDB4MDRiZSAgLyogVSszMEJCIEtBVEFLQU5BIExFVFRFUiBTRSAqLworI2RlZmluZSBYS19rYW5hX1NPICAgICAgICAgICAgICAgICAgICAgICAweDA0YmYgIC8qIFUrMzBCRCBLQVRBS0FOQSBMRVRURVIgU08gKi8KKyNkZWZpbmUgWEtfa2FuYV9UQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGMwICAvKiBVKzMwQkYgS0FUQUtBTkEgTEVUVEVSIFRBICovCisjZGVmaW5lIFhLX2thbmFfQ0hJICAgICAgICAgICAgICAgICAgICAgIDB4MDRjMSAgLyogVSszMEMxIEtBVEFLQU5BIExFVFRFUiBUSSAqLworI2RlZmluZSBYS19rYW5hX1RJICAgICAgICAgICAgICAgICAgICAgICAweDA0YzEgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfa2FuYV9UU1UgICAgICAgICAgICAgICAgICAgICAgMHgwNGMyICAvKiBVKzMwQzQgS0FUQUtBTkEgTEVUVEVSIFRVICovCisjZGVmaW5lIFhLX2thbmFfVFUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjMiAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19rYW5hX1RFICAgICAgICAgICAgICAgICAgICAgICAweDA0YzMgIC8qIFUrMzBDNiBLQVRBS0FOQSBMRVRURVIgVEUgKi8KKyNkZWZpbmUgWEtfa2FuYV9UTyAgICAgICAgICAgICAgICAgICAgICAgMHgwNGM0ICAvKiBVKzMwQzggS0FUQUtBTkEgTEVUVEVSIFRPICovCisjZGVmaW5lIFhLX2thbmFfTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjNSAgLyogVSszMENBIEtBVEFLQU5BIExFVFRFUiBOQSAqLworI2RlZmluZSBYS19rYW5hX05JICAgICAgICAgICAgICAgICAgICAgICAweDA0YzYgIC8qIFUrMzBDQiBLQVRBS0FOQSBMRVRURVIgTkkgKi8KKyNkZWZpbmUgWEtfa2FuYV9OVSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGM3ICAvKiBVKzMwQ0MgS0FUQUtBTkEgTEVUVEVSIE5VICovCisjZGVmaW5lIFhLX2thbmFfTkUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjOCAgLyogVSszMENEIEtBVEFLQU5BIExFVFRFUiBORSAqLworI2RlZmluZSBYS19rYW5hX05PICAgICAgICAgICAgICAgICAgICAgICAweDA0YzkgIC8qIFUrMzBDRSBLQVRBS0FOQSBMRVRURVIgTk8gKi8KKyNkZWZpbmUgWEtfa2FuYV9IQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGNhICAvKiBVKzMwQ0YgS0FUQUtBTkEgTEVUVEVSIEhBICovCisjZGVmaW5lIFhLX2thbmFfSEkgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjYiAgLyogVSszMEQyIEtBVEFLQU5BIExFVFRFUiBISSAqLworI2RlZmluZSBYS19rYW5hX0ZVICAgICAgICAgICAgICAgICAgICAgICAweDA0Y2MgIC8qIFUrMzBENSBLQVRBS0FOQSBMRVRURVIgSFUgKi8KKyNkZWZpbmUgWEtfa2FuYV9IVSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGNjICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2thbmFfSEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjZCAgLyogVSszMEQ4IEtBVEFLQU5BIExFVFRFUiBIRSAqLworI2RlZmluZSBYS19rYW5hX0hPICAgICAgICAgICAgICAgICAgICAgICAweDA0Y2UgIC8qIFUrMzBEQiBLQVRBS0FOQSBMRVRURVIgSE8gKi8KKyNkZWZpbmUgWEtfa2FuYV9NQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGNmICAvKiBVKzMwREUgS0FUQUtBTkEgTEVUVEVSIE1BICovCisjZGVmaW5lIFhLX2thbmFfTUkgICAgICAgICAgICAgICAgICAgICAgIDB4MDRkMCAgLyogVSszMERGIEtBVEFLQU5BIExFVFRFUiBNSSAqLworI2RlZmluZSBYS19rYW5hX01VICAgICAgICAgICAgICAgICAgICAgICAweDA0ZDEgIC8qIFUrMzBFMCBLQVRBS0FOQSBMRVRURVIgTVUgKi8KKyNkZWZpbmUgWEtfa2FuYV9NRSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGQyICAvKiBVKzMwRTEgS0FUQUtBTkEgTEVUVEVSIE1FICovCisjZGVmaW5lIFhLX2thbmFfTU8gICAgICAgICAgICAgICAgICAgICAgIDB4MDRkMyAgLyogVSszMEUyIEtBVEFLQU5BIExFVFRFUiBNTyAqLworI2RlZmluZSBYS19rYW5hX1lBICAgICAgICAgICAgICAgICAgICAgICAweDA0ZDQgIC8qIFUrMzBFNCBLQVRBS0FOQSBMRVRURVIgWUEgKi8KKyNkZWZpbmUgWEtfa2FuYV9ZVSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGQ1ICAvKiBVKzMwRTYgS0FUQUtBTkEgTEVUVEVSIFlVICovCisjZGVmaW5lIFhLX2thbmFfWU8gICAgICAgICAgICAgICAgICAgICAgIDB4MDRkNiAgLyogVSszMEU4IEtBVEFLQU5BIExFVFRFUiBZTyAqLworI2RlZmluZSBYS19rYW5hX1JBICAgICAgICAgICAgICAgICAgICAgICAweDA0ZDcgIC8qIFUrMzBFOSBLQVRBS0FOQSBMRVRURVIgUkEgKi8KKyNkZWZpbmUgWEtfa2FuYV9SSSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGQ4ICAvKiBVKzMwRUEgS0FUQUtBTkEgTEVUVEVSIFJJICovCisjZGVmaW5lIFhLX2thbmFfUlUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRkOSAgLyogVSszMEVCIEtBVEFLQU5BIExFVFRFUiBSVSAqLworI2RlZmluZSBYS19rYW5hX1JFICAgICAgICAgICAgICAgICAgICAgICAweDA0ZGEgIC8qIFUrMzBFQyBLQVRBS0FOQSBMRVRURVIgUkUgKi8KKyNkZWZpbmUgWEtfa2FuYV9STyAgICAgICAgICAgICAgICAgICAgICAgMHgwNGRiICAvKiBVKzMwRUQgS0FUQUtBTkEgTEVUVEVSIFJPICovCisjZGVmaW5lIFhLX2thbmFfV0EgICAgICAgICAgICAgICAgICAgICAgIDB4MDRkYyAgLyogVSszMEVGIEtBVEFLQU5BIExFVFRFUiBXQSAqLworI2RlZmluZSBYS19rYW5hX04gICAgICAgICAgICAgICAgICAgICAgICAweDA0ZGQgIC8qIFUrMzBGMyBLQVRBS0FOQSBMRVRURVIgTiAqLworI2RlZmluZSBYS192b2ljZWRzb3VuZCAgICAgICAgICAgICAgICAgICAweDA0ZGUgIC8qIFUrMzA5QiBLQVRBS0FOQS1ISVJBR0FOQSBWT0lDRUQgU09VTkQgTUFSSyAqLworI2RlZmluZSBYS19zZW1pdm9pY2Vkc291bmQgICAgICAgICAgICAgICAweDA0ZGYgIC8qIFUrMzA5QyBLQVRBS0FOQS1ISVJBR0FOQSBTRU1JLVZPSUNFRCBTT1VORCBNQVJLICovCisjZGVmaW5lIFhLX2thbmFfc3dpdGNoICAgICAgICAgICAgICAgICAgIDB4ZmY3ZSAgLyogQWxpYXMgZm9yIG1vZGVfc3dpdGNoICovCisjZW5kaWYgLyogWEtfS0FUQUtBTkEgKi8KKworLyoKKyAqIEFyYWJpYworICogQnl0ZSAzID0gNQorICovCisKKyNpZmRlZiBYS19BUkFCSUMKKyNkZWZpbmUgWEtfRmFyc2lfMCAgICAgICAgICAgICAgICAgICAgMHgxMDAwNmYwICAvKiBVKzA2RjAgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFpFUk8gKi8KKyNkZWZpbmUgWEtfRmFyc2lfMSAgICAgICAgICAgICAgICAgICAgMHgxMDAwNmYxICAvKiBVKzA2RjEgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIE9ORSAqLworI2RlZmluZSBYS19GYXJzaV8yICAgICAgICAgICAgICAgICAgICAweDEwMDA2ZjIgIC8qIFUrMDZGMiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgVFdPICovCisjZGVmaW5lIFhLX0ZhcnNpXzMgICAgICAgICAgICAgICAgICAgIDB4MTAwMDZmMyAgLyogVSswNkYzIEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBUSFJFRSAqLworI2RlZmluZSBYS19GYXJzaV80ICAgICAgICAgICAgICAgICAgICAweDEwMDA2ZjQgIC8qIFUrMDZGNCBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgRk9VUiAqLworI2RlZmluZSBYS19GYXJzaV81ICAgICAgICAgICAgICAgICAgICAweDEwMDA2ZjUgIC8qIFUrMDZGNSBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgRklWRSAqLworI2RlZmluZSBYS19GYXJzaV82ICAgICAgICAgICAgICAgICAgICAweDEwMDA2ZjYgIC8qIFUrMDZGNiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgU0lYICovCisjZGVmaW5lIFhLX0ZhcnNpXzcgICAgICAgICAgICAgICAgICAgIDB4MTAwMDZmNyAgLyogVSswNkY3IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBTRVZFTiAqLworI2RlZmluZSBYS19GYXJzaV84ICAgICAgICAgICAgICAgICAgICAweDEwMDA2ZjggIC8qIFUrMDZGOCBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgRUlHSFQgKi8KKyNkZWZpbmUgWEtfRmFyc2lfOSAgICAgICAgICAgICAgICAgICAgMHgxMDAwNmY5ICAvKiBVKzA2RjkgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIE5JTkUgKi8KKyNkZWZpbmUgWEtfQXJhYmljX3BlcmNlbnQgICAgICAgICAgICAgMHgxMDAwNjZhICAvKiBVKzA2NkEgQVJBQklDIFBFUkNFTlQgU0lHTiAqLworI2RlZmluZSBYS19BcmFiaWNfc3VwZXJzY3JpcHRfYWxlZiAgICAweDEwMDA2NzAgIC8qIFUrMDY3MCBBUkFCSUMgTEVUVEVSIFNVUEVSU0NSSVBUIEFMRUYgKi8KKyNkZWZpbmUgWEtfQXJhYmljX3R0ZWggICAgICAgICAgICAgICAgMHgxMDAwNjc5ICAvKiBVKzA2NzkgQVJBQklDIExFVFRFUiBUVEVIICovCisjZGVmaW5lIFhLX0FyYWJpY19wZWggICAgICAgICAgICAgICAgIDB4MTAwMDY3ZSAgLyogVSswNjdFIEFSQUJJQyBMRVRURVIgUEVIICovCisjZGVmaW5lIFhLX0FyYWJpY190Y2hlaCAgICAgICAgICAgICAgIDB4MTAwMDY4NiAgLyogVSswNjg2IEFSQUJJQyBMRVRURVIgVENIRUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX2RkYWwgICAgICAgICAgICAgICAgMHgxMDAwNjg4ICAvKiBVKzA2ODggQVJBQklDIExFVFRFUiBEREFMICovCisjZGVmaW5lIFhLX0FyYWJpY19ycmVoICAgICAgICAgICAgICAgIDB4MTAwMDY5MSAgLyogVSswNjkxIEFSQUJJQyBMRVRURVIgUlJFSCAqLworI2RlZmluZSBYS19BcmFiaWNfY29tbWEgICAgICAgICAgICAgICAgICAweDA1YWMgIC8qIFUrMDYwQyBBUkFCSUMgQ09NTUEgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2Z1bGxzdG9wICAgICAgICAgICAgMHgxMDAwNmQ0ICAvKiBVKzA2RDQgQVJBQklDIEZVTEwgU1RPUCAqLworI2RlZmluZSBYS19BcmFiaWNfMCAgICAgICAgICAgICAgICAgICAweDEwMDA2NjAgIC8qIFUrMDY2MCBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTyAqLworI2RlZmluZSBYS19BcmFiaWNfMSAgICAgICAgICAgICAgICAgICAweDEwMDA2NjEgIC8qIFUrMDY2MSBBUkFCSUMtSU5ESUMgRElHSVQgT05FICovCisjZGVmaW5lIFhLX0FyYWJpY18yICAgICAgICAgICAgICAgICAgIDB4MTAwMDY2MiAgLyogVSswNjYyIEFSQUJJQy1JTkRJQyBESUdJVCBUV08gKi8KKyNkZWZpbmUgWEtfQXJhYmljXzMgICAgICAgICAgICAgICAgICAgMHgxMDAwNjYzICAvKiBVKzA2NjMgQVJBQklDLUlORElDIERJR0lUIFRIUkVFICovCisjZGVmaW5lIFhLX0FyYWJpY180ICAgICAgICAgICAgICAgICAgIDB4MTAwMDY2NCAgLyogVSswNjY0IEFSQUJJQy1JTkRJQyBESUdJVCBGT1VSICovCisjZGVmaW5lIFhLX0FyYWJpY181ICAgICAgICAgICAgICAgICAgIDB4MTAwMDY2NSAgLyogVSswNjY1IEFSQUJJQy1JTkRJQyBESUdJVCBGSVZFICovCisjZGVmaW5lIFhLX0FyYWJpY182ICAgICAgICAgICAgICAgICAgIDB4MTAwMDY2NiAgLyogVSswNjY2IEFSQUJJQy1JTkRJQyBESUdJVCBTSVggKi8KKyNkZWZpbmUgWEtfQXJhYmljXzcgICAgICAgICAgICAgICAgICAgMHgxMDAwNjY3ICAvKiBVKzA2NjcgQVJBQklDLUlORElDIERJR0lUIFNFVkVOICovCisjZGVmaW5lIFhLX0FyYWJpY184ICAgICAgICAgICAgICAgICAgIDB4MTAwMDY2OCAgLyogVSswNjY4IEFSQUJJQy1JTkRJQyBESUdJVCBFSUdIVCAqLworI2RlZmluZSBYS19BcmFiaWNfOSAgICAgICAgICAgICAgICAgICAweDEwMDA2NjkgIC8qIFUrMDY2OSBBUkFCSUMtSU5ESUMgRElHSVQgTklORSAqLworI2RlZmluZSBYS19BcmFiaWNfc2VtaWNvbG9uICAgICAgICAgICAgICAweDA1YmIgIC8qIFUrMDYxQiBBUkFCSUMgU0VNSUNPTE9OICovCisjZGVmaW5lIFhLX0FyYWJpY19xdWVzdGlvbl9tYXJrICAgICAgICAgIDB4MDViZiAgLyogVSswNjFGIEFSQUJJQyBRVUVTVElPTiBNQVJLICovCisjZGVmaW5lIFhLX0FyYWJpY19oYW16YSAgICAgICAgICAgICAgICAgIDB4MDVjMSAgLyogVSswNjIxIEFSQUJJQyBMRVRURVIgSEFNWkEgKi8KKyNkZWZpbmUgWEtfQXJhYmljX21hZGRhb25hbGVmICAgICAgICAgICAgMHgwNWMyICAvKiBVKzA2MjIgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggTUFEREEgQUJPVkUgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2hhbXphb25hbGVmICAgICAgICAgICAgMHgwNWMzICAvKiBVKzA2MjMgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2hhbXphb253YXcgICAgICAgICAgICAgMHgwNWM0ICAvKiBVKzA2MjQgQVJBQklDIExFVFRFUiBXQVcgV0lUSCBIQU1aQSBBQk9WRSAqLworI2RlZmluZSBYS19BcmFiaWNfaGFtemF1bmRlcmFsZWYgICAgICAgICAweDA1YzUgIC8qIFUrMDYyNSBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBCRUxPVyAqLworI2RlZmluZSBYS19BcmFiaWNfaGFtemFvbnllaCAgICAgICAgICAgICAweDA1YzYgIC8qIFUrMDYyNiBBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFICovCisjZGVmaW5lIFhLX0FyYWJpY19hbGVmICAgICAgICAgICAgICAgICAgIDB4MDVjNyAgLyogVSswNjI3IEFSQUJJQyBMRVRURVIgQUxFRiAqLworI2RlZmluZSBYS19BcmFiaWNfYmVoICAgICAgICAgICAgICAgICAgICAweDA1YzggIC8qIFUrMDYyOCBBUkFCSUMgTEVUVEVSIEJFSCAqLworI2RlZmluZSBYS19BcmFiaWNfdGVobWFyYnV0YSAgICAgICAgICAgICAweDA1YzkgIC8qIFUrMDYyOSBBUkFCSUMgTEVUVEVSIFRFSCBNQVJCVVRBICovCisjZGVmaW5lIFhLX0FyYWJpY190ZWggICAgICAgICAgICAgICAgICAgIDB4MDVjYSAgLyogVSswNjJBIEFSQUJJQyBMRVRURVIgVEVIICovCisjZGVmaW5lIFhLX0FyYWJpY190aGVoICAgICAgICAgICAgICAgICAgIDB4MDVjYiAgLyogVSswNjJCIEFSQUJJQyBMRVRURVIgVEhFSCAqLworI2RlZmluZSBYS19BcmFiaWNfamVlbSAgICAgICAgICAgICAgICAgICAweDA1Y2MgIC8qIFUrMDYyQyBBUkFCSUMgTEVUVEVSIEpFRU0gKi8KKyNkZWZpbmUgWEtfQXJhYmljX2hhaCAgICAgICAgICAgICAgICAgICAgMHgwNWNkICAvKiBVKzA2MkQgQVJBQklDIExFVFRFUiBIQUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX2toYWggICAgICAgICAgICAgICAgICAgMHgwNWNlICAvKiBVKzA2MkUgQVJBQklDIExFVFRFUiBLSEFIICovCisjZGVmaW5lIFhLX0FyYWJpY19kYWwgICAgICAgICAgICAgICAgICAgIDB4MDVjZiAgLyogVSswNjJGIEFSQUJJQyBMRVRURVIgREFMICovCisjZGVmaW5lIFhLX0FyYWJpY190aGFsICAgICAgICAgICAgICAgICAgIDB4MDVkMCAgLyogVSswNjMwIEFSQUJJQyBMRVRURVIgVEhBTCAqLworI2RlZmluZSBYS19BcmFiaWNfcmEgICAgICAgICAgICAgICAgICAgICAweDA1ZDEgIC8qIFUrMDYzMSBBUkFCSUMgTEVUVEVSIFJFSCAqLworI2RlZmluZSBYS19BcmFiaWNfemFpbiAgICAgICAgICAgICAgICAgICAweDA1ZDIgIC8qIFUrMDYzMiBBUkFCSUMgTEVUVEVSIFpBSU4gKi8KKyNkZWZpbmUgWEtfQXJhYmljX3NlZW4gICAgICAgICAgICAgICAgICAgMHgwNWQzICAvKiBVKzA2MzMgQVJBQklDIExFVFRFUiBTRUVOICovCisjZGVmaW5lIFhLX0FyYWJpY19zaGVlbiAgICAgICAgICAgICAgICAgIDB4MDVkNCAgLyogVSswNjM0IEFSQUJJQyBMRVRURVIgU0hFRU4gKi8KKyNkZWZpbmUgWEtfQXJhYmljX3NhZCAgICAgICAgICAgICAgICAgICAgMHgwNWQ1ICAvKiBVKzA2MzUgQVJBQklDIExFVFRFUiBTQUQgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2RhZCAgICAgICAgICAgICAgICAgICAgMHgwNWQ2ICAvKiBVKzA2MzYgQVJBQklDIExFVFRFUiBEQUQgKi8KKyNkZWZpbmUgWEtfQXJhYmljX3RhaCAgICAgICAgICAgICAgICAgICAgMHgwNWQ3ICAvKiBVKzA2MzcgQVJBQklDIExFVFRFUiBUQUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX3phaCAgICAgICAgICAgICAgICAgICAgMHgwNWQ4ICAvKiBVKzA2MzggQVJBQklDIExFVFRFUiBaQUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX2FpbiAgICAgICAgICAgICAgICAgICAgMHgwNWQ5ICAvKiBVKzA2MzkgQVJBQklDIExFVFRFUiBBSU4gKi8KKyNkZWZpbmUgWEtfQXJhYmljX2doYWluICAgICAgICAgICAgICAgICAgMHgwNWRhICAvKiBVKzA2M0EgQVJBQklDIExFVFRFUiBHSEFJTiAqLworI2RlZmluZSBYS19BcmFiaWNfdGF0d2VlbCAgICAgICAgICAgICAgICAweDA1ZTAgIC8qIFUrMDY0MCBBUkFCSUMgVEFUV0VFTCAqLworI2RlZmluZSBYS19BcmFiaWNfZmVoICAgICAgICAgICAgICAgICAgICAweDA1ZTEgIC8qIFUrMDY0MSBBUkFCSUMgTEVUVEVSIEZFSCAqLworI2RlZmluZSBYS19BcmFiaWNfcWFmICAgICAgICAgICAgICAgICAgICAweDA1ZTIgIC8qIFUrMDY0MiBBUkFCSUMgTEVUVEVSIFFBRiAqLworI2RlZmluZSBYS19BcmFiaWNfa2FmICAgICAgICAgICAgICAgICAgICAweDA1ZTMgIC8qIFUrMDY0MyBBUkFCSUMgTEVUVEVSIEtBRiAqLworI2RlZmluZSBYS19BcmFiaWNfbGFtICAgICAgICAgICAgICAgICAgICAweDA1ZTQgIC8qIFUrMDY0NCBBUkFCSUMgTEVUVEVSIExBTSAqLworI2RlZmluZSBYS19BcmFiaWNfbWVlbSAgICAgICAgICAgICAgICAgICAweDA1ZTUgIC8qIFUrMDY0NSBBUkFCSUMgTEVUVEVSIE1FRU0gKi8KKyNkZWZpbmUgWEtfQXJhYmljX25vb24gICAgICAgICAgICAgICAgICAgMHgwNWU2ICAvKiBVKzA2NDYgQVJBQklDIExFVFRFUiBOT09OICovCisjZGVmaW5lIFhLX0FyYWJpY19oYSAgICAgICAgICAgICAgICAgICAgIDB4MDVlNyAgLyogVSswNjQ3IEFSQUJJQyBMRVRURVIgSEVIICovCisjZGVmaW5lIFhLX0FyYWJpY19oZWggICAgICAgICAgICAgICAgICAgIDB4MDVlNyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19BcmFiaWNfd2F3ICAgICAgICAgICAgICAgICAgICAweDA1ZTggIC8qIFUrMDY0OCBBUkFCSUMgTEVUVEVSIFdBVyAqLworI2RlZmluZSBYS19BcmFiaWNfYWxlZm1ha3N1cmEgICAgICAgICAgICAweDA1ZTkgIC8qIFUrMDY0OSBBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQSAqLworI2RlZmluZSBYS19BcmFiaWNfeWVoICAgICAgICAgICAgICAgICAgICAweDA1ZWEgIC8qIFUrMDY0QSBBUkFCSUMgTEVUVEVSIFlFSCAqLworI2RlZmluZSBYS19BcmFiaWNfZmF0aGF0YW4gICAgICAgICAgICAgICAweDA1ZWIgIC8qIFUrMDY0QiBBUkFCSUMgRkFUSEFUQU4gKi8KKyNkZWZpbmUgWEtfQXJhYmljX2RhbW1hdGFuICAgICAgICAgICAgICAgMHgwNWVjICAvKiBVKzA2NEMgQVJBQklDIERBTU1BVEFOICovCisjZGVmaW5lIFhLX0FyYWJpY19rYXNyYXRhbiAgICAgICAgICAgICAgIDB4MDVlZCAgLyogVSswNjREIEFSQUJJQyBLQVNSQVRBTiAqLworI2RlZmluZSBYS19BcmFiaWNfZmF0aGEgICAgICAgICAgICAgICAgICAweDA1ZWUgIC8qIFUrMDY0RSBBUkFCSUMgRkFUSEEgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2RhbW1hICAgICAgICAgICAgICAgICAgMHgwNWVmICAvKiBVKzA2NEYgQVJBQklDIERBTU1BICovCisjZGVmaW5lIFhLX0FyYWJpY19rYXNyYSAgICAgICAgICAgICAgICAgIDB4MDVmMCAgLyogVSswNjUwIEFSQUJJQyBLQVNSQSAqLworI2RlZmluZSBYS19BcmFiaWNfc2hhZGRhICAgICAgICAgICAgICAgICAweDA1ZjEgIC8qIFUrMDY1MSBBUkFCSUMgU0hBRERBICovCisjZGVmaW5lIFhLX0FyYWJpY19zdWt1biAgICAgICAgICAgICAgICAgIDB4MDVmMiAgLyogVSswNjUyIEFSQUJJQyBTVUtVTiAqLworI2RlZmluZSBYS19BcmFiaWNfbWFkZGFfYWJvdmUgICAgICAgICAweDEwMDA2NTMgIC8qIFUrMDY1MyBBUkFCSUMgTUFEREFIIEFCT1ZFICovCisjZGVmaW5lIFhLX0FyYWJpY19oYW16YV9hYm92ZSAgICAgICAgIDB4MTAwMDY1NCAgLyogVSswNjU0IEFSQUJJQyBIQU1aQSBBQk9WRSAqLworI2RlZmluZSBYS19BcmFiaWNfaGFtemFfYmVsb3cgICAgICAgICAweDEwMDA2NTUgIC8qIFUrMDY1NSBBUkFCSUMgSEFNWkEgQkVMT1cgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2plaCAgICAgICAgICAgICAgICAgMHgxMDAwNjk4ICAvKiBVKzA2OTggQVJBQklDIExFVFRFUiBKRUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX3ZlaCAgICAgICAgICAgICAgICAgMHgxMDAwNmE0ICAvKiBVKzA2QTQgQVJBQklDIExFVFRFUiBWRUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX2tlaGVoICAgICAgICAgICAgICAgMHgxMDAwNmE5ICAvKiBVKzA2QTkgQVJBQklDIExFVFRFUiBLRUhFSCAqLworI2RlZmluZSBYS19BcmFiaWNfZ2FmICAgICAgICAgICAgICAgICAweDEwMDA2YWYgIC8qIFUrMDZBRiBBUkFCSUMgTEVUVEVSIEdBRiAqLworI2RlZmluZSBYS19BcmFiaWNfbm9vbl9naHVubmEgICAgICAgICAweDEwMDA2YmEgIC8qIFUrMDZCQSBBUkFCSUMgTEVUVEVSIE5PT04gR0hVTk5BICovCisjZGVmaW5lIFhLX0FyYWJpY19oZWhfZG9hY2hhc2htZWUgICAgIDB4MTAwMDZiZSAgLyogVSswNkJFIEFSQUJJQyBMRVRURVIgSEVIIERPQUNIQVNITUVFICovCisjZGVmaW5lIFhLX0ZhcnNpX3llaCAgICAgICAgICAgICAgICAgIDB4MTAwMDZjYyAgLyogVSswNkNDIEFSQUJJQyBMRVRURVIgRkFSU0kgWUVIICovCisjZGVmaW5lIFhLX0FyYWJpY19mYXJzaV95ZWggICAgICAgICAgIDB4MTAwMDZjYyAgLyogVSswNkNDIEFSQUJJQyBMRVRURVIgRkFSU0kgWUVIICovCisjZGVmaW5lIFhLX0FyYWJpY195ZWhfYmFyZWUgICAgICAgICAgIDB4MTAwMDZkMiAgLyogVSswNkQyIEFSQUJJQyBMRVRURVIgWUVIIEJBUlJFRSAqLworI2RlZmluZSBYS19BcmFiaWNfaGVoX2dvYWwgICAgICAgICAgICAweDEwMDA2YzEgIC8qIFUrMDZDMSBBUkFCSUMgTEVUVEVSIEhFSCBHT0FMICovCisjZGVmaW5lIFhLX0FyYWJpY19zd2l0Y2ggICAgICAgICAgICAgICAgIDB4ZmY3ZSAgLyogQWxpYXMgZm9yIG1vZGVfc3dpdGNoICovCisjZW5kaWYgLyogWEtfQVJBQklDICovCisKKy8qCisgKiBDeXJpbGxpYworICogQnl0ZSAzID0gNgorICovCisjaWZkZWYgWEtfQ1lSSUxMSUMKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfR0hFX2JhciAgICAgICAgICAgMHgxMDAwNDkyICAvKiBVKzA0OTIgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2doZV9iYXIgICAgICAgICAgIDB4MTAwMDQ5MyAgLyogVSswNDkzIENZUklMTElDIFNNQUxMIExFVFRFUiBHSEUgV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfWkhFX2Rlc2NlbmRlciAgICAgMHgxMDAwNDk2ICAvKiBVKzA0OTYgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFIFdJVEggREVTQ0VOREVSICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3poZV9kZXNjZW5kZXIgICAgIDB4MTAwMDQ5NyAgLyogVSswNDk3IENZUklMTElDIFNNQUxMIExFVFRFUiBaSEUgV0lUSCBERVNDRU5ERVIgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfS0FfZGVzY2VuZGVyICAgICAgMHgxMDAwNDlhICAvKiBVKzA0OUEgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0EgV0lUSCBERVNDRU5ERVIgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfa2FfZGVzY2VuZGVyICAgICAgMHgxMDAwNDliICAvKiBVKzA0OUIgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBIFdJVEggREVTQ0VOREVSICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0tBX3ZlcnRzdHJva2UgICAgIDB4MTAwMDQ5YyAgLyogVSswNDlDIENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBIFdJVEggVkVSVElDQUwgU1RST0tFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2thX3ZlcnRzdHJva2UgICAgIDB4MTAwMDQ5ZCAgLyogVSswNDlEIENZUklMTElDIFNNQUxMIExFVFRFUiBLQSBXSVRIIFZFUlRJQ0FMIFNUUk9LRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19FTl9kZXNjZW5kZXIgICAgICAweDEwMDA0YTIgIC8qIFUrMDRBMiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTiBXSVRIIERFU0NFTkRFUiAqLworI2RlZmluZSBYS19DeXJpbGxpY19lbl9kZXNjZW5kZXIgICAgICAweDEwMDA0YTMgIC8qIFUrMDRBMyBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU4gV0lUSCBERVNDRU5ERVIgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfVV9zdHJhaWdodCAgICAgICAgMHgxMDAwNGFlICAvKiBVKzA0QUUgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU1RSQUlHSFQgVSAqLworI2RlZmluZSBYS19DeXJpbGxpY191X3N0cmFpZ2h0ICAgICAgICAweDEwMDA0YWYgIC8qIFUrMDRBRiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU1RSQUlHSFQgVSAqLworI2RlZmluZSBYS19DeXJpbGxpY19VX3N0cmFpZ2h0X2JhciAgICAweDEwMDA0YjAgIC8qIFUrMDRCMCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTVFJBSUdIVCBVIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3Vfc3RyYWlnaHRfYmFyICAgIDB4MTAwMDRiMSAgLyogVSswNEIxIENZUklMTElDIFNNQUxMIExFVFRFUiBTVFJBSUdIVCBVIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0hBX2Rlc2NlbmRlciAgICAgIDB4MTAwMDRiMiAgLyogVSswNEIyIENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBIFdJVEggREVTQ0VOREVSICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2hhX2Rlc2NlbmRlciAgICAgIDB4MTAwMDRiMyAgLyogVSswNEIzIENZUklMTElDIFNNQUxMIExFVFRFUiBIQSBXSVRIIERFU0NFTkRFUiAqLworI2RlZmluZSBYS19DeXJpbGxpY19DSEVfZGVzY2VuZGVyICAgICAweDEwMDA0YjYgIC8qIFUrMDRCNiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUgV0lUSCBERVNDRU5ERVIgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfY2hlX2Rlc2NlbmRlciAgICAgMHgxMDAwNGI3ICAvKiBVKzA0QjcgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRSBXSVRIIERFU0NFTkRFUiAqLworI2RlZmluZSBYS19DeXJpbGxpY19DSEVfdmVydHN0cm9rZSAgICAweDEwMDA0YjggIC8qIFUrMDRCOCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUgV0lUSCBWRVJUSUNBTCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfY2hlX3ZlcnRzdHJva2UgICAgMHgxMDAwNGI5ICAvKiBVKzA0QjkgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRSBXSVRIIFZFUlRJQ0FMIFNUUk9LRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19TSEhBICAgICAgICAgICAgICAweDEwMDA0YmEgIC8qIFUrMDRCQSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEhBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3NoaGEgICAgICAgICAgICAgIDB4MTAwMDRiYiAgLyogVSswNEJCIENZUklMTElDIFNNQUxMIExFVFRFUiBTSEhBICovCisKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfU0NIV0EgICAgICAgICAgICAgMHgxMDAwNGQ4ICAvKiBVKzA0RDggQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0NIV0EgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfc2Nod2EgICAgICAgICAgICAgMHgxMDAwNGQ5ICAvKiBVKzA0RDkgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNDSFdBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0lfbWFjcm9uICAgICAgICAgIDB4MTAwMDRlMiAgLyogVSswNEUyIENZUklMTElDIENBUElUQUwgTEVUVEVSIEkgV0lUSCBNQUNST04gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfaV9tYWNyb24gICAgICAgICAgMHgxMDAwNGUzICAvKiBVKzA0RTMgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST04gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfT19iYXIgICAgICAgICAgICAgMHgxMDAwNGU4ICAvKiBVKzA0RTggQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkFSUkVEIE8gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfb19iYXIgICAgICAgICAgICAgMHgxMDAwNGU5ICAvKiBVKzA0RTkgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJBUlJFRCBPICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1VfbWFjcm9uICAgICAgICAgIDB4MTAwMDRlZSAgLyogVSswNEVFIENZUklMTElDIENBUElUQUwgTEVUVEVSIFUgV0lUSCBNQUNST04gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfdV9tYWNyb24gICAgICAgICAgMHgxMDAwNGVmICAvKiBVKzA0RUYgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST04gKi8KKworI2RlZmluZSBYS19TZXJiaWFuX2RqZSAgICAgICAgICAgICAgICAgICAweDA2YTEgIC8qIFUrMDQ1MiBDWVJJTExJQyBTTUFMTCBMRVRURVIgREpFICovCisjZGVmaW5lIFhLX01hY2Vkb25pYV9namUgICAgICAgICAgICAgICAgIDB4MDZhMiAgLyogVSswNDUzIENZUklMTElDIFNNQUxMIExFVFRFUiBHSkUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfaW8gICAgICAgICAgICAgICAgICAgMHgwNmEzICAvKiBVKzA0NTEgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElPICovCisjZGVmaW5lIFhLX1VrcmFpbmlhbl9pZSAgICAgICAgICAgICAgICAgIDB4MDZhNCAgLyogVSswNDU0IENZUklMTElDIFNNQUxMIExFVFRFUiBVS1JBSU5JQU4gSUUgKi8KKyNkZWZpbmUgWEtfVWtyYW5pYW5famUgICAgICAgICAgICAgICAgICAgMHgwNmE0ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX01hY2Vkb25pYV9kc2UgICAgICAgICAgICAgICAgIDB4MDZhNSAgLyogVSswNDU1IENZUklMTElDIFNNQUxMIExFVFRFUiBEWkUgKi8KKyNkZWZpbmUgWEtfVWtyYWluaWFuX2kgICAgICAgICAgICAgICAgICAgMHgwNmE2ICAvKiBVKzA0NTYgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSSAqLworI2RlZmluZSBYS19Va3Jhbmlhbl9pICAgICAgICAgICAgICAgICAgICAweDA2YTYgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfVWtyYWluaWFuX3lpICAgICAgICAgICAgICAgICAgMHgwNmE3ICAvKiBVKzA0NTcgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlJICovCisjZGVmaW5lIFhLX1VrcmFuaWFuX3lpICAgICAgICAgICAgICAgICAgIDB4MDZhNyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19DeXJpbGxpY19qZSAgICAgICAgICAgICAgICAgICAweDA2YTggIC8qIFUrMDQ1OCBDWVJJTExJQyBTTUFMTCBMRVRURVIgSkUgKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9qZSAgICAgICAgICAgICAgICAgICAgMHgwNmE4ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2xqZSAgICAgICAgICAgICAgICAgIDB4MDZhOSAgLyogVSswNDU5IENZUklMTElDIFNNQUxMIExFVFRFUiBMSkUgKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9samUgICAgICAgICAgICAgICAgICAgMHgwNmE5ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX0N5cmlsbGljX25qZSAgICAgICAgICAgICAgICAgIDB4MDZhYSAgLyogVSswNDVBIENZUklMTElDIFNNQUxMIExFVFRFUiBOSkUgKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9uamUgICAgICAgICAgICAgICAgICAgMHgwNmFhICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX1NlcmJpYW5fdHNoZSAgICAgICAgICAgICAgICAgIDB4MDZhYiAgLyogVSswNDVCIENZUklMTElDIFNNQUxMIExFVFRFUiBUU0hFICovCisjZGVmaW5lIFhLX01hY2Vkb25pYV9ramUgICAgICAgICAgICAgICAgIDB4MDZhYyAgLyogVSswNDVDIENZUklMTElDIFNNQUxMIExFVFRFUiBLSkUgKi8KKyNkZWZpbmUgWEtfVWtyYWluaWFuX2doZV93aXRoX3VwdHVybiAgICAgMHgwNmFkICAvKiBVKzA0OTEgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRSBXSVRIIFVQVFVSTiAqLworI2RlZmluZSBYS19CeWVsb3J1c3NpYW5fc2hvcnR1ICAgICAgICAgICAweDA2YWUgIC8qIFUrMDQ1RSBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgVSAqLworI2RlZmluZSBYS19DeXJpbGxpY19kemhlICAgICAgICAgICAgICAgICAweDA2YWYgIC8qIFUrMDQ1RiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRFpIRSAqLworI2RlZmluZSBYS19TZXJiaWFuX2R6ZSAgICAgICAgICAgICAgICAgICAweDA2YWYgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfbnVtZXJvc2lnbiAgICAgICAgICAgICAgICAgICAgMHgwNmIwICAvKiBVKzIxMTYgTlVNRVJPIFNJR04gKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9ESkUgICAgICAgICAgICAgICAgICAgMHgwNmIxICAvKiBVKzA0MDIgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREpFICovCisjZGVmaW5lIFhLX01hY2Vkb25pYV9HSkUgICAgICAgICAgICAgICAgIDB4MDZiMiAgLyogVSswNDAzIENZUklMTElDIENBUElUQUwgTEVUVEVSIEdKRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19JTyAgICAgICAgICAgICAgICAgICAweDA2YjMgIC8qIFUrMDQwMSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJTyAqLworI2RlZmluZSBYS19Va3JhaW5pYW5fSUUgICAgICAgICAgICAgICAgICAweDA2YjQgIC8qIFUrMDQwNCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVS1JBSU5JQU4gSUUgKi8KKyNkZWZpbmUgWEtfVWtyYW5pYW5fSkUgICAgICAgICAgICAgICAgICAgMHgwNmI0ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX01hY2Vkb25pYV9EU0UgICAgICAgICAgICAgICAgIDB4MDZiNSAgLyogVSswNDA1IENZUklMTElDIENBUElUQUwgTEVUVEVSIERaRSAqLworI2RlZmluZSBYS19Va3JhaW5pYW5fSSAgICAgICAgICAgICAgICAgICAweDA2YjYgIC8qIFUrMDQwNiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEkgKi8KKyNkZWZpbmUgWEtfVWtyYW5pYW5fSSAgICAgICAgICAgICAgICAgICAgMHgwNmI2ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX1VrcmFpbmlhbl9ZSSAgICAgICAgICAgICAgICAgIDB4MDZiNyAgLyogVSswNDA3IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlJICovCisjZGVmaW5lIFhLX1VrcmFuaWFuX1lJICAgICAgICAgICAgICAgICAgIDB4MDZiNyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19DeXJpbGxpY19KRSAgICAgICAgICAgICAgICAgICAweDA2YjggIC8qIFUrMDQwOCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBKRSAqLworI2RlZmluZSBYS19TZXJiaWFuX0pFICAgICAgICAgICAgICAgICAgICAweDA2YjggIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfTEpFICAgICAgICAgICAgICAgICAgMHgwNmI5ICAvKiBVKzA0MDkgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTEpFICovCisjZGVmaW5lIFhLX1NlcmJpYW5fTEpFICAgICAgICAgICAgICAgICAgIDB4MDZiOSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19DeXJpbGxpY19OSkUgICAgICAgICAgICAgICAgICAweDA2YmEgIC8qIFUrMDQwQSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBOSkUgKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9OSkUgICAgICAgICAgICAgICAgICAgMHgwNmJhICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX1NlcmJpYW5fVFNIRSAgICAgICAgICAgICAgICAgIDB4MDZiYiAgLyogVSswNDBCIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTSEUgKi8KKyNkZWZpbmUgWEtfTWFjZWRvbmlhX0tKRSAgICAgICAgICAgICAgICAgMHgwNmJjICAvKiBVKzA0MEMgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0pFICovCisjZGVmaW5lIFhLX1VrcmFpbmlhbl9HSEVfV0lUSF9VUFRVUk4gICAgIDB4MDZiZCAgLyogVSswNDkwIENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRSBXSVRIIFVQVFVSTiAqLworI2RlZmluZSBYS19CeWVsb3J1c3NpYW5fU0hPUlRVICAgICAgICAgICAweDA2YmUgIC8qIFUrMDQwRSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBVICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0RaSEUgICAgICAgICAgICAgICAgIDB4MDZiZiAgLyogVSswNDBGIENZUklMTElDIENBUElUQUwgTEVUVEVSIERaSEUgKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9EWkUgICAgICAgICAgICAgICAgICAgMHgwNmJmICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3l1ICAgICAgICAgICAgICAgICAgIDB4MDZjMCAgLyogVSswNDRFIENZUklMTElDIFNNQUxMIExFVFRFUiBZVSAqLworI2RlZmluZSBYS19DeXJpbGxpY19hICAgICAgICAgICAgICAgICAgICAweDA2YzEgIC8qIFUrMDQzMCBDWVJJTExJQyBTTUFMTCBMRVRURVIgQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19iZSAgICAgICAgICAgICAgICAgICAweDA2YzIgIC8qIFUrMDQzMSBDWVJJTExJQyBTTUFMTCBMRVRURVIgQkUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfdHNlICAgICAgICAgICAgICAgICAgMHgwNmMzICAvKiBVKzA0NDYgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19kZSAgICAgICAgICAgICAgICAgICAweDA2YzQgIC8qIFUrMDQzNCBDWVJJTExJQyBTTUFMTCBMRVRURVIgREUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfaWUgICAgICAgICAgICAgICAgICAgMHgwNmM1ICAvKiBVKzA0MzUgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2VmICAgICAgICAgICAgICAgICAgIDB4MDZjNiAgLyogVSswNDQ0IENZUklMTElDIFNNQUxMIExFVFRFUiBFRiAqLworI2RlZmluZSBYS19DeXJpbGxpY19naGUgICAgICAgICAgICAgICAgICAweDA2YzcgIC8qIFUrMDQzMyBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2hhICAgICAgICAgICAgICAgICAgIDB4MDZjOCAgLyogVSswNDQ1IENZUklMTElDIFNNQUxMIExFVFRFUiBIQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19pICAgICAgICAgICAgICAgICAgICAweDA2YzkgIC8qIFUrMDQzOCBDWVJJTExJQyBTTUFMTCBMRVRURVIgSSAqLworI2RlZmluZSBYS19DeXJpbGxpY19zaG9ydGkgICAgICAgICAgICAgICAweDA2Y2EgIC8qIFUrMDQzOSBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgSSAqLworI2RlZmluZSBYS19DeXJpbGxpY19rYSAgICAgICAgICAgICAgICAgICAweDA2Y2IgIC8qIFUrMDQzQSBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0EgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZWwgICAgICAgICAgICAgICAgICAgMHgwNmNjICAvKiBVKzA0M0IgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2VtICAgICAgICAgICAgICAgICAgIDB4MDZjZCAgLyogVSswNDNDIENZUklMTElDIFNNQUxMIExFVFRFUiBFTSAqLworI2RlZmluZSBYS19DeXJpbGxpY19lbiAgICAgICAgICAgICAgICAgICAweDA2Y2UgIC8qIFUrMDQzRCBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU4gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfbyAgICAgICAgICAgICAgICAgICAgMHgwNmNmICAvKiBVKzA0M0UgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfcGUgICAgICAgICAgICAgICAgICAgMHgwNmQwICAvKiBVKzA0M0YgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFBFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3lhICAgICAgICAgICAgICAgICAgIDB4MDZkMSAgLyogVSswNDRGIENZUklMTElDIFNNQUxMIExFVFRFUiBZQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19lciAgICAgICAgICAgICAgICAgICAweDA2ZDIgIC8qIFUrMDQ0MCBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVIgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZXMgICAgICAgICAgICAgICAgICAgMHgwNmQzICAvKiBVKzA0NDEgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVTICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3RlICAgICAgICAgICAgICAgICAgIDB4MDZkNCAgLyogVSswNDQyIENZUklMTElDIFNNQUxMIExFVFRFUiBURSAqLworI2RlZmluZSBYS19DeXJpbGxpY191ICAgICAgICAgICAgICAgICAgICAweDA2ZDUgIC8qIFUrMDQ0MyBDWVJJTExJQyBTTUFMTCBMRVRURVIgVSAqLworI2RlZmluZSBYS19DeXJpbGxpY196aGUgICAgICAgICAgICAgICAgICAweDA2ZDYgIC8qIFUrMDQzNiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3ZlICAgICAgICAgICAgICAgICAgIDB4MDZkNyAgLyogVSswNDMyIENZUklMTElDIFNNQUxMIExFVFRFUiBWRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19zb2Z0c2lnbiAgICAgICAgICAgICAweDA2ZDggIC8qIFUrMDQ0QyBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3llcnUgICAgICAgICAgICAgICAgIDB4MDZkOSAgLyogVSswNDRCIENZUklMTElDIFNNQUxMIExFVFRFUiBZRVJVICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3plICAgICAgICAgICAgICAgICAgIDB4MDZkYSAgLyogVSswNDM3IENZUklMTElDIFNNQUxMIExFVFRFUiBaRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19zaGEgICAgICAgICAgICAgICAgICAweDA2ZGIgIC8qIFUrMDQ0OCBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2UgICAgICAgICAgICAgICAgICAgIDB4MDZkYyAgLyogVSswNDREIENZUklMTElDIFNNQUxMIExFVFRFUiBFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3NoY2hhICAgICAgICAgICAgICAgIDB4MDZkZCAgLyogVSswNDQ5IENZUklMTElDIFNNQUxMIExFVFRFUiBTSENIQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19jaGUgICAgICAgICAgICAgICAgICAweDA2ZGUgIC8qIFUrMDQ0NyBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2hhcmRzaWduICAgICAgICAgICAgIDB4MDZkZiAgLyogVSswNDRBIENZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfWVUgICAgICAgICAgICAgICAgICAgMHgwNmUwICAvKiBVKzA0MkUgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWVUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfQSAgICAgICAgICAgICAgICAgICAgMHgwNmUxICAvKiBVKzA0MTAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19CRSAgICAgICAgICAgICAgICAgICAweDA2ZTIgIC8qIFUrMDQxMSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19UU0UgICAgICAgICAgICAgICAgICAweDA2ZTMgIC8qIFUrMDQyNiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0UgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfREUgICAgICAgICAgICAgICAgICAgMHgwNmU0ICAvKiBVKzA0MTQgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfSUUgICAgICAgICAgICAgICAgICAgMHgwNmU1ICAvKiBVKzA0MTUgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfRUYgICAgICAgICAgICAgICAgICAgMHgwNmU2ICAvKiBVKzA0MjQgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUYgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfR0hFICAgICAgICAgICAgICAgICAgMHgwNmU3ICAvKiBVKzA0MTMgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0hBICAgICAgICAgICAgICAgICAgIDB4MDZlOCAgLyogVSswNDI1IENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0kgICAgICAgICAgICAgICAgICAgIDB4MDZlOSAgLyogVSswNDE4IENZUklMTElDIENBUElUQUwgTEVUVEVSIEkgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfU0hPUlRJICAgICAgICAgICAgICAgMHgwNmVhICAvKiBVKzA0MTkgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSSAqLworI2RlZmluZSBYS19DeXJpbGxpY19LQSAgICAgICAgICAgICAgICAgICAweDA2ZWIgIC8qIFUrMDQxQSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19FTCAgICAgICAgICAgICAgICAgICAweDA2ZWMgIC8qIFUrMDQxQiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTCAqLworI2RlZmluZSBYS19DeXJpbGxpY19FTSAgICAgICAgICAgICAgICAgICAweDA2ZWQgIC8qIFUrMDQxQyBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTSAqLworI2RlZmluZSBYS19DeXJpbGxpY19FTiAgICAgICAgICAgICAgICAgICAweDA2ZWUgIC8qIFUrMDQxRCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTiAqLworI2RlZmluZSBYS19DeXJpbGxpY19PICAgICAgICAgICAgICAgICAgICAweDA2ZWYgIC8qIFUrMDQxRSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBPICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1BFICAgICAgICAgICAgICAgICAgIDB4MDZmMCAgLyogVSswNDFGIENZUklMTElDIENBUElUQUwgTEVUVEVSIFBFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1lBICAgICAgICAgICAgICAgICAgIDB4MDZmMSAgLyogVSswNDJGIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0VSICAgICAgICAgICAgICAgICAgIDB4MDZmMiAgLyogVSswNDIwIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVSICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0VTICAgICAgICAgICAgICAgICAgIDB4MDZmMyAgLyogVSswNDIxIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1RFICAgICAgICAgICAgICAgICAgIDB4MDZmNCAgLyogVSswNDIyIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1UgICAgICAgICAgICAgICAgICAgIDB4MDZmNSAgLyogVSswNDIzIENZUklMTElDIENBUElUQUwgTEVUVEVSIFUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfWkhFICAgICAgICAgICAgICAgICAgMHgwNmY2ICAvKiBVKzA0MTYgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1ZFICAgICAgICAgICAgICAgICAgIDB4MDZmNyAgLyogVSswNDEyIENZUklMTElDIENBUElUQUwgTEVUVEVSIFZFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1NPRlRTSUdOICAgICAgICAgICAgIDB4MDZmOCAgLyogVSswNDJDIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTiAqLworI2RlZmluZSBYS19DeXJpbGxpY19ZRVJVICAgICAgICAgICAgICAgICAweDA2ZjkgIC8qIFUrMDQyQiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZRVJVICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1pFICAgICAgICAgICAgICAgICAgIDB4MDZmYSAgLyogVSswNDE3IENZUklMTElDIENBUElUQUwgTEVUVEVSIFpFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1NIQSAgICAgICAgICAgICAgICAgIDB4MDZmYiAgLyogVSswNDI4IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19FICAgICAgICAgICAgICAgICAgICAweDA2ZmMgIC8qIFUrMDQyRCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1NIQ0hBICAgICAgICAgICAgICAgIDB4MDZmZCAgLyogVSswNDI5IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQ0hBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0NIRSAgICAgICAgICAgICAgICAgIDB4MDZmZSAgLyogVSswNDI3IENZUklMTElDIENBUElUQUwgTEVUVEVSIENIRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19IQVJEU0lHTiAgICAgICAgICAgICAweDA2ZmYgIC8qIFUrMDQyQSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQVJEIFNJR04gKi8KKyNlbmRpZiAvKiBYS19DWVJJTExJQyAqLworCisvKgorICogR3JlZWsKKyAqIChiYXNlZCBvbiBhbiBlYXJseSBkcmFmdCBvZiwgYW5kIG5vdCBxdWl0ZSBpZGVudGljYWwgdG8sIElTTy9JRUMgODg1OS03KQorICogQnl0ZSAzID0gNworICovCisKKyNpZmRlZiBYS19HUkVFSworI2RlZmluZSBYS19HcmVla19BTFBIQWFjY2VudCAgICAgICAgICAgICAweDA3YTEgIC8qIFUrMDM4NiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX0VQU0lMT05hY2NlbnQgICAgICAgICAgIDB4MDdhMiAgLyogVSswMzg4IEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19FVEFhY2NlbnQgICAgICAgICAgICAgICAweDA3YTMgIC8qIFUrMDM4OSBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19JT1RBYWNjZW50ICAgICAgICAgICAgICAweDA3YTQgIC8qIFUrMDM4QSBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggVE9OT1MgKi8KKyNkZWZpbmUgWEtfR3JlZWtfSU9UQWRpZXJlc2lzICAgICAgICAgICAgMHgwN2E1ICAvKiBVKzAzQUEgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQSAqLworI2RlZmluZSBYS19HcmVla19JT1RBZGlhZXJlc2lzICAgICAgICAgICAweDA3YTUgIC8qIG9sZCB0eXBvICovCisjZGVmaW5lIFhLX0dyZWVrX09NSUNST05hY2NlbnQgICAgICAgICAgIDB4MDdhNyAgLyogVSswMzhDIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04gV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19VUFNJTE9OYWNjZW50ICAgICAgICAgICAweDA3YTggIC8qIFUrMDM4RSBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MgKi8KKyNkZWZpbmUgWEtfR3JlZWtfVVBTSUxPTmRpZXJlc2lzICAgICAgICAgMHgwN2E5ICAvKiBVKzAzQUIgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQSAqLworI2RlZmluZSBYS19HcmVla19PTUVHQWFjY2VudCAgICAgICAgICAgICAweDA3YWIgIC8qIFUrMDM4RiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX2FjY2VudGRpZXJlc2lzICAgICAgICAgIDB4MDdhZSAgLyogVSswMzg1IEdSRUVLIERJQUxZVElLQSBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19ob3JpemJhciAgICAgICAgICAgICAgICAweDA3YWYgIC8qIFUrMjAxNSBIT1JJWk9OVEFMIEJBUiAqLworI2RlZmluZSBYS19HcmVla19hbHBoYWFjY2VudCAgICAgICAgICAgICAweDA3YjEgIC8qIFUrMDNBQyBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19lcHNpbG9uYWNjZW50ICAgICAgICAgICAweDA3YjIgIC8qIFUrMDNBRCBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX2V0YWFjY2VudCAgICAgICAgICAgICAgIDB4MDdiMyAgLyogVSswM0FFIEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19pb3RhYWNjZW50ICAgICAgICAgICAgICAweDA3YjQgIC8qIFUrMDNBRiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX2lvdGFkaWVyZXNpcyAgICAgICAgICAgIDB4MDdiNSAgLyogVSswM0NBIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBICovCisjZGVmaW5lIFhLX0dyZWVrX2lvdGFhY2NlbnRkaWVyZXNpcyAgICAgIDB4MDdiNiAgLyogVSswMzkwIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBIEFORCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19vbWljcm9uYWNjZW50ICAgICAgICAgICAweDA3YjcgIC8qIFUrMDNDQyBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX3Vwc2lsb25hY2NlbnQgICAgICAgICAgIDB4MDdiOCAgLyogVSswM0NEIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MgKi8KKyNkZWZpbmUgWEtfR3JlZWtfdXBzaWxvbmRpZXJlc2lzICAgICAgICAgMHgwN2I5ICAvKiBVKzAzQ0IgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EgKi8KKyNkZWZpbmUgWEtfR3JlZWtfdXBzaWxvbmFjY2VudGRpZXJlc2lzICAgMHgwN2JhICAvKiBVKzAzQjAgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX29tZWdhYWNjZW50ICAgICAgICAgICAgIDB4MDdiYiAgLyogVSswM0NFIEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX0FMUEhBICAgICAgICAgICAgICAgICAgIDB4MDdjMSAgLyogVSswMzkxIEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBICovCisjZGVmaW5lIFhLX0dyZWVrX0JFVEEgICAgICAgICAgICAgICAgICAgIDB4MDdjMiAgLyogVSswMzkyIEdSRUVLIENBUElUQUwgTEVUVEVSIEJFVEEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfR0FNTUEgICAgICAgICAgICAgICAgICAgMHgwN2MzICAvKiBVKzAzOTMgR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfREVMVEEgICAgICAgICAgICAgICAgICAgMHgwN2M0ICAvKiBVKzAzOTQgR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfRVBTSUxPTiAgICAgICAgICAgICAgICAgMHgwN2M1ICAvKiBVKzAzOTUgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTiAqLworI2RlZmluZSBYS19HcmVla19aRVRBICAgICAgICAgICAgICAgICAgICAweDA3YzYgIC8qIFUrMDM5NiBHUkVFSyBDQVBJVEFMIExFVFRFUiBaRVRBICovCisjZGVmaW5lIFhLX0dyZWVrX0VUQSAgICAgICAgICAgICAgICAgICAgIDB4MDdjNyAgLyogVSswMzk3IEdSRUVLIENBUElUQUwgTEVUVEVSIEVUQSAqLworI2RlZmluZSBYS19HcmVla19USEVUQSAgICAgICAgICAgICAgICAgICAweDA3YzggIC8qIFUrMDM5OCBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQSAqLworI2RlZmluZSBYS19HcmVla19JT1RBICAgICAgICAgICAgICAgICAgICAweDA3YzkgIC8qIFUrMDM5OSBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBICovCisjZGVmaW5lIFhLX0dyZWVrX0tBUFBBICAgICAgICAgICAgICAgICAgIDB4MDdjYSAgLyogVSswMzlBIEdSRUVLIENBUElUQUwgTEVUVEVSIEtBUFBBICovCisjZGVmaW5lIFhLX0dyZWVrX0xBTURBICAgICAgICAgICAgICAgICAgIDB4MDdjYiAgLyogVSswMzlCIEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBICovCisjZGVmaW5lIFhLX0dyZWVrX0xBTUJEQSAgICAgICAgICAgICAgICAgIDB4MDdjYiAgLyogVSswMzlCIEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBICovCisjZGVmaW5lIFhLX0dyZWVrX01VICAgICAgICAgICAgICAgICAgICAgIDB4MDdjYyAgLyogVSswMzlDIEdSRUVLIENBUElUQUwgTEVUVEVSIE1VICovCisjZGVmaW5lIFhLX0dyZWVrX05VICAgICAgICAgICAgICAgICAgICAgIDB4MDdjZCAgLyogVSswMzlEIEdSRUVLIENBUElUQUwgTEVUVEVSIE5VICovCisjZGVmaW5lIFhLX0dyZWVrX1hJICAgICAgICAgICAgICAgICAgICAgIDB4MDdjZSAgLyogVSswMzlFIEdSRUVLIENBUElUQUwgTEVUVEVSIFhJICovCisjZGVmaW5lIFhLX0dyZWVrX09NSUNST04gICAgICAgICAgICAgICAgIDB4MDdjZiAgLyogVSswMzlGIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04gKi8KKyNkZWZpbmUgWEtfR3JlZWtfUEkgICAgICAgICAgICAgICAgICAgICAgMHgwN2QwICAvKiBVKzAzQTAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEkgKi8KKyNkZWZpbmUgWEtfR3JlZWtfUkhPICAgICAgICAgICAgICAgICAgICAgMHgwN2QxICAvKiBVKzAzQTEgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPICovCisjZGVmaW5lIFhLX0dyZWVrX1NJR01BICAgICAgICAgICAgICAgICAgIDB4MDdkMiAgLyogVSswM0EzIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BICovCisjZGVmaW5lIFhLX0dyZWVrX1RBVSAgICAgICAgICAgICAgICAgICAgIDB4MDdkNCAgLyogVSswM0E0IEdSRUVLIENBUElUQUwgTEVUVEVSIFRBVSAqLworI2RlZmluZSBYS19HcmVla19VUFNJTE9OICAgICAgICAgICAgICAgICAweDA3ZDUgIC8qIFUrMDNBNSBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OICovCisjZGVmaW5lIFhLX0dyZWVrX1BISSAgICAgICAgICAgICAgICAgICAgIDB4MDdkNiAgLyogVSswM0E2IEdSRUVLIENBUElUQUwgTEVUVEVSIFBISSAqLworI2RlZmluZSBYS19HcmVla19DSEkgICAgICAgICAgICAgICAgICAgICAweDA3ZDcgIC8qIFUrMDNBNyBHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkgKi8KKyNkZWZpbmUgWEtfR3JlZWtfUFNJICAgICAgICAgICAgICAgICAgICAgMHgwN2Q4ICAvKiBVKzAzQTggR1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJICovCisjZGVmaW5lIFhLX0dyZWVrX09NRUdBICAgICAgICAgICAgICAgICAgIDB4MDdkOSAgLyogVSswM0E5IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBICovCisjZGVmaW5lIFhLX0dyZWVrX2FscGhhICAgICAgICAgICAgICAgICAgIDB4MDdlMSAgLyogVSswM0IxIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQSAqLworI2RlZmluZSBYS19HcmVla19iZXRhICAgICAgICAgICAgICAgICAgICAweDA3ZTIgIC8qIFUrMDNCMiBHUkVFSyBTTUFMTCBMRVRURVIgQkVUQSAqLworI2RlZmluZSBYS19HcmVla19nYW1tYSAgICAgICAgICAgICAgICAgICAweDA3ZTMgIC8qIFUrMDNCMyBHUkVFSyBTTUFMTCBMRVRURVIgR0FNTUEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfZGVsdGEgICAgICAgICAgICAgICAgICAgMHgwN2U0ICAvKiBVKzAzQjQgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBICovCisjZGVmaW5lIFhLX0dyZWVrX2Vwc2lsb24gICAgICAgICAgICAgICAgIDB4MDdlNSAgLyogVSswM0I1IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OICovCisjZGVmaW5lIFhLX0dyZWVrX3pldGEgICAgICAgICAgICAgICAgICAgIDB4MDdlNiAgLyogVSswM0I2IEdSRUVLIFNNQUxMIExFVFRFUiBaRVRBICovCisjZGVmaW5lIFhLX0dyZWVrX2V0YSAgICAgICAgICAgICAgICAgICAgIDB4MDdlNyAgLyogVSswM0I3IEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfdGhldGEgICAgICAgICAgICAgICAgICAgMHgwN2U4ICAvKiBVKzAzQjggR1JFRUsgU01BTEwgTEVUVEVSIFRIRVRBICovCisjZGVmaW5lIFhLX0dyZWVrX2lvdGEgICAgICAgICAgICAgICAgICAgIDB4MDdlOSAgLyogVSswM0I5IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBICovCisjZGVmaW5lIFhLX0dyZWVrX2thcHBhICAgICAgICAgICAgICAgICAgIDB4MDdlYSAgLyogVSswM0JBIEdSRUVLIFNNQUxMIExFVFRFUiBLQVBQQSAqLworI2RlZmluZSBYS19HcmVla19sYW1kYSAgICAgICAgICAgICAgICAgICAweDA3ZWIgIC8qIFUrMDNCQiBHUkVFSyBTTUFMTCBMRVRURVIgTEFNREEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfbGFtYmRhICAgICAgICAgICAgICAgICAgMHgwN2ViICAvKiBVKzAzQkIgR1JFRUsgU01BTEwgTEVUVEVSIExBTURBICovCisjZGVmaW5lIFhLX0dyZWVrX211ICAgICAgICAgICAgICAgICAgICAgIDB4MDdlYyAgLyogVSswM0JDIEdSRUVLIFNNQUxMIExFVFRFUiBNVSAqLworI2RlZmluZSBYS19HcmVla19udSAgICAgICAgICAgICAgICAgICAgICAweDA3ZWQgIC8qIFUrMDNCRCBHUkVFSyBTTUFMTCBMRVRURVIgTlUgKi8KKyNkZWZpbmUgWEtfR3JlZWtfeGkgICAgICAgICAgICAgICAgICAgICAgMHgwN2VlICAvKiBVKzAzQkUgR1JFRUsgU01BTEwgTEVUVEVSIFhJICovCisjZGVmaW5lIFhLX0dyZWVrX29taWNyb24gICAgICAgICAgICAgICAgIDB4MDdlZiAgLyogVSswM0JGIEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OICovCisjZGVmaW5lIFhLX0dyZWVrX3BpICAgICAgICAgICAgICAgICAgICAgIDB4MDdmMCAgLyogVSswM0MwIEdSRUVLIFNNQUxMIExFVFRFUiBQSSAqLworI2RlZmluZSBYS19HcmVla19yaG8gICAgICAgICAgICAgICAgICAgICAweDA3ZjEgIC8qIFUrMDNDMSBHUkVFSyBTTUFMTCBMRVRURVIgUkhPICovCisjZGVmaW5lIFhLX0dyZWVrX3NpZ21hICAgICAgICAgICAgICAgICAgIDB4MDdmMiAgLyogVSswM0MzIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQSAqLworI2RlZmluZSBYS19HcmVla19maW5hbHNtYWxsc2lnbWEgICAgICAgICAweDA3ZjMgIC8qIFUrMDNDMiBHUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfdGF1ICAgICAgICAgICAgICAgICAgICAgMHgwN2Y0ICAvKiBVKzAzQzQgR1JFRUsgU01BTEwgTEVUVEVSIFRBVSAqLworI2RlZmluZSBYS19HcmVla191cHNpbG9uICAgICAgICAgICAgICAgICAweDA3ZjUgIC8qIFUrMDNDNSBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiAqLworI2RlZmluZSBYS19HcmVla19waGkgICAgICAgICAgICAgICAgICAgICAweDA3ZjYgIC8qIFUrMDNDNiBHUkVFSyBTTUFMTCBMRVRURVIgUEhJICovCisjZGVmaW5lIFhLX0dyZWVrX2NoaSAgICAgICAgICAgICAgICAgICAgIDB4MDdmNyAgLyogVSswM0M3IEdSRUVLIFNNQUxMIExFVFRFUiBDSEkgKi8KKyNkZWZpbmUgWEtfR3JlZWtfcHNpICAgICAgICAgICAgICAgICAgICAgMHgwN2Y4ICAvKiBVKzAzQzggR1JFRUsgU01BTEwgTEVUVEVSIFBTSSAqLworI2RlZmluZSBYS19HcmVla19vbWVnYSAgICAgICAgICAgICAgICAgICAweDA3ZjkgIC8qIFUrMDNDOSBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgKi8KKyNkZWZpbmUgWEtfR3JlZWtfc3dpdGNoICAgICAgICAgICAgICAgICAgMHhmZjdlICAvKiBBbGlhcyBmb3IgbW9kZV9zd2l0Y2ggKi8KKyNlbmRpZiAvKiBYS19HUkVFSyAqLworCisvKgorICogVGVjaG5pY2FsCisgKiAoZnJvbSB0aGUgREVDIFZUMzMwL1ZUNDIwIFRlY2huaWNhbCBDaGFyYWN0ZXIgU2V0LCBodHRwOi8vdnQxMDAubmV0L2NoYXJzZXRzL3RlY2huaWNhbC5odG1sKQorICogQnl0ZSAzID0gOAorICovCisKKyNpZmRlZiBYS19URUNITklDQUwKKyNkZWZpbmUgWEtfbGVmdHJhZGljYWwgICAgICAgICAgICAgICAgICAgMHgwOGExICAvKiBVKzIzQjcgUkFESUNBTCBTWU1CT0wgQk9UVE9NICovCisjZGVmaW5lIFhLX3RvcGxlZnRyYWRpY2FsICAgICAgICAgICAgICAgIDB4MDhhMiAgLyooVSsyNTBDIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVCkqLworI2RlZmluZSBYS19ob3JpemNvbm5lY3RvciAgICAgICAgICAgICAgICAweDA4YTMgIC8qKFUrMjUwMCBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTCkqLworI2RlZmluZSBYS190b3BpbnRlZ3JhbCAgICAgICAgICAgICAgICAgICAweDA4YTQgIC8qIFUrMjMyMCBUT1AgSEFMRiBJTlRFR1JBTCAqLworI2RlZmluZSBYS19ib3RpbnRlZ3JhbCAgICAgICAgICAgICAgICAgICAweDA4YTUgIC8qIFUrMjMyMSBCT1RUT00gSEFMRiBJTlRFR1JBTCAqLworI2RlZmluZSBYS192ZXJ0Y29ubmVjdG9yICAgICAgICAgICAgICAgICAweDA4YTYgIC8qKFUrMjUwMiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwpKi8KKyNkZWZpbmUgWEtfdG9wbGVmdHNxYnJhY2tldCAgICAgICAgICAgICAgMHgwOGE3ICAvKiBVKzIzQTEgTEVGVCBTUVVBUkUgQlJBQ0tFVCBVUFBFUiBDT1JORVIgKi8KKyNkZWZpbmUgWEtfYm90bGVmdHNxYnJhY2tldCAgICAgICAgICAgICAgMHgwOGE4ICAvKiBVKzIzQTMgTEVGVCBTUVVBUkUgQlJBQ0tFVCBMT1dFUiBDT1JORVIgKi8KKyNkZWZpbmUgWEtfdG9wcmlnaHRzcWJyYWNrZXQgICAgICAgICAgICAgMHgwOGE5ICAvKiBVKzIzQTQgUklHSFQgU1FVQVJFIEJSQUNLRVQgVVBQRVIgQ09STkVSICovCisjZGVmaW5lIFhLX2JvdHJpZ2h0c3FicmFja2V0ICAgICAgICAgICAgIDB4MDhhYSAgLyogVSsyM0E2IFJJR0hUIFNRVUFSRSBCUkFDS0VUIExPV0VSIENPUk5FUiAqLworI2RlZmluZSBYS190b3BsZWZ0cGFyZW5zICAgICAgICAgICAgICAgICAweDA4YWIgIC8qIFUrMjM5QiBMRUZUIFBBUkVOVEhFU0lTIFVQUEVSIEhPT0sgKi8KKyNkZWZpbmUgWEtfYm90bGVmdHBhcmVucyAgICAgICAgICAgICAgICAgMHgwOGFjICAvKiBVKzIzOUQgTEVGVCBQQVJFTlRIRVNJUyBMT1dFUiBIT09LICovCisjZGVmaW5lIFhLX3RvcHJpZ2h0cGFyZW5zICAgICAgICAgICAgICAgIDB4MDhhZCAgLyogVSsyMzlFIFJJR0hUIFBBUkVOVEhFU0lTIFVQUEVSIEhPT0sgKi8KKyNkZWZpbmUgWEtfYm90cmlnaHRwYXJlbnMgICAgICAgICAgICAgICAgMHgwOGFlICAvKiBVKzIzQTAgUklHSFQgUEFSRU5USEVTSVMgTE9XRVIgSE9PSyAqLworI2RlZmluZSBYS19sZWZ0bWlkZGxlY3VybHlicmFjZSAgICAgICAgICAweDA4YWYgIC8qIFUrMjNBOCBMRUZUIENVUkxZIEJSQUNLRVQgTUlERExFIFBJRUNFICovCisjZGVmaW5lIFhLX3JpZ2h0bWlkZGxlY3VybHlicmFjZSAgICAgICAgIDB4MDhiMCAgLyogVSsyM0FDIFJJR0hUIENVUkxZIEJSQUNLRVQgTUlERExFIFBJRUNFICovCisjZGVmaW5lIFhLX3RvcGxlZnRzdW1tYXRpb24gICAgICAgICAgICAgIDB4MDhiMQorI2RlZmluZSBYS19ib3RsZWZ0c3VtbWF0aW9uICAgICAgICAgICAgICAweDA4YjIKKyNkZWZpbmUgWEtfdG9wdmVydHN1bW1hdGlvbmNvbm5lY3RvciAgICAgMHgwOGIzCisjZGVmaW5lIFhLX2JvdHZlcnRzdW1tYXRpb25jb25uZWN0b3IgICAgIDB4MDhiNAorI2RlZmluZSBYS190b3ByaWdodHN1bW1hdGlvbiAgICAgICAgICAgICAweDA4YjUKKyNkZWZpbmUgWEtfYm90cmlnaHRzdW1tYXRpb24gICAgICAgICAgICAgMHgwOGI2CisjZGVmaW5lIFhLX3JpZ2h0bWlkZGxlc3VtbWF0aW9uICAgICAgICAgIDB4MDhiNworI2RlZmluZSBYS19sZXNzdGhhbmVxdWFsICAgICAgICAgICAgICAgICAweDA4YmMgIC8qIFUrMjI2NCBMRVNTLVRIQU4gT1IgRVFVQUwgVE8gKi8KKyNkZWZpbmUgWEtfbm90ZXF1YWwgICAgICAgICAgICAgICAgICAgICAgMHgwOGJkICAvKiBVKzIyNjAgTk9UIEVRVUFMIFRPICovCisjZGVmaW5lIFhLX2dyZWF0ZXJ0aGFuZXF1YWwgICAgICAgICAgICAgIDB4MDhiZSAgLyogVSsyMjY1IEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTyAqLworI2RlZmluZSBYS19pbnRlZ3JhbCAgICAgICAgICAgICAgICAgICAgICAweDA4YmYgIC8qIFUrMjIyQiBJTlRFR1JBTCAqLworI2RlZmluZSBYS190aGVyZWZvcmUgICAgICAgICAgICAgICAgICAgICAweDA4YzAgIC8qIFUrMjIzNCBUSEVSRUZPUkUgKi8KKyNkZWZpbmUgWEtfdmFyaWF0aW9uICAgICAgICAgICAgICAgICAgICAgMHgwOGMxICAvKiBVKzIyMUQgUFJPUE9SVElPTkFMIFRPICovCisjZGVmaW5lIFhLX2luZmluaXR5ICAgICAgICAgICAgICAgICAgICAgIDB4MDhjMiAgLyogVSsyMjFFIElORklOSVRZICovCisjZGVmaW5lIFhLX25hYmxhICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDhjNSAgLyogVSsyMjA3IE5BQkxBICovCisjZGVmaW5lIFhLX2FwcHJveGltYXRlICAgICAgICAgICAgICAgICAgIDB4MDhjOCAgLyogVSsyMjNDIFRJTERFIE9QRVJBVE9SICovCisjZGVmaW5lIFhLX3NpbWlsYXJlcXVhbCAgICAgICAgICAgICAgICAgIDB4MDhjOSAgLyogVSsyMjQzIEFTWU1QVE9USUNBTExZIEVRVUFMIFRPICovCisjZGVmaW5lIFhLX2lmb25seWlmICAgICAgICAgICAgICAgICAgICAgIDB4MDhjZCAgLyogVSsyMUQ0IExFRlQgUklHSFQgRE9VQkxFIEFSUk9XICovCisjZGVmaW5lIFhLX2ltcGxpZXMgICAgICAgICAgICAgICAgICAgICAgIDB4MDhjZSAgLyogVSsyMUQyIFJJR0hUV0FSRFMgRE9VQkxFIEFSUk9XICovCisjZGVmaW5lIFhLX2lkZW50aWNhbCAgICAgICAgICAgICAgICAgICAgIDB4MDhjZiAgLyogVSsyMjYxIElERU5USUNBTCBUTyAqLworI2RlZmluZSBYS19yYWRpY2FsICAgICAgICAgICAgICAgICAgICAgICAweDA4ZDYgIC8qIFUrMjIxQSBTUVVBUkUgUk9PVCAqLworI2RlZmluZSBYS19pbmNsdWRlZGluICAgICAgICAgICAgICAgICAgICAweDA4ZGEgIC8qIFUrMjI4MiBTVUJTRVQgT0YgKi8KKyNkZWZpbmUgWEtfaW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgMHgwOGRiICAvKiBVKzIyODMgU1VQRVJTRVQgT0YgKi8KKyNkZWZpbmUgWEtfaW50ZXJzZWN0aW9uICAgICAgICAgICAgICAgICAgMHgwOGRjICAvKiBVKzIyMjkgSU5URVJTRUNUSU9OICovCisjZGVmaW5lIFhLX3VuaW9uICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDhkZCAgLyogVSsyMjJBIFVOSU9OICovCisjZGVmaW5lIFhLX2xvZ2ljYWxhbmQgICAgICAgICAgICAgICAgICAgIDB4MDhkZSAgLyogVSsyMjI3IExPR0lDQUwgQU5EICovCisjZGVmaW5lIFhLX2xvZ2ljYWxvciAgICAgICAgICAgICAgICAgICAgIDB4MDhkZiAgLyogVSsyMjI4IExPR0lDQUwgT1IgKi8KKyNkZWZpbmUgWEtfcGFydGlhbGRlcml2YXRpdmUgICAgICAgICAgICAgMHgwOGVmICAvKiBVKzIyMDIgUEFSVElBTCBESUZGRVJFTlRJQUwgKi8KKyNkZWZpbmUgWEtfZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgMHgwOGY2ICAvKiBVKzAxOTIgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LICovCisjZGVmaW5lIFhLX2xlZnRhcnJvdyAgICAgICAgICAgICAgICAgICAgIDB4MDhmYiAgLyogVSsyMTkwIExFRlRXQVJEUyBBUlJPVyAqLworI2RlZmluZSBYS191cGFycm93ICAgICAgICAgICAgICAgICAgICAgICAweDA4ZmMgIC8qIFUrMjE5MSBVUFdBUkRTIEFSUk9XICovCisjZGVmaW5lIFhLX3JpZ2h0YXJyb3cgICAgICAgICAgICAgICAgICAgIDB4MDhmZCAgLyogVSsyMTkyIFJJR0hUV0FSRFMgQVJST1cgKi8KKyNkZWZpbmUgWEtfZG93bmFycm93ICAgICAgICAgICAgICAgICAgICAgMHgwOGZlICAvKiBVKzIxOTMgRE9XTldBUkRTIEFSUk9XICovCisjZW5kaWYgLyogWEtfVEVDSE5JQ0FMICovCisKKy8qCisgKiBTcGVjaWFsCisgKiAoZnJvbSB0aGUgREVDIFZUMTAwIFNwZWNpYWwgR3JhcGhpY3MgQ2hhcmFjdGVyIFNldCkKKyAqIEJ5dGUgMyA9IDkKKyAqLworCisjaWZkZWYgWEtfU1BFQ0lBTAorI2RlZmluZSBYS19ibGFuayAgICAgICAgICAgICAgICAgICAgICAgICAweDA5ZGYKKyNkZWZpbmUgWEtfc29saWRkaWFtb25kICAgICAgICAgICAgICAgICAgMHgwOWUwICAvKiBVKzI1QzYgQkxBQ0sgRElBTU9ORCAqLworI2RlZmluZSBYS19jaGVja2VyYm9hcmQgICAgICAgICAgICAgICAgICAweDA5ZTEgIC8qIFUrMjU5MiBNRURJVU0gU0hBREUgKi8KKyNkZWZpbmUgWEtfaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWUyICAvKiBVKzI0MDkgU1lNQk9MIEZPUiBIT1JJWk9OVEFMIFRBQlVMQVRJT04gKi8KKyNkZWZpbmUgWEtfZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWUzICAvKiBVKzI0MEMgU1lNQk9MIEZPUiBGT1JNIEZFRUQgKi8KKyNkZWZpbmUgWEtfY3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWU0ICAvKiBVKzI0MEQgU1lNQk9MIEZPUiBDQVJSSUFHRSBSRVRVUk4gKi8KKyNkZWZpbmUgWEtfbGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWU1ICAvKiBVKzI0MEEgU1lNQk9MIEZPUiBMSU5FIEZFRUQgKi8KKyNkZWZpbmUgWEtfbmwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWU4ICAvKiBVKzI0MjQgU1lNQk9MIEZPUiBORVdMSU5FICovCisjZGVmaW5lIFhLX3Z0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDllOSAgLyogVSsyNDBCIFNZTUJPTCBGT1IgVkVSVElDQUwgVEFCVUxBVElPTiAqLworI2RlZmluZSBYS19sb3dyaWdodGNvcm5lciAgICAgICAgICAgICAgICAweDA5ZWEgIC8qIFUrMjUxOCBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQgKi8KKyNkZWZpbmUgWEtfdXByaWdodGNvcm5lciAgICAgICAgICAgICAgICAgMHgwOWViICAvKiBVKzI1MTAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQgKi8KKyNkZWZpbmUgWEtfdXBsZWZ0Y29ybmVyICAgICAgICAgICAgICAgICAgMHgwOWVjICAvKiBVKzI1MEMgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUICovCisjZGVmaW5lIFhLX2xvd2xlZnRjb3JuZXIgICAgICAgICAgICAgICAgIDB4MDllZCAgLyogVSsyNTE0IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQgKi8KKyNkZWZpbmUgWEtfY3Jvc3NpbmdsaW5lcyAgICAgICAgICAgICAgICAgMHgwOWVlICAvKiBVKzI1M0MgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMICovCisjZGVmaW5lIFhLX2hvcml6bGluZXNjYW4xICAgICAgICAgICAgICAgIDB4MDllZiAgLyogVSsyM0JBIEhPUklaT05UQUwgU0NBTiBMSU5FLTEgKi8KKyNkZWZpbmUgWEtfaG9yaXpsaW5lc2NhbjMgICAgICAgICAgICAgICAgMHgwOWYwICAvKiBVKzIzQkIgSE9SSVpPTlRBTCBTQ0FOIExJTkUtMyAqLworI2RlZmluZSBYS19ob3JpemxpbmVzY2FuNSAgICAgICAgICAgICAgICAweDA5ZjEgIC8qIFUrMjUwMCBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTCAqLworI2RlZmluZSBYS19ob3JpemxpbmVzY2FuNyAgICAgICAgICAgICAgICAweDA5ZjIgIC8qIFUrMjNCQyBIT1JJWk9OVEFMIFNDQU4gTElORS03ICovCisjZGVmaW5lIFhLX2hvcml6bGluZXNjYW45ICAgICAgICAgICAgICAgIDB4MDlmMyAgLyogVSsyM0JEIEhPUklaT05UQUwgU0NBTiBMSU5FLTkgKi8KKyNkZWZpbmUgWEtfbGVmdHQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWY0ICAvKiBVKzI1MUMgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVCAqLworI2RlZmluZSBYS19yaWdodHQgICAgICAgICAgICAgICAgICAgICAgICAweDA5ZjUgIC8qIFUrMjUyNCBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQgKi8KKyNkZWZpbmUgWEtfYm90dCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWY2ICAvKiBVKzI1MzQgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMICovCisjZGVmaW5lIFhLX3RvcHQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDlmNyAgLyogVSsyNTJDIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMICovCisjZGVmaW5lIFhLX3ZlcnRiYXIgICAgICAgICAgICAgICAgICAgICAgIDB4MDlmOCAgLyogVSsyNTAyIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCAqLworI2VuZGlmIC8qIFhLX1NQRUNJQUwgKi8KKworLyoKKyAqIFB1Ymxpc2hpbmcKKyAqICh0aGVzZSBhcmUgcHJvYmFibHkgZnJvbSBhIGxvbmcgZm9yZ290dGVuIERFQyBQdWJsaXNoaW5nCisgKiBmb250IHRoYXQgb25jZSBzaGlwcGVkIHdpdGggREVDd3JpdGUpCisgKiBCeXRlIDMgPSAweDBhCisgKi8KKworI2lmZGVmIFhLX1BVQkxJU0hJTkcKKyNkZWZpbmUgWEtfZW1zcGFjZSAgICAgICAgICAgICAgICAgICAgICAgMHgwYWExICAvKiBVKzIwMDMgRU0gU1BBQ0UgKi8KKyNkZWZpbmUgWEtfZW5zcGFjZSAgICAgICAgICAgICAgICAgICAgICAgMHgwYWEyICAvKiBVKzIwMDIgRU4gU1BBQ0UgKi8KKyNkZWZpbmUgWEtfZW0zc3BhY2UgICAgICAgICAgICAgICAgICAgICAgMHgwYWEzICAvKiBVKzIwMDQgVEhSRUUtUEVSLUVNIFNQQUNFICovCisjZGVmaW5lIFhLX2VtNHNwYWNlICAgICAgICAgICAgICAgICAgICAgIDB4MGFhNCAgLyogVSsyMDA1IEZPVVItUEVSLUVNIFNQQUNFICovCisjZGVmaW5lIFhLX2RpZ2l0c3BhY2UgICAgICAgICAgICAgICAgICAgIDB4MGFhNSAgLyogVSsyMDA3IEZJR1VSRSBTUEFDRSAqLworI2RlZmluZSBYS19wdW5jdHNwYWNlICAgICAgICAgICAgICAgICAgICAweDBhYTYgIC8qIFUrMjAwOCBQVU5DVFVBVElPTiBTUEFDRSAqLworI2RlZmluZSBYS190aGluc3BhY2UgICAgICAgICAgICAgICAgICAgICAweDBhYTcgIC8qIFUrMjAwOSBUSElOIFNQQUNFICovCisjZGVmaW5lIFhLX2hhaXJzcGFjZSAgICAgICAgICAgICAgICAgICAgIDB4MGFhOCAgLyogVSsyMDBBIEhBSVIgU1BBQ0UgKi8KKyNkZWZpbmUgWEtfZW1kYXNoICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWE5ICAvKiBVKzIwMTQgRU0gREFTSCAqLworI2RlZmluZSBYS19lbmRhc2ggICAgICAgICAgICAgICAgICAgICAgICAweDBhYWEgIC8qIFUrMjAxMyBFTiBEQVNIICovCisjZGVmaW5lIFhLX3NpZ25pZmJsYW5rICAgICAgICAgICAgICAgICAgIDB4MGFhYyAgLyooVSsyNDIzIE9QRU4gQk9YKSovCisjZGVmaW5lIFhLX2VsbGlwc2lzICAgICAgICAgICAgICAgICAgICAgIDB4MGFhZSAgLyogVSsyMDI2IEhPUklaT05UQUwgRUxMSVBTSVMgKi8KKyNkZWZpbmUgWEtfZG91YmJhc2VsaW5lZG90ICAgICAgICAgICAgICAgMHgwYWFmICAvKiBVKzIwMjUgVFdPIERPVCBMRUFERVIgKi8KKyNkZWZpbmUgWEtfb25ldGhpcmQgICAgICAgICAgICAgICAgICAgICAgMHgwYWIwICAvKiBVKzIxNTMgVlVMR0FSIEZSQUNUSU9OIE9ORSBUSElSRCAqLworI2RlZmluZSBYS190d290aGlyZHMgICAgICAgICAgICAgICAgICAgICAweDBhYjEgIC8qIFUrMjE1NCBWVUxHQVIgRlJBQ1RJT04gVFdPIFRISVJEUyAqLworI2RlZmluZSBYS19vbmVmaWZ0aCAgICAgICAgICAgICAgICAgICAgICAweDBhYjIgIC8qIFUrMjE1NSBWVUxHQVIgRlJBQ1RJT04gT05FIEZJRlRIICovCisjZGVmaW5lIFhLX3R3b2ZpZnRocyAgICAgICAgICAgICAgICAgICAgIDB4MGFiMyAgLyogVSsyMTU2IFZVTEdBUiBGUkFDVElPTiBUV08gRklGVEhTICovCisjZGVmaW5lIFhLX3RocmVlZmlmdGhzICAgICAgICAgICAgICAgICAgIDB4MGFiNCAgLyogVSsyMTU3IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBGSUZUSFMgKi8KKyNkZWZpbmUgWEtfZm91cmZpZnRocyAgICAgICAgICAgICAgICAgICAgMHgwYWI1ICAvKiBVKzIxNTggVlVMR0FSIEZSQUNUSU9OIEZPVVIgRklGVEhTICovCisjZGVmaW5lIFhLX29uZXNpeHRoICAgICAgICAgICAgICAgICAgICAgIDB4MGFiNiAgLyogVSsyMTU5IFZVTEdBUiBGUkFDVElPTiBPTkUgU0lYVEggKi8KKyNkZWZpbmUgWEtfZml2ZXNpeHRocyAgICAgICAgICAgICAgICAgICAgMHgwYWI3ICAvKiBVKzIxNUEgVlVMR0FSIEZSQUNUSU9OIEZJVkUgU0lYVEhTICovCisjZGVmaW5lIFhLX2NhcmVvZiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFiOCAgLyogVSsyMTA1IENBUkUgT0YgKi8KKyNkZWZpbmUgWEtfZmlnZGFzaCAgICAgICAgICAgICAgICAgICAgICAgMHgwYWJiICAvKiBVKzIwMTIgRklHVVJFIERBU0ggKi8KKyNkZWZpbmUgWEtfbGVmdGFuZ2xlYnJhY2tldCAgICAgICAgICAgICAgMHgwYWJjICAvKihVKzI3RTggTUFUSEVNQVRJQ0FMIExFRlQgQU5HTEUgQlJBQ0tFVCkqLworI2RlZmluZSBYS19kZWNpbWFscG9pbnQgICAgICAgICAgICAgICAgICAweDBhYmQgIC8qKFUrMDAyRSBGVUxMIFNUT1ApKi8KKyNkZWZpbmUgWEtfcmlnaHRhbmdsZWJyYWNrZXQgICAgICAgICAgICAgMHgwYWJlICAvKihVKzI3RTkgTUFUSEVNQVRJQ0FMIFJJR0hUIEFOR0xFIEJSQUNLRVQpKi8KKyNkZWZpbmUgWEtfbWFya2VyICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWJmCisjZGVmaW5lIFhLX29uZWVpZ2h0aCAgICAgICAgICAgICAgICAgICAgIDB4MGFjMyAgLyogVSsyMTVCIFZVTEdBUiBGUkFDVElPTiBPTkUgRUlHSFRIICovCisjZGVmaW5lIFhLX3RocmVlZWlnaHRocyAgICAgICAgICAgICAgICAgIDB4MGFjNCAgLyogVSsyMTVDIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBFSUdIVEhTICovCisjZGVmaW5lIFhLX2ZpdmVlaWdodGhzICAgICAgICAgICAgICAgICAgIDB4MGFjNSAgLyogVSsyMTVEIFZVTEdBUiBGUkFDVElPTiBGSVZFIEVJR0hUSFMgKi8KKyNkZWZpbmUgWEtfc2V2ZW5laWdodGhzICAgICAgICAgICAgICAgICAgMHgwYWM2ICAvKiBVKzIxNUUgVlVMR0FSIEZSQUNUSU9OIFNFVkVOIEVJR0hUSFMgKi8KKyNkZWZpbmUgWEtfdHJhZGVtYXJrICAgICAgICAgICAgICAgICAgICAgMHgwYWM5ICAvKiBVKzIxMjIgVFJBREUgTUFSSyBTSUdOICovCisjZGVmaW5lIFhLX3NpZ25hdHVyZW1hcmsgICAgICAgICAgICAgICAgIDB4MGFjYSAgLyooVSsyNjEzIFNBTFRJUkUpKi8KKyNkZWZpbmUgWEtfdHJhZGVtYXJraW5jaXJjbGUgICAgICAgICAgICAgMHgwYWNiCisjZGVmaW5lIFhLX2xlZnRvcGVudHJpYW5nbGUgICAgICAgICAgICAgIDB4MGFjYyAgLyooVSsyNUMxIFdISVRFIExFRlQtUE9JTlRJTkcgVFJJQU5HTEUpKi8KKyNkZWZpbmUgWEtfcmlnaHRvcGVudHJpYW5nbGUgICAgICAgICAgICAgMHgwYWNkICAvKihVKzI1QjcgV0hJVEUgUklHSFQtUE9JTlRJTkcgVFJJQU5HTEUpKi8KKyNkZWZpbmUgWEtfZW1vcGVuY2lyY2xlICAgICAgICAgICAgICAgICAgMHgwYWNlICAvKihVKzI1Q0IgV0hJVEUgQ0lSQ0xFKSovCisjZGVmaW5lIFhLX2Vtb3BlbnJlY3RhbmdsZSAgICAgICAgICAgICAgIDB4MGFjZiAgLyooVSsyNUFGIFdISVRFIFZFUlRJQ0FMIFJFQ1RBTkdMRSkqLworI2RlZmluZSBYS19sZWZ0c2luZ2xlcXVvdGVtYXJrICAgICAgICAgICAweDBhZDAgIC8qIFUrMjAxOCBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSyAqLworI2RlZmluZSBYS19yaWdodHNpbmdsZXF1b3RlbWFyayAgICAgICAgICAweDBhZDEgIC8qIFUrMjAxOSBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfbGVmdGRvdWJsZXF1b3RlbWFyayAgICAgICAgICAgMHgwYWQyICAvKiBVKzIwMUMgTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfcmlnaHRkb3VibGVxdW90ZW1hcmsgICAgICAgICAgMHgwYWQzICAvKiBVKzIwMUQgUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLICovCisjZGVmaW5lIFhLX3ByZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgIDB4MGFkNCAgLyogVSsyMTFFIFBSRVNDUklQVElPTiBUQUtFICovCisjZGVmaW5lIFhLX21pbnV0ZXMgICAgICAgICAgICAgICAgICAgICAgIDB4MGFkNiAgLyogVSsyMDMyIFBSSU1FICovCisjZGVmaW5lIFhLX3NlY29uZHMgICAgICAgICAgICAgICAgICAgICAgIDB4MGFkNyAgLyogVSsyMDMzIERPVUJMRSBQUklNRSAqLworI2RlZmluZSBYS19sYXRpbmNyb3NzICAgICAgICAgICAgICAgICAgICAweDBhZDkgIC8qIFUrMjcxRCBMQVRJTiBDUk9TUyAqLworI2RlZmluZSBYS19oZXhhZ3JhbSAgICAgICAgICAgICAgICAgICAgICAweDBhZGEKKyNkZWZpbmUgWEtfZmlsbGVkcmVjdGJ1bGxldCAgICAgICAgICAgICAgMHgwYWRiICAvKihVKzI1QUMgQkxBQ0sgUkVDVEFOR0xFKSovCisjZGVmaW5lIFhLX2ZpbGxlZGxlZnR0cmlidWxsZXQgICAgICAgICAgIDB4MGFkYyAgLyooVSsyNUMwIEJMQUNLIExFRlQtUE9JTlRJTkcgVFJJQU5HTEUpKi8KKyNkZWZpbmUgWEtfZmlsbGVkcmlnaHR0cmlidWxsZXQgICAgICAgICAgMHgwYWRkICAvKihVKzI1QjYgQkxBQ0sgUklHSFQtUE9JTlRJTkcgVFJJQU5HTEUpKi8KKyNkZWZpbmUgWEtfZW1maWxsZWRjaXJjbGUgICAgICAgICAgICAgICAgMHgwYWRlICAvKihVKzI1Q0YgQkxBQ0sgQ0lSQ0xFKSovCisjZGVmaW5lIFhLX2VtZmlsbGVkcmVjdCAgICAgICAgICAgICAgICAgIDB4MGFkZiAgLyooVSsyNUFFIEJMQUNLIFZFUlRJQ0FMIFJFQ1RBTkdMRSkqLworI2RlZmluZSBYS19lbm9wZW5jaXJjYnVsbGV0ICAgICAgICAgICAgICAweDBhZTAgIC8qKFUrMjVFNiBXSElURSBCVUxMRVQpKi8KKyNkZWZpbmUgWEtfZW5vcGVuc3F1YXJlYnVsbGV0ICAgICAgICAgICAgMHgwYWUxICAvKihVKzI1QUIgV0hJVEUgU01BTEwgU1FVQVJFKSovCisjZGVmaW5lIFhLX29wZW5yZWN0YnVsbGV0ICAgICAgICAgICAgICAgIDB4MGFlMiAgLyooVSsyNUFEIFdISVRFIFJFQ1RBTkdMRSkqLworI2RlZmluZSBYS19vcGVudHJpYnVsbGV0dXAgICAgICAgICAgICAgICAweDBhZTMgIC8qKFUrMjVCMyBXSElURSBVUC1QT0lOVElORyBUUklBTkdMRSkqLworI2RlZmluZSBYS19vcGVudHJpYnVsbGV0ZG93biAgICAgICAgICAgICAweDBhZTQgIC8qKFUrMjVCRCBXSElURSBET1dOLVBPSU5USU5HIFRSSUFOR0xFKSovCisjZGVmaW5lIFhLX29wZW5zdGFyICAgICAgICAgICAgICAgICAgICAgIDB4MGFlNSAgLyooVSsyNjA2IFdISVRFIFNUQVIpKi8KKyNkZWZpbmUgWEtfZW5maWxsZWRjaXJjYnVsbGV0ICAgICAgICAgICAgMHgwYWU2ICAvKihVKzIwMjIgQlVMTEVUKSovCisjZGVmaW5lIFhLX2VuZmlsbGVkc3FidWxsZXQgICAgICAgICAgICAgIDB4MGFlNyAgLyooVSsyNUFBIEJMQUNLIFNNQUxMIFNRVUFSRSkqLworI2RlZmluZSBYS19maWxsZWR0cmlidWxsZXR1cCAgICAgICAgICAgICAweDBhZTggIC8qKFUrMjVCMiBCTEFDSyBVUC1QT0lOVElORyBUUklBTkdMRSkqLworI2RlZmluZSBYS19maWxsZWR0cmlidWxsZXRkb3duICAgICAgICAgICAweDBhZTkgIC8qKFUrMjVCQyBCTEFDSyBET1dOLVBPSU5USU5HIFRSSUFOR0xFKSovCisjZGVmaW5lIFhLX2xlZnRwb2ludGVyICAgICAgICAgICAgICAgICAgIDB4MGFlYSAgLyooVSsyNjFDIFdISVRFIExFRlQgUE9JTlRJTkcgSU5ERVgpKi8KKyNkZWZpbmUgWEtfcmlnaHRwb2ludGVyICAgICAgICAgICAgICAgICAgMHgwYWViICAvKihVKzI2MUUgV0hJVEUgUklHSFQgUE9JTlRJTkcgSU5ERVgpKi8KKyNkZWZpbmUgWEtfY2x1YiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWVjICAvKiBVKzI2NjMgQkxBQ0sgQ0xVQiBTVUlUICovCisjZGVmaW5lIFhLX2RpYW1vbmQgICAgICAgICAgICAgICAgICAgICAgIDB4MGFlZCAgLyogVSsyNjY2IEJMQUNLIERJQU1PTkQgU1VJVCAqLworI2RlZmluZSBYS19oZWFydCAgICAgICAgICAgICAgICAgICAgICAgICAweDBhZWUgIC8qIFUrMjY2NSBCTEFDSyBIRUFSVCBTVUlUICovCisjZGVmaW5lIFhLX21hbHRlc2Vjcm9zcyAgICAgICAgICAgICAgICAgIDB4MGFmMCAgLyogVSsyNzIwIE1BTFRFU0UgQ1JPU1MgKi8KKyNkZWZpbmUgWEtfZGFnZ2VyICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWYxICAvKiBVKzIwMjAgREFHR0VSICovCisjZGVmaW5lIFhLX2RvdWJsZWRhZ2dlciAgICAgICAgICAgICAgICAgIDB4MGFmMiAgLyogVSsyMDIxIERPVUJMRSBEQUdHRVIgKi8KKyNkZWZpbmUgWEtfY2hlY2ttYXJrICAgICAgICAgICAgICAgICAgICAgMHgwYWYzICAvKiBVKzI3MTMgQ0hFQ0sgTUFSSyAqLworI2RlZmluZSBYS19iYWxsb3Rjcm9zcyAgICAgICAgICAgICAgICAgICAweDBhZjQgIC8qIFUrMjcxNyBCQUxMT1QgWCAqLworI2RlZmluZSBYS19tdXNpY2Fsc2hhcnAgICAgICAgICAgICAgICAgICAweDBhZjUgIC8qIFUrMjY2RiBNVVNJQyBTSEFSUCBTSUdOICovCisjZGVmaW5lIFhLX211c2ljYWxmbGF0ICAgICAgICAgICAgICAgICAgIDB4MGFmNiAgLyogVSsyNjZEIE1VU0lDIEZMQVQgU0lHTiAqLworI2RlZmluZSBYS19tYWxlc3ltYm9sICAgICAgICAgICAgICAgICAgICAweDBhZjcgIC8qIFUrMjY0MiBNQUxFIFNJR04gKi8KKyNkZWZpbmUgWEtfZmVtYWxlc3ltYm9sICAgICAgICAgICAgICAgICAgMHgwYWY4ICAvKiBVKzI2NDAgRkVNQUxFIFNJR04gKi8KKyNkZWZpbmUgWEtfdGVsZXBob25lICAgICAgICAgICAgICAgICAgICAgMHgwYWY5ICAvKiBVKzI2MEUgQkxBQ0sgVEVMRVBIT05FICovCisjZGVmaW5lIFhLX3RlbGVwaG9uZXJlY29yZGVyICAgICAgICAgICAgIDB4MGFmYSAgLyogVSsyMzE1IFRFTEVQSE9ORSBSRUNPUkRFUiAqLworI2RlZmluZSBYS19waG9ub2dyYXBoY29weXJpZ2h0ICAgICAgICAgICAweDBhZmIgIC8qIFUrMjExNyBTT1VORCBSRUNPUkRJTkcgQ09QWVJJR0hUICovCisjZGVmaW5lIFhLX2NhcmV0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFmYyAgLyogVSsyMDM4IENBUkVUICovCisjZGVmaW5lIFhLX3NpbmdsZWxvd3F1b3RlbWFyayAgICAgICAgICAgIDB4MGFmZCAgLyogVSsyMDFBIFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSyAqLworI2RlZmluZSBYS19kb3VibGVsb3dxdW90ZW1hcmsgICAgICAgICAgICAweDBhZmUgIC8qIFUrMjAxRSBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfY3Vyc29yICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWZmCisjZW5kaWYgLyogWEtfUFVCTElTSElORyAqLworCisvKgorICogQVBMCisgKiBCeXRlIDMgPSAweDBiCisgKi8KKworI2lmZGVmIFhLX0FQTAorI2RlZmluZSBYS19sZWZ0Y2FyZXQgICAgICAgICAgICAgICAgICAgICAweDBiYTMgIC8qKFUrMDAzQyBMRVNTLVRIQU4gU0lHTikqLworI2RlZmluZSBYS19yaWdodGNhcmV0ICAgICAgICAgICAgICAgICAgICAweDBiYTYgIC8qKFUrMDAzRSBHUkVBVEVSLVRIQU4gU0lHTikqLworI2RlZmluZSBYS19kb3duY2FyZXQgICAgICAgICAgICAgICAgICAgICAweDBiYTggIC8qKFUrMjIyOCBMT0dJQ0FMIE9SKSovCisjZGVmaW5lIFhLX3VwY2FyZXQgICAgICAgICAgICAgICAgICAgICAgIDB4MGJhOSAgLyooVSsyMjI3IExPR0lDQUwgQU5EKSovCisjZGVmaW5lIFhLX292ZXJiYXIgICAgICAgICAgICAgICAgICAgICAgIDB4MGJjMCAgLyooVSswMEFGIE1BQ1JPTikqLworI2RlZmluZSBYS19kb3dudGFjayAgICAgICAgICAgICAgICAgICAgICAweDBiYzIgIC8qIFUrMjJBNCBET1dOIFRBQ0sgKi8KKyNkZWZpbmUgWEtfdXBzaG9lICAgICAgICAgICAgICAgICAgICAgICAgMHgwYmMzICAvKihVKzIyMjkgSU5URVJTRUNUSU9OKSovCisjZGVmaW5lIFhLX2Rvd25zdGlsZSAgICAgICAgICAgICAgICAgICAgIDB4MGJjNCAgLyogVSsyMzBBIExFRlQgRkxPT1IgKi8KKyNkZWZpbmUgWEtfdW5kZXJiYXIgICAgICAgICAgICAgICAgICAgICAgMHgwYmM2ICAvKihVKzAwNUYgTE9XIExJTkUpKi8KKyNkZWZpbmUgWEtfam90ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYmNhICAvKiBVKzIyMTggUklORyBPUEVSQVRPUiAqLworI2RlZmluZSBYS19xdWFkICAgICAgICAgICAgICAgICAgICAgICAgICAweDBiY2MgIC8qIFUrMjM5NSBBUEwgRlVOQ1RJT05BTCBTWU1CT0wgUVVBRCAqLworI2RlZmluZSBYS191cHRhY2sgICAgICAgICAgICAgICAgICAgICAgICAweDBiY2UgIC8qIFUrMjJBNSBVUCBUQUNLICovCisjZGVmaW5lIFhLX2NpcmNsZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGJjZiAgLyogVSsyNUNCIFdISVRFIENJUkNMRSAqLworI2RlZmluZSBYS191cHN0aWxlICAgICAgICAgICAgICAgICAgICAgICAweDBiZDMgIC8qIFUrMjMwOCBMRUZUIENFSUxJTkcgKi8KKyNkZWZpbmUgWEtfZG93bnNob2UgICAgICAgICAgICAgICAgICAgICAgMHgwYmQ2ICAvKihVKzIyMkEgVU5JT04pKi8KKyNkZWZpbmUgWEtfcmlnaHRzaG9lICAgICAgICAgICAgICAgICAgICAgMHgwYmQ4ICAvKihVKzIyODMgU1VQRVJTRVQgT0YpKi8KKyNkZWZpbmUgWEtfbGVmdHNob2UgICAgICAgICAgICAgICAgICAgICAgMHgwYmRhICAvKihVKzIyODIgU1VCU0VUIE9GKSovCisjZGVmaW5lIFhLX2xlZnR0YWNrICAgICAgICAgICAgICAgICAgICAgIDB4MGJkYyAgLyogVSsyMkEzIExFRlQgVEFDSyAqLworI2RlZmluZSBYS19yaWdodHRhY2sgICAgICAgICAgICAgICAgICAgICAweDBiZmMgIC8qIFUrMjJBMiBSSUdIVCBUQUNLICovCisjZW5kaWYgLyogWEtfQVBMICovCisKKy8qCisgKiBIZWJyZXcKKyAqIEJ5dGUgMyA9IDB4MGMKKyAqLworCisjaWZkZWYgWEtfSEVCUkVXCisjZGVmaW5lIFhLX2hlYnJld19kb3VibGVsb3dsaW5lICAgICAgICAgIDB4MGNkZiAgLyogVSsyMDE3IERPVUJMRSBMT1cgTElORSAqLworI2RlZmluZSBYS19oZWJyZXdfYWxlcGggICAgICAgICAgICAgICAgICAweDBjZTAgIC8qIFUrMDVEMCBIRUJSRVcgTEVUVEVSIEFMRUYgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2JldCAgICAgICAgICAgICAgICAgICAgMHgwY2UxICAvKiBVKzA1RDEgSEVCUkVXIExFVFRFUiBCRVQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2JldGggICAgICAgICAgICAgICAgICAgMHgwY2UxICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld19naW1lbCAgICAgICAgICAgICAgICAgIDB4MGNlMiAgLyogVSswNUQyIEhFQlJFVyBMRVRURVIgR0lNRUwgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2dpbW1lbCAgICAgICAgICAgICAgICAgMHgwY2UyICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld19kYWxldCAgICAgICAgICAgICAgICAgIDB4MGNlMyAgLyogVSswNUQzIEhFQlJFVyBMRVRURVIgREFMRVQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2RhbGV0aCAgICAgICAgICAgICAgICAgMHgwY2UzICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld19oZSAgICAgICAgICAgICAgICAgICAgIDB4MGNlNCAgLyogVSswNUQ0IEhFQlJFVyBMRVRURVIgSEUgKi8KKyNkZWZpbmUgWEtfaGVicmV3X3dhdyAgICAgICAgICAgICAgICAgICAgMHgwY2U1ICAvKiBVKzA1RDUgSEVCUkVXIExFVFRFUiBWQVYgKi8KKyNkZWZpbmUgWEtfaGVicmV3X3phaW4gICAgICAgICAgICAgICAgICAgMHgwY2U2ICAvKiBVKzA1RDYgSEVCUkVXIExFVFRFUiBaQVlJTiAqLworI2RlZmluZSBYS19oZWJyZXdfemF5aW4gICAgICAgICAgICAgICAgICAweDBjZTYgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2NoZXQgICAgICAgICAgICAgICAgICAgMHgwY2U3ICAvKiBVKzA1RDcgSEVCUkVXIExFVFRFUiBIRVQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2hldCAgICAgICAgICAgICAgICAgICAgMHgwY2U3ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld190ZXQgICAgICAgICAgICAgICAgICAgIDB4MGNlOCAgLyogVSswNUQ4IEhFQlJFVyBMRVRURVIgVEVUICovCisjZGVmaW5lIFhLX2hlYnJld190ZXRoICAgICAgICAgICAgICAgICAgIDB4MGNlOCAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfeW9kICAgICAgICAgICAgICAgICAgICAweDBjZTkgIC8qIFUrMDVEOSBIRUJSRVcgTEVUVEVSIFlPRCAqLworI2RlZmluZSBYS19oZWJyZXdfZmluYWxrYXBoICAgICAgICAgICAgICAweDBjZWEgIC8qIFUrMDVEQSBIRUJSRVcgTEVUVEVSIEZJTkFMIEtBRiAqLworI2RlZmluZSBYS19oZWJyZXdfa2FwaCAgICAgICAgICAgICAgICAgICAweDBjZWIgIC8qIFUrMDVEQiBIRUJSRVcgTEVUVEVSIEtBRiAqLworI2RlZmluZSBYS19oZWJyZXdfbGFtZWQgICAgICAgICAgICAgICAgICAweDBjZWMgIC8qIFUrMDVEQyBIRUJSRVcgTEVUVEVSIExBTUVEICovCisjZGVmaW5lIFhLX2hlYnJld19maW5hbG1lbSAgICAgICAgICAgICAgIDB4MGNlZCAgLyogVSswNUREIEhFQlJFVyBMRVRURVIgRklOQUwgTUVNICovCisjZGVmaW5lIFhLX2hlYnJld19tZW0gICAgICAgICAgICAgICAgICAgIDB4MGNlZSAgLyogVSswNURFIEhFQlJFVyBMRVRURVIgTUVNICovCisjZGVmaW5lIFhLX2hlYnJld19maW5hbG51biAgICAgICAgICAgICAgIDB4MGNlZiAgLyogVSswNURGIEhFQlJFVyBMRVRURVIgRklOQUwgTlVOICovCisjZGVmaW5lIFhLX2hlYnJld19udW4gICAgICAgICAgICAgICAgICAgIDB4MGNmMCAgLyogVSswNUUwIEhFQlJFVyBMRVRURVIgTlVOICovCisjZGVmaW5lIFhLX2hlYnJld19zYW1lY2ggICAgICAgICAgICAgICAgIDB4MGNmMSAgLyogVSswNUUxIEhFQlJFVyBMRVRURVIgU0FNRUtIICovCisjZGVmaW5lIFhLX2hlYnJld19zYW1la2ggICAgICAgICAgICAgICAgIDB4MGNmMSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfYXlpbiAgICAgICAgICAgICAgICAgICAweDBjZjIgIC8qIFUrMDVFMiBIRUJSRVcgTEVUVEVSIEFZSU4gKi8KKyNkZWZpbmUgWEtfaGVicmV3X2ZpbmFscGUgICAgICAgICAgICAgICAgMHgwY2YzICAvKiBVKzA1RTMgSEVCUkVXIExFVFRFUiBGSU5BTCBQRSAqLworI2RlZmluZSBYS19oZWJyZXdfcGUgICAgICAgICAgICAgICAgICAgICAweDBjZjQgIC8qIFUrMDVFNCBIRUJSRVcgTEVUVEVSIFBFICovCisjZGVmaW5lIFhLX2hlYnJld19maW5hbHphZGUgICAgICAgICAgICAgIDB4MGNmNSAgLyogVSswNUU1IEhFQlJFVyBMRVRURVIgRklOQUwgVFNBREkgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2ZpbmFsemFkaSAgICAgICAgICAgICAgMHgwY2Y1ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld196YWRlICAgICAgICAgICAgICAgICAgIDB4MGNmNiAgLyogVSswNUU2IEhFQlJFVyBMRVRURVIgVFNBREkgKi8KKyNkZWZpbmUgWEtfaGVicmV3X3phZGkgICAgICAgICAgICAgICAgICAgMHgwY2Y2ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld19xb3BoICAgICAgICAgICAgICAgICAgIDB4MGNmNyAgLyogVSswNUU3IEhFQlJFVyBMRVRURVIgUU9GICovCisjZGVmaW5lIFhLX2hlYnJld19rdWYgICAgICAgICAgICAgICAgICAgIDB4MGNmNyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfcmVzaCAgICAgICAgICAgICAgICAgICAweDBjZjggIC8qIFUrMDVFOCBIRUJSRVcgTEVUVEVSIFJFU0ggKi8KKyNkZWZpbmUgWEtfaGVicmV3X3NoaW4gICAgICAgICAgICAgICAgICAgMHgwY2Y5ICAvKiBVKzA1RTkgSEVCUkVXIExFVFRFUiBTSElOICovCisjZGVmaW5lIFhLX2hlYnJld190YXcgICAgICAgICAgICAgICAgICAgIDB4MGNmYSAgLyogVSswNUVBIEhFQlJFVyBMRVRURVIgVEFWICovCisjZGVmaW5lIFhLX2hlYnJld190YWYgICAgICAgICAgICAgICAgICAgIDB4MGNmYSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19IZWJyZXdfc3dpdGNoICAgICAgICAgICAgICAgICAweGZmN2UgIC8qIEFsaWFzIGZvciBtb2RlX3N3aXRjaCAqLworI2VuZGlmIC8qIFhLX0hFQlJFVyAqLworCisvKgorICogVGhhaQorICogQnl0ZSAzID0gMHgwZAorICovCisKKyNpZmRlZiBYS19USEFJCisjZGVmaW5lIFhLX1RoYWlfa29rYWkgICAgICAgICAgICAgICAgICAgIDB4MGRhMSAgLyogVSswRTAxIFRIQUkgQ0hBUkFDVEVSIEtPIEtBSSAqLworI2RlZmluZSBYS19UaGFpX2tob2toYWkgICAgICAgICAgICAgICAgICAweDBkYTIgIC8qIFUrMEUwMiBUSEFJIENIQVJBQ1RFUiBLSE8gS0hBSSAqLworI2RlZmluZSBYS19UaGFpX2tob2todWF0ICAgICAgICAgICAgICAgICAweDBkYTMgIC8qIFUrMEUwMyBUSEFJIENIQVJBQ1RFUiBLSE8gS0hVQVQgKi8KKyNkZWZpbmUgWEtfVGhhaV9raG9raHdhaSAgICAgICAgICAgICAgICAgMHgwZGE0ICAvKiBVKzBFMDQgVEhBSSBDSEFSQUNURVIgS0hPIEtIV0FJICovCisjZGVmaW5lIFhLX1RoYWlfa2hva2hvbiAgICAgICAgICAgICAgICAgIDB4MGRhNSAgLyogVSswRTA1IFRIQUkgQ0hBUkFDVEVSIEtITyBLSE9OICovCisjZGVmaW5lIFhLX1RoYWlfa2hvcmFraGFuZyAgICAgICAgICAgICAgIDB4MGRhNiAgLyogVSswRTA2IFRIQUkgQ0hBUkFDVEVSIEtITyBSQUtIQU5HICovCisjZGVmaW5lIFhLX1RoYWlfbmdvbmd1ICAgICAgICAgICAgICAgICAgIDB4MGRhNyAgLyogVSswRTA3IFRIQUkgQ0hBUkFDVEVSIE5HTyBOR1UgKi8KKyNkZWZpbmUgWEtfVGhhaV9jaG9jaGFuICAgICAgICAgICAgICAgICAgMHgwZGE4ICAvKiBVKzBFMDggVEhBSSBDSEFSQUNURVIgQ0hPIENIQU4gKi8KKyNkZWZpbmUgWEtfVGhhaV9jaG9jaGluZyAgICAgICAgICAgICAgICAgMHgwZGE5ICAvKiBVKzBFMDkgVEhBSSBDSEFSQUNURVIgQ0hPIENISU5HICovCisjZGVmaW5lIFhLX1RoYWlfY2hvY2hhbmcgICAgICAgICAgICAgICAgIDB4MGRhYSAgLyogVSswRTBBIFRIQUkgQ0hBUkFDVEVSIENITyBDSEFORyAqLworI2RlZmluZSBYS19UaGFpX3Nvc28gICAgICAgICAgICAgICAgICAgICAweDBkYWIgIC8qIFUrMEUwQiBUSEFJIENIQVJBQ1RFUiBTTyBTTyAqLworI2RlZmluZSBYS19UaGFpX2Nob2Nob2UgICAgICAgICAgICAgICAgICAweDBkYWMgIC8qIFUrMEUwQyBUSEFJIENIQVJBQ1RFUiBDSE8gQ0hPRSAqLworI2RlZmluZSBYS19UaGFpX3lveWluZyAgICAgICAgICAgICAgICAgICAweDBkYWQgIC8qIFUrMEUwRCBUSEFJIENIQVJBQ1RFUiBZTyBZSU5HICovCisjZGVmaW5lIFhLX1RoYWlfZG9jaGFkYSAgICAgICAgICAgICAgICAgIDB4MGRhZSAgLyogVSswRTBFIFRIQUkgQ0hBUkFDVEVSIERPIENIQURBICovCisjZGVmaW5lIFhLX1RoYWlfdG9wYXRhayAgICAgICAgICAgICAgICAgIDB4MGRhZiAgLyogVSswRTBGIFRIQUkgQ0hBUkFDVEVSIFRPIFBBVEFLICovCisjZGVmaW5lIFhLX1RoYWlfdGhvdGhhbiAgICAgICAgICAgICAgICAgIDB4MGRiMCAgLyogVSswRTEwIFRIQUkgQ0hBUkFDVEVSIFRITyBUSEFOICovCisjZGVmaW5lIFhLX1RoYWlfdGhvbmFuZ21vbnRobyAgICAgICAgICAgIDB4MGRiMSAgLyogVSswRTExIFRIQUkgQ0hBUkFDVEVSIFRITyBOQU5HTU9OVEhPICovCisjZGVmaW5lIFhLX1RoYWlfdGhvcGh1dGhhbyAgICAgICAgICAgICAgIDB4MGRiMiAgLyogVSswRTEyIFRIQUkgQ0hBUkFDVEVSIFRITyBQSFVUSEFPICovCisjZGVmaW5lIFhLX1RoYWlfbm9uZW4gICAgICAgICAgICAgICAgICAgIDB4MGRiMyAgLyogVSswRTEzIFRIQUkgQ0hBUkFDVEVSIE5PIE5FTiAqLworI2RlZmluZSBYS19UaGFpX2RvZGVrICAgICAgICAgICAgICAgICAgICAweDBkYjQgIC8qIFUrMEUxNCBUSEFJIENIQVJBQ1RFUiBETyBERUsgKi8KKyNkZWZpbmUgWEtfVGhhaV90b3RhbyAgICAgICAgICAgICAgICAgICAgMHgwZGI1ICAvKiBVKzBFMTUgVEhBSSBDSEFSQUNURVIgVE8gVEFPICovCisjZGVmaW5lIFhLX1RoYWlfdGhvdGh1bmcgICAgICAgICAgICAgICAgIDB4MGRiNiAgLyogVSswRTE2IFRIQUkgQ0hBUkFDVEVSIFRITyBUSFVORyAqLworI2RlZmluZSBYS19UaGFpX3Rob3RoYWhhbiAgICAgICAgICAgICAgICAweDBkYjcgIC8qIFUrMEUxNyBUSEFJIENIQVJBQ1RFUiBUSE8gVEhBSEFOICovCisjZGVmaW5lIFhLX1RoYWlfdGhvdGhvbmcgICAgICAgICAgICAgICAgIDB4MGRiOCAgLyogVSswRTE4IFRIQUkgQ0hBUkFDVEVSIFRITyBUSE9ORyAqLworI2RlZmluZSBYS19UaGFpX25vbnUgICAgICAgICAgICAgICAgICAgICAweDBkYjkgIC8qIFUrMEUxOSBUSEFJIENIQVJBQ1RFUiBOTyBOVSAqLworI2RlZmluZSBYS19UaGFpX2JvYmFpbWFpICAgICAgICAgICAgICAgICAweDBkYmEgIC8qIFUrMEUxQSBUSEFJIENIQVJBQ1RFUiBCTyBCQUlNQUkgKi8KKyNkZWZpbmUgWEtfVGhhaV9wb3BsYSAgICAgICAgICAgICAgICAgICAgMHgwZGJiICAvKiBVKzBFMUIgVEhBSSBDSEFSQUNURVIgUE8gUExBICovCisjZGVmaW5lIFhLX1RoYWlfcGhvcGh1bmcgICAgICAgICAgICAgICAgIDB4MGRiYyAgLyogVSswRTFDIFRIQUkgQ0hBUkFDVEVSIFBITyBQSFVORyAqLworI2RlZmluZSBYS19UaGFpX2ZvZmEgICAgICAgICAgICAgICAgICAgICAweDBkYmQgIC8qIFUrMEUxRCBUSEFJIENIQVJBQ1RFUiBGTyBGQSAqLworI2RlZmluZSBYS19UaGFpX3Bob3BoYW4gICAgICAgICAgICAgICAgICAweDBkYmUgIC8qIFUrMEUxRSBUSEFJIENIQVJBQ1RFUiBQSE8gUEhBTiAqLworI2RlZmluZSBYS19UaGFpX2ZvZmFuICAgICAgICAgICAgICAgICAgICAweDBkYmYgIC8qIFUrMEUxRiBUSEFJIENIQVJBQ1RFUiBGTyBGQU4gKi8KKyNkZWZpbmUgWEtfVGhhaV9waG9zYW1waGFvICAgICAgICAgICAgICAgMHgwZGMwICAvKiBVKzBFMjAgVEhBSSBDSEFSQUNURVIgUEhPIFNBTVBIQU8gKi8KKyNkZWZpbmUgWEtfVGhhaV9tb21hICAgICAgICAgICAgICAgICAgICAgMHgwZGMxICAvKiBVKzBFMjEgVEhBSSBDSEFSQUNURVIgTU8gTUEgKi8KKyNkZWZpbmUgWEtfVGhhaV95b3lhayAgICAgICAgICAgICAgICAgICAgMHgwZGMyICAvKiBVKzBFMjIgVEhBSSBDSEFSQUNURVIgWU8gWUFLICovCisjZGVmaW5lIFhLX1RoYWlfcm9ydWEgICAgICAgICAgICAgICAgICAgIDB4MGRjMyAgLyogVSswRTIzIFRIQUkgQ0hBUkFDVEVSIFJPIFJVQSAqLworI2RlZmluZSBYS19UaGFpX3J1ICAgICAgICAgICAgICAgICAgICAgICAweDBkYzQgIC8qIFUrMEUyNCBUSEFJIENIQVJBQ1RFUiBSVSAqLworI2RlZmluZSBYS19UaGFpX2xvbGluZyAgICAgICAgICAgICAgICAgICAweDBkYzUgIC8qIFUrMEUyNSBUSEFJIENIQVJBQ1RFUiBMTyBMSU5HICovCisjZGVmaW5lIFhLX1RoYWlfbHUgICAgICAgICAgICAgICAgICAgICAgIDB4MGRjNiAgLyogVSswRTI2IFRIQUkgQ0hBUkFDVEVSIExVICovCisjZGVmaW5lIFhLX1RoYWlfd293YWVuICAgICAgICAgICAgICAgICAgIDB4MGRjNyAgLyogVSswRTI3IFRIQUkgQ0hBUkFDVEVSIFdPIFdBRU4gKi8KKyNkZWZpbmUgWEtfVGhhaV9zb3NhbGEgICAgICAgICAgICAgICAgICAgMHgwZGM4ICAvKiBVKzBFMjggVEhBSSBDSEFSQUNURVIgU08gU0FMQSAqLworI2RlZmluZSBYS19UaGFpX3NvcnVzaSAgICAgICAgICAgICAgICAgICAweDBkYzkgIC8qIFUrMEUyOSBUSEFJIENIQVJBQ1RFUiBTTyBSVVNJICovCisjZGVmaW5lIFhLX1RoYWlfc29zdWEgICAgICAgICAgICAgICAgICAgIDB4MGRjYSAgLyogVSswRTJBIFRIQUkgQ0hBUkFDVEVSIFNPIFNVQSAqLworI2RlZmluZSBYS19UaGFpX2hvaGlwICAgICAgICAgICAgICAgICAgICAweDBkY2IgIC8qIFUrMEUyQiBUSEFJIENIQVJBQ1RFUiBITyBISVAgKi8KKyNkZWZpbmUgWEtfVGhhaV9sb2NodWxhICAgICAgICAgICAgICAgICAgMHgwZGNjICAvKiBVKzBFMkMgVEhBSSBDSEFSQUNURVIgTE8gQ0hVTEEgKi8KKyNkZWZpbmUgWEtfVGhhaV9vYW5nICAgICAgICAgICAgICAgICAgICAgMHgwZGNkICAvKiBVKzBFMkQgVEhBSSBDSEFSQUNURVIgTyBBTkcgKi8KKyNkZWZpbmUgWEtfVGhhaV9ob25va2h1ayAgICAgICAgICAgICAgICAgMHgwZGNlICAvKiBVKzBFMkUgVEhBSSBDSEFSQUNURVIgSE8gTk9LSFVLICovCisjZGVmaW5lIFhLX1RoYWlfcGFpeWFubm9pICAgICAgICAgICAgICAgIDB4MGRjZiAgLyogVSswRTJGIFRIQUkgQ0hBUkFDVEVSIFBBSVlBTk5PSSAqLworI2RlZmluZSBYS19UaGFpX3NhcmFhICAgICAgICAgICAgICAgICAgICAweDBkZDAgIC8qIFUrMEUzMCBUSEFJIENIQVJBQ1RFUiBTQVJBIEEgKi8KKyNkZWZpbmUgWEtfVGhhaV9tYWloYW5ha2F0ICAgICAgICAgICAgICAgMHgwZGQxICAvKiBVKzBFMzEgVEhBSSBDSEFSQUNURVIgTUFJIEhBTi1BS0FUICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYWFhICAgICAgICAgICAgICAgICAgIDB4MGRkMiAgLyogVSswRTMyIFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUEgKi8KKyNkZWZpbmUgWEtfVGhhaV9zYXJhYW0gICAgICAgICAgICAgICAgICAgMHgwZGQzICAvKiBVKzBFMzMgVEhBSSBDSEFSQUNURVIgU0FSQSBBTSAqLworI2RlZmluZSBYS19UaGFpX3NhcmFpICAgICAgICAgICAgICAgICAgICAweDBkZDQgIC8qIFUrMEUzNCBUSEFJIENIQVJBQ1RFUiBTQVJBIEkgKi8KKyNkZWZpbmUgWEtfVGhhaV9zYXJhaWkgICAgICAgICAgICAgICAgICAgMHgwZGQ1ICAvKiBVKzBFMzUgVEhBSSBDSEFSQUNURVIgU0FSQSBJSSAqLworI2RlZmluZSBYS19UaGFpX3NhcmF1ZSAgICAgICAgICAgICAgICAgICAweDBkZDYgIC8qIFUrMEUzNiBUSEFJIENIQVJBQ1RFUiBTQVJBIFVFICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYXVlZSAgICAgICAgICAgICAgICAgIDB4MGRkNyAgLyogVSswRTM3IFRIQUkgQ0hBUkFDVEVSIFNBUkEgVUVFICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYXUgICAgICAgICAgICAgICAgICAgIDB4MGRkOCAgLyogVSswRTM4IFRIQUkgQ0hBUkFDVEVSIFNBUkEgVSAqLworI2RlZmluZSBYS19UaGFpX3NhcmF1dSAgICAgICAgICAgICAgICAgICAweDBkZDkgIC8qIFUrMEUzOSBUSEFJIENIQVJBQ1RFUiBTQVJBIFVVICovCisjZGVmaW5lIFhLX1RoYWlfcGhpbnRodSAgICAgICAgICAgICAgICAgIDB4MGRkYSAgLyogVSswRTNBIFRIQUkgQ0hBUkFDVEVSIFBISU5USFUgKi8KKyNkZWZpbmUgWEtfVGhhaV9tYWloYW5ha2F0X21haXRobyAgICAgICAgMHgwZGRlCisjZGVmaW5lIFhLX1RoYWlfYmFodCAgICAgICAgICAgICAgICAgICAgIDB4MGRkZiAgLyogVSswRTNGIFRIQUkgQ1VSUkVOQ1kgU1lNQk9MIEJBSFQgKi8KKyNkZWZpbmUgWEtfVGhhaV9zYXJhZSAgICAgICAgICAgICAgICAgICAgMHgwZGUwICAvKiBVKzBFNDAgVEhBSSBDSEFSQUNURVIgU0FSQSBFICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYWFlICAgICAgICAgICAgICAgICAgIDB4MGRlMSAgLyogVSswRTQxIFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUUgKi8KKyNkZWZpbmUgWEtfVGhhaV9zYXJhbyAgICAgICAgICAgICAgICAgICAgMHgwZGUyICAvKiBVKzBFNDIgVEhBSSBDSEFSQUNURVIgU0FSQSBPICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYWFpbWFpbXVhbiAgICAgICAgICAgIDB4MGRlMyAgLyogVSswRTQzIFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUkgTUFJTVVBTiAqLworI2RlZmluZSBYS19UaGFpX3NhcmFhaW1haW1hbGFpICAgICAgICAgICAweDBkZTQgIC8qIFUrMEU0NCBUSEFJIENIQVJBQ1RFUiBTQVJBIEFJIE1BSU1BTEFJICovCisjZGVmaW5lIFhLX1RoYWlfbGFra2hhbmd5YW8gICAgICAgICAgICAgIDB4MGRlNSAgLyogVSswRTQ1IFRIQUkgQ0hBUkFDVEVSIExBS0tIQU5HWUFPICovCisjZGVmaW5lIFhLX1RoYWlfbWFpeWFtb2sgICAgICAgICAgICAgICAgIDB4MGRlNiAgLyogVSswRTQ2IFRIQUkgQ0hBUkFDVEVSIE1BSVlBTU9LICovCisjZGVmaW5lIFhLX1RoYWlfbWFpdGFpa2h1ICAgICAgICAgICAgICAgIDB4MGRlNyAgLyogVSswRTQ3IFRIQUkgQ0hBUkFDVEVSIE1BSVRBSUtIVSAqLworI2RlZmluZSBYS19UaGFpX21haWVrICAgICAgICAgICAgICAgICAgICAweDBkZTggIC8qIFUrMEU0OCBUSEFJIENIQVJBQ1RFUiBNQUkgRUsgKi8KKyNkZWZpbmUgWEtfVGhhaV9tYWl0aG8gICAgICAgICAgICAgICAgICAgMHgwZGU5ICAvKiBVKzBFNDkgVEhBSSBDSEFSQUNURVIgTUFJIFRITyAqLworI2RlZmluZSBYS19UaGFpX21haXRyaSAgICAgICAgICAgICAgICAgICAweDBkZWEgIC8qIFUrMEU0QSBUSEFJIENIQVJBQ1RFUiBNQUkgVFJJICovCisjZGVmaW5lIFhLX1RoYWlfbWFpY2hhdHRhd2EgICAgICAgICAgICAgIDB4MGRlYiAgLyogVSswRTRCIFRIQUkgQ0hBUkFDVEVSIE1BSSBDSEFUVEFXQSAqLworI2RlZmluZSBYS19UaGFpX3RoYW50aGFraGF0ICAgICAgICAgICAgICAweDBkZWMgIC8qIFUrMEU0QyBUSEFJIENIQVJBQ1RFUiBUSEFOVEhBS0hBVCAqLworI2RlZmluZSBYS19UaGFpX25pa2hhaGl0ICAgICAgICAgICAgICAgICAweDBkZWQgIC8qIFUrMEU0RCBUSEFJIENIQVJBQ1RFUiBOSUtIQUhJVCAqLworI2RlZmluZSBYS19UaGFpX2xla3N1biAgICAgICAgICAgICAgICAgICAweDBkZjAgIC8qIFUrMEU1MCBUSEFJIERJR0lUIFpFUk8gKi8KKyNkZWZpbmUgWEtfVGhhaV9sZWtudW5nICAgICAgICAgICAgICAgICAgMHgwZGYxICAvKiBVKzBFNTEgVEhBSSBESUdJVCBPTkUgKi8KKyNkZWZpbmUgWEtfVGhhaV9sZWtzb25nICAgICAgICAgICAgICAgICAgMHgwZGYyICAvKiBVKzBFNTIgVEhBSSBESUdJVCBUV08gKi8KKyNkZWZpbmUgWEtfVGhhaV9sZWtzYW0gICAgICAgICAgICAgICAgICAgMHgwZGYzICAvKiBVKzBFNTMgVEhBSSBESUdJVCBUSFJFRSAqLworI2RlZmluZSBYS19UaGFpX2xla3NpICAgICAgICAgICAgICAgICAgICAweDBkZjQgIC8qIFUrMEU1NCBUSEFJIERJR0lUIEZPVVIgKi8KKyNkZWZpbmUgWEtfVGhhaV9sZWtoYSAgICAgICAgICAgICAgICAgICAgMHgwZGY1ICAvKiBVKzBFNTUgVEhBSSBESUdJVCBGSVZFICovCisjZGVmaW5lIFhLX1RoYWlfbGVraG9rICAgICAgICAgICAgICAgICAgIDB4MGRmNiAgLyogVSswRTU2IFRIQUkgRElHSVQgU0lYICovCisjZGVmaW5lIFhLX1RoYWlfbGVrY2hldCAgICAgICAgICAgICAgICAgIDB4MGRmNyAgLyogVSswRTU3IFRIQUkgRElHSVQgU0VWRU4gKi8KKyNkZWZpbmUgWEtfVGhhaV9sZWtwYWV0ICAgICAgICAgICAgICAgICAgMHgwZGY4ICAvKiBVKzBFNTggVEhBSSBESUdJVCBFSUdIVCAqLworI2RlZmluZSBYS19UaGFpX2xla2thbyAgICAgICAgICAgICAgICAgICAweDBkZjkgIC8qIFUrMEU1OSBUSEFJIERJR0lUIE5JTkUgKi8KKyNlbmRpZiAvKiBYS19USEFJICovCisKKy8qCisgKiBLb3JlYW4KKyAqIEJ5dGUgMyA9IDB4MGUKKyAqLworCisjaWZkZWYgWEtfS09SRUFOCisKKyNkZWZpbmUgWEtfSGFuZ3VsICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjMxICAvKiBIYW5ndWwgc3RhcnQvc3RvcCh0b2dnbGUpICovCisjZGVmaW5lIFhLX0hhbmd1bF9TdGFydCAgICAgICAgICAgICAgICAgIDB4ZmYzMiAgLyogSGFuZ3VsIHN0YXJ0ICovCisjZGVmaW5lIFhLX0hhbmd1bF9FbmQgICAgICAgICAgICAgICAgICAgIDB4ZmYzMyAgLyogSGFuZ3VsIGVuZCwgRW5nbGlzaCBzdGFydCAqLworI2RlZmluZSBYS19IYW5ndWxfSGFuamEgICAgICAgICAgICAgICAgICAweGZmMzQgIC8qIFN0YXJ0IEhhbmd1bC0+SGFuamEgQ29udmVyc2lvbiAqLworI2RlZmluZSBYS19IYW5ndWxfSmFtbyAgICAgICAgICAgICAgICAgICAweGZmMzUgIC8qIEhhbmd1bCBKYW1vIG1vZGUgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX1JvbWFqYSAgICAgICAgICAgICAgICAgMHhmZjM2ICAvKiBIYW5ndWwgUm9tYWphIG1vZGUgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0NvZGVpbnB1dCAgICAgICAgICAgICAgMHhmZjM3ICAvKiBIYW5ndWwgY29kZSBpbnB1dCBtb2RlICovCisjZGVmaW5lIFhLX0hhbmd1bF9KZW9uamEgICAgICAgICAgICAgICAgIDB4ZmYzOCAgLyogSmVvbmphIG1vZGUgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0JhbmphICAgICAgICAgICAgICAgICAgMHhmZjM5ICAvKiBCYW5qYSBtb2RlICovCisjZGVmaW5lIFhLX0hhbmd1bF9QcmVIYW5qYSAgICAgICAgICAgICAgIDB4ZmYzYSAgLyogUHJlIEhhbmphIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX1Bvc3RIYW5qYSAgICAgICAgICAgICAgMHhmZjNiICAvKiBQb3N0IEhhbmphIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX1NpbmdsZUNhbmRpZGF0ZSAgICAgICAgMHhmZjNjICAvKiBTaW5nbGUgY2FuZGlkYXRlICovCisjZGVmaW5lIFhLX0hhbmd1bF9NdWx0aXBsZUNhbmRpZGF0ZSAgICAgIDB4ZmYzZCAgLyogTXVsdGlwbGUgY2FuZGlkYXRlICovCisjZGVmaW5lIFhLX0hhbmd1bF9QcmV2aW91c0NhbmRpZGF0ZSAgICAgIDB4ZmYzZSAgLyogUHJldmlvdXMgY2FuZGlkYXRlICovCisjZGVmaW5lIFhLX0hhbmd1bF9TcGVjaWFsICAgICAgICAgICAgICAgIDB4ZmYzZiAgLyogU3BlY2lhbCBzeW1ib2xzICovCisjZGVmaW5lIFhLX0hhbmd1bF9zd2l0Y2ggICAgICAgICAgICAgICAgIDB4ZmY3ZSAgLyogQWxpYXMgZm9yIG1vZGVfc3dpdGNoICovCisKKy8qIEhhbmd1bCBDb25zb25hbnQgQ2hhcmFjdGVycyAqLworI2RlZmluZSBYS19IYW5ndWxfS2l5ZW9nICAgICAgICAgICAgICAgICAweDBlYTEKKyNkZWZpbmUgWEtfSGFuZ3VsX1NzYW5nS2l5ZW9nICAgICAgICAgICAgMHgwZWEyCisjZGVmaW5lIFhLX0hhbmd1bF9LaXllb2dTaW9zICAgICAgICAgICAgIDB4MGVhMworI2RlZmluZSBYS19IYW5ndWxfTmlldW4gICAgICAgICAgICAgICAgICAweDBlYTQKKyNkZWZpbmUgWEtfSGFuZ3VsX05pZXVuSmlldWogICAgICAgICAgICAgMHgwZWE1CisjZGVmaW5lIFhLX0hhbmd1bF9OaWV1bkhpZXVoICAgICAgICAgICAgIDB4MGVhNgorI2RlZmluZSBYS19IYW5ndWxfRGlrZXVkICAgICAgICAgICAgICAgICAweDBlYTcKKyNkZWZpbmUgWEtfSGFuZ3VsX1NzYW5nRGlrZXVkICAgICAgICAgICAgMHgwZWE4CisjZGVmaW5lIFhLX0hhbmd1bF9SaWV1bCAgICAgICAgICAgICAgICAgIDB4MGVhOQorI2RlZmluZSBYS19IYW5ndWxfUmlldWxLaXllb2cgICAgICAgICAgICAweDBlYWEKKyNkZWZpbmUgWEtfSGFuZ3VsX1JpZXVsTWlldW0gICAgICAgICAgICAgMHgwZWFiCisjZGVmaW5lIFhLX0hhbmd1bF9SaWV1bFBpZXViICAgICAgICAgICAgIDB4MGVhYworI2RlZmluZSBYS19IYW5ndWxfUmlldWxTaW9zICAgICAgICAgICAgICAweDBlYWQKKyNkZWZpbmUgWEtfSGFuZ3VsX1JpZXVsVGlldXQgICAgICAgICAgICAgMHgwZWFlCisjZGVmaW5lIFhLX0hhbmd1bF9SaWV1bFBoaWV1ZiAgICAgICAgICAgIDB4MGVhZgorI2RlZmluZSBYS19IYW5ndWxfUmlldWxIaWV1aCAgICAgICAgICAgICAweDBlYjAKKyNkZWZpbmUgWEtfSGFuZ3VsX01pZXVtICAgICAgICAgICAgICAgICAgMHgwZWIxCisjZGVmaW5lIFhLX0hhbmd1bF9QaWV1YiAgICAgICAgICAgICAgICAgIDB4MGViMgorI2RlZmluZSBYS19IYW5ndWxfU3NhbmdQaWV1YiAgICAgICAgICAgICAweDBlYjMKKyNkZWZpbmUgWEtfSGFuZ3VsX1BpZXViU2lvcyAgICAgICAgICAgICAgMHgwZWI0CisjZGVmaW5lIFhLX0hhbmd1bF9TaW9zICAgICAgICAgICAgICAgICAgIDB4MGViNQorI2RlZmluZSBYS19IYW5ndWxfU3NhbmdTaW9zICAgICAgICAgICAgICAweDBlYjYKKyNkZWZpbmUgWEtfSGFuZ3VsX0lldW5nICAgICAgICAgICAgICAgICAgMHgwZWI3CisjZGVmaW5lIFhLX0hhbmd1bF9KaWV1aiAgICAgICAgICAgICAgICAgIDB4MGViOAorI2RlZmluZSBYS19IYW5ndWxfU3NhbmdKaWV1aiAgICAgICAgICAgICAweDBlYjkKKyNkZWZpbmUgWEtfSGFuZ3VsX0NpZXVjICAgICAgICAgICAgICAgICAgMHgwZWJhCisjZGVmaW5lIFhLX0hhbmd1bF9LaGlldXEgICAgICAgICAgICAgICAgIDB4MGViYgorI2RlZmluZSBYS19IYW5ndWxfVGlldXQgICAgICAgICAgICAgICAgICAweDBlYmMKKyNkZWZpbmUgWEtfSGFuZ3VsX1BoaWV1ZiAgICAgICAgICAgICAgICAgMHgwZWJkCisjZGVmaW5lIFhLX0hhbmd1bF9IaWV1aCAgICAgICAgICAgICAgICAgIDB4MGViZQorCisvKiBIYW5ndWwgVm93ZWwgQ2hhcmFjdGVycyAqLworI2RlZmluZSBYS19IYW5ndWxfQSAgICAgICAgICAgICAgICAgICAgICAweDBlYmYKKyNkZWZpbmUgWEtfSGFuZ3VsX0FFICAgICAgICAgICAgICAgICAgICAgMHgwZWMwCisjZGVmaW5lIFhLX0hhbmd1bF9ZQSAgICAgICAgICAgICAgICAgICAgIDB4MGVjMQorI2RlZmluZSBYS19IYW5ndWxfWUFFICAgICAgICAgICAgICAgICAgICAweDBlYzIKKyNkZWZpbmUgWEtfSGFuZ3VsX0VPICAgICAgICAgICAgICAgICAgICAgMHgwZWMzCisjZGVmaW5lIFhLX0hhbmd1bF9FICAgICAgICAgICAgICAgICAgICAgIDB4MGVjNAorI2RlZmluZSBYS19IYW5ndWxfWUVPICAgICAgICAgICAgICAgICAgICAweDBlYzUKKyNkZWZpbmUgWEtfSGFuZ3VsX1lFICAgICAgICAgICAgICAgICAgICAgMHgwZWM2CisjZGVmaW5lIFhLX0hhbmd1bF9PICAgICAgICAgICAgICAgICAgICAgIDB4MGVjNworI2RlZmluZSBYS19IYW5ndWxfV0EgICAgICAgICAgICAgICAgICAgICAweDBlYzgKKyNkZWZpbmUgWEtfSGFuZ3VsX1dBRSAgICAgICAgICAgICAgICAgICAgMHgwZWM5CisjZGVmaW5lIFhLX0hhbmd1bF9PRSAgICAgICAgICAgICAgICAgICAgIDB4MGVjYQorI2RlZmluZSBYS19IYW5ndWxfWU8gICAgICAgICAgICAgICAgICAgICAweDBlY2IKKyNkZWZpbmUgWEtfSGFuZ3VsX1UgICAgICAgICAgICAgICAgICAgICAgMHgwZWNjCisjZGVmaW5lIFhLX0hhbmd1bF9XRU8gICAgICAgICAgICAgICAgICAgIDB4MGVjZAorI2RlZmluZSBYS19IYW5ndWxfV0UgICAgICAgICAgICAgICAgICAgICAweDBlY2UKKyNkZWZpbmUgWEtfSGFuZ3VsX1dJICAgICAgICAgICAgICAgICAgICAgMHgwZWNmCisjZGVmaW5lIFhLX0hhbmd1bF9ZVSAgICAgICAgICAgICAgICAgICAgIDB4MGVkMAorI2RlZmluZSBYS19IYW5ndWxfRVUgICAgICAgICAgICAgICAgICAgICAweDBlZDEKKyNkZWZpbmUgWEtfSGFuZ3VsX1lJICAgICAgICAgICAgICAgICAgICAgMHgwZWQyCisjZGVmaW5lIFhLX0hhbmd1bF9JICAgICAgICAgICAgICAgICAgICAgIDB4MGVkMworCisvKiBIYW5ndWwgc3lsbGFibGUtZmluYWwgKEpvbmdTZW9uZykgQ2hhcmFjdGVycyAqLworI2RlZmluZSBYS19IYW5ndWxfSl9LaXllb2cgICAgICAgICAgICAgICAweDBlZDQKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfU3NhbmdLaXllb2cgICAgICAgICAgMHgwZWQ1CisjZGVmaW5lIFhLX0hhbmd1bF9KX0tpeWVvZ1Npb3MgICAgICAgICAgIDB4MGVkNgorI2RlZmluZSBYS19IYW5ndWxfSl9OaWV1biAgICAgICAgICAgICAgICAweDBlZDcKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfTmlldW5KaWV1aiAgICAgICAgICAgMHgwZWQ4CisjZGVmaW5lIFhLX0hhbmd1bF9KX05pZXVuSGlldWggICAgICAgICAgIDB4MGVkOQorI2RlZmluZSBYS19IYW5ndWxfSl9EaWtldWQgICAgICAgICAgICAgICAweDBlZGEKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUmlldWwgICAgICAgICAgICAgICAgMHgwZWRiCisjZGVmaW5lIFhLX0hhbmd1bF9KX1JpZXVsS2l5ZW9nICAgICAgICAgIDB4MGVkYworI2RlZmluZSBYS19IYW5ndWxfSl9SaWV1bE1pZXVtICAgICAgICAgICAweDBlZGQKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUmlldWxQaWV1YiAgICAgICAgICAgMHgwZWRlCisjZGVmaW5lIFhLX0hhbmd1bF9KX1JpZXVsU2lvcyAgICAgICAgICAgIDB4MGVkZgorI2RlZmluZSBYS19IYW5ndWxfSl9SaWV1bFRpZXV0ICAgICAgICAgICAweDBlZTAKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUmlldWxQaGlldWYgICAgICAgICAgMHgwZWUxCisjZGVmaW5lIFhLX0hhbmd1bF9KX1JpZXVsSGlldWggICAgICAgICAgIDB4MGVlMgorI2RlZmluZSBYS19IYW5ndWxfSl9NaWV1bSAgICAgICAgICAgICAgICAweDBlZTMKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUGlldWIgICAgICAgICAgICAgICAgMHgwZWU0CisjZGVmaW5lIFhLX0hhbmd1bF9KX1BpZXViU2lvcyAgICAgICAgICAgIDB4MGVlNQorI2RlZmluZSBYS19IYW5ndWxfSl9TaW9zICAgICAgICAgICAgICAgICAweDBlZTYKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfU3NhbmdTaW9zICAgICAgICAgICAgMHgwZWU3CisjZGVmaW5lIFhLX0hhbmd1bF9KX0lldW5nICAgICAgICAgICAgICAgIDB4MGVlOAorI2RlZmluZSBYS19IYW5ndWxfSl9KaWV1aiAgICAgICAgICAgICAgICAweDBlZTkKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfQ2lldWMgICAgICAgICAgICAgICAgMHgwZWVhCisjZGVmaW5lIFhLX0hhbmd1bF9KX0toaWV1cSAgICAgICAgICAgICAgIDB4MGVlYgorI2RlZmluZSBYS19IYW5ndWxfSl9UaWV1dCAgICAgICAgICAgICAgICAweDBlZWMKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUGhpZXVmICAgICAgICAgICAgICAgMHgwZWVkCisjZGVmaW5lIFhLX0hhbmd1bF9KX0hpZXVoICAgICAgICAgICAgICAgIDB4MGVlZQorCisvKiBBbmNpZW50IEhhbmd1bCBDb25zb25hbnQgQ2hhcmFjdGVycyAqLworI2RlZmluZSBYS19IYW5ndWxfUmlldWxZZW9yaW5IaWV1aCAgICAgICAweDBlZWYKKyNkZWZpbmUgWEtfSGFuZ3VsX1N1bmt5ZW9uZ2V1bU1pZXVtICAgICAgMHgwZWYwCisjZGVmaW5lIFhLX0hhbmd1bF9TdW5reWVvbmdldW1QaWV1YiAgICAgIDB4MGVmMQorI2RlZmluZSBYS19IYW5ndWxfUGFuU2lvcyAgICAgICAgICAgICAgICAweDBlZjIKKyNkZWZpbmUgWEtfSGFuZ3VsX0trb2dqaURhbHJpbklldW5nICAgICAgMHgwZWYzCisjZGVmaW5lIFhLX0hhbmd1bF9TdW5reWVvbmdldW1QaGlldWYgICAgIDB4MGVmNAorI2RlZmluZSBYS19IYW5ndWxfWWVvcmluSGlldWggICAgICAgICAgICAweDBlZjUKKworLyogQW5jaWVudCBIYW5ndWwgVm93ZWwgQ2hhcmFjdGVycyAqLworI2RlZmluZSBYS19IYW5ndWxfQXJhZUEgICAgICAgICAgICAgICAgICAweDBlZjYKKyNkZWZpbmUgWEtfSGFuZ3VsX0FyYWVBRSAgICAgICAgICAgICAgICAgMHgwZWY3CisKKy8qIEFuY2llbnQgSGFuZ3VsIHN5bGxhYmxlLWZpbmFsIChKb25nU2VvbmcpIENoYXJhY3RlcnMgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUGFuU2lvcyAgICAgICAgICAgICAgMHgwZWY4CisjZGVmaW5lIFhLX0hhbmd1bF9KX0trb2dqaURhbHJpbklldW5nICAgIDB4MGVmOQorI2RlZmluZSBYS19IYW5ndWxfSl9ZZW9yaW5IaWV1aCAgICAgICAgICAweDBlZmEKKworLyogS29yZWFuIGN1cnJlbmN5IHN5bWJvbCAqLworI2RlZmluZSBYS19Lb3JlYW5fV29uICAgICAgICAgICAgICAgICAgICAweDBlZmYgIC8qKFUrMjBBOSBXT04gU0lHTikqLworCisjZW5kaWYgLyogWEtfS09SRUFOICovCisKKy8qCisgKiBBcm1lbmlhbgorICovCisKKyNpZmRlZiBYS19BUk1FTklBTgorI2RlZmluZSBYS19Bcm1lbmlhbl9saWdhdHVyZV9ldyAgICAgICAweDEwMDA1ODcgIC8qIFUrMDU4NyBBUk1FTklBTiBTTUFMTCBMSUdBVFVSRSBFQ0ggWUlXTiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9mdWxsX3N0b3AgICAgICAgICAweDEwMDA1ODkgIC8qIFUrMDU4OSBBUk1FTklBTiBGVUxMIFNUT1AgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fdmVyamFrZXQgICAgICAgICAgMHgxMDAwNTg5ICAvKiBVKzA1ODkgQVJNRU5JQU4gRlVMTCBTVE9QICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3NlcGFyYXRpb25fbWFyayAgIDB4MTAwMDU1ZCAgLyogVSswNTVEIEFSTUVOSUFOIENPTU1BICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2J1dCAgICAgICAgICAgICAgIDB4MTAwMDU1ZCAgLyogVSswNTVEIEFSTUVOSUFOIENPTU1BICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2h5cGhlbiAgICAgICAgICAgIDB4MTAwMDU4YSAgLyogVSswNThBIEFSTUVOSUFOIEhZUEhFTiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl95ZW50YW1uYSAgICAgICAgICAweDEwMDA1OGEgIC8qIFUrMDU4QSBBUk1FTklBTiBIWVBIRU4gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fZXhjbGFtICAgICAgICAgICAgMHgxMDAwNTVjICAvKiBVKzA1NUMgQVJNRU5JQU4gRVhDTEFNQVRJT04gTUFSSyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9hbWFuYWsgICAgICAgICAgICAweDEwMDA1NWMgIC8qIFUrMDU1QyBBUk1FTklBTiBFWENMQU1BVElPTiBNQVJLICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2FjY2VudCAgICAgICAgICAgIDB4MTAwMDU1YiAgLyogVSswNTVCIEFSTUVOSUFOIEVNUEhBU0lTIE1BUksgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fc2hlc2h0ICAgICAgICAgICAgMHgxMDAwNTViICAvKiBVKzA1NUIgQVJNRU5JQU4gRU1QSEFTSVMgTUFSSyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9xdWVzdGlvbiAgICAgICAgICAweDEwMDA1NWUgIC8qIFUrMDU1RSBBUk1FTklBTiBRVUVTVElPTiBNQVJLICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3BhcnV5ayAgICAgICAgICAgIDB4MTAwMDU1ZSAgLyogVSswNTVFIEFSTUVOSUFOIFFVRVNUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fQVlCICAgICAgICAgICAgICAgMHgxMDAwNTMxICAvKiBVKzA1MzEgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgQVlCICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2F5YiAgICAgICAgICAgICAgIDB4MTAwMDU2MSAgLyogVSswNTYxIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBBWUIgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fQkVOICAgICAgICAgICAgICAgMHgxMDAwNTMyICAvKiBVKzA1MzIgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgQkVOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2JlbiAgICAgICAgICAgICAgIDB4MTAwMDU2MiAgLyogVSswNTYyIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBCRU4gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fR0lNICAgICAgICAgICAgICAgMHgxMDAwNTMzICAvKiBVKzA1MzMgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgR0lNICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2dpbSAgICAgICAgICAgICAgIDB4MTAwMDU2MyAgLyogVSswNTYzIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBHSU0gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fREEgICAgICAgICAgICAgICAgMHgxMDAwNTM0ICAvKiBVKzA1MzQgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgREEgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fZGEgICAgICAgICAgICAgICAgMHgxMDAwNTY0ICAvKiBVKzA1NjQgQVJNRU5JQU4gU01BTEwgTEVUVEVSIERBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1lFQ0ggICAgICAgICAgICAgIDB4MTAwMDUzNSAgLyogVSswNTM1IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIEVDSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl95ZWNoICAgICAgICAgICAgICAweDEwMDA1NjUgIC8qIFUrMDU2NSBBUk1FTklBTiBTTUFMTCBMRVRURVIgRUNIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1pBICAgICAgICAgICAgICAgIDB4MTAwMDUzNiAgLyogVSswNTM2IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFpBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3phICAgICAgICAgICAgICAgIDB4MTAwMDU2NiAgLyogVSswNTY2IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBaQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9FICAgICAgICAgICAgICAgICAweDEwMDA1MzcgIC8qIFUrMDUzNyBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9lICAgICAgICAgICAgICAgICAweDEwMDA1NjcgIC8qIFUrMDU2NyBBUk1FTklBTiBTTUFMTCBMRVRURVIgRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fQVQgICAgICAgICAgICAgICAgMHgxMDAwNTM4ICAvKiBVKzA1MzggQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgRVQgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fYXQgICAgICAgICAgICAgICAgMHgxMDAwNTY4ICAvKiBVKzA1NjggQVJNRU5JQU4gU01BTEwgTEVUVEVSIEVUICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1RPICAgICAgICAgICAgICAgIDB4MTAwMDUzOSAgLyogVSswNTM5IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFRPICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3RvICAgICAgICAgICAgICAgIDB4MTAwMDU2OSAgLyogVSswNTY5IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBUTyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9aSEUgICAgICAgICAgICAgICAweDEwMDA1M2EgIC8qIFUrMDUzQSBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBaSEUgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5femhlICAgICAgICAgICAgICAgMHgxMDAwNTZhICAvKiBVKzA1NkEgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFpIRSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9JTkkgICAgICAgICAgICAgICAweDEwMDA1M2IgIC8qIFUrMDUzQiBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBJTkkgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5faW5pICAgICAgICAgICAgICAgMHgxMDAwNTZiICAvKiBVKzA1NkIgQVJNRU5JQU4gU01BTEwgTEVUVEVSIElOSSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9MWVVOICAgICAgICAgICAgICAweDEwMDA1M2MgIC8qIFUrMDUzQyBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBMSVdOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2x5dW4gICAgICAgICAgICAgIDB4MTAwMDU2YyAgLyogVSswNTZDIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBMSVdOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0tIRSAgICAgICAgICAgICAgIDB4MTAwMDUzZCAgLyogVSswNTNEIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFhFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9raGUgICAgICAgICAgICAgICAweDEwMDA1NmQgIC8qIFUrMDU2RCBBUk1FTklBTiBTTUFMTCBMRVRURVIgWEVIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1RTQSAgICAgICAgICAgICAgIDB4MTAwMDUzZSAgLyogVSswNTNFIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIENBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3RzYSAgICAgICAgICAgICAgIDB4MTAwMDU2ZSAgLyogVSswNTZFIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBDQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9LRU4gICAgICAgICAgICAgICAweDEwMDA1M2YgIC8qIFUrMDUzRiBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBLRU4gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fa2VuICAgICAgICAgICAgICAgMHgxMDAwNTZmICAvKiBVKzA1NkYgQVJNRU5JQU4gU01BTEwgTEVUVEVSIEtFTiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9ITyAgICAgICAgICAgICAgICAweDEwMDA1NDAgIC8qIFUrMDU0MCBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBITyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9obyAgICAgICAgICAgICAgICAweDEwMDA1NzAgIC8qIFUrMDU3MCBBUk1FTklBTiBTTUFMTCBMRVRURVIgSE8gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fRFpBICAgICAgICAgICAgICAgMHgxMDAwNTQxICAvKiBVKzA1NDEgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgSkEgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fZHphICAgICAgICAgICAgICAgMHgxMDAwNTcxICAvKiBVKzA1NzEgQVJNRU5JQU4gU01BTEwgTEVUVEVSIEpBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0dIQVQgICAgICAgICAgICAgIDB4MTAwMDU0MiAgLyogVSswNTQyIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIEdIQUQgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fZ2hhdCAgICAgICAgICAgICAgMHgxMDAwNTcyICAvKiBVKzA1NzIgQVJNRU5JQU4gU01BTEwgTEVUVEVSIEdIQUQgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fVENIRSAgICAgICAgICAgICAgMHgxMDAwNTQzICAvKiBVKzA1NDMgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgQ0hFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl90Y2hlICAgICAgICAgICAgICAweDEwMDA1NzMgIC8qIFUrMDU3MyBBUk1FTklBTiBTTUFMTCBMRVRURVIgQ0hFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9NRU4gICAgICAgICAgICAgICAweDEwMDA1NDQgIC8qIFUrMDU0NCBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBNRU4gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fbWVuICAgICAgICAgICAgICAgMHgxMDAwNTc0ICAvKiBVKzA1NzQgQVJNRU5JQU4gU01BTEwgTEVUVEVSIE1FTiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9ISSAgICAgICAgICAgICAgICAweDEwMDA1NDUgIC8qIFUrMDU0NSBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBZSSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9oaSAgICAgICAgICAgICAgICAweDEwMDA1NzUgIC8qIFUrMDU3NSBBUk1FTklBTiBTTUFMTCBMRVRURVIgWUkgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fTlUgICAgICAgICAgICAgICAgMHgxMDAwNTQ2ICAvKiBVKzA1NDYgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgTk9XICovCisjZGVmaW5lIFhLX0FybWVuaWFuX251ICAgICAgICAgICAgICAgIDB4MTAwMDU3NiAgLyogVSswNTc2IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBOT1cgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fU0hBICAgICAgICAgICAgICAgMHgxMDAwNTQ3ICAvKiBVKzA1NDcgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgU0hBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3NoYSAgICAgICAgICAgICAgIDB4MTAwMDU3NyAgLyogVSswNTc3IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBTSEEgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fVk8gICAgICAgICAgICAgICAgMHgxMDAwNTQ4ICAvKiBVKzA1NDggQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgVk8gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fdm8gICAgICAgICAgICAgICAgMHgxMDAwNTc4ICAvKiBVKzA1NzggQVJNRU5JQU4gU01BTEwgTEVUVEVSIFZPICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0NIQSAgICAgICAgICAgICAgIDB4MTAwMDU0OSAgLyogVSswNTQ5IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIENIQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9jaGEgICAgICAgICAgICAgICAweDEwMDA1NzkgIC8qIFUrMDU3OSBBUk1FTklBTiBTTUFMTCBMRVRURVIgQ0hBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1BFICAgICAgICAgICAgICAgIDB4MTAwMDU0YSAgLyogVSswNTRBIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFBFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9wZSAgICAgICAgICAgICAgICAweDEwMDA1N2EgIC8qIFUrMDU3QSBBUk1FTklBTiBTTUFMTCBMRVRURVIgUEVIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0pFICAgICAgICAgICAgICAgIDB4MTAwMDU0YiAgLyogVSswNTRCIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIEpIRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5famUgICAgICAgICAgICAgICAgMHgxMDAwNTdiICAvKiBVKzA1N0IgQVJNRU5JQU4gU01BTEwgTEVUVEVSIEpIRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fUkEgICAgICAgICAgICAgICAgMHgxMDAwNTRjICAvKiBVKzA1NEMgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgUkEgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fcmEgICAgICAgICAgICAgICAgMHgxMDAwNTdjICAvKiBVKzA1N0MgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFJBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1NFICAgICAgICAgICAgICAgIDB4MTAwMDU0ZCAgLyogVSswNTREIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFNFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9zZSAgICAgICAgICAgICAgICAweDEwMDA1N2QgIC8qIFUrMDU3RCBBUk1FTklBTiBTTUFMTCBMRVRURVIgU0VIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1ZFViAgICAgICAgICAgICAgIDB4MTAwMDU0ZSAgLyogVSswNTRFIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFZFVyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl92ZXYgICAgICAgICAgICAgICAweDEwMDA1N2UgIC8qIFUrMDU3RSBBUk1FTklBTiBTTUFMTCBMRVRURVIgVkVXICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1RZVU4gICAgICAgICAgICAgIDB4MTAwMDU0ZiAgLyogVSswNTRGIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFRJV04gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fdHl1biAgICAgICAgICAgICAgMHgxMDAwNTdmICAvKiBVKzA1N0YgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFRJV04gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fUkUgICAgICAgICAgICAgICAgMHgxMDAwNTUwICAvKiBVKzA1NTAgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgUkVIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3JlICAgICAgICAgICAgICAgIDB4MTAwMDU4MCAgLyogVSswNTgwIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBSRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fVFNPICAgICAgICAgICAgICAgMHgxMDAwNTUxICAvKiBVKzA1NTEgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgQ08gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fdHNvICAgICAgICAgICAgICAgMHgxMDAwNTgxICAvKiBVKzA1ODEgQVJNRU5JQU4gU01BTEwgTEVUVEVSIENPICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1ZZVU4gICAgICAgICAgICAgIDB4MTAwMDU1MiAgLyogVSswNTUyIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFlJV04gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fdnl1biAgICAgICAgICAgICAgMHgxMDAwNTgyICAvKiBVKzA1ODIgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFlJV04gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fUFlVUiAgICAgICAgICAgICAgMHgxMDAwNTUzICAvKiBVKzA1NTMgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgUElXUiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9weXVyICAgICAgICAgICAgICAweDEwMDA1ODMgIC8qIFUrMDU4MyBBUk1FTklBTiBTTUFMTCBMRVRURVIgUElXUiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9LRSAgICAgICAgICAgICAgICAweDEwMDA1NTQgIC8qIFUrMDU1NCBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBLRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fa2UgICAgICAgICAgICAgICAgMHgxMDAwNTg0ICAvKiBVKzA1ODQgQVJNRU5JQU4gU01BTEwgTEVUVEVSIEtFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9PICAgICAgICAgICAgICAgICAweDEwMDA1NTUgIC8qIFUrMDU1NSBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBPSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9vICAgICAgICAgICAgICAgICAweDEwMDA1ODUgIC8qIFUrMDU4NSBBUk1FTklBTiBTTUFMTCBMRVRURVIgT0ggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fRkUgICAgICAgICAgICAgICAgMHgxMDAwNTU2ICAvKiBVKzA1NTYgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgRkVIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2ZlICAgICAgICAgICAgICAgIDB4MTAwMDU4NiAgLyogVSswNTg2IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBGRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fYXBvc3Ryb3BoZSAgICAgICAgMHgxMDAwNTVhICAvKiBVKzA1NUEgQVJNRU5JQU4gQVBPU1RST1BIRSAqLworI2VuZGlmIC8qIFhLX0FSTUVOSUFOICovCisKKy8qCisgKiBHZW9yZ2lhbgorICovCisKKyNpZmRlZiBYS19HRU9SR0lBTgorI2RlZmluZSBYS19HZW9yZ2lhbl9hbiAgICAgICAgICAgICAgICAweDEwMDEwZDAgIC8qIFUrMTBEMCBHRU9SR0lBTiBMRVRURVIgQU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fYmFuICAgICAgICAgICAgICAgMHgxMDAxMGQxICAvKiBVKzEwRDEgR0VPUkdJQU4gTEVUVEVSIEJBTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9nYW4gICAgICAgICAgICAgICAweDEwMDEwZDIgIC8qIFUrMTBEMiBHRU9SR0lBTiBMRVRURVIgR0FOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2RvbiAgICAgICAgICAgICAgIDB4MTAwMTBkMyAgLyogVSsxMEQzIEdFT1JHSUFOIExFVFRFUiBET04gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fZW4gICAgICAgICAgICAgICAgMHgxMDAxMGQ0ICAvKiBVKzEwRDQgR0VPUkdJQU4gTEVUVEVSIEVOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3ZpbiAgICAgICAgICAgICAgIDB4MTAwMTBkNSAgLyogVSsxMEQ1IEdFT1JHSUFOIExFVFRFUiBWSU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5femVuICAgICAgICAgICAgICAgMHgxMDAxMGQ2ICAvKiBVKzEwRDYgR0VPUkdJQU4gTEVUVEVSIFpFTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl90YW4gICAgICAgICAgICAgICAweDEwMDEwZDcgIC8qIFUrMTBENyBHRU9SR0lBTiBMRVRURVIgVEFOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2luICAgICAgICAgICAgICAgIDB4MTAwMTBkOCAgLyogVSsxMEQ4IEdFT1JHSUFOIExFVFRFUiBJTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9rYW4gICAgICAgICAgICAgICAweDEwMDEwZDkgIC8qIFUrMTBEOSBHRU9SR0lBTiBMRVRURVIgS0FOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2xhcyAgICAgICAgICAgICAgIDB4MTAwMTBkYSAgLyogVSsxMERBIEdFT1JHSUFOIExFVFRFUiBMQVMgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fbWFuICAgICAgICAgICAgICAgMHgxMDAxMGRiICAvKiBVKzEwREIgR0VPUkdJQU4gTEVUVEVSIE1BTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9uYXIgICAgICAgICAgICAgICAweDEwMDEwZGMgIC8qIFUrMTBEQyBHRU9SR0lBTiBMRVRURVIgTkFSICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX29uICAgICAgICAgICAgICAgIDB4MTAwMTBkZCAgLyogVSsxMEREIEdFT1JHSUFOIExFVFRFUiBPTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9wYXIgICAgICAgICAgICAgICAweDEwMDEwZGUgIC8qIFUrMTBERSBHRU9SR0lBTiBMRVRURVIgUEFSICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3poYXIgICAgICAgICAgICAgIDB4MTAwMTBkZiAgLyogVSsxMERGIEdFT1JHSUFOIExFVFRFUiBaSEFSICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3JhZSAgICAgICAgICAgICAgIDB4MTAwMTBlMCAgLyogVSsxMEUwIEdFT1JHSUFOIExFVFRFUiBSQUUgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fc2FuICAgICAgICAgICAgICAgMHgxMDAxMGUxICAvKiBVKzEwRTEgR0VPUkdJQU4gTEVUVEVSIFNBTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl90YXIgICAgICAgICAgICAgICAweDEwMDEwZTIgIC8qIFUrMTBFMiBHRU9SR0lBTiBMRVRURVIgVEFSICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3VuICAgICAgICAgICAgICAgIDB4MTAwMTBlMyAgLyogVSsxMEUzIEdFT1JHSUFOIExFVFRFUiBVTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9waGFyICAgICAgICAgICAgICAweDEwMDEwZTQgIC8qIFUrMTBFNCBHRU9SR0lBTiBMRVRURVIgUEhBUiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9raGFyICAgICAgICAgICAgICAweDEwMDEwZTUgIC8qIFUrMTBFNSBHRU9SR0lBTiBMRVRURVIgS0hBUiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9naGFuICAgICAgICAgICAgICAweDEwMDEwZTYgIC8qIFUrMTBFNiBHRU9SR0lBTiBMRVRURVIgR0hBTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9xYXIgICAgICAgICAgICAgICAweDEwMDEwZTcgIC8qIFUrMTBFNyBHRU9SR0lBTiBMRVRURVIgUUFSICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3NoaW4gICAgICAgICAgICAgIDB4MTAwMTBlOCAgLyogVSsxMEU4IEdFT1JHSUFOIExFVFRFUiBTSElOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2NoaW4gICAgICAgICAgICAgIDB4MTAwMTBlOSAgLyogVSsxMEU5IEdFT1JHSUFOIExFVFRFUiBDSElOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2NhbiAgICAgICAgICAgICAgIDB4MTAwMTBlYSAgLyogVSsxMEVBIEdFT1JHSUFOIExFVFRFUiBDQU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5famlsICAgICAgICAgICAgICAgMHgxMDAxMGViICAvKiBVKzEwRUIgR0VPUkdJQU4gTEVUVEVSIEpJTCAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9jaWwgICAgICAgICAgICAgICAweDEwMDEwZWMgIC8qIFUrMTBFQyBHRU9SR0lBTiBMRVRURVIgQ0lMICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2NoYXIgICAgICAgICAgICAgIDB4MTAwMTBlZCAgLyogVSsxMEVEIEdFT1JHSUFOIExFVFRFUiBDSEFSICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3hhbiAgICAgICAgICAgICAgIDB4MTAwMTBlZSAgLyogVSsxMEVFIEdFT1JHSUFOIExFVFRFUiBYQU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5famhhbiAgICAgICAgICAgICAgMHgxMDAxMGVmICAvKiBVKzEwRUYgR0VPUkdJQU4gTEVUVEVSIEpIQU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5faGFlICAgICAgICAgICAgICAgMHgxMDAxMGYwICAvKiBVKzEwRjAgR0VPUkdJQU4gTEVUVEVSIEhBRSAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9oZSAgICAgICAgICAgICAgICAweDEwMDEwZjEgIC8qIFUrMTBGMSBHRU9SR0lBTiBMRVRURVIgSEUgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5faGllICAgICAgICAgICAgICAgMHgxMDAxMGYyICAvKiBVKzEwRjIgR0VPUkdJQU4gTEVUVEVSIEhJRSAqLworI2RlZmluZSBYS19HZW9yZ2lhbl93ZSAgICAgICAgICAgICAgICAweDEwMDEwZjMgIC8qIFUrMTBGMyBHRU9SR0lBTiBMRVRURVIgV0UgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5faGFyICAgICAgICAgICAgICAgMHgxMDAxMGY0ICAvKiBVKzEwRjQgR0VPUkdJQU4gTEVUVEVSIEhBUiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9ob2UgICAgICAgICAgICAgICAweDEwMDEwZjUgIC8qIFUrMTBGNSBHRU9SR0lBTiBMRVRURVIgSE9FICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2ZpICAgICAgICAgICAgICAgIDB4MTAwMTBmNiAgLyogVSsxMEY2IEdFT1JHSUFOIExFVFRFUiBGSSAqLworI2VuZGlmIC8qIFhLX0dFT1JHSUFOICovCisKKy8qCisgKiBBemVyaSAoYW5kIG90aGVyIFR1cmtpYyBvciBDYXVjYXNpYW4gbGFuZ3VhZ2VzKQorICovCisKKyNpZmRlZiBYS19DQVVDQVNVUworLyogbGF0aW4gKi8KKyNkZWZpbmUgWEtfWGFib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZThhICAvKiBVKzFFOEEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWCBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19JYnJldmUgICAgICAgICAgICAgICAgICAgICAweDEwMDAxMmMgIC8qIFUrMDEyQyBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQlJFVkUgKi8KKyNkZWZpbmUgWEtfWnN0cm9rZSAgICAgICAgICAgICAgICAgICAgMHgxMDAwMWI1ICAvKiBVKzAxQjUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIFNUUk9LRSAqLworI2RlZmluZSBYS19HY2Fyb24gICAgICAgICAgICAgICAgICAgICAweDEwMDAxZTYgIC8qIFUrMDFFNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfT2Nhcm9uICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMWQxICAvKiBVKzAxRDIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX09iYXJyZWQgICAgICAgICAgICAgICAgICAgIDB4MTAwMDE5ZiAgLyogVSswMTlGIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNSURETEUgVElMREUgKi8KKyNkZWZpbmUgWEtfeGFib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZThiICAvKiBVKzFFOEIgTEFUSU4gU01BTEwgTEVUVEVSIFggV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfaWJyZXZlICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMTJkICAvKiBVKzAxMkQgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBCUkVWRSAqLworI2RlZmluZSBYS196c3Ryb2tlICAgICAgICAgICAgICAgICAgICAweDEwMDAxYjYgIC8qIFUrMDFCNiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIFNUUk9LRSAqLworI2RlZmluZSBYS19nY2Fyb24gICAgICAgICAgICAgICAgICAgICAweDEwMDAxZTcgIC8qIFUrMDFFNyBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX29jYXJvbiAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDFkMiAgLyogVSswMUQyIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfb2JhcnJlZCAgICAgICAgICAgICAgICAgICAgMHgxMDAwMjc1ICAvKiBVKzAyNzUgTEFUSU4gU01BTEwgTEVUVEVSIEJBUlJFRCBPICovCisjZGVmaW5lIFhLX1NDSFdBICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDE4ZiAgLyogVSswMThGIExBVElOIENBUElUQUwgTEVUVEVSIFNDSFdBICovCisjZGVmaW5lIFhLX3NjaHdhICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDI1OSAgLyogVSswMjU5IExBVElOIFNNQUxMIExFVFRFUiBTQ0hXQSAqLworLyogdGhvc2UgYXJlIG5vdCByZWFsbHkgQ2F1Y2FzdXMgKi8KKy8qIEZvciBJbnVwaWFrICovCisjZGVmaW5lIFhLX0xiZWxvd2RvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWUzNiAgLyogVSsxRTM2IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfbGJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZTM3ICAvKiBVKzFFMzcgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBET1QgQkVMT1cgKi8KKyNlbmRpZiAvKiBYS19DQVVDQVNVUyAqLworCisvKgorICogVmlldG5hbWVzZQorICovCisgCisjaWZkZWYgWEtfVklFVE5BTUVTRQorI2RlZmluZSBYS19BYmVsb3dkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlYTAgIC8qIFUrMUVBMCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX2FiZWxvd2RvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWVhMSAgLyogVSsxRUExIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX0Fob29rICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWVhMiAgLyogVSsxRUEyIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX2Fob29rICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWVhMyAgLyogVSsxRUEzIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19BY2lyY3VtZmxleGFjdXRlICAgICAgICAgICAweDEwMDFlYTQgIC8qIFUrMUVBNCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEUgKi8KKyNkZWZpbmUgWEtfYWNpcmN1bWZsZXhhY3V0ZSAgICAgICAgICAgMHgxMDAxZWE1ICAvKiBVKzFFQTUgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBBQ1VURSAqLworI2RlZmluZSBYS19BY2lyY3VtZmxleGdyYXZlICAgICAgICAgICAweDEwMDFlYTYgIC8qIFUrMUVBNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfYWNpcmN1bWZsZXhncmF2ZSAgICAgICAgICAgMHgxMDAxZWE3ICAvKiBVKzFFQTcgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBHUkFWRSAqLworI2RlZmluZSBYS19BY2lyY3VtZmxleGhvb2sgICAgICAgICAgICAweDEwMDFlYTggIC8qIFUrMUVBOCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19hY2lyY3VtZmxleGhvb2sgICAgICAgICAgICAweDEwMDFlYTkgIC8qIFUrMUVBOSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfQWNpcmN1bWZsZXh0aWxkZSAgICAgICAgICAgMHgxMDAxZWFhICAvKiBVKzFFQUEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIFRJTERFICovCisjZGVmaW5lIFhLX2FjaXJjdW1mbGV4dGlsZGUgICAgICAgICAgIDB4MTAwMWVhYiAgLyogVSsxRUFCIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgVElMREUgKi8KKyNkZWZpbmUgWEtfQWNpcmN1bWZsZXhiZWxvd2RvdCAgICAgICAgMHgxMDAxZWFjICAvKiBVKzFFQUMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19hY2lyY3VtZmxleGJlbG93ZG90ICAgICAgICAweDEwMDFlYWQgIC8qIFUrMUVBRCBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19BYnJldmVhY3V0ZSAgICAgICAgICAgICAgICAweDEwMDFlYWUgIC8qIFUrMUVBRSBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX2FicmV2ZWFjdXRlICAgICAgICAgICAgICAgIDB4MTAwMWVhZiAgLyogVSsxRUFGIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX0FicmV2ZWdyYXZlICAgICAgICAgICAgICAgIDB4MTAwMWViMCAgLyogVSsxRUIwIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfYWJyZXZlZ3JhdmUgICAgICAgICAgICAgICAgMHgxMDAxZWIxICAvKiBVKzFFQjEgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfQWJyZXZlaG9vayAgICAgICAgICAgICAgICAgMHgxMDAxZWIyICAvKiBVKzFFQjIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX2FicmV2ZWhvb2sgICAgICAgICAgICAgICAgIDB4MTAwMWViMyAgLyogVSsxRUIzIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfQWJyZXZldGlsZGUgICAgICAgICAgICAgICAgMHgxMDAxZWI0ICAvKiBVKzFFQjQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBUSUxERSAqLworI2RlZmluZSBYS19hYnJldmV0aWxkZSAgICAgICAgICAgICAgICAweDEwMDFlYjUgIC8qIFUrMUVCNSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBUSUxERSAqLworI2RlZmluZSBYS19BYnJldmViZWxvd2RvdCAgICAgICAgICAgICAweDEwMDFlYjYgIC8qIFUrMUVCNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19hYnJldmViZWxvd2RvdCAgICAgICAgICAgICAweDEwMDFlYjcgIC8qIFUrMUVCNyBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfRWJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWI4ICAvKiBVKzFFQjggTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19lYmVsb3dkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlYjkgIC8qIFUrMUVCOSBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19FaG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlYmEgIC8qIFUrMUVCQSBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19laG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlYmIgIC8qIFUrMUVCQiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfRXRpbGRlICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWJjICAvKiBVKzFFQkMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX2V0aWxkZSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWViZCAgLyogVSsxRUJEIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfRWNpcmN1bWZsZXhhY3V0ZSAgICAgICAgICAgMHgxMDAxZWJlICAvKiBVKzFFQkUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX2VjaXJjdW1mbGV4YWN1dGUgICAgICAgICAgIDB4MTAwMWViZiAgLyogVSsxRUJGIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEUgKi8KKyNkZWZpbmUgWEtfRWNpcmN1bWZsZXhncmF2ZSAgICAgICAgICAgMHgxMDAxZWMwICAvKiBVKzFFQzAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX2VjaXJjdW1mbGV4Z3JhdmUgICAgICAgICAgIDB4MTAwMWVjMSAgLyogVSsxRUMxIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfRWNpcmN1bWZsZXhob29rICAgICAgICAgICAgMHgxMDAxZWMyICAvKiBVKzFFQzIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfZWNpcmN1bWZsZXhob29rICAgICAgICAgICAgMHgxMDAxZWMzICAvKiBVKzFFQzMgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX0VjaXJjdW1mbGV4dGlsZGUgICAgICAgICAgIDB4MTAwMWVjNCAgLyogVSsxRUM0IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERSAqLworI2RlZmluZSBYS19lY2lyY3VtZmxleHRpbGRlICAgICAgICAgICAweDEwMDFlYzUgIC8qIFUrMUVDNSBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIFRJTERFICovCisjZGVmaW5lIFhLX0VjaXJjdW1mbGV4YmVsb3dkb3QgICAgICAgIDB4MTAwMWVjNiAgLyogVSsxRUM2IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfZWNpcmN1bWZsZXhiZWxvd2RvdCAgICAgICAgMHgxMDAxZWM3ICAvKiBVKzFFQzcgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfSWhvb2sgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWM4ICAvKiBVKzFFQzggTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfaWhvb2sgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWM5ICAvKiBVKzFFQzkgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX0liZWxvd2RvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWVjYSAgLyogVSsxRUNBIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfaWJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWNiICAvKiBVKzFFQ0IgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfT2JlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWNjICAvKiBVKzFFQ0MgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19vYmVsb3dkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlY2QgIC8qIFUrMUVDRCBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19PaG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlY2UgIC8qIFUrMUVDRSBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19vaG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlY2YgIC8qIFUrMUVDRiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfT2NpcmN1bWZsZXhhY3V0ZSAgICAgICAgICAgMHgxMDAxZWQwICAvKiBVKzFFRDAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX29jaXJjdW1mbGV4YWN1dGUgICAgICAgICAgIDB4MTAwMWVkMSAgLyogVSsxRUQxIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEUgKi8KKyNkZWZpbmUgWEtfT2NpcmN1bWZsZXhncmF2ZSAgICAgICAgICAgMHgxMDAxZWQyICAvKiBVKzFFRDIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX29jaXJjdW1mbGV4Z3JhdmUgICAgICAgICAgIDB4MTAwMWVkMyAgLyogVSsxRUQzIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfT2NpcmN1bWZsZXhob29rICAgICAgICAgICAgMHgxMDAxZWQ0ICAvKiBVKzFFRDQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfb2NpcmN1bWZsZXhob29rICAgICAgICAgICAgMHgxMDAxZWQ1ICAvKiBVKzFFRDUgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX09jaXJjdW1mbGV4dGlsZGUgICAgICAgICAgIDB4MTAwMWVkNiAgLyogVSsxRUQ2IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERSAqLworI2RlZmluZSBYS19vY2lyY3VtZmxleHRpbGRlICAgICAgICAgICAweDEwMDFlZDcgIC8qIFUrMUVENyBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIFRJTERFICovCisjZGVmaW5lIFhLX09jaXJjdW1mbGV4YmVsb3dkb3QgICAgICAgIDB4MTAwMWVkOCAgLyogVSsxRUQ4IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfb2NpcmN1bWZsZXhiZWxvd2RvdCAgICAgICAgMHgxMDAxZWQ5ICAvKiBVKzFFRDkgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfT2hvcm5hY3V0ZSAgICAgICAgICAgICAgICAgMHgxMDAxZWRhICAvKiBVKzFFREEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX29ob3JuYWN1dGUgICAgICAgICAgICAgICAgIDB4MTAwMWVkYiAgLyogVSsxRURCIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgQUNVVEUgKi8KKyNkZWZpbmUgWEtfT2hvcm5ncmF2ZSAgICAgICAgICAgICAgICAgMHgxMDAxZWRjICAvKiBVKzFFREMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX29ob3JuZ3JhdmUgICAgICAgICAgICAgICAgIDB4MTAwMWVkZCAgLyogVSsxRUREIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfT2hvcm5ob29rICAgICAgICAgICAgICAgICAgMHgxMDAxZWRlICAvKiBVKzFFREUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfb2hvcm5ob29rICAgICAgICAgICAgICAgICAgMHgxMDAxZWRmICAvKiBVKzFFREYgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX09ob3JudGlsZGUgICAgICAgICAgICAgICAgIDB4MTAwMWVlMCAgLyogVSsxRUUwIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBUSUxERSAqLworI2RlZmluZSBYS19vaG9ybnRpbGRlICAgICAgICAgICAgICAgICAweDEwMDFlZTEgIC8qIFUrMUVFMSBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIFRJTERFICovCisjZGVmaW5lIFhLX09ob3JuYmVsb3dkb3QgICAgICAgICAgICAgIDB4MTAwMWVlMiAgLyogVSsxRUUyIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfb2hvcm5iZWxvd2RvdCAgICAgICAgICAgICAgMHgxMDAxZWUzICAvKiBVKzFFRTMgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfVWJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWU0ICAvKiBVKzFFRTQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS191YmVsb3dkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlZTUgIC8qIFUrMUVFNSBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19VaG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlZTYgIC8qIFUrMUVFNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS191aG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlZTcgIC8qIFUrMUVFNyBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfVWhvcm5hY3V0ZSAgICAgICAgICAgICAgICAgMHgxMDAxZWU4ICAvKiBVKzFFRTggTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX3Vob3JuYWN1dGUgICAgICAgICAgICAgICAgIDB4MTAwMWVlOSAgLyogVSsxRUU5IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgQUNVVEUgKi8KKyNkZWZpbmUgWEtfVWhvcm5ncmF2ZSAgICAgICAgICAgICAgICAgMHgxMDAxZWVhICAvKiBVKzFFRUEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX3Vob3JuZ3JhdmUgICAgICAgICAgICAgICAgIDB4MTAwMWVlYiAgLyogVSsxRUVCIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfVWhvcm5ob29rICAgICAgICAgICAgICAgICAgMHgxMDAxZWVjICAvKiBVKzFFRUMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfdWhvcm5ob29rICAgICAgICAgICAgICAgICAgMHgxMDAxZWVkICAvKiBVKzFFRUQgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX1Vob3JudGlsZGUgICAgICAgICAgICAgICAgIDB4MTAwMWVlZSAgLyogVSsxRUVFIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBUSUxERSAqLworI2RlZmluZSBYS191aG9ybnRpbGRlICAgICAgICAgICAgICAgICAweDEwMDFlZWYgIC8qIFUrMUVFRiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIFRJTERFICovCisjZGVmaW5lIFhLX1Vob3JuYmVsb3dkb3QgICAgICAgICAgICAgIDB4MTAwMWVmMCAgLyogVSsxRUYwIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfdWhvcm5iZWxvd2RvdCAgICAgICAgICAgICAgMHgxMDAxZWYxICAvKiBVKzFFRjEgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfWWJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWY0ICAvKiBVKzFFRjQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS195YmVsb3dkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlZjUgIC8qIFUrMUVGNSBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19ZaG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlZjYgIC8qIFUrMUVGNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS195aG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlZjcgIC8qIFUrMUVGNyBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfWXRpbGRlICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWY4ICAvKiBVKzFFRjggTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX3l0aWxkZSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWVmOSAgLyogVSsxRUY5IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfT2hvcm4gICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMWEwICAvKiBVKzAxQTAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gKi8KKyNkZWZpbmUgWEtfb2hvcm4gICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMWExICAvKiBVKzAxQTEgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOICovCisjZGVmaW5lIFhLX1Vob3JuICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDFhZiAgLyogVSswMUFGIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOICovCisjZGVmaW5lIFhLX3Vob3JuICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDFiMCAgLyogVSswMUIwIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiAqLworCisjZW5kaWYgLyogWEtfVklFVE5BTUVTRSAqLworCisjaWZkZWYgWEtfQ1VSUkVOQ1kKKyNkZWZpbmUgWEtfRWN1U2lnbiAgICAgICAgICAgICAgICAgICAgMHgxMDAyMGEwICAvKiBVKzIwQTAgRVVSTy1DVVJSRU5DWSBTSUdOICovCisjZGVmaW5lIFhLX0NvbG9uU2lnbiAgICAgICAgICAgICAgICAgIDB4MTAwMjBhMSAgLyogVSsyMEExIENPTE9OIFNJR04gKi8KKyNkZWZpbmUgWEtfQ3J1emVpcm9TaWduICAgICAgICAgICAgICAgMHgxMDAyMGEyICAvKiBVKzIwQTIgQ1JVWkVJUk8gU0lHTiAqLworI2RlZmluZSBYS19GRnJhbmNTaWduICAgICAgICAgICAgICAgICAweDEwMDIwYTMgIC8qIFUrMjBBMyBGUkVOQ0ggRlJBTkMgU0lHTiAqLworI2RlZmluZSBYS19MaXJhU2lnbiAgICAgICAgICAgICAgICAgICAweDEwMDIwYTQgIC8qIFUrMjBBNCBMSVJBIFNJR04gKi8KKyNkZWZpbmUgWEtfTWlsbFNpZ24gICAgICAgICAgICAgICAgICAgMHgxMDAyMGE1ICAvKiBVKzIwQTUgTUlMTCBTSUdOICovCisjZGVmaW5lIFhLX05haXJhU2lnbiAgICAgICAgICAgICAgICAgIDB4MTAwMjBhNiAgLyogVSsyMEE2IE5BSVJBIFNJR04gKi8KKyNkZWZpbmUgWEtfUGVzZXRhU2lnbiAgICAgICAgICAgICAgICAgMHgxMDAyMGE3ICAvKiBVKzIwQTcgUEVTRVRBIFNJR04gKi8KKyNkZWZpbmUgWEtfUnVwZWVTaWduICAgICAgICAgICAgICAgICAgMHgxMDAyMGE4ICAvKiBVKzIwQTggUlVQRUUgU0lHTiAqLworI2RlZmluZSBYS19Xb25TaWduICAgICAgICAgICAgICAgICAgICAweDEwMDIwYTkgIC8qIFUrMjBBOSBXT04gU0lHTiAqLworI2RlZmluZSBYS19OZXdTaGVxZWxTaWduICAgICAgICAgICAgICAweDEwMDIwYWEgIC8qIFUrMjBBQSBORVcgU0hFUUVMIFNJR04gKi8KKyNkZWZpbmUgWEtfRG9uZ1NpZ24gICAgICAgICAgICAgICAgICAgMHgxMDAyMGFiICAvKiBVKzIwQUIgRE9ORyBTSUdOICovCisjZGVmaW5lIFhLX0V1cm9TaWduICAgICAgICAgICAgICAgICAgICAgIDB4MjBhYyAgLyogVSsyMEFDIEVVUk8gU0lHTiAqLworI2VuZGlmIC8qIFhLX0NVUlJFTkNZICovCisKKyNpZmRlZiBYS19NQVRIRU1BVElDQUwKKy8qIG9uZSwgdHdvIGFuZCB0aHJlZSBhcmUgZGVmaW5lZCBhYm92ZS4gKi8KKyNkZWZpbmUgWEtfemVyb3N1cGVyaW9yICAgICAgICAgICAgICAgMHgxMDAyMDcwICAvKiBVKzIwNzAgU1VQRVJTQ1JJUFQgWkVSTyAqLworI2RlZmluZSBYS19mb3Vyc3VwZXJpb3IgICAgICAgICAgICAgICAweDEwMDIwNzQgIC8qIFUrMjA3NCBTVVBFUlNDUklQVCBGT1VSICovCisjZGVmaW5lIFhLX2ZpdmVzdXBlcmlvciAgICAgICAgICAgICAgIDB4MTAwMjA3NSAgLyogVSsyMDc1IFNVUEVSU0NSSVBUIEZJVkUgKi8KKyNkZWZpbmUgWEtfc2l4c3VwZXJpb3IgICAgICAgICAgICAgICAgMHgxMDAyMDc2ICAvKiBVKzIwNzYgU1VQRVJTQ1JJUFQgU0lYICovCisjZGVmaW5lIFhLX3NldmVuc3VwZXJpb3IgICAgICAgICAgICAgIDB4MTAwMjA3NyAgLyogVSsyMDc3IFNVUEVSU0NSSVBUIFNFVkVOICovCisjZGVmaW5lIFhLX2VpZ2h0c3VwZXJpb3IgICAgICAgICAgICAgIDB4MTAwMjA3OCAgLyogVSsyMDc4IFNVUEVSU0NSSVBUIEVJR0hUICovCisjZGVmaW5lIFhLX25pbmVzdXBlcmlvciAgICAgICAgICAgICAgIDB4MTAwMjA3OSAgLyogVSsyMDc5IFNVUEVSU0NSSVBUIE5JTkUgKi8KKyNkZWZpbmUgWEtfemVyb3N1YnNjcmlwdCAgICAgICAgICAgICAgMHgxMDAyMDgwICAvKiBVKzIwODAgU1VCU0NSSVBUIFpFUk8gKi8KKyNkZWZpbmUgWEtfb25lc3Vic2NyaXB0ICAgICAgICAgICAgICAgMHgxMDAyMDgxICAvKiBVKzIwODEgU1VCU0NSSVBUIE9ORSAqLworI2RlZmluZSBYS190d29zdWJzY3JpcHQgICAgICAgICAgICAgICAweDEwMDIwODIgIC8qIFUrMjA4MiBTVUJTQ1JJUFQgVFdPICovCisjZGVmaW5lIFhLX3RocmVlc3Vic2NyaXB0ICAgICAgICAgICAgIDB4MTAwMjA4MyAgLyogVSsyMDgzIFNVQlNDUklQVCBUSFJFRSAqLworI2RlZmluZSBYS19mb3Vyc3Vic2NyaXB0ICAgICAgICAgICAgICAweDEwMDIwODQgIC8qIFUrMjA4NCBTVUJTQ1JJUFQgRk9VUiAqLworI2RlZmluZSBYS19maXZlc3Vic2NyaXB0ICAgICAgICAgICAgICAweDEwMDIwODUgIC8qIFUrMjA4NSBTVUJTQ1JJUFQgRklWRSAqLworI2RlZmluZSBYS19zaXhzdWJzY3JpcHQgICAgICAgICAgICAgICAweDEwMDIwODYgIC8qIFUrMjA4NiBTVUJTQ1JJUFQgU0lYICovCisjZGVmaW5lIFhLX3NldmVuc3Vic2NyaXB0ICAgICAgICAgICAgIDB4MTAwMjA4NyAgLyogVSsyMDg3IFNVQlNDUklQVCBTRVZFTiAqLworI2RlZmluZSBYS19laWdodHN1YnNjcmlwdCAgICAgICAgICAgICAweDEwMDIwODggIC8qIFUrMjA4OCBTVUJTQ1JJUFQgRUlHSFQgKi8KKyNkZWZpbmUgWEtfbmluZXN1YnNjcmlwdCAgICAgICAgICAgICAgMHgxMDAyMDg5ICAvKiBVKzIwODkgU1VCU0NSSVBUIE5JTkUgKi8KKyNkZWZpbmUgWEtfcGFydGRpZmZlcmVudGlhbCAgICAgICAgICAgMHgxMDAyMjAyICAvKiBVKzIyMDIgUEFSVElBTCBESUZGRVJFTlRJQUwgKi8KKyNkZWZpbmUgWEtfZW1wdHlzZXQgICAgICAgICAgICAgICAgICAgMHgxMDAyMjA1ICAvKiBVKzIyMDUgTlVMTCBTRVQgKi8KKyNkZWZpbmUgWEtfZWxlbWVudG9mICAgICAgICAgICAgICAgICAgMHgxMDAyMjA4ICAvKiBVKzIyMDggRUxFTUVOVCBPRiAqLworI2RlZmluZSBYS19ub3RlbGVtZW50b2YgICAgICAgICAgICAgICAweDEwMDIyMDkgIC8qIFUrMjIwOSBOT1QgQU4gRUxFTUVOVCBPRiAqLworI2RlZmluZSBYS19jb250YWluc2FzICAgICAgICAgICAgICAgICAweDEwMDIyMEIgIC8qIFUrMjIwQiBDT05UQUlOUyBBUyBNRU1CRVIgKi8KKyNkZWZpbmUgWEtfc3F1YXJlcm9vdCAgICAgICAgICAgICAgICAgMHgxMDAyMjFBICAvKiBVKzIyMUEgU1FVQVJFIFJPT1QgKi8KKyNkZWZpbmUgWEtfY3ViZXJvb3QgICAgICAgICAgICAgICAgICAgMHgxMDAyMjFCICAvKiBVKzIyMUIgQ1VCRSBST09UICovCisjZGVmaW5lIFhLX2ZvdXJ0aHJvb3QgICAgICAgICAgICAgICAgIDB4MTAwMjIxQyAgLyogVSsyMjFDIEZPVVJUSCBST09UICovCisjZGVmaW5lIFhLX2RpbnRlZ3JhbCAgICAgICAgICAgICAgICAgIDB4MTAwMjIyQyAgLyogVSsyMjJDIERPVUJMRSBJTlRFR1JBTCAqLworI2RlZmluZSBYS190aW50ZWdyYWwgICAgICAgICAgICAgICAgICAweDEwMDIyMkQgIC8qIFUrMjIyRCBUUklQTEUgSU5URUdSQUwgKi8KKyNkZWZpbmUgWEtfYmVjYXVzZSAgICAgICAgICAgICAgICAgICAgMHgxMDAyMjM1ICAvKiBVKzIyMzUgQkVDQVVTRSAqLworI2RlZmluZSBYS19hcHByb3hlcSAgICAgICAgICAgICAgICAgICAweDEwMDIyNDggIC8qIFUrMjI0NSBBTE1PU1QgRVFVQUwgVE8gKi8KKyNkZWZpbmUgWEtfbm90YXBwcm94ZXEgICAgICAgICAgICAgICAgMHgxMDAyMjQ3ICAvKiBVKzIyNDcgTk9UIEFMTU9TVCBFUVVBTCBUTyAqLworI2RlZmluZSBYS19ub3RpZGVudGljYWwgICAgICAgICAgICAgICAweDEwMDIyNjIgIC8qIFUrMjI2MiBOT1QgSURFTlRJQ0FMIFRPICovCisjZGVmaW5lIFhLX3N0cmljdGVxICAgICAgICAgICAgICAgICAgIDB4MTAwMjI2MyAgLyogVSsyMjYzIFNUUklDVExZIEVRVUlWQUxFTlQgVE8gKi8gICAgICAgICAgCisjZW5kaWYgLyogWEtfTUFUSEVNQVRJQ0FMICovCisKKyNpZmRlZiBYS19CUkFJTExFCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90XzEgICAgICAgICAgICAgICAgIDB4ZmZmMQorI2RlZmluZSBYS19icmFpbGxlX2RvdF8yICAgICAgICAgICAgICAgICAweGZmZjIKKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RfMyAgICAgICAgICAgICAgICAgMHhmZmYzCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90XzQgICAgICAgICAgICAgICAgIDB4ZmZmNAorI2RlZmluZSBYS19icmFpbGxlX2RvdF81ICAgICAgICAgICAgICAgICAweGZmZjUKKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RfNiAgICAgICAgICAgICAgICAgMHhmZmY2CisjZGVmaW5lIFhLX2JyYWlsbGVfZG90XzcgICAgICAgICAgICAgICAgIDB4ZmZmNworI2RlZmluZSBYS19icmFpbGxlX2RvdF84ICAgICAgICAgICAgICAgICAweGZmZjgKKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RfOSAgICAgICAgICAgICAgICAgMHhmZmY5CisjZGVmaW5lIFhLX2JyYWlsbGVfZG90XzEwICAgICAgICAgICAgICAgIDB4ZmZmYQorI2RlZmluZSBYS19icmFpbGxlX2JsYW5rICAgICAgICAgICAgICAweDEwMDI4MDAgIC8qIFUrMjgwMCBCUkFJTExFIFBBVFRFUk4gQkxBTksgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEgICAgICAgICAgICAgMHgxMDAyODAxICAvKiBVKzI4MDEgQlJBSUxMRSBQQVRURVJOIERPVFMtMSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMiAgICAgICAgICAgICAweDEwMDI4MDIgIC8qIFUrMjgwMiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMiAgICAgICAgICAgIDB4MTAwMjgwMyAgLyogVSsyODAzIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zICAgICAgICAgICAgIDB4MTAwMjgwNCAgLyogVSsyODA0IEJSQUlMTEUgUEFUVEVSTiBET1RTLTMgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzICAgICAgICAgICAgMHgxMDAyODA1ICAvKiBVKzI4MDUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTMgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzICAgICAgICAgICAgMHgxMDAyODA2ICAvKiBVKzI4MDYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjMgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMyAgICAgICAgICAgMHgxMDAyODA3ICAvKiBVKzI4MDcgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180ICAgICAgICAgICAgIDB4MTAwMjgwOCAgLyogVSsyODA4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0ICAgICAgICAgICAgMHgxMDAyODA5ICAvKiBVKzI4MDkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI0ICAgICAgICAgICAgMHgxMDAyODBhICAvKiBVKzI4MGEgQlJBSUxMRSBQQVRURVJOIERPVFMtMjQgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNCAgICAgICAgICAgMHgxMDAyODBiICAvKiBVKzI4MGIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNCAgICAgICAgICAgIDB4MTAwMjgwYyAgLyogVSsyODBjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzQgICAgICAgICAgIDB4MTAwMjgwZCAgLyogVSsyODBkIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0ICAgICAgICAgICAweDEwMDI4MGUgIC8qIFUrMjgwZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQgICAgICAgICAgMHgxMDAyODBmICAvKiBVKzI4MGYgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNSAgICAgICAgICAgICAweDEwMDI4MTAgIC8qIFUrMjgxMCBCUkFJTExFIFBBVFRFUk4gRE9UUy01ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNSAgICAgICAgICAgIDB4MTAwMjgxMSAgLyogVSsyODExIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNSAgICAgICAgICAgIDB4MTAwMjgxMiAgLyogVSsyODEyIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjUgICAgICAgICAgIDB4MTAwMjgxMyAgLyogVSsyODEzIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzUgICAgICAgICAgICAweDEwMDI4MTQgIC8qIFUrMjgxNCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM1ICAgICAgICAgICAweDEwMDI4MTUgIC8qIFUrMjgxNSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNSAgICAgICAgICAgMHgxMDAyODE2ICAvKiBVKzI4MTYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM1ICAgICAgICAgIDB4MTAwMjgxNyAgLyogVSsyODE3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzQ1ICAgICAgICAgICAgMHgxMDAyODE4ICAvKiBVKzI4MTggQlJBSUxMRSBQQVRURVJOIERPVFMtNDUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0NSAgICAgICAgICAgMHgxMDAyODE5ICAvKiBVKzI4MTkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQ1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDUgICAgICAgICAgIDB4MTAwMjgxYSAgLyogVSsyODFhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0NSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI0NSAgICAgICAgICAweDEwMDI4MWIgIC8qIFUrMjgxYiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjQ1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNDUgICAgICAgICAgIDB4MTAwMjgxYyAgLyogVSsyODFjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0NSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0NSAgICAgICAgICAweDEwMDI4MWQgIC8qIFUrMjgxZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzQ1ICAgICAgICAgIDB4MTAwMjgxZSAgLyogVSsyODFlIEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNDUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQ1ICAgICAgICAgMHgxMDAyODFmICAvKiBVKzI4MWYgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNDUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzYgICAgICAgICAgICAgMHgxMDAyODIwICAvKiBVKzI4MjAgQlJBSUxMRSBQQVRURVJOIERPVFMtNiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTYgICAgICAgICAgICAweDEwMDI4MjEgIC8qIFUrMjgyMSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjYgICAgICAgICAgICAweDEwMDI4MjIgIC8qIFUrMjgyMiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI2ICAgICAgICAgICAweDEwMDI4MjMgIC8qIFUrMjgyMyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM2ICAgICAgICAgICAgMHgxMDAyODI0ICAvKiBVKzI4MjQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNiAgICAgICAgICAgMHgxMDAyODI1ICAvKiBVKzI4MjUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzYgICAgICAgICAgIDB4MTAwMjgyNiAgLyogVSsyODI2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNiAgICAgICAgICAweDEwMDI4MjcgIC8qIFUrMjgyNyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NiAgICAgICAgICAgIDB4MTAwMjgyOCAgLyogVSsyODI4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDYgICAgICAgICAgIDB4MTAwMjgyOSAgLyogVSsyODI5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ2ICAgICAgICAgICAweDEwMDI4MmEgIC8qIFUrMjgyYSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDYgICAgICAgICAgMHgxMDAyODJiICAvKiBVKzI4MmIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ2ICAgICAgICAgICAweDEwMDI4MmMgIC8qIFUrMjgyYyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDYgICAgICAgICAgMHgxMDAyODJkICAvKiBVKzI4MmQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NiAgICAgICAgICAweDEwMDI4MmUgIC8qIFUrMjgyZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NiAgICAgICAgIDB4MTAwMjgyZiAgLyogVSsyODJmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c181NiAgICAgICAgICAgIDB4MTAwMjgzMCAgLyogVSsyODMwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTU2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNTYgICAgICAgICAgIDB4MTAwMjgzMSAgLyogVSsyODMxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjU2ICAgICAgICAgICAweDEwMDI4MzIgIC8qIFUrMjgzMiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNTYgICAgICAgICAgMHgxMDAyODMzICAvKiBVKzI4MzMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzU2ICAgICAgICAgICAweDEwMDI4MzQgIC8qIFUrMjgzNCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNTYgICAgICAgICAgMHgxMDAyODM1ICAvKiBVKzI4MzUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM1NiAgICAgICAgICAweDEwMDI4MzYgIC8qIFUrMjgzNiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzU2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM1NiAgICAgICAgIDB4MTAwMjgzNyAgLyogVSsyODM3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzU2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NTYgICAgICAgICAgIDB4MTAwMjgzOCAgLyogVSsyODM4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ1NiAgICAgICAgICAweDEwMDI4MzkgIC8qIFUrMjgzOSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDU2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDU2ICAgICAgICAgIDB4MTAwMjgzYSAgLyogVSsyODNhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0NTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDU2ICAgICAgICAgMHgxMDAyODNiICAvKiBVKzI4M2IgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NTYgICAgICAgICAgMHgxMDAyODNjICAvKiBVKzI4M2MgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0NTYgICAgICAgICAweDEwMDI4M2QgIC8qIFUrMjgzZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NTYgICAgICAgICAweDEwMDI4M2UgIC8qIFUrMjgzZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDU2ICAgICAgICAweDEwMDI4M2YgIC8qIFUrMjgzZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzcgICAgICAgICAgICAgMHgxMDAyODQwICAvKiBVKzI4NDAgQlJBSUxMRSBQQVRURVJOIERPVFMtNyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTcgICAgICAgICAgICAweDEwMDI4NDEgIC8qIFUrMjg0MSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjcgICAgICAgICAgICAweDEwMDI4NDIgIC8qIFUrMjg0MiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI3ICAgICAgICAgICAweDEwMDI4NDMgIC8qIFUrMjg0MyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM3ICAgICAgICAgICAgMHgxMDAyODQ0ICAvKiBVKzI4NDQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNyAgICAgICAgICAgMHgxMDAyODQ1ICAvKiBVKzI4NDUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzcgICAgICAgICAgIDB4MTAwMjg0NiAgLyogVSsyODQ2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNyAgICAgICAgICAweDEwMDI4NDcgIC8qIFUrMjg0NyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NyAgICAgICAgICAgIDB4MTAwMjg0OCAgLyogVSsyODQ4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDcgICAgICAgICAgIDB4MTAwMjg0OSAgLyogVSsyODQ5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ3ICAgICAgICAgICAweDEwMDI4NGEgIC8qIFUrMjg0YSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDcgICAgICAgICAgMHgxMDAyODRiICAvKiBVKzI4NGIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ3ICAgICAgICAgICAweDEwMDI4NGMgIC8qIFUrMjg0YyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDcgICAgICAgICAgMHgxMDAyODRkICAvKiBVKzI4NGQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NyAgICAgICAgICAweDEwMDI4NGUgIC8qIFUrMjg0ZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NyAgICAgICAgIDB4MTAwMjg0ZiAgLyogVSsyODRmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c181NyAgICAgICAgICAgIDB4MTAwMjg1MCAgLyogVSsyODUwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTU3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNTcgICAgICAgICAgIDB4MTAwMjg1MSAgLyogVSsyODUxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjU3ICAgICAgICAgICAweDEwMDI4NTIgIC8qIFUrMjg1MiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNTcgICAgICAgICAgMHgxMDAyODUzICAvKiBVKzI4NTMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzU3ICAgICAgICAgICAweDEwMDI4NTQgIC8qIFUrMjg1NCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNTcgICAgICAgICAgMHgxMDAyODU1ICAvKiBVKzI4NTUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM1NyAgICAgICAgICAweDEwMDI4NTYgIC8qIFUrMjg1NiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzU3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM1NyAgICAgICAgIDB4MTAwMjg1NyAgLyogVSsyODU3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzU3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NTcgICAgICAgICAgIDB4MTAwMjg1OCAgLyogVSsyODU4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ1NyAgICAgICAgICAweDEwMDI4NTkgIC8qIFUrMjg1OSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDU3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDU3ICAgICAgICAgIDB4MTAwMjg1YSAgLyogVSsyODVhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0NTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDU3ICAgICAgICAgMHgxMDAyODViICAvKiBVKzI4NWIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NTcgICAgICAgICAgMHgxMDAyODVjICAvKiBVKzI4NWMgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0NTcgICAgICAgICAweDEwMDI4NWQgIC8qIFUrMjg1ZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NTcgICAgICAgICAweDEwMDI4NWUgIC8qIFUrMjg1ZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDU3ICAgICAgICAweDEwMDI4NWYgIC8qIFUrMjg1ZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzY3ICAgICAgICAgICAgMHgxMDAyODYwICAvKiBVKzI4NjAgQlJBSUxMRSBQQVRURVJOIERPVFMtNjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE2NyAgICAgICAgICAgMHgxMDAyODYxICAvKiBVKzI4NjEgQlJBSUxMRSBQQVRURVJOIERPVFMtMTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNjcgICAgICAgICAgIDB4MTAwMjg2MiAgLyogVSsyODYyIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI2NyAgICAgICAgICAweDEwMDI4NjMgIC8qIFUrMjg2MyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNjcgICAgICAgICAgIDB4MTAwMjg2NCAgLyogVSsyODY0IEJSQUlMTEUgUEFUVEVSTiBET1RTLTM2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM2NyAgICAgICAgICAweDEwMDI4NjUgIC8qIFUrMjg2NSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzY3ICAgICAgICAgIDB4MTAwMjg2NiAgLyogVSsyODY2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzY3ICAgICAgICAgMHgxMDAyODY3ICAvKiBVKzI4NjcgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzQ2NyAgICAgICAgICAgMHgxMDAyODY4ICAvKiBVKzI4NjggQlJBSUxMRSBQQVRURVJOIERPVFMtNDY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDY3ICAgICAgICAgIDB4MTAwMjg2OSAgLyogVSsyODY5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI0NjcgICAgICAgICAgMHgxMDAyODZhICAvKiBVKzI4NmEgQlJBSUxMRSBQQVRURVJOIERPVFMtMjQ2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI0NjcgICAgICAgICAweDEwMDI4NmIgIC8qIFUrMjg2YiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjQ2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ2NyAgICAgICAgICAweDEwMDI4NmMgIC8qIFUrMjg2YyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzQ2NyAgICAgICAgIDB4MTAwMjg2ZCAgLyogVSsyODZkIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNDY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzQ2NyAgICAgICAgIDB4MTAwMjg2ZSAgLyogVSsyODZlIEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNDY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NjcgICAgICAgIDB4MTAwMjg2ZiAgLyogVSsyODZmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNTY3ICAgICAgICAgICAweDEwMDI4NzAgIC8qIFUrMjg3MCBCUkFJTExFIFBBVFRFUk4gRE9UUy01NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE1NjcgICAgICAgICAgMHgxMDAyODcxICAvKiBVKzI4NzEgQlJBSUxMRSBQQVRURVJOIERPVFMtMTU2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjU2NyAgICAgICAgICAweDEwMDI4NzIgIC8qIFUrMjg3MiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjU2NyAgICAgICAgIDB4MTAwMjg3MyAgLyogVSsyODczIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNTY3ICAgICAgICAgIDB4MTAwMjg3NCAgLyogVSsyODc0IEJSQUlMTEUgUEFUVEVSTiBET1RTLTM1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNTY3ICAgICAgICAgMHgxMDAyODc1ICAvKiBVKzI4NzUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNTY3ICAgICAgICAgMHgxMDAyODc2ICAvKiBVKzI4NzYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzU2NyAgICAgICAgMHgxMDAyODc3ICAvKiBVKzI4NzcgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NTY3ICAgICAgICAgIDB4MTAwMjg3OCAgLyogVSsyODc4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0NTY3ICAgICAgICAgMHgxMDAyODc5ICAvKiBVKzI4NzkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQ1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI0NTY3ICAgICAgICAgMHgxMDAyODdhICAvKiBVKzI4N2EgQlJBSUxMRSBQQVRURVJOIERPVFMtMjQ1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDU2NyAgICAgICAgMHgxMDAyODdiICAvKiBVKzI4N2IgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNDU2NyAgICAgICAgIDB4MTAwMjg3YyAgLyogVSsyODdjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0NTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzQ1NjcgICAgICAgIDB4MTAwMjg3ZCAgLyogVSsyODdkIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNDU2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NTY3ICAgICAgICAweDEwMDI4N2UgIC8qIFUrMjg3ZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQ1NjcgICAgICAgMHgxMDAyODdmICAvKiBVKzI4N2YgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNDU2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfOCAgICAgICAgICAgICAweDEwMDI4ODAgIC8qIFUrMjg4MCBCUkFJTExFIFBBVFRFUk4gRE9UUy04ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xOCAgICAgICAgICAgIDB4MTAwMjg4MSAgLyogVSsyODgxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yOCAgICAgICAgICAgIDB4MTAwMjg4MiAgLyogVSsyODgyIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjggICAgICAgICAgIDB4MTAwMjg4MyAgLyogVSsyODgzIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyOCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzggICAgICAgICAgICAweDEwMDI4ODQgIC8qIFUrMjg4NCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zOCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM4ICAgICAgICAgICAweDEwMDI4ODUgIC8qIFUrMjg4NSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzOCAgICAgICAgICAgMHgxMDAyODg2ICAvKiBVKzI4ODYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM4ICAgICAgICAgIDB4MTAwMjg4NyAgLyogVSsyODg3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzQ4ICAgICAgICAgICAgMHgxMDAyODg4ICAvKiBVKzI4ODggQlJBSUxMRSBQQVRURVJOIERPVFMtNDggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0OCAgICAgICAgICAgMHgxMDAyODg5ICAvKiBVKzI4ODkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQ4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDggICAgICAgICAgIDB4MTAwMjg4YSAgLyogVSsyODhhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI0OCAgICAgICAgICAweDEwMDI4OGIgIC8qIFUrMjg4YiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjQ4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNDggICAgICAgICAgIDB4MTAwMjg4YyAgLyogVSsyODhjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0OCAgICAgICAgICAweDEwMDI4OGQgIC8qIFUrMjg4ZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzQ4ICAgICAgICAgIDB4MTAwMjg4ZSAgLyogVSsyODhlIEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNDggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQ4ICAgICAgICAgMHgxMDAyODhmICAvKiBVKzI4OGYgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNDggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzU4ICAgICAgICAgICAgMHgxMDAyODkwICAvKiBVKzI4OTAgQlJBSUxMRSBQQVRURVJOIERPVFMtNTggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE1OCAgICAgICAgICAgMHgxMDAyODkxICAvKiBVKzI4OTEgQlJBSUxMRSBQQVRURVJOIERPVFMtMTU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNTggICAgICAgICAgIDB4MTAwMjg5MiAgLyogVSsyODkyIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI1OCAgICAgICAgICAweDEwMDI4OTMgIC8qIFUrMjg5MyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNTggICAgICAgICAgIDB4MTAwMjg5NCAgLyogVSsyODk0IEJSQUlMTEUgUEFUVEVSTiBET1RTLTM1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM1OCAgICAgICAgICAweDEwMDI4OTUgIC8qIFUrMjg5NSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzU4ICAgICAgICAgIDB4MTAwMjg5NiAgLyogVSsyODk2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNTggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzU4ICAgICAgICAgMHgxMDAyODk3ICAvKiBVKzI4OTcgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNTggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzQ1OCAgICAgICAgICAgMHgxMDAyODk4ICAvKiBVKzI4OTggQlJBSUxMRSBQQVRURVJOIERPVFMtNDU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDU4ICAgICAgICAgIDB4MTAwMjg5OSAgLyogVSsyODk5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NTggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI0NTggICAgICAgICAgMHgxMDAyODlhICAvKiBVKzI4OWEgQlJBSUxMRSBQQVRURVJOIERPVFMtMjQ1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI0NTggICAgICAgICAweDEwMDI4OWIgIC8qIFUrMjg5YiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjQ1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ1OCAgICAgICAgICAweDEwMDI4OWMgIC8qIFUrMjg5YyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzQ1OCAgICAgICAgIDB4MTAwMjg5ZCAgLyogVSsyODlkIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNDU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzQ1OCAgICAgICAgIDB4MTAwMjg5ZSAgLyogVSsyODllIEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNDU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NTggICAgICAgIDB4MTAwMjg5ZiAgLyogVSsyODlmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNjggICAgICAgICAgICAweDEwMDI4YTAgIC8qIFUrMjhhMCBCUkFJTExFIFBBVFRFUk4gRE9UUy02OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTY4ICAgICAgICAgICAweDEwMDI4YTEgIC8qIFUrMjhhMSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI2OCAgICAgICAgICAgMHgxMDAyOGEyICAvKiBVKzI4YTIgQlJBSUxMRSBQQVRURVJOIERPVFMtMjY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjY4ICAgICAgICAgIDB4MTAwMjhhMyAgLyogVSsyOGEzIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM2OCAgICAgICAgICAgMHgxMDAyOGE0ICAvKiBVKzI4YTQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzY4ICAgICAgICAgIDB4MTAwMjhhNSAgLyogVSsyOGE1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNjggICAgICAgICAgMHgxMDAyOGE2ICAvKiBVKzI4YTYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNjggICAgICAgICAweDEwMDI4YTcgIC8qIFUrMjhhNyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNDY4ICAgICAgICAgICAweDEwMDI4YTggIC8qIFUrMjhhOCBCUkFJTExFIFBBVFRFUk4gRE9UUy00NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0NjggICAgICAgICAgMHgxMDAyOGE5ICAvKiBVKzI4YTkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQ2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ2OCAgICAgICAgICAweDEwMDI4YWEgIC8qIFUrMjhhYSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQ2OCAgICAgICAgIDB4MTAwMjhhYiAgLyogVSsyOGFiIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNDY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNDY4ICAgICAgICAgIDB4MTAwMjhhYyAgLyogVSsyOGFjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDY4ICAgICAgICAgMHgxMDAyOGFkICAvKiBVKzI4YWQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNDY4ICAgICAgICAgMHgxMDAyOGFlICAvKiBVKzI4YWUgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQ2OCAgICAgICAgMHgxMDAyOGFmICAvKiBVKzI4YWYgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNDY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c181NjggICAgICAgICAgIDB4MTAwMjhiMCAgLyogVSsyOGIwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTU2OCAgICAgICAgICAweDEwMDI4YjEgIC8qIFUrMjhiMSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNTY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNTY4ICAgICAgICAgIDB4MTAwMjhiMiAgLyogVSsyOGIyIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNTY4ICAgICAgICAgMHgxMDAyOGIzICAvKiBVKzI4YjMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM1NjggICAgICAgICAgMHgxMDAyOGI0ICAvKiBVKzI4YjQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM1NjggICAgICAgICAweDEwMDI4YjUgIC8qIFUrMjhiNSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM1NjggICAgICAgICAweDEwMDI4YjYgIC8qIFUrMjhiNiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNTY4ICAgICAgICAweDEwMDI4YjcgIC8qIFUrMjhiNyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzQ1NjggICAgICAgICAgMHgxMDAyOGI4ICAvKiBVKzI4YjggQlJBSUxMRSBQQVRURVJOIERPVFMtNDU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ1NjggICAgICAgICAweDEwMDI4YjkgIC8qIFUrMjhiOSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ1NjggICAgICAgICAweDEwMDI4YmEgIC8qIFUrMjhiYSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI0NTY4ICAgICAgICAweDEwMDI4YmIgIC8qIFUrMjhiYiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjQ1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NTY4ICAgICAgICAgMHgxMDAyOGJjICAvKiBVKzI4YmMgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDU2OCAgICAgICAgMHgxMDAyOGJkICAvKiBVKzI4YmQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NTY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzQ1NjggICAgICAgIDB4MTAwMjhiZSAgLyogVSsyOGJlIEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNDU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDU2OCAgICAgICAweDEwMDI4YmYgIC8qIFUrMjhiZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NTY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c183OCAgICAgICAgICAgIDB4MTAwMjhjMCAgLyogVSsyOGMwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNzggICAgICAgICAgIDB4MTAwMjhjMSAgLyogVSsyOGMxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjc4ICAgICAgICAgICAweDEwMDI4YzIgIC8qIFUrMjhjMiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNzggICAgICAgICAgMHgxMDAyOGMzICAvKiBVKzI4YzMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzc4ICAgICAgICAgICAweDEwMDI4YzQgIC8qIFUrMjhjNCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNzggICAgICAgICAgMHgxMDAyOGM1ICAvKiBVKzI4YzUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM3OCAgICAgICAgICAweDEwMDI4YzYgIC8qIFUrMjhjNiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM3OCAgICAgICAgIDB4MTAwMjhjNyAgLyogVSsyOGM3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NzggICAgICAgICAgIDB4MTAwMjhjOCAgLyogVSsyOGM4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ3OCAgICAgICAgICAweDEwMDI4YzkgIC8qIFUrMjhjOSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDc4ICAgICAgICAgIDB4MTAwMjhjYSAgLyogVSsyOGNhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDc4ICAgICAgICAgMHgxMDAyOGNiICAvKiBVKzI4Y2IgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NzggICAgICAgICAgMHgxMDAyOGNjICAvKiBVKzI4Y2MgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0NzggICAgICAgICAweDEwMDI4Y2QgIC8qIFUrMjhjZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NzggICAgICAgICAweDEwMDI4Y2UgIC8qIFUrMjhjZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDc4ICAgICAgICAweDEwMDI4Y2YgIC8qIFUrMjhjZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzU3OCAgICAgICAgICAgMHgxMDAyOGQwICAvKiBVKzI4ZDAgQlJBSUxMRSBQQVRURVJOIERPVFMtNTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNTc4ICAgICAgICAgIDB4MTAwMjhkMSAgLyogVSsyOGQxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE1NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI1NzggICAgICAgICAgMHgxMDAyOGQyICAvKiBVKzI4ZDIgQlJBSUxMRSBQQVRURVJOIERPVFMtMjU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI1NzggICAgICAgICAweDEwMDI4ZDMgIC8qIFUrMjhkMyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzU3OCAgICAgICAgICAweDEwMDI4ZDQgIC8qIFUrMjhkNCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzU3OCAgICAgICAgIDB4MTAwMjhkNSAgLyogVSsyOGQ1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzU3OCAgICAgICAgIDB4MTAwMjhkNiAgLyogVSsyOGQ2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM1NzggICAgICAgIDB4MTAwMjhkNyAgLyogVSsyOGQ3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNDU3OCAgICAgICAgICAweDEwMDI4ZDggIC8qIFUrMjhkOCBCUkFJTExFIFBBVFRFUk4gRE9UUy00NTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDU3OCAgICAgICAgIDB4MTAwMjhkOSAgLyogVSsyOGQ5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDU3OCAgICAgICAgIDB4MTAwMjhkYSAgLyogVSsyOGRhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0NTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQ1NzggICAgICAgIDB4MTAwMjhkYiAgLyogVSsyOGRiIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNDU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ1NzggICAgICAgICAweDEwMDI4ZGMgIC8qIFUrMjhkYyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0NTc4ICAgICAgICAweDEwMDI4ZGQgIC8qIFUrMjhkZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ1NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNDU3OCAgICAgICAgMHgxMDAyOGRlICAvKiBVKzI4ZGUgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0NTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NTc4ICAgICAgIDB4MTAwMjhkZiAgLyogVSsyOGRmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ1NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzY3OCAgICAgICAgICAgMHgxMDAyOGUwICAvKiBVKzI4ZTAgQlJBSUxMRSBQQVRURVJOIERPVFMtNjc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNjc4ICAgICAgICAgIDB4MTAwMjhlMSAgLyogVSsyOGUxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI2NzggICAgICAgICAgMHgxMDAyOGUyICAvKiBVKzI4ZTIgQlJBSUxMRSBQQVRURVJOIERPVFMtMjY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI2NzggICAgICAgICAweDEwMDI4ZTMgIC8qIFUrMjhlMyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzY3OCAgICAgICAgICAweDEwMDI4ZTQgIC8qIFUrMjhlNCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNjc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzY3OCAgICAgICAgIDB4MTAwMjhlNSAgLyogVSsyOGU1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNjc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzY3OCAgICAgICAgIDB4MTAwMjhlNiAgLyogVSsyOGU2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNjc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM2NzggICAgICAgIDB4MTAwMjhlNyAgLyogVSsyOGU3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNDY3OCAgICAgICAgICAweDEwMDI4ZTggIC8qIFUrMjhlOCBCUkFJTExFIFBBVFRFUk4gRE9UUy00Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDY3OCAgICAgICAgIDB4MTAwMjhlOSAgLyogVSsyOGU5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDY3OCAgICAgICAgIDB4MTAwMjhlYSAgLyogVSsyOGVhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQ2NzggICAgICAgIDB4MTAwMjhlYiAgLyogVSsyOGViIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNDY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ2NzggICAgICAgICAweDEwMDI4ZWMgIC8qIFUrMjhlYyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0Njc4ICAgICAgICAweDEwMDI4ZWQgIC8qIFUrMjhlZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNDY3OCAgICAgICAgMHgxMDAyOGVlICAvKiBVKzI4ZWUgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0Njc4ICAgICAgIDB4MTAwMjhlZiAgLyogVSsyOGVmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzU2NzggICAgICAgICAgMHgxMDAyOGYwICAvKiBVKzI4ZjAgQlJBSUxMRSBQQVRURVJOIERPVFMtNTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTU2NzggICAgICAgICAweDEwMDI4ZjEgIC8qIFUrMjhmMSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjU2NzggICAgICAgICAweDEwMDI4ZjIgIC8qIFUrMjhmMiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI1Njc4ICAgICAgICAweDEwMDI4ZjMgIC8qIFUrMjhmMyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM1Njc4ICAgICAgICAgMHgxMDAyOGY0ICAvKiBVKzI4ZjQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNTY3OCAgICAgICAgMHgxMDAyOGY1ICAvKiBVKzI4ZjUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM1Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzU2NzggICAgICAgIDB4MTAwMjhmNiAgLyogVSsyOGY2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNTY3OCAgICAgICAweDEwMDI4ZjcgIC8qIFUrMjhmNyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM1Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NTY3OCAgICAgICAgIDB4MTAwMjhmOCAgLyogVSsyOGY4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ1Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDU2NzggICAgICAgIDB4MTAwMjhmOSAgLyogVSsyOGY5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ1Njc4ICAgICAgICAweDEwMDI4ZmEgIC8qIFUrMjhmYSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDU2NzggICAgICAgMHgxMDAyOGZiICAvKiBVKzI4ZmIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ1Njc4ICAgICAgICAweDEwMDI4ZmMgIC8qIFUrMjhmYyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDU2NzggICAgICAgMHgxMDAyOGZkICAvKiBVKzI4ZmQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NTY3OCAgICAgICAweDEwMDI4ZmUgIC8qIFUrMjhmZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ1Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NTY3OCAgICAgIDB4MTAwMjhmZiAgLyogVSsyOGZmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ1Njc4ICovCisjZW5kaWYgLyogWEtfQlJBSUxMRSAqLworCisvKgorICogU2luaGFsYSAoaHR0cDovL3VuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTBEODAucGRmKQorICogaHR0cDovL3d3dy5ub25nbnUub3JnL3NpbmhhbGEvZG9jL3RyYW5zbGl0ZXJhdGlvbi9zaW5oYWxhLXRyYW5zbGl0ZXJhdGlvbl82Lmh0bWwKKyAqLworCisjaWZkZWYgWEtfU0lOSEFMQQorI2RlZmluZSBYS19TaW5oX25nICAgICAgICAgICAgMHgxMDAwZDgyICAvKiBVKzBEODIgU0lOSEFMQSBBTlVTVkFSQVlBICovCisjZGVmaW5lIFhLX1NpbmhfaDIgICAgICAgICAgICAweDEwMDBkODMgIC8qIFUrMEQ4MyBTSU5IQUxBIFZJU0FSR0FZQSAqLworI2RlZmluZSBYS19TaW5oX2EgICAgICAgICAgICAgMHgxMDAwZDg1ICAvKiBVKzBEODUgU0lOSEFMQSBBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9hYSAgICAgICAgICAgIDB4MTAwMGQ4NiAgLyogVSswRDg2IFNJTkhBTEEgQUFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2FlICAgICAgICAgICAgMHgxMDAwZDg3ICAvKiBVKzBEODcgU0lOSEFMQSBBRVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfYWVlICAgICAgICAgICAweDEwMDBkODggIC8qIFUrMEQ4OCBTSU5IQUxBIEFFRVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfaSAgICAgICAgICAgICAweDEwMDBkODkgIC8qIFUrMEQ4OSBTSU5IQUxBIElZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2lpICAgICAgICAgICAgMHgxMDAwZDhhICAvKiBVKzBEOEEgU0lOSEFMQSBJSVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfdSAgICAgICAgICAgICAweDEwMDBkOGIgIC8qIFUrMEQ4QiBTSU5IQUxBIFVZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX3V1ICAgICAgICAgICAgMHgxMDAwZDhjICAvKiBVKzBEOEMgU0lOSEFMQSBVVVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfcmkgICAgICAgICAgICAweDEwMDBkOGQgIC8qIFUrMEQ4RCBTSU5IQUxBIElSVVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfcmlpICAgICAgICAgICAweDEwMDBkOGUgIC8qIFUrMEQ4RSBTSU5IQUxBIElSVVVZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2x1ICAgICAgICAgICAgMHgxMDAwZDhmICAvKiBVKzBEOEYgU0lOSEFMQSBJTFVZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2x1dSAgICAgICAgICAgMHgxMDAwZDkwICAvKiBVKzBEOTAgU0lOSEFMQSBJTFVVWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9lICAgICAgICAgICAgIDB4MTAwMGQ5MSAgLyogVSswRDkxIFNJTkhBTEEgRVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfZWUgICAgICAgICAgICAweDEwMDBkOTIgIC8qIFUrMEQ5MiBTSU5IQUxBIEVFWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9haSAgICAgICAgICAgIDB4MTAwMGQ5MyAgLyogVSswRDkzIFNJTkhBTEEgQUlZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX28gICAgICAgICAgICAgMHgxMDAwZDk0ICAvKiBVKzBEOTQgU0lOSEFMQSBPWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9vbyAgICAgICAgICAgIDB4MTAwMGQ5NSAgLyogVSswRDk1IFNJTkhBTEEgT09ZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2F1ICAgICAgICAgICAgMHgxMDAwZDk2ICAvKiBVKzBEOTYgU0lOSEFMQSBBVVlBTk5BICovCisjZGVmaW5lIFhLX1Npbmhfa2EgICAgICAgICAgICAweDEwMDBkOWEgIC8qIFUrMEQ5QSBTSU5IQUxBIEtBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9raGEgICAgICAgICAgIDB4MTAwMGQ5YiAgLyogVSswRDlCIFNJTkhBTEEgTUFIQS4gS0FZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2dhICAgICAgICAgICAgMHgxMDAwZDljICAvKiBVKzBEOUMgU0lOSEFMQSBHQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfZ2hhICAgICAgICAgICAweDEwMDBkOWQgIC8qIFUrMEQ5RCBTSU5IQUxBIE1BSEEuIEdBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9uZzIgICAgICAgICAgIDB4MTAwMGQ5ZSAgLyogVSswRDlFIFNJTkhBTEEgS0FOVEFKQSBOQUFTSUtZQVlBICovCisjZGVmaW5lIFhLX1NpbmhfbmdhICAgICAgICAgICAweDEwMDBkOWYgIC8qIFUrMEQ5RiBTSU5IQUxBIFNBTllBS0EgR0FZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2NhICAgICAgICAgICAgMHgxMDAwZGEwICAvKiBVKzBEQTAgU0lOSEFMQSBDQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfY2hhICAgICAgICAgICAweDEwMDBkYTEgIC8qIFUrMERBMSBTSU5IQUxBIE1BSEEuIENBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9qYSAgICAgICAgICAgIDB4MTAwMGRhMiAgLyogVSswREEyIFNJTkhBTEEgSkFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2poYSAgICAgICAgICAgMHgxMDAwZGEzICAvKiBVKzBEQTMgU0lOSEFMQSBNQUhBLiBKQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfbnlhICAgICAgICAgICAweDEwMDBkYTQgIC8qIFUrMERBNCBTSU5IQUxBIFRBQUxVSkEgTkFBU0lLWUFZQSAqLworI2RlZmluZSBYS19TaW5oX2pueWEgICAgICAgICAgMHgxMDAwZGE1ICAvKiBVKzBEQTUgU0lOSEFMQSBUQUFMVUpBIFNBTllPT0dBIE5BQVNJS1lBWUEgKi8KKyNkZWZpbmUgWEtfU2luaF9uamEgICAgICAgICAgIDB4MTAwMGRhNiAgLyogVSswREE2IFNJTkhBTEEgU0FOWUFLQSBKQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfdHRhICAgICAgICAgICAweDEwMDBkYTcgIC8qIFUrMERBNyBTSU5IQUxBIFRUQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfdHRoYSAgICAgICAgICAweDEwMDBkYTggIC8qIFUrMERBOCBTSU5IQUxBIE1BSEEuIFRUQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfZGRhICAgICAgICAgICAweDEwMDBkYTkgIC8qIFUrMERBOSBTSU5IQUxBIEREQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfZGRoYSAgICAgICAgICAweDEwMDBkYWEgIC8qIFUrMERBQSBTSU5IQUxBIE1BSEEuIEREQVlBTk5BICovCisjZGVmaW5lIFhLX1Npbmhfbm5hICAgICAgICAgICAweDEwMDBkYWIgIC8qIFUrMERBQiBTSU5IQUxBIE1VVVJESEFKQSBOQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfbmRkYSAgICAgICAgICAweDEwMDBkYWMgIC8qIFUrMERBQyBTSU5IQUxBIFNBTllBS0EgRERBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF90aGEgICAgICAgICAgIDB4MTAwMGRhZCAgLyogVSswREFEIFNJTkhBTEEgVEFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX3RoaGEgICAgICAgICAgMHgxMDAwZGFlICAvKiBVKzBEQUUgU0lOSEFMQSBNQUhBLiBUQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfZGhhICAgICAgICAgICAweDEwMDBkYWYgIC8qIFUrMERBRiBTSU5IQUxBIERBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9kaGhhICAgICAgICAgIDB4MTAwMGRiMCAgLyogVSswREIwIFNJTkhBTEEgTUFIQS4gREFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX25hICAgICAgICAgICAgMHgxMDAwZGIxICAvKiBVKzBEQjEgU0lOSEFMQSBEQU5UQUpBIE5BWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9uZGhhICAgICAgICAgIDB4MTAwMGRiMyAgLyogVSswREIzIFNJTkhBTEEgU0FOWUFLQSBEQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfcGEgICAgICAgICAgICAweDEwMDBkYjQgIC8qIFUrMERCNCBTSU5IQUxBIFBBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9waGEgICAgICAgICAgIDB4MTAwMGRiNSAgLyogVSswREI1IFNJTkhBTEEgTUFIQS4gUEFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2JhICAgICAgICAgICAgMHgxMDAwZGI2ICAvKiBVKzBEQjYgU0lOSEFMQSBCQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfYmhhICAgICAgICAgICAweDEwMDBkYjcgIC8qIFUrMERCNyBTSU5IQUxBIE1BSEEuIEJBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9tYSAgICAgICAgICAgIDB4MTAwMGRiOCAgLyogVSswREI4IFNJTkhBTEEgTUFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX21iYSAgICAgICAgICAgMHgxMDAwZGI5ICAvKiBVKzBEQjkgU0lOSEFMQSBBTUJBIEJBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF95YSAgICAgICAgICAgIDB4MTAwMGRiYSAgLyogVSswREJBIFNJTkhBTEEgWUFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX3JhICAgICAgICAgICAgMHgxMDAwZGJiICAvKiBVKzBEQkIgU0lOSEFMQSBSQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfbGEgICAgICAgICAgICAweDEwMDBkYmQgIC8qIFUrMERCRCBTSU5IQUxBIERBTlRBSkEgTEFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX3ZhICAgICAgICAgICAgMHgxMDAwZGMwICAvKiBVKzBEQzAgU0lOSEFMQSBWQVlBTk5BICovCisjZGVmaW5lIFhLX1Npbmhfc2hhICAgICAgICAgICAweDEwMDBkYzEgIC8qIFUrMERDMSBTSU5IQUxBIFRBQUxVSkEgU0FZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX3NzaGEgICAgICAgICAgMHgxMDAwZGMyICAvKiBVKzBEQzIgU0lOSEFMQSBNVVVSREhBSkEgU0FZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX3NhICAgICAgICAgICAgMHgxMDAwZGMzICAvKiBVKzBEQzMgU0lOSEFMQSBEQU5UQUpBIFNBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9oYSAgICAgICAgICAgIDB4MTAwMGRjNCAgLyogVSswREM0IFNJTkhBTEEgSEFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2xsYSAgICAgICAgICAgMHgxMDAwZGM1ICAvKiBVKzBEQzUgU0lOSEFMQSBNVVVSREhBSkEgTEFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2ZhICAgICAgICAgICAgMHgxMDAwZGM2ICAvKiBVKzBEQzYgU0lOSEFMQSBGQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfYWwgICAgICAgICAgICAweDEwMDBkY2EgIC8qIFUrMERDQSBTSU5IQUxBIEFMLUxBS1VOQSAqLworI2RlZmluZSBYS19TaW5oX2FhMiAgICAgICAgICAgMHgxMDAwZGNmICAvKiBVKzBEQ0YgU0lOSEFMQSBBRUxBLVBJTExBICovCisjZGVmaW5lIFhLX1NpbmhfYWUyICAgICAgICAgICAweDEwMDBkZDAgIC8qIFUrMEREMCBTSU5IQUxBIEFFREEtUElMTEEgKi8KKyNkZWZpbmUgWEtfU2luaF9hZWUyICAgICAgICAgIDB4MTAwMGRkMSAgLyogVSswREQxIFNJTkhBTEEgRElHQSBBRURBLVBJTExBICovCisjZGVmaW5lIFhLX1NpbmhfaTIgICAgICAgICAgICAweDEwMDBkZDIgIC8qIFUrMEREMiBTSU5IQUxBIElTLVBJTExBICovCisjZGVmaW5lIFhLX1NpbmhfaWkyICAgICAgICAgICAweDEwMDBkZDMgIC8qIFUrMEREMyBTSU5IQUxBIERJR0EgSVMtUElMTEEgKi8KKyNkZWZpbmUgWEtfU2luaF91MiAgICAgICAgICAgIDB4MTAwMGRkNCAgLyogVSswREQ0IFNJTkhBTEEgUEFBLVBJTExBICovCisjZGVmaW5lIFhLX1NpbmhfdXUyICAgICAgICAgICAweDEwMDBkZDYgIC8qIFUrMERENiBTSU5IQUxBIERJR0EgUEFBLVBJTExBICovCisjZGVmaW5lIFhLX1NpbmhfcnUyICAgICAgICAgICAweDEwMDBkZDggIC8qIFUrMEREOCBTSU5IQUxBIEdBRVRUQS1QSUxMQSAqLworI2RlZmluZSBYS19TaW5oX2UyICAgICAgICAgICAgMHgxMDAwZGQ5ICAvKiBVKzBERDkgU0lOSEFMQSBLT01CVVZBICovCisjZGVmaW5lIFhLX1NpbmhfZWUyICAgICAgICAgICAweDEwMDBkZGEgIC8qIFUrMEREQSBTSU5IQUxBIERJR0EgS09NQlVWQSAqLworI2RlZmluZSBYS19TaW5oX2FpMiAgICAgICAgICAgMHgxMDAwZGRiICAvKiBVKzBEREIgU0lOSEFMQSBLT01CVSBERUtBICovCisjZGVmaW5lIFhLX1NpbmhfbzIgICAgICAgICAgICAweDEwMDBkZGMgIC8qIFUrMEREQyBTSU5IQUxBIEtPTUJVVkEgSEFBIEFFTEEtUElMTEEqLworI2RlZmluZSBYS19TaW5oX29vMiAgICAgICAgICAgMHgxMDAwZGRkICAvKiBVKzBEREQgU0lOSEFMQSBLT01CVVZBIEhBQSBESUdBIEFFTEEtUElMTEEqLworI2RlZmluZSBYS19TaW5oX2F1MiAgICAgICAgICAgMHgxMDAwZGRlICAvKiBVKzBEREUgU0lOSEFMQSBLT01CVVZBIEhBQSBHQVlBTlVLSVRUQSAqLworI2RlZmluZSBYS19TaW5oX2x1MiAgICAgICAgICAgMHgxMDAwZGRmICAvKiBVKzBEREYgU0lOSEFMQSBHQVlBTlVLSVRUQSAqLworI2RlZmluZSBYS19TaW5oX3J1dTIgICAgICAgICAgMHgxMDAwZGYyICAvKiBVKzBERjIgU0lOSEFMQSBESUdBIEdBRVRUQS1QSUxMQSAqLworI2RlZmluZSBYS19TaW5oX2x1dTIgICAgICAgICAgMHgxMDAwZGYzICAvKiBVKzBERjMgU0lOSEFMQSBESUdBIEdBWUFOVUtJVFRBICovCisjZGVmaW5lIFhLX1Npbmhfa3VuZGRhbGl5YSAgICAweDEwMDBkZjQgIC8qIFUrMERGNCBTSU5IQUxBIEtVTkREQUxJWUEgKi8KKyNlbmRpZiAvKiBYS19TSU5IQUxBICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL19HX2NvbmZpZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9fR19jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTFkMDIyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9fR19jb25maWcuaApAQCAtMCwwICsxLDEwMSBAQAorLyogVGhpcyBmaWxlIGlzIG5lZWRlZCBieSBsaWJpbyB0byBkZWZpbmUgdmFyaW91cyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisgICBUaGVzZSBhcmUgYWx3YXlzIHRoZSBzYW1lIGluIHRoZSBHTlUgQyBsaWJyYXJ5LiAgKi8KKworI2lmbmRlZiBfR19jb25maWdfaAorI2RlZmluZSBfR19jb25maWdfaCAxCisKKy8qIERlZmluZSB0eXBlcyBmb3IgbGliaW8gaW4gdGVybXMgb2YgdGhlIHN0YW5kYXJkIGludGVybmFsIHR5cGUgbmFtZXMuICAqLworCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorI2RlZmluZSBfX25lZWRfc2l6ZV90CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9HTElCQ1BQX1VTRV9XQ0hBUl9UCisjIGRlZmluZSBfX25lZWRfd2NoYXJfdAorI2VuZGlmCisjZGVmaW5lIF9fbmVlZF9OVUxMCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZGVmaW5lIF9fbmVlZF9tYnN0YXRlX3QKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgX0dMSUJDUFBfVVNFX1dDSEFSX1QKKyMgZGVmaW5lIF9fbmVlZF93aW50X3QKKyNlbmRpZgorI2luY2x1ZGUgPHdjaGFyLmg+CisjZGVmaW5lIF9HX3NpemVfdAlzaXplX3QKK3R5cGVkZWYgc3RydWN0Cit7CisgIF9fb2ZmX3QgX19wb3M7CisgIF9fbWJzdGF0ZV90IF9fc3RhdGU7Cit9IF9HX2Zwb3NfdDsKK3R5cGVkZWYgc3RydWN0Cit7CisgIF9fb2ZmNjRfdCBfX3BvczsKKyAgX19tYnN0YXRlX3QgX19zdGF0ZTsKK30gX0dfZnBvczY0X3Q7CisjZGVmaW5lIF9HX3NzaXplX3QJX19zc2l6ZV90CisjZGVmaW5lIF9HX29mZl90CV9fb2ZmX3QKKyNkZWZpbmUgX0dfb2ZmNjRfdAlfX29mZjY0X3QKKyNkZWZpbmUJX0dfcGlkX3QJX19waWRfdAorI2RlZmluZQlfR191aWRfdAlfX3VpZF90CisjZGVmaW5lIF9HX3djaGFyX3QJd2NoYXJfdAorI2RlZmluZSBfR193aW50X3QJd2ludF90CisjZGVmaW5lIF9HX3N0YXQ2NAlzdGF0NjQKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgX0dMSUJDUFBfVVNFX1dDSEFSX1QKKyMgaW5jbHVkZSA8Z2NvbnYuaD4KK3R5cGVkZWYgdW5pb24KK3sKKyAgc3RydWN0IF9fZ2NvbnZfaW5mbyBfX2NkOworICBzdHJ1Y3QKKyAgeworICAgIHN0cnVjdCBfX2djb252X2luZm8gX19jZDsKKyAgICBzdHJ1Y3QgX19nY29udl9zdGVwX2RhdGEgX19kYXRhOworICB9IF9fY29tYmluZWQ7Cit9IF9HX2ljb252X3Q7CisjZW5kaWYKKwordHlwZWRlZiBpbnQgX0dfaW50MTZfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fSElfXykpKTsKK3R5cGVkZWYgaW50IF9HX2ludDMyX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX1NJX18pKSk7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfR191aW50MTZfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fSElfXykpKTsKK3R5cGVkZWYgdW5zaWduZWQgaW50IF9HX3VpbnQzMl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19TSV9fKSkpOworCisjZGVmaW5lIF9HX0hBVkVfQk9PTCAxCisKKworLyogVGhlc2UgbGlicmFyeSBmZWF0dXJlcyBhcmUgYWx3YXlzIGF2YWlsYWJsZSBpbiB0aGUgR05VIEMgbGlicmFyeS4gICovCisjZGVmaW5lIF9HX0hBVkVfQVRFWElUIDEKKyNkZWZpbmUgX0dfSEFWRV9TWVNfQ0RFRlMgMQorI2RlZmluZSBfR19IQVZFX1NZU19XQUlUIDEKKyNkZWZpbmUgX0dfTkVFRF9TVERBUkdfSCAxCisjZGVmaW5lIF9HX3ZhX2xpc3QgX19nbnVjX3ZhX2xpc3QKKworI2RlZmluZSBfR19IQVZFX1BSSU5URl9GUCAxCisjZGVmaW5lIF9HX0hBVkVfTU1BUCAxCisjZGVmaW5lIF9HX0hBVkVfTVJFTUFQIDEKKyNkZWZpbmUgX0dfSEFWRV9MT05HX0RPVUJMRV9JTyAxCisjZGVmaW5lIF9HX0hBVkVfSU9fRklMRV9PUEVOIDEKKyNkZWZpbmUgX0dfSEFWRV9JT19HRVRMSU5FX0lORk8gMQorCisjZGVmaW5lIF9HX0lPX0lPX0ZJTEVfVkVSU0lPTiAweDIwMDAxCisKKyNkZWZpbmUgX0dfT1BFTjY0CV9fb3BlbjY0CisjZGVmaW5lIF9HX0xTRUVLNjQJX19sc2VlazY0CisjZGVmaW5lIF9HX01NQVA2NAlfX21tYXA2NAorI2RlZmluZSBfR19GU1RBVDY0KGZkLGJ1ZikgX19meHN0YXQ2NCAoX1NUQVRfVkVSLCBmZCwgYnVmKQorCisvKiBUaGlzIGlzIGRlZmluZWQgYnkgPGJpdHMvc3RhdC5oPiBpZiBgc3RfYmxrc2l6ZScgZXhpc3RzLiAgKi8KKyNkZWZpbmUgX0dfSEFWRV9TVF9CTEtTSVpFIGRlZmluZWQgKF9TVEFUQlVGX1NUX0JMS1NJWkUpCisKKyNkZWZpbmUgX0dfQlVGU0laIDgxOTIKKworLyogVGhlc2UgYXJlIHRoZSB2dGJsIGRldGFpbHMgZm9yIEVMRi4gICovCisjZGVmaW5lIF9HX05BTUVTX0hBVkVfVU5ERVJTQ09SRSAwCisjZGVmaW5lIF9HX1ZUQUJMRV9MQUJFTF9IQVNfTEVOR1RIIDEKKyNkZWZpbmUgX0dfVVNJTkdfVEhVTktTCTEKKyNkZWZpbmUgX0dfVlRBQkxFX0xBQkVMX1BSRUZJWCAiX192dF8iCisjZGVmaW5lIF9HX1ZUQUJMRV9MQUJFTF9QUkVGSVhfSUQgX192dF8KKworCisjaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9fU1REQ19fCisjIGRlZmluZSBfR19BUkdTKEFSR0xJU1QpIEFSR0xJU1QKKyNlbHNlCisjIGRlZmluZSBfR19BUkdTKEFSR0xJU1QpICgpCisjZW5kaWYKKworI2VuZGlmCS8qIF9HX2NvbmZpZy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Eub3V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Eub3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1MTRjOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYS5vdXQuaApAQCAtMCwwICsxLDEzOCBAQAorI2lmbmRlZiBfX0FfT1VUX0dOVV9IX18KKyNkZWZpbmUgX19BX09VVF9HTlVfSF9fCisKKyNpbmNsdWRlIDxiaXRzL2Eub3V0Lmg+CisKKyNkZWZpbmUgX19HTlVfRVhFQ19NQUNST1NfXworCitzdHJ1Y3QgZXhlYworeworICB1bnNpZ25lZCBsb25nIGFfaW5mbzsJLyogVXNlIG1hY3JvcyBOX01BR0lDLCBldGMgZm9yIGFjY2Vzcy4gICovCisgIHVuc2lnbmVkIGludCBhX3RleHQ7CS8qIExlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcy4gICovCisgIHVuc2lnbmVkIGludCBhX2RhdGE7CS8qIExlbmd0aCBvZiBkYXRhLCBpbiBieXRlcy4gICovCisgIHVuc2lnbmVkIGludCBhX2JzczsJLyogTGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGZvciBmaWxlLCBpbiBieXRlcy4gICovCisgIHVuc2lnbmVkIGludCBhX3N5bXM7CS8qIExlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcy4gICovCisgIHVuc2lnbmVkIGludCBhX2VudHJ5OwkvKiBTdGFydCBhZGRyZXNzLiAgKi8KKyAgdW5zaWduZWQgaW50IGFfdHJzaXplOy8qIExlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzLiAgKi8KKyAgdW5zaWduZWQgaW50IGFfZHJzaXplOy8qIExlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzLiAgKi8KK307CisKK2VudW0gbWFjaGluZV90eXBlCit7CisgIE1fT0xEU1VOMiA9IDAsCisgIE1fNjgwMTAgPSAxLAorICBNXzY4MDIwID0gMiwKKyAgTV9TUEFSQyA9IDMsCisgIE1fMzg2ID0gMTAwLAorICBNX01JUFMxID0gMTUxLAorICBNX01JUFMyID0gMTUyCit9OworCisjZGVmaW5lIE5fTUFHSUMoZXhlYykJKChleGVjKS5hX2luZm8gJiAweGZmZmYpCisjZGVmaW5lIE5fTUFDSFRZUEUoZXhlYykgKChlbnVtIG1hY2hpbmVfdHlwZSkoKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHhmZikpCisjZGVmaW5lIE5fRkxBR1MoZXhlYykJKCgoZXhlYykuYV9pbmZvID4+IDI0KSAmIDB4ZmYpCisjZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCisgICgoZXhlYykuYV9pbmZvID0gKChtYWdpYykgJiAweGZmZmYpCQkJCQlcCisgICB8ICgoKGludCkodHlwZSkgJiAweGZmKSA8PCAxNikJCQkJCVwKKyAgIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQorI2RlZmluZSBOX1NFVF9NQUdJQyhleGVjLCBtYWdpYykgXAorICAoKGV4ZWMpLmFfaW5mbyA9ICgoZXhlYykuYV9pbmZvICYgMHhmZmZmMDAwMCkgfCAoKG1hZ2ljKSAmIDB4ZmZmZikpCisjZGVmaW5lIE5fU0VUX01BQ0hUWVBFKGV4ZWMsIG1hY2h0eXBlKSBcCisgICgoZXhlYykuYV9pbmZvID0JCQkJCQkJXAorICAgKChleGVjKS5hX2luZm8mMHhmZjAwZmZmZikgfCAoKCgoaW50KShtYWNodHlwZSkpJjB4ZmYpIDw8IDE2KSkKKyNkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKKyAgKChleGVjKS5hX2luZm8gPQkJCQkJCQlcCisgICAoKGV4ZWMpLmFfaW5mbyYweDAwZmZmZmZmKSB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKKworLyogQ29kZSBpbmRpY2F0aW5nIG9iamVjdCBmaWxlIG9yIGltcHVyZSBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgT01BR0lDIDA0MDcKKy8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAqLworI2RlZmluZSBOTUFHSUMgMDQxMAorLyogQ29kZSBpbmRpY2F0aW5nIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgWk1BR0lDIDA0MTMKKy8qIFRoaXMgaW5kaWNhdGVzIGEgZGVtYW5kLXBhZ2VkIGV4ZWN1dGFibGUgd2l0aCB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAKKyAgIFRoZSBmaXJzdCBwYWdlIGlzIHVubWFwcGVkIHRvIGhlbHAgdHJhcCBOVUxMIHBvaW50ZXIgcmVmZXJlbmNlcy4gICovCisjZGVmaW5lIFFNQUdJQyAwMzE0CisvKiBDb2RlIGluZGljYXRpbmcgY29yZSBmaWxlLiAgKi8KKyNkZWZpbmUgQ01BR0lDIDA0MjEKKworI2RlZmluZSBOX1RSU0laRShhKQkoKGEpLmFfdHJzaXplKQorI2RlZmluZSBOX0RSU0laRShhKQkoKGEpLmFfZHJzaXplKQorI2RlZmluZSBOX1NZTVNJWkUoYSkJKChhKS5hX3N5bXMpCisjZGVmaW5lIE5fQkFETUFHKHgpIFwKKyAgKE5fTUFHSUMoeCkgIT0gT01BR0lDCSYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQkJCVwKKyAgICYmIE5fTUFHSUMoeCkgIT0gWk1BR0lDICYmIE5fTUFHSUMoeCkgIT0gUU1BR0lDKQorI2RlZmluZSBfTl9IRFJPRkYoeCkJKDEwMjQgLSBzaXplb2YgKHN0cnVjdCBleGVjKSkKKyNkZWZpbmUgTl9UWFRPRkYoeCkgXAorICAoTl9NQUdJQyh4KSA9PSBaTUFHSUMgPyBfTl9IRFJPRkYoKHgpKSArIHNpemVvZiAoc3RydWN0IGV4ZWMpIDoJXAorICAgKE5fTUFHSUMoeCkgPT0gUU1BR0lDID8gMCA6IHNpemVvZiAoc3RydWN0IGV4ZWMpKSkKKyNkZWZpbmUgTl9EQVRPRkYoeCkJKE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCkKKyNkZWZpbmUgTl9UUkVMT0ZGKHgpCShOX0RBVE9GRih4KSArICh4KS5hX2RhdGEpCisjZGVmaW5lIE5fRFJFTE9GRih4KQkoTl9UUkVMT0ZGKHgpICsgTl9UUlNJWkUoeCkpCisjZGVmaW5lIE5fU1lNT0ZGKHgpCShOX0RSRUxPRkYoeCkgKyBOX0RSU0laRSh4KSkKKyNkZWZpbmUgTl9TVFJPRkYoeCkJKE5fU1lNT0ZGKHgpICsgTl9TWU1TSVpFKHgpKQorCisvKiBBZGRyZXNzIG9mIHRleHQgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KKyNkZWZpbmUgTl9UWFRBRERSKHgpCShOX01BR0lDKHgpID09IFFNQUdJQyA/IDQwOTYgOiAwKQorCisvKiBBZGRyZXNzIG9mIGRhdGEgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KKyNkZWZpbmUgU0VHTUVOVF9TSVpFCTEwMjQKKworI2RlZmluZSBfTl9TRUdNRU5UX1JPVU5EKHgpICgoKHgpICsgU0VHTUVOVF9TSVpFIC0gMSkgJiB+KFNFR01FTlRfU0laRSAtIDEpKQorI2RlZmluZSBfTl9UWFRFTkRBRERSKHgpIChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dCkKKworI2RlZmluZSBOX0RBVEFERFIoeCkgXAorICAoTl9NQUdJQyh4KT09T01BR0lDPyAoX05fVFhURU5EQUREUih4KSkJCQkJXAorICAgOiAoX05fU0VHTUVOVF9ST1VORCAoX05fVFhURU5EQUREUih4KSkpKQorI2RlZmluZSBOX0JTU0FERFIoeCkgKE5fREFUQUREUih4KSArICh4KS5hX2RhdGEpCisKKyNpZiAhZGVmaW5lZCAoTl9OTElTVF9ERUNMQVJFRCkKK3N0cnVjdCBubGlzdAoreworICB1bmlvbgorICAgIHsKKyAgICAgIGNoYXIgKm5fbmFtZTsKKyAgICAgIHN0cnVjdCBubGlzdCAqbl9uZXh0OworICAgICAgbG9uZyBuX3N0cng7CisgICAgfSBuX3VuOworICB1bnNpZ25lZCBjaGFyIG5fdHlwZTsKKyAgY2hhciBuX290aGVyOworICBzaG9ydCBuX2Rlc2M7CisgIHVuc2lnbmVkIGxvbmcgbl92YWx1ZTsKK307CisjZW5kaWYgLyogbm8gTl9OTElTVF9ERUNMQVJFRC4gICovCisKKyNkZWZpbmUgTl9VTkRGCTAKKyNkZWZpbmUgTl9BQlMJMgorI2RlZmluZSBOX1RFWFQJNAorI2RlZmluZSBOX0RBVEEJNgorI2RlZmluZSBOX0JTUwk4CisjZGVmaW5lIE5fRk4JMTUKKyNkZWZpbmUgTl9FWFQJMQorI2RlZmluZSBOX1RZUEUJMDM2CisjZGVmaW5lIE5fU1RBQgkwMzQwCisjZGVmaW5lIE5fSU5EUgkweGEKKyNkZWZpbmUJTl9TRVRBCTB4MTQJLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sLiAgKi8KKyNkZWZpbmUJTl9TRVRUCTB4MTYJLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wuICAqLworI2RlZmluZQlOX1NFVEQJMHgxOAkvKiBEYXRhIHNldCBlbGVtZW50IHN5bWJvbC4gICovCisjZGVmaW5lCU5fU0VUQgkweDFBCS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wuICAqLworI2RlZmluZSBOX1NFVFYJMHgxQwkvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAgKi8KKworI2lmICFkZWZpbmVkIChOX1JFTE9DQVRJT05fSU5GT19ERUNMQVJFRCkKKy8qIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIHNpbmdsZSByZWxvY2F0aW9uIHRvIGJlIHBlcmZvcm1lZC4KKyAgIFRoZSB0ZXh0LXJlbG9jYXRpb24gc2VjdGlvbiBvZiB0aGUgZmlsZSBpcyBhIHZlY3RvciBvZiB0aGVzZSBzdHJ1Y3R1cmVzLAorICAgYWxsIG9mIHdoaWNoIGFwcGx5IHRvIHRoZSB0ZXh0IHNlY3Rpb24uCisgICBMaWtld2lzZSwgdGhlIGRhdGEtcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gdGhlIGRhdGEgc2VjdGlvbi4gICovCisKK3N0cnVjdCByZWxvY2F0aW9uX2luZm8KK3sKKyAgaW50IHJfYWRkcmVzczsKKyAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OworICB1bnNpZ25lZCBpbnQgcl9wY3JlbDoxOworICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg6MjsKKyAgdW5zaWduZWQgaW50IHJfZXh0ZXJuOjE7CisgIHVuc2lnbmVkIGludCByX3BhZDo0OworfTsKKyNlbmRpZiAvKiBubyBOX1JFTE9DQVRJT05fSU5GT19ERUNMQVJFRC4gICovCisKKyNlbmRpZiAvKiBfX0FfT1VUX0dOVV9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWNsL2xpYmFjbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hY2wvbGliYWNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhNjY1MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWNsL2xpYmFjbC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgIEZpbGU6IGxpYmFjbC5oCisKKyAgKEMpIDE5OTksIDIwMDAgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyovCisKKyNpZm5kZWYgX19BQ0xfTElCQUNMX0gKKyNkZWZpbmUgX19BQ0xfTElCQUNMX0gKKworI2luY2x1ZGUgPHN5cy9hY2wuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBGbGFncyBmb3IgYWNsX3RvX2FueV90ZXh0KCkgKi8KKworLyogUHJpbnQgTk8sIFNPTUUgb3IgQUxMIGVmZmVjdGl2ZSBwZXJtaXNzaW9ucyBjb21tZW50cy4gU09NRSBwcmludHMKKyAgIGVmZmVjdGl2ZSByaWdodHMgY29tbWVudHMgZm9yIGVudHJpZXMgd2hpY2ggaGF2ZSBkaWZmZXJlbnQgcGVybWlzc2lvbnMKKyAgIHRoYW4gZWZmZWN0aXZlIHBlcm1pc3Npb25zLiAgKi8KKyNkZWZpbmUgVEVYVF9TT01FX0VGRkVDVElWRQkJMHgwMQorI2RlZmluZSBURVhUX0FMTF9FRkZFQ1RJVkUJCTB4MDIKKworLyogQWxpZ24gZWZmZWN0aXZlIHBlcm1pc3Npb24gY29tbWVudHMgdG8gY29sdW1uIDMyIHVzaW5nIHRhYnMgb3IKKyAgIHVzZSBhIHNpbmdsZSB0YWIuICovCisjZGVmaW5lIFRFWFRfU01BUlRfSU5ERU5UCQkweDA0CisKKy8qIFVzZXIgYW5kIGdyb3VwIElEcyBpbnN0ZWFkIG9mIG5hbWVzLiAqLworI2RlZmluZSBURVhUX05VTUVSSUNfSURTCQkweDA4CisKKy8qIE9ubHkgb3V0cHV0IHRoZSBmaXJzdCBsZXR0ZXIgb2YgZW50cnkgdHlwZXMKKyAgICgidTo6cnd4IiBpbnN0ZWFkIG9mICJ1c2VyOjpyd3giKS4gKi8KKyNkZWZpbmUgVEVYVF9BQkJSRVZJQVRFCQkJMHgxMAorCisvKiBhY2xfY2hlY2sgZXJyb3IgY29kZXMgKi8KKworI2RlZmluZSBBQ0xfTVVMVElfRVJST1IJCSgweDEwMDApICAgICAvKiBtdWx0aXBsZSB1bmlxdWUgb2JqZWN0cyAqLworI2RlZmluZSBBQ0xfRFVQTElDQVRFX0VSUk9SCSgweDIwMDApICAgICAvKiBkdXBsaWNhdGUgSWQncyBpbiBlbnRyaWVzICovCisjZGVmaW5lIEFDTF9NSVNTX0VSUk9SCQkoMHgzMDAwKSAgICAgLyogbWlzc2luZyByZXF1aXJlZCBlbnRyeSAqLworI2RlZmluZSBBQ0xfRU5UUllfRVJST1IJCSgweDQwMDApICAgICAvKiB3cm9uZyBlbnRyeSB0eXBlICovCisKK2V4dGVybiBjaGFyICphY2xfdG9fYW55X3RleHQoYWNsX3QgYWNsLCBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkgICAgIGNoYXIgc2VwYXJhdG9yLCBpbnQgb3B0aW9ucyk7CitleHRlcm4gaW50IGFjbF9jbXAoYWNsX3QgYWNsMSwgYWNsX3QgYWNsMik7CitleHRlcm4gaW50IGFjbF9jaGVjayhhY2xfdCBhY2wsIGludCAqbGFzdCk7CitleHRlcm4gYWNsX3QgYWNsX2Zyb21fbW9kZShtb2RlX3QgbW9kZSk7CitleHRlcm4gaW50IGFjbF9lcXVpdl9tb2RlKGFjbF90IGFjbCwgbW9kZV90ICptb2RlX3ApOworaW50IGFjbF9leHRlbmRlZF9maWxlKGNvbnN0IGNoYXIgKnBhdGhfcCk7CitpbnQgYWNsX2V4dGVuZGVkX2ZpbGVfbm9mb2xsb3coY29uc3QgY2hhciAqcGF0aF9wKTsKK2ludCBhY2xfZXh0ZW5kZWRfZmQoaW50IGZkKTsKK2V4dGVybiBpbnQgYWNsX2VudHJpZXMoYWNsX3QgYWNsKTsKK2V4dGVybiBjb25zdCBjaGFyICphY2xfZXJyb3IoaW50IGNvZGUpOworZXh0ZXJuIGludCBhY2xfZ2V0X3Blcm0oYWNsX3Blcm1zZXRfdCBwZXJtc2V0X2QsIGFjbF9wZXJtX3QgcGVybSk7CisKKy8qIENvcHlpbmcgcGVybWlzc2lvbnMgYmV0d2VlbiBmaWxlcyAqLworc3RydWN0IGVycm9yX2NvbnRleHQ7CitleHRlcm4gaW50IHBlcm1fY29weV9maWxlIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKKwkJCSAgICBzdHJ1Y3QgZXJyb3JfY29udGV4dCAqKTsKK2V4dGVybiBpbnQgcGVybV9jb3B5X2ZkIChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqLCBpbnQsCisJCQkgIHN0cnVjdCBlcnJvcl9jb250ZXh0ICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qIF9fQUNMX0xJQkFDTF9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWZfdmZzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FmX3Zmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDI4N2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FmX3Zmcy5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisJQXVkaW8gRmlsZSBMaWJyYXJ5CisJQ29weXJpZ2h0IChDKSAxOTk5LCBFbGxpb3QgTGVlIDxzb3B3aXRoQHJlZGhhdC5jb20+CisKKwlUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKwlMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKwl2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKwlUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKwlidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisJTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisJQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBLgorKi8KKworLyoKKwlhZl92ZnMuaAorCisJVmlydHVhbCBmaWxlIG9wZXJhdGlvbnMgZm9yIHRoZSBBdWRpbyBGaWxlIExpYnJhcnkuCisqLworCisjaWZuZGVmIEFVRElPRklMRV9WRlNfSAorI2RlZmluZSBBVURJT0ZJTEVfVkZTX0ggMQorCisjaW5jbHVkZSA8YXVkaW9maWxlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IF9BRnZpcnR1YWxmaWxlCit7CisJc3NpemVfdCAoKnJlYWQpIChBRnZpcnR1YWxmaWxlICp2ZmlsZSwgdm9pZCAqZGF0YSwgc2l6ZV90IG5ieXRlcyk7CisJQUZmaWxlb2Zmc2V0ICgqbGVuZ3RoKSAoQUZ2aXJ0dWFsZmlsZSAqdmZpbGUpOworCXNzaXplX3QgKCp3cml0ZSkgKEFGdmlydHVhbGZpbGUgKnZmaWxlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbmJ5dGVzKTsKKwl2b2lkICgqZGVzdHJveSkgKEFGdmlydHVhbGZpbGUgKnZmaWxlKTsKKwlBRmZpbGVvZmZzZXQgKCpzZWVrKSAoQUZ2aXJ0dWFsZmlsZSAqdmZpbGUsIEFGZmlsZW9mZnNldCBvZmZzZXQsIGludCBpc19yZWxhdGl2ZSk7CisJQUZmaWxlb2Zmc2V0ICgqdGVsbCkgKEFGdmlydHVhbGZpbGUgKnZmaWxlKTsKKworCXZvaWQgKmNsb3N1cmU7Cit9OworCitBRnZpcnR1YWxmaWxlICphZl92aXJ0dWFsX2ZpbGVfbmV3ICh2b2lkKTsKK3ZvaWQgYWZfdmlydHVhbF9maWxlX2Rlc3Ryb3kgKEFGdmlydHVhbGZpbGUgKnZmaWxlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fpby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9haW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2ZkMGMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9haW8uaApAQCAtMCwwICsxLDI0NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDAsMjAwMywyMDA0LDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBJU08vSUVDIDk5NDUtMToxOTk2IDYuNzogQXN5bmNocm9ub3VzIElucHV0IGFuZCBPdXRwdXQKKyAqLworCisjaWZuZGVmIF9BSU9fSAorI2RlZmluZSBfQUlPX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBBc3luY2hyb25vdXMgSS9PIGNvbnRyb2wgYmxvY2suICAqLworc3RydWN0IGFpb2NiCit7CisgIGludCBhaW9fZmlsZGVzOwkJLyogRmlsZSBkZXNyaXB0b3IuICAqLworICBpbnQgYWlvX2xpb19vcGNvZGU7CQkvKiBPcGVyYXRpb24gdG8gYmUgcGVyZm9ybWVkLiAgKi8KKyAgaW50IGFpb19yZXFwcmlvOwkJLyogUmVxdWVzdCBwcmlvcml0eSBvZmZzZXQuICAqLworICB2b2xhdGlsZSB2b2lkICphaW9fYnVmOwkvKiBMb2NhdGlvbiBvZiBidWZmZXIuICAqLworICBzaXplX3QgYWlvX25ieXRlczsJCS8qIExlbmd0aCBvZiB0cmFuc2Zlci4gICovCisgIHN0cnVjdCBzaWdldmVudCBhaW9fc2lnZXZlbnQ7CS8qIFNpZ25hbCBudW1iZXIgYW5kIHZhbHVlLiAgKi8KKworICAvKiBJbnRlcm5hbCBtZW1iZXJzLiAgKi8KKyAgc3RydWN0IGFpb2NiICpfX25leHRfcHJpbzsKKyAgaW50IF9fYWJzX3ByaW87CisgIGludCBfX3BvbGljeTsKKyAgaW50IF9fZXJyb3JfY29kZTsKKyAgX19zc2l6ZV90IF9fcmV0dXJuX3ZhbHVlOworCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgX19vZmZfdCBhaW9fb2Zmc2V0OwkJLyogRmlsZSBvZmZzZXQuICAqLworICBjaGFyIF9fcGFkW3NpemVvZiAoX19vZmY2NF90KSAtIHNpemVvZiAoX19vZmZfdCldOworI2Vsc2UKKyAgX19vZmY2NF90IGFpb19vZmZzZXQ7CQkvKiBGaWxlIG9mZnNldC4gICovCisjZW5kaWYKKyAgY2hhciBfX3VudXNlZFszMl07Cit9OworCisvKiBUaGUgc2FtZSBmb3IgdGhlIDY0Yml0IG9mZnNldHMuICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBtZW1iZXJzIGFpb19maWxkZXMKKyAgIHRvIF9fcmV0dXJuX3ZhbHVlIGhhdmUgdG8gYmUgdGhlIHNhbWUgaW4gYWlvY2IgYW5kIGFpb2NiNjQuICAqLworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitzdHJ1Y3QgYWlvY2I2NAoreworICBpbnQgYWlvX2ZpbGRlczsJCS8qIEZpbGUgZGVzcmlwdG9yLiAgKi8KKyAgaW50IGFpb19saW9fb3Bjb2RlOwkJLyogT3BlcmF0aW9uIHRvIGJlIHBlcmZvcm1lZC4gICovCisgIGludCBhaW9fcmVxcHJpbzsJCS8qIFJlcXVlc3QgcHJpb3JpdHkgb2Zmc2V0LiAgKi8KKyAgdm9sYXRpbGUgdm9pZCAqYWlvX2J1ZjsJLyogTG9jYXRpb24gb2YgYnVmZmVyLiAgKi8KKyAgc2l6ZV90IGFpb19uYnl0ZXM7CQkvKiBMZW5ndGggb2YgdHJhbnNmZXIuICAqLworICBzdHJ1Y3Qgc2lnZXZlbnQgYWlvX3NpZ2V2ZW50OwkvKiBTaWduYWwgbnVtYmVyIGFuZCB2YWx1ZS4gICovCisKKyAgLyogSW50ZXJuYWwgbWVtYmVycy4gICovCisgIHN0cnVjdCBhaW9jYiAqX19uZXh0X3ByaW87CisgIGludCBfX2Fic19wcmlvOworICBpbnQgX19wb2xpY3k7CisgIGludCBfX2Vycm9yX2NvZGU7CisgIF9fc3NpemVfdCBfX3JldHVybl92YWx1ZTsKKworICBfX29mZjY0X3QgYWlvX29mZnNldDsJCS8qIEZpbGUgb2Zmc2V0LiAgKi8KKyAgY2hhciBfX3VudXNlZFszMl07Cit9OworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVG8gY3VzdG9taXplIHRoZSBpbXBsZW1lbnRhdGlvbiBvbmUgY2FuIHVzZSB0aGUgZm9sbG93aW5nIHN0cnVjdC4KKyAgIFRoaXMgaW1wbGVtZW50YXRpb24gZm9sbG93cyB0aGUgb25lIGluIElyaXguICAqLworc3RydWN0IGFpb2luaXQKKyAgeworICAgIGludCBhaW9fdGhyZWFkczsJCS8qIE1heGltYWwgbnVtYmVyIG9mIHRocmVhZHMuICAqLworICAgIGludCBhaW9fbnVtOwkJLyogTnVtYmVyIG9mIGV4cGVjdGVkIHNpbXVsdGFuaW91cyByZXF1ZXN0cy4gKi8KKyAgICBpbnQgYWlvX2xvY2tzOwkJLyogTm90IHVzZWQuICAqLworICAgIGludCBhaW9fdXNlZGJhOwkJLyogTm90IHVzZWQuICAqLworICAgIGludCBhaW9fZGVidWc7CQkvKiBOb3QgdXNlZC4gICovCisgICAgaW50IGFpb19udW11c2VyczsJCS8qIE5vdCB1c2VkLiAgKi8KKyAgICBpbnQgYWlvX2lkbGVfdGltZTsJCS8qIE51bWJlciBvZiBzZWNvbmRzIGJlZm9yZSBpZGxlIHRocmVhZAorCQkJCSAgIHRlcm1pbmF0ZXMuICAqLworICAgIGludCBhaW9fcmVzZXJ2ZWQ7CisgIH07CisjZW5kaWYKKworCisvKiBSZXR1cm4gdmFsdWVzIG9mIGNhbmNlbGF0aW9uIGZ1bmN0aW9uLiAgKi8KK2VudW0KK3sKKyAgQUlPX0NBTkNFTEVELAorI2RlZmluZSBBSU9fQ0FOQ0VMRUQgQUlPX0NBTkNFTEVECisgIEFJT19OT1RDQU5DRUxFRCwKKyNkZWZpbmUgQUlPX05PVENBTkNFTEVEIEFJT19OT1RDQU5DRUxFRAorICBBSU9fQUxMRE9ORQorI2RlZmluZSBBSU9fQUxMRE9ORSBBSU9fQUxMRE9ORQorfTsKKworCisvKiBPcGVyYXRpb24gY29kZXMgZm9yIGBhaW9fbGlvX29wY29kZScuICAqLworZW51bQoreworICBMSU9fUkVBRCwKKyNkZWZpbmUgTElPX1JFQUQgTElPX1JFQUQKKyAgTElPX1dSSVRFLAorI2RlZmluZSBMSU9fV1JJVEUgTElPX1dSSVRFCisgIExJT19OT1AKKyNkZWZpbmUgTElPX05PUCBMSU9fTk9QCit9OworCisKKy8qIFN5bmNocm9uaXphdGlvbiBvcHRpb25zIGZvciBgbGlvX2xpc3RpbycgZnVuY3Rpb24uICAqLworZW51bQoreworICBMSU9fV0FJVCwKKyNkZWZpbmUgTElPX1dBSVQgTElPX1dBSVQKKyAgTElPX05PV0FJVAorI2RlZmluZSBMSU9fTk9XQUlUIExJT19OT1dBSVQKK307CisKKworLyogQWxsb3cgdXNlciB0byBzcGVjaWZ5IG9wdGltaXphdGlvbi4gICovCisjaWZkZWYgX19VU0VfR05VCitleHRlcm4gdm9pZCBhaW9faW5pdCAoX19jb25zdCBzdHJ1Y3QgYWlvaW5pdCAqX19pbml0KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorLyogRW5xdWV1ZSByZWFkIHJlcXVlc3QgZm9yIGdpdmVuIG51bWJlciBvZiBieXRlcyBhbmQgdGhlIGdpdmVuIHByaW9yaXR5LiAgKi8KK2V4dGVybiBpbnQgYWlvX3JlYWQgKHN0cnVjdCBhaW9jYiAqX19haW9jYnApIF9fVEhST1cgX19ub25udWxsICgoMSkpOworLyogRW5xdWV1ZSB3cml0ZSByZXF1ZXN0IGZvciBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgYW5kIHRoZSBnaXZlbiBwcmlvcml0eS4gICovCitleHRlcm4gaW50IGFpb193cml0ZSAoc3RydWN0IGFpb2NiICpfX2Fpb2NicCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEluaXRpYXRlIGxpc3Qgb2YgSS9PIHJlcXVlc3RzLiAgKi8KK2V4dGVybiBpbnQgbGlvX2xpc3RpbyAoaW50IF9fbW9kZSwKKwkJICAgICAgIHN0cnVjdCBhaW9jYiAqX19jb25zdCBfX2xpc3RbX19yZXN0cmljdF9hcnJdLAorCQkgICAgICAgaW50IF9fbmVudCwgc3RydWN0IHNpZ2V2ZW50ICpfX3Jlc3RyaWN0IF9fc2lnKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworLyogUmV0cmlldmUgZXJyb3Igc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCBBSU9DQlAuICAqLworZXh0ZXJuIGludCBhaW9fZXJyb3IgKF9fY29uc3Qgc3RydWN0IGFpb2NiICpfX2Fpb2NicCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisvKiBSZXR1cm4gc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCBBSU9DQlAuICAqLworZXh0ZXJuIF9fc3NpemVfdCBhaW9fcmV0dXJuIChzdHJ1Y3QgYWlvY2IgKl9fYWlvY2JwKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogVHJ5IHRvIGNhbmNlbCBhc3luY2hyb25vdXMgSS9PIHJlcXVlc3RzIG91dHN0YW5kaW5nIGFnYWluc3QgZmlsZQorICAgZGVzY3JpcHRvciBGSUxERVMuICAqLworZXh0ZXJuIGludCBhaW9fY2FuY2VsIChpbnQgX19maWxkZXMsIHN0cnVjdCBhaW9jYiAqX19haW9jYnApIF9fVEhST1c7CisKKy8qIFN1c3BlbmQgY2FsbGluZyB0aHJlYWQgdW50aWwgYXQgbGVhc3Qgb25lIG9mIHRoZSBhc3luY2hyb25vdXMgSS9PCisgICBvcGVyYXRpb25zIHJlZmVyZW5jZWQgYnkgTElTVCBoYXMgY29tcGxldGVkLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgYWlvX3N1c3BlbmQgKF9fY29uc3Qgc3RydWN0IGFpb2NiICpfX2NvbnN0IF9fbGlzdFtdLCBpbnQgX19uZW50LAorCQkJX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QgX190aW1lb3V0KQorICBfX25vbm51bGwgKCgxKSk7CisKKy8qIEZvcmNlIGFsbCBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCBmaWxlIGRlc3JpcHRvciBkZXNjcmliZWQgYnkKKyAgIGBhaW9fZmlsZGVzJyBtZW1iZXIgb2YgQUlPQ0JQLiAgKi8KK2V4dGVybiBpbnQgYWlvX2ZzeW5jIChpbnQgX19vcGVyYXRpb24sIHN0cnVjdCBhaW9jYiAqX19haW9jYnApCisgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGFpb19yZWFkLCAoc3RydWN0IGFpb2NiICpfX2Fpb2NicCksIGFpb19yZWFkNjQpCisgIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGFpb193cml0ZSwgKHN0cnVjdCBhaW9jYiAqX19haW9jYnApLCBhaW9fd3JpdGU2NCkKKyAgX19ub25udWxsICgoMSkpOworCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChsaW9fbGlzdGlvLAorCQkJICAgKGludCBfX21vZGUsCisJCQkgICAgc3RydWN0IGFpb2NiICpfX2NvbnN0IF9fbGlzdFtfX3Jlc3RyaWN0X2Fycl0sCisJCQkgICAgaW50IF9fbmVudCwgc3RydWN0IHNpZ2V2ZW50ICpfX3Jlc3RyaWN0IF9fc2lnKSwKKwkJCSAgIGxpb19saXN0aW82NCkgX19ub25udWxsICgoMikpOworCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChhaW9fZXJyb3IsIChfX2NvbnN0IHN0cnVjdCBhaW9jYiAqX19haW9jYnApLAorCQkJICAgYWlvX2Vycm9yNjQpIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBfX3NzaXplX3QgX19SRURJUkVDVF9OVEggKGFpb19yZXR1cm4sIChzdHJ1Y3QgYWlvY2IgKl9fYWlvY2JwKSwKKwkJCQkgYWlvX3JldHVybjY0KSBfX25vbm51bGwgKCgxKSk7CisKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGFpb19jYW5jZWwsCisJCQkgICAoaW50IF9fZmlsZGVzLCBzdHJ1Y3QgYWlvY2IgKl9fYWlvY2JwKSwKKwkJCSAgIGFpb19jYW5jZWw2NCk7CisKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGFpb19zdXNwZW5kLAorCQkJICAgKF9fY29uc3Qgc3RydWN0IGFpb2NiICpfX2NvbnN0IF9fbGlzdFtdLCBpbnQgX19uZW50LAorCQkJICAgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3Jlc3RyaWN0IF9fdGltZW91dCksCisJCQkgICBhaW9fc3VzcGVuZDY0KSBfX25vbm51bGwgKCgxKSk7CisKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGFpb19mc3luYywKKwkJCSAgIChpbnQgX19vcGVyYXRpb24sIHN0cnVjdCBhaW9jYiAqX19haW9jYnApLAorCQkJICAgYWlvX2ZzeW5jNjQpIF9fbm9ubnVsbCAoKDIpKTsKKworIyBlbHNlCisjICBkZWZpbmUgYWlvX3JlYWQgYWlvX3JlYWQ2NAorIyAgZGVmaW5lIGFpb193cml0ZSBhaW9fd3JpdGU2NAorIyAgZGVmaW5lIGxpb19saXN0aW8gbGlvX2xpc3RpbzY0CisjICBkZWZpbmUgYWlvX2Vycm9yIGFpb19lcnJvcjY0CisjICBkZWZpbmUgYWlvX3JldHVybiBhaW9fcmV0dXJuNjQKKyMgIGRlZmluZSBhaW9fY2FuY2VsIGFpb19jYW5jZWw2NAorIyAgZGVmaW5lIGFpb19zdXNwZW5kIGFpb19zdXNwZW5kNjQKKyMgIGRlZmluZSBhaW9fZnN5bmMgYWlvX2ZzeW5jNjQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgYWlvX3JlYWQ2NCAoc3RydWN0IGFpb2NiNjQgKl9fYWlvY2JwKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgYWlvX3dyaXRlNjQgKHN0cnVjdCBhaW9jYjY0ICpfX2Fpb2NicCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKK2V4dGVybiBpbnQgbGlvX2xpc3RpbzY0IChpbnQgX19tb2RlLAorCQkJIHN0cnVjdCBhaW9jYjY0ICpfX2NvbnN0IF9fbGlzdFtfX3Jlc3RyaWN0X2Fycl0sCisJCQkgaW50IF9fbmVudCwgc3RydWN0IHNpZ2V2ZW50ICpfX3Jlc3RyaWN0IF9fc2lnKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworZXh0ZXJuIGludCBhaW9fZXJyb3I2NCAoX19jb25zdCBzdHJ1Y3QgYWlvY2I2NCAqX19haW9jYnApCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworZXh0ZXJuIF9fc3NpemVfdCBhaW9fcmV0dXJuNjQgKHN0cnVjdCBhaW9jYjY0ICpfX2Fpb2NicCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKK2V4dGVybiBpbnQgYWlvX2NhbmNlbDY0IChpbnQgX19maWxkZXMsIHN0cnVjdCBhaW9jYjY0ICpfX2Fpb2NicCkgX19USFJPVzsKKworZXh0ZXJuIGludCBhaW9fc3VzcGVuZDY0IChfX2NvbnN0IHN0cnVjdCBhaW9jYjY0ICpfX2NvbnN0IF9fbGlzdFtdLCBpbnQgX19uZW50LAorCQkJICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXN0cmljdCBfX3RpbWVvdXQpCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCitleHRlcm4gaW50IGFpb19mc3luYzY0IChpbnQgX19vcGVyYXRpb24sIHN0cnVjdCBhaW9jYjY0ICpfX2Fpb2NicCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGFpby5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FsaWFzZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxpYXNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZGQ4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FsaWFzZXMuaApAQCAtMCwwICsxLDY0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0FMSUFTRVNfSAorI2RlZmluZSBfQUxJQVNFU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFN0cnVjdHVyZSB0byByZXByZXNlbnQgb25lIGVudHJ5IG9mIHRoZSBhbGlhcyBkYXRhIGJhc2UuICAqLworc3RydWN0IGFsaWFzZW50CisgIHsKKyAgICBjaGFyICphbGlhc19uYW1lOworICAgIHNpemVfdCBhbGlhc19tZW1iZXJzX2xlbjsKKyAgICBjaGFyICoqYWxpYXNfbWVtYmVyczsKKyAgICBpbnQgYWxpYXNfbG9jYWw7CisgIH07CisKKworLyogT3BlbiBhbGlhcyBkYXRhIGJhc2UgZmlsZXMuICAqLworZXh0ZXJuIHZvaWQgc2V0YWxpYXNlbnQgKHZvaWQpIF9fVEhST1c7CisKKy8qIENsb3NlIGFsaWFzIGRhdGEgYmFzZSBmaWxlcy4gICovCitleHRlcm4gdm9pZCBlbmRhbGlhc2VudCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIGFsaWFzIGRhdGEgYmFzZS4gICovCitleHRlcm4gc3RydWN0IGFsaWFzZW50ICpnZXRhbGlhc2VudCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIGFsaWFzIGRhdGEgYmFzZSBhbmQgcHV0IGl0IGluIFJFU1VMVF9CVUYuICAqLworZXh0ZXJuIGludCBnZXRhbGlhc2VudF9yIChzdHJ1Y3QgYWxpYXNlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCQkgIHN0cnVjdCBhbGlhc2VudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpIF9fVEhST1c7CisKKy8qIEdldCBhbGlhcyBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIE5BTUUuICAqLworZXh0ZXJuIHN0cnVjdCBhbGlhc2VudCAqZ2V0YWxpYXNieW5hbWUgKF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XOworCisvKiBHZXQgYWxpYXMgZW50cnkgY29ycmVzcG9uZGluZyB0byBOQU1FIGFuZCBwdXQgaXQgaW4gUkVTVUxUX0JVRi4gICovCitleHRlcm4gaW50IGdldGFsaWFzYnluYW1lX3IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCQkgICAgIHN0cnVjdCBhbGlhc2VudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICAgc3RydWN0IGFsaWFzZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGFsaWFzZXMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbGxvY2EuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxsb2NhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkMjkxZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxsb2NhLmgKQEAgLTAsMCArMSw0MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9BTExPQ0FfSAorI2RlZmluZQlfQUxMT0NBX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZQlfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogUmVtb3ZlIGFueSBwcmV2aW91cyBkZWZpbml0aW9ucy4gICovCisjdW5kZWYJYWxsb2NhCisKKy8qIEFsbG9jYXRlIGEgYmxvY2sgdGhhdCB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24gZXhpdHMuICAqLworZXh0ZXJuIHZvaWQgKmFsbG9jYSAoc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKKworI2lmZGVmCV9fR05VQ19fCisjIGRlZmluZSBhbGxvY2Eoc2l6ZSkJX19idWlsdGluX2FsbG9jYSAoc2l6ZSkKKyNlbmRpZiAvKiBHQ0MuICAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogYWxsb2NhLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9hbGlzcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2FsaXNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3ZWQ2NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9hbGlzcC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiAgQUxTQSBsaXNwIGltcGxlbWVudGF0aW9uCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCitzdHJ1Y3QgYWxpc3BfY2ZnIHsKKwlpbnQgdmVyYm9zZTogMSwKKwkgICAgd2FybmluZzogMSwKKwkgICAgZGVidWc6IDE7CisJc25kX2lucHV0X3QgKmluOwkvKiBwcm9ncmFtIGNvZGUgKi8KKwlzbmRfb3V0cHV0X3QgKm91dDsJLyogcHJvZ3JhbSBvdXRwdXQgKi8KKwlzbmRfb3V0cHV0X3QgKmVvdXQ7CS8qIGVycm9yIG91dHB1dCAqLworCXNuZF9vdXRwdXRfdCAqdm91dDsJLyogdmVyYm9zZSBvdXRwdXQgKi8KKwlzbmRfb3V0cHV0X3QgKndvdXQ7CS8qIHdhcm5pbmcgb3V0cHV0ICovCisJc25kX291dHB1dF90ICpkb3V0OwkvKiBkZWJ1ZyBvdXRwdXQgKi8KK307CisKK3N0cnVjdCBhbGlzcF9pbnN0YW5jZTsKK3N0cnVjdCBhbGlzcF9vYmplY3Q7CitzdHJ1Y3QgYWxpc3Bfc2VxX2l0ZXJhdG9yOworCitzdHJ1Y3QgYWxpc3BfY2ZnICphbHNhX2xpc3BfZGVmYXVsdF9jZmcoc25kX2lucHV0X3QgKmlucHV0KTsKK3ZvaWQgYWxzYV9saXNwX2RlZmF1bHRfY2ZnX2ZyZWUoc3RydWN0IGFsaXNwX2NmZyAqY2ZnKTsKK2ludCBhbHNhX2xpc3Aoc3RydWN0IGFsaXNwX2NmZyAqY2ZnLCBzdHJ1Y3QgYWxpc3BfaW5zdGFuY2UgKippbnN0YW5jZSk7Cit2b2lkIGFsc2FfbGlzcF9mcmVlKHN0cnVjdCBhbGlzcF9pbnN0YW5jZSAqaW5zdGFuY2UpOworaW50IGFsc2FfbGlzcF9mdW5jdGlvbihzdHJ1Y3QgYWxpc3BfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgYWxpc3Bfc2VxX2l0ZXJhdG9yICoqcmVzdWx0LAorCQkgICAgICAgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKmFyZ3MsIC4uLikKKyNpZm5kZWYgRE9DX0hJRERFTgorCQkgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpCisjZW5kaWYKKwkJICAgICAgIDsKK3ZvaWQgYWxzYV9saXNwX3Jlc3VsdF9mcmVlKHN0cnVjdCBhbGlzcF9pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkgICBzdHJ1Y3QgYWxpc3Bfc2VxX2l0ZXJhdG9yICpyZXN1bHQpOworaW50IGFsc2FfbGlzcF9zZXFfZmlyc3Qoc3RydWN0IGFsaXNwX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqaWQsCisJCQlzdHJ1Y3QgYWxpc3Bfc2VxX2l0ZXJhdG9yICoqc2VxKTsKK2ludCBhbHNhX2xpc3Bfc2VxX25leHQoc3RydWN0IGFsaXNwX3NlcV9pdGVyYXRvciAqKnNlcSk7CitpbnQgYWxzYV9saXNwX3NlcV9jb3VudChzdHJ1Y3QgYWxpc3Bfc2VxX2l0ZXJhdG9yICpzZXEpOworaW50IGFsc2FfbGlzcF9zZXFfaW50ZWdlcihzdHJ1Y3QgYWxpc3Bfc2VxX2l0ZXJhdG9yICpzZXEsIGxvbmcgKnZhbCk7CitpbnQgYWxzYV9saXNwX3NlcV9wb2ludGVyKHN0cnVjdCBhbGlzcF9zZXFfaXRlcmF0b3IgKnNlcSwgY29uc3QgY2hhciAqcHRyX2lkLCB2b2lkICoqcHRyKTsKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9hc291bmRlZi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2Fzb3VuZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjNGVlYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9hc291bmRlZi5oCkBAIC0wLDAgKzEsMzEwIEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvYXNvdW5kZWYuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBEZWZpbml0aW9ucyBvZiBjb25zdGFudHMgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX0FTT1VOREVGX0gKKyNkZWZpbmUgX19BTFNBX0FTT1VOREVGX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFxkZWZncm91cCBEaWdpdGFsX0F1ZGlvX0ludGVyZmFjZSBDb25zdGFudHMgZm9yIERpZ2l0YWwgQXVkaW8gSW50ZXJmYWNlcworICogQUVTL0lFQzk1OCBjaGFubmVsIHN0YXR1cyBiaXRzLgorICogXHsKKyAqLworCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTAkoMTw8MCkJLyoqPCAwID0gY29uc3VtZXIsIDEgPSBwcm9mZXNzaW9uYWwgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfTk9OQVVESU8JCSgxPDwxKQkvKio8IDAgPSBhdWRpbywgMSA9IG5vbi1hdWRpbyAqLworI2RlZmluZSBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVMJKDc8PDIpCS8qKjwgbWFzayAtIGVtcGhhc2lzICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19FTVBIQVNJU19OT1RJRAkoMDw8MikJLyoqPCBlbXBoYXNpcyBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19FTVBIQVNJU19OT05FCSgxPDwyKQkvKio8IG5vIGVtcGhhc2lzICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19FTVBIQVNJU181MDE1CSgzPDwyKQkvKio8IDUwLzE1dXMgZW1waGFzaXMgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTX0NDSVRUCSg3PDwyKQkvKio8IENDSVRUIEouMTcgZW1waGFzaXMgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfUFJPX0ZSRVFfVU5MT0NLRUQJKDE8PDUpCS8qKjwgc291cmNlIHNhbXBsZSBmcmVxdWVuY3k6IDAgPSBsb2NrZWQsIDEgPSB1bmxvY2tlZCAqLworI2RlZmluZSBJRUM5NThfQUVTMF9QUk9fRlMJCSgzPDw2KQkvKio8IG1hc2sgLSBzYW1wbGUgZnJlcXVlbmN5ICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19GU19OT1RJRAkoMDw8NikJLyoqPCBmcyBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19GU180NDEwMAkoMTw8NikJLyoqPCA0NC4xa0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19GU180ODAwMAkoMjw8NikJLyoqPCA0OGtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTMF9QUk9fRlNfMzIwMDAJKDM8PDYpCS8qKjwgMzJrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfQ09OX05PVF9DT1BZUklHSFQJKDE8PDIpCS8qKjwgMCA9IGNvcHlyaWdodCwgMSA9IG5vdCBjb3B5cmlnaHQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTCSg3PDwzKQkvKio8IG1hc2sgLSBlbXBoYXNpcyAqLworI2RlZmluZSBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfTk9ORQkoMDw8MykJLyoqPCBubyBlbXBoYXNpcyAqLworI2RlZmluZSBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfNTAxNQkoMTw8MykJLyoqPCA1MC8xNXVzIGVtcGhhc2lzICovCisjZGVmaW5lIElFQzk1OF9BRVMwX0NPTl9NT0RFCQkoMzw8NikJLyoqPCBtYXNrIC0gbW9kZSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9QUk9fTU9ERQkJKDE1PDwwKQkvKio8IG1hc2sgLSBjaGFubmVsIG1vZGUgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfUFJPX01PREVfTk9USUQJKDA8PDApCS8qKjwgbW9kZSBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIElFQzk1OF9BRVMxX1BST19NT0RFX1NURVJFT1BIT05JQyAoMjw8MCkgLyoqPCBzdGVyZW9waG9uaWMgLSBjaCBBIGlzIGxlZnQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfUFJPX01PREVfU0lOR0xFCSg0PDwwKQkvKio8IHNpbmdsZSBjaGFubmVsICovCisjZGVmaW5lIElFQzk1OF9BRVMxX1BST19NT0RFX1RXTwkoODw8MCkJLyoqPCB0d28gY2hhbm5lbHMgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfUFJPX01PREVfUFJJTUFSWQkoMTI8PDApCS8qKjwgcHJpbWFyeS9zZWNvbmRhcnkgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfUFJPX01PREVfQllURTMJKDE1PDwwKQkvKio8IHZlY3RvciB0byBieXRlIDMgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfUFJPX1VTRVJCSVRTCSgxNTw8NCkJLyoqPCBtYXNrIC0gdXNlciBiaXRzICovCisjZGVmaW5lIElFQzk1OF9BRVMxX1BST19VU0VSQklUU19OT1RJRAkoMDw8NCkJLyoqPCB1c2VyIGJpdHMgbm90IGluZGljYXRlZCAqLworI2RlZmluZSBJRUM5NThfQUVTMV9QUk9fVVNFUkJJVFNfMTkyCSg4PDw0KQkvKio8IDE5Mi1iaXQgc3RydWN0dXJlICovCisjZGVmaW5lIElFQzk1OF9BRVMxX1BST19VU0VSQklUU19VREVGCSgxMjw8NCkJLyoqPCB1c2VyIGRlZmluZWQgYXBwbGljYXRpb24gKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0NBVEVHT1JZCTB4N2YJLyoqPCBjb25zdW1lciBjYXRlZ29yeSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fR0VORVJBTAkJMHgwMAkvKio8IGdlbmVyYWwgY2F0ZWdvcnkgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0xBU0VST1BUX01BU0sJMHgwNwkvKio8IExhc2VyLW9wdGljYWwgbWFzayAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTEFTRVJPUFRfSUQJMHgwMQkvKio8IExhc2VyLW9wdGljYWwgSUQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0lFQzkwOF9DRAkoSUVDOTU4X0FFUzFfQ09OX0xBU0VST1BUX0lEfDB4MDApCS8qKjwgSUVDOTU4IENEIGNvbXBhdGlibGUgZGV2aWNlICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9OT05fSUVDOTA4X0NECShJRUM5NThfQUVTMV9DT05fTEFTRVJPUFRfSUR8MHgwOCkJLyoqPCBub24tSUVDOTU4IENEIGNvbXBhdGlibGUgZGV2aWNlICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NSU5JX0RJU0MJKElFQzk1OF9BRVMxX0NPTl9MQVNFUk9QVF9JRHwweDQ4KQkvKio8IE1pbmktRGlzYyBkZXZpY2UgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0RWRAkJKElFQzk1OF9BRVMxX0NPTl9MQVNFUk9QVF9JRHwweDE4KQkvKio8IERWRCBkZXZpY2UgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0xBU1RFUk9QVF9PVEhFUgkoSUVDOTU4X0FFUzFfQ09OX0xBU0VST1BUX0lEfDB4NzgpCS8qKjwgT3RoZXIgbGFzZXItb3B0aWNhbCBwcm9kdWN0ICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9ESUdESUdDT05WX01BU0sgMHgwNwkvKio8IGRpZ2l0YWw8LT5kaWdpdGFsIGNvbnZlcnRlciBtYXNrICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9ESUdESUdDT05WX0lECTB4MDIJLyoqPCBkaWdpdGFsPC0+ZGlnaXRhbCBjb252ZXJ0ZXIgaWQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1BDTV9DT0RFUgkoSUVDOTU4X0FFUzFfQ09OX0RJR0RJR0NPTlZfSUR8MHgwMCkJLyoqPCBQQ00gY29kZXIgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01JWEVSCQkoSUVDOTU4X0FFUzFfQ09OX0RJR0RJR0NPTlZfSUR8MHgxMCkJLyoqPCBEaWdpdGFsIHNpZ25hbCBtaXhlciAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fUkFURV9DT05WRVJURVIJKElFQzk1OF9BRVMxX0NPTl9ESUdESUdDT05WX0lEfDB4MTgpCS8qKjwgUmF0ZSBjb252ZXJ0ZXIgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1NBTVBMRVIJCShJRUM5NThfQUVTMV9DT05fRElHRElHQ09OVl9JRHwweDIwKQkvKio8IFBDTSBzYW1wbGVyICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9EU1AJCShJRUM5NThfQUVTMV9DT05fRElHRElHQ09OVl9JRHwweDI4KQkvKio8IERpZ2l0YWwgc291bmQgcHJvY2Vzc29yICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9ESUdESUdDT05WX09USEVSIChJRUM5NThfQUVTMV9DT05fRElHRElHQ09OVl9JRHwweDc4KQkvKio8IE90aGVyIGRpZ2l0YWw8LT5kaWdpdGFsIHByb2R1Y3QgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01BR05FVElDX01BU0sJMHgwNwkvKio8IE1hZ25ldGljIGRldmljZSBtYXNrICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NQUdORVRJQ19JRAkweDAzCS8qKjwgTWFnbmV0aWMgZGV2aWNlIElEICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9EQVQJCShJRUM5NThfQUVTMV9DT05fTUFHTkVUSUNfSUR8MHgwMCkJLyoqPCBEaWdpdGFsIEF1ZGlvIFRhcGUgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1ZDUgkJKElFQzk1OF9BRVMxX0NPTl9NQUdORVRJQ19JRHwweDA4KQkvKio8IFZpZGVvIHJlY29yZGVyICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9EQ0MJCShJRUM5NThfQUVTMV9DT05fTUFHTkVUSUNfSUR8MHg0MCkJLyoqPCBEaWdpdGFsIGNvbXBhY3QgY2Fzc2V0dGUgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01BR05FVElDX0RJU0MJKElFQzk1OF9BRVMxX0NPTl9NQUdORVRJQ19JRHwweDE4KQkvKio8IE1hZ25ldGljIGRpc2MgZGlnaXRhbCBhdWRpbyBkZXZpY2UgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01BR05FVElDX09USEVSCShJRUM5NThfQUVTMV9DT05fTUFHTkVUSUNfSUR8MHg3OCkJLyoqPCBPdGhlciBtYWduZXRpYyBkZXZpY2UgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDFfTUFTSyAweDA3CS8qKjwgQnJvYWRjYXN0IG1hc2sgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDFfSUQJMHgwNAkvKio8IEJyb2FkY2FzdCBJRCAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fREFCX0pBUEFOCShJRUM5NThfQUVTMV9DT05fQlJPQURDQVNUMV9JRHwweDAwKQkvKio8IERpZ2l0YWwgYXVkaW8gYnJvYWRjYXN0IChKYXBhbikgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0RBQl9FVVJPUEUJKElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QxX0lEfDB4MDgpCS8qKjwgRGlnaXRhbCBhdWRpbyBicm9hZGNhc3QgKEV1cm9wZSkgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0RBQl9VU0EJCShJRUM5NThfQUVTMV9DT05fQlJPQURDQVNUMV9JRHwweDYwKQkvKio8IERpZ2l0YWwgYXVkaW8gYnJvYWRjYXN0IChVU0EpICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9TT0ZUV0FSRQkoSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDFfSUR8MHg0MCkJLyoqPCBFbGVjdHJvbmljIHNvZnR3YXJlIGRlbGl2ZXJ5ICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9JRUM2MjEwNQkoSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDFfSUR8MHgyMCkJLyoqPCBVc2VkIGJ5IGFub3RoZXIgc3RhbmRhcmQgKElFQyA2MjEwNSkgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDFfT1RIRVIgKElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QxX0lEfDB4NzgpCS8qKjwgT3RoZXIgYnJvYWRjYXN0IHByb2R1Y3QgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDJfTUFTSyAweDBmCS8qKjwgQnJvYWRjYXN0IGFsdGVybmF0aXZlIG1hc2sgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDJfSUQJMHgwZQkvKio8IEJyb2FkY2FzdCBhbHRlcm5hdGl2ZSBJRCAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTVVTSUNBTF9NQVNLCTB4MDcJLyoqPCBNdXNpY2FsIGRldmljZSBtYXNrICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NVVNJQ0FMX0lECTB4MDUJLyoqPCBNdXNpY2FsIGRldmljZSBJRCAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fU1lOVEhFU0laRVIJKElFQzk1OF9BRVMxX0NPTl9NVVNJQ0FMX0lEfDB4MDApCS8qKjwgU3ludGhlc2l6ZXIgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01JQ1JPUEhPTkUJKElFQzk1OF9BRVMxX0NPTl9NVVNJQ0FMX0lEfDB4MDgpCS8qKjwgTWljcm9waG9uZSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTVVTSUNBTF9PVEhFUgkoSUVDOTU4X0FFUzFfQ09OX01VU0lDQUxfSUR8MHg3OCkJLyoqPCBPdGhlciBtdXNpY2FsIGRldmljZSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fQURDX01BU0sJMHgxZgkvKio8IEFEQyBNYXNrICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9BRENfSUQJCTB4MDYJLyoqPCBBREMgSUQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQwkJKElFQzk1OF9BRVMxX0NPTl9BRENfSUR8MHgwMCkJLyoqPCBBREMgd2l0aG91dCBjb3B5cmlnaHQgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQ19PVEhFUgkoSUVDOTU4X0FFUzFfQ09OX0FEQ19JRHwweDYwKQkvKio8IE90aGVyIEFEQyBwcm9kdWN0ICh3aXRoIG5vIGNvcHlyaWdodCBpbmZvcm1hdGlvbikgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQ19DT1BZUklHSFRfTUFTSyAweDFmCS8qKjwgQURDIENvcHlyaWdodCBtYXNrICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9BRENfQ09QWVJJR0hUX0lEIDB4MTYJLyoqPCBBREMgQ29weXJpZ2h0IElEICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9BRENfQ09QWVJJR0hUCShJRUM5NThfQUVTMV9DT05fQURDX0NPUFlSSUdIVF9JRHwweDAwKQkvKio8IEFEQyB3aXRoIGNvcHlyaWdodCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fQURDX0NPUFlSSUdIVF9PVEhFUiAoSUVDOTU4X0FFUzFfQ09OX0FEQ19DT1BZUklHSFRfSUR8MHg2MCkJLyoqPCBPdGhlciBBREMgd2l0aCBjb3B5cmlnaHQgaW5mb3JtYXRpb24gcHJvZHVjdCAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fU09MSURNRU1fTUFTSwkweDBmCS8qKjwgU29saWQgbWVtb3J5IGJhc2VkIHByb2R1Y3RzIG1hc2sgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1NPTElETUVNX0lECTB4MDgJLyoqPCBTb2xpZCBtZW1vcnkgYmFzZWQgcHJvZHVjdHMgSUQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1NPTElETUVNX0RJR0lUQUxfUkVDT1JERVJfUExBWUVSIChJRUM5NThfQUVTMV9DT05fU09MSURNRU1fSUR8MHgwMCkJLyoqPCBEaWdpdGFsIGF1ZGlvIHJlY29yZGVyIGFuZCBwbGF5ZXIgdXNpbmcgc29saWQgc3RhdGUgbWVtb3J5ICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9TT0xJRE1FTV9PVEhFUgkoSUVDOTU4X0FFUzFfQ09OX1NPTElETUVNX0lEfDB4NzApCS8qKjwgT3RoZXIgc29saWQgc3RhdGUgbWVtb3J5IGJhc2VkIHByb2R1Y3QgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0VYUEVSSU1FTlRBTAkweDQwCS8qKjwgZXhwZXJpbWVudGFsIGNhdGVnb3J5ICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9PUklHSU5BTAkoMTw8NykJLyoqPCB0aGlzIGJpdHMgZGVwZW5kcyBvbiB0aGUgY2F0ZWdvcnkgY29kZSAqLworI2RlZmluZSBJRUM5NThfQUVTMl9QUk9fU0JJVFMJCSg3PDwwKQkvKio8IG1hc2sgLSBzYW1wbGUgYml0cyAqLworI2RlZmluZSBJRUM5NThfQUVTMl9QUk9fU0JJVFNfMjAJKDI8PDApCS8qKjwgMjAtYml0IC0gY29vcmRpbmF0aW9uICovCisjZGVmaW5lIElFQzk1OF9BRVMyX1BST19TQklUU18yNAkoNDw8MCkJLyoqPCAyNC1iaXQgLSBtYWluIGF1ZGlvICovCisjZGVmaW5lIElFQzk1OF9BRVMyX1BST19TQklUU19VREVGCSg2PDwwKQkvKio8IHVzZXIgZGVmaW5lZCBhcHBsaWNhdGlvbiAqLworI2RlZmluZSBJRUM5NThfQUVTMl9QUk9fV09SRExFTgkJKDc8PDMpCS8qKjwgbWFzayAtIHNvdXJjZSB3b3JkIGxlbmd0aCAqLworI2RlZmluZSBJRUM5NThfQUVTMl9QUk9fV09SRExFTl9OT1RJRAkoMDw8MykJLyoqPCBzb3VyY2Ugd29yZCBsZW5ndGggbm90IGluZGljYXRlZCAqLworI2RlZmluZSBJRUM5NThfQUVTMl9QUk9fV09SRExFTl8yMl8xOAkoMjw8MykJLyoqPCAyMi1iaXQgb3IgMTgtYml0ICovCisjZGVmaW5lIElFQzk1OF9BRVMyX1BST19XT1JETEVOXzIzXzE5CSg0PDwzKQkvKio8IDIzLWJpdCBvciAxOS1iaXQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfUFJPX1dPUkRMRU5fMjRfMjAJKDU8PDMpCS8qKjwgMjQtYml0IG9yIDIwLWJpdCAqLworI2RlZmluZSBJRUM5NThfQUVTMl9QUk9fV09SRExFTl8yMF8xNgkoNjw8MykJLyoqPCAyMC1iaXQgb3IgMTYtYml0ICovCisjZGVmaW5lIElFQzk1OF9BRVMyX0NPTl9TT1VSQ0UJCSgxNTw8MCkJLyoqPCBtYXNrIC0gc291cmNlIG51bWJlciAqLworI2RlZmluZSBJRUM5NThfQUVTMl9DT05fU09VUkNFX1VOU1BFQwkoMDw8MCkJLyoqPCBzb3VyY2UgbnVtYmVyIHVuc3BlY2lmaWVkICovCisjZGVmaW5lIElFQzk1OF9BRVMyX0NPTl9DSEFOTkVMCQkoMTU8PDQpCS8qKjwgbWFzayAtIGNoYW5uZWwgbnVtYmVyICovCisjZGVmaW5lIElFQzk1OF9BRVMyX0NPTl9DSEFOTkVMX1VOU1BFQwkoMDw8NCkJLyoqPCBjaGFubmVsIG51bWJlciB1bnNwZWNpZmllZCAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlMJCSgxNTw8MCkJLyoqPCBtYXNrIC0gc2FtcGxlIGZyZXF1ZW5jeSAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfNDQxMDAJKDA8PDApCS8qKjwgNDQuMWtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfTk9USUQJKDE8PDApCS8qKjwgc2FtcGxlIGZyZXF1ZW5jeSBub24gaW5kaWNhdGVkICovCisjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9GU180ODAwMAkoMjw8MCkJLyoqPCA0OGtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfMzIwMDAJKDM8PDApCS8qKjwgMzJrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0ZTXzIyMDUwCSg0PDwwKQkvKio8IDIyLjA1a0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9GU18yNDAwMAkoNjw8MCkJLyoqPCAyNGtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfODgyMDAJKDg8PDApCS8qKjwgODguMmtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfNzY4MDAwCSg5PDwwKQkvKio8IDc2OGtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfOTYwMDAJKDEwPDwwKQkvKio8IDk2a0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9GU18xNzY0MDAJKDEyPDwwKQkvKio8IDE3Ni40a0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9GU18xOTIwMDAJKDE0PDwwKQkvKio8IDE5MmtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fQ0xPQ0sJCSgzPDw0KQkvKio8IG1hc2sgLSBjbG9jayBhY2N1cmFjeSAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fQ0xPQ0tfMTAwMFBQTQkoMDw8NCkJLyoqPCAxMDAwIHBwbSAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fQ0xPQ0tfNTBQUE0JKDE8PDQpCS8qKjwgNTAgcHBtICovCisjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9DTE9DS19WQVJJQUJMRQkoMjw8NCkJLyoqPCB2YXJpYWJsZSBwaXRjaCAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fTUFYX1dPUkRMRU5fMjQJKDE8PDApCS8qKjwgMCA9IDIwLWJpdCwgMSA9IDI0LWJpdCAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fV09SRExFTgkJKDc8PDEpCS8qKjwgbWFzayAtIHNhbXBsZSB3b3JkIGxlbmd0aCAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fV09SRExFTl9OT1RJRAkoMDw8MSkJLyoqPCBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9XT1JETEVOXzIwXzE2CSgxPDwxKQkvKio8IDIwLWJpdCBvciAxNi1iaXQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX1dPUkRMRU5fMjJfMTgJKDI8PDEpCS8qKjwgMjItYml0IG9yIDE4LWJpdCAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fV09SRExFTl8yM18xOQkoNDw8MSkJLyoqPCAyMy1iaXQgb3IgMTktYml0ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9XT1JETEVOXzI0XzIwCSg1PDwxKQkvKio8IDI0LWJpdCBvciAyMC1iaXQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX1dPUkRMRU5fMjFfMTcJKDY8PDEpCS8qKjwgMjEtYml0IG9yIDE3LWJpdCAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fT1JJR0ZTCQkoMTU8PDQpCS8qKjwgbWFzayAtIG9yaWdpbmFsIHNhbXBsZSBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU19OT1RJRAkoMDw8NCkJLyoqPCBvcmlnaW5hbCBzYW1wbGUgZnJlcXVlbmN5IG5vdCBpbmRpY2F0ZWQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU18xOTIwMDAJKDE8PDQpCS8qKjwgMTkya0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfMTIwMDAJKDI8PDQpCS8qKjwgMTJrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU18xNzY0MDAJKDM8PDQpCS8qKjwgMTc2LjRrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU185NjAwMAkoNTw8NCkJLyoqPCA5NmtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fT1JJR0ZTXzgwMDAJKDY8PDQpCS8qKjwgOGtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fT1JJR0ZTXzg4MjAwCSg3PDw0KQkvKio8IDg4LjJrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU18xNjAwMAkoODw8NCkJLyoqPCAxNmtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fT1JJR0ZTXzI0MDAwCSg5PDw0KQkvKio8IDI0a0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfMTEwMjUJKDEwPDw0KQkvKio8IDExLjAyNWtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fT1JJR0ZTXzIyMDUwCSgxMTw8NCkJLyoqPCAyMi4wNWtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fT1JJR0ZTXzMyMDAwCSgxMjw8NCkJLyoqPCAzMmtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fT1JJR0ZTXzQ4MDAwCSgxMzw8NCkJLyoqPCA0OGtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fT1JJR0ZTXzQ0MTAwCSgxNTw8NCkJLyoqPCA0NC4xa0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVM1X0NPTl9DR01TQQkJKDM8PDApCS8qKjwgbWFzayAtIENHTVMtQSAqLworI2RlZmluZSBJRUM5NThfQUVTNV9DT05fQ0dNU0FfQ09QWUZSRUVMWSAoMDw8MCkJLyoqPCBjb3B5aW5nIGlzIHBlcm1pdHRlZCB3aXRob3V0IHJlc3RyaWN0aW9uICovCisjZGVmaW5lIElFQzk1OF9BRVM1X0NPTl9DR01TQV9DT1BZT05DRQkoMTw8MCkJLyoqPCBvbmUgZ2VuZXJhdGlvbiBvZiBjb3BpZXMgbWF5IGJlIG1hZGUgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzVfQ09OX0NHTVNBX0NPUFlOT01PUkUgKDI8PDApCS8qKjwgY29uZGl0aW9uIG5vdCBiZSB1c2VkICovCisjZGVmaW5lIElFQzk1OF9BRVM1X0NPTl9DR01TQV9DT1BZTkVWRVIJKDM8PDApCS8qKjwgbm8gY29weWluZyBpcyBwZXJtaXR0ZWQgKi8KKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIE1JRElfSW50ZXJmYWNlIENvbnN0YW50cyBmb3IgTUlESSB2MS4wCisgKiBDb25zdGFudHMgZm9yIE1JREkgdjEuMC4KKyAqIFx7CisgKi8KKworI2RlZmluZSBNSURJX0NIQU5ORUxTCQkJMTYJLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgcGVyIHBvcnQvY2FibGUuICovCisjZGVmaW5lIE1JRElfR01fRFJVTV9DSEFOTkVMCQkoMTAtMSkJLyoqPCBDaGFubmVsIG51bWJlciBmb3IgR00gZHJ1bXMuICovCisKKy8qKgorICogXGRlZmdyb3VwIE1JRElfQ29tbWFuZHMgTUlESSBDb21tYW5kcworICogTUlESSBjb21tYW5kIGNvZGVzLgorICogXHsKKyAqLworCisjZGVmaW5lIE1JRElfQ01EX05PVEVfT0ZGCQkweDgwCS8qKjwgbm90ZSBvZmYgKi8KKyNkZWZpbmUgTUlESV9DTURfTk9URV9PTgkJMHg5MAkvKio8IG5vdGUgb24gKi8KKyNkZWZpbmUgTUlESV9DTURfTk9URV9QUkVTU1VSRQkJMHhhMAkvKio8IGtleSBwcmVzc3VyZSAqLworI2RlZmluZSBNSURJX0NNRF9DT05UUk9MCQkweGIwCS8qKjwgY29udHJvbCBjaGFuZ2UgKi8KKyNkZWZpbmUgTUlESV9DTURfUEdNX0NIQU5HRQkJMHhjMAkvKio8IHByb2dyYW0gY2hhbmdlICovCisjZGVmaW5lIE1JRElfQ01EX0NIQU5ORUxfUFJFU1NVUkUJMHhkMAkvKio8IGNoYW5uZWwgcHJlc3N1cmUgKi8KKyNkZWZpbmUgTUlESV9DTURfQkVOREVSCQkJMHhlMAkvKio8IHBpdGNoIGJlbmRlciAqLworCisjZGVmaW5lIE1JRElfQ01EX0NPTU1PTl9TWVNFWAkJMHhmMAkvKio8IHN5c2V4IChzeXN0ZW0gZXhjbHVzaXZlKSBiZWdpbiAqLworI2RlZmluZSBNSURJX0NNRF9DT01NT05fTVRDX1FVQVJURVIJMHhmMQkvKio8IE1UQyBxdWFydGVyIGZyYW1lICovCisjZGVmaW5lIE1JRElfQ01EX0NPTU1PTl9TT05HX1BPUwkweGYyCS8qKjwgc29uZyBwb3NpdGlvbiAqLworI2RlZmluZSBNSURJX0NNRF9DT01NT05fU09OR19TRUxFQ1QJMHhmMwkvKio8IHNvbmcgc2VsZWN0ICovCisjZGVmaW5lIE1JRElfQ01EX0NPTU1PTl9UVU5FX1JFUVVFU1QJMHhmNgkvKio8IHR1bmUgcmVxdWVzdCAqLworI2RlZmluZSBNSURJX0NNRF9DT01NT05fU1lTRVhfRU5ECTB4ZjcJLyoqPCBlbmQgb2Ygc3lzZXggKi8KKyNkZWZpbmUgTUlESV9DTURfQ09NTU9OX0NMT0NLCQkweGY4CS8qKjwgY2xvY2sgKi8KKyNkZWZpbmUgTUlESV9DTURfQ09NTU9OX1NUQVJUCQkweGZhCS8qKjwgc3RhcnQgKi8KKyNkZWZpbmUgTUlESV9DTURfQ09NTU9OX0NPTlRJTlVFCTB4ZmIJLyoqPCBjb250aW51ZSAqLworI2RlZmluZSBNSURJX0NNRF9DT01NT05fU1RPUAkJMHhmYwkvKio8IHN0b3AgKi8KKyNkZWZpbmUgTUlESV9DTURfQ09NTU9OX1NFTlNJTkcJCTB4ZmUJLyoqPCBhY3RpdmUgc2Vuc2luZyAqLworI2RlZmluZSBNSURJX0NNRF9DT01NT05fUkVTRVQJCTB4ZmYJLyoqPCByZXNldCAqLworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgTUlESV9Db250cm9sbGVycyBNSURJIENvbnRyb2xsZXJzCisgKiBNSURJIGNvbnRyb2xsZXIgbnVtYmVycy4KKyAqIFx7CisgKi8KKworI2RlZmluZSBNSURJX0NUTF9NU0JfQkFOSwkJMHgwMAkvKio8IEJhbmsgc2VsZWN0aW9uICovCisjZGVmaW5lIE1JRElfQ1RMX01TQl9NT0RXSEVFTCAgICAgICAgIAkweDAxCS8qKjwgTW9kdWxhdGlvbiAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfQlJFQVRIICAgICAgICAgICAJMHgwMgkvKio8IEJyZWF0aCAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfRk9PVCAgICAgICAgICAgICAJMHgwNAkvKio8IEZvb3QgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX1BPUlRBTUVOVE9fVElNRSAJMHgwNQkvKio8IFBvcnRhbWVudG8gdGltZSAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfREFUQV9FTlRSWQkJMHgwNgkvKio8IERhdGEgZW50cnkgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX01BSU5fVk9MVU1FICAgICAgCTB4MDcJLyoqPCBNYWluIHZvbHVtZSAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfQkFMQU5DRSAgICAgICAgICAJMHgwOAkvKio8IEJhbGFuY2UgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX1BBTiAgICAgICAgICAgICAgCTB4MGEJLyoqPCBQYW5wb3QgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX0VYUFJFU1NJT04gICAgICAgCTB4MGIJLyoqPCBFeHByZXNzaW9uICovCisjZGVmaW5lIE1JRElfQ1RMX01TQl9FRkZFQ1QxCQkweDBjCS8qKjwgRWZmZWN0MSAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfRUZGRUNUMgkJMHgwZAkvKio8IEVmZmVjdDIgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX0dFTkVSQUxfUFVSUE9TRTEgCTB4MTAJLyoqPCBHZW5lcmFsIHB1cnBvc2UgMSAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfR0VORVJBTF9QVVJQT1NFMiAJMHgxMQkvKio8IEdlbmVyYWwgcHVycG9zZSAyICovCisjZGVmaW5lIE1JRElfQ1RMX01TQl9HRU5FUkFMX1BVUlBPU0UzIAkweDEyCS8qKjwgR2VuZXJhbCBwdXJwb3NlIDMgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX0dFTkVSQUxfUFVSUE9TRTQgCTB4MTMJLyoqPCBHZW5lcmFsIHB1cnBvc2UgNCAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfQkFOSwkJMHgyMAkvKio8IEJhbmsgc2VsZWN0aW9uICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9NT0RXSEVFTCAgICAgICAgCTB4MjEJLyoqPCBNb2R1bGF0aW9uICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9CUkVBVEggICAgICAgICAgIAkweDIyCS8qKjwgQnJlYXRoICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9GT09UICAgICAgICAgICAgIAkweDI0CS8qKjwgRm9vdCAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfUE9SVEFNRU5UT19USU1FIAkweDI1CS8qKjwgUG9ydGFtZW50byB0aW1lICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9EQVRBX0VOVFJZCQkweDI2CS8qKjwgRGF0YSBlbnRyeSAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfTUFJTl9WT0xVTUUgICAgICAJMHgyNwkvKio8IE1haW4gdm9sdW1lICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9CQUxBTkNFICAgICAgICAgIAkweDI4CS8qKjwgQmFsYW5jZSAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfUEFOICAgICAgICAgICAgICAJMHgyYQkvKio8IFBhbnBvdCAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfRVhQUkVTU0lPTiAgICAgICAJMHgyYgkvKio8IEV4cHJlc3Npb24gKi8KKyNkZWZpbmUgTUlESV9DVExfTFNCX0VGRkVDVDEJCTB4MmMJLyoqPCBFZmZlY3QxICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9FRkZFQ1QyCQkweDJkCS8qKjwgRWZmZWN0MiAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfR0VORVJBTF9QVVJQT1NFMSAJMHgzMAkvKio8IEdlbmVyYWwgcHVycG9zZSAxICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9HRU5FUkFMX1BVUlBPU0UyIAkweDMxCS8qKjwgR2VuZXJhbCBwdXJwb3NlIDIgKi8KKyNkZWZpbmUgTUlESV9DVExfTFNCX0dFTkVSQUxfUFVSUE9TRTMgCTB4MzIJLyoqPCBHZW5lcmFsIHB1cnBvc2UgMyAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfR0VORVJBTF9QVVJQT1NFNCAJMHgzMwkvKio8IEdlbmVyYWwgcHVycG9zZSA0ICovCisjZGVmaW5lIE1JRElfQ1RMX1NVU1RBSU4gICAgICAgICAgICAgIAkweDQwCS8qKjwgU3VzdGFpbiBwZWRhbCAqLworI2RlZmluZSBNSURJX0NUTF9QT1JUQU1FTlRPICAgICAgICAgICAJMHg0MQkvKio8IFBvcnRhbWVudG8gKi8KKyNkZWZpbmUgTUlESV9DVExfU09TVEVOVVRPICAgICAgICAgICAgCTB4NDIJLyoqPCBTb3N0ZW51dG8gKi8KKyNkZWZpbmUgTUlESV9DVExfU1VTVEVOVVRPICAgICAgICAgICAgCTB4NDIJLyoqPCBTb3N0ZW51dG8gKGEgdHlwbyBpbiB0aGUgb2xkZXIgdmVyc2lvbikgKi8KKyNkZWZpbmUgTUlESV9DVExfU09GVF9QRURBTCAgICAgICAgICAgCTB4NDMJLyoqPCBTb2Z0IHBlZGFsICovCisjZGVmaW5lIE1JRElfQ1RMX0xFR0FUT19GT09UU1dJVENICTB4NDQJLyoqPCBMZWdhdG8gZm9vdCBzd2l0Y2ggKi8KKyNkZWZpbmUgTUlESV9DVExfSE9MRDIgICAgICAgICAgICAgICAgCTB4NDUJLyoqPCBIb2xkMiAqLworI2RlZmluZSBNSURJX0NUTF9TQzFfU09VTkRfVkFSSUFUSU9OCTB4NDYJLyoqPCBTQzEgU291bmQgVmFyaWF0aW9uICovCisjZGVmaW5lIE1JRElfQ1RMX1NDMl9USU1CUkUJCTB4NDcJLyoqPCBTQzIgVGltYnJlICovCisjZGVmaW5lIE1JRElfQ1RMX1NDM19SRUxFQVNFX1RJTUUJMHg0OAkvKio8IFNDMyBSZWxlYXNlIFRpbWUgKi8KKyNkZWZpbmUgTUlESV9DVExfU0M0X0FUVEFDS19USU1FCTB4NDkJLyoqPCBTQzQgQXR0YWNrIFRpbWUgKi8KKyNkZWZpbmUgTUlESV9DVExfU0M1X0JSSUdIVE5FU1MJCTB4NGEJLyoqPCBTQzUgQnJpZ2h0bmVzcyAqLworI2RlZmluZSBNSURJX0NUTF9TQzYJCQkweDRiCS8qKjwgU0M2ICovCisjZGVmaW5lIE1JRElfQ1RMX1NDNwkJCTB4NGMJLyoqPCBTQzcgKi8KKyNkZWZpbmUgTUlESV9DVExfU0M4CQkJMHg0ZAkvKio8IFNDOCAqLworI2RlZmluZSBNSURJX0NUTF9TQzkJCQkweDRlCS8qKjwgU0M5ICovCisjZGVmaW5lIE1JRElfQ1RMX1NDMTAJCQkweDRmCS8qKjwgU0MxMCAqLworI2RlZmluZSBNSURJX0NUTF9HRU5FUkFMX1BVUlBPU0U1ICAgICAJMHg1MAkvKio8IEdlbmVyYWwgcHVycG9zZSA1ICovCisjZGVmaW5lIE1JRElfQ1RMX0dFTkVSQUxfUFVSUE9TRTYgICAgIAkweDUxCS8qKjwgR2VuZXJhbCBwdXJwb3NlIDYgKi8KKyNkZWZpbmUgTUlESV9DVExfR0VORVJBTF9QVVJQT1NFNyAgICAgCTB4NTIJLyoqPCBHZW5lcmFsIHB1cnBvc2UgNyAqLworI2RlZmluZSBNSURJX0NUTF9HRU5FUkFMX1BVUlBPU0U4ICAgICAJMHg1MwkvKio8IEdlbmVyYWwgcHVycG9zZSA4ICovCisjZGVmaW5lIE1JRElfQ1RMX1BPUlRBTUVOVE9fQ09OVFJPTAkweDU0CS8qKjwgUG9ydGFtZW50byBjb250cm9sICovCisjZGVmaW5lIE1JRElfQ1RMX0UxX1JFVkVSQl9ERVBUSAkweDViCS8qKjwgRTEgUmV2ZXJiIERlcHRoICovCisjZGVmaW5lIE1JRElfQ1RMX0UyX1RSRU1PTE9fREVQVEgJMHg1YwkvKio8IEUyIFRyZW1vbG8gRGVwdGggKi8KKyNkZWZpbmUgTUlESV9DVExfRTNfQ0hPUlVTX0RFUFRICTB4NWQJLyoqPCBFMyBDaG9ydXMgRGVwdGggKi8KKyNkZWZpbmUgTUlESV9DVExfRTRfREVUVU5FX0RFUFRICTB4NWUJLyoqPCBFNCBEZXR1bmUgRGVwdGggKi8KKyNkZWZpbmUgTUlESV9DVExfRTVfUEhBU0VSX0RFUFRICTB4NWYJLyoqPCBFNSBQaGFzZXIgRGVwdGggKi8KKyNkZWZpbmUgTUlESV9DVExfREFUQV9JTkNSRU1FTlQgICAgICAgCTB4NjAJLyoqPCBEYXRhIEluY3JlbWVudCAqLworI2RlZmluZSBNSURJX0NUTF9EQVRBX0RFQ1JFTUVOVCAgICAgICAJMHg2MQkvKio8IERhdGEgRGVjcmVtZW50ICovCisjZGVmaW5lIE1JRElfQ1RMX05PTlJFR19QQVJNX05VTV9MU0IgIAkweDYyCS8qKjwgTm9uLXJlZ2lzdGVyZWQgcGFyYW1ldGVyIG51bWJlciAqLworI2RlZmluZSBNSURJX0NUTF9OT05SRUdfUEFSTV9OVU1fTVNCICAJMHg2MwkvKio8IE5vbi1yZWdpc3RlcmVkIHBhcmFtZXRlciBudW1iZXIgKi8KKyNkZWZpbmUgTUlESV9DVExfUkVHSVNUX1BBUk1fTlVNX0xTQiAgCTB4NjQJLyoqPCBSZWdpc3RlcmVkIHBhcmFtZXRlciBudW1iZXIgKi8KKyNkZWZpbmUgTUlESV9DVExfUkVHSVNUX1BBUk1fTlVNX01TQgkweDY1CS8qKjwgUmVnaXN0ZXJlZCBwYXJhbWV0ZXIgbnVtYmVyICovCisjZGVmaW5lIE1JRElfQ1RMX0FMTF9TT1VORFNfT0ZGCQkweDc4CS8qKjwgQWxsIHNvdW5kcyBvZmYgKi8KKyNkZWZpbmUgTUlESV9DVExfUkVTRVRfQ09OVFJPTExFUlMJMHg3OQkvKio8IFJlc2V0IENvbnRyb2xsZXJzICovCisjZGVmaW5lIE1JRElfQ1RMX0xPQ0FMX0NPTlRST0xfU1dJVENICTB4N2EJLyoqPCBMb2NhbCBjb250cm9sIHN3aXRjaCAqLworI2RlZmluZSBNSURJX0NUTF9BTExfTk9URVNfT0ZGCQkweDdiCS8qKjwgQWxsIG5vdGVzIG9mZiAqLworI2RlZmluZSBNSURJX0NUTF9PTU5JX09GRgkJMHg3YwkvKio8IE9tbmkgb2ZmICovCisjZGVmaW5lIE1JRElfQ1RMX09NTklfT04JCTB4N2QJLyoqPCBPbW5pIG9uICovCisjZGVmaW5lIE1JRElfQ1RMX01PTk8xCQkJMHg3ZQkvKio8IE1vbm8xICovCisjZGVmaW5lIE1JRElfQ1RMX01PTk8yCQkJMHg3ZgkvKio8IE1vbm8yICovCisKKy8qKiBcfSAqLworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9BU09VTkRFRl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvYXNvdW5kbGliLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvYXNvdW5kbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjODYwYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9hc291bmRsaWIuaApAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvYXNvdW5kbGliLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BU09VTkRMSUJfSAorI2RlZmluZSBfX0FTT1VORExJQl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSA8YWxzYS9hc291bmRlZi5oPgorI2luY2x1ZGUgPGFsc2EvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGFsc2EvZ2xvYmFsLmg+CisjaW5jbHVkZSA8YWxzYS9pbnB1dC5oPgorI2luY2x1ZGUgPGFsc2Evb3V0cHV0Lmg+CisjaW5jbHVkZSA8YWxzYS9lcnJvci5oPgorI2luY2x1ZGUgPGFsc2EvY29uZi5oPgorI2luY2x1ZGUgPGFsc2EvcGNtLmg+CisjaW5jbHVkZSA8YWxzYS9yYXdtaWRpLmg+CisjaW5jbHVkZSA8YWxzYS90aW1lci5oPgorI2luY2x1ZGUgPGFsc2EvaHdkZXAuaD4KKyNpbmNsdWRlIDxhbHNhL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxhbHNhL21peGVyLmg+CisjaW5jbHVkZSA8YWxzYS9zZXFfZXZlbnQuaD4KKyNpbmNsdWRlIDxhbHNhL3NlcS5oPgorI2luY2x1ZGUgPGFsc2Evc2VxbWlkLmg+CisjaW5jbHVkZSA8YWxzYS9zZXFfbWlkaV9ldmVudC5oPgorCisjZW5kaWYgLyogX19BU09VTkRMSUJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2NvbmYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9jb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyNzBmNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9jb25mLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9jb25mLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX0NPTkZfSAorI2RlZmluZSBfX0FMU0FfQ09ORl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIENvbmZpZyBDb25maWd1cmF0aW9uIEludGVyZmFjZQorICogIFRoZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyBhbmQgdHlwZXMgYWxsb3cgeW91IHRvIHJlYWQsIGVudW1lcmF0ZSwKKyAqICBtb2RpZnkgYW5kIHdyaXRlIHRoZSBjb250ZW50cyBvZiBBTFNBIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgKiAgXHsKKyAqLworCisvKiogXGJyaWVmIFxjIGRsc3ltIHZlcnNpb24gZm9yIHRoZSBjb25maWcgZXZhbHVhdGUgY2FsbGJhY2suICovCisjZGVmaW5lIFNORF9DT05GSUdfRExTWU1fVkVSU0lPTl9FVkFMVUFURQlfZGxzeW1fY29uZmlnX2V2YWx1YXRlXzAwMQorLyoqIFxicmllZiBcYyBkbHN5bSB2ZXJzaW9uIGZvciB0aGUgY29uZmlnIGhvb2sgY2FsbGJhY2suICovCisjZGVmaW5lIFNORF9DT05GSUdfRExTWU1fVkVSU0lPTl9IT09LCQlfZGxzeW1fY29uZmlnX2hvb2tfMDAxCisKKy8qKiBcYnJpZWYgQ29uZmlndXJhdGlvbiBub2RlIHR5cGUuICovCit0eXBlZGVmIGVudW0gX3NuZF9jb25maWdfdHlwZSB7CisJLyoqIEludGVnZXIgbnVtYmVyLiAqLworICAgICAgICBTTkRfQ09ORklHX1RZUEVfSU5URUdFUiwKKwkvKiogNjQtYml0IGludGVnZXIgbnVtYmVyLiAqLworICAgICAgICBTTkRfQ09ORklHX1RZUEVfSU5URUdFUjY0LAorCS8qKiBSZWFsIG51bWJlci4gKi8KKyAgICAgICAgU05EX0NPTkZJR19UWVBFX1JFQUwsCisJLyoqIENoYXJhY3RlciBzdHJpbmcuICovCisgICAgICAgIFNORF9DT05GSUdfVFlQRV9TVFJJTkcsCisgICAgICAgIC8qKiBQb2ludGVyIChydW50aW1lIG9ubHksIGNhbm5vdCBiZSBzYXZlZCkuICovCisgICAgICAgIFNORF9DT05GSUdfVFlQRV9QT0lOVEVSLAorCS8qKiBDb21wb3VuZCBub2RlLiAqLworCVNORF9DT05GSUdfVFlQRV9DT01QT1VORCA9IDEwMjQKK30gc25kX2NvbmZpZ190eXBlX3Q7CisKKy8qKgorICogXGJyaWVmIEludGVybmFsIHN0cnVjdHVyZSBmb3IgYSBjb25maWd1cmF0aW9uIG5vZGUgb2JqZWN0LgorICoKKyAqIFRoZSBBTFNBIGxpYnJhcnkgdXNlcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUgYXMgYSBoYW5kbGUgdG8gYQorICogY29uZmlndXJhdGlvbiBub2RlLiBBcHBsaWNhdGlvbnMgZG9uJ3QgYWNjZXNzIGl0cyBjb250ZW50cyBkaXJlY3RseS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9jb25maWcgc25kX2NvbmZpZ190OworLyoqCisgKiBcYnJpZWYgVHlwZSBmb3IgYSBjb25maWd1cmF0aW9uIGNvbXBvdW5kIGl0ZXJhdG9yLgorICoKKyAqIFRoZSBBTFNBIGxpYnJhcnkgdXNlcyB0aGlzIHBvaW50ZXIgdHlwZSBhcyBhIGhhbmRsZSB0byBhIGNvbmZpZ3VyYXRpb24KKyAqIGNvbXBvdW5kIGl0ZXJhdG9yLiBBcHBsaWNhdGlvbnMgZG9uJ3QgZGlyZWN0bHkgYWNjZXNzIHRoZSBjb250ZW50cyBvZgorICogdGhlIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoaXMgdHlwZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9jb25maWdfaXRlcmF0b3IgKnNuZF9jb25maWdfaXRlcmF0b3JfdDsKKy8qKgorICogXGJyaWVmIEludGVybmFsIHN0cnVjdHVyZSBmb3IgYSBjb25maWd1cmF0aW9uIHByaXZhdGUgdXBkYXRlIG9iamVjdC4KKyAqCisgKiBUaGUgQUxTQSBsaWJyYXJ5IHVzZXMgdGhpcyBzdHJ1Y3R1cmUgdG8gc2F2ZSBwcml2YXRlIHVwZGF0ZSBpbmZvcm1hdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9jb25maWdfdXBkYXRlIHNuZF9jb25maWdfdXBkYXRlX3Q7CisKK2V4dGVybiBzbmRfY29uZmlnX3QgKnNuZF9jb25maWc7CisKK2ludCBzbmRfY29uZmlnX3RvcChzbmRfY29uZmlnX3QgKipjb25maWcpOworCitpbnQgc25kX2NvbmZpZ19sb2FkKHNuZF9jb25maWdfdCAqY29uZmlnLCBzbmRfaW5wdXRfdCAqaW4pOworaW50IHNuZF9jb25maWdfbG9hZF9vdmVycmlkZShzbmRfY29uZmlnX3QgKmNvbmZpZywgc25kX2lucHV0X3QgKmluKTsKK2ludCBzbmRfY29uZmlnX3NhdmUoc25kX2NvbmZpZ190ICpjb25maWcsIHNuZF9vdXRwdXRfdCAqb3V0KTsKK2ludCBzbmRfY29uZmlnX3VwZGF0ZSh2b2lkKTsKK2ludCBzbmRfY29uZmlnX3VwZGF0ZV9yKHNuZF9jb25maWdfdCAqKnRvcCwgc25kX2NvbmZpZ191cGRhdGVfdCAqKnVwZGF0ZSwgY29uc3QgY2hhciAqcGF0aCk7CitpbnQgc25kX2NvbmZpZ191cGRhdGVfZnJlZShzbmRfY29uZmlnX3VwZGF0ZV90ICp1cGRhdGUpOworaW50IHNuZF9jb25maWdfdXBkYXRlX2ZyZWVfZ2xvYmFsKHZvaWQpOworCitpbnQgc25kX2NvbmZpZ19zZWFyY2goc25kX2NvbmZpZ190ICpjb25maWcsIGNvbnN0IGNoYXIgKmtleSwKKwkJICAgICAgc25kX2NvbmZpZ190ICoqcmVzdWx0KTsKK2ludCBzbmRfY29uZmlnX3NlYXJjaHYoc25kX2NvbmZpZ190ICpjb25maWcsIAorCQkgICAgICAgc25kX2NvbmZpZ190ICoqcmVzdWx0LCAuLi4pOworaW50IHNuZF9jb25maWdfc2VhcmNoX2RlZmluaXRpb24oc25kX2NvbmZpZ190ICpjb25maWcsCisJCQkJIGNvbnN0IGNoYXIgKmJhc2UsIGNvbnN0IGNoYXIgKmtleSwKKwkJCQkgc25kX2NvbmZpZ190ICoqcmVzdWx0KTsKKworaW50IHNuZF9jb25maWdfZXhwYW5kKHNuZF9jb25maWdfdCAqY29uZmlnLCBzbmRfY29uZmlnX3QgKnJvb3QsCisJCSAgICAgIGNvbnN0IGNoYXIgKmFyZ3MsIHNuZF9jb25maWdfdCAqcHJpdmF0ZV9kYXRhLAorCQkgICAgICBzbmRfY29uZmlnX3QgKipyZXN1bHQpOworaW50IHNuZF9jb25maWdfZXZhbHVhdGUoc25kX2NvbmZpZ190ICpjb25maWcsIHNuZF9jb25maWdfdCAqcm9vdCwKKwkJCXNuZF9jb25maWdfdCAqcHJpdmF0ZV9kYXRhLCBzbmRfY29uZmlnX3QgKipyZXN1bHQpOworCitpbnQgc25kX2NvbmZpZ19hZGQoc25kX2NvbmZpZ190ICpjb25maWcsIHNuZF9jb25maWdfdCAqbGVhZik7CitpbnQgc25kX2NvbmZpZ19kZWxldGUoc25kX2NvbmZpZ190ICpjb25maWcpOworaW50IHNuZF9jb25maWdfZGVsZXRlX2NvbXBvdW5kX21lbWJlcnMoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcpOworaW50IHNuZF9jb25maWdfY29weShzbmRfY29uZmlnX3QgKipkc3QsIHNuZF9jb25maWdfdCAqc3JjKTsKKworaW50IHNuZF9jb25maWdfbWFrZShzbmRfY29uZmlnX3QgKipjb25maWcsIGNvbnN0IGNoYXIgKmtleSwKKwkJICAgIHNuZF9jb25maWdfdHlwZV90IHR5cGUpOworaW50IHNuZF9jb25maWdfbWFrZV9pbnRlZ2VyKHNuZF9jb25maWdfdCAqKmNvbmZpZywgY29uc3QgY2hhciAqa2V5KTsKK2ludCBzbmRfY29uZmlnX21ha2VfaW50ZWdlcjY0KHNuZF9jb25maWdfdCAqKmNvbmZpZywgY29uc3QgY2hhciAqa2V5KTsKK2ludCBzbmRfY29uZmlnX21ha2VfcmVhbChzbmRfY29uZmlnX3QgKipjb25maWcsIGNvbnN0IGNoYXIgKmtleSk7CitpbnQgc25kX2NvbmZpZ19tYWtlX3N0cmluZyhzbmRfY29uZmlnX3QgKipjb25maWcsIGNvbnN0IGNoYXIgKmtleSk7CitpbnQgc25kX2NvbmZpZ19tYWtlX3BvaW50ZXIoc25kX2NvbmZpZ190ICoqY29uZmlnLCBjb25zdCBjaGFyICprZXkpOworaW50IHNuZF9jb25maWdfbWFrZV9jb21wb3VuZChzbmRfY29uZmlnX3QgKipjb25maWcsIGNvbnN0IGNoYXIgKmtleSwgaW50IGpvaW4pOworCitpbnQgc25kX2NvbmZpZ19pbWFrZV9pbnRlZ2VyKHNuZF9jb25maWdfdCAqKmNvbmZpZywgY29uc3QgY2hhciAqa2V5LCBjb25zdCBsb25nIHZhbHVlKTsKK2ludCBzbmRfY29uZmlnX2ltYWtlX2ludGVnZXI2NChzbmRfY29uZmlnX3QgKipjb25maWcsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgbG9uZyBsb25nIHZhbHVlKTsKK2ludCBzbmRfY29uZmlnX2ltYWtlX3JlYWwoc25kX2NvbmZpZ190ICoqY29uZmlnLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGRvdWJsZSB2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19pbWFrZV9zdHJpbmcoc25kX2NvbmZpZ190ICoqY29uZmlnLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKmFzY2lpKTsKK2ludCBzbmRfY29uZmlnX2ltYWtlX3BvaW50ZXIoc25kX2NvbmZpZ190ICoqY29uZmlnLCBjb25zdCBjaGFyICprZXksIGNvbnN0IHZvaWQgKnB0cik7CisKK3NuZF9jb25maWdfdHlwZV90IHNuZF9jb25maWdfZ2V0X3R5cGUoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcpOworCitpbnQgc25kX2NvbmZpZ19zZXRfaWQoc25kX2NvbmZpZ190ICpjb25maWcsIGNvbnN0IGNoYXIgKmlkKTsKK2ludCBzbmRfY29uZmlnX3NldF9pbnRlZ2VyKHNuZF9jb25maWdfdCAqY29uZmlnLCBsb25nIHZhbHVlKTsKK2ludCBzbmRfY29uZmlnX3NldF9pbnRlZ2VyNjQoc25kX2NvbmZpZ190ICpjb25maWcsIGxvbmcgbG9uZyB2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19zZXRfcmVhbChzbmRfY29uZmlnX3QgKmNvbmZpZywgZG91YmxlIHZhbHVlKTsKK2ludCBzbmRfY29uZmlnX3NldF9zdHJpbmcoc25kX2NvbmZpZ190ICpjb25maWcsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2ludCBzbmRfY29uZmlnX3NldF9hc2NpaShzbmRfY29uZmlnX3QgKmNvbmZpZywgY29uc3QgY2hhciAqYXNjaWkpOworaW50IHNuZF9jb25maWdfc2V0X3BvaW50ZXIoc25kX2NvbmZpZ190ICpjb25maWcsIGNvbnN0IHZvaWQgKnB0cik7CitpbnQgc25kX2NvbmZpZ19nZXRfaWQoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcsIGNvbnN0IGNoYXIgKip2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19nZXRfaW50ZWdlcihjb25zdCBzbmRfY29uZmlnX3QgKmNvbmZpZywgbG9uZyAqdmFsdWUpOworaW50IHNuZF9jb25maWdfZ2V0X2ludGVnZXI2NChjb25zdCBzbmRfY29uZmlnX3QgKmNvbmZpZywgbG9uZyBsb25nICp2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19nZXRfcmVhbChjb25zdCBzbmRfY29uZmlnX3QgKmNvbmZpZywgZG91YmxlICp2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19nZXRfaXJlYWwoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcsIGRvdWJsZSAqdmFsdWUpOworaW50IHNuZF9jb25maWdfZ2V0X3N0cmluZyhjb25zdCBzbmRfY29uZmlnX3QgKmNvbmZpZywgY29uc3QgY2hhciAqKnZhbHVlKTsKK2ludCBzbmRfY29uZmlnX2dldF9hc2NpaShjb25zdCBzbmRfY29uZmlnX3QgKmNvbmZpZywgY2hhciAqKnZhbHVlKTsKK2ludCBzbmRfY29uZmlnX2dldF9wb2ludGVyKGNvbnN0IHNuZF9jb25maWdfdCAqY29uZmlnLCBjb25zdCB2b2lkICoqdmFsdWUpOworaW50IHNuZF9jb25maWdfdGVzdF9pZChjb25zdCBzbmRfY29uZmlnX3QgKmNvbmZpZywgY29uc3QgY2hhciAqaWQpOworCitzbmRfY29uZmlnX2l0ZXJhdG9yX3Qgc25kX2NvbmZpZ19pdGVyYXRvcl9maXJzdChjb25zdCBzbmRfY29uZmlnX3QgKm5vZGUpOworc25kX2NvbmZpZ19pdGVyYXRvcl90IHNuZF9jb25maWdfaXRlcmF0b3JfbmV4dChjb25zdCBzbmRfY29uZmlnX2l0ZXJhdG9yX3QgaXRlcmF0b3IpOworc25kX2NvbmZpZ19pdGVyYXRvcl90IHNuZF9jb25maWdfaXRlcmF0b3JfZW5kKGNvbnN0IHNuZF9jb25maWdfdCAqbm9kZSk7CitzbmRfY29uZmlnX3QgKnNuZF9jb25maWdfaXRlcmF0b3JfZW50cnkoY29uc3Qgc25kX2NvbmZpZ19pdGVyYXRvcl90IGl0ZXJhdG9yKTsKKworLyoqCisgKiBcYnJpZWYgSGVscGVyIG1hY3JvIHRvIGl0ZXJhdGUgb3ZlciB0aGUgY2hpbGRyZW4gb2YgYSBjb21wb3VuZCBub2RlLgorICogXHBhcmFtW2luLG91dF0gcG9zIEl0ZXJhdG9yIHZhcmlhYmxlIGZvciB0aGUgY3VycmVudCBub2RlLgorICogXHBhcmFtW2luLG91dF0gbmV4dCBUZW1wb3JhcnkgaXRlcmF0b3IgdmFyaWFibGUgZm9yIHRoZSBuZXh0IG5vZGUuCisgKiBccGFyYW1baW5dIG5vZGUgSGFuZGxlIHRvIHRoZSBjb21wb3VuZCBjb25maWd1cmF0aW9uIG5vZGUgdG8gaXRlcmF0ZSBvdmVyLgorICoKKyAqIFVzZSB0aGlzIG1hY3JvIGxpa2UgYSBcYyBmb3Igc3RhdGVtZW50LCBlLmcuOgorICogXGNvZGUKKyAqIHNuZF9jb25maWdfaXRlcmF0b3JfdCBwb3MsIG5leHQ7CisgKiBzbmRfY29uZmlnX2Zvcl9lYWNoKHBvcywgbmV4dCwgbm9kZSkgeworICogICAgIHNuZF9jb25maWdfdCAqZW50cnkgPSBzbmRfY29uZmlnX2l0ZXJhdG9yX2VudHJ5KHBvcyk7CisgKiAgICAgLi4uCisgKiB9CisgKiBcZW5kY29kZQorICoKKyAqIFRoaXMgbWFjcm8gYWxsb3dzIGRlbGV0aW5nIG9yIHJlbW92aW5nIHRoZSBjdXJyZW50IG5vZGUuCisgKi8KKyNkZWZpbmUgc25kX2NvbmZpZ19mb3JfZWFjaChwb3MsIG5leHQsIG5vZGUpIFwKKwlmb3IgKHBvcyA9IHNuZF9jb25maWdfaXRlcmF0b3JfZmlyc3Qobm9kZSksIG5leHQgPSBzbmRfY29uZmlnX2l0ZXJhdG9yX25leHQocG9zKTsgcG9zICE9IHNuZF9jb25maWdfaXRlcmF0b3JfZW5kKG5vZGUpOyBwb3MgPSBuZXh0LCBuZXh0ID0gc25kX2NvbmZpZ19pdGVyYXRvcl9uZXh0KHBvcykpCisKKy8qIE1pc2MgZnVuY3Rpb25zICovCisKK2ludCBzbmRfY29uZmlnX2dldF9ib29sX2FzY2lpKGNvbnN0IGNoYXIgKmFzY2lpKTsKK2ludCBzbmRfY29uZmlnX2dldF9ib29sKGNvbnN0IHNuZF9jb25maWdfdCAqY29uZik7CitpbnQgc25kX2NvbmZpZ19nZXRfY3RsX2lmYWNlX2FzY2lpKGNvbnN0IGNoYXIgKmFzY2lpKTsKK2ludCBzbmRfY29uZmlnX2dldF9jdGxfaWZhY2UoY29uc3Qgc25kX2NvbmZpZ190ICpjb25mKTsKKworLyogTmFtZXMgZnVuY3Rpb25zICovCisKKy8qKgorICogRGV2aWNlLW5hbWUgbGlzdCBlbGVtZW50CisgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9kZXZuYW1lIHNuZF9kZXZuYW1lX3Q7CisKKy8qKgorICogRGV2aWNlLW5hbWUgbGlzdCBlbGVtZW50IChkZWZpbml0aW9uKQorICovCitzdHJ1Y3Qgc25kX2Rldm5hbWUgeworCWNoYXIgKm5hbWU7CS8qKjwgRGV2aWNlIG5hbWUgc3RyaW5nICovCisJY2hhciAqY29tbWVudDsJLyoqPCBDb21tZW50cyAqLworCXNuZF9kZXZuYW1lX3QgKm5leHQ7CS8qKjwgTmV4dCBwb2ludGVyICovCit9OworCitpbnQgc25kX25hbWVzX2xpc3QoY29uc3QgY2hhciAqaWZhY2UsIHNuZF9kZXZuYW1lX3QgKipsaXN0KTsKK3ZvaWQgc25kX25hbWVzX2xpc3RfZnJlZShzbmRfZGV2bmFtZV90ICpsaXN0KTsKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfQ09ORl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvY29udHJvbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2NvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODg2MjlkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2NvbnRyb2wuaApAQCAtMCwwICsxLDU5MCBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL2NvbnRyb2wuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfQ09OVFJPTF9ICisjZGVmaW5lIF9fQUxTQV9DT05UUk9MX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgQ29udHJvbCBDb250cm9sIEludGVyZmFjZQorICogIFRoZSBjb250cm9sIGludGVyZmFjZS4KKyAqICBTZWUgXHJlZiBjb250cm9sIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICBceworICovCisKKy8qKiBkbHN5bSB2ZXJzaW9uIGZvciBpbnRlcmZhY2UgZW50cnkgY2FsbGJhY2sgKi8KKyNkZWZpbmUgU05EX0NPTlRST0xfRExTWU1fVkVSU0lPTglfZGxzeW1fY29udHJvbF8wMDEKKworLyoqIElFQzk1OCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9hZXNfaWVjOTU4IHsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1c1syNF07CS8qKjwgQUVTL0lFQzk1OCBjaGFubmVsIHN0YXR1cyBiaXRzICovCisJdW5zaWduZWQgY2hhciBzdWJjb2RlWzE0N107CS8qKjwgQUVTL0lFQzk1OCBzdWJjb2RlIGJpdHMgKi8KKwl1bnNpZ25lZCBjaGFyIHBhZDsJCS8qKjwgbm90aGluZyAqLworCXVuc2lnbmVkIGNoYXIgZGlnX3N1YmZyYW1lWzRdOwkvKio8IEFFUy9JRUM5NTggc3ViZnJhbWUgYml0cyAqLworfSBzbmRfYWVzX2llYzk1OF90OworCisvKiogQ1RMIGNhcmQgaW5mbyBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfY3RsX2NhcmRfaW5mbyBzbmRfY3RsX2NhcmRfaW5mb190OworCisvKiogQ1RMIGVsZW1lbnQgaWRlbnRpZmllciBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfY3RsX2VsZW1faWQgc25kX2N0bF9lbGVtX2lkX3Q7CisKKy8qKiBDVEwgZWxlbWVudCBpZGVudGlmaWVyIGxpc3QgY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX2N0bF9lbGVtX2xpc3Qgc25kX2N0bF9lbGVtX2xpc3RfdDsKKworLyoqIENUTCBlbGVtZW50IGluZm8gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX2N0bF9lbGVtX2luZm8gc25kX2N0bF9lbGVtX2luZm9fdDsKKworLyoqIENUTCBlbGVtZW50IHZhbHVlIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9jdGxfZWxlbV92YWx1ZSBzbmRfY3RsX2VsZW1fdmFsdWVfdDsKKworLyoqIENUTCBldmVudCBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfY3RsX2V2ZW50IHNuZF9jdGxfZXZlbnRfdDsKKworLyoqIENUTCBlbGVtZW50IHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX2N0bF9lbGVtX3R5cGUgeworCS8qKiBJbnZhbGlkIHR5cGUgKi8KKwlTTkRfQ1RMX0VMRU1fVFlQRV9OT05FID0gMCwKKwkvKiogQm9vbGVhbiBjb250ZW50cyAqLworCVNORF9DVExfRUxFTV9UWVBFX0JPT0xFQU4sCisJLyoqIEludGVnZXIgY29udGVudHMgKi8KKwlTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSLAorCS8qKiBFbnVtZXJhdGVkIGNvbnRlbnRzICovCisJU05EX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRCwKKwkvKiogQnl0ZXMgY29udGVudHMgKi8KKwlTTkRfQ1RMX0VMRU1fVFlQRV9CWVRFUywKKwkvKiogSUVDOTU4IChTL1BESUYpIHNldHRpbmcgY29udGVudCAqLworCVNORF9DVExfRUxFTV9UWVBFX0lFQzk1OCwKKwkvKiogNjQtYml0IGludGVnZXIgY29udGVudHMgKi8KKwlTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSNjQsCisJU05EX0NUTF9FTEVNX1RZUEVfTEFTVCA9IFNORF9DVExfRUxFTV9UWVBFX0lOVEVHRVI2NAorfSBzbmRfY3RsX2VsZW1fdHlwZV90OworCisvKiogQ1RMIHJlbGF0ZWQgaW50ZXJmYWNlICovCit0eXBlZGVmIGVudW0gX3NuZF9jdGxfZWxlbV9pZmFjZSB7CisJLyoqIENhcmQgbGV2ZWwgKi8KKwlTTkRfQ1RMX0VMRU1fSUZBQ0VfQ0FSRCA9IDAsCisJLyoqIEhhcmR3YXJlIGRlcGVuZGVudCBkZXZpY2UgKi8KKwlTTkRfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsCisJLyoqIE1peGVyICovCisJU05EX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS8qKiBQQ00gKi8KKwlTTkRfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS8qKiBSYXdNaWRpICovCisJU05EX0NUTF9FTEVNX0lGQUNFX1JBV01JREksCisJLyoqIFRpbWVyICovCisJU05EX0NUTF9FTEVNX0lGQUNFX1RJTUVSLAorCS8qKiBTZXF1ZW5jZXIgKi8KKwlTTkRfQ1RMX0VMRU1fSUZBQ0VfU0VRVUVOQ0VSLAorCVNORF9DVExfRUxFTV9JRkFDRV9MQVNUID0gU05EX0NUTF9FTEVNX0lGQUNFX1NFUVVFTkNFUgorfSBzbmRfY3RsX2VsZW1faWZhY2VfdDsKKworLyoqIEV2ZW50IGNsYXNzICovCit0eXBlZGVmIGVudW0gX3NuZF9jdGxfZXZlbnRfdHlwZSB7CisJLyoqIEVsZW1lbnRzIHJlbGF0ZWQgZXZlbnQgKi8KKwlTTkRfQ1RMX0VWRU5UX0VMRU0gPSAwLAorCVNORF9DVExfRVZFTlRfTEFTVCA9IFNORF9DVExfRVZFTlRfRUxFTQorfXNuZF9jdGxfZXZlbnRfdHlwZV90OworCisvKiogRWxlbWVudCBoYXMgYmVlbiByZW1vdmVkIChXYXJuaW5nOiB0ZXN0IHRoaXMgZmlyc3QgYW5kIGlmIHNldCBkb24ndAorICAqIHRlc3QgdGhlIG90aGVyIG1hc2tzKSBcaGlkZWluaXRpYWxpemVyICovCisjZGVmaW5lIFNORF9DVExfRVZFTlRfTUFTS19SRU1PVkUgCSh+MFUpCisvKiogRWxlbWVudCB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9FVkVOVF9NQVNLX1ZBTFVFCSgxPDwwKQorLyoqIEVsZW1lbnQgaW5mbyBoYXMgYmVlbiBjaGFuZ2VkIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9FVkVOVF9NQVNLX0lORk8JCSgxPDwxKQorLyoqIEVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgXGhpZGVpbml0aWFsaXplciAqLworI2RlZmluZSBTTkRfQ1RMX0VWRU5UX01BU0tfQURECQkoMTw8MikKKy8qKiBFbGVtZW50J3MgVExWIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgXGhpZGVpbml0aWFsaXplciAqLworI2RlZmluZSBTTkRfQ1RMX0VWRU5UX01BU0tfVExWCQkoMTw8MykKKworLyoqIENUTCBuYW1lIGhlbHBlciAqLworI2RlZmluZSBTTkRfQ1RMX05BTUVfTk9ORQkJCQkiIgorLyoqIENUTCBuYW1lIGhlbHBlciAqLworI2RlZmluZSBTTkRfQ1RMX05BTUVfUExBWUJBQ0sJCQkJIlBsYXliYWNrICIKKy8qKiBDVEwgbmFtZSBoZWxwZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9OQU1FX0NBUFRVUkUJCQkJIkNhcHR1cmUgIgorCisvKiogQ1RMIG5hbWUgaGVscGVyICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NThfTk9ORQkJCSIiCisvKiogQ1RMIG5hbWUgaGVscGVyICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NThfU1dJVENICQkJIlN3aXRjaCIKKy8qKiBDVEwgbmFtZSBoZWxwZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9OQU1FX0lFQzk1OF9WT0xVTUUJCQkiVm9sdW1lIgorLyoqIENUTCBuYW1lIGhlbHBlciAqLworI2RlZmluZSBTTkRfQ1RMX05BTUVfSUVDOTU4X0RFRkFVTFQJCQkiRGVmYXVsdCIKKy8qKiBDVEwgbmFtZSBoZWxwZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9OQU1FX0lFQzk1OF9NQVNLCQkJIk1hc2siCisvKiogQ1RMIG5hbWUgaGVscGVyICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NThfQ09OX01BU0sJCQkiQ29uIE1hc2siCisvKiogQ1RMIG5hbWUgaGVscGVyICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NThfUFJPX01BU0sJCQkiUHJvIE1hc2siCisvKiogQ1RMIG5hbWUgaGVscGVyICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NThfUENNX1NUUkVBTQkJCSJQQ00gU3RyZWFtIgorLyoqIEVsZW1lbnQgbmFtZSBmb3IgSUVDOTU4IChTL1BESUYpICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NTgoZXhwbCxkaXJlY3Rpb24sd2hhdCkJIklFQzk1OCAiIGV4cGwgU05EX0NUTF9OQU1FXyMjZGlyZWN0aW9uIFNORF9DVExfTkFNRV9JRUM5NThfIyN3aGF0CisKKy8qKiBNYXNrIGZvciB0aGUgbWFqb3IgUG93ZXIgU3RhdGUgaWRlbnRpZmllciAqLworI2RlZmluZSBTTkRfQ1RMX1BPV0VSX01BU0sJCTB4ZmYwMAorLyoqIEFDUEkvUENJIFBvd2VyIFN0YXRlIEQwICovCisjZGVmaW5lIFNORF9DVExfUE9XRVJfRDAgICAgICAgICAgCTB4MDAwMAorLyoqIEFDUEkvUENJIFBvd2VyIFN0YXRlIEQxICovCisjZGVmaW5lIFNORF9DVExfUE9XRVJfRDEgICAgIAkgICAgIAkweDAxMDAKKy8qKiBBQ1BJL1BDSSBQb3dlciBTdGF0ZSBEMiAqLworI2RlZmluZSBTTkRfQ1RMX1BPV0VSX0QyIAkgICAgICAgIDB4MDIwMAorLyoqIEFDUEkvUENJIFBvd2VyIFN0YXRlIEQzICovCisjZGVmaW5lIFNORF9DVExfUE9XRVJfRDMgICAgICAgICAJMHgwMzAwCisvKiogQUNQSS9QQ0kgUG93ZXIgU3RhdGUgRDNob3QgKi8KKyNkZWZpbmUgU05EX0NUTF9QT1dFUl9EM2hvdAkJKFNORF9DVExfUE9XRVJfRDN8MHgwMDAwKQorLyoqIEFDUEkvUENJIFBvd2VyIFN0YXRlIEQzY29sZCAqLworI2RlZmluZSBTTkRfQ1RMX1BPV0VSX0QzY29sZAkgICAgICAJKFNORF9DVExfUE9XRVJfRDN8MHgwMDAxKQorCisvKiogVExWIHR5cGUgLSBDb250YWluZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9UTFZUX0NPTlRBSU5FUgkJMHgwMDAwCisvKiogVExWIHR5cGUgLSBiYXNpYyBkQiBzY2FsZSAqLworI2RlZmluZSBTTkRfQ1RMX1RMVlRfREJfU0NBTEUJCTB4MDAwMQorLyoqIFRMViB0eXBlIC0gbGluZWFyIHZvbHVtZSAqLworI2RlZmluZSBTTkRfQ1RMX1RMVlRfREJfTElORUFSCQkweDAwMDIKKy8qKiBUTFYgdHlwZSAtIGRCIHJhbmdlIGNvbnRhaW5lciAqLworI2RlZmluZSBTTkRfQ1RMX1RMVlRfREJfUkFOR0UJCTB4MDAwMworLyoqIFRMViB0eXBlIC0gZEIgc2NhbGUgc3BlY2lmaWVkIGJ5IG1pbi9tYXggdmFsdWVzICovCisjZGVmaW5lIFNORF9DVExfVExWVF9EQl9NSU5NQVgJCTB4MDAwNAorLyoqIFRMViB0eXBlIC0gZEIgc2NhbGUgc3BlY2lmaWVkIGJ5IG1pbi9tYXggdmFsdWVzICh3aXRoIG11dGUpICovCisjZGVmaW5lIFNORF9DVExfVExWVF9EQl9NSU5NQVhfTVVURQkweDAwMDUKKworLyoqIE11dGUgc3RhdGUgKi8KKyNkZWZpbmUgU05EX0NUTF9UTFZfREJfR0FJTl9NVVRFCS05OTk5OTk5CisKKy8qKiBDVEwgdHlwZSAqLwordHlwZWRlZiBlbnVtIF9zbmRfY3RsX3R5cGUgeworCS8qKiBLZXJuZWwgbGV2ZWwgQ1RMICovCisJU05EX0NUTF9UWVBFX0hXLAorCS8qKiBTaGFyZWQgbWVtb3J5IGNsaWVudCBDVEwgKi8KKwlTTkRfQ1RMX1RZUEVfU0hNLAorCS8qKiBJTkVUIGNsaWVudCBDVEwgKG5vdCB5ZXQgaW1wbGVtZW50ZWQpICovCisJU05EX0NUTF9UWVBFX0lORVQsCisJLyoqIEV4dGVybmFsIGNvbnRyb2wgcGx1Z2luICovCisJU05EX0NUTF9UWVBFX0VYVAorfSBzbmRfY3RsX3R5cGVfdDsKKworLyoqIE5vbiBibG9ja2luZyBtb2RlIChmbGFnIGZvciBvcGVuIG1vZGUpIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9OT05CTE9DSwkJMHgwMDAxCisKKy8qKiBBc3luYyBub3RpZmljYXRpb24gKGZsYWcgZm9yIG9wZW4gbW9kZSkgXGhpZGVpbml0aWFsaXplciAqLworI2RlZmluZSBTTkRfQ1RMX0FTWU5DCQkJMHgwMDAyCisKKy8qKiBSZWFkIG9ubHkgKGZsYWcgZm9yIG9wZW4gbW9kZSkgXGhpZGVpbml0aWFsaXplciAqLworI2RlZmluZSBTTkRfQ1RMX1JFQURPTkxZCQkweDAwMDQKKworLyoqIENUTCBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfY3RsIHNuZF9jdGxfdDsKKworLyoqIERvbid0IGRlc3Ryb3kgdGhlIGN0bCBoYW5kbGUgd2hlbiBjbG9zZSAqLworI2RlZmluZSBTTkRfU0NUTF9OT0ZSRUUJCQkweDAwMDEKKworLyoqIFNDVEwgdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9zY3RsIHNuZF9zY3RsX3Q7CisKK2ludCBzbmRfY2FyZF9sb2FkKGludCBjYXJkKTsKK2ludCBzbmRfY2FyZF9uZXh0KGludCAqY2FyZCk7CitpbnQgc25kX2NhcmRfZ2V0X2luZGV4KGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHNuZF9jYXJkX2dldF9uYW1lKGludCBjYXJkLCBjaGFyICoqbmFtZSk7CitpbnQgc25kX2NhcmRfZ2V0X2xvbmduYW1lKGludCBjYXJkLCBjaGFyICoqbmFtZSk7CisKK2ludCBzbmRfZGV2aWNlX25hbWVfaGludChpbnQgY2FyZCwgY29uc3QgY2hhciAqaWZhY2UsIHZvaWQgKioqaGludHMpOworaW50IHNuZF9kZXZpY2VfbmFtZV9mcmVlX2hpbnQodm9pZCAqKmhpbnRzKTsKK2NoYXIgKnNuZF9kZXZpY2VfbmFtZV9nZXRfaGludChjb25zdCB2b2lkICpoaW50LCBjb25zdCBjaGFyICppZCk7CisKK2ludCBzbmRfY3RsX29wZW4oc25kX2N0bF90ICoqY3RsLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSk7CitpbnQgc25kX2N0bF9vcGVuX2xjb25mKHNuZF9jdGxfdCAqKmN0bCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUsIHNuZF9jb25maWdfdCAqbGNvbmYpOworaW50IHNuZF9jdGxfb3Blbl9mYWxsYmFjayhzbmRfY3RsX3QgKipjdGwsIHNuZF9jb25maWdfdCAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqb3JpZ19uYW1lLCBpbnQgbW9kZSk7CitpbnQgc25kX2N0bF9jbG9zZShzbmRfY3RsX3QgKmN0bCk7CitpbnQgc25kX2N0bF9ub25ibG9jayhzbmRfY3RsX3QgKmN0bCwgaW50IG5vbmJsb2NrKTsKK2ludCBzbmRfYXN5bmNfYWRkX2N0bF9oYW5kbGVyKHNuZF9hc3luY19oYW5kbGVyX3QgKipoYW5kbGVyLCBzbmRfY3RsX3QgKmN0bCwgCisJCQkgICAgICBzbmRfYXN5bmNfY2FsbGJhY2tfdCBjYWxsYmFjaywgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKK3NuZF9jdGxfdCAqc25kX2FzeW5jX2hhbmRsZXJfZ2V0X2N0bChzbmRfYXN5bmNfaGFuZGxlcl90ICpoYW5kbGVyKTsKK2ludCBzbmRfY3RsX3BvbGxfZGVzY3JpcHRvcnNfY291bnQoc25kX2N0bF90ICpjdGwpOworaW50IHNuZF9jdGxfcG9sbF9kZXNjcmlwdG9ycyhzbmRfY3RsX3QgKmN0bCwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IHNwYWNlKTsKK2ludCBzbmRfY3RsX3BvbGxfZGVzY3JpcHRvcnNfcmV2ZW50cyhzbmRfY3RsX3QgKmN0bCwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IG5mZHMsIHVuc2lnbmVkIHNob3J0ICpyZXZlbnRzKTsKK2ludCBzbmRfY3RsX3N1YnNjcmliZV9ldmVudHMoc25kX2N0bF90ICpjdGwsIGludCBzdWJzY3JpYmUpOworaW50IHNuZF9jdGxfY2FyZF9pbmZvKHNuZF9jdGxfdCAqY3RsLCBzbmRfY3RsX2NhcmRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfY3RsX2VsZW1fbGlzdChzbmRfY3RsX3QgKmN0bCwgc25kX2N0bF9lbGVtX2xpc3RfdCAqbGlzdCk7CitpbnQgc25kX2N0bF9lbGVtX2luZm8oc25kX2N0bF90ICpjdGwsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKmluZm8pOworaW50IHNuZF9jdGxfZWxlbV9yZWFkKHNuZF9jdGxfdCAqY3RsLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdmFsdWUpOworaW50IHNuZF9jdGxfZWxlbV93cml0ZShzbmRfY3RsX3QgKmN0bCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnZhbHVlKTsKK2ludCBzbmRfY3RsX2VsZW1fbG9jayhzbmRfY3RsX3QgKmN0bCwgc25kX2N0bF9lbGVtX2lkX3QgKmlkKTsKK2ludCBzbmRfY3RsX2VsZW1fdW5sb2NrKHNuZF9jdGxfdCAqY3RsLCBzbmRfY3RsX2VsZW1faWRfdCAqaWQpOworaW50IHNuZF9jdGxfZWxlbV90bHZfcmVhZChzbmRfY3RsX3QgKmN0bCwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKmlkLAorCQkJICB1bnNpZ25lZCBpbnQgKnRsdiwgdW5zaWduZWQgaW50IHRsdl9zaXplKTsKK2ludCBzbmRfY3RsX2VsZW1fdGx2X3dyaXRlKHNuZF9jdGxfdCAqY3RsLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsCisJCQkgICBjb25zdCB1bnNpZ25lZCBpbnQgKnRsdik7CitpbnQgc25kX2N0bF9lbGVtX3Rsdl9jb21tYW5kKHNuZF9jdGxfdCAqY3RsLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsCisJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqdGx2KTsKKyNpZmRlZiBfX0FMU0FfSFdERVBfSAoraW50IHNuZF9jdGxfaHdkZXBfbmV4dF9kZXZpY2Uoc25kX2N0bF90ICpjdGwsIGludCAqIGRldmljZSk7CitpbnQgc25kX2N0bF9od2RlcF9pbmZvKHNuZF9jdGxfdCAqY3RsLCBzbmRfaHdkZXBfaW5mb190ICogaW5mbyk7CisjZW5kaWYKKyNpZmRlZiBfX0FMU0FfUENNX0gKK2ludCBzbmRfY3RsX3BjbV9uZXh0X2RldmljZShzbmRfY3RsX3QgKmN0bCwgaW50ICpkZXZpY2UpOworaW50IHNuZF9jdGxfcGNtX2luZm8oc25kX2N0bF90ICpjdGwsIHNuZF9wY21faW5mb190ICogaW5mbyk7CitpbnQgc25kX2N0bF9wY21fcHJlZmVyX3N1YmRldmljZShzbmRfY3RsX3QgKmN0bCwgaW50IHN1YmRldik7CisjZW5kaWYKKyNpZmRlZiBfX0FMU0FfUkFXTUlESV9ICitpbnQgc25kX2N0bF9yYXdtaWRpX25leHRfZGV2aWNlKHNuZF9jdGxfdCAqY3RsLCBpbnQgKiBkZXZpY2UpOworaW50IHNuZF9jdGxfcmF3bWlkaV9pbmZvKHNuZF9jdGxfdCAqY3RsLCBzbmRfcmF3bWlkaV9pbmZvX3QgKiBpbmZvKTsKK2ludCBzbmRfY3RsX3Jhd21pZGlfcHJlZmVyX3N1YmRldmljZShzbmRfY3RsX3QgKmN0bCwgaW50IHN1YmRldik7CisjZW5kaWYKK2ludCBzbmRfY3RsX3NldF9wb3dlcl9zdGF0ZShzbmRfY3RsX3QgKmN0bCwgdW5zaWduZWQgaW50IHN0YXRlKTsKK2ludCBzbmRfY3RsX2dldF9wb3dlcl9zdGF0ZShzbmRfY3RsX3QgKmN0bCwgdW5zaWduZWQgaW50ICpzdGF0ZSk7CisKK2ludCBzbmRfY3RsX3JlYWQoc25kX2N0bF90ICpjdGwsIHNuZF9jdGxfZXZlbnRfdCAqZXZlbnQpOworaW50IHNuZF9jdGxfd2FpdChzbmRfY3RsX3QgKmN0bCwgaW50IHRpbWVvdXQpOworY29uc3QgY2hhciAqc25kX2N0bF9uYW1lKHNuZF9jdGxfdCAqY3RsKTsKK3NuZF9jdGxfdHlwZV90IHNuZF9jdGxfdHlwZShzbmRfY3RsX3QgKmN0bCk7CisKK2NvbnN0IGNoYXIgKnNuZF9jdGxfZWxlbV90eXBlX25hbWUoc25kX2N0bF9lbGVtX3R5cGVfdCB0eXBlKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfZWxlbV9pZmFjZV9uYW1lKHNuZF9jdGxfZWxlbV9pZmFjZV90IGlmYWNlKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfZXZlbnRfdHlwZV9uYW1lKHNuZF9jdGxfZXZlbnRfdHlwZV90IHR5cGUpOworCit1bnNpZ25lZCBpbnQgc25kX2N0bF9ldmVudF9lbGVtX2dldF9tYXNrKGNvbnN0IHNuZF9jdGxfZXZlbnRfdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2V2ZW50X2VsZW1fZ2V0X251bWlkKGNvbnN0IHNuZF9jdGxfZXZlbnRfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9ldmVudF9lbGVtX2dldF9pZChjb25zdCBzbmRfY3RsX2V2ZW50X3QgKm9iaiwgc25kX2N0bF9lbGVtX2lkX3QgKnB0cik7CitzbmRfY3RsX2VsZW1faWZhY2VfdCBzbmRfY3RsX2V2ZW50X2VsZW1fZ2V0X2ludGVyZmFjZShjb25zdCBzbmRfY3RsX2V2ZW50X3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9ldmVudF9lbGVtX2dldF9kZXZpY2UoY29uc3Qgc25kX2N0bF9ldmVudF90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZXZlbnRfZWxlbV9nZXRfc3ViZGV2aWNlKGNvbnN0IHNuZF9jdGxfZXZlbnRfdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfZXZlbnRfZWxlbV9nZXRfbmFtZShjb25zdCBzbmRfY3RsX2V2ZW50X3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9ldmVudF9lbGVtX2dldF9pbmRleChjb25zdCBzbmRfY3RsX2V2ZW50X3QgKm9iaik7CisKK2ludCBzbmRfY3RsX2VsZW1fbGlzdF9hbGxvY19zcGFjZShzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCBlbnRyaWVzKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2xpc3RfZnJlZV9zcGFjZShzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmopOworCitjaGFyICpzbmRfY3RsX2FzY2lpX2VsZW1faWRfZ2V0KHNuZF9jdGxfZWxlbV9pZF90ICppZCk7CitpbnQgc25kX2N0bF9hc2NpaV9lbGVtX2lkX3BhcnNlKHNuZF9jdGxfZWxlbV9pZF90ICpkc3QsIGNvbnN0IGNoYXIgKnN0cik7CitpbnQgc25kX2N0bF9hc2NpaV92YWx1ZV9wYXJzZShzbmRfY3RsX3QgKmhhbmRsZSwKKwkJCSAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICpkc3QsCisJCQkgICAgICBzbmRfY3RsX2VsZW1faW5mb190ICppbmZvLAorCQkJICAgICAgY29uc3QgY2hhciAqdmFsdWUpOworCitzaXplX3Qgc25kX2N0bF9lbGVtX2lkX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX2N0bF9lbGVtX2lkX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfY3RsX2VsZW1faWRfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX2N0bF9lbGVtX2lkKQoraW50IHNuZF9jdGxfZWxlbV9pZF9tYWxsb2Moc25kX2N0bF9lbGVtX2lkX3QgKipwdHIpOwordm9pZCBzbmRfY3RsX2VsZW1faWRfZnJlZShzbmRfY3RsX2VsZW1faWRfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2lkX2NsZWFyKHNuZF9jdGxfZWxlbV9pZF90ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1faWRfY29weShzbmRfY3RsX2VsZW1faWRfdCAqZHN0LCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqc3JjKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1faWRfZ2V0X251bWlkKGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICpvYmopOworc25kX2N0bF9lbGVtX2lmYWNlX3Qgc25kX2N0bF9lbGVtX2lkX2dldF9pbnRlcmZhY2UoY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX2lkX2dldF9kZXZpY2UoY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX2lkX2dldF9zdWJkZXZpY2UoY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfY3RsX2VsZW1faWRfZ2V0X25hbWUoY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX2lkX2dldF9pbmRleChjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2lkX3NldF9udW1pZChzbmRfY3RsX2VsZW1faWRfdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2lkX3NldF9pbnRlcmZhY2Uoc25kX2N0bF9lbGVtX2lkX3QgKm9iaiwgc25kX2N0bF9lbGVtX2lmYWNlX3QgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2lkX3NldF9kZXZpY2Uoc25kX2N0bF9lbGVtX2lkX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV9pZF9zZXRfc3ViZGV2aWNlKHNuZF9jdGxfZWxlbV9pZF90ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1faWRfc2V0X25hbWUoc25kX2N0bF9lbGVtX2lkX3QgKm9iaiwgY29uc3QgY2hhciAqdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2lkX3NldF9pbmRleChzbmRfY3RsX2VsZW1faWRfdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworc2l6ZV90IHNuZF9jdGxfY2FyZF9pbmZvX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX2N0bF9jYXJkX2luZm9fdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9jdGxfY2FyZF9pbmZvX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF9jdGxfY2FyZF9pbmZvKQoraW50IHNuZF9jdGxfY2FyZF9pbmZvX21hbGxvYyhzbmRfY3RsX2NhcmRfaW5mb190ICoqcHRyKTsKK3ZvaWQgc25kX2N0bF9jYXJkX2luZm9fZnJlZShzbmRfY3RsX2NhcmRfaW5mb190ICpvYmopOwordm9pZCBzbmRfY3RsX2NhcmRfaW5mb19jbGVhcihzbmRfY3RsX2NhcmRfaW5mb190ICpvYmopOwordm9pZCBzbmRfY3RsX2NhcmRfaW5mb19jb3B5KHNuZF9jdGxfY2FyZF9pbmZvX3QgKmRzdCwgY29uc3Qgc25kX2N0bF9jYXJkX2luZm9fdCAqc3JjKTsKK2ludCBzbmRfY3RsX2NhcmRfaW5mb19nZXRfY2FyZChjb25zdCBzbmRfY3RsX2NhcmRfaW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX2N0bF9jYXJkX2luZm9fZ2V0X2lkKGNvbnN0IHNuZF9jdGxfY2FyZF9pbmZvX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfY3RsX2NhcmRfaW5mb19nZXRfZHJpdmVyKGNvbnN0IHNuZF9jdGxfY2FyZF9pbmZvX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfY3RsX2NhcmRfaW5mb19nZXRfbmFtZShjb25zdCBzbmRfY3RsX2NhcmRfaW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX2N0bF9jYXJkX2luZm9fZ2V0X2xvbmduYW1lKGNvbnN0IHNuZF9jdGxfY2FyZF9pbmZvX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfY3RsX2NhcmRfaW5mb19nZXRfbWl4ZXJuYW1lKGNvbnN0IHNuZF9jdGxfY2FyZF9pbmZvX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfY3RsX2NhcmRfaW5mb19nZXRfY29tcG9uZW50cyhjb25zdCBzbmRfY3RsX2NhcmRfaW5mb190ICpvYmopOworCitzaXplX3Qgc25kX2N0bF9ldmVudF9zaXplb2Yodm9pZCk7CisvKiogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIGFsbG9jYXRlIGFuIGludmFsaWQgI3NuZF9jdGxfZXZlbnRfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9jdGxfZXZlbnRfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX2N0bF9ldmVudCkKK2ludCBzbmRfY3RsX2V2ZW50X21hbGxvYyhzbmRfY3RsX2V2ZW50X3QgKipwdHIpOwordm9pZCBzbmRfY3RsX2V2ZW50X2ZyZWUoc25kX2N0bF9ldmVudF90ICpvYmopOwordm9pZCBzbmRfY3RsX2V2ZW50X2NsZWFyKHNuZF9jdGxfZXZlbnRfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9ldmVudF9jb3B5KHNuZF9jdGxfZXZlbnRfdCAqZHN0LCBjb25zdCBzbmRfY3RsX2V2ZW50X3QgKnNyYyk7CitzbmRfY3RsX2V2ZW50X3R5cGVfdCBzbmRfY3RsX2V2ZW50X2dldF90eXBlKGNvbnN0IHNuZF9jdGxfZXZlbnRfdCAqb2JqKTsKKworc2l6ZV90IHNuZF9jdGxfZWxlbV9saXN0X3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX2N0bF9lbGVtX2xpc3RfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9jdGxfZWxlbV9saXN0X2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF9jdGxfZWxlbV9saXN0KQoraW50IHNuZF9jdGxfZWxlbV9saXN0X21hbGxvYyhzbmRfY3RsX2VsZW1fbGlzdF90ICoqcHRyKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2xpc3RfZnJlZShzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1fbGlzdF9jbGVhcihzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1fbGlzdF9jb3B5KHNuZF9jdGxfZWxlbV9saXN0X3QgKmRzdCwgY29uc3Qgc25kX2N0bF9lbGVtX2xpc3RfdCAqc3JjKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2xpc3Rfc2V0X29mZnNldChzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9saXN0X2dldF91c2VkKGNvbnN0IHNuZF9jdGxfZWxlbV9saXN0X3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX2xpc3RfZ2V0X2NvdW50KGNvbnN0IHNuZF9jdGxfZWxlbV9saXN0X3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZWxlbV9saXN0X2dldF9pZChjb25zdCBzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCBpZHgsIHNuZF9jdGxfZWxlbV9pZF90ICpwdHIpOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9saXN0X2dldF9udW1pZChjb25zdCBzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCBpZHgpOworc25kX2N0bF9lbGVtX2lmYWNlX3Qgc25kX2N0bF9lbGVtX2xpc3RfZ2V0X2ludGVyZmFjZShjb25zdCBzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCBpZHgpOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9saXN0X2dldF9kZXZpY2UoY29uc3Qgc25kX2N0bF9lbGVtX2xpc3RfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4KTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1fbGlzdF9nZXRfc3ViZGV2aWNlKGNvbnN0IHNuZF9jdGxfZWxlbV9saXN0X3QgKm9iaiwgdW5zaWduZWQgaW50IGlkeCk7Citjb25zdCBjaGFyICpzbmRfY3RsX2VsZW1fbGlzdF9nZXRfbmFtZShjb25zdCBzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCBpZHgpOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9saXN0X2dldF9pbmRleChjb25zdCBzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCBpZHgpOworCitzaXplX3Qgc25kX2N0bF9lbGVtX2luZm9fc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfY3RsX2VsZW1faW5mb190IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX2N0bF9lbGVtX2luZm9fYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX2N0bF9lbGVtX2luZm8pCitpbnQgc25kX2N0bF9lbGVtX2luZm9fbWFsbG9jKHNuZF9jdGxfZWxlbV9pbmZvX3QgKipwdHIpOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19mcmVlKHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZWxlbV9pbmZvX2NsZWFyKHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZWxlbV9pbmZvX2NvcHkoc25kX2N0bF9lbGVtX2luZm9fdCAqZHN0LCBjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpzcmMpOworc25kX2N0bF9lbGVtX3R5cGVfdCBzbmRfY3RsX2VsZW1faW5mb19nZXRfdHlwZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworaW50IHNuZF9jdGxfZWxlbV9pbmZvX2lzX3JlYWRhYmxlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfd3JpdGFibGUoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK2ludCBzbmRfY3RsX2VsZW1faW5mb19pc192b2xhdGlsZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworaW50IHNuZF9jdGxfZWxlbV9pbmZvX2lzX2luYWN0aXZlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfbG9ja2VkKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfdGx2X3JlYWRhYmxlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfdGx2X3dyaXRhYmxlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfdGx2X2NvbW1hbmRhYmxlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfb3duZXIoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK2ludCBzbmRfY3RsX2VsZW1faW5mb19pc191c2VyKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitwaWRfdCBzbmRfY3RsX2VsZW1faW5mb19nZXRfb3duZXIoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1faW5mb19nZXRfY291bnQoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK2xvbmcgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21pbihjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworbG9uZyBzbmRfY3RsX2VsZW1faW5mb19nZXRfbWF4KGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Citsb25nIHNuZF9jdGxfZWxlbV9pbmZvX2dldF9zdGVwKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Citsb25nIGxvbmcgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21pbjY0KGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Citsb25nIGxvbmcgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21heDY0KGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Citsb25nIGxvbmcgc25kX2N0bF9lbGVtX2luZm9fZ2V0X3N0ZXA2NChjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pdGVtcyhjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19zZXRfaXRlbShzbmRfY3RsX2VsZW1faW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOworY29uc3QgY2hhciAqc25kX2N0bF9lbGVtX2luZm9fZ2V0X2l0ZW1fbmFtZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworaW50IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9kaW1lbnNpb25zKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9fZ2V0X2RpbWVuc2lvbihjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmosIHVuc2lnbmVkIGludCBpZHgpOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19nZXRfaWQoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqLCBzbmRfY3RsX2VsZW1faWRfdCAqcHRyKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1faW5mb19nZXRfbnVtaWQoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK3NuZF9jdGxfZWxlbV9pZmFjZV90IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pbnRlcmZhY2UoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1faW5mb19nZXRfZGV2aWNlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX2luZm9fZ2V0X3N1YmRldmljZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX2N0bF9lbGVtX2luZm9fZ2V0X25hbWUoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1faW5mb19nZXRfaW5kZXgoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2luZm9fc2V0X2lkKHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaiwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKnB0cik7Cit2b2lkIHNuZF9jdGxfZWxlbV9pbmZvX3NldF9udW1pZChzbmRfY3RsX2VsZW1faW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19zZXRfaW50ZXJmYWNlKHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaiwgc25kX2N0bF9lbGVtX2lmYWNlX3QgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2luZm9fc2V0X2RldmljZShzbmRfY3RsX2VsZW1faW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19zZXRfc3ViZGV2aWNlKHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV9pbmZvX3NldF9uYW1lKHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaiwgY29uc3QgY2hhciAqdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2luZm9fc2V0X2luZGV4KHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7CisKK2ludCBzbmRfY3RsX2VsZW1fYWRkX2ludGVnZXIoc25kX2N0bF90ICpjdGwsIGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICppZCwgdW5zaWduZWQgaW50IGNvdW50LCBsb25nIGltaW4sIGxvbmcgaW1heCwgbG9uZyBpc3RlcCk7CitpbnQgc25kX2N0bF9lbGVtX2FkZF9pbnRlZ2VyNjQoc25kX2N0bF90ICpjdGwsIGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICppZCwgdW5zaWduZWQgaW50IGNvdW50LCBsb25nIGxvbmcgaW1pbiwgbG9uZyBsb25nIGltYXgsIGxvbmcgbG9uZyBpc3RlcCk7CitpbnQgc25kX2N0bF9lbGVtX2FkZF9ib29sZWFuKHNuZF9jdGxfdCAqY3RsLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsIHVuc2lnbmVkIGludCBjb3VudCk7CitpbnQgc25kX2N0bF9lbGVtX2FkZF9lbnVtZXJhdGVkKHNuZF9jdGxfdCAqY3RsLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50IGl0ZW1zLCBjb25zdCBjaGFyICpjb25zdCBuYW1lc1tdKTsKK2ludCBzbmRfY3RsX2VsZW1fYWRkX2llYzk1OChzbmRfY3RsX3QgKmN0bCwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKmlkKTsKK2ludCBzbmRfY3RsX2VsZW1fcmVtb3ZlKHNuZF9jdGxfdCAqY3RsLCBzbmRfY3RsX2VsZW1faWRfdCAqaWQpOworCitzaXplX3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX2N0bF9lbGVtX3ZhbHVlX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfY3RsX2VsZW1fdmFsdWVfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX2N0bF9lbGVtX3ZhbHVlKQoraW50IHNuZF9jdGxfZWxlbV92YWx1ZV9tYWxsb2Moc25kX2N0bF9lbGVtX3ZhbHVlX3QgKipwdHIpOwordm9pZCBzbmRfY3RsX2VsZW1fdmFsdWVfZnJlZShzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX2NsZWFyKHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1fdmFsdWVfY29weShzbmRfY3RsX2VsZW1fdmFsdWVfdCAqZHN0LCBjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqc3JjKTsKK2ludCBzbmRfY3RsX2VsZW1fdmFsdWVfY29tcGFyZShzbmRfY3RsX2VsZW1fdmFsdWVfdCAqbGVmdCwgY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnJpZ2h0KTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9pZChjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCBzbmRfY3RsX2VsZW1faWRfdCAqcHRyKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X251bWlkKGNvbnN0IHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmopOworc25kX2N0bF9lbGVtX2lmYWNlX3Qgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9pbnRlcmZhY2UoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9kZXZpY2UoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9zdWJkZXZpY2UoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X25hbWUoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9pbmRleChjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pZChzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqcHRyKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9udW1pZChzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pbnRlcmZhY2Uoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgc25kX2N0bF9lbGVtX2lmYWNlX3QgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9kZXZpY2Uoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfc3ViZGV2aWNlKHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X25hbWUoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgY29uc3QgY2hhciAqdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pbmRleChzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2Jvb2xlYW4oY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IGlkeCk7Citsb25nIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfaW50ZWdlcihjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4KTsKK2xvbmcgbG9uZyBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2ludGVnZXI2NChjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4KTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2VudW1lcmF0ZWQoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IGlkeCk7Cit1bnNpZ25lZCBjaGFyIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfYnl0ZShjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4KTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9ib29sZWFuKHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHVuc2lnbmVkIGludCBpZHgsIGxvbmcgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pbnRlZ2VyKHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHVuc2lnbmVkIGludCBpZHgsIGxvbmcgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pbnRlZ2VyNjQoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IGlkeCwgbG9uZyBsb25nIHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfZW51bWVyYXRlZChzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBpbnQgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9ieXRlKHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHVuc2lnbmVkIGludCBpZHgsIHVuc2lnbmVkIGNoYXIgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3NldF9ieXRlcyhzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Citjb25zdCB2b2lkICogc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9ieXRlcyhjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9pZWM5NTgoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgc25kX2Flc19pZWM5NThfdCAqcHRyKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pZWM5NTgoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgY29uc3Qgc25kX2Flc19pZWM5NThfdCAqcHRyKTsKKworaW50IHNuZF90bHZfcGFyc2VfZEJfaW5mbyh1bnNpZ25lZCBpbnQgKnRsdiwgdW5zaWduZWQgaW50IHRsdl9zaXplLAorCQkJICB1bnNpZ25lZCBpbnQgKipkYl90bHZwKTsKK2ludCBzbmRfdGx2X2dldF9kQl9yYW5nZSh1bnNpZ25lZCBpbnQgKnRsdiwgbG9uZyByYW5nZW1pbiwgbG9uZyByYW5nZW1heCwKKwkJCSBsb25nICptaW4sIGxvbmcgKm1heCk7CitpbnQgc25kX3Rsdl9jb252ZXJ0X3RvX2RCKHVuc2lnbmVkIGludCAqdGx2LCBsb25nIHJhbmdlbWluLCBsb25nIHJhbmdlbWF4LAorCQkJICBsb25nIHZvbHVtZSwgbG9uZyAqZGJfZ2Fpbik7CitpbnQgc25kX3Rsdl9jb252ZXJ0X2Zyb21fZEIodW5zaWduZWQgaW50ICp0bHYsIGxvbmcgcmFuZ2VtaW4sIGxvbmcgcmFuZ2VtYXgsCisJCQkgICAgbG9uZyBkYl9nYWluLCBsb25nICp2YWx1ZSwgaW50IHhkaXIpOworaW50IHNuZF9jdGxfZ2V0X2RCX3JhbmdlKHNuZF9jdGxfdCAqY3RsLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsCisJCQkgbG9uZyAqbWluLCBsb25nICptYXgpOworaW50IHNuZF9jdGxfY29udmVydF90b19kQihzbmRfY3RsX3QgKmN0bCwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKmlkLAorCQkJICBsb25nIHZvbHVtZSwgbG9uZyAqZGJfZ2Fpbik7CitpbnQgc25kX2N0bF9jb252ZXJ0X2Zyb21fZEIoc25kX2N0bF90ICpjdGwsIGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICppZCwKKwkJCSAgICBsb25nIGRiX2dhaW4sIGxvbmcgKnZhbHVlLCBpbnQgeGRpcik7CisKKy8qKgorICogIFxkZWZncm91cCBIQ29udHJvbCBIaWdoIGxldmVsIENvbnRyb2wgSW50ZXJmYWNlCisgKiAgXGluZ3JvdXAgQ29udHJvbAorICogIFRoZSBoaWdoIGxldmVsIGNvbnRyb2wgaW50ZXJmYWNlLgorICogIFNlZSBccmVmIGhjb250cm9sIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICBceworICovCisKKy8qKiBIQ1RMIGVsZW1lbnQgaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX2hjdGxfZWxlbSBzbmRfaGN0bF9lbGVtX3Q7CisKKy8qKiBIQ1RMIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9oY3RsIHNuZF9oY3RsX3Q7CisKKy8qKgorICogXGJyaWVmIENvbXBhcmUgZnVuY3Rpb24gZm9yIHNvcnRpbmcgSENUTCBlbGVtZW50cworICogXHBhcmFtIGUxIEZpcnN0IGVsZW1lbnQKKyAqIFxwYXJhbSBlMiBTZWNvbmQgZWxlbWVudAorICogXHJldHVybiAtMSBpZiBlMSA8IGUyLCAwIGlmIGUxID09IGUyLCAxIGlmIGUxID4gZTIKKyAqLwordHlwZWRlZiBpbnQgKCpzbmRfaGN0bF9jb21wYXJlX3QpKGNvbnN0IHNuZF9oY3RsX2VsZW1fdCAqZTEsCisJCQkJICBjb25zdCBzbmRfaGN0bF9lbGVtX3QgKmUyKTsKK2ludCBzbmRfaGN0bF9jb21wYXJlX2Zhc3QoY29uc3Qgc25kX2hjdGxfZWxlbV90ICpjMSwKKwkJCSAgY29uc3Qgc25kX2hjdGxfZWxlbV90ICpjMik7CisvKiogCisgKiBcYnJpZWYgSENUTCBjYWxsYmFjayBmdW5jdGlvbgorICogXHBhcmFtIGhjdGwgSENUTCBoYW5kbGUKKyAqIFxwYXJhbSBtYXNrIGV2ZW50IG1hc2sKKyAqIFxwYXJhbSBlbGVtIHJlbGF0ZWQgSENUTCBlbGVtZW50IChpZiBhbnkpCisgKiBccmV0dXJuIDAgb24gc3VjY2VzcyBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KK3R5cGVkZWYgaW50ICgqc25kX2hjdGxfY2FsbGJhY2tfdCkoc25kX2hjdGxfdCAqaGN0bCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbWFzaywKKwkJCQkgICBzbmRfaGN0bF9lbGVtX3QgKmVsZW0pOworLyoqIAorICogXGJyaWVmIEhDVEwgZWxlbWVudCBjYWxsYmFjayBmdW5jdGlvbgorICogXHBhcmFtIGVsZW0gSENUTCBlbGVtZW50CisgKiBccGFyYW0gbWFzayBldmVudCBtYXNrCisgKiBccmV0dXJuIDAgb24gc3VjY2VzcyBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KK3R5cGVkZWYgaW50ICgqc25kX2hjdGxfZWxlbV9jYWxsYmFja190KShzbmRfaGN0bF9lbGVtX3QgKmVsZW0sCisJCQkJCXVuc2lnbmVkIGludCBtYXNrKTsKKworaW50IHNuZF9oY3RsX29wZW4oc25kX2hjdGxfdCAqKmhjdGwsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlKTsKK2ludCBzbmRfaGN0bF9vcGVuX2N0bChzbmRfaGN0bF90ICoqaGN0bHAsIHNuZF9jdGxfdCAqY3RsKTsKK2ludCBzbmRfaGN0bF9jbG9zZShzbmRfaGN0bF90ICpoY3RsKTsKK2ludCBzbmRfaGN0bF9ub25ibG9jayhzbmRfaGN0bF90ICpoY3RsLCBpbnQgbm9uYmxvY2spOworaW50IHNuZF9oY3RsX3BvbGxfZGVzY3JpcHRvcnNfY291bnQoc25kX2hjdGxfdCAqaGN0bCk7CitpbnQgc25kX2hjdGxfcG9sbF9kZXNjcmlwdG9ycyhzbmRfaGN0bF90ICpoY3RsLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgc3BhY2UpOworaW50IHNuZF9oY3RsX3BvbGxfZGVzY3JpcHRvcnNfcmV2ZW50cyhzbmRfaGN0bF90ICpjdGwsIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqcmV2ZW50cyk7Cit1bnNpZ25lZCBpbnQgc25kX2hjdGxfZ2V0X2NvdW50KHNuZF9oY3RsX3QgKmhjdGwpOworaW50IHNuZF9oY3RsX3NldF9jb21wYXJlKHNuZF9oY3RsX3QgKmhjdGwsIHNuZF9oY3RsX2NvbXBhcmVfdCBoc29ydCk7CitzbmRfaGN0bF9lbGVtX3QgKnNuZF9oY3RsX2ZpcnN0X2VsZW0oc25kX2hjdGxfdCAqaGN0bCk7CitzbmRfaGN0bF9lbGVtX3QgKnNuZF9oY3RsX2xhc3RfZWxlbShzbmRfaGN0bF90ICpoY3RsKTsKK3NuZF9oY3RsX2VsZW1fdCAqc25kX2hjdGxfZmluZF9lbGVtKHNuZF9oY3RsX3QgKmhjdGwsIGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICppZCk7Cit2b2lkIHNuZF9oY3RsX3NldF9jYWxsYmFjayhzbmRfaGN0bF90ICpoY3RsLCBzbmRfaGN0bF9jYWxsYmFja190IGNhbGxiYWNrKTsKK3ZvaWQgc25kX2hjdGxfc2V0X2NhbGxiYWNrX3ByaXZhdGUoc25kX2hjdGxfdCAqaGN0bCwgdm9pZCAqZGF0YSk7Cit2b2lkICpzbmRfaGN0bF9nZXRfY2FsbGJhY2tfcHJpdmF0ZShzbmRfaGN0bF90ICpoY3RsKTsKK2ludCBzbmRfaGN0bF9sb2FkKHNuZF9oY3RsX3QgKmhjdGwpOworaW50IHNuZF9oY3RsX2ZyZWUoc25kX2hjdGxfdCAqaGN0bCk7CitpbnQgc25kX2hjdGxfaGFuZGxlX2V2ZW50cyhzbmRfaGN0bF90ICpoY3RsKTsKK2NvbnN0IGNoYXIgKnNuZF9oY3RsX25hbWUoc25kX2hjdGxfdCAqaGN0bCk7CitpbnQgc25kX2hjdGxfd2FpdChzbmRfaGN0bF90ICpoY3RsLCBpbnQgdGltZW91dCk7CitzbmRfY3RsX3QgKnNuZF9oY3RsX2N0bChzbmRfaGN0bF90ICpoY3RsKTsKKworc25kX2hjdGxfZWxlbV90ICpzbmRfaGN0bF9lbGVtX25leHQoc25kX2hjdGxfZWxlbV90ICplbGVtKTsKK3NuZF9oY3RsX2VsZW1fdCAqc25kX2hjdGxfZWxlbV9wcmV2KHNuZF9oY3RsX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX2hjdGxfZWxlbV9pbmZvKHNuZF9oY3RsX2VsZW1fdCAqZWxlbSwgc25kX2N0bF9lbGVtX2luZm9fdCAqIGluZm8pOworaW50IHNuZF9oY3RsX2VsZW1fcmVhZChzbmRfaGN0bF9lbGVtX3QgKmVsZW0sIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdmFsdWUpOworaW50IHNuZF9oY3RsX2VsZW1fd3JpdGUoc25kX2hjdGxfZWxlbV90ICplbGVtLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHZhbHVlKTsKK2ludCBzbmRfaGN0bF9lbGVtX3Rsdl9yZWFkKHNuZF9oY3RsX2VsZW1fdCAqZWxlbSwgdW5zaWduZWQgaW50ICp0bHYsIHVuc2lnbmVkIGludCB0bHZfc2l6ZSk7CitpbnQgc25kX2hjdGxfZWxlbV90bHZfd3JpdGUoc25kX2hjdGxfZWxlbV90ICplbGVtLCBjb25zdCB1bnNpZ25lZCBpbnQgKnRsdik7CitpbnQgc25kX2hjdGxfZWxlbV90bHZfY29tbWFuZChzbmRfaGN0bF9lbGVtX3QgKmVsZW0sIGNvbnN0IHVuc2lnbmVkIGludCAqdGx2KTsKKworc25kX2hjdGxfdCAqc25kX2hjdGxfZWxlbV9nZXRfaGN0bChzbmRfaGN0bF9lbGVtX3QgKmVsZW0pOworCit2b2lkIHNuZF9oY3RsX2VsZW1fZ2V0X2lkKGNvbnN0IHNuZF9oY3RsX2VsZW1fdCAqb2JqLCBzbmRfY3RsX2VsZW1faWRfdCAqcHRyKTsKK3Vuc2lnbmVkIGludCBzbmRfaGN0bF9lbGVtX2dldF9udW1pZChjb25zdCBzbmRfaGN0bF9lbGVtX3QgKm9iaik7CitzbmRfY3RsX2VsZW1faWZhY2VfdCBzbmRfaGN0bF9lbGVtX2dldF9pbnRlcmZhY2UoY29uc3Qgc25kX2hjdGxfZWxlbV90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9oY3RsX2VsZW1fZ2V0X2RldmljZShjb25zdCBzbmRfaGN0bF9lbGVtX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2hjdGxfZWxlbV9nZXRfc3ViZGV2aWNlKGNvbnN0IHNuZF9oY3RsX2VsZW1fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9oY3RsX2VsZW1fZ2V0X25hbWUoY29uc3Qgc25kX2hjdGxfZWxlbV90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9oY3RsX2VsZW1fZ2V0X2luZGV4KGNvbnN0IHNuZF9oY3RsX2VsZW1fdCAqb2JqKTsKK3ZvaWQgc25kX2hjdGxfZWxlbV9zZXRfY2FsbGJhY2soc25kX2hjdGxfZWxlbV90ICpvYmosIHNuZF9oY3RsX2VsZW1fY2FsbGJhY2tfdCB2YWwpOwordm9pZCAqIHNuZF9oY3RsX2VsZW1fZ2V0X2NhbGxiYWNrX3ByaXZhdGUoY29uc3Qgc25kX2hjdGxfZWxlbV90ICpvYmopOwordm9pZCBzbmRfaGN0bF9lbGVtX3NldF9jYWxsYmFja19wcml2YXRlKHNuZF9oY3RsX2VsZW1fdCAqb2JqLCB2b2lkICogdmFsKTsKKworLyoqIFx9ICovCisKKy8qKiBcfSAqLworCisvKioKKyAqICBcZGVmZ3JvdXAgU0NvbnRyb2wgU2V0dXAgQ29udHJvbCBJbnRlcmZhY2UKKyAqICBcaW5ncm91cCBDb250cm9sCisgKiAgVGhlIHNldHVwIGNvbnRyb2wgaW50ZXJmYWNlIC0gc2V0IG9yIG1vZGlmeSBjb250cm9sIGVsZW1lbnRzIGZyb20gYSBjb25maWd1cmF0aW9uIGZpbGUuCisgKiAgXHsKKyAqLworCitpbnQgc25kX3NjdGxfYnVpbGQoc25kX3NjdGxfdCAqKmN0bCwgc25kX2N0bF90ICpoYW5kbGUsIHNuZF9jb25maWdfdCAqY29uZmlnLAorCQkgICBzbmRfY29uZmlnX3QgKnByaXZhdGVfZGF0YSwgaW50IG1vZGUpOworaW50IHNuZF9zY3RsX2ZyZWUoc25kX3NjdGxfdCAqaGFuZGxlKTsKK2ludCBzbmRfc2N0bF9pbnN0YWxsKHNuZF9zY3RsX3QgKmhhbmRsZSk7CitpbnQgc25kX3NjdGxfcmVtb3ZlKHNuZF9zY3RsX3QgKmhhbmRsZSk7CisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX0NPTlRST0xfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2NvbnRyb2xfZXh0ZXJuYWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9jb250cm9sX2V4dGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MwNjZjZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9jb250cm9sX2V4dGVybmFsLmgKQEAgLTAsMCArMSwyNjUgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9jb250cm9sX2V4dGVybmFsLmgKKyAqIFxicmllZiBFeHRlcm5hbCBjb250cm9sIHBsdWdpbiBTREsKKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMjAwNQorICoKKyAqIEV4dGVybmFsIGNvbnRyb2wgcGx1Z2luIFNESy4KKyAqLworCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisjaWZuZGVmIF9fQUxTQV9DT05UUk9MX0VYVEVSTkFMX0gKKyNkZWZpbmUgX19BTFNBX0NPTlRST0xfRVhURVJOQUxfSAorCisjaW5jbHVkZSAiY29udHJvbC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBDdGxQbHVnaW5fU0RLIEV4dGVybmFsIENvbnRyb2wgUGx1Z2luIFNESworICogIFx7CisgKi8KKworLyoqCisgKiBEZWZpbmUgdGhlIG9iamVjdCBlbnRyeSBmb3IgZXh0ZXJuYWwgY29udHJvbCBwbHVnaW5zCisgKi8KKyNkZWZpbmUgU05EX0NUTF9QTFVHSU5fRU5UUlkobmFtZSkgX3NuZF9jdGxfIyNuYW1lIyNfb3BlbgorCisvKioKKyAqIERlZmluZSB0aGUgc3ltYm9scyBvZiB0aGUgZ2l2ZW4gY29udHJvbCBwbHVnaW4gd2l0aCB2ZXJzaW9ucworICovCisjZGVmaW5lIFNORF9DVExfUExVR0lOX1NZTUJPTChuYW1lKSBTTkRfRExTWU1fQlVJTERfVkVSU0lPTihTTkRfQ1RMX1BMVUdJTl9FTlRSWShuYW1lKSwgU05EX0NPTlRST0xfRExTWU1fVkVSU0lPTik7CisKKy8qKgorICogRGVmaW5lIHRoZSBjb250cm9sIHBsdWdpbgorICovCisjZGVmaW5lIFNORF9DVExfUExVR0lOX0RFRklORV9GVU5DKHBsdWdpbikgXAoraW50IFNORF9DVExfUExVR0lOX0VOVFJZKHBsdWdpbikgKHNuZF9jdGxfdCAqKmhhbmRsZXAsIGNvbnN0IGNoYXIgKm5hbWUsXAorCQkJCSAgc25kX2NvbmZpZ190ICpyb290LCBzbmRfY29uZmlnX3QgKmNvbmYsIGludCBtb2RlKQorCisvKiogRXh0ZXJuYWwgY29udHJvbCBwbHVnaW4gaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBzbmRfY3RsX2V4dCBzbmRfY3RsX2V4dF90OworLyoqIENhbGxiYWNrIHRhYmxlIG9mIGNvbnRyb2wgZXh0ICovCit0eXBlZGVmIHN0cnVjdCBzbmRfY3RsX2V4dF9jYWxsYmFjayBzbmRfY3RsX2V4dF9jYWxsYmFja190OworLyoqIEtleSB0byBhY2Nlc3MgYSBjb250cm9sIHBvaW50ZXIgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzbmRfY3RsX2V4dF9rZXlfdDsKKworLyoKKyAqIFByb3RvY29sIHZlcnNpb24KKyAqLworI2RlZmluZSBTTkRfQ1RMX0VYVF9WRVJTSU9OX01BSk9SCTEJLyoqPCBQcm90b2NvbCBtYWpvciB2ZXJzaW9uICovCisjZGVmaW5lIFNORF9DVExfRVhUX1ZFUlNJT05fTUlOT1IJMAkvKio8IFByb3RvY29sIG1pbm9yIHZlcnNpb24gKi8KKyNkZWZpbmUgU05EX0NUTF9FWFRfVkVSU0lPTl9USU5ZCTAJLyoqPCBQcm90b2NvbCB0aW55IHZlcnNpb24gKi8KKy8qKgorICogZXh0ZXJuYWwgcGx1Z2luIHByb3RvY29sIHZlcnNpb24KKyAqLworI2RlZmluZSBTTkRfQ1RMX0VYVF9WRVJTSU9OCQkoKFNORF9DVExfRVhUX1ZFUlNJT05fTUFKT1I8PDE2KSB8XAorCQkJCQkgKFNORF9DVExfRVhUX1ZFUlNJT05fTUlOT1I8PDgpIHxcCisJCQkJCSAoU05EX0NUTF9FWFRfVkVSU0lPTl9USU5ZKSkKKworLyoqIEhhbmRsZSBvZiBjb250cm9sIGV4dCAqLworc3RydWN0IHNuZF9jdGxfZXh0IHsKKwkvKioKKwkgKiBwcm90b2NvbCB2ZXJzaW9uOyAjU05EX0NUTF9FWFRfVkVSU0lPTiBtdXN0IGJlIGZpbGxlZCBoZXJlCisJICogYmVmb3JlIGNhbGxpbmcgI3NuZF9jdGxfZXh0X2NyZWF0ZSgpCisJICovCisJdW5zaWduZWQgaW50IHZlcnNpb247CisJLyoqCisJICogSW5kZXggb2YgdGhpcyBjYXJkOyBtdXN0IGJlIGZpbGxlZCBiZWZvcmUgY2FsbGluZyAjc25kX2N0bF9leHRfY3JlYXRlKCkKKwkgKi8KKwlpbnQgY2FyZF9pZHg7CisJLyoqCisJICogSUQgc3RyaW5nIG9mIHRoaXMgY2FyZDsgbXVzdCBiZSBmaWxsZWQgYmVmb3JlIGNhbGxpbmcgI3NuZF9jdGxfZXh0X2NyZWF0ZSgpCisJICovCisJY2hhciBpZFsxNl07CisJLyoqCisJICogRHJpdmVyIG5hbWUgb2YgdGhpcyBjYXJkOyBtdXN0IGJlIGZpbGxlZCBiZWZvcmUgY2FsbGluZyAjc25kX2N0bF9leHRfY3JlYXRlKCkKKwkgKi8KKwljaGFyIGRyaXZlclsxNl07CisJLyoqCisJICogc2hvcnQgbmFtZSBvZiB0aGlzIGNhcmQ7IG11c3QgYmUgZmlsbGVkIGJlZm9yZSBjYWxsaW5nICNzbmRfY3RsX2V4dF9jcmVhdGUoKQorCSAqLworCWNoYXIgbmFtZVszMl07CisJLyoqCisJICogTG9uZyBuYW1lIG9mIHRoaXMgY2FyZDsgbXVzdCBiZSBmaWxsZWQgYmVmb3JlIGNhbGxpbmcgI3NuZF9jdGxfZXh0X2NyZWF0ZSgpCisJICovCisJY2hhciBsb25nbmFtZVs4MF07CisJLyoqCisJICogTWl4ZXIgbmFtZSBvZiB0aGlzIGNhcmQ7IG11c3QgYmUgZmlsbGVkIGJlZm9yZSBjYWxsaW5nICNzbmRfY3RsX2V4dF9jcmVhdGUoKQorCSAqLworCWNoYXIgbWl4ZXJuYW1lWzgwXTsKKwkvKioKKwkgKiBwb2xsIGRlc2NyaXB0b3IKKwkgKi8KKwlpbnQgcG9sbF9mZDsKKworCS8qKgorCSAqIGNhbGxiYWNrcyBvZiB0aGlzIHBsdWdpbjsgbXVzdCBiZSBmaWxsZWQgYmVmb3JlIGNhbGxpbmcgI3NuZF9wY21faW9wbHVnX2NyZWF0ZSgpCisJICovCisJY29uc3Qgc25kX2N0bF9leHRfY2FsbGJhY2tfdCAqY2FsbGJhY2s7CisJLyoqCisJICogcHJpdmF0ZSBkYXRhLCB3aGljaCBjYW4gYmUgdXNlZCBmcmVlbHkgaW4gdGhlIGRyaXZlciBjYWxsYmFja3MKKwkgKi8KKwl2b2lkICpwcml2YXRlX2RhdGE7CisJLyoqCisJICogY29udHJvbCBoYW5kbGUgZmlsbGVkIGJ5ICNzbmRfY3RsX2V4dF9jcmVhdGUoKQorCSAqLworCXNuZF9jdGxfdCAqaGFuZGxlOworCisJaW50IG5vbmJsb2NrOwkJCS8qKjwgbm9uLWJsb2NrIG1vZGU7IHJlYWQtb25seSAqLworCWludCBzdWJzY3JpYmVkOwkJCS8qKjwgZXZlbnRzIHN1YnNjcmliZWQ7IHJlYWQtb25seSAqLworfTsKKworLyoqIENhbGxiYWNrIHRhYmxlIG9mIGV4dCAqLworc3RydWN0IHNuZF9jdGxfZXh0X2NhbGxiYWNrIHsKKwkvKioKKwkgKiBjbG9zZSB0aGUgY29udHJvbCBoYW5kbGU7IG9wdGlvbmFsCisJICovCisJdm9pZCAoKmNsb3NlKShzbmRfY3RsX2V4dF90ICpleHQpOworCS8qKgorCSAqIHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzOyByZXF1aXJlZAorCSAqLworCWludCAoKmVsZW1fY291bnQpKHNuZF9jdGxfZXh0X3QgKmV4dCk7CisJLyoqCisJICogcmV0dXJuIHRoZSBlbGVtZW50IGlkIG9mIHRoZSBnaXZlbiBvZmZzZXQgKGFycmF5IGluZGV4KTsgcmVxdWlyZWQKKwkgKi8KKwlpbnQgKCplbGVtX2xpc3QpKHNuZF9jdGxfZXh0X3QgKmV4dCwgdW5zaWduZWQgaW50IG9mZnNldCwgc25kX2N0bF9lbGVtX2lkX3QgKmlkKTsKKwkvKioKKwkgKiBjb252ZXJ0IHRoZSBlbGVtZW50IGlkIHRvIGEgc2VhcmNoIGtleTsgcmVxdWlyZWQKKwkgKi8KKwlzbmRfY3RsX2V4dF9rZXlfdCAoKmZpbmRfZWxlbSkoc25kX2N0bF9leHRfdCAqZXh0LCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqaWQpOworCS8qKgorCSAqIHRoZSBkZXN0cnVjdG9yIG9mIHRoZSBrZXk7IG9wdGlvbmFsCisJICovCisJdm9pZCAoKmZyZWVfa2V5KShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSk7CisJLyoqCisJICogZ2V0IHRoZSBhdHRyaWJ1dGUgb2YgdGhlIGVsZW1lbnQ7IHJlcXVpcmVkCisJICovCisJaW50ICgqZ2V0X2F0dHJpYnV0ZSkoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksCisJCQkgICAgIGludCAqdHlwZSwgdW5zaWduZWQgaW50ICphY2MsIHVuc2lnbmVkIGludCAqY291bnQpOworCS8qKgorCSAqIGdldCB0aGUgZWxlbWVudCBpbmZvcm1hdGlvbiBvZiBpbnRlZ2VyIHR5cGUKKwkgKi8KKwlpbnQgKCpnZXRfaW50ZWdlcl9pbmZvKShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwKKwkJCQlsb25nICppbWluLCBsb25nICppbWF4LCBsb25nICppc3RlcCk7CisJLyoqCisJICogZ2V0IHRoZSBlbGVtZW50IGluZm9ybWF0aW9uIG9mIGludGVnZXI2NCB0eXBlCisJICovCisJaW50ICgqZ2V0X2ludGVnZXI2NF9pbmZvKShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwKKwkJCQkgIGludDY0X3QgKmltaW4sIGludDY0X3QgKmltYXgsIGludDY0X3QgKmlzdGVwKTsKKwkvKioKKwkgKiBnZXQgdGhlIGVsZW1lbnQgaW5mb3JtYXRpb24gb2YgZW51bWVyYXRlZCB0eXBlCisJICovCisJaW50ICgqZ2V0X2VudW1lcmF0ZWRfaW5mbykoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksIHVuc2lnbmVkIGludCAqaXRlbXMpOworCS8qKgorCSAqIGdldCB0aGUgbmFtZSBvZiB0aGUgZW51bWVyYXRlZCBpdGVtCisJICovCisJaW50ICgqZ2V0X2VudW1lcmF0ZWRfbmFtZSkoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksIHVuc2lnbmVkIGludCBpdGVtLAorCQkJCSAgIGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX21heF9sZW4pOworCS8qKgorCSAqIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIGludGVnZXIgdHlwZQorCSAqLworCWludCAoKnJlYWRfaW50ZWdlcikoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksIGxvbmcgKnZhbHVlKTsKKwkvKioKKwkgKiByZWFkIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBpbnRlZ2VyNjQgdHlwZQorCSAqLworCWludCAoKnJlYWRfaW50ZWdlcjY0KShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwgaW50NjRfdCAqdmFsdWUpOworCS8qKgorCSAqIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIGVudW1lcmF0ZWQgdHlwZQorCSAqLworCWludCAoKnJlYWRfZW51bWVyYXRlZCkoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksIHVuc2lnbmVkIGludCAqaXRlbXMpOworCS8qKgorCSAqIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIGJ5dGVzIHR5cGUKKwkgKi8KKwlpbnQgKCpyZWFkX2J5dGVzKShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCSAgc2l6ZV90IG1heF9ieXRlcyk7CisJLyoqCisJICogcmVhZCB0aGUgY3VycmVudCB2YWx1ZXMgb2YgaWVjOTU4IHR5cGUKKwkgKi8KKwlpbnQgKCpyZWFkX2llYzk1OCkoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksIHNuZF9hZXNfaWVjOTU4X3QgKmllYzk1OCk7CisJLyoqCisJICogdXBkYXRlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBpbnRlZ2VyIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzCisJICovCisJaW50ICgqd3JpdGVfaW50ZWdlcikoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksIGxvbmcgKnZhbHVlKTsKKwkvKioKKwkgKiB1cGRhdGUgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIGludGVnZXI2NCB0eXBlIHdpdGggdGhlIGdpdmVuIHZhbHVlcworCSAqLworCWludCAoKndyaXRlX2ludGVnZXI2NCkoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksIGludDY0X3QgKnZhbHVlKTsKKwkvKioKKwkgKiB1cGRhdGUgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIGVudW1lcmF0ZWQgdHlwZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMKKwkgKi8KKwlpbnQgKCp3cml0ZV9lbnVtZXJhdGVkKShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwgdW5zaWduZWQgaW50ICppdGVtcyk7CisJLyoqCisJICogdXBkYXRlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBieXRlcyB0eXBlIHdpdGggdGhlIGdpdmVuIHZhbHVlcworCSAqLworCWludCAoKndyaXRlX2J5dGVzKShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCSAgIHNpemVfdCBtYXhfYnl0ZXMpOworCS8qKgorCSAqIHVwZGF0ZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgaWVjOTU4IHR5cGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzCisJICovCisJaW50ICgqd3JpdGVfaWVjOTU4KShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwgc25kX2Flc19pZWM5NThfdCAqaWVjOTU4KTsKKwkvKioKKwkgKiBzdWJzY3JpYmUvdW5zdWJzY3JpYmUgdGhlIGV2ZW50IG5vdGlmaWNhdGlvbjsgb3B0aW9uYWwKKwkgKi8KKwl2b2lkICgqc3Vic2NyaWJlX2V2ZW50cykoc25kX2N0bF9leHRfdCAqZXh0LCBpbnQgc3Vic2NyaWJlKTsKKwkvKioKKwkgKiByZWFkIGEgcGVuZGluZyBub3RpZmljYXRpb24gZXZlbnQ7IG9wdGlvbmFsCisJICovCisJaW50ICgqcmVhZF9ldmVudCkoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsIHVuc2lnbmVkIGludCAqZXZlbnRfbWFzayk7CisJLyoqCisJICogcmV0dXJuIHRoZSBudW1iZXIgb2YgcG9sbCBkZXNjcmlwdG9yczsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpwb2xsX2Rlc2NyaXB0b3JzX2NvdW50KShzbmRfY3RsX2V4dF90ICpleHQpOworCS8qKgorCSAqIGZpbGwgdGhlIHBvbGwgZGVzY3JpcHRvcnM7IG9wdGlvbmFsCisJICovCisJaW50ICgqcG9sbF9kZXNjcmlwdG9ycykoc25kX2N0bF9leHRfdCAqZXh0LCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgc3BhY2UpOworCS8qKgorCSAqIG1hbmdsZSB0aGUgcmV2ZW50cyBvZiBwb2xsIGRlc2NyaXB0b3JzCisJICovCisJaW50ICgqcG9sbF9yZXZlbnRzKShzbmRfY3RsX2V4dF90ICpleHQsIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqcmV2ZW50cyk7Cit9OworCisvKioKKyAqIFRoZSBhY2Nlc3MgdHlwZSBiaXRzIHN0b3JlZCBpbiBnZXRfYXR0cmlidXRlIGNhbGxiYWNrCisgKi8KK3R5cGVkZWYgZW51bSBzbmRfY3RsX2V4dF9hY2Nlc3MgeworCVNORF9DVExfRVhUX0FDQ0VTU19SRUFEID0gKDE8PDApLAorCVNORF9DVExfRVhUX0FDQ0VTU19XUklURSA9ICgxPDwxKSwKKwlTTkRfQ1RMX0VYVF9BQ0NFU1NfUkVBRFdSSVRFID0gKDM8PDApLAorCVNORF9DVExfRVhUX0FDQ0VTU19WT0xBVElMRSA9ICgxPDwyKSwKKwlTTkRfQ1RMX0VYVF9BQ0NFU1NfSU5BQ1RJVkUgPSAoMTw8OCksCit9IHNuZF9jdGxfZXh0X2FjY2Vzc190OworCisvKioKKyAqIGZpbmRfZWxlbSBjYWxsYmFjayByZXR1cm5zIHRoaXMgaWYgbm8gbWF0Y2hpbmcgY29udHJvbCBlbGVtZW50IGlzIGZvdW5kCisgKi8KKyNkZWZpbmUgU05EX0NUTF9FWFRfS0VZX05PVF9GT1VORAkoc25kX2N0bF9leHRfa2V5X3QpKC0xKQorCitpbnQgc25kX2N0bF9leHRfY3JlYXRlKHNuZF9jdGxfZXh0X3QgKmV4dCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUpOworaW50IHNuZF9jdGxfZXh0X2RlbGV0ZShzbmRfY3RsX2V4dF90ICpleHQpOworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9DT05UUk9MX0VYVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9lcnJvci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyNzA4MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9lcnJvci5oCkBAIC0wLDAgKzEsNzggQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9lcnJvci5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9FUlJPUl9ICisjZGVmaW5lIF9fQUxTQV9FUlJPUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIEVycm9yIEVycm9yIGhhbmRsaW5nCisgKiAgRXJyb3IgaGFuZGxpbmcgbWFjcm9zIGFuZCBmdW5jdGlvbnMuCisgKiAgXHsKKyAqLworCisjZGVmaW5lIFNORF9FUlJPUl9CRUdJTgkJCQk1MDAwMDAJCQkvKio8IExvd2VyIGJvdW5kYXJ5IG9mIHNvdW5kIGVycm9yIGNvZGVzLiAqLworI2RlZmluZSBTTkRfRVJST1JfSU5DT01QQVRJQkxFX1ZFUlNJT04JCShTTkRfRVJST1JfQkVHSU4rMCkJLyoqPCBLZXJuZWwvbGlicmFyeSBwcm90b2NvbHMgYXJlIG5vdCBjb21wYXRpYmxlLiAqLworI2RlZmluZSBTTkRfRVJST1JfQUxJU1BfTklMCQkJKFNORF9FUlJPUl9CRUdJTisxKQkvKio8IExpc3AgZW5jb3VudGVyZWQgYW4gZXJyb3IgZHVyaW5nIGFjYWxsLiAqLworCitjb25zdCBjaGFyICpzbmRfc3RyZXJyb3IoaW50IGVycm51bSk7CisKKy8qKgorICogXGJyaWVmIEVycm9yIGhhbmRsZXIgY2FsbGJhY2suCisgKiBccGFyYW0gZmlsZSBTb3VyY2UgZmlsZSBuYW1lLgorICogXHBhcmFtIGxpbmUgTGluZSBudW1iZXIuCisgKiBccGFyYW0gZnVuY3Rpb24gRnVuY3Rpb24gbmFtZS4KKyAqIFxwYXJhbSBlcnIgVmFsdWUgb2YgXGMgZXJybm8sIG9yIDAgaWYgbm90IHJlbGV2YW50LgorICogXHBhcmFtIGZtdCBcYyBwcmludGYoMykgZm9ybWF0LgorICogXHBhcmFtIC4uLiBcYyBwcmludGYoMykgYXJndW1lbnRzLgorICoKKyAqIEEgZnVuY3Rpb24gb2YgdGhpcyB0eXBlIGlzIGNhbGxlZCBieSB0aGUgQUxTQSBsaWJyYXJ5IHdoZW4gYW4gZXJyb3Igb2NjdXJzLgorICogVGhpcyBmdW5jdGlvbiB1c3VhbGx5IHNob3dzIHRoZSBtZXNzYWdlIG9uIHRoZSBzY3JlZW4sIGFuZC9vciBsb2dzIGl0LgorICovCit0eXBlZGVmIHZvaWQgKCpzbmRfbGliX2Vycm9yX2hhbmRsZXJfdCkoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBpbnQgZXJyLCBjb25zdCBjaGFyICpmbXQsIC4uLikgLyogX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA1LCA2KSkpICovOworZXh0ZXJuIHNuZF9saWJfZXJyb3JfaGFuZGxlcl90IHNuZF9saWJfZXJyb3I7CitleHRlcm4gaW50IHNuZF9saWJfZXJyb3Jfc2V0X2hhbmRsZXIoc25kX2xpYl9lcnJvcl9oYW5kbGVyX3QgaGFuZGxlcik7CisKKyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPiA5NSkKKyNkZWZpbmUgU05ERVJSKC4uLikgc25kX2xpYl9lcnJvcihfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXywgMCwgX19WQV9BUkdTX18pIC8qKjwgU2hvd3MgYSBzb3VuZCBlcnJvciBtZXNzYWdlLiAqLworI2RlZmluZSBTWVNFUlIoLi4uKSBzbmRfbGliX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fLCBlcnJubywgX19WQV9BUkdTX18pIC8qKjwgU2hvd3MgYSBzeXN0ZW0gZXJyb3IgbWVzc2FnZSAocmVsYXRlZCB0byBcYyBlcnJubykuICovCisjZWxzZQorI2RlZmluZSBTTkRFUlIoYXJncy4uLikgc25kX2xpYl9lcnJvcihfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXywgMCwgIyNhcmdzKSAvKio8IFNob3dzIGEgc291bmQgZXJyb3IgbWVzc2FnZS4gKi8KKyNkZWZpbmUgU1lTRVJSKGFyZ3MuLi4pIHNuZF9saWJfZXJyb3IoX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18sIGVycm5vLCAjI2FyZ3MpIC8qKjwgU2hvd3MgYSBzeXN0ZW0gZXJyb3IgbWVzc2FnZSAocmVsYXRlZCB0byBcYyBlcnJubykuICovCisjZW5kaWYKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfRVJST1JfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvZ2xvYmFsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvZ2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzNjgwZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9nbG9iYWwuaApAQCAtMCwwICsxLDE1OSBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL2dsb2JhbC5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9HTE9CQUxfSF8KKyNkZWZpbmUgX19BTFNBX0dMT0JBTF9IXworCisvKiBmb3IgdGltZXZhbCBhbmQgdGltZXNwZWMgKi8KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIEdsb2JhbCBHbG9iYWwgZGVmaW5lcyBhbmQgZnVuY3Rpb25zCisgKiAgR2xvYmFsIGRlZmluZXMgYW5kIGZ1bmN0aW9ucy4KKyAqICBccGFyCisgKiAgVGhlIEFMU0EgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZXNlIG1hY3JvcyBhbmQgZnVuY3Rpb25zLgorICogIE1vc3QgYXBwbGljYXRpb25zIHByb2JhYmx5IGRvIG5vdCBuZWVkIHRoZW0uCisgKiAgXHsKKyAqLworCitjb25zdCBjaGFyICpzbmRfYXNvdW5kbGliX3ZlcnNpb24odm9pZCk7CisKKyNpZm5kZWYgQVRUUklCVVRFX1VOVVNFRAorLyoqIGRvIG5vdCBwcmludCB3YXJuaW5nIChnY2MpIHdoZW4gZnVuY3Rpb24gcGFyYW1ldGVyIGlzIG5vdCB1c2VkICovCisjZGVmaW5lIEFUVFJJQlVURV9VTlVTRUQgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorI2VuZGlmCisKKyNpZmRlZiBQSUMgLyogZHluYW1pYyBidWlsZCAqLworCisvKiogXGhpZGVpbml0aWFsaXplciBcYnJpZWYgSGVscGVyIG1hY3JvIGZvciAjU05EX0RMU1lNX0JVSUxEX1ZFUlNJT04uICovCisjZGVmaW5lIF9fU05EX0RMU1lNX1ZFUlNJT04obmFtZSwgdmVyc2lvbikgXyAjIyBuYW1lICMjIHZlcnNpb24KKy8qKgorICogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIEFwcGVuZHMgdGhlIGJ1aWxkIHZlcnNpb24gdG8gdGhlIG5hbWUgb2YgYSB2ZXJzaW9uZWQgZHluYW1pYyBzeW1ib2wuCisgKi8KKyNkZWZpbmUgU05EX0RMU1lNX0JVSUxEX1ZFUlNJT04obmFtZSwgdmVyc2lvbikgY2hhciBfX1NORF9ETFNZTV9WRVJTSU9OKG5hbWUsIHZlcnNpb24pOworCisjZWxzZSAvKiBzdGF0aWMgYnVpbGQgKi8KKworc3RydWN0IHNuZF9kbHN5bV9saW5rIHsKKwlzdHJ1Y3Qgc25kX2Rsc3ltX2xpbmsgKm5leHQ7CisJY29uc3QgY2hhciAqZGxzeW1fbmFtZTsKKwljb25zdCB2b2lkICpkbHN5bV9wdHI7Cit9OworCitleHRlcm4gc3RydWN0IHNuZF9kbHN5bV9saW5rICpzbmRfZGxzeW1fc3RhcnQ7CisKKy8qKiBcaGlkZWluaXRpYWxpemVyIFxicmllZiBIZWxwZXIgbWFjcm8gZm9yICNTTkRfRExTWU1fQlVJTERfVkVSU0lPTi4gKi8KKyNkZWZpbmUgX19TTkRfRExTWU1fVkVSU0lPTihwcmVmaXgsIG5hbWUsIHZlcnNpb24pIF8gIyMgcHJlZml4ICMjIG5hbWUgIyMgdmVyc2lvbgorLyoqCisgKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgQXBwZW5kcyB0aGUgYnVpbGQgdmVyc2lvbiB0byB0aGUgbmFtZSBvZiBhIHZlcnNpb25lZCBkeW5hbWljIHN5bWJvbC4KKyAqLworI2RlZmluZSBTTkRfRExTWU1fQlVJTERfVkVSU0lPTihuYW1lLCB2ZXJzaW9uKSBcCisgIHN0YXRpYyBzdHJ1Y3Qgc25kX2Rsc3ltX2xpbmsgX19TTkRfRExTWU1fVkVSU0lPTihzbmRfZGxzeW1fLCBuYW1lLCB2ZXJzaW9uKTsgXAorICB2b2lkIF9fU05EX0RMU1lNX1ZFUlNJT04oc25kX2Rsc3ltX2NvbnN0cnVjdG9yXywgbmFtZSwgdmVyc2lvbikgKHZvaWQpIF9fYXR0cmlidXRlX18gKChjb25zdHJ1Y3RvcikpOyBcCisgIHZvaWQgX19TTkRfRExTWU1fVkVSU0lPTihzbmRfZGxzeW1fY29uc3RydWN0b3JfLCBuYW1lLCB2ZXJzaW9uKSAodm9pZCkgeyBcCisgICAgX19TTkRfRExTWU1fVkVSU0lPTihzbmRfZGxzeW1fLCBuYW1lLCB2ZXJzaW9uKS5uZXh0ID0gc25kX2Rsc3ltX3N0YXJ0OyBcCisgICAgX19TTkRfRExTWU1fVkVSU0lPTihzbmRfZGxzeW1fLCBuYW1lLCB2ZXJzaW9uKS5kbHN5bV9uYW1lID0gIyBuYW1lOyBcCisgICAgX19TTkRfRExTWU1fVkVSU0lPTihzbmRfZGxzeW1fLCBuYW1lLCB2ZXJzaW9uKS5kbHN5bV9wdHIgPSAodm9pZCAqKSZuYW1lOyBcCisgICAgc25kX2Rsc3ltX3N0YXJ0ID0gJl9fU05EX0RMU1lNX1ZFUlNJT04oc25kX2Rsc3ltXywgbmFtZSwgdmVyc2lvbik7IFwKKyAgfQorCisjZW5kaWYKKworI2lmbmRlZiBfX1NUUklORworLyoqIFxicmllZiBSZXR1cm4gJ3gnIGFyZ3VtZW50IGFzIHN0cmluZyAqLworI2RlZmluZSBfX1NUUklORyh4KSAgICAgI3gKKyNlbmRpZgorCisvKiogXGJyaWVmIFJldHVybnMgdGhlIHZlcnNpb24gb2YgYSBkeW5hbWljIHN5bWJvbCBhcyBhIHN0cmluZy4gKi8KKyNkZWZpbmUgU05EX0RMU1lNX1ZFUlNJT04odmVyc2lvbikgX19TVFJJTkcodmVyc2lvbikKKwordm9pZCAqc25kX2Rsb3Blbihjb25zdCBjaGFyICpmaWxlLCBpbnQgbW9kZSk7Cit2b2lkICpzbmRfZGxzeW0odm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2ZXJzaW9uKTsKK2ludCBzbmRfZGxjbG9zZSh2b2lkICpoYW5kbGUpOworCisKKy8qKiBcYnJpZWYgYWxsb2NhIGhlbHBlciBtYWNyby4gKi8KKyNkZWZpbmUgX19zbmRfYWxsb2NhKHB0cix0eXBlKSBkbyB7ICpwdHIgPSAodHlwZSMjX3QgKikgYWxsb2NhKHR5cGUjI19zaXplb2YoKSk7IG1lbXNldCgqcHRyLCAwLCB0eXBlIyNfc2l6ZW9mKCkpOyB9IHdoaWxlICgwKQorCisvKioKKyAqIFxicmllZiBJbnRlcm5hbCBzdHJ1Y3R1cmUgZm9yIGFuIGFzeW5jIG5vdGlmaWNhdGlvbiBjbGllbnQgaGFuZGxlci4KKyAqCisgKiBUaGUgQUxTQSBsaWJyYXJ5IHVzZXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlIGFzIGEgaGFuZGxlIHRvIGFuIGFzeW5jCisgKiBub3RpZmljYXRpb24gb2JqZWN0LiBBcHBsaWNhdGlvbnMgZG9uJ3QgYWNjZXNzIGl0cyBjb250ZW50cyBkaXJlY3RseS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9hc3luY19oYW5kbGVyIHNuZF9hc3luY19oYW5kbGVyX3Q7CisKKy8qKgorICogXGJyaWVmIEFzeW5jIG5vdGlmaWNhdGlvbiBjYWxsYmFjay4KKyAqCisgKiBTZWUgdGhlICNzbmRfYXN5bmNfYWRkX2hhbmRsZXIgZnVuY3Rpb24gZm9yIGRldGFpbHMuCisgKi8KK3R5cGVkZWYgdm9pZCAoKnNuZF9hc3luY19jYWxsYmFja190KShzbmRfYXN5bmNfaGFuZGxlcl90ICpoYW5kbGVyKTsKKworaW50IHNuZF9hc3luY19hZGRfaGFuZGxlcihzbmRfYXN5bmNfaGFuZGxlcl90ICoqaGFuZGxlciwgaW50IGZkLCAKKwkJCSAgc25kX2FzeW5jX2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKnByaXZhdGVfZGF0YSk7CitpbnQgc25kX2FzeW5jX2RlbF9oYW5kbGVyKHNuZF9hc3luY19oYW5kbGVyX3QgKmhhbmRsZXIpOworaW50IHNuZF9hc3luY19oYW5kbGVyX2dldF9mZChzbmRfYXN5bmNfaGFuZGxlcl90ICpoYW5kbGVyKTsKK2ludCBzbmRfYXN5bmNfaGFuZGxlcl9nZXRfc2lnbm8oc25kX2FzeW5jX2hhbmRsZXJfdCAqaGFuZGxlcik7Cit2b2lkICpzbmRfYXN5bmNfaGFuZGxlcl9nZXRfY2FsbGJhY2tfcHJpdmF0ZShzbmRfYXN5bmNfaGFuZGxlcl90ICpoYW5kbGVyKTsKKworc3RydWN0IHNuZF9zaG1fYXJlYSAqc25kX3NobV9hcmVhX2NyZWF0ZShpbnQgc2htaWQsIHZvaWQgKnB0cik7CitzdHJ1Y3Qgc25kX3NobV9hcmVhICpzbmRfc2htX2FyZWFfc2hhcmUoc3RydWN0IHNuZF9zaG1fYXJlYSAqYXJlYSk7CitpbnQgc25kX3NobV9hcmVhX2Rlc3Ryb3koc3RydWN0IHNuZF9zaG1fYXJlYSAqYXJlYSk7CisKK2ludCBzbmRfdXNlcl9maWxlKGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKipyZXN1bHQpOworCisjaWYgIWRlZmluZWQoX1BPU0lYX0NfU09VUkNFKSAmJiAhZGVmaW5lZChfUE9TSVhfU09VUkNFKQorc3RydWN0IHRpbWV2YWwgeworCXRpbWVfdAkJdHZfc2VjOwkJLyogc2Vjb25kcyAqLworCWxvbmcJCXR2X3VzZWM7CS8qIG1pY3Jvc2Vjb25kcyAqLworfTsKKworc3RydWN0IHRpbWVzcGVjIHsKKwl0aW1lX3QJCXR2X3NlYzsJCS8qIHNlY29uZHMgKi8KKwlsb25nCQl0dl9uc2VjOwkvKiBuYW5vc2Vjb25kcyAqLworfTsKKyNlbmRpZgorCisvKiogVGltZXN0YW1wICovCit0eXBlZGVmIHN0cnVjdCB0aW1ldmFsIHNuZF90aW1lc3RhbXBfdDsKKy8qKiBIaS1yZXMgdGltZXN0YW1wICovCit0eXBlZGVmIHN0cnVjdCB0aW1lc3BlYyBzbmRfaHRpbWVzdGFtcF90OworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9HTE9CQUxfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2h3ZGVwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvaHdkZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjEyODIyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2h3ZGVwLmgKQEAgLTAsMCArMSwxNjAgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9od2RlcC5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9IV0RFUF9ICisjZGVmaW5lIF9fQUxTQV9IV0RFUF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIEh3RGVwIEhhcmR3YXJlIERlcGVuZGFudCBJbnRlcmZhY2UKKyAqICBUaGUgSGFyZHdhcmUgRGVwZW5kYW50IEludGVyZmFjZS4KKyAqICBceworICovCisKKy8qKiBkbHN5bSB2ZXJzaW9uIGZvciBpbnRlcmZhY2UgZW50cnkgY2FsbGJhY2sgKi8KKyNkZWZpbmUgU05EX0hXREVQX0RMU1lNX1ZFUlNJT04JCV9kbHN5bV9od2RlcF8wMDEKKworLyoqIEh3RGVwIGluZm9ybWF0aW9uIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9od2RlcF9pbmZvIHNuZF9od2RlcF9pbmZvX3Q7CisKKy8qKiBId0RlcCBEU1Agc3RhdHVzIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9od2RlcF9kc3Bfc3RhdHVzIHNuZF9od2RlcF9kc3Bfc3RhdHVzX3Q7CisKKy8qKiBId0RlcCBEU1AgaW1hZ2UgY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX2h3ZGVwX2RzcF9pbWFnZSBzbmRfaHdkZXBfZHNwX2ltYWdlX3Q7CisKKy8qKiBId0RlcCBpbnRlcmZhY2UgKi8KK3R5cGVkZWYgZW51bSBfc25kX2h3ZGVwX2lmYWNlIHsKKwlTTkRfSFdERVBfSUZBQ0VfT1BMMiA9IDAsCS8qKjwgT1BMMiByYXcgZHJpdmVyICovCisJU05EX0hXREVQX0lGQUNFX09QTDMsCQkvKio8IE9QTDMgcmF3IGRyaXZlciAqLworCVNORF9IV0RFUF9JRkFDRV9PUEw0LAkJLyoqPCBPUEw0IHJhdyBkcml2ZXIgKi8KKwlTTkRfSFdERVBfSUZBQ0VfU0IxNkNTUCwJLyoqPCBTQjE2Q1NQIGRyaXZlciAqLworCVNORF9IV0RFUF9JRkFDRV9FTVUxMEsxLAkvKio8IEVNVTEwSzEgZHJpdmVyICovCisJU05EX0hXREVQX0lGQUNFX1lTUzIyNSwJCS8qKjwgWVNTMjI1IGRyaXZlciAqLworCVNORF9IV0RFUF9JRkFDRV9JQ1MyMTE1LAkvKio8IElDUzIxMTUgZHJpdmVyICovCisJU05EX0hXREVQX0lGQUNFX1NTQ0FQRSwJCS8qKjwgRW5zb25pcSBTb3VuZFNjYXBlIElTQSBjYXJkIChNQzY4RUMwMDApICovCisJU05EX0hXREVQX0lGQUNFX1ZYLAkJLyoqPCBEaWdpZ3JhbSBWWCBjYXJkcyAqLworCVNORF9IV0RFUF9JRkFDRV9NSVhBUlQsCQkvKio8IERpZ2lncmFtIG1pWGFydCBjYXJkcyAqLworCVNORF9IV0RFUF9JRkFDRV9VU1gyWSwJCS8qKjwgVGFzY2FtIFVTMTIyLCBVUzIyNCAmIFVTNDI4IHVzYiAqLworCVNORF9IV0RFUF9JRkFDRV9FTVVYX1dBVkVUQUJMRSwJLyoqPCBFbXVYIHdhdmV0YWJsZSAqLworCVNORF9IV0RFUF9JRkFDRV9CTFVFVE9PVEgsCS8qKjwgQmx1ZXRvb3RoIGF1ZGlvICovCisJU05EX0hXREVQX0lGQUNFX1VTWDJZX1BDTSwJLyoqPCBUYXNjYW0gVVMxMjIsIFVTMjI0ICYgVVM0MjggcmF3IFVTQiBQQ00gKi8KKwlTTkRfSFdERVBfSUZBQ0VfUENYSFIsCQkvKio8IERpZ2lncmFtIFBDWEhSICovCisJU05EX0hXREVQX0lGQUNFX1NCX1JDLAkJLyoqPCBTQiBFeHRpZ3kvQXVkaWd5Mk5YIHJlbW90ZSBjb250cm9sICovCisgICAgICAgICAgICAgICAgCisJU05EX0hXREVQX0lGQUNFX0xBU1QgPSBTTkRfSFdERVBfSUZBQ0VfU0JfUkMgIC8qKjwgbGFzdCBrbm93biBod2RlcCBpbnRlcmZhY2UgKi8KK30gc25kX2h3ZGVwX2lmYWNlX3Q7CisKKy8qKiBvcGVuIGZvciByZWFkaW5nICovCisjZGVmaW5lIFNORF9IV0RFUF9PUEVOX1JFQUQJCShPX1JET05MWSkKKy8qKiBvcGVuIGZvciB3cml0aW5nICovCisjZGVmaW5lIFNORF9IV0RFUF9PUEVOX1dSSVRFCQkoT19XUk9OTFkpCisvKiogb3BlbiBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyAqLworI2RlZmluZSBTTkRfSFdERVBfT1BFTl9EVVBMRVgJCShPX1JEV1IpCisvKiogb3BlbiBtb2RlIGZsYWc6IG9wZW4gaW4gbm9uYmxvY2sgbW9kZSAqLworI2RlZmluZSBTTkRfSFdERVBfT1BFTl9OT05CTE9DSwkJKE9fTk9OQkxPQ0spCisKKy8qKiBId0RlcCBoYW5kbGUgdHlwZSAqLwordHlwZWRlZiBlbnVtIF9zbmRfaHdkZXBfdHlwZSB7CisJLyoqIEtlcm5lbCBsZXZlbCBId0RlcCAqLworCVNORF9IV0RFUF9UWVBFX0hXLAorCS8qKiBTaGFyZWQgbWVtb3J5IGNsaWVudCBId0RlcCAobm90IHlldCBpbXBsZW1lbnRlZCkgKi8KKwlTTkRfSFdERVBfVFlQRV9TSE0sCisJLyoqIElORVQgY2xpZW50IEh3RGVwIChub3QgeWV0IGltcGxlbWVudGVkKSAqLworCVNORF9IV0RFUF9UWVBFX0lORVQKK30gc25kX2h3ZGVwX3R5cGVfdDsKKworLyoqIEh3RGVwIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9od2RlcCBzbmRfaHdkZXBfdDsKKworaW50IHNuZF9od2RlcF9vcGVuKHNuZF9od2RlcF90ICoqaHdkZXAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlKTsKK2ludCBzbmRfaHdkZXBfY2xvc2Uoc25kX2h3ZGVwX3QgKmh3ZGVwKTsKK2ludCBzbmRfaHdkZXBfcG9sbF9kZXNjcmlwdG9ycyhzbmRfaHdkZXBfdCAqaHdkZXAsIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBzcGFjZSk7CitpbnQgc25kX2h3ZGVwX3BvbGxfZGVzY3JpcHRvcnNfcmV2ZW50cyhzbmRfaHdkZXBfdCAqaHdkZXAsIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqcmV2ZW50cyk7CitpbnQgc25kX2h3ZGVwX25vbmJsb2NrKHNuZF9od2RlcF90ICpod2RlcCwgaW50IG5vbmJsb2NrKTsKK2ludCBzbmRfaHdkZXBfaW5mbyhzbmRfaHdkZXBfdCAqaHdkZXAsIHNuZF9od2RlcF9pbmZvX3QgKiBpbmZvKTsKK2ludCBzbmRfaHdkZXBfZHNwX3N0YXR1cyhzbmRfaHdkZXBfdCAqaHdkZXAsIHNuZF9od2RlcF9kc3Bfc3RhdHVzX3QgKnN0YXR1cyk7CitpbnQgc25kX2h3ZGVwX2RzcF9sb2FkKHNuZF9od2RlcF90ICpod2RlcCwgc25kX2h3ZGVwX2RzcF9pbWFnZV90ICpibG9jayk7CitpbnQgc25kX2h3ZGVwX2lvY3RsKHNuZF9od2RlcF90ICpod2RlcCwgdW5zaWduZWQgaW50IHJlcXVlc3QsIHZvaWQgKiBhcmcpOworc3NpemVfdCBzbmRfaHdkZXBfd3JpdGUoc25kX2h3ZGVwX3QgKmh3ZGVwLCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKK3NzaXplX3Qgc25kX2h3ZGVwX3JlYWQoc25kX2h3ZGVwX3QgKmh3ZGVwLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKKworc2l6ZV90IHNuZF9od2RlcF9pbmZvX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSAjc25kX2h3ZGVwX2luZm9fdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX2h3ZGVwX2luZm9fYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX2h3ZGVwX2luZm8pCitpbnQgc25kX2h3ZGVwX2luZm9fbWFsbG9jKHNuZF9od2RlcF9pbmZvX3QgKipwdHIpOwordm9pZCBzbmRfaHdkZXBfaW5mb19mcmVlKHNuZF9od2RlcF9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9od2RlcF9pbmZvX2NvcHkoc25kX2h3ZGVwX2luZm9fdCAqZHN0LCBjb25zdCBzbmRfaHdkZXBfaW5mb190ICpzcmMpOworCit1bnNpZ25lZCBpbnQgc25kX2h3ZGVwX2luZm9fZ2V0X2RldmljZShjb25zdCBzbmRfaHdkZXBfaW5mb190ICpvYmopOworaW50IHNuZF9od2RlcF9pbmZvX2dldF9jYXJkKGNvbnN0IHNuZF9od2RlcF9pbmZvX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfaHdkZXBfaW5mb19nZXRfaWQoY29uc3Qgc25kX2h3ZGVwX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9od2RlcF9pbmZvX2dldF9uYW1lKGNvbnN0IHNuZF9od2RlcF9pbmZvX3QgKm9iaik7CitzbmRfaHdkZXBfaWZhY2VfdCBzbmRfaHdkZXBfaW5mb19nZXRfaWZhY2UoY29uc3Qgc25kX2h3ZGVwX2luZm9fdCAqb2JqKTsKK3ZvaWQgc25kX2h3ZGVwX2luZm9fc2V0X2RldmljZShzbmRfaHdkZXBfaW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOworCitzaXplX3Qgc25kX2h3ZGVwX2RzcF9zdGF0dXNfc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlICNzbmRfaHdkZXBfZHNwX3N0YXR1c190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfaHdkZXBfZHNwX3N0YXR1c19hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfaHdkZXBfZHNwX3N0YXR1cykKK2ludCBzbmRfaHdkZXBfZHNwX3N0YXR1c19tYWxsb2Moc25kX2h3ZGVwX2RzcF9zdGF0dXNfdCAqKnB0cik7Cit2b2lkIHNuZF9od2RlcF9kc3Bfc3RhdHVzX2ZyZWUoc25kX2h3ZGVwX2RzcF9zdGF0dXNfdCAqb2JqKTsKK3ZvaWQgc25kX2h3ZGVwX2RzcF9zdGF0dXNfY29weShzbmRfaHdkZXBfZHNwX3N0YXR1c190ICpkc3QsIGNvbnN0IHNuZF9od2RlcF9kc3Bfc3RhdHVzX3QgKnNyYyk7CisKK3Vuc2lnbmVkIGludCBzbmRfaHdkZXBfZHNwX3N0YXR1c19nZXRfdmVyc2lvbihjb25zdCBzbmRfaHdkZXBfZHNwX3N0YXR1c190ICpvYmopOworY29uc3QgY2hhciAqc25kX2h3ZGVwX2RzcF9zdGF0dXNfZ2V0X2lkKGNvbnN0IHNuZF9od2RlcF9kc3Bfc3RhdHVzX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2h3ZGVwX2RzcF9zdGF0dXNfZ2V0X251bV9kc3BzKGNvbnN0IHNuZF9od2RlcF9kc3Bfc3RhdHVzX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2h3ZGVwX2RzcF9zdGF0dXNfZ2V0X2RzcF9sb2FkZWQoY29uc3Qgc25kX2h3ZGVwX2RzcF9zdGF0dXNfdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfaHdkZXBfZHNwX3N0YXR1c19nZXRfY2hpcF9yZWFkeShjb25zdCBzbmRfaHdkZXBfZHNwX3N0YXR1c190ICpvYmopOworCitzaXplX3Qgc25kX2h3ZGVwX2RzcF9pbWFnZV9zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgI3NuZF9od2RlcF9kc3BfaW1hZ2VfdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX2h3ZGVwX2RzcF9pbWFnZV9hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfaHdkZXBfZHNwX2ltYWdlKQoraW50IHNuZF9od2RlcF9kc3BfaW1hZ2VfbWFsbG9jKHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqKnB0cik7Cit2b2lkIHNuZF9od2RlcF9kc3BfaW1hZ2VfZnJlZShzbmRfaHdkZXBfZHNwX2ltYWdlX3QgKm9iaik7Cit2b2lkIHNuZF9od2RlcF9kc3BfaW1hZ2VfY29weShzbmRfaHdkZXBfZHNwX2ltYWdlX3QgKmRzdCwgY29uc3Qgc25kX2h3ZGVwX2RzcF9pbWFnZV90ICpzcmMpOworCit1bnNpZ25lZCBpbnQgc25kX2h3ZGVwX2RzcF9pbWFnZV9nZXRfaW5kZXgoY29uc3Qgc25kX2h3ZGVwX2RzcF9pbWFnZV90ICpvYmopOworY29uc3QgY2hhciAqc25kX2h3ZGVwX2RzcF9pbWFnZV9nZXRfbmFtZShjb25zdCBzbmRfaHdkZXBfZHNwX2ltYWdlX3QgKm9iaik7Citjb25zdCB2b2lkICpzbmRfaHdkZXBfZHNwX2ltYWdlX2dldF9pbWFnZShjb25zdCBzbmRfaHdkZXBfZHNwX2ltYWdlX3QgKm9iaik7CitzaXplX3Qgc25kX2h3ZGVwX2RzcF9pbWFnZV9nZXRfbGVuZ3RoKGNvbnN0IHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqb2JqKTsKKwordm9pZCBzbmRfaHdkZXBfZHNwX2ltYWdlX3NldF9pbmRleChzbmRfaHdkZXBfZHNwX2ltYWdlX3QgKm9iaiwgdW5zaWduZWQgaW50IF9pbmRleCk7Cit2b2lkIHNuZF9od2RlcF9kc3BfaW1hZ2Vfc2V0X25hbWUoc25kX2h3ZGVwX2RzcF9pbWFnZV90ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBzbmRfaHdkZXBfZHNwX2ltYWdlX3NldF9pbWFnZShzbmRfaHdkZXBfZHNwX2ltYWdlX3QgKm9iaiwgdm9pZCAqYnVmZmVyKTsKK3ZvaWQgc25kX2h3ZGVwX2RzcF9pbWFnZV9zZXRfbGVuZ3RoKHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqb2JqLCBzaXplX3QgbGVuZ3RoKTsKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfSFdERVBfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvaWF0b21pYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2lhdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTJkYmZkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2lhdG9taWMuaApAQCAtMCwwICsxLDExOTggQEAKKyNpZm5kZWYgX19BTFNBX0lBVE9NSUNfSAorI2RlZmluZSBfX0FMU0FfSUFUT01JQ19ICisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisKKy8qCisgKiBBdG9taWMgb3BlcmF0aW9ucyB0aGF0IEMgY2FuJ3QgZ3VhcmFudGVlIHVzLiAgVXNlZnVsIGZvcgorICogcmVzb3VyY2UgY291bnRpbmcgZXRjLi4KKyAqLworCisjZGVmaW5lIEFUT01JQ19TTVBfTE9DSyAibG9jayA7ICIKKworLyoKKyAqIE1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyIGFuZCBtb3ZlIHRoaW5ncyBhcm91bmQKKyAqIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MgdGhlIHVzZXIgZ2F2ZSB1cywKKyAqIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQorCisvKioKKyAqIGF0b21pY19yZWFkIC0gcmVhZCBhdG9taWMgdmFyaWFibGUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIAorICogQXRvbWljYWxseSByZWFkcyB0aGUgdmFsdWUgb2YgQHYuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8gCisjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQorCisvKioKKyAqIGF0b21pY19zZXQgLSBzZXQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiBAaTogcmVxdWlyZWQgdmFsdWUKKyAqIAorICogQXRvbWljYWxseSBzZXRzIHRoZSB2YWx1ZSBvZiBAdiB0byBAaS4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLyAKKyNkZWZpbmUgYXRvbWljX3NldCh2LGkpCQkoKCh2KS0+Y291bnRlcikgPSAoaSkpCisKKy8qKgorICogYXRvbWljX2FkZCAtIGFkZCBpbnRlZ2VyIHRvIGF0b21pYyB2YXJpYWJsZQorICogQGk6IGludGVnZXIgdmFsdWUgdG8gYWRkCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAKKyAqIEF0b21pY2FsbHkgYWRkcyBAaSB0byBAdi4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZCB1c2VmdWwgcmFuZ2UKKyAqIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfYWRkKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJQVRPTUlDX1NNUF9MT0NLICJhZGRsICUxLCUwIgorCQk6Ij1tIiAodi0+Y291bnRlcikKKwkJOiJpciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpKTsKK30KKworLyoqCisgKiBhdG9taWNfc3ViIC0gc3VidHJhY3QgdGhlIGF0b21pYyB2YXJpYWJsZQorICogQGk6IGludGVnZXIgdmFsdWUgdG8gc3VidHJhY3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIAorICogQXRvbWljYWxseSBzdWJ0cmFjdHMgQGkgZnJvbSBAdi4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfc3ViKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJQVRPTUlDX1NNUF9MT0NLICJzdWJsICUxLCUwIgorCQk6Ij1tIiAodi0+Y291bnRlcikKKwkJOiJpciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpKTsKK30KKworLyoqCisgKiBhdG9taWNfc3ViX2FuZF90ZXN0IC0gc3VidHJhY3QgdmFsdWUgZnJvbSB2YXJpYWJsZSBhbmQgdGVzdCByZXN1bHQKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIHN1YnRyYWN0CisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAKKyAqIEF0b21pY2FsbHkgc3VidHJhY3RzIEBpIGZyb20gQHYgYW5kIHJldHVybnMKKyAqIHRydWUgaWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBvciBmYWxzZSBmb3IgYWxsCisgKiBvdGhlciBjYXNlcy4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IGF0b21pY19zdWJfYW5kX3Rlc3QoaW50IGksIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGNoYXIgYzsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQlBVE9NSUNfU01QX0xPQ0sgInN1YmwgJTIsJTA7IHNldGUgJTEiCisJCToiPW0iICh2LT5jb3VudGVyKSwgIj1xbSIgKGMpCisJCToiaXIiIChpKSwgIm0iICh2LT5jb3VudGVyKSA6ICJtZW1vcnkiKTsKKwlyZXR1cm4gYzsKK30KKworLyoqCisgKiBhdG9taWNfaW5jIC0gaW5jcmVtZW50IGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogCisgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgQHYgYnkgMS4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLyAKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2luYyhhdG9taWNfdCAqdikKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJQVRPTUlDX1NNUF9MT0NLICJpbmNsICUwIgorCQk6Ij1tIiAodi0+Y291bnRlcikKKwkJOiJtIiAodi0+Y291bnRlcikpOworfQorCisvKioKKyAqIGF0b21pY19kZWMgLSBkZWNyZW1lbnQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAKKyAqIEF0b21pY2FsbHkgZGVjcmVtZW50cyBAdiBieSAxLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovIAorc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfZGVjKGF0b21pY190ICp2KQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQlBVE9NSUNfU01QX0xPQ0sgImRlY2wgJTAiCisJCToiPW0iICh2LT5jb3VudGVyKQorCQk6Im0iICh2LT5jb3VudGVyKSk7Cit9CisKKy8qKgorICogYXRvbWljX2RlY19hbmRfdGVzdCAtIGRlY3JlbWVudCBhbmQgdGVzdAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgQHYgYnkgMSBhbmQKKyAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIDAsIG9yIGZhbHNlIGZvciBhbGwgb3RoZXIKKyAqIGNhc2VzLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovIAorc3RhdGljIF9faW5saW5lX18gaW50IGF0b21pY19kZWNfYW5kX3Rlc3QoYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgY2hhciBjOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCUFUT01JQ19TTVBfTE9DSyAiZGVjbCAlMDsgc2V0ZSAlMSIKKwkJOiI9bSIgKHYtPmNvdW50ZXIpLCAiPXFtIiAoYykKKwkJOiJtIiAodi0+Y291bnRlcikgOiAibWVtb3J5Iik7CisJcmV0dXJuIGMgIT0gMDsKK30KKworLyoqCisgKiBhdG9taWNfaW5jX2FuZF90ZXN0IC0gaW5jcmVtZW50IGFuZCB0ZXN0IAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogCisgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgQHYgYnkgMQorICogYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIHplcm8sIG9yIGZhbHNlIGZvciBhbGwKKyAqIG90aGVyIGNhc2VzLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovIAorc3RhdGljIF9faW5saW5lX18gaW50IGF0b21pY19pbmNfYW5kX3Rlc3QoYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgY2hhciBjOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCUFUT01JQ19TTVBfTE9DSyAiaW5jbCAlMDsgc2V0ZSAlMSIKKwkJOiI9bSIgKHYtPmNvdW50ZXIpLCAiPXFtIiAoYykKKwkJOiJtIiAodi0+Y291bnRlcikgOiAibWVtb3J5Iik7CisJcmV0dXJuIGMgIT0gMDsKK30KKworLyoqCisgKiBhdG9taWNfYWRkX25lZ2F0aXZlIC0gYWRkIGFuZCB0ZXN0IGlmIG5lZ2F0aXZlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiBAaTogaW50ZWdlciB2YWx1ZSB0byBhZGQKKyAqIAorICogQXRvbWljYWxseSBhZGRzIEBpIHRvIEB2IGFuZCByZXR1cm5zIHRydWUKKyAqIGlmIHRoZSByZXN1bHQgaXMgbmVnYXRpdmUsIG9yIGZhbHNlIHdoZW4KKyAqIHJlc3VsdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVyby4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLyAKK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfYWRkX25lZ2F0aXZlKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJQVRPTUlDX1NNUF9MT0NLICJhZGRsICUyLCUwOyBzZXRzICUxIgorCQk6Ij1tIiAodi0+Y291bnRlciksICI9cW0iIChjKQorCQk6ImlyIiAoaSksICJtIiAodi0+Y291bnRlcikgOiAibWVtb3J5Iik7CisJcmV0dXJuIGM7Cit9CisKKy8qIFRoZXNlIGFyZSB4ODYtc3BlY2lmaWMsIHVzZWQgYnkgc29tZSBoZWFkZXIgZmlsZXMgKi8KKyNkZWZpbmUgYXRvbWljX2NsZWFyX21hc2sobWFzaywgYWRkcikgXAorX19hc21fXyBfX3ZvbGF0aWxlX18oQVRPTUlDX1NNUF9MT0NLICJhbmRsICUwLCUxIiBcCis6IDogInIiICh+KG1hc2spKSwibSIgKCphZGRyKSA6ICJtZW1vcnkiKQorCisjZGVmaW5lIGF0b21pY19zZXRfbWFzayhtYXNrLCBhZGRyKSBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyhBVE9NSUNfU01QX0xPQ0sgIm9ybCAlMCwlMSIgXAorOiA6ICJyIiAobWFzayksIm0iICgqYWRkcikgOiAibWVtb3J5IikKKworLyoKKyAqIEZvcmNlIHN0cmljdCBDUFUgb3JkZXJpbmcuCisgKiBBbmQgeWVzLCB0aGlzIGlzIHJlcXVpcmVkIG9uIFVQIHRvbyB3aGVuIHdlJ3JlIHRhbGtpbmcKKyAqIHRvIGRldmljZXMuCisgKgorICogRm9yIG5vdywgIndtYigpIiBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nLCBhcyBhbGwKKyAqIEludGVsIENQVSdzIGZvbGxvdyB3aGF0IEludGVsIGNhbGxzIGEgKlByb2Nlc3NvciBPcmRlciosCisgKiBpbiB3aGljaCBhbGwgd3JpdGVzIGFyZSBzZWVuIGluIHRoZSBwcm9ncmFtIG9yZGVyIGV2ZW4KKyAqIG91dHNpZGUgdGhlIENQVS4KKyAqCisgKiBJIGV4cGVjdCBmdXR1cmUgSW50ZWwgQ1BVJ3MgdG8gaGF2ZSBhIHdlYWtlciBvcmRlcmluZywKKyAqIGJ1dCBJJ2QgYWxzbyBleHBlY3QgdGhlbSB0byBmaW5hbGx5IGdldCB0aGVpciBhY3QgdG9nZXRoZXIKKyAqIGFuZCBhZGQgc29tZSByZWFsIG1lbW9yeSBiYXJyaWVycyBpZiBzby4KKyAqLworIAorI2lmZGVmIF9faTM4Nl9fCisjZGVmaW5lIG1iKCkgCV9fYXNtX18gX192b2xhdGlsZV9fICgibG9jazsgYWRkbCAkMCwwKCUlZXNwKSI6IDogOiJtZW1vcnkiKQorI2RlZmluZSBybWIoKQltYigpCisjZGVmaW5lIHdtYigpCV9fYXNtX18gX192b2xhdGlsZV9fICgiIjogOiA6Im1lbW9yeSIpCisjZWxzZQorI2RlZmluZSBtYigpIAlhc20gdm9sYXRpbGUoIm1mZW5jZSI6OjoibWVtb3J5IikKKyNkZWZpbmUgcm1iKCkJYXNtIHZvbGF0aWxlKCJsZmVuY2UiOjo6Im1lbW9yeSIpCisjZGVmaW5lIHdtYigpCWFzbSB2b2xhdGlsZSgic2ZlbmNlIjo6OiJtZW1vcnkiKQorI2VuZGlmCisKKyN1bmRlZiBBVE9NSUNfU01QX0xPQ0sKKworI2RlZmluZSBJQVRPTUlDX0RFRklORUQJCTEKKworI2VuZGlmIC8qIF9faTM4Nl9fICovCisKKyNpZmRlZiBfX2lhNjRfXworCisvKgorICogT24gSUEtNjQsIGNvdW50ZXIgbXVzdCBhbHdheXMgYmUgdm9sYXRpbGUgdG8gZW5zdXJlIHRoYXQgdGhhdCB0aGUKKyAqIG1lbW9yeSBhY2Nlc3NlcyBhcmUgb3JkZXJlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKKworI2RlZmluZSBBVE9NSUNfSU5JVChpKQkJKChhdG9taWNfdCkgeyAoaSkgfSkKKworI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKKyNkZWZpbmUgYXRvbWljX3NldCh2LGkpCQkoKCh2KS0+Y291bnRlcikgPSAoaSkpCisKKy8qIHN0cmlwcGVkIHZlcnNpb24gLSB3ZSBuZWVkIG9ubHkgNGJ5dGUgdmVyc2lvbiAqLworI2RlZmluZSBpYTY0X2NtcHhjaGcoc2VtLHB0cixvbGQsbmV3LHNpemUpIFwKKyh7IFwKKwlfX3R5cGVvZl9fKHB0cikgX3BfID0gKHB0cik7IFwKKwlfX3R5cGVvZl9fKG5ldykgX25fID0gKG5ldyk7IFwKKwl1bnNpZ25lZCBsb25nIF9vXywgX3JfOyBcCisJX29fID0gKHVuc2lnbmVkIGludCkgKGxvbmcpIChvbGQpOyBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3YgYXIuY2N2PSUwOzsiIDo6ICJyTyIoX29fKSk7IFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNtcHhjaGc0LiJzZW0iICUwPVslMV0sJTIsYXIuY2N2IiBcCisJCQkgICAgICA6ICI9ciIoX3JfKSA6ICJyIihfcF8pLCAiciIoX25fKSA6ICJtZW1vcnkiKTsgXAorCShfX3R5cGVvZl9fKG9sZCkpIF9yXzsgXAorfSkKKworc3RhdGljIF9faW5saW5lX18gaW50CitpYTY0X2F0b21pY19hZGQgKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwlpbnQgb2xkLCBuZXc7CisJLy8gQ01QWENIR19CVUdDSEVDS19ERUNMCisKKwlkbyB7CisJCS8vIENNUFhDSEdfQlVHQ0hFQ0sodik7CisJCW9sZCA9IGF0b21pY19yZWFkKHYpOworCQluZXcgPSBvbGQgKyBpOworCX0gd2hpbGUgKGlhNjRfY21weGNoZygiYWNxIiwgdiwgb2xkLCBvbGQgKyBpLCBzaXplb2YoYXRvbWljX3QpKSAhPSBvbGQpOworCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludAoraWE2NF9hdG9taWNfc3ViIChpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJaW50IG9sZCwgbmV3OworCS8vIENNUFhDSEdfQlVHQ0hFQ0tfREVDTAorCisJZG8geworCQkvLyBDTVBYQ0hHX0JVR0NIRUNLKHYpOworCQlvbGQgPSBhdG9taWNfcmVhZCh2KTsKKwkJbmV3ID0gb2xkIC0gaTsKKwl9IHdoaWxlIChpYTY0X2NtcHhjaGcoImFjcSIsIHYsIG9sZCwgbmV3LCBzaXplb2YoYXRvbWljX3QpKSAhPSBvbGQpOworCXJldHVybiBuZXc7Cit9CisKKyNkZWZpbmUgSUE2NF9GRVRDSEFERCh0bXAsdixuLHN6KQkJCQkJCVwKKyh7CQkJCQkJCQkJCVwKKwlzd2l0Y2ggKHN6KSB7CQkJCQkJCQlcCisJICAgICAgY2FzZSA0OgkJCQkJCQkJXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZldGNoYWRkNC5yZWwgJTA9WyUxXSwlMiIJCVwKKwkJCQkgICAgICA6ICI9ciIodG1wKSA6ICJyIih2KSwgImkiKG4pIDogIm1lbW9yeSIpOwlcCisJCWJyZWFrOwkJCQkJCQkJXAorCQkJCQkJCQkJCVwKKwkgICAgICBjYXNlIDg6CQkJCQkJCQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgiZmV0Y2hhZGQ4LnJlbCAlMD1bJTFdLCUyIgkJXAorCQkJCSAgICAgIDogIj1yIih0bXApIDogInIiKHYpLCAiaSIobikgOiAibWVtb3J5Iik7CVwKKwkJYnJlYWs7CQkJCQkJCQlcCisJfQkJCQkJCQkJCVwKK30pCisKKyNkZWZpbmUgaWE2NF9mZXRjaF9hbmRfYWRkKGksdikJCQkJCQkJXAorKHsJCQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX3RtcDsJCQkJCQkJCVwKKwl2b2xhdGlsZSBfX3R5cGVvZl9fKCoodikpICpfdiA9ICh2KTsJCQkJCVwKKwlzd2l0Y2ggKGkpIHsJCQkJCQkJCVwKKwkgICAgICBjYXNlIC0xNjoJSUE2NF9GRVRDSEFERChfdG1wLCBfdiwgLTE2LCBzaXplb2YoKih2KSkpOyBicmVhazsJXAorCSAgICAgIGNhc2UgIC04OglJQTY0X0ZFVENIQUREKF90bXAsIF92LCAgLTgsIHNpemVvZigqKHYpKSk7IGJyZWFrOwlcCisJICAgICAgY2FzZSAgLTQ6CUlBNjRfRkVUQ0hBREQoX3RtcCwgX3YsICAtNCwgc2l6ZW9mKCoodikpKTsgYnJlYWs7CVwKKwkgICAgICBjYXNlICAtMToJSUE2NF9GRVRDSEFERChfdG1wLCBfdiwgIC0xLCBzaXplb2YoKih2KSkpOyBicmVhazsJXAorCSAgICAgIGNhc2UgICAxOglJQTY0X0ZFVENIQUREKF90bXAsIF92LCAgIDEsIHNpemVvZigqKHYpKSk7IGJyZWFrOwlcCisJICAgICAgY2FzZSAgIDQ6CUlBNjRfRkVUQ0hBREQoX3RtcCwgX3YsICAgNCwgc2l6ZW9mKCoodikpKTsgYnJlYWs7CVwKKwkgICAgICBjYXNlICAgODoJSUE2NF9GRVRDSEFERChfdG1wLCBfdiwgICA4LCBzaXplb2YoKih2KSkpOyBicmVhazsJXAorCSAgICAgIGNhc2UgIDE2OglJQTY0X0ZFVENIQUREKF90bXAsIF92LCAgMTYsIHNpemVvZigqKHYpKSk7IGJyZWFrOwlcCisJfQkJCQkJCQkJCVwKKwkoX190eXBlb2ZfXygqdikpIChfdG1wICsgKGkpKTsJLyogcmV0dXJuIG5ldyB2YWx1ZSAqLwkJCVwKK30pCisKKy8qCisgKiBBdG9taWNhbGx5IGFkZCBJIHRvIFYgYW5kIHJldHVybiBUUlVFIGlmIHRoZSByZXN1bHRpbmcgdmFsdWUgaXMKKyAqIG5lZ2F0aXZlLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK2F0b21pY19hZGRfbmVnYXRpdmUgKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwlyZXR1cm4gaWE2NF9hdG9taWNfYWRkKGksIHYpIDwgMDsKK30KKworI2RlZmluZSBhdG9taWNfYWRkX3JldHVybihpLHYpCQkJCQkJXAorCSgoX19idWlsdGluX2NvbnN0YW50X3AoaSkgJiYJCQkJCVwKKwkgICggICAoaSA9PSAgMSkgfHwgKGkgPT0gIDQpIHx8IChpID09ICA4KSB8fCAoaSA9PSAgMTYpCQlcCisJICAgfHwgKGkgPT0gLTEpIHx8IChpID09IC00KSB8fCAoaSA9PSAtOCkgfHwgKGkgPT0gLTE2KSkpCVwKKwkgPyBpYTY0X2ZldGNoX2FuZF9hZGQoaSwgJih2KS0+Y291bnRlcikJCQkJXAorCSA6IGlhNjRfYXRvbWljX2FkZChpLCB2KSkKKworI2RlZmluZSBhdG9taWNfc3ViX3JldHVybihpLHYpCQkJCQkJXAorCSgoX19idWlsdGluX2NvbnN0YW50X3AoaSkgJiYJCQkJCVwKKwkgICggICAoaSA9PSAgMSkgfHwgKGkgPT0gIDQpIHx8IChpID09ICA4KSB8fCAoaSA9PSAgMTYpCQlcCisJICAgfHwgKGkgPT0gLTEpIHx8IChpID09IC00KSB8fCAoaSA9PSAtOCkgfHwgKGkgPT0gLTE2KSkpCVwKKwkgPyBpYTY0X2ZldGNoX2FuZF9hZGQoLShpKSwgJih2KS0+Y291bnRlcikJCQlcCisJIDogaWE2NF9hdG9taWNfc3ViKGksIHYpKQorCisjZGVmaW5lIGF0b21pY19kZWNfcmV0dXJuKHYpCQlhdG9taWNfc3ViX3JldHVybigxLCAodikpCisjZGVmaW5lIGF0b21pY19pbmNfcmV0dXJuKHYpCQlhdG9taWNfYWRkX3JldHVybigxLCAodikpCisKKyNkZWZpbmUgYXRvbWljX3N1Yl9hbmRfdGVzdChpLHYpCShhdG9taWNfc3ViX3JldHVybigoaSksICh2KSkgPT0gMCkKKyNkZWZpbmUgYXRvbWljX2RlY19hbmRfdGVzdCh2KQkJKGF0b21pY19zdWJfcmV0dXJuKDEsICh2KSkgPT0gMCkKKyNkZWZpbmUgYXRvbWljX2luY19hbmRfdGVzdCh2KQkJKGF0b21pY19hZGRfcmV0dXJuKDEsICh2KSkgIT0gMCkKKworI2RlZmluZSBhdG9taWNfYWRkKGksdikJCQlhdG9taWNfYWRkX3JldHVybigoaSksICh2KSkKKyNkZWZpbmUgYXRvbWljX3N1YihpLHYpCQkJYXRvbWljX3N1Yl9yZXR1cm4oKGkpLCAodikpCisjZGVmaW5lIGF0b21pY19pbmModikJCQlhdG9taWNfYWRkKDEsICh2KSkKKyNkZWZpbmUgYXRvbWljX2RlYyh2KQkJCWF0b21pY19zdWIoMSwgKHYpKQorCisvKgorICogTWFjcm9zIHRvIGZvcmNlIG1lbW9yeSBvcmRlcmluZy4gIEluIHRoZXNlIGRlc2NyaXB0aW9ucywgInByZXZpb3VzIgorICogYW5kICJzdWJzZXF1ZW50IiByZWZlciB0byBwcm9ncmFtIG9yZGVyOyAidmlzaWJsZSIgbWVhbnMgdGhhdCBhbGwKKyAqIGFyY2hpdGVjdHVyYWxseSB2aXNpYmxlIGVmZmVjdHMgb2YgYSBtZW1vcnkgYWNjZXNzIGhhdmUgb2NjdXJyZWQKKyAqIChhdCBhIG1pbmltdW0sIHRoaXMgbWVhbnMgdGhlIG1lbW9yeSBoYXMgYmVlbiByZWFkIG9yIHdyaXR0ZW4pLgorICoKKyAqICAgd21iKCk6CUd1YXJhbnRlZXMgdGhhdCBhbGwgcHJlY2VkaW5nIHN0b3JlcyB0byBtZW1vcnktCisgKgkJbGlrZSByZWdpb25zIGFyZSB2aXNpYmxlIGJlZm9yZSBhbnkgc3Vic2VxdWVudAorICoJCXN0b3JlcyBhbmQgdGhhdCBhbGwgZm9sbG93aW5nIHN0b3JlcyB3aWxsIGJlCisgKgkJdmlzaWJsZSBvbmx5IGFmdGVyIGFsbCBwcmV2aW91cyBzdG9yZXMuCisgKiAgIHJtYigpOglMaWtlIHdtYigpLCBidXQgZm9yIHJlYWRzLgorICogICBtYigpOgl3bWIoKS9ybWIoKSBjb21ibywgaS5lLiwgYWxsIHByZXZpb3VzIG1lbW9yeQorICoJCWFjY2Vzc2VzIGFyZSB2aXNpYmxlIGJlZm9yZSBhbGwgc3Vic2VxdWVudAorICoJCWFjY2Vzc2VzIGFuZCB2aWNlIHZlcnNhLiAgVGhpcyBpcyBhbHNvIGtub3duIGFzCisgKgkJYSAiZmVuY2UuIgorICoKKyAqIE5vdGU6ICJtYigpIiBhbmQgaXRzIHZhcmlhbnRzIGNhbm5vdCBiZSB1c2VkIGFzIGEgZmVuY2UgdG8gb3JkZXIKKyAqIGFjY2Vzc2VzIHRvIG1lbW9yeSBtYXBwZWQgSS9PIHJlZ2lzdGVycy4gIEZvciB0aGF0LCBtZi5hIG5lZWRzIHRvCisgKiBiZSB1c2VkLiAgSG93ZXZlciwgd2UgZG9uJ3Qgd2FudCB0byBhbHdheXMgdXNlIG1mLmEgYmVjYXVzZSAoYSkKKyAqIGl0J3MgKHByZXN1bWFibHkpIG11Y2ggc2xvd2VyIHRoYW4gbWYgYW5kIChiKSBtZi5hIGlzIHN1cHBvcnRlZCBmb3IKKyAqIHNlcXVlbnRpYWwgbWVtb3J5IHBhZ2VzIG9ubHkuCisgKi8KKyNkZWZpbmUgbWIoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1mIiA6OjogIm1lbW9yeSIpCisjZGVmaW5lIHJtYigpCW1iKCkKKyNkZWZpbmUgd21iKCkJbWIoKQorCisjZGVmaW5lIElBVE9NSUNfREVGSU5FRAkJMQorCisjZW5kaWYgLyogX19pYTY0X18gKi8KKworI2lmZGVmIF9fYWxwaGFfXworCisvKgorICogQXRvbWljIG9wZXJhdGlvbnMgdGhhdCBDIGNhbid0IGd1YXJhbnRlZSB1cy4gIFVzZWZ1bCBmb3IKKyAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uLgorICoKKyAqIEJ1dCB1c2UgdGhlc2UgYXMgc2VsZG9tIGFzIHBvc3NpYmxlIHNpbmNlIHRoZXkgYXJlIG11Y2ggc2xvd2VyCisgKiB0aGFuIHJlZ3VsYXIgb3BlcmF0aW9ucy4KKyAqLworCisKKy8qCisgKiBDb3VudGVyIGlzIHZvbGF0aWxlIHRvIG1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyCisgKiBhbmQgbW92ZSB0aGluZ3MgYXJvdW5kIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MKKyAqIHRoZSB1c2VyIGdhdmUgdXMsIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJKCAoYXRvbWljX3QpIHsgKGkpIH0gKQorCisjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQorI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJCSgodiktPmNvdW50ZXIgPSAoaSkpCisKKy8qCisgKiBUbyBnZXQgcHJvcGVyIGJyYW5jaCBwcmVkaWN0aW9uIGZvciB0aGUgbWFpbiBsaW5lLCB3ZSBtdXN0IGJyYW5jaAorICogZm9yd2FyZCB0byBjb2RlIGF0IHRoZSBlbmQgb2YgdGhpcyBvYmplY3QncyAudGV4dCBzZWN0aW9uLCB0aGVuCisgKiBicmFuY2ggYmFjayB0byByZXN0YXJ0IHRoZSBvcGVyYXRpb24uCisgKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfYWRkKGludCBpLCBhdG9taWNfdCAqIHYpCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wOworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIxOglsZGxfbCAlMCwlMVxuIgorCSIJYWRkbCAlMCwlMiwlMFxuIgorCSIJc3RsX2MgJTAsJTFcbiIKKwkiCWJlcSAlMCwyZlxuIgorCSIuc3Vic2VjdGlvbiAyXG4iCisJIjI6CWJyIDFiXG4iCisJIi5wcmV2aW91cyIKKwk6Ij0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQorCToiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKiB2KQoreworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiMToJbGRsX2wgJTAsJTFcbiIKKwkiCXN1YmwgJTAsJTIsJTBcbiIKKwkiCXN0bF9jICUwLCUxXG4iCisJIgliZXEgJTAsMmZcbiIKKwkiLnN1YnNlY3Rpb24gMlxuIgorCSIyOgliciAxYlxuIgorCSIucHJldmlvdXMiCisJOiI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlcikKKwk6IklyIiAoaSksICJtIiAodi0+Y291bnRlcikpOworfQorCisvKgorICogU2FtZSBhcyBhYm92ZSwgYnV0IHJldHVybiB0aGUgcmVzdWx0IHZhbHVlCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGxvbmcgYXRvbWljX2FkZF9yZXR1cm4oaW50IGksIGF0b21pY190ICogdikKK3sKKwlsb25nIHRlbXAsIHJlc3VsdDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiMToJbGRsX2wgJTAsJTFcbiIKKwkiCWFkZGwgJTAsJTMsJTJcbiIKKwkiCWFkZGwgJTAsJTMsJTBcbiIKKwkiCXN0bF9jICUwLCUxXG4iCisJIgliZXEgJTAsMmZcbiIKKwkiCW1iXG4iCisJIi5zdWJzZWN0aW9uIDJcbiIKKwkiMjoJYnIgMWJcbiIKKwkiLnByZXZpb3VzIgorCToiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpLCAiPSZyIiAocmVzdWx0KQorCToiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKSA6ICJtZW1vcnkiKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBsb25nIGF0b21pY19zdWJfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqIHYpCit7CisJbG9uZyB0ZW1wLCByZXN1bHQ7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIjE6CWxkbF9sICUwLCUxXG4iCisJIglzdWJsICUwLCUzLCUyXG4iCisJIglzdWJsICUwLCUzLCUwXG4iCisJIglzdGxfYyAlMCwlMVxuIgorCSIJYmVxICUwLDJmXG4iCisJIgltYlxuIgorCSIuc3Vic2VjdGlvbiAyXG4iCisJIjI6CWJyIDFiXG4iCisJIi5wcmV2aW91cyIKKwk6Ij0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKSwgIj0mciIgKHJlc3VsdCkKKwk6IklyIiAoaSksICJtIiAodi0+Y291bnRlcikgOiAibWVtb3J5Iik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBhdG9taWNfZGVjX3JldHVybih2KSBhdG9taWNfc3ViX3JldHVybigxLCh2KSkKKyNkZWZpbmUgYXRvbWljX2luY19yZXR1cm4odikgYXRvbWljX2FkZF9yZXR1cm4oMSwodikpCisKKyNkZWZpbmUgYXRvbWljX3N1Yl9hbmRfdGVzdChpLHYpIChhdG9taWNfc3ViX3JldHVybigoaSksICh2KSkgPT0gMCkKKyNkZWZpbmUgYXRvbWljX2RlY19hbmRfdGVzdCh2KSAoYXRvbWljX3N1Yl9yZXR1cm4oMSwgKHYpKSA9PSAwKQorCisjZGVmaW5lIGF0b21pY19pbmModikgYXRvbWljX2FkZCgxLCh2KSkKKyNkZWZpbmUgYXRvbWljX2RlYyh2KSBhdG9taWNfc3ViKDEsKHYpKQorCisjZGVmaW5lIG1iKCkgXAorX19hc21fXyBfX3ZvbGF0aWxlX18oIm1iIjogOiA6Im1lbW9yeSIpCisKKyNkZWZpbmUgcm1iKCkgXAorX19hc21fXyBfX3ZvbGF0aWxlX18oIm1iIjogOiA6Im1lbW9yeSIpCisKKyNkZWZpbmUgd21iKCkgXAorX19hc21fXyBfX3ZvbGF0aWxlX18oIndtYiI6IDogOiJtZW1vcnkiKQorCisjZGVmaW5lIElBVE9NSUNfREVGSU5FRAkJMQorCisjZW5kaWYgLyogX19hbHBoYV9fICovCisKKyNpZmRlZiBfX3Bvd2VycGNfXworCit0eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OworCisjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KKworI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKKyNkZWZpbmUgYXRvbWljX3NldCh2LGkpCQkoKCh2KS0+Y291bnRlcikgPSAoaSkpCisKK2V4dGVybiB2b2lkIGF0b21pY19jbGVhcl9tYXNrKHVuc2lnbmVkIGxvbmcgbWFzaywgdW5zaWduZWQgbG9uZyAqYWRkcik7CitleHRlcm4gdm9pZCBhdG9taWNfc2V0X21hc2sodW5zaWduZWQgbG9uZyBtYXNrLCB1bnNpZ25lZCBsb25nICphZGRyKTsKKworI2RlZmluZSBTTVBfSVNZTkMJIlxuXHRpc3luYyIKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfYWRkKGludCBhLCBhdG9taWNfdCAqdikKK3sKKwlpbnQgdDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorIjE6CWx3YXJ4CSUwLDAsJTMJCSMgYXRvbWljX2FkZFxuXAorCWFkZAklMCwlMiwlMFxuXAorCXN0d2N4LgklMCwwLCUzXG5cCisJYm5lLQkxYiIKKwk6ICI9JnIiICh0KSwgIj1tIiAodi0+Y291bnRlcikKKwk6ICJyIiAoYSksICJyIiAoJnYtPmNvdW50ZXIpLCAibSIgKHYtPmNvdW50ZXIpCisJOiAiY2MiKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBhLCBhdG9taWNfdCAqdikKK3sKKwlpbnQgdDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorIjE6CWx3YXJ4CSUwLDAsJTIJCSMgYXRvbWljX2FkZF9yZXR1cm5cblwKKwlhZGQJJTAsJTEsJTBcblwKKwlzdHdjeC4JJTAsMCwlMlxuXAorCWJuZS0JMWIiCisJU01QX0lTWU5DCisJOiAiPSZyIiAodCkKKwk6ICJyIiAoYSksICJyIiAoJnYtPmNvdW50ZXIpCisJOiAiY2MiLCAibWVtb3J5Iik7CisKKwlyZXR1cm4gdDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfc3ViKGludCBhLCBhdG9taWNfdCAqdikKK3sKKwlpbnQgdDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorIjE6CWx3YXJ4CSUwLDAsJTMJCSMgYXRvbWljX3N1YlxuXAorCXN1YmYJJTAsJTIsJTBcblwKKwlzdHdjeC4JJTAsMCwlM1xuXAorCWJuZS0JMWIiCisJOiAiPSZyIiAodCksICI9bSIgKHYtPmNvdW50ZXIpCisJOiAiciIgKGEpLCAiciIgKCZ2LT5jb3VudGVyKSwgIm0iICh2LT5jb3VudGVyKQorCTogImNjIik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfc3ViX3JldHVybihpbnQgYSwgYXRvbWljX3QgKnYpCit7CisJaW50IHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKyIxOglsd2FyeAklMCwwLCUyCQkjIGF0b21pY19zdWJfcmV0dXJuXG5cCisJc3ViZgklMCwlMSwlMFxuXAorCXN0d2N4LgklMCwwLCUyXG5cCisJYm5lLQkxYiIKKwlTTVBfSVNZTkMKKwk6ICI9JnIiICh0KQorCTogInIiIChhKSwgInIiICgmdi0+Y291bnRlcikKKwk6ICJjYyIsICJtZW1vcnkiKTsKKworCXJldHVybiB0OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19pbmMoYXRvbWljX3QgKnYpCit7CisJaW50IHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKyIxOglsd2FyeAklMCwwLCUyCQkjIGF0b21pY19pbmNcblwKKwlhZGRpYwklMCwlMCwxXG5cCisJc3R3Y3guCSUwLDAsJTJcblwKKwlibmUtCTFiIgorCTogIj0mciIgKHQpLCAiPW0iICh2LT5jb3VudGVyKQorCTogInIiICgmdi0+Y291bnRlciksICJtIiAodi0+Y291bnRlcikKKwk6ICJjYyIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX2luY19yZXR1cm4oYXRvbWljX3QgKnYpCit7CisJaW50IHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKyIxOglsd2FyeAklMCwwLCUxCQkjIGF0b21pY19pbmNfcmV0dXJuXG5cCisJYWRkaWMJJTAsJTAsMVxuXAorCXN0d2N4LgklMCwwLCUxXG5cCisJYm5lLQkxYiIKKwlTTVBfSVNZTkMKKwk6ICI9JnIiICh0KQorCTogInIiICgmdi0+Y291bnRlcikKKwk6ICJjYyIsICJtZW1vcnkiKTsKKworCXJldHVybiB0OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19kZWMoYXRvbWljX3QgKnYpCit7CisJaW50IHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKyIxOglsd2FyeAklMCwwLCUyCQkjIGF0b21pY19kZWNcblwKKwlhZGRpYwklMCwlMCwtMVxuXAorCXN0d2N4LgklMCwwLCUyXG5cCisJYm5lLQkxYiIKKwk6ICI9JnIiICh0KSwgIj1tIiAodi0+Y291bnRlcikKKwk6ICJyIiAoJnYtPmNvdW50ZXIpLCAibSIgKHYtPmNvdW50ZXIpCisJOiAiY2MiKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGF0b21pY19kZWNfcmV0dXJuKGF0b21pY190ICp2KQoreworCWludCB0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisiMToJbHdhcngJJTAsMCwlMQkJIyBhdG9taWNfZGVjX3JldHVyblxuXAorCWFkZGljCSUwLCUwLC0xXG5cCisJc3R3Y3guCSUwLDAsJTFcblwKKwlibmUtCTFiIgorCVNNUF9JU1lOQworCTogIj0mciIgKHQpCisJOiAiciIgKCZ2LT5jb3VudGVyKQorCTogImNjIiwgIm1lbW9yeSIpOworCisJcmV0dXJuIHQ7Cit9CisKKyNkZWZpbmUgYXRvbWljX3N1Yl9hbmRfdGVzdChhLCB2KQkoYXRvbWljX3N1Yl9yZXR1cm4oKGEpLCAodikpID09IDApCisjZGVmaW5lIGF0b21pY19kZWNfYW5kX3Rlc3QodikJCShhdG9taWNfZGVjX3JldHVybigodikpID09IDApCisKKy8qCisgKiBBdG9taWNhbGx5IHRlc3QgKnYgYW5kIGRlY3JlbWVudCBpZiBpdCBpcyBncmVhdGVyIHRoYW4gMC4KKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBvbGQgdmFsdWUgb2YgKnYgbWludXMgMS4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IGF0b21pY19kZWNfaWZfcG9zaXRpdmUoYXRvbWljX3QgKnYpCit7CisJaW50IHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKyIxOglsd2FyeAklMCwwLCUxCQkjIGF0b21pY19kZWNfaWZfcG9zaXRpdmVcblwKKwlhZGRpYy4JJTAsJTAsLTFcblwKKwlibHQtCTJmXG5cCisJc3R3Y3guCSUwLDAsJTFcblwKKwlibmUtCTFiIgorCVNNUF9JU1lOQworCSJcblwKKzI6Igk6ICI9JnIiICh0KQorCTogInIiICgmdi0+Y291bnRlcikKKwk6ICJjYyIsICJtZW1vcnkiKTsKKworCXJldHVybiB0OworfQorCisvKgorICogTWVtb3J5IGJhcnJpZXIuCisgKiBUaGUgc3luYyBpbnN0cnVjdGlvbiBndWFyYW50ZWVzIHRoYXQgYWxsIG1lbW9yeSBhY2Nlc3NlcyBpbml0aWF0ZWQKKyAqIGJ5IHRoaXMgcHJvY2Vzc29yIGhhdmUgYmVlbiBwZXJmb3JtZWQgKHdpdGggcmVzcGVjdCB0byBhbGwgb3RoZXIKKyAqIG1lY2hhbmlzbXMgdGhhdCBhY2Nlc3MgbWVtb3J5KS4gIFRoZSBlaWVpbyBpbnN0cnVjdGlvbiBpcyBhIGJhcnJpZXIKKyAqIHByb3ZpZGluZyBhbiBvcmRlcmluZyAoc2VwYXJhdGVseSkgZm9yIChhKSBjYWNoZWFibGUgc3RvcmVzIGFuZCAoYikKKyAqIGxvYWRzIGFuZCBzdG9yZXMgdG8gbm9uLWNhY2hlYWJsZSBtZW1vcnkgKGUuZy4gSS9PIGRldmljZXMpLgorICoKKyAqIG1iKCkgcHJldmVudHMgbG9hZHMgYW5kIHN0b3JlcyBiZWluZyByZW9yZGVyZWQgYWNyb3NzIHRoaXMgcG9pbnQuCisgKiBybWIoKSBwcmV2ZW50cyBsb2FkcyBiZWluZyByZW9yZGVyZWQgYWNyb3NzIHRoaXMgcG9pbnQuCisgKiB3bWIoKSBwcmV2ZW50cyBzdG9yZXMgYmVpbmcgcmVvcmRlcmVkIGFjcm9zcyB0aGlzIHBvaW50LgorICoKKyAqIFdlIGNhbiB1c2UgdGhlIGVpZWlvIGluc3RydWN0aW9uIGZvciB3bWIsIGJ1dCBzaW5jZSBpdCBkb2Vzbid0CisgKiBnaXZlIGFueSBvcmRlcmluZyBndWFyYW50ZWVzIGFib3V0IGxvYWRzLCB3ZSBoYXZlIHRvIHVzZSB0aGUKKyAqIHN0cm9uZ2VyIGJ1dCBzbG93ZXIgc3luYyBpbnN0cnVjdGlvbiBmb3IgbWIgYW5kIHJtYi4KKyAqLworI2RlZmluZSBtYigpICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiIDogOiA6ICJtZW1vcnkiKQorI2RlZmluZSBybWIoKSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5IikKKyNkZWZpbmUgd21iKCkgIF9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKQorCisjZGVmaW5lIElBVE9NSUNfREVGSU5FRAkJMQorCisjZW5kaWYgLyogX19wb3dlcnBjX18gKi8KKworI2lmZGVmIF9fbWlwc19fCisKK3R5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkgICAgeyAoaSkgfQorCisvKgorICogYXRvbWljX3JlYWQgLSByZWFkIGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgcmVhZHMgdGhlIHZhbHVlIG9mIEB2LiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovCisjZGVmaW5lIGF0b21pY19yZWFkKHYpCSgodiktPmNvdW50ZXIpCisKKy8qCisgKiBhdG9taWNfc2V0IC0gc2V0IGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogQGk6IHJlcXVpcmVkIHZhbHVlCisgKgorICogQXRvbWljYWxseSBzZXRzIHRoZSB2YWx1ZSBvZiBAdiB0byBAaS4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJKCh2KS0+Y291bnRlciA9IChpKSkKKworLyoKKyAqIGZvciBNSVBTIElJIGFuZCBiZXR0ZXIgd2UgY2FuIHVzZSBsbC9zYyBpbnN0cnVjdGlvbiwgYW5kIGtlcm5lbCAyLjQuMysKKyAqIHdpbGwgZW11bGF0ZSBpdCBvbiBNSVBTIEkuCisgKi8KKworLyoKKyAqIGF0b21pY19hZGQgLSBhZGQgaW50ZWdlciB0byBhdG9taWMgdmFyaWFibGUKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIGFkZAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgYWRkcyBAaSB0byBAdi4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZCB1c2VmdWwgcmFuZ2UKKyAqIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworZXh0ZXJuIF9faW5saW5lX18gdm9pZCBhdG9taWNfYWRkKGludCBpLCBhdG9taWNfdCAqIHYpCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIuc2V0IHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIuc2V0IG1pcHMyICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIxOiAgIGxsICAgICAgJTAsICUxICAgICAgIyBhdG9taWNfYWRkXG4iCisJCSIgICAgIGFkZHUgICAgJTAsICUyICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAgIHNjICAgICAgJTAsICUxICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAgIGJlcXogICAgJTAsIDFiICAgICAgICAgICAgICAgICAgXG4iCisJCSIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCTogIj0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQorCQk6ICJJciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpKTsKK30KKworLyoKKyAqIGF0b21pY19zdWIgLSBzdWJ0cmFjdCB0aGUgYXRvbWljIHZhcmlhYmxlCisgKiBAaTogaW50ZWdlciB2YWx1ZSB0byBzdWJ0cmFjdAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgc3VidHJhY3RzIEBpIGZyb20gQHYuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8KK2V4dGVybiBfX2lubGluZV9fIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKiB2KQoreworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiLnNldCBtaXBzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiMTogICBsbCAgICAgICUwLCAlMSAgICAgICMgYXRvbWljX3N1YlxuIgorCQkiICAgICBzdWJ1ICAgICUwLCAlMiAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgICBzYyAgICAgICUwLCAlMSAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgICBiZXF6ICAgICUwLCAxYiAgICAgICAgICAgICAgICAgIFxuIgorCQkiLnNldCBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQk6ICI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlcikKKwkJOiAiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKSk7Cit9CisKKy8qCisgKiBTYW1lIGFzIGFib3ZlLCBidXQgcmV0dXJuIHRoZSByZXN1bHQgdmFsdWUKKyAqLworZXh0ZXJuIF9faW5saW5lX18gaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqIHYpCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wLCByZXN1bHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIi5zZXQgcHVzaCAgICAgICAgICAgICAgICMgYXRvbWljX2FkZF9yZXR1cm5cbiIKKwkJIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIi5zZXQgbWlwczIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIjE6ICAgbGwgICAgICAlMSwgJTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgYWRkdSAgICAlMCwgJTEsICUzICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgc2MgICAgICAlMCwgJTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgYmVxeiAgICAlMCwgMWIgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgYWRkdSAgICAlMCwgJTEsICUzICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJOiAiPSZyIiAocmVzdWx0KSwgIj0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQorCQk6ICJJciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpCisJCTogIm1lbW9yeSIpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworZXh0ZXJuIF9faW5saW5lX18gaW50IGF0b21pY19zdWJfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqIHYpCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wLCByZXN1bHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIuc2V0IG1pcHMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiLnNldCBub3Jlb3JkZXIgICAgICAgICAgICMgYXRvbWljX3N1Yl9yZXR1cm5cbiIKKwkJIjE6ICAgbGwgICAgJTEsICUyICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAgIHN1YnUgICUwLCAlMSwgJTMgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgICBzYyAgICAlMCwgJTIgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgYmVxeiAgJTAsIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAgIHN1YnUgICUwLCAlMSwgJTMgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiLnNldCBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJOiAiPSZyIiAocmVzdWx0KSwgIj0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQorCQk6ICJJciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpCisJCTogIm1lbW9yeSIpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBhdG9taWNfZGVjX3JldHVybih2KSBhdG9taWNfc3ViX3JldHVybigxLCh2KSkKKyNkZWZpbmUgYXRvbWljX2luY19yZXR1cm4odikgYXRvbWljX2FkZF9yZXR1cm4oMSwodikpCisKKy8qCisgKiBhdG9taWNfc3ViX2FuZF90ZXN0IC0gc3VidHJhY3QgdmFsdWUgZnJvbSB2YXJpYWJsZSBhbmQgdGVzdCByZXN1bHQKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIHN1YnRyYWN0CisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBzdWJ0cmFjdHMgQGkgZnJvbSBAdiBhbmQgcmV0dXJucworICogdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIHplcm8sIG9yIGZhbHNlIGZvciBhbGwKKyAqIG90aGVyIGNhc2VzLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovCisjZGVmaW5lIGF0b21pY19zdWJfYW5kX3Rlc3QoaSx2KSAoYXRvbWljX3N1Yl9yZXR1cm4oKGkpLCAodikpID09IDApCisKKy8qCisgKiBhdG9taWNfaW5jX2FuZF90ZXN0IC0gaW5jcmVtZW50IGFuZCB0ZXN0CisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBpbmNyZW1lbnRzIEB2IGJ5IDEKKyAqIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBvciBmYWxzZSBmb3IgYWxsCisgKiBvdGhlciBjYXNlcy4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworI2RlZmluZSBhdG9taWNfaW5jX2FuZF90ZXN0KHYpIChhdG9taWNfaW5jX3JldHVybigxLCAodikpID09IDApCisKKy8qCisgKiBhdG9taWNfZGVjX2FuZF90ZXN0IC0gZGVjcmVtZW50IGJ5IDEgYW5kIHRlc3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgQHYgYnkgMSBhbmQKKyAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIDAsIG9yIGZhbHNlIGZvciBhbGwgb3RoZXIKKyAqIGNhc2VzLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovCisjZGVmaW5lIGF0b21pY19kZWNfYW5kX3Rlc3QodikgKGF0b21pY19zdWJfcmV0dXJuKDEsICh2KSkgPT0gMCkKKworLyoKKyAqIGF0b21pY19pbmMgLSBpbmNyZW1lbnQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBpbmNyZW1lbnRzIEB2IGJ5IDEuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8KKyNkZWZpbmUgYXRvbWljX2luYyh2KSBhdG9taWNfYWRkKDEsKHYpKQorCisvKgorICogYXRvbWljX2RlYyAtIGRlY3JlbWVudCBhbmQgdGVzdAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgZGVjcmVtZW50cyBAdiBieSAxLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovCisjZGVmaW5lIGF0b21pY19kZWModikgYXRvbWljX3N1YigxLCh2KSkKKworLyoKKyAqIGF0b21pY19hZGRfbmVnYXRpdmUgLSBhZGQgYW5kIHRlc3QgaWYgbmVnYXRpdmUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIGFkZAorICoKKyAqIEF0b21pY2FsbHkgYWRkcyBAaSB0byBAdiBhbmQgcmV0dXJucyB0cnVlCisgKiBpZiB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlLCBvciBmYWxzZSB3aGVuCisgKiByZXN1bHQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8uICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKgorICogQ3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCBmb3IgTUlQUy4KKyAqLworCisjZGVmaW5lIG1iKCkJCQkJCQlcCitfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkiIyBwcmV2ZW50IGluc3RydWN0aW9ucyBiZWluZyBtb3ZlZCBhcm91bmRcblx0IglcCisJIi5zZXRcdG5vcmVvcmRlclxuXHQiCQkJCVwKKwkiIyA4IG5vcHMgdG8gZm9vbCB0aGUgUjQ0MDAgcGlwZWxpbmVcblx0IglcCisJIm5vcDtub3A7bm9wO25vcDtub3A7bm9wO25vcDtub3Bcblx0IgkJXAorCSIuc2V0XHRyZW9yZGVyIgkJCQkJXAorCTogLyogbm8gb3V0cHV0ICovCQkJCVwKKwk6IC8qIG5vIGlucHV0ICovCQkJCVwKKwk6ICJtZW1vcnkiKQorI2RlZmluZSBybWIoKSBtYigpCisjZGVmaW5lIHdtYigpIG1iKCkKKworI2RlZmluZSBJQVRPTUlDX0RFRklORUQJCTEKKworI2VuZGlmIC8qIF9fbWlwc19fICovCisKKyNpZmRlZiBfX2FybV9fCisKKy8qCisgKiBGSVhNRTogYmVsbG93IGNvZGUgaXMgdmFsaWQgb25seSBmb3IgU0ExMXh4CisgKi8KKworLyoKKyAqIFNhdmUgdGhlIGN1cnJlbnQgaW50ZXJydXB0IGVuYWJsZSBzdGF0ZSAmIGRpc2FibGUgSVJRcworICovCisjZGVmaW5lIGxvY2FsX2lycV9zYXZlKHgpCQkJCQlcCisJKHsJCQkJCQkJXAorCQl1bnNpZ25lZCBsb25nIHRlbXA7CQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkibXJzCSUwLCBjcHNyCQlAIGxvY2FsX2lycV9zYXZlXG4iCVwKKyIJb3JyCSUxLCAlMCwgIzEyOFxuIgkJCQkJXAorIgltc3IJY3Bzcl9jLCAlMSIJCQkJCVwKKwk6ICI9ciIgKHgpLCAiPXIiICh0ZW1wKQkJCQkJXAorCToJCQkJCQkJXAorCTogIm1lbW9yeSIpOwkJCQkJCVwKKwl9KQorCisvKgorICogcmVzdG9yZSBzYXZlZCBJUlEgJiBGSVEgc3RhdGUKKyAqLworI2RlZmluZSBsb2NhbF9pcnFfcmVzdG9yZSh4KQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAorCSJtc3IJY3Bzcl9jLCAlMAkJQCBsb2NhbF9pcnFfcmVzdG9yZVxuIglcCisJOgkJCQkJCQlcCisJOiAiciIgKHgpCQkJCQkJXAorCTogIm1lbW9yeSIpCisKKyNkZWZpbmUgX19zYXZlX2ZsYWdzX2NsaSh4KSBsb2NhbF9pcnFfc2F2ZSh4KQorI2RlZmluZSBfX3Jlc3RvcmVfZmxhZ3MoeCkgbG9jYWxfaXJxX3Jlc3RvcmUoeCkKKwordHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKKworI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CisKKyNkZWZpbmUgYXRvbWljX3JlYWQodikJKCh2KS0+Y291bnRlcikKKyNkZWZpbmUgYXRvbWljX3NldCh2LGkpCSgoKHYpLT5jb3VudGVyKSA9IChpKSkKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfYWRkKGludCBpLCB2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJX19zYXZlX2ZsYWdzX2NsaShmbGFncyk7CisJdi0+Y291bnRlciArPSBpOworCV9fcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgdm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCV9fc2F2ZV9mbGFnc19jbGkoZmxhZ3MpOworCXYtPmNvdW50ZXIgLT0gaTsKKwlfX3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19pbmModm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCV9fc2F2ZV9mbGFnc19jbGkoZmxhZ3MpOworCXYtPmNvdW50ZXIgKz0gMTsKKwlfX3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19kZWModm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCV9fc2F2ZV9mbGFnc19jbGkoZmxhZ3MpOworCXYtPmNvdW50ZXIgLT0gMTsKKwlfX3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX2RlY19hbmRfdGVzdCh2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXN1bHQ7CisKKwlfX3NhdmVfZmxhZ3NfY2xpKGZsYWdzKTsKKwl2LT5jb3VudGVyIC09IDE7CisJcmVzdWx0ID0gKHYtPmNvdW50ZXIgPT0gMCk7CisJX19yZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfbmVnYXRpdmUoaW50IGksIHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlc3VsdDsKKworCV9fc2F2ZV9mbGFnc19jbGkoZmxhZ3MpOworCXYtPmNvdW50ZXIgKz0gaTsKKwlyZXN1bHQgPSAodi0+Y291bnRlciA8IDApOworCV9fcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19jbGVhcl9tYXNrKHVuc2lnbmVkIGxvbmcgbWFzaywgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJX19zYXZlX2ZsYWdzX2NsaShmbGFncyk7CisJKmFkZHIgJj0gfm1hc2s7CisJX19yZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworI2RlZmluZSBtYigpIF9fYXNtX18gX192b2xhdGlsZV9fICgiIiA6IDogOiAibWVtb3J5IikKKyNkZWZpbmUgcm1iKCkgbWIoKQorI2RlZmluZSB3bWIoKSBtYigpCisKKyNkZWZpbmUgSUFUT01JQ19ERUZJTkVECQkxCisKKyNlbmRpZiAvKiBfX2FybV9fICovCisKKyNpZmRlZiBfX3NoX18KKwordHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKKworI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CisKKyNkZWZpbmUgYXRvbWljX3JlYWQodikJCQkoKHYpLT5jb3VudGVyKQorI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJCQkoKCh2KS0+Y291bnRlcikgPSAoaSkpCisKKyNkZWZpbmUgYXRvbWljX2RlY19yZXR1cm4odikJCWF0b21pY19zdWJfcmV0dXJuKDEsKHYpKQorI2RlZmluZSBhdG9taWNfaW5jX3JldHVybih2KQkJYXRvbWljX2FkZF9yZXR1cm4oMSwodikpCisKKyNkZWZpbmUgYXRvbWljX3N1Yl9hbmRfdGVzdChpLHYpCShhdG9taWNfc3ViX3JldHVybigoaSksICh2KSkgPT0gMCkKKyNkZWZpbmUgYXRvbWljX2RlY19hbmRfdGVzdCh2KQkJKGF0b21pY19zdWJfcmV0dXJuKDEsICh2KSkgPT0gMCkKKyNkZWZpbmUgYXRvbWljX2luY19hbmRfdGVzdCh2KQkJKGF0b21pY19hZGRfcmV0dXJuKDEsICh2KSkgIT0gMCkKKworI2RlZmluZSBhdG9taWNfYWRkKGksdikJCQlhdG9taWNfYWRkX3JldHVybigoaSksKHYpKQorI2RlZmluZSBhdG9taWNfc3ViKGksdikJCQlhdG9taWNfc3ViX3JldHVybigoaSksKHYpKQorI2RlZmluZSBhdG9taWNfaW5jKHYpCQkJYXRvbWljX2FkZCgxLCh2KSkKKyNkZWZpbmUgYXRvbWljX2RlYyh2KQkJCWF0b21pY19zdWIoMSwodikpCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfYWRkX3JldHVybihpbnQgaSwgdm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJaW50IHJlc3VsdDsKKworCWFzbSB2b2xhdGlsZSAoCisJIgkuYWxpZ24JMlxuIgorCSIJbW92YQk5OWYsIHIwXG4iCisJIgltb3YJcjE1LCByMVxuIgorCSIJbW92CSMtNiwgcjE1XG4iCisJIgltb3YubAlAJTIsICUwXG4iCisJIglhZGQJJTEsICUwXG4iCisJIgltb3YubAklMCwgQCUyXG4iCisJIjk5Ogltb3YJcjEsIHIxNSIKKwk6ICI9JnIiKHJlc3VsdCkKKwk6ICJyIihpKSwgInIiKHYpCisJOiAicjAiLCAicjEiKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfc3ViX3JldHVybihpbnQgaSwgdm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJaW50IHJlc3VsdDsKKworCWFzbSB2b2xhdGlsZSAoCisJIgkuYWxpZ24JMlxuIgorCSIJbW92YQk5OWYsIHIwXG4iCisJIgltb3YJcjE1LCByMVxuIgorCSIJbW92CSMtNiwgcjE1XG4iCisJIgltb3YubAlAJTIsICUwXG4iCisJIglzdWIJJTEsICUwXG4iCisJIgltb3YubAklMCwgQCUyXG4iCisJIjk5Ogltb3YJcjEsIHIxNSIKKwk6ICI9JnIiKHJlc3VsdCkKKwk6ICJyIihpKSwgInIiKHYpCisJOiAicjAiLCAicjEiKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgbWIoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiIgOiA6IDogIm1lbW9yeSIpCisjZGVmaW5lIHJtYigpIG1iKCkKKyNkZWZpbmUgd21iKCkgbWIoKQorCisjZGVmaW5lIElBVE9NSUNfREVGSU5FRAkJMQorCisjZW5kaWYgLyogX19zaF9fICovCisKKyNpZmRlZiBfX2JmaW5fXworCisjaW5jbHVkZSA8YmZpbl9maXhlZF9jb2RlLmg+CisKK3R5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkgICB7IChpKSB9CisKKyNkZWZpbmUgYXRvbWljX3JlYWQodikgICAoKHYpLT5jb3VudGVyKQorI2RlZmluZSBhdG9taWNfc2V0KHYsaSkgICgoKHYpLT5jb3VudGVyKSA9IChpKSkKKyNkZWZpbmUgYXRvbWljX2FkZChpLHYpICBiZmluX2F0b21pY19hZGQzMigmKHYpLT5jb3VudGVyLCBpKQorI2RlZmluZSBhdG9taWNfc3ViKGksdikgIGJmaW5fYXRvbWljX3N1YjMyKCYodiktPmNvdW50ZXIsIGkpCisjZGVmaW5lIGF0b21pY19pbmModikgICAgYmZpbl9hdG9taWNfaW5jMzIoJih2KS0+Y291bnRlcik7CisjZGVmaW5lIGF0b21pY19kZWModikgICAgYmZpbl9hdG9taWNfZGVjMzIoJih2KS0+Y291bnRlcik7CisKKyNkZWZpbmUgbWIoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiIgOiA6IDogIm1lbW9yeSIpCisjZGVmaW5lIHJtYigpIG1iKCkKKyNkZWZpbmUgd21iKCkgbWIoKQorCisjZGVmaW5lIElBVE9NSUNfREVGSU5FRCAxCisKKyNlbmRpZiAvKiBfX2JmaW5fXyAqLworCisjaWZuZGVmIElBVE9NSUNfREVGSU5FRAorLyoKKyAqIG5vbiBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlLgorICovCisjd2FybmluZyAiQXRvbWljIG9wZXJhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBhcmNoaXRlY3R1cmUuIgorCit0eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OworCisjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KKworI2RlZmluZSBhdG9taWNfcmVhZCh2KQkoKHYpLT5jb3VudGVyKQorI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJKCgodiktPmNvdW50ZXIpID0gKGkpKQorI2RlZmluZSBhdG9taWNfYWRkKGksdikgKCgodiktPmNvdW50ZXIpICs9IChpKSkKKyNkZWZpbmUgYXRvbWljX3N1YihpLHYpICgoKHYpLT5jb3VudGVyKSAtPSAoaSkpCisjZGVmaW5lIGF0b21pY19pbmModikgICAoKCh2KS0+Y291bnRlcikrKykKKyNkZWZpbmUgYXRvbWljX2RlYyh2KSAgICgoKHYpLT5jb3VudGVyKS0tKQorCisjZGVmaW5lIG1iKCkKKyNkZWZpbmUgcm1iKCkKKyNkZWZpbmUgd21iKCkKKworI2RlZmluZSBJQVRPTUlDX0RFRklORUQJCTEKKworI2VuZGlmIC8qIElBVE9NSUNfREVGSU5FRCAqLworCisvKgorICogIEF0b21pYyByZWFkL3dyaXRlCisgKiAgQ29weXJpZ2h0IChjKSAyMDAxIGJ5IEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqLworCisvKiBNYXggbnVtYmVyIG9mIHRpbWVzIHdlIG11c3Qgc3BpbiBvbiBhIHNwaW4tbG9jayBjYWxsaW5nIHNjaGVkX3lpZWxkKCkuCisgICBBZnRlciBNQVhfU1BJTl9DT1VOVCBpdGVyYXRpb25zLCB3ZSBwdXQgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHNsZWVwLiAqLworCisjaWZuZGVmIE1BWF9TUElOX0NPVU5UCisjZGVmaW5lIE1BWF9TUElOX0NPVU5UIDUwCisjZW5kaWYKKworLyogRHVyYXRpb24gb2Ygc2xlZXAgKGluIG5hbm9zZWNvbmRzKSB3aGVuIHdlIGNhbid0IGFjcXVpcmUgYSBzcGluLWxvY2sKKyAgIGFmdGVyIE1BWF9TUElOX0NPVU5UIGl0ZXJhdGlvbnMgb2Ygc2NoZWRfeWllbGQoKS4KKyAgIFRoaXMgTVVTVCBCRSA+IDJtcy4KKyAgIChPdGhlcndpc2UgdGhlIGtlcm5lbCBkb2VzIGJ1c3ktd2FpdGluZyBmb3IgcmVhbC10aW1lIHRocmVhZHMsCisgICAgZ2l2aW5nIG90aGVyIHRocmVhZHMgbm8gY2hhbmNlIHRvIHJ1bi4pICovCisKKyNpZm5kZWYgU1BJTl9TTEVFUF9EVVJBVElPTgorI2RlZmluZSBTUElOX1NMRUVQX0RVUkFUSU9OIDIwMDAwMDEKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGJlZ2luLCBlbmQ7Cit9IHNuZF9hdG9taWNfd3JpdGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIGNvbnN0IHNuZF9hdG9taWNfd3JpdGVfdCAqd3JpdGU7CisJdW5zaWduZWQgaW50IGVuZDsKK30gc25kX2F0b21pY19yZWFkX3Q7CisKK3ZvaWQgc25kX2F0b21pY19yZWFkX3dhaXQoc25kX2F0b21pY19yZWFkX3QgKnQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2F0b21pY193cml0ZV9pbml0KHNuZF9hdG9taWNfd3JpdGVfdCAqdykKK3sKKwl3LT5iZWdpbiA9IDA7CisJdy0+ZW5kID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9hdG9taWNfd3JpdGVfYmVnaW4oc25kX2F0b21pY193cml0ZV90ICp3KQoreworCXctPmJlZ2luKys7CisJd21iKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfYXRvbWljX3dyaXRlX2VuZChzbmRfYXRvbWljX3dyaXRlX3QgKncpCit7CisJd21iKCk7CisJdy0+ZW5kKys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfYXRvbWljX3JlYWRfaW5pdChzbmRfYXRvbWljX3JlYWRfdCAqciwgc25kX2F0b21pY193cml0ZV90ICp3KQoreworCXItPndyaXRlID0gdzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9hdG9taWNfcmVhZF9iZWdpbihzbmRfYXRvbWljX3JlYWRfdCAqcikKK3sKKwlyLT5lbmQgPSByLT53cml0ZS0+ZW5kOworCXJtYigpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzbmRfYXRvbWljX3JlYWRfb2soc25kX2F0b21pY19yZWFkX3QgKnIpCit7CisJcm1iKCk7CisJcmV0dXJuIHItPmVuZCA9PSByLT53cml0ZS0+YmVnaW47Cit9CisKKyNlbmRpZiAvKiBfX0FMU0FfSUFUT01JQ19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvaW5wdXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9pbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNWQwZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvaW5wdXQuaApAQCAtMCwwICsxLDgzIEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvaW5wdXQuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfSU5QVVRfSAorI2RlZmluZSBfX0FMU0FfSU5QVVRfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBJbnB1dCBJbnB1dCBJbnRlcmZhY2UKKyAqCisgKiAgVGhlIGlucHV0IGZ1bmN0aW9ucyBwcmVzZW50IGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoZSBzdGRpbyBmdW5jdGlvbnMKKyAqICBvbiB0b3Agb2YgZGlmZmVyZW50IHVuZGVybHlpbmcgaW5wdXQgc291cmNlcy4KKyAqCisgKiAgVGhlICNzbmRfY29uZmlnX2xvYWQgZnVuY3Rpb24gdXNlcyBzdWNoIGFuIGlucHV0IGhhbmRsZSB0byBiZSBhYmxlIHRvCisgKiAgbG9hZCBjb25maWd1cmF0aW9ucyBub3Qgb25seSBmcm9tIHN0YW5kYXJkIGZpbGVzIGJ1dCBhbHNvIGZyb20gb3RoZXIKKyAqICBzb3VyY2VzLCBlLmcuIGZyb20gbWVtb3J5IGJ1ZmZlcnMuCisgKgorICogIFx7CisgKi8KKworLyoqCisgKiBcYnJpZWYgSW50ZXJuYWwgc3RydWN0dXJlIGZvciBhbiBpbnB1dCBvYmplY3QuCisgKgorICogVGhlIEFMU0EgbGlicmFyeSB1c2VzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBhcyBhIGhhbmRsZSB0byBhbgorICogaW5wdXQgb2JqZWN0LiBBcHBsaWNhdGlvbnMgZG9uJ3QgYWNjZXNzIGl0cyBjb250ZW50cyBkaXJlY3RseS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9pbnB1dCBzbmRfaW5wdXRfdDsKKworLyoqIElucHV0IHR5cGUuICovCit0eXBlZGVmIGVudW0gX3NuZF9pbnB1dF90eXBlIHsKKwkvKiogSW5wdXQgZnJvbSBhIHN0ZGlvIHN0cmVhbS4gKi8KKwlTTkRfSU5QVVRfU1RESU8sCisJLyoqIElucHV0IGZyb20gYSBtZW1vcnkgYnVmZmVyLiAqLworCVNORF9JTlBVVF9CVUZGRVIKK30gc25kX2lucHV0X3R5cGVfdDsKKworaW50IHNuZF9pbnB1dF9zdGRpb19vcGVuKHNuZF9pbnB1dF90ICoqaW5wdXRwLCBjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICptb2RlKTsKK2ludCBzbmRfaW5wdXRfc3RkaW9fYXR0YWNoKHNuZF9pbnB1dF90ICoqaW5wdXRwLCBGSUxFICpmcCwgaW50IF9jbG9zZSk7CitpbnQgc25kX2lucHV0X2J1ZmZlcl9vcGVuKHNuZF9pbnB1dF90ICoqaW5wdXRwLCBjb25zdCBjaGFyICpidWZmZXIsIHNzaXplX3Qgc2l6ZSk7CitpbnQgc25kX2lucHV0X2Nsb3NlKHNuZF9pbnB1dF90ICppbnB1dCk7CitpbnQgc25kX2lucHV0X3NjYW5mKHNuZF9pbnB1dF90ICppbnB1dCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisjaWZuZGVmIERPQ19ISURERU4KKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChzY2FuZiwgMiwgMykpKQorI2VuZGlmCisJOworY2hhciAqc25kX2lucHV0X2dldHMoc25kX2lucHV0X3QgKmlucHV0LCBjaGFyICpzdHIsIHNpemVfdCBzaXplKTsKK2ludCBzbmRfaW5wdXRfZ2V0YyhzbmRfaW5wdXRfdCAqaW5wdXQpOworaW50IHNuZF9pbnB1dF91bmdldGMoc25kX2lucHV0X3QgKmlucHV0LCBpbnQgYyk7CisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX0lOUFVUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9taXhlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL21peGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyNTZhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9taXhlci5oCkBAIC0wLDAgKzEsMzE3IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvbWl4ZXIuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfTUlYRVJfSAorI2RlZmluZSBfX0FMU0FfTUlYRVJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBNaXhlciBNaXhlciBJbnRlcmZhY2UKKyAqICBUaGUgbWl4ZXIgaW50ZXJmYWNlLgorICogIFx7CisgKi8KKworLyoqIE1peGVyIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9taXhlciBzbmRfbWl4ZXJfdDsKKy8qKiBNaXhlciBlbGVtZW50cyBjbGFzcyBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfbWl4ZXJfY2xhc3Mgc25kX21peGVyX2NsYXNzX3Q7CisvKiogTWl4ZXIgZWxlbWVudCBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfbWl4ZXJfZWxlbSBzbmRfbWl4ZXJfZWxlbV90OworCisvKiogCisgKiBcYnJpZWYgTWl4ZXIgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIFxwYXJhbSBtaXhlciBNaXhlciBoYW5kbGUKKyAqIFxwYXJhbSBtYXNrIGV2ZW50IG1hc2sKKyAqIFxwYXJhbSBlbGVtIHJlbGF0ZWQgbWl4ZXIgZWxlbWVudCAoaWYgYW55KQorICogXHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCit0eXBlZGVmIGludCAoKnNuZF9taXhlcl9jYWxsYmFja190KShzbmRfbWl4ZXJfdCAqY3RsLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbWFzaywKKwkJCQkgICAgc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CisKKy8qKiAKKyAqIFxicmllZiBNaXhlciBlbGVtZW50IGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBccGFyYW0gZWxlbSBNaXhlciBlbGVtZW50CisgKiBccGFyYW0gbWFzayBldmVudCBtYXNrCisgKiBccmV0dXJuIDAgb24gc3VjY2VzcyBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KK3R5cGVkZWYgaW50ICgqc25kX21peGVyX2VsZW1fY2FsbGJhY2tfdCkoc25kX21peGVyX2VsZW1fdCAqZWxlbSwKKwkJCQkJIHVuc2lnbmVkIGludCBtYXNrKTsKKworLyoqCisgKiBcYnJpZWYgQ29tcGFyZSBmdW5jdGlvbiBmb3Igc29ydGluZyBtaXhlciBlbGVtZW50cworICogXHBhcmFtIGUxIEZpcnN0IGVsZW1lbnQKKyAqIFxwYXJhbSBlMiBTZWNvbmQgZWxlbWVudAorICogXHJldHVybiAtMSBpZiBlMSA8IGUyLCAwIGlmIGUxID09IGUyLCAxIGlmIGUxID4gZTIKKyAqLwordHlwZWRlZiBpbnQgKCpzbmRfbWl4ZXJfY29tcGFyZV90KShjb25zdCBzbmRfbWl4ZXJfZWxlbV90ICplMSwKKwkJCQkgICBjb25zdCBzbmRfbWl4ZXJfZWxlbV90ICplMik7CisKKy8qKgorICogXGJyaWVmIEV2ZW50IGNhbGxiYWNrIGZvciB0aGUgbWl4ZXIgY2xhc3MKKyAqIFxwYXJhbSBjbGFzc18gTWl4ZXIgY2xhc3MKKyAqIFxwYXJhbSBtYXNrIEV2ZW50IG1hc2sgKFNORF9DVExfRVZFTlRfKikKKyAqIFxwYXJhbSBoZWxlbSBIQ1RMIGVsZW1lbnQgd2hpY2ggaW52b2tlZCB0aGUgZXZlbnQKKyAqIFxwYXJhbSBtZWxlbSBNaXhlciBlbGVtZW50IGFzc29jaWF0ZWQgdG8gSENUTCBlbGVtZW50CisgKiBccmV0dXJuIHplcm8gaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgdmFsdWUKKyAqLwordHlwZWRlZiBpbnQgKCpzbmRfbWl4ZXJfZXZlbnRfdCkoc25kX21peGVyX2NsYXNzX3QgKmNsYXNzXywgdW5zaWduZWQgaW50IG1hc2ssCisJCQkJIHNuZF9oY3RsX2VsZW1fdCAqaGVsZW0sIHNuZF9taXhlcl9lbGVtX3QgKm1lbGVtKTsKKworCisvKiogTWl4ZXIgZWxlbWVudCB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9taXhlcl9lbGVtX3R5cGUgeworCS8qIFNpbXBsZSBtaXhlciBlbGVtZW50cyAqLworCVNORF9NSVhFUl9FTEVNX1NJTVBMRSwKKwlTTkRfTUlYRVJfRUxFTV9MQVNUID0gU05EX01JWEVSX0VMRU1fU0lNUExFCit9IHNuZF9taXhlcl9lbGVtX3R5cGVfdDsKKworaW50IHNuZF9taXhlcl9vcGVuKHNuZF9taXhlcl90ICoqbWl4ZXIsIGludCBtb2RlKTsKK2ludCBzbmRfbWl4ZXJfY2xvc2Uoc25kX21peGVyX3QgKm1peGVyKTsKK3NuZF9taXhlcl9lbGVtX3QgKnNuZF9taXhlcl9maXJzdF9lbGVtKHNuZF9taXhlcl90ICptaXhlcik7CitzbmRfbWl4ZXJfZWxlbV90ICpzbmRfbWl4ZXJfbGFzdF9lbGVtKHNuZF9taXhlcl90ICptaXhlcik7CitpbnQgc25kX21peGVyX2hhbmRsZV9ldmVudHMoc25kX21peGVyX3QgKm1peGVyKTsKK2ludCBzbmRfbWl4ZXJfYXR0YWNoKHNuZF9taXhlcl90ICptaXhlciwgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgc25kX21peGVyX2F0dGFjaF9oY3RsKHNuZF9taXhlcl90ICptaXhlciwgc25kX2hjdGxfdCAqaGN0bCk7CitpbnQgc25kX21peGVyX2RldGFjaChzbmRfbWl4ZXJfdCAqbWl4ZXIsIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHNuZF9taXhlcl9kZXRhY2hfaGN0bChzbmRfbWl4ZXJfdCAqbWl4ZXIsIHNuZF9oY3RsX3QgKmhjdGwpOworaW50IHNuZF9taXhlcl9nZXRfaGN0bChzbmRfbWl4ZXJfdCAqbWl4ZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHNuZF9oY3RsX3QgKipoY3RsKTsKK2ludCBzbmRfbWl4ZXJfcG9sbF9kZXNjcmlwdG9yc19jb3VudChzbmRfbWl4ZXJfdCAqbWl4ZXIpOworaW50IHNuZF9taXhlcl9wb2xsX2Rlc2NyaXB0b3JzKHNuZF9taXhlcl90ICptaXhlciwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IHNwYWNlKTsKK2ludCBzbmRfbWl4ZXJfcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKHNuZF9taXhlcl90ICptaXhlciwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IG5mZHMsIHVuc2lnbmVkIHNob3J0ICpyZXZlbnRzKTsKK2ludCBzbmRfbWl4ZXJfbG9hZChzbmRfbWl4ZXJfdCAqbWl4ZXIpOwordm9pZCBzbmRfbWl4ZXJfZnJlZShzbmRfbWl4ZXJfdCAqbWl4ZXIpOworaW50IHNuZF9taXhlcl93YWl0KHNuZF9taXhlcl90ICptaXhlciwgaW50IHRpbWVvdXQpOworaW50IHNuZF9taXhlcl9zZXRfY29tcGFyZShzbmRfbWl4ZXJfdCAqbWl4ZXIsIHNuZF9taXhlcl9jb21wYXJlX3QgbXNvcnQpOwordm9pZCBzbmRfbWl4ZXJfc2V0X2NhbGxiYWNrKHNuZF9taXhlcl90ICpvYmosIHNuZF9taXhlcl9jYWxsYmFja190IHZhbCk7Cit2b2lkICogc25kX21peGVyX2dldF9jYWxsYmFja19wcml2YXRlKGNvbnN0IHNuZF9taXhlcl90ICpvYmopOwordm9pZCBzbmRfbWl4ZXJfc2V0X2NhbGxiYWNrX3ByaXZhdGUoc25kX21peGVyX3QgKm9iaiwgdm9pZCAqIHZhbCk7Cit1bnNpZ25lZCBpbnQgc25kX21peGVyX2dldF9jb3VudChjb25zdCBzbmRfbWl4ZXJfdCAqb2JqKTsKK2ludCBzbmRfbWl4ZXJfY2xhc3NfdW5yZWdpc3RlcihzbmRfbWl4ZXJfY2xhc3NfdCAqY2xzcyk7CisKK3NuZF9taXhlcl9lbGVtX3QgKnNuZF9taXhlcl9lbGVtX25leHQoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitzbmRfbWl4ZXJfZWxlbV90ICpzbmRfbWl4ZXJfZWxlbV9wcmV2KHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOwordm9pZCBzbmRfbWl4ZXJfZWxlbV9zZXRfY2FsbGJhY2soc25kX21peGVyX2VsZW1fdCAqb2JqLCBzbmRfbWl4ZXJfZWxlbV9jYWxsYmFja190IHZhbCk7Cit2b2lkICogc25kX21peGVyX2VsZW1fZ2V0X2NhbGxiYWNrX3ByaXZhdGUoY29uc3Qgc25kX21peGVyX2VsZW1fdCAqb2JqKTsKK3ZvaWQgc25kX21peGVyX2VsZW1fc2V0X2NhbGxiYWNrX3ByaXZhdGUoc25kX21peGVyX2VsZW1fdCAqb2JqLCB2b2lkICogdmFsKTsKK3NuZF9taXhlcl9lbGVtX3R5cGVfdCBzbmRfbWl4ZXJfZWxlbV9nZXRfdHlwZShjb25zdCBzbmRfbWl4ZXJfZWxlbV90ICpvYmopOworCitpbnQgc25kX21peGVyX2NsYXNzX3JlZ2lzdGVyKHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18sIHNuZF9taXhlcl90ICptaXhlcik7CitpbnQgc25kX21peGVyX2VsZW1fbmV3KHNuZF9taXhlcl9lbGVtX3QgKiplbGVtLAorCQkgICAgICAgc25kX21peGVyX2VsZW1fdHlwZV90IHR5cGUsCisJCSAgICAgICBpbnQgY29tcGFyZV93ZWlnaHQsCisJCSAgICAgICB2b2lkICpwcml2YXRlX2RhdGEsCisJCSAgICAgICB2b2lkICgqcHJpdmF0ZV9mcmVlKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKSk7CitpbnQgc25kX21peGVyX2VsZW1fYWRkKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18pOworaW50IHNuZF9taXhlcl9lbGVtX3JlbW92ZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK3ZvaWQgc25kX21peGVyX2VsZW1fZnJlZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfZWxlbV9pbmZvKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9lbGVtX3ZhbHVlKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9lbGVtX2F0dGFjaChzbmRfbWl4ZXJfZWxlbV90ICptZWxlbSwgc25kX2hjdGxfZWxlbV90ICpoZWxlbSk7CitpbnQgc25kX21peGVyX2VsZW1fZGV0YWNoKHNuZF9taXhlcl9lbGVtX3QgKm1lbGVtLCBzbmRfaGN0bF9lbGVtX3QgKmhlbGVtKTsKK2ludCBzbmRfbWl4ZXJfZWxlbV9lbXB0eShzbmRfbWl4ZXJfZWxlbV90ICptZWxlbSk7Cit2b2lkICpzbmRfbWl4ZXJfZWxlbV9nZXRfcHJpdmF0ZShjb25zdCBzbmRfbWl4ZXJfZWxlbV90ICptZWxlbSk7CisKK3NpemVfdCBzbmRfbWl4ZXJfY2xhc3Nfc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfbWl4ZXJfY2xhc3NfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9taXhlcl9jbGFzc19hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfbWl4ZXJfY2xhc3MpCitpbnQgc25kX21peGVyX2NsYXNzX21hbGxvYyhzbmRfbWl4ZXJfY2xhc3NfdCAqKnB0cik7Cit2b2lkIHNuZF9taXhlcl9jbGFzc19mcmVlKHNuZF9taXhlcl9jbGFzc190ICpvYmopOwordm9pZCBzbmRfbWl4ZXJfY2xhc3NfY29weShzbmRfbWl4ZXJfY2xhc3NfdCAqZHN0LCBjb25zdCBzbmRfbWl4ZXJfY2xhc3NfdCAqc3JjKTsKK3NuZF9taXhlcl90ICpzbmRfbWl4ZXJfY2xhc3NfZ2V0X21peGVyKGNvbnN0IHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18pOworc25kX21peGVyX2V2ZW50X3Qgc25kX21peGVyX2NsYXNzX2dldF9ldmVudChjb25zdCBzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3NfKTsKK3ZvaWQgKnNuZF9taXhlcl9jbGFzc19nZXRfcHJpdmF0ZShjb25zdCBzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3NfKTsKK3NuZF9taXhlcl9jb21wYXJlX3Qgc25kX21peGVyX2NsYXNzX2dldF9jb21wYXJlKGNvbnN0IHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18pOworaW50IHNuZF9taXhlcl9jbGFzc19zZXRfZXZlbnQoc25kX21peGVyX2NsYXNzX3QgKmNsYXNzXywgc25kX21peGVyX2V2ZW50X3QgZXZlbnQpOworaW50IHNuZF9taXhlcl9jbGFzc19zZXRfcHJpdmF0ZShzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3NfLCB2b2lkICpwcml2YXRlX2RhdGEpOworaW50IHNuZF9taXhlcl9jbGFzc19zZXRfcHJpdmF0ZV9mcmVlKHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18sIHZvaWQgKCpwcml2YXRlX2ZyZWUpKHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18pKTsKK2ludCBzbmRfbWl4ZXJfY2xhc3Nfc2V0X2NvbXBhcmUoc25kX21peGVyX2NsYXNzX3QgKmNsYXNzXywgc25kX21peGVyX2NvbXBhcmVfdCBjb21wYXJlKTsKKworLyoqCisgKiAgXGRlZmdyb3VwIFNpbXBsZU1peGVyIFNpbXBsZSBNaXhlciBJbnRlcmZhY2UKKyAqICBcaW5ncm91cCBNaXhlcgorICogIFRoZSBzaW1wbGUgbWl4ZXIgaW50ZXJmYWNlLgorICogIFx7CisgKi8KKworLyogU2ltcGxlIG1peGVyIGVsZW1lbnRzIEFQSSAqLworCisvKiogTWl4ZXIgc2ltcGxlIGVsZW1lbnQgY2hhbm5lbCBpZGVudGlmaWVyICovCit0eXBlZGVmIGVudW0gX3NuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkIHsKKwkvKiogVW5rbm93biAqLworCVNORF9NSVhFUl9TQ0hOX1VOS05PV04gPSAtMSwKKwkvKiogRnJvbnQgbGVmdCAqLworCVNORF9NSVhFUl9TQ0hOX0ZST05UX0xFRlQgPSAwLAorCS8qKiBGcm9udCByaWdodCAqLworCVNORF9NSVhFUl9TQ0hOX0ZST05UX1JJR0hULAorCS8qKiBSZWFyIGxlZnQgKi8KKwlTTkRfTUlYRVJfU0NITl9SRUFSX0xFRlQsCisJLyoqIFJlYXIgcmlnaHQgKi8KKwlTTkRfTUlYRVJfU0NITl9SRUFSX1JJR0hULAorCS8qKiBGcm9udCBjZW50ZXIgKi8KKwlTTkRfTUlYRVJfU0NITl9GUk9OVF9DRU5URVIsCisJLyoqIFdvb2ZlciAqLworCVNORF9NSVhFUl9TQ0hOX1dPT0ZFUiwKKwkvKiogU2lkZSBMZWZ0ICovCisJU05EX01JWEVSX1NDSE5fU0lERV9MRUZULAorCS8qKiBTaWRlIFJpZ2h0ICovCisJU05EX01JWEVSX1NDSE5fU0lERV9SSUdIVCwKKwkvKiogUmVhciBDZW50ZXIgKi8KKwlTTkRfTUlYRVJfU0NITl9SRUFSX0NFTlRFUiwKKwlTTkRfTUlYRVJfU0NITl9MQVNUID0gMzEsCisJLyoqIE1vbm8gKEZyb250IGxlZnQgYWxpYXMpICovCisJU05EX01JWEVSX1NDSE5fTU9OTyA9IFNORF9NSVhFUl9TQ0hOX0ZST05UX0xFRlQKK30gc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdDsKKworLyoqIE1peGVyIHNpbXBsZSBlbGVtZW50IC0gcmVnaXN0ZXIgb3B0aW9ucyAtIGFic3RyYWN0aW9uIGxldmVsICovCitlbnVtIHNuZF9taXhlcl9zZWxlbV9yZWdvcHRfYWJzdHJhY3QgeworCS8qKiBubyBhYnN0cmFjdGlvbiAtIHRyeSB1c2UgYWxsIHVuaXZlcnNhbCBjb250cm9scyBmcm9tIGRyaXZlciAqLworCVNORF9NSVhFUl9TQUJTVFJBQ1RfTk9ORSA9IDAsCisJLyoqIGJhc2ljIGFic3RyYWN0aW9uIC0gTWFzdGVyLFBDTSxDRCxBdXgsUmVjb3JkLUdhaW4gZXRjLiAqLworCVNORF9NSVhFUl9TQUJTVFJBQ1RfQkFTSUMsCit9OworCisvKiogTWl4ZXIgc2ltcGxlIGVsZW1lbnQgLSByZWdpc3RlciBvcHRpb25zICovCitzdHJ1Y3Qgc25kX21peGVyX3NlbGVtX3JlZ29wdCB7CisJLyoqIHN0cnVjdHVyZSB2ZXJzaW9uICovCisJaW50IHZlcjsKKwkvKiogdjE6IGFic3RyYWN0IGxheWVyIHNlbGVjdGlvbiAqLworCWVudW0gc25kX21peGVyX3NlbGVtX3JlZ29wdF9hYnN0cmFjdCBhYnN0cmFjdDsKKwkvKiogdjE6IGRldmljZSBuYW1lIChtdXN0IGJlIE5VTEwgd2hlbiBwbGF5YmFja19wY20gb3IgY2FwdHVyZV9wY20gIT0gTlVMTCkgKi8KKwljb25zdCBjaGFyICpkZXZpY2U7CisJLyoqIHYxOiBwbGF5YmFjayBQQ00gY29ubmVjdGVkIHRvIG1peGVyIGRldmljZSAoTlVMTCA9PSBub25lKSAqLworCXNuZF9wY21fdCAqcGxheWJhY2tfcGNtOworCS8qKiB2MTogY2FwdHVyZSBQQ00gY29ubmVjdGVkIHRvIG1peGVyIGRldmljZSAoTlVMTCA9PSBub25lKSAqLworCXNuZF9wY21fdCAqY2FwdHVyZV9wY207Cit9OworCisvKiogTWl4ZXIgc2ltcGxlIGVsZW1lbnQgaWRlbnRpZmllciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9taXhlcl9zZWxlbV9pZCBzbmRfbWl4ZXJfc2VsZW1faWRfdDsKKworY29uc3QgY2hhciAqc25kX21peGVyX3NlbGVtX2NoYW5uZWxfbmFtZShzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwpOworCitpbnQgc25kX21peGVyX3NlbGVtX3JlZ2lzdGVyKHNuZF9taXhlcl90ICptaXhlciwKKwkJCSAgICAgc3RydWN0IHNuZF9taXhlcl9zZWxlbV9yZWdvcHQgKm9wdGlvbnMsCisJCQkgICAgIHNuZF9taXhlcl9jbGFzc190ICoqY2xhc3NwKTsKK3ZvaWQgc25kX21peGVyX3NlbGVtX2dldF9pZChzbmRfbWl4ZXJfZWxlbV90ICplbGVtZW50LAorCQkJICAgIHNuZF9taXhlcl9zZWxlbV9pZF90ICppZCk7Citjb25zdCBjaGFyICpzbmRfbWl4ZXJfc2VsZW1fZ2V0X25hbWUoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7Cit1bnNpZ25lZCBpbnQgc25kX21peGVyX3NlbGVtX2dldF9pbmRleChzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK3NuZF9taXhlcl9lbGVtX3QgKnNuZF9taXhlcl9maW5kX3NlbGVtKHNuZF9taXhlcl90ICptaXhlciwKKwkJCQkgICAgICAgY29uc3Qgc25kX21peGVyX3NlbGVtX2lkX3QgKmlkKTsKKworaW50IHNuZF9taXhlcl9zZWxlbV9pc19hY3RpdmUoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2lzX3BsYXliYWNrX21vbm8oc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja19jaGFubmVsKHNuZF9taXhlcl9lbGVtX3QgKm9iaiwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faXNfY2FwdHVyZV9tb25vKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9jaGFubmVsKHNuZF9taXhlcl9lbGVtX3QgKm9iaiwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfZ3JvdXAoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2hhc19jb21tb25fdm9sdW1lKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfdm9sdW1lKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfdm9sdW1lX2pvaW5lZChzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfdm9sdW1lKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV92b2x1bWVfam9pbmVkKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9oYXNfY29tbW9uX3N3aXRjaChzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3N3aXRjaChzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3N3aXRjaF9qb2luZWQoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaChzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfc3dpdGNoX2pvaW5lZChzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfc3dpdGNoX2V4Y2x1c2l2ZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKKworaW50IHNuZF9taXhlcl9zZWxlbV9hc2tfcGxheWJhY2tfdm9sX2RCKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGxvbmcgdmFsdWUsIGxvbmcgKmRCdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9hc2tfY2FwdHVyZV92b2xfZEIoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgbG9uZyB2YWx1ZSwgbG9uZyAqZEJ2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX2Fza19wbGF5YmFja19kQl92b2woc25kX21peGVyX2VsZW1fdCAqZWxlbSwgbG9uZyBkQnZhbHVlLCBpbnQgZGlyLCBsb25nICp2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX2Fza19jYXB0dXJlX2RCX3ZvbChzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBsb25nIGRCdmFsdWUsIGludCBkaXIsIGxvbmcgKnZhbHVlKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGxvbmcgKnZhbHVlKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfdm9sdW1lKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgbG9uZyAqdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfcGxheWJhY2tfZEIoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBsb25nICp2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX2RCKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgbG9uZyAqdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfcGxheWJhY2tfc3dpdGNoKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgaW50ICp2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX3N3aXRjaChzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGludCAqdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfcGxheWJhY2tfdm9sdW1lKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgbG9uZyB2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9jYXB0dXJlX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGxvbmcgdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfcGxheWJhY2tfZEIoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBsb25nIHZhbHVlLCBpbnQgZGlyKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fc2V0X2NhcHR1cmVfZEIoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBsb25nIHZhbHVlLCBpbnQgZGlyKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fc2V0X3BsYXliYWNrX3ZvbHVtZV9hbGwoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgbG9uZyB2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9jYXB0dXJlX3ZvbHVtZV9hbGwoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgbG9uZyB2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9wbGF5YmFja19kQl9hbGwoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgbG9uZyB2YWx1ZSwgaW50IGRpcik7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9jYXB0dXJlX2RCX2FsbChzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBsb25nIHZhbHVlLCBpbnQgZGlyKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fc2V0X3BsYXliYWNrX3N3aXRjaChzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGludCB2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9jYXB0dXJlX3N3aXRjaChzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGludCB2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9wbGF5YmFja19zd2l0Y2hfYWxsKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGludCB2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9jYXB0dXJlX3N3aXRjaF9hbGwoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgaW50IHZhbHVlKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3ZvbHVtZV9yYW5nZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCAKKwkJCQkJICAgICAgbG9uZyAqbWluLCBsb25nICptYXgpOworaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfcGxheWJhY2tfZEJfcmFuZ2Uoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgCisJCQkJCSAgbG9uZyAqbWluLCBsb25nICptYXgpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfcGxheWJhY2tfdm9sdW1lX3JhbmdlKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIAorCQkJCQkgICAgICBsb25nIG1pbiwgbG9uZyBtYXgpOworaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV92b2x1bWVfcmFuZ2Uoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgCisJCQkJCSAgICAgbG9uZyAqbWluLCBsb25nICptYXgpOworaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9kQl9yYW5nZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCAKKwkJCQkJIGxvbmcgKm1pbiwgbG9uZyAqbWF4KTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fc2V0X2NhcHR1cmVfdm9sdW1lX3JhbmdlKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIAorCQkJCQkgICAgIGxvbmcgbWluLCBsb25nIG1heCk7CisKK2ludCBzbmRfbWl4ZXJfc2VsZW1faXNfZW51bWVyYXRlZChzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faXNfZW51bV9wbGF5YmFjayhzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faXNfZW51bV9jYXB0dXJlKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfZW51bV9pdGVtcyhzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2VudW1faXRlbV9uYW1lKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHVuc2lnbmVkIGludCBpZHgsIHNpemVfdCBtYXhsZW4sIGNoYXIgKnN0cik7CitpbnQgc25kX21peGVyX3NlbGVtX2dldF9lbnVtX2l0ZW0oc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgKmlkeHApOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfZW51bV9pdGVtKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgdW5zaWduZWQgaW50IGlkeCk7CisKK3NpemVfdCBzbmRfbWl4ZXJfc2VsZW1faWRfc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfbWl4ZXJfc2VsZW1faWRfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9taXhlcl9zZWxlbV9pZF9hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfbWl4ZXJfc2VsZW1faWQpCitpbnQgc25kX21peGVyX3NlbGVtX2lkX21hbGxvYyhzbmRfbWl4ZXJfc2VsZW1faWRfdCAqKnB0cik7Cit2b2lkIHNuZF9taXhlcl9zZWxlbV9pZF9mcmVlKHNuZF9taXhlcl9zZWxlbV9pZF90ICpvYmopOwordm9pZCBzbmRfbWl4ZXJfc2VsZW1faWRfY29weShzbmRfbWl4ZXJfc2VsZW1faWRfdCAqZHN0LCBjb25zdCBzbmRfbWl4ZXJfc2VsZW1faWRfdCAqc3JjKTsKK2NvbnN0IGNoYXIgKnNuZF9taXhlcl9zZWxlbV9pZF9nZXRfbmFtZShjb25zdCBzbmRfbWl4ZXJfc2VsZW1faWRfdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfbWl4ZXJfc2VsZW1faWRfZ2V0X2luZGV4KGNvbnN0IHNuZF9taXhlcl9zZWxlbV9pZF90ICpvYmopOwordm9pZCBzbmRfbWl4ZXJfc2VsZW1faWRfc2V0X25hbWUoc25kX21peGVyX3NlbGVtX2lkX3QgKm9iaiwgY29uc3QgY2hhciAqdmFsKTsKK3ZvaWQgc25kX21peGVyX3NlbGVtX2lkX3NldF9pbmRleChzbmRfbWl4ZXJfc2VsZW1faWRfdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworLyoqIFx9ICovCisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX01JWEVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL21peGVyX2Fic3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9taXhlcl9hYnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0NGIxOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9taXhlcl9hYnN0LmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9taXhlcl9hYnN0LmgKKyAqIFxicmllZiBNaXhlciBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgbGlicmFyeQorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGRhdGUgMjAwNQorICoKKyAqIE1peGVyIGFic3RhY3QgaW1wbGVtZW50YXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGxpYnJhcnkKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9NSVhFUl9BQlNUX0gKKyNkZWZpbmUgX19BTFNBX01JWEVSX0FCU1RfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBNaXhlcl9BYnN0cmFjdCBNaXhlciBBYnN0YWN0IE1vZHVsZSBJbnRlcmZhY2UKKyAqICBUaGUgbWl4ZXIgYWJzdGFjdCBtb2R1bGUgaW50ZXJmYWNlLgorICogIFx7CisgKi8KKworI2RlZmluZQlTTV9QTEFZCQkJMAorI2RlZmluZSBTTV9DQVBUCQkJMQorCisjZGVmaW5lIFNNX0NBUF9HVk9MVU1FCQkoMTw8MSkKKyNkZWZpbmUgU01fQ0FQX0dTV0lUQ0gJCSgxPDwyKQorI2RlZmluZSBTTV9DQVBfUFZPTFVNRQkJKDE8PDMpCisjZGVmaW5lIFNNX0NBUF9QVk9MVU1FX0pPSU4JKDE8PDQpCisjZGVmaW5lIFNNX0NBUF9QU1dJVENICQkoMTw8NSkgCisjZGVmaW5lIFNNX0NBUF9QU1dJVENIX0pPSU4JKDE8PDYpIAorI2RlZmluZSBTTV9DQVBfQ1ZPTFVNRQkJKDE8PDcpIAorI2RlZmluZSBTTV9DQVBfQ1ZPTFVNRV9KT0lOCSgxPDw4KSAKKyNkZWZpbmUgU01fQ0FQX0NTV0lUQ0gJCSgxPDw5KSAKKyNkZWZpbmUgU01fQ0FQX0NTV0lUQ0hfSk9JTgkoMTw8MTApCisjZGVmaW5lIFNNX0NBUF9DU1dJVENIX0VYQ0wJKDE8PDExKQorI2RlZmluZSBTTV9DQVBfUEVOVU0JCSgxPDwxMikKKyNkZWZpbmUgU01fQ0FQX0NFTlVNCQkoMTw8MTMpCisvKiBTTV9DQVBfKiAyNC0zMSA9PiBwcml2YXRlIGZvciBtb2R1bGUgdXNlICovCisKKyNkZWZpbmUgU01fT1BTX0lTX0FDVElWRQkwCisjZGVmaW5lIFNNX09QU19JU19NT05PCQkxCisjZGVmaW5lIFNNX09QU19JU19DSEFOTkVMCTIKKyNkZWZpbmUgU01fT1BTX0lTX0VOVU1FUkFURUQJMworI2RlZmluZSBTTV9PUFNfSVNfRU5VTUNOVAk0CisKKyNkZWZpbmUgc21fc2VsZW0oeCkJCSgoc21fc2VsZW1fdCAqKSgoeCktPnByaXZhdGVfZGF0YSkpCisjZGVmaW5lIHNtX3NlbGVtX29wcyh4KQkJKChzbV9zZWxlbV90ICopKCh4KS0+cHJpdmF0ZV9kYXRhKSktPm9wcworCit0eXBlZGVmIHN0cnVjdCBfc21fc2VsZW0geworCXNuZF9taXhlcl9zZWxlbV9pZF90ICppZDsKKwlzdHJ1Y3Qgc21fZWxlbV9vcHMgKm9wczsKKwl1bnNpZ25lZCBpbnQgY2FwczsKKwl1bnNpZ25lZCBpbnQgY2FwdHVyZV9ncm91cDsKK30gc21fc2VsZW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgX3NtX2NsYXNzX2Jhc2ljIHsKKwljaGFyICpkZXZpY2U7CisJc25kX2N0bF90ICpjdGw7CisJc25kX2hjdGxfdCAqaGN0bDsKKwlzbmRfY3RsX2NhcmRfaW5mb190ICppbmZvOworfSBzbV9jbGFzc19iYXNpY190OworCitzdHJ1Y3Qgc21fZWxlbV9vcHMgewkKKwlpbnQgKCppcykoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgaW50IGRpciwgaW50IGNtZCwgaW50IHZhbCk7CisJaW50ICgqZ2V0X3JhbmdlKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgZGlyLCBsb25nICptaW4sIGxvbmcgKm1heCk7CisJaW50ICgqc2V0X3JhbmdlKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgZGlyLCBsb25nIG1pbiwgbG9uZyBtYXgpOworCWludCAoKmdldF9kQl9yYW5nZSkoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgaW50IGRpciwgbG9uZyAqbWluLCBsb25nICptYXgpOworCWludCAoKmFza192b2xfZEIpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGludCBkaXIsIGxvbmcgdmFsdWUsIGxvbmcgKmRiVmFsdWUpOworCWludCAoKmFza19kQl92b2wpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGludCBkaXIsIGxvbmcgZGJWYWx1ZSwgbG9uZyAqdmFsdWUsIGludCB4ZGlyKTsKKwlpbnQgKCpnZXRfdm9sdW1lKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgZGlyLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGxvbmcgKnZhbHVlKTsKKwlpbnQgKCpnZXRfZEIpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGludCBkaXIsIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgbG9uZyAqdmFsdWUpOworCWludCAoKnNldF92b2x1bWUpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGludCBkaXIsIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgbG9uZyB2YWx1ZSk7CisJaW50ICgqc2V0X2RCKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgZGlyLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGxvbmcgdmFsdWUsIGludCB4ZGlyKTsKKwlpbnQgKCpnZXRfc3dpdGNoKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgZGlyLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGludCAqdmFsdWUpOworCWludCAoKnNldF9zd2l0Y2gpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGludCBkaXIsIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgaW50IHZhbHVlKTsKKwlpbnQgKCplbnVtX2l0ZW1fbmFtZSkoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgdW5zaWduZWQgaW50IGl0ZW0sIHNpemVfdCBtYXhsZW4sIGNoYXIgKmJ1Zik7CisJaW50ICgqZ2V0X2VudW1faXRlbSkoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgKml0ZW1wKTsKKwlpbnQgKCpzZXRfZW51bV9pdGVtKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIHVuc2lnbmVkIGludCBpdGVtKTsKK307CisKK2ludCBzbmRfbWl4ZXJfc2VsZW1fY29tcGFyZShjb25zdCBzbmRfbWl4ZXJfZWxlbV90ICpjMSwgY29uc3Qgc25kX21peGVyX2VsZW1fdCAqYzIpOworCitpbnQgc25kX21peGVyX3NiYXNpY19pbmZvKGNvbnN0IHNuZF9taXhlcl9jbGFzc190ICpjbGFzcywgc21fY2xhc3NfYmFzaWNfdCAqaW5mbyk7Cit2b2lkICpzbmRfbWl4ZXJfc2Jhc2ljX2dldF9wcml2YXRlKGNvbnN0IHNuZF9taXhlcl9jbGFzc190ICpjbGFzcyk7Cit2b2lkIHNuZF9taXhlcl9zYmFzaWNfc2V0X3ByaXZhdGUoY29uc3Qgc25kX21peGVyX2NsYXNzX3QgKmNsYXNzLCB2b2lkICpwcml2YXRlX2RhdGEpOwordm9pZCBzbmRfbWl4ZXJfc2Jhc2ljX3NldF9wcml2YXRlX2ZyZWUoY29uc3Qgc25kX21peGVyX2NsYXNzX3QgKmNsYXNzLCB2b2lkICgqcHJpdmF0ZV9mcmVlKShzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3MpKTsKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfTUlYRVJfQUJTVF9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9vdXRwdXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9vdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjc5YWEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL291dHB1dC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9vdXRwdXQuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfT1VUUFVUX0gKKyNkZWZpbmUgX19BTFNBX09VVFBVVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIE91dHB1dCBPdXRwdXQgSW50ZXJmYWNlCisgKgorICogIFRoZSBvdXRwdXQgZnVuY3Rpb25zIHByZXNlbnQgYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhlIHN0ZGlvIGZ1bmN0aW9ucworICogIG9uIHRvcCBvZiBkaWZmZXJlbnQgdW5kZXJseWluZyBvdXRwdXQgZGVzdGluYXRpb25zLgorICoKKyAqICBNYW55IFBDTSBkZWJ1Z2dpbmcgZnVuY3Rpb25zIChcYyBzbmRfcGNtX3h4eF9kdW1wX3h4eCkgdXNlIHN1Y2ggYW4gb3V0cHV0CisgKiAgaGFuZGxlIHRvIGJlIGFibGUgdG8gd3JpdGUgbm90IG9ubHkgdG8gdGhlIHNjcmVlbiBidXQgYWxzbyB0byBvdGhlcgorICogIGRlc3RpbmF0aW9ucywgZS5nLiB0byBmaWxlcyBvciB0byBtZW1vcnkgYnVmZmVycy4KKyAqCisgKiAgXHsKKyAqLworCisvKioKKyAqIFxicmllZiBJbnRlcm5hbCBzdHJ1Y3R1cmUgZm9yIGFuIG91dHB1dCBvYmplY3QuCisgKgorICogVGhlIEFMU0EgbGlicmFyeSB1c2VzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBhcyBhIGhhbmRsZSB0byBhbgorICogb3V0cHV0IG9iamVjdC4gQXBwbGljYXRpb25zIGRvbid0IGFjY2VzcyBpdHMgY29udGVudHMgZGlyZWN0bHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfb3V0cHV0IHNuZF9vdXRwdXRfdDsKKworLyoqIE91dHB1dCB0eXBlLiAqLwordHlwZWRlZiBlbnVtIF9zbmRfb3V0cHV0X3R5cGUgeworCS8qKiBPdXRwdXQgdG8gYSBzdGRpbyBzdHJlYW0uICovCisJU05EX09VVFBVVF9TVERJTywKKwkvKiogT3V0cHV0IHRvIGEgbWVtb3J5IGJ1ZmZlci4gKi8KKwlTTkRfT1VUUFVUX0JVRkZFUgorfSBzbmRfb3V0cHV0X3R5cGVfdDsKKworaW50IHNuZF9vdXRwdXRfc3RkaW9fb3BlbihzbmRfb3V0cHV0X3QgKipvdXRwdXRwLCBjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICptb2RlKTsKK2ludCBzbmRfb3V0cHV0X3N0ZGlvX2F0dGFjaChzbmRfb3V0cHV0X3QgKipvdXRwdXRwLCBGSUxFICpmcCwgaW50IF9jbG9zZSk7CitpbnQgc25kX291dHB1dF9idWZmZXJfb3BlbihzbmRfb3V0cHV0X3QgKipvdXRwdXRwKTsKK3NpemVfdCBzbmRfb3V0cHV0X2J1ZmZlcl9zdHJpbmcoc25kX291dHB1dF90ICpvdXRwdXQsIGNoYXIgKipidWYpOworaW50IHNuZF9vdXRwdXRfY2xvc2Uoc25kX291dHB1dF90ICpvdXRwdXQpOworaW50IHNuZF9vdXRwdXRfcHJpbnRmKHNuZF9vdXRwdXRfdCAqb3V0cHV0LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKyNpZm5kZWYgRE9DX0hJRERFTgorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKQorI2VuZGlmCisJOworaW50IHNuZF9vdXRwdXRfdnByaW50ZihzbmRfb3V0cHV0X3QgKm91dHB1dCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpOworaW50IHNuZF9vdXRwdXRfcHV0cyhzbmRfb3V0cHV0X3QgKm91dHB1dCwgY29uc3QgY2hhciAqc3RyKTsKK2ludCBzbmRfb3V0cHV0X3B1dGMoc25kX291dHB1dF90ICpvdXRwdXQsIGludCBjKTsKK2ludCBzbmRfb3V0cHV0X2ZsdXNoKHNuZF9vdXRwdXRfdCAqb3V0cHV0KTsKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfT1VUUFVUX0ggKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTc1NTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtLmgKQEAgLTAsMCArMSwxMTYwIEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvcGNtLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlci4KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX1BDTV9ICisjZGVmaW5lIF9fQUxTQV9QQ01fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBQQ00gUENNIEludGVyZmFjZQorICogIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogIFx7CisgKi8KKworLyoqIGRsc3ltIHZlcnNpb24gZm9yIGludGVyZmFjZSBlbnRyeSBjYWxsYmFjayAqLworI2RlZmluZSBTTkRfUENNX0RMU1lNX1ZFUlNJT04JCV9kbHN5bV9wY21fMDAxCisKKy8qKiBQQ00gZ2VuZXJpYyBpbmZvIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21faW5mbyBzbmRfcGNtX2luZm9fdDsKKworLyoqIFBDTSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIHNwYWNlIGNvbnRhaW5lcgorICoKKyAqICBzbmRfcGNtX2h3X3BhcmFtc190IGlzIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYSBzZXQgb2YgcG9zc2libGUKKyAqICBQQ00gaGFyZHdhcmUgY29uZmlndXJhdGlvbnMuIEZvciBleGFtcGxlLCBhIGdpdmVuIGluc3RhbmNlIG1pZ2h0IGluY2x1ZGUgYQorICogIHJhbmdlIG9mIGJ1ZmZlciBzaXplcywgYSByYW5nZSBvZiBwZXJpb2Qgc2l6ZXMsIGFuZCBhIHNldCBvZiBzZXZlcmFsIHNhbXBsZQorICogIGZvcm1hdHMuIFNvbWUgc3Vic2V0IG9mIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgdGhlc2Ugc2V0cyBtYXkgYmUgdmFsaWQsCisgKiAgYnV0IG5vdCBuZWNlc3NhcmlseSBhbnkgY29tYmluYXRpb24gd2lsbCBiZSB2YWxpZC4KKyAqCisgKiAgV2hlbiBhIHBhcmFtZXRlciBpcyBzZXQgb3IgcmVzdHJpY3RlZCB1c2luZyBhIHNuZF9wY21faHdfcGFyYW1zX3NldCoKKyAqICBmdW5jdGlvbiwgYWxsIG9mIHRoZSBvdGhlciByYW5nZXMgd2lsbCBiZSB1cGRhdGVkIHRvIGV4Y2x1ZGUgYXMgbWFueQorICogIGltcG9zc2libGUgY29uZmlndXJhdGlvbnMgYXMgcG9zc2libGUuIEF0dGVtcHRpbmcgdG8gc2V0IGEgcGFyYW1ldGVyCisgKiAgb3V0c2lkZSBvZiBpdHMgYWNjZXB0YWJsZSByYW5nZSB3aWxsIHJlc3VsdCBpbiB0aGUgZnVuY3Rpb24gZmFpbGluZworICogIGFuZCBhbiBlcnJvciBjb2RlIGJlaW5nIHJldHVybmVkLgorICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3BjbV9od19wYXJhbXMgc25kX3BjbV9od19wYXJhbXNfdDsKKworLyoqIFBDTSBzb2Z0d2FyZSBjb25maWd1cmF0aW9uIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21fc3dfcGFyYW1zIHNuZF9wY21fc3dfcGFyYW1zX3Q7CisvKiogUENNIHN0YXR1cyBjb250YWluZXIgKi8KKyB0eXBlZGVmIHN0cnVjdCBfc25kX3BjbV9zdGF0dXMgc25kX3BjbV9zdGF0dXNfdDsKKy8qKiBQQ00gYWNjZXNzIHR5cGVzIG1hc2sgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcGNtX2FjY2Vzc19tYXNrIHNuZF9wY21fYWNjZXNzX21hc2tfdDsKKy8qKiBQQ00gZm9ybWF0cyBtYXNrICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3BjbV9mb3JtYXRfbWFzayBzbmRfcGNtX2Zvcm1hdF9tYXNrX3Q7CisvKiogUENNIHN1YmZvcm1hdHMgbWFzayAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21fc3ViZm9ybWF0X21hc2sgc25kX3BjbV9zdWJmb3JtYXRfbWFza190OworCisvKiogUENNIGNsYXNzICovCit0eXBlZGVmIGVudW0gX3NuZF9wY21fY2xhc3MgeworCS8qKiBzdGFuZGFyZCBkZXZpY2UgKi8KKworCVNORF9QQ01fQ0xBU1NfR0VORVJJQyA9IDAsCisJLyoqIG11bHRpY2hhbm5lbCBkZXZpY2UgKi8KKwlTTkRfUENNX0NMQVNTX01VTFRJLAorCS8qKiBzb2Z0d2FyZSBtb2RlbSBkZXZpY2UgKi8KKwlTTkRfUENNX0NMQVNTX01PREVNLAorCS8qKiBkaWdpdGl6ZXIgZGV2aWNlICovCisJU05EX1BDTV9DTEFTU19ESUdJVElaRVIsCisJU05EX1BDTV9DTEFTU19MQVNUID0gU05EX1BDTV9DTEFTU19ESUdJVElaRVIKK30gc25kX3BjbV9jbGFzc190OworCisvKiogUENNIHN1YmNsYXNzICovCit0eXBlZGVmIGVudW0gX3NuZF9wY21fc3ViY2xhc3MgeworCS8qKiBzdWJkZXZpY2VzIGFyZSBtaXhlZCB0b2dldGhlciAqLworCVNORF9QQ01fU1VCQ0xBU1NfR0VORVJJQ19NSVggPSAwLAorCS8qKiBtdWx0aWNoYW5uZWwgc3ViZGV2aWNlcyBhcmUgbWl4ZWQgdG9nZXRoZXIgKi8KKwlTTkRfUENNX1NVQkNMQVNTX01VTFRJX01JWCwKKwlTTkRfUENNX1NVQkNMQVNTX0xBU1QgPSBTTkRfUENNX1NVQkNMQVNTX01VTFRJX01JWAorfSBzbmRfcGNtX3N1YmNsYXNzX3Q7CisKKy8qKiBQQ00gc3RyZWFtIChkaXJlY3Rpb24pICovCit0eXBlZGVmIGVudW0gX3NuZF9wY21fc3RyZWFtIHsKKwkvKiogUGxheWJhY2sgc3RyZWFtICovCisJU05EX1BDTV9TVFJFQU1fUExBWUJBQ0sgPSAwLAorCS8qKiBDYXB0dXJlIHN0cmVhbSAqLworCVNORF9QQ01fU1RSRUFNX0NBUFRVUkUsCisJU05EX1BDTV9TVFJFQU1fTEFTVCA9IFNORF9QQ01fU1RSRUFNX0NBUFRVUkUKK30gc25kX3BjbV9zdHJlYW1fdDsKKworLyoqIFBDTSBhY2Nlc3MgdHlwZSAqLwordHlwZWRlZiBlbnVtIF9zbmRfcGNtX2FjY2VzcyB7CisJLyoqIG1tYXAgYWNjZXNzIHdpdGggc2ltcGxlIGludGVybGVhdmVkIGNoYW5uZWxzICovCisJU05EX1BDTV9BQ0NFU1NfTU1BUF9JTlRFUkxFQVZFRCA9IDAsCisJLyoqIG1tYXAgYWNjZXNzIHdpdGggc2ltcGxlIG5vbiBpbnRlcmxlYXZlZCBjaGFubmVscyAqLworCVNORF9QQ01fQUNDRVNTX01NQVBfTk9OSU5URVJMRUFWRUQsCisJLyoqIG1tYXAgYWNjZXNzIHdpdGggY29tcGxleCBwbGFjZW1lbnQgKi8KKwlTTkRfUENNX0FDQ0VTU19NTUFQX0NPTVBMRVgsCisJLyoqIHNuZF9wY21fcmVhZGkvc25kX3BjbV93cml0ZWkgYWNjZXNzICovCisJU05EX1BDTV9BQ0NFU1NfUldfSU5URVJMRUFWRUQsCisJLyoqIHNuZF9wY21fcmVhZG4vc25kX3BjbV93cml0ZW4gYWNjZXNzICovCisJU05EX1BDTV9BQ0NFU1NfUldfTk9OSU5URVJMRUFWRUQsCisJU05EX1BDTV9BQ0NFU1NfTEFTVCA9IFNORF9QQ01fQUNDRVNTX1JXX05PTklOVEVSTEVBVkVECit9IHNuZF9wY21fYWNjZXNzX3Q7CisKKy8qKiBQQ00gc2FtcGxlIGZvcm1hdCAqLwordHlwZWRlZiBlbnVtIF9zbmRfcGNtX2Zvcm1hdCB7CisJLyoqIFVua25vd24gKi8KKwlTTkRfUENNX0ZPUk1BVF9VTktOT1dOID0gLTEsCisJLyoqIFNpZ25lZCA4IGJpdCAqLworCVNORF9QQ01fRk9STUFUX1M4ID0gMCwKKwkvKiogVW5zaWduZWQgOCBiaXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9VOCwKKwkvKiogU2lnbmVkIDE2IGJpdCBMaXR0bGUgRW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfUzE2X0xFLAorCS8qKiBTaWduZWQgMTYgYml0IEJpZyBFbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9TMTZfQkUsCisJLyoqIFVuc2lnbmVkIDE2IGJpdCBMaXR0bGUgRW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfVTE2X0xFLAorCS8qKiBVbnNpZ25lZCAxNiBiaXQgQmlnIEVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1UxNl9CRSwKKwkvKiogU2lnbmVkIDI0IGJpdCBMaXR0bGUgRW5kaWFuIHVzaW5nIGxvdyB0aHJlZSBieXRlcyBpbiAzMi1iaXQgd29yZCAqLworCVNORF9QQ01fRk9STUFUX1MyNF9MRSwKKwkvKiogU2lnbmVkIDI0IGJpdCBCaWcgRW5kaWFuIHVzaW5nIGxvdyB0aHJlZSBieXRlcyBpbiAzMi1iaXQgd29yZCAqLworCVNORF9QQ01fRk9STUFUX1MyNF9CRSwKKwkvKiogVW5zaWduZWQgMjQgYml0IExpdHRsZSBFbmRpYW4gdXNpbmcgbG93IHRocmVlIGJ5dGVzIGluIDMyLWJpdCB3b3JkICovCisJU05EX1BDTV9GT1JNQVRfVTI0X0xFLAorCS8qKiBVbnNpZ25lZCAyNCBiaXQgQmlnIEVuZGlhbiB1c2luZyBsb3cgdGhyZWUgYnl0ZXMgaW4gMzItYml0IHdvcmQgKi8KKwlTTkRfUENNX0ZPUk1BVF9VMjRfQkUsCisJLyoqIFNpZ25lZCAzMiBiaXQgTGl0dGxlIEVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1MzMl9MRSwKKwkvKiogU2lnbmVkIDMyIGJpdCBCaWcgRW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfUzMyX0JFLAorCS8qKiBVbnNpZ25lZCAzMiBiaXQgTGl0dGxlIEVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1UzMl9MRSwKKwkvKiogVW5zaWduZWQgMzIgYml0IEJpZyBFbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9VMzJfQkUsCisJLyoqIEZsb2F0IDMyIGJpdCBMaXR0bGUgRW5kaWFuLCBSYW5nZSAtMS4wIHRvIDEuMCAqLworCVNORF9QQ01fRk9STUFUX0ZMT0FUX0xFLAorCS8qKiBGbG9hdCAzMiBiaXQgQmlnIEVuZGlhbiwgUmFuZ2UgLTEuMCB0byAxLjAgKi8KKwlTTkRfUENNX0ZPUk1BVF9GTE9BVF9CRSwKKwkvKiogRmxvYXQgNjQgYml0IExpdHRsZSBFbmRpYW4sIFJhbmdlIC0xLjAgdG8gMS4wICovCisJU05EX1BDTV9GT1JNQVRfRkxPQVQ2NF9MRSwKKwkvKiogRmxvYXQgNjQgYml0IEJpZyBFbmRpYW4sIFJhbmdlIC0xLjAgdG8gMS4wICovCisJU05EX1BDTV9GT1JNQVRfRkxPQVQ2NF9CRSwKKwkvKiogSUVDLTk1OCBMaXR0bGUgRW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfSUVDOTU4X1NVQkZSQU1FX0xFLAorCS8qKiBJRUMtOTU4IEJpZyBFbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9JRUM5NThfU1VCRlJBTUVfQkUsCisJLyoqIE11LUxhdyAqLworCVNORF9QQ01fRk9STUFUX01VX0xBVywKKwkvKiogQS1MYXcgKi8KKwlTTkRfUENNX0ZPUk1BVF9BX0xBVywKKwkvKiogSW1hLUFEUENNICovCisJU05EX1BDTV9GT1JNQVRfSU1BX0FEUENNLAorCS8qKiBNUEVHICovCisJU05EX1BDTV9GT1JNQVRfTVBFRywKKwkvKiogR1NNICovCisJU05EX1BDTV9GT1JNQVRfR1NNLAorCS8qKiBTcGVjaWFsICovCisJU05EX1BDTV9GT1JNQVRfU1BFQ0lBTCA9IDMxLAorCS8qKiBTaWduZWQgMjRiaXQgTGl0dGxlIEVuZGlhbiBpbiAzYnl0ZXMgZm9ybWF0ICovCisJU05EX1BDTV9GT1JNQVRfUzI0XzNMRSA9IDMyLAorCS8qKiBTaWduZWQgMjRiaXQgQmlnIEVuZGlhbiBpbiAzYnl0ZXMgZm9ybWF0ICovCisJU05EX1BDTV9GT1JNQVRfUzI0XzNCRSwKKwkvKiogVW5zaWduZWQgMjRiaXQgTGl0dGxlIEVuZGlhbiBpbiAzYnl0ZXMgZm9ybWF0ICovCisJU05EX1BDTV9GT1JNQVRfVTI0XzNMRSwKKwkvKiogVW5zaWduZWQgMjRiaXQgQmlnIEVuZGlhbiBpbiAzYnl0ZXMgZm9ybWF0ICovCisJU05EX1BDTV9GT1JNQVRfVTI0XzNCRSwKKwkvKiogU2lnbmVkIDIwYml0IExpdHRsZSBFbmRpYW4gaW4gM2J5dGVzIGZvcm1hdCAqLworCVNORF9QQ01fRk9STUFUX1MyMF8zTEUsCisJLyoqIFNpZ25lZCAyMGJpdCBCaWcgRW5kaWFuIGluIDNieXRlcyBmb3JtYXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9TMjBfM0JFLAorCS8qKiBVbnNpZ25lZCAyMGJpdCBMaXR0bGUgRW5kaWFuIGluIDNieXRlcyBmb3JtYXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9VMjBfM0xFLAorCS8qKiBVbnNpZ25lZCAyMGJpdCBCaWcgRW5kaWFuIGluIDNieXRlcyBmb3JtYXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9VMjBfM0JFLAorCS8qKiBTaWduZWQgMThiaXQgTGl0dGxlIEVuZGlhbiBpbiAzYnl0ZXMgZm9ybWF0ICovCisJU05EX1BDTV9GT1JNQVRfUzE4XzNMRSwKKwkvKiogU2lnbmVkIDE4Yml0IEJpZyBFbmRpYW4gaW4gM2J5dGVzIGZvcm1hdCAqLworCVNORF9QQ01fRk9STUFUX1MxOF8zQkUsCisJLyoqIFVuc2lnbmVkIDE4Yml0IExpdHRsZSBFbmRpYW4gaW4gM2J5dGVzIGZvcm1hdCAqLworCVNORF9QQ01fRk9STUFUX1UxOF8zTEUsCisJLyoqIFVuc2lnbmVkIDE4Yml0IEJpZyBFbmRpYW4gaW4gM2J5dGVzIGZvcm1hdCAqLworCVNORF9QQ01fRk9STUFUX1UxOF8zQkUsCisJU05EX1BDTV9GT1JNQVRfTEFTVCA9IFNORF9QQ01fRk9STUFUX1UxOF8zQkUsCisKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJLyoqIFNpZ25lZCAxNiBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1MxNiA9IFNORF9QQ01fRk9STUFUX1MxNl9MRSwKKwkvKiogVW5zaWduZWQgMTYgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9VMTYgPSBTTkRfUENNX0ZPUk1BVF9VMTZfTEUsCisJLyoqIFNpZ25lZCAyNCBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1MyNCA9IFNORF9QQ01fRk9STUFUX1MyNF9MRSwKKwkvKiogVW5zaWduZWQgMjQgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9VMjQgPSBTTkRfUENNX0ZPUk1BVF9VMjRfTEUsCisJLyoqIFNpZ25lZCAzMiBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1MzMiA9IFNORF9QQ01fRk9STUFUX1MzMl9MRSwKKwkvKiogVW5zaWduZWQgMzIgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9VMzIgPSBTTkRfUENNX0ZPUk1BVF9VMzJfTEUsCisJLyoqIEZsb2F0IDMyIGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfRkxPQVQgPSBTTkRfUENNX0ZPUk1BVF9GTE9BVF9MRSwKKwkvKiogRmxvYXQgNjQgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9GTE9BVDY0ID0gU05EX1BDTV9GT1JNQVRfRkxPQVQ2NF9MRSwKKwkvKiogSUVDLTk1OCBDUFUgRW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfSUVDOTU4X1NVQkZSQU1FID0gU05EX1BDTV9GT1JNQVRfSUVDOTU4X1NVQkZSQU1FX0xFCisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJLyoqIFNpZ25lZCAxNiBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1MxNiA9IFNORF9QQ01fRk9STUFUX1MxNl9CRSwKKwkvKiogVW5zaWduZWQgMTYgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9VMTYgPSBTTkRfUENNX0ZPUk1BVF9VMTZfQkUsCisJLyoqIFNpZ25lZCAyNCBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1MyNCA9IFNORF9QQ01fRk9STUFUX1MyNF9CRSwKKwkvKiogVW5zaWduZWQgMjQgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9VMjQgPSBTTkRfUENNX0ZPUk1BVF9VMjRfQkUsCisJLyoqIFNpZ25lZCAzMiBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1MzMiA9IFNORF9QQ01fRk9STUFUX1MzMl9CRSwKKwkvKiogVW5zaWduZWQgMzIgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9VMzIgPSBTTkRfUENNX0ZPUk1BVF9VMzJfQkUsCisJLyoqIEZsb2F0IDMyIGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfRkxPQVQgPSBTTkRfUENNX0ZPUk1BVF9GTE9BVF9CRSwKKwkvKiogRmxvYXQgNjQgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9GTE9BVDY0ID0gU05EX1BDTV9GT1JNQVRfRkxPQVQ2NF9CRSwKKwkvKiogSUVDLTk1OCBDUFUgRW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfSUVDOTU4X1NVQkZSQU1FID0gU05EX1BDTV9GT1JNQVRfSUVDOTU4X1NVQkZSQU1FX0JFCisjZWxzZQorI2Vycm9yICJVbmtub3duIGVuZGlhbiIKKyNlbmRpZgorfSBzbmRfcGNtX2Zvcm1hdF90OworCisvKiogUENNIHNhbXBsZSBzdWJmb3JtYXQgKi8KK3R5cGVkZWYgZW51bSBfc25kX3BjbV9zdWJmb3JtYXQgeworCS8qKiBTdGFuZGFyZCAqLworCVNORF9QQ01fU1VCRk9STUFUX1NURCA9IDAsCisJU05EX1BDTV9TVUJGT1JNQVRfTEFTVCA9IFNORF9QQ01fU1VCRk9STUFUX1NURAorfSBzbmRfcGNtX3N1YmZvcm1hdF90OworCisvKiogUENNIHN0YXRlICovCit0eXBlZGVmIGVudW0gX3NuZF9wY21fc3RhdGUgeworCS8qKiBPcGVuICovCisJU05EX1BDTV9TVEFURV9PUEVOID0gMCwKKwkvKiogU2V0dXAgaW5zdGFsbGVkICovIAorCVNORF9QQ01fU1RBVEVfU0VUVVAsCisJLyoqIFJlYWR5IHRvIHN0YXJ0ICovCisJU05EX1BDTV9TVEFURV9QUkVQQVJFRCwKKwkvKiogUnVubmluZyAqLworCVNORF9QQ01fU1RBVEVfUlVOTklORywKKwkvKiogU3RvcHBlZDogdW5kZXJydW4gKHBsYXliYWNrKSBvciBvdmVycnVuIChjYXB0dXJlKSBkZXRlY3RlZCAqLworCVNORF9QQ01fU1RBVEVfWFJVTiwKKwkvKiogRHJhaW5pbmc6IHJ1bm5pbmcgKHBsYXliYWNrKSBvciBzdG9wcGVkIChjYXB0dXJlKSAqLworCVNORF9QQ01fU1RBVEVfRFJBSU5JTkcsCisJLyoqIFBhdXNlZCAqLworCVNORF9QQ01fU1RBVEVfUEFVU0VELAorCS8qKiBIYXJkd2FyZSBpcyBzdXNwZW5kZWQgKi8KKwlTTkRfUENNX1NUQVRFX1NVU1BFTkRFRCwKKwkvKiogSGFyZHdhcmUgaXMgZGlzY29ubmVjdGVkICovCisJU05EX1BDTV9TVEFURV9ESVNDT05ORUNURUQsCisJU05EX1BDTV9TVEFURV9MQVNUID0gU05EX1BDTV9TVEFURV9ESVNDT05ORUNURUQKK30gc25kX3BjbV9zdGF0ZV90OworCisvKiogUENNIHN0YXJ0IG1vZGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3BjbV9zdGFydCB7CisJLyoqIEF1dG9tYXRpYyBzdGFydCBvbiBkYXRhIHJlYWQvd3JpdGUgKi8KKwlTTkRfUENNX1NUQVJUX0RBVEEgPSAwLAorCS8qKiBFeHBsaWNpdCBzdGFydCAqLworCVNORF9QQ01fU1RBUlRfRVhQTElDSVQsCisJU05EX1BDTV9TVEFSVF9MQVNUID0gU05EX1BDTV9TVEFSVF9FWFBMSUNJVAorfSBzbmRfcGNtX3N0YXJ0X3Q7CisKKy8qKiBQQ00geHJ1biBtb2RlICovCit0eXBlZGVmIGVudW0gX3NuZF9wY21feHJ1biB7CisJLyoqIFhydW4gZGV0ZWN0aW9uIGRpc2FibGVkICovCisJU05EX1BDTV9YUlVOX05PTkUgPSAwLAorCS8qKiBTdG9wIG9uIHhydW4gZGV0ZWN0aW9uICovCisJU05EX1BDTV9YUlVOX1NUT1AsCisJU05EX1BDTV9YUlVOX0xBU1QgPSBTTkRfUENNX1hSVU5fU1RPUAorfSBzbmRfcGNtX3hydW5fdDsKKworLyoqIFBDTSB0aW1lc3RhbXAgbW9kZSAqLwordHlwZWRlZiBlbnVtIF9zbmRfcGNtX3RzdGFtcCB7CisJLyoqIE5vIHRpbWVzdGFtcCAqLworCVNORF9QQ01fVFNUQU1QX05PTkUgPSAwLAorCS8qKiBVcGRhdGUgdGltZXN0YW1wIGF0IGV2ZXJ5IGhhcmR3YXJlIHBvc2l0aW9uIHVwZGF0ZSAqLworCVNORF9QQ01fVFNUQU1QX0VOQUJMRSwKKwkvKiogRXF1aXZhbGVudCB3aXRoICNTTkRfUENNX1RTVEFNUF9FTkFCTEUsCisJICoganVzdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zCisJICovCisJU05EX1BDTV9UU1RBTVBfTU1BUCA9IFNORF9QQ01fVFNUQU1QX0VOQUJMRSwKKwlTTkRfUENNX1RTVEFNUF9MQVNUID0gU05EX1BDTV9UU1RBTVBfRU5BQkxFCit9IHNuZF9wY21fdHN0YW1wX3Q7CisKKy8qKiBVbnNpZ25lZCBmcmFtZXMgcXVhbnRpdHkgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzbmRfcGNtX3VmcmFtZXNfdDsKKy8qKiBTaWduZWQgZnJhbWVzIHF1YW50aXR5ICovCit0eXBlZGVmIGxvbmcgc25kX3BjbV9zZnJhbWVzX3Q7CisKKy8qKiBOb24gYmxvY2tpbmcgbW9kZSAoZmxhZyBmb3Igb3BlbiBtb2RlKSBcaGlkZWluaXRpYWxpemVyICovCisjZGVmaW5lIFNORF9QQ01fTk9OQkxPQ0sJCTB4MDAwMDAwMDEKKy8qKiBBc3luYyBub3RpZmljYXRpb24gKGZsYWcgZm9yIG9wZW4gbW9kZSkgXGhpZGVpbml0aWFsaXplciAqLworI2RlZmluZSBTTkRfUENNX0FTWU5DCQkJMHgwMDAwMDAwMgorLyoqIERpc2FibGUgYXV0b21hdGljIChidXQgbm90IGZvcmNlZCEpIHJhdGUgcmVzYW1wbGluaWcgKi8KKyNkZWZpbmUgU05EX1BDTV9OT19BVVRPX1JFU0FNUExFCTB4MDAwMTAwMDAKKy8qKiBEaXNhYmxlIGF1dG9tYXRpYyAoYnV0IG5vdCBmb3JjZWQhKSBjaGFubmVsIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgU05EX1BDTV9OT19BVVRPX0NIQU5ORUxTCTB4MDAwMjAwMDAKKy8qKiBEaXNhYmxlIGF1dG9tYXRpYyAoYnV0IG5vdCBmb3JjZWQhKSBmb3JtYXQgY29udmVyc2lvbiAqLworI2RlZmluZSBTTkRfUENNX05PX0FVVE9fRk9STUFUCQkweDAwMDQwMDAwCisvKiogRGlzYWJsZSBzb2Z0IHZvbHVtZSBjb250cm9sICovCisjZGVmaW5lIFNORF9QQ01fTk9fU09GVFZPTAkJMHgwMDA4MDAwMAorCisvKiogUENNIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY20gc25kX3BjbV90OworCisvKiogUENNIHR5cGUgKi8KK2VudW0gX3NuZF9wY21fdHlwZSB7CisJLyoqIEtlcm5lbCBsZXZlbCBQQ00gKi8KKwlTTkRfUENNX1RZUEVfSFcgPSAwLAorCS8qKiBIb29rZWQgUENNICovCisJU05EX1BDTV9UWVBFX0hPT0tTLAorCS8qKiBPbmUgb3IgbW9yZSBsaW5rZWQgUENNIHdpdGggZXhjbHVzaXZlIGFjY2VzcyB0byBzZWxlY3RlZAorCSAgICBjaGFubmVscyAqLworCVNORF9QQ01fVFlQRV9NVUxUSSwKKwkvKiogRmlsZSB3cml0aW5nIHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9GSUxFLAorCS8qKiBOdWxsIGVuZHBvaW50IFBDTSAqLworCVNORF9QQ01fVFlQRV9OVUxMLAorCS8qKiBTaGFyZWQgbWVtb3J5IGNsaWVudCBQQ00gKi8KKwlTTkRfUENNX1RZUEVfU0hNLAorCS8qKiBJTkVUIGNsaWVudCBQQ00gKG5vdCB5ZXQgaW1wbGVtZW50ZWQpICovCisJU05EX1BDTV9UWVBFX0lORVQsCisJLyoqIENvcHlpbmcgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX0NPUFksCisJLyoqIExpbmVhciBmb3JtYXQgY29udmVyc2lvbiBQQ00gKi8KKwlTTkRfUENNX1RZUEVfTElORUFSLAorCS8qKiBBLUxhdyBmb3JtYXQgY29udmVyc2lvbiBQQ00gKi8KKwlTTkRfUENNX1RZUEVfQUxBVywKKwkvKiogTXUtTGF3IGZvcm1hdCBjb252ZXJzaW9uIFBDTSAqLworCVNORF9QQ01fVFlQRV9NVUxBVywKKwkvKiogSU1BLUFEUENNIGZvcm1hdCBjb252ZXJzaW9uIFBDTSAqLworCVNORF9QQ01fVFlQRV9BRFBDTSwKKwkvKiogUmF0ZSBjb252ZXJzaW9uIFBDTSAqLworCVNORF9QQ01fVFlQRV9SQVRFLAorCS8qKiBBdHRlbnVhdGVkIHN0YXRpYyByb3V0ZSBQQ00gKi8KKwlTTkRfUENNX1RZUEVfUk9VVEUsCisJLyoqIEZvcm1hdCBhZGp1c3RlZCBQQ00gKi8KKwlTTkRfUENNX1RZUEVfUExVRywKKwkvKiogU2hhcmluZyBQQ00gKi8KKwlTTkRfUENNX1RZUEVfU0hBUkUsCisJLyoqIE1ldGVyIHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9NRVRFUiwKKwkvKiogTWl4aW5nIFBDTSAqLworCVNORF9QQ01fVFlQRV9NSVgsCisJLyoqIEF0dGVudWF0ZWQgZHluYW1pYyByb3V0ZSBQQ00gKG5vdCB5ZXQgaW1wbGVtZW50ZWQpICovCisJU05EX1BDTV9UWVBFX0RST1VURSwKKwkvKiogTG9vcGJhY2sgc2VydmVyIHBsdWdpbiAobm90IHlldCBpbXBsZW1lbnRlZCkgKi8KKwlTTkRfUENNX1RZUEVfTEJTRVJWRVIsCisJLyoqIExpbmVhciBJbnRlZ2VyIDwtPiBMaW5lYXIgRmxvYXQgZm9ybWF0IGNvbnZlcnNpb24gUENNICovCisJU05EX1BDTV9UWVBFX0xJTkVBUl9GTE9BVCwKKwkvKiogTEFEU1BBIGludGVncmF0aW9uIHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9MQURTUEEsCisJLyoqIERpcmVjdCBNaXhpbmcgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX0RNSVgsCisJLyoqIEphY2sgQXVkaW8gQ29ubmVjdGlvbiBLaXQgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX0pBQ0ssCisJLyoqIERpcmVjdCBTbm9vcGluZyBwbHVnaW4gKi8KKwlTTkRfUENNX1RZUEVfRFNOT09QLAorCS8qKiBEaXJlY3QgU2hhcmluZyBwbHVnaW4gKi8KKwlTTkRfUENNX1RZUEVfRFNIQVJFLAorCS8qKiBJRUM5NTggc3ViZnJhbWUgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX0lFQzk1OCwKKwkvKiogU29mdCB2b2x1bWUgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX1NPRlRWT0wsCisJLyoqIEV4dGVybmFsIEkvTyBwbHVnaW4gKi8KKwlTTkRfUENNX1RZUEVfSU9QTFVHLAorCS8qKiBFeHRlcm5hbCBmaWx0ZXIgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX0VYVFBMVUcsCisJLyoqIE1tYXAtZW11bGF0aW9uIHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9NTUFQX0VNVUwsCisJU05EX1BDTV9UWVBFX0xBU1QgPSBTTkRfUENNX1RZUEVfTU1BUF9FTVVMCit9OworCisvKiogUENNIHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3BjbV90eXBlIHNuZF9wY21fdHlwZV90OworCisvKiogUENNIGFyZWEgc3BlY2lmaWNhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21fY2hhbm5lbF9hcmVhIHsKKwkvKiogYmFzZSBhZGRyZXNzIG9mIGNoYW5uZWwgc2FtcGxlcyAqLworCXZvaWQgKmFkZHI7CisJLyoqIG9mZnNldCB0byBmaXJzdCBzYW1wbGUgaW4gYml0cyAqLworCXVuc2lnbmVkIGludCBmaXJzdDsKKwkvKiogc2FtcGxlcyBkaXN0YW5jZSBpbiBiaXRzICovCisJdW5zaWduZWQgaW50IHN0ZXA7Cit9IHNuZF9wY21fY2hhbm5lbF9hcmVhX3Q7CisKKy8qKiBQQ00gc3luY2hyb25pemF0aW9uIElEICovCit0eXBlZGVmIHVuaW9uIF9zbmRfcGNtX3N5bmNfaWQgeworCS8qKiA4LWJpdCBJRCAqLworCXVuc2lnbmVkIGNoYXIgaWRbMTZdOworCS8qKiAxNi1iaXQgSUQgKi8KKwl1bnNpZ25lZCBzaG9ydCBpZDE2WzhdOworCS8qKiAzMi1iaXQgSUQgKi8KKwl1bnNpZ25lZCBpbnQgaWQzMls0XTsKK30gc25kX3BjbV9zeW5jX2lkX3Q7CisKKy8qKiAjU05EX1BDTV9UWVBFX01FVEVSIHNjb3BlIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21fc2NvcGUgc25kX3BjbV9zY29wZV90OworCitpbnQgc25kX3BjbV9vcGVuKHNuZF9wY21fdCAqKnBjbSwgY29uc3QgY2hhciAqbmFtZSwgCisJCSBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworaW50IHNuZF9wY21fb3Blbl9sY29uZihzbmRfcGNtX3QgKipwY20sIGNvbnN0IGNoYXIgKm5hbWUsIAorCQkgICAgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlLAorCQkgICAgICAgc25kX2NvbmZpZ190ICpsY29uZik7CitpbnQgc25kX3BjbV9vcGVuX2ZhbGxiYWNrKHNuZF9wY21fdCAqKnBjbSwgc25kX2NvbmZpZ190ICpyb290LAorCQkJICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpvcmlnX25hbWUsCisJCQkgIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKK2ludCBzbmRfcGNtX2Nsb3NlKHNuZF9wY21fdCAqcGNtKTsKK2NvbnN0IGNoYXIgKnNuZF9wY21fbmFtZShzbmRfcGNtX3QgKnBjbSk7CitzbmRfcGNtX3R5cGVfdCBzbmRfcGNtX3R5cGUoc25kX3BjbV90ICpwY20pOworc25kX3BjbV9zdHJlYW1fdCBzbmRfcGNtX3N0cmVhbShzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KHNuZF9wY21fdCAqcGNtKTsKK2ludCBzbmRfcGNtX3BvbGxfZGVzY3JpcHRvcnMoc25kX3BjbV90ICpwY20sIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBzcGFjZSk7CitpbnQgc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMoc25kX3BjbV90ICpwY20sIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqcmV2ZW50cyk7CitpbnQgc25kX3BjbV9ub25ibG9jayhzbmRfcGNtX3QgKnBjbSwgaW50IG5vbmJsb2NrKTsKK2ludCBzbmRfYXN5bmNfYWRkX3BjbV9oYW5kbGVyKHNuZF9hc3luY19oYW5kbGVyX3QgKipoYW5kbGVyLCBzbmRfcGNtX3QgKnBjbSwgCisJCQkgICAgICBzbmRfYXN5bmNfY2FsbGJhY2tfdCBjYWxsYmFjaywgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKK3NuZF9wY21fdCAqc25kX2FzeW5jX2hhbmRsZXJfZ2V0X3BjbShzbmRfYXN5bmNfaGFuZGxlcl90ICpoYW5kbGVyKTsKK2ludCBzbmRfcGNtX2luZm8oc25kX3BjbV90ICpwY20sIHNuZF9wY21faW5mb190ICppbmZvKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19jdXJyZW50KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfZnJlZShzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfY3VycmVudChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtcyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3ByZXBhcmUoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fcmVzZXQoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fc3RhdHVzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N0YXR1c190ICpzdGF0dXMpOworaW50IHNuZF9wY21fc3RhcnQoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fZHJvcChzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9kcmFpbihzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9wYXVzZShzbmRfcGNtX3QgKnBjbSwgaW50IGVuYWJsZSk7CitzbmRfcGNtX3N0YXRlX3Qgc25kX3BjbV9zdGF0ZShzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9od3N5bmMoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fZGVsYXkoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc2ZyYW1lc190ICpkZWxheXApOworaW50IHNuZF9wY21fcmVzdW1lKHNuZF9wY21fdCAqcGNtKTsKK2ludCBzbmRfcGNtX2h0aW1lc3RhbXAoc25kX3BjbV90ICpwY20sIHNuZF9wY21fdWZyYW1lc190ICphdmFpbCwgc25kX2h0aW1lc3RhbXBfdCAqdHN0YW1wKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fYXZhaWwoc25kX3BjbV90ICpwY20pOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9hdmFpbF91cGRhdGUoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fYXZhaWxfZGVsYXkoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc2ZyYW1lc190ICphdmFpbHAsIHNuZF9wY21fc2ZyYW1lc190ICpkZWxheXApOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9yZXdpbmRhYmxlKHNuZF9wY21fdCAqcGNtKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fcmV3aW5kKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9mb3J3YXJkYWJsZShzbmRfcGNtX3QgKnBjbSk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX2ZvcndhcmQoc25kX3BjbV90ICpwY20sIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcyk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX3dyaXRlaShzbmRfcGNtX3QgKnBjbSwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fcmVhZGkoc25kX3BjbV90ICpwY20sIHZvaWQgKmJ1ZmZlciwgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX3dyaXRlbihzbmRfcGNtX3QgKnBjbSwgdm9pZCAqKmJ1ZnMsIHNuZF9wY21fdWZyYW1lc190IHNpemUpOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9yZWFkbihzbmRfcGNtX3QgKnBjbSwgdm9pZCAqKmJ1ZnMsIHNuZF9wY21fdWZyYW1lc190IHNpemUpOworaW50IHNuZF9wY21fd2FpdChzbmRfcGNtX3QgKnBjbSwgaW50IHRpbWVvdXQpOworCitpbnQgc25kX3BjbV9saW5rKHNuZF9wY21fdCAqcGNtMSwgc25kX3BjbV90ICpwY20yKTsKK2ludCBzbmRfcGNtX3VubGluayhzbmRfcGNtX3QgKnBjbSk7CisKKy8vaW50IHNuZF9wY21fbWl4ZXJfZWxlbWVudChzbmRfcGNtX3QgKnBjbSwgc25kX21peGVyX3QgKm1peGVyLCBzbmRfbWl4ZXJfZWxlbV90ICoqZWxlbSk7CisKKy8qCisgKiBhcHBsaWNhdGlvbiBoZWxwZXJzIC0gdGhlc2UgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3AKKyAqIG9mIHRoZSBiYXNpYyBBUEkKKyAqLworCitpbnQgc25kX3BjbV9yZWNvdmVyKHNuZF9wY21fdCAqcGNtLCBpbnQgZXJyLCBpbnQgc2lsZW50KTsKK2ludCBzbmRfcGNtX3NldF9wYXJhbXMoc25kX3BjbV90ICpwY20sCisgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX2FjY2Vzc190IGFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvZnRfcmVzYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsYXRlbmN5KTsKK2ludCBzbmRfcGNtX2dldF9wYXJhbXMoc25kX3BjbV90ICpwY20sCisgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fdWZyYW1lc190ICpidWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV91ZnJhbWVzX3QgKnBlcmlvZF9zaXplKTsKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9JbmZvIFN0cmVhbSBJbmZvcm1hdGlvbgorICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworc2l6ZV90IHNuZF9wY21faW5mb19zaXplb2Yodm9pZCk7CisvKiogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIGFsbG9jYXRlIGFuIGludmFsaWQgI3NuZF9wY21faW5mb190IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX3BjbV9pbmZvX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF9wY21faW5mbykKK2ludCBzbmRfcGNtX2luZm9fbWFsbG9jKHNuZF9wY21faW5mb190ICoqcHRyKTsKK3ZvaWQgc25kX3BjbV9pbmZvX2ZyZWUoc25kX3BjbV9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9wY21faW5mb19jb3B5KHNuZF9wY21faW5mb190ICpkc3QsIGNvbnN0IHNuZF9wY21faW5mb190ICpzcmMpOwordW5zaWduZWQgaW50IHNuZF9wY21faW5mb19nZXRfZGV2aWNlKGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9wY21faW5mb19nZXRfc3ViZGV2aWNlKGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOworc25kX3BjbV9zdHJlYW1fdCBzbmRfcGNtX2luZm9fZ2V0X3N0cmVhbShjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK2ludCBzbmRfcGNtX2luZm9fZ2V0X2NhcmQoY29uc3Qgc25kX3BjbV9pbmZvX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfcGNtX2luZm9fZ2V0X2lkKGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX3BjbV9pbmZvX2dldF9uYW1lKGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX3BjbV9pbmZvX2dldF9zdWJkZXZpY2VfbmFtZShjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK3NuZF9wY21fY2xhc3NfdCBzbmRfcGNtX2luZm9fZ2V0X2NsYXNzKGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOworc25kX3BjbV9zdWJjbGFzc190IHNuZF9wY21faW5mb19nZXRfc3ViY2xhc3MoY29uc3Qgc25kX3BjbV9pbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9pbmZvX2dldF9zdWJkZXZpY2VzX2NvdW50KGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9wY21faW5mb19nZXRfc3ViZGV2aWNlc19hdmFpbChjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK3NuZF9wY21fc3luY19pZF90IHNuZF9wY21faW5mb19nZXRfc3luYyhjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK3ZvaWQgc25kX3BjbV9pbmZvX3NldF9kZXZpY2Uoc25kX3BjbV9pbmZvX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIHNuZF9wY21faW5mb19zZXRfc3ViZGV2aWNlKHNuZF9wY21faW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfcGNtX2luZm9fc2V0X3N0cmVhbShzbmRfcGNtX2luZm9fdCAqb2JqLCBzbmRfcGNtX3N0cmVhbV90IHZhbCk7CisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fSFdfUGFyYW1zIEhhcmR3YXJlIFBhcmFtZXRlcnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19hbnkoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19jYW5fbW1hcF9zYW1wbGVfcmVzb2x1dGlvbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2lzX2RvdWJsZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2lzX2JhdGNoKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfaXNfYmxvY2tfdHJhbnNmZXIoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19pc19tb25vdG9uaWMoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19jYW5fb3ZlcnJhbmdlKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfY2FuX3BhdXNlKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfY2FuX3Jlc3VtZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2lzX2hhbGZfZHVwbGV4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfaXNfam9pbnRfZHVwbGV4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfY2FuX3N5bmNfc3RhcnQoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19jYW5fZGlzYWJsZV9wZXJpb2Rfd2FrZXVwKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3JhdGVfbnVtZGVuKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgKnJhdGVfbnVtLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAqcmF0ZV9kZW4pOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9zYml0cyhjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9maWZvX3NpemUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKKworI2lmIDAKK3R5cGVkZWYgc3RydWN0IF9zbmRfcGNtX2h3X3N0cmF0ZWd5IHNuZF9wY21faHdfc3RyYXRlZ3lfdDsKKworLyogY2hvaWNlcyBuZWVkIHRvIGJlIHNvcnRlZCBvbiBhc2NlbmRpbmcgYmFkbmVzcyAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21faHdfc3RyYXRlZ3lfc2ltcGxlX2Nob2ljZXNfbGlzdCB7CisJdW5zaWduZWQgaW50IHZhbHVlOworCXVuc2lnbmVkIGludCBiYWRuZXNzOworfSBzbmRfcGNtX2h3X3N0cmF0ZWd5X3NpbXBsZV9jaG9pY2VzX2xpc3RfdDsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX3N0cmF0ZWd5KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsCisJCQkgICAgICAgY29uc3Qgc25kX3BjbV9od19zdHJhdGVneV90ICpzdHJhdGVneSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgYmFkbmVzc19taW4sCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJhZG5lc3NfbWF4KTsKKwordm9pZCBzbmRfcGNtX2h3X3N0cmF0ZWd5X2ZyZWUoc25kX3BjbV9od19zdHJhdGVneV90ICpzdHJhdGVneSk7CitpbnQgc25kX3BjbV9od19zdHJhdGVneV9zaW1wbGUoc25kX3BjbV9od19zdHJhdGVneV90ICoqc3RyYXRlZ3lwLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBiYWRuZXNzX21pbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgYmFkbmVzc19tYXgpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3RyeV9leHBsYWluX2ZhaWx1cmUoc25kX3BjbV90ICpwY20sCisJCQkJCSAgc25kX3BjbV9od19wYXJhbXNfdCAqZmFpbCwKKwkJCQkJICBzbmRfcGNtX2h3X3BhcmFtc190ICpzdWNjZXNzLAorCQkJCQkgIHVuc2lnbmVkIGludCBkZXB0aCwKKwkJCQkJICBzbmRfb3V0cHV0X3QgKm91dCk7CisKKyNlbmRpZgorCitzaXplX3Qgc25kX3BjbV9od19wYXJhbXNfc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfcGNtX2h3X3BhcmFtc190IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX3BjbV9od19wYXJhbXNfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX3BjbV9od19wYXJhbXMpCitpbnQgc25kX3BjbV9od19wYXJhbXNfbWFsbG9jKHNuZF9wY21faHdfcGFyYW1zX3QgKipwdHIpOwordm9pZCBzbmRfcGNtX2h3X3BhcmFtc19mcmVlKHNuZF9wY21faHdfcGFyYW1zX3QgKm9iaik7Cit2b2lkIHNuZF9wY21faHdfcGFyYW1zX2NvcHkoc25kX3BjbV9od19wYXJhbXNfdCAqZHN0LCBjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpzcmMpOworCisjaWYgIWRlZmluZWQoQUxTQV9MSUJSQVJZX0JVSUxEKSAmJiAhZGVmaW5lZChBTFNBX1BDTV9PTERfSFdfUEFSQU1TX0FQSSkKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9hY2Nlc3MoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc190ICpfYWNjZXNzKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X2FjY2VzcyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc190IF9hY2Nlc3MpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3Moc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9hY2Nlc3NfdCBfYWNjZXNzKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX3QgKl9hY2Nlc3MpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3NfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc190ICpfYWNjZXNzKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzX21hc2soc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9hY2Nlc3NfbWFza190ICptYXNrKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYWNjZXNzX21hc2soc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2spOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2Zvcm1hdChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9mb3JtYXQoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9mb3JtYXRfdCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXQoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9mb3JtYXRfdCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXRfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9mb3JtYXRfdCAqZm9ybWF0KTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0X2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9mb3JtYXRfdCAqZm9ybWF0KTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0X21hc2soc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9mb3JtYXRfbWFza190ICptYXNrKTsKK3ZvaWQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2Zvcm1hdF9tYXNrKHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9mb3JtYXRfbWFza190ICptYXNrKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9zdWJmb3JtYXQoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3N1YmZvcm1hdF90ICpzdWJmb3JtYXQpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3Rfc3ViZm9ybWF0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fc3ViZm9ybWF0X3Qgc3ViZm9ybWF0KTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfc3ViZm9ybWF0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fc3ViZm9ybWF0X3Qgc3ViZm9ybWF0KTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfc3ViZm9ybWF0X2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fc3ViZm9ybWF0X3QgKnN1YmZvcm1hdCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdF9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fc3ViZm9ybWF0X3QgKnN1YmZvcm1hdCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdF9tYXNrKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqbWFzayk7Cit2b2lkIHNuZF9wY21faHdfcGFyYW1zX2dldF9zdWJmb3JtYXRfbWFzayhzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqbWFzayk7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHMoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHNfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfY2hhbm5lbHMoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19taW5tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICptaW4sIHVuc2lnbmVkIGludCAqbWF4KTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3JhdGVfbWluKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZV9tYXgoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfcmF0ZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9taW5tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICptaW4sIGludCAqbWluZGlyLCB1bnNpZ25lZCBpbnQgKm1heCwgaW50ICptYXhkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9yZXNhbXBsZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZV9yZXNhbXBsZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2V4cG9ydF9idWZmZXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2V4cG9ydF9idWZmZXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfd2FrZXVwKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfd2FrZXVwKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF90aW1lX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF90aW1lX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9wZXJpb2RfdGltZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbWlubWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqbWluLCBpbnQgKm1pbmRpciwgdW5zaWduZWQgaW50ICptYXgsIGludCAqbWF4ZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqZnJhbWVzLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICpmcmFtZXMsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemVfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKmZyYW1lcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfcGVyaW9kX3NpemUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbWlubWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICptaW4sIGludCAqbWluZGlyLCBzbmRfcGNtX3VmcmFtZXNfdCAqbWF4LCBpbnQgKm1heGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9pbnRlZ2VyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHMoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RzX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHNfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3BlcmlvZHMoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHMoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbWlubWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqbWluLCBpbnQgKm1pbmRpciwgdW5zaWduZWQgaW50ICptYXgsIGludCAqbWF4ZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfaW50ZWdlcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfdGltZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9idWZmZXJfdGltZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbWlubWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqbWluLCBpbnQgKm1pbmRpciwgdW5zaWduZWQgaW50ICptYXgsIGludCAqbWF4ZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemVfbWluKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfYnVmZmVyX3NpemUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqbWluLCBzbmRfcGNtX3VmcmFtZXNfdCAqbWF4KTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CisKKyNlbmRpZiAvKiAhQUxTQV9MSUJSQVJZX0JVSUxEICYmICFBTFNBX1BDTV9PTERfSFdfUEFSQU1TX0FQSSAqLworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X21pbl9hbGlnbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX1NXX1BhcmFtcyBTb2Z0d2FyZSBQYXJhbWV0ZXJzCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCitzaXplX3Qgc25kX3BjbV9zd19wYXJhbXNfc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfcGNtX3N3X3BhcmFtc190IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX3BjbV9zd19wYXJhbXNfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX3BjbV9zd19wYXJhbXMpCitpbnQgc25kX3BjbV9zd19wYXJhbXNfbWFsbG9jKHNuZF9wY21fc3dfcGFyYW1zX3QgKipwdHIpOwordm9pZCBzbmRfcGNtX3N3X3BhcmFtc19mcmVlKHNuZF9wY21fc3dfcGFyYW1zX3QgKm9iaik7Cit2b2lkIHNuZF9wY21fc3dfcGFyYW1zX2NvcHkoc25kX3BjbV9zd19wYXJhbXNfdCAqZHN0LCBjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpzcmMpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX2dldF9ib3VuZGFyeShjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworCisjaWYgIWRlZmluZWQoQUxTQV9MSUJSQVJZX0JVSUxEKSAmJiAhZGVmaW5lZChBTFNBX1BDTV9PTERfU1dfUEFSQU1TX0FQSSkKKworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF90c3RhbXBfbW9kZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3RzdGFtcF90IHZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3RzdGFtcF9tb2RlKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV90c3RhbXBfdCAqdmFsKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfYXZhaWxfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfZ2V0X2F2YWlsX21pbihjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9wZXJpb2RfZXZlbnQoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgaW50IHZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3BlcmlvZF9ldmVudChjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIGludCAqdmFsKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc3RhcnRfdGhyZXNob2xkKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3N0YXJ0X3RocmVzaG9sZChjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXNtLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc3RvcF90aHJlc2hvbGQoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc3RvcF90aHJlc2hvbGQoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc2lsZW5jZV90aHJlc2hvbGQoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2lsZW5jZV90aHJlc2hvbGQoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc2lsZW5jZV9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3NpbGVuY2Vfc2l6ZShjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworCisjZW5kaWYgLyogIUFMU0FfTElCUkFSWV9CVUlMRCAmJiAhQUxTQV9QQ01fT0xEX1NXX1BBUkFNU19BUEkgKi8KKworLyoqIFx9ICovCisKKy8qIGluY2x1ZGUgb2xkIEFQSSAqLworI2lmbmRlZiBBTFNBX0xJQlJBUllfQlVJTEQKKyNpZiBkZWZpbmVkKEFMU0FfUENNX09MRF9IV19QQVJBTVNfQVBJKSB8fCBkZWZpbmVkKEFMU0FfUENNX09MRF9TV19QQVJBTVNfQVBJKQorI2luY2x1ZGUgInBjbV9vbGQuaCIKKyNlbmRpZgorI2VuZGlmCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9BY2Nlc3MgQWNjZXNzIE1hc2sgRnVuY3Rpb25zCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCitzaXplX3Qgc25kX3BjbV9hY2Nlc3NfbWFza19zaXplb2Yodm9pZCk7CisvKiogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIGFsbG9jYXRlIGFuIGVtcHR5ICNzbmRfcGNtX2FjY2Vzc19tYXNrX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfcGNtX2FjY2Vzc19tYXNrX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF9wY21fYWNjZXNzX21hc2spCitpbnQgc25kX3BjbV9hY2Nlc3NfbWFza19tYWxsb2Moc25kX3BjbV9hY2Nlc3NfbWFza190ICoqcHRyKTsKK3ZvaWQgc25kX3BjbV9hY2Nlc3NfbWFza19mcmVlKHNuZF9wY21fYWNjZXNzX21hc2tfdCAqb2JqKTsKK3ZvaWQgc25kX3BjbV9hY2Nlc3NfbWFza19jb3B5KHNuZF9wY21fYWNjZXNzX21hc2tfdCAqZHN0LCBjb25zdCBzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKnNyYyk7Cit2b2lkIHNuZF9wY21fYWNjZXNzX21hc2tfbm9uZShzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX2FjY2Vzc19tYXNrX2FueShzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2spOworaW50IHNuZF9wY21fYWNjZXNzX21hc2tfdGVzdChjb25zdCBzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2ssIHNuZF9wY21fYWNjZXNzX3QgdmFsKTsKK2ludCBzbmRfcGNtX2FjY2Vzc19tYXNrX2VtcHR5KGNvbnN0IHNuZF9wY21fYWNjZXNzX21hc2tfdCAqbWFzayk7Cit2b2lkIHNuZF9wY21fYWNjZXNzX21hc2tfc2V0KHNuZF9wY21fYWNjZXNzX21hc2tfdCAqbWFzaywgc25kX3BjbV9hY2Nlc3NfdCB2YWwpOwordm9pZCBzbmRfcGNtX2FjY2Vzc19tYXNrX3Jlc2V0KHNuZF9wY21fYWNjZXNzX21hc2tfdCAqbWFzaywgc25kX3BjbV9hY2Nlc3NfdCB2YWwpOworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX0Zvcm1hdCBGb3JtYXQgTWFzayBGdW5jdGlvbnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK3NpemVfdCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gZW1wdHkgI3NuZF9wY21fZm9ybWF0X21hc2tfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9wY21fZm9ybWF0X21hc2tfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX3BjbV9mb3JtYXRfbWFzaykKK2ludCBzbmRfcGNtX2Zvcm1hdF9tYXNrX21hbGxvYyhzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKipwdHIpOwordm9pZCBzbmRfcGNtX2Zvcm1hdF9tYXNrX2ZyZWUoc25kX3BjbV9mb3JtYXRfbWFza190ICpvYmopOwordm9pZCBzbmRfcGNtX2Zvcm1hdF9tYXNrX2NvcHkoc25kX3BjbV9mb3JtYXRfbWFza190ICpkc3QsIGNvbnN0IHNuZF9wY21fZm9ybWF0X21hc2tfdCAqc3JjKTsKK3ZvaWQgc25kX3BjbV9mb3JtYXRfbWFza19ub25lKHNuZF9wY21fZm9ybWF0X21hc2tfdCAqbWFzayk7Cit2b2lkIHNuZF9wY21fZm9ybWF0X21hc2tfYW55KHNuZF9wY21fZm9ybWF0X21hc2tfdCAqbWFzayk7CitpbnQgc25kX3BjbV9mb3JtYXRfbWFza190ZXN0KGNvbnN0IHNuZF9wY21fZm9ybWF0X21hc2tfdCAqbWFzaywgc25kX3BjbV9mb3JtYXRfdCB2YWwpOworaW50IHNuZF9wY21fZm9ybWF0X21hc2tfZW1wdHkoY29uc3Qgc25kX3BjbV9mb3JtYXRfbWFza190ICptYXNrKTsKK3ZvaWQgc25kX3BjbV9mb3JtYXRfbWFza19zZXQoc25kX3BjbV9mb3JtYXRfbWFza190ICptYXNrLCBzbmRfcGNtX2Zvcm1hdF90IHZhbCk7Cit2b2lkIHNuZF9wY21fZm9ybWF0X21hc2tfcmVzZXQoc25kX3BjbV9mb3JtYXRfbWFza190ICptYXNrLCBzbmRfcGNtX2Zvcm1hdF90IHZhbCk7CisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fU3ViRm9ybWF0IFN1YmZvcm1hdCBNYXNrIEZ1bmN0aW9ucworICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworc2l6ZV90IHNuZF9wY21fc3ViZm9ybWF0X21hc2tfc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBlbXB0eSAjc25kX3BjbV9zdWJmb3JtYXRfbWFza190IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX3BjbV9zdWJmb3JtYXRfbWFza19hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrKQoraW50IHNuZF9wY21fc3ViZm9ybWF0X21hc2tfbWFsbG9jKHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqKnB0cik7Cit2b2lkIHNuZF9wY21fc3ViZm9ybWF0X21hc2tfZnJlZShzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKm9iaik7Cit2b2lkIHNuZF9wY21fc3ViZm9ybWF0X21hc2tfY29weShzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKmRzdCwgY29uc3Qgc25kX3BjbV9zdWJmb3JtYXRfbWFza190ICpzcmMpOwordm9pZCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX25vbmUoc25kX3BjbV9zdWJmb3JtYXRfbWFza190ICptYXNrKTsKK3ZvaWQgc25kX3BjbV9zdWJmb3JtYXRfbWFza19hbnkoc25kX3BjbV9zdWJmb3JtYXRfbWFza190ICptYXNrKTsKK2ludCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3Rlc3QoY29uc3Qgc25kX3BjbV9zdWJmb3JtYXRfbWFza190ICptYXNrLCBzbmRfcGNtX3N1YmZvcm1hdF90IHZhbCk7CitpbnQgc25kX3BjbV9zdWJmb3JtYXRfbWFza19lbXB0eShjb25zdCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3NldChzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKm1hc2ssIHNuZF9wY21fc3ViZm9ybWF0X3QgdmFsKTsKK3ZvaWQgc25kX3BjbV9zdWJmb3JtYXRfbWFza19yZXNldChzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKm1hc2ssIHNuZF9wY21fc3ViZm9ybWF0X3QgdmFsKTsKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9TdGF0dXMgU3RhdHVzIEZ1bmN0aW9ucworICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworc2l6ZV90IHNuZF9wY21fc3RhdHVzX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX3BjbV9zdGF0dXNfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9wY21fc3RhdHVzX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF9wY21fc3RhdHVzKQoraW50IHNuZF9wY21fc3RhdHVzX21hbGxvYyhzbmRfcGNtX3N0YXR1c190ICoqcHRyKTsKK3ZvaWQgc25kX3BjbV9zdGF0dXNfZnJlZShzbmRfcGNtX3N0YXR1c190ICpvYmopOwordm9pZCBzbmRfcGNtX3N0YXR1c19jb3B5KHNuZF9wY21fc3RhdHVzX3QgKmRzdCwgY29uc3Qgc25kX3BjbV9zdGF0dXNfdCAqc3JjKTsKK3NuZF9wY21fc3RhdGVfdCBzbmRfcGNtX3N0YXR1c19nZXRfc3RhdGUoY29uc3Qgc25kX3BjbV9zdGF0dXNfdCAqb2JqKTsKK3ZvaWQgc25kX3BjbV9zdGF0dXNfZ2V0X3RyaWdnZXJfdHN0YW1wKGNvbnN0IHNuZF9wY21fc3RhdHVzX3QgKm9iaiwgc25kX3RpbWVzdGFtcF90ICpwdHIpOwordm9pZCBzbmRfcGNtX3N0YXR1c19nZXRfdHJpZ2dlcl9odHN0YW1wKGNvbnN0IHNuZF9wY21fc3RhdHVzX3QgKm9iaiwgc25kX2h0aW1lc3RhbXBfdCAqcHRyKTsKK3ZvaWQgc25kX3BjbV9zdGF0dXNfZ2V0X3RzdGFtcChjb25zdCBzbmRfcGNtX3N0YXR1c190ICpvYmosIHNuZF90aW1lc3RhbXBfdCAqcHRyKTsKK3ZvaWQgc25kX3BjbV9zdGF0dXNfZ2V0X2h0c3RhbXAoY29uc3Qgc25kX3BjbV9zdGF0dXNfdCAqb2JqLCBzbmRfaHRpbWVzdGFtcF90ICpwdHIpOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9zdGF0dXNfZ2V0X2RlbGF5KGNvbnN0IHNuZF9wY21fc3RhdHVzX3QgKm9iaik7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX3N0YXR1c19nZXRfYXZhaWwoY29uc3Qgc25kX3BjbV9zdGF0dXNfdCAqb2JqKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21fc3RhdHVzX2dldF9hdmFpbF9tYXgoY29uc3Qgc25kX3BjbV9zdGF0dXNfdCAqb2JqKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21fc3RhdHVzX2dldF9vdmVycmFuZ2UoY29uc3Qgc25kX3BjbV9zdGF0dXNfdCAqb2JqKTsKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9EZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBGdW5jdGlvbnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK2NvbnN0IGNoYXIgKnNuZF9wY21fdHlwZV9uYW1lKHNuZF9wY21fdHlwZV90IHR5cGUpOworY29uc3QgY2hhciAqc25kX3BjbV9zdHJlYW1fbmFtZShjb25zdCBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSk7Citjb25zdCBjaGFyICpzbmRfcGNtX2FjY2Vzc19uYW1lKGNvbnN0IHNuZF9wY21fYWNjZXNzX3QgX2FjY2Vzcyk7Citjb25zdCBjaGFyICpzbmRfcGNtX2Zvcm1hdF9uYW1lKGNvbnN0IHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK2NvbnN0IGNoYXIgKnNuZF9wY21fZm9ybWF0X2Rlc2NyaXB0aW9uKGNvbnN0IHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK2NvbnN0IGNoYXIgKnNuZF9wY21fc3ViZm9ybWF0X25hbWUoY29uc3Qgc25kX3BjbV9zdWJmb3JtYXRfdCBzdWJmb3JtYXQpOworY29uc3QgY2hhciAqc25kX3BjbV9zdWJmb3JtYXRfZGVzY3JpcHRpb24oY29uc3Qgc25kX3BjbV9zdWJmb3JtYXRfdCBzdWJmb3JtYXQpOworc25kX3BjbV9mb3JtYXRfdCBzbmRfcGNtX2Zvcm1hdF92YWx1ZShjb25zdCBjaGFyKiBuYW1lKTsKK2NvbnN0IGNoYXIgKnNuZF9wY21fdHN0YW1wX21vZGVfbmFtZShjb25zdCBzbmRfcGNtX3RzdGFtcF90IG1vZGUpOworY29uc3QgY2hhciAqc25kX3BjbV9zdGF0ZV9uYW1lKGNvbnN0IHNuZF9wY21fc3RhdGVfdCBzdGF0ZSk7CisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fRHVtcCBEZWJ1ZyBGdW5jdGlvbnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK2ludCBzbmRfcGNtX2R1bXAoc25kX3BjbV90ICpwY20sIHNuZF9vdXRwdXRfdCAqb3V0KTsKK2ludCBzbmRfcGNtX2R1bXBfaHdfc2V0dXAoc25kX3BjbV90ICpwY20sIHNuZF9vdXRwdXRfdCAqb3V0KTsKK2ludCBzbmRfcGNtX2R1bXBfc3dfc2V0dXAoc25kX3BjbV90ICpwY20sIHNuZF9vdXRwdXRfdCAqb3V0KTsKK2ludCBzbmRfcGNtX2R1bXBfc2V0dXAoc25kX3BjbV90ICpwY20sIHNuZF9vdXRwdXRfdCAqb3V0KTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19kdW1wKHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX291dHB1dF90ICpvdXQpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX2R1bXAoc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfb3V0cHV0X3QgKm91dCk7CitpbnQgc25kX3BjbV9zdGF0dXNfZHVtcChzbmRfcGNtX3N0YXR1c190ICpzdGF0dXMsIHNuZF9vdXRwdXRfdCAqb3V0KTsKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9EaXJlY3QgRGlyZWN0IEFjY2VzcyAoTU1BUCkgRnVuY3Rpb25zCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCitpbnQgc25kX3BjbV9tbWFwX2JlZ2luKHNuZF9wY21fdCAqcGNtLAorCQkgICAgICAgY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqKmFyZWFzLAorCQkgICAgICAgc25kX3BjbV91ZnJhbWVzX3QgKm9mZnNldCwKKwkJICAgICAgIHNuZF9wY21fdWZyYW1lc190ICpmcmFtZXMpOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9tbWFwX2NvbW1pdChzbmRfcGNtX3QgKnBjbSwKKwkJCQkgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBvZmZzZXQsCisJCQkJICAgICAgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fbW1hcF93cml0ZWkoc25kX3BjbV90ICpwY20sIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX21tYXBfcmVhZGkoc25kX3BjbV90ICpwY20sIHZvaWQgKmJ1ZmZlciwgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX21tYXBfd3JpdGVuKHNuZF9wY21fdCAqcGNtLCB2b2lkICoqYnVmcywgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX21tYXBfcmVhZG4oc25kX3BjbV90ICpwY20sIHZvaWQgKipidWZzLCBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fSGVscGVycyBIZWxwZXIgRnVuY3Rpb25zCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCitpbnQgc25kX3BjbV9mb3JtYXRfc2lnbmVkKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK2ludCBzbmRfcGNtX2Zvcm1hdF91bnNpZ25lZChzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CitpbnQgc25kX3BjbV9mb3JtYXRfbGluZWFyKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK2ludCBzbmRfcGNtX2Zvcm1hdF9mbG9hdChzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CitpbnQgc25kX3BjbV9mb3JtYXRfbGl0dGxlX2VuZGlhbihzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CitpbnQgc25kX3BjbV9mb3JtYXRfYmlnX2VuZGlhbihzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CitpbnQgc25kX3BjbV9mb3JtYXRfY3B1X2VuZGlhbihzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CitpbnQgc25kX3BjbV9mb3JtYXRfd2lkdGgoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOwkJCS8qIGluIGJpdHMgKi8KK2ludCBzbmRfcGNtX2Zvcm1hdF9waHlzaWNhbF93aWR0aChzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CQkvKiBpbiBiaXRzICovCitzbmRfcGNtX2Zvcm1hdF90IHNuZF9wY21fYnVpbGRfbGluZWFyX2Zvcm1hdChpbnQgd2lkdGgsIGludCBwd2lkdGgsIGludCB1bnNpZ25kLCBpbnQgYmlnX2VuZGlhbik7Citzc2l6ZV90IHNuZF9wY21fZm9ybWF0X3NpemUoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQsIHNpemVfdCBzYW1wbGVzKTsKK3VfaW50OF90IHNuZF9wY21fZm9ybWF0X3NpbGVuY2Uoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOwordV9pbnQxNl90IHNuZF9wY21fZm9ybWF0X3NpbGVuY2VfMTYoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOwordV9pbnQzMl90IHNuZF9wY21fZm9ybWF0X3NpbGVuY2VfMzIoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOwordV9pbnQ2NF90IHNuZF9wY21fZm9ybWF0X3NpbGVuY2VfNjQoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworaW50IHNuZF9wY21fZm9ybWF0X3NldF9zaWxlbmNlKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0LCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzYW1wbGVzKTsKKworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9ieXRlc190b19mcmFtZXMoc25kX3BjbV90ICpwY20sIHNzaXplX3QgYnl0ZXMpOworc3NpemVfdCBzbmRfcGNtX2ZyYW1lc190b19ieXRlcyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zZnJhbWVzX3QgZnJhbWVzKTsKK2xvbmcgc25kX3BjbV9ieXRlc190b19zYW1wbGVzKHNuZF9wY21fdCAqcGNtLCBzc2l6ZV90IGJ5dGVzKTsKK3NzaXplX3Qgc25kX3BjbV9zYW1wbGVzX3RvX2J5dGVzKHNuZF9wY21fdCAqcGNtLCBsb25nIHNhbXBsZXMpOworCitpbnQgc25kX3BjbV9hcmVhX3NpbGVuY2UoY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqZHN0X2NoYW5uZWwsIHNuZF9wY21fdWZyYW1lc190IGRzdF9vZmZzZXQsCisJCQkgdW5zaWduZWQgaW50IHNhbXBsZXMsIHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK2ludCBzbmRfcGNtX2FyZWFzX3NpbGVuY2UoY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqZHN0X2NoYW5uZWxzLCBzbmRfcGNtX3VmcmFtZXNfdCBkc3Rfb2Zmc2V0LAorCQkJICB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcywgc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworaW50IHNuZF9wY21fYXJlYV9jb3B5KGNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKmRzdF9jaGFubmVsLCBzbmRfcGNtX3VmcmFtZXNfdCBkc3Rfb2Zmc2V0LAorCQkgICAgICBjb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICpzcmNfY2hhbm5lbCwgc25kX3BjbV91ZnJhbWVzX3Qgc3JjX29mZnNldCwKKwkJICAgICAgdW5zaWduZWQgaW50IHNhbXBsZXMsIHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK2ludCBzbmRfcGNtX2FyZWFzX2NvcHkoY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqZHN0X2NoYW5uZWxzLCBzbmRfcGNtX3VmcmFtZXNfdCBkc3Rfb2Zmc2V0LAorCQkgICAgICAgY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqc3JjX2NoYW5uZWxzLCBzbmRfcGNtX3VmcmFtZXNfdCBzcmNfb2Zmc2V0LAorCQkgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxzLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMsIHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9Ib29rIEhvb2sgRXh0ZW5zaW9uCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCisvKiogdHlwZSBvZiBwY20gaG9vayAqLwordHlwZWRlZiBlbnVtIF9zbmRfcGNtX2hvb2tfdHlwZSB7CisJU05EX1BDTV9IT09LX1RZUEVfSFdfUEFSQU1TID0gMCwKKwlTTkRfUENNX0hPT0tfVFlQRV9IV19GUkVFLAorCVNORF9QQ01fSE9PS19UWVBFX0NMT1NFLAorCVNORF9QQ01fSE9PS19UWVBFX0xBU1QgPSBTTkRfUENNX0hPT0tfVFlQRV9DTE9TRQorfSBzbmRfcGNtX2hvb2tfdHlwZV90OworCisvKiogUENNIGhvb2sgY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3BjbV9ob29rIHNuZF9wY21faG9va190OworLyoqIFBDTSBob29rIGNhbGxiYWNrIGZ1bmN0aW9uICovCit0eXBlZGVmIGludCAoKnNuZF9wY21faG9va19mdW5jX3QpKHNuZF9wY21faG9va190ICpob29rKTsKK3NuZF9wY21fdCAqc25kX3BjbV9ob29rX2dldF9wY20oc25kX3BjbV9ob29rX3QgKmhvb2spOwordm9pZCAqc25kX3BjbV9ob29rX2dldF9wcml2YXRlKHNuZF9wY21faG9va190ICpob29rKTsKK3ZvaWQgc25kX3BjbV9ob29rX3NldF9wcml2YXRlKHNuZF9wY21faG9va190ICpob29rLCB2b2lkICpwcml2YXRlX2RhdGEpOworaW50IHNuZF9wY21faG9va19hZGQoc25kX3BjbV9ob29rX3QgKipob29rcCwgc25kX3BjbV90ICpwY20sCisJCSAgICAgc25kX3BjbV9ob29rX3R5cGVfdCB0eXBlLAorCQkgICAgIHNuZF9wY21faG9va19mdW5jX3QgZnVuYywgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKK2ludCBzbmRfcGNtX2hvb2tfcmVtb3ZlKHNuZF9wY21faG9va190ICpob29rKTsKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9TY29wZSBTY29wZSBQbHVnaW4gRXh0ZW5zaW9uCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCisvKiogI1NORF9QQ01fVFlQRV9NRVRFUiBzY29wZSBmdW5jdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcGNtX3Njb3BlX29wcyB7CisJLyoqIFxicmllZiBFbmFibGUgYW5kIHByZXBhcmUgaXQgdXNpbmcgY3VycmVudCBwYXJhbXMKKwkgKiBccGFyYW0gc2NvcGUgc2NvcGUgaGFuZGxlCisJICovCisJaW50ICgqZW5hYmxlKShzbmRfcGNtX3Njb3BlX3QgKnNjb3BlKTsKKwkvKiogXGJyaWVmIERpc2FibGUKKwkgKiBccGFyYW0gc2NvcGUgc2NvcGUgaGFuZGxlCisJICovCisJdm9pZCAoKmRpc2FibGUpKHNuZF9wY21fc2NvcGVfdCAqc2NvcGUpOworCS8qKiBcYnJpZWYgUENNIGhhcyBiZWVuIHN0YXJ0ZWQKKwkgKiBccGFyYW0gc2NvcGUgc2NvcGUgaGFuZGxlCisJICovCisJdm9pZCAoKnN0YXJ0KShzbmRfcGNtX3Njb3BlX3QgKnNjb3BlKTsKKwkvKiogXGJyaWVmIFBDTSBoYXMgYmVlbiBzdG9wcGVkCisJICogXHBhcmFtIHNjb3BlIHNjb3BlIGhhbmRsZQorCSAqLworCXZvaWQgKCpzdG9wKShzbmRfcGNtX3Njb3BlX3QgKnNjb3BlKTsKKwkvKiogXGJyaWVmIE5ldyBmcmFtZXMgYXJlIHByZXNlbnQKKwkgKiBccGFyYW0gc2NvcGUgc2NvcGUgaGFuZGxlCisJICovCisJdm9pZCAoKnVwZGF0ZSkoc25kX3BjbV9zY29wZV90ICpzY29wZSk7CisJLyoqIFxicmllZiBSZXNldCBzdGF0dXMKKwkgKiBccGFyYW0gc2NvcGUgc2NvcGUgaGFuZGxlCisJICovCisJdm9pZCAoKnJlc2V0KShzbmRfcGNtX3Njb3BlX3QgKnNjb3BlKTsKKwkvKiogXGJyaWVmIFBDTSBpcyBjbG9zaW5nCisJICogXHBhcmFtIHNjb3BlIHNjb3BlIGhhbmRsZQorCSAqLworCXZvaWQgKCpjbG9zZSkoc25kX3BjbV9zY29wZV90ICpzY29wZSk7Cit9IHNuZF9wY21fc2NvcGVfb3BzX3Q7CisKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21fbWV0ZXJfZ2V0X2J1ZnNpemUoc25kX3BjbV90ICpwY20pOwordW5zaWduZWQgaW50IHNuZF9wY21fbWV0ZXJfZ2V0X2NoYW5uZWxzKHNuZF9wY21fdCAqcGNtKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX21ldGVyX2dldF9yYXRlKHNuZF9wY21fdCAqcGNtKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21fbWV0ZXJfZ2V0X25vdyhzbmRfcGNtX3QgKnBjbSk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX21ldGVyX2dldF9ib3VuZGFyeShzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9tZXRlcl9hZGRfc2NvcGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc2NvcGVfdCAqc2NvcGUpOworc25kX3BjbV9zY29wZV90ICpzbmRfcGNtX21ldGVyX3NlYXJjaF9zY29wZShzbmRfcGNtX3QgKnBjbSwgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgc25kX3BjbV9zY29wZV9tYWxsb2Moc25kX3BjbV9zY29wZV90ICoqcHRyKTsKK3ZvaWQgc25kX3BjbV9zY29wZV9zZXRfb3BzKHNuZF9wY21fc2NvcGVfdCAqc2NvcGUsCisJCQkgICBjb25zdCBzbmRfcGNtX3Njb3BlX29wc190ICp2YWwpOwordm9pZCBzbmRfcGNtX3Njb3BlX3NldF9uYW1lKHNuZF9wY21fc2NvcGVfdCAqc2NvcGUsIGNvbnN0IGNoYXIgKnZhbCk7Citjb25zdCBjaGFyICpzbmRfcGNtX3Njb3BlX2dldF9uYW1lKHNuZF9wY21fc2NvcGVfdCAqc2NvcGUpOwordm9pZCAqc25kX3BjbV9zY29wZV9nZXRfY2FsbGJhY2tfcHJpdmF0ZShzbmRfcGNtX3Njb3BlX3QgKnNjb3BlKTsKK3ZvaWQgc25kX3BjbV9zY29wZV9zZXRfY2FsbGJhY2tfcHJpdmF0ZShzbmRfcGNtX3Njb3BlX3QgKnNjb3BlLCB2b2lkICp2YWwpOworaW50IHNuZF9wY21fc2NvcGVfczE2X29wZW4oc25kX3BjbV90ICpwY20sIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICBzbmRfcGNtX3Njb3BlX3QgKipzY29wZXApOworaW50MTZfdCAqc25kX3BjbV9zY29wZV9zMTZfZ2V0X2NoYW5uZWxfYnVmZmVyKHNuZF9wY21fc2NvcGVfdCAqc2NvcGUsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsKTsKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9TaW1wbGUgU2ltcGxlIHNldHVwIGZ1bmN0aW9ucworICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworLyoqIFNpbXBsZSBQQ00gbGF0ZW5jeSB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9zcGNtX2xhdGVuY3kgeworCS8qKiBzdGFuZGFyZCBsYXRlbmN5IC0gZm9yIHN0YW5kYXJkIHBsYXliYWNrIG9yIGNhcHR1cmUKKyAgICAgICAgICAgIChlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBvbmUgZGlyZWN0aW9uIDM1MG1zKSAqLworCVNORF9TUENNX0xBVEVOQ1lfU1RBTkRBUkQgPSAwLAorCS8qKiBtZWRpdW0gbGF0ZW5jeSAtIHNvZnR3YXJlIHBob25lcyBldGMuCisJICAgIChlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBvbmUgZGlyZWN0aW9uIG1heGltYWxseSAyNW1zICovCisJU05EX1NQQ01fTEFURU5DWV9NRURJVU0sCisJLyoqIHJlYWx0aW1lIGxhdGVuY3kgLSByZWFsdGltZSBhcHBsaWNhdGlvbnMgKGVmZmVjdCBwcm9jZXNzb3JzIGV0Yy4pCisJICAgIChlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBvbmUgZGlyZWN0aW9uIDVtcyBhbmQgYmV0dGVyKSAqLworCVNORF9TUENNX0xBVEVOQ1lfUkVBTFRJTUUKK30gc25kX3NwY21fbGF0ZW5jeV90OworCisvKiogU2ltcGxlIFBDTSB4cnVuIHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3NwY21feHJ1bl90eXBlIHsKKwkvKiogZHJpdmVyIC8gbGlicmFyeSB3aWxsIGlnbm9yZSBhbGwgeHJ1bnMsIHRoZSBzdHJlYW0gcnVucyBmb3JldmVyICovCisJU05EX1NQQ01fWFJVTl9JR05PUkUgPSAwLAorCS8qKiBkcml2ZXIgLyBsaWJyYXJ5IHN0b3BzIHRoZSBzdHJlYW0gd2hlbiBhbiB4cnVuIG9jY3VycyAqLworCVNORF9TUENNX1hSVU5fU1RPUAorfSBzbmRfc3BjbV94cnVuX3R5cGVfdDsKKworLyoqIFNpbXBsZSBQQ00gZHVwbGV4IHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3NwY21fZHVwbGV4X3R5cGUgeworCS8qKiBsaWJlcmFsIGR1cGxleCAtIHRoZSBidWZmZXIgYW5kIHBlcmlvZCBzaXplcyBtaWdodCBub3QgbWF0Y2ggKi8KKwlTTkRfU1BDTV9EVVBMRVhfTElCRVJBTCA9IDAsCisJLyoqIHBlZGFudGljIGR1cGxleCAtIHRoZSBidWZmZXIgYW5kIHBlcmlvZCBzaXplcyBNVVNUIG1hdGNoICovCisJU05EX1NQQ01fRFVQTEVYX1BFREFOVElDCit9IHNuZF9zcGNtX2R1cGxleF90eXBlX3Q7CisKK2ludCBzbmRfc3BjbV9pbml0KHNuZF9wY21fdCAqcGNtLAorCQkgIHVuc2lnbmVkIGludCByYXRlLAorCQkgIHVuc2lnbmVkIGludCBjaGFubmVscywKKwkJICBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCwKKwkJICBzbmRfcGNtX3N1YmZvcm1hdF90IHN1YmZvcm1hdCwKKwkJICBzbmRfc3BjbV9sYXRlbmN5X3QgbGF0ZW5jeSwKKwkJICBzbmRfcGNtX2FjY2Vzc190IF9hY2Nlc3MsCisJCSAgc25kX3NwY21feHJ1bl90eXBlX3QgeHJ1bl90eXBlKTsKKworaW50IHNuZF9zcGNtX2luaXRfZHVwbGV4KHNuZF9wY21fdCAqcGxheWJhY2tfcGNtLAorCQkJIHNuZF9wY21fdCAqY2FwdHVyZV9wY20sCisJCQkgdW5zaWduZWQgaW50IHJhdGUsCisJCQkgdW5zaWduZWQgaW50IGNoYW5uZWxzLAorCQkJIHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0LAorCQkJIHNuZF9wY21fc3ViZm9ybWF0X3Qgc3ViZm9ybWF0LAorCQkJIHNuZF9zcGNtX2xhdGVuY3lfdCBsYXRlbmN5LAorCQkJIHNuZF9wY21fYWNjZXNzX3QgX2FjY2VzcywKKwkJCSBzbmRfc3BjbV94cnVuX3R5cGVfdCB4cnVuX3R5cGUsCisJCQkgc25kX3NwY21fZHVwbGV4X3R5cGVfdCBkdXBsZXhfdHlwZSk7CisKK2ludCBzbmRfc3BjbV9pbml0X2dldF9wYXJhbXMoc25kX3BjbV90ICpwY20sCisJCQkgICAgIHVuc2lnbmVkIGludCAqcmF0ZSwKKwkJCSAgICAgc25kX3BjbV91ZnJhbWVzX3QgKmJ1ZmZlcl9zaXplLAorCQkJICAgICBzbmRfcGNtX3VmcmFtZXNfdCAqcGVyaW9kX3NpemUpOworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX0RlcHJlY2F0ZWQgRGVwcmVjYXRlZCBGdW5jdGlvbnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKKy8qIERlcHJlY2F0ZWQgZnVuY3Rpb25zLCBmb3IgY29tcGF0aWJpbGl0eSAqLworY29uc3QgY2hhciAqc25kX3BjbV9zdGFydF9tb2RlX25hbWUoc25kX3BjbV9zdGFydF90IG1vZGUpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2NvbnN0IGNoYXIgKnNuZF9wY21feHJ1bl9tb2RlX25hbWUoc25kX3BjbV94cnVuX3QgbW9kZSkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9zdGFydF9tb2RlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fc3RhcnRfdCB2YWwpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK3NuZF9wY21fc3RhcnRfdCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc3RhcnRfbW9kZShjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfeHJ1bl9tb2RlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21feHJ1bl90IHZhbCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworc25kX3BjbV94cnVuX3Qgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3hydW5fbW9kZShjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKKyNpZiAhZGVmaW5lZChBTFNBX0xJQlJBUllfQlVJTEQpICYmICFkZWZpbmVkKEFMU0FfUENNX09MRF9TV19QQVJBTVNfQVBJKQoraW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF94ZmVyX2FsaWduKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX2dldF94ZmVyX2FsaWduKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9zbGVlcF9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX2dldF9zbGVlcF9taW4oY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworI2VuZGlmIC8qICFBTFNBX0xJQlJBUllfQlVJTEQgJiYgIUFMU0FfUENNX09MRF9TV19QQVJBTVNfQVBJICovCisjaWYgIWRlZmluZWQoQUxTQV9MSUJSQVJZX0JVSUxEKSAmJiAhZGVmaW5lZChBTFNBX1BDTV9PTERfSFdfUEFSQU1TX0FQSSkKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfdGlja190aW1lKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZV9taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfdGlja190aW1lX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcikgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfdGlja190aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcikgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWVfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcikgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWVfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKKyNlbmRpZiAvKiAhQUxTQV9MSUJSQVJZX0JVSUxEICYmICFBTFNBX1BDTV9PTERfSFdfUEFSQU1TX0FQSSAqLworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9QQ01fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9leHRlcm5hbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9leHRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTA0MTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX2V4dGVybmFsLmgKQEAgLTAsMCArMSw3MCBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL3BjbV9leHRlcm5hbC5oCisgKiBcYnJpZWYgRXh0ZXJuYWwgUENNIHBsdWdpbiBTREsKKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMjAwNQorICoKKyAqIEV4dGVybiBQQ00gcGx1Z2luIFNESy4KKyAqLworCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisjaWZuZGVmIF9fQUxTQV9QQ01fRVhURVJOQUxfSAorI2RlZmluZSBfX0FMU0FfUENNX0VYVEVSTkFMX0gKKworI2luY2x1ZGUgInBjbS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBQbHVnaW5fU0RLIEV4dGVybmFsIFBDTSBwbHVnaW4gU0RLCisgKiAgXHsKKyAqLworCisvKioKKyAqIERlZmluZSB0aGUgb2JqZWN0IGVudHJ5IGZvciBleHRlcm5hbCBQQ00gcGx1Z2lucworICovCisjZGVmaW5lIFNORF9QQ01fUExVR0lOX0VOVFJZKG5hbWUpIF9zbmRfcGNtXyMjbmFtZSMjX29wZW4KKworLyoqCisgKiBEZWZpbmUgdGhlIHN5bWJvbHMgb2YgdGhlIGdpdmVuIHBsdWdpbiB3aXRoIHZlcnNpb25zCisgKi8KKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fU1lNQk9MKG5hbWUpIFNORF9ETFNZTV9CVUlMRF9WRVJTSU9OKFNORF9QQ01fUExVR0lOX0VOVFJZKG5hbWUpLCBTTkRfUENNX0RMU1lNX1ZFUlNJT04pOworCisvKioKKyAqIERlZmluZSB0aGUgcGx1Z2luCisgKi8KKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fREVGSU5FX0ZVTkMocGx1Z2luKSBcCitpbnQgU05EX1BDTV9QTFVHSU5fRU5UUlkocGx1Z2luKSAoc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSxcCisJCQkJICBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwgXAorCQkJCSAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKQorCisjaW5jbHVkZSAicGNtX2lvcGx1Zy5oIgorI2luY2x1ZGUgInBjbV9leHRwbHVnLmgiCisKK2ludCBzbmRfcGNtX3BhcnNlX2NvbnRyb2xfaWQoc25kX2NvbmZpZ190ICpjb25mLCBzbmRfY3RsX2VsZW1faWRfdCAqY3RsX2lkLCBpbnQgKmNhcmRwLAorCQkJICAgICBpbnQgKmNjaGFubmVsc3AsIGludCAqaHdjdGxwKTsKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfUENNX0VYVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fZXh0cGx1Zy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9leHRwbHVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0YzViZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fZXh0cGx1Zy5oCkBAIC0wLDAgKzEsMTg5IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvcGNtX2V4dHBsdWcuaAorICogXGJyaWVmIEV4dGVybmFsIEZpbHRlci1QbHVnaW4gU0RLCisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDIwMDUKKyAqCisgKiBFeHRlcm5hbCBGaWx0ZXItUGx1Z2luIFNESworICovCisKKy8qCisgKiBBTFNBIGV4dGVybmFsIFBDTSBwbHVnaW4gU0RLIChkcmFmdCB2ZXJzaW9uKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX1BDTV9FWFRQTFVHX0gKKyNkZWZpbmUgX19BTFNBX1BDTV9FWFRQTFVHX0gKKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX0V4dFBsdWcgRXh0ZXJuYWwgRmlsdGVyIHBsdWdpbiBTREsKKyAqIFxpbmdyb3VwIFBsdWdpbl9TREsKKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCisvKiogaHcgY29uc3RyYWludHMgZm9yIGV4dHBsdWcgKi8KK2VudW0geworCVNORF9QQ01fRVhUUExVR19IV19GT1JNQVQsCS8qKjwgZm9ybWF0ICovCisJU05EX1BDTV9FWFRQTFVHX0hXX0NIQU5ORUxTLAkvKio8IGNoYW5uZWxzICovCisJU05EX1BDTV9FWFRQTFVHX0hXX1BBUkFNUwkvKio8IG1heCBudW1iZXIgb2YgaHcgY29uc3RyYWludHMgKi8KK307CisJCisvKiogSGFuZGxlIG9mIGV4dGVybmFsIGZpbHRlciBwbHVnaW4gKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9wY21fZXh0cGx1ZyBzbmRfcGNtX2V4dHBsdWdfdDsKKy8qKiBDYWxsYmFjayB0YWJsZSBvZiBleHRwbHVnICovCit0eXBlZGVmIHN0cnVjdCBzbmRfcGNtX2V4dHBsdWdfY2FsbGJhY2sgc25kX3BjbV9leHRwbHVnX2NhbGxiYWNrX3Q7CisKKy8qCisgKiBQcm90b2NvbCB2ZXJzaW9uCisgKi8KKyNkZWZpbmUgU05EX1BDTV9FWFRQTFVHX1ZFUlNJT05fTUFKT1IJMQkvKio8IFByb3RvY29sIG1ham9yIHZlcnNpb24gKi8KKyNkZWZpbmUgU05EX1BDTV9FWFRQTFVHX1ZFUlNJT05fTUlOT1IJMAkvKio8IFByb3RvY29sIG1pbm9yIHZlcnNpb24gKi8KKyNkZWZpbmUgU05EX1BDTV9FWFRQTFVHX1ZFUlNJT05fVElOWQkxCS8qKjwgUHJvdG9jb2wgdGlueSB2ZXJzaW9uICovCisvKioKKyAqIEZpbHRlci1wbHVnaW4gcHJvdG9jb2wgdmVyc2lvbgorICovCisjZGVmaW5lIFNORF9QQ01fRVhUUExVR19WRVJTSU9OCQkoKFNORF9QQ01fRVhUUExVR19WRVJTSU9OX01BSk9SPDwxNikgfFwKKwkJCQkJIChTTkRfUENNX0VYVFBMVUdfVkVSU0lPTl9NSU5PUjw8OCkgfFwKKwkJCQkJIChTTkRfUENNX0VYVFBMVUdfVkVSU0lPTl9USU5ZKSkKKworLyoqIEhhbmRsZSBvZiBleHRwbHVnICovCitzdHJ1Y3Qgc25kX3BjbV9leHRwbHVnIHsKKwkvKioKKwkgKiBwcm90b2NvbCB2ZXJzaW9uOyAjU05EX1BDTV9FWFRQTFVHX1ZFUlNJT04gbXVzdCBiZSBmaWxsZWQgaGVyZQorCSAqIGJlZm9yZSBjYWxsaW5nICNzbmRfcGNtX2V4dHBsdWdfY3JlYXRlKCkKKwkgKi8KKwl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKKwkvKioKKwkgKiBuYW1lIG9mIHRoaXMgcGx1Z2luOyBtdXN0IGJlIGZpbGxlZCBiZWZvcmUgY2FsbGluZyAjc25kX3BjbV9leHRwbHVnX2NyZWF0ZSgpCisJICovCisJY29uc3QgY2hhciAqbmFtZTsKKwkvKioKKwkgKiBjYWxsYmFja3Mgb2YgdGhpcyBwbHVnaW47IG11c3QgYmUgZmlsbGVkIGJlZm9yZSBjYWxsaW5nICNzbmRfcGNtX2V4dHBsdWdfY3JlYXRlKCkKKwkgKi8KKwljb25zdCBzbmRfcGNtX2V4dHBsdWdfY2FsbGJhY2tfdCAqY2FsbGJhY2s7CisJLyoqCisJICogcHJpdmF0ZSBkYXRhLCB3aGljaCBjYW4gYmUgdXNlZCBmcmVlbHkgaW4gdGhlIGRyaXZlciBjYWxsYmFja3MKKwkgKi8KKwl2b2lkICpwcml2YXRlX2RhdGE7CisJLyoqCisJICogUENNIGhhbmRsZSBmaWxsZWQgYnkgI3NuZF9wY21fZXh0cGx1Z19jcmVhdGUoKQorCSAqLworCXNuZF9wY21fdCAqcGNtOworCS8qKgorCSAqIHN0cmVhbSBkaXJlY3Rpb247IHJlYWQtb25seSBzdGF0dXMKKwkgKi8KKwlzbmRfcGNtX3N0cmVhbV90IHN0cmVhbTsKKwkvKioKKwkgKiBmb3JtYXQgaHcgcGFyYW1ldGVyOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGVkCisJICovCisJc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQ7CisJLyoqCisJICogc3ViZm9ybWF0IGh3IHBhcmFtZXRlcjsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxlZAorCSAqLworCXNuZF9wY21fc3ViZm9ybWF0X3Qgc3ViZm9ybWF0OworCS8qKgorCSAqIGNoYW5uZWxzIGh3IHBhcmFtZXRlcjsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxlZAorCSAqLworCXVuc2lnbmVkIGludCBjaGFubmVsczsKKwkvKioKKwkgKiByYXRlIGh3IHBhcmFtZXRlcjsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxlZAorCSAqLworCXVuc2lnbmVkIGludCByYXRlOworCS8qKgorCSAqIHNsYXZlX2Zvcm1hdCBodyBwYXJhbWV0ZXI7IGZpbGxlZCBhZnRlciBod19wYXJhbXMgaXMgY2FsZWQKKwkgKi8KKwlzbmRfcGNtX2Zvcm1hdF90IHNsYXZlX2Zvcm1hdDsKKwkvKioKKwkgKiBzbGF2ZV9zdWJmb3JtYXQgaHcgcGFyYW1ldGVyOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGVkCisJICovCisJc25kX3BjbV9zdWJmb3JtYXRfdCBzbGF2ZV9zdWJmb3JtYXQ7CisJLyoqCisJICogc2xhdmVfY2hhbm5lbHMgaHcgcGFyYW1ldGVyOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGVkCisJICovCisJdW5zaWduZWQgaW50IHNsYXZlX2NoYW5uZWxzOworfTsKKworLyoqIENhbGxiYWNrIHRhYmxlIG9mIGV4dHBsdWcgKi8KK3N0cnVjdCBzbmRfcGNtX2V4dHBsdWdfY2FsbGJhY2sgeworCS8qKgorCSAqIHRyYW5zZmVyIGJldHdlZW4gc291cmNlIGFuZCBkZXN0aW5hdGlvbjsgdGhpcyBpcyBhIHJlcXVpcmVkIGNhbGxiYWNrCisJICovCisJc25kX3BjbV9zZnJhbWVzX3QgKCp0cmFuc2Zlcikoc25kX3BjbV9leHRwbHVnX3QgKmV4dCwKKwkJCQkgICAgICBjb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICpkc3RfYXJlYXMsCisJCQkJICAgICAgc25kX3BjbV91ZnJhbWVzX3QgZHN0X29mZnNldCwKKwkJCQkgICAgICBjb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICpzcmNfYXJlYXMsCisJCQkJICAgICAgc25kX3BjbV91ZnJhbWVzX3Qgc3JjX29mZnNldCwKKwkJCQkgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKKwkvKioKKwkgKiBjbG9zZSB0aGUgUENNOyBvcHRpb25hbAorCSAqLworCWludCAoKmNsb3NlKShzbmRfcGNtX2V4dHBsdWdfdCAqZXh0KTsKKwkvKioKKwkgKiBod19wYXJhbXM7IG9wdGlvbmFsCisJICovCisJaW50ICgqaHdfcGFyYW1zKShzbmRfcGNtX2V4dHBsdWdfdCAqZXh0LCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworCS8qKgorCSAqIGh3X2ZyZWU7IG9wdGlvbmFsCisJICovCisJaW50ICgqaHdfZnJlZSkoc25kX3BjbV9leHRwbHVnX3QgKmV4dCk7CisJLyoqCisJICogZHVtcDsgb3B0aW9uYWwKKwkgKi8KKwl2b2lkICgqZHVtcCkoc25kX3BjbV9leHRwbHVnX3QgKmV4dCwgc25kX291dHB1dF90ICpvdXQpOworCS8qKgorCSAqIGluaXQ7IG9wdGlvbmFsIGluaXRpYWxpemF0aW9uIGNhbGxlZCBhdCBwcmVwYXJlIG9yIHJlc2V0CisJICovCisJaW50ICgqaW5pdCkoc25kX3BjbV9leHRwbHVnX3QgKmV4dCk7Cit9OworCisKK2ludCBzbmRfcGNtX2V4dHBsdWdfY3JlYXRlKHNuZF9wY21fZXh0cGx1Z190ICpleHQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqc2xhdmVfY29uZiwKKwkJCSAgIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CitpbnQgc25kX3BjbV9leHRwbHVnX2RlbGV0ZShzbmRfcGNtX2V4dHBsdWdfdCAqZXh0KTsKKworLyogY2xlYXIgaHdfcGFyYW1ldGVyIHNldHRpbmcgKi8KK3ZvaWQgc25kX3BjbV9leHRwbHVnX3BhcmFtc19yZXNldChzbmRfcGNtX2V4dHBsdWdfdCAqZXh0KTsKKworLyogaHdfcGFyYW1ldGVyIHNldHRpbmcgKi8KK2ludCBzbmRfcGNtX2V4dHBsdWdfc2V0X3BhcmFtX2xpc3Qoc25kX3BjbV9leHRwbHVnX3QgKmV4dHBsdWcsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgbnVtX2xpc3QsIGNvbnN0IHVuc2lnbmVkIGludCAqbGlzdCk7CitpbnQgc25kX3BjbV9leHRwbHVnX3NldF9wYXJhbV9taW5tYXgoc25kX3BjbV9leHRwbHVnX3QgKmV4dHBsdWcsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgbWF4KTsKK2ludCBzbmRfcGNtX2V4dHBsdWdfc2V0X3NsYXZlX3BhcmFtX2xpc3Qoc25kX3BjbV9leHRwbHVnX3QgKmV4dHBsdWcsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgbnVtX2xpc3QsIGNvbnN0IHVuc2lnbmVkIGludCAqbGlzdCk7CitpbnQgc25kX3BjbV9leHRwbHVnX3NldF9zbGF2ZV9wYXJhbV9taW5tYXgoc25kX3BjbV9leHRwbHVnX3QgKmV4dHBsdWcsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgbWF4KTsKKworLyoqCisgKiBzZXQgdGhlIHBhcmFtZXRlciBjb25zdHJhaW50IHdpdGggYSBzaW5nbGUgdmFsdWUKKyAqLworc3RhdGljIGlubGluZSBpbnQgc25kX3BjbV9leHRwbHVnX3NldF9wYXJhbShzbmRfcGNtX2V4dHBsdWdfdCAqZXh0cGx1ZywgaW50IHR5cGUsIHVuc2lnbmVkIGludCB2YWwpCit7CisJcmV0dXJuIHNuZF9wY21fZXh0cGx1Z19zZXRfcGFyYW1fbGlzdChleHRwbHVnLCB0eXBlLCAxLCAmdmFsKTsKK30KKworLyoqCisgKiBzZXQgdGhlIHBhcmFtZXRlciBjb25zdHJhaW50IGZvciBzbGF2ZSBQQ00gd2l0aCBhIHNpbmdsZSB2YWx1ZQorICovCitzdGF0aWMgaW5saW5lIGludCBzbmRfcGNtX2V4dHBsdWdfc2V0X3NsYXZlX3BhcmFtKHNuZF9wY21fZXh0cGx1Z190ICpleHRwbHVnLCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlyZXR1cm4gc25kX3BjbV9leHRwbHVnX3NldF9zbGF2ZV9wYXJhbV9saXN0KGV4dHBsdWcsIHR5cGUsIDEsICZ2YWwpOworfQorCisvKiogXH0gKi8KKworI2VuZGlmIC8qIF9fQUxTQV9QQ01fRVhUUExVR19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX2lvcGx1Zy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9pb3BsdWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzMxY2YwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9pb3BsdWcuaApAQCAtMCwwICsxLDIxNyBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL3BjbV9pb3BsdWcuaAorICogXGJyaWVmIEV4dGVybmFsIEkvTy1QbHVnaW4gU0RLCisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDIwMDUKKyAqCisgKiBFeHRlcm5hbCBJL08tUGx1Z2luIFNESworICovCisKKy8qCisgKiBBTFNBIGV4dGVybmFsIFBDTSBwbHVnaW4gU0RLCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfUENNX0lPUExVR19ICisjZGVmaW5lIF9fQUxTQV9QQ01fSU9QTFVHX0gKKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX0lPUGx1ZyBFeHRlcm5hbCBJL08gcGx1Z2luIFNESworICogXGluZ3JvdXAgUGx1Z2luX1NESworICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKKy8qKiBodyBjb25zdHJhaW50cyBmb3IgaW9wbHVnICovCitlbnVtIHsKKwlTTkRfUENNX0lPUExVR19IV19BQ0NFU1MgPSAwLAkvKio8IGFjY2VzcyB0eXBlICovCisJU05EX1BDTV9JT1BMVUdfSFdfRk9STUFULAkvKio8IGZvcm1hdCAqLworCVNORF9QQ01fSU9QTFVHX0hXX0NIQU5ORUxTLAkvKio8IGNoYW5uZWxzICovCisJU05EX1BDTV9JT1BMVUdfSFdfUkFURSwJCS8qKjwgcmF0ZSAqLworCVNORF9QQ01fSU9QTFVHX0hXX1BFUklPRF9CWVRFUywJLyoqPCBwZXJpb2QgYnl0ZXMgKi8KKwlTTkRfUENNX0lPUExVR19IV19CVUZGRVJfQllURVMsCS8qKjwgYnVmZmVyIGJ5dGVzICovCisJU05EX1BDTV9JT1BMVUdfSFdfUEVSSU9EUywJLyoqPCBudW1iZXIgb2YgcGVyaW9kcyAqLworCVNORF9QQ01fSU9QTFVHX0hXX1BBUkFNUwkvKio8IG1heCBudW1iZXIgb2YgaHcgY29uc3RyYWludHMgKi8KK307CisJCisvKiogSS9PIHBsdWdpbiBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9wY21faW9wbHVnIHNuZF9wY21faW9wbHVnX3Q7CisvKiogQ2FsbGJhY2sgdGFibGUgb2YgaW9wbHVnICovCit0eXBlZGVmIHN0cnVjdCBzbmRfcGNtX2lvcGx1Z19jYWxsYmFjayBzbmRfcGNtX2lvcGx1Z19jYWxsYmFja190OworCisvKgorICogYml0IGZsYWdzIGZvciBhZGRpdGlvbmFsIGNvbmRpdGlvbnMKKyAqLworI2RlZmluZSBTTkRfUENNX0lPUExVR19GTEFHX0xJU1RFRAkoMTw8MCkJCS8qKjwgbGlzdCB1cCB0aGlzIFBDTSAqLworI2RlZmluZSBTTkRfUENNX0lPUExVR19GTEFHX01PTk9UT05JQwkoMTw8MSkJCS8qKjwgbW9ub3RvbmljIHRpbWVzdGFtcHMgKi8KKworLyoKKyAqIFByb3RvY29sIHZlcnNpb24KKyAqLworI2RlZmluZSBTTkRfUENNX0lPUExVR19WRVJTSU9OX01BSk9SCTEJLyoqPCBQcm90b2NvbCBtYWpvciB2ZXJzaW9uICovCisjZGVmaW5lIFNORF9QQ01fSU9QTFVHX1ZFUlNJT05fTUlOT1IJMAkvKio8IFByb3RvY29sIG1pbm9yIHZlcnNpb24gKi8KKyNkZWZpbmUgU05EX1BDTV9JT1BMVUdfVkVSU0lPTl9USU5ZCTEJLyoqPCBQcm90b2NvbCB0aW55IHZlcnNpb24gKi8KKy8qKgorICogSU8tcGx1Z2luIHByb3RvY29sIHZlcnNpb24KKyAqLworI2RlZmluZSBTTkRfUENNX0lPUExVR19WRVJTSU9OCQkoKFNORF9QQ01fSU9QTFVHX1ZFUlNJT05fTUFKT1I8PDE2KSB8XAorCQkJCQkgKFNORF9QQ01fSU9QTFVHX1ZFUlNJT05fTUlOT1I8PDgpIHxcCisJCQkJCSAoU05EX1BDTV9JT1BMVUdfVkVSU0lPTl9USU5ZKSkKKworLyoqIEhhbmRsZSBvZiBpb3BsdWcgKi8KK3N0cnVjdCBzbmRfcGNtX2lvcGx1ZyB7CisJLyoqCisJICogcHJvdG9jb2wgdmVyc2lvbjsgI1NORF9QQ01fSU9QTFVHX1ZFUlNJT04gbXVzdCBiZSBmaWxsZWQgaGVyZQorCSAqIGJlZm9yZSBjYWxsaW5nICNzbmRfcGNtX2lvcGx1Z19jcmVhdGUoKQorCSAqLworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCS8qKgorCSAqIG5hbWUgb2YgdGhpcyBwbHVnaW47IG11c3QgYmUgZmlsbGVkIGJlZm9yZSBjYWxsaW5nICNzbmRfcGNtX2lvcGx1Z19jcmVhdGUoKQorCSAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJdW5zaWduZWQgaW50IGZsYWdzOwkvKio8IFNORF9QQ01fSU9QTFVHX0ZMQUdfWFhYICovCisJaW50IHBvbGxfZmQ7CQkvKio8IHBvbGwgZmlsZSBkZXNjcmlwdG9yICovCisJdW5zaWduZWQgaW50IHBvbGxfZXZlbnRzOwkvKio8IHBvbGwgZXZlbnRzICovCisJdW5zaWduZWQgaW50IG1tYXBfcnc7CQkvKio8IHBzZXVkbyBtbWFwIG1vZGUgKi8KKwkvKioKKwkgKiBjYWxsYmFja3Mgb2YgdGhpcyBwbHVnaW47IG11c3QgYmUgZmlsbGVkIGJlZm9yZSBjYWxsaW5nICNzbmRfcGNtX2lvcGx1Z19jcmVhdGUoKQorCSAqLworCWNvbnN0IHNuZF9wY21faW9wbHVnX2NhbGxiYWNrX3QgKmNhbGxiYWNrOworCS8qKgorCSAqIHByaXZhdGUgZGF0YSwgd2hpY2ggY2FuIGJlIHVzZWQgZnJlZWx5IGluIHRoZSBkcml2ZXIgY2FsbGJhY2tzCisJICovCisJdm9pZCAqcHJpdmF0ZV9kYXRhOworCS8qKgorCSAqIFBDTSBoYW5kbGUgZmlsbGVkIGJ5ICNzbmRfcGNtX2V4dHBsdWdfY3JlYXRlKCkKKwkgKi8KKwlzbmRfcGNtX3QgKnBjbTsKKworCXNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtOwkvKio8IHN0cmVhbSBkaXJlY2lvbjsgcmVhZC1vbmx5ICovCQorCXNuZF9wY21fc3RhdGVfdCBzdGF0ZTsJCS8qKjwgY3VycmVudCBQQ00gc3RhdGU7IHJlYWQtb25seSAqLworCXZvbGF0aWxlIHNuZF9wY21fdWZyYW1lc190IGFwcGxfcHRyOwkvKio8IGFwcGxpY2F0aW9uIHBvaW50ZXI7IHJlYWQtb25seSAqLworCXZvbGF0aWxlIHNuZF9wY21fdWZyYW1lc190IGh3X3B0cjsJLyoqPCBodyBwb2ludGVyOyByZWFkLW9ubHkgKi8KKwlpbnQgbm9uYmxvY2s7CQkJLyoqPCBub24tYmxvY2sgbW9kZTsgcmVhZC1vbmx5ICovCisKKwlzbmRfcGNtX2FjY2Vzc190IGFjY2VzczsJLyoqPCBhY2Nlc3MgdHlwZTsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxsZWQgKi8KKwlzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdDsJLyoqPCBQQ00gZm9ybWF0OyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGxlZCAqLworCXVuc2lnbmVkIGludCBjaGFubmVsczsJCS8qKjwgbnVtYmVyIG9mIGNoYW5uZWxzOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGxlZCAqLworCXVuc2lnbmVkIGludCByYXRlOwkJLyoqPCByYXRlOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGxlZCAqLworCXNuZF9wY21fdWZyYW1lc190IHBlcmlvZF9zaXplOwkvKio8IHBlcmlvZCBzaXplOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGxlZCAqLworCXNuZF9wY21fdWZyYW1lc190IGJ1ZmZlcl9zaXplOwkvKio8IGJ1ZmZlciBzaXplOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGxlZCAqLworfTsKKworLyoqIENhbGxiYWNrIHRhYmxlIG9mIGlvcGx1ZyAqLworc3RydWN0IHNuZF9wY21faW9wbHVnX2NhbGxiYWNrIHsKKwkvKioKKwkgKiBzdGFydCB0aGUgUENNOyByZXF1aXJlZAorCSAqLworCWludCAoKnN0YXJ0KShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogc3RvcCB0aGUgUENNOyByZXF1aXJlZAorCSAqLworCWludCAoKnN0b3ApKHNuZF9wY21faW9wbHVnX3QgKmlvKTsKKwkvKioKKwkgKiBnZXQgdGhlIGN1cnJlbnQgRE1BIHBvc2l0aW9uOyByZXF1aXJlZAorCSAqLworCXNuZF9wY21fc2ZyYW1lc190ICgqcG9pbnRlcikoc25kX3BjbV9pb3BsdWdfdCAqaW8pOworCS8qKgorCSAqIHRyYW5zZmVyIHRoZSBkYXRhOyBvcHRpb25hbAorCSAqLworCXNuZF9wY21fc2ZyYW1lc190ICgqdHJhbnNmZXIpKHNuZF9wY21faW9wbHVnX3QgKmlvLAorCQkJCSAgICAgIGNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKmFyZWFzLAorCQkJCSAgICAgIHNuZF9wY21fdWZyYW1lc190IG9mZnNldCwKKwkJCQkgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKKwkvKioKKwkgKiBjbG9zZSB0aGUgUENNOyBvcHRpb25hbAorCSAqLworCWludCAoKmNsb3NlKShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogaHdfcGFyYW1zOyBvcHRpb25hbAorCSAqLworCWludCAoKmh3X3BhcmFtcykoc25kX3BjbV9pb3BsdWdfdCAqaW8sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CisJLyoqCisJICogaHdfZnJlZTsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpod19mcmVlKShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogc3dfcGFyYW1zOyBvcHRpb25hbAorCSAqLworCWludCAoKnN3X3BhcmFtcykoc25kX3BjbV9pb3BsdWdfdCAqaW8sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CisJLyoqCisJICogcHJlcGFyZTsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpwcmVwYXJlKShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogZHJhaW47IG9wdGlvbmFsCisJICovCisJaW50ICgqZHJhaW4pKHNuZF9wY21faW9wbHVnX3QgKmlvKTsKKwkvKioKKwkgKiB0b2dnbGUgcGF1c2U7IG9wdGlvbmFsCisJICovCisJaW50ICgqcGF1c2UpKHNuZF9wY21faW9wbHVnX3QgKmlvLCBpbnQgZW5hYmxlKTsKKwkvKioKKwkgKiByZXN1bWU7IG9wdGlvbmFsCisJICovCisJaW50ICgqcmVzdW1lKShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogcG9sbCBkZXNjcmlwdG9ycyBjb3VudDsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpwb2xsX2Rlc2NyaXB0b3JzX2NvdW50KShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogcG9sbCBkZXNjcmlwdG9yczsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpwb2xsX2Rlc2NyaXB0b3JzKShzbmRfcGNtX2lvcGx1Z190ICppbywgc3RydWN0IHBvbGxmZCAqcGZkLCB1bnNpZ25lZCBpbnQgc3BhY2UpOworCS8qKgorCSAqIG1hbmdsZSBwb2xsIGV2ZW50czsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpwb2xsX3JldmVudHMpKHNuZF9wY21faW9wbHVnX3QgKmlvLCBzdHJ1Y3QgcG9sbGZkICpwZmQsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqcmV2ZW50cyk7CisJLyoqCisJICogZHVtcDsgb3B0aW9uYWwKKwkgKi8KKwl2b2lkICgqZHVtcCkoc25kX3BjbV9pb3BsdWdfdCAqaW8sIHNuZF9vdXRwdXRfdCAqb3V0KTsKKwkvKioKKwkgKiBnZXQgdGhlIGRlbGF5IGZvciB0aGUgcnVubmluZyBQQ007IG9wdGlvbmFsCisJICovCisJaW50ICgqZGVsYXkpKHNuZF9wY21faW9wbHVnX3QgKmlvLCBzbmRfcGNtX3NmcmFtZXNfdCAqZGVsYXlwKTsKK307CisKKworaW50IHNuZF9wY21faW9wbHVnX2NyZWF0ZShzbmRfcGNtX2lvcGx1Z190ICppbywgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKK2ludCBzbmRfcGNtX2lvcGx1Z19kZWxldGUoc25kX3BjbV9pb3BsdWdfdCAqaW8pOworCisvKiB1cGRhdGUgcG9sbF9mZCBhbmQgbW1hcF9ydyAqLworaW50IHNuZF9wY21faW9wbHVnX3JlaW5pdF9zdGF0dXMoc25kX3BjbV9pb3BsdWdfdCAqaW9wbHVnKTsKKworLyogZ2V0IGEgbW1hcCBhcmVhIChmb3IgbW1hcF9ydyBvbmx5KSAqLworY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqc25kX3BjbV9pb3BsdWdfbW1hcF9hcmVhcyhzbmRfcGNtX2lvcGx1Z190ICppb3BsdWcpOworCisvKiBjbGVhciBod19wYXJhbWV0ZXIgc2V0dGluZyAqLwordm9pZCBzbmRfcGNtX2lvcGx1Z19wYXJhbXNfcmVzZXQoc25kX3BjbV9pb3BsdWdfdCAqaW8pOworCisvKiBod19wYXJhbWV0ZXIgc2V0dGluZyAqLworaW50IHNuZF9wY21faW9wbHVnX3NldF9wYXJhbV9taW5tYXgoc25kX3BjbV9pb3BsdWdfdCAqaW8sIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgbWF4KTsKK2ludCBzbmRfcGNtX2lvcGx1Z19zZXRfcGFyYW1fbGlzdChzbmRfcGNtX2lvcGx1Z190ICppbywgaW50IHR5cGUsIHVuc2lnbmVkIGludCBudW1fbGlzdCwgY29uc3QgdW5zaWduZWQgaW50ICpsaXN0KTsKKworLyogY2hhbmdlIFBDTSBzdGF0dXMgKi8KK2ludCBzbmRfcGNtX2lvcGx1Z19zZXRfc3RhdGUoc25kX3BjbV9pb3BsdWdfdCAqaW9wbHVnLCBzbmRfcGNtX3N0YXRlX3Qgc3RhdGUpOworCisvKiogXH0gKi8KKworI2VuZGlmIC8qIF9fQUxTQV9QQ01fSU9QTFVHX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fb2xkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX29sZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZGU0YzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX29sZC5oCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogT2xkIEFMU0EgMC45LnggQVBJCisgKi8KKworI2lmZGVmIEFMU0FfUENNX09MRF9IV19QQVJBTVNfQVBJCisKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYWNjZXNzLHNuZF9wY21faHdfcGFyYW1zX2dldF9hY2Nlc3NAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzX2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3NfZmlyc3RAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzX2xhc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzc19sYXN0QEFMU0FfMC45Iik7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYWNjZXNzKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9hY2Nlc3Moc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9hY2Nlc3NfdCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3Moc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9hY2Nlc3NfdCB2YWwpOworc25kX3BjbV9hY2Nlc3NfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworc25kX3BjbV9hY2Nlc3NfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzc19tYXNrKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX21hc2tfdCAqbWFzayk7Cit2b2lkIHNuZF9wY21faHdfcGFyYW1zX2dldF9hY2Nlc3NfbWFzayhzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX21hc2tfdCAqbWFzayk7CisKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfZm9ybWF0LHNuZF9wY21faHdfcGFyYW1zX2dldF9mb3JtYXRAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0X2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXRfZmlyc3RAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0X2xhc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdF9sYXN0QEFMU0FfMC45Iik7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfZm9ybWF0KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9mb3JtYXQoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9mb3JtYXRfdCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXQoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9mb3JtYXRfdCB2YWwpOworc25kX3BjbV9mb3JtYXRfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0X2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworc25kX3BjbV9mb3JtYXRfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0X2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdF9tYXNrKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X21hc2tfdCAqbWFzayk7Cit2b2lkIHNuZF9wY21faHdfcGFyYW1zX2dldF9mb3JtYXRfbWFzayhzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X21hc2tfdCAqbWFzayk7CisKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfc3ViZm9ybWF0LHNuZF9wY21faHdfcGFyYW1zX2dldF9zdWJmb3JtYXRAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfc3ViZm9ybWF0X2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9zdWJmb3JtYXRfZmlyc3RAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfc3ViZm9ybWF0X2xhc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdF9sYXN0QEFMU0FfMC45Iik7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3N1YmZvcm1hdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3N1YmZvcm1hdF90IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3N1YmZvcm1hdChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9zdWJmb3JtYXQoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9zdWJmb3JtYXRfdCB2YWwpOworc25kX3BjbV9zdWJmb3JtYXRfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfc3ViZm9ybWF0X2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworc25kX3BjbV9zdWJmb3JtYXRfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfc3ViZm9ybWF0X2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdF9tYXNrKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqbWFzayk7Cit2b2lkIHNuZF9wY21faHdfcGFyYW1zX2dldF9zdWJmb3JtYXRfbWFzayhzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqbWFzayk7CisKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHMsc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzX21pbixzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHNfbWluQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzX21heCxzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHNfbWF4QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX25lYXIsc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX25lYXJAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfZmlyc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX2ZpcnN0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX2xhc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX2xhc3RAQUxTQV8wLjkiKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVscyhjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVsc19taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHNfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9jaGFubmVscyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHMoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgdW5zaWduZWQgaW50ICptYXgpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKKworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlLHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X3JhdGVfbWluLHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlX21pbkBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlX21heCxzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZV9tYXhAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9uZWFyLHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX25lYXJAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9maXJzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9maXJzdEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX2xhc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbGFzdEBBTFNBXzAuOSIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3JhdGUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3JhdGVfbWluKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3JhdGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbWlubWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqbWluLCBpbnQgKm1pbmRpciwgdW5zaWduZWQgaW50ICptYXgsIGludCAqbWF4ZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfcmVzYW1wbGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3JhdGVfcmVzYW1wbGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF90aW1lLHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZUBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZV9taW4sc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF90aW1lX21pbkBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZV9tYXgsc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF90aW1lX21heEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9uZWFyLHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9uZWFyQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9maXJzdEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9sYXN0QEFMU0FfMC45Iik7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3RpbWUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF90aW1lX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3RpbWVfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfcGVyaW9kX3RpbWUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplLHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZUBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZV9taW4sc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplX21pbkBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZV9tYXgsc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplX21heEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9uZWFyLHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9uZWFyQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9maXJzdEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9sYXN0QEFMU0FfMC45Iik7CisKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZV9taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemVfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfcGVyaW9kX3NpemUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbWlubWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICptaW4sIGludCAqbWluZGlyLCBzbmRfcGNtX3VmcmFtZXNfdCAqbWF4LCBpbnQgKm1heGRpcik7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwsIGludCAqZGlyKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX2ludGVnZXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CisKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kcyxzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kc0BBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RzX21pbixzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kc19taW5AQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kc19tYXgsc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHNfbWF4QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbmVhcixzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19uZWFyQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfZmlyc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfZmlyc3RAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX2xhc3RAQUxTQV8wLjkiKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RzKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RzX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kc19tYXgoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9wZXJpb2RzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX2ludGVnZXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CisKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3RpbWUsc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lX21pbixzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3RpbWVfbWluQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lX21heCxzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3RpbWVfbWF4QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX25lYXIsc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX25lYXJAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfZmlyc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX2ZpcnN0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX2xhc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX2xhc3RAQUxTQV8wLjkiKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfdGltZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3RpbWVfbWluKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfdGltZV9tYXgoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9idWZmZXJfdGltZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbWlubWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqbWluLCBpbnQgKm1pbmRpciwgdW5zaWduZWQgaW50ICptYXgsIGludCAqbWF4ZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7CisKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemUsc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21pbixzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemVfbWluQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21heCxzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemVfbWF4QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIsc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXJAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfZmlyc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX2ZpcnN0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX2xhc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX2xhc3RAQUxTQV8wLjkiKTsKKworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemVfbWluKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemVfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9idWZmZXJfc2l6ZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfbWlubWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICptaW4sIHNuZF9wY21fdWZyYW1lc190ICptYXgpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZSxzbmRfcGNtX2h3X3BhcmFtc19nZXRfdGlja190aW1lQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZV9taW4sc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZV9taW5AQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfdGlja190aW1lX21heCxzbmRfcGNtX2h3X3BhcmFtc19nZXRfdGlja190aW1lX21heEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWVfbmVhcixzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX25lYXJAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWVfZmlyc3RAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX2xhc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9sYXN0QEFMU0FfMC45Iik7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfdGlja190aW1lKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF90aWNrX3RpbWVfbWluKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF90aWNrX3RpbWVfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfdGlja190aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWVfbWlubWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqbWluLCBpbnQgKm1pbmRpciwgdW5zaWduZWQgaW50ICptYXgsIGludCAqbWF4ZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWVfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7CisKKyNlbmRpZiAvKiBBTFNBX1BDTV9PTERfSFdfUEFSQU1TX0FQSSAqLworCisKKyNpZmRlZiBBTFNBX1BDTV9PTERfU1dfUEFSQU1TX0FQSQorCithc20oIi5zeW12ZXIgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3RzdGFtcF9tb2RlLHNuZF9wY21fc3dfcGFyYW1zX2dldF90c3RhbXBfbW9kZUBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21fc3dfcGFyYW1zX2dldF9zbGVlcF9taW4sc25kX3BjbV9zd19wYXJhbXNfZ2V0X3NsZWVwX21pbkBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21fc3dfcGFyYW1zX2dldF9hdmFpbF9taW4sc25kX3BjbV9zd19wYXJhbXNfZ2V0X2F2YWlsX21pbkBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21fc3dfcGFyYW1zX2dldF94ZmVyX2FsaWduLHNuZF9wY21fc3dfcGFyYW1zX2dldF94ZmVyX2FsaWduQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3N0YXJ0X3RocmVzaG9sZCxzbmRfcGNtX3N3X3BhcmFtc19nZXRfc3RhcnRfdGhyZXNob2xkQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3N0b3BfdGhyZXNob2xkLHNuZF9wY21fc3dfcGFyYW1zX3NldF9zdG9wX3RocmVzaG9sZEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21fc3dfcGFyYW1zX2dldF9zaWxlbmNlX3RocmVzaG9sZCxzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2lsZW5jZV90aHJlc2hvbGRAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2lsZW5jZV9zaXplLHNuZF9wY21fc3dfcGFyYW1zX2dldF9zaWxlbmNlX3NpemVAQUxTQV8wLjkiKTsKKworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF90c3RhbXBfbW9kZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3RzdGFtcF90IHZhbCk7CitzbmRfcGNtX3RzdGFtcF90IHNuZF9wY21fc3dfcGFyYW1zX2dldF90c3RhbXBfbW9kZShjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9zbGVlcF9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3NsZWVwX21pbihjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9hdmFpbF9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21fc3dfcGFyYW1zX2dldF9hdmFpbF9taW4oY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfeGZlcl9hbGlnbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3hmZXJfYWxpZ24oY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc3RhcnRfdGhyZXNob2xkKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc3RhcnRfdGhyZXNob2xkKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3N0b3BfdGhyZXNob2xkKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc3RvcF90aHJlc2hvbGQoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc2lsZW5jZV90aHJlc2hvbGQoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21fc3dfcGFyYW1zX2dldF9zaWxlbmNlX3RocmVzaG9sZChjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9zaWxlbmNlX3NpemUoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21fc3dfcGFyYW1zX2dldF9zaWxlbmNlX3NpemUoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKKworI2VuZGlmIC8qIEFMU0FfUENNX09MRF9TV19QQVJBTVNfQVBJICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX3BsdWdpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9wbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWExZDgyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9wbHVnaW4uaApAQCAtMCwwICsxLDIwMiBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL3BjbV9wbHVnaW4uaAorICogXGJyaWVmIENvbW1vbiBQQ00gcGx1Z2luIGNvZGUKKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGRhdGUgMjAwMC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlci4KKyAqIFNlZSB0aGUgXHJlZiBwY21fcGx1Z2lucyBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogXHdhcm5pbmcgVXNpbmcgb2YgY29udGVudHMgb2YgdGhpcyBoZWFkZXIgZmlsZSBtaWdodCBiZSBkYW5nZXJvdXMKKyAqCSAgICBpbiB0aGUgc2Vuc2Ugb2YgY29tcGF0aWJpbGl0eSByZWFzb25zLiBUaGUgY29udGVudHMgbWlnaHQgYmUKKyAqCSAgICBmcmVlbHkgY2hhbmdlZCBpbiBmdXR1cmUuCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfUENNX1BMVUdJTl9ICisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9QbHVnaW5zIFBDTSBQbHVnaW5zCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY21fcGx1Z2lucyBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisgIAorI2RlZmluZSBTTkRfUENNX1BMVUdJTl9SQVRFX01JTiA0MDAwCS8qKjwgbWluaW1hbCByYXRlIGZvciB0aGUgcmF0ZSBwbHVnaW4gKi8KKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fUkFURV9NQVggMTkyMDAwCS8qKjwgbWF4aW1hbCByYXRlIGZvciB0aGUgcmF0ZSBwbHVnaW4gKi8KKworLyogUk9VVEVfRkxPQVQgc2hvdWxkIGJlIHNldCB0byAwIGZvciBtYWNoaW5lcyB3aXRob3V0IEZQIHVuaXQgLSBsaWtlIGlQQVEgKi8KKyNpZmRlZiBIQVZFX1NPRlRfRkxPQVQKKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fUk9VVEVfRkxPQVQgMAkgICAvKio8IHVzZSBpbnRlZ2VycyBmb3Igcm91dGUgcGx1Z2luICovCisjZWxzZQorI2RlZmluZSBTTkRfUENNX1BMVUdJTl9ST1VURV9GTE9BVCAxCSAgIC8qKjwgdXNlIGZsb2F0cyBmb3Igcm91dGUgcGx1Z2luICovCisjZW5kaWYKKworI2RlZmluZSBTTkRfUENNX1BMVUdJTl9ST1VURV9SRVNPTFVUSU9OIDE2IC8qKjwgaW50ZWdlciByZXNvbHV0aW9uIGZvciByb3V0ZSBwbHVnaW4gKi8KKworI2lmIFNORF9QQ01fUExVR0lOX1JPVVRFX0ZMT0FUCisvKiogcm91dGUgdHRhYmxlIGVudHJ5IHR5cGUgKi8KK3R5cGVkZWYgZmxvYXQgc25kX3BjbV9yb3V0ZV90dGFibGVfZW50cnlfdDsKKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fUk9VVEVfSEFMRiAwLjUJLyoqPCBoYWxmIHZhbHVlICovCisjZGVmaW5lIFNORF9QQ01fUExVR0lOX1JPVVRFX0ZVTEwgMS4wCS8qKjwgZnVsbCB2YWx1ZSAqLworI2Vsc2UKKy8qKiByb3V0ZSB0dGFibGUgZW50cnkgdHlwZSAqLwordHlwZWRlZiBpbnQgc25kX3BjbV9yb3V0ZV90dGFibGVfZW50cnlfdDsKKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fUk9VVEVfSEFMRiAoU05EX1BDTV9QTFVHSU5fUk9VVEVfUkVTT0xVVElPTiAvIDIpCS8qKjwgaGFsZiB2YWx1ZSAqLworI2RlZmluZSBTTkRfUENNX1BMVUdJTl9ST1VURV9GVUxMIFNORF9QQ01fUExVR0lOX1JPVVRFX1JFU09MVVRJT04JLyoqPCBmdWxsIHZhbHVlICovCisjZW5kaWYKKworLyoKKyAqICBIYXJkd2FyZSBwbHVnaW4KKyAqLworaW50IHNuZF9wY21faHdfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgaW50IGNhcmQsIGludCBkZXZpY2UsIGludCBzdWJkZXZpY2UsCisJCSAgICBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUsCisJCSAgICBpbnQgbW1hcF9lbXVsYXRpb24sIGludCBzeW5jX3B0cl9pb2N0bCk7CitpbnQgX3NuZF9wY21faHdfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgIHNuZF9jb25maWdfdCAqcm9vdCBBVFRSSUJVVEVfVU5VU0VELCBzbmRfY29uZmlnX3QgKmNvbmYsCisJCSAgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKKworLyoKKyAqICBDb3B5IHBsdWdpbgorICovCitpbnQgc25kX3BjbV9jb3B5X29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgc25kX3BjbV90ICpzbGF2ZSwgaW50IGNsb3NlX3NsYXZlKTsKK2ludCBfc25kX3BjbV9jb3B5X29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHNuZF9jb25maWdfdCAqcm9vdCwgc25kX2NvbmZpZ190ICpjb25mLAorICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLyoKKyAqICBMaW5lYXIgY29udmVyc2lvbiBwbHVnaW4KKyAqLworaW50IHNuZF9wY21fbGluZWFyX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCXNuZF9wY21fZm9ybWF0X3Qgc2Zvcm1hdCwgc25kX3BjbV90ICpzbGF2ZSwKKwkJCWludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21fbGluZWFyX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKwkJCSBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworCisvKgorICogIExpbmVhcjwtPkZsb2F0IGNvbnZlcnNpb24gcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX2xmbG9hdF9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzbmRfcGNtX2Zvcm1hdF90IHNmb3JtYXQsIHNuZF9wY21fdCAqc2xhdmUsCisJCQlpbnQgY2xvc2Vfc2xhdmUpOworaW50IF9zbmRfcGNtX2xmbG9hdF9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgc25kX2NvbmZpZ190ICpyb290LCBzbmRfY29uZmlnX3QgKmNvbmYsCisJCQkgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKKworLyoKKyAqICBMaW5lYXI8LT5tdS1MYXcgY29udmVyc2lvbiBwbHVnaW4KKyAqLworaW50IHNuZF9wY21fbXVsYXdfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgc25kX3BjbV9mb3JtYXRfdCBzZm9ybWF0LCBzbmRfcGNtX3QgKnNsYXZlLAorCQkgICAgICAgaW50IGNsb3NlX3NsYXZlKTsKK2ludCBfc25kX3BjbV9tdWxhd19vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgTGluZWFyPC0+YS1MYXcgY29udmVyc2lvbiBwbHVnaW4KKyAqLworaW50IHNuZF9wY21fYWxhd19vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgIHNuZF9wY21fZm9ybWF0X3Qgc2Zvcm1hdCwgc25kX3BjbV90ICpzbGF2ZSwKKwkJICAgICAgaW50IGNsb3NlX3NsYXZlKTsKK2ludCBfc25kX3BjbV9hbGF3X29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHNuZF9jb25maWdfdCAqcm9vdCwgc25kX2NvbmZpZ190ICpjb25mLAorCQkgICAgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKKworLyoKKyAqICBMaW5lYXI8LT5JbWEtQURQQ00gY29udmVyc2lvbiBwbHVnaW4KKyAqLworaW50IHNuZF9wY21fYWRwY21fb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgc25kX3BjbV9mb3JtYXRfdCBzZm9ybWF0LCBzbmRfcGNtX3QgKnNsYXZlLAorCQkgICAgICAgaW50IGNsb3NlX3NsYXZlKTsKK2ludCBfc25kX3BjbV9hZHBjbV9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKwkJCXNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgUm91dGUgcGx1Z2luIGZvciBsaW5lYXIgZm9ybWF0cworICovCitpbnQgc25kX3BjbV9yb3V0ZV9sb2FkX3R0YWJsZShzbmRfY29uZmlnX3QgKnR0LCBzbmRfcGNtX3JvdXRlX3R0YWJsZV9lbnRyeV90ICp0dGFibGUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgdHRfY3NpemUsIHVuc2lnbmVkIGludCB0dF9zc2l6ZSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqdHRfY3VzZWQsIHVuc2lnbmVkIGludCAqdHRfc3VzZWQsCisJCQkgICAgICBpbnQgc2NoYW5uZWxzKTsKK2ludCBzbmRfcGNtX3JvdXRlX2RldGVybWluZV90dGFibGUoc25kX2NvbmZpZ190ICp0dCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKnR0X2NzaXplLAorCQkJCSAgIHVuc2lnbmVkIGludCAqdHRfc3NpemUpOworaW50IHNuZF9wY21fcm91dGVfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgc25kX3BjbV9mb3JtYXRfdCBzZm9ybWF0LCBpbnQgc2NoYW5uZWxzLAorCQkgICAgICAgc25kX3BjbV9yb3V0ZV90dGFibGVfZW50cnlfdCAqdHRhYmxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IHR0X3NzaXplLAorCQkgICAgICAgdW5zaWduZWQgaW50IHR0X2N1c2VkLCB1bnNpZ25lZCBpbnQgdHRfc3VzZWQsCisJCSAgICAgICBzbmRfcGNtX3QgKnNsYXZlLCBpbnQgY2xvc2Vfc2xhdmUpOworaW50IF9zbmRfcGNtX3JvdXRlX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCXNuZF9jb25maWdfdCAqcm9vdCwgc25kX2NvbmZpZ190ICpjb25mLAorCQkJc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKKworLyoKKyAqICBSYXRlIHBsdWdpbiBmb3IgbGluZWFyIGZvcm1hdHMKKyAqLworaW50IHNuZF9wY21fcmF0ZV9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgIHNuZF9wY21fZm9ybWF0X3Qgc2Zvcm1hdCwgdW5zaWduZWQgaW50IHNyYXRlLAorCQkgICAgICBjb25zdCBzbmRfY29uZmlnX3QgKmNvbnZlcnRlciwKKwkJICAgICAgc25kX3BjbV90ICpzbGF2ZSwgaW50IGNsb3NlX3NsYXZlKTsKK2ludCBfc25kX3BjbV9yYXRlX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHNuZF9jb25maWdfdCAqcm9vdCwgc25kX2NvbmZpZ190ICpjb25mLAorCQkgICAgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKKworLyoKKyAqICBIb29rcyBwbHVnaW4KKyAqLworaW50IHNuZF9wY21faG9va3Nfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgc25kX3BjbV90ICpzbGF2ZSwgaW50IGNsb3NlX3NsYXZlKTsKK2ludCBfc25kX3BjbV9ob29rc19vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKwkJCXNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgTEFEU1BBIHBsdWdpbgorICovCitpbnQgc25kX3BjbV9sYWRzcGFfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJY29uc3QgY2hhciAqbGFkc3BhX3BhdGgsCisJCQl1bnNpZ25lZCBpbnQgY2hhbm5lbHMsCisJCQlzbmRfY29uZmlnX3QgKmxhZHNwYV9wcGx1Z2lucywKKwkJCXNuZF9jb25maWdfdCAqbGFkc3BhX2NwbHVnaW5zLAorCQkJc25kX3BjbV90ICpzbGF2ZSwgaW50IGNsb3NlX3NsYXZlKTsKK2ludCBfc25kX3BjbV9sYWRzcGFfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJIHNuZF9jb25maWdfdCAqcm9vdCwgc25kX2NvbmZpZ190ICpjb25mLAorCQkJIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgSmFjayBwbHVnaW4KKyAqLworaW50IHNuZF9wY21famFja19vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCXNuZF9jb25maWdfdCAqcGxheWJhY2tfY29uZiwKKwkJCQkJc25kX2NvbmZpZ190ICpjYXB0dXJlX2NvbmYsCisJCSAgICAgIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CitpbnQgX3NuZF9wY21famFja19vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHNuZF9jb25maWdfdCAqcm9vdCwgc25kX2NvbmZpZ190ICpjb25mLAorICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworCisKKy8qKiBcfSAqLworCisjZW5kaWYgLyogX19BTFNBX1BDTV9QTFVHSU5fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9yYXRlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX3JhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDcwZGYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9yYXRlLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9wY21fcmF0ZS5oCisgKiBcYnJpZWYgRXh0ZXJuYWwgUmF0ZS1Db252ZXJ0ZXItUGx1Z2luIFNESworICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAyMDA2CisgKgorICogRXh0ZXJuYWwgUmF0ZS1Db252ZXJ0ZXItUGx1Z2luIFNESworICovCisKKy8qCisgKiBBTFNBIGV4dGVybmFsIFBDTSByYXRlLWNvbnZlcnRlciBwbHVnaW4gU0RLIChkcmFmdCB2ZXJzaW9uKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX1BDTV9SQVRFX0gKKyNkZWZpbmUgX19BTFNBX1BDTV9SQVRFX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFByb3RvY29sIHZlcnNpb24KKyAqLworI2RlZmluZSBTTkRfUENNX1JBVEVfUExVR0lOX1ZFUlNJT04JMHgwMTAwMDIKKworLyoqIGh3X3BhcmFtcyBpbmZvcm1hdGlvbiBmb3IgYSBzaW5nbGUgc2lkZSAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9yYXRlX3NpZGVfaW5mbyB7CisJc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQ7CisJdW5zaWduZWQgaW50IHJhdGU7CisJc25kX3BjbV91ZnJhbWVzX3QgYnVmZmVyX3NpemU7CisJc25kX3BjbV91ZnJhbWVzX3QgcGVyaW9kX3NpemU7Cit9IHNuZF9wY21fcmF0ZV9zaWRlX2luZm9fdDsKKworLyoqIGh3X3BhcmFtcyBpbmZvcm1hdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9yYXRlX2luZm8geworCXN0cnVjdCBzbmRfcGNtX3JhdGVfc2lkZV9pbmZvIGluOworCXN0cnVjdCBzbmRfcGNtX3JhdGVfc2lkZV9pbmZvIG91dDsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbHM7Cit9IHNuZF9wY21fcmF0ZV9pbmZvX3Q7CisKKy8qKiBDYWxsYmFjayB0YWJsZSBvZiByYXRlLWNvbnZlcnRlciAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9yYXRlX29wcyB7CisJLyoqCisJICogY2xvc2UgdGhlIGNvbnZlcnRlcjsgb3B0aW9uYWwKKwkgKi8KKwl2b2lkICgqY2xvc2UpKHZvaWQgKm9iaik7CisJLyoqCisJICogaW5pdGlhbGl6ZSB0aGUgY29udmVydGVyLCBjYWxsZWQgYXQgaHdfcGFyYW1zCisJICovCisJaW50ICgqaW5pdCkodm9pZCAqb2JqLCBzbmRfcGNtX3JhdGVfaW5mb190ICppbmZvKTsKKwkvKioKKwkgKiBmcmVlIHRoZSBjb252ZXJ0ZXI7IG9wdGlvbmFsCisJICovCisJdm9pZCAoKmZyZWUpKHZvaWQgKm9iaik7CisJLyoqCisJICogcmVzZXQgdGhlIGNvbnZlcnRlciwgY2FsbGVkIGF0IHByZXBhcmU7IG9wdGlvbmFsCisJICovCisJdm9pZCAoKnJlc2V0KSh2b2lkICpvYmopOworCS8qKgorCSAqIGFkanVzdCB0aGUgcGl0Y2gsIGNhbGxlZCBhdCBzd19wYXJhbXM7IG9wdGlvbmFsCisJICovCisJaW50ICgqYWRqdXN0X3BpdGNoKSh2b2lkICpvYmosIHNuZF9wY21fcmF0ZV9pbmZvX3QgKmluZm8pOworCS8qKgorCSAqIGNvbnZlcnQgdGhlIGRhdGEKKwkgKi8KKwl2b2lkICgqY29udmVydCkodm9pZCAqb2JqLAorCQkJY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqZHN0X2FyZWFzLAorCQkJc25kX3BjbV91ZnJhbWVzX3QgZHN0X29mZnNldCwgdW5zaWduZWQgaW50IGRzdF9mcmFtZXMsCisJCQljb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICpzcmNfYXJlYXMsCisJCQlzbmRfcGNtX3VmcmFtZXNfdCBzcmNfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc3JjX2ZyYW1lcyk7CisJLyoqCisJICogY29udmVydCBhbiBzMTYgaW50ZXJsZWF2ZWQtZGF0YSBhcnJheTsgZXhjbHVzaXZlIHdpdGggY29udmVydAorCSAqLworCXZvaWQgKCpjb252ZXJ0X3MxNikodm9pZCAqb2JqLCBpbnQxNl90ICpkc3QsIHVuc2lnbmVkIGludCBkc3RfZnJhbWVzLAorCQkJICAgIGNvbnN0IGludDE2X3QgKnNyYywgdW5zaWduZWQgaW50IHNyY19mcmFtZXMpOworCS8qKgorCSAqIGNvbXB1dGUgdGhlIGZyYW1lIHNpemUgZm9yIGlucHV0CisJICovCisJc25kX3BjbV91ZnJhbWVzX3QgKCppbnB1dF9mcmFtZXMpKHZvaWQgKm9iaiwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKTsKKwkvKioKKwkgKiBjb21wdXRlIHRoZSBmcmFtZSBzaXplIGZvciBvdXRwdXQKKwkgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCAoKm91dHB1dF9mcmFtZXMpKHZvaWQgKm9iaiwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKTsKKwkvKioKKwkgKiB0aGUgcHJvdG9jb2wgdmVyc2lvbiB0aGUgcGx1Z2luIHN1cHBvcnRzOworCSAqIG5ldyBmaWVsZCBzaW5jZSB2ZXJzaW9uIDB4MDEwMDAyCisJICovCisJdW5zaWduZWQgaW50IHZlcnNpb247CisJLyoqCisJICogcmV0dXJuIHRoZSBzdXBwb3J0ZWQgbWluIC8gbWF4IHNhbXBsZSByYXRlczsKKwkgKiBuZXcgb3BzIHNpbmNlIHZlcnNpb24gMHgwMTAwMDIKKwkgKi8KKwlpbnQgKCpnZXRfc3VwcG9ydGVkX3JhdGVzKSh2b2lkICpvYmosIHVuc2lnbmVkIGludCAqcmF0ZV9taW4sCisJCQkJICAgdW5zaWduZWQgaW50ICpyYXRlX21heCk7CisJLyoqCisJICogc2hvdyBzb21lIHN0YXR1cyBtZXNzYWdlcyBmb3IgdmVyYm9zZSBtb2RlOworCSAqIG5ldyBvcHMgc2luY2UgdmVyc2lvbiAweDAxMDAwMgorCSAqLworCXZvaWQgKCpkdW1wKSh2b2lkICpvYmosIHNuZF9vdXRwdXRfdCAqb3V0KTsKK30gc25kX3BjbV9yYXRlX29wc190OworCisvKiogb3BlbiBmdW5jdGlvbiB0eXBlICovCit0eXBlZGVmIGludCAoKnNuZF9wY21fcmF0ZV9vcGVuX2Z1bmNfdCkodW5zaWduZWQgaW50IHZlcnNpb24sIHZvaWQgKipvYmpwLAorCQkJCQlzbmRfcGNtX3JhdGVfb3BzX3QgKm9wc3ApOworCisvKioKKyAqIERlZmluZSB0aGUgb2JqZWN0IGVudHJ5IGZvciBleHRlcm5hbCBQQ00gcmF0ZS1jb252ZXJ0ZXIgcGx1Z2lucworICovCisjZGVmaW5lIFNORF9QQ01fUkFURV9QTFVHSU5fRU5UUlkobmFtZSkgX3NuZF9wY21fcmF0ZV8jI25hbWUjI19vcGVuCisKKworI2lmbmRlZiBET0NfSElEREVOCisvKiBvbGQgcmF0ZV9vcHMgZm9yIHByb3RvY29sIHZlcnNpb24gMHgwMTAwMDEgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9wY21fcmF0ZV9vbGRfb3BzIHsKKwl2b2lkICgqY2xvc2UpKHZvaWQgKm9iaik7CisJaW50ICgqaW5pdCkodm9pZCAqb2JqLCBzbmRfcGNtX3JhdGVfaW5mb190ICppbmZvKTsKKwl2b2lkICgqZnJlZSkodm9pZCAqb2JqKTsKKwl2b2lkICgqcmVzZXQpKHZvaWQgKm9iaik7CisJaW50ICgqYWRqdXN0X3BpdGNoKSh2b2lkICpvYmosIHNuZF9wY21fcmF0ZV9pbmZvX3QgKmluZm8pOworCXZvaWQgKCpjb252ZXJ0KSh2b2lkICpvYmosCisJCQljb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICpkc3RfYXJlYXMsCisJCQlzbmRfcGNtX3VmcmFtZXNfdCBkc3Rfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgZHN0X2ZyYW1lcywKKwkJCWNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKnNyY19hcmVhcywKKwkJCXNuZF9wY21fdWZyYW1lc190IHNyY19vZmZzZXQsIHVuc2lnbmVkIGludCBzcmNfZnJhbWVzKTsKKwl2b2lkICgqY29udmVydF9zMTYpKHZvaWQgKm9iaiwgaW50MTZfdCAqZHN0LCB1bnNpZ25lZCBpbnQgZHN0X2ZyYW1lcywKKwkJCSAgICBjb25zdCBpbnQxNl90ICpzcmMsIHVuc2lnbmVkIGludCBzcmNfZnJhbWVzKTsKKwlzbmRfcGNtX3VmcmFtZXNfdCAoKmlucHV0X2ZyYW1lcykodm9pZCAqb2JqLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpOworCXNuZF9wY21fdWZyYW1lc190ICgqb3V0cHV0X2ZyYW1lcykodm9pZCAqb2JqLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpOworfSBzbmRfcGNtX3JhdGVfb2xkX29wc190OworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfUENNX1JBVEVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3Jhd21pZGkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9yYXdtaWRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4ZmQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9yYXdtaWRpLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9yYXdtaWRpLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX1JBV01JRElfSAorI2RlZmluZSBfX0FMU0FfUkFXTUlESV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIFJhd01pZGkgUmF3TWlkaSBJbnRlcmZhY2UKKyAqICBUaGUgUmF3TWlkaSBJbnRlcmZhY2UuIFNlZSBccmVmIHJhd21pZGkgcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogIFx7CisgKi8KKworLyoqIGRsc3ltIHZlcnNpb24gZm9yIGludGVyZmFjZSBlbnRyeSBjYWxsYmFjayAqLworI2RlZmluZSBTTkRfUkFXTUlESV9ETFNZTV9WRVJTSU9OCV9kbHN5bV9yYXdtaWRpXzAwMQorCisvKiogUmF3TWlkaSBpbmZvcm1hdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcmF3bWlkaV9pbmZvIHNuZF9yYXdtaWRpX2luZm9fdDsKKy8qKiBSYXdNaWRpIHNldHRpbmdzIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9yYXdtaWRpX3BhcmFtcyBzbmRfcmF3bWlkaV9wYXJhbXNfdDsKKy8qKiBSYXdNaWRpIHN0YXR1cyBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcmF3bWlkaV9zdGF0dXMgc25kX3Jhd21pZGlfc3RhdHVzX3Q7CisKKy8qKiBSYXdNaWRpIHN0cmVhbSAoZGlyZWN0aW9uKSAqLwordHlwZWRlZiBlbnVtIF9zbmRfcmF3bWlkaV9zdHJlYW0geworCS8qKiBPdXRwdXQgc3RyZWFtICovCisJU05EX1JBV01JRElfU1RSRUFNX09VVFBVVCA9IDAsCisJLyoqIElucHV0IHN0cmVhbSAqLworCVNORF9SQVdNSURJX1NUUkVBTV9JTlBVVCwKKwlTTkRfUkFXTUlESV9TVFJFQU1fTEFTVCA9IFNORF9SQVdNSURJX1NUUkVBTV9JTlBVVAorfSBzbmRfcmF3bWlkaV9zdHJlYW1fdDsKKworLyoqIEFwcGVuZCAoZmxhZyB0byBvcGVuIG1vZGUpIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX1JBV01JRElfQVBQRU5ECTB4MDAwMQorLyoqIE5vbiBibG9ja2luZyBtb2RlIChmbGFnIHRvIG9wZW4gbW9kZSkgXGhpZGVpbml0aWFsaXplciAqLworI2RlZmluZSBTTkRfUkFXTUlESV9OT05CTE9DSwkweDAwMDIKKy8qKiBXcml0ZSBzeW5jIG1vZGUgKEZsYWcgdG8gb3BlbiBtb2RlKSBcaGlkZWluaXRpYWxpemVyICovCisjZGVmaW5lIFNORF9SQVdNSURJX1NZTkMJMHgwMDA0CisKKy8qKiBSYXdNaWRpIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9yYXdtaWRpIHNuZF9yYXdtaWRpX3Q7CisKKy8qKiBSYXdNaWRpIHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3Jhd21pZGlfdHlwZSB7CisJLyoqIEtlcm5lbCBsZXZlbCBSYXdNaWRpICovCisJU05EX1JBV01JRElfVFlQRV9IVywKKwkvKiogU2hhcmVkIG1lbW9yeSBjbGllbnQgUmF3TWlkaSAobm90IHlldCBpbXBsZW1lbnRlZCkgKi8KKwlTTkRfUkFXTUlESV9UWVBFX1NITSwKKwkvKiogSU5FVCBjbGllbnQgUmF3TWlkaSAobm90IHlldCBpbXBsZW1lbnRlZCkgKi8KKwlTTkRfUkFXTUlESV9UWVBFX0lORVQsCisJLyoqIFZpcnR1YWwgKHNlcXVlbmNlcikgUmF3TWlkaSAqLworCVNORF9SQVdNSURJX1RZUEVfVklSVFVBTAorfSBzbmRfcmF3bWlkaV90eXBlX3Q7CisKK2ludCBzbmRfcmF3bWlkaV9vcGVuKHNuZF9yYXdtaWRpX3QgKippbl9ybWlkaSwgc25kX3Jhd21pZGlfdCAqKm91dF9ybWlkaSwKKwkJICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSk7CitpbnQgc25kX3Jhd21pZGlfb3Blbl9sY29uZihzbmRfcmF3bWlkaV90ICoqaW5fcm1pZGksIHNuZF9yYXdtaWRpX3QgKipvdXRfcm1pZGksCisJCQkgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSwgc25kX2NvbmZpZ190ICpsY29uZik7CitpbnQgc25kX3Jhd21pZGlfY2xvc2Uoc25kX3Jhd21pZGlfdCAqcm1pZGkpOworaW50IHNuZF9yYXdtaWRpX3BvbGxfZGVzY3JpcHRvcnNfY291bnQoc25kX3Jhd21pZGlfdCAqcm1pZGkpOworaW50IHNuZF9yYXdtaWRpX3BvbGxfZGVzY3JpcHRvcnMoc25kX3Jhd21pZGlfdCAqcm1pZGksIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBzcGFjZSk7CitpbnQgc25kX3Jhd21pZGlfcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKHNuZF9yYXdtaWRpX3QgKnJhd21pZGksIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqcmV2ZW50KTsKK2ludCBzbmRfcmF3bWlkaV9ub25ibG9jayhzbmRfcmF3bWlkaV90ICpybWlkaSwgaW50IG5vbmJsb2NrKTsKK3NpemVfdCBzbmRfcmF3bWlkaV9pbmZvX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX3Jhd21pZGlfaW5mb190IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX3Jhd21pZGlfaW5mb19hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfcmF3bWlkaV9pbmZvKQoraW50IHNuZF9yYXdtaWRpX2luZm9fbWFsbG9jKHNuZF9yYXdtaWRpX2luZm9fdCAqKnB0cik7Cit2b2lkIHNuZF9yYXdtaWRpX2luZm9fZnJlZShzbmRfcmF3bWlkaV9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9yYXdtaWRpX2luZm9fY29weShzbmRfcmF3bWlkaV9pbmZvX3QgKmRzdCwgY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpzcmMpOwordW5zaWduZWQgaW50IHNuZF9yYXdtaWRpX2luZm9fZ2V0X2RldmljZShjb25zdCBzbmRfcmF3bWlkaV9pbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX3Jhd21pZGlfaW5mb19nZXRfc3ViZGV2aWNlKGNvbnN0IHNuZF9yYXdtaWRpX2luZm9fdCAqb2JqKTsKK3NuZF9yYXdtaWRpX3N0cmVhbV90IHNuZF9yYXdtaWRpX2luZm9fZ2V0X3N0cmVhbShjb25zdCBzbmRfcmF3bWlkaV9pbmZvX3QgKm9iaik7CitpbnQgc25kX3Jhd21pZGlfaW5mb19nZXRfY2FyZChjb25zdCBzbmRfcmF3bWlkaV9pbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX3Jhd21pZGlfaW5mb19nZXRfZmxhZ3MoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX3Jhd21pZGlfaW5mb19nZXRfaWQoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX3Jhd21pZGlfaW5mb19nZXRfbmFtZShjb25zdCBzbmRfcmF3bWlkaV9pbmZvX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfcmF3bWlkaV9pbmZvX2dldF9zdWJkZXZpY2VfbmFtZShjb25zdCBzbmRfcmF3bWlkaV9pbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX3Jhd21pZGlfaW5mb19nZXRfc3ViZGV2aWNlc19jb3VudChjb25zdCBzbmRfcmF3bWlkaV9pbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX3Jhd21pZGlfaW5mb19nZXRfc3ViZGV2aWNlc19hdmFpbChjb25zdCBzbmRfcmF3bWlkaV9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9yYXdtaWRpX2luZm9fc2V0X2RldmljZShzbmRfcmF3bWlkaV9pbmZvX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIHNuZF9yYXdtaWRpX2luZm9fc2V0X3N1YmRldmljZShzbmRfcmF3bWlkaV9pbmZvX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIHNuZF9yYXdtaWRpX2luZm9fc2V0X3N0cmVhbShzbmRfcmF3bWlkaV9pbmZvX3QgKm9iaiwgc25kX3Jhd21pZGlfc3RyZWFtX3QgdmFsKTsKK2ludCBzbmRfcmF3bWlkaV9pbmZvKHNuZF9yYXdtaWRpX3QgKnJtaWRpLCBzbmRfcmF3bWlkaV9pbmZvX3QgKiBpbmZvKTsKK3NpemVfdCBzbmRfcmF3bWlkaV9wYXJhbXNfc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfcmF3bWlkaV9wYXJhbXNfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9yYXdtaWRpX3BhcmFtc19hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfcmF3bWlkaV9wYXJhbXMpCitpbnQgc25kX3Jhd21pZGlfcGFyYW1zX21hbGxvYyhzbmRfcmF3bWlkaV9wYXJhbXNfdCAqKnB0cik7Cit2b2lkIHNuZF9yYXdtaWRpX3BhcmFtc19mcmVlKHNuZF9yYXdtaWRpX3BhcmFtc190ICpvYmopOwordm9pZCBzbmRfcmF3bWlkaV9wYXJhbXNfY29weShzbmRfcmF3bWlkaV9wYXJhbXNfdCAqZHN0LCBjb25zdCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqc3JjKTsKK2ludCBzbmRfcmF3bWlkaV9wYXJhbXNfc2V0X2J1ZmZlcl9zaXplKHNuZF9yYXdtaWRpX3QgKnJtaWRpLCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqcGFyYW1zLCBzaXplX3QgdmFsKTsKK3NpemVfdCBzbmRfcmF3bWlkaV9wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplKGNvbnN0IHNuZF9yYXdtaWRpX3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9yYXdtaWRpX3BhcmFtc19zZXRfYXZhaWxfbWluKHNuZF9yYXdtaWRpX3QgKnJtaWRpLCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqcGFyYW1zLCBzaXplX3QgdmFsKTsKK3NpemVfdCBzbmRfcmF3bWlkaV9wYXJhbXNfZ2V0X2F2YWlsX21pbihjb25zdCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcmF3bWlkaV9wYXJhbXNfc2V0X25vX2FjdGl2ZV9zZW5zaW5nKHNuZF9yYXdtaWRpX3QgKnJtaWRpLCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqcGFyYW1zLCBpbnQgdmFsKTsKK2ludCBzbmRfcmF3bWlkaV9wYXJhbXNfZ2V0X25vX2FjdGl2ZV9zZW5zaW5nKGNvbnN0IHNuZF9yYXdtaWRpX3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9yYXdtaWRpX3BhcmFtcyhzbmRfcmF3bWlkaV90ICpybWlkaSwgc25kX3Jhd21pZGlfcGFyYW1zX3QgKiBwYXJhbXMpOworaW50IHNuZF9yYXdtaWRpX3BhcmFtc19jdXJyZW50KHNuZF9yYXdtaWRpX3QgKnJtaWRpLCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqcGFyYW1zKTsKK3NpemVfdCBzbmRfcmF3bWlkaV9zdGF0dXNfc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfcmF3bWlkaV9zdGF0dXNfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9yYXdtaWRpX3N0YXR1c19hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfcmF3bWlkaV9zdGF0dXMpCitpbnQgc25kX3Jhd21pZGlfc3RhdHVzX21hbGxvYyhzbmRfcmF3bWlkaV9zdGF0dXNfdCAqKnB0cik7Cit2b2lkIHNuZF9yYXdtaWRpX3N0YXR1c19mcmVlKHNuZF9yYXdtaWRpX3N0YXR1c190ICpvYmopOwordm9pZCBzbmRfcmF3bWlkaV9zdGF0dXNfY29weShzbmRfcmF3bWlkaV9zdGF0dXNfdCAqZHN0LCBjb25zdCBzbmRfcmF3bWlkaV9zdGF0dXNfdCAqc3JjKTsKK3ZvaWQgc25kX3Jhd21pZGlfc3RhdHVzX2dldF90c3RhbXAoY29uc3Qgc25kX3Jhd21pZGlfc3RhdHVzX3QgKm9iaiwgc25kX2h0aW1lc3RhbXBfdCAqcHRyKTsKK3NpemVfdCBzbmRfcmF3bWlkaV9zdGF0dXNfZ2V0X2F2YWlsKGNvbnN0IHNuZF9yYXdtaWRpX3N0YXR1c190ICpvYmopOworc2l6ZV90IHNuZF9yYXdtaWRpX3N0YXR1c19nZXRfeHJ1bnMoY29uc3Qgc25kX3Jhd21pZGlfc3RhdHVzX3QgKm9iaik7CitpbnQgc25kX3Jhd21pZGlfc3RhdHVzKHNuZF9yYXdtaWRpX3QgKnJtaWRpLCBzbmRfcmF3bWlkaV9zdGF0dXNfdCAqIHN0YXR1cyk7CitpbnQgc25kX3Jhd21pZGlfZHJhaW4oc25kX3Jhd21pZGlfdCAqcm1pZGkpOworaW50IHNuZF9yYXdtaWRpX2Ryb3Aoc25kX3Jhd21pZGlfdCAqcm1pZGkpOworc3NpemVfdCBzbmRfcmF3bWlkaV93cml0ZShzbmRfcmF3bWlkaV90ICpybWlkaSwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Citzc2l6ZV90IHNuZF9yYXdtaWRpX3JlYWQoc25kX3Jhd21pZGlfdCAqcm1pZGksIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworY29uc3QgY2hhciAqc25kX3Jhd21pZGlfbmFtZShzbmRfcmF3bWlkaV90ICpybWlkaSk7CitzbmRfcmF3bWlkaV90eXBlX3Qgc25kX3Jhd21pZGlfdHlwZShzbmRfcmF3bWlkaV90ICpybWlkaSk7CitzbmRfcmF3bWlkaV9zdHJlYW1fdCBzbmRfcmF3bWlkaV9zdHJlYW0oc25kX3Jhd21pZGlfdCAqcmF3bWlkaSk7CisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19SQVdNSURJX0ggKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NlcS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NlcS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzY4MjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxLmgKQEAgLTAsMCArMSw3MzcgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9zZXEuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqLworLyoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX1NFUV9ICisjZGVmaW5lIF9fQUxTQV9TRVFfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBTZXF1ZW5jZXIgTUlESSBTZXF1ZW5jZXIKKyAqICBNSURJIFNlcXVlbmNlciBJbnRlcmZhY2UuCisgKiAgU2VlIFxyZWYgc2VxIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICBceworICovCisKKy8qKiBkbHN5bSB2ZXJzaW9uIGZvciBpbnRlcmZhY2UgZW50cnkgY2FsbGJhY2sgKi8KKyNkZWZpbmUgU05EX1NFUV9ETFNZTV9WRVJTSU9OCQlfZGxzeW1fc2VxXzAwMQorCisvKiogU2VxdWVuY2VyIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9zZXEgc25kX3NlcV90OworCisvKioKKyAqIHNlcXVlbmNlciBvcGVuaW5nIHN0cmVhbSB0eXBlcworICovCisjZGVmaW5lIFNORF9TRVFfT1BFTl9PVVRQVVQJMQkvKio8IG9wZW4gZm9yIG91dHB1dCAod3JpdGUpICovCisjZGVmaW5lIFNORF9TRVFfT1BFTl9JTlBVVAkyCS8qKjwgb3BlbiBmb3IgaW5wdXQgKHJlYWQpICovCisjZGVmaW5lIFNORF9TRVFfT1BFTl9EVVBMRVgJKFNORF9TRVFfT1BFTl9PVVRQVVR8U05EX1NFUV9PUEVOX0lOUFVUKQkvKio8IG9wZW4gZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCAocmVhZC93cml0ZSkgKi8KKworLyoqCisgKiBzZXF1ZW5jZXIgb3BlbmluZyBtb2RlCisgKi8KKyNkZWZpbmUgU05EX1NFUV9OT05CTE9DSwkweDAwMDEJLyoqPCBub24tYmxvY2tpbmcgbW9kZSAoZmxhZyB0byBvcGVuIG1vZGUpICovCisKKy8qKiBzZXF1ZW5jZXIgaGFuZGxlIHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3NlcV90eXBlIHsKKwlTTkRfU0VRX1RZUEVfSFcsCQkvKio8IGhhcmR3YXJlICovCisJU05EX1NFUV9UWVBFX1NITSwJCS8qKjwgc2hhcmVkIG1lbW9yeSAoTllJKSAqLworCVNORF9TRVFfVFlQRV9JTkVUCQkvKio8IG5ldHdvcmsgKE5ZSSkgKi8KK30gc25kX3NlcV90eXBlX3Q7CisKKy8qKiBzcGVjaWFsIGNsaWVudCAocG9ydCkgaWRzICovCisjZGVmaW5lIFNORF9TRVFfQUREUkVTU19VTktOT1dOCQkyNTMJLyoqPCB1bmtub3duIHNvdXJjZSAqLworI2RlZmluZSBTTkRfU0VRX0FERFJFU1NfU1VCU0NSSUJFUlMJMjU0CS8qKjwgc2VuZCBldmVudCB0byBhbGwgc3Vic2NyaWJlZCBwb3J0cyAqLworI2RlZmluZSBTTkRfU0VRX0FERFJFU1NfQlJPQURDQVNUCTI1NQkvKio8IHNlbmQgZXZlbnQgdG8gYWxsIHF1ZXVlcy9jbGllbnRzL3BvcnRzL2NoYW5uZWxzICovCisKKy8qKiBrbm93biBjbGllbnQgbnVtYmVycyAqLworI2RlZmluZSBTTkRfU0VRX0NMSUVOVF9TWVNURU0JCTAJLyoqPCBzeXN0ZW0gY2xpZW50ICovCisKKy8qCisgKi8KK2ludCBzbmRfc2VxX29wZW4oc25kX3NlcV90ICoqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgc3RyZWFtcywgaW50IG1vZGUpOworaW50IHNuZF9zZXFfb3Blbl9sY29uZihzbmRfc2VxX3QgKipoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzdHJlYW1zLCBpbnQgbW9kZSwgc25kX2NvbmZpZ190ICpsY29uZik7Citjb25zdCBjaGFyICpzbmRfc2VxX25hbWUoc25kX3NlcV90ICpzZXEpOworc25kX3NlcV90eXBlX3Qgc25kX3NlcV90eXBlKHNuZF9zZXFfdCAqc2VxKTsKK2ludCBzbmRfc2VxX2Nsb3NlKHNuZF9zZXFfdCAqaGFuZGxlKTsKK2ludCBzbmRfc2VxX3BvbGxfZGVzY3JpcHRvcnNfY291bnQoc25kX3NlcV90ICpoYW5kbGUsIHNob3J0IGV2ZW50cyk7CitpbnQgc25kX3NlcV9wb2xsX2Rlc2NyaXB0b3JzKHNuZF9zZXFfdCAqaGFuZGxlLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgc3BhY2UsIHNob3J0IGV2ZW50cyk7CitpbnQgc25kX3NlcV9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMoc25kX3NlcV90ICpzZXEsIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqcmV2ZW50cyk7CitpbnQgc25kX3NlcV9ub25ibG9jayhzbmRfc2VxX3QgKmhhbmRsZSwgaW50IG5vbmJsb2NrKTsKK2ludCBzbmRfc2VxX2NsaWVudF9pZChzbmRfc2VxX3QgKmhhbmRsZSk7CisKK3NpemVfdCBzbmRfc2VxX2dldF9vdXRwdXRfYnVmZmVyX3NpemUoc25kX3NlcV90ICpoYW5kbGUpOworc2l6ZV90IHNuZF9zZXFfZ2V0X2lucHV0X2J1ZmZlcl9zaXplKHNuZF9zZXFfdCAqaGFuZGxlKTsKK2ludCBzbmRfc2VxX3NldF9vdXRwdXRfYnVmZmVyX3NpemUoc25kX3NlcV90ICpoYW5kbGUsIHNpemVfdCBzaXplKTsKK2ludCBzbmRfc2VxX3NldF9pbnB1dF9idWZmZXJfc2l6ZShzbmRfc2VxX3QgKmhhbmRsZSwgc2l6ZV90IHNpemUpOworCisvKiogc3lzdGVtIGluZm9ybWF0aW9uIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9zZXFfc3lzdGVtX2luZm8gc25kX3NlcV9zeXN0ZW1faW5mb190OworCitzaXplX3Qgc25kX3NlcV9zeXN0ZW1faW5mb19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9zeXN0ZW1faW5mb190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX3N5c3RlbV9pbmZvX2FsbG9jYShwdHIpIFwKKwlfX3NuZF9hbGxvY2EocHRyLCBzbmRfc2VxX3N5c3RlbV9pbmZvKQoraW50IHNuZF9zZXFfc3lzdGVtX2luZm9fbWFsbG9jKHNuZF9zZXFfc3lzdGVtX2luZm9fdCAqKnB0cik7Cit2b2lkIHNuZF9zZXFfc3lzdGVtX2luZm9fZnJlZShzbmRfc2VxX3N5c3RlbV9pbmZvX3QgKnB0cik7Cit2b2lkIHNuZF9zZXFfc3lzdGVtX2luZm9fY29weShzbmRfc2VxX3N5c3RlbV9pbmZvX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9zeXN0ZW1faW5mb190ICpzcmMpOworCitpbnQgc25kX3NlcV9zeXN0ZW1faW5mb19nZXRfcXVldWVzKGNvbnN0IHNuZF9zZXFfc3lzdGVtX2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9zeXN0ZW1faW5mb19nZXRfY2xpZW50cyhjb25zdCBzbmRfc2VxX3N5c3RlbV9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfc3lzdGVtX2luZm9fZ2V0X3BvcnRzKGNvbnN0IHNuZF9zZXFfc3lzdGVtX2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9zeXN0ZW1faW5mb19nZXRfY2hhbm5lbHMoY29uc3Qgc25kX3NlcV9zeXN0ZW1faW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3N5c3RlbV9pbmZvX2dldF9jdXJfY2xpZW50cyhjb25zdCBzbmRfc2VxX3N5c3RlbV9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfc3lzdGVtX2luZm9fZ2V0X2N1cl9xdWV1ZXMoY29uc3Qgc25kX3NlcV9zeXN0ZW1faW5mb190ICppbmZvKTsKKworaW50IHNuZF9zZXFfc3lzdGVtX2luZm8oc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfc3lzdGVtX2luZm9fdCAqaW5mbyk7CisKKy8qKiBcfSAqLworCisKKy8qKgorICogIFxkZWZncm91cCBTZXFDbGllbnQgU2VxdWVuY2VyIENsaWVudCBJbnRlcmZhY2UKKyAqICBTZXF1ZW5jZXIgQ2xpZW50IEludGVyZmFjZQorICogIFxpbmdyb3VwIFNlcXVlbmNlcgorICogIFx7CisgKi8KKworLyoqIGNsaWVudCBpbmZvcm1hdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfc2VxX2NsaWVudF9pbmZvIHNuZF9zZXFfY2xpZW50X2luZm9fdDsKKworLyoqIGNsaWVudCB0eXBlcyAqLwordHlwZWRlZiBlbnVtIHNuZF9zZXFfY2xpZW50X3R5cGUgeworCVNORF9TRVFfVVNFUl9DTElFTlQgICAgID0gMSwJLyoqPCB1c2VyIGNsaWVudCAqLworCVNORF9TRVFfS0VSTkVMX0NMSUVOVCAgID0gMgkvKio8IGtlcm5lbCBjbGllbnQgKi8KK30gc25kX3NlcV9jbGllbnRfdHlwZV90OworICAgICAgICAgICAgICAgICAgICAgICAgCitzaXplX3Qgc25kX3NlcV9jbGllbnRfaW5mb19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9jbGllbnRfaW5mb190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX2NsaWVudF9pbmZvX2FsbG9jYShwdHIpIFwKKwlfX3NuZF9hbGxvY2EocHRyLCBzbmRfc2VxX2NsaWVudF9pbmZvKQoraW50IHNuZF9zZXFfY2xpZW50X2luZm9fbWFsbG9jKHNuZF9zZXFfY2xpZW50X2luZm9fdCAqKnB0cik7Cit2b2lkIHNuZF9zZXFfY2xpZW50X2luZm9fZnJlZShzbmRfc2VxX2NsaWVudF9pbmZvX3QgKnB0cik7Cit2b2lkIHNuZF9zZXFfY2xpZW50X2luZm9fY29weShzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9jbGllbnRfaW5mb190ICpzcmMpOworCitpbnQgc25kX3NlcV9jbGllbnRfaW5mb19nZXRfY2xpZW50KGNvbnN0IHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbyk7CitzbmRfc2VxX2NsaWVudF90eXBlX3Qgc25kX3NlcV9jbGllbnRfaW5mb19nZXRfdHlwZShjb25zdCBzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworY29uc3QgY2hhciAqc25kX3NlcV9jbGllbnRfaW5mb19nZXRfbmFtZShzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X2Jyb2FkY2FzdF9maWx0ZXIoY29uc3Qgc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX2NsaWVudF9pbmZvX2dldF9lcnJvcl9ib3VuY2UoY29uc3Qgc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvKTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgKnNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X2V2ZW50X2ZpbHRlcihjb25zdCBzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X251bV9wb3J0cyhjb25zdCBzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X2V2ZW50X2xvc3QoY29uc3Qgc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvKTsKKwordm9pZCBzbmRfc2VxX2NsaWVudF9pbmZvX3NldF9jbGllbnQoc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvLCBpbnQgY2xpZW50KTsKK3ZvaWQgc25kX3NlcV9jbGllbnRfaW5mb19zZXRfbmFtZShzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8sIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBzbmRfc2VxX2NsaWVudF9pbmZvX3NldF9icm9hZGNhc3RfZmlsdGVyKHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbywgaW50IHZhbCk7Cit2b2lkIHNuZF9zZXFfY2xpZW50X2luZm9fc2V0X2Vycm9yX2JvdW5jZShzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8sIGludCB2YWwpOwordm9pZCBzbmRfc2VxX2NsaWVudF9pbmZvX3NldF9ldmVudF9maWx0ZXIoc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvLCB1bnNpZ25lZCBjaGFyICpmaWx0ZXIpOworCit2b2lkIHNuZF9zZXFfY2xpZW50X2luZm9fZXZlbnRfZmlsdGVyX2NsZWFyKHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbyk7Cit2b2lkIHNuZF9zZXFfY2xpZW50X2luZm9fZXZlbnRfZmlsdGVyX2FkZChzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8sIGludCBldmVudF90eXBlKTsKK3ZvaWQgc25kX3NlcV9jbGllbnRfaW5mb19ldmVudF9maWx0ZXJfZGVsKHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbywgaW50IGV2ZW50X3R5cGUpOworaW50IHNuZF9zZXFfY2xpZW50X2luZm9fZXZlbnRfZmlsdGVyX2NoZWNrKHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbywgaW50IGV2ZW50X3R5cGUpOworCitpbnQgc25kX3NlcV9nZXRfY2xpZW50X2luZm8oc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9nZXRfYW55X2NsaWVudF9pbmZvKHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgY2xpZW50LCBzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfc2V0X2NsaWVudF9pbmZvKHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVlcnlfbmV4dF9jbGllbnQoc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbyk7CisKKy8qCisgKi8KKworLyoqIGNsaWVudCBwb29sIGluZm9ybWF0aW9uIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9zZXFfY2xpZW50X3Bvb2wgc25kX3NlcV9jbGllbnRfcG9vbF90OworCitzaXplX3Qgc25kX3NlcV9jbGllbnRfcG9vbF9zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9jbGllbnRfcG9vbF90IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX2NsaWVudF9wb29sX2FsbG9jYShwdHIpIFwKKwlfX3NuZF9hbGxvY2EocHRyLCBzbmRfc2VxX2NsaWVudF9wb29sKQoraW50IHNuZF9zZXFfY2xpZW50X3Bvb2xfbWFsbG9jKHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqKnB0cik7Cit2b2lkIHNuZF9zZXFfY2xpZW50X3Bvb2xfZnJlZShzbmRfc2VxX2NsaWVudF9wb29sX3QgKnB0cik7Cit2b2lkIHNuZF9zZXFfY2xpZW50X3Bvb2xfY29weShzbmRfc2VxX2NsaWVudF9wb29sX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9jbGllbnRfcG9vbF90ICpzcmMpOworCitpbnQgc25kX3NlcV9jbGllbnRfcG9vbF9nZXRfY2xpZW50KGNvbnN0IHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbyk7CitzaXplX3Qgc25kX3NlcV9jbGllbnRfcG9vbF9nZXRfb3V0cHV0X3Bvb2woY29uc3Qgc25kX3NlcV9jbGllbnRfcG9vbF90ICppbmZvKTsKK3NpemVfdCBzbmRfc2VxX2NsaWVudF9wb29sX2dldF9pbnB1dF9wb29sKGNvbnN0IHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbyk7CitzaXplX3Qgc25kX3NlcV9jbGllbnRfcG9vbF9nZXRfb3V0cHV0X3Jvb20oY29uc3Qgc25kX3NlcV9jbGllbnRfcG9vbF90ICppbmZvKTsKK3NpemVfdCBzbmRfc2VxX2NsaWVudF9wb29sX2dldF9vdXRwdXRfZnJlZShjb25zdCBzbmRfc2VxX2NsaWVudF9wb29sX3QgKmluZm8pOworc2l6ZV90IHNuZF9zZXFfY2xpZW50X3Bvb2xfZ2V0X2lucHV0X2ZyZWUoY29uc3Qgc25kX3NlcV9jbGllbnRfcG9vbF90ICppbmZvKTsKK3ZvaWQgc25kX3NlcV9jbGllbnRfcG9vbF9zZXRfb3V0cHV0X3Bvb2woc25kX3NlcV9jbGllbnRfcG9vbF90ICppbmZvLCBzaXplX3Qgc2l6ZSk7Cit2b2lkIHNuZF9zZXFfY2xpZW50X3Bvb2xfc2V0X2lucHV0X3Bvb2woc25kX3NlcV9jbGllbnRfcG9vbF90ICppbmZvLCBzaXplX3Qgc2l6ZSk7Cit2b2lkIHNuZF9zZXFfY2xpZW50X3Bvb2xfc2V0X291dHB1dF9yb29tKHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbywgc2l6ZV90IHNpemUpOworCitpbnQgc25kX3NlcV9nZXRfY2xpZW50X3Bvb2woc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9zZXRfY2xpZW50X3Bvb2woc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbyk7CisKKworLyoqIFx9ICovCisKKworLyoqCisgKiAgXGRlZmdyb3VwIFNlcVBvcnQgU2VxdWVuY2VyIFBvcnQgSW50ZXJmYWNlCisgKiAgU2VxdWVuY2VyIFBvcnQgSW50ZXJmYWNlCisgKiAgXGluZ3JvdXAgU2VxdWVuY2VyCisgKiAgXHsKKyAqLworCisvKiogcG9ydCBpbmZvcm1hdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfc2VxX3BvcnRfaW5mbyBzbmRfc2VxX3BvcnRfaW5mb190OworCisvKioga25vd24gcG9ydCBudW1iZXJzICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9TWVNURU1fVElNRVIJMAkvKio8IHN5c3RlbSB0aW1lciBwb3J0ICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9TWVNURU1fQU5OT1VOQ0UJMQkvKio8IHN5c3RlbSBhbm5vdW5jZSBwb3J0ICovCisKKy8qKiBwb3J0IGNhcGFiaWxpdGllcyAoMzIgYml0cykgKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX0NBUF9SRUFECQkoMTw8MCkJLyoqPCByZWFkYWJsZSBmcm9tIHRoaXMgcG9ydCAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfQ0FQX1dSSVRFCQkoMTw8MSkJLyoqPCB3cml0YWJsZSB0byB0aGlzIHBvcnQgKi8KKworI2RlZmluZSBTTkRfU0VRX1BPUlRfQ0FQX1NZTkNfUkVBRAkoMTw8MikJLyoqPCBhbGxvdyByZWFkIHN1YnNjcmlwdGlvbnMgKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX0NBUF9TWU5DX1dSSVRFCSgxPDwzKQkvKio8IGFsbG93IHdyaXRlIHN1YnNjcmlwdGlvbnMgKi8KKworI2RlZmluZSBTTkRfU0VRX1BPUlRfQ0FQX0RVUExFWAkJKDE8PDQpCS8qKjwgYWxsb3cgcmVhZC93cml0ZSBkdXBsZXggKi8KKworI2RlZmluZSBTTkRfU0VRX1BPUlRfQ0FQX1NVQlNfUkVBRAkoMTw8NSkJLyoqPCBhbGxvdyByZWFkIHN1YnNjcmlwdGlvbiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfQ0FQX1NVQlNfV1JJVEUJKDE8PDYpCS8qKjwgYWxsb3cgd3JpdGUgc3Vic2NyaXB0aW9uICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9DQVBfTk9fRVhQT1JUCSgxPDw3KQkvKio8IHJvdXRpbmcgbm90IGFsbG93ZWQgKi8KKworLyogcG9ydCB0eXBlICovCisvKiogTWVzc2FnZXMgc2VudCBmcm9tL3RvIHRoaXMgcG9ydCBoYXZlIGRldmljZS1zcGVjaWZpYyBzZW1hbnRpY3MuICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9UWVBFX1NQRUNJRklDCSgxPDwwKQorLyoqIFRoaXMgcG9ydCB1bmRlcnN0YW5kcyBNSURJIG1lc3NhZ2VzLiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfVFlQRV9NSURJX0dFTkVSSUMJKDE8PDEpCisvKiogVGhpcyBwb3J0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgR2VuZXJhbCBNSURJIHNwZWNpZmljYXRpb24uICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9UWVBFX01JRElfR00JKDE8PDIpCisvKiogVGhpcyBwb3J0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgUm9sYW5kIEdTIHN0YW5kYXJkLiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfVFlQRV9NSURJX0dTCSgxPDwzKQorLyoqIFRoaXMgcG9ydCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFlhbWFoYSBYRyBzcGVjaWZpY2F0aW9uLiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfVFlQRV9NSURJX1hHCSgxPDw0KQorLyoqIFRoaXMgcG9ydCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFJvbGFuZCBNVC0zMi4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfTUlESV9NVDMyCSgxPDw1KQorLyoqIFRoaXMgcG9ydCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEdlbmVyYWwgTUlESSAyIHNwZWNpZmljYXRpb24uICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9UWVBFX01JRElfR00yCSgxPDw2KQorLyoqIFRoaXMgcG9ydCB1bmRlcnN0YW5kcyBTTkRfU0VRX0VWRU5UX1NBTVBMRV94eHggbWVzc2FnZXMKKyAgICAodGhlc2UgYXJlIG5vdCBNSURJIG1lc3NhZ2VzKS4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfU1lOVEgJCSgxPDwxMCkKKy8qKiBJbnN0cnVtZW50cyBjYW4gYmUgZG93bmxvYWRlZCB0byB0aGlzIHBvcnQKKyAgICAod2l0aCBTTkRfU0VRX0VWRU5UX0lOU1RSX3h4eCBtZXNzYWdlcyBzZW50IGRpcmVjdGx5KS4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfRElSRUNUX1NBTVBMRSAoMTw8MTEpCisvKiogSW5zdHJ1bWVudHMgY2FuIGJlIGRvd25sb2FkZWQgdG8gdGhpcyBwb3J0CisgICAgKHdpdGggU05EX1NFUV9FVkVOVF9JTlNUUl94eHggbWVzc2FnZXMgc2VudCBkaXJlY3RseSBvciB0aHJvdWdoIGEgcXVldWUpLiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfVFlQRV9TQU1QTEUJKDE8PDEyKQorLyoqIFRoaXMgcG9ydCBpcyBpbXBsZW1lbnRlZCBpbiBoYXJkd2FyZS4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfSEFSRFdBUkUJKDE8PDE2KQorLyoqIFRoaXMgcG9ydCBpcyBpbXBsZW1lbnRlZCBpbiBzb2Z0d2FyZS4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfU09GVFdBUkUJKDE8PDE3KQorLyoqIE1lc3NhZ2VzIHNlbnQgdG8gdGhpcyBwb3J0IHdpbGwgZ2VuZXJhdGUgc291bmRzLiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfVFlQRV9TWU5USEVTSVpFUgkoMTw8MTgpCisvKiogVGhpcyBwb3J0IG1heSBjb25uZWN0IHRvIG90aGVyIGRldmljZXMKKyAgICAod2hvc2UgY2hhcmFjdGVyaXN0aWNzIGFyZSBub3Qga25vd24pLiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfVFlQRV9QT1JUCQkoMTw8MTkpCisvKiogVGhpcyBwb3J0IGJlbG9uZ3MgdG8gYW4gYXBwbGljYXRpb24sIHN1Y2ggYXMgYSBzZXF1ZW5jZXIgb3IgZWRpdG9yLiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfVFlQRV9BUFBMSUNBVElPTgkoMTw8MjApCisKKworc2l6ZV90IHNuZF9zZXFfcG9ydF9pbmZvX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSBhICNzbmRfc2VxX3BvcnRfaW5mb190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX3BvcnRfaW5mb19hbGxvY2EocHRyKSBcCisJX19zbmRfYWxsb2NhKHB0ciwgc25kX3NlcV9wb3J0X2luZm8pCitpbnQgc25kX3NlcV9wb3J0X2luZm9fbWFsbG9jKHNuZF9zZXFfcG9ydF9pbmZvX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19mcmVlKHNuZF9zZXFfcG9ydF9pbmZvX3QgKnB0cik7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX2NvcHkoc25kX3NlcV9wb3J0X2luZm9fdCAqZHN0LCBjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICpzcmMpOworCitpbnQgc25kX3NlcV9wb3J0X2luZm9fZ2V0X2NsaWVudChjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfaW5mb19nZXRfcG9ydChjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2NvbnN0IHNuZF9zZXFfYWRkcl90ICpzbmRfc2VxX3BvcnRfaW5mb19nZXRfYWRkcihjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2NvbnN0IGNoYXIgKnNuZF9zZXFfcG9ydF9pbmZvX2dldF9uYW1lKGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOwordW5zaWduZWQgaW50IHNuZF9zZXFfcG9ydF9pbmZvX2dldF9jYXBhYmlsaXR5KGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOwordW5zaWduZWQgaW50IHNuZF9zZXFfcG9ydF9pbmZvX2dldF90eXBlKGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcG9ydF9pbmZvX2dldF9taWRpX2NoYW5uZWxzKGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcG9ydF9pbmZvX2dldF9taWRpX3ZvaWNlcyhjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfaW5mb19nZXRfc3ludGhfdm9pY2VzKGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcG9ydF9pbmZvX2dldF9yZWFkX3VzZShjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfaW5mb19nZXRfd3JpdGVfdXNlKGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcG9ydF9pbmZvX2dldF9wb3J0X3NwZWNpZmllZChjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfaW5mb19nZXRfdGltZXN0YW1waW5nKGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcG9ydF9pbmZvX2dldF90aW1lc3RhbXBfcmVhbChjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfaW5mb19nZXRfdGltZXN0YW1wX3F1ZXVlKGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworCit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX3NldF9jbGllbnQoc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbywgaW50IGNsaWVudCk7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX3NldF9wb3J0KHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8sIGludCBwb3J0KTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fc2V0X2FkZHIoc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbywgY29uc3Qgc25kX3NlcV9hZGRyX3QgKmFkZHIpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19zZXRfbmFtZShzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fc2V0X2NhcGFiaWxpdHkoc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbywgdW5zaWduZWQgaW50IGNhcGFiaWxpdHkpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19zZXRfdHlwZShzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvLCB1bnNpZ25lZCBpbnQgdHlwZSk7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX3NldF9taWRpX2NoYW5uZWxzKHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8sIGludCBjaGFubmVscyk7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX3NldF9taWRpX3ZvaWNlcyhzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvLCBpbnQgdm9pY2VzKTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fc2V0X3N5bnRoX3ZvaWNlcyhzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvLCBpbnQgdm9pY2VzKTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fc2V0X3BvcnRfc3BlY2lmaWVkKHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8sIGludCB2YWwpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19zZXRfdGltZXN0YW1waW5nKHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8sIGludCBlbmFibGUpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19zZXRfdGltZXN0YW1wX3JlYWwoc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbywgaW50IHJlYWx0aW1lKTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fc2V0X3RpbWVzdGFtcF9xdWV1ZShzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvLCBpbnQgcXVldWUpOworCitpbnQgc25kX3NlcV9jcmVhdGVfcG9ydChzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9kZWxldGVfcG9ydChzbmRfc2VxX3QgKmhhbmRsZSwgaW50IHBvcnQpOworaW50IHNuZF9zZXFfZ2V0X3BvcnRfaW5mbyhzbmRfc2VxX3QgKmhhbmRsZSwgaW50IHBvcnQsIHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfZ2V0X2FueV9wb3J0X2luZm8oc25kX3NlcV90ICpoYW5kbGUsIGludCBjbGllbnQsIGludCBwb3J0LCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3NldF9wb3J0X2luZm8oc25kX3NlcV90ICpoYW5kbGUsIGludCBwb3J0LCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3F1ZXJ5X25leHRfcG9ydChzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CisKKy8qKiBcfSAqLworCisKKy8qKgorICogIFxkZWZncm91cCBTZXFTdWJzY3JpYmUgU2VxdWVuY2VyIFBvcnQgU3Vic2NyaXB0aW9uCisgKiAgU2VxdWVuY2VyIFBvcnQgU3Vic2NyaXB0aW9uCisgKiAgXGluZ3JvdXAgU2VxdWVuY2VyCisgKiAgXHsKKyAqLworCisvKiogcG9ydCBzdWJzY3JpcHRpb24gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NlcV9wb3J0X3N1YnNjcmliZSBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3Q7CisKK3NpemVfdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSBhICNzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfYWxsb2NhKHB0cikgXAorCV9fc25kX2FsbG9jYShwdHIsIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmUpCitpbnQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9tYWxsb2Moc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICoqcHRyKTsKK3ZvaWQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9mcmVlKHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqcHRyKTsKK3ZvaWQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9jb3B5KHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqZHN0LCBjb25zdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKnNyYyk7CisKK2NvbnN0IHNuZF9zZXFfYWRkcl90ICpzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX2dldF9zZW5kZXIoY29uc3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvKTsKK2NvbnN0IHNuZF9zZXFfYWRkcl90ICpzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX2dldF9kZXN0KGNvbnN0IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9nZXRfcXVldWUoY29uc3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX2dldF9leGNsdXNpdmUoY29uc3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX2dldF90aW1lX3VwZGF0ZShjb25zdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmluZm8pOworaW50IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfZ2V0X3RpbWVfcmVhbChjb25zdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmluZm8pOworCit2b2lkIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfc2V0X3NlbmRlcihzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmluZm8sIGNvbnN0IHNuZF9zZXFfYWRkcl90ICphZGRyKTsKK3ZvaWQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9zZXRfZGVzdChzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmluZm8sIGNvbnN0IHNuZF9zZXFfYWRkcl90ICphZGRyKTsKK3ZvaWQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9zZXRfcXVldWUoc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvLCBpbnQgcSk7Cit2b2lkIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfc2V0X2V4Y2x1c2l2ZShzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmluZm8sIGludCB2YWwpOwordm9pZCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3NldF90aW1lX3VwZGF0ZShzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmluZm8sIGludCB2YWwpOwordm9pZCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3NldF90aW1lX3JlYWwoc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvLCBpbnQgdmFsKTsKKworaW50IHNuZF9zZXFfZ2V0X3BvcnRfc3Vic2NyaXB0aW9uKHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKnN1Yik7CitpbnQgc25kX3NlcV9zdWJzY3JpYmVfcG9ydChzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICpzdWIpOworaW50IHNuZF9zZXFfdW5zdWJzY3JpYmVfcG9ydChzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICpzdWIpOworCisvKgorICovCisKKy8qKiBzdWJzY3JpcHRpb24gcXVlcnkgY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NlcV9xdWVyeV9zdWJzY3JpYmUgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdDsKKworLyoqIHR5cGUgb2YgcXVlcnkgc3Vic2NyaXB0aW9uICovCit0eXBlZGVmIGVudW0geworCVNORF9TRVFfUVVFUllfU1VCU19SRUFELAkvKio8IHF1ZXJ5IHJlYWQgc3Vic2NyaXB0aW9ucyAqLworCVNORF9TRVFfUVVFUllfU1VCU19XUklURQkvKio8IHF1ZXJ5IHdyaXRlIHN1YnNjcmlwdGlvbnMgKi8KK30gc25kX3NlcV9xdWVyeV9zdWJzX3R5cGVfdDsKKworc2l6ZV90IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSBhICNzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9hbGxvY2EocHRyKSBcCisJX19zbmRfYWxsb2NhKHB0ciwgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmUpCitpbnQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfbWFsbG9jKHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9mcmVlKHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKnB0cik7Cit2b2lkIHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2NvcHkoc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqZHN0LCBjb25zdCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICpzcmMpOworCitpbnQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X2NsaWVudChjb25zdCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvKTsKK2ludCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9nZXRfcG9ydChjb25zdCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvKTsKK2NvbnN0IHNuZF9zZXFfYWRkcl90ICpzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9nZXRfcm9vdChjb25zdCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvKTsKK3NuZF9zZXFfcXVlcnlfc3Vic190eXBlX3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3R5cGUoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X2luZGV4KGNvbnN0IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF9udW1fc3Vicyhjb25zdCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvKTsKK2NvbnN0IHNuZF9zZXFfYWRkcl90ICpzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9nZXRfYWRkcihjb25zdCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvKTsKK2ludCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9nZXRfcXVldWUoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X2V4Y2x1c2l2ZShjb25zdCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvKTsKK2ludCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9nZXRfdGltZV91cGRhdGUoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3RpbWVfcmVhbChjb25zdCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvKTsKKwordm9pZCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9zZXRfY2xpZW50KHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmluZm8sIGludCBjbGllbnQpOwordm9pZCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9zZXRfcG9ydChzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvLCBpbnQgcG9ydCk7Cit2b2lkIHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3NldF9yb290KHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmluZm8sIGNvbnN0IHNuZF9zZXFfYWRkcl90ICphZGRyKTsKK3ZvaWQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfc2V0X3R5cGUoc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbywgc25kX3NlcV9xdWVyeV9zdWJzX3R5cGVfdCB0eXBlKTsKK3ZvaWQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfc2V0X2luZGV4KHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmluZm8sIGludCBfaW5kZXgpOworCitpbnQgc25kX3NlcV9xdWVyeV9wb3J0X3N1YnNjcmliZXJzKHNuZF9zZXFfdCAqc2VxLCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICogc3Vicyk7CisKKy8qKiBcfSAqLworCisKKy8qKgorICogIFxkZWZncm91cCBTZXFRdWV1ZSBTZXF1ZW5jZXIgUXVldWUgSW50ZXJmYWNlCisgKiAgU2VxdWVuY2VyIFF1ZXVlIEludGVyZmFjZQorICogIFxpbmdyb3VwIFNlcXVlbmNlcgorICogIFx7CisgKi8KKworLyoqIHF1ZXVlIGluZm9ybWF0aW9uIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9zZXFfcXVldWVfaW5mbyBzbmRfc2VxX3F1ZXVlX2luZm9fdDsKKy8qKiBxdWV1ZSBzdGF0dXMgY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NlcV9xdWV1ZV9zdGF0dXMgc25kX3NlcV9xdWV1ZV9zdGF0dXNfdDsKKy8qKiBxdWV1ZSB0ZW1wbyBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfc2VxX3F1ZXVlX3RlbXBvIHNuZF9zZXFfcXVldWVfdGVtcG9fdDsKKy8qKiBxdWV1ZSB0aW1lciBpbmZvcm1hdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfc2VxX3F1ZXVlX3RpbWVyIHNuZF9zZXFfcXVldWVfdGltZXJfdDsKKworLyoqIHNwZWNpYWwgcXVldWUgaWRzICovCisjZGVmaW5lIFNORF9TRVFfUVVFVUVfRElSRUNUCQkyNTMJLyoqPCBkaXJlY3QgZGlzcGF0Y2ggKi8KKworc2l6ZV90IHNuZF9zZXFfcXVldWVfaW5mb19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9xdWV1ZV9pbmZvX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF9zZXFfcXVldWVfaW5mb19hbGxvY2EocHRyKSBcCisJX19zbmRfYWxsb2NhKHB0ciwgc25kX3NlcV9xdWV1ZV9pbmZvKQoraW50IHNuZF9zZXFfcXVldWVfaW5mb19tYWxsb2Moc25kX3NlcV9xdWV1ZV9pbmZvX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXVlX2luZm9fZnJlZShzbmRfc2VxX3F1ZXVlX2luZm9fdCAqcHRyKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV9pbmZvX2NvcHkoc25kX3NlcV9xdWV1ZV9pbmZvX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9xdWV1ZV9pbmZvX3QgKnNyYyk7CisKK2ludCBzbmRfc2VxX3F1ZXVlX2luZm9fZ2V0X3F1ZXVlKGNvbnN0IHNuZF9zZXFfcXVldWVfaW5mb190ICppbmZvKTsKK2NvbnN0IGNoYXIgKnNuZF9zZXFfcXVldWVfaW5mb19nZXRfbmFtZShjb25zdCBzbmRfc2VxX3F1ZXVlX2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9xdWV1ZV9pbmZvX2dldF9vd25lcihjb25zdCBzbmRfc2VxX3F1ZXVlX2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9xdWV1ZV9pbmZvX2dldF9sb2NrZWQoY29uc3Qgc25kX3NlcV9xdWV1ZV9pbmZvX3QgKmluZm8pOwordW5zaWduZWQgaW50IHNuZF9zZXFfcXVldWVfaW5mb19nZXRfZmxhZ3MoY29uc3Qgc25kX3NlcV9xdWV1ZV9pbmZvX3QgKmluZm8pOworCit2b2lkIHNuZF9zZXFfcXVldWVfaW5mb19zZXRfbmFtZShzbmRfc2VxX3F1ZXVlX2luZm9fdCAqaW5mbywgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIHNuZF9zZXFfcXVldWVfaW5mb19zZXRfb3duZXIoc25kX3NlcV9xdWV1ZV9pbmZvX3QgKmluZm8sIGludCBvd25lcik7Cit2b2lkIHNuZF9zZXFfcXVldWVfaW5mb19zZXRfbG9ja2VkKHNuZF9zZXFfcXVldWVfaW5mb190ICppbmZvLCBpbnQgbG9ja2VkKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV9pbmZvX3NldF9mbGFncyhzbmRfc2VxX3F1ZXVlX2luZm9fdCAqaW5mbywgdW5zaWduZWQgaW50IGZsYWdzKTsKKworaW50IHNuZF9zZXFfY3JlYXRlX3F1ZXVlKHNuZF9zZXFfdCAqc2VxLCBzbmRfc2VxX3F1ZXVlX2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9hbGxvY19uYW1lZF9xdWV1ZShzbmRfc2VxX3QgKnNlcSwgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgc25kX3NlcV9hbGxvY19xdWV1ZShzbmRfc2VxX3QgKmhhbmRsZSk7CitpbnQgc25kX3NlcV9mcmVlX3F1ZXVlKHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgcSk7CitpbnQgc25kX3NlcV9nZXRfcXVldWVfaW5mbyhzbmRfc2VxX3QgKnNlcSwgaW50IHEsIHNuZF9zZXFfcXVldWVfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3NldF9xdWV1ZV9pbmZvKHNuZF9zZXFfdCAqc2VxLCBpbnQgcSwgc25kX3NlcV9xdWV1ZV9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVlcnlfbmFtZWRfcXVldWUoc25kX3NlcV90ICpzZXEsIGNvbnN0IGNoYXIgKm5hbWUpOworCitpbnQgc25kX3NlcV9nZXRfcXVldWVfdXNhZ2Uoc25kX3NlcV90ICpoYW5kbGUsIGludCBxKTsKK2ludCBzbmRfc2VxX3NldF9xdWV1ZV91c2FnZShzbmRfc2VxX3QgKmhhbmRsZSwgaW50IHEsIGludCB1c2VkKTsKKworLyoKKyAqLworc2l6ZV90IHNuZF9zZXFfcXVldWVfc3RhdHVzX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSBhICNzbmRfc2VxX3F1ZXVlX3N0YXR1c190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX3F1ZXVlX3N0YXR1c19hbGxvY2EocHRyKSBcCisJX19zbmRfYWxsb2NhKHB0ciwgc25kX3NlcV9xdWV1ZV9zdGF0dXMpCitpbnQgc25kX3NlcV9xdWV1ZV9zdGF0dXNfbWFsbG9jKHNuZF9zZXFfcXVldWVfc3RhdHVzX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXVlX3N0YXR1c19mcmVlKHNuZF9zZXFfcXVldWVfc3RhdHVzX3QgKnB0cik7Cit2b2lkIHNuZF9zZXFfcXVldWVfc3RhdHVzX2NvcHkoc25kX3NlcV9xdWV1ZV9zdGF0dXNfdCAqZHN0LCBjb25zdCBzbmRfc2VxX3F1ZXVlX3N0YXR1c190ICpzcmMpOworCitpbnQgc25kX3NlcV9xdWV1ZV9zdGF0dXNfZ2V0X3F1ZXVlKGNvbnN0IHNuZF9zZXFfcXVldWVfc3RhdHVzX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVldWVfc3RhdHVzX2dldF9ldmVudHMoY29uc3Qgc25kX3NlcV9xdWV1ZV9zdGF0dXNfdCAqaW5mbyk7CitzbmRfc2VxX3RpY2tfdGltZV90IHNuZF9zZXFfcXVldWVfc3RhdHVzX2dldF90aWNrX3RpbWUoY29uc3Qgc25kX3NlcV9xdWV1ZV9zdGF0dXNfdCAqaW5mbyk7Citjb25zdCBzbmRfc2VxX3JlYWxfdGltZV90ICpzbmRfc2VxX3F1ZXVlX3N0YXR1c19nZXRfcmVhbF90aW1lKGNvbnN0IHNuZF9zZXFfcXVldWVfc3RhdHVzX3QgKmluZm8pOwordW5zaWduZWQgaW50IHNuZF9zZXFfcXVldWVfc3RhdHVzX2dldF9zdGF0dXMoY29uc3Qgc25kX3NlcV9xdWV1ZV9zdGF0dXNfdCAqaW5mbyk7CisKK2ludCBzbmRfc2VxX2dldF9xdWV1ZV9zdGF0dXMoc25kX3NlcV90ICpoYW5kbGUsIGludCBxLCBzbmRfc2VxX3F1ZXVlX3N0YXR1c190ICpzdGF0dXMpOworCisvKgorICovCitzaXplX3Qgc25kX3NlcV9xdWV1ZV90ZW1wb19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9xdWV1ZV90ZW1wb190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX3F1ZXVlX3RlbXBvX2FsbG9jYShwdHIpIFwKKwlfX3NuZF9hbGxvY2EocHRyLCBzbmRfc2VxX3F1ZXVlX3RlbXBvKQoraW50IHNuZF9zZXFfcXVldWVfdGVtcG9fbWFsbG9jKHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqKnB0cik7Cit2b2lkIHNuZF9zZXFfcXVldWVfdGVtcG9fZnJlZShzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKnB0cik7Cit2b2lkIHNuZF9zZXFfcXVldWVfdGVtcG9fY29weShzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9xdWV1ZV90ZW1wb190ICpzcmMpOworCitpbnQgc25kX3NlcV9xdWV1ZV90ZW1wb19nZXRfcXVldWUoY29uc3Qgc25kX3NlcV9xdWV1ZV90ZW1wb190ICppbmZvKTsKK3Vuc2lnbmVkIGludCBzbmRfc2VxX3F1ZXVlX3RlbXBvX2dldF90ZW1wbyhjb25zdCBzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVldWVfdGVtcG9fZ2V0X3BwcShjb25zdCBzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKmluZm8pOwordW5zaWduZWQgaW50IHNuZF9zZXFfcXVldWVfdGVtcG9fZ2V0X3NrZXcoY29uc3Qgc25kX3NlcV9xdWV1ZV90ZW1wb190ICppbmZvKTsKK3Vuc2lnbmVkIGludCBzbmRfc2VxX3F1ZXVlX3RlbXBvX2dldF9za2V3X2Jhc2UoY29uc3Qgc25kX3NlcV9xdWV1ZV90ZW1wb190ICppbmZvKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV90ZW1wb19zZXRfdGVtcG8oc25kX3NlcV9xdWV1ZV90ZW1wb190ICppbmZvLCB1bnNpZ25lZCBpbnQgdGVtcG8pOwordm9pZCBzbmRfc2VxX3F1ZXVlX3RlbXBvX3NldF9wcHEoc25kX3NlcV9xdWV1ZV90ZW1wb190ICppbmZvLCBpbnQgcHBxKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV90ZW1wb19zZXRfc2tldyhzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKmluZm8sIHVuc2lnbmVkIGludCBza2V3KTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV90ZW1wb19zZXRfc2tld19iYXNlKHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqaW5mbywgdW5zaWduZWQgaW50IGJhc2UpOworCitpbnQgc25kX3NlcV9nZXRfcXVldWVfdGVtcG8oc25kX3NlcV90ICpoYW5kbGUsIGludCBxLCBzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKnRlbXBvKTsKK2ludCBzbmRfc2VxX3NldF9xdWV1ZV90ZW1wbyhzbmRfc2VxX3QgKmhhbmRsZSwgaW50IHEsIHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqdGVtcG8pOworCisvKgorICovCisKKy8qKiBzZXF1ZW5jZXIgdGltZXIgc291cmNlcyAqLwordHlwZWRlZiBlbnVtIHsKKwlTTkRfU0VRX1RJTUVSX0FMU0EgPSAwLAkJLyogQUxTQSB0aW1lciAqLworCVNORF9TRVFfVElNRVJfTUlESV9DTE9DSyA9IDEsCS8qIE1pZGkgQ2xvY2sgKENMT0NLIGV2ZW50KSAqLworCVNORF9TRVFfVElNRVJfTUlESV9USUNLID0gMgkvKiBNaWRpIFRpbWVyIFRpY2sgKFRJQ0sgZXZlbnQgKi8KK30gc25kX3NlcV9xdWV1ZV90aW1lcl90eXBlX3Q7CisKK3NpemVfdCBzbmRfc2VxX3F1ZXVlX3RpbWVyX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSBhICNzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF9zZXFfcXVldWVfdGltZXJfYWxsb2NhKHB0cikgXAorCV9fc25kX2FsbG9jYShwdHIsIHNuZF9zZXFfcXVldWVfdGltZXIpCitpbnQgc25kX3NlcV9xdWV1ZV90aW1lcl9tYWxsb2Moc25kX3NlcV9xdWV1ZV90aW1lcl90ICoqcHRyKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV90aW1lcl9mcmVlKHNuZF9zZXFfcXVldWVfdGltZXJfdCAqcHRyKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV90aW1lcl9jb3B5KHNuZF9zZXFfcXVldWVfdGltZXJfdCAqZHN0LCBjb25zdCBzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgKnNyYyk7CisKK2ludCBzbmRfc2VxX3F1ZXVlX3RpbWVyX2dldF9xdWV1ZShjb25zdCBzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgKmluZm8pOworc25kX3NlcV9xdWV1ZV90aW1lcl90eXBlX3Qgc25kX3NlcV9xdWV1ZV90aW1lcl9nZXRfdHlwZShjb25zdCBzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgKmluZm8pOworY29uc3Qgc25kX3RpbWVyX2lkX3QgKnNuZF9zZXFfcXVldWVfdGltZXJfZ2V0X2lkKGNvbnN0IHNuZF9zZXFfcXVldWVfdGltZXJfdCAqaW5mbyk7Cit1bnNpZ25lZCBpbnQgc25kX3NlcV9xdWV1ZV90aW1lcl9nZXRfcmVzb2x1dGlvbihjb25zdCBzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgKmluZm8pOworCit2b2lkIHNuZF9zZXFfcXVldWVfdGltZXJfc2V0X3R5cGUoc25kX3NlcV9xdWV1ZV90aW1lcl90ICppbmZvLCBzbmRfc2VxX3F1ZXVlX3RpbWVyX3R5cGVfdCB0eXBlKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV90aW1lcl9zZXRfaWQoc25kX3NlcV9xdWV1ZV90aW1lcl90ICppbmZvLCBjb25zdCBzbmRfdGltZXJfaWRfdCAqaWQpOwordm9pZCBzbmRfc2VxX3F1ZXVlX3RpbWVyX3NldF9yZXNvbHV0aW9uKHNuZF9zZXFfcXVldWVfdGltZXJfdCAqaW5mbywgdW5zaWduZWQgaW50IHJlc29sdXRpb24pOworCitpbnQgc25kX3NlcV9nZXRfcXVldWVfdGltZXIoc25kX3NlcV90ICpoYW5kbGUsIGludCBxLCBzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgKnRpbWVyKTsKK2ludCBzbmRfc2VxX3NldF9xdWV1ZV90aW1lcihzbmRfc2VxX3QgKmhhbmRsZSwgaW50IHEsIHNuZF9zZXFfcXVldWVfdGltZXJfdCAqdGltZXIpOworCisvKiogXH0gKi8KKworLyoqCisgKiAgXGRlZmdyb3VwIFNlcUV2ZW50IFNlcXVlbmNlciBFdmVudCBBUEkKKyAqICBTZXF1ZW5jZXIgRXZlbnQgQVBJCisgKiAgXGluZ3JvdXAgU2VxdWVuY2VyCisgKiAgXHsKKyAqLworCitpbnQgc25kX3NlcV9mcmVlX2V2ZW50KHNuZF9zZXFfZXZlbnRfdCAqZXYpOworc3NpemVfdCBzbmRfc2VxX2V2ZW50X2xlbmd0aChzbmRfc2VxX2V2ZW50X3QgKmV2KTsKK2ludCBzbmRfc2VxX2V2ZW50X291dHB1dChzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9ldmVudF90ICpldik7CitpbnQgc25kX3NlcV9ldmVudF9vdXRwdXRfYnVmZmVyKHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX2V2ZW50X3QgKmV2KTsKK2ludCBzbmRfc2VxX2V2ZW50X291dHB1dF9kaXJlY3Qoc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfZXZlbnRfdCAqZXYpOworaW50IHNuZF9zZXFfZXZlbnRfaW5wdXQoc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfZXZlbnRfdCAqKmV2KTsKK2ludCBzbmRfc2VxX2V2ZW50X2lucHV0X3BlbmRpbmcoc25kX3NlcV90ICpzZXEsIGludCBmZXRjaF9zZXF1ZW5jZXIpOworaW50IHNuZF9zZXFfZHJhaW5fb3V0cHV0KHNuZF9zZXFfdCAqaGFuZGxlKTsKK2ludCBzbmRfc2VxX2V2ZW50X291dHB1dF9wZW5kaW5nKHNuZF9zZXFfdCAqc2VxKTsKK2ludCBzbmRfc2VxX2V4dHJhY3Rfb3V0cHV0KHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX2V2ZW50X3QgKipldik7CitpbnQgc25kX3NlcV9kcm9wX291dHB1dChzbmRfc2VxX3QgKmhhbmRsZSk7CitpbnQgc25kX3NlcV9kcm9wX291dHB1dF9idWZmZXIoc25kX3NlcV90ICpoYW5kbGUpOworaW50IHNuZF9zZXFfZHJvcF9pbnB1dChzbmRfc2VxX3QgKmhhbmRsZSk7CitpbnQgc25kX3NlcV9kcm9wX2lucHV0X2J1ZmZlcihzbmRfc2VxX3QgKmhhbmRsZSk7CisKKy8qKiBldmVudCByZW1vdmFsIGNvbmRpdGlvbmFscyAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9zZXFfcmVtb3ZlX2V2ZW50cyBzbmRfc2VxX3JlbW92ZV9ldmVudHNfdDsKKworLyoqIFJlbW92ZSBjb25kaXRpb25hbCBmbGFncyAqLworI2RlZmluZSBTTkRfU0VRX1JFTU9WRV9JTlBVVAkJKDE8PDApCS8qKjwgRmx1c2ggaW5wdXQgcXVldWVzICovCisjZGVmaW5lIFNORF9TRVFfUkVNT1ZFX09VVFBVVAkJKDE8PDEpCS8qKjwgRmx1c2ggb3V0cHV0IHF1ZXVlcyAqLworI2RlZmluZSBTTkRfU0VRX1JFTU9WRV9ERVNUCQkoMTw8MikJLyoqPCBSZXN0cmljdCBieSBkZXN0aW5hdGlvbiBxOmNsaWVudDpwb3J0ICovCisjZGVmaW5lIFNORF9TRVFfUkVNT1ZFX0RFU1RfQ0hBTk5FTAkoMTw8MykJLyoqPCBSZXN0cmljdCBieSBjaGFubmVsICovCisjZGVmaW5lIFNORF9TRVFfUkVNT1ZFX1RJTUVfQkVGT1JFCSgxPDw0KQkvKio8IFJlc3RyaWN0IHRvIGJlZm9yZSB0aW1lICovCisjZGVmaW5lIFNORF9TRVFfUkVNT1ZFX1RJTUVfQUZURVIJKDE8PDUpCS8qKjwgUmVzdHJpY3QgdG8gdGltZSBvciBhZnRlciAqLworI2RlZmluZSBTTkRfU0VRX1JFTU9WRV9USU1FX1RJQ0sJKDE8PDYpCS8qKjwgVGltZSBpcyBpbiB0aWNrcyAqLworI2RlZmluZSBTTkRfU0VRX1JFTU9WRV9FVkVOVF9UWVBFCSgxPDw3KQkvKio8IFJlc3RyaWN0IHRvIGV2ZW50IHR5cGUgKi8KKyNkZWZpbmUgU05EX1NFUV9SRU1PVkVfSUdOT1JFX09GRiAJKDE8PDgpCS8qKjwgRG8gbm90IGZsdXNoIG9mZiBldmVudHMgKi8KKyNkZWZpbmUgU05EX1NFUV9SRU1PVkVfVEFHX01BVENIIAkoMTw8OSkJLyoqPCBSZXN0cmljdCB0byBldmVudHMgd2l0aCBnaXZlbiB0YWcgKi8KKworc2l6ZV90IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19hbGxvY2EocHRyKSBcCisJX19zbmRfYWxsb2NhKHB0ciwgc25kX3NlcV9yZW1vdmVfZXZlbnRzKQoraW50IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19tYWxsb2Moc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfZnJlZShzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqcHRyKTsKK3ZvaWQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX2NvcHkoc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKnNyYyk7CisKK3Vuc2lnbmVkIGludCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfZ2V0X2NvbmRpdGlvbihjb25zdCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX2dldF9xdWV1ZShjb25zdCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbyk7Citjb25zdCBzbmRfc2VxX3RpbWVzdGFtcF90ICpzbmRfc2VxX3JlbW92ZV9ldmVudHNfZ2V0X3RpbWUoY29uc3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8pOworY29uc3Qgc25kX3NlcV9hZGRyX3QgKnNuZF9zZXFfcmVtb3ZlX2V2ZW50c19nZXRfZGVzdChjb25zdCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX2dldF9jaGFubmVsKGNvbnN0IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICppbmZvKTsKK2ludCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfZ2V0X2V2ZW50X3R5cGUoY29uc3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8pOworaW50IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19nZXRfdGFnKGNvbnN0IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICppbmZvKTsKKwordm9pZCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfc2V0X2NvbmRpdGlvbihzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbywgdW5zaWduZWQgaW50IGZsYWdzKTsKK3ZvaWQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3NldF9xdWV1ZShzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbywgaW50IHF1ZXVlKTsKK3ZvaWQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3NldF90aW1lKHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICppbmZvLCBjb25zdCBzbmRfc2VxX3RpbWVzdGFtcF90ICp0aW1lKTsKK3ZvaWQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3NldF9kZXN0KHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICppbmZvLCBjb25zdCBzbmRfc2VxX2FkZHJfdCAqYWRkcik7Cit2b2lkIHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19zZXRfY2hhbm5lbChzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbywgaW50IGNoYW5uZWwpOwordm9pZCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfc2V0X2V2ZW50X3R5cGUoc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8sIGludCB0eXBlKTsKK3ZvaWQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3NldF90YWcoc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8sIGludCB0YWcpOworCitpbnQgc25kX3NlcV9yZW1vdmVfZXZlbnRzKHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbyk7CisKKy8qKiBcfSAqLworCisvKioKKyAqICBcZGVmZ3JvdXAgU2VxTWlzYyBTZXF1ZW5jZXIgTWlzY2VsbGFuZW91cworICogIFNlcXVlbmNlciBNaXNjZWxsYW5lb3VzCisgKiAgXGluZ3JvdXAgU2VxdWVuY2VyCisgKiAgXHsKKyAqLworCit2b2lkIHNuZF9zZXFfc2V0X2JpdChpbnQgbnIsIHZvaWQgKmFycmF5KTsKK3ZvaWQgc25kX3NlcV91bnNldF9iaXQoaW50IG5yLCB2b2lkICphcnJheSk7CitpbnQgc25kX3NlcV9jaGFuZ2VfYml0KGludCBuciwgdm9pZCAqYXJyYXkpOworaW50IHNuZF9zZXFfZ2V0X2JpdChpbnQgbnIsIHZvaWQgKmFycmF5KTsKKworLyoqIFx9ICovCisKKworLyoqCisgKiAgXGRlZmdyb3VwIFNlcUV2VHlwZSBTZXF1ZW5jZXIgRXZlbnQgVHlwZSBDaGVja3MKKyAqICBTZXF1ZW5jZXIgRXZlbnQgVHlwZSBDaGVja3MKKyAqICBcaW5ncm91cCBTZXF1ZW5jZXIKKyAqICBceworICovCisKKy8qIGV2ZW50IHR5cGUgbWFjcm9zICovCitlbnVtIHsKKwlTTkRfU0VRX0VWRkxHX1JFU1VMVCwKKwlTTkRfU0VRX0VWRkxHX05PVEUsCisJU05EX1NFUV9FVkZMR19DT05UUk9MLAorCVNORF9TRVFfRVZGTEdfUVVFVUUsCisJU05EX1NFUV9FVkZMR19TWVNURU0sCisJU05EX1NFUV9FVkZMR19NRVNTQUdFLAorCVNORF9TRVFfRVZGTEdfQ09OTkVDVElPTiwKKwlTTkRfU0VRX0VWRkxHX1NBTVBMRSwKKwlTTkRfU0VRX0VWRkxHX1VTRVJTLAorCVNORF9TRVFfRVZGTEdfSU5TVFIsCisJU05EX1NFUV9FVkZMR19RVU9URSwKKwlTTkRfU0VRX0VWRkxHX05PTkUsCisJU05EX1NFUV9FVkZMR19SQVcsCisJU05EX1NFUV9FVkZMR19GSVhFRCwKKwlTTkRfU0VRX0VWRkxHX1ZBUklBQkxFLAorCVNORF9TRVFfRVZGTEdfVkFSVVNSCit9OworCitlbnVtIHsKKwlTTkRfU0VRX0VWRkxHX05PVEVfT05FQVJHLAorCVNORF9TRVFfRVZGTEdfTk9URV9UV09BUkcKK307CisKK2VudW0geworCVNORF9TRVFfRVZGTEdfUVVFVUVfTk9BUkcsCisJU05EX1NFUV9FVkZMR19RVUVVRV9USUNLLAorCVNORF9TRVFfRVZGTEdfUVVFVUVfVElNRSwKKwlTTkRfU0VRX0VWRkxHX1FVRVVFX1ZBTFVFCit9OworCisvKioKKyAqIEV4cG9ydGVkIGV2ZW50IHR5cGUgdGFibGUKKyAqCisgKiBUaGlzIHRhYmxlIGlzIHJlZmVycmVkIGJ5IHNuZF9zZXFfZXZfaXNfeHh4LgorICovCitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50IHNuZF9zZXFfZXZlbnRfdHlwZXNbXTsKKworI2RlZmluZSBfU05EX1NFUV9UWVBFKHgpCSgxPDwoeCkpCS8qKjwgbWFzdGVyIHR5cGUgLSAyNGJpdCAqLworI2RlZmluZSBfU05EX1NFUV9UWVBFX09QVCh4KQkoKHgpPDwyNCkJLyoqPCBvcHRpb25hbCB0eXBlIC0gOGJpdCAqLworCisvKiogY2hlY2sgdGhlIGV2ZW50IHR5cGUgKi8KKyNkZWZpbmUgc25kX3NlcV90eXBlX2NoZWNrKGV2LHgpIChzbmRfc2VxX2V2ZW50X3R5cGVzWyhldiktPnR5cGVdICYgX1NORF9TRVFfVFlQRSh4KSkKKworLyoqIGV2ZW50IHR5cGUgY2hlY2s6IHJlc3VsdCBldmVudHMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19yZXN1bHRfdHlwZShldikgXAorCXNuZF9zZXFfdHlwZV9jaGVjayhldiwgU05EX1NFUV9FVkZMR19SRVNVTFQpCisvKiogZXZlbnQgdHlwZSBjaGVjazogbm90ZSBldmVudHMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19ub3RlX3R5cGUoZXYpIFwKKwlzbmRfc2VxX3R5cGVfY2hlY2soZXYsIFNORF9TRVFfRVZGTEdfTk9URSkKKy8qKiBldmVudCB0eXBlIGNoZWNrOiBjb250cm9sIGV2ZW50cyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX2NvbnRyb2xfdHlwZShldikgXAorCXNuZF9zZXFfdHlwZV9jaGVjayhldiwgU05EX1NFUV9FVkZMR19DT05UUk9MKQorLyoqIGV2ZW50IHR5cGUgY2hlY2s6IGNoYW5uZWwgc3BlY2lmaWMgZXZlbnRzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfY2hhbm5lbF90eXBlKGV2KSBcCisJKHNuZF9zZXFfZXZlbnRfdHlwZXNbKGV2KS0+dHlwZV0gJiAoX1NORF9TRVFfVFlQRShTTkRfU0VRX0VWRkxHX05PVEUpIHwgX1NORF9TRVFfVFlQRShTTkRfU0VRX0VWRkxHX0NPTlRST0wpKSkKKworLyoqIGV2ZW50IHR5cGUgY2hlY2s6IHF1ZXVlIGNvbnRyb2wgZXZlbnRzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfcXVldWVfdHlwZShldikgXAorCXNuZF9zZXFfdHlwZV9jaGVjayhldiwgU05EX1NFUV9FVkZMR19RVUVVRSkKKy8qKiBldmVudCB0eXBlIGNoZWNrOiBzeXN0ZW0gc3RhdHVzIG1lc3NhZ2VzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfbWVzc2FnZV90eXBlKGV2KSBcCisJc25kX3NlcV90eXBlX2NoZWNrKGV2LCBTTkRfU0VRX0VWRkxHX01FU1NBR0UpCisvKiogZXZlbnQgdHlwZSBjaGVjazogc3lzdGVtIHN0YXR1cyBtZXNzYWdlcyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3N1YnNjcmliZV90eXBlKGV2KSBcCisJc25kX3NlcV90eXBlX2NoZWNrKGV2LCBTTkRfU0VRX0VWRkxHX0NPTk5FQ1RJT04pCisvKiogZXZlbnQgdHlwZSBjaGVjazogc2FtcGxlIG1lc3NhZ2VzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfc2FtcGxlX3R5cGUoZXYpIFwKKwlzbmRfc2VxX3R5cGVfY2hlY2soZXYsIFNORF9TRVFfRVZGTEdfU0FNUExFKQorLyoqIGV2ZW50IHR5cGUgY2hlY2s6IHVzZXItZGVmaW5lZCBtZXNzYWdlcyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3VzZXJfdHlwZShldikgXAorCXNuZF9zZXFfdHlwZV9jaGVjayhldiwgU05EX1NFUV9FVkZMR19VU0VSUykKKy8qKiBldmVudCB0eXBlIGNoZWNrOiBpbnN0cnVtZW50IGxheWVyIGV2ZW50cyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX2luc3RyX3R5cGUoZXYpIFwKKwlzbmRfc2VxX3R5cGVfY2hlY2soZXYsIFNORF9TRVFfRVZGTEdfSU5TVFIpCisvKiogZXZlbnQgdHlwZSBjaGVjazogZml4ZWQgbGVuZ3RoIGV2ZW50cyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX2ZpeGVkX3R5cGUoZXYpIFwKKwlzbmRfc2VxX3R5cGVfY2hlY2soZXYsIFNORF9TRVFfRVZGTEdfRklYRUQpCisvKiogZXZlbnQgdHlwZSBjaGVjazogdmFyaWFibGUgbGVuZ3RoIGV2ZW50cyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3ZhcmlhYmxlX3R5cGUoZXYpCVwKKwlzbmRfc2VxX3R5cGVfY2hlY2soZXYsIFNORF9TRVFfRVZGTEdfVkFSSUFCTEUpCisvKiogZXZlbnQgdHlwZSBjaGVjazogdXNlciBwb2ludGVyIGV2ZW50cyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3ZhcnVzcl90eXBlKGV2KSBcCisJc25kX3NlcV90eXBlX2NoZWNrKGV2LCBTTkRfU0VRX0VWRkxHX1ZBUlVTUikKKy8qKiBldmVudCB0eXBlIGNoZWNrOiByZXNlcnZlZCBmb3Iga2VybmVsICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfcmVzZXJ2ZWQoZXYpIFwKKwkoISBzbmRfc2VxX2V2ZW50X3R5cGVzWyhldiktPnR5cGVdKQorCisvKioKKyAqIG1hY3JvcyB0byBjaGVjayBldmVudCBmbGFncworICovCisvKiogcHJpb3IgZXZlbnRzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfcHJpb3IoZXYpCVwKKwkoKChldiktPmZsYWdzICYgU05EX1NFUV9QUklPUklUWV9NQVNLKSA9PSBTTkRfU0VRX1BSSU9SSVRZX0hJR0gpCisKKy8qKiBnZXQgdGhlIGRhdGEgbGVuZ3RoIHR5cGUgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9sZW5ndGhfdHlwZShldikgXAorCSgoZXYpLT5mbGFncyAmIFNORF9TRVFfRVZFTlRfTEVOR1RIX01BU0spCisvKiogZml4ZWQgbGVuZ3RoIGV2ZW50cyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX2ZpeGVkKGV2KQlcCisJKHNuZF9zZXFfZXZfbGVuZ3RoX3R5cGUoZXYpID09IFNORF9TRVFfRVZFTlRfTEVOR1RIX0ZJWEVEKQorLyoqIHZhcmlhYmxlIGxlbmd0aCBldmVudHMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc192YXJpYWJsZShldikgXAorCShzbmRfc2VxX2V2X2xlbmd0aF90eXBlKGV2KSA9PSBTTkRfU0VRX0VWRU5UX0xFTkdUSF9WQVJJQUJMRSkKKy8qKiB2YXJpYWJsZSBsZW5ndGggb24gdXNlci1zcGFjZSAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3ZhcnVzcihldikgXAorCShzbmRfc2VxX2V2X2xlbmd0aF90eXBlKGV2KSA9PSBTTkRfU0VRX0VWRU5UX0xFTkdUSF9WQVJVU1IpCisKKy8qKiB0aW1lLXN0YW1wIHR5cGUgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl90aW1lc3RhbXBfdHlwZShldikgXAorCSgoZXYpLT5mbGFncyAmIFNORF9TRVFfVElNRV9TVEFNUF9NQVNLKQorLyoqIGV2ZW50IGlzIGluIHRpY2sgdGltZSAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3RpY2soZXYpIFwKKwkoc25kX3NlcV9ldl90aW1lc3RhbXBfdHlwZShldikgPT0gU05EX1NFUV9USU1FX1NUQU1QX1RJQ0spCisvKiogZXZlbnQgaXMgaW4gcmVhbC10aW1lICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfcmVhbChldikgXAorCShzbmRfc2VxX2V2X3RpbWVzdGFtcF90eXBlKGV2KSA9PSBTTkRfU0VRX1RJTUVfU1RBTVBfUkVBTCkKKworLyoqIHRpbWUtbW9kZSB0eXBlICovCisjZGVmaW5lIHNuZF9zZXFfZXZfdGltZW1vZGVfdHlwZShldikgXAorCSgoZXYpLT5mbGFncyAmIFNORF9TRVFfVElNRV9NT0RFX01BU0spCisvKiogc2NoZWR1bGVkIGluIGFic29sdXRlIHRpbWUgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19hYnN0aW1lKGV2KSBcCisJKHNuZF9zZXFfZXZfdGltZW1vZGVfdHlwZShldikgPT0gU05EX1NFUV9USU1FX01PREVfQUJTKQorLyoqIHNjaGVkdWxlZCBpbiByZWxhdGl2ZSB0aW1lICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfcmVsdGltZShldikgXAorCShzbmRfc2VxX2V2X3RpbWVtb2RlX3R5cGUoZXYpID09IFNORF9TRVFfVElNRV9NT0RFX1JFTCkKKworLyoqIGRpcmVjdCBkaXNwYXRjaGVkIGV2ZW50cyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX2RpcmVjdChldikgXAorCSgoZXYpLT5xdWV1ZSA9PSBTTkRfU0VRX1FVRVVFX0RJUkVDVCkKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfU0VRX0ggKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NlcV9ldmVudC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NlcV9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4M2YxZDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxX2V2ZW50LmgKQEAgLTAsMCArMSwzMTkgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9zZXFfZXZlbnQuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfU0VRX0VWRU5UX0gKKyNkZWZpbmUgX19BTFNBX1NFUV9FVkVOVF9ICisKKy8qKgorICogIFxkZWZncm91cCBTZXFFdmVudHMgU2VxdWVuY2VyIEV2ZW50IERlZmluaXRpb25zCisgKiAgU2VxdWVuY2VyIEV2ZW50IERlZmluaXRpb25zCisgKiAgXGluZ3JvdXAgU2VxdWVuY2VyCisgKiAgXHsKKyAqLworCisvKioKKyAqIFNlcXVlbmNlciBldmVudCBkYXRhIHR5cGUKKyAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHNuZF9zZXFfZXZlbnRfdHlwZV90OworCisvKiogU2VxdWVuY2VyIGV2ZW50IHR5cGUgKi8KK2VudW0gc25kX3NlcV9ldmVudF90eXBlIHsKKwkvKiogc3lzdGVtIHN0YXR1czsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfcmVzdWx0X3QgKi8KKwlTTkRfU0VRX0VWRU5UX1NZU1RFTSA9IDAsCisJLyoqIHJldHVybmVkIHJlc3VsdCBzdGF0dXM7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX3Jlc3VsdF90ICovCisJU05EX1NFUV9FVkVOVF9SRVNVTFQsCisKKwkvKiogbm90ZSBvbiBhbmQgb2ZmIHdpdGggZHVyYXRpb247IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X25vdGVfdCAqLworCVNORF9TRVFfRVZFTlRfTk9URSA9IDUsCisJLyoqIG5vdGUgb247IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X25vdGVfdCAqLworCVNORF9TRVFfRVZFTlRfTk9URU9OLAorCS8qKiBub3RlIG9mZjsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfbm90ZV90ICovCisJU05EX1NFUV9FVkVOVF9OT1RFT0ZGLAorCS8qKiBrZXkgcHJlc3N1cmUgY2hhbmdlIChhZnRlcnRvdWNoKTsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfbm90ZV90ICovCisJU05EX1NFUV9FVkVOVF9LRVlQUkVTUywKKwkKKwkvKiogY29udHJvbGxlcjsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfY3RybF90ICovCisJU05EX1NFUV9FVkVOVF9DT05UUk9MTEVSID0gMTAsCisJLyoqIHByb2dyYW0gY2hhbmdlOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9jdHJsX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1BHTUNIQU5HRSwKKwkvKiogY2hhbm5lbCBwcmVzc3VyZTsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfY3RybF90ICovCisJU05EX1NFUV9FVkVOVF9DSEFOUFJFU1MsCisJLyoqIHBpdGNod2hlZWw7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmxfdDsgZGF0YSBpcyBmcm9tIC04MTkyIHRvIDgxOTEpICovCisJU05EX1NFUV9FVkVOVF9QSVRDSEJFTkQsCisJLyoqIDE0IGJpdCBjb250cm9sbGVyIHZhbHVlOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9jdHJsX3QgKi8KKwlTTkRfU0VRX0VWRU5UX0NPTlRST0wxNCwKKwkvKiogMTQgYml0IE5SUE47ICBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9jdHJsX3QgKi8KKwlTTkRfU0VRX0VWRU5UX05PTlJFR1BBUkFNLAorCS8qKiAxNCBiaXQgUlBOOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9jdHJsX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1JFR1BBUkFNLAorCisJLyoqIFNQUCB3aXRoIExTQiBhbmQgTVNCIHZhbHVlczsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfY3RybF90ICovCisJU05EX1NFUV9FVkVOVF9TT05HUE9TID0gMjAsCisJLyoqIFNvbmcgU2VsZWN0IHdpdGggc29uZyBJRCBudW1iZXI7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmxfdCAqLworCVNORF9TRVFfRVZFTlRfU09OR1NFTCwKKwkvKiogbWlkaSB0aW1lIGNvZGUgcXVhcnRlciBmcmFtZTsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfY3RybF90ICovCisJU05EX1NFUV9FVkVOVF9RRlJBTUUsCisJLyoqIFNNRiBUaW1lIFNpZ25hdHVyZSBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfY3RybF90ICovCisJU05EX1NFUV9FVkVOVF9USU1FU0lHTiwKKwkvKiogU01GIEtleSBTaWduYXR1cmUgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmxfdCAqLworCVNORF9TRVFfRVZFTlRfS0VZU0lHTiwKKwkgICAgICAgIAorCS8qKiBNSURJIFJlYWwgVGltZSBTdGFydCBtZXNzYWdlOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1NUQVJUID0gMzAsCisJLyoqIE1JREkgUmVhbCBUaW1lIENvbnRpbnVlIG1lc3NhZ2U7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2xfdCAqLworCVNORF9TRVFfRVZFTlRfQ09OVElOVUUsCisJLyoqIE1JREkgUmVhbCBUaW1lIFN0b3AgbWVzc2FnZTsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfcXVldWVfY29udHJvbF90ICovCisJU05EX1NFUV9FVkVOVF9TVE9QLAorCS8qKiBTZXQgdGljayBxdWV1ZSBwb3NpdGlvbjsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfcXVldWVfY29udHJvbF90ICovCisJU05EX1NFUV9FVkVOVF9TRVRQT1NfVElDSywKKwkvKiogU2V0IHJlYWwtdGltZSBxdWV1ZSBwb3NpdGlvbjsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfcXVldWVfY29udHJvbF90ICovCisJU05EX1NFUV9FVkVOVF9TRVRQT1NfVElNRSwKKwkvKiogKFNNRikgVGVtcG8gZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2xfdCAqLworCVNORF9TRVFfRVZFTlRfVEVNUE8sCisJLyoqIE1JREkgUmVhbCBUaW1lIENsb2NrIG1lc3NhZ2U7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2xfdCAqLworCVNORF9TRVFfRVZFTlRfQ0xPQ0ssCisJLyoqIE1JREkgUmVhbCBUaW1lIFRpY2sgbWVzc2FnZTsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfcXVldWVfY29udHJvbF90ICovCisJU05EX1NFUV9FVkVOVF9USUNLLAorCS8qKiBRdWV1ZSB0aW1lciBza2V3OyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1FVRVVFX1NLRVcsCisJLyoqIFN5bmMgcG9zaXRpb24gY2hhbmdlZDsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfcXVldWVfY29udHJvbF90ICovCisJU05EX1NFUV9FVkVOVF9TWU5DX1BPUywKKworCS8qKiBUdW5lIHJlcXVlc3Q7IGV2ZW50IGRhdGEgdHlwZSA9IG5vbmUgKi8KKwlTTkRfU0VRX0VWRU5UX1RVTkVfUkVRVUVTVCA9IDQwLAorCS8qKiBSZXNldCB0byBwb3dlci1vbiBzdGF0ZTsgZXZlbnQgZGF0YSB0eXBlID0gbm9uZSAqLworCVNORF9TRVFfRVZFTlRfUkVTRVQsCisJLyoqIEFjdGl2ZSBzZW5zaW5nIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBub25lICovCisJU05EX1NFUV9FVkVOVF9TRU5TSU5HLAorCisJLyoqIEVjaG8tYmFjayBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gYW55IHR5cGUgKi8KKwlTTkRfU0VRX0VWRU5UX0VDSE8gPSA1MCwKKwkvKiogT1NTIGVtdWxhdGlvbiByYXcgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9IGFueSB0eXBlICovCisJU05EX1NFUV9FVkVOVF9PU1MsCisKKwkvKiogTmV3IGNsaWVudCBoYXMgY29ubmVjdGVkOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9hZGRyX3QgKi8KKwlTTkRfU0VRX0VWRU5UX0NMSUVOVF9TVEFSVCA9IDYwLAorCS8qKiBDbGllbnQgaGFzIGxlZnQgdGhlIHN5c3RlbTsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfYWRkcl90ICovCisJU05EX1NFUV9FVkVOVF9DTElFTlRfRVhJVCwKKwkvKiogQ2xpZW50IHN0YXR1cy9pbmZvIGhhcyBjaGFuZ2VkOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9hZGRyX3QgKi8KKwlTTkRfU0VRX0VWRU5UX0NMSUVOVF9DSEFOR0UsCisJLyoqIE5ldyBwb3J0IHdhcyBjcmVhdGVkOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9hZGRyX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1BPUlRfU1RBUlQsCisJLyoqIFBvcnQgd2FzIGRlbGV0ZWQgZnJvbSBzeXN0ZW07IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2FkZHJfdCAqLworCVNORF9TRVFfRVZFTlRfUE9SVF9FWElULAorCS8qKiBQb3J0IHN0YXR1cy9pbmZvIGhhcyBjaGFuZ2VkOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9hZGRyX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1BPUlRfQ0hBTkdFLAorCisJLyoqIFBvcnRzIGNvbm5lY3RlZDsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfY29ubmVjdF90ICovCisJU05EX1NFUV9FVkVOVF9QT1JUX1NVQlNDUklCRUQsCisJLyoqIFBvcnRzIGRpc2Nvbm5lY3RlZDsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfY29ubmVjdF90ICovCisJU05EX1NFUV9FVkVOVF9QT1JUX1VOU1VCU0NSSUJFRCwKKworCS8qKiB1c2VyLWRlZmluZWQgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9IGFueSAoZml4ZWQgc2l6ZSkgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUjAgPSA5MCwKKwkvKiogdXNlci1kZWZpbmVkIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBhbnkgKGZpeGVkIHNpemUpICovCisJU05EX1NFUV9FVkVOVF9VU1IxLAorCS8qKiB1c2VyLWRlZmluZWQgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9IGFueSAoZml4ZWQgc2l6ZSkgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUjIsCisJLyoqIHVzZXItZGVmaW5lZCBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gYW55IChmaXhlZCBzaXplKSAqLworCVNORF9TRVFfRVZFTlRfVVNSMywKKwkvKiogdXNlci1kZWZpbmVkIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBhbnkgKGZpeGVkIHNpemUpICovCisJU05EX1NFUV9FVkVOVF9VU1I0LAorCS8qKiB1c2VyLWRlZmluZWQgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9IGFueSAoZml4ZWQgc2l6ZSkgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUjUsCisJLyoqIHVzZXItZGVmaW5lZCBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gYW55IChmaXhlZCBzaXplKSAqLworCVNORF9TRVFfRVZFTlRfVVNSNiwKKwkvKiogdXNlci1kZWZpbmVkIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBhbnkgKGZpeGVkIHNpemUpICovCisJU05EX1NFUV9FVkVOVF9VU1I3LAorCS8qKiB1c2VyLWRlZmluZWQgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9IGFueSAoZml4ZWQgc2l6ZSkgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUjgsCisJLyoqIHVzZXItZGVmaW5lZCBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gYW55IChmaXhlZCBzaXplKSAqLworCVNORF9TRVFfRVZFTlRfVVNSOSwKKworCS8qKiBzeXN0ZW0gZXhjbHVzaXZlIGRhdGEgKHZhcmlhYmxlIGxlbmd0aCk7ICBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9leHRfdCAqLworCVNORF9TRVFfRVZFTlRfU1lTRVggPSAxMzAsCisJLyoqIGVycm9yIGV2ZW50OyAgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfZXh0X3QgKi8KKwlTTkRfU0VRX0VWRU5UX0JPVU5DRSwKKwkvKiogcmVzZXJ2ZWQgZm9yIHVzZXIgYXBwczsgIGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2V4dF90ICovCisJU05EX1NFUV9FVkVOVF9VU1JfVkFSMCA9IDEzNSwKKwkvKiogcmVzZXJ2ZWQgZm9yIHVzZXIgYXBwczsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfZXh0X3QgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUl9WQVIxLAorCS8qKiByZXNlcnZlZCBmb3IgdXNlciBhcHBzOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9leHRfdCAqLworCVNORF9TRVFfRVZFTlRfVVNSX1ZBUjIsCisJLyoqIHJlc2VydmVkIGZvciB1c2VyIGFwcHM7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2V4dF90ICovCisJU05EX1NFUV9FVkVOVF9VU1JfVkFSMywKKwkvKiogcmVzZXJ2ZWQgZm9yIHVzZXIgYXBwczsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfZXh0X3QgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUl9WQVI0LAorCisJLyoqIE5PUDsgaWdub3JlZCBpbiBhbnkgY2FzZSAqLworCVNORF9TRVFfRVZFTlRfTk9ORSA9IDI1NQorfTsKKworCisvKiogU2VxdWVuY2VyIGV2ZW50IGFkZHJlc3MgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfYWRkciB7CisJdW5zaWduZWQgY2hhciBjbGllbnQ7CS8qKjwgQ2xpZW50IGlkICovCisJdW5zaWduZWQgY2hhciBwb3J0OwkvKio8IFBvcnQgaWQgKi8KK30gc25kX3NlcV9hZGRyX3Q7CisKKy8qKiBDb25uZWN0aW9uIChzdWJzY3JpcHRpb24pIGJldHdlZW4gcG9ydHMgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfY29ubmVjdCB7CisJc25kX3NlcV9hZGRyX3Qgc2VuZGVyOwkvKio8IHNlbmRlciBhZGRyZXNzICovCisJc25kX3NlcV9hZGRyX3QgZGVzdDsJLyoqPCBkZXN0aW5hdGlvbiBhZGRyZXNzICovCit9IHNuZF9zZXFfY29ubmVjdF90OworCisKKy8qKiBSZWFsLXRpbWUgZGF0YSByZWNvcmQgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfcmVhbF90aW1lIHsKKwl1bnNpZ25lZCBpbnQgdHZfc2VjOwkJLyoqPCBzZWNvbmRzICovCisJdW5zaWduZWQgaW50IHR2X25zZWM7CQkvKio8IG5hbm9zZWNvbmRzICovCit9IHNuZF9zZXFfcmVhbF90aW1lX3Q7CisKKy8qKiAoTUlESSkgVGljay10aW1lIGRhdGEgcmVjb3JkICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBzbmRfc2VxX3RpY2tfdGltZV90OworCisvKiogdW5pb25lZCB0aW1lIHN0YW1wICovCit0eXBlZGVmIHVuaW9uIHNuZF9zZXFfdGltZXN0YW1wIHsKKwlzbmRfc2VxX3RpY2tfdGltZV90IHRpY2s7CS8qKjwgdGljay10aW1lICovCisJc3RydWN0IHNuZF9zZXFfcmVhbF90aW1lIHRpbWU7CS8qKjwgcmVhbC10aW1lICovCit9IHNuZF9zZXFfdGltZXN0YW1wX3Q7CisKKworLyoqCisgKiBFdmVudCBtb2RlIGZsYWdzCisgKgorICogTk9URTogb25seSA4IGJpdHMgYXZhaWxhYmxlIQorICovCisjZGVmaW5lIFNORF9TRVFfVElNRV9TVEFNUF9USUNLCQkoMDw8MCkJLyoqPCB0aW1lc3RhbXAgaW4gY2xvY2sgdGlja3MgKi8KKyNkZWZpbmUgU05EX1NFUV9USU1FX1NUQU1QX1JFQUwJCSgxPDwwKQkvKio8IHRpbWVzdGFtcCBpbiByZWFsIHRpbWUgKi8KKyNkZWZpbmUgU05EX1NFUV9USU1FX1NUQU1QX01BU0sJCSgxPDwwKQkvKio8IG1hc2sgZm9yIHRpbWVzdGFtcCBiaXRzICovCisKKyNkZWZpbmUgU05EX1NFUV9USU1FX01PREVfQUJTCQkoMDw8MSkJLyoqPCBhYnNvbHV0ZSB0aW1lc3RhbXAgKi8KKyNkZWZpbmUgU05EX1NFUV9USU1FX01PREVfUkVMCQkoMTw8MSkJLyoqPCByZWxhdGl2ZSB0byBjdXJyZW50IHRpbWUgKi8KKyNkZWZpbmUgU05EX1NFUV9USU1FX01PREVfTUFTSwkJKDE8PDEpCS8qKjwgbWFzayBmb3IgdGltZSBtb2RlIGJpdHMgKi8KKworI2RlZmluZSBTTkRfU0VRX0VWRU5UX0xFTkdUSF9GSVhFRAkoMDw8MikJLyoqPCBmaXhlZCBldmVudCBzaXplICovCisjZGVmaW5lIFNORF9TRVFfRVZFTlRfTEVOR1RIX1ZBUklBQkxFCSgxPDwyKQkvKio8IHZhcmlhYmxlIGV2ZW50IHNpemUgKi8KKyNkZWZpbmUgU05EX1NFUV9FVkVOVF9MRU5HVEhfVkFSVVNSCSgyPDwyKQkvKio8IHZhcmlhYmxlIGV2ZW50IHNpemUgLSB1c2VyIG1lbW9yeSBzcGFjZSAqLworI2RlZmluZSBTTkRfU0VRX0VWRU5UX0xFTkdUSF9NQVNLCSgzPDwyKQkvKio8IG1hc2sgZm9yIGV2ZW50IGxlbmd0aCBiaXRzICovCisKKyNkZWZpbmUgU05EX1NFUV9QUklPUklUWV9OT1JNQUwJCSgwPDw0KQkvKio8IG5vcm1hbCBwcmlvcml0eSAqLworI2RlZmluZSBTTkRfU0VRX1BSSU9SSVRZX0hJR0gJCSgxPDw0KQkvKio8IGV2ZW50IHNob3VsZCBiZSBwcm9jZXNzZWQgYmVmb3JlIG90aGVycyAqLworI2RlZmluZSBTTkRfU0VRX1BSSU9SSVRZX01BU0sJCSgxPDw0KQkvKio8IG1hc2sgZm9yIHByaW9yaXR5IGJpdHMgKi8KKworCisvKiogTm90ZSBldmVudCAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9ldl9ub3RlIHsKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWw7CQkvKio8IGNoYW5uZWwgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciBub3RlOwkJLyoqPCBub3RlICovCisJdW5zaWduZWQgY2hhciB2ZWxvY2l0eTsJCS8qKjwgdmVsb2NpdHkgKi8KKwl1bnNpZ25lZCBjaGFyIG9mZl92ZWxvY2l0eTsJLyoqPCBub3RlLW9mZiB2ZWxvY2l0eTsgb25seSBmb3IgI1NORF9TRVFfRVZFTlRfTk9URSAqLworCXVuc2lnbmVkIGludCBkdXJhdGlvbjsJCS8qKjwgZHVyYXRpb24gdW50aWwgbm90ZS1vZmY7IG9ubHkgZm9yICNTTkRfU0VRX0VWRU5UX05PVEUgKi8KK30gc25kX3NlcV9ldl9ub3RlX3Q7CisKKy8qKiBDb250cm9sbGVyIGV2ZW50ICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2V2X2N0cmwgeworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbDsJCS8qKjwgY2hhbm5lbCBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHVudXNlZFszXTsJLyoqPCByZXNlcnZlZCAqLworCXVuc2lnbmVkIGludCBwYXJhbTsJCS8qKjwgY29udHJvbCBwYXJhbWV0ZXIgKi8KKwlzaWduZWQgaW50IHZhbHVlOwkJLyoqPCBjb250cm9sIHZhbHVlICovCit9IHNuZF9zZXFfZXZfY3RybF90OworCisvKiogZ2VuZXJpYyBzZXQgb2YgYnl0ZXMgKDEyeDggYml0KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9ldl9yYXc4IHsKKwl1bnNpZ25lZCBjaGFyIGRbMTJdOwkJLyoqPCA4IGJpdCB2YWx1ZSAqLworfSBzbmRfc2VxX2V2X3JhdzhfdDsKKworLyoqIGdlbmVyaWMgc2V0IG9mIGludGVnZXJzICgzeDMyIGJpdCkgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfZXZfcmF3MzIgeworCXVuc2lnbmVkIGludCBkWzNdOwkJLyoqPCAzMiBiaXQgdmFsdWUgKi8KK30gc25kX3NlcV9ldl9yYXczMl90OworCisvKiogZXh0ZXJuYWwgc3RvcmVkIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfZXZfZXh0IHsKKwl1bnNpZ25lZCBpbnQgbGVuOwkJLyoqPCBsZW5ndGggb2YgZGF0YSAqLworCXZvaWQgKnB0cjsJCQkvKio8IHBvaW50ZXIgdG8gZGF0YSAobm90ZTogY2FuIGJlIDY0LWJpdCkgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc25kX3NlcV9ldl9leHRfdDsKKworLyoqIFJlc3VsdCBldmVudHMgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfcmVzdWx0IHsKKwlpbnQgZXZlbnQ7CQkvKio8IHByb2Nlc3NlZCBldmVudCB0eXBlICovCisJaW50IHJlc3VsdDsJCS8qKjwgc3RhdHVzICovCit9IHNuZF9zZXFfcmVzdWx0X3Q7CisKKy8qKiBRdWV1ZSBza2V3IHZhbHVlcyAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9za2V3IHsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CS8qKjwgc2tldyB2YWx1ZSAqLworCXVuc2lnbmVkIGludCBiYXNlOwkvKio8IHNrZXcgYmFzZSAqLworfSBzbmRfc2VxX3F1ZXVlX3NrZXdfdDsKKworLyoqIHF1ZXVlIHRpbWVyIGNvbnRyb2wgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfZXZfcXVldWVfY29udHJvbCB7CisJdW5zaWduZWQgY2hhciBxdWV1ZTsJCQkvKio8IGFmZmVjdGVkIHF1ZXVlICovCisJdW5zaWduZWQgY2hhciB1bnVzZWRbM107CQkvKio8IHJlc2VydmVkICovCisJdW5pb24geworCQlzaWduZWQgaW50IHZhbHVlOwkJLyoqPCBhZmZlY3RlZCB2YWx1ZSAoZS5nLiB0ZW1wbykgKi8KKwkJc25kX3NlcV90aW1lc3RhbXBfdCB0aW1lOwkvKio8IHRpbWUgKi8KKwkJdW5zaWduZWQgaW50IHBvc2l0aW9uOwkJLyoqPCBzeW5jIHBvc2l0aW9uICovCisJCXNuZF9zZXFfcXVldWVfc2tld190IHNrZXc7CS8qKjwgcXVldWUgc2tldyAqLworCQl1bnNpZ25lZCBpbnQgZDMyWzJdOwkJLyoqPCBhbnkgZGF0YSAqLworCQl1bnNpZ25lZCBjaGFyIGQ4WzhdOwkJLyoqPCBhbnkgZGF0YSAqLworCX0gcGFyYW07CQkJCS8qKjwgZGF0YSB2YWx1ZSB1bmlvbiAqLworfSBzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2xfdDsKKworCisvKiogU2VxdWVuY2VyIGV2ZW50ICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2V2ZW50IHsKKwlzbmRfc2VxX2V2ZW50X3R5cGVfdCB0eXBlOwkvKio8IGV2ZW50IHR5cGUgKi8KKwl1bnNpZ25lZCBjaGFyIGZsYWdzOwkJLyoqPCBldmVudCBmbGFncyAqLworCXVuc2lnbmVkIGNoYXIgdGFnOwkJLyoqPCB0YWcgKi8KKwkKKwl1bnNpZ25lZCBjaGFyIHF1ZXVlOwkJLyoqPCBzY2hlZHVsZSBxdWV1ZSAqLworCXNuZF9zZXFfdGltZXN0YW1wX3QgdGltZTsJLyoqPCBzY2hlZHVsZSB0aW1lICovCisKKwlzbmRfc2VxX2FkZHJfdCBzb3VyY2U7CQkvKio8IHNvdXJjZSBhZGRyZXNzICovCisJc25kX3NlcV9hZGRyX3QgZGVzdDsJCS8qKjwgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCisJdW5pb24geworCQlzbmRfc2VxX2V2X25vdGVfdCBub3RlOwkJLyoqPCBub3RlIGluZm9ybWF0aW9uICovCisJCXNuZF9zZXFfZXZfY3RybF90IGNvbnRyb2w7CS8qKjwgTUlESSBjb250cm9sIGluZm9ybWF0aW9uICovCisJCXNuZF9zZXFfZXZfcmF3OF90IHJhdzg7CQkvKio8IHJhdzggZGF0YSAqLworCQlzbmRfc2VxX2V2X3JhdzMyX3QgcmF3MzI7CS8qKjwgcmF3MzIgZGF0YSAqLworCQlzbmRfc2VxX2V2X2V4dF90IGV4dDsJCS8qKjwgZXh0ZXJuYWwgZGF0YSAqLworCQlzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2xfdCBxdWV1ZTsgLyoqPCBxdWV1ZSBjb250cm9sICovCisJCXNuZF9zZXFfdGltZXN0YW1wX3QgdGltZTsJLyoqPCB0aW1lc3RhbXAgKi8KKwkJc25kX3NlcV9hZGRyX3QgYWRkcjsJCS8qKjwgYWRkcmVzcyAqLworCQlzbmRfc2VxX2Nvbm5lY3RfdCBjb25uZWN0OwkvKio8IGNvbm5lY3QgaW5mb3JtYXRpb24gKi8KKwkJc25kX3NlcV9yZXN1bHRfdCByZXN1bHQ7CS8qKjwgb3BlcmF0aW9uIHJlc3VsdCBjb2RlICovCisJfSBkYXRhOwkJCQkvKio8IGV2ZW50IGRhdGEuLi4gKi8KK30gc25kX3NlcV9ldmVudF90OworCisKKy8qKiBcfSAqLworCisjZW5kaWYgLyogX19BTFNBX1NFUV9FVkVOVF9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zZXFfbWlkaV9ldmVudC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NlcV9taWRpX2V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4ZWU1OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zZXFfbWlkaV9ldmVudC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9zZXFfbWlkaV9ldmVudC5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9TRVFfTUlESV9FVkVOVF9ICisjZGVmaW5lIF9fQUxTQV9TRVFfTUlESV9FVkVOVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIE1JRElfRXZlbnQgU2VxdWVuY2VyIGV2ZW50IDwtPiBNSURJIGJ5dGUgc3RyZWFtIGNvZGVyCisgKiAgXGluZ3JvdXAgU2VxdWVuY2VyCisgKiAgU2VxdWVuY2VyIGV2ZW50IDwtPiBNSURJIGJ5dGUgc3RyZWFtIGNvZGVyCisgKiAgXHsKKyAqLworCisvKiogY29udGFpbmVyIGZvciBzZXF1ZW5jZXIgbWlkaSBldmVudCBwYXJzZXJzICovCit0eXBlZGVmIHN0cnVjdCBzbmRfbWlkaV9ldmVudCBzbmRfbWlkaV9ldmVudF90OworCitpbnQgc25kX21pZGlfZXZlbnRfbmV3KHNpemVfdCBidWZzaXplLCBzbmRfbWlkaV9ldmVudF90ICoqcmRldik7CitpbnQgc25kX21pZGlfZXZlbnRfcmVzaXplX2J1ZmZlcihzbmRfbWlkaV9ldmVudF90ICpkZXYsIHNpemVfdCBidWZzaXplKTsKK3ZvaWQgc25kX21pZGlfZXZlbnRfZnJlZShzbmRfbWlkaV9ldmVudF90ICpkZXYpOwordm9pZCBzbmRfbWlkaV9ldmVudF9pbml0KHNuZF9taWRpX2V2ZW50X3QgKmRldik7Cit2b2lkIHNuZF9taWRpX2V2ZW50X3Jlc2V0X2VuY29kZShzbmRfbWlkaV9ldmVudF90ICpkZXYpOwordm9pZCBzbmRfbWlkaV9ldmVudF9yZXNldF9kZWNvZGUoc25kX21pZGlfZXZlbnRfdCAqZGV2KTsKK3ZvaWQgc25kX21pZGlfZXZlbnRfbm9fc3RhdHVzKHNuZF9taWRpX2V2ZW50X3QgKmRldiwgaW50IG9uKTsKKy8qIGVuY29kZSBmcm9tIGJ5dGUgc3RyZWFtIC0gcmV0dXJuIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzIGlmIHN1Y2Nlc3MgKi8KK2xvbmcgc25kX21pZGlfZXZlbnRfZW5jb2RlKHNuZF9taWRpX2V2ZW50X3QgKmRldiwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBsb25nIGNvdW50LCBzbmRfc2VxX2V2ZW50X3QgKmV2KTsKK2ludCBzbmRfbWlkaV9ldmVudF9lbmNvZGVfYnl0ZShzbmRfbWlkaV9ldmVudF90ICpkZXYsIGludCBjLCBzbmRfc2VxX2V2ZW50X3QgKmV2KTsKKy8qIGRlY29kZSBmcm9tIGV2ZW50IHRvIGJ5dGVzIC0gcmV0dXJuIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzIGlmIHN1Y2Nlc3MgKi8KK2xvbmcgc25kX21pZGlfZXZlbnRfZGVjb2RlKHNuZF9taWRpX2V2ZW50X3QgKmRldiwgdW5zaWduZWQgY2hhciAqYnVmLCBsb25nIGNvdW50LCBjb25zdCBzbmRfc2VxX2V2ZW50X3QgKmV2KTsKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfU0VRX01JRElfRVZFTlRfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxbWlkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxbWlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwNjliMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zZXFtaWQuaApAQCAtMCwwICsxLDQ5MCBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL3NlcW1pZC5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9TRVFNSURfSAorI2RlZmluZSBfX0FMU0FfU0VRTUlEX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgU2VxTWlkZGxlIFNlcXVlbmNlciBNaWRkbGUgTGV2ZWwgSW50ZXJmYWNlCisgKiAgU2VxdWVuY2VyIE1pZGRsZSBMZXZlbCBJbnRlcmZhY2UKKyAqICBcaW5ncm91cCBTZXF1ZW5jZXIKKyAqICBceworICovCisKKy8qKgorICogXGJyaWVmIGluaXRpYWxpemUgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkIHBvaW50ZXIKKyAqIAorICogVGhpcyBtYWNybyBjbGVhcnMgdGhlIGdpdmVuIGV2ZW50IHJlY29yZCBwb2ludGVyIHRvIHRoZSBkZWZhdWx0IHN0YXR1cy4KKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2NsZWFyKGV2KSBcCisJbWVtc2V0KGV2LCAwLCBzaXplb2Yoc25kX3NlcV9ldmVudF90KSkKKworLyoqCisgKiBcYnJpZWYgc2V0IHRoZSB0YWcgZm9yIGdpdmVuIGV2ZW50CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gdCBldmVudCB0YWcKKyAqCisgKiBUaGlzIG1hY3JvIHNldHMgdGhlIHRhZyB0byB0aGUgZ2l2ZW4gZXZlbnQgcmVjb3JkLgorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3RhZyhldix0KSBcCisJKChldiktPnRhZyA9ICh0KSkKKworLyoqCisgKiBcYnJpZWYgc2V0IHRoZSBleHBsaWNpdCBkZXN0aW5hdGlvbgorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIGMgZGVzdGluYXRpb24gY2xpZW50IGlkCisgKiBccGFyYW0gcCBkZXN0aW5hdGlvbiBwb3J0IGlkCisgKgorICogVGhpcyBtYWNybyBzZXRzIHRoZSBjbGllbnQgYW5kIHBvcnQgaWQgbnVtYmVycyB0byB0aGUgZ2l2ZW4gZXZlbnQgcmVjb3JkLgorICoKKyAqIFxzYSBzbmRfc2VxX2V2X3NldF9zdWJzKCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9kZXN0KGV2LGMscCkgXAorCSgoZXYpLT5kZXN0LmNsaWVudCA9IChjKSwgKGV2KS0+ZGVzdC5wb3J0ID0gKHApKQorCisvKioKKyAqIFxicmllZiBzZXQgYnJvYWRjYXN0aW5nIHRvIHN1YnNjcmliZXJzCisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKgorICogVGhpcyBtYWNybyBzZXRzIHRoZSBkZXN0aW5hdGlvbiBhcyB0aGUgc3Vic2NyaWJlcnMuCisgKgorICogXHNhIHNuZF9zZXFfZXZfc2V0X2Rlc3QoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3N1YnMoZXYpIFwKKwkoKGV2KS0+ZGVzdC5jbGllbnQgPSBTTkRfU0VRX0FERFJFU1NfU1VCU0NSSUJFUlMsXAorCSAoZXYpLT5kZXN0LnBvcnQgPSBTTkRfU0VRX0FERFJFU1NfVU5LTk9XTikKKworLyoqCisgKiBcYnJpZWYgc2V0IGJyb2FkY2FzdGluZyB0byBhbGwgY2xpZW50cy9wb3J0cworICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICoKKyAqIFRoaXMgbWFjcm8gc2V0cyB0aGUgZGVzdGluYXRpb24gYXMgdGhlIGJyb2FkY2FzdGluZy4KKyAqCisgKiBcc2Egc25kX3NlcV9ldl9zZXRfZGVzdCgpCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfYnJvYWRjYXN0KGV2KSBcCisJKChldiktPmRlc3QuY2xpZW50ID0gU05EX1NFUV9BRERSRVNTX0JST0FEQ0FTVCxcCisJIChldiktPmRlc3QucG9ydCA9IFNORF9TRVFfQUREUkVTU19CUk9BRENBU1QpCisKKy8qKgorICogXGJyaWVmIHNldCB0aGUgc291cmNlIHBvcnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBwIHNvdXJjZSBwb3J0IGlkCisgKgorICogVGhpcyBtYWNybyBzZXRzIHRoZSBzb3VyY2UgcG9ydCBpZCBudW1iZXIuCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfc291cmNlKGV2LHApIFwKKwkoKGV2KS0+c291cmNlLnBvcnQgPSAocCkpCisKKy8qKgorICogXGJyaWVmIHNldCBkaXJlY3QgcGFzc2luZyBtb2RlICh3aXRob3V0IHF1ZXVlZCkKKyAqIFxwYXJhbSBldiBldmVudCBpbnN0YW5jZQorICoKKyAqIFRoaXMgbWFjcm8gc2V0cyB0aGUgZXZlbnQgdG8gdGhlIGRpcmVjdCBwYXNzaW5nIG1vZGUKKyAqIHRvIGJlIGRlbGl2ZXJlZCBpbW1lZGlhdGVseSB3aXRob3V0IHF1ZXVlaW5nLgorICogCisgKiBcc2Egc25kX3NlcV9ldl9zY2hlZHVsZV90aWNrKCksIHNuZF9zZXFfZXZfc2NoZWR1bGVfcmVhbCgpCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfZGlyZWN0KGV2KSBcCisJKChldiktPnF1ZXVlID0gU05EX1NFUV9RVUVVRV9ESVJFQ1QpCisKKy8qKgorICogXGJyaWVmIHNldCB0aWNrLXNjaGVkdWxpbmcgbW9kZSBvbiBxdWV1ZQorICogXHBhcmFtIGV2IGV2ZW50IGluc3RhbmNlCisgKiBccGFyYW0gcSBxdWV1ZSBpZCB0byBzY2hlZHVsZQorICogXHBhcmFtIHJlbGF0aXZlIHJlbGF0aXZlIHRpbWUtc3RhbXAgaWYgbm9uLXplcm8KKyAqIFxwYXJhbSB0dGljayB0aWNrIHRpbWUtc3RhbXAgdG8gYmUgZGVsaXZlcmVkCisgKgorICogVGhpcyBtYWNybyBzZXRzIHRoZSBzY2hlZHVsaW5nIG9mIHRoZSBldmVudCBpbiB0aGUKKyAqIE1JREkgdGljayBtb2RlLgorICoKKyAqIFxzYSBzbmRfc2VxX2V2X3NjaGVkdWxlX3JlYWwoKSwgc25kX3NlcV9ldl9zZXRfZGlyZWN0KCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NjaGVkdWxlX3RpY2soZXYsIHEsIHJlbGF0aXZlLCB0dGljaykgXAorCSgoZXYpLT5mbGFncyAmPSB+KFNORF9TRVFfVElNRV9TVEFNUF9NQVNLIHwgU05EX1NFUV9USU1FX01PREVfTUFTSyksXAorCSAoZXYpLT5mbGFncyB8PSBTTkRfU0VRX1RJTUVfU1RBTVBfVElDSyxcCisJIChldiktPmZsYWdzIHw9IChyZWxhdGl2ZSkgPyBTTkRfU0VRX1RJTUVfTU9ERV9SRUwgOiBTTkRfU0VRX1RJTUVfTU9ERV9BQlMsXAorCSAoZXYpLT50aW1lLnRpY2sgPSAodHRpY2spLFwKKwkgKGV2KS0+cXVldWUgPSAocSkpCisKKy8qKgorICogXGJyaWVmIHNldCByZWFsLXRpbWUtc2NoZWR1bGluZyBtb2RlIG9uIHF1ZXVlCisgKiBccGFyYW0gZXYgZXZlbnQgaW5zdGFuY2UKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkIHRvIHNjaGVkdWxlCisgKiBccGFyYW0gcmVsYXRpdmUgcmVsYXRpdmUgdGltZS1zdGFtcCBpZiBub24temVybworICogXHBhcmFtIHJ0aW1lIHRpbWUtc3RhbXAgdG8gYmUgZGVsaXZlcmVkCisgKgorICogVGhpcyBtYWNybyBzZXRzIHRoZSBzY2hlZHVsaW5nIG9mIHRoZSBldmVudCBpbiB0aGUKKyAqIHJlYWx0aW1lIG1vZGUuCisgKgorICogXHNhIHNuZF9zZXFfZXZfc2NoZWR1bGVfdGljaygpLCBzbmRfc2VxX2V2X3NldF9kaXJlY3QoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2NoZWR1bGVfcmVhbChldiwgcSwgcmVsYXRpdmUsIHJ0aW1lKSBcCisJKChldiktPmZsYWdzICY9IH4oU05EX1NFUV9USU1FX1NUQU1QX01BU0sgfCBTTkRfU0VRX1RJTUVfTU9ERV9NQVNLKSxcCisJIChldiktPmZsYWdzIHw9IFNORF9TRVFfVElNRV9TVEFNUF9SRUFMLFwKKwkgKGV2KS0+ZmxhZ3MgfD0gKHJlbGF0aXZlKSA/IFNORF9TRVFfVElNRV9NT0RFX1JFTCA6IFNORF9TRVFfVElNRV9NT0RFX0FCUyxcCisJIChldiktPnRpbWUudGltZSA9ICoocnRpbWUpLFwKKwkgKGV2KS0+cXVldWUgPSAocSkpCisKKy8qKgorICogXGJyaWVmIHNldCBldmVudCBwcmlvcml0eQorICogXHBhcmFtIGV2IGV2ZW50IGluc3RhbmNlCisgKiBccGFyYW0gaGlnaF9wcmlvciAxIGZvciBoaWdoIHByaW9yaXR5IG1vZGUKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9wcmlvcml0eShldiwgaGlnaF9wcmlvcikgXAorCSgoZXYpLT5mbGFncyAmPSB+U05EX1NFUV9QUklPUklUWV9NQVNLLFwKKwkgKGV2KS0+ZmxhZ3MgfD0gKGhpZ2hfcHJpb3IpID8gU05EX1NFUV9QUklPUklUWV9ISUdIIDogU05EX1NFUV9QUklPUklUWV9OT1JNQUwpCisKKy8qKgorICogXGJyaWVmIHNldCBmaXhlZCBkYXRhCisgKiBccGFyYW0gZXYgZXZlbnQgaW5zdGFuY2UKKyAqCisgKiBTZXRzIHRoZSBldmVudCBsZW5ndGggbW9kZSBhcyBmaXhlZCBzaXplLgorICoKKyAqIFxzYSBzbmRfc2VxX2V2X3NldF92YXJpYWJsZSgpLCBzbmRfc2VxX2V2X3NldF92YXJ1c3IoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X2ZpeGVkKGV2KSBcCisJKChldiktPmZsYWdzICY9IH5TTkRfU0VRX0VWRU5UX0xFTkdUSF9NQVNLLFwKKwkgKGV2KS0+ZmxhZ3MgfD0gU05EX1NFUV9FVkVOVF9MRU5HVEhfRklYRUQpCisKKy8qKgorICogXGJyaWVmIHNldCB2YXJpYWJsZSBkYXRhCisgKiBccGFyYW0gZXYgZXZlbnQgaW5zdGFuY2UKKyAqIFxwYXJhbSBkYXRhbGVuIGxlbmd0aCBvZiB0aGUgZXh0ZXJuYWwgZGF0YQorICogXHBhcmFtIGRhdGFwdHIgcG9pbnRlciBvZiB0aGUgZXh0ZXJuYWwgZGF0YQorICoKKyAqIFNldHMgdGhlIGV2ZW50IGxlbmd0aCBtb2RlIGFzIHZhcmlhYmxlIGxlbmd0aCBhbmQgc3RvcmVzIHRoZSBkYXRhLgorICoKKyAqIFxzYSBzbmRfc2VxX2V2X3NldF9maXhlZCgpLCBzbmRfc2VxX2V2X3NldF92YXJ1c3IoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3ZhcmlhYmxlKGV2LCBkYXRhbGVuLCBkYXRhcHRyKSBcCisJKChldiktPmZsYWdzICY9IH5TTkRfU0VRX0VWRU5UX0xFTkdUSF9NQVNLLFwKKwkgKGV2KS0+ZmxhZ3MgfD0gU05EX1NFUV9FVkVOVF9MRU5HVEhfVkFSSUFCTEUsXAorCSAoZXYpLT5kYXRhLmV4dC5sZW4gPSAoZGF0YWxlbiksXAorCSAoZXYpLT5kYXRhLmV4dC5wdHIgPSAoZGF0YXB0cikpCisKKy8qKgorICogXGJyaWVmIHNldCB2YXJ1c3IgZGF0YQorICogXHBhcmFtIGV2IGV2ZW50IGluc3RhbmNlCisgKiBccGFyYW0gZGF0YWxlbiBsZW5ndGggb2YgdGhlIGV4dGVybmFsIGRhdGEKKyAqIFxwYXJhbSBkYXRhcHRyIHBvaW50ZXIgb2YgdGhlIGV4dGVybmFsIGRhdGEKKyAqCisgKiBTZXRzIHRoZSBldmVudCBsZW5ndGggbW9kZSBhcyB2YXJpYWJsZSB1c2VyLXNwYWNlIGRhdGEgYW5kIHN0b3JlcyB0aGUgZGF0YS4KKyAqCisgKiBcc2Egc25kX3NlcV9ldl9zZXRfZml4ZWQoKSwgc25kX3NlcV9ldl9zZXRfdmFyaWFibGUoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3ZhcnVzcihldiwgZGF0YWxlbiwgZGF0YXB0cikgXAorCSgoZXYpLT5mbGFncyAmPSB+U05EX1NFUV9FVkVOVF9MRU5HVEhfTUFTSyxcCisJIChldiktPmZsYWdzIHw9IFNORF9TRVFfRVZFTlRfTEVOR1RIX1ZBUlVTUixcCisJIChldiktPmRhdGEuZXh0LmxlbiA9IChkYXRhbGVuKSxcCisJIChldiktPmRhdGEuZXh0LnB0ciA9IChkYXRhcHRyKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IHF1ZXVlIGNvbnRyb2xzCisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gdHlwIGV2ZW50IHR5cGUKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkCisgKiBccGFyYW0gdmFsIGNvbnRyb2wgdmFsdWUKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9xdWV1ZV9jb250cm9sKGV2LCB0eXAsIHEsIHZhbCkgXAorCSgoZXYpLT50eXBlID0gKHR5cCksXAorCSBzbmRfc2VxX2V2X3NldF9kZXN0KGV2LCBTTkRfU0VRX0NMSUVOVF9TWVNURU0sIFNORF9TRVFfUE9SVF9TWVNURU1fVElNRVIpLFwKKwkgKGV2KS0+ZGF0YS5xdWV1ZS5xdWV1ZSA9IChxKSxcCisJIChldiktPmRhdGEucXVldWUucGFyYW0udmFsdWUgPSAodmFsKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IHRoZSBzdGFydCBxdWV1ZSBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIHEgcXVldWUgaWQgdG8gc3RhcnQKKyAqCisgKiBcc2Egc25kX3NlcV9ldl9zZXRfcXVldWVfc3RvcCgpLCBzbmRfc2VxX2V2X3NldF9xdWV1ZV9jb250aW51ZSgpCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfcXVldWVfc3RhcnQoZXYsIHEpIFwKKwlzbmRfc2VxX2V2X3NldF9xdWV1ZV9jb250cm9sKGV2LCBTTkRfU0VRX0VWRU5UX1NUQVJULCBxLCAwKQorCisvKioKKyAqIFxicmllZiBzZXQgdGhlIHN0b3AgcXVldWUgZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkIHRvIHN0b3AKKyAqCisgKiBcc2Egc25kX3NlcV9ldl9zZXRfcXVldWVfc3RhcnQoKSwgc25kX3NlcV9ldl9zZXRfcXVldWVfY29udGludWUoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3N0b3AoZXYsIHEpIFwKKwlzbmRfc2VxX2V2X3NldF9xdWV1ZV9jb250cm9sKGV2LCBTTkRfU0VRX0VWRU5UX1NUT1AsIHEsIDApCisKKy8qKgorICogXGJyaWVmIHNldCB0aGUgc3RvcCBxdWV1ZSBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIHEgcXVldWUgaWQgdG8gY29udGludWUKKyAqCisgKiBcc2Egc25kX3NlcV9ldl9zZXRfcXVldWVfc3RhcnQoKSwgc25kX3NlcV9ldl9zZXRfcXVldWVfc3RvcCgpCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfcXVldWVfY29udGludWUoZXYsIHEpIFwKKwlzbmRfc2VxX2V2X3NldF9xdWV1ZV9jb250cm9sKGV2LCBTTkRfU0VRX0VWRU5UX0NPTlRJTlVFLCBxLCAwKQorCisvKioKKyAqIFxicmllZiBzZXQgdGhlIHN0b3AgcXVldWUgZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkIHRvIGNoYW5nZSB0ZW1wbworICogXHBhcmFtIHZhbCB0aGUgbmV3IHRlbXBvIHZhbHVlCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfcXVldWVfdGVtcG8oZXYsIHEsIHZhbCkgXAorCXNuZF9zZXFfZXZfc2V0X3F1ZXVlX2NvbnRyb2woZXYsIFNORF9TRVFfRVZFTlRfVEVNUE8sIHEsIHZhbCkKKworLyoqCisgKiBcYnJpZWYgc2V0IHRoZSByZWFsLXRpbWUgcG9zaXRpb24gb2YgYSBxdWV1ZQorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIHEgcXVldWUgaWQgdG8gY2hhbmdlIHRlbXBvCisgKiBccGFyYW0gcnRpbWUgdGhlIG5ldyByZWFsLXRpbWUgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3Bvc19yZWFsKGV2LCBxLCBydGltZSkgXAorCSgoZXYpLT50eXBlID0gU05EX1NFUV9FVkVOVF9TRVRQT1NfVElNRSxcCisJIHNuZF9zZXFfZXZfc2V0X2Rlc3QoZXYsIFNORF9TRVFfQ0xJRU5UX1NZU1RFTSwgU05EX1NFUV9QT1JUX1NZU1RFTV9USU1FUiksXAorCSAoZXYpLT5kYXRhLnF1ZXVlLnF1ZXVlID0gKHEpLFwKKwkgKGV2KS0+ZGF0YS5xdWV1ZS5wYXJhbS50aW1lLnRpbWUgPSAqKHJ0aW1lKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IHRoZSB0aWNrLXRpbWUgcG9zaXRpb24gb2YgYSBxdWV1ZQorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIHEgcXVldWUgaWQgdG8gY2hhbmdlIHRlbXBvCisgKiBccGFyYW0gdHRpbWUgdGhlIG5ldyB0aWNrLXRpbWUKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9xdWV1ZV9wb3NfdGljayhldiwgcSwgdHRpbWUpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfU0VUUE9TX1RJQ0ssXAorCSBzbmRfc2VxX2V2X3NldF9kZXN0KGV2LCBTTkRfU0VRX0NMSUVOVF9TWVNURU0sIFNORF9TRVFfUE9SVF9TWVNURU1fVElNRVIpLFwKKwkgKGV2KS0+ZGF0YS5xdWV1ZS5xdWV1ZSA9IChxKSxcCisJIChldiktPmRhdGEucXVldWUucGFyYW0udGltZS50aWNrID0gKHR0aW1lKSkKKworLyogc2V0IGFuZCBzZW5kIGEgcXVldWUgY29udHJvbCBldmVudCAqLworaW50IHNuZF9zZXFfY29udHJvbF9xdWV1ZShzbmRfc2VxX3QgKnNlcSwgaW50IHEsIGludCB0eXBlLCBpbnQgdmFsdWUsIHNuZF9zZXFfZXZlbnRfdCAqZXYpOworCisvKioKKyAqIFxicmllZiBzdGFydCB0aGUgc3BlY2lmaWVkIHF1ZXVlCisgKiBccGFyYW0gc2VxIHNlcXVlbmNlciBoYW5kbGUKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkIHRvIHN0YXJ0CisgKiBccGFyYW0gZXYgb3B0aW9uYWwgZXZlbnQgcmVjb3JkIChzZWUgI3NuZF9zZXFfY29udHJvbF9xdWV1ZSkKKyAqLworI2RlZmluZSBzbmRfc2VxX3N0YXJ0X3F1ZXVlKHNlcSwgcSwgZXYpIFwKKwlzbmRfc2VxX2NvbnRyb2xfcXVldWUoc2VxLCBxLCBTTkRfU0VRX0VWRU5UX1NUQVJULCAwLCBldikKKworLyoqCisgKiBcYnJpZWYgc3RvcCB0aGUgc3BlY2lmaWVkIHF1ZXVlCisgKiBccGFyYW0gc2VxIHNlcXVlbmNlciBoYW5kbGUKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkIHRvIHN0b3AKKyAqIFxwYXJhbSBldiBvcHRpb25hbCBldmVudCByZWNvcmQgKHNlZSAjc25kX3NlcV9jb250cm9sX3F1ZXVlKQorICovCisjZGVmaW5lIHNuZF9zZXFfc3RvcF9xdWV1ZShzZXEsIHEsIGV2KSBcCisJc25kX3NlcV9jb250cm9sX3F1ZXVlKHNlcSwgcSwgU05EX1NFUV9FVkVOVF9TVE9QLCAwLCBldikKKworLyoqCisgKiBcYnJpZWYgY29udGludWUgdGhlIHNwZWNpZmllZCBxdWV1ZQorICogXHBhcmFtIHNlcSBzZXF1ZW5jZXIgaGFuZGxlCisgKiBccGFyYW0gcSBxdWV1ZSBpZCB0byBjb250aW51ZQorICogXHBhcmFtIGV2IG9wdGlvbmFsIGV2ZW50IHJlY29yZCAoc2VlICNzbmRfc2VxX2NvbnRyb2xfcXVldWUpCisgKi8KKyNkZWZpbmUgc25kX3NlcV9jb250aW51ZV9xdWV1ZShzZXEsIHEsIGV2KSBcCisJc25kX3NlcV9jb250cm9sX3F1ZXVlKHNlcSwgcSwgU05EX1NFUV9FVkVOVF9DT05USU5VRSwgMCwgZXYpCisKKy8qKgorICogXGJyaWVmIGNoYW5nZSB0aGUgdGVtcG8gb2YgdGhlIHNwZWNpZmllZCBxdWV1ZQorICogXHBhcmFtIHNlcSBzZXF1ZW5jZXIgaGFuZGxlCisgKiBccGFyYW0gcSBxdWV1ZSBpZAorICogXHBhcmFtIHRlbXBvIHRoZSBuZXcgdGVtcG8gdmFsdWUKKyAqIFxwYXJhbSBldiBvcHRpb25hbCBldmVudCByZWNvcmQgKHNlZSAjc25kX3NlcV9jb250cm9sX3F1ZXVlKQorICovCisjZGVmaW5lIHNuZF9zZXFfY2hhbmdlX3F1ZXVlX3RlbXBvKHNlcSwgcSwgdGVtcG8sIGV2KSBcCisJc25kX3NlcV9jb250cm9sX3F1ZXVlKHNlcSwgcSwgU05EX1NFUV9FVkVOVF9URU1QTywgdGVtcG8sIGV2KQorCisvKiBjcmVhdGUgYSBwb3J0IC0gc2ltcGxlIHZlcnNpb24gLSByZXR1cm4gdGhlIHBvcnQgbnVtYmVyICovCitpbnQgc25kX3NlcV9jcmVhdGVfc2ltcGxlX3BvcnQoc25kX3NlcV90ICpzZXEsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGNhcHMsIHVuc2lnbmVkIGludCB0eXBlKTsKKy8qIGRlbGV0ZSB0aGUgcG9ydCAqLworaW50IHNuZF9zZXFfZGVsZXRlX3NpbXBsZV9wb3J0KHNuZF9zZXFfdCAqc2VxLCBpbnQgcG9ydCk7CisKKy8qIHNpbXBsZSBzdWJzY3JpcHRpb24gYmV0d2VlbiB0aGlzIHBvcnQgYW5kIGFub3RoZXIgcG9ydAorICAgKHcvbyBleGNsdXNpdmUgJiB0aW1lIGNvbnZlcnNpb24pCisgICAqLworaW50IHNuZF9zZXFfY29ubmVjdF9mcm9tKHNuZF9zZXFfdCAqc2VxLCBpbnQgbXlfcG9ydCwgaW50IHNyY19jbGllbnQsIGludCBzcmNfcG9ydCk7CitpbnQgc25kX3NlcV9jb25uZWN0X3RvKHNuZF9zZXFfdCAqc2VxLCBpbnQgbXlfcG9ydCwgaW50IGRlc3RfY2xpZW50LCBpbnQgZGVzdF9wb3J0KTsKK2ludCBzbmRfc2VxX2Rpc2Nvbm5lY3RfZnJvbShzbmRfc2VxX3QgKnNlcSwgaW50IG15X3BvcnQsIGludCBzcmNfY2xpZW50LCBpbnQgc3JjX3BvcnQpOworaW50IHNuZF9zZXFfZGlzY29ubmVjdF90byhzbmRfc2VxX3QgKnNlcSwgaW50IG15X3BvcnQsIGludCBkZXN0X2NsaWVudCwgaW50IGRlc3RfcG9ydCk7CisKKy8qCisgKiBzZXQgY2xpZW50IGluZm9ybWF0aW9uCisgKi8KK2ludCBzbmRfc2VxX3NldF9jbGllbnRfbmFtZShzbmRfc2VxX3QgKnNlcSwgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgc25kX3NlcV9zZXRfY2xpZW50X2V2ZW50X2ZpbHRlcihzbmRfc2VxX3QgKnNlcSwgaW50IGV2ZW50X3R5cGUpOworaW50IHNuZF9zZXFfc2V0X2NsaWVudF9wb29sX291dHB1dChzbmRfc2VxX3QgKnNlcSwgc2l6ZV90IHNpemUpOworaW50IHNuZF9zZXFfc2V0X2NsaWVudF9wb29sX291dHB1dF9yb29tKHNuZF9zZXFfdCAqc2VxLCBzaXplX3Qgc2l6ZSk7CitpbnQgc25kX3NlcV9zZXRfY2xpZW50X3Bvb2xfaW5wdXQoc25kX3NlcV90ICpzZXEsIHNpemVfdCBzaXplKTsKKy8qIHN5bmMgb3V0cHV0IHF1ZXVlICovCitpbnQgc25kX3NlcV9zeW5jX291dHB1dF9xdWV1ZShzbmRfc2VxX3QgKnNlcSk7CisKKy8qCisgKiBwYXJzZSB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCBnZXQgdGhlIHNlcXVlbmNlciBhZGRyZXNzCisgKi8KK2ludCBzbmRfc2VxX3BhcnNlX2FkZHJlc3Moc25kX3NlcV90ICpzZXEsIHNuZF9zZXFfYWRkcl90ICphZGRyLCBjb25zdCBjaGFyICpzdHIpOworCisvKgorICogcmVzZXQgY2xpZW50IGlucHV0L291dHB1dCBwb29sCisgKi8KK2ludCBzbmRfc2VxX3Jlc2V0X3Bvb2xfb3V0cHV0KHNuZF9zZXFfdCAqc2VxKTsKK2ludCBzbmRfc2VxX3Jlc2V0X3Bvb2xfaW5wdXQoc25kX3NlcV90ICpzZXEpOworCisvKioKKyAqIFxicmllZiBzZXQgbm90ZSBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIGNoIGNoYW5uZWwgbnVtYmVyCisgKiBccGFyYW0ga2V5IG5vdGUga2V5CisgKiBccGFyYW0gdmVsIHZlbG9jaXR5CisgKiBccGFyYW0gZHVyIGR1cmF0aW9uIChpbiB0aWNrIG9yIG1zZWMpCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfbm90ZShldiwgY2gsIGtleSwgdmVsLCBkdXIpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfTk9URSxcCisJIHNuZF9zZXFfZXZfc2V0X2ZpeGVkKGV2KSxcCisJIChldiktPmRhdGEubm90ZS5jaGFubmVsID0gKGNoKSxcCisJIChldiktPmRhdGEubm90ZS5ub3RlID0gKGtleSksXAorCSAoZXYpLT5kYXRhLm5vdGUudmVsb2NpdHkgPSAodmVsKSxcCisJIChldiktPmRhdGEubm90ZS5kdXJhdGlvbiA9IChkdXIpKQorCisvKioKKyAqIFxicmllZiBzZXQgbm90ZS1vbiBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIGNoIGNoYW5uZWwgbnVtYmVyCisgKiBccGFyYW0ga2V5IG5vdGUga2V5CisgKiBccGFyYW0gdmVsIHZlbG9jaXR5CisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfbm90ZW9uKGV2LCBjaCwga2V5LCB2ZWwpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfTk9URU9OLFwKKwkgc25kX3NlcV9ldl9zZXRfZml4ZWQoZXYpLFwKKwkgKGV2KS0+ZGF0YS5ub3RlLmNoYW5uZWwgPSAoY2gpLFwKKwkgKGV2KS0+ZGF0YS5ub3RlLm5vdGUgPSAoa2V5KSxcCisJIChldiktPmRhdGEubm90ZS52ZWxvY2l0eSA9ICh2ZWwpKQorCisvKioKKyAqIFxicmllZiBzZXQgbm90ZS1vZmYgZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBjaCBjaGFubmVsIG51bWJlcgorICogXHBhcmFtIGtleSBub3RlIGtleQorICogXHBhcmFtIHZlbCB2ZWxvY2l0eQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X25vdGVvZmYoZXYsIGNoLCBrZXksIHZlbCkgXAorCSgoZXYpLT50eXBlID0gU05EX1NFUV9FVkVOVF9OT1RFT0ZGLFwKKwkgc25kX3NlcV9ldl9zZXRfZml4ZWQoZXYpLFwKKwkgKGV2KS0+ZGF0YS5ub3RlLmNoYW5uZWwgPSAoY2gpLFwKKwkgKGV2KS0+ZGF0YS5ub3RlLm5vdGUgPSAoa2V5KSxcCisJIChldiktPmRhdGEubm90ZS52ZWxvY2l0eSA9ICh2ZWwpKQorCisvKioKKyAqIFxicmllZiBzZXQga2V5LXByZXNzdXJlIGV2ZW50CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gY2ggY2hhbm5lbCBudW1iZXIKKyAqIFxwYXJhbSBrZXkgbm90ZSBrZXkKKyAqIFxwYXJhbSB2ZWwgdmVsb2NpdHkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9rZXlwcmVzcyhldixjaCxrZXksdmVsKSBcCisJKChldiktPnR5cGUgPSBTTkRfU0VRX0VWRU5UX0tFWVBSRVNTLFwKKwkgc25kX3NlcV9ldl9zZXRfZml4ZWQoZXYpLFwKKwkgKGV2KS0+ZGF0YS5ub3RlLmNoYW5uZWwgPSAoY2gpLFwKKwkgKGV2KS0+ZGF0YS5ub3RlLm5vdGUgPSAoa2V5KSxcCisJIChldiktPmRhdGEubm90ZS52ZWxvY2l0eSA9ICh2ZWwpKQorCisvKioKKyAqIFxicmllZiBzZXQgTUlESSBjb250cm9sbGVyIGV2ZW50CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gY2ggY2hhbm5lbCBudW1iZXIKKyAqIFxwYXJhbSBjYyBjb250cm9sbGVyIG51bWJlcgorICogXHBhcmFtIHZhbCBjb250cm9sIHZhbHVlCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfY29udHJvbGxlcihldixjaCxjYyx2YWwpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfQ09OVFJPTExFUixcCisJIHNuZF9zZXFfZXZfc2V0X2ZpeGVkKGV2KSxcCisJIChldiktPmRhdGEuY29udHJvbC5jaGFubmVsID0gKGNoKSxcCisJIChldiktPmRhdGEuY29udHJvbC5wYXJhbSA9IChjYyksXAorCSAoZXYpLT5kYXRhLmNvbnRyb2wudmFsdWUgPSAodmFsKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IHByb2dyYW0gY2hhbmdlIGV2ZW50CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gY2ggY2hhbm5lbCBudW1iZXIKKyAqIFxwYXJhbSB2YWwgcHJvZ3JhbSBudW1iZXIKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9wZ21jaGFuZ2UoZXYsY2gsdmFsKSBcCisJKChldiktPnR5cGUgPSBTTkRfU0VRX0VWRU5UX1BHTUNIQU5HRSxcCisJIHNuZF9zZXFfZXZfc2V0X2ZpeGVkKGV2KSxcCisJIChldiktPmRhdGEuY29udHJvbC5jaGFubmVsID0gKGNoKSxcCisJIChldiktPmRhdGEuY29udHJvbC52YWx1ZSA9ICh2YWwpKQorCisvKioKKyAqIFxicmllZiBzZXQgcGl0Y2gtYmVuZCBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIGNoIGNoYW5uZWwgbnVtYmVyCisgKiBccGFyYW0gdmFsIHBpdGNoIGJlbmQ7IHplcm8gY2VudGVyZWQgZnJvbSAtODE5MiB0byA4MTkxCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfcGl0Y2hiZW5kKGV2LGNoLHZhbCkgXAorCSgoZXYpLT50eXBlID0gU05EX1NFUV9FVkVOVF9QSVRDSEJFTkQsXAorCSBzbmRfc2VxX2V2X3NldF9maXhlZChldiksXAorCSAoZXYpLT5kYXRhLmNvbnRyb2wuY2hhbm5lbCA9IChjaCksXAorCSAoZXYpLT5kYXRhLmNvbnRyb2wudmFsdWUgPSAodmFsKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IGNoYW5uZWwgcHJlc3N1cmUgZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBjaCBjaGFubmVsIG51bWJlcgorICogXHBhcmFtIHZhbCBjaGFubmVsIHByZXNzdXJlIHZhbHVlCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfY2hhbnByZXNzKGV2LGNoLHZhbCkgXAorCSgoZXYpLT50eXBlID0gU05EX1NFUV9FVkVOVF9DSEFOUFJFU1MsXAorCSBzbmRfc2VxX2V2X3NldF9maXhlZChldiksXAorCSAoZXYpLT5kYXRhLmNvbnRyb2wuY2hhbm5lbCA9IChjaCksXAorCSAoZXYpLT5kYXRhLmNvbnRyb2wudmFsdWUgPSAodmFsKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IHN5c2V4IGV2ZW50CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gZGF0YWxlbiBsZW5ndGggb2Ygc3lzZXggZGF0YQorICogXHBhcmFtIGRhdGFwdHIgc3lzZXggZGF0YSBwb2ludGVyCisgKgorICogdGhlIHN5c2V4IGRhdGEgbXVzdCBjb250YWluIHRoZSBzdGFydCBieXRlIDB4ZjAgYW5kIHRoZSBlbmQgYnl0ZSAweGY3LgorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3N5c2V4KGV2LGRhdGFsZW4sZGF0YXB0cikgXAorCSgoZXYpLT50eXBlID0gU05EX1NFUV9FVkVOVF9TWVNFWCxcCisJIHNuZF9zZXFfZXZfc2V0X3ZhcmlhYmxlKGV2LCBkYXRhbGVuLCBkYXRhcHRyKSkKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfU0VRTUlEX0ggKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2Fzb3VuZF9mbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2Fzb3VuZF9mbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYTRiOTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvYXNvdW5kX2ZtLmgKQEAgLTAsMCArMSwxMzQgQEAKKyNpZm5kZWYgX19TT1VORF9BU09VTkRfRk1fSAorI2RlZmluZSBfX1NPVU5EX0FTT1VORF9GTV9ICisKKy8qCisgKiAgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlIC0gQUxTQQorICoKKyAqICBJbnRlcmZhY2UgZmlsZSBiZXR3ZWVuIEFMU0EgZHJpdmVyICYgdXNlciBzcGFjZQorICogIENvcHlyaWdodCAoYykgMTk5NC05OCBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgNEZyb250IFRlY2hub2xvZ2llcworICoKKyAqICBEaXJlY3QgRk0gY29udHJvbAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2RlZmluZSBTTkRSVl9ETV9GTV9NT0RFX09QTDIJMHgwMAorI2RlZmluZSBTTkRSVl9ETV9GTV9NT0RFX09QTDMJMHgwMQorCitzdHJ1Y3Qgc25kX2RtX2ZtX2luZm8geworCXVuc2lnbmVkIGNoYXIgZm1fbW9kZTsJCS8qIE9QTCBtb2RlLCBzZWUgU05EUlZfRE1fRk1fTU9ERV9YWFggKi8KKwl1bnNpZ25lZCBjaGFyIHJoeXRobTsJCS8qIHBlcmN1c3Npb24gbW9kZSBmbGFnICovCit9OworCisvKgorICogIERhdGEgc3RydWN0dXJlIGNvbXBvc2luZyBhbiBGTSAibm90ZSIgb3Igc291bmQgZXZlbnQuCisgKi8KKworc3RydWN0IHNuZF9kbV9mbV92b2ljZSB7CisJdW5zaWduZWQgY2hhciBvcDsJCS8qIG9wZXJhdG9yIGNlbGwgKDAgb3IgMSkgKi8KKwl1bnNpZ25lZCBjaGFyIHZvaWNlOwkJLyogRk0gdm9pY2UgKDAgdG8gMTcpICovCisKKwl1bnNpZ25lZCBjaGFyIGFtOwkJLyogYW1wbGl0dWRlIG1vZHVsYXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyIHZpYnJhdG87CQkvKiB2aWJyYXRvIGVmZmVjdCAqLworCXVuc2lnbmVkIGNoYXIgZG9fc3VzdGFpbjsJLyogc3VzdGFpbiBwaGFzZSAqLworCXVuc2lnbmVkIGNoYXIga2JkX3NjYWxlOwkvKiBrZXlib2FyZCBzY2FsaW5nICovCisJdW5zaWduZWQgY2hhciBoYXJtb25pYzsJCS8qIDQgYml0czogaGFybW9uaWMgYW5kIG11bHRpcGxpZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHNjYWxlX2xldmVsOwkvKiAyIGJpdHM6IGRlY3JlYXNlIG91dHB1dCBmcmVxIHJpc2VzICovCisJdW5zaWduZWQgY2hhciB2b2x1bWU7CQkvKiA2IGJpdHM6IHZvbHVtZSAqLworCisJdW5zaWduZWQgY2hhciBhdHRhY2s7CQkvKiA0IGJpdHM6IGF0dGFjayByYXRlICovCisJdW5zaWduZWQgY2hhciBkZWNheTsJCS8qIDQgYml0czogZGVjYXkgcmF0ZSAqLworCXVuc2lnbmVkIGNoYXIgc3VzdGFpbjsJCS8qIDQgYml0czogc3VzdGFpbiBsZXZlbCAqLworCXVuc2lnbmVkIGNoYXIgcmVsZWFzZTsJCS8qIDQgYml0czogcmVsZWFzZSByYXRlICovCisKKwl1bnNpZ25lZCBjaGFyIGZlZWRiYWNrOwkJLyogMyBiaXRzOiBmZWVkYmFjayBmb3Igb3AwICovCisJdW5zaWduZWQgY2hhciBjb25uZWN0aW9uOwkvKiAwIGZvciBzZXJpYWwsIDEgZm9yIHBhcmFsbGVsICovCisJdW5zaWduZWQgY2hhciBsZWZ0OwkJLyogc3RlcmVvIGxlZnQgKi8KKwl1bnNpZ25lZCBjaGFyIHJpZ2h0OwkJLyogc3RlcmVvIHJpZ2h0ICovCisJdW5zaWduZWQgY2hhciB3YXZlZm9ybTsJCS8qIDMgYml0czogd2F2ZWZvcm0gc2hhcGUgKi8KK307CisKKy8qCisgKiAgVGhpcyBkZXNjcmliZXMgYW4gRk0gbm90ZSBieSBpdHMgdm9pY2UsIG9jdGF2ZSwgZnJlcXVlbmN5IG51bWJlciAoMTBiaXQpCisgKiAgYW5kIGtleSBvbi9vZmYuCisgKi8KKworc3RydWN0IHNuZF9kbV9mbV9ub3RlIHsKKwl1bnNpZ25lZCBjaGFyIHZvaWNlOwkvKiAwLTE3IHZvaWNlIGNoYW5uZWwgKi8KKwl1bnNpZ25lZCBjaGFyIG9jdGF2ZTsJLyogMyBiaXRzOiB3aGF0IG9jdGF2ZSB0byBwbGF5ICovCisJdW5zaWduZWQgaW50IGZudW07CS8qIDEwIGJpdHM6IGZyZXF1ZW5jeSBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIGtleV9vbjsJLyogc2V0IGZvciBhY3RpdmUsIGNsZWFyIGZvciBzaWxlbnQgKi8KK307CisKKy8qCisgKiAgRk0gcGFyYW1ldGVycyB0aGF0IGFwcGx5IGdsb2JhbGx5IHRvIGFsbCB2b2ljZXMsIGFuZCB0aHVzIGFyZSBub3QgIm5vdGVzIgorICovCisKK3N0cnVjdCBzbmRfZG1fZm1fcGFyYW1zIHsKKwl1bnNpZ25lZCBjaGFyIGFtX2RlcHRoOwkJLyogYW1wbGl0dWRlIG1vZHVsYXRpb24gZGVwdGggKDE9aGkpICovCisJdW5zaWduZWQgY2hhciB2aWJfZGVwdGg7CS8qIHZpYnJhdG8gZGVwdGggKDE9aGkpICovCisJdW5zaWduZWQgY2hhciBrYmRfc3BsaXQ7CS8qIGtleWJvYXJkIHNwbGl0ICovCisJdW5zaWduZWQgY2hhciByaHl0aG07CQkvKiBwZXJjdXNzaW9uIG1vZGUgc2VsZWN0ICovCisKKwkvKiBUaGlzIGJsb2NrIGlzIHRoZSBwZXJjdXNzaW9uIGluc3RydW1lbnQgZGF0YSAqLworCXVuc2lnbmVkIGNoYXIgYmFzczsKKwl1bnNpZ25lZCBjaGFyIHNuYXJlOworCXVuc2lnbmVkIGNoYXIgdG9tdG9tOworCXVuc2lnbmVkIGNoYXIgY3ltYmFsOworCXVuc2lnbmVkIGNoYXIgaGloYXQ7Cit9OworCisvKgorICogIEZNIG1vZGUgaW9jdGwgc2V0dGluZ3MKKyAqLworCisjZGVmaW5lIFNORFJWX0RNX0ZNX0lPQ1RMX0lORk8JCV9JT1IoJ0gnLCAweDIwLCBzdHJ1Y3Qgc25kX2RtX2ZtX2luZm8pCisjZGVmaW5lIFNORFJWX0RNX0ZNX0lPQ1RMX1JFU0VUCQlfSU8gKCdIJywgMHgyMSkKKyNkZWZpbmUgU05EUlZfRE1fRk1fSU9DVExfUExBWV9OT1RFCV9JT1coJ0gnLCAweDIyLCBzdHJ1Y3Qgc25kX2RtX2ZtX25vdGUpCisjZGVmaW5lIFNORFJWX0RNX0ZNX0lPQ1RMX1NFVF9WT0lDRQlfSU9XKCdIJywgMHgyMywgc3RydWN0IHNuZF9kbV9mbV92b2ljZSkKKyNkZWZpbmUgU05EUlZfRE1fRk1fSU9DVExfU0VUX1BBUkFNUwlfSU9XKCdIJywgMHgyNCwgc3RydWN0IHNuZF9kbV9mbV9wYXJhbXMpCisjZGVmaW5lIFNORFJWX0RNX0ZNX0lPQ1RMX1NFVF9NT0RFCV9JT1coJ0gnLCAweDI1LCBpbnQpCisvKiBmb3IgT1BMMyBvbmx5ICovCisjZGVmaW5lIFNORFJWX0RNX0ZNX0lPQ1RMX1NFVF9DT05ORUNUSU9OCV9JT1coJ0gnLCAweDI2LCBpbnQpCisvKiBTQkkgcGF0Y2ggbWFuYWdlbWVudCAqLworI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9DTEVBUl9QQVRDSEVTCV9JTyAoJ0gnLCAweDQwKQorCisjZGVmaW5lIFNORFJWX0RNX0ZNX09TU19JT0NUTF9SRVNFVAkJMHgyMAorI2RlZmluZSBTTkRSVl9ETV9GTV9PU1NfSU9DVExfUExBWV9OT1RFCQkweDIxCisjZGVmaW5lIFNORFJWX0RNX0ZNX09TU19JT0NUTF9TRVRfVk9JQ0UJCTB4MjIKKyNkZWZpbmUgU05EUlZfRE1fRk1fT1NTX0lPQ1RMX1NFVF9QQVJBTVMJMHgyMworI2RlZmluZSBTTkRSVl9ETV9GTV9PU1NfSU9DVExfU0VUX01PREUJCTB4MjQKKyNkZWZpbmUgU05EUlZfRE1fRk1fT1NTX0lPQ1RMX1NFVF9PUEwJCTB4MjUKKworLyoKKyAqIFBhdGNoIFJlY29yZCAtIGZpeGVkIHNpemUgZm9yIHdyaXRlCisgKi8KKworI2RlZmluZSBGTV9LRVlfU0JJCSJTQklcMDMyIgorI2RlZmluZSBGTV9LRVlfMk9QCSIyT1BcMDMyIgorI2RlZmluZSBGTV9LRVlfNE9QCSI0T1BcMDMyIgorCitzdHJ1Y3Qgc2JpX3BhdGNoIHsKKwl1bnNpZ25lZCBjaGFyIHByb2c7CisJdW5zaWduZWQgY2hhciBiYW5rOworCWNoYXIga2V5WzRdOworCWNoYXIgbmFtZVsyNV07CisJY2hhciBleHRlbnNpb25bN107CisJdW5zaWduZWQgY2hhciBkYXRhWzMyXTsKK307CisKKyNlbmRpZiAvKiBfX1NPVU5EX0FTT1VORF9GTV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvZW11MTBrMS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2VtdTEwazEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDAxOGI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2VtdTEwazEuaApAQCAtMCwwICsxLDM0OSBAQAorI2lmbmRlZiBfX1NPVU5EX0VNVTEwSzFfSAorI2RlZmluZSBfX1NPVU5EX0VNVTEwSzFfSAorCisvKgorICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4sCisgKgkJICAgICBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKiAgRGVmaW5pdGlvbnMgZm9yIEVNVTEwSzEgKFNCIExpdmUhKSBjaGlwcworICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoKKyAqIC0tLS0gRlg4MDEwIC0tLS0KKyAqLworCisjZGVmaW5lIEVNVTEwSzFfQ0FSRF9DUkVBVElWRQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRU1VMTBLMV9DQVJEX0VNVUFQUwkJCTB4MDAwMDAwMDEKKworI2RlZmluZSBFTVUxMEsxX0ZYODAxMF9QQ01fQ09VTlQJCTgKKworLyogaW5zdHJ1Y3Rpb24gc2V0ICovCisjZGVmaW5lIGlNQUMwCSAweDAwCS8qIFIgPSBBICsgKFggKiBZID4+IDMxKSAgIDsgc2F0dXJhdGlvbiAqLworI2RlZmluZSBpTUFDMQkgMHgwMQkvKiBSID0gQSArICgtWCAqIFkgPj4gMzEpICA7IHNhdHVyYXRpb24gKi8KKyNkZWZpbmUgaU1BQzIJIDB4MDIJLyogUiA9IEEgKyAoWCAqIFkgPj4gMzEpICAgOyB3cmFwYXJvdW5kICovCisjZGVmaW5lIGlNQUMzCSAweDAzCS8qIFIgPSBBICsgKC1YICogWSA+PiAzMSkgIDsgd3JhcGFyb3VuZCAqLworI2RlZmluZSBpTUFDSU5UMCAweDA0CS8qIFIgPSBBICsgWCAqIFkJICAgOyBzYXR1cmF0aW9uICovCisjZGVmaW5lIGlNQUNJTlQxIDB4MDUJLyogUiA9IEEgKyBYICogWQkgICA7IHdyYXBhcm91bmQgKDMxLWJpdCkgKi8KKyNkZWZpbmUgaUFDQzMJIDB4MDYJLyogUiA9IEEgKyBYICsgWQkgICA7IHNhdHVyYXRpb24gKi8KKyNkZWZpbmUgaU1BQ01WICAgMHgwNwkvKiBSID0gQSwgYWNjICs9IFggKiBZID4+IDMxICovCisjZGVmaW5lIGlBTkRYT1IgIDB4MDgJLyogUiA9IChBICYgWCkgXiBZICovCisjZGVmaW5lIGlUU1RORUcgIDB4MDkJLyogUiA9IChBID49IFkpID8gWCA6IH5YICovCisjZGVmaW5lIGlMSU1JVEdFIDB4MGEJLyogUiA9IChBID49IFkpID8gWCA6IFkgKi8KKyNkZWZpbmUgaUxJTUlUTFQgMHgwYgkvKiBSID0gKEEgPCBZKSA/IFggOiBZICovCisjZGVmaW5lIGlMT0cJIDB4MGMJLyogUiA9IGxpbmVhcl9kYXRhLCBBIChsb2dfZGF0YSksIFggKG1heF9leHApLCBZIChmb3JtYXRfd29yZCkgKi8KKyNkZWZpbmUgaUVYUAkgMHgwZAkvKiBSID0gbG9nX2RhdGEsIEEgKGxpbmVhcl9kYXRhKSwgWCAobWF4X2V4cCksIFkgKGZvcm1hdF93b3JkKSAqLworI2RlZmluZSBpSU5URVJQICAweDBlCS8qIFIgPSBBICsgKFggKiAoWSAtIEEpID4+IDMxKSAgOyBzYXR1cmF0aW9uICovCisjZGVmaW5lIGlTS0lQICAgIDB4MGYJLyogUiA9IEEgKGNjX3JlZyksIFggKGNvdW50KSwgWSAoY2NfdGVzdCkgKi8KKworLyogR1BScyAqLworI2RlZmluZSBGWEJVUyh4KQkoMHgwMCArICh4KSkJLyogeCA9IDB4MDAgLSAweDBmICovCisjZGVmaW5lIEVYVElOKHgpCSgweDEwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MGYgKi8KKyNkZWZpbmUgRVhUT1VUKHgpCSgweDIwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MGYgKi8KKyNkZWZpbmUgQ18wMDAwMDAwMAkweDQwCisjZGVmaW5lIENfMDAwMDAwMDEJMHg0MQorI2RlZmluZSBDXzAwMDAwMDAyCTB4NDIKKyNkZWZpbmUgQ18wMDAwMDAwMwkweDQzCisjZGVmaW5lIENfMDAwMDAwMDQJMHg0NAorI2RlZmluZSBDXzAwMDAwMDA4CTB4NDUKKyNkZWZpbmUgQ18wMDAwMDAxMAkweDQ2CisjZGVmaW5lIENfMDAwMDAwMjAJMHg0NworI2RlZmluZSBDXzAwMDAwMTAwCTB4NDgKKyNkZWZpbmUgQ18wMDAxMDAwMAkweDQ5CisjZGVmaW5lIENfMDAwODAwMDAJMHg0YQorI2RlZmluZSBDXzEwMDAwMDAwCTB4NGIKKyNkZWZpbmUgQ18yMDAwMDAwMAkweDRjCisjZGVmaW5lIENfNDAwMDAwMDAJMHg0ZAorI2RlZmluZSBDXzgwMDAwMDAwCTB4NGUKKyNkZWZpbmUgQ183ZmZmZmZmZgkweDRmCisjZGVmaW5lIENfZmZmZmZmZmYJMHg1MAorI2RlZmluZSBDX2ZmZmZmZmZlCTB4NTEKKyNkZWZpbmUgQ19jMDAwMDAwMAkweDUyCisjZGVmaW5lIENfNGYxYmJjZGMJMHg1MworI2RlZmluZSBDXzVhN2VmOWRiCTB4NTQKKyNkZWZpbmUgQ18wMDEwMDAwMAkweDU1CQkvKiA/PyAqLworI2RlZmluZSBHUFJfQUNDVQkweDU2CQkvKiBBQ0NVTSwgYWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgR1BSX0NPTkQJMHg1NwkJLyogQ0NSLCBjb25kaXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgR1BSX05PSVNFMAkweDU4CQkvKiBub2lzZSBzb3VyY2UgKi8KKyNkZWZpbmUgR1BSX05PSVNFMQkweDU5CQkvKiBub2lzZSBzb3VyY2UgKi8KKyNkZWZpbmUgR1BSX0lSUQkJMHg1YQkJLyogSVJRIHJlZ2lzdGVyICovCisjZGVmaW5lIEdQUl9EQkFDCTB4NWIJCS8qIFRSQU0gRGVsYXkgQmFzZSBBZGRyZXNzIENvdW50ZXIgKi8KKyNkZWZpbmUgR1BSKHgpCQkoRlhHUFJFR0JBU0UgKyAoeCkpIC8qIGZyZWUgR1BSczogeCA9IDB4MDAgLSAweGZmICovCisjZGVmaW5lIElUUkFNX0RBVEEoeCkJKFRBTktNRU1EQVRBUkVHQkFTRSArIDB4MDAgKyAoeCkpIC8qIHggPSAweDAwIC0gMHg3ZiAqLworI2RlZmluZSBFVFJBTV9EQVRBKHgpCShUQU5LTUVNREFUQVJFR0JBU0UgKyAweDgwICsgKHgpKSAvKiB4ID0gMHgwMCAtIDB4MWYgKi8KKyNkZWZpbmUgSVRSQU1fQUREUih4KQkoVEFOS01FTUFERFJSRUdCQVNFICsgMHgwMCArICh4KSkgLyogeCA9IDB4MDAgLSAweDdmICovCisjZGVmaW5lIEVUUkFNX0FERFIoeCkJKFRBTktNRU1BRERSUkVHQkFTRSArIDB4ODAgKyAoeCkpIC8qIHggPSAweDAwIC0gMHgxZiAqLworCisjZGVmaW5lIEFfRlhCVVMoeCkJKDB4MDAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgzZj8gKi8KKyNkZWZpbmUgQV9FWFRJTih4KQkoMHg0MCArICh4KSkJLyogeCA9IDB4MDAgLSAweDFmPyAqLworI2RlZmluZSBBX0VYVE9VVCh4KQkoMHg2MCArICh4KSkJLyogeCA9IDB4MDAgLSAweDFmPyAqLworI2RlZmluZSBBX0dQUih4KQkoQV9GWEdQUkVHQkFTRSArICh4KSkKKworLyogY2NfcmVnIGNvbnN0YW50cyAqLworI2RlZmluZSBDQ19SRUdfTk9STUFMSVpFRCBDXzAwMDAwMDAxCisjZGVmaW5lIENDX1JFR19CT1JST1cJQ18wMDAwMDAwMgorI2RlZmluZSBDQ19SRUdfTUlOVVMJQ18wMDAwMDAwNAorI2RlZmluZSBDQ19SRUdfWkVSTwlDXzAwMDAwMDA4CisjZGVmaW5lIENDX1JFR19TQVRVUkFURQlDXzAwMDAwMDEwCisjZGVmaW5lIENDX1JFR19OT05aRVJPCUNfMDAwMDAxMDAKKworLyogRlggYnVzZXMgKi8KKyNkZWZpbmUgRlhCVVNfUENNX0xFRlQJCTB4MDAKKyNkZWZpbmUgRlhCVVNfUENNX1JJR0hUCQkweDAxCisjZGVmaW5lIEZYQlVTX1BDTV9MRUZUX1JFQVIJMHgwMgorI2RlZmluZSBGWEJVU19QQ01fUklHSFRfUkVBUgkweDAzCisjZGVmaW5lIEZYQlVTX01JRElfTEVGVAkJMHgwNAorI2RlZmluZSBGWEJVU19NSURJX1JJR0hUCTB4MDUKKyNkZWZpbmUgRlhCVVNfUENNX0NFTlRFUgkweDA2CisjZGVmaW5lIEZYQlVTX1BDTV9MRkUJCTB4MDcKKyNkZWZpbmUgRlhCVVNfUENNX0xFRlRfRlJPTlQJMHgwOAorI2RlZmluZSBGWEJVU19QQ01fUklHSFRfRlJPTlQJMHgwOQorI2RlZmluZSBGWEJVU19NSURJX1JFVkVSQgkweDBjCisjZGVmaW5lIEZYQlVTX01JRElfQ0hPUlVTCTB4MGQKKyNkZWZpbmUgRlhCVVNfUENNX0xFRlRfU0lERQkweDBlCisjZGVmaW5lIEZYQlVTX1BDTV9SSUdIVF9TSURFCTB4MGYKKyNkZWZpbmUgRlhCVVNfUFRfTEVGVAkJMHgxNAorI2RlZmluZSBGWEJVU19QVF9SSUdIVAkJMHgxNQorCisvKiBJbnB1dHMgKi8KKyNkZWZpbmUgRVhUSU5fQUM5N19MCSAgIDB4MDAJLyogQUMnOTcgY2FwdHVyZSBjaGFubmVsIC0gbGVmdCAqLworI2RlZmluZSBFWFRJTl9BQzk3X1IJICAgMHgwMQkvKiBBQyc5NyBjYXB0dXJlIGNoYW5uZWwgLSByaWdodCAqLworI2RlZmluZSBFWFRJTl9TUERJRl9DRF9MICAgMHgwMgkvKiBpbnRlcm5hbCBTL1BESUYgQ0QgLSBvbmJvYXJkIC0gbGVmdCAqLworI2RlZmluZSBFWFRJTl9TUERJRl9DRF9SICAgMHgwMwkvKiBpbnRlcm5hbCBTL1BESUYgQ0QgLSBvbmJvYXJkIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUSU5fWk9PTV9MCSAgIDB4MDQJLyogWm9vbSBWaWRlbyBJMlMgLSBsZWZ0ICovCisjZGVmaW5lIEVYVElOX1pPT01fUgkgICAweDA1CS8qIFpvb20gVmlkZW8gSTJTIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUSU5fVE9TTElOS19MCSAgIDB4MDYJLyogTGl2ZURyaXZlIC0gVE9TTGluayBPcHRpY2FsIC0gbGVmdCAqLworI2RlZmluZSBFWFRJTl9UT1NMSU5LX1IgICAgMHgwNwkvKiBMaXZlRHJpdmUgLSBUT1NMaW5rIE9wdGljYWwgLSByaWdodCAqLworI2RlZmluZSBFWFRJTl9MSU5FMV9MCSAgIDB4MDgJLyogTGl2ZURyaXZlIC0gTGluZS9NaWMgMSAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUSU5fTElORTFfUgkgICAweDA5CS8qIExpdmVEcml2ZSAtIExpbmUvTWljIDEgLSByaWdodCAqLworI2RlZmluZSBFWFRJTl9DT0FYX1NQRElGX0wgMHgwYQkvKiBMaXZlRHJpdmUgLSBDb2F4aWFsIFMvUERJRiAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUSU5fQ09BWF9TUERJRl9SIDB4MGIgLyogTGl2ZURyaXZlIC0gQ29heGlhbCBTL1BESUYgLSByaWdodCAqLworI2RlZmluZSBFWFRJTl9MSU5FMl9MCSAgIDB4MGMJLyogTGl2ZURyaXZlIC0gTGluZS9NaWMgMiAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUSU5fTElORTJfUgkgICAweDBkCS8qIExpdmVEcml2ZSAtIExpbmUvTWljIDIgLSByaWdodCAqLworCisvKiBPdXRwdXRzICovCisjZGVmaW5lIEVYVE9VVF9BQzk3X0wJICAgMHgwMAkvKiBBQyc5NyBwbGF5YmFjayBjaGFubmVsIC0gbGVmdCAqLworI2RlZmluZSBFWFRPVVRfQUM5N19SCSAgIDB4MDEJLyogQUMnOTcgcGxheWJhY2sgY2hhbm5lbCAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVE9VVF9UT1NMSU5LX0wgICAweDAyCS8qIExpdmVEcml2ZSAtIFRPU0xpbmsgT3B0aWNhbCAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUT1VUX1RPU0xJTktfUiAgIDB4MDMJLyogTGl2ZURyaXZlIC0gVE9TTGluayBPcHRpY2FsIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUT1VUX0FDOTdfQ0VOVEVSIDB4MDQJLyogU0IgTGl2ZSA1LjEgLSBjZW50ZXIgKi8KKyNkZWZpbmUgRVhUT1VUX0FDOTdfTEZFCSAgIDB4MDUgLyogU0IgTGl2ZSA1LjEgLSBMRkUgKi8KKyNkZWZpbmUgRVhUT1VUX0hFQURQSE9ORV9MIDB4MDYJLyogTGl2ZURyaXZlIC0gSGVhZHBob25lIC0gbGVmdCAqLworI2RlZmluZSBFWFRPVVRfSEVBRFBIT05FX1IgMHgwNwkvKiBMaXZlRHJpdmUgLSBIZWFkcGhvbmUgLSByaWdodCAqLworI2RlZmluZSBFWFRPVVRfUkVBUl9MCSAgIDB4MDgJLyogUmVhciBjaGFubmVsIC0gbGVmdCAqLworI2RlZmluZSBFWFRPVVRfUkVBUl9SCSAgIDB4MDkJLyogUmVhciBjaGFubmVsIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUT1VUX0FEQ19DQVBfTCAgIDB4MGEJLyogQURDIENhcHR1cmUgYnVmZmVyIC0gbGVmdCAqLworI2RlZmluZSBFWFRPVVRfQURDX0NBUF9SICAgMHgwYgkvKiBBREMgQ2FwdHVyZSBidWZmZXIgLSByaWdodCAqLworI2RlZmluZSBFWFRPVVRfTUlDX0NBUAkgICAweDBjCS8qIE1JQyBDYXB0dXJlIGJ1ZmZlciAqLworI2RlZmluZSBFWFRPVVRfQUM5N19SRUFSX0wgMHgwZAkvKiBTQiBMaXZlIDUuMSAoYykgMjAwMyAtIFJlYXIgTGVmdCAqLworI2RlZmluZSBFWFRPVVRfQUM5N19SRUFSX1IgMHgwZQkvKiBTQiBMaXZlIDUuMSAoYykgMjAwMyAtIFJlYXIgUmlnaHQgKi8KKyNkZWZpbmUgRVhUT1VUX0FDRU5URVIJICAgMHgxMSAvKiBBbmFsb2cgQ2VudGVyICovCisjZGVmaW5lIEVYVE9VVF9BTEZFCSAgIDB4MTIgLyogQW5hbG9nIExGRSAqLworCisvKiBBdWRpZ3kgSW5wdXRzICovCisjZGVmaW5lIEFfRVhUSU5fQUM5N19MCQkweDAwCS8qIEFDJzk3IGNhcHR1cmUgY2hhbm5lbCAtIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRJTl9BQzk3X1IJCTB4MDEJLyogQUMnOTcgY2FwdHVyZSBjaGFubmVsIC0gcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRJTl9TUERJRl9DRF9MCTB4MDIJLyogZGlnaXRhbCBDRCBsZWZ0ICovCisjZGVmaW5lIEFfRVhUSU5fU1BESUZfQ0RfUgkweDAzCS8qIGRpZ2l0YWwgQ0QgbGVmdCAqLworI2RlZmluZSBBX0VYVElOX09QVF9TUERJRl9MICAgICAweDA0ICAgIC8qIGF1ZGlneSBkcml2ZSBPcHRpY2FsIFNQRElGIC0gbGVmdCAqLworI2RlZmluZSBBX0VYVElOX09QVF9TUERJRl9SICAgICAweDA1ICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgKi8gCisjZGVmaW5lIEFfRVhUSU5fTElORTJfTAkJMHgwOAkvKiBhdWRpZ3kgZHJpdmUgbGluZTIvbWljMiAtIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRJTl9MSU5FMl9SCQkweDA5CS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRJTl9BRENfTAkJMHgwYSAgICAvKiBQaGlsaXBzIEFEQyAtIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRJTl9BRENfUgkJMHgwYiAgICAvKiAgICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUSU5fQVVYMl9MCQkweDBjCS8qIGF1ZGlneSBkcml2ZSBhdXgyIC0gbGVmdCAqLworI2RlZmluZSBBX0VYVElOX0FVWDJfUgkJMHgwZAkvKiAgICAgICAgICAgICAgICAgICAtIHJpZ2h0ICovCisKKy8qIEF1ZGlnaXkgT3V0cHV0cyAqLworI2RlZmluZSBBX0VYVE9VVF9GUk9OVF9MCTB4MDAJLyogZGlnaXRhbCBmcm9udCBsZWZ0ICovCisjZGVmaW5lIEFfRVhUT1VUX0ZST05UX1IJMHgwMQkvKiAgICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUT1VUX0NFTlRFUgkJMHgwMgkvKiBkaWdpdGFsIGZyb250IGNlbnRlciAqLworI2RlZmluZSBBX0VYVE9VVF9MRkUJCTB4MDMJLyogZGlnaXRhbCBmcm9udCBsZmUgKi8KKyNkZWZpbmUgQV9FWFRPVVRfSEVBRFBIT05FX0wJMHgwNAkvKiBoZWFkcGhvbmUgYXVkaWd5IGRyaXZlIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfSEVBRFBIT05FX1IJMHgwNQkvKiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUT1VUX1JFQVJfTAkJMHgwNgkvKiBkaWdpdGFsIHJlYXIgbGVmdCAqLworI2RlZmluZSBBX0VYVE9VVF9SRUFSX1IJCTB4MDcJLyogICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUT1VUX0FGUk9OVF9MCTB4MDgJLyogYW5hbG9nIGZyb250IGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQUZST05UX1IJMHgwOQkvKiAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQUNFTlRFUgkweDBhCS8qIGFuYWxvZyBjZW50ZXIgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQUxGRQkJMHgwYgkvKiBhbmFsb2cgTEZFICovCisjZGVmaW5lIEFfRVhUT1VUX0FTSURFX0wJMHgwYwkvKiBhbmFsb2cgc2lkZSBsZWZ0ICAtIEF1ZGlneSAyIFpTICovCisjZGVmaW5lIEFfRVhUT1VUX0FTSURFX1IJMHgwZAkvKiAgICAgICAgICAgICByaWdodCAtIEF1ZGlneSAyIFpTICovCisjZGVmaW5lIEFfRVhUT1VUX0FSRUFSX0wJMHgwZQkvKiBhbmFsb2cgcmVhciBsZWZ0ICovCisjZGVmaW5lIEFfRVhUT1VUX0FSRUFSX1IJMHgwZgkvKiAgICAgICAgICAgICByaWdodCAqLworI2RlZmluZSBBX0VYVE9VVF9BQzk3X0wJCTB4MTAJLyogQUM5NyBsZWZ0IChmcm9udCkgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQUM5N19SCQkweDExCS8qICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQURDX0NBUF9MCTB4MTYJLyogQURDIGNhcHR1cmUgYnVmZmVyIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQURDX0NBUF9SCTB4MTcJLyogICAgICAgICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUT1VUX01JQ19DQVAJMHgxOAkvKiBNaWMgY2FwdHVyZSBidWZmZXIgKi8KKworLyogQXVkaWd5IGNvbnN0YW50cyAqLworI2RlZmluZSBBX0NfMDAwMDAwMDAJMHhjMAorI2RlZmluZSBBX0NfMDAwMDAwMDEJMHhjMQorI2RlZmluZSBBX0NfMDAwMDAwMDIJMHhjMgorI2RlZmluZSBBX0NfMDAwMDAwMDMJMHhjMworI2RlZmluZSBBX0NfMDAwMDAwMDQJMHhjNAorI2RlZmluZSBBX0NfMDAwMDAwMDgJMHhjNQorI2RlZmluZSBBX0NfMDAwMDAwMTAJMHhjNgorI2RlZmluZSBBX0NfMDAwMDAwMjAJMHhjNworI2RlZmluZSBBX0NfMDAwMDAxMDAJMHhjOAorI2RlZmluZSBBX0NfMDAwMTAwMDAJMHhjOQorI2RlZmluZSBBX0NfMDAwMDA4MDAJMHhjYQorI2RlZmluZSBBX0NfMTAwMDAwMDAJMHhjYgorI2RlZmluZSBBX0NfMjAwMDAwMDAJMHhjYworI2RlZmluZSBBX0NfNDAwMDAwMDAJMHhjZAorI2RlZmluZSBBX0NfODAwMDAwMDAJMHhjZQorI2RlZmluZSBBX0NfN2ZmZmZmZmYJMHhjZgorI2RlZmluZSBBX0NfZmZmZmZmZmYJMHhkMAorI2RlZmluZSBBX0NfZmZmZmZmZmUJMHhkMQorI2RlZmluZSBBX0NfYzAwMDAwMDAJMHhkMgorI2RlZmluZSBBX0NfNGYxYmJjZGMJMHhkMworI2RlZmluZSBBX0NfNWE3ZWY5ZGIJMHhkNAorI2RlZmluZSBBX0NfMDAxMDAwMDAJMHhkNQorI2RlZmluZSBBX0dQUl9BQ0NVCTB4ZDYJCS8qIEFDQ1VNLCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBBX0dQUl9DT05ECTB4ZDcJCS8qIENDUiwgY29uZGl0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEFfR1BSX05PSVNFMAkweGQ4CQkvKiBub2lzZSBzb3VyY2UgKi8KKyNkZWZpbmUgQV9HUFJfTk9JU0UxCTB4ZDkJCS8qIG5vaXNlIHNvdXJjZSAqLworI2RlZmluZSBBX0dQUl9JUlEJMHhkYQkJLyogSVJRIHJlZ2lzdGVyICovCisjZGVmaW5lIEFfR1BSX0RCQUMJMHhkYgkJLyogVFJBTSBEZWxheSBCYXNlIEFkZHJlc3MgQ291bnRlciAtIGludGVybmFsICovCisjZGVmaW5lIEFfR1BSX0RCQUNFCTB4ZGUJCS8qIFRSQU0gRGVsYXkgQmFzZSBBZGRyZXNzIENvdW50ZXIgLSBleHRlcm5hbCAqLworCisvKiBkZWZpbml0aW9ucyBmb3IgZGVidWcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU1VMTBLMV9EQkdfWkMJCQkweDgwMDAwMDAwCS8qIHplcm8gdHJhbSBjb3VudGVyICovCisjZGVmaW5lIEVNVTEwSzFfREJHX1NBVFVSQVRJT05fT0NDVVJFRAkweDAyMDAwMDAwCS8qIHNhdHVyYXRpb24gY29udHJvbCAqLworI2RlZmluZSBFTVUxMEsxX0RCR19TQVRVUkFUSU9OX0FERFIJMHgwMWZmMDAwMAkvKiBzYXR1cmF0aW9uIGFkZHJlc3MgKi8KKyNkZWZpbmUgRU1VMTBLMV9EQkdfU0lOR0xFX1NURVAJCTB4MDAwMDgwMDAJLyogc2luZ2xlIHN0ZXAgbW9kZSAqLworI2RlZmluZSBFTVUxMEsxX0RCR19TVEVQCQkweDAwMDA0MDAwCS8qIHN0YXJ0IHNpbmdsZSBzdGVwICovCisjZGVmaW5lIEVNVTEwSzFfREJHX0NPTkRJVElPTl9DT0RFCTB4MDAwMDNlMDAJLyogY29uZGl0aW9uIGNvZGUgKi8KKyNkZWZpbmUgRU1VMTBLMV9EQkdfU0lOR0xFX1NURVBfQUREUgkweDAwMDAwMWZmCS8qIHNpbmdsZSBzdGVwIGFkZHJlc3MgKi8KKworLyogdGFuayBtZW1vcnkgYWRkcmVzcyBsaW5lICovCisjaWZuZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgVEFOS01FTUFERFJSRUdfQUREUl9NQVNLIDB4MDAwZmZmZmYJLyogMjAgYml0IHRhbmsgYWRkcmVzcyBmaWVsZAkJCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX0NMRUFSCSAweDAwODAwMDAwCS8qIENsZWFyIHRhbmsgbWVtb3J5CQkJCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX0FMSUdOCSAweDAwNDAwMDAwCS8qIEFsaWduIHJlYWQgb3Igd3JpdGUgcmVsYXRpdmUgdG8gdGFuayBhY2Nlc3MJKi8KKyNkZWZpbmUgVEFOS01FTUFERFJSRUdfV1JJVEUJIDB4MDAyMDAwMDAJLyogV3JpdGUgdG8gdGFuayBtZW1vcnkJCQkJKi8KKyNkZWZpbmUgVEFOS01FTUFERFJSRUdfUkVBRAkgMHgwMDEwMDAwMAkvKiBSZWFkIGZyb20gdGFuayBtZW1vcnkJCQkqLworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgaW50ZXJuYWxfdHJhbV9zaXplOwkvKiBpbiBzYW1wbGVzICovCisJdW5zaWduZWQgaW50IGV4dGVybmFsX3RyYW1fc2l6ZTsJLyogaW4gc2FtcGxlcyAqLworCWNoYXIgZnhidXNfbmFtZXNbMTZdWzMyXTsJCS8qIG5hbWVzIG9mIEZYQlVTZXMgKi8KKwljaGFyIGV4dGluX25hbWVzWzE2XVszMl07CQkvKiBuYW1lcyBvZiBleHRlcm5hbCBpbnB1dHMgKi8KKwljaGFyIGV4dG91dF9uYW1lc1szMl1bMzJdOwkJLyogbmFtZXMgb2YgZXh0ZXJuYWwgb3V0cHV0cyAqLworCXVuc2lnbmVkIGludCBncHJfY29udHJvbHM7CQkvKiBjb3VudCBvZiBHUFIgY29udHJvbHMgKi8KK30gZW11MTBrMV9meDgwMTBfaW5mb190OworCisjZGVmaW5lIEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX05PTkUJCTAKKyNkZWZpbmUgRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fVEFCTEUxMDAJMQorI2RlZmluZSBFTVUxMEsxX0dQUl9UUkFOU0xBVElPTl9CQVNTCQkyCisjZGVmaW5lIEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX1RSRUJMRQkJMworI2RlZmluZSBFTVUxMEsxX0dQUl9UUkFOU0xBVElPTl9PTk9GRgkJNAorCitlbnVtIGVtdTEwazFfY3RsX2VsZW1faWZhY2UgeworCUVNVTEwSzFfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIgPSAyLAkvKiB2aXJ0dWFsIG1peGVyIGRldmljZSAqLworCUVNVTEwSzFfQ1RMX0VMRU1fSUZBQ0VfUENNID0gMywJCS8qIFBDTSBkZXZpY2UgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgcGFkOwkJLyogZG9uJ3QgdXNlICovCisJaW50IGlmYWNlOwkJCS8qIGludGVyZmFjZSBpZGVudGlmaWVyICovCisJdW5zaWduZWQgaW50IGRldmljZTsJCS8qIGRldmljZS9jbGllbnQgbnVtYmVyICovCisJdW5zaWduZWQgaW50IHN1YmRldmljZTsJCS8qIHN1YmRldmljZSAoc3Vic3RyZWFtKSBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIG5hbWVbNDRdOwkJLyogQVNDSUkgbmFtZSBvZiBpdGVtICovIAorCXVuc2lnbmVkIGludCBpbmRleDsJCS8qIGluZGV4IG9mIGl0ZW0gKi8KK30gZW11MTBrMV9jdGxfZWxlbV9pZF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJZW11MTBrMV9jdGxfZWxlbV9pZF90IGlkOwkvKiBmdWxsIGNvbnRyb2wgSUQgZGVmaW5pdGlvbiAqLworCXVuc2lnbmVkIGludCB2Y291bnQ7CQkvKiB2aXNpYmxlIGNvdW50ICovCisJdW5zaWduZWQgaW50IGNvdW50OwkJLyogY291bnQgb2YgR1BSICgxLi4xNikgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJbMzJdOwkJLyogR1BSIG51bWJlcihzKSAqLworCXVuc2lnbmVkIGludCB2YWx1ZVszMl07CQkvKiBpbml0aWFsIHZhbHVlcyAqLworCXVuc2lnbmVkIGludCBtaW47CQkvKiBtaW5pbXVtIHJhbmdlICovCisJdW5zaWduZWQgaW50IG1heDsJCS8qIG1heGltdW0gcmFuZ2UgKi8KKwl1bnNpZ25lZCBpbnQgdHJhbnNsYXRpb247CS8qIHRyYW5zbGF0aW9uIHR5cGUgKEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OKikgKi8KKwl1bnNpZ25lZCBpbnQgKnRsdjsKK30gZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgbmFtZVsxMjhdOworCisJdW5zaWduZWQgbG9uZyBncHJfdmFsaWRbMHgyMDAvKHNpemVvZih1bnNpZ25lZCBsb25nKSo4KV07IC8qIGJpdG1hc2sgb2YgdmFsaWQgaW5pdGlhbGl6ZXJzICovCisJdWludDMyX3QgKmdwcl9tYXA7CQkgIC8qIGluaXRpYWxpemVycyAqLworCisJdW5zaWduZWQgaW50IGdwcl9hZGRfY29udHJvbF9jb3VudDsgLyogY291bnQgb2YgR1BSIGNvbnRyb2xzIHRvIGFkZC9yZXBsYWNlICovCisJZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHJfdCAqZ3ByX2FkZF9jb250cm9sczsgLyogR1BSIGNvbnRyb2xzIHRvIGFkZC9yZXBsYWNlICovCisKKwl1bnNpZ25lZCBpbnQgZ3ByX2RlbF9jb250cm9sX2NvdW50OyAvKiBjb3VudCBvZiBHUFIgY29udHJvbHMgdG8gcmVtb3ZlICovCisJZW11MTBrMV9jdGxfZWxlbV9pZF90ICpncHJfZGVsX2NvbnRyb2xzOyAvKiBJRHMgb2YgR1BSIGNvbnRyb2xzIHRvIHJlbW92ZSAqLworCisJdW5zaWduZWQgaW50IGdwcl9saXN0X2NvbnRyb2xfY291bnQ7IC8qIGNvdW50IG9mIEdQUiBjb250cm9scyB0byBsaXN0ICovCisJdW5zaWduZWQgaW50IGdwcl9saXN0X2NvbnRyb2xfdG90YWw7IC8qIHRvdGFsIGNvdW50IG9mIEdQUiBjb250cm9scyAqLworCWVtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByX3QgKmdwcl9saXN0X2NvbnRyb2xzOyAvKiBsaXN0ZWQgR1BSIGNvbnRyb2xzICovCisKKwl1bnNpZ25lZCBsb25nIHRyYW1fdmFsaWRbMHgxMDAvKHNpemVvZih1bnNpZ25lZCBsb25nKSo4KV07IC8qIGJpdG1hc2sgb2YgdmFsaWQgaW5pdGlhbGl6ZXJzICovCisJdWludDMyX3QgKnRyYW1fZGF0YV9tYXA7CS8qIGRhdGEgaW5pdGlhbGl6ZXJzICovCisJdWludDMyX3QgKnRyYW1fYWRkcl9tYXA7CS8qIG1hcCBpbml0aWFsaXplcnMgKi8KKworCXVuc2lnbmVkIGxvbmcgY29kZV92YWxpZFsxMDI0LyhzaXplb2YodW5zaWduZWQgbG9uZykqOCldOyAgLyogYml0bWFzayBvZiB2YWxpZCBpbnN0cnVjdGlvbnMgKi8KKwl1aW50MzJfdCAqY29kZTsJCQkvKiBvbmUgaW5zdHJ1Y3Rpb24gLSA2NCBiaXRzICovCit9IGVtdTEwazFfZng4MDEwX2NvZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBhZGRyZXNzOwkJLyogMzEuYml0ID09IDEgLT4gZXh0ZXJuYWwgVFJBTSAqLworCXVuc2lnbmVkIGludCBzaXplOwkJLyogc2l6ZSBpbiBzYW1wbGVzICg0IGJ5dGVzKSAqLworCXVuc2lnbmVkIGludCAqc2FtcGxlczsJCS8qIHBvaW50ZXIgdG8gc2FtcGxlcyAoMjAtYml0KSAqLworCQkJCQkvKiBOVUxMLT5jbGVhciBtZW1vcnkgKi8KK30gZW11MTBrMV9meDgwMTBfdHJhbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHN1YnN0cmVhbTsJCS8qIHN1YnN0cmVhbSBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgcmVzMTsJCS8qIHJlc2VydmVkICovCisJdW5zaWduZWQgaW50IGNoYW5uZWxzOwkJLyogMTYtYml0IGNoYW5uZWxzIGNvdW50LCB6ZXJvID0gcmVtb3ZlIHRoaXMgc3Vic3RyZWFtICovCisJdW5zaWduZWQgaW50IHRyYW1fc3RhcnQ7CS8qIHJpbmcgYnVmZmVyIHBvc2l0aW9uIGluIFRSQU0gKGluIHNhbXBsZXMpICovCisJdW5zaWduZWQgaW50IGJ1ZmZlcl9zaXplOwkvKiBjb3VudCBvZiBidWZmZXJlZCBzYW1wbGVzICovCisJdW5zaWduZWQgc2hvcnQgZ3ByX3NpemU7CQkvKiBHUFIgY29udGFpbmluZyBzaXplIG9mIHJpbmdidWZmZXIgaW4gc2FtcGxlcyAoaG9zdCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJfcHRyOwkJLyogR1BSIGNvbnRhaW5pbmcgY3VycmVudCBwb2ludGVyIGluIHRoZSByaW5nIGJ1ZmZlciAoaG9zdCA9IHJlc2V0LCBGWDgwMTApICovCisJdW5zaWduZWQgc2hvcnQgZ3ByX2NvdW50OwkvKiBHUFIgY29udGFpbmluZyBjb3VudCBvZiBzYW1wbGVzIGJldHdlZW4gdHdvIGludGVycnVwdHMgKGhvc3QpICovCisJdW5zaWduZWQgc2hvcnQgZ3ByX3RtcGNvdW50OwkvKiBHUFIgY29udGFpbmluZyBjdXJyZW50IGNvdW50IG9mIHNhbXBsZXMgdG8gaW50ZXJydXB0IChob3N0ID0gc2V0LCBGWDgwMTApICovCisJdW5zaWduZWQgc2hvcnQgZ3ByX3RyaWdnZXI7CS8qIEdQUiBjb250YWluaW5nIHRyaWdnZXIgKGFjdGl2YXRlKSBpbmZvcm1hdGlvbiAoaG9zdCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJfcnVubmluZzsJLyogR1BSIGNvbnRhaW5pbmcgaW5mbyBpZiBQQ00gaXMgcnVubmluZyAoRlg4MDEwKSAqLworCXVuc2lnbmVkIGNoYXIgcGFkOwkJLyogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBjaGFyIGV0cmFtWzMyXTsJLyogZXh0ZXJuYWwgVFJBTSBhZGRyZXNzICYgZGF0YSAob25lIHBlciBjaGFubmVsKSAqLworCXVuc2lnbmVkIGludCByZXMyOwkJLyogcmVzZXJ2ZWQgKi8KK30gZW11MTBrMV9meDgwMTBfcGNtX3Q7CisKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9JTkZPCV9JT1IgKCdIJywgMHgxMCwgZW11MTBrMV9meDgwMTBfaW5mb190KQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0NPREVfUE9LRQlfSU9XICgnSCcsIDB4MTEsIGVtdTEwazFfZng4MDEwX2NvZGVfdCkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9DT0RFX1BFRUsJX0lPV1IoJ0gnLCAweDEyLCBlbXUxMGsxX2Z4ODAxMF9jb2RlX3QpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfVFJBTV9TRVRVUAlfSU9XICgnSCcsIDB4MjAsIGludCkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9UUkFNX1BPS0UJX0lPVyAoJ0gnLCAweDIxLCBlbXUxMGsxX2Z4ODAxMF90cmFtX3QpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfVFJBTV9QRUVLCV9JT1dSKCdIJywgMHgyMiwgZW11MTBrMV9meDgwMTBfdHJhbV90KQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1BDTV9QT0tFCV9JT1cgKCdIJywgMHgzMCwgZW11MTBrMV9meDgwMTBfcGNtX3QpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfUENNX1BFRUsJX0lPV1IoJ0gnLCAweDMxLCBlbXUxMGsxX2Z4ODAxMF9wY21fdCkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9QVkVSU0lPTglfSU9SICgnSCcsIDB4NDAsIGludCkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9TVE9QCV9JTyAgKCdIJywgMHg4MCkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9DT05USU5VRQlfSU8gICgnSCcsIDB4ODEpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfWkVST19UUkFNX0NPVU5URVIgX0lPICgnSCcsIDB4ODIpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfU0lOR0xFX1NURVAJX0lPVyAoJ0gnLCAweDgzLCBpbnQpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfREJHX1JFQUQJX0lPUiAoJ0gnLCAweDg0LCBpbnQpCisKKyNlbmRpZgkvKiBfX1NPVU5EX0VNVTEwSzFfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2hkc3AuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9oZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkYWY3YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9oZHNwLmgKQEAgLTAsMCArMSwxMTMgQEAKKyNpZm5kZWYgX19TT1VORF9IRFNQX0gKKyNkZWZpbmUgX19TT1VORF9IRFNQX0gKKworLyoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDAzIFRob21hcyBDaGFyYm9ubmVsICh0aG9tYXNAdW5kYXRhLm9yZykKKyAqICAgIAorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBIRFNQX01BVFJJWF9NSVhFUl9TSVpFIDIwNDgKKwordHlwZWRlZiBlbnVtIHsKKwlEaWdpZmFjZSwKKwlNdWx0aWZhY2UsCisJSDk2NTIsCisJSDk2MzIsCisJUlBNLAorCVVuZGVmaW5lZCwKK30gSERTUF9JT19UeXBlOworCit0eXBlZGVmIHN0cnVjdCBfc25kX2hkc3BfcGVha19ybXMgaGRzcF9wZWFrX3Jtc190OworCitzdHJ1Y3QgX3NuZF9oZHNwX3BlYWtfcm1zIHsKKwl1aW50MzJfdCBpbnB1dF9wZWFrc1syNl07CisJdWludDMyX3QgcGxheWJhY2tfcGVha3NbMjZdOworCXVpbnQzMl90IG91dHB1dF9wZWFrc1syOF07CisJdWludDY0X3QgaW5wdXRfcm1zWzI2XTsKKwl1aW50NjRfdCBwbGF5YmFja19ybXNbMjZdOworCS8qIFRoZXNlIGFyZSBvbmx5IHVzZWQgZm9yIEg5Nnh4IGNhcmRzICovCisJdWludDY0X3Qgb3V0cHV0X3Jtc1syNl07Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BfSU9DVExfR0VUX1BFQUtfUk1TIF9JT1IoJ0gnLCAweDQwLCBoZHNwX3BlYWtfcm1zX3QpCisKK3R5cGVkZWYgc3RydWN0IF9zbmRfaGRzcF9jb25maWdfaW5mbyBoZHNwX2NvbmZpZ19pbmZvX3Q7CisKK3N0cnVjdCBfc25kX2hkc3BfY29uZmlnX2luZm8geworCXVuc2lnbmVkIGNoYXIgcHJlZl9zeW5jX3JlZjsKKwl1bnNpZ25lZCBjaGFyIHdvcmRjbG9ja19zeW5jX2NoZWNrOworCXVuc2lnbmVkIGNoYXIgc3BkaWZfc3luY19jaGVjazsKKwl1bnNpZ25lZCBjaGFyIGFkYXRzeW5jX3N5bmNfY2hlY2s7CisJdW5zaWduZWQgY2hhciBhZGF0X3N5bmNfY2hlY2tbM107CisJdW5zaWduZWQgY2hhciBzcGRpZl9pbjsKKwl1bnNpZ25lZCBjaGFyIHNwZGlmX291dDsKKwl1bnNpZ25lZCBjaGFyIHNwZGlmX3Byb2Zlc3Npb25hbDsKKwl1bnNpZ25lZCBjaGFyIHNwZGlmX2VtcGhhc2lzOworCXVuc2lnbmVkIGNoYXIgc3BkaWZfbm9uYXVkaW87CisJdW5zaWduZWQgaW50IHNwZGlmX3NhbXBsZV9yYXRlOworCXVuc2lnbmVkIGludCBzeXN0ZW1fc2FtcGxlX3JhdGU7CisJdW5zaWduZWQgaW50IGF1dG9zeW5jX3NhbXBsZV9yYXRlOworCXVuc2lnbmVkIGNoYXIgc3lzdGVtX2Nsb2NrX21vZGU7CisJdW5zaWduZWQgY2hhciBjbG9ja19zb3VyY2U7CisJdW5zaWduZWQgY2hhciBhdXRvc3luY19yZWY7CisJdW5zaWduZWQgY2hhciBsaW5lX291dDsKKwl1bnNpZ25lZCBjaGFyIHBhc3N0aHJ1OyAKKwl1bnNpZ25lZCBjaGFyIGRhX2dhaW47CisJdW5zaWduZWQgY2hhciBhZF9nYWluOworCXVuc2lnbmVkIGNoYXIgcGhvbmVfZ2FpbjsKKwl1bnNpZ25lZCBjaGFyIHhscl9icmVha291dF9jYWJsZTsKKwl1bnNpZ25lZCBjaGFyIGFuYWxvZ19leHRlbnNpb25fYm9hcmQ7Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BfSU9DVExfR0VUX0NPTkZJR19JTkZPIF9JT1IoJ0gnLCAweDQxLCBoZHNwX2NvbmZpZ19pbmZvX3QpCisKK3R5cGVkZWYgc3RydWN0IF9zbmRfaGRzcF9maXJtd2FyZSBoZHNwX2Zpcm13YXJlX3Q7CisKK3N0cnVjdCBfc25kX2hkc3BfZmlybXdhcmUgeworCXZvaWQgKmZpcm13YXJlX2RhdGE7CS8qIDI0NDEzIHggNCBieXRlcyAqLworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX1VQTE9BRF9GSVJNV0FSRSBfSU9XKCdIJywgMHg0MiwgaGRzcF9maXJtd2FyZV90KQorCit0eXBlZGVmIHN0cnVjdCBfc25kX2hkc3BfdmVyc2lvbiBoZHNwX3ZlcnNpb25fdDsKKworc3RydWN0IF9zbmRfaGRzcF92ZXJzaW9uIHsKKwlIRFNQX0lPX1R5cGUgaW9fdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBmaXJtd2FyZV9yZXY7Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BfSU9DVExfR0VUX1ZFUlNJT04gX0lPUignSCcsIDB4NDMsIGhkc3BfdmVyc2lvbl90KQorCit0eXBlZGVmIHN0cnVjdCBfc25kX2hkc3BfbWl4ZXIgaGRzcF9taXhlcl90OworCitzdHJ1Y3QgX3NuZF9oZHNwX21peGVyIHsKKwl1bnNpZ25lZCBzaG9ydCBtYXRyaXhbSERTUF9NQVRSSVhfTUlYRVJfU0laRV07Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BfSU9DVExfR0VUX01JWEVSIF9JT1IoJ0gnLCAweDQ0LCBoZHNwX21peGVyX3QpCisKK3R5cGVkZWYgc3RydWN0IF9zbmRfaGRzcF85NjMyX2FlYiBoZHNwXzk2MzJfYWViX3Q7CisKK3N0cnVjdCBfc25kX2hkc3BfOTYzMl9hZWIgeworCWludCBhZWJpOworCWludCBhZWJvOworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF85NjMyX0FFQiBfSU9SKCdIJywgMHg0NSwgaGRzcF85NjMyX2FlYl90KQorCisjZW5kaWYgLyogX19TT1VORF9IRFNQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9oZHNwbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2hkc3BtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3NGZmNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9oZHNwbS5oCkBAIC0wLDAgKzEsMjI5IEBACisjaWZuZGVmIF9fU09VTkRfSERTUE1fSAorI2RlZmluZSBfX1NPVU5EX0hEU1BNX0gKKy8qCisgKiAgIENvcHlyaWdodCAoQykgMjAwMyBXaW5mcmllZCBSaXRzY2ggKElFTSkKKyAqICAgYmFzZWQgb24gaGRzcC5oIGZyb20gVGhvbWFzIENoYXJib25uZWwgKHRob21hc0B1bmRhdGEub3JnKQorICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyogTWF4aW11bSBjaGFubmVscyBpcyA2NCBldmVuIG9uIDU2TW9kZSB5b3UgaGF2ZSA2NHBsYXliYWNrcyB0byBtYXRyaXggKi8KKyNkZWZpbmUgSERTUE1fTUFYX0NIQU5ORUxTICAgICAgNjQKKworZW51bSBoZHNwbV9pb190eXBlIHsKKwlNQURJLAorCU1BRElmYWNlLAorCUFJTywKKwlBRVMzMiwKKwlSYXlEQVQKK307CisKK2VudW0gaGRzcG1fc3BlZWQgeworCXNzLAorCWRzLAorCXFzCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBJT0NUTCBQZWFrL1JNUyBNZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGhkc3BtX3BlYWtfcm1zIHsKKwl1aW50MzJfdCBpbnB1dF9wZWFrc1s2NF07CisJdWludDMyX3QgcGxheWJhY2tfcGVha3NbNjRdOworCXVpbnQzMl90IG91dHB1dF9wZWFrc1s2NF07CisKKwl1aW50NjRfdCBpbnB1dF9ybXNbNjRdOworCXVpbnQ2NF90IHBsYXliYWNrX3Jtc1s2NF07CisJdWludDY0X3Qgb3V0cHV0X3Jtc1s2NF07CisKKwl1aW50OF90IHNwZWVkOyAvKiBlbnVtIHtzcywgZHMsIHFzfSAqLworCWludCBzdGF0dXMyOworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfUEVBS19STVMgXAorCV9JT1IoJ0gnLCAweDQyLCBzdHJ1Y3QgaGRzcG1fcGVha19ybXMpCisKKy8qIC0tLS0tLS0tLS0tLSBDT05GSUcgYmxvY2sgSU9DVEwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgaGRzcG1fY29uZmlnIHsKKwl1bnNpZ25lZCBjaGFyIHByZWZfc3luY19yZWY7CisJdW5zaWduZWQgY2hhciB3b3JkY2xvY2tfc3luY19jaGVjazsKKwl1bnNpZ25lZCBjaGFyIG1hZGlfc3luY19jaGVjazsKKwl1bnNpZ25lZCBpbnQgc3lzdGVtX3NhbXBsZV9yYXRlOworCXVuc2lnbmVkIGludCBhdXRvc3luY19zYW1wbGVfcmF0ZTsKKwl1bnNpZ25lZCBjaGFyIHN5c3RlbV9jbG9ja19tb2RlOworCXVuc2lnbmVkIGNoYXIgY2xvY2tfc291cmNlOworCXVuc2lnbmVkIGNoYXIgYXV0b3N5bmNfcmVmOworCXVuc2lnbmVkIGNoYXIgbGluZV9vdXQ7CisJdW5zaWduZWQgaW50IHBhc3N0aHJ1OworCXVuc2lnbmVkIGludCBhbmFsb2dfb3V0OworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfQ09ORklHIFwKKwlfSU9SKCdIJywgMHg0MSwgc3RydWN0IGhkc3BtX2NvbmZpZykKKworLyoqCisgKiBJZiB0aGVyZSdzIGEgVENPIChUaW1lQ29kZSBPcHRpb24pIGJvYXJkIGluc3RhbGxlZCwKKyAqIHRoZXJlIGFyZSBmdXJ0aGVyIG9wdGlvbnMgYW5kIHN0YXR1cyBkYXRhIGF2YWlsYWJsZS4KKyAqIFRoZSBoZHNwbV9sdGMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBjdXJyZW50IFNNUFRFCisgKiB0aW1lY29kZSBhbmQgc29tZSBzdGF0dXMgaW5mb3JtYXRpb24gYW5kIGNhbiBiZQorICogb2J0YWluZWQgdmlhIFNORFJWX0hEU1BNX0lPQ1RMX0dFVF9MVEMgb3IgaW4gdGhlCisgKiBoZHNwbV9zdGF0dXMgc3RydWN0LgorICoqLworCitlbnVtIGhkc3BtX2x0Y19mb3JtYXQgeworCWZvcm1hdF9pbnZhbGlkLAorCWZwc18yNCwKKwlmcHNfMjUsCisJZnBzXzI5OTcsCisJZnBzXzMwCit9OworCitlbnVtIGhkc3BtX2x0Y19mcmFtZSB7CisJZnJhbWVfaW52YWxpZCwKKwlkcm9wX2ZyYW1lLAorCWZ1bGxfZnJhbWUKK307CisKK2VudW0gaGRzcG1fbHRjX2lucHV0X2Zvcm1hdCB7CisJbnRzYywKKwlwYWwsCisJbm9fdmlkZW8KK307CisKK3N0cnVjdCBoZHNwbV9sdGMgeworCXVuc2lnbmVkIGludCBsdGM7CisKKwllbnVtIGhkc3BtX2x0Y19mb3JtYXQgZm9ybWF0OworCWVudW0gaGRzcG1fbHRjX2ZyYW1lIGZyYW1lOworCWVudW0gaGRzcG1fbHRjX2lucHV0X2Zvcm1hdCBpbnB1dF9mb3JtYXQ7Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BNX0lPQ1RMX0dFVF9MVEMgX0lPUignSCcsIDB4NDYsIHN0cnVjdCBoZHNwbV9taXhlcl9pb2N0bCkKKworLyoqCisgKiBUaGUgc3RhdHVzIGRhdGEgcmVmbGVjdHMgdGhlIGRldmljZSdzIGN1cnJlbnQgc3RhdGUKKyAqIGFzIGRldGVybWluZWQgYnkgdGhlIGNhcmQncyBjb25maWd1cmF0aW9uIGFuZAorICogY29ubmVjdGlvbiBzdGF0dXMuCisgKiovCisKK2VudW0gaGRzcG1fc3luYyB7CisJaGRzcG1fc3luY19ub19sb2NrID0gMCwKKwloZHNwbV9zeW5jX2xvY2sgPSAxLAorCWhkc3BtX3N5bmNfc3luYyA9IDIKK307CisKK2VudW0gaGRzcG1fbWFkaV9pbnB1dCB7CisJaGRzcG1faW5wdXRfb3B0aWNhbCA9IDAsCisJaGRzcG1faW5wdXRfY29heCA9IDEKK307CisKK2VudW0gaGRzcG1fbWFkaV9jaGFubmVsX2Zvcm1hdCB7CisJaGRzcG1fZm9ybWF0X2NoXzY0ID0gMCwKKwloZHNwbV9mb3JtYXRfY2hfNTYgPSAxCit9OworCitlbnVtIGhkc3BtX21hZGlfZnJhbWVfZm9ybWF0IHsKKwloZHNwbV9mcmFtZV80OCA9IDAsCisJaGRzcG1fZnJhbWVfOTYgPSAxCit9OworCitlbnVtIGhkc3BtX3N5bmNzb3VyY2UgeworCXN5bmNzb3VyY2Vfd2MgPSAwLAorCXN5bmNzb3VyY2VfbWFkaSA9IDEsCisJc3luY3NvdXJjZV90Y28gPSAyLAorCXN5bmNzb3VyY2Vfc3luYyA9IDMsCisJc3luY3NvdXJjZV9ub25lID0gNAorfTsKKworc3RydWN0IGhkc3BtX3N0YXR1cyB7CisJdWludDhfdCBjYXJkX3R5cGU7IC8qIGVudW0gaGRzcG1faW9fdHlwZSAqLworCWVudW0gaGRzcG1fc3luY3NvdXJjZSBhdXRvc3luY19zb3VyY2U7CisKKwl1aW50NjRfdCBjYXJkX2Nsb2NrOworCXVpbnQzMl90IG1hc3Rlcl9wZXJpb2Q7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50OF90IHN5bmNfd2M7IC8qIGVudW0gaGRzcG1fc3luYyAqLworCQkJdWludDhfdCBzeW5jX21hZGk7IC8qIGVudW0gaGRzcG1fc3luYyAqLworCQkJdWludDhfdCBzeW5jX3RjbzsgLyogZW51bSBoZHNwbV9zeW5jICovCisJCQl1aW50OF90IHN5bmNfaW47IC8qIGVudW0gaGRzcG1fc3luYyAqLworCQkJdWludDhfdCBtYWRpX2lucHV0OyAvKiBlbnVtIGhkc3BtX21hZGlfaW5wdXQgKi8KKwkJCXVpbnQ4X3QgY2hhbm5lbF9mb3JtYXQ7IC8qIGVudW0gaGRzcG1fbWFkaV9jaGFubmVsX2Zvcm1hdCAqLworCQkJdWludDhfdCBmcmFtZV9mb3JtYXQ7IC8qIGVudW0gaGRzcG1fbWFkaV9mcmFtZV9mb3JtYXQgKi8KKwkJfSBtYWRpOworCX0gY2FyZF9zcGVjaWZpYzsKK307CisKKyNkZWZpbmUgU05EUlZfSERTUE1fSU9DVExfR0VUX1NUQVRVUyBcCisJX0lPUignSCcsIDB4NDcsIHN0cnVjdCBoZHNwbV9zdGF0dXMpCisKKy8qKgorICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYXJkIGFuZCBpdHMgYWRkLW9ucy4KKyAqKi8KKworI2RlZmluZSBIRFNQTV9BRERPTl9UQ08gMQorCitzdHJ1Y3QgaGRzcG1fdmVyc2lvbiB7CisJdWludDhfdCBjYXJkX3R5cGU7IC8qIGVudW0gaGRzcG1faW9fdHlwZSAqLworCWNoYXIgY2FyZG5hbWVbMjBdOworCXVuc2lnbmVkIGludCBzZXJpYWw7CisJdW5zaWduZWQgc2hvcnQgZmlybXdhcmVfcmV2OworCWludCBhZGRvbnM7Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BNX0lPQ1RMX0dFVF9WRVJTSU9OIF9JT1IoJ0gnLCAweDQ4LCBzdHJ1Y3QgaGRzcG1fdmVyc2lvbikKKworLyogLS0tLS0tLS0tLS0tLSBnZXQgTWF0cml4IE1peGVyIElPQ1RMIC0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBNQURJIG1peGVyOiA2NGlucHV0cys2NHBsYXliYWNrIGluIDY0b3V0cHV0cyA9IDgxOTIgPT4gKjRCeXRlID0KKyAqIDMyNzY4IEJ5dGVzCisgKi8KKworLyogb3JnYW5pc2F0aW9uIGlzIDY0IGNoYW5uZWxmYWRlciBpbiBhIGNvbnRpbm91cyBtZW1vcnkgYmxvY2sgKi8KKy8qIGVxdWl2YWxlbnQgdG8gaGFyZHdhcmUgZGVmaW5pdGlvbiwgbWF5YmUgZm9yIGZ1dHVyZSBmZWF0dXJlIG9mIG1tYXAgb2YKKyAqIHRoZW0KKyAqLworLyogZWFjaCBvZiA2NCBvdXRwdXRzIGhhcyA2NCBpbmZhZGVyIGFuZCA2NCBvdXRmYWRlcjoKKyAgIElucyB0byBPdXRzIG1peGVyW291dF0uaW5baW5dLCBPdXRzdHJlYW1zIHRvIE91dHMgbWl4ZXJbb3V0XS5wYltwYl0gKi8KKworI2RlZmluZSBIRFNQTV9NSVhFUl9DSEFOTkVMUyBIRFNQTV9NQVhfQ0hBTk5FTFMKKworc3RydWN0IGhkc3BtX2NoYW5uZWxmYWRlciB7CisJdW5zaWduZWQgaW50IGluW0hEU1BNX01JWEVSX0NIQU5ORUxTXTsKKwl1bnNpZ25lZCBpbnQgcGJbSERTUE1fTUlYRVJfQ0hBTk5FTFNdOworfTsKKworc3RydWN0IGhkc3BtX21peGVyIHsKKwlzdHJ1Y3QgaGRzcG1fY2hhbm5lbGZhZGVyIGNoW0hEU1BNX01JWEVSX0NIQU5ORUxTXTsKK307CisKK3N0cnVjdCBoZHNwbV9taXhlcl9pb2N0bCB7CisJc3RydWN0IGhkc3BtX21peGVyICptaXhlcjsKK307CisKKy8qIHVzZSBpbmRpcmVjdCBhY2Nlc3MgZHVlIHRvIHRoZSBsaW1pdCBvZiBpb2N0bCBiaXQgc2l6ZSAqLworI2RlZmluZSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfTUlYRVIgX0lPUignSCcsIDB4NDQsIHN0cnVjdCBoZHNwbV9taXhlcl9pb2N0bCkKKworLyogdHlwZWRlZnMgZm9yIGNvbXBhdGliaWxpdHkgdG8gdXNlci1zcGFjZSAqLwordHlwZWRlZiBzdHJ1Y3QgaGRzcG1fcGVha19ybXMgaGRzcG1fcGVha19ybXNfdDsKK3R5cGVkZWYgc3RydWN0IGhkc3BtX2NvbmZpZ19pbmZvIGhkc3BtX2NvbmZpZ19pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBoZHNwbV92ZXJzaW9uIGhkc3BtX3ZlcnNpb25fdDsKK3R5cGVkZWYgc3RydWN0IGhkc3BtX2NoYW5uZWxmYWRlciBzbmRfaGRzcG1fY2hhbm5lbGZhZGVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBoZHNwbV9taXhlciBoZHNwbV9taXhlcl90OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL3NiMTZfY3NwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvc2IxNl9jc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODgxN2I0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL3NiMTZfY3NwLmgKQEAgLTAsMCArMSwxMTUgQEAKKyNpZm5kZWYgX19TT1VORF9TQjE2X0NTUF9ICisjZGVmaW5lIF9fU09VTkRfU0IxNl9DU1BfSAorCisvKgorICogIENvcHlyaWdodCAoYykgMTk5OSBieSBVcm9zIEJpemphayA8dXJvc0Brc3MtbG9rYS5zaT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICBTQjE2QVNQL0FXRTMyIENTUCBjb250cm9sCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworLyogQ1NQIG1vZGVzICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9NT0RFX05PTkUJCTB4MDAKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX01PREVfRFNQX1JFQUQJMHgwMQkvKiBSZWNvcmQgZnJvbSBEU1AgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX01PREVfRFNQX1dSSVRFCTB4MDIJLyogUGxheSB0byBEU1AgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX01PREVfUVNPVU5ECQkweDA0CS8qIFFTb3VuZCAqLworCisvKiBDU1AgbG9hZCBmbGFncyAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfTE9BRF9GUk9NVVNFUgkweDAxCisjZGVmaW5lIFNORFJWX1NCX0NTUF9MT0FEX0lOSVRCTE9DSwkweDAyCisKKy8qIENTUCBzYW1wbGUgd2lkdGggKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NBTVBMRV84QklUCQkweDAxCisjZGVmaW5lIFNORFJWX1NCX0NTUF9TQU1QTEVfMTZCSVQJCTB4MDIKKworLyogQ1NQIGNoYW5uZWxzICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9NT05PCQkJMHgwMQorI2RlZmluZSBTTkRSVl9TQl9DU1BfU1RFUkVPCQkweDAyCisKKy8qIENTUCByYXRlcyAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfUkFURV84MDAwCQkweDAxCisjZGVmaW5lIFNORFJWX1NCX0NTUF9SQVRFXzExMDI1CQkweDAyCisjZGVmaW5lIFNORFJWX1NCX0NTUF9SQVRFXzIyMDUwCQkweDA0CisjZGVmaW5lIFNORFJWX1NCX0NTUF9SQVRFXzQ0MTAwCQkweDA4CisjZGVmaW5lIFNORFJWX1NCX0NTUF9SQVRFX0FMTAkJMHgwZgorCisvKiBDU1AgcnVubmluZyBzdGF0ZSAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfU1RfSURMRQkJMHgwMAorI2RlZmluZSBTTkRSVl9TQl9DU1BfU1RfTE9BREVECQkweDAxCisjZGVmaW5lIFNORFJWX1NCX0NTUF9TVF9SVU5OSU5HCQkweDAyCisjZGVmaW5lIFNORFJWX1NCX0NTUF9TVF9QQVVTRUQJCTB4MDQKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NUX0FVVE8JCTB4MDgKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NUX1FTT1VORAkJMHgxMAorCisvKiBtYXhpbXVtIFFTb3VuZCB2YWx1ZSAoMTgwIGRlZ3JlZXMgcmlnaHQpICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9RU09VTkRfTUFYX1JJR0hUCTB4MjAKKworLyogbWF4aW11bSBtaWNyb2NvZGUgUklGRiBmaWxlIHNpemUgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX01BWF9NSUNST0NPREVfRklMRV9TSVpFCTB4MzAwMAorCisvKiBtaWNyb2NvZGUgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2JfY3NwX21jX2hlYWRlciB7CisJY2hhciBjb2RlY19uYW1lWzE2XTsJCS8qIGlkIG5hbWUgb2YgY29kZWMgKi8KKwl1bnNpZ25lZCBzaG9ydCBmdW5jX3JlcTsJLyogcmVxdWVzdGVkIGZ1bmN0aW9uICovCit9IHNuZF9zYl9jc3BfbWNfaGVhZGVyX3Q7CisKKy8qIG1pY3JvY29kZSB0byBiZSBsb2FkZWQgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zYl9jc3BfbWljcm9jb2RlIHsKKwlzbmRfc2JfY3NwX21jX2hlYWRlcl90IGluZm87CisJdW5zaWduZWQgY2hhciBkYXRhW1NORFJWX1NCX0NTUF9NQVhfTUlDUk9DT0RFX0ZJTEVfU0laRV07Cit9IHNuZF9zYl9jc3BfbWljcm9jb2RlX3Q7CisKKy8qIHN0YXJ0IENTUCB3aXRoIHNhbXBsZV93aWR0aCBpbiBtb25vL3N0ZXJlbyAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NiX2NzcF9zdGFydCB7CisJaW50IHNhbXBsZV93aWR0aDsJLyogc2FtcGxlIHdpZHRoLCBsb29rIGFib3ZlICovCisJaW50IGNoYW5uZWxzOwkJLyogY2hhbm5lbHMsIGxvb2sgYWJvdmUgKi8KK30gc25kX3NiX2NzcF9zdGFydF90OworCisvKiBDU1AgaW5mb3JtYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zYl9jc3BfaW5mbyB7CisJY2hhciBjb2RlY19uYW1lWzE2XTsJCS8qIGlkIG5hbWUgb2YgY29kZWMgKi8KKwl1bnNpZ25lZCBzaG9ydCBmdW5jX25yOwkJLyogZnVuY3Rpb24gbnVtYmVyICovCisJdW5zaWduZWQgaW50IGFjY19mb3JtYXQ7CS8qIGFjY2VwdGVkIFBDTSBmb3JtYXRzICovCisJdW5zaWduZWQgc2hvcnQgYWNjX2NoYW5uZWxzOwkvKiBhY2NlcHRlZCBjaGFubmVscyAqLworCXVuc2lnbmVkIHNob3J0IGFjY193aWR0aDsJLyogYWNjZXB0ZWQgc2FtcGxlIHdpZHRoICovCisJdW5zaWduZWQgc2hvcnQgYWNjX3JhdGVzOwkvKiBhY2NlcHRlZCBzYW1wbGUgcmF0ZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBjc3BfbW9kZTsJLyogQ1NQIG1vZGUsIHNlZSBhYm92ZSAqLworCXVuc2lnbmVkIHNob3J0IHJ1bl9jaGFubmVsczsJLyogY3VycmVudCBjaGFubmVscyAgKi8KKwl1bnNpZ25lZCBzaG9ydCBydW5fd2lkdGg7CS8qIGN1cnJlbnQgc2FtcGxlIHdpZHRoICovCisJdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsJCS8qIHZlcnNpb24gaWQ6IDB4MTAgLSAweDFmICovCisJdW5zaWduZWQgc2hvcnQgc3RhdGU7CQkvKiBzdGF0ZSBiaXRzICovCit9IHNuZF9zYl9jc3BfaW5mb190OworCisvKiBIV0RFUCBjb250cm9scyAqLworLyogZ2V0IENTUCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfSU5GTwkJX0lPUignSCcsIDB4MTAsIHNuZF9zYl9jc3BfaW5mb190KQorLyogbG9hZCBtaWNyb2NvZGUgdG8gQ1NQICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9MT0FEX0NPREUJX0lPVygnSCcsIDB4MTEsIHNuZF9zYl9jc3BfbWljcm9jb2RlX3QpCisvKiB1bmxvYWQgbWljcm9jb2RlIGZyb20gQ1NQICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9VTkxPQURfQ09ERQlfSU8oJ0gnLCAweDEyKQorLyogc3RhcnQgQ1NQICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9TVEFSVAlfSU9XKCdIJywgMHgxMywgc25kX3NiX2NzcF9zdGFydF90KQorLyogc3RvcCBDU1AgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX1NUT1AJCV9JTygnSCcsIDB4MTQpCisvKiBwYXVzZSBDU1AgYW5kIERNQSB0cmFuc2ZlciAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfUEFVU0UJX0lPKCdIJywgMHgxNSkKKy8qIHJlc3RhcnQgQ1NQIGFuZCBETUEgdHJhbnNmZXIgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX1JFU1RBUlQJX0lPKCdIJywgMHgxNikKKworCisjZW5kaWYgLyogX19TT1VORF9TQjE2X0NTUCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL3NzY2FwZV9pb2N0bC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL3NzY2FwZV9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NjUzZWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvc3NjYXBlX2lvY3RsLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBTU0NBUEVfSU9DVExfSAorI2RlZmluZSBTU0NBUEVfSU9DVExfSAorCisKK3N0cnVjdCBzc2NhcGVfYm9vdGJsb2NrCit7CisgIHVuc2lnbmVkIGNoYXIgY29kZVsyNTZdOworICB1bnNpZ25lZCB2ZXJzaW9uOworfTsKKworI2RlZmluZSBTU0NBUEVfTUlDUk9DT0RFX1NJWkUgIDY1NTM2CisKK3N0cnVjdCBzc2NhcGVfbWljcm9jb2RlCit7CisgIHVuc2lnbmVkIGNoYXIgKmNvZGU7Cit9OworCisjZGVmaW5lIFNORF9TU0NBUEVfTE9BRF9CT09UQiAgX0lPV1IoJ1AnLCAxMDAsIHN0cnVjdCBzc2NhcGVfYm9vdGJsb2NrKQorI2RlZmluZSBTTkRfU1NDQVBFX0xPQURfTUNPREUgIF9JT1cgKCdQJywgMTAxLCBzdHJ1Y3Qgc3NjYXBlX21pY3JvY29kZSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvdHlwZV9jb21wYXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC90eXBlX2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYzg2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvdHlwZV9jb21wYXQuaApAQCAtMCwwICsxLDQwIEBACisjaWZuZGVmIF9fVFlQRV9DT01QQVRfSAorI2RlZmluZSBfX1RZUEVfQ09NUEFUX0gKKworI2lmbmRlZiBET0NfSElEREVOCisjaW5jbHVkZSA8c3RkaW50Lmg+Cit0eXBlZGVmIHVpbnQ4X3QgX191ODsKK3R5cGVkZWYgdWludDE2X3QgX191MTY7Cit0eXBlZGVmIHVpbnQzMl90IF9fdTMyOwordHlwZWRlZiBpbnQ4X3QgX19zODsKK3R5cGVkZWYgaW50MTZfdCBfX3MxNjsKK3R5cGVkZWYgaW50MzJfdCBfX3MzMjsKKworI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorI2RlZmluZSBfX2NwdV90b19sZTMyKHgpICh4KQorI2RlZmluZSBfX2NwdV90b19iZTMyKHgpIGJzd2FwXzMyKHgpCisjZGVmaW5lIF9fY3B1X3RvX2xlMTYoeCkgKHgpCisjZGVmaW5lIF9fY3B1X3RvX2JlMTYoeCkgYnN3YXBfMTYoeCkKKyNlbHNlCisjZGVmaW5lIF9fY3B1X3RvX2xlMzIoeCkgYnN3YXBfMzIoeCkKKyNkZWZpbmUgX19jcHVfdG9fYmUzMih4KSAoeCkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNih4KSBic3dhcF8xNih4KQorI2RlZmluZSBfX2NwdV90b19iZTE2KHgpICh4KQorI2VuZGlmCisKKyNkZWZpbmUgX19sZTMyX3RvX2NwdSBfX2NwdV90b19sZTMyCisjZGVmaW5lIF9fYmUzMl90b19jcHUgX19jcHVfdG9fYmUzMgorI2RlZmluZSBfX2xlMTZfdG9fY3B1IF9fY3B1X3RvX2xlMTYKKyNkZWZpbmUgX19iZTE2X3RvX2NwdSBfX2NwdV90b19iZTE2CisKKyNkZWZpbmUgX19sZTY0IF9fdTY0CisjZGVmaW5lIF9fbGUzMiBfX3UzMgorI2RlZmluZSBfX2xlMTYgX191MTYKKyNkZWZpbmUgX19iZTY0IF9fdTY0CisjZGVmaW5lIF9fYmUzMiBfX3UzMgorI2RlZmluZSBfX2JlMTYgX191MTYKKyNlbmRpZiAvKiBET0NfSElEREVOICovCisKKyNlbmRpZiAvKiBfX1RZUEVfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS90aW1lci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwM2Y1MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS90aW1lci5oCkBAIC0wLDAgKzEsMjU5IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvdGltZXIuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfVElNRVJfSAorI2RlZmluZSBfX0FMU0FfVElNRVJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBUaW1lciBUaW1lciBJbnRlcmZhY2UKKyAqICBUaW1lciBJbnRlcmZhY2UuIFNlZSBccmVmIHRpbWVyIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICBceworICovCisKKy8qKiBkbHN5bSB2ZXJzaW9uIGZvciBpbnRlcmZhY2UgZW50cnkgY2FsbGJhY2sgKi8KKyNkZWZpbmUgU05EX1RJTUVSX0RMU1lNX1ZFUlNJT04JCV9kbHN5bV90aW1lcl8wMDEKKy8qKiBkbHN5bSB2ZXJzaW9uIGZvciBpbnRlcmZhY2UgZW50cnkgY2FsbGJhY2sgKi8KKyNkZWZpbmUgU05EX1RJTUVSX1FVRVJZX0RMU1lNX1ZFUlNJT04JX2Rsc3ltX3RpbWVyX3F1ZXJ5XzAwMQorCisvKiogdGltZXIgaWRlbnRpZmljYXRpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3RpbWVyX2lkIHNuZF90aW1lcl9pZF90OworLyoqIHRpbWVyIGdsb2JhbCBpbmZvIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF90aW1lcl9naW5mbyBzbmRfdGltZXJfZ2luZm9fdDsKKy8qKiB0aW1lciBnbG9iYWwgcGFyYW1zIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF90aW1lcl9ncGFyYW1zIHNuZF90aW1lcl9ncGFyYW1zX3Q7CisvKiogdGltZXIgZ2xvYmFsIHN0YXR1cyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfdGltZXJfZ3N0YXR1cyBzbmRfdGltZXJfZ3N0YXR1c190OworLyoqIHRpbWVyIGluZm8gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3RpbWVyX2luZm8gc25kX3RpbWVyX2luZm9fdDsKKy8qKiB0aW1lciBwYXJhbXMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3RpbWVyX3BhcmFtcyBzbmRfdGltZXJfcGFyYW1zX3Q7CisvKiogdGltZXIgc3RhdHVzIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF90aW1lcl9zdGF0dXMgc25kX3RpbWVyX3N0YXR1c190OworLyoqIHRpbWVyIG1hc3RlciBjbGFzcyAqLwordHlwZWRlZiBlbnVtIF9zbmRfdGltZXJfY2xhc3MgeworCVNORF9USU1FUl9DTEFTU19OT05FID0gLTEsCS8qKjwgaW52YWxpZCAqLworCVNORF9USU1FUl9DTEFTU19TTEFWRSA9IDAsCS8qKjwgc2xhdmUgdGltZXIgKi8KKwlTTkRfVElNRVJfQ0xBU1NfR0xPQkFMLAkJLyoqPCBnbG9iYWwgdGltZXIgKi8KKwlTTkRfVElNRVJfQ0xBU1NfQ0FSRCwJCS8qKjwgY2FyZCB0aW1lciAqLworCVNORF9USU1FUl9DTEFTU19QQ00sCQkvKio8IFBDTSB0aW1lciAqLworCVNORF9USU1FUl9DTEFTU19MQVNUID0gU05EX1RJTUVSX0NMQVNTX1BDTQkvKio8IGxhc3QgdGltZXIgKi8KK30gc25kX3RpbWVyX2NsYXNzX3Q7CisKKy8qKiB0aW1lciBzbGF2ZSBjbGFzcyAqLwordHlwZWRlZiBlbnVtIF9zbmRfdGltZXJfc2xhdmVfY2xhc3MgeworCVNORF9USU1FUl9TQ0xBU1NfTk9ORSA9IDAsCQkvKio8IG5vbmUgKi8KKwlTTkRfVElNRVJfU0NMQVNTX0FQUExJQ0FUSU9OLAkJLyoqPCBmb3IgaW50ZXJuYWwgdXNlICovCisJU05EX1RJTUVSX1NDTEFTU19TRVFVRU5DRVIsCQkvKio8IHNlcXVlbmNlciB0aW1lciAqLworCVNORF9USU1FUl9TQ0xBU1NfT1NTX1NFUVVFTkNFUiwJCS8qKjwgT1NTIHNlcXVlbmNlciB0aW1lciAqLworCVNORF9USU1FUl9TQ0xBU1NfTEFTVCA9IFNORF9USU1FUl9TQ0xBU1NfT1NTX1NFUVVFTkNFUgkvKio8IGxhc3Qgc2xhdmUgdGltZXIgKi8KK30gc25kX3RpbWVyX3NsYXZlX2NsYXNzX3Q7CisKKy8qKiB0aW1lciByZWFkIGV2ZW50IGlkZW50aWZpY2F0aW9uICovCit0eXBlZGVmIGVudW0gX3NuZF90aW1lcl9ldmVudCB7CisJU05EX1RJTUVSX0VWRU5UX1JFU09MVVRJT04gPSAwLAkvKiB2YWwgPSByZXNvbHV0aW9uIGluIG5zICovCisJU05EX1RJTUVSX0VWRU5UX1RJQ0ssCQkvKiB2YWwgPSB0aWNrcyAqLworCVNORF9USU1FUl9FVkVOVF9TVEFSVCwJCS8qIHZhbCA9IHJlc29sdXRpb24gaW4gbnMgKi8KKwlTTkRfVElNRVJfRVZFTlRfU1RPUCwJCS8qIHZhbCA9IDAgKi8KKwlTTkRfVElNRVJfRVZFTlRfQ09OVElOVUUsCS8qIHZhbCA9IHJlc29sdXRpb24gaW4gbnMgKi8KKwlTTkRfVElNRVJfRVZFTlRfUEFVU0UsCQkvKiB2YWwgPSAwICovCisJU05EX1RJTUVSX0VWRU5UX0VBUkxZLAkJLyogdmFsID0gMCAqLworCVNORF9USU1FUl9FVkVOVF9TVVNQRU5ELAkvKiB2YWwgPSAwICovCisJU05EX1RJTUVSX0VWRU5UX1JFU1VNRSwJCS8qIHZhbCA9IHJlc29sdXRpb24gaW4gbnMgKi8KKwkvKiBtYXN0ZXIgdGltZXIgZXZlbnRzIGZvciBzbGF2ZSB0aW1lciBpbnN0YW5jZXMgKi8KKwlTTkRfVElNRVJfRVZFTlRfTVNUQVJUID0gU05EX1RJTUVSX0VWRU5UX1NUQVJUICsgMTAsCisJU05EX1RJTUVSX0VWRU5UX01TVE9QID0gU05EX1RJTUVSX0VWRU5UX1NUT1AgKyAxMCwKKwlTTkRfVElNRVJfRVZFTlRfTUNPTlRJTlVFID0gU05EX1RJTUVSX0VWRU5UX0NPTlRJTlVFICsgMTAsCisJU05EX1RJTUVSX0VWRU5UX01QQVVTRSA9IFNORF9USU1FUl9FVkVOVF9QQVVTRSArIDEwLAorCVNORF9USU1FUl9FVkVOVF9NU1VTUEVORCA9IFNORF9USU1FUl9FVkVOVF9TVVNQRU5EICsgMTAsCisJU05EX1RJTUVSX0VWRU5UX01SRVNVTUUgPSBTTkRfVElNRVJfRVZFTlRfUkVTVU1FICsgMTAJCit9IHNuZF90aW1lcl9ldmVudF90OworCisvKiogdGltZXIgcmVhZCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfdGltZXJfcmVhZCB7CisJdW5zaWduZWQgaW50IHJlc29sdXRpb247CS8qKjwgdGljayByZXNvbHV0aW9uIGluIG5hbm9zZWNvbmRzICovCisgICAgICAgIHVuc2lnbmVkIGludCB0aWNrczsJCS8qKjwgY291bnQgb2YgaGFwcGVuZWQgdGlja3MgKi8KK30gc25kX3RpbWVyX3JlYWRfdDsKKworLyoqIHRpbWVyIHRzdGFtcCArIGV2ZW50IHJlYWQgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3RpbWVyX3RyZWFkIHsKKwlzbmRfdGltZXJfZXZlbnRfdCBldmVudDsJLyoqPCBUaW1lciBldmVudCAqLworCXNuZF9odGltZXN0YW1wX3QgdHN0YW1wOwkvKio8IFRpbWUgc3RhbXAgb2YgZWFjaCBldmVudCAqLworCXVuc2lnbmVkIGludCB2YWw7CQkvKio8IEV2ZW50IHZhbHVlICovCit9IHNuZF90aW1lcl90cmVhZF90OworCisvKiogZ2xvYmFsIHRpbWVyIC0gc3lzdGVtICovCisjZGVmaW5lIFNORF9USU1FUl9HTE9CQUxfU1lTVEVNIDAKKy8qKiBnbG9iYWwgdGltZXIgLSBSVEMgKi8KKyNkZWZpbmUgU05EX1RJTUVSX0dMT0JBTF9SVEMgCTEKKy8qKiBnbG9iYWwgdGltZXIgLSBIUEVUICovCisjZGVmaW5lIFNORF9USU1FUl9HTE9CQUxfSFBFVAkyCisvKiogZ2xvYmFsIHRpbWVyIC0gSFJUSU1FUiAqLworI2RlZmluZSBTTkRfVElNRVJfR0xPQkFMX0hSVElNRVIgMworCisvKiogdGltZXIgb3BlbiBtb2RlIGZsYWcgLSBub24tYmxvY2tpbmcgYmVoYXZpb3VyICovCisjZGVmaW5lIFNORF9USU1FUl9PUEVOX05PTkJMT0NLCQkoMTw8MCkKKy8qKiB1c2UgdGltZXN0YW1wcyBhbmQgZXZlbnQgbm90aWZpY2F0aW9uIC0gZW5oYW5jZWQgcmVhZCAqLworI2RlZmluZSBTTkRfVElNRVJfT1BFTl9UUkVBRAkJKDE8PDEpCisKKy8qKiB0aW1lciBoYW5kbGUgdHlwZSAqLwordHlwZWRlZiBlbnVtIF9zbmRfdGltZXJfdHlwZSB7CisJLyoqIEtlcm5lbCBsZXZlbCBId0RlcCAqLworCVNORF9USU1FUl9UWVBFX0hXID0gMCwKKwkvKiogU2hhcmVkIG1lbW9yeSBjbGllbnQgdGltZXIgKG5vdCB5ZXQgaW1wbGVtZW50ZWQpICovCisJU05EX1RJTUVSX1RZUEVfU0hNLAorCS8qKiBJTkVUIGNsaWVudCB0aW1lciAobm90IHlldCBpbXBsZW1lbnRlZCkgKi8KKwlTTkRfVElNRVJfVFlQRV9JTkVUCit9IHNuZF90aW1lcl90eXBlX3Q7CisKKy8qKiB0aW1lciBxdWVyeSBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfdGltZXJfcXVlcnkgc25kX3RpbWVyX3F1ZXJ5X3Q7CisvKiogdGltZXIgaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3RpbWVyIHNuZF90aW1lcl90OworCisKK2ludCBzbmRfdGltZXJfcXVlcnlfb3BlbihzbmRfdGltZXJfcXVlcnlfdCAqKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUpOworaW50IHNuZF90aW1lcl9xdWVyeV9vcGVuX2xjb25mKHNuZF90aW1lcl9xdWVyeV90ICoqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSwgc25kX2NvbmZpZ190ICpsY29uZik7CitpbnQgc25kX3RpbWVyX3F1ZXJ5X2Nsb3NlKHNuZF90aW1lcl9xdWVyeV90ICpoYW5kbGUpOworaW50IHNuZF90aW1lcl9xdWVyeV9uZXh0X2RldmljZShzbmRfdGltZXJfcXVlcnlfdCAqaGFuZGxlLCBzbmRfdGltZXJfaWRfdCAqdGlkKTsKK2ludCBzbmRfdGltZXJfcXVlcnlfaW5mbyhzbmRfdGltZXJfcXVlcnlfdCAqaGFuZGxlLCBzbmRfdGltZXJfZ2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3RpbWVyX3F1ZXJ5X3BhcmFtcyhzbmRfdGltZXJfcXVlcnlfdCAqaGFuZGxlLCBzbmRfdGltZXJfZ3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF90aW1lcl9xdWVyeV9zdGF0dXMoc25kX3RpbWVyX3F1ZXJ5X3QgKmhhbmRsZSwgc25kX3RpbWVyX2dzdGF0dXNfdCAqc3RhdHVzKTsKKworaW50IHNuZF90aW1lcl9vcGVuKHNuZF90aW1lcl90ICoqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSk7CitpbnQgc25kX3RpbWVyX29wZW5fbGNvbmYoc25kX3RpbWVyX3QgKipoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlLCBzbmRfY29uZmlnX3QgKmxjb25mKTsKK2ludCBzbmRfdGltZXJfY2xvc2Uoc25kX3RpbWVyX3QgKmhhbmRsZSk7CitpbnQgc25kX2FzeW5jX2FkZF90aW1lcl9oYW5kbGVyKHNuZF9hc3luY19oYW5kbGVyX3QgKipoYW5kbGVyLCBzbmRfdGltZXJfdCAqdGltZXIsCisJCQkJc25kX2FzeW5jX2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKnByaXZhdGVfZGF0YSk7CitzbmRfdGltZXJfdCAqc25kX2FzeW5jX2hhbmRsZXJfZ2V0X3RpbWVyKHNuZF9hc3luY19oYW5kbGVyX3QgKmhhbmRsZXIpOworaW50IHNuZF90aW1lcl9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KHNuZF90aW1lcl90ICpoYW5kbGUpOworaW50IHNuZF90aW1lcl9wb2xsX2Rlc2NyaXB0b3JzKHNuZF90aW1lcl90ICpoYW5kbGUsIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBzcGFjZSk7CitpbnQgc25kX3RpbWVyX3BvbGxfZGVzY3JpcHRvcnNfcmV2ZW50cyhzbmRfdGltZXJfdCAqdGltZXIsIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqcmV2ZW50cyk7CitpbnQgc25kX3RpbWVyX2luZm8oc25kX3RpbWVyX3QgKmhhbmRsZSwgc25kX3RpbWVyX2luZm9fdCAqdGltZXIpOworaW50IHNuZF90aW1lcl9wYXJhbXMoc25kX3RpbWVyX3QgKmhhbmRsZSwgc25kX3RpbWVyX3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF90aW1lcl9zdGF0dXMoc25kX3RpbWVyX3QgKmhhbmRsZSwgc25kX3RpbWVyX3N0YXR1c190ICpzdGF0dXMpOworaW50IHNuZF90aW1lcl9zdGFydChzbmRfdGltZXJfdCAqaGFuZGxlKTsKK2ludCBzbmRfdGltZXJfc3RvcChzbmRfdGltZXJfdCAqaGFuZGxlKTsKK2ludCBzbmRfdGltZXJfY29udGludWUoc25kX3RpbWVyX3QgKmhhbmRsZSk7Citzc2l6ZV90IHNuZF90aW1lcl9yZWFkKHNuZF90aW1lcl90ICpoYW5kbGUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCitzaXplX3Qgc25kX3RpbWVyX2lkX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSAjc25kX3RpbWVyX2lkX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF90aW1lcl9pZF9hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfdGltZXJfaWQpCitpbnQgc25kX3RpbWVyX2lkX21hbGxvYyhzbmRfdGltZXJfaWRfdCAqKnB0cik7Cit2b2lkIHNuZF90aW1lcl9pZF9mcmVlKHNuZF90aW1lcl9pZF90ICpvYmopOwordm9pZCBzbmRfdGltZXJfaWRfY29weShzbmRfdGltZXJfaWRfdCAqZHN0LCBjb25zdCBzbmRfdGltZXJfaWRfdCAqc3JjKTsKKwordm9pZCBzbmRfdGltZXJfaWRfc2V0X2NsYXNzKHNuZF90aW1lcl9pZF90ICppZCwgaW50IGRldl9jbGFzcyk7CitpbnQgc25kX3RpbWVyX2lkX2dldF9jbGFzcyhzbmRfdGltZXJfaWRfdCAqaWQpOwordm9pZCBzbmRfdGltZXJfaWRfc2V0X3NjbGFzcyhzbmRfdGltZXJfaWRfdCAqaWQsIGludCBkZXZfc2NsYXNzKTsKK2ludCBzbmRfdGltZXJfaWRfZ2V0X3NjbGFzcyhzbmRfdGltZXJfaWRfdCAqaWQpOwordm9pZCBzbmRfdGltZXJfaWRfc2V0X2NhcmQoc25kX3RpbWVyX2lkX3QgKmlkLCBpbnQgY2FyZCk7CitpbnQgc25kX3RpbWVyX2lkX2dldF9jYXJkKHNuZF90aW1lcl9pZF90ICppZCk7Cit2b2lkIHNuZF90aW1lcl9pZF9zZXRfZGV2aWNlKHNuZF90aW1lcl9pZF90ICppZCwgaW50IGRldmljZSk7CitpbnQgc25kX3RpbWVyX2lkX2dldF9kZXZpY2Uoc25kX3RpbWVyX2lkX3QgKmlkKTsKK3ZvaWQgc25kX3RpbWVyX2lkX3NldF9zdWJkZXZpY2Uoc25kX3RpbWVyX2lkX3QgKmlkLCBpbnQgc3ViZGV2aWNlKTsKK2ludCBzbmRfdGltZXJfaWRfZ2V0X3N1YmRldmljZShzbmRfdGltZXJfaWRfdCAqaWQpOworCitzaXplX3Qgc25kX3RpbWVyX2dpbmZvX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSAjc25kX3RpbWVyX2dpbmZvX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF90aW1lcl9naW5mb19hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfdGltZXJfZ2luZm8pCitpbnQgc25kX3RpbWVyX2dpbmZvX21hbGxvYyhzbmRfdGltZXJfZ2luZm9fdCAqKnB0cik7Cit2b2lkIHNuZF90aW1lcl9naW5mb19mcmVlKHNuZF90aW1lcl9naW5mb190ICpvYmopOwordm9pZCBzbmRfdGltZXJfZ2luZm9fY29weShzbmRfdGltZXJfZ2luZm9fdCAqZHN0LCBjb25zdCBzbmRfdGltZXJfZ2luZm9fdCAqc3JjKTsKKworaW50IHNuZF90aW1lcl9naW5mb19zZXRfdGlkKHNuZF90aW1lcl9naW5mb190ICpvYmosIHNuZF90aW1lcl9pZF90ICp0aWQpOworc25kX3RpbWVyX2lkX3QgKnNuZF90aW1lcl9naW5mb19nZXRfdGlkKHNuZF90aW1lcl9naW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF90aW1lcl9naW5mb19nZXRfZmxhZ3Moc25kX3RpbWVyX2dpbmZvX3QgKm9iaik7CitpbnQgc25kX3RpbWVyX2dpbmZvX2dldF9jYXJkKHNuZF90aW1lcl9naW5mb190ICpvYmopOworY2hhciAqc25kX3RpbWVyX2dpbmZvX2dldF9pZChzbmRfdGltZXJfZ2luZm9fdCAqb2JqKTsKK2NoYXIgKnNuZF90aW1lcl9naW5mb19nZXRfbmFtZShzbmRfdGltZXJfZ2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGxvbmcgc25kX3RpbWVyX2dpbmZvX2dldF9yZXNvbHV0aW9uKHNuZF90aW1lcl9naW5mb190ICpvYmopOwordW5zaWduZWQgbG9uZyBzbmRfdGltZXJfZ2luZm9fZ2V0X3Jlc29sdXRpb25fbWluKHNuZF90aW1lcl9naW5mb190ICpvYmopOwordW5zaWduZWQgbG9uZyBzbmRfdGltZXJfZ2luZm9fZ2V0X3Jlc29sdXRpb25fbWF4KHNuZF90aW1lcl9naW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF90aW1lcl9naW5mb19nZXRfY2xpZW50cyhzbmRfdGltZXJfZ2luZm9fdCAqb2JqKTsKKworc2l6ZV90IHNuZF90aW1lcl9pbmZvX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSAjc25kX3RpbWVyX2luZm9fdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX3RpbWVyX2luZm9fYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX3RpbWVyX2luZm8pCitpbnQgc25kX3RpbWVyX2luZm9fbWFsbG9jKHNuZF90aW1lcl9pbmZvX3QgKipwdHIpOwordm9pZCBzbmRfdGltZXJfaW5mb19mcmVlKHNuZF90aW1lcl9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF90aW1lcl9pbmZvX2NvcHkoc25kX3RpbWVyX2luZm9fdCAqZHN0LCBjb25zdCBzbmRfdGltZXJfaW5mb190ICpzcmMpOworCitpbnQgc25kX3RpbWVyX2luZm9faXNfc2xhdmUoc25kX3RpbWVyX2luZm9fdCAqIGluZm8pOworaW50IHNuZF90aW1lcl9pbmZvX2dldF9jYXJkKHNuZF90aW1lcl9pbmZvX3QgKiBpbmZvKTsKK2NvbnN0IGNoYXIgKnNuZF90aW1lcl9pbmZvX2dldF9pZChzbmRfdGltZXJfaW5mb190ICogaW5mbyk7Citjb25zdCBjaGFyICpzbmRfdGltZXJfaW5mb19nZXRfbmFtZShzbmRfdGltZXJfaW5mb190ICogaW5mbyk7Citsb25nIHNuZF90aW1lcl9pbmZvX2dldF9yZXNvbHV0aW9uKHNuZF90aW1lcl9pbmZvX3QgKiBpbmZvKTsKKworc2l6ZV90IHNuZF90aW1lcl9wYXJhbXNfc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlICNzbmRfdGltZXJfcGFyYW1zX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF90aW1lcl9wYXJhbXNfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX3RpbWVyX3BhcmFtcykKK2ludCBzbmRfdGltZXJfcGFyYW1zX21hbGxvYyhzbmRfdGltZXJfcGFyYW1zX3QgKipwdHIpOwordm9pZCBzbmRfdGltZXJfcGFyYW1zX2ZyZWUoc25kX3RpbWVyX3BhcmFtc190ICpvYmopOwordm9pZCBzbmRfdGltZXJfcGFyYW1zX2NvcHkoc25kX3RpbWVyX3BhcmFtc190ICpkc3QsIGNvbnN0IHNuZF90aW1lcl9wYXJhbXNfdCAqc3JjKTsKKworaW50IHNuZF90aW1lcl9wYXJhbXNfc2V0X2F1dG9fc3RhcnQoc25kX3RpbWVyX3BhcmFtc190ICogcGFyYW1zLCBpbnQgYXV0b19zdGFydCk7CitpbnQgc25kX3RpbWVyX3BhcmFtc19nZXRfYXV0b19zdGFydChzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMpOworaW50IHNuZF90aW1lcl9wYXJhbXNfc2V0X2V4Y2x1c2l2ZShzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMsIGludCBleGNsdXNpdmUpOworaW50IHNuZF90aW1lcl9wYXJhbXNfZ2V0X2V4Y2x1c2l2ZShzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMpOworaW50IHNuZF90aW1lcl9wYXJhbXNfc2V0X2Vhcmx5X2V2ZW50KHNuZF90aW1lcl9wYXJhbXNfdCAqIHBhcmFtcywgaW50IGVhcmx5X2V2ZW50KTsKK2ludCBzbmRfdGltZXJfcGFyYW1zX2dldF9lYXJseV9ldmVudChzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMpOwordm9pZCBzbmRfdGltZXJfcGFyYW1zX3NldF90aWNrcyhzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMsIGxvbmcgdGlja3MpOworbG9uZyBzbmRfdGltZXJfcGFyYW1zX2dldF90aWNrcyhzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMpOwordm9pZCBzbmRfdGltZXJfcGFyYW1zX3NldF9xdWV1ZV9zaXplKHNuZF90aW1lcl9wYXJhbXNfdCAqIHBhcmFtcywgbG9uZyBxdWV1ZV9zaXplKTsKK2xvbmcgc25kX3RpbWVyX3BhcmFtc19nZXRfcXVldWVfc2l6ZShzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMpOwordm9pZCBzbmRfdGltZXJfcGFyYW1zX3NldF9maWx0ZXIoc25kX3RpbWVyX3BhcmFtc190ICogcGFyYW1zLCB1bnNpZ25lZCBpbnQgZmlsdGVyKTsKK3Vuc2lnbmVkIGludCBzbmRfdGltZXJfcGFyYW1zX2dldF9maWx0ZXIoc25kX3RpbWVyX3BhcmFtc190ICogcGFyYW1zKTsKKworc2l6ZV90IHNuZF90aW1lcl9zdGF0dXNfc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlICNzbmRfdGltZXJfc3RhdHVzX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF90aW1lcl9zdGF0dXNfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX3RpbWVyX3N0YXR1cykKK2ludCBzbmRfdGltZXJfc3RhdHVzX21hbGxvYyhzbmRfdGltZXJfc3RhdHVzX3QgKipwdHIpOwordm9pZCBzbmRfdGltZXJfc3RhdHVzX2ZyZWUoc25kX3RpbWVyX3N0YXR1c190ICpvYmopOwordm9pZCBzbmRfdGltZXJfc3RhdHVzX2NvcHkoc25kX3RpbWVyX3N0YXR1c190ICpkc3QsIGNvbnN0IHNuZF90aW1lcl9zdGF0dXNfdCAqc3JjKTsKKworc25kX2h0aW1lc3RhbXBfdCBzbmRfdGltZXJfc3RhdHVzX2dldF90aW1lc3RhbXAoc25kX3RpbWVyX3N0YXR1c190ICogc3RhdHVzKTsKK2xvbmcgc25kX3RpbWVyX3N0YXR1c19nZXRfcmVzb2x1dGlvbihzbmRfdGltZXJfc3RhdHVzX3QgKiBzdGF0dXMpOworbG9uZyBzbmRfdGltZXJfc3RhdHVzX2dldF9sb3N0KHNuZF90aW1lcl9zdGF0dXNfdCAqIHN0YXR1cyk7Citsb25nIHNuZF90aW1lcl9zdGF0dXNfZ2V0X292ZXJydW4oc25kX3RpbWVyX3N0YXR1c190ICogc3RhdHVzKTsKK2xvbmcgc25kX3RpbWVyX3N0YXR1c19nZXRfcXVldWUoc25kX3RpbWVyX3N0YXR1c190ICogc3RhdHVzKTsKKworLyogZGVwcmVjYXRlZCBmdW5jdGlvbnMsIGZvciBjb21wYXRpYmlsaXR5ICovCitsb25nIHNuZF90aW1lcl9pbmZvX2dldF90aWNrcyhzbmRfdGltZXJfaW5mb190ICogaW5mbyk7CisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyoqIF9fQUxTQV9USU1FUl9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS91c2UtY2FzZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3VzZS1jYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3Yzg0MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS91c2UtY2FzZS5oCkBAIC0wLDAgKzEsMzgxIEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvdXNlLWNhc2UuaAorICogXGJyaWVmIHVzZSBjYXNlIGludGVyZmFjZSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIExpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CisgKiBcYXV0aG9yIFN0ZWZhbiBTY2htaWR0IDxzdGVmYW5Ac2xpbWxvZ2ljLmNvLnVrPgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBKdXN0aW4gWHUgPGp1c3RpbnhAc2xpbWxvZ2ljLmNvLnVrPgorICogXGRhdGUgMjAwOC0yMDEwCisgKi8KKy8qCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBTbGltTG9naWMgTHRkCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jLgorICoKKyAqICBTdXBwb3J0IGZvciB0aGUgdmVyYi9kZXZpY2UvbW9kaWZpZXIgY29yZSBsb2dpYyBhbmQgQVBJLAorICogIGNvbW1hbmQgbGluZSB0b29sIGFuZCBmaWxlIHBhcnNlciB3YXMga2luZGx5IHNwb25zb3JlZCBieQorICogIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAqICBTdXBwb3J0IGZvciBtdWx0aXBsZSBhY3RpdmUgbW9kaWZpZXJzIGFuZCBkZXZpY2VzLAorICogIHRyYW5zaXRpb24gc2VxdWVuY2VzLCBtdWx0aXBsZSBjbGllbnQgYWNjZXNzIGFuZCB1c2VyIGRlZmluZWQgdXNlCisgKiAgY2FzZXMgd2FzIGtpbmRseSBzcG9uc29yZWQgYnkgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqLworCisjaWZuZGVmIF9fQUxTQV9VU0VfQ0FTRV9ICisjZGVmaW5lIF9fQUxTQV9VU0VfQ0FTRV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIFVzZSBDYXNlIEludGVyZmFjZQorICogIFRoZSBBTFNBIFVzZSBDYXNlIG1hbmFnZXIgaW50ZXJmYWNlLgorICogIFNlZSBccmVmIFVzZWNhc2UgcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogIFx7CisgKi8KKworLyoqCisgKiBBTFNBIFVzZSBDYXNlIEludGVyZmFjZQorICoKKyAqIFRoZSB1c2UgY2FzZSBtYW5hZ2VyIHdvcmtzIGJ5IGNvbmZpZ3VyaW5nIHRoZSBzb3VuZCBjYXJkIEFMU0Ega2NvbnRyb2xzIHRvCisgKiBjaGFuZ2UgdGhlIGhhcmR3YXJlIGRpZ2l0YWwgYW5kIGFuYWxvZyBhdWRpbyByb3V0aW5nIHRvIG1hdGNoIHRoZSByZXF1ZXN0ZWQKKyAqIGRldmljZSB1c2UgY2FzZS4gVGhlIHVzZSBjYXNlIG1hbmFnZXIga2NvbnRyb2wgY29uZmlndXJhdGlvbnMgYXJlIHN0b3JlZCBpbgorICogZWFzeSB0byBtb2RpZnkgdGV4dCBmaWxlcy4KKyAqCisgKiBBbiBhdWRpbyB1c2UgY2FzZSBjYW4gYmUgZGVmaW5lZCBieSBhIHZlcmIgYW5kIGRldmljZSBwYXJhbWV0ZXIuIFRoZSB2ZXJiCisgKiBkZXNjcmliZXMgdGhlIHVzZSBjYXNlIGFjdGlvbiBpLmUuIGEgcGhvbmUgY2FsbCwgbGlzdGVuaW5nIHRvIG11c2ljLCByZWNvcmRpbmcKKyAqIGEgY29udmVyc2F0aW9uIGV0Yy4gVGhlIGRldmljZSBkZXNjcmliZXMgdGhlIHBoeXNpY2FsIGF1ZGlvIGNhcHR1cmUgYW5kIHBsYXliYWNrCisgKiBoYXJkd2FyZSBpLmUuIGhlYWRwaG9uZXMsIHBob25lIGhhbmRzZXQsIGJsdWV0b290aCBoZWFkc2V0LCBldGMuCisgKgorICogSXQncyBpbnRlbmRlZCBjbGllbnRzIHdpbGwgbW9zdGx5IG9ubHkgbmVlZCB0byBzZXQgdGhlIHVzZSBjYXNlIHZlcmIgYW5kCisgKiBkZXZpY2UgZm9yIGVhY2ggc3lzdGVtIHVzZSBjYXNlIGNoYW5nZSAoYXMgdGhlIHZlcmIgYW5kIGRldmljZSBwYXJhbWV0ZXJzCisgKiBjb3ZlciBtb3N0IGF1ZGlvIHVzZSBjYXNlcykuCisgKgorICogSG93ZXZlciB0aGVyZSBhcmUgdGltZXMgd2hlbiBhIHVzZSBjYXNlIGhhcyB0byBiZSBtb2RpZmllZCBhdCBydW50aW1lLiBlLmcuCisgKgorICogIG8gSW5jb21pbmcgcGhvbmUgY2FsbCB3aGVuIHRoZSBkZXZpY2UgaXMgcGxheWluZyBtdXNpYworICogIG8gUmVjb3JkaW5nIHNlY3Rpb25zIG9mIGEgcGhvbmUgY2FsbAorICogIG8gUGxheWluZyB0b25lcyBkdXJpbmcgYSBjYWxsLgorICoKKyAqIEluIG9yZGVyIHRvIGFsbG93IGFzeW5jaHJvbm91cyBydW50aW1lIHVzZSBjYXNlIGFkYXB0YXRpb25zLCB3ZSBoYXZlIGEgdGhpcmQKKyAqIG9wdGlvbmFsIG1vZGlmaWVyIHBhcmFtZXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgY29uZmlndXJlCisgKiB0aGUgdXNlIGNhc2UgZHVyaW5nIGxpdmUgYXVkaW8gcnVudGltZS4KKyAqCisgKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgY2xpZW50cyB0byA6LQorICoKKyAqICBvIFF1ZXJ5IHRoZSBzdXBwb3J0ZWQgdXNlIGNhc2UgdmVyYnMsIGRldmljZXMgYW5kIG1vZGlmaWVycyBmb3IgdGhlIG1hY2hpbmUuCisgKiAgbyBTZXQgYW5kIEdldCB1c2UgY2FzZSB2ZXJicywgZGV2aWNlcyBhbmQgbW9kaWZpZXJzIGZvciB0aGUgbWFjaGluZS4KKyAqICBvIEdldCB0aGUgQUxTQSBQQ00gcGxheWJhY2sgYW5kIGNhcHR1cmUgZGV2aWNlIFBDTXMgZm9yIHVzZSBjYXNlIHZlcmIsCisgKiAgICAgdXNlIGNhc2UgZGV2aWNlIGFuZCBtb2RpZmllci4KKyAqICBvIEdldCB0aGUgVFEgcGFyYW1ldGVyIGZvciBlYWNoIHVzZSBjYXNlIHZlcmIsIHVzZSBjYXNlIGRldmljZSBhbmQKKyAqICAgICBtb2RpZmllci4KKyAqICBvIEdldCB0aGUgQUxTQSBtYXN0ZXIgcGxheWJhY2sgYW5kIGNhcHR1cmUgdm9sdW1lL3N3aXRjaCBrY29udHJvbHMKKyAqICAgICBmb3IgZWFjaCB1c2UgY2FzZS4KKyAqLworCisKKy8qCisgKiBVc2UgQ2FzZSBWZXJiLgorICoKKyAqIFRoZSB1c2UgY2FzZSB2ZXJiIGlzIHRoZSBtYWluIGRldmljZSBhdWRpbyBhY3Rpb24uIGUuZy4gdGhlICJIaUZpIiB1c2UKKyAqIGNhc2UgdmVyYiB3aWxsIGNvbmZpZ3VyZSB0aGUgYXVkaW8gaGFyZHdhcmUgZm9yIEhpRmkgTXVzaWMgcGxheWJhY2sKKyAqIGFuZCBjYXB0dXJlLgorICovCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9WRVJCX0lOQUNUSVZFCQkiSW5hY3RpdmUiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9WRVJCX0hJRkkJCQkiSGlGaSIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX1ZFUkJfSElGSV9MT1dfUE9XRVIJIkhpRmkgTG93IFBvd2VyIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfVkVSQl9WT0lDRQkJCSJWb2ljZSIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX1ZFUkJfVk9JQ0VfTE9XX1BPV0VSCSJWb2ljZSBMb3cgUG93ZXIiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9WRVJCX1ZPSUNFQ0FMTAkJIlZvaWNlIENhbGwiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9WRVJCX0lQX1ZPSUNFQ0FMTAkJIlZvaWNlIENhbGwgSVAiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9WRVJCX0FOQUxPR19SQURJTwkJIkZNIEFuYWxvZyBSYWRpbyIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX1ZFUkJfRElHSVRBTF9SQURJTwkJIkZNIERpZ2l0YWwgUmFkaW8iCisvKiBhZGQgbmV3IHZlcmJzIHRvIGVuZCBvZiBsaXN0ICovCisKKworLyoKKyAqIFVzZSBDYXNlIERldmljZS4KKyAqCisgKiBQaHlzaWNhbCBzeXN0ZW0gZGV2aWNlcyB0aGUgcmVuZGVyIGFuZCBjYXB0dXJlIGF1ZGlvLiBEZXZpY2VzIGNhbiBiZSBPUidlZAorICogdG9nZXRoZXIgdG8gc3VwcG9ydCBhdWRpbyBvbiBzaW11bHRhbmVvdXMgZGV2aWNlcy4KKyAqLworI2RlZmluZSBTTkRfVVNFX0NBU0VfREVWX05PTkUJCSJOb25lIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfREVWX1NQRUFLRVIJIlNwZWFrZXIiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9ERVZfTElORQkJIkxpbmUiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9ERVZfSEVBRFBIT05FUwkiSGVhZHBob25lcyIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX0RFVl9IRUFEU0VUCSJIZWFkc2V0IgorI2RlZmluZSBTTkRfVVNFX0NBU0VfREVWX0hBTkRTRVQJIkhhbmRzZXQiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9ERVZfQkxVRVRPT1RICSJCbHVldG9vdGgiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9ERVZfRUFSUElFQ0UJIkVhcnBpZWNlIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfREVWX1NQRElGCQkiU1BESUYiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9ERVZfSERNSQkJIkhETUkiCisvKiBhZGQgbmV3IGRldmljZXMgdG8gZW5kIG9mIGxpc3QgKi8KKworCisvKgorICogVXNlIENhc2UgTW9kaWZpZXJzLgorICoKKyAqIFRoZSB1c2UgY2FzZSBtb2RpZmllciBhbGxvd3MgcnVudGltZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgdG8gZGVhbCB3aXRoCisgKiBhc3luY2hyb25vdXMgZXZlbnRzLgorICoKKyAqIGUuZy4gdG8gcmVjb3JkIGEgdm9pY2UgY2FsbCA6LQorICogIDEuIFNldCB2ZXJiIHRvIFNORF9VU0VfQ0FTRV9WRVJCX1ZPSUNFQ0FMTCAoZm9yIHZvaWNlIGNhbGwpCisgKiAgMi4gU2V0IG1vZGlmaWVyIFNORF9VU0VfQ0FTRV9NT0RfQ0FQVFVSRV9WT0lDRSB3aGVuIGNhcHR1cmUgcmVxdWlyZWQuCisgKiAgMy4gQ2FsbCBzbmRfdXNlX2Nhc2VfZ2V0KCJDYXB0dXJlUENNIikgdG8gZ2V0IEFMU0Egc291cmNlIFBDTSBuYW1lCisgKiAgICAgd2l0aCBjYXB0dXJlZCB2b2ljZSBwY20gZGF0YS4KKyAqCisgKiBlLmcuIHRvIHBsYXkgYSByaW5nIHRvbmUgd2hlbiBsaXN0ZW5pbiB0byBNUDMgTXVzaWMgOi0KKyAqICAxLiBTZXQgdmVyYiB0byBTTkRfVVNFX0NBU0VfVkVSQl9ISUZJIChmb3IgTVAzIHBsYXliYWNrKQorICogIDIuIFNldCBtb2RpZmllciB0byBTTkRfVVNFX0NBU0VfTU9EX1BMQVlfVE9ORSB3aGVuIGluY29taW5nIGNhbGwgaGFwcGVucy4KKyAqICAzLiBDYWxsIHNuZF91c2VfY2FzZV9nZXQoIlBsYXliYWNrUENNIikgdG8gZ2V0IEFMU0EgUENNIHNpbmsgbmFtZSBmb3IKKyAqICAgICByaW5ndG9uZSBwY20gZGF0YS4KKyAqLworI2RlZmluZSBTTkRfVVNFX0NBU0VfTU9EX0NBUFRVUkVfVk9JQ0UJCSJDYXB0dXJlIFZvaWNlIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfTU9EX0NBUFRVUkVfTVVTSUMJCSJDYXB0dXJlIE11c2ljIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfTU9EX1BMQVlfTVVTSUMJCSJQbGF5IE11c2ljIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfTU9EX1BMQVlfVk9JQ0UJCSJQbGF5IFZvaWNlIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfTU9EX1BMQVlfVE9ORQkJIlBsYXkgVG9uZSIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX01PRF9FQ0hPX1JFRgkJIkVjaG8gUmVmZXJlbmNlIgorLyogYWRkIG5ldyBtb2RpZmllcnMgdG8gZW5kIG9mIGxpc3QgKi8KKworCisvKioKKyAqIFRRIC0gVG9uZSBRdWFsaXR5CisgKgorICogVGhlIGludGVyZmFjZSBhbGxvd3MgY2xpZW50cyB0byBkZXRlcm1pbmUgdGhlIGF1ZGlvIFRRIHJlcXVpcmVkIGZvciBlYWNoCisgKiB1c2UgY2FzZSB2ZXJiIGFuZCBtb2RpZmllci4gSXQncyBpbnRlbmRlZCBhcyBhbiBvcHRpb25hbCBoaW50IHRvIHRoZQorICogYXVkaW8gZHJpdmVyIGluIG9yZGVyIHRvIGxvd2VyIHBvd2VyIGNvbnN1bXB0aW9uLgorICoKKyAqLworI2RlZmluZSBTTkRfVVNFX0NBU0VfVFFfTVVTSUMJCSJNdXNpYyIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX1RRX1ZPSUNFCQkiVm9pY2UiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9UUV9UT05FUwkJIlRvbmVzIgorCisvKiogdXNlIGNhc2UgY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBzbmRfdXNlX2Nhc2VfbWdyIHNuZF91c2VfY2FzZV9tZ3JfdDsKKworLyoqCisgKiBcYnJpZWYgQ3JlYXRlIGFuIGlkZW50aWZpZXIKKyAqIFxwYXJhbSBmbXQgRm9ybWF0IChzcHJpbnRmIGxpa2UpCisgKiBccGFyYW0gLi4uIE9wdGlvbmFsIGFyZ3VtZW50cyBmb3Igc3ByaW50ZiBsaWtlIGZvcm1hdAorICogXHJldHVybiBBbGxvY2F0ZWQgc3RyaW5nIGlkZW50aWZpZXIgb3IgTlVMTCBvbiBlcnJvcgorICovCitjaGFyICpzbmRfdXNlX2Nhc2VfaWRlbnRpZmllcihjb25zdCBjaGFyICpmbXQsIC4uLik7CisKKy8qKgorICogXGJyaWVmIEZyZWUgYSBzdHJpbmcgbGlzdAorICogXHBhcmFtIGxpc3QgVGhlIHN0cmluZyBsaXN0IHRvIGZyZWUKKyAqIFxwYXJhbSBpdGVtcyBDb3VudCBvZiBzdHJpbmdzCisgKiBccmV0dXJuIFplcm8gaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCitpbnQgc25kX3VzZV9jYXNlX2ZyZWVfbGlzdChjb25zdCBjaGFyICpsaXN0W10sIGludCBpdGVtcyk7CisKKy8qKgorICogXGJyaWVmIE9idGFpbiBhIGxpc3Qgb2YgZW50cmllcworICogXHBhcmFtIHVjX21nciBVc2UgY2FzZSBtYW5hZ2VyIChtYXkgYmUgTlVMTCAtIGNhcmQgbGlzdCkKKyAqIFxwYXJhbSBpZGVudGlmaWVyIChtYXkgYmUgTlVMTCAtIGNhcmQgbGlzdCkKKyAqIFxwYXJhbSBsaXN0IFJldHVybmVkIGFsbG9jYXRlZCBsaXN0CisgKiBccmV0dXJuIE51bWJlciBvZiBsaXN0IGVudHJpZXMgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICoKKyAqIERlZmluZWQgaWRlbnRpZmllcnM6CisgKiAgIE5VTEwgCQktIGdldCBjYXJkIGxpc3QKKyAqCQkJICAoaW4gcGFpciBjYXJkbmFtZStjb21tZW50KQorICogICBfdmVyYnMJCS0gZ2V0IHZlcmIgbGlzdAorICoJCQkgIChpbiBwYWlyIHZlcmIrY29tbWVudCkKKyAqICAgX2RldmljZXNbLzx2ZXJiPl0JLSBnZXQgbGlzdCBvZiBzdXBwb3J0ZWQgZGV2aWNlcworICoJCQkgIChpbiBwYWlyIGRldmljZStjb21tZW50KQorICogICBfbW9kaWZpZXJzWy88dmVyYj5dLSBnZXQgbGlzdCBvZiBzdXBwb3J0ZWQgbW9kaWZpZXJzCisgKgkJCSAgKGluIHBhaXIgbW9kaWZpZXIrY29tbWVudCkKKyAqICAgVFFbLzx2ZXJiPl0JLSBnZXQgbGlzdCBvZiBUUSBpZGVudGlmaWVycworICogICBfZW5hZGV2cwkJLSBnZXQgbGlzdCBvZiBlbmFibGVkIGRldmljZXMKKyAqICAgX2VuYW1vZHMJCS0gZ2V0IGxpc3Qgb2YgZW5hYmxlZCBtb2RpZmllcnMKKyAqCisgKiAgIF9zdXBwb3J0ZWRkZXZzLzxtb2RpZmllcj58PGRldmljZT5bLzx2ZXJiPl0gICAtIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMKKyAqICAgX2NvbmZsaWN0aW5nZGV2cy88bW9kaWZpZXI+fDxkZXZpY2U+Wy88dmVyYj5dIC0gbGlzdCBvZiBjb25mbGljdGluZyBkZXZpY2VzCisgKiAgIE5vdGUgdGhhdCBhdCBtb3N0IG9uZSBvZiB0aGUgc3VwcG9ydGVkL2NvbmZsaWN0aW5nIGRldnMgbGlzdHMgaGFzCisgKiAgIGFueSBlbnRyaWVzLCBhbmQgd2hlbiBuZWl0aGVyIGlzIHByZXNlbnQsIGFsbCBkZXZpY2VzIGFyZSBzdXBwb3J0ZWQuCisgKgorICovCitpbnQgc25kX3VzZV9jYXNlX2dldF9saXN0KHNuZF91c2VfY2FzZV9tZ3JfdCAqdWNfbWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbGlzdFtdKTsKKworCisvKioKKyAqIFxicmllZiBHZXQgY3VycmVudCAtIHN0cmluZworICogXHBhcmFtIHVjX21nciBVc2UgY2FzZSBtYW5hZ2VyCisgKiBccGFyYW0gaWRlbnRpZmllciAKKyAqIFxwYXJhbSB2YWx1ZSBWYWx1ZSBwb2ludGVyCisgKiBccmV0dXJuIFplcm8gaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICoKKyAqIE5vdGU6IFN0cmluZyBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQsIHVzZSBmcmVlKCkgdG8KKyAqIGRlYWxsb2NhdGUgdGhpcyBzdHJpbmcuCisgKgorICogS25vd24gaWRlbnRpZmllcnM6CisgKiAgIE5VTEwgCQktIHJldHVybiBjdXJyZW50IGNhcmQKKyAqICAgX3ZlcmIJCS0gcmV0dXJuIGN1cnJlbnQgdmVyYgorICoKKyAqICAgWz1dPE5BTUU+Wy9bPG1vZGlmaWVyPnw8L2RldmljZT5dWy88dmVyYj5dXQorICogICAgICAgICAgICAgICAgICAgICAgLSB2YWx1ZSBpZGVudGlmaWVyIDxOQU1FPgorICogICAgICAgICAgICAgICAgICAgICAgLSBTZWFyY2ggc3RhcnRzIGF0IGdpdmVuIG1vZGlmaWVyIG9yIGRldmljZSBpZiBhbnksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBhdCBhIHZlcmIKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gU2VhcmNoIHN0YXJ0cyBhdCBnaXZlbiB2ZXJiIGlmIGFueSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGN1cnJlbnQgdmVyYgorICogICAgICAgICAgICAgICAgICAgICAgLSBTZWFyY2hlcyBtb2RpZmllci9kZXZpY2UsIHRoZW4gdmVyYiwgdGhlbiBkZWZhdWx0cworICogICAgICAgICAgICAgICAgICAgICAgLSBTcGVjaWZ5IGEgbGVhZGluZyAiPSIgdG8gc2VhcmNoIG9ubHkgdGhlIGV4YWN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS9tb2RpZmllci92ZXJiIHNwZWNpZmllZCwgYW5kIG5vdCBzZWFyY2gKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCBlYWNoIG9iamVjdCBpbiB0dXJuLgorICogICAgICAgICAgICAgICAgICAgICAgLSBFeGFtcGxlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxheWJhY2tQQ00vUGxheSBNdXNpYyIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FwdHVyZVBDTS9TUERJRiIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgRnJvbSBWYWx1ZURlZmF1bHRzIG9ubHk6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIj1WYXJpYWJsZSIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgRnJvbSBjdXJyZW50IGFjdGl2ZSB2ZXJiOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICI9VmFyaWFibGUvLyIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgRnJvbSB2ZXJiICJWZXJiIjoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAiPVZhcmlhYmxlLy9WZXJiIgorICogICAgICAgICAgICAgICAgICAgICAgICBGcm9tICJNb2RpZmllciIgaW4gY3VycmVudCBhY3RpdmUgdmVyYjoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAiPVZhcmlhYmxlL01vZGlmaWVyLyIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgRnJvbSAiTW9kaWZpZXIiIGluICJWZXJiIjoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAiPVZhcmlhYmxlL01vZGlmaWVyL1ZlcmIiCisgKgorICogUmVjb21tZW5kZWQgbmFtZXMgZm9yIHZhbHVlczoKKyAqICAgVFEJCQktIFRvbmUgUXVhbGl0eQorICogICBQbGF5YmFja1BDTQktIGZ1bGwgUENNIHBsYXliYWNrIGRldmljZSBuYW1lCisgKiAgIENhcHR1cmVQQ00JCS0gZnVsbCBQQ00gY2FwdHVyZSBkZXZpY2UgbmFtZQorICogICBQbGF5YmFja0NUTAktIHBsYXliYWNrIGNvbnRyb2wgZGV2aWNlIG5hbWUKKyAqICAgUGxheWJhY2tWb2x1bWUJLSBwbGF5YmFjayBjb250cm9sIHZvbHVtZSBJRCBzdHJpbmcKKyAqICAgUGxheWJhY2tTd2l0Y2gJLSBwbGF5YmFjayBjb250cm9sIHN3aXRjaCBJRCBzdHJpbmcKKyAqICAgQ2FwdHVyZUNUTAkJLSBjYXB0dXJlIGNvbnRyb2wgZGV2aWNlIG5hbWUKKyAqICAgQ2FwdHVyZVZvbHVtZQktIGNhcHR1cmUgY29udHJvbCB2b2x1bWUgSUQgc3RyaW5nCisgKiAgIENhcHR1cmVTd2l0Y2gJLSBjYXB0dXJlIGNvbnRyb2wgc3dpdGNoIElEIHN0cmluZworICogICBQbGF5YmFja01peGVyCS0gbmFtZSBvZiBwbGF5YmFjayBtaXhlcgorICogICBQbGF5YmFja01peGVySUQJLSBtaXhlciBwbGF5YmFjayBJRAorICogICBDYXB0dXJlTWl4ZXIJLSBuYW1lIG9mIGNhcHR1cmUgbWl4ZXIKKyAqICAgQ2FwdHVyZU1peGVySUQJLSBtaXhlciBjYXB0dXJlIElECisgKi8KK2ludCBzbmRfdXNlX2Nhc2VfZ2V0KHNuZF91c2VfY2FzZV9tZ3JfdCAqdWNfbWdyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKip2YWx1ZSk7CisKKy8qKgorICogXGJyaWVmIEdldCBjdXJyZW50IC0gaW50ZWdlcgorICogXHBhcmFtIHVjX21nciBVc2UgY2FzZSBtYW5hZ2VyCisgKiBccGFyYW0gaWRlbnRpZmllciAKKyAqIFxwYXJhbSB2YWx1ZSByZXN1bHQgCisgKiBccmV0dXJuIFplcm8gaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICoKKyAqIEtub3duIGlkZW50aWZpZXJzOgorICogICBfZGV2c3RhdHVzLzxkZXZpY2U+CS0gcmV0dXJuIHN0YXR1cyBmb3IgZ2l2ZW4gZGV2aWNlCisgKiAgIF9tb2RzdGF0dXMvPG1vZGlmaWVyPgktIHJldHVybiBzdGF0dXMgZm9yIGdpdmVuIG1vZGlmaWVyCisgKi8KK2ludCBzbmRfdXNlX2Nhc2VfZ2V0aShzbmRfdXNlX2Nhc2VfbWdyX3QgKnVjX21nciwKKwkJICAgICAgY29uc3QgY2hhciAqaWRlbnRpZmllciwKKwkJICAgICAgbG9uZyAqdmFsdWUpOworCisvKioKKyAqIFxicmllZiBTZXQgbmV3CisgKiBccGFyYW0gdWNfbWdyIFVzZSBjYXNlIG1hbmFnZXIKKyAqIFxwYXJhbSBpZGVudGlmaWVyCisgKiBccGFyYW0gdmFsdWUgVmFsdWUKKyAqIFxyZXR1cm4gWmVybyBpZiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKgorICogS25vd24gaWRlbnRpZmllcnM6CisgKiAgIF92ZXJiIAkJLSBzZXQgY3VycmVudCB2ZXJiID0gdmFsdWUKKyAqICAgX2VuYWRldgkJLSBlbmFibGUgZ2l2ZW4gZGV2aWNlID0gdmFsdWUKKyAqICAgX2Rpc2RldgkJLSBkaXNhYmxlIGdpdmVuIGRldmljZSA9IHZhbHVlCisgKiAgIF9zd2Rldi88b2xkX2RldmljZT4gLSBuZXdfZGV2aWNlID0gdmFsdWUKKyAqCQkJLSBkaXNhYmxlIG9sZF9kZXZpY2UgYW5kIHRoZW4gZW5hYmxlIG5ld19kZXZpY2UKKyAqCQkJLSBpZiBvbGRfZGV2aWNlIGlzIG5vdCBlbmFibGVkIGp1c3QgcmV0dXJuCisgKgkJCS0gY2hlY2sgdHJhbnNtaXQgc2VxdWVuY2UgZmlyc3RseQorICogICBfZW5hbW9kCQktIGVuYWJsZSBnaXZlbiBtb2RpZmllciA9IHZhbHVlCisgKiAgIF9kaXNtb2QJCS0gZGlzYWJsZSBnaXZlbiBtb2RpZmllciA9IHZhbHVlCisgKiAgIF9zd21vZC88b2xkX21vZGlmaWVyPiAtIG5ld19tb2RpZmllciA9IHZhbHVlCisgKgkJCS0gZGlzYWJsZSBvbGRfbW9kaWZpZXIgYW5kIHRoZW4gZW5hYmxlIG5ld19tb2RpZmllcgorICoJCQktIGlmIG9sZF9tb2RpZmllciBpcyBub3QgZW5hYmxlZCBqdXN0IHJldHVybgorICoJCQktIGNoZWNrIHRyYW5zbWl0IHNlcXVlbmNlIGZpcnN0bHkKKyAqLworaW50IHNuZF91c2VfY2FzZV9zZXQoc25kX3VzZV9jYXNlX21ncl90ICp1Y19tZ3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpOworCisvKioKKyAqIFxicmllZiBPcGVuIGFuZCBpbml0aWFsaXNlIHVzZSBjYXNlIGNvcmUgZm9yIHNvdW5kIGNhcmQKKyAqIFxwYXJhbSB1Y19tZ3IgUmV0dXJuZWQgdXNlIGNhc2UgbWFuYWdlciBwb2ludGVyCisgKiBccGFyYW0gY2FyZF9uYW1lIFNvdW5kIGNhcmQgbmFtZS4KKyAqIFxyZXR1cm4gemVybyBpZiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KK2ludCBzbmRfdXNlX2Nhc2VfbWdyX29wZW4oc25kX3VzZV9jYXNlX21ncl90ICoqdWNfbWdyLCBjb25zdCBjaGFyICpjYXJkX25hbWUpOworCisKKy8qKgorICogXGJyaWVmIFJlbG9hZCBhbmQgcmUtcGFyc2UgdXNlIGNhc2UgY29uZmlndXJhdGlvbiBmaWxlcyBmb3Igc291bmQgY2FyZC4KKyAqIFxwYXJhbSB1Y19tZ3IgVXNlIGNhc2UgbWFuYWdlcgorICogXHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IHNuZF91c2VfY2FzZV9tZ3JfcmVsb2FkKHNuZF91c2VfY2FzZV9tZ3JfdCAqdWNfbWdyKTsKKworLyoqCisgKiBcYnJpZWYgQ2xvc2UgdXNlIGNhc2UgbWFuYWdlcgorICogXHBhcmFtIHVjX21nciBVc2UgY2FzZSBtYW5hZ2VyCisgKiBccmV0dXJuIHplcm8gaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCitpbnQgc25kX3VzZV9jYXNlX21ncl9jbG9zZShzbmRfdXNlX2Nhc2VfbWdyX3QgKnVjX21ncik7CisKKy8qKgorICogXGJyaWVmIFJlc2V0IHVzZSBjYXNlIG1hbmFnZXIgdmVyYiwgZGV2aWNlLCBtb2RpZmllciB0byBkZWFmdWx0IHNldHRpbmdzLgorICogXHBhcmFtIHVjX21nciBVc2UgY2FzZSBtYW5hZ2VyCisgKiBccmV0dXJuIHplcm8gaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCitpbnQgc25kX3VzZV9jYXNlX21ncl9yZXNldChzbmRfdXNlX2Nhc2VfbWdyX3QgKnVjX21ncik7CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb25zCisgKi8KKworLyoqCisgKiBcYnJpZWYgT2J0YWluIGEgbGlzdCBvZiBjYXJkcworICogXHBhcmFtIGxpc3QgUmV0dXJuZWQgYWxsb2NhdGVkIGxpc3QKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGxpc3QgZW50cmllcyBpZiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNuZF91c2VfY2FzZV9jYXJkX2xpc3QoY29uc3QgY2hhciAqKmxpc3RbXSkKK3sKKwlyZXR1cm4gc25kX3VzZV9jYXNlX2dldF9saXN0KE5VTEwsIE5VTEwsIGxpc3QpOworfQorCisvKioKKyAqIFxicmllZiBPYnRhaW4gYSBsaXN0IG9mIHZlcmJzCisgKiBccGFyYW0gdWNfbWdyIFVzZSBjYXNlIG1hbmFnZXIKKyAqIFxwYXJhbSBsaXN0IFJldHVybmVkIGxpc3Qgb2YgdmVyYnMKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGxpc3QgZW50cmllcyBpZiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNuZF91c2VfY2FzZV92ZXJiX2xpc3Qoc25kX3VzZV9jYXNlX21ncl90ICp1Y19tZ3IsCisJCQkJCSBjb25zdCBjaGFyICoqbGlzdFtdKQoreworCXJldHVybiBzbmRfdXNlX2Nhc2VfZ2V0X2xpc3QodWNfbWdyLCAiX3ZlcmJzIiwgbGlzdCk7Cit9CisKKy8qKgorICogIFx9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9VU0VfQ0FTRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvdmVyc2lvbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzRjZTllCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3ZlcnNpb24uaApAQCAtMCwwICsxLDE1IEBACisvKgorICogIHZlcnNpb24uaAorICovCisKKyNkZWZpbmUgU05EX0xJQl9NQUpPUgkJMSAvKio8IG1ham9yIG51bWJlciBvZiBsaWJyYXJ5IHZlcnNpb24gKi8KKyNkZWZpbmUgU05EX0xJQl9NSU5PUgkJMCAvKio8IG1pbm9yIG51bWJlciBvZiBsaWJyYXJ5IHZlcnNpb24gKi8KKyNkZWZpbmUgU05EX0xJQl9TVUJNSU5PUgkyNSAvKio8IHN1Ym1pbm9yIG51bWJlciBvZiBsaWJyYXJ5IHZlcnNpb24gKi8KKyNkZWZpbmUgU05EX0xJQl9FWFRSQVZFUgkxMDAwMDAwIC8qKjwgZXh0cmEgdmVyc2lvbiBudW1iZXIsIHVzZWQgbWFpbmx5IGZvciBiZXRhcyAqLworLyoqIGxpYnJhcnkgdmVyc2lvbiAqLworI2RlZmluZSBTTkRfTElCX1ZFUlNJT04JCSgoU05EX0xJQl9NQUpPUjw8MTYpfFwKKwkJCQkgKFNORF9MSUJfTUlOT1I8PDgpfFwKKwkJCQkgIFNORF9MSUJfU1VCTUlOT1IpCisvKiogbGlicmFyeSB2ZXJzaW9uIChzdHJpbmcpICovCisjZGVmaW5lIFNORF9MSUJfVkVSU0lPTl9TVFIJIjEuMC4yNSIKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTU3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FyLmgKQEAgLTAsMCArMSw0OCBAQAorLyogSGVhZGVyIGRlc2NyaWJpbmcgYGFyJyBhcmNoaXZlIGZpbGUgZm9ybWF0LgorICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9BUl9ICisjZGVmaW5lIF9BUl9IIDEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisvKiBBcmNoaXZlIGZpbGVzIHN0YXJ0IHdpdGggdGhlIEFSTUFHIGlkZW50aWZ5aW5nIHN0cmluZy4gIFRoZW4gZm9sbG93cyBhCisgICBgc3RydWN0IGFyX2hkcicsIGFuZCBhcyBtYW55IGJ5dGVzIG9mIG1lbWJlciBmaWxlIGRhdGEgYXMgaXRzIGBhcl9zaXplJworICAgbWVtYmVyIGluZGljYXRlcywgZm9yIGVhY2ggbWVtYmVyIGZpbGUuICAqLworCisjZGVmaW5lIEFSTUFHCSIhPGFyY2g+XG4iCS8qIFN0cmluZyB0aGF0IGJlZ2lucyBhbiBhcmNoaXZlIGZpbGUuICAqLworI2RlZmluZSBTQVJNQUcJOAkJLyogU2l6ZSBvZiB0aGF0IHN0cmluZy4gICovCisKKyNkZWZpbmUgQVJGTUFHCSJgXG4iCQkvKiBTdHJpbmcgaW4gYXJfZm1hZyBhdCBlbmQgb2YgZWFjaCBoZWFkZXIuICAqLworCitfX0JFR0lOX0RFQ0xTCisKK3N0cnVjdCBhcl9oZHIKKyAgeworICAgIGNoYXIgYXJfbmFtZVsxNl07CQkvKiBNZW1iZXIgZmlsZSBuYW1lLCBzb21ldGltZXMgLyB0ZXJtaW5hdGVkLiAqLworICAgIGNoYXIgYXJfZGF0ZVsxMl07CQkvKiBGaWxlIGRhdGUsIGRlY2ltYWwgc2Vjb25kcyBzaW5jZSBFcG9jaC4gICovCisgICAgY2hhciBhcl91aWRbNl0sIGFyX2dpZFs2XTsJLyogVXNlciBhbmQgZ3JvdXAgSURzLCBpbiBBU0NJSSBkZWNpbWFsLiAgKi8KKyAgICBjaGFyIGFyX21vZGVbOF07CQkvKiBGaWxlIG1vZGUsIGluIEFTQ0lJIG9jdGFsLiAgKi8KKyAgICBjaGFyIGFyX3NpemVbMTBdOwkJLyogRmlsZSBzaXplLCBpbiBBU0NJSSBkZWNpbWFsLiAgKi8KKyAgICBjaGFyIGFyX2ZtYWdbMl07CQkvKiBBbHdheXMgY29udGFpbnMgQVJGTUFHLiAgKi8KKyAgfTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGFyLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJncC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hcmdwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhOTU0ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJncC5oCkBAIC0wLDAgKzEsNjAxIEBACisvKiBIaWVyYXJjaGlhbCBhcmd1bWVudCBwYXJzaW5nLCBsYXllcmVkIG92ZXIgZ2V0b3B0LgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBXcml0dGVuIGJ5IE1pbGVzIEJhZGVyIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9BUkdQX0gKKyNkZWZpbmUgX0FSR1BfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjZGVmaW5lIF9fbmVlZF9lcnJvcl90CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmbmRlZiBfX2NvbnN0CisjIGRlZmluZSBfX2NvbnN0IGNvbnN0CisjZW5kaWYKKworI2lmbmRlZiBfX1RIUk9XCisjIGRlZmluZSBfX1RIUk9XCisjZW5kaWYKKyNpZm5kZWYgX19OVEgKKyMgZGVmaW5lIF9fTlRIKGZjdCkgZmN0IF9fVEhST1cKKyNlbmRpZgorCisjaWZuZGVmIF9fYXR0cmlidXRlX18KKy8qIFRoaXMgZmVhdHVyZSBpcyBhdmFpbGFibGUgaW4gZ2NjIHZlcnNpb25zIDIuNSBhbmQgbGF0ZXIuICAqLworIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA1KSB8fCBfX1NUUklDVF9BTlNJX18KKyMgIGRlZmluZSBfX2F0dHJpYnV0ZV9fKFNwZWMpIC8qIGVtcHR5ICovCisjIGVuZGlmCisvKiBUaGUgX18tcHJvdGVjdGVkIHZhcmlhbnRzIG9mIGBmb3JtYXQnIGFuZCBgcHJpbnRmJyBhdHRyaWJ1dGVzCisgICBhcmUgYWNjZXB0ZWQgYnkgZ2NjIHZlcnNpb25zIDIuNi40IChlZmZlY3RpdmVseSAyLjcpIGFuZCBsYXRlci4gICovCisjIGlmIF9fR05VQ19fIDwgMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDcpIHx8IF9fU1RSSUNUX0FOU0lfXworIyAgZGVmaW5lIF9fZm9ybWF0X18gZm9ybWF0CisjICBkZWZpbmUgX19wcmludGZfXyBwcmludGYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBHQ0MgMi45NSBhbmQgbGF0ZXIgaGF2ZSAiX19yZXN0cmljdCI7IEM5OSBjb21waWxlcnMgaGF2ZQorICAgInJlc3RyaWN0IiwgYW5kICJjb25maWd1cmUiIG1heSBoYXZlIGRlZmluZWQgInJlc3RyaWN0Ii4gICovCisjaWZuZGVmIF9fcmVzdHJpY3QKKyMgaWYgISAoMiA8IF9fR05VQ19fIHx8ICgyID09IF9fR05VQ19fICYmIDk1IDw9IF9fR05VQ19NSU5PUl9fKSkKKyMgIGlmIGRlZmluZWQgcmVzdHJpY3QgfHwgMTk5OTAxTCA8PSBfX1NURENfVkVSU0lPTl9fCisjICAgZGVmaW5lIF9fcmVzdHJpY3QgcmVzdHJpY3QKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19yZXN0cmljdAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fZXJyb3JfdF9kZWZpbmVkCit0eXBlZGVmIGludCBlcnJvcl90OworIyBkZWZpbmUgX19lcnJvcl90X2RlZmluZWQKKyNlbmRpZgorDAorI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQSBkZXNjcmlwdGlvbiBvZiBhIHBhcnRpY3VsYXIgb3B0aW9uLiAgQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mCisgICB0aGVzZSBpcyBwYXNzZWQgaW4gdGhlIE9QVElPTlMgZmllbGQgb2YgYW4gYXJncCBzdHJ1Y3R1cmUuICBFYWNoIG9wdGlvbgorICAgZW50cnkgY2FuIGNvcnJlc3BvbmQgdG8gb25lIGxvbmcgb3B0aW9uIGFuZC9vciBvbmUgc2hvcnQgb3B0aW9uOyBtb3JlCisgICBuYW1lcyBmb3IgdGhlIHNhbWUgb3B0aW9uIGNhbiBiZSBhZGRlZCBieSBmb2xsb3dpbmcgYW4gZW50cnkgaW4gYW4gb3B0aW9uCisgICBhcnJheSB3aXRoIG9wdGlvbnMgaGF2aW5nIHRoZSBPUFRJT05fQUxJQVMgZmxhZyBzZXQuICAqLworc3RydWN0IGFyZ3Bfb3B0aW9uCit7CisgIC8qIFRoZSBsb25nIG9wdGlvbiBuYW1lLiAgRm9yIG1vcmUgdGhhbiBvbmUgbmFtZSBmb3IgdGhlIHNhbWUgb3B0aW9uLCB5b3UKKyAgICAgY2FuIHVzZSBmb2xsb3dpbmcgb3B0aW9ucyB3aXRoIHRoZSBPUFRJT05fQUxJQVMgZmxhZyBzZXQuICAqLworICBfX2NvbnN0IGNoYXIgKm5hbWU7CisKKyAgLyogV2hhdCBrZXkgaXMgcmV0dXJuZWQgZm9yIHRoaXMgb3B0aW9uLiAgSWYgPiAwIGFuZCBwcmludGFibGUsIHRoZW4gaXQncworICAgICBhbHNvIGFjY2VwdGVkIGFzIGEgc2hvcnQgb3B0aW9uLiAgKi8KKyAgaW50IGtleTsKKworICAvKiBJZiBub24tTlVMTCwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgb3B0aW9uLCB3aGljaCBpcyByZXF1aXJlZCB1bmxlc3MgdGhlIE9QVElPTl9BUkdfT1BUSU9OQUwgZmxhZyBpcyBzZXQuICovCisgIF9fY29uc3QgY2hhciAqYXJnOworCisgIC8qIE9QVElPTl8gZmxhZ3MuICAqLworICBpbnQgZmxhZ3M7CisKKyAgLyogVGhlIGRvYyBzdHJpbmcgZm9yIHRoaXMgb3B0aW9uLiAgSWYgYm90aCBOQU1FIGFuZCBLRVkgYXJlIDAsIFRoaXMgc3RyaW5nCisgICAgIHdpbGwgYmUgcHJpbnRlZCBvdXRkZW50ZWQgZnJvbSB0aGUgbm9ybWFsIG9wdGlvbiBjb2x1bW4sIG1ha2luZyBpdAorICAgICB1c2VmdWwgYXMgYSBncm91cCBoZWFkZXIgKGl0IHdpbGwgYmUgdGhlIGZpcnN0IHRoaW5nIHByaW50ZWQgaW4gaXRzCisgICAgIGdyb3VwKTsgaW4gdGhpcyB1c2FnZSwgaXQncyBjb252ZW50aW9uYWwgdG8gZW5kIHRoZSBzdHJpbmcgd2l0aCBhIGA6Jy4gICovCisgIF9fY29uc3QgY2hhciAqZG9jOworCisgIC8qIFRoZSBncm91cCB0aGlzIG9wdGlvbiBpcyBpbi4gIEluIGEgbG9uZyBoZWxwIG1lc3NhZ2UsIG9wdGlvbnMgYXJlIHNvcnRlZAorICAgICBhbHBoYWJldGljYWxseSB3aXRoaW4gZWFjaCBncm91cCwgYW5kIHRoZSBncm91cHMgcHJlc2VudGVkIGluIHRoZSBvcmRlcgorICAgICAwLCAxLCAyLCAuLi4sIG4sIC1tLCAuLi4sIC0yLCAtMS4gIEV2ZXJ5IGVudHJ5IGluIGFuIG9wdGlvbnMgYXJyYXkgd2l0aAorICAgICBpZiB0aGlzIGZpZWxkIDAgd2lsbCBpbmhlcml0IHRoZSBncm91cCBudW1iZXIgb2YgdGhlIHByZXZpb3VzIGVudHJ5LCBvcgorICAgICB6ZXJvIGlmIGl0J3MgdGhlIGZpcnN0IG9uZSwgdW5sZXNzIGl0cyBhIGdyb3VwIGhlYWRlciAoTkFNRSBhbmQgS0VZIGJvdGgKKyAgICAgMCksIGluIHdoaWNoIGNhc2UsIHRoZSBwcmV2aW91cyBlbnRyeSArIDEgaXMgdGhlIGRlZmF1bHQuICBBdXRvbWFnaWMKKyAgICAgb3B0aW9ucyBzdWNoIGFzIC0taGVscCBhcmUgcHV0IGludG8gZ3JvdXAgLTEuICAqLworICBpbnQgZ3JvdXA7Cit9OworCisvKiBUaGUgYXJndW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3B0aW9uIGlzIG9wdGlvbmFsLiAgKi8KKyNkZWZpbmUgT1BUSU9OX0FSR19PUFRJT05BTAkweDEKKworLyogVGhpcyBvcHRpb24gaXNuJ3QgZGlzcGxheWVkIGluIGFueSBoZWxwIG1lc3NhZ2VzLiAgKi8KKyNkZWZpbmUgT1BUSU9OX0hJRERFTgkgICAgICAgCTB4MgorCisvKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyBmb3IgdGhlIGNsb3Nlc3QgcHJldmlvdXMgbm9uLWFsaWFzIG9wdGlvbi4gIFRoaXMKKyAgIG1lYW5zIHRoYXQgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNhbWUgaGVscCBlbnRyeSwgYW5kIHdpbGwgaW5oZXJpdAorICAgZmllbGRzIG90aGVyIHRoYW4gTkFNRSBhbmQgS0VZIGZyb20gdGhlIGFsaWFzZWQgb3B0aW9uLiAgKi8KKyNkZWZpbmUgT1BUSU9OX0FMSUFTCQkweDQKKworLyogVGhpcyBvcHRpb24gaXNuJ3QgYWN0dWFsbHkgYW4gb3B0aW9uIChhbmQgc28gc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlCisgICBhY3R1YWwgb3B0aW9uIHBhcnNlciksIGJ1dCByYXRoZXIgYW4gYXJiaXRyYXJ5IHBpZWNlIG9mIGRvY3VtZW50YXRpb24gdGhhdAorICAgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBtdWNoIHRoZSBzYW1lIG1hbm5lciBhcyB0aGUgb3B0aW9ucy4gIElmIHRoaXMgZmxhZworICAgaXMgc2V0LCB0aGVuIHRoZSBvcHRpb24gTkFNRSBmaWVsZCBpcyBkaXNwbGF5ZWQgdW5tb2RpZmllZCAoZS5nLiwgbm8gYC0tJworICAgcHJlZml4IGlzIGFkZGVkKSBhdCB0aGUgbGVmdC1tYXJnaW4gKHdoZXJlIGEgKnNob3J0KiBvcHRpb24gd291bGQgbm9ybWFsbHkKKyAgIGJlIGRpc3BsYXllZCksIGFuZCB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmcgaW4gdGhlIG5vcm1hbCBwbGFjZS4gIEZvcgorICAgcHVycG9zZXMgb2Ygc29ydGluZywgYW55IGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgcHVuY3R1YXRpb24gaXMgaWdub3JlZCwKKyAgIGV4Y2VwdCB0aGF0IGlmIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgbm90IGAtJywgdGhpcyBlbnRyeQorICAgaXMgZGlzcGxheWVkIGFmdGVyIGFsbCBvcHRpb25zIChhbmQgT1BUSU9OX0RPQyBlbnRyaWVzIHdpdGggYSBsZWFkaW5nIGAtJykKKyAgIGluIHRoZSBzYW1lIGdyb3VwLiAgKi8KKyNkZWZpbmUgT1BUSU9OX0RPQwkJMHg4CisKKy8qIFRoaXMgb3B0aW9uIHNob3VsZG4ndCBiZSBpbmNsdWRlZCBpbiBgbG9uZycgdXNhZ2UgbWVzc2FnZXMgKGJ1dCBpcyBzdGlsbAorICAgaW5jbHVkZWQgaW4gaGVscCBtZXNzYWdlcykuICBUaGlzIGlzIG1haW5seSBpbnRlbmRlZCBmb3Igb3B0aW9ucyB0aGF0IGFyZQorICAgY29tcGxldGVseSBkb2N1bWVudGVkIGluIGFuIGFyZ3AncyBBUkdTX0RPQyBmaWVsZCwgaW4gd2hpY2ggY2FzZSBpbmNsdWRpbmcKKyAgIHRoZSBvcHRpb24gaW4gdGhlIGdlbmVyaWMgdXNhZ2UgbGlzdCB3b3VsZCBiZSByZWR1bmRhbnQuICBGb3IgaW5zdGFuY2UsCisgICBpZiBBUkdTX0RPQyBpcyAiRk9PIEJBUlxuLXggQkxBSCIsIGFuZCB0aGUgYC14JyBvcHRpb24ncyBwdXJwb3NlIGlzIHRvCisgICBkaXN0aW5ndWlzaCB0aGVzZSB0d28gY2FzZXMsIC14IHNob3VsZCBwcm9iYWJseSBiZSBtYXJrZWQKKyAgIE9QVElPTl9OT19VU0FHRS4gICovCisjZGVmaW5lIE9QVElPTl9OT19VU0FHRQkJMHgxMAorDAorc3RydWN0IGFyZ3A7CQkJLyogZndkIGRlY2xhcmUgdGhpcyB0eXBlICovCitzdHJ1Y3QgYXJncF9zdGF0ZTsJCS8qICIgKi8KK3N0cnVjdCBhcmdwX2NoaWxkOwkJLyogIiAqLworCisvKiBUaGUgdHlwZSBvZiBhIHBvaW50ZXIgdG8gYW4gYXJncCBwYXJzaW5nIGZ1bmN0aW9uLiAgKi8KK3R5cGVkZWYgZXJyb3JfdCAoKmFyZ3BfcGFyc2VyX3QpIChpbnQgX19rZXksIGNoYXIgKl9fYXJnLAorCQkJCSAgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fc3RhdGUpOworCisvKiBXaGF0IHRvIHJldHVybiBmb3IgdW5yZWNvZ25pemVkIGtleXMuICBGb3Igc3BlY2lhbCBBUkdQX0tFWV8ga2V5cywgc3VjaAorICAgcmV0dXJucyB3aWxsIHNpbXBseSBiZSBpZ25vcmVkLiAgRm9yIHVzZXIga2V5cywgdGhpcyBlcnJvciB3aWxsIGJlIHR1cm5lZAorICAgaW50byBFSU5WQUwgKGlmIHRoZSBjYWxsIHRvIGFyZ3BfcGFyc2UgaXMgc3VjaCB0aGF0IGVycm9ycyBhcmUgcHJvcGFnYXRlZAorICAgYmFjayB0byB0aGUgdXNlciBpbnN0ZWFkIG9mIGV4aXRpbmcpOyByZXR1cm5pbmcgRUlOVkFMIGl0c2VsZiB3b3VsZCByZXN1bHQKKyAgIGluIGFuIGltbWVkaWF0ZSBzdG9wIHRvIHBhcnNpbmcgaW4gKmFsbCogY2FzZXMuICAqLworI2RlZmluZSBBUkdQX0VSUl9VTktOT1dOCUUyQklHIC8qIEh1cmQgc2hvdWxkIG5ldmVyIG5lZWQgRTJCSUcuICBYWFggKi8KKworLyogU3BlY2lhbCB2YWx1ZXMgZm9yIHRoZSBLRVkgYXJndW1lbnQgdG8gYW4gYXJndW1lbnQgcGFyc2luZyBmdW5jdGlvbi4KKyAgIEFSR1BfRVJSX1VOS05PV04gc2hvdWxkIGJlIHJldHVybmVkIGlmIHRoZXkgYXJlbid0IHVuZGVyc3Rvb2QuCisKKyAgIFRoZSBzZXF1ZW5jZSBvZiBrZXlzIHRvIGEgcGFyc2luZyBmdW5jdGlvbiBpcyBlaXRoZXIgKHdoZXJlIGVhY2gKKyAgIHVwcGVyY2FzZWQgd29yZCBzaG91bGQgYmUgcHJlZml4ZWQgYnkgYEFSR1BfS0VZXycgYW5kIG9wdCBpcyBhIHVzZXIga2V5KToKKworICAgICAgIElOSVQgb3B0Li4uIE5PX0FSR1MgRU5EIFNVQ0NFU1MgIC0tIE5vIG5vbi1vcHRpb24gYXJndW1lbnRzIGF0IGFsbAorICAgb3IgIElOSVQgKG9wdCB8IEFSRykuLi4gRU5EIFNVQ0NFU1MgIC0tIEFsbCBub24tb3B0aW9uIGFyZ3MgcGFyc2VkCisgICBvciAgSU5JVCAob3B0IHwgQVJHKS4uLiBTVUNDRVNTICAgICAgLS0gU29tZSBub24tb3B0aW9uIGFyZyB1bnJlY29nbml6ZWQKKworICAgVGhlIHRoaXJkIGNhc2UgaXMgd2hlcmUgZXZlcnkgcGFyc2VyIHJldHVybmVkIEFSR1BfS0VZX1VOS05PV04gZm9yIGFuCisgICBhcmd1bWVudCwgaW4gd2hpY2ggY2FzZSBwYXJzaW5nIHN0b3BzIGF0IHRoYXQgYXJndW1lbnQgKHJldHVybmluZyB0aGUKKyAgIHVucGFyc2VkIGFyZ3VtZW50cyB0byB0aGUgY2FsbGVyIG9mIGFyZ3BfcGFyc2UgaWYgcmVxdWVzdGVkLCBvciBzdG9wcGluZworICAgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIG5vdCkuCisKKyAgIElmIGFuIGVycm9yIG9jY3VycyAoZWl0aGVyIGRldGVjdGVkIGJ5IGFyZ3AsIG9yIGJlY2F1c2UgdGhlIHBhcnNpbmcKKyAgIGZ1bmN0aW9uIHJldHVybmVkIGFuIGVycm9yIHZhbHVlKSwgdGhlbiB0aGUgcGFyc2VyIGlzIGNhbGxlZCB3aXRoCisgICBBUkdQX0tFWV9FUlJPUiwgYW5kIG5vIGZ1cnRoZXIgY2FsbHMgYXJlIG1hZGUuICAqLworCisvKiBUaGlzIGlzIG5vdCBhbiBvcHRpb24gYXQgYWxsLCBidXQgcmF0aGVyIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50LiAgSWYgYQorICAgcGFyc2VyIHJlY2VpdmluZyB0aGlzIGtleSByZXR1cm5zIHN1Y2Nlc3MsIHRoZSBmYWN0IGlzIHJlY29yZGVkLCBhbmQgdGhlCisgICBBUkdQX0tFWV9OT19BUkdTIGNhc2Ugd29uJ3QgYmUgdXNlZC4gIEhPV0VWRVIsIGlmIHdoaWxlIHByb2Nlc3NpbmcgdGhlCisgICBhcmd1bWVudCwgYSBwYXJzZXIgZnVuY3Rpb24gZGVjcmVtZW50cyB0aGUgTkVYVCBmaWVsZCBvZiB0aGUgc3RhdGUgaXQncworICAgcGFzc2VkLCB0aGUgb3B0aW9uIHdvbid0IGJlIGNvbnNpZGVyZWQgcHJvY2Vzc2VkOyB0aGlzIGlzIHRvIGFsbG93IHlvdSB0bworICAgYWN0dWFsbHkgbW9kaWZ5IHRoZSBhcmd1bWVudCAocGVyaGFwcyBpbnRvIGFuIG9wdGlvbiksIGFuZCBoYXZlIGl0CisgICBwcm9jZXNzZWQgYWdhaW4uICAqLworI2RlZmluZSBBUkdQX0tFWV9BUkcJCTAKKy8qIFRoZXJlIGFyZSByZW1haW5pbmcgYXJndW1lbnRzIG5vdCBwYXJzZWQgYnkgYW55IHBhcnNlciwgd2hpY2ggbWF5IGJlIGZvdW5kCisgICBzdGFydGluZyBhdCAoU1RBVEUtPmFyZ3YgKyBTVEFURS0+bmV4dCkuICBJZiBzdWNjZXNzIGlzIHJldHVybmVkLCBidXQKKyAgIFNUQVRFLT5uZXh0IGxlZnQgdW50b3VjaGVkLCBpdCdzIGFzc3VtZWQgdGhhdCBhbGwgYXJndW1lbnRzIHdlcmUgY29uc3VtZSwKKyAgIG90aGVyd2lzZSwgdGhlIHBhcnNlciBzaG91bGQgYWRqdXN0IFNUQVRFLT5uZXh0IHRvIHJlZmxlY3QgYW55IGFyZ3VtZW50cworICAgY29uc3VtZWQuICAqLworI2RlZmluZSBBUkdQX0tFWV9BUkdTCQkweDEwMDAwMDYKKy8qIFRoZXJlIGFyZSBubyBtb3JlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYXQgYWxsLiAgKi8KKyNkZWZpbmUgQVJHUF9LRVlfRU5ECQkweDEwMDAwMDEKKy8qIEJlY2F1c2UgaXQncyBjb21tb24gdG8gd2FudCB0byBkbyBzb21lIHNwZWNpYWwgcHJvY2Vzc2luZyBpZiB0aGVyZSBhcmVuJ3QKKyAgIGFueSBub24tb3B0aW9uIGFyZ3MsIHVzZXIgcGFyc2VycyBhcmUgY2FsbGVkIHdpdGggdGhpcyBrZXkgaWYgdGhleSBkaWRuJ3QKKyAgIHN1Y2Nlc3NmdWxseSBwcm9jZXNzIGFueSBub24tb3B0aW9uIGFyZ3VtZW50cy4gIENhbGxlZCBqdXN0IGJlZm9yZQorICAgQVJHUF9LRVlfRU5EICh3aGVyZSBtb3JlIGdlbmVyYWwgdmFsaWRpdHkgY2hlY2tzIG9uIHByZXZpb3VzbHkgcGFyc2VkCisgICBhcmd1bWVudHMgY2FuIHRha2UgcGxhY2UpLiAgKi8KKyNkZWZpbmUgQVJHUF9LRVlfTk9fQVJHUwkweDEwMDAwMDIKKy8qIFBhc3NlZCBpbiBiZWZvcmUgYW55IHBhcnNpbmcgaXMgZG9uZS4gIEFmdGVyd2FyZHMsIHRoZSB2YWx1ZXMgb2YgZWFjaAorICAgZWxlbWVudCBvZiB0aGUgQ0hJTERfSU5QVVQgZmllbGQsIGlmIGFueSwgaW4gdGhlIHN0YXRlIHN0cnVjdHVyZSBpcworICAgY29waWVkIHRvIGVhY2ggY2hpbGQncyBzdGF0ZSB0byBiZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgSU5QVVQgZmllbGQuICAqLworI2RlZmluZSBBUkdQX0tFWV9JTklUCQkweDEwMDAwMDMKKy8qIFVzZSBhZnRlciBhbGwgb3RoZXIga2V5cywgaW5jbHVkaW5nIFNVQ0NFU1MgJiBFTkQuICAqLworI2RlZmluZSBBUkdQX0tFWV9GSU5JCQkweDEwMDAwMDcKKy8qIFBhc3NlZCBpbiB3aGVuIHBhcnNpbmcgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGNvbXBsZXRlZCAoZXZlbiBpZiB0aGVyZSBhcmUKKyAgIHN0aWxsIGFyZ3VtZW50cyByZW1haW5pbmcpLiAgKi8KKyNkZWZpbmUgQVJHUF9LRVlfU1VDQ0VTUwkweDEwMDAwMDQKKy8qIFBhc3NlZCBpbiBpZiBhbiBlcnJvciBvY2N1cnMuICAqLworI2RlZmluZSBBUkdQX0tFWV9FUlJPUgkJMHgxMDAwMDA1CisKKy8qIEFuIGFyZ3Agc3RydWN0dXJlIGNvbnRhaW5zIGEgc2V0IG9mIG9wdGlvbnMgZGVjbGFyYXRpb25zLCBhIGZ1bmN0aW9uIHRvCisgICBkZWFsIHdpdGggcGFyc2luZyBvbmUsIGRvY3VtZW50YXRpb24gc3RyaW5nLCBhIHBvc3NpYmxlIHZlY3RvciBvZiBjaGlsZAorICAgYXJncCdzLCBhbmQgcGVyaGFwcyBhIGZ1bmN0aW9uIHRvIGZpbHRlciBoZWxwIG91dHB1dC4gIFdoZW4gYWN0dWFsbHkKKyAgIHBhcnNpbmcgb3B0aW9ucywgZ2V0b3B0IGlzIGNhbGxlZCB3aXRoIHRoZSB1bmlvbiBvZiBhbGwgdGhlIGFyZ3AKKyAgIHN0cnVjdHVyZXMgY2hhaW5lZCB0b2dldGhlciB0aHJvdWdoIHRoZWlyIENISUxEIHBvaW50ZXJzLCB3aXRoIGNvbmZsaWN0cworICAgYmVpbmcgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgdGhlIGZpcnN0IG9jY3VycmVuY2UgaW4gdGhlIGNoYWluLiAgKi8KK3N0cnVjdCBhcmdwCit7CisgIC8qIEFuIGFycmF5IG9mIGFyZ3Bfb3B0aW9uIHN0cnVjdHVyZXMsIHRlcm1pbmF0ZWQgYnkgYW4gZW50cnkgd2l0aCBib3RoCisgICAgIE5BTUUgYW5kIEtFWSBoYXZpbmcgYSB2YWx1ZSBvZiAwLiAgKi8KKyAgX19jb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gKm9wdGlvbnM7CisKKyAgLyogV2hhdCB0byBkbyB3aXRoIGFuIG9wdGlvbiBmcm9tIHRoaXMgc3RydWN0dXJlLiAgS0VZIGlzIHRoZSBrZXkKKyAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb24sIGFuZCBBUkcgaXMgYW55IGFzc29jaWF0ZWQgYXJndW1lbnQgKE5VTEwgaWYKKyAgICAgbm9uZSB3YXMgc3VwcGxpZWQpLiAgSWYgS0VZIGlzbid0IHVuZGVyc3Rvb2QsIEFSR1BfRVJSX1VOS05PV04gc2hvdWxkIGJlCisgICAgIHJldHVybmVkLiAgSWYgYSBub24temVybywgbm9uLUFSR1BfRVJSX1VOS05PV04gdmFsdWUgaXMgcmV0dXJuZWQsIHRoZW4KKyAgICAgcGFyc2luZyBpcyBzdG9wcGVkIGltbWVkaWF0ZWx5LCBhbmQgdGhhdCB2YWx1ZSBpcyByZXR1cm5lZCBmcm9tCisgICAgIGFyZ3BfcGFyc2UoKS4gIEZvciBzcGVjaWFsIChub24tdXNlci1zdXBwbGllZCkgdmFsdWVzIG9mIEtFWSwgc2VlIHRoZQorICAgICBBUkdQX0tFWV8gZGVmaW5pdGlvbnMgYmVsb3cuICAqLworICBhcmdwX3BhcnNlcl90IHBhcnNlcjsKKworICAvKiBBIHN0cmluZyBkZXNjcmliaW5nIHdoYXQgb3RoZXIgYXJndW1lbnRzIGFyZSB3YW50ZWQgYnkgdGhpcyBwcm9ncmFtLiAgSXQKKyAgICAgaXMgb25seSB1c2VkIGJ5IGFyZ3BfdXNhZ2UgdG8gcHJpbnQgdGhlIGBVc2FnZTonIG1lc3NhZ2UuICBJZiBpdAorICAgICBjb250YWlucyBuZXdsaW5lcywgdGhlIHN0cmluZ3Mgc2VwYXJhdGVkIGJ5IHRoZW0gYXJlIGNvbnNpZGVyZWQKKyAgICAgYWx0ZXJuYXRpdmUgdXNhZ2UgcGF0dGVybnMsIGFuZCBwcmludGVkIG9uIHNlcGFyYXRlIGxpbmVzIChsaW5lcyBhZnRlcgorICAgICB0aGUgZmlyc3QgYXJlIHByZWZpeCBieSBgICBvcjogJyBpbnN0ZWFkIG9mIGBVc2FnZTonKS4gICovCisgIF9fY29uc3QgY2hhciAqYXJnc19kb2M7CisKKyAgLyogSWYgbm9uLU5VTEwsIGEgc3RyaW5nIGNvbnRhaW5pbmcgZXh0cmEgdGV4dCB0byBiZSBwcmludGVkIGJlZm9yZSBhbmQKKyAgICAgYWZ0ZXIgdGhlIG9wdGlvbnMgaW4gYSBsb25nIGhlbHAgbWVzc2FnZSAoc2VwYXJhdGVkIGJ5IGEgdmVydGljYWwgdGFiCisgICAgIGBcdicgY2hhcmFjdGVyKS4gICovCisgIF9fY29uc3QgY2hhciAqZG9jOworCisgIC8qIEEgdmVjdG9yIG9mIGFyZ3BfY2hpbGRyZW4gc3RydWN0dXJlcywgdGVybWluYXRlZCBieSBhIG1lbWJlciB3aXRoIGEgMAorICAgICBhcmdwIGZpZWxkLCBwb2ludGluZyB0byBjaGlsZCBhcmdwcyBzaG91bGQgYmUgcGFyc2VkIHdpdGggdGhpcyBvbmUuICBBbnkKKyAgICAgY29uZmxpY3RzIGFyZSByZXNvbHZlZCBpbiBmYXZvciBvZiB0aGlzIGFyZ3AsIG9yIGVhcmx5IGFyZ3BzIGluIHRoZQorICAgICBDSElMRFJFTiBsaXN0LiAgVGhpcyBmaWVsZCBpcyB1c2VmdWwgaWYgeW91IHVzZSBsaWJyYXJpZXMgdGhhdCBzdXBwbHkKKyAgICAgdGhlaXIgb3duIGFyZ3Agc3RydWN0dXJlLCB3aGljaCB5b3Ugd2FudCB0byB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCB5b3VyCisgICAgIG93bi4gICovCisgIF9fY29uc3Qgc3RydWN0IGFyZ3BfY2hpbGQgKmNoaWxkcmVuOworCisgIC8qIElmIG5vbi16ZXJvLCB0aGlzIHNob3VsZCBiZSBhIGZ1bmN0aW9uIHRvIGZpbHRlciB0aGUgb3V0cHV0IG9mIGhlbHAKKyAgICAgbWVzc2FnZXMuICBLRVkgaXMgZWl0aGVyIGEga2V5IGZyb20gYW4gb3B0aW9uLCBpbiB3aGljaCBjYXNlIFRFWFQgaXMKKyAgICAgdGhhdCBvcHRpb24ncyBoZWxwIHRleHQsIG9yIGEgc3BlY2lhbCBrZXkgZnJvbSB0aGUgQVJHUF9LRVlfSEVMUF8KKyAgICAgZGVmaW5lcywgYmVsb3csIGRlc2NyaWJpbmcgd2hpY2ggb3RoZXIgaGVscCB0ZXh0IFRFWFQgaXMuICBUaGUgZnVuY3Rpb24KKyAgICAgc2hvdWxkIHJldHVybiBlaXRoZXIgVEVYVCwgaWYgaXQgc2hvdWxkIGJlIHVzZWQgYXMtaXMsIGEgcmVwbGFjZW1lbnQKKyAgICAgc3RyaW5nLCB3aGljaCBzaG91bGQgYmUgbWFsbG9jZWQsIGFuZCB3aWxsIGJlIGZyZWVkIGJ5IGFyZ3AsIG9yIE5VTEwsCisgICAgIG1lYW5pbmcgYHByaW50IG5vdGhpbmcnLiAgVGhlIHZhbHVlIGZvciBURVhUIGlzICphZnRlciogYW55IHRyYW5zbGF0aW9uCisgICAgIGhhcyBiZWVuIGRvbmUsIHNvIGlmIGFueSBvZiB0aGUgcmVwbGFjZW1lbnQgdGV4dCBhbHNvIG5lZWRzIHRyYW5zbGF0aW9uLAorICAgICB0aGF0IHNob3VsZCBiZSBkb25lIGJ5IHRoZSBmaWx0ZXIgZnVuY3Rpb24uICBJTlBVVCBpcyBlaXRoZXIgdGhlIGlucHV0CisgICAgIHN1cHBsaWVkIHRvIGFyZ3BfcGFyc2UsIG9yIE5VTEwsIGlmIGFyZ3BfaGVscCB3YXMgY2FsbGVkIGRpcmVjdGx5LiAgKi8KKyAgY2hhciAqKCpoZWxwX2ZpbHRlcikgKGludCBfX2tleSwgX19jb25zdCBjaGFyICpfX3RleHQsIHZvaWQgKl9faW5wdXQpOworCisgIC8qIElmIG5vbi16ZXJvIHRoZSBzdHJpbmdzIHVzZWQgaW4gdGhlIGFyZ3AgbGlicmFyeSBhcmUgdHJhbnNsYXRlZCB1c2luZworICAgICB0aGUgZG9tYWluIGRlc2NyaWJlZCBieSB0aGlzIHN0cmluZy4gIE90aGVyd2lzZSB0aGUgY3VycmVudGx5IGluc3RhbGxlZAorICAgICBkZWZhdWx0IGRvbWFpbiBpcyB1c2VkLiAgKi8KKyAgY29uc3QgY2hhciAqYXJncF9kb21haW47Cit9OworCisvKiBQb3NzaWJsZSBLRVkgYXJndW1lbnRzIHRvIGEgaGVscCBmaWx0ZXIgZnVuY3Rpb24uICAqLworI2RlZmluZSBBUkdQX0tFWV9IRUxQX1BSRV9ET0MJMHgyMDAwMDAxIC8qIEhlbHAgdGV4dCBwcmVjZWVkaW5nIG9wdGlvbnMuICovCisjZGVmaW5lIEFSR1BfS0VZX0hFTFBfUE9TVF9ET0MJMHgyMDAwMDAyIC8qIEhlbHAgdGV4dCBmb2xsb3dpbmcgb3B0aW9ucy4gKi8KKyNkZWZpbmUgQVJHUF9LRVlfSEVMUF9IRUFERVIJMHgyMDAwMDAzIC8qIE9wdGlvbiBoZWFkZXIgc3RyaW5nLiAqLworI2RlZmluZSBBUkdQX0tFWV9IRUxQX0VYVFJBCTB4MjAwMDAwNCAvKiBBZnRlciBhbGwgb3RoZXIgZG9jdW1lbnRhdGlvbjsKKwkJCQkJICAgICBURVhUIGlzIE5VTEwgZm9yIHRoaXMga2V5LiAgKi8KKy8qIEV4cGxhbmF0b3J5IG5vdGUgZW1pdHRlZCB3aGVuIGR1cGxpY2F0ZSBvcHRpb24gYXJndW1lbnRzIGhhdmUgYmVlbgorICAgc3VwcHJlc3NlZC4gICovCisjZGVmaW5lIEFSR1BfS0VZX0hFTFBfRFVQX0FSR1NfTk9URSAweDIwMDAwMDUKKyNkZWZpbmUgQVJHUF9LRVlfSEVMUF9BUkdTX0RPQwkweDIwMDAwMDYgLyogQXJndW1lbnQgZG9jIHN0cmluZy4gICovCisMCisvKiBXaGVuIGFuIGFyZ3AgaGFzIGEgbm9uLXplcm8gQ0hJTERSRU4gZmllbGQsIGl0IHNob3VsZCBwb2ludCB0byBhIHZlY3RvciBvZgorICAgYXJncF9jaGlsZCBzdHJ1Y3R1cmVzLCBlYWNoIG9mIHdoaWNoIGRlc2NyaWJlcyBhIHN1YnNpZGlhcnkgYXJncC4gICovCitzdHJ1Y3QgYXJncF9jaGlsZAoreworICAvKiBUaGUgY2hpbGQgcGFyc2VyLiAgKi8KKyAgX19jb25zdCBzdHJ1Y3QgYXJncCAqYXJncDsKKworICAvKiBGbGFncyBmb3IgdGhpcyBjaGlsZC4gICovCisgIGludCBmbGFnczsKKworICAvKiBJZiBub24temVybywgYW4gb3B0aW9uYWwgaGVhZGVyIHRvIGJlIHByaW50ZWQgaW4gaGVscCBvdXRwdXQgYmVmb3JlIHRoZQorICAgICBjaGlsZCBvcHRpb25zLiAgQXMgYSBzaWRlLWVmZmVjdCwgYSBub24temVybyB2YWx1ZSBmb3JjZXMgdGhlIGNoaWxkCisgICAgIG9wdGlvbnMgdG8gYmUgZ3JvdXBlZCB0b2dldGhlcjsgdG8gYWNoaWV2ZSB0aGlzIGVmZmVjdCB3aXRob3V0IGFjdHVhbGx5CisgICAgIHByaW50aW5nIGEgaGVhZGVyIHN0cmluZywgdXNlIGEgdmFsdWUgb2YgIiIuICAqLworICBfX2NvbnN0IGNoYXIgKmhlYWRlcjsKKworICAvKiBXaGVyZSB0byBncm91cCB0aGUgY2hpbGQgb3B0aW9ucyByZWxhdGl2ZSB0byB0aGUgb3RoZXIgKGBjb25zb2xpZGF0ZWQnKQorICAgICBvcHRpb25zIGluIHRoZSBwYXJlbnQgYXJncDsgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgdGhlIEdST1VQIGZpZWxkCisgICAgIGluIGFyZ3Bfb3B0aW9uIHN0cnVjdHMsIGJ1dCBhbGwgY2hpbGQtZ3JvdXBpbmdzIGZvbGxvdyBwYXJlbnQgb3B0aW9ucyBhdAorICAgICBhIHBhcnRpY3VsYXIgZ3JvdXAgbGV2ZWwuICBJZiBib3RoIHRoaXMgZmllbGQgYW5kIEhFQURFUiBhcmUgemVybywgdGhlbgorICAgICB0aGV5IGFyZW4ndCBncm91cGVkIGF0IGFsbCwgYnV0IHJhdGhlciBtZXJnZWQgd2l0aCB0aGUgcGFyZW50IG9wdGlvbnMKKyAgICAgKG1lcmdpbmcgdGhlIGNoaWxkJ3MgZ3JvdXBpbmcgbGV2ZWxzIHdpdGggdGhlIHBhcmVudHMpLiAgKi8KKyAgaW50IGdyb3VwOworfTsKKwwKKy8qIFBhcnNpbmcgc3RhdGUuICBUaGlzIGlzIHByb3ZpZGVkIHRvIHBhcnNpbmcgZnVuY3Rpb25zIGNhbGxlZCBieSBhcmdwLAorICAgd2hpY2ggbWF5IGV4YW1pbmUgYW5kLCBhcyBub3RlZCwgbW9kaWZ5IGZpZWxkcy4gICovCitzdHJ1Y3QgYXJncF9zdGF0ZQoreworICAvKiBUaGUgdG9wIGxldmVsIEFSR1AgYmVpbmcgcGFyc2VkLiAgKi8KKyAgX19jb25zdCBzdHJ1Y3QgYXJncCAqcm9vdF9hcmdwOworCisgIC8qIFRoZSBhcmd1bWVudCB2ZWN0b3IgYmVpbmcgcGFyc2VkLiAgTWF5IGJlIG1vZGlmaWVkLiAgKi8KKyAgaW50IGFyZ2M7CisgIGNoYXIgKiphcmd2OworCisgIC8qIFRoZSBpbmRleCBpbiBBUkdWIG9mIHRoZSBuZXh0IGFyZyB0aGF0IHRvIGJlIHBhcnNlZC4gIE1heSBiZSBtb2RpZmllZC4gKi8KKyAgaW50IG5leHQ7CisKKyAgLyogVGhlIGZsYWdzIHN1cHBsaWVkIHRvIGFyZ3BfcGFyc2UuICBNYXkgYmUgbW9kaWZpZWQuICAqLworICB1bnNpZ25lZCBmbGFnczsKKworICAvKiBXaGlsZSBjYWxsaW5nIGEgcGFyc2luZyBmdW5jdGlvbiB3aXRoIGEga2V5IG9mIEFSR1BfS0VZX0FSRywgdGhpcyBpcyB0aGUKKyAgICAgbnVtYmVyIG9mIHRoZSBjdXJyZW50IGFyZywgc3RhcnRpbmcgYXQgemVybywgYW5kIGluY3JlbWVudGVkIGFmdGVyIGVhY2gKKyAgICAgc3VjaCBjYWxsIHJldHVybnMuICBBdCBhbGwgb3RoZXIgdGltZXMsIHRoaXMgaXMgdGhlIG51bWJlciBvZiBzdWNoCisgICAgIGFyZ3VtZW50cyB0aGF0IGhhdmUgYmVlbiBwcm9jZXNzZWQuICAqLworICB1bnNpZ25lZCBhcmdfbnVtOworCisgIC8qIElmIG5vbi16ZXJvLCB0aGUgaW5kZXggaW4gQVJHViBvZiB0aGUgZmlyc3QgYXJndW1lbnQgZm9sbG93aW5nIGEgc3BlY2lhbAorICAgICBgLS0nIGFyZ3VtZW50ICh3aGljaCBwcmV2ZW50cyBhbnl0aGluZyBmb2xsb3dpbmcgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgYW4KKyAgICAgb3B0aW9uKS4gIE9ubHkgc2V0IG9uY2UgYXJndW1lbnQgcGFyc2luZyBoYXMgcHJvY2VlZGVkIHBhc3QgdGhpcyBwb2ludC4gKi8KKyAgaW50IHF1b3RlZDsKKworICAvKiBBbiBhcmJpdHJhcnkgcG9pbnRlciBwYXNzZWQgaW4gZnJvbSB0aGUgdXNlci4gICovCisgIHZvaWQgKmlucHV0OworICAvKiBWYWx1ZXMgdG8gcGFzcyB0byBjaGlsZCBwYXJzZXJzLiAgVGhpcyB2ZWN0b3Igd2lsbCBiZSB0aGUgc2FtZSBsZW5ndGggYXMKKyAgICAgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgdGhlIGN1cnJlbnQgcGFyc2VyLiAgKi8KKyAgdm9pZCAqKmNoaWxkX2lucHV0czsKKworICAvKiBGb3IgdGhlIHBhcnNlcidzIHVzZS4gIEluaXRpYWxpemVkIHRvIDAuICAqLworICB2b2lkICpob29rOworCisgIC8qIFRoZSBuYW1lIHVzZWQgd2hlbiBwcmludGluZyBtZXNzYWdlcy4gIFRoaXMgaXMgaW5pdGlhbGl6ZWQgdG8gQVJHVlswXSwKKyAgICAgb3IgUFJPR1JBTV9JTlZPQ0FUSU9OX05BTUUgaWYgdGhhdCBpcyB1bmF2YWlsYWJsZS4gICovCisgIGNoYXIgKm5hbWU7CisKKyAgLyogU3RyZWFtcyB1c2VkIHdoZW4gYXJncCBwcmludHMgc29tZXRoaW5nLiAgKi8KKyAgRklMRSAqZXJyX3N0cmVhbTsJCS8qIEZvciBlcnJvcnM7IGluaXRpYWxpemVkIHRvIHN0ZGVyci4gKi8KKyAgRklMRSAqb3V0X3N0cmVhbTsJCS8qIEZvciBpbmZvcm1hdGlvbjsgaW5pdGlhbGl6ZWQgdG8gc3Rkb3V0LiAqLworCisgIHZvaWQgKnBzdGF0ZTsJCQkvKiBQcml2YXRlLCBmb3IgdXNlIGJ5IGFyZ3AuICAqLworfTsKKwwKKy8qIEZsYWdzIGZvciBhcmdwX3BhcnNlIChub3RlIHRoYXQgdGhlIGRlZmF1bHRzIGFyZSB0aG9zZSB0aGF0IGFyZQorICAgY29udmVuaWVudCBmb3IgcHJvZ3JhbSBjb21tYW5kIGxpbmUgcGFyc2luZyk6ICovCisKKy8qIERvbid0IGlnbm9yZSB0aGUgZmlyc3QgZWxlbWVudCBvZiBBUkdWLiAgTm9ybWFsbHkgKGFuZCBhbHdheXMgdW5sZXNzCisgICBBUkdQX05PX0VSUlMgaXMgc2V0KSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJndW1lbnQgdmVjdG9yIGlzCisgICBza2lwcGVkIGZvciBvcHRpb24gcGFyc2luZyBwdXJwb3NlcywgYXMgaXQgY29ycmVzcG9uZHMgdG8gdGhlIHByb2dyYW0gbmFtZQorICAgaW4gYSBjb21tYW5kIGxpbmUuICAqLworI2RlZmluZSBBUkdQX1BBUlNFX0FSR1YwICAweDAxCisKKy8qIERvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGZvciB1bmtub3duIG9wdGlvbnMgdG8gc3RkZXJyOyB1bmxlc3MgdGhpcyBmbGFnCisgICBpcyBzZXQsIEFSR1BfUEFSU0VfQVJHVjAgaXMgaWdub3JlZCwgYXMgQVJHVlswXSBpcyB1c2VkIGFzIHRoZSBwcm9ncmFtCisgICBuYW1lIGluIHRoZSBlcnJvciBtZXNzYWdlcy4gIFRoaXMgZmxhZyBpbXBsaWVzIEFSR1BfTk9fRVhJVCAob24gdGhlCisgICBhc3N1bXB0aW9uIHRoYXQgc2lsZW50IGV4aXRpbmcgdXBvbiBlcnJvcnMgaXMgYmFkIGJlaGF2aW91cikuICAqLworI2RlZmluZSBBUkdQX05PX0VSUlMJMHgwMgorCisvKiBEb24ndCBwYXJzZSBhbnkgbm9uLW9wdGlvbiBhcmdzLiAgTm9ybWFsbHkgbm9uLW9wdGlvbiBhcmdzIGFyZSBwYXJzZWQgYnkKKyAgIGNhbGxpbmcgdGhlIHBhcnNlIGZ1bmN0aW9ucyB3aXRoIGEga2V5IG9mIEFSR1BfS0VZX0FSRywgYW5kIHRoZSBhY3R1YWwgYXJnCisgICBhcyB0aGUgdmFsdWUuICBTaW5jZSBpdCdzIGltcG9zc2libGUgdG8ga25vdyB3aGljaCBwYXJzZSBmdW5jdGlvbiB3YW50cyB0bworICAgaGFuZGxlIGl0LCBlYWNoIG9uZSBpcyBjYWxsZWQgaW4gdHVybiwgdW50aWwgb25lIHJldHVybnMgMCBvciBhbiBlcnJvcgorICAgb3RoZXIgdGhhbiBBUkdQX0VSUl9VTktOT1dOOyBpZiBhbiBhcmd1bWVudCBpcyBoYW5kbGVkIGJ5IG5vIG9uZSwgdGhlCisgICBhcmdwX3BhcnNlIHJldHVybnMgcHJlbWF0dXJlbHkgKGJ1dCB3aXRoIGEgcmV0dXJuIHZhbHVlIG9mIDApLiAgSWYgYWxsCisgICBhcmdzIGhhdmUgYmVlbiBwYXJzZWQgd2l0aG91dCBlcnJvciwgYWxsIHBhcnNpbmcgZnVuY3Rpb25zIGFyZSBjYWxsZWQgb25lCisgICBsYXN0IHRpbWUgd2l0aCBhIGtleSBvZiBBUkdQX0tFWV9FTkQuICBUaGlzIGZsYWcgbmVlZG4ndCBub3JtYWxseSBiZSBzZXQsCisgICBhcyB0aGUgbm9ybWFsIGJlaGF2aW9yIGlzIHRvIHN0b3AgcGFyc2luZyBhcyBzb29uIGFzIHNvbWUgYXJndW1lbnQgY2FuJ3QKKyAgIGJlIGhhbmRsZWQuICAqLworI2RlZmluZSBBUkdQX05PX0FSR1MJMHgwNAorCisvKiBQYXJzZSBvcHRpb25zIGFuZCBhcmd1bWVudHMgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSBvY2N1ciBvbiB0aGUgY29tbWFuZAorICAgbGluZSAtLSBub3JtYWxseSB0aGV5J3JlIHJlYXJyYW5nZWQgc28gdGhhdCBhbGwgb3B0aW9ucyBjb21lIGZpcnN0LiAqLworI2RlZmluZSBBUkdQX0lOX09SREVSCTB4MDgKKworLyogRG9uJ3QgcHJvdmlkZSB0aGUgc3RhbmRhcmQgbG9uZyBvcHRpb24gLS1oZWxwLCB3aGljaCBjYXVzZXMgdXNhZ2UgYW5kCisgICAgICBvcHRpb24gaGVscCBpbmZvcm1hdGlvbiB0byBiZSBvdXRwdXQgdG8gc3Rkb3V0LCBhbmQgZXhpdCAoMCkgY2FsbGVkLiAqLworI2RlZmluZSBBUkdQX05PX0hFTFAJMHgxMAorCisvKiBEb24ndCBleGl0IG9uIGVycm9ycyAodGhleSBtYXkgc3RpbGwgcmVzdWx0IGluIGVycm9yIG1lc3NhZ2VzKS4gICovCisjZGVmaW5lIEFSR1BfTk9fRVhJVAkweDIwCisKKy8qIFVzZSB0aGUgZ251IGdldG9wdCBgbG9uZy1vbmx5JyBydWxlcyBmb3IgcGFyc2luZyBhcmd1bWVudHMuICAqLworI2RlZmluZSBBUkdQX0xPTkdfT05MWQkweDQwCisKKy8qIFR1cm5zIG9mZiBhbnkgbWVzc2FnZS1wcmludGluZy9leGl0aW5nIG9wdGlvbnMuICAqLworI2RlZmluZSBBUkdQX1NJTEVOVCAgICAoQVJHUF9OT19FWElUIHwgQVJHUF9OT19FUlJTIHwgQVJHUF9OT19IRUxQKQorCisvKiBQYXJzZSB0aGUgb3B0aW9ucyBzdHJpbmdzIGluIEFSR0MgJiBBUkdWIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucyBpbiBBUkdQLgorICAgRkxBR1MgaXMgb25lIG9mIHRoZSBBUkdQXyBmbGFncyBhYm92ZS4gIElmIEFSR19JTkRFWCBpcyBub24tTlVMTCwgdGhlCisgICBpbmRleCBpbiBBUkdWIG9mIHRoZSBmaXJzdCB1bnBhcnNlZCBvcHRpb24gaXMgcmV0dXJuZWQgaW4gaXQuICBJZiBhbgorICAgdW5rbm93biBvcHRpb24gaXMgcHJlc2VudCwgQVJHUF9FUlJfVU5LTk9XTiBpcyByZXR1cm5lZDsgaWYgc29tZSBwYXJzZXIKKyAgIHJvdXRpbmUgcmV0dXJuZWQgYSBub24temVybyB2YWx1ZSwgaXQgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSAwIGlzCisgICByZXR1cm5lZC4gIFRoaXMgZnVuY3Rpb24gbWF5IGFsc28gY2FsbCBleGl0IHVubGVzcyB0aGUgQVJHUF9OT19IRUxQIGZsYWcKKyAgIGlzIHNldC4gIElOUFVUIGlzIGEgcG9pbnRlciB0byBhIHZhbHVlIHRvIGJlIHBhc3NlZCBpbiB0byB0aGUgcGFyc2VyLiAgKi8KK2V4dGVybiBlcnJvcl90IGFyZ3BfcGFyc2UgKF9fY29uc3Qgc3RydWN0IGFyZ3AgKl9fcmVzdHJpY3QgX19hcmdwLAorCQkJICAgaW50IF9fYXJnYywgY2hhciAqKl9fcmVzdHJpY3QgX19hcmd2LAorCQkJICAgdW5zaWduZWQgX19mbGFncywgaW50ICpfX3Jlc3RyaWN0IF9fYXJnX2luZGV4LAorCQkJICAgdm9pZCAqX19yZXN0cmljdCBfX2lucHV0KTsKK2V4dGVybiBlcnJvcl90IF9fYXJncF9wYXJzZSAoX19jb25zdCBzdHJ1Y3QgYXJncCAqX19yZXN0cmljdCBfX2FyZ3AsCisJCQkgICAgIGludCBfX2FyZ2MsIGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJndiwKKwkJCSAgICAgdW5zaWduZWQgX19mbGFncywgaW50ICpfX3Jlc3RyaWN0IF9fYXJnX2luZGV4LAorCQkJICAgICB2b2lkICpfX3Jlc3RyaWN0IF9faW5wdXQpOworDAorLyogR2xvYmFsIHZhcmlhYmxlcy4gICovCisKKy8qIElmIGRlZmluZWQgb3Igc2V0IGJ5IHRoZSB1c2VyIHByb2dyYW0gdG8gYSBub24temVybyB2YWx1ZSwgdGhlbiBhIGRlZmF1bHQKKyAgIG9wdGlvbiAtLXZlcnNpb24gaXMgYWRkZWQgKHVubGVzcyB0aGUgQVJHUF9OT19IRUxQIGZsYWcgaXMgdXNlZCksIHdoaWNoCisgICB3aWxsIHByaW50IHRoaXMgc3RyaW5nIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSBhbmQgZXhpdCAodW5sZXNzIHRoZQorICAgQVJHUF9OT19FWElUIGZsYWcgaXMgdXNlZCkuICBPdmVycmlkZGVuIGJ5IEFSR1BfUFJPR1JBTV9WRVJTSU9OX0hPT0suICAqLworZXh0ZXJuIF9fY29uc3QgY2hhciAqYXJncF9wcm9ncmFtX3ZlcnNpb247CisKKy8qIElmIGRlZmluZWQgb3Igc2V0IGJ5IHRoZSB1c2VyIHByb2dyYW0gdG8gYSBub24temVybyB2YWx1ZSwgdGhlbiBhIGRlZmF1bHQKKyAgIG9wdGlvbiAtLXZlcnNpb24gaXMgYWRkZWQgKHVubGVzcyB0aGUgQVJHUF9OT19IRUxQIGZsYWcgaXMgdXNlZCksIHdoaWNoCisgICBjYWxscyB0aGlzIGZ1bmN0aW9uIHdpdGggYSBzdHJlYW0gdG8gcHJpbnQgdGhlIHZlcnNpb24gdG8gYW5kIGEgcG9pbnRlciB0bworICAgdGhlIGN1cnJlbnQgcGFyc2luZyBzdGF0ZSwgYW5kIHRoZW4gZXhpdHMgKHVubGVzcyB0aGUgQVJHUF9OT19FWElUIGZsYWcgaXMKKyAgIHVzZWQpLiAgVGhpcyB2YXJpYWJsZSB0YWtlcyBwcmVjZWRlbnQgb3ZlciBBUkdQX1BST0dSQU1fVkVSU0lPTi4gICovCitleHRlcm4gdm9pZCAoKmFyZ3BfcHJvZ3JhbV92ZXJzaW9uX2hvb2spIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJCQkgIHN0cnVjdCBhcmdwX3N0YXRlICpfX3Jlc3RyaWN0CisJCQkJCSAgX19zdGF0ZSk7CisKKy8qIElmIGRlZmluZWQgb3Igc2V0IGJ5IHRoZSB1c2VyIHByb2dyYW0sIGl0IHNob3VsZCBwb2ludCB0byBzdHJpbmcgdGhhdCBpcworICAgdGhlIGJ1Zy1yZXBvcnRpbmcgYWRkcmVzcyBmb3IgdGhlIHByb2dyYW0uICBJdCB3aWxsIGJlIHByaW50ZWQgYnkKKyAgIGFyZ3BfaGVscCBpZiB0aGUgQVJHUF9IRUxQX0JVR19BRERSIGZsYWcgaXMgc2V0IChhcyBpdCBpcyBieSB2YXJpb3VzCisgICBzdGFuZGFyZCBoZWxwIG1lc3NhZ2VzKSwgZW1iZWRkZWQgaW4gYSBzZW50ZW5jZSB0aGF0IHNheXMgc29tZXRoaW5nIGxpa2UKKyAgIGBSZXBvcnQgYnVncyB0byBBRERSLicuICAqLworZXh0ZXJuIF9fY29uc3QgY2hhciAqYXJncF9wcm9ncmFtX2J1Z19hZGRyZXNzOworCisvKiBUaGUgZXhpdCBzdGF0dXMgdGhhdCBhcmdwIHdpbGwgdXNlIHdoZW4gZXhpdGluZyBkdWUgdG8gYSBwYXJzaW5nIGVycm9yLgorICAgSWYgbm90IGRlZmluZWQgb3Igc2V0IGJ5IHRoZSB1c2VyIHByb2dyYW0sIHRoaXMgZGVmYXVsdHMgdG8gRVhfVVNBR0UgZnJvbQorICAgPHN5c2V4aXRzLmg+LiAgKi8KK2V4dGVybiBlcnJvcl90IGFyZ3BfZXJyX2V4aXRfc3RhdHVzOworDAorLyogRmxhZ3MgZm9yIGFyZ3BfaGVscC4gICovCisjZGVmaW5lIEFSR1BfSEVMUF9VU0FHRQkJMHgwMSAvKiBhIFVzYWdlOiBtZXNzYWdlLiAqLworI2RlZmluZSBBUkdQX0hFTFBfU0hPUlRfVVNBR0UJMHgwMiAvKiAgIiBidXQgZG9uJ3QgYWN0dWFsbHkgcHJpbnQgb3B0aW9ucy4gKi8KKyNkZWZpbmUgQVJHUF9IRUxQX1NFRQkJMHgwNCAvKiBhIGBUcnkgLi4uIGZvciBtb3JlIGhlbHAnIG1lc3NhZ2UuICovCisjZGVmaW5lIEFSR1BfSEVMUF9MT05HCQkweDA4IC8qIGEgbG9uZyBoZWxwIG1lc3NhZ2UuICovCisjZGVmaW5lIEFSR1BfSEVMUF9QUkVfRE9DCTB4MTAgLyogZG9jIHN0cmluZyBwcmVjZWRpbmcgbG9uZyBoZWxwLiAgKi8KKyNkZWZpbmUgQVJHUF9IRUxQX1BPU1RfRE9DCTB4MjAgLyogZG9jIHN0cmluZyBmb2xsb3dpbmcgbG9uZyBoZWxwLiAgKi8KKyNkZWZpbmUgQVJHUF9IRUxQX0RPQwkJKEFSR1BfSEVMUF9QUkVfRE9DIHwgQVJHUF9IRUxQX1BPU1RfRE9DKQorI2RlZmluZSBBUkdQX0hFTFBfQlVHX0FERFIJMHg0MCAvKiBidWcgcmVwb3J0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQVJHUF9IRUxQX0xPTkdfT05MWQkweDgwIC8qIG1vZGlmeSBvdXRwdXQgYXBwcm9wcmlhdGVseSB0bworCQkJCQlyZWZsZWN0IEFSR1BfTE9OR19PTkxZIG1vZGUuICAqLworCisvKiBUaGVzZSBBUkdQX0hFTFAgZmxhZ3MgYXJlIG9ubHkgdW5kZXJzdG9vZCBieSBhcmdwX3N0YXRlX2hlbHAuICAqLworI2RlZmluZSBBUkdQX0hFTFBfRVhJVF9FUlIJMHgxMDAgLyogQ2FsbCBleGl0KDEpIGluc3RlYWQgb2YgcmV0dXJuaW5nLiAgKi8KKyNkZWZpbmUgQVJHUF9IRUxQX0VYSVRfT0sJMHgyMDAgLyogQ2FsbCBleGl0KDApIGluc3RlYWQgb2YgcmV0dXJuaW5nLiAgKi8KKworLyogVGhlIHN0YW5kYXJkIHRoaW5nIHRvIGRvIGFmdGVyIGEgcHJvZ3JhbSBjb21tYW5kIGxpbmUgcGFyc2luZyBlcnJvciwgaWYgYW4KKyAgIGVycm9yIG1lc3NhZ2UgaGFzIGFscmVhZHkgYmVlbiBwcmludGVkLiAgKi8KKyNkZWZpbmUgQVJHUF9IRUxQX1NURF9FUlIgXAorICAoQVJHUF9IRUxQX1NFRSB8IEFSR1BfSEVMUF9FWElUX0VSUikKKy8qIFRoZSBzdGFuZGFyZCB0aGluZyB0byBkbyBhZnRlciBhIHByb2dyYW0gY29tbWFuZCBsaW5lIHBhcnNpbmcgZXJyb3IsIGlmIG5vCisgICBtb3JlIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UgaGFzIGJlZW4gcHJpbnRlZC4gICovCisjZGVmaW5lIEFSR1BfSEVMUF9TVERfVVNBR0UgXAorICAoQVJHUF9IRUxQX1NIT1JUX1VTQUdFIHwgQVJHUF9IRUxQX1NFRSB8IEFSR1BfSEVMUF9FWElUX0VSUikKKy8qIFRoZSBzdGFuZGFyZCB0aGluZyB0byBkbyBpbiByZXNwb25zZSB0byBhIC0taGVscCBvcHRpb24uICAqLworI2RlZmluZSBBUkdQX0hFTFBfU1REX0hFTFAgXAorICAoQVJHUF9IRUxQX1NIT1JUX1VTQUdFIHwgQVJHUF9IRUxQX0xPTkcgfCBBUkdQX0hFTFBfRVhJVF9PSyBcCisgICB8IEFSR1BfSEVMUF9ET0MgfCBBUkdQX0hFTFBfQlVHX0FERFIpCisKKy8qIE91dHB1dCBhIHVzYWdlIG1lc3NhZ2UgZm9yIEFSR1AgdG8gU1RSRUFNLiAgRkxBR1MgYXJlIGZyb20gdGhlIHNldAorICAgQVJHUF9IRUxQXyouICAqLworZXh0ZXJuIHZvaWQgYXJncF9oZWxwIChfX2NvbnN0IHN0cnVjdCBhcmdwICpfX3Jlc3RyaWN0IF9fYXJncCwKKwkJICAgICAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCSAgICAgICB1bnNpZ25lZCBfX2ZsYWdzLCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSk7CitleHRlcm4gdm9pZCBfX2FyZ3BfaGVscCAoX19jb25zdCBzdHJ1Y3QgYXJncCAqX19yZXN0cmljdCBfX2FyZ3AsCisJCQkgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgdW5zaWduZWQgX19mbGFncywKKwkJCSBjaGFyICpfX25hbWUpOworDAorLyogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIGFuIGFyZ3AKKyAgIHBhcnNpbmcgcm91dGluZSAodGh1cyB0YWtpbmcgYW4gYXJncF9zdGF0ZSBzdHJ1Y3R1cmUgYXMgdGhlIGZpcnN0CisgICBhcmd1bWVudCkuICBUaGV5IG1heSBvciBtYXkgbm90IHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQsIGRlcGVuZGluZworICAgb24gdGhlIGZsYWdzIGluIFNUQVRFIC0tIGluIGFueSBjYXNlLCB0aGUgY2FsbGVyIHNob3VsZCBiZSBwcmVwYXJlZCBmb3IKKyAgIHRoZW0gKm5vdCogdG8gZXhpdCwgYW5kIHNob3VsZCByZXR1cm4gYW4gYXBwcm9waWF0ZSBlcnJvciBhZnRlciBjYWxsaW5nCisgICB0aGVtLiAgW2FyZ3BfdXNhZ2UgJiBhcmdwX2Vycm9yIHNob3VsZCBwcm9iYWJseSBiZSBjYWxsZWQgYXJncF9zdGF0ZV8uLi4sCisgICBidXQgdGhleSdyZSB1c2VkIG9mdGVuIGVub3VnaCB0aGF0IHRoZXkgc2hvdWxkIGJlIHNob3J0XSAgKi8KKworLyogT3V0cHV0LCBpZiBhcHByb3ByaWF0ZSwgYSB1c2FnZSBtZXNzYWdlIGZvciBTVEFURSB0byBTVFJFQU0uICBGTEFHUyBhcmUKKyAgIGZyb20gdGhlIHNldCBBUkdQX0hFTFBfKi4gICovCitleHRlcm4gdm9pZCBhcmdwX3N0YXRlX2hlbHAgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fcmVzdHJpY3QgX19zdGF0ZSwKKwkJCSAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJCSAgICAgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworZXh0ZXJuIHZvaWQgX19hcmdwX3N0YXRlX2hlbHAgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fcmVzdHJpY3QgX19zdGF0ZSwKKwkJCSAgICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKKworLyogUG9zc2libHkgb3V0cHV0IHRoZSBzdGFuZGFyZCB1c2FnZSBtZXNzYWdlIGZvciBBUkdQIHRvIHN0ZGVyciBhbmQgZXhpdC4gICovCitleHRlcm4gdm9pZCBhcmdwX3VzYWdlIChfX2NvbnN0IHN0cnVjdCBhcmdwX3N0YXRlICpfX3N0YXRlKTsKK2V4dGVybiB2b2lkIF9fYXJncF91c2FnZSAoX19jb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqX19zdGF0ZSk7CisKKy8qIElmIGFwcHJvcHJpYXRlLCBwcmludCB0aGUgcHJpbnRmIHN0cmluZyBGTVQgYW5kIGZvbGxvd2luZyBhcmdzLCBwcmVjZWRlZAorICAgYnkgdGhlIHByb2dyYW0gbmFtZSBhbmQgYDonLCB0byBzdGRlcnIsIGFuZCBmb2xsb3dlZCBieSBhIGBUcnkgLi4uIC0taGVscCcKKyAgIG1lc3NhZ2UsIHRoZW4gZXhpdCAoMSkuICAqLworZXh0ZXJuIHZvaWQgYXJncF9lcnJvciAoX19jb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqX19yZXN0cmljdCBfX3N0YXRlLAorCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAzKSkpOworZXh0ZXJuIHZvaWQgX19hcmdwX2Vycm9yIChfX2NvbnN0IHN0cnVjdCBhcmdwX3N0YXRlICpfX3Jlc3RyaWN0IF9fc3RhdGUsCisJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMykpKTsKKworLyogU2ltaWxhciB0byB0aGUgc3RhbmRhcmQgZ251IGVycm9yLXJlcG9ydGluZyBmdW5jdGlvbiBlcnJvcigpLCBidXQgd2lsbAorICAgcmVzcGVjdCB0aGUgQVJHUF9OT19FWElUIGFuZCBBUkdQX05PX0VSUlMgZmxhZ3MgaW4gU1RBVEUsIGFuZCB3aWxsIHByaW50CisgICB0byBTVEFURS0+ZXJyX3N0cmVhbS4gIFRoaXMgaXMgdXNlZnVsIGZvciBhcmd1bWVudCBwYXJzaW5nIGNvZGUgdGhhdCBpcworICAgc2hhcmVkIGJldHdlZW4gcHJvZ3JhbSBzdGFydHVwICh3aGVuIGV4aXRpbmcgaXMgZGVzaXJlZCkgYW5kIHJ1bnRpbWUKKyAgIG9wdGlvbiBwYXJzaW5nICh3aGVuIHR5cGljYWxseSBhbiBlcnJvciBjb2RlIGlzIHJldHVybmVkIGluc3RlYWQpLiAgVGhlCisgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBmdW5jdGlvbiBhbmQgYXJncF9lcnJvciBpcyB0aGF0IHRoZSBsYXR0ZXIgaXMgZm9yCisgICAqcGFyc2luZyBlcnJvcnMqLCBhbmQgdGhlIGZvcm1lciBpcyBmb3Igb3RoZXIgcHJvYmxlbXMgdGhhdCBvY2N1ciBkdXJpbmcKKyAgIHBhcnNpbmcgYnV0IGRvbid0IHJlZmxlY3QgYSAoc3ludGFjdGljKSBwcm9ibGVtIHdpdGggdGhlIGlucHV0LiAgKi8KK2V4dGVybiB2b2lkIGFyZ3BfZmFpbHVyZSAoX19jb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqX19yZXN0cmljdCBfX3N0YXRlLAorCQkJICBpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCA0LCA1KSkpOworZXh0ZXJuIHZvaWQgX19hcmdwX2ZhaWx1cmUgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fcmVzdHJpY3QgX19zdGF0ZSwKKwkJCSAgICBpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDQsIDUpKSk7CisKKy8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3B0aW9uIE9QVCBpcyBhIHZhbGlkIHNob3J0IG9wdGlvbi4gICovCitleHRlcm4gaW50IF9vcHRpb25faXNfc2hvcnQgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uICpfX29wdCkgX19USFJPVzsKK2V4dGVybiBpbnQgX19vcHRpb25faXNfc2hvcnQgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uICpfX29wdCkgX19USFJPVzsKKworLyogUmV0dXJucyB0cnVlIGlmIHRoZSBvcHRpb24gT1BUIGlzIGluIGZhY3QgdGhlIGxhc3QgKHVudXNlZCkgZW50cnkgaW4gYW4KKyAgIG9wdGlvbnMgYXJyYXkuICAqLworZXh0ZXJuIGludCBfb3B0aW9uX2lzX2VuZCAoX19jb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gKl9fb3B0KSBfX1RIUk9XOworZXh0ZXJuIGludCBfX29wdGlvbl9pc19lbmQgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uICpfX29wdCkgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBpbnB1dCBmaWVsZCBmb3IgQVJHUCBpbiB0aGUgcGFyc2VyIGNvcnJlc3BvbmRpbmcgdG8gU1RBVEU7IHVzZWQKKyAgIGJ5IHRoZSBoZWxwIHJvdXRpbmVzLiAgKi8KK2V4dGVybiB2b2lkICpfYXJncF9pbnB1dCAoX19jb25zdCBzdHJ1Y3QgYXJncCAqX19yZXN0cmljdCBfX2FyZ3AsCisJCQkgIF9fY29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fcmVzdHJpY3QgX19zdGF0ZSkKKyAgICAgX19USFJPVzsKK2V4dGVybiB2b2lkICpfX2FyZ3BfaW5wdXQgKF9fY29uc3Qgc3RydWN0IGFyZ3AgKl9fcmVzdHJpY3QgX19hcmdwLAorCQkJICAgX19jb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqX19yZXN0cmljdCBfX3N0YXRlKQorICAgICBfX1RIUk9XOworDAorI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisKKyMgaWYgIV9MSUJDCisjICBkZWZpbmUgX19hcmdwX3VzYWdlIGFyZ3BfdXNhZ2UKKyMgIGRlZmluZSBfX2FyZ3Bfc3RhdGVfaGVscCBhcmdwX3N0YXRlX2hlbHAKKyMgIGRlZmluZSBfX29wdGlvbl9pc19zaG9ydCBfb3B0aW9uX2lzX3Nob3J0CisjICBkZWZpbmUgX19vcHRpb25faXNfZW5kIF9vcHRpb25faXNfZW5kCisjIGVuZGlmCisKKyMgaWZuZGVmIEFSR1BfRUkKKyMgIGRlZmluZSBBUkdQX0VJIF9fZXh0ZXJuX2lubGluZQorIyBlbmRpZgorCitBUkdQX0VJIHZvaWQKK19fYXJncF91c2FnZSAoX19jb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqX19zdGF0ZSkKK3sKKyAgX19hcmdwX3N0YXRlX2hlbHAgKF9fc3RhdGUsIHN0ZGVyciwgQVJHUF9IRUxQX1NURF9VU0FHRSk7Cit9CisKK0FSR1BfRUkgaW50CitfX05USCAoX19vcHRpb25faXNfc2hvcnQgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uICpfX29wdCkpCit7CisgIGlmIChfX29wdC0+ZmxhZ3MgJiBPUFRJT05fRE9DKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgeworICAgICAgaW50IF9fa2V5ID0gX19vcHQtPmtleTsKKyAgICAgIHJldHVybiBfX2tleSA+IDAgJiYgX19rZXkgPD0gVUNIQVJfTUFYICYmIGlzcHJpbnQgKF9fa2V5KTsKKyAgICB9Cit9CisKK0FSR1BfRUkgaW50CitfX05USCAoX19vcHRpb25faXNfZW5kIChfX2NvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiAqX19vcHQpKQoreworICByZXR1cm4gIV9fb3B0LT5rZXkgJiYgIV9fb3B0LT5uYW1lICYmICFfX29wdC0+ZG9jICYmICFfX29wdC0+Z3JvdXA7Cit9CisKKyMgaWYgIV9MSUJDCisjICB1bmRlZiBfX2FyZ3BfdXNhZ2UKKyMgIHVuZGVmIF9fYXJncF9zdGF0ZV9oZWxwCisjICB1bmRlZiBfX29wdGlvbl9pc19zaG9ydAorIyAgdW5kZWYgX19vcHRpb25faXNfZW5kCisjIGVuZGlmCisjZW5kaWYgLyogVXNlIGV4dGVybiBpbmxpbmVzLiAgKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBhcmdwLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJnei5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hcmd6LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0MWQ5OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJnei5oCkBAIC0wLDAgKzEsMTg3IEBACisvKiBSb3V0aW5lcyBmb3IgZGVhbGluZyB3aXRoICdcMCcgc2VwYXJhdGVkIGFyZyB2ZWN0b3JzLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LDk2LDk3LDk4LDk5LDIwMDAsMjAwNCwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9BUkdaX0gKKyNkZWZpbmUgX0FSR1pfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9lcnJvcl90CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4JCS8qIE5lZWQgc2l6ZV90LCBhbmQgc3RyY2hyIGlzIGNhbGxlZCBiZWxvdy4gICovCisKKyNpZm5kZWYgX19jb25zdAorIyBkZWZpbmUgX19jb25zdCBjb25zdAorI2VuZGlmCisKKyNpZm5kZWYgX19lcnJvcl90X2RlZmluZWQKK3R5cGVkZWYgaW50IGVycm9yX3Q7CisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIE1ha2UgYSAnXDAnIHNlcGFyYXRlZCBhcmcgdmVjdG9yIGZyb20gYSB1bml4IGFyZ3YgdmVjdG9yLCByZXR1cm5pbmcgaXQgaW4KKyAgIEFSR1osIGFuZCB0aGUgdG90YWwgbGVuZ3RoIGluIExFTi4gIElmIGEgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3Igb2NjdXJzLAorICAgRU5PTUVNIGlzIHJldHVybmVkLCBvdGhlcndpc2UgMC4gIFRoZSByZXN1bHQgY2FuIGJlIGRlc3Ryb3llZCB1c2luZyBmcmVlLiAqLworZXh0ZXJuIGVycm9yX3QgX19hcmd6X2NyZWF0ZSAoY2hhciAqX19jb25zdCBfX2FyZ3ZbXSwgY2hhciAqKl9fcmVzdHJpY3QgX19hcmd6LAorCQkJICAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fbGVuKSBfX1RIUk9XOworZXh0ZXJuIGVycm9yX3QgYXJnel9jcmVhdGUgKGNoYXIgKl9fY29uc3QgX19hcmd2W10sIGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICBzaXplX3QgKl9fcmVzdHJpY3QgX19sZW4pIF9fVEhST1c7CisKKy8qIE1ha2UgYSAnXDAnIHNlcGFyYXRlZCBhcmcgdmVjdG9yIGZyb20gYSBTRVAgc2VwYXJhdGVkIGxpc3QgaW4KKyAgIFNUUklORywgcmV0dXJuaW5nIGl0IGluIEFSR1osIGFuZCB0aGUgdG90YWwgbGVuZ3RoIGluIExFTi4gIElmIGEKKyAgIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIG9jY3VycywgRU5PTUVNIGlzIHJldHVybmVkLCBvdGhlcndpc2UgMC4KKyAgIFRoZSByZXN1bHQgY2FuIGJlIGRlc3Ryb3llZCB1c2luZyBmcmVlLiAgKi8KK2V4dGVybiBlcnJvcl90IF9fYXJnel9jcmVhdGVfc2VwIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zdHJpbmcsCisJCQkJICBpbnQgX19zZXAsIGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCQkgIHNpemVfdCAqX19yZXN0cmljdCBfX2xlbikgX19USFJPVzsKK2V4dGVybiBlcnJvcl90IGFyZ3pfY3JlYXRlX3NlcCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3RyaW5nLAorCQkJCWludCBfX3NlcCwgY2hhciAqKl9fcmVzdHJpY3QgX19hcmd6LAorCQkJCXNpemVfdCAqX19yZXN0cmljdCBfX2xlbikgX19USFJPVzsKKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gQVJHWi4gICovCitleHRlcm4gc2l6ZV90IF9fYXJnel9jb3VudCAoX19jb25zdCBjaGFyICpfX2FyZ3osIHNpemVfdCBfX2xlbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CitleHRlcm4gc2l6ZV90IGFyZ3pfY291bnQgKF9fY29uc3QgY2hhciAqX19hcmd6LCBzaXplX3QgX19sZW4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworCisvKiBQdXRzIHBvaW50ZXJzIHRvIGVhY2ggc3RyaW5nIGluIEFSR1ogaW50byBBUkdWLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaAorICAgdG8gaG9sZCB0aGVtIGFsbC4gICovCitleHRlcm4gdm9pZCBfX2FyZ3pfZXh0cmFjdCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fYXJneiwgc2l6ZV90IF9fbGVuLAorCQkJICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJndikgX19USFJPVzsKK2V4dGVybiB2b2lkIGFyZ3pfZXh0cmFjdCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fYXJneiwgc2l6ZV90IF9fbGVuLAorCQkJICBjaGFyICoqX19yZXN0cmljdCBfX2FyZ3YpIF9fVEhST1c7CisKKy8qIE1ha2UgJ1wwJyBzZXBhcmF0ZWQgYXJnIHZlY3RvciBBUkdaIHByaW50YWJsZSBieSBjb252ZXJ0aW5nIGFsbCB0aGUgJ1wwJ3MKKyAgIGV4Y2VwdCB0aGUgbGFzdCBpbnRvIHRoZSBjaGFyYWN0ZXIgU0VQLiAgKi8KK2V4dGVybiB2b2lkIF9fYXJnel9zdHJpbmdpZnkgKGNoYXIgKl9fYXJneiwgc2l6ZV90IF9fbGVuLCBpbnQgX19zZXApIF9fVEhST1c7CitleHRlcm4gdm9pZCBhcmd6X3N0cmluZ2lmeSAoY2hhciAqX19hcmd6LCBzaXplX3QgX19sZW4sIGludCBfX3NlcCkgX19USFJPVzsKKworLyogQXBwZW5kIEJVRiwgb2YgbGVuZ3RoIEJVRl9MRU4gdG8gdGhlIGFyZ3ogdmVjdG9yIGluIEFSR1ogJiBBUkdaX0xFTi4gICovCitleHRlcm4gZXJyb3JfdCBfX2FyZ3pfYXBwZW5kIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICAgICBzaXplX3QgKl9fcmVzdHJpY3QgX19hcmd6X2xlbiwKKwkJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9idWZfbGVuKQorICAgICBfX1RIUk9XOworZXh0ZXJuIGVycm9yX3QgYXJnel9hcHBlbmQgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICBzaXplX3QgKl9fcmVzdHJpY3QgX19hcmd6X2xlbiwKKwkJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1Zl9sZW4pCisgICAgIF9fVEhST1c7CisKKy8qIEFwcGVuZCBTVFIgdG8gdGhlIGFyZ3ogdmVjdG9yIGluIEFSR1ogJiBBUkdaX0xFTi4gICovCitleHRlcm4gZXJyb3JfdCBfX2FyZ3pfYWRkIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICBzaXplX3QgKl9fcmVzdHJpY3QgX19hcmd6X2xlbiwKKwkJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cikgX19USFJPVzsKK2V4dGVybiBlcnJvcl90IGFyZ3pfYWRkIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3RyKSBfX1RIUk9XOworCisvKiBBcHBlbmQgU0VQIHNlcGFyYXRlZCBsaXN0IGluIFNUUklORyB0byB0aGUgYXJneiB2ZWN0b3IgaW4gQVJHWiAmCisgICBBUkdaX0xFTi4gICovCitleHRlcm4gZXJyb3JfdCBfX2FyZ3pfYWRkX3NlcCAoY2hhciAqKl9fcmVzdHJpY3QgX19hcmd6LAorCQkJICAgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX2FyZ3pfbGVuLAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cmluZywgaW50IF9fZGVsaW0pCisgICAgIF9fVEhST1c7CitleHRlcm4gZXJyb3JfdCBhcmd6X2FkZF9zZXAgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cmluZywgaW50IF9fZGVsaW0pCisgICAgIF9fVEhST1c7CisKKy8qIERlbGV0ZSBFTlRSWSBmcm9tIEFSR1ogJiBBUkdaX0xFTiwgaWYgaXQgYXBwZWFycyB0aGVyZS4gICovCitleHRlcm4gdm9pZCBfX2FyZ3pfZGVsZXRlIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICBzaXplX3QgKl9fcmVzdHJpY3QgX19hcmd6X2xlbiwKKwkJCSAgIGNoYXIgKl9fcmVzdHJpY3QgX19lbnRyeSkgX19USFJPVzsKK2V4dGVybiB2b2lkIGFyZ3pfZGVsZXRlIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgY2hhciAqX19yZXN0cmljdCBfX2VudHJ5KSBfX1RIUk9XOworCisvKiBJbnNlcnQgRU5UUlkgaW50byBBUkdaICYgQVJHWl9MRU4gYmVmb3JlIEJFRk9SRSwgd2hpY2ggc2hvdWxkIGJlIGFuCisgICBleGlzdGluZyBlbnRyeSBpbiBBUkdaOyBpZiBCRUZPUkUgaXMgTlVMTCwgRU5UUlkgaXMgYXBwZW5kZWQgdG8gdGhlIGVuZC4KKyAgIFNpbmNlIEFSR1oncyBmaXJzdCBlbnRyeSBpcyB0aGUgc2FtZSBhcyBBUkdaLCBhcmd6X2luc2VydCAoQVJHWiwgQVJHWl9MRU4sCisgICBBUkdaLCBFTlRSWSkgd2lsbCBpbnNlcnQgRU5UUlkgYXQgdGhlIGJlZ2lubmluZyBvZiBBUkdaLiAgSWYgQkVGT1JFIGlzIG5vdAorICAgaW4gQVJHWiwgRUlOVkFMIGlzIHJldHVybmVkLCBlbHNlIGlmIG1lbW9yeSBjYW4ndCBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBuZXcKKyAgIEFSR1osIEVOT01FTSBpcyByZXR1cm5lZCwgZWxzZSAwLiAgKi8KK2V4dGVybiBlcnJvcl90IF9fYXJnel9pbnNlcnQgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX2FyZ3pfbGVuLAorCQkJICAgICAgY2hhciAqX19yZXN0cmljdCBfX2JlZm9yZSwKKwkJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2VudHJ5KSBfX1RIUk9XOworZXh0ZXJuIGVycm9yX3QgYXJnel9pbnNlcnQgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICBzaXplX3QgKl9fcmVzdHJpY3QgX19hcmd6X2xlbiwKKwkJCSAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYmVmb3JlLAorCQkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2VudHJ5KSBfX1RIUk9XOworCisvKiBSZXBsYWNlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgc3RyaW5nIFNUUiBpbiBBUkdaIHdpdGggV0lUSCwgcmVhbGxvY2F0aW5nCisgICBBUkdaIGFzIG5lY2Vzc2FyeS4gIElmIFJFUExBQ0VfQ09VTlQgaXMgbm9uLXplcm8sICpSRVBMQUNFX0NPVU5UIHdpbGwgYmUKKyAgIGluY3JlbWVudGVkIGJ5IG51bWJlciBvZiByZXBsYWNlbWVudHMgcGVyZm9ybWVkLiAgKi8KK2V4dGVybiBlcnJvcl90IF9fYXJnel9yZXBsYWNlIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3RyLAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3dpdGgsCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpfX3Jlc3RyaWN0IF9fcmVwbGFjZV9jb3VudCk7CitleHRlcm4gZXJyb3JfdCBhcmd6X3JlcGxhY2UgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0ciwKKwkJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fd2l0aCwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpfX3Jlc3RyaWN0IF9fcmVwbGFjZV9jb3VudCk7CisMCisvKiBSZXR1cm5zIHRoZSBuZXh0IGVudHJ5IGluIEFSR1ogJiBBUkdaX0xFTiBhZnRlciBFTlRSWSwgb3IgTlVMTCBpZiB0aGVyZQorICAgYXJlIG5vIG1vcmUuICBJZiBlbnRyeSBpcyBOVUxMLCB0aGVuIHRoZSBmaXJzdCBlbnRyeSBpcyByZXR1cm5lZC4gIFRoaXMKKyAgIGJlaGF2aW9yIGFsbG93cyB0d28gY29udmVuaWVudCBpdGVyYXRpb24gc3R5bGVzOgorCisgICAgY2hhciAqZW50cnkgPSAwOworICAgIHdoaWxlICgoZW50cnkgPSBhcmd6X25leHQgKGFyZ3osIGFyZ3pfbGVuLCBlbnRyeSkpKQorICAgICAgLi4uOworCisgICBvcgorCisgICAgY2hhciAqZW50cnk7CisgICAgZm9yIChlbnRyeSA9IGFyZ3o7IGVudHJ5OyBlbnRyeSA9IGFyZ3pfbmV4dCAoYXJneiwgYXJnel9sZW4sIGVudHJ5KSkKKyAgICAgIC4uLjsKKyovCitleHRlcm4gY2hhciAqX19hcmd6X25leHQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2FyZ3osIHNpemVfdCBfX2FyZ3pfbGVuLAorCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19lbnRyeSkgX19USFJPVzsKK2V4dGVybiBjaGFyICphcmd6X25leHQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2FyZ3osIHNpemVfdCBfX2FyZ3pfbGVuLAorCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZW50cnkpIF9fVEhST1c7CisKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworX19leHRlcm5faW5saW5lIGNoYXIgKgorX19OVEggKF9fYXJnel9uZXh0IChfX2NvbnN0IGNoYXIgKl9fYXJneiwgc2l6ZV90IF9fYXJnel9sZW4sCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fZW50cnkpKQoreworICBpZiAoX19lbnRyeSkKKyAgICB7CisgICAgICBpZiAoX19lbnRyeSA8IF9fYXJneiArIF9fYXJnel9sZW4pCisJX19lbnRyeSA9IHN0cmNociAoX19lbnRyeSwgJ1wwJykgKyAxOworCisgICAgICByZXR1cm4gX19lbnRyeSA+PSBfX2FyZ3ogKyBfX2FyZ3pfbGVuID8gKGNoYXIgKikgTlVMTCA6IChjaGFyICopIF9fZW50cnk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIF9fYXJnel9sZW4gPiAwID8gKGNoYXIgKikgX19hcmd6IDogMDsKK30KK19fZXh0ZXJuX2lubGluZSBjaGFyICoKK19fTlRIIChhcmd6X25leHQgKF9fY29uc3QgY2hhciAqX19hcmd6LCBzaXplX3QgX19hcmd6X2xlbiwKKwkJICBfX2NvbnN0IGNoYXIgKl9fZW50cnkpKQoreworICByZXR1cm4gX19hcmd6X25leHQgKF9fYXJneiwgX19hcmd6X2xlbiwgX19lbnRyeSk7Cit9CisjZW5kaWYgLyogVXNlIGV4dGVybiBpbmxpbmVzLiAgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGFyZ3ouaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL2Z0cC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL2Z0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YjM0MGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvZnRwLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5ODksIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpZnRwLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfQVJQQV9GVFBfSAorI2RlZmluZQlfQVJQQV9GVFBfSCAxCisKKy8qIERlZmluaXRpb25zIGZvciBGVFA7IHNlZSBSRkMtNzY1LiAqLworCisvKgorICogUmVwbHkgY29kZXMuCisgKi8KKyNkZWZpbmUgUFJFTElNCQkxCS8qIHBvc2l0aXZlIHByZWxpbWluYXJ5ICovCisjZGVmaW5lIENPTVBMRVRFCTIJLyogcG9zaXRpdmUgY29tcGxldGlvbiAqLworI2RlZmluZSBDT05USU5VRQkzCS8qIHBvc2l0aXZlIGludGVybWVkaWF0ZSAqLworI2RlZmluZSBUUkFOU0lFTlQJNAkvKiB0cmFuc2llbnQgbmVnYXRpdmUgY29tcGxldGlvbiAqLworI2RlZmluZSBFUlJPUgkJNQkvKiBwZXJtYW5lbnQgbmVnYXRpdmUgY29tcGxldGlvbiAqLworCisvKgorICogVHlwZSBjb2RlcworICovCisjZGVmaW5lCVRZUEVfQQkJMQkvKiBBU0NJSSAqLworI2RlZmluZQlUWVBFX0UJCTIJLyogRUJDRElDICovCisjZGVmaW5lCVRZUEVfSQkJMwkvKiBpbWFnZSAqLworI2RlZmluZQlUWVBFX0wJCTQJLyogbG9jYWwgYnl0ZSBzaXplICovCisKKyNpZmRlZiBGVFBfTkFNRVMKK2NoYXIgKnR5cGVuYW1lc1tdID0gIHsiMCIsICJBU0NJSSIsICJFQkNESUMiLCAiSW1hZ2UiLCAiTG9jYWwiIH07CisjZW5kaWYKKworLyoKKyAqIEZvcm0gY29kZXMKKyAqLworI2RlZmluZQlGT1JNX04JCTEJLyogbm9uLXByaW50ICovCisjZGVmaW5lCUZPUk1fVAkJMgkvKiB0ZWxuZXQgZm9ybWF0IGVmZmVjdG9ycyAqLworI2RlZmluZQlGT1JNX0MJCTMJLyogY2FycmlhZ2UgY29udHJvbCAoQVNBKSAqLworI2lmZGVmIEZUUF9OQU1FUworY2hhciAqZm9ybW5hbWVzW10gPSAgeyIwIiwgIk5vbnByaW50IiwgIlRlbG5ldCIsICJDYXJyaWFnZS1jb250cm9sIiB9OworI2VuZGlmCisKKy8qCisgKiBTdHJ1Y3R1cmUgY29kZXMKKyAqLworI2RlZmluZQlTVFJVX0YJCTEJLyogZmlsZSAobm8gcmVjb3JkIHN0cnVjdHVyZSkgKi8KKyNkZWZpbmUJU1RSVV9SCQkyCS8qIHJlY29yZCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUJU1RSVV9QCQkzCS8qIHBhZ2Ugc3RydWN0dXJlICovCisjaWZkZWYgRlRQX05BTUVTCitjaGFyICpzdHJ1bmFtZXNbXSA9ICB7IjAiLCAiRmlsZSIsICJSZWNvcmQiLCAiUGFnZSIgfTsKKyNlbmRpZgorCisvKgorICogTW9kZSB0eXBlcworICovCisjZGVmaW5lCU1PREVfUwkJMQkvKiBzdHJlYW0gKi8KKyNkZWZpbmUJTU9ERV9CCQkyCS8qIGJsb2NrICovCisjZGVmaW5lCU1PREVfQwkJMwkvKiBjb21wcmVzc2VkICovCisjaWZkZWYgRlRQX05BTUVTCitjaGFyICptb2RlbmFtZXNbXSA9ICB7IjAiLCAiU3RyZWFtIiwgIkJsb2NrIiwgIkNvbXByZXNzZWQiIH07CisjZW5kaWYKKworLyoKKyAqIFJlY29yZCBUb2tlbnMKKyAqLworI2RlZmluZQlSRUNfRVNDCQknXDM3NycJLyogUmVjb3JkLW1vZGUgRXNjYXBlICovCisjZGVmaW5lCVJFQ19FT1IJCSdcMDAxJwkvKiBSZWNvcmQtbW9kZSBFbmQtb2YtUmVjb3JkICovCisjZGVmaW5lIFJFQ19FT0YJCSdcMDAyJwkvKiBSZWNvcmQtbW9kZSBFbmQtb2YtRmlsZSAqLworCisvKgorICogQmxvY2sgSGVhZGVyCisgKi8KKyNkZWZpbmUJQkxLX0VPUgkJMHg4MAkvKiBCbG9jayBpcyBFbmQtb2YtUmVjb3JkICovCisjZGVmaW5lCUJMS19FT0YJCTB4NDAJLyogQmxvY2sgaXMgRW5kLW9mLUZpbGUgKi8KKyNkZWZpbmUgQkxLX0VSUk9SUwkweDIwCS8qIEJsb2NrIGlzIHN1c3BlY3RlZCBvZiBjb250YWluaW5nIGVycm9ycyAqLworI2RlZmluZQlCTEtfUkVTVEFSVAkweDEwCS8qIEJsb2NrIGlzIFJlc3RhcnQgTWFya2VyICovCisKKyNkZWZpbmUJQkxLX0JZVEVDT1VOVAkyCS8qIEJ5dGVzIGluIHRoaXMgYmxvY2sgKi8KKworI2VuZGlmIC8qIGFycGEvZnRwLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS9pbmV0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvaW5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTE1NGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvaW5ldC5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0FSUEFfSU5FVF9ICisjZGVmaW5lCV9BUlBBX0lORVRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4JCS8qIFRvIGRlZmluZSBgc3RydWN0IGluX2FkZHInLiAgKi8KKworLyogVHlwZSBmb3IgbGVuZ3RoIGFyZ3VtZW50cyBpbiBzb2NrZXQgY2FsbHMuICAqLworI2lmbmRlZiBfX3NvY2tsZW5fdF9kZWZpbmVkCit0eXBlZGVmIF9fc29ja2xlbl90IHNvY2tsZW5fdDsKKyMgZGVmaW5lIF9fc29ja2xlbl90X2RlZmluZWQKKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIENvbnZlcnQgSW50ZXJuZXQgaG9zdCBhZGRyZXNzIGZyb20gbnVtYmVycy1hbmQtZG90cyBub3RhdGlvbiBpbiBDUAorICAgaW50byBiaW5hcnkgZGF0YSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuICAqLworZXh0ZXJuIGluX2FkZHJfdCBpbmV0X2FkZHIgKF9fY29uc3QgY2hhciAqX19jcCkgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBsb2NhbCBob3N0IGFkZHJlc3MgcGFydCBvZiB0aGUgSW50ZXJuZXQgYWRkcmVzcyBpbiBJTi4gICovCitleHRlcm4gaW5fYWRkcl90IGluZXRfbG5hb2YgKHN0cnVjdCBpbl9hZGRyIF9faW4pIF9fVEhST1c7CisKKy8qIE1ha2UgSW50ZXJuZXQgaG9zdCBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciBieSBjb21iaW5pbmcgdGhlCisgICBuZXR3b3JrIG51bWJlciBORVQgd2l0aCB0aGUgbG9jYWwgYWRkcmVzcyBIT1NULiAgKi8KK2V4dGVybiBzdHJ1Y3QgaW5fYWRkciBpbmV0X21ha2VhZGRyIChpbl9hZGRyX3QgX19uZXQsIGluX2FkZHJfdCBfX2hvc3QpCisgICAgIF9fVEhST1c7CisKKy8qIFJldHVybiBuZXR3b3JrIG51bWJlciBwYXJ0IG9mIHRoZSBJbnRlcm5ldCBhZGRyZXNzIElOLiAgKi8KK2V4dGVybiBpbl9hZGRyX3QgaW5ldF9uZXRvZiAoc3RydWN0IGluX2FkZHIgX19pbikgX19USFJPVzsKKworLyogRXh0cmFjdCB0aGUgbmV0d29yayBudW1iZXIgaW4gbmV0d29yayBieXRlIG9yZGVyIGZyb20gdGhlIGFkZHJlc3MKKyAgIGluIG51bWJlcnMtYW5kLWRvdHMgbmF0YXRpb24gc3RhcnRpbmcgYXQgQ1AuICAqLworZXh0ZXJuIGluX2FkZHJfdCBpbmV0X25ldHdvcmsgKF9fY29uc3QgY2hhciAqX19jcCkgX19USFJPVzsKKworLyogQ29udmVydCBJbnRlcm5ldCBudW1iZXIgaW4gSU4gdG8gQVNDSUkgcmVwcmVzZW50YXRpb24uICBUaGUgcmV0dXJuIHZhbHVlCisgICBpcyBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgYXJyYXkgY29udGFpbmluZyB0aGUgc3RyaW5nLiAgKi8KK2V4dGVybiBjaGFyICppbmV0X250b2EgKHN0cnVjdCBpbl9hZGRyIF9faW4pIF9fVEhST1c7CisKKy8qIENvbnZlcnQgZnJvbSBwcmVzZW50YXRpb24gZm9ybWF0IG9mIGFuIEludGVybmV0IG51bWJlciBpbiBidWZmZXIKKyAgIHN0YXJ0aW5nIGF0IENQIHRvIHRoZSBiaW5hcnkgbmV0d29yayBmb3JtYXQgYW5kIHN0b3JlIHJlc3VsdCBmb3IKKyAgIGludGVyZmFjZSB0eXBlIEFGIGluIGJ1ZmZlciBzdGFydGluZyBhdCBCVUYuICAqLworZXh0ZXJuIGludCBpbmV0X3B0b24gKGludCBfX2FmLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19jcCwKKwkJICAgICAgdm9pZCAqX19yZXN0cmljdCBfX2J1ZikgX19USFJPVzsKKworLyogQ29udmVydCBhIEludGVybmV0IGFkZHJlc3MgaW4gYmluYXJ5IG5ldHdvcmsgZm9ybWF0IGZvciBpbnRlcmZhY2UKKyAgIHR5cGUgQUYgaW4gYnVmZmVyIHN0YXJ0aW5nIGF0IENQIHRvIHByZXNlbnRhdGlvbiBmb3JtIGFuZCBwbGFjZQorICAgcmVzdWx0IGluIGJ1ZmZlciBvZiBsZW5ndGggTEVOIGFzdGFydGluZyBhdCBCVUYuICAqLworZXh0ZXJuIF9fY29uc3QgY2hhciAqaW5ldF9udG9wIChpbnQgX19hZiwgX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fY3AsCisJCQkJY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc29ja2xlbl90IF9fbGVuKQorICAgICBfX1RIUk9XOworCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiBYTlMgNS4yLiAgKi8KKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBDb252ZXJ0IEludGVybmV0IGhvc3QgYWRkcmVzcyBmcm9tIG51bWJlcnMtYW5kLWRvdHMgbm90YXRpb24gaW4gQ1AKKyAgIGludG8gYmluYXJ5IGRhdGEgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlIHN0cnVjdHVyZSBJTlAuICAqLworZXh0ZXJuIGludCBpbmV0X2F0b24gKF9fY29uc3QgY2hhciAqX19jcCwgc3RydWN0IGluX2FkZHIgKl9faW5wKSBfX1RIUk9XOworCisvKiBGb3JtYXQgYSBuZXR3b3JrIG51bWJlciBORVQgaW50byBwcmVzZW50YXRpb24gZm9ybWF0IGFuZCBwbGFjZSByZXN1bHQKKyAgIGluIGJ1ZmZlciBzdGFydGluZyBhdCBCVUYgd2l0aCBsZW5ndGggb2YgTEVOIGJ5dGVzLiAgKi8KK2V4dGVybiBjaGFyICppbmV0X25ldGEgKGluX2FkZHJfdCBfX25ldCwgY2hhciAqX19idWYsIHNpemVfdCBfX2xlbikgX19USFJPVzsKKworLyogQ29udmVydCBuZXR3b3JrIG51bWJlciBmb3IgaW50ZXJmYWNlIHR5cGUgQUYgaW4gYnVmZmVyIHN0YXJ0aW5nIGF0CisgICBDUCB0byBwcmVzZW50YXRpb24gZm9ybWF0LiAgVGhlIHJlc3VsdCB3aWxsIHNwZWNpZml5IEJJVFMgYml0cyBvZgorICAgdGhlIG51bWJlci4gICovCitleHRlcm4gY2hhciAqaW5ldF9uZXRfbnRvcCAoaW50IF9fYWYsIF9fY29uc3Qgdm9pZCAqX19jcCwgaW50IF9fYml0cywKKwkJCSAgICBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fbGVuKSBfX1RIUk9XOworCisvKiBDb252ZXJ0IG5ldHdvcmsgbnVtYmVyIGZvciBpbnRlcmZhY2UgdHlwZSBBRiBmcm9tIHByZXNlbnRhdGlvbiBpbgorICAgYnVmZmVyIHN0YXJ0aW5nIGF0IENQIHRvIG5ldHdvcmsgZm9ybWF0IGFuZCBzdG9yZSByZXN1bHQgaW50CisgICBidWZmZXIgc3RhcnRpbmcgYXQgQlVGIG9mIHNpemUgTEVOLiAgKi8KK2V4dGVybiBpbnQgaW5ldF9uZXRfcHRvbiAoaW50IF9fYWYsIF9fY29uc3QgY2hhciAqX19jcCwKKwkJCSAgdm9pZCAqX19idWYsIHNpemVfdCBfX2xlbikgX19USFJPVzsKKworLyogQ29udmVydCBBU0NJSSByZXByZXNlbnRhdGlvbiBpbiBoZXhhZGVjaW1hbCBmb3JtIG9mIHRoZSBJbnRlcm5ldAorICAgYWRkcmVzcyB0byBiaW5hcnkgZm9ybSBhbmQgcGxhY2UgcmVzdWx0IGluIGJ1ZmZlciBvZiBsZW5ndGggTEVOCisgICBzdGFydGluZyBhdCBCVUYuICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBpbmV0X25zYXBfYWRkciAoX19jb25zdCBjaGFyICpfX2NwLAorCQkJCSAgICB1bnNpZ25lZCBjaGFyICpfX2J1ZiwgaW50IF9fbGVuKSBfX1RIUk9XOworCisvKiBDb252ZXJ0IGludGVybmV0IGFkZHJlc3MgaW4gYmluYXJ5IGZvcm0gaW4gTEVOIGJ5dGVzIHN0YXJ0aW5nIGF0IENQCisgICBhIHByZXNlbnRhdGlvbiBmb3JtIGFuZCBwbGFjZSByZXN1bHQgaW4gQlVGLiAgKi8KK2V4dGVybiBjaGFyICppbmV0X25zYXBfbnRvYSAoaW50IF9fbGVuLCBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKl9fY3AsCisJCQkgICAgIGNoYXIgKl9fYnVmKSBfX1RIUk9XOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBhcnBhL2luZXQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL25hbWVzZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS9uYW1lc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyYzgzNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS9uYW1lc2VyLmgKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5ODksIDE5OTMKKyAqICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAoIklTQyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OSBieSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVtLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSU5URVJORVQgU09GVFdBUkUgQ09OU09SVElVTSBESVNDTEFJTVMKKyAqIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgSU5URVJORVQgU09GVFdBUkUKKyAqIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUworICogQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCisgKiBTT0ZUV0FSRS4KKyAqLworCisvKgorICoJJEJJTkRJZDogbmFtZXNlci5oLHYgOC4zNyAyMDAwLzAzLzMwIDIxOjE2OjQ5IHZpeGllIEV4cCAkCisgKi8KKworI2lmbmRlZiBfQVJQQV9OQU1FU0VSX0hfCisjZGVmaW5lIF9BUlBBX05BTUVTRVJfSF8KKworLyohIFxmaWxlICovCisKKyNkZWZpbmUgQklORF80X0NPTVBBVAorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaWYgKCFkZWZpbmVkKEJTRCkpIHx8IChCU0QgPCAxOTkzMDYpCisjIGluY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisvKiUKKyAqIFJldmlzaW9uIGluZm9ybWF0aW9uLiAgVGhpcyBpcyB0aGUgcmVsZWFzZSBkYXRlIGluIFlZWVlNTUREIGZvcm1hdC4KKyAqIEl0IGNhbiBjaGFuZ2UgZXZlcnkgZGF5IHNvIHRoZSByaWdodCB0aGluZyB0byBkbyB3aXRoIGl0IGlzIHVzZSBpdAorICogaW4gcHJlcHJvY2Vzc29yIGNvbW1hbmRzIHN1Y2ggYXMgIiNpZiAoX19OQU1FU0VSID4gMTk5MzExMDQpIi4gIERvIG5vdAorICogY29tcGFyZSBmb3IgZXF1YWxpdHk7IHJhdGhlciwgdXNlIGl0IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdXIgbGliYmluZC5hCisgKiBjb250YWlucyBhIG5ldyBlbm91Z2ggbGliL25hbWVzZXIvIHRvIHN1cHBvcnQgdGhlIGZlYXR1cmUgeW91IG5lZWQuCisgKi8KKworI2RlZmluZSBfX05BTUVTRVIJMTk5OTEwMDYJLyolPCBOZXcgaW50ZXJmYWNlIHZlcnNpb24gc3RhbXAuICovCisvKgorICogRGVmaW5lIGNvbnN0YW50cyBiYXNlZCBvbiBSRkMgODgzLCBSRkMgMTAzNCwgUkZDIDEwMzUKKyAqLworI2RlZmluZSBOU19QQUNLRVRTWgk1MTIJLyolPCBkZWZhdWx0IFVEUCBwYWNrZXQgc2l6ZSAqLworI2RlZmluZSBOU19NQVhETkFNRQkxMDI1CS8qJTwgbWF4aW11bSBkb21haW4gbmFtZSAqLworI2RlZmluZSBOU19NQVhNU0cJNjU1MzUJLyolPCBtYXhpbXVtIG1lc3NhZ2Ugc2l6ZSAqLworI2RlZmluZSBOU19NQVhDRE5BTUUJMjU1CS8qJTwgbWF4aW11bSBjb21wcmVzc2VkIGRvbWFpbiBuYW1lICovCisjZGVmaW5lIE5TX01BWExBQkVMCTYzCS8qJTwgbWF4aW11bSBsZW5ndGggb2YgZG9tYWluIGxhYmVsICovCisjZGVmaW5lIE5TX0hGSVhFRFNaCTEyCS8qJTwgIy9ieXRlcyBvZiBmaXhlZCBkYXRhIGluIGhlYWRlciAqLworI2RlZmluZSBOU19RRklYRURTWgk0CS8qJTwgIy9ieXRlcyBvZiBmaXhlZCBkYXRhIGluIHF1ZXJ5ICovCisjZGVmaW5lIE5TX1JSRklYRURTWgkxMAkvKiU8ICMvYnl0ZXMgb2YgZml4ZWQgZGF0YSBpbiByIHJlY29yZCAqLworI2RlZmluZSBOU19JTlQzMlNaCTQJLyolPCAjL2J5dGVzIG9mIGRhdGEgaW4gYSB1X2ludDMyX3QgKi8KKyNkZWZpbmUgTlNfSU5UMTZTWgkyCS8qJTwgIy9ieXRlcyBvZiBkYXRhIGluIGEgdV9pbnQxNl90ICovCisjZGVmaW5lIE5TX0lOVDhTWgkxCS8qJTwgIy9ieXRlcyBvZiBkYXRhIGluIGEgdV9pbnQ4X3QgKi8KKyNkZWZpbmUgTlNfSU5BRERSU1oJNAkvKiU8IElQdjQgVF9BICovCisjZGVmaW5lIE5TX0lONkFERFJTWgkxNgkvKiU8IElQdjYgVF9BQUFBICovCisjZGVmaW5lIE5TX0NNUFJTRkxHUwkweGMwCS8qJTwgRmxhZyBiaXRzIGluZGljYXRpbmcgbmFtZSBjb21wcmVzc2lvbi4gKi8KKyNkZWZpbmUgTlNfREVGQVVMVFBPUlQJNTMJLyolPCBGb3IgYm90aCBUQ1AgYW5kIFVEUC4gKi8KKy8qCisgKiBUaGVzZSBjYW4gYmUgZXhwYW5kZWQgd2l0aCBzeW5vbnltcywganVzdCBrZWVwIG5zX3BhcnNlLmM6bnNfcGFyc2VyZWNvcmQoKQorICogaW4gc3luY2ggd2l0aCBpdC4KKyAqLwordHlwZWRlZiBlbnVtIF9fbnNfc2VjdCB7CisJbnNfc19xZCA9IDAsCQkvKiU8IFF1ZXJ5OiBRdWVzdGlvbi4gKi8KKwluc19zX3puID0gMCwJCS8qJTwgVXBkYXRlOiBab25lLiAqLworCW5zX3NfYW4gPSAxLAkJLyolPCBRdWVyeTogQW5zd2VyLiAqLworCW5zX3NfcHIgPSAxLAkJLyolPCBVcGRhdGU6IFByZXJlcXVpc2l0ZXMuICovCisJbnNfc19ucyA9IDIsCQkvKiU8IFF1ZXJ5OiBOYW1lIHNlcnZlcnMuICovCisJbnNfc191ZCA9IDIsCQkvKiU8IFVwZGF0ZTogVXBkYXRlLiAqLworCW5zX3NfYXIgPSAzLAkJLyolPCBRdWVyeXxVcGRhdGU6IEFkZGl0aW9uYWwgcmVjb3Jkcy4gKi8KKwluc19zX21heCA9IDQKK30gbnNfc2VjdDsKKworLyolCisgKiBUaGlzIGlzIGEgbWVzc2FnZSBoYW5kbGUuICBJdCBpcyBjYWxsZXIgYWxsb2NhdGVkIGFuZCBoYXMgbm8gZHluYW1pYyBkYXRhLgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgaW50ZW5kZWQgdG8gYmUgb3BhcXVlIHRvIGFsbCBidXQgbnNfcGFyc2UuYywgdGh1cyB0aGUKKyAqIGxlYWRpbmcgXydzIG9uIHRoZSBtZW1iZXIgbmFtZXMuICBVc2UgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucywgbm90IHRoZSBfJ3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9fbnNfbXNnIHsKKwljb25zdCB1X2NoYXIJKl9tc2csICpfZW9tOworCXVfaW50MTZfdAlfaWQsIF9mbGFncywgX2NvdW50c1tuc19zX21heF07CisJY29uc3QgdV9jaGFyCSpfc2VjdGlvbnNbbnNfc19tYXhdOworCW5zX3NlY3QJCV9zZWN0OworCWludAkJX3JybnVtOworCWNvbnN0IHVfY2hhcgkqX21zZ19wdHI7Cit9IG5zX21zZzsKKworLyogUHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAtIGRvIG5vdCB1c2UgZnJvbSBvdXRzaWRlIGxpYnJhcnkuICovCitzdHJ1Y3QgX25zX2ZsYWdkYXRhIHsgIGludCBtYXNrLCBzaGlmdDsgIH07CitleHRlcm4gY29uc3Qgc3RydWN0IF9uc19mbGFnZGF0YSBfbnNfZmxhZ2RhdGFbXTsKKworLyogQWNjZXNzb3IgbWFjcm9zIC0gdGhpcyBpcyBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLiAqLworCisjZGVmaW5lIG5zX21zZ19pZChoYW5kbGUpICgoaGFuZGxlKS5faWQgKyAwKQorI2RlZmluZSBuc19tc2dfYmFzZShoYW5kbGUpICgoaGFuZGxlKS5fbXNnICsgMCkKKyNkZWZpbmUgbnNfbXNnX2VuZChoYW5kbGUpICgoaGFuZGxlKS5fZW9tICsgMCkKKyNkZWZpbmUgbnNfbXNnX3NpemUoaGFuZGxlKSAoKGhhbmRsZSkuX2VvbSAtIChoYW5kbGUpLl9tc2cpCisjZGVmaW5lIG5zX21zZ19jb3VudChoYW5kbGUsIHNlY3Rpb24pICgoaGFuZGxlKS5fY291bnRzW3NlY3Rpb25dICsgMCkKKworLyolCisgKiBUaGlzIGlzIGEgcGFyc2VkIHJlY29yZC4gIEl0IGlzIGNhbGxlciBhbGxvY2F0ZWQgYW5kIGhhcyBubyBkeW5hbWljIGRhdGEuCisgKi8KK3R5cGVkZWYJc3RydWN0IF9fbnNfcnIgeworCWNoYXIJCW5hbWVbTlNfTUFYRE5BTUVdOworCXVfaW50MTZfdAl0eXBlOworCXVfaW50MTZfdAlycl9jbGFzczsKKwl1X2ludDMyX3QJdHRsOworCXVfaW50MTZfdAlyZGxlbmd0aDsKKwljb25zdCB1X2NoYXIgKglyZGF0YTsKK30gbnNfcnI7CisKKy8qIEFjY2Vzc29yIG1hY3JvcyAtIHRoaXMgaXMgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgbnNfcnJfbmFtZShycikJKCgocnIpLm5hbWVbMF0gIT0gJ1wwJykgPyAocnIpLm5hbWUgOiAiLiIpCisjZGVmaW5lIG5zX3JyX3R5cGUocnIpCSgobnNfdHlwZSkoKHJyKS50eXBlICsgMCkpCisjZGVmaW5lIG5zX3JyX2NsYXNzKHJyKQkoKG5zX2NsYXNzKSgocnIpLnJyX2NsYXNzICsgMCkpCisjZGVmaW5lIG5zX3JyX3R0bChycikJKChycikudHRsICsgMCkKKyNkZWZpbmUgbnNfcnJfcmRsZW4ocnIpCSgocnIpLnJkbGVuZ3RoICsgMCkKKyNkZWZpbmUgbnNfcnJfcmRhdGEocnIpCSgocnIpLnJkYXRhICsgMCkKKworLyolCisgKiBUaGVzZSBkb24ndCBoYXZlIHRvIGJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIGluIHRoZSBwYWNrZXQgZmxhZ3Mgd29yZCwKKyAqIGFuZCB0aGV5IGNhbiBldmVuIG92ZXJsYXAgaW4gc29tZSBjYXNlcywgYnV0IHRoZXkgd2lsbCBuZWVkIHRvIGJlIGtlcHQKKyAqIGluIHN5bmNoIHdpdGggbnNfcGFyc2UuYzpuc19mbGFnZGF0YVtdLgorICovCit0eXBlZGVmIGVudW0gX19uc19mbGFnIHsKKwluc19mX3FyLAkJLyolPCBRdWVzdGlvbi9SZXNwb25zZS4gKi8KKwluc19mX29wY29kZSwJCS8qJTwgT3BlcmF0aW9uIGNvZGUuICovCisJbnNfZl9hYSwJCS8qJTwgQXV0aG9yaXRhdGl2ZSBBbnN3ZXIuICovCisJbnNfZl90YywJCS8qJTwgVHJ1bmNhdGlvbiBvY2N1cnJlZC4gKi8KKwluc19mX3JkLAkJLyolPCBSZWN1cnNpb24gRGVzaXJlZC4gKi8KKwluc19mX3JhLAkJLyolPCBSZWN1cnNpb24gQXZhaWxhYmxlLiAqLworCW5zX2ZfeiwJCQkvKiU8IE1CWi4gKi8KKwluc19mX2FkLAkJLyolPCBBdXRoZW50aWMgRGF0YSAoRE5TU0VDKS4gKi8KKwluc19mX2NkLAkJLyolPCBDaGVja2luZyBEaXNhYmxlZCAoRE5TU0VDKS4gKi8KKwluc19mX3Jjb2RlLAkJLyolPCBSZXNwb25zZSBjb2RlLiAqLworCW5zX2ZfbWF4Cit9IG5zX2ZsYWc7CisKKy8qJQorICogQ3VycmVudGx5IGRlZmluZWQgb3Bjb2Rlcy4KKyAqLwordHlwZWRlZiBlbnVtIF9fbnNfb3Bjb2RlIHsKKwluc19vX3F1ZXJ5ID0gMCwJCS8qJTwgU3RhbmRhcmQgcXVlcnkuICovCisJbnNfb19pcXVlcnkgPSAxLAkvKiU8IEludmVyc2UgcXVlcnkgKGRlcHJlY2F0ZWQvdW5zdXBwb3J0ZWQpLiAqLworCW5zX29fc3RhdHVzID0gMiwJLyolPCBOYW1lIHNlcnZlciBzdGF0dXMgcXVlcnkgKHVuc3VwcG9ydGVkKS4gKi8KKwkJCQkvKiBPcGNvZGUgMyBpcyB1bmRlZmluZWQvcmVzZXJ2ZWQuICovCisJbnNfb19ub3RpZnkgPSA0LAkvKiU8IFpvbmUgY2hhbmdlIG5vdGlmaWNhdGlvbi4gKi8KKwluc19vX3VwZGF0ZSA9IDUsCS8qJTwgWm9uZSB1cGRhdGUgbWVzc2FnZS4gKi8KKwluc19vX21heCA9IDYKK30gbnNfb3Bjb2RlOworCisvKiUKKyAqIEN1cnJlbnRseSBkZWZpbmVkIHJlc3BvbnNlIGNvZGVzLgorICovCit0eXBlZGVmCWVudW0gX19uc19yY29kZSB7CisJbnNfcl9ub2Vycm9yID0gMCwJLyolPCBObyBlcnJvciBvY2N1cnJlZC4gKi8KKwluc19yX2Zvcm1lcnIgPSAxLAkvKiU8IEZvcm1hdCBlcnJvci4gKi8KKwluc19yX3NlcnZmYWlsID0gMiwJLyolPCBTZXJ2ZXIgZmFpbHVyZS4gKi8KKwluc19yX254ZG9tYWluID0gMywJLyolPCBOYW1lIGVycm9yLiAqLworCW5zX3Jfbm90aW1wbCA9IDQsCS8qJTwgVW5pbXBsZW1lbnRlZC4gKi8KKwluc19yX3JlZnVzZWQgPSA1LAkvKiU8IE9wZXJhdGlvbiByZWZ1c2VkLiAqLworCS8qIHRoZXNlIGFyZSBmb3IgQklORF9VUERBVEUgKi8KKwluc19yX3l4ZG9tYWluID0gNiwJLyolPCBOYW1lIGV4aXN0cyAqLworCW5zX3JfeXhycnNldCA9IDcsCS8qJTwgUlJzZXQgZXhpc3RzICovCisJbnNfcl9ueHJyc2V0ID0gOCwJLyolPCBSUnNldCBkb2VzIG5vdCBleGlzdCAqLworCW5zX3Jfbm90YXV0aCA9IDksCS8qJTwgTm90IGF1dGhvcml0YXRpdmUgZm9yIHpvbmUgKi8KKwluc19yX25vdHpvbmUgPSAxMCwJLyolPCBab25lIG9mIHJlY29yZCBkaWZmZXJlbnQgZnJvbSB6b25lIHNlY3Rpb24gKi8KKwluc19yX21heCA9IDExLAorCS8qIFRoZSBmb2xsb3dpbmcgYXJlIEVETlMgZXh0ZW5kZWQgcmNvZGVzICovCisJbnNfcl9iYWR2ZXJzID0gMTYsCisJLyogVGhlIGZvbGxvd2luZyBhcmUgVFNJRyBlcnJvcnMgKi8KKwluc19yX2JhZHNpZyA9IDE2LAorCW5zX3JfYmFka2V5ID0gMTcsCisJbnNfcl9iYWR0aW1lID0gMTgKK30gbnNfcmNvZGU7CisKKy8qIEJJTkRfVVBEQVRFICovCit0eXBlZGVmIGVudW0gX19uc191cGRhdGVfb3BlcmF0aW9uIHsKKwluc191b3BfZGVsZXRlID0gMCwKKwluc191b3BfYWRkID0gMSwKKwluc191b3BfbWF4ID0gMgorfSBuc191cGRhdGVfb3BlcmF0aW9uOworCisvKiUKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIFRTSUcgYXV0aGVudGljYXRlZCBtZXNzYWdlcworICovCitzdHJ1Y3QgbnNfdHNpZ19rZXkgeworICAgICAgICBjaGFyIG5hbWVbTlNfTUFYRE5BTUVdLCBhbGdbTlNfTUFYRE5BTUVdOworICAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgICAgICBpbnQgbGVuOworfTsKK3R5cGVkZWYgc3RydWN0IG5zX3RzaWdfa2V5IG5zX3RzaWdfa2V5OworCisvKiUKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIFRTSUcgYXV0aGVudGljYXRlZCBUQ1AgbWVzc2FnZXMKKyAqLworc3RydWN0IG5zX3RjcF90c2lnX3N0YXRlIHsKKwlpbnQgY291bnRlcjsKKwlzdHJ1Y3QgZHN0X2tleSAqa2V5OworCXZvaWQgKmN0eDsKKwl1bnNpZ25lZCBjaGFyIHNpZ1tOU19QQUNLRVRTWl07CisJaW50IHNpZ2xlbjsKK307Cit0eXBlZGVmIHN0cnVjdCBuc190Y3BfdHNpZ19zdGF0ZSBuc190Y3BfdHNpZ19zdGF0ZTsKKworI2RlZmluZSBOU19UU0lHX0ZVREdFIDMwMAorI2RlZmluZSBOU19UU0lHX1RDUF9DT1VOVCAxMDAKKyNkZWZpbmUgTlNfVFNJR19BTEdfSE1BQ19NRDUgIkhNQUMtTUQ1LlNJRy1BTEcuUkVHLklOVCIKKworI2RlZmluZSBOU19UU0lHX0VSUk9SX05PX1RTSUcgLTEwCisjZGVmaW5lIE5TX1RTSUdfRVJST1JfTk9fU1BBQ0UgLTExCisjZGVmaW5lIE5TX1RTSUdfRVJST1JfRk9STUVSUiAtMTIKKworLyolCisgKiBDdXJyZW50bHkgZGVmaW5lZCB0eXBlIHZhbHVlcyBmb3IgcmVzb3VyY2VzIGFuZCBxdWVyaWVzLgorICovCit0eXBlZGVmIGVudW0gX19uc190eXBlIHsKKwluc190X2ludmFsaWQgPSAwLAkvKiU8IENvb2tpZS4gKi8KKwluc190X2EgPSAxLAkJLyolPCBIb3N0IGFkZHJlc3MuICovCisJbnNfdF9ucyA9IDIsCQkvKiU8IEF1dGhvcml0YXRpdmUgc2VydmVyLiAqLworCW5zX3RfbWQgPSAzLAkJLyolPCBNYWlsIGRlc3RpbmF0aW9uLiAqLworCW5zX3RfbWYgPSA0LAkJLyolPCBNYWlsIGZvcndhcmRlci4gKi8KKwluc190X2NuYW1lID0gNSwJCS8qJTwgQ2Fub25pY2FsIG5hbWUuICovCisJbnNfdF9zb2EgPSA2LAkJLyolPCBTdGFydCBvZiBhdXRob3JpdHkgem9uZS4gKi8KKwluc190X21iID0gNywJCS8qJTwgTWFpbGJveCBkb21haW4gbmFtZS4gKi8KKwluc190X21nID0gOCwJCS8qJTwgTWFpbCBncm91cCBtZW1iZXIuICovCisJbnNfdF9tciA9IDksCQkvKiU8IE1haWwgcmVuYW1lIG5hbWUuICovCisJbnNfdF9udWxsID0gMTAsCQkvKiU8IE51bGwgcmVzb3VyY2UgcmVjb3JkLiAqLworCW5zX3Rfd2tzID0gMTEsCQkvKiU8IFdlbGwga25vd24gc2VydmljZS4gKi8KKwluc190X3B0ciA9IDEyLAkJLyolPCBEb21haW4gbmFtZSBwb2ludGVyLiAqLworCW5zX3RfaGluZm8gPSAxMywJLyolPCBIb3N0IGluZm9ybWF0aW9uLiAqLworCW5zX3RfbWluZm8gPSAxNCwJLyolPCBNYWlsYm94IGluZm9ybWF0aW9uLiAqLworCW5zX3RfbXggPSAxNSwJCS8qJTwgTWFpbCByb3V0aW5nIGluZm9ybWF0aW9uLiAqLworCW5zX3RfdHh0ID0gMTYsCQkvKiU8IFRleHQgc3RyaW5ncy4gKi8KKwluc190X3JwID0gMTcsCQkvKiU8IFJlc3BvbnNpYmxlIHBlcnNvbi4gKi8KKwluc190X2Fmc2RiID0gMTgsCS8qJTwgQUZTIGNlbGwgZGF0YWJhc2UuICovCisJbnNfdF94MjUgPSAxOSwJCS8qJTwgWF8yNSBjYWxsaW5nIGFkZHJlc3MuICovCisJbnNfdF9pc2RuID0gMjAsCQkvKiU8IElTRE4gY2FsbGluZyBhZGRyZXNzLiAqLworCW5zX3RfcnQgPSAyMSwJCS8qJTwgUm91dGVyLiAqLworCW5zX3RfbnNhcCA9IDIyLAkJLyolPCBOU0FQIGFkZHJlc3MuICovCisJbnNfdF9uc2FwX3B0ciA9IDIzLAkvKiU8IFJldmVyc2UgTlNBUCBsb29rdXAgKGRlcHJlY2F0ZWQpLiAqLworCW5zX3Rfc2lnID0gMjQsCQkvKiU8IFNlY3VyaXR5IHNpZ25hdHVyZS4gKi8KKwluc190X2tleSA9IDI1LAkJLyolPCBTZWN1cml0eSBrZXkuICovCisJbnNfdF9weCA9IDI2LAkJLyolPCBYLjQwMCBtYWlsIG1hcHBpbmcuICovCisJbnNfdF9ncG9zID0gMjcsCQkvKiU8IEdlb2dyYXBoaWNhbCBwb3NpdGlvbiAod2l0aGRyYXduKS4gKi8KKwluc190X2FhYWEgPSAyOCwJCS8qJTwgSXA2IEFkZHJlc3MuICovCisJbnNfdF9sb2MgPSAyOSwJCS8qJTwgTG9jYXRpb24gSW5mb3JtYXRpb24uICovCisJbnNfdF9ueHQgPSAzMCwJCS8qJTwgTmV4dCBkb21haW4gKHNlY3VyaXR5KS4gKi8KKwluc190X2VpZCA9IDMxLAkJLyolPCBFbmRwb2ludCBpZGVudGlmaWVyLiAqLworCW5zX3RfbmltbG9jID0gMzIsCS8qJTwgTmltcm9kIExvY2F0b3IuICovCisJbnNfdF9zcnYgPSAzMywJCS8qJTwgU2VydmVyIFNlbGVjdGlvbi4gKi8KKwluc190X2F0bWEgPSAzNCwJCS8qJTwgQVRNIEFkZHJlc3MgKi8KKwluc190X25hcHRyID0gMzUsCS8qJTwgTmFtaW5nIEF1dGhvcml0eSBQb2luVGVSICovCisJbnNfdF9reCA9IDM2LAkJLyolPCBLZXkgRXhjaGFuZ2UgKi8KKwluc190X2NlcnQgPSAzNywJCS8qJTwgQ2VydGlmaWNhdGlvbiByZWNvcmQgKi8KKwluc190X2E2ID0gMzgsCQkvKiU8IElQdjYgYWRkcmVzcyAoZGVwcmVjYXRlZCwgdXNlIG5zX3RfYWFhYSkgKi8KKwluc190X2RuYW1lID0gMzksCS8qJTwgTm9uLXRlcm1pbmFsIEROQU1FIChmb3IgSVB2NikgKi8KKwluc190X3NpbmsgPSA0MCwJCS8qJTwgS2l0Y2hlbiBzaW5rIChleHBlcmltZW50YXRsKSAqLworCW5zX3Rfb3B0ID0gNDEsCQkvKiU8IEVETlMwIG9wdGlvbiAobWV0YS1SUikgKi8KKwluc190X2FwbCA9IDQyLAkJLyolPCBBZGRyZXNzIHByZWZpeCBsaXN0IChSRkMzMTIzKSAqLworCW5zX3RfdGtleSA9IDI0OSwJLyolPCBUcmFuc2FjdGlvbiBrZXkgKi8KKwluc190X3RzaWcgPSAyNTAsCS8qJTwgVHJhbnNhY3Rpb24gc2lnbmF0dXJlLiAqLworCW5zX3RfaXhmciA9IDI1MSwJLyolPCBJbmNyZW1lbnRhbCB6b25lIHRyYW5zZmVyLiAqLworCW5zX3RfYXhmciA9IDI1MiwJLyolPCBUcmFuc2ZlciB6b25lIG9mIGF1dGhvcml0eS4gKi8KKwluc190X21haWxiID0gMjUzLAkvKiU8IFRyYW5zZmVyIG1haWxib3ggcmVjb3Jkcy4gKi8KKwluc190X21haWxhID0gMjU0LAkvKiU8IFRyYW5zZmVyIG1haWwgYWdlbnQgcmVjb3Jkcy4gKi8KKwluc190X2FueSA9IDI1NSwJCS8qJTwgV2lsZGNhcmQgbWF0Y2guICovCisJbnNfdF96eGZyID0gMjU2LAkvKiU8IEJJTkQtc3BlY2lmaWMsIG5vbnN0YW5kYXJkLiAqLworCW5zX3RfbWF4ID0gNjU1MzYKK30gbnNfdHlwZTsKKworLyogRXhjbHVzaXZlbHkgYSBRVFlQRT8gKG5vdCBhbHNvIGFuIFJUWVBFKSAqLworI2RlZmluZQluc190X3F0X3AodCkgKG5zX3RfeGZyX3AodCkgfHwgKHQpID09IG5zX3RfYW55IHx8IFwKKwkJICAgICAgKHQpID09IG5zX3RfbWFpbGIgfHwgKHQpID09IG5zX3RfbWFpbGEpCisvKiBTb21lIGtpbmQgb2YgbWV0YS1SUj8gKG5vdCBhIFFUWVBFLCBidXQgYWxzbyBub3QgYW4gUlRZUEUpICovCisjZGVmaW5lCW5zX3RfbXJyX3AodCkgKCh0KSA9PSBuc190X3RzaWcgfHwgKHQpID09IG5zX3Rfb3B0KQorLyogRXhjbHVzaXZlbHkgYW4gUlRZUEU/IChub3QgYWxzbyBhIFFUWVBFIG9yIGEgbWV0YS1SUikgKi8KKyNkZWZpbmUgbnNfdF9ycl9wKHQpICghbnNfdF9xdF9wKHQpICYmICFuc190X21ycl9wKHQpKQorI2RlZmluZSBuc190X3VkcF9wKHQpICgodCkgIT0gbnNfdF9heGZyICYmICh0KSAhPSBuc190X3p4ZnIpCisjZGVmaW5lIG5zX3RfeGZyX3AodCkgKCh0KSA9PSBuc190X2F4ZnIgfHwgKHQpID09IG5zX3RfaXhmciB8fCBcCisJCSAgICAgICAodCkgPT0gbnNfdF96eGZyKQorCisvKiUKKyAqIFZhbHVlcyBmb3IgY2xhc3MgZmllbGQKKyAqLwordHlwZWRlZiBlbnVtIF9fbnNfY2xhc3MgeworCW5zX2NfaW52YWxpZCA9IDAsCS8qJTwgQ29va2llLiAqLworCW5zX2NfaW4gPSAxLAkJLyolPCBJbnRlcm5ldC4gKi8KKwluc19jXzIgPSAyLAkJLyolPCB1bmFsbG9jYXRlZC91bnN1cHBvcnRlZC4gKi8KKwluc19jX2NoYW9zID0gMywJCS8qJTwgTUlUIENoYW9zLW5ldC4gKi8KKwluc19jX2hzID0gNCwJCS8qJTwgTUlUIEhlc2lvZC4gKi8KKwkvKiBRdWVyeSBjbGFzcyB2YWx1ZXMgd2hpY2ggZG8gbm90IGFwcGVhciBpbiByZXNvdXJjZSByZWNvcmRzICovCisJbnNfY19ub25lID0gMjU0LAkvKiU8IGZvciBwcmVyZXEuIHNlY3Rpb25zIGluIHVwZGF0ZSByZXF1ZXN0cyAqLworCW5zX2NfYW55ID0gMjU1LAkJLyolPCBXaWxkY2FyZCBtYXRjaC4gKi8KKwluc19jX21heCA9IDY1NTM2Cit9IG5zX2NsYXNzOworCisvKiBETlNTRUMgY29uc3RhbnRzLiAqLworCit0eXBlZGVmIGVudW0gX19uc19rZXlfdHlwZXMgeworCW5zX2t0X3JzYSA9IDEsCQkvKiU8IGtleSB0eXBlIFJTQS9NRDUgKi8KKwluc19rdF9kaCAgPSAyLAkJLyolPCBEaWZmaWUgSGVsbG1hbiAqLworCW5zX2t0X2RzYSA9IDMsCQkvKiU8IERpZ2l0YWwgU2lnbmF0dXJlIFN0YW5kYXJkIChNQU5EQVRPUlkpICovCisJbnNfa3RfcHJpdmF0ZSA9IDI1NAkvKiU8IFByaXZhdGUga2V5IHR5cGUgc3RhcnRzIHdpdGggT0lEICovCit9IG5zX2tleV90eXBlczsKKwordHlwZWRlZiBlbnVtIF9fbnNfY2VydF90eXBlcyB7CisJY2VydF90X3BraXggPSAxLAkvKiU8IFBLSVggKFguNTA5djMpICovCisJY2VydF90X3Nwa2kgPSAyLAkvKiU8IFNQS0kgKi8KKwljZXJ0X3RfcGdwICA9IDMsCS8qJTwgUEdQICovCisJY2VydF90X3VybCAgPSAyNTMsCS8qJTwgVVJMIHByaXZhdGUgdHlwZSAqLworCWNlcnRfdF9vaWQgID0gMjU0CS8qJTwgT0lEIHByaXZhdGUgdHlwZSAqLworfSBuc19jZXJ0X3R5cGVzOworCisvKiBGbGFncyBmaWVsZCBvZiB0aGUgS0VZIFJSIHJkYXRhLiAqLworI2RlZmluZQlOU19LRVlfVFlQRU1BU0sJCTB4QzAwMAkvKiU8IE1hc2sgZm9yICJ0eXBlIiBiaXRzICovCisjZGVmaW5lCU5TX0tFWV9UWVBFX0FVVEhfQ09ORgkweDAwMDAJLyolPCBLZXkgdXNhYmxlIGZvciBib3RoICovCisjZGVmaW5lCU5TX0tFWV9UWVBFX0NPTkZfT05MWQkweDgwMDAJLyolPCBLZXkgdXNhYmxlIGZvciBjb25maWRlbnRpYWxpdHkgKi8KKyNkZWZpbmUJTlNfS0VZX1RZUEVfQVVUSF9PTkxZCTB4NDAwMAkvKiU8IEtleSB1c2FibGUgZm9yIGF1dGhlbnRpY2F0aW9uICovCisjZGVmaW5lCU5TX0tFWV9UWVBFX05PX0tFWQkweEMwMDAJLyolPCBObyBrZXkgdXNhYmxlIGZvciBlaXRoZXI7IG5vIGtleSAqLworLyogVGhlIHR5cGUgYml0cyBjYW4gYWxzbyBiZSBpbnRlcnByZXRlZCBpbmRlcGVuZGVudGx5LCBhcyBzaW5nbGUgYml0czogKi8KKyNkZWZpbmUJTlNfS0VZX05PX0FVVEgJCTB4ODAwMAkvKiU8IEtleSB1bnVzYWJsZSBmb3IgYXV0aGVudGljYXRpb24gKi8KKyNkZWZpbmUJTlNfS0VZX05PX0NPTkYJCTB4NDAwMAkvKiU8IEtleSB1bnVzYWJsZSBmb3IgY29uZmlkZW50aWFsaXR5ICovCisjZGVmaW5lCU5TX0tFWV9SRVNFUlZFRDIJMHgyMDAwCS8qIFNlY3VyaXR5IGlzICptYW5kYXRvcnkqIGlmIGJpdD0wICovCisjZGVmaW5lCU5TX0tFWV9FWFRFTkRFRF9GTEFHUwkweDEwMDAJLyolPCByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworI2RlZmluZQlOU19LRVlfUkVTRVJWRUQ0CTB4MDgwMCAgLyolPCByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworI2RlZmluZQlOU19LRVlfUkVTRVJWRUQ1CTB4MDQwMCAgLyolPCByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworI2RlZmluZQlOU19LRVlfTkFNRV9UWVBFCTB4MDMwMAkvKiU8IHRoZXNlIGJpdHMgZGV0ZXJtaW5lIHRoZSB0eXBlICovCisjZGVmaW5lCU5TX0tFWV9OQU1FX1VTRVIJMHgwMDAwCS8qJTwga2V5IGlzIGFzc29jLiB3aXRoIHVzZXIgKi8KKyNkZWZpbmUJTlNfS0VZX05BTUVfRU5USVRZCTB4MDIwMAkvKiU8IGtleSBpcyBhc3NvYy4gd2l0aCBlbnRpdHkgZWcgaG9zdCAqLworI2RlZmluZQlOU19LRVlfTkFNRV9aT05FCTB4MDEwMAkvKiU8IGtleSBpcyB6b25lIGtleSAqLworI2RlZmluZQlOU19LRVlfTkFNRV9SRVNFUlZFRAkweDAzMDAJLyolPCByZXNlcnZlZCBtZWFuaW5nICovCisjZGVmaW5lCU5TX0tFWV9SRVNFUlZFRDgJMHgwMDgwICAvKiU8IHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisjZGVmaW5lCU5TX0tFWV9SRVNFUlZFRDkJMHgwMDQwICAvKiU8IHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisjZGVmaW5lCU5TX0tFWV9SRVNFUlZFRDEwCTB4MDAyMCAgLyolPCByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworI2RlZmluZQlOU19LRVlfUkVTRVJWRUQxMQkweDAwMTAgIC8qJTwgcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKyNkZWZpbmUJTlNfS0VZX1NJR05BVE9SWU1BU0sJMHgwMDBGCS8qJTwga2V5IGNhbiBzaWduIFJSJ3Mgb2Ygc2FtZSBuYW1lICovCisjZGVmaW5lCU5TX0tFWV9SRVNFUlZFRF9CSVRNQVNLICggTlNfS0VZX1JFU0VSVkVEMiB8IFwKKwkJCQkgIE5TX0tFWV9SRVNFUlZFRDQgfCBcCisJCQkJICBOU19LRVlfUkVTRVJWRUQ1IHwgXAorCQkJCSAgTlNfS0VZX1JFU0VSVkVEOCB8IFwKKwkJCQkgIE5TX0tFWV9SRVNFUlZFRDkgfCBcCisJCQkJICBOU19LRVlfUkVTRVJWRUQxMCB8IFwKKwkJCQkgIE5TX0tFWV9SRVNFUlZFRDExICkKKyNkZWZpbmUgTlNfS0VZX1JFU0VSVkVEX0JJVE1BU0syIDB4RkZGRiAvKiU8IG5vIGJpdHMgZGVmaW5lZCBoZXJlICovCisvKiBUaGUgQWxnb3JpdGhtIGZpZWxkIG9mIHRoZSBLRVkgYW5kIFNJRyBSUidzIGlzIGFuIGludGVnZXIsIHsxLi4yNTR9ICovCisjZGVmaW5lCU5TX0FMR19NRDVSU0EJCTEJLyolPCBNRDUgd2l0aCBSU0EgKi8KKyNkZWZpbmUJTlNfQUxHX0RIICAgICAgICAgICAgICAgMgkvKiU8IERpZmZpZSBIZWxsbWFuIEtFWSAqLworI2RlZmluZQlOU19BTEdfRFNBICAgICAgICAgICAgICAzCS8qJTwgRFNBIEtFWSAqLworI2RlZmluZQlOU19BTEdfRFNTICAgICAgICAgICAgICBOU19BTEdfRFNBCisjZGVmaW5lCU5TX0FMR19FWFBJUkVfT05MWQkyNTMJLyolPCBObyBhbGcsIG5vIHNlY3VyaXR5ICovCisjZGVmaW5lCU5TX0FMR19QUklWQVRFX09JRAkyNTQJLyolPCBLZXkgYmVnaW5zIHdpdGggT0lEIGdpdmluZyBhbGcgKi8KKy8qIFByb3RvY29sIHZhbHVlcyAgKi8KKy8qIHZhbHVlIDAgaXMgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTlNfS0VZX1BST1RfVExTICAgICAgICAgMQorI2RlZmluZSBOU19LRVlfUFJPVF9FTUFJTCAgICAgICAyCisjZGVmaW5lIE5TX0tFWV9QUk9UX0ROU1NFQyAgICAgIDMKKyNkZWZpbmUgTlNfS0VZX1BST1RfSVBTRUMgICAgICAgNAorI2RlZmluZSBOU19LRVlfUFJPVF9BTlkJCTI1NQorCisvKiBTaWduYXR1cmVzICovCisjZGVmaW5lCU5TX01ENVJTQV9NSU5fQklUUwkgNTEyCS8qJTwgU2l6ZSBvZiBhIG1vZCBvciBleHAgaW4gYml0cyAqLworI2RlZmluZQlOU19NRDVSU0FfTUFYX0JJVFMJNDA5NgorCS8qIFRvdGFsIG9mIGJpbmFyeSBtb2QgYW5kIGV4cCAqLworI2RlZmluZQlOU19NRDVSU0FfTUFYX0JZVEVTCSgoTlNfTUQ1UlNBX01BWF9CSVRTKzcvOCkqMiszKQorCS8qIE1heCBsZW5ndGggb2YgdGV4dCBzaWcgYmxvY2sgKi8KKyNkZWZpbmUJTlNfTUQ1UlNBX01BWF9CQVNFNjQJKCgoTlNfTUQ1UlNBX01BWF9CWVRFUysyKS8zKSo0KQorI2RlZmluZSBOU19NRDVSU0FfTUlOX1NJWkUJKChOU19NRDVSU0FfTUlOX0JJVFMrNykvOCkKKyNkZWZpbmUgTlNfTUQ1UlNBX01BWF9TSVpFCSgoTlNfTUQ1UlNBX01BWF9CSVRTKzcpLzgpCisKKyNkZWZpbmUgTlNfRFNBX1NJR19TSVpFICAgICAgICAgNDEKKyNkZWZpbmUgTlNfRFNBX01JTl9TSVpFICAgICAgICAgMjEzCisjZGVmaW5lIE5TX0RTQV9NQVhfQllURVMgICAgICAgIDQwNQorCisvKiBPZmZzZXRzIGludG8gU0lHIHJlY29yZCByZGF0YSB0byBmaW5kIHZhcmlvdXMgdmFsdWVzICovCisjZGVmaW5lCU5TX1NJR19UWVBFCTAJLyolPCBUeXBlIGZsYWdzICovCisjZGVmaW5lCU5TX1NJR19BTEcJMgkvKiU8IEFsZ29yaXRobSAqLworI2RlZmluZQlOU19TSUdfTEFCRUxTCTMJLyolPCBIb3cgbWFueSBsYWJlbHMgaW4gbmFtZSAqLworI2RlZmluZQlOU19TSUdfT1RUTAk0CS8qJTwgT3JpZ2luYWwgVFRMICovCisjZGVmaW5lCU5TX1NJR19FWFBJUgk4CS8qJTwgRXhwaXJhdGlvbiB0aW1lICovCisjZGVmaW5lCU5TX1NJR19TSUdORUQJMTIJLyolPCBTaWduYXR1cmUgdGltZSAqLworI2RlZmluZQlOU19TSUdfRk9PVAkxNgkvKiU8IEtleSBmb290cHJpbnQgKi8KKyNkZWZpbmUJTlNfU0lHX1NJR05FUgkxOAkvKiU8IERvbWFpbiBuYW1lIG9mIHdobyBzaWduZWQgaXQgKi8KKy8qIEhvdyBSUiB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgYXMgYml0LWZsYWdzIGluIE5YVCByZWNvcmRzICovCisjZGVmaW5lCU5TX05YVF9CSVRTIDgKKyNkZWZpbmUJTlNfTlhUX0JJVF9TRVQoICBuLHApIChwWyhuKS9OU19OWFRfQklUU10gfD0gICgweDgwPj4oKG4pJU5TX05YVF9CSVRTKSkpCisjZGVmaW5lCU5TX05YVF9CSVRfQ0xFQVIobixwKSAocFsobikvTlNfTlhUX0JJVFNdICY9IH4oMHg4MD4+KChuKSVOU19OWFRfQklUUykpKQorI2RlZmluZQlOU19OWFRfQklUX0lTU0VUKG4scCkgKHBbKG4pL05TX05YVF9CSVRTXSAmICAgKDB4ODA+PigobiklTlNfTlhUX0JJVFMpKSkKKyNkZWZpbmUgTlNfTlhUX01BWCAxMjcKKworLyolCisgKiBFRE5TMCBleHRlbmRlZCBmbGFncyBhbmQgb3B0aW9uIGNvZGVzLCBob3N0IG9yZGVyLgorICovCisjZGVmaW5lIE5TX09QVF9ETlNTRUNfT0sgICAgICAgIDB4ODAwMFUKKyNkZWZpbmUgTlNfT1BUX05TSUQJCTMKKworLyolCisgKiBJbmxpbmUgdmVyc2lvbnMgb2YgZ2V0L3B1dCBzaG9ydC9sb25nLiAgUG9pbnRlciBpcyBhZHZhbmNlZC4KKyAqLworI2RlZmluZSBOU19HRVQxNihzLCBjcCkgZG8geyBcCisJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICp0X2NwID0gKGNvbnN0IHVfY2hhciAqKShjcCk7IFwKKwkocykgPSAoKHVfaW50MTZfdCl0X2NwWzBdIDw8IDgpIFwKKwkgICAgfCAoKHVfaW50MTZfdCl0X2NwWzFdKSBcCisJICAgIDsgXAorCShjcCkgKz0gTlNfSU5UMTZTWjsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBOU19HRVQzMihsLCBjcCkgZG8geyBcCisJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICp0X2NwID0gKGNvbnN0IHVfY2hhciAqKShjcCk7IFwKKwkobCkgPSAoKHVfaW50MzJfdCl0X2NwWzBdIDw8IDI0KSBcCisJICAgIHwgKCh1X2ludDMyX3QpdF9jcFsxXSA8PCAxNikgXAorCSAgICB8ICgodV9pbnQzMl90KXRfY3BbMl0gPDwgOCkgXAorCSAgICB8ICgodV9pbnQzMl90KXRfY3BbM10pIFwKKwkgICAgOyBcCisJKGNwKSArPSBOU19JTlQzMlNaOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE5TX1BVVDE2KHMsIGNwKSBkbyB7IFwKKwlyZWdpc3RlciB1X2ludDE2X3QgdF9zID0gKHVfaW50MTZfdCkocyk7IFwKKwlyZWdpc3RlciB1X2NoYXIgKnRfY3AgPSAodV9jaGFyICopKGNwKTsgXAorCSp0X2NwKysgPSB0X3MgPj4gODsgXAorCSp0X2NwICAgPSB0X3M7IFwKKwkoY3ApICs9IE5TX0lOVDE2U1o7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTlNfUFVUMzIobCwgY3ApIGRvIHsgXAorCXJlZ2lzdGVyIHVfaW50MzJfdCB0X2wgPSAodV9pbnQzMl90KShsKTsgXAorCXJlZ2lzdGVyIHVfY2hhciAqdF9jcCA9ICh1X2NoYXIgKikoY3ApOyBcCisJKnRfY3ArKyA9IHRfbCA+PiAyNDsgXAorCSp0X2NwKysgPSB0X2wgPj4gMTY7IFwKKwkqdF9jcCsrID0gdF9sID4+IDg7IFwKKwkqdF9jcCAgID0gdF9sOyBcCisJKGNwKSArPSBOU19JTlQzMlNaOyBcCit9IHdoaWxlICgwKQorCitfX0JFR0lOX0RFQ0xTCitpbnQJCW5zX21zZ19nZXRmbGFnIChuc19tc2csIGludCkgX19USFJPVzsKK3VfaW50CQluc19nZXQxNiAoY29uc3QgdV9jaGFyICopIF9fVEhST1c7Cit1X2xvbmcJCW5zX2dldDMyIChjb25zdCB1X2NoYXIgKikgX19USFJPVzsKK3ZvaWQJCW5zX3B1dDE2ICh1X2ludCwgdV9jaGFyICopIF9fVEhST1c7Cit2b2lkCQluc19wdXQzMiAodV9sb25nLCB1X2NoYXIgKikgX19USFJPVzsKK2ludAkJbnNfaW5pdHBhcnNlIChjb25zdCB1X2NoYXIgKiwgaW50LCBuc19tc2cgKikgX19USFJPVzsKK2ludAkJbnNfc2tpcHJyIChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosIG5zX3NlY3QsIGludCkKKyAgICAgX19USFJPVzsKK2ludAkJbnNfcGFyc2VyciAobnNfbXNnICosIG5zX3NlY3QsIGludCwgbnNfcnIgKikgX19USFJPVzsKK2ludAkJbnNfc3ByaW50cnIgKGNvbnN0IG5zX21zZyAqLCBjb25zdCBuc19yciAqLAorCQkJICAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY2hhciAqLCBzaXplX3QpCisgICAgIF9fVEhST1c7CitpbnQJCW5zX3NwcmludHJyZiAoY29uc3QgdV9jaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLAorCQkJICAgICAgbnNfY2xhc3MsIG5zX3R5cGUsIHVfbG9uZywgY29uc3QgdV9jaGFyICosCisJCQkgICAgICBzaXplX3QsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCQkJICAgICAgY2hhciAqLCBzaXplX3QpIF9fVEhST1c7CitpbnQJCW5zX2Zvcm1hdF90dGwgKHVfbG9uZywgY2hhciAqLCBzaXplX3QpIF9fVEhST1c7CitpbnQJCW5zX3BhcnNlX3R0bCAoY29uc3QgY2hhciAqLCB1X2xvbmcgKikgX19USFJPVzsKK3VfaW50MzJfdAluc19kYXRldG9zZWNzIChjb25zdCBjaGFyICosIGludCAqKSBfX1RIUk9XOworaW50CQluc19uYW1lX250b2wgKGNvbnN0IHVfY2hhciAqLCB1X2NoYXIgKiwgc2l6ZV90KSBfX1RIUk9XOworaW50CQluc19uYW1lX250b3AgKGNvbnN0IHVfY2hhciAqLCBjaGFyICosIHNpemVfdCkgX19USFJPVzsKK2ludAkJbnNfbmFtZV9wdG9uIChjb25zdCBjaGFyICosIHVfY2hhciAqLCBzaXplX3QpIF9fVEhST1c7CitpbnQJCW5zX25hbWVfdW5wYWNrIChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosCisJCQkJY29uc3QgdV9jaGFyICosIHVfY2hhciAqLCBzaXplX3QpIF9fVEhST1c7CitpbnQJCW5zX25hbWVfcGFjayAoY29uc3QgdV9jaGFyICosIHVfY2hhciAqLCBpbnQsCisJCQkgICAgICBjb25zdCB1X2NoYXIgKiosIGNvbnN0IHVfY2hhciAqKikgX19USFJPVzsKK2ludAkJbnNfbmFtZV91bmNvbXByZXNzIChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosCisJCQkJICAgIGNvbnN0IHVfY2hhciAqLCBjaGFyICosIHNpemVfdCkgX19USFJPVzsKK2ludAkJbnNfbmFtZV9jb21wcmVzcyAoY29uc3QgY2hhciAqLCB1X2NoYXIgKiwgc2l6ZV90LAorCQkJCSAgY29uc3QgdV9jaGFyICoqLCBjb25zdCB1X2NoYXIgKiopIF9fVEhST1c7CitpbnQJCW5zX25hbWVfc2tpcCAoY29uc3QgdV9jaGFyICoqLCBjb25zdCB1X2NoYXIgKikgX19USFJPVzsKK3ZvaWQJCW5zX25hbWVfcm9sbGJhY2sgKGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiosCisJCQkJICBjb25zdCB1X2NoYXIgKiopIF9fVEhST1c7CitpbnQJCW5zX3NpZ24gKHVfY2hhciAqLCBpbnQgKiwgaW50LCBpbnQsIHZvaWQgKiwKKwkJCSBjb25zdCB1X2NoYXIgKiwgaW50LCB1X2NoYXIgKiwgaW50ICosIHRpbWVfdCkgX19USFJPVzsKK2ludAkJbnNfc2lnbjIgKHVfY2hhciAqLCBpbnQgKiwgaW50LCBpbnQsIHZvaWQgKiwKKwkJCSAgY29uc3QgdV9jaGFyICosIGludCwgdV9jaGFyICosIGludCAqLCB0aW1lX3QsCisJCQkgIHVfY2hhciAqKiwgdV9jaGFyICoqKSBfX1RIUk9XOworaW50CQluc19zaWduX3RjcCAodV9jaGFyICosIGludCAqLCBpbnQsIGludCwKKwkJCSAgICAgbnNfdGNwX3RzaWdfc3RhdGUgKiwgaW50KSBfX1RIUk9XOworaW50CQluc19zaWduX3RjcDIgKHVfY2hhciAqLCBpbnQgKiwgaW50LCBpbnQsCisJCQkgICAgICBuc190Y3BfdHNpZ19zdGF0ZSAqLCBpbnQsCisJCQkgICAgICB1X2NoYXIgKiosIHVfY2hhciAqKikgX19USFJPVzsKK2ludAkJbnNfc2lnbl90Y3BfaW5pdCAodm9pZCAqLCBjb25zdCB1X2NoYXIgKiwgaW50LAorCQkJCSAgbnNfdGNwX3RzaWdfc3RhdGUgKikgX19USFJPVzsKK3VfY2hhcgkJKm5zX2ZpbmRfdHNpZyAodV9jaGFyICosIHVfY2hhciAqKSBfX1RIUk9XOworaW50CQluc192ZXJpZnkgKHVfY2hhciAqLCBpbnQgKiwgdm9pZCAqLCBjb25zdCB1X2NoYXIgKiwgaW50LAorCQkJICAgdV9jaGFyICosIGludCAqLCB0aW1lX3QgKiwgaW50KSBfX1RIUk9XOworaW50CQluc192ZXJpZnlfdGNwICh1X2NoYXIgKiwgaW50ICosIG5zX3RjcF90c2lnX3N0YXRlICosIGludCkKKyAgICAgX19USFJPVzsKK2ludAkJbnNfdmVyaWZ5X3RjcF9pbml0ICh2b2lkICosIGNvbnN0IHVfY2hhciAqLCBpbnQsCisJCQkJICAgIG5zX3RjcF90c2lnX3N0YXRlICopIF9fVEhST1c7CitpbnQJCW5zX3NhbWVkb21haW4gKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSBfX1RIUk9XOworaW50CQluc19zdWJkb21haW4gKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSBfX1RIUk9XOworaW50CQluc19tYWtlY2Fub24gKGNvbnN0IGNoYXIgKiwgY2hhciAqLCBzaXplX3QpIF9fVEhST1c7CitpbnQJCW5zX3NhbWVuYW1lIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikgX19USFJPVzsKK19fRU5EX0RFQ0xTCisKKyNpZmRlZiBCSU5EXzRfQ09NUEFUCisjaW5jbHVkZSA8YXJwYS9uYW1lc2VyX2NvbXBhdC5oPgorI2VuZGlmCisKKyNlbmRpZiAvKiAhX0FSUEFfTkFNRVNFUl9IXyAqLworLyohIFxmaWxlICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvbmFtZXNlcl9jb21wYXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS9uYW1lc2VyX2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OWM5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvbmFtZXNlcl9jb21wYXQuaApAQCAtMCwwICsxLDE4NyBAQAorLyogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTg5CisgKiAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyolCisgKiAgICAgIGZyb20gbmFtZXNlci5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICoJJEJJTkRJZDogbmFtZXNlcl9jb21wYXQuaCx2IDguMTEgMTk5OS8wMS8wMiAwODowMDo1OCB2aXhpZSBFeHAgJAorICovCisKKyNpZm5kZWYgX0FSUEFfTkFNRVNFUl9DT01QQVRfCisjZGVmaW5lCV9BUlBBX05BTUVTRVJfQ09NUEFUXworCisjZGVmaW5lCV9fQklORAkJMTk5NTA2MjEJLyolPCAoREVBRCkgaW50ZXJmYWNlIHZlcnNpb24gc3RhbXAuICovCisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworLyolCisgKiBTdHJ1Y3R1cmUgZm9yIHF1ZXJ5IGhlYWRlci4gIFRoZSBvcmRlciBvZiB0aGUgZmllbGRzIGlzIG1hY2hpbmUtIGFuZAorICogY29tcGlsZXItZGVwZW5kZW50LCBkZXBlbmRpbmcgb24gdGhlIGJ5dGUvYml0IG9yZGVyIGFuZCB0aGUgbGF5b3V0CisgKiBvZiBiaXQgZmllbGRzLiAgV2UgdXNlIGJpdCBmaWVsZHMgb25seSBpbiBpbnQgdmFyaWFibGVzLCBhcyB0aGlzCisgKiBpcyBhbGwgQU5TSSByZXF1aXJlcy4gIFRoaXMgcmVxdWlyZXMgYSBzb21ld2hhdCBjb25mdXNpbmcgcmVhcnJhbmdlbWVudC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQJaWQgOjE2OwkJLyolPCBxdWVyeSBpZGVudGlmaWNhdGlvbiBudW1iZXIgKi8KKyNpZiBCWVRFX09SREVSID09IEJJR19FTkRJQU4KKwkJCS8qIGZpZWxkcyBpbiB0aGlyZCBieXRlICovCisJdW5zaWduZWQJcXI6IDE7CQkvKiU8IHJlc3BvbnNlIGZsYWcgKi8KKwl1bnNpZ25lZAlvcGNvZGU6IDQ7CS8qJTwgcHVycG9zZSBvZiBtZXNzYWdlICovCisJdW5zaWduZWQJYWE6IDE7CQkvKiU8IGF1dGhvcml0aXZlIGFuc3dlciAqLworCXVuc2lnbmVkCXRjOiAxOwkJLyolPCB0cnVuY2F0ZWQgbWVzc2FnZSAqLworCXVuc2lnbmVkCXJkOiAxOwkJLyolPCByZWN1cnNpb24gZGVzaXJlZCAqLworCQkJLyogZmllbGRzIGluIGZvdXJ0aCBieXRlICovCisJdW5zaWduZWQJcmE6IDE7CQkvKiU8IHJlY3Vyc2lvbiBhdmFpbGFibGUgKi8KKwl1bnNpZ25lZAl1bnVzZWQgOjE7CS8qJTwgdW51c2VkIGJpdHMgKE1CWiBhcyBvZiA0LjkuM2EzKSAqLworCXVuc2lnbmVkCWFkOiAxOwkJLyolPCBhdXRoZW50aWMgZGF0YSBmcm9tIG5hbWVkICovCisJdW5zaWduZWQJY2Q6IDE7CQkvKiU8IGNoZWNraW5nIGRpc2FibGVkIGJ5IHJlc29sdmVyICovCisJdW5zaWduZWQJcmNvZGUgOjQ7CS8qJTwgcmVzcG9uc2UgY29kZSAqLworI2VuZGlmCisjaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOIHx8IEJZVEVfT1JERVIgPT0gUERQX0VORElBTgorCQkJLyogZmllbGRzIGluIHRoaXJkIGJ5dGUgKi8KKwl1bnNpZ25lZAlyZCA6MTsJCS8qJTwgcmVjdXJzaW9uIGRlc2lyZWQgKi8KKwl1bnNpZ25lZAl0YyA6MTsJCS8qJTwgdHJ1bmNhdGVkIG1lc3NhZ2UgKi8KKwl1bnNpZ25lZAlhYSA6MTsJCS8qJTwgYXV0aG9yaXRpdmUgYW5zd2VyICovCisJdW5zaWduZWQJb3Bjb2RlIDo0OwkvKiU8IHB1cnBvc2Ugb2YgbWVzc2FnZSAqLworCXVuc2lnbmVkCXFyIDoxOwkJLyolPCByZXNwb25zZSBmbGFnICovCisJCQkvKiBmaWVsZHMgaW4gZm91cnRoIGJ5dGUgKi8KKwl1bnNpZ25lZAlyY29kZSA6NDsJLyolPCByZXNwb25zZSBjb2RlICovCisJdW5zaWduZWQJY2Q6IDE7CQkvKiU8IGNoZWNraW5nIGRpc2FibGVkIGJ5IHJlc29sdmVyICovCisJdW5zaWduZWQJYWQ6IDE7CQkvKiU8IGF1dGhlbnRpYyBkYXRhIGZyb20gbmFtZWQgKi8KKwl1bnNpZ25lZAl1bnVzZWQgOjE7CS8qJTwgdW51c2VkIGJpdHMgKE1CWiBhcyBvZiA0LjkuM2EzKSAqLworCXVuc2lnbmVkCXJhIDoxOwkJLyolPCByZWN1cnNpb24gYXZhaWxhYmxlICovCisjZW5kaWYKKwkJCS8qIHJlbWFpbmluZyBieXRlcyAqLworCXVuc2lnbmVkCXFkY291bnQgOjE2OwkvKiU8IG51bWJlciBvZiBxdWVzdGlvbiBlbnRyaWVzICovCisJdW5zaWduZWQJYW5jb3VudCA6MTY7CS8qJTwgbnVtYmVyIG9mIGFuc3dlciBlbnRyaWVzICovCisJdW5zaWduZWQJbnNjb3VudCA6MTY7CS8qJTwgbnVtYmVyIG9mIGF1dGhvcml0eSBlbnRyaWVzICovCisJdW5zaWduZWQJYXJjb3VudCA6MTY7CS8qJTwgbnVtYmVyIG9mIHJlc291cmNlIGVudHJpZXMgKi8KK30gSEVBREVSOworCisjZGVmaW5lIFBBQ0tFVFNaCU5TX1BBQ0tFVFNaCisjZGVmaW5lIE1BWEROQU1FCU5TX01BWEROQU1FCisjZGVmaW5lIE1BWENETkFNRQlOU19NQVhDRE5BTUUKKyNkZWZpbmUgTUFYTEFCRUwJTlNfTUFYTEFCRUwKKyNkZWZpbmUJSEZJWEVEU1oJTlNfSEZJWEVEU1oKKyNkZWZpbmUgUUZJWEVEU1oJTlNfUUZJWEVEU1oKKyNkZWZpbmUgUlJGSVhFRFNaCU5TX1JSRklYRURTWgorI2RlZmluZQlJTlQzMlNaCQlOU19JTlQzMlNaCisjZGVmaW5lCUlOVDE2U1oJCU5TX0lOVDE2U1oKKyNkZWZpbmUgSU5UOFNaCQlOU19JTlQ4U1oKKyNkZWZpbmUJSU5BRERSU1oJTlNfSU5BRERSU1oKKyNkZWZpbmUJSU42QUREUlNaCU5TX0lONkFERFJTWgorI2RlZmluZQlJTkRJUl9NQVNLCU5TX0NNUFJTRkxHUworI2RlZmluZSBOQU1FU0VSVkVSX1BPUlQJTlNfREVGQVVMVFBPUlQKKworI2RlZmluZSBTX1pPTkUJCW5zX3Nfem4KKyNkZWZpbmUgU19QUkVSRVEJbnNfc19wcgorI2RlZmluZSBTX1VQREFURQluc19zX3VkCisjZGVmaW5lIFNfQUREVAkJbnNfc19hcgorCisjZGVmaW5lIFFVRVJZCQluc19vX3F1ZXJ5CisjZGVmaW5lIElRVUVSWQkJbnNfb19pcXVlcnkKKyNkZWZpbmUgU1RBVFVTCQluc19vX3N0YXR1cworI2RlZmluZQlOU19OT1RJRllfT1AJbnNfb19ub3RpZnkKKyNkZWZpbmUJTlNfVVBEQVRFX09QCW5zX29fdXBkYXRlCisKKyNkZWZpbmUgTk9FUlJPUgkJbnNfcl9ub2Vycm9yCisjZGVmaW5lIEZPUk1FUlIJCW5zX3JfZm9ybWVycgorI2RlZmluZSBTRVJWRkFJTAluc19yX3NlcnZmYWlsCisjZGVmaW5lIE5YRE9NQUlOCW5zX3Jfbnhkb21haW4KKyNkZWZpbmUgTk9USU1QCQluc19yX25vdGltcGwKKyNkZWZpbmUgUkVGVVNFRAkJbnNfcl9yZWZ1c2VkCisjZGVmaW5lIFlYRE9NQUlOCW5zX3JfeXhkb21haW4KKyNkZWZpbmUgWVhSUlNFVAkJbnNfcl95eHJyc2V0CisjZGVmaW5lIE5YUlJTRVQJCW5zX3JfbnhycnNldAorI2RlZmluZSBOT1RBVVRICQluc19yX25vdGF1dGgKKyNkZWZpbmUgTk9UWk9ORQkJbnNfcl9ub3R6b25lCisvKiNkZWZpbmUgQkFEU0lHCQluc19yX2JhZHNpZyovCisvKiNkZWZpbmUgQkFES0VZCQluc19yX2JhZGtleSovCisvKiNkZWZpbmUgQkFEVElNRQkJbnNfcl9iYWR0aW1lKi8KKworCisjZGVmaW5lIERFTEVURQkJbnNfdW9wX2RlbGV0ZQorI2RlZmluZSBBREQJCW5zX3VvcF9hZGQKKworI2RlZmluZSBUX0EJCW5zX3RfYQorI2RlZmluZSBUX05TCQluc190X25zCisjZGVmaW5lIFRfTUQJCW5zX3RfbWQKKyNkZWZpbmUgVF9NRgkJbnNfdF9tZgorI2RlZmluZSBUX0NOQU1FCQluc190X2NuYW1lCisjZGVmaW5lIFRfU09BCQluc190X3NvYQorI2RlZmluZSBUX01CCQluc190X21iCisjZGVmaW5lIFRfTUcJCW5zX3RfbWcKKyNkZWZpbmUgVF9NUgkJbnNfdF9tcgorI2RlZmluZSBUX05VTEwJCW5zX3RfbnVsbAorI2RlZmluZSBUX1dLUwkJbnNfdF93a3MKKyNkZWZpbmUgVF9QVFIJCW5zX3RfcHRyCisjZGVmaW5lIFRfSElORk8JCW5zX3RfaGluZm8KKyNkZWZpbmUgVF9NSU5GTwkJbnNfdF9taW5mbworI2RlZmluZSBUX01YCQluc190X214CisjZGVmaW5lIFRfVFhUCQluc190X3R4dAorI2RlZmluZQlUX1JQCQluc190X3JwCisjZGVmaW5lIFRfQUZTREIJCW5zX3RfYWZzZGIKKyNkZWZpbmUgVF9YMjUJCW5zX3RfeDI1CisjZGVmaW5lIFRfSVNETgkJbnNfdF9pc2RuCisjZGVmaW5lIFRfUlQJCW5zX3RfcnQKKyNkZWZpbmUgVF9OU0FQCQluc190X25zYXAKKyNkZWZpbmUgVF9OU0FQX1BUUgluc190X25zYXBfcHRyCisjZGVmaW5lCVRfU0lHCQluc190X3NpZworI2RlZmluZQlUX0tFWQkJbnNfdF9rZXkKKyNkZWZpbmUJVF9QWAkJbnNfdF9weAorI2RlZmluZQlUX0dQT1MJCW5zX3RfZ3BvcworI2RlZmluZQlUX0FBQUEJCW5zX3RfYWFhYQorI2RlZmluZQlUX0xPQwkJbnNfdF9sb2MKKyNkZWZpbmUJVF9OWFQJCW5zX3Rfbnh0CisjZGVmaW5lCVRfRUlECQluc190X2VpZAorI2RlZmluZQlUX05JTUxPQwluc190X25pbWxvYworI2RlZmluZQlUX1NSVgkJbnNfdF9zcnYKKyNkZWZpbmUgVF9BVE1BCQluc190X2F0bWEKKyNkZWZpbmUgVF9OQVBUUgkJbnNfdF9uYXB0cgorI2RlZmluZSBUX0E2CQluc190X2E2CisjZGVmaW5lIFRfRE5BTUUJCW5zX3RfZG5hbWUKKyNkZWZpbmUJVF9UU0lHCQluc190X3RzaWcKKyNkZWZpbmUJVF9JWEZSCQluc190X2l4ZnIKKyNkZWZpbmUgVF9BWEZSCQluc190X2F4ZnIKKyNkZWZpbmUgVF9NQUlMQgkJbnNfdF9tYWlsYgorI2RlZmluZSBUX01BSUxBCQluc190X21haWxhCisjZGVmaW5lIFRfQU5ZCQluc190X2FueQorCisjZGVmaW5lIENfSU4JCW5zX2NfaW4KKyNkZWZpbmUgQ19DSEFPUwkJbnNfY19jaGFvcworI2RlZmluZSBDX0hTCQluc19jX2hzCisvKiBCSU5EX1VQREFURSAqLworI2RlZmluZSBDX05PTkUJCW5zX2Nfbm9uZQorI2RlZmluZSBDX0FOWQkJbnNfY19hbnkKKworI2RlZmluZQlHRVRTSE9SVAkJTlNfR0VUMTYKKyNkZWZpbmUJR0VUTE9ORwkJCU5TX0dFVDMyCisjZGVmaW5lCVBVVFNIT1JUCQlOU19QVVQxNgorI2RlZmluZQlQVVRMT05HCQkJTlNfUFVUMzIKKworI2VuZGlmIC8qIF9BUlBBX05BTUVTRVJfQ09NUEFUXyAqLworLyohIFxmaWxlICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvdGVsbmV0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvdGVsbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3NGM4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS90ZWxuZXQuaApAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0ZWxuZXQuaAk4LjIgKEJlcmtlbGV5KSAxMi8xNS85MworICovCisKKyNpZm5kZWYgX0FSUEFfVEVMTkVUX0gKKyNkZWZpbmUJX0FSUEFfVEVMTkVUX0ggMQorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBURUxORVQgcHJvdG9jb2wuCisgKi8KKyNkZWZpbmUJSUFDCTI1NQkJLyogaW50ZXJwcmV0IGFzIGNvbW1hbmQ6ICovCisjZGVmaW5lCURPTlQJMjU0CQkvKiB5b3UgYXJlIG5vdCB0byB1c2Ugb3B0aW9uICovCisjZGVmaW5lCURPCTI1MwkJLyogcGxlYXNlLCB5b3UgdXNlIG9wdGlvbiAqLworI2RlZmluZQlXT05UCTI1MgkJLyogSSB3b24ndCB1c2Ugb3B0aW9uICovCisjZGVmaW5lCVdJTEwJMjUxCQkvKiBJIHdpbGwgdXNlIG9wdGlvbiAqLworI2RlZmluZQlTQgkyNTAJCS8qIGludGVycHJldCBhcyBzdWJuZWdvdGlhdGlvbiAqLworI2RlZmluZQlHQQkyNDkJCS8qIHlvdSBtYXkgcmV2ZXJzZSB0aGUgbGluZSAqLworI2RlZmluZQlFTAkyNDgJCS8qIGVyYXNlIHRoZSBjdXJyZW50IGxpbmUgKi8KKyNkZWZpbmUJRUMJMjQ3CQkvKiBlcmFzZSB0aGUgY3VycmVudCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUJQVlUCTI0NgkJLyogYXJlIHlvdSB0aGVyZSAqLworI2RlZmluZQlBTwkyNDUJCS8qIGFib3J0IG91dHB1dC0tYnV0IGxldCBwcm9nIGZpbmlzaCAqLworI2RlZmluZQlJUAkyNDQJCS8qIGludGVycnVwdCBwcm9jZXNzLS1wZXJtYW5lbnRseSAqLworI2RlZmluZQlCUkVBSwkyNDMJCS8qIGJyZWFrICovCisjZGVmaW5lCURNCTI0MgkJLyogZGF0YSBtYXJrLS1mb3IgY29ubmVjdC4gY2xlYW5pbmcgKi8KKyNkZWZpbmUJTk9QCTI0MQkJLyogbm9wICovCisjZGVmaW5lCVNFCTI0MAkJLyogZW5kIHN1YiBuZWdvdGlhdGlvbiAqLworI2RlZmluZSBFT1IgICAgIDIzOSAgICAgICAgICAgICAvKiBlbmQgb2YgcmVjb3JkICh0cmFuc3BhcmVudCBtb2RlKSAqLworI2RlZmluZQlBQk9SVAkyMzgJCS8qIEFib3J0IHByb2Nlc3MgKi8KKyNkZWZpbmUJU1VTUAkyMzcJCS8qIFN1c3BlbmQgcHJvY2VzcyAqLworI2RlZmluZQl4RU9GCTIzNgkJLyogRW5kIG9mIGZpbGU6IEVPRiBpcyBhbHJlYWR5IHVzZWQuLi4gKi8KKworI2RlZmluZSBTWU5DSAkyNDIJCS8qIGZvciB0ZWxmdW5jIGNhbGxzICovCisKKyNpZmRlZiBURUxDTURTCitjaGFyICp0ZWxjbWRzW10gPSB7CisJIkVPRiIsICJTVVNQIiwgIkFCT1JUIiwgIkVPUiIsCisJIlNFIiwgIk5PUCIsICJETUFSSyIsICJCUksiLCAiSVAiLCAiQU8iLCAiQVlUIiwgIkVDIiwKKwkiRUwiLCAiR0EiLCAiU0IiLCAiV0lMTCIsICJXT05UIiwgIkRPIiwgIkRPTlQiLCAiSUFDIiwgMCwKK307CisjZWxzZQorZXh0ZXJuIGNoYXIgKnRlbGNtZHNbXTsKKyNlbmRpZgorCisjZGVmaW5lCVRFTENNRF9GSVJTVAl4RU9GCisjZGVmaW5lCVRFTENNRF9MQVNUCUlBQworI2RlZmluZQlURUxDTURfT0soeCkJKCh1bnNpZ25lZCBpbnQpKHgpIDw9IFRFTENNRF9MQVNUICYmIFwKKwkJCSAodW5zaWduZWQgaW50KSh4KSA+PSBURUxDTURfRklSU1QpCisjZGVmaW5lCVRFTENNRCh4KQl0ZWxjbWRzWyh4KS1URUxDTURfRklSU1RdCisKKy8qIHRlbG5ldCBvcHRpb25zICovCisjZGVmaW5lIFRFTE9QVF9CSU5BUlkJMAkvKiA4LWJpdCBkYXRhIHBhdGggKi8KKyNkZWZpbmUgVEVMT1BUX0VDSE8JMQkvKiBlY2hvICovCisjZGVmaW5lCVRFTE9QVF9SQ1AJMgkvKiBwcmVwYXJlIHRvIHJlY29ubmVjdCAqLworI2RlZmluZQlURUxPUFRfU0dBCTMJLyogc3VwcHJlc3MgZ28gYWhlYWQgKi8KKyNkZWZpbmUJVEVMT1BUX05BTVMJNAkvKiBhcHByb3hpbWF0ZSBtZXNzYWdlIHNpemUgKi8KKyNkZWZpbmUJVEVMT1BUX1NUQVRVUwk1CS8qIGdpdmUgc3RhdHVzICovCisjZGVmaW5lCVRFTE9QVF9UTQk2CS8qIHRpbWluZyBtYXJrICovCisjZGVmaW5lCVRFTE9QVF9SQ1RFCTcJLyogcmVtb3RlIGNvbnRyb2xsZWQgdHJhbnNtaXNzaW9uIGFuZCBlY2hvICovCisjZGVmaW5lIFRFTE9QVF9OQU9MIAk4CS8qIG5lZ290aWF0ZSBhYm91dCBvdXRwdXQgbGluZSB3aWR0aCAqLworI2RlZmluZSBURUxPUFRfTkFPUCAJOQkvKiBuZWdvdGlhdGUgYWJvdXQgb3V0cHV0IHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBURUxPUFRfTkFPQ1JECTEwCS8qIG5lZ290aWF0ZSBhYm91dCBDUiBkaXNwb3NpdGlvbiAqLworI2RlZmluZSBURUxPUFRfTkFPSFRTCTExCS8qIG5lZ290aWF0ZSBhYm91dCBob3Jpem9udGFsIHRhYnN0b3BzICovCisjZGVmaW5lIFRFTE9QVF9OQU9IVEQJMTIJLyogbmVnb3RpYXRlIGFib3V0IGhvcml6b250YWwgdGFiIGRpc3Bvc2l0aW9uICovCisjZGVmaW5lIFRFTE9QVF9OQU9GRkQJMTMJLyogbmVnb3RpYXRlIGFib3V0IGZvcm1mZWVkIGRpc3Bvc2l0aW9uICovCisjZGVmaW5lIFRFTE9QVF9OQU9WVFMJMTQJLyogbmVnb3RpYXRlIGFib3V0IHZlcnRpY2FsIHRhYiBzdG9wcyAqLworI2RlZmluZSBURUxPUFRfTkFPVlRECTE1CS8qIG5lZ290aWF0ZSBhYm91dCB2ZXJ0aWNhbCB0YWIgZGlzcG9zaXRpb24gKi8KKyNkZWZpbmUgVEVMT1BUX05BT0xGRAkxNgkvKiBuZWdvdGlhdGUgYWJvdXQgb3V0cHV0IExGIGRpc3Bvc2l0aW9uICovCisjZGVmaW5lIFRFTE9QVF9YQVNDSUkJMTcJLyogZXh0ZW5kZWQgYXNjaWkgY2hhcmFjdGVyIHNldCAqLworI2RlZmluZQlURUxPUFRfTE9HT1VUCTE4CS8qIGZvcmNlIGxvZ291dCAqLworI2RlZmluZQlURUxPUFRfQk0JMTkJLyogYnl0ZSBtYWNybyAqLworI2RlZmluZQlURUxPUFRfREVUCTIwCS8qIGRhdGEgZW50cnkgdGVybWluYWwgKi8KKyNkZWZpbmUJVEVMT1BUX1NVUERVUAkyMQkvKiBzdXBkdXAgcHJvdG9jb2wgKi8KKyNkZWZpbmUJVEVMT1BUX1NVUERVUE9VVFBVVCAyMgkvKiBzdXBkdXAgb3V0cHV0ICovCisjZGVmaW5lCVRFTE9QVF9TTkRMT0MJMjMJLyogc2VuZCBsb2NhdGlvbiAqLworI2RlZmluZQlURUxPUFRfVFRZUEUJMjQJLyogdGVybWluYWwgdHlwZSAqLworI2RlZmluZQlURUxPUFRfRU9SCTI1CS8qIGVuZCBvciByZWNvcmQgKi8KKyNkZWZpbmUJVEVMT1BUX1RVSUQJMjYJLyogVEFDQUNTIHVzZXIgaWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUJVEVMT1BUX09VVE1SSwkyNwkvKiBvdXRwdXQgbWFya2luZyAqLworI2RlZmluZQlURUxPUFRfVFRZTE9DCTI4CS8qIHRlcm1pbmFsIGxvY2F0aW9uIG51bWJlciAqLworI2RlZmluZQlURUxPUFRfMzI3MFJFR0lNRSAyOQkvKiAzMjcwIHJlZ2ltZSAqLworI2RlZmluZQlURUxPUFRfWDNQQUQJMzAJLyogWC4zIFBBRCAqLworI2RlZmluZQlURUxPUFRfTkFXUwkzMQkvKiB3aW5kb3cgc2l6ZSAqLworI2RlZmluZQlURUxPUFRfVFNQRUVECTMyCS8qIHRlcm1pbmFsIHNwZWVkICovCisjZGVmaW5lCVRFTE9QVF9MRkxPVwkzMwkvKiByZW1vdGUgZmxvdyBjb250cm9sICovCisjZGVmaW5lIFRFTE9QVF9MSU5FTU9ERQkzNAkvKiBMaW5lbW9kZSBvcHRpb24gKi8KKyNkZWZpbmUgVEVMT1BUX1hESVNQTE9DCTM1CS8qIFggRGlzcGxheSBMb2NhdGlvbiAqLworI2RlZmluZSBURUxPUFRfT0xEX0VOVklST04gMzYJLyogT2xkIC0gRW52aXJvbm1lbnQgdmFyaWFibGVzICovCisjZGVmaW5lCVRFTE9QVF9BVVRIRU5USUNBVElPTiAzNy8qIEF1dGhlbnRpY2F0ZSAqLworI2RlZmluZQlURUxPUFRfRU5DUllQVAkzOAkvKiBFbmNyeXB0aW9uIG9wdGlvbiAqLworI2RlZmluZSBURUxPUFRfTkVXX0VOVklST04gMzkJLyogTmV3IC0gRW52aXJvbm1lbnQgdmFyaWFibGVzICovCisjZGVmaW5lCVRFTE9QVF9FWE9QTAkyNTUJLyogZXh0ZW5kZWQtb3B0aW9ucy1saXN0ICovCisKKworI2RlZmluZQlOVEVMT1BUUwkoMStURUxPUFRfTkVXX0VOVklST04pCisjaWZkZWYgVEVMT1BUUworY2hhciAqdGVsb3B0c1tOVEVMT1BUUysxXSA9IHsKKwkiQklOQVJZIiwgIkVDSE8iLCAiUkNQIiwgIlNVUFBSRVNTIEdPIEFIRUFEIiwgIk5BTUUiLAorCSJTVEFUVVMiLCAiVElNSU5HIE1BUksiLCAiUkNURSIsICJOQU9MIiwgIk5BT1AiLAorCSJOQU9DUkQiLCAiTkFPSFRTIiwgIk5BT0hURCIsICJOQU9GRkQiLCAiTkFPVlRTIiwKKwkiTkFPVlREIiwgIk5BT0xGRCIsICJFWFRFTkQgQVNDSUkiLCAiTE9HT1VUIiwgIkJZVEUgTUFDUk8iLAorCSJEQVRBIEVOVFJZIFRFUk1JTkFMIiwgIlNVUERVUCIsICJTVVBEVVAgT1VUUFVUIiwKKwkiU0VORCBMT0NBVElPTiIsICJURVJNSU5BTCBUWVBFIiwgIkVORCBPRiBSRUNPUkQiLAorCSJUQUNBQ1MgVUlEIiwgIk9VVFBVVCBNQVJLSU5HIiwgIlRUWUxPQyIsCisJIjMyNzAgUkVHSU1FIiwgIlguMyBQQUQiLCAiTkFXUyIsICJUU1BFRUQiLCAiTEZMT1ciLAorCSJMSU5FTU9ERSIsICJYRElTUExPQyIsICJPTEQtRU5WSVJPTiIsICJBVVRIRU5USUNBVElPTiIsCisJIkVOQ1JZUFQiLCAiTkVXLUVOVklST04iLAorCTAsCit9OworI2RlZmluZQlURUxPUFRfRklSU1QJVEVMT1BUX0JJTkFSWQorI2RlZmluZQlURUxPUFRfTEFTVAlURUxPUFRfTkVXX0VOVklST04KKyNkZWZpbmUJVEVMT1BUX09LKHgpCSgodW5zaWduZWQgaW50KSh4KSA8PSBURUxPUFRfTEFTVCkKKyNkZWZpbmUJVEVMT1BUKHgpCXRlbG9wdHNbKHgpLVRFTE9QVF9GSVJTVF0KKyNlbmRpZgorCisvKiBzdWItb3B0aW9uIHF1YWxpZmllcnMgKi8KKyNkZWZpbmUJVEVMUVVBTF9JUwkwCS8qIG9wdGlvbiBpcy4uLiAqLworI2RlZmluZQlURUxRVUFMX1NFTkQJMQkvKiBzZW5kIG9wdGlvbiAqLworI2RlZmluZQlURUxRVUFMX0lORk8JMgkvKiBFTlZJUk9OOiBpbmZvcm1hdGlvbmFsIHZlcnNpb24gb2YgSVMgKi8KKyNkZWZpbmUJVEVMUVVBTF9SRVBMWQkyCS8qIEFVVEhFTlRJQ0FUSU9OOiBjbGllbnQgdmVyc2lvbiBvZiBJUyAqLworI2RlZmluZQlURUxRVUFMX05BTUUJMwkvKiBBVVRIRU5USUNBVElPTjogY2xpZW50IHZlcnNpb24gb2YgSVMgKi8KKworI2RlZmluZQlMRkxPV19PRkYJCTAJLyogRGlzYWJsZSByZW1vdGUgZmxvdyBjb250cm9sICovCisjZGVmaW5lCUxGTE9XX09OCQkxCS8qIEVuYWJsZSByZW1vdGUgZmxvdyBjb250cm9sICovCisjZGVmaW5lCUxGTE9XX1JFU1RBUlRfQU5ZCTIJLyogUmVzdGFydCBvdXRwdXQgb24gYW55IGNoYXIgKi8KKyNkZWZpbmUJTEZMT1dfUkVTVEFSVF9YT04JMwkvKiBSZXN0YXJ0IG91dHB1dCBvbmx5IG9uIFhPTiAqLworCisvKgorICogTElORU1PREUgc3Vib3B0aW9ucworICovCisKKyNkZWZpbmUJTE1fTU9ERQkJMQorI2RlZmluZQlMTV9GT1JXQVJETUFTSwkyCisjZGVmaW5lCUxNX1NMQwkJMworCisjZGVmaW5lCU1PREVfRURJVAkweDAxCisjZGVmaW5lCU1PREVfVFJBUFNJRwkweDAyCisjZGVmaW5lCU1PREVfQUNLCTB4MDQKKyNkZWZpbmUgTU9ERV9TT0ZUX1RBQgkweDA4CisjZGVmaW5lIE1PREVfTElUX0VDSE8JMHgxMAorCisjZGVmaW5lCU1PREVfTUFTSwkweDFmCisKKy8qIE5vdCBwYXJ0IG9mIHByb3RvY29sLCBidXQgbmVlZGVkIHRvIHNpbXBsaWZ5IHRoaW5ncy4uLiAqLworI2RlZmluZSBNT0RFX0ZMT1cJCTB4MDEwMAorI2RlZmluZSBNT0RFX0VDSE8JCTB4MDIwMAorI2RlZmluZSBNT0RFX0lOQklOCQkweDA0MDAKKyNkZWZpbmUgTU9ERV9PVVRCSU4JCTB4MDgwMAorI2RlZmluZSBNT0RFX0ZPUkNFCQkweDEwMDAKKworI2RlZmluZQlTTENfU1lOQ0gJMQorI2RlZmluZQlTTENfQlJLCQkyCisjZGVmaW5lCVNMQ19JUAkJMworI2RlZmluZQlTTENfQU8JCTQKKyNkZWZpbmUJU0xDX0FZVAkJNQorI2RlZmluZQlTTENfRU9SCQk2CisjZGVmaW5lCVNMQ19BQk9SVAk3CisjZGVmaW5lCVNMQ19FT0YJCTgKKyNkZWZpbmUJU0xDX1NVU1AJOQorI2RlZmluZQlTTENfRUMJCTEwCisjZGVmaW5lCVNMQ19FTAkJMTEKKyNkZWZpbmUJU0xDX0VXCQkxMgorI2RlZmluZQlTTENfUlAJCTEzCisjZGVmaW5lCVNMQ19MTkVYVAkxNAorI2RlZmluZQlTTENfWE9OCQkxNQorI2RlZmluZQlTTENfWE9GRgkxNgorI2RlZmluZQlTTENfRk9SVzEJMTcKKyNkZWZpbmUJU0xDX0ZPUlcyCTE4CisKKyNkZWZpbmUJTlNMQwkJMTgKKworLyoKKyAqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UgZGVmaW5lIFNMQ19OQU1FUyB0byBiZSB0aGUKKyAqIGxpc3Qgb2YgbmFtZXMgaWYgU0xDX05BTUVTIGlzIG5vdCBkZWZpbmVkLgorICovCisjZGVmaW5lCVNMQ19OQU1FTElTVAkiMCIsICJTWU5DSCIsICJCUksiLCAiSVAiLCAiQU8iLCAiQVlUIiwgIkVPUiIsIFwKKwkJCSJBQk9SVCIsICJFT0YiLCAiU1VTUCIsICJFQyIsICJFTCIsICJFVyIsICJSUCIsIFwKKwkJCSJMTkVYVCIsICJYT04iLCAiWE9GRiIsICJGT1JXMSIsICJGT1JXMiIsIDAsCisjaWZkZWYJU0xDX05BTUVTCitjaGFyICpzbGNfbmFtZXNbXSA9IHsKKwlTTENfTkFNRUxJU1QKK307CisjZWxzZQorZXh0ZXJuIGNoYXIgKnNsY19uYW1lc1tdOworI2RlZmluZQlTTENfTkFNRVMgU0xDX05BTUVMSVNUCisjZW5kaWYKKworI2RlZmluZQlTTENfTkFNRV9PSyh4KQkoKHVuc2lnbmVkIGludCkoeCkgPD0gTlNMQykKKyNkZWZpbmUgU0xDX05BTUUoeCkJc2xjX25hbWVzW3hdCisKKyNkZWZpbmUJU0xDX05PU1VQUE9SVAkwCisjZGVmaW5lCVNMQ19DQU5UQ0hBTkdFCTEKKyNkZWZpbmUJU0xDX1ZBUklBQkxFCTIKKyNkZWZpbmUJU0xDX0RFRkFVTFQJMworI2RlZmluZQlTTENfTEVWRUxCSVRTCTB4MDMKKworI2RlZmluZQlTTENfRlVOQwkwCisjZGVmaW5lCVNMQ19GTEFHUwkxCisjZGVmaW5lCVNMQ19WQUxVRQkyCisKKyNkZWZpbmUJU0xDX0FDSwkJMHg4MAorI2RlZmluZQlTTENfRkxVU0hJTgkweDQwCisjZGVmaW5lCVNMQ19GTFVTSE9VVAkweDIwCisKKyNkZWZpbmUJT0xEX0VOVl9WQVIJMQorI2RlZmluZQlPTERfRU5WX1ZBTFVFCTAKKyNkZWZpbmUJTkVXX0VOVl9WQVIJMAorI2RlZmluZQlORVdfRU5WX1ZBTFVFCTEKKyNkZWZpbmUJRU5WX0VTQwkJMgorI2RlZmluZSBFTlZfVVNFUlZBUgkzCisKKy8qCisgKiBBVVRIRU5USUNBVElPTiBzdWJvcHRpb25zCisgKi8KKworLyoKKyAqIFdobyBpcyBhdXRoZW50aWNhdGluZyB3aG8gLi4uCisgKi8KKyNkZWZpbmUJQVVUSF9XSE9fQ0xJRU5UCQkwCS8qIENsaWVudCBhdXRoZW50aWNhdGluZyBzZXJ2ZXIgKi8KKyNkZWZpbmUJQVVUSF9XSE9fU0VSVkVSCQkxCS8qIFNlcnZlciBhdXRoZW50aWNhdGluZyBjbGllbnQgKi8KKyNkZWZpbmUJQVVUSF9XSE9fTUFTSwkJMQorCisvKgorICogYW1vdW50IG9mIGF1dGhlbnRpY2F0aW9uIGRvbmUKKyAqLworI2RlZmluZQlBVVRIX0hPV19PTkVfV0FZCTAKKyNkZWZpbmUJQVVUSF9IT1dfTVVUVUFMCQkyCisjZGVmaW5lCUFVVEhfSE9XX01BU0sJCTIKKworI2RlZmluZQlBVVRIVFlQRV9OVUxMCQkwCisjZGVmaW5lCUFVVEhUWVBFX0tFUkJFUk9TX1Y0CTEKKyNkZWZpbmUJQVVUSFRZUEVfS0VSQkVST1NfVjUJMgorI2RlZmluZQlBVVRIVFlQRV9TUFgJCTMKKyNkZWZpbmUJQVVUSFRZUEVfTUlOSwkJNAorI2RlZmluZQlBVVRIVFlQRV9DTlQJCTUKKworI2RlZmluZQlBVVRIVFlQRV9URVNUCQk5OQorCisjaWZkZWYJQVVUSF9OQU1FUworY2hhciAqYXV0aHR5cGVfbmFtZXNbXSA9IHsKKwkiTlVMTCIsICJLRVJCRVJPU19WNCIsICJLRVJCRVJPU19WNSIsICJTUFgiLCAiTUlOSyIsIDAsCit9OworI2Vsc2UKK2V4dGVybiBjaGFyICphdXRodHlwZV9uYW1lc1tdOworI2VuZGlmCisKKyNkZWZpbmUJQVVUSFRZUEVfTkFNRV9PSyh4KQkoKHVuc2lnbmVkIGludCkoeCkgPCBBVVRIVFlQRV9DTlQpCisjZGVmaW5lCUFVVEhUWVBFX05BTUUoeCkJYXV0aHR5cGVfbmFtZXNbeF0KKworLyoKKyAqIEVOQ1JZUFRpb24gc3Vib3B0aW9ucworICovCisjZGVmaW5lCUVOQ1JZUFRfSVMJCTAJLyogSSBwaWNrIGVuY3J5cHRpb24gdHlwZSAuLi4gKi8KKyNkZWZpbmUJRU5DUllQVF9TVVBQT1JUCQkxCS8qIEkgc3VwcG9ydCBlbmNyeXB0aW9uIHR5cGVzIC4uLiAqLworI2RlZmluZQlFTkNSWVBUX1JFUExZCQkyCS8qIEluaXRpYWwgc2V0dXAgcmVzcG9uc2UgKi8KKyNkZWZpbmUJRU5DUllQVF9TVEFSVAkJMwkvKiBBbSBzdGFydGluZyB0byBzZW5kIGVuY3J5cHRlZCAqLworI2RlZmluZQlFTkNSWVBUX0VORAkJNAkvKiBBbSBlbmRpbmcgZW5jcnlwdGVkICovCisjZGVmaW5lCUVOQ1JZUFRfUkVRU1RBUlQJNQkvKiBSZXF1ZXN0IHlvdSBzdGFydCBlbmNyeXB0aW5nICovCisjZGVmaW5lCUVOQ1JZUFRfUkVRRU5ECQk2CS8qIFJlcXVlc3QgeW91IHNlbmQgZW5jcnlwdGluZyAqLworI2RlZmluZQlFTkNSWVBUX0VOQ19LRVlJRAk3CisjZGVmaW5lCUVOQ1JZUFRfREVDX0tFWUlECTgKKyNkZWZpbmUJRU5DUllQVF9DTlQJCTkKKworI2RlZmluZQlFTkNUWVBFX0FOWQkJMAorI2RlZmluZQlFTkNUWVBFX0RFU19DRkI2NAkxCisjZGVmaW5lCUVOQ1RZUEVfREVTX09GQjY0CTIKKyNkZWZpbmUJRU5DVFlQRV9DTlQJCTMKKworI2lmZGVmCUVOQ1JZUFRfTkFNRVMKK2NoYXIgKmVuY3J5cHRfbmFtZXNbXSA9IHsKKwkiSVMiLCAiU1VQUE9SVCIsICJSRVBMWSIsICJTVEFSVCIsICJFTkQiLAorCSJSRVFVRVNULVNUQVJUIiwgIlJFUVVFU1QtRU5EIiwgIkVOQy1LRVlJRCIsICJERUMtS0VZSUQiLAorCTAsCit9OworY2hhciAqZW5jdHlwZV9uYW1lc1tdID0geworCSJBTlkiLCAiREVTX0NGQjY0IiwgICJERVNfT0ZCNjQiLCAgMCwKK307CisjZWxzZQorZXh0ZXJuIGNoYXIgKmVuY3J5cHRfbmFtZXNbXTsKK2V4dGVybiBjaGFyICplbmN0eXBlX25hbWVzW107CisjZW5kaWYKKworCisjZGVmaW5lCUVOQ1JZUFRfTkFNRV9PSyh4KQkoKHVuc2lnbmVkIGludCkoeCkgPCBFTkNSWVBUX0NOVCkKKyNkZWZpbmUJRU5DUllQVF9OQU1FKHgpCQllbmNyeXB0X25hbWVzW3hdCisKKyNkZWZpbmUJRU5DVFlQRV9OQU1FX09LKHgpCSgodW5zaWduZWQgaW50KSh4KSA8IEVOQ1RZUEVfQ05UKQorI2RlZmluZQlFTkNUWVBFX05BTUUoeCkJCWVuY3R5cGVfbmFtZXNbeF0KKworI2VuZGlmIC8qIGFycGEvdGVsbmV0LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS90ZnRwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvdGZ0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYjA1NTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvdGZ0cC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGZ0cC5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICovCisKKyNpZm5kZWYgX0FSUEFfVEZUUF9ICisjZGVmaW5lCV9BUlBBX1RGVFBfSCAxCisKKy8qCisgKiBUcml2aWFsIEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wgKElFTi0xMzMpCisgKi8KKyNkZWZpbmUJU0VHU0laRQkJNTEyCQkvKiBkYXRhIHNlZ21lbnQgc2l6ZSAqLworCisvKgorICogUGFja2V0IHR5cGVzLgorICovCisjZGVmaW5lCVJSUQkwMQkJCQkvKiByZWFkIHJlcXVlc3QgKi8KKyNkZWZpbmUJV1JRCTAyCQkJCS8qIHdyaXRlIHJlcXVlc3QgKi8KKyNkZWZpbmUJREFUQQkwMwkJCQkvKiBkYXRhIHBhY2tldCAqLworI2RlZmluZQlBQ0sJMDQJCQkJLyogYWNrbm93bGVkZ2VtZW50ICovCisjZGVmaW5lCUVSUk9SCTA1CQkJCS8qIGVycm9yIGNvZGUgKi8KKworc3RydWN0CXRmdHBoZHIgeworCXNob3J0CXRoX29wY29kZTsJCQkvKiBwYWNrZXQgdHlwZSAqLworCXVuaW9uIHsKKwkJdW5zaWduZWQgc2hvcnQJdHVfYmxvY2s7CS8qIGJsb2NrICMgKi8KKwkJc2hvcnQJdHVfY29kZTsJCS8qIGVycm9yIGNvZGUgKi8KKwkJY2hhcgl0dV9zdHVmZlsxXTsJCS8qIHJlcXVlc3QgcGFja2V0IHN0dWZmICovCisJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHRoX3U7CisJY2hhcgl0aF9kYXRhWzFdOwkJCS8qIGRhdGEgb3IgZXJyb3Igc3RyaW5nICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUJdGhfYmxvY2sJdGhfdS50dV9ibG9jaworI2RlZmluZQl0aF9jb2RlCQl0aF91LnR1X2NvZGUKKyNkZWZpbmUJdGhfc3R1ZmYJdGhfdS50dV9zdHVmZgorI2RlZmluZQl0aF9tc2cJCXRoX2RhdGEKKworLyoKKyAqIEVycm9yIGNvZGVzLgorICovCisjZGVmaW5lCUVVTkRFRgkJMAkJLyogbm90IGRlZmluZWQgKi8KKyNkZWZpbmUJRU5PVEZPVU5ECTEJCS8qIGZpbGUgbm90IGZvdW5kICovCisjZGVmaW5lCUVBQ0NFU1MJCTIJCS8qIGFjY2VzcyB2aW9sYXRpb24gKi8KKyNkZWZpbmUJRU5PU1BBQ0UJMwkJLyogZGlzayBmdWxsIG9yIGFsbG9jYXRpb24gZXhjZWVkZWQgKi8KKyNkZWZpbmUJRUJBRE9QCQk0CQkvKiBpbGxlZ2FsIFRGVFAgb3BlcmF0aW9uICovCisjZGVmaW5lCUVCQURJRAkJNQkJLyogdW5rbm93biB0cmFuc2ZlciBJRCAqLworI2RlZmluZQlFRVhJU1RTCQk2CQkvKiBmaWxlIGFscmVhZHkgZXhpc3RzICovCisjZGVmaW5lCUVOT1VTRVIJCTcJCS8qIG5vIHN1Y2ggdXNlciAqLworCisjZW5kaWYgLyogYXJwYS90ZnRwLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvYXV4dmVjLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OTU3M2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2F1eHZlYy5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfQVVYVkVDX0gKKy8qCisgKiBOb3QgYWxsIGFyY2hpdGVjdHVyZXMgbmVlZCB0aGVpciBvd24gYXV4dmVjLmgsIHRoZSBtb3N0CisgKiBjb21tb24gZGVmaW5pdGlvbnMgYXJlIGFscmVhZHkgaW4gbGludXgvYXV4dmVjLmguCisgKi8KKworI2VuZGlmIC8qIF9fQVNNX0dFTkVSSUNfQVVYVkVDX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvYml0c3BlcmxvbmcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvYml0c3BlcmxvbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODMyYzNjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9iaXRzcGVybG9uZy5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19CSVRTX1BFUl9MT05HCisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfQklUU19QRVJfTE9ORworCisvKgorICogVGhlcmUgc2VlbXMgdG8gYmUgbm8gd2F5IG9mIGRldGVjdGluZyB0aGlzIGF1dG9tYXRpY2FsbHkgZnJvbSB1c2VyCisgKiBzcGFjZSwgc28gNjQgYml0IGFyY2hpdGVjdHVyZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgaW4gdGhlaXIKKyAqIGJpdHNwZXJsb25nLmguIEluIHBhcnRpY3VsYXIsIGFuIGFyY2hpdGVjdHVyZSB0aGF0IHN1cHBvcnRzCisgKiBib3RoIDMyIGFuZCA2NCBiaXQgdXNlciBzcGFjZSBtdXN0IG5vdCByZWx5IG9uIENPTkZJR182NEJJVAorICogdG8gZGVjaWRlIGl0LCBidXQgcmF0aGVyIGNoZWNrIGEgY29tcGlsZXIgcHJvdmlkZWQgbWFjcm8uCisgKi8KKyNpZm5kZWYgX19CSVRTX1BFUl9MT05HCisjZGVmaW5lIF9fQklUU19QRVJfTE9ORyAzMgorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX0JJVFNfUEVSX0xPTkcgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvZXJybm8tYmFzZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9lcnJuby1iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxMTU5NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvZXJybm8tYmFzZS5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX0VSUk5PX0JBU0VfSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfRVJSTk9fQkFTRV9ICisKKyNkZWZpbmUJRVBFUk0JCSAxCS8qIE9wZXJhdGlvbiBub3QgcGVybWl0dGVkICovCisjZGVmaW5lCUVOT0VOVAkJIDIJLyogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSAqLworI2RlZmluZQlFU1JDSAkJIDMJLyogTm8gc3VjaCBwcm9jZXNzICovCisjZGVmaW5lCUVJTlRSCQkgNAkvKiBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCAqLworI2RlZmluZQlFSU8JCSA1CS8qIEkvTyBlcnJvciAqLworI2RlZmluZQlFTlhJTwkJIDYJLyogTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcyAqLworI2RlZmluZQlFMkJJRwkJIDcJLyogQXJndW1lbnQgbGlzdCB0b28gbG9uZyAqLworI2RlZmluZQlFTk9FWEVDCQkgOAkvKiBFeGVjIGZvcm1hdCBlcnJvciAqLworI2RlZmluZQlFQkFERgkJIDkJLyogQmFkIGZpbGUgbnVtYmVyICovCisjZGVmaW5lCUVDSElMRAkJMTAJLyogTm8gY2hpbGQgcHJvY2Vzc2VzICovCisjZGVmaW5lCUVBR0FJTgkJMTEJLyogVHJ5IGFnYWluICovCisjZGVmaW5lCUVOT01FTQkJMTIJLyogT3V0IG9mIG1lbW9yeSAqLworI2RlZmluZQlFQUNDRVMJCTEzCS8qIFBlcm1pc3Npb24gZGVuaWVkICovCisjZGVmaW5lCUVGQVVMVAkJMTQJLyogQmFkIGFkZHJlc3MgKi8KKyNkZWZpbmUJRU5PVEJMSwkJMTUJLyogQmxvY2sgZGV2aWNlIHJlcXVpcmVkICovCisjZGVmaW5lCUVCVVNZCQkxNgkvKiBEZXZpY2Ugb3IgcmVzb3VyY2UgYnVzeSAqLworI2RlZmluZQlFRVhJU1QJCTE3CS8qIEZpbGUgZXhpc3RzICovCisjZGVmaW5lCUVYREVWCQkxOAkvKiBDcm9zcy1kZXZpY2UgbGluayAqLworI2RlZmluZQlFTk9ERVYJCTE5CS8qIE5vIHN1Y2ggZGV2aWNlICovCisjZGVmaW5lCUVOT1RESVIJCTIwCS8qIE5vdCBhIGRpcmVjdG9yeSAqLworI2RlZmluZQlFSVNESVIJCTIxCS8qIElzIGEgZGlyZWN0b3J5ICovCisjZGVmaW5lCUVJTlZBTAkJMjIJLyogSW52YWxpZCBhcmd1bWVudCAqLworI2RlZmluZQlFTkZJTEUJCTIzCS8qIEZpbGUgdGFibGUgb3ZlcmZsb3cgKi8KKyNkZWZpbmUJRU1GSUxFCQkyNAkvKiBUb28gbWFueSBvcGVuIGZpbGVzICovCisjZGVmaW5lCUVOT1RUWQkJMjUJLyogTm90IGEgdHlwZXdyaXRlciAqLworI2RlZmluZQlFVFhUQlNZCQkyNgkvKiBUZXh0IGZpbGUgYnVzeSAqLworI2RlZmluZQlFRkJJRwkJMjcJLyogRmlsZSB0b28gbGFyZ2UgKi8KKyNkZWZpbmUJRU5PU1BDCQkyOAkvKiBObyBzcGFjZSBsZWZ0IG9uIGRldmljZSAqLworI2RlZmluZQlFU1BJUEUJCTI5CS8qIElsbGVnYWwgc2VlayAqLworI2RlZmluZQlFUk9GUwkJMzAJLyogUmVhZC1vbmx5IGZpbGUgc3lzdGVtICovCisjZGVmaW5lCUVNTElOSwkJMzEJLyogVG9vIG1hbnkgbGlua3MgKi8KKyNkZWZpbmUJRVBJUEUJCTMyCS8qIEJyb2tlbiBwaXBlICovCisjZGVmaW5lCUVET00JCTMzCS8qIE1hdGggYXJndW1lbnQgb3V0IG9mIGRvbWFpbiBvZiBmdW5jICovCisjZGVmaW5lCUVSQU5HRQkJMzQJLyogTWF0aCByZXN1bHQgbm90IHJlcHJlc2VudGFibGUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2Vycm5vLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzMzFjZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvZXJybm8uaApAQCAtMCwwICsxLDExMyBAQAorI2lmbmRlZiBfQVNNX0dFTkVSSUNfRVJSTk9fSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfRVJSTk9fSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZXJybm8tYmFzZS5oPgorCisjZGVmaW5lCUVERUFETEsJCTM1CS8qIFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyICovCisjZGVmaW5lCUVOQU1FVE9PTE9ORwkzNgkvKiBGaWxlIG5hbWUgdG9vIGxvbmcgKi8KKyNkZWZpbmUJRU5PTENLCQkzNwkvKiBObyByZWNvcmQgbG9ja3MgYXZhaWxhYmxlICovCisjZGVmaW5lCUVOT1NZUwkJMzgJLyogRnVuY3Rpb24gbm90IGltcGxlbWVudGVkICovCisjZGVmaW5lCUVOT1RFTVBUWQkzOQkvKiBEaXJlY3Rvcnkgbm90IGVtcHR5ICovCisjZGVmaW5lCUVMT09QCQk0MAkvKiBUb28gbWFueSBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCAqLworI2RlZmluZQlFV09VTERCTE9DSwlFQUdBSU4JLyogT3BlcmF0aW9uIHdvdWxkIGJsb2NrICovCisjZGVmaW5lCUVOT01TRwkJNDIJLyogTm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUgKi8KKyNkZWZpbmUJRUlEUk0JCTQzCS8qIElkZW50aWZpZXIgcmVtb3ZlZCAqLworI2RlZmluZQlFQ0hSTkcJCTQ0CS8qIENoYW5uZWwgbnVtYmVyIG91dCBvZiByYW5nZSAqLworI2RlZmluZQlFTDJOU1lOQwk0NQkvKiBMZXZlbCAyIG5vdCBzeW5jaHJvbml6ZWQgKi8KKyNkZWZpbmUJRUwzSExUCQk0NgkvKiBMZXZlbCAzIGhhbHRlZCAqLworI2RlZmluZQlFTDNSU1QJCTQ3CS8qIExldmVsIDMgcmVzZXQgKi8KKyNkZWZpbmUJRUxOUk5HCQk0OAkvKiBMaW5rIG51bWJlciBvdXQgb2YgcmFuZ2UgKi8KKyNkZWZpbmUJRVVOQVRDSAkJNDkJLyogUHJvdG9jb2wgZHJpdmVyIG5vdCBhdHRhY2hlZCAqLworI2RlZmluZQlFTk9DU0kJCTUwCS8qIE5vIENTSSBzdHJ1Y3R1cmUgYXZhaWxhYmxlICovCisjZGVmaW5lCUVMMkhMVAkJNTEJLyogTGV2ZWwgMiBoYWx0ZWQgKi8KKyNkZWZpbmUJRUJBREUJCTUyCS8qIEludmFsaWQgZXhjaGFuZ2UgKi8KKyNkZWZpbmUJRUJBRFIJCTUzCS8qIEludmFsaWQgcmVxdWVzdCBkZXNjcmlwdG9yICovCisjZGVmaW5lCUVYRlVMTAkJNTQJLyogRXhjaGFuZ2UgZnVsbCAqLworI2RlZmluZQlFTk9BTk8JCTU1CS8qIE5vIGFub2RlICovCisjZGVmaW5lCUVCQURSUUMJCTU2CS8qIEludmFsaWQgcmVxdWVzdCBjb2RlICovCisjZGVmaW5lCUVCQURTTFQJCTU3CS8qIEludmFsaWQgc2xvdCAqLworCisjZGVmaW5lCUVERUFETE9DSwlFREVBRExLCisKKyNkZWZpbmUJRUJGT05UCQk1OQkvKiBCYWQgZm9udCBmaWxlIGZvcm1hdCAqLworI2RlZmluZQlFTk9TVFIJCTYwCS8qIERldmljZSBub3QgYSBzdHJlYW0gKi8KKyNkZWZpbmUJRU5PREFUQQkJNjEJLyogTm8gZGF0YSBhdmFpbGFibGUgKi8KKyNkZWZpbmUJRVRJTUUJCTYyCS8qIFRpbWVyIGV4cGlyZWQgKi8KKyNkZWZpbmUJRU5PU1IJCTYzCS8qIE91dCBvZiBzdHJlYW1zIHJlc291cmNlcyAqLworI2RlZmluZQlFTk9ORVQJCTY0CS8qIE1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrICovCisjZGVmaW5lCUVOT1BLRwkJNjUJLyogUGFja2FnZSBub3QgaW5zdGFsbGVkICovCisjZGVmaW5lCUVSRU1PVEUJCTY2CS8qIE9iamVjdCBpcyByZW1vdGUgKi8KKyNkZWZpbmUJRU5PTElOSwkJNjcJLyogTGluayBoYXMgYmVlbiBzZXZlcmVkICovCisjZGVmaW5lCUVBRFYJCTY4CS8qIEFkdmVydGlzZSBlcnJvciAqLworI2RlZmluZQlFU1JNTlQJCTY5CS8qIFNybW91bnQgZXJyb3IgKi8KKyNkZWZpbmUJRUNPTU0JCTcwCS8qIENvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZCAqLworI2RlZmluZQlFUFJPVE8JCTcxCS8qIFByb3RvY29sIGVycm9yICovCisjZGVmaW5lCUVNVUxUSUhPUAk3MgkvKiBNdWx0aWhvcCBhdHRlbXB0ZWQgKi8KKyNkZWZpbmUJRURPVERPVAkJNzMJLyogUkZTIHNwZWNpZmljIGVycm9yICovCisjZGVmaW5lCUVCQURNU0cJCTc0CS8qIE5vdCBhIGRhdGEgbWVzc2FnZSAqLworI2RlZmluZQlFT1ZFUkZMT1cJNzUJLyogVmFsdWUgdG9vIGxhcmdlIGZvciBkZWZpbmVkIGRhdGEgdHlwZSAqLworI2RlZmluZQlFTk9UVU5JUQk3NgkvKiBOYW1lIG5vdCB1bmlxdWUgb24gbmV0d29yayAqLworI2RlZmluZQlFQkFERkQJCTc3CS8qIEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUgKi8KKyNkZWZpbmUJRVJFTUNIRwkJNzgJLyogUmVtb3RlIGFkZHJlc3MgY2hhbmdlZCAqLworI2RlZmluZQlFTElCQUNDCQk3OQkvKiBDYW4gbm90IGFjY2VzcyBhIG5lZWRlZCBzaGFyZWQgbGlicmFyeSAqLworI2RlZmluZQlFTElCQkFECQk4MAkvKiBBY2Nlc3NpbmcgYSBjb3JydXB0ZWQgc2hhcmVkIGxpYnJhcnkgKi8KKyNkZWZpbmUJRUxJQlNDTgkJODEJLyogLmxpYiBzZWN0aW9uIGluIGEub3V0IGNvcnJ1cHRlZCAqLworI2RlZmluZQlFTElCTUFYCQk4MgkvKiBBdHRlbXB0aW5nIHRvIGxpbmsgaW4gdG9vIG1hbnkgc2hhcmVkIGxpYnJhcmllcyAqLworI2RlZmluZQlFTElCRVhFQwk4MwkvKiBDYW5ub3QgZXhlYyBhIHNoYXJlZCBsaWJyYXJ5IGRpcmVjdGx5ICovCisjZGVmaW5lCUVJTFNFUQkJODQJLyogSWxsZWdhbCBieXRlIHNlcXVlbmNlICovCisjZGVmaW5lCUVSRVNUQVJUCTg1CS8qIEludGVycnVwdGVkIHN5c3RlbSBjYWxsIHNob3VsZCBiZSByZXN0YXJ0ZWQgKi8KKyNkZWZpbmUJRVNUUlBJUEUJODYJLyogU3RyZWFtcyBwaXBlIGVycm9yICovCisjZGVmaW5lCUVVU0VSUwkJODcJLyogVG9vIG1hbnkgdXNlcnMgKi8KKyNkZWZpbmUJRU5PVFNPQ0sJODgJLyogU29ja2V0IG9wZXJhdGlvbiBvbiBub24tc29ja2V0ICovCisjZGVmaW5lCUVERVNUQUREUlJFUQk4OQkvKiBEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkICovCisjZGVmaW5lCUVNU0dTSVpFCTkwCS8qIE1lc3NhZ2UgdG9vIGxvbmcgKi8KKyNkZWZpbmUJRVBST1RPVFlQRQk5MQkvKiBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQgKi8KKyNkZWZpbmUJRU5PUFJPVE9PUFQJOTIJLyogUHJvdG9jb2wgbm90IGF2YWlsYWJsZSAqLworI2RlZmluZQlFUFJPVE9OT1NVUFBPUlQJOTMJLyogUHJvdG9jb2wgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZQlFU09DS1ROT1NVUFBPUlQJOTQJLyogU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZQlFT1BOT1RTVVBQCTk1CS8qIE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRyYW5zcG9ydCBlbmRwb2ludCAqLworI2RlZmluZQlFUEZOT1NVUFBPUlQJOTYJLyogUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUJRUFGTk9TVVBQT1JUCTk3CS8qIEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wgKi8KKyNkZWZpbmUJRUFERFJJTlVTRQk5OAkvKiBBZGRyZXNzIGFscmVhZHkgaW4gdXNlICovCisjZGVmaW5lCUVBRERSTk9UQVZBSUwJOTkJLyogQ2Fubm90IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcyAqLworI2RlZmluZQlFTkVURE9XTgkxMDAJLyogTmV0d29yayBpcyBkb3duICovCisjZGVmaW5lCUVORVRVTlJFQUNICTEwMQkvKiBOZXR3b3JrIGlzIHVucmVhY2hhYmxlICovCisjZGVmaW5lCUVORVRSRVNFVAkxMDIJLyogTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gYmVjYXVzZSBvZiByZXNldCAqLworI2RlZmluZQlFQ09OTkFCT1JURUQJMTAzCS8qIFNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0ICovCisjZGVmaW5lCUVDT05OUkVTRVQJMTA0CS8qIENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciAqLworI2RlZmluZQlFTk9CVUZTCQkxMDUJLyogTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSAqLworI2RlZmluZQlFSVNDT05OCQkxMDYJLyogVHJhbnNwb3J0IGVuZHBvaW50IGlzIGFscmVhZHkgY29ubmVjdGVkICovCisjZGVmaW5lCUVOT1RDT05OCTEwNwkvKiBUcmFuc3BvcnQgZW5kcG9pbnQgaXMgbm90IGNvbm5lY3RlZCAqLworI2RlZmluZQlFU0hVVERPV04JMTA4CS8qIENhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biAqLworI2RlZmluZQlFVE9PTUFOWVJFRlMJMTA5CS8qIFRvbyBtYW55IHJlZmVyZW5jZXM6IGNhbm5vdCBzcGxpY2UgKi8KKyNkZWZpbmUJRVRJTUVET1VUCTExMAkvKiBDb25uZWN0aW9uIHRpbWVkIG91dCAqLworI2RlZmluZQlFQ09OTlJFRlVTRUQJMTExCS8qIENvbm5lY3Rpb24gcmVmdXNlZCAqLworI2RlZmluZQlFSE9TVERPV04JMTEyCS8qIEhvc3QgaXMgZG93biAqLworI2RlZmluZQlFSE9TVFVOUkVBQ0gJMTEzCS8qIE5vIHJvdXRlIHRvIGhvc3QgKi8KKyNkZWZpbmUJRUFMUkVBRFkJMTE0CS8qIE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzICovCisjZGVmaW5lCUVJTlBST0dSRVNTCTExNQkvKiBPcGVyYXRpb24gbm93IGluIHByb2dyZXNzICovCisjZGVmaW5lCUVTVEFMRQkJMTE2CS8qIFN0YWxlIE5GUyBmaWxlIGhhbmRsZSAqLworI2RlZmluZQlFVUNMRUFOCQkxMTcJLyogU3RydWN0dXJlIG5lZWRzIGNsZWFuaW5nICovCisjZGVmaW5lCUVOT1ROQU0JCTExOAkvKiBOb3QgYSBYRU5JWCBuYW1lZCB0eXBlIGZpbGUgKi8KKyNkZWZpbmUJRU5BVkFJTAkJMTE5CS8qIE5vIFhFTklYIHNlbWFwaG9yZXMgYXZhaWxhYmxlICovCisjZGVmaW5lCUVJU05BTQkJMTIwCS8qIElzIGEgbmFtZWQgdHlwZSBmaWxlICovCisjZGVmaW5lCUVSRU1PVEVJTwkxMjEJLyogUmVtb3RlIEkvTyBlcnJvciAqLworI2RlZmluZQlFRFFVT1QJCTEyMgkvKiBRdW90YSBleGNlZWRlZCAqLworCisjZGVmaW5lCUVOT01FRElVTQkxMjMJLyogTm8gbWVkaXVtIGZvdW5kICovCisjZGVmaW5lCUVNRURJVU1UWVBFCTEyNAkvKiBXcm9uZyBtZWRpdW0gdHlwZSAqLworI2RlZmluZQlFQ0FOQ0VMRUQJMTI1CS8qIE9wZXJhdGlvbiBDYW5jZWxlZCAqLworI2RlZmluZQlFTk9LRVkJCTEyNgkvKiBSZXF1aXJlZCBrZXkgbm90IGF2YWlsYWJsZSAqLworI2RlZmluZQlFS0VZRVhQSVJFRAkxMjcJLyogS2V5IGhhcyBleHBpcmVkICovCisjZGVmaW5lCUVLRVlSRVZPS0VECTEyOAkvKiBLZXkgaGFzIGJlZW4gcmV2b2tlZCAqLworI2RlZmluZQlFS0VZUkVKRUNURUQJMTI5CS8qIEtleSB3YXMgcmVqZWN0ZWQgYnkgc2VydmljZSAqLworCisvKiBmb3Igcm9idXN0IG11dGV4ZXMgKi8KKyNkZWZpbmUJRU9XTkVSREVBRAkxMzAJLyogT3duZXIgZGllZCAqLworI2RlZmluZQlFTk9UUkVDT1ZFUkFCTEUJMTMxCS8qIFN0YXRlIG5vdCByZWNvdmVyYWJsZSAqLworCisjZGVmaW5lIEVSRktJTEwJCTEzMgkvKiBPcGVyYXRpb24gbm90IHBvc3NpYmxlIGR1ZSB0byBSRi1raWxsICovCisKKyNkZWZpbmUgRUhXUE9JU09OCTEzMwkvKiBNZW1vcnkgcGFnZSBoYXMgaGFyZHdhcmUgZXJyb3IgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU1YjAzNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvZmNudGwuaApAQCAtMCwwICsxLDE5NSBAQAorI2lmbmRlZiBfQVNNX0dFTkVSSUNfRkNOVExfSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfRkNOVExfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIEZNT0RFX0VYRUMgaXMgMHgyMAorICogRk1PREVfTk9OT1RJRlkgaXMgMHgxMDAwMDAwCisgKiBUaGVzZSBjYW5ub3QgYmUgdXNlZCBieSB1c2Vyc3BhY2UgT18qIHVudGlsIGludGVybmFsIGFuZCBleHRlcm5hbCBvcGVuCisgKiBmbGFncyBhcmUgc3BsaXQuCisgKiAtRXJpYyBQYXJpcworICovCisKKy8qCisgKiBXaGVuIGludHJvZHVjaW5nIG5ldyBPXyogYml0cywgcGxlYXNlIGNoZWNrIGl0cyB1bmlxdWVuZXNzIGluIGZjbnRsX2luaXQoKS4KKyAqLworCisjZGVmaW5lIE9fQUNDTU9ERQkwMDAwMDAwMworI2RlZmluZSBPX1JET05MWQkwMDAwMDAwMAorI2RlZmluZSBPX1dST05MWQkwMDAwMDAwMQorI2RlZmluZSBPX1JEV1IJCTAwMDAwMDAyCisjaWZuZGVmIE9fQ1JFQVQKKyNkZWZpbmUgT19DUkVBVAkJMDAwMDAxMDAJLyogbm90IGZjbnRsICovCisjZW5kaWYKKyNpZm5kZWYgT19FWENMCisjZGVmaW5lIE9fRVhDTAkJMDAwMDAyMDAJLyogbm90IGZjbnRsICovCisjZW5kaWYKKyNpZm5kZWYgT19OT0NUVFkKKyNkZWZpbmUgT19OT0NUVFkJMDAwMDA0MDAJLyogbm90IGZjbnRsICovCisjZW5kaWYKKyNpZm5kZWYgT19UUlVOQworI2RlZmluZSBPX1RSVU5DCQkwMDAwMTAwMAkvKiBub3QgZmNudGwgKi8KKyNlbmRpZgorI2lmbmRlZiBPX0FQUEVORAorI2RlZmluZSBPX0FQUEVORAkwMDAwMjAwMAorI2VuZGlmCisjaWZuZGVmIE9fTk9OQkxPQ0sKKyNkZWZpbmUgT19OT05CTE9DSwkwMDAwNDAwMAorI2VuZGlmCisjaWZuZGVmIE9fRFNZTkMKKyNkZWZpbmUgT19EU1lOQwkJMDAwMTAwMDAJLyogdXNlZCB0byBiZSBPX1NZTkMsIHNlZSBiZWxvdyAqLworI2VuZGlmCisjaWZuZGVmIEZBU1lOQworI2RlZmluZSBGQVNZTkMJCTAwMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KKyNlbmRpZgorI2lmbmRlZiBPX0RJUkVDVAorI2RlZmluZSBPX0RJUkVDVAkwMDA0MDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLworI2VuZGlmCisjaWZuZGVmIE9fTEFSR0VGSUxFCisjZGVmaW5lIE9fTEFSR0VGSUxFCTAwMTAwMDAwCisjZW5kaWYKKyNpZm5kZWYgT19ESVJFQ1RPUlkKKyNkZWZpbmUgT19ESVJFQ1RPUlkJMDAyMDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLworI2VuZGlmCisjaWZuZGVmIE9fTk9GT0xMT1cKKyNkZWZpbmUgT19OT0ZPTExPVwkwMDQwMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KKyNlbmRpZgorI2lmbmRlZiBPX05PQVRJTUUKKyNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCisjZW5kaWYKKyNpZm5kZWYgT19DTE9FWEVDCisjZGVmaW5lIE9fQ0xPRVhFQwkwMjAwMDAwMAkvKiBzZXQgY2xvc2Vfb25fZXhlYyAqLworI2VuZGlmCisKKy8qCisgKiBCZWZvcmUgTGludXggMi42LjMzIG9ubHkgT19EU1lOQyBzZW1hbnRpY3Mgd2VyZSBpbXBsZW1lbnRlZCwgYnV0IHVzaW5nCisgKiB0aGUgT19TWU5DIGZsYWcuICBXZSBjb250aW51ZSB0byB1c2UgdGhlIGV4aXN0aW5nIG51bWVyaWNhbCB2YWx1ZQorICogZm9yIE9fRFNZTkMgc2VtYW50aWNzIG5vdywgYnV0IHVzaW5nIHRoZSBjb3JyZWN0IHN5bWJvbGljIG5hbWUgZm9yIGl0LgorICogVGhpcyBuZXcgdmFsdWUgaXMgdXNlZCB0byByZXF1ZXN0IHRydWUgUG9zaXggT19TWU5DIHNlbWFudGljcy4gIEl0IGlzCisgKiBkZWZpbmVkIGluIHRoaXMgc3RyYW5nZSB3YXkgdG8gbWFrZSBzdXJlIGFwcGxpY2F0aW9ucyBjb21waWxlZCBhZ2FpbnN0CisgKiBuZXcgaGVhZGVycyBnZXQgYXQgbGVhc3QgT19EU1lOQyBzZW1hbnRpY3Mgb24gb2xkZXIga2VybmVscy4KKyAqCisgKiBUaGlzIGhhcyB0aGUgbmljZSBzaWRlLWVmZmVjdCB0aGF0IHdlIGNhbiBzaW1wbHkgdGVzdCBmb3IgT19EU1lOQworICogd2hlcmV2ZXIgd2UgZG8gbm90IGNhcmUgaWYgT19EU1lOQyBvciBPX1NZTkMgaXMgdXNlZC4KKyAqCisgKiBOb3RlOiBfX09fU1lOQyBtdXN0IG5ldmVyIGJlIHVzZWQgZGlyZWN0bHkuCisgKi8KKyNpZm5kZWYgT19TWU5DCisjZGVmaW5lIF9fT19TWU5DCTA0MDAwMDAwCisjZGVmaW5lIE9fU1lOQwkJKF9fT19TWU5DfE9fRFNZTkMpCisjZW5kaWYKKworI2lmbmRlZiBPX1BBVEgKKyNkZWZpbmUgT19QQVRICQkwMTAwMDAwMDAKKyNlbmRpZgorCisjaWZuZGVmIE9fTkRFTEFZCisjZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKKyNlbmRpZgorCisjZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCisjZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KKyNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLworI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCisjZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KKyNpZm5kZWYgRl9HRVRMSworI2RlZmluZSBGX0dFVExLCQk1CisjZGVmaW5lIEZfU0VUTEsJCTYKKyNkZWZpbmUgRl9TRVRMS1cJNworI2VuZGlmCisjaWZuZGVmIEZfU0VUT1dOCisjZGVmaW5lIEZfU0VUT1dOCTgJLyogZm9yIHNvY2tldHMuICovCisjZGVmaW5lIEZfR0VUT1dOCTkJLyogZm9yIHNvY2tldHMuICovCisjZW5kaWYKKyNpZm5kZWYgRl9TRVRTSUcKKyNkZWZpbmUgRl9TRVRTSUcJMTAJLyogZm9yIHNvY2tldHMuICovCisjZGVmaW5lIEZfR0VUU0lHCTExCS8qIGZvciBzb2NrZXRzLiAqLworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHXzY0QklUCisjaWZuZGVmIEZfR0VUTEs2NAorI2RlZmluZSBGX0dFVExLNjQJMTIJLyogIHVzaW5nICdzdHJ1Y3QgZmxvY2s2NCcgKi8KKyNkZWZpbmUgRl9TRVRMSzY0CTEzCisjZGVmaW5lIEZfU0VUTEtXNjQJMTQKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRl9TRVRPV05fRVgKKyNkZWZpbmUgRl9TRVRPV05fRVgJMTUKKyNkZWZpbmUgRl9HRVRPV05fRVgJMTYKKyNlbmRpZgorCisjZGVmaW5lIEZfT1dORVJfVElECTAKKyNkZWZpbmUgRl9PV05FUl9QSUQJMQorI2RlZmluZSBGX09XTkVSX1BHUlAJMgorCitzdHJ1Y3QgZl9vd25lcl9leCB7CisJaW50CXR5cGU7CisJX19rZXJuZWxfcGlkX3QJcGlkOworfTsKKworLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KKyNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLworCisvKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLworI2lmbmRlZiBGX1JETENLCisjZGVmaW5lIEZfUkRMQ0sJCTAKKyNkZWZpbmUgRl9XUkxDSwkJMQorI2RlZmluZSBGX1VOTENLCQkyCisjZW5kaWYKKworLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KKyNpZm5kZWYgRl9FWExDSworI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KKyNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCisjZW5kaWYKKworLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCisjZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KKyNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLworI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKKwkJCQkgICBibG9ja2luZyAqLworI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCisKKyNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgLi4uICovCisjZGVmaW5lIExPQ0tfUkVBRAk2NAkvKiB3aGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogd2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLworI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogd2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCAmIHdyaXRlIG9wcyAqLworCisjZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0CisKKyNpZm5kZWYgSEFWRV9BUkNIX1NUUlVDVF9GTE9DSworI2lmbmRlZiBfX0FSQ0hfRkxPQ0tfUEFECisjZGVmaW5lIF9fQVJDSF9GTE9DS19QQUQKKyNlbmRpZgorCitzdHJ1Y3QgZmxvY2sgeworCXNob3J0CWxfdHlwZTsKKwlzaG9ydAlsX3doZW5jZTsKKwlfX2tlcm5lbF9vZmZfdAlsX3N0YXJ0OworCV9fa2VybmVsX29mZl90CWxfbGVuOworCV9fa2VybmVsX3BpZF90CWxfcGlkOworCV9fQVJDSF9GTE9DS19QQUQKK307CisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfNjRCSVQKKworI2lmbmRlZiBIQVZFX0FSQ0hfU1RSVUNUX0ZMT0NLNjQKKyNpZm5kZWYgX19BUkNIX0ZMT0NLNjRfUEFECisjZGVmaW5lIF9fQVJDSF9GTE9DSzY0X1BBRAorI2VuZGlmCisKK3N0cnVjdCBmbG9jazY0IHsKKwlzaG9ydCAgbF90eXBlOworCXNob3J0ICBsX3doZW5jZTsKKwlfX2tlcm5lbF9sb2ZmX3QgbF9zdGFydDsKKwlfX2tlcm5lbF9sb2ZmX3QgbF9sZW47CisJX19rZXJuZWxfcGlkX3QgIGxfcGlkOworCV9fQVJDSF9GTE9DSzY0X1BBRAorfTsKKyNlbmRpZgorI2VuZGlmIC8qICFDT05GSUdfNjRCSVQgKi8KKworI2VuZGlmIC8qIF9BU01fR0VORVJJQ19GQ05UTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2ludC1sNjQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW50LWw2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzFhZTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2ludC1sNjQuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogYXNtLWdlbmVyaWMvaW50LWw2NC5oCisgKgorICogSW50ZWdlciBkZWNsYXJhdGlvbnMgZm9yIGFyY2hpdGVjdHVyZXMgd2hpY2ggdXNlICJsb25nIgorICogZm9yIDY0LWJpdCB0eXBlcy4KKyAqLworCisjaWZuZGVmIF9BU01fR0VORVJJQ19JTlRfTDY0X0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX0lOVF9MNjRfSAorCisjaW5jbHVkZSA8YXNtL2JpdHNwZXJsb25nLmg+CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisvKgorICogX194eCBpcyBvazogaXQgZG9lc24ndCBwb2xsdXRlIHRoZSBQT1NJWCBuYW1lc3BhY2UuIFVzZSB0aGVzZSBpbiB0aGUKKyAqIGhlYWRlciBmaWxlcyBleHBvcnRlZCB0byB1c2VyIHNwYWNlCisgKi8KKwordHlwZWRlZiBfX3NpZ25lZF9fIGNoYXIgX19zODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX3U4OworCit0eXBlZGVmIF9fc2lnbmVkX18gc2hvcnQgX19zMTY7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fdTE2OworCit0eXBlZGVmIF9fc2lnbmVkX18gaW50IF9fczMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX191MzI7CisKK3R5cGVkZWYgX19zaWduZWRfXyBsb25nIF9fczY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIF9fdTY0OworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKworI2VuZGlmIC8qIF9BU01fR0VORVJJQ19JTlRfTDY0X0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW50LWxsNjQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW50LWxsNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWRlMDQ3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9pbnQtbGw2NC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBhc20tZ2VuZXJpYy9pbnQtbGw2NC5oCisgKgorICogSW50ZWdlciBkZWNsYXJhdGlvbnMgZm9yIGFyY2hpdGVjdHVyZXMgd2hpY2ggdXNlICJsb25nIGxvbmciCisgKiBmb3IgNjQtYml0IHR5cGVzLgorICovCisKKyNpZm5kZWYgX0FTTV9HRU5FUklDX0lOVF9MTDY0X0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX0lOVF9MTDY0X0gKKworI2luY2x1ZGUgPGFzbS9iaXRzcGVybG9uZy5oPgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworLyoKKyAqIF9feHggaXMgb2s6IGl0IGRvZXNuJ3QgcG9sbHV0ZSB0aGUgUE9TSVggbmFtZXNwYWNlLiBVc2UgdGhlc2UgaW4gdGhlCisgKiBoZWFkZXIgZmlsZXMgZXhwb3J0ZWQgdG8gdXNlciBzcGFjZQorICovCisKK3R5cGVkZWYgX19zaWduZWRfXyBjaGFyIF9fczg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX191ODsKKwordHlwZWRlZiBfX3NpZ25lZF9fIHNob3J0IF9fczE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX3UxNjsKKwordHlwZWRlZiBfX3NpZ25lZF9fIGludCBfX3MzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IF9fdTMyOworCisjaWZkZWYgX19HTlVDX18KK19fZXh0ZW5zaW9uX18gdHlwZWRlZiBfX3NpZ25lZF9fIGxvbmcgbG9uZyBfX3M2NDsKK19fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgX191NjQ7CisjZWxzZQordHlwZWRlZiBfX3NpZ25lZF9fIGxvbmcgbG9uZyBfX3M2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9fdTY0OworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworCisjZW5kaWYgLyogX0FTTV9HRU5FUklDX0lOVF9MTDY0X0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW9jdGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGEyYzdkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9pb2N0bC5oCkBAIC0wLDAgKzEsOTYgQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX0lPQ1RMX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX0lPQ1RMX0gKKworLyogaW9jdGwgY29tbWFuZCBlbmNvZGluZzogMzIgYml0cyB0b3RhbCwgY29tbWFuZCBpbiBsb3dlciAxNiBiaXRzLAorICogc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBpbiB0aGUgbG93ZXIgMTQgYml0cyBvZiB0aGUKKyAqIHVwcGVyIDE2IGJpdHMuCisgKiBFbmNvZGluZyB0aGUgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBpbiB0aGUgaW9jdGwgcmVxdWVzdAorICogaXMgdXNlZnVsIGZvciBjYXRjaGluZyBwcm9ncmFtcyBjb21waWxlZCB3aXRoIG9sZCB2ZXJzaW9ucworICogYW5kIHRvIGF2b2lkIG92ZXJ3cml0aW5nIHVzZXIgc3BhY2Ugb3V0c2lkZSB0aGUgdXNlciBidWZmZXIgYXJlYS4KKyAqIFRoZSBoaWdoZXN0IDIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIGluZGljYXRpbmcgdGhlIGBgYWNjZXNzIG1vZGUnJy4KKyAqIE5PVEU6IFRoaXMgbGltaXRzIHRoZSBtYXggcGFyYW1ldGVyIHNpemUgdG8gMTZrQiAtMSAhCisgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgaXMgZm9yIGNvbXBhdGliaWxpdHkgYWNyb3NzIHRoZSB2YXJpb3VzIExpbnV4CisgKiBwbGF0Zm9ybXMuICBUaGUgZ2VuZXJpYyBpb2N0bCBudW1iZXJpbmcgc2NoZW1lIGRvZXNuJ3QgcmVhbGx5IGVuZm9yY2UKKyAqIGEgdHlwZSBmaWVsZC4gIERlIGZhY3RvLCBob3dldmVyLCB0aGUgdG9wIDggYml0cyBvZiB0aGUgbG93ZXIgMTYKKyAqIGJpdHMgYXJlIGluZGVlZCB1c2VkIGFzIGEgdHlwZSBmaWVsZCwgc28gd2UgbWlnaHQganVzdCBhcyB3ZWxsIG1ha2UKKyAqIHRoaXMgZXhwbGljaXQgaGVyZS4gIFBsZWFzZSBiZSBzdXJlIHRvIHVzZSB0aGUgZGVjb2RpbmcgbWFjcm9zCisgKiBiZWxvdyBmcm9tIG5vdyBvbi4KKyAqLworI2RlZmluZSBfSU9DX05SQklUUwk4CisjZGVmaW5lIF9JT0NfVFlQRUJJVFMJOAorCisvKgorICogTGV0IGFueSBhcmNoaXRlY3R1cmUgb3ZlcnJpZGUgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgYmVmb3JlCisgKiBpbmNsdWRpbmcgdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgX0lPQ19TSVpFQklUUworIyBkZWZpbmUgX0lPQ19TSVpFQklUUwkxNAorI2VuZGlmCisKKyNpZm5kZWYgX0lPQ19ESVJCSVRTCisjIGRlZmluZSBfSU9DX0RJUkJJVFMJMgorI2VuZGlmCisKKyNkZWZpbmUgX0lPQ19OUk1BU0sJKCgxIDw8IF9JT0NfTlJCSVRTKS0xKQorI2RlZmluZSBfSU9DX1RZUEVNQVNLCSgoMSA8PCBfSU9DX1RZUEVCSVRTKS0xKQorI2RlZmluZSBfSU9DX1NJWkVNQVNLCSgoMSA8PCBfSU9DX1NJWkVCSVRTKS0xKQorI2RlZmluZSBfSU9DX0RJUk1BU0sJKCgxIDw8IF9JT0NfRElSQklUUyktMSkKKworI2RlZmluZSBfSU9DX05SU0hJRlQJMAorI2RlZmluZSBfSU9DX1RZUEVTSElGVAkoX0lPQ19OUlNISUZUK19JT0NfTlJCSVRTKQorI2RlZmluZSBfSU9DX1NJWkVTSElGVAkoX0lPQ19UWVBFU0hJRlQrX0lPQ19UWVBFQklUUykKKyNkZWZpbmUgX0lPQ19ESVJTSElGVAkoX0lPQ19TSVpFU0hJRlQrX0lPQ19TSVpFQklUUykKKworLyoKKyAqIERpcmVjdGlvbiBiaXRzLCB3aGljaCBhbnkgYXJjaGl0ZWN0dXJlIGNhbiBjaG9vc2UgdG8gb3ZlcnJpZGUKKyAqIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgX0lPQ19OT05FCisjIGRlZmluZSBfSU9DX05PTkUJMFUKKyNlbmRpZgorCisjaWZuZGVmIF9JT0NfV1JJVEUKKyMgZGVmaW5lIF9JT0NfV1JJVEUJMVUKKyNlbmRpZgorCisjaWZuZGVmIF9JT0NfUkVBRAorIyBkZWZpbmUgX0lPQ19SRUFECTJVCisjZW5kaWYKKworI2RlZmluZSBfSU9DKGRpcix0eXBlLG5yLHNpemUpIFwKKwkoKChkaXIpICA8PCBfSU9DX0RJUlNISUZUKSB8IFwKKwkgKCh0eXBlKSA8PCBfSU9DX1RZUEVTSElGVCkgfCBcCisJICgobnIpICAgPDwgX0lPQ19OUlNISUZUKSB8IFwKKwkgKChzaXplKSA8PCBfSU9DX1NJWkVTSElGVCkpCisKKyNkZWZpbmUgX0lPQ19UWVBFQ0hFQ0sodCkgKHNpemVvZih0KSkKKworLyogdXNlZCB0byBjcmVhdGUgbnVtYmVycyAqLworI2RlZmluZSBfSU8odHlwZSxucikJCV9JT0MoX0lPQ19OT05FLCh0eXBlKSwobnIpLDApCisjZGVmaW5lIF9JT1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRCwodHlwZSksKG5yKSwoX0lPQ19UWVBFQ0hFQ0soc2l6ZSkpKQorI2RlZmluZSBfSU9XKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLChfSU9DX1RZUEVDSEVDSyhzaXplKSkpCisjZGVmaW5lIF9JT1dSKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUR8X0lPQ19XUklURSwodHlwZSksKG5yKSwoX0lPQ19UWVBFQ0hFQ0soc2l6ZSkpKQorI2RlZmluZSBfSU9SX0JBRCh0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFELCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKKyNkZWZpbmUgX0lPV19CQUQodHlwZSxucixzaXplKQlfSU9DKF9JT0NfV1JJVEUsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQorI2RlZmluZSBfSU9XUl9CQUQodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRHxfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKKworLyogdXNlZCB0byBkZWNvZGUgaW9jdGwgbnVtYmVycy4uICovCisjZGVmaW5lIF9JT0NfRElSKG5yKQkJKCgobnIpID4+IF9JT0NfRElSU0hJRlQpICYgX0lPQ19ESVJNQVNLKQorI2RlZmluZSBfSU9DX1RZUEUobnIpCQkoKChucikgPj4gX0lPQ19UWVBFU0hJRlQpICYgX0lPQ19UWVBFTUFTSykKKyNkZWZpbmUgX0lPQ19OUihucikJCSgoKG5yKSA+PiBfSU9DX05SU0hJRlQpICYgX0lPQ19OUk1BU0spCisjZGVmaW5lIF9JT0NfU0laRShucikJCSgoKG5yKSA+PiBfSU9DX1NJWkVTSElGVCkgJiBfSU9DX1NJWkVNQVNLKQorCisvKiAuLi5hbmQgZm9yIHRoZSBkcml2ZXJzL3NvdW5kIGZpbGVzLi4uICovCisKKyNkZWZpbmUgSU9DX0lOCQkoX0lPQ19XUklURSA8PCBfSU9DX0RJUlNISUZUKQorI2RlZmluZSBJT0NfT1VUCQkoX0lPQ19SRUFEIDw8IF9JT0NfRElSU0hJRlQpCisjZGVmaW5lIElPQ19JTk9VVAkoKF9JT0NfV1JJVEV8X0lPQ19SRUFEKSA8PCBfSU9DX0RJUlNISUZUKQorI2RlZmluZSBJT0NTSVpFX01BU0sJKF9JT0NfU0laRU1BU0sgPDwgX0lPQ19TSVpFU0hJRlQpCisjZGVmaW5lIElPQ1NJWkVfU0hJRlQJKF9JT0NfU0laRVNISUZUKQorCisjZW5kaWYgLyogX0FTTV9HRU5FUklDX0lPQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW9jdGxzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2lvY3Rscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDM5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2lvY3Rscy5oCkBAIC0wLDAgKzEsMTE0IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfSU9DVExTX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19JT0NUTFNfSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgbW9zdCBjb21tb24gZGVmaW5pdGlvbnMgZm9yIHR0eSBpb2N0bCBudW1iZXJzLgorICogTW9zdCBvZiB0aGVtIGRvIG5vdCB1c2UgdGhlIHJlY29tbWVuZGVkIF9JT0MoKSwgYnV0IHRoZXJlIGlzCisgKiBwcm9iYWJseSBzb21lIHNvdXJjZSBjb2RlIG91dCB0aGVyZSBoYXJkY29kaW5nIHRoZSBudW1iZXIsCisgKiBzbyB3ZSBtaWdodCBhcyB3ZWxsIHVzZSB0aGVtIGZvciBhbGwgbmV3IHBsYXRmb3Jtcy4KKyAqCisgKiBUaGUgYXJjaGl0ZWN0dXJlcyB0aGF0IHVzZSBkaWZmZXJlbnQgdmFsdWVzIGhlcmUgdHlwaWNhbGx5CisgKiB0cnkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHNvbWUgVW5peCB2YXJpYW50cyBmb3IgdGhlIHNhbWUKKyAqIGFyY2hpdGVjdHVyZS4KKyAqLworCisvKiAweDU0IGlzIGp1c3QgYSBtYWdpYyBudW1iZXIgdG8gbWFrZSB0aGVzZSByZWxhdGl2ZWx5IHVuaXF1ZSAoJ1QnKSAqLworCisjZGVmaW5lIFRDR0VUUwkJMHg1NDAxCisjZGVmaW5lIFRDU0VUUwkJMHg1NDAyCisjZGVmaW5lIFRDU0VUU1cJCTB4NTQwMworI2RlZmluZSBUQ1NFVFNGCQkweDU0MDQKKyNkZWZpbmUgVENHRVRBCQkweDU0MDUKKyNkZWZpbmUgVENTRVRBCQkweDU0MDYKKyNkZWZpbmUgVENTRVRBVwkJMHg1NDA3CisjZGVmaW5lIFRDU0VUQUYJCTB4NTQwOAorI2RlZmluZSBUQ1NCUksJCTB4NTQwOQorI2RlZmluZSBUQ1hPTkMJCTB4NTQwQQorI2RlZmluZSBUQ0ZMU0gJCTB4NTQwQgorI2RlZmluZSBUSU9DRVhDTAkweDU0MEMKKyNkZWZpbmUgVElPQ05YQ0wJMHg1NDBECisjZGVmaW5lIFRJT0NTQ1RUWQkweDU0MEUKKyNkZWZpbmUgVElPQ0dQR1JQCTB4NTQwRgorI2RlZmluZSBUSU9DU1BHUlAJMHg1NDEwCisjZGVmaW5lIFRJT0NPVVRRCTB4NTQxMQorI2RlZmluZSBUSU9DU1RJCQkweDU0MTIKKyNkZWZpbmUgVElPQ0dXSU5TWgkweDU0MTMKKyNkZWZpbmUgVElPQ1NXSU5TWgkweDU0MTQKKyNkZWZpbmUgVElPQ01HRVQJMHg1NDE1CisjZGVmaW5lIFRJT0NNQklTCTB4NTQxNgorI2RlZmluZSBUSU9DTUJJQwkweDU0MTcKKyNkZWZpbmUgVElPQ01TRVQJMHg1NDE4CisjZGVmaW5lIFRJT0NHU09GVENBUgkweDU0MTkKKyNkZWZpbmUgVElPQ1NTT0ZUQ0FSCTB4NTQxQQorI2RlZmluZSBGSU9OUkVBRAkweDU0MUIKKyNkZWZpbmUgVElPQ0lOUQkJRklPTlJFQUQKKyNkZWZpbmUgVElPQ0xJTlVYCTB4NTQxQworI2RlZmluZSBUSU9DQ09OUwkweDU0MUQKKyNkZWZpbmUgVElPQ0dTRVJJQUwJMHg1NDFFCisjZGVmaW5lIFRJT0NTU0VSSUFMCTB4NTQxRgorI2RlZmluZSBUSU9DUEtUCQkweDU0MjAKKyNkZWZpbmUgRklPTkJJTwkJMHg1NDIxCisjZGVmaW5lIFRJT0NOT1RUWQkweDU0MjIKKyNkZWZpbmUgVElPQ1NFVEQJMHg1NDIzCisjZGVmaW5lIFRJT0NHRVRECTB4NTQyNAorI2RlZmluZSBUQ1NCUktQCQkweDU0MjUJLyogTmVlZGVkIGZvciBQT1NJWCB0Y3NlbmRicmVhaygpICovCisjZGVmaW5lIFRJT0NTQlJLCTB4NTQyNyAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgVElPQ0NCUksJMHg1NDI4ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBUSU9DR1NJRAkweDU0MjkgIC8qIFJldHVybiB0aGUgc2Vzc2lvbiBJRCBvZiBGRCAqLworI2RlZmluZSBUQ0dFVFMyCQlfSU9SKCdUJywgMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywgMHgyQiwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNXMglfSU9XKCdUJywgMHgyQywgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNGMglfSU9XKCdUJywgMHgyRCwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUSU9DR1JTNDg1CTB4NTQyRQorI2lmbmRlZiBUSU9DU1JTNDg1CisjZGVmaW5lIFRJT0NTUlM0ODUJMHg1NDJGCisjZW5kaWYKKyNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsIDB4MzAsIHVuc2lnbmVkIGludCkgLyogR2V0IFB0eSBOdW1iZXIgKG9mIHB0eS1tdXggZGV2aWNlKSAqLworI2RlZmluZSBUSU9DU1BUTENLCV9JT1coJ1QnLCAweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KKyNkZWZpbmUgVElPQ0dERVYJX0lPUignVCcsIDB4MzIsIHVuc2lnbmVkIGludCkgLyogR2V0IHByaW1hcnkgZGV2aWNlIG5vZGUgb2YgL2Rldi9jb25zb2xlICovCisjZGVmaW5lIFRDR0VUWAkJMHg1NDMyIC8qIFNZUzUgVENHRVRYIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgVENTRVRYCQkweDU0MzMKKyNkZWZpbmUgVENTRVRYRgkJMHg1NDM0CisjZGVmaW5lIFRDU0VUWFcJCTB4NTQzNQorI2RlZmluZSBUSU9DU0lHCQlfSU9XKCdUJywgMHgzNiwgaW50KSAgLyogcHR5OiBnZW5lcmF0ZSBzaWduYWwgKi8KKyNkZWZpbmUgVElPQ1ZIQU5HVVAJMHg1NDM3CisKKyNkZWZpbmUgRklPTkNMRVgJMHg1NDUwCisjZGVmaW5lIEZJT0NMRVgJCTB4NTQ1MQorI2RlZmluZSBGSU9BU1lOQwkweDU0NTIKKyNkZWZpbmUgVElPQ1NFUkNPTkZJRwkweDU0NTMKKyNkZWZpbmUgVElPQ1NFUkdXSUxECTB4NTQ1NAorI2RlZmluZSBUSU9DU0VSU1dJTEQJMHg1NDU1CisjZGVmaW5lIFRJT0NHTENLVFJNSU9TCTB4NTQ1NgorI2RlZmluZSBUSU9DU0xDS1RSTUlPUwkweDU0NTcKKyNkZWZpbmUgVElPQ1NFUkdTVFJVQ1QJMHg1NDU4IC8qIEZvciBkZWJ1Z2dpbmcgb25seSAqLworI2RlZmluZSBUSU9DU0VSR0VUTFNSICAgMHg1NDU5IC8qIEdldCBsaW5lIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBUSU9DU0VSR0VUTVVMVEkgMHg1NDVBIC8qIEdldCBtdWx0aXBvcnQgY29uZmlnICAqLworI2RlZmluZSBUSU9DU0VSU0VUTVVMVEkgMHg1NDVCIC8qIFNldCBtdWx0aXBvcnQgY29uZmlnICovCisKKyNkZWZpbmUgVElPQ01JV0FJVAkweDU0NUMJLyogd2FpdCBmb3IgYSBjaGFuZ2Ugb24gc2VyaWFsIGlucHV0IGxpbmUocykgKi8KKyNkZWZpbmUgVElPQ0dJQ09VTlQJMHg1NDVECS8qIHJlYWQgc2VyaWFsIHBvcnQgX19pbmxpbmVfXyBpbnRlcnJ1cHQgY291bnRzICovCisKKy8qCisgKiBTb21lIGFyY2hlcyBhbHJlYWR5IGRlZmluZSBGSU9RU0laRSBkdWUgdG8gYSBoaXN0b3JpY2FsCisgKiBjb25mbGljdCB3aXRoIGEgSGF5ZXMgbW9kZW0tc3BlY2lmaWMgaW9jdGwgdmFsdWUuCisgKi8KKyNpZm5kZWYgRklPUVNJWkUKKyMgZGVmaW5lIEZJT1FTSVpFCTB4NTQ2MAorI2VuZGlmCisKKy8qIFVzZWQgZm9yIHBhY2tldCBtb2RlICovCisjZGVmaW5lIFRJT0NQS1RfREFUQQkJIDAKKyNkZWZpbmUgVElPQ1BLVF9GTFVTSFJFQUQJIDEKKyNkZWZpbmUgVElPQ1BLVF9GTFVTSFdSSVRFCSAyCisjZGVmaW5lIFRJT0NQS1RfU1RPUAkJIDQKKyNkZWZpbmUgVElPQ1BLVF9TVEFSVAkJIDgKKyNkZWZpbmUgVElPQ1BLVF9OT1NUT1AJCTE2CisjZGVmaW5lIFRJT0NQS1RfRE9TVE9QCQkzMgorI2RlZmluZSBUSU9DUEtUX0lPQ1RMCQk2NAorCisjZGVmaW5lIFRJT0NTRVJfVEVNVAkweDAxCS8qIFRyYW5zbWl0dGVyIHBoeXNpY2FsbHkgZW1wdHkgKi8KKworI2VuZGlmIC8qIF9fQVNNX0dFTkVSSUNfSU9DVExTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvaXBjYnVmLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2lwY2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OTgyYjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2lwY2J1Zi5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19JUENCVUZfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX0lQQ0JVRl9ICisKKy8qCisgKiBUaGUgZ2VuZXJpYyBpcGM2NF9wZXJtIHN0cnVjdHVyZToKKyAqIE5vdGUgZXh0cmEgcGFkZGluZyBiZWNhdXNlIHRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCBiYWNrIGFuZCBmb3J0aAorICogYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisgKgorICogaXBjNjRfcGVybSB3YXMgb3JpZ2luYWxseSBtZWFudCB0byBiZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMsIGJ1dAorICogZXZlcnlvbmUganVzdCBlbmRlZCB1cCBtYWtpbmcgaWRlbnRpY2FsIGNvcGllcyB3aXRob3V0IHNwZWNpZmljCisgKiBvcHRpbWl6YXRpb25zLCBzbyB3ZSBtYXkganVzdCBhcyB3ZWxsIGFsbCB1c2UgdGhlIHNhbWUgb25lLgorICoKKyAqIFBhZCBzcGFjZSBpcyBsZWZ0IGZvcjoKKyAqIC0gMzItYml0IG1vZGVfdCBvbiBhcmNoaXRlY3R1cmVzIHRoYXQgb25seSBoYWQgMTYgYml0CisgKiAtIDMyLWJpdCBzZXEKKyAqIC0gMiBtaXNjZWxsYW5lb3VzIDMyLWJpdCB2YWx1ZXMKKyAqLworCitzdHJ1Y3QgaXBjNjRfcGVybSB7CisJX19rZXJuZWxfa2V5X3QJCWtleTsKKwlfX2tlcm5lbF91aWQzMl90CXVpZDsKKwlfX2tlcm5lbF9naWQzMl90CWdpZDsKKwlfX2tlcm5lbF91aWQzMl90CWN1aWQ7CisJX19rZXJuZWxfZ2lkMzJfdAljZ2lkOworCV9fa2VybmVsX21vZGVfdAkJbW9kZTsKKwkJCQkvKiBwYWQgaWYgbW9kZV90IGlzIHUxNjogKi8KKwl1bnNpZ25lZCBjaGFyCQlfX3BhZDFbNCAtIHNpemVvZihfX2tlcm5lbF9tb2RlX3QpXTsKKwl1bnNpZ25lZCBzaG9ydAkJc2VxOworCXVuc2lnbmVkIHNob3J0CQlfX3BhZDI7CisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQxOworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMjsKK307CisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX0lQQ0JVRl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg3YWJiYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaApAQCAtMCwwICsxLDU0IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfTU1BTl9DT01NT05fSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX01NQU5fQ09NTU9OX0gKKworLyoKKyBBdXRob3I6IE1pY2hhZWwgUy4gVHNpcmtpbiA8bXN0QG1lbGxhbm94LmNvLmlsPiwgTWVsbGFub3ggVGVjaG5vbG9naWVzIEx0ZC4KKyBCYXNlZCBvbjogYXNtLXh4eC9tbWFuLmgKKyovCisKKyNkZWZpbmUgUFJPVF9SRUFECTB4MQkJLyogcGFnZSBjYW4gYmUgcmVhZCAqLworI2RlZmluZSBQUk9UX1dSSVRFCTB4MgkJLyogcGFnZSBjYW4gYmUgd3JpdHRlbiAqLworI2RlZmluZSBQUk9UX0VYRUMJMHg0CQkvKiBwYWdlIGNhbiBiZSBleGVjdXRlZCAqLworI2RlZmluZSBQUk9UX1NFTQkweDgJCS8qIHBhZ2UgbWF5IGJlIHVzZWQgZm9yIGF0b21pYyBvcHMgKi8KKyNkZWZpbmUgUFJPVF9OT05FCTB4MAkJLyogcGFnZSBjYW4gbm90IGJlIGFjY2Vzc2VkICovCisjZGVmaW5lIFBST1RfR1JPV1NET1dOCTB4MDEwMDAwMDAJLyogbXByb3RlY3QgZmxhZzogZXh0ZW5kIGNoYW5nZSB0byBzdGFydCBvZiBncm93c2Rvd24gdm1hICovCisjZGVmaW5lIFBST1RfR1JPV1NVUAkweDAyMDAwMDAwCS8qIG1wcm90ZWN0IGZsYWc6IGV4dGVuZCBjaGFuZ2UgdG8gZW5kIG9mIGdyb3dzdXAgdm1hICovCisKKyNkZWZpbmUgTUFQX1NIQVJFRAkweDAxCQkvKiBTaGFyZSBjaGFuZ2VzICovCisjZGVmaW5lIE1BUF9QUklWQVRFCTB4MDIJCS8qIENoYW5nZXMgYXJlIHByaXZhdGUgKi8KKyNkZWZpbmUgTUFQX1RZUEUJMHgwZgkJLyogTWFzayBmb3IgdHlwZSBvZiBtYXBwaW5nICovCisjZGVmaW5lIE1BUF9GSVhFRAkweDEwCQkvKiBJbnRlcnByZXQgYWRkciBleGFjdGx5ICovCisjZGVmaW5lIE1BUF9BTk9OWU1PVVMJMHgyMAkJLyogZG9uJ3QgdXNlIGEgZmlsZSAqLworI2lmZGVmIENPTkZJR19NTUFQX0FMTE9XX1VOSU5JVElBTElaRUQKKyMgZGVmaW5lIE1BUF9VTklOSVRJQUxJWkVEIDB4NDAwMDAwMAkvKiBGb3IgYW5vbnltb3VzIG1tYXAsIG1lbW9yeSBjb3VsZCBiZSB1bmluaXRpYWxpemVkICovCisjZWxzZQorIyBkZWZpbmUgTUFQX1VOSU5JVElBTElaRUQgMHgwCQkvKiBEb24ndCBzdXBwb3J0IHRoaXMgZmxhZyAqLworI2VuZGlmCisKKyNkZWZpbmUgTVNfQVNZTkMJMQkJLyogc3luYyBtZW1vcnkgYXN5bmNocm9ub3VzbHkgKi8KKyNkZWZpbmUgTVNfSU5WQUxJREFURQkyCQkvKiBpbnZhbGlkYXRlIHRoZSBjYWNoZXMgKi8KKyNkZWZpbmUgTVNfU1lOQwkJNAkJLyogc3luY2hyb25vdXMgbWVtb3J5IHN5bmMgKi8KKworI2RlZmluZSBNQURWX05PUk1BTAkwCQkvKiBubyBmdXJ0aGVyIHNwZWNpYWwgdHJlYXRtZW50ICovCisjZGVmaW5lIE1BRFZfUkFORE9NCTEJCS8qIGV4cGVjdCByYW5kb20gcGFnZSByZWZlcmVuY2VzICovCisjZGVmaW5lIE1BRFZfU0VRVUVOVElBTAkyCQkvKiBleHBlY3Qgc2VxdWVudGlhbCBwYWdlIHJlZmVyZW5jZXMgKi8KKyNkZWZpbmUgTUFEVl9XSUxMTkVFRAkzCQkvKiB3aWxsIG5lZWQgdGhlc2UgcGFnZXMgKi8KKyNkZWZpbmUgTUFEVl9ET05UTkVFRAk0CQkvKiBkb24ndCBuZWVkIHRoZXNlIHBhZ2VzICovCisKKy8qIGNvbW1vbiBwYXJhbWV0ZXJzOiB0cnkgdG8ga2VlcCB0aGVzZSBjb25zaXN0ZW50IGFjcm9zcyBhcmNoaXRlY3R1cmVzICovCisjZGVmaW5lIE1BRFZfUkVNT1ZFCTkJCS8qIHJlbW92ZSB0aGVzZSBwYWdlcyAmIHJlc291cmNlcyAqLworI2RlZmluZSBNQURWX0RPTlRGT1JLCTEwCQkvKiBkb24ndCBpbmhlcml0IGFjcm9zcyBmb3JrICovCisjZGVmaW5lIE1BRFZfRE9GT1JLCTExCQkvKiBkbyBpbmhlcml0IGFjcm9zcyBmb3JrICovCisjZGVmaW5lIE1BRFZfSFdQT0lTT04JMTAwCQkvKiBwb2lzb24gYSBwYWdlIGZvciB0ZXN0aW5nICovCisjZGVmaW5lIE1BRFZfU09GVF9PRkZMSU5FIDEwMQkJLyogc29mdCBvZmZsaW5lIHBhZ2UgZm9yIHRlc3RpbmcgKi8KKworI2RlZmluZSBNQURWX01FUkdFQUJMRSAgIDEyCQkvKiBLU00gbWF5IG1lcmdlIGlkZW50aWNhbCBwYWdlcyAqLworI2RlZmluZSBNQURWX1VOTUVSR0VBQkxFIDEzCQkvKiBLU00gbWF5IG5vdCBtZXJnZSBpZGVudGljYWwgcGFnZXMgKi8KKworI2RlZmluZSBNQURWX0hVR0VQQUdFCTE0CQkvKiBXb3J0aCBiYWNraW5nIHdpdGggaHVnZXBhZ2VzICovCisjZGVmaW5lIE1BRFZfTk9IVUdFUEFHRQkxNQkJLyogTm90IHdvcnRoIGJhY2tpbmcgd2l0aCBodWdlcGFnZXMgKi8KKworLyogY29tcGF0aWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBNQVBfRklMRQkwCisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX01NQU5fQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvbW1hbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjOGJkNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvbW1hbi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19NTUFOX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19NTUFOX0gKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL21tYW4tY29tbW9uLmg+CisKKyNkZWZpbmUgTUFQX0dST1dTRE9XTgkweDAxMDAJCS8qIHN0YWNrLWxpa2Ugc2VnbWVudCAqLworI2RlZmluZSBNQVBfREVOWVdSSVRFCTB4MDgwMAkJLyogRVRYVEJTWSAqLworI2RlZmluZSBNQVBfRVhFQ1VUQUJMRQkweDEwMDAJCS8qIG1hcmsgaXQgYXMgYW4gZXhlY3V0YWJsZSAqLworI2RlZmluZSBNQVBfTE9DS0VECTB4MjAwMAkJLyogcGFnZXMgYXJlIGxvY2tlZCAqLworI2RlZmluZSBNQVBfTk9SRVNFUlZFCTB4NDAwMAkJLyogZG9uJ3QgY2hlY2sgZm9yIHJlc2VydmF0aW9ucyAqLworI2RlZmluZSBNQVBfUE9QVUxBVEUJMHg4MDAwCQkvKiBwb3B1bGF0ZSAocHJlZmF1bHQpIHBhZ2V0YWJsZXMgKi8KKyNkZWZpbmUgTUFQX05PTkJMT0NLCTB4MTAwMDAJCS8qIGRvIG5vdCBibG9jayBvbiBJTyAqLworI2RlZmluZSBNQVBfU1RBQ0sJMHgyMDAwMAkJLyogZ2l2ZSBvdXQgYW4gYWRkcmVzcyB0aGF0IGlzIGJlc3Qgc3VpdGVkIGZvciBwcm9jZXNzL3RocmVhZCBzdGFja3MgKi8KKyNkZWZpbmUgTUFQX0hVR0VUTEIJMHg0MDAwMAkJLyogY3JlYXRlIGEgaHVnZSBwYWdlIG1hcHBpbmcgKi8KKworI2RlZmluZSBNQ0xfQ1VSUkVOVAkxCQkvKiBsb2NrIGFsbCBjdXJyZW50IG1hcHBpbmdzICovCisjZGVmaW5lIE1DTF9GVVRVUkUJMgkJLyogbG9jayBhbGwgZnV0dXJlIG1hcHBpbmdzICovCisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX01NQU5fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9tc2didWYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvbXNnYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVjODUwZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvbXNnYnVmLmgKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX01TR0JVRl9ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfTVNHQlVGX0gKKworI2luY2x1ZGUgPGFzbS9iaXRzcGVybG9uZy5oPgorLyoKKyAqIGdlbmVyaWMgbXNxaWQ2NF9kcyBzdHJ1Y3R1cmUuCisgKgorICogTm90ZSBleHRyYSBwYWRkaW5nIGJlY2F1c2UgdGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIGJhY2sgYW5kIGZvcnRoCisgKiBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlciBzcGFjZS4KKyAqCisgKiBtc3FpZDY0X2RzIHdhcyBvcmlnaW5hbGx5IG1lYW50IHRvIGJlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYywgYnV0CisgKiBldmVyeW9uZSBqdXN0IGVuZGVkIHVwIG1ha2luZyBpZGVudGljYWwgY29waWVzIHdpdGhvdXQgc3BlY2lmaWMKKyAqIG9wdGltaXphdGlvbnMsIHNvIHdlIG1heSBqdXN0IGFzIHdlbGwgYWxsIHVzZSB0aGUgc2FtZSBvbmUuCisgKgorICogNjQgYml0IGFyY2hpdGVjdHVyZXMgdHlwaWNhbGx5IGRlZmluZSBhIDY0IGJpdCBfX2tlcm5lbF90aW1lX3QsCisgKiBzbyB0aGV5IGRvIG5vdCBuZWVkIHRoZSBmaXJzdCB0aHJlZSBwYWRkaW5nIHdvcmRzLgorICogT24gYmlnLWVuZGlhbiBzeXN0ZW1zLCB0aGUgcGFkZGluZyBpcyBpbiB0aGUgd3JvbmcgcGxhY2UuCisgKgorICogUGFkIHNwYWNlIGlzIGxlZnQgZm9yOgorICogLSA2NC1iaXQgdGltZV90IHRvIHNvbHZlIHkyMDM4IHByb2JsZW0KKyAqIC0gMiBtaXNjZWxsYW5lb3VzIDMyLWJpdCB2YWx1ZXMKKyAqLworCitzdHJ1Y3QgbXNxaWQ2NF9kcyB7CisJc3RydWN0IGlwYzY0X3Blcm0gbXNnX3Blcm07CisJX19rZXJuZWxfdGltZV90IG1zZ19zdGltZTsJLyogbGFzdCBtc2dzbmQgdGltZSAqLworI2lmIF9fQklUU19QRVJfTE9ORyAhPSA2NAorCXVuc2lnbmVkIGxvbmcJX191bnVzZWQxOworI2VuZGlmCisJX19rZXJuZWxfdGltZV90IG1zZ19ydGltZTsJLyogbGFzdCBtc2dyY3YgdGltZSAqLworI2lmIF9fQklUU19QRVJfTE9ORyAhPSA2NAorCXVuc2lnbmVkIGxvbmcJX191bnVzZWQyOworI2VuZGlmCisJX19rZXJuZWxfdGltZV90IG1zZ19jdGltZTsJLyogbGFzdCBjaGFuZ2UgdGltZSAqLworI2lmIF9fQklUU19QRVJfTE9ORyAhPSA2NAorCXVuc2lnbmVkIGxvbmcJX191bnVzZWQzOworI2VuZGlmCisJdW5zaWduZWQgbG9uZyAgbXNnX2NieXRlczsJLyogY3VycmVudCBudW1iZXIgb2YgYnl0ZXMgb24gcXVldWUgKi8KKwl1bnNpZ25lZCBsb25nICBtc2dfcW51bTsJLyogbnVtYmVyIG9mIG1lc3NhZ2VzIGluIHF1ZXVlICovCisJdW5zaWduZWQgbG9uZyAgbXNnX3FieXRlczsJLyogbWF4IG51bWJlciBvZiBieXRlcyBvbiBxdWV1ZSAqLworCV9fa2VybmVsX3BpZF90IG1zZ19sc3BpZDsJLyogcGlkIG9mIGxhc3QgbXNnc25kICovCisJX19rZXJuZWxfcGlkX3QgbXNnX2xycGlkOwkvKiBsYXN0IHJlY2VpdmUgcGlkICovCisJdW5zaWduZWQgbG9uZyAgX191bnVzZWQ0OworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNTsKK307CisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX01TR0JVRl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3BhcmFtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3BhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0ZWVjZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGFyYW0uaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfUEFSQU1fSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX1BBUkFNX0gKKworCisjaWZuZGVmIEhaCisjZGVmaW5lIEhaIDEwMAorI2VuZGlmCisKKyNpZm5kZWYgRVhFQ19QQUdFU0laRQorI2RlZmluZSBFWEVDX1BBR0VTSVpFCTQwOTYKKyNlbmRpZgorCisjaWZuZGVmIE5PR1JPVVAKKyNkZWZpbmUgTk9HUk9VUAkJKC0xKQorI2VuZGlmCisKKyNkZWZpbmUgTUFYSE9TVE5BTUVMRU4JNjQJLyogbWF4IGxlbmd0aCBvZiBob3N0bmFtZSAqLworCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19QQVJBTV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3BvbGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvcG9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZTdmNDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3BvbGwuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfUE9MTF9ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfUE9MTF9ICisKKy8qIFRoZXNlIGFyZSBzcGVjaWZpZWQgYnkgaUJDUzIgKi8KKyNkZWZpbmUgUE9MTElOCQkweDAwMDEKKyNkZWZpbmUgUE9MTFBSSQkJMHgwMDAyCisjZGVmaW5lIFBPTExPVVQJCTB4MDAwNAorI2RlZmluZSBQT0xMRVJSCQkweDAwMDgKKyNkZWZpbmUgUE9MTEhVUAkJMHgwMDEwCisjZGVmaW5lIFBPTExOVkFMCTB4MDAyMAorCisvKiBUaGUgcmVzdCBzZWVtIHRvIGJlIG1vcmUtb3ItbGVzcyBub25zdGFuZGFyZC4gQ2hlY2sgdGhlbSEgKi8KKyNkZWZpbmUgUE9MTFJETk9STQkweDAwNDAKKyNkZWZpbmUgUE9MTFJEQkFORAkweDAwODAKKyNpZm5kZWYgUE9MTFdSTk9STQorI2RlZmluZSBQT0xMV1JOT1JNCTB4MDEwMAorI2VuZGlmCisjaWZuZGVmIFBPTExXUkJBTkQKKyNkZWZpbmUgUE9MTFdSQkFORAkweDAyMDAKKyNlbmRpZgorI2lmbmRlZiBQT0xMTVNHCisjZGVmaW5lIFBPTExNU0cJCTB4MDQwMAorI2VuZGlmCisjaWZuZGVmIFBPTExSRU1PVkUKKyNkZWZpbmUgUE9MTFJFTU9WRQkweDEwMDAKKyNlbmRpZgorI2lmbmRlZiBQT0xMUkRIVVAKKyNkZWZpbmUgUE9MTFJESFVQICAgICAgIDB4MjAwMAorI2VuZGlmCisKKyNkZWZpbmUgUE9MTEZSRUUJMHg0MDAwCS8qIGN1cnJlbnRseSBvbmx5IGZvciBlcG9sbCAqLworCitzdHJ1Y3QgcG9sbGZkIHsKKwlpbnQgZmQ7CisJc2hvcnQgZXZlbnRzOworCXNob3J0IHJldmVudHM7Cit9OworCisjZW5kaWYJLyogX19BU01fR0VORVJJQ19QT0xMX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvcG9zaXhfdHlwZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvcG9zaXhfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2M4N2RjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9wb3NpeF90eXBlcy5oCkBAIC0wLDAgKzEsOTQgQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19QT1NJWF9UWVBFU19ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfUE9TSVhfVFlQRVNfSAorCisjaW5jbHVkZSA8YXNtL2JpdHNwZXJsb25nLmg+CisvKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYWxseSB1c2VkIGJ5IHVzZXItbGV2ZWwgc29mdHdhcmUsIHNvIHlvdSBuZWVkIHRvCisgKiBiZSBhIGxpdHRsZSBjYXJlZnVsIGFib3V0IG5hbWVzcGFjZSBwb2xsdXRpb24gZXRjLgorICoKKyAqIEZpcnN0IHRoZSB0eXBlcyB0aGF0IGFyZSBvZnRlbiBkZWZpbmVkIGluIGRpZmZlcmVudCB3YXlzIGFjcm9zcworICogYXJjaGl0ZWN0dXJlcywgc28gdGhhdCB5b3UgY2FuIG92ZXJyaWRlIHRoZW0uCisgKi8KKworI2lmbmRlZiBfX2tlcm5lbF9pbm9fdAordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX2lub190OworI2VuZGlmCisKKyNpZm5kZWYgX19rZXJuZWxfbW9kZV90Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF9tb2RlX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfX2tlcm5lbF9ubGlua190Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJX19rZXJuZWxfbmxpbmtfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9fa2VybmVsX3BpZF90Cit0eXBlZGVmIGludAkJX19rZXJuZWxfcGlkX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfX2tlcm5lbF9pcGNfcGlkX3QKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9pcGNfcGlkX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfX2tlcm5lbF91aWRfdAordHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF9naWRfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9fa2VybmVsX3N1c2Vjb25kc190Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3N1c2Vjb25kc190OworI2VuZGlmCisKKyNpZm5kZWYgX19rZXJuZWxfZGFkZHJfdAordHlwZWRlZiBpbnQJCV9fa2VybmVsX2RhZGRyX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfX2tlcm5lbF91aWQzMl90Cit0eXBlZGVmIF9fa2VybmVsX3VpZF90CV9fa2VybmVsX3VpZDMyX3Q7Cit0eXBlZGVmIF9fa2VybmVsX2dpZF90CV9fa2VybmVsX2dpZDMyX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfX2tlcm5lbF9vbGRfdWlkX3QKK3R5cGVkZWYgX19rZXJuZWxfdWlkX3QJX19rZXJuZWxfb2xkX3VpZF90OwordHlwZWRlZiBfX2tlcm5lbF9naWRfdAlfX2tlcm5lbF9vbGRfZ2lkX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfX2tlcm5lbF9vbGRfZGV2X3QKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX29sZF9kZXZfdDsKKyNlbmRpZgorCisvKgorICogTW9zdCAzMiBiaXQgYXJjaGl0ZWN0dXJlcyB1c2UgInVuc2lnbmVkIGludCIgc2l6ZV90LAorICogYW5kIGFsbCA2NCBiaXQgYXJjaGl0ZWN0dXJlcyB1c2UgInVuc2lnbmVkIGxvbmciIHNpemVfdC4KKyAqLworI2lmbmRlZiBfX2tlcm5lbF9zaXplX3QKKyNpZiBfX0JJVFNfUEVSX0xPTkcgIT0gNjQKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX3NpemVfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9zc2l6ZV90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3B0cmRpZmZfdDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJX19rZXJuZWxfc2l6ZV90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9zc2l6ZV90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9wdHJkaWZmX3Q7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogYW55dGhpbmcgYmVsb3cgaGVyZSBzaG91bGQgYmUgY29tcGxldGVseSBnZW5lcmljCisgKi8KK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfb2ZmX3Q7Cit0eXBlZGVmIGxvbmcgbG9uZwlfX2tlcm5lbF9sb2ZmX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3RpbWVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfY2xvY2tfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF90aW1lcl90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX2Nsb2NraWRfdDsKK3R5cGVkZWYgY2hhciAqCQlfX2tlcm5lbF9jYWRkcl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF91aWQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9naWQxNl90OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CXZhbFsyXTsKK30gX19rZXJuZWxfZnNpZF90OworCisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX1BPU0lYX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvcmVzb3VyY2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzZkYTg0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9yZXNvdXJjZS5oCkBAIC0wLDAgKzEsNjggQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX1JFU09VUkNFX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX1JFU09VUkNFX0gKKworLyoKKyAqIFJlc291cmNlIGxpbWl0IElEcworICoKKyAqICggQ29tcGF0aWJpbGl0eSBkZXRhaWw6IHRoZXJlIGFyZSBhcmNoaXRlY3R1cmVzIHRoYXQgaGF2ZQorICogICBhIGRpZmZlcmVudCBybGltaXQgSUQgb3JkZXIgaW4gdGhlIDUtOSByYW5nZSBhbmQgd2FudAorICogICB0byBrZWVwIHRoYXQgb3JkZXIgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5LiBUaGUgcmVhc29ucworICogICBhcmUgaGlzdG9yaWMgYW5kIGFsbCBuZXcgcmxpbWl0cyBhcmUgaWRlbnRpY2FsIGFjcm9zcyBhbGwKKyAqICAgYXJjaGVzLiBJZiBhbiBhcmNoIGhhcyBzdWNoIHNwZWNpYWwgb3JkZXIgZm9yIHNvbWUgcmxpbWl0cworICogICB0aGVuIGl0IGRlZmluZXMgdGhlbSBwcmlvciBpbmNsdWRpbmcgYXNtLWdlbmVyaWMvcmVzb3VyY2UuaC4gKQorICovCisKKyNkZWZpbmUgUkxJTUlUX0NQVQkJMAkvKiBDUFUgdGltZSBpbiBzZWMgKi8KKyNkZWZpbmUgUkxJTUlUX0ZTSVpFCQkxCS8qIE1heGltdW0gZmlsZXNpemUgKi8KKyNkZWZpbmUgUkxJTUlUX0RBVEEJCTIJLyogbWF4IGRhdGEgc2l6ZSAqLworI2RlZmluZSBSTElNSVRfU1RBQ0sJCTMJLyogbWF4IHN0YWNrIHNpemUgKi8KKyNkZWZpbmUgUkxJTUlUX0NPUkUJCTQJLyogbWF4IGNvcmUgZmlsZSBzaXplICovCisKKyNpZm5kZWYgUkxJTUlUX1JTUworIyBkZWZpbmUgUkxJTUlUX1JTUwkJNQkvKiBtYXggcmVzaWRlbnQgc2V0IHNpemUgKi8KKyNlbmRpZgorCisjaWZuZGVmIFJMSU1JVF9OUFJPQworIyBkZWZpbmUgUkxJTUlUX05QUk9DCQk2CS8qIG1heCBudW1iZXIgb2YgcHJvY2Vzc2VzICovCisjZW5kaWYKKworI2lmbmRlZiBSTElNSVRfTk9GSUxFCisjIGRlZmluZSBSTElNSVRfTk9GSUxFCQk3CS8qIG1heCBudW1iZXIgb2Ygb3BlbiBmaWxlcyAqLworI2VuZGlmCisKKyNpZm5kZWYgUkxJTUlUX01FTUxPQ0sKKyMgZGVmaW5lIFJMSU1JVF9NRU1MT0NLCQk4CS8qIG1heCBsb2NrZWQtaW4tbWVtb3J5IGFkZHJlc3Mgc3BhY2UgKi8KKyNlbmRpZgorCisjaWZuZGVmIFJMSU1JVF9BUworIyBkZWZpbmUgUkxJTUlUX0FTCQk5CS8qIGFkZHJlc3Mgc3BhY2UgbGltaXQgKi8KKyNlbmRpZgorCisjZGVmaW5lIFJMSU1JVF9MT0NLUwkJMTAJLyogbWF4aW11bSBmaWxlIGxvY2tzIGhlbGQgKi8KKyNkZWZpbmUgUkxJTUlUX1NJR1BFTkRJTkcJMTEJLyogbWF4IG51bWJlciBvZiBwZW5kaW5nIHNpZ25hbHMgKi8KKyNkZWZpbmUgUkxJTUlUX01TR1FVRVVFCQkxMgkvKiBtYXhpbXVtIGJ5dGVzIGluIFBPU0lYIG1xdWV1ZXMgKi8KKyNkZWZpbmUgUkxJTUlUX05JQ0UJCTEzCS8qIG1heCBuaWNlIHByaW8gYWxsb3dlZCB0byByYWlzZSB0bworCQkJCQkgICAwLTM5IGZvciBuaWNlIGxldmVsIDE5IC4uIC0yMCAqLworI2RlZmluZSBSTElNSVRfUlRQUklPCQkxNAkvKiBtYXhpbXVtIHJlYWx0aW1lIHByaW9yaXR5ICovCisjZGVmaW5lIFJMSU1JVF9SVFRJTUUJCTE1CS8qIHRpbWVvdXQgZm9yIFJUIHRhc2tzIGluIHVzICovCisjZGVmaW5lIFJMSU1fTkxJTUlUUwkJMTYKKworLyoKKyAqIFN1UyBzYXlzIGxpbWl0cyBoYXZlIHRvIGJlIHVuc2lnbmVkLgorICogV2hpY2ggbWFrZXMgYSB0b24gbW9yZSBzZW5zZSBhbnl3YXkuCisgKgorICogU29tZSBhcmNoaXRlY3R1cmVzIG92ZXJyaWRlIHRoaXMgKGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMpOgorICovCisjaWZuZGVmIFJMSU1fSU5GSU5JVFkKKyMgZGVmaW5lIFJMSU1fSU5GSU5JVFkJCSh+MFVMKQorI2VuZGlmCisKKy8qCisgKiBSTElNSVRfU1RBQ0sgZGVmYXVsdCBtYXhpbXVtIC0gc29tZSBhcmNoaXRlY3R1cmVzIG92ZXJyaWRlIGl0OgorICovCisjaWZuZGVmIF9TVEtfTElNX01BWAorIyBkZWZpbmUgX1NUS19MSU1fTUFYCQlSTElNX0lORklOSVRZCisjZW5kaWYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2VtYnVmLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NlbWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYjJjMTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NlbWJ1Zi5oCkBAIC0wLDAgKzEsMzggQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19TRU1CVUZfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX1NFTUJVRl9ICisKKyNpbmNsdWRlIDxhc20vYml0c3BlcmxvbmcuaD4KKworLyoKKyAqIFRoZSBzZW1pZDY0X2RzIHN0cnVjdHVyZSBmb3IgeDg2IGFyY2hpdGVjdHVyZS4KKyAqIE5vdGUgZXh0cmEgcGFkZGluZyBiZWNhdXNlIHRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCBiYWNrIGFuZCBmb3J0aAorICogYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisgKgorICogc2VtaWQ2NF9kcyB3YXMgb3JpZ2luYWxseSBtZWFudCB0byBiZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMsIGJ1dAorICogZXZlcnlvbmUganVzdCBlbmRlZCB1cCBtYWtpbmcgaWRlbnRpY2FsIGNvcGllcyB3aXRob3V0IHNwZWNpZmljCisgKiBvcHRpbWl6YXRpb25zLCBzbyB3ZSBtYXkganVzdCBhcyB3ZWxsIGFsbCB1c2UgdGhlIHNhbWUgb25lLgorICoKKyAqIDY0IGJpdCBhcmNoaXRlY3R1cmVzIHR5cGljYWxseSBkZWZpbmUgYSA2NCBiaXQgX19rZXJuZWxfdGltZV90LAorICogc28gdGhleSBkbyBub3QgbmVlZCB0aGUgZmlyc3QgdHdvIHBhZGRpbmcgd29yZHMuCisgKiBPbiBiaWctZW5kaWFuIHN5c3RlbXMsIHRoZSBwYWRkaW5nIGlzIGluIHRoZSB3cm9uZyBwbGFjZS4KKyAqCisgKiBQYWQgc3BhY2UgaXMgbGVmdCBmb3I6CisgKiAtIDY0LWJpdCB0aW1lX3QgdG8gc29sdmUgeTIwMzggcHJvYmxlbQorICogLSAyIG1pc2NlbGxhbmVvdXMgMzItYml0IHZhbHVlcworICovCitzdHJ1Y3Qgc2VtaWQ2NF9kcyB7CisJc3RydWN0IGlwYzY0X3Blcm0gc2VtX3Blcm07CS8qIHBlcm1pc3Npb25zIC4uIHNlZSBpcGMuaCAqLworCV9fa2VybmVsX3RpbWVfdAlzZW1fb3RpbWU7CS8qIGxhc3Qgc2Vtb3AgdGltZSAqLworI2lmIF9fQklUU19QRVJfTE9ORyAhPSA2NAorCXVuc2lnbmVkIGxvbmcJX191bnVzZWQxOworI2VuZGlmCisJX19rZXJuZWxfdGltZV90CXNlbV9jdGltZTsJLyogbGFzdCBjaGFuZ2UgdGltZSAqLworI2lmIF9fQklUU19QRVJfTE9ORyAhPSA2NAorCXVuc2lnbmVkIGxvbmcJX191bnVzZWQyOworI2VuZGlmCisJdW5zaWduZWQgbG9uZwlzZW1fbnNlbXM7CS8qIG5vLiBvZiBzZW1hcGhvcmVzIGluIGFycmF5ICovCisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDM7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDQ7Cit9OworCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19TRU1CVUZfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zZXR1cC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zZXR1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYzI2YTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NldHVwLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfU0VUVVBfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX1NFVFVQX0gKKworI2RlZmluZSBDT01NQU5EX0xJTkVfU0laRQk1MTIKKworI2VuZGlmCS8qIF9fQVNNX0dFTkVSSUNfU0VUVVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaG1idWYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2htYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2OGZhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2htYnVmLmgKQEAgLTAsMCArMSw1OSBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX1NITUJVRl9ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfU0hNQlVGX0gKKworI2luY2x1ZGUgPGFzbS9iaXRzcGVybG9uZy5oPgorCisvKgorICogVGhlIHNobWlkNjRfZHMgc3RydWN0dXJlIGZvciB4ODYgYXJjaGl0ZWN0dXJlLgorICogTm90ZSBleHRyYSBwYWRkaW5nIGJlY2F1c2UgdGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIGJhY2sgYW5kIGZvcnRoCisgKiBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlciBzcGFjZS4KKyAqCisgKiBzaG1pZDY0X2RzIHdhcyBvcmlnaW5hbGx5IG1lYW50IHRvIGJlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYywgYnV0CisgKiBldmVyeW9uZSBqdXN0IGVuZGVkIHVwIG1ha2luZyBpZGVudGljYWwgY29waWVzIHdpdGhvdXQgc3BlY2lmaWMKKyAqIG9wdGltaXphdGlvbnMsIHNvIHdlIG1heSBqdXN0IGFzIHdlbGwgYWxsIHVzZSB0aGUgc2FtZSBvbmUuCisgKgorICogNjQgYml0IGFyY2hpdGVjdHVyZXMgdHlwaWNhbGx5IGRlZmluZSBhIDY0IGJpdCBfX2tlcm5lbF90aW1lX3QsCisgKiBzbyB0aGV5IGRvIG5vdCBuZWVkIHRoZSBmaXJzdCB0d28gcGFkZGluZyB3b3Jkcy4KKyAqIE9uIGJpZy1lbmRpYW4gc3lzdGVtcywgdGhlIHBhZGRpbmcgaXMgaW4gdGhlIHdyb25nIHBsYWNlLgorICoKKyAqCisgKiBQYWQgc3BhY2UgaXMgbGVmdCBmb3I6CisgKiAtIDY0LWJpdCB0aW1lX3QgdG8gc29sdmUgeTIwMzggcHJvYmxlbQorICogLSAyIG1pc2NlbGxhbmVvdXMgMzItYml0IHZhbHVlcworICovCisKK3N0cnVjdCBzaG1pZDY0X2RzIHsKKwlzdHJ1Y3QgaXBjNjRfcGVybQlzaG1fcGVybTsJLyogb3BlcmF0aW9uIHBlcm1zICovCisJc2l6ZV90CQkJc2htX3NlZ3N6OwkvKiBzaXplIG9mIHNlZ21lbnQgKGJ5dGVzKSAqLworCV9fa2VybmVsX3RpbWVfdAkJc2htX2F0aW1lOwkvKiBsYXN0IGF0dGFjaCB0aW1lICovCisjaWYgX19CSVRTX1BFUl9MT05HICE9IDY0CisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQxOworI2VuZGlmCisJX19rZXJuZWxfdGltZV90CQlzaG1fZHRpbWU7CS8qIGxhc3QgZGV0YWNoIHRpbWUgKi8KKyNpZiBfX0JJVFNfUEVSX0xPTkcgIT0gNjQKKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDI7CisjZW5kaWYKKwlfX2tlcm5lbF90aW1lX3QJCXNobV9jdGltZTsJLyogbGFzdCBjaGFuZ2UgdGltZSAqLworI2lmIF9fQklUU19QRVJfTE9ORyAhPSA2NAorCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMzsKKyNlbmRpZgorCV9fa2VybmVsX3BpZF90CQlzaG1fY3BpZDsJLyogcGlkIG9mIGNyZWF0b3IgKi8KKwlfX2tlcm5lbF9waWRfdAkJc2htX2xwaWQ7CS8qIHBpZCBvZiBsYXN0IG9wZXJhdG9yICovCisJdW5zaWduZWQgbG9uZwkJc2htX25hdHRjaDsJLyogbm8uIG9mIGN1cnJlbnQgYXR0YWNoZXMgKi8KKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDQ7CisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQ1OworfTsKKworc3RydWN0IHNobWluZm82NCB7CisJdW5zaWduZWQgbG9uZwlzaG1tYXg7CisJdW5zaWduZWQgbG9uZwlzaG1taW47CisJdW5zaWduZWQgbG9uZwlzaG1tbmk7CisJdW5zaWduZWQgbG9uZwlzaG1zZWc7CisJdW5zaWduZWQgbG9uZwlzaG1hbGw7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDE7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDI7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDM7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDQ7Cit9OworCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19TSE1CVUZfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaG1wYXJhbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaG1wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYTM4NTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NobXBhcmFtLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfU0hNUEFSQU1fSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX1NITVBBUkFNX0gKKworI2RlZmluZSBTSE1MQkEgUEFHRV9TSVpFCSAvKiBhdHRhY2ggYWRkciBhIG11bHRpcGxlIG9mIHRoaXMgKi8KKworI2VuZGlmIC8qIF9BU01fR0VORVJJQ19TSE1QQVJBTV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NpZ2luZm8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2lnaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzN2U0NDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NpZ2luZm8uaApAQCAtMCwwICsxLDI4OCBAQAorI2lmbmRlZiBfQVNNX0dFTkVSSUNfU0lHSU5GT19ICisjZGVmaW5lIF9BU01fR0VORVJJQ19TSUdJTkZPX0gKKworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwordHlwZWRlZiB1bmlvbiBzaWd2YWwgeworCWludCBzaXZhbF9pbnQ7CisJdm9pZCAqc2l2YWxfcHRyOworfSBzaWd2YWxfdDsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHNpemUgKGluY2x1ZGluZyBwYWRkaW5nKSBvZiB0aGUgcGFydCBvZiB0aGUKKyAqIHN0cnVjdCBzaWdpbmZvIHRoYXQgaXMgYmVmb3JlIHRoZSB1bmlvbi4KKyAqLworI2lmbmRlZiBfX0FSQ0hfU0lfUFJFQU1CTEVfU0laRQorI2RlZmluZSBfX0FSQ0hfU0lfUFJFQU1CTEVfU0laRQkoMyAqIHNpemVvZihpbnQpKQorI2VuZGlmCisKKyNkZWZpbmUgU0lfTUFYX1NJWkUJMTI4CisjaWZuZGVmIFNJX1BBRF9TSVpFCisjZGVmaW5lIFNJX1BBRF9TSVpFCSgoU0lfTUFYX1NJWkUgLSBfX0FSQ0hfU0lfUFJFQU1CTEVfU0laRSkgLyBzaXplb2YoaW50KSkKKyNlbmRpZgorCisjaWZuZGVmIF9fQVJDSF9TSV9VSURfVAorI2RlZmluZSBfX0FSQ0hfU0lfVUlEX1QJX19rZXJuZWxfdWlkMzJfdAorI2VuZGlmCisKKy8qCisgKiBUaGUgZGVmYXVsdCAic2lfYmFuZCIgdHlwZSBpcyAibG9uZyIsIGFzIHNwZWNpZmllZCBieSBQT1NJWC4KKyAqIEhvd2V2ZXIsIHNvbWUgYXJjaGl0ZWN0dXJlcyB3YW50IHRvIG92ZXJyaWRlIHRoaXMgdG8gImludCIKKyAqIGZvciBoaXN0b3JpY2FsIGNvbXBhdGliaWxpdHkgcmVhc29ucywgc28gd2UgYWxsb3cgdGhhdC4KKyAqLworI2lmbmRlZiBfX0FSQ0hfU0lfQkFORF9UCisjZGVmaW5lIF9fQVJDSF9TSV9CQU5EX1QgbG9uZworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9BUkNIX1NJR0lORk9fVAorCit0eXBlZGVmIHN0cnVjdCBzaWdpbmZvIHsKKwlpbnQgc2lfc2lnbm87CisJaW50IHNpX2Vycm5vOworCWludCBzaV9jb2RlOworCisJdW5pb24geworCQlpbnQgX3BhZFtTSV9QQURfU0laRV07CisKKwkJLyoga2lsbCgpICovCisJCXN0cnVjdCB7CisJCQlfX2tlcm5lbF9waWRfdCBfcGlkOwkvKiBzZW5kZXIncyBwaWQgKi8KKwkJCV9fQVJDSF9TSV9VSURfVCBfdWlkOwkvKiBzZW5kZXIncyB1aWQgKi8KKwkJfSBfa2lsbDsKKworCQkvKiBQT1NJWC4xYiB0aW1lcnMgKi8KKwkJc3RydWN0IHsKKwkJCV9fa2VybmVsX3RpbWVyX3QgX3RpZDsJLyogdGltZXIgaWQgKi8KKwkJCWludCBfb3ZlcnJ1bjsJCS8qIG92ZXJydW4gY291bnQgKi8KKwkJCWNoYXIgX3BhZFtzaXplb2YoIF9fQVJDSF9TSV9VSURfVCkgLSBzaXplb2YoaW50KV07CisJCQlzaWd2YWxfdCBfc2lndmFsOwkvKiBzYW1lIGFzIGJlbG93ICovCisJCQlpbnQgX3N5c19wcml2YXRlOyAgICAgICAvKiBub3QgdG8gYmUgcGFzc2VkIHRvIHVzZXIgKi8KKwkJfSBfdGltZXI7CisKKwkJLyogUE9TSVguMWIgc2lnbmFscyAqLworCQlzdHJ1Y3QgeworCQkJX19rZXJuZWxfcGlkX3QgX3BpZDsJLyogc2VuZGVyJ3MgcGlkICovCisJCQlfX0FSQ0hfU0lfVUlEX1QgX3VpZDsJLyogc2VuZGVyJ3MgdWlkICovCisJCQlzaWd2YWxfdCBfc2lndmFsOworCQl9IF9ydDsKKworCQkvKiBTSUdDSExEICovCisJCXN0cnVjdCB7CisJCQlfX2tlcm5lbF9waWRfdCBfcGlkOwkvKiB3aGljaCBjaGlsZCAqLworCQkJX19BUkNIX1NJX1VJRF9UIF91aWQ7CS8qIHNlbmRlcidzIHVpZCAqLworCQkJaW50IF9zdGF0dXM7CQkvKiBleGl0IGNvZGUgKi8KKwkJCV9fa2VybmVsX2Nsb2NrX3QgX3V0aW1lOworCQkJX19rZXJuZWxfY2xvY2tfdCBfc3RpbWU7CisJCX0gX3NpZ2NobGQ7CisKKwkJLyogU0lHSUxMLCBTSUdGUEUsIFNJR1NFR1YsIFNJR0JVUyAqLworCQlzdHJ1Y3QgeworCQkJdm9pZCAqX2FkZHI7IC8qIGZhdWx0aW5nIGluc24vbWVtb3J5IHJlZi4gKi8KKyNpZmRlZiBfX0FSQ0hfU0lfVFJBUE5PCisJCQlpbnQgX3RyYXBubzsJLyogVFJBUCAjIHdoaWNoIGNhdXNlZCB0aGUgc2lnbmFsICovCisjZW5kaWYKKwkJCXNob3J0IF9hZGRyX2xzYjsgLyogTFNCIG9mIHRoZSByZXBvcnRlZCBhZGRyZXNzICovCisJCX0gX3NpZ2ZhdWx0OworCisJCS8qIFNJR1BPTEwgKi8KKwkJc3RydWN0IHsKKwkJCV9fQVJDSF9TSV9CQU5EX1QgX2JhbmQ7CS8qIFBPTExfSU4sIFBPTExfT1VULCBQT0xMX01TRyAqLworCQkJaW50IF9mZDsKKwkJfSBfc2lncG9sbDsKKworCQkvKiBTSUdTWVMgKi8KKwkJc3RydWN0IHsKKwkJCXZvaWQgKl9jYWxsX2FkZHI7IC8qIGNhbGxpbmcgdXNlciBpbnNuICovCisJCQlpbnQgX3N5c2NhbGw7CS8qIHRyaWdnZXJpbmcgc3lzdGVtIGNhbGwgbnVtYmVyICovCisJCQl1bnNpZ25lZCBpbnQgX2FyY2g7CS8qIEFVRElUX0FSQ0hfKiBvZiBzeXNjYWxsICovCisJCX0gX3NpZ3N5czsKKwl9IF9zaWZpZWxkczsKK30gc2lnaW5mb190OworCisvKiBJZiB0aGUgYXJjaCBzaGFyZXMgc2lnaW5mbywgdGhlbiBpdCBoYXMgU0lHU1lTLiAqLworI2RlZmluZSBfX0FSQ0hfU0lHU1lTCisjZW5kaWYKKworLyoKKyAqIEhvdyB0aGVzZSBmaWVsZHMgYXJlIHRvIGJlIGFjY2Vzc2VkLgorICovCisjZGVmaW5lIHNpX3BpZAkJX3NpZmllbGRzLl9raWxsLl9waWQKKyNkZWZpbmUgc2lfdWlkCQlfc2lmaWVsZHMuX2tpbGwuX3VpZAorI2RlZmluZSBzaV90aWQJCV9zaWZpZWxkcy5fdGltZXIuX3RpZAorI2RlZmluZSBzaV9vdmVycnVuCV9zaWZpZWxkcy5fdGltZXIuX292ZXJydW4KKyNkZWZpbmUgc2lfc3lzX3ByaXZhdGUgIF9zaWZpZWxkcy5fdGltZXIuX3N5c19wcml2YXRlCisjZGVmaW5lIHNpX3N0YXR1cwlfc2lmaWVsZHMuX3NpZ2NobGQuX3N0YXR1cworI2RlZmluZSBzaV91dGltZQlfc2lmaWVsZHMuX3NpZ2NobGQuX3V0aW1lCisjZGVmaW5lIHNpX3N0aW1lCV9zaWZpZWxkcy5fc2lnY2hsZC5fc3RpbWUKKyNkZWZpbmUgc2lfdmFsdWUJX3NpZmllbGRzLl9ydC5fc2lndmFsCisjZGVmaW5lIHNpX2ludAkJX3NpZmllbGRzLl9ydC5fc2lndmFsLnNpdmFsX2ludAorI2RlZmluZSBzaV9wdHIJCV9zaWZpZWxkcy5fcnQuX3NpZ3ZhbC5zaXZhbF9wdHIKKyNkZWZpbmUgc2lfYWRkcgkJX3NpZmllbGRzLl9zaWdmYXVsdC5fYWRkcgorI2lmZGVmIF9fQVJDSF9TSV9UUkFQTk8KKyNkZWZpbmUgc2lfdHJhcG5vCV9zaWZpZWxkcy5fc2lnZmF1bHQuX3RyYXBubworI2VuZGlmCisjZGVmaW5lIHNpX2FkZHJfbHNiCV9zaWZpZWxkcy5fc2lnZmF1bHQuX2FkZHJfbHNiCisjZGVmaW5lIHNpX2JhbmQJCV9zaWZpZWxkcy5fc2lncG9sbC5fYmFuZAorI2RlZmluZSBzaV9mZAkJX3NpZmllbGRzLl9zaWdwb2xsLl9mZAorI2lmZGVmIF9fQVJDSF9TSUdTWVMKKyNkZWZpbmUgc2lfY2FsbF9hZGRyCV9zaWZpZWxkcy5fc2lnc3lzLl9jYWxsX2FkZHIKKyNkZWZpbmUgc2lfc3lzY2FsbAlfc2lmaWVsZHMuX3NpZ3N5cy5fc3lzY2FsbAorI2RlZmluZSBzaV9hcmNoCQlfc2lmaWVsZHMuX3NpZ3N5cy5fYXJjaAorI2VuZGlmCisKKyNkZWZpbmUgX19TSV9LSUxMCTAKKyNkZWZpbmUgX19TSV9USU1FUgkwCisjZGVmaW5lIF9fU0lfUE9MTAkwCisjZGVmaW5lIF9fU0lfRkFVTFQJMAorI2RlZmluZSBfX1NJX0NITEQJMAorI2RlZmluZSBfX1NJX1JUCQkwCisjZGVmaW5lIF9fU0lfTUVTR1EJMAorI2RlZmluZSBfX1NJX1NZUwkwCisjZGVmaW5lIF9fU0lfQ09ERShULE4pCShOKQorCisvKgorICogc2lfY29kZSB2YWx1ZXMKKyAqIERpZ2l0YWwgcmVzZXJ2ZXMgcG9zaXRpdmUgdmFsdWVzIGZvciBrZXJuZWwtZ2VuZXJhdGVkIHNpZ25hbHMuCisgKi8KKyNkZWZpbmUgU0lfVVNFUgkJMAkJLyogc2VudCBieSBraWxsLCBzaWdzZW5kLCByYWlzZSAqLworI2RlZmluZSBTSV9LRVJORUwJMHg4MAkJLyogc2VudCBieSB0aGUga2VybmVsIGZyb20gc29tZXdoZXJlICovCisjZGVmaW5lIFNJX1FVRVVFCS0xCQkvKiBzZW50IGJ5IHNpZ3F1ZXVlICovCisjZGVmaW5lIFNJX1RJTUVSIF9fU0lfQ09ERShfX1NJX1RJTUVSLC0yKSAvKiBzZW50IGJ5IHRpbWVyIGV4cGlyYXRpb24gKi8KKyNkZWZpbmUgU0lfTUVTR1EgX19TSV9DT0RFKF9fU0lfTUVTR1EsLTMpIC8qIHNlbnQgYnkgcmVhbCB0aW1lIG1lc3Egc3RhdGUgY2hhbmdlICovCisjZGVmaW5lIFNJX0FTWU5DSU8JLTQJCS8qIHNlbnQgYnkgQUlPIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgU0lfU0lHSU8JLTUJCS8qIHNlbnQgYnkgcXVldWVkIFNJR0lPICovCisjZGVmaW5lIFNJX1RLSUxMCS02CQkvKiBzZW50IGJ5IHRraWxsIHN5c3RlbSBjYWxsICovCisjZGVmaW5lIFNJX0RFVEhSRUFECS03CQkvKiBzZW50IGJ5IGV4ZWN2ZSgpIGtpbGxpbmcgc3Vic2lkaWFyeSB0aHJlYWRzICovCisKKyNkZWZpbmUgU0lfRlJPTVVTRVIoc2lwdHIpCSgoc2lwdHIpLT5zaV9jb2RlIDw9IDApCisjZGVmaW5lIFNJX0ZST01LRVJORUwoc2lwdHIpCSgoc2lwdHIpLT5zaV9jb2RlID4gMCkKKworLyoKKyAqIFNJR0lMTCBzaV9jb2RlcworICovCisjZGVmaW5lIElMTF9JTExPUEMJKF9fU0lfRkFVTFR8MSkJLyogaWxsZWdhbCBvcGNvZGUgKi8KKyNkZWZpbmUgSUxMX0lMTE9QTgkoX19TSV9GQVVMVHwyKQkvKiBpbGxlZ2FsIG9wZXJhbmQgKi8KKyNkZWZpbmUgSUxMX0lMTEFEUgkoX19TSV9GQVVMVHwzKQkvKiBpbGxlZ2FsIGFkZHJlc3NpbmcgbW9kZSAqLworI2RlZmluZSBJTExfSUxMVFJQCShfX1NJX0ZBVUxUfDQpCS8qIGlsbGVnYWwgdHJhcCAqLworI2RlZmluZSBJTExfUFJWT1BDCShfX1NJX0ZBVUxUfDUpCS8qIHByaXZpbGVnZWQgb3Bjb2RlICovCisjZGVmaW5lIElMTF9QUlZSRUcJKF9fU0lfRkFVTFR8NikJLyogcHJpdmlsZWdlZCByZWdpc3RlciAqLworI2RlZmluZSBJTExfQ09QUk9DCShfX1NJX0ZBVUxUfDcpCS8qIGNvcHJvY2Vzc29yIGVycm9yICovCisjZGVmaW5lIElMTF9CQURTVEsJKF9fU0lfRkFVTFR8OCkJLyogaW50ZXJuYWwgc3RhY2sgZXJyb3IgKi8KKyNkZWZpbmUgTlNJR0lMTAkJOAorCisvKgorICogU0lHRlBFIHNpX2NvZGVzCisgKi8KKyNkZWZpbmUgRlBFX0lOVERJVgkoX19TSV9GQVVMVHwxKQkvKiBpbnRlZ2VyIGRpdmlkZSBieSB6ZXJvICovCisjZGVmaW5lIEZQRV9JTlRPVkYJKF9fU0lfRkFVTFR8MikJLyogaW50ZWdlciBvdmVyZmxvdyAqLworI2RlZmluZSBGUEVfRkxURElWCShfX1NJX0ZBVUxUfDMpCS8qIGZsb2F0aW5nIHBvaW50IGRpdmlkZSBieSB6ZXJvICovCisjZGVmaW5lIEZQRV9GTFRPVkYJKF9fU0lfRkFVTFR8NCkJLyogZmxvYXRpbmcgcG9pbnQgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRlBFX0ZMVFVORAkoX19TSV9GQVVMVHw1KQkvKiBmbG9hdGluZyBwb2ludCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgRlBFX0ZMVFJFUwkoX19TSV9GQVVMVHw2KQkvKiBmbG9hdGluZyBwb2ludCBpbmV4YWN0IHJlc3VsdCAqLworI2RlZmluZSBGUEVfRkxUSU5WCShfX1NJX0ZBVUxUfDcpCS8qIGZsb2F0aW5nIHBvaW50IGludmFsaWQgb3BlcmF0aW9uICovCisjZGVmaW5lIEZQRV9GTFRTVUIJKF9fU0lfRkFVTFR8OCkJLyogc3Vic2NyaXB0IG91dCBvZiByYW5nZSAqLworI2RlZmluZSBOU0lHRlBFCQk4CisKKy8qCisgKiBTSUdTRUdWIHNpX2NvZGVzCisgKi8KKyNkZWZpbmUgU0VHVl9NQVBFUlIJKF9fU0lfRkFVTFR8MSkJLyogYWRkcmVzcyBub3QgbWFwcGVkIHRvIG9iamVjdCAqLworI2RlZmluZSBTRUdWX0FDQ0VSUgkoX19TSV9GQVVMVHwyKQkvKiBpbnZhbGlkIHBlcm1pc3Npb25zIGZvciBtYXBwZWQgb2JqZWN0ICovCisjZGVmaW5lIE5TSUdTRUdWCTIKKworLyoKKyAqIFNJR0JVUyBzaV9jb2RlcworICovCisjZGVmaW5lIEJVU19BRFJBTE4JKF9fU0lfRkFVTFR8MSkJLyogaW52YWxpZCBhZGRyZXNzIGFsaWdubWVudCAqLworI2RlZmluZSBCVVNfQURSRVJSCShfX1NJX0ZBVUxUfDIpCS8qIG5vbi1leGlzdGVudCBwaHlzaWNhbCBhZGRyZXNzICovCisjZGVmaW5lIEJVU19PQkpFUlIJKF9fU0lfRkFVTFR8MykJLyogb2JqZWN0IHNwZWNpZmljIGhhcmR3YXJlIGVycm9yICovCisvKiBoYXJkd2FyZSBtZW1vcnkgZXJyb3IgY29uc3VtZWQgb24gYSBtYWNoaW5lIGNoZWNrOiBhY3Rpb24gcmVxdWlyZWQgKi8KKyNkZWZpbmUgQlVTX01DRUVSUl9BUgkoX19TSV9GQVVMVHw0KQorLyogaGFyZHdhcmUgbWVtb3J5IGVycm9yIGRldGVjdGVkIGluIHByb2Nlc3MgYnV0IG5vdCBjb25zdW1lZDogYWN0aW9uIG9wdGlvbmFsKi8KKyNkZWZpbmUgQlVTX01DRUVSUl9BTwkoX19TSV9GQVVMVHw1KQorI2RlZmluZSBOU0lHQlVTCQk1CisKKy8qCisgKiBTSUdUUkFQIHNpX2NvZGVzCisgKi8KKyNkZWZpbmUgVFJBUF9CUktQVAkoX19TSV9GQVVMVHwxKQkvKiBwcm9jZXNzIGJyZWFrcG9pbnQgKi8KKyNkZWZpbmUgVFJBUF9UUkFDRQkoX19TSV9GQVVMVHwyKQkvKiBwcm9jZXNzIHRyYWNlIHRyYXAgKi8KKyNkZWZpbmUgVFJBUF9CUkFOQ0ggICAgIChfX1NJX0ZBVUxUfDMpICAvKiBwcm9jZXNzIHRha2VuIGJyYW5jaCB0cmFwICovCisjZGVmaW5lIFRSQVBfSFdCS1BUICAgICAoX19TSV9GQVVMVHw0KSAgLyogaGFyZHdhcmUgYnJlYWtwb2ludC93YXRjaHBvaW50ICovCisjZGVmaW5lIE5TSUdUUkFQCTQKKworLyoKKyAqIFNJR0NITEQgc2lfY29kZXMKKyAqLworI2RlZmluZSBDTERfRVhJVEVECShfX1NJX0NITER8MSkJLyogY2hpbGQgaGFzIGV4aXRlZCAqLworI2RlZmluZSBDTERfS0lMTEVECShfX1NJX0NITER8MikJLyogY2hpbGQgd2FzIGtpbGxlZCAqLworI2RlZmluZSBDTERfRFVNUEVECShfX1NJX0NITER8MykJLyogY2hpbGQgdGVybWluYXRlZCBhYm5vcm1hbGx5ICovCisjZGVmaW5lIENMRF9UUkFQUEVECShfX1NJX0NITER8NCkJLyogdHJhY2VkIGNoaWxkIGhhcyB0cmFwcGVkICovCisjZGVmaW5lIENMRF9TVE9QUEVECShfX1NJX0NITER8NSkJLyogY2hpbGQgaGFzIHN0b3BwZWQgKi8KKyNkZWZpbmUgQ0xEX0NPTlRJTlVFRAkoX19TSV9DSExEfDYpCS8qIHN0b3BwZWQgY2hpbGQgaGFzIGNvbnRpbnVlZCAqLworI2RlZmluZSBOU0lHQ0hMRAk2CisKKy8qCisgKiBTSUdQT0xMIHNpX2NvZGVzCisgKi8KKyNkZWZpbmUgUE9MTF9JTgkJKF9fU0lfUE9MTHwxKQkvKiBkYXRhIGlucHV0IGF2YWlsYWJsZSAqLworI2RlZmluZSBQT0xMX09VVAkoX19TSV9QT0xMfDIpCS8qIG91dHB1dCBidWZmZXJzIGF2YWlsYWJsZSAqLworI2RlZmluZSBQT0xMX01TRwkoX19TSV9QT0xMfDMpCS8qIGlucHV0IG1lc3NhZ2UgYXZhaWxhYmxlICovCisjZGVmaW5lIFBPTExfRVJSCShfX1NJX1BPTEx8NCkJLyogaS9vIGVycm9yICovCisjZGVmaW5lIFBPTExfUFJJCShfX1NJX1BPTEx8NSkJLyogaGlnaCBwcmlvcml0eSBpbnB1dCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgUE9MTF9IVVAJKF9fU0lfUE9MTHw2KQkvKiBkZXZpY2UgZGlzY29ubmVjdGVkICovCisjZGVmaW5lIE5TSUdQT0xMCTYKKworLyoKKyAqIFNJR1NZUyBzaV9jb2RlcworICovCisjZGVmaW5lIFNZU19TRUNDT01QCQkoX19TSV9TWVN8MSkJLyogc2VjY29tcCB0cmlnZ2VyZWQgKi8KKyNkZWZpbmUgTlNJR1NZUwkxCisKKy8qCisgKiBzaWdldmVudCBkZWZpbml0aW9ucworICogCisgKiBJdCBzZWVtcyBsaWtlbHkgdGhhdCBTSUdFVl9USFJFQUQgd2lsbCBoYXZlIHRvIGJlIGhhbmRsZWQgZnJvbSAKKyAqIHVzZXJzcGFjZSwgbGlicHRocmVhZCB0cmFuc211dGluZyBpdCB0byBTSUdFVl9TSUdOQUwsIHdoaWNoIHRoZQorICogdGhyZWFkIG1hbmFnZXIgdGhlbiBjYXRjaGVzIGFuZCBkb2VzIHRoZSBhcHByb3ByaWF0ZSBub25zZW5zZS4KKyAqIEhvd2V2ZXIsIGV2ZXJ5dGhpbmcgaXMgd3JpdHRlbiBvdXQgaGVyZSBzbyBhcyB0byBub3QgZ2V0IGxvc3QuCisgKi8KKyNkZWZpbmUgU0lHRVZfU0lHTkFMCTAJLyogbm90aWZ5IHZpYSBzaWduYWwgKi8KKyNkZWZpbmUgU0lHRVZfTk9ORQkxCS8qIG90aGVyIG5vdGlmaWNhdGlvbjogbWVhbmluZ2xlc3MgKi8KKyNkZWZpbmUgU0lHRVZfVEhSRUFECTIJLyogZGVsaXZlciB2aWEgdGhyZWFkIGNyZWF0aW9uICovCisjZGVmaW5lIFNJR0VWX1RIUkVBRF9JRCA0CS8qIGRlbGl2ZXIgdG8gdGhyZWFkICovCisKKy8qCisgKiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGFsaWdubWVudCBpcyBvayBvbiBhbGwgY3VycmVudCBhcmNoaXRlY3R1cmVzCisgKiBidXQgd2UgbGVhdmUgb3BlbiB0aGlzIGJlaW5nIG92ZXJyaWRkZW4gaW4gdGhlIGZ1dHVyZQorICovCisjaWZuZGVmIF9fQVJDSF9TSUdFVl9QUkVBTUJMRV9TSVpFCisjZGVmaW5lIF9fQVJDSF9TSUdFVl9QUkVBTUJMRV9TSVpFCShzaXplb2YoaW50KSAqIDIgKyBzaXplb2Yoc2lndmFsX3QpKQorI2VuZGlmCisKKyNkZWZpbmUgU0lHRVZfTUFYX1NJWkUJNjQKKyNkZWZpbmUgU0lHRVZfUEFEX1NJWkUJKChTSUdFVl9NQVhfU0laRSAtIF9fQVJDSF9TSUdFVl9QUkVBTUJMRV9TSVpFKSBcCisJCS8gc2l6ZW9mKGludCkpCisKK3R5cGVkZWYgc3RydWN0IHNpZ2V2ZW50IHsKKwlzaWd2YWxfdCBzaWdldl92YWx1ZTsKKwlpbnQgc2lnZXZfc2lnbm87CisJaW50IHNpZ2V2X25vdGlmeTsKKwl1bmlvbiB7CisJCWludCBfcGFkW1NJR0VWX1BBRF9TSVpFXTsKKwkJIGludCBfdGlkOworCisJCXN0cnVjdCB7CisJCQl2b2lkICgqX2Z1bmN0aW9uKShzaWd2YWxfdCk7CisJCQl2b2lkICpfYXR0cmlidXRlOwkvKiByZWFsbHkgcHRocmVhZF9hdHRyX3QgKi8KKwkJfSBfc2lnZXZfdGhyZWFkOworCX0gX3NpZ2V2X3VuOworfSBzaWdldmVudF90OworCisjZGVmaW5lIHNpZ2V2X25vdGlmeV9mdW5jdGlvbglfc2lnZXZfdW4uX3NpZ2V2X3RocmVhZC5fZnVuY3Rpb24KKyNkZWZpbmUgc2lnZXZfbm90aWZ5X2F0dHJpYnV0ZXMJX3NpZ2V2X3VuLl9zaWdldl90aHJlYWQuX2F0dHJpYnV0ZQorI2RlZmluZSBzaWdldl9ub3RpZnlfdGhyZWFkX2lkCSBfc2lnZXZfdW4uX3RpZAorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWduYWwtZGVmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWduYWwtZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Y2ZiNmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NpZ25hbC1kZWZzLmgKQEAgLTAsMCArMSwyOCBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX1NJR05BTF9ERUZTX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19TSUdOQUxfREVGU19ICisKKworCisjaWZuZGVmIFNJR19CTE9DSworI2RlZmluZSBTSUdfQkxPQ0sgICAgICAgICAgMAkvKiBmb3IgYmxvY2tpbmcgc2lnbmFscyAqLworI2VuZGlmCisjaWZuZGVmIFNJR19VTkJMT0NLCisjZGVmaW5lIFNJR19VTkJMT0NLICAgICAgICAxCS8qIGZvciB1bmJsb2NraW5nIHNpZ25hbHMgKi8KKyNlbmRpZgorI2lmbmRlZiBTSUdfU0VUTUFTSworI2RlZmluZSBTSUdfU0VUTUFTSyAgICAgICAgMgkvKiBmb3Igc2V0dGluZyB0aGUgc2lnbmFsIG1hc2sgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXwordHlwZWRlZiB2b2lkIF9fc2lnbmFsZm5fdChpbnQpOwordHlwZWRlZiBfX3NpZ25hbGZuX3QgKl9fc2lnaGFuZGxlcl90OworCit0eXBlZGVmIHZvaWQgX19yZXN0b3JlZm5fdCh2b2lkKTsKK3R5cGVkZWYgX19yZXN0b3JlZm5fdCAqX19zaWdyZXN0b3JlX3Q7CisKKyNkZWZpbmUgU0lHX0RGTAkoKF9fc2lnaGFuZGxlcl90KTApCS8qIGRlZmF1bHQgc2lnbmFsIGhhbmRsaW5nICovCisjZGVmaW5lIFNJR19JR04JKChfX3NpZ2hhbmRsZXJfdCkxKQkvKiBpZ25vcmUgc2lnbmFsICovCisjZGVmaW5lIFNJR19FUlIJKChfX3NpZ2hhbmRsZXJfdCktMSkJLyogZXJyb3IgcmV0dXJuIGZyb20gc2lnbmFsICovCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNNX0dFTkVSSUNfU0lHTkFMX0RFRlNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWduYWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViNjE2NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2lnbmFsLmgKQEAgLTAsMCArMSwxMjMgQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19TSUdOQUxfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX1NJR05BTF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIF9OU0lHCQk2NAorI2RlZmluZSBfTlNJR19CUFcJX19CSVRTX1BFUl9MT05HCisjZGVmaW5lIF9OU0lHX1dPUkRTCShfTlNJRyAvIF9OU0lHX0JQVykKKworI2RlZmluZSBTSUdIVVAJCSAxCisjZGVmaW5lIFNJR0lOVAkJIDIKKyNkZWZpbmUgU0lHUVVJVAkJIDMKKyNkZWZpbmUgU0lHSUxMCQkgNAorI2RlZmluZSBTSUdUUkFQCQkgNQorI2RlZmluZSBTSUdBQlJUCQkgNgorI2RlZmluZSBTSUdJT1QJCSA2CisjZGVmaW5lIFNJR0JVUwkJIDcKKyNkZWZpbmUgU0lHRlBFCQkgOAorI2RlZmluZSBTSUdLSUxMCQkgOQorI2RlZmluZSBTSUdVU1IxCQkxMAorI2RlZmluZSBTSUdTRUdWCQkxMQorI2RlZmluZSBTSUdVU1IyCQkxMgorI2RlZmluZSBTSUdQSVBFCQkxMworI2RlZmluZSBTSUdBTFJNCQkxNAorI2RlZmluZSBTSUdURVJNCQkxNQorI2RlZmluZSBTSUdTVEtGTFQJMTYKKyNkZWZpbmUgU0lHQ0hMRAkJMTcKKyNkZWZpbmUgU0lHQ09OVAkJMTgKKyNkZWZpbmUgU0lHU1RPUAkJMTkKKyNkZWZpbmUgU0lHVFNUUAkJMjAKKyNkZWZpbmUgU0lHVFRJTgkJMjEKKyNkZWZpbmUgU0lHVFRPVQkJMjIKKyNkZWZpbmUgU0lHVVJHCQkyMworI2RlZmluZSBTSUdYQ1BVCQkyNAorI2RlZmluZSBTSUdYRlNaCQkyNQorI2RlZmluZSBTSUdWVEFMUk0JMjYKKyNkZWZpbmUgU0lHUFJPRgkJMjcKKyNkZWZpbmUgU0lHV0lOQ0gJMjgKKyNkZWZpbmUgU0lHSU8JCTI5CisjZGVmaW5lIFNJR1BPTEwJCVNJR0lPCisvKgorI2RlZmluZSBTSUdMT1NUCQkyOQorKi8KKyNkZWZpbmUgU0lHUFdSCQkzMAorI2RlZmluZSBTSUdTWVMJCTMxCisjZGVmaW5lCVNJR1VOVVNFRAkzMQorCisvKiBUaGVzZSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgY29uc3RhbnRzIGZyb20gdXNlcmxhbmQuICAqLworI2RlZmluZSBTSUdSVE1JTgkzMgorI2lmbmRlZiBTSUdSVE1BWAorI2RlZmluZSBTSUdSVE1BWAlfTlNJRworI2VuZGlmCisKKy8qCisgKiBTQV9GTEFHUyB2YWx1ZXM6CisgKgorICogU0FfT05TVEFDSyBpbmRpY2F0ZXMgdGhhdCBhIHJlZ2lzdGVyZWQgc3RhY2tfdCB3aWxsIGJlIHVzZWQuCisgKiBTQV9SRVNUQVJUIGZsYWcgdG8gZ2V0IHJlc3RhcnRpbmcgc2lnbmFscyAod2hpY2ggd2VyZSB0aGUgZGVmYXVsdCBsb25nIGFnbykKKyAqIFNBX05PQ0xEU1RPUCBmbGFnIHRvIHR1cm4gb2ZmIFNJR0NITEQgd2hlbiBjaGlsZHJlbiBzdG9wLgorICogU0FfUkVTRVRIQU5EIGNsZWFycyB0aGUgaGFuZGxlciB3aGVuIHRoZSBzaWduYWwgaXMgZGVsaXZlcmVkLgorICogU0FfTk9DTERXQUlUIGZsYWcgb24gU0lHQ0hMRCB0byBpbmhpYml0IHpvbWJpZXMuCisgKiBTQV9OT0RFRkVSIHByZXZlbnRzIHRoZSBjdXJyZW50IHNpZ25hbCBmcm9tIGJlaW5nIG1hc2tlZCBpbiB0aGUgaGFuZGxlci4KKyAqCisgKiBTQV9PTkVTSE9UIGFuZCBTQV9OT01BU0sgYXJlIHRoZSBoaXN0b3JpY2FsIExpbnV4IG5hbWVzIGZvciB0aGUgU2luZ2xlCisgKiBVbml4IG5hbWVzIFJFU0VUSEFORCBhbmQgTk9ERUZFUiByZXNwZWN0aXZlbHkuCisgKi8KKyNkZWZpbmUgU0FfTk9DTERTVE9QCTB4MDAwMDAwMDEKKyNkZWZpbmUgU0FfTk9DTERXQUlUCTB4MDAwMDAwMDIKKyNkZWZpbmUgU0FfU0lHSU5GTwkweDAwMDAwMDA0CisjZGVmaW5lIFNBX09OU1RBQ0sJMHgwODAwMDAwMAorI2RlZmluZSBTQV9SRVNUQVJUCTB4MTAwMDAwMDAKKyNkZWZpbmUgU0FfTk9ERUZFUgkweDQwMDAwMDAwCisjZGVmaW5lIFNBX1JFU0VUSEFORAkweDgwMDAwMDAwCisKKyNkZWZpbmUgU0FfTk9NQVNLCVNBX05PREVGRVIKKyNkZWZpbmUgU0FfT05FU0hPVAlTQV9SRVNFVEhBTkQKKworLyoKKyAqIE5ldyBhcmNoaXRlY3R1cmVzIHNob3VsZCBub3QgZGVmaW5lIHRoZSBvYnNvbGV0ZQorICoJU0FfUkVTVE9SRVIJMHgwNDAwMDAwMAorICovCisKKy8qCisgKiBzaWdhbHRzdGFjayBjb250cm9scworICovCisjZGVmaW5lIFNTX09OU1RBQ0sJMQorI2RlZmluZSBTU19ESVNBQkxFCTIKKworI2RlZmluZSBNSU5TSUdTVEtTWgkyMDQ4CisjZGVmaW5lIFNJR1NUS1NaCTgxOTIKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIHNpZ1tfTlNJR19XT1JEU107Cit9IHNpZ3NldF90OworCisvKiBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHJlcXVpcmVkIGZvciBsaW51eC9zeXNjYWxscy5oICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgb2xkX3NpZ3NldF90OworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnbmFsLWRlZnMuaD4KKworc3RydWN0IHNpZ2FjdGlvbiB7CisJX19zaWdoYW5kbGVyX3Qgc2FfaGFuZGxlcjsKKwl1bnNpZ25lZCBsb25nIHNhX2ZsYWdzOworI2lmZGVmIFNBX1JFU1RPUkVSCisJX19zaWdyZXN0b3JlX3Qgc2FfcmVzdG9yZXI7CisjZW5kaWYKKwlzaWdzZXRfdCBzYV9tYXNrOwkJLyogbWFzayBsYXN0IGZvciBleHRlbnNpYmlsaXR5ICovCit9OworCitzdHJ1Y3Qga19zaWdhY3Rpb24geworCXN0cnVjdCBzaWdhY3Rpb24gc2E7Cit9OworCit0eXBlZGVmIHN0cnVjdCBzaWdhbHRzdGFjayB7CisJdm9pZCAqc3Nfc3A7CisJaW50IHNzX2ZsYWdzOworCXNpemVfdCBzc19zaXplOworfSBzdGFja190OworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfU0lHTkFMX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc29ja2V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjExNWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NvY2tldC5oCkBAIC0wLDAgKzEsNjcgQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19TT0NLRVRfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxhc20vc29ja2lvcy5oPgorCisvKiBGb3Igc2V0c29ja29wdCgyKSAqLworI2RlZmluZSBTT0xfU09DS0VUCTEKKworI2RlZmluZSBTT19ERUJVRwkxCisjZGVmaW5lIFNPX1JFVVNFQUREUgkyCisjZGVmaW5lIFNPX1RZUEUJCTMKKyNkZWZpbmUgU09fRVJST1IJNAorI2RlZmluZSBTT19ET05UUk9VVEUJNQorI2RlZmluZSBTT19CUk9BRENBU1QJNgorI2RlZmluZSBTT19TTkRCVUYJNworI2RlZmluZSBTT19SQ1ZCVUYJOAorI2RlZmluZSBTT19TTkRCVUZGT1JDRQkzMgorI2RlZmluZSBTT19SQ1ZCVUZGT1JDRQkzMworI2RlZmluZSBTT19LRUVQQUxJVkUJOQorI2RlZmluZSBTT19PT0JJTkxJTkUJMTAKKyNkZWZpbmUgU09fTk9fQ0hFQ0sJMTEKKyNkZWZpbmUgU09fUFJJT1JJVFkJMTIKKyNkZWZpbmUgU09fTElOR0VSCTEzCisjZGVmaW5lIFNPX0JTRENPTVBBVAkxNAorLyogVG8gYWRkIDojZGVmaW5lIFNPX1JFVVNFUE9SVCAxNSAqLworCisjaWZuZGVmIFNPX1BBU1NDUkVEIC8qIHBvd2VycGMgb25seSBkaWZmZXJzIGluIHRoZXNlICovCisjZGVmaW5lIFNPX1BBU1NDUkVECTE2CisjZGVmaW5lIFNPX1BFRVJDUkVECTE3CisjZGVmaW5lIFNPX1JDVkxPV0FUCTE4CisjZGVmaW5lIFNPX1NORExPV0FUCTE5CisjZGVmaW5lIFNPX1JDVlRJTUVPCTIwCisjZGVmaW5lIFNPX1NORFRJTUVPCTIxCisjZW5kaWYKKworLyogU2VjdXJpdHkgbGV2ZWxzIC0gYXMgcGVyIE5STCBJUHY2IC0gZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgKi8KKyNkZWZpbmUgU09fU0VDVVJJVFlfQVVUSEVOVElDQVRJT04JCTIyCisjZGVmaW5lIFNPX1NFQ1VSSVRZX0VOQ1JZUFRJT05fVFJBTlNQT1JUCTIzCisjZGVmaW5lIFNPX1NFQ1VSSVRZX0VOQ1JZUFRJT05fTkVUV09SSwkJMjQKKworI2RlZmluZSBTT19CSU5EVE9ERVZJQ0UJMjUKKworLyogU29ja2V0IGZpbHRlcmluZyAqLworI2RlZmluZSBTT19BVFRBQ0hfRklMVEVSCTI2CisjZGVmaW5lIFNPX0RFVEFDSF9GSUxURVIJMjcKKworI2RlZmluZSBTT19QRUVSTkFNRQkJMjgKKyNkZWZpbmUgU09fVElNRVNUQU1QCQkyOQorI2RlZmluZSBTQ01fVElNRVNUQU1QCQlTT19USU1FU1RBTVAKKworI2RlZmluZSBTT19BQ0NFUFRDT05OCQkzMAorCisjZGVmaW5lIFNPX1BFRVJTRUMJCTMxCisjZGVmaW5lIFNPX1BBU1NTRUMJCTM0CisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkzNQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCisKKyNkZWZpbmUgU09fTUFSSwkJCTM2CisKKyNkZWZpbmUgU09fVElNRVNUQU1QSU5HCQkzNworI2RlZmluZSBTQ01fVElNRVNUQU1QSU5HCVNPX1RJTUVTVEFNUElORworCisjZGVmaW5lIFNPX1BST1RPQ09MCQkzOAorI2RlZmluZSBTT19ET01BSU4JCTM5CisKKyNkZWZpbmUgU09fUlhRX09WRkwgICAgICAgICAgICAgNDAKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NvY2tpb3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc29ja2lvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjFhMzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NvY2tpb3MuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfU09DS0lPU19ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfU09DS0lPU19ICisKKy8qIFNvY2tldC1sZXZlbCBJL08gY29udHJvbCBjYWxscy4gKi8KKyNkZWZpbmUgRklPU0VUT1dOCTB4ODkwMQorI2RlZmluZSBTSU9DU1BHUlAJMHg4OTAyCisjZGVmaW5lIEZJT0dFVE9XTgkweDg5MDMKKyNkZWZpbmUgU0lPQ0dQR1JQCTB4ODkwNAorI2RlZmluZSBTSU9DQVRNQVJLCTB4ODkwNQorI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLworCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19TT0NLSU9TX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3RhdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4Y2FkMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3RhdC5oCkBAIC0wLDAgKzEsNzIgQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19TVEFUX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19TVEFUX0gKKworLyoKKyAqIEV2ZXJ5Ym9keSBnZXRzIHRoaXMgd3JvbmcgYW5kIGhhcyB0byBzdGljayB3aXRoIGl0IGZvciBhbGwKKyAqIGV0ZXJuaXR5LiBIb3BlZnVsbHksIHRoaXMgdmVyc2lvbiBnZXRzIHVzZWQgYnkgbmV3IGFyY2hpdGVjdHVyZXMKKyAqIHNvIHRoZXkgZG9uJ3QgZmFsbCBpbnRvIHRoZSBzYW1lIHRyYXBzLgorICoKKyAqIHN0YXQ2NCBpcyBjb3BpZWQgZnJvbSBwb3dlcnBjNjQsIHdpdGggZXhwbGljaXQgcGFkZGluZyBhZGRlZC4KKyAqIHN0YXQgaXMgdGhlIHNhbWUgc3RydWN0dXJlIGxheW91dCBvbiA2NC1iaXQsIHdpdGhvdXQgdGhlICdsb25nIGxvbmcnCisgKiB0eXBlcy4KKyAqCisgKiBCeSBjb252ZW50aW9uLCA2NCBiaXQgYXJjaGl0ZWN0dXJlcyB1c2UgdGhlIHN0YXQgaW50ZXJmYWNlLCB3aGlsZQorICogMzIgYml0IGFyY2hpdGVjdHVyZXMgdXNlIHRoZSBzdGF0NjQgaW50ZXJmYWNlLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAqIHByb3ZpZGUgYW4gX19vbGRfa2VybmVsX3N0YXQgaGVyZSwgd2hpY2ggbmV3IGFyY2hpdGVjdHVyZSBzaG91bGQKKyAqIG5vdCBoYXZlIHRvIHN0YXJ0IHdpdGguCisgKi8KKworI2luY2x1ZGUgPGFzbS9iaXRzcGVybG9uZy5oPgorCisjZGVmaW5lIFNUQVRfSEFWRV9OU0VDIDEKKworc3RydWN0IHN0YXQgeworCXVuc2lnbmVkIGxvbmcJc3RfZGV2OwkJLyogRGV2aWNlLiAgKi8KKwl1bnNpZ25lZCBsb25nCXN0X2lubzsJCS8qIEZpbGUgc2VyaWFsIG51bWJlci4gICovCisJdW5zaWduZWQgaW50CXN0X21vZGU7CS8qIEZpbGUgbW9kZS4gICovCisJdW5zaWduZWQgaW50CXN0X25saW5rOwkvKiBMaW5rIGNvdW50LiAgKi8KKwl1bnNpZ25lZCBpbnQJc3RfdWlkOwkJLyogVXNlciBJRCBvZiB0aGUgZmlsZSdzIG93bmVyLiAgKi8KKwl1bnNpZ25lZCBpbnQJc3RfZ2lkOwkJLyogR3JvdXAgSUQgb2YgdGhlIGZpbGUncyBncm91cC4gKi8KKwl1bnNpZ25lZCBsb25nCXN0X3JkZXY7CS8qIERldmljZSBudW1iZXIsIGlmIGRldmljZS4gICovCisJdW5zaWduZWQgbG9uZwlfX3BhZDE7CisJbG9uZwkJc3Rfc2l6ZTsJLyogU2l6ZSBvZiBmaWxlLCBpbiBieXRlcy4gICovCisJaW50CQlzdF9ibGtzaXplOwkvKiBPcHRpbWFsIGJsb2NrIHNpemUgZm9yIEkvTy4gICovCisJaW50CQlfX3BhZDI7CisJbG9uZwkJc3RfYmxvY2tzOwkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KKwlsb25nCQlzdF9hdGltZTsJLyogVGltZSBvZiBsYXN0IGFjY2Vzcy4gICovCisJdW5zaWduZWQgbG9uZwlzdF9hdGltZV9uc2VjOworCWxvbmcJCXN0X210aW1lOwkvKiBUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKwl1bnNpZ25lZCBsb25nCXN0X210aW1lX25zZWM7CisJbG9uZwkJc3RfY3RpbWU7CS8qIFRpbWUgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKwl1bnNpZ25lZCBsb25nCXN0X2N0aW1lX25zZWM7CisJdW5zaWduZWQgaW50CV9fdW51c2VkNDsKKwl1bnNpZ25lZCBpbnQJX191bnVzZWQ1OworfTsKKworLyogVGhpcyBtYXRjaGVzIHN0cnVjdCBzdGF0NjQgaW4gZ2xpYmMyLjEuIE9ubHkgdXNlZCBmb3IgMzIgYml0LiAqLworI2lmIF9fQklUU19QRVJfTE9ORyAhPSA2NCB8fCBkZWZpbmVkKF9fQVJDSF9XQU5UX1NUQVQ2NCkKK3N0cnVjdCBzdGF0NjQgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdF9kZXY7CS8qIERldmljZS4gICovCisJdW5zaWduZWQgbG9uZyBsb25nIHN0X2lubzsJLyogRmlsZSBzZXJpYWwgbnVtYmVyLiAgKi8KKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsJLyogRmlsZSBtb2RlLiAgKi8KKwl1bnNpZ25lZCBpbnQJc3Rfbmxpbms7CS8qIExpbmsgY291bnQuICAqLworCXVuc2lnbmVkIGludAlzdF91aWQ7CQkvKiBVc2VyIElEIG9mIHRoZSBmaWxlJ3Mgb3duZXIuICAqLworCXVuc2lnbmVkIGludAlzdF9naWQ7CQkvKiBHcm91cCBJRCBvZiB0aGUgZmlsZSdzIGdyb3VwLiAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdF9yZGV2OwkvKiBEZXZpY2UgbnVtYmVyLCBpZiBkZXZpY2UuICAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBfX3BhZDE7CisJbG9uZyBsb25nCXN0X3NpemU7CS8qIFNpemUgb2YgZmlsZSwgaW4gYnl0ZXMuICAqLworCWludAkJc3RfYmxrc2l6ZTsJLyogT3B0aW1hbCBibG9jayBzaXplIGZvciBJL08uICAqLworCWludAkJX19wYWQyOworCWxvbmcgbG9uZwlzdF9ibG9ja3M7CS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworCWludAkJc3RfYXRpbWU7CS8qIFRpbWUgb2YgbGFzdCBhY2Nlc3MuICAqLworCXVuc2lnbmVkIGludAlzdF9hdGltZV9uc2VjOworCWludAkJc3RfbXRpbWU7CS8qIFRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24uICAqLworCXVuc2lnbmVkIGludAlzdF9tdGltZV9uc2VjOworCWludAkJc3RfY3RpbWU7CS8qIFRpbWUgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKwl1bnNpZ25lZCBpbnQJc3RfY3RpbWVfbnNlYzsKKwl1bnNpZ25lZCBpbnQJX191bnVzZWQ0OworCXVuc2lnbmVkIGludAlfX3VudXNlZDU7Cit9OworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX1NUQVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zdGF0ZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3RhdGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkNTQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3RhdGZzLmgKQEAgLTAsMCArMSw4MyBAQAorI2lmbmRlZiBfR0VORVJJQ19TVEFURlNfSAorI2RlZmluZSBfR0VORVJJQ19TVEFURlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisvKgorICogTW9zdCA2NC1iaXQgcGxhdGZvcm1zIHVzZSAnbG9uZycsIHdoaWxlIG1vc3QgMzItYml0IHBsYXRmb3JtcyB1c2UgJ19fdTMyJy4KKyAqIFllcywgdGhleSBkaWZmZXIgaW4gc2lnbmVkbmVzcyBhcyB3ZWxsIGFzIHNpemUuCisgKiBTcGVjaWFsIGNhc2VzIGNhbiBvdmVycmlkZSBpdCBmb3IgdGhlbXNlbHZlcyAtLSBleGNlcHQgZm9yIFMzOTB4LCB3aGljaAorICogaXMganVzdCBhIGxpdHRsZSB0b28gc3BlY2lhbCBmb3IgdXMuIEFuZCBNSVBTLCB3aGljaCBJJ20gbm90IHRvdWNoaW5nCisgKiB3aXRoIGEgMTAnIHBvbGUuCisgKi8KKyNpZm5kZWYgX19zdGF0ZnNfd29yZAorI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKyNkZWZpbmUgX19zdGF0ZnNfd29yZCBsb25nCisjZWxzZQorI2RlZmluZSBfX3N0YXRmc193b3JkIF9fdTMyCisjZW5kaWYKKyNlbmRpZgorCitzdHJ1Y3Qgc3RhdGZzIHsKKwlfX3N0YXRmc193b3JkIGZfdHlwZTsKKwlfX3N0YXRmc193b3JkIGZfYnNpemU7CisJX19zdGF0ZnNfd29yZCBmX2Jsb2NrczsKKwlfX3N0YXRmc193b3JkIGZfYmZyZWU7CisJX19zdGF0ZnNfd29yZCBmX2JhdmFpbDsKKwlfX3N0YXRmc193b3JkIGZfZmlsZXM7CisJX19zdGF0ZnNfd29yZCBmX2ZmcmVlOworCV9fa2VybmVsX2ZzaWRfdCBmX2ZzaWQ7CisJX19zdGF0ZnNfd29yZCBmX25hbWVsZW47CisJX19zdGF0ZnNfd29yZCBmX2Zyc2l6ZTsKKwlfX3N0YXRmc193b3JkIGZfZmxhZ3M7CisJX19zdGF0ZnNfd29yZCBmX3NwYXJlWzRdOworfTsKKworLyoKKyAqIEFSTSBuZWVkcyB0byBhdm9pZCB0aGUgMzItYml0IHBhZGRpbmcgYXQgdGhlIGVuZCwgZm9yIGNvbnNpc3RlbmN5CisgKiBiZXR3ZWVuIEVBQkkgYW5kIE9BQkkgCisgKi8KKyNpZm5kZWYgQVJDSF9QQUNLX1NUQVRGUzY0CisjZGVmaW5lIEFSQ0hfUEFDS19TVEFURlM2NAorI2VuZGlmCisKK3N0cnVjdCBzdGF0ZnM2NCB7CisJX19zdGF0ZnNfd29yZCBmX3R5cGU7CisJX19zdGF0ZnNfd29yZCBmX2JzaXplOworCV9fdTY0IGZfYmxvY2tzOworCV9fdTY0IGZfYmZyZWU7CisJX191NjQgZl9iYXZhaWw7CisJX191NjQgZl9maWxlczsKKwlfX3U2NCBmX2ZmcmVlOworCV9fa2VybmVsX2ZzaWRfdCBmX2ZzaWQ7CisJX19zdGF0ZnNfd29yZCBmX25hbWVsZW47CisJX19zdGF0ZnNfd29yZCBmX2Zyc2l6ZTsKKwlfX3N0YXRmc193b3JkIGZfZmxhZ3M7CisJX19zdGF0ZnNfd29yZCBmX3NwYXJlWzRdOworfSBBUkNIX1BBQ0tfU1RBVEZTNjQ7CisKKy8qIAorICogSUE2NCBhbmQgeDg2XzY0IG5lZWQgdG8gYXZvaWQgdGhlIDMyLWJpdCBwYWRkaW5nIGF0IHRoZSBlbmQsCisgKiB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGkzODYgQUJJCisgKi8KKyNpZm5kZWYgQVJDSF9QQUNLX0NPTVBBVF9TVEFURlM2NAorI2RlZmluZSBBUkNIX1BBQ0tfQ09NUEFUX1NUQVRGUzY0CisjZW5kaWYKKworc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCB7CisJX191MzIgZl90eXBlOworCV9fdTMyIGZfYnNpemU7CisJX191NjQgZl9ibG9ja3M7CisJX191NjQgZl9iZnJlZTsKKwlfX3U2NCBmX2JhdmFpbDsKKwlfX3U2NCBmX2ZpbGVzOworCV9fdTY0IGZfZmZyZWU7CisJX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKKwlfX3UzMiBmX25hbWVsZW47CisJX191MzIgZl9mcnNpemU7CisJX191MzIgZl9mbGFnczsKKwlfX3UzMiBmX3NwYXJlWzRdOworfSBBUkNIX1BBQ0tfQ09NUEFUX1NUQVRGUzY0OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3dhYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlOTAyOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3dhYi5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX1NXQUJfSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vYml0c3BlcmxvbmcuaD4KKworLyoKKyAqIDMyIGJpdCBhcmNoaXRlY3R1cmVzIHR5cGljYWxseSAoYnV0IG5vdCBhbHdheXMpIHdhbnQgdG8KKyAqIHNldCBfX1NXQUJfNjRfVEhSVV8zMl9fLiBJbiB1c2VyIHNwYWNlLCB0aGlzIGlzIG9ubHkKKyAqIHZhbGlkIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyA2NCBiaXQgZGF0YSB0eXBlcy4KKyAqLworCisjaWYgX19CSVRTX1BFUl9MT05HID09IDMyCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfU1dBQl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3Rlcm1iaXRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3Rlcm1iaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyYjQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvdGVybWJpdHMuaApAQCAtMCwwICsxLDE5OSBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX1RFUk1CSVRTX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19URVJNQklUU19ICisKKyNpbmNsdWRlIDxsaW51eC9wb3NpeF90eXBlcy5oPgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJY2NfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CXNwZWVkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAl0Y2ZsYWdfdDsKKworI2RlZmluZSBOQ0NTIDE5CitzdHJ1Y3QgdGVybWlvcyB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KK307CisKK3N0cnVjdCB0ZXJtaW9zMiB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKwlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCit9OworCitzdHJ1Y3Qga3Rlcm1pb3MgeworCXRjZmxhZ190IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCisJY2NfdCBjX2xpbmU7CQkJLyogbGluZSBkaXNjaXBsaW5lICovCisJY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCisJc3BlZWRfdCBjX2lzcGVlZDsJCS8qIGlucHV0IHNwZWVkICovCisJc3BlZWRfdCBjX29zcGVlZDsJCS8qIG91dHB1dCBzcGVlZCAqLworfTsKKworLyogY19jYyBjaGFyYWN0ZXJzICovCisjZGVmaW5lIFZJTlRSIDAKKyNkZWZpbmUgVlFVSVQgMQorI2RlZmluZSBWRVJBU0UgMgorI2RlZmluZSBWS0lMTCAzCisjZGVmaW5lIFZFT0YgNAorI2RlZmluZSBWVElNRSA1CisjZGVmaW5lIFZNSU4gNgorI2RlZmluZSBWU1dUQyA3CisjZGVmaW5lIFZTVEFSVCA4CisjZGVmaW5lIFZTVE9QIDkKKyNkZWZpbmUgVlNVU1AgMTAKKyNkZWZpbmUgVkVPTCAxMQorI2RlZmluZSBWUkVQUklOVCAxMgorI2RlZmluZSBWRElTQ0FSRCAxMworI2RlZmluZSBWV0VSQVNFIDE0CisjZGVmaW5lIFZMTkVYVCAxNQorI2RlZmluZSBWRU9MMiAxNgorCisvKiBjX2lmbGFnIGJpdHMgKi8KKyNkZWZpbmUgSUdOQlJLCTAwMDAwMDEKKyNkZWZpbmUgQlJLSU5UCTAwMDAwMDIKKyNkZWZpbmUgSUdOUEFSCTAwMDAwMDQKKyNkZWZpbmUgUEFSTVJLCTAwMDAwMTAKKyNkZWZpbmUgSU5QQ0sJMDAwMDAyMAorI2RlZmluZSBJU1RSSVAJMDAwMDA0MAorI2RlZmluZSBJTkxDUgkwMDAwMTAwCisjZGVmaW5lIElHTkNSCTAwMDAyMDAKKyNkZWZpbmUgSUNSTkwJMDAwMDQwMAorI2RlZmluZSBJVUNMQwkwMDAxMDAwCisjZGVmaW5lIElYT04JMDAwMjAwMAorI2RlZmluZSBJWEFOWQkwMDA0MDAwCisjZGVmaW5lIElYT0ZGCTAwMTAwMDAKKyNkZWZpbmUgSU1BWEJFTAkwMDIwMDAwCisjZGVmaW5lIElVVEY4CTAwNDAwMDAKKworLyogY19vZmxhZyBiaXRzICovCisjZGVmaW5lIE9QT1NUCTAwMDAwMDEKKyNkZWZpbmUgT0xDVUMJMDAwMDAwMgorI2RlZmluZSBPTkxDUgkwMDAwMDA0CisjZGVmaW5lIE9DUk5MCTAwMDAwMTAKKyNkZWZpbmUgT05PQ1IJMDAwMDAyMAorI2RlZmluZSBPTkxSRVQJMDAwMDA0MAorI2RlZmluZSBPRklMTAkwMDAwMTAwCisjZGVmaW5lIE9GREVMCTAwMDAyMDAKKyNkZWZpbmUgTkxETFkJMDAwMDQwMAorI2RlZmluZSAgIE5MMAkwMDAwMDAwCisjZGVmaW5lICAgTkwxCTAwMDA0MDAKKyNkZWZpbmUgQ1JETFkJMDAwMzAwMAorI2RlZmluZSAgIENSMAkwMDAwMDAwCisjZGVmaW5lICAgQ1IxCTAwMDEwMDAKKyNkZWZpbmUgICBDUjIJMDAwMjAwMAorI2RlZmluZSAgIENSMwkwMDAzMDAwCisjZGVmaW5lIFRBQkRMWQkwMDE0MDAwCisjZGVmaW5lICAgVEFCMAkwMDAwMDAwCisjZGVmaW5lICAgVEFCMQkwMDA0MDAwCisjZGVmaW5lICAgVEFCMgkwMDEwMDAwCisjZGVmaW5lICAgVEFCMwkwMDE0MDAwCisjZGVmaW5lICAgWFRBQlMJMDAxNDAwMAorI2RlZmluZSBCU0RMWQkwMDIwMDAwCisjZGVmaW5lICAgQlMwCTAwMDAwMDAKKyNkZWZpbmUgICBCUzEJMDAyMDAwMAorI2RlZmluZSBWVERMWQkwMDQwMDAwCisjZGVmaW5lICAgVlQwCTAwMDAwMDAKKyNkZWZpbmUgICBWVDEJMDA0MDAwMAorI2RlZmluZSBGRkRMWQkwMTAwMDAwCisjZGVmaW5lICAgRkYwCTAwMDAwMDAKKyNkZWZpbmUgICBGRjEJMDEwMDAwMAorCisvKiBjX2NmbGFnIGJpdCBtZWFuaW5nICovCisjZGVmaW5lIENCQVVECTAwMTAwMTcKKyNkZWZpbmUgIEIwCTAwMDAwMDAJCS8qIGhhbmcgdXAgKi8KKyNkZWZpbmUgIEI1MAkwMDAwMDAxCisjZGVmaW5lICBCNzUJMDAwMDAwMgorI2RlZmluZSAgQjExMAkwMDAwMDAzCisjZGVmaW5lICBCMTM0CTAwMDAwMDQKKyNkZWZpbmUgIEIxNTAJMDAwMDAwNQorI2RlZmluZSAgQjIwMAkwMDAwMDA2CisjZGVmaW5lICBCMzAwCTAwMDAwMDcKKyNkZWZpbmUgIEI2MDAJMDAwMDAxMAorI2RlZmluZSAgQjEyMDAJMDAwMDAxMQorI2RlZmluZSAgQjE4MDAJMDAwMDAxMgorI2RlZmluZSAgQjI0MDAJMDAwMDAxMworI2RlZmluZSAgQjQ4MDAJMDAwMDAxNAorI2RlZmluZSAgQjk2MDAJMDAwMDAxNQorI2RlZmluZSAgQjE5MjAwCTAwMDAwMTYKKyNkZWZpbmUgIEIzODQwMAkwMDAwMDE3CisjZGVmaW5lIEVYVEEgQjE5MjAwCisjZGVmaW5lIEVYVEIgQjM4NDAwCisjZGVmaW5lIENTSVpFCTAwMDAwNjAKKyNkZWZpbmUgICBDUzUJMDAwMDAwMAorI2RlZmluZSAgIENTNgkwMDAwMDIwCisjZGVmaW5lICAgQ1M3CTAwMDAwNDAKKyNkZWZpbmUgICBDUzgJMDAwMDA2MAorI2RlZmluZSBDU1RPUEIJMDAwMDEwMAorI2RlZmluZSBDUkVBRAkwMDAwMjAwCisjZGVmaW5lIFBBUkVOQgkwMDAwNDAwCisjZGVmaW5lIFBBUk9ERAkwMDAxMDAwCisjZGVmaW5lIEhVUENMCTAwMDIwMDAKKyNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKKyNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lICAgIEJPVEhFUiAwMDEwMDAwCisjZGVmaW5lICAgIEI1NzYwMCAwMDEwMDAxCisjZGVmaW5lICAgQjExNTIwMCAwMDEwMDAyCisjZGVmaW5lICAgQjIzMDQwMCAwMDEwMDAzCisjZGVmaW5lICAgQjQ2MDgwMCAwMDEwMDA0CisjZGVmaW5lICAgQjUwMDAwMCAwMDEwMDA1CisjZGVmaW5lICAgQjU3NjAwMCAwMDEwMDA2CisjZGVmaW5lICAgQjkyMTYwMCAwMDEwMDA3CisjZGVmaW5lICBCMTAwMDAwMCAwMDEwMDEwCisjZGVmaW5lICBCMTE1MjAwMCAwMDEwMDExCisjZGVmaW5lICBCMTUwMDAwMCAwMDEwMDEyCisjZGVmaW5lICBCMjAwMDAwMCAwMDEwMDEzCisjZGVmaW5lICBCMjUwMDAwMCAwMDEwMDE0CisjZGVmaW5lICBCMzAwMDAwMCAwMDEwMDE1CisjZGVmaW5lICBCMzUwMDAwMCAwMDEwMDE2CisjZGVmaW5lICBCNDAwMDAwMCAwMDEwMDE3CisjZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkvKiBpbnB1dCBiYXVkIHJhdGUgKi8KKyNkZWZpbmUgQ01TUEFSCSAgMDEwMDAwMDAwMDAwCS8qIG1hcmsgb3Igc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KKyNkZWZpbmUgQ1JUU0NUUwkgIDAyMDAwMDAwMDAwMAkvKiBmbG93IGNvbnRyb2wgKi8KKworI2RlZmluZSBJQlNISUZUCSAgMTYJCS8qIFNoaWZ0IGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCisKKy8qIGNfbGZsYWcgYml0cyAqLworI2RlZmluZSBJU0lHCTAwMDAwMDEKKyNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKKyNkZWZpbmUgWENBU0UJMDAwMDAwNAorI2RlZmluZSBFQ0hPCTAwMDAwMTAKKyNkZWZpbmUgRUNIT0UJMDAwMDAyMAorI2RlZmluZSBFQ0hPSwkwMDAwMDQwCisjZGVmaW5lIEVDSE9OTAkwMDAwMTAwCisjZGVmaW5lIE5PRkxTSAkwMDAwMjAwCisjZGVmaW5lIFRPU1RPUAkwMDAwNDAwCisjZGVmaW5lIEVDSE9DVEwJMDAwMTAwMAorI2RlZmluZSBFQ0hPUFJUCTAwMDIwMDAKKyNkZWZpbmUgRUNIT0tFCTAwMDQwMDAKKyNkZWZpbmUgRkxVU0hPCTAwMTAwMDAKKyNkZWZpbmUgUEVORElOCTAwNDAwMDAKKyNkZWZpbmUgSUVYVEVOCTAxMDAwMDAKKyNkZWZpbmUgRVhUUFJPQwkwMjAwMDAwCisKKy8qIHRjZmxvdygpIGFuZCBUQ1hPTkMgdXNlIHRoZXNlICovCisjZGVmaW5lCVRDT09GRgkJMAorI2RlZmluZQlUQ09PTgkJMQorI2RlZmluZQlUQ0lPRkYJCTIKKyNkZWZpbmUJVENJT04JCTMKKworLyogdGNmbHVzaCgpIGFuZCBUQ0ZMU0ggdXNlIHRoZXNlICovCisjZGVmaW5lCVRDSUZMVVNICTAKKyNkZWZpbmUJVENPRkxVU0gJMQorI2RlZmluZQlUQ0lPRkxVU0gJMgorCisvKiB0Y3NldGF0dHIgdXNlcyB0aGVzZSAqLworI2RlZmluZQlUQ1NBTk9XCQkwCisjZGVmaW5lCVRDU0FEUkFJTgkxCisjZGVmaW5lCVRDU0FGTFVTSAkyCisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX1RFUk1CSVRTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvdGVybWlvcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy90ZXJtaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMxMTY2YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvdGVybWlvcy5oCkBAIC0wLDAgKzEsNTAgQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX1RFUk1JT1NfSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfVEVSTUlPU19ICisvKgorICogTW9zdCBhcmNoaXRlY3R1cmVzIGhhdmUgc3RyYWlnaHQgY29waWVzIG9mIHRoZSB4ODYgY29kZSwgd2l0aAorICogdmFyeWluZyBsZXZlbHMgb2YgYnVnIGZpeGVzIG9uIHRvcC4gVXN1YWxseSBpdCdzIGEgZ29vZCBpZGVhCisgKiB0byB1c2UgdGhpcyBnZW5lcmljIHZlcnNpb24gaW5zdGVhZCwgYnV0IGJlIGNhcmVmdWwgdG8gYXZvaWQKKyAqIEFCSSBjaGFuZ2VzLgorICogTmV3IGFyY2hpdGVjdHVyZXMgc2hvdWxkIG5vdCBwcm92aWRlIHRoZWlyIG93biB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vdGVybWJpdHMuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisKK3N0cnVjdCB3aW5zaXplIHsKKwl1bnNpZ25lZCBzaG9ydCB3c19yb3c7CisJdW5zaWduZWQgc2hvcnQgd3NfY29sOworCXVuc2lnbmVkIHNob3J0IHdzX3hwaXhlbDsKKwl1bnNpZ25lZCBzaG9ydCB3c195cGl4ZWw7Cit9OworCisjZGVmaW5lIE5DQyA4CitzdHJ1Y3QgdGVybWlvIHsKKwl1bnNpZ25lZCBzaG9ydCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXVuc2lnbmVkIHNob3J0IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXVuc2lnbmVkIHNob3J0IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl1bnNpZ25lZCBzaG9ydCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCXVuc2lnbmVkIGNoYXIgY19saW5lOwkJLyogbGluZSBkaXNjaXBsaW5lICovCisJdW5zaWduZWQgY2hhciBjX2NjW05DQ107CS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworfTsKKworLyogbW9kZW0gbGluZXMgKi8KKyNkZWZpbmUgVElPQ01fTEUJMHgwMDEKKyNkZWZpbmUgVElPQ01fRFRSCTB4MDAyCisjZGVmaW5lIFRJT0NNX1JUUwkweDAwNAorI2RlZmluZSBUSU9DTV9TVAkweDAwOAorI2RlZmluZSBUSU9DTV9TUgkweDAxMAorI2RlZmluZSBUSU9DTV9DVFMJMHgwMjAKKyNkZWZpbmUgVElPQ01fQ0FSCTB4MDQwCisjZGVmaW5lIFRJT0NNX1JORwkweDA4MAorI2RlZmluZSBUSU9DTV9EU1IJMHgxMDAKKyNkZWZpbmUgVElPQ01fQ0QJVElPQ01fQ0FSCisjZGVmaW5lIFRJT0NNX1JJCVRJT0NNX1JORworI2RlZmluZSBUSU9DTV9PVVQxCTB4MjAwMAorI2RlZmluZSBUSU9DTV9PVVQyCTB4NDAwMAorI2RlZmluZSBUSU9DTV9MT09QCTB4ODAwMAorCisvKiBpb2N0bCAoZmQsIFRJT0NTRVJHRVRMU1IsICZyZXN1bHQpIHdoZXJlIHJlc3VsdCBtYXkgYmUgYXMgYmVsb3cgKi8KKworCisjZW5kaWYgLyogX0FTTV9HRU5FUklDX1RFUk1JT1NfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy90eXBlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMGY2OWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3R5cGVzLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfQVNNX0dFTkVSSUNfVFlQRVNfSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfVFlQRVNfSAorLyoKKyAqIGludC1sbDY0IGlzIHVzZWQgcHJhY3RpY2FsbHkgZXZlcnl3aGVyZSBub3csCisgKiBzbyB1c2UgaXQgYXMgYSByZWFzb25hYmxlIGRlZmF1bHQuCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pbnQtbGw2NC5oPgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVtb2RlX3Q7CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fR0VORVJJQ19UWVBFU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3Vjb250ZXh0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3Vjb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3NzM0MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvdWNvbnRleHQuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfVUNPTlRFWFRfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX1VDT05URVhUX0gKKworc3RydWN0IHVjb250ZXh0IHsKKwl1bnNpZ25lZCBsb25nCSAgdWNfZmxhZ3M7CisJc3RydWN0IHVjb250ZXh0ICAqdWNfbGluazsKKwlzdGFja190CQkgIHVjX3N0YWNrOworCXN0cnVjdCBzaWdjb250ZXh0IHVjX21jb250ZXh0OworCXNpZ3NldF90CSAgdWNfc2lnbWFzazsJLyogbWFzayBsYXN0IGZvciBleHRlbnNpYmlsaXR5ICovCit9OworCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19VQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3VuaXN0ZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmlzdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDJjY2Q0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmlzdGQuaApAQCAtMCwwICsxLDkwNSBAQAorI2lmICFkZWZpbmVkKF9BU01fR0VORVJJQ19VTklTVERfSCkgfHwgZGVmaW5lZChfX1NZU0NBTEwpCisjZGVmaW5lIF9BU01fR0VORVJJQ19VTklTVERfSAorCisjaW5jbHVkZSA8YXNtL2JpdHNwZXJsb25nLmg+CisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN5c3RlbSBjYWxsIG51bWJlcnMsIGJhc2VkIG9uIHRoZQorICogbGF5b3V0IG9mIHRoZSB4ODYtNjQgYXJjaGl0ZWN0dXJlLCB3aGljaCBlbWJlZHMgdGhlCisgKiBwb2ludGVyIHRvIHRoZSBzeXNjYWxsIGluIHRoZSB0YWJsZS4KKyAqCisgKiBBcyBhIGJhc2ljIHByaW5jaXBsZSwgbm8gZHVwbGljYXRpb24gb2YgZnVuY3Rpb25hbGl0eQorICogc2hvdWxkIGJlIGFkZGVkLCBlLmcuIHdlIGRvbid0IHVzZSBsc2VlayB3aGVuIGxsc2VlaworICogaXMgcHJlc2VudC4gTmV3IGFyY2hpdGVjdHVyZXMgc2hvdWxkIHVzZSB0aGlzIGZpbGUKKyAqIGFuZCBpbXBsZW1lbnQgdGhlIGxlc3MgZmVhdHVyZS1mdWxsIGNhbGxzIGluIHVzZXIgc3BhY2UuCisgKi8KKworI2lmbmRlZiBfX1NZU0NBTEwKKyNkZWZpbmUgX19TWVNDQUxMKHgsIHkpCisjZW5kaWYKKworI2lmIF9fQklUU19QRVJfTE9ORyA9PSAzMiB8fCBkZWZpbmVkKF9fU1lTQ0FMTF9DT01QQVQpCisjZGVmaW5lIF9fU0NfMzI2NChfbnIsIF8zMiwgXzY0KSBfX1NZU0NBTEwoX25yLCBfMzIpCisjZWxzZQorI2RlZmluZSBfX1NDXzMyNjQoX25yLCBfMzIsIF82NCkgX19TWVNDQUxMKF9uciwgXzY0KQorI2VuZGlmCisKKyNpZmRlZiBfX1NZU0NBTExfQ09NUEFUCisjZGVmaW5lIF9fU0NfQ09NUChfbnIsIF9zeXMsIF9jb21wKSBfX1NZU0NBTEwoX25yLCBfY29tcCkKKyNkZWZpbmUgX19TQ19DT01QXzMyNjQoX25yLCBfMzIsIF82NCwgX2NvbXApIF9fU1lTQ0FMTChfbnIsIF9jb21wKQorI2Vsc2UKKyNkZWZpbmUgX19TQ19DT01QKF9uciwgX3N5cywgX2NvbXApIF9fU1lTQ0FMTChfbnIsIF9zeXMpCisjZGVmaW5lIF9fU0NfQ09NUF8zMjY0KF9uciwgXzMyLCBfNjQsIF9jb21wKSBfX1NDXzMyNjQoX25yLCBfMzIsIF82NCkKKyNlbmRpZgorCisjZGVmaW5lIF9fTlJfaW9fc2V0dXAgMAorX19TQ19DT01QKF9fTlJfaW9fc2V0dXAsIHN5c19pb19zZXR1cCwgY29tcGF0X3N5c19pb19zZXR1cCkKKyNkZWZpbmUgX19OUl9pb19kZXN0cm95IDEKK19fU1lTQ0FMTChfX05SX2lvX2Rlc3Ryb3ksIHN5c19pb19kZXN0cm95KQorI2RlZmluZSBfX05SX2lvX3N1Ym1pdCAyCitfX1NDX0NPTVAoX19OUl9pb19zdWJtaXQsIHN5c19pb19zdWJtaXQsIGNvbXBhdF9zeXNfaW9fc3VibWl0KQorI2RlZmluZSBfX05SX2lvX2NhbmNlbCAzCitfX1NZU0NBTEwoX19OUl9pb19jYW5jZWwsIHN5c19pb19jYW5jZWwpCisjZGVmaW5lIF9fTlJfaW9fZ2V0ZXZlbnRzIDQKK19fU0NfQ09NUChfX05SX2lvX2dldGV2ZW50cywgc3lzX2lvX2dldGV2ZW50cywgY29tcGF0X3N5c19pb19nZXRldmVudHMpCisKKy8qIGZzL3hhdHRyLmMgKi8KKyNkZWZpbmUgX19OUl9zZXR4YXR0ciA1CitfX1NZU0NBTEwoX19OUl9zZXR4YXR0ciwgc3lzX3NldHhhdHRyKQorI2RlZmluZSBfX05SX2xzZXR4YXR0ciA2CitfX1NZU0NBTEwoX19OUl9sc2V0eGF0dHIsIHN5c19sc2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfZnNldHhhdHRyIDcKK19fU1lTQ0FMTChfX05SX2ZzZXR4YXR0ciwgc3lzX2ZzZXR4YXR0cikKKyNkZWZpbmUgX19OUl9nZXR4YXR0ciA4CitfX1NZU0NBTEwoX19OUl9nZXR4YXR0ciwgc3lzX2dldHhhdHRyKQorI2RlZmluZSBfX05SX2xnZXR4YXR0ciA5CitfX1NZU0NBTEwoX19OUl9sZ2V0eGF0dHIsIHN5c19sZ2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfZmdldHhhdHRyIDEwCitfX1NZU0NBTEwoX19OUl9mZ2V0eGF0dHIsIHN5c19mZ2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfbGlzdHhhdHRyIDExCitfX1NZU0NBTEwoX19OUl9saXN0eGF0dHIsIHN5c19saXN0eGF0dHIpCisjZGVmaW5lIF9fTlJfbGxpc3R4YXR0ciAxMgorX19TWVNDQUxMKF9fTlJfbGxpc3R4YXR0ciwgc3lzX2xsaXN0eGF0dHIpCisjZGVmaW5lIF9fTlJfZmxpc3R4YXR0ciAxMworX19TWVNDQUxMKF9fTlJfZmxpc3R4YXR0ciwgc3lzX2ZsaXN0eGF0dHIpCisjZGVmaW5lIF9fTlJfcmVtb3ZleGF0dHIgMTQKK19fU1lTQ0FMTChfX05SX3JlbW92ZXhhdHRyLCBzeXNfcmVtb3ZleGF0dHIpCisjZGVmaW5lIF9fTlJfbHJlbW92ZXhhdHRyIDE1CitfX1NZU0NBTEwoX19OUl9scmVtb3ZleGF0dHIsIHN5c19scmVtb3ZleGF0dHIpCisjZGVmaW5lIF9fTlJfZnJlbW92ZXhhdHRyIDE2CitfX1NZU0NBTEwoX19OUl9mcmVtb3ZleGF0dHIsIHN5c19mcmVtb3ZleGF0dHIpCisKKy8qIGZzL2RjYWNoZS5jICovCisjZGVmaW5lIF9fTlJfZ2V0Y3dkIDE3CitfX1NZU0NBTEwoX19OUl9nZXRjd2QsIHN5c19nZXRjd2QpCisKKy8qIGZzL2Nvb2tpZXMuYyAqLworI2RlZmluZSBfX05SX2xvb2t1cF9kY29va2llIDE4CitfX1NDX0NPTVAoX19OUl9sb29rdXBfZGNvb2tpZSwgc3lzX2xvb2t1cF9kY29va2llLCBjb21wYXRfc3lzX2xvb2t1cF9kY29va2llKQorCisvKiBmcy9ldmVudGZkLmMgKi8KKyNkZWZpbmUgX19OUl9ldmVudGZkMiAxOQorX19TWVNDQUxMKF9fTlJfZXZlbnRmZDIsIHN5c19ldmVudGZkMikKKworLyogZnMvZXZlbnRwb2xsLmMgKi8KKyNkZWZpbmUgX19OUl9lcG9sbF9jcmVhdGUxIDIwCitfX1NZU0NBTEwoX19OUl9lcG9sbF9jcmVhdGUxLCBzeXNfZXBvbGxfY3JlYXRlMSkKKyNkZWZpbmUgX19OUl9lcG9sbF9jdGwgMjEKK19fU1lTQ0FMTChfX05SX2Vwb2xsX2N0bCwgc3lzX2Vwb2xsX2N0bCkKKyNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdCAyMgorX19TQ19DT01QKF9fTlJfZXBvbGxfcHdhaXQsIHN5c19lcG9sbF9wd2FpdCwgY29tcGF0X3N5c19lcG9sbF9wd2FpdCkKKworLyogZnMvZmNudGwuYyAqLworI2RlZmluZSBfX05SX2R1cCAyMworX19TWVNDQUxMKF9fTlJfZHVwLCBzeXNfZHVwKQorI2RlZmluZSBfX05SX2R1cDMgMjQKK19fU1lTQ0FMTChfX05SX2R1cDMsIHN5c19kdXAzKQorI2RlZmluZSBfX05SMzI2NF9mY250bCAyNQorX19TQ19DT01QXzMyNjQoX19OUjMyNjRfZmNudGwsIHN5c19mY250bDY0LCBzeXNfZmNudGwsIGNvbXBhdF9zeXNfZmNudGw2NCkKKworLyogZnMvaW5vdGlmeV91c2VyLmMgKi8KKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQxIDI2CitfX1NZU0NBTEwoX19OUl9pbm90aWZ5X2luaXQxLCBzeXNfaW5vdGlmeV9pbml0MSkKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2FkZF93YXRjaCAyNworX19TWVNDQUxMKF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2gsIHN5c19pbm90aWZ5X2FkZF93YXRjaCkKKyNkZWZpbmUgX19OUl9pbm90aWZ5X3JtX3dhdGNoIDI4CitfX1NZU0NBTEwoX19OUl9pbm90aWZ5X3JtX3dhdGNoLCBzeXNfaW5vdGlmeV9ybV93YXRjaCkKKworLyogZnMvaW9jdGwuYyAqLworI2RlZmluZSBfX05SX2lvY3RsIDI5CitfX1NDX0NPTVAoX19OUl9pb2N0bCwgc3lzX2lvY3RsLCBjb21wYXRfc3lzX2lvY3RsKQorCisvKiBmcy9pb3ByaW8uYyAqLworI2RlZmluZSBfX05SX2lvcHJpb19zZXQgMzAKK19fU1lTQ0FMTChfX05SX2lvcHJpb19zZXQsIHN5c19pb3ByaW9fc2V0KQorI2RlZmluZSBfX05SX2lvcHJpb19nZXQgMzEKK19fU1lTQ0FMTChfX05SX2lvcHJpb19nZXQsIHN5c19pb3ByaW9fZ2V0KQorCisvKiBmcy9sb2Nrcy5jICovCisjZGVmaW5lIF9fTlJfZmxvY2sgMzIKK19fU1lTQ0FMTChfX05SX2Zsb2NrLCBzeXNfZmxvY2spCisKKy8qIGZzL25hbWVpLmMgKi8KKyNkZWZpbmUgX19OUl9ta25vZGF0IDMzCitfX1NZU0NBTEwoX19OUl9ta25vZGF0LCBzeXNfbWtub2RhdCkKKyNkZWZpbmUgX19OUl9ta2RpcmF0IDM0CitfX1NZU0NBTEwoX19OUl9ta2RpcmF0LCBzeXNfbWtkaXJhdCkKKyNkZWZpbmUgX19OUl91bmxpbmthdCAzNQorX19TWVNDQUxMKF9fTlJfdW5saW5rYXQsIHN5c191bmxpbmthdCkKKyNkZWZpbmUgX19OUl9zeW1saW5rYXQgMzYKK19fU1lTQ0FMTChfX05SX3N5bWxpbmthdCwgc3lzX3N5bWxpbmthdCkKKyNkZWZpbmUgX19OUl9saW5rYXQgMzcKK19fU1lTQ0FMTChfX05SX2xpbmthdCwgc3lzX2xpbmthdCkKKyNkZWZpbmUgX19OUl9yZW5hbWVhdCAzOAorX19TWVNDQUxMKF9fTlJfcmVuYW1lYXQsIHN5c19yZW5hbWVhdCkKKworLyogZnMvbmFtZXNwYWNlLmMgKi8KKyNkZWZpbmUgX19OUl91bW91bnQyIDM5CitfX1NZU0NBTEwoX19OUl91bW91bnQyLCBzeXNfdW1vdW50KQorI2RlZmluZSBfX05SX21vdW50IDQwCitfX1NDX0NPTVAoX19OUl9tb3VudCwgc3lzX21vdW50LCBjb21wYXRfc3lzX21vdW50KQorI2RlZmluZSBfX05SX3Bpdm90X3Jvb3QgNDEKK19fU1lTQ0FMTChfX05SX3Bpdm90X3Jvb3QsIHN5c19waXZvdF9yb290KQorCisvKiBmcy9uZnNjdGwuYyAqLworI2RlZmluZSBfX05SX25mc3NlcnZjdGwgNDIKK19fU1lTQ0FMTChfX05SX25mc3NlcnZjdGwsIHN5c19uaV9zeXNjYWxsKQorCisvKiBmcy9vcGVuLmMgKi8KKyNkZWZpbmUgX19OUjMyNjRfc3RhdGZzIDQzCitfX1NDX0NPTVBfMzI2NChfX05SMzI2NF9zdGF0ZnMsIHN5c19zdGF0ZnM2NCwgc3lzX3N0YXRmcywgXAorCSAgICAgICBjb21wYXRfc3lzX3N0YXRmczY0KQorI2RlZmluZSBfX05SMzI2NF9mc3RhdGZzIDQ0CitfX1NDX0NPTVBfMzI2NChfX05SMzI2NF9mc3RhdGZzLCBzeXNfZnN0YXRmczY0LCBzeXNfZnN0YXRmcywgXAorCSAgICAgICBjb21wYXRfc3lzX2ZzdGF0ZnM2NCkKKyNkZWZpbmUgX19OUjMyNjRfdHJ1bmNhdGUgNDUKK19fU0NfQ09NUF8zMjY0KF9fTlIzMjY0X3RydW5jYXRlLCBzeXNfdHJ1bmNhdGU2NCwgc3lzX3RydW5jYXRlLCBcCisJICAgICAgIGNvbXBhdF9zeXNfdHJ1bmNhdGU2NCkKKyNkZWZpbmUgX19OUjMyNjRfZnRydW5jYXRlIDQ2CitfX1NDX0NPTVBfMzI2NChfX05SMzI2NF9mdHJ1bmNhdGUsIHN5c19mdHJ1bmNhdGU2NCwgc3lzX2Z0cnVuY2F0ZSwgXAorCSAgICAgICBjb21wYXRfc3lzX2Z0cnVuY2F0ZTY0KQorCisjZGVmaW5lIF9fTlJfZmFsbG9jYXRlIDQ3CitfX1NDX0NPTVAoX19OUl9mYWxsb2NhdGUsIHN5c19mYWxsb2NhdGUsIGNvbXBhdF9zeXNfZmFsbG9jYXRlKQorI2RlZmluZSBfX05SX2ZhY2Nlc3NhdCA0OAorX19TWVNDQUxMKF9fTlJfZmFjY2Vzc2F0LCBzeXNfZmFjY2Vzc2F0KQorI2RlZmluZSBfX05SX2NoZGlyIDQ5CitfX1NZU0NBTEwoX19OUl9jaGRpciwgc3lzX2NoZGlyKQorI2RlZmluZSBfX05SX2ZjaGRpciA1MAorX19TWVNDQUxMKF9fTlJfZmNoZGlyLCBzeXNfZmNoZGlyKQorI2RlZmluZSBfX05SX2Nocm9vdCA1MQorX19TWVNDQUxMKF9fTlJfY2hyb290LCBzeXNfY2hyb290KQorI2RlZmluZSBfX05SX2ZjaG1vZCA1MgorX19TWVNDQUxMKF9fTlJfZmNobW9kLCBzeXNfZmNobW9kKQorI2RlZmluZSBfX05SX2ZjaG1vZGF0IDUzCitfX1NZU0NBTEwoX19OUl9mY2htb2RhdCwgc3lzX2ZjaG1vZGF0KQorI2RlZmluZSBfX05SX2ZjaG93bmF0IDU0CitfX1NZU0NBTEwoX19OUl9mY2hvd25hdCwgc3lzX2ZjaG93bmF0KQorI2RlZmluZSBfX05SX2ZjaG93biA1NQorX19TWVNDQUxMKF9fTlJfZmNob3duLCBzeXNfZmNob3duKQorI2RlZmluZSBfX05SX29wZW5hdCA1NgorX19TQ19DT01QKF9fTlJfb3BlbmF0LCBzeXNfb3BlbmF0LCBjb21wYXRfc3lzX29wZW5hdCkKKyNkZWZpbmUgX19OUl9jbG9zZSA1NworX19TWVNDQUxMKF9fTlJfY2xvc2UsIHN5c19jbG9zZSkKKyNkZWZpbmUgX19OUl92aGFuZ3VwIDU4CitfX1NZU0NBTEwoX19OUl92aGFuZ3VwLCBzeXNfdmhhbmd1cCkKKworLyogZnMvcGlwZS5jICovCisjZGVmaW5lIF9fTlJfcGlwZTIgNTkKK19fU1lTQ0FMTChfX05SX3BpcGUyLCBzeXNfcGlwZTIpCisKKy8qIGZzL3F1b3RhLmMgKi8KKyNkZWZpbmUgX19OUl9xdW90YWN0bCA2MAorX19TWVNDQUxMKF9fTlJfcXVvdGFjdGwsIHN5c19xdW90YWN0bCkKKworLyogZnMvcmVhZGRpci5jICovCisjZGVmaW5lIF9fTlJfZ2V0ZGVudHM2NCA2MQorX19TQ19DT01QKF9fTlJfZ2V0ZGVudHM2NCwgc3lzX2dldGRlbnRzNjQsIGNvbXBhdF9zeXNfZ2V0ZGVudHM2NCkKKworLyogZnMvcmVhZF93cml0ZS5jICovCisjZGVmaW5lIF9fTlIzMjY0X2xzZWVrIDYyCitfX1NDXzMyNjQoX19OUjMyNjRfbHNlZWssIHN5c19sbHNlZWssIHN5c19sc2VlaykKKyNkZWZpbmUgX19OUl9yZWFkIDYzCitfX1NZU0NBTEwoX19OUl9yZWFkLCBzeXNfcmVhZCkKKyNkZWZpbmUgX19OUl93cml0ZSA2NAorX19TWVNDQUxMKF9fTlJfd3JpdGUsIHN5c193cml0ZSkKKyNkZWZpbmUgX19OUl9yZWFkdiA2NQorX19TQ19DT01QKF9fTlJfcmVhZHYsIHN5c19yZWFkdiwgY29tcGF0X3N5c19yZWFkdikKKyNkZWZpbmUgX19OUl93cml0ZXYgNjYKK19fU0NfQ09NUChfX05SX3dyaXRldiwgc3lzX3dyaXRldiwgY29tcGF0X3N5c193cml0ZXYpCisjZGVmaW5lIF9fTlJfcHJlYWQ2NCA2NworX19TQ19DT01QKF9fTlJfcHJlYWQ2NCwgc3lzX3ByZWFkNjQsIGNvbXBhdF9zeXNfcHJlYWQ2NCkKKyNkZWZpbmUgX19OUl9wd3JpdGU2NCA2OAorX19TQ19DT01QKF9fTlJfcHdyaXRlNjQsIHN5c19wd3JpdGU2NCwgY29tcGF0X3N5c19wd3JpdGU2NCkKKyNkZWZpbmUgX19OUl9wcmVhZHYgNjkKK19fU0NfQ09NUChfX05SX3ByZWFkdiwgc3lzX3ByZWFkdiwgY29tcGF0X3N5c19wcmVhZHYpCisjZGVmaW5lIF9fTlJfcHdyaXRldiA3MAorX19TQ19DT01QKF9fTlJfcHdyaXRldiwgc3lzX3B3cml0ZXYsIGNvbXBhdF9zeXNfcHdyaXRldikKKworLyogZnMvc2VuZGZpbGUuYyAqLworI2RlZmluZSBfX05SMzI2NF9zZW5kZmlsZSA3MQorX19TWVNDQUxMKF9fTlIzMjY0X3NlbmRmaWxlLCBzeXNfc2VuZGZpbGU2NCkKKworLyogZnMvc2VsZWN0LmMgKi8KKyNkZWZpbmUgX19OUl9wc2VsZWN0NiA3MgorX19TQ19DT01QKF9fTlJfcHNlbGVjdDYsIHN5c19wc2VsZWN0NiwgY29tcGF0X3N5c19wc2VsZWN0NikKKyNkZWZpbmUgX19OUl9wcG9sbCA3MworX19TQ19DT01QKF9fTlJfcHBvbGwsIHN5c19wcG9sbCwgY29tcGF0X3N5c19wcG9sbCkKKworLyogZnMvc2lnbmFsZmQuYyAqLworI2RlZmluZSBfX05SX3NpZ25hbGZkNCA3NAorX19TQ19DT01QKF9fTlJfc2lnbmFsZmQ0LCBzeXNfc2lnbmFsZmQ0LCBjb21wYXRfc3lzX3NpZ25hbGZkNCkKKworLyogZnMvc3BsaWNlLmMgKi8KKyNkZWZpbmUgX19OUl92bXNwbGljZSA3NQorX19TQ19DT01QKF9fTlJfdm1zcGxpY2UsIHN5c192bXNwbGljZSwgY29tcGF0X3N5c192bXNwbGljZSkKKyNkZWZpbmUgX19OUl9zcGxpY2UgNzYKK19fU1lTQ0FMTChfX05SX3NwbGljZSwgc3lzX3NwbGljZSkKKyNkZWZpbmUgX19OUl90ZWUgNzcKK19fU1lTQ0FMTChfX05SX3RlZSwgc3lzX3RlZSkKKworLyogZnMvc3RhdC5jICovCisjZGVmaW5lIF9fTlJfcmVhZGxpbmthdCA3OAorX19TWVNDQUxMKF9fTlJfcmVhZGxpbmthdCwgc3lzX3JlYWRsaW5rYXQpCisjZGVmaW5lIF9fTlIzMjY0X2ZzdGF0YXQgNzkKK19fU0NfMzI2NChfX05SMzI2NF9mc3RhdGF0LCBzeXNfZnN0YXRhdDY0LCBzeXNfbmV3ZnN0YXRhdCkKKyNkZWZpbmUgX19OUjMyNjRfZnN0YXQgODAKK19fU0NfMzI2NChfX05SMzI2NF9mc3RhdCwgc3lzX2ZzdGF0NjQsIHN5c19uZXdmc3RhdCkKKworLyogZnMvc3luYy5jICovCisjZGVmaW5lIF9fTlJfc3luYyA4MQorX19TWVNDQUxMKF9fTlJfc3luYywgc3lzX3N5bmMpCisjZGVmaW5lIF9fTlJfZnN5bmMgODIKK19fU1lTQ0FMTChfX05SX2ZzeW5jLCBzeXNfZnN5bmMpCisjZGVmaW5lIF9fTlJfZmRhdGFzeW5jIDgzCitfX1NZU0NBTEwoX19OUl9mZGF0YXN5bmMsIHN5c19mZGF0YXN5bmMpCisjaWZkZWYgX19BUkNIX1dBTlRfU1lOQ19GSUxFX1JBTkdFMgorI2RlZmluZSBfX05SX3N5bmNfZmlsZV9yYW5nZTIgODQKK19fU0NfQ09NUChfX05SX3N5bmNfZmlsZV9yYW5nZTIsIHN5c19zeW5jX2ZpbGVfcmFuZ2UyLCBcCisJICBjb21wYXRfc3lzX3N5bmNfZmlsZV9yYW5nZTIpCisjZWxzZQorI2RlZmluZSBfX05SX3N5bmNfZmlsZV9yYW5nZSA4NAorX19TQ19DT01QKF9fTlJfc3luY19maWxlX3JhbmdlLCBzeXNfc3luY19maWxlX3JhbmdlLCBcCisJICBjb21wYXRfc3lzX3N5bmNfZmlsZV9yYW5nZSkKKyNlbmRpZgorCisvKiBmcy90aW1lcmZkLmMgKi8KKyNkZWZpbmUgX19OUl90aW1lcmZkX2NyZWF0ZSA4NQorX19TWVNDQUxMKF9fTlJfdGltZXJmZF9jcmVhdGUsIHN5c190aW1lcmZkX2NyZWF0ZSkKKyNkZWZpbmUgX19OUl90aW1lcmZkX3NldHRpbWUgODYKK19fU0NfQ09NUChfX05SX3RpbWVyZmRfc2V0dGltZSwgc3lzX3RpbWVyZmRfc2V0dGltZSwgXAorCSAgY29tcGF0X3N5c190aW1lcmZkX3NldHRpbWUpCisjZGVmaW5lIF9fTlJfdGltZXJmZF9nZXR0aW1lIDg3CitfX1NDX0NPTVAoX19OUl90aW1lcmZkX2dldHRpbWUsIHN5c190aW1lcmZkX2dldHRpbWUsIFwKKwkgIGNvbXBhdF9zeXNfdGltZXJmZF9nZXR0aW1lKQorCisvKiBmcy91dGltZXMuYyAqLworI2RlZmluZSBfX05SX3V0aW1lbnNhdCA4OAorX19TQ19DT01QKF9fTlJfdXRpbWVuc2F0LCBzeXNfdXRpbWVuc2F0LCBjb21wYXRfc3lzX3V0aW1lbnNhdCkKKworLyoga2VybmVsL2FjY3QuYyAqLworI2RlZmluZSBfX05SX2FjY3QgODkKK19fU1lTQ0FMTChfX05SX2FjY3QsIHN5c19hY2N0KQorCisvKiBrZXJuZWwvY2FwYWJpbGl0eS5jICovCisjZGVmaW5lIF9fTlJfY2FwZ2V0IDkwCitfX1NZU0NBTEwoX19OUl9jYXBnZXQsIHN5c19jYXBnZXQpCisjZGVmaW5lIF9fTlJfY2Fwc2V0IDkxCitfX1NZU0NBTEwoX19OUl9jYXBzZXQsIHN5c19jYXBzZXQpCisKKy8qIGtlcm5lbC9leGVjX2RvbWFpbi5jICovCisjZGVmaW5lIF9fTlJfcGVyc29uYWxpdHkgOTIKK19fU1lTQ0FMTChfX05SX3BlcnNvbmFsaXR5LCBzeXNfcGVyc29uYWxpdHkpCisKKy8qIGtlcm5lbC9leGl0LmMgKi8KKyNkZWZpbmUgX19OUl9leGl0IDkzCitfX1NZU0NBTEwoX19OUl9leGl0LCBzeXNfZXhpdCkKKyNkZWZpbmUgX19OUl9leGl0X2dyb3VwIDk0CitfX1NZU0NBTEwoX19OUl9leGl0X2dyb3VwLCBzeXNfZXhpdF9ncm91cCkKKyNkZWZpbmUgX19OUl93YWl0aWQgOTUKK19fU0NfQ09NUChfX05SX3dhaXRpZCwgc3lzX3dhaXRpZCwgY29tcGF0X3N5c193YWl0aWQpCisKKy8qIGtlcm5lbC9mb3JrLmMgKi8KKyNkZWZpbmUgX19OUl9zZXRfdGlkX2FkZHJlc3MgOTYKK19fU1lTQ0FMTChfX05SX3NldF90aWRfYWRkcmVzcywgc3lzX3NldF90aWRfYWRkcmVzcykKKyNkZWZpbmUgX19OUl91bnNoYXJlIDk3CitfX1NZU0NBTEwoX19OUl91bnNoYXJlLCBzeXNfdW5zaGFyZSkKKworLyoga2VybmVsL2Z1dGV4LmMgKi8KKyNkZWZpbmUgX19OUl9mdXRleCA5OAorX19TQ19DT01QKF9fTlJfZnV0ZXgsIHN5c19mdXRleCwgY29tcGF0X3N5c19mdXRleCkKKyNkZWZpbmUgX19OUl9zZXRfcm9idXN0X2xpc3QgOTkKK19fU0NfQ09NUChfX05SX3NldF9yb2J1c3RfbGlzdCwgc3lzX3NldF9yb2J1c3RfbGlzdCwgXAorCSAgY29tcGF0X3N5c19zZXRfcm9idXN0X2xpc3QpCisjZGVmaW5lIF9fTlJfZ2V0X3JvYnVzdF9saXN0IDEwMAorX19TQ19DT01QKF9fTlJfZ2V0X3JvYnVzdF9saXN0LCBzeXNfZ2V0X3JvYnVzdF9saXN0LCBcCisJICBjb21wYXRfc3lzX2dldF9yb2J1c3RfbGlzdCkKKworLyoga2VybmVsL2hydGltZXIuYyAqLworI2RlZmluZSBfX05SX25hbm9zbGVlcCAxMDEKK19fU0NfQ09NUChfX05SX25hbm9zbGVlcCwgc3lzX25hbm9zbGVlcCwgY29tcGF0X3N5c19uYW5vc2xlZXApCisKKy8qIGtlcm5lbC9pdGltZXIuYyAqLworI2RlZmluZSBfX05SX2dldGl0aW1lciAxMDIKK19fU0NfQ09NUChfX05SX2dldGl0aW1lciwgc3lzX2dldGl0aW1lciwgY29tcGF0X3N5c19nZXRpdGltZXIpCisjZGVmaW5lIF9fTlJfc2V0aXRpbWVyIDEwMworX19TQ19DT01QKF9fTlJfc2V0aXRpbWVyLCBzeXNfc2V0aXRpbWVyLCBjb21wYXRfc3lzX3NldGl0aW1lcikKKworLyoga2VybmVsL2tleGVjLmMgKi8KKyNkZWZpbmUgX19OUl9rZXhlY19sb2FkIDEwNAorX19TQ19DT01QKF9fTlJfa2V4ZWNfbG9hZCwgc3lzX2tleGVjX2xvYWQsIGNvbXBhdF9zeXNfa2V4ZWNfbG9hZCkKKworLyoga2VybmVsL21vZHVsZS5jICovCisjZGVmaW5lIF9fTlJfaW5pdF9tb2R1bGUgMTA1CitfX1NZU0NBTEwoX19OUl9pbml0X21vZHVsZSwgc3lzX2luaXRfbW9kdWxlKQorI2RlZmluZSBfX05SX2RlbGV0ZV9tb2R1bGUgMTA2CitfX1NZU0NBTEwoX19OUl9kZWxldGVfbW9kdWxlLCBzeXNfZGVsZXRlX21vZHVsZSkKKworLyoga2VybmVsL3Bvc2l4LXRpbWVycy5jICovCisjZGVmaW5lIF9fTlJfdGltZXJfY3JlYXRlIDEwNworX19TQ19DT01QKF9fTlJfdGltZXJfY3JlYXRlLCBzeXNfdGltZXJfY3JlYXRlLCBjb21wYXRfc3lzX3RpbWVyX2NyZWF0ZSkKKyNkZWZpbmUgX19OUl90aW1lcl9nZXR0aW1lIDEwOAorX19TQ19DT01QKF9fTlJfdGltZXJfZ2V0dGltZSwgc3lzX3RpbWVyX2dldHRpbWUsIGNvbXBhdF9zeXNfdGltZXJfZ2V0dGltZSkKKyNkZWZpbmUgX19OUl90aW1lcl9nZXRvdmVycnVuIDEwOQorX19TWVNDQUxMKF9fTlJfdGltZXJfZ2V0b3ZlcnJ1biwgc3lzX3RpbWVyX2dldG92ZXJydW4pCisjZGVmaW5lIF9fTlJfdGltZXJfc2V0dGltZSAxMTAKK19fU0NfQ09NUChfX05SX3RpbWVyX3NldHRpbWUsIHN5c190aW1lcl9zZXR0aW1lLCBjb21wYXRfc3lzX3RpbWVyX3NldHRpbWUpCisjZGVmaW5lIF9fTlJfdGltZXJfZGVsZXRlIDExMQorX19TWVNDQUxMKF9fTlJfdGltZXJfZGVsZXRlLCBzeXNfdGltZXJfZGVsZXRlKQorI2RlZmluZSBfX05SX2Nsb2NrX3NldHRpbWUgMTEyCitfX1NDX0NPTVAoX19OUl9jbG9ja19zZXR0aW1lLCBzeXNfY2xvY2tfc2V0dGltZSwgY29tcGF0X3N5c19jbG9ja19zZXR0aW1lKQorI2RlZmluZSBfX05SX2Nsb2NrX2dldHRpbWUgMTEzCitfX1NDX0NPTVAoX19OUl9jbG9ja19nZXR0aW1lLCBzeXNfY2xvY2tfZ2V0dGltZSwgY29tcGF0X3N5c19jbG9ja19nZXR0aW1lKQorI2RlZmluZSBfX05SX2Nsb2NrX2dldHJlcyAxMTQKK19fU0NfQ09NUChfX05SX2Nsb2NrX2dldHJlcywgc3lzX2Nsb2NrX2dldHJlcywgY29tcGF0X3N5c19jbG9ja19nZXRyZXMpCisjZGVmaW5lIF9fTlJfY2xvY2tfbmFub3NsZWVwIDExNQorX19TQ19DT01QKF9fTlJfY2xvY2tfbmFub3NsZWVwLCBzeXNfY2xvY2tfbmFub3NsZWVwLCBcCisJICBjb21wYXRfc3lzX2Nsb2NrX25hbm9zbGVlcCkKKworLyoga2VybmVsL3ByaW50ay5jICovCisjZGVmaW5lIF9fTlJfc3lzbG9nIDExNgorX19TWVNDQUxMKF9fTlJfc3lzbG9nLCBzeXNfc3lzbG9nKQorCisvKiBrZXJuZWwvcHRyYWNlLmMgKi8KKyNkZWZpbmUgX19OUl9wdHJhY2UgMTE3CitfX1NZU0NBTEwoX19OUl9wdHJhY2UsIHN5c19wdHJhY2UpCisKKy8qIGtlcm5lbC9zY2hlZC5jICovCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0cGFyYW0gMTE4CitfX1NZU0NBTEwoX19OUl9zY2hlZF9zZXRwYXJhbSwgc3lzX3NjaGVkX3NldHBhcmFtKQorI2RlZmluZSBfX05SX3NjaGVkX3NldHNjaGVkdWxlciAxMTkKK19fU1lTQ0FMTChfX05SX3NjaGVkX3NldHNjaGVkdWxlciwgc3lzX3NjaGVkX3NldHNjaGVkdWxlcikKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRzY2hlZHVsZXIgMTIwCitfX1NZU0NBTEwoX19OUl9zY2hlZF9nZXRzY2hlZHVsZXIsIHN5c19zY2hlZF9nZXRzY2hlZHVsZXIpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0cGFyYW0gMTIxCitfX1NZU0NBTEwoX19OUl9zY2hlZF9nZXRwYXJhbSwgc3lzX3NjaGVkX2dldHBhcmFtKQorI2RlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5IDEyMgorX19TQ19DT01QKF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIHN5c19zY2hlZF9zZXRhZmZpbml0eSwgXAorCSAgY29tcGF0X3N5c19zY2hlZF9zZXRhZmZpbml0eSkKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAxMjMKK19fU0NfQ09NUChfX05SX3NjaGVkX2dldGFmZmluaXR5LCBzeXNfc2NoZWRfZ2V0YWZmaW5pdHksIFwKKwkgIGNvbXBhdF9zeXNfc2NoZWRfZ2V0YWZmaW5pdHkpCisjZGVmaW5lIF9fTlJfc2NoZWRfeWllbGQgMTI0CitfX1NZU0NBTEwoX19OUl9zY2hlZF95aWVsZCwgc3lzX3NjaGVkX3lpZWxkKQorI2RlZmluZSBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9tYXggMTI1CitfX1NZU0NBTEwoX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWF4LCBzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCkKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWluIDEyNgorX19TWVNDQUxMKF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiwgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4pCisjZGVmaW5lIF9fTlJfc2NoZWRfcnJfZ2V0X2ludGVydmFsIDEyNworX19TQ19DT01QKF9fTlJfc2NoZWRfcnJfZ2V0X2ludGVydmFsLCBzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsLCBcCisJICBjb21wYXRfc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbCkKKworLyoga2VybmVsL3NpZ25hbC5jICovCisjZGVmaW5lIF9fTlJfcmVzdGFydF9zeXNjYWxsIDEyOAorX19TWVNDQUxMKF9fTlJfcmVzdGFydF9zeXNjYWxsLCBzeXNfcmVzdGFydF9zeXNjYWxsKQorI2RlZmluZSBfX05SX2tpbGwgMTI5CitfX1NZU0NBTEwoX19OUl9raWxsLCBzeXNfa2lsbCkKKyNkZWZpbmUgX19OUl90a2lsbCAxMzAKK19fU1lTQ0FMTChfX05SX3RraWxsLCBzeXNfdGtpbGwpCisjZGVmaW5lIF9fTlJfdGdraWxsIDEzMQorX19TWVNDQUxMKF9fTlJfdGdraWxsLCBzeXNfdGdraWxsKQorI2RlZmluZSBfX05SX3NpZ2FsdHN0YWNrIDEzMgorX19TQ19DT01QKF9fTlJfc2lnYWx0c3RhY2ssIHN5c19zaWdhbHRzdGFjaywgY29tcGF0X3N5c19zaWdhbHRzdGFjaykKKyNkZWZpbmUgX19OUl9ydF9zaWdzdXNwZW5kIDEzMworX19TQ19DT01QKF9fTlJfcnRfc2lnc3VzcGVuZCwgc3lzX3J0X3NpZ3N1c3BlbmQsIGNvbXBhdF9zeXNfcnRfc2lnc3VzcGVuZCkKKyNkZWZpbmUgX19OUl9ydF9zaWdhY3Rpb24gMTM0CitfX1NDX0NPTVAoX19OUl9ydF9zaWdhY3Rpb24sIHN5c19ydF9zaWdhY3Rpb24sIGNvbXBhdF9zeXNfcnRfc2lnYWN0aW9uKQorI2RlZmluZSBfX05SX3J0X3NpZ3Byb2NtYXNrIDEzNQorX19TWVNDQUxMKF9fTlJfcnRfc2lncHJvY21hc2ssIHN5c19ydF9zaWdwcm9jbWFzaykKKyNkZWZpbmUgX19OUl9ydF9zaWdwZW5kaW5nIDEzNgorX19TWVNDQUxMKF9fTlJfcnRfc2lncGVuZGluZywgc3lzX3J0X3NpZ3BlbmRpbmcpCisjZGVmaW5lIF9fTlJfcnRfc2lndGltZWR3YWl0IDEzNworX19TQ19DT01QKF9fTlJfcnRfc2lndGltZWR3YWl0LCBzeXNfcnRfc2lndGltZWR3YWl0LCBcCisJICBjb21wYXRfc3lzX3J0X3NpZ3RpbWVkd2FpdCkKKyNkZWZpbmUgX19OUl9ydF9zaWdxdWV1ZWluZm8gMTM4CitfX1NDX0NPTVAoX19OUl9ydF9zaWdxdWV1ZWluZm8sIHN5c19ydF9zaWdxdWV1ZWluZm8sIFwKKwkgIGNvbXBhdF9zeXNfcnRfc2lncXVldWVpbmZvKQorI2RlZmluZSBfX05SX3J0X3NpZ3JldHVybiAxMzkKK19fU0NfQ09NUChfX05SX3J0X3NpZ3JldHVybiwgc3lzX3J0X3NpZ3JldHVybiwgY29tcGF0X3N5c19ydF9zaWdyZXR1cm4pCisKKy8qIGtlcm5lbC9zeXMuYyAqLworI2RlZmluZSBfX05SX3NldHByaW9yaXR5IDE0MAorX19TWVNDQUxMKF9fTlJfc2V0cHJpb3JpdHksIHN5c19zZXRwcmlvcml0eSkKKyNkZWZpbmUgX19OUl9nZXRwcmlvcml0eSAxNDEKK19fU1lTQ0FMTChfX05SX2dldHByaW9yaXR5LCBzeXNfZ2V0cHJpb3JpdHkpCisjZGVmaW5lIF9fTlJfcmVib290IDE0MgorX19TWVNDQUxMKF9fTlJfcmVib290LCBzeXNfcmVib290KQorI2RlZmluZSBfX05SX3NldHJlZ2lkIDE0MworX19TWVNDQUxMKF9fTlJfc2V0cmVnaWQsIHN5c19zZXRyZWdpZCkKKyNkZWZpbmUgX19OUl9zZXRnaWQgMTQ0CitfX1NZU0NBTEwoX19OUl9zZXRnaWQsIHN5c19zZXRnaWQpCisjZGVmaW5lIF9fTlJfc2V0cmV1aWQgMTQ1CitfX1NZU0NBTEwoX19OUl9zZXRyZXVpZCwgc3lzX3NldHJldWlkKQorI2RlZmluZSBfX05SX3NldHVpZCAxNDYKK19fU1lTQ0FMTChfX05SX3NldHVpZCwgc3lzX3NldHVpZCkKKyNkZWZpbmUgX19OUl9zZXRyZXN1aWQgMTQ3CitfX1NZU0NBTEwoX19OUl9zZXRyZXN1aWQsIHN5c19zZXRyZXN1aWQpCisjZGVmaW5lIF9fTlJfZ2V0cmVzdWlkIDE0OAorX19TWVNDQUxMKF9fTlJfZ2V0cmVzdWlkLCBzeXNfZ2V0cmVzdWlkKQorI2RlZmluZSBfX05SX3NldHJlc2dpZCAxNDkKK19fU1lTQ0FMTChfX05SX3NldHJlc2dpZCwgc3lzX3NldHJlc2dpZCkKKyNkZWZpbmUgX19OUl9nZXRyZXNnaWQgMTUwCitfX1NZU0NBTEwoX19OUl9nZXRyZXNnaWQsIHN5c19nZXRyZXNnaWQpCisjZGVmaW5lIF9fTlJfc2V0ZnN1aWQgMTUxCitfX1NZU0NBTEwoX19OUl9zZXRmc3VpZCwgc3lzX3NldGZzdWlkKQorI2RlZmluZSBfX05SX3NldGZzZ2lkIDE1MgorX19TWVNDQUxMKF9fTlJfc2V0ZnNnaWQsIHN5c19zZXRmc2dpZCkKKyNkZWZpbmUgX19OUl90aW1lcyAxNTMKK19fU0NfQ09NUChfX05SX3RpbWVzLCBzeXNfdGltZXMsIGNvbXBhdF9zeXNfdGltZXMpCisjZGVmaW5lIF9fTlJfc2V0cGdpZCAxNTQKK19fU1lTQ0FMTChfX05SX3NldHBnaWQsIHN5c19zZXRwZ2lkKQorI2RlZmluZSBfX05SX2dldHBnaWQgMTU1CitfX1NZU0NBTEwoX19OUl9nZXRwZ2lkLCBzeXNfZ2V0cGdpZCkKKyNkZWZpbmUgX19OUl9nZXRzaWQgMTU2CitfX1NZU0NBTEwoX19OUl9nZXRzaWQsIHN5c19nZXRzaWQpCisjZGVmaW5lIF9fTlJfc2V0c2lkIDE1NworX19TWVNDQUxMKF9fTlJfc2V0c2lkLCBzeXNfc2V0c2lkKQorI2RlZmluZSBfX05SX2dldGdyb3VwcyAxNTgKK19fU1lTQ0FMTChfX05SX2dldGdyb3Vwcywgc3lzX2dldGdyb3VwcykKKyNkZWZpbmUgX19OUl9zZXRncm91cHMgMTU5CitfX1NZU0NBTEwoX19OUl9zZXRncm91cHMsIHN5c19zZXRncm91cHMpCisjZGVmaW5lIF9fTlJfdW5hbWUgMTYwCitfX1NZU0NBTEwoX19OUl91bmFtZSwgc3lzX25ld3VuYW1lKQorI2RlZmluZSBfX05SX3NldGhvc3RuYW1lIDE2MQorX19TWVNDQUxMKF9fTlJfc2V0aG9zdG5hbWUsIHN5c19zZXRob3N0bmFtZSkKKyNkZWZpbmUgX19OUl9zZXRkb21haW5uYW1lIDE2MgorX19TWVNDQUxMKF9fTlJfc2V0ZG9tYWlubmFtZSwgc3lzX3NldGRvbWFpbm5hbWUpCisjZGVmaW5lIF9fTlJfZ2V0cmxpbWl0IDE2MworX19TQ19DT01QKF9fTlJfZ2V0cmxpbWl0LCBzeXNfZ2V0cmxpbWl0LCBjb21wYXRfc3lzX2dldHJsaW1pdCkKKyNkZWZpbmUgX19OUl9zZXRybGltaXQgMTY0CitfX1NDX0NPTVAoX19OUl9zZXRybGltaXQsIHN5c19zZXRybGltaXQsIGNvbXBhdF9zeXNfc2V0cmxpbWl0KQorI2RlZmluZSBfX05SX2dldHJ1c2FnZSAxNjUKK19fU0NfQ09NUChfX05SX2dldHJ1c2FnZSwgc3lzX2dldHJ1c2FnZSwgY29tcGF0X3N5c19nZXRydXNhZ2UpCisjZGVmaW5lIF9fTlJfdW1hc2sgMTY2CitfX1NZU0NBTEwoX19OUl91bWFzaywgc3lzX3VtYXNrKQorI2RlZmluZSBfX05SX3ByY3RsIDE2NworX19TWVNDQUxMKF9fTlJfcHJjdGwsIHN5c19wcmN0bCkKKyNkZWZpbmUgX19OUl9nZXRjcHUgMTY4CitfX1NZU0NBTEwoX19OUl9nZXRjcHUsIHN5c19nZXRjcHUpCisKKy8qIGtlcm5lbC90aW1lLmMgKi8KKyNkZWZpbmUgX19OUl9nZXR0aW1lb2ZkYXkgMTY5CitfX1NDX0NPTVAoX19OUl9nZXR0aW1lb2ZkYXksIHN5c19nZXR0aW1lb2ZkYXksIGNvbXBhdF9zeXNfZ2V0dGltZW9mZGF5KQorI2RlZmluZSBfX05SX3NldHRpbWVvZmRheSAxNzAKK19fU0NfQ09NUChfX05SX3NldHRpbWVvZmRheSwgc3lzX3NldHRpbWVvZmRheSwgY29tcGF0X3N5c19zZXR0aW1lb2ZkYXkpCisjZGVmaW5lIF9fTlJfYWRqdGltZXggMTcxCitfX1NDX0NPTVAoX19OUl9hZGp0aW1leCwgc3lzX2FkanRpbWV4LCBjb21wYXRfc3lzX2FkanRpbWV4KQorCisvKiBrZXJuZWwvdGltZXIuYyAqLworI2RlZmluZSBfX05SX2dldHBpZCAxNzIKK19fU1lTQ0FMTChfX05SX2dldHBpZCwgc3lzX2dldHBpZCkKKyNkZWZpbmUgX19OUl9nZXRwcGlkIDE3MworX19TWVNDQUxMKF9fTlJfZ2V0cHBpZCwgc3lzX2dldHBwaWQpCisjZGVmaW5lIF9fTlJfZ2V0dWlkIDE3NAorX19TWVNDQUxMKF9fTlJfZ2V0dWlkLCBzeXNfZ2V0dWlkKQorI2RlZmluZSBfX05SX2dldGV1aWQgMTc1CitfX1NZU0NBTEwoX19OUl9nZXRldWlkLCBzeXNfZ2V0ZXVpZCkKKyNkZWZpbmUgX19OUl9nZXRnaWQgMTc2CitfX1NZU0NBTEwoX19OUl9nZXRnaWQsIHN5c19nZXRnaWQpCisjZGVmaW5lIF9fTlJfZ2V0ZWdpZCAxNzcKK19fU1lTQ0FMTChfX05SX2dldGVnaWQsIHN5c19nZXRlZ2lkKQorI2RlZmluZSBfX05SX2dldHRpZCAxNzgKK19fU1lTQ0FMTChfX05SX2dldHRpZCwgc3lzX2dldHRpZCkKKyNkZWZpbmUgX19OUl9zeXNpbmZvIDE3OQorX19TQ19DT01QKF9fTlJfc3lzaW5mbywgc3lzX3N5c2luZm8sIGNvbXBhdF9zeXNfc3lzaW5mbykKKworLyogaXBjL21xdWV1ZS5jICovCisjZGVmaW5lIF9fTlJfbXFfb3BlbiAxODAKK19fU0NfQ09NUChfX05SX21xX29wZW4sIHN5c19tcV9vcGVuLCBjb21wYXRfc3lzX21xX29wZW4pCisjZGVmaW5lIF9fTlJfbXFfdW5saW5rIDE4MQorX19TWVNDQUxMKF9fTlJfbXFfdW5saW5rLCBzeXNfbXFfdW5saW5rKQorI2RlZmluZSBfX05SX21xX3RpbWVkc2VuZCAxODIKK19fU0NfQ09NUChfX05SX21xX3RpbWVkc2VuZCwgc3lzX21xX3RpbWVkc2VuZCwgY29tcGF0X3N5c19tcV90aW1lZHNlbmQpCisjZGVmaW5lIF9fTlJfbXFfdGltZWRyZWNlaXZlIDE4MworX19TQ19DT01QKF9fTlJfbXFfdGltZWRyZWNlaXZlLCBzeXNfbXFfdGltZWRyZWNlaXZlLCBcCisJICBjb21wYXRfc3lzX21xX3RpbWVkcmVjZWl2ZSkKKyNkZWZpbmUgX19OUl9tcV9ub3RpZnkgMTg0CitfX1NDX0NPTVAoX19OUl9tcV9ub3RpZnksIHN5c19tcV9ub3RpZnksIGNvbXBhdF9zeXNfbXFfbm90aWZ5KQorI2RlZmluZSBfX05SX21xX2dldHNldGF0dHIgMTg1CitfX1NDX0NPTVAoX19OUl9tcV9nZXRzZXRhdHRyLCBzeXNfbXFfZ2V0c2V0YXR0ciwgY29tcGF0X3N5c19tcV9nZXRzZXRhdHRyKQorCisvKiBpcGMvbXNnLmMgKi8KKyNkZWZpbmUgX19OUl9tc2dnZXQgMTg2CitfX1NZU0NBTEwoX19OUl9tc2dnZXQsIHN5c19tc2dnZXQpCisjZGVmaW5lIF9fTlJfbXNnY3RsIDE4NworX19TQ19DT01QKF9fTlJfbXNnY3RsLCBzeXNfbXNnY3RsLCBjb21wYXRfc3lzX21zZ2N0bCkKKyNkZWZpbmUgX19OUl9tc2dyY3YgMTg4CitfX1NDX0NPTVAoX19OUl9tc2dyY3YsIHN5c19tc2dyY3YsIGNvbXBhdF9zeXNfbXNncmN2KQorI2RlZmluZSBfX05SX21zZ3NuZCAxODkKK19fU0NfQ09NUChfX05SX21zZ3NuZCwgc3lzX21zZ3NuZCwgY29tcGF0X3N5c19tc2dzbmQpCisKKy8qIGlwYy9zZW0uYyAqLworI2RlZmluZSBfX05SX3NlbWdldCAxOTAKK19fU1lTQ0FMTChfX05SX3NlbWdldCwgc3lzX3NlbWdldCkKKyNkZWZpbmUgX19OUl9zZW1jdGwgMTkxCitfX1NDX0NPTVAoX19OUl9zZW1jdGwsIHN5c19zZW1jdGwsIGNvbXBhdF9zeXNfc2VtY3RsKQorI2RlZmluZSBfX05SX3NlbXRpbWVkb3AgMTkyCitfX1NDX0NPTVAoX19OUl9zZW10aW1lZG9wLCBzeXNfc2VtdGltZWRvcCwgY29tcGF0X3N5c19zZW10aW1lZG9wKQorI2RlZmluZSBfX05SX3NlbW9wIDE5MworX19TWVNDQUxMKF9fTlJfc2Vtb3AsIHN5c19zZW1vcCkKKworLyogaXBjL3NobS5jICovCisjZGVmaW5lIF9fTlJfc2htZ2V0IDE5NAorX19TWVNDQUxMKF9fTlJfc2htZ2V0LCBzeXNfc2htZ2V0KQorI2RlZmluZSBfX05SX3NobWN0bCAxOTUKK19fU0NfQ09NUChfX05SX3NobWN0bCwgc3lzX3NobWN0bCwgY29tcGF0X3N5c19zaG1jdGwpCisjZGVmaW5lIF9fTlJfc2htYXQgMTk2CitfX1NDX0NPTVAoX19OUl9zaG1hdCwgc3lzX3NobWF0LCBjb21wYXRfc3lzX3NobWF0KQorI2RlZmluZSBfX05SX3NobWR0IDE5NworX19TWVNDQUxMKF9fTlJfc2htZHQsIHN5c19zaG1kdCkKKworLyogbmV0L3NvY2tldC5jICovCisjZGVmaW5lIF9fTlJfc29ja2V0IDE5OAorX19TWVNDQUxMKF9fTlJfc29ja2V0LCBzeXNfc29ja2V0KQorI2RlZmluZSBfX05SX3NvY2tldHBhaXIgMTk5CitfX1NZU0NBTEwoX19OUl9zb2NrZXRwYWlyLCBzeXNfc29ja2V0cGFpcikKKyNkZWZpbmUgX19OUl9iaW5kIDIwMAorX19TWVNDQUxMKF9fTlJfYmluZCwgc3lzX2JpbmQpCisjZGVmaW5lIF9fTlJfbGlzdGVuIDIwMQorX19TWVNDQUxMKF9fTlJfbGlzdGVuLCBzeXNfbGlzdGVuKQorI2RlZmluZSBfX05SX2FjY2VwdCAyMDIKK19fU1lTQ0FMTChfX05SX2FjY2VwdCwgc3lzX2FjY2VwdCkKKyNkZWZpbmUgX19OUl9jb25uZWN0IDIwMworX19TWVNDQUxMKF9fTlJfY29ubmVjdCwgc3lzX2Nvbm5lY3QpCisjZGVmaW5lIF9fTlJfZ2V0c29ja25hbWUgMjA0CitfX1NZU0NBTEwoX19OUl9nZXRzb2NrbmFtZSwgc3lzX2dldHNvY2tuYW1lKQorI2RlZmluZSBfX05SX2dldHBlZXJuYW1lIDIwNQorX19TWVNDQUxMKF9fTlJfZ2V0cGVlcm5hbWUsIHN5c19nZXRwZWVybmFtZSkKKyNkZWZpbmUgX19OUl9zZW5kdG8gMjA2CitfX1NZU0NBTEwoX19OUl9zZW5kdG8sIHN5c19zZW5kdG8pCisjZGVmaW5lIF9fTlJfcmVjdmZyb20gMjA3CitfX1NDX0NPTVAoX19OUl9yZWN2ZnJvbSwgc3lzX3JlY3Zmcm9tLCBjb21wYXRfc3lzX3JlY3Zmcm9tKQorI2RlZmluZSBfX05SX3NldHNvY2tvcHQgMjA4CitfX1NDX0NPTVAoX19OUl9zZXRzb2Nrb3B0LCBzeXNfc2V0c29ja29wdCwgY29tcGF0X3N5c19zZXRzb2Nrb3B0KQorI2RlZmluZSBfX05SX2dldHNvY2tvcHQgMjA5CitfX1NDX0NPTVAoX19OUl9nZXRzb2Nrb3B0LCBzeXNfZ2V0c29ja29wdCwgY29tcGF0X3N5c19nZXRzb2Nrb3B0KQorI2RlZmluZSBfX05SX3NodXRkb3duIDIxMAorX19TWVNDQUxMKF9fTlJfc2h1dGRvd24sIHN5c19zaHV0ZG93bikKKyNkZWZpbmUgX19OUl9zZW5kbXNnIDIxMQorX19TQ19DT01QKF9fTlJfc2VuZG1zZywgc3lzX3NlbmRtc2csIGNvbXBhdF9zeXNfc2VuZG1zZykKKyNkZWZpbmUgX19OUl9yZWN2bXNnIDIxMgorX19TQ19DT01QKF9fTlJfcmVjdm1zZywgc3lzX3JlY3Ztc2csIGNvbXBhdF9zeXNfcmVjdm1zZykKKworLyogbW0vZmlsZW1hcC5jICovCisjZGVmaW5lIF9fTlJfcmVhZGFoZWFkIDIxMworX19TQ19DT01QKF9fTlJfcmVhZGFoZWFkLCBzeXNfcmVhZGFoZWFkLCBjb21wYXRfc3lzX3JlYWRhaGVhZCkKKworLyogbW0vbm9tbXUuYywgYWxzbyB3aXRoIE1NVSAqLworI2RlZmluZSBfX05SX2JyayAyMTQKK19fU1lTQ0FMTChfX05SX2Jyaywgc3lzX2JyaykKKyNkZWZpbmUgX19OUl9tdW5tYXAgMjE1CitfX1NZU0NBTEwoX19OUl9tdW5tYXAsIHN5c19tdW5tYXApCisjZGVmaW5lIF9fTlJfbXJlbWFwIDIxNgorX19TWVNDQUxMKF9fTlJfbXJlbWFwLCBzeXNfbXJlbWFwKQorCisvKiBzZWN1cml0eS9rZXlzL2tleWN0bC5jICovCisjZGVmaW5lIF9fTlJfYWRkX2tleSAyMTcKK19fU1lTQ0FMTChfX05SX2FkZF9rZXksIHN5c19hZGRfa2V5KQorI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5IDIxOAorX19TWVNDQUxMKF9fTlJfcmVxdWVzdF9rZXksIHN5c19yZXF1ZXN0X2tleSkKKyNkZWZpbmUgX19OUl9rZXljdGwgMjE5CitfX1NDX0NPTVAoX19OUl9rZXljdGwsIHN5c19rZXljdGwsIGNvbXBhdF9zeXNfa2V5Y3RsKQorCisvKiBhcmNoL2V4YW1wbGUva2VybmVsL3N5c19leGFtcGxlLmMgKi8KKyNkZWZpbmUgX19OUl9jbG9uZSAyMjAKK19fU1lTQ0FMTChfX05SX2Nsb25lLCBzeXNfY2xvbmUpCisjZGVmaW5lIF9fTlJfZXhlY3ZlIDIyMQorX19TQ19DT01QKF9fTlJfZXhlY3ZlLCBzeXNfZXhlY3ZlLCBjb21wYXRfc3lzX2V4ZWN2ZSkKKworI2RlZmluZSBfX05SMzI2NF9tbWFwIDIyMgorX19TQ18zMjY0KF9fTlIzMjY0X21tYXAsIHN5c19tbWFwMiwgc3lzX21tYXApCisvKiBtbS9mYWR2aXNlLmMgKi8KKyNkZWZpbmUgX19OUjMyNjRfZmFkdmlzZTY0IDIyMworX19TQ19DT01QKF9fTlIzMjY0X2ZhZHZpc2U2NCwgc3lzX2ZhZHZpc2U2NF82NCwgY29tcGF0X3N5c19mYWR2aXNlNjRfNjQpCisKKy8qIG1tLywgQ09ORklHX01NVSBvbmx5ICovCisjaWZuZGVmIF9fQVJDSF9OT01NVQorI2RlZmluZSBfX05SX3N3YXBvbiAyMjQKK19fU1lTQ0FMTChfX05SX3N3YXBvbiwgc3lzX3N3YXBvbikKKyNkZWZpbmUgX19OUl9zd2Fwb2ZmIDIyNQorX19TWVNDQUxMKF9fTlJfc3dhcG9mZiwgc3lzX3N3YXBvZmYpCisjZGVmaW5lIF9fTlJfbXByb3RlY3QgMjI2CitfX1NZU0NBTEwoX19OUl9tcHJvdGVjdCwgc3lzX21wcm90ZWN0KQorI2RlZmluZSBfX05SX21zeW5jIDIyNworX19TWVNDQUxMKF9fTlJfbXN5bmMsIHN5c19tc3luYykKKyNkZWZpbmUgX19OUl9tbG9jayAyMjgKK19fU1lTQ0FMTChfX05SX21sb2NrLCBzeXNfbWxvY2spCisjZGVmaW5lIF9fTlJfbXVubG9jayAyMjkKK19fU1lTQ0FMTChfX05SX211bmxvY2ssIHN5c19tdW5sb2NrKQorI2RlZmluZSBfX05SX21sb2NrYWxsIDIzMAorX19TWVNDQUxMKF9fTlJfbWxvY2thbGwsIHN5c19tbG9ja2FsbCkKKyNkZWZpbmUgX19OUl9tdW5sb2NrYWxsIDIzMQorX19TWVNDQUxMKF9fTlJfbXVubG9ja2FsbCwgc3lzX211bmxvY2thbGwpCisjZGVmaW5lIF9fTlJfbWluY29yZSAyMzIKK19fU1lTQ0FMTChfX05SX21pbmNvcmUsIHN5c19taW5jb3JlKQorI2RlZmluZSBfX05SX21hZHZpc2UgMjMzCitfX1NZU0NBTEwoX19OUl9tYWR2aXNlLCBzeXNfbWFkdmlzZSkKKyNkZWZpbmUgX19OUl9yZW1hcF9maWxlX3BhZ2VzIDIzNAorX19TWVNDQUxMKF9fTlJfcmVtYXBfZmlsZV9wYWdlcywgc3lzX3JlbWFwX2ZpbGVfcGFnZXMpCisjZGVmaW5lIF9fTlJfbWJpbmQgMjM1CitfX1NDX0NPTVAoX19OUl9tYmluZCwgc3lzX21iaW5kLCBjb21wYXRfc3lzX21iaW5kKQorI2RlZmluZSBfX05SX2dldF9tZW1wb2xpY3kgMjM2CitfX1NDX0NPTVAoX19OUl9nZXRfbWVtcG9saWN5LCBzeXNfZ2V0X21lbXBvbGljeSwgY29tcGF0X3N5c19nZXRfbWVtcG9saWN5KQorI2RlZmluZSBfX05SX3NldF9tZW1wb2xpY3kgMjM3CitfX1NDX0NPTVAoX19OUl9zZXRfbWVtcG9saWN5LCBzeXNfc2V0X21lbXBvbGljeSwgY29tcGF0X3N5c19zZXRfbWVtcG9saWN5KQorI2RlZmluZSBfX05SX21pZ3JhdGVfcGFnZXMgMjM4CitfX1NDX0NPTVAoX19OUl9taWdyYXRlX3BhZ2VzLCBzeXNfbWlncmF0ZV9wYWdlcywgY29tcGF0X3N5c19taWdyYXRlX3BhZ2VzKQorI2RlZmluZSBfX05SX21vdmVfcGFnZXMgMjM5CitfX1NDX0NPTVAoX19OUl9tb3ZlX3BhZ2VzLCBzeXNfbW92ZV9wYWdlcywgY29tcGF0X3N5c19tb3ZlX3BhZ2VzKQorI2VuZGlmCisKKyNkZWZpbmUgX19OUl9ydF90Z3NpZ3F1ZXVlaW5mbyAyNDAKK19fU0NfQ09NUChfX05SX3J0X3Rnc2lncXVldWVpbmZvLCBzeXNfcnRfdGdzaWdxdWV1ZWluZm8sIFwKKwkgIGNvbXBhdF9zeXNfcnRfdGdzaWdxdWV1ZWluZm8pCisjZGVmaW5lIF9fTlJfcGVyZl9ldmVudF9vcGVuIDI0MQorX19TWVNDQUxMKF9fTlJfcGVyZl9ldmVudF9vcGVuLCBzeXNfcGVyZl9ldmVudF9vcGVuKQorI2RlZmluZSBfX05SX2FjY2VwdDQgMjQyCitfX1NZU0NBTEwoX19OUl9hY2NlcHQ0LCBzeXNfYWNjZXB0NCkKKyNkZWZpbmUgX19OUl9yZWN2bW1zZyAyNDMKK19fU0NfQ09NUChfX05SX3JlY3ZtbXNnLCBzeXNfcmVjdm1tc2csIGNvbXBhdF9zeXNfcmVjdm1tc2cpCisKKy8qCisgKiBBcmNoaXRlY3R1cmVzIG1heSBwcm92aWRlIHVwIHRvIDE2IHN5c2NhbGxzIG9mIHRoZWlyIG93bgorICogc3RhcnRpbmcgd2l0aCB0aGlzIHZhbHVlLgorICovCisjZGVmaW5lIF9fTlJfYXJjaF9zcGVjaWZpY19zeXNjYWxsIDI0NAorCisjZGVmaW5lIF9fTlJfd2FpdDQgMjYwCitfX1NDX0NPTVAoX19OUl93YWl0NCwgc3lzX3dhaXQ0LCBjb21wYXRfc3lzX3dhaXQ0KQorI2RlZmluZSBfX05SX3BybGltaXQ2NCAyNjEKK19fU1lTQ0FMTChfX05SX3BybGltaXQ2NCwgc3lzX3BybGltaXQ2NCkKKyNkZWZpbmUgX19OUl9mYW5vdGlmeV9pbml0IDI2MgorX19TWVNDQUxMKF9fTlJfZmFub3RpZnlfaW5pdCwgc3lzX2Zhbm90aWZ5X2luaXQpCisjZGVmaW5lIF9fTlJfZmFub3RpZnlfbWFyayAyNjMKK19fU1lTQ0FMTChfX05SX2Zhbm90aWZ5X21hcmssIHN5c19mYW5vdGlmeV9tYXJrKQorI2RlZmluZSBfX05SX25hbWVfdG9faGFuZGxlX2F0ICAgICAgICAgMjY0CitfX1NZU0NBTEwoX19OUl9uYW1lX3RvX2hhbmRsZV9hdCwgc3lzX25hbWVfdG9faGFuZGxlX2F0KQorI2RlZmluZSBfX05SX29wZW5fYnlfaGFuZGxlX2F0ICAgICAgICAgMjY1CitfX1NDX0NPTVAoX19OUl9vcGVuX2J5X2hhbmRsZV9hdCwgc3lzX29wZW5fYnlfaGFuZGxlX2F0LCBcCisJICBjb21wYXRfc3lzX29wZW5fYnlfaGFuZGxlX2F0KQorI2RlZmluZSBfX05SX2Nsb2NrX2FkanRpbWUgMjY2CitfX1NDX0NPTVAoX19OUl9jbG9ja19hZGp0aW1lLCBzeXNfY2xvY2tfYWRqdGltZSwgY29tcGF0X3N5c19jbG9ja19hZGp0aW1lKQorI2RlZmluZSBfX05SX3N5bmNmcyAyNjcKK19fU1lTQ0FMTChfX05SX3N5bmNmcywgc3lzX3N5bmNmcykKKyNkZWZpbmUgX19OUl9zZXRucyAyNjgKK19fU1lTQ0FMTChfX05SX3NldG5zLCBzeXNfc2V0bnMpCisjZGVmaW5lIF9fTlJfc2VuZG1tc2cgMjY5CitfX1NDX0NPTVAoX19OUl9zZW5kbW1zZywgc3lzX3NlbmRtbXNnLCBjb21wYXRfc3lzX3NlbmRtbXNnKQorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYgMjcwCitfX1NDX0NPTVAoX19OUl9wcm9jZXNzX3ZtX3JlYWR2LCBzeXNfcHJvY2Vzc192bV9yZWFkdiwgXAorICAgICAgICAgIGNvbXBhdF9zeXNfcHJvY2Vzc192bV9yZWFkdikKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3dyaXRldiAyNzEKK19fU0NfQ09NUChfX05SX3Byb2Nlc3Nfdm1fd3JpdGV2LCBzeXNfcHJvY2Vzc192bV93cml0ZXYsIFwKKyAgICAgICAgICBjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2KQorCisjdW5kZWYgX19OUl9zeXNjYWxscworI2RlZmluZSBfX05SX3N5c2NhbGxzIDI3MgorCisvKgorICogQWxsIHN5c2NhbGxzIGJlbG93IGhlcmUgc2hvdWxkIGdvIGF3YXkgcmVhbGx5LAorICogdGhlc2UgYXJlIHByb3ZpZGVkIGZvciBib3RoIHJldmlldyBhbmQgYXMgYSBwb3J0aW5nCisgKiBoZWxwIGZvciB0aGUgQyBsaWJyYXJ5IHZlcnNpb24uCisqCisgKiBMYXN0IGNoYW5jZTogYXJlIGFueSBvZiB0aGVzZSBpbXBvcnRhbnQgZW5vdWdoIHRvCisgKiBlbmFibGUgYnkgZGVmYXVsdD8KKyAqLworI2lmZGVmIF9fQVJDSF9XQU5UX1NZU0NBTExfTk9fQVQKKyNkZWZpbmUgX19OUl9vcGVuIDEwMjQKK19fU1lTQ0FMTChfX05SX29wZW4sIHN5c19vcGVuKQorI2RlZmluZSBfX05SX2xpbmsgMTAyNQorX19TWVNDQUxMKF9fTlJfbGluaywgc3lzX2xpbmspCisjZGVmaW5lIF9fTlJfdW5saW5rIDEwMjYKK19fU1lTQ0FMTChfX05SX3VubGluaywgc3lzX3VubGluaykKKyNkZWZpbmUgX19OUl9ta25vZCAxMDI3CitfX1NZU0NBTEwoX19OUl9ta25vZCwgc3lzX21rbm9kKQorI2RlZmluZSBfX05SX2NobW9kIDEwMjgKK19fU1lTQ0FMTChfX05SX2NobW9kLCBzeXNfY2htb2QpCisjZGVmaW5lIF9fTlJfY2hvd24gMTAyOQorX19TWVNDQUxMKF9fTlJfY2hvd24sIHN5c19jaG93bikKKyNkZWZpbmUgX19OUl9ta2RpciAxMDMwCitfX1NZU0NBTEwoX19OUl9ta2Rpciwgc3lzX21rZGlyKQorI2RlZmluZSBfX05SX3JtZGlyIDEwMzEKK19fU1lTQ0FMTChfX05SX3JtZGlyLCBzeXNfcm1kaXIpCisjZGVmaW5lIF9fTlJfbGNob3duIDEwMzIKK19fU1lTQ0FMTChfX05SX2xjaG93biwgc3lzX2xjaG93bikKKyNkZWZpbmUgX19OUl9hY2Nlc3MgMTAzMworX19TWVNDQUxMKF9fTlJfYWNjZXNzLCBzeXNfYWNjZXNzKQorI2RlZmluZSBfX05SX3JlbmFtZSAxMDM0CitfX1NZU0NBTEwoX19OUl9yZW5hbWUsIHN5c19yZW5hbWUpCisjZGVmaW5lIF9fTlJfcmVhZGxpbmsgMTAzNQorX19TWVNDQUxMKF9fTlJfcmVhZGxpbmssIHN5c19yZWFkbGluaykKKyNkZWZpbmUgX19OUl9zeW1saW5rIDEwMzYKK19fU1lTQ0FMTChfX05SX3N5bWxpbmssIHN5c19zeW1saW5rKQorI2RlZmluZSBfX05SX3V0aW1lcyAxMDM3CitfX1NZU0NBTEwoX19OUl91dGltZXMsIHN5c191dGltZXMpCisjZGVmaW5lIF9fTlIzMjY0X3N0YXQgMTAzOAorX19TQ18zMjY0KF9fTlIzMjY0X3N0YXQsIHN5c19zdGF0NjQsIHN5c19uZXdzdGF0KQorI2RlZmluZSBfX05SMzI2NF9sc3RhdCAxMDM5CitfX1NDXzMyNjQoX19OUjMyNjRfbHN0YXQsIHN5c19sc3RhdDY0LCBzeXNfbmV3bHN0YXQpCisKKyN1bmRlZiBfX05SX3N5c2NhbGxzCisjZGVmaW5lIF9fTlJfc3lzY2FsbHMgKF9fTlIzMjY0X2xzdGF0KzEpCisjZW5kaWYgLyogX19BUkNIX1dBTlRfU1lTQ0FMTF9OT19BVCAqLworCisjaWZkZWYgX19BUkNIX1dBTlRfU1lTQ0FMTF9OT19GTEFHUworI2RlZmluZSBfX05SX3BpcGUgMTA0MAorX19TWVNDQUxMKF9fTlJfcGlwZSwgc3lzX3BpcGUpCisjZGVmaW5lIF9fTlJfZHVwMiAxMDQxCitfX1NZU0NBTEwoX19OUl9kdXAyLCBzeXNfZHVwMikKKyNkZWZpbmUgX19OUl9lcG9sbF9jcmVhdGUgMTA0MgorX19TWVNDQUxMKF9fTlJfZXBvbGxfY3JlYXRlLCBzeXNfZXBvbGxfY3JlYXRlKQorI2RlZmluZSBfX05SX2lub3RpZnlfaW5pdCAxMDQzCitfX1NZU0NBTEwoX19OUl9pbm90aWZ5X2luaXQsIHN5c19pbm90aWZ5X2luaXQpCisjZGVmaW5lIF9fTlJfZXZlbnRmZCAxMDQ0CitfX1NZU0NBTEwoX19OUl9ldmVudGZkLCBzeXNfZXZlbnRmZCkKKyNkZWZpbmUgX19OUl9zaWduYWxmZCAxMDQ1CitfX1NZU0NBTEwoX19OUl9zaWduYWxmZCwgc3lzX3NpZ25hbGZkKQorCisjdW5kZWYgX19OUl9zeXNjYWxscworI2RlZmluZSBfX05SX3N5c2NhbGxzIChfX05SX3NpZ25hbGZkKzEpCisjZW5kaWYgLyogX19BUkNIX1dBTlRfU1lTQ0FMTF9OT19GTEFHUyAqLworCisjaWYgKF9fQklUU19QRVJfTE9ORyA9PSAzMiB8fCBkZWZpbmVkKF9fU1lTQ0FMTF9DT01QQVQpKSAmJiBcCisgICAgIGRlZmluZWQoX19BUkNIX1dBTlRfU1lTQ0FMTF9PRkZfVCkKKyNkZWZpbmUgX19OUl9zZW5kZmlsZSAxMDQ2CitfX1NZU0NBTEwoX19OUl9zZW5kZmlsZSwgc3lzX3NlbmRmaWxlKQorI2RlZmluZSBfX05SX2Z0cnVuY2F0ZSAxMDQ3CitfX1NZU0NBTEwoX19OUl9mdHJ1bmNhdGUsIHN5c19mdHJ1bmNhdGUpCisjZGVmaW5lIF9fTlJfdHJ1bmNhdGUgMTA0OAorX19TWVNDQUxMKF9fTlJfdHJ1bmNhdGUsIHN5c190cnVuY2F0ZSkKKyNkZWZpbmUgX19OUl9zdGF0IDEwNDkKK19fU1lTQ0FMTChfX05SX3N0YXQsIHN5c19uZXdzdGF0KQorI2RlZmluZSBfX05SX2xzdGF0IDEwNTAKK19fU1lTQ0FMTChfX05SX2xzdGF0LCBzeXNfbmV3bHN0YXQpCisjZGVmaW5lIF9fTlJfZnN0YXQgMTA1MQorX19TWVNDQUxMKF9fTlJfZnN0YXQsIHN5c19uZXdmc3RhdCkKKyNkZWZpbmUgX19OUl9mY250bCAxMDUyCitfX1NZU0NBTEwoX19OUl9mY250bCwgc3lzX2ZjbnRsKQorI2RlZmluZSBfX05SX2ZhZHZpc2U2NCAxMDUzCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19GQURWSVNFNjQKK19fU1lTQ0FMTChfX05SX2ZhZHZpc2U2NCwgc3lzX2ZhZHZpc2U2NCkKKyNkZWZpbmUgX19OUl9uZXdmc3RhdGF0IDEwNTQKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX05FV0ZTVEFUQVQKK19fU1lTQ0FMTChfX05SX25ld2ZzdGF0YXQsIHN5c19uZXdmc3RhdGF0KQorI2RlZmluZSBfX05SX2ZzdGF0ZnMgMTA1NQorX19TWVNDQUxMKF9fTlJfZnN0YXRmcywgc3lzX2ZzdGF0ZnMpCisjZGVmaW5lIF9fTlJfc3RhdGZzIDEwNTYKK19fU1lTQ0FMTChfX05SX3N0YXRmcywgc3lzX3N0YXRmcykKKyNkZWZpbmUgX19OUl9sc2VlayAxMDU3CitfX1NZU0NBTEwoX19OUl9sc2Vlaywgc3lzX2xzZWVrKQorI2RlZmluZSBfX05SX21tYXAgMTA1OAorX19TWVNDQUxMKF9fTlJfbW1hcCwgc3lzX21tYXApCisKKyN1bmRlZiBfX05SX3N5c2NhbGxzCisjZGVmaW5lIF9fTlJfc3lzY2FsbHMgKF9fTlJfbW1hcCsxKQorI2VuZGlmIC8qIDMyIGJpdCBvZmZfdCBzeXNjYWxscyAqLworCisjaWZkZWYgX19BUkNIX1dBTlRfU1lTQ0FMTF9ERVBSRUNBVEVECisjZGVmaW5lIF9fTlJfYWxhcm0gMTA1OQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfQUxBUk0KK19fU1lTQ0FMTChfX05SX2FsYXJtLCBzeXNfYWxhcm0pCisjZGVmaW5lIF9fTlJfZ2V0cGdycCAxMDYwCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19HRVRQR1JQCitfX1NZU0NBTEwoX19OUl9nZXRwZ3JwLCBzeXNfZ2V0cGdycCkKKyNkZWZpbmUgX19OUl9wYXVzZSAxMDYxCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19QQVVTRQorX19TWVNDQUxMKF9fTlJfcGF1c2UsIHN5c19wYXVzZSkKKyNkZWZpbmUgX19OUl90aW1lIDEwNjIKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1RJTUUKKyNkZWZpbmUgX19BUkNIX1dBTlRfQ09NUEFUX1NZU19USU1FCitfX1NZU0NBTEwoX19OUl90aW1lLCBzeXNfdGltZSkKKyNkZWZpbmUgX19OUl91dGltZSAxMDYzCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19VVElNRQorX19TWVNDQUxMKF9fTlJfdXRpbWUsIHN5c191dGltZSkKKworI2RlZmluZSBfX05SX2NyZWF0IDEwNjQKK19fU1lTQ0FMTChfX05SX2NyZWF0LCBzeXNfY3JlYXQpCisjZGVmaW5lIF9fTlJfZ2V0ZGVudHMgMTA2NQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUREVOVFMKK19fU1lTQ0FMTChfX05SX2dldGRlbnRzLCBzeXNfZ2V0ZGVudHMpCisjZGVmaW5lIF9fTlJfZnV0aW1lc2F0IDEwNjYKK19fU1lTQ0FMTChfX05SX2Z1dGltZXNhdCwgc3lzX2Z1dGltZXNhdCkKKyNkZWZpbmUgX19OUl9zZWxlY3QgMTA2NworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0VMRUNUCitfX1NZU0NBTEwoX19OUl9zZWxlY3QsIHN5c19zZWxlY3QpCisjZGVmaW5lIF9fTlJfcG9sbCAxMDY4CitfX1NZU0NBTEwoX19OUl9wb2xsLCBzeXNfcG9sbCkKKyNkZWZpbmUgX19OUl9lcG9sbF93YWl0IDEwNjkKK19fU1lTQ0FMTChfX05SX2Vwb2xsX3dhaXQsIHN5c19lcG9sbF93YWl0KQorI2RlZmluZSBfX05SX3VzdGF0IDEwNzAKK19fU1lTQ0FMTChfX05SX3VzdGF0LCBzeXNfdXN0YXQpCisjZGVmaW5lIF9fTlJfdmZvcmsgMTA3MQorX19TWVNDQUxMKF9fTlJfdmZvcmssIHN5c192Zm9yaykKKyNkZWZpbmUgX19OUl9vbGR3YWl0NCAxMDcyCitfX1NZU0NBTEwoX19OUl9vbGR3YWl0NCwgc3lzX3dhaXQ0KQorI2RlZmluZSBfX05SX3JlY3YgMTA3MworX19TWVNDQUxMKF9fTlJfcmVjdiwgc3lzX3JlY3YpCisjZGVmaW5lIF9fTlJfc2VuZCAxMDc0CitfX1NZU0NBTEwoX19OUl9zZW5kLCBzeXNfc2VuZCkKKyNkZWZpbmUgX19OUl9iZGZsdXNoIDEwNzUKK19fU1lTQ0FMTChfX05SX2JkZmx1c2gsIHN5c19iZGZsdXNoKQorI2RlZmluZSBfX05SX3Vtb3VudCAxMDc2CitfX1NZU0NBTEwoX19OUl91bW91bnQsIHN5c19vbGR1bW91bnQpCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19PTERVTU9VTlQKKyNkZWZpbmUgX19OUl91c2VsaWIgMTA3NworX19TWVNDQUxMKF9fTlJfdXNlbGliLCBzeXNfdXNlbGliKQorI2RlZmluZSBfX05SX19zeXNjdGwgMTA3OAorX19TWVNDQUxMKF9fTlJfX3N5c2N0bCwgc3lzX3N5c2N0bCkKKworI2RlZmluZSBfX05SX2ZvcmsgMTA3OQorI2lmZGVmIENPTkZJR19NTVUKK19fU1lTQ0FMTChfX05SX2ZvcmssIHN5c19mb3JrKQorI2Vsc2UKK19fU1lTQ0FMTChfX05SX2ZvcmssIHN5c19uaV9zeXNjYWxsKQorI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KKworI3VuZGVmIF9fTlJfc3lzY2FsbHMKKyNkZWZpbmUgX19OUl9zeXNjYWxscyAoX19OUl9mb3JrKzEpCisKKyNlbmRpZiAvKiBfX0FSQ0hfV0FOVF9TWVNDQUxMX0RFUFJFQ0FURUQgKi8KKworLyoKKyAqIDMyIGJpdCBzeXN0ZW1zIHRyYWRpdGlvbmFsbHkgdXNlZCBkaWZmZXJlbnQKKyAqIHN5c2NhbGxzIGZvciBvZmZfdCBhbmQgbG9mZl90IGFyZ3VtZW50cywgd2hpbGUKKyAqIDY0IGJpdCBzeXN0ZW1zIG9ubHkgbmVlZCB0aGUgb2ZmX3QgdmVyc2lvbi4KKyAqIEZvciBuZXcgMzIgYml0IHBsYXRmb3JtcywgdGhlcmUgaXMgbm8gbmVlZCB0bworICogaW1wbGVtZW50IHRoZSBvbGQgMzIgYml0IG9mZl90IHN5c2NhbGxzLCBzbworICogdGhleSB0YWtlIGRpZmZlcmVudCBuYW1lcy4KKyAqIEhlcmUgd2UgbWFwIHRoZSBudW1iZXJzIHNvIHRoYXQgYm90aCB2ZXJzaW9ucworICogdXNlIHRoZSBzYW1lIHN5c2NhbGwgdGFibGUgbGF5b3V0LgorICovCisjaWYgX19CSVRTX1BFUl9MT05HID09IDY0ICYmICFkZWZpbmVkKF9fU1lTQ0FMTF9DT01QQVQpCisjZGVmaW5lIF9fTlJfZmNudGwgX19OUjMyNjRfZmNudGwKKyNkZWZpbmUgX19OUl9zdGF0ZnMgX19OUjMyNjRfc3RhdGZzCisjZGVmaW5lIF9fTlJfZnN0YXRmcyBfX05SMzI2NF9mc3RhdGZzCisjZGVmaW5lIF9fTlJfdHJ1bmNhdGUgX19OUjMyNjRfdHJ1bmNhdGUKKyNkZWZpbmUgX19OUl9mdHJ1bmNhdGUgX19OUjMyNjRfZnRydW5jYXRlCisjZGVmaW5lIF9fTlJfbHNlZWsgX19OUjMyNjRfbHNlZWsKKyNkZWZpbmUgX19OUl9zZW5kZmlsZSBfX05SMzI2NF9zZW5kZmlsZQorI2RlZmluZSBfX05SX25ld2ZzdGF0YXQgX19OUjMyNjRfZnN0YXRhdAorI2RlZmluZSBfX05SX2ZzdGF0IF9fTlIzMjY0X2ZzdGF0CisjZGVmaW5lIF9fTlJfbW1hcCBfX05SMzI2NF9tbWFwCisjZGVmaW5lIF9fTlJfZmFkdmlzZTY0IF9fTlIzMjY0X2ZhZHZpc2U2NAorI2lmZGVmIF9fTlIzMjY0X3N0YXQKKyNkZWZpbmUgX19OUl9zdGF0IF9fTlIzMjY0X3N0YXQKKyNkZWZpbmUgX19OUl9sc3RhdCBfX05SMzI2NF9sc3RhdAorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfX05SX2ZjbnRsNjQgX19OUjMyNjRfZmNudGwKKyNkZWZpbmUgX19OUl9zdGF0ZnM2NCBfX05SMzI2NF9zdGF0ZnMKKyNkZWZpbmUgX19OUl9mc3RhdGZzNjQgX19OUjMyNjRfZnN0YXRmcworI2RlZmluZSBfX05SX3RydW5jYXRlNjQgX19OUjMyNjRfdHJ1bmNhdGUKKyNkZWZpbmUgX19OUl9mdHJ1bmNhdGU2NCBfX05SMzI2NF9mdHJ1bmNhdGUKKyNkZWZpbmUgX19OUl9sbHNlZWsgX19OUjMyNjRfbHNlZWsKKyNkZWZpbmUgX19OUl9zZW5kZmlsZTY0IF9fTlIzMjY0X3NlbmRmaWxlCisjZGVmaW5lIF9fTlJfZnN0YXRhdDY0IF9fTlIzMjY0X2ZzdGF0YXQKKyNkZWZpbmUgX19OUl9mc3RhdDY0IF9fTlIzMjY0X2ZzdGF0CisjZGVmaW5lIF9fTlJfbW1hcDIgX19OUjMyNjRfbW1hcAorI2RlZmluZSBfX05SX2ZhZHZpc2U2NF82NCBfX05SMzI2NF9mYWR2aXNlNjQKKyNpZmRlZiBfX05SMzI2NF9zdGF0CisjZGVmaW5lIF9fTlJfc3RhdDY0IF9fTlIzMjY0X3N0YXQKKyNkZWZpbmUgX19OUl9sc3RhdDY0IF9fTlIzMjY0X2xzdGF0CisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9HRU5FUklDX1VOSVNURF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Fzc2VydC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc3NlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTg5NzEzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hc3NlcnQuaApAQCAtMCwwICsxLDExOCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDE5OTIsMTk5NC0yMDAxLDIwMDMsMjAwNCwyMDA3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTkgU3RhbmRhcmQ6IDcuMiBEaWFnbm9zdGljcwk8YXNzZXJ0Lmg+CisgKi8KKworI2lmZGVmCV9BU1NFUlRfSAorCisjIHVuZGVmCV9BU1NFUlRfSAorIyB1bmRlZglhc3NlcnQKKyMgdW5kZWYgX19BU1NFUlRfVk9JRF9DQVNUCisKKyMgaWZkZWYJX19VU0VfR05VCisjICB1bmRlZiBhc3NlcnRfcGVycm9yCisjIGVuZGlmCisKKyNlbmRpZiAvKiBhc3NlcnQuaAkqLworCisjZGVmaW5lCV9BU1NFUlRfSAkxCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2lmIGRlZmluZWQgX19jcGx1c3BsdXMgJiYgX19HTlVDX1BSRVJFUSAoMiw5NSkKKyMgZGVmaW5lIF9fQVNTRVJUX1ZPSURfQ0FTVCBzdGF0aWNfY2FzdDx2b2lkPgorI2Vsc2UKKyMgZGVmaW5lIF9fQVNTRVJUX1ZPSURfQ0FTVCAodm9pZCkKKyNlbmRpZgorCisvKiB2b2lkIGFzc2VydCAoaW50IGV4cHJlc3Npb24pOworCisgICBJZiBOREVCVUcgaXMgZGVmaW5lZCwgZG8gbm90aGluZy4KKyAgIElmIG5vdCwgYW5kIEVYUFJFU1NJT04gaXMgemVybywgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgYWJvcnQuICAqLworCisjaWZkZWYJTkRFQlVHCisKKyMgZGVmaW5lIGFzc2VydChleHByKQkJKF9fQVNTRVJUX1ZPSURfQ0FTVCAoMCkpCisKKy8qIHZvaWQgYXNzZXJ0X3BlcnJvciAoaW50IGVycm51bSk7CisKKyAgIElmIE5ERUJVRyBpcyBkZWZpbmVkLCBkbyBub3RoaW5nLiAgSWYgbm90LCBhbmQgRVJSTlVNIGlzIG5vdCB6ZXJvLCBwcmludCBhbgorICAgZXJyb3IgbWVzc2FnZSB3aXRoIHRoZSBlcnJvciB0ZXh0IGZvciBFUlJOVU0gYW5kIGFib3J0LgorICAgKFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uLikgKi8KKworIyBpZmRlZglfX1VTRV9HTlUKKyMgIGRlZmluZSBhc3NlcnRfcGVycm9yKGVycm51bSkJKF9fQVNTRVJUX1ZPSURfQ0FTVCAoMCkpCisjIGVuZGlmCisKKyNlbHNlIC8qIE5vdCBOREVCVUcuICAqLworCisjaWZuZGVmIF9BU1NFUlRfSF9ERUNMUworI2RlZmluZSBfQVNTRVJUX0hfREVDTFMKK19fQkVHSU5fREVDTFMKKworLyogVGhpcyBwcmludHMgYW4gIkFzc2VydGlvbiBmYWlsZWQiIG1lc3NhZ2UgYW5kIGFib3J0cy4gICovCitleHRlcm4gdm9pZCBfX2Fzc2VydF9mYWlsIChfX2NvbnN0IGNoYXIgKl9fYXNzZXJ0aW9uLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwKKwkJCSAgIHVuc2lnbmVkIGludCBfX2xpbmUsIF9fY29uc3QgY2hhciAqX19mdW5jdGlvbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisKKy8qIExpa2V3aXNlLCBidXQgcHJpbnRzIHRoZSBlcnJvciB0ZXh0IGZvciBFUlJOVU0uICAqLworZXh0ZXJuIHZvaWQgX19hc3NlcnRfcGVycm9yX2ZhaWwgKGludCBfX2Vycm51bSwgX19jb25zdCBjaGFyICpfX2ZpbGUsCisJCQkJICB1bnNpZ25lZCBpbnQgX19saW5lLAorCQkJCSAgX19jb25zdCBjaGFyICpfX2Z1bmN0aW9uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworCisvKiBUaGUgZm9sbG93aW5nIGlzIG5vdCBhdCBhbGwgdXNlZCBoZXJlIGJ1dCBuZWVkZWQgZm9yIHN0YW5kYXJkCisgICBjb21wbGlhbmNlLiAgKi8KK2V4dGVybiB2b2lkIF9fYXNzZXJ0IChjb25zdCBjaGFyICpfX2Fzc2VydGlvbiwgY29uc3QgY2hhciAqX19maWxlLCBpbnQgX19saW5lKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworCitfX0VORF9ERUNMUworI2VuZGlmIC8qIE5vdCBfQVNTRVJUX0hfREVDTFMgKi8KKworIyBkZWZpbmUgYXNzZXJ0KGV4cHIpCQkJCQkJCVwKKyAgKChleHByKQkJCQkJCQkJXAorICAgPyBfX0FTU0VSVF9WT0lEX0NBU1QgKDApCQkJCQkJXAorICAgOiBfX2Fzc2VydF9mYWlsIChfX1NUUklORyhleHByKSwgX19GSUxFX18sIF9fTElORV9fLCBfX0FTU0VSVF9GVU5DVElPTikpCisKKyMgaWZkZWYJX19VU0VfR05VCisjICBkZWZpbmUgYXNzZXJ0X3BlcnJvcihlcnJudW0pCQkJCQkJXAorICAoIShlcnJudW0pCQkJCQkJCQlcCisgICA/IF9fQVNTRVJUX1ZPSURfQ0FTVCAoMCkJCQkJCQlcCisgICA6IF9fYXNzZXJ0X3BlcnJvcl9mYWlsICgoZXJybnVtKSwgX19GSUxFX18sIF9fTElORV9fLCBfX0FTU0VSVF9GVU5DVElPTikpCisjIGVuZGlmCisKKy8qIFZlcnNpb24gMi40IGFuZCBsYXRlciBvZiBHQ0MgZGVmaW5lIGEgbWFnaWNhbCB2YXJpYWJsZSBgX19QUkVUVFlfRlVOQ1RJT05fXycKKyAgIHdoaWNoIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBjdXJyZW50bHkgYmVpbmcgZGVmaW5lZC4KKyAgIFRoaXMgaXMgYnJva2VuIGluIEcrKyBiZWZvcmUgdmVyc2lvbiAyLjYuCisgICBDOXggaGFzIGEgc2ltaWxhciB2YXJpYWJsZSBjYWxsZWQgX19mdW5jX18sIGJ1dCBwcmVmZXIgdGhlIEdDQyBvbmUgc2luY2UKKyAgIGl0IGRlbWFuZ2xlcyBDKysgZnVuY3Rpb24gbmFtZXMuICAqLworIyBpZiBkZWZpbmVkIF9fY3BsdXNwbHVzID8gX19HTlVDX1BSRVJFUSAoMiwgNikgOiBfX0dOVUNfUFJFUkVRICgyLCA0KQorIyAgIGRlZmluZSBfX0FTU0VSVF9GVU5DVElPTglfX1BSRVRUWV9GVU5DVElPTl9fCisjIGVsc2UKKyMgIGlmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgICBkZWZpbmUgX19BU1NFUlRfRlVOQ1RJT04JX19mdW5jX18KKyMgIGVsc2UKKyMgICBkZWZpbmUgX19BU1NFUlRfRlVOQ1RJT04JKChfX2NvbnN0IGNoYXIgKikgMCkKKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbmRpZiAvKiBOREVCVUcuICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hdHRyL2F0dHJpYnV0ZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXR0ci9hdHRyaWJ1dGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwMjAyNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXR0ci9hdHRyaWJ1dGVzLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwyMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaWZuZGVmIF9fQVRUUklCVVRFU19IX18KKyNkZWZpbmUJX19BVFRSSUJVVEVTX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKglBbiBhbG1vc3QtSVJJWC1jb21wYXRpYmxlIGV4dGVuZGVkIGF0dHJpYnV0ZXMgQVBJCisgKgkodGhlIElSSVggYXR0cmlidXRlICJsaXN0IiBvcGVyYXRpb24gaXMgbWlzc2luZywgYWRkZWQgQVRUUl9TRUNVUkUpLgorICovCisKKy8qCisgKiBUaGUgbWF4aW11bSBzaXplIChpbnRvIHRoZSBrZXJuZWwgb3IgcmV0dXJuZWQgZnJvbSB0aGUga2VybmVsKSBvZiBhbgorICogYXR0cmlidXRlIHZhbHVlIG9yIHRoZSBidWZmZXIgdXNlZCBmb3IgYW4gYXR0cl9saXN0KCkgY2FsbC4gIExhcmdlcgorICogc2l6ZXMgd2lsbCByZXN1bHQgaW4gYW4gRTJCSUcgcmV0dXJuIGNvZGUuCisgKi8KKyNkZWZpbmUgQVRUUl9NQVhfVkFMVUVMRU4JKDY0KjEwMjQpCS8qIG1heCBsZW5ndGggb2YgYSB2YWx1ZSAqLworCisKKy8qCisgKiBGbGFncyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBzaW1wbGUgYXR0cmlidXRlIGNhbGxzLgorICogQWxsIGRlc2lyZWQgZmxhZ3Mgc2hvdWxkIGJlIGJpdC13aXNlIE9SJ2VkIHRvZ2V0aGVyLgorICovCisjZGVmaW5lIEFUVFJfRE9OVEZPTExPVwkweDAwMDEJLyogZG8gbm90IGZvbGxvdyBzeW1saW5rcyBmb3IgYSBwYXRobmFtZSAqLworI2RlZmluZSBBVFRSX1JPT1QJMHgwMDAyCS8qIHVzZSByb290IG5hbWVzcGFjZSBhdHRyaWJ1dGVzIGluIG9wICovCisjZGVmaW5lIEFUVFJfVFJVU1QJMHgwMDA0CS8qIHRlbGwgc2VydmVyIHdlIGNhbiBiZSB0cnVzdGVkIHRvIHByb3Blcmx5CisJCQkJICAgaGFuZGxlIGV4dGVuZGVkIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgQVRUUl9TRUNVUkUJMHgwMDA4CS8qIHVzZSBzZWN1cml0eSBuYW1lc3BhY2UgYXR0cmlidXRlcyBpbiBvcCAqLworCisvKgorICogQWRkaXRpb25hbCBmbGFncyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlIHNldCgpIGF0dHJpYnV0ZSBjYWxsLgorICogQWxsIGRlc2lyZWQgZmxhZ3MgKGZyb20gYm90aCBsaXN0cykgc2hvdWxkIGJlIGJpdC13aXNlIE9SJ2VkIHRvZ2V0aGVyLgorICovCisjZGVmaW5lIEFUVFJfQ1JFQVRFCTB4MDAxMAkvKiBwdXJlIGNyZWF0ZTogZmFpbCBpZiBhdHRyIGFscmVhZHkgZXhpc3RzICovCisjZGVmaW5lIEFUVFJfUkVQTEFDRQkweDAwMjAJLyogcHVyZSBzZXQ6IGZhaWwgaWYgYXR0ciBkb2VzIG5vdCBleGlzdCAqLworCisvKgorICogRGVmaW5lIGhvdyBsaXN0cyBvZiBhdHRyaWJ1dGUgbmFtZXMgYXJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGZyb20KKyAqIHRoZSBhdHRyX2xpc3QoKSBjYWxsLiAgQSBsYXJnZSwgMzJiaXQgYWxpZ25lZCwgYnVmZmVyIGlzIHBhc3NlZCBpbgorICogYWxvbmcgd2l0aCBpdHMgc2l6ZS4gIFdlIHB1dCBhbiBhcnJheSBvZiBvZmZzZXRzIGF0IHRoZSB0b3AgdGhhdCBlYWNoCisgKiByZWZlcmVuY2UgYW4gYXR0cmxpc3RfZW50X3QgYW5kIHBhY2sgdGhlIGF0dHJsaXN0X2VudF90J3MgYXQgdGhlIGJvdHRvbS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXR0cmxpc3QgeworCWludDMyX3QJCWFsX2NvdW50OwkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBhdHRybGlzdCAqLworCWludDMyX3QJCWFsX21vcmU7CS8qIFQvRjogbW9yZSBhdHRycyAoZG8gY2FsbCBhZ2FpbikgKi8KKwlpbnQzMl90CQlhbF9vZmZzZXRbMV07CS8qIGJ5dGUgb2Zmc2V0cyBvZiBhdHRycyBbdmFyLXNpemVkXSAqLworfSBhdHRybGlzdF90OworCisvKgorICogU2hvdyB0aGUgaW50ZXJlc3RpbmcgaW5mbyBhYm91dCBvbmUgYXR0cmlidXRlLiAgVGhpcyBpcyB3aGF0IHRoZQorICogYWxfb2Zmc2V0W2ldIGVudHJ5IHBvaW50cyB0by4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXR0cmxpc3RfZW50IHsJLyogZGF0YSBmcm9tIGF0dHJfbGlzdCgpICovCisJdV9pbnQzMl90CWFfdmFsdWVsZW47CS8qIG51bWJlciBieXRlcyBpbiB2YWx1ZSBvZiBhdHRyICovCisJY2hhcgkJYV9uYW1lWzFdOwkvKiBhdHRyIG5hbWUgKE5VTEwgdGVybWluYXRlZCkgKi8KK30gYXR0cmxpc3RfZW50X3Q7CisKKy8qCisgKiBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIChjaGFyKikgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGF0dHJfbGlzdCgpIHJlc3VsdCwKKyAqIGFuZCBhbiBpbmRleCwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgaW5kaWNhdGVkIGF0dHJpYnV0ZSBpbiB0aGUgYnVmZmVyLgorICovCisjZGVmaW5lCUFUVFJfRU5UUlkoYnVmZmVyLCBpbmRleCkJCVwKKwkoKGF0dHJsaXN0X2VudF90ICopCQkJXAorCSAmKChjaGFyICopYnVmZmVyKVsgKChhdHRybGlzdF90ICopKGJ1ZmZlcikpLT5hbF9vZmZzZXRbaW5kZXhdIF0pCisKKy8qCisgKiBJbXBsZW1lbnQgYSAiY3Vyc29yIiBmb3IgdXNlIGluIHN1Y2Nlc3NpdmUgYXR0cl9saXN0KCkgY2FsbHMuCisgKiBJdCBwcm92aWRlcyBhIHdheSB0byBmaW5kIHRoZSBsYXN0IGF0dHJpYnV0ZSB0aGF0IHdhcyByZXR1cm5lZCBpbiB0aGUKKyAqIGxhc3QgYXR0cl9saXN0KCkgY2FsbCBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIG5leHQgb25lIHdpdGhvdXQgbWlzc2luZworICogYW55LiAgVGhpcyBzaG91bGQgYmUgYnplcm8oKWVkIGJlZm9yZSB1c2UgYW5kIHdoZW5ldmVyIGl0IGlzIGRlc2lyZWQgdG8KKyAqIHN0YXJ0IG92ZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhdHRyaWJ1dGUgbGlzdC4gIFRoZSBvbmx5IHZhbGlkCisgKiBvcGVyYXRpb24gb24gYSBjdXJzb3IgaXMgdG8gYnplcm8oKSBpdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXR0cmxpc3RfY3Vyc29yIHsKKwl1X2ludDMyX3QJb3BhcXVlWzRdOwkvKiBhbiBvcGFxdWUgY29va2llICovCit9IGF0dHJsaXN0X2N1cnNvcl90OworCisvKgorICogTXVsdGktYXR0cmlidXRlIG9wZXJhdGlvbiB2ZWN0b3IuCisgKi8KK3R5cGVkZWYgc3RydWN0IGF0dHJfbXVsdGlvcCB7CisJaW50MzJfdAlhbV9vcGNvZGU7CS8qIG9wZXJhdGlvbiB0byBwZXJmb3JtIChBVFRSX09QX0dFVCwgZXRjLikgKi8KKwlpbnQzMl90CWFtX2Vycm9yOwkvKiBbb3V0IGFyZ10gcmVzdWx0IG9mIHRoaXMgc3ViLW9wIChhbiBlcnJubykgKi8KKwljaGFyCSphbV9hdHRybmFtZTsJLyogYXR0cmlidXRlIG5hbWUgdG8gd29yayB3aXRoICovCisJY2hhcgkqYW1fYXR0cnZhbHVlOwkvKiBbaW4vb3V0IGFyZ10gYXR0cmlidXRlIHZhbHVlIChyYXcgYnl0ZXMpICovCisJaW50MzJfdAlhbV9sZW5ndGg7CS8qIFtpbi9vdXQgYXJnXSBsZW5ndGggb2YgdmFsdWUgKi8KKwlpbnQzMl90CWFtX2ZsYWdzOwkvKiBmbGFncyAoYml0LXdpc2UgT1Igb2YgI2RlZmluZXMgYWJvdmUpICovCit9IGF0dHJfbXVsdGlvcF90OworI2RlZmluZQlBVFRSX01BWF9NVUxUSU9QUwkxMjgJLyogbWF4IG51bWJlciBvcHMgaW4gYW4gb3BsaXN0IGFycmF5ICovCisKKy8qCisgKiBWYWxpZCB2YWx1ZXMgb2YgYW1fb3Bjb2RlLgorICovCisjZGVmaW5lIEFUVFJfT1BfR0VUCTEJLyogcmV0dXJuIHRoZSBpbmRpY2F0ZWQgYXR0cidzIHZhbHVlICovCisjZGVmaW5lIEFUVFJfT1BfU0VUCTIJLyogc2V0L2NyZWF0ZSB0aGUgaW5kaWNhdGVkIGF0dHIvdmFsdWUgcGFpciAqLworI2RlZmluZSBBVFRSX09QX1JFTU9WRQkzCS8qIHJlbW92ZSB0aGUgaW5kaWNhdGVkIGF0dHIgKi8KKworLyoKKyAqIEdldCB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlLgorICogVmFsdWVsZW5ndGggbXVzdCBiZSBzZXQgdG8gdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgdmFsdWUgYnVmZmVyLCBpdCB3aWxsCisgKiBiZSBzZXQgdG8gdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiB0aGUgdmFsdWUgYnVmZmVyIHVwb24gcmV0dXJuLgorICogVGhlIHJldHVybiB2YWx1ZSBpcyAtMSBvbiBlcnJvciAody9lcnJubyBzZXQgYXBwcm9wcmlhdGVseSksIDAgb24gc3VjY2Vzcy4KKyAqLworZXh0ZXJuIGludCBhdHRyX2dldCAoY29uc3QgY2hhciAqX19wYXRoLCBjb25zdCBjaGFyICpfX2F0dHJuYW1lLAorCQkJY2hhciAqX19hdHRydmFsdWUsIGludCAqX192YWx1ZWxlbmd0aCwgaW50IF9fZmxhZ3MpOworZXh0ZXJuIGludCBhdHRyX2dldGYgKGludCBfX2ZkLCBjb25zdCBjaGFyICpfX2F0dHJuYW1lLCBjaGFyICpfX2F0dHJ2YWx1ZSwKKwkJCWludCAqX192YWx1ZWxlbmd0aCwgaW50IF9fZmxhZ3MpOworCisvKgorICogU2V0IHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUsIGNyZWF0aW5nIHRoZSBhdHRyaWJ1dGUgaWYgbmVjZXNzYXJ5LgorICogVGhlIHJldHVybiB2YWx1ZSBpcyAtMSBvbiBlcnJvciAody9lcnJubyBzZXQgYXBwcm9wcmlhdGVseSksIDAgb24gc3VjY2Vzcy4KKyAqLworZXh0ZXJuIGludCBhdHRyX3NldCAoY29uc3QgY2hhciAqX19wYXRoLCBjb25zdCBjaGFyICpfX2F0dHJuYW1lLAorCQkJY29uc3QgY2hhciAqX19hdHRydmFsdWUsIGNvbnN0IGludCBfX3ZhbHVlbGVuZ3RoLAorCQkJaW50IF9fZmxhZ3MpOworZXh0ZXJuIGludCBhdHRyX3NldGYgKGludCBfX2ZkLCBjb25zdCBjaGFyICpfX2F0dHJuYW1lLAorCQkJY29uc3QgY2hhciAqX19hdHRydmFsdWUsIGNvbnN0IGludCBfX3ZhbHVlbGVuZ3RoLAorCQkJaW50IF9fZmxhZ3MpOworCisvKgorICogUmVtb3ZlIGFuIGF0dHJpYnV0ZS4KKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgLTEgb24gZXJyb3IgKHcvZXJybm8gc2V0IGFwcHJvcHJpYXRlbHkpLCAwIG9uIHN1Y2Nlc3MuCisgKi8KK2V4dGVybiBpbnQgYXR0cl9yZW1vdmUgKGNvbnN0IGNoYXIgKl9fcGF0aCwgY29uc3QgY2hhciAqX19hdHRybmFtZSwKKwkJCWludCBfX2ZsYWdzKTsKK2V4dGVybiBpbnQgYXR0cl9yZW1vdmVmIChpbnQgX19mZCwgY29uc3QgY2hhciAqX19hdHRybmFtZSwgaW50IF9fZmxhZ3MpOworCisvKgorICogTGlzdCB0aGUgbmFtZXMgYW5kIHNpemVzIG9mIHRoZSB2YWx1ZXMgb2YgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdC4KKyAqICJDdXJzb3IiIG11c3QgYmUgYWxsb2NhdGVkIGFuZCB6ZXJvZWQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsLCBpdCBpcyB1c2VkCisgKiB0byBtYWludGFpbiBjb250ZXh0IGJldHdlZW4gc3lzdGVtIGNhbGxzIGlmIGFsbCB0aGUgYXR0cmlidXRlIG5hbWVzIHdvbid0CisgKiBmaXQgaW50byB0aGUgYnVmZmVyIG9uIHRoZSBmaXJzdCBzeXN0ZW0gY2FsbC4KKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgLTEgb24gZXJyb3IgKHcvZXJybm8gc2V0IGFwcHJvcHJpYXRlbHkpLCAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBhdHRyX2xpc3QoY29uc3QgY2hhciAqX19wYXRoLCBjaGFyICpfX2J1ZmZlciwgY29uc3QgaW50IF9fYnVmZmVyc2l6ZSwKKwkJaW50IF9fZmxhZ3MsIGF0dHJsaXN0X2N1cnNvcl90ICpfX2N1cnNvcik7CitpbnQgYXR0cl9saXN0ZihpbnQgX19mZCwgY2hhciAqX19idWZmZXIsIGNvbnN0IGludCBfX2J1ZmZlcnNpemUsCisJCWludCBfX2ZsYWdzLCBhdHRybGlzdF9jdXJzb3JfdCAqX19jdXJzb3IpOworCisvKgorICogT3BlcmF0ZSBvbiBtdWx0aXBsZSBhdHRyaWJ1dGVzIG9mIHRoZSBzYW1lIG9iamVjdCBzaW11bHRhbmVvdXNseS4KKyAqCisgKiBUaGlzIGNhbGwgd2lsbCBzYXZlIG9uIHN5c3RlbSBjYWxsIG92ZXJoZWFkIHdoZW4gbWFueSBhdHRyaWJ1dGVzIGFyZQorICogZ29pbmcgdG8gYmUgb3BlcmF0ZWQgb24uCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyAtMSBvbiBlcnJvciAody9lcnJubyBzZXQgYXBwcm9wcmlhdGVseSksIDAgb24gc3VjY2Vzcy4KKyAqIE5vdGUgdGhhdCB0aGlzIGNhbGwgd2lsbCBub3QgcmV0dXJuIC0xIGFzIGEgcmVzdWx0IG9mIGZhaWx1cmUgb2YgYW55CisgKiBvZiB0aGUgc3ViLW9wZXJhdGlvbnMsIHRoZWlyIHJldHVybiB2YWx1ZSBpcyBzdG9yZWQgaW4gZWFjaCBlbGVtZW50CisgKiBvZiB0aGUgb3BlcmF0aW9uIGFycmF5LiAgVGhpcyBjYWxsIHdpbGwgcmV0dXJuIC0xIGZvciBhIGZhaWx1cmUgb2YgdGhlCisgKiBjYWxsIGFzIGEgd2hvbGUsIGVnOiBpZiB0aGUgcGF0aG5hbWUgZG9lc24ndCBleGlzdCwgb3IgdGhlIGZkIGlzIGJhZC4KKyAqCisgKiBUaGUgc2VtYW50aWNzIGFuZCBhbGxvd2FibGUgdmFsdWVzIGZvciB0aGUgZmllbGRzIGluIGEgYXR0cl9tdWx0aW9wX3QKKyAqIGFyZSB0aGUgc2FtZSBhcyB0aGUgc2VtYW50aWNzIGFuZCBhbGxvd2FibGUgdmFsdWVzIGZvciB0aGUgYXJndW1lbnRzIHRvCisgKiB0aGUgY29ycmVzcG9uZGluZyAic2ltcGxlIiBhdHRyaWJ1dGUgaW50ZXJmYWNlLiAgRm9yIGV4YW1wbGU6IHRoZSBhcmdzCisgKiB0byBhIEFUVFJfT1BfR0VUIGFyZSB0aGUgc2FtZSBhcyB0aGUgYXJncyB0byBhbiBhdHRyX2dldCgpIGNhbGwuCisgKi8KK2V4dGVybiBpbnQgYXR0cl9tdWx0aSAoY29uc3QgY2hhciAqX19wYXRoLCBhdHRyX211bHRpb3BfdCAqX19vcGxpc3QsCisJCQlpbnQgX19jb3VudCwgaW50IF9fZmxhZ3MpOworZXh0ZXJuIGludCBhdHRyX211bHRpZiAoaW50IF9fZmQsIGF0dHJfbXVsdGlvcF90ICpfX29wbGlzdCwKKwkJCWludCBfX2NvdW50LCBpbnQgX19mbGFncyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgkvKiBfX0FUVFJJQlVURVNfSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2F0dHIvZXJyb3JfY29udGV4dC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hdHRyL2Vycm9yX2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTE3OTAxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hdHRyL2Vycm9yX2NvbnRleHQuaApAQCAtMCwwICsxLDUzIEBACisvKgorICBDb3B5cmlnaHQgKEMpIDIwMDkgIEFuZHJlYXMgR3J1ZW5iYWNoZXIgPGFncnVlbkBzdXNlLmRlPgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fRVJST1JfQ09OVEVYVF9UCisjZGVmaW5lIF9fRVJST1JfQ09OVEVYVF9UCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGVycm9yX2NvbnRleHQgeworCS8qIFByb2Nlc3MgYW4gZXJyb3IgbWVzc2FnZSAqLworCXZvaWQgKCplcnJvcikgKHN0cnVjdCBlcnJvcl9jb250ZXh0ICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKKworCS8qIFF1b3RlIGEgZmlsZSBuYW1lIGZvciBpbmNsdWRpbmcgaW4gYW4gZXJyb3IgbWVzc2FnZSAqLworCWNvbnN0IGNoYXIgKigqcXVvdGUpIChzdHJ1Y3QgZXJyb3JfY29udGV4dCAqLCBjb25zdCBjaGFyICopOworCisJLyogRnJlZSBhIHF1b3RlZCBuYW1lICovCisJdm9pZCAoKnF1b3RlX2ZyZWUpIChzdHJ1Y3QgZXJyb3JfY29udGV4dCAqLCBjb25zdCBjaGFyICopOworfTsKKworI2lmZGVmIEVSUk9SX0NPTlRFWFRfTUFDUk9TCisjIGRlZmluZSBlcnJvcihjdHgsIGFyZ3MuLi4pIGRvIHsgXAorCWlmICgoY3R4KSAmJiAoY3R4KS0+ZXJyb3IpIFwKKwkJKGN0eCktPmVycm9yKChjdHgpLCBhcmdzKTsgXAorCX0gd2hpbGUoMCkKKyMgZGVmaW5lIHF1b3RlKGN0eCwgbmFtZSkgXAorCSggKChjdHgpICYmIChjdHgpLT5xdW90ZSkgPyAoY3R4KS0+cXVvdGUoKGN0eCksIChuYW1lKSkgOiAobmFtZSkgKQorIyBkZWZpbmUgcXVvdGVfZnJlZShjdHgsIG5hbWUpIGRvIHsgXAorCWlmICgoY3R4KSAmJiAoY3R4KS0+cXVvdGVfZnJlZSkgXAorCQkoY3R4KS0+cXVvdGVfZnJlZSgoY3R4KSwgKG5hbWUpKTsgXAorCX0gd2hpbGUoMCkKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qIF9fRVJST1JfQ09OVEVYVF9UICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2F0dHIvbGliYXR0ci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hdHRyL2xpYmF0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTdjNDMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hdHRyL2xpYmF0dHIuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICBDb3B5cmlnaHQgKEMpIDIwMDkgIEFuZHJlYXMgR3J1ZW5iYWNoZXIgPGFncnVlbkBzdXNlLmRlPgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fTElCQVRUUl9ICisjZGVmaW5lIF9fTElCQVRUUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGVycm9yX2NvbnRleHQ7CisKK2V4dGVybiBpbnQgYXR0cl9jb3B5X2ZpbGUgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCQkJICAgaW50ICgqKSAoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZXJyb3JfY29udGV4dCAqKSwKKwkJCSAgIHN0cnVjdCBlcnJvcl9jb250ZXh0ICopOworZXh0ZXJuIGludCBhdHRyX2NvcHlfZmQgKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICosIGludCwKKwkJCSBpbnQgKCopIChjb25zdCBjaGFyICosIHN0cnVjdCBlcnJvcl9jb250ZXh0ICopLAorCQkJIHN0cnVjdCBlcnJvcl9jb250ZXh0ICopOworCisvKiBLZWVwIHRoaXMgZnVuY3Rpb24gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAqLworZXh0ZXJuIGludCBhdHRyX2NvcHlfY2hlY2tfcGVybWlzc2lvbnMoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZXJyb3JfY29udGV4dCAqKTsKKworI2RlZmluZSBBVFRSX0FDVElPTl9TS0lQCTEKKyNkZWZpbmUgQVRUUl9BQ1RJT05fUEVSTUlTU0lPTlMJMgorCitleHRlcm4gaW50IGF0dHJfY29weV9hY3Rpb24oY29uc3QgY2hhciAqLCBzdHJ1Y3QgZXJyb3JfY29udGV4dCAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2F0dHIveGF0dHIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXR0ci94YXR0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYTg0YmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2F0dHIveGF0dHIuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZQorICogPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqLworI2lmbmRlZiBfX1hBVFRSX0hfXworI2RlZmluZSBfX1hBVFRSX0hfXworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaWZuZGVmIEVOT0FUVFIKKyMgZGVmaW5lIEVOT0FUVFIgRU5PREFUQSAgICAgICAgLyogTm8gc3VjaCBhdHRyaWJ1dGUgKi8KKyNlbmRpZgorCisjZGVmaW5lIFhBVFRSX0NSRUFURSAgMHgxICAgICAgIC8qIHNldCB2YWx1ZSwgZmFpbCBpZiBhdHRyIGFscmVhZHkgZXhpc3RzICovCisjZGVmaW5lIFhBVFRSX1JFUExBQ0UgMHgyICAgICAgIC8qIHNldCB2YWx1ZSwgZmFpbCBpZiBhdHRyIGRvZXMgbm90IGV4aXN0ICovCisKKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IHNldHhhdHRyIChjb25zdCBjaGFyICpfX3BhdGgsIGNvbnN0IGNoYXIgKl9fbmFtZSwKKwkJICAgICAgY29uc3Qgdm9pZCAqX192YWx1ZSwgc2l6ZV90IF9fc2l6ZSwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CitleHRlcm4gaW50IGxzZXR4YXR0ciAoY29uc3QgY2hhciAqX19wYXRoLCBjb25zdCBjaGFyICpfX25hbWUsCisJCSAgICAgIGNvbnN0IHZvaWQgKl9fdmFsdWUsIHNpemVfdCBfX3NpemUsIGludCBfX2ZsYWdzKSBfX1RIUk9XOworZXh0ZXJuIGludCBmc2V0eGF0dHIgKGludCBfX2ZpbGVkZXMsIGNvbnN0IGNoYXIgKl9fbmFtZSwKKwkJICAgICAgY29uc3Qgdm9pZCAqX192YWx1ZSwgc2l6ZV90IF9fc2l6ZSwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKK2V4dGVybiBzc2l6ZV90IGdldHhhdHRyIChjb25zdCBjaGFyICpfX3BhdGgsIGNvbnN0IGNoYXIgKl9fbmFtZSwKKwkJCQl2b2lkICpfX3ZhbHVlLCBzaXplX3QgX19zaXplKSBfX1RIUk9XOworZXh0ZXJuIHNzaXplX3QgbGdldHhhdHRyIChjb25zdCBjaGFyICpfX3BhdGgsIGNvbnN0IGNoYXIgKl9fbmFtZSwKKwkJCQl2b2lkICpfX3ZhbHVlLCBzaXplX3QgX19zaXplKSBfX1RIUk9XOworZXh0ZXJuIHNzaXplX3QgZmdldHhhdHRyIChpbnQgX19maWxlZGVzLCBjb25zdCBjaGFyICpfX25hbWUsCisJCQkJdm9pZCAqX192YWx1ZSwgc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKKworZXh0ZXJuIHNzaXplX3QgbGlzdHhhdHRyIChjb25zdCBjaGFyICpfX3BhdGgsIGNoYXIgKl9fbGlzdCwKKwkJCQlzaXplX3QgX19zaXplKSBfX1RIUk9XOworZXh0ZXJuIHNzaXplX3QgbGxpc3R4YXR0ciAoY29uc3QgY2hhciAqX19wYXRoLCBjaGFyICpfX2xpc3QsCisJCQkJc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKK2V4dGVybiBzc2l6ZV90IGZsaXN0eGF0dHIgKGludCBfX2ZpbGVkZXMsIGNoYXIgKl9fbGlzdCwKKwkJCQlzaXplX3QgX19zaXplKSBfX1RIUk9XOworCitleHRlcm4gaW50IHJlbW92ZXhhdHRyIChjb25zdCBjaGFyICpfX3BhdGgsIGNvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKK2V4dGVybiBpbnQgbHJlbW92ZXhhdHRyIChjb25zdCBjaGFyICpfX3BhdGgsIGNvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKK2V4dGVybiBpbnQgZnJlbW92ZXhhdHRyIChpbnQgX19maWxlZGVzLCAgIGNvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIF9fWEFUVFJfSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2F1ZGlvZmlsZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hdWRpb2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWM3MGIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hdWRpb2ZpbGUuaApAQCAtMCwwICsxLDYwMCBAQAorLyoKKwlBdWRpbyBGaWxlIExpYnJhcnkKKwlDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCwgMjAxMC0yMDExLCBNaWNoYWVsIFBydWV0dCA8bWljaGFlbEA2OGsub3JnPgorCisJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisJdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorCUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKwlMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorCUJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQS4KKyovCisKKy8qCisJYXVkaW9maWxlLmgKKworCVRoaXMgZmlsZSBjb250YWlucyB0aGUgcHVibGljIGludGVyZmFjZXMgdG8gdGhlIEF1ZGlvIEZpbGUgTGlicmFyeS4KKyovCisKKyNpZm5kZWYgQVVESU9GSUxFX0gKKyNkZWZpbmUgQVVESU9GSUxFX0gKKworI2luY2x1ZGUgPGF1cHZsaXN0Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNkZWZpbmUgTElCQVVESU9GSUxFX01BSk9SX1ZFUlNJT04gMAorI2RlZmluZSBMSUJBVURJT0ZJTEVfTUlOT1JfVkVSU0lPTiAzCisjZGVmaW5lIExJQkFVRElPRklMRV9NSUNST19WRVJTSU9OIDMKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfQUZ2aXJ0dWFsZmlsZSBBRnZpcnR1YWxmaWxlOworCit0eXBlZGVmIHN0cnVjdCBfQUZmaWxlc2V0dXAgKkFGZmlsZXNldHVwOwordHlwZWRlZiBzdHJ1Y3QgX0FGZmlsZWhhbmRsZSAqQUZmaWxlaGFuZGxlOwordHlwZWRlZiB2b2lkICgqQUZlcnJmdW5jKShsb25nLCBjb25zdCBjaGFyICopOworCisvLyBEZWZpbmUgQUZmcmFtZWNvdW50IGFuZCBBRmZpbGVvZmZzZXQgYXMgNjQtYml0IHNpZ25lZCBpbnRlZ2Vycy4KKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBcCisJZGVmaW5lZChfX0RyYWdvbkZseV9fKSB8fCBcCisJZGVmaW5lZChfX05ldEJTRF9fKSB8fCBcCisJZGVmaW5lZChfX09wZW5CU0RfXykgfHwgXAorCWRlZmluZWQoX19BUFBMRV9fKSB8fCBcCisJZGVmaW5lZChfX3NnaSkgfHwgXAorCShkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChfX0xQNjRfXykpCisvLyBCU0QgYW5kIElSSVggc3lzdGVtcyBkZWZpbmUgb2ZmX3QgYXMgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIuCisvLyBMaW51eCBkZWZpbmVzIG9mZl90IGFzIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGluIExQNjQgbW9kZS4KK3R5cGVkZWYgb2ZmX3QgQUZmcmFtZWNvdW50OwordHlwZWRlZiBvZmZfdCBBRmZpbGVvZmZzZXQ7CisjZWxzZQorLy8gRm9yIGFsbCBvdGhlciBzeXN0ZW1zLCB1c2UgaW50NjRfdC4KK3R5cGVkZWYgaW50NjRfdCBBRmZyYW1lY291bnQ7Cit0eXBlZGVmIGludDY0X3QgQUZmaWxlb2Zmc2V0OworI2VuZGlmCisKKyNkZWZpbmUgQUZfTlVMTF9GSUxFU0VUVVAJKChzdHJ1Y3QgX0FGZmlsZXNldHVwICopIDApCisjZGVmaW5lIEFGX05VTExfRklMRUhBTkRMRQkoKHN0cnVjdCBfQUZmaWxlaGFuZGxlICopIDApCisKKyNkZWZpbmUgQUZfRVJSX0JBU0UgMzAwMAorCitlbnVtCit7CisJQUZfREVGQVVMVF9UUkFDSyA9IDEwMDEKK307CisKK2VudW0KK3sKKwlBRl9ERUZBVUxUX0lOU1QgPSAyMDAxCit9OworCitlbnVtCit7CisJQUZfTlVNX1VOTElNSVRFRCA9IDk5OTk5Cit9OworCitlbnVtCit7CisJQUZfQllURU9SREVSX0JJR0VORElBTiA9IDUwMSwKKwlBRl9CWVRFT1JERVJfTElUVExFRU5ESUFOID0gNTAyCit9OworCitlbnVtCit7CisJQUZfRklMRV9VTktOT1dOID0gLTEsCisJQUZfRklMRV9SQVdEQVRBID0gMCwKKwlBRl9GSUxFX0FJRkZDID0gMSwKKwlBRl9GSUxFX0FJRkYgPSAyLAorCUFGX0ZJTEVfTkVYVFNORCA9IDMsCisJQUZfRklMRV9XQVZFID0gNCwKKwlBRl9GSUxFX0JJQ1NGID0gNSwKKwlBRl9GSUxFX0lSQ0FNID0gQUZfRklMRV9CSUNTRiwKKwlBRl9GSUxFX01QRUcxQklUU1RSRUFNID0gNiwJLyogbm90IGltcGxlbWVudGVkICovCisJQUZfRklMRV9TT1VORERFU0lHTkVSMSA9IDcsCS8qIG5vdCBpbXBsZW1lbnRlZCAqLworCUFGX0ZJTEVfU09VTkRERVNJR05FUjIgPSA4LAkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwlBRl9GSUxFX0FWUiA9IDksCisJQUZfRklMRV9JRkZfOFNWWCA9IDEwLAorCUFGX0ZJTEVfU0FNUExFVklTSU9OID0gMTEsCS8qIG5vdCBpbXBsZW1lbnRlZCAqLworCUFGX0ZJTEVfVk9DID0gMTIsCisJQUZfRklMRV9OSVNUX1NQSEVSRSA9IDEzLAorCUFGX0ZJTEVfU09VTkRGT05UMiA9IDE0LAkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwlBRl9GSUxFX0NBRiA9IDE1Cit9OworCitlbnVtCit7CisJQUZfTE9PUF9NT0RFX05PTE9PUCA9IDAsCisJQUZfTE9PUF9NT0RFX0ZPUlcgPSAxLAorCUFGX0xPT1BfTU9ERV9GT1JXQkFLVyA9IDIKK307CisKK2VudW0KK3sKKwlBRl9TQU1QRk1UX1RXT1NDT01QID0gNDAxLCAvKiBsaW5lYXIgdHdvJ3MgY29tcGxlbWVudCAqLworCUFGX1NBTVBGTVRfVU5TSUdORUQgPSA0MDIsIC8qIHVuc2lnbmVkIGludGVnZXIgKi8KKwlBRl9TQU1QRk1UX0ZMT0FUID0gNDAzLCAvKiAzMi1iaXQgSUVFRSBmbG9hdGluZy1wb2ludCAqLworCUFGX1NBTVBGTVRfRE9VQkxFID0gNDA0IC8qIDY0LWJpdCBJRUVFIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgKi8KK307CisKK2VudW0KK3sKKwlBRl9JTlNUX0xPT1BfT0ZGID0gMCwJCQkvKiBubyBsb29waW5nICovCisJQUZfSU5TVF9MT09QX0NPTlRJTlVPVVMgPSAxLAkvKiBsb29wIGNvbnRpbnVvdXNseSB0aHJvdWdoIGRlY2F5ICovCisJQUZfSU5TVF9MT09QX1NVU1RBSU4gPSAzCQkvKiBsb29wIGR1cmluZyBzdXN0YWluLCB0aGVuIGNvbnRpbnVlICovCit9OworCitlbnVtCit7CisJQUZfSU5TVF9NSURJX0JBU0VOT1RFID0gMzAxLAorCUFGX0lOU1RfTlVNQ0VOVFNfREVUVU5FID0gMzAyLAorCUFGX0lOU1RfTUlESV9MT05PVEUgPSAzMDMsCisJQUZfSU5TVF9NSURJX0hJTk9URSA9IDMwNCwKKwlBRl9JTlNUX01JRElfTE9WRUxPQ0lUWSA9IDMwNSwKKwlBRl9JTlNUX01JRElfSElWRUxPQ0lUWSA9IDMwNiwKKwlBRl9JTlNUX05VTURCU19HQUlOID0gMzA3LAorCUFGX0lOU1RfU1VTTE9PUElEID0gMzA4LAkJLyogbG9vcCBpZCBmb3IgQUlGRiBzdXN0YWluIGxvb3AgKi8KKwlBRl9JTlNUX1JFTExPT1BJRCA9IDMwOSwJCS8qIGxvb3AgaWQgZm9yIEFJRkYgcmVsZWFzZSBsb29wICovCisJQUZfSU5TVF9TQU1QX1NUQVJURlJBTUUgPSAzMTAsCS8qIHN0YXJ0IHNhbXBsZSBmb3IgdGhpcyBpbnN0ICovCisJQUZfSU5TVF9TQU1QX0VOREZSQU1FID0gMzExLAkvKiBlbmQgc2FtcGxlIGZvciB0aGlzIGluc3QgKi8KKwlBRl9JTlNUX1NBTVBfTU9ERSA9IDMxMiwJCS8qIGxvb3BpbmcgbW9kZSBmb3IgdGhpcyBpbnN0ICovCisJQUZfSU5TVF9UUkFDS0lEID0gMzEzLAorCUFGX0lOU1RfTkFNRSA9IDMxNCwJCQkJLyogbmFtZSBvZiB0aGlzIGluc3QgKi8KKwlBRl9JTlNUX1NBTVBfUkFURSA9IDMxNSwJCS8qIHNhbXBsZSByYXRlIG9mIHRoaXMgaW5zdCdzIHNhbXBsZSAqLworCUFGX0lOU1RfUFJFU0VUSUQgPSAzMTYsCQkJLyogSUQgb2YgcHJlc2V0IGNvbnRhaW5pbmcgdGhpcyBpbnN0ICovCisJQUZfSU5TVF9QUkVTRVRfTkFNRSA9IDMxNwkJLyogbmFtZSBvZiBwcmVzZXQgY29udGFpbmluZyB0aGlzIGluc3QgKi8KK307CisKK2VudW0KK3sKKwlBRl9NSVNDX1VOUkVDT0dOSVpFRCA9IDAsCS8qIHVucmVjb2duaXplZCBkYXRhIGNodW5rICovCisJQUZfTUlTQ19DT1BZID0gMjAxLAkvKiBjb3B5cmlnaHQgc3RyaW5nICovCisJQUZfTUlTQ19BVVRIID0gMjAyLAkvKiBhdXRob3Igc3RyaW5nICovCisJQUZfTUlTQ19OQU1FID0gMjAzLAkvKiBuYW1lIHN0cmluZyAqLworCUFGX01JU0NfQU5OTyA9IDIwNCwJLyogYW5ub3RhdGlvbiBzdHJpbmcgKi8KKwlBRl9NSVNDX0FQUEwgPSAyMDUsCS8qIGFwcGxpY2F0aW9uLXNwZWNpZmljIGRhdGEgKi8KKwlBRl9NSVNDX01JREkgPSAyMDYsCS8qIE1JREkgZXhjbHVzaXZlIGRhdGEgKi8KKwlBRl9NSVNDX1BDTU1BUCA9IDIwNywJLyogUENNIG1hcHBpbmcgaW5mb3JtYXRpb24gKGZ1dHVyZSB1c2UpICovCisJQUZfTUlTQ19OZVhUID0gMjA4LAkvKiBtaXNjIGJpbmFyeSBkYXRhIGFwcGVuZGVkIHRvIE5lWFQgaGVhZGVyICovCisJQUZfTUlTQ19JUkNBTV9QRUFLQU1QID0gMjA5LAkvKiBwZWFrIGFtcGxpdHVkZSBpbmZvcm1hdGlvbiAqLworCUFGX01JU0NfSVJDQU1fQ09NTUVOVCA9IDIxMCwJLyogQklDU0YgdGV4dCBjb21tZW50ICovCisJQUZfTUlTQ19DT01NRU5UID0gMjEwLAkvKiBnZW5lcmFsIHRleHQgY29tbWVudCAqLworCisJQUZfTUlTQ19JQ01UID0gQUZfTUlTQ19DT01NRU5ULAkvKiBjb21tZW50cyBjaHVuayAoV0FWRSBmb3JtYXQpICovCisJQUZfTUlTQ19JQ1JEID0gMjExLCAgLyogY3JlYXRpb24gZGF0ZSAoV0FWRSBmb3JtYXQpICovCisJQUZfTUlTQ19JU0ZUID0gMjEyICAvKiBzb2Z0d2FyZSBuYW1lIChXQVZFIGZvcm1hdCkgKi8KK307CisKK2VudW0KK3sKKwkvKiBzdXBwb3J0ZWQgY29tcHJlc3Npb24gc2NoZW1lcyAqLworCUFGX0NPTVBSRVNTSU9OX1VOS05PV04gPSAtMSwKKwlBRl9DT01QUkVTU0lPTl9OT05FID0gMCwKKwlBRl9DT01QUkVTU0lPTl9HNzIyID0gNTAxLAorCUFGX0NPTVBSRVNTSU9OX0c3MTFfVUxBVyA9IDUwMiwKKwlBRl9DT01QUkVTU0lPTl9HNzExX0FMQVcgPSA1MDMsCisKKwkvKiBBcHBsZSBwcm9wcmlldGFyeSBBSUZGLUMgY29tcHJlc3Npb24gc2NoZW1lcyAobm90IHN1cHBvcnRlZCkgKi8KKwlBRl9DT01QUkVTU0lPTl9BUFBMRV9BQ0UyID0gNTA0LAorCUFGX0NPTVBSRVNTSU9OX0FQUExFX0FDRTggPSA1MDUsCisJQUZfQ09NUFJFU1NJT05fQVBQTEVfTUFDMyA9IDUwNiwKKwlBRl9DT01QUkVTU0lPTl9BUFBMRV9NQUM2ID0gNTA3LAorCisJQUZfQ09NUFJFU1NJT05fRzcyNiA9IDUxNywKKwlBRl9DT01QUkVTU0lPTl9HNzI4ID0gNTE4LAorCUFGX0NPTVBSRVNTSU9OX0RWSV9BVURJTyA9IDUxOSwKKwlBRl9DT01QUkVTU0lPTl9JTUEgPSBBRl9DT01QUkVTU0lPTl9EVklfQVVESU8sCisJQUZfQ09NUFJFU1NJT05fR1NNID0gNTIwLAorCUFGX0NPTVBSRVNTSU9OX0ZTMTAxNiA9IDUyMSwKKwlBRl9DT01QUkVTU0lPTl9EViA9IDUyMiwKKwlBRl9DT01QUkVTU0lPTl9NU19BRFBDTSA9IDUyMworfTsKKworLyogdG9rZW5zIGZvciBhZlF1ZXJ5KCkgLS0gc2VlIHRoZSBtYW4gcGFnZSBmb3IgaW5zdHJ1Y3Rpb25zICovCisvKiBsZXZlbCAxIHNlbGVjdG9ycyAqLworZW51bQoreworCUFGX1FVRVJZVFlQRV9JTlNUUEFSQU0gPSA1MDAsCisJQUZfUVVFUllUWVBFX0ZJTEVGTVQgPSA1MDEsCisJQUZfUVVFUllUWVBFX0NPTVBSRVNTSU9OID0gNTAyLAorCUFGX1FVRVJZVFlQRV9DT01QUkVTU0lPTlBBUkFNID0gNTAzLAorCUFGX1FVRVJZVFlQRV9NSVNDID0gNTA0LAorCUFGX1FVRVJZVFlQRV9JTlNUID0gNTA1LAorCUFGX1FVRVJZVFlQRV9NQVJLID0gNTA2LAorCUFGX1FVRVJZVFlQRV9MT09QID0gNTA3Cit9OworCisvKiBsZXZlbCAyIHNlbGVjdG9ycyAqLworZW51bQoreworCUFGX1FVRVJZX05BTUUgPSA2MDAsCS8qIGdldCBuYW1lICgxLTMgd29yZHMpICovCisJQUZfUVVFUllfREVTQyA9IDYwMSwJLyogZ2V0IGRlc2NyaXB0aW9uICovCisJQUZfUVVFUllfTEFCRUwgPSA2MDIsCS8qIGdldCA0LSBvciA1LWNoYXIgbGFiZWwgKi8KKwlBRl9RVUVSWV9UWVBFID0gNjAzLAkvKiBnZXQgdHlwZSB0b2tlbiAqLworCUFGX1FVRVJZX0RFRkFVTFQgPSA2MDQsCS8qIGRmbHQuIHZhbHVlIGZvciBwYXJhbSAqLworCUFGX1FVRVJZX0lEX0NPVU5UID0gNjA1LAkvKiBnZXQgbnVtYmVyIG9mIGlkcyBhdmFpbC4gKi8KKwlBRl9RVUVSWV9JRFMgPSA2MDYsCS8qIGdldCBhcnJheSBvZiBpZCB0b2tlbnMgKi8KKwlBRl9RVUVSWV9JTVBMRU1FTlRFRCA9IDYxMywJLyogYm9vbGVhbiAqLworCUFGX1FVRVJZX1RZUEVfQ09VTlQgPSA2MDcsCS8qIGdldCBudW1iZXIgb2YgdHlwZXMgYXYuICovCisJQUZfUVVFUllfVFlQRVMgPSA2MDgsCS8qIGdldCBhcnJheSBvZiB0eXBlcyAqLworCUFGX1FVRVJZX05BVElWRV9TQU1QRk1UID0gNjA5LAkvKiBmb3IgY29tcHJlc3Npb24gKi8KKwlBRl9RVUVSWV9OQVRJVkVfU0FNUFdJRFRIID0gNjEwLAorCUFGX1FVRVJZX1NRVUlTSEZBQyA9IDYxMSwJLyogMS4wIG1lYW5zIHZhcmlhYmxlICovCisJQUZfUVVFUllfTUFYX05VTUJFUiA9IDYxMiwJLyogbWF4IGFsbG93ZWQgaW4gZmlsZSAqLworCUFGX1FVRVJZX1NVUFBPUlRFRCA9IDYxMwkvKiBpbnN0cywgbG9vcHMsIGV0Yy4sIHN1cHBvcnRlZD8gKi8KK307CisKKy8qIGxldmVsIDIgc2VsZWN0b3JzIHdoaWNoIGhhdmUgc3ViLXNlbGVjdG9ycyAqLworZW51bQoreworCUFGX1FVRVJZX1RSQUNLUyA9IDYyMCwKKwlBRl9RVUVSWV9DSEFOTkVMUyA9IDYyMSwKKwlBRl9RVUVSWV9TQU1QTEVfU0laRVMgPSA2MjIsCisJQUZfUVVFUllfU0FNUExFX0ZPUk1BVFMgPSA2MjMsCisJQUZfUVVFUllfQ09NUFJFU1NJT05fVFlQRVMgPSA2MjQKK307CisKKy8qIGxldmVsIDMgc3ViLXNlbGVjdG9ycyAqLworZW51bQoreworCUFGX1FVRVJZX1ZBTFVFX0NPVU5UID0gNjUwLAkvKiBudW1iZXIgb2YgdmFsdWVzIG9mIHRoZSBhYm92ZSAqLworCUFGX1FVRVJZX1ZBTFVFUyA9IDY1MQkvKiBhcnJheSBvZiB0aG9zZSB2YWx1ZXMgKi8KK307CisKKworLyoKKwlPbGQgQXVkaW8gRmlsZSBMaWJyYXJ5IGVycm9yIGNvZGVzLiBUaGVzZSBhcmUgc3RpbGwgcmV0dXJuZWQgYnkgdGhlCisJQUZlcnJvcmhhbmRsZXIgY2FsbHMsIGJ1dCBhcmUgbm90IHVzZWQgYnkgdGhlIG5ldyBkaWdpdGFsIG1lZGlhIGxpYnJhcnkKKwllcnJvciByZXBvcnRpbmcgcm91dGluZXMuIFNlZSB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZSBmb3IgdGhlIG5ldyBlcnJvcgorCXRva2Vucy4KKyovCisKK2VudW0KK3sKKwlBRl9CQURfTk9UX0lNUExFTUVOVEVEID0gMCwJLyogbm90IGltcGxlbWVudGVkIHlldCAqLworCUFGX0JBRF9GSUxFSEFORExFID0gMSwJLyogdHJpZWQgdG8gdXNlIGludmFsaWQgZmlsZWhhbmRsZSAqLworCUFGX0JBRF9PUEVOID0gMywJLyogdW5peCBvcGVuIGZhaWxlZCAqLworCUFGX0JBRF9DTE9TRSA9IDQsCS8qIHVuaXggY2xvc2UgZmFpbGVkICovCisJQUZfQkFEX1JFQUQgPSA1LAkvKiB1bml4IHJlYWQgZmFpbGVkICovCisJQUZfQkFEX1dSSVRFID0gNiwJLyogdW5peCB3cml0ZSBmYWlsZWQgKi8KKwlBRl9CQURfTFNFRUsgPSA3LAkvKiB1bml4IGxzZWVrIGZhaWxlZCAqLworCUFGX0JBRF9OT19GSUxFSEFORExFID0gOCwJLyogZmFpbGVkIHRvIGFsbG9jYXRlIGEgZmlsZWhhbmRsZSBzdHJ1Y3QgKi8KKwlBRl9CQURfQUNDTU9ERSA9IDEwLAkvKiB1bnJlY29nbml6ZWQgYXVkaW8gZmlsZSBhY2Nlc3MgbW9kZSAqLworCUFGX0JBRF9OT1dSSVRFQUNDID0gMTEsCS8qIGZpbGUgbm90IG9wZW4gZm9yIHdyaXRpbmcgKi8KKwlBRl9CQURfTk9SRUFEQUNDID0gMTIsCS8qIGZpbGUgbm90IG9wZW4gZm9yIHJlYWRpbmcgKi8KKwlBRl9CQURfRklMRUZNVCA9IDEzLAkvKiB1bnJlY29nbml6ZWQgYXVkaW8gZmlsZSBmb3JtYXQgKi8KKwlBRl9CQURfUkFURSA9IDE0LAkvKiBpbnZhbGlkIHNhbXBsZSByYXRlICovCisJQUZfQkFEX0NIQU5ORUxTID0gMTUsCS8qIGludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzKi8KKwlBRl9CQURfU0FNUENOVCA9IDE2LAkvKiBpbnZhbGlkIHNhbXBsZSBjb3VudCAqLworCUFGX0JBRF9XSURUSCA9IDE3LAkvKiBpbnZhbGlkIHNhbXBsZSB3aWR0aCAqLworCUFGX0JBRF9TRUVLTU9ERSA9IDE4LAkvKiBpbnZhbGlkIHNlZWsgbW9kZSAqLworCUFGX0JBRF9OT19MT09QREFUQSA9IDE5LAkvKiBmYWlsZWQgdG8gYWxsb2NhdGUgbG9vcCBzdHJ1Y3QgKi8KKwlBRl9CQURfTUFMTE9DID0gMjAsCS8qIG1hbGxvYyBmYWlsZWQgc29tZXdoZXJlICovCisJQUZfQkFEX0xPT1BJRCA9IDIxLAorCUFGX0JBRF9TQU1QRk1UID0gMjIsCS8qIGJhZCBzYW1wbGUgZm9ybWF0ICovCisJQUZfQkFEX0ZJTEVTRVRVUCA9IDIzLAkvKiBiYWQgZmlsZSBzZXR1cCBzdHJ1Y3R1cmUqLworCUFGX0JBRF9UUkFDS0lEID0gMjQsCS8qIG5vIHRyYWNrIGNvcnJlc3BvbmRpbmcgdG8gaWQgKi8KKwlBRl9CQURfTlVNVFJBQ0tTID0gMjUsCS8qIHdyb25nIG51bWJlciBvZiB0cmFja3MgZm9yIGZpbGUgZm9ybWF0ICovCisJQUZfQkFEX05PX0ZJTEVTRVRVUCA9IDI2LAkvKiBmYWlsZWQgdG8gYWxsb2NhdGUgYSBmaWxlc2V0dXAgc3RydWN0Ki8KKwlBRl9CQURfTE9PUE1PREUgPSAyNywJLyogdW5yZWNvZ25pemVkIGxvb3AgbW9kZSB2YWx1ZSAqLworCUFGX0JBRF9JTlNUSUQgPSAyOCwJLyogaW52YWxpZCBpbnN0cnVtZW50IGlkICovCisJQUZfQkFEX05VTUxPT1BTID0gMjksCS8qIGJhZCBudW1iZXIgb2YgbG9vcHMgKi8KKwlBRl9CQURfTlVNTUFSS1MgPSAzMCwJLyogYmFkIG51bWJlciBvZiBtYXJrZXJzICovCisJQUZfQkFEX01BUktJRCA9IDMxLAkvKiBiYWQgbWFya2VyIGlkICovCisJQUZfQkFEX01BUktQT1MgPSAzMiwJLyogaW52YWxpZCBtYXJrZXIgcG9zaXRpb24gdmFsdWUgKi8KKwlBRl9CQURfTlVNSU5TVFMgPSAzMywJLyogaW52YWxpZCBudW1iZXIgb2YgaW5zdHJ1bWVudHMgKi8KKwlBRl9CQURfTk9BRVNEQVRBID0gMzQsCisJQUZfQkFEX01JU0NJRCA9IDM1LAorCUFGX0JBRF9OVU1NSVNDID0gMzYsCisJQUZfQkFEX01JU0NTSVpFID0gMzcsCisJQUZfQkFEX01JU0NUWVBFID0gMzgsCisJQUZfQkFEX01JU0NTRUVLID0gMzksCisJQUZfQkFEX1NUUkxFTiA9IDQwLAkvKiBpbnZhbGlkIHN0cmluZyBsZW5ndGggKi8KKwlBRl9CQURfUkFURUNPTlYgPSA0NSwKKwlBRl9CQURfU1lOQ0ZJTEUgPSA0NiwKKwlBRl9CQURfQ09ERUNfQ09ORklHID0gNDcsCS8qIGltcHJvcGVybHkgY29uZmlndXJlZCBjb2RlYyAqLworCUFGX0JBRF9DT0RFQ19TVEFURSA9IDQ4LAkvKiBpbnZhbGlkIGNvZGVjIHN0YXRlOiBjYW4ndCByZWNvdmVyICovCisJQUZfQkFEX0NPREVDX0xJQ0VOU0UgPSA0OSwJLyogbm8gbGljZW5zZSBhdmFpbGFibGUgZm9yIGNvZGVjICovCisJQUZfQkFEX0NPREVDX1RZUEUgPSA1MCwJLyogdW5zdXBwb3J0ZWQgY29kZWMgdHlwZSAqLworCUFGX0JBRF9DT01QUkVTU0lPTiA9IEFGX0JBRF9DT0RFQ19DT05GSUcsCS8qIGZvciBiYWNrIGNvbXBhdCAqLworCUFGX0JBRF9DT01QVFlQRSA9IEFGX0JBRF9DT0RFQ19UWVBFLAkvKiBmb3IgYmFjayBjb21wYXQgKi8KKworCUFGX0JBRF9JTlNUUFRZUEUgPSA1MSwJLyogaW52YWxpZCBpbnN0cnVtZW50IHBhcmFtZXRlciB0eXBlICovCisJQUZfQkFEX0lOU1RQSUQgPSA1MiwJLyogaW52YWxpZCBpbnN0cnVtZW50IHBhcmFtZXRlciBpZCAqLworCUFGX0JBRF9CWVRFT1JERVIgPSA1MywKKwlBRl9CQURfRklMRUZNVF9QQVJBTSA9IDU0LAkvKiB1bnJlY29nbml6ZWQgZmlsZSBmb3JtYXQgcGFyYW1ldGVyICovCisJQUZfQkFEX0NPTVBfUEFSQU0gPSA1NSwJLyogdW5yZWNvZ25pemVkIGNvbXByZXNzaW9uIHBhcmFtZXRlciAqLworCUFGX0JBRF9EQVRBT0ZGU0VUID0gNTYsCS8qIGJhZCBkYXRhIG9mZnNldCAqLworCUFGX0JBRF9GUkFNRUNOVCA9IDU3LAkvKiBiYWQgZnJhbWUgY291bnQgKi8KKwlBRl9CQURfUVVFUllUWVBFID0gNTgsCS8qIGJhZCBxdWVyeSB0eXBlICovCisJQUZfQkFEX1FVRVJZID0gNTksCS8qIGJhZCBhcmd1bWVudCB0byBhZlF1ZXJ5KCkgKi8KKwlBRl9XQVJOSU5HX0NPREVDX1JBVEUgPSA2MCwJLyogdXNpbmcgOGsgaW5zdGVhZCBvZiBjb2RlYyByYXRlIDgwMTIgKi8KKwlBRl9XQVJOSU5HX1JBVEVDVlQgPSA2MSwJLyogd2FybmluZyBhYm91dCByYXRlIGNvbnZlcnNpb24gdXNlZCAqLworCisJQUZfQkFEX0hFQURFUiA9IDYyLAkvKiBmYWlsZWQgdG8gcGFyc2UgaGVhZGVyICovCisJQUZfQkFEX0ZSQU1FID0gNjMsCS8qIGJhZCBmcmFtZSBudW1iZXIgKi8KKwlBRl9CQURfTE9PUENPVU5UID0gNjQsCS8qIGJhZCBsb29wIGNvdW50ICovCisJQUZfQkFEX0RNRURJQV9DQUxMID0gNjUsCS8qIGVycm9yIGluIGRtZWRpYSBzdWJzeXN0ZW0gY2FsbCAqLworCisJLyogQUlGRi9BSUZGLUMgc3BlY2lmaWMgZXJyb3JzIHdoZW4gcGFyc2luZyBmaWxlIGhlYWRlciAqLworCUFGX0JBRF9BSUZGX0hFQURFUiA9IDEwOCwJLyogZmFpbGVkIHRvIHBhcnNlIGNodW5rIGhlYWRlciAqLworCUFGX0JBRF9BSUZGX0ZPUk0gPSAxMDksCS8qIGZhaWxlZCB0byBwYXJzZSBGT1JNIGNodW5rICovCisJQUZfQkFEX0FJRkZfU1NORCA9IDExMCwJLyogZmFpbGVkIHRvIHBhcnNlIFNTTkQgY2h1bmsgKi8KKwlBRl9CQURfQUlGRl9DSFVOS0lEID0gMTExLAkvKiB1bnJlY29nbml6ZWQgQUlGRi9BSUZGLUMgY2h1bmsgaWQgKi8KKwlBRl9CQURfQUlGRl9DT01NID0gMTEyLAkvKiBmYWlsZWQgdG8gcGFyc2UgQ09NTSBjaHVuayAqLworCUFGX0JBRF9BSUZGX0lOU1QgPSAxMTMsCS8qIGZhaWxlZCB0byBwYXJzZSBJTlNUIGNodW5rICovCisJQUZfQkFEX0FJRkZfTUFSSyA9IDExNCwJLyogZmFpbGVkIHRvIHBhcnNlIE1BUksgY2h1bmsgKi8KKwlBRl9CQURfQUlGRl9TS0lQID0gMTE1LAkvKiBmYWlsZWQgdG8gc2tpcCB1bnN1cHBvcnRlZCBjaHVuayAqLworCUFGX0JBRF9BSUZGX0xPT1BNT0RFID0gMTE2CS8qIHVucmVjb2duaXplZCBsb29wIG1vZGUgKGZvcncsIGV0YykqLworfTsKKworLyogbmV3IGVycm9yIGNvZGVzIHdoaWNoIG1heSBiZSByZXRyaWV2ZWQgdmlhIGRtR2V0RXJyb3IoKSAqLworLyogVGhlIG9sZCBlcnJvciB0b2tlbnMgY29udGludWUgdG8gYmUgcmV0cmlldmFibGUgdmlhIHRoZSBBRmVycm9yaGFuZGxlciAqLworLyogQUZfRVJSX0JBU0UgaXMgI2RlZmluZWQgaW4gZG1lZGlhL2RtZWRpYS5oICovCisKK2VudW0KK3sKKwlBRl9FUlJfTk9UX0lNUExFTUVOVEVEID0gMCtBRl9FUlJfQkFTRSwJLyogbm90IGltcGxlbWVudGVkIHlldCAqLworCUFGX0VSUl9CQURfRklMRUhBTkRMRSA9IDErQUZfRVJSX0JBU0UsCS8qIGludmFsaWQgZmlsZWhhbmRsZSAqLworCUFGX0VSUl9CQURfUkVBRCA9IDUrQUZfRVJSX0JBU0UsCS8qIHVuaXggcmVhZCBmYWlsZWQgKi8KKwlBRl9FUlJfQkFEX1dSSVRFID0gNitBRl9FUlJfQkFTRSwJLyogdW5peCB3cml0ZSBmYWlsZWQgKi8KKwlBRl9FUlJfQkFEX0xTRUVLID0gNytBRl9FUlJfQkFTRSwJLyogdW5peCBsc2VlayBmYWlsZWQgKi8KKwlBRl9FUlJfQkFEX0FDQ01PREUgPSAxMCtBRl9FUlJfQkFTRSwJLyogdW5yZWNvZ25pemVkIGF1ZGlvIGZpbGUgYWNjZXNzIG1vZGUgKi8KKwlBRl9FUlJfTk9fV1JJVEVBQ0MgPSAxMStBRl9FUlJfQkFTRSwJLyogZmlsZSBub3Qgb3BlbiBmb3Igd3JpdGluZyAqLworCUFGX0VSUl9OT19SRUFEQUNDID0gMTIrQUZfRVJSX0JBU0UsCS8qIGZpbGUgbm90IG9wZW4gZm9yIHJlYWRpbmcgKi8KKwlBRl9FUlJfQkFEX0ZJTEVGTVQgPSAxMytBRl9FUlJfQkFTRSwJLyogdW5yZWNvZ25pemVkIGF1ZGlvIGZpbGUgZm9ybWF0ICovCisJQUZfRVJSX0JBRF9SQVRFID0gMTQrQUZfRVJSX0JBU0UsCS8qIGludmFsaWQgc2FtcGxlIHJhdGUgKi8KKwlBRl9FUlJfQkFEX0NIQU5ORUxTID0gMTUrQUZfRVJSX0JBU0UsCS8qIGludmFsaWQgIyBjaGFubmVscyovCisJQUZfRVJSX0JBRF9TQU1QQ05UID0gMTYrQUZfRVJSX0JBU0UsCS8qIGludmFsaWQgc2FtcGxlIGNvdW50ICovCisJQUZfRVJSX0JBRF9XSURUSCA9IDE3K0FGX0VSUl9CQVNFLAkvKiBpbnZhbGlkIHNhbXBsZSB3aWR0aCAqLworCUFGX0VSUl9CQURfU0VFS01PREUgPSAxOCtBRl9FUlJfQkFTRSwJLyogaW52YWxpZCBzZWVrIG1vZGUgKi8KKwlBRl9FUlJfQkFEX0xPT1BJRCA9IDIxK0FGX0VSUl9CQVNFLAkvKiBpbnZhbGlkIGxvb3AgaWQgKi8KKwlBRl9FUlJfQkFEX1NBTVBGTVQgPSAyMitBRl9FUlJfQkFTRSwJLyogYmFkIHNhbXBsZSBmb3JtYXQgKi8KKwlBRl9FUlJfQkFEX0ZJTEVTRVRVUCA9IDIzK0FGX0VSUl9CQVNFLAkvKiBiYWQgZmlsZSBzZXR1cCBzdHJ1Y3R1cmUqLworCUFGX0VSUl9CQURfVFJBQ0tJRCA9IDI0K0FGX0VSUl9CQVNFLAkvKiBubyB0cmFjayBjb3JyZXNwb25kaW5nIHRvIGlkICovCisJQUZfRVJSX0JBRF9OVU1UUkFDS1MgPSAyNStBRl9FUlJfQkFTRSwJLyogd3JvbmcgbnVtYmVyIG9mIHRyYWNrcyBmb3IgZmlsZSBmb3JtYXQgKi8KKwlBRl9FUlJfQkFEX0xPT1BNT0RFID0gMjcrQUZfRVJSX0JBU0UsCS8qIHVucmVjb2duaXplZCBsb29wIG1vZGUgc3ltYm9sICovCisJQUZfRVJSX0JBRF9JTlNUSUQgPSAyOCtBRl9FUlJfQkFTRSwJLyogaW52YWxpZCBpbnN0cnVtZW50IGlkICovCisJQUZfRVJSX0JBRF9OVU1MT09QUyA9IDI5K0FGX0VSUl9CQVNFLAkvKiBiYWQgbnVtYmVyIG9mIGxvb3BzICovCisJQUZfRVJSX0JBRF9OVU1NQVJLUyA9IDMwK0FGX0VSUl9CQVNFLAkvKiBiYWQgbnVtYmVyIG9mIG1hcmtlcnMgKi8KKwlBRl9FUlJfQkFEX01BUktJRCA9IDMxK0FGX0VSUl9CQVNFLAkvKiBiYWQgbWFya2VyIGlkICovCisJQUZfRVJSX0JBRF9NQVJLUE9TID0gMzIrQUZfRVJSX0JBU0UsCS8qIGludmFsaWQgbWFya2VyIHBvc2l0aW9uIHZhbHVlICovCisJQUZfRVJSX0JBRF9OVU1JTlNUUyA9IDMzK0FGX0VSUl9CQVNFLAkvKiBpbnZhbGlkIG51bWJlciBvZiBpbnN0cnVtZW50cyAqLworCUFGX0VSUl9CQURfTk9BRVNEQVRBID0gMzQrQUZfRVJSX0JBU0UsCisJQUZfRVJSX0JBRF9NSVNDSUQgPSAzNStBRl9FUlJfQkFTRSwKKwlBRl9FUlJfQkFEX05VTU1JU0MgPSAzNitBRl9FUlJfQkFTRSwKKwlBRl9FUlJfQkFEX01JU0NTSVpFID0gMzcrQUZfRVJSX0JBU0UsCisJQUZfRVJSX0JBRF9NSVNDVFlQRSA9IDM4K0FGX0VSUl9CQVNFLAorCUFGX0VSUl9CQURfTUlTQ1NFRUsgPSAzOStBRl9FUlJfQkFTRSwKKwlBRl9FUlJfQkFEX1NUUkxFTiA9IDQwK0FGX0VSUl9CQVNFLAkvKiBpbnZhbGlkIHN0cmluZyBsZW5ndGggKi8KKwlBRl9FUlJfQkFEX1JBVEVDT05WID0gNDUrQUZfRVJSX0JBU0UsCisJQUZfRVJSX0JBRF9TWU5DRklMRSA9IDQ2K0FGX0VSUl9CQVNFLAorCUFGX0VSUl9CQURfQ09ERUNfQ09ORklHID0gNDcrQUZfRVJSX0JBU0UsCS8qIGltcHJvcGVybHkgY29uZmlndXJlZCBjb2RlYyAqLworCUFGX0VSUl9CQURfQ09ERUNfVFlQRSA9IDUwK0FGX0VSUl9CQVNFLAkvKiB1bnN1cHBvcnRlZCBjb2RlYyB0eXBlICovCisJQUZfRVJSX0JBRF9JTlNUUFRZUEUgPSA1MStBRl9FUlJfQkFTRSwJLyogaW52YWxpZCBpbnN0cnVtZW50IHBhcmFtZXRlciB0eXBlICovCisJQUZfRVJSX0JBRF9JTlNUUElEID0gNTIrQUZfRVJSX0JBU0UsCS8qIGludmFsaWQgaW5zdHJ1bWVudCBwYXJhbWV0ZXIgaWQgKi8KKworCUFGX0VSUl9CQURfQllURU9SREVSID0gNTMrQUZfRVJSX0JBU0UsCisJQUZfRVJSX0JBRF9GSUxFRk1UX1BBUkFNID0gNTQrQUZfRVJSX0JBU0UsCS8qIHVucmVjb2duaXplZCBmaWxlIGZvcm1hdCBwYXJhbWV0ZXIgKi8KKwlBRl9FUlJfQkFEX0NPTVBfUEFSQU0gPSA1NStBRl9FUlJfQkFTRSwJLyogdW5yZWNvZ25pemVkIGNvbXByZXNzaW9uIHBhcmFtZXRlciAqLworCUFGX0VSUl9CQURfREFUQU9GRlNFVCA9IDU2K0FGX0VSUl9CQVNFLAkvKiBiYWQgZGF0YSBvZmZzZXQgKi8KKwlBRl9FUlJfQkFEX0ZSQU1FQ05UID0gNTcrQUZfRVJSX0JBU0UsCS8qIGJhZCBmcmFtZSBjb3VudCAqLworCisJQUZfRVJSX0JBRF9RVUVSWVRZUEUgPSA1OCtBRl9FUlJfQkFTRSwJLyogYmFkIHF1ZXJ5IHR5cGUgKi8KKwlBRl9FUlJfQkFEX1FVRVJZID0gNTkrQUZfRVJSX0JBU0UsCS8qIGJhZCBhcmd1bWVudCB0byBhZlF1ZXJ5KCkgKi8KKwlBRl9FUlJfQkFEX0hFQURFUiA9IDYyK0FGX0VSUl9CQVNFLAkvKiBmYWlsZWQgdG8gcGFyc2UgaGVhZGVyICovCisJQUZfRVJSX0JBRF9GUkFNRSA9IDYzK0FGX0VSUl9CQVNFLAkvKiBiYWQgZnJhbWUgbnVtYmVyICovCisJQUZfRVJSX0JBRF9MT09QQ09VTlQgPSA2NCtBRl9FUlJfQkFTRSwJLyogYmFkIGxvb3AgY291bnQgKi8KKworCS8qIEFJRkYvQUlGRi1DIHNwZWNpZmljIGVycm9ycyB3aGVuIHBhcnNpbmcgZmlsZSBoZWFkZXIgKi8KKworCUFGX0VSUl9CQURfQUlGRl9IRUFERVIgPSA2NitBRl9FUlJfQkFTRSwJLyogZmFpbGVkIHRvIHBhcnNlIGNodW5rIGhlYWRlciAqLworCUFGX0VSUl9CQURfQUlGRl9GT1JNID0gNjcrQUZfRVJSX0JBU0UsCS8qIGZhaWxlZCB0byBwYXJzZSBGT1JNIGNodW5rICovCisJQUZfRVJSX0JBRF9BSUZGX1NTTkQgPSA2OCtBRl9FUlJfQkFTRSwJLyogZmFpbGVkIHRvIHBhcnNlIFNTTkQgY2h1bmsgKi8KKwlBRl9FUlJfQkFEX0FJRkZfQ0hVTktJRCA9IDY5K0FGX0VSUl9CQVNFLAkvKiB1bnJlY29nbml6ZWQgQUlGRi9BSUZGLUMgY2h1bmsgaWQgKi8KKwlBRl9FUlJfQkFEX0FJRkZfQ09NTSA9IDcwK0FGX0VSUl9CQVNFLAkvKiBmYWlsZWQgdG8gcGFyc2UgQ09NTSBjaHVuayAqLworCUFGX0VSUl9CQURfQUlGRl9JTlNUID0gNzErQUZfRVJSX0JBU0UsCS8qIGZhaWxlZCB0byBwYXJzZSBJTlNUIGNodW5rICovCisJQUZfRVJSX0JBRF9BSUZGX01BUksgPSA3MitBRl9FUlJfQkFTRSwJLyogZmFpbGVkIHRvIHBhcnNlIE1BUksgY2h1bmsgKi8KKwlBRl9FUlJfQkFEX0FJRkZfU0tJUCA9IDczK0FGX0VSUl9CQVNFLAkvKiBmYWlsZWQgdG8gc2tpcCB1bnN1cHBvcnRlZCBjaHVuayAqLworCUFGX0VSUl9CQURfQUlGRl9MT09QTU9ERSA9IDc0K0FGX0VSUl9CQVNFCS8qIHVucmVjb2duaXplZCBsb29wIG1vZGUgKGZvcncsIGV0YykgKi8KK307CisKKworLyogZ2xvYmFsIHJvdXRpbmVzICovCitBRmVycmZ1bmMgYWZTZXRFcnJvckhhbmRsZXIgKEFGZXJyZnVuYyBlZnVuYyk7CisKKy8qIHF1ZXJ5IHJvdXRpbmVzICovCitBVXB2bGlzdCBhZlF1ZXJ5IChpbnQgcXVlcnl0eXBlLCBpbnQgYXJnMSwgaW50IGFyZzIsIGludCBhcmczLCBpbnQgYXJnNCk7Citsb25nIGFmUXVlcnlMb25nIChpbnQgcXVlcnl0eXBlLCBpbnQgYXJnMSwgaW50IGFyZzIsIGludCBhcmczLCBpbnQgYXJnNCk7Citkb3VibGUgYWZRdWVyeURvdWJsZSAoaW50IHF1ZXJ5dHlwZSwgaW50IGFyZzEsIGludCBhcmcyLCBpbnQgYXJnMywgaW50IGFyZzQpOwordm9pZCAqYWZRdWVyeVBvaW50ZXIgKGludCBxdWVyeXR5cGUsIGludCBhcmcxLCBpbnQgYXJnMiwgaW50IGFyZzMsIGludCBhcmc0KTsKKworLyogYmFzaWMgb3BlcmF0aW9ucyBvbiBmaWxlIGhhbmRsZXMgYW5kIGZpbGUgc2V0dXBzICovCitBRmZpbGVzZXR1cCBhZk5ld0ZpbGVTZXR1cCAodm9pZCk7Cit2b2lkIGFmRnJlZUZpbGVTZXR1cCAoQUZmaWxlc2V0dXApOworaW50IGFmSWRlbnRpZnlGRCAoaW50KTsKK2ludCBhZklkZW50aWZ5TmFtZWRGRCAoaW50LCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50ICppbXBsZW1lbnRlZCk7CisKK0FGZmlsZWhhbmRsZSBhZk9wZW5GaWxlIChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSwKKwlBRmZpbGVzZXR1cCBzZXR1cCk7CitBRmZpbGVoYW5kbGUgYWZPcGVuVmlydHVhbEZpbGUgKEFGdmlydHVhbGZpbGUgKnZmaWxlLCBjb25zdCBjaGFyICptb2RlLAorCUFGZmlsZXNldHVwIHNldHVwKTsKK0FGZmlsZWhhbmRsZSBhZk9wZW5GRCAoaW50IGZkLCBjb25zdCBjaGFyICptb2RlLCBBRmZpbGVzZXR1cCBzZXR1cCk7CitBRmZpbGVoYW5kbGUgYWZPcGVuTmFtZWRGRCAoaW50IGZkLCBjb25zdCBjaGFyICptb2RlLCBBRmZpbGVzZXR1cCBzZXR1cCwKKwljb25zdCBjaGFyICpmaWxlbmFtZSk7CisKK3ZvaWQgYWZTYXZlRmlsZVBvc2l0aW9uIChBRmZpbGVoYW5kbGUgZmlsZSk7Cit2b2lkIGFmUmVzdG9yZUZpbGVQb3NpdGlvbiAoQUZmaWxlaGFuZGxlIGZpbGUpOworaW50IGFmU3luY0ZpbGUgKEFGZmlsZWhhbmRsZSBmaWxlKTsKK2ludCBhZkNsb3NlRmlsZSAoQUZmaWxlaGFuZGxlIGZpbGUpOworCit2b2lkIGFmSW5pdEZpbGVGb3JtYXQgKEFGZmlsZXNldHVwLCBpbnQgZm9ybWF0KTsKK2ludCBhZkdldEZpbGVGb3JtYXQgKEFGZmlsZWhhbmRsZSwgaW50ICp2ZXJzaW9uKTsKKworLyogdHJhY2sgKi8KK3ZvaWQgYWZJbml0VHJhY2tJRHMgKEFGZmlsZXNldHVwLCBjb25zdCBpbnQgKnRyYWNraWRzLCBpbnQgdHJhY2tDb3VudCk7CitpbnQgYWZHZXRUcmFja0lEcyAoQUZmaWxlaGFuZGxlLCBpbnQgKnRyYWNraWRzKTsKKworLyogdHJhY2sgZGF0YTogcmVhZGluZywgd3JpdG5nLCBzZWVraW5nLCBzaXppbmcgZnJhbWVzICovCitpbnQgYWZSZWFkRnJhbWVzIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgdm9pZCAqYnVmZmVyLCBpbnQgZnJhbWVDb3VudCk7CitpbnQgYWZXcml0ZUZyYW1lcyAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIGNvbnN0IHZvaWQgKmJ1ZmZlciwgaW50IGZyYW1lQ291bnQpOworQUZmcmFtZWNvdW50IGFmU2Vla0ZyYW1lIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgQUZmcmFtZWNvdW50IGZyYW1lb2Zmc2V0KTsKK0FGZnJhbWVjb3VudCBhZlRlbGxGcmFtZSAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2spOworQUZmaWxlb2Zmc2V0IGFmR2V0VHJhY2tCeXRlcyAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2spOworZmxvYXQgYWZHZXRGcmFtZVNpemUgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLCBpbnQgZXhwYW5kM3RvNCk7CitmbG9hdCBhZkdldFZpcnR1YWxGcmFtZVNpemUgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLCBpbnQgZXhwYW5kM3RvNCk7CisKKy8qIHRyYWNrIGRhdGE6IEFFUyBkYXRhICovCisvKiBhZkluaXRBRVNDaGFubmVsRGF0YSBpcyBvYnNvbGV0ZSAtLSB1c2UgYWZJbml0QUVTQ2hhbm5lbERhdGFUbygpICovCit2b2lkIGFmSW5pdEFFU0NoYW5uZWxEYXRhIChBRmZpbGVzZXR1cCwgaW50IHRyYWNrKTsgLyogb2Jzb2xldGUgKi8KK3ZvaWQgYWZJbml0QUVTQ2hhbm5lbERhdGFUbyAoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgaW50IHdpbGxCZURhdGEpOworaW50IGFmR2V0QUVTQ2hhbm5lbERhdGEgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLCB1bnNpZ25lZCBjaGFyIGJ1ZlsyNF0pOwordm9pZCBhZlNldEFFU0NoYW5uZWxEYXRhIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgdW5zaWduZWQgY2hhciBidWZbMjRdKTsKKworLyogdHJhY2sgZGF0YTogYnl0ZSBvcmRlciAqLwordm9pZCBhZkluaXRCeXRlT3JkZXIgKEFGZmlsZXNldHVwLCBpbnQgdHJhY2ssIGludCBieXRlT3JkZXIpOworaW50IGFmR2V0Qnl0ZU9yZGVyIChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CitpbnQgYWZTZXRWaXJ0dWFsQnl0ZU9yZGVyIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgaW50IGJ5dGVPcmRlcik7CitpbnQgYWZHZXRWaXJ0dWFsQnl0ZU9yZGVyIChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CisKKy8qIHRyYWNrIGRhdGE6IG51bWJlciBvZiBjaGFubmVscyAqLwordm9pZCBhZkluaXRDaGFubmVscyAoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgaW50IG5jaGFubmVscyk7CitpbnQgYWZHZXRDaGFubmVscyAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2spOworaW50IGFmU2V0VmlydHVhbENoYW5uZWxzIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgaW50IGNoYW5uZWxDb3VudCk7CitpbnQgYWZHZXRWaXJ0dWFsQ2hhbm5lbHMgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrKTsKK3ZvaWQgYWZTZXRDaGFubmVsTWF0cml4IChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgZG91YmxlICptYXRyaXgpOworCisvKiB0cmFjayBkYXRhOiBzYW1wbGUgZm9ybWF0IGFuZCBzYW1wbGUgd2lkdGggKi8KK3ZvaWQgYWZJbml0U2FtcGxlRm9ybWF0IChBRmZpbGVzZXR1cCwgaW50IHRyYWNrLCBpbnQgc2FtcGxlRm9ybWF0LAorCWludCBzYW1wbGVXaWR0aCk7Cit2b2lkIGFmR2V0U2FtcGxlRm9ybWF0IChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IHRyYWNrLCBpbnQgKnNhbXBsZUZvcm1hdCwKKwlpbnQgKnNhbXBsZVdpZHRoKTsKK2ludCBhZlNldFZpcnR1YWxTYW1wbGVGb3JtYXQgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLAorCWludCBzYW1wbGVGb3JtYXQsIGludCBzYW1wbGVXaWR0aCk7Cit2b2lkIGFmR2V0VmlydHVhbFNhbXBsZUZvcm1hdCAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssCisJaW50ICpzYW1wbGVGb3JtYXQsIGludCAqc2FtcGxlV2lkdGgpOworCisvKiB0cmFjayBkYXRhOiBzYW1wbGluZyByYXRlICovCit2b2lkIGFmSW5pdFJhdGUgKEFGZmlsZXNldHVwLCBpbnQgdHJhY2ssIGRvdWJsZSByYXRlKTsKK2RvdWJsZSBhZkdldFJhdGUgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrKTsKKworI2lmIDAKK2ludCBhZlNldFZpcnR1YWxSYXRlIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgZG91YmxlIHJhdGUpOworZG91YmxlIGFmR2V0VmlydHVhbFJhdGUgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrKTsKKyNlbmRpZgorCisvKiB0cmFjayBkYXRhOiBjb21wcmVzc2lvbiAqLwordm9pZCBhZkluaXRDb21wcmVzc2lvbiAoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgaW50IGNvbXByZXNzaW9uKTsKKyNpZiAwCit2b2lkIGFmSW5pdENvbXByZXNzaW9uUGFyYW1zIChBRmZpbGVzZXR1cCwgaW50IHRyYWNrLCBpbnQgY29tcHJlc3Npb24KKwlBVXB2bGlzdCBwYXJhbXMsIGludCBwYXJhbWV0ZXJDb3VudCk7CisjZW5kaWYKKworaW50IGFmR2V0Q29tcHJlc3Npb24gKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrKTsKKyNpZiAwCit2b2lkIGFmR2V0Q29tcHJlc3Npb25QYXJhbXMgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLCBpbnQgKmNvbXByZXNzaW9uLAorCUFVcHZsaXN0IHBhcmFtcywgaW50IHBhcmFtZXRlckNvdW50KTsKKworaW50IGFmU2V0VmlydHVhbENvbXByZXNzaW9uIChBRmZpbGVzZXR1cCwgaW50IHRyYWNrLCBpbnQgY29tcHJlc3Npb24pOwordm9pZCBhZlNldFZpcnR1YWxDb21wcmVzc2lvblBhcmFtcyAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIGludCBjb21wcmVzc2lvbiwKKwlBVXB2bGlzdCBwYXJhbXMsIGludCBwYXJhbWV0ZXJDb3VudCk7CisKK2ludCBhZkdldFZpcnR1YWxDb21wcmVzc2lvbiAoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgaW50IGNvbXByZXNzaW9uKTsKK3ZvaWQgYWZHZXRWaXJ0dWFsQ29tcHJlc3Npb25QYXJhbXMgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLCBpbnQgKmNvbXByZXNzaW9uLAorCUFVcHZsaXN0IHBhcmFtcywgaW50IHBhcmFtZXRlckNvdW50KTsKKyNlbmRpZgorCisvKiB0cmFjayBkYXRhOiBwY20gbWFwcGluZyAqLwordm9pZCBhZkluaXRQQ01NYXBwaW5nIChBRmZpbGVzZXR1cCBmaWxlc2V0dXAsIGludCB0cmFjaywKKwlkb3VibGUgc2xvcGUsIGRvdWJsZSBpbnRlcmNlcHQsIGRvdWJsZSBtaW5DbGlwLCBkb3VibGUgbWF4Q2xpcCk7Cit2b2lkIGFmR2V0UENNTWFwcGluZyAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCB0cmFjaywKKwlkb3VibGUgKnNsb3BlLCBkb3VibGUgKmludGVyY2VwdCwgZG91YmxlICptaW5DbGlwLCBkb3VibGUgKm1heENsaXApOworLyogTk9URTogYWZTZXRUcmFja1BDTU1hcHBpbmcoKSBpcyBzcGVjaWFsLS1pdCBkb2VzIG5vdCBzZXQgdGhlIHZpcnR1YWwgICovCisvKiBmb3JtYXQ7IGl0IGNoYW5nZXMgd2hhdCB0aGUgQUYgdGhpbmtzIHRoZSB0cmFjayBmb3JtYXQgaXMhIEJlIGNhcmVmdWwuICovCitpbnQgYWZTZXRUcmFja1BDTU1hcHBpbmcgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgdHJhY2ssCisJZG91YmxlIHNsb3BlLCBkb3VibGUgaW50ZXJjZXB0LCBkb3VibGUgbWluQ2xpcCwgZG91YmxlIG1heENsaXApOworLyogTk9URTogYWZTZXRWaXJ0dWFsUENNTWFwcGluZygpIGlzIGRpZmZlcmVudCBmcm9tIGFmU2V0VHJhY2tQQ01NYXBwaW5nKCk6ICovCisvKiBzZWUgY29tbWVudCBmb3IgYWZTZXRUcmFja1BDTU1hcHBpbmcoKS4gKi8KK2ludCBhZlNldFZpcnR1YWxQQ01NYXBwaW5nIChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IHRyYWNrLAorCWRvdWJsZSBzbG9wZSwgZG91YmxlIGludGVyY2VwdCwgZG91YmxlIG1pbkNsaXAsIGRvdWJsZSBtYXhDbGlwKTsKK3ZvaWQgYWZHZXRWaXJ0dWFsUENNTWFwcGluZyAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCB0cmFjaywKKwlkb3VibGUgKnNsb3BlLCBkb3VibGUgKmludGVyY2VwdCwgZG91YmxlICptaW5DbGlwLCBkb3VibGUgKm1heENsaXApOworCisvKiB0cmFjayBkYXRhOiBkYXRhIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUgKi8KKy8qIGluaXRpYWxpemUgZm9yIHJhdyByZWFkaW5nIG9ubHkgKi8KK3ZvaWQgYWZJbml0RGF0YU9mZnNldChBRmZpbGVzZXR1cCwgaW50IHRyYWNrLCBBRmZpbGVvZmZzZXQgb2Zmc2V0KTsKK0FGZmlsZW9mZnNldCBhZkdldERhdGFPZmZzZXQgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrKTsKKworLyogdHJhY2sgZGF0YTogY291bnQgb2YgZnJhbWVzIGluIGZpbGUgKi8KK3ZvaWQgYWZJbml0RnJhbWVDb3VudCAoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgQUZmcmFtZWNvdW50IGZyYW1lQ291bnQpOworQUZmcmFtZWNvdW50IGFmR2V0RnJhbWVDb3VudCAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCB0cmFjayk7CisKKy8qIGxvb3Agb3BlcmF0aW9ucyAqLwordm9pZCBhZkluaXRMb29wSURzIChBRmZpbGVzZXR1cCwgaW50IGluc3RpZCwgY29uc3QgaW50ICppZHMsIGludCBuaWRzKTsKK2ludCBhZkdldExvb3BJRHMgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3BpZHNbXSk7Cit2b2lkIGFmU2V0TG9vcE1vZGUgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3AsIGludCBtb2RlKTsKK2ludCBhZkdldExvb3BNb2RlIChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29waWQpOworaW50IGFmU2V0TG9vcENvdW50IChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29wLCBpbnQgY291bnQpOworaW50IGFmR2V0TG9vcENvdW50IChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29waWQpOwordm9pZCBhZlNldExvb3BTdGFydCAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcGlkLCBpbnQgbWFya2VyaWQpOworaW50IGFmR2V0TG9vcFN0YXJ0IChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29waWQpOwordm9pZCBhZlNldExvb3BFbmQgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3BpZCwgaW50IG1hcmtlcmlkKTsKK2ludCBhZkdldExvb3BFbmQgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3BpZCk7CisKK2ludCBhZlNldExvb3BTdGFydEZyYW1lIChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29wLAorCUFGZnJhbWVjb3VudCBzdGFydEZyYW1lKTsKK0FGZnJhbWVjb3VudCBhZkdldExvb3BTdGFydEZyYW1lIChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29wKTsKK2ludCBhZlNldExvb3BFbmRGcmFtZSAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcCwKKwlBRmZyYW1lY291bnQgc3RhcnRGcmFtZSk7CitBRmZyYW1lY291bnQgYWZHZXRMb29wRW5kRnJhbWUgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3ApOworCit2b2lkIGFmU2V0TG9vcFRyYWNrIChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29waWQsIGludCB0cmFja2lkKTsKK2ludCBhZkdldExvb3BUcmFjayAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcGlkKTsKKworLyogbWFya2VyIG9wZXJhdGlvbnMgKi8KK3ZvaWQgYWZJbml0TWFya0lEcyAoQUZmaWxlc2V0dXAsIGludCB0cmFja2lkLCBjb25zdCBpbnQgKmlkcywgaW50IG5pZHMpOworaW50IGFmR2V0TWFya0lEcyAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCB0cmFja2lkLCBpbnQgbWFya2lkc1tdKTsKK3ZvaWQgYWZTZXRNYXJrUG9zaXRpb24gKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgdHJhY2tpZCwgaW50IG1hcmtpZCwKKwlBRmZyYW1lY291bnQgbWFya3Bvcyk7CitBRmZyYW1lY291bnQgYWZHZXRNYXJrUG9zaXRpb24gKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgdHJhY2tpZCwgaW50IG1hcmtpZCk7Cit2b2lkIGFmSW5pdE1hcmtOYW1lIChBRmZpbGVzZXR1cCwgaW50IHRyYWNraWQsIGludCBtYXJrZXIsIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBhZkluaXRNYXJrQ29tbWVudCAoQUZmaWxlc2V0dXAsIGludCB0cmFja2lkLCBpbnQgbWFya2VyLAorCWNvbnN0IGNoYXIgKmNvbW1lbnQpOworY2hhciAqYWZHZXRNYXJrTmFtZSAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCB0cmFja2lkLCBpbnQgbWFya2lkKTsKK2NoYXIgKmFmR2V0TWFya0NvbW1lbnQgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgdHJhY2tpZCwgaW50IG1hcmtpZCk7CisKKy8qIGluc3RydW1lbnQgb3BlcmF0aW9ucyAqLwordm9pZCBhZkluaXRJbnN0SURzIChBRmZpbGVzZXR1cCwgY29uc3QgaW50ICppZHMsIGludCBuaWRzKTsKK2ludCBhZkdldEluc3RJRHMgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgKmluc3RpZHMpOwordm9pZCBhZkdldEluc3RQYXJhbXMgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgaW5zdGlkLCBBVXB2bGlzdCBwdmxpc3QsCisJaW50IG5wYXJhbXMpOwordm9pZCBhZlNldEluc3RQYXJhbXMgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgaW5zdGlkLCBBVXB2bGlzdCBwdmxpc3QsCisJaW50IG5wYXJhbXMpOworbG9uZyBhZkdldEluc3RQYXJhbUxvbmcgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgaW5zdGlkLCBpbnQgcGFyYW0pOwordm9pZCBhZlNldEluc3RQYXJhbUxvbmcgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgaW5zdGlkLCBpbnQgcGFyYW0sIGxvbmcgdmFsdWUpOworCisvKiBtaXNjZWxsYW5lb3VzIGRhdGEgb3BlcmF0aW9ucyAqLwordm9pZCBhZkluaXRNaXNjSURzIChBRmZpbGVzZXR1cCwgY29uc3QgaW50ICppZHMsIGludCBuaWRzKTsKK2ludCBhZkdldE1pc2NJRHMgKEFGZmlsZWhhbmRsZSwgaW50ICppZHMpOwordm9pZCBhZkluaXRNaXNjVHlwZSAoQUZmaWxlc2V0dXAsIGludCBtaXNjZWxsYW5lb3VzaWQsIGludCB0eXBlKTsKK2ludCBhZkdldE1pc2NUeXBlIChBRmZpbGVoYW5kbGUsIGludCBtaXNjZWxsYW5lb3VzaWQpOwordm9pZCBhZkluaXRNaXNjU2l6ZSAoQUZmaWxlc2V0dXAsIGludCBtaXNjZWxsYW5lb3VzaWQsIGludCBzaXplKTsKK2ludCBhZkdldE1pc2NTaXplIChBRmZpbGVoYW5kbGUsIGludCBtaXNjZWxsYW5lb3VzaWQpOworaW50IGFmV3JpdGVNaXNjIChBRmZpbGVoYW5kbGUsIGludCBtaXNjZWxsYW5lb3VzaWQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGJ5dGVzKTsKK2ludCBhZlJlYWRNaXNjIChBRmZpbGVoYW5kbGUsIGludCBtaXNjZWxsYW5lb3VzaWQsIHZvaWQgKmJ1ZiwgaW50IGJ5dGVzKTsKK2ludCBhZlNlZWtNaXNjIChBRmZpbGVoYW5kbGUsIGludCBtaXNjZWxsYW5lb3VzaWQsIGludCBvZmZzZXQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQVVESU9GSUxFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXVwdmxpc3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXVwdmxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjg2ZjQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9hdXB2bGlzdC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisJQXVkaW8gRmlsZSBMaWJyYXJ5CisJQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAsIE1pY2hhZWwgUHJ1ZXR0IDxtaWNoYWVsQDY4ay5vcmc+CisKKwlUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKwlMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKwl2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKwlUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKwlidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisJTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisJQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBLgorKi8KKworLyoKKwlhdXB2bGlzdC5oCisKKwlUaGlzIGZpbGUgY29udGFpbnMgdGhlIGludGVyZmFjZSB0byB0aGUgcGFyYW1ldGVyIHZhbHVlIGxpc3QgZGF0YQorCXN0cnVjdHVyZXMgYW5kIHJvdXRpbmVzLgorKi8KKworI2lmbmRlZiBBVVBWTElTVF9ICisjZGVmaW5lIEFVUFZMSVNUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworZW51bQoreworCUFVX1BWVFlQRV9MT05HID0gMSwKKwlBVV9QVlRZUEVfRE9VQkxFID0gMiwKKwlBVV9QVlRZUEVfUFRSID0gMworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0FVcHZsaXN0ICpBVXB2bGlzdDsKKworI2RlZmluZSBBVV9OVUxMX1BWTElTVCAoKHN0cnVjdCBfQVVwdmxpc3QgKikgMCkKKworQVVwdmxpc3QgQVVwdm5ldyAoaW50IG1heEl0ZW1zKTsKK2ludCBBVXB2Z2V0bWF4aXRlbXMgKEFVcHZsaXN0KTsKK2ludCBBVXB2ZnJlZSAoQVVwdmxpc3QpOworaW50IEFVcHZzZXRwYXJhbSAoQVVwdmxpc3QsIGludCBpdGVtLCBpbnQgcGFyYW0pOworaW50IEFVcHZzZXR2YWx0eXBlIChBVXB2bGlzdCwgaW50IGl0ZW0sIGludCB0eXBlKTsKK2ludCBBVXB2c2V0dmFsIChBVXB2bGlzdCwgaW50IGl0ZW0sIHZvaWQgKnZhbCk7CitpbnQgQVVwdmdldHBhcmFtIChBVXB2bGlzdCwgaW50IGl0ZW0sIGludCAqcGFyYW0pOworaW50IEFVcHZnZXR2YWx0eXBlIChBVXB2bGlzdCwgaW50IGl0ZW0sIGludCAqdHlwZSk7CitpbnQgQVVwdmdldHZhbCAoQVVwdmxpc3QsIGludCBpdGVtLCB2b2lkICp2YWwpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogQVVQVkxJU1RfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ieXRlc3dhcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ieXRlc3dhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MWQ0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2J5dGVzd2FwLmgKQEAgLTAsMCArMSw0MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9CWVRFU1dBUF9ICisjZGVmaW5lIF9CWVRFU1dBUF9ICTEKKworLyogR2V0IHRoZSBtYWNoaW5lIHNwZWNpZmljLCBvcHRpbWl6ZWQgZGVmaW5pdGlvbnMuICAqLworI2luY2x1ZGUgPGJpdHMvYnl0ZXN3YXAuaD4KKworCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIG11c3QgYWxsIGJlIG1hY3JvcyBzaW5jZSBvdGhlcndpc2Ugc29tZQorICAgb2YgdGhlIHBvc3NpYmxlIG9wdGltaXphdGlvbnMgYXJlIG5vdCBwb3NzaWJsZS4gICovCisKKy8qIFJldHVybiBhIHZhbHVlIHdpdGggYWxsIGJ5dGVzIGluIHRoZSAxNiBiaXQgYXJndW1lbnQgc3dhcHBlZC4gICovCisjZGVmaW5lIGJzd2FwXzE2KHgpIF9fYnN3YXBfMTYgKHgpCisKKy8qIFJldHVybiBhIHZhbHVlIHdpdGggYWxsIGJ5dGVzIGluIHRoZSAzMiBiaXQgYXJndW1lbnQgc3dhcHBlZC4gICovCisjZGVmaW5lIGJzd2FwXzMyKHgpIF9fYnN3YXBfMzIgKHgpCisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKy8qIFJldHVybiBhIHZhbHVlIHdpdGggYWxsIGJ5dGVzIGluIHRoZSA2NCBiaXQgYXJndW1lbnQgc3dhcHBlZC4gICovCisjIGRlZmluZSBic3dhcF82NCh4KSBfX2Jzd2FwXzY0ICh4KQorI2VuZGlmCisKKyNlbmRpZiAvKiBieXRlc3dhcC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2NvbXBsZXguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvY29tcGxleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZmUwZTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2NvbXBsZXguaApAQCAtMCwwICsxLDExNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDA2LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OTogIDcuMyBDb21wbGV4IGFyaXRobWV0aWMJPGNvbXBsZXguaD4KKyAqLworCisjaWZuZGVmIF9DT01QTEVYX0gKKyNkZWZpbmUgX0NPTVBMRVhfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgZ2VuZXJhbCBhbmQgSVNPIEM5OSBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCisjaW5jbHVkZSA8Yml0cy9tYXRoZGVmLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogV2UgbWlnaHQgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IgbW9yZSBjb21waWxlcnMgaGVyZS4gIEJ1dCBzaW5jZSBJU08KKyAgIEM5OSBpcyBvdXQgaG9wZWZ1bGx5IGFsbCBtYWludGFpbmVkIGNvbXBpbGVycyB3aWxsIHNvb24gcHJvdmlkZSB0aGUgZGF0YQorICAgdHlwZXMgYGZsb2F0IGNvbXBsZXgnIGFuZCBgZG91YmxlIGNvbXBsZXgnLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgyLCA3KSAmJiAhX19HTlVDX1BSRVJFUSAoMiwgOTcpCisjIGRlZmluZSBfQ29tcGxleCBfX2NvbXBsZXhfXworI2VuZGlmCisKKyNkZWZpbmUgY29tcGxleAkJX0NvbXBsZXgKKworLyogTmFycm93ZXN0IGltYWdpbmFyeSB1bml0LiAgVGhpcyBkZXBlbmRzIG9uIHRoZSBmbG9hdGluZy1wb2ludAorICAgZXZhbHVhdGlvbiBtZXRob2QuCisgICBYWFggVGhpcyBwcm9iYWJseSBoYXMgdG8gZ28gaW50byBhIGdjYyByZWxhdGVkIGZpbGUuICAqLworI2RlZmluZSBfQ29tcGxleF9JCShfX2V4dGVuc2lvbl9fIDEuMGlGKQorCisvKiBBbm90aGVyIG1vcmUgZGVzY3JpcHRpdmUgbmFtZSBpcyBgSScuCisgICBYWFggT25jZSB3ZSBoYXZlIHRoZSBpbWFnaW5hcnkgc3VwcG9ydCBzd2l0Y2ggdGhpcyB0byBfSW1hZ2luYXJ5X0kuICAqLworI3VuZGVmIEkKKyNkZWZpbmUgSSBfQ29tcGxleF9JCisKKy8qIFRoZSBmaWxlIDxiaXRzL2NtYXRoY2FsbHMuaD4gY29udGFpbnMgdGhlIHByb3RvdHlwZXMgZm9yIGFsbCB0aGUKKyAgIGFjdHVhbCBtYXRoIGZ1bmN0aW9ucy4gIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgdGhvc2UgcHJvdG90eXBlcywKKyAgIHNvIHdlIGNhbiBlYXNpbHkgZGVjbGFyZSBlYWNoIGZ1bmN0aW9uIGFzIGJvdGggYG5hbWUnIGFuZCBgX19uYW1lJywKKyAgIGFuZCBjYW4gZGVjbGFyZSB0aGUgZmxvYXQgdmVyc2lvbnMgYG5hbWVmJyBhbmQgYF9fbmFtZWYnLiAgKi8KKworI2RlZmluZSBfX01BVEhDQUxMKGZ1bmN0aW9uLCBhcmdzKQlcCisgIF9fTUFUSERFQ0wgKF9NZG91YmxlX2NvbXBsZXhfLGZ1bmN0aW9uLCBhcmdzKQorI2RlZmluZSBfX01BVEhERUNMKHR5cGUsIGZ1bmN0aW9uLCBhcmdzKSBcCisgIF9fTUFUSERFQ0xfMSh0eXBlLCBmdW5jdGlvbiwgYXJncyk7IFwKKyAgX19NQVRIREVDTF8xKHR5cGUsIF9fQ09OQ0FUKF9fLGZ1bmN0aW9uKSwgYXJncykKKyNkZWZpbmUgX19NQVRIREVDTF8xKHR5cGUsIGZ1bmN0aW9uLCBhcmdzKSBcCisgIGV4dGVybiB0eXBlIF9fTUFUSF9QUkVDTkFNRShmdW5jdGlvbikgYXJncyBfX1RIUk9XCisKKyNkZWZpbmUgX01kb3VibGVfIAkJZG91YmxlCisjZGVmaW5lIF9fTUFUSF9QUkVDTkFNRShuYW1lKQluYW1lCisjaW5jbHVkZSA8Yml0cy9jbWF0aGNhbGxzLmg+CisjdW5kZWYJX01kb3VibGVfCisjdW5kZWYJX19NQVRIX1BSRUNOQU1FCisKKy8qIE5vdyB0aGUgZmxvYXQgdmVyc2lvbnMuICAqLworI2lmbmRlZiBfTWZsb2F0XworIyBkZWZpbmUgX01mbG9hdF8JCWZsb2F0CisjZW5kaWYKKyNkZWZpbmUgX01kb3VibGVfIAkJX01mbG9hdF8KKyNpZmRlZiBfX1NURENfXworIyBkZWZpbmUgX19NQVRIX1BSRUNOQU1FKG5hbWUpCW5hbWUjI2YKKyNlbHNlCisjIGRlZmluZSBfX01BVEhfUFJFQ05BTUUobmFtZSkJbmFtZS8qKi9mCisjZW5kaWYKKyNpbmNsdWRlIDxiaXRzL2NtYXRoY2FsbHMuaD4KKyN1bmRlZglfTWRvdWJsZV8KKyN1bmRlZglfX01BVEhfUFJFQ05BTUUKKworLyogQW5kIHRoZSBsb25nIGRvdWJsZSB2ZXJzaW9ucy4gIEl0IGlzIG5vbi1jcml0aWNhbCB0byBkZWZpbmUgdGhlbQorICAgaGVyZSB1bmNvbmRpdGlvbmFsbHkgc2luY2UgYGxvbmcgZG91YmxlJyBpcyByZXF1aXJlZCBpbiBJU08gQzk5LiAgKi8KKyNpZiAoX19TVERDX18gLSAwIHx8IF9fR05VQ19fIC0gMCkgXAorICAgICYmICghKGRlZmluZWQgX19OT19MT05HX0RPVUJMRV9NQVRIICYmIGRlZmluZWQgX0xJQkMpIFwKKwl8fCBkZWZpbmVkIF9fTERCTF9DT01QQVQpCisjIGlmIGRlZmluZWQgX19MREJMX0NPTVBBVCB8fCBkZWZpbmVkIF9fTk9fTE9OR19ET1VCTEVfTUFUSAorIyAgdW5kZWYgX19NQVRIREVDTF8xCisjICBkZWZpbmUgX19NQVRIREVDTF8xKHR5cGUsIGZ1bmN0aW9uLCBhcmdzKSBcCisgIGV4dGVybiB0eXBlIF9fUkVESVJFQ1RfTlRIKF9fTUFUSF9QUkVDTkFNRShmdW5jdGlvbiksIGFyZ3MsIGZ1bmN0aW9uKQorIyBlbmRpZgorCisjIGlmbmRlZiBfTWxvbmdfZG91YmxlXworIyAgZGVmaW5lIF9NbG9uZ19kb3VibGVfCWxvbmcgZG91YmxlCisjIGVuZGlmCisjIGRlZmluZSBfTWRvdWJsZV8gCQlfTWxvbmdfZG91YmxlXworIyBpZmRlZiBfX1NURENfXworIyAgZGVmaW5lIF9fTUFUSF9QUkVDTkFNRShuYW1lKQluYW1lIyNsCisjIGVsc2UKKyMgIGRlZmluZSBfX01BVEhfUFJFQ05BTUUobmFtZSkJbmFtZS8qKi9sCisjIGVuZGlmCisjIGluY2x1ZGUgPGJpdHMvY21hdGhjYWxscy5oPgorI2VuZGlmCisjdW5kZWYJX01kb3VibGVfCisjdW5kZWYJX19NQVRIX1BSRUNOQU1FCisjdW5kZWYJX19NQVRIREVDTF8xCisjdW5kZWYJX19NQVRIREVDTAorI3VuZGVmCV9fTUFUSENBTEwKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGNvbXBsZXguaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9jcGlvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2NwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWUzMjc1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9jcGlvLmgKQEAgLTAsMCArMSw3NCBAQAorLyogRXh0ZW5kZWQgY3BpbyBmb3JtYXQgZnJvbSBQT1NJWC4xLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBOT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgY3Bpby4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0NQSU9fSAorI2RlZmluZSBfQ1BJT19IIDEKKworLyogQSBjcGlvIGFyY2hpdmUgY29uc2lzdHMgb2YgYSBzZXF1ZW5jZSBvZiBmaWxlcy4KKyAgIEVhY2ggZmlsZSBoYXMgYSA3NiBieXRlIGhlYWRlciwKKyAgIGEgdmFyaWFibGUgbGVuZ3RoLCBOVUwgdGVybWluYXRlZCBmaWxlbmFtZSwKKyAgIGFuZCB2YXJpYWJsZSBsZW5ndGggZmlsZSBkYXRhLgorICAgQSBoZWFkZXIgZm9yIGEgZmlsZW5hbWUgIlRSQUlMRVIhISEiIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLiAgKi8KKworLyogQWxsIHRoZSBmaWVsZHMgaW4gdGhlIGhlYWRlciBhcmUgSVNPIDY0NiAoYXBwcm94aW1hdGVseSBBU0NJSSkgc3RyaW5ncworICAgb2Ygb2N0YWwgbnVtYmVycywgbGVmdCBwYWRkZWQsIG5vdCBOVUwgdGVybWluYXRlZC4KKworICAgRmllbGQgTmFtZQlMZW5ndGggaW4gQnl0ZXMJTm90ZXMKKyAgIGNfbWFnaWMJNgkJbXVzdCBiZSAiMDcwNzA3IgorICAgY19kZXYJNgorICAgY19pbm8JNgorICAgY19tb2RlCTYJCXNlZSBiZWxvdyBmb3IgdmFsdWUKKyAgIGNfdWlkCTYKKyAgIGNfZ2lkCTYKKyAgIGNfbmxpbmsJNgorICAgY19yZGV2CTYJCW9ubHkgdmFsaWQgZm9yIGNociBhbmQgYmxrIHNwZWNpYWwgZmlsZXMKKyAgIGNfbXRpbWUJMTEKKyAgIGNfbmFtZXNpemUJNgkJY291bnQgaW5jbHVkZXMgdGVybWluYXRpbmcgTlVMIGluIHBhdGhuYW1lCisgICBjX2ZpbGVzaXplCTExCQltdXN0IGJlIDAgZm9yIEZJRk9zIGFuZCBkaXJlY3RvcmllcyAgKi8KKworLyogVmFsdWUgZm9yIHRoZSBmaWVsZCBgY19tYWdpYycuICAqLworI2RlZmluZSBNQUdJQwkiMDcwNzA3IgorCisvKiBWYWx1ZXMgZm9yIGNfbW9kZSwgT1InZCB0b2dldGhlcjogKi8KKworI2RlZmluZSBDX0lSVVNSCQkwMDA0MDAKKyNkZWZpbmUgQ19JV1VTUgkJMDAwMjAwCisjZGVmaW5lIENfSVhVU1IJCTAwMDEwMAorI2RlZmluZSBDX0lSR1JQCQkwMDAwNDAKKyNkZWZpbmUgQ19JV0dSUAkJMDAwMDIwCisjZGVmaW5lIENfSVhHUlAJCTAwMDAxMAorI2RlZmluZSBDX0lST1RICQkwMDAwMDQKKyNkZWZpbmUgQ19JV09USAkJMDAwMDAyCisjZGVmaW5lIENfSVhPVEgJCTAwMDAwMQorCisjZGVmaW5lIENfSVNVSUQJCTAwNDAwMAorI2RlZmluZSBDX0lTR0lECQkwMDIwMDAKKyNkZWZpbmUgQ19JU1ZUWAkJMDAxMDAwCisKKyNkZWZpbmUgQ19JU0JMSwkJMDYwMDAwCisjZGVmaW5lIENfSVNDSFIJCTAyMDAwMAorI2RlZmluZSBDX0lTRElSCQkwNDAwMDAKKyNkZWZpbmUgQ19JU0ZJRk8JMDEwMDAwCisjZGVmaW5lIENfSVNTT0NLCTAxNDAwMDAKKyNkZWZpbmUgQ19JU0xOSwkJMDEyMDAwMAorI2RlZmluZSBDX0lTQ1RHCQkwMTEwMDAwCisjZGVmaW5lIENfSVNSRUcJCTAxMDAwMDAKKworI2VuZGlmIC8qIGNwaW8uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9jcnlwdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9jcnlwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYzFjMzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2NyeXB0LmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIFVGQy1jcnlwdDogdWx0cmEgZmFzdCBjcnlwdCgzKSBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MSw5Miw5Myw5Niw5Nyw5OCwyMDAwLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICogMDIxMTEtMTMwNyBVU0EuCisgKgorICogQCgjKWNyeXB0LmgJMS41IDEyLzIwLzk2CisgKgorICovCisKKyNpZm5kZWYgX0NSWVBUX0gKKyNkZWZpbmUgX0NSWVBUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBFbmNyeXB0IGF0IG1vc3QgOCBjaGFyYWN0ZXJzIGZyb20gS0VZIHVzaW5nIHNhbHQgdG8gcGVydHVyYiBERVMuICAqLworZXh0ZXJuIGNoYXIgKmNyeXB0IChfX2NvbnN0IGNoYXIgKl9fa2V5LCBfX2NvbnN0IGNoYXIgKl9fc2FsdCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldHVwIERFUyB0YWJsZXMgYWNjb3JkaW5nIEtFWS4gICovCitleHRlcm4gdm9pZCBzZXRrZXkgKF9fY29uc3QgY2hhciAqX19rZXkpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBFbmNyeXB0IGRhdGEgaW4gQkxPQ0sgaW4gcGxhY2UgaWYgRURGTEFHIGlzIHplcm87IG90aGVyd2lzZSBkZWNyeXB0CisgICBibG9jayBpbiBwbGFjZS4gICovCitleHRlcm4gdm9pZCBlbmNyeXB0IChjaGFyICpfX2xpYmNfYmxvY2ssIGludCBfX2VkZmxhZykgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLiAgVGhlIGFkZGl0aW9uYWwgYXJndW1lbnQKKyAgIHBvaW50cyB0byBhIHN0cnVjdHVyZSB3aGVyZSB0aGUgcmVzdWx0cyBhcmUgcGxhY2VkIGluLiAgKi8KK3N0cnVjdCBjcnlwdF9kYXRhCisgIHsKKyAgICBjaGFyIGtleXNjaGVkWzE2ICogOF07CisgICAgY2hhciBzYjBbMzI3NjhdOworICAgIGNoYXIgc2IxWzMyNzY4XTsKKyAgICBjaGFyIHNiMlszMjc2OF07CisgICAgY2hhciBzYjNbMzI3NjhdOworICAgIC8qIGVuZC1vZi1hbGlnbWVudC1jcml0aWNhbC1kYXRhICovCisgICAgY2hhciBjcnlwdF8zX2J1ZlsxNF07CisgICAgY2hhciBjdXJyZW50X3NhbHRbMl07CisgICAgbG9uZyBpbnQgY3VycmVudF9zYWx0Yml0czsKKyAgICBpbnQgIGRpcmVjdGlvbiwgaW5pdGlhbGl6ZWQ7CisgIH07CisKK2V4dGVybiBjaGFyICpjcnlwdF9yIChfX2NvbnN0IGNoYXIgKl9fa2V5LCBfX2NvbnN0IGNoYXIgKl9fc2FsdCwKKwkJICAgICAgc3RydWN0IGNyeXB0X2RhdGEgKiBfX3Jlc3RyaWN0IF9fZGF0YSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyLCAzKSk7CisKK2V4dGVybiB2b2lkIHNldGtleV9yIChfX2NvbnN0IGNoYXIgKl9fa2V5LAorCQkgICAgICBzdHJ1Y3QgY3J5cHRfZGF0YSAqIF9fcmVzdHJpY3QgX19kYXRhKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworZXh0ZXJuIHZvaWQgZW5jcnlwdF9yIChjaGFyICpfX2xpYmNfYmxvY2ssIGludCBfX2VkZmxhZywKKwkJICAgICAgIHN0cnVjdCBjcnlwdF9kYXRhICogX19yZXN0cmljdCBfX2RhdGEpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMykpOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBjcnlwdC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2N0eXBlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2N0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzMDUyYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3R5cGUuaApAQCAtMCwwICsxLDM1MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDkyLDkzLDk1LDk2LDk3LDk4LDk5LDIwMDEsMjAwMiwyMDA0LDIwMDcsMjAwOCwyMDA5LDIwMTEKKwlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTkgU3RhbmRhcmQgNy40OiBDaGFyYWN0ZXIgaGFuZGxpbmcJPGN0eXBlLmg+CisgKi8KKworI2lmbmRlZglfQ1RZUEVfSAorI2RlZmluZQlfQ1RZUEVfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjaWZuZGVmIF9JU2JpdAorLyogVGhlc2UgYXJlIGFsbCB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGNoYXJhY3RlcnMuCisgICBJZiB0aGVyZSBnZXQgdG8gYmUgbW9yZSB0aGFuIDE2IGRpc3RpbmN0IGNoYXJhY3RlcmlzdGljcywKKyAgIG1hbnkgdGhpbmdzIG11c3QgYmUgY2hhbmdlZCB0aGF0IHVzZSBgdW5zaWduZWQgc2hvcnQgaW50J3MuCisKKyAgIFRoZSBjaGFyYWN0ZXJpc3RpY3MgYXJlIHN0b3JlZCBhbHdheXMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWcKKyAgIGVuZGlhbikuICBXZSBkZWZpbmUgdGhlIGJpdCB2YWx1ZSBpbnRlcnByZXRhdGlvbnMgaGVyZSBkZXBlbmRlbnQgb24gdGhlCisgICBtYWNoaW5lJ3MgYnl0ZSBvcmRlci4gICovCisKKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgIGRlZmluZSBfSVNiaXQoYml0KQkoMSA8PCAoYml0KSkKKyMgZWxzZSAvKiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOICovCisjICBkZWZpbmUgX0lTYml0KGJpdCkJKChiaXQpIDwgOCA/ICgoMSA8PCAoYml0KSkgPDwgOCkgOiAoKDEgPDwgKGJpdCkpID4+IDgpKQorIyBlbmRpZgorCitlbnVtCit7CisgIF9JU3VwcGVyID0gX0lTYml0ICgwKSwJLyogVVBQRVJDQVNFLiAgKi8KKyAgX0lTbG93ZXIgPSBfSVNiaXQgKDEpLAkvKiBsb3dlcmNhc2UuICAqLworICBfSVNhbHBoYSA9IF9JU2JpdCAoMiksCS8qIEFscGhhYmV0aWMuICAqLworICBfSVNkaWdpdCA9IF9JU2JpdCAoMyksCS8qIE51bWVyaWMuICAqLworICBfSVN4ZGlnaXQgPSBfSVNiaXQgKDQpLAkvKiBIZXhhZGVjaW1hbCBudW1lcmljLiAgKi8KKyAgX0lTc3BhY2UgPSBfSVNiaXQgKDUpLAkvKiBXaGl0ZXNwYWNlLiAgKi8KKyAgX0lTcHJpbnQgPSBfSVNiaXQgKDYpLAkvKiBQcmludGluZy4gICovCisgIF9JU2dyYXBoID0gX0lTYml0ICg3KSwJLyogR3JhcGhpY2FsLiAgKi8KKyAgX0lTYmxhbmsgPSBfSVNiaXQgKDgpLAkvKiBCbGFuayAodXN1YWxseSBTUEMgYW5kIFRBQikuICAqLworICBfSVNjbnRybCA9IF9JU2JpdCAoOSksCS8qIENvbnRyb2wgY2hhcmFjdGVyLiAgKi8KKyAgX0lTcHVuY3QgPSBfSVNiaXQgKDEwKSwJLyogUHVuY3R1YXRpb24uICAqLworICBfSVNhbG51bSA9IF9JU2JpdCAoMTEpCS8qIEFscGhhbnVtZXJpYy4gICovCit9OworI2VuZGlmIC8qICEgX0lTYml0ICAqLworCisvKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiBjdHlwZS1pbmZvLmMuCisgICBUaGUgZGVjbGFyYXRpb25zIGhlcmUgbXVzdCBtYXRjaCB0aG9zZSBpbiBsb2NhbGVpbmZvLmguCisKKyAgIEluIHRoZSB0aHJlYWQtc3BlY2lmaWMgbG9jYWxlIG1vZGVsIChzZWUgYHVzZWxvY2FsZScgaW4gPGxvY2FsZS5oPikKKyAgIHdlIGNhbm5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgdGhlc2UgYXMgd2FzIGRvbmUgaW4gdGhlIHBhc3QuCisgICBJbnN0ZWFkLCB0aGUgZm9sbG93aW5nIGFjY2Vzc29yIGZ1bmN0aW9ucyByZXR1cm4gdGhlIGFkZHJlc3Mgb2YKKyAgIGVhY2ggdmFyaWFibGUsIHdoaWNoIGlzIGxvY2FsIHRvIHRoZSBjdXJyZW50IHRocmVhZCBpZiBtdWx0aXRocmVhZGVkLgorCisgICBUaGVzZSBwb2ludCBpbnRvIGFycmF5cyBvZiAzODQsIHNvIHRoZXkgY2FuIGJlIGluZGV4ZWQgYnkgYW55IGB1bnNpZ25lZAorICAgY2hhcicgdmFsdWUgWzAsMjU1XTsgYnkgRU9GICgtMSk7IG9yIGJ5IGFueSBgc2lnbmVkIGNoYXInIHZhbHVlCisgICBbLTEyOCwtMSkuICBJU08gQyByZXF1aXJlcyB0aGF0IHRoZSBjdHlwZSBmdW5jdGlvbnMgd29yayBmb3IgYHVuc2lnbmVkCisgICBjaGFyJyB2YWx1ZXMgYW5kIGZvciBFT0Y7IHdlIGFsc28gc3VwcG9ydCBuZWdhdGl2ZSBgc2lnbmVkIGNoYXInIHZhbHVlcworICAgZm9yIGJyb2tlbiBvbGQgcHJvZ3JhbXMuICBUaGUgY2FzZSBjb252ZXJzaW9uIGFycmF5cyBhcmUgb2YgYGludCdzCisgICByYXRoZXIgdGhhbiBgdW5zaWduZWQgY2hhcidzIGJlY2F1c2UgdG9sb3dlciAoRU9GKSBtdXN0IGJlIEVPRiwgd2hpY2gKKyAgIGRvZXNuJ3QgZml0IGludG8gYW4gYHVuc2lnbmVkIGNoYXInLiAgQnV0IHRvZGF5IG1vcmUgaW1wb3J0YW50IGlzIHRoYXQKKyAgIHRoZSBhcnJheXMgYXJlIGFsc28gdXNlZCBmb3IgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgc2V0cy4gICovCitleHRlcm4gX19jb25zdCB1bnNpZ25lZCBzaG9ydCBpbnQgKipfX2N0eXBlX2JfbG9jICh2b2lkKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0KSk7CitleHRlcm4gX19jb25zdCBfX2ludDMyX3QgKipfX2N0eXBlX3RvbG93ZXJfbG9jICh2b2lkKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0KSk7CitleHRlcm4gX19jb25zdCBfX2ludDMyX3QgKipfX2N0eXBlX3RvdXBwZXJfbG9jICh2b2lkKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0KSk7CisKKworI2lmbmRlZiBfX2NwbHVzcGx1cworIyBkZWZpbmUgX19pc2N0eXBlKGMsIHR5cGUpIFwKKyAgKCgqX19jdHlwZV9iX2xvYyAoKSlbKGludCkgKGMpXSAmICh1bnNpZ25lZCBzaG9ydCBpbnQpIHR5cGUpCisjZWxpZiBkZWZpbmVkIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisjIGRlZmluZSBfX2lzY3R5cGVfZih0eXBlKSBcCisgIF9fZXh0ZXJuX2lubGluZSBpbnQJCQkJCQkJICAgICAgXAorICBpcyMjdHlwZSAoaW50IF9fYykgX19USFJPVwkJCQkJCSAgICAgIFwKKyAgewkJCQkJCQkJCSAgICAgIFwKKyAgICByZXR1cm4gKCpfX2N0eXBlX2JfbG9jICgpKVsoaW50KSAoX19jKV0gJiAodW5zaWduZWQgc2hvcnQgaW50KSBfSVMjI3R5cGU7IFwKKyAgfQorI2VuZGlmCisKKyNkZWZpbmUJX19pc2FzY2lpKGMpCSgoKGMpICYgfjB4N2YpID09IDApCS8qIElmIEMgaXMgYSA3IGJpdCB2YWx1ZS4gICovCisjZGVmaW5lCV9fdG9hc2NpaShjKQkoKGMpICYgMHg3ZikJCS8qIE1hc2sgb2ZmIGhpZ2ggYml0cy4gICovCisKKyNkZWZpbmUJX19leGN0eXBlKG5hbWUpCWV4dGVybiBpbnQgbmFtZSAoaW50KSBfX1RIUk9XCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorCisvKiBUaGUgZm9sbG93aW5nIG5hbWVzIGFyZSBhbGwgZnVuY3Rpb25zOgorICAgICBpbnQgaXNDSEFSQUNURVJJU1RJQyhpbnQgYyk7CisgICB3aGljaCByZXR1cm4gbm9uemVybyBpZmYgQyBoYXMgQ0hBUkFDVEVSSVNUSUMuCisgICBGb3IgdGhlIG1lYW5pbmcgb2YgdGhlIGNoYXJhY3RlcmlzdGljIG5hbWVzLCBzZWUgdGhlIGBlbnVtJyBhYm92ZS4gICovCitfX2V4Y3R5cGUgKGlzYWxudW0pOworX19leGN0eXBlIChpc2FscGhhKTsKK19fZXhjdHlwZSAoaXNjbnRybCk7CitfX2V4Y3R5cGUgKGlzZGlnaXQpOworX19leGN0eXBlIChpc2xvd2VyKTsKK19fZXhjdHlwZSAoaXNncmFwaCk7CitfX2V4Y3R5cGUgKGlzcHJpbnQpOworX19leGN0eXBlIChpc3B1bmN0KTsKK19fZXhjdHlwZSAoaXNzcGFjZSk7CitfX2V4Y3R5cGUgKGlzdXBwZXIpOworX19leGN0eXBlIChpc3hkaWdpdCk7CisKKworLyogUmV0dXJuIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiBvZiBDLiAgKi8KK2V4dGVybiBpbnQgdG9sb3dlciAoaW50IF9fYykgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSB1cHBlcmNhc2UgdmVyc2lvbiBvZiBDLiAgKi8KK2V4dGVybiBpbnQgdG91cHBlciAoaW50IF9fYykgX19USFJPVzsKKworX19FTkRfTkFNRVNQQUNFX1NURAorCisKKy8qIElTTyBDOTkgaW50cm9kdWNlZCBvbmUgbmV3IGZ1bmN0aW9uLiAgKi8KKyNpZmRlZglfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorCitfX2V4Y3R5cGUgKGlzYmxhbmspOworCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGVzdCBDIGZvciBhIHNldCBvZiBjaGFyYWN0ZXIgY2xhc3NlcyBhY2NvcmRpbmcgdG8gTUFTSy4gICovCitleHRlcm4gaW50IGlzY3R5cGUgKGludCBfX2MsIGludCBfX21hc2spIF9fVEhST1c7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorCisvKiBSZXR1cm4gbm9uemVybyBpZmYgQyBpcyBpbiB0aGUgQVNDSUkgc2V0CisgICAoaS5lLiwgaXMgbm8gbW9yZSB0aGFuIDcgYml0cyB3aWRlKS4gICovCitleHRlcm4gaW50IGlzYXNjaWkgKGludCBfX2MpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgcGFydCBvZiBDIHRoYXQgaXMgaW4gdGhlIEFTQ0lJIHNldAorICAgKGkuZS4sIHRoZSBsb3ctb3JkZXIgNyBiaXRzIG9mIEMpLiAgKi8KK2V4dGVybiBpbnQgdG9hc2NpaSAoaW50IF9fYykgX19USFJPVzsKKworLyogVGhlc2UgYXJlIHRoZSBzYW1lIGFzIGB0b3VwcGVyJyBhbmQgYHRvbG93ZXInIGV4Y2VwdCB0aGF0IHRoZXkgZG8gbm90CisgICBjaGVjayB0aGUgYXJndW1lbnQgZm9yIGJlaW5nIGluIHRoZSByYW5nZSBvZiBhIGBjaGFyJy4gICovCitfX2V4Y3R5cGUgKF90b3VwcGVyKTsKK19fZXhjdHlwZSAoX3RvbG93ZXIpOworI2VuZGlmIC8qIFVzZSBTVklEIG9yIHVzZSBtaXNjLiAgKi8KKworLyogVGhpcyBjb2RlIGlzIG5lZWRlZCBmb3IgdGhlIG9wdGltaXplZCBtYXBwaW5nIGZ1bmN0aW9ucy4gICovCisjZGVmaW5lIF9fdG9ib2R5KGMsIGYsIGEsIGFyZ3MpIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgaW50IF9fcmVzOwkJCQkJCQkgICAgICBcCisgICAgICBpZiAoc2l6ZW9mIChjKSA+IDEpCQkJCQkJICAgICAgXAorCXsJCQkJCQkJCSAgICAgIFwKKwkgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYykpCQkJCQkgICAgICBcCisJICAgIHsJCQkJCQkJCSAgICAgIFwKKwkgICAgICBpbnQgX19jID0gKGMpOwkJCQkJCSAgICAgIFwKKwkgICAgICBfX3JlcyA9IF9fYyA8IC0xMjggfHwgX19jID4gMjU1ID8gX19jIDogKGEpW19fY107CQkgICAgICBcCisJICAgIH0JCQkJCQkJCSAgICAgIFwKKwkgIGVsc2UJCQkJCQkJCSAgICAgIFwKKwkgICAgX19yZXMgPSBmIGFyZ3M7CQkJCQkJICAgICAgXAorCX0JCQkJCQkJCSAgICAgIFwKKyAgICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKwlfX3JlcyA9IChhKVsoaW50KSAoYyldOwkJCQkJCSAgICAgIFwKKyAgICAgIF9fcmVzOyB9KSkKKworI2lmICFkZWZpbmVkIF9fTk9fQ1RZUEUKKyMgaWZkZWYgX19pc2N0eXBlX2YKK19faXNjdHlwZV9mIChhbG51bSkKK19faXNjdHlwZV9mIChhbHBoYSkKK19faXNjdHlwZV9mIChjbnRybCkKK19faXNjdHlwZV9mIChkaWdpdCkKK19faXNjdHlwZV9mIChsb3dlcikKK19faXNjdHlwZV9mIChncmFwaCkKK19faXNjdHlwZV9mIChwcmludCkKK19faXNjdHlwZV9mIChwdW5jdCkKK19faXNjdHlwZV9mIChzcGFjZSkKK19faXNjdHlwZV9mICh1cHBlcikKK19faXNjdHlwZV9mICh4ZGlnaXQpCisjICBpZmRlZiBfX1VTRV9JU09DOTkKK19faXNjdHlwZV9mIChibGFuaykKKyMgIGVuZGlmCisjIGVsaWYgZGVmaW5lZCBfX2lzY3R5cGUKKyMgZGVmaW5lIGlzYWxudW0oYykJX19pc2N0eXBlKChjKSwgX0lTYWxudW0pCisjIGRlZmluZSBpc2FscGhhKGMpCV9faXNjdHlwZSgoYyksIF9JU2FscGhhKQorIyBkZWZpbmUgaXNjbnRybChjKQlfX2lzY3R5cGUoKGMpLCBfSVNjbnRybCkKKyMgZGVmaW5lIGlzZGlnaXQoYykJX19pc2N0eXBlKChjKSwgX0lTZGlnaXQpCisjIGRlZmluZSBpc2xvd2VyKGMpCV9faXNjdHlwZSgoYyksIF9JU2xvd2VyKQorIyBkZWZpbmUgaXNncmFwaChjKQlfX2lzY3R5cGUoKGMpLCBfSVNncmFwaCkKKyMgZGVmaW5lIGlzcHJpbnQoYykJX19pc2N0eXBlKChjKSwgX0lTcHJpbnQpCisjIGRlZmluZSBpc3B1bmN0KGMpCV9faXNjdHlwZSgoYyksIF9JU3B1bmN0KQorIyBkZWZpbmUgaXNzcGFjZShjKQlfX2lzY3R5cGUoKGMpLCBfSVNzcGFjZSkKKyMgZGVmaW5lIGlzdXBwZXIoYykJX19pc2N0eXBlKChjKSwgX0lTdXBwZXIpCisjIGRlZmluZSBpc3hkaWdpdChjKQlfX2lzY3R5cGUoKGMpLCBfSVN4ZGlnaXQpCisjICBpZmRlZiBfX1VTRV9JU09DOTkKKyMgICBkZWZpbmUgaXNibGFuayhjKQlfX2lzY3R5cGUoKGMpLCBfSVNibGFuaykKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIICh0b2xvd2VyIChpbnQgX19jKSkKK3sKKyAgcmV0dXJuIF9fYyA+PSAtMTI4ICYmIF9fYyA8IDI1NiA/ICgqX19jdHlwZV90b2xvd2VyX2xvYyAoKSlbX19jXSA6IF9fYzsKK30KKworX19leHRlcm5faW5saW5lIGludAorX19OVEggKHRvdXBwZXIgKGludCBfX2MpKQoreworICByZXR1cm4gX19jID49IC0xMjggJiYgX19jIDwgMjU2ID8gKCpfX2N0eXBlX3RvdXBwZXJfbG9jICgpKVtfX2NdIDogX19jOworfQorIyBlbmRpZgorCisjIGlmIF9fR05VQ19fID49IDIgJiYgZGVmaW5lZCBfX09QVElNSVpFX18gJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgIGRlZmluZSB0b2xvd2VyKGMpCV9fdG9ib2R5IChjLCB0b2xvd2VyLCAqX19jdHlwZV90b2xvd2VyX2xvYyAoKSwgKGMpKQorIyAgZGVmaW5lIHRvdXBwZXIoYykJX190b2JvZHkgKGMsIHRvdXBwZXIsICpfX2N0eXBlX3RvdXBwZXJfbG9jICgpLCAoYykpCisjIGVuZGlmIC8qIE9wdGltaXppbmcgZ2NjICovCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisjICBkZWZpbmUgaXNhc2NpaShjKQlfX2lzYXNjaWkgKGMpCisjICBkZWZpbmUgdG9hc2NpaShjKQlfX3RvYXNjaWkgKGMpCisKKyMgIGRlZmluZSBfdG9sb3dlcihjKQkoKGludCkgKCpfX2N0eXBlX3RvbG93ZXJfbG9jICgpKVsoaW50KSAoYyldKQorIyAgZGVmaW5lIF90b3VwcGVyKGMpCSgoaW50KSAoKl9fY3R5cGVfdG91cHBlcl9sb2MgKCkpWyhpbnQpIChjKV0pCisjIGVuZGlmCisKKyNlbmRpZiAvKiBOb3QgX19OT19DVFlQRS4gICovCisKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBUaGUgY29uY2VwdCBvZiBvbmUgc3RhdGljIGxvY2FsZSBwZXIgY2F0ZWdvcnkgaXMgbm90IHZlcnkgd2VsbAorICAgdGhvdWdodCBvdXQuICBNYW55IGFwcGxpY2F0aW9ucyB3aWxsIG5lZWQgdG8gcHJvY2VzcyBpdHMgZGF0YSB1c2luZworICAgaW5mb3JtYXRpb24gZnJvbSBzZXZlcmFsIGRpZmZlcmVudCBsb2NhbGVzLiAgQW5vdGhlciBhcHBsaWNhdGlvbiBpcworICAgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBoYW5kbGluZyBpbiB0aGUKKyAgIHVwY29taW5nIElTTyBDKysgc3RhbmRhcmQgbGlicmFyeS4gIFRvIHN1cHBvcnQgdGhpcyBhbm90aGVyIHNldCBvZgorICAgdGhlIGZ1bmN0aW9ucyB1c2luZyBsb2NhbGUgZGF0YSBleGlzdCB3aGljaCBoYXZlIGFuIGFkZGl0aW9uYWwKKyAgIGFyZ3VtZW50LgorCisgICBBdHRlbnRpb246IGFsbCB0aGVzZSBmdW5jdGlvbnMgYXJlICpub3QqIHN0YW5kYXJkaXplZCBpbiBhbnkgZm9ybS4KKyAgIFRoaXMgaXMgYSBwcm9vZi1vZi1jb25jZXB0IGltcGxlbWVudGF0aW9uLiAgKi8KKworLyogU3RydWN0dXJlIGZvciByZWVudHJhbnQgbG9jYWxlIHVzaW5nIGZ1bmN0aW9ucy4gIFRoaXMgaXMgYW4KKyAgIChhbG1vc3QpIG9wYXF1ZSB0eXBlIGZvciB0aGUgdXNlciBsZXZlbCBwcm9ncmFtcy4gICovCisjIGluY2x1ZGUgPHhsb2NhbGUuaD4KKworLyogVGhlc2UgZGVmaW5pdGlvbnMgYXJlIHNpbWlsYXIgdG8gdGhlIG9uZXMgYWJvdmUgYnV0IGFsbCBmdW5jdGlvbnMKKyAgIHRha2UgYXMgYW4gYXJndW1lbnQgYSBoYW5kbGUgZm9yIHRoZSBsb2NhbGUgd2hpY2ggc2hhbGwgYmUgdXNlZC4gICovCisjICBkZWZpbmUgX19pc2N0eXBlX2woYywgdHlwZSwgbG9jYWxlKSBcCisgICgobG9jYWxlKS0+X19jdHlwZV9iWyhpbnQpIChjKV0gJiAodW5zaWduZWQgc2hvcnQgaW50KSB0eXBlKQorCisjIGRlZmluZSBfX2V4Y3R5cGVfbChuYW1lKSAJCQkJCQkgICAgICBcCisgIGV4dGVybiBpbnQgbmFtZSAoaW50LCBfX2xvY2FsZV90KSBfX1RIUk9XCisKKy8qIFRoZSBmb2xsb3dpbmcgbmFtZXMgYXJlIGFsbCBmdW5jdGlvbnM6CisgICAgIGludCBpc0NIQVJBQ1RFUklTVElDKGludCBjLCBsb2NhbGVfdCAqbG9jYWxlKTsKKyAgIHdoaWNoIHJldHVybiBub256ZXJvIGlmZiBDIGhhcyBDSEFSQUNURVJJU1RJQy4KKyAgIEZvciB0aGUgbWVhbmluZyBvZiB0aGUgY2hhcmFjdGVyaXN0aWMgbmFtZXMsIHNlZSB0aGUgYGVudW0nIGFib3ZlLiAgKi8KK19fZXhjdHlwZV9sIChpc2FsbnVtX2wpOworX19leGN0eXBlX2wgKGlzYWxwaGFfbCk7CitfX2V4Y3R5cGVfbCAoaXNjbnRybF9sKTsKK19fZXhjdHlwZV9sIChpc2RpZ2l0X2wpOworX19leGN0eXBlX2wgKGlzbG93ZXJfbCk7CitfX2V4Y3R5cGVfbCAoaXNncmFwaF9sKTsKK19fZXhjdHlwZV9sIChpc3ByaW50X2wpOworX19leGN0eXBlX2wgKGlzcHVuY3RfbCk7CitfX2V4Y3R5cGVfbCAoaXNzcGFjZV9sKTsKK19fZXhjdHlwZV9sIChpc3VwcGVyX2wpOworX19leGN0eXBlX2wgKGlzeGRpZ2l0X2wpOworCitfX2V4Y3R5cGVfbCAoaXNibGFua19sKTsKKworCisvKiBSZXR1cm4gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uIG9mIEMgaW4gbG9jYWxlIEwuICAqLworZXh0ZXJuIGludCBfX3RvbG93ZXJfbCAoaW50IF9fYywgX19sb2NhbGVfdCBfX2wpIF9fVEhST1c7CitleHRlcm4gaW50IHRvbG93ZXJfbCAoaW50IF9fYywgX19sb2NhbGVfdCBfX2wpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgdXBwZXJjYXNlIHZlcnNpb24gb2YgQy4gICovCitleHRlcm4gaW50IF9fdG91cHBlcl9sIChpbnQgX19jLCBfX2xvY2FsZV90IF9fbCkgX19USFJPVzsKK2V4dGVybiBpbnQgdG91cHBlcl9sIChpbnQgX19jLCBfX2xvY2FsZV90IF9fbCkgX19USFJPVzsKKworIyBpZiBfX0dOVUNfXyA+PSAyICYmIGRlZmluZWQgX19PUFRJTUlaRV9fICYmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgX190b2xvd2VyX2woYywgbG9jYWxlKSBcCisgIF9fdG9ib2R5IChjLCBfX3RvbG93ZXJfbCwgKGxvY2FsZSktPl9fY3R5cGVfdG9sb3dlciwgKGMsIGxvY2FsZSkpCisjICBkZWZpbmUgX190b3VwcGVyX2woYywgbG9jYWxlKSBcCisgIF9fdG9ib2R5IChjLCBfX3RvdXBwZXJfbCwgKGxvY2FsZSktPl9fY3R5cGVfdG91cHBlciwgKGMsIGxvY2FsZSkpCisjICBkZWZpbmUgdG9sb3dlcl9sKGMsIGxvY2FsZSkJX190b2xvd2VyX2wgKChjKSwgKGxvY2FsZSkpCisjICBkZWZpbmUgdG91cHBlcl9sKGMsIGxvY2FsZSkJX190b3VwcGVyX2wgKChjKSwgKGxvY2FsZSkpCisjIGVuZGlmCS8qIE9wdGltaXppbmcgZ2NjICovCisKKworIyBpZm5kZWYgX19OT19DVFlQRQorIyAgZGVmaW5lIF9faXNhbG51bV9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNhbG51bSwgKGwpKQorIyAgZGVmaW5lIF9faXNhbHBoYV9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNhbHBoYSwgKGwpKQorIyAgZGVmaW5lIF9faXNjbnRybF9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNjbnRybCwgKGwpKQorIyAgZGVmaW5lIF9faXNkaWdpdF9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNkaWdpdCwgKGwpKQorIyAgZGVmaW5lIF9faXNsb3dlcl9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNsb3dlciwgKGwpKQorIyAgZGVmaW5lIF9faXNncmFwaF9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNncmFwaCwgKGwpKQorIyAgZGVmaW5lIF9faXNwcmludF9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNwcmludCwgKGwpKQorIyAgZGVmaW5lIF9faXNwdW5jdF9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNwdW5jdCwgKGwpKQorIyAgZGVmaW5lIF9faXNzcGFjZV9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNzcGFjZSwgKGwpKQorIyAgZGVmaW5lIF9faXN1cHBlcl9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVN1cHBlciwgKGwpKQorIyAgZGVmaW5lIF9faXN4ZGlnaXRfbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTeGRpZ2l0LCAobCkpCisKKyMgIGRlZmluZSBfX2lzYmxhbmtfbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTYmxhbmssIChsKSkKKworIyAgaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfTUlTQworIyAgIGRlZmluZSBfX2lzYXNjaWlfbChjLGwpCSgobCksIF9faXNhc2NpaSAoYykpCisjICAgZGVmaW5lIF9fdG9hc2NpaV9sKGMsbCkJKChsKSwgX190b2FzY2lpIChjKSkKKyMgIGVuZGlmCisKKyMgIGRlZmluZSBpc2FsbnVtX2woYyxsKQlfX2lzYWxudW1fbCAoKGMpLCAobCkpCisjICBkZWZpbmUgaXNhbHBoYV9sKGMsbCkJX19pc2FscGhhX2wgKChjKSwgKGwpKQorIyAgZGVmaW5lIGlzY250cmxfbChjLGwpCV9faXNjbnRybF9sICgoYyksIChsKSkKKyMgIGRlZmluZSBpc2RpZ2l0X2woYyxsKQlfX2lzZGlnaXRfbCAoKGMpLCAobCkpCisjICBkZWZpbmUgaXNsb3dlcl9sKGMsbCkJX19pc2xvd2VyX2wgKChjKSwgKGwpKQorIyAgZGVmaW5lIGlzZ3JhcGhfbChjLGwpCV9faXNncmFwaF9sICgoYyksIChsKSkKKyMgIGRlZmluZSBpc3ByaW50X2woYyxsKQlfX2lzcHJpbnRfbCAoKGMpLCAobCkpCisjICBkZWZpbmUgaXNwdW5jdF9sKGMsbCkJX19pc3B1bmN0X2wgKChjKSwgKGwpKQorIyAgZGVmaW5lIGlzc3BhY2VfbChjLGwpCV9faXNzcGFjZV9sICgoYyksIChsKSkKKyMgIGRlZmluZSBpc3VwcGVyX2woYyxsKQlfX2lzdXBwZXJfbCAoKGMpLCAobCkpCisjICBkZWZpbmUgaXN4ZGlnaXRfbChjLGwpCV9faXN4ZGlnaXRfbCAoKGMpLCAobCkpCisKKyMgIGRlZmluZSBpc2JsYW5rX2woYyxsKQlfX2lzYmxhbmtfbCAoKGMpLCAobCkpCisKKyMgIGlmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKyMgICBkZWZpbmUgaXNhc2NpaV9sKGMsbCkJX19pc2FzY2lpX2wgKChjKSwgKGwpKQorIyAgIGRlZmluZSB0b2FzY2lpX2woYyxsKQlfX3RvYXNjaWlfbCAoKGMpLCAobCkpCisjICBlbmRpZgorCisjIGVuZGlmIC8qIE5vdCBfX05PX0NUWVBFLiAgKi8KKworI2VuZGlmIC8qIFVzZSBQT1NJWCAyMDA4LiAgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGN0eXBlLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTY0NDUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXMuaApAQCAtMCwwICsxLDE2NzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQXV0aG9yOiBaZXlkIE0uIEJlbi1IYWxpbSA8em1iZW5oYWxAbmV0Y29tLmNvbT4gMTk5MiwxOTk1ICAgICAgICAgICAgICAgKgorICogICAgIGFuZDogRXJpYyBTLiBSYXltb25kIDxlc3JAc25hcmsudGh5cnN1cy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICBhbmQ6IFRob21hcyBFLiBEaWNrZXkgICAgICAgICAgICAgICAgICAgICAgICAxOTk2LW9uICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogJElkOiBjdXJzZXMuaC5pbix2IDEuMjIwIDIwMTEvMDEvMjIgMTk6NDc6MjAgdG9tIEV4cCAkICovCisKKyNpZm5kZWYgX19OQ1VSU0VTX0gKKyNkZWZpbmUgX19OQ1VSU0VTX0gKKworI2RlZmluZSBDVVJTRVMgMQorI2RlZmluZSBDVVJTRVNfSCAxCisKKy8qIFRoZXNlIGFyZSBkZWZpbmVkIG9ubHkgaW4gY3Vyc2VzLmgsIGFuZCBhcmUgdXNlZCBmb3IgY29uZGl0aW9uYWwgY29tcGlsZXMgKi8KKyNkZWZpbmUgTkNVUlNFU19WRVJTSU9OX01BSk9SIDUKKyNkZWZpbmUgTkNVUlNFU19WRVJTSU9OX01JTk9SIDkKKyNkZWZpbmUgTkNVUlNFU19WRVJTSU9OX1BBVENIIDIwMTEwNDA0CisKKy8qIFRoaXMgaXMgZGVmaW5lZCBpbiBtb3JlIHRoYW4gb25lIG5jdXJzZXMgaGVhZGVyLCBmb3IgaWRlbnRpZmljYXRpb24gKi8KKyN1bmRlZiAgTkNVUlNFU19WRVJTSU9OCisjZGVmaW5lIE5DVVJTRVNfVkVSU0lPTiAiNS45IgorCisvKgorICogSWRlbnRpZnkgdGhlIG1vdXNlIGVuY29kaW5nIHZlcnNpb24uCisgKi8KKyNkZWZpbmUgTkNVUlNFU19NT1VTRV9WRVJTSU9OIDEKKworLyoKKyAqIERlZmluaXRpb25zIHRvIGZhY2lsaXRhdGUgRExMJ3MuCisgKi8KKyNpbmNsdWRlIDxuY3Vyc2VzX2RsbC5oPgorCisvKgorICogVXNlci1kZWZpbmFibGUgdHdlYWsgdG8gZGlzYWJsZSB0aGUgaW5jbHVkZSBvZiA8c3RkYm9vbC5oPi4KKyAqLworI2lmbmRlZiBOQ1VSU0VTX0VOQUJMRV9TVERCT09MX0gKKyNkZWZpbmUgTkNVUlNFU19FTkFCTEVfU1REQk9PTF9IIDEKKyNlbmRpZgorCisvKgorICogTkNVUlNFU19BVFRSX1QgaXMgdXNlZCB0byBxdWlldCBjb21waWxlciB3YXJuaW5ncyB3aGVuIGJ1aWxkaW5nIG5jdXJzZXMKKyAqIGNvbmZpZ3VyZWQgdXNpbmcgLS1kaXNhYmxlLW1hY3Jvcy4KKyAqLworI2lmZGVmIE5DVVJTRVNfTk9NQUNST1MKKyNpZm5kZWYgTkNVUlNFU19BVFRSX1QKKyNkZWZpbmUgTkNVUlNFU19BVFRSX1QgYXR0cl90CisjZW5kaWYKKyNlbmRpZiAvKiBOQ1VSU0VTX05PTUFDUk9TICovCisKKyNpZm5kZWYgTkNVUlNFU19BVFRSX1QKKyNkZWZpbmUgTkNVUlNFU19BVFRSX1QgaW50CisjZW5kaWYKKworLyoKKyAqIEV4cGFuZHMgdG8gJ2NvbnN0JyBpZiBuY3Vyc2VzIGlzIGNvbmZpZ3VyZWQgdXNpbmcgLS1lbmFibGUtY29uc3QuICBOb3RlIHRoYXQKKyAqIGRvaW5nIHNvIG1ha2VzIGl0IGluY29tcGF0aWJsZSB3aXRoIG90aGVyIGltcGxlbWVudGF0aW9ucyBvZiBYL09wZW4gQ3Vyc2VzLgorICovCisjdW5kZWYgIE5DVVJTRVNfQ09OU1QKKyNkZWZpbmUgTkNVUlNFU19DT05TVCBjb25zdAorCisjdW5kZWYgTkNVUlNFU19JTkxJTkUKKyNkZWZpbmUgTkNVUlNFU19JTkxJTkUgaW5saW5lCisKKy8qCisgKiBUaGUgaW50ZXJuYWwgdHlwZSB1c2VkIGZvciBjb2xvciB2YWx1ZXMKKyAqLworI3VuZGVmCU5DVVJTRVNfQ09MT1JfVAorI2RlZmluZQlOQ1VSU0VTX0NPTE9SX1Qgc2hvcnQKKworLyoKKyAqIERlZmluaXRpb24gdXNlZCB0byBtYWtlIFdJTkRPVyBhbmQgc2ltaWxhciBzdHJ1Y3RzIG9wYXF1ZS4KKyAqLworI2lmbmRlZiBOQ1VSU0VTX09QQVFVRQorI2RlZmluZSBOQ1VSU0VTX09QQVFVRSAwCisjZW5kaWYKKworLyoKKyAqIFRoZSByZWVudHJhbnQgY29kZSByZWxpZXMgb24gdGhlIG9wYXF1ZSBzZXR0aW5nLCBidXQgYWRkcyBmZWF0dXJlcy4KKyAqLworI2lmbmRlZiBOQ1VSU0VTX1JFRU5UUkFOVAorI2RlZmluZSBOQ1VSU0VTX1JFRU5UUkFOVCAwCisjZW5kaWYKKworLyoKKyAqIENvbnRyb2wgd2hldGhlciBiaW5kaW5ncyBmb3IgaW50ZXJvcCBzdXBwb3J0IGFyZSBhZGRlZC4KKyAqLworI3VuZGVmCU5DVVJTRVNfSU5URVJPUF9GVU5DUworI2RlZmluZQlOQ1VSU0VTX0lOVEVST1BfRlVOQ1MgMAorCisvKgorICogVGhlIGludGVybmFsIHR5cGUgdXNlZCBmb3Igd2luZG93IGRpbWVuc2lvbnMuCisgKi8KKyN1bmRlZglOQ1VSU0VTX1NJWkVfVAorI2RlZmluZQlOQ1VSU0VTX1NJWkVfVCBzaG9ydAorCisvKgorICogQ29udHJvbCB3aGV0aGVyIHRwYXJtKCkgc3VwcG9ydHMgdmFyYXJncyBvciBmaXhlZC1wYXJhbWV0ZXIgbGlzdC4KKyAqLworI3VuZGVmIE5DVVJTRVNfVFBBUk1fVkFSQVJHUworI2RlZmluZSBOQ1VSU0VTX1RQQVJNX1ZBUkFSR1MgMQorCisvKgorICogTkNVUlNFU19DSF9UIGlzIHVzZWQgaW4gYnVpbGRpbmcgdGhlIGxpYnJhcnksIGJ1dCBub3QgdXNlZCBvdGhlcndpc2UgaW4KKyAqIHRoaXMgaGVhZGVyIGZpbGUsIHNpbmNlIHRoYXQgd291bGQgbWFrZSB0aGUgbm9ybWFsL3dpZGUtY2hhcmFjdGVyIHZlcnNpb25zCisgKiBvZiB0aGUgaGVhZGVyIGluY29tcGF0aWJsZS4KKyAqLworI3VuZGVmCU5DVVJTRVNfQ0hfVAorI2RlZmluZSBOQ1VSU0VTX0NIX1QgY2h0eXBlCisKKyNpZiAwICYmIGRlZmluZWQoX0xQNjQpCit0eXBlZGVmIHVuc2lnbmVkIGNodHlwZTsKK3R5cGVkZWYgdW5zaWduZWQgbW1hc2tfdDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2h0eXBlOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG1tYXNrX3Q7CisjZW5kaWYKKworLyoKKyAqIFdlIG5lZWQgRklMRSwgZXRjLiAgSW5jbHVkZSB0aGlzIGJlZm9yZSBjaGVja2luZyBhbnkgZmVhdHVyZSBzeW1ib2xzLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAqIFdpdGggWFBHNCwgeW91IG11c3QgZGVmaW5lIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQsIGl0IGlzIHJlZHVuZGFudCAob3IKKyAqIGNvbmZsaWN0aW5nKSB3aGVuIF9YT1BFTl9TT1VSQ0UgaXMgNTAwIG9yIGdyZWF0ZXIuCisgKi8KKyN1bmRlZiBOQ1VSU0VTX1dJREVDSEFSCisjaWYgZGVmaW5lZChfWE9QRU5fU09VUkNFX0VYVEVOREVEKSB8fCBkZWZpbmVkKF9YUEc1KQorI2RlZmluZSBOQ1VSU0VTX1dJREVDSEFSCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgkvKiB3ZSBuZWVkIHZhX2xpc3QgKi8KKyNpZmRlZiBOQ1VSU0VTX1dJREVDSEFSCisjaW5jbHVkZSA8c3RkZGVmLmg+CS8qIHdlIHdhbnQgd2NoYXJfdCAqLworI2VuZGlmCisKKy8qIFgvT3BlbiBhbmQgU1ZyNCBzcGVjaWZ5IHRoYXQgY3Vyc2VzIGltcGxlbWVudHMgJ2Jvb2wnLiAgSG93ZXZlciwgQysrIG1heSBhbHNvCisgKiBpbXBsZW1lbnQgaXQuICBJZiBzbywgd2UgbXVzdCB1c2UgdGhlIEMrKyBjb21waWxlcidzIHR5cGUgdG8gYXZvaWQgY29uZmxpY3QKKyAqIHdpdGggb3RoZXIgaW50ZXJmYWNlcy4KKyAqCisgKiBBIGZ1cnRoZXIgY29tcGxpY2F0aW9uIGlzIHRoYXQgPHN0ZGJvb2wuaD4gbWF5IGRlY2xhcmUgJ2Jvb2wnIHRvIGJlIGEKKyAqIGRpZmZlcmVudCB0eXBlLCBzdWNoIGFzIGFuIGVudW0gd2hpY2ggaXMgbm90IG5lY2Vzc2FyaWx5IGNvbXBhdGlibGUgd2l0aAorICogQysrLiAgSWYgd2UgaGF2ZSA8c3RkYm9vbC5oPiwgbWFrZSAnYm9vbCcgYSBtYWNybywgc28gdXNlcnMgbWF5ICN1bmRlZiBpdC4KKyAqIE90aGVyd2lzZSwgbGV0IGl0IHJlbWFpbiBhIHR5cGVkZWYgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggb3RoZXIgI2RlZmluZSdzLgorICogSW4gZWl0aGVyIGNhc2UsIG1ha2UgYSB0eXBlZGVmIGZvciBOQ1VSU0VTX0JPT0wgd2hpY2ggY2FuIGJlIHVzZWQgaWYgbmVlZGVkCisgKiBmcm9tIGVpdGhlciBDIG9yIEMrKy4KKyAqLworCisjdW5kZWYgVFJVRQorI2RlZmluZSBUUlVFICAgIDEKKworI3VuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICAgMAorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgTkNVUlNFU19CT09MOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykJLyogX19jcGx1c3BsdXMsIGV0Yy4gKi8KKworLyogdXNlIHRoZSBDKysgY29tcGlsZXIncyBib29sIHR5cGUgKi8KKyNkZWZpbmUgTkNVUlNFU19CT09MIGJvb2wKKworI2Vsc2UJCQkvKiBjODksIGM5OSwgZXRjLiAqLworCisjaWYgTkNVUlNFU19FTkFCTEVfU1REQk9PTF9ICisjaW5jbHVkZSA8c3RkYm9vbC5oPgorLyogdXNlIHdoYXRldmVyIHRoZSBDIGNvbXBpbGVyIGRlY2lkZXMgYm9vbCByZWFsbHkgaXMgKi8KKyNkZWZpbmUgTkNVUlNFU19CT09MIGJvb2wKKyNlbHNlCisvKiB0aGVyZSBpcyBubyBwcmVkZWZpbmVkIGJvb2wgLSB1c2Ugb3VyIG93biAqLworI3VuZGVmIGJvb2wKKyNkZWZpbmUgYm9vbCBOQ1VSU0VTX0JPT0wKKyNlbmRpZgorCisjZW5kaWYgLyogIV9fY3BsdXNwbHVzLCBldGMuICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZGVmaW5lIE5DVVJTRVNfQ0FTVCh0eXBlLHZhbHVlKSBzdGF0aWNfY2FzdDx0eXBlPih2YWx1ZSkKKyNlbHNlCisjZGVmaW5lIE5DVVJTRVNfQ0FTVCh0eXBlLHZhbHVlKSAodHlwZSkodmFsdWUpCisjZW5kaWYKKworLyoKKyAqIFgvT3BlbiBhdHRyaWJ1dGVzLiAgSW4gdGhlIG5jdXJzZXMgaW1wbGVtZW50YXRpb24sIHRoZXkgYXJlIGlkZW50aWNhbCB0byB0aGUKKyAqIEFfIGF0dHJpYnV0ZXMuCisgKi8KKyNkZWZpbmUgV0FfQVRUUklCVVRFUwlBX0FUVFJJQlVURVMKKyNkZWZpbmUgV0FfTk9STUFMCUFfTk9STUFMCisjZGVmaW5lIFdBX1NUQU5ET1VUCUFfU1RBTkRPVVQKKyNkZWZpbmUgV0FfVU5ERVJMSU5FCUFfVU5ERVJMSU5FCisjZGVmaW5lIFdBX1JFVkVSU0UJQV9SRVZFUlNFCisjZGVmaW5lIFdBX0JMSU5LCUFfQkxJTksKKyNkZWZpbmUgV0FfRElNCQlBX0RJTQorI2RlZmluZSBXQV9CT0xECQlBX0JPTEQKKyNkZWZpbmUgV0FfQUxUQ0hBUlNFVAlBX0FMVENIQVJTRVQKKyNkZWZpbmUgV0FfSU5WSVMJQV9JTlZJUworI2RlZmluZSBXQV9QUk9URUNUCUFfUFJPVEVDVAorI2RlZmluZSBXQV9IT1JJWk9OVEFMCUFfSE9SSVpPTlRBTAorI2RlZmluZSBXQV9MRUZUCQlBX0xFRlQKKyNkZWZpbmUgV0FfTE9XCQlBX0xPVworI2RlZmluZSBXQV9SSUdIVAlBX1JJR0hUCisjZGVmaW5lIFdBX1RPUAkJQV9UT1AKKyNkZWZpbmUgV0FfVkVSVElDQUwJQV9WRVJUSUNBTAorCisvKiBjb2xvcnMgKi8KKyNkZWZpbmUgQ09MT1JfQkxBQ0sJMAorI2RlZmluZSBDT0xPUl9SRUQJMQorI2RlZmluZSBDT0xPUl9HUkVFTgkyCisjZGVmaW5lIENPTE9SX1lFTExPVwkzCisjZGVmaW5lIENPTE9SX0JMVUUJNAorI2RlZmluZSBDT0xPUl9NQUdFTlRBCTUKKyNkZWZpbmUgQ09MT1JfQ1lBTgk2CisjZGVmaW5lIENPTE9SX1dISVRFCTcKKworLyogbGluZSBncmFwaGljcyAqLworCisjaWYgMCB8fCBOQ1VSU0VTX1JFRU5UUkFOVAorTkNVUlNFU19XUkFQUEVEX1ZBUihjaHR5cGUqLCBhY3NfbWFwKTsKKyNkZWZpbmUgYWNzX21hcCBOQ1VSU0VTX1BVQkxJQ19WQVIoYWNzX21hcCgpKQorI2Vsc2UKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoY2h0eXBlKSBhY3NfbWFwW107CisjZW5kaWYKKworI2RlZmluZSBOQ1VSU0VTX0FDUyhjKQkoYWNzX21hcFtOQ1VSU0VTX0NBU1QodW5zaWduZWQgY2hhcixjKV0pCisKKy8qIFZUMTAwIHN5bWJvbHMgYmVnaW4gaGVyZSAqLworI2RlZmluZSBBQ1NfVUxDT1JORVIJTkNVUlNFU19BQ1MoJ2wnKSAvKiB1cHBlciBsZWZ0IGNvcm5lciAqLworI2RlZmluZSBBQ1NfTExDT1JORVIJTkNVUlNFU19BQ1MoJ20nKSAvKiBsb3dlciBsZWZ0IGNvcm5lciAqLworI2RlZmluZSBBQ1NfVVJDT1JORVIJTkNVUlNFU19BQ1MoJ2snKSAvKiB1cHBlciByaWdodCBjb3JuZXIgKi8KKyNkZWZpbmUgQUNTX0xSQ09STkVSCU5DVVJTRVNfQUNTKCdqJykgLyogbG93ZXIgcmlnaHQgY29ybmVyICovCisjZGVmaW5lIEFDU19MVEVFCU5DVVJTRVNfQUNTKCd0JykgLyogdGVlIHBvaW50aW5nIHJpZ2h0ICovCisjZGVmaW5lIEFDU19SVEVFCU5DVVJTRVNfQUNTKCd1JykgLyogdGVlIHBvaW50aW5nIGxlZnQgKi8KKyNkZWZpbmUgQUNTX0JURUUJTkNVUlNFU19BQ1MoJ3YnKSAvKiB0ZWUgcG9pbnRpbmcgdXAgKi8KKyNkZWZpbmUgQUNTX1RURUUJTkNVUlNFU19BQ1MoJ3cnKSAvKiB0ZWUgcG9pbnRpbmcgZG93biAqLworI2RlZmluZSBBQ1NfSExJTkUJTkNVUlNFU19BQ1MoJ3EnKSAvKiBob3Jpem9udGFsIGxpbmUgKi8KKyNkZWZpbmUgQUNTX1ZMSU5FCU5DVVJTRVNfQUNTKCd4JykgLyogdmVydGljYWwgbGluZSAqLworI2RlZmluZSBBQ1NfUExVUwlOQ1VSU0VTX0FDUygnbicpIC8qIGxhcmdlIHBsdXMgb3IgY3Jvc3NvdmVyICovCisjZGVmaW5lIEFDU19TMQkJTkNVUlNFU19BQ1MoJ28nKSAvKiBzY2FuIGxpbmUgMSAqLworI2RlZmluZSBBQ1NfUzkJCU5DVVJTRVNfQUNTKCdzJykgLyogc2NhbiBsaW5lIDkgKi8KKyNkZWZpbmUgQUNTX0RJQU1PTkQJTkNVUlNFU19BQ1MoJ2AnKSAvKiBkaWFtb25kICovCisjZGVmaW5lIEFDU19DS0JPQVJECU5DVVJTRVNfQUNTKCdhJykgLyogY2hlY2tlciBib2FyZCAoc3RpcHBsZSkgKi8KKyNkZWZpbmUgQUNTX0RFR1JFRQlOQ1VSU0VTX0FDUygnZicpIC8qIGRlZ3JlZSBzeW1ib2wgKi8KKyNkZWZpbmUgQUNTX1BMTUlOVVMJTkNVUlNFU19BQ1MoJ2cnKSAvKiBwbHVzL21pbnVzICovCisjZGVmaW5lIEFDU19CVUxMRVQJTkNVUlNFU19BQ1MoJ34nKSAvKiBidWxsZXQgKi8KKy8qIFRlbGV0eXBlIDU0MTB2MSBzeW1ib2xzIGJlZ2luIGhlcmUgKi8KKyNkZWZpbmUgQUNTX0xBUlJPVwlOQ1VSU0VTX0FDUygnLCcpIC8qIGFycm93IHBvaW50aW5nIGxlZnQgKi8KKyNkZWZpbmUgQUNTX1JBUlJPVwlOQ1VSU0VTX0FDUygnKycpIC8qIGFycm93IHBvaW50aW5nIHJpZ2h0ICovCisjZGVmaW5lIEFDU19EQVJST1cJTkNVUlNFU19BQ1MoJy4nKSAvKiBhcnJvdyBwb2ludGluZyBkb3duICovCisjZGVmaW5lIEFDU19VQVJST1cJTkNVUlNFU19BQ1MoJy0nKSAvKiBhcnJvdyBwb2ludGluZyB1cCAqLworI2RlZmluZSBBQ1NfQk9BUkQJTkNVUlNFU19BQ1MoJ2gnKSAvKiBib2FyZCBvZiBzcXVhcmVzICovCisjZGVmaW5lIEFDU19MQU5URVJOCU5DVVJTRVNfQUNTKCdpJykgLyogbGFudGVybiBzeW1ib2wgKi8KKyNkZWZpbmUgQUNTX0JMT0NLCU5DVVJTRVNfQUNTKCcwJykgLyogc29saWQgc3F1YXJlIGJsb2NrICovCisvKgorICogVGhlc2UgYXJlbid0IGRvY3VtZW50ZWQsIGJ1dCBhIGxvdCBvZiBTeXN0ZW0gVnMgaGF2ZSB0aGVtIGFueXdheQorICogKHlvdSBjYW4gc3BvdCBwcHJyeXl6ent7fHx9fSBpbiBhIGxvdCBvZiBBVCZUIHRlcm1pbmZvIHN0cmluZ3MpLgorICogVGhlIEFDU19uYW1lcyBtYXkgbm90IG1hdGNoIEFUJlQncywgb3VyIHNvdXJjZSBkaWRuJ3Qga25vdyB0aGVtLgorICovCisjZGVmaW5lIEFDU19TMwkJTkNVUlNFU19BQ1MoJ3AnKSAvKiBzY2FuIGxpbmUgMyAqLworI2RlZmluZSBBQ1NfUzcJCU5DVVJTRVNfQUNTKCdyJykgLyogc2NhbiBsaW5lIDcgKi8KKyNkZWZpbmUgQUNTX0xFUVVBTAlOQ1VSU0VTX0FDUygneScpIC8qIGxlc3MvZXF1YWwgKi8KKyNkZWZpbmUgQUNTX0dFUVVBTAlOQ1VSU0VTX0FDUygneicpIC8qIGdyZWF0ZXIvZXF1YWwgKi8KKyNkZWZpbmUgQUNTX1BJCQlOQ1VSU0VTX0FDUygneycpIC8qIFBpICovCisjZGVmaW5lIEFDU19ORVFVQUwJTkNVUlNFU19BQ1MoJ3wnKSAvKiBub3QgZXF1YWwgKi8KKyNkZWZpbmUgQUNTX1NURVJMSU5HCU5DVVJTRVNfQUNTKCd9JykgLyogVUsgcG91bmQgc2lnbiAqLworCisvKgorICogTGluZSBkcmF3aW5nIEFDUyBuYW1lcyBhcmUgb2YgdGhlIGZvcm0gQUNTX3RyYmwsIHdoZXJlIHQgaXMgdGhlIHRvcCwgcgorICogaXMgdGhlIHJpZ2h0LCBiIGlzIHRoZSBib3R0b20sIGFuZCBsIGlzIHRoZSBsZWZ0LiAgdCwgciwgYiwgYW5kIGwgbWlnaHQKKyAqIGJlIEIgKGJsYW5rKSwgUyAoc2luZ2xlKSwgRCAoZG91YmxlKSwgb3IgVCAodGhpY2spLiAgVGhlIHN1YnNldCBkZWZpbmVkCisgKiBoZXJlIG9ubHkgdXNlcyBCIGFuZCBTLgorICovCisjZGVmaW5lIEFDU19CU1NCCUFDU19VTENPUk5FUgorI2RlZmluZSBBQ1NfU1NCQglBQ1NfTExDT1JORVIKKyNkZWZpbmUgQUNTX0JCU1MJQUNTX1VSQ09STkVSCisjZGVmaW5lIEFDU19TQkJTCUFDU19MUkNPUk5FUgorI2RlZmluZSBBQ1NfU0JTUwlBQ1NfUlRFRQorI2RlZmluZSBBQ1NfU1NTQglBQ1NfTFRFRQorI2RlZmluZSBBQ1NfU1NCUwlBQ1NfQlRFRQorI2RlZmluZSBBQ1NfQlNTUwlBQ1NfVFRFRQorI2RlZmluZSBBQ1NfQlNCUwlBQ1NfSExJTkUKKyNkZWZpbmUgQUNTX1NCU0IJQUNTX1ZMSU5FCisjZGVmaW5lIEFDU19TU1NTCUFDU19QTFVTCisKKyN1bmRlZglFUlIKKyNkZWZpbmUgRVJSICAgICAoLTEpCisKKyN1bmRlZglPSworI2RlZmluZSBPSyAgICAgICgwKQorCisvKiB2YWx1ZXMgZm9yIHRoZSBfZmxhZ3MgbWVtYmVyICovCisjZGVmaW5lIF9TVUJXSU4gICAgICAgICAweDAxCS8qIGlzIHRoaXMgYSBzdWItd2luZG93PyAqLworI2RlZmluZSBfRU5ETElORSAgICAgICAgMHgwMgkvKiBpcyB0aGUgd2luZG93IGZsdXNoIHJpZ2h0PyAqLworI2RlZmluZSBfRlVMTFdJTiAgICAgICAgMHgwNAkvKiBpcyB0aGUgd2luZG93IGZ1bGwtc2NyZWVuPyAqLworI2RlZmluZSBfU0NST0xMV0lOICAgICAgMHgwOAkvKiBib3R0b20gZWRnZSBpcyBhdCBzY3JlZW4gYm90dG9tPyAqLworI2RlZmluZSBfSVNQQUQJICAgICAgICAweDEwCS8qIGlzIHRoaXMgd2luZG93IGEgcGFkPyAqLworI2RlZmluZSBfSEFTTU9WRUQgICAgICAgMHgyMAkvKiBoYXMgY3Vyc29yIG1vdmVkIHNpbmNlIGxhc3QgcmVmcmVzaD8gKi8KKyNkZWZpbmUgX1dSQVBQRUQgICAgICAgIDB4NDAJLyogY3Vyc29yIHdhcyBqdXN0IHdyYXBwcGVkICovCisKKy8qCisgKiB0aGlzIHZhbHVlIGlzIHVzZWQgaW4gdGhlIGZpcnN0Y2hhciBhbmQgbGFzdGNoYXIgZmllbGRzIHRvIG1hcmsKKyAqIHVuY2hhbmdlZCBsaW5lcworICovCisjZGVmaW5lIF9OT0NIQU5HRSAgICAgICAtMQorCisvKgorICogdGhpcyB2YWx1ZSBpcyB1c2VkIGluIHRoZSBvbGRpbmRleCBmaWVsZCB0byBtYXJrIGxpbmVzIGNyZWF0ZWQgYnkgaW5zZXJ0aW9ucworICogYW5kIHNjcm9sbHMuCisgKi8KKyNkZWZpbmUgX05FV0lOREVYCS0xCisKK3R5cGVkZWYgc3RydWN0IHNjcmVlbiAgU0NSRUVOOwordHlwZWRlZiBzdHJ1Y3QgX3dpbl9zdCBXSU5ET1c7CisKK3R5cGVkZWYJY2h0eXBlCWF0dHJfdDsJCS8qIC4uLm11c3QgYmUgYXQgbGVhc3QgYXMgd2lkZSBhcyBjaHR5cGUgKi8KKworI2lmZGVmIE5DVVJTRVNfV0lERUNIQVIKKworI2lmIDAKKyNpZmRlZiBtYmxlbgkJCS8qIGxpYnV0ZjguaCBkZWZpbmVzIGl0IHcvbyB1bmRlZmluaW5nIGZpcnN0ICovCisjdW5kZWYgbWJsZW4KKyNlbmRpZgorI2luY2x1ZGUgPGxpYnV0ZjguaD4KKyNlbmRpZgorCisjaWYgMAorI2luY2x1ZGUgPHdjaGFyLmg+CQkvKiAuLi50byBnZXQgbWJzdGF0ZV90LCBldGMuICovCisjZW5kaWYKKworI2lmIDAKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgd2NoYXJfdDsKKyNlbmRpZgorCisjaWYgMAordHlwZWRlZiB1bnNpZ25lZCBpbnQgd2ludF90OworI2VuZGlmCisKKy8qCisgKiBjY2hhcl90IHN0b3JlcyBhbiBhcnJheSBvZiBDQ0hBUldfTUFYIHdpZGUgY2hhcmFjdGVycy4gIFRoZSBmaXJzdCBpcworICogbm9ybWFsbHkgYSBzcGFjaW5nIGNoYXJhY3Rlci4gIFRoZSBvdGhlcnMgYXJlIG5vbi1zcGFjaW5nLiAgSWYgdGhvc2UKKyAqIChzcGFjaW5nIGFuZCBub25zcGFjaW5nKSBkbyBub3QgZmlsbCB0aGUgYXJyYXksIGEgbnVsbCBMJ1wwJyBmb2xsb3dzLiAKKyAqIE90aGVyd2lzZSwgYSBudWxsIGlzIGFzc3VtZWQgdG8gZm9sbG93IHdoZW4gZXh0cmFjdGluZyB2aWEgZ2V0Y2NoYXIoKS4KKyAqLworI2RlZmluZSBDQ0hBUldfTUFYCTUKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYXR0cl90CWF0dHI7CisgICAgd2NoYXJfdAljaGFyc1tDQ0hBUldfTUFYXTsKKyNpZiAwCisjdW5kZWYgTkNVUlNFU19FWFRfQ09MT1JTCisjZGVmaW5lIE5DVVJTRVNfRVhUX0NPTE9SUyAyMDExMDQwNAorICAgIGludAkJZXh0X2NvbG9yOwkvKiBjb2xvciBwYWlyLCBtdXN0IGJlIG1vcmUgdGhhbiAxNi1iaXRzICovCisjZW5kaWYKK30KK2NjaGFyX3Q7CisKKyNlbmRpZiAvKiBOQ1VSU0VTX1dJREVDSEFSICovCisKKyNpZiAhTkNVUlNFU19PUEFRVUUKK3N0cnVjdCBsZGF0OworCitzdHJ1Y3QgX3dpbl9zdAoreworCU5DVVJTRVNfU0laRV9UIF9jdXJ5LCBfY3VyeDsgLyogY3VycmVudCBjdXJzb3IgcG9zaXRpb24gKi8KKworCS8qIHdpbmRvdyBsb2NhdGlvbiBhbmQgc2l6ZSAqLworCU5DVVJTRVNfU0laRV9UIF9tYXh5LCBfbWF4eDsgLyogbWF4aW11bXMgb2YgeCBhbmQgeSwgTk9UIHdpbmRvdyBzaXplICovCisJTkNVUlNFU19TSVpFX1QgX2JlZ3ksIF9iZWd4OyAvKiBzY3JlZW4gY29vcmRzIG9mIHVwcGVyLWxlZnQtaGFuZCBjb3JuZXIgKi8KKworCXNob3J0ICAgX2ZsYWdzOwkJLyogd2luZG93IHN0YXRlIGZsYWdzICovCisKKwkvKiBhdHRyaWJ1dGUgdHJhY2tpbmcgKi8KKwlhdHRyX3QgIF9hdHRyczsJCS8qIGN1cnJlbnQgYXR0cmlidXRlIGZvciBub24tc3BhY2UgY2hhcmFjdGVyICovCisJY2h0eXBlICBfYmtnZDsJCS8qIGN1cnJlbnQgYmFja2dyb3VuZCBjaGFyL2F0dHJpYnV0ZSBwYWlyICovCisKKwkvKiBvcHRpb24gdmFsdWVzIHNldCBieSB1c2VyICovCisJYm9vbAlfbm90aW1lb3V0OwkvKiBubyB0aW1lIG91dCBvbiBmdW5jdGlvbi1rZXkgZW50cnk/ICovCisJYm9vbAlfY2xlYXI7CQkvKiBjb25zaWRlciBhbGwgZGF0YSBpbiB0aGUgd2luZG93IGludmFsaWQ/ICovCisJYm9vbAlfbGVhdmVvazsJLyogT0sgdG8gbm90IHJlc2V0IGN1cnNvciBvbiBleGl0PyAqLworCWJvb2wJX3Njcm9sbDsJLyogT0sgdG8gc2Nyb2xsIHRoaXMgd2luZG93PyAqLworCWJvb2wJX2lkbG9rOwkJLyogT0sgdG8gdXNlIGluc2VydC9kZWxldGUgbGluZT8gKi8KKwlib29sCV9pZGNvazsJCS8qIE9LIHRvIHVzZSBpbnNlcnQvZGVsZXRlIGNoYXI/ICovCisJYm9vbAlfaW1tZWQ7CQkvKiB3aW5kb3cgaW4gaW1tZWQgbW9kZT8gKG5vdCB5ZXQgdXNlZCkgKi8KKwlib29sCV9zeW5jOwkJLyogd2luZG93IGluIHN5bmMgbW9kZT8gKi8KKwlib29sCV91c2Vfa2V5cGFkOwkvKiBwcm9jZXNzIGZ1bmN0aW9uIGtleXMgaW50byBLRVlfIHN5bWJvbHM/ICovCisJaW50CV9kZWxheTsJCS8qIDAgPSBub2RlbGF5LCA8MCA9IGJsb2NraW5nLCA+MCA9IGRlbGF5ICovCisKKwlzdHJ1Y3QgbGRhdCAqX2xpbmU7CS8qIHRoZSBhY3R1YWwgbGluZSBkYXRhICovCisKKwkvKiBnbG9iYWwgc2NyZWVuIHN0YXRlICovCisJTkNVUlNFU19TSVpFX1QgX3JlZ3RvcDsJLyogdG9wIGxpbmUgb2Ygc2Nyb2xsaW5nIHJlZ2lvbiAqLworCU5DVVJTRVNfU0laRV9UIF9yZWdib3R0b207IC8qIGJvdHRvbSBsaW5lIG9mIHNjcm9sbGluZyByZWdpb24gKi8KKworCS8qIHRoZXNlIGFyZSB1c2VkIG9ubHkgaWYgdGhpcyBpcyBhIHN1Yi13aW5kb3cgKi8KKwlpbnQJX3Bhcng7CQkvKiB4IGNvb3JkaW5hdGUgb2YgdGhpcyB3aW5kb3cgaW4gcGFyZW50ICovCisJaW50CV9wYXJ5OwkJLyogeSBjb29yZGluYXRlIG9mIHRoaXMgd2luZG93IGluIHBhcmVudCAqLworCVdJTkRPVwkqX3BhcmVudDsJLyogcG9pbnRlciB0byBwYXJlbnQgaWYgYSBzdWItd2luZG93ICovCisKKwkvKiB0aGVzZSBhcmUgdXNlZCBvbmx5IGlmIHRoaXMgaXMgYSBwYWQgKi8KKwlzdHJ1Y3QgcGRhdAorCXsKKwkgICAgTkNVUlNFU19TSVpFX1QgX3BhZF95LCAgICAgIF9wYWRfeDsKKwkgICAgTkNVUlNFU19TSVpFX1QgX3BhZF90b3AsICAgIF9wYWRfbGVmdDsKKwkgICAgTkNVUlNFU19TSVpFX1QgX3BhZF9ib3R0b20sIF9wYWRfcmlnaHQ7CisJfSBfcGFkOworCisJTkNVUlNFU19TSVpFX1QgX3lvZmZzZXQ7IC8qIHJlYWwgYmVneSBpcyBfYmVneSArIF95b2Zmc2V0ICovCisKKyNpZmRlZiBOQ1VSU0VTX1dJREVDSEFSCisJY2NoYXJfdCAgX2JrZ3JuZDsJLyogY3VycmVudCBiYWNrZ3JvdW5kIGNoYXIvYXR0cmlidXRlIHBhaXIgKi8KKyNpZiAwCisJaW50CV9jb2xvcjsJCS8qIGN1cnJlbnQgY29sb3ItcGFpciBmb3Igbm9uLXNwYWNlIGNoYXJhY3RlciAqLworI2VuZGlmCisjZW5kaWYKK307CisjZW5kaWYgLyogTkNVUlNFU19PUEFRVUUgKi8KKworLyoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHN1cHBvcnQgZXZlbnRzLi4uCisgKi8KKyNpZiAxCisjaWZkZWYgTkNVUlNFU19XR0VUQ0hfRVZFTlRTCisjaWYgIWRlZmluZWQoX19CRU9TX18pIHx8IGRlZmluZWQoX19IQUlLVV9fKQorICAgLyogRml4IF9uY190aW1lZF93YWl0KCkgb24gQkVPUy4uLiAqLworIyAgZGVmaW5lIE5DVVJTRVNfRVZFTlRfVkVSU0lPTgkxCisjZW5kaWYJLyogIWRlZmluZWQoX19CRU9TX18pICovCisKKy8qCisgKiBCaXRzIHRvIHNldCBpbiBfbmNfZXZlbnQuZGF0YS5mbGFncworICovCisjICBkZWZpbmUgX05DX0VWRU5UX1RJTUVPVVRfTVNFQwkxCisjICBkZWZpbmUgX05DX0VWRU5UX0ZJTEUJCTIKKyMgIGRlZmluZSBfTkNfRVZFTlRfRklMRV9SRUFEQUJMRQkyCisjICBpZiAwCQkJCQkvKiBOb3Qgc3VwcG9ydGVkIHlldC4uLiAqLworIyAgICBkZWZpbmUgX05DX0VWRU5UX0ZJTEVfV1JJVEFCTEUJNAorIyAgICBkZWZpbmUgX05DX0VWRU5UX0ZJTEVfRVhDRVBUSU9OCTgKKyMgIGVuZGlmCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IHR5cGU7CisgICAgdW5pb24KKyAgICB7CisJbG9uZyB0aW1lb3V0X21zZWM7CS8qIF9OQ19FVkVOVF9USU1FT1VUX01TRUMgKi8KKwlzdHJ1Y3QKKwl7CisJICAgIHVuc2lnbmVkIGludCBmbGFnczsKKwkgICAgaW50IGZkOworCSAgICB1bnNpZ25lZCBpbnQgcmVzdWx0OworCX0gZmV2OwkJCQkvKiBfTkNfRVZFTlRfRklMRSAqLworICAgIH0gZGF0YTsKK30gX25jX2V2ZW50OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCBjb3VudDsKKyAgICBpbnQgcmVzdWx0X2ZsYWdzOwkvKiBfTkNfRVZFTlRfVElNRU9VVF9NU0VDIG9yIF9OQ19FVkVOVF9GSUxFX1JFQURBQkxFICovCisgICAgX25jX2V2ZW50ICpldmVudHNbMV07Cit9IF9uY19ldmVudGxpc3Q7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdnZXRjaF9ldmVudHMgKFdJTkRPVyAqLCBfbmNfZXZlbnRsaXN0ICopOwkvKiBleHBlcmltZW50YWwgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdnZXRuc3RyX2V2ZW50cyAoV0lORE9XICosY2hhciAqLGludCxfbmNfZXZlbnRsaXN0ICopOy8qIGV4cGVyaW1lbnRhbCAqLworCisjZW5kaWYgLyogTkNVUlNFU19XR0VUQ0hfRVZFTlRTICovCisjZW5kaWYgLyogTkNVUlNFU19FWFRfRlVOQ1MgKi8KKworLyoKKyAqIEdDQyAoYW5kIHNvbWUgb3RoZXIgY29tcGlsZXJzKSBkZWZpbmUgJ19fYXR0cmlidXRlX18nOyB3ZSdyZSB1c2luZyB0aGlzCisgKiBtYWNybyB0byBhbGVydCB0aGUgY29tcGlsZXIgdG8gZmxhZyBpbmNvbnNpc3RlbmNpZXMgaW4gcHJpbnRmL3NjYW5mLWxpa2UKKyAqIGZ1bmN0aW9uIGNhbGxzLiAgSnVzdCBpbiBjYXNlICdfX2F0dHJpYnV0ZV9fJyBpc24ndCBkZWZpbmVkLCBtYWtlIGEgZHVtbXkuCisgKiBPbGQgdmVyc2lvbnMgb2YgRysrIGRvIG5vdCBhY2NlcHQgaXQgYW55d2F5LCBhdCBsZWFzdCBub3QgY29uc2lzdGVudGx5IHdpdGgKKyAqIEdDQy4KKyAqLworI2lmICEoZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0dOVUdfXykgfHwgZGVmaW5lZChfX2F0dHJpYnV0ZV9fKSkKKyNkZWZpbmUgX19hdHRyaWJ1dGVfXyhwKSAvKiBub3RoaW5nICovCisjZW5kaWYKKworLyoKKyAqIFdlIGNhbm5vdCBkZWZpbmUgdGhlc2UgaW4gbmN1cnNlc19jZmcuaCwgc2luY2UgdGhleSByZXF1aXJlIHBhcmFtZXRlcnMgdG8gYmUKKyAqIHBhc3NlZCAodGhhdCBpcyBub24tcG9ydGFibGUpLiAgSWYgeW91IGhhcHBlbiB0byBiZSB1c2luZyBnY2Mgd2l0aCB3YXJuaW5ncworICogZW5hYmxlZCwgZGVmaW5lCisgKglHQ0NfUFJJTlRGCisgKglHQ0NfU0NBTkYKKyAqIHRvIGltcHJvdmUgY2hlY2tpbmcgb2YgY2FsbHMgdG8gcHJpbnR3KCksIGV0Yy4KKyAqLworI2lmbmRlZiBHQ0NfUFJJTlRGTElLRQorI2lmIGRlZmluZWQoR0NDX1BSSU5URikgJiYgIWRlZmluZWQocHJpbnRmKQorI2RlZmluZSBHQ0NfUFJJTlRGTElLRShmbXQsdmFyKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLGZtdCx2YXIpKSkKKyNlbHNlCisjZGVmaW5lIEdDQ19QUklOVEZMSUtFKGZtdCx2YXIpIC8qbm90aGluZyovCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEdDQ19TQ0FORkxJS0UKKyNpZiBkZWZpbmVkKEdDQ19TQ0FORikgJiYgIWRlZmluZWQoc2NhbmYpCisjZGVmaW5lIEdDQ19TQ0FORkxJS0UoZm10LHZhcikgIF9fYXR0cmlidXRlX18oKGZvcm1hdChzY2FuZixmbXQsdmFyKSkpCisjZWxzZQorI2RlZmluZSBHQ0NfU0NBTkZMSUtFKGZtdCx2YXIpICAvKm5vdGhpbmcqLworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZglHQ0NfTk9SRVRVUk4KKyNkZWZpbmUJR0NDX05PUkVUVVJOIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisjaWZuZGVmCUdDQ19VTlVTRUQKKyNkZWZpbmUJR0NDX1VOVVNFRCAvKiBub3RoaW5nICovCisjZW5kaWYKKworLyoKKyAqIEN1cnNlcyB1c2VzIGEgaGVscGVyIGZ1bmN0aW9uLiAgRGVmaW5lIG91ciB0eXBlIGZvciB0aGlzIHRvIHNpbXBsaWZ5CisgKiBleHRlbmRpbmcgaXQgZm9yIHRoZSBzcC1mdW5jcyBmZWF0dXJlLgorICovCit0eXBlZGVmIGludCAoKk5DVVJTRVNfT1VUQykoaW50KTsKKworLyoKKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMuICBUaGlzIGlzIHRoZSBjb21wbGV0ZSBYL09wZW4gQ3Vyc2VzIGxpc3Qgb2YgcmVxdWlyZWQKKyAqIGZ1bmN0aW9ucy4gIFRob3NlIG1hcmtlZCBgZ2VuZXJhdGVkJyB3aWxsIGhhdmUgc291cmNlcyBnZW5lcmF0ZWQgZnJvbSB0aGUKKyAqIG1hY3JvIGRlZmluaXRpb25zIGxhdGVyIGluIHRoaXMgZmlsZSwgaW4gb3JkZXIgdG8gc2F0aXNmeSBYUEc0LjIKKyAqIHJlcXVpcmVtZW50cy4KKyAqLworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhZGRjaCAoY29uc3QgY2h0eXBlKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGFkZGNobnN0ciAoY29uc3QgY2h0eXBlICosIGludCk7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGFkZGNoc3RyIChjb25zdCBjaHR5cGUgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhZGRuc3RyIChjb25zdCBjaGFyICosIGludCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhZGRzdHIgKGNvbnN0IGNoYXIgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhdHRyb2ZmIChOQ1VSU0VTX0FUVFJfVCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhdHRyb24gKE5DVVJTRVNfQVRUUl9UKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGF0dHJzZXQgKE5DVVJTRVNfQVRUUl9UKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGF0dHJfZ2V0IChhdHRyX3QgKiwgc2hvcnQgKiwgdm9pZCAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhdHRyX29mZiAoYXR0cl90LCB2b2lkICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYXR0cl9vbiAoYXR0cl90LCB2b2lkICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYXR0cl9zZXQgKGF0dHJfdCwgc2hvcnQsIHZvaWQgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGJhdWRyYXRlICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGJlZXAgICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGJrZ2QgKGNodHlwZSk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIGJrZ2RzZXQgKGNodHlwZSk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYm9yZGVyIChjaHR5cGUsY2h0eXBlLGNodHlwZSxjaHR5cGUsY2h0eXBlLGNodHlwZSxjaHR5cGUsY2h0eXBlKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBib3ggKFdJTkRPVyAqLCBjaHR5cGUsIGNodHlwZSk7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBjYW5fY2hhbmdlX2NvbG9yICh2b2lkKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgY2JyZWFrICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGNoZ2F0IChpbnQsIGF0dHJfdCwgc2hvcnQsIGNvbnN0IHZvaWQgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgY2xlYXIgKHZvaWQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGNsZWFyb2sgKFdJTkRPVyAqLGJvb2wpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBjbHJ0b2JvdCAodm9pZCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgY2xydG9lb2wgKHZvaWQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGNvbG9yX2NvbnRlbnQgKHNob3J0LHNob3J0KixzaG9ydCosc2hvcnQqKTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGNvbG9yX3NldCAoc2hvcnQsdm9pZCopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgQ09MT1JfUEFJUiAoaW50KTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBjb3B5d2luIChjb25zdCBXSU5ET1cqLFdJTkRPVyosaW50LGludCxpbnQsaW50LGludCxpbnQsaW50KTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGN1cnNfc2V0IChpbnQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZGVmX3Byb2dfbW9kZSAodm9pZCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGRlZl9zaGVsbF9tb2RlICh2b2lkKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZGVsYXlfb3V0cHV0IChpbnQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZGVsY2ggKHZvaWQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBkZWxzY3JlZW4gKFNDUkVFTiAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZGVsd2luIChXSU5ET1cgKik7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBkZWxldGVsbiAodm9pZCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBkZXJ3aW4gKFdJTkRPVyAqLGludCxpbnQsaW50LGludCk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBkb3VwZGF0ZSAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopIGR1cHdpbiAoV0lORE9XICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBlY2hvICh2b2lkKTsJCQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBlY2hvY2hhciAoY29uc3QgY2h0eXBlKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGVyYXNlICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBlbmR3aW4gKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIpIGVyYXNlY2hhciAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgZmlsdGVyICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGZsYXNoICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGZsdXNoaW5wICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaHR5cGUpIGdldGJrZ2QgKFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGdldGNoICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRuc3RyIChjaGFyICosIGludCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRzdHIgKGNoYXIgKik7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBnZXR3aW4gKEZJTEUgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGhhbGZkZWxheSAoaW50KTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBoYXNfY29sb3JzICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBoYXNfaWMgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGhhc19pbCAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBobGluZSAoY2h0eXBlLCBpbnQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBpZGNvayAoV0lORE9XICosIGJvb2wpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBpZGxvayAoV0lORE9XICosIGJvb2wpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgaW1tZWRvayAoV0lORE9XICosIGJvb2wpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2h0eXBlKSBpbmNoICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBpbmNobnN0ciAoY2h0eXBlICosIGludCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBpbmNoc3RyIChjaHR5cGUgKik7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBpbml0c2NyICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGluaXRfY29sb3IgKHNob3J0LHNob3J0LHNob3J0LHNob3J0KTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGluaXRfcGFpciAoc2hvcnQsc2hvcnQsc2hvcnQpOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGlubnN0ciAoY2hhciAqLCBpbnQpOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgaW5zY2ggKGNodHlwZSk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgaW5zZGVsbG4gKGludCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgaW5zZXJ0bG4gKHZvaWQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGluc25zdHIgKGNvbnN0IGNoYXIgKiwgaW50KTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGluc3N0ciAoY29uc3QgY2hhciAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGluc3RyIChjaGFyICopOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGludHJmbHVzaCAoV0lORE9XICosYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc2VuZHdpbiAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfbGluZXRvdWNoZWQgKFdJTkRPVyAqLGludCk7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGlzX3dpbnRvdWNoZWQgKFdJTkRPVyAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKE5DVVJTRVNfQ09OU1QgY2hhciAqKSBrZXluYW1lIChpbnQpOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGtleXBhZCAoV0lORE9XICosYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyKSBraWxsY2hhciAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBsZWF2ZW9rIChXSU5ET1cgKixib29sKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgbG9uZ25hbWUgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbWV0YSAoV0lORE9XICosYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG1vdmUgKGludCwgaW50KTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmFkZGNoIChpbnQsIGludCwgY29uc3QgY2h0eXBlKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZhZGRjaG5zdHIgKGludCwgaW50LCBjb25zdCBjaHR5cGUgKiwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmFkZGNoc3RyIChpbnQsIGludCwgY29uc3QgY2h0eXBlICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12YWRkbnN0ciAoaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmFkZHN0ciAoaW50LCBpbnQsIGNvbnN0IGNoYXIgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12Y2hnYXQgKGludCwgaW50LCBpbnQsIGF0dHJfdCwgc2hvcnQsIGNvbnN0IHZvaWQgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZjdXIgKGludCxpbnQsaW50LGludCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12ZGVsY2ggKGludCwgaW50KTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmRlcndpbiAoV0lORE9XICosIGludCwgaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmdldGNoIChpbnQsIGludCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZnZXRuc3RyIChpbnQsIGludCwgY2hhciAqLCBpbnQpOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmdldHN0ciAoaW50LCBpbnQsIGNoYXIgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmhsaW5lIChpbnQsIGludCwgY2h0eXBlLCBpbnQpOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2h0eXBlKSBtdmluY2ggKGludCwgaW50KTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12aW5jaG5zdHIgKGludCwgaW50LCBjaHR5cGUgKiwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmluY2hzdHIgKGludCwgaW50LCBjaHR5cGUgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12aW5uc3RyIChpbnQsIGludCwgY2hhciAqLCBpbnQpOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmluc2NoIChpbnQsIGludCwgY2h0eXBlKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12aW5zbnN0ciAoaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmluc3N0ciAoaW50LCBpbnQsIGNvbnN0IGNoYXIgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12aW5zdHIgKGludCwgaW50LCBjaGFyICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZwcmludHcgKGludCxpbnQsIGNvbnN0IGNoYXIgKiwuLi4pCQkvKiBpbXBsZW1lbnRlZCAqLworCQlHQ0NfUFJJTlRGTElLRSgzLDQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZzY2FudyAoaW50LGludCwgTkNVUlNFU19DT05TVCBjaGFyICosLi4uKQkvKiBpbXBsZW1lbnRlZCAqLworCQlHQ0NfU0NBTkZMSUtFKDMsNCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdnZsaW5lIChpbnQsIGludCwgY2h0eXBlLCBpbnQpOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndhZGRjaCAoV0lORE9XICosIGludCwgaW50LCBjb25zdCBjaHR5cGUpOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2FkZGNobnN0ciAoV0lORE9XICosIGludCwgaW50LCBjb25zdCBjaHR5cGUgKiwgaW50KTsvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2FkZGNoc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNvbnN0IGNodHlwZSAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndhZGRuc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndhZGRzdHIgKFdJTkRPVyAqLCBpbnQsIGludCwgY29uc3QgY2hhciAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndjaGdhdCAoV0lORE9XICosIGludCwgaW50LCBpbnQsIGF0dHJfdCwgc2hvcnQsIGNvbnN0IHZvaWQgKik7LyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndkZWxjaCAoV0lORE9XICosIGludCwgaW50KTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3Z2V0Y2ggKFdJTkRPVyAqLCBpbnQsIGludCk7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2dldG5zdHIgKFdJTkRPVyAqLCBpbnQsIGludCwgY2hhciAqLCBpbnQpOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2dldHN0ciAoV0lORE9XICosIGludCwgaW50LCBjaGFyICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2hsaW5lIChXSU5ET1cgKiwgaW50LCBpbnQsIGNodHlwZSwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndpbiAoV0lORE9XICosaW50LGludCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaHR5cGUpIG12d2luY2ggKFdJTkRPVyAqLCBpbnQsIGludCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndpbmNobnN0ciAoV0lORE9XICosIGludCwgaW50LCBjaHR5cGUgKiwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndpbmNoc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNodHlwZSAqKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3aW5uc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNoYXIgKiwgaW50KTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3aW5zY2ggKFdJTkRPVyAqLCBpbnQsIGludCwgY2h0eXBlKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3aW5zbnN0ciAoV0lORE9XICosIGludCwgaW50LCBjb25zdCBjaGFyICosIGludCk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3aW5zc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNvbnN0IGNoYXIgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3aW5zdHIgKFdJTkRPVyAqLCBpbnQsIGludCwgY2hhciAqKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3cHJpbnR3IChXSU5ET1cqLGludCxpbnQsIGNvbnN0IGNoYXIgKiwuLi4pCS8qIGltcGxlbWVudGVkICovCisJCUdDQ19QUklOVEZMSUtFKDQsNSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndzY2FudyAoV0lORE9XICosaW50LGludCwgTkNVUlNFU19DT05TVCBjaGFyICosLi4uKQkvKiBpbXBsZW1lbnRlZCAqLworCQlHQ0NfU0NBTkZMSUtFKDQsNSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdnd2bGluZSAoV0lORE9XICosaW50LCBpbnQsIGNodHlwZSwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBuYXBtcyAoaW50KTsJCQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopIG5ld3BhZCAoaW50LGludCk7CQkgICAgICAgCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoU0NSRUVOICopIG5ld3Rlcm0gKE5DVVJTRVNfQ09OU1QgY2hhciAqLEZJTEUgKixGSUxFICopOwkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBuZXd3aW4gKGludCxpbnQsaW50LGludCk7CSAgICAgICAJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG5sICh2b2lkKTsJCQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBub2NicmVhayAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBub2RlbGF5IChXSU5ET1cgKixib29sKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbm9lY2hvICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG5vbmwgKHZvaWQpOwkJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBub3FpZmx1c2ggKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbm9yYXcgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbm90aW1lb3V0IChXSU5ET1cgKixib29sKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgb3ZlcmxheSAoY29uc3QgV0lORE9XKixXSU5ET1cgKik7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgb3ZlcndyaXRlIChjb25zdCBXSU5ET1cqLFdJTkRPVyAqKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBwYWlyX2NvbnRlbnQgKHNob3J0LHNob3J0KixzaG9ydCopOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIFBBSVJfTlVNQkVSIChpbnQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHBlY2hvY2hhciAoV0lORE9XICosIGNvbnN0IGNodHlwZSk7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcG5vdXRyZWZyZXNoIChXSU5ET1cqLGludCxpbnQsaW50LGludCxpbnQsaW50KTsvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcHJlZnJlc2ggKFdJTkRPVyAqLGludCxpbnQsaW50LGludCxpbnQsaW50KTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHByaW50dyAoY29uc3QgY2hhciAqLC4uLikJCQkvKiBpbXBsZW1lbnRlZCAqLworCQlHQ0NfUFJJTlRGTElLRSgxLDIpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcHV0d2luIChXSU5ET1cgKiwgRklMRSAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIHFpZmx1c2ggKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcmF3ICh2b2lkKTsJCQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSByZWRyYXd3aW4gKFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHJlZnJlc2ggKHZvaWQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHJlc2V0dHkgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcmVzZXRfcHJvZ19tb2RlICh2b2lkKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcmVzZXRfc2hlbGxfbW9kZSAodm9pZCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHJpcG9mZmxpbmUgKGludCwgaW50ICgqKShXSU5ET1cgKiwgaW50KSk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzYXZldHR5ICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNjYW53IChOQ1VSU0VTX0NPTlNUIGNoYXIgKiwuLi4pCQkvKiBpbXBsZW1lbnRlZCAqLworCQlHQ0NfU0NBTkZMSUtFKDEsMik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzY3JfZHVtcCAoY29uc3QgY2hhciAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2NyX2luaXQgKGNvbnN0IGNoYXIgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNjcmwgKGludCk7CQkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNjcm9sbCAoV0lORE9XICopOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNjcm9sbG9rIChXSU5ET1cgKixib29sKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2NyX3Jlc3RvcmUgKGNvbnN0IGNoYXIgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNjcl9zZXQgKGNvbnN0IGNoYXIgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNldHNjcnJlZyAoaW50LGludCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFNDUkVFTiAqKSBzZXRfdGVybSAoU0NSRUVOICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfYXR0cm9mZiAoY29uc3QgY2h0eXBlKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2xrX2F0dHJfb2ZmIChjb25zdCBhdHRyX3QsIHZvaWQgKik7CQkvKiBnZW5lcmF0ZWQ6V0lERUMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19hdHRyb24gKGNvbnN0IGNodHlwZSk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19hdHRyX29uIChhdHRyX3Qsdm9pZCopOwkJCS8qIGdlbmVyYXRlZDpXSURFQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2xrX2F0dHJzZXQgKGNvbnN0IGNodHlwZSk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChhdHRyX3QpIHNsa19hdHRyICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19hdHRyX3NldCAoY29uc3QgYXR0cl90LHNob3J0LHZvaWQqKTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19jbGVhciAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfY29sb3IgKHNob3J0KTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19pbml0IChpbnQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgc2xrX2xhYmVsIChpbnQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2xrX25vdXRyZWZyZXNoICh2b2lkKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2xrX3JlZnJlc2ggKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2xrX3Jlc3RvcmUgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2xrX3NldCAoaW50LGNvbnN0IGNoYXIgKixpbnQpOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa190b3VjaCAodm9pZCk7CSAgICAgIAkgICAgICAgCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc3RhbmRvdXQgKHZvaWQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHN0YW5kZW5kICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzdGFydF9jb2xvciAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopIHN1YnBhZCAoV0lORE9XICosIGludCwgaW50LCBpbnQsIGludCk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopIHN1YndpbiAoV0lORE9XICosIGludCwgaW50LCBpbnQsIGludCk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzeW5jb2sgKFdJTkRPVyAqLCBib29sKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNodHlwZSkgdGVybWF0dHJzICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRlcm1uYW1lICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSB0aW1lb3V0IChpbnQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHRvdWNobGluZSAoV0lORE9XICosIGludCwgaW50KTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdG91Y2h3aW4gKFdJTkRPVyAqKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0eXBlYWhlYWQgKGludCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB1bmdldGNoIChpbnQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdW50b3VjaHdpbiAoV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIHVzZV9lbnYgKGJvb2wpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdmlkYXR0ciAoY2h0eXBlKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHZpZHB1dHMgKGNodHlwZSwgTkNVUlNFU19PVVRDKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB2bGluZSAoY2h0eXBlLCBpbnQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHZ3cHJpbnR3IChXSU5ET1cgKiwgY29uc3QgY2hhciAqLHZhX2xpc3QpOwkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdndfcHJpbnR3IChXSU5ET1cgKiwgY29uc3QgY2hhciAqLHZhX2xpc3QpOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHZ3c2NhbncgKFdJTkRPVyAqLCBOQ1VSU0VTX0NPTlNUIGNoYXIgKix2YV9saXN0KTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHZ3X3NjYW53IChXSU5ET1cgKiwgTkNVUlNFU19DT05TVCBjaGFyICosdmFfbGlzdCk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2FkZGNoIChXSU5ET1cgKiwgY29uc3QgY2h0eXBlKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3YWRkY2huc3RyIChXSU5ET1cgKixjb25zdCBjaHR5cGUgKixpbnQpOwkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2FkZGNoc3RyIChXSU5ET1cgKixjb25zdCBjaHR5cGUgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhZGRuc3RyIChXSU5ET1cgKixjb25zdCBjaGFyICosaW50KTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhZGRzdHIgKFdJTkRPVyAqLGNvbnN0IGNoYXIgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhdHRyb24gKFdJTkRPVyAqLCBpbnQpOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2F0dHJvZmYgKFdJTkRPVyAqLCBpbnQpOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2F0dHJzZXQgKFdJTkRPVyAqLCBpbnQpOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2F0dHJfZ2V0IChXSU5ET1cgKiwgYXR0cl90ICosIHNob3J0ICosIHZvaWQgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2F0dHJfb24gKFdJTkRPVyAqLCBhdHRyX3QsIHZvaWQgKik7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2F0dHJfb2ZmIChXSU5ET1cgKiwgYXR0cl90LCB2b2lkICopOwkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2F0dHJfc2V0IChXSU5ET1cgKiwgYXR0cl90LCBzaG9ydCwgdm9pZCAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3YmtnZCAoV0lORE9XICosIGNodHlwZSk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSB3YmtnZHNldCAoV0lORE9XICosY2h0eXBlKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2JvcmRlciAoV0lORE9XICosY2h0eXBlLGNodHlwZSxjaHR5cGUsY2h0eXBlLGNodHlwZSxjaHR5cGUsY2h0eXBlLGNodHlwZSk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3Y2hnYXQgKFdJTkRPVyAqLCBpbnQsIGF0dHJfdCwgc2hvcnQsIGNvbnN0IHZvaWQgKik7LyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdjbGVhciAoV0lORE9XICopOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2NscnRvYm90IChXSU5ET1cgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdjbHJ0b2VvbCAoV0lORE9XICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3Y29sb3Jfc2V0IChXSU5ET1cqLHNob3J0LHZvaWQqKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgd2N1cnN5bmN1cCAoV0lORE9XICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3ZGVsY2ggKFdJTkRPVyAqKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdkZWxldGVsbiAoV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2VjaG9jaGFyIChXSU5ET1cgKiwgY29uc3QgY2h0eXBlKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3ZXJhc2UgKFdJTkRPVyAqKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdnZXRjaCAoV0lORE9XICopOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2dldG5zdHIgKFdJTkRPVyAqLGNoYXIgKixpbnQpOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdnZXRzdHIgKFdJTkRPVyAqLCBjaGFyICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2hsaW5lIChXSU5ET1cgKiwgY2h0eXBlLCBpbnQpOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaHR5cGUpIHdpbmNoIChXSU5ET1cgKik7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3aW5jaG5zdHIgKFdJTkRPVyAqLCBjaHR5cGUgKiwgaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3aW5jaHN0ciAoV0lORE9XICosIGNodHlwZSAqKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2lubnN0ciAoV0lORE9XICosIGNoYXIgKiwgaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3aW5zY2ggKFdJTkRPVyAqLCBjaHR5cGUpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3aW5zZGVsbG4gKFdJTkRPVyAqLGludCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdpbnNlcnRsbiAoV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2luc25zdHIgKFdJTkRPVyAqLCBjb25zdCBjaGFyICosaW50KTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdpbnNzdHIgKFdJTkRPVyAqLCBjb25zdCBjaGFyICopOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3aW5zdHIgKFdJTkRPVyAqLCBjaGFyICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd21vdmUgKFdJTkRPVyAqLGludCxpbnQpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3bm91dHJlZnJlc2ggKFdJTkRPVyAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3ByaW50dyAoV0lORE9XICosIGNvbnN0IGNoYXIgKiwuLi4pCQkvKiBpbXBsZW1lbnRlZCAqLworCQlHQ0NfUFJJTlRGTElLRSgyLDMpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3JlZHJhd2xuIChXSU5ET1cgKixpbnQsaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3cmVmcmVzaCAoV0lORE9XICopOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3NjYW53IChXSU5ET1cgKiwgTkNVUlNFU19DT05TVCBjaGFyICosLi4uKQkvKiBpbXBsZW1lbnRlZCAqLworCQlHQ0NfU0NBTkZMSUtFKDIsMyk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3c2NybCAoV0lORE9XICosaW50KTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3NldHNjcnJlZyAoV0lORE9XICosaW50LGludCk7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3N0YW5kb3V0IChXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3c3RhbmRlbmQgKFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSB3c3luY2Rvd24gKFdJTkRPVyAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIHdzeW5jdXAgKFdJTkRPVyAqKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSB3dGltZW91dCAoV0lORE9XICosaW50KTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3RvdWNobG4gKFdJTkRPVyAqLGludCxpbnQsaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3dmxpbmUgKFdJTkRPVyAqLGNodHlwZSxpbnQpOwkJLyogaW1wbGVtZW50ZWQgKi8KKworLyoKKyAqIFRoZXNlIGFyZSBhbHNvIGRlY2xhcmVkIGluIDx0ZXJtLmg+OgorICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0aWdldGZsYWcgKE5DVVJTRVNfQ09OU1QgY2hhciAqKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0aWdldG51bSAoTkNVUlNFU19DT05TVCBjaGFyICopOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRpZ2V0c3RyIChOQ1VSU0VTX0NPTlNUIGNoYXIgKik7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcHV0cCAoY29uc3QgY2hhciAqKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KKworI2lmIE5DVVJTRVNfVFBBUk1fVkFSQVJHUworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdHBhcm0gKE5DVVJTRVNfQ09OU1QgY2hhciAqLCAuLi4pOwkvKiBzcGVjaWFsICovCisjZWxzZQorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdHBhcm0gKE5DVVJTRVNfQ09OU1QgY2hhciAqLCBsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcsbG9uZyk7CS8qIHNwZWNpYWwgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRwYXJtX3ZhcmFyZ3MgKE5DVVJTRVNfQ09OU1QgY2hhciAqLCAuLi4pOwkvKiBzcGVjaWFsICovCisjZW5kaWYKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdGlwYXJtIChjb25zdCBjaGFyICosIC4uLik7CQkvKiBzcGVjaWFsICovCisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBpbiBYL09wZW4sIGJ1dCB3ZSB1c2UgdGhlbSBpbiBtYWNybyBkZWZpbml0aW9uczoKKyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZ2V0YXR0cnMgKGNvbnN0IFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGdldGN1cnggKGNvbnN0IFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGdldGN1cnkgKGNvbnN0IFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGdldGJlZ3ggKGNvbnN0IFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGdldGJlZ3kgKGNvbnN0IFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGdldG1heHggKGNvbnN0IFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGdldG1heHkgKGNvbnN0IFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGdldHBhcnggKGNvbnN0IFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGdldHBhcnkgKGNvbnN0IFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KKworLyoKKyAqIHZpZF9hdHRyKCkgd2FzIGltcGxlbWVudGVkIG9yaWdpbmFsbHkgYmFzZWQgb24gYSBkcmFmdCBvZiBYL09wZW4gY3Vyc2VzLgorICovCisjaWZuZGVmIE5DVVJTRVNfV0lERUNIQVIKKyNkZWZpbmUgdmlkX2F0dHIoYSxwYWlyLG9wdHMpIHZpZGF0dHIoYSkKKyNlbmRpZgorCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBleHRlbnNpb25zIC0gbm90IGluIFgvT3BlbiBDdXJzZXMuCisgKi8KKyNpZiAxCisjdW5kZWYgIE5DVVJTRVNfRVhUX0ZVTkNTCisjZGVmaW5lIE5DVVJTRVNfRVhUX0ZVTkNTIDIwMTEwNDA0Cit0eXBlZGVmIGludCAoKk5DVVJTRVNfV0lORE9XX0NCKShXSU5ET1cgKiwgdm9pZCAqKTsKK3R5cGVkZWYgaW50ICgqTkNVUlNFU19TQ1JFRU5fQ0IpKFNDUkVFTiAqLCB2b2lkICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGlzX3Rlcm1fcmVzaXplZCAoaW50LCBpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikga2V5Ym91bmQgKGludCwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopIGN1cnNlc192ZXJzaW9uICh2b2lkKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGFzc3VtZV9kZWZhdWx0X2NvbG9ycyAoaW50LCBpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZGVmaW5lX2tleSAoY29uc3QgY2hhciAqLCBpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZ2V0X2VzY2RlbGF5ICh2b2lkKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGtleV9kZWZpbmVkIChjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkga2V5b2sgKGludCwgYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSByZXNpemVfdGVybSAoaW50LCBpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcmVzaXpldGVybSAoaW50LCBpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2V0X2VzY2RlbGF5IChpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2V0X3RhYnNpemUgKGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB1c2VfZGVmYXVsdF9jb2xvcnMgKHZvaWQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdXNlX2V4dGVuZGVkX25hbWVzIChib29sKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHVzZV9sZWdhY3lfY29kaW5nIChpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdXNlX3NjcmVlbiAoU0NSRUVOICosIE5DVVJTRVNfU0NSRUVOX0NCLCB2b2lkICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdXNlX3dpbmRvdyAoV0lORE9XICosIE5DVVJTRVNfV0lORE9XX0NCLCB2b2lkICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3Jlc2l6ZSAoV0lORE9XICosIGludCwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBub2ZpbHRlcih2b2lkKTsKKworLyoKKyAqIFRoZXNlIGV4dGVuc2lvbnMgcHJvdmlkZSBhY2Nlc3MgdG8gaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBXSU5ET1cgZXZlbgorICogd2hlbiBOQ1VSU0VTX09QQVFVRSBpcyBzZXQ6CisgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChXSU5ET1cgKikgd2dldHBhcmVudCAoY29uc3QgV0lORE9XICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc19jbGVhcmVkIChjb25zdCBXSU5ET1cgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGlzX2lkY29rIChjb25zdCBXSU5ET1cgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc19pZGxvayAoY29uc3QgV0lORE9XICopOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfaW1tZWRvayAoY29uc3QgV0lORE9XICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc19rZXlwYWQgKGNvbnN0IFdJTkRPVyAqKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGlzX2xlYXZlb2sgKGNvbnN0IFdJTkRPVyAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfbm9kZWxheSAoY29uc3QgV0lORE9XICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc19ub3RpbWVvdXQgKGNvbnN0IFdJTkRPVyAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfcGFkIChjb25zdCBXSU5ET1cgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc19zY3JvbGxvayAoY29uc3QgV0lORE9XICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc19zdWJ3aW4gKGNvbnN0IFdJTkRPVyAqKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGlzX3N5bmNvayAoY29uc3QgV0lORE9XICopOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3Z2V0c2NycmVnIChjb25zdCBXSU5ET1cgKiwgaW50ICosIGludCAqKTsgLyogZ2VuZXJhdGVkICovCisKKyNlbHNlCisjZGVmaW5lIGN1cnNlc192ZXJzaW9uKCkgTkNVUlNFU19WRVJTSU9OCisjZW5kaWYKKworLyoKKyAqIEV4dHJhIGV4dGVuc2lvbi1mdW5jdGlvbnMsIHdoaWNoIHBhc3MgYSBTQ1JFRU4gcG9pbnRlciByYXRoZXIgdGhhbiB1c2luZworICogYSBnbG9iYWwgdmFyaWFibGUgU1AuCisgKi8KKyNpZiAwCisjdW5kZWYgIE5DVVJTRVNfU1BfRlVOQ1MKKyNkZWZpbmUgTkNVUlNFU19TUF9GVU5DUyAyMDExMDQwNAorI2RlZmluZSBOQ1VSU0VTX1NQX05BTUUobmFtZSkgbmFtZSMjX3NwCisKKy8qIERlZmluZSB0aGUgc3AtZnVuY3MgaGVscGVyIGZ1bmN0aW9uICovCisjZGVmaW5lIE5DVVJTRVNfU1BfT1VUQyBOQ1VSU0VTX1NQX05BTUUoTkNVUlNFU19PVVRDKQordHlwZWRlZiBpbnQgKCpOQ1VSU0VTX1NQX09VVEMpKFNDUkVFTiosIGludCk7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChTQ1JFRU4gKikgbmV3X3ByZXNjciAodm9pZCk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGJhdWRyYXRlKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShiZWVwKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBOQ1VSU0VTX1NQX05BTUUoY2FuX2NoYW5nZV9jb2xvcikgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoY2JyZWFrKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShjdXJzX3NldCkgKFNDUkVFTiosIGludCk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShjb2xvcl9jb250ZW50KSAoU0NSRUVOKiwgc2hvcnQsIHNob3J0Kiwgc2hvcnQqLCBzaG9ydCopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoZGVmX3Byb2dfbW9kZSkgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoZGVmX3NoZWxsX21vZGUpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGRlbGF5X291dHB1dCkgKFNDUkVFTiosIGludCk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShkb3VwZGF0ZSkgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoZWNobykgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoZW5kd2luKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyKSBOQ1VSU0VTX1NQX05BTUUoZXJhc2VjaGFyKSAoU0NSRUVOKik7LyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIE5DVVJTRVNfU1BfTkFNRShmaWx0ZXIpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGZsYXNoKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShmbHVzaGlucCkgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopIE5DVVJTRVNfU1BfTkFNRShnZXR3aW4pIChTQ1JFRU4qLCBGSUxFICopOwkJCS8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShoYWxmZGVsYXkpIChTQ1JFRU4qLCBpbnQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgTkNVUlNFU19TUF9OQU1FKGhhc19jb2xvcnMpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIE5DVVJTRVNfU1BfTkFNRShoYXNfaWMpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIE5DVVJTRVNfU1BfTkFNRShoYXNfaWwpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGluaXRfY29sb3IpIChTQ1JFRU4qLCBzaG9ydCwgc2hvcnQsIHNob3J0LCBzaG9ydCk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShpbml0X3BhaXIpIChTQ1JFRU4qLCBzaG9ydCwgc2hvcnQsIHNob3J0KTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGludHJmbHVzaCkgKFNDUkVFTiosIFdJTkRPVyosIGJvb2wpOwkvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgTkNVUlNFU19TUF9OQU1FKGlzZW5kd2luKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChOQ1VSU0VTX0NPTlNUIGNoYXIgKikgTkNVUlNFU19TUF9OQU1FKGtleW5hbWUpIChTQ1JFRU4qLCBpbnQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhcikgTkNVUlNFU19TUF9OQU1FKGtpbGxjaGFyKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIE5DVVJTRVNfU1BfTkFNRShsb25nbmFtZSkgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUobXZjdXIpIChTQ1JFRU4qLCBpbnQsIGludCwgaW50LCBpbnQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUobmFwbXMpIChTQ1JFRU4qLCBpbnQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopIE5DVVJTRVNfU1BfTkFNRShuZXdwYWQpIChTQ1JFRU4qLCBpbnQsIGludCk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChTQ1JFRU4gKikgTkNVUlNFU19TUF9OQU1FKG5ld3Rlcm0pIChTQ1JFRU4qLCBOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgRklMRSAqLCBGSUxFICopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopIE5DVVJTRVNfU1BfTkFNRShuZXd3aW4pIChTQ1JFRU4qLCBpbnQsIGludCwgaW50LCBpbnQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUobmwpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKG5vY2JyZWFrKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShub2VjaG8pIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKG5vbmwpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIE5DVVJTRVNfU1BfTkFNRShub3FpZmx1c2gpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKG5vcmF3KSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShwYWlyX2NvbnRlbnQpIChTQ1JFRU4qLCBzaG9ydCwgc2hvcnQqLCBzaG9ydCopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgTkNVUlNFU19TUF9OQU1FKHFpZmx1c2gpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHJhdykgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUocmVzZXRfcHJvZ19tb2RlKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShyZXNldF9zaGVsbF9tb2RlKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShyZXNldHR5KSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShyaXBvZmZsaW5lKSAoU0NSRUVOKiwgaW50LCBpbnQgKCopKFdJTkRPVyAqLCBpbnQpKTsJLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHNhdmV0dHkpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHNjcl9pbml0KSAoU0NSRUVOKiwgY29uc3QgY2hhciAqKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHNjcl9yZXN0b3JlKSAoU0NSRUVOKiwgY29uc3QgY2hhciAqKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHNjcl9zZXQpIChTQ1JFRU4qLCBjb25zdCBjaGFyICopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoc2xrX2F0dHJvZmYpIChTQ1JFRU4qLCBjb25zdCBjaHR5cGUpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoc2xrX2F0dHJvbikgKFNDUkVFTiosIGNvbnN0IGNodHlwZSk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShzbGtfYXR0cnNldCkgKFNDUkVFTiosIGNvbnN0IGNodHlwZSk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChhdHRyX3QpIE5DVVJTRVNfU1BfTkFNRShzbGtfYXR0cikgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoc2xrX2F0dHJfc2V0KSAoU0NSRUVOKiwgY29uc3QgYXR0cl90LCBzaG9ydCwgdm9pZCopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoc2xrX2NsZWFyKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShzbGtfY29sb3IpIChTQ1JFRU4qLCBzaG9ydCk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShzbGtfaW5pdCkgKFNDUkVFTiosIGludCk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIE5DVVJTRVNfU1BfTkFNRShzbGtfbGFiZWwpIChTQ1JFRU4qLCBpbnQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoc2xrX25vdXRyZWZyZXNoKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShzbGtfcmVmcmVzaCkgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoc2xrX3Jlc3RvcmUpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHNsa19zZXQpIChTQ1JFRU4qLCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHNsa190b3VjaCkgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoc3RhcnRfY29sb3IpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNodHlwZSkgTkNVUlNFU19TUF9OQU1FKHRlcm1hdHRycykgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBOQ1VSU0VTX1NQX05BTUUodGVybW5hbWUpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHR5cGVhaGVhZCkgKFNDUkVFTiosIGludCk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRSh1bmdldGNoKSAoU0NSRUVOKiwgaW50KTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIE5DVVJTRVNfU1BfTkFNRSh1c2VfZW52KSAoU0NSRUVOKiwgYm9vbCk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRSh2aWRhdHRyKSAoU0NSRUVOKiwgY2h0eXBlKTsJLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHZpZHB1dHMpIChTQ1JFRU4qLCBjaHR5cGUsIE5DVVJTRVNfU1BfT1VUQyk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KKyNpZiAxCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBOQ1VSU0VTX1NQX05BTUUoa2V5Ym91bmQpIChTQ1JFRU4qLCBpbnQsIGludCk7CS8qIGltcGxlbWVudGVkOkVYVF9TUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoYXNzdW1lX2RlZmF1bHRfY29sb3JzKSAoU0NSRUVOKiwgaW50LCBpbnQpOwkvKiBpbXBsZW1lbnRlZDpFWFRfU1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGRlZmluZV9rZXkpIChTQ1JFRU4qLCBjb25zdCBjaGFyICosIGludCk7CS8qIGltcGxlbWVudGVkOkVYVF9TUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoZ2V0X2VzY2RlbGF5KSAoU0NSRUVOKik7CS8qIGltcGxlbWVudGVkOkVYVF9TUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgTkNVUlNFU19TUF9OQU1FKGlzX3Rlcm1fcmVzaXplZCkgKFNDUkVFTiosIGludCwgaW50KTsJLyogaW1wbGVtZW50ZWQ6RVhUX1NQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShrZXlfZGVmaW5lZCkgKFNDUkVFTiosIGNvbnN0IGNoYXIgKik7CS8qIGltcGxlbWVudGVkOkVYVF9TUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoa2V5b2spIChTQ1JFRU4qLCBpbnQsIGJvb2wpOwkvKiBpbXBsZW1lbnRlZDpFWFRfU1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIE5DVVJTRVNfU1BfTkFNRShub2ZpbHRlcikgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZCAqLwkvKiBpbXBsZW1lbnRlZDpFWFRfU1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHJlc2l6ZV90ZXJtKSAoU0NSRUVOKiwgaW50LCBpbnQpOwkvKiBpbXBsZW1lbnRlZDpFWFRfU1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHJlc2l6ZXRlcm0pIChTQ1JFRU4qLCBpbnQsIGludCk7CS8qIGltcGxlbWVudGVkOkVYVF9TUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoc2V0X2VzY2RlbGF5KSAoU0NSRUVOKiwgaW50KTsJLyogaW1wbGVtZW50ZWQ6RVhUX1NQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShzZXRfdGFic2l6ZSkgKFNDUkVFTiosIGludCk7CS8qIGltcGxlbWVudGVkOkVYVF9TUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUodXNlX2RlZmF1bHRfY29sb3JzKSAoU0NSRUVOKik7CS8qIGltcGxlbWVudGVkOkVYVF9TUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUodXNlX2xlZ2FjeV9jb2RpbmcpIChTQ1JFRU4qLCBpbnQpOwkvKiBpbXBsZW1lbnRlZDpFWFRfU1BfRlVOQyAqLworI2VuZGlmCisjZWxzZQorI3VuZGVmICBOQ1VSU0VTX1NQX0ZVTkNTCisjZGVmaW5lIE5DVVJTRVNfU1BfRlVOQ1MgMAorI2RlZmluZSBOQ1VSU0VTX1NQX05BTUUobmFtZSkgbmFtZQorI2RlZmluZSBOQ1VSU0VTX1NQX09VVEMgTkNVUlNFU19PVVRDCisjZW5kaWYKKworLyogYXR0cmlidXRlcyAqLworCisjZGVmaW5lIE5DVVJTRVNfQVRUUl9TSElGVCAgICAgICA4CisjZGVmaW5lIE5DVVJTRVNfQklUUyhtYXNrLHNoaWZ0KSAoKG1hc2spIDw8ICgoc2hpZnQpICsgTkNVUlNFU19BVFRSX1NISUZUKSkKKworI2RlZmluZSBBX05PUk1BTAkoMVVMIC0gMVVMKQorI2RlZmluZSBBX0FUVFJJQlVURVMJTkNVUlNFU19CSVRTKH4oMVVMIC0gMVVMKSwwKQorI2RlZmluZSBBX0NIQVJURVhUCShOQ1VSU0VTX0JJVFMoMVVMLDApIC0gMVVMKQorI2RlZmluZSBBX0NPTE9SCQlOQ1VSU0VTX0JJVFMoKCgxVUwpIDw8IDgpIC0gMVVMLDApCisjZGVmaW5lIEFfU1RBTkRPVVQJTkNVUlNFU19CSVRTKDFVTCw4KQorI2RlZmluZSBBX1VOREVSTElORQlOQ1VSU0VTX0JJVFMoMVVMLDkpCisjZGVmaW5lIEFfUkVWRVJTRQlOQ1VSU0VTX0JJVFMoMVVMLDEwKQorI2RlZmluZSBBX0JMSU5LCQlOQ1VSU0VTX0JJVFMoMVVMLDExKQorI2RlZmluZSBBX0RJTQkJTkNVUlNFU19CSVRTKDFVTCwxMikKKyNkZWZpbmUgQV9CT0xECQlOQ1VSU0VTX0JJVFMoMVVMLDEzKQorI2RlZmluZSBBX0FMVENIQVJTRVQJTkNVUlNFU19CSVRTKDFVTCwxNCkKKyNkZWZpbmUgQV9JTlZJUwkJTkNVUlNFU19CSVRTKDFVTCwxNSkKKyNkZWZpbmUgQV9QUk9URUNUCU5DVVJTRVNfQklUUygxVUwsMTYpCisjZGVmaW5lIEFfSE9SSVpPTlRBTAlOQ1VSU0VTX0JJVFMoMVVMLDE3KQorI2RlZmluZSBBX0xFRlQJCU5DVVJTRVNfQklUUygxVUwsMTgpCisjZGVmaW5lIEFfTE9XCQlOQ1VSU0VTX0JJVFMoMVVMLDE5KQorI2RlZmluZSBBX1JJR0hUCQlOQ1VSU0VTX0JJVFMoMVVMLDIwKQorI2RlZmluZSBBX1RPUAkJTkNVUlNFU19CSVRTKDFVTCwyMSkKKyNkZWZpbmUgQV9WRVJUSUNBTAlOQ1VSU0VTX0JJVFMoMVVMLDIyKQorCisvKgorICogTW9zdCBvZiB0aGUgcHNldWRvIGZ1bmN0aW9ucyBhcmUgbWFjcm9zIHRoYXQgZWl0aGVyIHByb3ZpZGUgY29tcGF0aWJpbGl0eQorICogd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBjdXJzZXMsIG9yIHByb3ZpZGUgaW5saW5lIGZ1bmN0aW9uYWxpdHkgdG8gaW1wcm92ZQorICogcGVyZm9ybWFuY2UuCisgKi8KKworLyoKKyAqIFRoZXNlIHBzZXVkbyBmdW5jdGlvbnMgYXJlIGFsd2F5cyBpbXBsZW1lbnRlZCBhcyBtYWNyb3M6CisgKi8KKworI2RlZmluZSBnZXR5eCh3aW4seSx4KSAgIAkoeSA9IGdldGN1cnkod2luKSwgeCA9IGdldGN1cngod2luKSkKKyNkZWZpbmUgZ2V0YmVneXgod2luLHkseCkJKHkgPSBnZXRiZWd5KHdpbiksIHggPSBnZXRiZWd4KHdpbikpCisjZGVmaW5lIGdldG1heHl4KHdpbix5LHgpCSh5ID0gZ2V0bWF4eSh3aW4pLCB4ID0gZ2V0bWF4eCh3aW4pKQorI2RlZmluZSBnZXRwYXJ5eCh3aW4seSx4KQkoeSA9IGdldHBhcnkod2luKSwgeCA9IGdldHBhcngod2luKSkKKworI2RlZmluZSBnZXRzeXgoeSx4KSBkbyB7IGlmIChuZXdzY3IpIHsgXAorCQkJICAgICBpZiAoaXNfbGVhdmVvayhuZXdzY3IpKSBcCisJCQkJKHkpID0gKHgpID0gLTE7IFwKKwkJCSAgICAgZWxzZSBcCisJCQkJIGdldHl4KG5ld3NjciwoeSksICh4KSk7IFwKKwkJCX0gXAorCQkgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIHNldHN5eCh5LHgpIGRvIHsgaWYgKG5ld3NjcikgeyBcCisJCQkgICAgaWYgKCh5KSA9PSAtMSAmJiAoeCkgPT0gLTEpIFwKKwkJCQlsZWF2ZW9rKG5ld3NjciwgVFJVRSk7IFwKKwkJCSAgICBlbHNlIHsgXAorCQkJCWxlYXZlb2sobmV3c2NyLCBGQUxTRSk7IFwKKwkJCQl3bW92ZShuZXdzY3IsICh5KSwgKHgpKTsgXAorCQkJICAgIH0gXAorCQkJfSBcCisJCSAgICB9IHdoaWxlKDApCisKKyNpZm5kZWYgTkNVUlNFU19OT01BQ1JPUworCisvKgorICogVGhlc2UgbWlzY2VsbGFuZW91cyBwc2V1ZG8gZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eToKKyAqLworCisjZGVmaW5lIHdnZXRzdHIodywgcykJCXdnZXRuc3RyKHcsIHMsIC0xKQorI2RlZmluZSBnZXRuc3RyKHMsIG4pCQl3Z2V0bnN0cihzdGRzY3IsIHMsIG4pCisKKyNkZWZpbmUgc2V0dGVybSh0ZXJtKQkJc2V0dXB0ZXJtKHRlcm0sIDEsIChpbnQgKikwKQorCisjZGVmaW5lIGZpeHRlcm0oKQkJcmVzZXRfcHJvZ19tb2RlKCkKKyNkZWZpbmUgcmVzZXR0ZXJtKCkJCXJlc2V0X3NoZWxsX21vZGUoKQorI2RlZmluZSBzYXZldGVybSgpCQlkZWZfcHJvZ19tb2RlKCkKKyNkZWZpbmUgY3Jtb2RlKCkJCWNicmVhaygpCisjZGVmaW5lIG5vY3Jtb2RlKCkJCW5vY2JyZWFrKCkKKyNkZWZpbmUgZ2V0dG1vZGUoKQorCisvKiBJdCBzZWVtcyBvbGRlciBTWVNWIGN1cnNlcyB2ZXJzaW9ucyBkZWZpbmUgdGhlc2UgKi8KKyNpZiAhTkNVUlNFU19PUEFRVUUKKyNkZWZpbmUgZ2V0YXR0cnMod2luKQkJTkNVUlNFU19DQVNUKGludCwgKHdpbikgPyAod2luKS0+X2F0dHJzIDogQV9OT1JNQUwpCisjZGVmaW5lIGdldGN1cngod2luKQkJKCh3aW4pID8gKHdpbiktPl9jdXJ4IDogRVJSKQorI2RlZmluZSBnZXRjdXJ5KHdpbikJCSgod2luKSA/ICh3aW4pLT5fY3VyeSA6IEVSUikKKyNkZWZpbmUgZ2V0YmVneCh3aW4pCQkoKHdpbikgPyAod2luKS0+X2JlZ3ggOiBFUlIpCisjZGVmaW5lIGdldGJlZ3kod2luKQkJKCh3aW4pID8gKHdpbiktPl9iZWd5IDogRVJSKQorI2RlZmluZSBnZXRtYXh4KHdpbikJCSgod2luKSA/ICgod2luKS0+X21heHggKyAxKSA6IEVSUikKKyNkZWZpbmUgZ2V0bWF4eSh3aW4pCQkoKHdpbikgPyAoKHdpbiktPl9tYXh5ICsgMSkgOiBFUlIpCisjZGVmaW5lIGdldHBhcngod2luKQkJKCh3aW4pID8gKHdpbiktPl9wYXJ4IDogRVJSKQorI2RlZmluZSBnZXRwYXJ5KHdpbikJCSgod2luKSA/ICh3aW4pLT5fcGFyeSA6IEVSUikKKyNlbmRpZiAvKiBOQ1VSU0VTX09QQVFVRSAqLworCisjZGVmaW5lIHdzdGFuZG91dCh3aW4pICAgICAgCSh3YXR0cnNldCh3aW4sQV9TVEFORE9VVCkpCisjZGVmaW5lIHdzdGFuZGVuZCh3aW4pICAgICAgCSh3YXR0cnNldCh3aW4sQV9OT1JNQUwpKQorCisjZGVmaW5lIHdhdHRyb24od2luLGF0KQkJd2F0dHJfb24od2luLCBOQ1VSU0VTX0NBU1QoYXR0cl90LCBhdCksIE5VTEwpCisjZGVmaW5lIHdhdHRyb2ZmKHdpbixhdCkJd2F0dHJfb2ZmKHdpbiwgTkNVUlNFU19DQVNUKGF0dHJfdCwgYXQpLCBOVUxMKQorCisjaWYgIU5DVVJTRVNfT1BBUVVFCisjaWYgZGVmaW5lZChOQ1VSU0VTX1dJREVDSEFSKSAmJiAwCisjZGVmaW5lIHdhdHRyc2V0KHdpbixhdCkJKCh3aW4pIFwKKwkJCQkgID8gKCh3aW4pLT5fY29sb3IgPSBQQUlSX05VTUJFUihhdCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2luKS0+X2F0dHJzID0gTkNVUlNFU19DQVNUKGF0dHJfdCwgYXQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0spIFwKKwkJCQkgIDogRVJSKQorI2Vsc2UKKyNkZWZpbmUgd2F0dHJzZXQod2luLGF0KSAgICAgICAgKCh3aW4pIFwKKwkJCQkgID8gKCh3aW4pLT5fYXR0cnMgPSBOQ1VSU0VTX0NBU1QoYXR0cl90LCBhdCksIFwKKwkJCQkgICAgIE9LKSBcCisJCQkJICA6IEVSUikKKyNlbmRpZgorI2VuZGlmIC8qIE5DVVJTRVNfT1BBUVVFICovCisKKyNkZWZpbmUgc2Nyb2xsKHdpbikJCXdzY3JsKHdpbiwxKQorCisjZGVmaW5lIHRvdWNod2luKHdpbikJCXd0b3VjaGxuKCh3aW4pLCAwLCBnZXRtYXh5KHdpbiksIDEpCisjZGVmaW5lIHRvdWNobGluZSh3aW4sIHMsIGMpCXd0b3VjaGxuKCh3aW4pLCBzLCBjLCAxKQorI2RlZmluZSB1bnRvdWNod2luKHdpbikJCXd0b3VjaGxuKCh3aW4pLCAwLCBnZXRtYXh5KHdpbiksIDApCisKKyNkZWZpbmUgYm94KHdpbiwgdiwgaCkJCXdib3JkZXIod2luLCB2LCB2LCBoLCBoLCAwLCAwLCAwLCAwKQorI2RlZmluZSBib3JkZXIobHMsIHJzLCB0cywgYnMsIHRsLCB0ciwgYmwsIGJyKQl3Ym9yZGVyKHN0ZHNjciwgbHMsIHJzLCB0cywgYnMsIHRsLCB0ciwgYmwsIGJyKQorI2RlZmluZSBobGluZShjaCwgbikJCXdobGluZShzdGRzY3IsIGNoLCBuKQorI2RlZmluZSB2bGluZShjaCwgbikJCXd2bGluZShzdGRzY3IsIGNoLCBuKQorCisjZGVmaW5lIHdpbnN0cih3LCBzKQkJd2lubnN0cih3LCBzLCAtMSkKKyNkZWZpbmUgd2luY2hzdHIodywgcykJCXdpbmNobnN0cih3LCBzLCAtMSkKKyNkZWZpbmUgd2luc3N0cih3LCBzKQkJd2luc25zdHIodywgcywgLTEpCisKKyNpZiAhTkNVUlNFU19PUEFRVUUKKyNkZWZpbmUgcmVkcmF3d2luKHdpbikJCXdyZWRyYXdsbih3aW4sIDAsICh3aW4pLT5fbWF4eSsxKQorI2VuZGlmIC8qIE5DVVJTRVNfT1BBUVVFICovCisKKyNkZWZpbmUgd2FkZHN0cih3aW4sc3RyKQl3YWRkbnN0cih3aW4sc3RyLC0xKQorI2RlZmluZSB3YWRkY2hzdHIod2luLHN0cikJd2FkZGNobnN0cih3aW4sc3RyLC0xKQorCisvKgorICogVGhlc2UgYXBwbHkgdG8gdGhlIGZpcnN0IDI1NiBjb2xvciBwYWlycy4KKyAqLworI2RlZmluZSBDT0xPUl9QQUlSKG4pCU5DVVJTRVNfQklUUyhuLCAwKQorI2RlZmluZSBQQUlSX05VTUJFUihhKQkoTkNVUlNFU19DQVNUKGludCwoKE5DVVJTRVNfQ0FTVCh1bnNpZ25lZCBsb25nLGEpICYgQV9DT0xPUikgPj4gTkNVUlNFU19BVFRSX1NISUZUKSkpCisKKy8qCisgKiBwc2V1ZG8gZnVuY3Rpb25zIGZvciBzdGFuZGFyZCBzY3JlZW4KKyAqLworCisjZGVmaW5lIGFkZGNoKGNoKQkJd2FkZGNoKHN0ZHNjcixjaCkKKyNkZWZpbmUgYWRkY2huc3RyKHN0cixuKQl3YWRkY2huc3RyKHN0ZHNjcixzdHIsbikKKyNkZWZpbmUgYWRkY2hzdHIoc3RyKQkJd2FkZGNoc3RyKHN0ZHNjcixzdHIpCisjZGVmaW5lIGFkZG5zdHIoc3RyLG4pCQl3YWRkbnN0cihzdGRzY3Isc3RyLG4pCisjZGVmaW5lIGFkZHN0cihzdHIpCQl3YWRkbnN0cihzdGRzY3Isc3RyLC0xKQorI2RlZmluZSBhdHRyb2ZmKGF0KQkJd2F0dHJvZmYoc3Rkc2NyLGF0KQorI2RlZmluZSBhdHRyb24oYXQpCQl3YXR0cm9uKHN0ZHNjcixhdCkKKyNkZWZpbmUgYXR0cnNldChhdCkJCXdhdHRyc2V0KHN0ZHNjcixhdCkKKyNkZWZpbmUgYXR0cl9nZXQoYXAsY3AsbykJd2F0dHJfZ2V0KHN0ZHNjcixhcCxjcCxvKQorI2RlZmluZSBhdHRyX29mZihhLG8pCQl3YXR0cl9vZmYoc3Rkc2NyLGEsbykKKyNkZWZpbmUgYXR0cl9vbihhLG8pCQl3YXR0cl9vbihzdGRzY3IsYSxvKQorI2RlZmluZSBhdHRyX3NldChhLGMsbykJCXdhdHRyX3NldChzdGRzY3IsYSxjLG8pCisjZGVmaW5lIGJrZ2QoY2gpCQl3YmtnZChzdGRzY3IsY2gpCisjZGVmaW5lIGJrZ2RzZXQoY2gpCQl3YmtnZHNldChzdGRzY3IsY2gpCisjZGVmaW5lIGNoZ2F0KG4sYSxjLG8pCQl3Y2hnYXQoc3Rkc2NyLG4sYSxjLG8pCisjZGVmaW5lIGNsZWFyKCkJCQl3Y2xlYXIoc3Rkc2NyKQorI2RlZmluZSBjbHJ0b2JvdCgpCQl3Y2xydG9ib3Qoc3Rkc2NyKQorI2RlZmluZSBjbHJ0b2VvbCgpCQl3Y2xydG9lb2woc3Rkc2NyKQorI2RlZmluZSBjb2xvcl9zZXQoYyxvKQkJd2NvbG9yX3NldChzdGRzY3IsYyxvKQorI2RlZmluZSBkZWxjaCgpCQkJd2RlbGNoKHN0ZHNjcikKKyNkZWZpbmUgZGVsZXRlbG4oKQkJd2luc2RlbGxuKHN0ZHNjciwtMSkKKyNkZWZpbmUgZWNob2NoYXIoYykJCXdlY2hvY2hhcihzdGRzY3IsYykKKyNkZWZpbmUgZXJhc2UoKQkJCXdlcmFzZShzdGRzY3IpCisjZGVmaW5lIGdldGNoKCkJCQl3Z2V0Y2goc3Rkc2NyKQorI2RlZmluZSBnZXRzdHIoc3RyKQkJd2dldHN0cihzdGRzY3Isc3RyKQorI2RlZmluZSBpbmNoKCkJCQl3aW5jaChzdGRzY3IpCisjZGVmaW5lIGluY2huc3RyKHMsbikJCXdpbmNobnN0cihzdGRzY3IscyxuKQorI2RlZmluZSBpbmNoc3RyKHMpCQl3aW5jaHN0cihzdGRzY3IscykKKyNkZWZpbmUgaW5uc3RyKHMsbikJCXdpbm5zdHIoc3Rkc2NyLHMsbikKKyNkZWZpbmUgaW5zY2goYykJCXdpbnNjaChzdGRzY3IsYykKKyNkZWZpbmUgaW5zZGVsbG4obikJCXdpbnNkZWxsbihzdGRzY3IsbikKKyNkZWZpbmUgaW5zZXJ0bG4oKQkJd2luc2RlbGxuKHN0ZHNjciwxKQorI2RlZmluZSBpbnNuc3RyKHMsbikJCXdpbnNuc3RyKHN0ZHNjcixzLG4pCisjZGVmaW5lIGluc3N0cihzKQkJd2luc3N0cihzdGRzY3IscykKKyNkZWZpbmUgaW5zdHIocykJCXdpbnN0cihzdGRzY3IscykKKyNkZWZpbmUgbW92ZSh5LHgpCQl3bW92ZShzdGRzY3IseSx4KQorI2RlZmluZSByZWZyZXNoKCkJCXdyZWZyZXNoKHN0ZHNjcikKKyNkZWZpbmUgc2NybChuKQkJCXdzY3JsKHN0ZHNjcixuKQorI2RlZmluZSBzZXRzY3JyZWcodCxiKQkJd3NldHNjcnJlZyhzdGRzY3IsdCxiKQorI2RlZmluZSBzdGFuZGVuZCgpCQl3c3RhbmRlbmQoc3Rkc2NyKQorI2RlZmluZSBzdGFuZG91dCgpCQl3c3RhbmRvdXQoc3Rkc2NyKQorI2RlZmluZSB0aW1lb3V0KGRlbGF5KQkJd3RpbWVvdXQoc3Rkc2NyLGRlbGF5KQorI2RlZmluZSB3ZGVsZXRlbG4od2luKQkJd2luc2RlbGxuKHdpbiwtMSkKKyNkZWZpbmUgd2luc2VydGxuKHdpbikJCXdpbnNkZWxsbih3aW4sMSkKKworLyoKKyAqIG12IGZ1bmN0aW9ucworICovCisKKyNkZWZpbmUgbXZ3YWRkY2god2luLHkseCxjaCkJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3YWRkY2god2luLGNoKSkKKyNkZWZpbmUgbXZ3YWRkY2huc3RyKHdpbix5LHgsc3RyLG4pCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3YWRkY2huc3RyKHdpbixzdHIsbikpCisjZGVmaW5lIG12d2FkZGNoc3RyKHdpbix5LHgsc3RyKQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2FkZGNobnN0cih3aW4sc3RyLC0xKSkKKyNkZWZpbmUgbXZ3YWRkbnN0cih3aW4seSx4LHN0cixuKQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2FkZG5zdHIod2luLHN0cixuKSkKKyNkZWZpbmUgbXZ3YWRkc3RyKHdpbix5LHgsc3RyKQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdhZGRuc3RyKHdpbixzdHIsLTEpKQorI2RlZmluZSBtdndkZWxjaCh3aW4seSx4KQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdkZWxjaCh3aW4pKQorI2RlZmluZSBtdndjaGdhdCh3aW4seSx4LG4sYSxjLG8pCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3Y2hnYXQod2luLG4sYSxjLG8pKQorI2RlZmluZSBtdndnZXRjaCh3aW4seSx4KQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdnZXRjaCh3aW4pKQorI2RlZmluZSBtdndnZXRuc3RyKHdpbix5LHgsc3RyLG4pCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3Z2V0bnN0cih3aW4sc3RyLG4pKQorI2RlZmluZSBtdndnZXRzdHIod2luLHkseCxzdHIpCQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2dldHN0cih3aW4sc3RyKSkKKyNkZWZpbmUgbXZ3aGxpbmUod2luLHkseCxjLG4pCQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2hsaW5lKHdpbixjLG4pKQorI2RlZmluZSBtdndpbmNoKHdpbix5LHgpCQkod21vdmUod2luLHkseCkgPT0gRVJSID8gTkNVUlNFU19DQVNUKGNodHlwZSwgRVJSKSA6IHdpbmNoKHdpbikpCisjZGVmaW5lIG12d2luY2huc3RyKHdpbix5LHgscyxuKQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2luY2huc3RyKHdpbixzLG4pKQorI2RlZmluZSBtdndpbmNoc3RyKHdpbix5LHgscykJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3aW5jaHN0cih3aW4scykpCisjZGVmaW5lIG12d2lubnN0cih3aW4seSx4LHMsbikJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3aW5uc3RyKHdpbixzLG4pKQorI2RlZmluZSBtdndpbnNjaCh3aW4seSx4LGMpCQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2luc2NoKHdpbixjKSkKKyNkZWZpbmUgbXZ3aW5zbnN0cih3aW4seSx4LHMsbikJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3aW5zbnN0cih3aW4scyxuKSkKKyNkZWZpbmUgbXZ3aW5zc3RyKHdpbix5LHgscykJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3aW5zc3RyKHdpbixzKSkKKyNkZWZpbmUgbXZ3aW5zdHIod2luLHkseCxzKQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdpbnN0cih3aW4scykpCisjZGVmaW5lIG12d3ZsaW5lKHdpbix5LHgsYyxuKQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHd2bGluZSh3aW4sYyxuKSkKKworI2RlZmluZSBtdmFkZGNoKHkseCxjaCkJCQltdndhZGRjaChzdGRzY3IseSx4LGNoKQorI2RlZmluZSBtdmFkZGNobnN0cih5LHgsc3RyLG4pCQltdndhZGRjaG5zdHIoc3Rkc2NyLHkseCxzdHIsbikKKyNkZWZpbmUgbXZhZGRjaHN0cih5LHgsc3RyKQkJbXZ3YWRkY2hzdHIoc3Rkc2NyLHkseCxzdHIpCisjZGVmaW5lIG12YWRkbnN0cih5LHgsc3RyLG4pCQltdndhZGRuc3RyKHN0ZHNjcix5LHgsc3RyLG4pCisjZGVmaW5lIG12YWRkc3RyKHkseCxzdHIpCQltdndhZGRzdHIoc3Rkc2NyLHkseCxzdHIpCisjZGVmaW5lIG12Y2hnYXQoeSx4LG4sYSxjLG8pCQltdndjaGdhdChzdGRzY3IseSx4LG4sYSxjLG8pCisjZGVmaW5lIG12ZGVsY2goeSx4KQkJCW12d2RlbGNoKHN0ZHNjcix5LHgpCisjZGVmaW5lIG12Z2V0Y2goeSx4KQkJCW12d2dldGNoKHN0ZHNjcix5LHgpCisjZGVmaW5lIG12Z2V0bnN0cih5LHgsc3RyLG4pCQltdndnZXRuc3RyKHN0ZHNjcix5LHgsc3RyLG4pCisjZGVmaW5lIG12Z2V0c3RyKHkseCxzdHIpCQltdndnZXRzdHIoc3Rkc2NyLHkseCxzdHIpCisjZGVmaW5lIG12aGxpbmUoeSx4LGMsbikJCW12d2hsaW5lKHN0ZHNjcix5LHgsYyxuKQorI2RlZmluZSBtdmluY2goeSx4KQkJCW12d2luY2goc3Rkc2NyLHkseCkKKyNkZWZpbmUgbXZpbmNobnN0cih5LHgscyxuKQkJbXZ3aW5jaG5zdHIoc3Rkc2NyLHkseCxzLG4pCisjZGVmaW5lIG12aW5jaHN0cih5LHgscykJCW12d2luY2hzdHIoc3Rkc2NyLHkseCxzKQorI2RlZmluZSBtdmlubnN0cih5LHgscyxuKQkJbXZ3aW5uc3RyKHN0ZHNjcix5LHgscyxuKQorI2RlZmluZSBtdmluc2NoKHkseCxjKQkJCW12d2luc2NoKHN0ZHNjcix5LHgsYykKKyNkZWZpbmUgbXZpbnNuc3RyKHkseCxzLG4pCQltdndpbnNuc3RyKHN0ZHNjcix5LHgscyxuKQorI2RlZmluZSBtdmluc3N0cih5LHgscykJCQltdndpbnNzdHIoc3Rkc2NyLHkseCxzKQorI2RlZmluZSBtdmluc3RyKHkseCxzKQkJCW12d2luc3RyKHN0ZHNjcix5LHgscykKKyNkZWZpbmUgbXZ2bGluZSh5LHgsYyxuKQkJbXZ3dmxpbmUoc3Rkc2NyLHkseCxjLG4pCisKKy8qCisgKiBTb21lIHdpZGUtY2hhcmFjdGVyIGZ1bmN0aW9ucyBjYW4gYmUgaW1wbGVtZW50ZWQgd2l0aG91dCB0aGUgZXh0ZW5zaW9ucy4KKyAqLworI2lmICFOQ1VSU0VTX09QQVFVRQorI2RlZmluZSBnZXRia2dkKHdpbikgICAgICAgICAgICAgICAgICAgICgod2luKS0+X2JrZ2QpCisjZW5kaWYgLyogTkNVUlNFU19PUEFRVUUgKi8KKworI2RlZmluZSBzbGtfYXR0cl9vZmYoYSx2KQkJKCh2KSA/IEVSUiA6IHNsa19hdHRyb2ZmKGEpKQorI2RlZmluZSBzbGtfYXR0cl9vbihhLHYpCQkoKHYpID8gRVJSIDogc2xrX2F0dHJvbihhKSkKKworI2lmICFOQ1VSU0VTX09QQVFVRQorI2lmIGRlZmluZWQoTkNVUlNFU19XSURFQ0hBUikgJiYgMAorI2RlZmluZSB3YXR0cl9zZXQod2luLGEscCxvcHRzKQkJKCh3aW4pLT5fYXR0cnMgPSAoKGEpICYgfkFfQ09MT1IpLCBcCisJCQkJCSAod2luKS0+X2NvbG9yID0gKHApLCBcCisJCQkJCSBPSykKKyNkZWZpbmUgd2F0dHJfZ2V0KHdpbixhLHAsb3B0cykJCSgodm9pZCkoKGEpICE9ICh2b2lkICopMCAmJiAoKihhKSA9ICh3aW4pLT5fYXR0cnMpKSwgXAorCQkJCQkgKHZvaWQpKChwKSAhPSAodm9pZCAqKTAgJiYgKCoocCkgPSAoc2hvcnQpKHdpbiktPl9jb2xvcikpLCBcCisJCQkJCSBPSykKKyNlbHNlCisjZGVmaW5lIHdhdHRyX3NldCh3aW4sYSxwLG9wdHMpCQkoKHdpbiktPl9hdHRycyA9ICgoKGEpICYgfkFfQ09MT1IpIHwgKGF0dHJfdClDT0xPUl9QQUlSKHApKSwgT0spCisjZGVmaW5lIHdhdHRyX2dldCh3aW4sYSxwLG9wdHMpCQkoKHZvaWQpKChhKSAhPSAodm9pZCAqKTAgJiYgKCooYSkgPSAod2luKS0+X2F0dHJzKSksIFwKKwkJCQkJICh2b2lkKSgocCkgIT0gKHZvaWQgKikwICYmICgqKHApID0gKHNob3J0KVBBSVJfTlVNQkVSKCh3aW4pLT5fYXR0cnMpKSksIFwKKwkJCQkJIE9LKQorI2VuZGlmCisjZW5kaWYgLyogTkNVUlNFU19PUEFRVUUgKi8KKworLyoKKyAqIFgvT3BlbiBjdXJzZXMgZGVwcmVjYXRlcyBTVnI0IHZ3cHJpbnR3L3Z3c2NhbncsIHdoaWNoIGFyZSBzdXBwb3NlZCB0byB1c2UKKyAqIHZhcmFyZ3MuaC4gIEl0IGFkZHMgbmV3IGNhbGxzIHZ3X3ByaW50dy92d19zY2Fudywgd2hpY2ggYXJlIHN1cHBvc2VkIHRvCisgKiB1c2UgUE9TSVggc3RkYXJnLmguICBUaGUgbmN1cnNlcyB2ZXJzaW9ucyBvZiB2d3ByaW50dy92d3NjYW53IGFscmVhZHkKKyAqIHVzZSBzdGRhcmcuaCwgc28uLi4KKyAqLworI2RlZmluZSB2d19wcmludHcJCXZ3cHJpbnR3CisjZGVmaW5lIHZ3X3NjYW53CQl2d3NjYW53CisKKy8qCisgKiBFeHBvcnQgZmFsbGJhY2sgZnVuY3Rpb24gZm9yIHVzZSBpbiBDKysgYmluZGluZy4KKyAqLworI2lmICExCisjZGVmaW5lIHZzc2NhbmYoYSxiLGMpIF9uY192c3NjYW5mKGEsYixjKQorTkNVUlNFU19FWFBPUlQoaW50KSB2c3NjYW5mKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKyNlbmRpZgorCisvKgorICogVGhlc2UgbWFjcm9zIGFyZSBleHRlbnNpb25zIC0gbm90IGluIFgvT3BlbiBDdXJzZXMuCisgKi8KKyNpZiAxCisjaWYgIU5DVVJTRVNfT1BBUVVFCisjZGVmaW5lIGlzX2NsZWFyZWQod2luKQkJKCh3aW4pID8gKHdpbiktPl9jbGVhciA6IEZBTFNFKQorI2RlZmluZSBpc19pZGNvayh3aW4pCQkoKHdpbikgPyAod2luKS0+X2lkY29rIDogRkFMU0UpCisjZGVmaW5lIGlzX2lkbG9rKHdpbikJCSgod2luKSA/ICh3aW4pLT5faWRsb2sgOiBGQUxTRSkKKyNkZWZpbmUgaXNfaW1tZWRvayh3aW4pCQkoKHdpbikgPyAod2luKS0+X2ltbWVkIDogRkFMU0UpCisjZGVmaW5lIGlzX2tleXBhZCh3aW4pCQkoKHdpbikgPyAod2luKS0+X3VzZV9rZXlwYWQgOiBGQUxTRSkKKyNkZWZpbmUgaXNfbGVhdmVvayh3aW4pCQkoKHdpbikgPyAod2luKS0+X2xlYXZlb2sgOiBGQUxTRSkKKyNkZWZpbmUgaXNfbm9kZWxheSh3aW4pCQkoKHdpbikgPyAoKHdpbiktPl9kZWxheSA9PSAwKSA6IEZBTFNFKQorI2RlZmluZSBpc19ub3RpbWVvdXQod2luKQkoKHdpbikgPyAod2luKS0+X25vdGltZW91dCA6IEZBTFNFKQorI2RlZmluZSBpc19wYWQod2luKQkJKCh3aW4pID8gKCh3aW4pLT5fZmxhZ3MgJiBfSVNQQUQpICE9IDAgOiBGQUxTRSkKKyNkZWZpbmUgaXNfc2Nyb2xsb2sod2luKQkoKHdpbikgPyAod2luKS0+X3Njcm9sbCA6IEZBTFNFKQorI2RlZmluZSBpc19zdWJ3aW4od2luKQkJKCh3aW4pID8gKCh3aW4pLT5fZmxhZ3MgJiBfU1VCV0lOKSAhPSAwIDogRkFMU0UpCisjZGVmaW5lIGlzX3N5bmNvayh3aW4pCQkoKHdpbikgPyAod2luKS0+X3N5bmMgOiBGQUxTRSkKKyNkZWZpbmUgd2dldHBhcmVudCh3aW4pCQkoKHdpbikgPyAod2luKS0+X3BhcmVudCA6IDApCisjZGVmaW5lIHdnZXRzY3JyZWcod2luLHQsYikJKCh3aW4pID8gKCoodCkgPSAod2luKS0+X3JlZ3RvcCwgKihiKSA9ICh3aW4pLT5fcmVnYm90dG9tLCBPSykgOiBFUlIpCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogTkNVUlNFU19OT01BQ1JPUyAqLworCisvKgorICogUHVibGljIHZhcmlhYmxlcy4KKyAqCisgKiBOb3RlczoKKyAqCWEuIEVTQ0RFTEFZIHdhcyBhbiB1bmRvY3VtZW50ZWQgZmVhdHVyZSB1bmRlciBBSVggY3Vyc2VzLgorICoJICAgSXQgZ2l2ZXMgdGhlIEVTQyBleHBpcmUgdGltZSBpbiBtaWxsaXNlY29uZHMuCisgKgliLiB0dHl0eXBlIGlzIG5lZWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICovCisjaWYgTkNVUlNFU19SRUVOVFJBTlQKKworTkNVUlNFU19XUkFQUEVEX1ZBUihXSU5ET1cgKiwgY3Vyc2NyKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoV0lORE9XICosIG5ld3Njcik7CitOQ1VSU0VTX1dSQVBQRURfVkFSKFdJTkRPVyAqLCBzdGRzY3IpOworTkNVUlNFU19XUkFQUEVEX1ZBUihjaGFyICosIHR0eXR5cGUpOworTkNVUlNFU19XUkFQUEVEX1ZBUihpbnQsIENPTE9SUyk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKGludCwgQ09MT1JfUEFJUlMpOworTkNVUlNFU19XUkFQUEVEX1ZBUihpbnQsIENPTFMpOworTkNVUlNFU19XUkFQUEVEX1ZBUihpbnQsIEVTQ0RFTEFZKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoaW50LCBMSU5FUyk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKGludCwgVEFCU0laRSk7CisKKyNkZWZpbmUgY3Vyc2NyICAgICAgTkNVUlNFU19QVUJMSUNfVkFSKGN1cnNjcigpKQorI2RlZmluZSBuZXdzY3IgICAgICBOQ1VSU0VTX1BVQkxJQ19WQVIobmV3c2NyKCkpCisjZGVmaW5lIHN0ZHNjciAgICAgIE5DVVJTRVNfUFVCTElDX1ZBUihzdGRzY3IoKSkKKyNkZWZpbmUgdHR5dHlwZSAgICAgTkNVUlNFU19QVUJMSUNfVkFSKHR0eXR5cGUoKSkKKyNkZWZpbmUgQ09MT1JTICAgICAgTkNVUlNFU19QVUJMSUNfVkFSKENPTE9SUygpKQorI2RlZmluZSBDT0xPUl9QQUlSUyBOQ1VSU0VTX1BVQkxJQ19WQVIoQ09MT1JfUEFJUlMoKSkKKyNkZWZpbmUgQ09MUyAgICAgICAgTkNVUlNFU19QVUJMSUNfVkFSKENPTFMoKSkKKyNkZWZpbmUgRVNDREVMQVkgICAgTkNVUlNFU19QVUJMSUNfVkFSKEVTQ0RFTEFZKCkpCisjZGVmaW5lIExJTkVTICAgICAgIE5DVVJTRVNfUFVCTElDX1ZBUihMSU5FUygpKQorI2RlZmluZSBUQUJTSVpFICAgICBOQ1VSU0VTX1BVQkxJQ19WQVIoVEFCU0laRSgpKQorCisjZWxzZQorCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKFdJTkRPVyAqKSBjdXJzY3I7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKFdJTkRPVyAqKSBuZXdzY3I7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKFdJTkRPVyAqKSBzdGRzY3I7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGNoYXIpIHR0eXR5cGVbXTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoaW50KSBDT0xPUlM7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGludCkgQ09MT1JfUEFJUlM7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGludCkgQ09MUzsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoaW50KSBFU0NERUxBWTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoaW50KSBMSU5FUzsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoaW50KSBUQUJTSVpFOworCisjZW5kaWYKKworLyoKKyAqIFBzZXVkby1jaGFyYWN0ZXIgdG9rZW5zIG91dHNpZGUgQVNDSUkgcmFuZ2UuICBUaGUgY3Vyc2VzIHdnZXRjaCgpIGZ1bmN0aW9uCisgKiB3aWxsIHJldHVybiBhbnkgZ2l2ZW4gb25lIG9mIHRoZXNlIG9ubHkgaWYgdGhlIGNvcnJlc3BvbmRpbmcgay0gY2FwYWJpbGl0eQorICogaXMgZGVmaW5lZCBpbiB5b3VyIHRlcm1pbmFsJ3MgdGVybWluZm8gZW50cnkuCisgKgorICogU29tZSBrZXlzIChLRVlfQTEsIGV0YykgYXJlIGFycmFuZ2VkIGxpa2UgdGhpczoKKyAqCWExICAgICB1cCAgICBhMworICoJbGVmdCAgIGIyICAgIHJpZ2h0CisgKgljMSAgICAgZG93biAgYzMKKyAqCisgKiBBIGZldyBrZXkgY29kZXMgZG8gbm90IGRlcGVuZCB1cG9uIHRoZSB0ZXJtaW5mbyBlbnRyeS4KKyAqLworI2RlZmluZSBLRVlfQ09ERV9ZRVMJMDQwMAkJLyogQSB3Y2hhcl90IGNvbnRhaW5zIGEga2V5IGNvZGUgKi8KKyNkZWZpbmUgS0VZX01JTgkJMDQwMQkJLyogTWluaW11bSBjdXJzZXMga2V5ICovCisjZGVmaW5lIEtFWV9CUkVBSwkwNDAxCQkvKiBCcmVhayBrZXkgKHVucmVsaWFibGUpICovCisjZGVmaW5lIEtFWV9TUkVTRVQJMDUzMAkJLyogU29mdCAocGFydGlhbCkgcmVzZXQgKHVucmVsaWFibGUpICovCisjZGVmaW5lIEtFWV9SRVNFVAkwNTMxCQkvKiBSZXNldCBvciBoYXJkIHJlc2V0ICh1bnJlbGlhYmxlKSAqLworLyoKKyAqIFRoZXNlIGRlZmluaXRpb25zIHdlcmUgZ2VuZXJhdGVkIGJ5IC9idWlsZC9idWlsZGQvbmN1cnNlcy01LjkvaW5jbHVkZS9NS2tleV9kZWZzLnNoIC9idWlsZC9idWlsZGQvbmN1cnNlcy01LjkvaW5jbHVkZS9DYXBzCisgKi8KKyNkZWZpbmUgS0VZX0RPV04JMDQwMgkJLyogZG93bi1hcnJvdyBrZXkgKi8KKyNkZWZpbmUgS0VZX1VQCQkwNDAzCQkvKiB1cC1hcnJvdyBrZXkgKi8KKyNkZWZpbmUgS0VZX0xFRlQJMDQwNAkJLyogbGVmdC1hcnJvdyBrZXkgKi8KKyNkZWZpbmUgS0VZX1JJR0hUCTA0MDUJCS8qIHJpZ2h0LWFycm93IGtleSAqLworI2RlZmluZSBLRVlfSE9NRQkwNDA2CQkvKiBob21lIGtleSAqLworI2RlZmluZSBLRVlfQkFDS1NQQUNFCTA0MDcJCS8qIGJhY2tzcGFjZSBrZXkgKi8KKyNkZWZpbmUgS0VZX0YwCQkwNDEwCQkvKiBGdW5jdGlvbiBrZXlzLiAgU3BhY2UgZm9yIDY0ICovCisjZGVmaW5lIEtFWV9GKG4pCShLRVlfRjArKG4pKQkvKiBWYWx1ZSBvZiBmdW5jdGlvbiBrZXkgbiAqLworI2RlZmluZSBLRVlfREwJCTA1MTAJCS8qIGRlbGV0ZS1saW5lIGtleSAqLworI2RlZmluZSBLRVlfSUwJCTA1MTEJCS8qIGluc2VydC1saW5lIGtleSAqLworI2RlZmluZSBLRVlfREMJCTA1MTIJCS8qIGRlbGV0ZS1jaGFyYWN0ZXIga2V5ICovCisjZGVmaW5lIEtFWV9JQwkJMDUxMwkJLyogaW5zZXJ0LWNoYXJhY3RlciBrZXkgKi8KKyNkZWZpbmUgS0VZX0VJQwkJMDUxNAkJLyogc2VudCBieSBybWlyIG9yIHNtaXIgaW4gaW5zZXJ0IG1vZGUgKi8KKyNkZWZpbmUgS0VZX0NMRUFSCTA1MTUJCS8qIGNsZWFyLXNjcmVlbiBvciBlcmFzZSBrZXkgKi8KKyNkZWZpbmUgS0VZX0VPUwkJMDUxNgkJLyogY2xlYXItdG8tZW5kLW9mLXNjcmVlbiBrZXkgKi8KKyNkZWZpbmUgS0VZX0VPTAkJMDUxNwkJLyogY2xlYXItdG8tZW5kLW9mLWxpbmUga2V5ICovCisjZGVmaW5lIEtFWV9TRgkJMDUyMAkJLyogc2Nyb2xsLWZvcndhcmQga2V5ICovCisjZGVmaW5lIEtFWV9TUgkJMDUyMQkJLyogc2Nyb2xsLWJhY2t3YXJkIGtleSAqLworI2RlZmluZSBLRVlfTlBBR0UJMDUyMgkJLyogbmV4dC1wYWdlIGtleSAqLworI2RlZmluZSBLRVlfUFBBR0UJMDUyMwkJLyogcHJldmlvdXMtcGFnZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NUQUIJMDUyNAkJLyogc2V0LXRhYiBrZXkgKi8KKyNkZWZpbmUgS0VZX0NUQUIJMDUyNQkJLyogY2xlYXItdGFiIGtleSAqLworI2RlZmluZSBLRVlfQ0FUQUIJMDUyNgkJLyogY2xlYXItYWxsLXRhYnMga2V5ICovCisjZGVmaW5lIEtFWV9FTlRFUgkwNTI3CQkvKiBlbnRlci9zZW5kIGtleSAqLworI2RlZmluZSBLRVlfUFJJTlQJMDUzMgkJLyogcHJpbnQga2V5ICovCisjZGVmaW5lIEtFWV9MTAkJMDUzMwkJLyogbG93ZXItbGVmdCBrZXkgKGhvbWUgZG93bikgKi8KKyNkZWZpbmUgS0VZX0ExCQkwNTM0CQkvKiB1cHBlciBsZWZ0IG9mIGtleXBhZCAqLworI2RlZmluZSBLRVlfQTMJCTA1MzUJCS8qIHVwcGVyIHJpZ2h0IG9mIGtleXBhZCAqLworI2RlZmluZSBLRVlfQjIJCTA1MzYJCS8qIGNlbnRlciBvZiBrZXlwYWQgKi8KKyNkZWZpbmUgS0VZX0MxCQkwNTM3CQkvKiBsb3dlciBsZWZ0IG9mIGtleXBhZCAqLworI2RlZmluZSBLRVlfQzMJCTA1NDAJCS8qIGxvd2VyIHJpZ2h0IG9mIGtleXBhZCAqLworI2RlZmluZSBLRVlfQlRBQgkwNTQxCQkvKiBiYWNrLXRhYiBrZXkgKi8KKyNkZWZpbmUgS0VZX0JFRwkJMDU0MgkJLyogYmVnaW4ga2V5ICovCisjZGVmaW5lIEtFWV9DQU5DRUwJMDU0MwkJLyogY2FuY2VsIGtleSAqLworI2RlZmluZSBLRVlfQ0xPU0UJMDU0NAkJLyogY2xvc2Uga2V5ICovCisjZGVmaW5lIEtFWV9DT01NQU5ECTA1NDUJCS8qIGNvbW1hbmQga2V5ICovCisjZGVmaW5lIEtFWV9DT1BZCTA1NDYJCS8qIGNvcHkga2V5ICovCisjZGVmaW5lIEtFWV9DUkVBVEUJMDU0NwkJLyogY3JlYXRlIGtleSAqLworI2RlZmluZSBLRVlfRU5ECQkwNTUwCQkvKiBlbmQga2V5ICovCisjZGVmaW5lIEtFWV9FWElUCTA1NTEJCS8qIGV4aXQga2V5ICovCisjZGVmaW5lIEtFWV9GSU5ECTA1NTIJCS8qIGZpbmQga2V5ICovCisjZGVmaW5lIEtFWV9IRUxQCTA1NTMJCS8qIGhlbHAga2V5ICovCisjZGVmaW5lIEtFWV9NQVJLCTA1NTQJCS8qIG1hcmsga2V5ICovCisjZGVmaW5lIEtFWV9NRVNTQUdFCTA1NTUJCS8qIG1lc3NhZ2Uga2V5ICovCisjZGVmaW5lIEtFWV9NT1ZFCTA1NTYJCS8qIG1vdmUga2V5ICovCisjZGVmaW5lIEtFWV9ORVhUCTA1NTcJCS8qIG5leHQga2V5ICovCisjZGVmaW5lIEtFWV9PUEVOCTA1NjAJCS8qIG9wZW4ga2V5ICovCisjZGVmaW5lIEtFWV9PUFRJT05TCTA1NjEJCS8qIG9wdGlvbnMga2V5ICovCisjZGVmaW5lIEtFWV9QUkVWSU9VUwkwNTYyCQkvKiBwcmV2aW91cyBrZXkgKi8KKyNkZWZpbmUgS0VZX1JFRE8JMDU2MwkJLyogcmVkbyBrZXkgKi8KKyNkZWZpbmUgS0VZX1JFRkVSRU5DRQkwNTY0CQkvKiByZWZlcmVuY2Uga2V5ICovCisjZGVmaW5lIEtFWV9SRUZSRVNICTA1NjUJCS8qIHJlZnJlc2gga2V5ICovCisjZGVmaW5lIEtFWV9SRVBMQUNFCTA1NjYJCS8qIHJlcGxhY2Uga2V5ICovCisjZGVmaW5lIEtFWV9SRVNUQVJUCTA1NjcJCS8qIHJlc3RhcnQga2V5ICovCisjZGVmaW5lIEtFWV9SRVNVTUUJMDU3MAkJLyogcmVzdW1lIGtleSAqLworI2RlZmluZSBLRVlfU0FWRQkwNTcxCQkvKiBzYXZlIGtleSAqLworI2RlZmluZSBLRVlfU0JFRwkwNTcyCQkvKiBzaGlmdGVkIGJlZ2luIGtleSAqLworI2RlZmluZSBLRVlfU0NBTkNFTAkwNTczCQkvKiBzaGlmdGVkIGNhbmNlbCBrZXkgKi8KKyNkZWZpbmUgS0VZX1NDT01NQU5ECTA1NzQJCS8qIHNoaWZ0ZWQgY29tbWFuZCBrZXkgKi8KKyNkZWZpbmUgS0VZX1NDT1BZCTA1NzUJCS8qIHNoaWZ0ZWQgY29weSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NDUkVBVEUJMDU3NgkJLyogc2hpZnRlZCBjcmVhdGUga2V5ICovCisjZGVmaW5lIEtFWV9TREMJCTA1NzcJCS8qIHNoaWZ0ZWQgZGVsZXRlLWNoYXJhY3RlciBrZXkgKi8KKyNkZWZpbmUgS0VZX1NETAkJMDYwMAkJLyogc2hpZnRlZCBkZWxldGUtbGluZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NFTEVDVAkwNjAxCQkvKiBzZWxlY3Qga2V5ICovCisjZGVmaW5lIEtFWV9TRU5ECTA2MDIJCS8qIHNoaWZ0ZWQgZW5kIGtleSAqLworI2RlZmluZSBLRVlfU0VPTAkwNjAzCQkvKiBzaGlmdGVkIGNsZWFyLXRvLWVuZC1vZi1saW5lIGtleSAqLworI2RlZmluZSBLRVlfU0VYSVQJMDYwNAkJLyogc2hpZnRlZCBleGl0IGtleSAqLworI2RlZmluZSBLRVlfU0ZJTkQJMDYwNQkJLyogc2hpZnRlZCBmaW5kIGtleSAqLworI2RlZmluZSBLRVlfU0hFTFAJMDYwNgkJLyogc2hpZnRlZCBoZWxwIGtleSAqLworI2RlZmluZSBLRVlfU0hPTUUJMDYwNwkJLyogc2hpZnRlZCBob21lIGtleSAqLworI2RlZmluZSBLRVlfU0lDCQkwNjEwCQkvKiBzaGlmdGVkIGluc2VydC1jaGFyYWN0ZXIga2V5ICovCisjZGVmaW5lIEtFWV9TTEVGVAkwNjExCQkvKiBzaGlmdGVkIGxlZnQtYXJyb3cga2V5ICovCisjZGVmaW5lIEtFWV9TTUVTU0FHRQkwNjEyCQkvKiBzaGlmdGVkIG1lc3NhZ2Uga2V5ICovCisjZGVmaW5lIEtFWV9TTU9WRQkwNjEzCQkvKiBzaGlmdGVkIG1vdmUga2V5ICovCisjZGVmaW5lIEtFWV9TTkVYVAkwNjE0CQkvKiBzaGlmdGVkIG5leHQga2V5ICovCisjZGVmaW5lIEtFWV9TT1BUSU9OUwkwNjE1CQkvKiBzaGlmdGVkIG9wdGlvbnMga2V5ICovCisjZGVmaW5lIEtFWV9TUFJFVklPVVMJMDYxNgkJLyogc2hpZnRlZCBwcmV2aW91cyBrZXkgKi8KKyNkZWZpbmUgS0VZX1NQUklOVAkwNjE3CQkvKiBzaGlmdGVkIHByaW50IGtleSAqLworI2RlZmluZSBLRVlfU1JFRE8JMDYyMAkJLyogc2hpZnRlZCByZWRvIGtleSAqLworI2RlZmluZSBLRVlfU1JFUExBQ0UJMDYyMQkJLyogc2hpZnRlZCByZXBsYWNlIGtleSAqLworI2RlZmluZSBLRVlfU1JJR0hUCTA2MjIJCS8qIHNoaWZ0ZWQgcmlnaHQtYXJyb3cga2V5ICovCisjZGVmaW5lIEtFWV9TUlNVTUUJMDYyMwkJLyogc2hpZnRlZCByZXN1bWUga2V5ICovCisjZGVmaW5lIEtFWV9TU0FWRQkwNjI0CQkvKiBzaGlmdGVkIHNhdmUga2V5ICovCisjZGVmaW5lIEtFWV9TU1VTUEVORAkwNjI1CQkvKiBzaGlmdGVkIHN1c3BlbmQga2V5ICovCisjZGVmaW5lIEtFWV9TVU5ETwkwNjI2CQkvKiBzaGlmdGVkIHVuZG8ga2V5ICovCisjZGVmaW5lIEtFWV9TVVNQRU5ECTA2MjcJCS8qIHN1c3BlbmQga2V5ICovCisjZGVmaW5lIEtFWV9VTkRPCTA2MzAJCS8qIHVuZG8ga2V5ICovCisjZGVmaW5lIEtFWV9NT1VTRQkwNjMxCQkvKiBNb3VzZSBldmVudCBoYXMgb2NjdXJyZWQgKi8KKyNkZWZpbmUgS0VZX1JFU0laRQkwNjMyCQkvKiBUZXJtaW5hbCByZXNpemUgZXZlbnQgKi8KKyNkZWZpbmUgS0VZX0VWRU5UCTA2MzMJCS8qIFdlIHdlcmUgaW50ZXJydXB0ZWQgYnkgYW4gZXZlbnQgKi8KKworI2RlZmluZSBLRVlfTUFYCQkwNzc3CQkvKiBNYXhpbXVtIGtleSB2YWx1ZSBpcyAwNjMzICovCisvKiAkSWQ6IGN1cnNlcy50YWlsLHYgMS4yMCAyMDEwLzAzLzI4IDE5OjEwOjU1IHRvbSBFeHAgJCAqLworLyoKKyAqIHZpbGU6Y21vZGU6CisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBuY3Vyc2VzLCBkZXNpZ25lZCB0byBiZSBhcHBlbmRlZCBhZnRlciBjdXJzZXMuaC5pbgorICogKHNlZSB0aGF0IGZpbGUgZm9yIHRoZSByZWxldmFudCBjb3B5cmlnaHQpLgorICovCisKKy8qIG1vdXNlIGludGVyZmFjZSAqLworCisjaWYgTkNVUlNFU19NT1VTRV9WRVJTSU9OID4gMQorI2RlZmluZSBOQ1VSU0VTX01PVVNFX01BU0soYixtKSAoKG0pIDw8ICgoKGIpIC0gMSkgKiA1KSkKKyNlbHNlCisjZGVmaW5lIE5DVVJTRVNfTU9VU0VfTUFTSyhiLG0pICgobSkgPDwgKCgoYikgLSAxKSAqIDYpKQorI2VuZGlmCisKKyNkZWZpbmUJTkNVUlNFU19CVVRUT05fUkVMRUFTRUQJMDAxTAorI2RlZmluZQlOQ1VSU0VTX0JVVFRPTl9QUkVTU0VECTAwMkwKKyNkZWZpbmUJTkNVUlNFU19CVVRUT05fQ0xJQ0tFRAkwMDRMCisjZGVmaW5lCU5DVVJTRVNfRE9VQkxFX0NMSUNLRUQJMDEwTAorI2RlZmluZQlOQ1VSU0VTX1RSSVBMRV9DTElDS0VECTAyMEwKKyNkZWZpbmUJTkNVUlNFU19SRVNFUlZFRF9FVkVOVAkwNDBMCisKKy8qIGV2ZW50IG1hc2tzICovCisjZGVmaW5lCUJVVFRPTjFfUkVMRUFTRUQJTkNVUlNFU19NT1VTRV9NQVNLKDEsIE5DVVJTRVNfQlVUVE9OX1JFTEVBU0VEKQorI2RlZmluZQlCVVRUT04xX1BSRVNTRUQJCU5DVVJTRVNfTU9VU0VfTUFTSygxLCBOQ1VSU0VTX0JVVFRPTl9QUkVTU0VEKQorI2RlZmluZQlCVVRUT04xX0NMSUNLRUQJCU5DVVJTRVNfTU9VU0VfTUFTSygxLCBOQ1VSU0VTX0JVVFRPTl9DTElDS0VEKQorI2RlZmluZQlCVVRUT04xX0RPVUJMRV9DTElDS0VECU5DVVJTRVNfTU9VU0VfTUFTSygxLCBOQ1VSU0VTX0RPVUJMRV9DTElDS0VEKQorI2RlZmluZQlCVVRUT04xX1RSSVBMRV9DTElDS0VECU5DVVJTRVNfTU9VU0VfTUFTSygxLCBOQ1VSU0VTX1RSSVBMRV9DTElDS0VEKQorCisjZGVmaW5lCUJVVFRPTjJfUkVMRUFTRUQJTkNVUlNFU19NT1VTRV9NQVNLKDIsIE5DVVJTRVNfQlVUVE9OX1JFTEVBU0VEKQorI2RlZmluZQlCVVRUT04yX1BSRVNTRUQJCU5DVVJTRVNfTU9VU0VfTUFTSygyLCBOQ1VSU0VTX0JVVFRPTl9QUkVTU0VEKQorI2RlZmluZQlCVVRUT04yX0NMSUNLRUQJCU5DVVJTRVNfTU9VU0VfTUFTSygyLCBOQ1VSU0VTX0JVVFRPTl9DTElDS0VEKQorI2RlZmluZQlCVVRUT04yX0RPVUJMRV9DTElDS0VECU5DVVJTRVNfTU9VU0VfTUFTSygyLCBOQ1VSU0VTX0RPVUJMRV9DTElDS0VEKQorI2RlZmluZQlCVVRUT04yX1RSSVBMRV9DTElDS0VECU5DVVJTRVNfTU9VU0VfTUFTSygyLCBOQ1VSU0VTX1RSSVBMRV9DTElDS0VEKQorCisjZGVmaW5lCUJVVFRPTjNfUkVMRUFTRUQJTkNVUlNFU19NT1VTRV9NQVNLKDMsIE5DVVJTRVNfQlVUVE9OX1JFTEVBU0VEKQorI2RlZmluZQlCVVRUT04zX1BSRVNTRUQJCU5DVVJTRVNfTU9VU0VfTUFTSygzLCBOQ1VSU0VTX0JVVFRPTl9QUkVTU0VEKQorI2RlZmluZQlCVVRUT04zX0NMSUNLRUQJCU5DVVJTRVNfTU9VU0VfTUFTSygzLCBOQ1VSU0VTX0JVVFRPTl9DTElDS0VEKQorI2RlZmluZQlCVVRUT04zX0RPVUJMRV9DTElDS0VECU5DVVJTRVNfTU9VU0VfTUFTSygzLCBOQ1VSU0VTX0RPVUJMRV9DTElDS0VEKQorI2RlZmluZQlCVVRUT04zX1RSSVBMRV9DTElDS0VECU5DVVJTRVNfTU9VU0VfTUFTSygzLCBOQ1VSU0VTX1RSSVBMRV9DTElDS0VEKQorCisjZGVmaW5lCUJVVFRPTjRfUkVMRUFTRUQJTkNVUlNFU19NT1VTRV9NQVNLKDQsIE5DVVJTRVNfQlVUVE9OX1JFTEVBU0VEKQorI2RlZmluZQlCVVRUT040X1BSRVNTRUQJCU5DVVJTRVNfTU9VU0VfTUFTSyg0LCBOQ1VSU0VTX0JVVFRPTl9QUkVTU0VEKQorI2RlZmluZQlCVVRUT040X0NMSUNLRUQJCU5DVVJTRVNfTU9VU0VfTUFTSyg0LCBOQ1VSU0VTX0JVVFRPTl9DTElDS0VEKQorI2RlZmluZQlCVVRUT040X0RPVUJMRV9DTElDS0VECU5DVVJTRVNfTU9VU0VfTUFTSyg0LCBOQ1VSU0VTX0RPVUJMRV9DTElDS0VEKQorI2RlZmluZQlCVVRUT040X1RSSVBMRV9DTElDS0VECU5DVVJTRVNfTU9VU0VfTUFTSyg0LCBOQ1VSU0VTX1RSSVBMRV9DTElDS0VEKQorCisvKgorICogSW4gMzIgYml0cyB0aGUgdmVyc2lvbi0xIHNjaGVtZSBkb2VzIG5vdCBwcm92aWRlIGVub3VnaCBzcGFjZSBmb3IgYSA1dGgKKyAqIGJ1dHRvbiwgdW5sZXNzIHdlIGNob29zZSB0byBjaGFuZ2UgdGhlIEFCSSBieSBvbWl0dGluZyB0aGUgcmVzZXJ2ZWQtZXZlbnRzLgorICovCisjaWYgTkNVUlNFU19NT1VTRV9WRVJTSU9OID4gMQorCisjZGVmaW5lCUJVVFRPTjVfUkVMRUFTRUQJTkNVUlNFU19NT1VTRV9NQVNLKDUsIE5DVVJTRVNfQlVUVE9OX1JFTEVBU0VEKQorI2RlZmluZQlCVVRUT041X1BSRVNTRUQJCU5DVVJTRVNfTU9VU0VfTUFTSyg1LCBOQ1VSU0VTX0JVVFRPTl9QUkVTU0VEKQorI2RlZmluZQlCVVRUT041X0NMSUNLRUQJCU5DVVJTRVNfTU9VU0VfTUFTSyg1LCBOQ1VSU0VTX0JVVFRPTl9DTElDS0VEKQorI2RlZmluZQlCVVRUT041X0RPVUJMRV9DTElDS0VECU5DVVJTRVNfTU9VU0VfTUFTSyg1LCBOQ1VSU0VTX0RPVUJMRV9DTElDS0VEKQorI2RlZmluZQlCVVRUT041X1RSSVBMRV9DTElDS0VECU5DVVJTRVNfTU9VU0VfTUFTSyg1LCBOQ1VSU0VTX1RSSVBMRV9DTElDS0VEKQorCisjZGVmaW5lCUJVVFRPTl9DVFJMCQlOQ1VSU0VTX01PVVNFX01BU0soNiwgMDAwMUwpCisjZGVmaW5lCUJVVFRPTl9TSElGVAkJTkNVUlNFU19NT1VTRV9NQVNLKDYsIDAwMDJMKQorI2RlZmluZQlCVVRUT05fQUxUCQlOQ1VSU0VTX01PVVNFX01BU0soNiwgMDAwNEwpCisjZGVmaW5lCVJFUE9SVF9NT1VTRV9QT1NJVElPTglOQ1VSU0VTX01PVVNFX01BU0soNiwgMDAxMEwpCisKKyNlbHNlCisKKyNkZWZpbmUJQlVUVE9OMV9SRVNFUlZFRF9FVkVOVAlOQ1VSU0VTX01PVVNFX01BU0soMSwgTkNVUlNFU19SRVNFUlZFRF9FVkVOVCkKKyNkZWZpbmUJQlVUVE9OMl9SRVNFUlZFRF9FVkVOVAlOQ1VSU0VTX01PVVNFX01BU0soMiwgTkNVUlNFU19SRVNFUlZFRF9FVkVOVCkKKyNkZWZpbmUJQlVUVE9OM19SRVNFUlZFRF9FVkVOVAlOQ1VSU0VTX01PVVNFX01BU0soMywgTkNVUlNFU19SRVNFUlZFRF9FVkVOVCkKKyNkZWZpbmUJQlVUVE9ONF9SRVNFUlZFRF9FVkVOVAlOQ1VSU0VTX01PVVNFX01BU0soNCwgTkNVUlNFU19SRVNFUlZFRF9FVkVOVCkKKworI2RlZmluZQlCVVRUT05fQ1RSTAkJTkNVUlNFU19NT1VTRV9NQVNLKDUsIDAwMDFMKQorI2RlZmluZQlCVVRUT05fU0hJRlQJCU5DVVJTRVNfTU9VU0VfTUFTSyg1LCAwMDAyTCkKKyNkZWZpbmUJQlVUVE9OX0FMVAkJTkNVUlNFU19NT1VTRV9NQVNLKDUsIDAwMDRMKQorI2RlZmluZQlSRVBPUlRfTU9VU0VfUE9TSVRJT04JTkNVUlNFU19NT1VTRV9NQVNLKDUsIDAwMTBMKQorCisjZW5kaWYKKworI2RlZmluZQlBTExfTU9VU0VfRVZFTlRTCShSRVBPUlRfTU9VU0VfUE9TSVRJT04gLSAxKQorCisvKiBtYWNyb3MgdG8gZXh0cmFjdCBzaW5nbGUgZXZlbnQtYml0cyBmcm9tIG1hc2tzICovCisjZGVmaW5lCUJVVFRPTl9SRUxFQVNFKGUsIHgpCQkoKGUpICYgTkNVUlNFU19NT1VTRV9NQVNLKHgsIDAwMSkpCisjZGVmaW5lCUJVVFRPTl9QUkVTUyhlLCB4KQkJKChlKSAmIE5DVVJTRVNfTU9VU0VfTUFTSyh4LCAwMDIpKQorI2RlZmluZQlCVVRUT05fQ0xJQ0soZSwgeCkJCSgoZSkgJiBOQ1VSU0VTX01PVVNFX01BU0soeCwgMDA0KSkKKyNkZWZpbmUJQlVUVE9OX0RPVUJMRV9DTElDSyhlLCB4KQkoKGUpICYgTkNVUlNFU19NT1VTRV9NQVNLKHgsIDAxMCkpCisjZGVmaW5lCUJVVFRPTl9UUklQTEVfQ0xJQ0soZSwgeCkJKChlKSAmIE5DVVJTRVNfTU9VU0VfTUFTSyh4LCAwMjApKQorI2RlZmluZQlCVVRUT05fUkVTRVJWRURfRVZFTlQoZSwgeCkJKChlKSAmIE5DVVJTRVNfTU9VU0VfTUFTSyh4LCAwNDApKQorCit0eXBlZGVmIHN0cnVjdAoreworICAgIHNob3J0IGlkOwkJLyogSUQgdG8gZGlzdGluZ3Vpc2ggbXVsdGlwbGUgZGV2aWNlcyAqLworICAgIGludCB4LCB5LCB6OwkvKiBldmVudCBjb29yZGluYXRlcyAoY2hhcmFjdGVyLWNlbGwpICovCisgICAgbW1hc2tfdCBic3RhdGU7CS8qIGJ1dHRvbiBzdGF0ZSBiaXRzICovCit9CitNRVZFTlQ7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSAgICBoYXNfbW91c2Uodm9pZCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgZ2V0bW91c2UgKE1FVkVOVCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICB1bmdldG1vdXNlIChNRVZFTlQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQobW1hc2tfdCkgbW91c2VtYXNrIChtbWFza190LCBtbWFza190ICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpICAgIHdlbmNsb3NlIChjb25zdCBXSU5ET1cgKiwgaW50LCBpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIG1vdXNlaW50ZXJ2YWwgKGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgICAgd21vdXNlX3RyYWZvIChjb25zdCBXSU5ET1cqLCBpbnQqLCBpbnQqLCBib29sKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSAgICBtb3VzZV90cmFmbyAoaW50KiwgaW50KiwgYm9vbCk7ICAgICAgICAgICAgICAvKiBnZW5lcmF0ZWQgKi8KKworI2lmIE5DVVJTRVNfU1BfRlVOQ1MKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSAgICBOQ1VSU0VTX1NQX05BTUUoaGFzX21vdXNlKSAoU0NSRUVOKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgTkNVUlNFU19TUF9OQU1FKGdldG1vdXNlKSAoU0NSRUVOKiwgTUVWRU5UICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIE5DVVJTRVNfU1BfTkFNRSh1bmdldG1vdXNlKSAoU0NSRUVOKixNRVZFTlQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQobW1hc2tfdCkgTkNVUlNFU19TUF9OQU1FKG1vdXNlbWFzaykgKFNDUkVFTiosIG1tYXNrX3QsIG1tYXNrX3QgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgTkNVUlNFU19TUF9OQU1FKG1vdXNlaW50ZXJ2YWwpIChTQ1JFRU4qLCBpbnQpOworI2VuZGlmCisKKyNkZWZpbmUgbW91c2VfdHJhZm8oeSx4LHRvX3NjcmVlbikgd21vdXNlX3RyYWZvKHN0ZHNjcix5LHgsdG9fc2NyZWVuKQorCisvKiBvdGhlciBub24tWFNJIGZ1bmN0aW9ucyAqLworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtY3ByaW50IChjaGFyICosIGludCk7CS8qIGRpcmVjdCBkYXRhIHRvIHByaW50ZXIgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGhhc19rZXkgKGludCk7CQkvKiBkbyB3ZSBoYXZlIGdpdmVuIGtleT8gKi8KKworI2lmIE5DVVJTRVNfU1BfRlVOQ1MKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShoYXNfa2V5KSAoU0NSRUVOKiwgaW50KTsgICAgLyogZG8gd2UgaGF2ZSBnaXZlbiBrZXk/ICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUobWNwcmludCkgKFNDUkVFTiosIGNoYXIgKiwgaW50KTsJLyogZGlyZWN0IGRhdGEgdG8gcHJpbnRlciAqLworI2VuZGlmCisKKy8qIERlYnVnZ2luZyA6IHVzZSB3aXRoIGxpYm5jdXJzZXNfZy5hICovCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfdHJhY2VmIChjb25zdCBjaGFyICosIC4uLikgR0NDX1BSSU5URkxJS0UoMSwyKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfdHJhY2VkdW1wIChjb25zdCBjaGFyICosIFdJTkRPVyAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF90cmFjZWF0dHIgKGF0dHJfdCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfdHJhY2VhdHRyMiAoaW50LCBjaHR5cGUpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX25jX3RyYWNlYml0cyAodm9pZCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfdHJhY2VjaGFyIChpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX3RyYWNlY2h0eXBlIChjaHR5cGUpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX3RyYWNlY2h0eXBlMiAoaW50LCBjaHR5cGUpOworI2lmZGVmIE5DVVJTRVNfV0lERUNIQVIKKyNkZWZpbmUgX3RyYWNlY2hfdAkJX3RyYWNlY2NoYXJfdAorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX3RyYWNlY2NoYXJfdCAoY29uc3QgY2NoYXJfdCAqKTsKKyNkZWZpbmUgX3RyYWNlY2hfdDIJCV90cmFjZWNjaGFyX3QyCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfdHJhY2VjY2hhcl90MiAoaW50LCBjb25zdCBjY2hhcl90ICopOworI2Vsc2UKKyNkZWZpbmUgX3RyYWNlY2hfdAkJX3RyYWNlY2h0eXBlCisjZGVmaW5lIF90cmFjZWNoX3QyCQlfdHJhY2VjaHR5cGUyCisjZW5kaWYKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF90cmFjZW1vdXNlIChjb25zdCBNRVZFTlQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgdHJhY2UgKGNvbnN0IHVuc2lnbmVkIGludCk7CisKKy8qIHRyYWNlIG1hc2tzICovCisjZGVmaW5lIFRSQUNFX0RJU0FCTEUJMHgwMDAwCS8qIHR1cm4gb2ZmIHRyYWNpbmcgKi8KKyNkZWZpbmUgVFJBQ0VfVElNRVMJMHgwMDAxCS8qIHRyYWNlIHVzZXIgYW5kIHN5c3RlbSB0aW1lcyBvZiB1cGRhdGVzICovCisjZGVmaW5lIFRSQUNFX1RQVVRTCTB4MDAwMgkvKiB0cmFjZSB0cHV0cyBjYWxscyAqLworI2RlZmluZSBUUkFDRV9VUERBVEUJMHgwMDA0CS8qIHRyYWNlIHVwZGF0ZSBhY3Rpb25zLCBvbGQgJiBuZXcgc2NyZWVucyAqLworI2RlZmluZSBUUkFDRV9NT1ZFCTB4MDAwOAkvKiB0cmFjZSBjdXJzb3IgbW92ZXMgYW5kIHNjcm9sbHMgKi8KKyNkZWZpbmUgVFJBQ0VfQ0hBUlBVVAkweDAwMTAJLyogdHJhY2UgYWxsIGNoYXJhY3RlciBvdXRwdXRzICovCisjZGVmaW5lIFRSQUNFX09SRElOQVJZCTB4MDAxRgkvKiB0cmFjZSBhbGwgdXBkYXRlIGFjdGlvbnMgKi8KKyNkZWZpbmUgVFJBQ0VfQ0FMTFMJMHgwMDIwCS8qIHRyYWNlIGFsbCBjdXJzZXMgY2FsbHMgKi8KKyNkZWZpbmUgVFJBQ0VfVklSVFBVVAkweDAwNDAJLyogdHJhY2UgdmlydHVhbCBjaGFyYWN0ZXIgcHV0cyAqLworI2RlZmluZSBUUkFDRV9JRVZFTlQJMHgwMDgwCS8qIHRyYWNlIGxvdy1sZXZlbCBpbnB1dCBwcm9jZXNzaW5nICovCisjZGVmaW5lIFRSQUNFX0JJVFMJMHgwMTAwCS8qIHRyYWNlIHN0YXRlIG9mIFRUWSBjb250cm9sIGJpdHMgKi8KKyNkZWZpbmUgVFJBQ0VfSUNBTExTCTB4MDIwMAkvKiB0cmFjZSBpbnRlcm5hbC9uZXN0ZWQgY2FsbHMgKi8KKyNkZWZpbmUgVFJBQ0VfQ0NBTExTCTB4MDQwMAkvKiB0cmFjZSBwZXItY2hhcmFjdGVyIGNhbGxzICovCisjZGVmaW5lIFRSQUNFX0RBVEFCQVNFCTB4MDgwMAkvKiB0cmFjZSByZWFkL3dyaXRlIG9mIHRlcm1pbmZvL3Rlcm1jYXAgZGF0YSAqLworI2RlZmluZSBUUkFDRV9BVFRSUwkweDEwMDAJLyogdHJhY2UgYXR0cmlidXRlIHVwZGF0ZXMgKi8KKworI2RlZmluZSBUUkFDRV9TSElGVAkxMwkvKiBudW1iZXIgb2YgYml0cyBpbiB0aGUgdHJhY2UgbWFza3MgKi8KKyNkZWZpbmUgVFJBQ0VfTUFYSU1VTQkoKDEgPDwgVFJBQ0VfU0hJRlQpIC0gMSkgLyogbWF4aW11bSB0cmFjZSBsZXZlbCAqLworCisjaWYgZGVmaW5lZChUUkFDRSkgfHwgZGVmaW5lZChOQ1VSU0VTX1RFU1QpCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGludCkgX25jX29wdGltaXplX2VuYWJsZTsJCS8qIGVuYWJsZSBvcHRpbWl6YXRpb25zICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgY2hhciAqKSBfbmNfdmlzYnVmIChjb25zdCBjaGFyICopOworI2RlZmluZSBPUFRJTUlaRV9NVkNVUgkJMHgwMQkvKiBjdXJzb3IgbW92ZW1lbnQgb3B0aW1pemF0aW9uICovCisjZGVmaW5lIE9QVElNSVpFX0hBU0hNQVAJMHgwMgkvKiBkaWZmIGhhc2hpbmcgdG8gZGV0ZWN0IHNjcm9sbHMgKi8KKyNkZWZpbmUgT1BUSU1JWkVfU0NST0xMCQkweDA0CS8qIHNjcm9sbCBvcHRpbWl6YXRpb24gKi8KKyNkZWZpbmUgT1BUSU1JWkVfQUxMCQkweGZmCS8qIGVuYWJsZSBhbGwgb3B0aW1pemF0aW9ucyAoZGZsdCkgKi8KKyNlbmRpZgorCisjaW5jbHVkZSA8dW5jdHJsLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisjaWZuZGVmIE5DVVJTRVNfTk9NQUNST1MKKworLyogdGhlc2UgbmFtZXMgY29uZmxpY3Qgd2l0aCBTVEwgKi8KKyN1bmRlZiBib3gKKyN1bmRlZiBjbGVhcgorI3VuZGVmIGVyYXNlCisjdW5kZWYgbW92ZQorI3VuZGVmIHJlZnJlc2gKKworI2VuZGlmIC8qIE5DVVJTRVNfTk9NQUNST1MgKi8KKworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX05DVVJTRVNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXNhcHAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzYXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5OTVkMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzYXBwLmgKQEAgLTAsMCArMSwxNzYgQEAKKy8vICogVGhpcyBtYWtlcyBlbWFjcyBoYXBweSAtKi1Nb2RlOiBDKys7LSotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMsMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBBdXRob3I6IEp1ZXJnZW4gUGZlaWZlciwgMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyAkSWQ6IGN1cnNlc2FwcC5oLHYgMS4xMSAyMDA1LzA1LzI4IDIxOjU3OjQ0IHRvbSBFeHAgJAorCisjaWZuZGVmIE5DVVJTRVNfQ1VSU0VTQVBQX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX0NVUlNFU0FQUF9IX2luY2wKKworI2luY2x1ZGUgPGN1cnNzbGsuaD4KKworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc0FwcGxpY2F0aW9uIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdHJ1Y3QgX3Nsa19saW5rIHsgICAgICAgICAgLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYWludGFpbgorICAgIHN0cnVjdCBfc2xrX2xpbmsqIHByZXY7ICAgICAgICAgICAvLyBhIHN0YWNrIG9mIFNMS3MKKyAgICBTb2Z0X0xhYmVsX0tleV9TZXQqIFNMS3M7CisgIH0gU0xLX0xpbms7Citwcml2YXRlOgorICBzdGF0aWMgaW50IHJpbml0KE5DdXJzZXNXaW5kb3cmIHcpOyAvLyBJbnRlcm5hbCBJbml0IGZ1bmN0aW9uIGZvciB0aXRsZQorICBzdGF0aWMgTkN1cnNlc0FwcGxpY2F0aW9uKiB0aGVBcHA7ICAvLyBHbG9iYWwgcmVmLiB0byB0aGUgYXBwbGljYXRpb24KKworICBzdGF0aWMgU0xLX0xpbmsqIHNsa19zdGFjazsKKworcHJvdGVjdGVkOgorICBzdGF0aWMgTkN1cnNlc1dpbmRvdyogdGl0bGVXaW5kb3c7ICAvLyBUaGUgVGl0bGUgV2luZG93IChpZiBhbnkpCisKKyAgYm9vbCBiX0NvbG9yczsgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhpcyBhIGNvbG9yIGFwcGxpY2F0aW9uPworICBOQ3Vyc2VzV2luZG93KiBSb290X1dpbmRvdzsgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzdGRzY3IgZXF1aXYuCisKKyAgLy8gSW5pdGlhbGl6YXRpb24gb2YgYXR0cmlidXRlczsKKyAgLy8gUmV3cml0ZSB0aGlzIGluIHlvdXIgZGVyaXZlZCBjbGFzcyBpZiB5b3UgcHJlZmVyIG90aGVyIHNldHRpbmdzCisgIHZpcnR1YWwgdm9pZCBpbml0KGJvb2wgYkNvbG9ycyk7CisKKyAgLy8gVGhlIG51bWJlciBvZiBsaW5lcyBmb3IgdGhlIHRpdGxlIHdpbmRvdy4gRGVmYXVsdCBpcyBubyB0aXRsZSB3aW5kb3cKKyAgLy8gWW91IG1heSByZXdyaXRlIHRoaXMgaW4geW91ciBkZXJpdmVkIGNsYXNzCisgIHZpcnR1YWwgaW50IHRpdGxlc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBwdXQgc29tZXRoaW5nIGludG8gdGhlIHRpdGxlIHdpbmRvdyBpbml0aWFsbHkKKyAgLy8gWW91IG1heSByZXdyaXRlIHRoaXMgaW4geW91ciBkZXJpdmVkIGNsYXNzCisgIHZpcnR1YWwgdm9pZCB0aXRsZSgpIHsKKyAgfQorCisgIC8vIFRoZSBsYXlvdXQgdXNlZCBmb3IgdGhlIFNvZnQgTGFiZWwgS2V5cy4gRGVmYXVsdCBpcyB0byBoYXZlIG5vIFNMS3MuCisgIC8vIFlvdSBtYXkgcmV3cml0ZSB0aGlzIGluIHlvdXIgZGVyaXZlZCBjbGFzcworICB2aXJ0dWFsIFNvZnRfTGFiZWxfS2V5X1NldDo6TGFiZWxfTGF5b3V0IHVzZVNMS3MoKSBjb25zdCB7CisgICAgcmV0dXJuIFNvZnRfTGFiZWxfS2V5X1NldDo6Tm9uZTsKKyAgfQorCisgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBTTEtzLiBEZWZhdWx0IGlzIG5vdGhpbmcuCisgIC8vIFlvdSBtYXkgcmV3cml0ZSB0aGlzIGluIHlvdXIgZGVyaXZlZCBjbGFzcworICB2aXJ0dWFsIHZvaWQgaW5pdF9sYWJlbHMoU29mdF9MYWJlbF9LZXlfU2V0JiBTKSBjb25zdCB7CisgIH0KKworICAvLyBZb3VyIGRlcml2ZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuIFRoZSByZXR1cm4gdmFsdWUgbXVzdAorICAvLyBiZSB0aGUgZXhpdCB2YWx1ZSBvZiB5b3VyIGFwcGxpY2F0aW9uLgorICB2aXJ0dWFsIGludCBydW4oKSA9IDA7CisKKyAgLy8gVGhlIGNvbnN0cnVjdG9yIGlzIHByb3RlY3RlZCwgc28geW91IG1heSB1c2UgaXQgaW4geW91ciBkZXJpdmVkCisgIC8vIGNsYXNzIGNvbnN0cnVjdG9yLiBUaGUgYXJndW1lbnQgdGVsbHMgd2hldGhlciBvciBub3QgeW91IHdhbnQgY29sb3JzLgorICBOQ3Vyc2VzQXBwbGljYXRpb24oYm9vbCB3YW50Q29sb3JzID0gRkFMU0UpOworCisgIE5DdXJzZXNBcHBsaWNhdGlvbiYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNBcHBsaWNhdGlvbiYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNBcHBsaWNhdGlvbihjb25zdCBOQ3Vyc2VzQXBwbGljYXRpb24mIHJocykKKyAgICA6IGJfQ29sb3JzKHJocy5iX0NvbG9ycyksCisgICAgICBSb290X1dpbmRvdyhyaHMuUm9vdF9XaW5kb3cpCisgIHsKKyAgfQorCitwdWJsaWM6CisgIHZpcnR1YWwgfk5DdXJzZXNBcHBsaWNhdGlvbigpOworCisgIC8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gb2JqZWN0CisgIHN0YXRpYyBOQ3Vyc2VzQXBwbGljYXRpb24qIGdldEFwcGxpY2F0aW9uKCkgeworICAgIHJldHVybiB0aGVBcHA7CisgIH0KKworICAvLyBUaGlzIG1ldGhvZCBydW5zIHRoZSBhcHBsaWNhdGlvbiBhbmQgcmV0dXJucyBpdHMgZXhpdCB2YWx1ZQorICBpbnQgb3BlcmF0b3IoKSh2b2lkKTsKKworICAvLyBQcm9jZXNzIHRoZSBjb21tYW5kbGluZSBhcmd1bWVudHMuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseQorICAvLyBpZ25vcmVzIHRoZW0uIFlvdXIgZGVyaXZlZCBjbGFzcyBtYXkgcmV3cml0ZSB0aGlzLgorICB2aXJ0dWFsIHZvaWQgaGFuZGxlQXJncyhpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIH0KKworICAvLyBEb2VzIHRoaXMgYXBwbGljYXRpb24gdXNlIGNvbG9ycz8KKyAgaW5saW5lIGJvb2wgdXNlQ29sb3JzKCkgY29uc3QgeworICAgIHJldHVybiBiX0NvbG9yczsKKyAgfQorCisgIC8vIFB1c2ggdGhlIEtleSBTZXQgUyBvbnRvIHRoZSBTTEsgU3RhY2suIFMgdGhlbiBiZWNvbWVzIHRoZSBjdXJyZW50IHNldAorICAvLyBvZiBTb2Z0IExhYmVsbGVkIEtleXMuCisgIHZvaWQgcHVzaChTb2Z0X0xhYmVsX0tleV9TZXQmIFMpOworCisgIC8vIFRocm93IGF3YXkgdGhlIGN1cnJlbnQgc2V0IG9mIFNMS3MgYW5kIG1ha2UgdGhlIHByZXZpb3VzIG9uZSB0aGUKKyAgLy8gbmV3IGN1cnJlbnQgc2V0LgorICBib29sIHBvcCgpOworCisgIC8vIFJldHJpZXZlIHRoZSBjdXJyZW50IHNldCBvZiBTb2Z0IExhYmVsbGVkIEtleXMuCisgIFNvZnRfTGFiZWxfS2V5X1NldCogdG9wKCkgY29uc3Q7CisKKyAgLy8gQXR0cmlidXRlcyB0byB1c2UgZm9yIG1lbnUgYW5kIGZvcm1zIGZvcmVncm91bmRzCisgIHZpcnR1YWwgY2h0eXBlIGZvcmVncm91bmRzKCkgY29uc3QgeworICAgIHJldHVybiBiX0NvbG9ycyA/IENPTE9SX1BBSVIoMSkgOiBBX0JPTEQ7CisgIH0KKworICAvLyBBdHRyaWJ1dGVzIHRvIHVzZSBmb3IgbWVudSBhbmQgZm9ybXMgYmFja2dyb3VuZHMKKyAgdmlydHVhbCBjaHR5cGUgYmFja2dyb3VuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJfQ29sb3JzID8gQ09MT1JfUEFJUigyKSA6IEFfTk9STUFMOworICB9CisKKyAgLy8gQXR0cmlidXRlcyB0byB1c2UgZm9yIGluYWN0aXZlIChtZW51KSBlbGVtZW50cworICB2aXJ0dWFsIGNodHlwZSBpbmFjdGl2ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJfQ29sb3JzID8gKENPTE9SX1BBSVIoMyl8QV9ESU0pIDogQV9ESU07CisgIH0KKworICAvLyBBdHRyaWJ1dGVzIHRvIHVzZSBmb3IgKGZvcm0pIGxhYmVscyBhbmQgU0xLcworICB2aXJ0dWFsIGNodHlwZSBsYWJlbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJfQ29sb3JzID8gQ09MT1JfUEFJUig0KSA6IEFfTk9STUFMOworICB9CisKKyAgLy8gQXR0cmlidXRlcyB0byB1c2UgZm9yIGZvcm0gYmFja2dyb3VuZHMKKyAgdmlydHVhbCBjaHR5cGUgZGlhbG9nX2JhY2tncm91bmRzKCkgY29uc3QgeworICAgIHJldHVybiBiX0NvbG9ycyA/IENPTE9SX1BBSVIoNCkgOiBBX05PUk1BTDsKKyAgfQorCisgIC8vIEF0dHJpYnV0ZXMgdG8gdXNlIGFzIGRlZmF1bHQgZm9yIChmb3JtKSB3aW5kb3cgYmFja2dyb3VuZHMKKyAgdmlydHVhbCBjaHR5cGUgd2luZG93X2JhY2tncm91bmRzKCkgY29uc3QgeworICAgIHJldHVybiBiX0NvbG9ycyA/IENPTE9SX1BBSVIoNSkgOiBBX05PUk1BTDsKKyAgfQorCisgIC8vIEF0dHJpYnV0ZXMgdG8gdXNlIGZvciB0aGUgdGl0bGUgd2luZG93CisgIHZpcnR1YWwgY2h0eXBlIHNjcmVlbl90aXRsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJfQ29sb3JzID8gQ09MT1JfUEFJUig2KSA6IEFfQk9MRDsKKyAgfQorCit9OworIAorI2VuZGlmIC8qIE5DVVJTRVNfQ1VSU0VTQVBQX0hfaW5jbCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXNmLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlc2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGEzMGMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXNmLmgKQEAgLTAsMCArMSw5NjcgQEAKKy8vICogVGhpcyBtYWtlcyBlbWFjcyBoYXBweSAtKi1Nb2RlOiBDKys7LSotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDQsMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBBdXRob3I6IEp1ZXJnZW4gUGZlaWZlciwgMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyAkSWQ6IGN1cnNlc2YuaCx2IDEuMjggMjAwNS8wOC8xMyAxODowODoyNCB0b20gRXhwICQKKworI2lmbmRlZiBOQ1VSU0VTX0NVUlNFU0ZfSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfQ1VSU0VTRl9IX2luY2wgMQorCisjaW5jbHVkZSA8Y3Vyc2VzcC5oPgorCisjaWZuZGVmIF9fRVhUX1FOWAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKK2V4dGVybiAiQyIgeworIyAgaW5jbHVkZSA8Zm9ybS5oPgorfQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBidWl0aW4gYW5kIHVzZXIgZGVmaW5lZCBGaWVsZHR5cGVzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNGb3JtRmllbGQ7IC8vIGZvcndhcmQgZGVjbGFyYXRpb24KKworLy8gQ2xhc3MgdG8gcmVwcmVzZW50IGJ1aWx0aW4gZmllbGQgdHlwZXMgYXMgd2VsbCBhcyBDKysgd3JpdHRlbiBuZXcKKy8vIGZpZWxkdHlwZXMgKHNlZSBjbGFzc2VzIFVzZXJEZWZpbmVGaWVsZFR5cGUuLi4KK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNGaWVsZFR5cGUKK3sKKyAgZnJpZW5kIGNsYXNzIE5DdXJzZXNGb3JtRmllbGQ7CisKK3Byb3RlY3RlZDoKKyAgRklFTERUWVBFKiBmaWVsZHR5cGU7CisKKyAgaW5saW5lIHZvaWQgT25FcnJvcihpbnQgZXJyKSBjb25zdCBUSFJPV1MoTkN1cnNlc0Zvcm1FeGNlcHRpb24pIHsKKyAgICBpZiAoZXJyIT1FX09LKQorICAgICAgVEhST1cobmV3IE5DdXJzZXNGb3JtRXhjZXB0aW9uIChlcnIpKTsKKyAgfQorCisgIE5DdXJzZXNGaWVsZFR5cGUoRklFTERUWVBFICpmKSA6IGZpZWxkdHlwZShmKSB7CisgIH0KKworICB2aXJ0dWFsIH5OQ3Vyc2VzRmllbGRUeXBlKCkge30KKworICAvLyBTZXQgdGhlIGZpZWxkcyBmIGZpZWxkdHlwZSB0byB0aGlzIG9uZS4KKyAgdmlydHVhbCB2b2lkIHNldChOQ3Vyc2VzRm9ybUZpZWxkJiBmKSA9IDA7CisKK3B1YmxpYzoKKyAgTkN1cnNlc0ZpZWxkVHlwZSgpCisgICAgOiBmaWVsZHR5cGUoU1RBVElDX0NBU1QoRklFTERUWVBFKikoMCkpCisgIHsKKyAgfQorCisgIE5DdXJzZXNGaWVsZFR5cGUmIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzRmllbGRUeXBlJiByaHMpCisgIHsKKyAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTkN1cnNlc0ZpZWxkVHlwZShjb25zdCBOQ3Vyc2VzRmllbGRUeXBlJiByaHMpCisgICAgOiBmaWVsZHR5cGUocmhzLmZpZWxkdHlwZSkKKyAgeworICB9CisKK307CisKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgY2xhc3MgcmVwcmVzZW50aW5nIGEgZm9ybXMgZmllbGQsIHdyYXBwaW5nIHRoZSBsb3dsZXZlbCBGSUVMRCBzdHJ1Y3QKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzRm9ybUZpZWxkCit7CisgIGZyaWVuZCBjbGFzcyBOQ3Vyc2VzRm9ybTsKKworcHJvdGVjdGVkOgorICBGSUVMRCAqZmllbGQ7CQkgICAgIC8vIGxvd2xldmVsIHN0cnVjdHVyZQorICBOQ3Vyc2VzRmllbGRUeXBlKiBmdHlwZTsgICAvLyBBc3NvY2lhdGVkIGZpZWxkIHR5cGUKKworICAvLyBFcnJvciBoYW5kbGVyCisgIGlubGluZSB2b2lkIE9uRXJyb3IgKGludCBlcnIpIGNvbnN0IFRIUk9XUyhOQ3Vyc2VzRm9ybUV4Y2VwdGlvbikgeworICAgIGlmIChlcnIgIT0gRV9PSykKKyAgICAgIFRIUk9XKG5ldyBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbiAoZXJyKSk7CisgIH0KKworcHVibGljOgorICAvLyBDcmVhdGUgYSAnTnVsbCcgZmllbGQuIENhbiBiZSB1c2VkIHRvIGRlbGltaXQgYSBmaWVsZCBsaXN0CisgIE5DdXJzZXNGb3JtRmllbGQoKQorICAgIDogZmllbGQoU1RBVElDX0NBU1QoRklFTEQqKSgwKSksCisgICAgICBmdHlwZShTVEFUSUNfQ0FTVChOQ3Vyc2VzRmllbGRUeXBlKikoMCkpCisgIHsKKyAgfQorCisgIC8vIENyZWF0ZSBhIG5ldyBmaWVsZAorICBOQ3Vyc2VzRm9ybUZpZWxkIChpbnQgcm93cywKKwkJICAgIGludCBuY29scywKKwkJICAgIGludCBmaXJzdF9yb3cgPSAwLAorCQkgICAgaW50IGZpcnN0X2NvbCA9IDAsCisJCSAgICBpbnQgb2Zmc2NyZWVuX3Jvd3MgPSAwLAorCQkgICAgaW50IGFkZGl0aW9uYWxfYnVmZmVycyA9IDApCisgICAgOiBmaWVsZCgwKSwKKyAgICAgIGZ0eXBlKFNUQVRJQ19DQVNUKE5DdXJzZXNGaWVsZFR5cGUqKSgwKSkKKyAgeworICAgICAgZmllbGQgPSA6Om5ld19maWVsZChyb3dzLCBuY29scywgZmlyc3Rfcm93LCBmaXJzdF9jb2wsCisJCQkgIG9mZnNjcmVlbl9yb3dzLCBhZGRpdGlvbmFsX2J1ZmZlcnMpOworICAgICAgaWYgKCFmaWVsZCkKKwlPbkVycm9yKGVycm5vKTsKKyAgfQorCisgIE5DdXJzZXNGb3JtRmllbGQmIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzRm9ybUZpZWxkJiByaHMpCisgIHsKKyAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTkN1cnNlc0Zvcm1GaWVsZChjb25zdCBOQ3Vyc2VzRm9ybUZpZWxkJiByaHMpCisgICAgOiBmaWVsZChyaHMuZmllbGQpLCBmdHlwZShyaHMuZnR5cGUpCisgIHsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNGb3JtRmllbGQgKCk7CisKKyAgLy8gRHVwbGljYXRlIHRoZSBmaWVsZCBhdCBhIG5ldyBwb3NpdGlvbgorICBpbmxpbmUgTkN1cnNlc0Zvcm1GaWVsZCogZHVwKGludCBmaXJzdF9yb3csIGludCBmaXJzdF9jb2wpCisgIHsKKyAgICBOQ3Vyc2VzRm9ybUZpZWxkKiBmID0gbmV3IE5DdXJzZXNGb3JtRmllbGQoKTsKKyAgICBpZiAoIWYpCisgICAgICBPbkVycm9yKEVfU1lTVEVNX0VSUk9SKTsKKyAgICBlbHNlIHsKKyAgICAgIGYtPmZ0eXBlID0gZnR5cGU7CisgICAgICBmLT5maWVsZCA9IDo6ZHVwX2ZpZWxkKGZpZWxkLGZpcnN0X3JvdyxmaXJzdF9jb2wpOworICAgICAgaWYgKCFmLT5maWVsZCkKKwlPbkVycm9yKGVycm5vKTsKKyAgICB9CisgICAgcmV0dXJuIGY7CisgIH0KKworICAvLyBMaW5rIHRoZSBmaWVsZCB0byBhIG5ldyBsb2NhdGlvbgorICBpbmxpbmUgTkN1cnNlc0Zvcm1GaWVsZCogbGluayhpbnQgZmlyc3Rfcm93LCBpbnQgZmlyc3RfY29sKSB7CisgICAgTkN1cnNlc0Zvcm1GaWVsZCogZiA9IG5ldyBOQ3Vyc2VzRm9ybUZpZWxkKCk7CisgICAgaWYgKCFmKQorICAgICAgT25FcnJvcihFX1NZU1RFTV9FUlJPUik7CisgICAgZWxzZSB7CisgICAgICBmLT5mdHlwZSA9IGZ0eXBlOworICAgICAgZi0+ZmllbGQgPSA6OmxpbmtfZmllbGQoZmllbGQsZmlyc3Rfcm93LGZpcnN0X2NvbCk7CisgICAgICBpZiAoIWYtPmZpZWxkKQorCU9uRXJyb3IoZXJybm8pOworICAgIH0KKyAgICByZXR1cm4gZjsKKyAgfQorCisgIC8vIEdldCB0aGUgbG93bGV2ZWwgZmllbGQgcmVwcmVzZW50YXRpb24KKyAgaW5saW5lIEZJRUxEKiBnZXRfZmllbGQoKSBjb25zdCB7CisgICAgcmV0dXJuIGZpZWxkOworICB9CisKKyAgLy8gUmV0cmlldmUgaW5mbyBhYm91dCB0aGUgZmllbGQKKyAgaW5saW5lIHZvaWQgaW5mbyhpbnQmIHJvd3MsIGludCYgbmNvbHMsCisJCSAgIGludCYgZmlyc3Rfcm93LCBpbnQmIGZpcnN0X2NvbCwKKwkJICAgaW50JiBvZmZzY3JlZW5fcm93cywgaW50JiBhZGRpdGlvbmFsX2J1ZmZlcnMpIGNvbnN0IHsKKyAgICBPbkVycm9yKDo6ZmllbGRfaW5mbyhmaWVsZCwgJnJvd3MsICZuY29scywKKwkJCSAmZmlyc3Rfcm93LCAmZmlyc3RfY29sLAorCQkJICZvZmZzY3JlZW5fcm93cywgJmFkZGl0aW9uYWxfYnVmZmVycykpOworICB9CisKKyAgLy8gUmV0cmlldmUgaW5mbyBhYm91dCB0aGUgZmllbGRzIGR5bmFtaWMgcHJvcGVydGllcy4KKyAgaW5saW5lIHZvaWQgZHluYW1pY19pbmZvKGludCYgZHluYW1pY19yb3dzLCBpbnQmIGR5bmFtaWNfY29scywKKwkJCSAgIGludCYgbWF4X2dyb3d0aCkgY29uc3QgeworICAgIE9uRXJyb3IoOjpkeW5hbWljX2ZpZWxkX2luZm8oZmllbGQsICZkeW5hbWljX3Jvd3MsICZkeW5hbWljX2NvbHMsCisJCQkJICZtYXhfZ3Jvd3RoKSk7CisgIH0KKworICAvLyBGb3IgYSBkeW5hbWljIGZpZWxkIHlvdSBtYXkgc2V0IHRoZSBtYXhpbXVtIGdyb3d0aCBsaW1pdC4KKyAgLy8gQSB6ZXJvIG1lYW5zIHVubGltaXRlZCBncm93dGguCisgIGlubGluZSB2b2lkIHNldF9tYXhpbXVtX2dyb3d0aChpbnQgZ3Jvd3RoID0gMCkgeworICAgIE9uRXJyb3IoOjpzZXRfbWF4X2ZpZWxkKGZpZWxkLGdyb3d0aCkpOworICB9CisKKyAgLy8gTW92ZSB0aGUgZmllbGQgdG8gYSBuZXcgcG9zaXRpb24KKyAgaW5saW5lIHZvaWQgbW92ZShpbnQgcm93LCBpbnQgY29sKSB7CisgICAgT25FcnJvcig6Om1vdmVfZmllbGQoZmllbGQscm93LGNvbCkpOworICB9CisKKyAgLy8gTWFyayB0aGUgZmllbGQgdG8gc3RhcnQgYSBuZXcgcGFnZQorICBpbmxpbmUgdm9pZCBuZXdfcGFnZShib29sIHBhZ2VGbGFnID0gRkFMU0UpIHsKKyAgICBPbkVycm9yKDo6c2V0X25ld19wYWdlKGZpZWxkLHBhZ2VGbGFnKSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSB3aGV0aGVyIG9yIG5vdCB0aGUgZmllbGQgc3RhcnRzIGEgbmV3IHBhZ2UuCisgIGlubGluZSBib29sIGlzX25ld19wYWdlKCkgY29uc3QgeworICAgIHJldHVybiA6Om5ld19wYWdlKGZpZWxkKTsKKyAgfQorCisgIC8vIFNldCB0aGUganVzdGlmaWNhdGlvbiBmb3IgdGhlIGZpZWxkCisgIGlubGluZSB2b2lkIHNldF9qdXN0aWZpY2F0aW9uKGludCBqdXN0KSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF9qdXN0KGZpZWxkLGp1c3QpKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIHRoZSBmaWVsZHMganVzdGlmaWNhdGlvbgorICBpbmxpbmUgaW50IGp1c3RpZmljYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZmllbGRfanVzdChmaWVsZCk7CisgIH0KKyAgLy8gU2V0IHRoZSBmb3JlZ3JvdW5kIGF0dHJpYnV0ZSBmb3IgdGhlIGZpZWxkCisgIGlubGluZSB2b2lkIHNldF9mb3JlZ3JvdW5kKGNodHlwZSBmb3JlZ3JvdW5kKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF9mb3JlKGZpZWxkLGZvcmVncm91bmQpKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIHRoZSBmaWVsZHMgZm9yZWdyb3VuZCBhdHRyaWJ1dGUKKyAgaW5saW5lIGNodHlwZSBmb3JlKCkgY29uc3QgeworICAgIHJldHVybiA6OmZpZWxkX2ZvcmUoZmllbGQpOworICB9CisKKyAgLy8gU2V0IHRoZSBiYWNrZ3JvdW5kIGF0dHJpYnV0ZSBmb3IgdGhlIGZpZWxkCisgIGlubGluZSB2b2lkIHNldF9iYWNrZ3JvdW5kKGNodHlwZSBiYWNrZ3JvdW5kKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF9iYWNrKGZpZWxkLGJhY2tncm91bmQpKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIHRoZSBmaWVsZHMgYmFja2dyb3VuZCBhdHRyaWJ1dGUKKyAgaW5saW5lIGNodHlwZSBiYWNrKCkgY29uc3QgeworICAgIHJldHVybiA6OmZpZWxkX2JhY2soZmllbGQpOworICB9CisKKyAgLy8gU2V0IHRoZSBwYWRkaW5nIGNoYXJhY3RlciBmb3IgdGhlIGZpZWxkCisgIGlubGluZSB2b2lkIHNldF9wYWRfY2hhcmFjdGVyKGludCBwYWRkaW5nKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF9wYWQoZmllbGQsIHBhZGRpbmcpKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIHRoZSBmaWVsZHMgcGFkZGluZyBjaGFyYWN0ZXIKKyAgaW5saW5lIGludCBwYWQoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZmllbGRfcGFkKGZpZWxkKTsKKyAgfQorCisgIC8vIFN3aXRjaCBvbiB0aGUgZmllbGRzIG9wdGlvbnMKKyAgaW5saW5lIHZvaWQgb3B0aW9uc19vbiAoRmllbGRfT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjpmaWVsZF9vcHRzX29uIChmaWVsZCwgb3B0cykpOworICB9CisKKyAgLy8gU3dpdGNoIG9mZiB0aGUgZmllbGRzIG9wdGlvbnMKKyAgaW5saW5lIHZvaWQgb3B0aW9uc19vZmYgKEZpZWxkX09wdGlvbnMgb3B0cykgeworICAgIE9uRXJyb3IgKDo6ZmllbGRfb3B0c19vZmYgKGZpZWxkLCBvcHRzKSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSB0aGUgZmllbGRzIG9wdGlvbnMKKyAgaW5saW5lIEZpZWxkX09wdGlvbnMgb3B0aW9ucyAoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZmllbGRfb3B0cyAoZmllbGQpOworICB9CisKKyAgLy8gU2V0IHRoZSBmaWVsZHMgb3B0aW9ucworICBpbmxpbmUgdm9pZCBzZXRfb3B0aW9ucyAoRmllbGRfT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjpzZXRfZmllbGRfb3B0cyAoZmllbGQsIG9wdHMpKTsKKyAgfQorCisgIC8vIE1hcmsgdGhlIGZpZWxkIGFzIGNoYW5nZWQKKyAgaW5saW5lIHZvaWQgc2V0X2NoYW5nZWQoYm9vbCBjaGFuZ2VGbGFnID0gVFJVRSkgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfc3RhdHVzKGZpZWxkLGNoYW5nZUZsYWcpKTsKKyAgfQorCisgIC8vIFRlc3Qgd2hldGhlciBvciBub3QgdGhlIGZpZWxkIGlzIG1hcmtlZCBhcyBjaGFuZ2VkCisgIGlubGluZSBib29sIGNoYW5nZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZmllbGRfc3RhdHVzKGZpZWxkKTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpZWxkIGluIHRoZSBmaWVsZCBhcnJheSBvZiBhIGZvcm0KKyAgLy8gb3IgLTEgaWYgdGhlIGZpZWxkIGlzIG5vdCBhc3NvY2lhdGVkIHRvIGEgZm9ybQorICBpbmxpbmUgaW50IChpbmRleCkoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZmllbGRfaW5kZXgoZmllbGQpOworICB9CisKKyAgLy8gU3RvcmUgYSB2YWx1ZSBpbiBhIGZpZWxkcyBidWZmZXIuIFRoZSBkZWZhdWx0IGJ1ZmZlciBpcyBuci4gMAorICBpbmxpbmUgdm9pZCBzZXRfdmFsdWUoY29uc3QgY2hhciAqdmFsLCBpbnQgYnVmZmVyID0gMCkgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfYnVmZmVyKGZpZWxkLGJ1ZmZlcix2YWwpKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhIGZpZWxkcyBidWZmZXIuIFRoZSBkZWZhdWx0IGJ1ZmZlciBpcyBuci4gMAorICBpbmxpbmUgY2hhciogdmFsdWUoaW50IGJ1ZmZlciA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gOjpmaWVsZF9idWZmZXIoZmllbGQsYnVmZmVyKTsKKyAgfQorCisgIC8vIFNldCB0aGUgdmFsaWRhdGlvbiB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgaW5saW5lIHZvaWQgc2V0X2ZpZWxkdHlwZShOQ3Vyc2VzRmllbGRUeXBlJiBmKSB7CisgICAgZnR5cGUgPSAmZjsKKyAgICBmLnNldCgqdGhpcyk7IC8vIEEgZ29vZCBmcmllbmQgbWF5IGRvIHRoYXQuLi4KKyAgfQorCisgIC8vIFJldHJpZXZlIHRoZSB2YWxpZGF0aW9uIHR5cGUgb2YgdGhlIGZpZWxkLgorICBpbmxpbmUgTkN1cnNlc0ZpZWxkVHlwZSogZmllbGR0eXBlKCkgY29uc3QgeworICAgIHJldHVybiBmdHlwZTsKKyAgfQorCit9OworCisgIC8vIFRoaXMgYXJlIHRoZSBidWlsdC1pbiBob29rIGZ1bmN0aW9ucyBpbiB0aGlzIEMrKyBiaW5kaW5nLiBJbiBDKysgd2UgdXNlCisgIC8vIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9ucyAoc2VlIGJlbG93IE9uXy4uLl9Jbml0IGFuZCBPbl8uLi5fVGVybWluYXRpb24pCisgIC8vIHRvIHByb3ZpZGUgdGhpcyBmdW5jdGlvbmFsaXR5IGluIGFuIG9iamVjdCBvcmllbnRlZCBtYW5uZXIuCitleHRlcm4gIkMiIHsKKyAgdm9pZCBfbmNfeHhfZnJtX2luaXQoRk9STSAqKTsKKyAgdm9pZCBfbmNfeHhfZnJtX3Rlcm0oRk9STSAqKTsKKyAgdm9pZCBfbmNfeHhfZmxkX2luaXQoRk9STSAqKTsKKyAgdm9pZCBfbmNfeHhfZmxkX3Rlcm0oRk9STSAqKTsKK30KKworLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBjbGFzcyByZXByZXNlbnRpbmcgYSBmb3JtLCB3cmFwcGluZyB0aGUgbG93bGV2ZWwgRk9STSBzdHJ1Y3QKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzRm9ybSA6IHB1YmxpYyBOQ3Vyc2VzUGFuZWwKK3sKK3Byb3RlY3RlZDoKKyAgRk9STSogZm9ybTsgIC8vIHRoZSBsb3dsZXZlbCBzdHJ1Y3R1cmUKKworcHJpdmF0ZToKKyAgTkN1cnNlc1dpbmRvdyogc3ViOyAgIC8vIHRoZSBzdWJ3aW5kb3cgb2JqZWN0CisgIGJvb2wgYl9zdWJfb3duZXI7ICAgICAvLyBpcyB0aGlzIG91ciBvd24gc3Vid2luZG93PworICBib29sIGJfZnJhbWVkOwkvLyBoYXMgdGhlIGZvcm0gYSBib3JkZXI/CisgIGJvb2wgYl9hdXRvRGVsZXRlOyAgICAvLyBEZWxldGUgZmllbGRzIHdoZW4gZGVsZXRpbmcgZm9ybT8KKworICBOQ3Vyc2VzRm9ybUZpZWxkKiogbXlfZmllbGRzOyAvLyBUaGUgYXJyYXkgb2YgZmllbGRzIGZvciB0aGlzIGZvcm0KKworICAvLyBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciB0aGUgZm9ybSdzIHVzZXIgZGF0YSBmaWVsZCB0byBsaW5rIHRoZQorICAvLyBGT1JNKiB0byB0aGUgQysrIG9iamVjdCBhbmQgdG8gcHJvdmlkZSBleHRyYSBzcGFjZSBmb3IgYSB1c2VyIHBvaW50ZXIuCisgIHR5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkKgkgICAgICAgbV91c2VyOwkgICAgLy8gdGhlIHBvaW50ZXIgZm9yIHRoZSB1c2VyJ3MgZGF0YQorICAgIGNvbnN0IE5DdXJzZXNGb3JtKiBtX2JhY2s7ICAgICAgLy8gYmFja3dhcmQgcG9pbnRlciB0byBDKysgb2JqZWN0CisgICAgY29uc3QgRk9STSoJICAgICAgIG1fb3duZXI7CisgIH0gVXNlckhvb2s7CisKKyAgLy8gR2V0IHRoZSBiYWNrd2FyZCBwb2ludGVyIHRvIHRoZSBDKysgb2JqZWN0IGZyb20gYSBGT1JNCisgIHN0YXRpYyBpbmxpbmUgTkN1cnNlc0Zvcm0qIGdldEhvb2soY29uc3QgRk9STSAqZikgeworICAgIFVzZXJIb29rKiBob29rID0gcmVpbnRlcnByZXRfY2FzdDxVc2VySG9vayo+KDo6Zm9ybV91c2VycHRyKGYpKTsKKyAgICBhc3NlcnQoaG9vayAhPSAwICYmIGhvb2stPm1fb3duZXI9PWYpOworICAgIHJldHVybiBjb25zdF9jYXN0PE5DdXJzZXNGb3JtKj4oaG9vay0+bV9iYWNrKTsKKyAgfQorCisgIGZyaWVuZCB2b2lkIF9uY194eF9mcm1faW5pdChGT1JNICopOworICBmcmllbmQgdm9pZCBfbmNfeHhfZnJtX3Rlcm0oRk9STSAqKTsKKyAgZnJpZW5kIHZvaWQgX25jX3h4X2ZsZF9pbml0KEZPUk0gKik7CisgIGZyaWVuZCB2b2lkIF9uY194eF9mbGRfdGVybShGT1JNICopOworCisgIC8vIENhbGN1bGF0ZSBGSUVMRCogYXJyYXkgZm9yIHRoZSBtZW51CisgIEZJRUxEKiogbWFwRmllbGRzKE5DdXJzZXNGb3JtRmllbGQqIG5maWVsZHNbXSk7CisKK3Byb3RlY3RlZDoKKyAgLy8gaW50ZXJuYWwgcm91dGluZXMKKyAgaW5saW5lIHZvaWQgc2V0X3VzZXIodm9pZCAqdXNlcikgeworICAgIFVzZXJIb29rKiB1cHRyID0gcmVpbnRlcnByZXRfY2FzdDxVc2VySG9vayo+KDo6Zm9ybV91c2VycHRyIChmb3JtKSk7CisgICAgYXNzZXJ0ICh1cHRyICE9IDAgJiYgdXB0ci0+bV9iYWNrPT10aGlzICYmIHVwdHItPm1fb3duZXI9PWZvcm0pOworICAgIHVwdHItPm1fdXNlciA9IHVzZXI7CisgIH0KKworICBpbmxpbmUgdm9pZCAqZ2V0X3VzZXIoKSB7CisgICAgVXNlckhvb2sqIHVwdHIgPSByZWludGVycHJldF9jYXN0PFVzZXJIb29rKj4oOjpmb3JtX3VzZXJwdHIgKGZvcm0pKTsKKyAgICBhc3NlcnQgKHVwdHIgIT0gMCAmJiB1cHRyLT5tX2JhY2s9PXRoaXMgJiYgdXB0ci0+bV9vd25lcj09Zm9ybSk7CisgICAgcmV0dXJuIHVwdHItPm1fdXNlcjsKKyAgfQorCisgIHZvaWQgSW5pdEZvcm0gKE5DdXJzZXNGb3JtRmllbGQqIEZpZWxkc1tdLAorCQkgYm9vbCB3aXRoX2ZyYW1lLAorCQkgYm9vbCBhdXRvRGVsZXRlRmllbGRzKTsKKworICBpbmxpbmUgdm9pZCBPbkVycm9yIChpbnQgZXJyKSBjb25zdCBUSFJPV1MoTkN1cnNlc0Zvcm1FeGNlcHRpb24pIHsKKyAgICBpZiAoZXJyICE9IEVfT0spCisgICAgICBUSFJPVyhuZXcgTkN1cnNlc0Zvcm1FeGNlcHRpb24gKGVycikpOworICB9CisKKyAgLy8gdGhpcyB3cmFwcyB0aGUgZm9ybV9kcml2ZXIgY2FsbC4KKyAgdmlydHVhbCBpbnQgZHJpdmVyIChpbnQgYykgOworCisgIC8vICdJbnRlcm5hbCcgY29uc3RydWN0b3IsIGJ1aWxkcyBhbiBvYmplY3Qgd2l0aG91dCBhc3NvY2lhdGlvbiB0byBhCisgIC8vIGZpZWxkIGFycmF5LgorICBOQ3Vyc2VzRm9ybSggaW50ICBubGluZXMsCisJICAgICAgIGludCAgbmNvbHMsCisJICAgICAgIGludCAgYmVnaW5feSA9IDAsCisJICAgICAgIGludCAgYmVnaW5feCA9IDApCisgICAgOiBOQ3Vyc2VzUGFuZWwobmxpbmVzLCBuY29scywgYmVnaW5feSwgYmVnaW5feCksCisgICAgICBmb3JtIChTVEFUSUNfQ0FTVChGT1JNKikoMCkpLAorICAgICAgc3ViKDApLAorICAgICAgYl9zdWJfb3duZXIoMCksCisgICAgICBiX2ZyYW1lZCgwKSwKKyAgICAgIGJfYXV0b0RlbGV0ZSgwKSwKKyAgICAgIG15X2ZpZWxkcygwKQorICB7CisgIH0KKworcHVibGljOgorICAvLyBDcmVhdGUgZm9ybSBmb3IgdGhlIGRlZmF1bHQgcGFuZWwuCisgIE5DdXJzZXNGb3JtIChOQ3Vyc2VzRm9ybUZpZWxkKiBGaWVsZHNbXSwKKwkgICAgICAgYm9vbCB3aXRoX2ZyYW1lPUZBTFNFLAkgICAgICAvLyByZXNlcnZlIHNwYWNlIGZvciBhIGZyYW1lPworCSAgICAgICBib29sIGF1dG9EZWxldGVfRmllbGRzPUZBTFNFKSAgLy8gZG8gYXV0b21hdGljIGNsZWFudXA/CisgICAgOiBOQ3Vyc2VzUGFuZWwoKSwKKyAgICAgIGZvcm0oMCksCisgICAgICBzdWIoMCksCisgICAgICBiX3N1Yl9vd25lcigwKSwKKyAgICAgIGJfZnJhbWVkKDApLAorICAgICAgYl9hdXRvRGVsZXRlKDApLAorICAgICAgbXlfZmllbGRzKDApCisgIHsKKyAgICBJbml0Rm9ybShGaWVsZHMsIHdpdGhfZnJhbWUsIGF1dG9EZWxldGVfRmllbGRzKTsKKyAgfQorCisgIC8vIENyZWF0ZSBhIGZvcm0gaW4gYSBwYW5lbCB3aXRoIHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgc2l6ZS4KKyAgTkN1cnNlc0Zvcm0gKE5DdXJzZXNGb3JtRmllbGQqIEZpZWxkc1tdLAorCSAgICAgICBpbnQgIG5saW5lcywKKwkgICAgICAgaW50ICBuY29scywKKwkgICAgICAgaW50ICBiZWdpbl95LAorCSAgICAgICBpbnQgIGJlZ2luX3gsCisJICAgICAgIGJvb2wgd2l0aF9mcmFtZT1GQUxTRSwJICAgICAvLyByZXNlcnZlIHNwYWNlIGZvciBhIGZyYW1lPworCSAgICAgICBib29sIGF1dG9EZWxldGVfRmllbGRzPUZBTFNFKSAvLyBkbyBhdXRvbWF0aWMgY2xlYW51cD8KKyAgICA6IE5DdXJzZXNQYW5lbChubGluZXMsIG5jb2xzLCBiZWdpbl95LCBiZWdpbl94KSwKKyAgICAgIGZvcm0oMCksCisgICAgICBzdWIoMCksCisgICAgICBiX3N1Yl9vd25lcigwKSwKKyAgICAgIGJfZnJhbWVkKDApLAorICAgICAgYl9hdXRvRGVsZXRlKDApLAorICAgICAgbXlfZmllbGRzKDApCisgIHsKKyAgICAgIEluaXRGb3JtKEZpZWxkcywgd2l0aF9mcmFtZSwgYXV0b0RlbGV0ZV9GaWVsZHMpOworICB9CisKKyAgTkN1cnNlc0Zvcm0mIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzRm9ybSYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgICBOQ3Vyc2VzUGFuZWw6Om9wZXJhdG9yPShyaHMpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzRm9ybShjb25zdCBOQ3Vyc2VzRm9ybSYgcmhzKQorICAgIDogTkN1cnNlc1BhbmVsKHJocyksCisgICAgICBmb3JtKHJocy5mb3JtKSwKKyAgICAgIHN1YihyaHMuc3ViKSwKKyAgICAgIGJfc3ViX293bmVyKHJocy5iX3N1Yl9vd25lciksCisgICAgICBiX2ZyYW1lZChyaHMuYl9mcmFtZWQpLAorICAgICAgYl9hdXRvRGVsZXRlKHJocy5iX2F1dG9EZWxldGUpLAorICAgICAgbXlfZmllbGRzKHJocy5teV9maWVsZHMpCisgIHsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNGb3JtKCk7CisKKyAgLy8gU2V0IHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmb3JtCisgIHZpcnR1YWwgdm9pZCBzZXREZWZhdWx0QXR0cmlidXRlcygpOworCisgIC8vIFJldHJpZXZlIGN1cnJlbnQgZmllbGQgb2YgdGhlIGZvcm0uCisgIGlubGluZSBOQ3Vyc2VzRm9ybUZpZWxkKiBjdXJyZW50X2ZpZWxkKCkgY29uc3QgeworICAgIHJldHVybiBteV9maWVsZHNbOjpmaWVsZF9pbmRleCg6OmN1cnJlbnRfZmllbGQoZm9ybSkpXTsKKyAgfQorCisgIC8vIFNldCB0aGUgZm9ybXMgc3Vid2luZG93CisgIHZvaWQgc2V0U3ViV2luZG93KE5DdXJzZXNXaW5kb3cmIHN1Yik7CisKKyAgLy8gU2V0IHRoZXNlIGZpZWxkcyBmb3IgdGhlIGZvcm0KKyAgaW5saW5lIHZvaWQgc2V0RmllbGRzKE5DdXJzZXNGb3JtRmllbGQqIEZpZWxkc1tdKSB7CisgICAgT25FcnJvcig6OnNldF9mb3JtX2ZpZWxkcyhmb3JtLG1hcEZpZWxkcyhGaWVsZHMpKSk7CisgIH0KKworICAvLyBSZW1vdmUgdGhlIGZvcm0gZnJvbSB0aGUgc2NyZWVuCisgIGlubGluZSB2b2lkIHVucG9zdCAodm9pZCkgeworICAgIE9uRXJyb3IgKDo6dW5wb3N0X2Zvcm0gKGZvcm0pKTsKKyAgfQorCisgIC8vIFBvc3QgdGhlIGZvcm0gdG8gdGhlIHNjcmVlbiBpZiBmbGFnIGlzIHRydWUsIHVucG9zdCBpdCBvdGhlcndpc2UKKyAgaW5saW5lIHZvaWQgcG9zdChib29sIGZsYWcgPSBUUlVFKSB7CisgICAgT25FcnJvciAoZmxhZyA/IDo6cG9zdF9mb3JtKGZvcm0pIDogOjp1bnBvc3RfZm9ybSAoZm9ybSkpOworICB9CisKKyAgLy8gRGVjb3JhdGlvbnMKKyAgaW5saW5lIHZvaWQgZnJhbWUoY29uc3QgY2hhciAqdGl0bGU9TlVMTCwgY29uc3QgY2hhciogYnRpdGxlPU5VTEwpIHsKKyAgICBpZiAoYl9mcmFtZWQpCisgICAgICBOQ3Vyc2VzUGFuZWw6OmZyYW1lKHRpdGxlLGJ0aXRsZSk7CisgICAgZWxzZQorICAgICAgT25FcnJvcihFX1NZU1RFTV9FUlJPUik7CisgIH0KKworICBpbmxpbmUgdm9pZCBib2xkZnJhbWUoY29uc3QgY2hhciAqdGl0bGU9TlVMTCwgY29uc3QgY2hhciogYnRpdGxlPU5VTEwpIHsKKyAgICBpZiAoYl9mcmFtZWQpCisgICAgICBOQ3Vyc2VzUGFuZWw6OmJvbGRmcmFtZSh0aXRsZSxidGl0bGUpOworICAgIGVsc2UKKyAgICAgIE9uRXJyb3IoRV9TWVNURU1fRVJST1IpOworICB9CisKKyAgaW5saW5lIHZvaWQgbGFiZWwoY29uc3QgY2hhciAqdG9wTGFiZWwsIGNvbnN0IGNoYXIgKmJvdHRvbUxhYmVsKSB7CisgICAgaWYgKGJfZnJhbWVkKQorICAgICAgTkN1cnNlc1BhbmVsOjpsYWJlbCh0b3BMYWJlbCxib3R0b21MYWJlbCk7CisgICAgZWxzZQorICAgICAgT25FcnJvcihFX1NZU1RFTV9FUlJPUik7CisgIH0KKworICAvLyAtLS0tLQorICAvLyBIb29rcworICAvLyAtLS0tLQorCisgIC8vIENhbGxlZCBhZnRlciB0aGUgZm9ybSBnZXRzIHJlcG9zaXRpb25lZCBpbiBpdHMgd2luZG93LgorICAvLyBUaGlzIGlzIGVzcGVjaWFsbHkgdHJ1ZSBpZiB0aGUgZm9ybSBpcyBwb3N0ZWQuCisgIHZpcnR1YWwgdm9pZCBPbl9Gb3JtX0luaXQoKTsKKworICAvLyBDYWxsZWQgYmVmb3JlIHRoZSBmb3JtIGdldHMgcmVwb3NpdGlvbmVkIGluIGl0cyB3aW5kb3cuCisgIC8vIFRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIGlmIHRoZSBmb3JtIGlzIHVucG9zdGVkLgorICB2aXJ0dWFsIHZvaWQgT25fRm9ybV9UZXJtaW5hdGlvbigpOworCisgIC8vIENhbGxlZCBhZnRlciB0aGUgZmllbGQgYmVjYW1lIHRoZSBjdXJyZW50IGZpZWxkCisgIHZpcnR1YWwgdm9pZCBPbl9GaWVsZF9Jbml0KE5DdXJzZXNGb3JtRmllbGQmIGZpZWxkKTsKKworICAvLyBDYWxsZWQgYmVmb3JlIHRoaXMgZmllbGQgaXMgbGVmdCBhcyBjdXJyZW50IGZpZWxkLgorICB2aXJ0dWFsIHZvaWQgT25fRmllbGRfVGVybWluYXRpb24oTkN1cnNlc0Zvcm1GaWVsZCYgZmllbGQpOworCisgIC8vIENhbGN1bGF0ZSByZXF1aXJlZCB3aW5kb3cgc2l6ZSBmb3IgdGhlIGZvcm0uCisgIHZvaWQgc2NhbGUoaW50JiByb3dzLCBpbnQmIG5jb2xzKSBjb25zdCB7CisgICAgT25FcnJvcig6OnNjYWxlX2Zvcm0oZm9ybSwmcm93cywmbmNvbHMpKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIG51bWJlciBvZiBmaWVsZHMgaW4gdGhlIGZvcm0uCisgIGludCBjb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjpmaWVsZF9jb3VudChmb3JtKTsKKyAgfQorCisgIC8vIE1ha2UgdGhlIHBhZ2UgdGhlIGN1cnJlbnQgcGFnZSBvZiB0aGUgZm9ybS4KKyAgdm9pZCBzZXRfcGFnZShpbnQgcGFnZU51bSkgeworICAgIE9uRXJyb3IoOjpzZXRfZm9ybV9wYWdlKGZvcm0sIHBhZ2VOdW0pKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIGN1cnJlbnQgcGFnZSBudW1iZXIKKyAgaW50IHBhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6Zm9ybV9wYWdlKGZvcm0pOworICB9CisKKyAgLy8gU3dpdGNoIG9uIHRoZSBmb3JtcyBvcHRpb25zCisgIGlubGluZSB2b2lkIG9wdGlvbnNfb24gKEZvcm1fT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjpmb3JtX29wdHNfb24gKGZvcm0sIG9wdHMpKTsKKyAgfQorCisgIC8vIFN3aXRjaCBvZmYgdGhlIGZvcm1zIG9wdGlvbnMKKyAgaW5saW5lIHZvaWQgb3B0aW9uc19vZmYgKEZvcm1fT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjpmb3JtX29wdHNfb2ZmIChmb3JtLCBvcHRzKSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSB0aGUgZm9ybXMgb3B0aW9ucworICBpbmxpbmUgRm9ybV9PcHRpb25zIG9wdGlvbnMgKCkgY29uc3QgeworICAgIHJldHVybiA6OmZvcm1fb3B0cyAoZm9ybSk7CisgIH0KKworICAvLyBTZXQgdGhlIGZvcm1zIG9wdGlvbnMKKyAgaW5saW5lIHZvaWQgc2V0X29wdGlvbnMgKEZvcm1fT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjpzZXRfZm9ybV9vcHRzIChmb3JtLCBvcHRzKSk7CisgIH0KKworICAvLyBBcmUgdGhlcmUgbW9yZSBkYXRhIGluIHRoZSBjdXJyZW50IGZpZWxkIGFmdGVyIHRoZSBkYXRhIHNob3duCisgIGlubGluZSBib29sIGRhdGFfYWhlYWQoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZGF0YV9haGVhZChmb3JtKTsKKyAgfQorCisgIC8vIEFyZSB0aGVyZSBtb3JlIGRhdGEgaW4gdGhlIGN1cnJlbnQgZmllbGQgYmVmb3JlIHRoZSBkYXRhIHNob3duCisgIGlubGluZSBib29sIGRhdGFfYmVoaW5kKCkgY29uc3QgeworICAgIHJldHVybiA6OmRhdGFfYmVoaW5kKGZvcm0pOworICB9CisKKyAgLy8gUG9zaXRpb24gdGhlIGN1cnNvciB0byB0aGUgY3VycmVudCBmaWVsZAorICBpbmxpbmUgdm9pZCBwb3NpdGlvbl9jdXJzb3IgKCkgeworICAgIE9uRXJyb3IgKDo6cG9zX2Zvcm1fY3Vyc29yIChmb3JtKSk7CisgIH0KKyAgLy8gU2V0IHRoZSBjdXJyZW50IGZpZWxkCisgIGlubGluZSB2b2lkIHNldF9jdXJyZW50KE5DdXJzZXNGb3JtRmllbGQmIEYpIHsKKyAgICBPbkVycm9yICg6OnNldF9jdXJyZW50X2ZpZWxkKGZvcm0sIEYuZmllbGQpKTsKKyAgfQorCisgIC8vIFByb3ZpZGUgYSBkZWZhdWx0IGtleSB2aXJ0dWFsaXphdGlvbi4gVHJhbnNsYXRlIHRoZSBrZXlib2FyZAorICAvLyBjb2RlIGMgaW50byBhIGZvcm0gcmVxdWVzdCBjb2RlLgorICAvLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBhIGhvcGVmdWxseSBzdHJhaWdodGZvcndhcmQKKyAgLy8gbWFwcGluZyBmb3IgdGhlIG1vc3QgY29tbW9uIGtleXN0cm9rZXMgYW5kIGZvcm0gcmVxdWVzdHMuCisgIHZpcnR1YWwgaW50IHZpcnR1YWxpemUoaW50IGMpOworCisgIC8vIE9wZXJhdG9ycworICBpbmxpbmUgTkN1cnNlc0Zvcm1GaWVsZCogb3BlcmF0b3JbXShpbnQgaSkgY29uc3QgeworICAgIGlmICggKGkgPCAwKSB8fCAoaSA+PSA6OmZpZWxkX2NvdW50IChmb3JtKSkgKQorICAgICAgT25FcnJvciAoRV9CQURfQVJHVU1FTlQpOworICAgIHJldHVybiBteV9maWVsZHNbaV07CisgIH0KKworICAvLyBQZXJmb3JtIHRoZSBtZW51J3Mgb3BlcmF0aW9uCisgIC8vIFJldHVybiB0aGUgZmllbGQgd2hlcmUgeW91IGxlZnQgdGhlIGZvcm0uCisgIHZpcnR1YWwgTkN1cnNlc0Zvcm1GaWVsZCogb3BlcmF0b3IoKSh2b2lkKTsKKworICAvLyBFeGNlcHRpb24gaGFuZGxlcnMuIFRoZSBkZWZhdWx0IGlzIGEgQmVlcC4KKyAgdmlydHVhbCB2b2lkIE9uX1JlcXVlc3RfRGVuaWVkKGludCBjKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIE9uX0ludmFsaWRfRmllbGQoaW50IGMpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgT25fVW5rbm93bl9Db21tYW5kKGludCBjKSBjb25zdDsKKworfTsKKworLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoaXMgaXMgdGhlIHR5cGljYWwgQysrIHR5cGVzYWZlIHdheSB0byBhbGxvdyB0byBhdHRhY2gKKy8vIHVzZXIgZGF0YSB0byBhIGZpZWxkIG9mIGEgZm9ybS4gSXRzIGFzc3VtZWQgdGhhdCB0aGUgdXNlcgorLy8gZGF0YSBiZWxvbmdzIHRvIHNvbWUgY2xhc3MgVC4gVXNlIFQgYXMgdGVtcGxhdGUgYXJndW1lbnQKKy8vIHRvIGNyZWF0ZSBhIFVzZXJGaWVsZC4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNVc2VyRmllbGQgOiBwdWJsaWMgTkN1cnNlc0Zvcm1GaWVsZAoreworcHVibGljOgorICBOQ3Vyc2VzVXNlckZpZWxkIChpbnQgcm93cywKKwkJICAgIGludCBuY29scywKKwkJICAgIGludCBmaXJzdF9yb3cgPSAwLAorCQkgICAgaW50IGZpcnN0X2NvbCA9IDAsCisJCSAgICBjb25zdCBUKiBwX1VzZXJEYXRhID0gU1RBVElDX0NBU1QoVCopKDApLAorCQkgICAgaW50IG9mZnNjcmVlbl9yb3dzID0gMCwKKwkJICAgIGludCBhZGRpdGlvbmFsX2J1ZmZlcnMgPSAwKQorICAgIDogTkN1cnNlc0Zvcm1GaWVsZCAocm93cywgbmNvbHMsCisJCQlmaXJzdF9yb3csIGZpcnN0X2NvbCwKKwkJCW9mZnNjcmVlbl9yb3dzLCBhZGRpdGlvbmFsX2J1ZmZlcnMpIHsKKyAgICAgIGlmIChmaWVsZCkKKwlPbkVycm9yKDo6c2V0X2ZpZWxkX3VzZXJwdHIoZmllbGQsIFNUQVRJQ19DQVNUKHZvaWQgKikocF9Vc2VyRGF0YSkpKTsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNVc2VyRmllbGQoKSB7fTsKKworICBpbmxpbmUgY29uc3QgVCogVXNlckRhdGEgKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oOjpmaWVsZF91c2VycHRyIChmaWVsZCkpOworICB9CisKKyAgaW5saW5lIHZpcnR1YWwgdm9pZCBzZXRVc2VyRGF0YShjb25zdCBUKiBwX1VzZXJEYXRhKSB7CisgICAgaWYgKGZpZWxkKQorICAgICAgT25FcnJvciAoOjpzZXRfZmllbGRfdXNlcnB0ciAoZmllbGQsIFNUQVRJQ19DQVNUKHZvaWQgKikocF9Vc2VyRGF0YSkpKTsKKyAgfQorfTsKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgc2FtZSBtZWNoYW5pc20gaXMgdXNlZCB0byBhdHRhY2ggdXNlciBkYXRhIHRvIGEgZm9ybQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNVc2VyRm9ybSA6IHB1YmxpYyBOQ3Vyc2VzRm9ybQoreworcHJvdGVjdGVkOgorICAvLyAnSW50ZXJuYWwnIGNvbnN0cnVjdG9yLCBidWlsZHMgYW4gb2JqZWN0IHdpdGhvdXQgYXNzb2NpYXRpb24gdG8gYQorICAvLyBmaWVsZCBhcnJheS4KKyAgTkN1cnNlc1VzZXJGb3JtKCBpbnQgIG5saW5lcywKKwkJICAgaW50ICBuY29scywKKwkJICAgaW50ICBiZWdpbl95ID0gMCwKKwkJICAgaW50ICBiZWdpbl94ID0gMCwKKwkJICAgY29uc3QgVCogcF9Vc2VyRGF0YSA9IFNUQVRJQ19DQVNUKFQqKSgwKSkKKyAgICA6IE5DdXJzZXNGb3JtKG5saW5lcyxuY29scyxiZWdpbl95LGJlZ2luX3gpIHsKKyAgICAgIGlmIChmb3JtKQorCXNldF91c2VyIChjb25zdF9jYXN0PHZvaWQgKj4ocF9Vc2VyRGF0YSkpOworICB9CisKK3B1YmxpYzoKKyAgTkN1cnNlc1VzZXJGb3JtIChOQ3Vyc2VzRm9ybUZpZWxkIEZpZWxkc1tdLAorCQkgICBjb25zdCBUKiBwX1VzZXJEYXRhID0gU1RBVElDX0NBU1QoVCopKDApLAorCQkgICBib29sIHdpdGhfZnJhbWU9RkFMU0UsCisJCSAgIGJvb2wgYXV0b0RlbGV0ZV9GaWVsZHM9RkFMU0UpCisgICAgOiBOQ3Vyc2VzRm9ybSAoRmllbGRzLCB3aXRoX2ZyYW1lLCBhdXRvRGVsZXRlX0ZpZWxkcykgeworICAgICAgaWYgKGZvcm0pCisJc2V0X3VzZXIgKGNvbnN0X2Nhc3Q8dm9pZCAqPihwX1VzZXJEYXRhKSk7CisgIH07CisKKyAgTkN1cnNlc1VzZXJGb3JtIChOQ3Vyc2VzRm9ybUZpZWxkIEZpZWxkc1tdLAorCQkgICBpbnQgbmxpbmVzLAorCQkgICBpbnQgbmNvbHMsCisJCSAgIGludCBiZWdpbl95ID0gMCwKKwkJICAgaW50IGJlZ2luX3ggPSAwLAorCQkgICBjb25zdCBUKiBwX1VzZXJEYXRhID0gU1RBVElDX0NBU1QoVCopKDApLAorCQkgICBib29sIHdpdGhfZnJhbWU9RkFMU0UsCisJCSAgIGJvb2wgYXV0b0RlbGV0ZV9GaWVsZHM9RkFMU0UpCisgICAgOiBOQ3Vyc2VzRm9ybSAoRmllbGRzLCBubGluZXMsIG5jb2xzLCBiZWdpbl95LCBiZWdpbl94LAorCQkgICB3aXRoX2ZyYW1lLCBhdXRvRGVsZXRlX0ZpZWxkcykgeworICAgICAgaWYgKGZvcm0pCisJc2V0X3VzZXIgKGNvbnN0X2Nhc3Q8dm9pZCAqPihwX1VzZXJEYXRhKSk7CisgIH07CisKKyAgdmlydHVhbCB+TkN1cnNlc1VzZXJGb3JtKCkgeworICB9OworCisgIGlubGluZSBUKiBVc2VyRGF0YSAodm9pZCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihnZXRfdXNlciAoKSk7CisgIH07CisKKyAgaW5saW5lIHZpcnR1YWwgdm9pZCBzZXRVc2VyRGF0YSAoY29uc3QgVCogcF9Vc2VyRGF0YSkgeworICAgIGlmIChmb3JtKQorICAgICAgc2V0X3VzZXIgKGNvbnN0X2Nhc3Q8dm9pZCAqPihwX1VzZXJEYXRhKSk7CisgIH0KKworfTsKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCdWlsdGluIEZpZWxkdHlwZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBBbHBoYV9GaWVsZCA6IHB1YmxpYyBOQ3Vyc2VzRmllbGRUeXBlCit7Citwcml2YXRlOgorICBpbnQgbWluX2ZpZWxkX3dpZHRoOworCisgIHZvaWQgc2V0KE5DdXJzZXNGb3JtRmllbGQmIGYpIHsKKyAgICBPbkVycm9yKDo6c2V0X2ZpZWxkX3R5cGUoZi5nZXRfZmllbGQoKSxmaWVsZHR5cGUsbWluX2ZpZWxkX3dpZHRoKSk7CisgIH0KKworcHVibGljOgorICBBbHBoYV9GaWVsZChpbnQgd2lkdGgpCisgICAgOiBOQ3Vyc2VzRmllbGRUeXBlKFRZUEVfQUxQSEEpLAorICAgICAgbWluX2ZpZWxkX3dpZHRoKHdpZHRoKSB7CisgIH0KK307CisKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIEFscGhhbnVtZXJpY19GaWVsZCA6IHB1YmxpYyBOQ3Vyc2VzRmllbGRUeXBlCit7Citwcml2YXRlOgorICBpbnQgbWluX2ZpZWxkX3dpZHRoOworCisgIHZvaWQgc2V0KE5DdXJzZXNGb3JtRmllbGQmIGYpIHsKKyAgICBPbkVycm9yKDo6c2V0X2ZpZWxkX3R5cGUoZi5nZXRfZmllbGQoKSxmaWVsZHR5cGUsbWluX2ZpZWxkX3dpZHRoKSk7CisgIH0KKworcHVibGljOgorICBBbHBoYW51bWVyaWNfRmllbGQoaW50IHdpZHRoKQorICAgIDogTkN1cnNlc0ZpZWxkVHlwZShUWVBFX0FMTlVNKSwKKyAgICAgIG1pbl9maWVsZF93aWR0aCh3aWR0aCkgeworICB9Cit9OworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBJbnRlZ2VyX0ZpZWxkIDogcHVibGljIE5DdXJzZXNGaWVsZFR5cGUKK3sKK3ByaXZhdGU6CisgIGludCBwcmVjaXNpb247CisgIGxvbmcgbG93ZXJfbGltaXQsIHVwcGVyX2xpbWl0OworCisgIHZvaWQgc2V0KE5DdXJzZXNGb3JtRmllbGQmIGYpIHsKKyAgICBPbkVycm9yKDo6c2V0X2ZpZWxkX3R5cGUoZi5nZXRfZmllbGQoKSxmaWVsZHR5cGUsCisJCQkgICAgIHByZWNpc2lvbixsb3dlcl9saW1pdCx1cHBlcl9saW1pdCkpOworICB9CisKK3B1YmxpYzoKKyAgSW50ZWdlcl9GaWVsZChpbnQgcHJlYywgbG9uZyBsb3c9MEwsIGxvbmcgaGlnaD0wTCkKKyAgICA6IE5DdXJzZXNGaWVsZFR5cGUoVFlQRV9JTlRFR0VSKSwKKyAgICAgIHByZWNpc2lvbihwcmVjKSwgbG93ZXJfbGltaXQobG93KSwgdXBwZXJfbGltaXQoaGlnaCkgeworICB9Cit9OworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOdW1lcmljX0ZpZWxkIDogcHVibGljIE5DdXJzZXNGaWVsZFR5cGUKK3sKK3ByaXZhdGU6CisgIGludCBwcmVjaXNpb247CisgIGRvdWJsZSBsb3dlcl9saW1pdCwgdXBwZXJfbGltaXQ7CisKKyAgdm9pZCBzZXQoTkN1cnNlc0Zvcm1GaWVsZCYgZikgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfdHlwZShmLmdldF9maWVsZCgpLGZpZWxkdHlwZSwKKwkJCSAgICAgcHJlY2lzaW9uLGxvd2VyX2xpbWl0LHVwcGVyX2xpbWl0KSk7CisgIH0KKworcHVibGljOgorICBOdW1lcmljX0ZpZWxkKGludCBwcmVjLCBkb3VibGUgbG93PTAuMCwgZG91YmxlIGhpZ2g9MC4wKQorICAgIDogTkN1cnNlc0ZpZWxkVHlwZShUWVBFX05VTUVSSUMpLAorICAgICAgcHJlY2lzaW9uKHByZWMpLCBsb3dlcl9saW1pdChsb3cpLCB1cHBlcl9saW1pdChoaWdoKSB7CisgIH0KK307CisKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIFJlZ3VsYXJfRXhwcmVzc2lvbl9GaWVsZCA6IHB1YmxpYyBOQ3Vyc2VzRmllbGRUeXBlCit7Citwcml2YXRlOgorICBjaGFyKiByZWdleDsKKworICB2b2lkIHNldChOQ3Vyc2VzRm9ybUZpZWxkJiBmKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF90eXBlKGYuZ2V0X2ZpZWxkKCksZmllbGR0eXBlLHJlZ2V4KSk7CisgIH0KKworICB2b2lkIGNvcHlfcmVnZXgoY29uc3QgY2hhciAqc291cmNlKQorICB7CisgICAgcmVnZXggPSBuZXcgY2hhclsxICsgOjpzdHJsZW4oc291cmNlKV07CisgICAgKDo6c3RyY3B5KShyZWdleCwgc291cmNlKTsKKyAgfQorCitwdWJsaWM6CisgIFJlZ3VsYXJfRXhwcmVzc2lvbl9GaWVsZChjb25zdCBjaGFyICpleHByKQorICAgIDogTkN1cnNlc0ZpZWxkVHlwZShUWVBFX1JFR0VYUCksCisgICAgICByZWdleChOVUxMKQorICB7CisgICAgY29weV9yZWdleChleHByKTsKKyAgfQorCisgIFJlZ3VsYXJfRXhwcmVzc2lvbl9GaWVsZCYgb3BlcmF0b3I9KGNvbnN0IFJlZ3VsYXJfRXhwcmVzc2lvbl9GaWVsZCYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgICBjb3B5X3JlZ2V4KHJocy5yZWdleCk7CisgICAgICBOQ3Vyc2VzRmllbGRUeXBlOjpvcGVyYXRvcj0ocmhzKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgUmVndWxhcl9FeHByZXNzaW9uX0ZpZWxkKGNvbnN0IFJlZ3VsYXJfRXhwcmVzc2lvbl9GaWVsZCYgcmhzKQorICAgIDogTkN1cnNlc0ZpZWxkVHlwZShyaHMpLAorICAgICAgcmVnZXgoTlVMTCkKKyAgeworICAgIGNvcHlfcmVnZXgocmhzLnJlZ2V4KTsKKyAgfQorCisgIH5SZWd1bGFyX0V4cHJlc3Npb25fRmllbGQoKSB7CisgICAgZGVsZXRlW10gcmVnZXg7CisgIH0KK307CisKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIEVudW1lcmF0aW9uX0ZpZWxkIDogcHVibGljIE5DdXJzZXNGaWVsZFR5cGUKK3sKK3ByaXZhdGU6CisgIGNvbnN0IGNoYXIqKiBsaXN0OworICBpbnQgY2FzZV9zZW5zaXRpdmU7CisgIGludCBub25fdW5pcXVlX21hdGNoZXM7CisKKyAgdm9pZCBzZXQoTkN1cnNlc0Zvcm1GaWVsZCYgZikgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfdHlwZShmLmdldF9maWVsZCgpLGZpZWxkdHlwZSwKKwkJCSAgICAgbGlzdCxjYXNlX3NlbnNpdGl2ZSxub25fdW5pcXVlX21hdGNoZXMpKTsKKyAgfQorcHVibGljOgorICBFbnVtZXJhdGlvbl9GaWVsZChjb25zdCBjaGFyKiBlbnVtc1tdLAorCQkgICAgYm9vbCBjYXNlX3NlbnM9RkFMU0UsCisJCSAgICBib29sIG5vbl91bmlxdWU9RkFMU0UpCisgICAgOiBOQ3Vyc2VzRmllbGRUeXBlKFRZUEVfRU5VTSksCisgICAgICBsaXN0KGVudW1zKSwKKyAgICAgIGNhc2Vfc2Vuc2l0aXZlKGNhc2Vfc2VucyA/IC0xIDogMCksCisgICAgICBub25fdW5pcXVlX21hdGNoZXMobm9uX3VuaXF1ZSA/IC0xIDogMCkgeworICB9CisKKyAgRW51bWVyYXRpb25fRmllbGQmIG9wZXJhdG9yPShjb25zdCBFbnVtZXJhdGlvbl9GaWVsZCYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgICBOQ3Vyc2VzRmllbGRUeXBlOjpvcGVyYXRvcj0ocmhzKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgRW51bWVyYXRpb25fRmllbGQoY29uc3QgRW51bWVyYXRpb25fRmllbGQmIHJocykKKyAgICA6IE5DdXJzZXNGaWVsZFR5cGUocmhzKSwKKyAgICAgIGxpc3QocmhzLmxpc3QpLAorICAgICAgY2FzZV9zZW5zaXRpdmUocmhzLmNhc2Vfc2Vuc2l0aXZlKSwKKyAgICAgIG5vbl91bmlxdWVfbWF0Y2hlcyhyaHMubm9uX3VuaXF1ZV9tYXRjaGVzKQorICB7CisgIH0KK307CisKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIElQVjRfQWRkcmVzc19GaWVsZCA6IHB1YmxpYyBOQ3Vyc2VzRmllbGRUeXBlCit7Citwcml2YXRlOgorICB2b2lkIHNldChOQ3Vyc2VzRm9ybUZpZWxkJiBmKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF90eXBlKGYuZ2V0X2ZpZWxkKCksZmllbGR0eXBlKSk7CisgIH0KKworcHVibGljOgorICBJUFY0X0FkZHJlc3NfRmllbGQoKSA6IE5DdXJzZXNGaWVsZFR5cGUoVFlQRV9JUFY0KSB7CisgIH0KK307CisKK2V4dGVybiAiQyIgeworICBib29sIF9uY194eF9mbGRfZmNoZWNrKEZJRUxEICosIGNvbnN0IHZvaWQqKTsKKyAgYm9vbCBfbmNfeHhfZmxkX2NjaGVjayhpbnQgYywgY29uc3Qgdm9pZCAqKTsKKyAgdm9pZCogX25jX3h4X2ZsZF9tYWtlYXJnKHZhX2xpc3QqKTsKK30KKworLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIFVzZXItRGVmaW5lZCBGaWVsZHR5cGVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworY2xhc3MgTkNVUlNFU19JTVBFWFAgVXNlckRlZmluZWRGaWVsZFR5cGUgOiBwdWJsaWMgTkN1cnNlc0ZpZWxkVHlwZQoreworICBmcmllbmQgY2xhc3MgVURGX0luaXQ7IC8vIEludGVybmFsIGhlbHBlciB0byBzZXQgdXAgc3RhdGljcworcHJpdmF0ZToKKyAgLy8gRm9yIGFsbCBDKysgZGVmaW5lZCBmaWVsZHR5cGVzIHdlIG5lZWQgb25seSBvbmUgZ2VuZXJpYyBsb3dsZXZlbAorICAvLyBGSUVMRFRZUEUqIGVsZW1lbnQuCisgIHN0YXRpYyBGSUVMRFRZUEUqIGdlbmVyaWNfZmllbGR0eXBlOworCitwcm90ZWN0ZWQ6CisgIC8vIFRoaXMgYXJlIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIGxvdyBsZXZlbCBsaWJmb3JtcyBmdW5jdGlvbnMKKyAgLy8gdG8gY29uc3RydWN0IGEgZmllbGR0eXBlLgorICBmcmllbmQgYm9vbCBfbmNfeHhfZmxkX2ZjaGVjayhGSUVMRCAqLCBjb25zdCB2b2lkKik7CisgIGZyaWVuZCBib29sIF9uY194eF9mbGRfY2NoZWNrKGludCBjLCBjb25zdCB2b2lkICopOworICBmcmllbmQgdm9pZCogX25jX3h4X2ZsZF9tYWtlYXJnKHZhX2xpc3QqKTsKKworICB2b2lkIHNldChOQ3Vyc2VzRm9ybUZpZWxkJiBmKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF90eXBlKGYuZ2V0X2ZpZWxkKCksZmllbGR0eXBlLCZmKSk7CisgIH0KKworcHJvdGVjdGVkOgorICAvLyBSZWRlZmluZSB0aGlzIGZ1bmN0aW9uIHRvIGRvIGEgZmllbGQgdmFsaWRhdGlvbi4gVGhlIGFyZ3VtZW50CisgIC8vIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCB5b3Ugc2hvdWxkIHZhbGlkYXRlLgorICB2aXJ0dWFsIGJvb2wgZmllbGRfY2hlY2soTkN1cnNlc0Zvcm1GaWVsZCYgZikgPSAwOworCisgIC8vIFJlZGVmaW5lIHRoaXMgZnVuY3Rpb24gdG8gZG8gYSBjaGFyYWN0ZXIgdmFsaWRhdGlvbi4gVGhlIGFyZ3VtZW50CisgIC8vIGlzIHRoZSBjaGFyYWN0ZXIgdG8gYmUgdmFsaWRhdGVkLgorICB2aXJ0dWFsIGJvb2wgY2hhcl9jaGVjayAoaW50IGMpID0gMDsKKworcHVibGljOgorICBVc2VyRGVmaW5lZEZpZWxkVHlwZSgpIDogTkN1cnNlc0ZpZWxkVHlwZShnZW5lcmljX2ZpZWxkdHlwZSkgeworICB9Cit9OworCitleHRlcm4gIkMiIHsKKyAgYm9vbCBfbmNfeHhfbmV4dF9jaG9pY2UoRklFTEQqLCBjb25zdCB2b2lkICopOworICBib29sIF9uY194eF9wcmV2X2Nob2ljZShGSUVMRCosIGNvbnN0IHZvaWQgKik7Cit9CisKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBVc2VyLURlZmluZWQgRmllbGR0eXBlcyB3aXRoIENob2ljZSBmdW5jdGlvbnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBVc2VyRGVmaW5lZEZpZWxkVHlwZV9XaXRoX0Nob2ljZSA6IHB1YmxpYyBVc2VyRGVmaW5lZEZpZWxkVHlwZQoreworICBmcmllbmQgY2xhc3MgVURGX0luaXQ7IC8vIEludGVybmFsIGhlbHBlciB0byBzZXQgdXAgc3RhdGljcworcHJpdmF0ZToKKyAgLy8gRm9yIGFsbCBDKysgZGVmaW5lZCBmaWVsZHR5cGVzIHdpdGggY2hvaWNlIGZ1bmN0aW9ucyB3ZSBuZWVkIG9ubHkgb25lCisgIC8vIGdlbmVyaWMgbG93bGV2ZWwgRklFTERUWVBFKiBlbGVtZW50LgorICBzdGF0aWMgRklFTERUWVBFKiBnZW5lcmljX2ZpZWxkdHlwZV93aXRoX2Nob2ljZTsKKworICAvLyBUaGlzIGFyZSB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGJ5IHRoZSBsb3cgbGV2ZWwgbGliZm9ybXMgZnVuY3Rpb25zCisgIC8vIHRvIGNvbnN0cnVjdCBhIGZpZWxkdHlwZSB3aXRoIGNob2ljZSBmdW5jdGlvbnMuCisgIGZyaWVuZCBib29sIF9uY194eF9uZXh0X2Nob2ljZShGSUVMRCosIGNvbnN0IHZvaWQgKik7CisgIGZyaWVuZCBib29sIF9uY194eF9wcmV2X2Nob2ljZShGSUVMRCosIGNvbnN0IHZvaWQgKik7CisKK3Byb3RlY3RlZDoKKyAgLy8gUmVkZWZpbmUgdGhpcyBmdW5jdGlvbiB0byBkbyB0aGUgcmV0cmlldmFsIG9mIHRoZSBuZXh0IGNob2ljZSB2YWx1ZS4KKyAgLy8gVGhlIGFyZ3VtZW50IGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCB0b2JlIGV4YW1pbmVkLgorICB2aXJ0dWFsIGJvb2wgbmV4dCAgICAoTkN1cnNlc0Zvcm1GaWVsZCYgZikgPSAwOworCisgIC8vIFJlZGVmaW5lIHRoaXMgZnVuY3Rpb24gdG8gZG8gdGhlIHJldHJpZXZhbCBvZiB0aGUgcHJldmlvdXMgY2hvaWNlIHZhbHVlLgorICAvLyBUaGUgYXJndW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkIHRvYmUgZXhhbWluZWQuCisgIHZpcnR1YWwgYm9vbCBwcmV2aW91cyhOQ3Vyc2VzRm9ybUZpZWxkJiBmKSA9IDA7CisKK3B1YmxpYzoKKyAgVXNlckRlZmluZWRGaWVsZFR5cGVfV2l0aF9DaG9pY2UoKSB7CisgICAgZmllbGR0eXBlID0gZ2VuZXJpY19maWVsZHR5cGVfd2l0aF9jaG9pY2U7CisgIH0KK307CisKKyNlbmRpZiAvKiBOQ1VSU0VTX0NVUlNFU0ZfSF9pbmNsICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlc20uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzIyNzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlc20uaApAQCAtMCwwICsxLDY3MiBAQAorLy8gKiBUaGlzIG1ha2VzIGVtYWNzIGhhcHB5IC0qLU1vZGU6IEMrKzstKi0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMywyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIEF1dGhvcjogSnVlcmdlbiBQZmVpZmVyLCAxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vICRJZDogY3Vyc2VzbS5oLHYgMS4yNSAyMDA1LzA4LzEzIDE4OjEwOjM2IHRvbSBFeHAgJAorCisjaWZuZGVmIE5DVVJTRVNfQ1VSU0VTTV9IX2luY2wKKyNkZWZpbmUgTkNVUlNFU19DVVJTRVNNX0hfaW5jbCAxCisKKyNpbmNsdWRlIDxjdXJzZXNwLmg+CisKK2V4dGVybiAiQyIgeworIyAgaW5jbHVkZSA8bWVudS5oPgorfQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoaXMgd3JhcHMgdGhlIElURU0gdHlwZSBvZiA8bWVudS5oPgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNNZW51SXRlbQoreworICBmcmllbmQgY2xhc3MgTkN1cnNlc01lbnU7CisKK3Byb3RlY3RlZDoKKyAgSVRFTSAqaXRlbTsKKworICBpbmxpbmUgdm9pZCBPbkVycm9yIChpbnQgZXJyKSBjb25zdCBUSFJPV1MoTkN1cnNlc01lbnVFeGNlcHRpb24pIHsKKyAgICBpZiAoZXJyICE9IEVfT0spCisgICAgICBUSFJPVyhuZXcgTkN1cnNlc01lbnVFeGNlcHRpb24gKGVycikpOworICB9CisKK3B1YmxpYzoKKyAgTkN1cnNlc01lbnVJdGVtIChjb25zdCBjaGFyKiBwX25hbWUgICAgID0gTlVMTCwKKwkJICAgY29uc3QgY2hhciogcF9kZXNjcmlwdCA9IE5VTEwpCisgICAgOiBpdGVtKDApCisgIHsKKyAgICBpdGVtID0gcF9uYW1lID8gOjpuZXdfaXRlbSAocF9uYW1lLCBwX2Rlc2NyaXB0KSA6IFNUQVRJQ19DQVNUKElURU0qKSgwKTsKKyAgICBpZiAocF9uYW1lICYmICFpdGVtKQorICAgICAgT25FcnJvciAoRV9TWVNURU1fRVJST1IpOworICB9CisgIC8vIENyZWF0ZSBhbiBpdGVtLiBJZiB5b3UgcGFzcyBib3RoIHBhcmFtZXRlcnMgYXMgTlVMTCwgYSBkZWxpbWl0aW5nCisgIC8vIGl0ZW0gaXMgY29uc3RydWN0ZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdGVybWluYXRlIGEgbGlzdCBvZgorICAvLyBOQ3Vyc2VzTWVudSBvYmplY3RzLgorCisgIE5DdXJzZXNNZW51SXRlbSYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNNZW51SXRlbSYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNNZW51SXRlbShjb25zdCBOQ3Vyc2VzTWVudUl0ZW0mIHJocykKKyAgICA6IGl0ZW0oMCkKKyAgeworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc01lbnVJdGVtICgpOworICAvLyBSZWxlYXNlIHRoZSBpdGVtcyBtZW1vcnkKKworICBpbmxpbmUgY29uc3QgY2hhciogbmFtZSAoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6aXRlbV9uYW1lIChpdGVtKTsKKyAgfQorICAvLyBOYW1lIG9mIHRoZSBpdGVtCisKKyAgaW5saW5lIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uICgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjppdGVtX2Rlc2NyaXB0aW9uIChpdGVtKTsKKyAgfQorICAvLyBEZXNjcmlwdGlvbiBvZiB0aGUgaXRlbQorCisgIGlubGluZSBpbnQgKGluZGV4KSAodm9pZCkgY29uc3QgeworICAgIHJldHVybiA6Oml0ZW1faW5kZXggKGl0ZW0pOworICB9CisgIC8vIEluZGV4IG9mIHRoZSBpdGVtIGluIGFuIGl0ZW0gYXJyYXkgKG9yIC0xKQorCisgIGlubGluZSB2b2lkIG9wdGlvbnNfb24gKEl0ZW1fT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjppdGVtX29wdHNfb24gKGl0ZW0sIG9wdHMpKTsKKyAgfQorICAvLyBTd2l0Y2ggb24gdGhlIGl0ZW1zIG9wdGlvbnMKKworICBpbmxpbmUgdm9pZCBvcHRpb25zX29mZiAoSXRlbV9PcHRpb25zIG9wdHMpIHsKKyAgICBPbkVycm9yICg6Oml0ZW1fb3B0c19vZmYgKGl0ZW0sIG9wdHMpKTsKKyAgfQorICAvLyBTd2l0Y2ggb2ZmIHRoZSBpdGVtJ3Mgb3B0aW9uCisKKyAgaW5saW5lIEl0ZW1fT3B0aW9ucyBvcHRpb25zICgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjppdGVtX29wdHMgKGl0ZW0pOworICB9CisgIC8vIFJldHJpZXZlIHRoZSBpdGVtcyBvcHRpb25zCisKKyAgaW5saW5lIHZvaWQgc2V0X29wdGlvbnMgKEl0ZW1fT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjpzZXRfaXRlbV9vcHRzIChpdGVtLCBvcHRzKSk7CisgIH0KKyAgLy8gU2V0IHRoZSBpdGVtcyBvcHRpb25zCisKKyAgaW5saW5lIHZvaWQgc2V0X3ZhbHVlIChib29sIGYpIHsKKyAgICBPbkVycm9yICg6OnNldF9pdGVtX3ZhbHVlIChpdGVtLGYpKTsKKyAgfQorICAvLyBTZXQvUmVzZXQgdGhlIGl0ZW1zIHNlbGVjdGlvbiBzdGF0ZQorCisgIGlubGluZSBib29sIHZhbHVlICgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjppdGVtX3ZhbHVlIChpdGVtKTsKKyAgfQorICAvLyBSZXRyaWV2ZSB0aGUgaXRlbXMgc2VsZWN0aW9uIHN0YXRlCisKKyAgaW5saW5lIGJvb2wgdmlzaWJsZSAoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6aXRlbV92aXNpYmxlIChpdGVtKTsKKyAgfQorICAvLyBSZXRyaWV2ZSB2aXNpYmlsaXR5IG9mIHRoZSBpdGVtCisKKyAgdmlydHVhbCBib29sIGFjdGlvbigpOworICAvLyBQZXJmb3JtIGFuIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBpdGVtOyB5b3UgbWF5IHVzZSB0aGlzIGluIGFuCisgIC8vIHVzZXIgc3VwcGxpZWQgZHJpdmVyIGZvciBhIG1lbnU7IHlvdSBtYXkgZGVyaXZlIGZyb20gdGhpcyBjbGFzcyBhbmQKKyAgLy8gb3ZlcmxvYWQgYWN0aW9uKCkgdG8gc3VwcGx5IGl0ZW1zIHdpdGggZGlmZmVyZW50IGFjdGlvbnMuCisgIC8vIElmIGFuIGFjdGlvbiByZXR1cm5zIHRydWUsIHRoZSBtZW51IHdpbGwgYmUgZXhpdGVkLiBUaGUgZGVmYXVsdCBhY3Rpb24KKyAgLy8gaXMgdG8gZG8gbm90aGluZy4KK307CisKKy8vIFByb3RvdHlwZSBmb3IgYW4gaXRlbXMgY2FsbGJhY2sgZnVuY3Rpb24uCit0eXBlZGVmIGJvb2wgSVRFTUNBTExCQUNLKE5DdXJzZXNNZW51SXRlbSYpOworCisvLyBJZiB5b3UgZG9uJ3QgbGlrZSB0byBjcmVhdGUgYSBjaGlsZCBjbGFzcyBmb3IgaW5kaXZpZHVhbCBpdGVtcyB0bworLy8gb3ZlcmxvYWQgYWN0aW9uKCksIHlvdSBtYXkgdXNlIHRoaXMgY2xhc3MgYW5kIHByb3ZpZGUgYSBjYWxsYmFjaworLy8gZnVuY3Rpb24gcG9pbnRlciBmb3IgaXRlbXMuCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzTWVudUNhbGxiYWNrSXRlbSA6IHB1YmxpYyBOQ3Vyc2VzTWVudUl0ZW0KK3sKK3ByaXZhdGU6CisgIElURU1DQUxMQkFDSyogcF9mY3Q7CisKK3B1YmxpYzoKKyAgTkN1cnNlc01lbnVDYWxsYmFja0l0ZW0oSVRFTUNBTExCQUNLKiBmY3QgICAgICAgPSBOVUxMLAorCQkJICBjb25zdCBjaGFyKiBwX25hbWUgICAgICA9IE5VTEwsCisJCQkgIGNvbnN0IGNoYXIqIHBfZGVzY3JpcHQgID0gTlVMTCApCisgICAgOiBOQ3Vyc2VzTWVudUl0ZW0gKHBfbmFtZSwgcF9kZXNjcmlwdCksCisgICAgICBwX2ZjdCAoZmN0KSB7CisgIH0KKworICBOQ3Vyc2VzTWVudUNhbGxiYWNrSXRlbSYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNNZW51Q2FsbGJhY2tJdGVtJiByaHMpCisgIHsKKyAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTkN1cnNlc01lbnVDYWxsYmFja0l0ZW0oY29uc3QgTkN1cnNlc01lbnVDYWxsYmFja0l0ZW0mIHJocykKKyAgICA6IE5DdXJzZXNNZW51SXRlbShyaHMpLAorICAgICAgcF9mY3QoMCkKKyAgeworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc01lbnVDYWxsYmFja0l0ZW0oKTsKKworICBib29sIGFjdGlvbigpOworfTsKKworICAvLyBUaGlzIGFyZSB0aGUgYnVpbHQtaW4gaG9vayBmdW5jdGlvbnMgaW4gdGhpcyBDKysgYmluZGluZy4gSW4gQysrIHdlIHVzZQorICAvLyB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMgKHNlZSBiZWxvdyBPbl8uLi5fSW5pdCBhbmQgT25fLi4uX1Rlcm1pbmF0aW9uKQorICAvLyB0byBwcm92aWRlIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBhbiBvYmplY3Qgb3JpZW50ZWQgbWFubmVyLgorZXh0ZXJuICJDIiB7CisgIHZvaWQgX25jX3h4X21udV9pbml0KE1FTlUgKik7CisgIHZvaWQgX25jX3h4X21udV90ZXJtKE1FTlUgKik7CisgIHZvaWQgX25jX3h4X2l0bV9pbml0KE1FTlUgKik7CisgIHZvaWQgX25jX3h4X2l0bV90ZXJtKE1FTlUgKik7Cit9CisKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGlzIHdyYXBzIHRoZSBNRU5VIHR5cGUgb2YgPG1lbnUuaD4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzTWVudSA6IHB1YmxpYyBOQ3Vyc2VzUGFuZWwKK3sKK3Byb3RlY3RlZDoKKyAgTUVOVSAqbWVudTsKKworcHJpdmF0ZToKKyAgTkN1cnNlc1dpbmRvdyogc3ViOyAgIC8vIHRoZSBzdWJ3aW5kb3cgb2JqZWN0CisgIGJvb2wgYl9zdWJfb3duZXI7ICAgICAvLyBpcyB0aGlzIG91ciBvd24gc3Vid2luZG93PworICBib29sIGJfZnJhbWVkOyAgICAgICAgLy8gaGFzIHRoZSBtZW51IGEgYm9yZGVyPworICBib29sIGJfYXV0b0RlbGV0ZTsgICAgLy8gRGVsZXRlIGl0ZW1zIHdoZW4gZGVsZXRpbmcgbWVudT8KKworICBOQ3Vyc2VzTWVudUl0ZW0qKiBteV9pdGVtczsgLy8gVGhlIGFycmF5IG9mIGl0ZW1zIGZvciB0aGlzIG1lbnUKKworICAvLyBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciB0aGUgbWVudSdzIHVzZXIgZGF0YSBmaWVsZCB0byBsaW5rIHRoZQorICAvLyBNRU5VKiB0byB0aGUgQysrIG9iamVjdCBhbmQgdG8gcHJvdmlkZSBleHRyYSBzcGFjZSBmb3IgYSB1c2VyIHBvaW50ZXIuCisgIHR5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkKiAgICAgICAgICAgICAgbV91c2VyOyAgICAgIC8vIHRoZSBwb2ludGVyIGZvciB0aGUgdXNlcidzIGRhdGEKKyAgICBjb25zdCBOQ3Vyc2VzTWVudSogbV9iYWNrOyAgICAgIC8vIGJhY2t3YXJkIHBvaW50ZXIgdG8gQysrIG9iamVjdAorICAgIGNvbnN0IE1FTlUqICAgICAgICBtX293bmVyOworICB9IFVzZXJIb29rOworCisgIC8vIEdldCB0aGUgYmFja3dhcmQgcG9pbnRlciB0byB0aGUgQysrIG9iamVjdCBmcm9tIGEgTUVOVQorICBzdGF0aWMgaW5saW5lIE5DdXJzZXNNZW51KiBnZXRIb29rKGNvbnN0IE1FTlUgKm0pIHsKKyAgICBVc2VySG9vayogaG9vayA9IFNUQVRJQ19DQVNUKFVzZXJIb29rKikoOjptZW51X3VzZXJwdHIobSkpOworICAgIGFzc2VydChob29rICE9IDAgJiYgaG9vay0+bV9vd25lcj09bSk7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TkN1cnNlc01lbnUqPihob29rLT5tX2JhY2spOworICB9CisKKyAgZnJpZW5kIHZvaWQgX25jX3h4X21udV9pbml0KE1FTlUgKik7CisgIGZyaWVuZCB2b2lkIF9uY194eF9tbnVfdGVybShNRU5VICopOworICBmcmllbmQgdm9pZCBfbmNfeHhfaXRtX2luaXQoTUVOVSAqKTsKKyAgZnJpZW5kIHZvaWQgX25jX3h4X2l0bV90ZXJtKE1FTlUgKik7CisKKyAgLy8gQ2FsY3VsYXRlIElURU0qIGFycmF5IGZvciB0aGUgbWVudQorICBJVEVNKiogbWFwSXRlbXMoTkN1cnNlc01lbnVJdGVtKiBuaXRlbXNbXSk7CisKK3Byb3RlY3RlZDoKKyAgLy8gaW50ZXJuYWwgcm91dGluZXMKKyAgaW5saW5lIHZvaWQgc2V0X3VzZXIodm9pZCAqdXNlcikgeworICAgIFVzZXJIb29rKiB1cHRyID0gU1RBVElDX0NBU1QoVXNlckhvb2sqKSg6Om1lbnVfdXNlcnB0ciAobWVudSkpOworICAgIGFzc2VydCAodXB0ciAhPSAwICYmIHVwdHItPm1fYmFjaz09dGhpcyAmJiB1cHRyLT5tX293bmVyPT1tZW51KTsKKyAgICB1cHRyLT5tX3VzZXIgPSB1c2VyOworICB9CisKKyAgaW5saW5lIHZvaWQgKmdldF91c2VyKCkgeworICAgIFVzZXJIb29rKiB1cHRyID0gU1RBVElDX0NBU1QoVXNlckhvb2sqKSg6Om1lbnVfdXNlcnB0ciAobWVudSkpOworICAgIGFzc2VydCAodXB0ciAhPSAwICYmIHVwdHItPm1fYmFjaz09dGhpcyAmJiB1cHRyLT5tX293bmVyPT1tZW51KTsKKyAgICByZXR1cm4gdXB0ci0+bV91c2VyOworICB9CisKKyAgdm9pZCBJbml0TWVudSAoTkN1cnNlc01lbnVJdGVtKiBtZW51W10sCisJCSBib29sIHdpdGhfZnJhbWUsCisJCSBib29sIGF1dG9EZWxldGVJdGVtcyk7CisKKyAgaW5saW5lIHZvaWQgT25FcnJvciAoaW50IGVycikgY29uc3QgVEhST1dTKE5DdXJzZXNNZW51RXhjZXB0aW9uKSB7CisgICAgaWYgKGVyciAhPSBFX09LKQorICAgICAgVEhST1cobmV3IE5DdXJzZXNNZW51RXhjZXB0aW9uICh0aGlzLCBlcnIpKTsKKyAgfQorCisgIC8vIHRoaXMgd3JhcHMgdGhlIG1lbnVfZHJpdmVyIGNhbGwuCisgIHZpcnR1YWwgaW50IGRyaXZlciAoaW50IGMpIDsKKworICAvLyAnSW50ZXJuYWwnIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIG1lbnUgd2l0aG91dCBhc3NvY2lhdGlvbiB0bworICAvLyBhbiBhcnJheSBvZiBpdGVtcy4KKyAgTkN1cnNlc01lbnUoIGludCAgbmxpbmVzLAorCSAgICAgICBpbnQgIG5jb2xzLAorCSAgICAgICBpbnQgIGJlZ2luX3kgPSAwLAorCSAgICAgICBpbnQgIGJlZ2luX3ggPSAwKQorICAgIDogTkN1cnNlc1BhbmVsKG5saW5lcyxuY29scyxiZWdpbl95LGJlZ2luX3gpLAorICAgICAgbWVudSAoU1RBVElDX0NBU1QoTUVOVSopKDApKSwKKyAgICAgIHN1YigwKSwKKyAgICAgIGJfc3ViX293bmVyKDApLAorICAgICAgYl9mcmFtZWQoMCksCisgICAgICBiX2F1dG9EZWxldGUoMCksCisgICAgICBteV9pdGVtcygwKQorICB7CisgIH0KKworcHVibGljOgorICAvLyBNYWtlIGEgZnVsbCB3aW5kb3cgc2l6ZSBtZW51CisgIE5DdXJzZXNNZW51IChOQ3Vyc2VzTWVudUl0ZW0qIEl0ZW1zW10sCisJICAgICAgIGJvb2wgd2l0aF9mcmFtZT1GQUxTRSwgICAgICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIGEgZnJhbWU/CisJICAgICAgIGJvb2wgYXV0b0RlbGV0ZV9JdGVtcz1GQUxTRSkgIC8vIEF1dG9jbGVhbnVwIG9mIEl0ZW1zPworICAgIDogTkN1cnNlc1BhbmVsKCksCisgICAgICBtZW51KDApLAorICAgICAgc3ViKDApLAorICAgICAgYl9zdWJfb3duZXIoMCksCisgICAgICBiX2ZyYW1lZCgwKSwKKyAgICAgIGJfYXV0b0RlbGV0ZSgwKSwKKyAgICAgIG15X2l0ZW1zKDApCisgIHsKKyAgICAgIEluaXRNZW51KEl0ZW1zLCB3aXRoX2ZyYW1lLCBhdXRvRGVsZXRlX0l0ZW1zKTsKKyAgfQorCisgIC8vIE1ha2UgYSBtZW51IHdpdGggYSB3aW5kb3cgb2YgdGhpcyBzaXplLgorICBOQ3Vyc2VzTWVudSAoTkN1cnNlc01lbnVJdGVtKiBJdGVtc1tdLAorCSAgICAgICBpbnQgIG5saW5lcywKKwkgICAgICAgaW50ICBuY29scywKKwkgICAgICAgaW50ICBiZWdpbl95ID0gMCwKKwkgICAgICAgaW50ICBiZWdpbl94ID0gMCwKKwkgICAgICAgYm9vbCB3aXRoX2ZyYW1lPUZBTFNFLCAgICAgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgYSBmcmFtZT8KKwkgICAgICAgYm9vbCBhdXRvRGVsZXRlX0l0ZW1zPUZBTFNFKSAgLy8gQXV0b2NsZWFudXAgb2YgSXRlbXM/CisgICAgOiBOQ3Vyc2VzUGFuZWwobmxpbmVzLCBuY29scywgYmVnaW5feSwgYmVnaW5feCksCisgICAgICBtZW51KDApLAorICAgICAgc3ViKDApLAorICAgICAgYl9zdWJfb3duZXIoMCksCisgICAgICBiX2ZyYW1lZCgwKSwKKyAgICAgIGJfYXV0b0RlbGV0ZSgwKSwKKyAgICAgIG15X2l0ZW1zKDApCisgIHsKKyAgICAgIEluaXRNZW51KEl0ZW1zLCB3aXRoX2ZyYW1lLCBhdXRvRGVsZXRlX0l0ZW1zKTsKKyAgfQorCisgIE5DdXJzZXNNZW51JiBvcGVyYXRvcj0oY29uc3QgTkN1cnNlc01lbnUmIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgICAgTkN1cnNlc1BhbmVsOjpvcGVyYXRvcj0ocmhzKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTkN1cnNlc01lbnUoY29uc3QgTkN1cnNlc01lbnUmIHJocykKKyAgICA6IE5DdXJzZXNQYW5lbChyaHMpLAorICAgICAgbWVudShyaHMubWVudSksCisgICAgICBzdWIocmhzLnN1YiksCisgICAgICBiX3N1Yl9vd25lcihyaHMuYl9zdWJfb3duZXIpLAorICAgICAgYl9mcmFtZWQocmhzLmJfZnJhbWVkKSwKKyAgICAgIGJfYXV0b0RlbGV0ZShyaHMuYl9hdXRvRGVsZXRlKSwKKyAgICAgIG15X2l0ZW1zKHJocy5teV9pdGVtcykKKyAgeworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc01lbnUgKCk7CisKKyAgLy8gUmV0cmlldmUgdGhlIG1lbnVzIHN1YndpbmRvdworICBpbmxpbmUgTkN1cnNlc1dpbmRvdyYgc3ViV2luZG93KCkgY29uc3QgeworICAgIGFzc2VydChzdWIhPU5VTEwpOworICAgIHJldHVybiAqc3ViOworICB9CisKKyAgLy8gU2V0IHRoZSBtZW51cyBzdWJ3aW5kb3cKKyAgdm9pZCBzZXRTdWJXaW5kb3coTkN1cnNlc1dpbmRvdyYgc3ViKTsKKworICAvLyBTZXQgdGhlc2UgaXRlbXMgZm9yIHRoZSBtZW51CisgIGlubGluZSB2b2lkIHNldEl0ZW1zKE5DdXJzZXNNZW51SXRlbSogSXRlbXNbXSkgeworICAgIE9uRXJyb3IoOjpzZXRfbWVudV9pdGVtcyhtZW51LG1hcEl0ZW1zKEl0ZW1zKSkpOworICB9CisKKyAgLy8gUmVtb3ZlIHRoZSBtZW51IGZyb20gdGhlIHNjcmVlbgorICBpbmxpbmUgdm9pZCB1bnBvc3QgKHZvaWQpIHsKKyAgICBPbkVycm9yICg6OnVucG9zdF9tZW51IChtZW51KSk7CisgIH0KKworICAvLyBQb3N0IHRoZSBtZW51IHRvIHRoZSBzY3JlZW4gaWYgZmxhZyBpcyB0cnVlLCB1bnBvc3QgaXQgb3RoZXJ3aXNlCisgIGlubGluZSB2b2lkIHBvc3QoYm9vbCBmbGFnID0gVFJVRSkgeworICAgIGZsYWcgPyBPbkVycm9yICg6OnBvc3RfbWVudShtZW51KSkgOiBPbkVycm9yICg6OnVucG9zdF9tZW51IChtZW51KSk7CisgIH0KKworICAvLyBHZXQgdGhlIG51bWVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgZm9yIHRoaXMgbWVudQorICBpbmxpbmUgdm9pZCBzY2FsZSAoaW50JiBtcm93cywgaW50JiBtY29scykgY29uc3QgIHsKKyAgICBPbkVycm9yICg6OnNjYWxlX21lbnUgKG1lbnUsICZtcm93cywgJm1jb2xzKSk7CisgIH0KKworICAvLyBTZXQgdGhlIGZvcm1hdCBvZiB0aGlzIG1lbnUKKyAgaW5saW5lIHZvaWQgc2V0X2Zvcm1hdChpbnQgbXJvd3MsIGludCBtY29scykgeworICAgIE9uRXJyb3IgKDo6c2V0X21lbnVfZm9ybWF0KG1lbnUsIG1yb3dzLCBtY29scykpOworICB9CisKKyAgLy8gR2V0IHRoZSBmb3JtYXQgb2YgdGhpcyBtZW51CisgIGlubGluZSB2b2lkIG1lbnVfZm9ybWF0KGludCYgcm93cyxpbnQmIG5jb2xzKSB7CisgICAgOjptZW51X2Zvcm1hdChtZW51LCZyb3dzLCZuY29scyk7CisgIH0KKworICAvLyBJdGVtcyBvZiB0aGUgbWVudQorICBpbmxpbmUgTkN1cnNlc01lbnVJdGVtKiBpdGVtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKm15X2l0ZW1zOworICB9CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhpcyBtZW51CisgIGlubGluZSBpbnQgY291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6aXRlbV9jb3VudChtZW51KTsKKyAgfQorCisgIC8vIEdldCB0aGUgY3VycmVudCBpdGVtIChpLmUuIHRoZSBvbmUgdGhlIGN1cnNvciBpcyBsb2NhdGVkKQorICBpbmxpbmUgTkN1cnNlc01lbnVJdGVtKiBjdXJyZW50X2l0ZW0oKSBjb25zdCB7CisgICAgcmV0dXJuIG15X2l0ZW1zWzo6aXRlbV9pbmRleCg6OmN1cnJlbnRfaXRlbShtZW51KSldOworICB9CisKKyAgLy8gR2V0IHRoZSBtYXJrZXIgc3RyaW5nCisgIGlubGluZSBjb25zdCBjaGFyKiBtYXJrKCkgY29uc3QgeworICAgIHJldHVybiA6Om1lbnVfbWFyayhtZW51KTsKKyAgfQorCisgIC8vIFNldCB0aGUgbWFya2VyIHN0cmluZworICBpbmxpbmUgdm9pZCBzZXRfbWFyayhjb25zdCBjaGFyICptYXJrZXIpIHsKKyAgICBPbkVycm9yICg6OnNldF9tZW51X21hcmsgKG1lbnUsIG1hcmtlcikpOworICB9CisKKyAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0IGNvZGUgYworICBpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIqIHJlcXVlc3RfbmFtZShpbnQgYykgeworICAgIHJldHVybiA6Om1lbnVfcmVxdWVzdF9uYW1lKGMpOworICB9CisKKyAgLy8gR2V0IHRoZSBjdXJyZW50IHBhdHRlcm4KKyAgaW5saW5lIGNoYXIqIHBhdHRlcm4oKSBjb25zdCB7CisgICAgcmV0dXJuIDo6bWVudV9wYXR0ZXJuKG1lbnUpOworICB9CisKKyAgLy8gdHJ1ZSBpZiB0aGVyZSBpcyBhIHBhdHRlcm4gbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBzZXRfcGF0dGVybiAoY29uc3QgY2hhciAqcGF0KTsKKworICAvLyBzZXQgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIG1lbnUKKyAgLy8gaS5lLiBzZXQgZm9yZSwgYmFjayBhbmQgZ3JleSBhdHRyaWJ1dGUKKyAgdmlydHVhbCB2b2lkIHNldERlZmF1bHRBdHRyaWJ1dGVzKCk7CisKKyAgLy8gR2V0IHRoZSBtZW51cyBiYWNrZ3JvdW5kIGF0dHJpYnV0ZXMKKyAgaW5saW5lIGNodHlwZSBiYWNrKCkgY29uc3QgeworICAgIHJldHVybiA6Om1lbnVfYmFjayhtZW51KTsKKyAgfQorCisgIC8vIEdldCB0aGUgbWVudXMgZm9yZWdyb3VuZCBhdHRyaWJ1dGVzCisgIGlubGluZSBjaHR5cGUgZm9yZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjptZW51X2ZvcmUobWVudSk7CisgIH0KKworICAvLyBHZXQgdGhlIG1lbnVzIGdyZXkgYXR0cmlidXRlcyAodXNlZCBmb3IgdW5zZWxlY3RhYmxlIGl0ZW1zKQorICBpbmxpbmUgY2h0eXBlIGdyZXkoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6bWVudV9ncmV5KG1lbnUpOworICB9CisKKyAgLy8gU2V0IHRoZSBtZW51cyBiYWNrZ3JvdW5kIGF0dHJpYnV0ZXMKKyAgaW5saW5lIGNodHlwZSBzZXRfYmFja2dyb3VuZChjaHR5cGUgYSkgeworICAgIHJldHVybiA6OnNldF9tZW51X2JhY2sobWVudSxhKTsKKyAgfQorCisgIC8vIFNldCB0aGUgbWVudXMgZm9yZWdyb3VuZCBhdHRyaWJ1dGVzCisgIGlubGluZSBjaHR5cGUgc2V0X2ZvcmVncm91bmQoY2h0eXBlIGEpIHsKKyAgICByZXR1cm4gOjpzZXRfbWVudV9mb3JlKG1lbnUsYSk7CisgIH0KKworICAvLyBTZXQgdGhlIG1lbnVzIGdyZXkgYXR0cmlidXRlcyAodXNlZCBmb3IgdW5zZWxlY3RhYmxlIGl0ZW1zKQorICBpbmxpbmUgY2h0eXBlIHNldF9ncmV5KGNodHlwZSBhKSB7CisgICAgcmV0dXJuIDo6c2V0X21lbnVfZ3JleShtZW51LGEpOworICB9CisKKyAgaW5saW5lIHZvaWQgb3B0aW9uc19vbiAoTWVudV9PcHRpb25zIG9wdHMpIHsKKyAgICBPbkVycm9yICg6Om1lbnVfb3B0c19vbiAobWVudSxvcHRzKSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBvcHRpb25zX29mZihNZW51X09wdGlvbnMgb3B0cykgeworICAgIE9uRXJyb3IgKDo6bWVudV9vcHRzX29mZihtZW51LG9wdHMpKTsKKyAgfQorCisgIGlubGluZSBNZW51X09wdGlvbnMgb3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gOjptZW51X29wdHMobWVudSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBzZXRfb3B0aW9ucyAoTWVudV9PcHRpb25zIG9wdHMpIHsKKyAgICBPbkVycm9yICg6OnNldF9tZW51X29wdHMgKG1lbnUsb3B0cykpOworICB9CisKKyAgaW5saW5lIGludCBwYWQoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6bWVudV9wYWQobWVudSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBzZXRfcGFkIChpbnQgcGFkY2gpIHsKKyAgICBPbkVycm9yICg6OnNldF9tZW51X3BhZCAobWVudSwgcGFkY2gpKTsKKyAgfQorCisgIC8vIFBvc2l0aW9uIHRoZSBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgaXRlbQorICBpbmxpbmUgdm9pZCBwb3NpdGlvbl9jdXJzb3IgKCkgY29uc3QgeworICAgIE9uRXJyb3IgKDo6cG9zX21lbnVfY3Vyc29yIChtZW51KSk7CisgIH0KKworICAvLyBTZXQgdGhlIGN1cnJlbnQgaXRlbQorICBpbmxpbmUgdm9pZCBzZXRfY3VycmVudChOQ3Vyc2VzTWVudUl0ZW0mIEkpIHsKKyAgICBPbkVycm9yICg6OnNldF9jdXJyZW50X2l0ZW0obWVudSwgSS5pdGVtKSk7CisgIH0KKworICAvLyBHZXQgdGhlIGN1cnJlbnQgdG9wIHJvdyBvZiB0aGUgbWVudQorICBpbmxpbmUgaW50IHRvcF9yb3cgKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gOjp0b3Bfcm93IChtZW51KTsKKyAgfQorCisgIC8vIFNldCB0aGUgY3VycmVudCB0b3Agcm93IG9mIHRoZSBtZW51CisgIGlubGluZSB2b2lkIHNldF90b3Bfcm93IChpbnQgcm93KSB7CisgICAgT25FcnJvciAoOjpzZXRfdG9wX3JvdyAobWVudSwgcm93KSk7CisgIH0KKworICAvLyBzcGFjaW5nIGNvbnRyb2wKKyAgLy8gU2V0IHRoZSBzcGFjaW5nIGZvciB0aGUgbWVudQorICBpbmxpbmUgdm9pZCBzZXRTcGFjaW5nKGludCBzcGNfZGVzY3JpcHRpb24sCisJCQkgaW50IHNwY19yb3dzLAorCQkJIGludCBzcGNfY29sdW1ucykgeworICAgIE9uRXJyb3IoOjpzZXRfbWVudV9zcGFjaW5nKG1lbnUsCisJCQkgICAgICAgc3BjX2Rlc2NyaXB0aW9uLAorCQkJICAgICAgIHNwY19yb3dzLAorCQkJICAgICAgIHNwY19jb2x1bW5zKSk7CisgIH0KKworICAvLyBHZXQgdGhlIHNwYWNpbmcgaW5mbyBmb3IgdGhlIG1lbnUKKyAgaW5saW5lIHZvaWQgU3BhY2luZyhpbnQmIHNwY19kZXNjcmlwdGlvbiwKKwkJICAgICAgaW50JiBzcGNfcm93cywKKwkJICAgICAgaW50JiBzcGNfY29sdW1ucykgY29uc3QgeworICAgIE9uRXJyb3IoOjptZW51X3NwYWNpbmcobWVudSwKKwkJCSAgICZzcGNfZGVzY3JpcHRpb24sCisJCQkgICAmc3BjX3Jvd3MsCisJCQkgICAmc3BjX2NvbHVtbnMpKTsKKyAgfQorCisgIC8vIERlY29yYXRpb25zCisgIGlubGluZSB2b2lkIGZyYW1lKGNvbnN0IGNoYXIgKnRpdGxlPU5VTEwsIGNvbnN0IGNoYXIqIGJ0aXRsZT1OVUxMKSB7CisgICAgaWYgKGJfZnJhbWVkKQorICAgICAgTkN1cnNlc1BhbmVsOjpmcmFtZSh0aXRsZSxidGl0bGUpOworICAgIGVsc2UKKyAgICAgIE9uRXJyb3IoRV9TWVNURU1fRVJST1IpOworICB9CisKKyAgaW5saW5lIHZvaWQgYm9sZGZyYW1lKGNvbnN0IGNoYXIgKnRpdGxlPU5VTEwsIGNvbnN0IGNoYXIqIGJ0aXRsZT1OVUxMKSB7CisgICAgaWYgKGJfZnJhbWVkKQorICAgICAgTkN1cnNlc1BhbmVsOjpib2xkZnJhbWUodGl0bGUsYnRpdGxlKTsKKyAgICBlbHNlCisgICAgICBPbkVycm9yKEVfU1lTVEVNX0VSUk9SKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGxhYmVsKGNvbnN0IGNoYXIgKnRvcExhYmVsLCBjb25zdCBjaGFyICpib3R0b21MYWJlbCkgeworICAgIGlmIChiX2ZyYW1lZCkKKyAgICAgIE5DdXJzZXNQYW5lbDo6bGFiZWwodG9wTGFiZWwsYm90dG9tTGFiZWwpOworICAgIGVsc2UKKyAgICAgIE9uRXJyb3IoRV9TWVNURU1fRVJST1IpOworICB9CisKKyAgLy8gLS0tLS0KKyAgLy8gSG9va3MKKyAgLy8gLS0tLS0KKworICAvLyBDYWxsZWQgYWZ0ZXIgdGhlIG1lbnUgZ2V0cyByZXBvc2l0aW9uZWQgaW4gaXRzIHdpbmRvdy4KKyAgLy8gVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgaWYgdGhlIG1lbnUgaXMgcG9zdGVkLgorICB2aXJ0dWFsIHZvaWQgT25fTWVudV9Jbml0KCk7CisKKyAgLy8gQ2FsbGVkIGJlZm9yZSB0aGUgbWVudSBnZXRzIHJlcG9zaXRpb25lZCBpbiBpdHMgd2luZG93LgorICAvLyBUaGlzIGlzIGVzcGVjaWFsbHkgdHJ1ZSBpZiB0aGUgbWVudSBpcyB1bnBvc3RlZC4KKyAgdmlydHVhbCB2b2lkIE9uX01lbnVfVGVybWluYXRpb24oKTsKKworICAvLyBDYWxsZWQgYWZ0ZXIgdGhlIGl0ZW0gYmVjYW1lIHRoZSBjdXJyZW50IGl0ZW0KKyAgdmlydHVhbCB2b2lkIE9uX0l0ZW1fSW5pdChOQ3Vyc2VzTWVudUl0ZW0mIGl0ZW0pOworCisgIC8vIENhbGxlZCBiZWZvcmUgdGhpcyBpdGVtIGlzIGxlZnQgYXMgY3VycmVudCBpdGVtLgorICB2aXJ0dWFsIHZvaWQgT25fSXRlbV9UZXJtaW5hdGlvbihOQ3Vyc2VzTWVudUl0ZW0mIGl0ZW0pOworCisgIC8vIFByb3ZpZGUgYSBkZWZhdWx0IGtleSB2aXJ0dWFsaXphdGlvbi4gVHJhbnNsYXRlIHRoZSBrZXlib2FyZAorICAvLyBjb2RlIGMgaW50byBhIG1lbnUgcmVxdWVzdCBjb2RlLgorICAvLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBhIGhvcGVmdWxseSBzdHJhaWdodGZvcndhcmQKKyAgLy8gbWFwcGluZyBmb3IgdGhlIG1vc3QgY29tbW9uIGtleXN0cm9rZXMgYW5kIG1lbnUgcmVxdWVzdHMuCisgIHZpcnR1YWwgaW50IHZpcnR1YWxpemUoaW50IGMpOworCisKKyAgLy8gT3BlcmF0b3JzCisgIGlubGluZSBOQ3Vyc2VzTWVudUl0ZW0qIG9wZXJhdG9yW10oaW50IGkpIGNvbnN0IHsKKyAgICBpZiAoIChpIDwgMCkgfHwgKGkgPj0gOjppdGVtX2NvdW50IChtZW51KSkgKQorICAgICAgT25FcnJvciAoRV9CQURfQVJHVU1FTlQpOworICAgIHJldHVybiAobXlfaXRlbXNbaV0pOworICB9CisKKyAgLy8gUGVyZm9ybSB0aGUgbWVudSdzIG9wZXJhdGlvbgorICAvLyBSZXR1cm4gdGhlIGl0ZW0gd2hlcmUgeW91IGxlZnQgdGhlIHNlbGVjdGlvbiBtYXJrIGZvciBhIHNpbmdsZQorICAvLyBzZWxlY3Rpb24gbWVudSwgb3IgTlVMTCBmb3IgYSBtdWx0aXZhbHVlZCBtZW51LgorICB2aXJ0dWFsIE5DdXJzZXNNZW51SXRlbSogb3BlcmF0b3IoKSh2b2lkKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBFeGNlcHRpb24gaGFuZGxlcnMKKyAgLy8gQ2FsbGVkIGJ5IG9wZXJhdG9yKCkKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBDYWxsZWQgaWYgdGhlIHJlcXVlc3QgaXMgZGVuaWVkCisgIHZpcnR1YWwgdm9pZCBPbl9SZXF1ZXN0X0RlbmllZChpbnQgYykgY29uc3Q7CisKKyAgLy8gQ2FsbGVkIGlmIHRoZSBpdGVtIGlzIG5vdCBzZWxlY3RhYmxlCisgIHZpcnR1YWwgdm9pZCBPbl9Ob3RfU2VsZWN0YWJsZShpbnQgYykgY29uc3Q7CisKKyAgLy8gQ2FsbGVkIGlmIHBhdHRlcm4gZG9lc24ndCBtYXRjaAorICB2aXJ0dWFsIHZvaWQgT25fTm9fTWF0Y2goaW50IGMpIGNvbnN0OworCisgIC8vIENhbGxlZCBpZiB0aGUgY29tbWFuZCBpcyB1bmtub3duCisgIHZpcnR1YWwgdm9pZCBPbl9Vbmtub3duX0NvbW1hbmQoaW50IGMpIGNvbnN0OworCit9OworLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoaXMgaXMgdGhlIHR5cGljYWwgQysrIHR5cGVzYWZlIHdheSB0byBhbGxvdyB0byBhdHRhY2gKKy8vIHVzZXIgZGF0YSB0byBhbiBpdGVtIG9mIGEgbWVudS4gSXRzIGFzc3VtZWQgdGhhdCB0aGUgdXNlcgorLy8gZGF0YSBiZWxvbmdzIHRvIHNvbWUgY2xhc3MgVC4gVXNlIFQgYXMgdGVtcGxhdGUgYXJndW1lbnQKKy8vIHRvIGNyZWF0ZSBhIFVzZXJJdGVtLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNVc2VySXRlbSA6IHB1YmxpYyBOQ3Vyc2VzTWVudUl0ZW0KK3sKK3B1YmxpYzoKKyAgTkN1cnNlc1VzZXJJdGVtIChjb25zdCBjaGFyKiBwX25hbWUsCisJCSAgIGNvbnN0IGNoYXIqIHBfZGVzY3JpcHQgPSBOVUxMLAorCQkgICBjb25zdCBUKiBwX1VzZXJEYXRhICAgID0gU1RBVElDX0NBU1QoVCopKDApKQorICAgIDogTkN1cnNlc01lbnVJdGVtIChwX25hbWUsIHBfZGVzY3JpcHQpIHsKKyAgICAgIGlmIChpdGVtKQorCU9uRXJyb3IgKDo6c2V0X2l0ZW1fdXNlcnB0ciAoaXRlbSwgY29uc3RfY2FzdDx2b2lkICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBfVXNlckRhdGEpKSkpOworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc1VzZXJJdGVtKCkge30KKworICBpbmxpbmUgY29uc3QgVCogVXNlckRhdGEgKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oOjppdGVtX3VzZXJwdHIgKGl0ZW0pKTsKKyAgfTsKKworICBpbmxpbmUgdmlydHVhbCB2b2lkIHNldFVzZXJEYXRhKGNvbnN0IFQqIHBfVXNlckRhdGEpIHsKKyAgICBpZiAoaXRlbSkKKyAgICAgIE9uRXJyb3IgKDo6c2V0X2l0ZW1fdXNlcnB0ciAoaXRlbSwgY29uc3RfY2FzdDx2b2lkICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCAqPihwX1VzZXJEYXRhKSkpKTsKKyAgfQorfTsKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgc2FtZSBtZWNoYW5pc20gaXMgdXNlZCB0byBhdHRhY2ggdXNlciBkYXRhIHRvIGEgbWVudQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNVc2VyTWVudSA6IHB1YmxpYyBOQ3Vyc2VzTWVudQoreworcHJvdGVjdGVkOgorICBOQ3Vyc2VzVXNlck1lbnUoIGludCAgbmxpbmVzLAorCQkgICBpbnQgIG5jb2xzLAorCQkgICBpbnQgIGJlZ2luX3kgPSAwLAorCQkgICBpbnQgIGJlZ2luX3ggPSAwLAorCQkgICBjb25zdCBUKiBwX1VzZXJEYXRhID0gU1RBVElDX0NBU1QoVCopKDApKQorICAgIDogTkN1cnNlc01lbnUobmxpbmVzLG5jb2xzLGJlZ2luX3ksYmVnaW5feCkgeworICAgICAgaWYgKG1lbnUpCisJc2V0X3VzZXIgKGNvbnN0X2Nhc3Q8dm9pZCAqPihwX1VzZXJEYXRhKSk7CisgIH0KKworcHVibGljOgorICBOQ3Vyc2VzVXNlck1lbnUgKE5DdXJzZXNNZW51SXRlbSBJdGVtc1tdLAorCQkgICBjb25zdCBUKiBwX1VzZXJEYXRhID0gU1RBVElDX0NBU1QoVCopKDApLAorCQkgICBib29sIHdpdGhfZnJhbWU9RkFMU0UsCisJCSAgIGJvb2wgYXV0b0RlbGV0ZV9JdGVtcz1GQUxTRSkKKyAgICA6IE5DdXJzZXNNZW51IChJdGVtcywgd2l0aF9mcmFtZSwgYXV0b0RlbGV0ZV9JdGVtcykgeworICAgICAgaWYgKG1lbnUpCisJc2V0X3VzZXIgKGNvbnN0X2Nhc3Q8dm9pZCAqPihwX1VzZXJEYXRhKSk7CisgIH07CisKKyAgTkN1cnNlc1VzZXJNZW51IChOQ3Vyc2VzTWVudUl0ZW0gSXRlbXNbXSwKKwkJICAgaW50IG5saW5lcywKKwkJICAgaW50IG5jb2xzLAorCQkgICBpbnQgYmVnaW5feSA9IDAsCisJCSAgIGludCBiZWdpbl94ID0gMCwKKwkJICAgY29uc3QgVCogcF9Vc2VyRGF0YSA9IFNUQVRJQ19DQVNUKFQqKSgwKSwKKwkJICAgYm9vbCB3aXRoX2ZyYW1lPUZBTFNFKQorICAgIDogTkN1cnNlc01lbnUgKEl0ZW1zLCBubGluZXMsIG5jb2xzLCBiZWdpbl95LCBiZWdpbl94LCB3aXRoX2ZyYW1lKSB7CisgICAgICBpZiAobWVudSkKKwlzZXRfdXNlciAoY29uc3RfY2FzdDx2b2lkICo+KHBfVXNlckRhdGEpKTsKKyAgfTsKKworICB2aXJ0dWFsIH5OQ3Vyc2VzVXNlck1lbnUoKSB7CisgIH07CisKKyAgaW5saW5lIFQqIFVzZXJEYXRhICh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGdldF91c2VyICgpKTsKKyAgfTsKKworICBpbmxpbmUgdmlydHVhbCB2b2lkIHNldFVzZXJEYXRhIChjb25zdCBUKiBwX1VzZXJEYXRhKSB7CisgICAgaWYgKG1lbnUpCisgICAgICBzZXRfdXNlciAoY29uc3RfY2FzdDx2b2lkICo+KHBfVXNlckRhdGEpKTsKKyAgfQorfTsKKworI2VuZGlmIC8qIE5DVVJTRVNfQ1VSU0VTTV9IX2luY2wgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2M2Q2ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzcC5oCkBAIC0wLDAgKzEsMjY4IEBACisvLyAqIFRoaXMgbWFrZXMgZW1hY3MgaGFwcHkgLSotTW9kZTogQysrOy0qLQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3LDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQXV0aG9yOiBKdWVyZ2VuIFBmZWlmZXIsIDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBOQ1VSU0VTX0NVUlNFU1BfSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfQ1VSU0VTUF9IX2luY2wgMQorCisvLyAkSWQ6IGN1cnNlc3AuaCx2IDEuMjkgMjAwOC8wOC8xNiAxNzoyMDoyMyB0b20gRXhwICQKKworI2luY2x1ZGUgPGN1cnNlc3cuaD4KKworZXh0ZXJuICJDIiB7CisjICBpbmNsdWRlIDxwYW5lbC5oPgorfQorCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzUGFuZWwKKyAgOiBwdWJsaWMgTkN1cnNlc1dpbmRvdworeworcHJvdGVjdGVkOgorICBQQU5FTCAqcDsKKyAgc3RhdGljIE5DdXJzZXNQYW5lbCAqZHVtbXk7CisKK3ByaXZhdGU6CisgIC8vIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIHRoZSBwYW5lbCdzIHVzZXIgZGF0YSBmaWVsZCB0byBsaW5rIHRoZQorICAvLyBQQU5FTCogdG8gdGhlIEMrKyBvYmplY3QgYW5kIHRvIHByb3ZpZGUgZXh0cmEgc3BhY2UgZm9yIGEgdXNlciBwb2ludGVyLgorICB0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCogICAgICAgICAgICAgICBtX3VzZXI7ICAgICAgLy8gdGhlIHBvaW50ZXIgZm9yIHRoZSB1c2VyJ3MgZGF0YQorICAgIGNvbnN0IE5DdXJzZXNQYW5lbCogbV9iYWNrOyAgICAgIC8vIGJhY2t3YXJkIHBvaW50ZXIgdG8gQysrIG9iamVjdAorICAgIGNvbnN0IFBBTkVMKiAgICAgICAgbV9vd25lcjsgICAgIC8vIHRoZSBwYW5lbCBpdHNlbGYKKyAgfSBVc2VySG9vazsKKworICBpbmxpbmUgVXNlckhvb2sgKlVzZXJQb2ludGVyKCkKKyAgeworICAgIFVzZXJIb29rKiB1cHRyID0gcmVpbnRlcnByZXRfY2FzdDxVc2VySG9vayo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkICo+KDo6cGFuZWxfdXNlcnB0ciAocCkpKTsKKyAgICByZXR1cm4gdXB0cjsKKyAgfQorCisgIHZvaWQgaW5pdCgpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGFuZWwgb2JqZWN0CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBzZXRfdXNlcih2b2lkICp1c2VyKQorICB7CisgICAgVXNlckhvb2sqIHVwdHIgPSBVc2VyUG9pbnRlcigpOworICAgIGlmICh1cHRyICE9IDAgJiYgdXB0ci0+bV9iYWNrPT10aGlzICYmIHVwdHItPm1fb3duZXI9PXApIHsKKyAgICAgIHVwdHItPm1fdXNlciA9IHVzZXI7CisgICAgfQorICB9CisgIC8vIFNldCB0aGUgdXNlciBwb2ludGVyIG9mIHRoZSBwYW5lbC4KKworICB2b2lkICpnZXRfdXNlcigpCisgIHsKKyAgICBVc2VySG9vayogdXB0ciA9IFVzZXJQb2ludGVyKCk7CisgICAgdm9pZCAqcmVzdWx0ID0gMDsKKyAgICBpZiAodXB0ciAhPSAwICYmIHVwdHItPm1fYmFjaz09dGhpcyAmJiB1cHRyLT5tX293bmVyPT1wKQorICAgICAgcmVzdWx0ID0gdXB0ci0+bV91c2VyOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICB2b2lkIE9uRXJyb3IgKGludCBlcnIpIGNvbnN0IFRIUk9XUyhOQ3Vyc2VzUGFuZWxFeGNlcHRpb24pCisgIHsKKyAgICBpZiAoZXJyPT1FUlIpCisgICAgICBUSFJPVyhuZXcgTkN1cnNlc1BhbmVsRXhjZXB0aW9uICh0aGlzLCBlcnIpKTsKKyAgfQorICAvLyBJZiBlcnIgaXMgZXF1YWwgdG8gdGhlIGN1cnNlcyBlcnJvciBpbmRpY2F0b3IgRVJSLCBhbiBlcnJvciBoYW5kbGVyCisgIC8vIGlzIGNhbGxlZC4KKworICAvLyBHZXQgYSBrZXlzdHJva2UuIERlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgZ2V0Y2goKQorICB2aXJ0dWFsIGludCBnZXRLZXkodm9pZCk7CisKK3B1YmxpYzoKKyAgTkN1cnNlc1BhbmVsKGludCBubGluZXMsCisJICAgICAgIGludCBuY29scywKKwkgICAgICAgaW50IGJlZ2luX3kgPSAwLAorCSAgICAgICBpbnQgYmVnaW5feCA9IDApCisgICAgOiBOQ3Vyc2VzV2luZG93KG5saW5lcyxuY29scyxiZWdpbl95LGJlZ2luX3gpLCBwKDApCisgIHsKKyAgICBpbml0KCk7CisgIH0KKyAgLy8gQ3JlYXRlIGEgcGFuZWwgd2l0aCB0aGlzIHNpemUgc3RhcnRpbmcgYXQgdGhlIHJlcXVlc3RlZCBwb3NpdGlvbi4KKworICBOQ3Vyc2VzUGFuZWwoKQorICAgIDogTkN1cnNlc1dpbmRvdyg6OnN0ZHNjciksIHAoMCkKKyAgeworICAgIGluaXQoKTsKKyAgfQorICAvLyBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgdGhlIGRlZmF1bHQgUGFuZWwgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAvLyA6OnN0ZHNjciB3aW5kb3cKKworICBOQ3Vyc2VzUGFuZWwmIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzUGFuZWwmIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgICAgTkN1cnNlc1dpbmRvdzo6b3BlcmF0b3I9KHJocyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNQYW5lbChjb25zdCBOQ3Vyc2VzUGFuZWwmIHJocykKKyAgICA6IE5DdXJzZXNXaW5kb3cocmhzKSwKKyAgICAgIHAocmhzLnApCisgIHsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNQYW5lbCgpOworCisgIC8vIGJhc2ljIG1hbmlwdWxhdGlvbgorICBpbmxpbmUgdm9pZCBoaWRlKCkKKyAgeworICAgIE9uRXJyb3IgKDo6aGlkZV9wYW5lbChwKSk7CisgIH0KKyAgLy8gSGlkZSB0aGUgcGFuZWwuIEl0IHN0YXlzIGluIHRoZSBzdGFjayBidXQgYmVjb21lcyBpbnZpc2libGUuCisKKyAgaW5saW5lIHZvaWQgc2hvdygpCisgIHsKKyAgICBPbkVycm9yICg6OnNob3dfcGFuZWwocCkpOworICB9CisgIC8vIFNob3cgdGhlIHBhbmVsLCBpLmUuIG1ha2UgaXQgdmlzaWJsZS4KKworICBpbmxpbmUgdm9pZCB0b3AoKQorICB7CisgICAgT25FcnJvciAoOjp0b3BfcGFuZWwocCkpOworICB9CisgIC8vIE1ha2UgdGhpcyBwYW5lbCB0aGUgdG9wIHBhbmVsIGluIHRoZSBzdGFjay4KKworICBpbmxpbmUgdm9pZCBib3R0b20oKQorICB7CisgICAgT25FcnJvciAoOjpib3R0b21fcGFuZWwocCkpOworICB9CisgIC8vIE1ha2UgdGhpcyBwYW5lbCB0aGUgYm90dG9tIHBhbmVsIGluIHRoZSBzdGFjay4KKyAgLy8gTi5CLjogVGhlIHBhbmVsIGFzc29jaWF0ZWQgd2l0aCA6OnN0ZHNjciBpcyBhbHdheXMgb24gdGhlIGJvdHRvbS4gU28KKyAgLy8gYWN0dWFsbHkgYm90dG9tKCkgbWFrZXMgdGhlIHBhbmVsIHRoZSBmaXJzdCBhYm92ZSA6OnN0ZHNjci4KKworICB2aXJ0dWFsIGludCBtdndpbihpbnQgeSwgaW50IHgpCisgIHsKKyAgICBPbkVycm9yKDo6bW92ZV9wYW5lbChwLCB5LCB4KSk7CisgICAgcmV0dXJuIE9LOworICB9CisKKyAgaW5saW5lIGJvb2wgaGlkZGVuKCkgY29uc3QKKyAgeworICAgIHJldHVybiAoOjpwYW5lbF9oaWRkZW4gKHApID8gVFJVRSA6IEZBTFNFKTsKKyAgfQorICAvLyBSZXR1cm4gVFJVRSBpZiB0aGUgcGFuZWwgaXMgaGlkZGVuLCBGQUxTRSBvdGhlcndpc2UuCisKKy8qIFRoZSBmdW5jdGlvbnMgcGFuZWxfYWJvdmUoKSBhbmQgcGFuZWxfYmVsb3coKSBhcmUgbm90IHJlZmxlY3RlZCBpbgorICAgdGhlIE5DdXJzZXNQYW5lbCBjbGFzcy4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcywgdGhhdCB3ZSBjYW5ub3QKKyAgIGFzc3VtZSB0aGF0IGEgcGFuZWwgcmV0cmlldmVkIGJ5IHRob3NlIG9wZXJhdGlvbnMgaXMgb25lIHdyYXBwZWQKKyAgIGJ5IGEgQysrIGNsYXNzLiBBbHRob3VnaCB0aGlzIHNpdHVhdGlvbiBtaWdodCBiZSBoYW5kbGVkLCB3ZSBhbHNvCisgICBuZWVkIGEgcmV2ZXJzZSBtYXBwaW5nIGZyb20gUEFORUwgdG8gTkN1cnNlc1BhbmVsIHdoaWNoIG5lZWRzIHNvbWUKKyAgIHJlZGVzaWduIG9mIHRoZSBsb3cgbGV2ZWwgc3R1ZmYuIEF0IHRoZSBtb21lbnQsIHdlIGRlZmluZSB0aGVtIGluIHRoZQorICAgaW50ZXJmYWNlIGJ1dCB0aGV5IHdpbGwgYWx3YXlzIHByb2R1Y2UgYW4gZXJyb3IuICovCisgIGlubGluZSBOQ3Vyc2VzUGFuZWwmIGFib3ZlKCkgY29uc3QKKyAgeworICAgIE9uRXJyb3IoRVJSKTsKKyAgICByZXR1cm4gKmR1bW15OworICB9CisKKyAgaW5saW5lIE5DdXJzZXNQYW5lbCYgYmVsb3coKSBjb25zdAorICB7CisgICAgT25FcnJvcihFUlIpOworICAgIHJldHVybiAqZHVtbXk7CisgIH0KKworICAvLyBUaG9zZSB0d28gYXJlIHJld3JpdGVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZpcnR1YWwgbWVtYmVycyBvZgorICAvLyBOQ3Vyc2VzV2luZG93CisgIHZpcnR1YWwgaW50IHJlZnJlc2goKTsKKyAgLy8gUHJvcGFnYXRlIGFsbCBwYW5lbCBjaGFuZ2VzIHRvIHRoZSB2aXJ0dWFsIHNjcmVlbiBhbmQgdXBkYXRlIHRoZQorICAvLyBwaHlzaWNhbCBzY3JlZW4uCisKKyAgdmlydHVhbCBpbnQgbm91dHJlZnJlc2goKTsKKyAgLy8gUHJvcGFnYXRlIGFsbCBwYW5lbCBjaGFuZ2VzIHRvIHRoZSB2aXJ0dWFsIHNjcmVlbi4KKworICBzdGF0aWMgdm9pZCByZWRyYXcoKTsKKyAgLy8gUmVkcmF3IGFsbCBwYW5lbHMuCisKKyAgLy8gZGVjb3JhdGlvbnMKKyAgdmlydHVhbCB2b2lkIGZyYW1lKGNvbnN0IGNoYXIqIHRpdGxlPU5VTEwsCisJCSAgICAgY29uc3QgY2hhciogYnRpdGxlPU5VTEwpOworICAvLyBQdXQgYSBmcmFtZSBhcm91bmQgdGhlIHBhbmVsIGFuZCBwdXQgdGhlIHRpdGxlIGNlbnRlcmVkIGluIHRoZSB0b3AgbGluZQorICAvLyBhbmQgYnRpdGxlIGluIHRoZSBib3R0b20gbGluZS4KKworICB2aXJ0dWFsIHZvaWQgYm9sZGZyYW1lKGNvbnN0IGNoYXIqIHRpdGxlPU5VTEwsCisJCQkgY29uc3QgY2hhciogYnRpdGxlPU5VTEwpOworICAvLyBTYW1lIGFzIGZyYW1lKCksIGJ1dCB1c2UgaGlnaGxpZ2h0ZWQgYXR0cmlidXRlcy4KKworICB2aXJ0dWFsIHZvaWQgbGFiZWwoY29uc3QgY2hhciogdG9wTGFiZWwsCisJCSAgICAgY29uc3QgY2hhciogYm90dG9tTGFiZWwpOworICAvLyBQdXQgdGhlIHRpdGxlIGNlbnRlcmVkIGluIHRoZSB0b3AgbGluZSBhbmQgYnRpdGxlIGluIHRoZSBib3R0b20gbGluZS4KKworICB2aXJ0dWFsIHZvaWQgY2VudGVydGV4dChpbnQgcm93LGNvbnN0IGNoYXIqIGxhYmVsKTsKKyAgLy8gUHV0IHRoZSBsYWJlbCB0ZXh0IGNlbnRlcmVkIGluIHRoZSBzcGVjaWZpZWQgcm93LgorfTsKKworLyogV2UgdXNlIHRlbXBsYXRlcyB0byBwcm92aWRlIGEgdHlwZXNhZmUgbWVjaGFuaXNtIHRvIGFzc29jaWF0ZQorICogdXNlciBkYXRhIHdpdGggYSBwYW5lbC4gQSBOQ3Vyc2VzVXNlclBhbmVsPFQ+IGlzIGEgcGFuZWwKKyAqIGFzc29jaWF0ZWQgd2l0aCBzb21lIHVzZXIgZGF0YSBvZiB0eXBlIFQuCisgKi8KK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIE5DdXJzZXNVc2VyUGFuZWwgOiBwdWJsaWMgTkN1cnNlc1BhbmVsCit7CitwdWJsaWM6CisgIE5DdXJzZXNVc2VyUGFuZWwgKGludCBubGluZXMsCisJCSAgICBpbnQgbmNvbHMsCisJCSAgICBpbnQgYmVnaW5feSA9IDAsCisJCSAgICBpbnQgYmVnaW5feCA9IDAsCisJCSAgICBjb25zdCBUKiBwX1VzZXJEYXRhID0gU1RBVElDX0NBU1QoVCopKDApKQorICAgIDogTkN1cnNlc1BhbmVsIChubGluZXMsIG5jb2xzLCBiZWdpbl95LCBiZWdpbl94KQorICB7CisgICAgICBpZiAocCkKKwlzZXRfdXNlciAoY29uc3RfY2FzdDx2b2lkICo+KHBfVXNlckRhdGEpKTsKKyAgfTsKKyAgLy8gVGhpcyBjcmVhdGVzIGFuIHVzZXIgcGFuZWwgb2YgdGhlIHJlcXVlc3RlZCBzaXplIHdpdGggYXNzb2NpYXRlZAorICAvLyB1c2VyIGRhdGEgcG9pbnRlZCB0byBieSBwX1VzZXJEYXRhLgorCisgIE5DdXJzZXNVc2VyUGFuZWwoY29uc3QgVCogcF9Vc2VyRGF0YSA9IFNUQVRJQ19DQVNUKFQqKSgwKSkgOiBOQ3Vyc2VzUGFuZWwoKQorICB7CisgICAgaWYgKHApCisgICAgICBzZXRfdXNlcihjb25zdF9jYXN0PHZvaWQgKj4ocF9Vc2VyRGF0YSkpOworICB9OworICAvLyBUaGlzIGNyZWF0ZXMgYW4gdXNlciBwYW5lbCBhc3NvY2lhdGVkIHdpdGggdGhlIDo6c3Rkc2NyIGFuZCB1c2VyIGRhdGEKKyAgLy8gcG9pbnRlZCB0byBieSBwX1VzZXJEYXRhLgorCisgIHZpcnR1YWwgfk5DdXJzZXNVc2VyUGFuZWwoKSB7fTsKKworICBUKiBVc2VyRGF0YSAodm9pZCkgY29uc3QKKyAgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihnZXRfdXNlciAoKSk7CisgIH07CisgIC8vIFJldHJpZXZlIHRoZSB1c2VyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYW5lbC4KKworICB2aXJ0dWFsIHZvaWQgc2V0VXNlckRhdGEgKGNvbnN0IFQqIHBfVXNlckRhdGEpCisgIHsKKyAgICBpZiAocCkKKyAgICAgIHNldF91c2VyIChjb25zdF9jYXN0PHZvaWQgKj4ocF9Vc2VyRGF0YSkpOworICB9CisgIC8vIEFzc29jaWF0ZSB0aGUgdXNlciBwYW5lbCB3aXRoIHRoZSB1c2VyIGRhdGEgcG9pbnRlZCB0byBieSBwX1VzZXJEYXRhLgorfTsKKworI2VuZGlmIC8qIE5DVVJTRVNfQ1VSU0VTUF9IX2luY2wgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2Vzdy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXN3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlOTIxYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2Vzdy5oCkBAIC0wLDAgKzEsMTU1NiBAQAorLy8gKiBUaGlzIG1ha2VzIGVtYWNzIGhhcHB5IC0qLU1vZGU6IEMrKzstKi0KKy8vIHZpbGU6Y3BwbW9kZQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3LDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBOQ1VSU0VTX0NVUlNFU1dfSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfQ1VSU0VTV19IX2luY2wgMQorCisvLyAkSWQ6IGN1cnNlc3cuaCx2IDEuNDggMjAwOC8wMS8xOSAyMTowOToxMCB0b20gRXhwICQKKworI2luY2x1ZGUgPGV0aXAuaD4KKworZXh0ZXJuICJDIiB7CisjICBpbmNsdWRlICAgPGN1cnNlcy5oPgorfQorCisvKiBTQ08gMy4ydjQgY3Vyc2VzLmggaW5jbHVkZXMgdGVybS5oLCB3aGljaCBkZWZpbmVzIGxpbmVzIGFzIGEgbWFjcm8uCisgICBVbmRlZmluZSBpdCBoZXJlLCBiZWNhdXNlIE5DdXJzZXNXaW5kb3cgdXNlcyBsaW5lcyBhcyBhIG1ldGhvZC4gICovCisjdW5kZWYgbGluZXMKKworLyogIkNvbnZlcnQiIG1hY3JvcyB0byBpbmxpbmVzLiBXZSdsbCBkZWZpbmUgaXQgYXMgYW5vdGhlciBzeW1ib2wgdG8gYXZvaWQKKyAqIGNvbmZsaWN0IHdpdGggbGlicmFyeSBzeW1ib2xzLgorICovCisjdW5kZWYgVU5ERUYKKyNkZWZpbmUgVU5ERUYobmFtZSkgQ1VSXyAjI25hbWUKKworI2lmZGVmIGFkZGNoCitpbmxpbmUgaW50IFVOREVGKGFkZGNoKShjaHR5cGUgY2gpICB7IHJldHVybiBhZGRjaChjaCk7IH0KKyN1bmRlZiBhZGRjaAorI2RlZmluZSBhZGRjaCBVTkRFRihhZGRjaCkKKyNlbmRpZgorCisjaWZkZWYgYWRkY2hzdHIKK2lubGluZSBpbnQgVU5ERUYoYWRkY2hzdHIpKGNodHlwZSAqYXQpIHsgcmV0dXJuIGFkZGNoc3RyKGF0KTsgfQorI3VuZGVmIGFkZGNoc3RyCisjZGVmaW5lIGFkZGNoc3RyIFVOREVGKGFkZGNoc3RyKQorI2VuZGlmCisKKyNpZmRlZiBhZGRuc3RyCitpbmxpbmUgaW50IFVOREVGKGFkZG5zdHIpKGNvbnN0IGNoYXIgKnN0ciwgaW50IG4pCit7IHJldHVybiBhZGRuc3RyKHN0ciwgbik7IH0KKyN1bmRlZiBhZGRuc3RyCisjZGVmaW5lIGFkZG5zdHIgVU5ERUYoYWRkbnN0cikKKyNlbmRpZgorCisjaWZkZWYgYWRkc3RyCitpbmxpbmUgaW50IFVOREVGKGFkZHN0cikoY29uc3QgY2hhciAqIHN0cikgIHsgcmV0dXJuIGFkZHN0cihzdHIpOyB9CisjdW5kZWYgYWRkc3RyCisjZGVmaW5lIGFkZHN0ciBVTkRFRihhZGRzdHIpCisjZW5kaWYKKworI2lmZGVmIGF0dHJvZmYKK2lubGluZSBpbnQgVU5ERUYoYXR0cm9mZikoY2h0eXBlIGF0KSB7IHJldHVybiBhdHRyb2ZmKGF0KTsgfQorI3VuZGVmIGF0dHJvZmYKKyNkZWZpbmUgYXR0cm9mZiBVTkRFRihhdHRyb2ZmKQorI2VuZGlmCisKKyNpZmRlZiBhdHRyb24KK2lubGluZSBpbnQgVU5ERUYoYXR0cm9uKShjaHR5cGUgYXQpIHsgcmV0dXJuIGF0dHJvbihhdCk7IH0KKyN1bmRlZiBhdHRyb24KKyNkZWZpbmUgYXR0cm9uIFVOREVGKGF0dHJvbikKKyNlbmRpZgorCisjaWZkZWYgYXR0cnNldAoraW5saW5lIGNodHlwZSBVTkRFRihhdHRyc2V0KShjaHR5cGUgYXQpIHsgcmV0dXJuIGF0dHJzZXQoYXQpOyB9CisjdW5kZWYgYXR0cnNldAorI2RlZmluZSBhdHRyc2V0IFVOREVGKGF0dHJzZXQpCisjZW5kaWYKKworI2lmZGVmIGJrZ2QKK2lubGluZSBpbnQgVU5ERUYoYmtnZCkoY2h0eXBlIGNoKSB7IHJldHVybiBia2dkKGNoKTsgfQorI3VuZGVmIGJrZ2QKKyNkZWZpbmUgYmtnZCBVTkRFRihia2dkKQorI2VuZGlmCisKKyNpZmRlZiBia2dkc2V0CitpbmxpbmUgdm9pZCBVTkRFRihia2dkc2V0KShjaHR5cGUgY2gpIHsgYmtnZHNldChjaCk7IH0KKyN1bmRlZiBia2dkc2V0CisjZGVmaW5lIGJrZ2RzZXQgVU5ERUYoYmtnZHNldCkKKyNlbmRpZgorCisjaWZkZWYgYm9yZGVyCitpbmxpbmUgaW50IFVOREVGKGJvcmRlcikoY2h0eXBlIGxzLCBjaHR5cGUgcnMsIGNodHlwZSB0cywgY2h0eXBlIGJzLCBjaHR5cGUgdGwsIGNodHlwZSB0ciwgY2h0eXBlIGJsLCBjaHR5cGUgYnIpCit7IHJldHVybiBib3JkZXIobHMsIHJzLCB0cywgYnMsIHRsLCB0ciwgYmwsIGJyKTsgfQorI3VuZGVmIGJvcmRlcgorI2RlZmluZSBib3JkZXIgVU5ERUYoYm9yZGVyKQorI2VuZGlmCisKKyNpZmRlZiBib3gKK2lubGluZSBpbnQgVU5ERUYoYm94KShXSU5ET1cgKndpbiwgaW50IHYsIGludCBoKSB7IHJldHVybiBib3god2luLCB2LCBoKTsgfQorI3VuZGVmIGJveAorI2RlZmluZSBib3ggVU5ERUYoYm94KQorI2VuZGlmCisKKyNpZmRlZiBjaGdhdAoraW5saW5lIGludCBVTkRFRihjaGdhdCkoaW50IG4sIGF0dHJfdCBhdHRyLCBzaG9ydCBjb2xvciwgY29uc3Qgdm9pZCAqb3B0cykgeworICByZXR1cm4gY2hnYXQobiwgYXR0ciwgY29sb3IsIG9wdHMpOyB9CisjdW5kZWYgY2hnYXQKKyNkZWZpbmUgY2hnYXQgVU5ERUYoY2hnYXQpCisjZW5kaWYKKworI2lmZGVmIGNsZWFyCitpbmxpbmUgaW50IFVOREVGKGNsZWFyKSgpICB7IHJldHVybiBjbGVhcigpOyB9CisjdW5kZWYgY2xlYXIKKyNkZWZpbmUgY2xlYXIgVU5ERUYoY2xlYXIpCisjZW5kaWYKKworI2lmZGVmIGNsZWFyb2sKK2lubGluZSBpbnQgVU5ERUYoY2xlYXJvaykoV0lORE9XKiB3aW4sIGJvb2wgYmYpICB7IHJldHVybiBjbGVhcm9rKHdpbiwgYmYpOyB9CisjdW5kZWYgY2xlYXJvaworI2RlZmluZSBjbGVhcm9rIFVOREVGKGNsZWFyb2spCisjZWxzZQorZXh0ZXJuICJDIiBOQ1VSU0VTX0lNUEVYUCBpbnQgTkNVUlNFU19BUEkgY2xlYXJvayhXSU5ET1cqLCBib29sKTsKKyNlbmRpZgorCisjaWZkZWYgY2xydG9ib3QKK2lubGluZSBpbnQgVU5ERUYoY2xydG9ib3QpKCkgIHsgcmV0dXJuIGNscnRvYm90KCk7IH0KKyN1bmRlZiBjbHJ0b2JvdAorI2RlZmluZSBjbHJ0b2JvdCBVTkRFRihjbHJ0b2JvdCkKKyNlbmRpZgorCisjaWZkZWYgY2xydG9lb2wKK2lubGluZSBpbnQgVU5ERUYoY2xydG9lb2wpKCkgIHsgcmV0dXJuIGNscnRvZW9sKCk7IH0KKyN1bmRlZiBjbHJ0b2VvbAorI2RlZmluZSBjbHJ0b2VvbCBVTkRFRihjbHJ0b2VvbCkKKyNlbmRpZgorCisjaWZkZWYgY29sb3Jfc2V0CitpbmxpbmUgY2h0eXBlIFVOREVGKGNvbG9yX3NldCkoc2hvcnQgcCwgdm9pZCogb3B0cykgeyByZXR1cm4gY29sb3Jfc2V0KHAsIG9wdHMpOyB9CisjdW5kZWYgY29sb3Jfc2V0CisjZGVmaW5lIGNvbG9yX3NldCBVTkRFRihjb2xvcl9zZXQpCisjZW5kaWYKKworI2lmZGVmIGNybW9kZQoraW5saW5lIGludCBVTkRFRihjcm1vZGUpKHZvaWQpIHsgcmV0dXJuIGNybW9kZSgpOyB9CisjdW5kZWYgY3Jtb2RlCisjZGVmaW5lIGNybW9kZSBVTkRFRihjcm1vZGUpCisjZW5kaWYKKworI2lmZGVmIGRlbGNoCitpbmxpbmUgaW50IFVOREVGKGRlbGNoKSgpICB7IHJldHVybiBkZWxjaCgpOyB9CisjdW5kZWYgZGVsY2gKKyNkZWZpbmUgZGVsY2ggVU5ERUYoZGVsY2gpCisjZW5kaWYKKworI2lmZGVmIGRlbGV0ZWxuCitpbmxpbmUgaW50IFVOREVGKGRlbGV0ZWxuKSgpICB7IHJldHVybiBkZWxldGVsbigpOyB9CisjdW5kZWYgZGVsZXRlbG4KKyNkZWZpbmUgZGVsZXRlbG4gVU5ERUYoZGVsZXRlbG4pCisjZW5kaWYKKworI2lmZGVmIGVjaG9jaGFyCitpbmxpbmUgaW50IFVOREVGKGVjaG9jaGFyKShjaHR5cGUgY2gpICB7IHJldHVybiBlY2hvY2hhcihjaCk7IH0KKyN1bmRlZiBlY2hvY2hhcgorI2RlZmluZSBlY2hvY2hhciBVTkRFRihlY2hvY2hhcikKKyNlbmRpZgorCisjaWZkZWYgZXJhc2UKK2lubGluZSBpbnQgVU5ERUYoZXJhc2UpKCkgIHsgcmV0dXJuIGVyYXNlKCk7IH0KKyN1bmRlZiBlcmFzZQorI2RlZmluZSBlcmFzZSBVTkRFRihlcmFzZSkKKyNlbmRpZgorCisjaWZkZWYgZml4dGVybQoraW5saW5lIGludCBVTkRFRihmaXh0ZXJtKSh2b2lkKSB7IHJldHVybiBmaXh0ZXJtKCk7IH0KKyN1bmRlZiBmaXh0ZXJtCisjZGVmaW5lIGZpeHRlcm0gVU5ERUYoZml4dGVybSkKKyNlbmRpZgorCisjaWZkZWYgZmx1c2hvaworaW5saW5lIGludCBVTkRFRihmbHVzaG9rKShXSU5ET1cqIF93aW4sIGJvb2wgX2JmKSAgeworICByZXR1cm4gZmx1c2hvayhfd2luLCBfYmYpOyB9CisjdW5kZWYgZmx1c2hvaworI2RlZmluZSBmbHVzaG9rIFVOREVGKGZsdXNob2spCisjZWxzZQorI2RlZmluZSBfbm9fZmx1c2hvaworI2VuZGlmCisKKyNpZmRlZiBnZXRhdHRycworaW5saW5lIGludCBVTkRFRihnZXRhdHRycykoV0lORE9XICp3aW4pIHsgcmV0dXJuIGdldGF0dHJzKHdpbik7IH0KKyN1bmRlZiBnZXRhdHRycworI2RlZmluZSBnZXRhdHRycyBVTkRFRihnZXRhdHRycykKKyNlbmRpZgorCisjaWZkZWYgZ2V0YmVneXgKK2lubGluZSB2b2lkIFVOREVGKGdldGJlZ3l4KShXSU5ET1cqIHdpbiwgaW50JiB5LCBpbnQmIHgpIHsgZ2V0YmVneXgod2luLCB5LCB4KTsgfQorI3VuZGVmIGdldGJlZ3l4CisjZGVmaW5lIGdldGJlZ3l4IFVOREVGKGdldGJlZ3l4KQorI2VuZGlmCisKKyNpZmRlZiBnZXRia2dkCitpbmxpbmUgY2h0eXBlIFVOREVGKGdldGJrZ2QpKGNvbnN0IFdJTkRPVyAqd2luKSB7IHJldHVybiBnZXRia2dkKHdpbik7IH0KKyN1bmRlZiBnZXRia2dkCisjZGVmaW5lIGdldGJrZ2QgVU5ERUYoZ2V0YmtnZCkKKyNlbmRpZgorCisjaWZkZWYgZ2V0Y2gKK2lubGluZSBpbnQgVU5ERUYoZ2V0Y2gpKCkgIHsgcmV0dXJuIGdldGNoKCk7IH0KKyN1bmRlZiBnZXRjaAorI2RlZmluZSBnZXRjaCBVTkRFRihnZXRjaCkKKyNlbmRpZgorCisjaWZkZWYgZ2V0bWF4eXgKK2lubGluZSB2b2lkIFVOREVGKGdldG1heHl4KShXSU5ET1cqIHdpbiwgaW50JiB5LCBpbnQmIHgpIHsgZ2V0bWF4eXgod2luLCB5LCB4KTsgfQorI3VuZGVmIGdldG1heHl4CisjZGVmaW5lIGdldG1heHl4IFVOREVGKGdldG1heHl4KQorI2VuZGlmCisKKyNpZmRlZiBnZXRuc3RyCitpbmxpbmUgaW50IFVOREVGKGdldG5zdHIpKGNoYXIgKl9zdHIsIGludCBuKSAgeyByZXR1cm4gZ2V0bnN0cihfc3RyLCBuKTsgfQorI3VuZGVmIGdldG5zdHIKKyNkZWZpbmUgZ2V0bnN0ciBVTkRFRihnZXRuc3RyKQorI2VuZGlmCisKKyNpZmRlZiBnZXRwYXJ5eAoraW5saW5lIHZvaWQgVU5ERUYoZ2V0cGFyeXgpKFdJTkRPVyogd2luLCBpbnQmIHksIGludCYgeCkgeyBnZXRwYXJ5eCh3aW4sIHksIHgpOyB9CisjdW5kZWYgZ2V0cGFyeXgKKyNkZWZpbmUgZ2V0cGFyeXggVU5ERUYoZ2V0cGFyeXgpCisjZW5kaWYKKworI2lmZGVmIGdldHN0cgoraW5saW5lIGludCBVTkRFRihnZXRzdHIpKGNoYXIgKl9zdHIpICB7IHJldHVybiBnZXRzdHIoX3N0cik7IH0KKyN1bmRlZiBnZXRzdHIKKyNkZWZpbmUgZ2V0c3RyIFVOREVGKGdldHN0cikKKyNlbmRpZgorCisjaWZkZWYgZ2V0eXgKK2lubGluZSB2b2lkIFVOREVGKGdldHl4KShjb25zdCBXSU5ET1cqIHdpbiwgaW50JiB5LCBpbnQmIHgpIHsKKyAgZ2V0eXgod2luLCB5LCB4KTsgfQorI3VuZGVmIGdldHl4CisjZGVmaW5lIGdldHl4IFVOREVGKGdldHl4KQorI2VuZGlmCisKKyNpZmRlZiBobGluZQoraW5saW5lIGludCBVTkRFRihobGluZSkoY2h0eXBlIGNoLCBpbnQgbikgeyByZXR1cm4gaGxpbmUoY2gsIG4pOyB9CisjdW5kZWYgaGxpbmUKKyNkZWZpbmUgaGxpbmUgVU5ERUYoaGxpbmUpCisjZW5kaWYKKworI2lmZGVmIGluY2gKK2lubGluZSBjaHR5cGUgVU5ERUYoaW5jaCkoKSAgeyByZXR1cm4gaW5jaCgpOyB9CisjdW5kZWYgaW5jaAorI2RlZmluZSBpbmNoIFVOREVGKGluY2gpCisjZW5kaWYKKworI2lmZGVmIGluY2hzdHIKK2lubGluZSBpbnQgVU5ERUYoaW5jaHN0cikoY2h0eXBlICpzdHIpICB7IHJldHVybiBpbmNoc3RyKHN0cik7IH0KKyN1bmRlZiBpbmNoc3RyCisjZGVmaW5lIGluY2hzdHIgVU5ERUYoaW5jaHN0cikKKyNlbmRpZgorCisjaWZkZWYgaW5uc3RyCitpbmxpbmUgaW50IFVOREVGKGlubnN0cikoY2hhciAqX3N0ciwgaW50IG4pICB7IHJldHVybiBpbm5zdHIoX3N0ciwgbik7IH0KKyN1bmRlZiBpbm5zdHIKKyNkZWZpbmUgaW5uc3RyIFVOREVGKGlubnN0cikKKyNlbmRpZgorCisjaWZkZWYgaW5zY2gKK2lubGluZSBpbnQgVU5ERUYoaW5zY2gpKGNodHlwZSBjKSAgeyByZXR1cm4gaW5zY2goYyk7IH0KKyN1bmRlZiBpbnNjaAorI2RlZmluZSBpbnNjaCBVTkRFRihpbnNjaCkKKyNlbmRpZgorCisjaWZkZWYgaW5zZGVsbG4KK2lubGluZSBpbnQgVU5ERUYoaW5zZGVsbG4pKGludCBuKSAgeyByZXR1cm4gaW5zZGVsbG4obik7IH0KKyN1bmRlZiBpbnNkZWxsbgorI2RlZmluZSBpbnNkZWxsbiBVTkRFRihpbnNkZWxsbikKKyNlbmRpZgorCisjaWZkZWYgaW5zZXJ0bG4KK2lubGluZSBpbnQgVU5ERUYoaW5zZXJ0bG4pKCkgIHsgcmV0dXJuIGluc2VydGxuKCk7IH0KKyN1bmRlZiBpbnNlcnRsbgorI2RlZmluZSBpbnNlcnRsbiBVTkRFRihpbnNlcnRsbikKKyNlbmRpZgorCisjaWZkZWYgaW5zbnN0cgoraW5saW5lIGludCBVTkRFRihpbnNuc3RyKShjb25zdCBjaGFyICpfc3RyLCBpbnQgbikgIHsKKyAgcmV0dXJuIGluc25zdHIoX3N0ciwgbik7IH0KKyN1bmRlZiBpbnNuc3RyCisjZGVmaW5lIGluc25zdHIgVU5ERUYoaW5zbnN0cikKKyNlbmRpZgorCisjaWZkZWYgaW5zc3RyCitpbmxpbmUgaW50IFVOREVGKGluc3N0cikoY29uc3QgY2hhciAqX3N0cikgIHsKKyAgcmV0dXJuIGluc3N0cihfc3RyKTsgfQorI3VuZGVmIGluc3N0cgorI2RlZmluZSBpbnNzdHIgVU5ERUYoaW5zc3RyKQorI2VuZGlmCisKKyNpZmRlZiBpbnN0cgoraW5saW5lIGludCBVTkRFRihpbnN0cikoY2hhciAqX3N0cikgIHsgcmV0dXJuIGluc3RyKF9zdHIpOyB9CisjdW5kZWYgaW5zdHIKKyNkZWZpbmUgaW5zdHIgVU5ERUYoaW5zdHIpCisjZW5kaWYKKworI2lmZGVmIGludHJmbHVzaAoraW5saW5lIHZvaWQgVU5ERUYoaW50cmZsdXNoKShXSU5ET1cgKndpbiwgYm9vbCBiZikgeyBpbnRyZmx1c2goKTsgfQorI3VuZGVmIGludHJmbHVzaAorI2RlZmluZSBpbnRyZmx1c2ggVU5ERUYoaW50cmZsdXNoKQorI2VuZGlmCisKKyNpZmRlZiBsZWF2ZW9rCitpbmxpbmUgaW50IFVOREVGKGxlYXZlb2spKFdJTkRPVyogd2luLCBib29sIGJmKSAgeyByZXR1cm4gbGVhdmVvayh3aW4sIGJmKTsgfQorI3VuZGVmIGxlYXZlb2sKKyNkZWZpbmUgbGVhdmVvayBVTkRFRihsZWF2ZW9rKQorI2Vsc2UKK2V4dGVybiAiQyIgTkNVUlNFU19JTVBFWFAgaW50IE5DVVJTRVNfQVBJIGxlYXZlb2soV0lORE9XKiB3aW4sIGJvb2wgYmYpOworI2VuZGlmCisKKyNpZmRlZiBtb3ZlCitpbmxpbmUgaW50IFVOREVGKG1vdmUpKGludCB4LCBpbnQgeSkgIHsgcmV0dXJuIG1vdmUoeCwgeSk7IH0KKyN1bmRlZiBtb3ZlCisjZGVmaW5lIG1vdmUgVU5ERUYobW92ZSkKKyNlbmRpZgorCisjaWZkZWYgbXZhZGRjaAoraW5saW5lIGludCBVTkRFRihtdmFkZGNoKShpbnQgeSwgaW50IHgsIGNodHlwZSBjaCkKK3sgcmV0dXJuIG12YWRkY2goeSwgeCwgY2gpOyB9CisjdW5kZWYgbXZhZGRjaAorI2RlZmluZSBtdmFkZGNoIFVOREVGKG12YWRkY2gpCisjZW5kaWYKKworI2lmZGVmIG12YWRkbnN0cgoraW5saW5lIGludCBVTkRFRihtdmFkZG5zdHIpKGludCB5LCBpbnQgeCwgY29uc3QgY2hhciAqc3RyLCBpbnQgbikKK3sgcmV0dXJuIG12YWRkbnN0cih5LCB4LCBzdHIsIG4pOyB9CisjdW5kZWYgbXZhZGRuc3RyCisjZGVmaW5lIG12YWRkbnN0ciBVTkRFRihtdmFkZG5zdHIpCisjZW5kaWYKKworI2lmZGVmIG12YWRkc3RyCitpbmxpbmUgaW50IFVOREVGKG12YWRkc3RyKShpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIgKiBzdHIpCit7IHJldHVybiBtdmFkZHN0cih5LCB4LCBzdHIpOyB9CisjdW5kZWYgbXZhZGRzdHIKKyNkZWZpbmUgbXZhZGRzdHIgVU5ERUYobXZhZGRzdHIpCisjZW5kaWYKKworI2lmZGVmIG12Y2hnYXQKK2lubGluZSBpbnQgVU5ERUYobXZjaGdhdCkoaW50IHksIGludCB4LCBpbnQgbiwKKwkJCSAgYXR0cl90IGF0dHIsIHNob3J0IGNvbG9yLCBjb25zdCB2b2lkICpvcHRzKSB7CisgIHJldHVybiBtdmNoZ2F0KHksIHgsIG4sIGF0dHIsIGNvbG9yLCBvcHRzKTsgfQorI3VuZGVmIG12Y2hnYXQKKyNkZWZpbmUgbXZjaGdhdCBVTkRFRihtdmNoZ2F0KQorI2VuZGlmCisKKyNpZmRlZiBtdmRlbGNoCitpbmxpbmUgaW50IFVOREVGKG12ZGVsY2gpKGludCB5LCBpbnQgeCkgeyByZXR1cm4gbXZkZWxjaCh5LCB4KTt9CisjdW5kZWYgbXZkZWxjaAorI2RlZmluZSBtdmRlbGNoIFVOREVGKG12ZGVsY2gpCisjZW5kaWYKKworI2lmZGVmIG12Z2V0Y2gKK2lubGluZSBpbnQgVU5ERUYobXZnZXRjaCkoaW50IHksIGludCB4KSB7IHJldHVybiBtdmdldGNoKHksIHgpO30KKyN1bmRlZiBtdmdldGNoCisjZGVmaW5lIG12Z2V0Y2ggVU5ERUYobXZnZXRjaCkKKyNlbmRpZgorCisjaWZkZWYgbXZnZXRuc3RyCitpbmxpbmUgaW50IFVOREVGKG12Z2V0bnN0cikoaW50IHksIGludCB4LCBjaGFyICpzdHIsIGludCBuKSB7CisgIHJldHVybiBtdmdldG5zdHIoeSwgeCwgc3RyLCBuKTt9CisjdW5kZWYgbXZnZXRuc3RyCisjZGVmaW5lIG12Z2V0bnN0ciBVTkRFRihtdmdldG5zdHIpCisjZW5kaWYKKworI2lmZGVmIG12Z2V0c3RyCitpbmxpbmUgaW50IFVOREVGKG12Z2V0c3RyKShpbnQgeSwgaW50IHgsIGNoYXIgKnN0cikge3JldHVybiBtdmdldHN0cih5LCB4LCBzdHIpO30KKyN1bmRlZiBtdmdldHN0cgorI2RlZmluZSBtdmdldHN0ciBVTkRFRihtdmdldHN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZpbmNoCitpbmxpbmUgY2h0eXBlIFVOREVGKG12aW5jaCkoaW50IHksIGludCB4KSB7IHJldHVybiBtdmluY2goeSwgeCk7fQorI3VuZGVmIG12aW5jaAorI2RlZmluZSBtdmluY2ggVU5ERUYobXZpbmNoKQorI2VuZGlmCisKKyNpZmRlZiBtdmlubnN0cgoraW5saW5lIGludCBVTkRFRihtdmlubnN0cikoaW50IHksIGludCB4LCBjaGFyICpfc3RyLCBpbnQgbikgeworICByZXR1cm4gbXZpbm5zdHIoeSwgeCwgX3N0ciwgbik7IH0KKyN1bmRlZiBtdmlubnN0cgorI2RlZmluZSBtdmlubnN0ciBVTkRFRihtdmlubnN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZpbnNjaAoraW5saW5lIGludCBVTkRFRihtdmluc2NoKShpbnQgeSwgaW50IHgsIGNodHlwZSBjKQoreyByZXR1cm4gbXZpbnNjaCh5LCB4LCBjKTsgfQorI3VuZGVmIG12aW5zY2gKKyNkZWZpbmUgbXZpbnNjaCBVTkRFRihtdmluc2NoKQorI2VuZGlmCisKKyNpZmRlZiBtdmluc25zdHIKK2lubGluZSBpbnQgVU5ERUYobXZpbnNuc3RyKShpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIgKl9zdHIsIGludCBuKSB7CisgIHJldHVybiBtdmluc25zdHIoeSwgeCwgX3N0ciwgbik7IH0KKyN1bmRlZiBtdmluc25zdHIKKyNkZWZpbmUgbXZpbnNuc3RyIFVOREVGKG12aW5zbnN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZpbnNzdHIKK2lubGluZSBpbnQgVU5ERUYobXZpbnNzdHIpKGludCB5LCBpbnQgeCwgY29uc3QgY2hhciAqX3N0cikgIHsKKyAgcmV0dXJuIG12aW5zc3RyKHksIHgsIF9zdHIpOyB9CisjdW5kZWYgbXZpbnNzdHIKKyNkZWZpbmUgbXZpbnNzdHIgVU5ERUYobXZpbnNzdHIpCisjZW5kaWYKKworI2lmZGVmIG12d2FkZGNoCitpbmxpbmUgaW50IFVOREVGKG12d2FkZGNoKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjb25zdCBjaHR5cGUgY2gpCit7IHJldHVybiBtdndhZGRjaCh3aW4sIHksIHgsIGNoKTsgfQorI3VuZGVmIG12d2FkZGNoCisjZGVmaW5lIG12d2FkZGNoIFVOREVGKG12d2FkZGNoKQorI2VuZGlmCisKKyNpZmRlZiBtdndhZGRjaG5zdHIKK2lubGluZSBpbnQgVU5ERUYobXZ3YWRkY2huc3RyKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjb25zdCBjaHR5cGUgKnN0ciwgaW50IG4pCit7IHJldHVybiBtdndhZGRjaG5zdHIod2luLCB5LCB4LCBzdHIsIG4pOyB9CisjdW5kZWYgbXZ3YWRkY2huc3RyCisjZGVmaW5lIG12d2FkZGNobnN0ciBVTkRFRihtdndhZGRjaG5zdHIpCisjZW5kaWYKKworI2lmZGVmIG12d2FkZGNoc3RyCitpbmxpbmUgaW50IFVOREVGKG12d2FkZGNoc3RyKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjb25zdCBjaHR5cGUgKnN0cikKK3sgcmV0dXJuIG12d2FkZGNoc3RyKHdpbiwgeSwgeCwgc3RyKTsgfQorI3VuZGVmIG12d2FkZGNoc3RyCisjZGVmaW5lIG12d2FkZGNoc3RyIFVOREVGKG12d2FkZGNoc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdndhZGRuc3RyCitpbmxpbmUgaW50IFVOREVGKG12d2FkZG5zdHIpKFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIgKnN0ciwgaW50IG4pCit7IHJldHVybiBtdndhZGRuc3RyKHdpbiwgeSwgeCwgc3RyLCBuKTsgfQorI3VuZGVmIG12d2FkZG5zdHIKKyNkZWZpbmUgbXZ3YWRkbnN0ciBVTkRFRihtdndhZGRuc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdndhZGRzdHIKK2lubGluZSBpbnQgVU5ERUYobXZ3YWRkc3RyKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjb25zdCBjaGFyICogc3RyKQoreyByZXR1cm4gbXZ3YWRkc3RyKHdpbiwgeSwgeCwgc3RyKTsgfQorI3VuZGVmIG12d2FkZHN0cgorI2RlZmluZSBtdndhZGRzdHIgVU5ERUYobXZ3YWRkc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdndjaGdhdAoraW5saW5lIGludCBVTkRFRihtdndjaGdhdCkoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgaW50IG4sCisJCQkgICBhdHRyX3QgYXR0ciwgc2hvcnQgY29sb3IsIGNvbnN0IHZvaWQgKm9wdHMpIHsKKyAgcmV0dXJuIG12d2NoZ2F0KHdpbiwgeSwgeCwgbiwgYXR0ciwgY29sb3IsIG9wdHMpOyB9CisjdW5kZWYgbXZ3Y2hnYXQKKyNkZWZpbmUgbXZ3Y2hnYXQgVU5ERUYobXZ3Y2hnYXQpCisjZW5kaWYKKworI2lmZGVmIG12d2RlbGNoCitpbmxpbmUgaW50IFVOREVGKG12d2RlbGNoKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4KQoreyByZXR1cm4gbXZ3ZGVsY2god2luLCB5LCB4KTsgfQorI3VuZGVmIG12d2RlbGNoCisjZGVmaW5lIG12d2RlbGNoIFVOREVGKG12d2RlbGNoKQorI2VuZGlmCisKKyNpZmRlZiBtdndnZXRjaAoraW5saW5lIGludCBVTkRFRihtdndnZXRjaCkoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCkgeyByZXR1cm4gbXZ3Z2V0Y2god2luLCB5LCB4KTt9CisjdW5kZWYgbXZ3Z2V0Y2gKKyNkZWZpbmUgbXZ3Z2V0Y2ggVU5ERUYobXZ3Z2V0Y2gpCisjZW5kaWYKKworI2lmZGVmIG12d2dldG5zdHIKK2lubGluZSBpbnQgVU5ERUYobXZ3Z2V0bnN0cikoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgY2hhciAqc3RyLCBpbnQgbikKK3tyZXR1cm4gbXZ3Z2V0bnN0cih3aW4sIHksIHgsIHN0ciwgbik7fQorI3VuZGVmIG12d2dldG5zdHIKKyNkZWZpbmUgbXZ3Z2V0bnN0ciBVTkRFRihtdndnZXRuc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdndnZXRzdHIKK2lubGluZSBpbnQgVU5ERUYobXZ3Z2V0c3RyKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjaGFyICpzdHIpCit7cmV0dXJuIG12d2dldHN0cih3aW4sIHksIHgsIHN0cik7fQorI3VuZGVmIG12d2dldHN0cgorI2RlZmluZSBtdndnZXRzdHIgVU5ERUYobXZ3Z2V0c3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdndobGluZQoraW5saW5lIGludCBVTkRFRihtdndobGluZSkoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgY2h0eXBlIGMsIGludCBuKSB7CisgIHJldHVybiBtdndobGluZSh3aW4sIHksIHgsIGMsIG4pOyB9CisjdW5kZWYgbXZ3aGxpbmUKKyNkZWZpbmUgbXZ3aGxpbmUgVU5ERUYobXZ3aGxpbmUpCisjZW5kaWYKKworI2lmZGVmIG12d2luY2gKK2lubGluZSBjaHR5cGUgVU5ERUYobXZ3aW5jaCkoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCkgeworICByZXR1cm4gbXZ3aW5jaCh3aW4sIHksIHgpO30KKyN1bmRlZiBtdndpbmNoCisjZGVmaW5lIG12d2luY2ggVU5ERUYobXZ3aW5jaCkKKyNlbmRpZgorCisjaWZkZWYgbXZ3aW5jaG5zdHIKK2lubGluZSBpbnQgVU5ERUYobXZ3aW5jaG5zdHIpKFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNodHlwZSAqc3RyLCBpbnQgbikgIHsgcmV0dXJuIG12d2luY2huc3RyKHdpbiwgeSwgeCwgc3RyLCBuKTsgfQorI3VuZGVmIG12d2luY2huc3RyCisjZGVmaW5lIG12d2luY2huc3RyIFVOREVGKG12d2luY2huc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdndpbmNoc3RyCitpbmxpbmUgaW50IFVOREVGKG12d2luY2hzdHIpKFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNodHlwZSAqc3RyKSAgeyByZXR1cm4gbXZ3aW5jaHN0cih3aW4sIHksIHgsIHN0cik7IH0KKyN1bmRlZiBtdndpbmNoc3RyCisjZGVmaW5lIG12d2luY2hzdHIgVU5ERUYobXZ3aW5jaHN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZ3aW5uc3RyCitpbmxpbmUgaW50IFVOREVGKG12d2lubnN0cikoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgY2hhciAqX3N0ciwgaW50IG4pIHsKKyAgcmV0dXJuIG12d2lubnN0cih3aW4sIHksIHgsIF9zdHIsIG4pOyB9CisjdW5kZWYgbXZ3aW5uc3RyCisjZGVmaW5lIG12d2lubnN0ciBVTkRFRihtdndpbm5zdHIpCisjZW5kaWYKKworI2lmZGVmIG12d2luc2NoCitpbmxpbmUgaW50IFVOREVGKG12d2luc2NoKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjaHR5cGUgYykKK3sgcmV0dXJuIG12d2luc2NoKHdpbiwgeSwgeCwgYyk7IH0KKyN1bmRlZiBtdndpbnNjaAorI2RlZmluZSBtdndpbnNjaCBVTkRFRihtdndpbnNjaCkKKyNlbmRpZgorCisjaWZkZWYgbXZ3aW5zbnN0cgoraW5saW5lIGludCBVTkRFRihtdndpbnNuc3RyKShXSU5ET1cgKncsIGludCB5LCBpbnQgeCwgY29uc3QgY2hhciAqX3N0ciwgaW50IG4pIHsKKyAgcmV0dXJuIG12d2luc25zdHIodywgeSwgeCwgX3N0ciwgbik7IH0KKyN1bmRlZiBtdndpbnNuc3RyCisjZGVmaW5lIG12d2luc25zdHIgVU5ERUYobXZ3aW5zbnN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZ3aW5zc3RyCitpbmxpbmUgaW50IFVOREVGKG12d2luc3N0cikoV0lORE9XICp3LCBpbnQgeSwgaW50IHgsICBjb25zdCBjaGFyICpfc3RyKSAgeworICByZXR1cm4gbXZ3aW5zc3RyKHcsIHksIHgsIF9zdHIpOyB9CisjdW5kZWYgbXZ3aW5zc3RyCisjZGVmaW5lIG12d2luc3N0ciBVTkRFRihtdndpbnNzdHIpCisjZW5kaWYKKworI2lmZGVmIG12d3ZsaW5lCitpbmxpbmUgaW50IFVOREVGKG12d3ZsaW5lKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjaHR5cGUgYywgaW50IG4pIHsKKyAgcmV0dXJuIG12d3ZsaW5lKHdpbiwgeSwgeCwgYywgbik7IH0KKyN1bmRlZiBtdnd2bGluZQorI2RlZmluZSBtdnd2bGluZSBVTkRFRihtdnd2bGluZSkKKyNlbmRpZgorCisjaWZkZWYgbmFwbXMKK2lubGluZSB2b2lkIFVOREVGKG5hcG1zKSh1bnNpZ25lZCBsb25nIHgpIHsgbmFwbXMoeCk7IH0KKyN1bmRlZiBuYXBtcworI2RlZmluZSBuYXBtcyBVTkRFRihuYXBtcykKKyNlbmRpZgorCisjaWZkZWYgbm9jcm1vZGUKK2lubGluZSBpbnQgVU5ERUYobm9jcm1vZGUpKHZvaWQpIHsgcmV0dXJuIG5vY3Jtb2RlKCk7IH0KKyN1bmRlZiBub2NybW9kZQorI2RlZmluZSBub2NybW9kZSBVTkRFRihub2NybW9kZSkKKyNlbmRpZgorCisjaWZkZWYgbm9kZWxheQoraW5saW5lIHZvaWQgVU5ERUYobm9kZWxheSkoKSB7IG5vZGVsYXkoKTsgfQorI3VuZGVmIG5vZGVsYXkKKyNkZWZpbmUgbm9kZWxheSBVTkRFRihub2RlbGF5KQorI2VuZGlmCisKKyNpZmRlZiByZWRyYXd3aW4KK2lubGluZSBpbnQgVU5ERUYocmVkcmF3d2luKShXSU5ET1cgKndpbikgIHsgcmV0dXJuIHJlZHJhd3dpbih3aW4pOyB9CisjdW5kZWYgcmVkcmF3d2luCisjZGVmaW5lIHJlZHJhd3dpbiBVTkRFRihyZWRyYXd3aW4pCisjZW5kaWYKKworI2lmZGVmIHJlZnJlc2gKK2lubGluZSBpbnQgVU5ERUYocmVmcmVzaCkoKSAgeyByZXR1cm4gcmVmcmVzaCgpOyB9CisjdW5kZWYgcmVmcmVzaAorI2RlZmluZSByZWZyZXNoIFVOREVGKHJlZnJlc2gpCisjZW5kaWYKKworI2lmZGVmIHJlc2V0dGVybQoraW5saW5lIGludCBVTkRFRihyZXNldHRlcm0pKHZvaWQpIHsgcmV0dXJuIHJlc2V0dGVybSgpOyB9CisjdW5kZWYgcmVzZXR0ZXJtCisjZGVmaW5lIHJlc2V0dGVybSBVTkRFRihyZXNldHRlcm0pCisjZW5kaWYKKworI2lmZGVmIHNhdmV0ZXJtCitpbmxpbmUgaW50IFVOREVGKHNhdmV0ZXJtKSh2b2lkKSB7IHJldHVybiBzYXZldGVybSgpOyB9CisjdW5kZWYgc2F2ZXRlcm0KKyNkZWZpbmUgc2F2ZXRlcm0gVU5ERUYoc2F2ZXRlcm0pCisjZW5kaWYKKworI2lmZGVmIHNjcmwKK2lubGluZSBpbnQgVU5ERUYoc2NybCkoaW50IGwpIHsgcmV0dXJuIHNjcmwobCk7IH0KKyN1bmRlZiBzY3JsCisjZGVmaW5lIHNjcmwgVU5ERUYoc2NybCkKKyNlbmRpZgorCisjaWZkZWYgc2Nyb2xsCitpbmxpbmUgaW50IFVOREVGKHNjcm9sbCkoV0lORE9XICp3aW4pIHsgcmV0dXJuIHNjcm9sbCh3aW4pOyB9CisjdW5kZWYgc2Nyb2xsCisjZGVmaW5lIHNjcm9sbCBVTkRFRihzY3JvbGwpCisjZW5kaWYKKworI2lmZGVmIHNjcm9sbG9rCitpbmxpbmUgaW50IFVOREVGKHNjcm9sbG9rKShXSU5ET1cqIHdpbiwgYm9vbCBiZikgIHsgcmV0dXJuIHNjcm9sbG9rKHdpbiwgYmYpOyB9CisjdW5kZWYgc2Nyb2xsb2sKKyNkZWZpbmUgc2Nyb2xsb2sgVU5ERUYoc2Nyb2xsb2spCisjZWxzZQorI2lmCWRlZmluZWQoX19OQ1VSU0VTX0gpCitleHRlcm4gIkMiIE5DVVJTRVNfSU1QRVhQIGludCBOQ1VSU0VTX0FQSSBzY3JvbGxvayhXSU5ET1cqLCBib29sKTsKKyNlbHNlCitleHRlcm4gIkMiIE5DVVJTRVNfSU1QRVhQIGludCBOQ1VSU0VTX0FQSSBzY3JvbGxvayhXSU5ET1cqLCBjaGFyKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBzZXRzY3JyZWcKK2lubGluZSBpbnQgVU5ERUYoc2V0c2NycmVnKShpbnQgdCwgaW50IGIpIHsgcmV0dXJuIHNldHNjcnJlZyh0LCBiKTsgfQorI3VuZGVmIHNldHNjcnJlZworI2RlZmluZSBzZXRzY3JyZWcgVU5ERUYoc2V0c2NycmVnKQorI2VuZGlmCisKKyNpZmRlZiBzdGFuZGVuZAoraW5saW5lIGludCBVTkRFRihzdGFuZGVuZCkoKSAgeyByZXR1cm4gc3RhbmRlbmQoKTsgfQorI3VuZGVmIHN0YW5kZW5kCisjZGVmaW5lIHN0YW5kZW5kIFVOREVGKHN0YW5kZW5kKQorI2VuZGlmCisKKyNpZmRlZiBzdGFuZG91dAoraW5saW5lIGludCBVTkRFRihzdGFuZG91dCkoKSAgeyByZXR1cm4gc3RhbmRvdXQoKTsgfQorI3VuZGVmIHN0YW5kb3V0CisjZGVmaW5lIHN0YW5kb3V0IFVOREVGKHN0YW5kb3V0KQorI2VuZGlmCisKKyNpZmRlZiBzdWJwYWQKK2lubGluZSBXSU5ET1cgKlVOREVGKHN1YnBhZCkoV0lORE9XICpwLCBpbnQgbCwgaW50IGMsIGludCB5LCBpbnQgeCkKK3sgcmV0dXJuIGRlcndpbihwLCBsLCBjLCB5LCB4KTsgfQorI3VuZGVmIHN1YnBhZAorI2RlZmluZSBzdWJwYWQgVU5ERUYoc3VicGFkKQorI2VuZGlmCisKKyNpZmRlZiB0aW1lb3V0CitpbmxpbmUgdm9pZCBVTkRFRih0aW1lb3V0KShpbnQgZGVsYXkpIHsgdGltZW91dChkZWxheSk7IH0KKyN1bmRlZiB0aW1lb3V0CisjZGVmaW5lIHRpbWVvdXQgVU5ERUYodGltZW91dCkKKyNlbmRpZgorCisjaWZkZWYgdG91Y2hsaW5lCitpbmxpbmUgaW50IFVOREVGKHRvdWNobGluZSkoV0lORE9XICp3aW4sIGludCBzLCBpbnQgYykKK3sgcmV0dXJuIHRvdWNobGluZSh3aW4sIHMsIGMpOyB9CisjdW5kZWYgdG91Y2hsaW5lCisjZGVmaW5lIHRvdWNobGluZSBVTkRFRih0b3VjaGxpbmUpCisjZW5kaWYKKworI2lmZGVmIHRvdWNod2luCitpbmxpbmUgaW50IFVOREVGKHRvdWNod2luKShXSU5ET1cgKndpbikgeyByZXR1cm4gdG91Y2h3aW4od2luKTsgfQorI3VuZGVmIHRvdWNod2luCisjZGVmaW5lIHRvdWNod2luIFVOREVGKHRvdWNod2luKQorI2VuZGlmCisKKyNpZmRlZiB1bnRvdWNod2luCitpbmxpbmUgaW50IFVOREVGKHVudG91Y2h3aW4pKFdJTkRPVyAqd2luKSB7IHJldHVybiB1bnRvdWNod2luKHdpbik7IH0KKyN1bmRlZiB1bnRvdWNod2luCisjZGVmaW5lIHVudG91Y2h3aW4gVU5ERUYodW50b3VjaHdpbikKKyNlbmRpZgorCisjaWZkZWYgdmxpbmUKK2lubGluZSBpbnQgVU5ERUYodmxpbmUpKGNodHlwZSBjaCwgaW50IG4pIHsgcmV0dXJuIHZsaW5lKGNoLCBuKTsgfQorI3VuZGVmIHZsaW5lCisjZGVmaW5lIHZsaW5lIFVOREVGKHZsaW5lKQorI2VuZGlmCisKKyNpZmRlZiB3YWRkY2hzdHIKK2lubGluZSBpbnQgVU5ERUYod2FkZGNoc3RyKShXSU5ET1cgKndpbiwgY2h0eXBlICphdCkgeyByZXR1cm4gd2FkZGNoc3RyKHdpbiwgYXQpOyB9CisjdW5kZWYgd2FkZGNoc3RyCisjZGVmaW5lIHdhZGRjaHN0ciBVTkRFRih3YWRkY2hzdHIpCisjZW5kaWYKKworI2lmZGVmIHdhZGRzdHIKK2lubGluZSBpbnQgVU5ERUYod2FkZHN0cikoV0lORE9XICp3aW4sIGNoYXIgKnN0cikgeyByZXR1cm4gd2FkZHN0cih3aW4sIHN0cik7IH0KKyN1bmRlZiB3YWRkc3RyCisjZGVmaW5lIHdhZGRzdHIgVU5ERUYod2FkZHN0cikKKyNlbmRpZgorCisjaWZkZWYgd2F0dHJvZmYKK2lubGluZSBpbnQgVU5ERUYod2F0dHJvZmYpKFdJTkRPVyAqd2luLCBpbnQgYXR0KSB7IHJldHVybiB3YXR0cm9mZih3aW4sIGF0dCk7IH0KKyN1bmRlZiB3YXR0cm9mZgorI2RlZmluZSB3YXR0cm9mZiBVTkRFRih3YXR0cm9mZikKKyNlbmRpZgorCisjaWZkZWYgd2F0dHJzZXQKK2lubGluZSBpbnQgVU5ERUYod2F0dHJzZXQpKFdJTkRPVyAqd2luLCBpbnQgYXR0KSB7IHJldHVybiB3YXR0cnNldCh3aW4sIGF0dCk7IH0KKyN1bmRlZiB3YXR0cnNldAorI2RlZmluZSB3YXR0cnNldCBVTkRFRih3YXR0cnNldCkKKyNlbmRpZgorCisjaWZkZWYgd2luY2gKK2lubGluZSBjaHR5cGUgVU5ERUYod2luY2gpKGNvbnN0IFdJTkRPVyogd2luKSB7IHJldHVybiB3aW5jaCh3aW4pOyB9CisjdW5kZWYgd2luY2gKKyNkZWZpbmUgd2luY2ggVU5ERUYod2luY2gpCisjZW5kaWYKKworI2lmZGVmIHdpbmNobnN0cgoraW5saW5lIGludCBVTkRFRih3aW5jaG5zdHIpKFdJTkRPVyAqd2luLCBjaHR5cGUgKnN0ciwgaW50IG4pICB7IHJldHVybiB3aW5jaG5zdHIod2luLCBzdHIsIG4pOyB9CisjdW5kZWYgd2luY2huc3RyCisjZGVmaW5lIHdpbmNobnN0ciBVTkRFRih3aW5jaG5zdHIpCisjZW5kaWYKKworI2lmZGVmIHdpbmNoc3RyCitpbmxpbmUgaW50IFVOREVGKHdpbmNoc3RyKShXSU5ET1cgKndpbiwgY2h0eXBlICpzdHIpICB7IHJldHVybiB3aW5jaHN0cih3aW4sIHN0cik7IH0KKyN1bmRlZiB3aW5jaHN0cgorI2RlZmluZSB3aW5jaHN0ciBVTkRFRih3aW5jaHN0cikKKyNlbmRpZgorCisjaWZkZWYgd2luc3N0cgoraW5saW5lIGludCBVTkRFRih3aW5zc3RyKShXSU5ET1cgKncsIGNvbnN0IGNoYXIgKl9zdHIpICB7CisgIHJldHVybiB3aW5zc3RyKHcsIF9zdHIpOyB9CisjdW5kZWYgd2luc3N0cgorI2RlZmluZSB3aW5zc3RyIFVOREVGKHdpbnNzdHIpCisjZW5kaWYKKworI2lmZGVmIHdzdGFuZGVuZAoraW5saW5lIGludCBVTkRFRih3c3RhbmRlbmQpKFdJTkRPVyAqd2luKSAgeyByZXR1cm4gd3N0YW5kZW5kKHdpbik7IH0KKyN1bmRlZiB3c3RhbmRlbmQKKyNkZWZpbmUgd3N0YW5kZW5kIFVOREVGKHdzdGFuZGVuZCkKKyNlbmRpZgorCisjaWZkZWYgd3N0YW5kb3V0CitpbmxpbmUgaW50IFVOREVGKHdzdGFuZG91dCkoV0lORE9XICp3aW4pICB7IHJldHVybiB3c3RhbmRvdXQod2luKTsgfQorI3VuZGVmIHdzdGFuZG91dAorI2RlZmluZSB3c3RhbmRvdXQgVU5ERUYod3N0YW5kb3V0KQorI2VuZGlmCisKKy8qCisgKgorICogQysrIGNsYXNzIGZvciB3aW5kb3dzLgorICoKKyAqLworCitleHRlcm4gIkMiIGludCAgICAgX25jX3JpcG9mZmxpbmUoaW50LCBpbnQgKCppbml0KShXSU5ET1cqLCBpbnQpKTsKK2V4dGVybiAiQyIgaW50ICAgICBfbmNfeHhfcmlwb2ZmX2luaXQoV0lORE9XICosIGludCk7CitleHRlcm4gIkMiIGludCAgICAgX25jX2hhc19tb3VzZSh2b2lkKTsKKworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc1dpbmRvdworeworICBmcmllbmQgY2xhc3MgTkN1cnNlc01lbnU7CisgIGZyaWVuZCBjbGFzcyBOQ3Vyc2VzRm9ybTsKKworcHJpdmF0ZToKKyAgc3RhdGljIGJvb2wgICAgYl9pbml0aWFsaXplZDsKKyAgc3RhdGljIHZvaWQgICAgaW5pdGlhbGl6ZSgpOworICB2b2lkICAgICAgICAgICBjb25zdHJ1Y3RpbmcoKTsKKyAgZnJpZW5kIGludCAgICAgX25jX3h4X3JpcG9mZl9pbml0KFdJTkRPVyAqLCBpbnQpOworCisgIHZvaWQgICAgICAgICAgIHNldF9rZXlib2FyZCgpOworCisgIHNob3J0ICAgICAgICAgIGdldGNvbG9yKGludCBnZXRiYWNrKSBjb25zdDsKKyAgc2hvcnQgICAgICAgICAgZ2V0UGFpcigpIGNvbnN0OworCisgIHN0YXRpYyBpbnQgICAgIHNldHBhbGV0dGUoc2hvcnQgZm9yZSwgc2hvcnQgYmFjaywgc2hvcnQgcGFpcik7CisgIHN0YXRpYyBpbnQgICAgIGNvbG9ySW5pdGlhbGl6ZWQ7CisKKyAgLy8gVGhpcyBwcml2YXRlIGNvbnN0cnVjdG9yIGlzIG9ubHkgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uCisgIC8vIG9mIHdpbmRvd3MgZ2VuZXJhdGVkIGJ5IHJpcG9mZmxpbmUoKSBjYWxscy4KKyAgTkN1cnNlc1dpbmRvdyhXSU5ET1cqIHdpbiwgaW50IG5jb2xzKTsKKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgICBlcnJfaGFuZGxlcihjb25zdCBjaGFyICopIGNvbnN0IFRIUk9XUyhOQ3Vyc2VzRXhjZXB0aW9uKTsKKyAgLy8gU2lnbmFsIGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgdGV4dC4KKworICBzdGF0aWMgbG9uZyBjb3VudDsgICAgICAgIC8vIGNvdW50IG9mIGFsbCBhY3RpdmUgd2luZG93czoKKyAgLy8gICBXZSByZWx5IG9uIHRoZSBjKysgcHJvbWlzZSB0aGF0CisgIC8vICAgYWxsIG90aGVyd2lzZSB1bmluaXRpYWxpemVkCisgIC8vICAgc3RhdGljIGNsYXNzIHZhcnMgYXJlIHNldCB0byAwCisKKyAgV0lORE9XKiAgICAgICAgdzsgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnNlcyBXSU5ET1cKKworICBib29sICAgICAgICAgICBhbGxvY2VkOyAgICAgICAgICAvLyBUUlVFIGlmIHdlIG93biB0aGUgV0lORE9XCisKKyAgTkN1cnNlc1dpbmRvdyogcGFyOyAgICAgICAgICAgICAgLy8gcGFyZW50LCBpZiBzdWJ3aW5kb3cKKyAgTkN1cnNlc1dpbmRvdyogc3Vid2luczsgICAgICAgICAgLy8gaGVhZCBvZiBzdWJ3aW5kb3dzIGxpc3QKKyAgTkN1cnNlc1dpbmRvdyogc2liOyAgICAgICAgICAgICAgLy8gbmV4dCBzdWJ3aW5kb3cgb2YgcGFyZW50CisKKyAgdm9pZCAgICAgICAgICAga2lsbF9zdWJ3aW5kb3dzKCk7IC8vIGRpc2FibGUgYWxsIHN1YndpbmRvd3MKKyAgLy8gRGVzdHJveSBhbGwgc3Vid2luZG93cy4KKworICAvKiBPbmx5IGZvciB1c2UgYnkgZGVyaXZlZCBjbGFzc2VzLiBUaGV5IGFyZSB0aGVuIGluIGNoYXJnZSB0bworICAgICBmaWxsIHRoZSBtZW1iZXIgdmFyaWFibGVzIGNvcnJlY3RseS4gKi8KKyAgTkN1cnNlc1dpbmRvdygpOworCitwdWJsaWM6CisgIE5DdXJzZXNXaW5kb3coV0lORE9XKiB3aW5kb3cpOyAgIC8vIHVzZWZ1bCBvbmx5IGZvciBzdGRzY3IKKworICBOQ3Vyc2VzV2luZG93KGludCBubGluZXMsICAgICAgICAvLyBudW1iZXIgb2YgbGluZXMKKwkJaW50IG5jb2xzLCAgICAgICAgIC8vIG51bWJlciBvZiBjb2x1bW5zCisJCWludCBiZWdpbl95LCAgICAgICAvLyBsaW5lIG9yaWdpbgorCQlpbnQgYmVnaW5feCk7ICAgICAgLy8gY29sIG9yaWdpbgorCisgIE5DdXJzZXNXaW5kb3coTkN1cnNlc1dpbmRvdyYgcGFyLC8vIHBhcmVudCB3aW5kb3cKKwkJaW50IG5saW5lcywgICAgICAgIC8vIG51bWJlciBvZiBsaW5lcworCQlpbnQgbmNvbHMsICAgICAgICAgLy8gbnVtYmVyIG9mIGNvbHVtbnMKKwkJaW50IGJlZ2luX3ksICAgICAgIC8vIGFic29sdXRlIG9yIHJlbGF0aXZlCisJCWludCBiZWdpbl94LCAgICAgICAvLyAgIG9yaWdpbnM6CisJCWNoYXIgYWJzcmVsID0gJ2EnKTsvLyBpZiBgYScsIGJlZ2luX3kgJiBiZWdpbl94IGFyZQorICAvLyBhYnNvbHV0ZSBzY3JlZW4gcG9zLCBlbHNlIGlmIGByJywgdGhleSBhcmUgcmVsYXRpdmUgdG8gcGFyIG9yaWdpbgorCisgIE5DdXJzZXNXaW5kb3coTkN1cnNlc1dpbmRvdyYgcGFyLC8vIHBhcmVudCB3aW5kb3cKKwkJYm9vbCBkb19ib3ggPSBUUlVFKTsKKyAgLy8gdGhpcyBpcyB0aGUgdmVyeSBjb21tb24gY2FzZSB0aGF0IHdlIHdhbnQgdG8gY3JlYXRlIHRoZSBzdWJ3aW5kb3cgdGhhdAorICAvLyBpcyB0d28gbGluZXMgYW5kIHR3byBjb2x1bW5zIHNtYWxsZXIgYW5kIGJlZ2lucyBhdCAoMSwxKS4KKyAgLy8gV2UgbWF5IGF1dG9tYXRpY2FsbHkgcmVxdWVzdCB0aGUgYm94IGFyb3VuZCBpdC4KKworICBOQ3Vyc2VzV2luZG93JiBvcGVyYXRvcj0oY29uc3QgTkN1cnNlc1dpbmRvdyYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykKKyAgICAgICp0aGlzID0gcmhzOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNXaW5kb3coY29uc3QgTkN1cnNlc1dpbmRvdyYgcmhzKQorICAgIDogdyhyaHMudyksIGFsbG9jZWQocmhzLmFsbG9jZWQpLCBwYXIocmhzLnBhciksIHN1YndpbnMocmhzLnN1YndpbnMpLCBzaWIocmhzLnNpYikKKyAgeworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc1dpbmRvdygpOworCisgIE5DdXJzZXNXaW5kb3cgQ2xvbmUoKTsKKyAgLy8gTWFrZSBhbiBleGFjdCBjb3B5IG9mIHRoZSB3aW5kb3cuCisKKyAgLy8gSW5pdGlhbGl6YXRpb24uCisgIHN0YXRpYyB2b2lkICAgIHVzZUNvbG9ycyh2b2lkKTsKKyAgLy8gQ2FsbCB0aGlzIHJvdXRpbmUgdmVyeSBlYXJseSBpZiB5b3Ugd2FudCB0byBoYXZlIGNvbG9ycy4KKworICBzdGF0aWMgaW50IHJpcG9mZmxpbmUoaW50IHJpcG9mZl9saW5lcywKKwkJCWludCAoKmluaXQpKE5DdXJzZXNXaW5kb3cmIHdpbikpOworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSB3aW5kb3cgb2YgcmlwcGVkLW9mIGxpbmVzLgorICAvLyBJZiB0aGUgYXJndW1lbnQgaXMgcG9zaXRpdmUsIGxpbmVzIGFyZSByZW1vdmVkIGZyb20gdGhlIHRvcCwgaWYgaXQKKyAgLy8gaXMgbmVnYXRpdmUgbGluZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgYm90dG9tLiBUaGlzIGVuaGFuY2VzIHRoZQorICAvLyBsb3dsZXZlbCByaXBvZmZsaW5lKCkgZnVuY3Rpb24gYmVjYXVzZSBpdCB1c2VzIHRoZSBpbnRlcm5hbAorICAvLyBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsbG93cyB0byByZW1vdmUgbW9yZSB0aGFuIGp1c3QgYSBzaW5nbGUgbGluZS4KKyAgLy8gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIG5jdXJzZXMgZnVuY3Rpb24uIFRoZQorICAvLyBjcmVhdGlvbiBvZiB0aGUgd2luZG93IGlzIGRlZmVycmVkIHVudGlsIG5jdXJzZXMgZ2V0cyBpbml0aWFsaXplZC4KKyAgLy8gVGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIHRoZW4gY2FsbGVkLgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gdGVybWluYWwgc3RhdHVzCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50ICAgICAgICAgICAgbGluZXMoKSBjb25zdCB7IGluaXRpYWxpemUoKTsgcmV0dXJuIExJTkVTOyB9CisgIC8vIE51bWJlciBvZiBsaW5lcyBvbiB0ZXJtaW5hbCwgKm5vdCogd2luZG93CisKKyAgaW50ICAgICAgICAgICAgY29scygpIGNvbnN0IHsgaW5pdGlhbGl6ZSgpOyByZXR1cm4gQ09MUzsgfQorICAvLyBOdW1iZXIgb2YgY29scyAgb24gdGVybWluYWwsICpub3QqIHdpbmRvdworCisgIGludCAgICAgICAgICAgIHRhYnNpemUoKSBjb25zdCB7IGluaXRpYWxpemUoKTsgcmV0dXJuIFRBQlNJWkU7IH0KKyAgLy8gU2l6ZSBvZiBhIHRhYiBvbiB0ZXJtaW5hbCwgKm5vdCogd2luZG93CisKKyAgc3RhdGljIGludCAgICAgTnVtYmVyT2ZDb2xvcnMoKTsKKyAgLy8gTnVtYmVyIG9mIGF2YWlsYWJsZSBjb2xvcnMKKworICBpbnQgICAgICAgICAgICBjb2xvcnMoKSBjb25zdCB7IHJldHVybiBOdW1iZXJPZkNvbG9ycygpOyB9CisgIC8vIE51bWJlciBvZiBhdmFpbGFibGUgY29sb3JzCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyB3aW5kb3cgc3RhdHVzCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50ICAgICAgICAgICAgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbWF4eSgpICsgMTsgfQorICAvLyBOdW1iZXIgb2YgbGluZXMgaW4gdGhpcyB3aW5kb3cKKworICBpbnQgICAgICAgICAgICB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1heHgoKSArIDE7IH0KKyAgLy8gTnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhpcyB3aW5kb3cKKworICBpbnQgICAgICAgICAgICBiZWd4KCkgY29uc3QgeyByZXR1cm4gZ2V0YmVneCh3KTsgfQorICAvLyBDb2x1bW4gb2YgdG9wIGxlZnQgY29ybmVyIHJlbGF0aXZlIHRvIHN0ZHNjcgorCisgIGludCAgICAgICAgICAgIGJlZ3koKSBjb25zdCB7IHJldHVybiBnZXRiZWd5KHcpOyB9CisgIC8vIExpbmUgb2YgdG9wIGxlZnQgY29ybmVyIHJlbGF0aXZlIHRvIHN0ZHNjcgorCisgIGludCAgICAgICAgICAgIGN1cngoKSBjb25zdCB7IHJldHVybiBnZXRjdXJ4KHcpOyB9CisgIC8vIENvbHVtbiBvZiB0b3AgbGVmdCBjb3JuZXIgcmVsYXRpdmUgdG8gc3Rkc2NyCisKKyAgaW50ICAgICAgICAgICAgY3VyeSgpIGNvbnN0IHsgcmV0dXJuIGdldGN1cnkodyk7IH0KKyAgLy8gTGluZSBvZiB0b3AgbGVmdCBjb3JuZXIgcmVsYXRpdmUgdG8gc3Rkc2NyCisKKyAgaW50ICAgICAgICAgICAgbWF4eCgpIGNvbnN0IHsgcmV0dXJuIGdldG1heHgodykgPT0gRVJSID8gRVJSIDogZ2V0bWF4eCh3KS0xOyB9CisgIC8vIExhcmdlc3QgeCBjb29yZCBpbiB3aW5kb3cKKworICBpbnQgICAgICAgICAgICBtYXh5KCkgY29uc3QgeyByZXR1cm4gZ2V0bWF4eSh3KSA9PSBFUlIgPyBFUlIgOiBnZXRtYXh5KHcpLTE7IH0KKyAgLy8gTGFyZ2VzdCB5IGNvb3JkIGluIHdpbmRvdworCisgIHNob3J0ICAgICAgICAgIGdldGNvbG9yKCkgY29uc3Q7CisgIC8vIEFjdHVhbCBjb2xvciBwYWlyCisKKyAgc2hvcnQgICAgICAgICAgZm9yZWdyb3VuZCgpIGNvbnN0IHsgcmV0dXJuIGdldGNvbG9yKDApOyB9CisgIC8vIEFjdHVhbCBmb3JlZ3JvdW5kIGNvbG9yCisKKyAgc2hvcnQgICAgICAgICAgYmFja2dyb3VuZCgpIGNvbnN0IHsgcmV0dXJuIGdldGNvbG9yKDEpOyB9CisgIC8vIEFjdHVhbCBiYWNrZ3JvdW5kIGNvbG9yCisKKyAgaW50ICAgICAgICAgICAgc2V0cGFsZXR0ZShzaG9ydCBmb3JlLCBzaG9ydCBiYWNrKTsKKyAgLy8gU2V0IGNvbG9yIHBhbGV0dGUgZW50cnkKKworICBpbnQgICAgICAgICAgICBzZXRjb2xvcihzaG9ydCBwYWlyKTsKKyAgLy8gU2V0IGFjdHVhbGx5IHVzZWQgcGFsZXR0ZSBlbnRyeQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gd2luZG93IHBvc2l0aW9uaW5nCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdmlydHVhbCBpbnQgICAgbXZ3aW4oaW50IGJlZ2luX3ksIGludCBiZWdpbl94KSB7CisgICAgcmV0dXJuIDo6bXZ3aW4odywgYmVnaW5feSwgYmVnaW5feCk7IH0KKyAgLy8gTW92ZSB3aW5kb3cgdG8gbmV3IHBvc2l0aW9uIHdpdGggdGhlIG5ldyBwb3NpdGlvbiBhcyB0b3AgbGVmdCBjb3JuZXIuCisgIC8vIFRoaXMgaXMgdmlydHVhbCBiZWNhdXNlIGl0IGlzIHJlZGVmaW5lZCBpbiBOQ3Vyc2VzUGFuZWwuCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBjb29yZGluYXRlIHBvc2l0aW9uaW5nCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50ICAgICAgICAgICAgbW92ZShpbnQgeSwgaW50IHgpIHsgcmV0dXJuIDo6d21vdmUodywgeSwgeCk7IH0KKyAgLy8gTW92ZSBjdXJzb3IgdGhlIHRoaXMgcG9zaXRpb24KKworICB2b2lkICAgICAgICAgICBnZXR5eChpbnQmIHksIGludCYgeCkgY29uc3QgeyA6OmdldHl4KHcsIHksIHgpOyB9CisgIC8vIEdldCBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IKKworICB2b2lkICAgICAgICAgICBnZXRiZWd5eChpbnQmIHksIGludCYgeCkgY29uc3QgeyA6OmdldGJlZ3l4KHcsIHksIHgpOyB9CisgIC8vIEdldCBiZWdpbm5pbmcgb2YgdGhlIHdpbmRvdworCisgIHZvaWQgICAgICAgICAgIGdldG1heHl4KGludCYgeSwgaW50JiB4KSBjb25zdCB7IDo6Z2V0bWF4eXgodywgeSwgeCk7IH0KKyAgLy8gR2V0IHNpemUgb2YgdGhlIHdpbmRvdworCisgIHZvaWQgICAgICAgICAgIGdldHBhcnl4KGludCYgeSwgaW50JiB4KSBjb25zdCB7IDo6Z2V0cGFyeXgodywgeSwgeCk7IH0KKyAgLy8gR2V0IHBhcmVudCdzIGJlZ2lubmluZyBvZiB0aGUgd2luZG93CisKKyAgaW50ICAgICAgICAgICAgbXZjdXIoaW50IG9sZHJvdywgaW50IG9sZGNvbCwgaW50IG5ld3JvdywgaW50IG5ld2NvbCkgY29uc3QgeworICAgIHJldHVybiA6Om12Y3VyKG9sZHJvdywgb2xkY29sLCBuZXdyb3csIG5ld2NvbCk7IH0KKyAgLy8gUGVyZm9ybSBsb3dsZXZlbCBjdXJzb3IgbW90aW9uIHRoYXQgdGFrZXMgZWZmZWN0IGltbWVkaWF0ZWx5LgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gaW5wdXQKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgICAgICAgICAgICBnZXRjaCgpIHsgcmV0dXJuIDo6d2dldGNoKHcpOyB9CisgIC8vIEdldCBhIGtleXN0cm9rZSBmcm9tIHRoZSB3aW5kb3cuCisKKyAgaW50ICAgICAgICAgICAgZ2V0Y2goaW50IHksIGludCB4KSB7IHJldHVybiA6Om12d2dldGNoKHcsIHksIHgpOyB9CisgIC8vIE1vdmUgY3Vyc29yIHRvIHBvc2l0aW9uIGFuZCBnZXQgYSBrZXlzdHJva2UgZnJvbSB0aGUgd2luZG93CisKKyAgaW50ICAgICAgICAgICAgZ2V0c3RyKGNoYXIqIHN0ciwgaW50IG49LTEpIHsKKyAgICByZXR1cm4gOjp3Z2V0bnN0cih3LCBzdHIsIG4pOyB9CisgIC8vIFJlYWQgYSBzZXJpZXMgb2YgY2hhcmFjdGVycyBpbnRvIHN0ciB1bnRpbCBhIG5ld2xpbmUgb3IgY2FycmlhZ2UgcmV0dXJuCisgIC8vIGlzIHJlY2VpdmVkLiBSZWFkIGF0IG1vc3QgbiBjaGFyYWN0ZXJzLiBJZiBuIGlzIG5lZ2F0aXZlLCB0aGUgbGltaXQgaXMKKyAgLy8gaWdub3JlZC4KKworICBpbnQgICAgICAgICAgICBnZXRzdHIoaW50IHksIGludCB4LCBjaGFyKiBzdHIsIGludCBuPS0xKSB7CisgICAgcmV0dXJuIDo6bXZ3Z2V0bnN0cih3LCB5LCB4LCBzdHIsIG4pOyB9CisgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIHBlcmZvcm0gdGhlIGdldHN0cigpCisgIC8vIGFzIGRlc2NyaWJlZCBhYm92ZS4KKworICBpbnQgICAgICAgICAgICBpbnN0cihjaGFyICpzLCBpbnQgbj0tMSkgeyByZXR1cm4gOjp3aW5uc3RyKHcsIHMsIG4pOyB9CisgIC8vIEdldCBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHdpbmRvdyBpbnRvIHRoZSBidWZmZXIgcy4gUmV0cmlldmUKKyAgLy8gYXQgbW9zdCBuIGNoYXJhY3RlcnMsIGlmIG4gaXMgbmVnYXRpdmUgcmV0cmlldmUgYWxsIGNoYXJhY3RlcnMgdXAgdG8gdGhlCisgIC8vIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLiBBdHRyaWJ1dGVzIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBjaGFyYWN0ZXJzLgorCisgIGludCAgICAgICAgICAgIGluc3RyKGludCB5LCBpbnQgeCwgY2hhciAqcywgaW50IG49LTEpIHsKKyAgICByZXR1cm4gOjptdndpbm5zdHIodywgeSwgeCwgcywgbik7IH0KKyAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIHRoZW4gcGVyZm9ybSB0aGUgaW5zdHIoKQorICAvLyBhcyBkZXNjcmliZWQgYWJvdmUuCisKKyAgaW50ICAgICAgICAgICAgc2NhbncoY29uc3QgY2hhciogZm10LCAuLi4pCisgICAgLy8gUGVyZm9ybSBhIHNjYW53IGZ1bmN0aW9uIGZyb20gdGhlIHdpbmRvdy4KKyNpZiBfX0dOVUdfXyA+PSAyCisgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAoc2NhbmYsIDIsIDMpKSk7CisjZWxzZQorICA7CisjZW5kaWYKKworICBpbnQgICAgICAgICAgICBzY2Fudyhjb25zdCBjaGFyKiwgdmFfbGlzdCk7CisgICAgLy8gUGVyZm9ybSBhIHNjYW53IGZ1bmN0aW9uIGZyb20gdGhlIHdpbmRvdy4KKworICBpbnQgICAgICAgICAgICBzY2FudyhpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKQorICAgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIHBlcmZvcm0gYSBzY2FudworICAgIC8vIGZyb20gdGhlIHdpbmRvdy4KKyNpZiBfX0dOVUdfXyA+PSAyCisgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAoc2NhbmYsIDQsIDUpKSk7CisjZWxzZQorICA7CisjZW5kaWYKKworICBpbnQgICAgICAgICAgICBzY2FudyhpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCk7CisgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIHRoZW4gcGVyZm9ybSBhIHNjYW53CisgICAgLy8gZnJvbSB0aGUgd2luZG93LgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gb3V0cHV0CisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50ICAgICAgICAgICAgYWRkY2goY29uc3QgY2h0eXBlIGNoKSB7IHJldHVybiA6OndhZGRjaCh3LCBjaCk7IH0KKyAgLy8gUHV0IGF0dHJpYnV0ZWQgY2hhcmFjdGVyIHRvIHRoZSB3aW5kb3cuCisKKyAgaW50ICAgICAgICAgICAgYWRkY2goaW50IHksIGludCB4LCBjb25zdCBjaHR5cGUgY2gpIHsKKyAgICByZXR1cm4gOjptdndhZGRjaCh3LCB5LCB4LCBjaCk7IH0KKyAgLy8gTW92ZSBjdXJzb3IgdG8gdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiBhbmQgdGhlbiBwdXQgYXR0cmlidXRlZCBjaGFyYWN0ZXIKKyAgLy8gdG8gdGhlIHdpbmRvdy4KKworICBpbnQgICAgICAgICAgICBlY2hvY2hhcihjb25zdCBjaHR5cGUgY2gpIHsgcmV0dXJuIDo6d2VjaG9jaGFyKHcsIGNoKTsgfQorICAvLyBQdXQgYXR0cmlidXRlZCBjaGFyYWN0ZXIgdG8gdGhlIHdpbmRvdyBhbmQgcmVmcmVzaCBpdCBpbW1lZGlhdGVseS4KKworICBpbnQgICAgICAgICAgICBhZGRzdHIoY29uc3QgY2hhciogc3RyLCBpbnQgbj0tMSkgeworICAgIHJldHVybiA6OndhZGRuc3RyKHcsIHN0ciwgbik7IH0KKyAgLy8gV3JpdGUgdGhlIHN0cmluZyBzdHIgdG8gdGhlIHdpbmRvdywgc3RvcCB3cml0aW5nIGlmIHRoZSB0ZXJtaW5hdGluZworICAvLyBOVUwgb3IgdGhlIGxpbWl0IG4gaXMgcmVhY2hlZC4gSWYgbiBpcyBuZWdhdGl2ZSwgaXQgaXMgaWdub3JlZC4KKworICBpbnQgICAgICAgICAgICBhZGRzdHIoaW50IHksIGludCB4LCBjb25zdCBjaGFyICogc3RyLCBpbnQgbj0tMSkgeworICAgIHJldHVybiA6Om12d2FkZG5zdHIodywgeSwgeCwgc3RyLCBuKTsgfQorICAvLyBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiBhbmQgdGhlbiBwZXJmb3JtIHRoZSBhZGRjaHN0cgorICAvLyBhcyBkZXNjcmliZWQgYWJvdmUuCisKKyAgaW50ICAgICAgICAgICAgYWRkY2hzdHIoY29uc3QgY2h0eXBlKiBzdHIsIGludCBuPS0xKSB7CisgICAgcmV0dXJuIDo6d2FkZGNobnN0cih3LCBzdHIsIG4pOyB9CisgIC8vIFdyaXRlIHRoZSBzdHJpbmcgc3RyIHRvIHRoZSB3aW5kb3csIHN0b3Agd3JpdGluZyBpZiB0aGUgdGVybWluYXRpbmcKKyAgLy8gTlVMIG9yIHRoZSBsaW1pdCBuIGlzIHJlYWNoZWQuIElmIG4gaXMgbmVnYXRpdmUsIGl0IGlzIGlnbm9yZWQuCisKKyAgaW50ICAgICAgICAgICAgYWRkY2hzdHIoaW50IHksIGludCB4LCBjb25zdCBjaHR5cGUgKiBzdHIsIGludCBuPS0xKSB7CisgICAgcmV0dXJuIDo6bXZ3YWRkY2huc3RyKHcsIHksIHgsIHN0ciwgbik7IH0KKyAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIHRoZW4gcGVyZm9ybSB0aGUgYWRkY2hzdHIKKyAgLy8gYXMgZGVzY3JpYmVkIGFib3ZlLgorCisgIGludCAgICAgICAgICAgIHByaW50dyhjb25zdCBjaGFyKiBmbXQsIC4uLikKKyAgICAvLyBEbyBhIGZvcm1hdHRlZCBwcmludCB0byB0aGUgd2luZG93LgorI2lmIChfX0dOVUdfXyA+PSAyKSAmJiAhZGVmaW5lZChwcmludGYpCisgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworI2Vsc2UKKyAgOworI2VuZGlmCisKKyAgaW50ICAgICAgICAgICAgcHJpbnR3KGludCB5LCBpbnQgeCwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQorICAgIC8vIE1vdmUgdGhlIGN1cnNvciBhbmQgdGhlbiBkbyBhIGZvcm1hdHRlZCBwcmludCB0byB0aGUgd2luZG93LgorI2lmIChfX0dOVUdfXyA+PSAyKSAmJiAhZGVmaW5lZChwcmludGYpCisgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOworI2Vsc2UKKyAgOworI2VuZGlmCisKKyAgaW50ICAgICAgICAgICAgcHJpbnR3KGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcmdzKTsKKyAgICAvLyBEbyBhIGZvcm1hdHRlZCBwcmludCB0byB0aGUgd2luZG93LgorCisgIGludCAgICAgICAgICAgIHByaW50dyhpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIgKiBmbXQsIHZhX2xpc3QgYXJncyk7CisgICAgLy8gTW92ZSB0aGUgY3Vyc29yIGFuZCB0aGVuIGRvIGEgZm9ybWF0dGVkIHByaW50IHRvIHRoZSB3aW5kb3cuCisKKyAgY2h0eXBlICAgICAgICAgaW5jaCgpIGNvbnN0IHsgcmV0dXJuIDo6d2luY2godyk7IH0KKyAgLy8gUmV0cmlldmUgYXR0cmlidXRlZCBjaGFyYWN0ZXIgdW5kZXIgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLgorCisgIGNodHlwZSAgICAgICAgIGluY2goaW50IHksIGludCB4KSB7IHJldHVybiA6Om12d2luY2godywgeSwgeCk7IH0KKyAgLy8gTW92ZSBjdXJzb3IgdG8gcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIHJldHJpZXZlIGF0dHJpYnV0ZWQgY2hhcmFjdGVyCisgIC8vIGF0IHRoaXMgcG9zaXRpb24uCisKKyAgaW50ICAgICAgICAgICAgaW5jaHN0cihjaHR5cGUqIHN0ciwgaW50IG49LTEpIHsKKyAgICByZXR1cm4gOjp3aW5jaG5zdHIodywgc3RyLCBuKTsgfQorICAvLyBSZWFkIHRoZSBzdHJpbmcgc3RyIGZyb20gdGhlIHdpbmRvdywgc3RvcCByZWFkaW5nIGlmIHRoZSB0ZXJtaW5hdGluZworICAvLyBOVUwgb3IgdGhlIGxpbWl0IG4gaXMgcmVhY2hlZC4gSWYgbiBpcyBuZWdhdGl2ZSwgaXQgaXMgaWdub3JlZC4KKworICBpbnQgICAgICAgICAgICBpbmNoc3RyKGludCB5LCBpbnQgeCwgY2h0eXBlICogc3RyLCBpbnQgbj0tMSkgeworICAgIHJldHVybiA6Om12d2luY2huc3RyKHcsIHksIHgsIHN0ciwgbik7IH0KKyAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIHRoZW4gcGVyZm9ybSB0aGUgaW5jaHN0cgorICAvLyBhcyBkZXNjcmliZWQgYWJvdmUuCisKKyAgaW50ICAgICAgICAgICAgaW5zY2goY2h0eXBlIGNoKSB7IHJldHVybiA6OndpbnNjaCh3LCBjaCk7IH0KKyAgLy8gSW5zZXJ0IGF0dHJpYnV0ZWQgY2hhcmFjdGVyIGludG8gdGhlIHdpbmRvdyBiZWZvcmUgY3VycmVudCBjdXJzb3IKKyAgLy8gcG9zaXRpb24uCisKKyAgaW50ICAgICAgICAgICAgaW5zY2goaW50IHksIGludCB4LCBjaHR5cGUgY2gpIHsKKyAgICByZXR1cm4gOjptdndpbnNjaCh3LCB5LCB4LCBjaCk7IH0KKyAgLy8gTW92ZSBjdXJzb3IgdG8gcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIGluc2VydCB0aGUgYXR0cmlidXRlZAorICAvLyBjaGFyYWN0ZXIgYmVmb3JlIHRoYXQgcG9zaXRpb24uCisKKyAgaW50ICAgICAgICAgICAgaW5zZXJ0bG4oKSB7IHJldHVybiA6OndpbnNkZWxsbih3LCAxKTsgfQorICAvLyBJbnNlcnQgYW4gZW1wdHkgbGluZSBhYm92ZSB0aGUgY3VycmVudCBsaW5lLgorCisgIGludCAgICAgICAgICAgIGluc2RlbGxuKGludCBuPTEpIHsgcmV0dXJuIDo6d2luc2RlbGxuKHcsIG4pOyB9CisgIC8vIElmIG4+MCBpbnNlcnQgdGhhdCBtYW55IGxpbmVzIGFib3ZlIHRoZSBjdXJyZW50IGxpbmUuIElmIG48MCBkZWxldGUKKyAgLy8gdGhhdCBtYW55IGxpbmVzIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJyZW50IGxpbmUuCisKKyAgaW50ICAgICAgICAgICAgaW5zc3RyKGNvbnN0IGNoYXIgKnMsIGludCBuPS0xKSB7CisgICAgcmV0dXJuIDo6d2luc25zdHIodywgcywgbik7IH0KKyAgLy8gSW5zZXJ0IHRoZSBzdHJpbmcgaW50byB0aGUgd2luZG93IGJlZm9yZSB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uCisgIC8vIEluc2VydCBzdG9wcyBhdCBlbmQgb2Ygc3RyaW5nIG9yIHdoZW4gdGhlIGxpbWl0IG4gaXMgcmVhY2hlZC4gSWYgbiBpcworICAvLyBuZWdhdGl2ZSwgaXQgaXMgaWdub3JlZC4KKworICBpbnQgICAgICAgICAgICBpbnNzdHIoaW50IHksIGludCB4LCBjb25zdCBjaGFyICpzLCBpbnQgbj0tMSkgeworICAgIHJldHVybiA6Om12d2luc25zdHIodywgeSwgeCwgcywgbik7IH0KKyAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIHRoZW4gcGVyZm9ybSB0aGUgaW5zc3RyKCkKKyAgLy8gYXMgZGVzY3JpYmVkIGFib3ZlLgorCisgIGludCAgICAgICAgICAgIGF0dHJvbiAoY2h0eXBlIGF0KSB7IHJldHVybiA6OndhdHRyb24gKHcsIGF0KTsgfQorICAvLyBTd2l0Y2ggb24gdGhlIHdpbmRvdyBhdHRyaWJ1dGVzOworCisgIGludCAgICAgICAgICAgIGF0dHJvZmYoY2h0eXBlIGF0KSB7IHJldHVybiA6OndhdHRyb2ZmKHcsIHN0YXRpY19jYXN0PGludD4oYXQpKTsgfQorICAvLyBTd2l0Y2ggb2ZmIHRoZSB3aW5kb3cgYXR0cmlidXRlczsKKworICBpbnQgICAgICAgICAgICBhdHRyc2V0KGNodHlwZSBhdCkgeyByZXR1cm4gOjp3YXR0cnNldCh3LCBzdGF0aWNfY2FzdDxpbnQ+KGF0KSk7IH0KKyAgLy8gU2V0IHRoZSB3aW5kb3cgYXR0cmlidXRlczsKKworICBjaHR5cGUgICAgICAgICBhdHRyZ2V0KCkgeyByZXR1cm4gOjpnZXRhdHRycyh3KTsgfQorICAvLyBHZXQgdGhlIHdpbmRvdyBhdHRyaWJ1dGVzOworCisgIGludCAgICAgICAgICAgIGNvbG9yX3NldChzaG9ydCBjb2xvcl9wYWlyX251bWJlciwgdm9pZCogb3B0cz1OVUxMKSB7CisgICAgcmV0dXJuIDo6d2NvbG9yX3NldCh3LCBjb2xvcl9wYWlyX251bWJlciwgb3B0cyk7IH0KKyAgLy8gU2V0IHRoZSB3aW5kb3cgY29sb3IgYXR0cmlidXRlOworCisgIGludCAgICAgICAgICAgIGNoZ2F0KGludCBuLCBhdHRyX3QgYXR0ciwgc2hvcnQgY29sb3IsIGNvbnN0IHZvaWQgKm9wdHM9TlVMTCkgeworICAgIHJldHVybiA6OndjaGdhdCh3LCBuLCBhdHRyLCBjb2xvciwgb3B0cyk7IH0KKyAgLy8gQ2hhbmdlIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZXh0IG4gY2hhcmFjdGVycyBpbiB0aGUgY3VycmVudCBsaW5lLiBJZgorICAvLyBuIGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGluIHRoZQorICAvLyBsaW5lLCB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGNoYW5nZWQgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KKworICBpbnQgICAgICAgICAgICBjaGdhdChpbnQgeSwgaW50IHgsCisJCSAgICAgICBpbnQgbiwgYXR0cl90IGF0dHIsIHNob3J0IGNvbG9yLCBjb25zdCB2b2lkICpvcHRzPU5VTEwpIHsKKyAgICByZXR1cm4gOjptdndjaGdhdCh3LCB5LCB4LCBuLCBhdHRyLCBjb2xvciwgb3B0cyk7IH0KKyAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIHRoZW4gcGVyZm9ybSBjaGdhdCgpIGFzCisgIC8vIGRlc2NyaWJlZCBhYm92ZS4KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIGJhY2tncm91bmQKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBjaHR5cGUgICAgICAgICBnZXRia2dkKCkgY29uc3QgeyByZXR1cm4gOjpnZXRia2dkKHcpOyB9CisgIC8vIEdldCBjdXJyZW50IGJhY2tncm91bmQgc2V0dGluZy4KKworICBpbnQgICAgICAgICAgICBia2dkKGNvbnN0IGNodHlwZSBjaCkgeyByZXR1cm4gOjp3YmtnZCh3LCBjaCk7IH0KKyAgLy8gU2V0IHRoZSBiYWNrZ3JvdW5kIHByb3BlcnR5IGFuZCBhcHBseSBpdCB0byB0aGUgd2luZG93LgorCisgIHZvaWQgICAgICAgICAgIGJrZ2RzZXQoY2h0eXBlIGNoKSB7IDo6d2JrZ2RzZXQodywgY2gpOyB9CisgIC8vIFNldCB0aGUgYmFja2dyb3VuZCBwcm9wZXJ0eS4KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIGJvcmRlcnMKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgICAgICAgICAgICBib3goY2h0eXBlIHZlcnQ9MCwgY2h0eXBlICBob3I9MCkgeworICAgIHJldHVybiA6Ondib3JkZXIodywgdmVydCwgdmVydCwgaG9yLCBob3IsIDAsIDAsIDAsIDApOyB9CisgIC8vIERyYXcgYSBib3ggYXJvdW5kIHRoZSB3aW5kb3cgd2l0aCB0aGUgZ2l2ZW4gdmVydGljYWwgYW5kIGhvcml6b250YWwKKyAgLy8gZHJhd2luZyBjaGFyYWN0ZXJzLiBJZiB5b3Ugc3BlY2lmeSBhIHplcm8gYXMgY2hhcmFjdGVyLCBjdXJzZXMgd2lsbCB0cnkKKyAgLy8gdG8gZmluZCBhICJuaWNlIiBjaGFyYWN0ZXIuCisKKyAgaW50ICAgICAgICAgICAgYm9yZGVyKGNodHlwZSBsZWZ0PTAsIGNodHlwZSByaWdodD0wLAorCQkJY2h0eXBlIHRvcCA9MCwgY2h0eXBlIGJvdHRvbT0wLAorCQkJY2h0eXBlIHRvcF9sZWZ0ID0wLCBjaHR5cGUgdG9wX3JpZ2h0PTAsCisJCQljaHR5cGUgYm90dG9tX2xlZnQgPTAsIGNodHlwZSBib3R0b21fcmlnaHQ9MCkgeworICAgIHJldHVybiA6Ondib3JkZXIodywgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0b3BfbGVmdCwgdG9wX3JpZ2h0LAorCQkgICAgIGJvdHRvbV9sZWZ0LCBib3R0b21fcmlnaHQpOyB9CisgIC8vIERyYXcgYSBib3JkZXIgYXJvdW5kIHRoZSB3aW5kb3cgd2l0aCB0aGUgZ2l2ZW4gY2hhcmFjdGVycyBmb3IgdGhlCisgIC8vIHZhcmlvdXMgcGFydHMgb2YgdGhlIGJvcmRlci4gSWYgeW91IHBhc3MgemVybyBmb3IgYSBjaGFyYWN0ZXIsIGN1cnNlcworICAvLyB3aWxsIHRyeSB0byBmaW5kICJuaWNlIiBjaGFyYWN0ZXJzLgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gbGluZXMgYW5kIGJveGVzCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50ICAgICAgICAgICAgaGxpbmUoaW50IGxlbiwgY2h0eXBlIGNoPTApIHsgcmV0dXJuIDo6d2hsaW5lKHcsIGNoLCBsZW4pOyB9CisgIC8vIERyYXcgYSBob3Jpem9udGFsIGxpbmUgb2YgbGVuIGNoYXJhY3RlcnMgd2l0aCB0aGUgZ2l2ZW4gY2hhcmFjdGVyLiBJZgorICAvLyB5b3UgcGFzcyB6ZXJvIGZvciB0aGUgY2hhcmFjdGVyLCBjdXJzZXMgd2lsbCB0cnkgdG8gZmluZCBhICJuaWNlIiBvbmUuCisKKyAgaW50ICAgICAgICAgICAgaGxpbmUoaW50IHksIGludCB4LCBpbnQgbGVuLCBjaHR5cGUgY2g9MCkgeworICAgIHJldHVybiA6Om12d2hsaW5lKHcsIHksIHgsIGNoLCBsZW4pOyB9CisgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIGRyYXcgYSBob3Jpem9udGFsIGxpbmUuCisKKyAgaW50ICAgICAgICAgICAgdmxpbmUoaW50IGxlbiwgY2h0eXBlIGNoPTApIHsgcmV0dXJuIDo6d3ZsaW5lKHcsIGNoLCBsZW4pOyB9CisgIC8vIERyYXcgYSB2ZXJ0aWNhbCBsaW5lIG9mIGxlbiBjaGFyYWN0ZXJzIHdpdGggdGhlIGdpdmVuIGNoYXJhY3Rlci4gSWYKKyAgLy8geW91IHBhc3MgemVybyBmb3IgdGhlIGNoYXJhY3RlciwgY3Vyc2VzIHdpbGwgdHJ5IHRvIGZpbmQgYSAibmljZSIgb25lLgorCisgIGludCAgICAgICAgICAgIHZsaW5lKGludCB5LCBpbnQgeCwgaW50IGxlbiwgY2h0eXBlIGNoPTApIHsKKyAgICByZXR1cm4gOjptdnd2bGluZSh3LCB5LCB4LCBjaCwgbGVuKTsgfQorICAvLyBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiBhbmQgdGhlbiBkcmF3IGEgdmVydGljYWwgbGluZS4KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIGVyYXN1cmUKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgICAgICAgICAgICBlcmFzZSgpIHsgcmV0dXJuIDo6d2VyYXNlKHcpOyB9CisgIC8vIEVyYXNlIHRoZSB3aW5kb3cuCisKKyAgaW50ICAgICAgICAgICAgY2xlYXIoKSB7IHJldHVybiA6OndjbGVhcih3KTsgfQorICAvLyBDbGVhciB0aGUgd2luZG93LgorCisgIGludCAgICAgICAgICAgIGNsZWFyb2soYm9vbCBiZikgeyByZXR1cm4gOjpjbGVhcm9rKHcsIGJmKTsgfQorICAvLyBTZXQvUmVzZXQgdGhlIGNsZWFyIGZsYWcuIElmIHNldCwgdGhlIG5leHQgcmVmcmVzaCgpIHdpbGwgY2xlYXIgdGhlCisgIC8vIHNjcmVlbi4KKworICBpbnQgICAgICAgICAgICBjbHJ0b2JvdCgpIHsgcmV0dXJuIDo6d2NscnRvYm90KHcpOyB9CisgIC8vIENsZWFyIHRvIHRoZSBlbmQgb2YgdGhlIHdpbmRvdy4KKworICBpbnQgICAgICAgICAgICBjbHJ0b2VvbCgpIHsgcmV0dXJuIDo6d2NscnRvZW9sKHcpOyB9CisgIC8vIENsZWFyIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCisKKyAgaW50ICAgICAgICAgICAgZGVsY2goKSB7IHJldHVybiA6OndkZWxjaCh3KTsgfQorICAvLyBEZWxldGUgY2hhcmFjdGVyIHVuZGVyIHRoZSBjdXJzb3IuCisKKyAgaW50ICAgICAgICAgICAgZGVsY2goaW50IHksIGludCB4KSB7IHJldHVybiA6Om12d2RlbGNoKHcsIHksIHgpOyB9CisgIC8vIE1vdmUgY3Vyc29yIHRvIHJlcXVlc3RlZCBwb3NpdGlvbiBhbmQgZGVsZXRlIHRoZSBjaGFyYWN0ZXIgdW5kZXIgdGhlCisgIC8vIGN1cnNvci4KKworICBpbnQgICAgICAgICAgICBkZWxldGVsbigpIHsgcmV0dXJuIDo6d2luc2RlbGxuKHcsIC0xKTsgfQorICAvLyBEZWxldGUgdGhlIGN1cnJlbnQgbGluZS4KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIHNjcmVlbiBjb250cm9sCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50ICAgICAgICAgICAgc2Nyb2xsKGludCBhbW91bnQ9MSkgeyByZXR1cm4gOjp3c2NybCh3LCBhbW91bnQpOyB9CisgIC8vIFNjcm9sbCBhbW91bnQgbGluZXMuIElmIGFtb3VudCBpcyBwb3NpdGl2ZSwgc2Nyb2xsIHVwLCBvdGhlcndpc2UKKyAgLy8gc2Nyb2xsIGRvd24uCisKKyAgaW50ICAgICAgICAgICAgc2Nyb2xsb2soYm9vbCBiZikgeyByZXR1cm4gOjpzY3JvbGxvayh3LCBiZik7IH0KKyAgLy8gSWYgYmYgaXMgVFJVRSwgd2luZG93IHNjcm9sbHMgaWYgY3Vyc29yIGlzIG1vdmVkIG9mZiB0aGUgYm90dG9tCisgIC8vIGVkZ2Ugb2YgdGhlIHdpbmRvdyBvciBhIHNjcm9sbGluZyByZWdpb24sIG90aGVyd2lzZSB0aGUgY3Vyc29yIGlzIGxlZnQKKyAgLy8gYXQgdGhlIGJvdHRvbSBsaW5lLgorCisgIGludCAgICAgICAgICAgIHNldHNjcnJlZyhpbnQgZnJvbSwgaW50IHRvKSB7CisgICAgcmV0dXJuIDo6d3NldHNjcnJlZyh3LCBmcm9tLCB0byk7IH0KKyAgLy8gRGVmaW5lIGEgc29mdCBzY3JvbGxpbmcgcmVnaW9uLgorCisgIGludCAgICAgICAgICAgIGlkbG9rKGJvb2wgYmYpIHsgcmV0dXJuIDo6aWRsb2sodywgYmYpOyB9CisgIC8vIElmIGJmIGlzIFRSVUUsIHVzZSBpbnNlcnQvZGVsZXRlIGxpbmUgaGFyZHdhcmUgc3VwcG9ydCBpZiBwb3NzaWJsZS4KKyAgLy8gT3RoZXJ3aXNlIGRvIGl0IGluIHNvZnR3YXJlLgorCisgIHZvaWQgICAgICAgICAgIGlkY29rKGJvb2wgYmYpIHsgOjppZGNvayh3LCBiZik7IH0KKyAgLy8gSWYgYmYgaXMgVFJVRSwgdXNlIGluc2VydC9kZWxldGUgY2hhcmFjdGVyIGhhcmR3YXJlIHN1cHBvcnQgaWYgcG9zc2libGUuCisgIC8vIE90aGVyd2lzZSBkbyBpdCBpbiBzb2Z0d2FyZS4KKworICBpbnQgICAgICAgICAgICB0b3VjaGxpbmUoaW50IHMsIGludCBjKSB7IHJldHVybiA6OnRvdWNobGluZSh3LCBzLCBjKTsgfQorICAvLyBNYXJrIHRoZSBnaXZlbiBsaW5lcyBhcyBtb2RpZmllZC4KKworICBpbnQgICAgICAgICAgICB0b3VjaHdpbigpICAgeyByZXR1cm4gOjp3dG91Y2hsbih3LCAwLCBoZWlnaHQoKSwgMSk7IH0KKyAgLy8gTWFyayB0aGUgd2hvbGUgd2luZG93IGFzIG1vZGlmaWVkLgorCisgIGludCAgICAgICAgICAgIHVudG91Y2h3aW4oKSB7IHJldHVybiA6Ond0b3VjaGxuKHcsIDAsIGhlaWdodCgpLCAwKTsgfQorICAvLyBNYXJrIHRoZSB3aG9sZSB3aW5kb3cgYXMgdW5tb2RpZmllZC4KKworICBpbnQgICAgICAgICAgICB0b3VjaGxuKGludCBzLCBpbnQgY250LCBib29sIGNoYW5nZWQ9VFJVRSkgeworICAgIHJldHVybiA6Ond0b3VjaGxuKHcsIHMsIGNudCwgc3RhdGljX2Nhc3Q8aW50PihjaGFuZ2VkID8gMSA6IDApKTsgfQorICAvLyBNYXJrIGNudCBsaW5lcyBiZWdpbm5pbmcgZnJvbSBsaW5lIHMgYXMgY2hhbmdlZCBvciB1bmNoYW5nZWQsIGRlcGVuZGluZworICAvLyBvbiB0aGUgdmFsdWUgb2YgdGhlIGNoYW5nZWQgZmxhZy4KKworICBib29sICAgICAgICAgICBpc19saW5ldG91Y2hlZChpbnQgbGluZSkgY29uc3QgeworICAgIHJldHVybiAoOjppc19saW5ldG91Y2hlZCh3LCBsaW5lKSA/IFRSVUU6RkFMU0UpOyB9CisgIC8vIFJldHVybiBUUlVFIGlmIGxpbmUgaXMgbWFya2VkIGFzIGNoYW5nZWQsIEZBTFNFIG90aGVyd2lzZQorCisgIGJvb2wgICAgICAgICAgIGlzX3dpbnRvdWNoZWQoKSBjb25zdCB7CisgICAgcmV0dXJuICg6OmlzX3dpbnRvdWNoZWQodykgPyBUUlVFOkZBTFNFKTsgfQorICAvLyBSZXR1cm4gVFJVRSBpZiB3aW5kb3cgaXMgbWFya2VkIGFzIGNoYW5nZWQsIEZBTFNFIG90aGVyd2lzZQorCisgIGludCAgICAgICAgICAgIGxlYXZlb2soYm9vbCBiZikgeyByZXR1cm4gOjpsZWF2ZW9rKHcsIGJmKTsgfQorICAvLyBJZiBiZiBpcyBUUlVFLCBjdXJzZXMgd2lsbCBsZWF2ZSB0aGUgY3Vyc29yIGFmdGVyIGFuIHVwZGF0ZSB3aGVyZWV2ZXIKKyAgLy8gaXQgaXMgYWZ0ZXIgdGhlIHVwZGF0ZS4KKworICBpbnQgICAgICAgICAgICByZWRyYXdsbihpbnQgZnJvbSwgaW50IG4pIHsgcmV0dXJuIDo6d3JlZHJhd2xuKHcsIGZyb20sIG4pOyB9CisgIC8vIFJlZHJhdyBuIGxpbmVzIHN0YXJ0aW5nIGZyb20gdGhlIHJlcXVlc3RlZCBsaW5lCisKKyAgaW50ICAgICAgICAgICAgcmVkcmF3d2luKCkgeyByZXR1cm4gOjp3cmVkcmF3bG4odywgMCwgaGVpZ2h0KCkpOyB9CisgIC8vIFJlZHJhdyB0aGUgd2hvbGUgd2luZG93CisKKyAgaW50ICAgICAgICAgICAgZG91cGRhdGUoKSAgeyByZXR1cm4gOjpkb3VwZGF0ZSgpOyB9CisgIC8vIERvIGFsbCBvdXRwdXRzIHRvIG1ha2UgdGhlIHBoeXNpY2FsIHNjcmVlbiBsb29raW5nIGxpa2UgdGhlIHZpcnR1YWwgb25lCisKKyAgdm9pZCAgICAgICAgICAgc3luY2Rvd24oKSAgeyA6OndzeW5jZG93bih3KTsgfQorICAvLyBQcm9wYWdhdGUgdGhlIGNoYW5nZXMgZG93biB0byBhbGwgZGVzY2VuZGFudCB3aW5kb3dzCisKKyAgdm9pZCAgICAgICAgICAgc3luY3VwKCkgICAgeyA6OndzeW5jdXAodyk7IH0KKyAgLy8gUHJvcGFnYXRlIHRoZSBjaGFuZ2VzIHVwIGluIHRoZSBoaWVyYXJjaHkKKworICB2b2lkICAgICAgICAgICBjdXJzeW5jdXAoKSB7IDo6d2N1cnN5bmN1cCh3KTsgfQorICAvLyBQb3NpdGlvbiB0aGUgY3Vyc29yIGluIGFsbCBhbmNlc3RvciB3aW5kb3dzIGNvcnJlc3BvbmRpbmcgdG8gb3VyIHNldHRpbmcKKworICBpbnQgICAgICAgICAgICBzeW5jb2soYm9vbCBiZikgeyByZXR1cm4gOjpzeW5jb2sodywgYmYpOyB9CisgIC8vIElmIGNhbGxlZCB3aXRoIGJmPVRSVUUsIHN5bmN1cCgpIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgd2luZG93IGlzIGNoYW5nZWQKKworI2lmbmRlZiBfbm9fZmx1c2hvaworICBpbnQgICAgICAgICAgICBmbHVzaG9rKGJvb2wgYmYpIHsgcmV0dXJuIDo6Zmx1c2hvayh3LCBiZik7IH0KKyNlbmRpZgorCisgIHZvaWQgICAgICAgICAgIGltbWVkb2soYm9vbCBiZikgeyA6OmltbWVkb2sodywgYmYpOyB9CisgIC8vIElmIGNhbGxlZCB3aXRoIGJmPVRSVUUsIGFueSBjaGFuZ2UgaW4gdGhlIHdpbmRvdyB3aWxsIGNhdXNlIGFuCisgIC8vIGF1dG9tYXRpYyBpbW1lZGlhdGUgcmVmcmVzaCgpCisKKyAgaW50ICAgICAgICAgICAgaW50cmZsdXNoKGJvb2wgYmYpIHsgcmV0dXJuIDo6aW50cmZsdXNoKHcsIGJmKTsgfQorCisgIGludCAgICAgICAgICAgIGtleXBhZChib29sIGJmKSB7IHJldHVybiA6OmtleXBhZCh3LCBiZik7IH0KKyAgLy8gSWYgY2FsbGVkIHdpdGggYmY9VFJVRSwgdGhlIGFwcGxpY2F0aW9uIHdpbGwgaW50ZXJwcmV0IGZ1bmN0aW9uIGtleXMuCisKKyAgaW50ICAgICAgICAgICAgbm9kZWxheShib29sIGJmKSB7IHJldHVybiA6Om5vZGVsYXkodywgYmYpOyB9CisKKyAgaW50ICAgICAgICAgICAgbWV0YShib29sIGJmKSB7IHJldHVybiA6Om1ldGEodywgYmYpOyB9CisgIC8vIElmIGNhbGxlZCB3aXRoIGJmPVRSVUUsIGtleXMgbWF5IGdlbmVyYXRlIDgtQml0IGNoYXJhY3RlcnMuIE90aGVyd2lzZQorICAvLyA3LUJpdCBjaGFyYWN0ZXJzIGFyZSBnZW5lcmF0ZWQuCisKKyAgaW50ICAgICAgICAgICAgc3RhbmRvdXQoKSB7IHJldHVybiA6OndzdGFuZG91dCh3KTsgfQorICAvLyBFbmFibGUgInN0YW5kb3V0IiBhdHRyaWJ1dGVzCisKKyAgaW50ICAgICAgICAgICAgc3RhbmRlbmQoKSB7IHJldHVybiA6OndzdGFuZGVuZCh3KTsgfQorICAvLyBEaXNhYmxlICJzdGFuZG91dCIgYXR0cmlidXRlcworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlIG5leHQgdHdvIGFyZSB2aXJ0dWFsLCBiZWNhdXNlIHdlIHJlZGVmaW5lIHRoZW0gaW4gdGhlCisgIC8vIE5DdXJzZXNQYW5lbCBjbGFzcy4KKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2aXJ0dWFsIGludCAgICByZWZyZXNoKCkgeyByZXR1cm4gOjp3cmVmcmVzaCh3KTsgfQorICAvLyBQcm9wYWdhdGUgdGhlIGNoYW5nZXMgaW4gdGhpcyB3aW5kb3cgdG8gdGhlIHZpcnR1YWwgc2NyZWVuIGFuZCBjYWxsCisgIC8vIGRvdXBkYXRlKCkuIFRoaXMgaXMgcmVkZWZpbmVkIGluIE5DdXJzZXNQYW5lbC4KKworICB2aXJ0dWFsIGludCAgICBub3V0cmVmcmVzaCgpIHsgcmV0dXJuIDo6d25vdXRyZWZyZXNoKHcpOyB9CisgIC8vIFByb3BhZ2F0ZSB0aGUgY2hhbmdlcyBpbiB0aGlzIHdpbmRvdyB0byB0aGUgdmlydHVhbCBzY3JlZW4uIFRoaXMgaXMKKyAgLy8gcmVkZWZpbmVkIGluIE5DdXJzZXNQYW5lbC4KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIG11bHRpcGxlIHdpbmRvdyBjb250cm9sCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50ICAgICAgICAgICAgb3ZlcmxheShOQ3Vyc2VzV2luZG93JiB3aW4pIHsKKyAgICByZXR1cm4gOjpvdmVybGF5KHcsIHdpbi53KTsgfQorICAvLyBPdmVybGF5IHRoaXMgd2luZG93IG92ZXIgd2luLgorCisgIGludCAgICAgICAgICAgIG92ZXJ3cml0ZShOQ3Vyc2VzV2luZG93JiB3aW4pIHsKKyAgICByZXR1cm4gOjpvdmVyd3JpdGUodywgd2luLncpOyB9CisgIC8vIE92ZXJ3cml0ZSB3aW4gd2l0aCB0aGlzIHdpbmRvdy4KKworICBpbnQgICAgICAgICAgICBjb3B5d2luKE5DdXJzZXNXaW5kb3cmIHdpbiwKKwkJCSBpbnQgc21pbnJvdywgaW50IHNtaW5jb2wsCisJCQkgaW50IGRtaW5yb3csIGludCBkbWluY29sLAorCQkJIGludCBkbWF4cm93LCBpbnQgZG1heGNvbCwgYm9vbCBvdmVybGF5d2luPVRSVUUpIHsKKyAgICByZXR1cm4gOjpjb3B5d2luKHcsIHdpbi53LCBzbWlucm93LCBzbWluY29sLCBkbWlucm93LCBkbWluY29sLAorCQkgICAgIGRtYXhyb3csIGRtYXhjb2wsIHN0YXRpY19jYXN0PGludD4ob3ZlcmxheXdpbiA/IDEgOiAwKSk7IH0KKyAgLy8gT3ZlcmxheSBvciBvdmVyd3JpdGUgdGhlIHJlY3RhbmdsZSBpbiB3aW4gZ2l2ZW4gYnkgZG1pbnJvdyxkbWluY29sLAorICAvLyBkbWF4cm93LGRtYXhjb2wgd2l0aCB0aGUgcmVjdGFuZ2xlIGluIHRoaXMgd2luZG93IGJlZ2lubmluZyBhdAorICAvLyBzbWlucm93LHNtaW5jb2wuCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBFeHRlbmRlZCBmdW5jdGlvbnMKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIGRlZmluZWQoTkNVUlNFU19FWFRfRlVOQ1MpICYmIChOQ1VSU0VTX0VYVF9GVU5DUyAhPSAwKQorICBpbnQgICAgICAgICAgICB3cmVzaXplKGludCBuZXdMaW5lcywgaW50IG5ld0NvbHVtbnMpIHsKKyAgICByZXR1cm4gOjp3cmVzaXplKHcsIG5ld0xpbmVzLCBuZXdDb2x1bW5zKTsgfQorI2VuZGlmCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBNb3VzZSByZWxhdGVkCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBoYXNfbW91c2UoKSBjb25zdDsKKyAgLy8gUmV0dXJuIFRSVUUgaWYgdGVybWluYWwgc3VwcG9ydHMgYSBtb3VzZSwgRkFMU0Ugb3RoZXJ3aXNlCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyB0cmF2ZXJzYWwgc3VwcG9ydAorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIE5DdXJzZXNXaW5kb3cqICBjaGlsZCgpIHsgcmV0dXJuIHN1YndpbnM7IH0KKyAgLy8gR2V0IHRoZSBmaXJzdCBjaGlsZCB3aW5kb3cuCisKKyAgTkN1cnNlc1dpbmRvdyogIHNpYmxpbmcoKSB7IHJldHVybiBzaWI7IH0KKyAgLy8gR2V0IHRoZSBuZXh0IGNoaWxkIG9mIG15IHBhcmVudC4KKworICBOQ3Vyc2VzV2luZG93KiAgcGFyZW50KCkgeyByZXR1cm4gcGFyOyB9CisgIC8vIEdldCBteSBwYXJlbnQuCisKKyAgYm9vbCBpc0Rlc2NlbmRhbnQoTkN1cnNlc1dpbmRvdyYgd2luKTsKKyAgLy8gUmV0dXJuIFRSVUUgaWYgd2luIGlzIGEgZGVzY2VuZGFudCBvZiB0aGlzLgorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2UgbGVhdmUgdGhpcyBoZXJlIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzQ29sb3JXaW5kb3cgOiBwdWJsaWMgTkN1cnNlc1dpbmRvdworeworcHVibGljOgorICBOQ3Vyc2VzQ29sb3JXaW5kb3coV0lORE9XKiAmd2luZG93KSAgIC8vIHVzZWZ1bCBvbmx5IGZvciBzdGRzY3IKKyAgICA6IE5DdXJzZXNXaW5kb3cod2luZG93KSB7CisgICAgICB1c2VDb2xvcnMoKTsgfQorCisgIE5DdXJzZXNDb2xvcldpbmRvdyhpbnQgbmxpbmVzLCAgICAgICAgLy8gbnVtYmVyIG9mIGxpbmVzCisJCSAgICAgaW50IG5jb2xzLCAgICAgICAgIC8vIG51bWJlciBvZiBjb2x1bW5zCisJCSAgICAgaW50IGJlZ2luX3ksICAgICAgIC8vIGxpbmUgb3JpZ2luCisJCSAgICAgaW50IGJlZ2luX3gpICAgICAgIC8vIGNvbCBvcmlnaW4KKyAgICA6IE5DdXJzZXNXaW5kb3cobmxpbmVzLCBuY29scywgYmVnaW5feSwgYmVnaW5feCkgeworICAgICAgdXNlQ29sb3JzKCk7IH0KKworICBOQ3Vyc2VzQ29sb3JXaW5kb3coTkN1cnNlc1dpbmRvdyYgcGFyZW50V2luLC8vIHBhcmVudCB3aW5kb3cKKwkJICAgICBpbnQgbmxpbmVzLCAgICAgICAgLy8gbnVtYmVyIG9mIGxpbmVzCisJCSAgICAgaW50IG5jb2xzLCAgICAgICAgIC8vIG51bWJlciBvZiBjb2x1bW5zCisJCSAgICAgaW50IGJlZ2luX3ksICAgICAgIC8vIGFic29sdXRlIG9yIHJlbGF0aXZlCisJCSAgICAgaW50IGJlZ2luX3gsICAgICAgIC8vICAgb3JpZ2luczoKKwkJICAgICBjaGFyIGFic3JlbCA9ICdhJykgLy8gaWYgYGEnLCBieSAmIGJ4IGFyZQorICAgIDogTkN1cnNlc1dpbmRvdyhwYXJlbnRXaW4sCisJCSAgICBubGluZXMsIG5jb2xzLAkvLyBhYnNvbHV0ZSBzY3JlZW4gcG9zLAorCQkgICAgYmVnaW5feSwgYmVnaW5feCwgICAvLyBlbHNlIGlmIGByJywgdGhleSBhcmUKKwkJICAgIGFic3JlbCApIHsgICAgICAgICAgLy8gcmVsYXRpdmUgdG8gcGFyIG9yaWdpbgorICAgICAgdXNlQ29sb3JzKCk7IH0KK307CisKKy8vIFRoZXNlIGVudW0gZGVmaW5pdGlvbnMgcmVhbGx5IGJlbG9uZyBpbnNpZGUgdGhlIE5DdXJzZXNQYWQgY2xhc3MsIGJ1dCBvbmx5CisvLyByZWNlbnQgY29tcGlsZXJzIHN1cHBvcnQgdGhhdCBmZWF0dXJlLgorCisgIHR5cGVkZWYgZW51bSB7CisgICAgUkVRX1BBRF9SRUZSRVNIID0gS0VZX01BWCArIDEsCisgICAgUkVRX1BBRF9VUCwKKyAgICBSRVFfUEFEX0RPV04sCisgICAgUkVRX1BBRF9MRUZULAorICAgIFJFUV9QQURfUklHSFQsCisgICAgUkVRX1BBRF9FWElUCisgIH0gUGFkX1JlcXVlc3Q7CisKKyAgY29uc3QgUGFkX1JlcXVlc3QgUEFEX0xPVyAgPSBSRVFfUEFEX1JFRlJFU0g7ICAgLy8gbG93ZXN0ICBvcC1jb2RlCisgIGNvbnN0IFBhZF9SZXF1ZXN0IFBBRF9ISUdIID0gUkVRX1BBRF9FWElUOyAgICAgIC8vIGhpZ2hlc3Qgb3AtY29kZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQYWQgU3VwcG9ydC4gV2UgYWxsb3cgYW4gYXNzb2NpYXRpb24gb2YgYSBwYWQgd2l0aCBhICJyZWFsIiB3aW5kb3cKKy8vIHRocm91Z2ggd2hpY2ggdGhlIHBhZCBtYXkgYmUgdmlld2VkLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc1BhZCA6IHB1YmxpYyBOQ3Vyc2VzV2luZG93Cit7Citwcml2YXRlOgorICBOQ3Vyc2VzV2luZG93KiB2aWV3V2luOyAgICAgICAvLyB0aGUgInZpZXdwb3J0IiB3aW5kb3cKKyAgTkN1cnNlc1dpbmRvdyogdmlld1N1YjsgICAgICAgLy8gdGhlICJ2aWV3cG9ydCIgc3Vid2luZG93CisKKyAgaW50IGhfZ3JpZHNpemUsIHZfZ3JpZHNpemU7CisKK3Byb3RlY3RlZDoKKyAgaW50IG1pbl9yb3csIG1pbl9jb2w7ICAgICAgICAgLy8gdG9wIGxlZnQgcm93L2NvbCBvZiB0aGUgcGFkcyBkaXNwbGF5IGFyZWEKKworICBOQ3Vyc2VzV2luZG93KiBXaW4odm9pZCkgY29uc3QgeworICAgIC8vIEdldCB0aGUgd2luZG93IGludG8gd2hpY2ggdGhlIHBhZCBzaG91bGQgYmUgY29waWVkIChpZiBhbnkpCisgICAgcmV0dXJuICh2aWV3U3ViP3ZpZXdTdWI6KHZpZXdXaW4/dmlld1dpbjowKSk7CisgIH0KKworICBOQ3Vyc2VzV2luZG93KiBnZXRXaW5kb3codm9pZCkgY29uc3QgeworICAgIHJldHVybiB2aWV3V2luOworICB9CisKKyAgTkN1cnNlc1dpbmRvdyogZ2V0U3ViV2luZG93KHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gdmlld1N1YjsKKyAgfQorCisgIHZpcnR1YWwgaW50IGRyaXZlciAoaW50IGtleSk7ICAgICAgLy8gVmlydHVhbGl6ZSBrZXlzdHJva2Uga2V5CisgIC8vIFRoZSBkcml2ZXIgdHJhbnNsYXRlcyB0aGUga2V5c3Ryb2tlIGMgaW50byBhbiBQYWRfUmVxdWVzdAorCisgIHZpcnR1YWwgdm9pZCBPblVua25vd25PcGVyYXRpb24oaW50IHBhZF9yZXEpIHsKKyAgICA6OmJlZXAoKTsKKyAgfQorICAvLyBUaGlzIGlzIGNhbGxlZCBpZiB0aGUgZHJpdmVyIHJldHVybnMgYW4gdW5rbm93biBvcC1jb2RlCisKKyAgdmlydHVhbCB2b2lkIE9uTmF2aWdhdGlvbkVycm9yKGludCBwYWRfcmVxKSB7CisgICAgOjpiZWVwKCk7CisgIH0KKyAgLy8gVGhpcyBpcyBjYWxsZWQgaWYgYSBuYXZpZ2F0aW9uIHJlcXVlc3QgY291bGRuJ3QgYmUgc2F0aXNmaWVkCisKKyAgdmlydHVhbCB2b2lkIE9uT3BlcmF0aW9uKGludCBwYWRfcmVxKSB7CisgIH07CisgIC8vIE9uT3BlcmF0aW9uIGlzIGNhbGxlZCBpZiBhIFBhZF9PcGVyYXRpb24gd2FzIGV4ZWN1dGVkIGFuZCBqdXN0IGJlZm9yZQorICAvLyB0aGUgcmVmcmVzaCgpIG9wZXJhdGlvbiBpcyBkb25lLgorCitwdWJsaWM6CisgIE5DdXJzZXNQYWQoaW50IG5saW5lcywgaW50IG5jb2xzKTsKKyAgLy8gY3JlYXRlIGEgcGFkIHdpdGggdGhlIGdpdmVuIHNpemUKKworICBOQ3Vyc2VzUGFkJiBvcGVyYXRvcj0oY29uc3QgTkN1cnNlc1BhZCYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgICBOQ3Vyc2VzV2luZG93OjpvcGVyYXRvcj0ocmhzKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTkN1cnNlc1BhZChjb25zdCBOQ3Vyc2VzUGFkJiByaHMpCisgICAgOiBOQ3Vyc2VzV2luZG93KHJocyksCisgICAgICB2aWV3V2luKHJocy52aWV3V2luKSwKKyAgICAgIHZpZXdTdWIocmhzLnZpZXdTdWIpLAorICAgICAgaF9ncmlkc2l6ZShyaHMuaF9ncmlkc2l6ZSksCisgICAgICB2X2dyaWRzaXplKHJocy52X2dyaWRzaXplKSwKKyAgICAgIG1pbl9yb3cocmhzLm1pbl9yb3cpLAorICAgICAgbWluX2NvbChyaHMubWluX2NvbCkKKyAgeworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc1BhZCgpIHt9CisKKyAgaW50IGVjaG9jaGFyKGNvbnN0IGNodHlwZSBjaCkgeyByZXR1cm4gOjpwZWNob2NoYXIodywgY2gpOyB9CisgIC8vIFB1dCB0aGUgYXR0cmlidXRlZCBjaGFyYWN0ZXIgb250byB0aGUgcGFkIGFuZCBpbW1lZGlhdGVseSBkbyBhCisgIC8vIHByZWZyZXNoKCkuCisKKyAgaW50IHJlZnJlc2goKTsKKyAgLy8gSWYgYSB2aWV3cG9ydCBpcyBkZWZpbmVkIHRoZSBwYWQgaXMgZGlzcGxheWVkIGluIHRoaXMgd2luZG93LCBvdGhlcndpc2UKKyAgLy8gdGhpcyBpcyBhIG5vb3AuCisKKyAgaW50IHJlZnJlc2goaW50IHBtaW5yb3csIGludCBwbWluY29sLAorCSAgICAgIGludCBzbWlucm93LCBpbnQgc21pbmNvbCwKKwkgICAgICBpbnQgc21heHJvdywgaW50IHNtYXhjb2wpIHsKKyAgICByZXR1cm4gOjpwcmVmcmVzaCh3LCBwbWlucm93LCBwbWluY29sLAorCQkgICAgICBzbWlucm93LCBzbWluY29sLCBzbWF4cm93LCBzbWF4Y29sKTsKKyAgfQorICAvLyBUaGUgY29vcmRpbmF0ZXMgc21pbnJvdyxzbWluY29sLHNtYXhyb3csc21heGNvbCBkZXNjcmliZSBhIHJlY3RhbmdsZQorICAvLyBvbiB0aGUgc2NyZWVuLiA8Yj5yZWZyZXNoPC9iPiBjb3BpZXMgYSByZWN0YW5nbGUgb2YgdGhpcyBzaXplIGJlZ2lubmluZworICAvLyB3aXRoIHRvcCBsZWZ0IGNvcm5lciBwbWlucm93LHBtaW5jb2wgb250byB0aGUgc2NyZWVuIGFuZCBjYWxscyBkb3VwZGF0ZSgpLgorCisgIGludCBub3V0cmVmcmVzaCgpOworICAvLyBJZiBhIHZpZXdwb3J0IGlzIGRlZmluZWQgdGhlIHBhZCBpcyBkaXNwbGF5ZWQgaW4gdGhpcyB3aW5kb3csIG90aGVyd2lzZQorICAvLyB0aGlzIGlzIGEgbm9vcC4KKworICBpbnQgbm91dHJlZnJlc2goaW50IHBtaW5yb3csIGludCBwbWluY29sLAorCQkgIGludCBzbWlucm93LCBpbnQgc21pbmNvbCwKKwkJICBpbnQgc21heHJvdywgaW50IHNtYXhjb2wpIHsKKyAgICByZXR1cm4gOjpwbm91dHJlZnJlc2godywgcG1pbnJvdywgcG1pbmNvbCwKKwkJCSAgc21pbnJvdywgc21pbmNvbCwgc21heHJvdywgc21heGNvbCk7CisgIH0KKyAgLy8gRG9lcyB0aGUgc2FtZSBhcyByZWZyZXNoKCkgYnV0IHdpdGhvdXQgY2FsbGluZyBkb3VwZGF0ZSgpLgorCisgIHZpcnR1YWwgdm9pZCBzZXRXaW5kb3coTkN1cnNlc1dpbmRvdyYgdmlldywgaW50IHZfZ3JpZCA9IDEsIGludCBoX2dyaWQgPSAxKTsKKyAgLy8gQWRkIHRoZSB3aW5kb3cgInZpZXciIGFzIHZpZXdpbmcgd2luZG93IHRvIHRoZSBwYWQuCisKKyAgdmlydHVhbCB2b2lkIHNldFN1YldpbmRvdyhOQ3Vyc2VzV2luZG93JiBzdWIpOworICAvLyBVc2UgdGhlIHN1YndpbmRvdyAic3ViIiBvZiB0aGUgdmlld3BvcnQgd2luZG93IGZvciB0aGUgYWN0dWFsIHZpZXdpbmcuCisgIC8vIFRoZSBmdWxsIHZpZXdwb3J0IHdpbmRvdyBpcyB1c3VhbGx5IHVzZWQgdG8gcHJvdmlkZSBzb21lIGRlY29yYXRpb25zCisgIC8vIGxpa2UgZnJhbWVzLCB0aXRsZXMgZXRjLgorCisgIHZpcnR1YWwgdm9pZCBvcGVyYXRvcigpICh2b2lkKTsKKyAgLy8gUGVyZm9ybSBQYWQncyBvcGVyYXRpb24KK307CisKKy8vIEEgRnJhbWVkUGFkIGlzIGNvbnN0cnVjdGVkIGFsd2F5cyB3aXRoIGEgdmlld3BvcnQgd2luZG93LiBUaGlzIHZpZXdwb3J0CisvLyB3aWxsIGJlIGZyYW1lZCAoYnkgYSBib3goKSBjb21tYW5kKSBhbmQgdGhlIGludGVyaW9yIG9mIHRoZSBib3ggaXMgdGhlCisvLyB2aWV3cG9ydCBzdWJ3aW5kb3cuIE9uIHRoZSBmcmFtZSB3ZSBkaXNwbGF5IHNjcm9sbGJhciBzbGlkZXJzLgorY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc0ZyYW1lZFBhZCA6IHB1YmxpYyBOQ3Vyc2VzUGFkCit7Citwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBPbk9wZXJhdGlvbihpbnQgcGFkX3JlcSk7CisKK3B1YmxpYzoKKyAgTkN1cnNlc0ZyYW1lZFBhZChOQ3Vyc2VzV2luZG93JiB3aW4sIGludCBubGluZXMsIGludCBuY29scywKKwkJICAgaW50IHZfZ3JpZCA9IDEsIGludCBoX2dyaWQgPSAxKQorICAgIDogTkN1cnNlc1BhZChubGluZXMsIG5jb2xzKSB7CisgICAgTkN1cnNlc1BhZDo6c2V0V2luZG93KHdpbiwgdl9ncmlkLCBoX2dyaWQpOworICAgIE5DdXJzZXNQYWQ6OnNldFN1YldpbmRvdygqKG5ldyBOQ3Vyc2VzV2luZG93KHdpbikpKTsKKyAgfQorICAvLyBDb25zdHJ1Y3QgdGhlIEZyYW1lZFBhZCB3aXRoIHRoZSBnaXZlbiBXaW5kb3cgd2luIGFzIHZpZXdwb3J0LgorCisgIHZpcnR1YWwgfk5DdXJzZXNGcmFtZWRQYWQoKSB7CisgICAgZGVsZXRlIGdldFN1YldpbmRvdygpOworICB9CisKKyAgdm9pZCBzZXRXaW5kb3coTkN1cnNlc1dpbmRvdyYgdmlldywgaW50IHZfZ3JpZCA9IDEsIGludCBoX2dyaWQgPSAxKSB7CisgICAgZXJyX2hhbmRsZXIoIk9wZXJhdGlvbiBub3QgYWxsb3dlZCIpOworICB9CisgIC8vIERpc2FibGUgdGhpcyBjYWxsOyB0aGUgdmlld3BvcnQgaXMgYWxyZWFkeSBkZWZpbmVkCisKKyAgdm9pZCBzZXRTdWJXaW5kb3coTkN1cnNlc1dpbmRvdyYgc3ViKSB7CisgICAgZXJyX2hhbmRsZXIoIk9wZXJhdGlvbiBub3QgYWxsb3dlZCIpOworICB9CisgIC8vIERpc2FibGUgdGhpcyBjYWxsOyB0aGUgdmlld3BvcnQgc3Vid2luZG93IGlzIGFscmVhZHkgZGVmaW5lZAorCit9OworCisjZW5kaWYgLyogTkNVUlNFU19DVVJTRVNXX0hfaW5jbCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzc2xrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNzbGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTE2OTVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzc2xrLmgKQEAgLTAsMCArMSwyMzggQEAKKy8vICogdGhpcyBpcyBmb3IgbWFraW5nIGVtYWNzIGhhcHB5OiAtKi1Nb2RlOiBDKys7LSotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMsMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBBdXRob3I6IEp1ZXJnZW4gUGZlaWZlciwgMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyAkSWQ6IGN1cnNzbGsuaCx2IDEuMTMgMjAwNS8wNS8yOCAyMTo1ODoxOCB0b20gRXhwICQKKworI2lmbmRlZiBOQ1VSU0VTX0NVUlNTTEtfSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfQ1VSU1NMS19IX2luY2wKKworI2luY2x1ZGUgPGN1cnNlc3cuaD4KKworY2xhc3MgTkNVUlNFU19JTVBFWFAgU29mdF9MYWJlbF9LZXlfU2V0IHsKK3B1YmxpYzoKKyAgLy8gVGhpcyBpbm5lciBjbGFzcyByZXByZXNlbnRzIHRoZSBhdHRyaWJ1dGVzIG9mIGEgU29mdCBMYWJlbCBLZXkgKFNMSykKKyAgY2xhc3MgTkNVUlNFU19JTVBFWFAgU29mdF9MYWJlbF9LZXkgeworICAgIGZyaWVuZCBjbGFzcyBTb2Z0X0xhYmVsX0tleV9TZXQ7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGVudW0geyBMZWZ0PTAsIENlbnRlcj0xLCBSaWdodD0yIH0gSnVzdGlmaWNhdGlvbjsKKworICBwcml2YXRlOgorICAgIGNoYXIgKmxhYmVsOyAgICAgICAgICAgLy8gVGhlIFRleHQgb2YgdGhlIExhYmVsCisgICAgSnVzdGlmaWNhdGlvbiBmb3JtYXQ7ICAvLyBUaGUgSnVzdGlmaWNhdGlvbgorICAgIGludCBudW07ICAgICAgICAgICAgICAgLy8gVGhlIG51bWJlciBvZiB0aGUgTGFiZWwKKworICAgIFNvZnRfTGFiZWxfS2V5KCkgOiBsYWJlbChOVUxMKSwgZm9ybWF0KExlZnQpLCBudW0oLTEpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5Tb2Z0X0xhYmVsX0tleSgpIHsKKyAgICAgIGRlbGV0ZVtdIGxhYmVsOworICAgIH07CisKKyAgcHVibGljOgorICAgIC8vIFNldCB0aGUgdGV4dCBvZiB0aGUgTGFiZWwKKyAgICBTb2Z0X0xhYmVsX0tleSYgb3BlcmF0b3I9KGNoYXIgKnRleHQpOworCisgICAgLy8gU2V0IHRoZSBKdXN0aWZpY2F0aW9uIG9mIHRoZSBMYWJlbAorICAgIFNvZnRfTGFiZWxfS2V5JiBvcGVyYXRvcj0oSnVzdGlmaWNhdGlvbiBqdXN0KSB7CisgICAgICBmb3JtYXQgPSBqdXN0OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vIFJldHJpZXZlIHRoZSB0ZXh0IG9mIHRoZSBsYWJlbAorICAgIGlubGluZSBjaGFyKiBvcGVyYXRvcigpKHZvaWQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBsYWJlbDsKKyAgICB9CisKKyAgICBTb2Z0X0xhYmVsX0tleSYgb3BlcmF0b3I9KGNvbnN0IFNvZnRfTGFiZWxfS2V5JiByaHMpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgICAqdGhpcyA9IHJoczsKKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBTb2Z0X0xhYmVsX0tleShjb25zdCBTb2Z0X0xhYmVsX0tleSYgcmhzKQorICAgICAgOiBsYWJlbChOVUxMKSwKKyAgICAgICAgZm9ybWF0KHJocy5mb3JtYXQpLAorICAgICAgICBudW0ocmhzLm51bSkKKyAgICB7CisgICAgICAqdGhpcyA9IHJocy5sYWJlbDsKKyAgICB9CisgIH07CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBlbnVtIHsKKyAgICBOb25lICAgICAgICAgICAgICAgID0gLTEsCisgICAgVGhyZWVfVHdvX1RocmVlICAgICA9IDAsCisgICAgRm91cl9Gb3VyICAgICAgICAgICA9IDEsCisgICAgUENfU3R5bGUgICAgICAgICAgICA9IDIsCisgICAgUENfU3R5bGVfV2l0aF9JbmRleCA9IDMKKyAgfSBMYWJlbF9MYXlvdXQ7CisKK3ByaXZhdGU6CisgIHN0YXRpYyBsb25nIE5DVVJTRVNfSU1QRVhQIGNvdW50OyAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBLZXkgU2V0cworICBzdGF0aWMgTGFiZWxfTGF5b3V0IE5DVVJTRVNfSU1QRVhQICBmb3JtYXQ7ICAgICAvLyBMYXlvdXQgb2YgdGhlIEtleSBTZXRzCisgIHN0YXRpYyBpbnQgIE5DVVJTRVNfSU1QRVhQIG51bV9sYWJlbHM7ICAgICAgICAgIC8vIE51bWJlciBPZiBMYWJlbHMgaW4gS2V5IFNldHMKKyAgYm9vbCBOQ1VSU0VTX0lNUEVYUCBiX2F0dHJJbml0OyAgICAgICAgICAgICAgICAgLy8gQXJlIGF0dHJpYnV0ZXMgaW5pdGlhbGl6ZWQKKworICBTb2Z0X0xhYmVsX0tleSAqc2xrX2FycmF5OyAgICAgICAvLyBUaGUgYXJyYXkgb2YgU0xLJ3MKKworICAvLyBJbml0IHRoZSBLZXkgU2V0CisgIHZvaWQgaW5pdCgpOworCisgIC8vIEFjdGl2YXRlIG9yIERlYWN0aXZhdGUgTGFiZWwjIGksIExhYmVsIGNvdW50aW5nIHN0YXJ0cyB3aXRoIDEhCisgIHZvaWQgYWN0aXZhdGVfbGFiZWwoaW50IGksIGJvb2wgYmY9VFJVRSk7CisKKyAgLy8gQWN0aXZhdGUgb2YgRGVhY3RpdmF0ZSBhbGwgTGFiZWxzCisgIHZvaWQgYWN0aXZhdGVfbGFiZWxzKGJvb2wgYmYpOworCitwcm90ZWN0ZWQ6CisgIGlubGluZSB2b2lkIEVycm9yIChjb25zdCBjaGFyKiBtc2cpIGNvbnN0IFRIUk9XUyhOQ3Vyc2VzRXhjZXB0aW9uKSB7CisgICAgVEhST1cobmV3IE5DdXJzZXNFeGNlcHRpb24gKG1zZykpOworICB9CisKKyAgLy8gUmVtb3ZlIFNMSydzIGZyb20gc2NyZWVuCisgIHZvaWQgY2xlYXIoKSB7CisgICAgaWYgKEVSUj09OjpzbGtfY2xlYXIoKSkKKyAgICAgIEVycm9yKCJzbGtfY2xlYXIiKTsKKyAgfQorCisgIC8vIFJlc3RvcmUgdGhlbQorICB2b2lkIHJlc3RvcmUoKSB7CisgICAgaWYgKEVSUj09OjpzbGtfcmVzdG9yZSgpKQorICAgICAgRXJyb3IoInNsa19yZXN0b3JlIik7CisgIH0KKworcHVibGljOgorCisgIC8vIENvbnN0cnVjdCBhIEtleSBTZXQsIHVzZSB0aGUgbW9zdCBjb21mb3J0YWJsZSBsYXlvdXQgYXMgZGVmYXVsdC4KKyAgLy8gWW91IG11c3QgY3JlYXRlIGEgU29mdF9MYWJlbF9LZXlfU2V0IGJlZm9yZSB5b3UgY3JlYXRlIGFueSBvYmplY3Qgb2YKKyAgLy8gdGhlIE5DdXJzZXNXaW5kb3csIE5DdXJzZXNQYW5lbCBvciBkZXJpdmVkIGNsYXNzZXMuIChBY3R1YWxseSBiZWZvcmUKKyAgLy8gOjppbml0c2NyKCkgaXMgY2FsbGVkKS4KKyAgU29mdF9MYWJlbF9LZXlfU2V0KExhYmVsX0xheW91dCBmbXQpOworCisgIC8vIFRoaXMgY29uc3RydWN0b3IgYXNzdW1lcywgdGhhdCB5b3UgYWxyZWFkeSBjb25zdHJ1Y3RlZCBhIEtleSBTZXQKKyAgLy8gd2l0aCBhIGxheW91dCBieSB0aGUgY29uc3RydWN0b3IgYWJvdmUuIFRoaXMgbGF5b3V0IHdpbGwgYmUgcmV1c2VkLgorICBOQ1VSU0VTX0lNUEVYUCBTb2Z0X0xhYmVsX0tleV9TZXQoKTsKKworICBTb2Z0X0xhYmVsX0tleV9TZXQmIG9wZXJhdG9yPShjb25zdCBTb2Z0X0xhYmVsX0tleV9TZXQmIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgICAgaW5pdCgpOwkJLy8gYWxsb2NhdGUgYSBuZXcgc2xrX2FycmF5W10KKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgU29mdF9MYWJlbF9LZXlfU2V0KGNvbnN0IFNvZnRfTGFiZWxfS2V5X1NldCYgcmhzKQorICAgIDogYl9hdHRySW5pdChyaHMuYl9hdHRySW5pdCksCisgICAgICBzbGtfYXJyYXkoTlVMTCkKKyAgeworICAgIGluaXQoKTsJCS8vIGFsbG9jYXRlIGEgbmV3IHNsa19hcnJheVtdCisgIH0KKworICB2aXJ0dWFsIH5Tb2Z0X0xhYmVsX0tleV9TZXQoKTsKKworICAvLyBHZXQgTGFiZWwjIGkuIExhYmVsIGNvdW50aW5nIHN0YXJ0cyB3aXRoIDEhCisgIE5DVVJTRVNfSU1QRVhQIFNvZnRfTGFiZWxfS2V5JiBvcGVyYXRvcltdKGludCBpKTsKKworICAvLyBSZXRyaWV2ZSBudW1iZXIgb2YgTGFiZWxzCisgIGlubGluZSBpbnQgbGFiZWxzKCkgY29uc3QgeyByZXR1cm4gbnVtX2xhYmVsczsgfQorCisgIC8vIFJlZnJlc2ggdGhlIFNMSyBwb3J0aW9uIG9mIHRoZSBzY3JlZW4KKyAgaW5saW5lIHZvaWQgcmVmcmVzaCgpIHsKKyAgICBpZiAoRVJSPT06OnNsa19yZWZyZXNoKCkpCisgICAgICBFcnJvcigic2xrX3JlZnJlc2giKTsKKyAgfQorCisgIC8vIE1hcmsgdGhlIFNMSyBwb3J0aW9uIG9mIHRoZSBzY3JlZW4gZm9yIHJlZnJlc2gsIGRlZmVyIGFjdHVhbCByZWZyZXNoCisgIC8vIHVudGlsIG5leHQgdXBkYXRlIGNhbGwuCisgIGlubGluZSB2b2lkIG5vdXRyZWZyZXNoKCkgeworICAgIGlmIChFUlI9PTo6c2xrX25vdXRyZWZyZXNoKCkpCisgICAgICBFcnJvcigic2xrX25vdXRyZWZyZXNoIik7CisgIH0KKworICAvLyBNYXJrIHRoZSB3aG9sZSBTTEsgcG9ydGlvbiBvZiB0aGUgc2NyZWVuIGFzIG1vZGlmaWVkCisgIGlubGluZSB2b2lkIHRvdWNoKCkgeworICAgIGlmIChFUlI9PTo6c2xrX3RvdWNoKCkpCisgICAgICBFcnJvcigic2xrX3RvdWNoIik7CisgIH0KKworICAvLyBBY3RpdmF0ZSBMYWJlbCMgaQorICBpbmxpbmUgdm9pZCBzaG93KGludCBpKSB7CisgICAgYWN0aXZhdGVfbGFiZWwoaSxGQUxTRSk7CisgICAgYWN0aXZhdGVfbGFiZWwoaSxUUlVFKTsKKyAgfQorCisgIC8vIEhpZGUgTGFiZWwjIGkKKyAgaW5saW5lIHZvaWQgaGlkZShpbnQgaSkgeworICAgIGFjdGl2YXRlX2xhYmVsKGksRkFMU0UpOworICB9CisKKyAgLy8gU2hvdyBhbGwgTGFiZWxzCisgIGlubGluZSB2b2lkIHNob3coKSB7CisgICAgYWN0aXZhdGVfbGFiZWxzKEZBTFNFKTsKKyAgICBhY3RpdmF0ZV9sYWJlbHMoVFJVRSk7CisgIH0KKworICAvLyBIaWRlIGFsbCBMYWJlbHMKKyAgaW5saW5lIHZvaWQgaGlkZSgpIHsKKyAgICBhY3RpdmF0ZV9sYWJlbHMoRkFMU0UpOworICB9CisKKyAgaW5saW5lIHZvaWQgYXR0cm9uKGF0dHJfdCBhdHRycykgeworICAgIGlmIChFUlI9PTo6c2xrX2F0dHJvbihhdHRycykpCisgICAgICBFcnJvcigic2xrX2F0dHJvbiIpOworICB9CisKKyAgaW5saW5lIHZvaWQgYXR0cm9mZihhdHRyX3QgYXR0cnMpIHsKKyAgICBpZiAoRVJSPT06OnNsa19hdHRyb2ZmKGF0dHJzKSkKKyAgICAgIEVycm9yKCJzbGtfYXR0cm9mZiIpOworICB9CisKKyAgaW5saW5lIHZvaWQgYXR0cnNldChhdHRyX3QgYXR0cnMpIHsKKyAgICBpZiAoRVJSPT06OnNsa19hdHRyc2V0KGF0dHJzKSkKKyAgICAgIEVycm9yKCJzbGtfYXR0cnNldCIpOworICB9CisKKyAgaW5saW5lIHZvaWQgY29sb3Ioc2hvcnQgY29sb3JfcGFpcl9udW1iZXIpIHsKKyAgICBpZiAoRVJSPT06OnNsa19jb2xvcihjb2xvcl9wYWlyX251bWJlcikpCisgICAgICBFcnJvcigic2xrX2NvbG9yIik7CisgIH0KKworICBpbmxpbmUgYXR0cl90IGF0dHIoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6c2xrX2F0dHIoKTsKKyAgfQorfTsKKworI2VuZGlmIC8qIE5DVVJTRVNfQ1VSU1NMS19IX2luY2wgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZGlyZW50LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RpcmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNWEwZWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RpcmVudC5oCkBAIC0wLDAgKzEsNDA1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwMCwyMDAzLTIwMDUsMjAwOSwyMDEwLDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDUuMS4yIERpcmVjdG9yeSBPcGVyYXRpb25zCTxkaXJlbnQuaD4KKyAqLworCisjaWZuZGVmCV9ESVJFTlRfSAorI2RlZmluZQlfRElSRU5UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisjaWZkZWYgX19VU0VfWE9QRU4KKyMgaWZuZGVmIF9faW5vX3RfZGVmaW5lZAorIyAgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19pbm9fdCBpbm9fdDsKKyMgIGVsc2UKK3R5cGVkZWYgX19pbm82NF90IGlub190OworIyAgZW5kaWYKKyMgIGRlZmluZSBfX2lub190X2RlZmluZWQKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZCBfX1VTRV9MQVJHRUZJTEU2NCAmJiAhZGVmaW5lZCBfX2lubzY0X3RfZGVmaW5lZAordHlwZWRlZiBfX2lubzY0X3QgaW5vNjRfdDsKKyMgIGRlZmluZSBfX2lubzY0X3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKKy8qIFRoaXMgZmlsZSBkZWZpbmVzIGBzdHJ1Y3QgZGlyZW50Jy4KKworICAgSXQgZGVmaW5lcyB0aGUgbWFjcm8gYF9ESVJFTlRfSEFWRV9EX05BTUxFTicgaWZmIHRoZXJlIGlzIGEgYGRfbmFtbGVuJworICAgbWVtYmVyIHRoYXQgZ2l2ZXMgdGhlIGxlbmd0aCBvZiBgZF9uYW1lJy4KKworICAgSXQgZGVmaW5lcyB0aGUgbWFjcm8gYF9ESVJFTlRfSEFWRV9EX1JFQ0xFTicgaWZmIHRoZXJlIGlzIGEgYGRfcmVjbGVuJworICAgbWVtYmVyIHRoYXQgZ2l2ZXMgdGhlIHNpemUgb2YgdGhlIGVudGlyZSBkaXJlY3RvcnkgZW50cnkuCisKKyAgIEl0IGRlZmluZXMgdGhlIG1hY3JvIGBfRElSRU5UX0hBVkVfRF9PRkYnIGlmZiB0aGVyZSBpcyBhIGBkX29mZicKKyAgIG1lbWJlciB0aGF0IGdpdmVzIHRoZSBmaWxlIG9mZnNldCBvZiB0aGUgbmV4dCBkaXJlY3RvcnkgZW50cnkuCisKKyAgIEl0IGRlZmluZXMgdGhlIG1hY3JvIGBfRElSRU5UX0hBVkVfRF9UWVBFJyBpZmYgdGhlcmUgaXMgYSBgZF90eXBlJworICAgbWVtYmVyIHRoYXQgZ2l2ZXMgdGhlIHR5cGUgb2YgdGhlIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGJpdHMvZGlyZW50Lmg+CisKKyNpZiAoZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9NSVNDKSAmJiAhZGVmaW5lZCBkX2ZpbGVubworIyBkZWZpbmUgZF9pbm8JZF9maWxlbm8JCSAvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgKi8KKyNlbmRpZgorCisvKiBUaGVzZSBtYWNyb3MgZXh0cmFjdCBzaXplIGluZm9ybWF0aW9uIGZyb20gYSBgc3RydWN0IGRpcmVudCAqJy4KKyAgIFRoZXkgbWF5IGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50IG11bHRpcGxlIHRpbWVzLCBzbyBpdCBtdXN0IG5vdAorICAgaGF2ZSBzaWRlIGVmZmVjdHMuICBFYWNoIG9mIHRoZXNlIG1heSBpbnZvbHZlIGEgcmVsYXRpdmVseSBjb3N0bHkKKyAgIGNhbGwgdG8gYHN0cmxlbicgb24gc29tZSBzeXN0ZW1zLCBzbyB0aGVzZSB2YWx1ZXMgc2hvdWxkIGJlIGNhY2hlZC4KKworICAgX0RfRVhBQ1RfTkFNTEVOIChEUCkJcmV0dXJucyB0aGUgbGVuZ3RoIG9mIERQLT5kX25hbWUsIG5vdCBpbmNsdWRpbmcKKyAgIGl0cyB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3Rlci4KKworICAgX0RfQUxMT0NfTkFNTEVOIChEUCkJcmV0dXJucyBhIHNpemUgYXQgbGVhc3QgKF9EX0VYQUNUX05BTUxFTiAoRFApICsgMSk7CisgICB0aGF0IGlzLCB0aGUgYWxsb2NhdGlvbiBzaXplIG5lZWRlZCB0byBob2xkIHRoZSBEUC0+ZF9uYW1lIHN0cmluZy4KKyAgIFVzZSB0aGlzIG1hY3JvIHdoZW4geW91IGRvbid0IG5lZWQgdGhlIGV4YWN0IGxlbmd0aCwganVzdCBhbiB1cHBlciBib3VuZC4KKyAgIFRoaXMgbWFjcm8gaXMgbGVzcyBsaWtlbHkgdG8gcmVxdWlyZSBjYWxsaW5nIGBzdHJsZW4nIHRoYW4gX0RfRVhBQ1RfTkFNTEVOLgorICAgKi8KKworI2lmZGVmIF9ESVJFTlRfSEFWRV9EX05BTUxFTgorIyBkZWZpbmUgX0RfRVhBQ1RfTkFNTEVOKGQpICgoZCktPmRfbmFtbGVuKQorIyBkZWZpbmUgX0RfQUxMT0NfTkFNTEVOKGQpIChfRF9FWEFDVF9OQU1MRU4gKGQpICsgMSkKKyNlbHNlCisjIGRlZmluZSBfRF9FWEFDVF9OQU1MRU4oZCkgKHN0cmxlbiAoKGQpLT5kX25hbWUpKQorIyBpZmRlZiBfRElSRU5UX0hBVkVfRF9SRUNMRU4KKyMgIGRlZmluZSBfRF9BTExPQ19OQU1MRU4oZCkgKCgoY2hhciAqKSAoZCkgKyAoZCktPmRfcmVjbGVuKSAtICYoZCktPmRfbmFtZVswXSkKKyMgZWxzZQorIyAgZGVmaW5lIF9EX0FMTE9DX05BTUxFTihkKSAoc2l6ZW9mIChkKS0+ZF9uYW1lID4gMSA/IHNpemVvZiAoZCktPmRfbmFtZSA6IFwKKwkJCSAgICAgIF9EX0VYQUNUX05BTUxFTiAoZCkgKyAxKQorIyBlbmRpZgorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0JTRAorLyogRmlsZSB0eXBlcyBmb3IgYGRfdHlwZScuICAqLworZW51bQorICB7CisgICAgRFRfVU5LTk9XTiA9IDAsCisjIGRlZmluZSBEVF9VTktOT1dOCURUX1VOS05PV04KKyAgICBEVF9GSUZPID0gMSwKKyMgZGVmaW5lIERUX0ZJRk8JRFRfRklGTworICAgIERUX0NIUiA9IDIsCisjIGRlZmluZSBEVF9DSFIJCURUX0NIUgorICAgIERUX0RJUiA9IDQsCisjIGRlZmluZSBEVF9ESVIJCURUX0RJUgorICAgIERUX0JMSyA9IDYsCisjIGRlZmluZSBEVF9CTEsJCURUX0JMSworICAgIERUX1JFRyA9IDgsCisjIGRlZmluZSBEVF9SRUcJCURUX1JFRworICAgIERUX0xOSyA9IDEwLAorIyBkZWZpbmUgRFRfTE5LCQlEVF9MTksKKyAgICBEVF9TT0NLID0gMTIsCisjIGRlZmluZSBEVF9TT0NLCURUX1NPQ0sKKyAgICBEVF9XSFQgPSAxNAorIyBkZWZpbmUgRFRfV0hUCQlEVF9XSFQKKyAgfTsKKworLyogQ29udmVydCBiZXR3ZWVuIHN0YXQgc3RydWN0dXJlIHR5cGVzIGFuZCBkaXJlY3RvcnkgdHlwZXMuICAqLworIyBkZWZpbmUgSUZUT0RUKG1vZGUpCSgoKG1vZGUpICYgMDE3MDAwMCkgPj4gMTIpCisjIGRlZmluZSBEVFRPSUYoZGlydHlwZSkJKChkaXJ0eXBlKSA8PCAxMikKKyNlbmRpZgorCisKKy8qIFRoaXMgaXMgdGhlIGRhdGEgdHlwZSBvZiBkaXJlY3Rvcnkgc3RyZWFtIG9iamVjdHMuCisgICBUaGUgYWN0dWFsIHN0cnVjdHVyZSBpcyBvcGFxdWUgdG8gdXNlcnMuICAqLwordHlwZWRlZiBzdHJ1Y3QgX19kaXJzdHJlYW0gRElSOworCisvKiBPcGVuIGEgZGlyZWN0b3J5IHN0cmVhbSBvbiBOQU1FLgorICAgUmV0dXJuIGEgRElSIHN0cmVhbSBvbiB0aGUgZGlyZWN0b3J5LCBvciBOVUxMIGlmIGl0IGNvdWxkIG5vdCBiZSBvcGVuZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIERJUiAqb3BlbmRpciAoX19jb25zdCBjaGFyICpfX25hbWUpIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBTYW1lIGFzIG9wZW5kaXIsIGJ1dCBvcGVuIHRoZSBzdHJlYW0gb24gdGhlIGZpbGUgZGVzY3JpcHRvciBGRC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gRElSICpmZG9wZW5kaXIgKGludCBfX2ZkKTsKKyNlbmRpZgorCisvKiBDbG9zZSB0aGUgZGlyZWN0b3J5IHN0cmVhbSBESVJQLgorICAgUmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgaWYgbm90LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgY2xvc2VkaXIgKERJUiAqX19kaXJwKSBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJlYWQgYSBkaXJlY3RvcnkgZW50cnkgZnJvbSBESVJQLiAgUmV0dXJuIGEgcG9pbnRlciB0byBhIGBzdHJ1Y3QKKyAgIGRpcmVudCcgZGVzY3JpYmluZyB0aGUgZW50cnksIG9yIE5VTEwgZm9yIEVPRiBvciBlcnJvci4gIFRoZQorICAgc3RvcmFnZSByZXR1cm5lZCBtYXkgYmUgb3ZlcndyaXR0ZW4gYnkgYSBsYXRlciByZWFkZGlyIGNhbGwgb24gdGhlCisgICBzYW1lIERJUiBzdHJlYW0uCisKKyAgIElmIHRoZSBMYXJnZSBGaWxlIFN1cHBvcnQgQVBJIGlzIHNlbGVjdGVkIHdlIGhhdmUgdG8gdXNlIHRoZQorICAgYXBwcm9wcmlhdGUgaW50ZXJmYWNlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIHN0cnVjdCBkaXJlbnQgKnJlYWRkaXIgKERJUiAqX19kaXJwKSBfX25vbm51bGwgKCgxKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gc3RydWN0IGRpcmVudCAqX19SRURJUkVDVCAocmVhZGRpciwgKERJUiAqX19kaXJwKSwgcmVhZGRpcjY0KQorICAgICBfX25vbm51bGwgKCgxKSk7CisjIGVsc2UKKyMgIGRlZmluZSByZWFkZGlyIHJlYWRkaXI2NAorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIHN0cnVjdCBkaXJlbnQ2NCAqcmVhZGRpcjY0IChESVIgKl9fZGlycCkgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb24gb2YgYHJlYWRkaXInLiAgUmV0dXJuIGluIFJFU1VMVCBhIHBvaW50ZXIgdG8gdGhlCisgICBuZXh0IGVudHJ5LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgcmVhZGRpcl9yIChESVIgKl9fcmVzdHJpY3QgX19kaXJwLAorCQkgICAgICBzdHJ1Y3QgZGlyZW50ICpfX3Jlc3RyaWN0IF9fZW50cnksCisJCSAgICAgIHN0cnVjdCBkaXJlbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KQorICAgICBfX25vbm51bGwgKCgxLCAyLCAzKSk7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAocmVhZGRpcl9yLAorCQkgICAgICAgKERJUiAqX19yZXN0cmljdCBfX2RpcnAsCisJCQlzdHJ1Y3QgZGlyZW50ICpfX3Jlc3RyaWN0IF9fZW50cnksCisJCQlzdHJ1Y3QgZGlyZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCksCisJCSAgICAgICByZWFkZGlyNjRfcikgX19ub25udWxsICgoMSwgMiwgMykpOworIyAgZWxzZQorIyAgIGRlZmluZSByZWFkZGlyX3IgcmVhZGRpcjY0X3IKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgcmVhZGRpcjY0X3IgKERJUiAqX19yZXN0cmljdCBfX2RpcnAsCisJCQlzdHJ1Y3QgZGlyZW50NjQgKl9fcmVzdHJpY3QgX19lbnRyeSwKKwkJCXN0cnVjdCBkaXJlbnQ2NCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpCisgICAgIF9fbm9ubnVsbCAoKDEsIDIsIDMpKTsKKyMgZW5kaWYKKyNlbmRpZgkvKiBQT1NJWCBvciBtaXNjICovCisKKy8qIFJld2luZCBESVJQIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRpcmVjdG9yeS4gICovCitleHRlcm4gdm9pZCByZXdpbmRkaXIgKERJUiAqX19kaXJwKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisjIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogU2VlayB0byBwb3NpdGlvbiBQT1Mgb24gRElSUC4gICovCitleHRlcm4gdm9pZCBzZWVrZGlyIChESVIgKl9fZGlycCwgbG9uZyBpbnQgX19wb3MpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgRElSUC4gICovCitleHRlcm4gbG9uZyBpbnQgdGVsbGRpciAoRElSICpfX2RpcnApIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorCisvKiBSZXR1cm4gdGhlIGZpbGUgZGVzY3JpcHRvciB1c2VkIGJ5IERJUlAuICAqLworZXh0ZXJuIGludCBkaXJmZCAoRElSICpfX2RpcnApIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjIGlmIGRlZmluZWQgX19PUFRJTUlaRV9fICYmIGRlZmluZWQgX0RJUl9kaXJmZAorIyAgZGVmaW5lIGRpcmZkKGRpcnApCV9ESVJfZGlyZmQgKGRpcnApCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisjICBpZm5kZWYgTUFYTkFNTEVOCisvKiBHZXQgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBQT1NJWC4xIGxpbWl0cy4gICovCisjICBpbmNsdWRlIDxiaXRzL3Bvc2l4MV9saW0uaD4KKworLyogYE1BWE5BTUxFTicgaXMgdGhlIEJTRCBuYW1lIGZvciB3aGF0IFBPU0lYIGNhbGxzIGBOQU1FX01BWCcuICAqLworIyAgIGlmZGVmIE5BTUVfTUFYCisjICAgIGRlZmluZSBNQVhOQU1MRU4JTkFNRV9NQVgKKyMgICBlbHNlCisjICAgIGRlZmluZSBNQVhOQU1MRU4JMjU1CisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgZGVmaW5lIF9fbmVlZF9zaXplX3QKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIFNjYW4gdGhlIGRpcmVjdG9yeSBESVIsIGNhbGxpbmcgU0VMRUNUT1Igb24gZWFjaCBkaXJlY3RvcnkgZW50cnkuCisgICBFbnRyaWVzIGZvciB3aGljaCBTRUxFQ1QgcmV0dXJucyBub256ZXJvIGFyZSBpbmRpdmlkdWFsbHkgbWFsbG9jJ2QsCisgICBzb3J0ZWQgdXNpbmcgcXNvcnQgd2l0aCBDTVAsIGFuZCBjb2xsZWN0ZWQgaW4gYSBtYWxsb2MnZCBhcnJheSBpbgorICAgKk5BTUVMSVNULiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgc2VsZWN0ZWQsIG9yIC0xIG9uIGVycm9yLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgc2NhbmRpciAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGlyLAorCQkgICAgc3RydWN0IGRpcmVudCAqKipfX3Jlc3RyaWN0IF9fbmFtZWxpc3QsCisJCSAgICBpbnQgKCpfX3NlbGVjdG9yKSAoX19jb25zdCBzdHJ1Y3QgZGlyZW50ICopLAorCQkgICAgaW50ICgqX19jbXApIChfX2NvbnN0IHN0cnVjdCBkaXJlbnQgKiosCisJCQkJICBfX2NvbnN0IHN0cnVjdCBkaXJlbnQgKiopKQorICAgICBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoc2NhbmRpciwKKwkJICAgICAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19kaXIsCisJCQlzdHJ1Y3QgZGlyZW50ICoqKl9fcmVzdHJpY3QgX19uYW1lbGlzdCwKKwkJCWludCAoKl9fc2VsZWN0b3IpIChfX2NvbnN0IHN0cnVjdCBkaXJlbnQgKiksCisJCQlpbnQgKCpfX2NtcCkgKF9fY29uc3Qgc3RydWN0IGRpcmVudCAqKiwKKwkJCQkgICAgICBfX2NvbnN0IHN0cnVjdCBkaXJlbnQgKiopKSwKKwkJICAgICAgIHNjYW5kaXI2NCkgX19ub25udWxsICgoMSwgMikpOworIyAgZWxzZQorIyAgIGRlZmluZSBzY2FuZGlyIHNjYW5kaXI2NAorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIF9fVVNFX0dOVSAmJiBkZWZpbmVkIF9fVVNFX0xBUkdFRklMRTY0CisvKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYHNjYW5kaXInIGJ1dCBpdCB1c2VzIHRoZSA2NGJpdCBkaXJlbnQgc3RydWN0dXJlLgorICAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgQ01QIGZ1bmN0aW9uIG11c3Qgbm93IHdvcmsgd2l0aCBzdHJ1Y3QgZGlyZW50NjQgKiouICAqLworZXh0ZXJuIGludCBzY2FuZGlyNjQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RpciwKKwkJICAgICAgc3RydWN0IGRpcmVudDY0ICoqKl9fcmVzdHJpY3QgX19uYW1lbGlzdCwKKwkJICAgICAgaW50ICgqX19zZWxlY3RvcikgKF9fY29uc3Qgc3RydWN0IGRpcmVudDY0ICopLAorCQkgICAgICBpbnQgKCpfX2NtcCkgKF9fY29uc3Qgc3RydWN0IGRpcmVudDY0ICoqLAorCQkJCSAgICBfX2NvbnN0IHN0cnVjdCBkaXJlbnQ2NCAqKikpCisgICAgIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZW5kaWYKKworIyBpZmRlZiBfX1VTRV9HTlUKKy8qIFNpbWlsYXIgdG8gYHNjYW5kaXInIGJ1dCBhIHJlbGF0aXZlIERJUiBuYW1lIGlzIGludGVycHJldGVkIHJlbGF0aXZlCisgICB0byB0aGUgZGlyZWN0b3J5IGZvciB3aGljaCBERkQgaXMgYSBkZXNjcmlwdG9yLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KKyMgIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHNjYW5kaXJhdCAoaW50IF9fZGZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19kaXIsCisJCSAgICAgIHN0cnVjdCBkaXJlbnQgKioqX19yZXN0cmljdCBfX25hbWVsaXN0LAorCQkgICAgICBpbnQgKCpfX3NlbGVjdG9yKSAoX19jb25zdCBzdHJ1Y3QgZGlyZW50ICopLAorCQkgICAgICBpbnQgKCpfX2NtcCkgKF9fY29uc3Qgc3RydWN0IGRpcmVudCAqKiwKKwkJCQkgICAgX19jb25zdCBzdHJ1Y3QgZGlyZW50ICoqKSkKKyAgICAgX19ub25udWxsICgoMiwgMykpOworIyAgZWxzZQorIyAgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoc2NhbmRpcmF0LAorCQkgICAgICAgKGludCBfX2RmZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGlyLAorCQkJc3RydWN0IGRpcmVudCAqKipfX3Jlc3RyaWN0IF9fbmFtZWxpc3QsCisJCQlpbnQgKCpfX3NlbGVjdG9yKSAoX19jb25zdCBzdHJ1Y3QgZGlyZW50ICopLAorCQkJaW50ICgqX19jbXApIChfX2NvbnN0IHN0cnVjdCBkaXJlbnQgKiosCisJCQkJICAgICAgX19jb25zdCBzdHJ1Y3QgZGlyZW50ICoqKSksCisJCSAgICAgICBzY2FuZGlyYXQ2NCkgX19ub25udWxsICgoMiwgMykpOworIyAgIGVsc2UKKyMgICAgZGVmaW5lIHNjYW5kaXJhdCBzY2FuZGlyYXQ2NAorIyAgIGVuZGlmCisjICBlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYHNjYW5kaXInIGJ1dCBpdCB1c2VzIHRoZSA2NGJpdCBkaXJlbnQgc3RydWN0dXJlLgorICAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgQ01QIGZ1bmN0aW9uIG11c3Qgbm93IHdvcmsgd2l0aCBzdHJ1Y3QgZGlyZW50NjQgKiouICAqLworZXh0ZXJuIGludCBzY2FuZGlyYXQ2NCAoaW50IF9fZGZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19kaXIsCisJCQlzdHJ1Y3QgZGlyZW50NjQgKioqX19yZXN0cmljdCBfX25hbWVsaXN0LAorCQkJaW50ICgqX19zZWxlY3RvcikgKF9fY29uc3Qgc3RydWN0IGRpcmVudDY0ICopLAorCQkJaW50ICgqX19jbXApIChfX2NvbnN0IHN0cnVjdCBkaXJlbnQ2NCAqKiwKKwkJCQkgICAgICBfX2NvbnN0IHN0cnVjdCBkaXJlbnQ2NCAqKikpCisgICAgIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyMgZW5kaWYKKworLyogRnVuY3Rpb24gdG8gY29tcGFyZSB0d28gYHN0cnVjdCBkaXJlbnQncyBhbHBoYWJldGljYWxseS4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGFscGhhc29ydCAoX19jb25zdCBzdHJ1Y3QgZGlyZW50ICoqX19lMSwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgZGlyZW50ICoqX19lMikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChhbHBoYXNvcnQsCisJCQkgICAoX19jb25zdCBzdHJ1Y3QgZGlyZW50ICoqX19lMSwKKwkJCSAgICBfX2NvbnN0IHN0cnVjdCBkaXJlbnQgKipfX2UyKSwKKwkJCSAgIGFscGhhc29ydDY0KSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworIyAgZWxzZQorIyAgIGRlZmluZSBhbHBoYXNvcnQgYWxwaGFzb3J0NjQKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9HTlUgJiYgZGVmaW5lZCBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBhbHBoYXNvcnQ2NCAoX19jb25zdCBzdHJ1Y3QgZGlyZW50NjQgKipfX2UxLAorCQkJX19jb25zdCBzdHJ1Y3QgZGlyZW50NjQgKipfX2UyKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVuZGlmCisjZW5kaWYgLyogVXNlIEJTRCBvciBtaXNjIG9yIFhQRzcuICAqLworCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKy8qIFJlYWQgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBGRCBpbnRvIEJVRiwgcmVhZGluZyBhdCBtb3N0IE5CWVRFUy4KKyAgIFJlYWRpbmcgc3RhcnRzIGF0IG9mZnNldCAqQkFTRVAsIGFuZCAqQkFTRVAgaXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcKKyAgIHBvc2l0aW9uIGFmdGVyIHJlYWRpbmcuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZDsgemVybyB3aGVuIGF0CisgICBlbmQgb2YgZGlyZWN0b3J5OyBvciAtMSBmb3IgZXJyb3JzLiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBfX3NzaXplX3QgZ2V0ZGlyZW50cmllcyAoaW50IF9fZmQsIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCisJCQkJc2l6ZV90IF9fbmJ5dGVzLAorCQkJCV9fb2ZmX3QgKl9fcmVzdHJpY3QgX19iYXNlcCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCA0KSk7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBfX3NzaXplX3QgX19SRURJUkVDVF9OVEggKGdldGRpcmVudHJpZXMsCisJCQkJIChpbnQgX19mZCwgY2hhciAqX19yZXN0cmljdCBfX2J1ZiwKKwkJCQkgIHNpemVfdCBfX25ieXRlcywKKwkJCQkgIF9fb2ZmNjRfdCAqX19yZXN0cmljdCBfX2Jhc2VwKSwKKwkJCQkgZ2V0ZGlyZW50cmllczY0KSBfX25vbm51bGwgKCgyLCA0KSk7CisjICBlbHNlCisjICAgZGVmaW5lIGdldGRpcmVudHJpZXMgZ2V0ZGlyZW50cmllczY0CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gX19zc2l6ZV90IGdldGRpcmVudHJpZXM2NCAoaW50IF9fZmQsIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCisJCQkJICBzaXplX3QgX19uYnl0ZXMsCisJCQkJICBfX29mZjY0X3QgKl9fcmVzdHJpY3QgX19iYXNlcCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCA0KSk7CisjIGVuZGlmCisjZW5kaWYgLyogVXNlIEJTRCBvciBtaXNjLiAgKi8KKworI2lmZGVmIF9fVVNFX0dOVQorLyogRnVuY3Rpb24gdG8gY29tcGFyZSB0d28gYHN0cnVjdCBkaXJlbnQncyBieSBuYW1lICYgdmVyc2lvbi4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHZlcnNpb25zb3J0IChfX2NvbnN0IHN0cnVjdCBkaXJlbnQgKipfX2UxLAorCQkJX19jb25zdCBzdHJ1Y3QgZGlyZW50ICoqX19lMikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIICh2ZXJzaW9uc29ydCwKKwkJCSAgIChfX2NvbnN0IHN0cnVjdCBkaXJlbnQgKipfX2UxLAorCQkJICAgIF9fY29uc3Qgc3RydWN0IGRpcmVudCAqKl9fZTIpLAorCQkJICAgdmVyc2lvbnNvcnQ2NCkKKyAgICAgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgdmVyc2lvbnNvcnQgdmVyc2lvbnNvcnQ2NAorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCB2ZXJzaW9uc29ydDY0IChfX2NvbnN0IHN0cnVjdCBkaXJlbnQ2NCAqKl9fZTEsCisJCQkgIF9fY29uc3Qgc3RydWN0IGRpcmVudDY0ICoqX19lMikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgorI2VuZGlmIC8qIFVzZSBHTlUuICAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZGlyZW50LmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RsZmNuLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RsZmNuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0NjFkZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZGxmY24uaApAQCAtMCwwICsxLDE5MSBAQAorLyogVXNlciBmdW5jdGlvbnMgZm9yIHJ1bi10aW1lIGR5bmFtaWMgbG9hZGluZy4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0yMDAxLDIwMDMsMjAwNCwyMDA2LDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0RMRkNOX0gKKyNkZWZpbmUJX0RMRkNOX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBDb2xsZWN0IHZhcmlvdXMgc3lzdGVtIGRlcGVuZGVudCBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zLiAgKi8KKyNpbmNsdWRlIDxiaXRzL2RsZmNuLmg+CisKKworI2lmZGVmIF9fVVNFX0dOVQorLyogSWYgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIGBkbHN5bScgb3IgYGRsdnN5bScgaXMgc2V0IHRvIFJUTERfTkVYVAorICAgdGhlIHJ1bi10aW1lIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBjYWxsZWQgTkFNRSBpbiB0aGUgbmV4dCBzaGFyZWQKKyAgIG9iamVjdCBpcyByZXR1cm5lZC4gIFRoZSAibmV4dCIgcmVsYXRpb24gaXMgZGVmaW5lZCBieSB0aGUgb3JkZXIKKyAgIHRoZSBzaGFyZWQgb2JqZWN0cyB3ZXJlIGxvYWRlZC4gICovCisjIGRlZmluZSBSVExEX05FWFQJKCh2b2lkICopIC0xbCkKKworLyogSWYgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGBkbHN5bScgb3IgYGRsdnN5bScgaXMgc2V0IHRvIFJUTERfREVGQVVMVAorICAgdGhlIHJ1bi10aW1lIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBjYWxsZWQgTkFNRSBpbiB0aGUgZ2xvYmFsIHNjb3BlCisgICBpcyByZXR1cm5lZC4gICovCisjIGRlZmluZSBSVExEX0RFRkFVTFQJKCh2b2lkICopIDApCisKKworLyogVHlwZSBmb3IgbmFtZXNwYWNlIGluZGVjZXMuICAqLwordHlwZWRlZiBsb25nIGludCBMbWlkX3Q7CisKKy8qIFNwZWNpYWwgbmFtZXNwYWNlIElEIHZhbHVlcy4gICovCisjIGRlZmluZSBMTV9JRF9CQVNFCTAJLyogSW5pdGlhbCBuYW1lc3BhY2UuICAqLworIyBkZWZpbmUgTE1fSURfTkVXTE0JLTEJLyogRm9yIGRsbW9wZW46IHJlcXVlc3QgbmV3IG5hbWVzcGFjZS4gICovCisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIE9wZW4gdGhlIHNoYXJlZCBvYmplY3QgRklMRSBhbmQgbWFwIGl0IGluOyByZXR1cm4gYSBoYW5kbGUgdGhhdCBjYW4gYmUKKyAgIHBhc3NlZCB0byBgZGxzeW0nIHRvIGdldCBzeW1ib2wgdmFsdWVzIGZyb20gaXQuICAqLworZXh0ZXJuIHZvaWQgKmRsb3BlbiAoX19jb25zdCBjaGFyICpfX2ZpbGUsIGludCBfX21vZGUpIF9fVEhST1c7CisKKy8qIFVubWFwIGFuZCBjbG9zZSBhIHNoYXJlZCBvYmplY3Qgb3BlbmVkIGJ5IGBkbG9wZW4nLgorICAgVGhlIGhhbmRsZSBjYW5ub3QgYmUgdXNlZCBhZ2FpbiBhZnRlciBjYWxsaW5nIGBkbGNsb3NlJy4gICovCitleHRlcm4gaW50IGRsY2xvc2UgKHZvaWQgKl9faGFuZGxlKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRmluZCB0aGUgcnVuLXRpbWUgYWRkcmVzcyBpbiB0aGUgc2hhcmVkIG9iamVjdCBIQU5ETEUgcmVmZXJzIHRvCisgICBvZiB0aGUgc3ltYm9sIGNhbGxlZCBOQU1FLiAgKi8KK2V4dGVybiB2b2lkICpkbHN5bSAodm9pZCAqX19yZXN0cmljdCBfX2hhbmRsZSwKKwkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUpIF9fVEhST1cgX19ub25udWxsICgoMikpOworCisjaWZkZWYgX19VU0VfR05VCisvKiBMaWtlIGBkbG9wZW4nLCBidXQgcmVxdWVzdCBvYmplY3QgdG8gYmUgYWxsb2NhdGVkIGluIGEgbmV3IG5hbWVzcGFjZS4gICovCitleHRlcm4gdm9pZCAqZGxtb3BlbiAoTG1pZF90IF9fbnNpZCwgX19jb25zdCBjaGFyICpfX2ZpbGUsIGludCBfX21vZGUpIF9fVEhST1c7CisKKy8qIEZpbmQgdGhlIHJ1bi10aW1lIGFkZHJlc3MgaW4gdGhlIHNoYXJlZCBvYmplY3QgSEFORExFIHJlZmVycyB0bworICAgb2YgdGhlIHN5bWJvbCBjYWxsZWQgTkFNRSB3aXRoIFZFUlNJT04uICAqLworZXh0ZXJuIHZvaWQgKmRsdnN5bSAodm9pZCAqX19yZXN0cmljdCBfX2hhbmRsZSwKKwkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3ZlcnNpb24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworI2VuZGlmCisKKy8qIFdoZW4gYW55IG9mIHRoZSBhYm92ZSBmdW5jdGlvbnMgZmFpbHMsIGNhbGwgdGhpcyBmdW5jdGlvbgorICAgdG8gcmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yLiAgRWFjaCBjYWxsIHJlc2V0cworICAgdGhlIGVycm9yIHN0cmluZyBzbyB0aGF0IGEgZm9sbG93aW5nIGNhbGwgcmV0dXJucyBudWxsLiAgKi8KK2V4dGVybiBjaGFyICpkbGVycm9yICh2b2lkKSBfX1RIUk9XOworCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFN0cnVjdHVyZSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IG9iamVjdCBzZWFyY2hlZCB1c2luZworICAgYGRsYWRkcicuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgX19jb25zdCBjaGFyICpkbGlfZm5hbWU7CS8qIEZpbGUgbmFtZSBvZiBkZWZpbmluZyBvYmplY3QuICAqLworICB2b2lkICpkbGlfZmJhc2U7CQkvKiBMb2FkIGFkZHJlc3Mgb2YgdGhhdCBvYmplY3QuICAqLworICBfX2NvbnN0IGNoYXIgKmRsaV9zbmFtZTsJLyogTmFtZSBvZiBuZWFyZXN0IHN5bWJvbC4gICovCisgIHZvaWQgKmRsaV9zYWRkcjsJCS8qIEV4YWN0IHZhbHVlIG9mIG5lYXJlc3Qgc3ltYm9sLiAgKi8KK30gRGxfaW5mbzsKKworLyogRmlsbCBpbiAqSU5GTyB3aXRoIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gYWJvdXQgQUREUkVTUy4KKyAgIFJldHVybnMgMCBpZmYgbm8gc2hhcmVkIG9iamVjdCdzIHNlZ21lbnRzIGNvbnRhaW4gdGhhdCBhZGRyZXNzLiAgKi8KK2V4dGVybiBpbnQgZGxhZGRyIChfX2NvbnN0IHZvaWQgKl9fYWRkcmVzcywgRGxfaW5mbyAqX19pbmZvKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworLyogU2FtZSBhcyBgZGxhZGRyJywgYnV0IGFkZGl0aW9uYWxseSBzZXRzICpFWFRSQV9JTkZPIGFjY29yZGluZyB0byBGTEFHUy4gICovCitleHRlcm4gaW50IGRsYWRkcjEgKF9fY29uc3Qgdm9pZCAqX19hZGRyZXNzLCBEbF9pbmZvICpfX2luZm8sCisJCSAgICB2b2lkICoqX19leHRyYV9pbmZvLCBpbnQgX19mbGFncykgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKKy8qIFRoZXNlIGFyZSB0aGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgRkxBR1MgYXJndW1lbnQgdG8gYGRsYWRkcjEnLgorICAgVGhpcyBpbmRpY2F0ZXMgd2hhdCBleHRyYSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgYXQgKkVYVFJBX0lORk8uCisgICBJdCBtYXkgYWxzbyBiZSB6ZXJvLCBpbiB3aGljaCBjYXNlIHRoZSBFWFRSQV9JTkZPIGFyZ3VtZW50IGlzIG5vdCB1c2VkLiAgKi8KK2VudW0KKyAgeworICAgIC8qIE1hdGNoaW5nIHN5bWJvbCB0YWJsZSBlbnRyeSAoY29uc3QgRWxmTk5fU3ltICopLiAgKi8KKyAgICBSVExEX0RMX1NZTUVOVCA9IDEsCisKKyAgICAvKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGFkZHJlc3MgKHN0cnVjdCBsaW5rX21hcCAqKS4gICovCisgICAgUlRMRF9ETF9MSU5LTUFQID0gMgorICB9OworCisKKy8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2hhcmVkIG9iamVjdCBIQU5ETEUgcmVmZXJzIHRvLgorICAgUkVRVUVTVCBpcyBmcm9tIGFtb25nIHRoZSB2YWx1ZXMgYmVsb3csIGFuZCBkZXRlcm1pbmVzIHRoZSB1c2Ugb2YgQVJHLgorCisgICBPbiBzdWNjZXNzLCByZXR1cm5zIHplcm8uICBPbiBmYWlsdXJlLCByZXR1cm5zIC0xIGFuZCByZWNvcmRzIGFuIGVycm9yCisgICBtZXNzYWdlIHRvIGJlIGZldGNoZWQgd2l0aCBgZGxlcnJvcicuICAqLworZXh0ZXJuIGludCBkbGluZm8gKHZvaWQgKl9fcmVzdHJpY3QgX19oYW5kbGUsCisJCSAgIGludCBfX3JlcXVlc3QsIHZvaWQgKl9fcmVzdHJpY3QgX19hcmcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMykpOworCisvKiBUaGVzZSBhcmUgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIFJFUVVFU1QgYXJndW1lbnQgdG8gYGRsaW5mbycuICAqLworZW51bQorICB7CisgICAgLyogVHJlYXQgQVJHIGFzIGBsbWlkX3QgKic7IHN0b3JlIG5hbWVzcGFjZSBJRCBmb3IgSEFORExFIHRoZXJlLiAgKi8KKyAgICBSVExEX0RJX0xNSUQgPSAxLAorCisgICAgLyogVHJlYXQgQVJHIGFzIGBzdHJ1Y3QgbGlua19tYXAgKionOworICAgICAgIHN0b3JlIHRoZSBgc3RydWN0IGxpbmtfbWFwIConIGZvciBIQU5ETEUgdGhlcmUuICAqLworICAgIFJUTERfRElfTElOS01BUCA9IDIsCisKKyAgICBSVExEX0RJX0NPTkZJR0FERFIgPSAzLAkvKiBVbnN1cHBvcnRlZCwgZGVmaW5lZCBieSBTb2xhcmlzLiAgKi8KKworICAgIC8qIFRyZWF0IEFSRyBhcyBgRGxfc2VyaW5mbyAqJyAoc2VlIGJlbG93KSwgYW5kIGZpbGwgaW4gdG8gZGVzY3JpYmUgdGhlCisgICAgICAgZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIHNlYXJjaGVkIGZvciBkZXBlbmRlbmNpZXMgb2YgdGhpcyBvYmplY3QuCisgICAgICAgUlRMRF9ESV9TRVJJTkZPU0laRSBmaWxscyBpbiBqdXN0IHRoZSBgZGxzX2NudCcgYW5kIGBkbHNfc2l6ZScKKyAgICAgICBlbnRyaWVzIHRvIGluZGljYXRlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhhdCBtdXN0IGJlIHBhc3NlZCB0bworICAgICAgIFJUTERfRElfU0VSSU5GTyB0byBmaWxsIGluIHRoZSBmdWxsIGluZm9ybWF0aW9uLiAgKi8KKyAgICBSVExEX0RJX1NFUklORk8gPSA0LAorICAgIFJUTERfRElfU0VSSU5GT1NJWkUgPSA1LAorCisgICAgLyogVHJlYXQgQVJHIGFzIGBjaGFyIConLCBhbmQgc3RvcmUgdGhlcmUgdGhlIGRpcmVjdG9yeSBuYW1lIHVzZWQgdG8KKyAgICAgICBleHBhbmQgJE9SSUdJTiBpbiB0aGlzIHNoYXJlZCBvYmplY3QncyBkZXBlbmRlbmN5IGZpbGUgbmFtZXMuICAqLworICAgIFJUTERfRElfT1JJR0lOID0gNiwKKworICAgIFJUTERfRElfUFJPRklMRU5BTUUgPSA3LAkvKiBVbnN1cHBvcnRlZCwgZGVmaW5lZCBieSBTb2xhcmlzLiAgKi8KKyAgICBSVExEX0RJX1BST0ZJTEVPVVQgPSA4LAkvKiBVbnN1cHBvcnRlZCwgZGVmaW5lZCBieSBTb2xhcmlzLiAgKi8KKworICAgIC8qIFRyZWF0IEFSRyBhcyBgc2l6ZV90IConLCBhbmQgc3RvcmUgdGhlcmUgdGhlIFRMUyBtb2R1bGUgSUQKKyAgICAgICBvZiB0aGlzIG9iamVjdCdzIFBUX1RMUyBzZWdtZW50LCBhcyB1c2VkIGluIFRMUyByZWxvY2F0aW9uczsKKyAgICAgICBzdG9yZSB6ZXJvIGlmIHRoaXMgb2JqZWN0IGRvZXMgbm90IGRlZmluZSBhIFBUX1RMUyBzZWdtZW50LiAgKi8KKyAgICBSVExEX0RJX1RMU19NT0RJRCA9IDksCisKKyAgICAvKiBUcmVhdCBBUkcgYXMgYHZvaWQgKionLCBhbmQgc3RvcmUgdGhlcmUgYSBwb2ludGVyIHRvIHRoZSBjYWxsaW5nCisgICAgICAgdGhyZWFkJ3MgVExTIGJsb2NrIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBvYmplY3QncyBQVF9UTFMgc2VnbWVudC4KKyAgICAgICBTdG9yZSBhIG51bGwgcG9pbnRlciBpZiB0aGlzIG9iamVjdCBkb2VzIG5vdCBkZWZpbmUgYSBQVF9UTFMKKyAgICAgICBzZWdtZW50LCBvciBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaGFzIG5vdCBhbGxvY2F0ZWQgYSBibG9jayBmb3IgaXQuICAqLworICAgIFJUTERfRElfVExTX0RBVEEgPSAxMCwKKworICAgIFJUTERfRElfTUFYID0gMTAKKyAgfTsKKworCisvKiBUaGlzIGlzIHRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIGBEbF9zZXJpbmZvJywgYmVsb3cuCisgICBUaGUgYGRsc19uYW1lJyBtZW1iZXIgcG9pbnRzIHRvIHNwYWNlIGluIHRoZSBidWZmZXIgcGFzc2VkIHRvIGBkbGluZm8nLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgKmRsc19uYW1lOwkJLyogTmFtZSBvZiBsaWJyYXJ5IHNlYXJjaCBwYXRoIGRpcmVjdG9yeS4gICovCisgIHVuc2lnbmVkIGludCBkbHNfZmxhZ3M7CS8qIEluZGljYXRlcyB3aGVyZSB0aGlzIGRpcmVjdG9yeSBjYW1lIGZyb20uICovCit9IERsX3NlcnBhdGg7CisKKy8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB0aGF0IG11c3QgYmUgcGFzc2VkIChieSByZWZlcmVuY2UpIHRvIGBkbGluZm8nIGZvcgorICAgdGhlIFJUTERfRElfU0VSSU5GTyBhbmQgUlRMRF9ESV9TRVJJTkZPU0laRSByZXF1ZXN0cy4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBzaXplX3QgZGxzX3NpemU7CQkvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSB3aG9sZSBidWZmZXIuICAqLworICB1bnNpZ25lZCBpbnQgZGxzX2NudDsJCS8qIE51bWJlciBvZiBlbGVtZW50cyBpbiBgZGxzX3NlcnBhdGgnLiAgKi8KKyAgRGxfc2VycGF0aCBkbHNfc2VycGF0aFsxXTsJLyogQWN0dWFsbHkgbG9uZ2VyLCBkbHNfY250IGVsZW1lbnRzLiAgKi8KK30gRGxfc2VyaW5mbzsKKyNlbmRpZiAvKiBfX1VTRV9HTlUgKi8KKworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogZGxmY24uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vZHJtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjk5N2ZkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vZHJtLmgKQEAgLTAsMCArMSw4MDQgQEAKKy8qKgorICogXGZpbGUgZHJtLmgKKyAqIEhlYWRlciBmb3IgdGhlIERpcmVjdCBSZW5kZXJpbmcgTWFuYWdlcgorICoKKyAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKgorICogXHBhciBBY2tub3dsZWRnbWVudHM6CisgKiBEZWMgMTk5OSwgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0d2lkZGxlLm5ldD4sIG1vdmUgdG8gZ2VuZXJpYyBcYyBjbXB4Y2hnLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0RSTV9IXworI2RlZmluZSBfRFJNX0hfCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvY3RsLmg+Cit0eXBlZGVmIHVuc2lnbmVkIGludCBkcm1faGFuZGxlX3Q7CisKKyNlbHNlIC8qIE9uZSBvZiB0aGUgQlNEcyAqLworCisjaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgordHlwZWRlZiBpbnQ4X3QgICBfX3M4OwordHlwZWRlZiB1aW50OF90ICBfX3U4OwordHlwZWRlZiBpbnQxNl90ICBfX3MxNjsKK3R5cGVkZWYgdWludDE2X3QgX191MTY7Cit0eXBlZGVmIGludDMyX3QgIF9fczMyOwordHlwZWRlZiB1aW50MzJfdCBfX3UzMjsKK3R5cGVkZWYgaW50NjRfdCAgX19zNjQ7Cit0eXBlZGVmIHVpbnQ2NF90IF9fdTY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRybV9oYW5kbGVfdDsKKworI2VuZGlmCisKKyNkZWZpbmUgRFJNX05BTUUJImRybSIJICAvKio8IE5hbWUgaW4ga2VybmVsLCAvZGV2LCBhbmQgL3Byb2MgKi8KKyNkZWZpbmUgRFJNX01JTl9PUkRFUgk1CSAgLyoqPCBBdCBsZWFzdCAyXjUgYnl0ZXMgPSAzMiBieXRlcyAqLworI2RlZmluZSBEUk1fTUFYX09SREVSCTIyCSAgLyoqPCBVcCB0byAyXjIyIGJ5dGVzID0gNE1CICovCisjZGVmaW5lIERSTV9SQU1fUEVSQ0VOVCAxMAkgIC8qKjwgSG93IG11Y2ggc3lzdGVtIHJhbSBjYW4gd2UgbG9jaz8gKi8KKworI2RlZmluZSBfRFJNX0xPQ0tfSEVMRAkweDgwMDAwMDAwVSAvKio8IEhhcmR3YXJlIGxvY2sgaXMgaGVsZCAqLworI2RlZmluZSBfRFJNX0xPQ0tfQ09OVAkweDQwMDAwMDAwVSAvKio8IEhhcmR3YXJlIGxvY2sgaXMgY29udGVuZGVkICovCisjZGVmaW5lIF9EUk1fTE9DS19JU19IRUxEKGxvY2spCSAgICgobG9jaykgJiBfRFJNX0xPQ0tfSEVMRCkKKyNkZWZpbmUgX0RSTV9MT0NLX0lTX0NPTlQobG9jaykJICAgKChsb2NrKSAmIF9EUk1fTE9DS19DT05UKQorI2RlZmluZSBfRFJNX0xPQ0tJTkdfQ09OVEVYVChsb2NrKSAoKGxvY2spICYgfihfRFJNX0xPQ0tfSEVMRHxfRFJNX0xPQ0tfQ09OVCkpCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IGRybV9jb250ZXh0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBkcm1fZHJhd2FibGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IGRybV9tYWdpY190OworCisvKioKKyAqIENsaXByZWN0LgorICoKKyAqIFx3YXJuaW5nOiBJZiB5b3UgY2hhbmdlIHRoaXMgc3RydWN0dXJlLCBtYWtlIHN1cmUgeW91IGNoYW5nZQorICogWEY4NkRSSUNsaXBSZWN0UmVjIGluIHRoZSBzZXJ2ZXIgYXMgd2VsbAorICoKKyAqIFxub3RlIEtXOiBBY3R1YWxseSBpdCdzIGlsbGVnYWwgdG8gY2hhbmdlIGVpdGhlciBmb3IKKyAqIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHJlYXNvbnMuCisgKi8KK3N0cnVjdCBkcm1fY2xpcF9yZWN0IHsKKwl1bnNpZ25lZCBzaG9ydCB4MTsKKwl1bnNpZ25lZCBzaG9ydCB5MTsKKwl1bnNpZ25lZCBzaG9ydCB4MjsKKwl1bnNpZ25lZCBzaG9ydCB5MjsKK307CisKKy8qKgorICogRHJhd2FibGUgaW5mb3JtYXRpb24uCisgKi8KK3N0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyB7CisJdW5zaWduZWQgaW50IG51bV9yZWN0czsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcmVjdHM7Cit9OworCisvKioKKyAqIFRleHR1cmUgcmVnaW9uLAorICovCitzdHJ1Y3QgZHJtX3RleF9yZWdpb24geworCXVuc2lnbmVkIGNoYXIgbmV4dDsKKwl1bnNpZ25lZCBjaGFyIHByZXY7CisJdW5zaWduZWQgY2hhciBpbl91c2U7CisJdW5zaWduZWQgY2hhciBwYWRkaW5nOworCXVuc2lnbmVkIGludCBhZ2U7Cit9OworCisvKioKKyAqIEhhcmR3YXJlIGxvY2suCisgKgorICogVGhlIGxvY2sgc3RydWN0dXJlIGlzIGEgc2ltcGxlIGNhY2hlLWxpbmUgYWxpZ25lZCBpbnRlZ2VyLiAgVG8gYXZvaWQKKyAqIHByb2Nlc3NvciBidXMgY29udGVudGlvbiBvbiBhIG11bHRpcHJvY2Vzc29yIHN5c3RlbSwgdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkKKyAqIG90aGVyIGRhdGEgc3RvcmVkIGluIHRoZSBzYW1lIGNhY2hlIGxpbmUuCisgKi8KK3N0cnVjdCBkcm1faHdfbG9jayB7CisJX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCBsb2NrOwkJLyoqPCBsb2NrIHZhcmlhYmxlICovCisJY2hhciBwYWRkaW5nWzYwXTsJCQkvKio8IFBhZCB0byBjYWNoZSBsaW5lICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9WRVJTSU9OIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUdldFZlcnNpb24oKS4KKyAqLworc3RydWN0IGRybV92ZXJzaW9uIHsKKwlpbnQgdmVyc2lvbl9tYWpvcjsJICAvKio8IE1ham9yIHZlcnNpb24gKi8KKwlpbnQgdmVyc2lvbl9taW5vcjsJICAvKio8IE1pbm9yIHZlcnNpb24gKi8KKwlpbnQgdmVyc2lvbl9wYXRjaGxldmVsOwkgIC8qKjwgUGF0Y2ggbGV2ZWwgKi8KKwlzaXplX3QgbmFtZV9sZW47CSAgLyoqPCBMZW5ndGggb2YgbmFtZSBidWZmZXIgKi8KKwljaGFyICpuYW1lOwkgIC8qKjwgTmFtZSBvZiBkcml2ZXIgKi8KKwlzaXplX3QgZGF0ZV9sZW47CSAgLyoqPCBMZW5ndGggb2YgZGF0ZSBidWZmZXIgKi8KKwljaGFyICpkYXRlOwkgIC8qKjwgVXNlci1zcGFjZSBidWZmZXIgdG8gaG9sZCBkYXRlICovCisJc2l6ZV90IGRlc2NfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIGRlc2MgYnVmZmVyICovCisJY2hhciAqZGVzYzsJICAvKio8IFVzZXItc3BhY2UgYnVmZmVyIHRvIGhvbGQgZGVzYyAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfR0VUX1VOSVFVRSBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1HZXRCdXNpZCgpIGFuZCBkcm1TZXRCdXNJZCgpLgorICovCitzdHJ1Y3QgZHJtX3VuaXF1ZSB7CisJc2l6ZV90IHVuaXF1ZV9sZW47CSAgLyoqPCBMZW5ndGggb2YgdW5pcXVlICovCisJY2hhciAqdW5pcXVlOwkgIC8qKjwgVW5pcXVlIG5hbWUgZm9yIGRyaXZlciBpbnN0YW50aWF0aW9uICovCit9OworCitzdHJ1Y3QgZHJtX2xpc3QgeworCWludCBjb3VudDsJCSAgLyoqPCBMZW5ndGggb2YgdXNlci1zcGFjZSBzdHJ1Y3R1cmVzICovCisJc3RydWN0IGRybV92ZXJzaW9uICp2ZXJzaW9uOworfTsKKworc3RydWN0IGRybV9ibG9jayB7CisJaW50IHVudXNlZDsKK307CisKKy8qKgorICogRFJNX0lPQ1RMX0NPTlRST0wgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtQ3RsSW5zdEhhbmRsZXIoKSBhbmQgZHJtQ3RsVW5pbnN0SGFuZGxlcigpLgorICovCitzdHJ1Y3QgZHJtX2NvbnRyb2wgeworCWVudW0geworCQlEUk1fQUREX0NPTU1BTkQsCisJCURSTV9STV9DT01NQU5ELAorCQlEUk1fSU5TVF9IQU5ETEVSLAorCQlEUk1fVU5JTlNUX0hBTkRMRVIKKwl9IGZ1bmM7CisJaW50IGlycTsKK307CisKKy8qKgorICogVHlwZSBvZiBtZW1vcnkgdG8gbWFwLgorICovCitlbnVtIGRybV9tYXBfdHlwZSB7CisJX0RSTV9GUkFNRV9CVUZGRVIgPSAwLAkgIC8qKjwgV0MgKG5vIGNhY2hpbmcpLCBubyBjb3JlIGR1bXAgKi8KKwlfRFJNX1JFR0lTVEVSUyA9IDEsCSAgLyoqPCBubyBjYWNoaW5nLCBubyBjb3JlIGR1bXAgKi8KKwlfRFJNX1NITSA9IDIsCQkgIC8qKjwgc2hhcmVkLCBjYWNoZWQgKi8KKwlfRFJNX0FHUCA9IDMsCQkgIC8qKjwgQUdQL0dBUlQgKi8KKwlfRFJNX1NDQVRURVJfR0FUSEVSID0gNCwgIC8qKjwgU2NhdHRlci9nYXRoZXIgbWVtb3J5IGZvciBQQ0kgRE1BICovCisJX0RSTV9DT05TSVNURU5UID0gNSwJICAvKio8IENvbnNpc3RlbnQgbWVtb3J5IGZvciBQQ0kgRE1BICovCisJX0RSTV9HRU0gPSA2LAkJICAvKio8IEdFTSBvYmplY3QgKi8KK307CisKKy8qKgorICogTWVtb3J5IG1hcHBpbmcgZmxhZ3MuCisgKi8KK2VudW0gZHJtX21hcF9mbGFncyB7CisJX0RSTV9SRVNUUklDVEVEID0gMHgwMSwJICAgICAvKio8IENhbm5vdCBiZSBtYXBwZWQgdG8gdXNlci12aXJ0dWFsICovCisJX0RSTV9SRUFEX09OTFkgPSAweDAyLAorCV9EUk1fTE9DS0VEID0gMHgwNCwJICAgICAvKio8IHNoYXJlZCwgY2FjaGVkLCBsb2NrZWQgKi8KKwlfRFJNX0tFUk5FTCA9IDB4MDgsCSAgICAgLyoqPCBrZXJuZWwgcmVxdWlyZXMgYWNjZXNzICovCisJX0RSTV9XUklURV9DT01CSU5JTkcgPSAweDEwLCAvKio8IHVzZSB3cml0ZS1jb21iaW5pbmcgaWYgYXZhaWxhYmxlICovCisJX0RSTV9DT05UQUlOU19MT0NLID0gMHgyMCwgICAvKio8IFNITSBwYWdlIHRoYXQgY29udGFpbnMgbG9jayAqLworCV9EUk1fUkVNT1ZBQkxFID0gMHg0MCwJICAgICAvKio8IFJlbW92YWJsZSBtYXBwaW5nICovCisJX0RSTV9EUklWRVIgPSAweDgwCSAgICAgLyoqPCBNYW5hZ2VkIGJ5IGRyaXZlciAqLworfTsKKworc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgeworCXVuc2lnbmVkIGludCBjdHhfaWQ7CSAvKio8IENvbnRleHQgcmVxdWVzdGluZyBwcml2YXRlIG1hcHBpbmcgKi8KKwl2b2lkICpoYW5kbGU7CQkgLyoqPCBIYW5kbGUgb2YgbWFwICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9HRVRfTUFQLCBEUk1fSU9DVExfQUREX01BUCBhbmQgRFJNX0lPQ1RMX1JNX01BUCBpb2N0bHMKKyAqIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUFkZE1hcCgpLgorICovCitzdHJ1Y3QgZHJtX21hcCB7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CSAvKio8IFJlcXVlc3RlZCBwaHlzaWNhbCBhZGRyZXNzICgwIGZvciBTQVJFQSkqLworCXVuc2lnbmVkIGxvbmcgc2l6ZTsJIC8qKjwgUmVxdWVzdGVkIHBoeXNpY2FsIHNpemUgKGJ5dGVzKSAqLworCWVudW0gZHJtX21hcF90eXBlIHR5cGU7CSAvKio8IFR5cGUgb2YgbWVtb3J5IHRvIG1hcCAqLworCWVudW0gZHJtX21hcF9mbGFncyBmbGFnczsJIC8qKjwgRmxhZ3MgKi8KKwl2b2lkICpoYW5kbGU7CQkgLyoqPCBVc2VyLXNwYWNlOiAiSGFuZGxlIiB0byBwYXNzIHRvIG1tYXAoKSAqLworCQkJCSAvKio8IEtlcm5lbC1zcGFjZToga2VybmVsLXZpcnR1YWwgYWRkcmVzcyAqLworCWludCBtdHJyOwkJIC8qKjwgTVRSUiBzbG90IHVzZWQgKi8KKwkvKiAgIFByaXZhdGUgZGF0YSAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfR0VUX0NMSUVOVCBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX2NsaWVudCB7CisJaW50IGlkeDsJCS8qKjwgV2hpY2ggY2xpZW50IGRlc2lyZWQ/ICovCisJaW50IGF1dGg7CQkvKio8IElzIGNsaWVudCBhdXRoZW50aWNhdGVkPyAqLworCXVuc2lnbmVkIGxvbmcgcGlkOwkvKio8IFByb2Nlc3MgSUQgKi8KKwl1bnNpZ25lZCBsb25nIHVpZDsJLyoqPCBVc2VyIElEICovCisJdW5zaWduZWQgbG9uZyBtYWdpYzsJLyoqPCBNYWdpYyAqLworCXVuc2lnbmVkIGxvbmcgaW9jczsJLyoqPCBJb2N0bCBjb3VudCAqLworfTsKKworZW51bSBkcm1fc3RhdF90eXBlIHsKKwlfRFJNX1NUQVRfTE9DSywKKwlfRFJNX1NUQVRfT1BFTlMsCisJX0RSTV9TVEFUX0NMT1NFUywKKwlfRFJNX1NUQVRfSU9DVExTLAorCV9EUk1fU1RBVF9MT0NLUywKKwlfRFJNX1NUQVRfVU5MT0NLUywKKwlfRFJNX1NUQVRfVkFMVUUsCS8qKjwgR2VuZXJpYyB2YWx1ZSAqLworCV9EUk1fU1RBVF9CWVRFLAkJLyoqPCBHZW5lcmljIGJ5dGUgY291bnRlciAoMTAyNGJ5dGVzL0spICovCisJX0RSTV9TVEFUX0NPVU5ULAkvKio8IEdlbmVyaWMgbm9uLWJ5dGUgY291bnRlciAoMTAwMC9rKSAqLworCisJX0RSTV9TVEFUX0lSUSwJCS8qKjwgSVJRICovCisJX0RSTV9TVEFUX1BSSU1BUlksCS8qKjwgUHJpbWFyeSBETUEgYnl0ZXMgKi8KKwlfRFJNX1NUQVRfU0VDT05EQVJZLAkvKio8IFNlY29uZGFyeSBETUEgYnl0ZXMgKi8KKwlfRFJNX1NUQVRfRE1BLAkJLyoqPCBETUEgKi8KKwlfRFJNX1NUQVRfU1BFQ0lBTCwJLyoqPCBTcGVjaWFsIERNQSAoZS5nLiwgcHJpb3JpdHkgb3IgcG9sbGVkKSAqLworCV9EUk1fU1RBVF9NSVNTRUQJLyoqPCBNaXNzZWQgRE1BIG9wcG9ydHVuaXR5ICovCisJICAgIC8qIEFkZCB0byB0aGUgKkVORCogb2YgdGhlIGxpc3QgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0dFVF9TVEFUUyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIGNvdW50OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJCWVudW0gZHJtX3N0YXRfdHlwZSB0eXBlOworCX0gZGF0YVsxNV07Cit9OworCisvKioKKyAqIEhhcmR3YXJlIGxvY2tpbmcgZmxhZ3MuCisgKi8KK2VudW0gZHJtX2xvY2tfZmxhZ3MgeworCV9EUk1fTE9DS19SRUFEWSA9IDB4MDEsCSAgICAgLyoqPCBXYWl0IHVudGlsIGhhcmR3YXJlIGlzIHJlYWR5IGZvciBETUEgKi8KKwlfRFJNX0xPQ0tfUVVJRVNDRU5UID0gMHgwMiwgIC8qKjwgV2FpdCB1bnRpbCBoYXJkd2FyZSBxdWllc2NlbnQgKi8KKwlfRFJNX0xPQ0tfRkxVU0ggPSAweDA0LAkgICAgIC8qKjwgRmx1c2ggdGhpcyBjb250ZXh0J3MgRE1BIHF1ZXVlIGZpcnN0ICovCisJX0RSTV9MT0NLX0ZMVVNIX0FMTCA9IDB4MDgsICAvKio8IEZsdXNoIGFsbCBETUEgcXVldWVzIGZpcnN0ICovCisJLyogVGhlc2UgKkhBTFQqIGZsYWdzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0CisJICAgLS0gdGhleSB3aWxsIGJlIHVzZWQgdG8gc3VwcG9ydCB0aGUKKwkgICBmdWxsLXNjcmVlbiBER0EtbGlrZSBtb2RlLiAqLworCV9EUk1fSEFMVF9BTExfUVVFVUVTID0gMHgxMCwgLyoqPCBIYWx0IGFsbCBjdXJyZW50IGFuZCBmdXR1cmUgcXVldWVzICovCisJX0RSTV9IQUxUX0NVUl9RVUVVRVMgPSAweDIwICAvKio8IEhhbHQgYWxsIGN1cnJlbnQgcXVldWVzICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9MT0NLLCBEUk1fSU9DVExfVU5MT0NLIGFuZCBEUk1fSU9DVExfRklOSVNIIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUdldExvY2soKSBhbmQgZHJtVW5sb2NrKCkuCisgKi8KK3N0cnVjdCBkcm1fbG9jayB7CisJaW50IGNvbnRleHQ7CisJZW51bSBkcm1fbG9ja19mbGFncyBmbGFnczsKK307CisKKy8qKgorICogRE1BIGZsYWdzCisgKgorICogXHdhcm5pbmcKKyAqIFRoZXNlIHZhbHVlcyBcZSBtdXN0IG1hdGNoIHhmODZkcm0uaC4KKyAqCisgKiBcc2EgZHJtX2RtYS4KKyAqLworZW51bSBkcm1fZG1hX2ZsYWdzIHsKKwkvKiBGbGFncyBmb3IgRE1BIGJ1ZmZlciBkaXNwYXRjaCAqLworCV9EUk1fRE1BX0JMT0NLID0gMHgwMSwJICAgICAgLyoqPAorCQkJCSAgICAgICAqIEJsb2NrIHVudGlsIGJ1ZmZlciBkaXNwYXRjaGVkLgorCQkJCSAgICAgICAqCisJCQkJICAgICAgICogXG5vdGUgVGhlIGJ1ZmZlciBtYXkgbm90IHlldCBoYXZlCisJCQkJICAgICAgICogYmVlbiBwcm9jZXNzZWQgYnkgdGhlIGhhcmR3YXJlIC0tCisJCQkJICAgICAgICogZ2V0dGluZyBhIGhhcmR3YXJlIGxvY2sgd2l0aCB0aGUKKwkJCQkgICAgICAgKiBoYXJkd2FyZSBxdWllc2NlbnQgd2lsbCBlbnN1cmUKKwkJCQkgICAgICAgKiB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4KKwkJCQkgICAgICAgKiBwcm9jZXNzZWQuCisJCQkJICAgICAgICovCisJX0RSTV9ETUFfV0hJTEVfTE9DS0VEID0gMHgwMiwgLyoqPCBEaXNwYXRjaCB3aGlsZSBsb2NrIGhlbGQgKi8KKwlfRFJNX0RNQV9QUklPUklUWSA9IDB4MDQsICAgICAvKio8IEhpZ2ggcHJpb3JpdHkgZGlzcGF0Y2ggKi8KKworCS8qIEZsYWdzIGZvciBETUEgYnVmZmVyIHJlcXVlc3QgKi8KKwlfRFJNX0RNQV9XQUlUID0gMHgxMCwJICAgICAgLyoqPCBXYWl0IGZvciBmcmVlIGJ1ZmZlcnMgKi8KKwlfRFJNX0RNQV9TTUFMTEVSX09LID0gMHgyMCwgICAvKio8IFNtYWxsZXItdGhhbi1yZXF1ZXN0ZWQgYnVmZmVycyBPSyAqLworCV9EUk1fRE1BX0xBUkdFUl9PSyA9IDB4NDAgICAgIC8qKjwgTGFyZ2VyLXRoYW4tcmVxdWVzdGVkIGJ1ZmZlcnMgT0sgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0FERF9CVUZTIGFuZCBEUk1fSU9DVExfTUFSS19CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUFkZEJ1ZnMoKS4KKyAqLworc3RydWN0IGRybV9idWZfZGVzYyB7CisJaW50IGNvdW50OwkJIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgb2YgdGhpcyBzaXplICovCisJaW50IHNpemU7CQkgLyoqPCBTaXplIGluIGJ5dGVzICovCisJaW50IGxvd19tYXJrOwkJIC8qKjwgTG93IHdhdGVyIG1hcmsgKi8KKwlpbnQgaGlnaF9tYXJrOwkJIC8qKjwgSGlnaCB3YXRlciBtYXJrICovCisJZW51bSB7CisJCV9EUk1fUEFHRV9BTElHTiA9IDB4MDEsCS8qKjwgQWxpZ24gb24gcGFnZSBib3VuZGFyaWVzIGZvciBETUEgKi8KKwkJX0RSTV9BR1BfQlVGRkVSID0gMHgwMiwJLyoqPCBCdWZmZXIgaXMgaW4gQUdQIHNwYWNlICovCisJCV9EUk1fU0dfQlVGRkVSID0gMHgwNCwJLyoqPCBTY2F0dGVyL2dhdGhlciBtZW1vcnkgYnVmZmVyICovCisJCV9EUk1fRkJfQlVGRkVSID0gMHgwOCwJLyoqPCBCdWZmZXIgaXMgaW4gZnJhbWUgYnVmZmVyICovCisJCV9EUk1fUENJX0JVRkZFUl9STyA9IDB4MTAgLyoqPCBNYXAgUENJIERNQSBidWZmZXIgcmVhZC1vbmx5ICovCisJfSBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGFncF9zdGFydDsgLyoqPAorCQkJCSAgKiBTdGFydCBhZGRyZXNzIG9mIHdoZXJlIHRoZSBBR1AgYnVmZmVycyBhcmUKKwkJCQkgICogaW4gdGhlIEFHUCBhcGVydHVyZQorCQkJCSAgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0lORk9fQlVGUyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX2J1Zl9pbmZvIHsKKwlpbnQgY291bnQ7CQkvKio8IEVudHJpZXMgaW4gbGlzdCAqLworCXN0cnVjdCBkcm1fYnVmX2Rlc2MgKmxpc3Q7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9GUkVFX0JVRlMgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9idWZfZnJlZSB7CisJaW50IGNvdW50OworCWludCAqbGlzdDsKK307CisKKy8qKgorICogQnVmZmVyIGluZm9ybWF0aW9uCisgKgorICogXHNhIGRybV9idWZfbWFwLgorICovCitzdHJ1Y3QgZHJtX2J1Zl9wdWIgeworCWludCBpZHg7CQkgICAgICAgLyoqPCBJbmRleCBpbnRvIHRoZSBtYXN0ZXIgYnVmZmVyIGxpc3QgKi8KKwlpbnQgdG90YWw7CQkgICAgICAgLyoqPCBCdWZmZXIgc2l6ZSAqLworCWludCB1c2VkOwkJICAgICAgIC8qKjwgQW1vdW50IG9mIGJ1ZmZlciBpbiB1c2UgKGZvciBETUEpICovCisJdm9pZCAqYWRkcmVzczsJICAgICAgIC8qKjwgQWRkcmVzcyBvZiBidWZmZXIgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX01BUF9CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3N0cnVjdCBkcm1fYnVmX21hcCB7CisJaW50IGNvdW50OwkJLyoqPCBMZW5ndGggb2YgdGhlIGJ1ZmZlciBsaXN0ICovCisJdm9pZCAqdmlydHVhbDsJCS8qKjwgTW1hcCdkIGFyZWEgaW4gdXNlci12aXJ0dWFsICovCisJc3RydWN0IGRybV9idWZfcHViICpsaXN0OwkvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfRE1BIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogSW5kaWNlcyBoZXJlIHJlZmVyIHRvIHRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGxpc3QgaW4gZHJtX2J1Zl9nZXQuCisgKgorICogXHNhIGRybURNQSgpLgorICovCitzdHJ1Y3QgZHJtX2RtYSB7CisJaW50IGNvbnRleHQ7CQkJICAvKio8IENvbnRleHQgaGFuZGxlICovCisJaW50IHNlbmRfY291bnQ7CQkJICAvKio8IE51bWJlciBvZiBidWZmZXJzIHRvIHNlbmQgKi8KKwlpbnQgKnNlbmRfaW5kaWNlczsJICAvKio8IExpc3Qgb2YgaGFuZGxlcyB0byBidWZmZXJzICovCisJaW50ICpzZW5kX3NpemVzOwkJICAvKio8IExlbmd0aHMgb2YgZGF0YSB0byBzZW5kICovCisJZW51bSBkcm1fZG1hX2ZsYWdzIGZsYWdzOwkgIC8qKjwgRmxhZ3MgKi8KKwlpbnQgcmVxdWVzdF9jb3VudDsJCSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyByZXF1ZXN0ZWQgKi8KKwlpbnQgcmVxdWVzdF9zaXplOwkJICAvKio8IERlc2lyZWQgc2l6ZSBmb3IgYnVmZmVycyAqLworCWludCAqcmVxdWVzdF9pbmRpY2VzOwkgIC8qKjwgQnVmZmVyIGluZm9ybWF0aW9uICovCisJaW50ICpyZXF1ZXN0X3NpemVzOworCWludCBncmFudGVkX2NvdW50OwkJICAvKio8IE51bWJlciBvZiBidWZmZXJzIGdyYW50ZWQgKi8KK307CisKK2VudW0gZHJtX2N0eF9mbGFncyB7CisJX0RSTV9DT05URVhUX1BSRVNFUlZFRCA9IDB4MDEsCisJX0RSTV9DT05URVhUXzJET05MWSA9IDB4MDIKK307CisKKy8qKgorICogRFJNX0lPQ1RMX0FERF9DVFggaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtQ3JlYXRlQ29udGV4dCgpIGFuZCBkcm1EZXN0cm95Q29udGV4dCgpLgorICovCitzdHJ1Y3QgZHJtX2N0eCB7CisJZHJtX2NvbnRleHRfdCBoYW5kbGU7CisJZW51bSBkcm1fY3R4X2ZsYWdzIGZsYWdzOworfTsKKworLyoqCisgKiBEUk1fSU9DVExfUkVTX0NUWCBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX2N0eF9yZXMgeworCWludCBjb3VudDsKKwlzdHJ1Y3QgZHJtX2N0eCAqY29udGV4dHM7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9BRERfRFJBVyBhbmQgRFJNX0lPQ1RMX1JNX0RSQVcgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9kcmF3IHsKKwlkcm1fZHJhd2FibGVfdCBoYW5kbGU7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9VUERBVEVfRFJBVyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCit0eXBlZGVmIGVudW0geworCURSTV9EUkFXQUJMRV9DTElQUkVDVFMsCit9IGRybV9kcmF3YWJsZV9pbmZvX3R5cGVfdDsKKworc3RydWN0IGRybV91cGRhdGVfZHJhdyB7CisJZHJtX2RyYXdhYmxlX3QgaGFuZGxlOworCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCBudW07CisJdW5zaWduZWQgbG9uZyBsb25nIGRhdGE7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9HRVRfTUFHSUMgYW5kIERSTV9JT0NUTF9BVVRIX01BR0lDIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3N0cnVjdCBkcm1fYXV0aCB7CisJZHJtX21hZ2ljX3QgbWFnaWM7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9JUlFfQlVTSUQgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtR2V0SW50ZXJydXB0RnJvbUJ1c0lEKCkuCisgKi8KK3N0cnVjdCBkcm1faXJxX2J1c2lkIHsKKwlpbnQgaXJxOwkvKio8IElSUSBudW1iZXIgKi8KKwlpbnQgYnVzbnVtOwkvKio8IGJ1cyBudW1iZXIgKi8KKwlpbnQgZGV2bnVtOwkvKio8IGRldmljZSBudW1iZXIgKi8KKwlpbnQgZnVuY251bTsJLyoqPCBmdW5jdGlvbiBudW1iZXIgKi8KK307CisKK2VudW0gZHJtX3ZibGFua19zZXFfdHlwZSB7CisJX0RSTV9WQkxBTktfQUJTT0xVVEUgPSAweDAsCS8qKjwgV2FpdCBmb3Igc3BlY2lmaWMgdmJsYW5rIHNlcXVlbmNlIG51bWJlciAqLworCV9EUk1fVkJMQU5LX1JFTEFUSVZFID0gMHgxLAkvKio8IFdhaXQgZm9yIGdpdmVuIG51bWJlciBvZiB2YmxhbmtzICovCisJLyogYml0cyAxLTYgYXJlIHJlc2VydmVkIGZvciBoaWdoIGNydGNzICovCisJX0RSTV9WQkxBTktfSElHSF9DUlRDX01BU0sgPSAweDAwMDAwMDNlLAorCV9EUk1fVkJMQU5LX0VWRU5UID0gMHg0MDAwMDAwLCAgIC8qKjwgU2VuZCBldmVudCBpbnN0ZWFkIG9mIGJsb2NraW5nICovCisJX0RSTV9WQkxBTktfRkxJUCA9IDB4ODAwMDAwMCwgICAvKio8IFNjaGVkdWxlZCBidWZmZXIgc3dhcCBzaG91bGQgZmxpcCAqLworCV9EUk1fVkJMQU5LX05FWFRPTk1JU1MgPSAweDEwMDAwMDAwLAkvKio8IElmIG1pc3NlZCwgd2FpdCBmb3IgbmV4dCB2YmxhbmsgKi8KKwlfRFJNX1ZCTEFOS19TRUNPTkRBUlkgPSAweDIwMDAwMDAwLAkvKio8IFNlY29uZGFyeSBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KKwlfRFJNX1ZCTEFOS19TSUdOQUwgPSAweDQwMDAwMDAwCS8qKjwgU2VuZCBzaWduYWwgaW5zdGVhZCBvZiBibG9ja2luZywgdW5zdXBwb3J0ZWQgKi8KK307CisjZGVmaW5lIF9EUk1fVkJMQU5LX0hJR0hfQ1JUQ19TSElGVCAxCisKKyNkZWZpbmUgX0RSTV9WQkxBTktfVFlQRVNfTUFTSyAoX0RSTV9WQkxBTktfQUJTT0xVVEUgfCBfRFJNX1ZCTEFOS19SRUxBVElWRSkKKyNkZWZpbmUgX0RSTV9WQkxBTktfRkxBR1NfTUFTSyAoX0RSTV9WQkxBTktfRVZFTlQgfCBfRFJNX1ZCTEFOS19TSUdOQUwgfCBcCisJCQkJX0RSTV9WQkxBTktfU0VDT05EQVJZIHwgX0RSTV9WQkxBTktfTkVYVE9OTUlTUykKKworc3RydWN0IGRybV93YWl0X3ZibGFua19yZXF1ZXN0IHsKKwllbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CisJdW5zaWduZWQgbG9uZyBzaWduYWw7Cit9OworCitzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcGx5IHsKKwllbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CisJbG9uZyB0dmFsX3NlYzsKKwlsb25nIHR2YWxfdXNlYzsKK307CisKKy8qKgorICogRFJNX0lPQ1RMX1dBSVRfVkJMQU5LIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybVdhaXRWQmxhbmsoKS4KKyAqLwordW5pb24gZHJtX3dhaXRfdmJsYW5rIHsKKwlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcGx5IHJlcGx5OworfTsKKworI2RlZmluZSBfRFJNX1BSRV9NT0RFU0VUIDEKKyNkZWZpbmUgX0RSTV9QT1NUX01PREVTRVQgMgorCisvKioKKyAqIERSTV9JT0NUTF9NT0RFU0VUX0NUTCBpb2N0bCBhcmd1bWVudCB0eXBlCisgKgorICogXHNhIGRybU1vZGVzZXRDdGwoKS4KKyAqLworc3RydWN0IGRybV9tb2Rlc2V0X2N0bCB7CisJX191MzIgY3J0YzsKKwlfX3UzMiBjbWQ7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9BR1BfRU5BQkxFIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUFncEVuYWJsZSgpLgorICovCitzdHJ1Y3QgZHJtX2FncF9tb2RlIHsKKwl1bnNpZ25lZCBsb25nIG1vZGU7CS8qKjwgQUdQIG1vZGUgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0FHUF9BTExPQyBhbmQgRFJNX0lPQ1RMX0FHUF9GUkVFIGlvY3RscyBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1BZ3BBbGxvYygpIGFuZCBkcm1BZ3BGcmVlKCkuCisgKi8KK3N0cnVjdCBkcm1fYWdwX2J1ZmZlciB7CisJdW5zaWduZWQgbG9uZyBzaXplOwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwkvKio8IFVzZWQgZm9yIGJpbmRpbmcgLyB1bmJpbmRpbmcgKi8KKwl1bnNpZ25lZCBsb25nIHR5cGU7CS8qKjwgVHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKi8KKwl1bnNpZ25lZCBsb25nIHBoeXNpY2FsOwkvKio8IFBoeXNpY2FsIHVzZWQgYnkgaTgxMCAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfQUdQX0JJTkQgYW5kIERSTV9JT0NUTF9BR1BfVU5CSU5EIGlvY3RscyBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1BZ3BCaW5kKCkgYW5kIGRybUFncFVuYmluZCgpLgorICovCitzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIHsKKwl1bnNpZ25lZCBsb25nIGhhbmRsZTsJLyoqPCBGcm9tIGRybV9hZ3BfYnVmZmVyICovCisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qKjwgSW4gYnl0ZXMgLS0gd2lsbCByb3VuZCB0byBwYWdlIGJvdW5kYXJ5ICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9BR1BfSU5GTyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1BZ3BWZXJzaW9uTWFqb3IoKSwgZHJtQWdwVmVyc2lvbk1pbm9yKCksIGRybUFncEdldE1vZGUoKSwKKyAqIGRybUFncEJhc2UoKSwgZHJtQWdwU2l6ZSgpLCBkcm1BZ3BNZW1vcnlVc2VkKCksIGRybUFncE1lbW9yeUF2YWlsKCksCisgKiBkcm1BZ3BWZW5kb3JJZCgpIGFuZCBkcm1BZ3BEZXZpY2VJZCgpLgorICovCitzdHJ1Y3QgZHJtX2FncF9pbmZvIHsKKwlpbnQgYWdwX3ZlcnNpb25fbWFqb3I7CisJaW50IGFncF92ZXJzaW9uX21pbm9yOworCXVuc2lnbmVkIGxvbmcgbW9kZTsKKwl1bnNpZ25lZCBsb25nIGFwZXJ0dXJlX2Jhc2U7CS8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nIGFwZXJ0dXJlX3NpemU7CS8qIGJ5dGVzICovCisJdW5zaWduZWQgbG9uZyBtZW1vcnlfYWxsb3dlZDsJLyogYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIG1lbW9yeV91c2VkOworCisJLyogUENJIGluZm9ybWF0aW9uICovCisJdW5zaWduZWQgc2hvcnQgaWRfdmVuZG9yOworCXVuc2lnbmVkIHNob3J0IGlkX2RldmljZTsKK307CisKKy8qKgorICogRFJNX0lPQ1RMX1NHX0FMTE9DIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3N0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgeworCXVuc2lnbmVkIGxvbmcgc2l6ZTsJLyoqPCBJbiBieXRlcyAtLSB3aWxsIHJvdW5kIHRvIHBhZ2UgYm91bmRhcnkgKi8KKwl1bnNpZ25lZCBsb25nIGhhbmRsZTsJLyoqPCBVc2VkIGZvciBtYXBwaW5nIC8gdW5tYXBwaW5nICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9TRVRfVkVSU0lPTiBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uIHsKKwlpbnQgZHJtX2RpX21ham9yOworCWludCBkcm1fZGlfbWlub3I7CisJaW50IGRybV9kZF9tYWpvcjsKKwlpbnQgZHJtX2RkX21pbm9yOworfTsKKworLyoqIERSTV9JT0NUTF9HRU1fQ0xPU0UgaW9jdGwgYXJndW1lbnQgdHlwZSAqLworc3RydWN0IGRybV9nZW1fY2xvc2UgeworCS8qKiBIYW5kbGUgb2YgdGhlIG9iamVjdCB0byBiZSBjbG9zZWQuICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKK307CisKKy8qKiBEUk1fSU9DVExfR0VNX0ZMSU5LIGlvY3RsIGFyZ3VtZW50IHR5cGUgKi8KK3N0cnVjdCBkcm1fZ2VtX2ZsaW5rIHsKKwkvKiogSGFuZGxlIGZvciB0aGUgb2JqZWN0IGJlaW5nIG5hbWVkICovCisJX191MzIgaGFuZGxlOworCisJLyoqIFJldHVybmVkIGdsb2JhbCBuYW1lICovCisJX191MzIgbmFtZTsKK307CisKKy8qKiBEUk1fSU9DVExfR0VNX09QRU4gaW9jdGwgYXJndW1lbnQgdHlwZSAqLworc3RydWN0IGRybV9nZW1fb3BlbiB7CisJLyoqIE5hbWUgb2Ygb2JqZWN0IGJlaW5nIG9wZW5lZCAqLworCV9fdTMyIG5hbWU7CisKKwkvKiogUmV0dXJuZWQgaGFuZGxlIGZvciB0aGUgb2JqZWN0ICovCisJX191MzIgaGFuZGxlOworCisJLyoqIFJldHVybmVkIHNpemUgb2YgdGhlIG9iamVjdCAqLworCV9fdTY0IHNpemU7Cit9OworCisvKiogRFJNX0lPQ1RMX0dFVF9DQVAgaW9jdGwgYXJndW1lbnQgdHlwZSAqLworc3RydWN0IGRybV9nZXRfY2FwIHsKKwlfX3U2NCBjYXBhYmlsaXR5OworCV9fdTY0IHZhbHVlOworfTsKKworI2luY2x1ZGUgPGRybS9kcm1fbW9kZS5oPgorCisjZGVmaW5lIERSTV9JT0NUTF9CQVNFCQkJJ2QnCisjZGVmaW5lIERSTV9JTyhucikJCQlfSU8oRFJNX0lPQ1RMX0JBU0UsbnIpCisjZGVmaW5lIERSTV9JT1IobnIsdHlwZSkJCV9JT1IoRFJNX0lPQ1RMX0JBU0UsbnIsdHlwZSkKKyNkZWZpbmUgRFJNX0lPVyhucix0eXBlKQkJX0lPVyhEUk1fSU9DVExfQkFTRSxucix0eXBlKQorI2RlZmluZSBEUk1fSU9XUihucix0eXBlKQkJX0lPV1IoRFJNX0lPQ1RMX0JBU0UsbnIsdHlwZSkKKworI2RlZmluZSBEUk1fSU9DVExfVkVSU0lPTgkJRFJNX0lPV1IoMHgwMCwgc3RydWN0IGRybV92ZXJzaW9uKQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1VOSVFVRQkJRFJNX0lPV1IoMHgwMSwgc3RydWN0IGRybV91bmlxdWUpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfTUFHSUMJCURSTV9JT1IoIDB4MDIsIHN0cnVjdCBkcm1fYXV0aCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0lSUV9CVVNJRAkJRFJNX0lPV1IoMHgwMywgc3RydWN0IGRybV9pcnFfYnVzaWQpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfTUFQICAgICAgICAgICAgICAgRFJNX0lPV1IoMHgwNCwgc3RydWN0IGRybV9tYXApCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfQ0xJRU5UICAgICAgICAgICAgRFJNX0lPV1IoMHgwNSwgc3RydWN0IGRybV9jbGllbnQpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfU1RBVFMgICAgICAgICAgICAgRFJNX0lPUiggMHgwNiwgc3RydWN0IGRybV9zdGF0cykKKyNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9WRVJTSU9OCQlEUk1fSU9XUigweDA3LCBzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERVNFVF9DVEwgICAgICAgICAgIERSTV9JT1coMHgwOCwgc3RydWN0IGRybV9tb2Rlc2V0X2N0bCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFTV9DTE9TRQkJRFJNX0lPVyAoMHgwOSwgc3RydWN0IGRybV9nZW1fY2xvc2UpCisjZGVmaW5lIERSTV9JT0NUTF9HRU1fRkxJTksJCURSTV9JT1dSKDB4MGEsIHN0cnVjdCBkcm1fZ2VtX2ZsaW5rKQorI2RlZmluZSBEUk1fSU9DVExfR0VNX09QRU4JCURSTV9JT1dSKDB4MGIsIHN0cnVjdCBkcm1fZ2VtX29wZW4pCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfQ0FQCQlEUk1fSU9XUigweDBjLCBzdHJ1Y3QgZHJtX2dldF9jYXApCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9VTklRVUUJCURSTV9JT1coIDB4MTAsIHN0cnVjdCBkcm1fdW5pcXVlKQorI2RlZmluZSBEUk1fSU9DVExfQVVUSF9NQUdJQwkJRFJNX0lPVyggMHgxMSwgc3RydWN0IGRybV9hdXRoKQorI2RlZmluZSBEUk1fSU9DVExfQkxPQ0sJCQlEUk1fSU9XUigweDEyLCBzdHJ1Y3QgZHJtX2Jsb2NrKQorI2RlZmluZSBEUk1fSU9DVExfVU5CTE9DSwkJRFJNX0lPV1IoMHgxMywgc3RydWN0IGRybV9ibG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX0NPTlRST0wJCURSTV9JT1coIDB4MTQsIHN0cnVjdCBkcm1fY29udHJvbCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9NQVAJCURSTV9JT1dSKDB4MTUsIHN0cnVjdCBkcm1fbWFwKQorI2RlZmluZSBEUk1fSU9DVExfQUREX0JVRlMJCURSTV9JT1dSKDB4MTYsIHN0cnVjdCBkcm1fYnVmX2Rlc2MpCisjZGVmaW5lIERSTV9JT0NUTF9NQVJLX0JVRlMJCURSTV9JT1coIDB4MTcsIHN0cnVjdCBkcm1fYnVmX2Rlc2MpCisjZGVmaW5lIERSTV9JT0NUTF9JTkZPX0JVRlMJCURSTV9JT1dSKDB4MTgsIHN0cnVjdCBkcm1fYnVmX2luZm8pCisjZGVmaW5lIERSTV9JT0NUTF9NQVBfQlVGUwkJRFJNX0lPV1IoMHgxOSwgc3RydWN0IGRybV9idWZfbWFwKQorI2RlZmluZSBEUk1fSU9DVExfRlJFRV9CVUZTCQlEUk1fSU9XKCAweDFhLCBzdHJ1Y3QgZHJtX2J1Zl9mcmVlKQorCisjZGVmaW5lIERSTV9JT0NUTF9STV9NQVAJCURSTV9JT1coIDB4MWIsIHN0cnVjdCBkcm1fbWFwKQorCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfU0FSRUFfQ1RYCQlEUk1fSU9XKCAweDFjLCBzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9TQVJFQV9DVFggCURSTV9JT1dSKDB4MWQsIHN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwKQorCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfTUFTVEVSICAgICAgICAgICAgRFJNX0lPKDB4MWUpCisjZGVmaW5lIERSTV9JT0NUTF9EUk9QX01BU1RFUiAgICAgICAgICAgRFJNX0lPKDB4MWYpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9DVFgJCURSTV9JT1dSKDB4MjAsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfUk1fQ1RYCQlEUk1fSU9XUigweDIxLCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PRF9DVFgJCURSTV9JT1coIDB4MjIsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfR0VUX0NUWAkJRFJNX0lPV1IoMHgyMywgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9TV0lUQ0hfQ1RYCQlEUk1fSU9XKCAweDI0LCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX05FV19DVFgJCURSTV9JT1coIDB4MjUsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfUkVTX0NUWAkJRFJNX0lPV1IoMHgyNiwgc3RydWN0IGRybV9jdHhfcmVzKQorI2RlZmluZSBEUk1fSU9DVExfQUREX0RSQVcJCURSTV9JT1dSKDB4MjcsIHN0cnVjdCBkcm1fZHJhdykKKyNkZWZpbmUgRFJNX0lPQ1RMX1JNX0RSQVcJCURSTV9JT1dSKDB4MjgsIHN0cnVjdCBkcm1fZHJhdykKKyNkZWZpbmUgRFJNX0lPQ1RMX0RNQQkJCURSTV9JT1dSKDB4MjksIHN0cnVjdCBkcm1fZG1hKQorI2RlZmluZSBEUk1fSU9DVExfTE9DSwkJCURSTV9JT1coIDB4MmEsIHN0cnVjdCBkcm1fbG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX1VOTE9DSwkJRFJNX0lPVyggMHgyYiwgc3RydWN0IGRybV9sb2NrKQorI2RlZmluZSBEUk1fSU9DVExfRklOSVNICQlEUk1fSU9XKCAweDJjLCBzdHJ1Y3QgZHJtX2xvY2spCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFTV9QUklNRV9PUEVOICAgICAgICBEUk1fSU9XUigweDJlLCBzdHJ1Y3QgZHJtX2dlbV9vcGVuKQorCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfQUNRVUlSRQkJRFJNX0lPKCAgMHgzMCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9SRUxFQVNFCQlEUk1fSU8oICAweDMxKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0VOQUJMRQkJRFJNX0lPVyggMHgzMiwgc3RydWN0IGRybV9hZ3BfbW9kZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9JTkZPCQlEUk1fSU9SKCAweDMzLCBzdHJ1Y3QgZHJtX2FncF9pbmZvKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0FMTE9DCQlEUk1fSU9XUigweDM0LCBzdHJ1Y3QgZHJtX2FncF9idWZmZXIpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfRlJFRQkJRFJNX0lPVyggMHgzNSwgc3RydWN0IGRybV9hZ3BfYnVmZmVyKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0JJTkQJCURSTV9JT1coIDB4MzYsIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfVU5CSU5ECQlEUk1fSU9XKCAweDM3LCBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nKQorCisjZGVmaW5lIERSTV9JT0NUTF9TR19BTExPQwkJRFJNX0lPV1IoMHgzOCwgc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlcikKKyNkZWZpbmUgRFJNX0lPQ1RMX1NHX0ZSRUUJCURSTV9JT1coIDB4MzksIHN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1dBSVRfVkJMQU5LCQlEUk1fSU9XUigweDNhLCB1bmlvbiBkcm1fd2FpdF92YmxhbmspCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1VQREFURV9EUkFXCQlEUk1fSU9XKDB4M2YsIHN0cnVjdCBkcm1fdXBkYXRlX2RyYXcpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VUUkVTT1VSQ0VTCURSTV9JT1dSKDB4QTAsIHN0cnVjdCBkcm1fbW9kZV9jYXJkX3JlcykKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VUQ1JUQwkJRFJNX0lPV1IoMHhBMSwgc3RydWN0IGRybV9tb2RlX2NydGMpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX1NFVENSVEMJCURSTV9JT1dSKDB4QTIsIHN0cnVjdCBkcm1fbW9kZV9jcnRjKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9DVVJTT1IJCURSTV9JT1dSKDB4QTMsIHN0cnVjdCBkcm1fbW9kZV9jdXJzb3IpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0dFVEdBTU1BCQlEUk1fSU9XUigweEE0LCBzdHJ1Y3QgZHJtX21vZGVfY3J0Y19sdXQpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX1NFVEdBTU1BCQlEUk1fSU9XUigweEE1LCBzdHJ1Y3QgZHJtX21vZGVfY3J0Y19sdXQpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0dFVEVOQ09ERVIJRFJNX0lPV1IoMHhBNiwgc3RydWN0IGRybV9tb2RlX2dldF9lbmNvZGVyKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRDT05ORUNUT1IJRFJNX0lPV1IoMHhBNywgc3RydWN0IGRybV9tb2RlX2dldF9jb25uZWN0b3IpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0FUVEFDSE1PREUJRFJNX0lPV1IoMHhBOCwgc3RydWN0IGRybV9tb2RlX21vZGVfY21kKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9ERVRBQ0hNT0RFCURSTV9JT1dSKDB4QTksIHN0cnVjdCBkcm1fbW9kZV9tb2RlX2NtZCkKKworI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRQUk9QRVJUWQlEUk1fSU9XUigweEFBLCBzdHJ1Y3QgZHJtX21vZGVfZ2V0X3Byb3BlcnR5KQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9TRVRQUk9QRVJUWQlEUk1fSU9XUigweEFCLCBzdHJ1Y3QgZHJtX21vZGVfY29ubmVjdG9yX3NldF9wcm9wZXJ0eSkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VUUFJPUEJMT0IJRFJNX0lPV1IoMHhBQywgc3RydWN0IGRybV9tb2RlX2dldF9ibG9iKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRGQgkJRFJNX0lPV1IoMHhBRCwgc3RydWN0IGRybV9tb2RlX2ZiX2NtZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfQURERkIJCURSTV9JT1dSKDB4QUUsIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX1JNRkIJCURSTV9JT1dSKDB4QUYsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfUEFHRV9GTElQCURSTV9JT1dSKDB4QjAsIHN0cnVjdCBkcm1fbW9kZV9jcnRjX3BhZ2VfZmxpcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfRElSVFlGQgkJRFJNX0lPV1IoMHhCMSwgc3RydWN0IGRybV9tb2RlX2ZiX2RpcnR5X2NtZCkKKworI2RlZmluZSBEUk1fSU9DVExfTU9ERV9DUkVBVEVfRFVNQiBEUk1fSU9XUigweEIyLCBzdHJ1Y3QgZHJtX21vZGVfY3JlYXRlX2R1bWIpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX01BUF9EVU1CICAgIERSTV9JT1dSKDB4QjMsIHN0cnVjdCBkcm1fbW9kZV9tYXBfZHVtYikKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfREVTVFJPWV9EVU1CICAgIERSTV9JT1dSKDB4QjQsIHN0cnVjdCBkcm1fbW9kZV9kZXN0cm95X2R1bWIpCisKKy8qKgorICogRGV2aWNlIHNwZWNpZmljIGlvY3RscyBzaG91bGQgb25seSBiZSBpbiB0aGVpciByZXNwZWN0aXZlIGhlYWRlcnMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgZnJvbSAweDQwIHRvIDB4OTkuCisgKiBHZW5lcmljIElPQ1RMUyByZXN0YXJ0IGF0IDB4QTAuCisgKgorICogXHNhIGRybUNvbW1hbmROb25lKCksIGRybUNvbW1hbmRSZWFkKCksIGRybUNvbW1hbmRXcml0ZSgpLCBhbmQKKyAqIGRybUNvbW1hbmRSZWFkV3JpdGUoKS4KKyAqLworI2RlZmluZSBEUk1fQ09NTUFORF9CQVNFICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgRFJNX0NPTU1BTkRfRU5ECQkJMHhBMAorCisvKioKKyAqIEhlYWRlciBmb3IgZXZlbnRzIHdyaXR0ZW4gYmFjayB0byB1c2Vyc3BhY2Ugb24gdGhlIGRybSBmZC4gIFRoZQorICogdHlwZSBkZWZpbmVzIHRoZSB0eXBlIG9mIGV2ZW50LCB0aGUgbGVuZ3RoIHNwZWNpZmllcyB0aGUgdG90YWwKKyAqIGxlbmd0aCBvZiB0aGUgZXZlbnQgKGluY2x1ZGluZyB0aGUgaGVhZGVyKSwgYW5kIHVzZXJfZGF0YSBpcworICogdHlwaWNhbGx5IGEgNjQgYml0IHZhbHVlIHBhc3NlZCB3aXRoIHRoZSBpb2N0bCB0aGF0IHRyaWdnZXJlZCB0aGUKKyAqIGV2ZW50LiAgQSByZWFkIG9uIHRoZSBkcm0gZmQgd2lsbCBhbHdheXMgb25seSByZXR1cm4gY29tcGxldGUKKyAqIGV2ZW50cywgdGhhdCBpcywgaWYgZm9yIGV4YW1wbGUgdGhlIHJlYWQgYnVmZmVyIGlzIDEwMCBieXRlcywgYW5kCisgKiB0aGVyZSBhcmUgdHdvIDY0IGJ5dGUgZXZlbnRzIHBlbmRpbmcsIG9ubHkgb25lIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICogRXZlbnQgdHlwZXMgMCAtIDB4N2ZmZmZmZmYgYXJlIGdlbmVyaWMgZHJtIGV2ZW50cywgMHg4MDAwMDAwMCBhbmQKKyAqIHVwIGFyZSBjaGlwc2V0IHNwZWNpZmljLgorICovCitzdHJ1Y3QgZHJtX2V2ZW50IHsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGxlbmd0aDsKK307CisKKyNkZWZpbmUgRFJNX0VWRU5UX1ZCTEFOSyAweDAxCisjZGVmaW5lIERSTV9FVkVOVF9GTElQX0NPTVBMRVRFIDB4MDIKKworc3RydWN0IGRybV9ldmVudF92YmxhbmsgeworCXN0cnVjdCBkcm1fZXZlbnQgYmFzZTsKKwlfX3U2NCB1c2VyX2RhdGE7CisJX191MzIgdHZfc2VjOworCV9fdTMyIHR2X3VzZWM7CisJX191MzIgc2VxdWVuY2U7CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCisjZGVmaW5lIERSTV9DQVBfRFVNQl9CVUZGRVIgMHgxCisjZGVmaW5lIERSTV9DQVBfVkJMQU5LX0hJR0hfQ1JUQyAweDIKKworLyogdHlwZWRlZiBhcmVhICovCit0eXBlZGVmIHN0cnVjdCBkcm1fY2xpcF9yZWN0IGRybV9jbGlwX3JlY3RfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvIGRybV9kcmF3YWJsZV9pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fdGV4X3JlZ2lvbiBkcm1fdGV4X3JlZ2lvbl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2h3X2xvY2sgZHJtX2h3X2xvY2tfdDsKK3R5cGVkZWYgc3RydWN0IGRybV92ZXJzaW9uIGRybV92ZXJzaW9uX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fdW5pcXVlIGRybV91bmlxdWVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9saXN0IGRybV9saXN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYmxvY2sgZHJtX2Jsb2NrX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY29udHJvbCBkcm1fY29udHJvbF90OwordHlwZWRlZiBlbnVtIGRybV9tYXBfdHlwZSBkcm1fbWFwX3R5cGVfdDsKK3R5cGVkZWYgZW51bSBkcm1fbWFwX2ZsYWdzIGRybV9tYXBfZmxhZ3NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgZHJtX2N0eF9wcml2X21hcF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX21hcCBkcm1fbWFwX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY2xpZW50IGRybV9jbGllbnRfdDsKK3R5cGVkZWYgZW51bSBkcm1fc3RhdF90eXBlIGRybV9zdGF0X3R5cGVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9zdGF0cyBkcm1fc3RhdHNfdDsKK3R5cGVkZWYgZW51bSBkcm1fbG9ja19mbGFncyBkcm1fbG9ja19mbGFnc190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2xvY2sgZHJtX2xvY2tfdDsKK3R5cGVkZWYgZW51bSBkcm1fZG1hX2ZsYWdzIGRybV9kbWFfZmxhZ3NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfZGVzYyBkcm1fYnVmX2Rlc2NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfaW5mbyBkcm1fYnVmX2luZm9fdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfZnJlZSBkcm1fYnVmX2ZyZWVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfcHViIGRybV9idWZfcHViX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX21hcCBkcm1fYnVmX21hcF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2RtYSBkcm1fZG1hX3Q7Cit0eXBlZGVmIHVuaW9uIGRybV93YWl0X3ZibGFuayBkcm1fd2FpdF92YmxhbmtfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9hZ3BfbW9kZSBkcm1fYWdwX21vZGVfdDsKK3R5cGVkZWYgZW51bSBkcm1fY3R4X2ZsYWdzIGRybV9jdHhfZmxhZ3NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jdHggZHJtX2N0eF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9yZXMgZHJtX2N0eF9yZXNfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9kcmF3IGRybV9kcmF3X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fdXBkYXRlX2RyYXcgZHJtX3VwZGF0ZV9kcmF3X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYXV0aCBkcm1fYXV0aF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2lycV9idXNpZCBkcm1faXJxX2J1c2lkX3Q7Cit0eXBlZGVmIGVudW0gZHJtX3ZibGFua19zZXFfdHlwZSBkcm1fdmJsYW5rX3NlcV90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9hZ3BfYnVmZmVyIGRybV9hZ3BfYnVmZmVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgZHJtX2FncF9iaW5kaW5nX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2luZm8gZHJtX2FncF9pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgZHJtX3NjYXR0ZXJfZ2F0aGVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fc2V0X3ZlcnNpb24gZHJtX3NldF92ZXJzaW9uX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vZHJtX21vZGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL2RybV9tb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkNDZkYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL2RybV9tb2RlLmgKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSmFrb2IgQm9ybmVjcmFudHogPHdhbGxicmFrZXJAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA4IFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRYLiwgVVNBCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9EUk1fTU9ERV9ICisjZGVmaW5lIF9EUk1fTU9ERV9ICisKKyNkZWZpbmUgRFJNX0RJU1BMQVlfSU5GT19MRU4JMzIKKyNkZWZpbmUgRFJNX0NPTk5FQ1RPUl9OQU1FX0xFTgkzMgorI2RlZmluZSBEUk1fRElTUExBWV9NT0RFX0xFTgkzMgorI2RlZmluZSBEUk1fUFJPUF9OQU1FX0xFTgkzMgorCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfQlVJTFRJTgkoMTw8MCkKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9DTE9DS19DCSgoMTw8MSkgfCBEUk1fTU9ERV9UWVBFX0JVSUxUSU4pCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfQ1JUQ19DCSgoMTw8MikgfCBEUk1fTU9ERV9UWVBFX0JVSUxUSU4pCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfUFJFRkVSUkVECSgxPDwzKQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX0RFRkFVTFQJKDE8PDQpCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfVVNFUkRFRgkoMTw8NSkKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9EUklWRVIJKDE8PDYpCisKKy8qIFZpZGVvIG1vZGUgZmxhZ3MgKi8KKy8qIGJpdCBjb21wYXRpYmxlIHdpdGggdGhlIHhvcmcgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfUEhTWU5DCSgxPDwwKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX05IU1lOQwkoMTw8MSkKKyNkZWZpbmUgRFJNX01PREVfRkxBR19QVlNZTkMJKDE8PDIpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfTlZTWU5DCSgxPDwzKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRQkoMTw8NCkKKyNkZWZpbmUgRFJNX01PREVfRkxBR19EQkxTQ0FOCSgxPDw1KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0NTWU5DCSgxPDw2KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX1BDU1lOQwkoMTw8NykKKyNkZWZpbmUgRFJNX01PREVfRkxBR19OQ1NZTkMJKDE8PDgpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfSFNLRVcJKDE8PDkpIC8qIGhza2V3IHByb3ZpZGVkICovCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfQkNBU1QJKDE8PDEwKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX1BJWE1VWAkoMTw8MTEpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfREJMQ0xLCSgxPDwxMikKKyNkZWZpbmUgRFJNX01PREVfRkxBR19DTEtESVYyCSgxPDwxMykKKworLyogRFBNUyBmbGFncyAqLworLyogYml0IGNvbXBhdGlibGUgd2l0aCB0aGUgeG9yZyBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgRFJNX01PREVfRFBNU19PTgkwCisjZGVmaW5lIERSTV9NT0RFX0RQTVNfU1RBTkRCWQkxCisjZGVmaW5lIERSTV9NT0RFX0RQTVNfU1VTUEVORAkyCisjZGVmaW5lIERSTV9NT0RFX0RQTVNfT0ZGCTMKKworLyogU2NhbGluZyBtb2RlIG9wdGlvbnMgKi8KKyNkZWZpbmUgRFJNX01PREVfU0NBTEVfTk9ORQkJMCAvKiBVbm1vZGlmaWVkIHRpbWluZyAoZGlzcGxheSBvcgorCQkJCQkgICAgIHNvZnR3YXJlIGNhbiBzdGlsbCBzY2FsZSkgKi8KKyNkZWZpbmUgRFJNX01PREVfU0NBTEVfRlVMTFNDUkVFTgkxIC8qIEZ1bGwgc2NyZWVuLCBpZ25vcmUgYXNwZWN0ICovCisjZGVmaW5lIERSTV9NT0RFX1NDQUxFX0NFTlRFUgkJMiAvKiBDZW50ZXJlZCwgbm8gc2NhbGluZyAqLworI2RlZmluZSBEUk1fTU9ERV9TQ0FMRV9BU1BFQ1QJCTMgLyogRnVsbCBzY3JlZW4sIHByZXNlcnZlIGFzcGVjdCAqLworCisvKiBEaXRoZXJpbmcgbW9kZSBvcHRpb25zICovCisjZGVmaW5lIERSTV9NT0RFX0RJVEhFUklOR19PRkYJMAorI2RlZmluZSBEUk1fTU9ERV9ESVRIRVJJTkdfT04JMQorI2RlZmluZSBEUk1fTU9ERV9ESVRIRVJJTkdfQVVUTyAyCisKKy8qIERpcnR5IGluZm8gb3B0aW9ucyAqLworI2RlZmluZSBEUk1fTU9ERV9ESVJUWV9PRkYgICAgICAwCisjZGVmaW5lIERSTV9NT0RFX0RJUlRZX09OICAgICAgIDEKKyNkZWZpbmUgRFJNX01PREVfRElSVFlfQU5OT1RBVEUgMgorCitzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8geworCV9fdTMyIGNsb2NrOworCV9fdTE2IGhkaXNwbGF5LCBoc3luY19zdGFydCwgaHN5bmNfZW5kLCBodG90YWwsIGhza2V3OworCV9fdTE2IHZkaXNwbGF5LCB2c3luY19zdGFydCwgdnN5bmNfZW5kLCB2dG90YWwsIHZzY2FuOworCisJX191MzIgdnJlZnJlc2g7CisKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiB0eXBlOworCWNoYXIgbmFtZVtEUk1fRElTUExBWV9NT0RFX0xFTl07Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfY2FyZF9yZXMgeworCV9fdTY0IGZiX2lkX3B0cjsKKwlfX3U2NCBjcnRjX2lkX3B0cjsKKwlfX3U2NCBjb25uZWN0b3JfaWRfcHRyOworCV9fdTY0IGVuY29kZXJfaWRfcHRyOworCV9fdTMyIGNvdW50X2ZiczsKKwlfX3UzMiBjb3VudF9jcnRjczsKKwlfX3UzMiBjb3VudF9jb25uZWN0b3JzOworCV9fdTMyIGNvdW50X2VuY29kZXJzOworCV9fdTMyIG1pbl93aWR0aCwgbWF4X3dpZHRoOworCV9fdTMyIG1pbl9oZWlnaHQsIG1heF9oZWlnaHQ7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfY3J0YyB7CisJX191NjQgc2V0X2Nvbm5lY3RvcnNfcHRyOworCV9fdTMyIGNvdW50X2Nvbm5lY3RvcnM7CisKKwlfX3UzMiBjcnRjX2lkOyAvKio8IElkICovCisJX191MzIgZmJfaWQ7IC8qKjwgSWQgb2YgZnJhbWVidWZmZXIgKi8KKworCV9fdTMyIHgsIHk7IC8qKjwgUG9zaXRpb24gb24gdGhlIGZyYW1ldWZmZXIgKi8KKworCV9fdTMyIGdhbW1hX3NpemU7CisJX191MzIgbW9kZV92YWxpZDsKKwlzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8gbW9kZTsKK307CisKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9OT05FCSAwCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfREFDCSAxCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfVE1EUwkgMgorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX0xWRFMJIDMKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9UVkRBQwkgNAorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX1ZJUlRVQUwgNQorCitzdHJ1Y3QgZHJtX21vZGVfZ2V0X2VuY29kZXIgeworCV9fdTMyIGVuY29kZXJfaWQ7CisJX191MzIgZW5jb2Rlcl90eXBlOworCisJX191MzIgY3J0Y19pZDsgLyoqPCBJZCBvZiBjcnRjICovCisKKwlfX3UzMiBwb3NzaWJsZV9jcnRjczsKKwlfX3UzMiBwb3NzaWJsZV9jbG9uZXM7Cit9OworCisvKiBUaGlzIGlzIGZvciBjb25uZWN0b3JzIHdpdGggbXVsdGlwbGUgc2lnbmFsIHR5cGVzLiAqLworLyogVHJ5IHRvIG1hdGNoIERSTV9NT0RFX0NPTk5FQ1RPUl9YIGFzIGNsb3NlbHkgYXMgcG9zc2libGUuICovCisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9BdXRvbWF0aWMJMAorI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfVW5rbm93bgkwCisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9EVklECTMKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX0RWSUEJNAorI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQ29tcG9zaXRlCTUKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX1NWSURFTwk2CisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Db21wb25lbnQJOAorI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfU0NBUlQJOQorCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duCTAKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX1ZHQQkJMQorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSQkJMgorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRAkJMworI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJQQkJNAorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9zaXRlCTUKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX1NWSURFTwk2CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTCQk3CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9Db21wb25lbnQJOAorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfOVBpbkRJTgk5CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydAkxMAorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEJMTEKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0hETUlCCTEyCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9UVgkJMTMKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX2VEUAkJMTQKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX1ZJUlRVQUwgICAgICAxNQorCitzdHJ1Y3QgZHJtX21vZGVfZ2V0X2Nvbm5lY3RvciB7CisKKwlfX3U2NCBlbmNvZGVyc19wdHI7CisJX191NjQgbW9kZXNfcHRyOworCV9fdTY0IHByb3BzX3B0cjsKKwlfX3U2NCBwcm9wX3ZhbHVlc19wdHI7CisKKwlfX3UzMiBjb3VudF9tb2RlczsKKwlfX3UzMiBjb3VudF9wcm9wczsKKwlfX3UzMiBjb3VudF9lbmNvZGVyczsKKworCV9fdTMyIGVuY29kZXJfaWQ7IC8qKjwgQ3VycmVudCBFbmNvZGVyICovCisJX191MzIgY29ubmVjdG9yX2lkOyAvKio8IElkICovCisJX191MzIgY29ubmVjdG9yX3R5cGU7CisJX191MzIgY29ubmVjdG9yX3R5cGVfaWQ7CisKKwlfX3UzMiBjb25uZWN0aW9uOworCV9fdTMyIG1tX3dpZHRoLCBtbV9oZWlnaHQ7IC8qKjwgSHhXIGluIG1pbGxpbWV0ZXJzICovCisJX191MzIgc3VicGl4ZWw7Cit9OworCisjZGVmaW5lIERSTV9NT0RFX1BST1BfUEVORElORwkoMTw8MCkKKyNkZWZpbmUgRFJNX01PREVfUFJPUF9SQU5HRQkoMTw8MSkKKyNkZWZpbmUgRFJNX01PREVfUFJPUF9JTU1VVEFCTEUJKDE8PDIpCisjZGVmaW5lIERSTV9NT0RFX1BST1BfRU5VTQkoMTw8MykgLyogZW51bWVyYXRlZCB0eXBlIHdpdGggdGV4dCBzdHJpbmdzICovCisjZGVmaW5lIERSTV9NT0RFX1BST1BfQkxPQgkoMTw8NCkKKworc3RydWN0IGRybV9tb2RlX3Byb3BlcnR5X2VudW0geworCV9fdTY0IHZhbHVlOworCWNoYXIgbmFtZVtEUk1fUFJPUF9OQU1FX0xFTl07Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfZ2V0X3Byb3BlcnR5IHsKKwlfX3U2NCB2YWx1ZXNfcHRyOyAvKiB2YWx1ZXMgYW5kIGJsb2IgbGVuZ3RocyAqLworCV9fdTY0IGVudW1fYmxvYl9wdHI7IC8qIGVudW0gYW5kIGJsb2IgaWQgcHRycyAqLworCisJX191MzIgcHJvcF9pZDsKKwlfX3UzMiBmbGFnczsKKwljaGFyIG5hbWVbRFJNX1BST1BfTkFNRV9MRU5dOworCisJX191MzIgY291bnRfdmFsdWVzOworCV9fdTMyIGNvdW50X2VudW1fYmxvYnM7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfY29ubmVjdG9yX3NldF9wcm9wZXJ0eSB7CisJX191NjQgdmFsdWU7CisJX191MzIgcHJvcF9pZDsKKwlfX3UzMiBjb25uZWN0b3JfaWQ7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfZ2V0X2Jsb2IgeworCV9fdTMyIGJsb2JfaWQ7CisJX191MzIgbGVuZ3RoOworCV9fdTY0IGRhdGE7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfZmJfY21kIHsKKwlfX3UzMiBmYl9pZDsKKwlfX3UzMiB3aWR0aCwgaGVpZ2h0OworCV9fdTMyIHBpdGNoOworCV9fdTMyIGJwcDsKKwlfX3UzMiBkZXB0aDsKKwkvKiBkcml2ZXIgc3BlY2lmaWMgaGFuZGxlICovCisJX191MzIgaGFuZGxlOworfTsKKworI2RlZmluZSBEUk1fTU9ERV9GQl9ESVJUWV9BTk5PVEFURV9DT1BZIDB4MDEKKyNkZWZpbmUgRFJNX01PREVfRkJfRElSVFlfQU5OT1RBVEVfRklMTCAweDAyCisjZGVmaW5lIERSTV9NT0RFX0ZCX0RJUlRZX0ZMQUdTICAgICAgICAgMHgwMworCisjZGVmaW5lIERSTV9NT0RFX0ZCX0RJUlRZX01BWF9DTElQUyAgICAgMjU2CisKKy8qCisgKiBNYXJrIGEgcmVnaW9uIG9mIGEgZnJhbWVidWZmZXIgYXMgZGlydHkuCisgKgorICogU29tZSBoYXJkd2FyZSBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBkaXNwbGF5IGNvbnRlbnRzCisgKiBhcyBhIGhhcmR3YXJlIG9yIHNvZnR3YXJlIGRyYXcgdG8gYSBmcmFtZWJ1ZmZlci4gVGhpcyBpb2N0bAorICogYWxsb3dzIHVzZXJzcGFjZSB0byB0ZWxsIHRoZSBrZXJuZWwgYW5kIHRoZSBoYXJkd2FyZSB3aGF0CisgKiByZWdpb25zIG9mIHRoZSBmcmFtZWJ1ZmZlciBoYXZlIGNoYW5nZWQuCisgKgorICogVGhlIGtlcm5lbCBvciBoYXJkd2FyZSBpcyBmcmVlIHRvIHVwZGF0ZSBtb3JlIHRoZW4ganVzdCB0aGUKKyAqIHJlZ2lvbiBzcGVjaWZpZWQgYnkgdGhlIGNsaXAgcmVjdHMuIFRoZSBrZXJuZWwgb3IgaGFyZHdhcmUKKyAqIG1heSBhbHNvIGRlbGF5IGFuZC9vciBjb2FsZXNjZSBzZXZlcmFsIGNhbGxzIHRvIGRpcnR5IGludG8gYQorICogc2luZ2xlIHVwZGF0ZS4KKyAqCisgKiBVc2Vyc3BhY2UgbWF5IGFubm90YXRlIHRoZSB1cGRhdGVzLCB0aGUgYW5ub3RhdGVzIGFyZSBhCisgKiBwcm9taXNlIG1hZGUgYnkgdGhlIGNhbGxlciB0aGF0IHRoZSBjaGFuZ2UgaXMgZWl0aGVyIGEgY29weQorICogb2YgcGl4ZWxzIG9yIGEgZmlsbCBvZiBhIHNpbmdsZSBjb2xvciBpbiB0aGUgcmVnaW9uIHNwZWNpZmllZC4KKyAqCisgKiBJZiB0aGUgRFJNX01PREVfRkJfRElSVFlfQU5OT1RBVEVfQ09QWSBmbGFnIGlzIGdpdmVuIHRoZW4KKyAqIHRoZSBudW1iZXIgb2YgdXBkYXRlZCByZWdpb25zIGFyZSBoYWxmIG9mIG51bV9jbGlwcyBnaXZlbiwKKyAqIHdoZXJlIHRoZSBjbGlwIHJlY3RzIGFyZSBwYWlyZWQgaW4gc3JjIGFuZCBkc3QuIFRoZSB3aWR0aCBhbmQKKyAqIGhlaWdodCBvZiBlYWNoIG9uZSBvZiB0aGUgcGFpcnMgbXVzdCBtYXRjaC4KKyAqCisgKiBJZiB0aGUgRFJNX01PREVfRkJfRElSVFlfQU5OT1RBVEVfRklMTCBmbGFnIGlzIGdpdmVuIHRoZSBjYWxsZXIKKyAqIHByb21pc2VzIHRoYXQgdGhlIHJlZ2lvbiBzcGVjaWZpZWQgb2YgdGhlIGNsaXAgcmVjdHMgaXMgZmlsbGVkCisgKiBjb21wbGV0ZWx5IHdpdGggYSBzaW5nbGUgY29sb3IgYXMgZ2l2ZW4gaW4gdGhlIGNvbG9yIGFyZ3VtZW50LgorICovCisKK3N0cnVjdCBkcm1fbW9kZV9mYl9kaXJ0eV9jbWQgeworCV9fdTMyIGZiX2lkOworCV9fdTMyIGZsYWdzOworCV9fdTMyIGNvbG9yOworCV9fdTMyIG51bV9jbGlwczsKKwlfX3U2NCBjbGlwc19wdHI7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfbW9kZV9jbWQgeworCV9fdTMyIGNvbm5lY3Rvcl9pZDsKKwlzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8gbW9kZTsKK307CisKKyNkZWZpbmUgRFJNX01PREVfQ1VSU09SX0JPCSgxPDwwKQorI2RlZmluZSBEUk1fTU9ERV9DVVJTT1JfTU9WRQkoMTw8MSkKKworLyoKKyAqIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgaW4gZmxhZ3MgZGlmZmVyZW50IG1lbWJlcnMgYXJlIHVzZWQuCisgKgorICogQ1VSU09SX0JPIHVzZXMKKyAqICAgIGNydGMKKyAqICAgIHdpZHRoCisgKiAgICBoZWlnaHQKKyAqICAgIGhhbmRsZSAtIGlmIDAgdHVybnMgdGhlIGN1cnNvciBvZgorICoKKyAqIENVUlNPUl9NT1ZFIHVzZXMKKyAqICAgIGNydGMKKyAqICAgIHgKKyAqICAgIHkKKyAqLworc3RydWN0IGRybV9tb2RlX2N1cnNvciB7CisJX191MzIgZmxhZ3M7CisJX191MzIgY3J0Y19pZDsKKwlfX3MzMiB4OworCV9fczMyIHk7CisJX191MzIgd2lkdGg7CisJX191MzIgaGVpZ2h0OworCS8qIGRyaXZlciBzcGVjaWZpYyBoYW5kbGUgKi8KKwlfX3UzMiBoYW5kbGU7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfY3J0Y19sdXQgeworCV9fdTMyIGNydGNfaWQ7CisJX191MzIgZ2FtbWFfc2l6ZTsKKworCS8qIHBvaW50ZXJzIHRvIGFycmF5cyAqLworCV9fdTY0IHJlZDsKKwlfX3U2NCBncmVlbjsKKwlfX3U2NCBibHVlOworfTsKKworI2RlZmluZSBEUk1fTU9ERV9QQUdFX0ZMSVBfRVZFTlQgMHgwMQorI2RlZmluZSBEUk1fTU9ERV9QQUdFX0ZMSVBfRkxBR1MgRFJNX01PREVfUEFHRV9GTElQX0VWRU5UCisKKy8qCisgKiBSZXF1ZXN0IGEgcGFnZSBmbGlwIG9uIHRoZSBzcGVjaWZpZWQgY3J0Yy4KKyAqCisgKiBUaGlzIGlvY3RsIHdpbGwgYXNrIEtNUyB0byBzY2hlZHVsZSBhIHBhZ2UgZmxpcCBmb3IgdGhlIHNwZWNpZmllZAorICogY3J0Yy4gIE9uY2UgYW55IHBlbmRpbmcgcmVuZGVyaW5nIHRhcmdldGluZyB0aGUgc3BlY2lmaWVkIGZiIChhcyBvZgorICogaW9jdGwgdGltZSkgaGFzIGNvbXBsZXRlZCwgdGhlIGNydGMgd2lsbCBiZSByZXByb2dyYW1tZWQgdG8gZGlzcGxheQorICogdGhhdCBmYiBhZnRlciB0aGUgbmV4dCB2ZXJ0aWNhbCByZWZyZXNoLiAgVGhlIGlvY3RsIHJldHVybnMKKyAqIGltbWVkaWF0ZWx5LCBidXQgc3Vic2VxdWVudCByZW5kZXJpbmcgdG8gdGhlIGN1cnJlbnQgZmIgd2lsbCBibG9jaworICogaW4gdGhlIGV4ZWNidWZmZXIgaW9jdGwgdW50aWwgdGhlIHBhZ2UgZmxpcCBoYXBwZW5zLiAgSWYgYSBwYWdlCisgKiBmbGlwIGlzIGFscmVhZHkgcGVuZGluZyBhcyB0aGUgaW9jdGwgaXMgY2FsbGVkLCBFQlVTWSB3aWxsIGJlCisgKiByZXR1cm5lZC4KKyAqCisgKiBUaGUgaW9jdGwgc3VwcG9ydHMgb25lIGZsYWcsIERSTV9NT0RFX1BBR0VfRkxJUF9FVkVOVCwgd2hpY2ggd2lsbAorICogcmVxdWVzdCB0aGF0IGRybSBzZW5kcyBiYWNrIGEgdmJsYW5rIGV2ZW50IChzZWUgZHJtLmg6IHN0cnVjdAorICogZHJtX2V2ZW50X3ZibGFuaykgd2hlbiB0aGUgcGFnZSBmbGlwIGlzIGRvbmUuICBUaGUgdXNlcl9kYXRhIGZpZWxkCisgKiBwYXNzZWQgaW4gd2l0aCB0aGlzIGlvY3RsIHdpbGwgYmUgcmV0dXJuZWQgYXMgdGhlIHVzZXJfZGF0YSBmaWVsZAorICogaW4gdGhlIHZibGFuayBldmVudCBzdHJ1Y3QuCisgKgorICogVGhlIHJlc2VydmVkIGZpZWxkIG11c3QgYmUgemVybyB1bnRpbCB3ZSBmaWd1cmUgb3V0IHNvbWV0aGluZworICogY2xldmVyIHRvIHVzZSBpdCBmb3IuCisgKi8KKworc3RydWN0IGRybV9tb2RlX2NydGNfcGFnZV9mbGlwIHsKKwlfX3UzMiBjcnRjX2lkOworCV9fdTMyIGZiX2lkOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHJlc2VydmVkOworCV9fdTY0IHVzZXJfZGF0YTsKK307CisKKy8qIGNyZWF0ZSBhIGR1bWIgc2Nhbm91dCBidWZmZXIgKi8KK3N0cnVjdCBkcm1fbW9kZV9jcmVhdGVfZHVtYiB7CisJdWludDMyX3QgaGVpZ2h0OworCXVpbnQzMl90IHdpZHRoOworCXVpbnQzMl90IGJwcDsKKwl1aW50MzJfdCBmbGFnczsKKwkvKiBoYW5kbGUsIHBpdGNoLCBzaXplIHdpbGwgYmUgcmV0dXJuZWQgKi8KKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgcGl0Y2g7CisJdWludDY0X3Qgc2l6ZTsKK307CisKKy8qIHNldCB1cCBmb3IgbW1hcCBvZiBhIGR1bWIgc2Nhbm91dCBidWZmZXIgKi8KK3N0cnVjdCBkcm1fbW9kZV9tYXBfZHVtYiB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCBiZWluZyBtYXBwZWQuICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKKwkvKioKKwkgKiBGYWtlIG9mZnNldCB0byB1c2UgZm9yIHN1YnNlcXVlbnQgbW1hcCBjYWxsCisJICoKKwkgKiBUaGlzIGlzIGEgZml4ZWQtc2l6ZSB0eXBlIGZvciAzMi82NCBjb21wYXRpYmlsaXR5LgorCSAqLworCV9fdTY0IG9mZnNldDsKK307CisKK3N0cnVjdCBkcm1fbW9kZV9kZXN0cm95X2R1bWIgeworCXVpbnQzMl90IGhhbmRsZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vZHJtX3NhcmVhLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9kcm1fc2FyZWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjU2Njg2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vZHJtX3NhcmVhLmgKQEAgLTAsMCArMSw4MiBAQAorLyoqCisgKiBcZmlsZSBkcm1fc2FyZWEuaAorICogXGJyaWVmIFNBUkVBIGRlZmluaXRpb25zCisgKgorICogXGF1dGhvciBNaWNoZWwgRMOkbnplciA8bWljaGVsQGRhZW56ZXIubmV0PgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9EUk1fU0FSRUFfSF8KKyNkZWZpbmUgX0RSTV9TQVJFQV9IXworCisjaW5jbHVkZSA8ZHJtL2RybS5oPgorCisvKiBTQVJFQSBhcmVhIG5lZWRzIHRvIGJlIGF0IGxlYXN0IGEgcGFnZSAqLworI2lmIGRlZmluZWQoX19hbHBoYV9fKQorI2RlZmluZSBTQVJFQV9NQVggICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMFUKKyNlbGlmIGRlZmluZWQoX19pYTY0X18pCisjZGVmaW5lIFNBUkVBX01BWCAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMFUJLyogNjRrQiAqLworI2Vsc2UKKy8qIEludGVsIDgzME0gZHJpdmVyIG5lZWRzIGF0IGxlYXN0IDhrIFNBUkVBICovCisjZGVmaW5lIFNBUkVBX01BWCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwVQorI2VuZGlmCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBkcmF3YWJsZXMgaW4gdGhlIFNBUkVBICovCisjZGVmaW5lIFNBUkVBX01BWF9EUkFXQUJMRVMJCTI1NgorCisjZGVmaW5lIFNBUkVBX0RSQVdBQkxFX0NMQUlNRURfRU5UUlkgICAgMHg4MDAwMDAwMAorCisvKiogU0FSRUEgZHJhd2FibGUgKi8KK3N0cnVjdCBkcm1fc2FyZWFfZHJhd2FibGUgeworCXVuc2lnbmVkIGludCBzdGFtcDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9OworCisvKiogU0FSRUEgZnJhbWUgKi8KK3N0cnVjdCBkcm1fc2FyZWFfZnJhbWUgeworCXVuc2lnbmVkIGludCB4OworCXVuc2lnbmVkIGludCB5OworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OworCXVuc2lnbmVkIGludCBmdWxsc2NyZWVuOworfTsKKworLyoqIFNBUkVBICovCitzdHJ1Y3QgZHJtX3NhcmVhIHsKKyAgICAvKiogZmlyc3QgdGhpbmcgaXMgYWx3YXlzIHRoZSBEUk0gbG9ja2luZyBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgZHJtX2h3X2xvY2sgbG9jazsKKyAgICAvKiogXHRvZG8gVXNlIHJlYWRlcnMvd3JpdGVyIGxvY2sgZm9yIGRybV9zYXJlYTo6ZHJhd2FibGVfbG9jayAqLworCXN0cnVjdCBkcm1faHdfbG9jayBkcmF3YWJsZV9sb2NrOworCXN0cnVjdCBkcm1fc2FyZWFfZHJhd2FibGUgZHJhd2FibGVUYWJsZVtTQVJFQV9NQVhfRFJBV0FCTEVTXTsJLyoqPCBkcmF3YWJsZXMgKi8KKwlzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIGZyYW1lOwkvKio8IGZyYW1lICovCisJZHJtX2NvbnRleHRfdCBkdW1teV9jb250ZXh0OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhX2RyYXdhYmxlIGRybV9zYXJlYV9kcmF3YWJsZV90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIGRybV9zYXJlYV9mcmFtZV90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhIGRybV9zYXJlYV90OworCisjZW5kaWYJCQkJLyogX0RSTV9TQVJFQV9IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vaTgxMF9kcm0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL2k4MTBfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExMGJiNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL2k4MTBfZHJtLmgKQEAgLTAsMCArMSwyODEgQEAKKyNpZm5kZWYgX0k4MTBfRFJNX0hfCisjZGVmaW5lIF9JODEwX0RSTV9IXworCisvKiBXQVJOSU5HOiBUaGVzZSBkZWZpbmVzIG11c3QgYmUgdGhlIHNhbWUgYXMgd2hhdCB0aGUgWHNlcnZlciB1c2VzLgorICogaWYgeW91IGNoYW5nZSB0aGVtLCB5b3UgbXVzdCBjaGFuZ2UgdGhlIGRlZmluZXMgaW4gdGhlIFhzZXJ2ZXIuCisgKi8KKworI2lmbmRlZiBfSTgxMF9ERUZJTkVTXworI2RlZmluZSBfSTgxMF9ERUZJTkVTXworCisjZGVmaW5lIEk4MTBfRE1BX0JVRl9PUkRFUgkJMTIKKyNkZWZpbmUgSTgxMF9ETUFfQlVGX1NaIAkJKDE8PEk4MTBfRE1BX0JVRl9PUkRFUikKKyNkZWZpbmUgSTgxMF9ETUFfQlVGX05SIAkJMjU2CisjZGVmaW5lIEk4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTIAk4CisKKy8qIEVhY2ggcmVnaW9uIGlzIGEgbWluaW11bSBvZiA2NGssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCA2NCBvZiB0aGVtLgorICovCisjZGVmaW5lIEk4MTBfTlJfVEVYX1JFR0lPTlMgNjQKKyNkZWZpbmUgSTgxMF9MT0dfTUlOX1RFWF9SRUdJT05fU0laRSAxNgorI2VuZGlmCisKKyNkZWZpbmUgSTgxMF9VUExPQURfVEVYMElNQUdFICAweDEJLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIEk4MTBfVVBMT0FEX1RFWDFJTUFHRSAgMHgyCS8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODEwX1VQTE9BRF9DVFggICAgICAgIDB4NAorI2RlZmluZSBJODEwX1VQTE9BRF9CVUZGRVJTICAgIDB4OAorI2RlZmluZSBJODEwX1VQTE9BRF9URVgwICAgICAgIDB4MTAKKyNkZWZpbmUgSTgxMF9VUExPQURfVEVYMSAgICAgICAweDIwCisjZGVmaW5lIEk4MTBfVVBMT0FEX0NMSVBSRUNUUyAgMHg0MAorCisvKiBJbmRpY2VzIGludG8gYnVmLlNldHVwIHdoZXJlIHZhcmlvdXMgYml0cyBvZiBzdGF0ZSBhcmUgbWlycm9yZWQgcGVyCisgKiBjb250ZXh0IGFuZCBwZXIgYnVmZmVyLiAgVGhlc2UgY2FuIGJlIGZpcmVkIGF0IHRoZSBjYXJkIGFzIGEgdW5pdCwKKyAqIG9yIGluIGEgcGllY2V3aXNlIGZhc2hpb24gYXMgcmVxdWlyZWQuCisgKi8KKworLyogRGVzdGJ1ZmZlciBzdGF0ZQorICogICAgLSBiYWNrYnVmZmVyIGxpbmVhciBvZmZzZXQgYW5kIHBpdGNoIC0tIGludmFyaWVudCBpbiB0aGUgY3VycmVudCBkcmkKKyAqICAgIC0gemJ1ZmZlciBsaW5lYXIgb2Zmc2V0IGFuZCBwaXRjaCAtLSBhbHNvIGludmFyaWVudAorICogICAgLSBkcmF3aW5nIG9yaWdpbiBpbiBiYWNrIGFuZCBkZXB0aCBidWZmZXJzLgorICoKKyAqIEtlZXAgdGhlIGRlcHRoL2JhY2sgYnVmZmVyIHN0YXRlIGhlcmUgdG8gYWNjb21tb2RhdGUgcHJpdmF0ZSBidWZmZXJzCisgKiBpbiB0aGUgZnV0dXJlLgorICovCisjZGVmaW5lIEk4MTBfREVTVFJFR19ESTAgIDAJLyogQ01EX09QX0RFU1RCVUZGRVJfSU5GTyAoMiBkd29yZHMpICovCisjZGVmaW5lIEk4MTBfREVTVFJFR19ESTEgIDEKKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RWMCAgMgkvKiBHRlhfT1BfREVTVEJVRkZFUl9WQVJTICgyIGR3b3JkcykgKi8KKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RWMSAgMworI2RlZmluZSBJODEwX0RFU1RSRUdfRFIwICA0CS8qIEdGWF9PUF9EUkFXUkVDVF9JTkZPICg0IGR3b3JkcykgKi8KKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RSMSAgNQorI2RlZmluZSBJODEwX0RFU1RSRUdfRFIyICA2CisjZGVmaW5lIEk4MTBfREVTVFJFR19EUjMgIDcKKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RSNCAgOAorI2RlZmluZSBJODEwX0RFU1RfU0VUVVBfU0laRSAxMAorCisvKiBDb250ZXh0IHN0YXRlCisgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfQ0YwICAgMAkvKiBHRlhfT1BfQ09MT1JfRkFDVE9SICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX0NGMSAgIDEKKyNkZWZpbmUgSTgxMF9DVFhSRUdfU1QwICAgMgkvKiBHRlhfT1BfU1RJUFBMRSAqLworI2RlZmluZSBJODEwX0NUWFJFR19TVDEgICAzCisjZGVmaW5lIEk4MTBfQ1RYUkVHX1ZGICAgIDQJLyogR0ZYX09QX1ZFUlRFWF9GTVQgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTVQgICAgNQkvKiBHRlhfT1BfTUFQX1RFWEVMUyAqLworI2RlZmluZSBJODEwX0NUWFJFR19NQzAgICA2CS8qIEdGWF9PUF9NQVBfQ09MT1JfU1RBR0VTIC0gc3RhZ2UgMCAqLworI2RlZmluZSBJODEwX0NUWFJFR19NQzEgICA3CS8qIEdGWF9PUF9NQVBfQ09MT1JfU1RBR0VTIC0gc3RhZ2UgMSAqLworI2RlZmluZSBJODEwX0NUWFJFR19NQzIgICA4CS8qIEdGWF9PUF9NQVBfQ09MT1JfU1RBR0VTIC0gc3RhZ2UgMiAqLworI2RlZmluZSBJODEwX0NUWFJFR19NQTAgICA5CS8qIEdGWF9PUF9NQVBfQUxQSEFfU1RBR0VTIC0gc3RhZ2UgMCAqLworI2RlZmluZSBJODEwX0NUWFJFR19NQTEgICAxMAkvKiBHRlhfT1BfTUFQX0FMUEhBX1NUQUdFUyAtIHN0YWdlIDEgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTUEyICAgMTEJLyogR0ZYX09QX01BUF9BTFBIQV9TVEFHRVMgLSBzdGFnZSAyICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX1NETSAgIDEyCS8qIEdGWF9PUF9TUkNfREVTVF9NT05PICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX0ZPRyAgIDEzCS8qIEdGWF9PUF9GT0dfQ09MT1IgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfQjEgICAgMTQJLyogR0ZYX09QX0JPT0xfMSAqLworI2RlZmluZSBJODEwX0NUWFJFR19CMiAgICAxNQkvKiBHRlhfT1BfQk9PTF8yICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX0xDUyAgIDE2CS8qIEdGWF9PUF9MSU5FV0lEVEhfQ1VMTF9TSEFERV9NT0RFICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX1BWICAgIDE3CS8qIEdGWF9PUF9QVl9SVUxFIC0tIEludmFyaWVudCEgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfWkEgICAgMTgJLyogR0ZYX09QX1pCSUFTX0FMUEhBRlVOQyAqLworI2RlZmluZSBJODEwX0NUWFJFR19BQSAgICAxOQkvKiBHRlhfT1BfQU5USUFMSUFTICovCisjZGVmaW5lIEk4MTBfQ1RYX1NFVFVQX1NJWkUgMjAKKworLyogVGV4dHVyZSBzdGF0ZSAocGVyIHRleCB1bml0KQorICovCisjZGVmaW5lIEk4MTBfVEVYUkVHX01JMCAgMAkvKiBHRlhfT1BfTUFQX0lORk8gKDQgZHdvcmRzKSAqLworI2RlZmluZSBJODEwX1RFWFJFR19NSTEgIDEKKyNkZWZpbmUgSTgxMF9URVhSRUdfTUkyICAyCisjZGVmaW5lIEk4MTBfVEVYUkVHX01JMyAgMworI2RlZmluZSBJODEwX1RFWFJFR19NRiAgIDQJLyogR0ZYX09QX01BUF9GSUxURVIgKi8KKyNkZWZpbmUgSTgxMF9URVhSRUdfTUxDICA1CS8qIEdGWF9PUF9NQVBfTE9EX0NUTCAqLworI2RlZmluZSBJODEwX1RFWFJFR19NTEwgIDYJLyogR0ZYX09QX01BUF9MT0RfTElNSVRTICovCisjZGVmaW5lIEk4MTBfVEVYUkVHX01DUyAgNwkvKiBHRlhfT1BfTUFQX0NPT1JEX1NFVFMgPz8/ICovCisjZGVmaW5lIEk4MTBfVEVYX1NFVFVQX1NJWkUgOAorCisvKiBGbGFncyBmb3IgY2xlYXIgaW9jdGwKKyAqLworI2RlZmluZSBJODEwX0ZST05UICAgMHgxCisjZGVmaW5lIEk4MTBfQkFDSyAgICAweDIKKyNkZWZpbmUgSTgxMF9ERVBUSCAgIDB4NAorCit0eXBlZGVmIGVudW0gX2RybV9pODEwX2luaXRfZnVuYyB7CisJSTgxMF9JTklUX0RNQSA9IDB4MDEsCisJSTgxMF9DTEVBTlVQX0RNQSA9IDB4MDIsCisJSTgxMF9JTklUX0RNQV8xXzQgPSAweDAzCit9IGRybV9pODEwX2luaXRfZnVuY190OworCisvKiBUaGlzIGlzIHRoZSBpbml0IHN0cnVjdHVyZSBhZnRlciB2MS4yICovCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfaW5pdCB7CisJZHJtX2k4MTBfaW5pdF9mdW5jX3QgZnVuYzsKKwl1bnNpZ25lZCBpbnQgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGJ1ZmZlcnNfb2Zmc2V0OworCWludCBzYXJlYV9wcml2X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmluZ19zdGFydDsKKwl1bnNpZ25lZCBpbnQgcmluZ19lbmQ7CisJdW5zaWduZWQgaW50IHJpbmdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0OworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0OworCXVuc2lnbmVkIGludCBvdmVybGF5X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgb3ZlcmxheV9waHlzaWNhbDsKKwl1bnNpZ25lZCBpbnQgdzsKKwl1bnNpZ25lZCBpbnQgaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2g7CisJdW5zaWduZWQgaW50IHBpdGNoX2JpdHM7Cit9IGRybV9pODEwX2luaXRfdDsKKworLyogVGhpcyBpcyB0aGUgaW5pdCBzdHJ1Y3R1cmUgcHJpb3IgdG8gdjEuMiAqLwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODEwX3ByZTEyX2luaXQgeworCWRybV9pODEwX2luaXRfZnVuY190IGZ1bmM7CisJdW5zaWduZWQgaW50IG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGludCBidWZmZXJzX29mZnNldDsKKwlpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJpbmdfc3RhcnQ7CisJdW5zaWduZWQgaW50IHJpbmdfZW5kOworCXVuc2lnbmVkIGludCByaW5nX3NpemU7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgdzsKKwl1bnNpZ25lZCBpbnQgaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2g7CisJdW5zaWduZWQgaW50IHBpdGNoX2JpdHM7Cit9IGRybV9pODEwX3ByZTEyX2luaXRfdDsKKworLyogV2FybmluZzogSWYgeW91IGNoYW5nZSB0aGUgU0FSRUEgc3RydWN0dXJlIHlvdSBtdXN0IGNoYW5nZSB0aGUgWHNlcnZlcgorICogc3RydWN0dXJlIGFzIHdlbGwgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODEwX3RleF9yZWdpb24geworCXVuc2lnbmVkIGNoYXIgbmV4dCwgcHJldjsJLyogaW5kaWNlcyB0byBmb3JtIGEgY2lyY3VsYXIgTFJVICAqLworCXVuc2lnbmVkIGNoYXIgaW5fdXNlOwkvKiBvd25lZCBieSBhIGNsaWVudCwgb3IgZnJlZT8gKi8KKwlpbnQgYWdlOwkJLyogdHJhY2tlZCBieSBjbGllbnRzIHRvIHVwZGF0ZSBsb2NhbCBMUlUncyAqLworfSBkcm1faTgxMF90ZXhfcmVnaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF9zYXJlYSB7CisJdW5zaWduZWQgaW50IENvbnRleHRTdGF0ZVtJODEwX0NUWF9TRVRVUF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgQnVmZmVyU3RhdGVbSTgxMF9ERVNUX1NFVFVQX1NJWkVdOworCXVuc2lnbmVkIGludCBUZXhTdGF0ZVsyXVtJODEwX1RFWF9TRVRVUF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisKKwl1bnNpZ25lZCBpbnQgbmJveDsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3hlc1tJODEwX05SX1NBUkVBX0NMSVBSRUNUU107CisKKwkvKiBNYWludGFpbiBhbiBMUlUgb2YgY29udGlndW91cyByZWdpb25zIG9mIHRleHR1cmUgc3BhY2UuICBJZgorCSAqIHlvdSB0aGluayB5b3Ugb3duIGEgcmVnaW9uIG9mIHRleHR1cmUgbWVtb3J5LCBhbmQgaXQgaGFzIGFuCisJICogYWdlIGRpZmZlcmVudCB0byB0aGUgb25lIHlvdSBzZXQsIHRoZW4geW91IGFyZSBtaXN0YWtlbiBhbmQKKwkgKiBpdCBoYXMgYmVlbiBzdG9sZW4gYnkgYW5vdGhlciBjbGllbnQuICBJZiBnbG9iYWwgdGV4QWdlCisJICogaGFzbid0IGNoYW5nZWQsIHRoZXJlIGlzIG5vIG5lZWQgdG8gd2FsayB0aGUgbGlzdC4KKwkgKgorCSAqIFRoZXNlIHJlZ2lvbnMgY2FuIGJlIHVzZWQgYXMgYSBwcm94eSBmb3IgdGhlIGZpbmUtZ3JhaW5lZAorCSAqIHRleHR1cmUgaW5mb3JtYXRpb24gb2Ygb3RoZXIgY2xpZW50cyAtIGJ5IG1haW50YWluaW5nIHRoZW0KKwkgKiBpbiB0aGUgc2FtZSBscnUgd2hpY2ggaXMgdXNlZCB0byBhZ2UgdGhlaXIgb3duIHRleHR1cmVzLAorCSAqIGNsaWVudHMgaGF2ZSBhbiBhcHByb3hpbWF0ZSBscnUgZm9yIHRoZSB3aG9sZSBvZiBnbG9iYWwKKwkgKiB0ZXh0dXJlIHNwYWNlLCBhbmQgY2FuIG1ha2UgaW5mb3JtZWQgZGVjaXNpb25zIGFzIHRvIHdoaWNoCisJICogYXJlYXMgdG8ga2ljayBvdXQuICBUaGVyZSBpcyBubyBuZWVkIHRvIGNob29zZSB3aGV0aGVyIHRvCisJICoga2ljayBvdXQgeW91ciBvd24gdGV4dHVyZSBvciBzb21lb25lIGVsc2UncyAtIHNpbXBseSBlamVjdAorCSAqIHRoZW0gYWxsIGluIExSVSBvcmRlci4KKwkgKi8KKworCWRybV9pODEwX3RleF9yZWdpb25fdCB0ZXhMaXN0W0k4MTBfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwkvKiBMYXN0IGVsdCBpcyBzZW50aW5hbCAqLworCWludCB0ZXhBZ2U7CQkvKiBsYXN0IHRpbWUgdGV4dHVyZSB3YXMgdXBsb2FkZWQgKi8KKwlpbnQgbGFzdF9lbnF1ZXVlOwkvKiBsYXN0IHRpbWUgYSBidWZmZXIgd2FzIGVucXVldWVkICovCisJaW50IGxhc3RfZGlzcGF0Y2g7CS8qIGFnZSBvZiB0aGUgbW9zdCByZWNlbnRseSBkaXNwYXRjaGVkIGJ1ZmZlciAqLworCWludCBsYXN0X3F1aWVzY2VudDsJLyogICovCisJaW50IGN0eE93bmVyOwkJLyogbGFzdCBjb250ZXh0IHRvIHVwbG9hZCBzdGF0ZSAqLworCisJaW50IHZlcnRleF9wcmltOworCisJaW50IHBmX2VuYWJsZWQ7CQkvKiBpcyBwYWdlZmxpcHBpbmcgYWxsb3dlZD8gKi8KKwlpbnQgcGZfYWN0aXZlOworCWludCBwZl9jdXJyZW50X3BhZ2U7CS8qIHdoaWNoIGJ1ZmZlciBpcyBiZWluZyBkaXNwbGF5ZWQ/ICovCit9IGRybV9pODEwX3NhcmVhX3Q7CisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYc2VydmVyIGZpbGUgKHhmODZkcm1NZ2EuaCkKKyAqLworCisvKiBpODEwIHNwZWNpZmljIGlvY3RscworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCisgKi8KKyNkZWZpbmUgRFJNX0k4MTBfSU5JVAkJMHgwMAorI2RlZmluZSBEUk1fSTgxMF9WRVJURVgJCTB4MDEKKyNkZWZpbmUgRFJNX0k4MTBfQ0xFQVIJCTB4MDIKKyNkZWZpbmUgRFJNX0k4MTBfRkxVU0gJCTB4MDMKKyNkZWZpbmUgRFJNX0k4MTBfR0VUQUdFCQkweDA0CisjZGVmaW5lIERSTV9JODEwX0dFVEJVRgkJMHgwNQorI2RlZmluZSBEUk1fSTgxMF9TV0FQCQkweDA2CisjZGVmaW5lIERSTV9JODEwX0NPUFkJCTB4MDcKKyNkZWZpbmUgRFJNX0k4MTBfRE9DT1BZCQkweDA4CisjZGVmaW5lIERSTV9JODEwX09WMElORk8JMHgwOQorI2RlZmluZSBEUk1fSTgxMF9GU1RBVFVTCTB4MGEKKyNkZWZpbmUgRFJNX0k4MTBfT1YwRkxJUAkweDBiCisjZGVmaW5lIERSTV9JODEwX01DCQkweDBjCisjZGVmaW5lIERSTV9JODEwX1JTVEFUVVMJMHgwZAorI2RlZmluZSBEUk1fSTgxMF9GTElQCQkweDBlCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfSU5JVAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX0lOSVQsIGRybV9pODEwX2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfVkVSVEVYCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfVkVSVEVYLCBkcm1faTgxMF92ZXJ0ZXhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfQ0xFQVIJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9DTEVBUiwgZHJtX2k4MTBfY2xlYXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfRkxVU0gJCURSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9GTFVTSCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfR0VUQUdFCQlEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfR0VUQUdFKQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9HRVRCVUYJCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9HRVRCVUYsIGRybV9pODEwX2RtYV90KQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9TV0FQCQlEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfU1dBUCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfQ09QWQkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX0NPUFksIGRybV9pODEwX2NvcHlfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfRE9DT1BZCQlEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfRE9DT1BZKQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9PVjBJTkZPCQlEUk1fSU9SKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfT1YwSU5GTywgZHJtX2k4MTBfb3ZlcmxheV90KQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9GU1RBVFVTCQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfRlNUQVRVUykKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfT1YwRkxJUAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX09WMEZMSVApCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX01DCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfTUMsIGRybV9pODEwX21jX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX1JTVEFUVVMJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9SU1RBVFVTKQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9GTElQICAgICAgICAgICAgIERSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9GTElQKQorCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfY2xlYXIgeworCWludCBjbGVhcl9jb2xvcjsKKwlpbnQgY2xlYXJfZGVwdGg7CisJaW50IGZsYWdzOworfSBkcm1faTgxMF9jbGVhcl90OworCisvKiBUaGVzZSBtYXkgYmUgcGxhY2Vob2xkZXJzIGlmIHdlIGhhdmUgbW9yZSBjbGlwcmVjdHMgdGhhbgorICogSTgxMF9OUl9TQVJFQV9DTElQUkVDVFMuICBJbiB0aGF0IGNhc2UsIHRoZSBjbGllbnQgc2V0cyBkaXNjYXJkIHRvCisgKiBmYWxzZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgd2lsbCBiZSBkaXNwYXRjaGVkIGFnYWluIHdpdGggYQorICogbmV3IHNldCBvZiBjbGlwcmVjdHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF92ZXJ0ZXggeworCWludCBpZHg7CQkvKiBidWZmZXIgaW5kZXggKi8KKwlpbnQgdXNlZDsJCS8qIG5yIGJ5dGVzIGluIHVzZSAqLworCWludCBkaXNjYXJkOwkJLyogY2xpZW50IGlzIGZpbmlzaGVkIHdpdGggdGhlIGJ1ZmZlcj8gKi8KK30gZHJtX2k4MTBfdmVydGV4X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF9jb3B5X3QgeworCWludCBpZHg7CQkvKiBidWZmZXIgaW5kZXggKi8KKwlpbnQgdXNlZDsJCS8qIG5yIGJ5dGVzIGluIHVzZSAqLworCXZvaWQgKmFkZHJlc3M7CQkvKiBBZGRyZXNzIHRvIGNvcHkgZnJvbSAqLworfSBkcm1faTgxMF9jb3B5X3Q7CisKKyNkZWZpbmUgUFJfVFJJQU5HTEVTICAgICAgICAgKDB4MDw8MTgpCisjZGVmaW5lIFBSX1RSSVNUUklQXzAgICAgICAgICgweDE8PDE4KQorI2RlZmluZSBQUl9UUklTVFJJUF8xICAgICAgICAoMHgyPDwxOCkKKyNkZWZpbmUgUFJfVFJJRkFOICAgICAgICAgICAgKDB4Mzw8MTgpCisjZGVmaW5lIFBSX1BPTFlHT04gICAgICAgICAgICgweDQ8PDE4KQorI2RlZmluZSBQUl9MSU5FUyAgICAgICAgICAgICAoMHg1PDwxOCkKKyNkZWZpbmUgUFJfTElORVNUUklQICAgICAgICAgKDB4Njw8MTgpCisjZGVmaW5lIFBSX1JFQ1RTICAgICAgICAgICAgICgweDc8PDE4KQorI2RlZmluZSBQUl9NQVNLICAgICAgICAgICAgICAoMHg3PDwxOCkKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MTBfZG1hIHsKKwl2b2lkICp2aXJ0dWFsOworCWludCByZXF1ZXN0X2lkeDsKKwlpbnQgcmVxdWVzdF9zaXplOworCWludCBncmFudGVkOworfSBkcm1faTgxMF9kbWFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODEwX292ZXJsYXlfdCB7CisJdW5zaWduZWQgaW50IG9mZnNldDsJLyogQWRkcmVzcyBvZiB0aGUgT3ZlcmxheSBSZWdzICovCisJdW5zaWduZWQgaW50IHBoeXNpY2FsOworfSBkcm1faTgxMF9vdmVybGF5X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF9tYyB7CisJaW50IGlkeDsJCS8qIGJ1ZmZlciBpbmRleCAqLworCWludCB1c2VkOwkJLyogbnIgYnl0ZXMgaW4gdXNlICovCisJaW50IG51bV9ibG9ja3M7CQkvKiBudW1iZXIgb2YgR0ZYQmxvY2tzICovCisJaW50ICpsZW5ndGg7CQkvKiBMaXN0IG9mIGxlbmd0aHMgZm9yIEdGWEJsb2NrcyAoRlVUVVJFKSAqLworCXVuc2lnbmVkIGludCBsYXN0X3JlbmRlcjsJLyogTGFzdCBSZW5kZXIgUmVxdWVzdCAqLworfSBkcm1faTgxMF9tY190OworCisjZW5kaWYJCQkJLyogX0k4MTBfRFJNX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9pOTE1X2RybS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vaTkxNV9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzFlOTIxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vaTkxNV9kcm0uaApAQCAtMCwwICsxLDgzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX0k5MTVfRFJNX0hfCisjZGVmaW5lIF9JOTE1X0RSTV9IXworCisjaW5jbHVkZSA8ZHJtL2RybS5oPgorCisvKiBQbGVhc2Ugbm90ZSB0aGF0IG1vZGlmaWNhdGlvbnMgdG8gYWxsIHN0cnVjdHMgZGVmaW5lZCBoZXJlIGFyZQorICogc3ViamVjdCB0byBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBjb25zdHJhaW50cy4KKyAqLworCisKKy8qIEVhY2ggcmVnaW9uIGlzIGEgbWluaW11bSBvZiAxNmssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCAyNTUgb2YgdGhlbS4KKyAqLworI2RlZmluZSBJOTE1X05SX1RFWF9SRUdJT05TIDI1NQkvKiB0YWJsZSBzaXplIDJrIC0gbWF4aW11bSBkdWUgdG8gdXNlCisJCQkJICogb2YgY2hhcnMgZm9yIG5leHQvcHJldiBpbmRpY2VzICovCisjZGVmaW5lIEk5MTVfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUgMTQKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X2luaXQgeworCWVudW0geworCQlJOTE1X0lOSVRfRE1BID0gMHgwMSwKKwkJSTkxNV9DTEVBTlVQX0RNQSA9IDB4MDIsCisJCUk5MTVfUkVTVU1FX0RNQSA9IDB4MDMKKwl9IGZ1bmM7CisJdW5zaWduZWQgaW50IG1taW9fb2Zmc2V0OworCWludCBzYXJlYV9wcml2X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmluZ19zdGFydDsKKwl1bnNpZ25lZCBpbnQgcmluZ19lbmQ7CisJdW5zaWduZWQgaW50IHJpbmdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0OworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0OworCXVuc2lnbmVkIGludCB3OworCXVuc2lnbmVkIGludCBoOworCXVuc2lnbmVkIGludCBwaXRjaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2hfYml0czsKKwl1bnNpZ25lZCBpbnQgYmFja19waXRjaDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfcGl0Y2g7CisJdW5zaWduZWQgaW50IGNwcDsKKwl1bnNpZ25lZCBpbnQgY2hpcHNldDsKK30gZHJtX2k5MTVfaW5pdF90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfc2FyZWEgeworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB0ZXhMaXN0W0k5MTVfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwlpbnQgbGFzdF91cGxvYWQ7CS8qIGxhc3QgdGltZSB0ZXh0dXJlIHdhcyB1cGxvYWRlZCAqLworCWludCBsYXN0X2VucXVldWU7CS8qIGxhc3QgdGltZSBhIGJ1ZmZlciB3YXMgZW5xdWV1ZWQgKi8KKwlpbnQgbGFzdF9kaXNwYXRjaDsJLyogYWdlIG9mIHRoZSBtb3N0IHJlY2VudGx5IGRpc3BhdGNoZWQgYnVmZmVyICovCisJaW50IGN0eE93bmVyOwkJLyogbGFzdCBjb250ZXh0IHRvIHVwbG9hZCBzdGF0ZSAqLworCWludCB0ZXhBZ2U7CisJaW50IHBmX2VuYWJsZWQ7CQkvKiBpcyBwYWdlZmxpcHBpbmcgYWxsb3dlZD8gKi8KKwlpbnQgcGZfYWN0aXZlOworCWludCBwZl9jdXJyZW50X3BhZ2U7CS8qIHdoaWNoIGJ1ZmZlciBpcyBiZWluZyBkaXNwbGF5ZWQ/ICovCisJaW50IHBlcmZfYm94ZXM7CQkvKiBwZXJmb3JtYW5jZSBib3hlcyB0byBiZSBkaXNwbGF5ZWQgKi8KKwlpbnQgd2lkdGgsIGhlaWdodDsgICAgICAvKiBzY3JlZW4gc2l6ZSBpbiBwaXhlbHMgKi8KKworCWRybV9oYW5kbGVfdCBmcm9udF9oYW5kbGU7CisJaW50IGZyb250X29mZnNldDsKKwlpbnQgZnJvbnRfc2l6ZTsKKworCWRybV9oYW5kbGVfdCBiYWNrX2hhbmRsZTsKKwlpbnQgYmFja19vZmZzZXQ7CisJaW50IGJhY2tfc2l6ZTsKKworCWRybV9oYW5kbGVfdCBkZXB0aF9oYW5kbGU7CisJaW50IGRlcHRoX29mZnNldDsKKwlpbnQgZGVwdGhfc2l6ZTsKKworCWRybV9oYW5kbGVfdCB0ZXhfaGFuZGxlOworCWludCB0ZXhfb2Zmc2V0OworCWludCB0ZXhfc2l6ZTsKKwlpbnQgbG9nX3RleF9ncmFudWxhcml0eTsKKwlpbnQgcGl0Y2g7CisJaW50IHJvdGF0aW9uOyAgICAgICAgICAgLyogMCwgOTAsIDE4MCBvciAyNzAgKi8KKwlpbnQgcm90YXRlZF9vZmZzZXQ7CisJaW50IHJvdGF0ZWRfc2l6ZTsKKwlpbnQgcm90YXRlZF9waXRjaDsKKwlpbnQgdmlydHVhbFgsIHZpcnR1YWxZOworCisJdW5zaWduZWQgaW50IGZyb250X3RpbGVkOworCXVuc2lnbmVkIGludCBiYWNrX3RpbGVkOworCXVuc2lnbmVkIGludCBkZXB0aF90aWxlZDsKKwl1bnNpZ25lZCBpbnQgcm90YXRlZF90aWxlZDsKKwl1bnNpZ25lZCBpbnQgcm90YXRlZDJfdGlsZWQ7CisKKwlpbnQgcGlwZUFfeDsKKwlpbnQgcGlwZUFfeTsKKwlpbnQgcGlwZUFfdzsKKwlpbnQgcGlwZUFfaDsKKwlpbnQgcGlwZUJfeDsKKwlpbnQgcGlwZUJfeTsKKwlpbnQgcGlwZUJfdzsKKwlpbnQgcGlwZUJfaDsKKworCS8qIGZpbGwgb3V0IHNvbWUgc3BhY2UgZm9yIG9sZCB1c2Vyc3BhY2UgdHJpcGxlIGJ1ZmZlciAqLworCWRybV9oYW5kbGVfdCB1bnVzZWRfaGFuZGxlOworCV9fdTMyIHVudXNlZDEsIHVudXNlZDIsIHVudXNlZDM7CisKKwkvKiBidWZmZXIgb2JqZWN0IGhhbmRsZXMgZm9yIHN0YXRpYyBidWZmZXJzLiBNYXkgY2hhbmdlCisJICogb3ZlciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNsaWVudC4KKwkgKi8KKwlfX3UzMiBmcm9udF9ib19oYW5kbGU7CisJX191MzIgYmFja19ib19oYW5kbGU7CisJX191MzIgdW51c2VkX2JvX2hhbmRsZTsKKwlfX3UzMiBkZXB0aF9ib19oYW5kbGU7CisKK30gZHJtX2k5MTVfc2FyZWFfdDsKKworLyogZHVlIHRvIHVzZXJzcGFjZSBidWlsZGluZyBhZ2FpbnN0IHRoZXNlIGhlYWRlcnMgd2UgbmVlZCBzb21lIGNvbXBhdCBoZXJlICovCisjZGVmaW5lIHBsYW5lQV94IHBpcGVBX3gKKyNkZWZpbmUgcGxhbmVBX3kgcGlwZUFfeQorI2RlZmluZSBwbGFuZUFfdyBwaXBlQV93CisjZGVmaW5lIHBsYW5lQV9oIHBpcGVBX2gKKyNkZWZpbmUgcGxhbmVCX3ggcGlwZUJfeAorI2RlZmluZSBwbGFuZUJfeSBwaXBlQl95CisjZGVmaW5lIHBsYW5lQl93IHBpcGVCX3cKKyNkZWZpbmUgcGxhbmVCX2ggcGlwZUJfaAorCisvKiBGbGFncyBmb3IgcGVyZl9ib3hlcworICovCisjZGVmaW5lIEk5MTVfQk9YX1JJTkdfRU1QVFkgICAgMHgxCisjZGVmaW5lIEk5MTVfQk9YX0ZMSVAgICAgICAgICAgMHgyCisjZGVmaW5lIEk5MTVfQk9YX1dBSVQgICAgICAgICAgMHg0CisjZGVmaW5lIEk5MTVfQk9YX1RFWFRVUkVfTE9BRCAgMHg4CisjZGVmaW5lIEk5MTVfQk9YX0xPU1RfQ09OVEVYVCAgMHgxMAorCisvKiBJOTE1IHNwZWNpZmljIGlvY3RscworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCisgKi8KKyNkZWZpbmUgRFJNX0k5MTVfSU5JVAkJMHgwMAorI2RlZmluZSBEUk1fSTkxNV9GTFVTSAkJMHgwMQorI2RlZmluZSBEUk1fSTkxNV9GTElQCQkweDAyCisjZGVmaW5lIERSTV9JOTE1X0JBVENIQlVGRkVSCTB4MDMKKyNkZWZpbmUgRFJNX0k5MTVfSVJRX0VNSVQJMHgwNAorI2RlZmluZSBEUk1fSTkxNV9JUlFfV0FJVAkweDA1CisjZGVmaW5lIERSTV9JOTE1X0dFVFBBUkFNCTB4MDYKKyNkZWZpbmUgRFJNX0k5MTVfU0VUUEFSQU0JMHgwNworI2RlZmluZSBEUk1fSTkxNV9BTExPQwkJMHgwOAorI2RlZmluZSBEUk1fSTkxNV9GUkVFCQkweDA5CisjZGVmaW5lIERSTV9JOTE1X0lOSVRfSEVBUAkweDBhCisjZGVmaW5lIERSTV9JOTE1X0NNREJVRkZFUgkweDBiCisjZGVmaW5lIERSTV9JOTE1X0RFU1RST1lfSEVBUAkweDBjCisjZGVmaW5lIERSTV9JOTE1X1NFVF9WQkxBTktfUElQRQkweDBkCisjZGVmaW5lIERSTV9JOTE1X0dFVF9WQkxBTktfUElQRQkweDBlCisjZGVmaW5lIERSTV9JOTE1X1ZCTEFOS19TV0FQCTB4MGYKKyNkZWZpbmUgRFJNX0k5MTVfSFdTX0FERFIJMHgxMQorI2RlZmluZSBEUk1fSTkxNV9HRU1fSU5JVAkweDEzCisjZGVmaW5lIERSTV9JOTE1X0dFTV9FWEVDQlVGRkVSCTB4MTQKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX1BJTgkweDE1CisjZGVmaW5lIERSTV9JOTE1X0dFTV9VTlBJTgkweDE2CisjZGVmaW5lIERSTV9JOTE1X0dFTV9CVVNZCTB4MTcKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX1RIUk9UVExFCTB4MTgKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0VOVEVSVlQJMHgxOQorI2RlZmluZSBEUk1fSTkxNV9HRU1fTEVBVkVWVAkweDFhCisjZGVmaW5lIERSTV9JOTE1X0dFTV9DUkVBVEUJMHgxYgorI2RlZmluZSBEUk1fSTkxNV9HRU1fUFJFQUQJMHgxYworI2RlZmluZSBEUk1fSTkxNV9HRU1fUFdSSVRFCTB4MWQKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX01NQVAJMHgxZQorI2RlZmluZSBEUk1fSTkxNV9HRU1fU0VUX0RPTUFJTgkweDFmCisjZGVmaW5lIERSTV9JOTE1X0dFTV9TV19GSU5JU0gJMHgyMAorI2RlZmluZSBEUk1fSTkxNV9HRU1fU0VUX1RJTElORwkweDIxCisjZGVmaW5lIERSTV9JOTE1X0dFTV9HRVRfVElMSU5HCTB4MjIKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0dFVF9BUEVSVFVSRSAweDIzCisjZGVmaW5lIERSTV9JOTE1X0dFTV9NTUFQX0dUVAkweDI0CisjZGVmaW5lIERSTV9JOTE1X0dFVF9QSVBFX0ZST01fQ1JUQ19JRAkweDI1CisjZGVmaW5lIERSTV9JOTE1X0dFTV9NQURWSVNFCTB4MjYKKyNkZWZpbmUgRFJNX0k5MTVfT1ZFUkxBWV9QVVRfSU1BR0UJMHgyNworI2RlZmluZSBEUk1fSTkxNV9PVkVSTEFZX0FUVFJTCTB4MjgKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0VYRUNCVUZGRVIyCTB4MjkKKworI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JTklUCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSU5JVCwgZHJtX2k5MTVfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GTFVTSAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0ZMVVNIKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GTElQCQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfRkxJUCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfQkFUQ0hCVUZGRVIJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0JBVENIQlVGRkVSLCBkcm1faTkxNV9iYXRjaGJ1ZmZlcl90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JUlFfRU1JVCAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9JUlFfRU1JVCwgZHJtX2k5MTVfaXJxX2VtaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSVJRX1dBSVQgICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSVJRX1dBSVQsIGRybV9pOTE1X2lycV93YWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFVFBBUkFNLCBkcm1faTkxNV9nZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9TRVRQQVJBTSAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9TRVRQQVJBTSwgZHJtX2k5MTVfc2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfQUxMT0MgICAgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfQUxMT0MsIGRybV9pOTE1X21lbV9hbGxvY190KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GUkVFICAgICAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9GUkVFLCBkcm1faTkxNV9tZW1fZnJlZV90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JTklUX0hFQVAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9JTklUX0hFQVAsIGRybV9pOTE1X21lbV9pbml0X2hlYXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfQ01EQlVGRkVSCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9DTURCVUZGRVIsIGRybV9pOTE1X2NtZGJ1ZmZlcl90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9ERVNUUk9ZX0hFQVAJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0RFU1RST1lfSEVBUCwgZHJtX2k5MTVfbWVtX2Rlc3Ryb3lfaGVhcF90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9TRVRfVkJMQU5LX1BJUEUJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X1NFVF9WQkxBTktfUElQRSwgZHJtX2k5MTVfdmJsYW5rX3BpcGVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VUX1ZCTEFOS19QSVBFCURSTV9JT1IoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRVRfVkJMQU5LX1BJUEUsIGRybV9pOTE1X3ZibGFua19waXBlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X1ZCTEFOS19TV0FQCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9WQkxBTktfU1dBUCwgZHJtX2k5MTVfdmJsYW5rX3N3YXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSFdTX0FERFIJCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0hXU19BRERSLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2luaXQpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9JTklUCQlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fSU5JVCwgc3RydWN0IGRybV9pOTE1X2dlbV9pbml0KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUglEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fRVhFQ0JVRkZFUiwgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0VYRUNCVUZGRVIyLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fUElOCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1BJTiwgc3RydWN0IGRybV9pOTE1X2dlbV9waW4pCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9VTlBJTglEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fVU5QSU4sIHN0cnVjdCBkcm1faTkxNV9nZW1fdW5waW4pCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9CVVNZCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0JVU1ksIHN0cnVjdCBkcm1faTkxNV9nZW1fYnVzeSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1RIUk9UVExFCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fVEhST1RUTEUpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9FTlRFUlZUCURSTV9JTyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0VOVEVSVlQpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9MRUFWRVZUCURSTV9JTyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0xFQVZFVlQpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9DUkVBVEUJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9DUkVBVEUsIHN0cnVjdCBkcm1faTkxNV9nZW1fY3JlYXRlKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fUFJFQUQJRFJNX0lPVyAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9QUkVBRCwgc3RydWN0IGRybV9pOTE1X2dlbV9wcmVhZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1BXUklURQlEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1BXUklURSwgc3RydWN0IGRybV9pOTE1X2dlbV9wd3JpdGUpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9NTUFQCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX01NQVAsIHN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX01NQVBfR1RUCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fTU1BUF9HVFQsIHN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcF9ndHQpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9TRVRfRE9NQUlOCURSTV9JT1cgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fU0VUX0RPTUFJTiwgc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfZG9tYWluKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fU1dfRklOSVNICURSTV9JT1cgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fU1dfRklOSVNILCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3N3X2ZpbmlzaCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1NFVF9USUxJTkcJRFJNX0lPV1IgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fU0VUX1RJTElORywgc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfdGlsaW5nKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fR0VUX1RJTElORwlEUk1fSU9XUiAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9HRVRfVElMSU5HLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2dldF90aWxpbmcpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9HRVRfQVBFUlRVUkUJRFJNX0lPUiAgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fR0VUX0FQRVJUVVJFLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2dldF9hcGVydHVyZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VUX1BJUEVfRlJPTV9DUlRDX0lEIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRVRfUElQRV9GUk9NX0NSVENfSUQsIHN0cnVjdCBkcm1faTkxNV9nZXRfcGlwZV9mcm9tX2NydGNfaWQpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9NQURWSVNFCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fTUFEVklTRSwgc3RydWN0IGRybV9pOTE1X2dlbV9tYWR2aXNlKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9PVkVSTEFZX1BVVF9JTUFHRQlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9PVkVSTEFZX1BVVF9JTUFHRSwgc3RydWN0IGRybV9pbnRlbF9vdmVybGF5X3B1dF9pbWFnZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfT1ZFUkxBWV9BVFRSUwlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfT1ZFUkxBWV9BVFRSUywgc3RydWN0IGRybV9pbnRlbF9vdmVybGF5X2F0dHJzKQorCisvKiBBbGxvdyBkcml2ZXJzIHRvIHN1Ym1pdCBiYXRjaGJ1ZmZlcnMgZGlyZWN0bHkgdG8gaGFyZHdhcmUsIHJlbHlpbmcKKyAqIG9uIHRoZSBzZWN1cml0eSBtZWNoYW5pc21zIHByb3ZpZGVkIGJ5IGhhcmR3YXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9iYXRjaGJ1ZmZlciB7CisJaW50IHN0YXJ0OwkJLyogYWdwIG9mZnNldCAqLworCWludCB1c2VkOwkJLyogbnIgYnl0ZXMgaW4gdXNlICovCisJaW50IERSMTsJCS8qIGh3IGZsYWdzIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLworCWludCBEUjQ7CQkvKiB3aW5kb3cgb3JpZ2luIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLworCWludCBudW1fY2xpcHJlY3RzOwkvKiBtdWxpdHBhc3Mgd2l0aCBtdWx0aXBsZSBjbGlwcmVjdHM/ICovCisJc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXByZWN0czsJLyogcG9pbnRlciB0byB1c2Vyc3BhY2UgY2xpcHJlY3RzICovCit9IGRybV9pOTE1X2JhdGNoYnVmZmVyX3Q7CisKKy8qIEFzIGFib3ZlLCBidXQgcGFzcyBhIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGJ1ZmZlciB3aGljaCBjYW4gYmUKKyAqIHZhbGlkYXRlZCBieSB0aGUga2VybmVsIHByaW9yIHRvIHNlbmRpbmcgdG8gaGFyZHdhcmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9jbWRidWZmZXIgeworCWNoYXIgKmJ1ZjsJLyogcG9pbnRlciB0byB1c2Vyc3BhY2UgY29tbWFuZCBidWZmZXIgKi8KKwlpbnQgc3o7CQkJLyogbnIgYnl0ZXMgaW4gYnVmICovCisJaW50IERSMTsJCS8qIGh3IGZsYWdzIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLworCWludCBEUjQ7CQkvKiB3aW5kb3cgb3JpZ2luIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLworCWludCBudW1fY2xpcHJlY3RzOwkvKiBtdWxpdHBhc3Mgd2l0aCBtdWx0aXBsZSBjbGlwcmVjdHM/ICovCisJc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXByZWN0czsJLyogcG9pbnRlciB0byB1c2Vyc3BhY2UgY2xpcHJlY3RzICovCit9IGRybV9pOTE1X2NtZGJ1ZmZlcl90OworCisvKiBVc2Vyc3BhY2UgY2FuIHJlcXVlc3QgJiB3YWl0IG9uIGlycSdzOgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9pcnFfZW1pdCB7CisJaW50ICppcnFfc2VxOworfSBkcm1faTkxNV9pcnFfZW1pdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9pcnFfd2FpdCB7CisJaW50IGlycV9zZXE7Cit9IGRybV9pOTE1X2lycV93YWl0X3Q7CisKKy8qIElvY3RsIHRvIHF1ZXJ5IGtlcm5lbCBwYXJhbXM6CisgKi8KKyNkZWZpbmUgSTkxNV9QQVJBTV9JUlFfQUNUSVZFICAgICAgICAgICAgMQorI2RlZmluZSBJOTE1X1BBUkFNX0FMTE9XX0JBVENIQlVGRkVSICAgICAyCisjZGVmaW5lIEk5MTVfUEFSQU1fTEFTVF9ESVNQQVRDSCAgICAgICAgIDMKKyNkZWZpbmUgSTkxNV9QQVJBTV9DSElQU0VUX0lEICAgICAgICAgICAgNAorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19HRU0gICAgICAgICAgICAgICA1CisjZGVmaW5lIEk5MTVfUEFSQU1fTlVNX0ZFTkNFU19BVkFJTCAgICAgIDYKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfT1ZFUkxBWSAgICAgICAgICAgNworI2RlZmluZSBJOTE1X1BBUkFNX0hBU19QQUdFRkxJUFBJTkcJIDgKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfRVhFQ0JVRjIgICAgICAgICAgOQorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19CU0QJCSAxMAorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19CTFQJCSAxMQorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19SRUxBWEVEX0ZFTkNJTkcJIDEyCisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0NPSEVSRU5UX1JJTkdTCSAxMworI2RlZmluZSBJOTE1X1BBUkFNX0hBU19FWEVDX0NPTlNUQU5UUwkgMTQKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfUkVMQVhFRF9ERUxUQQkgMTUKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfZ2V0cGFyYW0geworCWludCBwYXJhbTsKKwlpbnQgKnZhbHVlOworfSBkcm1faTkxNV9nZXRwYXJhbV90OworCisvKiBJb2N0bCB0byBzZXQga2VybmVsIHBhcmFtczoKKyAqLworI2RlZmluZSBJOTE1X1NFVFBBUkFNX1VTRV9NSV9CQVRDSEJVRkZFUl9TVEFSVCAgICAgICAgICAgIDEKKyNkZWZpbmUgSTkxNV9TRVRQQVJBTV9URVhfTFJVX0xPR19HUkFOVUxBUklUWSAgICAgICAgICAgICAyCisjZGVmaW5lIEk5MTVfU0VUUEFSQU1fQUxMT1dfQkFUQ0hCVUZGRVIgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBJOTE1X1NFVFBBUkFNX05VTV9VU0VEX0ZFTkNFUyAgICAgICAgICAgICAgICAgICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfc2V0cGFyYW0geworCWludCBwYXJhbTsKKwlpbnQgdmFsdWU7Cit9IGRybV9pOTE1X3NldHBhcmFtX3Q7CisKKy8qIEEgbWVtb3J5IG1hbmFnZXIgZm9yIHJlZ2lvbnMgb2Ygc2hhcmVkIG1lbW9yeToKKyAqLworI2RlZmluZSBJOTE1X01FTV9SRUdJT05fQUdQIDEKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfbWVtX2FsbG9jIHsKKwlpbnQgcmVnaW9uOworCWludCBhbGlnbm1lbnQ7CisJaW50IHNpemU7CisJaW50ICpyZWdpb25fb2Zmc2V0OwkvKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBmYiBvciBhZ3AgKi8KK30gZHJtX2k5MTVfbWVtX2FsbG9jX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X21lbV9mcmVlIHsKKwlpbnQgcmVnaW9uOworCWludCByZWdpb25fb2Zmc2V0OworfSBkcm1faTkxNV9tZW1fZnJlZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9tZW1faW5pdF9oZWFwIHsKKwlpbnQgcmVnaW9uOworCWludCBzaXplOworCWludCBzdGFydDsKK30gZHJtX2k5MTVfbWVtX2luaXRfaGVhcF90OworCisvKiBBbGxvdyBtZW1vcnkgbWFuYWdlciB0byBiZSB0b3JuIGRvd24gYW5kIHJlLWluaXRpYWxpemVkIChlZyBvbgorICogcm90YXRlKToKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfbWVtX2Rlc3Ryb3lfaGVhcCB7CisJaW50IHJlZ2lvbjsKK30gZHJtX2k5MTVfbWVtX2Rlc3Ryb3lfaGVhcF90OworCisvKiBBbGxvdyBYIHNlcnZlciB0byBjb25maWd1cmUgd2hpY2ggcGlwZXMgdG8gbW9uaXRvciBmb3IgdmJsYW5rIHNpZ25hbHMKKyAqLworI2RlZmluZQlEUk1fSTkxNV9WQkxBTktfUElQRV9BCTEKKyNkZWZpbmUJRFJNX0k5MTVfVkJMQU5LX1BJUEVfQgkyCisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X3ZibGFua19waXBlIHsKKwlpbnQgcGlwZTsKK30gZHJtX2k5MTVfdmJsYW5rX3BpcGVfdDsKKworLyogU2NoZWR1bGUgYnVmZmVyIHN3YXAgYXQgZ2l2ZW4gdmVydGljYWwgYmxhbms6CisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X3ZibGFua19zd2FwIHsKKwlkcm1fZHJhd2FibGVfdCBkcmF3YWJsZTsKKwllbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgc2VxdHlwZTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7Cit9IGRybV9pOTE1X3ZibGFua19zd2FwX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X2h3c19hZGRyIHsKKwlfX3U2NCBhZGRyOworfSBkcm1faTkxNV9od3NfYWRkcl90OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2luaXQgeworCS8qKgorCSAqIEJlZ2lubmluZyBvZmZzZXQgaW4gdGhlIEdUVCB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBEUk0gbWVtb3J5CisJICogbWFuYWdlci4KKwkgKi8KKwlfX3U2NCBndHRfc3RhcnQ7CisJLyoqCisJICogRW5kaW5nIG9mZnNldCBpbiB0aGUgR1RUIHRvIGJlIG1hbmFnZWQgYnkgdGhlIERSTSBtZW1vcnkKKwkgKiBtYW5hZ2VyLgorCSAqLworCV9fdTY0IGd0dF9lbmQ7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NyZWF0ZSB7CisJLyoqCisJICogUmVxdWVzdGVkIHNpemUgZm9yIHRoZSBvYmplY3QuCisJICoKKwkgKiBUaGUgKHBhZ2UtYWxpZ25lZCkgYWxsb2NhdGVkIHNpemUgZm9yIHRoZSBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4KKwkgKi8KKwlfX3U2NCBzaXplOworCS8qKgorCSAqIFJldHVybmVkIGhhbmRsZSBmb3IgdGhlIG9iamVjdC4KKwkgKgorCSAqIE9iamVjdCBoYW5kbGVzIGFyZSBub256ZXJvLgorCSAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3ByZWFkIHsKKwkvKiogSGFuZGxlIGZvciB0aGUgb2JqZWN0IGJlaW5nIHJlYWQuICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKKwkvKiogT2Zmc2V0IGludG8gdGhlIG9iamVjdCB0byByZWFkIGZyb20gKi8KKwlfX3U2NCBvZmZzZXQ7CisJLyoqIExlbmd0aCBvZiBkYXRhIHRvIHJlYWQgKi8KKwlfX3U2NCBzaXplOworCS8qKgorCSAqIFBvaW50ZXIgdG8gd3JpdGUgdGhlIGRhdGEgaW50by4KKwkgKgorCSAqIFRoaXMgaXMgYSBmaXhlZC1zaXplIHR5cGUgZm9yIDMyLzY0IGNvbXBhdGliaWxpdHkuCisJICovCisJX191NjQgZGF0YV9wdHI7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCBiZWluZyB3cml0dGVuIHRvLiAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7CisJLyoqIE9mZnNldCBpbnRvIHRoZSBvYmplY3QgdG8gd3JpdGUgdG8gKi8KKwlfX3U2NCBvZmZzZXQ7CisJLyoqIExlbmd0aCBvZiBkYXRhIHRvIHdyaXRlICovCisJX191NjQgc2l6ZTsKKwkvKioKKwkgKiBQb2ludGVyIHRvIHJlYWQgdGhlIGRhdGEgZnJvbS4KKwkgKgorCSAqIFRoaXMgaXMgYSBmaXhlZC1zaXplIHR5cGUgZm9yIDMyLzY0IGNvbXBhdGliaWxpdHkuCisJICovCisJX191NjQgZGF0YV9wdHI7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXAgeworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgYmVpbmcgbWFwcGVkLiAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7CisJLyoqIE9mZnNldCBpbiB0aGUgb2JqZWN0IHRvIG1hcC4gKi8KKwlfX3U2NCBvZmZzZXQ7CisJLyoqCisJICogTGVuZ3RoIG9mIGRhdGEgdG8gbWFwLgorCSAqCisJICogVGhlIHZhbHVlIHdpbGwgYmUgcGFnZS1hbGlnbmVkLgorCSAqLworCV9fdTY0IHNpemU7CisJLyoqCisJICogUmV0dXJuZWQgcG9pbnRlciB0aGUgZGF0YSB3YXMgbWFwcGVkIGF0LgorCSAqCisJICogVGhpcyBpcyBhIGZpeGVkLXNpemUgdHlwZSBmb3IgMzIvNjQgY29tcGF0aWJpbGl0eS4KKwkgKi8KKwlfX3U2NCBhZGRyX3B0cjsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fbW1hcF9ndHQgeworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgYmVpbmcgbWFwcGVkLiAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7CisJLyoqCisJICogRmFrZSBvZmZzZXQgdG8gdXNlIGZvciBzdWJzZXF1ZW50IG1tYXAgY2FsbAorCSAqCisJICogVGhpcyBpcyBhIGZpeGVkLXNpemUgdHlwZSBmb3IgMzIvNjQgY29tcGF0aWJpbGl0eS4KKwkgKi8KKwlfX3U2NCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF9kb21haW4geworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKiogTmV3IHJlYWQgZG9tYWlucyAqLworCV9fdTMyIHJlYWRfZG9tYWluczsKKworCS8qKiBOZXcgd3JpdGUgZG9tYWluICovCisJX191MzIgd3JpdGVfZG9tYWluOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9zd19maW5pc2ggeworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgKi8KKwlfX3UzMiBoYW5kbGU7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgeworCS8qKgorCSAqIEhhbmRsZSBvZiB0aGUgYnVmZmVyIGJlaW5nIHBvaW50ZWQgdG8gYnkgdGhpcyByZWxvY2F0aW9uIGVudHJ5LgorCSAqCisJICogSXQncyBhcHBlYWxpbmcgdG8gbWFrZSB0aGlzIGJlIGFuIGluZGV4IGludG8gdGhlIG1tX3ZhbGlkYXRlX2VudHJ5CisJICogbGlzdCB0byByZWZlciB0byB0aGUgYnVmZmVyLCBidXQgdGhpcyBhbGxvd3MgdGhlIGRyaXZlciB0byBjcmVhdGUKKwkgKiBhIHJlbG9jYXRpb24gbGlzdCBmb3Igc3RhdGUgYnVmZmVycyBhbmQgbm90IHJlLXdyaXRlIGl0IHBlcgorCSAqIGV4ZWMgdXNpbmcgdGhlIGJ1ZmZlci4KKwkgKi8KKwlfX3UzMiB0YXJnZXRfaGFuZGxlOworCisJLyoqCisJICogVmFsdWUgdG8gYmUgYWRkZWQgdG8gdGhlIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGJ1ZmZlciB0byBtYWtlIHVwCisJICogdGhlIHJlbG9jYXRpb24gZW50cnkuCisJICovCisJX191MzIgZGVsdGE7CisKKwkvKiogT2Zmc2V0IGluIHRoZSBidWZmZXIgdGhlIHJlbG9jYXRpb24gZW50cnkgd2lsbCBiZSB3cml0dGVuIGludG8gKi8KKwlfX3U2NCBvZmZzZXQ7CisKKwkvKioKKwkgKiBPZmZzZXQgdmFsdWUgb2YgdGhlIHRhcmdldCBidWZmZXIgdGhhdCB0aGUgcmVsb2NhdGlvbiBlbnRyeSB3YXMgbGFzdAorCSAqIHdyaXR0ZW4gYXMuCisJICoKKwkgKiBJZiB0aGUgYnVmZmVyIGhhcyB0aGUgc2FtZSBvZmZzZXQgYXMgbGFzdCB0aW1lLCB3ZSBjYW4gc2tpcCBzeW5jaW5nCisJICogYW5kIHdyaXRpbmcgdGhlIHJlbG9jYXRpb24uICBUaGlzIHZhbHVlIGlzIHdyaXR0ZW4gYmFjayBvdXQgYnkKKwkgKiB0aGUgZXhlY2J1ZmZlciBpb2N0bCB3aGVuIHRoZSByZWxvY2F0aW9uIGlzIHdyaXR0ZW4uCisJICovCisJX191NjQgcHJlc3VtZWRfb2Zmc2V0OworCisJLyoqCisJICogVGFyZ2V0IG1lbW9yeSBkb21haW5zIHJlYWQgYnkgdGhpcyBvcGVyYXRpb24uCisJICovCisJX191MzIgcmVhZF9kb21haW5zOworCisJLyoqCisJICogVGFyZ2V0IG1lbW9yeSBkb21haW5zIHdyaXR0ZW4gYnkgdGhpcyBvcGVyYXRpb24uCisJICoKKwkgKiBOb3RlIHRoYXQgb25seSBvbmUgZG9tYWluIG1heSBiZSB3cml0dGVuIGJ5IHRoZSB3aG9sZQorCSAqIGV4ZWNidWZmZXIgb3BlcmF0aW9uLCBzbyB0aGF0IHdoZXJlIHRoZXJlIGFyZSBjb25mbGljdHMsCisJICogdGhlIGFwcGxpY2F0aW9uIHdpbGwgZ2V0IC1FSU5WQUwgYmFjay4KKwkgKi8KKwlfX3UzMiB3cml0ZV9kb21haW47Cit9OworCisvKiogQHsKKyAqIEludGVsIG1lbW9yeSBkb21haW5zCisgKgorICogTW9zdCBvZiB0aGVzZSBqdXN0IGFsaWduIHdpdGggdGhlIHZhcmlvdXMgY2FjaGVzIGluCisgKiB0aGUgc3lzdGVtIGFuZCBhcmUgdXNlZCB0byBmbHVzaCBhbmQgaW52YWxpZGF0ZSBhcworICogb2JqZWN0cyBlbmQgdXAgY2FjaGVkIGluIGRpZmZlcmVudCBkb21haW5zLgorICovCisvKiogQ1BVIGNhY2hlICovCisjZGVmaW5lIEk5MTVfR0VNX0RPTUFJTl9DUFUJCTB4MDAwMDAwMDEKKy8qKiBSZW5kZXIgY2FjaGUsIHVzZWQgYnkgMkQgYW5kIDNEIGRyYXdpbmcgKi8KKyNkZWZpbmUgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUgkJMHgwMDAwMDAwMgorLyoqIFNhbXBsZXIgY2FjaGUsIHVzZWQgYnkgdGV4dHVyZSBlbmdpbmUgKi8KKyNkZWZpbmUgSTkxNV9HRU1fRE9NQUlOX1NBTVBMRVIJCTB4MDAwMDAwMDQKKy8qKiBDb21tYW5kIHF1ZXVlLCB1c2VkIHRvIGxvYWQgYmF0Y2ggYnVmZmVycyAqLworI2RlZmluZSBJOTE1X0dFTV9ET01BSU5fQ09NTUFORAkJMHgwMDAwMDAwOAorLyoqIEluc3RydWN0aW9uIGNhY2hlLCB1c2VkIGJ5IHNoYWRlciBwcm9ncmFtcyAqLworI2RlZmluZSBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04JMHgwMDAwMDAxMAorLyoqIFZlcnRleCBhZGRyZXNzIGNhY2hlICovCisjZGVmaW5lIEk5MTVfR0VNX0RPTUFJTl9WRVJURVgJCTB4MDAwMDAwMjAKKy8qKiBHVFQgZG9tYWluIC0gYXBlcnR1cmUgYW5kIHNjYW5vdXQgKi8KKyNkZWZpbmUgSTkxNV9HRU1fRE9NQUlOX0dUVAkJMHgwMDAwMDA0MAorLyoqIEB9ICovCisKK3N0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QgeworCS8qKgorCSAqIFVzZXIncyBoYW5kbGUgZm9yIGEgYnVmZmVyIHRvIGJlIGJvdW5kIGludG8gdGhlIEdUVCBmb3IgdGhpcworCSAqIG9wZXJhdGlvbi4KKwkgKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKiogTnVtYmVyIG9mIHJlbG9jYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGlzIGJ1ZmZlciAqLworCV9fdTMyIHJlbG9jYXRpb25fY291bnQ7CisJLyoqCisJICogUG9pbnRlciB0byBhcnJheSBvZiBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgY29udGFpbmluZworCSAqIHRoZSByZWxvY2F0aW9ucyB0byBiZSBwZXJmb3JtZWQgaW4gdGhpcyBidWZmZXIuCisJICovCisJX191NjQgcmVsb2NzX3B0cjsKKworCS8qKiBSZXF1aXJlZCBhbGlnbm1lbnQgaW4gZ3JhcGhpY3MgYXBlcnR1cmUgKi8KKwlfX3U2NCBhbGlnbm1lbnQ7CisKKwkvKioKKwkgKiBSZXR1cm5lZCB2YWx1ZSBvZiB0aGUgdXBkYXRlZCBvZmZzZXQgb2YgdGhlIG9iamVjdCwgZm9yIGZ1dHVyZQorCSAqIHByZXN1bWVkX29mZnNldCB3cml0ZXMuCisJICovCisJX191NjQgb2Zmc2V0OworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyIHsKKwkvKioKKwkgKiBMaXN0IG9mIGJ1ZmZlcnMgdG8gYmUgdmFsaWRhdGVkIHdpdGggdGhlaXIgcmVsb2NhdGlvbnMgdG8gYmUKKwkgKiBwZXJmb3JtZW5kIG9uIHRoZW0uCisJICoKKwkgKiBUaGlzIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3ZhbGlkYXRlX2VudHJ5LgorCSAqCisJICogVGhlc2UgYnVmZmVycyBtdXN0IGJlIGxpc3RlZCBpbiBhbiBvcmRlciBzdWNoIHRoYXQgYWxsIHJlbG9jYXRpb25zCisJICogYSBidWZmZXIgaXMgcGVyZm9ybWluZyByZWZlciB0byBidWZmZXJzIHRoYXQgaGF2ZSBhbHJlYWR5IGFwcGVhcmVkCisJICogaW4gdGhlIHZhbGlkYXRlIGxpc3QuCisJICovCisJX191NjQgYnVmZmVyc19wdHI7CisJX191MzIgYnVmZmVyX2NvdW50OworCisJLyoqIE9mZnNldCBpbiB0aGUgYmF0Y2hidWZmZXIgdG8gc3RhcnQgZXhlY3V0aW9uIGZyb20uICovCisJX191MzIgYmF0Y2hfc3RhcnRfb2Zmc2V0OworCS8qKiBCeXRlcyB1c2VkIGluIGJhdGNoYnVmZmVyIGZyb20gYmF0Y2hfc3RhcnRfb2Zmc2V0ICovCisJX191MzIgYmF0Y2hfbGVuOworCV9fdTMyIERSMTsKKwlfX3UzMiBEUjQ7CisJX191MzIgbnVtX2NsaXByZWN0czsKKwkvKiogVGhpcyBpcyBhIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHMgKi8KKwlfX3U2NCBjbGlwcmVjdHNfcHRyOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgeworCS8qKgorCSAqIFVzZXIncyBoYW5kbGUgZm9yIGEgYnVmZmVyIHRvIGJlIGJvdW5kIGludG8gdGhlIEdUVCBmb3IgdGhpcworCSAqIG9wZXJhdGlvbi4KKwkgKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKiogTnVtYmVyIG9mIHJlbG9jYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGlzIGJ1ZmZlciAqLworCV9fdTMyIHJlbG9jYXRpb25fY291bnQ7CisJLyoqCisJICogUG9pbnRlciB0byBhcnJheSBvZiBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgY29udGFpbmluZworCSAqIHRoZSByZWxvY2F0aW9ucyB0byBiZSBwZXJmb3JtZWQgaW4gdGhpcyBidWZmZXIuCisJICovCisJX191NjQgcmVsb2NzX3B0cjsKKworCS8qKiBSZXF1aXJlZCBhbGlnbm1lbnQgaW4gZ3JhcGhpY3MgYXBlcnR1cmUgKi8KKwlfX3U2NCBhbGlnbm1lbnQ7CisKKwkvKioKKwkgKiBSZXR1cm5lZCB2YWx1ZSBvZiB0aGUgdXBkYXRlZCBvZmZzZXQgb2YgdGhlIG9iamVjdCwgZm9yIGZ1dHVyZQorCSAqIHByZXN1bWVkX29mZnNldCB3cml0ZXMuCisJICovCisJX191NjQgb2Zmc2V0OworCisjZGVmaW5lIEVYRUNfT0JKRUNUX05FRURTX0ZFTkNFICgxPDwwKQorCV9fdTY0IGZsYWdzOworCV9fdTY0IHJzdmQxOworCV9fdTY0IHJzdmQyOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiB7CisJLyoqCisJICogTGlzdCBvZiBnZW1fZXhlY19vYmplY3QyIHN0cnVjdHMKKwkgKi8KKwlfX3U2NCBidWZmZXJzX3B0cjsKKwlfX3UzMiBidWZmZXJfY291bnQ7CisKKwkvKiogT2Zmc2V0IGluIHRoZSBiYXRjaGJ1ZmZlciB0byBzdGFydCBleGVjdXRpb24gZnJvbS4gKi8KKwlfX3UzMiBiYXRjaF9zdGFydF9vZmZzZXQ7CisJLyoqIEJ5dGVzIHVzZWQgaW4gYmF0Y2hidWZmZXIgZnJvbSBiYXRjaF9zdGFydF9vZmZzZXQgKi8KKwlfX3UzMiBiYXRjaF9sZW47CisJX191MzIgRFIxOworCV9fdTMyIERSNDsKKwlfX3UzMiBudW1fY2xpcHJlY3RzOworCS8qKiBUaGlzIGlzIGEgc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXByZWN0cyAqLworCV9fdTY0IGNsaXByZWN0c19wdHI7CisjZGVmaW5lIEk5MTVfRVhFQ19SSU5HX01BU0sgICAgICAgICAgICAgICg3PDwwKQorI2RlZmluZSBJOTE1X0VYRUNfREVGQVVMVCAgICAgICAgICAgICAgICAoMDw8MCkKKyNkZWZpbmUgSTkxNV9FWEVDX1JFTkRFUiAgICAgICAgICAgICAgICAgKDE8PDApCisjZGVmaW5lIEk5MTVfRVhFQ19CU0QgICAgICAgICAgICAgICAgICAgICgyPDwwKQorI2RlZmluZSBJOTE1X0VYRUNfQkxUICAgICAgICAgICAgICAgICAgICAoMzw8MCkKKworLyogVXNlZCBmb3Igc3dpdGNoaW5nIHRoZSBjb25zdGFudHMgYWRkcmVzc2luZyBtb2RlIG9uIGdlbjQrIFJFTkRFUiByaW5nLgorICogR2VuNisgb25seSBzdXBwb3J0cyByZWxhdGl2ZSBhZGRyZXNzaW5nIHRvIGR5bmFtaWMgc3RhdGUgKGRlZmF1bHQpIGFuZAorICogYWJzb2x1dGUgYWRkcmVzc2luZy4KKyAqCisgKiBUaGVzZSBmbGFncyBhcmUgaWdub3JlZCBmb3IgdGhlIEJTRCBhbmQgQkxUIHJpbmdzLgorICovCisjZGVmaW5lIEk5MTVfRVhFQ19DT05TVEFOVFNfTUFTSyAJKDM8PDYpCisjZGVmaW5lIEk5MTVfRVhFQ19DT05TVEFOVFNfUkVMX0dFTkVSQUwgKDA8PDYpIC8qIGRlZmF1bHQgKi8KKyNkZWZpbmUgSTkxNV9FWEVDX0NPTlNUQU5UU19BQlNPTFVURSAJKDE8PDYpCisjZGVmaW5lIEk5MTVfRVhFQ19DT05TVEFOVFNfUkVMX1NVUkZBQ0UgKDI8PDYpIC8qIGdlbjQvNSBvbmx5ICovCisJX191NjQgZmxhZ3M7CisJX191NjQgcnN2ZDE7CisJX191NjQgcnN2ZDI7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3BpbiB7CisJLyoqIEhhbmRsZSBvZiB0aGUgYnVmZmVyIHRvIGJlIHBpbm5lZC4gKi8KKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworCisJLyoqIGFsaWdubWVudCByZXF1aXJlZCB3aXRoaW4gdGhlIGFwZXJ0dXJlICovCisJX191NjQgYWxpZ25tZW50OworCisJLyoqIFJldHVybmVkIEdUVCBvZmZzZXQgb2YgdGhlIGJ1ZmZlci4gKi8KKwlfX3U2NCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3VucGluIHsKKwkvKiogSGFuZGxlIG9mIHRoZSBidWZmZXIgdG8gYmUgdW5waW5uZWQuICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fYnVzeSB7CisJLyoqIEhhbmRsZSBvZiB0aGUgYnVmZmVyIHRvIGNoZWNrIGZvciBidXN5ICovCisJX191MzIgaGFuZGxlOworCisJLyoqIFJldHVybiBidXN5IHN0YXR1cyAoMSBpZiBidXN5LCAwIGlmIGlkbGUpICovCisJX191MzIgYnVzeTsKK307CisKKyNkZWZpbmUgSTkxNV9USUxJTkdfTk9ORQkwCisjZGVmaW5lIEk5MTVfVElMSU5HX1gJCTEKKyNkZWZpbmUgSTkxNV9USUxJTkdfWQkJMgorCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV9OT05FCQkwCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV85CQkxCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV85XzEwCQkyCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV85XzExCQkzCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV85XzEwXzExCTQKKy8qIE5vdCBzZWVuIGJ5IHVzZXJsYW5kICovCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOCTUKKy8qIFNlZW4gYnkgdXNlcmxhbmQuICovCisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV85XzE3CQk2CisjZGVmaW5lIEk5MTVfQklUXzZfU1dJWlpMRV85XzEwXzE3CTcKKworc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfdGlsaW5nIHsKKwkvKiogSGFuZGxlIG9mIHRoZSBidWZmZXIgdG8gaGF2ZSBpdHMgdGlsaW5nIHN0YXRlIHVwZGF0ZWQgKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKioKKwkgKiBUaWxpbmcgbW9kZSBmb3IgdGhlIG9iamVjdCAoSTkxNV9USUxJTkdfTk9ORSwgSTkxNV9USUxJTkdfWCwKKwkgKiBJOTE1X1RJTElOR19ZKS4KKwkgKgorCSAqIFRoaXMgdmFsdWUgaXMgdG8gYmUgc2V0IG9uIHJlcXVlc3QsIGFuZCB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlCisJICoga2VybmVsIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuIHdpdGggdGhlIGFjdHVhbCBjaG9zZW4gdGlsaW5nIGxheW91dC4KKwkgKgorCSAqIFRoZSB0aWxpbmcgbW9kZSBtYXkgYmUgZGVtb3RlZCB0byBJOTE1X1RJTElOR19OT05FIHdoZW4gdGhlIHN5c3RlbQorCSAqIGhhcyBiaXQgNiBzd2l6emxpbmcgdGhhdCBjYW4ndCBiZSBtYW5hZ2VkIGNvcnJlY3RseSBieSBHRU0uCisJICoKKwkgKiBCdWZmZXIgY29udGVudHMgYmVjb21lIHVuZGVmaW5lZCB3aGVuIGNoYW5naW5nIHRpbGluZ19tb2RlLgorCSAqLworCV9fdTMyIHRpbGluZ19tb2RlOworCisJLyoqCisJICogU3RyaWRlIGluIGJ5dGVzIGZvciB0aGUgb2JqZWN0IHdoZW4gaW4gSTkxNV9USUxJTkdfWCBvcgorCSAqIEk5MTVfVElMSU5HX1kuCisJICovCisJX191MzIgc3RyaWRlOworCisJLyoqCisJICogUmV0dXJuZWQgYWRkcmVzcyBiaXQgNiBzd2l6emxpbmcgcmVxdWlyZWQgZm9yIENQVSBhY2Nlc3MgdGhyb3VnaAorCSAqIG1tYXAgbWFwcGluZy4KKwkgKi8KKwlfX3UzMiBzd2l6emxlX21vZGU7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2dldF90aWxpbmcgeworCS8qKiBIYW5kbGUgb2YgdGhlIGJ1ZmZlciB0byBnZXQgdGlsaW5nIHN0YXRlIGZvci4gKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKioKKwkgKiBDdXJyZW50IHRpbGluZyBtb2RlIGZvciB0aGUgb2JqZWN0IChJOTE1X1RJTElOR19OT05FLCBJOTE1X1RJTElOR19YLAorCSAqIEk5MTVfVElMSU5HX1kpLgorCSAqLworCV9fdTMyIHRpbGluZ19tb2RlOworCisJLyoqCisJICogUmV0dXJuZWQgYWRkcmVzcyBiaXQgNiBzd2l6emxpbmcgcmVxdWlyZWQgZm9yIENQVSBhY2Nlc3MgdGhyb3VnaAorCSAqIG1tYXAgbWFwcGluZy4KKwkgKi8KKwlfX3UzMiBzd2l6emxlX21vZGU7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2dldF9hcGVydHVyZSB7CisJLyoqIFRvdGFsIHNpemUgb2YgdGhlIGFwZXJ0dXJlIHVzZWQgYnkgaTkxNV9nZW1fZXhlY2J1ZmZlciwgaW4gYnl0ZXMgKi8KKwlfX3U2NCBhcGVyX3NpemU7CisKKwkvKioKKwkgKiBBdmFpbGFibGUgc3BhY2UgaW4gdGhlIGFwZXJ0dXJlIHVzZWQgYnkgaTkxNV9nZW1fZXhlY2J1ZmZlciwgaW4KKwkgKiBieXRlcworCSAqLworCV9fdTY0IGFwZXJfYXZhaWxhYmxlX3NpemU7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2V0X3BpcGVfZnJvbV9jcnRjX2lkIHsKKwkvKiogSUQgb2YgQ1JUQyBiZWluZyByZXF1ZXN0ZWQgKiovCisJX191MzIgY3J0Y19pZDsKKworCS8qKiBwaXBlIG9mIHJlcXVlc3RlZCBDUlRDICoqLworCV9fdTMyIHBpcGU7Cit9OworCisjZGVmaW5lIEk5MTVfTUFEVl9XSUxMTkVFRCAwCisjZGVmaW5lIEk5MTVfTUFEVl9ET05UTkVFRCAxCisjZGVmaW5lIF9fSTkxNV9NQURWX1BVUkdFRCAyIC8qIGludGVybmFsIHN0YXRlICovCisKK3N0cnVjdCBkcm1faTkxNV9nZW1fbWFkdmlzZSB7CisJLyoqIEhhbmRsZSBvZiB0aGUgYnVmZmVyIHRvIGNoYW5nZSB0aGUgYmFja2luZyBzdG9yZSBhZHZpY2UgKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKiBBZHZpY2U6IGVpdGhlciB0aGUgYnVmZmVyIHdpbGwgYmUgbmVlZGVkIGFnYWluIGluIHRoZSBuZWFyIGZ1dHVyZSwKKwkgKiAgICAgICAgIG9yIHdvbnQgYmUgYW5kIGNvdWxkIGJlIGRpc2NhcmRlZCB1bmRlciBtZW1vcnkgcHJlc3N1cmUuCisJICovCisJX191MzIgbWFkdjsKKworCS8qKiBXaGV0aGVyIHRoZSBiYWNraW5nIHN0b3JlIHN0aWxsIGV4aXN0cy4gKi8KKwlfX3UzMiByZXRhaW5lZDsKK307CisKKy8qIGZsYWdzICovCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9UWVBFX01BU0sgCQkweGZmCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVZfUExBTkFSIAkweDAxCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVZfUEFDS0VEIAkweDAyCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9SR0IJCTB4MDMKKworI2RlZmluZSBJOTE1X09WRVJMQVlfREVQVEhfTUFTSwkJMHhmZjAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9SR0IyNAkJMHgxMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9SR0IxNgkJMHgyMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9SR0IxNQkJMHgzMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVY0MjIJCTB4MDEwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfWVVWNDExCQkweDAyMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX1lVVjQyMAkJMHgwMzAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVY0MTAJCTB4MDQwMAorCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9TV0FQX01BU0sJCTB4ZmYwMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9OT19TV0FQCQkweDAwMDAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfVVZfU1dBUAkJMHgwMTAwMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX1lfU1dBUAkJMHgwMjAwMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX1lfQU5EX1VWX1NXQVAJMHgwMzAwMDAKKworI2RlZmluZSBJOTE1X09WRVJMQVlfRkxBR1NfTUFTSwkJMHhmZjAwMDAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfRU5BQkxFCQkweDAxMDAwMDAwCisKK3N0cnVjdCBkcm1faW50ZWxfb3ZlcmxheV9wdXRfaW1hZ2UgeworCS8qIHZhcmlvdXMgZmxhZ3MgYW5kIHNyYyBmb3JtYXQgZGVzY3JpcHRpb24gKi8KKwlfX3UzMiBmbGFnczsKKwkvKiBzb3VyY2UgcGljdHVyZSBkZXNjcmlwdGlvbiAqLworCV9fdTMyIGJvX2hhbmRsZTsKKwkvKiBzdHJpZGUgdmFsdWVzIGFuZCBvZmZzZXRzIGFyZSBpbiBieXRlcywgYnVmZmVyIHJlbGF0aXZlICovCisJX191MTYgc3RyaWRlX1k7IC8qIHN0cmlkZSBmb3IgcGFja2VkIGZvcm1hdHMgKi8KKwlfX3UxNiBzdHJpZGVfVVY7CisJX191MzIgb2Zmc2V0X1k7IC8qIG9mZnNldCBmb3IgcGFja2V0IGZvcm1hdHMgKi8KKwlfX3UzMiBvZmZzZXRfVTsKKwlfX3UzMiBvZmZzZXRfVjsKKwkvKiBpbiBwaXhlbHMgKi8KKwlfX3UxNiBzcmNfd2lkdGg7CisJX191MTYgc3JjX2hlaWdodDsKKwkvKiB0byBjb21wZW5zYXRlIHRoZSBzY2FsaW5nIGZhY3RvcnMgZm9yIHBhcnRpYWxseSBjb3ZlcmVkIHN1cmZhY2VzICovCisJX191MTYgc3JjX3NjYW5fd2lkdGg7CisJX191MTYgc3JjX3NjYW5faGVpZ2h0OworCS8qIG91dHB1dCBjcnRjIGRlc2NyaXB0aW9uICovCisJX191MzIgY3J0Y19pZDsKKwlfX3UxNiBkc3RfeDsKKwlfX3UxNiBkc3RfeTsKKwlfX3UxNiBkc3Rfd2lkdGg7CisJX191MTYgZHN0X2hlaWdodDsKK307CisKKy8qIGZsYWdzICovCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9VUERBVEVfQVRUUlMJKDE8PDApCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9VUERBVEVfR0FNTUEJKDE8PDEpCitzdHJ1Y3QgZHJtX2ludGVsX292ZXJsYXlfYXR0cnMgeworCV9fdTMyIGZsYWdzOworCV9fdTMyIGNvbG9yX2tleTsKKwlfX3MzMiBicmlnaHRuZXNzOworCV9fdTMyIGNvbnRyYXN0OworCV9fdTMyIHNhdHVyYXRpb247CisJX191MzIgZ2FtbWEwOworCV9fdTMyIGdhbW1hMTsKKwlfX3UzMiBnYW1tYTI7CisJX191MzIgZ2FtbWEzOworCV9fdTMyIGdhbW1hNDsKKwlfX3UzMiBnYW1tYTU7Cit9OworCisjZW5kaWYJCQkJLyogX0k5MTVfRFJNX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9tZ2FfZHJtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9tZ2FfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5NWM2MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL21nYV9kcm0uaApAQCAtMCwwICsxLDQxOSBAQAorLyogbWdhX2RybS5oIC0tIFB1YmxpYyBoZWFkZXIgZm9yIHRoZSBNYXRyb3ggZzIwMC9nNDAwIGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IFR1ZSBKYW4gMjUgMDE6NTA6MDEgMTk5OSBieSBqaGFydG1hbm5AcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBKZWZmIEhhcnRtYW5uIDxqaGFydG1hbm5AdmFsaW51eC5jb20+CisgKiAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKgorICogUmV3cml0dGVuIGJ5OgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpZm5kZWYgX19NR0FfRFJNX0hfXworI2RlZmluZSBfX01HQV9EUk1fSF9fCisKKyNpbmNsdWRlIDxkcm0vZHJtLmg+CisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYc2VydmVyIGZpbGUgKG1nYV9zYXJlYS5oKQorICovCisKKyNpZm5kZWYgX19NR0FfU0FSRUFfREVGSU5FU19fCisjZGVmaW5lIF9fTUdBX1NBUkVBX0RFRklORVNfXworCisvKiBXQVJQIHBpcGUgZmxhZ3MKKyAqLworI2RlZmluZSBNR0FfRgkJCTB4MQkvKiBmb2cgKi8KKyNkZWZpbmUgTUdBX0EJCQkweDIJLyogYWxwaGEgKi8KKyNkZWZpbmUgTUdBX1MJCQkweDQJLyogc3BlY3VsYXIgKi8KKyNkZWZpbmUgTUdBX1QyCQkJMHg4CS8qIG11bHRpdGV4dHVyZSAqLworCisjZGVmaW5lIE1HQV9XQVJQX1RHWgkJMAorI2RlZmluZSBNR0FfV0FSUF9UR1pGCQkoTUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1RHWkEJCShNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVEdaQUYJCShNR0FfRnxNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVEdaUwkJKE1HQV9TKQorI2RlZmluZSBNR0FfV0FSUF9UR1pTRgkJKE1HQV9TfE1HQV9GKQorI2RlZmluZSBNR0FfV0FSUF9UR1pTQQkJKE1HQV9TfE1HQV9BKQorI2RlZmluZSBNR0FfV0FSUF9UR1pTQUYJCShNR0FfU3xNR0FfRnxNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWgkJKE1HQV9UMikKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWkYJCShNR0FfVDJ8TUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pBCQkoTUdBX1QyfE1HQV9BKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaQUYJCShNR0FfVDJ8TUdBX0F8TUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pTCQkoTUdBX1QyfE1HQV9TKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaU0YJCShNR0FfVDJ8TUdBX1N8TUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pTQQkJKE1HQV9UMnxNR0FfU3xNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWlNBRgkoTUdBX1QyfE1HQV9TfE1HQV9GfE1HQV9BKQorCisjZGVmaW5lIE1HQV9NQVhfRzIwMF9QSVBFUwk4CS8qIG5vIG11bHRpdGV4ICovCisjZGVmaW5lIE1HQV9NQVhfRzQwMF9QSVBFUwkxNgorI2RlZmluZSBNR0FfTUFYX1dBUlBfUElQRVMJTUdBX01BWF9HNDAwX1BJUEVTCisjZGVmaW5lIE1HQV9XQVJQX1VDT0RFX1NJWkUJMzI3NjgJLyogaW4gYnl0ZXMgKi8KKworI2RlZmluZSBNR0FfQ0FSRF9UWVBFX0cyMDAJMQorI2RlZmluZSBNR0FfQ0FSRF9UWVBFX0c0MDAJMgorI2RlZmluZSBNR0FfQ0FSRF9UWVBFX0c0NTAJMwkvKiBub3QgY3VycmVudGx5IHVzZWQgKi8KKyNkZWZpbmUgTUdBX0NBUkRfVFlQRV9HNTUwCTQKKworI2RlZmluZSBNR0FfRlJPTlQJCTB4MQorI2RlZmluZSBNR0FfQkFDSwkJMHgyCisjZGVmaW5lIE1HQV9ERVBUSAkJMHg0CisKKy8qIFdoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCBmb3IgdGhlIGN1cnJlbnQgdmVydGV4IGRtYSBidWZmZXI/CisgKi8KKyNkZWZpbmUgTUdBX1VQTE9BRF9DT05URVhUCTB4MQorI2RlZmluZSBNR0FfVVBMT0FEX1RFWDAJCTB4MgorI2RlZmluZSBNR0FfVVBMT0FEX1RFWDEJCTB4NAorI2RlZmluZSBNR0FfVVBMT0FEX1BJUEUJCTB4OAorI2RlZmluZSBNR0FfVVBMT0FEX1RFWDBJTUFHRQkweDEwCS8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgTUdBX1VQTE9BRF9URVgxSU1BR0UJMHgyMAkvKiBoYW5kbGVkIGNsaWVudC1zaWRlICovCisjZGVmaW5lIE1HQV9VUExPQURfMkQJCTB4NDAKKyNkZWZpbmUgTUdBX1dBSVRfQUdFCQkweDgwCS8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgTUdBX1VQTE9BRF9DTElQUkVDVFMJMHgxMDAJLyogaGFuZGxlZCBjbGllbnQtc2lkZSAqLworI2lmIDAKKyNkZWZpbmUgTUdBX0RNQV9GTFVTSAkJMHgyMDAJLyogc2V0IHdoZW4gc29tZW9uZSBnZXRzIHRoZSBsb2NrCisJCQkJCSAgIHF1aWVzY2VudCAqLworI2VuZGlmCisKKy8qIDMyIGJ1ZmZlcnMgb2YgNjRrIGVhY2gsIHRvdGFsIDIgbWVnLgorICovCisjZGVmaW5lIE1HQV9CVUZGRVJfU0laRQkJKDEgPDwgMTYpCisjZGVmaW5lIE1HQV9OVU1fQlVGRkVSUwkJMTI4CisKKy8qIEtlZXAgdGhlc2Ugc21hbGwgZm9yIHRlc3RpbmcuCisgKi8KKyNkZWZpbmUgTUdBX05SX1NBUkVBX0NMSVBSRUNUUwk4CisKKy8qIDIgaGVhcHMgKDEgZm9yIGNhcmQsIDEgZm9yIGFncCksIGVhY2ggZGl2aWRlZCBpbnRvIHVwIHRvIDEyOAorICogcmVnaW9ucywgc3ViamVjdCB0byBhIG1pbmltdW0gcmVnaW9uIHNpemUgb2YgKDE8PDE2KSA9PSA2NGsuCisgKgorICogQ2xpZW50cyBtYXkgc3ViZGl2aWRlIHJlZ2lvbnMgaW50ZXJuYWxseSwgYnV0IHdoZW4gc2hhcmluZyBiZXR3ZWVuCisgKiBjbGllbnRzLCB0aGUgcmVnaW9uIHNpemUgaXMgdGhlIG1pbmltdW0gZ3JhbnVsYXJpdHkuCisgKi8KKworI2RlZmluZSBNR0FfQ0FSRF9IRUFQCQkJMAorI2RlZmluZSBNR0FfQUdQX0hFQVAJCQkxCisjZGVmaW5lIE1HQV9OUl9URVhfSEVBUFMJCTIKKyNkZWZpbmUgTUdBX05SX1RFWF9SRUdJT05TCQkxNgorI2RlZmluZSBNR0FfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUJMTYKKworI2RlZmluZSAgRFJNX01HQV9JRExFX1JFVFJZICAgICAgICAgIDIwNDgKKworI2VuZGlmCQkJCS8qIF9fTUdBX1NBUkVBX0RFRklORVNfXyAqLworCisvKiBTZXR1cCByZWdpc3RlcnMgZm9yIDNEIGNvbnRleHQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBkc3Rvcmc7CisJdW5zaWduZWQgaW50IG1hY2Nlc3M7CisJdW5zaWduZWQgaW50IHBsbnd0OworCXVuc2lnbmVkIGludCBkd2djdGw7CisJdW5zaWduZWQgaW50IGFscGhhY3RybDsKKwl1bnNpZ25lZCBpbnQgZm9nY29sb3I7CisJdW5zaWduZWQgaW50IHdmbGFnOworCXVuc2lnbmVkIGludCB0ZHVhbHN0YWdlMDsKKwl1bnNpZ25lZCBpbnQgdGR1YWxzdGFnZTE7CisJdW5zaWduZWQgaW50IGZjb2w7CisJdW5zaWduZWQgaW50IHN0ZW5jaWw7CisJdW5zaWduZWQgaW50IHN0ZW5jaWxjdGw7Cit9IGRybV9tZ2FfY29udGV4dF9yZWdzX3Q7CisKKy8qIFNldHVwIHJlZ2lzdGVycyBmb3IgMkQsIFggc2VydmVyCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgcGl0Y2g7Cit9IGRybV9tZ2Ffc2VydmVyX3JlZ3NfdDsKKworLyogU2V0dXAgcmVnaXN0ZXJzIGZvciBlYWNoIHRleHR1cmUgdW5pdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHRleGN0bDsKKwl1bnNpZ25lZCBpbnQgdGV4Y3RsMjsKKwl1bnNpZ25lZCBpbnQgdGV4ZmlsdGVyOworCXVuc2lnbmVkIGludCB0ZXhib3JkZXJjb2w7CisJdW5zaWduZWQgaW50IHRleG9yZzsKKwl1bnNpZ25lZCBpbnQgdGV4d2lkdGg7CisJdW5zaWduZWQgaW50IHRleGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgdGV4b3JnMTsKKwl1bnNpZ25lZCBpbnQgdGV4b3JnMjsKKwl1bnNpZ25lZCBpbnQgdGV4b3JnMzsKKwl1bnNpZ25lZCBpbnQgdGV4b3JnNDsKK30gZHJtX21nYV90ZXh0dXJlX3JlZ3NfdDsKKworLyogR2VuZXJhbCBhZ2luZyBtZWNoYW5pc20KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBoZWFkOwkvKiBQb3NpdGlvbiBvZiBoZWFkIHBvaW50ZXIgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgd3JhcDsJLyogUHJpbWFyeSBETUEgd3JhcCBjb3VudCAgICAgICAgICAgICovCit9IGRybV9tZ2FfYWdlX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fbWdhX3NhcmVhIHsKKwkvKiBUaGUgY2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiBvZiBzdGF0ZSBpbmZvcm1hdGlvbiB0byB0aGUga2VybmVsCisJICogb24gZmlyaW5nIGEgdmVydGV4IGRtYSBidWZmZXIuCisJICovCisJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCBjb250ZXh0X3N0YXRlOworCWRybV9tZ2Ffc2VydmVyX3JlZ3NfdCBzZXJ2ZXJfc3RhdGU7CisJZHJtX21nYV90ZXh0dXJlX3JlZ3NfdCB0ZXhfc3RhdGVbMl07CisJdW5zaWduZWQgaW50IHdhcnBfcGlwZTsKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisJdW5zaWduZWQgaW50IHZlcnRzaXplOworCisJLyogVGhlIGN1cnJlbnQgY2xpcHJlY3RzLCBvciBhIHN1YnNldCB0aGVyZW9mLgorCSAqLworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveGVzW01HQV9OUl9TQVJFQV9DTElQUkVDVFNdOworCXVuc2lnbmVkIGludCBuYm94OworCisJLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vc3QgcmVjZW50bHkgdXNlZCAzZCBkcmF3YWJsZS4gIFRoZQorCSAqIGNsaWVudCBmaWxscyBpbiB0aGUgcmVxXyogZmllbGRzLCB0aGUgc2VydmVyIGZpbGxzIGluIHRoZQorCSAqIGV4cG9ydGVkXyBmaWVsZHMgYW5kIHB1dHMgdGhlIGNsaXByZWN0cyBpbnRvIGJveGVzLCBhYm92ZS4KKwkgKgorCSAqIFRoZSBjbGllbnQgY2xlYXJzIHRoZSBleHBvcnRlZF9kcmF3YWJsZSBmaWVsZCBiZWZvcmUKKwkgKiBjbG9iYmVyaW5nIHRoZSBib3hlcyBkYXRhLgorCSAqLworCXVuc2lnbmVkIGludCByZXFfZHJhd2FibGU7CS8qIHRoZSBYIGRyYXdhYmxlIGlkICovCisJdW5zaWduZWQgaW50IHJlcV9kcmF3X2J1ZmZlcjsJLyogTUdBX0ZST05UIG9yIE1HQV9CQUNLICovCisKKwl1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfZHJhd2FibGU7CisJdW5zaWduZWQgaW50IGV4cG9ydGVkX2luZGV4OworCXVuc2lnbmVkIGludCBleHBvcnRlZF9zdGFtcDsKKwl1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfYnVmZmVyczsKKwl1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfbmZyb250OworCXVuc2lnbmVkIGludCBleHBvcnRlZF9uYmFjazsKKwlpbnQgZXhwb3J0ZWRfYmFja194LCBleHBvcnRlZF9mcm9udF94LCBleHBvcnRlZF93OworCWludCBleHBvcnRlZF9iYWNrX3ksIGV4cG9ydGVkX2Zyb250X3ksIGV4cG9ydGVkX2g7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgZXhwb3J0ZWRfYm94ZXNbTUdBX05SX1NBUkVBX0NMSVBSRUNUU107CisKKwkvKiBDb3VudGVycyBmb3IgYWdpbmcgdGV4dHVyZXMgYW5kIGZvciBjbGllbnQtc2lkZSB0aHJvdHRsaW5nLgorCSAqLworCXVuc2lnbmVkIGludCBzdGF0dXNbNF07CisJdW5zaWduZWQgaW50IGxhc3Rfd3JhcDsKKworCWRybV9tZ2FfYWdlX3QgbGFzdF9mcmFtZTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9lbnF1ZXVlOwkvKiBsYXN0IHRpbWUgYSBidWZmZXIgd2FzIGVucXVldWVkICovCisJdW5zaWduZWQgaW50IGxhc3RfZGlzcGF0Y2g7CS8qIGFnZSBvZiB0aGUgbW9zdCByZWNlbnRseSBkaXNwYXRjaGVkIGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBsYXN0X3F1aWVzY2VudDsJLyogICovCisKKwkvKiBMUlUgbGlzdHMgZm9yIHRleHR1cmUgbWVtb3J5IGluIGFncCBzcGFjZSBhbmQgb24gdGhlIGNhcmQuCisJICovCisJc3RydWN0IGRybV90ZXhfcmVnaW9uIHRleExpc3RbTUdBX05SX1RFWF9IRUFQU11bTUdBX05SX1RFWF9SRUdJT05TICsgMV07CisJdW5zaWduZWQgaW50IHRleEFnZVtNR0FfTlJfVEVYX0hFQVBTXTsKKworCS8qIE1lY2hhbmlzbSB0byB2YWxpZGF0ZSBjYXJkIHN0YXRlLgorCSAqLworCWludCBjdHhPd25lcjsKK30gZHJtX21nYV9zYXJlYV90OworCisvKiBNR0Egc3BlY2lmaWMgaW9jdGxzCisgKiBUaGUgZGV2aWNlIHNwZWNpZmljIGlvY3RsIHJhbmdlIGlzIDB4NDAgdG8gMHg3OS4KKyAqLworI2RlZmluZSBEUk1fTUdBX0lOSVQgICAgIDB4MDAKKyNkZWZpbmUgRFJNX01HQV9GTFVTSCAgICAweDAxCisjZGVmaW5lIERSTV9NR0FfUkVTRVQgICAgMHgwMgorI2RlZmluZSBEUk1fTUdBX1NXQVAgICAgIDB4MDMKKyNkZWZpbmUgRFJNX01HQV9DTEVBUiAgICAweDA0CisjZGVmaW5lIERSTV9NR0FfVkVSVEVYICAgMHgwNQorI2RlZmluZSBEUk1fTUdBX0lORElDRVMgIDB4MDYKKyNkZWZpbmUgRFJNX01HQV9JTE9BRCAgICAweDA3CisjZGVmaW5lIERSTV9NR0FfQkxJVCAgICAgMHgwOAorI2RlZmluZSBEUk1fTUdBX0dFVFBBUkFNIDB4MDkKKworLyogMy4yOgorICogaW9jdGxzIGZvciBvcGVyYXRpbmcgb24gZmVuY2VzLgorICovCisjZGVmaW5lIERSTV9NR0FfU0VUX0ZFTkNFICAgICAgMHgwYQorI2RlZmluZSBEUk1fTUdBX1dBSVRfRkVOQ0UgICAgIDB4MGIKKyNkZWZpbmUgRFJNX01HQV9ETUFfQk9PVFNUUkFQICAweDBjCisKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9JTklUICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9JTklULCBkcm1fbWdhX2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9GTFVTSCAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9GTFVTSCwgc3RydWN0IGRybV9sb2NrKQorI2RlZmluZSBEUk1fSU9DVExfTUdBX1JFU0VUICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX1JFU0VUKQorI2RlZmluZSBEUk1fSU9DVExfTUdBX1NXQVAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX1NXQVApCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfQ0xFQVIgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfQ0xFQVIsIGRybV9tZ2FfY2xlYXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9WRVJURVggICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9WRVJURVgsIGRybV9tZ2FfdmVydGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfSU5ESUNFUyAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfSU5ESUNFUywgZHJtX21nYV9pbmRpY2VzX3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfSUxPQUQgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfSUxPQUQsIGRybV9tZ2FfaWxvYWRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9CTElUICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9CTElULCBkcm1fbWdhX2JsaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9HRVRQQVJBTSBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9HRVRQQVJBTSwgZHJtX21nYV9nZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX1NFVF9GRU5DRSAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfU0VUX0ZFTkNFLCBfX3UzMikKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9XQUlUX0ZFTkNFICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX1dBSVRfRkVOQ0UsIF9fdTMyKQorI2RlZmluZSBEUk1fSU9DVExfTUdBX0RNQV9CT09UU1RSQVAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfRE1BX0JPT1RTVFJBUCwgZHJtX21nYV9kbWFfYm9vdHN0cmFwX3QpCisKK3R5cGVkZWYgc3RydWN0IF9kcm1fbWdhX3dhcnBfaW5kZXggeworCWludCBpbnN0YWxsZWQ7CisJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHI7CisJaW50IHNpemU7Cit9IGRybV9tZ2Ffd2FycF9pbmRleF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2luaXQgeworCWVudW0geworCQlNR0FfSU5JVF9ETUEgPSAweDAxLAorCQlNR0FfQ0xFQU5VUF9ETUEgPSAweDAyCisJfSBmdW5jOworCisJdW5zaWduZWQgbG9uZyBzYXJlYV9wcml2X29mZnNldDsKKworCWludCBjaGlwc2V0OworCWludCBzZ3JhbTsKKworCXVuc2lnbmVkIGludCBtYWNjZXNzOworCisJdW5zaWduZWQgaW50IGZiX2NwcDsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0LCBmcm9udF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQsIGJhY2tfcGl0Y2g7CisKKwl1bnNpZ25lZCBpbnQgZGVwdGhfY3BwOworCXVuc2lnbmVkIGludCBkZXB0aF9vZmZzZXQsIGRlcHRoX3BpdGNoOworCisJdW5zaWduZWQgaW50IHRleHR1cmVfb2Zmc2V0W01HQV9OUl9URVhfSEVBUFNdOworCXVuc2lnbmVkIGludCB0ZXh0dXJlX3NpemVbTUdBX05SX1RFWF9IRUFQU107CisKKwl1bnNpZ25lZCBsb25nIGZiX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHdhcnBfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgcHJpbWFyeV9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKK30gZHJtX21nYV9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9tZ2FfZG1hX2Jvb3RzdHJhcCB7CisJLyoqCisJICogXG5hbWUgQUdQIHRleHR1cmUgcmVnaW9uCisJICoKKwkgKiBPbiByZXR1cm4gZnJvbSB0aGUgRFJNX01HQV9ETUFfQk9PVFNUUkFQIGlvY3RsLCB0aGVzZSBmaWVsZHMgd2lsbAorCSAqIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBhY3R1YWwgQUdQIHRleHR1cmUgc2V0dGluZ3MuCisJICoKKwkgKiBcd2FybmluZworCSAqIElmIHRoZXNlIGZpZWxkcyBhcmUgbm9uLXplcm8sIGJ1dCBkbWFfbWdhX2RtYV9ib290c3RyYXA6OmFncF9tb2RlCisJICogaXMgemVybywgaXQgbWVhbnMgdGhhdCBQQ0kgbWVtb3J5IChtb3N0IGxpa2VseSB0aHJvdWdoIHRoZSB1c2Ugb2YKKwkgKiBhbiBJT01NVSkgaXMgYmVpbmcgdXNlZCBmb3IgIkFHUCIgdGV4dHVyZXMuCisJICovCisJLypAeyAqLworCXVuc2lnbmVkIGxvbmcgdGV4dHVyZV9oYW5kbGU7IC8qKjwgSGFuZGxlIHVzZWQgdG8gbWFwIEFHUCB0ZXh0dXJlcy4gKi8KKwlfX3UzMiB0ZXh0dXJlX3NpemU7CSAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgQUdQIHRleHR1cmUgcmVnaW9uLiAqLworCS8qQH0gKi8KKworCS8qKgorCSAqIFJlcXVlc3RlZCBzaXplIG9mIHRoZSBwcmltYXJ5IERNQSByZWdpb24uCisJICoKKwkgKiBPbiByZXR1cm4gZnJvbSB0aGUgRFJNX01HQV9ETUFfQk9PVFNUUkFQIGlvY3RsLCB0aGlzIGZpZWxkIHdpbGwgYmUKKwkgKiBmaWxsZWQgaW4gd2l0aCB0aGUgYWN0dWFsIEFHUCBtb2RlLiAgSWYgQUdQIHdhcyBub3QgYXZhaWxhYmxlCisJICovCisJX191MzIgcHJpbWFyeV9zaXplOworCisJLyoqCisJICogUmVxdWVzdGVkIG51bWJlciBvZiBzZWNvbmRhcnkgRE1BIGJ1ZmZlcnMuCisJICoKKwkgKiBPbiByZXR1cm4gZnJvbSB0aGUgRFJNX01HQV9ETUFfQk9PVFNUUkFQIGlvY3RsLCB0aGlzIGZpZWxkIHdpbGwgYmUKKwkgKiBmaWxsZWQgaW4gd2l0aCB0aGUgYWN0dWFsIG51bWJlciBvZiBzZWNvbmRhcnkgRE1BIGJ1ZmZlcnMKKwkgKiBhbGxvY2F0ZWQuICBQYXJ0aWN1bGFybHkgd2hlbiBQQ0kgRE1BIGlzIHVzZWQsIHRoaXMgbWF5IGJlCisJICogKHN1YnRhbnRpYWxseSkgbGVzcyB0aGFuIHRoZSBudW1iZXIgcmVxdWVzdGVkLgorCSAqLworCV9fdTMyIHNlY29uZGFyeV9iaW5fY291bnQ7CisKKwkvKioKKwkgKiBSZXF1ZXN0ZWQgc2l6ZSBvZiBlYWNoIHNlY29uZGFyeSBETUEgYnVmZmVyLgorCSAqCisJICogV2hpbGUgdGhlIGtlcm5lbCBcYiBpcyBmcmVlIHRvIHJlZHVjZQorCSAqIGRtYV9tZ2FfZG1hX2Jvb3RzdHJhcDo6c2Vjb25kYXJ5X2Jpbl9jb3VudCwgaXQgaXMgXGIgbm90IGFsbG93ZWQKKwkgKiB0byByZWR1Y2UgZG1hX21nYV9kbWFfYm9vdHN0cmFwOjpzZWNvbmRhcnlfYmluX3NpemUuCisJICovCisJX191MzIgc2Vjb25kYXJ5X2Jpbl9zaXplOworCisJLyoqCisJICogQml0LXdpc2UgbWFzayBvZiBBR1BTVEFUMl8qIHZhbHVlcy4gIEN1cnJlbnRseSBvbmx5IFxjIEFHUFNUQVQyXzFYLAorCSAqIFxjIEFHUFNUQVQyXzJYLCBhbmQgXGMgQUdQU1RBVDJfNFggYXJlIHN1cHBvcnRlZC4gIElmIHRoaXMgdmFsdWUgaXMKKwkgKiB6ZXJvLCBpdCBtZWFucyB0aGF0IFBDSSBETUEgc2hvdWxkIGJlIHVzZWQsIGV2ZW4gaWYgQUdQIGlzCisJICogcG9zc2libGUuCisJICoKKwkgKiBPbiByZXR1cm4gZnJvbSB0aGUgRFJNX01HQV9ETUFfQk9PVFNUUkFQIGlvY3RsLCB0aGlzIGZpZWxkIHdpbGwgYmUKKwkgKiBmaWxsZWQgaW4gd2l0aCB0aGUgYWN0dWFsIEFHUCBtb2RlLiAgSWYgQUdQIHdhcyBub3QgYXZhaWxhYmxlCisJICogKGkuZS4sIFBDSSBETUEgd2FzIHVzZWQpLCB0aGlzIHZhbHVlIHdpbGwgYmUgemVyby4KKwkgKi8KKwlfX3UzMiBhZ3BfbW9kZTsKKworCS8qKgorCSAqIERlc2lyZWQgQUdQIEdBUlQgc2l6ZSwgbWVhc3VyZWQgaW4gbWVnYWJ5dGVzLgorCSAqLworCV9fdTggYWdwX3NpemU7Cit9IGRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2NsZWFyIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yOworCXVuc2lnbmVkIGludCBjbGVhcl9kZXB0aDsKKwl1bnNpZ25lZCBpbnQgY29sb3JfbWFzazsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfbWFzazsKK30gZHJtX21nYV9jbGVhcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX3ZlcnRleCB7CisJaW50IGlkeDsJCS8qIGJ1ZmZlciB0byBxdWV1ZSAqLworCWludCB1c2VkOwkJLyogYnl0ZXMgaW4gdXNlICovCisJaW50IGRpc2NhcmQ7CQkvKiBjbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICAqLworfSBkcm1fbWdhX3ZlcnRleF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2luZGljZXMgeworCWludCBpZHg7CQkvKiBidWZmZXIgdG8gcXVldWUgKi8KKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CisJdW5zaWduZWQgaW50IGVuZDsKKwlpbnQgZGlzY2FyZDsJCS8qIGNsaWVudCBmaW5pc2hlZCB3aXRoIGJ1ZmZlcj8gICovCit9IGRybV9tZ2FfaW5kaWNlc190OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2lsb2FkIHsKKwlpbnQgaWR4OworCXVuc2lnbmVkIGludCBkc3Rvcmc7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKK30gZHJtX21nYV9pbG9hZF90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX21nYV9ibGl0IHsKKwl1bnNpZ25lZCBpbnQgcGxhbmVtYXNrOworCXVuc2lnbmVkIGludCBzcmNvcmc7CisJdW5zaWduZWQgaW50IGRzdG9yZzsKKwlpbnQgc3JjX3BpdGNoLCBkc3RfcGl0Y2g7CisJaW50IGRlbHRhX3N4LCBkZWx0YV9zeTsKKwlpbnQgZGVsdGFfZHgsIGRlbHRhX2R5OworCWludCBoZWlnaHQsIHlkaXI7CS8qIGZsaXAgaW1hZ2UgdmVydGljYWxseSAqLworCWludCBzb3VyY2VfcGl0Y2gsIGRlc3RfcGl0Y2g7Cit9IGRybV9tZ2FfYmxpdF90OworCisvKiAzLjE6IEFuIGlvY3RsIHRvIGdldCBwYXJhbWV0ZXJzIHRoYXQgYXJlbid0IGF2YWlsYWJsZSB0byB0aGUgM2QKKyAqIGNsaWVudCBhbnkgb3RoZXIgd2F5LgorICovCisjZGVmaW5lIE1HQV9QQVJBTV9JUlFfTlIgICAgICAgICAgICAxCisKKy8qIDMuMjogUXVlcnkgdGhlIGFjdHVhbCBjYXJkIHR5cGUuICBUaGUgRERYIG9ubHkgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuCisgKiBHMjAwIGNoaXBzIGFuZCBub24tRzIwMCBjaGlwcywgd2hpY2ggaXQgY2FsbHMgRzQwMC4gIEl0IHR1cm5zIG91dCB0aGF0CisgKiB0aGVyZSBhcmUgc29tZSB2ZXJ5IHN1Ymx0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBHNHgwIGNoaXBzIGFuZCB0aGUgRzU1MAorICogY2hpcHMuICBVc2luZyB0aGlzIHBhcmFtZXRlciBxdWVyeSwgYSBjbGllbnQtc2lkZSBkcml2ZXIgY2FuIGRldGVjdCB0aGUKKyAqIGRpZmZlcmVuY2UgYmV0d2VlbiBhIEc0eDAgYW5kIGEgRzU1MC4KKyAqLworI2RlZmluZSBNR0FfUEFSQU1fQ0FSRF9UWVBFICAgICAgICAgMgorCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2dldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJdm9pZCAqdmFsdWU7Cit9IGRybV9tZ2FfZ2V0cGFyYW1fdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9ub3V2ZWF1X2RybS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vbm91dmVhdV9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWRkM2E3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vbm91dmVhdV9kcm0uaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1IFN0ZXBoYW5lIE1hcmNoZXNpbi4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX05PVVZFQVVfRFJNX0hfXworI2RlZmluZSBfX05PVVZFQVVfRFJNX0hfXworCisjZGVmaW5lIE5PVVZFQVVfRFJNX0hFQURFUl9QQVRDSExFVkVMIDE2CisKK3N0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2FsbG9jIHsKKwl1aW50MzJfdCAgICAgZmJfY3R4ZG1hX2hhbmRsZTsKKwl1aW50MzJfdCAgICAgdHRfY3R4ZG1hX2hhbmRsZTsKKworCWludCAgICAgICAgICBjaGFubmVsOworCXVpbnQzMl90ICAgICBwdXNoYnVmX2RvbWFpbnM7CisKKwkvKiBOb3RpZmllciBtZW1vcnkgKi8KKwl1aW50MzJfdCAgICAgbm90aWZpZXJfaGFuZGxlOworCisJLyogRFJNLWVuZm9yY2VkIHN1YmNoYW5uZWwgYXNzaWdubWVudHMgKi8KKwlzdHJ1Y3QgeworCQl1aW50MzJfdCBoYW5kbGU7CisJCXVpbnQzMl90IGdyY2xhc3M7CisJfSBzdWJjaGFuWzhdOworCXVpbnQzMl90IG5yX3N1YmNoYW47Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfY2hhbm5lbF9mcmVlIHsKKwlpbnQgY2hhbm5lbDsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9ncm9ial9hbGxvYyB7CisJaW50ICAgICAgY2hhbm5lbDsKKwl1aW50MzJfdCBoYW5kbGU7CisJaW50ICAgICAgY2xhc3M7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJvYmpfYWxsb2MgeworCXVpbnQzMl90IGNoYW5uZWw7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHNpemU7CisJdWludDMyX3Qgb2Zmc2V0OworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dwdW9ial9mcmVlIHsKKwlpbnQgICAgICBjaGFubmVsOworCXVpbnQzMl90IGhhbmRsZTsKK307CisKKy8qIEZJWE1FIDogbWF5YmUgdW5pZnkge0dFVCxTRVR9UEFSQU1zICovCisjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fUENJX1ZFTkRPUiAgICAgIDMKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9QQ0lfREVWSUNFICAgICAgNAorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0JVU19UWVBFICAgICAgICA1CisjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fRkJfU0laRSAgICAgICAgIDgKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9BR1BfU0laRSAgICAgICAgOQorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0NISVBTRVRfSUQgICAgICAxMQorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX1ZNX1ZSQU1fQkFTRSAgICAxMgorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0dSQVBIX1VOSVRTICAgICAxMworI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX1BUSU1FUl9USU1FICAgICAxNAorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0hBU19CT19VU0FHRSAgICAxNQorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0hBU19QQUdFRkxJUCAgICAxNgorc3RydWN0IGRybV9ub3V2ZWF1X2dldHBhcmFtIHsKKwl1aW50NjRfdCBwYXJhbTsKKwl1aW50NjRfdCB2YWx1ZTsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9zZXRwYXJhbSB7CisJdWludDY0X3QgcGFyYW07CisJdWludDY0X3QgdmFsdWU7Cit9OworCisjZGVmaW5lIE5PVVZFQVVfR0VNX0RPTUFJTl9DUFUgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0gICAgICAoMSA8PCAxKQorI2RlZmluZSBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVCAgICAgICgxIDw8IDIpCisjZGVmaW5lIE5PVVZFQVVfR0VNX0RPTUFJTl9NQVBQQUJMRSAgKDEgPDwgMykKKworI2RlZmluZSBOT1VWRUFVX0dFTV9USUxFX0NPTVAgICAgICAgIDB4MDAwMzAwMDAgLyogbnY1MC1vbmx5ICovCisjZGVmaW5lIE5PVVZFQVVfR0VNX1RJTEVfTEFZT1VUX01BU0sgMHgwMDAwZmYwMAorI2RlZmluZSBOT1VWRUFVX0dFTV9USUxFXzE2QlBQICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTk9VVkVBVV9HRU1fVElMRV8zMkJQUCAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE5PVVZFQVVfR0VNX1RJTEVfWkVUQSAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBOT1VWRUFVX0dFTV9USUxFX05PTkNPTlRJRyAgIDB4MDAwMDAwMDgKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9pbmZvIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgZG9tYWluOworCXVpbnQ2NF90IHNpemU7CisJdWludDY0X3Qgb2Zmc2V0OworCXVpbnQ2NF90IG1hcF9oYW5kbGU7CisJdWludDMyX3QgdGlsZV9tb2RlOworCXVpbnQzMl90IHRpbGVfZmxhZ3M7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX25ldyB7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9pbmZvIGluZm87CisJdWludDMyX3QgY2hhbm5lbF9oaW50OworCXVpbnQzMl90IGFsaWduOworfTsKKworI2RlZmluZSBOT1VWRUFVX0dFTV9NQVhfQlVGRkVSUyAxMDI0CitzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm9fcHJlc3VtZWQgeworCXVpbnQzMl90IHZhbGlkOworCXVpbnQzMl90IGRvbWFpbjsKKwl1aW50NjRfdCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8geworCXVpbnQ2NF90IHVzZXJfcHJpdjsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgcmVhZF9kb21haW5zOworCXVpbnQzMl90IHdyaXRlX2RvbWFpbnM7CisJdWludDMyX3QgdmFsaWRfZG9tYWluczsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm9fcHJlc3VtZWQgcHJlc3VtZWQ7Cit9OworCisjZGVmaW5lIE5PVVZFQVVfR0VNX1JFTE9DX0xPVyAgKDEgPDwgMCkKKyNkZWZpbmUgTk9VVkVBVV9HRU1fUkVMT0NfSElHSCAoMSA8PCAxKQorI2RlZmluZSBOT1VWRUFVX0dFTV9SRUxPQ19PUiAgICgxIDw8IDIpCisjZGVmaW5lIE5PVVZFQVVfR0VNX01BWF9SRUxPQ1MgMTAyNAorc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX3JlbG9jIHsKKwl1aW50MzJfdCByZWxvY19ib19pbmRleDsKKwl1aW50MzJfdCByZWxvY19ib19vZmZzZXQ7CisJdWludDMyX3QgYm9faW5kZXg7CisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgZGF0YTsKKwl1aW50MzJfdCB2b3I7CisJdWludDMyX3QgdG9yOworfTsKKworI2RlZmluZSBOT1VWRUFVX0dFTV9NQVhfUFVTSCA1MTIKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9wdXNoIHsKKwl1aW50MzJfdCBib19pbmRleDsKKwl1aW50MzJfdCBwYWQ7CisJdWludDY0X3Qgb2Zmc2V0OworCXVpbnQ2NF90IGxlbmd0aDsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1ZiB7CisJdWludDMyX3QgY2hhbm5lbDsKKwl1aW50MzJfdCBucl9idWZmZXJzOworCXVpbnQ2NF90IGJ1ZmZlcnM7CisJdWludDMyX3QgbnJfcmVsb2NzOworCXVpbnQzMl90IG5yX3B1c2g7CisJdWludDY0X3QgcmVsb2NzOworCXVpbnQ2NF90IHB1c2g7CisJdWludDMyX3Qgc3VmZml4MDsKKwl1aW50MzJfdCBzdWZmaXgxOworCXVpbnQ2NF90IHZyYW1fYXZhaWxhYmxlOworCXVpbnQ2NF90IGdhcnRfYXZhaWxhYmxlOworfTsKKworI2RlZmluZSBOT1VWRUFVX0dFTV9DUFVfUFJFUF9OT1dBSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOT1VWRUFVX0dFTV9DUFVfUFJFUF9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9jcHVfcHJlcCB7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IGZsYWdzOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9jcHVfZmluaSB7CisJdWludDMyX3QgaGFuZGxlOworfTsKKworZW51bSBub3V2ZWF1X2J1c190eXBlIHsKKwlOVl9BR1AgICAgID0gMCwKKwlOVl9QQ0kgICAgID0gMSwKKwlOVl9QQ0lFICAgID0gMiwKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9zYXJlYSB7Cit9OworCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFVFBBUkFNICAgICAgICAgICAweDAwCisjZGVmaW5lIERSTV9OT1VWRUFVX1NFVFBBUkFNICAgICAgICAgICAweDAxCisjZGVmaW5lIERSTV9OT1VWRUFVX0NIQU5ORUxfQUxMT0MgICAgICAweDAyCisjZGVmaW5lIERSTV9OT1VWRUFVX0NIQU5ORUxfRlJFRSAgICAgICAweDAzCisjZGVmaW5lIERSTV9OT1VWRUFVX0dST0JKX0FMTE9DICAgICAgICAweDA0CisjZGVmaW5lIERSTV9OT1VWRUFVX05PVElGSUVST0JKX0FMTE9DICAweDA1CisjZGVmaW5lIERSTV9OT1VWRUFVX0dQVU9CSl9GUkVFICAgICAgICAweDA2CisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9ORVcgICAgICAgICAgICAweDQwCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9QVVNIQlVGICAgICAgICAweDQxCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9DUFVfUFJFUCAgICAgICAweDQyCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9DUFVfRklOSSAgICAgICAweDQzCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9JTkZPICAgICAgICAgICAweDQ0CisKKyNkZWZpbmUgRFJNX0lPQ1RMX05PVVZFQVVfR0VUUEFSQU0gICAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTk9VVkVBVV9HRVRQQVJBTSwgc3RydWN0IGRybV9ub3V2ZWF1X2dldHBhcmFtKQorI2RlZmluZSBEUk1fSU9DVExfTk9VVkVBVV9TRVRQQVJBTSAgICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9OT1VWRUFVX1NFVFBBUkFNLCBzdHJ1Y3QgZHJtX25vdXZlYXVfc2V0cGFyYW0pCisjZGVmaW5lIERSTV9JT0NUTF9OT1VWRUFVX0NIQU5ORUxfQUxMT0MgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX05PVVZFQVVfQ0hBTk5FTF9BTExPQywgc3RydWN0IGRybV9ub3V2ZWF1X2NoYW5uZWxfYWxsb2MpCisjZGVmaW5lIERSTV9JT0NUTF9OT1VWRUFVX0NIQU5ORUxfRlJFRSAgICAgICBEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX05PVVZFQVVfQ0hBTk5FTF9GUkVFLCBzdHJ1Y3QgZHJtX25vdXZlYXVfY2hhbm5lbF9mcmVlKQorI2RlZmluZSBEUk1fSU9DVExfTk9VVkVBVV9HUk9CSl9BTExPQyAgICAgICAgRFJNX0lPVyAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9OT1VWRUFVX0dST0JKX0FMTE9DLCBzdHJ1Y3QgZHJtX25vdXZlYXVfZ3JvYmpfYWxsb2MpCisjZGVmaW5lIERSTV9JT0NUTF9OT1VWRUFVX05PVElGSUVST0JKX0FMTE9DICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX05PVVZFQVVfTk9USUZJRVJPQkpfQUxMT0MsIHN0cnVjdCBkcm1fbm91dmVhdV9ub3RpZmllcm9ial9hbGxvYykKKyNkZWZpbmUgRFJNX0lPQ1RMX05PVVZFQVVfR1BVT0JKX0ZSRUUgICAgICAgIERSTV9JT1cgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTk9VVkVBVV9HUFVPQkpfRlJFRSwgc3RydWN0IGRybV9ub3V2ZWF1X2dwdW9ial9mcmVlKQorI2RlZmluZSBEUk1fSU9DVExfTk9VVkVBVV9HRU1fTkVXICAgICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9OT1VWRUFVX0dFTV9ORVcsIHN0cnVjdCBkcm1fbm91dmVhdV9nZW1fbmV3KQorI2RlZmluZSBEUk1fSU9DVExfTk9VVkVBVV9HRU1fUFVTSEJVRiAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9OT1VWRUFVX0dFTV9QVVNIQlVGLCBzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWYpCisjZGVmaW5lIERSTV9JT0NUTF9OT1VWRUFVX0dFTV9DUFVfUFJFUCAgICAgICBEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX05PVVZFQVVfR0VNX0NQVV9QUkVQLCBzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX2NwdV9wcmVwKQorI2RlZmluZSBEUk1fSU9DVExfTk9VVkVBVV9HRU1fQ1BVX0ZJTkkgICAgICAgRFJNX0lPVyAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9OT1VWRUFVX0dFTV9DUFVfRklOSSwgc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9jcHVfZmluaSkKKyNkZWZpbmUgRFJNX0lPQ1RMX05PVVZFQVVfR0VNX0lORk8gICAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTk9VVkVBVV9HRU1fSU5GTywgc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9pbmZvKQorCisjZW5kaWYgLyogX19OT1VWRUFVX0RSTV9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL3IxMjhfZHJtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9yMTI4X2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTc4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9yMTI4X2RybS5oCkBAIC0wLDAgKzEsMzI2IEBACisvKiByMTI4X2RybS5oIC0tIFB1YmxpYyBoZWFkZXIgZm9yIHRoZSByMTI4IGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IFdlZCBBcHIgIDUgMTk6MjQ6MTkgMjAwMCBieSBrZXZpbkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICovCisvKgorICogQ29weXJpZ2h0IDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgorICovCisKKyNpZm5kZWYgX19SMTI4X0RSTV9IX18KKyNkZWZpbmUgX19SMTI4X0RSTV9IX18KKworLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKKyAqIGRlZmluZXMgaW4gdGhlIFggc2VydmVyIGZpbGUgKHIxMjhfc2FyZWEuaCkKKyAqLworI2lmbmRlZiBfX1IxMjhfU0FSRUFfREVGSU5FU19fCisjZGVmaW5lIF9fUjEyOF9TQVJFQV9ERUZJTkVTX18KKworLyogV2hhdCBuZWVkcyB0byBiZSBjaGFuZ2VkIGZvciB0aGUgY3VycmVudCB2ZXJ0ZXggYnVmZmVyPworICovCisjZGVmaW5lIFIxMjhfVVBMT0FEX0NPTlRFWFQJCTB4MDAxCisjZGVmaW5lIFIxMjhfVVBMT0FEX1NFVFVQCQkweDAwMgorI2RlZmluZSBSMTI4X1VQTE9BRF9URVgwCQkweDAwNAorI2RlZmluZSBSMTI4X1VQTE9BRF9URVgxCQkweDAwOAorI2RlZmluZSBSMTI4X1VQTE9BRF9URVgwSU1BR0VTCQkweDAxMAorI2RlZmluZSBSMTI4X1VQTE9BRF9URVgxSU1BR0VTCQkweDAyMAorI2RlZmluZSBSMTI4X1VQTE9BRF9DT1JFCQkweDA0MAorI2RlZmluZSBSMTI4X1VQTE9BRF9NQVNLUwkJMHgwODAKKyNkZWZpbmUgUjEyOF9VUExPQURfV0lORE9XCQkweDEwMAorI2RlZmluZSBSMTI4X1VQTE9BRF9DTElQUkVDVFMJCTB4MjAwCS8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgUjEyOF9SRVFVSVJFX1FVSUVTQ0VOQ0UJCTB4NDAwCisjZGVmaW5lIFIxMjhfVVBMT0FEX0FMTAkJCTB4N2ZmCisKKyNkZWZpbmUgUjEyOF9GUk9OVAkJCTB4MQorI2RlZmluZSBSMTI4X0JBQ0sJCQkweDIKKyNkZWZpbmUgUjEyOF9ERVBUSAkJCTB4NAorCisvKiBQcmltaXRpdmUgdHlwZXMKKyAqLworI2RlZmluZSBSMTI4X1BPSU5UUwkJCTB4MQorI2RlZmluZSBSMTI4X0xJTkVTCQkJMHgyCisjZGVmaW5lIFIxMjhfTElORV9TVFJJUAkJCTB4MworI2RlZmluZSBSMTI4X1RSSUFOR0xFUwkJCTB4NAorI2RlZmluZSBSMTI4X1RSSUFOR0xFX0ZBTgkJMHg1CisjZGVmaW5lIFIxMjhfVFJJQU5HTEVfU1RSSVAJCTB4NgorCisvKiBWZXJ0ZXgvaW5kaXJlY3QgYnVmZmVyIHNpemUKKyAqLworI2RlZmluZSBSMTI4X0JVRkZFUl9TSVpFCQkxNjM4NAorCisvKiBCeXRlIG9mZnNldHMgZm9yIGluZGlyZWN0IGJ1ZmZlciBkYXRhCisgKi8KKyNkZWZpbmUgUjEyOF9JTkRFWF9QUklNX09GRlNFVAkJMjAKKyNkZWZpbmUgUjEyOF9IT1NUREFUQV9CTElUX09GRlNFVAkzMgorCisvKiBLZWVwIHRoZXNlIHNtYWxsIGZvciB0ZXN0aW5nLgorICovCisjZGVmaW5lIFIxMjhfTlJfU0FSRUFfQ0xJUFJFQ1RTCQkxMgorCisvKiBUaGVyZSBhcmUgMiBoZWFwcyAobG9jYWwvQUdQKS4gIEVhY2ggcmVnaW9uIHdpdGhpbiBhIGhlYXAgaXMgYQorICogIG1pbmltdW0gb2YgNjRrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgNjQgb2YgdGhlbSBwZXIgaGVhcC4KKyAqLworI2RlZmluZSBSMTI4X0xPQ0FMX1RFWF9IRUFQCQkwCisjZGVmaW5lIFIxMjhfQUdQX1RFWF9IRUFQCQkxCisjZGVmaW5lIFIxMjhfTlJfVEVYX0hFQVBTCQkyCisjZGVmaW5lIFIxMjhfTlJfVEVYX1JFR0lPTlMJCTY0CisjZGVmaW5lIFIxMjhfTE9HX1RFWF9HUkFOVUxBUklUWQkxNgorCisjZGVmaW5lIFIxMjhfTlJfQ09OVEVYVF9SRUdTCQkxMgorCisjZGVmaW5lIFIxMjhfTUFYX1RFWFRVUkVfTEVWRUxTCQkxMQorI2RlZmluZSBSMTI4X01BWF9URVhUVVJFX1VOSVRTCQkyCisKKyNlbmRpZgkJCQkvKiBfX1IxMjhfU0FSRUFfREVGSU5FU19fICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBDb250ZXh0IHN0YXRlIC0gY2FuIGJlIHdyaXR0ZW4gaW4gb25lIGxhcmdlIGNodW5rICovCisJdW5zaWduZWQgaW50IGRzdF9waXRjaF9vZmZzZXRfYzsKKwl1bnNpZ25lZCBpbnQgZHBfZ3VpX21hc3Rlcl9jbnRsX2M7CisJdW5zaWduZWQgaW50IHNjX3RvcF9sZWZ0X2M7CisJdW5zaWduZWQgaW50IHNjX2JvdHRvbV9yaWdodF9jOworCXVuc2lnbmVkIGludCB6X29mZnNldF9jOworCXVuc2lnbmVkIGludCB6X3BpdGNoX2M7CisJdW5zaWduZWQgaW50IHpfc3Rlbl9jbnRsX2M7CisJdW5zaWduZWQgaW50IHRleF9jbnRsX2M7CisJdW5zaWduZWQgaW50IG1pc2NfM2Rfc3RhdGVfY250bF9yZWc7CisJdW5zaWduZWQgaW50IHRleHR1cmVfY2xyX2NtcF9jbHJfYzsKKwl1bnNpZ25lZCBpbnQgdGV4dHVyZV9jbHJfY21wX21za19jOworCXVuc2lnbmVkIGludCBmb2dfY29sb3JfYzsKKworCS8qIFRleHR1cmUgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgdGV4X3NpemVfcGl0Y2hfYzsKKwl1bnNpZ25lZCBpbnQgY29uc3RhbnRfY29sb3JfYzsKKworCS8qIFNldHVwIHN0YXRlICovCisJdW5zaWduZWQgaW50IHBtNF92Y19mcHVfc2V0dXA7CisJdW5zaWduZWQgaW50IHNldHVwX2NudGw7CisKKwkvKiBNYXNrIHN0YXRlICovCisJdW5zaWduZWQgaW50IGRwX3dyaXRlX21hc2s7CisJdW5zaWduZWQgaW50IHN0ZW5fcmVmX21hc2tfYzsKKwl1bnNpZ25lZCBpbnQgcGxhbmVfM2RfbWFza19jOworCisJLyogV2luZG93IHN0YXRlICovCisJdW5zaWduZWQgaW50IHdpbmRvd194eV9vZmZzZXQ7CisKKwkvKiBDb3JlIHN0YXRlICovCisJdW5zaWduZWQgaW50IHNjYWxlXzNkX2NudGw7Cit9IGRybV9yMTI4X2NvbnRleHRfcmVnc190OworCisvKiBTZXR1cCByZWdpc3RlcnMgZm9yIGVhY2ggdGV4dHVyZSB1bml0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgdGV4X2NudGw7CisJdW5zaWduZWQgaW50IHRleF9jb21iaW5lX2NudGw7CisJdW5zaWduZWQgaW50IHRleF9zaXplX3BpdGNoOworCXVuc2lnbmVkIGludCB0ZXhfb2Zmc2V0W1IxMjhfTUFYX1RFWFRVUkVfTEVWRUxTXTsKKwl1bnNpZ25lZCBpbnQgdGV4X2JvcmRlcl9jb2xvcjsKK30gZHJtX3IxMjhfdGV4dHVyZV9yZWdzX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X3NhcmVhIHsKKwkvKiBUaGUgY2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiBvZiBzdGF0ZSBpbmZvcm1hdGlvbiB0byB0aGUga2VybmVsCisJICogb24gZmlyaW5nIGEgdmVydGV4IGJ1ZmZlci4KKwkgKi8KKwlkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdCBjb250ZXh0X3N0YXRlOworCWRybV9yMTI4X3RleHR1cmVfcmVnc190IHRleF9zdGF0ZVtSMTI4X01BWF9URVhUVVJFX1VOSVRTXTsKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisJdW5zaWduZWQgaW50IHZlcnRzaXplOworCXVuc2lnbmVkIGludCB2Y19mb3JtYXQ7CisKKwkvKiBUaGUgY3VycmVudCBjbGlwcmVjdHMsIG9yIGEgc3Vic2V0IHRoZXJlb2YuCisJICovCisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbUjEyOF9OUl9TQVJFQV9DTElQUkVDVFNdOworCXVuc2lnbmVkIGludCBuYm94OworCisJLyogQ291bnRlcnMgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcgb2YgcmVuZGVyaW5nIGNsaWVudHMuCisJICovCisJdW5zaWduZWQgaW50IGxhc3RfZnJhbWU7CisJdW5zaWduZWQgaW50IGxhc3RfZGlzcGF0Y2g7CisKKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4X2xpc3RbUjEyOF9OUl9URVhfSEVBUFNdW1IxMjhfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwl1bnNpZ25lZCBpbnQgdGV4X2FnZVtSMTI4X05SX1RFWF9IRUFQU107CisJaW50IGN0eF9vd25lcjsKKwlpbnQgcGZBbGxvd1BhZ2VGbGlwOwkvKiBudW1iZXIgb2YgM2Qgd2luZG93cyAoMCwxLDIgb3IgbW9yZSkgKi8KKwlpbnQgcGZDdXJyZW50UGFnZTsJLyogd2hpY2ggYnVmZmVyIGlzIGJlaW5nIGRpc3BsYXllZD8gKi8KK30gZHJtX3IxMjhfc2FyZWFfdDsKKworLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKKyAqIGRlZmluZXMgaW4gdGhlIFhzZXJ2ZXIgZmlsZSAoeGY4NmRybVIxMjguaCkKKyAqLworCisvKiBSYWdlIDEyOCBzcGVjaWZpYyBpb2N0bHMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgMHg0MCB0byAweDc5LgorICovCisjZGVmaW5lIERSTV9SMTI4X0lOSVQgICAgICAgMHgwMAorI2RlZmluZSBEUk1fUjEyOF9DQ0VfU1RBUlQgIDB4MDEKKyNkZWZpbmUgRFJNX1IxMjhfQ0NFX1NUT1AgICAweDAyCisjZGVmaW5lIERSTV9SMTI4X0NDRV9SRVNFVCAgMHgwMworI2RlZmluZSBEUk1fUjEyOF9DQ0VfSURMRSAgIDB4MDQKKy8qIDB4MDUgbm90IHVzZWQgKi8KKyNkZWZpbmUgRFJNX1IxMjhfUkVTRVQgICAgICAweDA2CisjZGVmaW5lIERSTV9SMTI4X1NXQVAgICAgICAgMHgwNworI2RlZmluZSBEUk1fUjEyOF9DTEVBUiAgICAgIDB4MDgKKyNkZWZpbmUgRFJNX1IxMjhfVkVSVEVYICAgICAweDA5CisjZGVmaW5lIERSTV9SMTI4X0lORElDRVMgICAgMHgwYQorI2RlZmluZSBEUk1fUjEyOF9CTElUICAgICAgIDB4MGIKKyNkZWZpbmUgRFJNX1IxMjhfREVQVEggICAgICAweDBjCisjZGVmaW5lIERSTV9SMTI4X1NUSVBQTEUgICAgMHgwZAorLyogMHgwZSBub3QgdXNlZCAqLworI2RlZmluZSBEUk1fUjEyOF9JTkRJUkVDVCAgIDB4MGYKKyNkZWZpbmUgRFJNX1IxMjhfRlVMTFNDUkVFTiAweDEwCisjZGVmaW5lIERSTV9SMTI4X0NMRUFSMiAgICAgMHgxMQorI2RlZmluZSBEUk1fUjEyOF9HRVRQQVJBTSAgIDB4MTIKKyNkZWZpbmUgRFJNX1IxMjhfRkxJUCAgICAgICAweDEzCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfSU5JVCAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfSU5JVCwgZHJtX3IxMjhfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9DQ0VfU1RBUlQgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9DQ0VfU1RBUlQpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0NDRV9TVE9QICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0NDRV9TVE9QLCBkcm1fcjEyOF9jY2Vfc3RvcF90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9DQ0VfUkVTRVQgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9DQ0VfUkVTRVQpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0NDRV9JRExFICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0NDRV9JRExFKQorLyogMHgwNSBub3QgdXNlZCAqLworI2RlZmluZSBEUk1fSU9DVExfUjEyOF9SRVNFVCAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9SRVNFVCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfU1dBUCAgICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfU1dBUCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQ0xFQVIgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQ0xFQVIsIGRybV9yMTI4X2NsZWFyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X1ZFUlRFWCAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X1ZFUlRFWCwgZHJtX3IxMjhfdmVydGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0lORElDRVMgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0lORElDRVMsIGRybV9yMTI4X2luZGljZXNfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQkxJVCAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQkxJVCwgZHJtX3IxMjhfYmxpdF90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9ERVBUSCAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9ERVBUSCwgZHJtX3IxMjhfZGVwdGhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfU1RJUFBMRSAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfU1RJUFBMRSwgZHJtX3IxMjhfc3RpcHBsZV90KQorLyogMHgwZSBub3QgdXNlZCAqLworI2RlZmluZSBEUk1fSU9DVExfUjEyOF9JTkRJUkVDVCAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9JTkRJUkVDVCwgZHJtX3IxMjhfaW5kaXJlY3RfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfRlVMTFNDUkVFTiBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfRlVMTFNDUkVFTiwgZHJtX3IxMjhfZnVsbHNjcmVlbl90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9DTEVBUjIgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9DTEVBUjIsIGRybV9yMTI4X2NsZWFyMl90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9HRVRQQVJBTSAgIERSTV9JT1dSKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfR0VUUEFSQU0sIGRybV9yMTI4X2dldHBhcmFtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0ZMSVAgICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0ZMSVApCisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2luaXQgeworCWVudW0geworCQlSMTI4X0lOSVRfQ0NFID0gMHgwMSwKKwkJUjEyOF9DTEVBTlVQX0NDRSA9IDB4MDIKKwl9IGZ1bmM7CisJdW5zaWduZWQgbG9uZyBzYXJlYV9wcml2X29mZnNldDsKKwlpbnQgaXNfcGNpOworCWludCBjY2VfbW9kZTsKKwlpbnQgY2NlX3NlY3VyZTsKKwlpbnQgcmluZ19zaXplOworCWludCB1c2VjX3RpbWVvdXQ7CisKKwl1bnNpZ25lZCBpbnQgZmJfYnBwOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQsIGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldCwgYmFja19waXRjaDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfYnBwOworCXVuc2lnbmVkIGludCBkZXB0aF9vZmZzZXQsIGRlcHRoX3BpdGNoOworCXVuc2lnbmVkIGludCBzcGFuX29mZnNldDsKKworCXVuc2lnbmVkIGxvbmcgZmJfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyByaW5nX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJpbmdfcnB0cl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGFncF90ZXh0dXJlc19vZmZzZXQ7Cit9IGRybV9yMTI4X2luaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfY2NlX3N0b3AgeworCWludCBmbHVzaDsKKwlpbnQgaWRsZTsKK30gZHJtX3IxMjhfY2NlX3N0b3BfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfY2xlYXIgeworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfY29sb3I7CisJdW5zaWduZWQgaW50IGNsZWFyX2RlcHRoOworCXVuc2lnbmVkIGludCBjb2xvcl9tYXNrOworCXVuc2lnbmVkIGludCBkZXB0aF9tYXNrOworfSBkcm1fcjEyOF9jbGVhcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF92ZXJ0ZXggeworCWludCBwcmltOworCWludCBpZHg7CQkvKiBJbmRleCBvZiB2ZXJ0ZXggYnVmZmVyICovCisJaW50IGNvdW50OwkJLyogTnVtYmVyIG9mIHZlcnRpY2VzIGluIGJ1ZmZlciAqLworCWludCBkaXNjYXJkOwkJLyogQ2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAqLworfSBkcm1fcjEyOF92ZXJ0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfaW5kaWNlcyB7CisJaW50IHByaW07CisJaW50IGlkeDsKKwlpbnQgc3RhcnQ7CisJaW50IGVuZDsKKwlpbnQgZGlzY2FyZDsJCS8qIENsaWVudCBmaW5pc2hlZCB3aXRoIGJ1ZmZlcj8gKi8KK30gZHJtX3IxMjhfaW5kaWNlc190OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9ibGl0IHsKKwlpbnQgaWR4OworCWludCBwaXRjaDsKKwlpbnQgb2Zmc2V0OworCWludCBmb3JtYXQ7CisJdW5zaWduZWQgc2hvcnQgeCwgeTsKKwl1bnNpZ25lZCBzaG9ydCB3aWR0aCwgaGVpZ2h0OworfSBkcm1fcjEyOF9ibGl0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2RlcHRoIHsKKwllbnVtIHsKKwkJUjEyOF9XUklURV9TUEFOID0gMHgwMSwKKwkJUjEyOF9XUklURV9QSVhFTFMgPSAweDAyLAorCQlSMTI4X1JFQURfU1BBTiA9IDB4MDMsCisJCVIxMjhfUkVBRF9QSVhFTFMgPSAweDA0CisJfSBmdW5jOworCWludCBuOworCWludCAqeDsKKwlpbnQgKnk7CisJdW5zaWduZWQgaW50ICpidWZmZXI7CisJdW5zaWduZWQgY2hhciAqbWFzazsKK30gZHJtX3IxMjhfZGVwdGhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfc3RpcHBsZSB7CisJdW5zaWduZWQgaW50ICptYXNrOworfSBkcm1fcjEyOF9zdGlwcGxlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2luZGlyZWN0IHsKKwlpbnQgaWR4OworCWludCBzdGFydDsKKwlpbnQgZW5kOworCWludCBkaXNjYXJkOworfSBkcm1fcjEyOF9pbmRpcmVjdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9mdWxsc2NyZWVuIHsKKwllbnVtIHsKKwkJUjEyOF9JTklUX0ZVTExTQ1JFRU4gPSAweDAxLAorCQlSMTI4X0NMRUFOVVBfRlVMTFNDUkVFTiA9IDB4MDIKKwl9IGZ1bmM7Cit9IGRybV9yMTI4X2Z1bGxzY3JlZW5fdDsKKworLyogMi4zOiBBbiBpb2N0bCB0byBnZXQgcGFyYW1ldGVycyB0aGF0IGFyZW4ndCBhdmFpbGFibGUgdG8gdGhlIDNkCisgKiBjbGllbnQgYW55IG90aGVyIHdheS4KKyAqLworI2RlZmluZSBSMTI4X1BBUkFNX0lSUV9OUiAgICAgICAgICAgIDEKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfZ2V0cGFyYW0geworCWludCBwYXJhbTsKKwl2b2lkICp2YWx1ZTsKK30gZHJtX3IxMjhfZ2V0cGFyYW1fdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9yYWRlb25fZHJtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9yYWRlb25fZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEwYWYyOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL3JhZGVvbl9kcm0uaApAQCAtMCwwICsxLDkyNiBAQAorLyogcmFkZW9uX2RybS5oIC0tIFB1YmxpYyBoZWFkZXIgZm9yIHRoZSByYWRlb24gZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIEZyZW1vbnQsIENhbGlmb3JuaWEuCisgKiBDb3B5cmlnaHQgMjAwMiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgS2V2aW4gRS4gTWFydGluIDxtYXJ0aW5AdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKiAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKi8KKworI2lmbmRlZiBfX1JBREVPTl9EUk1fSF9fCisjZGVmaW5lIF9fUkFERU9OX0RSTV9IX18KKworI2luY2x1ZGUgPGRybS9kcm0uaD4KKworLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKKyAqIGRlZmluZXMgaW4gdGhlIFggc2VydmVyIGZpbGUgKHJhZGVvbl9zYXJlYS5oKQorICovCisjaWZuZGVmIF9fUkFERU9OX1NBUkVBX0RFRklORVNfXworI2RlZmluZSBfX1JBREVPTl9TQVJFQV9ERUZJTkVTX18KKworLyogT2xkIHN0eWxlIHN0YXRlIGZsYWdzLCByZXF1aXJlZCBmb3Igc2FyZWEgaW50ZXJmYWNlICgxLjEgYW5kIDEuMgorICogY2xlYXJzKSBhbmQgMS4yIGRybV92ZXJ0ZXgyIGlvY3RsLgorICovCisjZGVmaW5lIFJBREVPTl9VUExPQURfQ09OVEVYVAkJMHgwMDAwMDAwMQorI2RlZmluZSBSQURFT05fVVBMT0FEX1ZFUlRGTVQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9MSU5FCQkweDAwMDAwMDA0CisjZGVmaW5lIFJBREVPTl9VUExPQURfQlVNUE1BUAkJMHgwMDAwMDAwOAorI2RlZmluZSBSQURFT05fVVBMT0FEX01BU0tTCQkweDAwMDAwMDEwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVklFV1BPUlQJCTB4MDAwMDAwMjAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9TRVRVUAkJMHgwMDAwMDA0MAorI2RlZmluZSBSQURFT05fVVBMT0FEX1RDTAkJMHgwMDAwMDA4MAorI2RlZmluZSBSQURFT05fVVBMT0FEX01JU0MJCTB4MDAwMDAxMDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9URVgwCQkweDAwMDAwMjAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMQkJMHgwMDAwMDQwMAorI2RlZmluZSBSQURFT05fVVBMT0FEX1RFWDIJCTB4MDAwMDA4MDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9URVgwSU1BR0VTCTB4MDAwMDEwMDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9URVgxSU1BR0VTCTB4MDAwMDIwMDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9URVgySU1BR0VTCTB4MDAwMDQwMDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9DTElQUkVDVFMJCTB4MDAwMDgwMDAJLyogaGFuZGxlZCBjbGllbnQtc2lkZSAqLworI2RlZmluZSBSQURFT05fUkVRVUlSRV9RVUlFU0NFTkNFCTB4MDAwMTAwMDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9aQklBUwkJMHgwMDAyMDAwMAkvKiB2ZXJzaW9uIDEuMiBhbmQgbmV3ZXIgKi8KKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9BTEwJCTB4MDAzZWZmZmYKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9DT05URVhUX0FMTCAgICAgICAweDAwM2UwMWZmCisKKy8qIE5ldyBzdHlsZSBwZXItcGFja2V0IGlkZW50aWZpZXJzIGZvciB1c2UgaW4gY21kX2J1ZmZlciBpb2N0bCB3aXRoCisgKiB0aGUgUkFERU9OX0VNSVRfUEFDS0VUIGNvbW1hbmQuICBDb21tZW50cyByZWxhdGUgbmV3IHBhY2tldHMgdG8gb2xkCisgKiBzdGF0ZSBiaXRzIGFuZCB0aGUgcGFja2V0IHNpemU6CisgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIGNvbnRleHQvNyAqLworI2RlZmluZSBSQURFT05fRU1JVF9QUF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogY29udGV4dC8zICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1JCM0RfQ09MT1JQSVRDSCAgICAgICAgICAgICAgICAgMgkvKiBjb250ZXh0LzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUkVfTElORV9QQVRURVJOICAgICAgICAgICAgICAgICAzCS8qIGxpbmUvMiAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9MSU5FX1dJRFRIICAgICAgICAgICAgICAgICAgIDQJLyogbGluZS8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0xVTV9NQVRSSVggICAgICAgICAgICAgICAgICAgNQkvKiBidW1wbWFwLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfUk9UX01BVFJJWF8wICAgICAgICAgICAgICAgICA2CS8qIGJ1bXBtYXAvMiAqLworI2RlZmluZSBSQURFT05fRU1JVF9SQjNEX1NURU5DSUxSRUZNQVNLICAgICAgICAgICAgIDcJLyogbWFza3MvMyAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9WUE9SVF9YU0NBTEUgICAgICAgICAgICAgICAgIDgJLyogdmlld3BvcnQvNiAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgIDkJLyogc2V0dXAvMiAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9DTlRMX1NUQVRVUyAgICAgICAgICAgICAgICAgIDEwCS8qIHNldHVwLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUkVfTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAxMQkvKiBtaXNjLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMCAgICAgICAgICAgICAgICAgICAxMgkvKiB0ZXgwLzYgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzAgICAgICAgICAgICAgICAxMwkvKiB0ZXgwLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMSAgICAgICAgICAgICAgICAgICAxNAkvKiB0ZXgxLzYgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzEgICAgICAgICAgICAgICAxNQkvKiB0ZXgxLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMiAgICAgICAgICAgICAgICAgICAxNgkvKiB0ZXgyLzYgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzIgICAgICAgICAgICAgICAxNwkvKiB0ZXgyLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfU0VfWkJJQVNfRkFDVE9SICAgICAgICAgICAgICAgICAxOAkvKiB6Ymlhcy8yICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1NFX1RDTF9PVVRQVVRfVlRYX0ZNVCAgICAgICAgICAgMTkJLyogdGNsLzExICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1NFX1RDTF9NQVRFUklBTF9FTU1JU1NJVkVfUkVEICAgMjAJLyogbWF0ZXJpYWwvMTcgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzAgICAgICAgICAgICAgICAgICAgICAyMQkvKiB0ZXgwLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzEgICAgICAgICAgICAgICAgICAgICAyMgkvKiB0ZXgxLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzIgICAgICAgICAgICAgICAgICAgICAyMwkvKiB0ZXgyLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzMgICAgICAgICAgICAgICAgICAgICAyNAkvKiB0ZXgzLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzQgICAgICAgICAgICAgICAgICAgICAyNQkvKiB0ZXg0LzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzUgICAgICAgICAgICAgICAgICAgICAyNgkvKiB0ZXg1LzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzYgICAgICAgICAgICAgICAgICAgICAyNwkvKiAvNCAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNyAgICAgICAgICAgICAgICAgICAgIDI4CS8qIC80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9UQ0xfTElHSFRfTU9ERUxfQ1RMXzAgICAgICAgICAgICAgMjkJLyogdGNsLzcgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1RGQUNUT1JfMCAgICAgICAgICAgICAgICAgICAgICAgICAzMAkvKiB0Zi83ICovCisjZGVmaW5lIFIyMDBfRU1JVF9WVFhfRk1UXzAgICAgICAgICAgICAgICAgICAgICAgICAgMzEJLyogdnR4LzUgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1ZBUF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAzMgkvKiB2YXAvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfTUFUUklYX1NFTEVDVF8wICAgICAgICAgICAgICAgICAgIDMzCS8qIG1zbC81ICovCisjZGVmaW5lIFIyMDBfRU1JVF9URVhfUFJPQ19DVExfMiAgICAgICAgICAgICAgICAgICAgMzQJLyogdGNnLzUgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1RDTF9VQ1BfVkVSVF9CTEVORF9DVEwgICAgICAgICAgICAzNQkvKiB0Y2wvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMCAgICAgICAgICAgICAgICAgICAgIDM2CS8qIHRleDAvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMSAgICAgICAgICAgICAgICAgICAgIDM3CS8qIHRleDEvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMiAgICAgICAgICAgICAgICAgICAgIDM4CS8qIHRleDIvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMyAgICAgICAgICAgICAgICAgICAgIDM5CS8qIHRleDMvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfNCAgICAgICAgICAgICAgICAgICAgIDQwCS8qIHRleDQvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfNSAgICAgICAgICAgICAgICAgICAgIDQxCS8qIHRleDUvNiAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMCAgICAgICAgICAgICAgICAgICAgIDQyCS8qIHRleDAvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMSAgICAgICAgICAgICAgICAgICAgIDQzCS8qIHRleDEvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMiAgICAgICAgICAgICAgICAgICAgIDQ0CS8qIHRleDIvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMyAgICAgICAgICAgICAgICAgICAgIDQ1CS8qIHRleDMvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfNCAgICAgICAgICAgICAgICAgICAgIDQ2CS8qIHRleDQvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfNSAgICAgICAgICAgICAgICAgICAgIDQ3CS8qIHRleDUvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfVlRFX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4CS8qIHZ0ZS8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9PVVRQVVRfVlRYX0NPTVBfU0VMICAgICAgICAgICAgICAgNDkJLyogdnR4LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RBTV9ERUJVRzMgICAgICAgICAgICAgICAgICAgICA1MAkvKiB0YW0vMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfQ05UTF9YICAgICAgICAgICAgICAgICAgICAgICAgIDUxCS8qIGNzdC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9SQjNEX0RFUFRIWFlfT0ZGU0VUICAgICAgICAgICAgICAgNTIJLyogY3N0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1JFX0FVWF9TQ0lTU09SX0NOVEwgICAgICAgICAgICAgICA1MwkvKiBjc3QvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUkVfU0NJU1NPUl9UTF8wICAgICAgICAgICAgICAgICAgIDU0CS8qIGNzdC8yICovCisjZGVmaW5lIFIyMDBfRU1JVF9SRV9TQ0lTU09SX1RMXzEgICAgICAgICAgICAgICAgICAgNTUJLyogY3N0LzIgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1JFX1NDSVNTT1JfVExfMiAgICAgICAgICAgICAgICAgICA1NgkvKiBjc3QvMiAqLworI2RlZmluZSBSMjAwX0VNSVRfU0VfVkFQX0NOVExfU1RBVFVTICAgICAgICAgICAgICAgIDU3CS8qIGNzdC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9TRV9WVFhfU1RBVEVfQ05UTCAgICAgICAgICAgICAgICAgNTgJLyogY3N0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1JFX1BPSU5UU0laRSAgICAgICAgICAgICAgICAgICAgICA1OQkvKiBjc3QvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfVENMX0lOUFVUX1ZUWF9WRUNUT1JfQUREUl8wICAgICAgIDYwCS8qIGNzdC80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18wICAgICAgICAgICAgICAgICAgNjEKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMCAgICAgICAgICAgICAgICA2MgorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMSAgICAgICAgICAgICAgICAgIDYzCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzEgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzIgICAgICAgICAgICAgICAgICA2NQorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18yICAgICAgICAgICAgICAgIDY2CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18zICAgICAgICAgICAgICAgICAgNjcKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMyAgICAgICAgICAgICAgICA2OAorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfNCAgICAgICAgICAgICAgICAgIDY5CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzQgICAgICAgICAgICAgICAgNzAKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzUgICAgICAgICAgICAgICAgICA3MQorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU181ICAgICAgICAgICAgICAgIDcyCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1RFWF9TSVpFXzAgICAgICAgICAgICAgICAgICAgNzMKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVEVYX1NJWkVfMSAgICAgICAgICAgICAgICAgICA3NAorI2RlZmluZSBSQURFT05fRU1JVF9QUF9URVhfU0laRV8yICAgICAgICAgICAgICAgICAgIDc1CisjZGVmaW5lIFIyMDBfRU1JVF9SQjNEX0JMRU5EQ09MT1IgICAgICAgICAgICAgICAgICAgNzYKKyNkZWZpbmUgUjIwMF9FTUlUX1RDTF9QT0lOVF9TUFJJVEVfQ05UTCAgICAgICAgICAgICA3NworI2RlZmluZSBSQURFT05fRU1JVF9QUF9DVUJJQ19GQUNFU18wICAgICAgICAgICAgICAgIDc4CisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDAgICAgICAgICAgICAgNzkKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMSAgICAgICAgICAgICAgICA4MAorI2RlZmluZSBSQURFT05fRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1QxICAgICAgICAgICAgIDgxCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0NVQklDX0ZBQ0VTXzIgICAgICAgICAgICAgICAgODIKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU19UMiAgICAgICAgICAgICA4MworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFJJX1BFUkZfQ05UTCAgICAgICAgICAgICAgICAgIDg0CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9BRlNfMCAgICAgICAgICAgICAgICAgICAgICAgICAgODUKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0FGU18xICAgICAgICAgICAgICAgICAgICAgICAgICA4NgorI2RlZmluZSBSMjAwX0VNSVRfQVRGX1RGQUNUT1IgICAgICAgICAgICAgICAgICAgICAgIDg3CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENUTEFMTF8wICAgICAgICAgICAgICAgICAgICAgODgKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ1RMQUxMXzEgICAgICAgICAgICAgICAgICAgICA4OQorI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDVExBTExfMiAgICAgICAgICAgICAgICAgICAgIDkwCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENUTEFMTF8zICAgICAgICAgICAgICAgICAgICAgOTEKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ1RMQUxMXzQgICAgICAgICAgICAgICAgICAgICA5MgorI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDVExBTExfNSAgICAgICAgICAgICAgICAgICAgIDkzCisjZGVmaW5lIFIyMDBfRU1JVF9WQVBfUFZTX0NOVEwgICAgICAgICAgICAgICAgICAgICAgOTQKKyNkZWZpbmUgUkFERU9OX01BWF9TVEFURV9QQUNLRVRTICAgICAgICAgICAgICAgICAgICA5NQorCisvKiBDb21tYW5kcyB1bmRlcnN0b29kIGJ5IGNtZF9idWZmZXIgaW9jdGwuICBNb3JlIGNhbiBiZSBhZGRlZCBidXQKKyAqIG9idmlvdXNseSB0aGVzZSBjYW4ndCBiZSByZW1vdmVkIG9yIGNoYW5nZWQ6CisgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9QQUNLRVQgICAgICAxCS8qIGVtaXQgb25lIG9mIHRoZSByZWdpc3RlciBwYWNrZXRzIGFib3ZlICovCisjZGVmaW5lIFJBREVPTl9DTURfU0NBTEFSUyAgICAgMgkvKiBlbWl0IHNjYWxhciBkYXRhICovCisjZGVmaW5lIFJBREVPTl9DTURfVkVDVE9SUyAgICAgMwkvKiBlbWl0IHZlY3RvciBkYXRhICovCisjZGVmaW5lIFJBREVPTl9DTURfRE1BX0RJU0NBUkQgNAkvKiBkaXNjYXJkIGN1cnJlbnQgZG1hIGJ1ZiAqLworI2RlZmluZSBSQURFT05fQ01EX1BBQ0tFVDMgICAgIDUJLyogZW1pdCBodyBwYWNrZXQgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9QQUNLRVQzX0NMSVAgNgkvKiBlbWl0IGh3IHBhY2tldCB3cmFwcGVkIGluIGNsaXByZWN0cyAqLworI2RlZmluZSBSQURFT05fQ01EX1NDQUxBUlMyICAgICA3CS8qIHIyMDAgc3RvcGdhcCAqLworI2RlZmluZSBSQURFT05fQ01EX1dBSVQgICAgICAgICA4CS8qIGVtaXQgaHcgd2FpdCBjb21tYW5kcyAtLSBub3RlOgorCQkJCQkgKiAgZG9lc24ndCBtYWtlIHRoZSBjcHUgd2FpdCwganVzdAorCQkJCQkgKiAgdGhlIGdyYXBoaWNzIGhhcmR3YXJlICovCisjZGVmaW5lIFJBREVPTl9DTURfVkVDTElORUFSCTkgICAgICAgLyogYW5vdGhlciByMjAwIHN0b3BnYXAgKi8KKwordHlwZWRlZiB1bmlvbiB7CisJaW50IGk7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgcGFkMCwgcGFkMSwgcGFkMjsKKwl9IGhlYWRlcjsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBwYWNrZXRfaWQsIHBhZDAsIHBhZDE7CisJfSBwYWNrZXQ7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgb2Zmc2V0LCBzdHJpZGUsIGNvdW50OworCX0gc2NhbGFyczsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBvZmZzZXQsIHN0cmlkZSwgY291bnQ7CisJfSB2ZWN0b3JzOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIGFkZHJfbG8sIGFkZHJfaGksIGNvdW50OworCX0gdmVjbGluZWFyOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIGJ1Zl9pZHgsIHBhZDAsIHBhZDE7CisJfSBkbWE7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgZmxhZ3MsIHBhZDAsIHBhZDE7CisJfSB3YWl0OworfSBkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdDsKKworI2RlZmluZSBSQURFT05fV0FJVF8yRCAgMHgxCisjZGVmaW5lIFJBREVPTl9XQUlUXzNEICAweDIKKworLyogQWxsb3dlZCBwYXJhbWV0ZXJzIGZvciBSMzAwX0NNRF9QQUNLRVQzCisgKi8KKyNkZWZpbmUgUjMwMF9DTURfUEFDS0VUM19DTEVBUgkJMAorI2RlZmluZSBSMzAwX0NNRF9QQUNLRVQzX1JBVwkJMQorCisvKiBDb21tYW5kcyB1bmRlcnN0b29kIGJ5IGNtZF9idWZmZXIgaW9jdGwgZm9yIFIzMDAuCisgKiBUaGUgaW50ZXJmYWNlIGhhcyBub3QgYmVlbiBzdGFiaWxpemVkLCBzbyBzb21lIG9mIHRoZXNlIG1heSBiZSByZW1vdmVkCisgKiBhbmQgZXZlbnR1YWxseSByZW9yZGVyZWQgYmVmb3JlIHN0YWJpbGl6YXRpb24uCisgKi8KKyNkZWZpbmUgUjMwMF9DTURfUEFDS0VUMAkJMQorI2RlZmluZSBSMzAwX0NNRF9WUFUJCQkyCS8qIGVtaXQgdmVydGV4IHByb2dyYW0gdXBsb2FkICovCisjZGVmaW5lIFIzMDBfQ01EX1BBQ0tFVDMJCTMJLyogZW1pdCBhIHBhY2tldDMgKi8KKyNkZWZpbmUgUjMwMF9DTURfRU5EM0QJCQk0CS8qIGVtaXQgc2VxdWVuY2UgZW5kaW5nIDNkIHJlbmRlcmluZyAqLworI2RlZmluZSBSMzAwX0NNRF9DUF9ERUxBWQkJNQorI2RlZmluZSBSMzAwX0NNRF9ETUFfRElTQ0FSRAkJNgorI2RlZmluZSBSMzAwX0NNRF9XQUlUCQkJNworIwlkZWZpbmUgUjMwMF9XQUlUXzJECQkweDEKKyMJZGVmaW5lIFIzMDBfV0FJVF8zRAkJMHgyCisvKiB0aGVzZSB0d28gZGVmaW5lcyBhcmUgRE9JTkcgSVQgV1JPTkcgLSBob3dldmVyCisgKiB3ZSBoYXZlIHVzZXJzcGFjZSB3aGljaCByZWxpZXMgb24gdXNpbmcgdGhlc2UuCisgKiBUaGUgd2FpdCBpbnRlcmZhY2UgaXMgYmFja3dhcmRzIGNvbXBhdCBuZXcgCisgKiBjb2RlIHNob3VsZCB1c2UgdGhlIE5FV19XQUlUIGRlZmluZXMgYmVsb3cKKyAqIFRIRVNFIEFSRSBOT1QgQklUIEZJRUxEUworICovCisjCWRlZmluZSBSMzAwX1dBSVRfMkRfQ0xFQU4JMHgzCisjCWRlZmluZSBSMzAwX1dBSVRfM0RfQ0xFQU4JMHg0CisKKyMJZGVmaW5lIFIzMDBfTkVXX1dBSVRfMkRfM0QJMHgzCisjCWRlZmluZSBSMzAwX05FV19XQUlUXzJEXzJEX0NMRUFOCTB4NAorIwlkZWZpbmUgUjMwMF9ORVdfV0FJVF8zRF8zRF9DTEVBTgkweDYKKyMJZGVmaW5lIFIzMDBfTkVXX1dBSVRfMkRfMkRfQ0xFQU5fM0RfM0RfQ0xFQU4JMHg4CisKKyNkZWZpbmUgUjMwMF9DTURfU0NSQVRDSAkJOAorI2RlZmluZSBSMzAwX0NNRF9SNTAwRlAgICAgICAgICAgICAgICAgIDkKKwordHlwZWRlZiB1bmlvbiB7CisJdW5zaWduZWQgaW50IHU7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgcGFkMCwgcGFkMSwgcGFkMjsKKwl9IGhlYWRlcjsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBjb3VudCwgcmVnbG8sIHJlZ2hpOworCX0gcGFja2V0MDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBjb3VudCwgYWRybG8sIGFkcmhpOworCX0gdnB1OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIHBhY2tldCwgcGFkMCwgcGFkMTsKKwl9IHBhY2tldDM7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgcGFja2V0OworCQl1bnNpZ25lZCBzaG9ydCBjb3VudDsJLyogYW1vdW50IG9mIHBhY2tldDIgdG8gZW1pdCAqLworCX0gZGVsYXk7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgYnVmX2lkeCwgcGFkMCwgcGFkMTsKKwl9IGRtYTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBmbGFncywgcGFkMCwgcGFkMTsKKwl9IHdhaXQ7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgcmVnLCBuX2J1ZnMsIGZsYWdzOworCX0gc2NyYXRjaDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBjb3VudCwgYWRybG8sIGFkcmhpX2ZsYWdzOworCX0gcjUwMGZwOworfSBkcm1fcjMwMF9jbWRfaGVhZGVyX3Q7CisKKyNkZWZpbmUgUkFERU9OX0ZST05UCQkJMHgxCisjZGVmaW5lIFJBREVPTl9CQUNLCQkJMHgyCisjZGVmaW5lIFJBREVPTl9ERVBUSAkJCTB4NAorI2RlZmluZSBSQURFT05fU1RFTkNJTAkJCTB4OAorI2RlZmluZSBSQURFT05fQ0xFQVJfRkFTVFoJCTB4ODAwMDAwMDAKKyNkZWZpbmUgUkFERU9OX1VTRV9ISUVSWgkJMHg0MDAwMDAwMAorI2RlZmluZSBSQURFT05fVVNFX0NPTVBfWkJVRgkJMHgyMDAwMDAwMAorCisjZGVmaW5lIFI1MDBGUF9DT05TVEFOVF9UWVBFICAoMSA8PCAxKQorI2RlZmluZSBSNTAwRlBfQ09OU1RBTlRfQ0xBTVAgKDEgPDwgMikKKworLyogUHJpbWl0aXZlIHR5cGVzCisgKi8KKyNkZWZpbmUgUkFERU9OX1BPSU5UUwkJCTB4MQorI2RlZmluZSBSQURFT05fTElORVMJCQkweDIKKyNkZWZpbmUgUkFERU9OX0xJTkVfU1RSSVAJCTB4MworI2RlZmluZSBSQURFT05fVFJJQU5HTEVTCQkweDQKKyNkZWZpbmUgUkFERU9OX1RSSUFOR0xFX0ZBTgkJMHg1CisjZGVmaW5lIFJBREVPTl9UUklBTkdMRV9TVFJJUAkJMHg2CisKKy8qIFZlcnRleC9pbmRpcmVjdCBidWZmZXIgc2l6ZQorICovCisjZGVmaW5lIFJBREVPTl9CVUZGRVJfU0laRQkJNjU1MzYKKworLyogQnl0ZSBvZmZzZXRzIGZvciBpbmRpcmVjdCBidWZmZXIgZGF0YQorICovCisjZGVmaW5lIFJBREVPTl9JTkRFWF9QUklNX09GRlNFVAkyMAorCisjZGVmaW5lIFJBREVPTl9TQ1JBVENIX1JFR19PRkZTRVQJMzIKKworI2RlZmluZSBSNjAwX1NDUkFUQ0hfUkVHX09GRlNFVCAgICAgICAgIDI1NgorCisjZGVmaW5lIFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFMJMTIKKworLyogVGhlcmUgYXJlIDIgaGVhcHMgKGxvY2FsL0dBUlQpLiAgRWFjaCByZWdpb24gd2l0aGluIGEgaGVhcCBpcyBhCisgKiBtaW5pbXVtIG9mIDY0aywgYW5kIHRoZXJlIGFyZSBhdCBtb3N0IDY0IG9mIHRoZW0gcGVyIGhlYXAuCisgKi8KKyNkZWZpbmUgUkFERU9OX0xPQ0FMX1RFWF9IRUFQCQkwCisjZGVmaW5lIFJBREVPTl9HQVJUX1RFWF9IRUFQCQkxCisjZGVmaW5lIFJBREVPTl9OUl9URVhfSEVBUFMJCTIKKyNkZWZpbmUgUkFERU9OX05SX1RFWF9SRUdJT05TCQk2NAorI2RlZmluZSBSQURFT05fTE9HX1RFWF9HUkFOVUxBUklUWQkxNgorCisjZGVmaW5lIFJBREVPTl9NQVhfVEVYVFVSRV9MRVZFTFMJMTIKKyNkZWZpbmUgUkFERU9OX01BWF9URVhUVVJFX1VOSVRTCTMKKworI2RlZmluZSBSQURFT05fTUFYX1NVUkZBQ0VTCQk4CisKKy8qIEJsaXRzIGhhdmUgc3RyaWN0IG9mZnNldCBydWxlcy4gIEFsbCBibGl0IG9mZnNldCBtdXN0IGJlIGFsaWduZWQgb24KKyAqIGEgMUstYnl0ZSBib3VuZGFyeS4KKyAqLworI2RlZmluZSBSQURFT05fT0ZGU0VUX1NISUZUICAgICAgICAgICAgIDEwCisjZGVmaW5lIFJBREVPTl9PRkZTRVRfQUxJR04gICAgICAgICAgICAgKDEgPDwgUkFERU9OX09GRlNFVF9TSElGVCkKKyNkZWZpbmUgUkFERU9OX09GRlNFVF9NQVNLICAgICAgICAgICAgICAoUkFERU9OX09GRlNFVF9BTElHTiAtIDEpCisKKyNlbmRpZgkJCQkvKiBfX1JBREVPTl9TQVJFQV9ERUZJTkVTX18gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCByZWQ7CisJdW5zaWduZWQgaW50IGdyZWVuOworCXVuc2lnbmVkIGludCBibHVlOworCXVuc2lnbmVkIGludCBhbHBoYTsKK30gcmFkZW9uX2NvbG9yX3JlZ3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIENvbnRleHQgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgcHBfbWlzYzsJLyogMHgxYzE0ICovCisJdW5zaWduZWQgaW50IHBwX2ZvZ19jb2xvcjsKKwl1bnNpZ25lZCBpbnQgcmVfc29saWRfY29sb3I7CisJdW5zaWduZWQgaW50IHJiM2RfYmxlbmRjbnRsOworCXVuc2lnbmVkIGludCByYjNkX2RlcHRob2Zmc2V0OworCXVuc2lnbmVkIGludCByYjNkX2RlcHRocGl0Y2g7CisJdW5zaWduZWQgaW50IHJiM2RfenN0ZW5jaWxjbnRsOworCisJdW5zaWduZWQgaW50IHBwX2NudGw7CS8qIDB4MWMzOCAqLworCXVuc2lnbmVkIGludCByYjNkX2NudGw7CisJdW5zaWduZWQgaW50IHJiM2RfY29sb3JvZmZzZXQ7CisJdW5zaWduZWQgaW50IHJlX3dpZHRoX2hlaWdodDsKKwl1bnNpZ25lZCBpbnQgcmIzZF9jb2xvcnBpdGNoOworCXVuc2lnbmVkIGludCBzZV9jbnRsOworCisJLyogVmVydGV4IGZvcm1hdCBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBzZV9jb29yZF9mbXQ7CS8qIDB4MWM1MCAqLworCisJLyogTGluZSBzdGF0ZSAqLworCXVuc2lnbmVkIGludCByZV9saW5lX3BhdHRlcm47CS8qIDB4MWNkMCAqLworCXVuc2lnbmVkIGludCByZV9saW5lX3N0YXRlOworCisJdW5zaWduZWQgaW50IHNlX2xpbmVfd2lkdGg7CS8qIDB4MWRiOCAqLworCisJLyogQnVtcG1hcCBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBwcF9sdW1fbWF0cml4OwkvKiAweDFkMDAgKi8KKworCXVuc2lnbmVkIGludCBwcF9yb3RfbWF0cml4XzA7CS8qIDB4MWQ1OCAqLworCXVuc2lnbmVkIGludCBwcF9yb3RfbWF0cml4XzE7CisKKwkvKiBNYXNrIHN0YXRlICovCisJdW5zaWduZWQgaW50IHJiM2Rfc3RlbmNpbHJlZm1hc2s7CS8qIDB4MWQ3YyAqLworCXVuc2lnbmVkIGludCByYjNkX3JvcGNudGw7CisJdW5zaWduZWQgaW50IHJiM2RfcGxhbmVtYXNrOworCisJLyogVmlld3BvcnQgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgc2VfdnBvcnRfeHNjYWxlOwkvKiAweDFkOTggKi8KKwl1bnNpZ25lZCBpbnQgc2VfdnBvcnRfeG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgc2VfdnBvcnRfeXNjYWxlOworCXVuc2lnbmVkIGludCBzZV92cG9ydF95b2Zmc2V0OworCXVuc2lnbmVkIGludCBzZV92cG9ydF96c2NhbGU7CisJdW5zaWduZWQgaW50IHNlX3Zwb3J0X3pvZmZzZXQ7CisKKwkvKiBTZXR1cCBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBzZV9jbnRsX3N0YXR1czsJLyogMHgyMTQwICovCisKKwkvKiBNaXNjIHN0YXRlICovCisJdW5zaWduZWQgaW50IHJlX3RvcF9sZWZ0OwkvKiAweDI2YzAgKi8KKwl1bnNpZ25lZCBpbnQgcmVfbWlzYzsKK30gZHJtX3JhZGVvbl9jb250ZXh0X3JlZ3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIFpiaWFzIHN0YXRlICovCisJdW5zaWduZWQgaW50IHNlX3piaWFzX2ZhY3RvcjsJLyogMHgxZGFjICovCisJdW5zaWduZWQgaW50IHNlX3piaWFzX2NvbnN0YW50OworfSBkcm1fcmFkZW9uX2NvbnRleHQyX3JlZ3NfdDsKKworLyogU2V0dXAgcmVnaXN0ZXJzIGZvciBlYWNoIHRleHR1cmUgdW5pdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHBwX3R4ZmlsdGVyOworCXVuc2lnbmVkIGludCBwcF90eGZvcm1hdDsKKwl1bnNpZ25lZCBpbnQgcHBfdHhvZmZzZXQ7CisJdW5zaWduZWQgaW50IHBwX3R4Y2JsZW5kOworCXVuc2lnbmVkIGludCBwcF90eGFibGVuZDsKKwl1bnNpZ25lZCBpbnQgcHBfdGZhY3RvcjsKKwl1bnNpZ25lZCBpbnQgcHBfYm9yZGVyX2NvbG9yOworfSBkcm1fcmFkZW9uX3RleHR1cmVfcmVnc190OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBmaW5pc2g7CisJdW5zaWduZWQgaW50IHByaW06ODsKKwl1bnNpZ25lZCBpbnQgc3RhdGVpZHg6ODsKKwl1bnNpZ25lZCBpbnQgbnVtdmVydHM6MTY7CS8qIG92ZXJsb2FkZWQgYXMgb2Zmc2V0LzY0IGZvciBlbHQgcHJpbXMgKi8KKwl1bnNpZ25lZCBpbnQgdmNfZm9ybWF0OwkvKiB2ZXJ0ZXggZm9ybWF0ICovCit9IGRybV9yYWRlb25fcHJpbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJZHJtX3JhZGVvbl9jb250ZXh0X3JlZ3NfdCBjb250ZXh0OworCWRybV9yYWRlb25fdGV4dHVyZV9yZWdzX3QgdGV4W1JBREVPTl9NQVhfVEVYVFVSRV9VTklUU107CisJZHJtX3JhZGVvbl9jb250ZXh0Ml9yZWdzX3QgY29udGV4dDI7CisJdW5zaWduZWQgaW50IGRpcnR5OworfSBkcm1fcmFkZW9uX3N0YXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBUaGUgY2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiBvZiBzdGF0ZSBpbmZvcm1hdGlvbiB0byB0aGUKKwkgKiBrZXJuZWwgb24gZmlyaW5nIGEgdmVydGV4IGJ1ZmZlciB3aXRoIGVpdGhlciBvZiB0aGUKKwkgKiBvYnNvbGV0ZWQgdmVydGV4L2luZGV4IGlvY3Rscy4KKwkgKi8KKwlkcm1fcmFkZW9uX2NvbnRleHRfcmVnc190IGNvbnRleHRfc3RhdGU7CisJZHJtX3JhZGVvbl90ZXh0dXJlX3JlZ3NfdCB0ZXhfc3RhdGVbUkFERU9OX01BWF9URVhUVVJFX1VOSVRTXTsKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisJdW5zaWduZWQgaW50IHZlcnRzaXplOworCXVuc2lnbmVkIGludCB2Y19mb3JtYXQ7CisKKwkvKiBUaGUgY3VycmVudCBjbGlwcmVjdHMsIG9yIGEgc3Vic2V0IHRoZXJlb2YuCisJICovCisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUU107CisJdW5zaWduZWQgaW50IG5ib3g7CisKKwkvKiBDb3VudGVycyBmb3IgY2xpZW50LXNpZGUgdGhyb3R0bGluZyBvZiByZW5kZXJpbmcgY2xpZW50cy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgbGFzdF9mcmFtZTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9kaXNwYXRjaDsKKwl1bnNpZ25lZCBpbnQgbGFzdF9jbGVhcjsKKworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB0ZXhfbGlzdFtSQURFT05fTlJfVEVYX0hFQVBTXVtSQURFT05fTlJfVEVYX1JFR0lPTlMgKworCQkJCQkJICAgICAgIDFdOworCXVuc2lnbmVkIGludCB0ZXhfYWdlW1JBREVPTl9OUl9URVhfSEVBUFNdOworCWludCBjdHhfb3duZXI7CisJaW50IHBmU3RhdGU7CQkvKiBudW1iZXIgb2YgM2Qgd2luZG93cyAoMCwxLDJvcm1vcmUpICovCisJaW50IHBmQ3VycmVudFBhZ2U7CS8qIHdoaWNoIGJ1ZmZlciBpcyBiZWluZyBkaXNwbGF5ZWQ/ICovCisJaW50IGNydGMyX2Jhc2U7CQkvKiBDUlRDMiBmcmFtZSBvZmZzZXQgKi8KKwlpbnQgdGlsaW5nX2VuYWJsZWQ7CS8qIHNldCBieSBkcm0sIHJlYWQgYnkgMmQgKyAzZCBjbGllbnRzICovCit9IGRybV9yYWRlb25fc2FyZWFfdDsKKworLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKKyAqIGRlZmluZXMgaW4gdGhlIFhzZXJ2ZXIgZmlsZSAoeGY4NmRybVJhZGVvbi5oKQorICoKKyAqIEtXOiBhY3R1YWxseSBpdCdzIGlsbGVnYWwgdG8gY2hhbmdlIGFueSBvZiB0aGlzIChiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkuCisgKi8KKworLyogUmFkZW9uIHNwZWNpZmljIGlvY3RscworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCisgKi8KKyNkZWZpbmUgRFJNX1JBREVPTl9DUF9JTklUICAgIDB4MDAKKyNkZWZpbmUgRFJNX1JBREVPTl9DUF9TVEFSVCAgIDB4MDEKKyNkZWZpbmUgRFJNX1JBREVPTl9DUF9TVE9QICAgIDB4MDIKKyNkZWZpbmUgRFJNX1JBREVPTl9DUF9SRVNFVCAgIDB4MDMKKyNkZWZpbmUgRFJNX1JBREVPTl9DUF9JRExFICAgIDB4MDQKKyNkZWZpbmUgRFJNX1JBREVPTl9SRVNFVCAgICAgIDB4MDUKKyNkZWZpbmUgRFJNX1JBREVPTl9GVUxMU0NSRUVOIDB4MDYKKyNkZWZpbmUgRFJNX1JBREVPTl9TV0FQICAgICAgIDB4MDcKKyNkZWZpbmUgRFJNX1JBREVPTl9DTEVBUiAgICAgIDB4MDgKKyNkZWZpbmUgRFJNX1JBREVPTl9WRVJURVggICAgIDB4MDkKKyNkZWZpbmUgRFJNX1JBREVPTl9JTkRJQ0VTICAgIDB4MEEKKyNkZWZpbmUgRFJNX1JBREVPTl9OT1RfVVNFRAorI2RlZmluZSBEUk1fUkFERU9OX1NUSVBQTEUgICAgMHgwQworI2RlZmluZSBEUk1fUkFERU9OX0lORElSRUNUICAgMHgwRAorI2RlZmluZSBEUk1fUkFERU9OX1RFWFRVUkUgICAgMHgwRQorI2RlZmluZSBEUk1fUkFERU9OX1ZFUlRFWDIgICAgMHgwRgorI2RlZmluZSBEUk1fUkFERU9OX0NNREJVRiAgICAgMHgxMAorI2RlZmluZSBEUk1fUkFERU9OX0dFVFBBUkFNICAgMHgxMQorI2RlZmluZSBEUk1fUkFERU9OX0ZMSVAgICAgICAgMHgxMgorI2RlZmluZSBEUk1fUkFERU9OX0FMTE9DICAgICAgMHgxMworI2RlZmluZSBEUk1fUkFERU9OX0ZSRUUgICAgICAgMHgxNAorI2RlZmluZSBEUk1fUkFERU9OX0lOSVRfSEVBUCAgMHgxNQorI2RlZmluZSBEUk1fUkFERU9OX0lSUV9FTUlUICAgMHgxNgorI2RlZmluZSBEUk1fUkFERU9OX0lSUV9XQUlUICAgMHgxNworI2RlZmluZSBEUk1fUkFERU9OX0NQX1JFU1VNRSAgMHgxOAorI2RlZmluZSBEUk1fUkFERU9OX1NFVFBBUkFNICAgMHgxOQorI2RlZmluZSBEUk1fUkFERU9OX1NVUkZfQUxMT0MgMHgxYQorI2RlZmluZSBEUk1fUkFERU9OX1NVUkZfRlJFRSAgMHgxYgorLyogS01TIGlvY3RsICovCisjZGVmaW5lIERSTV9SQURFT05fR0VNX0lORk8JCTB4MWMKKyNkZWZpbmUgRFJNX1JBREVPTl9HRU1fQ1JFQVRFCQkweDFkCisjZGVmaW5lIERSTV9SQURFT05fR0VNX01NQVAJCTB4MWUKKyNkZWZpbmUgRFJNX1JBREVPTl9HRU1fUFJFQUQJCTB4MjEKKyNkZWZpbmUgRFJNX1JBREVPTl9HRU1fUFdSSVRFCQkweDIyCisjZGVmaW5lIERSTV9SQURFT05fR0VNX1NFVF9ET01BSU4JMHgyMworI2RlZmluZSBEUk1fUkFERU9OX0dFTV9XQUlUX0lETEUJMHgyNAorI2RlZmluZSBEUk1fUkFERU9OX0NTCQkJMHgyNgorI2RlZmluZSBEUk1fUkFERU9OX0lORk8JCQkweDI3CisjZGVmaW5lIERSTV9SQURFT05fR0VNX1NFVF9USUxJTkcJMHgyOAorI2RlZmluZSBEUk1fUkFERU9OX0dFTV9HRVRfVElMSU5HCTB4MjkKKyNkZWZpbmUgRFJNX1JBREVPTl9HRU1fQlVTWQkJMHgyYQorCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ1BfSU5JVCAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUF9JTklULCBkcm1fcmFkZW9uX2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DUF9TVEFSVCAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NQX1NUQVJUKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NQX1NUT1AgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ1BfU1RPUCwgZHJtX3JhZGVvbl9jcF9zdG9wX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ1BfUkVTRVQgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUF9SRVNFVCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DUF9JRExFICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NQX0lETEUpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fUkVTRVQgICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9SRVNFVCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9GVUxMU0NSRUVOIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0ZVTExTQ1JFRU4sIGRybV9yYWRlb25fZnVsbHNjcmVlbl90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1NXQVAgICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fU1dBUCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DTEVBUiAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NMRUFSLCBkcm1fcmFkZW9uX2NsZWFyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fVkVSVEVYICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9WRVJURVgsIGRybV9yYWRlb25fdmVydGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fSU5ESUNFUyAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9JTkRJQ0VTLCBkcm1fcmFkZW9uX2luZGljZXNfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9TVElQUExFICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1NUSVBQTEUsIGRybV9yYWRlb25fc3RpcHBsZV90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0lORElSRUNUICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fSU5ESVJFQ1QsIGRybV9yYWRlb25faW5kaXJlY3RfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9URVhUVVJFICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1RFWFRVUkUsIGRybV9yYWRlb25fdGV4dHVyZV90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1ZFUlRFWDIgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fVkVSVEVYMiwgZHJtX3JhZGVvbl92ZXJ0ZXgyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ01EQlVGICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DTURCVUYsIGRybV9yYWRlb25fY21kX2J1ZmZlcl90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFVFBBUkFNICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fR0VUUEFSQU0sIGRybV9yYWRlb25fZ2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9GTElQICAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0ZMSVApCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQUxMT0MgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9BTExPQywgZHJtX3JhZGVvbl9tZW1fYWxsb2NfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9GUkVFICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0ZSRUUsIGRybV9yYWRlb25fbWVtX2ZyZWVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9JTklUX0hFQVAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0lOSVRfSEVBUCwgZHJtX3JhZGVvbl9tZW1faW5pdF9oZWFwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fSVJRX0VNSVQgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9JUlFfRU1JVCwgZHJtX3JhZGVvbl9pcnFfZW1pdF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0lSUV9XQUlUICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fSVJRX1dBSVQsIGRybV9yYWRlb25faXJxX3dhaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DUF9SRVNVTUUgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NQX1JFU1VNRSkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9TRVRQQVJBTSAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1NFVFBBUkFNLCBkcm1fcmFkZW9uX3NldHBhcmFtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fU1VSRl9BTExPQyBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9TVVJGX0FMTE9DLCBkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9TVVJGX0ZSRUUgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1NVUkZfRlJFRSwgZHJtX3JhZGVvbl9zdXJmYWNlX2ZyZWVfdCkKKy8qIEtNUyAqLworI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFTV9JTkZPCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFTV9JTkZPLCBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1faW5mbykKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9HRU1fQ1JFQVRFCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFTV9DUkVBVEUsIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9jcmVhdGUpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fR0VNX01NQVAJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fR0VNX01NQVAsIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9tbWFwKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFTV9QUkVBRAlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9HRU1fUFJFQUQsIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9wcmVhZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9HRU1fUFdSSVRFCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFTV9QV1JJVEUsIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9wd3JpdGUpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fR0VNX1NFVF9ET01BSU4JRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fR0VNX1NFVF9ET01BSU4sIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9zZXRfZG9tYWluKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFTV9XQUlUX0lETEUJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9HRU1fV0FJVF9JRExFLCBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fd2FpdF9pZGxlKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NTCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUywgc3RydWN0IGRybV9yYWRlb25fY3MpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fSU5GTwkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fSU5GTywgc3RydWN0IGRybV9yYWRlb25faW5mbykKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9HRU1fU0VUX1RJTElORwlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9HRU1fU0VUX1RJTElORywgc3RydWN0IGRybV9yYWRlb25fZ2VtX3NldF90aWxpbmcpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fR0VNX0dFVF9USUxJTkcJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fR0VNX0dFVF9USUxJTkcsIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9nZXRfdGlsaW5nKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFTV9CVVNZCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFTV9CVVNZLCBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fYnVzeSkKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9pbml0IHsKKwllbnVtIHsKKwkJUkFERU9OX0lOSVRfQ1AgPSAweDAxLAorCQlSQURFT05fQ0xFQU5VUF9DUCA9IDB4MDIsCisJCVJBREVPTl9JTklUX1IyMDBfQ1AgPSAweDAzLAorCQlSQURFT05fSU5JVF9SMzAwX0NQID0gMHgwNCwKKwkJUkFERU9OX0lOSVRfUjYwMF9DUCA9IDB4MDUKKwl9IGZ1bmM7CisJdW5zaWduZWQgbG9uZyBzYXJlYV9wcml2X29mZnNldDsKKwlpbnQgaXNfcGNpOworCWludCBjcF9tb2RlOworCWludCBnYXJ0X3NpemU7CisJaW50IHJpbmdfc2l6ZTsKKwlpbnQgdXNlY190aW1lb3V0OworCisJdW5zaWduZWQgaW50IGZiX2JwcDsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0LCBmcm9udF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQsIGJhY2tfcGl0Y2g7CisJdW5zaWduZWQgaW50IGRlcHRoX2JwcDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0LCBkZXB0aF9waXRjaDsKKworCXVuc2lnbmVkIGxvbmcgZmJfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyByaW5nX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJpbmdfcnB0cl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGdhcnRfdGV4dHVyZXNfb2Zmc2V0OworfSBkcm1fcmFkZW9uX2luaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9jcF9zdG9wIHsKKwlpbnQgZmx1c2g7CisJaW50IGlkbGU7Cit9IGRybV9yYWRlb25fY3Bfc3RvcF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2Z1bGxzY3JlZW4geworCWVudW0geworCQlSQURFT05fSU5JVF9GVUxMU0NSRUVOID0gMHgwMSwKKwkJUkFERU9OX0NMRUFOVVBfRlVMTFNDUkVFTiA9IDB4MDIKKwl9IGZ1bmM7Cit9IGRybV9yYWRlb25fZnVsbHNjcmVlbl90OworCisjZGVmaW5lIENMRUFSX1gxCTAKKyNkZWZpbmUgQ0xFQVJfWTEJMQorI2RlZmluZSBDTEVBUl9YMgkyCisjZGVmaW5lIENMRUFSX1kyCTMKKyNkZWZpbmUgQ0xFQVJfREVQVEgJNAorCit0eXBlZGVmIHVuaW9uIGRybV9yYWRlb25fY2xlYXJfcmVjdCB7CisJZmxvYXQgZls1XTsKKwl1bnNpZ25lZCBpbnQgdWlbNV07Cit9IGRybV9yYWRlb25fY2xlYXJfcmVjdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2NsZWFyIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yOworCXVuc2lnbmVkIGludCBjbGVhcl9kZXB0aDsKKwl1bnNpZ25lZCBpbnQgY29sb3JfbWFzazsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfbWFzazsJLyogbWlzbmFtZWQgZmllbGQ6ICBzaG91bGQgYmUgc3RlbmNpbCAqLworCWRybV9yYWRlb25fY2xlYXJfcmVjdF90ICpkZXB0aF9ib3hlczsKK30gZHJtX3JhZGVvbl9jbGVhcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3ZlcnRleCB7CisJaW50IHByaW07CisJaW50IGlkeDsJCS8qIEluZGV4IG9mIHZlcnRleCBidWZmZXIgKi8KKwlpbnQgY291bnQ7CQkvKiBOdW1iZXIgb2YgdmVydGljZXMgaW4gYnVmZmVyICovCisJaW50IGRpc2NhcmQ7CQkvKiBDbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICovCit9IGRybV9yYWRlb25fdmVydGV4X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25faW5kaWNlcyB7CisJaW50IHByaW07CisJaW50IGlkeDsKKwlpbnQgc3RhcnQ7CisJaW50IGVuZDsKKwlpbnQgZGlzY2FyZDsJCS8qIENsaWVudCBmaW5pc2hlZCB3aXRoIGJ1ZmZlcj8gKi8KK30gZHJtX3JhZGVvbl9pbmRpY2VzX3Q7CisKKy8qIHYxLjIgLSBvYnNvbGV0ZXMgZHJtX3JhZGVvbl92ZXJ0ZXggYW5kIGRybV9yYWRlb25faW5kaWNlcworICogICAgICAtIGFsbG93cyBtdWx0aXBsZSBwcmltaXRpdmVzIGFuZCBzdGF0ZSBjaGFuZ2VzIGluIGEgc2luZ2xlIGlvY3RsCisgKiAgICAgIC0gc3VwcG9ydHMgZHJpdmVyIGNoYW5nZSB0byBlbWl0IG5hdGl2ZSBwcmltaXRpdmVzCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fdmVydGV4MiB7CisJaW50IGlkeDsJCS8qIEluZGV4IG9mIHZlcnRleCBidWZmZXIgKi8KKwlpbnQgZGlzY2FyZDsJCS8qIENsaWVudCBmaW5pc2hlZCB3aXRoIGJ1ZmZlcj8gKi8KKwlpbnQgbnJfc3RhdGVzOworCWRybV9yYWRlb25fc3RhdGVfdCAqc3RhdGU7CisJaW50IG5yX3ByaW1zOworCWRybV9yYWRlb25fcHJpbV90ICpwcmltOworfSBkcm1fcmFkZW9uX3ZlcnRleDJfdDsKKworLyogdjEuMyAtIG9ic29sZXRlcyBkcm1fcmFkZW9uX3ZlcnRleDIKKyAqICAgICAgLSBhbGxvd3MgYXJiaXRyYXJpbHkgbGFyZ2UgY2xpcHJlY3QgbGlzdAorICogICAgICAtIGFsbG93cyB1cGRhdGluZyBvZiB0Y2wgcGFja2V0LCB2ZWN0b3IgYW5kIHNjYWxhciBzdGF0ZQorICogICAgICAtIGFsbG93cyBtZW1vcnktZWZmaWNpZW50IGRlc2NyaXB0aW9uIG9mIHN0YXRlIHVwZGF0ZXMKKyAqICAgICAgLSBhbGxvd3Mgc3RhdGUgdG8gYmUgZW1pdHRlZCB3aXRob3V0IGEgcHJpbWl0aXZlCisgKiAgICAgICAgICAgKGZvciBjbGVhcnMsIGN0eCBzd2l0Y2hlcykKKyAqICAgICAgLSBhbGxvd3MgbW9yZSB0aGFuIG9uZSBkbWEgYnVmZmVyIHRvIGJlIHJlZmVyZW5jZWQgcGVyIGlvY3RsCisgKiAgICAgIC0gc3VwcG9ydHMgdGNsIGRyaXZlcgorICogICAgICAtIG1heSBiZSBleHRlbmRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgd2l0aCBuZXcgY21kIHR5cGVzLCBwYWNrZXRzCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fY21kX2J1ZmZlciB7CisJaW50IGJ1ZnN6OworCWNoYXIgKmJ1ZjsKKwlpbnQgbmJveDsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqYm94ZXM7Cit9IGRybV9yYWRlb25fY21kX2J1ZmZlcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3RleF9pbWFnZSB7CisJdW5zaWduZWQgaW50IHgsIHk7CS8qIEJsaXQgY29vcmRpbmF0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodDsKKwljb25zdCB2b2lkICpkYXRhOworfSBkcm1fcmFkZW9uX3RleF9pbWFnZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3RleHR1cmUgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJaW50IHBpdGNoOworCWludCBmb3JtYXQ7CisJaW50IHdpZHRoOwkJLyogVGV4dHVyZSBpbWFnZSBjb29yZGluYXRlcyAqLworCWludCBoZWlnaHQ7CisJZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCAqaW1hZ2U7Cit9IGRybV9yYWRlb25fdGV4dHVyZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3N0aXBwbGUgeworCXVuc2lnbmVkIGludCAqbWFzazsKK30gZHJtX3JhZGVvbl9zdGlwcGxlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25faW5kaXJlY3QgeworCWludCBpZHg7CisJaW50IHN0YXJ0OworCWludCBlbmQ7CisJaW50IGRpc2NhcmQ7Cit9IGRybV9yYWRlb25faW5kaXJlY3RfdDsKKworLyogZW51bSBmb3IgY2FyZCB0eXBlIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgUkFERU9OX0NBUkRfUENJIDAKKyNkZWZpbmUgUkFERU9OX0NBUkRfQUdQIDEKKyNkZWZpbmUgUkFERU9OX0NBUkRfUENJRSAyCisKKy8qIDEuMzogQW4gaW9jdGwgdG8gZ2V0IHBhcmFtZXRlcnMgdGhhdCBhcmVuJ3QgYXZhaWxhYmxlIHRvIHRoZSAzZAorICogY2xpZW50IGFueSBvdGhlciB3YXkuCisgKi8KKyNkZWZpbmUgUkFERU9OX1BBUkFNX0dBUlRfQlVGRkVSX09GRlNFVCAgICAxCS8qIGNhcmQgb2Zmc2V0IG9mIDFzdCBHQVJUIGJ1ZmZlciAqLworI2RlZmluZSBSQURFT05fUEFSQU1fTEFTVF9GUkFNRSAgICAgICAgICAgIDIKKyNkZWZpbmUgUkFERU9OX1BBUkFNX0xBU1RfRElTUEFUQ0ggICAgICAgICAzCisjZGVmaW5lIFJBREVPTl9QQVJBTV9MQVNUX0NMRUFSICAgICAgICAgICAgNAorLyogQWRkZWQgd2l0aCBEUk0gdmVyc2lvbiAxLjYuICovCisjZGVmaW5lIFJBREVPTl9QQVJBTV9JUlFfTlIgICAgICAgICAgICAgICAgNQorI2RlZmluZSBSQURFT05fUEFSQU1fR0FSVF9CQVNFICAgICAgICAgICAgIDYJLyogY2FyZCBvZmZzZXQgb2YgR0FSVCBiYXNlICovCisvKiBBZGRlZCB3aXRoIERSTSB2ZXJzaW9uIDEuOC4gKi8KKyNkZWZpbmUgUkFERU9OX1BBUkFNX1JFR0lTVEVSX0hBTkRMRSAgICAgICA3CS8qIGZvciBkcm1NYXAoKSAqLworI2RlZmluZSBSQURFT05fUEFSQU1fU1RBVFVTX0hBTkRMRSAgICAgICAgIDgKKyNkZWZpbmUgUkFERU9OX1BBUkFNX1NBUkVBX0hBTkRMRSAgICAgICAgICA5CisjZGVmaW5lIFJBREVPTl9QQVJBTV9HQVJUX1RFWF9IQU5ETEUgICAgICAgMTAKKyNkZWZpbmUgUkFERU9OX1BBUkFNX1NDUkFUQ0hfT0ZGU0VUICAgICAgICAxMQorI2RlZmluZSBSQURFT05fUEFSQU1fQ0FSRF9UWVBFICAgICAgICAgICAgIDEyCisjZGVmaW5lIFJBREVPTl9QQVJBTV9WQkxBTktfQ1JUQyAgICAgICAgICAgMTMgICAvKiBWQkxBTksgQ1JUQyAqLworI2RlZmluZSBSQURFT05fUEFSQU1fRkJfTE9DQVRJT04gICAgICAgICAgIDE0ICAgLyogRkIgbG9jYXRpb24gKi8KKyNkZWZpbmUgUkFERU9OX1BBUkFNX05VTV9HQl9QSVBFUyAgICAgICAgICAxNSAgIC8qIG51bSBHQiBwaXBlcyAqLworI2RlZmluZSBSQURFT05fUEFSQU1fREVWSUNFX0lEICAgICAgICAgICAgIDE2CisjZGVmaW5lIFJBREVPTl9QQVJBTV9OVU1fWl9QSVBFUyAgICAgICAgICAgMTcgICAvKiBudW0gWiBwaXBlcyAqLworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2dldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJdm9pZCAqdmFsdWU7Cit9IGRybV9yYWRlb25fZ2V0cGFyYW1fdDsKKworLyogMS42OiBTZXQgdXAgYSBtZW1vcnkgbWFuYWdlciBmb3IgcmVnaW9ucyBvZiBzaGFyZWQgbWVtb3J5OgorICovCisjZGVmaW5lIFJBREVPTl9NRU1fUkVHSU9OX0dBUlQgMQorI2RlZmluZSBSQURFT05fTUVNX1JFR0lPTl9GQiAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9tZW1fYWxsb2MgeworCWludCByZWdpb247CisJaW50IGFsaWdubWVudDsKKwlpbnQgc2l6ZTsKKwlpbnQgKnJlZ2lvbl9vZmZzZXQ7CS8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGZiIG9yIEdBUlQgKi8KK30gZHJtX3JhZGVvbl9tZW1fYWxsb2NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9tZW1fZnJlZSB7CisJaW50IHJlZ2lvbjsKKwlpbnQgcmVnaW9uX29mZnNldDsKK30gZHJtX3JhZGVvbl9tZW1fZnJlZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX21lbV9pbml0X2hlYXAgeworCWludCByZWdpb247CisJaW50IHNpemU7CisJaW50IHN0YXJ0OworfSBkcm1fcmFkZW9uX21lbV9pbml0X2hlYXBfdDsKKworLyogMS42OiBVc2Vyc3BhY2UgY2FuIHJlcXVlc3QgJiB3YWl0IG9uIGlycSdzOgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2lycV9lbWl0IHsKKwlpbnQgKmlycV9zZXE7Cit9IGRybV9yYWRlb25faXJxX2VtaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9pcnFfd2FpdCB7CisJaW50IGlycV9zZXE7Cit9IGRybV9yYWRlb25faXJxX3dhaXRfdDsKKworLyogMS4xMDogQ2xpZW50cyB0ZWxsIHRoZSBEUk0gd2hlcmUgdGhleSB0aGluayB0aGUgZnJhbWVidWZmZXIgaXMgbG9jYXRlZCBpbgorICogdGhlIGNhcmQncyBhZGRyZXNzIHNwYWNlLCB2aWEgYSBuZXcgZ2VuZXJpYyBpb2N0bCB0byBzZXQgcGFyYW1ldGVycworICovCisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fc2V0cGFyYW0geworCXVuc2lnbmVkIGludCBwYXJhbTsKKwlfX3M2NCB2YWx1ZTsKK30gZHJtX3JhZGVvbl9zZXRwYXJhbV90OworCisjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9GQl9MT0NBVElPTiAgICAxCS8qIGRldGVybWluZWQgZnJhbWVidWZmZXIgbG9jYXRpb24gKi8KKyNkZWZpbmUgUkFERU9OX1NFVFBBUkFNX1NXSVRDSF9USUxJTkcgIDIJLyogZW5hYmxlL2Rpc2FibGUgY29sb3IgdGlsaW5nICovCisjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9QQ0lHQVJUX0xPQ0FUSU9OIDMJLyogUENJIEdhcnQgTG9jYXRpb24gKi8KKyNkZWZpbmUgUkFERU9OX1NFVFBBUkFNX05FV19NRU1NQVAgNAkJLyogVXNlIG5ldyBtZW1vcnkgbWFwICovCisjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9QQ0lHQVJUX1RBQkxFX1NJWkUgNSAgICAvKiBQQ0kgR0FSVCBUYWJsZSBTaXplICovCisjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9WQkxBTktfQ1JUQyA2ICAgICAgICAgICAvKiBWQkxBTksgQ1JUQyAqLworLyogMS4xNDogQ2xpZW50cyBjYW4gYWxsb2NhdGUvZnJlZSBhIHN1cmZhY2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jIHsKKwl1bnNpZ25lZCBpbnQgYWRkcmVzczsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9IGRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3N1cmZhY2VfZnJlZSB7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7Cit9IGRybV9yYWRlb25fc3VyZmFjZV9mcmVlX3Q7CisKKyNkZWZpbmUJRFJNX1JBREVPTl9WQkxBTktfQ1JUQzEJCTEKKyNkZWZpbmUJRFJNX1JBREVPTl9WQkxBTktfQ1JUQzIJCTIKKworLyoKKyAqIEtlcm5lbCBtb2Rlc2V0dGluZyB3b3JsZCBiZWxvdy4KKyAqLworI2RlZmluZSBSQURFT05fR0VNX0RPTUFJTl9DUFUJCTB4MQorI2RlZmluZSBSQURFT05fR0VNX0RPTUFJTl9HVFQJCTB4MgorI2RlZmluZSBSQURFT05fR0VNX0RPTUFJTl9WUkFNCQkweDQKKworc3RydWN0IGRybV9yYWRlb25fZ2VtX2luZm8geworCXVpbnQ2NF90CWdhcnRfc2l6ZTsKKwl1aW50NjRfdAl2cmFtX3NpemU7CisJdWludDY0X3QJdnJhbV92aXNpYmxlOworfTsKKworI2RlZmluZSBSQURFT05fR0VNX05PX0JBQ0tJTkdfU1RPUkUgMQorCitzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fY3JlYXRlIHsKKwl1aW50NjRfdAlzaXplOworCXVpbnQ2NF90CWFsaWdubWVudDsKKwl1aW50MzJfdAloYW5kbGU7CisJdWludDMyX3QJaW5pdGlhbF9kb21haW47CisJdWludDMyX3QJZmxhZ3M7Cit9OworCisjZGVmaW5lIFJBREVPTl9USUxJTkdfTUFDUk8gICAgICAgMHgxCisjZGVmaW5lIFJBREVPTl9USUxJTkdfTUlDUk8gICAgICAgMHgyCisjZGVmaW5lIFJBREVPTl9USUxJTkdfU1dBUF8xNkJJVCAgMHg0CisjZGVmaW5lIFJBREVPTl9USUxJTkdfU1dBUF8zMkJJVCAgMHg4CisjZGVmaW5lIFJBREVPTl9USUxJTkdfU1VSRkFDRSAgICAgMHgxMCAvKiB0aGlzIG9iamVjdCByZXF1aXJlcyBhIHN1cmZhY2UKKwkJCQkJKiB3aGVuIG1hcHBlZCAtIGkuZS4gZnJvbnQgYnVmZmVyICovCisjZGVmaW5lIFJBREVPTl9USUxJTkdfTUlDUk9fU1FVQVJFIDB4MjAKKworc3RydWN0IGRybV9yYWRlb25fZ2VtX3NldF90aWxpbmcgeworCXVpbnQzMl90CWhhbmRsZTsKKwl1aW50MzJfdAl0aWxpbmdfZmxhZ3M7CisJdWludDMyX3QJcGl0Y2g7Cit9OworCitzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fZ2V0X3RpbGluZyB7CisJdWludDMyX3QJaGFuZGxlOworCXVpbnQzMl90CXRpbGluZ19mbGFnczsKKwl1aW50MzJfdAlwaXRjaDsKK307CisKK3N0cnVjdCBkcm1fcmFkZW9uX2dlbV9tbWFwIHsKKwl1aW50MzJfdAloYW5kbGU7CisJdWludDMyX3QJcGFkOworCXVpbnQ2NF90CW9mZnNldDsKKwl1aW50NjRfdAlzaXplOworCXVpbnQ2NF90CWFkZHJfcHRyOworfTsKKworc3RydWN0IGRybV9yYWRlb25fZ2VtX3NldF9kb21haW4geworCXVpbnQzMl90CWhhbmRsZTsKKwl1aW50MzJfdAlyZWFkX2RvbWFpbnM7CisJdWludDMyX3QJd3JpdGVfZG9tYWluOworfTsKKworc3RydWN0IGRybV9yYWRlb25fZ2VtX3dhaXRfaWRsZSB7CisJdWludDMyX3QJaGFuZGxlOworCXVpbnQzMl90CXBhZDsKK307CisKK3N0cnVjdCBkcm1fcmFkZW9uX2dlbV9idXN5IHsKKwl1aW50MzJfdAloYW5kbGU7CisJdWludDMyX3QgICAgICAgIGRvbWFpbjsKK307CisKK3N0cnVjdCBkcm1fcmFkZW9uX2dlbV9wcmVhZCB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCBiZWluZyByZWFkLiAqLworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBwYWQ7CisJLyoqIE9mZnNldCBpbnRvIHRoZSBvYmplY3QgdG8gcmVhZCBmcm9tICovCisJdWludDY0X3Qgb2Zmc2V0OworCS8qKiBMZW5ndGggb2YgZGF0YSB0byByZWFkICovCisJdWludDY0X3Qgc2l6ZTsKKwkvKiogUG9pbnRlciB0byB3cml0ZSB0aGUgZGF0YSBpbnRvLiAqLworCS8qIHZvaWQgKiwgYnV0IHBvaW50ZXJzIGFyZSBub3QgMzIvNjQgY29tcGF0aWJsZSAqLworCXVpbnQ2NF90IGRhdGFfcHRyOworfTsKKworc3RydWN0IGRybV9yYWRlb25fZ2VtX3B3cml0ZSB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCBiZWluZyB3cml0dGVuIHRvLiAqLworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBwYWQ7CisJLyoqIE9mZnNldCBpbnRvIHRoZSBvYmplY3QgdG8gd3JpdGUgdG8gKi8KKwl1aW50NjRfdCBvZmZzZXQ7CisJLyoqIExlbmd0aCBvZiBkYXRhIHRvIHdyaXRlICovCisJdWludDY0X3Qgc2l6ZTsKKwkvKiogUG9pbnRlciB0byByZWFkIHRoZSBkYXRhIGZyb20uICovCisJLyogdm9pZCAqLCBidXQgcG9pbnRlcnMgYXJlIG5vdCAzMi82NCBjb21wYXRpYmxlICovCisJdWludDY0X3QgZGF0YV9wdHI7Cit9OworCisjZGVmaW5lIFJBREVPTl9DSFVOS19JRF9SRUxPQ1MJMHgwMQorI2RlZmluZSBSQURFT05fQ0hVTktfSURfSUIJMHgwMgorI2RlZmluZSBSQURFT05fQ0hVTktfSURfRkxBR1MJMHgwMworCisvKiBUaGUgZmlyc3QgZHdvcmQgb2YgUkFERU9OX0NIVU5LX0lEX0ZMQUdTIGlzIGEgdWludDMyIG9mIHRoZXNlIGZsYWdzOiAqLworI2RlZmluZSBSQURFT05fQ1NfS0VFUF9USUxJTkdfRkxBR1MgMHgwMQorCitzdHJ1Y3QgZHJtX3JhZGVvbl9jc19jaHVuayB7CisJdWludDMyX3QJCWNodW5rX2lkOworCXVpbnQzMl90CQlsZW5ndGhfZHc7CisJdWludDY0X3QJCWNodW5rX2RhdGE7Cit9OworCitzdHJ1Y3QgZHJtX3JhZGVvbl9jc19yZWxvYyB7CisJdWludDMyX3QJCWhhbmRsZTsKKwl1aW50MzJfdAkJcmVhZF9kb21haW5zOworCXVpbnQzMl90CQl3cml0ZV9kb21haW47CisJdWludDMyX3QJCWZsYWdzOworfTsKKworc3RydWN0IGRybV9yYWRlb25fY3MgeworCXVpbnQzMl90CQludW1fY2h1bmtzOworCXVpbnQzMl90CQljc19pZDsKKwkvKiB0aGlzIHBvaW50cyB0byB1aW50NjRfdCAqIHdoaWNoIHBvaW50IHRvIGNzIGNodW5rcyAqLworCXVpbnQ2NF90CQljaHVua3M7CisJLyogdXBkYXRlcyB0byB0aGUgbGltaXRzIGFmdGVyIHRoaXMgQ1MgaW9jdGwgKi8KKwl1aW50NjRfdAkJZ2FydF9saW1pdDsKKwl1aW50NjRfdAkJdnJhbV9saW1pdDsKK307CisKKyNkZWZpbmUgUkFERU9OX0lORk9fREVWSUNFX0lECQkweDAwCisjZGVmaW5lIFJBREVPTl9JTkZPX05VTV9HQl9QSVBFUwkweDAxCisjZGVmaW5lIFJBREVPTl9JTkZPX05VTV9aX1BJUEVTIAkweDAyCisjZGVmaW5lIFJBREVPTl9JTkZPX0FDQ0VMX1dPUktJTkcJMHgwMworI2RlZmluZSBSQURFT05fSU5GT19DUlRDX0ZST01fSUQJMHgwNAorI2RlZmluZSBSQURFT05fSU5GT19BQ0NFTF9XT1JLSU5HMgkweDA1CisjZGVmaW5lIFJBREVPTl9JTkZPX1RJTElOR19DT05GSUcJMHgwNgorI2RlZmluZSBSQURFT05fSU5GT19XQU5UX0hZUEVSWgkJMHgwNworI2RlZmluZSBSQURFT05fSU5GT19XQU5UX0NNQVNLCQkweDA4IC8qIGdldCBhY2Nlc3MgdG8gQ01BU0sgb24gcjMwMCAqLworI2RlZmluZSBSQURFT05fSU5GT19DTE9DS19DUllTVEFMX0ZSRVEJMHgwOSAvKiBjbG9jayBjcnlzdGFsIGZyZXF1ZW5jeSAqLworI2RlZmluZSBSQURFT05fSU5GT19OVU1fQkFDS0VORFMJMHgwYSAvKiBEQi9iYWNrZW5kcyBmb3IgcjYwMCsgLSBuZWVkIGZvciBPUSAqLworI2RlZmluZSBSQURFT05fSU5GT19OVU1fVElMRV9QSVBFUwkweDBiIC8qIHRpbGUgcGlwZXMgZm9yIHI2MDArICovCisjZGVmaW5lIFJBREVPTl9JTkZPX0ZVU0lPTl9HQVJUX1dPUktJTkcJMHgwYyAvKiBmdXNpb24gd3JpdGVzIHRvIEdUVCB3ZXJlIGJyb2tlbiBiZWZvcmUgdGhpcyAqLworI2RlZmluZSBSQURFT05fSU5GT19CQUNLRU5EX01BUAkJMHgwZCAvKiBwaXBlIHRvIGJhY2tlbmQgbWFwLCBuZWVkZWQgYnkgbWVzYSAqLworCitzdHJ1Y3QgZHJtX3JhZGVvbl9pbmZvIHsKKwl1aW50MzJfdAkJcmVxdWVzdDsKKwl1aW50MzJfdAkJcGFkOworCXVpbnQ2NF90CQl2YWx1ZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vc2F2YWdlX2RybS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vc2F2YWdlX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZGY5MzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9zYXZhZ2VfZHJtLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qIHNhdmFnZV9kcm0uaCAtLSBQdWJsaWMgaGVhZGVyIGZvciB0aGUgc2F2YWdlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDA0ICBGZWxpeCBLdWVobGluZworICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIEZFTElYIEtVRUhMSU5HIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GCisgKiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19TQVZBR0VfRFJNX0hfXworI2RlZmluZSBfX1NBVkFHRV9EUk1fSF9fCisKKyNpZm5kZWYgX19TQVZBR0VfU0FSRUFfREVGSU5FU19fCisjZGVmaW5lIF9fU0FWQUdFX1NBUkVBX0RFRklORVNfXworCisvKiAyIGhlYXBzICgxIGZvciBjYXJkLCAxIGZvciBhZ3ApLCBlYWNoIGRpdmlkZWQgaW50byB1cCB0byAxMjgKKyAqIHJlZ2lvbnMsIHN1YmplY3QgdG8gYSBtaW5pbXVtIHJlZ2lvbiBzaXplIG9mICgxPDwxNikgPT0gNjRrLgorICoKKyAqIENsaWVudHMgbWF5IHN1YmRpdmlkZSByZWdpb25zIGludGVybmFsbHksIGJ1dCB3aGVuIHNoYXJpbmcgYmV0d2VlbgorICogY2xpZW50cywgdGhlIHJlZ2lvbiBzaXplIGlzIHRoZSBtaW5pbXVtIGdyYW51bGFyaXR5LgorICovCisKKyNkZWZpbmUgU0FWQUdFX0NBUkRfSEVBUAkJMAorI2RlZmluZSBTQVZBR0VfQUdQX0hFQVAJCQkxCisjZGVmaW5lIFNBVkFHRV9OUl9URVhfSEVBUFMJCTIKKyNkZWZpbmUgU0FWQUdFX05SX1RFWF9SRUdJT05TCQkxNgorI2RlZmluZSBTQVZBR0VfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUJMTYKKworI2VuZGlmCQkJCS8qIF9fU0FWQUdFX1NBUkVBX0RFRklORVNfXyAqLworCit0eXBlZGVmIHN0cnVjdCBfZHJtX3NhdmFnZV9zYXJlYSB7CisJLyogTFJVIGxpc3RzIGZvciB0ZXh0dXJlIG1lbW9yeSBpbiBhZ3Agc3BhY2UgYW5kIG9uIHRoZSBjYXJkLgorCSAqLworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB0ZXhMaXN0W1NBVkFHRV9OUl9URVhfSEVBUFNdW1NBVkFHRV9OUl9URVhfUkVHSU9OUyArCisJCQkJCQkgICAgICAxXTsKKwl1bnNpZ25lZCBpbnQgdGV4QWdlW1NBVkFHRV9OUl9URVhfSEVBUFNdOworCisJLyogTWVjaGFuaXNtIHRvIHZhbGlkYXRlIGNhcmQgc3RhdGUuCisJICovCisJaW50IGN0eE93bmVyOworfSBkcm1fc2F2YWdlX3NhcmVhX3QsICpkcm1fc2F2YWdlX3NhcmVhX3B0cjsKKworLyogU2F2YWdlLXNwZWNpZmljIGlvY3RscworICovCisjZGVmaW5lIERSTV9TQVZBR0VfQkNJX0lOSVQJCTB4MDAKKyNkZWZpbmUgRFJNX1NBVkFHRV9CQ0lfQ01EQlVGICAgICAgICAgICAweDAxCisjZGVmaW5lIERSTV9TQVZBR0VfQkNJX0VWRU5UX0VNSVQJMHgwMgorI2RlZmluZSBEUk1fU0FWQUdFX0JDSV9FVkVOVF9XQUlUCTB4MDMKKworI2RlZmluZSBEUk1fSU9DVExfU0FWQUdFX0JDSV9JTklUCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1NBVkFHRV9CQ0lfSU5JVCwgZHJtX3NhdmFnZV9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9TQVZBR0VfQkNJX0NNREJVRgkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TQVZBR0VfQkNJX0NNREJVRiwgZHJtX3NhdmFnZV9jbWRidWZfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NBVkFHRV9CQ0lfRVZFTlRfRU1JVAlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1NBVkFHRV9CQ0lfRVZFTlRfRU1JVCwgZHJtX3NhdmFnZV9ldmVudF9lbWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9TQVZBR0VfQkNJX0VWRU5UX1dBSVQJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TQVZBR0VfQkNJX0VWRU5UX1dBSVQsIGRybV9zYXZhZ2VfZXZlbnRfd2FpdF90KQorCisjZGVmaW5lIFNBVkFHRV9ETUFfUENJCTEKKyNkZWZpbmUgU0FWQUdFX0RNQV9BR1AJMwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhdmFnZV9pbml0IHsKKwllbnVtIHsKKwkJU0FWQUdFX0lOSVRfQkNJID0gMSwKKwkJU0FWQUdFX0NMRUFOVVBfQkNJID0gMgorCX0gZnVuYzsKKwl1bnNpZ25lZCBpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisKKwkvKiBzb21lIHBhcmFtZXRlcnMgKi8KKwl1bnNpZ25lZCBpbnQgY29iX3NpemU7CisJdW5zaWduZWQgaW50IGJjaV90aHJlc2hvbGRfbG8sIGJjaV90aHJlc2hvbGRfaGk7CisJdW5zaWduZWQgaW50IGRtYV90eXBlOworCisJLyogZnJhbWUgYnVmZmVyIGxheW91dCAqLworCXVuc2lnbmVkIGludCBmYl9icHA7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldCwgZnJvbnRfcGl0Y2g7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0LCBiYWNrX3BpdGNoOworCXVuc2lnbmVkIGludCBkZXB0aF9icHA7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldCwgZGVwdGhfcGl0Y2g7CisKKwkvKiBsb2NhbCB0ZXh0dXJlcyAqLworCXVuc2lnbmVkIGludCB0ZXh0dXJlX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgdGV4dHVyZV9zaXplOworCisJLyogcGh5c2ljYWwgbG9jYXRpb25zIG9mIG5vbi1wZXJtYW5lbnQgbWFwcyAqLworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnNfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYWdwX3RleHR1cmVzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGNtZF9kbWFfb2Zmc2V0OworfSBkcm1fc2F2YWdlX2luaXRfdDsKKwordHlwZWRlZiB1bmlvbiBkcm1fc2F2YWdlX2NtZF9oZWFkZXIgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fc2F2YWdlX2NtZGJ1ZiB7CisJLyogY29tbWFuZCBidWZmZXIgaW4gY2xpZW50J3MgYWRkcmVzcyBzcGFjZSAqLworCWRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICpjbWRfYWRkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsJLyogc2l6ZSBvZiB0aGUgY29tbWFuZCBidWZmZXIgaW4gNjRiaXQgdW5pdHMgKi8KKworCXVuc2lnbmVkIGludCBkbWFfaWR4OwkvKiBETUEgYnVmZmVyIGluZGV4IHRvIHVzZSAqLworCWludCBkaXNjYXJkOwkJLyogZGlzY2FyZCBETUEgYnVmZmVyIHdoZW4gZG9uZSAqLworCS8qIHZlcnRleCBidWZmZXIgaW4gY2xpZW50J3MgYWRkcmVzcyBzcGFjZSAqLworCXVuc2lnbmVkIGludCAqdmJfYWRkcjsKKwl1bnNpZ25lZCBpbnQgdmJfc2l6ZTsJLyogc2l6ZSBvZiBjbGllbnQgdmVydGV4IGJ1ZmZlciBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCB2Yl9zdHJpZGU7CS8qIHN0cmlkZSBvZiB2ZXJ0aWNlcyBpbiAzMmJpdCB3b3JkcyAqLworCS8qIGJveGVzIGluIGNsaWVudCdzIGFkZHJlc3Mgc3BhY2UgKi8KKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqYm94X2FkZHI7CisJdW5zaWduZWQgaW50IG5ib3g7CS8qIG51bWJlciBvZiBjbGlwcGluZyBib3hlcyAqLworfSBkcm1fc2F2YWdlX2NtZGJ1Zl90OworCisjZGVmaW5lIFNBVkFHRV9XQUlUXzJEICAweDEJLyogd2FpdCBmb3IgMkQgaWRsZSBiZWZvcmUgdXBkYXRpbmcgZXZlbnQgdGFnICovCisjZGVmaW5lIFNBVkFHRV9XQUlUXzNEICAweDIJLyogd2FpdCBmb3IgM0QgaWRsZSBiZWZvcmUgdXBkYXRpbmcgZXZlbnQgdGFnICovCisjZGVmaW5lIFNBVkFHRV9XQUlUX0lSUSAweDQJLyogZW1pdCBvciB3YWl0IGZvciBJUlEsIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9zYXZhZ2VfZXZlbnQgeworCXVuc2lnbmVkIGludCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9IGRybV9zYXZhZ2VfZXZlbnRfZW1pdF90LCBkcm1fc2F2YWdlX2V2ZW50X3dhaXRfdDsKKworLyogQ29tbWFuZHMgZm9yIHRoZSBjbWRidWYgaW9jdGwKKyAqLworI2RlZmluZSBTQVZBR0VfQ01EX1NUQVRFCTAJLyogYSByYW5nZSBvZiBzdGF0ZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0FWQUdFX0NNRF9ETUFfUFJJTQkxCS8qIHZlcnRpY2VzIGZyb20gRE1BIGJ1ZmZlciAqLworI2RlZmluZSBTQVZBR0VfQ01EX1ZCX1BSSU0JMgkvKiB2ZXJ0aWNlcyBmcm9tIGNsaWVudCB2ZXJ0ZXggYnVmZmVyICovCisjZGVmaW5lIFNBVkFHRV9DTURfRE1BX0lEWAkzCS8qIGluZGV4ZWQgdmVydGljZXMgZnJvbSBETUEgYnVmZmVyICovCisjZGVmaW5lIFNBVkFHRV9DTURfVkJfSURYCTQJLyogaW5kZXhlZCB2ZXJ0aWNlcyBjbGllbnQgdmVydGV4IGJ1ZmZlciAqLworI2RlZmluZSBTQVZBR0VfQ01EX0NMRUFSCTUJLyogY2xlYXIgYnVmZmVycyAqLworI2RlZmluZSBTQVZBR0VfQ01EX1NXQVAJCTYJLyogc3dhcCBidWZmZXJzICovCisKKy8qIFByaW1pdGl2ZSB0eXBlcworKi8KKyNkZWZpbmUgU0FWQUdFX1BSSU1fVFJJTElTVAkwCS8qIHRyaWFuZ2xlIGxpc3QgKi8KKyNkZWZpbmUgU0FWQUdFX1BSSU1fVFJJU1RSSVAJMQkvKiB0cmlhbmdsZSBzdHJpcCAqLworI2RlZmluZSBTQVZBR0VfUFJJTV9UUklGQU4JMgkvKiB0cmlhbmdsZSBmYW4gKi8KKyNkZWZpbmUgU0FWQUdFX1BSSU1fVFJJTElTVF8yMDEJMwkvKiByZW9yZGVyIHZlcnRzIGZvciBjb3JyZWN0IGZsYXQKKwkJCQkJICogc2hhZGluZyBvbiBzM2QgKi8KKworLyogU2tpcCBmbGFncyAodmVydGV4IGZvcm1hdCkKKyAqLworI2RlZmluZSBTQVZBR0VfU0tJUF9aCQkweDAxCisjZGVmaW5lIFNBVkFHRV9TS0lQX1cJCTB4MDIKKyNkZWZpbmUgU0FWQUdFX1NLSVBfQzAJCTB4MDQKKyNkZWZpbmUgU0FWQUdFX1NLSVBfQzEJCTB4MDgKKyNkZWZpbmUgU0FWQUdFX1NLSVBfUzAJCTB4MTAKKyNkZWZpbmUgU0FWQUdFX1NLSVBfVDAJCTB4MjAKKyNkZWZpbmUgU0FWQUdFX1NLSVBfU1QwCQkweDMwCisjZGVmaW5lIFNBVkFHRV9TS0lQX1MxCQkweDQwCisjZGVmaW5lIFNBVkFHRV9TS0lQX1QxCQkweDgwCisjZGVmaW5lIFNBVkFHRV9TS0lQX1NUMQkJMHhjMAorI2RlZmluZSBTQVZBR0VfU0tJUF9BTExfUzNECTB4M2YKKyNkZWZpbmUgU0FWQUdFX1NLSVBfQUxMX1M0CTB4ZmYKKworLyogQnVmZmVyIG5hbWVzIGZvciBjbGVhciBjb21tYW5kCisgKi8KKyNkZWZpbmUgU0FWQUdFX0ZST05UCQkweDEKKyNkZWZpbmUgU0FWQUdFX0JBQ0sJCTB4MgorI2RlZmluZSBTQVZBR0VfREVQVEgJCTB4NAorCisvKiA2NC1iaXQgY29tbWFuZCBoZWFkZXIKKyAqLwordW5pb24gZHJtX3NhdmFnZV9jbWRfaGVhZGVyIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZDsJLyogY29tbWFuZCAqLworCQl1bnNpZ25lZCBjaGFyIHBhZDA7CisJCXVuc2lnbmVkIHNob3J0IHBhZDE7CisJCXVuc2lnbmVkIHNob3J0IHBhZDI7CisJCXVuc2lnbmVkIHNob3J0IHBhZDM7CisJfSBjbWQ7CQkJLyogZ2VuZXJpYyAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kOworCQl1bnNpZ25lZCBjaGFyIGdsb2JhbDsJLyogbmVlZCBpZGxlIGVuZ2luZT8gKi8KKwkJdW5zaWduZWQgc2hvcnQgY291bnQ7CS8qIG51bWJlciBvZiBjb25zZWN1dGl2ZSByZWdpc3RlcnMgKi8KKwkJdW5zaWduZWQgc2hvcnQgc3RhcnQ7CS8qIGZpcnN0IHJlZ2lzdGVyICovCisJCXVuc2lnbmVkIHNob3J0IHBhZDM7CisJfSBzdGF0ZTsJCS8qIFNBVkFHRV9DTURfU1RBVEUgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZDsKKwkJdW5zaWduZWQgY2hhciBwcmltOwkvKiBwcmltaXRpdmUgdHlwZSAqLworCQl1bnNpZ25lZCBzaG9ydCBza2lwOwkvKiB2ZXJ0ZXggZm9ybWF0IChza2lwIGZsYWdzKSAqLworCQl1bnNpZ25lZCBzaG9ydCBjb3VudDsJLyogbnVtYmVyIG9mIHZlcnRpY2VzICovCisJCXVuc2lnbmVkIHNob3J0IHN0YXJ0OwkvKiBmaXJzdCB2ZXJ0ZXggaW4gRE1BL3ZlcnRleCBidWZmZXIgKi8KKwl9IHByaW07CQkJLyogU0FWQUdFX0NNRF9ETUFfUFJJTSwgU0FWQUdFX0NNRF9WQl9QUklNICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWQ7CisJCXVuc2lnbmVkIGNoYXIgcHJpbTsKKwkJdW5zaWduZWQgc2hvcnQgc2tpcDsKKwkJdW5zaWduZWQgc2hvcnQgY291bnQ7CS8qIG51bWJlciBvZiBpbmRpY2VzIHRoYXQgZm9sbG93ICovCisJCXVuc2lnbmVkIHNob3J0IHBhZDM7CisJfSBpZHg7CQkJLyogU0FWQUdFX0NNRF9ETUFfSURYLCBTQVZBR0VfQ01EX1ZCX0lEWCAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kOworCQl1bnNpZ25lZCBjaGFyIHBhZDA7CisJCXVuc2lnbmVkIHNob3J0IHBhZDE7CisJCXVuc2lnbmVkIGludCBmbGFnczsKKwl9IGNsZWFyMDsJCS8qIFNBVkFHRV9DTURfQ0xFQVIgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgbWFzazsKKwkJdW5zaWduZWQgaW50IHZhbHVlOworCX0gY2xlYXIxOwkJLyogU0FWQUdFX0NNRF9DTEVBUiBkYXRhICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL3Npc19kcm0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL3Npc19kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGY3YjM4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vc2lzX2RybS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIHNpc19kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3Igc2lzIGRyaXZlciAtKi0gbGludXgtYyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBFcmljIEFuaG9sdAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19TSVNfRFJNX0hfXworI2RlZmluZSBfX1NJU19EUk1fSF9fCisKKy8qIFNpUyBzcGVjaWZpYyBpb2N0bHMgKi8KKyNkZWZpbmUgTk9UX1VTRURfMF8zCisjZGVmaW5lIERSTV9TSVNfRkJfQUxMT0MJMHgwNAorI2RlZmluZSBEUk1fU0lTX0ZCX0ZSRUUJICAgICAgICAweDA1CisjZGVmaW5lIE5PVF9VU0VEXzZfMTIKKyNkZWZpbmUgRFJNX1NJU19BR1BfSU5JVAkweDEzCisjZGVmaW5lIERSTV9TSVNfQUdQX0FMTE9DCTB4MTQKKyNkZWZpbmUgRFJNX1NJU19BR1BfRlJFRQkweDE1CisjZGVmaW5lIERSTV9TSVNfRkJfSU5JVAkgICAgICAgIDB4MTYKKworI2RlZmluZSBEUk1fSU9DVExfU0lTX0ZCX0FMTE9DCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1NJU19GQl9BTExPQywgZHJtX3Npc19tZW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19GQl9GUkVFCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1NJU19GQl9GUkVFLCBkcm1fc2lzX21lbV90KQorI2RlZmluZSBEUk1fSU9DVExfU0lTX0FHUF9JTklUCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1NJU19BR1BfSU5JVCwgZHJtX3Npc19hZ3BfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19BR1BfQUxMT0MJCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0lTX0FHUF9BTExPQywgZHJtX3Npc19tZW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19BR1BfRlJFRQkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfQUdQX0ZSRUUsIGRybV9zaXNfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkJfSU5JVAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfRkJfSU5JVCwgZHJtX3Npc19mYl90KQorLyoKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19GTElQCQlEUk1fSU9XKCAweDQ4LCBkcm1fc2lzX2ZsaXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19GTElQX0lOSVQJCURSTV9JTyggIDB4NDkpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkxJUF9GSU5BTAlEUk1fSU8oICAweDUwKQorKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBjb250ZXh0OworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgbG9uZyBmcmVlOworfSBkcm1fc2lzX21lbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG9mZnNldCwgc2l6ZTsKK30gZHJtX3Npc19hZ3BfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBvZmZzZXQsIHNpemU7Cit9IGRybV9zaXNfZmJfdDsKKworI2VuZGlmCQkJCS8qIF9fU0lTX0RSTV9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL3ZpYV9kcm0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL3ZpYV9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGE0YWMyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vdmlhX2RybS5oCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwMyBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAzIFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWSUEsIFMzIEdSQVBISUNTLCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfVklBX0RSTV9IXworI2RlZmluZSBfVklBX0RSTV9IXworCisjaW5jbHVkZSA8ZHJtL2RybS5oPgorCisvKiBXQVJOSU5HOiBUaGVzZSBkZWZpbmVzIG11c3QgYmUgdGhlIHNhbWUgYXMgd2hhdCB0aGUgWHNlcnZlciB1c2VzLgorICogaWYgeW91IGNoYW5nZSB0aGVtLCB5b3UgbXVzdCBjaGFuZ2UgdGhlIGRlZmluZXMgaW4gdGhlIFhzZXJ2ZXIuCisgKi8KKworI2lmbmRlZiBfVklBX0RFRklORVNfCisjZGVmaW5lIF9WSUFfREVGSU5FU18KKworI2luY2x1ZGUgPGRybS92aWFfZHJtY2xpZW50Lmg+CisKKyNkZWZpbmUgVklBX05SX1NBUkVBX0NMSVBSRUNUUwkJOAorI2RlZmluZSBWSUFfTlJfWFZNQ19QT1JUUyAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFZJQV9OUl9YVk1DX0xPQ0tTICAgICAgICAgICAgICAgNQorI2RlZmluZSBWSUFfTUFYX0NBQ0hFTElORV9TSVpFICAgICAgICAgIDY0CisjZGVmaW5lIFhWTUNMT0NLUFRSKHNhUHJpdixsb2NrTm8pCQkJCQlcCisJKChfX3ZvbGF0aWxlX18gc3RydWN0IGRybV9od19sb2NrICopKCgoKCh1bnNpZ25lZCBsb25nKSAoc2FQcml2KS0+WHZNQ0xvY2tBcmVhKSArIFwKKwkJCQkgICAgICAoVklBX01BWF9DQUNIRUxJTkVfU0laRSAtIDEpKSAmCVwKKwkJCQkgICAgIH4oVklBX01BWF9DQUNIRUxJTkVfU0laRSAtIDEpKSArCVwKKwkJCQkgICAgVklBX01BWF9DQUNIRUxJTkVfU0laRSoobG9ja05vKSkpCisKKy8qIEVhY2ggcmVnaW9uIGlzIGEgbWluaW11bSBvZiA2NGssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCA2NCBvZiB0aGVtLgorICovCisjZGVmaW5lIFZJQV9OUl9URVhfUkVHSU9OUyA2NAorI2RlZmluZSBWSUFfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUgMTYKKyNlbmRpZgorCisjZGVmaW5lIFZJQV9VUExPQURfVEVYMElNQUdFICAweDEJLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIFZJQV9VUExPQURfVEVYMUlNQUdFICAweDIJLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIFZJQV9VUExPQURfQ1RYICAgICAgICAweDQKKyNkZWZpbmUgVklBX1VQTE9BRF9CVUZGRVJTICAgIDB4OAorI2RlZmluZSBWSUFfVVBMT0FEX1RFWDAgICAgICAgMHgxMAorI2RlZmluZSBWSUFfVVBMT0FEX1RFWDEgICAgICAgMHgyMAorI2RlZmluZSBWSUFfVVBMT0FEX0NMSVBSRUNUUyAgMHg0MAorI2RlZmluZSBWSUFfVVBMT0FEX0FMTCAgICAgICAgMHhmZgorCisvKiBWSUEgc3BlY2lmaWMgaW9jdGxzICovCisjZGVmaW5lIERSTV9WSUFfQUxMT0NNRU0JMHgwMAorI2RlZmluZSBEUk1fVklBX0ZSRUVNRU0JICAgICAgICAweDAxCisjZGVmaW5lIERSTV9WSUFfQUdQX0lOSVQJMHgwMgorI2RlZmluZSBEUk1fVklBX0ZCX0lOSVQJICAgICAgICAweDAzCisjZGVmaW5lIERSTV9WSUFfTUFQX0lOSVQJMHgwNAorI2RlZmluZSBEUk1fVklBX0RFQ19GVVRFWCAgICAgICAweDA1CisjZGVmaW5lIE5PVF9VU0VECisjZGVmaW5lIERSTV9WSUFfRE1BX0lOSVQJMHgwNworI2RlZmluZSBEUk1fVklBX0NNREJVRkZFUgkweDA4CisjZGVmaW5lIERSTV9WSUFfRkxVU0gJICAgICAgICAweDA5CisjZGVmaW5lIERSTV9WSUFfUENJQ01ECSAgICAgICAgMHgwYQorI2RlZmluZSBEUk1fVklBX0NNREJVRl9TSVpFCTB4MGIKKyNkZWZpbmUgTk9UX1VTRUQKKyNkZWZpbmUgRFJNX1ZJQV9XQUlUX0lSUSAgICAgICAgMHgwZAorI2RlZmluZSBEUk1fVklBX0RNQV9CTElUICAgICAgICAweDBlCisjZGVmaW5lIERSTV9WSUFfQkxJVF9TWU5DICAgICAgIDB4MGYKKworI2RlZmluZSBEUk1fSU9DVExfVklBX0FMTE9DTUVNCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfQUxMT0NNRU0sIGRybV92aWFfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfRlJFRU1FTQkgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0ZSRUVNRU0sIGRybV92aWFfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfQUdQX0lOSVQJICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9BR1BfSU5JVCwgZHJtX3ZpYV9hZ3BfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9GQl9JTklUCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfRkJfSU5JVCwgZHJtX3ZpYV9mYl90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX01BUF9JTklUCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfTUFQX0lOSVQsIGRybV92aWFfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0RFQ19GVVRFWCAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0RFQ19GVVRFWCwgZHJtX3ZpYV9mdXRleF90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0RNQV9JTklUCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfRE1BX0lOSVQsIGRybV92aWFfZG1hX2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9DTURCVUZGRVIJICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9DTURCVUZGRVIsIGRybV92aWFfY21kYnVmZmVyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfRkxVU0gJICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9GTFVTSCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9QQ0lDTUQJICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9QQ0lDTUQsIGRybV92aWFfY21kYnVmZmVyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfQ01EQlVGX1NJWkUgRFJNX0lPV1IoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0NNREJVRl9TSVpFLCBcCisJCQkJCSAgICBkcm1fdmlhX2NtZGJ1Zl9zaXplX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfV0FJVF9JUlEgICAgRFJNX0lPV1IoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX1dBSVRfSVJRLCBkcm1fdmlhX2lycXdhaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9ETUFfQkxJVCAgICBEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0RNQV9CTElULCBkcm1fdmlhX2RtYWJsaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9CTElUX1NZTkMgICBEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0JMSVRfU1lOQywgZHJtX3ZpYV9ibGl0c3luY190KQorCisvKiBJbmRpY2VzIGludG8gYnVmLlNldHVwIHdoZXJlIHZhcmlvdXMgYml0cyBvZiBzdGF0ZSBhcmUgbWlycm9yZWQgcGVyCisgKiBjb250ZXh0IGFuZCBwZXIgYnVmZmVyLiAgVGhlc2UgY2FuIGJlIGZpcmVkIGF0IHRoZSBjYXJkIGFzIGEgdW5pdCwKKyAqIG9yIGluIGEgcGllY2V3aXNlIGZhc2hpb24gYXMgcmVxdWlyZWQuCisgKi8KKworI2RlZmluZSBWSUFfVEVYX1NFVFVQX1NJWkUgOAorCisvKiBGbGFncyBmb3IgY2xlYXIgaW9jdGwKKyAqLworI2RlZmluZSBWSUFfRlJPTlQgICAweDEKKyNkZWZpbmUgVklBX0JBQ0sgICAgMHgyCisjZGVmaW5lIFZJQV9ERVBUSCAgIDB4NAorI2RlZmluZSBWSUFfU1RFTkNJTCAweDgKKyNkZWZpbmUgVklBX01FTV9WSURFTyAgIDAJLyogbWF0Y2hlcyBkcm0gY29uc3RhbnQgKi8KKyNkZWZpbmUgVklBX01FTV9BR1AgICAgIDEJLyogbWF0Y2hlcyBkcm0gY29uc3RhbnQgKi8KKyNkZWZpbmUgVklBX01FTV9TWVNURU0gIDIKKyNkZWZpbmUgVklBX01FTV9NSVhFRCAgIDMKKyNkZWZpbmUgVklBX01FTV9VTktOT1dOIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fdTMyIG9mZnNldDsKKwlfX3UzMiBzaXplOworfSBkcm1fdmlhX2FncF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJX191MzIgb2Zmc2V0OworCV9fdTMyIHNpemU7Cit9IGRybV92aWFfZmJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fdTMyIGNvbnRleHQ7CisJX191MzIgdHlwZTsKKwlfX3UzMiBzaXplOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7Cit9IGRybV92aWFfbWVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2luaXQgeworCWVudW0geworCQlWSUFfSU5JVF9NQVAgPSAweDAxLAorCQlWSUFfQ0xFQU5VUF9NQVAgPSAweDAyCisJfSBmdW5jOworCisJdW5zaWduZWQgbG9uZyBzYXJlYV9wcml2X29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZiX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYWdwQWRkcjsKK30gZHJtX3ZpYV9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2Z1dGV4IHsKKwllbnVtIHsKKwkJVklBX0ZVVEVYX1dBSVQgPSAweDAwLAorCQlWSUFfRlVURVhfV0FLRSA9IDBYMDEKKwl9IGZ1bmM7CisJX191MzIgbXM7CisJX191MzIgbG9jazsKKwlfX3UzMiB2YWw7Cit9IGRybV92aWFfZnV0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfZG1hX2luaXQgeworCWVudW0geworCQlWSUFfSU5JVF9ETUEgPSAweDAxLAorCQlWSUFfQ0xFQU5VUF9ETUEgPSAweDAyLAorCQlWSUFfRE1BX0lOSVRJQUxJWkVEID0gMHgwMworCX0gZnVuYzsKKworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHJlZ19wYXVzZV9hZGRyOworfSBkcm1fdmlhX2RtYV9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2NtZGJ1ZmZlciB7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKK30gZHJtX3ZpYV9jbWRidWZmZXJfdDsKKworLyogV2FybmluZzogSWYgeW91IGNoYW5nZSB0aGUgU0FSRUEgc3RydWN0dXJlIHlvdSBtdXN0IGNoYW5nZSB0aGUgWHNlcnZlcgorICogc3RydWN0dXJlIGFzIHdlbGwgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfdGV4X3JlZ2lvbiB7CisJdW5zaWduZWQgY2hhciBuZXh0LCBwcmV2OwkvKiBpbmRpY2VzIHRvIGZvcm0gYSBjaXJjdWxhciBMUlUgICovCisJdW5zaWduZWQgY2hhciBpblVzZTsJLyogb3duZWQgYnkgYSBjbGllbnQsIG9yIGZyZWU/ICovCisJaW50IGFnZTsJCS8qIHRyYWNrZWQgYnkgY2xpZW50cyB0byB1cGRhdGUgbG9jYWwgTFJVJ3MgKi8KK30gZHJtX3ZpYV90ZXhfcmVnaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX3NhcmVhIHsKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisJdW5zaWduZWQgaW50IG5ib3g7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbVklBX05SX1NBUkVBX0NMSVBSRUNUU107CisJZHJtX3ZpYV90ZXhfcmVnaW9uX3QgdGV4TGlzdFtWSUFfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwlpbnQgdGV4QWdlOwkJLyogbGFzdCB0aW1lIHRleHR1cmUgd2FzIHVwbG9hZGVkICovCisJaW50IGN0eE93bmVyOwkJLyogbGFzdCBjb250ZXh0IHRvIHVwbG9hZCBzdGF0ZSAqLworCWludCB2ZXJ0ZXhQcmltOworCisJLyoKKwkgKiBCZWxvdyBpcyBmb3IgWHZNQy4KKwkgKiBXZSB3YW50IHRoZSBsb2NrIGludGVnZXJzIGFsb25lIG9uLCBhbmQgYWxpZ25lZCB0bywgYSBjYWNoZSBsaW5lLgorCSAqIFRoZXJlZm9yZSB0aGlzIHNvbWV3aGF0IHN0cmFuZ2UgY29uc3RydWN0LgorCSAqLworCisJY2hhciBYdk1DTG9ja0FyZWFbVklBX01BWF9DQUNIRUxJTkVfU0laRSAqIChWSUFfTlJfWFZNQ19MT0NLUyArIDEpXTsKKworCXVuc2lnbmVkIGludCBYdk1DRGlzcGxheWluZ1tWSUFfTlJfWFZNQ19QT1JUU107CisJdW5zaWduZWQgaW50IFh2TUNTdWJQaWNPbltWSUFfTlJfWFZNQ19QT1JUU107CisJdW5zaWduZWQgaW50IFh2TUNDdHhOb0dyYWJiZWQ7CS8qIExhc3QgY29udGV4dCB0byBob2xkIGRlY29kZXIgKi8KKworCS8qIFVzZWQgYnkgdGhlIDNkIGRyaXZlciBvbmx5IGF0IHRoaXMgcG9pbnQsIGZvciBwYWdlZmxpcHBpbmc6CisJICovCisJdW5zaWduZWQgaW50IHBmQ3VycmVudE9mZnNldDsKK30gZHJtX3ZpYV9zYXJlYV90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV9jbWRidWZfc2l6ZSB7CisJZW51bSB7CisJCVZJQV9DTURCVUZfU1BBQ0UgPSAweDAxLAorCQlWSUFfQ01EQlVGX0xBRyA9IDB4MDIKKwl9IGZ1bmM7CisJaW50IHdhaXQ7CisJX191MzIgc2l6ZTsKK30gZHJtX3ZpYV9jbWRidWZfc2l6ZV90OworCit0eXBlZGVmIGVudW0geworCVZJQV9JUlFfQUJTT0xVVEUgPSAweDAsCisJVklBX0lSUV9SRUxBVElWRSA9IDB4MSwKKwlWSUFfSVJRX1NJR05BTCA9IDB4MTAwMDAwMDAsCisJVklBX0lSUV9GT1JDRV9TRVFVRU5DRSA9IDB4MjAwMDAwMDAKK30gdmlhX2lycV9zZXFfdHlwZV90OworCisjZGVmaW5lIFZJQV9JUlFfRkxBR1NfTUFTSyAweEYwMDAwMDAwCisKK2VudW0gZHJtX3ZpYV9pcnFzIHsKKwlkcm1fdmlhX2lycV9ocXYwID0gMCwKKwlkcm1fdmlhX2lycV9ocXYxLAorCWRybV92aWFfaXJxX2RtYTBfZGQsCisJZHJtX3ZpYV9pcnFfZG1hMF90ZCwKKwlkcm1fdmlhX2lycV9kbWExX2RkLAorCWRybV92aWFfaXJxX2RtYTFfdGQsCisJZHJtX3ZpYV9pcnFfbnVtCit9OworCitzdHJ1Y3QgZHJtX3ZpYV93YWl0X2lycV9yZXF1ZXN0IHsKKwl1bnNpZ25lZCBpcnE7CisJdmlhX2lycV9zZXFfdHlwZV90IHR5cGU7CisJX191MzIgc2VxdWVuY2U7CisJX191MzIgc2lnbmFsOworfTsKKwordHlwZWRlZiB1bmlvbiBkcm1fdmlhX2lycXdhaXQgeworCXN0cnVjdCBkcm1fdmlhX3dhaXRfaXJxX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcGx5IHJlcGx5OworfSBkcm1fdmlhX2lycXdhaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3ZpYV9ibGl0c3luYyB7CisJX191MzIgc3luY19oYW5kbGU7CisJdW5zaWduZWQgZW5naW5lOworfSBkcm1fdmlhX2JsaXRzeW5jX3Q7CisKKy8qIC0gKiBCZWxvdywiZmxhZ3MiIGlzIGN1cnJlbnRseSB1bnVzZWQgYnV0IHdpbGwgYmUgdXNlZCBmb3IgcG9zc2libGUgZnV0dXJlCisgKiBleHRlbnNpb25zIGxpa2Uga2VybmVsIHNwYWNlIGJvdW5jZSBidWZmZXJzIGZvciBiYWQgYWxpZ25tZW50cyBhbmQKKyAqIGJsaXQgZW5naW5lIGJ1c3ktd2FpdCBwb2xsaW5nIGZvciBiZXR0ZXIgbGF0ZW5jeSBpbiB0aGUgYWJzZW5jZSBvZgorICogaW50ZXJydXB0cy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBkcm1fdmlhX2RtYWJsaXQgeworCV9fdTMyIG51bV9saW5lczsKKwlfX3UzMiBsaW5lX2xlbmd0aDsKKworCV9fdTMyIGZiX2FkZHI7CisJX191MzIgZmJfc3RyaWRlOworCisJdW5zaWduZWQgY2hhciAqbWVtX2FkZHI7CisJX191MzIgbWVtX3N0cmlkZTsKKworCV9fdTMyIGZsYWdzOworCWludCB0b19mYjsKKworCWRybV92aWFfYmxpdHN5bmNfdCBzeW5jOworfSBkcm1fdmlhX2RtYWJsaXRfdDsKKworI2VuZGlmCQkJCS8qIF9WSUFfRFJNX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RybS92bXdnZnhfZHJtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2RybS92bXdnZnhfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiMDkxMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL3Ztd2dmeF9kcm0uaApAQCAtMCwwICsxLDc5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDkgVk13YXJlLCBJbmMuLCBQYWxvIEFsdG8sIENBLiwgVVNBCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19WTVdHRlhfRFJNX0hfXworI2RlZmluZSBfX1ZNV0dGWF9EUk1fSF9fCisKKyNkZWZpbmUgRFJNX1ZNV19NQVhfU1VSRkFDRV9GQUNFUyA2CisjZGVmaW5lIERSTV9WTVdfTUFYX01JUF9MRVZFTFMgMjQKKworCisjZGVmaW5lIERSTV9WTVdfR0VUX1BBUkFNICAgICAgICAgICAgMAorI2RlZmluZSBEUk1fVk1XX0FMTE9DX0RNQUJVRiAgICAgICAgIDEKKyNkZWZpbmUgRFJNX1ZNV19VTlJFRl9ETUFCVUYgICAgICAgICAyCisjZGVmaW5lIERSTV9WTVdfQ1VSU09SX0JZUEFTUyAgICAgICAgMworLyogZ3VhcmRlZCBieSBEUk1fVk1XX1BBUkFNX05VTV9TVFJFQU1TICE9IDAqLworI2RlZmluZSBEUk1fVk1XX0NPTlRST0xfU1RSRUFNICAgICAgIDQKKyNkZWZpbmUgRFJNX1ZNV19DTEFJTV9TVFJFQU0gICAgICAgICA1CisjZGVmaW5lIERSTV9WTVdfVU5SRUZfU1RSRUFNICAgICAgICAgNgorLyogZ3VhcmRlZCBieSBEUk1fVk1XX1BBUkFNXzNEID09IDEgKi8KKyNkZWZpbmUgRFJNX1ZNV19DUkVBVEVfQ09OVEVYVCAgICAgICA3CisjZGVmaW5lIERSTV9WTVdfVU5SRUZfQ09OVEVYVCAgICAgICAgOAorI2RlZmluZSBEUk1fVk1XX0NSRUFURV9TVVJGQUNFICAgICAgIDkKKyNkZWZpbmUgRFJNX1ZNV19VTlJFRl9TVVJGQUNFICAgICAgICAxMAorI2RlZmluZSBEUk1fVk1XX1JFRl9TVVJGQUNFICAgICAgICAgIDExCisjZGVmaW5lIERSTV9WTVdfRVhFQ0JVRiAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgRFJNX1ZNV19HRVRfM0RfQ0FQICAgICAgICAgICAxMworI2RlZmluZSBEUk1fVk1XX0ZFTkNFX1dBSVQgICAgICAgICAgIDE0CisjZGVmaW5lIERSTV9WTVdfRkVOQ0VfU0lHTkFMRUQgICAgICAgMTUKKyNkZWZpbmUgRFJNX1ZNV19GRU5DRV9VTlJFRiAgICAgICAgICAxNgorI2RlZmluZSBEUk1fVk1XX0ZFTkNFX0VWRU5UICAgICAgICAgIDE3CisjZGVmaW5lIERSTV9WTVdfUFJFU0VOVCAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgRFJNX1ZNV19QUkVTRU5UX1JFQURCQUNLICAgICAxOQorI2RlZmluZSBEUk1fVk1XX1VQREFURV9MQVlPVVQgICAgICAgIDIwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0dFVF9QQVJBTSAtIGdldCBkZXZpY2UgaW5mb3JtYXRpb24uCisgKgorICogRFJNX1ZNV19QQVJBTV9GSUZPX09GRlNFVDoKKyAqIE9mZnNldCB0byB1c2UgdG8gbWFwIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBGSUZPIHJlYWQtb25seS4KKyAqIFRoZSBmaWZvIGlzIG1hcHBlZCB1c2luZyB0aGUgbW1hcCgpIHN5c3RlbSBjYWxsIG9uIHRoZSBkcm0gZGV2aWNlLgorICoKKyAqIERSTV9WTVdfUEFSQU1fT1ZFUkxBWV9JT0NUTDoKKyAqIERvZXMgdGhlIGRyaXZlciBzdXBwb3J0IHRoZSBvdmVybGF5IGlvY3RsLgorICovCisKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV9OVU1fU1RSRUFNUyAgICAgIDAKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV9OVU1fRlJFRV9TVFJFQU1TIDEKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV8zRCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV9IV19DQVBTICAgICAgICAgIDMKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV9GSUZPX0NBUFMgICAgICAgIDQKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV9NQVhfRkJfU0laRSAgICAgIDUKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV9GSUZPX0hXX1ZFUlNJT04gIDYKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19nZXRwYXJhbV9hcmcKKyAqCisgKiBAdmFsdWU6IFJldHVybmVkIHZhbHVlLiAvL091dAorICogQHBhcmFtOiBQYXJhbWV0ZXIgdG8gcXVlcnkuIC8vSW4uCisgKgorICogQXJndW1lbnQgdG8gdGhlIERSTV9WTVdfR0VUX1BBUkFNIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X2dldHBhcmFtX2FyZyB7CisJdWludDY0X3QgdmFsdWU7CisJdWludDMyX3QgcGFyYW07CisJdWludDMyX3QgcGFkNjQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19DUkVBVEVfQ09OVEVYVCAtIENyZWF0ZSBhIGhvc3QgY29udGV4dC4KKyAqCisgKiBBbGxvY2F0ZXMgYSBkZXZpY2UgdW5pcXVlIGNvbnRleHQgaWQsIGFuZCBxdWV1ZXMgYSBjcmVhdGUgY29udGV4dCBjb21tYW5kCisgKiBmb3IgdGhlIGhvc3QuIERvZXMgbm90IHdhaXQgZm9yIGhvc3QgY29tcGxldGlvbi4KKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2NvbnRleHRfYXJnCisgKgorICogQGNpZDogRGV2aWNlIHVuaXF1ZSBjb250ZXh0IElELgorICoKKyAqIE91dHB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19DUkVBVEVfQ09OVEVYVCBJb2N0bC4KKyAqIElucHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX1VOUkVGX0NPTlRFWFQgSW9jdGwuCisgKi8KKworc3RydWN0IGRybV92bXdfY29udGV4dF9hcmcgeworCWludDMyX3QgY2lkOworCXVpbnQzMl90IHBhZDY0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfVU5SRUZfQ09OVEVYVCAtIENyZWF0ZSBhIGhvc3QgY29udGV4dC4KKyAqCisgKiBGcmVlcyBhIGdsb2JhbCBjb250ZXh0IGlkLCBhbmQgcXVldWVzIGEgZGVzdHJveSBob3N0IGNvbW1hbmQgZm9yIHRoZSBob3N0LgorICogRG9lcyBub3Qgd2FpdCBmb3IgaG9zdCBjb21wbGV0aW9uLiBUaGUgY29udGV4dCBJRCBjYW4gYmUgdXNlZCBkaXJlY3RseQorICogaW4gdGhlIGNvbW1hbmQgc3RyZWFtIGFuZCBzaG93cyB1cCBhcyB0aGUgc2FtZSBjb250ZXh0IElEIG9uIHRoZSBob3N0LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0NSRUFURV9TVVJGQUNFIC0gQ3JlYXRlIGEgaG9zdCBzdWZhY2UuCisgKgorICogQWxsb2NhdGVzIGEgZGV2aWNlIHVuaXF1ZSBzdXJmYWNlIGlkLCBhbmQgcXVldWVzIGEgY3JlYXRlIHN1cmZhY2UgY29tbWFuZAorICogZm9yIHRoZSBob3N0LiBEb2VzIG5vdCB3YWl0IGZvciBob3N0IGNvbXBsZXRpb24uIFRoZSBzdXJmYWNlIElEIGNhbiBiZQorICogdXNlZCBkaXJlY3RseSBpbiB0aGUgY29tbWFuZCBzdHJlYW0gYW5kIHNob3dzIHVwIGFzIHRoZSBzYW1lIHN1cmZhY2UKKyAqIElEIG9uIHRoZSBob3N0LgorICovCisKKy8qKgorICogc3RydWN0IGRybV93bXZfc3VyZmFjZV9jcmVhdGVfcmVxCisgKgorICogQGZsYWdzOiBTdXJmYWNlIGZsYWdzIGFzIHVuZGVyc3Rvb2QgYnkgdGhlIGhvc3QuCisgKiBAZm9ybWF0OiBTdXJmYWNlIGZvcm1hdCBhcyB1bmRlcnN0b29kIGJ5IHRoZSBob3N0LgorICogQG1pcF9sZXZlbHM6IE51bWJlciBvZiBtaXAgbGV2ZWxzIGZvciBlYWNoIGZhY2UuCisgKiBBbiB1bnVzZWQgZmFjZSBzaG91bGQgaGF2ZSAwIGVuY29kZWQuCisgKiBAc2l6ZV9hZGRyOiBBZGRyZXNzIG9mIGEgdXNlci1zcGFjZSBhcnJheSBvZiBzcnVjdCBkcm1fdm13X3NpemUKKyAqIGNhc3QgdG8gYW4gdWludDY0X3QgZm9yIDMyLTY0IGJpdCBjb21wYXRpYmlsaXR5LgorICogVGhlIHNpemUgb2YgdGhlIGFycmF5IHNob3VsZCBlcXVhbCB0aGUgdG90YWwgbnVtYmVyIG9mIG1pcG1hcCBsZXZlbHMuCisgKiBAc2hhcmVhYmxlOiBCb29sZWFuIHdoZXRoZXIgb3RoZXIgY2xpZW50cyAoYXMgaWRlbnRpZmllZCBieSBmaWxlIGRlc2NyaXB0b3JzKQorICogbWF5IHJlZmVyZW5jZSB0aGlzIHN1cmZhY2UuCisgKiBAc2Nhbm91dDogQm9vbGVhbiB3aGV0aGVyIHRoZSBzdXJmYWNlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgYQorICogc2Nhbm91dC4KKyAqCisgKiBJbnB1dCBkYXRhIHRvIHRoZSBEUk1fVk1XX0NSRUFURV9TVVJGQUNFIElvY3RsLgorICogT3V0cHV0IGRhdGEgZnJvbSB0aGUgRFJNX1ZNV19SRUZfU1VSRkFDRSBJb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19zdXJmYWNlX2NyZWF0ZV9yZXEgeworCXVpbnQzMl90IGZsYWdzOworCXVpbnQzMl90IGZvcm1hdDsKKwl1aW50MzJfdCBtaXBfbGV2ZWxzW0RSTV9WTVdfTUFYX1NVUkZBQ0VfRkFDRVNdOworCXVpbnQ2NF90IHNpemVfYWRkcjsKKwlpbnQzMl90IHNoYXJlYWJsZTsKKwlpbnQzMl90IHNjYW5vdXQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fd212X3N1cmZhY2VfYXJnCisgKgorICogQHNpZDogU3VyZmFjZSBpZCBvZiBjcmVhdGVkIHN1cmZhY2Ugb3Igc3VyZmFjZSB0byBkZXN0cm95IG9yIHJlZmVyZW5jZS4KKyAqCisgKiBPdXRwdXQgZGF0YSBmcm9tIHRoZSBEUk1fVk1XX0NSRUFURV9TVVJGQUNFIElvY3RsLgorICogSW5wdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfVU5SRUZfU1VSRkFDRSBJb2N0bC4KKyAqIElucHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX1JFRl9TVVJGQUNFIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X3N1cmZhY2VfYXJnIHsKKwlpbnQzMl90IHNpZDsKKwl1aW50MzJfdCBwYWQ2NDsKK307CisKKy8qKgorICogc3RydWN0IGRybV92bXdfc2l6ZSBpb2N0bC4KKyAqCisgKiBAd2lkdGggLSBtaXAgbGV2ZWwgd2lkdGgKKyAqIEBoZWlnaHQgLSBtaXAgbGV2ZWwgaGVpZ2h0CisgKiBAZGVwdGggLSBtaXAgbGV2ZWwgZGVwdGgKKyAqCisgKiBEZXNjcmlwdGlvbiBvZiBhIG1pcCBsZXZlbC4KKyAqIElucHV0IGRhdGEgdG8gdGhlIERSTV9XTVdfQ1JFQVRFX1NVUkZBQ0UgSW9jdGwuCisgKi8KKworc3RydWN0IGRybV92bXdfc2l6ZSB7CisJdWludDMyX3Qgd2lkdGg7CisJdWludDMyX3QgaGVpZ2h0OworCXVpbnQzMl90IGRlcHRoOworCXVpbnQzMl90IHBhZDY0OworfTsKKworLyoqCisgKiB1bmlvbiBkcm1fdm13X3N1cmZhY2VfY3JlYXRlX2FyZworICoKKyAqIEByZXA6IE91dHB1dCBkYXRhIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqIEByZXE6IElucHV0IGRhdGEgYXMgZGVzY3JpYmVkIGFib3ZlLgorICoKKyAqIEFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0NSRUFURV9TVVJGQUNFIElvY3RsLgorICovCisKK3VuaW9uIGRybV92bXdfc3VyZmFjZV9jcmVhdGVfYXJnIHsKKwlzdHJ1Y3QgZHJtX3Ztd19zdXJmYWNlX2FyZyByZXA7CisJc3RydWN0IGRybV92bXdfc3VyZmFjZV9jcmVhdGVfcmVxIHJlcTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX1JFRl9TVVJGQUNFIC0gUmVmZXJlbmNlIGEgaG9zdCBzdXJmYWNlLgorICoKKyAqIFB1dHMgYSByZWZlcmVuY2Ugb24gYSBob3N0IHN1cmZhY2Ugd2l0aCBhIGdpdmUgc2lkLCBhcyBwcmV2aW91c2x5CisgKiByZXR1cm5lZCBieSB0aGUgRFJNX1ZNV19DUkVBVEVfU1VSRkFDRSBpb2N0bC4KKyAqIEEgcmVmZXJlbmNlIHdpbGwgbWFrZSBzdXJlIHRoZSBzdXJmYWNlIGlzbid0IGRlc3Ryb3llZCB3aGlsZSB3ZSBob2xkCisgKiBpdCBhbmQgd2lsbCBhbGxvdyB0aGUgY2FsbGluZyBjbGllbnQgdG8gdXNlIHRoZSBzdXJmYWNlIElEIGluIHRoZSBjb21tYW5kCisgKiBzdHJlYW0uCisgKgorICogT24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBJb2N0bCByZXR1cm5zIHRoZSBzdXJmYWNlIGluZm9ybWF0aW9uIGdpdmVuCisgKiBpbiB0aGUgRFJNX1ZNV19DUkVBVEVfU1VSRkFDRSBpb2N0bC4KKyAqLworCisvKioKKyAqIHVuaW9uIGRybV92bXdfc3VyZmFjZV9yZWZlcmVuY2VfYXJnCisgKgorICogQHJlcDogT3V0cHV0IGRhdGEgYXMgZGVzY3JpYmVkIGFib3ZlLgorICogQHJlcTogSW5wdXQgZGF0YSBhcyBkZXNjcmliZWQgYWJvdmUuCisgKgorICogQXJndW1lbnQgdG8gdGhlIERSTV9WTVdfUkVGX1NVUkZBQ0UgSW9jdGwuCisgKi8KKwordW5pb24gZHJtX3Ztd19zdXJmYWNlX3JlZmVyZW5jZV9hcmcgeworCXN0cnVjdCBkcm1fdm13X3N1cmZhY2VfY3JlYXRlX3JlcSByZXA7CisJc3RydWN0IGRybV92bXdfc3VyZmFjZV9hcmcgcmVxOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfVU5SRUZfU1VSRkFDRSAtIFVucmVmZXJlbmNlIGEgaG9zdCBzdXJmYWNlLgorICoKKyAqIENsZWFyIGEgcmVmZXJlbmNlIHByZXZpb3VzbHkgcHV0IG9uIGEgaG9zdCBzdXJmYWNlLgorICogV2hlbiBhbGwgcmVmZXJlbmNlcyBhcmUgZ29uZSwgaW5jbHVkaW5nIHRoZSBvbmUgaW1wbGljaXRseSBwbGFjZWQKKyAqIG9uIGNyZWF0aW9uLAorICogYSBkZXN0cm95IHN1cmZhY2UgY29tbWFuZCB3aWxsIGJlIHF1ZXVlZCBmb3IgdGhlIGhvc3QuCisgKiBEb2VzIG5vdCB3YWl0IGZvciBjb21wbGV0aW9uLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0VYRUNCVUYKKyAqCisgKiBTdWJtaXQgYSBjb21tYW5kIGJ1ZmZlciBmb3IgZXhlY3V0aW9uIG9uIHRoZSBob3N0LCBhbmQgcmV0dXJuIGEKKyAqIGZlbmNlIHNlcW5vIHRoYXQgd2hlbiBzaWduYWxlZCwgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbW1hbmQgYnVmZmVyIGhhcworICogZXhlY3V0ZWQuCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19leGVjYnVmX2FyZworICoKKyAqIEBjb21tYW5kczogVXNlci1zcGFjZSBhZGRyZXNzIG9mIGEgY29tbWFuZCBidWZmZXIgY2FzdCB0byBhbiB1aW50NjRfdC4KKyAqIEBjb21tYW5kLXNpemU6IFNpemUgaW4gYnl0ZXMgb2YgdGhlIGNvbW1hbmQgYnVmZmVyLgorICogQHRocm90dGxlLXVzOiBTbGVlcCB1bnRpbCBzb2Z0d2FyZSBpcyBsZXNzIHRoYW4gQHRocm90dGxlX3VzCisgKiBtaWNyb3NlY29uZHMgYWhlYWQgb2YgaGFyZHdhcmUuIFRoZSBkcml2ZXIgbWF5IHJvdW5kIHRoaXMgdmFsdWUKKyAqIHRvIHRoZSBuZWFyZXN0IGtlcm5lbCB0aWNrLgorICogQGZlbmNlX3JlcDogVXNlci1zcGFjZSBhZGRyZXNzIG9mIGEgc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIGNhc3QgdG8gYW4KKyAqIHVpbnQ2NF90LgorICogQHZlcnNpb246IEFsbG93cyBleHBhbmRpbmcgdGhlIGV4ZWNidWYgaW9jdGwgcGFyYW1ldGVycyB3aXRob3V0IGJyZWFraW5nCisgKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgc2luY2UgdXNlci1zcGFjZSB3aWxsIGFsd2F5cyB0ZWxsIHRoZSBrZXJuZWwKKyAqIHdoaWNoIHZlcnNpb24gaXQgdXNlcy4KKyAqIEBmbGFnczogRXhlY2J1ZiBmbGFncy4gTm9uZSBjdXJyZW50bHkuCisgKgorICogQXJndW1lbnQgdG8gdGhlIERSTV9WTVdfRVhFQ0JVRiBJb2N0bC4KKyAqLworCisjZGVmaW5lIERSTV9WTVdfRVhFQ0JVRl9WRVJTSU9OIDEKKworc3RydWN0IGRybV92bXdfZXhlY2J1Zl9hcmcgeworCXVpbnQ2NF90IGNvbW1hbmRzOworCXVpbnQzMl90IGNvbW1hbmRfc2l6ZTsKKwl1aW50MzJfdCB0aHJvdHRsZV91czsKKwl1aW50NjRfdCBmZW5jZV9yZXA7CisJdWludDMyX3QgdmVyc2lvbjsKKwl1aW50MzJfdCBmbGFnczsKK307CisKKy8qKgorICogc3RydWN0IGRybV92bXdfZmVuY2VfcmVwCisgKgorICogQGhhbmRsZTogRmVuY2Ugb2JqZWN0IGhhbmRsZSBmb3IgZmVuY2UgYXNzb2NpYXRlZCB3aXRoIGEgY29tbWFuZCBzdWJtaXNzaW9uLgorICogQG1hc2s6IEZlbmNlIGZsYWdzIHJlbGV2YW50IGZvciB0aGlzIGZlbmNlIG9iamVjdC4KKyAqIEBzZXFubzogRmVuY2Ugc2VxdWVuY2UgbnVtYmVyIGluIGZpZm8uIEEgZmVuY2Ugb2JqZWN0IHdpdGggYSBsb3dlcgorICogc2Vxbm8gd2lsbCBzaWduYWwgdGhlIEVYRUMgZmxhZyBiZWZvcmUgYSBmZW5jZSBvYmplY3Qgd2l0aCBhIGhpZ2hlcgorICogc2Vxbm8uIFRoaXMgY2FuIGJlIHVzZWQgYnkgdXNlci1zcGFjZSB0byBhdm9pZCBrZXJuZWwgY2FsbHMgdG8gZGV0ZXJtaW5lCisgKiB3aGV0aGVyIGEgZmVuY2UgaGFzIHNpZ25hbGVkIHRoZSBFWEVDIGZsYWcuIE5vdGUgdGhhdCBAc2Vxbm8gd2lsbAorICogd3JhcCBhdCAzMi1iaXQuCisgKiBAcGFzc2VkX3NlcW5vOiBUaGUgaGlnaGVzdCBzZXFubyBudW1iZXIgcHJvY2Vzc2VkIGJ5IHRoZSBoYXJkd2FyZQorICogc28gZmFyLiBUaGlzIGNhbiBiZSB1c2VkIHRvIG1hcmsgdXNlci1zcGFjZSBmZW5jZSBvYmplY3RzIGFzIHNpZ25hbGVkLCBhbmQKKyAqIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZmVuY2Ugc2Vxbm8gbWlnaHQgYmUgc3RhbGUuCisgKiBAZXJyb3I6IFRoaXMgbWVtYmVyIHNob3VsZCd2ZSBiZWVuIHNldCB0byAtRUZBVUxUIG9uIHN1Ym1pc3Npb24uCisgKiBUaGUgZm9sbG93aW5nIGFjdGlvbnMgc2hvdWxkIGJlIHRha2Ugb24gY29tcGxldGlvbjoKKyAqIGVycm9yID09IC1FRkFVTFQ6IEZlbmNlIGNvbW11bmljYXRpb24gZmFpbGVkLiBUaGUgaG9zdCBpcyBzeW5jaHJvbml6ZWQuCisgKiBVc2UgdGhlIGxhc3QgZmVuY2UgaWQgcmVhZCBmcm9tIHRoZSBGSUZPIGZlbmNlIHJlZ2lzdGVyLgorICogZXJyb3IgIT0gMCAmJiBlcnJvciAhPSAtRUZBVUxUOgorICogRmVuY2Ugc3VibWlzc2lvbiBmYWlsZWQuIFRoZSBob3N0IGlzIHN5bmNocm9uaXplZC4gVXNlIHRoZSBmZW5jZV9zZXEgbWVtYmVyLgorICogZXJyb3IgPT0gMDogQWxsIGlzIE9LLCBUaGUgaG9zdCBtYXkgbm90IGJlIHN5bmNocm9uaXplZC4KKyAqIFVzZSB0aGUgZmVuY2Vfc2VxIG1lbWJlci4KKyAqCisgKiBJbnB1dCAvIE91dHB1dCBkYXRhIHRvIHRoZSBEUk1fVk1XX0VYRUNCVUYgSW9jdGwuCisgKi8KKworc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgbWFzazsKKwl1aW50MzJfdCBzZXFubzsKKwl1aW50MzJfdCBwYXNzZWRfc2Vxbm87CisJdWludDMyX3QgcGFkNjQ7CisJaW50MzJfdCBlcnJvcjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0FMTE9DX0RNQUJVRgorICoKKyAqIEFsbG9jYXRlIGEgRE1BIGJ1ZmZlciB0aGF0IGlzIHZpc2libGUgYWxzbyB0byB0aGUgaG9zdC4KKyAqIE5PVEU6IFRoZSBidWZmZXIgaXMKKyAqIGlkZW50aWZpZWQgYnkgYSBoYW5kbGUgYW5kIGFuIG9mZnNldCwgd2hpY2ggYXJlIHByaXZhdGUgdG8gdGhlIGd1ZXN0LCBidXQKKyAqIHVzZWFibGUgaW4gdGhlIGNvbW1hbmQgc3RyZWFtLiBUaGUgZ3Vlc3Qga2VybmVsIG1heSB0cmFuc2xhdGUgdGhlc2UKKyAqIGFuZCBwYXRjaCB1cCB0aGUgY29tbWFuZCBzdHJlYW0gYWNjb3JkaW5nbHkuIEluIHRoZSBmdXR1cmUsIHRoZSBvZmZzZXQgbWF5CisgKiBiZSB6ZXJvIGF0IGFsbCB0aW1lcywgb3IgaXQgbWF5IGRpc2FwcGVhciBmcm9tIHRoZSBpbnRlcmZhY2UgYmVmb3JlIGl0IGlzCisgKiBmaXhlZC4KKyAqCisgKiBUaGUgRE1BIGJ1ZmZlciBtYXkgc3RheSB1c2VyLXNwYWNlIG1hcHBlZCBpbiB0aGUgZ3Vlc3QgYXQgYWxsIHRpbWVzLAorICogYW5kIGlzIHRodXMgc3VpdGFibGUgZm9yIHN1Yi1hbGxvY2F0aW9uLgorICoKKyAqIERNQSBidWZmZXJzIGFyZSBtYXBwZWQgdXNpbmcgdGhlIG1tYXAoKSBzeXNjYWxsIG9uIHRoZSBkcm0gZGV2aWNlLgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfYWxsb2NfZG1hYnVmX3JlcQorICoKKyAqIEBzaXplOiBSZXF1aXJlZCBtaW5pbXVtIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAqCisgKiBJbnB1dCBkYXRhIHRvIHRoZSBEUk1fVk1XX0FMTE9DX0RNQUJVRiBJb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19hbGxvY19kbWFidWZfcmVxIHsKKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IHBhZDY0OworfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19kbWFidWZfcmVwCisgKgorICogQG1hcF9oYW5kbGU6IE9mZnNldCB0byB1c2UgaW4gdGhlIG1tYXAoKSBjYWxsIHVzZWQgdG8gbWFwIHRoZSBidWZmZXIuCisgKiBAaGFuZGxlOiBIYW5kbGUgdW5pcXVlIHRvIHRoaXMgYnVmZmVyLiBVc2VkIGZvciB1bnJlZmVyZW5jaW5nLgorICogQGN1cl9nbXJfaWQ6IEdNUiBpZCB0byB1c2UgaW4gdGhlIGNvbW1hbmQgc3RyZWFtIHdoZW4gdGhpcyBidWZmZXIgaXMKKyAqIHJlZmVyZW5jZWQuIFNlZSBub3QgYWJvdmUuCisgKiBAY3VyX2dtcl9vZmZzZXQ6IE9mZnNldCB0byB1c2UgaW4gdGhlIGNvbW1hbmQgc3RyZWFtIHdoZW4gdGhpcyBidWZmZXIgaXMKKyAqIHJlZmVyZW5jZWQuIFNlZSBub3RlIGFib3ZlLgorICoKKyAqIE91dHB1dCBkYXRhIGZyb20gdGhlIERSTV9WTVdfQUxMT0NfRE1BQlVGIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X2RtYWJ1Zl9yZXAgeworCXVpbnQ2NF90IG1hcF9oYW5kbGU7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IGN1cl9nbXJfaWQ7CisJdWludDMyX3QgY3VyX2dtcl9vZmZzZXQ7CisJdWludDMyX3QgcGFkNjQ7Cit9OworCisvKioKKyAqIHVuaW9uIGRybV92bXdfZG1hYnVmX2FyZworICoKKyAqIEByZXE6IElucHV0IGRhdGEgYXMgZGVzY3JpYmVkIGFib3ZlLgorICogQHJlcDogT3V0cHV0IGRhdGEgYXMgZGVzY3JpYmVkIGFib3ZlLgorICoKKyAqIEFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0FMTE9DX0RNQUJVRiBJb2N0bC4KKyAqLworCit1bmlvbiBkcm1fdm13X2FsbG9jX2RtYWJ1Zl9hcmcgeworCXN0cnVjdCBkcm1fdm13X2FsbG9jX2RtYWJ1Zl9yZXEgcmVxOworCXN0cnVjdCBkcm1fdm13X2RtYWJ1Zl9yZXAgcmVwOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfVU5SRUZfRE1BQlVGIC0gRnJlZSBhIERNQSBidWZmZXIuCisgKgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfdW5yZWZfZG1hYnVmX2FyZworICoKKyAqIEBoYW5kbGU6IEhhbmRsZSBpbmRpY2F0aW5nIHdoYXQgYnVmZmVyIHRvIGZyZWUuIE9idGFpbmVkIGZyb20gdGhlCisgKiBEUk1fVk1XX0FMTE9DX0RNQUJVRiBJb2N0bC4KKyAqCisgKiBBcmd1bWVudCB0byB0aGUgRFJNX1ZNV19VTlJFRl9ETUFCVUYgSW9jdGwuCisgKi8KKworc3RydWN0IGRybV92bXdfdW5yZWZfZG1hYnVmX2FyZyB7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHBhZDY0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfQ09OVFJPTF9TVFJFQU0gLSBDb250cm9sIG92ZXJsYXlzLCBha2Egc3RyZWFtcy4KKyAqCisgKiBUaGlzIElPQ1RMIGNvbnRyb2xzIHRoZSBvdmVybGF5IHVuaXRzIG9mIHRoZSBzdmdhIGRldmljZS4KKyAqIFRoZSBTVkdBIG92ZXJsYXkgdW5pdHMgZG9lcyBub3Qgd29yayBsaWtlIHJlZ3VsYXIgaGFyZHdhcmUgdW5pdHMgaW4KKyAqIHRoYXQgdGhleSBkbyBub3QgYXV0b21hdGljYWx5IHJlYWQgYmFjayB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGRtYQorICogYnVmZmVyLiBCdXQgaW5zdGVhZCBvbmx5IHJlYWQgYmFjayBmb3IgZWFjaCBjYWxsIHRvIHRoaXMgaW9jdGwsIGFuZAorICogYXQgYW55IHBvaW50IGJldHdlZW4gdGhpcyBjYWxsIGJlaW5nIG1hZGUgYW5kIGEgZm9sbG93aW5nIGNhbGwgdGhhdAorICogZWl0aGVyIGNoYW5nZXMgdGhlIGJ1ZmZlciBvciBkaXNhYmxlcyB0aGUgc3RyZWFtLgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfcmVjdAorICoKKyAqIERlZmluZXMgYSByZWN0YW5nbGUuIFVzZWQgaW4gdGhlIG92ZXJsYXkgaW9jdGwgdG8gZGVmaW5lCisgKiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlY3RhbmdsZS4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19yZWN0IHsKKwlpbnQzMl90IHg7CisJaW50MzJfdCB5OworCXVpbnQzMl90IHc7CisJdWludDMyX3QgaDsKK307CisKKy8qKgorICogc3RydWN0IGRybV92bXdfY29udHJvbF9zdHJlYW1fYXJnCisgKgorICogQHN0cmVhbV9pZDogU3RlYXJtIHRvIGNvbnRyb2wKKyAqIEBlbmFibGVkOiBJZiBmYWxzZSBhbGwgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgaWdub3JlZC4KKyAqIEBoYW5kbGU6IEhhbmRsZSB0byBidWZmZXIgZm9yIGdldHRpbmcgZGF0YSBmcm9tLgorICogQGZvcm1hdDogRm9ybWF0IG9mIHRoZSBvdmVybGF5IGFzIHVuZGVyc3Rvb2QgYnkgdGhlIGhvc3QuCisgKiBAd2lkdGg6IFdpZHRoIG9mIHRoZSBvdmVybGF5LgorICogQGhlaWdodDogSGVpZ2h0IG9mIHRoZSBvdmVybGF5LgorICogQHNpemU6IFNpemUgb2YgdGhlIG92ZXJsYXkgaW4gYnl0ZXMuCisgKiBAcGl0Y2g6IEFycmF5IG9mIHBpdGNoZXMsIHRoZSB0d28gbGFzdCBhcmUgb25seSB1c2VkIGZvciBZVVYxMiBmb3JtYXRzLgorICogQG9mZnNldDogT2Zmc2V0IGZyb20gc3RhcnQgb2YgZG1hIGJ1ZmZlciB0byBvdmVybGF5LgorICogQHNyYzogU291cmNlIHJlY3QsIG11c3QgYmUgd2l0aGluIHRoZSBkZWZpbmVkIGFyZWEgYWJvdmUuCisgKiBAZHN0OiBEZXN0aW5hdGlvbiByZWN0LCB4IGFuZCB5IG1heSBiZSBuZWdhdGl2ZS4KKyAqCisgKiBBcmd1bWVudCB0byB0aGUgRFJNX1ZNV19DT05UUk9MX1NUUkVBTSBJb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19jb250cm9sX3N0cmVhbV9hcmcgeworCXVpbnQzMl90IHN0cmVhbV9pZDsKKwl1aW50MzJfdCBlbmFibGVkOworCisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgY29sb3Jfa2V5OworCisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IG9mZnNldDsKKwlpbnQzMl90IGZvcm1hdDsKKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IHdpZHRoOworCXVpbnQzMl90IGhlaWdodDsKKwl1aW50MzJfdCBwaXRjaFszXTsKKworCXVpbnQzMl90IHBhZDY0OworCXN0cnVjdCBkcm1fdm13X3JlY3Qgc3JjOworCXN0cnVjdCBkcm1fdm13X3JlY3QgZHN0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfQ1VSU09SX0JZUEFTUyAtIEdpdmUgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgY3Vyc29yIGJ5cGFzcy4KKyAqCisgKi8KKworI2RlZmluZSBEUk1fVk1XX0NVUlNPUl9CWVBBU1NfQUxMICAgICgxIDw8IDApCisjZGVmaW5lIERSTV9WTVdfQ1VSU09SX0JZUEFTU19GTEFHUyAgICAgICAoMSkKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19jdXJzb3JfYnlwYXNzX2FyZworICoKKyAqIEBmbGFnczogRmxhZ3MuCisgKiBAY3J0Y19pZDogQ3J0YyBpZCwgb25seSB1c2VkIGlmIERNUl9DVVJTT1JfQllQQVNTX0FMTCBpc24ndCBwYXNzZWQuCisgKiBAeHBvczogWCBwb3NpdGlvbiBvZiBjdXJzb3IuCisgKiBAeXBvczogWSBwb3NpdGlvbiBvZiBjdXJzb3IuCisgKiBAeGhvdDogWCBob3RzcG90LgorICogQHlob3Q6IFkgaG90c3BvdC4KKyAqCisgKiBBcmd1bWVudCB0byB0aGUgRFJNX1ZNV19DVVJTT1JfQllQQVNTIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X2N1cnNvcl9ieXBhc3NfYXJnIHsKKwl1aW50MzJfdCBmbGFnczsKKwl1aW50MzJfdCBjcnRjX2lkOworCWludDMyX3QgeHBvczsKKwlpbnQzMl90IHlwb3M7CisJaW50MzJfdCB4aG90OworCWludDMyX3QgeWhvdDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0NMQUlNX1NUUkVBTSAtIENsYWltIGEgc2luZ2xlIHN0cmVhbS4KKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2NvbnRleHRfYXJnCisgKgorICogQHN0cmVhbV9pZDogRGV2aWNlIHVuaXF1ZSBjb250ZXh0IElELgorICoKKyAqIE91dHB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19DUkVBVEVfQ09OVEVYVCBJb2N0bC4KKyAqIElucHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX1VOUkVGX0NPTlRFWFQgSW9jdGwuCisgKi8KKworc3RydWN0IGRybV92bXdfc3RyZWFtX2FyZyB7CisJdWludDMyX3Qgc3RyZWFtX2lkOworCXVpbnQzMl90IHBhZDY0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfVU5SRUZfU1RSRUFNIC0gVW5jbGFpbSBhIHN0cmVhbS4KKyAqCisgKiBSZXR1cm4gYSBzaW5nbGUgc3RyZWFtIHRoYXQgd2FzIGNsYWltZWQgYnkgdGhpcyBwcm9jZXNzLiBBbHNvIG1ha2VzCisgKiBzdXJlIHRoYXQgdGhlIHN0cmVhbSBoYXMgYmVlbiBzdG9wcGVkLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0dFVF8zRF9DQVAKKyAqCisgKiBSZWFkIDNEIGNhcGFiaWxpdGllcyBmcm9tIHRoZSBGSUZPCisgKgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfZ2V0XzNkX2NhcF9hcmcKKyAqCisgKiBAYnVmZmVyOiBQb2ludGVyIHRvIGEgYnVmZmVyIGZvciBjYXBhYmlsaXR5IGRhdGEsIGNhc3QgdG8gYW4gdWludDY0X3QKKyAqIEBzaXplOiBNYXggc2l6ZSB0byBjb3B5CisgKgorICogSW5wdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfR0VUXzNEX0NBUF9JT0NUTAorICogaW9jdGxzLgorICovCisKK3N0cnVjdCBkcm1fdm13X2dldF8zZF9jYXBfYXJnIHsKKwl1aW50NjRfdCBidWZmZXI7CisJdWludDMyX3QgbWF4X3NpemU7CisJdWludDMyX3QgcGFkNjQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19GRU5DRV9XQUlUCisgKgorICogV2FpdHMgZm9yIGEgZmVuY2Ugb2JqZWN0IHRvIHNpZ25hbC4gVGhlIHdhaXQgaXMgaW50ZXJydXB0aWJsZSwgc28gdGhhdAorICogc2lnbmFscyBtYXkgYmUgZGVsaXZlcmVkIGR1cmluZyB0aGUgaW50ZXJydXB0LiBUaGUgd2FpdCBtYXkgdGltZW91dCwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIGNhbGxzIHJldHVybnMgLUVCVVNZLiBJZiB0aGUgd2FpdCBpcyByZXN0YXJ0ZWQsCisgKiB0aGF0IGlzIHJlc3RhcnRpbmcgd2l0aG91dCByZXNldHRpbmcgQGNvb2tpZV92YWxpZCB0byB6ZXJvLAorICogdGhlIHRpbWVvdXQgaXMgY29tcHV0ZWQgZnJvbSB0aGUgZmlyc3QgY2FsbC4KKyAqCisgKiBUaGUgZmxhZ3MgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfRkVOQ0VfV0FJVCBpb2N0bCBpbmRpY2F0ZXMgd2hhdCB0byB3YWl0CisgKiBvbjoKKyAqIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDOiBBbGwgY29tbWFuZHMgYWhlYWQgb2YgdGhlIGZlbmNlIGluIHRoZSBjb21tYW5kCisgKiBzdHJlYW0KKyAqIGhhdmUgZXhlY3V0ZWQuCisgKiBEUk1fVk1XX0ZFTkNFX0ZMQUdfUVVFUlk6IEFsbCBxdWVyeSByZXN1bHRzIHJlc3VsdGluZyBmcm9tIHF1ZXJ5IGZpbmlzaAorICogY29tbWFuZHMKKyAqIGluIHRoZSBidWZmZXIgZ2l2ZW4gdG8gdGhlIEVYRUNCVUYgaW9jdGwgcmV0dXJuaW5nIHRoZSBmZW5jZSBvYmplY3QgaGFuZGxlCisgKiBhcmUgYXZhaWxhYmxlIHRvIHVzZXItc3BhY2UuCisgKgorICogRFJNX1ZNV19XQUlUX09QVElPTl9VTlJFRjogSWYgdGhpcyB3YWl0IG9wdGlvbiBpcyBnaXZlbiwgYW5kIHRoZQorICogZmVuYyB3YWl0IGlvY3RsIHJldHVybnMgMCwgdGhlIGZlbmNlIG9iamVjdCBoYXMgYmVlbiB1bnJlZmVyZW5jZWQgYWZ0ZXIKKyAqIHRoZSB3YWl0LgorICovCisKKyNkZWZpbmUgRFJNX1ZNV19GRU5DRV9GTEFHX0VYRUMgICAoMSA8PCAwKQorI2RlZmluZSBEUk1fVk1XX0ZFTkNFX0ZMQUdfUVVFUlkgICgxIDw8IDEpCisKKyNkZWZpbmUgRFJNX1ZNV19XQUlUX09QVElPTl9VTlJFRiAoMSA8PCAwKQorCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3dhaXRfYXJnCisgKgorICogQGhhbmRsZTogRmVuY2Ugb2JqZWN0IGhhbmRsZSBhcyByZXR1cm5lZCBieSB0aGUgRFJNX1ZNV19FWEVDQlVGIGlvY3RsLgorICogQGNvb2tpZV92YWxpZDogTXVzdCBiZSByZXNldCB0byAwIG9uIGZpcnN0IGNhbGwuIExlZnQgYWxvbmUgb24gcmVzdGFydC4KKyAqIEBrZXJuZWxfY29va2llOiBTZXQgdG8gMCBvbiBmaXJzdCBjYWxsLiBMZWZ0IGFsb25lIG9uIHJlc3RhcnQuCisgKiBAdGltZW91dF91czogV2FpdCB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcy4gMCBmb3IgaW5kZWZpbml0ZSB0aW1lb3V0LgorICogQGxhenk6IFNldCB0byAxIGlmIHRpbWluZyBpcyBub3QgY3JpdGljYWwuIEFsbG93IG1vcmUgdGhhbiBhIGtlcm5lbCB0aWNrCisgKiBiZWZvcmUgcmV0dXJuaW5nLgorICogQGZsYWdzOiBGZW5jZSBmbGFncyB0byB3YWl0IG9uLgorICogQHdhaXRfb3B0aW9uczogT3B0aW9ucyB0aGF0IGNvbnRyb2wgdGhlIGJlaGF2aW91ciBvZiB0aGUgd2FpdCBpb2N0bC4KKyAqCisgKiBJbnB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19GRU5DRV9XQUlUIGlvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X2ZlbmNlX3dhaXRfYXJnIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJaW50MzJfdCAgY29va2llX3ZhbGlkOworCXVpbnQ2NF90IGtlcm5lbF9jb29raWU7CisJdWludDY0X3QgdGltZW91dF91czsKKwlpbnQzMl90IGxhenk7CisJaW50MzJfdCBmbGFnczsKKwlpbnQzMl90IHdhaXRfb3B0aW9uczsKKwlpbnQzMl90IHBhZDY0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfRkVOQ0VfU0lHTkFMRUQKKyAqCisgKiBDaGVja3MgaWYgYSBmZW5jZSBvYmplY3QgaXMgc2lnbmFsZWQuLgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfZmVuY2Vfc2lnbmFsZWRfYXJnCisgKgorICogQGhhbmRsZTogRmVuY2Ugb2JqZWN0IGhhbmRsZSBhcyByZXR1cm5lZCBieSB0aGUgRFJNX1ZNV19FWEVDQlVGIGlvY3RsLgorICogQGZsYWdzOiBGZW5jZSBvYmplY3QgZmxhZ3MgaW5wdXQgdG8gRFJNX1ZNV19GRU5DRV9TSUdOQUxFRCBpb2N0bAorICogQHNpZ25hbGVkOiBPdXQ6IEZsYWdzIHNpZ25hbGVkLgorICogQHNlcXVlbmNlOiBPdXQ6IEhpZ2hlc3Qgc2VxdWVuY2UgcGFzc2VkIHNvIGZhci4gQ2FuIGJlIHVzZWQgdG8gc2lnbmFsIHRoZQorICogRVhFQyBmbGFnIG9mIHVzZXItc3BhY2UgZmVuY2Ugb2JqZWN0cy4KKyAqCisgKiBJbnB1dC9PdXRwdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfRkVOQ0VfU0lHTkFMRUQgYW5kIERSTV9WTVdfRkVOQ0VfVU5SRUYKKyAqIGlvY3Rscy4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9zaWduYWxlZF9hcmcgeworCSB1aW50MzJfdCBoYW5kbGU7CisJIHVpbnQzMl90IGZsYWdzOworCSBpbnQzMl90IHNpZ25hbGVkOworCSB1aW50MzJfdCBwYXNzZWRfc2Vxbm87CisJIHVpbnQzMl90IHNpZ25hbGVkX2ZsYWdzOworCSB1aW50MzJfdCBwYWQ2NDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0ZFTkNFX1VOUkVGCisgKgorICogVW5yZWZlcmVuY2VzIGEgZmVuY2Ugb2JqZWN0LCBhbmQgY2F1c2VzIGl0IHRvIGJlIGRlc3Ryb3llZCBpZiB0aGVyZSBhcmUgbm8KKyAqIG90aGVyIHJlZmVyZW5jZXMgdG8gaXQuCisgKgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfZmVuY2VfYXJnCisgKgorICogQGhhbmRsZTogRmVuY2Ugb2JqZWN0IGhhbmRsZSBhcyByZXR1cm5lZCBieSB0aGUgRFJNX1ZNV19FWEVDQlVGIGlvY3RsLgorICoKKyAqIElucHV0L091dHB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19GRU5DRV9VTlJFRiBpb2N0bC4uCisgKi8KKworc3RydWN0IGRybV92bXdfZmVuY2VfYXJnIHsKKwkgdWludDMyX3QgaGFuZGxlOworCSB1aW50MzJfdCBwYWQ2NDsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfRkVOQ0VfRVZFTlQKKyAqCisgKiBRdWV1ZXMgYW4gZXZlbnQgb24gYSBmZW5jZSB0byBiZSBkZWxpdmVyZWQgb24gdGhlIGRybSBjaGFyYWN0ZXIgZGV2aWNlCisgKiB3aGVuIHRoZSBmZW5jZSBoYXMgc2lnbmFsZWQgdGhlIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDIGZsYWcuCisgKiBPcHRpb25hbGx5IHRoZSBhcHByb3hpbWF0ZSB0aW1lIHdoZW4gdGhlIGZlbmNlIHNpZ25hbGVkIGlzCisgKiBnaXZlbiBieSB0aGUgZXZlbnQuCisgKi8KKworLyoKKyAqIFRoZSBldmVudCB0eXBlCisgKi8KKyNkZWZpbmUgRFJNX1ZNV19FVkVOVF9GRU5DRV9TSUdOQUxFRCAweDgwMDAwMDAwCisKK3N0cnVjdCBkcm1fdm13X2V2ZW50X2ZlbmNlIHsKKwlzdHJ1Y3QgZHJtX2V2ZW50IGJhc2U7CisJdWludDY0X3QgdXNlcl9kYXRhOworCXVpbnQzMl90IHR2X3NlYzsKKwl1aW50MzJfdCB0dl91c2VjOworfTsKKworLyoKKyAqIEZsYWdzIHRoYXQgbWF5IGJlIGdpdmVuIHRvIHRoZSBjb21tYW5kLgorICovCisvKiBSZXF1ZXN0IGZlbmNlIHNpZ25hbGVkIHRpbWUgb24gdGhlIGV2ZW50LiAqLworI2RlZmluZSBEUk1fVk1XX0ZFX0ZMQUdfUkVRX1RJTUUgKDEgPDwgMCkKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9ldmVudF9hcmcKKyAqCisgKiBAZmVuY2VfcmVwOiBQb2ludGVyIHRvIGZlbmNlX3JlcCBzdHJ1Y3R1cmUgY2FzdCB0byB1aW50NjRfdCBvciAwIGlmCisgKiB0aGUgZmVuY2UgaXMgbm90IHN1cHBvc2VkIHRvIGJlIHJlZmVyZW5jZWQgYnkgdXNlci1zcGFjZS4KKyAqIEB1c2VyX2luZm86IEluZm8gdG8gYmUgZGVsaXZlcmVkIHdpdGggdGhlIGV2ZW50LgorICogQGhhbmRsZTogQXR0YWNoIHRoZSBldmVudCB0byB0aGlzIGZlbmNlIG9ubHkuCisgKiBAZmxhZ3M6IEEgc2V0IG9mIGZsYWdzIGFzIGRlZmluZWQgYWJvdmUuCisgKi8KK3N0cnVjdCBkcm1fdm13X2ZlbmNlX2V2ZW50X2FyZyB7CisJdWludDY0X3QgZmVuY2VfcmVwOworCXVpbnQ2NF90IHVzZXJfZGF0YTsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgZmxhZ3M7Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX1BSRVNFTlQKKyAqCisgKiBFeGVjdXRlcyBhbiBTVkdBIHByZXNlbnQgb24gYSBnaXZlbiBmYiBmb3IgYSBnaXZlbiBzdXJmYWNlLiBUaGUgc3VyZmFjZQorICogaXMgcGxhY2VkIG9uIHRoZSBmcmFtZWJ1ZmZlci4gQ2xpcHJlY3RzIGFyZSBnaXZlbiByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4KKyAqIHBvaW50ICh0aGUgcG9pbnQgZGlzaWduYXRlZCBieSBkZXN0X3t4fHl9KS4KKyAqCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X2FyZworICogQGZiX2lkOiBmcmFtZWJ1ZmZlciBpZCB0byBwcmVzZW50IC8gcmVhZCBiYWNrIGZyb20uCisgKiBAc2lkOiBTdXJmYWNlIGlkIHRvIHByZXNlbnQgZnJvbS4KKyAqIEBkZXN0X3g6IFggcGxhY2VtZW50IGNvb3JkaW5hdGUgZm9yIHN1cmZhY2UuCisgKiBAZGVzdF95OiBZIHBsYWNlbWVudCBjb29yZGluYXRlIGZvciBzdXJmYWNlLgorICogQGNsaXBzX3B0cjogUG9pbnRlciB0byBhbiBhcnJheSBvZiBjbGlwIHJlY3RzIGNhc3QgdG8gYW4gdWludDY0X3QuCisgKiBAbnVtX2NsaXBzOiBOdW1iZXIgb2YgY2xpcHJlY3RzIGdpdmVuIHJlbGF0aXZlIHRvIHRoZSBmcmFtZWJ1ZmZlciBvcmlnaW4sCisgKiBpbiB0aGUgc2FtZSBjb29yZGluYXRlIHNwYWNlIGFzIHRoZSBmcmFtZSBidWZmZXIuCisgKiBAcGFkNjQ6IFVudXNlZCA2NC1iaXQgcGFkZGluZy4KKyAqCisgKiBJbnB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19QUkVTRU5UIGlvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X3ByZXNlbnRfYXJnIHsKKwl1aW50MzJfdCBmYl9pZDsKKwl1aW50MzJfdCBzaWQ7CisJaW50MzJfdCBkZXN0X3g7CisJaW50MzJfdCBkZXN0X3k7CisJdWludDY0X3QgY2xpcHNfcHRyOworCXVpbnQzMl90IG51bV9jbGlwczsKKwl1aW50MzJfdCBwYWQ2NDsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfUFJFU0VOVF9SRUFEQkFDSworICoKKyAqIEV4ZWN1dGVzIGFuIFNWR0EgcHJlc2VudCByZWFkYmFjayBmcm9tIGEgZ2l2ZW4gZmIgdG8gdGhlIGRtYSBidWZmZXIKKyAqIGN1cnJlbnRseSBib3VuZCBhcyB0aGUgZmIuIElmIHRoZXJlIGlzIG5vIGRtYSBidWZmZXIgYm91bmQgdG8gdGhlIGZiLAorICogYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAqCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X2FyZworICogQGZiX2lkOiBmYl9pZCB0byBwcmVzZW50IC8gcmVhZCBiYWNrIGZyb20uCisgKiBAbnVtX2NsaXBzOiBOdW1iZXIgb2YgY2xpcHJlY3RzLgorICogQGNsaXBzX3B0cjogUG9pbnRlciB0byBhbiBhcnJheSBvZiBjbGlwIHJlY3RzIGNhc3QgdG8gYW4gdWludDY0X3QuCisgKiBAZmVuY2VfcmVwOiBQb2ludGVyIHRvIGEgc3RydWN0IGRybV92bXdfZmVuY2VfcmVwLCBjYXN0IHRvIGFuIHVpbnQ2NF90LgorICogSWYgdGhpcyBtZW1iZXIgaXMgTlVMTCwgdGhlbiB0aGUgaW9jdGwgc2hvdWxkIG5vdCByZXR1cm4gYSBmZW5jZS4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X3JlYWRiYWNrX2FyZyB7CisJIHVpbnQzMl90IGZiX2lkOworCSB1aW50MzJfdCBudW1fY2xpcHM7CisJIHVpbnQ2NF90IGNsaXBzX3B0cjsKKwkgdWludDY0X3QgZmVuY2VfcmVwOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfVVBEQVRFX0xBWU9VVCAtIFVwZGF0ZSBsYXlvdXQKKyAqCisgKiBVcGRhdGVzIHRoZSBwcmVmZXJyZWQgbW9kZXMgYW5kIGNvbm5lY3Rpb24gc3RhdHVzIGZvciBjb25uZWN0b3JzLiBUaGUKKyAqIGNvbW1hbmQgY29uc2lzdHMgb2Ygb25lIGRybV92bXdfdXBkYXRlX2xheW91dF9hcmcgcG9pbnRpbmcgdG8gYW4gYXJyYXkKKyAqIG9mIG51bV9vdXRwdXRzIGRybV92bXdfcmVjdCdzLgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfdXBkYXRlX2xheW91dF9hcmcKKyAqCisgKiBAbnVtX291dHB1dHM6IG51bWJlciBvZiBhY3RpdmUgY29ubmVjdG9ycworICogQHJlY3RzOiBwb2ludGVyIHRvIGFycmF5IG9mIGRybV92bXdfcmVjdCBjYXN0IHRvIGFuIHVpbnQ2NF90CisgKgorICogSW5wdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfVVBEQVRFX0xBWU9VVCBJb2N0bC4KKyAqLworc3RydWN0IGRybV92bXdfdXBkYXRlX2xheW91dF9hcmcgeworCXVpbnQzMl90IG51bV9vdXRwdXRzOworCXVpbnQzMl90IHBhZDY0OworCXVpbnQ2NF90IHJlY3RzOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2VsZi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9lbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzY0MTIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9lbGYuaApAQCAtMCwwICsxLDI3OTYgQEAKKy8qIFRoaXMgZmlsZSBkZWZpbmVzIHN0YW5kYXJkIEVMRiB0eXBlcywgc3RydWN0dXJlcywgYW5kIG1hY3Jvcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0yMDAzLDIwMDQsMjAwNSwyMDA2LDIwMDcsMjAwOCwyMDA5LDIwMTAsMjAxMQorCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9FTEZfSAorI2RlZmluZQlfRUxGX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBTdGFuZGFyZCBFTEYgdHlwZXMuICAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIFR5cGUgZm9yIGEgMTYtYml0IHF1YW50aXR5LiAgKi8KK3R5cGVkZWYgdWludDE2X3QgRWxmMzJfSGFsZjsKK3R5cGVkZWYgdWludDE2X3QgRWxmNjRfSGFsZjsKKworLyogVHlwZXMgZm9yIHNpZ25lZCBhbmQgdW5zaWduZWQgMzItYml0IHF1YW50aXRpZXMuICAqLwordHlwZWRlZiB1aW50MzJfdCBFbGYzMl9Xb3JkOwordHlwZWRlZglpbnQzMl90ICBFbGYzMl9Td29yZDsKK3R5cGVkZWYgdWludDMyX3QgRWxmNjRfV29yZDsKK3R5cGVkZWYJaW50MzJfdCAgRWxmNjRfU3dvcmQ7CisKKy8qIFR5cGVzIGZvciBzaWduZWQgYW5kIHVuc2lnbmVkIDY0LWJpdCBxdWFudGl0aWVzLiAgKi8KK3R5cGVkZWYgdWludDY0X3QgRWxmMzJfWHdvcmQ7Cit0eXBlZGVmCWludDY0X3QgIEVsZjMyX1N4d29yZDsKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfWHdvcmQ7Cit0eXBlZGVmCWludDY0X3QgIEVsZjY0X1N4d29yZDsKKworLyogVHlwZSBvZiBhZGRyZXNzZXMuICAqLwordHlwZWRlZiB1aW50MzJfdCBFbGYzMl9BZGRyOwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9BZGRyOworCisvKiBUeXBlIG9mIGZpbGUgb2Zmc2V0cy4gICovCit0eXBlZGVmIHVpbnQzMl90IEVsZjMyX09mZjsKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfT2ZmOworCisvKiBUeXBlIGZvciBzZWN0aW9uIGluZGljZXMsIHdoaWNoIGFyZSAxNi1iaXQgcXVhbnRpdGllcy4gICovCit0eXBlZGVmIHVpbnQxNl90IEVsZjMyX1NlY3Rpb247Cit0eXBlZGVmIHVpbnQxNl90IEVsZjY0X1NlY3Rpb247CisKKy8qIFR5cGUgZm9yIHZlcnNpb24gc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KK3R5cGVkZWYgRWxmMzJfSGFsZiBFbGYzMl9WZXJzeW07Cit0eXBlZGVmIEVsZjY0X0hhbGYgRWxmNjRfVmVyc3ltOworCisKKy8qIFRoZSBFTEYgZmlsZSBoZWFkZXIuICBUaGlzIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IEVMRiBmaWxlLiAgKi8KKworI2RlZmluZSBFSV9OSURFTlQgKDE2KQorCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBjaGFyCWVfaWRlbnRbRUlfTklERU5UXTsJLyogTWFnaWMgbnVtYmVyIGFuZCBvdGhlciBpbmZvICovCisgIEVsZjMyX0hhbGYJZV90eXBlOwkJCS8qIE9iamVjdCBmaWxlIHR5cGUgKi8KKyAgRWxmMzJfSGFsZgllX21hY2hpbmU7CQkvKiBBcmNoaXRlY3R1cmUgKi8KKyAgRWxmMzJfV29yZAllX3ZlcnNpb247CQkvKiBPYmplY3QgZmlsZSB2ZXJzaW9uICovCisgIEVsZjMyX0FkZHIJZV9lbnRyeTsJCS8qIEVudHJ5IHBvaW50IHZpcnR1YWwgYWRkcmVzcyAqLworICBFbGYzMl9PZmYJZV9waG9mZjsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIEVsZjMyX09mZgllX3Nob2ZmOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KKyAgRWxmMzJfV29yZAllX2ZsYWdzOwkJLyogUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzICovCisgIEVsZjMyX0hhbGYJZV9laHNpemU7CQkvKiBFTEYgaGVhZGVyIHNpemUgaW4gYnl0ZXMgKi8KKyAgRWxmMzJfSGFsZgllX3BoZW50c2l6ZTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KKyAgRWxmMzJfSGFsZgllX3BobnVtOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KKyAgRWxmMzJfSGFsZgllX3NoZW50c2l6ZTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KKyAgRWxmMzJfSGFsZgllX3NobnVtOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KKyAgRWxmMzJfSGFsZgllX3Noc3RybmR4OwkJLyogU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4ICovCit9IEVsZjMyX0VoZHI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIJZV9pZGVudFtFSV9OSURFTlRdOwkvKiBNYWdpYyBudW1iZXIgYW5kIG90aGVyIGluZm8gKi8KKyAgRWxmNjRfSGFsZgllX3R5cGU7CQkJLyogT2JqZWN0IGZpbGUgdHlwZSAqLworICBFbGY2NF9IYWxmCWVfbWFjaGluZTsJCS8qIEFyY2hpdGVjdHVyZSAqLworICBFbGY2NF9Xb3JkCWVfdmVyc2lvbjsJCS8qIE9iamVjdCBmaWxlIHZlcnNpb24gKi8KKyAgRWxmNjRfQWRkcgllX2VudHJ5OwkJLyogRW50cnkgcG9pbnQgdmlydHVhbCBhZGRyZXNzICovCisgIEVsZjY0X09mZgllX3Bob2ZmOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KKyAgRWxmNjRfT2ZmCWVfc2hvZmY7CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLworICBFbGY2NF9Xb3JkCWVfZmxhZ3M7CQkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgZmxhZ3MgKi8KKyAgRWxmNjRfSGFsZgllX2Voc2l6ZTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLworICBFbGY2NF9IYWxmCWVfcGhlbnRzaXplOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLworICBFbGY2NF9IYWxmCWVfcGhudW07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLworICBFbGY2NF9IYWxmCWVfc2hlbnRzaXplOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLworICBFbGY2NF9IYWxmCWVfc2hudW07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLworICBFbGY2NF9IYWxmCWVfc2hzdHJuZHg7CQkvKiBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXggKi8KK30gRWxmNjRfRWhkcjsKKworLyogRmllbGRzIGluIHRoZSBlX2lkZW50IGFycmF5LiAgVGhlIEVJXyogbWFjcm9zIGFyZSBpbmRpY2VzIGludG8gdGhlCisgICBhcnJheS4gIFRoZSBtYWNyb3MgdW5kZXIgZWFjaCBFSV8qIG1hY3JvIGFyZSB0aGUgdmFsdWVzIHRoZSBieXRlCisgICBtYXkgaGF2ZS4gICovCisKKyNkZWZpbmUgRUlfTUFHMAkJMAkJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDAgaW5kZXggKi8KKyNkZWZpbmUgRUxGTUFHMAkJMHg3ZgkJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMCAqLworCisjZGVmaW5lIEVJX01BRzEJCTEJCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAxIGluZGV4ICovCisjZGVmaW5lIEVMRk1BRzEJCSdFJwkJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMSAqLworCisjZGVmaW5lIEVJX01BRzIJCTIJCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAyIGluZGV4ICovCisjZGVmaW5lIEVMRk1BRzIJCSdMJwkJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMiAqLworCisjZGVmaW5lIEVJX01BRzMJCTMJCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAzIGluZGV4ICovCisjZGVmaW5lIEVMRk1BRzMJCSdGJwkJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMyAqLworCisvKiBDb25nbG9tZXJhdGlvbiBvZiB0aGUgaWRlbnRpZmljYXRpb24gYnl0ZXMsIGZvciBlYXN5IHRlc3RpbmcgYXMgYSB3b3JkLiAgKi8KKyNkZWZpbmUJRUxGTUFHCQkiXDE3N0VMRiIKKyNkZWZpbmUJU0VMRk1BRwkJNAorCisjZGVmaW5lIEVJX0NMQVNTCTQJCS8qIEZpbGUgY2xhc3MgYnl0ZSBpbmRleCAqLworI2RlZmluZSBFTEZDTEFTU05PTkUJMAkJLyogSW52YWxpZCBjbGFzcyAqLworI2RlZmluZSBFTEZDTEFTUzMyCTEJCS8qIDMyLWJpdCBvYmplY3RzICovCisjZGVmaW5lIEVMRkNMQVNTNjQJMgkJLyogNjQtYml0IG9iamVjdHMgKi8KKyNkZWZpbmUgRUxGQ0xBU1NOVU0JMworCisjZGVmaW5lIEVJX0RBVEEJCTUJCS8qIERhdGEgZW5jb2RpbmcgYnl0ZSBpbmRleCAqLworI2RlZmluZSBFTEZEQVRBTk9ORQkwCQkvKiBJbnZhbGlkIGRhdGEgZW5jb2RpbmcgKi8KKyNkZWZpbmUgRUxGREFUQTJMU0IJMQkJLyogMidzIGNvbXBsZW1lbnQsIGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRUxGREFUQTJNU0IJMgkJLyogMidzIGNvbXBsZW1lbnQsIGJpZyBlbmRpYW4gKi8KKyNkZWZpbmUgRUxGREFUQU5VTQkzCisKKyNkZWZpbmUgRUlfVkVSU0lPTgk2CQkvKiBGaWxlIHZlcnNpb24gYnl0ZSBpbmRleCAqLworCQkJCQkvKiBWYWx1ZSBtdXN0IGJlIEVWX0NVUlJFTlQgKi8KKworI2RlZmluZSBFSV9PU0FCSQk3CQkvKiBPUyBBQkkgaWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUgRUxGT1NBQklfTk9ORQkJMAkvKiBVTklYIFN5c3RlbSBWIEFCSSAqLworI2RlZmluZSBFTEZPU0FCSV9TWVNWCQkwCS8qIEFsaWFzLiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfSFBVWAkJMQkvKiBIUC1VWCAqLworI2RlZmluZSBFTEZPU0FCSV9ORVRCU0QJCTIJLyogTmV0QlNELiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfR05VCQkzCS8qIE9iamVjdCB1c2VzIEdOVSBFTEYgZXh0ZW5zaW9ucy4gICovCisjZGVmaW5lIEVMRk9TQUJJX0xJTlVYCQlFTEZPU0FCSV9HTlUgLyogQ29tcGF0aWJpbGl0eSBhbGlhcy4gICovCisjZGVmaW5lIEVMRk9TQUJJX1NPTEFSSVMJNgkvKiBTdW4gU29sYXJpcy4gICovCisjZGVmaW5lIEVMRk9TQUJJX0FJWAkJNwkvKiBJQk0gQUlYLiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfSVJJWAkJOAkvKiBTR0kgSXJpeC4gICovCisjZGVmaW5lIEVMRk9TQUJJX0ZSRUVCU0QJOQkvKiBGcmVlQlNELiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfVFJVNjQJCTEwCS8qIENvbXBhcSBUUlU2NCBVTklYLiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfTU9ERVNUTwkxMQkvKiBOb3ZlbGwgTW9kZXN0by4gICovCisjZGVmaW5lIEVMRk9TQUJJX09QRU5CU0QJMTIJLyogT3BlbkJTRC4gICovCisjZGVmaW5lIEVMRk9TQUJJX0FSTV9BRUFCSQk2NAkvKiBBUk0gRUFCSSAqLworI2RlZmluZSBFTEZPU0FCSV9BUk0JCTk3CS8qIEFSTSAqLworI2RlZmluZSBFTEZPU0FCSV9TVEFOREFMT05FCTI1NQkvKiBTdGFuZGFsb25lIChlbWJlZGRlZCkgYXBwbGljYXRpb24gKi8KKworI2RlZmluZSBFSV9BQklWRVJTSU9OCTgJCS8qIEFCSSB2ZXJzaW9uICovCisKKyNkZWZpbmUgRUlfUEFECQk5CQkvKiBCeXRlIGluZGV4IG9mIHBhZGRpbmcgYnl0ZXMgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBlX3R5cGUgKG9iamVjdCBmaWxlIHR5cGUpLiAgKi8KKworI2RlZmluZSBFVF9OT05FCQkwCQkvKiBObyBmaWxlIHR5cGUgKi8KKyNkZWZpbmUgRVRfUkVMCQkxCQkvKiBSZWxvY2F0YWJsZSBmaWxlICovCisjZGVmaW5lIEVUX0VYRUMJCTIJCS8qIEV4ZWN1dGFibGUgZmlsZSAqLworI2RlZmluZSBFVF9EWU4JCTMJCS8qIFNoYXJlZCBvYmplY3QgZmlsZSAqLworI2RlZmluZSBFVF9DT1JFCQk0CQkvKiBDb3JlIGZpbGUgKi8KKyNkZWZpbmUJRVRfTlVNCQk1CQkvKiBOdW1iZXIgb2YgZGVmaW5lZCB0eXBlcyAqLworI2RlZmluZSBFVF9MT09TCQkweGZlMDAJCS8qIE9TLXNwZWNpZmljIHJhbmdlIHN0YXJ0ICovCisjZGVmaW5lIEVUX0hJT1MJCTB4ZmVmZgkJLyogT1Mtc3BlY2lmaWMgcmFuZ2UgZW5kICovCisjZGVmaW5lIEVUX0xPUFJPQwkweGZmMDAJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyByYW5nZSBzdGFydCAqLworI2RlZmluZSBFVF9ISVBST0MJMHhmZmZmCQkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgcmFuZ2UgZW5kICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgZV9tYWNoaW5lIChhcmNoaXRlY3R1cmUpLiAgKi8KKworI2RlZmluZSBFTV9OT05FCQkgMAkJLyogTm8gbWFjaGluZSAqLworI2RlZmluZSBFTV9NMzIJCSAxCQkvKiBBVCZUIFdFIDMyMTAwICovCisjZGVmaW5lIEVNX1NQQVJDCSAyCQkvKiBTVU4gU1BBUkMgKi8KKyNkZWZpbmUgRU1fMzg2CQkgMwkJLyogSW50ZWwgODAzODYgKi8KKyNkZWZpbmUgRU1fNjhLCQkgNAkJLyogTW90b3JvbGEgbTY4ayBmYW1pbHkgKi8KKyNkZWZpbmUgRU1fODhLCQkgNQkJLyogTW90b3JvbGEgbTg4ayBmYW1pbHkgKi8KKyNkZWZpbmUgRU1fODYwCQkgNwkJLyogSW50ZWwgODA4NjAgKi8KKyNkZWZpbmUgRU1fTUlQUwkJIDgJCS8qIE1JUFMgUjMwMDAgYmlnLWVuZGlhbiAqLworI2RlZmluZSBFTV9TMzcwCQkgOQkJLyogSUJNIFN5c3RlbS8zNzAgKi8KKyNkZWZpbmUgRU1fTUlQU19SUzNfTEUJMTAJCS8qIE1JUFMgUjMwMDAgbGl0dGxlLWVuZGlhbiAqLworCisjZGVmaW5lIEVNX1BBUklTQwkxNQkJLyogSFBQQSAqLworI2RlZmluZSBFTV9WUFA1MDAJMTcJCS8qIEZ1aml0c3UgVlBQNTAwICovCisjZGVmaW5lIEVNX1NQQVJDMzJQTFVTCTE4CQkvKiBTdW4ncyAidjhwbHVzIiAqLworI2RlZmluZSBFTV85NjAJCTE5CQkvKiBJbnRlbCA4MDk2MCAqLworI2RlZmluZSBFTV9QUEMJCTIwCQkvKiBQb3dlclBDICovCisjZGVmaW5lIEVNX1BQQzY0CTIxCQkvKiBQb3dlclBDIDY0LWJpdCAqLworI2RlZmluZSBFTV9TMzkwCQkyMgkJLyogSUJNIFMzOTAgKi8KKworI2RlZmluZSBFTV9WODAwCQkzNgkJLyogTkVDIFY4MDAgc2VyaWVzICovCisjZGVmaW5lIEVNX0ZSMjAJCTM3CQkvKiBGdWppdHN1IEZSMjAgKi8KKyNkZWZpbmUgRU1fUkgzMgkJMzgJCS8qIFRSVyBSSC0zMiAqLworI2RlZmluZSBFTV9SQ0UJCTM5CQkvKiBNb3Rvcm9sYSBSQ0UgKi8KKyNkZWZpbmUgRU1fQVJNCQk0MAkJLyogQVJNICovCisjZGVmaW5lIEVNX0ZBS0VfQUxQSEEJNDEJCS8qIERpZ2l0YWwgQWxwaGEgKi8KKyNkZWZpbmUgRU1fU0gJCTQyCQkvKiBIaXRhY2hpIFNIICovCisjZGVmaW5lIEVNX1NQQVJDVjkJNDMJCS8qIFNQQVJDIHY5IDY0LWJpdCAqLworI2RlZmluZSBFTV9UUklDT1JFCTQ0CQkvKiBTaWVtZW5zIFRyaWNvcmUgKi8KKyNkZWZpbmUgRU1fQVJDCQk0NQkJLyogQXJnb25hdXQgUklTQyBDb3JlICovCisjZGVmaW5lIEVNX0g4XzMwMAk0NgkJLyogSGl0YWNoaSBIOC8zMDAgKi8KKyNkZWZpbmUgRU1fSDhfMzAwSAk0NwkJLyogSGl0YWNoaSBIOC8zMDBIICovCisjZGVmaW5lIEVNX0g4UwkJNDgJCS8qIEhpdGFjaGkgSDhTICovCisjZGVmaW5lIEVNX0g4XzUwMAk0OQkJLyogSGl0YWNoaSBIOC81MDAgKi8KKyNkZWZpbmUgRU1fSUFfNjQJNTAJCS8qIEludGVsIE1lcmNlZCAqLworI2RlZmluZSBFTV9NSVBTX1gJNTEJCS8qIFN0YW5mb3JkIE1JUFMtWCAqLworI2RlZmluZSBFTV9DT0xERklSRQk1MgkJLyogTW90b3JvbGEgQ29sZGZpcmUgKi8KKyNkZWZpbmUgRU1fNjhIQzEyCTUzCQkvKiBNb3Rvcm9sYSBNNjhIQzEyICovCisjZGVmaW5lIEVNX01NQQkJNTQJCS8qIEZ1aml0c3UgTU1BIE11bHRpbWVkaWEgQWNjZWxlcmF0b3IqLworI2RlZmluZSBFTV9QQ1AJCTU1CQkvKiBTaWVtZW5zIFBDUCAqLworI2RlZmluZSBFTV9OQ1BVCQk1NgkJLyogU29ueSBuQ1BVIGVtYmVlZGVkIFJJU0MgKi8KKyNkZWZpbmUgRU1fTkRSMQkJNTcJCS8qIERlbnNvIE5EUjEgbWljcm9wcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fU1RBUkNPUkUJNTgJCS8qIE1vdG9yb2xhIFN0YXJ0KkNvcmUgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX01FMTYJCTU5CQkvKiBUb3lvdGEgTUUxNiBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fU1QxMDAJNjAJCS8qIFNUTWljcm9lbGVjdHJvbmljIFNUMTAwIHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9USU5ZSgk2MQkJLyogQWR2YW5jZWQgTG9naWMgQ29ycC4gVGlueWogZW1iLmZhbSovCisjZGVmaW5lIEVNX1g4Nl82NAk2MgkJLyogQU1EIHg4Ni02NCBhcmNoaXRlY3R1cmUgKi8KKyNkZWZpbmUgRU1fUERTUAkJNjMJCS8qIFNvbnkgRFNQIFByb2Nlc3NvciAqLworCisjZGVmaW5lIEVNX0ZYNjYJCTY2CQkvKiBTaWVtZW5zIEZYNjYgbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNX1NUOVBMVVMJNjcJCS8qIFNUTWljcm9lbGVjdHJvbmljcyBTVDkrIDgvMTYgbWMgKi8KKyNkZWZpbmUgRU1fU1Q3CQk2OAkJLyogU1RtaWNyb2VsZWN0cm9uaWNzIFNUNyA4IGJpdCBtYyAqLworI2RlZmluZSBFTV82OEhDMTYJNjkJCS8qIE1vdG9yb2xhIE1DNjhIQzE2IG1pY3JvY29udHJvbGxlciAqLworI2RlZmluZSBFTV82OEhDMTEJNzAJCS8qIE1vdG9yb2xhIE1DNjhIQzExIG1pY3JvY29udHJvbGxlciAqLworI2RlZmluZSBFTV82OEhDMDgJNzEJCS8qIE1vdG9yb2xhIE1DNjhIQzA4IG1pY3JvY29udHJvbGxlciAqLworI2RlZmluZSBFTV82OEhDMDUJNzIJCS8qIE1vdG9yb2xhIE1DNjhIQzA1IG1pY3JvY29udHJvbGxlciAqLworI2RlZmluZSBFTV9TVlgJCTczCQkvKiBTaWxpY29uIEdyYXBoaWNzIFNWeCAqLworI2RlZmluZSBFTV9TVDE5CQk3NAkJLyogU1RNaWNyb2VsZWN0cm9uaWNzIFNUMTkgOCBiaXQgbWMgKi8KKyNkZWZpbmUgRU1fVkFYCQk3NQkJLyogRGlnaXRhbCBWQVggKi8KKyNkZWZpbmUgRU1fQ1JJUwkJNzYJCS8qIEF4aXMgQ29tbXVuaWNhdGlvbnMgMzItYml0IGVtYmVkZGVkIHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9KQVZFTElOCTc3CQkvKiBJbmZpbmVvbiBUZWNobm9sb2dpZXMgMzItYml0IGVtYmVkZGVkIHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9GSVJFUEFUSAk3OAkJLyogRWxlbWVudCAxNCA2NC1iaXQgRFNQIFByb2Nlc3NvciAqLworI2RlZmluZSBFTV9aU1AJCTc5CQkvKiBMU0kgTG9naWMgMTYtYml0IERTUCBQcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fTU1JWAkJODAJCS8qIERvbmFsZCBLbnV0aCdzIGVkdWNhdGlvbmFsIDY0LWJpdCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fSFVBTlkJODEJCS8qIEhhcnZhcmQgVW5pdmVyc2l0eSBtYWNoaW5lLWluZGVwZW5kZW50IG9iamVjdCBmaWxlcyAqLworI2RlZmluZSBFTV9QUklTTQk4MgkJLyogU2lUZXJhIFByaXNtICovCisjZGVmaW5lIEVNX0FWUgkJODMJCS8qIEF0bWVsIEFWUiA4LWJpdCBtaWNyb2NvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRU1fRlIzMAkJODQJCS8qIEZ1aml0c3UgRlIzMCAqLworI2RlZmluZSBFTV9EMTBWCQk4NQkJLyogTWl0c3ViaXNoaSBEMTBWICovCisjZGVmaW5lIEVNX0QzMFYJCTg2CQkvKiBNaXRzdWJpc2hpIEQzMFYgKi8KKyNkZWZpbmUgRU1fVjg1MAkJODcJCS8qIE5FQyB2ODUwICovCisjZGVmaW5lIEVNX00zMlIJCTg4CQkvKiBNaXRzdWJpc2hpIE0zMlIgKi8KKyNkZWZpbmUgRU1fTU4xMDMwMAk4OQkJLyogTWF0c3VzaGl0YSBNTjEwMzAwICovCisjZGVmaW5lIEVNX01OMTAyMDAJOTAJCS8qIE1hdHN1c2hpdGEgTU4xMDIwMCAqLworI2RlZmluZSBFTV9QSgkJOTEJCS8qIHBpY29KYXZhICovCisjZGVmaW5lIEVNX09QRU5SSVNDCTkyCQkvKiBPcGVuUklTQyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX0FSQ19BNQk5MwkJLyogQVJDIENvcmVzIFRhbmdlbnQtQTUgKi8KKyNkZWZpbmUgRU1fWFRFTlNBCTk0CQkvKiBUZW5zaWxpY2EgWHRlbnNhIEFyY2hpdGVjdHVyZSAqLworI2RlZmluZSBFTV9OVU0JCTk1CisKKy8qIElmIGl0IGlzIG5lY2Vzc2FyeSB0byBhc3NpZ24gbmV3IHVub2ZmaWNpYWwgRU1fKiB2YWx1ZXMsIHBsZWFzZQorICAgcGljayBsYXJnZSByYW5kb20gbnVtYmVycyAoMHg4NTIzLCAweGE3ZjIsIGV0Yy4pIHRvIG1pbmltaXplIHRoZQorICAgY2hhbmNlcyBvZiBjb2xsaXNpb24gd2l0aCBvZmZpY2lhbCBvciBub24tR05VIHVub2ZmaWNpYWwgdmFsdWVzLiAgKi8KKworI2RlZmluZSBFTV9BTFBIQQkweDkwMjYKKworLyogTGVnYWwgdmFsdWVzIGZvciBlX3ZlcnNpb24gKHZlcnNpb24pLiAgKi8KKworI2RlZmluZSBFVl9OT05FCQkwCQkvKiBJbnZhbGlkIEVMRiB2ZXJzaW9uICovCisjZGVmaW5lIEVWX0NVUlJFTlQJMQkJLyogQ3VycmVudCB2ZXJzaW9uICovCisjZGVmaW5lIEVWX05VTQkJMgorCisvKiBTZWN0aW9uIGhlYWRlci4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1dvcmQJc2hfbmFtZTsJCS8qIFNlY3Rpb24gbmFtZSAoc3RyaW5nIHRibCBpbmRleCkgKi8KKyAgRWxmMzJfV29yZAlzaF90eXBlOwkJLyogU2VjdGlvbiB0eXBlICovCisgIEVsZjMyX1dvcmQJc2hfZmxhZ3M7CQkvKiBTZWN0aW9uIGZsYWdzICovCisgIEVsZjMyX0FkZHIJc2hfYWRkcjsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLworICBFbGYzMl9PZmYJc2hfb2Zmc2V0OwkJLyogU2VjdGlvbiBmaWxlIG9mZnNldCAqLworICBFbGYzMl9Xb3JkCXNoX3NpemU7CQkvKiBTZWN0aW9uIHNpemUgaW4gYnl0ZXMgKi8KKyAgRWxmMzJfV29yZAlzaF9saW5rOwkJLyogTGluayB0byBhbm90aGVyIHNlY3Rpb24gKi8KKyAgRWxmMzJfV29yZAlzaF9pbmZvOwkJLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZm9ybWF0aW9uICovCisgIEVsZjMyX1dvcmQJc2hfYWRkcmFsaWduOwkJLyogU2VjdGlvbiBhbGlnbm1lbnQgKi8KKyAgRWxmMzJfV29yZAlzaF9lbnRzaXplOwkJLyogRW50cnkgc2l6ZSBpZiBzZWN0aW9uIGhvbGRzIHRhYmxlICovCit9IEVsZjMyX1NoZHI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X1dvcmQJc2hfbmFtZTsJCS8qIFNlY3Rpb24gbmFtZSAoc3RyaW5nIHRibCBpbmRleCkgKi8KKyAgRWxmNjRfV29yZAlzaF90eXBlOwkJLyogU2VjdGlvbiB0eXBlICovCisgIEVsZjY0X1h3b3JkCXNoX2ZsYWdzOwkJLyogU2VjdGlvbiBmbGFncyAqLworICBFbGY2NF9BZGRyCXNoX2FkZHI7CQkvKiBTZWN0aW9uIHZpcnR1YWwgYWRkciBhdCBleGVjdXRpb24gKi8KKyAgRWxmNjRfT2ZmCXNoX29mZnNldDsJCS8qIFNlY3Rpb24gZmlsZSBvZmZzZXQgKi8KKyAgRWxmNjRfWHdvcmQJc2hfc2l6ZTsJCS8qIFNlY3Rpb24gc2l6ZSBpbiBieXRlcyAqLworICBFbGY2NF9Xb3JkCXNoX2xpbms7CQkvKiBMaW5rIHRvIGFub3RoZXIgc2VjdGlvbiAqLworICBFbGY2NF9Xb3JkCXNoX2luZm87CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgRWxmNjRfWHdvcmQJc2hfYWRkcmFsaWduOwkJLyogU2VjdGlvbiBhbGlnbm1lbnQgKi8KKyAgRWxmNjRfWHdvcmQJc2hfZW50c2l6ZTsJCS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLworfSBFbGY2NF9TaGRyOworCisvKiBTcGVjaWFsIHNlY3Rpb24gaW5kaWNlcy4gICovCisKKyNkZWZpbmUgU0hOX1VOREVGCTAJCS8qIFVuZGVmaW5lZCBzZWN0aW9uICovCisjZGVmaW5lIFNITl9MT1JFU0VSVkUJMHhmZjAwCQkvKiBTdGFydCBvZiByZXNlcnZlZCBpbmRpY2VzICovCisjZGVmaW5lIFNITl9MT1BST0MJMHhmZjAwCQkvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgU0hOX0JFRk9SRQkweGZmMDAJCS8qIE9yZGVyIHNlY3Rpb24gYmVmb3JlIGFsbCBvdGhlcnMKKwkJCQkJICAgKFNvbGFyaXMpLiAgKi8KKyNkZWZpbmUgU0hOX0FGVEVSCTB4ZmYwMQkJLyogT3JkZXIgc2VjdGlvbiBhZnRlciBhbGwgb3RoZXJzCisJCQkJCSAgIChTb2xhcmlzKS4gICovCisjZGVmaW5lIFNITl9ISVBST0MJMHhmZjFmCQkvKiBFbmQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisjZGVmaW5lIFNITl9MT09TCTB4ZmYyMAkJLyogU3RhcnQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgU0hOX0hJT1MJMHhmZjNmCQkvKiBFbmQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgU0hOX0FCUwkJMHhmZmYxCQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBpcyBhYnNvbHV0ZSAqLworI2RlZmluZSBTSE5fQ09NTU9OCTB4ZmZmMgkJLyogQXNzb2NpYXRlZCBzeW1ib2wgaXMgY29tbW9uICovCisjZGVmaW5lIFNITl9YSU5ERVgJMHhmZmZmCQkvKiBJbmRleCBpcyBpbiBleHRyYSB0YWJsZS4gICovCisjZGVmaW5lIFNITl9ISVJFU0VSVkUJMHhmZmZmCQkvKiBFbmQgb2YgcmVzZXJ2ZWQgaW5kaWNlcyAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHNoX3R5cGUgKHNlY3Rpb24gdHlwZSkuICAqLworCisjZGVmaW5lIFNIVF9OVUxMCSAgMAkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgdW51c2VkICovCisjZGVmaW5lIFNIVF9QUk9HQklUUwkgIDEJCS8qIFByb2dyYW0gZGF0YSAqLworI2RlZmluZSBTSFRfU1lNVEFCCSAgMgkJLyogU3ltYm9sIHRhYmxlICovCisjZGVmaW5lIFNIVF9TVFJUQUIJICAzCQkvKiBTdHJpbmcgdGFibGUgKi8KKyNkZWZpbmUgU0hUX1JFTEEJICA0CQkvKiBSZWxvY2F0aW9uIGVudHJpZXMgd2l0aCBhZGRlbmRzICovCisjZGVmaW5lIFNIVF9IQVNICSAgNQkJLyogU3ltYm9sIGhhc2ggdGFibGUgKi8KKyNkZWZpbmUgU0hUX0RZTkFNSUMJICA2CQkvKiBEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgU0hUX05PVEUJICA3CQkvKiBOb3RlcyAqLworI2RlZmluZSBTSFRfTk9CSVRTCSAgOAkJLyogUHJvZ3JhbSBzcGFjZSB3aXRoIG5vIGRhdGEgKGJzcykgKi8KKyNkZWZpbmUgU0hUX1JFTAkJICA5CQkvKiBSZWxvY2F0aW9uIGVudHJpZXMsIG5vIGFkZGVuZHMgKi8KKyNkZWZpbmUgU0hUX1NITElCCSAgMTAJCS8qIFJlc2VydmVkICovCisjZGVmaW5lIFNIVF9EWU5TWU0JICAxMQkJLyogRHluYW1pYyBsaW5rZXIgc3ltYm9sIHRhYmxlICovCisjZGVmaW5lIFNIVF9JTklUX0FSUkFZCSAgMTQJCS8qIEFycmF5IG9mIGNvbnN0cnVjdG9ycyAqLworI2RlZmluZSBTSFRfRklOSV9BUlJBWQkgIDE1CQkvKiBBcnJheSBvZiBkZXN0cnVjdG9ycyAqLworI2RlZmluZSBTSFRfUFJFSU5JVF9BUlJBWSAxNgkJLyogQXJyYXkgb2YgcHJlLWNvbnN0cnVjdG9ycyAqLworI2RlZmluZSBTSFRfR1JPVVAJICAxNwkJLyogU2VjdGlvbiBncm91cCAqLworI2RlZmluZSBTSFRfU1lNVEFCX1NITkRYICAxOAkJLyogRXh0ZW5kZWQgc2VjdGlvbiBpbmRlY2VzICovCisjZGVmaW5lCVNIVF9OVU0JCSAgMTkJCS8qIE51bWJlciBvZiBkZWZpbmVkIHR5cGVzLiAgKi8KKyNkZWZpbmUgU0hUX0xPT1MJICAweDYwMDAwMDAwCS8qIFN0YXJ0IE9TLXNwZWNpZmljLiAgKi8KKyNkZWZpbmUgU0hUX0dOVV9BVFRSSUJVVEVTIDB4NmZmZmZmZjUJLyogT2JqZWN0IGF0dHJpYnV0ZXMuICAqLworI2RlZmluZSBTSFRfR05VX0hBU0gJICAweDZmZmZmZmY2CS8qIEdOVS1zdHlsZSBoYXNoIHRhYmxlLiAgKi8KKyNkZWZpbmUgU0hUX0dOVV9MSUJMSVNUCSAgMHg2ZmZmZmZmNwkvKiBQcmVsaW5rIGxpYnJhcnkgbGlzdCAqLworI2RlZmluZSBTSFRfQ0hFQ0tTVU0JICAweDZmZmZmZmY4CS8qIENoZWNrc3VtIGZvciBEU08gY29udGVudC4gICovCisjZGVmaW5lIFNIVF9MT1NVTlcJICAweDZmZmZmZmZhCS8qIFN1bi1zcGVjaWZpYyBsb3cgYm91bmQuICAqLworI2RlZmluZSBTSFRfU1VOV19tb3ZlCSAgMHg2ZmZmZmZmYQorI2RlZmluZSBTSFRfU1VOV19DT01EQVQgICAweDZmZmZmZmZiCisjZGVmaW5lIFNIVF9TVU5XX3N5bWluZm8gIDB4NmZmZmZmZmMKKyNkZWZpbmUgU0hUX0dOVV92ZXJkZWYJICAweDZmZmZmZmZkCS8qIFZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgU0hUX0dOVV92ZXJuZWVkCSAgMHg2ZmZmZmZmZQkvKiBWZXJzaW9uIG5lZWRzIHNlY3Rpb24uICAqLworI2RlZmluZSBTSFRfR05VX3ZlcnN5bQkgIDB4NmZmZmZmZmYJLyogVmVyc2lvbiBzeW1ib2wgdGFibGUuICAqLworI2RlZmluZSBTSFRfSElTVU5XCSAgMHg2ZmZmZmZmZgkvKiBTdW4tc3BlY2lmaWMgaGlnaCBib3VuZC4gICovCisjZGVmaW5lIFNIVF9ISU9TCSAgMHg2ZmZmZmZmZgkvKiBFbmQgT1Mtc3BlY2lmaWMgdHlwZSAqLworI2RlZmluZSBTSFRfTE9QUk9DCSAgMHg3MDAwMDAwMAkvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgU0hUX0hJUFJPQwkgIDB4N2ZmZmZmZmYJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZSBTSFRfTE9VU0VSCSAgMHg4MDAwMDAwMAkvKiBTdGFydCBvZiBhcHBsaWNhdGlvbi1zcGVjaWZpYyAqLworI2RlZmluZSBTSFRfSElVU0VSCSAgMHg4ZmZmZmZmZgkvKiBFbmQgb2YgYXBwbGljYXRpb24tc3BlY2lmaWMgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF9mbGFncyAoc2VjdGlvbiBmbGFncykuICAqLworCisjZGVmaW5lIFNIRl9XUklURQkgICAgICgxIDw8IDApCS8qIFdyaXRhYmxlICovCisjZGVmaW5lIFNIRl9BTExPQwkgICAgICgxIDw8IDEpCS8qIE9jY3VwaWVzIG1lbW9yeSBkdXJpbmcgZXhlY3V0aW9uICovCisjZGVmaW5lIFNIRl9FWEVDSU5TVFIJICAgICAoMSA8PCAyKQkvKiBFeGVjdXRhYmxlICovCisjZGVmaW5lIFNIRl9NRVJHRQkgICAgICgxIDw8IDQpCS8qIE1pZ2h0IGJlIG1lcmdlZCAqLworI2RlZmluZSBTSEZfU1RSSU5HUwkgICAgICgxIDw8IDUpCS8qIENvbnRhaW5zIG51bC10ZXJtaW5hdGVkIHN0cmluZ3MgKi8KKyNkZWZpbmUgU0hGX0lORk9fTElOSwkgICAgICgxIDw8IDYpCS8qIGBzaF9pbmZvJyBjb250YWlucyBTSFQgaW5kZXggKi8KKyNkZWZpbmUgU0hGX0xJTktfT1JERVIJICAgICAoMSA8PCA3KQkvKiBQcmVzZXJ2ZSBvcmRlciBhZnRlciBjb21iaW5pbmcgKi8KKyNkZWZpbmUgU0hGX09TX05PTkNPTkZPUk1JTkcgKDEgPDwgOCkJLyogTm9uLXN0YW5kYXJkIE9TIHNwZWNpZmljIGhhbmRsaW5nCisJCQkJCSAgIHJlcXVpcmVkICovCisjZGVmaW5lIFNIRl9HUk9VUAkgICAgICgxIDw8IDkpCS8qIFNlY3Rpb24gaXMgbWVtYmVyIG9mIGEgZ3JvdXAuICAqLworI2RlZmluZSBTSEZfVExTCQkgICAgICgxIDw8IDEwKQkvKiBTZWN0aW9uIGhvbGQgdGhyZWFkLWxvY2FsIGRhdGEuICAqLworI2RlZmluZSBTSEZfTUFTS09TCSAgICAgMHgwZmYwMDAwMAkvKiBPUy1zcGVjaWZpYy4gICovCisjZGVmaW5lIFNIRl9NQVNLUFJPQwkgICAgIDB4ZjAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCisjZGVmaW5lIFNIRl9PUkRFUkVECSAgICAgKDEgPDwgMzApCS8qIFNwZWNpYWwgb3JkZXJpbmcgcmVxdWlyZW1lbnQKKwkJCQkJICAgKFNvbGFyaXMpLiAgKi8KKyNkZWZpbmUgU0hGX0VYQ0xVREUJICAgICAoMSA8PCAzMSkJLyogU2VjdGlvbiBpcyBleGNsdWRlZCB1bmxlc3MKKwkJCQkJICAgcmVmZXJlbmNlZCBvciBhbGxvY2F0ZWQgKFNvbGFyaXMpLiovCisKKy8qIFNlY3Rpb24gZ3JvdXAgaGFuZGxpbmcuICAqLworI2RlZmluZSBHUlBfQ09NREFUCTB4MQkJLyogTWFyayBncm91cCBhcyBDT01EQVQuICAqLworCisvKiBTeW1ib2wgdGFibGUgZW50cnkuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Xb3JkCXN0X25hbWU7CQkvKiBTeW1ib2wgbmFtZSAoc3RyaW5nIHRibCBpbmRleCkgKi8KKyAgRWxmMzJfQWRkcglzdF92YWx1ZTsJCS8qIFN5bWJvbCB2YWx1ZSAqLworICBFbGYzMl9Xb3JkCXN0X3NpemU7CQkvKiBTeW1ib2wgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyCXN0X2luZm87CQkvKiBTeW1ib2wgdHlwZSBhbmQgYmluZGluZyAqLworICB1bnNpZ25lZCBjaGFyCXN0X290aGVyOwkJLyogU3ltYm9sIHZpc2liaWxpdHkgKi8KKyAgRWxmMzJfU2VjdGlvbglzdF9zaG5keDsJCS8qIFNlY3Rpb24gaW5kZXggKi8KK30gRWxmMzJfU3ltOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9Xb3JkCXN0X25hbWU7CQkvKiBTeW1ib2wgbmFtZSAoc3RyaW5nIHRibCBpbmRleCkgKi8KKyAgdW5zaWduZWQgY2hhcglzdF9pbmZvOwkJLyogU3ltYm9sIHR5cGUgYW5kIGJpbmRpbmcgKi8KKyAgdW5zaWduZWQgY2hhciBzdF9vdGhlcjsJCS8qIFN5bWJvbCB2aXNpYmlsaXR5ICovCisgIEVsZjY0X1NlY3Rpb24Jc3Rfc2huZHg7CQkvKiBTZWN0aW9uIGluZGV4ICovCisgIEVsZjY0X0FkZHIJc3RfdmFsdWU7CQkvKiBTeW1ib2wgdmFsdWUgKi8KKyAgRWxmNjRfWHdvcmQJc3Rfc2l6ZTsJCS8qIFN5bWJvbCBzaXplICovCit9IEVsZjY0X1N5bTsKKworLyogVGhlIHN5bWluZm8gc2VjdGlvbiBpZiBhdmFpbGFibGUgY29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dAorICAgZXZlcnkgZHluYW1pYyBzeW1ib2wuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9IYWxmIHNpX2JvdW5kdG87CQkvKiBEaXJlY3QgYmluZGluZ3MsIHN5bWJvbCBib3VuZCB0byAqLworICBFbGYzMl9IYWxmIHNpX2ZsYWdzOwkJCS8qIFBlciBzeW1ib2wgZmxhZ3MgKi8KK30gRWxmMzJfU3ltaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfSGFsZiBzaV9ib3VuZHRvOwkJLyogRGlyZWN0IGJpbmRpbmdzLCBzeW1ib2wgYm91bmQgdG8gKi8KKyAgRWxmNjRfSGFsZiBzaV9mbGFnczsJCQkvKiBQZXIgc3ltYm9sIGZsYWdzICovCit9IEVsZjY0X1N5bWluZm87CisKKy8qIFBvc3NpYmxlIHZhbHVlcyBmb3Igc2lfYm91bmR0by4gICovCisjZGVmaW5lIFNZTUlORk9fQlRfU0VMRgkJMHhmZmZmCS8qIFN5bWJvbCBib3VuZCB0byBzZWxmICovCisjZGVmaW5lIFNZTUlORk9fQlRfUEFSRU5UCTB4ZmZmZQkvKiBTeW1ib2wgYm91bmQgdG8gcGFyZW50ICovCisjZGVmaW5lIFNZTUlORk9fQlRfTE9XUkVTRVJWRQkweGZmMDAJLyogQmVnaW5uaW5nIG9mIHJlc2VydmVkIGVudHJpZXMgKi8KKworLyogUG9zc2libGUgYml0bWFza3MgZm9yIHNpX2ZsYWdzLiAgKi8KKyNkZWZpbmUgU1lNSU5GT19GTEdfRElSRUNUCTB4MDAwMQkvKiBEaXJlY3QgYm91bmQgc3ltYm9sICovCisjZGVmaW5lIFNZTUlORk9fRkxHX1BBU1NUSFJVCTB4MDAwMgkvKiBQYXNzLXRocnUgc3ltYm9sIGZvciB0cmFuc2xhdG9yICovCisjZGVmaW5lIFNZTUlORk9fRkxHX0NPUFkJMHgwMDA0CS8qIFN5bWJvbCBpcyBhIGNvcHktcmVsb2MgKi8KKyNkZWZpbmUgU1lNSU5GT19GTEdfTEFaWUxPQUQJMHgwMDA4CS8qIFN5bWJvbCBib3VuZCB0byBvYmplY3QgdG8gYmUgbGF6eQorCQkJCQkgICBsb2FkZWQgKi8KKy8qIFN5bWluZm8gdmVyc2lvbiB2YWx1ZXMuICAqLworI2RlZmluZSBTWU1JTkZPX05PTkUJCTAKKyNkZWZpbmUgU1lNSU5GT19DVVJSRU5UCQkxCisjZGVmaW5lIFNZTUlORk9fTlVNCQkyCisKKworLyogSG93IHRvIGV4dHJhY3QgYW5kIGluc2VydCBpbmZvcm1hdGlvbiBoZWxkIGluIHRoZSBzdF9pbmZvIGZpZWxkLiAgKi8KKworI2RlZmluZSBFTEYzMl9TVF9CSU5EKHZhbCkJCSgoKHVuc2lnbmVkIGNoYXIpICh2YWwpKSA+PiA0KQorI2RlZmluZSBFTEYzMl9TVF9UWVBFKHZhbCkJCSgodmFsKSAmIDB4ZikKKyNkZWZpbmUgRUxGMzJfU1RfSU5GTyhiaW5kLCB0eXBlKQkoKChiaW5kKSA8PCA0KSArICgodHlwZSkgJiAweGYpKQorCisvKiBCb3RoIEVsZjMyX1N5bSBhbmQgRWxmNjRfU3ltIHVzZSB0aGUgc2FtZSBvbmUtYnl0ZSBzdF9pbmZvIGZpZWxkLiAgKi8KKyNkZWZpbmUgRUxGNjRfU1RfQklORCh2YWwpCQlFTEYzMl9TVF9CSU5EICh2YWwpCisjZGVmaW5lIEVMRjY0X1NUX1RZUEUodmFsKQkJRUxGMzJfU1RfVFlQRSAodmFsKQorI2RlZmluZSBFTEY2NF9TVF9JTkZPKGJpbmQsIHR5cGUpCUVMRjMyX1NUX0lORk8gKChiaW5kKSwgKHR5cGUpKQorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIFNUX0JJTkQgc3ViZmllbGQgb2Ygc3RfaW5mbyAoc3ltYm9sIGJpbmRpbmcpLiAgKi8KKworI2RlZmluZSBTVEJfTE9DQUwJMAkJLyogTG9jYWwgc3ltYm9sICovCisjZGVmaW5lIFNUQl9HTE9CQUwJMQkJLyogR2xvYmFsIHN5bWJvbCAqLworI2RlZmluZSBTVEJfV0VBSwkyCQkvKiBXZWFrIHN5bWJvbCAqLworI2RlZmluZQlTVEJfTlVNCQkzCQkvKiBOdW1iZXIgb2YgZGVmaW5lZCB0eXBlcy4gICovCisjZGVmaW5lIFNUQl9MT09TCTEwCQkvKiBTdGFydCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBTVEJfR05VX1VOSVFVRQkxMAkJLyogVW5pcXVlIHN5bWJvbC4gICovCisjZGVmaW5lIFNUQl9ISU9TCTEyCQkvKiBFbmQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgU1RCX0xPUFJPQwkxMwkJLyogU3RhcnQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisjZGVmaW5lIFNUQl9ISVBST0MJMTUJCS8qIEVuZCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBTVF9UWVBFIHN1YmZpZWxkIG9mIHN0X2luZm8gKHN5bWJvbCB0eXBlKS4gICovCisKKyNkZWZpbmUgU1RUX05PVFlQRQkwCQkvKiBTeW1ib2wgdHlwZSBpcyB1bnNwZWNpZmllZCAqLworI2RlZmluZSBTVFRfT0JKRUNUCTEJCS8qIFN5bWJvbCBpcyBhIGRhdGEgb2JqZWN0ICovCisjZGVmaW5lIFNUVF9GVU5DCTIJCS8qIFN5bWJvbCBpcyBhIGNvZGUgb2JqZWN0ICovCisjZGVmaW5lIFNUVF9TRUNUSU9OCTMJCS8qIFN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uICovCisjZGVmaW5lIFNUVF9GSUxFCTQJCS8qIFN5bWJvbCdzIG5hbWUgaXMgZmlsZSBuYW1lICovCisjZGVmaW5lIFNUVF9DT01NT04JNQkJLyogU3ltYm9sIGlzIGEgY29tbW9uIGRhdGEgb2JqZWN0ICovCisjZGVmaW5lIFNUVF9UTFMJCTYJCS8qIFN5bWJvbCBpcyB0aHJlYWQtbG9jYWwgZGF0YSBvYmplY3QqLworI2RlZmluZQlTVFRfTlVNCQk3CQkvKiBOdW1iZXIgb2YgZGVmaW5lZCB0eXBlcy4gICovCisjZGVmaW5lIFNUVF9MT09TCTEwCQkvKiBTdGFydCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBTVFRfR05VX0lGVU5DCTEwCQkvKiBTeW1ib2wgaXMgaW5kaXJlY3QgY29kZSBvYmplY3QgKi8KKyNkZWZpbmUgU1RUX0hJT1MJMTIJCS8qIEVuZCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBTVFRfTE9QUk9DCTEzCQkvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgU1RUX0hJUFJPQwkxNQkJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworCisKKy8qIFN5bWJvbCB0YWJsZSBpbmRpY2VzIGFyZSBmb3VuZCBpbiB0aGUgaGFzaCBidWNrZXRzIGFuZCBjaGFpbiB0YWJsZQorICAgb2YgYSBzeW1ib2wgaGFzaCB0YWJsZSBzZWN0aW9uLiAgVGhpcyBzcGVjaWFsIGluZGV4IHZhbHVlIGluZGljYXRlcworICAgdGhlIGVuZCBvZiBhIGNoYWluLCBtZWFuaW5nIG5vIGZ1cnRoZXIgc3ltYm9scyBhcmUgZm91bmQgaW4gdGhhdCBidWNrZXQuICAqLworCisjZGVmaW5lIFNUTl9VTkRFRgkwCQkvKiBFbmQgb2YgYSBjaGFpbi4gICovCisKKworLyogSG93IHRvIGV4dHJhY3QgYW5kIGluc2VydCBpbmZvcm1hdGlvbiBoZWxkIGluIHRoZSBzdF9vdGhlciBmaWVsZC4gICovCisKKyNkZWZpbmUgRUxGMzJfU1RfVklTSUJJTElUWShvKQkoKG8pICYgMHgwMykKKworLyogRm9yIEVMRjY0IHRoZSBkZWZpbml0aW9ucyBhcmUgdGhlIHNhbWUuICAqLworI2RlZmluZSBFTEY2NF9TVF9WSVNJQklMSVRZKG8pCUVMRjMyX1NUX1ZJU0lCSUxJVFkgKG8pCisKKy8qIFN5bWJvbCB2aXNpYmlsaXR5IHNwZWNpZmljYXRpb24gZW5jb2RlZCBpbiB0aGUgc3Rfb3RoZXIgZmllbGQuICAqLworI2RlZmluZSBTVFZfREVGQVVMVAkwCQkvKiBEZWZhdWx0IHN5bWJvbCB2aXNpYmlsaXR5IHJ1bGVzICovCisjZGVmaW5lIFNUVl9JTlRFUk5BTAkxCQkvKiBQcm9jZXNzb3Igc3BlY2lmaWMgaGlkZGVuIGNsYXNzICovCisjZGVmaW5lIFNUVl9ISURERU4JMgkJLyogU3ltIHVuYXZhaWxhYmxlIGluIG90aGVyIG1vZHVsZXMgKi8KKyNkZWZpbmUgU1RWX1BST1RFQ1RFRAkzCQkvKiBOb3QgcHJlZW1wdGlibGUsIG5vdCBleHBvcnRlZCAqLworCisKKy8qIFJlbG9jYXRpb24gdGFibGUgZW50cnkgd2l0aG91dCBhZGRlbmQgKGluIHNlY3Rpb24gb2YgdHlwZSBTSFRfUkVMKS4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX0FkZHIJcl9vZmZzZXQ7CQkvKiBBZGRyZXNzICovCisgIEVsZjMyX1dvcmQJcl9pbmZvOwkJCS8qIFJlbG9jYXRpb24gdHlwZSBhbmQgc3ltYm9sIGluZGV4ICovCit9IEVsZjMyX1JlbDsKKworLyogSSBoYXZlIHNlZW4gdHdvIGRpZmZlcmVudCBkZWZpbml0aW9ucyBvZiB0aGUgRWxmNjRfUmVsIGFuZAorICAgRWxmNjRfUmVsYSBzdHJ1Y3R1cmVzLCBzbyB3ZSdsbCBsZWF2ZSB0aGVtIG91dCB1bnRpbCBOb3ZlbGwgKG9yCisgICB3aG9ldmVyKSBnZXRzIHRoZWlyIGFjdCB0b2dldGhlci4gICovCisvKiBUaGUgZm9sbG93aW5nLCBhdCBsZWFzdCwgaXMgdXNlZCBvbiBTcGFyYyB2OSwgTUlQUywgYW5kIEFscGhhLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfQWRkcglyX29mZnNldDsJCS8qIEFkZHJlc3MgKi8KKyAgRWxmNjRfWHdvcmQJcl9pbmZvOwkJCS8qIFJlbG9jYXRpb24gdHlwZSBhbmQgc3ltYm9sIGluZGV4ICovCit9IEVsZjY0X1JlbDsKKworLyogUmVsb2NhdGlvbiB0YWJsZSBlbnRyeSB3aXRoIGFkZGVuZCAoaW4gc2VjdGlvbiBvZiB0eXBlIFNIVF9SRUxBKS4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX0FkZHIJcl9vZmZzZXQ7CQkvKiBBZGRyZXNzICovCisgIEVsZjMyX1dvcmQJcl9pbmZvOwkJCS8qIFJlbG9jYXRpb24gdHlwZSBhbmQgc3ltYm9sIGluZGV4ICovCisgIEVsZjMyX1N3b3JkCXJfYWRkZW5kOwkJLyogQWRkZW5kICovCit9IEVsZjMyX1JlbGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X0FkZHIJcl9vZmZzZXQ7CQkvKiBBZGRyZXNzICovCisgIEVsZjY0X1h3b3JkCXJfaW5mbzsJCQkvKiBSZWxvY2F0aW9uIHR5cGUgYW5kIHN5bWJvbCBpbmRleCAqLworICBFbGY2NF9TeHdvcmQJcl9hZGRlbmQ7CQkvKiBBZGRlbmQgKi8KK30gRWxmNjRfUmVsYTsKKworLyogSG93IHRvIGV4dHJhY3QgYW5kIGluc2VydCBpbmZvcm1hdGlvbiBoZWxkIGluIHRoZSByX2luZm8gZmllbGQuICAqLworCisjZGVmaW5lIEVMRjMyX1JfU1lNKHZhbCkJCSgodmFsKSA+PiA4KQorI2RlZmluZSBFTEYzMl9SX1RZUEUodmFsKQkJKCh2YWwpICYgMHhmZikKKyNkZWZpbmUgRUxGMzJfUl9JTkZPKHN5bSwgdHlwZSkJCSgoKHN5bSkgPDwgOCkgKyAoKHR5cGUpICYgMHhmZikpCisKKyNkZWZpbmUgRUxGNjRfUl9TWU0oaSkJCQkoKGkpID4+IDMyKQorI2RlZmluZSBFTEY2NF9SX1RZUEUoaSkJCQkoKGkpICYgMHhmZmZmZmZmZikKKyNkZWZpbmUgRUxGNjRfUl9JTkZPKHN5bSx0eXBlKQkJKCgoKEVsZjY0X1h3b3JkKSAoc3ltKSkgPDwgMzIpICsgKHR5cGUpKQorCisvKiBQcm9ncmFtIHNlZ21lbnQgaGVhZGVyLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZAlwX3R5cGU7CQkJLyogU2VnbWVudCB0eXBlICovCisgIEVsZjMyX09mZglwX29mZnNldDsJCS8qIFNlZ21lbnQgZmlsZSBvZmZzZXQgKi8KKyAgRWxmMzJfQWRkcglwX3ZhZGRyOwkJLyogU2VnbWVudCB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgRWxmMzJfQWRkcglwX3BhZGRyOwkJLyogU2VnbWVudCBwaHlzaWNhbCBhZGRyZXNzICovCisgIEVsZjMyX1dvcmQJcF9maWxlc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gZmlsZSAqLworICBFbGYzMl9Xb3JkCXBfbWVtc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gbWVtb3J5ICovCisgIEVsZjMyX1dvcmQJcF9mbGFnczsJCS8qIFNlZ21lbnQgZmxhZ3MgKi8KKyAgRWxmMzJfV29yZAlwX2FsaWduOwkJLyogU2VnbWVudCBhbGlnbm1lbnQgKi8KK30gRWxmMzJfUGhkcjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfV29yZAlwX3R5cGU7CQkJLyogU2VnbWVudCB0eXBlICovCisgIEVsZjY0X1dvcmQJcF9mbGFnczsJCS8qIFNlZ21lbnQgZmxhZ3MgKi8KKyAgRWxmNjRfT2ZmCXBfb2Zmc2V0OwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLworICBFbGY2NF9BZGRyCXBfdmFkZHI7CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLworICBFbGY2NF9BZGRyCXBfcGFkZHI7CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KKyAgRWxmNjRfWHdvcmQJcF9maWxlc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gZmlsZSAqLworICBFbGY2NF9Yd29yZAlwX21lbXN6OwkJLyogU2VnbWVudCBzaXplIGluIG1lbW9yeSAqLworICBFbGY2NF9Yd29yZAlwX2FsaWduOwkJLyogU2VnbWVudCBhbGlnbm1lbnQgKi8KK30gRWxmNjRfUGhkcjsKKworLyogU3BlY2lhbCB2YWx1ZSBmb3IgZV9waG51bS4gIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJlYWwgbnVtYmVyIG9mCisgICBwcm9ncmFtIGhlYWRlcnMgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIGVfcGhudW0uICBJbnN0ZWFkIHRoZSByZWFsCisgICB2YWx1ZSBpcyBpbiB0aGUgZmllbGQgc2hfaW5mbyBvZiBzZWN0aW9uIDAuICAqLworCisjZGVmaW5lIFBOX1hOVU0JCTB4ZmZmZgorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHBfdHlwZSAoc2VnbWVudCB0eXBlKS4gICovCisKKyNkZWZpbmUJUFRfTlVMTAkJMAkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgdW51c2VkICovCisjZGVmaW5lIFBUX0xPQUQJCTEJCS8qIExvYWRhYmxlIHByb2dyYW0gc2VnbWVudCAqLworI2RlZmluZSBQVF9EWU5BTUlDCTIJCS8qIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBQVF9JTlRFUlAJMwkJLyogUHJvZ3JhbSBpbnRlcnByZXRlciAqLworI2RlZmluZSBQVF9OT1RFCQk0CQkvKiBBdXhpbGlhcnkgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUFRfU0hMSUIJNQkJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUFRfUEhEUgkJNgkJLyogRW50cnkgZm9yIGhlYWRlciB0YWJsZSBpdHNlbGYgKi8KKyNkZWZpbmUgUFRfVExTCQk3CQkvKiBUaHJlYWQtbG9jYWwgc3RvcmFnZSBzZWdtZW50ICovCisjZGVmaW5lCVBUX05VTQkJOAkJLyogTnVtYmVyIG9mIGRlZmluZWQgdHlwZXMgKi8KKyNkZWZpbmUgUFRfTE9PUwkJMHg2MDAwMDAwMAkvKiBTdGFydCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBQVF9HTlVfRUhfRlJBTUUJMHg2NDc0ZTU1MAkvKiBHQ0MgLmVoX2ZyYW1lX2hkciBzZWdtZW50ICovCisjZGVmaW5lIFBUX0dOVV9TVEFDSwkweDY0NzRlNTUxCS8qIEluZGljYXRlcyBzdGFjayBleGVjdXRhYmlsaXR5ICovCisjZGVmaW5lIFBUX0dOVV9SRUxSTwkweDY0NzRlNTUyCS8qIFJlYWQtb25seSBhZnRlciByZWxvY2F0aW9uICovCisjZGVmaW5lIFBUX0xPU1VOVwkweDZmZmZmZmZhCisjZGVmaW5lIFBUX1NVTldCU1MJMHg2ZmZmZmZmYQkvKiBTdW4gU3BlY2lmaWMgc2VnbWVudCAqLworI2RlZmluZSBQVF9TVU5XU1RBQ0sJMHg2ZmZmZmZmYgkvKiBTdGFjayBzZWdtZW50ICovCisjZGVmaW5lIFBUX0hJU1VOVwkweDZmZmZmZmZmCisjZGVmaW5lIFBUX0hJT1MJCTB4NmZmZmZmZmYJLyogRW5kIG9mIE9TLXNwZWNpZmljICovCisjZGVmaW5lIFBUX0xPUFJPQwkweDcwMDAwMDAwCS8qIFN0YXJ0IG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZSBQVF9ISVBST0MJMHg3ZmZmZmZmZgkvKiBFbmQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgcF9mbGFncyAoc2VnbWVudCBmbGFncykuICAqLworCisjZGVmaW5lIFBGX1gJCSgxIDw8IDApCS8qIFNlZ21lbnQgaXMgZXhlY3V0YWJsZSAqLworI2RlZmluZSBQRl9XCQkoMSA8PCAxKQkvKiBTZWdtZW50IGlzIHdyaXRhYmxlICovCisjZGVmaW5lIFBGX1IJCSgxIDw8IDIpCS8qIFNlZ21lbnQgaXMgcmVhZGFibGUgKi8KKyNkZWZpbmUgUEZfTUFTS09TCTB4MGZmMDAwMDAJLyogT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgUEZfTUFTS1BST0MJMHhmMDAwMDAwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBub3RlIHNlZ21lbnQgZGVzY3JpcHRvciB0eXBlcyBmb3IgY29yZSBmaWxlcy4gKi8KKworI2RlZmluZSBOVF9QUlNUQVRVUwkxCQkvKiBDb250YWlucyBjb3B5IG9mIHByc3RhdHVzIHN0cnVjdCAqLworI2RlZmluZSBOVF9GUFJFR1NFVAkyCQkvKiBDb250YWlucyBjb3B5IG9mIGZwcmVnc2V0IHN0cnVjdCAqLworI2RlZmluZSBOVF9QUlBTSU5GTwkzCQkvKiBDb250YWlucyBjb3B5IG9mIHBycHNpbmZvIHN0cnVjdCAqLworI2RlZmluZSBOVF9QUlhSRUcJNAkJLyogQ29udGFpbnMgY29weSBvZiBwcnhyZWdzZXQgc3RydWN0ICovCisjZGVmaW5lIE5UX1RBU0tTVFJVQ1QJNAkJLyogQ29udGFpbnMgY29weSBvZiB0YXNrIHN0cnVjdHVyZSAqLworI2RlZmluZSBOVF9QTEFURk9STQk1CQkvKiBTdHJpbmcgZnJvbSBzeXNpbmZvKFNJX1BMQVRGT1JNKSAqLworI2RlZmluZSBOVF9BVVhWCQk2CQkvKiBDb250YWlucyBjb3B5IG9mIGF1eHYgYXJyYXkgKi8KKyNkZWZpbmUgTlRfR1dJTkRPV1MJNwkJLyogQ29udGFpbnMgY29weSBvZiBnd2luZG93cyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfQVNSUwkJOAkJLyogQ29udGFpbnMgY29weSBvZiBhc3JzZXQgc3RydWN0ICovCisjZGVmaW5lIE5UX1BTVEFUVVMJMTAJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHN0YXR1cyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFNJTkZPCTEzCQkvKiBDb250YWlucyBjb3B5IG9mIHBzaW5mbyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFJDUkVECTE0CQkvKiBDb250YWlucyBjb3B5IG9mIHByY3JlZCBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfVVRTTkFNRQkxNQkJLyogQ29udGFpbnMgY29weSBvZiB1dHNuYW1lIHN0cnVjdCAqLworI2RlZmluZSBOVF9MV1BTVEFUVVMJMTYJCS8qIENvbnRhaW5zIGNvcHkgb2YgbHdwc3RhdHVzIHN0cnVjdCAqLworI2RlZmluZSBOVF9MV1BTSU5GTwkxNwkJLyogQ29udGFpbnMgY29weSBvZiBsd3BpbmZvIHN0cnVjdCAqLworI2RlZmluZSBOVF9QUkZQWFJFRwkyMAkJLyogQ29udGFpbnMgY29weSBvZiBmcHJ4cmVnc2V0IHN0cnVjdCAqLworI2RlZmluZSBOVF9QUlhGUFJFRwkweDQ2ZTYyYjdmCS8qIENvbnRhaW5zIGNvcHkgb2YgdXNlcl9meHNyX3N0cnVjdCAqLworI2RlZmluZSBOVF9QUENfVk1YCTB4MTAwCQkvKiBQb3dlclBDIEFsdGl2ZWMvVk1YIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVF9QUENfU1BFCTB4MTAxCQkvKiBQb3dlclBDIFNQRS9FVlIgcmVnaXN0ZXJzICovCisjZGVmaW5lIE5UX1BQQ19WU1gJMHgxMDIJCS8qIFBvd2VyUEMgVlNYIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVF8zODZfVExTCTB4MjAwCQkvKiBpMzg2IFRMUyBzbG90cyAoc3RydWN0IHVzZXJfZGVzYykgKi8KKyNkZWZpbmUgTlRfMzg2X0lPUEVSTQkweDIwMQkJLyogeDg2IGlvIHBlcm1pc3Npb24gYml0bWFwICgxPWRlbnkpICovCisjZGVmaW5lIE5UX1g4Nl9YU1RBVEUJMHgyMDIJCS8qIHg4NiBleHRlbmRlZCBzdGF0ZSB1c2luZyB4c2F2ZSAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHRoZSBub3RlIHNlZ21lbnQgZGVzY3JpcHRvciB0eXBlcyBmb3Igb2JqZWN0IGZpbGVzLiAgKi8KKworI2RlZmluZSBOVF9WRVJTSU9OCTEJCS8qIENvbnRhaW5zIGEgdmVyc2lvbiBzdHJpbmcuICAqLworCisKKy8qIER5bmFtaWMgc2VjdGlvbiBlbnRyeS4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1N3b3JkCWRfdGFnOwkJCS8qIER5bmFtaWMgZW50cnkgdHlwZSAqLworICB1bmlvbgorICAgIHsKKyAgICAgIEVsZjMyX1dvcmQgZF92YWw7CQkJLyogSW50ZWdlciB2YWx1ZSAqLworICAgICAgRWxmMzJfQWRkciBkX3B0cjsJCQkvKiBBZGRyZXNzIHZhbHVlICovCisgICAgfSBkX3VuOworfSBFbGYzMl9EeW47CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X1N4d29yZAlkX3RhZzsJCQkvKiBEeW5hbWljIGVudHJ5IHR5cGUgKi8KKyAgdW5pb24KKyAgICB7CisgICAgICBFbGY2NF9Yd29yZCBkX3ZhbDsJCS8qIEludGVnZXIgdmFsdWUgKi8KKyAgICAgIEVsZjY0X0FkZHIgZF9wdHI7CQkJLyogQWRkcmVzcyB2YWx1ZSAqLworICAgIH0gZF91bjsKK30gRWxmNjRfRHluOworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGRfdGFnIChkeW5hbWljIGVudHJ5IHR5cGUpLiAgKi8KKworI2RlZmluZSBEVF9OVUxMCQkwCQkvKiBNYXJrcyBlbmQgb2YgZHluYW1pYyBzZWN0aW9uICovCisjZGVmaW5lIERUX05FRURFRAkxCQkvKiBOYW1lIG9mIG5lZWRlZCBsaWJyYXJ5ICovCisjZGVmaW5lIERUX1BMVFJFTFNaCTIJCS8qIFNpemUgaW4gYnl0ZXMgb2YgUExUIHJlbG9jcyAqLworI2RlZmluZSBEVF9QTFRHT1QJMwkJLyogUHJvY2Vzc29yIGRlZmluZWQgdmFsdWUgKi8KKyNkZWZpbmUgRFRfSEFTSAkJNAkJLyogQWRkcmVzcyBvZiBzeW1ib2wgaGFzaCB0YWJsZSAqLworI2RlZmluZSBEVF9TVFJUQUIJNQkJLyogQWRkcmVzcyBvZiBzdHJpbmcgdGFibGUgKi8KKyNkZWZpbmUgRFRfU1lNVEFCCTYJCS8qIEFkZHJlc3Mgb2Ygc3ltYm9sIHRhYmxlICovCisjZGVmaW5lIERUX1JFTEEJCTcJCS8qIEFkZHJlc3Mgb2YgUmVsYSByZWxvY3MgKi8KKyNkZWZpbmUgRFRfUkVMQVNaCTgJCS8qIFRvdGFsIHNpemUgb2YgUmVsYSByZWxvY3MgKi8KKyNkZWZpbmUgRFRfUkVMQUVOVAk5CQkvKiBTaXplIG9mIG9uZSBSZWxhIHJlbG9jICovCisjZGVmaW5lIERUX1NUUlNaCTEwCQkvKiBTaXplIG9mIHN0cmluZyB0YWJsZSAqLworI2RlZmluZSBEVF9TWU1FTlQJMTEJCS8qIFNpemUgb2Ygb25lIHN5bWJvbCB0YWJsZSBlbnRyeSAqLworI2RlZmluZSBEVF9JTklUCQkxMgkJLyogQWRkcmVzcyBvZiBpbml0IGZ1bmN0aW9uICovCisjZGVmaW5lIERUX0ZJTkkJCTEzCQkvKiBBZGRyZXNzIG9mIHRlcm1pbmF0aW9uIGZ1bmN0aW9uICovCisjZGVmaW5lIERUX1NPTkFNRQkxNAkJLyogTmFtZSBvZiBzaGFyZWQgb2JqZWN0ICovCisjZGVmaW5lIERUX1JQQVRICTE1CQkvKiBMaWJyYXJ5IHNlYXJjaCBwYXRoIChkZXByZWNhdGVkKSAqLworI2RlZmluZSBEVF9TWU1CT0xJQwkxNgkJLyogU3RhcnQgc3ltYm9sIHNlYXJjaCBoZXJlICovCisjZGVmaW5lIERUX1JFTAkJMTcJCS8qIEFkZHJlc3Mgb2YgUmVsIHJlbG9jcyAqLworI2RlZmluZSBEVF9SRUxTWgkxOAkJLyogVG90YWwgc2l6ZSBvZiBSZWwgcmVsb2NzICovCisjZGVmaW5lIERUX1JFTEVOVAkxOQkJLyogU2l6ZSBvZiBvbmUgUmVsIHJlbG9jICovCisjZGVmaW5lIERUX1BMVFJFTAkyMAkJLyogVHlwZSBvZiByZWxvYyBpbiBQTFQgKi8KKyNkZWZpbmUgRFRfREVCVUcJMjEJCS8qIEZvciBkZWJ1Z2dpbmc7IHVuc3BlY2lmaWVkICovCisjZGVmaW5lIERUX1RFWFRSRUwJMjIJCS8qIFJlbG9jIG1pZ2h0IG1vZGlmeSAudGV4dCAqLworI2RlZmluZSBEVF9KTVBSRUwJMjMJCS8qIEFkZHJlc3Mgb2YgUExUIHJlbG9jcyAqLworI2RlZmluZQlEVF9CSU5EX05PVwkyNAkJLyogUHJvY2VzcyByZWxvY2F0aW9ucyBvZiBvYmplY3QgKi8KKyNkZWZpbmUJRFRfSU5JVF9BUlJBWQkyNQkJLyogQXJyYXkgd2l0aCBhZGRyZXNzZXMgb2YgaW5pdCBmY3QgKi8KKyNkZWZpbmUJRFRfRklOSV9BUlJBWQkyNgkJLyogQXJyYXkgd2l0aCBhZGRyZXNzZXMgb2YgZmluaSBmY3QgKi8KKyNkZWZpbmUJRFRfSU5JVF9BUlJBWVNaCTI3CQkvKiBTaXplIGluIGJ5dGVzIG9mIERUX0lOSVRfQVJSQVkgKi8KKyNkZWZpbmUJRFRfRklOSV9BUlJBWVNaCTI4CQkvKiBTaXplIGluIGJ5dGVzIG9mIERUX0ZJTklfQVJSQVkgKi8KKyNkZWZpbmUgRFRfUlVOUEFUSAkyOQkJLyogTGlicmFyeSBzZWFyY2ggcGF0aCAqLworI2RlZmluZSBEVF9GTEFHUwkzMAkJLyogRmxhZ3MgZm9yIHRoZSBvYmplY3QgYmVpbmcgbG9hZGVkICovCisjZGVmaW5lIERUX0VOQ09ESU5HCTMyCQkvKiBTdGFydCBvZiBlbmNvZGVkIHJhbmdlICovCisjZGVmaW5lIERUX1BSRUlOSVRfQVJSQVkgMzIJCS8qIEFycmF5IHdpdGggYWRkcmVzc2VzIG9mIHByZWluaXQgZmN0Ki8KKyNkZWZpbmUgRFRfUFJFSU5JVF9BUlJBWVNaIDMzCQkvKiBzaXplIGluIGJ5dGVzIG9mIERUX1BSRUlOSVRfQVJSQVkgKi8KKyNkZWZpbmUJRFRfTlVNCQkzNAkJLyogTnVtYmVyIHVzZWQgKi8KKyNkZWZpbmUgRFRfTE9PUwkJMHg2MDAwMDAwZAkvKiBTdGFydCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBEVF9ISU9TCQkweDZmZmZmMDAwCS8qIEVuZCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBEVF9MT1BST0MJMHg3MDAwMDAwMAkvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgRFRfSElQUk9DCTB4N2ZmZmZmZmYJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZQlEVF9QUk9DTlVNCURUX01JUFNfTlVNCS8qIE1vc3QgdXNlZCBieSBhbnkgcHJvY2Vzc29yICovCisKKy8qIERUXyogZW50cmllcyB3aGljaCBmYWxsIGJldHdlZW4gRFRfVkFMUk5HSEkgJiBEVF9WQUxSTkdMTyB1c2UgdGhlCisgICBEeW4uZF91bi5kX3ZhbCBmaWVsZCBvZiB0aGUgRWxmKl9EeW4gc3RydWN0dXJlLiAgVGhpcyBmb2xsb3dzIFN1bidzCisgICBhcHByb2FjaC4gICovCisjZGVmaW5lIERUX1ZBTFJOR0xPCTB4NmZmZmZkMDAKKyNkZWZpbmUgRFRfR05VX1BSRUxJTktFRCAweDZmZmZmZGY1CS8qIFByZWxpbmtpbmcgdGltZXN0YW1wICovCisjZGVmaW5lIERUX0dOVV9DT05GTElDVFNaIDB4NmZmZmZkZjYJLyogU2l6ZSBvZiBjb25mbGljdCBzZWN0aW9uICovCisjZGVmaW5lIERUX0dOVV9MSUJMSVNUU1ogMHg2ZmZmZmRmNwkvKiBTaXplIG9mIGxpYnJhcnkgbGlzdCAqLworI2RlZmluZSBEVF9DSEVDS1NVTQkweDZmZmZmZGY4CisjZGVmaW5lIERUX1BMVFBBRFNaCTB4NmZmZmZkZjkKKyNkZWZpbmUgRFRfTU9WRUVOVAkweDZmZmZmZGZhCisjZGVmaW5lIERUX01PVkVTWgkweDZmZmZmZGZiCisjZGVmaW5lIERUX0ZFQVRVUkVfMQkweDZmZmZmZGZjCS8qIEZlYXR1cmUgc2VsZWN0aW9uIChEVEZfKikuICAqLworI2RlZmluZSBEVF9QT1NGTEFHXzEJMHg2ZmZmZmRmZAkvKiBGbGFncyBmb3IgRFRfKiBlbnRyaWVzLCBlZmZlY3RpbmcKKwkJCQkJICAgdGhlIGZvbGxvd2luZyBEVF8qIGVudHJ5LiAgKi8KKyNkZWZpbmUgRFRfU1lNSU5TWgkweDZmZmZmZGZlCS8qIFNpemUgb2Ygc3ltaW5mbyB0YWJsZSAoaW4gYnl0ZXMpICovCisjZGVmaW5lIERUX1NZTUlORU5UCTB4NmZmZmZkZmYJLyogRW50cnkgc2l6ZSBvZiBzeW1pbmZvICovCisjZGVmaW5lIERUX1ZBTFJOR0hJCTB4NmZmZmZkZmYKKyNkZWZpbmUgRFRfVkFMVEFHSURYKHRhZykJKERUX1ZBTFJOR0hJIC0gKHRhZykpCS8qIFJldmVyc2Ugb3JkZXIhICovCisjZGVmaW5lIERUX1ZBTE5VTSAxMgorCisvKiBEVF8qIGVudHJpZXMgd2hpY2ggZmFsbCBiZXR3ZWVuIERUX0FERFJSTkdISSAmIERUX0FERFJSTkdMTyB1c2UgdGhlCisgICBEeW4uZF91bi5kX3B0ciBmaWVsZCBvZiB0aGUgRWxmKl9EeW4gc3RydWN0dXJlLgorCisgICBJZiBhbnkgYWRqdXN0bWVudCBpcyBtYWRlIHRvIHRoZSBFTEYgb2JqZWN0IGFmdGVyIGl0IGhhcyBiZWVuCisgICBidWlsdCB0aGVzZSBlbnRyaWVzIHdpbGwgbmVlZCB0byBiZSBhZGp1c3RlZC4gICovCisjZGVmaW5lIERUX0FERFJSTkdMTwkweDZmZmZmZTAwCisjZGVmaW5lIERUX0dOVV9IQVNICTB4NmZmZmZlZjUJLyogR05VLXN0eWxlIGhhc2ggdGFibGUuICAqLworI2RlZmluZSBEVF9UTFNERVNDX1BMVAkweDZmZmZmZWY2CisjZGVmaW5lIERUX1RMU0RFU0NfR09UCTB4NmZmZmZlZjcKKyNkZWZpbmUgRFRfR05VX0NPTkZMSUNUCTB4NmZmZmZlZjgJLyogU3RhcnQgb2YgY29uZmxpY3Qgc2VjdGlvbiAqLworI2RlZmluZSBEVF9HTlVfTElCTElTVAkweDZmZmZmZWY5CS8qIExpYnJhcnkgbGlzdCAqLworI2RlZmluZSBEVF9DT05GSUcJMHg2ZmZmZmVmYQkvKiBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAgKi8KKyNkZWZpbmUgRFRfREVQQVVESVQJMHg2ZmZmZmVmYgkvKiBEZXBlbmRlbmN5IGF1ZGl0aW5nLiAgKi8KKyNkZWZpbmUgRFRfQVVESVQJMHg2ZmZmZmVmYwkvKiBPYmplY3QgYXVkaXRpbmcuICAqLworI2RlZmluZQlEVF9QTFRQQUQJMHg2ZmZmZmVmZAkvKiBQTFQgcGFkZGluZy4gICovCisjZGVmaW5lCURUX01PVkVUQUIJMHg2ZmZmZmVmZQkvKiBNb3ZlIHRhYmxlLiAgKi8KKyNkZWZpbmUgRFRfU1lNSU5GTwkweDZmZmZmZWZmCS8qIFN5bWluZm8gdGFibGUuICAqLworI2RlZmluZSBEVF9BRERSUk5HSEkJMHg2ZmZmZmVmZgorI2RlZmluZSBEVF9BRERSVEFHSURYKHRhZykJKERUX0FERFJSTkdISSAtICh0YWcpKQkvKiBSZXZlcnNlIG9yZGVyISAqLworI2RlZmluZSBEVF9BRERSTlVNIDExCisKKy8qIFRoZSB2ZXJzaW9uaW5nIGVudHJ5IHR5cGVzLiAgVGhlIG5leHQgYXJlIGRlZmluZWQgYXMgcGFydCBvZiB0aGUKKyAgIEdOVSBleHRlbnNpb24uICAqLworI2RlZmluZSBEVF9WRVJTWU0JMHg2ZmZmZmZmMAorCisjZGVmaW5lIERUX1JFTEFDT1VOVAkweDZmZmZmZmY5CisjZGVmaW5lIERUX1JFTENPVU5UCTB4NmZmZmZmZmEKKworLyogVGhlc2Ugd2VyZSBjaG9zZW4gYnkgU3VuLiAgKi8KKyNkZWZpbmUgRFRfRkxBR1NfMQkweDZmZmZmZmZiCS8qIFN0YXRlIGZsYWdzLCBzZWUgREZfMV8qIGJlbG93LiAgKi8KKyNkZWZpbmUJRFRfVkVSREVGCTB4NmZmZmZmZmMJLyogQWRkcmVzcyBvZiB2ZXJzaW9uIGRlZmluaXRpb24KKwkJCQkJICAgdGFibGUgKi8KKyNkZWZpbmUJRFRfVkVSREVGTlVNCTB4NmZmZmZmZmQJLyogTnVtYmVyIG9mIHZlcnNpb24gZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJRFRfVkVSTkVFRAkweDZmZmZmZmZlCS8qIEFkZHJlc3Mgb2YgdGFibGUgd2l0aCBuZWVkZWQKKwkJCQkJICAgdmVyc2lvbnMgKi8KKyNkZWZpbmUJRFRfVkVSTkVFRE5VTQkweDZmZmZmZmZmCS8qIE51bWJlciBvZiBuZWVkZWQgdmVyc2lvbnMgKi8KKyNkZWZpbmUgRFRfVkVSU0lPTlRBR0lEWCh0YWcpCShEVF9WRVJORUVETlVNIC0gKHRhZykpCS8qIFJldmVyc2Ugb3JkZXIhICovCisjZGVmaW5lIERUX1ZFUlNJT05UQUdOVU0gMTYKKworLyogU3VuIGFkZGVkIHRoZXNlIG1hY2hpbmUtaW5kZXBlbmRlbnQgZXh0ZW5zaW9ucyBpbiB0aGUgInByb2Nlc3Nvci1zcGVjaWZpYyIKKyAgIHJhbmdlLiAgQmUgY29tcGF0aWJsZS4gICovCisjZGVmaW5lIERUX0FVWElMSUFSWSAgICAweDdmZmZmZmZkICAgICAgLyogU2hhcmVkIG9iamVjdCB0byBsb2FkIGJlZm9yZSBzZWxmICovCisjZGVmaW5lIERUX0ZJTFRFUiAgICAgICAweDdmZmZmZmZmICAgICAgLyogU2hhcmVkIG9iamVjdCB0byBnZXQgdmFsdWVzIGZyb20gKi8KKyNkZWZpbmUgRFRfRVhUUkFUQUdJRFgodGFnKQkoKEVsZjMyX1dvcmQpLSgoRWxmMzJfU3dvcmQpICh0YWcpIDw8MT4+MSktMSkKKyNkZWZpbmUgRFRfRVhUUkFOVU0JMworCisvKiBWYWx1ZXMgb2YgYGRfdW4uZF92YWwnIGluIHRoZSBEVF9GTEFHUyBlbnRyeS4gICovCisjZGVmaW5lIERGX09SSUdJTgkweDAwMDAwMDAxCS8qIE9iamVjdCBtYXkgdXNlIERGX09SSUdJTiAqLworI2RlZmluZSBERl9TWU1CT0xJQwkweDAwMDAwMDAyCS8qIFN5bWJvbCByZXNvbHV0aW9ucyBzdGFydHMgaGVyZSAqLworI2RlZmluZSBERl9URVhUUkVMCTB4MDAwMDAwMDQJLyogT2JqZWN0IGNvbnRhaW5zIHRleHQgcmVsb2NhdGlvbnMgKi8KKyNkZWZpbmUgREZfQklORF9OT1cJMHgwMDAwMDAwOAkvKiBObyBsYXp5IGJpbmRpbmcgZm9yIHRoaXMgb2JqZWN0ICovCisjZGVmaW5lIERGX1NUQVRJQ19UTFMJMHgwMDAwMDAxMAkvKiBNb2R1bGUgdXNlcyB0aGUgc3RhdGljIFRMUyBtb2RlbCAqLworCisvKiBTdGF0ZSBmbGFncyBzZWxlY3RhYmxlIGluIHRoZSBgZF91bi5kX3ZhbCcgZWxlbWVudCBvZiB0aGUgRFRfRkxBR1NfMQorICAgZW50cnkgaW4gdGhlIGR5bmFtaWMgc2VjdGlvbi4gICovCisjZGVmaW5lIERGXzFfTk9XCTB4MDAwMDAwMDEJLyogU2V0IFJUTERfTk9XIGZvciB0aGlzIG9iamVjdC4gICovCisjZGVmaW5lIERGXzFfR0xPQkFMCTB4MDAwMDAwMDIJLyogU2V0IFJUTERfR0xPQkFMIGZvciB0aGlzIG9iamVjdC4gICovCisjZGVmaW5lIERGXzFfR1JPVVAJMHgwMDAwMDAwNAkvKiBTZXQgUlRMRF9HUk9VUCBmb3IgdGhpcyBvYmplY3QuICAqLworI2RlZmluZSBERl8xX05PREVMRVRFCTB4MDAwMDAwMDgJLyogU2V0IFJUTERfTk9ERUxFVEUgZm9yIHRoaXMgb2JqZWN0LiovCisjZGVmaW5lIERGXzFfTE9BREZMVFIJMHgwMDAwMDAxMAkvKiBUcmlnZ2VyIGZpbHRlZSBsb2FkaW5nIGF0IHJ1bnRpbWUuKi8KKyNkZWZpbmUgREZfMV9JTklURklSU1QJMHgwMDAwMDAyMAkvKiBTZXQgUlRMRF9JTklURklSU1QgZm9yIHRoaXMgb2JqZWN0Ki8KKyNkZWZpbmUgREZfMV9OT09QRU4JMHgwMDAwMDA0MAkvKiBTZXQgUlRMRF9OT09QRU4gZm9yIHRoaXMgb2JqZWN0LiAgKi8KKyNkZWZpbmUgREZfMV9PUklHSU4JMHgwMDAwMDA4MAkvKiAkT1JJR0lOIG11c3QgYmUgaGFuZGxlZC4gICovCisjZGVmaW5lIERGXzFfRElSRUNUCTB4MDAwMDAxMDAJLyogRGlyZWN0IGJpbmRpbmcgZW5hYmxlZC4gICovCisjZGVmaW5lIERGXzFfVFJBTlMJMHgwMDAwMDIwMAorI2RlZmluZSBERl8xX0lOVEVSUE9TRQkweDAwMDAwNDAwCS8qIE9iamVjdCBpcyB1c2VkIHRvIGludGVycG9zZS4gICovCisjZGVmaW5lIERGXzFfTk9ERUZMSUIJMHgwMDAwMDgwMAkvKiBJZ25vcmUgZGVmYXVsdCBsaWIgc2VhcmNoIHBhdGguICAqLworI2RlZmluZSBERl8xX05PRFVNUAkweDAwMDAxMDAwCS8qIE9iamVjdCBjYW4ndCBiZSBkbGR1bXAnZWQuICAqLworI2RlZmluZSBERl8xX0NPTkZBTFQJMHgwMDAwMjAwMAkvKiBDb25maWd1cmF0aW9uIGFsdGVybmF0aXZlIGNyZWF0ZWQuKi8KKyNkZWZpbmUgREZfMV9FTkRGSUxURUUJMHgwMDAwNDAwMAkvKiBGaWx0ZWUgdGVybWluYXRlcyBmaWx0ZXJzIHNlYXJjaC4gKi8KKyNkZWZpbmUJREZfMV9ESVNQUkVMRE5FCTB4MDAwMDgwMDAJLyogRGlzcCByZWxvYyBhcHBsaWVkIGF0IGJ1aWxkIHRpbWUuICovCisjZGVmaW5lCURGXzFfRElTUFJFTFBORAkweDAwMDEwMDAwCS8qIERpc3AgcmVsb2MgYXBwbGllZCBhdCBydW4tdGltZS4gICovCisKKy8qIEZsYWdzIGZvciB0aGUgZmVhdHVyZSBzZWxlY3Rpb24gaW4gRFRfRkVBVFVSRV8xLiAgKi8KKyNkZWZpbmUgRFRGXzFfUEFSSU5JVAkweDAwMDAwMDAxCisjZGVmaW5lIERURl8xX0NPTkZFWFAJMHgwMDAwMDAwMgorCisvKiBGbGFncyBpbiB0aGUgRFRfUE9TRkxBR18xIGVudHJ5IGVmZmVjdGluZyBvbmx5IHRoZSBuZXh0IERUXyogZW50cnkuICAqLworI2RlZmluZSBERl9QMV9MQVpZTE9BRAkweDAwMDAwMDAxCS8qIExhenlsb2FkIGZvbGxvd2luZyBvYmplY3QuICAqLworI2RlZmluZSBERl9QMV9HUk9VUFBFUk0JMHgwMDAwMDAwMgkvKiBTeW1ib2xzIGZyb20gbmV4dCBvYmplY3QgYXJlIG5vdAorCQkJCQkgICBnZW5lcmFsbHkgYXZhaWxhYmxlLiAgKi8KKworLyogVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb25zLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfSGFsZgl2ZF92ZXJzaW9uOwkJLyogVmVyc2lvbiByZXZpc2lvbiAqLworICBFbGYzMl9IYWxmCXZkX2ZsYWdzOwkJLyogVmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICBFbGYzMl9IYWxmCXZkX25keDsJCQkvKiBWZXJzaW9uIEluZGV4ICovCisgIEVsZjMyX0hhbGYJdmRfY250OwkJCS8qIE51bWJlciBvZiBhc3NvY2lhdGVkIGF1eCBlbnRyaWVzICovCisgIEVsZjMyX1dvcmQJdmRfaGFzaDsJCS8qIFZlcnNpb24gbmFtZSBoYXNoIHZhbHVlICovCisgIEVsZjMyX1dvcmQJdmRfYXV4OwkJCS8qIE9mZnNldCBpbiBieXRlcyB0byB2ZXJkYXV4IGFycmF5ICovCisgIEVsZjMyX1dvcmQJdmRfbmV4dDsJCS8qIE9mZnNldCBpbiBieXRlcyB0byBuZXh0IHZlcmRlZgorCQkJCQkgICBlbnRyeSAqLworfSBFbGYzMl9WZXJkZWY7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X0hhbGYJdmRfdmVyc2lvbjsJCS8qIFZlcnNpb24gcmV2aXNpb24gKi8KKyAgRWxmNjRfSGFsZgl2ZF9mbGFnczsJCS8qIFZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgRWxmNjRfSGFsZgl2ZF9uZHg7CQkJLyogVmVyc2lvbiBJbmRleCAqLworICBFbGY2NF9IYWxmCXZkX2NudDsJCQkvKiBOdW1iZXIgb2YgYXNzb2NpYXRlZCBhdXggZW50cmllcyAqLworICBFbGY2NF9Xb3JkCXZkX2hhc2g7CQkvKiBWZXJzaW9uIG5hbWUgaGFzaCB2YWx1ZSAqLworICBFbGY2NF9Xb3JkCXZkX2F1eDsJCQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gdmVyZGF1eCBhcnJheSAqLworICBFbGY2NF9Xb3JkCXZkX25leHQ7CQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gbmV4dCB2ZXJkZWYKKwkJCQkJICAgZW50cnkgKi8KK30gRWxmNjRfVmVyZGVmOworCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgdmRfdmVyc2lvbiAodmVyc2lvbiByZXZpc2lvbikuICAqLworI2RlZmluZSBWRVJfREVGX05PTkUJMAkJLyogTm8gdmVyc2lvbiAqLworI2RlZmluZSBWRVJfREVGX0NVUlJFTlQJMQkJLyogQ3VycmVudCB2ZXJzaW9uICovCisjZGVmaW5lIFZFUl9ERUZfTlVNCTIJCS8qIEdpdmVuIHZlcnNpb24gbnVtYmVyICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgdmRfZmxhZ3MgKHZlcnNpb24gaW5mb3JtYXRpb24gZmxhZ3MpLiAgKi8KKyNkZWZpbmUgVkVSX0ZMR19CQVNFCTB4MQkJLyogVmVyc2lvbiBkZWZpbml0aW9uIG9mIGZpbGUgaXRzZWxmICovCisjZGVmaW5lIFZFUl9GTEdfV0VBSwkweDIJCS8qIFdlYWsgdmVyc2lvbiBpZGVudGlmaWVyICovCisKKy8qIFZlcnN5bSBzeW1ib2wgaW5kZXggdmFsdWVzLiAgKi8KKyNkZWZpbmUJVkVSX05EWF9MT0NBTAkJMAkvKiBTeW1ib2wgaXMgbG9jYWwuICAqLworI2RlZmluZQlWRVJfTkRYX0dMT0JBTAkJMQkvKiBTeW1ib2wgaXMgZ2xvYmFsLiAgKi8KKyNkZWZpbmUJVkVSX05EWF9MT1JFU0VSVkUJMHhmZjAwCS8qIEJlZ2lubmluZyBvZiByZXNlcnZlZCBlbnRyaWVzLiAgKi8KKyNkZWZpbmUJVkVSX05EWF9FTElNSU5BVEUJMHhmZjAxCS8qIFN5bWJvbCBpcyB0byBiZSBlbGltaW5hdGVkLiAgKi8KKworLyogQXV4aWFsaWFyeSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZAl2ZGFfbmFtZTsJCS8qIFZlcnNpb24gb3IgZGVwZW5kZW5jeSBuYW1lcyAqLworICBFbGYzMl9Xb3JkCXZkYV9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVyZGF1eAorCQkJCQkgICBlbnRyeSAqLworfSBFbGYzMl9WZXJkYXV4OworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9Xb3JkCXZkYV9uYW1lOwkJLyogVmVyc2lvbiBvciBkZXBlbmRlbmN5IG5hbWVzICovCisgIEVsZjY0X1dvcmQJdmRhX25leHQ7CQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gbmV4dCB2ZXJkYXV4CisJCQkJCSAgIGVudHJ5ICovCit9IEVsZjY0X1ZlcmRhdXg7CisKKworLyogVmVyc2lvbiBkZXBlbmRlbmN5IHNlY3Rpb24uICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9IYWxmCXZuX3ZlcnNpb247CQkvKiBWZXJzaW9uIG9mIHN0cnVjdHVyZSAqLworICBFbGYzMl9IYWxmCXZuX2NudDsJCQkvKiBOdW1iZXIgb2YgYXNzb2NpYXRlZCBhdXggZW50cmllcyAqLworICBFbGYzMl9Xb3JkCXZuX2ZpbGU7CQkvKiBPZmZzZXQgb2YgZmlsZW5hbWUgZm9yIHRoaXMKKwkJCQkJICAgZGVwZW5kZW5jeSAqLworICBFbGYzMl9Xb3JkCXZuX2F1eDsJCQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gdmVybmF1eCBhcnJheSAqLworICBFbGYzMl9Xb3JkCXZuX25leHQ7CQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gbmV4dCB2ZXJuZWVkCisJCQkJCSAgIGVudHJ5ICovCit9IEVsZjMyX1Zlcm5lZWQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X0hhbGYJdm5fdmVyc2lvbjsJCS8qIFZlcnNpb24gb2Ygc3RydWN0dXJlICovCisgIEVsZjY0X0hhbGYJdm5fY250OwkJCS8qIE51bWJlciBvZiBhc3NvY2lhdGVkIGF1eCBlbnRyaWVzICovCisgIEVsZjY0X1dvcmQJdm5fZmlsZTsJCS8qIE9mZnNldCBvZiBmaWxlbmFtZSBmb3IgdGhpcworCQkJCQkgICBkZXBlbmRlbmN5ICovCisgIEVsZjY0X1dvcmQJdm5fYXV4OwkJCS8qIE9mZnNldCBpbiBieXRlcyB0byB2ZXJuYXV4IGFycmF5ICovCisgIEVsZjY0X1dvcmQJdm5fbmV4dDsJCS8qIE9mZnNldCBpbiBieXRlcyB0byBuZXh0IHZlcm5lZWQKKwkJCQkJICAgZW50cnkgKi8KK30gRWxmNjRfVmVybmVlZDsKKworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHZuX3ZlcnNpb24gKHZlcnNpb24gcmV2aXNpb24pLiAgKi8KKyNkZWZpbmUgVkVSX05FRURfTk9ORQkgMAkJLyogTm8gdmVyc2lvbiAqLworI2RlZmluZSBWRVJfTkVFRF9DVVJSRU5UIDEJCS8qIEN1cnJlbnQgdmVyc2lvbiAqLworI2RlZmluZSBWRVJfTkVFRF9OVU0JIDIJCS8qIEdpdmVuIHZlcnNpb24gbnVtYmVyICovCisKKy8qIEF1eGlsaWFyeSBuZWVkZWQgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1dvcmQJdm5hX2hhc2g7CQkvKiBIYXNoIHZhbHVlIG9mIGRlcGVuZGVuY3kgbmFtZSAqLworICBFbGYzMl9IYWxmCXZuYV9mbGFnczsJCS8qIERlcGVuZGVuY3kgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKyAgRWxmMzJfSGFsZgl2bmFfb3RoZXI7CQkvKiBVbnVzZWQgKi8KKyAgRWxmMzJfV29yZAl2bmFfbmFtZTsJCS8qIERlcGVuZGVuY3kgbmFtZSBzdHJpbmcgb2Zmc2V0ICovCisgIEVsZjMyX1dvcmQJdm5hX25leHQ7CQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gbmV4dCB2ZXJuYXV4CisJCQkJCSAgIGVudHJ5ICovCit9IEVsZjMyX1Zlcm5hdXg7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X1dvcmQJdm5hX2hhc2g7CQkvKiBIYXNoIHZhbHVlIG9mIGRlcGVuZGVuY3kgbmFtZSAqLworICBFbGY2NF9IYWxmCXZuYV9mbGFnczsJCS8qIERlcGVuZGVuY3kgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKyAgRWxmNjRfSGFsZgl2bmFfb3RoZXI7CQkvKiBVbnVzZWQgKi8KKyAgRWxmNjRfV29yZAl2bmFfbmFtZTsJCS8qIERlcGVuZGVuY3kgbmFtZSBzdHJpbmcgb2Zmc2V0ICovCisgIEVsZjY0X1dvcmQJdm5hX25leHQ7CQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gbmV4dCB2ZXJuYXV4CisJCQkJCSAgIGVudHJ5ICovCit9IEVsZjY0X1Zlcm5hdXg7CisKKworLyogTGVnYWwgdmFsdWVzIGZvciB2bmFfZmxhZ3MuICAqLworI2RlZmluZSBWRVJfRkxHX1dFQUsJMHgyCQkvKiBXZWFrIHZlcnNpb24gaWRlbnRpZmllciAqLworCisKKy8qIEF1eGlsaWFyeSB2ZWN0b3IuICAqLworCisvKiBUaGlzIHZlY3RvciBpcyBub3JtYWxseSBvbmx5IHVzZWQgYnkgdGhlIHByb2dyYW0gaW50ZXJwcmV0ZXIuICBUaGUKKyAgIHVzdWFsIGRlZmluaXRpb24gaW4gYW4gQUJJIHN1cHBsZW1lbnQgdXNlcyB0aGUgbmFtZSBhdXh2X3QuICBUaGUKKyAgIHZlY3RvciBpcyBub3QgdXN1YWxseSBkZWZpbmVkIGluIGEgc3RhbmRhcmQgPGVsZi5oPiBmaWxlLCBidXQgaXQKKyAgIGNhbid0IGh1cnQuICBXZSByZW5hbWUgaXQgdG8gYXZvaWQgY29uZmxpY3RzLiAgVGhlIHNpemVzIG9mIHRoZXNlCisgICB0eXBlcyBhcmUgYW4gYXJyYW5nZW1lbnQgYmV0d2VlbiB0aGUgZXhlYyBzZXJ2ZXIgYW5kIHRoZSBwcm9ncmFtCisgICBpbnRlcnByZXRlciwgc28gd2UgZG9uJ3QgZnVsbHkgc3BlY2lmeSB0aGVtIGhlcmUuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBhX3R5cGU7CQkvKiBFbnRyeSB0eXBlICovCisgIHVuaW9uCisgICAgeworICAgICAgdWludDMyX3QgYV92YWw7CQkvKiBJbnRlZ2VyIHZhbHVlICovCisgICAgICAvKiBXZSB1c2UgdG8gaGF2ZSBwb2ludGVyIGVsZW1lbnRzIGFkZGVkIGhlcmUuICBXZSBjYW5ub3QgZG8gdGhhdCwKKwkgdGhvdWdoLCBzaW5jZSBpdCBkb2VzIG5vdCB3b3JrIHdoZW4gdXNpbmcgMzItYml0IGRlZmluaXRpb25zCisJIG9uIDY0LWJpdCBwbGF0Zm9ybXMgYW5kIHZpY2UgdmVyc2EuICAqLworICAgIH0gYV91bjsKK30gRWxmMzJfYXV4dl90OworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50NjRfdCBhX3R5cGU7CQkvKiBFbnRyeSB0eXBlICovCisgIHVuaW9uCisgICAgeworICAgICAgdWludDY0X3QgYV92YWw7CQkvKiBJbnRlZ2VyIHZhbHVlICovCisgICAgICAvKiBXZSB1c2UgdG8gaGF2ZSBwb2ludGVyIGVsZW1lbnRzIGFkZGVkIGhlcmUuICBXZSBjYW5ub3QgZG8gdGhhdCwKKwkgdGhvdWdoLCBzaW5jZSBpdCBkb2VzIG5vdCB3b3JrIHdoZW4gdXNpbmcgMzItYml0IGRlZmluaXRpb25zCisJIG9uIDY0LWJpdCBwbGF0Zm9ybXMgYW5kIHZpY2UgdmVyc2EuICAqLworICAgIH0gYV91bjsKK30gRWxmNjRfYXV4dl90OworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGFfdHlwZSAoZW50cnkgdHlwZSkuICAqLworCisjZGVmaW5lIEFUX05VTEwJCTAJCS8qIEVuZCBvZiB2ZWN0b3IgKi8KKyNkZWZpbmUgQVRfSUdOT1JFCTEJCS8qIEVudHJ5IHNob3VsZCBiZSBpZ25vcmVkICovCisjZGVmaW5lIEFUX0VYRUNGRAkyCQkvKiBGaWxlIGRlc2NyaXB0b3Igb2YgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9QSERSCQkzCQkvKiBQcm9ncmFtIGhlYWRlcnMgZm9yIHByb2dyYW0gKi8KKyNkZWZpbmUgQVRfUEhFTlQJNAkJLyogU2l6ZSBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAqLworI2RlZmluZSBBVF9QSE5VTQk1CQkvKiBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzICovCisjZGVmaW5lIEFUX1BBR0VTWgk2CQkvKiBTeXN0ZW0gcGFnZSBzaXplICovCisjZGVmaW5lIEFUX0JBU0UJCTcJCS8qIEJhc2UgYWRkcmVzcyBvZiBpbnRlcnByZXRlciAqLworI2RlZmluZSBBVF9GTEFHUwk4CQkvKiBGbGFncyAqLworI2RlZmluZSBBVF9FTlRSWQk5CQkvKiBFbnRyeSBwb2ludCBvZiBwcm9ncmFtICovCisjZGVmaW5lIEFUX05PVEVMRgkxMAkJLyogUHJvZ3JhbSBpcyBub3QgRUxGICovCisjZGVmaW5lIEFUX1VJRAkJMTEJCS8qIFJlYWwgdWlkICovCisjZGVmaW5lIEFUX0VVSUQJCTEyCQkvKiBFZmZlY3RpdmUgdWlkICovCisjZGVmaW5lIEFUX0dJRAkJMTMJCS8qIFJlYWwgZ2lkICovCisjZGVmaW5lIEFUX0VHSUQJCTE0CQkvKiBFZmZlY3RpdmUgZ2lkICovCisjZGVmaW5lIEFUX0NMS1RDSwkxNwkJLyogRnJlcXVlbmN5IG9mIHRpbWVzKCkgKi8KKworLyogU29tZSBtb3JlIHNwZWNpYWwgYV90eXBlIHZhbHVlcyBkZXNjcmliaW5nIHRoZSBoYXJkd2FyZS4gICovCisjZGVmaW5lIEFUX1BMQVRGT1JNCTE1CQkvKiBTdHJpbmcgaWRlbnRpZnlpbmcgcGxhdGZvcm0uICAqLworI2RlZmluZSBBVF9IV0NBUAkxNgkJLyogTWFjaGluZSBkZXBlbmRlbnQgaGludHMgYWJvdXQKKwkJCQkJICAgcHJvY2Vzc29yIGNhcGFiaWxpdGllcy4gICovCisKKy8qIFRoaXMgZW50cnkgZ2l2ZXMgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgRlBVIGluaXRpYWxpemF0aW9uCisgICBwZXJmb3JtZWQgYnkgdGhlIGtlcm5lbC4gICovCisjZGVmaW5lIEFUX0ZQVUNXCTE4CQkvKiBVc2VkIEZQVSBjb250cm9sIHdvcmQuICAqLworCisvKiBDYWNoZSBibG9jayBzaXplcy4gICovCisjZGVmaW5lIEFUX0RDQUNIRUJTSVpFCTE5CQkvKiBEYXRhIGNhY2hlIGJsb2NrIHNpemUuICAqLworI2RlZmluZSBBVF9JQ0FDSEVCU0laRQkyMAkJLyogSW5zdHJ1Y3Rpb24gY2FjaGUgYmxvY2sgc2l6ZS4gICovCisjZGVmaW5lIEFUX1VDQUNIRUJTSVpFCTIxCQkvKiBVbmlmaWVkIGNhY2hlIGJsb2NrIHNpemUuICAqLworCisvKiBBIHNwZWNpYWwgaWdub3JlZCB2YWx1ZSBmb3IgUFBDLCB1c2VkIGJ5IHRoZSBrZXJuZWwgdG8gY29udHJvbCB0aGUKKyAgIGludGVycHJldGF0aW9uIG9mIHRoZSBBVVhWLiBNdXN0IGJlID4gMTYuICAqLworI2RlZmluZSBBVF9JR05PUkVQUEMJMjIJCS8qIEVudHJ5IHNob3VsZCBiZSBpZ25vcmVkLiAgKi8KKworI2RlZmluZQlBVF9TRUNVUkUJMjMJCS8qIEJvb2xlYW4sIHdhcyBleGVjIHNldHVpZC1saWtlPyAgKi8KKworI2RlZmluZSBBVF9CQVNFX1BMQVRGT1JNIDI0CQkvKiBTdHJpbmcgaWRlbnRpZnlpbmcgcmVhbCBwbGF0Zm9ybXMuKi8KKworI2RlZmluZSBBVF9SQU5ET00JMjUJCS8qIEFkZHJlc3Mgb2YgMTYgcmFuZG9tIGJ5dGVzLiAgKi8KKworI2RlZmluZSBBVF9FWEVDRk4JMzEJCS8qIEZpbGVuYW1lIG9mIGV4ZWN1dGFibGUuICAqLworCisvKiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgc3lzdGVtIHBhZ2UgdXNlZCBmb3Igc3lzdGVtIGNhbGxzIGFuZCBvdGhlcgorICAgbmljZSB0aGluZ3MuICAqLworI2RlZmluZSBBVF9TWVNJTkZPCTMyCisjZGVmaW5lIEFUX1NZU0lORk9fRUhEUgkzMworCisvKiBTaGFwZXMgb2YgdGhlIGNhY2hlcy4gIEJpdHMgMC0zIGNvbnRhaW5zIGFzc29jaWF0aXZpdHk7IGJpdHMgNC03IGNvbnRhaW5zCisgICBsb2cyIG9mIGxpbmUgc2l6ZTsgbWFzayB0aG9zZSB0byBnZXQgY2FjaGUgc2l6ZS4gICovCisjZGVmaW5lIEFUX0wxSV9DQUNIRVNIQVBFCTM0CisjZGVmaW5lIEFUX0wxRF9DQUNIRVNIQVBFCTM1CisjZGVmaW5lIEFUX0wyX0NBQ0hFU0hBUEUJMzYKKyNkZWZpbmUgQVRfTDNfQ0FDSEVTSEFQRQkzNworCisvKiBOb3RlIHNlY3Rpb24gY29udGVudHMuICBFYWNoIGVudHJ5IGluIHRoZSBub3RlIHNlY3Rpb24gYmVnaW5zIHdpdGgKKyAgIGEgaGVhZGVyIG9mIGEgZml4ZWQgZm9ybS4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1dvcmQgbl9uYW1lc3o7CQkJLyogTGVuZ3RoIG9mIHRoZSBub3RlJ3MgbmFtZS4gICovCisgIEVsZjMyX1dvcmQgbl9kZXNjc3o7CQkJLyogTGVuZ3RoIG9mIHRoZSBub3RlJ3MgZGVzY3JpcHRvci4gICovCisgIEVsZjMyX1dvcmQgbl90eXBlOwkJCS8qIFR5cGUgb2YgdGhlIG5vdGUuICAqLworfSBFbGYzMl9OaGRyOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9Xb3JkIG5fbmFtZXN6OwkJCS8qIExlbmd0aCBvZiB0aGUgbm90ZSdzIG5hbWUuICAqLworICBFbGY2NF9Xb3JkIG5fZGVzY3N6OwkJCS8qIExlbmd0aCBvZiB0aGUgbm90ZSdzIGRlc2NyaXB0b3IuICAqLworICBFbGY2NF9Xb3JkIG5fdHlwZTsJCQkvKiBUeXBlIG9mIHRoZSBub3RlLiAgKi8KK30gRWxmNjRfTmhkcjsKKworLyogS25vd24gbmFtZXMgb2Ygbm90ZXMuICAqLworCisvKiBTb2xhcmlzIGVudHJpZXMgaW4gdGhlIG5vdGUgc2VjdGlvbiBoYXZlIHRoaXMgbmFtZS4gICovCisjZGVmaW5lIEVMRl9OT1RFX1NPTEFSSVMJIlNVTlcgU29sYXJpcyIKKworLyogTm90ZSBlbnRyaWVzIGZvciBHTlUgc3lzdGVtcyBoYXZlIHRoaXMgbmFtZS4gICovCisjZGVmaW5lIEVMRl9OT1RFX0dOVQkJIkdOVSIKKworCisvKiBEZWZpbmVkIHR5cGVzIG9mIG5vdGVzIGZvciBTb2xhcmlzLiAgKi8KKworLyogVmFsdWUgb2YgZGVzY3JpcHRvciAob25lIHdvcmQpIGlzIGRlc2lyZWQgcGFnZXNpemUgZm9yIHRoZSBiaW5hcnkuICAqLworI2RlZmluZSBFTEZfTk9URV9QQUdFU0laRV9ISU5UCTEKKworCisvKiBEZWZpbmVkIG5vdGUgdHlwZXMgZm9yIEdOVSBzeXN0ZW1zLiAgKi8KKworLyogQUJJIGluZm9ybWF0aW9uLiAgVGhlIGRlc2NyaXB0b3IgY29uc2lzdHMgb2Ygd29yZHM6CisgICB3b3JkIDA6IE9TIGRlc2NyaXB0b3IKKyAgIHdvcmQgMTogbWFqb3IgdmVyc2lvbiBvZiB0aGUgQUJJCisgICB3b3JkIDI6IG1pbm9yIHZlcnNpb24gb2YgdGhlIEFCSQorICAgd29yZCAzOiBzdWJtaW5vciB2ZXJzaW9uIG9mIHRoZSBBQkkKKyovCisjZGVmaW5lIE5UX0dOVV9BQklfVEFHCTEKKyNkZWZpbmUgRUxGX05PVEVfQUJJCU5UX0dOVV9BQklfVEFHIC8qIE9sZCBuYW1lLiAgKi8KKworLyogS25vd24gT1Nlcy4gIFRoZXNlIHZhbHVlcyBjYW4gYXBwZWFyIGluIHdvcmQgMCBvZiBhbgorICAgTlRfR05VX0FCSV9UQUcgbm90ZSBzZWN0aW9uIGVudHJ5LiAgKi8KKyNkZWZpbmUgRUxGX05PVEVfT1NfTElOVVgJMAorI2RlZmluZSBFTEZfTk9URV9PU19HTlUJCTEKKyNkZWZpbmUgRUxGX05PVEVfT1NfU09MQVJJUzIJMgorI2RlZmluZSBFTEZfTk9URV9PU19GUkVFQlNECTMKKworLyogU3ludGhldGljIGh3Y2FwIGluZm9ybWF0aW9uLiAgVGhlIGRlc2NyaXB0b3IgYmVnaW5zIHdpdGggdHdvIHdvcmRzOgorICAgd29yZCAwOiBudW1iZXIgb2YgZW50cmllcworICAgd29yZCAxOiBiaXRtYXNrIG9mIGVuYWJsZWQgZW50cmllcworICAgVGhlbiBmb2xsb3cgdmFyaWFibGUtbGVuZ3RoIGVudHJpZXMsIG9uZSBieXRlIGZvbGxvd2VkIGJ5IGEKKyAgICdcMCctdGVybWluYXRlZCBod2NhcCBuYW1lIHN0cmluZy4gIFRoZSBieXRlIGdpdmVzIHRoZSBiaXQKKyAgIG51bWJlciB0byB0ZXN0IGlmIGVuYWJsZWQsICgxVSA8PCBiaXQpICYgYml0bWFzay4gICovCisjZGVmaW5lIE5UX0dOVV9IV0NBUAkyCisKKy8qIEJ1aWxkIElEIGJpdHMgYXMgZ2VuZXJhdGVkIGJ5IGxkIC0tYnVpbGQtaWQuCisgICBUaGUgZGVzY3JpcHRvciBjb25zaXN0cyBvZiBhbnkgbm9uemVybyBudW1iZXIgb2YgYnl0ZXMuICAqLworI2RlZmluZSBOVF9HTlVfQlVJTERfSUQJMworCisvKiBWZXJzaW9uIG5vdGUgZ2VuZXJhdGVkIGJ5IEdOVSBnb2xkIGNvbnRhaW5pbmcgYSB2ZXJzaW9uIHN0cmluZy4gICovCisjZGVmaW5lIE5UX0dOVV9HT0xEX1ZFUlNJT04JNAorCisKKy8qIE1vdmUgcmVjb3Jkcy4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Yd29yZCBtX3ZhbHVlOwkJLyogU3ltYm9sIHZhbHVlLiAgKi8KKyAgRWxmMzJfV29yZCBtX2luZm87CQkvKiBTaXplIGFuZCBpbmRleC4gICovCisgIEVsZjMyX1dvcmQgbV9wb2Zmc2V0OwkJLyogU3ltYm9sIG9mZnNldC4gICovCisgIEVsZjMyX0hhbGYgbV9yZXBlYXQ7CQkvKiBSZXBlYXQgY291bnQuICAqLworICBFbGYzMl9IYWxmIG1fc3RyaWRlOwkJLyogU3RyaWRlIGluZm8uICAqLworfSBFbGYzMl9Nb3ZlOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9Yd29yZCBtX3ZhbHVlOwkJLyogU3ltYm9sIHZhbHVlLiAgKi8KKyAgRWxmNjRfWHdvcmQgbV9pbmZvOwkJLyogU2l6ZSBhbmQgaW5kZXguICAqLworICBFbGY2NF9Yd29yZCBtX3BvZmZzZXQ7CS8qIFN5bWJvbCBvZmZzZXQuICAqLworICBFbGY2NF9IYWxmIG1fcmVwZWF0OwkJLyogUmVwZWF0IGNvdW50LiAgKi8KKyAgRWxmNjRfSGFsZiBtX3N0cmlkZTsJCS8qIFN0cmlkZSBpbmZvLiAgKi8KK30gRWxmNjRfTW92ZTsKKworLyogTWFjcm8gdG8gY29uc3RydWN0IG1vdmUgcmVjb3Jkcy4gICovCisjZGVmaW5lIEVMRjMyX01fU1lNKGluZm8pCSgoaW5mbykgPj4gOCkKKyNkZWZpbmUgRUxGMzJfTV9TSVpFKGluZm8pCSgodW5zaWduZWQgY2hhcikgKGluZm8pKQorI2RlZmluZSBFTEYzMl9NX0lORk8oc3ltLCBzaXplKQkoKChzeW0pIDw8IDgpICsgKHVuc2lnbmVkIGNoYXIpIChzaXplKSkKKworI2RlZmluZSBFTEY2NF9NX1NZTShpbmZvKQlFTEYzMl9NX1NZTSAoaW5mbykKKyNkZWZpbmUgRUxGNjRfTV9TSVpFKGluZm8pCUVMRjMyX01fU0laRSAoaW5mbykKKyNkZWZpbmUgRUxGNjRfTV9JTkZPKHN5bSwgc2l6ZSkJRUxGMzJfTV9JTkZPIChzeW0sIHNpemUpCisKKworLyogTW90b3JvbGEgNjhrIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KKworLyogVmFsdWVzIGZvciBFbGYzMl9FaGRyLmVfZmxhZ3MuICAqLworI2RlZmluZSBFRl9DUFUzMgkweDAwODEwMDAwCisKKy8qIG02OGsgcmVsb2NzLiAgKi8KKworI2RlZmluZSBSXzY4S19OT05FCTAJCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfNjhLXzMyCTEJCS8qIERpcmVjdCAzMiBiaXQgICovCisjZGVmaW5lIFJfNjhLXzE2CTIJCS8qIERpcmVjdCAxNiBiaXQgICovCisjZGVmaW5lIFJfNjhLXzgJCTMJCS8qIERpcmVjdCA4IGJpdCAgKi8KKyNkZWZpbmUgUl82OEtfUEMzMgk0CQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KKyNkZWZpbmUgUl82OEtfUEMxNgk1CQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KKyNkZWZpbmUgUl82OEtfUEM4CTYJCS8qIFBDIHJlbGF0aXZlIDggYml0ICovCisjZGVmaW5lIFJfNjhLX0dPVDMyCTcJCS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl82OEtfR09UMTYJOAkJLyogMTYgYml0IFBDIHJlbGF0aXZlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSXzY4S19HT1Q4CTkJCS8qIDggYml0IFBDIHJlbGF0aXZlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSXzY4S19HT1QzMk8JMTAJCS8qIDMyIGJpdCBHT1Qgb2Zmc2V0ICovCisjZGVmaW5lIFJfNjhLX0dPVDE2TwkxMQkJLyogMTYgYml0IEdPVCBvZmZzZXQgKi8KKyNkZWZpbmUgUl82OEtfR09UOE8JMTIJCS8qIDggYml0IEdPVCBvZmZzZXQgKi8KKyNkZWZpbmUgUl82OEtfUExUMzIJMTMJCS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcyAqLworI2RlZmluZSBSXzY4S19QTFQxNgkxNAkJLyogMTYgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCisjZGVmaW5lIFJfNjhLX1BMVDgJMTUJCS8qIDggYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCisjZGVmaW5lIFJfNjhLX1BMVDMyTwkxNgkJLyogMzIgYml0IFBMVCBvZmZzZXQgKi8KKyNkZWZpbmUgUl82OEtfUExUMTZPCTE3CQkvKiAxNiBiaXQgUExUIG9mZnNldCAqLworI2RlZmluZSBSXzY4S19QTFQ4TwkxOAkJLyogOCBiaXQgUExUIG9mZnNldCAqLworI2RlZmluZSBSXzY4S19DT1BZCTE5CQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCisjZGVmaW5lIFJfNjhLX0dMT0JfREFUCTIwCQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfNjhLX0pNUF9TTE9UCTIxCQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfNjhLX1JFTEFUSVZFCTIyCQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfNjhLX1RMU19HRDMyICAgICAgMjUgICAgICAgICAgLyogMzIgYml0IEdPVCBvZmZzZXQgZm9yIEdEICovCisjZGVmaW5lIFJfNjhLX1RMU19HRDE2ICAgICAgMjYgICAgICAgICAgLyogMTYgYml0IEdPVCBvZmZzZXQgZm9yIEdEICovCisjZGVmaW5lIFJfNjhLX1RMU19HRDggICAgICAgMjcgICAgICAgICAgLyogOCBiaXQgR09UIG9mZnNldCBmb3IgR0QgKi8KKyNkZWZpbmUgUl82OEtfVExTX0xETTMyICAgICAyOCAgICAgICAgICAvKiAzMiBiaXQgR09UIG9mZnNldCBmb3IgTERNICovCisjZGVmaW5lIFJfNjhLX1RMU19MRE0xNiAgICAgMjkgICAgICAgICAgLyogMTYgYml0IEdPVCBvZmZzZXQgZm9yIExETSAqLworI2RlZmluZSBSXzY4S19UTFNfTERNOCAgICAgIDMwICAgICAgICAgIC8qIDggYml0IEdPVCBvZmZzZXQgZm9yIExETSAqLworI2RlZmluZSBSXzY4S19UTFNfTERPMzIgICAgIDMxICAgICAgICAgIC8qIDMyIGJpdCBtb2R1bGUtcmVsYXRpdmUgb2Zmc2V0ICovCisjZGVmaW5lIFJfNjhLX1RMU19MRE8xNiAgICAgMzIgICAgICAgICAgLyogMTYgYml0IG1vZHVsZS1yZWxhdGl2ZSBvZmZzZXQgKi8KKyNkZWZpbmUgUl82OEtfVExTX0xETzggICAgICAzMyAgICAgICAgICAvKiA4IGJpdCBtb2R1bGUtcmVsYXRpdmUgb2Zmc2V0ICovCisjZGVmaW5lIFJfNjhLX1RMU19JRTMyICAgICAgMzQgICAgICAgICAgLyogMzIgYml0IEdPVCBvZmZzZXQgZm9yIElFICovCisjZGVmaW5lIFJfNjhLX1RMU19JRTE2ICAgICAgMzUgICAgICAgICAgLyogMTYgYml0IEdPVCBvZmZzZXQgZm9yIElFICovCisjZGVmaW5lIFJfNjhLX1RMU19JRTggICAgICAgMzYgICAgICAgICAgLyogOCBiaXQgR09UIG9mZnNldCBmb3IgSUUgKi8KKyNkZWZpbmUgUl82OEtfVExTX0xFMzIgICAgICAzNyAgICAgICAgICAvKiAzMiBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvCisJCQkJCSAgIHN0YXRpYyBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl82OEtfVExTX0xFMTYgICAgICAzOCAgICAgICAgICAvKiAxNiBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvCisJCQkJCSAgIHN0YXRpYyBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl82OEtfVExTX0xFOCAgICAgICAzOSAgICAgICAgICAvKiA4IGJpdCBvZmZzZXQgcmVsYXRpdmUgdG8KKwkJCQkJICAgc3RhdGljIFRMUyBibG9jayAqLworI2RlZmluZSBSXzY4S19UTFNfRFRQTU9EMzIgIDQwICAgICAgICAgIC8qIDMyIGJpdCBtb2R1bGUgbnVtYmVyICovCisjZGVmaW5lIFJfNjhLX1RMU19EVFBSRUwzMiAgNDEgICAgICAgICAgLyogMzIgYml0IG1vZHVsZS1yZWxhdGl2ZSBvZmZzZXQgKi8KKyNkZWZpbmUgUl82OEtfVExTX1RQUkVMMzIgICA0MiAgICAgICAgICAvKiAzMiBiaXQgVFAtcmVsYXRpdmUgb2Zmc2V0ICovCisvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLworI2RlZmluZSBSXzY4S19OVU0JNDMKKworLyogSW50ZWwgODAzODYgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisvKiBpMzg2IHJlbG9jcy4gICovCisKKyNkZWZpbmUgUl8zODZfTk9ORQkgICAwCQkvKiBObyByZWxvYyAqLworI2RlZmluZSBSXzM4Nl8zMgkgICAxCQkvKiBEaXJlY3QgMzIgYml0ICAqLworI2RlZmluZSBSXzM4Nl9QQzMyCSAgIDIJCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLworI2RlZmluZSBSXzM4Nl9HT1QzMgkgICAzCQkvKiAzMiBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfMzg2X1BMVDMyCSAgIDQJCS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLworI2RlZmluZSBSXzM4Nl9DT1BZCSAgIDUJCS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgUl8zODZfR0xPQl9EQVQJICAgNgkJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSXzM4Nl9KTVBfU0xPVAkgICA3CQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfMzg2X1JFTEFUSVZFCSAgIDgJCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KKyNkZWZpbmUgUl8zODZfR09UT0ZGCSAgIDkJCS8qIDMyIGJpdCBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfMzg2X0dPVFBDCSAgIDEwCQkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSXzM4Nl8zMlBMVAkgICAxMQorI2RlZmluZSBSXzM4Nl9UTFNfVFBPRkYJICAgMTQJCS8qIE9mZnNldCBpbiBzdGF0aWMgVExTIGJsb2NrICovCisjZGVmaW5lIFJfMzg2X1RMU19JRQkgICAxNQkJLyogQWRkcmVzcyBvZiBHT1QgZW50cnkgZm9yIHN0YXRpYyBUTFMKKwkJCQkJICAgYmxvY2sgb2Zmc2V0ICovCisjZGVmaW5lIFJfMzg2X1RMU19HT1RJRQkgICAxNgkJLyogR09UIGVudHJ5IGZvciBzdGF0aWMgVExTIGJsb2NrCisJCQkJCSAgIG9mZnNldCAqLworI2RlZmluZSBSXzM4Nl9UTFNfTEUJICAgMTcJCS8qIE9mZnNldCByZWxhdGl2ZSB0byBzdGF0aWMgVExTCisJCQkJCSAgIGJsb2NrICovCisjZGVmaW5lIFJfMzg2X1RMU19HRAkgICAxOAkJLyogRGlyZWN0IDMyIGJpdCBmb3IgR05VIHZlcnNpb24gb2YKKwkJCQkJICAgZ2VuZXJhbCBkeW5hbWljIHRocmVhZCBsb2NhbCBkYXRhICovCisjZGVmaW5lIFJfMzg2X1RMU19MRE0JICAgMTkJCS8qIERpcmVjdCAzMiBiaXQgZm9yIEdOVSB2ZXJzaW9uIG9mCisJCQkJCSAgIGxvY2FsIGR5bmFtaWMgdGhyZWFkIGxvY2FsIGRhdGEKKwkJCQkJICAgaW4gTEUgY29kZSAqLworI2RlZmluZSBSXzM4Nl8xNgkgICAyMAorI2RlZmluZSBSXzM4Nl9QQzE2CSAgIDIxCisjZGVmaW5lIFJfMzg2XzgJCSAgIDIyCisjZGVmaW5lIFJfMzg2X1BDOAkgICAyMworI2RlZmluZSBSXzM4Nl9UTFNfR0RfMzIJICAgMjQJCS8qIERpcmVjdCAzMiBiaXQgZm9yIGdlbmVyYWwgZHluYW1pYworCQkJCQkgICB0aHJlYWQgbG9jYWwgZGF0YSAqLworI2RlZmluZSBSXzM4Nl9UTFNfR0RfUFVTSCAgMjUJCS8qIFRhZyBmb3IgcHVzaGwgaW4gR0QgVExTIGNvZGUgKi8KKyNkZWZpbmUgUl8zODZfVExTX0dEX0NBTEwgIDI2CQkvKiBSZWxvY2F0aW9uIGZvciBjYWxsIHRvCisJCQkJCSAgIF9fdGxzX2dldF9hZGRyKCkgKi8KKyNkZWZpbmUgUl8zODZfVExTX0dEX1BPUCAgIDI3CQkvKiBUYWcgZm9yIHBvcGwgaW4gR0QgVExTIGNvZGUgKi8KKyNkZWZpbmUgUl8zODZfVExTX0xETV8zMiAgIDI4CQkvKiBEaXJlY3QgMzIgYml0IGZvciBsb2NhbCBkeW5hbWljCisJCQkJCSAgIHRocmVhZCBsb2NhbCBkYXRhIGluIExFIGNvZGUgKi8KKyNkZWZpbmUgUl8zODZfVExTX0xETV9QVVNIIDI5CQkvKiBUYWcgZm9yIHB1c2hsIGluIExETSBUTFMgY29kZSAqLworI2RlZmluZSBSXzM4Nl9UTFNfTERNX0NBTEwgMzAJCS8qIFJlbG9jYXRpb24gZm9yIGNhbGwgdG8KKwkJCQkJICAgX190bHNfZ2V0X2FkZHIoKSBpbiBMRE0gY29kZSAqLworI2RlZmluZSBSXzM4Nl9UTFNfTERNX1BPUCAgMzEJCS8qIFRhZyBmb3IgcG9wbCBpbiBMRE0gVExTIGNvZGUgKi8KKyNkZWZpbmUgUl8zODZfVExTX0xET18zMiAgIDMyCQkvKiBPZmZzZXQgcmVsYXRpdmUgdG8gVExTIGJsb2NrICovCisjZGVmaW5lIFJfMzg2X1RMU19JRV8zMgkgICAzMwkJLyogR09UIGVudHJ5IGZvciBuZWdhdGVkIHN0YXRpYyBUTFMKKwkJCQkJICAgYmxvY2sgb2Zmc2V0ICovCisjZGVmaW5lIFJfMzg2X1RMU19MRV8zMgkgICAzNAkJLyogTmVnYXRlZCBvZmZzZXQgcmVsYXRpdmUgdG8gc3RhdGljCisJCQkJCSAgIFRMUyBibG9jayAqLworI2RlZmluZSBSXzM4Nl9UTFNfRFRQTU9EMzIgMzUJCS8qIElEIG9mIG1vZHVsZSBjb250YWluaW5nIHN5bWJvbCAqLworI2RlZmluZSBSXzM4Nl9UTFNfRFRQT0ZGMzIgMzYJCS8qIE9mZnNldCBpbiBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl8zODZfVExTX1RQT0ZGMzIgIDM3CQkvKiBOZWdhdGVkIG9mZnNldCBpbiBzdGF0aWMgVExTIGJsb2NrICovCisvKiAzOD8gKi8KKyNkZWZpbmUgUl8zODZfVExTX0dPVERFU0MgIDM5CQkvKiBHT1Qgb2Zmc2V0IGZvciBUTFMgZGVzY3JpcHRvci4gICovCisjZGVmaW5lIFJfMzg2X1RMU19ERVNDX0NBTEwgNDAJCS8qIE1hcmtlciBvZiBjYWxsIHRocm91Z2ggVExTCisJCQkJCSAgIGRlc2NyaXB0b3IgZm9yCisJCQkJCSAgIHJlbGF4YXRpb24uICAqLworI2RlZmluZSBSXzM4Nl9UTFNfREVTQyAgICAgNDEJCS8qIFRMUyBkZXNjcmlwdG9yIGNvbnRhaW5pbmcKKwkJCQkJICAgcG9pbnRlciB0byBjb2RlIGFuZCB0bworCQkJCQkgICBhcmd1bWVudCwgcmV0dXJuaW5nIHRoZSBUTFMKKwkJCQkJICAgb2Zmc2V0IGZvciB0aGUgc3ltYm9sLiAgKi8KKyNkZWZpbmUgUl8zODZfSVJFTEFUSVZFCSAgIDQyCQkvKiBBZGp1c3QgaW5kaXJlY3RseSBieSBwcm9ncmFtIGJhc2UgKi8KKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfMzg2X05VTQkgICA0MworCisvKiBTVU4gU1BBUkMgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIFNUX1RZUEUgc3ViZmllbGQgb2Ygc3RfaW5mbyAoc3ltYm9sIHR5cGUpLiAgKi8KKworI2RlZmluZSBTVFRfU1BBUkNfUkVHSVNURVIJMTMJLyogR2xvYmFsIHJlZ2lzdGVyIHJlc2VydmVkIHRvIGFwcC4gKi8KKworLyogVmFsdWVzIGZvciBFbGY2NF9FaGRyLmVfZmxhZ3MuICAqLworCisjZGVmaW5lIEVGX1NQQVJDVjlfTU0JCTMKKyNkZWZpbmUgRUZfU1BBUkNWOV9UU08JCTAKKyNkZWZpbmUgRUZfU1BBUkNWOV9QU08JCTEKKyNkZWZpbmUgRUZfU1BBUkNWOV9STU8JCTIKKyNkZWZpbmUgRUZfU1BBUkNfTEVEQVRBCQkweDgwMDAwMCAvKiBsaXR0bGUgZW5kaWFuIGRhdGEgKi8KKyNkZWZpbmUgRUZfU1BBUkNfRVhUX01BU0sJMHhGRkZGMDAKKyNkZWZpbmUgRUZfU1BBUkNfMzJQTFVTCQkweDAwMDEwMCAvKiBnZW5lcmljIFY4KyBmZWF0dXJlcyAqLworI2RlZmluZSBFRl9TUEFSQ19TVU5fVVMxCTB4MDAwMjAwIC8qIFN1biBVbHRyYVNQQVJDMSBleHRlbnNpb25zICovCisjZGVmaW5lIEVGX1NQQVJDX0hBTF9SMQkJMHgwMDA0MDAgLyogSEFMIFIxIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgRUZfU1BBUkNfU1VOX1VTMwkweDAwMDgwMCAvKiBTdW4gVWx0cmFTUEFSQ0lJSSBleHRlbnNpb25zICovCisKKy8qIFNQQVJDIHJlbG9jcy4gICovCisKKyNkZWZpbmUgUl9TUEFSQ19OT05FCQkwCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfU1BBUkNfOAkJMQkvKiBEaXJlY3QgOCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ18xNgkJMgkvKiBEaXJlY3QgMTYgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfMzIJCTMJLyogRGlyZWN0IDMyIGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0RJU1A4CQk0CS8qIFBDIHJlbGF0aXZlIDggYml0ICovCisjZGVmaW5lIFJfU1BBUkNfRElTUDE2CQk1CS8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0RJU1AzMgkJNgkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19XRElTUDMwCQk3CS8qIFBDIHJlbGF0aXZlIDMwIGJpdCBzaGlmdGVkICovCisjZGVmaW5lIFJfU1BBUkNfV0RJU1AyMgkJOAkvKiBQQyByZWxhdGl2ZSAyMiBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX0hJMjIJCTkJLyogSGlnaCAyMiBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ18yMgkJMTAJLyogRGlyZWN0IDIyIGJpdCAqLworI2RlZmluZSBSX1NQQVJDXzEzCQkxMQkvKiBEaXJlY3QgMTMgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfTE8xMAkJMTIJLyogVHJ1bmNhdGVkIDEwIGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0dPVDEwCQkxMwkvKiBUcnVuY2F0ZWQgMTAgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX0dPVDEzCQkxNAkvKiAxMyBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfR09UMjIJCTE1CS8qIDIyIGJpdCBHT1QgZW50cnkgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX1BDMTAJCTE2CS8qIFBDIHJlbGF0aXZlIDEwIGJpdCB0cnVuY2F0ZWQgKi8KKyNkZWZpbmUgUl9TUEFSQ19QQzIyCQkxNwkvKiBQQyByZWxhdGl2ZSAyMiBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX1dQTFQzMAkJMTgJLyogMzAgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCisjZGVmaW5lIFJfU1BBUkNfQ09QWQkJMTkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSX1NQQVJDX0dMT0JfREFUCTIwCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9TUEFSQ19KTVBfU0xPVAkyMQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfUkVMQVRJVkUJMjIJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworI2RlZmluZSBSX1NQQVJDX1VBMzIJCTIzCS8qIERpcmVjdCAzMiBiaXQgdW5hbGlnbmVkICovCisKKy8qIEFkZGl0aW9uYWwgU3BhcmM2NCByZWxvY3MuICAqLworCisjZGVmaW5lIFJfU1BBUkNfUExUMzIJCTI0CS8qIERpcmVjdCAzMiBiaXQgcmVmIHRvIFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX0hJUExUMjIJCTI1CS8qIEhpZ2ggMjIgYml0IFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX0xPUExUMTAJCTI2CS8qIFRydW5jYXRlZCAxMCBiaXQgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfUENQTFQzMgkJMjcJLyogUEMgcmVsIDMyIGJpdCByZWYgdG8gUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfUENQTFQyMgkJMjgJLyogUEMgcmVsIGhpZ2ggMjIgYml0IFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX1BDUExUMTAJCTI5CS8qIFBDIHJlbCB0cnVuYyAxMCBiaXQgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfMTAJCTMwCS8qIERpcmVjdCAxMCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ18xMQkJMzEJLyogRGlyZWN0IDExIGJpdCAqLworI2RlZmluZSBSX1NQQVJDXzY0CQkzMgkvKiBEaXJlY3QgNjQgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfT0xPMTAJCTMzCS8qIDEwYml0IHdpdGggc2Vjb25kYXJ5IDEzYml0IGFkZGVuZCAqLworI2RlZmluZSBSX1NQQVJDX0hIMjIJCTM0CS8qIFRvcCAyMiBiaXRzIG9mIGRpcmVjdCA2NCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19ITTEwCQkzNQkvKiBIaWdoIG1pZGRsZSAxMCBiaXRzIG9mIC4uLiAqLworI2RlZmluZSBSX1NQQVJDX0xNMjIJCTM2CS8qIExvdyBtaWRkbGUgMjIgYml0cyBvZiAuLi4gKi8KKyNkZWZpbmUgUl9TUEFSQ19QQ19ISDIyCQkzNwkvKiBUb3AgMjIgYml0cyBvZiBwYyByZWwgNjQgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfUENfSE0xMAkJMzgJLyogSGlnaCBtaWRkbGUgMTAgYml0IG9mIC4uLiAqLworI2RlZmluZSBSX1NQQVJDX1BDX0xNMjIJCTM5CS8qIExvdyBtaWdnbGUgMjIgYml0cyBvZiAuLi4gKi8KKyNkZWZpbmUgUl9TUEFSQ19XRElTUDE2CQk0MAkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX1dESVNQMTkJCTQxCS8qIFBDIHJlbGF0aXZlIDE5IGJpdCBzaGlmdGVkICovCisjZGVmaW5lIFJfU1BBUkNfR0xPQl9KTVAJNDIJLyogd2FzIHBhcnQgb2YgdjkgQUJJIGJ1dCB3YXMgcmVtb3ZlZCAqLworI2RlZmluZSBSX1NQQVJDXzcJCTQzCS8qIERpcmVjdCA3IGJpdCAqLworI2RlZmluZSBSX1NQQVJDXzUJCTQ0CS8qIERpcmVjdCA1IGJpdCAqLworI2RlZmluZSBSX1NQQVJDXzYJCTQ1CS8qIERpcmVjdCA2IGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0RJU1A2NAkJNDYJLyogUEMgcmVsYXRpdmUgNjQgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfUExUNjQJCTQ3CS8qIERpcmVjdCA2NCBiaXQgcmVmIHRvIFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX0hJWDIyCQk0OAkvKiBIaWdoIDIyIGJpdCBjb21wbGVtZW50ZWQgKi8KKyNkZWZpbmUgUl9TUEFSQ19MT1gxMAkJNDkJLyogVHJ1bmNhdGVkIDExIGJpdCBjb21wbGVtZW50ZWQgKi8KKyNkZWZpbmUgUl9TUEFSQ19INDQJCTUwCS8qIERpcmVjdCBoaWdoIDEyIG9mIDQ0IGJpdCAqLworI2RlZmluZSBSX1NQQVJDX000NAkJNTEJLyogRGlyZWN0IG1pZCAyMiBvZiA0NCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19MNDQJCTUyCS8qIERpcmVjdCBsb3cgMTAgb2YgNDQgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfUkVHSVNURVIJNTMJLyogR2xvYmFsIHJlZ2lzdGVyIHVzYWdlICovCisjZGVmaW5lIFJfU1BBUkNfVUE2NAkJNTQJLyogRGlyZWN0IDY0IGJpdCB1bmFsaWduZWQgKi8KKyNkZWZpbmUgUl9TUEFSQ19VQTE2CQk1NQkvKiBEaXJlY3QgMTYgYml0IHVuYWxpZ25lZCAqLworI2RlZmluZSBSX1NQQVJDX1RMU19HRF9ISTIyCTU2CisjZGVmaW5lIFJfU1BBUkNfVExTX0dEX0xPMTAJNTcKKyNkZWZpbmUgUl9TUEFSQ19UTFNfR0RfQURECTU4CisjZGVmaW5lIFJfU1BBUkNfVExTX0dEX0NBTEwJNTkKKyNkZWZpbmUgUl9TUEFSQ19UTFNfTERNX0hJMjIJNjAKKyNkZWZpbmUgUl9TUEFSQ19UTFNfTERNX0xPMTAJNjEKKyNkZWZpbmUgUl9TUEFSQ19UTFNfTERNX0FERAk2MgorI2RlZmluZSBSX1NQQVJDX1RMU19MRE1fQ0FMTAk2MworI2RlZmluZSBSX1NQQVJDX1RMU19MRE9fSElYMjIJNjQKKyNkZWZpbmUgUl9TUEFSQ19UTFNfTERPX0xPWDEwCTY1CisjZGVmaW5lIFJfU1BBUkNfVExTX0xET19BREQJNjYKKyNkZWZpbmUgUl9TUEFSQ19UTFNfSUVfSEkyMgk2NworI2RlZmluZSBSX1NQQVJDX1RMU19JRV9MTzEwCTY4CisjZGVmaW5lIFJfU1BBUkNfVExTX0lFX0xECTY5CisjZGVmaW5lIFJfU1BBUkNfVExTX0lFX0xEWAk3MAorI2RlZmluZSBSX1NQQVJDX1RMU19JRV9BREQJNzEKKyNkZWZpbmUgUl9TUEFSQ19UTFNfTEVfSElYMjIJNzIKKyNkZWZpbmUgUl9TUEFSQ19UTFNfTEVfTE9YMTAJNzMKKyNkZWZpbmUgUl9TUEFSQ19UTFNfRFRQTU9EMzIJNzQKKyNkZWZpbmUgUl9TUEFSQ19UTFNfRFRQTU9ENjQJNzUKKyNkZWZpbmUgUl9TUEFSQ19UTFNfRFRQT0ZGMzIJNzYKKyNkZWZpbmUgUl9TUEFSQ19UTFNfRFRQT0ZGNjQJNzcKKyNkZWZpbmUgUl9TUEFSQ19UTFNfVFBPRkYzMgk3OAorI2RlZmluZSBSX1NQQVJDX1RMU19UUE9GRjY0CTc5CisjZGVmaW5lIFJfU1BBUkNfR09UREFUQV9ISVgyMgk4MAorI2RlZmluZSBSX1NQQVJDX0dPVERBVEFfTE9YMTAJODEKKyNkZWZpbmUgUl9TUEFSQ19HT1REQVRBX09QX0hJWDIyCTgyCisjZGVmaW5lIFJfU1BBUkNfR09UREFUQV9PUF9MT1gxMAk4MworI2RlZmluZSBSX1NQQVJDX0dPVERBVEFfT1AJODQKKyNkZWZpbmUgUl9TUEFSQ19IMzQJCTg1CisjZGVmaW5lIFJfU1BBUkNfU0laRTMyCQk4NgorI2RlZmluZSBSX1NQQVJDX1NJWkU2NAkJODcKKyNkZWZpbmUgUl9TUEFSQ19KTVBfSVJFTAkyNDgKKyNkZWZpbmUgUl9TUEFSQ19JUkVMQVRJVkUJMjQ5CisjZGVmaW5lIFJfU1BBUkNfR05VX1ZUSU5IRVJJVAkyNTAKKyNkZWZpbmUgUl9TUEFSQ19HTlVfVlRFTlRSWQkyNTEKKyNkZWZpbmUgUl9TUEFSQ19SRVYzMgkJMjUyCisvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLworI2RlZmluZSBSX1NQQVJDX05VTQkJMjUzCisKKy8qIEZvciBTcGFyYzY0LCBsZWdhbCB2YWx1ZXMgZm9yIGRfdGFnIG9mIEVsZjY0X0R5bi4gICovCisKKyNkZWZpbmUgRFRfU1BBUkNfUkVHSVNURVIgMHg3MDAwMDAwMQorI2RlZmluZSBEVF9TUEFSQ19OVU0JMgorCisvKiBNSVBTIFIzMDAwIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBlX2ZsYWdzIGZpZWxkIG9mIEVsZjMyX0VoZHIuICAqLworCisjZGVmaW5lIEVGX01JUFNfTk9SRU9SREVSICAgMQkJLyogQSAubm9yZW9yZGVyIGRpcmVjdGl2ZSB3YXMgdXNlZCAqLworI2RlZmluZSBFRl9NSVBTX1BJQwkgICAgMgkJLyogQ29udGFpbnMgUElDIGNvZGUgKi8KKyNkZWZpbmUgRUZfTUlQU19DUElDCSAgICA0CQkvKiBVc2VzIFBJQyBjYWxsaW5nIHNlcXVlbmNlICovCisjZGVmaW5lIEVGX01JUFNfWEdPVAkgICAgOAorI2RlZmluZSBFRl9NSVBTXzY0QklUX1dISVJMIDE2CisjZGVmaW5lIEVGX01JUFNfQUJJMgkgICAgMzIKKyNkZWZpbmUgRUZfTUlQU19BQklfT04zMiAgICA2NAorI2RlZmluZSBFRl9NSVBTX0FSQ0gJICAgIDB4ZjAwMDAwMDAJLyogTUlQUyBhcmNoaXRlY3R1cmUgbGV2ZWwgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBNSVBTIGFyY2hpdGVjdHVyZSBsZXZlbC4gICovCisKKyNkZWZpbmUgRUZfTUlQU19BUkNIXzEJICAgIDB4MDAwMDAwMDAJLyogLW1pcHMxIGNvZGUuICAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfMgkgICAgMHgxMDAwMDAwMAkvKiAtbWlwczIgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF8zCSAgICAweDIwMDAwMDAwCS8qIC1taXBzMyBjb2RlLiAgKi8KKyNkZWZpbmUgRUZfTUlQU19BUkNIXzQJICAgIDB4MzAwMDAwMDAJLyogLW1pcHM0IGNvZGUuICAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfNQkgICAgMHg0MDAwMDAwMAkvKiAtbWlwczUgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF8zMgkgICAgMHg2MDAwMDAwMAkvKiBNSVBTMzIgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF82NAkgICAgMHg3MDAwMDAwMAkvKiBNSVBTNjQgY29kZS4gICovCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIG5vbi1vZmZpY2lhbCBuYW1lcyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiAgKi8KKworI2RlZmluZSBFX01JUFNfQVJDSF8xCSAgMHgwMDAwMDAwMAkvKiAtbWlwczEgY29kZS4gICovCisjZGVmaW5lIEVfTUlQU19BUkNIXzIJICAweDEwMDAwMDAwCS8qIC1taXBzMiBjb2RlLiAgKi8KKyNkZWZpbmUgRV9NSVBTX0FSQ0hfMwkgIDB4MjAwMDAwMDAJLyogLW1pcHMzIGNvZGUuICAqLworI2RlZmluZSBFX01JUFNfQVJDSF80CSAgMHgzMDAwMDAwMAkvKiAtbWlwczQgY29kZS4gICovCisjZGVmaW5lIEVfTUlQU19BUkNIXzUJICAweDQwMDAwMDAwCS8qIC1taXBzNSBjb2RlLiAgKi8KKyNkZWZpbmUgRV9NSVBTX0FSQ0hfMzIJICAweDYwMDAwMDAwCS8qIE1JUFMzMiBjb2RlLiAgKi8KKyNkZWZpbmUgRV9NSVBTX0FSQ0hfNjQJICAweDcwMDAwMDAwCS8qIE1JUFM2NCBjb2RlLiAgKi8KKworLyogU3BlY2lhbCBzZWN0aW9uIGluZGljZXMuICAqLworCisjZGVmaW5lIFNITl9NSVBTX0FDT01NT04gICAgMHhmZjAwCS8qIEFsbG9jYXRlZCBjb21tb24gc3ltYm9scyAqLworI2RlZmluZSBTSE5fTUlQU19URVhUCSAgICAweGZmMDEJLyogQWxsb2NhdGVkIHRlc3Qgc3ltYm9scy4gICovCisjZGVmaW5lIFNITl9NSVBTX0RBVEEJICAgIDB4ZmYwMgkvKiBBbGxvY2F0ZWQgZGF0YSBzeW1ib2xzLiAgKi8KKyNkZWZpbmUgU0hOX01JUFNfU0NPTU1PTiAgICAweGZmMDMJLyogU21hbGwgY29tbW9uIHN5bWJvbHMgKi8KKyNkZWZpbmUgU0hOX01JUFNfU1VOREVGSU5FRCAweGZmMDQJLyogU21hbGwgdW5kZWZpbmVkIHN5bWJvbHMgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF90eXBlIGZpZWxkIG9mIEVsZjMyX1NoZHIuICAqLworCisjZGVmaW5lIFNIVF9NSVBTX0xJQkxJU1QgICAgICAgMHg3MDAwMDAwMCAvKiBTaGFyZWQgb2JqZWN0cyB1c2VkIGluIGxpbmsgKi8KKyNkZWZpbmUgU0hUX01JUFNfTVNZTQkgICAgICAgMHg3MDAwMDAwMQorI2RlZmluZSBTSFRfTUlQU19DT05GTElDVCAgICAgIDB4NzAwMDAwMDIgLyogQ29uZmxpY3Rpbmcgc3ltYm9scyAqLworI2RlZmluZSBTSFRfTUlQU19HUFRBQgkgICAgICAgMHg3MDAwMDAwMyAvKiBHbG9iYWwgZGF0YSBhcmVhIHNpemVzICovCisjZGVmaW5lIFNIVF9NSVBTX1VDT0RFCSAgICAgICAweDcwMDAwMDA0IC8qIFJlc2VydmVkIGZvciBTR0kvTUlQUyBjb21waWxlcnMgKi8KKyNkZWZpbmUgU0hUX01JUFNfREVCVUcJICAgICAgIDB4NzAwMDAwMDUgLyogTUlQUyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24qLworI2RlZmluZSBTSFRfTUlQU19SRUdJTkZPICAgICAgIDB4NzAwMDAwMDYgLyogUmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgU0hUX01JUFNfUEFDS0FHRSAgICAgICAweDcwMDAwMDA3CisjZGVmaW5lIFNIVF9NSVBTX1BBQ0tTWU0gICAgICAgMHg3MDAwMDAwOAorI2RlZmluZSBTSFRfTUlQU19SRUxECSAgICAgICAweDcwMDAwMDA5CisjZGVmaW5lIFNIVF9NSVBTX0lGQUNFICAgICAgICAgMHg3MDAwMDAwYgorI2RlZmluZSBTSFRfTUlQU19DT05URU5UICAgICAgIDB4NzAwMDAwMGMKKyNkZWZpbmUgU0hUX01JUFNfT1BUSU9OUyAgICAgICAweDcwMDAwMDBkIC8qIE1pc2NlbGxhbmVvdXMgb3B0aW9ucy4gICovCisjZGVmaW5lIFNIVF9NSVBTX1NIRFIJICAgICAgIDB4NzAwMDAwMTAKKyNkZWZpbmUgU0hUX01JUFNfRkRFU0MJICAgICAgIDB4NzAwMDAwMTEKKyNkZWZpbmUgU0hUX01JUFNfRVhUU1lNCSAgICAgICAweDcwMDAwMDEyCisjZGVmaW5lIFNIVF9NSVBTX0RFTlNFCSAgICAgICAweDcwMDAwMDEzCisjZGVmaW5lIFNIVF9NSVBTX1BERVNDCSAgICAgICAweDcwMDAwMDE0CisjZGVmaW5lIFNIVF9NSVBTX0xPQ1NZTQkgICAgICAgMHg3MDAwMDAxNQorI2RlZmluZSBTSFRfTUlQU19BVVhTWU0JICAgICAgIDB4NzAwMDAwMTYKKyNkZWZpbmUgU0hUX01JUFNfT1BUU1lNCSAgICAgICAweDcwMDAwMDE3CisjZGVmaW5lIFNIVF9NSVBTX0xPQ1NUUgkgICAgICAgMHg3MDAwMDAxOAorI2RlZmluZSBTSFRfTUlQU19MSU5FCSAgICAgICAweDcwMDAwMDE5CisjZGVmaW5lIFNIVF9NSVBTX1JGREVTQwkgICAgICAgMHg3MDAwMDAxYQorI2RlZmluZSBTSFRfTUlQU19ERUxUQVNZTSAgICAgIDB4NzAwMDAwMWIKKyNkZWZpbmUgU0hUX01JUFNfREVMVEFJTlNUICAgICAweDcwMDAwMDFjCisjZGVmaW5lIFNIVF9NSVBTX0RFTFRBQ0xBU1MgICAgMHg3MDAwMDAxZAorI2RlZmluZSBTSFRfTUlQU19EV0FSRiAgICAgICAgIDB4NzAwMDAwMWUgLyogRFdBUkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyNkZWZpbmUgU0hUX01JUFNfREVMVEFERUNMICAgICAweDcwMDAwMDFmCisjZGVmaW5lIFNIVF9NSVBTX1NZTUJPTF9MSUIgICAgMHg3MDAwMDAyMAorI2RlZmluZSBTSFRfTUlQU19FVkVOVFMJICAgICAgIDB4NzAwMDAwMjEgLyogRXZlbnQgc2VjdGlvbi4gICovCisjZGVmaW5lIFNIVF9NSVBTX1RSQU5TTEFURSAgICAgMHg3MDAwMDAyMgorI2RlZmluZSBTSFRfTUlQU19QSVhJRQkgICAgICAgMHg3MDAwMDAyMworI2RlZmluZSBTSFRfTUlQU19YTEFURQkgICAgICAgMHg3MDAwMDAyNAorI2RlZmluZSBTSFRfTUlQU19YTEFURV9ERUJVRyAgIDB4NzAwMDAwMjUKKyNkZWZpbmUgU0hUX01JUFNfV0hJUkwJICAgICAgIDB4NzAwMDAwMjYKKyNkZWZpbmUgU0hUX01JUFNfRUhfUkVHSU9OICAgICAweDcwMDAwMDI3CisjZGVmaW5lIFNIVF9NSVBTX1hMQVRFX09MRCAgICAgMHg3MDAwMDAyOAorI2RlZmluZSBTSFRfTUlQU19QRFJfRVhDRVBUSU9OIDB4NzAwMDAwMjkKKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF9mbGFncyBmaWVsZCBvZiBFbGYzMl9TaGRyLiAgKi8KKworI2RlZmluZSBTSEZfTUlQU19HUFJFTAkgMHgxMDAwMDAwMAkvKiBNdXN0IGJlIHBhcnQgb2YgZ2xvYmFsIGRhdGEgYXJlYSAqLworI2RlZmluZSBTSEZfTUlQU19NRVJHRQkgMHgyMDAwMDAwMAorI2RlZmluZSBTSEZfTUlQU19BRERSCSAweDQwMDAwMDAwCisjZGVmaW5lIFNIRl9NSVBTX1NUUklOR1MgMHg4MDAwMDAwMAorI2RlZmluZSBTSEZfTUlQU19OT1NUUklQIDB4MDgwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfTE9DQUwJIDB4MDQwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfTkFNRVMJIDB4MDIwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfTk9EVVBFCSAweDAxMDAwMDAwCisKKworLyogU3ltYm9sIHRhYmxlcy4gICovCisKKy8qIE1JUFMgc3BlY2lmaWMgdmFsdWVzIGZvciBgc3Rfb3RoZXInLiAgKi8KKyNkZWZpbmUgU1RPX01JUFNfREVGQVVMVAkJMHgwCisjZGVmaW5lIFNUT19NSVBTX0lOVEVSTkFMCQkweDEKKyNkZWZpbmUgU1RPX01JUFNfSElEREVOCQkJMHgyCisjZGVmaW5lIFNUT19NSVBTX1BST1RFQ1RFRAkJMHgzCisjZGVmaW5lIFNUT19NSVBTX1BMVAkJCTB4OAorI2RlZmluZSBTVE9fTUlQU19TQ19BTElHTl9VTlVTRUQJMHhmZgorCisvKiBNSVBTIHNwZWNpZmljIHZhbHVlcyBmb3IgYHN0X2luZm8nLiAgKi8KKyNkZWZpbmUgU1RCX01JUFNfU1BMSVRfQ09NTU9OCQkxMworCisvKiBFbnRyaWVzIGZvdW5kIGluIHNlY3Rpb25zIG9mIHR5cGUgU0hUX01JUFNfR1BUQUIuICAqLworCit0eXBlZGVmIHVuaW9uCit7CisgIHN0cnVjdAorICAgIHsKKyAgICAgIEVsZjMyX1dvcmQgZ3RfY3VycmVudF9nX3ZhbHVlOwkvKiAtRyB2YWx1ZSB1c2VkIGZvciBjb21waWxhdGlvbiAqLworICAgICAgRWxmMzJfV29yZCBndF91bnVzZWQ7CQkvKiBOb3QgdXNlZCAqLworICAgIH0gZ3RfaGVhZGVyOwkJCS8qIEZpcnN0IGVudHJ5IGluIHNlY3Rpb24gKi8KKyAgc3RydWN0CisgICAgeworICAgICAgRWxmMzJfV29yZCBndF9nX3ZhbHVlOwkJLyogSWYgdGhpcyB2YWx1ZSB3ZXJlIHVzZWQgZm9yIC1HICovCisgICAgICBFbGYzMl9Xb3JkIGd0X2J5dGVzOwkJLyogVGhpcyBtYW55IGJ5dGVzIHdvdWxkIGJlIHVzZWQgKi8KKyAgICB9IGd0X2VudHJ5OwkJCQkvKiBTdWJzZXF1ZW50IGVudHJpZXMgaW4gc2VjdGlvbiAqLworfSBFbGYzMl9ncHRhYjsKKworLyogRW50cnkgZm91bmQgaW4gc2VjdGlvbnMgb2YgdHlwZSBTSFRfTUlQU19SRUdJTkZPLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZAlyaV9ncHJtYXNrOwkJLyogR2VuZXJhbCByZWdpc3RlcnMgdXNlZCAqLworICBFbGYzMl9Xb3JkCXJpX2Nwcm1hc2tbNF07CQkvKiBDb3Byb2Nlc3NvciByZWdpc3RlcnMgdXNlZCAqLworICBFbGYzMl9Td29yZAlyaV9ncF92YWx1ZTsJCS8qICRncCByZWdpc3RlciB2YWx1ZSAqLworfSBFbGYzMl9SZWdJbmZvOworCisvKiBFbnRyaWVzIGZvdW5kIGluIHNlY3Rpb25zIG9mIHR5cGUgU0hUX01JUFNfT1BUSU9OUy4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIga2luZDsJCS8qIERldGVybWluZXMgaW50ZXJwcmV0YXRpb24gb2YgdGhlCisJCQkJICAgdmFyaWFibGUgcGFydCBvZiBkZXNjcmlwdG9yLiAgKi8KKyAgdW5zaWduZWQgY2hhciBzaXplOwkJLyogU2l6ZSBvZiBkZXNjcmlwdG9yLCBpbmNsdWRpbmcgaGVhZGVyLiAgKi8KKyAgRWxmMzJfU2VjdGlvbiBzZWN0aW9uOwkvKiBTZWN0aW9uIGhlYWRlciBpbmRleCBvZiBzZWN0aW9uIGFmZmVjdGVkLAorCQkJCSAgIDAgZm9yIGdsb2JhbCBvcHRpb25zLiAgKi8KKyAgRWxmMzJfV29yZCBpbmZvOwkJLyogS2luZC1zcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCit9IEVsZl9PcHRpb25zOworCisvKiBWYWx1ZXMgZm9yIGBraW5kJyBmaWVsZCBpbiBFbGZfT3B0aW9ucy4gICovCisKKyNkZWZpbmUgT0RLX05VTEwJMAkvKiBVbmRlZmluZWQuICAqLworI2RlZmluZSBPREtfUkVHSU5GTwkxCS8qIFJlZ2lzdGVyIHVzYWdlIGluZm9ybWF0aW9uLiAgKi8KKyNkZWZpbmUgT0RLX0VYQ0VQVElPTlMJMgkvKiBFeGNlcHRpb24gcHJvY2Vzc2luZyBvcHRpb25zLiAgKi8KKyNkZWZpbmUgT0RLX1BBRAkJMwkvKiBTZWN0aW9uIHBhZGRpbmcgb3B0aW9ucy4gICovCisjZGVmaW5lIE9ES19IV1BBVENICTQJLyogSGFyZHdhcmUgd29ya2Fyb3VuZHMgcGVyZm9ybWVkICovCisjZGVmaW5lIE9ES19GSUxMCTUJLyogcmVjb3JkIHRoZSBmaWxsIHZhbHVlIHVzZWQgYnkgdGhlIGxpbmtlci4gKi8KKyNkZWZpbmUgT0RLX1RBR1MJNgkvKiByZXNlcnZlIHNwYWNlIGZvciBkZXNrdG9wIHRvb2xzIHRvIHdyaXRlLiAqLworI2RlZmluZSBPREtfSFdBTkQJNwkvKiBIVyB3b3JrYXJvdW5kcy4gICdBTkQnIGJpdHMgd2hlbiBtZXJnaW5nLiAqLworI2RlZmluZSBPREtfSFdPUgk4CS8qIEhXIHdvcmthcm91bmRzLiAgJ09SJyBiaXRzIHdoZW4gbWVyZ2luZy4gICovCisKKy8qIFZhbHVlcyBmb3IgYGluZm8nIGluIEVsZl9PcHRpb25zIGZvciBPREtfRVhDRVBUSU9OUyBlbnRyaWVzLiAgKi8KKworI2RlZmluZSBPRVhfRlBVX01JTgkweDFmCS8qIEZQRSdzIHdoaWNoIE1VU1QgYmUgZW5hYmxlZC4gICovCisjZGVmaW5lIE9FWF9GUFVfTUFYCTB4MWYwMAkvKiBGUEUncyB3aGljaCBNQVkgYmUgZW5hYmxlZC4gICovCisjZGVmaW5lIE9FWF9QQUdFMAkweDEwMDAwCS8qIHBhZ2UgemVybyBtdXN0IGJlIG1hcHBlZC4gICovCisjZGVmaW5lIE9FWF9TTU0JCTB4MjAwMDAJLyogRm9yY2Ugc2VxdWVudGlhbCBtZW1vcnkgbW9kZT8gICovCisjZGVmaW5lIE9FWF9GUERCVUcJMHg0MDAwMAkvKiBGb3JjZSBmbG9hdGluZyBwb2ludCBkZWJ1ZyBtb2RlPyAgKi8KKyNkZWZpbmUgT0VYX1BSRUNJU0VGUAlPRVhfRlBEQlVHCisjZGVmaW5lIE9FWF9ESVNNSVNTCTB4ODAwMDAJLyogRGlzbWlzcyBpbnZhbGlkIGFkZHJlc3MgZmF1bHRzPyAgKi8KKworI2RlZmluZSBPRVhfRlBVX0lOVkFMCTB4MTAKKyNkZWZpbmUgT0VYX0ZQVV9ESVYwCTB4MDgKKyNkZWZpbmUgT0VYX0ZQVV9PRkxPCTB4MDQKKyNkZWZpbmUgT0VYX0ZQVV9VRkxPCTB4MDIKKyNkZWZpbmUgT0VYX0ZQVV9JTkVYCTB4MDEKKworLyogTWFza3MgZm9yIGBpbmZvJyBpbiBFbGZfT3B0aW9ucyBmb3IgYW4gT0RLX0hXUEFUQ0ggZW50cnkuICAqLworCisjZGVmaW5lIE9IV19SNEtFT1AJMHgxCS8qIFI0MDAwIGVuZC1vZi1wYWdlIHBhdGNoLiAgKi8KKyNkZWZpbmUgT0hXX1I4S1BGRVRDSAkweDIJLyogbWF5IG5lZWQgUjgwMDAgcHJlZmV0Y2ggcGF0Y2guICAqLworI2RlZmluZSBPSFdfUjVLRU9QCTB4NAkvKiBSNTAwMCBlbmQtb2YtcGFnZSBwYXRjaC4gICovCisjZGVmaW5lIE9IV19SNUtDVlRMCTB4OAkvKiBSNTAwMCBjdnQuW2RzXS5sIGJ1Zy4gIGNsZWFuPTEuICAqLworCisjZGVmaW5lIE9QQURfUFJFRklYCTB4MQorI2RlZmluZSBPUEFEX1BPU1RGSVgJMHgyCisjZGVmaW5lIE9QQURfU1lNQk9MCTB4NAorCisvKiBFbnRyeSBmb3VuZCBpbiBgLm9wdGlvbnMnIHNlY3Rpb24uICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Xb3JkIGh3cF9mbGFnczE7CS8qIEV4dHJhIGZsYWdzLiAgKi8KKyAgRWxmMzJfV29yZCBod3BfZmxhZ3MyOwkvKiBFeHRyYSBmbGFncy4gICovCit9IEVsZl9PcHRpb25zX0h3OworCisvKiBNYXNrcyBmb3IgYGluZm8nIGluIEVsZk9wdGlvbnMgZm9yIE9ES19IV0FORCBhbmQgT0RLX0hXT1IgZW50cmllcy4gICovCisKKyNkZWZpbmUgT0hXQTBfUjRLRU9QX0NIRUNLRUQJMHgwMDAwMDAwMQorI2RlZmluZSBPSFdBMV9SNEtFT1BfQ0xFQU4JMHgwMDAwMDAwMgorCisvKiBNSVBTIHJlbG9jcy4gICovCisKKyNkZWZpbmUgUl9NSVBTX05PTkUJCTAJLyogTm8gcmVsb2MgKi8KKyNkZWZpbmUgUl9NSVBTXzE2CQkxCS8qIERpcmVjdCAxNiBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTXzMyCQkyCS8qIERpcmVjdCAzMiBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX1JFTDMyCQkzCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLworI2RlZmluZSBSX01JUFNfMjYJCTQJLyogRGlyZWN0IDI2IGJpdCBzaGlmdGVkICovCisjZGVmaW5lIFJfTUlQU19ISTE2CQk1CS8qIEhpZ2ggMTYgYml0ICovCisjZGVmaW5lIFJfTUlQU19MTzE2CQk2CS8qIExvdyAxNiBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX0dQUkVMMTYJCTcJLyogR1AgcmVsYXRpdmUgMTYgYml0ICovCisjZGVmaW5lIFJfTUlQU19MSVRFUkFMCQk4CS8qIDE2IGJpdCBsaXRlcmFsIGVudHJ5ICovCisjZGVmaW5lIFJfTUlQU19HT1QxNgkJOQkvKiAxNiBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfTUlQU19QQzE2CQkxMAkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX0NBTEwxNgkJMTEJLyogMTYgYml0IEdPVCBlbnRyeSBmb3IgZnVuY3Rpb24gKi8KKyNkZWZpbmUgUl9NSVBTX0dQUkVMMzIJCTEyCS8qIEdQIHJlbGF0aXZlIDMyIGJpdCAqLworCisjZGVmaW5lIFJfTUlQU19TSElGVDUJCTE2CisjZGVmaW5lIFJfTUlQU19TSElGVDYJCTE3CisjZGVmaW5lIFJfTUlQU182NAkJMTgKKyNkZWZpbmUgUl9NSVBTX0dPVF9ESVNQCQkxOQorI2RlZmluZSBSX01JUFNfR09UX1BBR0UJCTIwCisjZGVmaW5lIFJfTUlQU19HT1RfT0ZTVAkJMjEKKyNkZWZpbmUgUl9NSVBTX0dPVF9ISTE2CQkyMgorI2RlZmluZSBSX01JUFNfR09UX0xPMTYJCTIzCisjZGVmaW5lIFJfTUlQU19TVUIJCTI0CisjZGVmaW5lIFJfTUlQU19JTlNFUlRfQQkJMjUKKyNkZWZpbmUgUl9NSVBTX0lOU0VSVF9CCQkyNgorI2RlZmluZSBSX01JUFNfREVMRVRFCQkyNworI2RlZmluZSBSX01JUFNfSElHSEVSCQkyOAorI2RlZmluZSBSX01JUFNfSElHSEVTVAkJMjkKKyNkZWZpbmUgUl9NSVBTX0NBTExfSEkxNgkzMAorI2RlZmluZSBSX01JUFNfQ0FMTF9MTzE2CTMxCisjZGVmaW5lIFJfTUlQU19TQ05fRElTUAkJMzIKKyNkZWZpbmUgUl9NSVBTX1JFTDE2CQkzMworI2RlZmluZSBSX01JUFNfQUREX0lNTUVESUFURQkzNAorI2RlZmluZSBSX01JUFNfUEpVTVAJCTM1CisjZGVmaW5lIFJfTUlQU19SRUxHT1QJCTM2CisjZGVmaW5lIFJfTUlQU19KQUxSCQkzNworI2RlZmluZSBSX01JUFNfVExTX0RUUE1PRDMyCTM4CS8qIE1vZHVsZSBudW1iZXIgMzIgYml0ICovCisjZGVmaW5lIFJfTUlQU19UTFNfRFRQUkVMMzIJMzkJLyogTW9kdWxlLXJlbGF0aXZlIG9mZnNldCAzMiBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19EVFBNT0Q2NAk0MAkvKiBNb2R1bGUgbnVtYmVyIDY0IGJpdCAqLworI2RlZmluZSBSX01JUFNfVExTX0RUUFJFTDY0CTQxCS8qIE1vZHVsZS1yZWxhdGl2ZSBvZmZzZXQgNjQgYml0ICovCisjZGVmaW5lIFJfTUlQU19UTFNfR0QJCTQyCS8qIDE2IGJpdCBHT1Qgb2Zmc2V0IGZvciBHRCAqLworI2RlZmluZSBSX01JUFNfVExTX0xETQkJNDMJLyogMTYgYml0IEdPVCBvZmZzZXQgZm9yIExETSAqLworI2RlZmluZSBSX01JUFNfVExTX0RUUFJFTF9ISTE2CTQ0CS8qIE1vZHVsZS1yZWxhdGl2ZSBvZmZzZXQsIGhpZ2ggMTYgYml0cyAqLworI2RlZmluZSBSX01JUFNfVExTX0RUUFJFTF9MTzE2CTQ1CS8qIE1vZHVsZS1yZWxhdGl2ZSBvZmZzZXQsIGxvdyAxNiBiaXRzICovCisjZGVmaW5lIFJfTUlQU19UTFNfR09UVFBSRUwJNDYJLyogMTYgYml0IEdPVCBvZmZzZXQgZm9yIElFICovCisjZGVmaW5lIFJfTUlQU19UTFNfVFBSRUwzMgk0NwkvKiBUUC1yZWxhdGl2ZSBvZmZzZXQsIDMyIGJpdCAqLworI2RlZmluZSBSX01JUFNfVExTX1RQUkVMNjQJNDgJLyogVFAtcmVsYXRpdmUgb2Zmc2V0LCA2NCBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19UUFJFTF9ISTE2CTQ5CS8qIFRQLXJlbGF0aXZlIG9mZnNldCwgaGlnaCAxNiBiaXRzICovCisjZGVmaW5lIFJfTUlQU19UTFNfVFBSRUxfTE8xNgk1MAkvKiBUUC1yZWxhdGl2ZSBvZmZzZXQsIGxvdyAxNiBiaXRzICovCisjZGVmaW5lIFJfTUlQU19HTE9CX0RBVAkJNTEKKyNkZWZpbmUgUl9NSVBTX0NPUFkJCTEyNgorI2RlZmluZSBSX01JUFNfSlVNUF9TTE9UICAgICAgICAxMjcKKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfTUlQU19OVU0JCTEyOAorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHBfdHlwZSBmaWVsZCBvZiBFbGYzMl9QaGRyLiAgKi8KKworI2RlZmluZSBQVF9NSVBTX1JFR0lORk8JMHg3MDAwMDAwMAkvKiBSZWdpc3RlciB1c2FnZSBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBQVF9NSVBTX1JUUFJPQyAgMHg3MDAwMDAwMQkvKiBSdW50aW1lIHByb2NlZHVyZSB0YWJsZS4gKi8KKyNkZWZpbmUgUFRfTUlQU19PUFRJT05TIDB4NzAwMDAwMDIKKworLyogU3BlY2lhbCBwcm9ncmFtIGhlYWRlciB0eXBlcy4gICovCisKKyNkZWZpbmUgUEZfTUlQU19MT0NBTAkweDEwMDAwMDAwCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgZF90YWcgZmllbGQgb2YgRWxmMzJfRHluLiAgKi8KKworI2RlZmluZSBEVF9NSVBTX1JMRF9WRVJTSU9OICAweDcwMDAwMDAxCS8qIFJ1bnRpbWUgbGlua2VyIGludGVyZmFjZSB2ZXJzaW9uICovCisjZGVmaW5lIERUX01JUFNfVElNRV9TVEFNUCAgIDB4NzAwMDAwMDIJLyogVGltZXN0YW1wICovCisjZGVmaW5lIERUX01JUFNfSUNIRUNLU1VNICAgIDB4NzAwMDAwMDMJLyogQ2hlY2tzdW0gKi8KKyNkZWZpbmUgRFRfTUlQU19JVkVSU0lPTiAgICAgMHg3MDAwMDAwNAkvKiBWZXJzaW9uIHN0cmluZyAoc3RyaW5nIHRibCBpbmRleCkgKi8KKyNkZWZpbmUgRFRfTUlQU19GTEFHUwkgICAgIDB4NzAwMDAwMDUJLyogRmxhZ3MgKi8KKyNkZWZpbmUgRFRfTUlQU19CQVNFX0FERFJFU1MgMHg3MDAwMDAwNgkvKiBCYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRFRfTUlQU19NU1lNCSAgICAgMHg3MDAwMDAwNworI2RlZmluZSBEVF9NSVBTX0NPTkZMSUNUICAgICAweDcwMDAwMDA4CS8qIEFkZHJlc3Mgb2YgQ09ORkxJQ1Qgc2VjdGlvbiAqLworI2RlZmluZSBEVF9NSVBTX0xJQkxJU1QJICAgICAweDcwMDAwMDA5CS8qIEFkZHJlc3Mgb2YgTElCTElTVCBzZWN0aW9uICovCisjZGVmaW5lIERUX01JUFNfTE9DQUxfR09UTk8gIDB4NzAwMDAwMGEJLyogTnVtYmVyIG9mIGxvY2FsIEdPVCBlbnRyaWVzICovCisjZGVmaW5lIERUX01JUFNfQ09ORkxJQ1ROTyAgIDB4NzAwMDAwMGIJLyogTnVtYmVyIG9mIENPTkZMSUNUIGVudHJpZXMgKi8KKyNkZWZpbmUgRFRfTUlQU19MSUJMSVNUTk8gICAgMHg3MDAwMDAxMAkvKiBOdW1iZXIgb2YgTElCTElTVCBlbnRyaWVzICovCisjZGVmaW5lIERUX01JUFNfU1lNVEFCTk8gICAgIDB4NzAwMDAwMTEJLyogTnVtYmVyIG9mIERZTlNZTSBlbnRyaWVzICovCisjZGVmaW5lIERUX01JUFNfVU5SRUZFWFROTyAgIDB4NzAwMDAwMTIJLyogRmlyc3QgZXh0ZXJuYWwgRFlOU1lNICovCisjZGVmaW5lIERUX01JUFNfR09UU1lNCSAgICAgMHg3MDAwMDAxMwkvKiBGaXJzdCBHT1QgZW50cnkgaW4gRFlOU1lNICovCisjZGVmaW5lIERUX01JUFNfSElQQUdFTk8gICAgIDB4NzAwMDAwMTQJLyogTnVtYmVyIG9mIEdPVCBwYWdlIHRhYmxlIGVudHJpZXMgKi8KKyNkZWZpbmUgRFRfTUlQU19STERfTUFQCSAgICAgMHg3MDAwMDAxNgkvKiBBZGRyZXNzIG9mIHJ1biB0aW1lIGxvYWRlciBtYXAuICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTICAweDcwMDAwMDE3CS8qIERlbHRhIEMrKyBjbGFzcyBkZWZpbml0aW9uLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTU19OTyAgICAweDcwMDAwMDE4IC8qIE51bWJlciBvZiBlbnRyaWVzIGluCisJCQkJCQlEVF9NSVBTX0RFTFRBX0NMQVNTLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9JTlNUQU5DRSAgICAweDcwMDAwMDE5IC8qIERlbHRhIEMrKyBjbGFzcyBpbnN0YW5jZXMuICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFX05PIDB4NzAwMDAwMWEgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4KKwkJCQkJCURUX01JUFNfREVMVEFfSU5TVEFOQ0UuICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX1JFTE9DICAweDcwMDAwMDFiIC8qIERlbHRhIHJlbG9jYXRpb25zLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9SRUxPQ19OTyAweDcwMDAwMDFjIC8qIE51bWJlciBvZiBlbnRyaWVzIGluCisJCQkJCSAgICAgRFRfTUlQU19ERUxUQV9SRUxPQy4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfU1lNICAgIDB4NzAwMDAwMWQgLyogRGVsdGEgc3ltYm9scyB0aGF0IERlbHRhCisJCQkJCSAgIHJlbG9jYXRpb25zIHJlZmVyIHRvLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9TWU1fTk8gMHg3MDAwMDAxZSAvKiBOdW1iZXIgb2YgZW50cmllcyBpbgorCQkJCQkgICBEVF9NSVBTX0RFTFRBX1NZTS4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfQ0xBU1NTWU0gMHg3MDAwMDAyMCAvKiBEZWx0YSBzeW1ib2xzIHRoYXQgaG9sZCB0aGUKKwkJCQkJICAgICBjbGFzcyBkZWNsYXJhdGlvbi4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfQ0xBU1NTWU1fTk8gMHg3MDAwMDAyMSAvKiBOdW1iZXIgb2YgZW50cmllcyBpbgorCQkJCQkJRFRfTUlQU19ERUxUQV9DTEFTU1NZTS4gICovCisjZGVmaW5lIERUX01JUFNfQ1hYX0ZMQUdTICAgIDB4NzAwMDAwMjIgLyogRmxhZ3MgaW5kaWNhdGluZyBmb3IgQysrIGZsYXZvci4gICovCisjZGVmaW5lIERUX01JUFNfUElYSUVfSU5JVCAgIDB4NzAwMDAwMjMKKyNkZWZpbmUgRFRfTUlQU19TWU1CT0xfTElCICAgMHg3MDAwMDAyNAorI2RlZmluZSBEVF9NSVBTX0xPQ0FMUEFHRV9HT1RJRFggMHg3MDAwMDAyNQorI2RlZmluZSBEVF9NSVBTX0xPQ0FMX0dPVElEWCAweDcwMDAwMDI2CisjZGVmaW5lIERUX01JUFNfSElEREVOX0dPVElEWCAweDcwMDAwMDI3CisjZGVmaW5lIERUX01JUFNfUFJPVEVDVEVEX0dPVElEWCAweDcwMDAwMDI4CisjZGVmaW5lIERUX01JUFNfT1BUSU9OUwkgICAgIDB4NzAwMDAwMjkgLyogQWRkcmVzcyBvZiAub3B0aW9ucy4gICovCisjZGVmaW5lIERUX01JUFNfSU5URVJGQUNFICAgIDB4NzAwMDAwMmEgLyogQWRkcmVzcyBvZiAuaW50ZXJmYWNlLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19EWU5TVFJfQUxJR04gMHg3MDAwMDAyYgorI2RlZmluZSBEVF9NSVBTX0lOVEVSRkFDRV9TSVpFIDB4NzAwMDAwMmMgLyogU2l6ZSBvZiB0aGUgLmludGVyZmFjZSBzZWN0aW9uLiAqLworI2RlZmluZSBEVF9NSVBTX1JMRF9URVhUX1JFU09MVkVfQUREUiAweDcwMDAwMDJkIC8qIEFkZHJlc3Mgb2YgcmxkX3RleHRfcnNvbHZlCisJCQkJCQkgICAgZnVuY3Rpb24gc3RvcmVkIGluIEdPVC4gICovCisjZGVmaW5lIERUX01JUFNfUEVSRl9TVUZGSVggIDB4NzAwMDAwMmUgLyogRGVmYXVsdCBzdWZmaXggb2YgZHNvIHRvIGJlIGFkZGVkCisJCQkJCSAgIGJ5IHJsZCBvbiBkbG9wZW4oKSBjYWxscy4gICovCisjZGVmaW5lIERUX01JUFNfQ09NUEFDVF9TSVpFIDB4NzAwMDAwMmYgLyogKE8zMilTaXplIG9mIGNvbXBhY3QgcmVsIHNlY3Rpb24uICovCisjZGVmaW5lIERUX01JUFNfR1BfVkFMVUUgICAgIDB4NzAwMDAwMzAgLyogR1AgdmFsdWUgZm9yIGF1eCBHT1RzLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19BVVhfRFlOQU1JQyAgMHg3MDAwMDAzMSAvKiBBZGRyZXNzIG9mIGF1eCAuZHluYW1pYy4gICovCisvKiBUaGUgYWRkcmVzcyBvZiAuZ290LnBsdCBpbiBhbiBleGVjdXRhYmxlIHVzaW5nIHRoZSBuZXcgbm9uLVBJQyBBQkkuICAqLworI2RlZmluZSBEVF9NSVBTX1BMVEdPVAkgICAgIDB4NzAwMDAwMzIKKy8qIFRoZSBiYXNlIG9mIHRoZSBQTFQgaW4gYW4gZXhlY3V0YWJsZSB1c2luZyB0aGUgbmV3IG5vbi1QSUMgQUJJIGlmIHRoYXQKKyAgIFBMVCBpcyB3cml0YWJsZS4gIEZvciBhIG5vbi13cml0YWJsZSBQTFQsIHRoaXMgaXMgb21pdHRlZCBvciBoYXMgYSB6ZXJvCisgICB2YWx1ZS4gICovCisjZGVmaW5lIERUX01JUFNfUldQTFQgICAgICAgIDB4NzAwMDAwMzQKKyNkZWZpbmUgRFRfTUlQU19OVU0JICAgICAweDM1CisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgRFRfTUlQU19GTEFHUyBFbGYzMl9EeW4gZW50cnkuICAqLworCisjZGVmaW5lIFJIRl9OT05FCQkgICAwCQkvKiBObyBmbGFncyAqLworI2RlZmluZSBSSEZfUVVJQ0tTVEFSVAkJICAgKDEgPDwgMCkJLyogVXNlIHF1aWNrc3RhcnQgKi8KKyNkZWZpbmUgUkhGX05PVFBPVAkJICAgKDEgPDwgMSkJLyogSGFzaCBzaXplIG5vdCBwb3dlciBvZiAyICovCisjZGVmaW5lIFJIRl9OT19MSUJSQVJZX1JFUExBQ0VNRU5UICgxIDw8IDIpCS8qIElnbm9yZSBMRF9MSUJSQVJZX1BBVEggKi8KKyNkZWZpbmUgUkhGX05PX01PVkUJCSAgICgxIDw8IDMpCisjZGVmaW5lIFJIRl9TR0lfT05MWQkJICAgKDEgPDwgNCkKKyNkZWZpbmUgUkhGX0dVQVJBTlRFRV9JTklUCSAgICgxIDw8IDUpCisjZGVmaW5lIFJIRl9ERUxUQV9DX1BMVVNfUExVUwkgICAoMSA8PCA2KQorI2RlZmluZSBSSEZfR1VBUkFOVEVFX1NUQVJUX0lOSVQgICAoMSA8PCA3KQorI2RlZmluZSBSSEZfUElYSUUJCSAgICgxIDw8IDgpCisjZGVmaW5lIFJIRl9ERUZBVUxUX0RFTEFZX0xPQUQJICAgKDEgPDwgOSkKKyNkZWZpbmUgUkhGX1JFUVVJQ0tTVEFSVAkgICAoMSA8PCAxMCkKKyNkZWZpbmUgUkhGX1JFUVVJQ0tTVEFSVEVECSAgICgxIDw8IDExKQorI2RlZmluZSBSSEZfQ09SRAkJICAgKDEgPDwgMTIpCisjZGVmaW5lIFJIRl9OT19VTlJFU19VTkRFRgkgICAoMSA8PCAxMykKKyNkZWZpbmUgUkhGX1JMRF9PUkRFUl9TQUZFCSAgICgxIDw8IDE0KQorCisvKiBFbnRyaWVzIGZvdW5kIGluIHNlY3Rpb25zIG9mIHR5cGUgU0hUX01JUFNfTElCTElTVC4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1dvcmQgbF9uYW1lOwkJLyogTmFtZSAoc3RyaW5nIHRhYmxlIGluZGV4KSAqLworICBFbGYzMl9Xb3JkIGxfdGltZV9zdGFtcDsJLyogVGltZXN0YW1wICovCisgIEVsZjMyX1dvcmQgbF9jaGVja3N1bTsJLyogQ2hlY2tzdW0gKi8KKyAgRWxmMzJfV29yZCBsX3ZlcnNpb247CQkvKiBJbnRlcmZhY2UgdmVyc2lvbiAqLworICBFbGYzMl9Xb3JkIGxfZmxhZ3M7CQkvKiBGbGFncyAqLworfSBFbGYzMl9MaWI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X1dvcmQgbF9uYW1lOwkJLyogTmFtZSAoc3RyaW5nIHRhYmxlIGluZGV4KSAqLworICBFbGY2NF9Xb3JkIGxfdGltZV9zdGFtcDsJLyogVGltZXN0YW1wICovCisgIEVsZjY0X1dvcmQgbF9jaGVja3N1bTsJLyogQ2hlY2tzdW0gKi8KKyAgRWxmNjRfV29yZCBsX3ZlcnNpb247CQkvKiBJbnRlcmZhY2UgdmVyc2lvbiAqLworICBFbGY2NF9Xb3JkIGxfZmxhZ3M7CQkvKiBGbGFncyAqLworfSBFbGY2NF9MaWI7CisKKworLyogTGVnYWwgdmFsdWVzIGZvciBsX2ZsYWdzLiAgKi8KKworI2RlZmluZSBMTF9OT05FCQkgIDAKKyNkZWZpbmUgTExfRVhBQ1RfTUFUQ0gJICAoMSA8PCAwKQkvKiBSZXF1aXJlIGV4YWN0IG1hdGNoICovCisjZGVmaW5lIExMX0lHTk9SRV9JTlRfVkVSICgxIDw8IDEpCS8qIElnbm9yZSBpbnRlcmZhY2UgdmVyc2lvbiAqLworI2RlZmluZSBMTF9SRVFVSVJFX01JTk9SICAoMSA8PCAyKQorI2RlZmluZSBMTF9FWFBPUlRTCSAgKDEgPDwgMykKKyNkZWZpbmUgTExfREVMQVlfTE9BRAkgICgxIDw8IDQpCisjZGVmaW5lIExMX0RFTFRBCSAgKDEgPDwgNSkKKworLyogRW50cmllcyBmb3VuZCBpbiBzZWN0aW9ucyBvZiB0eXBlIFNIVF9NSVBTX0NPTkZMSUNULiAgKi8KKwordHlwZWRlZiBFbGYzMl9BZGRyIEVsZjMyX0NvbmZsaWN0OworCisKKy8qIEhQUEEgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGVfZmxhZ3MgZmllbGQgb2YgRWxmMzJfRWhkci4gICovCisKKyNkZWZpbmUgRUZfUEFSSVNDX1RSQVBOSUwJMHgwMDAxMDAwMCAvKiBUcmFwIG5pbCBwb2ludGVyIGRlcmVmZXJlbmNlLiAgKi8KKyNkZWZpbmUgRUZfUEFSSVNDX0VYVAkJMHgwMDAyMDAwMCAvKiBQcm9ncmFtIHVzZXMgYXJjaC4gZXh0ZW5zaW9ucy4gKi8KKyNkZWZpbmUgRUZfUEFSSVNDX0xTQgkJMHgwMDA0MDAwMCAvKiBQcm9ncmFtIGV4cGVjdHMgbGl0dGxlIGVuZGlhbi4gKi8KKyNkZWZpbmUgRUZfUEFSSVNDX1dJREUJCTB4MDAwODAwMDAgLyogUHJvZ3JhbSBleHBlY3RzIHdpZGUgbW9kZS4gICovCisjZGVmaW5lIEVGX1BBUklTQ19OT19LQUJQCTB4MDAxMDAwMDAgLyogTm8ga2VybmVsIGFzc2lzdGVkIGJyYW5jaAorCQkJCQkgICAgICBwcmVkaWN0aW9uLiAgKi8KKyNkZWZpbmUgRUZfUEFSSVNDX0xBWllTV0FQCTB4MDA0MDAwMDAgLyogQWxsb3cgbGF6eSBzd2FwcGluZy4gICovCisjZGVmaW5lIEVGX1BBUklTQ19BUkNICQkweDAwMDBmZmZmIC8qIEFyY2hpdGVjdHVyZSB2ZXJzaW9uLiAgKi8KKworLyogRGVmaW5lZCB2YWx1ZXMgZm9yIGBlX2ZsYWdzICYgRUZfUEFSSVNDX0FSQ0gnIGFyZTogICovCisKKyNkZWZpbmUgRUZBX1BBUklTQ18xXzAJCSAgICAweDAyMGIgLyogUEEtUklTQyAxLjAgYmlnLWVuZGlhbi4gICovCisjZGVmaW5lIEVGQV9QQVJJU0NfMV8xCQkgICAgMHgwMjEwIC8qIFBBLVJJU0MgMS4xIGJpZy1lbmRpYW4uICAqLworI2RlZmluZSBFRkFfUEFSSVNDXzJfMAkJICAgIDB4MDIxNCAvKiBQQS1SSVNDIDIuMCBiaWctZW5kaWFuLiAgKi8KKworLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZGVjZXMuICAqLworCisjZGVmaW5lIFNITl9QQVJJU0NfQU5TSV9DT01NT04JMHhmZjAwCSAgIC8qIFNlY3Rpb24gZm9yIHRlbmF0aXZlbHkgZGVjbGFyZWQKKwkJCQkJICAgICAgc3ltYm9scyBpbiBBTlNJIEMuICAqLworI2RlZmluZSBTSE5fUEFSSVNDX0hVR0VfQ09NTU9OCTB4ZmYwMQkgICAvKiBDb21tb24gYmxvY2tzIGluIGh1Z2UgbW9kZWwuICAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHNoX3R5cGUgZmllbGQgb2YgRWxmMzJfU2hkci4gICovCisKKyNkZWZpbmUgU0hUX1BBUklTQ19FWFQJCTB4NzAwMDAwMDAgLyogQ29udGFpbnMgcHJvZHVjdCBzcGVjaWZpYyBleHQuICovCisjZGVmaW5lIFNIVF9QQVJJU0NfVU5XSU5ECTB4NzAwMDAwMDEgLyogVW53aW5kIGluZm9ybWF0aW9uLiAgKi8KKyNkZWZpbmUgU0hUX1BBUklTQ19ET0MJCTB4NzAwMDAwMDIgLyogRGVidWcgaW5mbyBmb3Igb3B0aW1pemVkIGNvZGUuICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfZmxhZ3MgZmllbGQgb2YgRWxmMzJfU2hkci4gICovCisKKyNkZWZpbmUgU0hGX1BBUklTQ19TSE9SVAkweDIwMDAwMDAwIC8qIFNlY3Rpb24gd2l0aCBzaG9ydCBhZGRyZXNzaW5nLiAqLworI2RlZmluZSBTSEZfUEFSSVNDX0hVR0UJCTB4NDAwMDAwMDAgLyogU2VjdGlvbiBmYXIgZnJvbSBncC4gICovCisjZGVmaW5lIFNIRl9QQVJJU0NfU0JQCQkweDgwMDAwMDAwIC8qIFN0YXRpYyBicmFuY2ggcHJlZGljdGlvbiBjb2RlLiAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIFNUX1RZUEUgc3ViZmllbGQgb2Ygc3RfaW5mbyAoc3ltYm9sIHR5cGUpLiAgKi8KKworI2RlZmluZSBTVFRfUEFSSVNDX01JTExJQ09ERQkxMwkvKiBNaWxsaWNvZGUgZnVuY3Rpb24gZW50cnkgcG9pbnQuICAqLworCisjZGVmaW5lIFNUVF9IUF9PUEFRVUUJCShTVFRfTE9PUyArIDB4MSkKKyNkZWZpbmUgU1RUX0hQX1NUVUIJCShTVFRfTE9PUyArIDB4MikKKworLyogSFBQQSByZWxvY3MuICAqLworCisjZGVmaW5lIFJfUEFSSVNDX05PTkUJCTAJLyogTm8gcmVsb2MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIzMgkJMQkvKiBEaXJlY3QgMzItYml0IHJlZmVyZW5jZS4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjIxTAkJMgkvKiBMZWZ0IDIxIGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTdSCQkzCS8qIFJpZ2h0IDE3IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTdGCQk0CS8qIDE3IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTRSCQk2CS8qIFJpZ2h0IDE0IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwzMgk5CS8qIDMyLWJpdCByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDIxTAkxMAkvKiBMZWZ0IDIxIGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwxN1IJMTEJLyogUmlnaHQgMTcgYml0cyBvZiByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE3RgkxMgkvKiAxNyBiaXRzIG9mIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTRSCTE0CS8qIFJpZ2h0IDE0IGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRFBSRUwyMUwJMTgJLyogTGVmdCAyMSBiaXRzIG9mIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RQUkVMMTRSCTIyCS8qIFJpZ2h0IDE0IGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwyMUwJMjYJLyogR1AtcmVsYXRpdmUsIGxlZnQgMjEgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMMTRSCTMwCS8qIEdQLXJlbGF0aXZlLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkYyMUwJMzQJLyogTFQtcmVsYXRpdmUsIGxlZnQgMjEgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTRSCTM4CS8qIExULXJlbGF0aXZlLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfU0VDUkVMMzIJNDEJLyogMzIgYml0cyBzZWN0aW9uIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1NFR0JBU0UJNDgJLyogTm8gcmVsb2NhdGlvbiwgc2V0IHNlZ21lbnQgYmFzZS4gICovCisjZGVmaW5lIFJfUEFSSVNDX1NFR1JFTDMyCTQ5CS8qIDMyIGJpdHMgc2VnbWVudCByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QTFRPRkYyMUwJNTAJLyogUExUIHJlbC4gYWRkcmVzcywgbGVmdCAyMSBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExUT0ZGMTRSCTU0CS8qIFBMVCByZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMzIJNTcJLyogMzIgYml0cyBMVC1yZWwuIGZ1bmN0aW9uIHBvaW50ZXIuICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIyMUwJNTgJLyogTFQtcmVsLiBmY3QgcHRyLCBsZWZ0IDIxIGJpdHMuICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIJNjIJLyogTFQtcmVsLiBmY3QgcHRyLCByaWdodCAxNCBiaXRzLiAqLworI2RlZmluZSBSX1BBUklTQ19GUFRSNjQJCTY0CS8qIDY0IGJpdHMgZnVuY3Rpb24gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMQUJFTDMyCTY1CS8qIDMyIGJpdHMgZnVuY3Rpb24gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMQUJFTDIxTAk2NgkvKiBMZWZ0IDIxIGJpdHMgb2YgZmRlc2MgYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMQUJFTDE0Ugk3MAkvKiBSaWdodCAxNCBiaXRzIG9mIGZkZXNjIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDY0CTcyCS8qIDY0IGJpdHMgUEMtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwyMkYJNzQJLyogMjIgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE0V1IJNzUJLyogUEMtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwxNERSCTc2CS8qIFBDIHJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTZGCTc3CS8qIDE2IGJpdHMgUEMtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwxNldGCTc4CS8qIDE2IGJpdHMgUEMtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwxNkRGCTc5CS8qIDE2IGJpdHMgUEMtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSNjQJCTgwCS8qIDY0IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTRXUgk4MwkvKiAxNCBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjE0RFIJODQJLyogMTQgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIxNkYJCTg1CS8qIDE2IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTZXRgk4NgkvKiAxNiBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjE2REYJODcJLyogMTYgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19HUFJFTDY0CTg4CS8qIDY0IGJpdHMgb2YgR1AtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNFdSCTkxCS8qIEdQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMMTREUgk5MgkvKiBHUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19HUFJFTDE2Rgk5MwkvKiAxNiBiaXRzIEdQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMMTZXRgk5NAkvKiAxNiBiaXRzIEdQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMMTZERgk5NQkvKiAxNiBiaXRzIEdQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGNjQJOTYJLyogNjQgYml0cyBMVC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRjE0V1IJOTkJLyogTFQtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkYxNERSCTEwMAkvKiBMVC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRjE2RgkxMDEJLyogMTYgYml0cyBMVC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRjE2V0YJMTAyCS8qIDE2IGJpdHMgTFQtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkYxNkRGCTEwMwkvKiAxNiBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1NFQ1JFTDY0CTEwNAkvKiA2NCBiaXRzIHNlY3Rpb24gcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfU0VHUkVMNjQJMTEyCS8qIDY0IGJpdHMgc2VnbWVudCByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QTFRPRkYxNFdSCTExNQkvKiBQTFQtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExUT0ZGMTREUgkxMTYJLyogUExULXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE2RgkxMTcJLyogMTYgYml0cyBMVC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QTFRPRkYxNldGCTExOAkvKiAxNiBiaXRzIFBMVC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QTFRPRkYxNkRGCTExOQkvKiAxNiBiaXRzIFBMVC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSNjQJMTIwCS8qIDY0IGJpdHMgTFQtcmVsLiBmdW5jdGlvbiBwdHIuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRXUgkxMjMJLyogTFQtcmVsLiBmY3QuIHB0ci4sIHJpZ2h0IDE0IGJpdHMuICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSCTEyNAkvKiBMVC1yZWwuIGZjdC4gcHRyLiwgcmlnaHQgMTQgYml0cy4gKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjE2RgkxMjUJLyogMTYgYml0cyBMVC1yZWwuIGZ1bmN0aW9uIHB0ci4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNldGCTEyNgkvKiAxNiBiaXRzIExULXJlbC4gZnVuY3Rpb24gcHRyLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjE2REYJMTI3CS8qIDE2IGJpdHMgTFQtcmVsLiBmdW5jdGlvbiBwdHIuICAqLworI2RlZmluZSBSX1BBUklTQ19MT1JFU0VSVkUJMTI4CisjZGVmaW5lIFJfUEFSSVNDX0NPUFkJCTEyOAkvKiBDb3B5IHJlbG9jYXRpb24uICAqLworI2RlZmluZSBSX1BBUklTQ19JUExUCQkxMjkJLyogRHluYW1pYyByZWxvYywgaW1wb3J0ZWQgUExUICovCisjZGVmaW5lIFJfUEFSSVNDX0VQTFQJCTEzMAkvKiBEeW5hbWljIHJlbG9jLCBleHBvcnRlZCBQTFQgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUwzMgkxNTMJLyogMzIgYml0cyBUUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19UUFJFTDIxTAkxNTQJLyogVFAtcmVsLiBhZGRyZXNzLCBsZWZ0IDIxIGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19UUFJFTDE0UgkxNTgJLyogVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfVFAyMUwJMTYyCS8qIExULVRQLXJlbC4gYWRkcmVzcywgbGVmdCAyMSBiaXRzLiAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDE0UgkxNjYJLyogTFQtVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTRGCTE2NwkvKiAxNCBiaXRzIExULVRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMNjQJMjE2CS8qIDY0IGJpdHMgVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUwxNFdSCTIxOQkvKiBUUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19UUFJFTDE0RFIJMjIwCS8qIFRQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTZGCTIyMQkvKiAxNiBiaXRzIFRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTZXRgkyMjIJLyogMTYgYml0cyBUUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19UUFJFTDE2REYJMjIzCS8qIDE2IGJpdHMgVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfVFA2NAkyMjQJLyogNjQgYml0cyBMVC1UUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDE0V1IJMjI3CS8qIExULVRQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4qLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDE0RFIJMjI4CS8qIExULVRQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4qLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDE2RgkyMjkJLyogMTYgYml0cyBMVC1UUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDE2V0YJMjMwCS8qIDE2IGJpdHMgTFQtVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfVFAxNkRGCTIzMQkvKiAxNiBiaXRzIExULVRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dOVV9WVEVOVFJZCTIzMgorI2RlZmluZSBSX1BBUklTQ19HTlVfVlRJTkhFUklUCTIzMworI2RlZmluZSBSX1BBUklTQ19UTFNfR0QyMUwJMjM0CS8qIEdEIDIxLWJpdCBsZWZ0LiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVExTX0dEMTRSCTIzNQkvKiBHRCAxNC1iaXQgcmlnaHQuICAqLworI2RlZmluZSBSX1BBUklTQ19UTFNfR0RDQUxMCTIzNgkvKiBHRCBjYWxsIHRvIF9fdF9nX2EuICAqLworI2RlZmluZSBSX1BBUklTQ19UTFNfTERNMjFMCTIzNwkvKiBMRCBtb2R1bGUgMjEtYml0IGxlZnQuICAqLworI2RlZmluZSBSX1BBUklTQ19UTFNfTERNMTRSCTIzOAkvKiBMRCBtb2R1bGUgMTQtYml0IHJpZ2h0LiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVExTX0xETUNBTEwJMjM5CS8qIExEIG1vZHVsZSBjYWxsIHRvIF9fdF9nX2EuICAqLworI2RlZmluZSBSX1BBUklTQ19UTFNfTERPMjFMCTI0MAkvKiBMRCBvZmZzZXQgMjEtYml0IGxlZnQuICAqLworI2RlZmluZSBSX1BBUklTQ19UTFNfTERPMTRSCTI0MQkvKiBMRCBvZmZzZXQgMTQtYml0IHJpZ2h0LiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVExTX0RUUE1PRDMyCTI0MgkvKiBEVFAgbW9kdWxlIDMyLWJpdC4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RMU19EVFBNT0Q2NAkyNDMJLyogRFRQIG1vZHVsZSA2NC1iaXQuICAqLworI2RlZmluZSBSX1BBUklTQ19UTFNfRFRQT0ZGMzIJMjQ0CS8qIERUUCBvZmZzZXQgMzItYml0LiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVExTX0RUUE9GRjY0CTI0NQkvKiBEVFAgb2Zmc2V0IDMyLWJpdC4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RMU19MRTIxTAlSX1BBUklTQ19UUFJFTDIxTAorI2RlZmluZSBSX1BBUklTQ19UTFNfTEUxNFIJUl9QQVJJU0NfVFBSRUwxNFIKKyNkZWZpbmUgUl9QQVJJU0NfVExTX0lFMjFMCVJfUEFSSVNDX0xUT0ZGX1RQMjFMCisjZGVmaW5lIFJfUEFSSVNDX1RMU19JRTE0UglSX1BBUklTQ19MVE9GRl9UUDE0UgorI2RlZmluZSBSX1BBUklTQ19UTFNfVFBSRUwzMglSX1BBUklTQ19UUFJFTDMyCisjZGVmaW5lIFJfUEFSSVNDX1RMU19UUFJFTDY0CVJfUEFSSVNDX1RQUkVMNjQKKyNkZWZpbmUgUl9QQVJJU0NfSElSRVNFUlZFCTI1NQorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHBfdHlwZSBmaWVsZCBvZiBFbGYzMl9QaGRyL0VsZjY0X1BoZHIuICAqLworCisjZGVmaW5lIFBUX0hQX1RMUwkJKFBUX0xPT1MgKyAweDApCisjZGVmaW5lIFBUX0hQX0NPUkVfTk9ORQkJKFBUX0xPT1MgKyAweDEpCisjZGVmaW5lIFBUX0hQX0NPUkVfVkVSU0lPTgkoUFRfTE9PUyArIDB4MikKKyNkZWZpbmUgUFRfSFBfQ09SRV9LRVJORUwJKFBUX0xPT1MgKyAweDMpCisjZGVmaW5lIFBUX0hQX0NPUkVfQ09NTQkJKFBUX0xPT1MgKyAweDQpCisjZGVmaW5lIFBUX0hQX0NPUkVfUFJPQwkJKFBUX0xPT1MgKyAweDUpCisjZGVmaW5lIFBUX0hQX0NPUkVfTE9BREFCTEUJKFBUX0xPT1MgKyAweDYpCisjZGVmaW5lIFBUX0hQX0NPUkVfU1RBQ0sJKFBUX0xPT1MgKyAweDcpCisjZGVmaW5lIFBUX0hQX0NPUkVfU0hNCQkoUFRfTE9PUyArIDB4OCkKKyNkZWZpbmUgUFRfSFBfQ09SRV9NTUYJCShQVF9MT09TICsgMHg5KQorI2RlZmluZSBQVF9IUF9QQVJBTExFTAkJKFBUX0xPT1MgKyAweDEwKQorI2RlZmluZSBQVF9IUF9GQVNUQklORAkJKFBUX0xPT1MgKyAweDExKQorI2RlZmluZSBQVF9IUF9PUFRfQU5OT1QJCShQVF9MT09TICsgMHgxMikKKyNkZWZpbmUgUFRfSFBfSFNMX0FOTk9UCQkoUFRfTE9PUyArIDB4MTMpCisjZGVmaW5lIFBUX0hQX1NUQUNLCQkoUFRfTE9PUyArIDB4MTQpCisKKyNkZWZpbmUgUFRfUEFSSVNDX0FSQ0hFWFQJMHg3MDAwMDAwMAorI2RlZmluZSBQVF9QQVJJU0NfVU5XSU5ECTB4NzAwMDAwMDEKKworLyogTGVnYWwgdmFsdWVzIGZvciBwX2ZsYWdzIGZpZWxkIG9mIEVsZjMyX1BoZHIvRWxmNjRfUGhkci4gICovCisKKyNkZWZpbmUgUEZfUEFSSVNDX1NCUAkJMHgwODAwMDAwMAorCisjZGVmaW5lIFBGX0hQX1BBR0VfU0laRQkJMHgwMDEwMDAwMAorI2RlZmluZSBQRl9IUF9GQVJfU0hBUkVECTB4MDAyMDAwMDAKKyNkZWZpbmUgUEZfSFBfTkVBUl9TSEFSRUQJMHgwMDQwMDAwMAorI2RlZmluZSBQRl9IUF9DT0RFCQkweDAxMDAwMDAwCisjZGVmaW5lIFBGX0hQX01PRElGWQkJMHgwMjAwMDAwMAorI2RlZmluZSBQRl9IUF9MQVpZU1dBUAkJMHgwNDAwMDAwMAorI2RlZmluZSBQRl9IUF9TQlAJCTB4MDgwMDAwMDAKKworCisvKiBBbHBoYSBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgZV9mbGFncyBmaWVsZCBvZiBFbGY2NF9FaGRyLiAgKi8KKworI2RlZmluZSBFRl9BTFBIQV8zMkJJVAkJMQkvKiBBbGwgYWRkcmVzc2VzIG11c3QgYmUgPCAyR0IuICAqLworI2RlZmluZSBFRl9BTFBIQV9DQU5SRUxBWAkyCS8qIFJlbG9jYXRpb25zIGZvciByZWxheGluZyBleGlzdC4gICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfdHlwZSBmaWVsZCBvZiBFbGY2NF9TaGRyLiAgKi8KKworLyogVGhlc2UgdHdvIGFyZSBwcmltZXJpbHkgY29uY2VybmVkIHdpdGggRUNPRkYgZGVidWdnaW5nIGluZm8uICAqLworI2RlZmluZSBTSFRfQUxQSEFfREVCVUcJCTB4NzAwMDAwMDEKKyNkZWZpbmUgU0hUX0FMUEhBX1JFR0lORk8JMHg3MDAwMDAwMgorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHNoX2ZsYWdzIGZpZWxkIG9mIEVsZjY0X1NoZHIuICAqLworCisjZGVmaW5lIFNIRl9BTFBIQV9HUFJFTAkJMHgxMDAwMDAwMAorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHN0X290aGVyIGZpZWxkIG9mIEVsZjY0X1N5bS4gICovCisjZGVmaW5lIFNUT19BTFBIQV9OT1BWCQkweDgwCS8qIE5vIFBWIHJlcXVpcmVkLiAgKi8KKyNkZWZpbmUgU1RPX0FMUEhBX1NURF9HUExPQUQJMHg4OAkvKiBQViBvbmx5IHVzZWQgZm9yIGluaXRpYWwgbGRncC4gICovCisKKy8qIEFscGhhIHJlbG9jcy4gICovCisKKyNkZWZpbmUgUl9BTFBIQV9OT05FCQkwCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfQUxQSEFfUkVGTE9ORwkJMQkvKiBEaXJlY3QgMzIgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfUkVGUVVBRAkJMgkvKiBEaXJlY3QgNjQgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfR1BSRUwzMgkJMwkvKiBHUCByZWxhdGl2ZSAzMiBiaXQgKi8KKyNkZWZpbmUgUl9BTFBIQV9MSVRFUkFMCQk0CS8qIEdQIHJlbGF0aXZlIDE2IGJpdCB3L29wdGltaXphdGlvbiAqLworI2RlZmluZSBSX0FMUEhBX0xJVFVTRQkJNQkvKiBPcHRpbWl6YXRpb24gaGludCBmb3IgTElURVJBTCAqLworI2RlZmluZSBSX0FMUEhBX0dQRElTUAkJNgkvKiBBZGQgZGlzcGxhY2VtZW50IHRvIEdQICovCisjZGVmaW5lIFJfQUxQSEFfQlJBRERSCQk3CS8qIFBDKzQgcmVsYXRpdmUgMjMgYml0IHNoaWZ0ZWQgKi8KKyNkZWZpbmUgUl9BTFBIQV9ISU5UCQk4CS8qIFBDKzQgcmVsYXRpdmUgMTYgYml0IHNoaWZ0ZWQgKi8KKyNkZWZpbmUgUl9BTFBIQV9TUkVMMTYJCTkJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfU1JFTDMyCQkxMAkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KKyNkZWZpbmUgUl9BTFBIQV9TUkVMNjQJCTExCS8qIFBDIHJlbGF0aXZlIDY0IGJpdCAqLworI2RlZmluZSBSX0FMUEhBX0dQUkVMSElHSAkxNwkvKiBHUCByZWxhdGl2ZSAzMiBiaXQsIGhpZ2ggMTYgYml0cyAqLworI2RlZmluZSBSX0FMUEhBX0dQUkVMTE9XCTE4CS8qIEdQIHJlbGF0aXZlIDMyIGJpdCwgbG93IDE2IGJpdHMgKi8KKyNkZWZpbmUgUl9BTFBIQV9HUFJFTDE2CQkxOQkvKiBHUCByZWxhdGl2ZSAxNiBiaXQgKi8KKyNkZWZpbmUgUl9BTFBIQV9DT1BZCQkyNAkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCisjZGVmaW5lIFJfQUxQSEFfR0xPQl9EQVQJMjUJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSX0FMUEhBX0pNUF9TTE9UCTI2CS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9BTFBIQV9SRUxBVElWRQkyNwkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfQUxQSEFfVExTX0dEX0hJCTI4CisjZGVmaW5lIFJfQUxQSEFfVExTR0QJCTI5CisjZGVmaW5lIFJfQUxQSEFfVExTX0xETQkJMzAKKyNkZWZpbmUgUl9BTFBIQV9EVFBNT0Q2NAkzMQorI2RlZmluZSBSX0FMUEhBX0dPVERUUFJFTAkzMgorI2RlZmluZSBSX0FMUEhBX0RUUFJFTDY0CTMzCisjZGVmaW5lIFJfQUxQSEFfRFRQUkVMSEkJMzQKKyNkZWZpbmUgUl9BTFBIQV9EVFBSRUxMTwkzNQorI2RlZmluZSBSX0FMUEhBX0RUUFJFTDE2CTM2CisjZGVmaW5lIFJfQUxQSEFfR09UVFBSRUwJMzcKKyNkZWZpbmUgUl9BTFBIQV9UUFJFTDY0CQkzOAorI2RlZmluZSBSX0FMUEhBX1RQUkVMSEkJCTM5CisjZGVmaW5lIFJfQUxQSEFfVFBSRUxMTwkJNDAKKyNkZWZpbmUgUl9BTFBIQV9UUFJFTDE2CQk0MQorLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9BTFBIQV9OVU0JCTQ2CisKKy8qIE1hZ2ljIHZhbHVlcyBvZiB0aGUgTElUVVNFIHJlbG9jYXRpb24gYWRkZW5kLiAgKi8KKyNkZWZpbmUgTElUVVNFX0FMUEhBX0FERFIJMAorI2RlZmluZSBMSVRVU0VfQUxQSEFfQkFTRQkxCisjZGVmaW5lIExJVFVTRV9BTFBIQV9CWVRPRkYJMgorI2RlZmluZSBMSVRVU0VfQUxQSEFfSlNSCTMKKyNkZWZpbmUgTElUVVNFX0FMUEhBX1RMU19HRAk0CisjZGVmaW5lIExJVFVTRV9BTFBIQV9UTFNfTERNCTUKKworLyogTGVnYWwgdmFsdWVzIGZvciBkX3RhZyBvZiBFbGY2NF9EeW4uICAqLworI2RlZmluZSBEVF9BTFBIQV9QTFRSTwkJKERUX0xPUFJPQyArIDApCisjZGVmaW5lIERUX0FMUEhBX05VTQkJMQorCisvKiBQb3dlclBDIHNwZWNpZmljIGRlY2xhcmF0aW9ucyAqLworCisvKiBWYWx1ZXMgZm9yIEVsZjMyLzY0X0VoZHIuZV9mbGFncy4gICovCisjZGVmaW5lIEVGX1BQQ19FTUIJCTB4ODAwMDAwMDAJLyogUG93ZXJQQyBlbWJlZGRlZCBmbGFnICovCisKKy8qIEN5Z251cyBsb2NhbCBiaXRzIGJlbG93ICovCisjZGVmaW5lIEVGX1BQQ19SRUxPQ0FUQUJMRQkweDAwMDEwMDAwCS8qIFBvd2VyUEMgLW1yZWxvY2F0YWJsZSBmbGFnKi8KKyNkZWZpbmUgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQgkweDAwMDA4MDAwCS8qIFBvd2VyUEMgLW1yZWxvY2F0YWJsZS1saWIKKwkJCQkJCSAgIGZsYWcgKi8KKworLyogUG93ZXJQQyByZWxvY2F0aW9ucyBkZWZpbmVkIGJ5IHRoZSBBQklzICovCisjZGVmaW5lIFJfUFBDX05PTkUJCTAKKyNkZWZpbmUgUl9QUENfQUREUjMyCQkxCS8qIDMyYml0IGFic29sdXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9QUENfQUREUjI0CQkyCS8qIDI2Yml0IGFkZHJlc3MsIDIgYml0cyBpZ25vcmVkLiAgKi8KKyNkZWZpbmUgUl9QUENfQUREUjE2CQkzCS8qIDE2Yml0IGFic29sdXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9QUENfQUREUjE2X0xPCQk0CS8qIGxvd2VyIDE2Yml0IG9mIGFic29sdXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9QUENfQUREUjE2X0hJCQk1CS8qIGhpZ2ggMTZiaXQgb2YgYWJzb2x1dGUgYWRkcmVzcyAqLworI2RlZmluZSBSX1BQQ19BRERSMTZfSEEJCTYJLyogYWRqdXN0ZWQgaGlnaCAxNmJpdCAqLworI2RlZmluZSBSX1BQQ19BRERSMTQJCTcJLyogMTZiaXQgYWRkcmVzcywgMiBiaXRzIGlnbm9yZWQgKi8KKyNkZWZpbmUgUl9QUENfQUREUjE0X0JSVEFLRU4JOAorI2RlZmluZSBSX1BQQ19BRERSMTRfQlJOVEFLRU4JOQorI2RlZmluZSBSX1BQQ19SRUwyNAkJMTAJLyogUEMgcmVsYXRpdmUgMjYgYml0ICovCisjZGVmaW5lIFJfUFBDX1JFTDE0CQkxMQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KKyNkZWZpbmUgUl9QUENfUkVMMTRfQlJUQUtFTgkxMgorI2RlZmluZSBSX1BQQ19SRUwxNF9CUk5UQUtFTgkxMworI2RlZmluZSBSX1BQQ19HT1QxNgkJMTQKKyNkZWZpbmUgUl9QUENfR09UMTZfTE8JCTE1CisjZGVmaW5lIFJfUFBDX0dPVDE2X0hJCQkxNgorI2RlZmluZSBSX1BQQ19HT1QxNl9IQQkJMTcKKyNkZWZpbmUgUl9QUENfUExUUkVMMjQJCTE4CisjZGVmaW5lIFJfUFBDX0NPUFkJCTE5CisjZGVmaW5lIFJfUFBDX0dMT0JfREFUCQkyMAorI2RlZmluZSBSX1BQQ19KTVBfU0xPVAkJMjEKKyNkZWZpbmUgUl9QUENfUkVMQVRJVkUJCTIyCisjZGVmaW5lIFJfUFBDX0xPQ0FMMjRQQwkJMjMKKyNkZWZpbmUgUl9QUENfVUFERFIzMgkJMjQKKyNkZWZpbmUgUl9QUENfVUFERFIxNgkJMjUKKyNkZWZpbmUgUl9QUENfUkVMMzIJCTI2CisjZGVmaW5lIFJfUFBDX1BMVDMyCQkyNworI2RlZmluZSBSX1BQQ19QTFRSRUwzMgkJMjgKKyNkZWZpbmUgUl9QUENfUExUMTZfTE8JCTI5CisjZGVmaW5lIFJfUFBDX1BMVDE2X0hJCQkzMAorI2RlZmluZSBSX1BQQ19QTFQxNl9IQQkJMzEKKyNkZWZpbmUgUl9QUENfU0RBUkVMMTYJCTMyCisjZGVmaW5lIFJfUFBDX1NFQ1RPRkYJCTMzCisjZGVmaW5lIFJfUFBDX1NFQ1RPRkZfTE8JMzQKKyNkZWZpbmUgUl9QUENfU0VDVE9GRl9ISQkzNQorI2RlZmluZSBSX1BQQ19TRUNUT0ZGX0hBCTM2CisKKy8qIFBvd2VyUEMgcmVsb2NhdGlvbnMgZGVmaW5lZCBmb3IgdGhlIFRMUyBhY2Nlc3MgQUJJLiAgKi8KKyNkZWZpbmUgUl9QUENfVExTCQk2NyAvKiBub25lCShzeW0rYWRkKUB0bHMgKi8KKyNkZWZpbmUgUl9QUENfRFRQTU9EMzIJCTY4IC8qIHdvcmQzMgkoc3ltK2FkZClAZHRwbW9kICovCisjZGVmaW5lIFJfUFBDX1RQUkVMMTYJCTY5IC8qIGhhbGYxNioJKHN5bSthZGQpQHRwcmVsICovCisjZGVmaW5lIFJfUFBDX1RQUkVMMTZfTE8JNzAgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBsICovCisjZGVmaW5lIFJfUFBDX1RQUkVMMTZfSEkJNzEgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBoICovCisjZGVmaW5lIFJfUFBDX1RQUkVMMTZfSEEJNzIgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBoYSAqLworI2RlZmluZSBSX1BQQ19UUFJFTDMyCQk3MyAvKiB3b3JkMzIJKHN5bSthZGQpQHRwcmVsICovCisjZGVmaW5lIFJfUFBDX0RUUFJFTDE2CQk3NCAvKiBoYWxmMTYqCShzeW0rYWRkKUBkdHByZWwgKi8KKyNkZWZpbmUgUl9QUENfRFRQUkVMMTZfTE8JNzUgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAbCAqLworI2RlZmluZSBSX1BQQ19EVFBSRUwxNl9ISQk3NiAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoICovCisjZGVmaW5lIFJfUFBDX0RUUFJFTDE2X0hBCTc3IC8qIGhhbGYxNgkoc3ltK2FkZClAZHRwcmVsQGhhICovCisjZGVmaW5lIFJfUFBDX0RUUFJFTDMyCQk3OCAvKiB3b3JkMzIJKHN5bSthZGQpQGR0cHJlbCAqLworI2RlZmluZSBSX1BQQ19HT1RfVExTR0QxNgk3OSAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAdGxzZ2QgKi8KKyNkZWZpbmUgUl9QUENfR09UX1RMU0dEMTZfTE8JODAgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzZ2RAbCAqLworI2RlZmluZSBSX1BQQ19HT1RfVExTR0QxNl9ISQk4MSAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNnZEBoICovCisjZGVmaW5lIFJfUFBDX0dPVF9UTFNHRDE2X0hBCTgyIC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2dkQGhhICovCisjZGVmaW5lIFJfUFBDX0dPVF9UTFNMRDE2CTgzIC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEB0bHNsZCAqLworI2RlZmluZSBSX1BQQ19HT1RfVExTTEQxNl9MTwk4NCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNsZEBsICovCisjZGVmaW5lIFJfUFBDX0dPVF9UTFNMRDE2X0hJCTg1IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2xkQGggKi8KKyNkZWZpbmUgUl9QUENfR09UX1RMU0xEMTZfSEEJODYgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzbGRAaGEgKi8KKyNkZWZpbmUgUl9QUENfR09UX1RQUkVMMTYJODcgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QHRwcmVsICovCisjZGVmaW5lIFJfUFBDX0dPVF9UUFJFTDE2X0xPCTg4IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRwcmVsQGwgKi8KKyNkZWZpbmUgUl9QUENfR09UX1RQUkVMMTZfSEkJODkgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdHByZWxAaCAqLworI2RlZmluZSBSX1BQQ19HT1RfVFBSRUwxNl9IQQk5MCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0cHJlbEBoYSAqLworI2RlZmluZSBSX1BQQ19HT1RfRFRQUkVMMTYJOTEgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QGR0cHJlbCAqLworI2RlZmluZSBSX1BQQ19HT1RfRFRQUkVMMTZfTE8JOTIgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QGR0cHJlbEBsICovCisjZGVmaW5lIFJfUFBDX0dPVF9EVFBSRUwxNl9ISQk5MyAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAZHRwcmVsQGggKi8KKyNkZWZpbmUgUl9QUENfR09UX0RUUFJFTDE2X0hBCTk0IC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEBkdHByZWxAaGEgKi8KKworLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGZyb20gdGhlIEVtYmVkZGVkIEVMRiBBQkksIGFuZCBhcmUgbm90CisgICBpbiB0aGUgU1ZSNCBFTEYgQUJJLiAgKi8KKyNkZWZpbmUgUl9QUENfRU1CX05BRERSMzIJMTAxCisjZGVmaW5lIFJfUFBDX0VNQl9OQUREUjE2CTEwMgorI2RlZmluZSBSX1BQQ19FTUJfTkFERFIxNl9MTwkxMDMKKyNkZWZpbmUgUl9QUENfRU1CX05BRERSMTZfSEkJMTA0CisjZGVmaW5lIFJfUFBDX0VNQl9OQUREUjE2X0hBCTEwNQorI2RlZmluZSBSX1BQQ19FTUJfU0RBSTE2CTEwNgorI2RlZmluZSBSX1BQQ19FTUJfU0RBMkkxNgkxMDcKKyNkZWZpbmUgUl9QUENfRU1CX1NEQTJSRUwJMTA4CisjZGVmaW5lIFJfUFBDX0VNQl9TREEyMQkJMTA5CS8qIDE2IGJpdCBvZmZzZXQgaW4gU0RBICovCisjZGVmaW5lIFJfUFBDX0VNQl9NUktSRUYJMTEwCisjZGVmaW5lIFJfUFBDX0VNQl9SRUxTRUMxNgkxMTEKKyNkZWZpbmUgUl9QUENfRU1CX1JFTFNUX0xPCTExMgorI2RlZmluZSBSX1BQQ19FTUJfUkVMU1RfSEkJMTEzCisjZGVmaW5lIFJfUFBDX0VNQl9SRUxTVF9IQQkxMTQKKyNkZWZpbmUgUl9QUENfRU1CX0JJVF9GTEQJMTE1CisjZGVmaW5lIFJfUFBDX0VNQl9SRUxTREEJMTE2CS8qIDE2IGJpdCByZWxhdGl2ZSBvZmZzZXQgaW4gU0RBICovCisKKy8qIERpYWIgdG9vbCByZWxvY2F0aW9ucy4gICovCisjZGVmaW5lIFJfUFBDX0RJQUJfU0RBMjFfTE8JMTgwCS8qIGxpa2UgRU1CX1NEQTIxLCBidXQgbG93ZXIgMTYgYml0ICovCisjZGVmaW5lIFJfUFBDX0RJQUJfU0RBMjFfSEkJMTgxCS8qIGxpa2UgRU1CX1NEQTIxLCBidXQgaGlnaCAxNiBiaXQgKi8KKyNkZWZpbmUgUl9QUENfRElBQl9TREEyMV9IQQkxODIJLyogbGlrZSBFTUJfU0RBMjEsIGFkanVzdGVkIGhpZ2ggMTYgKi8KKyNkZWZpbmUgUl9QUENfRElBQl9SRUxTREFfTE8JMTgzCS8qIGxpa2UgRU1CX1JFTFNEQSwgYnV0IGxvd2VyIDE2IGJpdCAqLworI2RlZmluZSBSX1BQQ19ESUFCX1JFTFNEQV9ISQkxODQJLyogbGlrZSBFTUJfUkVMU0RBLCBidXQgaGlnaCAxNiBiaXQgKi8KKyNkZWZpbmUgUl9QUENfRElBQl9SRUxTREFfSEEJMTg1CS8qIGxpa2UgRU1CX1JFTFNEQSwgYWRqdXN0ZWQgaGlnaCAxNiAqLworCisvKiBHTlUgZXh0ZW5zaW9uIHRvIHN1cHBvcnQgbG9jYWwgaWZ1bmMuICAqLworI2RlZmluZSBSX1BQQ19JUkVMQVRJVkUJCTI0OAorCisvKiBHTlUgcmVsb2NzIHVzZWQgaW4gUElDIGNvZGUgc2VxdWVuY2VzLiAgKi8KKyNkZWZpbmUgUl9QUENfUkVMMTYJCTI0OQkvKiBoYWxmMTYgICAoc3ltK2FkZC0uKSAqLworI2RlZmluZSBSX1BQQ19SRUwxNl9MTwkJMjUwCS8qIGhhbGYxNiAgIChzeW0rYWRkLS4pQGwgKi8KKyNkZWZpbmUgUl9QUENfUkVMMTZfSEkJCTI1MQkvKiBoYWxmMTYgICAoc3ltK2FkZC0uKUBoICovCisjZGVmaW5lIFJfUFBDX1JFTDE2X0hBCQkyNTIJLyogaGFsZjE2ICAgKHN5bSthZGQtLilAaGEgKi8KKworLyogVGhpcyBpcyBhIHBob255IHJlbG9jIHRvIGhhbmRsZSBhbnkgb2xkIGZhc2hpb25lZCBUT0MxNiByZWZlcmVuY2VzCisgICB0aGF0IG1heSBzdGlsbCBiZSBpbiBvYmplY3QgZmlsZXMuICAqLworI2RlZmluZSBSX1BQQ19UT0MxNgkJMjU1CisKKy8qIFBvd2VyUEMgc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgRHluIGRfdGFnIGZpZWxkLiAgKi8KKyNkZWZpbmUgRFRfUFBDX0dPVAkJKERUX0xPUFJPQyArIDApCisjZGVmaW5lIERUX1BQQ19OVU0JCTEKKworLyogUG93ZXJQQzY0IHJlbG9jYXRpb25zIGRlZmluZWQgYnkgdGhlIEFCSXMgKi8KKyNkZWZpbmUgUl9QUEM2NF9OT05FCQlSX1BQQ19OT05FCisjZGVmaW5lIFJfUFBDNjRfQUREUjMyCQlSX1BQQ19BRERSMzIgLyogMzJiaXQgYWJzb2x1dGUgYWRkcmVzcyAqLworI2RlZmluZSBSX1BQQzY0X0FERFIyNAkJUl9QUENfQUREUjI0IC8qIDI2Yml0IGFkZHJlc3MsIHdvcmQgYWxpZ25lZCAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNgkJUl9QUENfQUREUjE2IC8qIDE2Yml0IGFic29sdXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTZfTE8JUl9QUENfQUREUjE2X0xPCS8qIGxvd2VyIDE2Yml0cyBvZiBhZGRyZXNzICovCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0hJCVJfUFBDX0FERFIxNl9ISQkvKiBoaWdoIDE2Yml0cyBvZiBhZGRyZXNzLiAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNl9IQQlSX1BQQ19BRERSMTZfSEEgLyogYWRqdXN0ZWQgaGlnaCAxNmJpdHMuICAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNAkJUl9QUENfQUREUjE0IC8qIDE2Yml0IGFkZHJlc3MsIHdvcmQgYWxpZ25lZCAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNF9CUlRBS0VOCVJfUFBDX0FERFIxNF9CUlRBS0VOCisjZGVmaW5lIFJfUFBDNjRfQUREUjE0X0JSTlRBS0VOCVJfUFBDX0FERFIxNF9CUk5UQUtFTgorI2RlZmluZSBSX1BQQzY0X1JFTDI0CQlSX1BQQ19SRUwyNCAvKiBQQy1yZWwuIDI2IGJpdCwgd29yZCBhbGlnbmVkICovCisjZGVmaW5lIFJfUFBDNjRfUkVMMTQJCVJfUFBDX1JFTDE0IC8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLworI2RlZmluZSBSX1BQQzY0X1JFTDE0X0JSVEFLRU4JUl9QUENfUkVMMTRfQlJUQUtFTgorI2RlZmluZSBSX1BQQzY0X1JFTDE0X0JSTlRBS0VOCVJfUFBDX1JFTDE0X0JSTlRBS0VOCisjZGVmaW5lIFJfUFBDNjRfR09UMTYJCVJfUFBDX0dPVDE2CisjZGVmaW5lIFJfUFBDNjRfR09UMTZfTE8JUl9QUENfR09UMTZfTE8KKyNkZWZpbmUgUl9QUEM2NF9HT1QxNl9ISQlSX1BQQ19HT1QxNl9ISQorI2RlZmluZSBSX1BQQzY0X0dPVDE2X0hBCVJfUFBDX0dPVDE2X0hBCisKKyNkZWZpbmUgUl9QUEM2NF9DT1BZCQlSX1BQQ19DT1BZCisjZGVmaW5lIFJfUFBDNjRfR0xPQl9EQVQJUl9QUENfR0xPQl9EQVQKKyNkZWZpbmUgUl9QUEM2NF9KTVBfU0xPVAlSX1BQQ19KTVBfU0xPVAorI2RlZmluZSBSX1BQQzY0X1JFTEFUSVZFCVJfUFBDX1JFTEFUSVZFCisKKyNkZWZpbmUgUl9QUEM2NF9VQUREUjMyCQlSX1BQQ19VQUREUjMyCisjZGVmaW5lIFJfUFBDNjRfVUFERFIxNgkJUl9QUENfVUFERFIxNgorI2RlZmluZSBSX1BQQzY0X1JFTDMyCQlSX1BQQ19SRUwzMgorI2RlZmluZSBSX1BQQzY0X1BMVDMyCQlSX1BQQ19QTFQzMgorI2RlZmluZSBSX1BQQzY0X1BMVFJFTDMyCVJfUFBDX1BMVFJFTDMyCisjZGVmaW5lIFJfUFBDNjRfUExUMTZfTE8JUl9QUENfUExUMTZfTE8KKyNkZWZpbmUgUl9QUEM2NF9QTFQxNl9ISQlSX1BQQ19QTFQxNl9ISQorI2RlZmluZSBSX1BQQzY0X1BMVDE2X0hBCVJfUFBDX1BMVDE2X0hBCisKKyNkZWZpbmUgUl9QUEM2NF9TRUNUT0ZGCQlSX1BQQ19TRUNUT0ZGCisjZGVmaW5lIFJfUFBDNjRfU0VDVE9GRl9MTwlSX1BQQ19TRUNUT0ZGX0xPCisjZGVmaW5lIFJfUFBDNjRfU0VDVE9GRl9ISQlSX1BQQ19TRUNUT0ZGX0hJCisjZGVmaW5lIFJfUFBDNjRfU0VDVE9GRl9IQQlSX1BQQ19TRUNUT0ZGX0hBCisjZGVmaW5lIFJfUFBDNjRfQUREUjMwCQkzNyAvKiB3b3JkMzAgKFMgKyBBIC0gUCkgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X0FERFI2NAkJMzggLyogZG91Ymxld29yZDY0IFMgKyBBICovCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0hJR0hFUgkzOSAvKiBoYWxmMTYgI2hpZ2hlcihTICsgQSkgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTZfSElHSEVSQQk0MCAvKiBoYWxmMTYgI2hpZ2hlcmEoUyArIEEpICovCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0hJR0hFU1QJNDEgLyogaGFsZjE2ICNoaWdoZXN0KFMgKyBBKSAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNl9ISUdIRVNUQQk0MiAvKiBoYWxmMTYgI2hpZ2hlc3RhKFMgKyBBKSAqLworI2RlZmluZSBSX1BQQzY0X1VBRERSNjQJCTQzIC8qIGRvdWJsZXdvcmQ2NCBTICsgQSAqLworI2RlZmluZSBSX1BQQzY0X1JFTDY0CQk0NCAvKiBkb3VibGV3b3JkNjQgUyArIEEgLSBQICovCisjZGVmaW5lIFJfUFBDNjRfUExUNjQJCTQ1IC8qIGRvdWJsZXdvcmQ2NCBMICsgQSAqLworI2RlZmluZSBSX1BQQzY0X1BMVFJFTDY0CTQ2IC8qIGRvdWJsZXdvcmQ2NCBMICsgQSAtIFAgKi8KKyNkZWZpbmUgUl9QUEM2NF9UT0MxNgkJNDcgLyogaGFsZjE2KiBTICsgQSAtIC5UT0MgKi8KKyNkZWZpbmUgUl9QUEM2NF9UT0MxNl9MTwk0OCAvKiBoYWxmMTYgI2xvKFMgKyBBIC0gLlRPQy4pICovCisjZGVmaW5lIFJfUFBDNjRfVE9DMTZfSEkJNDkgLyogaGFsZjE2ICNoaShTICsgQSAtIC5UT0MuKSAqLworI2RlZmluZSBSX1BQQzY0X1RPQzE2X0hBCTUwIC8qIGhhbGYxNiAjaGEoUyArIEEgLSAuVE9DLikgKi8KKyNkZWZpbmUgUl9QUEM2NF9UT0MJCTUxIC8qIGRvdWJsZXdvcmQ2NCAuVE9DICovCisjZGVmaW5lIFJfUFBDNjRfUExUR09UMTYJNTIgLyogaGFsZjE2KiBNICsgQSAqLworI2RlZmluZSBSX1BQQzY0X1BMVEdPVDE2X0xPCTUzIC8qIGhhbGYxNiAjbG8oTSArIEEpICovCisjZGVmaW5lIFJfUFBDNjRfUExUR09UMTZfSEkJNTQgLyogaGFsZjE2ICNoaShNICsgQSkgKi8KKyNkZWZpbmUgUl9QUEM2NF9QTFRHT1QxNl9IQQk1NSAvKiBoYWxmMTYgI2hhKE0gKyBBKSAqLworCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0RTCTU2IC8qIGhhbGYxNmRzKiAoUyArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTZfTE9fRFMJNTcgLyogaGFsZjE2ZHMgICNsbyhTICsgQSkgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X0dPVDE2X0RTCTU4IC8qIGhhbGYxNmRzKiAoRyArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1QxNl9MT19EUwk1OSAvKiBoYWxmMTZkcyAgI2xvKEcgKyBBKSA+PiAyICovCisjZGVmaW5lIFJfUFBDNjRfUExUMTZfTE9fRFMJNjAgLyogaGFsZjE2ZHMgICNsbyhMICsgQSkgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X1NFQ1RPRkZfRFMJNjEgLyogaGFsZjE2ZHMqIChSICsgQSkgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X1NFQ1RPRkZfTE9fRFMJNjIgLyogaGFsZjE2ZHMgICNsbyhSICsgQSkgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X1RPQzE2X0RTCTYzIC8qIGhhbGYxNmRzKiAoUyArIEEgLSAuVE9DLikgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X1RPQzE2X0xPX0RTCTY0IC8qIGhhbGYxNmRzICAjbG8oUyArIEEgLSAuVE9DLikgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X1BMVEdPVDE2X0RTCTY1IC8qIGhhbGYxNmRzKiAoTSArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9QTFRHT1QxNl9MT19EUwk2NiAvKiBoYWxmMTZkcyAgI2xvKE0gKyBBKSA+PiAyICovCisKKy8qIFBvd2VyUEM2NCByZWxvY2F0aW9ucyBkZWZpbmVkIGZvciB0aGUgVExTIGFjY2VzcyBBQkkuICAqLworI2RlZmluZSBSX1BQQzY0X1RMUwkJNjcgLyogbm9uZQkoc3ltK2FkZClAdGxzICovCisjZGVmaW5lIFJfUFBDNjRfRFRQTU9ENjQJNjggLyogZG91Ymxld29yZDY0IChzeW0rYWRkKUBkdHBtb2QgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2CQk2OSAvKiBoYWxmMTYqCShzeW0rYWRkKUB0cHJlbCAqLworI2RlZmluZSBSX1BQQzY0X1RQUkVMMTZfTE8JNzAgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBsICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9ISQk3MSAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGggKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0hBCTcyIC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDY0CQk3MyAvKiBkb3VibGV3b3JkNjQgKHN5bSthZGQpQHRwcmVsICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTYJNzQgLyogaGFsZjE2Kgkoc3ltK2FkZClAZHRwcmVsICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfTE8JNzUgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAbCAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2X0hJCTc2IC8qIGhhbGYxNgkoc3ltK2FkZClAZHRwcmVsQGggKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9IQQk3NyAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoYSAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDY0CTc4IC8qIGRvdWJsZXdvcmQ2NCAoc3ltK2FkZClAZHRwcmVsICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RMU0dEMTYJNzkgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QHRsc2dkICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RMU0dEMTZfTE8JODAgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzZ2RAbCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNHRDE2X0hJCTgxIC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2dkQGggKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVExTR0QxNl9IQQk4MiAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNnZEBoYSAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNMRDE2CTgzIC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEB0bHNsZCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNMRDE2X0xPCTg0IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2xkQGwgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVExTTEQxNl9ISQk4NSAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNsZEBoICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RMU0xEMTZfSEEJODYgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzbGRAaGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVFBSRUwxNl9EUwk4NyAvKiBoYWxmMTZkcyoJKHN5bSthZGQpQGdvdEB0cHJlbCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UUFJFTDE2X0xPX0RTIDg4IC8qIGhhbGYxNmRzIChzeW0rYWRkKUBnb3RAdHByZWxAbCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UUFJFTDE2X0hJCTg5IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRwcmVsQGggKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVFBSRUwxNl9IQQk5MCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0cHJlbEBoYSAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9EVFBSRUwxNl9EUwk5MSAvKiBoYWxmMTZkcyoJKHN5bSthZGQpQGdvdEBkdHByZWwgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfRFRQUkVMMTZfTE9fRFMgOTIgLyogaGFsZjE2ZHMgKHN5bSthZGQpQGdvdEBkdHByZWxAbCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9EVFBSRUwxNl9ISQk5MyAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEBkdHByZWxAaCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9EVFBSRUwxNl9IQQk5NCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEBkdHByZWxAaGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0RTCTk1IC8qIGhhbGYxNmRzKgkoc3ltK2FkZClAdHByZWwgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0xPX0RTCTk2IC8qIGhhbGYxNmRzCShzeW0rYWRkKUB0cHJlbEBsICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9ISUdIRVIJOTcgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBoaWdoZXIgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0hJR0hFUkEJOTggLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBoaWdoZXJhICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9ISUdIRVNUCTk5IC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGlnaGVzdCAqLworI2RlZmluZSBSX1BQQzY0X1RQUkVMMTZfSElHSEVTVEEgMTAwIC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGlnaGVzdGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9EUwkxMDEgLyogaGFsZjE2ZHMqIChzeW0rYWRkKUBkdHByZWwgKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9MT19EUwkxMDIgLyogaGFsZjE2ZHMJKHN5bSthZGQpQGR0cHJlbEBsICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfSElHSEVSCTEwMyAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoaWdoZXIgKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9ISUdIRVJBIDEwNCAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoaWdoZXJhICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfSElHSEVTVCAxMDUgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaGlnaGVzdCAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2X0hJR0hFU1RBIDEwNiAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoaWdoZXN0YSAqLworCisvKiBHTlUgZXh0ZW5zaW9uIHRvIHN1cHBvcnQgbG9jYWwgaWZ1bmMuICAqLworI2RlZmluZSBSX1BQQzY0X0pNUF9JUkVMCTI0NworI2RlZmluZSBSX1BQQzY0X0lSRUxBVElWRQkyNDgKKyNkZWZpbmUgUl9QUEM2NF9SRUwxNgkJMjQ5CS8qIGhhbGYxNiAgIChzeW0rYWRkLS4pICovCisjZGVmaW5lIFJfUFBDNjRfUkVMMTZfTE8JMjUwCS8qIGhhbGYxNiAgIChzeW0rYWRkLS4pQGwgKi8KKyNkZWZpbmUgUl9QUEM2NF9SRUwxNl9ISQkyNTEJLyogaGFsZjE2ICAgKHN5bSthZGQtLilAaCAqLworI2RlZmluZSBSX1BQQzY0X1JFTDE2X0hBCTI1MgkvKiBoYWxmMTYgICAoc3ltK2FkZC0uKUBoYSAqLworCisvKiBQb3dlclBDNjQgc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgRHluIGRfdGFnIGZpZWxkLiAgKi8KKyNkZWZpbmUgRFRfUFBDNjRfR0xJTksgIChEVF9MT1BST0MgKyAwKQorI2RlZmluZSBEVF9QUEM2NF9PUEQJKERUX0xPUFJPQyArIDEpCisjZGVmaW5lIERUX1BQQzY0X09QRFNaCShEVF9MT1BST0MgKyAyKQorI2RlZmluZSBEVF9QUEM2NF9OVU0gICAgMworCisKKy8qIEFSTSBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KKyNkZWZpbmUgRUZfQVJNX1JFTEVYRUMJCTB4MDEKKyNkZWZpbmUgRUZfQVJNX0hBU0VOVFJZCQkweDAyCisjZGVmaW5lIEVGX0FSTV9JTlRFUldPUksJMHgwNAorI2RlZmluZSBFRl9BUk1fQVBDU18yNgkJMHgwOAorI2RlZmluZSBFRl9BUk1fQVBDU19GTE9BVAkweDEwCisjZGVmaW5lIEVGX0FSTV9QSUMJCTB4MjAKKyNkZWZpbmUgRUZfQVJNX0FMSUdOOAkJMHg0MCAvKiA4LWJpdCBzdHJ1Y3R1cmUgYWxpZ25tZW50IGlzIGluIHVzZSAqLworI2RlZmluZSBFRl9BUk1fTkVXX0FCSQkJMHg4MAorI2RlZmluZSBFRl9BUk1fT0xEX0FCSQkJMHgxMDAKKyNkZWZpbmUgRUZfQVJNX1NPRlRfRkxPQVQJMHgyMDAKKyNkZWZpbmUgRUZfQVJNX1ZGUF9GTE9BVAkweDQwMAorI2RlZmluZSBFRl9BUk1fTUFWRVJJQ0tfRkxPQVQJMHg4MDAKKworCisvKiBPdGhlciBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGUgQVJNIEVMRiBzcGVjLiB2ZXJzaW9uIEItMDEuICAqLworLyogTkIuIFRoZXNlIGNvbmZsaWN0IHdpdGggdmFsdWVzIGRlZmluZWQgYWJvdmUuICAqLworI2RlZmluZSBFRl9BUk1fU1lNU0FSRVNPUlRFRAkweDA0CisjZGVmaW5lIEVGX0FSTV9EWU5TWU1TVVNFU0VHSURYCTB4MDgKKyNkZWZpbmUgRUZfQVJNX01BUFNZTVNGSVJTVAkweDEwCisjZGVmaW5lIEVGX0FSTV9FQUJJTUFTSwkJMFhGRjAwMDAwMAorCisvKiBDb25zdGFudHMgZGVmaW5lZCBpbiBBQUVMRi4gICovCisjZGVmaW5lIEVGX0FSTV9CRTgJICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgRUZfQVJNX0xFOAkgICAgMHgwMDQwMDAwMAorCisjZGVmaW5lIEVGX0FSTV9FQUJJX1ZFUlNJT04oZmxhZ3MpCSgoZmxhZ3MpICYgRUZfQVJNX0VBQklNQVNLKQorI2RlZmluZSBFRl9BUk1fRUFCSV9VTktOT1dOCTB4MDAwMDAwMDAKKyNkZWZpbmUgRUZfQVJNX0VBQklfVkVSMQkweDAxMDAwMDAwCisjZGVmaW5lIEVGX0FSTV9FQUJJX1ZFUjIJMHgwMjAwMDAwMAorI2RlZmluZSBFRl9BUk1fRUFCSV9WRVIzCTB4MDMwMDAwMDAKKyNkZWZpbmUgRUZfQVJNX0VBQklfVkVSNAkweDA0MDAwMDAwCisjZGVmaW5lIEVGX0FSTV9FQUJJX1ZFUjUJMHgwNTAwMDAwMAorCisvKiBBZGRpdGlvbmFsIHN5bWJvbCB0eXBlcyBmb3IgVGh1bWIuICAqLworI2RlZmluZSBTVFRfQVJNX1RGVU5DCQlTVFRfTE9QUk9DIC8qIEEgVGh1bWIgZnVuY3Rpb24uICAqLworI2RlZmluZSBTVFRfQVJNXzE2QklUCQlTVFRfSElQUk9DIC8qIEEgVGh1bWIgbGFiZWwuICAqLworCisvKiBBUk0tc3BlY2lmaWMgdmFsdWVzIGZvciBzaF9mbGFncyAqLworI2RlZmluZSBTSEZfQVJNX0VOVFJZU0VDVAkweDEwMDAwMDAwIC8qIFNlY3Rpb24gY29udGFpbnMgYW4gZW50cnkgcG9pbnQgKi8KKyNkZWZpbmUgU0hGX0FSTV9DT01ERUYJCTB4ODAwMDAwMDAgLyogU2VjdGlvbiBtYXkgYmUgbXVsdGlwbHkgZGVmaW5lZAorCQkJCQkgICAgICBpbiB0aGUgaW5wdXQgdG8gYSBsaW5rIHN0ZXAuICAqLworCisvKiBBUk0tc3BlY2lmaWMgcHJvZ3JhbSBoZWFkZXIgZmxhZ3MgKi8KKyNkZWZpbmUgUEZfQVJNX1NCCQkweDEwMDAwMDAwIC8qIFNlZ21lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uCisJCQkJCSAgICAgIGFkZHJlc3NlZCBieSB0aGUgc3RhdGljIGJhc2UuICovCisjZGVmaW5lIFBGX0FSTV9QSQkJMHgyMDAwMDAwMCAvKiBQb3NpdGlvbi1pbmRlcGVuZGVudCBzZWdtZW50LiAgKi8KKyNkZWZpbmUgUEZfQVJNX0FCUwkJMHg0MDAwMDAwMCAvKiBBYnNvbHV0ZSBzZWdtZW50LiAgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIFBoZHIgcF90eXBlIGZpZWxkLiAgKi8KKyNkZWZpbmUgUFRfQVJNX0VYSURYCQkoUFRfTE9QUk9DICsgMSkJLyogQVJNIHVud2luZCBzZWdtZW50LiAgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIFNoZHIgc2hfdHlwZSBmaWVsZC4gICovCisjZGVmaW5lIFNIVF9BUk1fRVhJRFgJCShTSFRfTE9QUk9DICsgMSkgLyogQVJNIHVud2luZCBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgU0hUX0FSTV9QUkVFTVBUTUFQCShTSFRfTE9QUk9DICsgMikgLyogUHJlZW1wdGlvbiBkZXRhaWxzLiAgKi8KKyNkZWZpbmUgU0hUX0FSTV9BVFRSSUJVVEVTCShTSFRfTE9QUk9DICsgMykgLyogQVJNIGF0dHJpYnV0ZXMgc2VjdGlvbi4gICovCisKKworLyogQVJNIHJlbG9jcy4gICovCisKKyNkZWZpbmUgUl9BUk1fTk9ORQkJMAkvKiBObyByZWxvYyAqLworI2RlZmluZSBSX0FSTV9QQzI0CQkxCS8qIFBDIHJlbGF0aXZlIDI2IGJpdCBicmFuY2ggKi8KKyNkZWZpbmUgUl9BUk1fQUJTMzIJCTIJLyogRGlyZWN0IDMyIGJpdCAgKi8KKyNkZWZpbmUgUl9BUk1fUkVMMzIJCTMJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCisjZGVmaW5lIFJfQVJNX1BDMTMJCTQKKyNkZWZpbmUgUl9BUk1fQUJTMTYJCTUJLyogRGlyZWN0IDE2IGJpdCAqLworI2RlZmluZSBSX0FSTV9BQlMxMgkJNgkvKiBEaXJlY3QgMTIgYml0ICovCisjZGVmaW5lIFJfQVJNX1RITV9BQlM1CQk3CisjZGVmaW5lIFJfQVJNX0FCUzgJCTgJLyogRGlyZWN0IDggYml0ICovCisjZGVmaW5lIFJfQVJNX1NCUkVMMzIJCTkKKyNkZWZpbmUgUl9BUk1fVEhNX1BDMjIJCTEwCisjZGVmaW5lIFJfQVJNX1RITV9QQzgJCTExCisjZGVmaW5lIFJfQVJNX0FNUF9WQ0FMTDkJMTIKKyNkZWZpbmUgUl9BUk1fU1dJMjQJCTEzCS8qIE9ic29sZXRlIHN0YXRpYyByZWxvY2F0aW9uLiAgKi8KKyNkZWZpbmUgUl9BUk1fVExTX0RFU0MJCTEzICAgICAgLyogRHluYW1pYyByZWxvY2F0aW9uLiAgKi8KKyNkZWZpbmUgUl9BUk1fVEhNX1NXSTgJCTE0CisjZGVmaW5lIFJfQVJNX1hQQzI1CQkxNQorI2RlZmluZSBSX0FSTV9USE1fWFBDMjIJCTE2CisjZGVmaW5lIFJfQVJNX1RMU19EVFBNT0QzMgkxNwkvKiBJRCBvZiBtb2R1bGUgY29udGFpbmluZyBzeW1ib2wgKi8KKyNkZWZpbmUgUl9BUk1fVExTX0RUUE9GRjMyCTE4CS8qIE9mZnNldCBpbiBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl9BUk1fVExTX1RQT0ZGMzIJMTkJLyogT2Zmc2V0IGluIHN0YXRpYyBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl9BUk1fQ09QWQkJMjAJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSX0FSTV9HTE9CX0RBVAkJMjEJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSX0FSTV9KVU1QX1NMT1QJCTIyCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9BUk1fUkVMQVRJVkUJCTIzCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KKyNkZWZpbmUgUl9BUk1fR09UT0ZGCQkyNAkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSX0FSTV9HT1RQQwkJMjUJLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9BUk1fR09UMzIJCTI2CS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9BUk1fUExUMzIJCTI3CS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLworI2RlZmluZSBSX0FSTV9BTFVfUENSRUxfN18wCTMyCisjZGVmaW5lIFJfQVJNX0FMVV9QQ1JFTF8xNV84CTMzCisjZGVmaW5lIFJfQVJNX0FMVV9QQ1JFTF8yM18xNQkzNAorI2RlZmluZSBSX0FSTV9MRFJfU0JSRUxfMTFfMAkzNQorI2RlZmluZSBSX0FSTV9BTFVfU0JSRUxfMTlfMTIJMzYKKyNkZWZpbmUgUl9BUk1fQUxVX1NCUkVMXzI3XzIwCTM3CisjZGVmaW5lIFJfQVJNX1RMU19HT1RERVNDCTkwCisjZGVmaW5lIFJfQVJNX1RMU19DQUxMCQk5MQorI2RlZmluZSBSX0FSTV9UTFNfREVTQ1NFUQk5MgorI2RlZmluZSBSX0FSTV9USE1fVExTX0NBTEwJOTMKKyNkZWZpbmUgUl9BUk1fR05VX1ZURU5UUlkJMTAwCisjZGVmaW5lIFJfQVJNX0dOVV9WVElOSEVSSVQJMTAxCisjZGVmaW5lIFJfQVJNX1RITV9QQzExCQkxMDIJLyogdGh1bWIgdW5jb25kaXRpb25hbCBicmFuY2ggKi8KKyNkZWZpbmUgUl9BUk1fVEhNX1BDOQkJMTAzCS8qIHRodW1iIGNvbmRpdGlvbmFsIGJyYW5jaCAqLworI2RlZmluZSBSX0FSTV9UTFNfR0QzMgkJMTA0CS8qIFBDLXJlbCAzMiBiaXQgZm9yIGdsb2JhbCBkeW5hbWljCisJCQkJCSAgIHRocmVhZCBsb2NhbCBkYXRhICovCisjZGVmaW5lIFJfQVJNX1RMU19MRE0zMgkJMTA1CS8qIFBDLXJlbCAzMiBiaXQgZm9yIGxvY2FsIGR5bmFtaWMKKwkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEgKi8KKyNkZWZpbmUgUl9BUk1fVExTX0xETzMyCQkxMDYJLyogMzIgYml0IG9mZnNldCByZWxhdGl2ZSB0byBUTFMKKwkJCQkJICAgYmxvY2sgKi8KKyNkZWZpbmUgUl9BUk1fVExTX0lFMzIJCTEwNwkvKiBQQy1yZWwgMzIgYml0IGZvciBHT1QgZW50cnkgb2YKKwkJCQkJICAgc3RhdGljIFRMUyBibG9jayBvZmZzZXQgKi8KKyNkZWZpbmUgUl9BUk1fVExTX0xFMzIJCTEwOAkvKiAzMiBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvIHN0YXRpYworCQkJCQkgICBUTFMgYmxvY2sgKi8KKyNkZWZpbmUJUl9BUk1fVEhNX1RMU19ERVNDU0VRCTEyOQorI2RlZmluZSBSX0FSTV9JUkVMQVRJVkUJCTE2MAorI2RlZmluZSBSX0FSTV9SWFBDMjUJCTI0OQorI2RlZmluZSBSX0FSTV9SU0JSRUwzMgkJMjUwCisjZGVmaW5lIFJfQVJNX1RITV9SUEMyMgkJMjUxCisjZGVmaW5lIFJfQVJNX1JSRUwzMgkJMjUyCisjZGVmaW5lIFJfQVJNX1JBQlMyMgkJMjUzCisjZGVmaW5lIFJfQVJNX1JQQzI0CQkyNTQKKyNkZWZpbmUgUl9BUk1fUkJBU0UJCTI1NQorLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9BUk1fTlVNCQkyNTYKKworLyogSUEtNjQgc3BlY2lmaWMgZGVjbGFyYXRpb25zLiAgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRWhkciBlX2ZsYWdzIGZpZWxkLiAgKi8KKyNkZWZpbmUgRUZfSUFfNjRfTUFTS09TCQkweDAwMDAwMDBmCS8qIG9zLXNwZWNpZmljIGZsYWdzICovCisjZGVmaW5lIEVGX0lBXzY0X0FCSTY0CQkweDAwMDAwMDEwCS8qIDY0LWJpdCBBQkkgKi8KKyNkZWZpbmUgRUZfSUFfNjRfQVJDSAkJMHhmZjAwMDAwMAkvKiBhcmNoLiB2ZXJzaW9uIG1hc2sgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIFBoZHIgcF90eXBlIGZpZWxkLiAgKi8KKyNkZWZpbmUgUFRfSUFfNjRfQVJDSEVYVAkoUFRfTE9QUk9DICsgMCkJLyogYXJjaCBleHRlbnNpb24gYml0cyAqLworI2RlZmluZSBQVF9JQV82NF9VTldJTkQJCShQVF9MT1BST0MgKyAxKQkvKiBpYTY0IHVud2luZCBiaXRzICovCisjZGVmaW5lIFBUX0lBXzY0X0hQX09QVF9BTk9UCShQVF9MT09TICsgMHgxMikKKyNkZWZpbmUgUFRfSUFfNjRfSFBfSFNMX0FOT1QJKFBUX0xPT1MgKyAweDEzKQorI2RlZmluZSBQVF9JQV82NF9IUF9TVEFDSwkoUFRfTE9PUyArIDB4MTQpCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIFBoZHIgcF9mbGFncyBmaWVsZC4gICovCisjZGVmaW5lIFBGX0lBXzY0X05PUkVDT1YJMHg4MDAwMDAwMAkvKiBzcGVjIGluc25zIHcvbyByZWNvdmVyeSAqLworCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgU2hkciBzaF90eXBlIGZpZWxkLiAgKi8KKyNkZWZpbmUgU0hUX0lBXzY0X0VYVAkJKFNIVF9MT1BST0MgKyAwKSAvKiBleHRlbnNpb24gYml0cyAqLworI2RlZmluZSBTSFRfSUFfNjRfVU5XSU5ECShTSFRfTE9QUk9DICsgMSkgLyogdW53aW5kIGJpdHMgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgU2hkciBzaF9mbGFncyBmaWVsZC4gICovCisjZGVmaW5lIFNIRl9JQV82NF9TSE9SVAkJMHgxMDAwMDAwMAkvKiBzZWN0aW9uIG5lYXIgZ3AgKi8KKyNkZWZpbmUgU0hGX0lBXzY0X05PUkVDT1YJMHgyMDAwMDAwMAkvKiBzcGVjIGluc25zIHcvbyByZWNvdmVyeSAqLworCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgRHluIGRfdGFnIGZpZWxkLiAgKi8KKyNkZWZpbmUgRFRfSUFfNjRfUExUX1JFU0VSVkUJKERUX0xPUFJPQyArIDApCisjZGVmaW5lIERUX0lBXzY0X05VTQkJMQorCisvKiBJQS02NCByZWxvY2F0aW9ucy4gICovCisjZGVmaW5lIFJfSUE2NF9OT05FCQkweDAwCS8qIG5vbmUgKi8KKyNkZWZpbmUgUl9JQTY0X0lNTTE0CQkweDIxCS8qIHN5bWJvbCArIGFkZGVuZCwgYWRkIGltbTE0ICovCisjZGVmaW5lIFJfSUE2NF9JTU0yMgkJMHgyMgkvKiBzeW1ib2wgKyBhZGRlbmQsIGFkZCBpbW0yMiAqLworI2RlZmluZSBSX0lBNjRfSU1NNjQJCTB4MjMJLyogc3ltYm9sICsgYWRkZW5kLCBtb3YgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X0RJUjMyTVNCCQkweDI0CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9ESVIzMkxTQgkJMHgyNQkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfRElSNjRNU0IJCTB4MjYJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0RJUjY0TFNCCQkweDI3CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9HUFJFTDIyCQkweDJhCS8qIEBncHJlbChzeW0gKyBhZGQpLCBhZGQgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X0dQUkVMNjRJCQkweDJiCS8qIEBncHJlbChzeW0gKyBhZGQpLCBtb3YgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X0dQUkVMMzJNU0IJMHgyYwkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9HUFJFTDMyTFNCCTB4MmQJLyogQGdwcmVsKHN5bSArIGFkZCksIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfR1BSRUw2NE1TQgkweDJlCS8qIEBncHJlbChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0dQUkVMNjRMU0IJMHgyZgkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRjIyCQkweDMyCS8qIEBsdG9mZihzeW0gKyBhZGQpLCBhZGQgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGNjRJCQkweDMzCS8qIEBsdG9mZihzeW0gKyBhZGQpLCBtb3YgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X1BMVE9GRjIyCQkweDNhCS8qIEBwbHRvZmYoc3ltICsgYWRkKSwgYWRkIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9QTFRPRkY2NEkJMHgzYgkvKiBAcGx0b2ZmKHN5bSArIGFkZCksIG1vdiBpbW02NCAqLworI2RlZmluZSBSX0lBNjRfUExUT0ZGNjRNU0IJMHgzZQkvKiBAcGx0b2ZmKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfUExUT0ZGNjRMU0IJMHgzZgkvKiBAcGx0b2ZmKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfRlBUUjY0SQkJMHg0MwkvKiBAZnB0cihzeW0gKyBhZGQpLCBtb3YgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X0ZQVFIzMk1TQgkweDQ0CS8qIEBmcHRyKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLworI2RlZmluZSBSX0lBNjRfRlBUUjMyTFNCCTB4NDUJLyogQGZwdHIoc3ltICsgYWRkKSwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9GUFRSNjRNU0IJMHg0NgkvKiBAZnB0cihzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0ZQVFI2NExTQgkweDQ3CS8qIEBmcHRyKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfUENSRUw2MEIJCTB4NDgJLyogQHBjcmVsKHN5bSArIGFkZCksIGJybCAqLworI2RlZmluZSBSX0lBNjRfUENSRUwyMUIJCTB4NDkJLyogQHBjcmVsKHN5bSArIGFkZCksIHB0YiwgY2FsbCAqLworI2RlZmluZSBSX0lBNjRfUENSRUwyMU0JCTB4NGEJLyogQHBjcmVsKHN5bSArIGFkZCksIGNoay5zICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDIxRgkJMHg0YgkvKiBAcGNyZWwoc3ltICsgYWRkKSwgZmNoa2YgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMMzJNU0IJMHg0YwkvKiBAcGNyZWwoc3ltICsgYWRkKSwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDMyTFNCCTB4NGQJLyogQHBjcmVsKHN5bSArIGFkZCksIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfUENSRUw2NE1TQgkweDRlCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMNjRMU0IJMHg0ZgkvKiBAcGNyZWwoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9GUFRSMjIJMHg1MgkvKiBAbHRvZmYoQGZwdHIocythKSksIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9GUFRSNjRJCTB4NTMJLyogQGx0b2ZmKEBmcHRyKHMrYSkpLCBpbW02NCAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRlBUUjMyTVNCCTB4NTQJLyogQGx0b2ZmKEBmcHRyKHMrYSkpLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX0ZQVFIzMkxTQgkweDU1CS8qIEBsdG9mZihAZnB0cihzK2EpKSwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9GUFRSNjRNU0IJMHg1NgkvKiBAbHRvZmYoQGZwdHIocythKSksIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRlBUUjY0TFNCCTB4NTcJLyogQGx0b2ZmKEBmcHRyKHMrYSkpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFR1JFTDMyTVNCCTB4NWMJLyogQHNlZ3JlbChzeW0gKyBhZGQpLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFR1JFTDMyTFNCCTB4NWQJLyogQHNlZ3JlbChzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFR1JFTDY0TVNCCTB4NWUJLyogQHNlZ3JlbChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFR1JFTDY0TFNCCTB4NWYJLyogQHNlZ3JlbChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFQ1JFTDMyTVNCCTB4NjQJLyogQHNlY3JlbChzeW0gKyBhZGQpLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFQ1JFTDMyTFNCCTB4NjUJLyogQHNlY3JlbChzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFQ1JFTDY0TVNCCTB4NjYJLyogQHNlY3JlbChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFQ1JFTDY0TFNCCTB4NjcJLyogQHNlY3JlbChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1JFTDMyTVNCCQkweDZjCS8qIGRhdGEgNCArIFJFTCAqLworI2RlZmluZSBSX0lBNjRfUkVMMzJMU0IJCTB4NmQJLyogZGF0YSA0ICsgUkVMICovCisjZGVmaW5lIFJfSUE2NF9SRUw2NE1TQgkJMHg2ZQkvKiBkYXRhIDggKyBSRUwgKi8KKyNkZWZpbmUgUl9JQTY0X1JFTDY0TFNCCQkweDZmCS8qIGRhdGEgOCArIFJFTCAqLworI2RlZmluZSBSX0lBNjRfTFRWMzJNU0IJCTB4NzQJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUVjMyTFNCCQkweDc1CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9MVFY2NE1TQgkJMHg3NgkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfTFRWNjRMU0IJCTB4NzcJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMMjFCSQkweDc5CS8qIEBwY3JlbChzeW0gKyBhZGQpLCAyMWJpdCBpbnN0ICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDIyCQkweDdhCS8qIEBwY3JlbChzeW0gKyBhZGQpLCAyMmJpdCBpbnN0ICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDY0SQkJMHg3YgkvKiBAcGNyZWwoc3ltICsgYWRkKSwgNjRiaXQgaW5zdCAqLworI2RlZmluZSBSX0lBNjRfSVBMVE1TQgkJMHg4MAkvKiBkeW5hbWljIHJlbG9jLCBpbXBvcnRlZCBQTFQsIE1TQiAqLworI2RlZmluZSBSX0lBNjRfSVBMVExTQgkJMHg4MQkvKiBkeW5hbWljIHJlbG9jLCBpbXBvcnRlZCBQTFQsIExTQiAqLworI2RlZmluZSBSX0lBNjRfQ09QWQkJMHg4NAkvKiBjb3B5IHJlbG9jYXRpb24gKi8KKyNkZWZpbmUgUl9JQTY0X1NVQgkJMHg4NQkvKiBBZGRlbmQgYW5kIHN5bWJvbCBkaWZmZXJlbmNlICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRjIyWAkJMHg4NgkvKiBMVE9GRjIyLCByZWxheGFibGUuICAqLworI2RlZmluZSBSX0lBNjRfTERYTU9WCQkweDg3CS8qIFVzZSBvZiBMVE9GRjIyWC4gICovCisjZGVmaW5lIFJfSUE2NF9UUFJFTDE0CQkweDkxCS8qIEB0cHJlbChzeW0gKyBhZGQpLCBpbW0xNCAqLworI2RlZmluZSBSX0lBNjRfVFBSRUwyMgkJMHg5MgkvKiBAdHByZWwoc3ltICsgYWRkKSwgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X1RQUkVMNjRJCQkweDkzCS8qIEB0cHJlbChzeW0gKyBhZGQpLCBpbW02NCAqLworI2RlZmluZSBSX0lBNjRfVFBSRUw2NE1TQgkweDk2CS8qIEB0cHJlbChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1RQUkVMNjRMU0IJMHg5NwkvKiBAdHByZWwoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9UUFJFTDIyCTB4OWEJLyogQGx0b2ZmKEB0cHJlbChzK2EpKSwgaW1tMiAqLworI2RlZmluZSBSX0lBNjRfRFRQTU9ENjRNU0IJMHhhNgkvKiBAZHRwbW9kKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfRFRQTU9ENjRMU0IJMHhhNwkvKiBAZHRwbW9kKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRFRQTU9EMjIJMHhhYQkvKiBAbHRvZmYoQGR0cG1vZChzeW0gKyBhZGQpKSwgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDE0CQkweGIxCS8qIEBkdHByZWwoc3ltICsgYWRkKSwgaW1tMTQgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDIyCQkweGIyCS8qIEBkdHByZWwoc3ltICsgYWRkKSwgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDY0SQkweGIzCS8qIEBkdHByZWwoc3ltICsgYWRkKSwgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDMyTVNCCTB4YjQJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDMyTFNCCTB4YjUJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDY0TVNCCTB4YjYJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDY0TFNCCTB4YjcJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX0RUUFJFTDIyCTB4YmEJLyogQGx0b2ZmKEBkdHByZWwocythKSksIGltbTIyICovCisKKy8qIFNIIHNwZWNpZmljIGRlY2xhcmF0aW9ucyAqLworCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLworI2RlZmluZSBFRl9TSF9NQUNIX01BU0sJCTB4MWYKKyNkZWZpbmUgRUZfU0hfVU5LTk9XTgkJMHgwCisjZGVmaW5lIEVGX1NIMQkJCTB4MQorI2RlZmluZSBFRl9TSDIJCQkweDIKKyNkZWZpbmUgRUZfU0gzCQkJMHgzCisjZGVmaW5lIEVGX1NIX0RTUAkJMHg0CisjZGVmaW5lIEVGX1NIM19EU1AJCTB4NQorI2RlZmluZSBFRl9TSDRBTF9EU1AJCTB4NgorI2RlZmluZSBFRl9TSDNFCQkJMHg4CisjZGVmaW5lIEVGX1NINAkJCTB4OQorI2RlZmluZSBFRl9TSDJFCQkJMHhiCisjZGVmaW5lIEVGX1NINEEJCQkweGMKKyNkZWZpbmUgRUZfU0gyQQkJCTB4ZAorI2RlZmluZSBFRl9TSDRfTk9GUFUJCTB4MTAKKyNkZWZpbmUgRUZfU0g0QV9OT0ZQVQkJMHgxMQorI2RlZmluZSBFRl9TSDRfTk9NTVVfTk9GUFUJMHgxMgorI2RlZmluZSBFRl9TSDJBX05PRlBVCQkweDEzCisjZGVmaW5lIEVGX1NIM19OT01NVQkJMHgxNAorI2RlZmluZSBFRl9TSDJBX1NINF9OT0ZQVQkweDE1CisjZGVmaW5lIEVGX1NIMkFfU0gzX05PRlBVCTB4MTYKKyNkZWZpbmUgRUZfU0gyQV9TSDQJCTB4MTcKKyNkZWZpbmUgRUZfU0gyQV9TSDNFCQkweDE4CisKKy8qIFNIIHJlbG9jcy4gICovCisjZGVmaW5lCVJfU0hfTk9ORQkJMAorI2RlZmluZQlSX1NIX0RJUjMyCQkxCisjZGVmaW5lCVJfU0hfUkVMMzIJCTIKKyNkZWZpbmUJUl9TSF9ESVI4V1BOCQkzCisjZGVmaW5lCVJfU0hfSU5EMTJXCQk0CisjZGVmaW5lCVJfU0hfRElSOFdQTAkJNQorI2RlZmluZQlSX1NIX0RJUjhXUFoJCTYKKyNkZWZpbmUJUl9TSF9ESVI4QlAJCTcKKyNkZWZpbmUJUl9TSF9ESVI4VwkJOAorI2RlZmluZQlSX1NIX0RJUjhMCQk5CisjZGVmaW5lCVJfU0hfU1dJVENIMTYJCTI1CisjZGVmaW5lCVJfU0hfU1dJVENIMzIJCTI2CisjZGVmaW5lCVJfU0hfVVNFUwkJMjcKKyNkZWZpbmUJUl9TSF9DT1VOVAkJMjgKKyNkZWZpbmUJUl9TSF9BTElHTgkJMjkKKyNkZWZpbmUJUl9TSF9DT0RFCQkzMAorI2RlZmluZQlSX1NIX0RBVEEJCTMxCisjZGVmaW5lCVJfU0hfTEFCRUwJCTMyCisjZGVmaW5lCVJfU0hfU1dJVENIOAkJMzMKKyNkZWZpbmUJUl9TSF9HTlVfVlRJTkhFUklUCTM0CisjZGVmaW5lCVJfU0hfR05VX1ZURU5UUlkJMzUKKyNkZWZpbmUJUl9TSF9UTFNfR0RfMzIJCTE0NAorI2RlZmluZQlSX1NIX1RMU19MRF8zMgkJMTQ1CisjZGVmaW5lCVJfU0hfVExTX0xET18zMgkJMTQ2CisjZGVmaW5lCVJfU0hfVExTX0lFXzMyCQkxNDcKKyNkZWZpbmUJUl9TSF9UTFNfTEVfMzIJCTE0OAorI2RlZmluZQlSX1NIX1RMU19EVFBNT0QzMgkxNDkKKyNkZWZpbmUJUl9TSF9UTFNfRFRQT0ZGMzIJMTUwCisjZGVmaW5lCVJfU0hfVExTX1RQT0ZGMzIJMTUxCisjZGVmaW5lCVJfU0hfR09UMzIJCTE2MAorI2RlZmluZQlSX1NIX1BMVDMyCQkxNjEKKyNkZWZpbmUJUl9TSF9DT1BZCQkxNjIKKyNkZWZpbmUJUl9TSF9HTE9CX0RBVAkJMTYzCisjZGVmaW5lCVJfU0hfSk1QX1NMT1QJCTE2NAorI2RlZmluZQlSX1NIX1JFTEFUSVZFCQkxNjUKKyNkZWZpbmUJUl9TSF9HT1RPRkYJCTE2NgorI2RlZmluZQlSX1NIX0dPVFBDCQkxNjcKKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lCVJfU0hfTlVNCQkyNTYKKworLyogUy8zOTAgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisvKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZSBlX2ZsYWdzIGZpZWxkLiAgKi8KKworI2RlZmluZSBFRl9TMzkwX0hJR0hfR1BSUyAgICAweDAwMDAwMDAxICAvKiBIaWdoIEdQUnMga2VybmVsIGZhY2lsaXR5IG5lZWRlZC4gICovCisKKy8qIEFkZGl0aW9uYWwgczM5MCByZWxvY3MgKi8KKworI2RlZmluZSBSXzM5MF9OT05FCQkwCS8qIE5vIHJlbG9jLiAgKi8KKyNkZWZpbmUgUl8zOTBfOAkJCTEJLyogRGlyZWN0IDggYml0LiAgKi8KKyNkZWZpbmUgUl8zOTBfMTIJCTIJLyogRGlyZWN0IDEyIGJpdC4gICovCisjZGVmaW5lIFJfMzkwXzE2CQkzCS8qIERpcmVjdCAxNiBiaXQuICAqLworI2RlZmluZSBSXzM5MF8zMgkJNAkvKiBEaXJlY3QgMzIgYml0LiAgKi8KKyNkZWZpbmUgUl8zOTBfUEMzMgkJNQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQuCSovCisjZGVmaW5lIFJfMzkwX0dPVDEyCQk2CS8qIDEyIGJpdCBHT1Qgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfR09UMzIJCTcJLyogMzIgYml0IEdPVCBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9QTFQzMgkJOAkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MuICAqLworI2RlZmluZSBSXzM5MF9DT1BZCQk5CS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUuICAqLworI2RlZmluZSBSXzM5MF9HTE9CX0RBVAkJMTAJLyogQ3JlYXRlIEdPVCBlbnRyeS4gICovCisjZGVmaW5lIFJfMzkwX0pNUF9TTE9UCQkxMQkvKiBDcmVhdGUgUExUIGVudHJ5LiAgKi8KKyNkZWZpbmUgUl8zOTBfUkVMQVRJVkUJCTEyCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UuICAqLworI2RlZmluZSBSXzM5MF9HT1RPRkYzMgkJMTMJLyogMzIgYml0IG9mZnNldCB0byBHT1QuCSAqLworI2RlZmluZSBSXzM5MF9HT1RQQwkJMTQJLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QuICAqLworI2RlZmluZSBSXzM5MF9HT1QxNgkJMTUJLyogMTYgYml0IEdPVCBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9QQzE2CQkxNgkvKiBQQyByZWxhdGl2ZSAxNiBiaXQuCSovCisjZGVmaW5lIFJfMzkwX1BDMTZEQkwJCTE3CS8qIFBDIHJlbGF0aXZlIDE2IGJpdCBzaGlmdGVkIGJ5IDEuICAqLworI2RlZmluZSBSXzM5MF9QTFQxNkRCTAkJMTgJLyogMTYgYml0IFBDIHJlbC4gUExUIHNoaWZ0ZWQgYnkgMS4gICovCisjZGVmaW5lIFJfMzkwX1BDMzJEQkwJCTE5CS8qIFBDIHJlbGF0aXZlIDMyIGJpdCBzaGlmdGVkIGJ5IDEuICAqLworI2RlZmluZSBSXzM5MF9QTFQzMkRCTAkJMjAJLyogMzIgYml0IFBDIHJlbC4gUExUIHNoaWZ0ZWQgYnkgMS4gICovCisjZGVmaW5lIFJfMzkwX0dPVFBDREJMCQkyMQkvKiAzMiBiaXQgUEMgcmVsLiBHT1Qgc2hpZnRlZCBieSAxLiAgKi8KKyNkZWZpbmUgUl8zOTBfNjQJCTIyCS8qIERpcmVjdCA2NCBiaXQuICAqLworI2RlZmluZSBSXzM5MF9QQzY0CQkyMwkvKiBQQyByZWxhdGl2ZSA2NCBiaXQuCSovCisjZGVmaW5lIFJfMzkwX0dPVDY0CQkyNAkvKiA2NCBiaXQgR09UIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX1BMVDY0CQkyNQkvKiA2NCBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MuICAqLworI2RlZmluZSBSXzM5MF9HT1RFTlQJCTI2CS8qIDMyIGJpdCBQQyByZWwuIHRvIEdPVCBlbnRyeSA+PiAxLiAqLworI2RlZmluZSBSXzM5MF9HT1RPRkYxNgkJMjcJLyogMTYgYml0IG9mZnNldCB0byBHT1QuICovCisjZGVmaW5lIFJfMzkwX0dPVE9GRjY0CQkyOAkvKiA2NCBiaXQgb2Zmc2V0IHRvIEdPVC4gKi8KKyNkZWZpbmUgUl8zOTBfR09UUExUMTIJCTI5CS8qIDEyIGJpdCBvZmZzZXQgdG8ganVtcCBzbG90LgkqLworI2RlZmluZSBSXzM5MF9HT1RQTFQxNgkJMzAJLyogMTYgYml0IG9mZnNldCB0byBqdW1wIHNsb3QuCSovCisjZGVmaW5lIFJfMzkwX0dPVFBMVDMyCQkzMQkvKiAzMiBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4JKi8KKyNkZWZpbmUgUl8zOTBfR09UUExUNjQJCTMyCS8qIDY0IGJpdCBvZmZzZXQgdG8ganVtcCBzbG90LgkqLworI2RlZmluZSBSXzM5MF9HT1RQTFRFTlQJCTMzCS8qIDMyIGJpdCByZWwuIG9mZnNldCB0byBqdW1wIHNsb3QuICAqLworI2RlZmluZSBSXzM5MF9QTFRPRkYxNgkJMzQJLyogMTYgYml0IG9mZnNldCBmcm9tIEdPVCB0byBQTFQuICovCisjZGVmaW5lIFJfMzkwX1BMVE9GRjMyCQkzNQkvKiAzMiBiaXQgb2Zmc2V0IGZyb20gR09UIHRvIFBMVC4gKi8KKyNkZWZpbmUgUl8zOTBfUExUT0ZGNjQJCTM2CS8qIDE2IGJpdCBvZmZzZXQgZnJvbSBHT1QgdG8gUExULiAqLworI2RlZmluZSBSXzM5MF9UTFNfTE9BRAkJMzcJLyogVGFnIGZvciBsb2FkIGluc24gaW4gVExTIGNvZGUuICAqLworI2RlZmluZSBSXzM5MF9UTFNfR0RDQUxMCTM4CS8qIFRhZyBmb3IgZnVuY3Rpb24gY2FsbCBpbiBnZW5lcmFsCisJCQkJCSAgIGR5bmFtaWMgVExTIGNvZGUuICovCisjZGVmaW5lIFJfMzkwX1RMU19MRENBTEwJMzkJLyogVGFnIGZvciBmdW5jdGlvbiBjYWxsIGluIGxvY2FsCisJCQkJCSAgIGR5bmFtaWMgVExTIGNvZGUuICovCisjZGVmaW5lIFJfMzkwX1RMU19HRDMyCQk0MAkvKiBEaXJlY3QgMzIgYml0IGZvciBnZW5lcmFsIGR5bmFtaWMKKwkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEuICAqLworI2RlZmluZSBSXzM5MF9UTFNfR0Q2NAkJNDEJLyogRGlyZWN0IDY0IGJpdCBmb3IgZ2VuZXJhbCBkeW5hbWljCisJCQkJCSAgdGhyZWFkIGxvY2FsIGRhdGEuICAqLworI2RlZmluZSBSXzM5MF9UTFNfR09USUUxMgk0MgkvKiAxMiBiaXQgR09UIG9mZnNldCBmb3Igc3RhdGljIFRMUworCQkJCQkgICBibG9jayBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9UTFNfR09USUUzMgk0MwkvKiAzMiBiaXQgR09UIG9mZnNldCBmb3Igc3RhdGljIFRMUworCQkJCQkgICBibG9jayBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9UTFNfR09USUU2NAk0NAkvKiA2NCBiaXQgR09UIG9mZnNldCBmb3Igc3RhdGljIFRMUworCQkJCQkgICBibG9jayBvZmZzZXQuICovCisjZGVmaW5lIFJfMzkwX1RMU19MRE0zMgkJNDUJLyogRGlyZWN0IDMyIGJpdCBmb3IgbG9jYWwgZHluYW1pYworCQkJCQkgICB0aHJlYWQgbG9jYWwgZGF0YSBpbiBMRSBjb2RlLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0xETTY0CQk0NgkvKiBEaXJlY3QgNjQgYml0IGZvciBsb2NhbCBkeW5hbWljCisJCQkJCSAgIHRocmVhZCBsb2NhbCBkYXRhIGluIExFIGNvZGUuICAqLworI2RlZmluZSBSXzM5MF9UTFNfSUUzMgkJNDcJLyogMzIgYml0IGFkZHJlc3Mgb2YgR09UIGVudHJ5IGZvcgorCQkJCQkgICBuZWdhdGVkIHN0YXRpYyBUTFMgYmxvY2sgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0lFNjQJCTQ4CS8qIDY0IGJpdCBhZGRyZXNzIG9mIEdPVCBlbnRyeSBmb3IKKwkJCQkJICAgbmVnYXRlZCBzdGF0aWMgVExTIGJsb2NrIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX1RMU19JRUVOVAkJNDkJLyogMzIgYml0IHJlbC4gb2Zmc2V0IHRvIEdPVCBlbnRyeSBmb3IKKwkJCQkJICAgbmVnYXRlZCBzdGF0aWMgVExTIGJsb2NrIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX1RMU19MRTMyCQk1MAkvKiAzMiBiaXQgbmVnYXRlZCBvZmZzZXQgcmVsYXRpdmUgdG8KKwkJCQkJICAgc3RhdGljIFRMUyBibG9jay4gICovCisjZGVmaW5lIFJfMzkwX1RMU19MRTY0CQk1MQkvKiA2NCBiaXQgbmVnYXRlZCBvZmZzZXQgcmVsYXRpdmUgdG8KKwkJCQkJICAgc3RhdGljIFRMUyBibG9jay4gICovCisjZGVmaW5lIFJfMzkwX1RMU19MRE8zMgkJNTIJLyogMzIgYml0IG9mZnNldCByZWxhdGl2ZSB0byBUTFMKKwkJCQkJICAgYmxvY2suICAqLworI2RlZmluZSBSXzM5MF9UTFNfTERPNjQJCTUzCS8qIDY0IGJpdCBvZmZzZXQgcmVsYXRpdmUgdG8gVExTCisJCQkJCSAgIGJsb2NrLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0RUUE1PRAk1NAkvKiBJRCBvZiBtb2R1bGUgY29udGFpbmluZyBzeW1ib2wuICAqLworI2RlZmluZSBSXzM5MF9UTFNfRFRQT0ZGCTU1CS8qIE9mZnNldCBpbiBUTFMgYmxvY2suCSAqLworI2RlZmluZSBSXzM5MF9UTFNfVFBPRkYJCTU2CS8qIE5lZ2F0ZWQgb2Zmc2V0IGluIHN0YXRpYyBUTFMKKwkJCQkJICAgYmxvY2suICAqLworI2RlZmluZSBSXzM5MF8yMAkJNTcJLyogRGlyZWN0IDIwIGJpdC4gICovCisjZGVmaW5lIFJfMzkwX0dPVDIwCQk1OAkvKiAyMCBiaXQgR09UIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX0dPVFBMVDIwCQk1OQkvKiAyMCBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4gICovCisjZGVmaW5lIFJfMzkwX1RMU19HT1RJRTIwCTYwCS8qIDIwIGJpdCBHT1Qgb2Zmc2V0IGZvciBzdGF0aWMgVExTCisJCQkJCSAgIGJsb2NrIG9mZnNldC4gICovCisvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLworI2RlZmluZSBSXzM5MF9OVU0JCTYxCisKKworLyogQ1JJUyByZWxvY2F0aW9ucy4gICovCisjZGVmaW5lIFJfQ1JJU19OT05FCQkwCisjZGVmaW5lIFJfQ1JJU184CQkxCisjZGVmaW5lIFJfQ1JJU18xNgkJMgorI2RlZmluZSBSX0NSSVNfMzIJCTMKKyNkZWZpbmUgUl9DUklTXzhfUENSRUwJCTQKKyNkZWZpbmUgUl9DUklTXzE2X1BDUkVMCQk1CisjZGVmaW5lIFJfQ1JJU18zMl9QQ1JFTAkJNgorI2RlZmluZSBSX0NSSVNfR05VX1ZUSU5IRVJJVAk3CisjZGVmaW5lIFJfQ1JJU19HTlVfVlRFTlRSWQk4CisjZGVmaW5lIFJfQ1JJU19DT1BZCQk5CisjZGVmaW5lIFJfQ1JJU19HTE9CX0RBVAkJMTAKKyNkZWZpbmUgUl9DUklTX0pVTVBfU0xPVAkxMQorI2RlZmluZSBSX0NSSVNfUkVMQVRJVkUJCTEyCisjZGVmaW5lIFJfQ1JJU18xNl9HT1QJCTEzCisjZGVmaW5lIFJfQ1JJU18zMl9HT1QJCTE0CisjZGVmaW5lIFJfQ1JJU18xNl9HT1RQTFQJMTUKKyNkZWZpbmUgUl9DUklTXzMyX0dPVFBMVAkxNgorI2RlZmluZSBSX0NSSVNfMzJfR09UUkVMCTE3CisjZGVmaW5lIFJfQ1JJU18zMl9QTFRfR09UUkVMCTE4CisjZGVmaW5lIFJfQ1JJU18zMl9QTFRfUENSRUwJMTkKKworI2RlZmluZSBSX0NSSVNfTlVNCQkyMAorCisKKy8qIEFNRCB4ODYtNjQgcmVsb2NhdGlvbnMuICAqLworI2RlZmluZSBSX1g4Nl82NF9OT05FCQkwCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfWDg2XzY0XzY0CQkxCS8qIERpcmVjdCA2NCBiaXQgICovCisjZGVmaW5lIFJfWDg2XzY0X1BDMzIJCTIJLyogUEMgcmVsYXRpdmUgMzIgYml0IHNpZ25lZCAqLworI2RlZmluZSBSX1g4Nl82NF9HT1QzMgkJMwkvKiAzMiBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfWDg2XzY0X1BMVDMyCQk0CS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLworI2RlZmluZSBSX1g4Nl82NF9DT1BZCQk1CS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgUl9YODZfNjRfR0xPQl9EQVQJNgkvKiBDcmVhdGUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfWDg2XzY0X0pVTVBfU0xPVAk3CS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfUkVMQVRJVkUJOAkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVFBDUkVMCTkJLyogMzIgYml0IHNpZ25lZCBQQyByZWxhdGl2ZQorCQkJCQkgICBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfWDg2XzY0XzMyCQkxMAkvKiBEaXJlY3QgMzIgYml0IHplcm8gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfMzJTCQkxMQkvKiBEaXJlY3QgMzIgYml0IHNpZ24gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfMTYJCTEyCS8qIERpcmVjdCAxNiBiaXQgemVybyBleHRlbmRlZCAqLworI2RlZmluZSBSX1g4Nl82NF9QQzE2CQkxMwkvKiAxNiBiaXQgc2lnbiBleHRlbmRlZCBwYyByZWxhdGl2ZSAqLworI2RlZmluZSBSX1g4Nl82NF84CQkxNAkvKiBEaXJlY3QgOCBiaXQgc2lnbiBleHRlbmRlZCAgKi8KKyNkZWZpbmUgUl9YODZfNjRfUEM4CQkxNQkvKiA4IGJpdCBzaWduIGV4dGVuZGVkIHBjIHJlbGF0aXZlICovCisjZGVmaW5lIFJfWDg2XzY0X0RUUE1PRDY0CTE2CS8qIElEIG9mIG1vZHVsZSBjb250YWluaW5nIHN5bWJvbCAqLworI2RlZmluZSBSX1g4Nl82NF9EVFBPRkY2NAkxNwkvKiBPZmZzZXQgaW4gbW9kdWxlJ3MgVExTIGJsb2NrICovCisjZGVmaW5lIFJfWDg2XzY0X1RQT0ZGNjQJMTgJLyogT2Zmc2V0IGluIGluaXRpYWwgVExTIGJsb2NrICovCisjZGVmaW5lIFJfWDg2XzY0X1RMU0dECQkxOQkvKiAzMiBiaXQgc2lnbmVkIFBDIHJlbGF0aXZlIG9mZnNldAorCQkJCQkgICB0byB0d28gR09UIGVudHJpZXMgZm9yIEdEIHN5bWJvbCAqLworI2RlZmluZSBSX1g4Nl82NF9UTFNMRAkJMjAJLyogMzIgYml0IHNpZ25lZCBQQyByZWxhdGl2ZSBvZmZzZXQKKwkJCQkJICAgdG8gdHdvIEdPVCBlbnRyaWVzIGZvciBMRCBzeW1ib2wgKi8KKyNkZWZpbmUgUl9YODZfNjRfRFRQT0ZGMzIJMjEJLyogT2Zmc2V0IGluIFRMUyBibG9jayAqLworI2RlZmluZSBSX1g4Nl82NF9HT1RUUE9GRgkyMgkvKiAzMiBiaXQgc2lnbmVkIFBDIHJlbGF0aXZlIG9mZnNldAorCQkJCQkgICB0byBHT1QgZW50cnkgZm9yIElFIHN5bWJvbCAqLworI2RlZmluZSBSX1g4Nl82NF9UUE9GRjMyCTIzCS8qIE9mZnNldCBpbiBpbml0aWFsIFRMUyBibG9jayAqLworI2RlZmluZSBSX1g4Nl82NF9QQzY0CQkyNAkvKiBQQyByZWxhdGl2ZSA2NCBiaXQgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UT0ZGNjQJMjUJLyogNjQgYml0IG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UUEMzMgkyNgkvKiAzMiBiaXQgc2lnbmVkIHBjIHJlbGF0aXZlCisJCQkJCSAgIG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UNjQJCTI3CS8qIDY0LWJpdCBHT1QgZW50cnkgb2Zmc2V0ICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVFBDUkVMNjQJMjgJLyogNjQtYml0IFBDIHJlbGF0aXZlIG9mZnNldAorCQkJCQkgICB0byBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UUEM2NAkyOQkvKiA2NC1iaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSX1g4Nl82NF9HT1RQTFQ2NAkzMCAJLyogbGlrZSBHT1Q2NCwgc2F5cyBQTFQgZW50cnkgbmVlZGVkICovCisjZGVmaW5lIFJfWDg2XzY0X1BMVE9GRjY0CTMxCS8qIDY0LWJpdCBHT1QgcmVsYXRpdmUgb2Zmc2V0CisJCQkJCSAgIHRvIFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1g4Nl82NF9TSVpFMzIJCTMyCS8qIFNpemUgb2Ygc3ltYm9sIHBsdXMgMzItYml0IGFkZGVuZCAqLworI2RlZmluZSBSX1g4Nl82NF9TSVpFNjQJCTMzCS8qIFNpemUgb2Ygc3ltYm9sIHBsdXMgNjQtYml0IGFkZGVuZCAqLworI2RlZmluZSBSX1g4Nl82NF9HT1RQQzMyX1RMU0RFU0MgMzQJLyogR09UIG9mZnNldCBmb3IgVExTIGRlc2NyaXB0b3IuICAqLworI2RlZmluZSBSX1g4Nl82NF9UTFNERVNDX0NBTEwgICAzNQkvKiBNYXJrZXIgZm9yIGNhbGwgdGhyb3VnaCBUTFMKKwkJCQkJICAgZGVzY3JpcHRvci4gICovCisjZGVmaW5lIFJfWDg2XzY0X1RMU0RFU0MgICAgICAgIDM2CS8qIFRMUyBkZXNjcmlwdG9yLiAgKi8KKyNkZWZpbmUgUl9YODZfNjRfSVJFTEFUSVZFCTM3CS8qIEFkanVzdCBpbmRpcmVjdGx5IGJ5IHByb2dyYW0gYmFzZSAqLworCisjZGVmaW5lIFJfWDg2XzY0X05VTQkJMzgKKworCisvKiBBTTMzIHJlbG9jYXRpb25zLiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX05PTkUJCTAJLyogTm8gcmVsb2MuICAqLworI2RlZmluZSBSX01OMTAzMDBfMzIJCTEJLyogRGlyZWN0IDMyIGJpdC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF8xNgkJMgkvKiBEaXJlY3QgMTYgYml0LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwXzgJCTMJLyogRGlyZWN0IDggYml0LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX1BDUkVMMzIJNAkvKiBQQy1yZWxhdGl2ZSAzMi1iaXQuICAqLworI2RlZmluZSBSX01OMTAzMDBfUENSRUwxNgk1CS8qIFBDLXJlbGF0aXZlIDE2LWJpdCBzaWduZWQuICAqLworI2RlZmluZSBSX01OMTAzMDBfUENSRUw4CTYJLyogUEMtcmVsYXRpdmUgOC1iaXQgc2lnbmVkLiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQJNwkvKiBBbmNpZW50IEMrKyB2dGFibGUgZ2FyYmFnZS4uLiAqLworI2RlZmluZSBSX01OMTAzMDBfR05VX1ZURU5UUlkJOAkvKiAuLi4gY29sbGVjdGlvbiBhbm5vdGF0aW9uLiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwXzI0CQk5CS8qIERpcmVjdCAyNCBiaXQuICAqLworI2RlZmluZSBSX01OMTAzMDBfR09UUEMzMgkxMAkvKiAzMi1iaXQgUENyZWwgb2Zmc2V0IHRvIEdPVC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9HT1RQQzE2CTExCS8qIDE2LWJpdCBQQ3JlbCBvZmZzZXQgdG8gR09ULiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dPVE9GRjMyCTEyCS8qIDMyLWJpdCBvZmZzZXQgZnJvbSBHT1QuICAqLworI2RlZmluZSBSX01OMTAzMDBfR09UT0ZGMjQJMTMJLyogMjQtYml0IG9mZnNldCBmcm9tIEdPVC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9HT1RPRkYxNgkxNAkvKiAxNi1iaXQgb2Zmc2V0IGZyb20gR09ULiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX1BMVDMyCQkxNQkvKiAzMi1iaXQgUENyZWwgdG8gUExUIGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX1BMVDE2CQkxNgkvKiAxNi1iaXQgUENyZWwgdG8gUExUIGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dPVDMyCQkxNwkvKiAzMi1iaXQgb2Zmc2V0IHRvIEdPVCBlbnRyeS4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9HT1QyNAkJMTgJLyogMjQtYml0IG9mZnNldCB0byBHT1QgZW50cnkuICAqLworI2RlZmluZSBSX01OMTAzMDBfR09UMTYJCTE5CS8qIDE2LWJpdCBvZmZzZXQgdG8gR09UIGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0NPUFkJCTIwCS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUuICAqLworI2RlZmluZSBSX01OMTAzMDBfR0xPQl9EQVQJMjEJLyogQ3JlYXRlIEdPVCBlbnRyeS4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9KTVBfU0xPVAkyMgkvKiBDcmVhdGUgUExUIGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX1JFTEFUSVZFCTIzCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UuICAqLworCisjZGVmaW5lIFJfTU4xMDMwMF9OVU0JCTI0CisKKworLyogTTMyUiByZWxvY3MuICAqLworI2RlZmluZSBSX00zMlJfTk9ORQkJMAkvKiBObyByZWxvYy4gKi8KKyNkZWZpbmUgUl9NMzJSXzE2CQkxCS8qIERpcmVjdCAxNiBiaXQuICovCisjZGVmaW5lIFJfTTMyUl8zMgkJMgkvKiBEaXJlY3QgMzIgYml0LiAqLworI2RlZmluZSBSX00zMlJfMjQJCTMJLyogRGlyZWN0IDI0IGJpdC4gKi8KKyNkZWZpbmUgUl9NMzJSXzEwX1BDUkVMCQk0CS8qIFBDIHJlbGF0aXZlIDEwIGJpdCBzaGlmdGVkLiAqLworI2RlZmluZSBSX00zMlJfMThfUENSRUwJCTUJLyogUEMgcmVsYXRpdmUgMTggYml0IHNoaWZ0ZWQuICovCisjZGVmaW5lIFJfTTMyUl8yNl9QQ1JFTAkJNgkvKiBQQyByZWxhdGl2ZSAyNiBiaXQgc2hpZnRlZC4gKi8KKyNkZWZpbmUgUl9NMzJSX0hJMTZfVUxPCQk3CS8qIEhpZ2ggMTYgYml0IHdpdGggdW5zaWduZWQgbG93LiAqLworI2RlZmluZSBSX00zMlJfSEkxNl9TTE8JCTgJLyogSGlnaCAxNiBiaXQgd2l0aCBzaWduZWQgbG93LiAqLworI2RlZmluZSBSX00zMlJfTE8xNgkJOQkvKiBMb3cgMTYgYml0LiAqLworI2RlZmluZSBSX00zMlJfU0RBMTYJCTEwCS8qIDE2IGJpdCBvZmZzZXQgaW4gU0RBLiAqLworI2RlZmluZSBSX00zMlJfR05VX1ZUSU5IRVJJVAkxMQorI2RlZmluZSBSX00zMlJfR05VX1ZURU5UUlkJMTIKKy8qIE0zMlIgcmVsb2NzIHVzZSBTSFRfUkVMQS4gICovCisjZGVmaW5lIFJfTTMyUl8xNl9SRUxBCQkzMwkvKiBEaXJlY3QgMTYgYml0LiAqLworI2RlZmluZSBSX00zMlJfMzJfUkVMQQkJMzQJLyogRGlyZWN0IDMyIGJpdC4gKi8KKyNkZWZpbmUgUl9NMzJSXzI0X1JFTEEJCTM1CS8qIERpcmVjdCAyNCBiaXQuICovCisjZGVmaW5lIFJfTTMyUl8xMF9QQ1JFTF9SRUxBCTM2CS8qIFBDIHJlbGF0aXZlIDEwIGJpdCBzaGlmdGVkLiAqLworI2RlZmluZSBSX00zMlJfMThfUENSRUxfUkVMQQkzNwkvKiBQQyByZWxhdGl2ZSAxOCBiaXQgc2hpZnRlZC4gKi8KKyNkZWZpbmUgUl9NMzJSXzI2X1BDUkVMX1JFTEEJMzgJLyogUEMgcmVsYXRpdmUgMjYgYml0IHNoaWZ0ZWQuICovCisjZGVmaW5lIFJfTTMyUl9ISTE2X1VMT19SRUxBCTM5CS8qIEhpZ2ggMTYgYml0IHdpdGggdW5zaWduZWQgbG93ICovCisjZGVmaW5lIFJfTTMyUl9ISTE2X1NMT19SRUxBCTQwCS8qIEhpZ2ggMTYgYml0IHdpdGggc2lnbmVkIGxvdyAqLworI2RlZmluZSBSX00zMlJfTE8xNl9SRUxBCTQxCS8qIExvdyAxNiBiaXQgKi8KKyNkZWZpbmUgUl9NMzJSX1NEQTE2X1JFTEEJNDIJLyogMTYgYml0IG9mZnNldCBpbiBTREEgKi8KKyNkZWZpbmUgUl9NMzJSX1JFTEFfR05VX1ZUSU5IRVJJVAk0MworI2RlZmluZSBSX00zMlJfUkVMQV9HTlVfVlRFTlRSWQk0NAorI2RlZmluZSBSX00zMlJfUkVMMzIJCTQ1CS8qIFBDIHJlbGF0aXZlIDMyIGJpdC4gICovCisKKyNkZWZpbmUgUl9NMzJSX0dPVDI0CQk0OAkvKiAyNCBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfTTMyUl8yNl9QTFRSRUwJNDkJLyogMjYgYml0IFBDIHJlbGF0aXZlIHRvIFBMVCBzaGlmdGVkICovCisjZGVmaW5lIFJfTTMyUl9DT1BZCQk1MAkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCisjZGVmaW5lIFJfTTMyUl9HTE9CX0RBVAkJNTEJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSX00zMlJfSk1QX1NMT1QJCTUyCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9NMzJSX1JFTEFUSVZFCQk1MwkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfTTMyUl9HT1RPRkYJCTU0CS8qIDI0IGJpdCBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfTTMyUl9HT1RQQzI0CQk1NQkvKiAyNCBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSX00zMlJfR09UMTZfSElfVUxPCTU2CS8qIEhpZ2ggMTYgYml0IEdPVCBlbnRyeSB3aXRoIHVuc2lnbmVkCisJCQkJCSAgIGxvdyAqLworI2RlZmluZSBSX00zMlJfR09UMTZfSElfU0xPCTU3CS8qIEhpZ2ggMTYgYml0IEdPVCBlbnRyeSB3aXRoIHNpZ25lZAorCQkJCQkgICBsb3cgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVDE2X0xPCQk1OAkvKiBMb3cgMTYgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSX00zMlJfR09UUENfSElfVUxPCTU5CS8qIEhpZ2ggMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0bworCQkJCQkgICBHT1Qgd2l0aCB1bnNpZ25lZCBsb3cgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVFBDX0hJX1NMTwk2MAkvKiBIaWdoIDE2IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8KKwkJCQkJICAgR09UIHdpdGggc2lnbmVkIGxvdyAqLworI2RlZmluZSBSX00zMlJfR09UUENfTE8JCTYxCS8qIExvdyAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvCisJCQkJCSAgIEdPVCAqLworI2RlZmluZSBSX00zMlJfR09UT0ZGX0hJX1VMTwk2MgkvKiBIaWdoIDE2IGJpdCBvZmZzZXQgdG8gR09UCisJCQkJCSAgIHdpdGggdW5zaWduZWQgbG93ICovCisjZGVmaW5lIFJfTTMyUl9HT1RPRkZfSElfU0xPCTYzCS8qIEhpZ2ggMTYgYml0IG9mZnNldCB0byBHT1QKKwkJCQkJICAgd2l0aCBzaWduZWQgbG93ICovCisjZGVmaW5lIFJfTTMyUl9HT1RPRkZfTE8JNjQJLyogTG93IDE2IGJpdCBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfTTMyUl9OVU0JCTI1NgkvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICovCisKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIGVsZi5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2VuZGlhbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2QwMzBhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9lbmRpYW4uaApAQCAtMCwwICsxLDk2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTYsIDE5OTcsIDIwMDAsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0VORElBTl9ICisjZGVmaW5lCV9FTkRJQU5fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBEZWZpbml0aW9ucyBmb3IgYnl0ZSBvcmRlciwgYWNjb3JkaW5nIHRvIHNpZ25pZmljYW5jZSBvZiBieXRlcywKKyAgIGZyb20gbG93IGFkZHJlc3NlcyB0byBoaWdoIGFkZHJlc3Nlcy4gIFRoZSB2YWx1ZSBpcyB3aGF0IHlvdSBnZXQgYnkKKyAgIHB1dHRpbmcgJzQnIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUsICczJyBpbiB0aGUgc2Vjb25kIG1vc3QKKyAgIHNpZ25pZmljYW50IGJ5dGUsICcyJyBpbiB0aGUgc2Vjb25kIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUsIGFuZCAnMScKKyAgIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlLCBhbmQgdGhlbiB3cml0aW5nIGRvd24gb25lIGRpZ2l0IGZvcgorICAgZWFjaCBieXRlLCBzdGFydGluZyB3aXRoIHRoZSBieXRlIGF0IHRoZSBsb3dlc3QgYWRkcmVzcyBhdCB0aGUgbGVmdCwKKyAgIGFuZCBwcm9jZWVkaW5nIHRvIHRoZSBieXRlIHdpdGggdGhlIGhpZ2hlc3QgYWRkcmVzcyBhdCB0aGUgcmlnaHQuICAqLworCisjZGVmaW5lCV9fTElUVExFX0VORElBTgkxMjM0CisjZGVmaW5lCV9fQklHX0VORElBTgk0MzIxCisjZGVmaW5lCV9fUERQX0VORElBTgkzNDEyCisKKy8qIFRoaXMgZmlsZSBkZWZpbmVzIGBfX0JZVEVfT1JERVInIGZvciB0aGUgcGFydGljdWxhciBtYWNoaW5lLiAgKi8KKyNpbmNsdWRlIDxiaXRzL2VuZGlhbi5oPgorCisvKiBTb21lIG1hY2hpbmVzIG1heSBuZWVkIHRvIHVzZSBhIGRpZmZlcmVudCBlbmRpYW5uZXNzIGZvciBmbG9hdGluZyBwb2ludAorICAgdmFsdWVzLiAgKi8KKyNpZm5kZWYgX19GTE9BVF9XT1JEX09SREVSCisjIGRlZmluZSBfX0ZMT0FUX1dPUkRfT1JERVIgX19CWVRFX09SREVSCisjZW5kaWYKKworI2lmZGVmCV9fVVNFX0JTRAorIyBkZWZpbmUgTElUVExFX0VORElBTglfX0xJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIEJJR19FTkRJQU4JX19CSUdfRU5ESUFOCisjIGRlZmluZSBQRFBfRU5ESUFOCV9fUERQX0VORElBTgorIyBkZWZpbmUgQllURV9PUkRFUglfX0JZVEVfT1JERVIKKyNlbmRpZgorCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyBkZWZpbmUgX19MT05HX0xPTkdfUEFJUihISSwgTE8pIExPLCBISQorI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyBkZWZpbmUgX19MT05HX0xPTkdfUEFJUihISSwgTE8pIEhJLCBMTworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0JTRAorLyogQ29udmVyc2lvbiBpbnRlcmZhY2VzLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9ieXRlc3dhcC5oPgorCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgIGRlZmluZSBodG9iZTE2KHgpIF9fYnN3YXBfMTYgKHgpCisjICBkZWZpbmUgaHRvbGUxNih4KSAoeCkKKyMgIGRlZmluZSBiZTE2dG9oKHgpIF9fYnN3YXBfMTYgKHgpCisjICBkZWZpbmUgbGUxNnRvaCh4KSAoeCkKKworIyAgZGVmaW5lIGh0b2JlMzIoeCkgX19ic3dhcF8zMiAoeCkKKyMgIGRlZmluZSBodG9sZTMyKHgpICh4KQorIyAgZGVmaW5lIGJlMzJ0b2goeCkgX19ic3dhcF8zMiAoeCkKKyMgIGRlZmluZSBsZTMydG9oKHgpICh4KQorCisjICBkZWZpbmUgaHRvYmU2NCh4KSBfX2Jzd2FwXzY0ICh4KQorIyAgZGVmaW5lIGh0b2xlNjQoeCkgKHgpCisjICBkZWZpbmUgYmU2NHRvaCh4KSBfX2Jzd2FwXzY0ICh4KQorIyAgZGVmaW5lIGxlNjR0b2goeCkgKHgpCisjIGVsc2UKKyMgIGRlZmluZSBodG9iZTE2KHgpICh4KQorIyAgZGVmaW5lIGh0b2xlMTYoeCkgX19ic3dhcF8xNiAoeCkKKyMgIGRlZmluZSBiZTE2dG9oKHgpICh4KQorIyAgZGVmaW5lIGxlMTZ0b2goeCkgX19ic3dhcF8xNiAoeCkKKworIyAgZGVmaW5lIGh0b2JlMzIoeCkgKHgpCisjICBkZWZpbmUgaHRvbGUzMih4KSBfX2Jzd2FwXzMyICh4KQorIyAgZGVmaW5lIGJlMzJ0b2goeCkgKHgpCisjICBkZWZpbmUgbGUzMnRvaCh4KSBfX2Jzd2FwXzMyICh4KQorCisjICBkZWZpbmUgaHRvYmU2NCh4KSAoeCkKKyMgIGRlZmluZSBodG9sZTY0KHgpIF9fYnN3YXBfNjQgKHgpCisjICBkZWZpbmUgYmU2NHRvaCh4KSAoeCkKKyMgIGRlZmluZSBsZTY0dG9oKHgpIF9fYnN3YXBfNjQgKHgpCisjIGVuZGlmCisjZW5kaWYKKworI2VuZGlmCS8qIGVuZGlhbi5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2VudnouaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZW52ei5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDJkZWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2VudnouaApAQCAtMCwwICsxLDc0IEBACisvKiBSb3V0aW5lcyBmb3IgZGVhbGluZyB3aXRoICdcMCcgc2VwYXJhdGVkIGVudmlyb25tZW50IHZlY3RvcnMKKyAgIENvcHlyaWdodCAoQykgMTk5NSwgOTYsIDk4LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfRU5WWl9ICisjZGVmaW5lIF9FTlZaX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qIEVudnoncyBhcmUgYXJneidzIHRvbywgYW5kIHNob3VsZCBiZSBjcmVhdGVkIGV0Yy4sIHVzaW5nIHRoZSBzYW1lCisgICByb3V0aW5lcy4gICovCisjaW5jbHVkZSA8YXJnei5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBpbiBFTlZaIGZvciBOQU1FLCBvciAwIGlmIHRoZXJlIGlzIG5vbmUuICAqLworZXh0ZXJuIGNoYXIgKmVudnpfZW50cnkgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2VudnosIHNpemVfdCBfX2VudnpfbGVuLAorCQkJIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworCisvKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdmFsdWUgcG9ydGlvbiBvZiB0aGUgZW50cnkgaW4gRU5WWiBmb3IgTkFNRSwgb3IgMAorICAgaWYgdGhlcmUgaXMgbm9uZS4gICovCitleHRlcm4gY2hhciAqZW52el9nZXQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2VudnosIHNpemVfdCBfX2VudnpfbGVuLAorCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisKKy8qIEFkZHMgYW4gZW50cnkgZm9yIE5BTUUgd2l0aCB2YWx1ZSBWQUxVRSB0byBFTlZaICYgRU5WWl9MRU4uICBJZiBhbiBlbnRyeQorICAgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIEVOVlosIGl0IGlzIHJlbW92ZWQuICBJZiBWQUxVRSBpcworICAgTlVMTCwgdGhlbiB0aGUgbmV3IGVudHJ5IHdpbGwgYSBzcGVjaWFsIG51bGwgb25lLCBmb3Igd2hpY2ggZW52el9nZXQgd2lsbAorICAgcmV0dXJuIE5VTEwsIGFsdGhvdWdoIGVudnpfZW50cnkgd2lsbCBzdGlsbCByZXR1cm4gYW4gZW50cnk7IHRoaXMgaXMgaGFuZHkKKyAgIGJlY2F1c2Ugd2hlbiBtZXJnaW5nIHdpdGggYW5vdGhlciBlbnZ6LCB0aGUgbnVsbCBlbnRyeSBjYW4gb3ZlcnJpZGUgYW4KKyAgIGVudHJ5IGluIHRoZSBvdGhlciBvbmUuICBOdWxsIGVudHJpZXMgY2FuIGJlIHJlbW92ZWQgd2l0aCBlbnZ6X3N0cmlwICgpLiAgKi8KK2V4dGVybiBlcnJvcl90IGVudnpfYWRkIChjaGFyICoqX19yZXN0cmljdCBfX2VudnosCisJCQkgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fZW52el9sZW4sCisJCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX192YWx1ZSkgX19USFJPVzsKKworLyogQWRkcyBlYWNoIGVudHJ5IGluIEVOVloyIHRvIEVOVlogJiBFTlZaX0xFTiwgYXMgaWYgd2l0aCBlbnZ6X2FkZCgpLiAgSWYKKyAgIE9WRVJSSURFIGlzIHRydWUsIHRoZW4gdmFsdWVzIGluIEVOVloyIHdpbGwgc3VwZXJzZWRlIHRob3NlIHdpdGggdGhlIHNhbWUKKyAgIG5hbWUgaW4gRU5WLCBvdGhlcndpc2Ugbm90LiAgKi8KK2V4dGVybiBlcnJvcl90IGVudnpfbWVyZ2UgKGNoYXIgKipfX3Jlc3RyaWN0IF9fZW52eiwKKwkJCSAgIHNpemVfdCAqX19yZXN0cmljdCBfX2VudnpfbGVuLAorCQkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZW52ejIsCisJCQkgICBzaXplX3QgX19lbnZ6Ml9sZW4sIGludCBfX292ZXJyaWRlKSBfX1RIUk9XOworCisvKiBSZW1vdmUgdGhlIGVudHJ5IGZvciBOQU1FIGZyb20gRU5WWiAmIEVOVlpfTEVOLCBpZiBhbnkuICAqLworZXh0ZXJuIHZvaWQgZW52el9yZW1vdmUgKGNoYXIgKipfX3Jlc3RyaWN0IF9fZW52eiwKKwkJCSBzaXplX3QgKl9fcmVzdHJpY3QgX19lbnZ6X2xlbiwKKwkJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lKSBfX1RIUk9XOworCisvKiBSZW1vdmUgbnVsbCBlbnRyaWVzLiAgKi8KK2V4dGVybiB2b2lkIGVudnpfc3RyaXAgKGNoYXIgKipfX3Jlc3RyaWN0IF9fZW52eiwKKwkJCXNpemVfdCAqX19yZXN0cmljdCBfX2VudnpfbGVuKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZW52ei5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Vyci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9lcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmYzNTUzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9lcnIuaApAQCAtMCwwICsxLDU4IEBACisvKiA0LjRCU0QgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGVycm9yIG1lc3NhZ2VzLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywxOTk4LDE5OTksMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfRVJSX0gKKyNkZWZpbmUJX0VSUl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNkZWZpbmUJX19uZWVkX19fdmFfbGlzdAorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lmbmRlZglfX0dOVUNfVkFfTElTVAorIyBkZWZpbmUgX19nbnVjX3ZhX2xpc3QJX19wdHJfdAorI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworLyogUHJpbnQgInByb2dyYW06ICIsIEZPUk1BVCwgIjogIiwgdGhlIHN0YW5kYXJkIGVycm9yIHN0cmluZyBmb3IgZXJybm8sCisgICBhbmQgYSBuZXdsaW5lLCBvbiBzdGRlcnIuICAqLworZXh0ZXJuIHZvaWQgd2FybiAoX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMSwgMikpKTsKK2V4dGVybiB2b2lkIHZ3YXJuIChfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCBfX2dudWNfdmFfbGlzdCkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDEsIDApKSk7CisKKy8qIExpa2V3aXNlLCBidXQgd2l0aG91dCAiOiAiIGFuZCB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyaW5nLiAgKi8KK2V4dGVybiB2b2lkIHdhcm54IChfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAxLCAyKSkpOworZXh0ZXJuIHZvaWQgdndhcm54IChfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCBfX2dudWNfdmFfbGlzdCkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDEsIDApKSk7CisKKy8qIExpa2V3aXNlLCBhbmQgdGhlbiBleGl0IHdpdGggU1RBVFVTLiAgKi8KK2V4dGVybiB2b2lkIGVyciAoaW50IF9fc3RhdHVzLCBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18sIF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDMpKSk7CitleHRlcm4gdm9pZCB2ZXJyIChpbnQgX19zdGF0dXMsIF9fY29uc3QgY2hhciAqX19mb3JtYXQsIF9fZ251Y192YV9saXN0KQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fLCBfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAwKSkpOworZXh0ZXJuIHZvaWQgZXJyeCAoaW50IF9fc3RhdHVzLCBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18sIF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDMpKSk7CitleHRlcm4gdm9pZCB2ZXJyeCAoaW50IF9fc3RhdHVzLCBfX2NvbnN0IGNoYXIgKiwgX19nbnVjX3ZhX2xpc3QpCisgICAgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18sIF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDApKSk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBlcnIuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9lcnJuby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzM2IwYzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Vycm5vLmgKQEAgLTAsMCArMSw3MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDkyLDkzLDk0LDk1LDk2LDk3LDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjUgRXJyb3JzCTxlcnJuby5oPgorICovCisKKyNpZm5kZWYJX0VSUk5PX0gKKworLyogVGhlIGluY2x1ZGVyIGRlZmluZWQgX19uZWVkX0VtYXRoIGlmIGhlIHdhbnRzIG9ubHkgdGhlIGRlZmluaXRpb25zCisgICBvZiBFRE9NIGFuZCBFUkFOR0UsIGFuZCBub3QgZXZlcnl0aGluZyBlbHNlLiAgKi8KKyNpZm5kZWYJX19uZWVkX0VtYXRoCisjIGRlZmluZSBfRVJSTk9fSAkxCisjIGluY2x1ZGUgPGZlYXR1cmVzLmg+CisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisvKiBHZXQgdGhlIGVycm9yIG51bWJlciBjb25zdGFudHMgZnJvbSB0aGUgc3lzdGVtLXNwZWNpZmljIGZpbGUuCisgICBUaGlzIGZpbGUgd2lsbCB0ZXN0IF9fbmVlZF9FbWF0aCBhbmQgX0VSUk5PX0guICAqLworI2luY2x1ZGUgPGJpdHMvZXJybm8uaD4KKyN1bmRlZglfX25lZWRfRW1hdGgKKworI2lmZGVmCV9FUlJOT19ICisKKy8qIERlY2xhcmUgdGhlIGBlcnJubycgdmFyaWFibGUsIHVubGVzcyBpdCdzIGRlZmluZWQgYXMgYSBtYWNybyBieQorICAgYml0cy9lcnJuby5oLiAgVGhpcyBpcyB0aGUgY2FzZSBpbiBHTlUsIHdoZXJlIGl0IGlzIGEgcGVyLXRocmVhZAorICAgdmFyaWFibGUuICBUaGlzIHJlZGVjbGFyYXRpb24gdXNpbmcgdGhlIG1hY3JvIHN0aWxsIHdvcmtzLCBidXQgaXQKKyAgIHdpbGwgYmUgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB3aXRob3V0IGEgcHJvdG90eXBlIGFuZCBtYXkgdHJpZ2dlcgorICAgYSAtV3N0cmljdC1wcm90b3R5cGVzIHdhcm5pbmcuICAqLworI2lmbmRlZgllcnJubworZXh0ZXJuIGludCBlcnJubzsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisKKy8qIFRoZSBmdWxsIGFuZCBzaW1wbGUgZm9ybXMgb2YgdGhlIG5hbWUgd2l0aCB3aGljaCB0aGUgcHJvZ3JhbSB3YXMKKyAgIGludm9rZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHNldCB1cCBhdXRvbWF0aWNhbGx5IGF0IHN0YXJ0dXAgYmFzZWQgb24KKyAgIHRoZSB2YWx1ZSBvZiBBUkdWWzBdICh0aGlzIHdvcmtzIG9ubHkgaWYgeW91IHVzZSBHTlUgbGQpLiAgKi8KK2V4dGVybiBjaGFyICpwcm9ncmFtX2ludm9jYXRpb25fbmFtZSwgKnByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lOworI2VuZGlmIC8qIF9fVVNFX0dOVSAqLworI2VuZGlmIC8qIF9FUlJOT19IICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfRVJSTk9fSCAqLworCisvKiBUaGUgSHVyZCA8Yml0cy9lcnJuby5oPiBkZWZpbmVzIGBlcnJvcl90JyBhcyBhbiBlbnVtZXJhdGVkIHR5cGUgc28KKyAgIHRoYXQgcHJpbnRpbmcgYGVycm9yX3QnIHZhbHVlcyBpbiB0aGUgZGVidWdnZXIgc2hvd3MgdGhlIG5hbWVzLiAgV2UKKyAgIG1pZ2h0IG5lZWQgdGhpcyBkZWZpbml0aW9uIHNvbWV0aW1lcyBldmVuIGlmIHRoaXMgZmlsZSB3YXMgaW5jbHVkZWQKKyAgIGJlZm9yZS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9HTlUgfHwgZGVmaW5lZCBfX25lZWRfZXJyb3JfdAorIyBpZm5kZWYgX19lcnJvcl90X2RlZmluZWQKK3R5cGVkZWYgaW50IGVycm9yX3Q7CisjICBkZWZpbmUgX19lcnJvcl90X2RlZmluZWQJMQorIyBlbmRpZgorIyB1bmRlZiBfX25lZWRfZXJyb3JfdAorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Vycm9yLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzMjFlNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXJyb3IuaApAQCAtMCwwICsxLDU4IEBACisvKiBEZWNsYXJhdGlvbiBmb3IgZXJyb3ItcmVwb3J0aW5nIGZ1bmN0aW9uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsMTk5NiwxOTk3LDIwMDMsMjAwNiwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9FUlJPUl9ICisjZGVmaW5lIF9FUlJPUl9IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBQcmludCBhIG1lc3NhZ2Ugd2l0aCBgZnByaW50ZiAoc3RkZXJyLCBGT1JNQVQsIC4uLiknOworICAgaWYgRVJSTlVNIGlzIG5vbnplcm8sIGZvbGxvdyBpdCB3aXRoICI6ICIgYW5kIHN0cmVycm9yIChFUlJOVU0pLgorICAgSWYgU1RBVFVTIGlzIG5vbnplcm8sIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbSB3aXRoIGBleGl0IChTVEFUVVMpJy4gICovCisKK2V4dGVybiB2b2lkIGVycm9yIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwgX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKKworZXh0ZXJuIHZvaWQgZXJyb3JfYXRfbGluZSAoaW50IF9fc3RhdHVzLCBpbnQgX19lcnJudW0sIF9fY29uc3QgY2hhciAqX19mbmFtZSwKKwkJCSAgIHVuc2lnbmVkIGludCBfX2xpbmVubywgX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgNSwgNikpKTsKKworLyogSWYgTlVMTCwgZXJyb3Igd2lsbCBmbHVzaCBzdGRvdXQsIHRoZW4gcHJpbnQgb24gc3RkZXJyIHRoZSBwcm9ncmFtCisgICBuYW1lLCBhIGNvbG9uIGFuZCBhIHNwYWNlLiAgT3RoZXJ3aXNlLCBlcnJvciB3aWxsIGNhbGwgdGhpcworICAgZnVuY3Rpb24gd2l0aG91dCBwYXJhbWV0ZXJzIGluc3RlYWQuICAqLworZXh0ZXJuIHZvaWQgKCplcnJvcl9wcmludF9wcm9nbmFtZSkgKHZvaWQpOworCisvKiBUaGlzIHZhcmlhYmxlIGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBgZXJyb3InIGlzIGNhbGxlZC4gICovCitleHRlcm4gdW5zaWduZWQgaW50IGVycm9yX21lc3NhZ2VfY291bnQ7CisKKy8qIFNvbWV0aW1lcyB3ZSB3YW50IHRvIGhhdmUgYXQgbW9zdCBvbmUgZXJyb3IgcGVyIGxpbmUuICBUaGlzCisgICB2YXJpYWJsZSBjb250cm9scyB3aGV0aGVyIHRoaXMgbW9kZSBpcyBzZWxlY3RlZCBvciBub3QuICAqLworZXh0ZXJuIGludCBlcnJvcl9vbmVfcGVyX2xpbmU7CisKKworI2lmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZSAmJiBkZWZpbmVkIF9fdmFfYXJnX3BhY2sKKyMgaW5jbHVkZSA8Yml0cy9lcnJvci5oPgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBlcnJvci5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2VzZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9lc2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWM0MGU5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9lc2QuaApAQCAtMCwwICsxLDM0MiBAQAorI2lmbmRlZiBFU0RfSAorI2RlZmluZSBFU0RfSAorI2luY2x1ZGUgPGF1ZGlvZmlsZS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIHBhdGggYW5kIG5hbWUgb2YgdGhlIGRlZmF1bHQgRXNvdW5EIGRvbWFpbiBzb2NrZXQgKi8KKyNkZWZpbmUgRVNEX1VOSVhfU09DS0VUX0RJUgllc2RfZ2V0X3NvY2tldF9kaXJuYW1lKCkKKyNkZWZpbmUgRVNEX1VOSVhfU09DS0VUX05BTUUJZXNkX2dldF9zb2NrZXRfbmFtZSgpCisKKy8qIHNpemUgb2YgdGhlIGF1ZGlvIGJ1ZmZlciAqLworI2RlZmluZSBFU0RfQlVGX1NJWkUgKDQgKiAxMDI0KQorLyogbWF4aW11bSBzaXplIHdlIGNhbiB3cml0ZSgpLiAgT3RoZXJ3aXNlIHdlIG1pZ2h0IG92ZXJmbG93ICovCisjZGVmaW5lIEVTRF9NQVhfV1JJVEVfU0laRSAoMjEgKiA0MDk2KQorCisvKiBsZW5ndGggb2YgdGhlIGF1dGhvcml6YXRpb24ga2V5LCBvY3RldHMgKi8KKyNkZWZpbmUgRVNEX0tFWV9MRU4gKDE2KQorCisvKiBkZWZhdWx0IHBvcnQgZm9yIHRoZSBFc291bkQgc2VydmVyICovCisjZGVmaW5lIEVTRF9ERUZBVUxUX1BPUlQgKDE2MDAxKQorCisvKiBkZWZhdWx0IHNhbXBsZSByYXRlIGZvciB0aGUgRXNvdW5EIHNlcnZlciAqLworI2RlZmluZSBFU0RfREVGQVVMVF9SQVRFICg0NDEwMCkKKworLyogbWF4aW11bSBsZW5ndGggb2YgYSBzdHJlYW0vc2FtcGxlIG5hbWUgKi8KKyNkZWZpbmUgRVNEX05BTUVfTUFYICgxMjgpCisKKy8qIGEgbWFnaWMgbnVtYmVyIHRvIGlkZW50aWZ5IHRoZSByZWxhdGl2ZSBlbmRpYW5uZXNzIG9mIGEgY2xpZW50ICovCisjZGVmaW5lIEVTRF9FTkRJQU5fS0VZIFwKKwkoICh1bnNpZ25lZCBpbnQpICggKCdFJyA8PCAyNCkgKyAoJ04nIDw8IDE2KSArICgnRCcgPDwgOCkgKyAoJ04nKSApICkKKworI2RlZmluZSBFU0RfVk9MVU1FX0JBU0UgKDI1NikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB3aGF0IGNhbiB3ZSBkbyB0by93aXRoIHRoZSBFc291bkQgKi8KK2VudW0gZXNkX3Byb3RvIHsgCisgICAgRVNEX1BST1RPX0NPTk5FQ1QsICAgICAgLyogaW1wbGllZCBvbiBpbml0YWwgY2xpZW50IGNvbm5lY3Rpb24gKi8KKworICAgIC8qIHBzZXVkbyAic2VjdXJpdHkiIGZ1bmN0aW9uYWxpdHkgKi8KKyAgICBFU0RfUFJPVE9fTE9DSywJICAgIC8qIGRpc2FibGUgImZvcmVpZ24iIGNsaWVudCBjb25uZWN0aW9ucyAqLworICAgIEVTRF9QUk9UT19VTkxPQ0ssCSAgICAvKiBlbmFibGUgImZvcmVpZ24iIGNsaWVudCBjb25uZWN0aW9ucyAqLworCisgICAgLyogc3RyZWFtIGZ1bmN0aW9uYWxpdHk6IHBsYXksIHJlY29yZCwgbW9uaXRvciAqLworICAgIEVTRF9QUk9UT19TVFJFQU1fUExBWSwgIC8qIHBsYXkgYWxsIGZvbGxvd2luZyBkYXRhIGFzIGEgc3RyZWFtICovCisgICAgRVNEX1BST1RPX1NUUkVBTV9SRUMsICAgLyogcmVjb3JkIGRhdGEgZnJvbSBjYXJkIGFzIGEgc3RyZWFtICovCisgICAgRVNEX1BST1RPX1NUUkVBTV9NT04sICAgLyogc2VuZCBtaXhlZCBidWZmZXIgb3V0cHV0IGFzIGEgc3RyZWFtICovCisKKyAgICAvKiBzYW1wbGUgZnVuY3Rpb25hbGl0eTogY2FjaGUsIGZyZWUsIHBsYXksIGxvb3AsIEVPTCwga2lsbCAqLworICAgIEVTRF9QUk9UT19TQU1QTEVfQ0FDSEUsIC8qIGNhY2hlIGEgc2FtcGxlIGluIHRoZSBzZXJ2ZXIgKi8KKyAgICBFU0RfUFJPVE9fU0FNUExFX0ZSRUUsICAvKiByZWxlYXNlIGEgc2FtcGxlIGluIHRoZSBzZXJ2ZXIgKi8KKyAgICBFU0RfUFJPVE9fU0FNUExFX1BMQVksICAvKiBwbGF5IGEgY2FjaGVkIHNhbXBsZSAqLworICAgIEVTRF9QUk9UT19TQU1QTEVfTE9PUCwgIC8qIGxvb3AgYSBjYWNoZWQgc2FtcGxlLCB0aWwgZW9sb29wICovCisgICAgRVNEX1BST1RPX1NBTVBMRV9TVE9QLCAgLyogc3RvcCBhIGxvb3Bpbmcgc2FtcGxlIHdoZW4gZG9uZSAqLworICAgIEVTRF9QUk9UT19TQU1QTEVfS0lMTCwgIC8qIHN0b3AgdGhlIGxvb3Bpbmcgc2FtcGxlIGltbWVkLiAqLworCisgICAgLyogZnJlZSBhbmQgcmVjbGFpbSAvZGV2L2RzcCBmdW5jdGlvbmFsaXR5ICovCisgICAgRVNEX1BST1RPX1NUQU5EQlksCSAgICAvKiByZWxlYXNlIC9kZXYvZHNwIGFuZCBpZ25vcmUgYWxsIGRhdGEgKi8KKyAgICBFU0RfUFJPVE9fUkVTVU1FLAkgICAgLyogcmVjbGFpbSAvZGV2L2RzcCBhbmQgcGxheSBzb3VuZHMgYWdhaW4gKi8KKworICAgIC8qIFRPRE86IG1vdmUgdGhlc2UgdG8gYSBtb3JlIGxvZ2ljYWwgcGxhY2UuIE5PVEU6IHdpbGwgYnJlYWsgdGhlIHByb3RvY29sICovCisgICAgRVNEX1BST1RPX1NBTVBMRV9HRVRJRCwgLyogZ2V0IHRoZSBJRCBmb3IgYW4gYWxyZWFkeS1jYWNoZWQgc2FtcGxlICovCisgICAgRVNEX1BST1RPX1NUUkVBTV9GSUxULCAgLyogZmlsdGVyIG1peGVkIGJ1ZmZlciBvdXRwdXQgYXMgYSBzdHJlYW0gKi8KKworICAgIC8qIGVzZCByZW1vdGUgbWFuYWdlbWVudCAqLworICAgIEVTRF9QUk9UT19TRVJWRVJfSU5GTywgIC8qIGdldCBzZXJ2ZXIgaW5mbyAodmVyLCBzYW1wbGUgcmF0ZSwgZm9ybWF0KSAqLworICAgIEVTRF9QUk9UT19BTExfSU5GTywgICAgIC8qIGdldCBhbGwgaW5mbyAoc2VydmVyIGluZm8sIHBsYXllcnMsIHNhbXBsZXMpICovCisgICAgRVNEX1BST1RPX1NVQlNDUklCRSwgICAgLyogdHJhY2sgbmV3IGFuZCByZW1vdmVkIHBsYXllcnMgYW5kIHNhbXBsZXMgKi8KKyAgICBFU0RfUFJPVE9fVU5TVUJTQ1JJQkUsICAvKiBzdG9wIHRyYWNraW5nIHVwZGF0ZXMgKi8KKworICAgIC8qIGVzZCByZW1vdGUgY29udHJvbCAqLworICAgIEVTRF9QUk9UT19TVFJFQU1fUEFOLCAgIC8qIHNldCBzdHJlYW0gcGFubmluZyAqLworICAgIEVTRF9QUk9UT19TQU1QTEVfUEFOLCAgIC8qIHNldCBkZWZhdWx0IHNhbXBsZSBwYW5uaW5nICovCisKKyAgICAvKiBlc2Qgc3RhdHVzICovCisgICAgRVNEX1BST1RPX1NUQU5EQllfTU9ERSwgLyogc2VlIGlmIHNlcnZlciBpcyBpbiBzdGFuZGJ5LCBhdXRvc3RhbmRieSwgZXRjICovCisKKyAgICAvKiBlc2QgbGF0ZW5jeSAqLworICAgIEVTRF9QUk9UT19MQVRFTkNZLCAgICAgIC8qIHJldHJpZXZlIGxhdGVuY3kgYmV0d2VlbiB3cml0ZSgpJ3MgYW5kIG91dHB1dCAqLworICAKKyAgICBFU0RfUFJPVE9fTUFYICAgICAgICAgICAvKiBmb3IgYm91bmRzIGNoZWNraW5nICovCit9OworICAgIAorCisvKioqKioqKioqKioqKioqKioqLworLyogVGhlIEVzb3VuRCBhcGkgKi8KKworLyogdGhlIHByb3BlcnRpZXMgb2YgYSBzb3VuZCBidWZmZXIgYXJlIGxvZ2ljYWxseSBvcidkICovCisKKy8qIGJpdHMgb2Ygc3RyZWFtL3NhbXBsZSBkYXRhICovCisjZGVmaW5lIEVTRF9NQVNLX0JJVFMJKCAweDAwMEYgKQorI2RlZmluZSBFU0RfQklUUzggCSggMHgwMDAwICkKKyNkZWZpbmUgRVNEX0JJVFMxNgkoIDB4MDAwMSApCisKKy8qIGhvdyBtYW55IGludGVybGVhdmVkIGNoYW5uZWxzIG9mIGRhdGEgKi8KKyNkZWZpbmUgRVNEX01BU0tfQ0hBTgkoIDB4MDBGMCApCisjZGVmaW5lIEVTRF9NT05PCSggMHgwMDEwICkKKyNkZWZpbmUgRVNEX1NURVJFTwkoIDB4MDAyMCApCisKKy8qIHdoZXRoZXIgaXQncyBhIHN0cmVhbSBvciBhIHNhbXBsZSAqLworI2RlZmluZSBFU0RfTUFTS19NT0RFCSggMHgwRjAwICkKKyNkZWZpbmUgRVNEX1NUUkVBTQkoIDB4MDAwMCApCisjZGVmaW5lIEVTRF9TQU1QTEUJKCAweDAxMDAgKQorI2RlZmluZSBFU0RfQURQQ00JKCAweDAyMDAgKQkvKiBUT0RPOiBhbnlvbmUgdXAgZm9yIHRoaXM/ID1QICovCisKKy8qIHRoZSBmdW5jdGlvbiBvZiB0aGUgc3RyZWFtL3NhbXBsZSwgYW5kIGNvbW1vbiBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgRVNEX01BU0tfRlVOQwkoIDB4RjAwMCApCisjZGVmaW5lIEVTRF9QTEFZCSggMHgxMDAwICkKKy8qIGZ1bmN0aW9ucyBmb3Igc3RyZWFtcyBvbmx5ICovCisjZGVmaW5lIEVTRF9NT05JVE9SCSggMHgwMDAwICkKKyNkZWZpbmUgRVNEX1JFQ09SRAkoIDB4MjAwMCApCisvKiBmdW5jdGlvbnMgZm9yIHNhbXBsZXMgb25seSAqLworI2RlZmluZSBFU0RfU1RPUAkoIDB4MDAwMCApCisjZGVmaW5lIEVTRF9MT09QCSggMHgyMDAwICkKKwordHlwZWRlZiBpbnQgZXNkX2Zvcm1hdF90OwordHlwZWRlZiBpbnQgZXNkX3Byb3RvX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY2xpZW50IHNpZGUgQVBJIGZvciBwbGF5aW5nIHNvdW5kcyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgb2N0ZXQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZXNkbGliLmMgLSBiYXNpYyBlc2QgY2xpZW50IGludGVyZmFjZSBmdW5jdGlvbnMgKi8KKworLyogb3BlbnMgY2hhbm5lbCwgYXV0aGVudGljYXRlcyBjb25uZWN0aW9uLCBhbmQgcHJlZmFyZXMgZm9yIHByb3RvcyAqLworLyogcmV0dXJucyBFc291bkQgc29ja2V0IGZvciBjb21tdW5pY2F0aW9uLCByZXN1bHQgPCAwID0gZXJyb3IgKi8KKy8qIHNlcnZlciA9IGxpc3RlbiBzb2NrZXQgKGxvY2FsaG9zdDo1MDAxLCAxOTIuMTY4LjE2OC4wOjk5OTkgKi8KKy8qIHJhdGUsIGZvcm1hdCA9IChiaXRzIHwgY2hhbm5lbHMgfCBzdHJlYW0gfCBmdW5jKSAqLworaW50IGVzZF9vcGVuX3NvdW5kKCBjb25zdCBjaGFyICpob3N0ICk7CisKKy8qIHNlbmQgdGhlIGF1dGhvcml6YXRpb24gY29va2llLCBjcmVhdGUgb25lIGlmIG5lZWRlZCAqLworaW50IGVzZF9zZW5kX2F1dGgoIGludCBzb2NrICk7CisKKy8qIGxvY2svdW5sb2NrIHdpbGwgZGlzYWJsZS9lbmFibGUgZm9yZWlnbiBjbGllbnRzIGZyb20gY29ubmVjdGluZyAqLworaW50IGVzZF9sb2NrKCBpbnQgZXNkICk7CitpbnQgZXNkX3VubG9jayggaW50IGVzZCApOworCisvKiBzdGFuZGJ5L3Jlc3VtZSB3aWxsIGZyZWUvcmVjbGFpbSBhdWRpbyBkZXZpY2Ugc28gb3RoZXJzIG1heSB1c2UgaXQgKi8KK2ludCBlc2Rfc3RhbmRieSggaW50IGVzZCApOworaW50IGVzZF9yZXN1bWUoIGludCBlc2QgKTsKKworLyogb3BlbiBhIHNvY2tldCBmb3IgcGxheWluZywgbW9uaXRvcmluZywgb3IgcmVjb3JkaW5nIGFzIGEgc3RyZWFtICovCisvKiB0aGUgKl9mYWxsYmFjayBmdW5jdGlvbnMgdHJ5IHRvIG9wZW4gL2Rldi9kc3AgaWYgdGhlcmUncyBubyBFc291bkQgKi8KK2ludCBlc2RfcGxheV9zdHJlYW0oIGVzZF9mb3JtYXRfdCBmb3JtYXQsIGludCByYXRlLCAKKwkJICAgICBjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpuYW1lICk7CitpbnQgZXNkX3BsYXlfc3RyZWFtX2ZhbGxiYWNrKCBlc2RfZm9ybWF0X3QgZm9ybWF0LCBpbnQgcmF0ZSwgCisJCQkgICAgICBjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpuYW1lICk7CitpbnQgZXNkX21vbml0b3Jfc3RyZWFtKCBlc2RfZm9ybWF0X3QgZm9ybWF0LCBpbnQgcmF0ZSwgCisJCQljb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpuYW1lICk7CisvKiBpbnQgZXNkX21vbml0b3Jfc3RyZWFtX2ZhbGxiYWNrKCBlc2RfZm9ybWF0X3QgZm9ybWF0LCBpbnQgcmF0ZSApOyAqLworaW50IGVzZF9yZWNvcmRfc3RyZWFtKCBlc2RfZm9ybWF0X3QgZm9ybWF0LCBpbnQgcmF0ZSwgCisJCSAgICAgICBjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpuYW1lICk7CitpbnQgZXNkX3JlY29yZF9zdHJlYW1fZmFsbGJhY2soIGVzZF9mb3JtYXRfdCBmb3JtYXQsIGludCByYXRlLCAKKwkJCQljb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpuYW1lICk7CitpbnQgZXNkX2ZpbHRlcl9zdHJlYW0oIGVzZF9mb3JtYXRfdCBmb3JtYXQsIGludCByYXRlLCAKKwkJICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKm5hbWUgKTsKKworLyogY2FjaGUgYSBzYW1wbGUgaW4gdGhlIHNlcnZlciByZXR1cm5zIHNhbXBsZSBpZCwgPCAwID0gZXJyb3IgKi8KK2ludCBlc2Rfc2FtcGxlX2NhY2hlKCBpbnQgZXNkLCBlc2RfZm9ybWF0X3QgZm9ybWF0LCBjb25zdCBpbnQgcmF0ZSwgCisJCSAgICAgIGNvbnN0IGludCBsZW5ndGgsIGNvbnN0IGNoYXIgKm5hbWUgKTsKK2ludCBlc2RfY29uZmlybV9zYW1wbGVfY2FjaGUoIGludCBlc2QgKTsKKworLyogZ2V0IHRoZSBzYW1wbGUgaWQgZm9yIGFuIGFscmVhZHktY2FjaGVkIHNhbXBsZSAqLworaW50IGVzZF9zYW1wbGVfZ2V0aWQoIGludCBlc2QsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiB1bmNhY2hlIGEgc2FtcGxlIGluIHRoZSBzZXJ2ZXIgKi8KK2ludCBlc2Rfc2FtcGxlX2ZyZWUoIGludCBlc2QsIGludCBzYW1wbGUgKTsKKworLyogcGxheSBhIGNhY2hlZCBzYW1wbGUgb25jZSAqLworaW50IGVzZF9zYW1wbGVfcGxheSggaW50IGVzZCwgaW50IHNhbXBsZSApOworLyogbWFrZSBhIGNhY2hlZCBzYW1wbGUgbG9vcCAqLworaW50IGVzZF9zYW1wbGVfbG9vcCggaW50IGVzZCwgaW50IHNhbXBsZSApOworCisvKiBzdG9wIHRoZSBsb29waW5nIHNhbXBsZSBhdCBlbmQgKi8KK2ludCBlc2Rfc2FtcGxlX3N0b3AoIGludCBlc2QsIGludCBzYW1wbGUgKTsKKy8qIHN0b3AgYSBwbGF5aW5nIHNhbXBsZSBpbW1lZC4gKi8KK2ludCBlc2Rfc2FtcGxlX2tpbGwoIGludCBlc2QsIGludCBzYW1wbGUgKTsKKworLyogY2xvc2VzIGZkLCBwcmV2aW91c2x5IG9idGFpbmVkIGJ5IGVzZF9vcGVuICovCitpbnQgZXNkX2Nsb3NlKCBpbnQgZXNkICk7CisKKy8qIGdldCB0aGUgc3RyZWFtIGxhdGVuY3kgdG8gZXNvdW5kIChsYXRlbmN5IGlzIG51bWJlciBvZiBzYW1wbGVzICAqLworLyogYXQgNDQuMWtoeiBzdGVyZW8gMTYgYml0IC0geW91J2xsIGhhdmUgdG8gYWRqdXN0IGlmIG95dXIgaW5wdXQgICovCisvKiBzYW1wbGluZyByYXRlIGlzIGxlc3MgKGluIGJ5dGVzIHBlciBzZWNvbmQpICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHNvIGlmIHlvdSdyZSBhdCA0NC4xa2h6IHN0ZXJlbyAxNmJpdCBpbiB5b3VyIHN0cmVhbSAtIHlvdXIgbGFnICAqLworLyogaW4gYnl0ZXMgd291ZGwgYmUgbGFnICogMiAqIDIgYnl0ZXMgKDIgZm9yIHN0ZXJlbywgMiBmb3IgMTZiaXQpICovCisvKiBpZiB5b3VyIHN0cmVhbSBpcyBhdCAyMi4wNSBLaHogaXQnbGwgYmUgZG91YmxlIHRoaXMgLSBpbiBtb25vICAgKi8KKy8qIGRvdWJsZSBhZ2FpbiAuLi4gZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworaW50IGVzZF9nZXRfbGF0ZW5jeShpbnQgZXNkKTsKKyAgICAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBlc2RtZ3IuYyAtIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgYSAic291bmQgbWFuYWdlciIgZm9yIGVzZCAqLworCisvKiBzdHJ1Y3R1cmVzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHN0cmVhbXMvc2FtcGxlcyBmcm9tIHRoZSBzZXJ2ZXIgKi8KK3R5cGVkZWYgc3RydWN0IGVzZF9zZXJ2ZXJfaW5mbyB7CisKKyAgICBpbnQgdmVyc2lvbjsgCQkvKiBzZXJ2ZXIgdmVyc2lvbiBlbmNvZGVkIGFzIGFuIGludCAqLworICAgIGVzZF9mb3JtYXRfdCBmb3JtYXQ7CS8qIG1hZ2ljIGludCB3aXRoIHRoZSBmb3JtYXQgaW5mbyAqLworICAgIGludCByYXRlOwkJCS8qIHNhbXBsZSByYXRlICovCisKK30gZXNkX3NlcnZlcl9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IGVzZF9wbGF5ZXJfaW5mbyB7CisKKyAgICBzdHJ1Y3QgZXNkX3BsYXllcl9pbmZvICpuZXh0OyAvKiBwb2ludCB0byBuZXh0IGVudHJ5IGluIGxpc3QgKi8KKyAgICBlc2Rfc2VydmVyX2luZm9fdCAqc2VydmVyOwkvKiB0aGUgc2VydmVyIHRoYXQgY29udGFpbnMgdGhpcyBzdHJlYW0gKi8KKyAgICAKKyAgICBpbnQgc291cmNlX2lkOwkJLyogZWl0aGVyIGEgc3RyZWFtIGZkIG9yIHNhbXBsZSBpZCAqLworICAgIGNoYXIgbmFtZVsgRVNEX05BTUVfTUFYIF07CS8qIG5hbWUgb2Ygc3RyZWFtIGZvciByZW1vdGUgY29udHJvbCAqLworICAgIGludCByYXRlOwkJCS8qIHNhbXBsZSByYXRlICovCisgICAgaW50IGxlZnRfdm9sX3NjYWxlOwkJLyogdm9sdW1lIHNjYWxpbmcgKi8KKyAgICBpbnQgcmlnaHRfdm9sX3NjYWxlOworCisgICAgZXNkX2Zvcm1hdF90IGZvcm1hdDsJLyogbWFnaWMgaW50IHdpdGggdGhlIGZvcm1hdCBpbmZvICovCisKK30gZXNkX3BsYXllcl9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IGVzZF9zYW1wbGVfaW5mbyB7CisKKyAgICBzdHJ1Y3QgZXNkX3NhbXBsZV9pbmZvICpuZXh0OyAvKiBwb2ludCB0byBuZXh0IGVudHJ5IGluIGxpc3QgKi8KKyAgICBlc2Rfc2VydmVyX2luZm9fdCAqc2VydmVyOwkvKiB0aGUgc2VydmVyIHRoYXQgY29udGFpbnMgdGhpcyBzYW1wbGUgKi8KKyAgICAKKyAgICBpbnQgc2FtcGxlX2lkOwkJLyogZWl0aGVyIGEgc3RyZWFtIGZkIG9yIHNhbXBsZSBpZCAqLworICAgIGNoYXIgbmFtZVsgRVNEX05BTUVfTUFYIF07CS8qIG5hbWUgb2Ygc3RyZWFtIGZvciByZW1vdGUgY29udHJvbCAqLworICAgIGludCByYXRlOwkJCS8qIHNhbXBsZSByYXRlICovCisgICAgaW50IGxlZnRfdm9sX3NjYWxlOwkJLyogdm9sdW1lIHNjYWxpbmcgKi8KKyAgICBpbnQgcmlnaHRfdm9sX3NjYWxlOworCisgICAgZXNkX2Zvcm1hdF90IGZvcm1hdDsJLyogbWFnaWMgaW50IHdpdGggdGhlIGZvcm1hdCBpbmZvICovCisgICAgaW50IGxlbmd0aDsJCQkvKiB0b3RhbCBidWZmZXIgbGVuZ3RoICovCisKK30gZXNkX3NhbXBsZV9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IGVzZF9pbmZvIHsKKworICAgIGVzZF9zZXJ2ZXJfaW5mb190ICpzZXJ2ZXI7CisgICAgZXNkX3BsYXllcl9pbmZvX3QgKnBsYXllcl9saXN0OworICAgIGVzZF9zYW1wbGVfaW5mb190ICpzYW1wbGVfbGlzdDsKKworfSBlc2RfaW5mb190OworCitlbnVtIGVzZF9zdGFuZGJ5X21vZGUgeyAKKyAgICBFU01fRVJST1IsIEVTTV9PTl9TVEFOREJZLCBFU01fT05fQVVUT1NUQU5EQlksIEVTTV9SVU5OSU5HCit9OwordHlwZWRlZiBpbnQgZXNkX3N0YW5kYnlfbW9kZV90OworCisvKiBkZWZpbmUgY2FsbGJhY2tzIGZvciBlc2RfdXBkYXRlX2luZm8oKSAqLworLyogd2hhdCB0byBkbyB3aGVuIGEgc3RyZWFtIGNvbm5lY3RzLCBvciBzYW1wbGUgaXMgcGxheWVkICovCit0eXBlZGVmIGludCBlc2RfbmV3X3BsYXllcl9jYWxsYmFja190KCBlc2RfcGxheWVyX2luZm9fdCAqICk7CisvKiB3aGF0IHRvIGRvIHdoZW4gYSBzdHJlYW0gZGlzY29ubmVjdHMsIG9yIHNhbXBsZSBzdG9wcyBwbGF5aW5nICovCit0eXBlZGVmIGludCBlc2Rfb2xkX3BsYXllcl9jYWxsYmFja190KCBlc2RfcGxheWVyX2luZm9fdCAqICk7CisvKiB3aGF0IHRvIGRvIHdoZW4gYSBzYW1wbGUgaXMgY2FjaGVkICovCit0eXBlZGVmIGludCBlc2RfbmV3X3NhbXBsZV9jYWxsYmFja190KCBlc2Rfc2FtcGxlX2luZm9fdCAqICk7CisvKiB3aGF0IHRvIGRvIHdoZW4gYSBzYW1wbGUgaXMgdW5jYWNoZWQgKi8KK3R5cGVkZWYgaW50IGVzZF9vbGRfc2FtcGxlX2NhbGxiYWNrX3QoIGVzZF9zYW1wbGVfaW5mb190ICogKTsKKwordHlwZWRlZiBzdHJ1Y3QgZXNkX3VwZGF0ZV9pbmZvX2NhbGxiYWNrcyB7CisgICAgZXNkX25ld19wbGF5ZXJfY2FsbGJhY2tfdCAqZXNkX25ld19wbGF5ZXJfY2FsbGJhY2s7CisgICAgZXNkX29sZF9wbGF5ZXJfY2FsbGJhY2tfdCAqZXNkX29sZF9wbGF5ZXJfY2FsbGJhY2s7CisgICAgZXNkX25ld19zYW1wbGVfY2FsbGJhY2tfdCAqZXNkX25ld19zYW1wbGVfY2FsbGJhY2s7CisgICAgZXNkX29sZF9zYW1wbGVfY2FsbGJhY2tfdCAqZXNkX29sZF9zYW1wbGVfY2FsbGJhY2s7Cit9IGVzZF91cGRhdGVfaW5mb19jYWxsYmFja3NfdDsKKworLyogcHJpbnQgc2VydmVyIGludG8gdG8gc3Rkb3V0ICovCit2b2lkIGVzZF9wcmludF9zZXJ2ZXJfaW5mbyggZXNkX3NlcnZlcl9pbmZvX3QgKnNlcnZlcl9pbmZvICk7Cit2b2lkIGVzZF9wcmludF9wbGF5ZXJfaW5mbyggZXNkX3BsYXllcl9pbmZvX3QgKnBsYXllcl9pbmZvICk7Cit2b2lkIGVzZF9wcmludF9zYW1wbGVfaW5mbyggZXNkX3NhbXBsZV9pbmZvX3QgKnNhbXBsZV9pbmZvICk7CisvKiBwcmludCBhbGwgaW5mbyB0byBzdGRvdXQgKi8KK3ZvaWQgZXNkX3ByaW50X2FsbF9pbmZvKCBlc2RfaW5mb190ICphbGxfaW5mbyApOworCisvKiByZXRyaWV2ZSBzZXJ2ZXIgcHJvcGVydGllcyAoc2FtcGxlIHJhdGUsIGZvcm1hdCwgdmVyc2lvbiBudW1iZXIpICovCitlc2Rfc2VydmVyX2luZm9fdCAqZXNkX2dldF9zZXJ2ZXJfaW5mbyggaW50IGVzZCApOworLyogcmVsZWFzZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIHNlcnZlciBwcm9wZXJ0aWVzIHN0cnVjdHVyZSAqLwordm9pZCBlc2RfZnJlZV9zZXJ2ZXJfaW5mbyggZXNkX3NlcnZlcl9pbmZvX3QgKnNlcnZlcl9pbmZvICk7CisKKy8qIHJldHJpZXZlIGFsbCBpbmZvcm1hdGlvbiBmcm9tIHNlcnZlciAqLworZXNkX2luZm9fdCAqZXNkX2dldF9hbGxfaW5mbyggaW50IGVzZCApOworCisvKiByZXRyaWV2ZSBhbGwgaW5mb3JtYXRpb24gZnJvbSBzZXJ2ZXIsIGFuZCB1cGRhdGUgdW50aWwgdW5zdWJzcmliZWQgb3IgY2xvc2VkICovCitlc2RfaW5mb190ICplc2Rfc3Vic2NyaWJlX2FsbF9pbmZvKCBpbnQgZXNkICk7CisKKy8qIGNhbGwgdG8gdXBkYXRlIHRoZSBpbmZvIHN0cnVjdHVyZSB3aXRoIG5ldyBpbmZvcm1hdGlvbiwgYW5kIGNhbGwgY2FsbGJhY2tzICovCitlc2RfaW5mb190ICplc2RfdXBkYXRlX2luZm8oIGludCBlc2QsIGVzZF9pbmZvX3QgKmluZm8sIAorCQkJICAgICBlc2RfdXBkYXRlX2luZm9fY2FsbGJhY2tzX3QgKmNhbGxiYWNrcyApOworZXNkX2luZm9fdCAqZXNkX3Vuc3Vic2NyaWJlX2luZm8oIGludCBlc2QgKTsKKworLyogcmVsZWFzZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGVzZCBpbmZvIHN0cnVjdHVyZSAqLwordm9pZCBlc2RfZnJlZV9hbGxfaW5mbyggZXNkX2luZm9fdCAqaW5mbyApOworCisKKy8qIHJlc2V0IHRoZSB2b2x1bWUgcGFubmluZyBmb3IgYSBzdHJlYW0gKi8KK2ludCBlc2Rfc2V0X3N0cmVhbV9wYW4oIGludCBlc2QsIGludCBzdHJlYW1faWQsIAorCQkJaW50IGxlZnRfc2NhbGUsIGludCByaWdodF9zY2FsZSApOworCisvKiByZXNldCB0aGUgZGVmYXVsdCB2b2x1bWUgcGFubmluZyBmb3IgYSBzYW1wbGUgKi8KK2ludCBlc2Rfc2V0X2RlZmF1bHRfc2FtcGxlX3BhbiggaW50IGVzZCwgaW50IHNhbXBsZV9pZCwgCisJCQkJaW50IGxlZnRfc2NhbGUsIGludCByaWdodF9zY2FsZSApOworCisvKiBzZWUgaWYgdGhlIHNlcnZlciBpcyBpbiBzdG5hYnksIGF1dG9zdGFuZGJ5LCBldGMgKi8KK2VzZF9zdGFuZGJ5X21vZGVfdCBlc2RfZ2V0X3N0YW5kYnlfbW9kZSggaW50IGVzZCApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZXNkZmlsZS5jIC0gYXVkaW9maWxlIHdyYXBwZXJzIGZvciBzYW5lIGhhbmRsaW5nIG9mIGZpbGVzICovCisKK2ludCBlc2Rfc2VuZF9maWxlKCBpbnQgZXNkLCBBRmZpbGVoYW5kbGUgYXVfZmlsZSwgaW50IGZyYW1lX2xlbmd0aCApOworaW50IGVzZF9wbGF5X2ZpbGUoIGNvbnN0IGNoYXIgKm5hbWVfcHJlZml4LCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZhbGxiYWNrICk7CitpbnQgZXNkX2ZpbGVfY2FjaGUoIGludCBlc2QsIGNvbnN0IGNoYXIgKm5hbWVfcHJlZml4LCBjb25zdCBjaGFyICpmaWxlbmFtZSApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYXVkaW8uYyAtIGFic3RyYWN0IHRoZSBzb3VuZCBoYXJkd2FyZSBmb3IgY3Jvc3MgcGxhdGZvcm0gdXNhZ2UgKi8KK2V4dGVybiBlc2RfZm9ybWF0X3QgZXNkX2F1ZGlvX2Zvcm1hdDsKK2V4dGVybiBpbnQgZXNkX2F1ZGlvX3JhdGU7CitleHRlcm4gY2hhciAqZXNkX2F1ZGlvX2RldmljZTsKKworY29uc3QgY2hhciAqZXNkX2F1ZGlvX2RldmljZXMoIHZvaWQgKTsKK2ludCBlc2RfYXVkaW9fb3Blbiggdm9pZCApOwordm9pZCBlc2RfYXVkaW9fY2xvc2UoIHZvaWQgKTsKK3ZvaWQgZXNkX2F1ZGlvX3BhdXNlKCB2b2lkICk7CitpbnQgZXNkX2F1ZGlvX3dyaXRlKCB2b2lkICpidWZmZXIsIGludCBidWZfc2l6ZSApOworaW50IGVzZF9hdWRpb19yZWFkKCB2b2lkICpidWZmZXIsIGludCBidWZfc2l6ZSApOwordm9pZCBlc2RfYXVkaW9fZmx1c2goIHZvaWQgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHV0aWwuYyB1dGlsaXRpZXMJCQkJCQkgICovCisKK2NvbnN0IGNoYXIgKmVzZF9nZXRfc29ja2V0X2Rpcm5hbWUoIHZvaWQgKTsKK2NvbnN0IGNoYXIgKmVzZF9nZXRfc29ja2V0X25hbWUoIHZvaWQgKTsKKworaW50IGhhdmVfaXB2Niggdm9pZCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiAjaWZuZGVmIEVTRF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2V0aS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ldGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWE2MTkwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ldGkuaApAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIsMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBBdXRob3I6ICBKdWVyZ2VuIFBmZWlmZXIsIDE5OTUsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAkSWQ6IGV0aS5oLHYgMS44IDIwMDMvMTAvMjUgMTU6MjQ6MjkgdG9tIEV4cCAkICovCisKKyNpZm5kZWYgTkNVUlNFU19FVElfSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfRVRJX0hfaW5jbCAxCisKKyNkZWZpbmUJRV9PSwkJCSgwKQorI2RlZmluZQlFX1NZU1RFTV9FUlJPUgkgCSgtMSkKKyNkZWZpbmUJRV9CQURfQVJHVU1FTlQJIAkoLTIpCisjZGVmaW5lCUVfUE9TVEVECSAJKC0zKQorI2RlZmluZQlFX0NPTk5FQ1RFRAkgCSgtNCkKKyNkZWZpbmUJRV9CQURfU1RBVEUJIAkoLTUpCisjZGVmaW5lCUVfTk9fUk9PTQkgCSgtNikKKyNkZWZpbmUJRV9OT1RfUE9TVEVECQkoLTcpCisjZGVmaW5lCUVfVU5LTk9XTl9DT01NQU5ECSgtOCkKKyNkZWZpbmUJRV9OT19NQVRDSAkJKC05KQorI2RlZmluZQlFX05PVF9TRUxFQ1RBQkxFCSgtMTApCisjZGVmaW5lCUVfTk9UX0NPTk5FQ1RFRAkgICAgICAgICgtMTEpCisjZGVmaW5lCUVfUkVRVUVTVF9ERU5JRUQJKC0xMikKKyNkZWZpbmUJRV9JTlZBTElEX0ZJRUxECSAgICAgICAgKC0xMykKKyNkZWZpbmUJRV9DVVJSRU5UCQkoLTE0KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXRpcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ldGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwOTdiYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXRpcC5oCkBAIC0wLDAgKzEsMzc4IEBACisvLyAqIFRoaXMgbWFrZXMgZW1hY3MgaGFwcHkgLSotTW9kZTogQysrOy0qLQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3LDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQXV0aG9yOiBKdWVyZ2VuIFBmZWlmZXIsIDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gJElkOiBldGlwLmguaW4sdiAxLjM3IDIwMDgvMDgvMzAgMTk6Mjc6MzIgdG9tIEV4cCAkCisKKyNpZm5kZWYgTkNVUlNFU19FVElQX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX0VUSVBfSF9pbmNsIDEKKworLy8gVGhlc2UgYXJlIHN1YnN0aXR1dGVkIGF0IGNvbmZpZ3VyZS9idWlsZCB0aW1lCisjaWZuZGVmIEhBVkVfQlVJTFRJTl9ICisjZGVmaW5lIEhBVkVfQlVJTFRJTl9IIDAKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfR1hYX0JVSUxUSU5fSAorI2RlZmluZSBIQVZFX0dYWF9CVUlMVElOX0ggMAorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HUFBfQlVJTFRJTl9ICisjZGVmaW5lIEhBVkVfR1BQX0JVSUxUSU5fSCAwCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0lPU1RSRUFNCisjZGVmaW5lIEhBVkVfSU9TVFJFQU0gMQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9UWVBFSU5GTworI2RlZmluZSBIQVZFX1RZUEVJTkZPIDEKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVkFMVUVTX0gKKyNkZWZpbmUgSEFWRV9WQUxVRVNfSCAwCisjZW5kaWYKKworI2lmbmRlZiBFVElQX05FRURTX01BVEhfSAorI2RlZmluZSBFVElQX05FRURTX01BVEhfSCAwCisjZW5kaWYKKworI2lmbmRlZiBFVElQX05FRURTX01BVEhfRVhDRVBUSU9OCisjZGVmaW5lIEVUSVBfTkVFRFNfTUFUSF9FWENFUFRJT04gMAorI2VuZGlmCisKKyNpZm5kZWYgQ1BQX0hBU19QQVJBTV9JTklUCisjZGVmaW5lIENQUF9IQVNfUEFSQU1fSU5JVCAwCisjZW5kaWYKKworI2lmbmRlZiBDUFBfSEFTX1NUQVRJQ19DQVNUCisjZGVmaW5lIENQUF9IQVNfU1RBVElDX0NBU1QgMQorI2VuZGlmCisKKyNpZm5kZWYgSU9TVFJFQU1fTkFNRVNQQUNFCisjZGVmaW5lIElPU1RSRUFNX05BTUVTUEFDRSAxCisjZW5kaWYKKworI2lmZGVmIF9fR05VR19fCisjICBpZiAoKF9fR05VR19fIDw9IDIpICYmIChfX0dOVUNfTUlOT1JfXyA8IDgpKQorIyAgICBpZiBIQVZFX1RZUEVJTkZPCisjICAgICAgaW5jbHVkZSA8dHlwZWluZm8+CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VR19fKQorIyAgaWYgSEFWRV9CVUlMVElOX0ggfHwgSEFWRV9HWFhfQlVJTFRJTl9IIHx8IEhBVkVfR1BQX0JVSUxUSU5fSAorIyAgICBpZiBFVElQX05FRURTX01BVEhfSAorIyAgICAgIGlmIEVUSVBfTkVFRFNfTUFUSF9FWENFUFRJT04KKyMgICAgICAgIHVuZGVmIGV4Y2VwdGlvbgorIyAgICAgICAgZGVmaW5lIGV4Y2VwdGlvbiBtYXRoX2V4Y2VwdGlvbgorIyAgICAgIGVuZGlmCisjICAgICAgaW5jbHVkZSA8bWF0aC5oPgorIyAgICBlbmRpZgorIyAgICB1bmRlZiBleGNlcHRpb24KKyMgICAgZGVmaW5lIGV4Y2VwdGlvbiBidWlsdGluX2V4Y2VwdGlvbgorIyAgICBpZiBIQVZFX0dQUF9CVUlMVElOX0gKKyMgICAgIGluY2x1ZGUgPGdwcC9idWlsdGluLmg+CisjICAgIGVsaWYgSEFWRV9HWFhfQlVJTFRJTl9ICisjICAgICBpbmNsdWRlIDxnKysvYnVpbHRpbi5oPgorIyAgICBlbHNlCisjICAgICBpbmNsdWRlIDxidWlsdGluLmg+CisjICAgIGVuZGlmCisjICAgIHVuZGVmIGV4Y2VwdGlvbgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9fU1VOUFJPX0NDKQorIyAgaW5jbHVkZSA8Z2VuZXJpYy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuY3Vyc2VzX2RsbC5oPgorCitleHRlcm4gIkMiIHsKKyNpZiBIQVZFX1ZBTFVFU19ICisjICBpbmNsdWRlIDx2YWx1ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXRpLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KK30KKworLy8gTGFuZ3VhZ2UgZmVhdHVyZXMKKyNpZiBDUFBfSEFTX1BBUkFNX0lOSVQKKyNkZWZpbmUgTkNVUlNFU19QQVJBTV9JTklUKHZhbHVlKSA9IHZhbHVlCisjZWxzZQorI2RlZmluZSBOQ1VSU0VTX1BBUkFNX0lOSVQodmFsdWUpIC8qbm90aGluZyovCisjZW5kaWYKKworI2lmIENQUF9IQVNfU1RBVElDX0NBU1QKKyNkZWZpbmUgU1RBVElDX0NBU1Qocykgc3RhdGljX2Nhc3Q8cz4KKyNlbHNlCisjZGVmaW5lIFNUQVRJQ19DQVNUKHMpIChzKQorI2VuZGlmCisKKy8vIEZvcndhcmQgRGVjbGFyYXRpb25zCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzUGFuZWw7CitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzTWVudTsKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNGb3JtOworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzRXhjZXB0aW9uCit7CitwdWJsaWM6CisgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7CisgIGludCBlcnJvcm5vOworCisgIE5DdXJzZXNFeGNlcHRpb24gKGNvbnN0IGNoYXIqIG1zZywgaW50IGVycikKKyAgICA6IG1lc3NhZ2UobXNnKSwgZXJyb3JubyAoZXJyKQorICAgIHt9OworCisgIE5DdXJzZXNFeGNlcHRpb24gKGNvbnN0IGNoYXIqIG1zZykKKyAgICA6IG1lc3NhZ2UobXNnKSwgZXJyb3JubyAoRV9TWVNURU1fRVJST1IpCisgICAge307CisKKyAgTkN1cnNlc0V4Y2VwdGlvbiYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNFeGNlcHRpb24mIHJocykKKyAgeworICAgIGVycm9ybm8gPSByaHMuZXJyb3JubzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzRXhjZXB0aW9uKGNvbnN0IE5DdXJzZXNFeGNlcHRpb24mIHJocykKKyAgICA6IG1lc3NhZ2UocmhzLm1lc3NhZ2UpLCBlcnJvcm5vKHJocy5lcnJvcm5vKQorICB7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIk5DdXJzZXNXaW5kb3ciOworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc0V4Y2VwdGlvbigpCisgIHsKKyAgfQorfTsKKworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc1BhbmVsRXhjZXB0aW9uIDogcHVibGljIE5DdXJzZXNFeGNlcHRpb24KK3sKK3B1YmxpYzoKKyAgY29uc3QgTkN1cnNlc1BhbmVsKiBwOworCisgIE5DdXJzZXNQYW5lbEV4Y2VwdGlvbiAoY29uc3QgY2hhciAqbXNnLCBpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAobXNnLCBlcnIpLAorICAgIHAgKE5VTEwpCisgICAge307CisKKyAgTkN1cnNlc1BhbmVsRXhjZXB0aW9uIChjb25zdCBOQ3Vyc2VzUGFuZWwqIHBhbmVsLAorCQkJIGNvbnN0IGNoYXIgKm1zZywKKwkJCSBpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAobXNnLCBlcnIpLAorICAgIHAgKHBhbmVsKQorICAgIHt9OworCisgIE5DdXJzZXNQYW5lbEV4Y2VwdGlvbiAoaW50IGVycikgOgorICAgIE5DdXJzZXNFeGNlcHRpb24gKCJwYW5lbCBsaWJyYXJ5IGVycm9yIiwgZXJyKSwKKyAgICBwIChOVUxMKQorICAgIHt9OworCisgIE5DdXJzZXNQYW5lbEV4Y2VwdGlvbiAoY29uc3QgTkN1cnNlc1BhbmVsKiBwYW5lbCwKKwkJCSBpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAoInBhbmVsIGxpYnJhcnkgZXJyb3IiLCBlcnIpLAorICAgIHAgKHBhbmVsKQorICAgIHt9OworCisgIE5DdXJzZXNQYW5lbEV4Y2VwdGlvbiYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNQYW5lbEV4Y2VwdGlvbiYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgTkN1cnNlc0V4Y2VwdGlvbjo6b3BlcmF0b3I9KHJocyk7CisgICAgICBwID0gcmhzLnA7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNQYW5lbEV4Y2VwdGlvbihjb25zdCBOQ3Vyc2VzUGFuZWxFeGNlcHRpb24mIHJocykKKyAgICA6IE5DdXJzZXNFeGNlcHRpb24ocmhzKSwgcChyaHMucCkKKyAgeworICB9CisKKyAgdmlydHVhbCBjb25zdCBjaGFyICpjbGFzc25hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJOQ3Vyc2VzUGFuZWwiOworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc1BhbmVsRXhjZXB0aW9uKCkKKyAgeworICB9Cit9OworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzTWVudUV4Y2VwdGlvbiA6IHB1YmxpYyBOQ3Vyc2VzRXhjZXB0aW9uCit7CitwdWJsaWM6CisgIGNvbnN0IE5DdXJzZXNNZW51KiBtOworCisgIE5DdXJzZXNNZW51RXhjZXB0aW9uIChjb25zdCBjaGFyICptc2csIGludCBlcnIpIDoKKyAgICBOQ3Vyc2VzRXhjZXB0aW9uIChtc2csIGVyciksCisgICAgbSAoTlVMTCkKKyAgICB7fTsKKworICBOQ3Vyc2VzTWVudUV4Y2VwdGlvbiAoY29uc3QgTkN1cnNlc01lbnUqIG1lbnUsCisJCQljb25zdCBjaGFyICptc2csCisJCQlpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAobXNnLCBlcnIpLAorICAgIG0gKG1lbnUpCisgICAge307CisKKyAgTkN1cnNlc01lbnVFeGNlcHRpb24gKGludCBlcnIpIDoKKyAgICBOQ3Vyc2VzRXhjZXB0aW9uICgibWVudSBsaWJyYXJ5IGVycm9yIiwgZXJyKSwKKyAgICBtIChOVUxMKQorICAgIHt9OworCisgIE5DdXJzZXNNZW51RXhjZXB0aW9uIChjb25zdCBOQ3Vyc2VzTWVudSogbWVudSwKKwkJCWludCBlcnIpIDoKKyAgICBOQ3Vyc2VzRXhjZXB0aW9uICgibWVudSBsaWJyYXJ5IGVycm9yIiwgZXJyKSwKKyAgICBtIChtZW51KQorICAgIHt9OworCisgIE5DdXJzZXNNZW51RXhjZXB0aW9uJiBvcGVyYXRvcj0oY29uc3QgTkN1cnNlc01lbnVFeGNlcHRpb24mIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgIE5DdXJzZXNFeGNlcHRpb246Om9wZXJhdG9yPShyaHMpOworICAgICAgbSA9IHJocy5tOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzTWVudUV4Y2VwdGlvbihjb25zdCBOQ3Vyc2VzTWVudUV4Y2VwdGlvbiYgcmhzKQorICAgIDogTkN1cnNlc0V4Y2VwdGlvbihyaHMpLCBtKHJocy5tKQorICB7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIk5DdXJzZXNNZW51IjsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNNZW51RXhjZXB0aW9uKCkKKyAgeworICB9Cit9OworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbiA6IHB1YmxpYyBOQ3Vyc2VzRXhjZXB0aW9uCit7CitwdWJsaWM6CisgIGNvbnN0IE5DdXJzZXNGb3JtKiBmOworCisgIE5DdXJzZXNGb3JtRXhjZXB0aW9uIChjb25zdCBjaGFyICptc2csIGludCBlcnIpIDoKKyAgICBOQ3Vyc2VzRXhjZXB0aW9uIChtc2csIGVyciksCisgICAgZiAoTlVMTCkKKyAgICB7fTsKKworICBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbiAoY29uc3QgTkN1cnNlc0Zvcm0qIGZvcm0sCisJCQljb25zdCBjaGFyICptc2csCisJCQlpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAobXNnLCBlcnIpLAorICAgIGYgKGZvcm0pCisgICAge307CisKKyAgTkN1cnNlc0Zvcm1FeGNlcHRpb24gKGludCBlcnIpIDoKKyAgICBOQ3Vyc2VzRXhjZXB0aW9uICgiZm9ybSBsaWJyYXJ5IGVycm9yIiwgZXJyKSwKKyAgICBmIChOVUxMKQorICAgIHt9OworCisgIE5DdXJzZXNGb3JtRXhjZXB0aW9uIChjb25zdCBOQ3Vyc2VzRm9ybSogZm9ybSwKKwkJCWludCBlcnIpIDoKKyAgICBOQ3Vyc2VzRXhjZXB0aW9uICgiZm9ybSBsaWJyYXJ5IGVycm9yIiwgZXJyKSwKKyAgICBmIChmb3JtKQorICAgIHt9OworCisgIE5DdXJzZXNGb3JtRXhjZXB0aW9uJiBvcGVyYXRvcj0oY29uc3QgTkN1cnNlc0Zvcm1FeGNlcHRpb24mIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgIE5DdXJzZXNFeGNlcHRpb246Om9wZXJhdG9yPShyaHMpOworICAgICAgZiA9IHJocy5mOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbihjb25zdCBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbiYgcmhzKQorICAgIDogTkN1cnNlc0V4Y2VwdGlvbihyaHMpLCBmKHJocy5mKQorICB7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIk5DdXJzZXNGb3JtIjsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNGb3JtRXhjZXB0aW9uKCkKKyAgeworICB9Cit9OworCisjaWYgISgoZGVmaW5lZChfX0dOVUdfXykgJiYgZGVmaW5lZChfX0VYQ0VQVElPTlMpKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKSkKKyMgIGlmIEhBVkVfSU9TVFJFQU0KKyMgICAgIGluY2x1ZGUgPGlvc3RyZWFtPgorIyAgICAgaWYgSU9TVFJFQU1fTkFNRVNQQUNFCit1c2luZyBzdGQ6OmNlcnI7Cit1c2luZyBzdGQ6OmVuZGw7CisjICAgICBlbmRpZgorIyAgZWxzZQorIyAgICAgaW5jbHVkZSA8aW9zdHJlYW0uaD4KKyMgIGVuZGlmCisgICBleHRlcm4gIkMiIHZvaWQgZXhpdChpbnQpOworI2VuZGlmCisKK2lubGluZSB2b2lkIFRIUk9XKGNvbnN0IE5DdXJzZXNFeGNlcHRpb24gKmUpIHsKKyNpZiBkZWZpbmVkKF9fR05VR19fKSAmJiBkZWZpbmVkKF9fRVhDRVBUSU9OUykKKyMgIGlmICgoX19HTlVHX18gPD0gMikgJiYgKF9fR05VQ19NSU5PUl9fIDwgOCkpCisgICAgICAoKmxpYl9lcnJvcl9oYW5kbGVyKShlID8gZS0+Y2xhc3NuYW1lKCkgOiAiIiwgZSA/IGUtPm1lc3NhZ2UgOiAiIik7CisjZWxzZQorI2RlZmluZSBDUFBfSEFTX1RSWV9DQVRDSCAxCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQ0MpCisjICBpZiAhZGVmaW5lZChfX1NVTlBST19DQ19DT01QQVQpIHx8IChfX1NVTlBST19DQ19DT01QQVQgPCA1KQorICBnZW5lcmljZXJyb3IoMSwgKChlICE9IDApID8gKGNoYXIgKikoZS0+bWVzc2FnZSkgOiAiIikpOworI2Vsc2UKKyNkZWZpbmUgQ1BQX0hBU19UUllfQ0FUQ0ggMQorI2VuZGlmCisjZWxzZQorICBpZiAoZSkKKyAgICBjZXJyIDw8IGUtPm1lc3NhZ2UgPDwgZW5kbDsKKyAgZXhpdCgwKTsKKyNlbmRpZgorCisjaWZuZGVmIENQUF9IQVNfVFJZX0NBVENICisjZGVmaW5lIENQUF9IQVNfVFJZX0NBVENIIDAKKyNkZWZpbmUgTkNVUlNFU19DUFBfVFJZCQkvKiBub3RoaW5nICovCisjZGVmaW5lIE5DVVJTRVNfQ1BQX0NBVENIKGUpCWlmIChmYWxzZSkKKyNkZWZpbmUgVEhST1dTKHMpCQkvKiBub3RoaW5nICovCisjZWxpZiBDUFBfSEFTX1RSWV9DQVRDSAorICB0aHJvdyAqZTsKKyNkZWZpbmUgTkNVUlNFU19DUFBfVFJZCQl0cnkKKyNkZWZpbmUgTkNVUlNFU19DUFBfQ0FUQ0goZSkJY2F0Y2goZSkKKyNkZWZpbmUgVEhST1dTKHMpCQl0aHJvdyhzKQorI2VuZGlmCit9CisKKyNlbmRpZiAvKiBOQ1VSU0VTX0VUSVBfSF9pbmNsICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2V4ZWNpbmZvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2V4ZWNpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2MTRjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXhlY2luZm8uaApAQCAtMCwwICsxLDQ0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0VYRUNJTkZPX0gKKyNkZWZpbmUgX0VYRUNJTkZPX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBTdG9yZSB1cCB0byBTSVpFIHJldHVybiBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IHByb2dyYW0gc3RhdGUgaW4KKyAgIEFSUkFZIGFuZCByZXR1cm4gdGhlIGV4YWN0IG51bWJlciBvZiB2YWx1ZXMgc3RvcmVkLiAgKi8KK2V4dGVybiBpbnQgYmFja3RyYWNlICh2b2lkICoqX19hcnJheSwgaW50IF9fc2l6ZSkgX19ub25udWxsICgoMSkpOworCisKKy8qIFJldHVybiBuYW1lcyBvZiBmdW5jdGlvbnMgZnJvbSB0aGUgYmFja3RyYWNlIGxpc3QgaW4gQVJSQVkgaW4gYSBuZXdseQorICAgbWFsbG9jKCllZCBtZW1vcnkgYmxvY2suICAqLworZXh0ZXJuIGNoYXIgKipiYWNrdHJhY2Vfc3ltYm9scyAodm9pZCAqX19jb25zdCAqX19hcnJheSwgaW50IF9fc2l6ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKworLyogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIGJhY2t0cmFjZV9zeW1ib2xzKCkgYnV0IGl0IHdyaXRlcyB0aGUgcmVzdWx0CisgICBpbW1lZGlhdGVseSB0byBhIGZpbGUuICAqLworZXh0ZXJuIHZvaWQgYmFja3RyYWNlX3N5bWJvbHNfZmQgKHZvaWQgKl9fY29uc3QgKl9fYXJyYXksIGludCBfX3NpemUsIGludCBfX2ZkKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGV4ZWNpbmZvLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2ZjbnRsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2ZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyMTgwMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZmNudGwuaApAQCAtMCwwICsxLDI1NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDE5OTIsMTk5NC0yMDAxLDIwMDMsMjAwNCwyMDA1LDIwMDYsMjAwNywyMDA5LDIwMTAsMjAxMQorCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDYuNSBGaWxlIENvbnRyb2wgT3BlcmF0aW9ucwk8ZmNudGwuaD4KKyAqLworCisjaWZuZGVmCV9GQ05UTF9ICisjZGVmaW5lCV9GQ05UTF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIFRoaXMgbXVzdCBiZSBlYXJseSBzbyA8Yml0cy9mY250bC5oPiBjYW4gZGVmaW5lIHR5cGVzIHdpbm5pbmdseS4gICovCitfX0JFR0lOX0RFQ0xTCisKKy8qIEdldCB0aGUgZGVmaW5pdGlvbnMgb2YgT18qLCBGXyosIEZEXyo6IGFsbCB0aGUKKyAgIG51bWJlcnMgYW5kIGZsYWcgYml0cyBmb3IgYG9wZW4nLCBgZmNudGwnLCBldCBhbC4gICovCisjaW5jbHVkZSA8Yml0cy9mY250bC5oPgorCisvKiBGb3IgWFBHIGFsbCBzeW1ib2xzIGZyb20gPHN5cy9zdGF0Lmg+IHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisjIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4gICAgICAgICAvKiBGb3IgX19tb2RlX3QgYW5kIF9fZGV2X3QuICAqLworIyBkZWZpbmUgX19uZWVkX3RpbWVzcGVjCisjIGluY2x1ZGUgPHRpbWUuaD4KKyMgaW5jbHVkZSA8Yml0cy9zdGF0Lmg+CisKKyMgZGVmaW5lIFNfSUZNVAkJX19TX0lGTVQKKyMgZGVmaW5lIFNfSUZESVIJX19TX0lGRElSCisjIGRlZmluZSBTX0lGQ0hSCV9fU19JRkNIUgorIyBkZWZpbmUgU19JRkJMSwlfX1NfSUZCTEsKKyMgZGVmaW5lIFNfSUZSRUcJX19TX0lGUkVHCisjIGlmZGVmIF9fU19JRklGTworIyAgZGVmaW5lIFNfSUZJRk8JX19TX0lGSUZPCisjIGVuZGlmCisjIGlmZGVmIF9fU19JRkxOSworIyAgZGVmaW5lIFNfSUZMTksJX19TX0lGTE5LCisjIGVuZGlmCisjIGlmIChkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4KSAmJiBkZWZpbmVkIF9fU19JRlNPQ0sKKyMgIGRlZmluZSBTX0lGU09DSwlfX1NfSUZTT0NLCisjIGVuZGlmCisKKy8qIFByb3RlY3Rpb24gYml0cy4gICovCisKKyMgZGVmaW5lIFNfSVNVSUQJX19TX0lTVUlEICAgICAgIC8qIFNldCB1c2VyIElEIG9uIGV4ZWN1dGlvbi4gICovCisjIGRlZmluZSBTX0lTR0lECV9fU19JU0dJRCAgICAgICAvKiBTZXQgZ3JvdXAgSUQgb24gZXhlY3V0aW9uLiAgKi8KKworIyBpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorLyogU2F2ZSBzd2FwcGVkIHRleHQgYWZ0ZXIgdXNlIChzdGlja3kgYml0KS4gIFRoaXMgaXMgcHJldHR5IHdlbGwgb2Jzb2xldGUuICAqLworIyAgZGVmaW5lIFNfSVNWVFgJX19TX0lTVlRYCisjIGVuZGlmCisKKyMgZGVmaW5lIFNfSVJVU1IJX19TX0lSRUFEICAgICAgIC8qIFJlYWQgYnkgb3duZXIuICAqLworIyBkZWZpbmUgU19JV1VTUglfX1NfSVdSSVRFICAgICAgLyogV3JpdGUgYnkgb3duZXIuICAqLworIyBkZWZpbmUgU19JWFVTUglfX1NfSUVYRUMgICAgICAgLyogRXhlY3V0ZSBieSBvd25lci4gICovCisvKiBSZWFkLCB3cml0ZSwgYW5kIGV4ZWN1dGUgYnkgb3duZXIuICAqLworIyBkZWZpbmUgU19JUldYVQkoX19TX0lSRUFEfF9fU19JV1JJVEV8X19TX0lFWEVDKQorCisjIGRlZmluZSBTX0lSR1JQCShTX0lSVVNSID4+IDMpICAvKiBSZWFkIGJ5IGdyb3VwLiAgKi8KKyMgZGVmaW5lIFNfSVdHUlAJKFNfSVdVU1IgPj4gMykgIC8qIFdyaXRlIGJ5IGdyb3VwLiAgKi8KKyMgZGVmaW5lIFNfSVhHUlAJKFNfSVhVU1IgPj4gMykgIC8qIEV4ZWN1dGUgYnkgZ3JvdXAuICAqLworLyogUmVhZCwgd3JpdGUsIGFuZCBleGVjdXRlIGJ5IGdyb3VwLiAgKi8KKyMgZGVmaW5lIFNfSVJXWEcJKFNfSVJXWFUgPj4gMykKKworIyBkZWZpbmUgU19JUk9USAkoU19JUkdSUCA+PiAzKSAgLyogUmVhZCBieSBvdGhlcnMuICAqLworIyBkZWZpbmUgU19JV09USAkoU19JV0dSUCA+PiAzKSAgLyogV3JpdGUgYnkgb3RoZXJzLiAgKi8KKyMgZGVmaW5lIFNfSVhPVEgJKFNfSVhHUlAgPj4gMykgIC8qIEV4ZWN1dGUgYnkgb3RoZXJzLiAgKi8KKy8qIFJlYWQsIHdyaXRlLCBhbmQgZXhlY3V0ZSBieSBvdGhlcnMuICAqLworIyBkZWZpbmUgU19JUldYTwkoU19JUldYRyA+PiAzKQorI2VuZGlmCisKKyNpZmRlZglfX1VTRV9NSVNDCisjIGlmbmRlZiBSX09LCQkJLyogVmVyYmF0aW0gZnJvbSA8dW5pc3RkLmg+LiAgVWdoLiAgKi8KKy8qIFZhbHVlcyBmb3IgdGhlIHNlY29uZCBhcmd1bWVudCB0byBhY2Nlc3MuCisgICBUaGVzZSBtYXkgYmUgT1InZCB0b2dldGhlci4gICovCisjICBkZWZpbmUgUl9PSwk0CQkvKiBUZXN0IGZvciByZWFkIHBlcm1pc3Npb24uICAqLworIyAgZGVmaW5lIFdfT0sJMgkJLyogVGVzdCBmb3Igd3JpdGUgcGVybWlzc2lvbi4gICovCisjICBkZWZpbmUgWF9PSwkxCQkvKiBUZXN0IGZvciBleGVjdXRlIHBlcm1pc3Npb24uICAqLworIyAgZGVmaW5lIEZfT0sJMAkJLyogVGVzdCBmb3IgZXhpc3RlbmNlLiAgKi8KKyMgZW5kaWYKKyNlbmRpZiAvKiBVc2UgbWlzYy4gICovCisKKy8qIFhQRyB3YW50cyB0aGUgZm9sbG93aW5nIHN5bWJvbHMuICAgPHN0ZGlvLmg+IGhhcyB0aGUgc2FtZSBkZWZpbml0aW9ucy4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisjIGRlZmluZSBTRUVLX1NFVAkwCS8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjIGRlZmluZSBTRUVLX0NVUgkxCS8qIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KKyMgZGVmaW5lIFNFRUtfRU5ECTIJLyogU2VlayBmcm9tIGVuZCBvZiBmaWxlLiAgKi8KKyNlbmRpZgkvKiBYUEcgKi8KKworLyogRG8gdGhlIGZpbGUgY29udHJvbCBvcGVyYXRpb24gZGVzY3JpYmVkIGJ5IENNRCBvbiBGRC4KKyAgIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBpbnRlcnByZXRlZCBkZXBlbmRpbmcgb24gQ01ELgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmNudGwgKGludCBfX2ZkLCBpbnQgX19jbWQsIC4uLik7CisKKy8qIE9wZW4gRklMRSBhbmQgcmV0dXJuIGEgbmV3IGZpbGUgZGVzY3JpcHRvciBmb3IgaXQsIG9yIC0xIG9uIGVycm9yLgorICAgT0ZMQUcgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiBhY2Nlc3MgdXNlZC4gIElmIE9fQ1JFQVQgaXMgb24gT0ZMQUcsCisgICB0aGUgdGhpcmQgYXJndW1lbnQgaXMgdGFrZW4gYXMgYSBgbW9kZV90JywgdGhlIG1vZGUgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgb3BlbiAoX19jb25zdCBjaGFyICpfX2ZpbGUsIGludCBfX29mbGFnLCAuLi4pIF9fbm9ubnVsbCAoKDEpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAob3BlbiwgKF9fY29uc3QgY2hhciAqX19maWxlLCBpbnQgX19vZmxhZywgLi4uKSwgb3BlbjY0KQorICAgICBfX25vbm51bGwgKCgxKSk7CisjIGVsc2UKKyMgIGRlZmluZSBvcGVuIG9wZW42NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgb3BlbjY0IChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgaW50IF9fb2ZsYWcsIC4uLikgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIFNpbWlsYXIgdG8gYG9wZW4nIGJ1dCBhIHJlbGF0aXZlIHBhdGggbmFtZSBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0bworICAgdGhlIGRpcmVjdG9yeSBmb3Igd2hpY2ggRkQgaXMgYSBkZXNjcmlwdG9yLgorCisgICBOT1RFOiBzb21lIG90aGVyIGBvcGVuYXQnIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5CisgICB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlLCBlc3BlY2lhbGx5IHVzaW5nIHRoZSBPX1hBVFRSIGZsYWcuICBUaGlzIGlzIG5vdAorICAgeWV0IHN1cHBvcnRlZCBoZXJlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgb3BlbmF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX2ZpbGUsIGludCBfX29mbGFnLCAuLi4pCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChvcGVuYXQsIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX2ZpbGUsIGludCBfX29mbGFnLAorCQkJCS4uLiksIG9wZW5hdDY0KSBfX25vbm51bGwgKCgyKSk7CisjICBlbHNlCisjICAgZGVmaW5lIG9wZW5hdCBvcGVuYXQ2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgb3BlbmF0NjQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwgaW50IF9fb2ZsYWcsIC4uLikKKyAgICAgX19ub25udWxsICgoMikpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIENyZWF0ZSBhbmQgb3BlbiBGSUxFLCB3aXRoIG1vZGUgTU9ERS4gIFRoaXMgdGFrZXMgYW4gYGludCcgTU9ERQorICAgYXJndW1lbnQgYmVjYXVzZSB0aGF0IGlzIHdoYXQgYG1vZGVfdCcgd2lsbCBiZSB3aWRlbmVkIHRvLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBjcmVhdCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fbW9kZV90IF9fbW9kZSkgX19ub25udWxsICgoMSkpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChjcmVhdCwgKF9fY29uc3QgY2hhciAqX19maWxlLCBfX21vZGVfdCBfX21vZGUpLAorCQkgICAgICAgY3JlYXQ2NCkgX19ub25udWxsICgoMSkpOworIyBlbHNlCisjICBkZWZpbmUgY3JlYXQgY3JlYXQ2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgY3JlYXQ2NCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fbW9kZV90IF9fbW9kZSkgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCBGX0xPQ0sgJiYgKGRlZmluZWQgX19VU0VfTUlTQyB8fCAoZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCBcCisJCQkJCSAgICAgICAmJiAhZGVmaW5lZCBfX1VTRV9QT1NJWCkpCisvKiBOT1RFOiBUaGVzZSBkZWNsYXJhdGlvbnMgYWxzbyBhcHBlYXIgaW4gPHVuaXN0ZC5oPjsgYmUgc3VyZSB0byBrZWVwIGJvdGgKKyAgIGZpbGVzIGNvbnNpc3RlbnQuICBTb21lIHN5c3RlbXMgaGF2ZSB0aGVtIHRoZXJlIGFuZCBzb21lIGhlcmUsIGFuZCBzb21lCisgICBzb2Z0d2FyZSBkZXBlbmRzIG9uIHRoZSBtYWNyb3MgYmVpbmcgZGVmaW5lZCB3aXRob3V0IGluY2x1ZGluZyBib3RoLiAgKi8KKworLyogYGxvY2tmJyBpcyBhIHNpbXBsZXIgaW50ZXJmYWNlIHRvIHRoZSBsb2NraW5nIGZhY2lsaXRpZXMgb2YgYGZjbnRsJy4KKyAgIExFTiBpcyBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbi4KKyAgIFRoZSBDTUQgYXJndW1lbnQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcuICAqLworCisjIGRlZmluZSBGX1VMT0NLIDAJLyogVW5sb2NrIGEgcHJldmlvdXNseSBsb2NrZWQgcmVnaW9uLiAgKi8KKyMgZGVmaW5lIEZfTE9DSyAgMQkvKiBMb2NrIGEgcmVnaW9uIGZvciBleGNsdXNpdmUgdXNlLiAgKi8KKyMgZGVmaW5lIEZfVExPQ0sgMgkvKiBUZXN0IGFuZCBsb2NrIGEgcmVnaW9uIGZvciBleGNsdXNpdmUgdXNlLiAgKi8KKyMgZGVmaW5lIEZfVEVTVCAgMwkvKiBUZXN0IGEgcmVnaW9uIGZvciBvdGhlciBwcm9jZXNzZXMgbG9ja3MuICAqLworCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGxvY2tmIChpbnQgX19mZCwgaW50IF9fY21kLCBfX29mZl90IF9fbGVuKTsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChsb2NrZiwgKGludCBfX2ZkLCBpbnQgX19jbWQsIF9fb2ZmNjRfdCBfX2xlbiksIGxvY2tmNjQpOworIyAgZWxzZQorIyAgIGRlZmluZSBsb2NrZiBsb2NrZjY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBsb2NrZjY0IChpbnQgX19mZCwgaW50IF9fY21kLCBfX29mZjY0X3QgX19sZW4pOworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBBZHZpY2UgdGhlIHN5c3RlbSBhYm91dCB0aGUgZXhwZWN0ZWQgYmVoYXZpb3VyIG9mIHRoZSBhcHBsaWNhdGlvbiB3aXRoCisgICByZXNwZWN0IHRvIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBGRC4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHBvc2l4X2ZhZHZpc2UgKGludCBfX2ZkLCBfX29mZl90IF9fb2Zmc2V0LCBfX29mZl90IF9fbGVuLAorCQkJICBpbnQgX19hZHZpc2UpIF9fVEhST1c7CisjIGVsc2UKKyAjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChwb3NpeF9mYWR2aXNlLCAoaW50IF9fZmQsIF9fb2ZmNjRfdCBfX29mZnNldCwKKwkJCQkJICAgX19vZmY2NF90IF9fbGVuLCBpbnQgX19hZHZpc2UpLAorCQkJICAgcG9zaXhfZmFkdmlzZTY0KTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgcG9zaXhfZmFkdmlzZSBwb3NpeF9mYWR2aXNlNjQKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IHBvc2l4X2ZhZHZpc2U2NCAoaW50IF9fZmQsIF9fb2ZmNjRfdCBfX29mZnNldCwgX19vZmY2NF90IF9fbGVuLAorCQkJICAgIGludCBfX2FkdmlzZSkgX19USFJPVzsKKyMgZW5kaWYKKworCisvKiBSZXNlcnZlIHN0b3JhZ2UgZm9yIHRoZSBkYXRhIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBGRC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHBvc2l4X2ZhbGxvY2F0ZSAoaW50IF9fZmQsIF9fb2ZmX3QgX19vZmZzZXQsIF9fb2ZmX3QgX19sZW4pOworIyBlbHNlCisgIyBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKHBvc2l4X2ZhbGxvY2F0ZSwgKGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQsCisJCQkJCSBfX29mZjY0X3QgX19sZW4pLAorCQkgICAgICAgcG9zaXhfZmFsbG9jYXRlNjQpOworIyAgZWxzZQorIyAgIGRlZmluZSBwb3NpeF9mYWxsb2NhdGUgcG9zaXhfZmFsbG9jYXRlNjQKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IHBvc2l4X2ZhbGxvY2F0ZTY0IChpbnQgX19mZCwgX19vZmY2NF90IF9fb2Zmc2V0LCBfX29mZjY0X3QgX19sZW4pOworIyBlbmRpZgorI2VuZGlmCisKKworLyogRGVmaW5lIHNvbWUgaW5saW5lcyBoZWxwaW5nIHRvIGNhdGNoIGNvbW1vbiBwcm9ibGVtcy4gICovCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lIFwKKyAgICAmJiBkZWZpbmVkIF9fdmFfYXJnX3BhY2tfbGVuCisjIGluY2x1ZGUgPGJpdHMvZmNudGwyLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGZjbnRsLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0ZGMzMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaApAQCAtMCwwICsxLDM5MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTMsMTk5NS0yMDA3LDIwMDksMjAxMCwyMDExCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfRkVBVFVSRVNfSAorI2RlZmluZQlfRkVBVFVSRVNfSAkxCisKKy8qIFRoZXNlIGFyZSBkZWZpbmVkIGJ5IHRoZSB1c2VyIChvciB0aGUgY29tcGlsZXIpCisgICB0byBzcGVjaWZ5IHRoZSBkZXNpcmVkIGVudmlyb25tZW50OgorCisgICBfX1NUUklDVF9BTlNJX18JSVNPIFN0YW5kYXJkIEMuCisgICBfSVNPQzk5X1NPVVJDRQlFeHRlbnNpb25zIHRvIElTTyBDODkgZnJvbSBJU08gQzk5LgorICAgX1BPU0lYX1NPVVJDRQlJRUVFIFN0ZCAxMDAzLjEuCisgICBfUE9TSVhfQ19TT1VSQ0UJSWYgPT0xLCBsaWtlIF9QT1NJWF9TT1VSQ0U7IGlmID49MiBhZGQgSUVFRSBTdGQgMTAwMy4yOworCQkJaWYgPj0xOTkzMDlMLCBhZGQgSUVFRSBTdGQgMTAwMy4xYi0xOTkzOworCQkJaWYgPj0xOTk1MDZMLCBhZGQgSUVFRSBTdGQgMTAwMy4xYy0xOTk1OworCQkJaWYgPj0yMDAxMTJMLCBhbGwgb2YgSUVFRSAxMDAzLjEtMjAwNAorCQkJaWYgPj0yMDA4MDlMLCBhbGwgb2YgSUVFRSAxMDAzLjEtMjAwOAorICAgX1hPUEVOX1NPVVJDRQlJbmNsdWRlcyBQT1NJWCBhbmQgWFBHIHRoaW5ncy4gIFNldCB0byA1MDAgaWYKKwkJCVNpbmdsZSBVbml4IGNvbmZvcm1hbmNlIGlzIHdhbnRlZCwgdG8gNjAwIGZvciB0aGUKKwkJCXNpeHRoIHJldmlzaW9uLCB0byA3MDAgZm9yIHRoZSBzZXZlbnRoIHJldmlzaW9uLgorICAgX1hPUEVOX1NPVVJDRV9FWFRFTkRFRCBYUEcgdGhpbmdzIGFuZCBYL09wZW4gVW5peCBleHRlbnNpb25zLgorICAgX0xBUkdFRklMRV9TT1VSQ0UJU29tZSBtb3JlIGZ1bmN0aW9ucyBmb3IgY29ycmVjdCBzdGFuZGFyZCBJL08uCisgICBfTEFSR0VGSUxFNjRfU09VUkNFCUFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBmcm9tIExGUyBmb3IgbGFyZ2UgZmlsZXMuCisgICBfRklMRV9PRkZTRVRfQklUUz1OCVNlbGVjdCBkZWZhdWx0IGZpbGVzeXN0ZW0gaW50ZXJmYWNlLgorICAgX0JTRF9TT1VSQ0UJCUlTTyBDLCBQT1NJWCwgYW5kIDQuM0JTRCB0aGluZ3MuCisgICBfU1ZJRF9TT1VSQ0UJCUlTTyBDLCBQT1NJWCwgYW5kIFNWSUQgdGhpbmdzLgorICAgX0FURklMRV9TT1VSQ0UJQWRkaXRpb25hbCAqYXQgaW50ZXJmYWNlcy4KKyAgIF9HTlVfU09VUkNFCQlBbGwgb2YgdGhlIGFib3ZlLCBwbHVzIEdOVSBleHRlbnNpb25zLgorICAgX1JFRU5UUkFOVAkJU2VsZWN0IGFkZGl0aW9uYWxseSByZWVudHJhbnQgb2JqZWN0LgorICAgX1RIUkVBRF9TQUZFCQlTYW1lIGFzIF9SRUVOVFJBTlQsIG9mdGVuIHVzZWQgYnkgb3RoZXIgc3lzdGVtcy4KKyAgIF9GT1JUSUZZX1NPVVJDRQlJZiBzZXQgdG8gbnVtZXJpYyB2YWx1ZSA+IDAgYWRkaXRpb25hbCBzZWN1cml0eQorCQkJbWVhc3VyZXMgYXJlIGRlZmluZWQsIGFjY29yZGluZyB0byBsZXZlbC4KKworICAgVGhlIGAtYW5zaScgc3dpdGNoIHRvIHRoZSBHTlUgQyBjb21waWxlciBkZWZpbmVzIF9fU1RSSUNUX0FOU0lfXy4KKyAgIElmIG5vbmUgb2YgdGhlc2UgYXJlIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIHRvIGhhdmUgX1NWSURfU09VUkNFLAorICAgX0JTRF9TT1VSQ0UsIGFuZCBfUE9TSVhfU09VUkNFIHNldCB0byBvbmUgYW5kIF9QT1NJWF9DX1NPVVJDRSBzZXQgdG8KKyAgIDIwMDExMkwuICBJZiBtb3JlIHRoYW4gb25lIG9mIHRoZXNlIGFyZSBkZWZpbmVkLCB0aGV5IGFjY3VtdWxhdGUuCisgICBGb3IgZXhhbXBsZSBfX1NUUklDVF9BTlNJX18sIF9QT1NJWF9TT1VSQ0UgYW5kIF9QT1NJWF9DX1NPVVJDRQorICAgdG9nZXRoZXIgZ2l2ZSB5b3UgSVNPIEMsIDEwMDMuMSwgYW5kIDEwMDMuMiwgYnV0IG5vdGhpbmcgZWxzZS4KKworICAgVGhlc2UgYXJlIGRlZmluZWQgYnkgdGhpcyBmaWxlIGFuZCBhcmUgdXNlZCBieSB0aGUKKyAgIGhlYWRlciBmaWxlcyB0byBkZWNpZGUgd2hhdCB0byBkZWNsYXJlIG9yIGRlZmluZToKKworICAgX19VU0VfSVNPQzk5CQlEZWZpbmUgSVNPIEM5OSB0aGluZ3MuCisgICBfX1VTRV9JU09DOTUJCURlZmluZSBJU08gQzkwIEFNRDEgKEM5NSkgdGhpbmdzLgorICAgX19VU0VfUE9TSVgJCURlZmluZSBJRUVFIFN0ZCAxMDAzLjEgdGhpbmdzLgorICAgX19VU0VfUE9TSVgyCQlEZWZpbmUgSUVFRSBTdGQgMTAwMy4yIHRoaW5ncy4KKyAgIF9fVVNFX1BPU0lYMTk5MzA5CURlZmluZSBJRUVFIFN0ZCAxMDAzLjEsIGFuZCAuMWIgdGhpbmdzLgorICAgX19VU0VfUE9TSVgxOTk1MDYJRGVmaW5lIElFRUUgU3RkIDEwMDMuMSwgLjFiLCAuMWMgYW5kIC4xaSB0aGluZ3MuCisgICBfX1VTRV9YT1BFTgkJRGVmaW5lIFhQRyB0aGluZ3MuCisgICBfX1VTRV9YT1BFTl9FWFRFTkRFRAlEZWZpbmUgWC9PcGVuIFVuaXggdGhpbmdzLgorICAgX19VU0VfVU5JWDk4CQlEZWZpbmUgU2luZ2xlIFVuaXggVjIgdGhpbmdzLgorICAgX19VU0VfWE9QRU4ySyAgICAgICAgRGVmaW5lIFhQRzYgdGhpbmdzLgorICAgX19VU0VfWE9QRU4yS1hTSSAgICAgRGVmaW5lIFhQRzYgWFNJIHRoaW5ncy4KKyAgIF9fVVNFX1hPUEVOMks4ICAgICAgIERlZmluZSBYUEc3IHRoaW5ncy4KKyAgIF9fVVNFX1hPUEVOMks4WFNJICAgIERlZmluZSBYUEc3IFhTSSB0aGluZ3MuCisgICBfX1VTRV9MQVJHRUZJTEUJRGVmaW5lIGNvcnJlY3Qgc3RhbmRhcmQgSS9PIHRoaW5ncy4KKyAgIF9fVVNFX0xBUkdFRklMRTY0CURlZmluZSBMRlMgdGhpbmdzIHdpdGggc2VwYXJhdGUgbmFtZXMuCisgICBfX1VTRV9GSUxFX09GRlNFVDY0CURlZmluZSA2NGJpdCBpbnRlcmZhY2UgYXMgZGVmYXVsdC4KKyAgIF9fVVNFX0JTRAkJRGVmaW5lIDQuM0JTRCB0aGluZ3MuCisgICBfX1VTRV9TVklECQlEZWZpbmUgU1ZJRCB0aGluZ3MuCisgICBfX1VTRV9NSVNDCQlEZWZpbmUgdGhpbmdzIGNvbW1vbiB0byBCU0QgYW5kIFN5c3RlbSBWIFVuaXguCisgICBfX1VTRV9BVEZJTEUJCURlZmluZSAqYXQgaW50ZXJmYWNlcyBhbmQgQVRfKiBjb25zdGFudHMgZm9yIHRoZW0uCisgICBfX1VTRV9HTlUJCURlZmluZSBHTlUgZXh0ZW5zaW9ucy4KKyAgIF9fVVNFX1JFRU5UUkFOVAlEZWZpbmUgcmVlbnRyYW50L3RocmVhZC1zYWZlICpfciBmdW5jdGlvbnMuCisgICBfX1VTRV9GT1JUSUZZX0xFVkVMCUFkZGl0aW9uYWwgc2VjdXJpdHkgbWVhc3VyZXMgdXNlZCwgYWNjb3JkaW5nIHRvIGxldmVsLgorICAgX19GQVZPUl9CU0QJCUZhdm9yIDQuM0JTRCB0aGluZ3MgaW4gY2FzZXMgb2YgY29uZmxpY3QuCisKKyAgIFRoZSBtYWNyb3MgYF9fR05VX0xJQlJBUllfXycsIGBfX0dMSUJDX18nLCBhbmQgYF9fR0xJQkNfTUlOT1JfXycgYXJlCisgICBkZWZpbmVkIGJ5IHRoaXMgZmlsZSB1bmNvbmRpdGlvbmFsbHkuICBgX19HTlVfTElCUkFSWV9fJyBpcyBwcm92aWRlZAorICAgb25seSBmb3IgY29tcGF0aWJpbGl0eS4gIEFsbCBuZXcgY29kZSBzaG91bGQgdXNlIHRoZSBvdGhlciBzeW1ib2xzCisgICB0byB0ZXN0IGZvciBmZWF0dXJlcy4KKworICAgQWxsIG1hY3JvcyBsaXN0ZWQgYWJvdmUgYXMgcG9zc2libHkgYmVpbmcgZGVmaW5lZCBieSB0aGlzIGZpbGUgYXJlCisgICBleHBsaWNpdGx5IHVuZGVmaW5lZCBpZiB0aGV5IGFyZSBub3QgZXhwbGljaXRseSBkZWZpbmVkLgorICAgRmVhdHVyZS10ZXN0IG1hY3JvcyB0aGF0IGFyZSBub3QgZGVmaW5lZCBieSB0aGUgdXNlciBvciBjb21waWxlcgorICAgYnV0IGFyZSBpbXBsaWVkIGJ5IHRoZSBvdGhlciBmZWF0dXJlLXRlc3QgbWFjcm9zIGRlZmluZWQgKG9yIGJ5IHRoZQorICAgbGFjayBvZiBhbnkgZGVmaW5pdGlvbnMpIGFyZSBkZWZpbmVkIGJ5IHRoZSBmaWxlLiAgKi8KKworCisvKiBVbmRlZmluZSBldmVyeXRoaW5nLCBzbyB3ZSBnZXQgYSBjbGVhbiBzbGF0ZS4gICovCisjdW5kZWYJX19VU0VfSVNPQzk5CisjdW5kZWYJX19VU0VfSVNPQzk1CisjdW5kZWYJX19VU0VfUE9TSVgKKyN1bmRlZglfX1VTRV9QT1NJWDIKKyN1bmRlZglfX1VTRV9QT1NJWDE5OTMwOQorI3VuZGVmCV9fVVNFX1BPU0lYMTk5NTA2CisjdW5kZWYJX19VU0VfWE9QRU4KKyN1bmRlZglfX1VTRV9YT1BFTl9FWFRFTkRFRAorI3VuZGVmCV9fVVNFX1VOSVg5OAorI3VuZGVmCV9fVVNFX1hPUEVOMksKKyN1bmRlZglfX1VTRV9YT1BFTjJLWFNJCisjdW5kZWYJX19VU0VfWE9QRU4ySzgKKyN1bmRlZglfX1VTRV9YT1BFTjJLOFhTSQorI3VuZGVmCV9fVVNFX0xBUkdFRklMRQorI3VuZGVmCV9fVVNFX0xBUkdFRklMRTY0CisjdW5kZWYJX19VU0VfRklMRV9PRkZTRVQ2NAorI3VuZGVmCV9fVVNFX0JTRAorI3VuZGVmCV9fVVNFX1NWSUQKKyN1bmRlZglfX1VTRV9NSVNDCisjdW5kZWYJX19VU0VfQVRGSUxFCisjdW5kZWYJX19VU0VfR05VCisjdW5kZWYJX19VU0VfUkVFTlRSQU5UCisjdW5kZWYJX19VU0VfRk9SVElGWV9MRVZFTAorI3VuZGVmCV9fRkFWT1JfQlNECisjdW5kZWYJX19LRVJORUxfU1RSSUNUX05BTUVTCisKKy8qIFN1cHByZXNzIGtlcm5lbC1uYW1lIHNwYWNlIHBvbGx1dGlvbiB1bmxlc3MgdXNlciBleHByZXNzZWRseSBhc2tzCisgICBmb3IgaXQuICAqLworI2lmbmRlZiBfTE9PU0VfS0VSTkVMX05BTUVTCisjIGRlZmluZSBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMKKyNlbmRpZgorCisvKiBBbHdheXMgdXNlIElTTyBDIHRoaW5ncy4gICovCisjZGVmaW5lCV9fVVNFX0FOU0kJMQorCisvKiBDb252ZW5pZW5jZSBtYWNyb3MgdG8gdGVzdCB0aGUgdmVyc2lvbnMgb2YgZ2xpYmMgYW5kIGdjYy4KKyAgIFVzZSB0aGVtIGxpa2UgdGhpczoKKyAgICNpZiBfX0dOVUNfUFJFUkVRICgyLDgpCisgICAuLi4gY29kZSByZXF1aXJpbmcgZ2NjIDIuOCBvciBsYXRlciAuLi4KKyAgICNlbmRpZgorICAgTm90ZSAtIHRoZXkgd29uJ3Qgd29yayBmb3IgZ2NjMSBvciBnbGliYzEsIHNpbmNlIHRoZSBfTUlOT1IgbWFjcm9zCisgICB3ZXJlIG5vdCBkZWZpbmVkIHRoZW4uICAqLworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgZGVmaW5lZCBfX0dOVUNfTUlOT1JfXworIyBkZWZpbmUgX19HTlVDX1BSRVJFUShtYWosIG1pbikgXAorCSgoX19HTlVDX18gPDwgMTYpICsgX19HTlVDX01JTk9SX18gPj0gKChtYWopIDw8IDE2KSArIChtaW4pKQorI2Vsc2UKKyMgZGVmaW5lIF9fR05VQ19QUkVSRVEobWFqLCBtaW4pIDAKKyNlbmRpZgorCisKKy8qIElmIF9CU0RfU09VUkNFIHdhcyBkZWZpbmVkIGJ5IHRoZSB1c2VyLCBmYXZvciBCU0Qgb3ZlciBQT1NJWC4gICovCisjaWYgZGVmaW5lZCBfQlNEX1NPVVJDRSAmJiBcCisgICAgIShkZWZpbmVkIF9QT1NJWF9TT1VSQ0UgfHwgZGVmaW5lZCBfUE9TSVhfQ19TT1VSQ0UgfHwgXAorICAgICAgZGVmaW5lZCBfWE9QRU5fU09VUkNFIHx8IGRlZmluZWQgX0dOVV9TT1VSQ0UgfHwgZGVmaW5lZCBfU1ZJRF9TT1VSQ0UpCisjIGRlZmluZSBfX0ZBVk9SX0JTRAkxCisjZW5kaWYKKworLyogSWYgX0dOVV9TT1VSQ0Ugd2FzIGRlZmluZWQgYnkgdGhlIHVzZXIsIHR1cm4gb24gYWxsIHRoZSBvdGhlciBmZWF0dXJlcy4gICovCisjaWZkZWYgX0dOVV9TT1VSQ0UKKyMgdW5kZWYgIF9JU09DOTVfU09VUkNFCisjIGRlZmluZSBfSVNPQzk1X1NPVVJDRQkxCisjIHVuZGVmICBfSVNPQzk5X1NPVVJDRQorIyBkZWZpbmUgX0lTT0M5OV9TT1VSQ0UJMQorIyB1bmRlZiAgX1BPU0lYX1NPVVJDRQorIyBkZWZpbmUgX1BPU0lYX1NPVVJDRQkxCisjIHVuZGVmICBfUE9TSVhfQ19TT1VSQ0UKKyMgZGVmaW5lIF9QT1NJWF9DX1NPVVJDRQkyMDA4MDlMCisjIHVuZGVmICBfWE9QRU5fU09VUkNFCisjIGRlZmluZSBfWE9QRU5fU09VUkNFCTcwMAorIyB1bmRlZiAgX1hPUEVOX1NPVVJDRV9FWFRFTkRFRAorIyBkZWZpbmUgX1hPUEVOX1NPVVJDRV9FWFRFTkRFRAkxCisjIHVuZGVmCSBfTEFSR0VGSUxFNjRfU09VUkNFCisjIGRlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFCTEKKyMgdW5kZWYgIF9CU0RfU09VUkNFCisjIGRlZmluZSBfQlNEX1NPVVJDRQkxCisjIHVuZGVmICBfU1ZJRF9TT1VSQ0UKKyMgZGVmaW5lIF9TVklEX1NPVVJDRQkxCisjIHVuZGVmICBfQVRGSUxFX1NPVVJDRQorIyBkZWZpbmUgX0FURklMRV9TT1VSQ0UJMQorI2VuZGlmCisKKy8qIElmIG5vdGhpbmcgKG90aGVyIHRoYW4gX0dOVV9TT1VSQ0UpIGlzIGRlZmluZWQsCisgICBkZWZpbmUgX0JTRF9TT1VSQ0UgYW5kIF9TVklEX1NPVVJDRS4gICovCisjaWYgKCFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXyAmJiAhZGVmaW5lZCBfSVNPQzk5X1NPVVJDRSAmJiBcCisgICAgICFkZWZpbmVkIF9QT1NJWF9TT1VSQ0UgJiYgIWRlZmluZWQgX1BPU0lYX0NfU09VUkNFICYmIFwKKyAgICAgIWRlZmluZWQgX1hPUEVOX1NPVVJDRSAmJiAhZGVmaW5lZCBfQlNEX1NPVVJDRSAmJiAhZGVmaW5lZCBfU1ZJRF9TT1VSQ0UpCisjIGRlZmluZSBfQlNEX1NPVVJDRQkxCisjIGRlZmluZSBfU1ZJRF9TT1VSQ0UJMQorI2VuZGlmCisKKy8qIFRoaXMgaXMgdG8gZW5hYmxlIHRoZSBJU08gQzk5IGV4dGVuc2lvbi4gIEFsc28gcmVjb2duaXplIHRoZSBvbGQgbWFjcm8KKyAgIHdoaWNoIHdhcyB1c2VkIHByaW9yIHRvIHRoZSBzdGFuZGFyZCBhY2NlcHRhbmNlLiAgVGhpcyBtYWNybyB3aWxsCisgICBldmVudHVhbGx5IGdvIGF3YXkgYW5kIHRoZSBmZWF0dXJlcyBlbmFibGVkIGJ5IGRlZmF1bHQgb25jZSB0aGUgSVNPIEM5OQorICAgc3RhbmRhcmQgaXMgd2lkZWx5IGFkb3B0ZWQuICAqLworI2lmIChkZWZpbmVkIF9JU09DOTlfU09VUkNFIHx8IGRlZmluZWQgX0lTT0M5WF9TT1VSQ0UgXAorICAgICB8fCAoZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkpCisjIGRlZmluZSBfX1VTRV9JU09DOTkJMQorI2VuZGlmCisKKy8qIFRoaXMgaXMgdG8gZW5hYmxlIHRoZSBJU08gQzkwIEFtZW5kbWVudCAxOjE5OTUgZXh0ZW5zaW9uLiAgKi8KKyNpZiAoZGVmaW5lZCBfSVNPQzk5X1NPVVJDRSB8fCBkZWZpbmVkIF9JU09DOVhfU09VUkNFIFwKKyAgICAgfHwgKGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTQwOUwpKQorIyBkZWZpbmUgX19VU0VfSVNPQzk1CTEKKyNlbmRpZgorCisvKiBJZiBub25lIG9mIHRoZSBBTlNJL1BPU0lYIG1hY3JvcyBhcmUgZGVmaW5lZCwgdXNlIFBPU0lYLjEgYW5kIFBPU0lYLjIKKyAgIChhbmQgSUVFRSBTdGQgMTAwMy4xYi0xOTkzIHVubGVzcyBfWE9QRU5fU09VUkNFIGlzIGRlZmluZWQpLiAgKi8KKyNpZiAoKCFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXyB8fCAoX1hPUEVOX1NPVVJDRSAtIDApID49IDUwMCkgJiYgXAorICAgICAhZGVmaW5lZCBfUE9TSVhfU09VUkNFICYmICFkZWZpbmVkIF9QT1NJWF9DX1NPVVJDRSkKKyMgZGVmaW5lIF9QT1NJWF9TT1VSQ0UJMQorIyBpZiBkZWZpbmVkIF9YT1BFTl9TT1VSQ0UgJiYgKF9YT1BFTl9TT1VSQ0UgLSAwKSA8IDUwMAorIyAgZGVmaW5lIF9QT1NJWF9DX1NPVVJDRQkyCisjIGVsaWYgZGVmaW5lZCBfWE9QRU5fU09VUkNFICYmIChfWE9QRU5fU09VUkNFIC0gMCkgPCA2MDAKKyMgIGRlZmluZSBfUE9TSVhfQ19TT1VSQ0UJMTk5NTA2TAorIyBlbGlmIGRlZmluZWQgX1hPUEVOX1NPVVJDRSAmJiAoX1hPUEVOX1NPVVJDRSAtIDApIDwgNzAwCisjICBkZWZpbmUgX1BPU0lYX0NfU09VUkNFCTIwMDExMkwKKyMgZWxzZQorIyAgZGVmaW5lIF9QT1NJWF9DX1NPVVJDRQkyMDA4MDlMCisjIGVuZGlmCisjIGRlZmluZSBfX1VTRV9QT1NJWF9JTVBMSUNJVExZCTEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfUE9TSVhfU09VUkNFIHx8IF9QT1NJWF9DX1NPVVJDRSA+PSAxIHx8IGRlZmluZWQgX1hPUEVOX1NPVVJDRQorIyBkZWZpbmUgX19VU0VfUE9TSVgJMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9QT1NJWF9DX1NPVVJDRSAmJiBfUE9TSVhfQ19TT1VSQ0UgPj0gMiB8fCBkZWZpbmVkIF9YT1BFTl9TT1VSQ0UKKyMgZGVmaW5lIF9fVVNFX1BPU0lYMgkxCisjZW5kaWYKKworI2lmIChfUE9TSVhfQ19TT1VSQ0UgLSAwKSA+PSAxOTkzMDlMCisjIGRlZmluZSBfX1VTRV9QT1NJWDE5OTMwOQkxCisjZW5kaWYKKworI2lmIChfUE9TSVhfQ19TT1VSQ0UgLSAwKSA+PSAxOTk1MDZMCisjIGRlZmluZSBfX1VTRV9QT1NJWDE5OTUwNgkxCisjZW5kaWYKKworI2lmIChfUE9TSVhfQ19TT1VSQ0UgLSAwKSA+PSAyMDAxMTJMCisjIGRlZmluZSBfX1VTRV9YT1BFTjJLCQkxCisjIHVuZGVmIF9fVVNFX0lTT0M5NQorIyBkZWZpbmUgX19VU0VfSVNPQzk1CQkxCisjIHVuZGVmIF9fVVNFX0lTT0M5OQorIyBkZWZpbmUgX19VU0VfSVNPQzk5CQkxCisjZW5kaWYKKworI2lmIChfUE9TSVhfQ19TT1VSQ0UgLSAwKSA+PSAyMDA4MDlMCisjIGRlZmluZSBfX1VTRV9YT1BFTjJLOAkJMQorIyB1bmRlZiAgX0FURklMRV9TT1VSQ0UKKyMgZGVmaW5lIF9BVEZJTEVfU09VUkNFCTEKKyNlbmRpZgorCisjaWZkZWYJX1hPUEVOX1NPVVJDRQorIyBkZWZpbmUgX19VU0VfWE9QRU4JMQorIyBpZiAoX1hPUEVOX1NPVVJDRSAtIDApID49IDUwMAorIyAgZGVmaW5lIF9fVVNFX1hPUEVOX0VYVEVOREVECTEKKyMgIGRlZmluZSBfX1VTRV9VTklYOTgJMQorIyAgdW5kZWYgX0xBUkdFRklMRV9TT1VSQ0UKKyMgIGRlZmluZSBfTEFSR0VGSUxFX1NPVVJDRQkxCisjICBpZiAoX1hPUEVOX1NPVVJDRSAtIDApID49IDYwMAorIyAgIGlmIChfWE9QRU5fU09VUkNFIC0gMCkgPj0gNzAwCisjICAgIGRlZmluZSBfX1VTRV9YT1BFTjJLOAkxCisjICAgIGRlZmluZSBfX1VTRV9YT1BFTjJLOFhTSQkxCisjICAgZW5kaWYKKyMgICBkZWZpbmUgX19VU0VfWE9QRU4ySwkxCisjICAgZGVmaW5lIF9fVVNFX1hPUEVOMktYU0kJMQorIyAgIHVuZGVmIF9fVVNFX0lTT0M5NQorIyAgIGRlZmluZSBfX1VTRV9JU09DOTUJCTEKKyMgICB1bmRlZiBfX1VTRV9JU09DOTkKKyMgICBkZWZpbmUgX19VU0VfSVNPQzk5CQkxCisjICBlbmRpZgorIyBlbHNlCisjICBpZmRlZiBfWE9QRU5fU09VUkNFX0VYVEVOREVECisjICAgZGVmaW5lIF9fVVNFX1hPUEVOX0VYVEVOREVECTEKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9MQVJHRUZJTEVfU09VUkNFCisjIGRlZmluZSBfX1VTRV9MQVJHRUZJTEUJMQorI2VuZGlmCisKKyNpZmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCisjIGRlZmluZSBfX1VTRV9MQVJHRUZJTEU2NAkxCisjZW5kaWYKKworI2lmIGRlZmluZWQgX0ZJTEVfT0ZGU0VUX0JJVFMgJiYgX0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQKKyMgZGVmaW5lIF9fVVNFX0ZJTEVfT0ZGU0VUNjQJMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9CU0RfU09VUkNFIHx8IGRlZmluZWQgX1NWSURfU09VUkNFCisjIGRlZmluZSBfX1VTRV9NSVNDCTEKKyNlbmRpZgorCisjaWZkZWYJX0JTRF9TT1VSQ0UKKyMgZGVmaW5lIF9fVVNFX0JTRAkxCisjZW5kaWYKKworI2lmZGVmCV9TVklEX1NPVVJDRQorIyBkZWZpbmUgX19VU0VfU1ZJRAkxCisjZW5kaWYKKworI2lmZGVmCV9BVEZJTEVfU09VUkNFCisjIGRlZmluZSBfX1VTRV9BVEZJTEUJMQorI2VuZGlmCisKKyNpZmRlZglfR05VX1NPVVJDRQorIyBkZWZpbmUgX19VU0VfR05VCTEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfUkVFTlRSQU5UIHx8IGRlZmluZWQgX1RIUkVBRF9TQUZFCisjIGRlZmluZSBfX1VTRV9SRUVOVFJBTlQJMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9GT1JUSUZZX1NPVVJDRSAmJiBfRk9SVElGWV9TT1VSQ0UgPiAwIFwKKyAgICAmJiBfX0dOVUNfUFJFUkVRICg0LCAxKSAmJiBkZWZpbmVkIF9fT1BUSU1JWkVfXyAmJiBfX09QVElNSVpFX18gPiAwCisjIGlmIF9GT1JUSUZZX1NPVVJDRSA+IDEKKyMgIGRlZmluZSBfX1VTRV9GT1JUSUZZX0xFVkVMIDIKKyMgZWxzZQorIyAgZGVmaW5lIF9fVVNFX0ZPUlRJRllfTEVWRUwgMQorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIF9fVVNFX0ZPUlRJRllfTEVWRUwgMAorI2VuZGlmCisKKy8qIERlZmluZSBfX1NURENfSUVDXzU1OV9fIGFuZCBvdGhlciBzaW1pbGFyIG1hY3Jvcy4gICovCisjaW5jbHVkZSA8Yml0cy9wcmVkZWZzLmg+CisKKy8qIHdjaGFyX3QgdXNlcyBJU08gMTA2NDYtMSAoMm5kIGVkLiwgcHVibGlzaGVkIDIwMDAtMDktMTUpIC8gVW5pY29kZSAzLjEuICAqLworI2RlZmluZSBfX1NURENfSVNPXzEwNjQ2X18JCTIwMDAwOUwKKworLyogVGhpcyBtYWNybyBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgaXMgdGhlIEdOVSBDIExpYnJhcnkuCisgICBGb3IgaGlzdG9yaWMgcmVhc29ucyB0aGUgdmFsdWUgbm93IGlzIDYgYW5kIHRoaXMgd2lsbCBzdGF5IGZyb20gbm93CisgICBvbi4gIFRoZSB1c2Ugb2YgdGhpcyB2YXJpYWJsZSBpcyBkZXByZWNhdGVkLiAgVXNlIF9fR0xJQkNfXyBhbmQKKyAgIF9fR0xJQkNfTUlOT1JfXyBub3cgKHNlZSBiZWxvdykgd2hlbiB5b3Ugd2FudCB0byB0ZXN0IGZvciBhIHNwZWNpZmljCisgICBHTlUgQyBsaWJyYXJ5IHZlcnNpb24gYW5kIHVzZSB0aGUgdmFsdWVzIGluIDxnbnUvbGliLW5hbWVzLmg+IHRvIGdldAorICAgdGhlIHNvbmFtZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMuICAqLworI3VuZGVmICBfX0dOVV9MSUJSQVJZX18KKyNkZWZpbmUgX19HTlVfTElCUkFSWV9fIDYKKworLyogTWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBHTlUgQyBsaWJyYXJ5IHBhY2thZ2UuICBVc2UKKyAgIHRoZXNlIG1hY3JvcyB0byB0ZXN0IGZvciBmZWF0dXJlcyBpbiBzcGVjaWZpYyByZWxlYXNlcy4gICovCisjZGVmaW5lCV9fR0xJQkNfXwkyCisjZGVmaW5lCV9fR0xJQkNfTUlOT1JfXwkxNQorCisjZGVmaW5lIF9fR0xJQkNfUFJFUkVRKG1haiwgbWluKSBcCisJKChfX0dMSUJDX18gPDwgMTYpICsgX19HTElCQ19NSU5PUl9fID49ICgobWFqKSA8PCAxNikgKyAobWluKSkKKworLyogRGVjaWRlIHdoZXRoZXIgYSBjb21waWxlciBzdXBwb3J0cyB0aGUgbG9uZyBsb25nIGRhdGF0eXBlcy4gICovCisjaWYgZGVmaW5lZCBfX0dOVUNfXyBcCisgICAgfHwgKGRlZmluZWQgX19QR0kgJiYgZGVmaW5lZCBfX2kzODZfXyApIFwKKyAgICB8fCAoZGVmaW5lZCBfX0lOVEVMX0NPTVBJTEVSICYmIChkZWZpbmVkIF9faTM4Nl9fIHx8IGRlZmluZWQgX19pYTY0X18pKSBcCisgICAgfHwgKGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpCisjIGRlZmluZSBfX0dMSUJDX0hBVkVfTE9OR19MT05HCTEKKyNlbmRpZgorCisvKiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIGV2ZXJ5IGhlYWRlciBmaWxlIGFscmVhZHkgaW5jbHVkZXMgdGhpcyBvbmUuICAqLworI2lmbmRlZiBfX0FTU0VNQkxFUl9fCisjIGlmbmRlZiBfU1lTX0NERUZTX0gKKyMgIGluY2x1ZGUgPHN5cy9jZGVmcy5oPgorIyBlbmRpZgorCisvKiBJZiB3ZSBkb24ndCBoYXZlIF9fUkVESVJFQ1QsIHByb3RvdHlwZXMgd2lsbCBiZSBtaXNzaW5nIGlmCisgICBfX1VTRV9GSUxFX09GRlNFVDY0IGJ1dCBub3QgX19VU0VfTEFSR0VGSUxFWzY0XS4gKi8KKyMgaWYgZGVmaW5lZCBfX1VTRV9GSUxFX09GRlNFVDY0ICYmICFkZWZpbmVkIF9fUkVESVJFQ1QKKyMgIGRlZmluZSBfX1VTRV9MQVJHRUZJTEUJMQorIyAgZGVmaW5lIF9fVVNFX0xBUkdFRklMRTY0CTEKKyMgZW5kaWYKKworI2VuZGlmCS8qICFBU1NFTUJMRVIgKi8KKworLyogRGVjaWRlIHdoZXRoZXIgd2UgY2FuIGRlZmluZSAnZXh0ZXJuIGlubGluZScgZnVuY3Rpb25zIGluIGhlYWRlcnMuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsIDcpICYmIGRlZmluZWQgX19PUFRJTUlaRV9fIFwKKyAgICAmJiAhZGVmaW5lZCBfX09QVElNSVpFX1NJWkVfXyAmJiAhZGVmaW5lZCBfX05PX0lOTElORV9fIFwKKyAgICAmJiBkZWZpbmVkIF9fZXh0ZXJuX2lubGluZQorIyBkZWZpbmUgX19VU0VfRVhURVJOX0lOTElORVMJMQorI2VuZGlmCisKKy8qIFRoZXJlIGFyZSBzb21lIGZ1bmN0aW9ucyB0aGF0IG11c3QgYmUgZGVjbGFyZWQgJ2V4dGVybiBpbmxpbmUnIGV2ZW4gd2l0aAorICAgLU9zIHdoZW4gYnVpbGRpbmcgTElCQywgb3IgdGhleSdsbCBlbmQgdXAgdW5kZWZpbmVkLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgyLCA3KSAmJiBkZWZpbmVkIF9fT1BUSU1JWkVfXyBcCisgICAgJiYgKGRlZmluZWQgX0xJQkMgfHwgIWRlZmluZWQgX19PUFRJTUlaRV9TSVpFX18pICYmICFkZWZpbmVkIF9fTk9fSU5MSU5FX18gXAorICAgICYmIGRlZmluZWQgX19leHRlcm5faW5saW5lCisjIGRlZmluZSBfX1VTRV9FWFRFUk5fSU5MSU5FU19JTl9MSUJDCTEKKyNlbmRpZgorCisKKy8qIFRoaXMgaXMgaGVyZSBvbmx5IGJlY2F1c2UgZXZlcnkgaGVhZGVyIGZpbGUgYWxyZWFkeSBpbmNsdWRlcyB0aGlzIG9uZS4KKyAgIEdldCB0aGUgZGVmaW5pdGlvbnMgb2YgYWxsIHRoZSBhcHByb3ByaWF0ZSBgX19zdHViX0ZVTkNUSU9OJyBzeW1ib2xzLgorICAgPGdudS9zdHVicy5oPiBjb250YWlucyBgI2RlZmluZSBfX3N0dWJfRlVOQ1RJT04nIHdoZW4gRlVOQ1RJT04gaXMgYSBzdHViCisgICB0aGF0IHdpbGwgYWx3YXlzIHJldHVybiBmYWlsdXJlIChhbmQgc2V0IGVycm5vIHRvIEVOT1NZUykuICAqLworI2luY2x1ZGUgPGdudS9zdHVicy5oPgorCisKKyNlbmRpZgkvKiBmZWF0dXJlcy5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9mZW52LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2ZlbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA2ZjAyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9mZW52LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIElTTyBDOTkgNy42OiBGbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudAk8ZmVudi5oPgorICovCisKKyNpZm5kZWYgX0ZFTlZfSAorI2RlZmluZSBfRkVOVl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCB0aGUgYXJjaGl0ZWN0dXJlIGRlcGVuZGVuZCBkZWZpbml0aW9ucy4gIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMKKyAgIGFyZSBleHBlY3RlZCB0byBiZSBkb25lOgorCisgICBmZW52X3QJdHlwZSBmb3Igb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbnRpcmUgZmxvYXRpbmctcG9pbnQKKwkJZW52aXJvbm1lbnQKKworICAgRkVfREZMX0VOVgltYWNybyBvZiB0eXBlIHBvaW50ZXIgdG8gZmVudl90IHRvIGJlIHVzZWQgYXMgdGhlIGFyZ3VtZW50CisJCXRvIGZ1bmN0aW9ucyB0YWtpbmcgYW4gYXJndW1lbnQgb2YgdHlwZSBmZW52X3Q7IGluIHRoaXMKKwkJY2FzZSB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCB3aWxsIGJlIHVzZWQKKworICAgZmV4Y2VwdF90CXR5cGUgZm9yIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbgorCQlmbGFncyBpbmNsdWRpbmcgc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmxhZ3MKKworICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlZmluZWQgaWZmIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGlzCisgICBraW5kIG9mIGV4Y2VwdGlvbi4KKyAgIEZFX0lORVhBQ1QJCWluZXhhY3QgcmVzdWx0CisgICBGRV9ESVZCWVpFUk8JCWRpdmlzaW9uIGJ5IHplcm8KKyAgIEZFX1VOREVSRkxPVwkJcmVzdWx0IG5vdCByZXByZXNlbnRhYmxlIGR1ZSB0byB1bmRlcmZsb3cKKyAgIEZFX09WRVJGTE9XCQlyZXN1bHQgbm90IHJlcHJlc2VudGFibGUgZHVlIHRvIG92ZXJmbG93CisgICBGRV9JTlZBTElECQlpbnZhbGlkIG9wZXJhdGlvbgorCisgICBGRV9BTExfRVhDRVBUCWJpdHdpc2UgT1Igb2YgYWxsIHN1cHBvcnRlZCBleGNlcHRpb25zCisKKyAgIFRoZSBuZXh0IG1hY3JvcyBhcmUgZGVmaW5lZCBpZmYgdGhlIGFwcHJvcHJpYXRlIHJvdW5kaW5nIG1vZGUgaXMKKyAgIHN1cHBvcnRlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uCisgICBGRV9UT05FQVJFU1QJCXJvdW5kIHRvIG5lYXJlc3QKKyAgIEZFX1VQV0FSRAkJcm91bmQgdG93YXJkICtJbmYKKyAgIEZFX0RPV05XQVJECQlyb3VuZCB0b3dhcmQgLUluZgorICAgRkVfVE9XQVJEWkVSTwlyb3VuZCB0b3dhcmQgMAorKi8KKyNpbmNsdWRlIDxiaXRzL2ZlbnYuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBGbG9hdGluZy1wb2ludCBleGNlcHRpb24gaGFuZGxpbmcuICAqLworCisvKiBDbGVhciB0aGUgc3VwcG9ydGVkIGV4Y2VwdGlvbnMgcmVwcmVzZW50ZWQgYnkgRVhDRVBUUy4gICovCitleHRlcm4gaW50IGZlY2xlYXJleGNlcHQgKGludCBfX2V4Y2VwdHMpIF9fVEhST1c7CisKKy8qIFN0b3JlIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGV4Y2VwdGlvbiBmbGFncworICAgaW5kaWNhdGVkIGJ5IEVYQ0VQVFMgaW4gdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IEZMQUdQLiAgKi8KK2V4dGVybiBpbnQgZmVnZXRleGNlcHRmbGFnIChmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpIF9fVEhST1c7CisKKy8qIFJhaXNlIHRoZSBzdXBwb3J0ZWQgZXhjZXB0aW9ucyByZXByZXNlbnRlZCBieSBFWENFUFRTLiAgKi8KK2V4dGVybiBpbnQgZmVyYWlzZWV4Y2VwdCAoaW50IF9fZXhjZXB0cykgX19USFJPVzsKKworLyogU2V0IGNvbXBsZXRlIHN0YXR1cyBmb3IgZXhjZXB0aW9ucyBpbmRpY2F0ZWQgYnkgRVhDRVBUUyBhY2NvcmRpbmcgdG8KKyAgIHRoZSByZXByZXNlbnRhdGlvbiBpbiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgRkxBR1AuICAqLworZXh0ZXJuIGludCBmZXNldGV4Y2VwdGZsYWcgKF9fY29uc3QgZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKSBfX1RIUk9XOworCisvKiBEZXRlcm1pbmUgd2hpY2ggb2Ygc3Vic2V0IG9mIHRoZSBleGNlcHRpb25zIHNwZWNpZmllZCBieSBFWENFUFRTIGFyZQorICAgY3VycmVudGx5IHNldC4gICovCitleHRlcm4gaW50IGZldGVzdGV4Y2VwdCAoaW50IF9fZXhjZXB0cykgX19USFJPVzsKKworCisvKiBSb3VuZGluZyBjb250cm9sLiAgKi8KKworLyogR2V0IGN1cnJlbnQgcm91bmRpbmcgZGlyZWN0aW9uLiAgKi8KK2V4dGVybiBpbnQgZmVnZXRyb3VuZCAodm9pZCkgX19USFJPVzsKKworLyogRXN0YWJsaXNoIHRoZSByb3VuZGluZyBkaXJlY3Rpb24gcmVwcmVzZW50ZWQgYnkgUk9VTkQuICAqLworZXh0ZXJuIGludCBmZXNldHJvdW5kIChpbnQgX19yb3VuZGluZ19kaXJlY3Rpb24pIF9fVEhST1c7CisKKworLyogRmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQuICAqLworCisvKiBTdG9yZSB0aGUgY3VycmVudCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCBpbiB0aGUgb2JqZWN0IHBvaW50ZWQKKyAgIHRvIGJ5IEVOVlAuICAqLworZXh0ZXJuIGludCBmZWdldGVudiAoZmVudl90ICpfX2VudnApIF9fVEhST1c7CisKKy8qIFNhdmUgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaW4gdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IEVOVlAsIGNsZWFyCisgICBleGNlcHRpb24gZmxhZ3MgYW5kIGluc3RhbGwgYSBub24tc3RvcCBtb2RlIChpZiBhdmFpbGFibGUpIGZvciBhbGwKKyAgIGV4Y2VwdGlvbnMuICAqLworZXh0ZXJuIGludCBmZWhvbGRleGNlcHQgKGZlbnZfdCAqX19lbnZwKSBfX1RIUk9XOworCisvKiBFc3RhYmxpc2ggdGhlIGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50IHJlcHJlc2VudGVkIGJ5IHRoZSBvYmplY3QKKyAgIHBvaW50ZWQgdG8gYnkgRU5WUC4gICovCitleHRlcm4gaW50IGZlc2V0ZW52IChfX2NvbnN0IGZlbnZfdCAqX19lbnZwKSBfX1RIUk9XOworCisvKiBTYXZlIGN1cnJlbnQgZXhjZXB0aW9ucyBpbiB0ZW1wb3Jhcnkgc3RvcmFnZSwgaW5zdGFsbCBlbnZpcm9ubWVudAorICAgcmVwcmVzZW50ZWQgYnkgb2JqZWN0IHBvaW50ZWQgdG8gYnkgRU5WUCBhbmQgcmFpc2UgZXhjZXB0aW9ucworICAgYWNjb3JkaW5nIHRvIHNhdmVkIGV4Y2VwdGlvbnMuICAqLworZXh0ZXJuIGludCBmZXVwZGF0ZWVudiAoX19jb25zdCBmZW52X3QgKl9fZW52cCkgX19USFJPVzsKKworCisvKiBJbmNsdWRlIG9wdGltaXphdGlvbi4gICovCisjaWZkZWYgX19PUFRJTUlaRV9fCisjIGluY2x1ZGUgPGJpdHMvZmVudmlubGluZS5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKworLyogRW5hYmxlIGluZGl2aWR1YWwgZXhjZXB0aW9ucy4gIFdpbGwgbm90IGVuYWJsZSBtb3JlIGV4Y2VwdGlvbnMgdGhhbgorICAgRVhDRVBUUyBzcGVjaWZpZXMuICBSZXR1cm5zIHRoZSBwcmV2aW91cyBlbmFibGVkIGV4Y2VwdGlvbnMgaWYgYWxsCisgICBleGNlcHRpb25zIGFyZSBzdWNjZXNzZnVsbHkgc2V0LCBvdGhlcndpc2UgcmV0dXJucyAtMS4gICovCitleHRlcm4gaW50IGZlZW5hYmxlZXhjZXB0IChpbnQgX19leGNlcHRzKSBfX1RIUk9XOworCisvKiBEaXNhYmxlIGluZGl2aWR1YWwgZXhjZXB0aW9ucy4gIFdpbGwgbm90IGRpc2FibGUgbW9yZSBleGNlcHRpb25zIHRoYW4KKyAgIEVYQ0VQVFMgc3BlY2lmaWVzLiAgUmV0dXJucyB0aGUgcHJldmlvdXMgZW5hYmxlZCBleGNlcHRpb25zIGlmIGFsbAorICAgZXhjZXB0aW9ucyBhcmUgc3VjY2Vzc2Z1bGx5IGRpc2FibGVkLCBvdGhlcndpc2UgcmV0dXJucyAtMS4gICovCitleHRlcm4gaW50IGZlZGlzYWJsZWV4Y2VwdCAoaW50IF9fZXhjZXB0cykgX19USFJPVzsKKworLyogUmV0dXJuIGVuYWJsZWQgZXhjZXB0aW9ucy4gICovCitleHRlcm4gaW50IGZlZ2V0ZXhjZXB0ICh2b2lkKSBfX1RIUk9XOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBmZW52LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZm10bXNnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2ZtdG1zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZTNlNTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2ZtdG1zZy5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiBNZXNzYWdlIGRpc3BsYXkgaGFuZGxpbmcuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDAsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19GTVRNU0dfSAorI2RlZmluZSBfX0ZNVE1TR19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBWYWx1ZXMgdG8gY29udHJvbCBgZm10bXNnJyBmdW5jdGlvbi4gICovCitlbnVtCit7CisgIE1NX0hBUkQgPSAweDAwMSwJLyogU291cmNlIG9mIHRoZSBjb25kaXRpb24gaXMgaGFyZHdhcmUuICAqLworI2RlZmluZSBNTV9IQVJEIE1NX0hBUkQKKyAgTU1fU09GVCA9IDB4MDAyLAkvKiBTb3VyY2Ugb2YgdGhlIGNvbmRpdGlvbiBpcyBzb2Z0d2FyZS4gICovCisjZGVmaW5lIE1NX1NPRlQgTU1fU09GVAorICBNTV9GSVJNID0gMHgwMDQsCS8qIFNvdXJjZSBvZiB0aGUgY29uZGl0aW9uIGlzIGZpcm13YXJlLiAgKi8KKyNkZWZpbmUgTU1fRklSTSBNTV9GSVJNCisgIE1NX0FQUEwgPSAweDAwOCwJLyogQ29uZGl0aW9uIGRldGVjdGVkIGJ5IGFwcGxpY2F0aW9uLiAgKi8KKyNkZWZpbmUgTU1fQVBQTCBNTV9BUFBMCisgIE1NX1VUSUwgPSAweDAxMCwJLyogQ29uZGl0aW9uIGRldGVjdGVkIGJ5IHV0aWxpdHkuICAqLworI2RlZmluZSBNTV9VVElMIE1NX1VUSUwKKyAgTU1fT1BTWVMgPSAweDAyMCwJLyogQ29uZGl0aW9uIGRldGVjdGVkIGJ5IG9wZXJhdGluZyBzeXN0ZW0uICAqLworI2RlZmluZSBNTV9PUFNZUyBNTV9PUFNZUworICBNTV9SRUNPVkVSID0gMHgwNDAsCS8qIFJlY292ZXJhYmxlIGVycm9yLiAgKi8KKyNkZWZpbmUgTU1fUkVDT1ZFUiBNTV9SRUNPVkVSCisgIE1NX05SRUNPViA9IDB4MDgwLAkvKiBOb24tcmVjb3ZlcmFibGUgZXJyb3IuICAqLworI2RlZmluZSBNTV9OUkVDT1YgTU1fTlJFQ09WCisgIE1NX1BSSU5UID0gMHgxMDAsCS8qIERpc3BsYXkgbWVzc2FnZSBpbiBzdGFuZGFyZCBlcnJvci4gICovCisjZGVmaW5lIE1NX1BSSU5UIE1NX1BSSU5UCisgIE1NX0NPTlNPTEUgPSAweDIwMAkvKiBEaXNwbGF5IG1lc3NhZ2Ugb24gc3lzdGVtIGNvbnNvbGUuICAqLworI2RlZmluZSBNTV9DT05TT0xFIE1NX0NPTlNPTEUKK307CisKKy8qIFZhbHVlcyB0byBiZSBmb3IgU0VWRVJJVFkgcGFyYW1ldGVyIG9mIGBmbXRtc2cnLiAgKi8KK2VudW0KK3sKKyAgTU1fTk9TRVYgPSAwLAkJLyogTm8gc2V2ZXJpdHkgbGV2ZWwgcHJvdmlkZWQgZm9yIHRoZSBtZXNzYWdlLiAgKi8KKyNkZWZpbmUgTU1fTk9TRVYgTU1fTk9TRVYKKyAgTU1fSEFMVCwJCS8qIEVycm9yIGNhdXNpbmcgYXBwbGljYXRpb24gdG8gaGFsdC4gICovCisjZGVmaW5lIE1NX0hBTFQgTU1fSEFMVAorICBNTV9FUlJPUiwJCS8qIEFwcGxpY2F0aW9uIGhhcyBlbmNvdW50ZXJlZCBhIG5vbi1mYXRhbCBmYXVsdC4gICovCisjZGVmaW5lIE1NX0VSUk9SIE1NX0VSUk9SCisgIE1NX1dBUk5JTkcsCQkvKiBBcHBsaWNhdGlvbiBoYXMgZGV0ZWN0ZWQgdW51c3VhbCBub24tZXJyb3IKKwkJCSAgIGNvbmRpdGlvbi4gICovCisjZGVmaW5lIE1NX1dBUk5JTkcgTU1fV0FSTklORworICBNTV9JTkZPCQkvKiBJbmZvcm1hdGl2ZSBtZXNzYWdlLiAgKi8KKyNkZWZpbmUgTU1fSU5GTyBNTV9JTkZPCit9OworCisKKy8qIE1hY3JvcyB3aGljaCBjYW4gYmUgdXNlZCBhcyBudWxsIHZhbHVlcyBmb3IgdGhlIGFyZ3VtZW50cyBvZiBgZm10bXNnJy4gICovCisjZGVmaW5lIE1NX05VTExMQkwJKChjaGFyICopIDApCisjZGVmaW5lIE1NX05VTExTRVYJMAorI2RlZmluZSBNTV9OVUxMTUMJKChsb25nIGludCkgMCkKKyNkZWZpbmUgTU1fTlVMTFRYVAkoKGNoYXIgKikgMCkKKyNkZWZpbmUgTU1fTlVMTEFDVAkoKGNoYXIgKikgMCkKKyNkZWZpbmUgTU1fTlVMTFRBRwkoKGNoYXIgKikgMCkKKworCisvKiBQb3NzaWJsZSByZXR1cm4gdmFsdWVzIG9mIGBmbXRtc2cnLiAgKi8KK2VudW0KK3sKKyAgTU1fTk9UT0sgPSAtMSwKKyNkZWZpbmUgTU1fTk9UT0sgTU1fTk9UT0sKKyAgTU1fT0sgPSAwLAorI2RlZmluZSBNTV9PSyBNTV9PSworICBNTV9OT01TRyA9IDEsCisjZGVmaW5lIE1NX05PTVNHIE1NX05PTVNHCisgIE1NX05PQ09OID0gNAorI2RlZmluZSBNTV9OT0NPTiBNTV9OT0NPTgorfTsKKworCisvKiBQcmludCBtZXNzYWdlIHdpdGggZ2l2ZW4gQ0xBU1NJRklDQVRJT04sIExBQkVMLCBTRVZFUklUWSwgVEVYVCwgQUNUSU9OCisgICBhbmQgVEFHIHRvIGNvbnNvbGUgb3Igc3RhbmRhcmQgZXJyb3IuICAqLworZXh0ZXJuIGludCBmbXRtc2cgKGxvbmcgaW50IF9fY2xhc3NpZmljYXRpb24sIF9fY29uc3QgY2hhciAqX19sYWJlbCwKKwkJICAgaW50IF9fc2V2ZXJpdHksIF9fY29uc3QgY2hhciAqX190ZXh0LAorCQkgICBfX2NvbnN0IGNoYXIgKl9fYWN0aW9uLCBfX2NvbnN0IGNoYXIgKl9fdGFnKTsKKworI2lmZGVmIF9fVVNFX1NWSUQKKy8qIEFkZCBvciByZW1vdmUgc2V2ZXJpdHkgbGV2ZWwuICAqLworZXh0ZXJuIGludCBhZGRzZXZlcml0eSAoaW50IF9fc2V2ZXJpdHksIF9fY29uc3QgY2hhciAqX19zdHJpbmcpIF9fVEhST1c7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGZtdG1zZy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2ZubWF0Y2guaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZm5tYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZmIwMDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2ZubWF0Y2guaApAQCAtMCwwICsxLDcyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtOTMsOTYsOTcsOTgsOTksMjAwMSwyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9GTk1BVENIX0gKKyNkZWZpbmUJX0ZOTUFUQ0hfSAkxCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBjb25zdAorIyBpZiAoZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXykgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgZGVmaW5lIF9fY29uc3QJY29uc3QKKyMgZWxzZQorIyAgZGVmaW5lIF9fY29uc3QKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBXZSAjdW5kZWYgdGhlc2UgYmVmb3JlIGRlZmluaW5nIHRoZW0gYmVjYXVzZSBzb21lIGxvc2luZyBzeXN0ZW1zCisgICAoSFAtVVggQS4wOC4wNyBmb3IgZXhhbXBsZSkgZGVmaW5lIHRoZXNlIGluIDx1bmlzdGQuaD4uICAqLworI3VuZGVmCUZOTV9QQVRITkFNRQorI3VuZGVmCUZOTV9OT0VTQ0FQRQorI3VuZGVmCUZOTV9QRVJJT0QKKworLyogQml0cyBzZXQgaW4gdGhlIEZMQUdTIGFyZ3VtZW50IHRvIGBmbm1hdGNoJy4gICovCisjZGVmaW5lCUZOTV9QQVRITkFNRQkoMSA8PCAwKSAvKiBObyB3aWxkY2FyZCBjYW4gZXZlciBtYXRjaCBgLycuICAqLworI2RlZmluZQlGTk1fTk9FU0NBUEUJKDEgPDwgMSkgLyogQmFja3NsYXNoZXMgZG9uJ3QgcXVvdGUgc3BlY2lhbCBjaGFycy4gICovCisjZGVmaW5lCUZOTV9QRVJJT0QJKDEgPDwgMikgLyogTGVhZGluZyBgLicgaXMgbWF0Y2hlZCBvbmx5IGV4cGxpY2l0bHkuICAqLworCisjaWYgIWRlZmluZWQgX1BPU0lYX0NfU09VUkNFIHx8IF9QT1NJWF9DX1NPVVJDRSA8IDIgfHwgZGVmaW5lZCBfR05VX1NPVVJDRQorIyBkZWZpbmUgRk5NX0ZJTEVfTkFNRQkgRk5NX1BBVEhOQU1FCS8qIFByZWZlcnJlZCBHTlUgbmFtZS4gICovCisjIGRlZmluZSBGTk1fTEVBRElOR19ESVIgKDEgPDwgMykJLyogSWdub3JlIGAvLi4uJyBhZnRlciBhIG1hdGNoLiAgKi8KKyMgZGVmaW5lIEZOTV9DQVNFRk9MRAkgKDEgPDwgNCkJLyogQ29tcGFyZSB3aXRob3V0IHJlZ2FyZCB0byBjYXNlLiAgKi8KKyMgZGVmaW5lIEZOTV9FWFRNQVRDSAkgKDEgPDwgNSkJLyogVXNlIGtzaC1saWtlIGV4dGVuZGVkIG1hdGNoaW5nLiAqLworI2VuZGlmCisKKy8qIFZhbHVlIHJldHVybmVkIGJ5IGBmbm1hdGNoJyBpZiBTVFJJTkcgZG9lcyBub3QgbWF0Y2ggUEFUVEVSTi4gICovCisjZGVmaW5lCUZOTV9OT01BVENICTEKKworLyogVGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBpZiB0aGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydAorICAgYGZubWF0Y2gnLiAgU2luY2UgdGhpcyBpcyBub3QgdGhlIGNhc2UgaGVyZSBpdCB3aWxsIG5ldmVyIGJlCisgICByZXR1cm5lZCBidXQgdGhlIGNvbmZvcm1hbmNlIHRlc3Qgc3VpdGVzIHN0aWxsIHJlcXVpcmUgdGhlIHN5bWJvbAorICAgdG8gYmUgZGVmaW5lZC4gICovCisjaWZkZWYgX1hPUEVOX1NPVVJDRQorIyBkZWZpbmUgRk5NX05PU1lTCSgtMSkKKyNlbmRpZgorCisvKiBNYXRjaCBOQU1FIGFnYWluc3QgdGhlIGZpbGVuYW1lIHBhdHRlcm4gUEFUVEVSTiwKKyAgIHJldHVybmluZyB6ZXJvIGlmIGl0IG1hdGNoZXMsIEZOTV9OT01BVENIIGlmIG5vdC4gICovCitleHRlcm4gaW50IGZubWF0Y2ggKF9fY29uc3QgY2hhciAqX19wYXR0ZXJuLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSwKKwkJICAgIGludCBfX2ZsYWdzKTsKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIGZubWF0Y2guaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9mb3JtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Zvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTI4OTNiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9mb3JtLmgKQEAgLTAsMCArMSw0MjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCwyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIEF1dGhvcjogIEp1ZXJnZW4gUGZlaWZlciwgMTk5NSwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICRJZDogZm9ybS5oLHYgMC4yMSAyMDA5LzExLzA3IDE5OjMxOjExIHRvbSBFeHAgJCAqLworCisjaWZuZGVmIEZPUk1fSAorI2RlZmluZSBGT1JNX0gKKworI2luY2x1ZGUgPGN1cnNlcy5oPgorI2luY2x1ZGUgPGV0aS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBGT1JNX1BSSVZfSAordHlwZWRlZiB2b2lkICpGSUVMRF9DRUxMOworI2VuZGlmCisKKyNpZm5kZWYgTkNVUlNFU19GSUVMRF9JTlRFUk5BTFMKKyNkZWZpbmUgTkNVUlNFU19GSUVMRF9JTlRFUk5BTFMgLyogbm90aGluZyAqLworI2VuZGlmCisKK3R5cGVkZWYgaW50IEZvcm1fT3B0aW9uczsKK3R5cGVkZWYgaW50IEZpZWxkX09wdGlvbnM7CisKKwkvKioqKioqKioqKgorCSogIF9QQUdFICAqCisJKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzaG9ydCBwbWluOwkJLyogaW5kZXggb2YgZmlyc3QgZmllbGQgb24gcGFnZQkJCSovCisgIHNob3J0IHBtYXg7CQkvKiBpbmRleCBvZiBsYXN0IGZpZWxkIG9uIHBhZ2UJCQkqLworICBzaG9ydCBzbWluOwkJLyogaW5kZXggb2YgdG9wIGxlZnRtb3N0IGZpZWxkIG9uIHBhZ2UJCSovCisgIHNob3J0IHNtYXg7CQkvKiBpbmRleCBvZiBib3R0b20gcmlnaHRtb3N0IGZpZWxkIG9uIHBhZ2UJKi8KK30gX1BBR0U7CisKKwkvKioqKioqKioqKgorCSogIEZJRUxEICAqCisJKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgZmllbGRub2RlIHsKKyAgdW5zaWduZWQgc2hvcnQJc3RhdHVzOwkJLyogZmxhZ3MJCQkqLworICBzaG9ydAkJCXJvd3M7CQkvKiBzaXplIGluIHJvd3MJCQkqLworICBzaG9ydAkJCWNvbHM7CQkvKiBzaXplIGluIGNvbHMJCQkqLworICBzaG9ydAkJCWZyb3c7CQkvKiBmaXJzdCByb3cJCQkqLworICBzaG9ydAkJCWZjb2w7CQkvKiBmaXJzdCBjb2wJCQkqLworICBpbnQJCQlkcm93czsJCS8qIGR5bmFtaWMgcm93cwkJCSovCisgIGludAkJCWRjb2xzOwkJLyogZHluYW1pYyBjb2xzCQkJKi8KKyAgaW50CQkJbWF4Z3JvdzsJLyogbWF4aW11bSBmaWVsZCBncm93dGgJCSovCisgIGludAkJCW5yb3c7CQkvKiBvZmYtc2NyZWVuIHJvd3MJCSovCisgIHNob3J0CQkJbmJ1ZjsJCS8qIGFkZGl0aW9uYWwgYnVmZmVycwkJKi8KKyAgc2hvcnQJCQlqdXN0OwkJLyoganVzdGlmaWNhdGlvbgkJKi8KKyAgc2hvcnQJCQlwYWdlOwkJLyogcGFnZSBvbiBmb3JtCQkJKi8KKyAgc2hvcnQJCQlpbmRleDsJCS8qIGludG8gZm9ybSAtPiBmaWVsZAkJKi8KKyAgaW50CQkJcGFkOwkJLyogcGFkIGNoYXJhY3RlcgkJKi8KKyAgY2h0eXBlCQlmb3JlOwkJLyogZm9yZWdyb3VuZCBhdHRyaWJ1dGUJCSovCisgIGNodHlwZQkJYmFjazsJCS8qIGJhY2tncm91bmQgYXR0cmlidXRlCQkqLworICBGaWVsZF9PcHRpb25zCQlvcHRzOwkJLyogb3B0aW9ucwkJCSovCisgIHN0cnVjdCBmaWVsZG5vZGUgKglzbmV4dDsJCS8qIHNvcnRlZCBvcmRlciBwb2ludGVyCQkqLworICBzdHJ1Y3QgZmllbGRub2RlICoJc3ByZXY7CQkvKiBzb3J0ZWQgb3JkZXIgcG9pbnRlcgkJKi8KKyAgc3RydWN0IGZpZWxkbm9kZSAqCWxpbms7CQkvKiBsaW5rZWQgZmllbGQgY2hhaW4JCSovCisgIHN0cnVjdCBmb3Jtbm9kZSAqCWZvcm07CQkvKiBjb250YWluaW5nIGZvcm0JCSovCisgIHN0cnVjdCB0eXBlbm9kZSAqCXR5cGU7CQkvKiBmaWVsZCB0eXBlCQkJKi8KKyAgdm9pZCAqCQlhcmc7CQkvKiBhcmd1bWVudCBmb3IgdHlwZQkJKi8KKyAgRklFTERfQ0VMTCAqCQlidWY7CQkvKiBmaWVsZCBidWZmZXJzCQkqLworICB2b2lkICoJCXVzcnB0cjsJCS8qIHVzZXIgcG9pbnRlcgkJCSovCisgIC8qCisgICAqIFRoZSB3aWRlLWNoYXJhY3RlciBjb25maWd1cmF0aW9uIHJlcXVpcmVzIGV4dHJhIGluZm9ybWF0aW9uLiAgQmVjYXVzZQorICAgKiB0aGVyZSBhcmUgZXhpc3RpbmcgYXBwbGljYXRpb25zIHRoYXQgbWFuaXB1bGF0ZSB0aGUgbWVtYmVycyBvZiBGSUVMRAorICAgKiBkaXJlY3RseSwgd2UgY2Fubm90IG1ha2UgdGhlIHN0cnVjdCBvcGFxdWUuICBPZmZzZXRzIG9mIG1lbWJlcnMgdXAgdG8KKyAgICogdGhpcyBwb2ludCBhcmUgdGhlIHNhbWUgaW4gdGhlIG5hcnJvdy0gYW5kIHdpZGUtY2hhcmFjdGVyIGNvbmZpZ3VyYXRpb24uCisgICAqIEJ1dCBub3RlIHRoYXQgdGhlIHR5cGUgb2YgYnVmIGRlcGVuZHMgb24gdGhlIGNvbmZpZ3VyYXRpb24sIGFuZCBpcyBtYWRlCisgICAqIG9wYXF1ZSBmb3IgdGhhdCByZWFzb24uCisgICAqLworICBOQ1VSU0VTX0ZJRUxEX0lOVEVSTkFMUworfSBGSUVMRDsKKworCisJLyoqKioqKioqKgorCSogIEZPUk0gICoKKwkqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IGZvcm1ub2RlIHsKKyAgdW5zaWduZWQgc2hvcnQJc3RhdHVzOwkgIAkvKiBmbGFncwkJCSovCisgIHNob3J0CQkJcm93czsJCS8qIHNpemUgaW4gcm93cwkJCSovCisgIHNob3J0CQkJY29sczsJCS8qIHNpemUgaW4gY29scwkJCSovCisgIGludAkJCWN1cnJvdzsJCS8qIGN1cnJlbnQgcm93IGluIGZpZWxkIHdpbmRvdwkqLworICBpbnQJCQljdXJjb2w7CQkvKiBjdXJyZW50IGNvbCBpbiBmaWVsZCB3aW5kb3cJKi8KKyAgaW50CQkJdG9wcm93OwkJLyogaW4gc2Nyb2xsYWJsZSBmaWVsZCB3aW5kb3cJKi8KKyAgaW50CQkJYmVnaW5jb2w7CS8qIGluIGhvcml6LiBzY3JvbGxhYmxlIGZpZWxkCSovCisgIHNob3J0CQkJbWF4ZmllbGQ7CS8qIG51bWJlciBvZiBmaWVsZHMJCSovCisgIHNob3J0CQkJbWF4cGFnZTsJLyogbnVtYmVyIG9mIHBhZ2VzCQkqLworICBzaG9ydAkJCWN1cnBhZ2U7CS8qIGluZGV4IGludG8gcGFnZQkJKi8KKyAgRm9ybV9PcHRpb25zCQlvcHRzOwkJLyogb3B0aW9ucwkJCSovCisgIFdJTkRPVyAqCQl3aW47CQkvKiB3aW5kb3cJCQkqLworICBXSU5ET1cgKgkJc3ViOwkJLyogc3Vid2luZG93CQkJKi8KKyAgV0lORE9XICoJCXc7CQkvKiB3aW5kb3cgZm9yIGN1cnJlbnQgZmllbGQJKi8KKyAgRklFTEQgKioJCWZpZWxkOwkJLyogZmllbGQgW21heGZpZWxkXQkJKi8KKyAgRklFTEQgKgkJY3VycmVudDsJLyogY3VycmVudCBmaWVsZAkJKi8KKyAgX1BBR0UgKgkJcGFnZTsJCS8qIHBhZ2UgW21heHBhZ2VdCQkqLworICB2b2lkICoJCXVzcnB0cjsJCS8qIHVzZXIgcG9pbnRlcgkJCSovCisKKyAgdm9pZAkJCSgqZm9ybWluaXQpKHN0cnVjdCBmb3Jtbm9kZSAqKTsKKyAgdm9pZAkJCSgqZm9ybXRlcm0pKHN0cnVjdCBmb3Jtbm9kZSAqKTsKKyAgdm9pZAkJCSgqZmllbGRpbml0KShzdHJ1Y3QgZm9ybW5vZGUgKik7CisgIHZvaWQJCQkoKmZpZWxkdGVybSkoc3RydWN0IGZvcm1ub2RlICopOworCit9IEZPUk07CisKKworCS8qKioqKioqKioqKioqKgorCSogIEZJRUxEVFlQRSAgKgorCSoqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB0eXBlbm9kZSB7CisgIHVuc2lnbmVkIHNob3J0CXN0YXR1czsJCQkvKiBmbGFncwkJICAgICovCisgIGxvbmcJCQlyZWY7CQkJLyogcmVmZXJlbmNlIGNvdW50CSAgICAqLworICBzdHJ1Y3QgdHlwZW5vZGUgKglsZWZ0OwkJCS8qIHB0ciB0byBvcGVyYW5kIGZvciB8ICAgICAqLworICBzdHJ1Y3QgdHlwZW5vZGUgKglyaWdodDsJCQkvKiBwdHIgdG8gb3BlcmFuZCBmb3IgfCAgICAgKi8KKworICB2b2lkKiAoKm1ha2VhcmcpKHZhX2xpc3QgKik7CQkJLyogbWFrZSBmaWVsZHR5cGUgYXJnCSAgICAqLworICB2b2lkKiAoKmNvcHlhcmcpKGNvbnN0IHZvaWQgKik7CQkvKiBjb3B5IGZpZWxkdHlwZSBhcmcgCSAgICAqLworICB2b2lkCSgqZnJlZWFyZykodm9pZCAqKTsJCQkvKiBmcmVlIGZpZWxkdHlwZSBhcmcJICAgICovCisKKyNpZiBOQ1VSU0VTX0lOVEVST1BfRlVOQ1MKKyAgdW5pb24geworICAgIGJvb2wgKCpvZmNoZWNrKShGSUVMRCAqLGNvbnN0IHZvaWQgKik7CS8qIGZpZWxkIHZhbGlkYXRpb24JICAgICovCisgICAgYm9vbCAoKmdmY2hlY2spKEZPUk0qLEZJRUxEICosY29uc3Qgdm9pZCopOwkvKiBnZW5lcmljIGZpZWxkIHZhbGlkYXRpb24gKi8KKyAgfSBmaWVsZGNoZWNrOworICB1bmlvbiB7CisgICAgYm9vbCAoKm9jY2hlY2spKGludCxjb25zdCB2b2lkICopOwkJLyogY2hhcmFjdGVyIHZhbGlkYXRpb24gICAgICovCisgICAgYm9vbCAoKmdjY2hlY2spKGludCxGT1JNKiwKKwkJICAgIEZJRUxEKixjb25zdCB2b2lkKik7ICAgICAgICAvKiBnZW5lcmljIGNoYXIgdmFsaWRhdGlvbiAgKi8KKyAgfSBjaGFyY2hlY2s7CisgIHVuaW9uIHsKKyAgICBib29sICgqb25leHQpKEZJRUxEICosY29uc3Qgdm9pZCAqKTsgICAgICAgIC8qIGVudW1lcmF0ZSBuZXh0IHZhbHVlICAgICAqLworICAgIGJvb2wgKCpnbmV4dCkoRk9STSosRklFTEQqLGNvbnN0IHZvaWQqKTsgICAgLyogZ2VuZXJpYyBlbnVtZXJhdGUgbmV4dCAgICovCisgIH0gZW51bV9uZXh0OworICB1bmlvbiB7CisgICAgYm9vbCAoKm9wcmV2KShGSUVMRCAqLGNvbnN0IHZvaWQgKik7CS8qIGVudW1lcmF0ZSBwcmV2IHZhbHVlICAgICAqLworICAgIGJvb2wgKCpncHJldikoRk9STSosRklFTEQqLGNvbnN0IHZvaWQqKTsgICAgLyogZ2VuZXJpYyBlbnVtZXJhdGUgcHJldiAgICovCisgIH0gZW51bV9wcmV2OworICB2b2lkKiAoKmdlbmVyaWNhcmcpKHZvaWQqKTsgICAgICAgICAgICAgICAgICAgLyogQWx0ZXJuYXRlIEFyZyBtZXRob2QgICAgICovCisjZWxzZQorICBib29sCSgqZmNoZWNrKShGSUVMRCAqLGNvbnN0IHZvaWQgKik7CS8qIGZpZWxkIHZhbGlkYXRpb24JKi8KKyAgYm9vbAkoKmNjaGVjaykoaW50LGNvbnN0IHZvaWQgKik7CQkvKiBjaGFyYWN0ZXIgdmFsaWRhdGlvbiAqLworCisgIGJvb2wJKCpuZXh0KShGSUVMRCAqLGNvbnN0IHZvaWQgKik7CQkvKiBlbnVtZXJhdGUgbmV4dCB2YWx1ZSAqLworICBib29sCSgqcHJldikoRklFTEQgKixjb25zdCB2b2lkICopOwkJLyogZW51bWVyYXRlIHByZXYgdmFsdWUgKi8KKyNlbmRpZgorfSBGSUVMRFRZUEU7CisKK3R5cGVkZWYgdm9pZCAoKkZvcm1fSG9vaykoRk9STSAqKTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqICBtaXNjZWxsYW5lb3VzICNkZWZpbmVzICAqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBmaWVsZCBqdXN0aWZpY2F0aW9uICovCisjZGVmaW5lIE5PX0pVU1RJRklDQVRJT04JKDApCisjZGVmaW5lIEpVU1RJRllfTEVGVAkJKDEpCisjZGVmaW5lIEpVU1RJRllfQ0VOVEVSCQkoMikKKyNkZWZpbmUgSlVTVElGWV9SSUdIVAkJKDMpCisKKy8qIGZpZWxkIG9wdGlvbnMgKi8KKyNkZWZpbmUgT19WSVNJQkxFCQkoMHgwMDAxVSkKKyNkZWZpbmUgT19BQ1RJVkUJCSgweDAwMDJVKQorI2RlZmluZSBPX1BVQkxJQwkJKDB4MDAwNFUpCisjZGVmaW5lIE9fRURJVAkJCSgweDAwMDhVKQorI2RlZmluZSBPX1dSQVAJCQkoMHgwMDEwVSkKKyNkZWZpbmUgT19CTEFOSwkJCSgweDAwMjBVKQorI2RlZmluZSBPX0FVVE9TS0lQCQkoMHgwMDQwVSkKKyNkZWZpbmUgT19OVUxMT0sJCSgweDAwODBVKQorI2RlZmluZSBPX1BBU1NPSwkJKDB4MDEwMFUpCisjZGVmaW5lIE9fU1RBVElDCQkoMHgwMjAwVSkKKworLyogZm9ybSBvcHRpb25zICovCisjZGVmaW5lIE9fTkxfT1ZFUkxPQUQJCSgweDAwMDFVKQorI2RlZmluZSBPX0JTX09WRVJMT0FECQkoMHgwMDAyVSkKKworLyogZm9ybSBkcml2ZXIgY29tbWFuZHMgKi8KKyNkZWZpbmUgUkVRX05FWFRfUEFHRQkgKEtFWV9NQVggKyAxKQkvKiBtb3ZlIHRvIG5leHQgcGFnZQkJKi8KKyNkZWZpbmUgUkVRX1BSRVZfUEFHRQkgKEtFWV9NQVggKyAyKQkvKiBtb3ZlIHRvIHByZXZpb3VzIHBhZ2UJKi8KKyNkZWZpbmUgUkVRX0ZJUlNUX1BBR0UJIChLRVlfTUFYICsgMykJLyogbW92ZSB0byBmaXJzdCBwYWdlCQkqLworI2RlZmluZSBSRVFfTEFTVF9QQUdFCSAoS0VZX01BWCArIDQpCS8qIG1vdmUgdG8gbGFzdCBwYWdlCQkqLworCisjZGVmaW5lIFJFUV9ORVhUX0ZJRUxECSAoS0VZX01BWCArIDUpCS8qIG1vdmUgdG8gbmV4dCBmaWVsZAkJKi8KKyNkZWZpbmUgUkVRX1BSRVZfRklFTEQJIChLRVlfTUFYICsgNikJLyogbW92ZSB0byBwcmV2aW91cyBmaWVsZAkqLworI2RlZmluZSBSRVFfRklSU1RfRklFTEQJIChLRVlfTUFYICsgNykJLyogbW92ZSB0byBmaXJzdCBmaWVsZAkJKi8KKyNkZWZpbmUgUkVRX0xBU1RfRklFTEQJIChLRVlfTUFYICsgOCkJLyogbW92ZSB0byBsYXN0IGZpZWxkCQkqLworI2RlZmluZSBSRVFfU05FWFRfRklFTEQJIChLRVlfTUFYICsgOSkJLyogbW92ZSB0byBzb3J0ZWQgbmV4dCBmaWVsZAkqLworI2RlZmluZSBSRVFfU1BSRVZfRklFTEQJIChLRVlfTUFYICsgMTApCS8qIG1vdmUgdG8gc29ydGVkIHByZXYgZmllbGQJKi8KKyNkZWZpbmUgUkVRX1NGSVJTVF9GSUVMRCAoS0VZX01BWCArIDExKQkvKiBtb3ZlIHRvIHNvcnRlZCBmaXJzdCBmaWVsZAkqLworI2RlZmluZSBSRVFfU0xBU1RfRklFTEQJIChLRVlfTUFYICsgMTIpCS8qIG1vdmUgdG8gc29ydGVkIGxhc3QgZmllbGQJKi8KKyNkZWZpbmUgUkVRX0xFRlRfRklFTEQJIChLRVlfTUFYICsgMTMpCS8qIG1vdmUgdG8gbGVmdCB0byBmaWVsZAkqLworI2RlZmluZSBSRVFfUklHSFRfRklFTEQJIChLRVlfTUFYICsgMTQpCS8qIG1vdmUgdG8gcmlnaHQgdG8gZmllbGQJKi8KKyNkZWZpbmUgUkVRX1VQX0ZJRUxECSAoS0VZX01BWCArIDE1KQkvKiBtb3ZlIHRvIHVwIHRvIGZpZWxkCQkqLworI2RlZmluZSBSRVFfRE9XTl9GSUVMRAkgKEtFWV9NQVggKyAxNikJLyogbW92ZSB0byBkb3duIHRvIGZpZWxkCSovCisKKyNkZWZpbmUgUkVRX05FWFRfQ0hBUgkgKEtFWV9NQVggKyAxNykJLyogbW92ZSB0byBuZXh0IGNoYXIgaW4gZmllbGQJKi8KKyNkZWZpbmUgUkVRX1BSRVZfQ0hBUgkgKEtFWV9NQVggKyAxOCkJLyogbW92ZSB0byBwcmV2IGNoYXIgaW4gZmllbGQJKi8KKyNkZWZpbmUgUkVRX05FWFRfTElORQkgKEtFWV9NQVggKyAxOSkJLyogbW92ZSB0byBuZXh0IGxpbmUgaW4gZmllbGQJKi8KKyNkZWZpbmUgUkVRX1BSRVZfTElORQkgKEtFWV9NQVggKyAyMCkJLyogbW92ZSB0byBwcmV2IGxpbmUgaW4gZmllbGQJKi8KKyNkZWZpbmUgUkVRX05FWFRfV09SRAkgKEtFWV9NQVggKyAyMSkJLyogbW92ZSB0byBuZXh0IHdvcmQgaW4gZmllbGQJKi8KKyNkZWZpbmUgUkVRX1BSRVZfV09SRAkgKEtFWV9NQVggKyAyMikJLyogbW92ZSB0byBwcmV2IHdvcmQgaW4gZmllbGQJKi8KKyNkZWZpbmUgUkVRX0JFR19GSUVMRAkgKEtFWV9NQVggKyAyMykJLyogbW92ZSB0byBmaXJzdCBjaGFyIGluIGZpZWxkCSovCisjZGVmaW5lIFJFUV9FTkRfRklFTEQJIChLRVlfTUFYICsgMjQpCS8qIG1vdmUgYWZ0ZXIgbGFzdCBjaGFyIGluIGZsZAkqLworI2RlZmluZSBSRVFfQkVHX0xJTkUJIChLRVlfTUFYICsgMjUpCS8qIG1vdmUgdG8gYmVnaW5uaW5nIG9mIGxpbmUJKi8KKyNkZWZpbmUgUkVRX0VORF9MSU5FCSAoS0VZX01BWCArIDI2KQkvKiBtb3ZlIGFmdGVyIGxhc3QgY2hhciBpbiBsaW5lCSovCisjZGVmaW5lIFJFUV9MRUZUX0NIQVIJIChLRVlfTUFYICsgMjcpCS8qIG1vdmUgbGVmdCBpbiBmaWVsZAkJKi8KKyNkZWZpbmUgUkVRX1JJR0hUX0NIQVIJIChLRVlfTUFYICsgMjgpCS8qIG1vdmUgcmlnaHQgaW4gZmllbGQJCSovCisjZGVmaW5lIFJFUV9VUF9DSEFSCSAoS0VZX01BWCArIDI5KQkvKiBtb3ZlIHVwIGluIGZpZWxkCQkqLworI2RlZmluZSBSRVFfRE9XTl9DSEFSCSAoS0VZX01BWCArIDMwKQkvKiBtb3ZlIGRvd24gaW4gZmllbGQJCSovCisKKyNkZWZpbmUgUkVRX05FV19MSU5FCSAoS0VZX01BWCArIDMxKQkvKiBpbnNlcnQvb3ZlcmxheSBuZXcgbGluZQkqLworI2RlZmluZSBSRVFfSU5TX0NIQVIJIChLRVlfTUFYICsgMzIpCS8qIGluc2VydCBibGFuayBjaGFyIGF0IGN1cnNvcgkqLworI2RlZmluZSBSRVFfSU5TX0xJTkUJIChLRVlfTUFYICsgMzMpCS8qIGluc2VydCBibGFuayBsaW5lIGF0IGN1cnNvcgkqLworI2RlZmluZSBSRVFfREVMX0NIQVIJIChLRVlfTUFYICsgMzQpCS8qIGRlbGV0ZSBjaGFyIGF0IGN1cnNvcgkqLworI2RlZmluZSBSRVFfREVMX1BSRVYJIChLRVlfTUFYICsgMzUpCS8qIGRlbGV0ZSBjaGFyIGJlZm9yZSBjdXJzb3IJKi8KKyNkZWZpbmUgUkVRX0RFTF9MSU5FCSAoS0VZX01BWCArIDM2KQkvKiBkZWxldGUgbGluZSBhdCBjdXJzb3IJKi8KKyNkZWZpbmUgUkVRX0RFTF9XT1JECSAoS0VZX01BWCArIDM3KQkvKiBkZWxldGUgd29yZCBhdCBjdXJzb3IJKi8KKyNkZWZpbmUgUkVRX0NMUl9FT0wJIChLRVlfTUFYICsgMzgpCS8qIGNsZWFyIHRvIGVuZCBvZiBsaW5lCQkqLworI2RlZmluZSBSRVFfQ0xSX0VPRgkgKEtFWV9NQVggKyAzOSkJLyogY2xlYXIgdG8gZW5kIG9mIGZpZWxkCSovCisjZGVmaW5lIFJFUV9DTFJfRklFTEQJIChLRVlfTUFYICsgNDApCS8qIGNsZWFyIGVudGlyZSBmaWVsZAkJKi8KKyNkZWZpbmUgUkVRX09WTF9NT0RFCSAoS0VZX01BWCArIDQxKQkvKiBiZWdpbiBvdmVybGF5IG1vZGUJCSovCisjZGVmaW5lIFJFUV9JTlNfTU9ERQkgKEtFWV9NQVggKyA0MikJLyogYmVnaW4gaW5zZXJ0IG1vZGUJCSovCisjZGVmaW5lIFJFUV9TQ1JfRkxJTkUJIChLRVlfTUFYICsgNDMpCS8qIHNjcm9sbCBmaWVsZCBmb3J3YXJkIGEgbGluZQkqLworI2RlZmluZSBSRVFfU0NSX0JMSU5FCSAoS0VZX01BWCArIDQ0KQkvKiBzY3JvbGwgZmllbGQgYmFja3dhcmQgYSBsaW5lCSovCisjZGVmaW5lIFJFUV9TQ1JfRlBBR0UJIChLRVlfTUFYICsgNDUpCS8qIHNjcm9sbCBmaWVsZCBmb3J3YXJkIGEgcGFnZQkqLworI2RlZmluZSBSRVFfU0NSX0JQQUdFCSAoS0VZX01BWCArIDQ2KQkvKiBzY3JvbGwgZmllbGQgYmFja3dhcmQgYSBwYWdlCSovCisjZGVmaW5lIFJFUV9TQ1JfRkhQQUdFCSAoS0VZX01BWCArIDQ3KSAvKiBzY3JvbGwgZmllbGQgZm9yd2FyZAkgaGFsZiBwYWdlICovCisjZGVmaW5lIFJFUV9TQ1JfQkhQQUdFCSAoS0VZX01BWCArIDQ4KSAvKiBzY3JvbGwgZmllbGQgYmFja3dhcmQgaGFsZiBwYWdlICovCisjZGVmaW5lIFJFUV9TQ1JfRkNIQVIJIChLRVlfTUFYICsgNDkpIC8qIGhvcml6b250YWwgc2Nyb2xsIGNoYXIJKi8KKyNkZWZpbmUgUkVRX1NDUl9CQ0hBUgkgKEtFWV9NQVggKyA1MCkgLyogaG9yaXpvbnRhbCBzY3JvbGwgY2hhcgkqLworI2RlZmluZSBSRVFfU0NSX0hGTElORQkgKEtFWV9NQVggKyA1MSkgLyogaG9yaXpvbnRhbCBzY3JvbGwgbGluZQkqLworI2RlZmluZSBSRVFfU0NSX0hCTElORQkgKEtFWV9NQVggKyA1MikgLyogaG9yaXpvbnRhbCBzY3JvbGwgbGluZQkqLworI2RlZmluZSBSRVFfU0NSX0hGSEFMRgkgKEtFWV9NQVggKyA1MykgLyogaG9yaXpvbnRhbCBzY3JvbGwgaGFsZiBsaW5lCSovCisjZGVmaW5lIFJFUV9TQ1JfSEJIQUxGCSAoS0VZX01BWCArIDU0KSAvKiBob3Jpem9udGFsIHNjcm9sbCBoYWxmIGxpbmUJKi8KKworI2RlZmluZSBSRVFfVkFMSURBVElPTgkgKEtFWV9NQVggKyA1NSkJLyogdmFsaWRhdGUgZmllbGQJCSovCisjZGVmaW5lIFJFUV9ORVhUX0NIT0lDRQkgKEtFWV9NQVggKyA1NikJLyogZGlzcGxheSBuZXh0IGZpZWxkIGNob2ljZQkqLworI2RlZmluZSBSRVFfUFJFVl9DSE9JQ0UJIChLRVlfTUFYICsgNTcpCS8qIGRpc3BsYXkgcHJldiBmaWVsZCBjaG9pY2UJKi8KKworI2RlZmluZSBNSU5fRk9STV9DT01NQU5EIChLRVlfTUFYICsgMSkJLyogdXNlZCBieSBmb3JtX2RyaXZlcgkJKi8KKyNkZWZpbmUgTUFYX0ZPUk1fQ09NTUFORCAoS0VZX01BWCArIDU3KQkvKiB1c2VkIGJ5IGZvcm1fZHJpdmVyCQkqLworCisjaWYgZGVmaW5lZChNQVhfQ09NTUFORCkKKyMgIGlmIChNQVhfRk9STV9DT01NQU5EID4gTUFYX0NPTU1BTkQpCisjICAgIGVycm9yIFNvbWV0aGluZyBpcyB3cm9uZyAtLSBNQVhfRk9STV9DT01NQU5EIGlzIGdyZWF0ZXIgdGhhbiBNQVhfQ09NTUFORAorIyAgZWxpZiAoTUFYX0NPTU1BTkQgIT0gKEtFWV9NQVggKyAxMjgpKQorIyAgICBlcnJvciBTb21ldGhpbmcgaXMgd3JvbmcgLS0gTUFYX0NPTU1BTkQgaXMgYWxyZWFkeSBpbmNvbnNpc3RlbnRseSBkZWZpbmVkLgorIyAgZW5kaWYKKyNlbHNlCisjICBkZWZpbmUgTUFYX0NPTU1BTkQgKEtFWV9NQVggKyAxMjgpCisjZW5kaWYKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqCisJKiAgc3RhbmRhcmQgZmllbGQgdHlwZXMgICoKKwkqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihGSUVMRFRZUEUgKikgVFlQRV9BTFBIQTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoRklFTERUWVBFICopIFRZUEVfQUxOVU07CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKEZJRUxEVFlQRSAqKSBUWVBFX0VOVU07CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKEZJRUxEVFlQRSAqKSBUWVBFX0lOVEVHRVI7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKEZJRUxEVFlQRSAqKSBUWVBFX05VTUVSSUM7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKEZJRUxEVFlQRSAqKSBUWVBFX1JFR0VYUDsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqICBidWlsdC1pbiBhZGRpdGlvbmFsIGZpZWxkIHR5cGVzICAqCisJKiAgVGhleSBhcmUgbm90IGRlZmluZWQgaW4gU1ZyNCAgICAgKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoRklFTERUWVBFICopIFRZUEVfSVBWNDsgICAgICAvKiBJbnRlcm5ldCBJUCBWZXJzaW9uIDQgYWRkcmVzcyAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqCisJKiAgRklFTERUWVBFIHJvdXRpbmVzICAqCisJKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoRklFTERUWVBFICopIG5ld19maWVsZHR5cGUgKAorCQkgICAgYm9vbCAoKiBjb25zdCBmaWVsZF9jaGVjaykoRklFTEQgKixjb25zdCB2b2lkICopLAorCQkgICAgYm9vbCAoKiBjb25zdCBjaGFyX2NoZWNrKShpbnQsY29uc3Qgdm9pZCAqKSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoRklFTERUWVBFICopIGxpbmtfZmllbGR0eXBlKAorCQkgICAgRklFTERUWVBFICosIEZJRUxEVFlQRSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZnJlZV9maWVsZHR5cGUgKEZJRUxEVFlQRSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9maWVsZHR5cGVfYXJnIChGSUVMRFRZUEUgKiwKKwkJICAgIHZvaWQgKiAoKiBjb25zdCBtYWtlX2FyZykodmFfbGlzdCAqKSwKKwkJICAgIHZvaWQgKiAoKiBjb25zdCBjb3B5X2FyZykoY29uc3Qgdm9pZCAqKSwKKwkJICAgIHZvaWQgKCogY29uc3QgZnJlZV9hcmcpKHZvaWQgKikpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJIHNldF9maWVsZHR5cGVfY2hvaWNlIChGSUVMRFRZUEUgKiwKKwkJICAgIGJvb2wgKCogY29uc3QgbmV4dF9jaG9pY2UpKEZJRUxEICosY29uc3Qgdm9pZCAqKSwKKwkgICAgICAJICAgIGJvb2wgKCogY29uc3QgcHJldl9jaG9pY2UpKEZJRUxEICosY29uc3Qgdm9pZCAqKSk7CisKKwkvKioqKioqKioqKioqKioqKioqKgorCSogIEZJRUxEIHJvdXRpbmVzICAqCisJKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGSUVMRCAqKQluZXdfZmllbGQgKGludCxpbnQsaW50LGludCxpbnQsaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGSUVMRCAqKQlkdXBfZmllbGQgKEZJRUxEICosaW50LGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoRklFTEQgKikJbGlua19maWVsZCAoRklFTEQgKixpbnQsaW50KTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZnJlZV9maWVsZCAoRklFTEQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmaWVsZF9pbmZvIChjb25zdCBGSUVMRCAqLGludCAqLGludCAqLGludCAqLGludCAqLGludCAqLGludCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWR5bmFtaWNfZmllbGRfaW5mbyAoY29uc3QgRklFTEQgKixpbnQgKixpbnQgKixpbnQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWF4X2ZpZWxkICggRklFTEQgKixpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJbW92ZV9maWVsZCAoRklFTEQgKixpbnQsaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9maWVsZF90eXBlIChGSUVMRCAqLEZJRUxEVFlQRSAqLC4uLik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbmV3X3BhZ2UgKEZJRUxEICosYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZmllbGRfanVzdCAoRklFTEQgKixpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZmllbGRfanVzdCAoY29uc3QgRklFTEQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZmllbGRfZm9yZSAoRklFTEQgKixjaHR5cGUpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2ZpZWxkX2JhY2sgKEZJRUxEICosY2h0eXBlKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9maWVsZF9wYWQgKEZJRUxEICosaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZpZWxkX3BhZCAoY29uc3QgRklFTEQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZmllbGRfYnVmZmVyIChGSUVMRCAqLGludCxjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2ZpZWxkX3N0YXR1cyAoRklFTEQgKixib29sKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9maWVsZF91c2VycHRyIChGSUVMRCAqLCB2b2lkICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2ZpZWxkX29wdHMgKEZJRUxEICosRmllbGRfT3B0aW9ucyk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmaWVsZF9vcHRzX29uIChGSUVMRCAqLEZpZWxkX09wdGlvbnMpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZmllbGRfb3B0c19vZmYgKEZJRUxEICosRmllbGRfT3B0aW9ucyk7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaHR5cGUpCWZpZWxkX2ZvcmUgKGNvbnN0IEZJRUxEICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNodHlwZSkJZmllbGRfYmFjayAoY29uc3QgRklFTEQgKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKQluZXdfcGFnZSAoY29uc3QgRklFTEQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkJZmllbGRfc3RhdHVzIChjb25zdCBGSUVMRCAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQgKikJZmllbGRfYXJnIChjb25zdCBGSUVMRCAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQgKikJZmllbGRfdXNlcnB0ciAoY29uc3QgRklFTEQgKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGSUVMRFRZUEUgKikJZmllbGRfdHlwZSAoY29uc3QgRklFTEQgKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopCWZpZWxkX2J1ZmZlciAoY29uc3QgRklFTEQgKixpbnQpOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoRmllbGRfT3B0aW9ucykJZmllbGRfb3B0cyAoY29uc3QgRklFTEQgKik7CisKKwkvKioqKioqKioqKioqKioqKioqCisJKiAgRk9STSByb3V0aW5lcyAgKgorCSoqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZPUk0gKikJbmV3X2Zvcm0gKEZJRUxEICoqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZJRUxEICoqKQlmb3JtX2ZpZWxkcyAoY29uc3QgRk9STSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGSUVMRCAqKQljdXJyZW50X2ZpZWxkIChjb25zdCBGT1JNICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopCWZvcm1fd2luIChjb25zdCBGT1JNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKQlmb3JtX3N1YiAoY29uc3QgRk9STSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZvcm1fSG9vaykJZm9ybV9pbml0IChjb25zdCBGT1JNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZvcm1fSG9vaykJZm9ybV90ZXJtIChjb25zdCBGT1JNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZvcm1fSG9vaykJZmllbGRfaW5pdCAoY29uc3QgRk9STSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGb3JtX0hvb2spCWZpZWxkX3Rlcm0gKGNvbnN0IEZPUk0gKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZyZWVfZm9ybSAoRk9STSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9mb3JtX2ZpZWxkcyAoRk9STSAqLEZJRUxEICoqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZpZWxkX2NvdW50IChjb25zdCBGT1JNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2Zvcm1fd2luIChGT1JNICosV0lORE9XICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2Zvcm1fc3ViIChGT1JNICosV0lORE9XICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2N1cnJlbnRfZmllbGQgKEZPUk0gKixGSUVMRCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZpZWxkX2luZGV4IChjb25zdCBGSUVMRCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9mb3JtX3BhZ2UgKEZPUk0gKixpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZm9ybV9wYWdlIChjb25zdCBGT1JNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2NhbGVfZm9ybSAoY29uc3QgRk9STSAqLGludCAqLGludCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9mb3JtX2luaXQgKEZPUk0gKixGb3JtX0hvb2spOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2Zvcm1fdGVybSAoRk9STSAqLEZvcm1fSG9vayk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZmllbGRfaW5pdCAoRk9STSAqLEZvcm1fSG9vayk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZmllbGRfdGVybSAoRk9STSAqLEZvcm1fSG9vayk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlwb3N0X2Zvcm0gKEZPUk0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQl1bnBvc3RfZm9ybSAoRk9STSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXBvc19mb3JtX2N1cnNvciAoRk9STSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZvcm1fZHJpdmVyIChGT1JNICosaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9mb3JtX3VzZXJwdHIgKEZPUk0gKix2b2lkICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2Zvcm1fb3B0cyAoRk9STSAqLEZvcm1fT3B0aW9ucyk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmb3JtX29wdHNfb24gKEZPUk0gKixGb3JtX09wdGlvbnMpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZm9ybV9vcHRzX29mZiAoRk9STSAqLEZvcm1fT3B0aW9ucyk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmb3JtX3JlcXVlc3RfYnlfbmFtZSAoY29uc3QgY2hhciAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IGNoYXIgKikJZm9ybV9yZXF1ZXN0X25hbWUgKGludCk7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkICopCWZvcm1fdXNlcnB0ciAoY29uc3QgRk9STSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZvcm1fT3B0aW9ucykJZm9ybV9vcHRzIChjb25zdCBGT1JNICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkJZGF0YV9haGVhZCAoY29uc3QgRk9STSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKQlkYXRhX2JlaGluZCAoY29uc3QgRk9STSAqKTsKKworI2lmIE5DVVJTRVNfU1BfRlVOQ1MKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGT1JNICopCU5DVVJTRVNfU1BfTkFNRShuZXdfZm9ybSkgKFNDUkVFTiosIEZJRUxEICoqKTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorI2VuZGlmCisKKyNlbmRpZgkvKiBGT1JNX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZnN0YWIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZnN0YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGVjYWQ3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9mc3RhYi5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODAsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpZnN0YWIuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqLworCisjaWZuZGVmIF9GU1RBQl9ICisjZGVmaW5lIF9GU1RBQl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qCisgKiBGaWxlIHN5c3RlbSB0YWJsZSwgc2VlIGZzdGFiKDUpLgorICoKKyAqIFVzZWQgYnkgZHVtcCwgbW91bnQsIHVtb3VudCwgc3dhcG9uLCBmc2NrLCBkZiwgLi4uCisgKgorICogRm9yIHVmcyBmc19zcGVjIGZpZWxkIGlzIHRoZSBibG9jayBzcGVjaWFsIG5hbWUuICBQcm9ncmFtcyB0aGF0IHdhbnQgdG8KKyAqIHVzZSB0aGUgY2hhcmFjdGVyIHNwZWNpYWwgbmFtZSBtdXN0IGNyZWF0ZSB0aGF0IG5hbWUgYnkgcHJlcGVuZGluZyBhICdyJworICogYWZ0ZXIgdGhlIHJpZ2h0IG1vc3Qgc2xhc2guICBRdW90YSBmaWxlcyBhcmUgYWx3YXlzIG5hbWVkICJxdW90YXMiLCBzbworICogaWYgdHlwZSBpcyAicnEiLCB0aGVuIHVzZSBjb25jYXRlbmF0aW9uIG9mIGZzX2ZpbGUgYW5kICJxdW90YXMiIHRvIGxvY2F0ZQorICogcXVvdGEgZmlsZS4KKyAqLworI2RlZmluZQlfUEFUSF9GU1RBQgkiL2V0Yy9mc3RhYiIKKyNkZWZpbmUJRlNUQUIJCSIvZXRjL2ZzdGFiIgkvKiBkZXByZWNhdGVkICovCisKKyNkZWZpbmUJRlNUQUJfUlcJInJ3IgkJLyogcmVhZC93cml0ZSBkZXZpY2UgKi8KKyNkZWZpbmUJRlNUQUJfUlEJInJxIgkJLyogcmVhZC93cml0ZSB3aXRoIHF1b3RhcyAqLworI2RlZmluZQlGU1RBQl9STwkicm8iCQkvKiByZWFkLW9ubHkgZGV2aWNlICovCisjZGVmaW5lCUZTVEFCX1NXCSJzdyIJCS8qIHN3YXAgZGV2aWNlICovCisjZGVmaW5lCUZTVEFCX1hYCSJ4eCIJCS8qIGlnbm9yZSB0b3RhbGx5ICovCisKK3N0cnVjdCBmc3RhYgorICB7CisgICAgY2hhciAqZnNfc3BlYzsJCQkvKiBibG9jayBzcGVjaWFsIGRldmljZSBuYW1lICovCisgICAgY2hhciAqZnNfZmlsZTsJCQkvKiBmaWxlIHN5c3RlbSBwYXRoIHByZWZpeCAqLworICAgIGNoYXIgKmZzX3Zmc3R5cGU7CQkJLyogRmlsZSBzeXN0ZW0gdHlwZSwgdWZzLCBuZnMgKi8KKyAgICBjaGFyICpmc19tbnRvcHM7CQkJLyogTW91bnQgb3B0aW9ucyBhbGEgLW8gKi8KKyAgICBjb25zdCBjaGFyICpmc190eXBlOwkJLyogRlNUQUJfKiBmcm9tIGZzX21udG9wcyAqLworICAgIGludAlmc19mcmVxOwkJCS8qIGR1bXAgZnJlcXVlbmN5LCBpbiBkYXlzICovCisgICAgaW50CWZzX3Bhc3NubzsJCQkvKiBwYXNzIG51bWJlciBvbiBwYXJhbGxlbCBkdW1wICovCisgIH07CisKKworX19CRUdJTl9ERUNMUworCitleHRlcm4gc3RydWN0IGZzdGFiICpnZXRmc2VudCAodm9pZCkgX19USFJPVzsKK2V4dGVybiBzdHJ1Y3QgZnN0YWIgKmdldGZzc3BlYyAoX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CitleHRlcm4gc3RydWN0IGZzdGFiICpnZXRmc2ZpbGUgKF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XOworZXh0ZXJuIGludCBzZXRmc2VudCAodm9pZCkgX19USFJPVzsKK2V4dGVybiB2b2lkIGVuZGZzZW50ICh2b2lkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZnN0YWIuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9mdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwNzBiYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZnRzLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpZnRzLmgJOC4zIChCZXJrZWxleSkgOC8xNC85NAorICovCisKKyNpZm5kZWYJX0ZUU19ICisjZGVmaW5lCV9GVFNfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiBUaGUgZnRzIGludGVyZmFjZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgTEZTIGludGVyZmFjZSB3aGljaAorICAgdHJhbnNwYXJlbnRseSB1c2VzIHRoZSA2NC1iaXQgZmlsZSBhY2Nlc3MgZnVuY3Rpb25zLiAgKi8KKyNpZmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisjIGVycm9yICI8ZnRzLmg+IGNhbm5vdCBiZSB1c2VkIHdpdGggLURfRklMRV9PRkZTRVRfQklUUz09NjQiCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IF9mdHNlbnQgKmZ0c19jdXI7CS8qIGN1cnJlbnQgbm9kZSAqLworCXN0cnVjdCBfZnRzZW50ICpmdHNfY2hpbGQ7CS8qIGxpbmtlZCBsaXN0IG9mIGNoaWxkcmVuICovCisJc3RydWN0IF9mdHNlbnQgKipmdHNfYXJyYXk7CS8qIHNvcnQgYXJyYXkgKi8KKwlkZXZfdCBmdHNfZGV2OwkJCS8qIHN0YXJ0aW5nIGRldmljZSAjICovCisJY2hhciAqZnRzX3BhdGg7CQkJLyogcGF0aCBmb3IgdGhpcyBkZXNjZW50ICovCisJaW50IGZ0c19yZmQ7CQkJLyogZmQgZm9yIHJvb3QgKi8KKwlpbnQgZnRzX3BhdGhsZW47CQkvKiBzaXplb2YocGF0aCkgKi8KKwlpbnQgZnRzX25pdGVtczsJCQkvKiBlbGVtZW50cyBpbiB0aGUgc29ydCBhcnJheSAqLworCWludCAoKmZ0c19jb21wYXIpIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7IC8qIGNvbXBhcmUgZm4gKi8KKworI2RlZmluZQlGVFNfQ09NRk9MTE9XCTB4MDAwMQkJLyogZm9sbG93IGNvbW1hbmQgbGluZSBzeW1saW5rcyAqLworI2RlZmluZQlGVFNfTE9HSUNBTAkweDAwMDIJCS8qIGxvZ2ljYWwgd2FsayAqLworI2RlZmluZQlGVFNfTk9DSERJUgkweDAwMDQJCS8qIGRvbid0IGNoYW5nZSBkaXJlY3RvcmllcyAqLworI2RlZmluZQlGVFNfTk9TVEFUCTB4MDAwOAkJLyogZG9uJ3QgZ2V0IHN0YXQgaW5mbyAqLworI2RlZmluZQlGVFNfUEhZU0lDQUwJMHgwMDEwCQkvKiBwaHlzaWNhbCB3YWxrICovCisjZGVmaW5lCUZUU19TRUVET1QJMHgwMDIwCQkvKiByZXR1cm4gZG90IGFuZCBkb3QtZG90ICovCisjZGVmaW5lCUZUU19YREVWCTB4MDA0MAkJLyogZG9uJ3QgY3Jvc3MgZGV2aWNlcyAqLworI2RlZmluZSBGVFNfV0hJVEVPVVQJMHgwMDgwCQkvKiByZXR1cm4gd2hpdGVvdXQgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUJRlRTX09QVElPTk1BU0sJMHgwMGZmCQkvKiB2YWxpZCB1c2VyIG9wdGlvbiBtYXNrICovCisKKyNkZWZpbmUJRlRTX05BTUVPTkxZCTB4MDEwMAkJLyogKHByaXZhdGUpIGNoaWxkIG5hbWVzIG9ubHkgKi8KKyNkZWZpbmUJRlRTX1NUT1AJMHgwMjAwCQkvKiAocHJpdmF0ZSkgdW5yZWNvdmVyYWJsZSBlcnJvciAqLworCWludCBmdHNfb3B0aW9uczsJCS8qIGZ0c19vcGVuIG9wdGlvbnMsIGdsb2JhbCBmbGFncyAqLworfSBGVFM7CisKK3R5cGVkZWYgc3RydWN0IF9mdHNlbnQgeworCXN0cnVjdCBfZnRzZW50ICpmdHNfY3ljbGU7CS8qIGN5Y2xlIG5vZGUgKi8KKwlzdHJ1Y3QgX2Z0c2VudCAqZnRzX3BhcmVudDsJLyogcGFyZW50IGRpcmVjdG9yeSAqLworCXN0cnVjdCBfZnRzZW50ICpmdHNfbGluazsJLyogbmV4dCBmaWxlIGluIGRpcmVjdG9yeSAqLworCWxvbmcgZnRzX251bWJlcjsJICAgICAgICAvKiBsb2NhbCBudW1lcmljIHZhbHVlICovCisJdm9pZCAqZnRzX3BvaW50ZXI7CSAgICAgICAgLyogbG9jYWwgYWRkcmVzcyB2YWx1ZSAqLworCWNoYXIgKmZ0c19hY2NwYXRoOwkJLyogYWNjZXNzIHBhdGggKi8KKwljaGFyICpmdHNfcGF0aDsJCQkvKiByb290IHBhdGggKi8KKwlpbnQgZnRzX2Vycm5vOwkJCS8qIGVycm5vIGZvciB0aGlzIG5vZGUgKi8KKwlpbnQgZnRzX3N5bWZkOwkJCS8qIGZkIGZvciBzeW1saW5rICovCisJdV9zaG9ydCBmdHNfcGF0aGxlbjsJCS8qIHN0cmxlbihmdHNfcGF0aCkgKi8KKwl1X3Nob3J0IGZ0c19uYW1lbGVuOwkJLyogc3RybGVuKGZ0c19uYW1lKSAqLworCisJaW5vX3QgZnRzX2lubzsJCQkvKiBpbm9kZSAqLworCWRldl90IGZ0c19kZXY7CQkJLyogZGV2aWNlICovCisJbmxpbmtfdCBmdHNfbmxpbms7CQkvKiBsaW5rIGNvdW50ICovCisKKyNkZWZpbmUJRlRTX1JPT1RQQVJFTlRMRVZFTAktMQorI2RlZmluZQlGVFNfUk9PVExFVkVMCQkgMAorCXNob3J0IGZ0c19sZXZlbDsJCS8qIGRlcHRoICgtMSB0byBOKSAqLworCisjZGVmaW5lCUZUU19ECQkgMQkJLyogcHJlb3JkZXIgZGlyZWN0b3J5ICovCisjZGVmaW5lCUZUU19EQwkJIDIJCS8qIGRpcmVjdG9yeSB0aGF0IGNhdXNlcyBjeWNsZXMgKi8KKyNkZWZpbmUJRlRTX0RFRkFVTFQJIDMJCS8qIG5vbmUgb2YgdGhlIGFib3ZlICovCisjZGVmaW5lCUZUU19ETlIJCSA0CQkvKiB1bnJlYWRhYmxlIGRpcmVjdG9yeSAqLworI2RlZmluZQlGVFNfRE9UCQkgNQkJLyogZG90IG9yIGRvdC1kb3QgKi8KKyNkZWZpbmUJRlRTX0RQCQkgNgkJLyogcG9zdG9yZGVyIGRpcmVjdG9yeSAqLworI2RlZmluZQlGVFNfRVJSCQkgNwkJLyogZXJyb3I7IGVycm5vIGlzIHNldCAqLworI2RlZmluZQlGVFNfRgkJIDgJCS8qIHJlZ3VsYXIgZmlsZSAqLworI2RlZmluZQlGVFNfSU5JVAkgOQkJLyogaW5pdGlhbGl6ZWQgb25seSAqLworI2RlZmluZQlGVFNfTlMJCTEwCQkvKiBzdGF0KDIpIGZhaWxlZCAqLworI2RlZmluZQlGVFNfTlNPSwkxMQkJLyogbm8gc3RhdCgyKSByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUJRlRTX1NMCQkxMgkJLyogc3ltYm9saWMgbGluayAqLworI2RlZmluZQlGVFNfU0xOT05FCTEzCQkvKiBzeW1ib2xpYyBsaW5rIHdpdGhvdXQgdGFyZ2V0ICovCisjZGVmaW5lIEZUU19XCQkxNAkJLyogd2hpdGVvdXQgb2JqZWN0ICovCisJdV9zaG9ydCBmdHNfaW5mbzsJCS8qIHVzZXIgZmxhZ3MgZm9yIEZUU0VOVCBzdHJ1Y3R1cmUgKi8KKworI2RlZmluZQlGVFNfRE9OVENIRElSCSAweDAxCQkvKiBkb24ndCBjaGRpciAuLiB0byB0aGUgcGFyZW50ICovCisjZGVmaW5lCUZUU19TWU1GT0xMT1cJIDB4MDIJCS8qIGZvbGxvd2VkIGEgc3ltbGluayB0byBnZXQgaGVyZSAqLworCXVfc2hvcnQgZnRzX2ZsYWdzOwkJLyogcHJpdmF0ZSBmbGFncyBmb3IgRlRTRU5UIHN0cnVjdHVyZSAqLworCisjZGVmaW5lCUZUU19BR0FJTgkgMQkJLyogcmVhZCBub2RlIGFnYWluICovCisjZGVmaW5lCUZUU19GT0xMT1cJIDIJCS8qIGZvbGxvdyBzeW1ib2xpYyBsaW5rICovCisjZGVmaW5lCUZUU19OT0lOU1RSCSAzCQkvKiBubyBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUJRlRTX1NLSVAJIDQJCS8qIGRpc2NhcmQgbm9kZSAqLworCXVfc2hvcnQgZnRzX2luc3RyOwkJLyogZnRzX3NldCgpIGluc3RydWN0aW9ucyAqLworCisJc3RydWN0IHN0YXQgKmZ0c19zdGF0cDsJCS8qIHN0YXQoMikgaW5mb3JtYXRpb24gKi8KKwljaGFyIGZ0c19uYW1lWzFdOwkJLyogZmlsZSBuYW1lICovCit9IEZUU0VOVDsKKworX19CRUdJTl9ERUNMUworRlRTRU5UCSpmdHNfY2hpbGRyZW4gKEZUUyAqLCBpbnQpOworaW50CSBmdHNfY2xvc2UgKEZUUyAqKTsKK0ZUUwkqZnRzX29wZW4gKGNoYXIgKiBjb25zdCAqLCBpbnQsCisJCSAgIGludCAoKikoY29uc3QgRlRTRU5UICoqLCBjb25zdCBGVFNFTlQgKiopKTsKK0ZUU0VOVAkqZnRzX3JlYWQgKEZUUyAqKTsKK2ludAkgZnRzX3NldCAoRlRTICosIEZUU0VOVCAqLCBpbnQpIF9fVEhST1c7CitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZnRzLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZnR3LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Z0dy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZGZmODgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2Z0dy5oCkBAIC0wLDAgKzEsMTc4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5Ni0xOTk5LDIwMDMsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVgvT3BlbiBQb3J0YWJpbGl0eSBHdWlkZSA0LjI6IGZ0dy5oCisgKi8KKworI2lmbmRlZiBfRlRXX0gKKyNkZWZpbmUJX0ZUV19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogVmFsdWVzIGZvciB0aGUgRkxBRyBhcmd1bWVudCB0byB0aGUgdXNlciBmdW5jdGlvbiBwYXNzZWQgdG8gYGZ0dycKKyAgIGFuZCAnbmZ0dycuICAqLworZW51bQoreworICBGVFdfRiwJCS8qIFJlZ3VsYXIgZmlsZS4gICovCisjZGVmaW5lIEZUV19GCSBGVFdfRgorICBGVFdfRCwJCS8qIERpcmVjdG9yeS4gICovCisjZGVmaW5lIEZUV19ECSBGVFdfRAorICBGVFdfRE5SLAkJLyogVW5yZWFkYWJsZSBkaXJlY3RvcnkuICAqLworI2RlZmluZSBGVFdfRE5SCSBGVFdfRE5SCisgIEZUV19OUywJCS8qIFVuc3RhdGFibGUgZmlsZS4gICovCisjZGVmaW5lIEZUV19OUwkgRlRXX05TCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisKKyAgRlRXX1NMLAkJLyogU3ltYm9saWMgbGluay4gICovCisjIGRlZmluZSBGVFdfU0wJIEZUV19TTAorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogVGhlc2UgZmxhZ3MgYXJlIG9ubHkgcGFzc2VkIGZyb20gdGhlIGBuZnR3JyBmdW5jdGlvbi4gICovCisgIEZUV19EUCwJCS8qIERpcmVjdG9yeSwgYWxsIHN1YmRpcnMgaGF2ZSBiZWVuIHZpc2l0ZWQuICovCisjIGRlZmluZSBGVFdfRFAJIEZUV19EUAorICBGVFdfU0xOCQkvKiBTeW1ib2xpYyBsaW5rIG5hbWluZyBub24tZXhpc3RpbmcgZmlsZS4gICovCisjIGRlZmluZSBGVFdfU0xOIEZUV19TTE4KKworI2VuZGlmCS8qIGV4dGVuZGVkIFgvT3BlbiAqLworfTsKKworCisjaWZkZWYgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIEZsYWdzIGZvciBmb3VydGggYXJndW1lbnQgb2YgYG5mdHcnLiAgKi8KK2VudW0KK3sKKyAgRlRXX1BIWVMgPSAxLAkJLyogUGVyZm9ybSBwaHlzaWNhbCB3YWxrLCBpZ25vcmUgc3ltbGlua3MuICAqLworIyBkZWZpbmUgRlRXX1BIWVMJRlRXX1BIWVMKKyAgRlRXX01PVU5UID0gMiwJLyogUmVwb3J0IG9ubHkgZmlsZXMgb24gc2FtZSBmaWxlIHN5c3RlbSBhcyB0aGUKKwkJCSAgIGFyZ3VtZW50LiAgKi8KKyMgZGVmaW5lIEZUV19NT1VOVAlGVFdfTU9VTlQKKyAgRlRXX0NIRElSID0gNCwJLyogQ2hhbmdlIHRvIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIHByb2Nlc3NpbmcgaXQuICAqLworIyBkZWZpbmUgRlRXX0NIRElSCUZUV19DSERJUgorICBGVFdfREVQVEggPSA4CQkvKiBSZXBvcnQgZmlsZXMgaW4gZGlyZWN0b3J5IGJlZm9yZSBkaXJlY3RvcnkgaXRzZWxmLiovCisjIGRlZmluZSBGVFdfREVQVEgJRlRXX0RFUFRICisjIGlmZGVmIF9fVVNFX0dOVQorICAsCisgIEZUV19BQ1RJT05SRVRWQUwgPSAxNgkvKiBBc3N1bWUgY2FsbGJhY2sgdG8gcmV0dXJuIEZUV18qIHZhbHVlcyBpbnN0ZWFkIG9mCisJCQkgICB6ZXJvIHRvIGNvbnRpbnVlIGFuZCBub24temVybyB0byB0ZXJtaW5hdGUuICAqLworIyAgZGVmaW5lIEZUV19BQ1RJT05SRVRWQUwgRlRXX0FDVElPTlJFVFZBTAorIyBlbmRpZgorfTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogUmV0dXJuIHZhbHVlcyBmcm9tIGNhbGxiYWNrIGZ1bmN0aW9ucy4gICovCitlbnVtCit7CisgIEZUV19DT05USU5VRSA9IDAsCS8qIENvbnRpbnVlIHdpdGggbmV4dCBzaWJsaW5nIG9yIGZvciBGVFdfRCB3aXRoIHRoZQorCQkJICAgZmlyc3QgY2hpbGQuICAqLworIyBkZWZpbmUgRlRXX0NPTlRJTlVFCUZUV19DT05USU5VRQorICBGVFdfU1RPUCA9IDEsCQkvKiBSZXR1cm4gZnJvbSBgZnR3JyBvciBgbmZ0dycgd2l0aCBGVFdfU1RPUCBhcyByZXR1cm4KKwkJCSAgIHZhbHVlLiAgKi8KKyMgZGVmaW5lIEZUV19TVE9QCUZUV19TVE9QCisgIEZUV19TS0lQX1NVQlRSRUUgPSAyLAkvKiBPbmx5IG1lYW5pbmdmdWwgZm9yIEZUV19EOiBEb24ndCB3YWxrIHRocm91Z2ggdGhlCisJCQkgICBzdWJ0cmVlLCBpbnN0ZWFkIGp1c3QgY29udGludWUgd2l0aCBpdHMgbmV4dAorCQkJICAgc2libGluZy4gKi8KKyMgZGVmaW5lIEZUV19TS0lQX1NVQlRSRUUgRlRXX1NLSVBfU1VCVFJFRQorICBGVFdfU0tJUF9TSUJMSU5HUyA9IDMsLyogQ29udGludWUgd2l0aCBGVFdfRFAgY2FsbGJhY2sgZm9yIGN1cnJlbnQgZGlyZWN0b3J5CisJCQkgICAgKGlmIEZUV19ERVBUSCkgYW5kIHRoZW4gaXRzIHNpYmxpbmdzLiAgKi8KKyMgZGVmaW5lIEZUV19TS0lQX1NJQkxJTkdTIEZUV19TS0lQX1NJQkxJTkdTCit9OworI2VuZGlmCisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciBmb3VydGggYXJndW1lbnQgdG8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGBuZnR3Jy4gICovCitzdHJ1Y3QgRlRXCisgIHsKKyAgICBpbnQgYmFzZTsKKyAgICBpbnQgbGV2ZWw7CisgIH07CisjZW5kaWYJLyogZXh0ZW5kZWQgWC9PcGVuICovCisKKworLyogQ29udmVuaWVudCB0eXBlcyBmb3IgY2FsbGJhY2sgZnVuY3Rpb25zLiAgKi8KK3R5cGVkZWYgaW50ICgqX19mdHdfZnVuY190KSAoX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkJICAgICBfX2NvbnN0IHN0cnVjdCBzdGF0ICpfX3N0YXR1cywgaW50IF9fZmxhZyk7CisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3R5cGVkZWYgaW50ICgqX19mdHc2NF9mdW5jX3QpIChfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCQkgICAgICAgX19jb25zdCBzdHJ1Y3Qgc3RhdDY0ICpfX3N0YXR1cywgaW50IF9fZmxhZyk7CisjZW5kaWYKKyNpZmRlZiBfX1VTRV9YT1BFTl9FWFRFTkRFRAordHlwZWRlZiBpbnQgKCpfX25mdHdfZnVuY190KSAoX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkJICAgICAgX19jb25zdCBzdHJ1Y3Qgc3RhdCAqX19zdGF0dXMsIGludCBfX2ZsYWcsCisJCQkgICAgICBzdHJ1Y3QgRlRXICpfX2luZm8pOworIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAordHlwZWRlZiBpbnQgKCpfX25mdHc2NF9mdW5jX3QpIChfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCQkJX19jb25zdCBzdHJ1Y3Qgc3RhdDY0ICpfX3N0YXR1cywKKwkJCQlpbnQgX19mbGFnLCBzdHJ1Y3QgRlRXICpfX2luZm8pOworIyBlbmRpZgorI2VuZGlmCisKKy8qIENhbGwgYSBmdW5jdGlvbiBvbiBldmVyeSBlbGVtZW50IGluIGEgZGlyZWN0b3J5IHRyZWUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGZ0dyAoX19jb25zdCBjaGFyICpfX2RpciwgX19mdHdfZnVuY190IF9fZnVuYywgaW50IF9fZGVzY3JpcHRvcnMpCisgICAgIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoZnR3LCAoX19jb25zdCBjaGFyICpfX2RpciwgX19mdHdfZnVuY190IF9fZnVuYywKKwkJCSAgICAgaW50IF9fZGVzY3JpcHRvcnMpLCBmdHc2NCkgX19ub25udWxsICgoMSwgMikpOworIyBlbHNlCisjICBkZWZpbmUgZnR3IGZ0dzY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBmdHc2NCAoX19jb25zdCBjaGFyICpfX2RpciwgX19mdHc2NF9mdW5jX3QgX19mdW5jLAorCQkgIGludCBfX2Rlc2NyaXB0b3JzKSBfX25vbm51bGwgKCgxLCAyKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBDYWxsIGEgZnVuY3Rpb24gb24gZXZlcnkgZWxlbWVudCBpbiBhIGRpcmVjdG9yeSB0cmVlLiAgRkxBRyBhbGxvd3MKKyAgIHRvIHNwZWNpZnkgdGhlIGJlaGF2aW91ciBtb3JlIGRldGFpbGVkLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgbmZ0dyAoX19jb25zdCBjaGFyICpfX2RpciwgX19uZnR3X2Z1bmNfdCBfX2Z1bmMsIGludCBfX2Rlc2NyaXB0b3JzLAorCQkgaW50IF9fZmxhZykgX19ub25udWxsICgoMSwgMikpOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKG5mdHcsIChfX2NvbnN0IGNoYXIgKl9fZGlyLCBfX25mdHdfZnVuY190IF9fZnVuYywKKwkJCSAgICAgIGludCBfX2Rlc2NyaXB0b3JzLCBpbnQgX19mbGFnKSwgbmZ0dzY0KQorICAgICBfX25vbm51bGwgKCgxLCAyKSk7CisjICBlbHNlCisjICAgZGVmaW5lIG5mdHcgbmZ0dzY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBuZnR3NjQgKF9fY29uc3QgY2hhciAqX19kaXIsIF9fbmZ0dzY0X2Z1bmNfdCBfX2Z1bmMsCisJCSAgIGludCBfX2Rlc2NyaXB0b3JzLCBpbnQgX19mbGFnKSBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVuZGlmCisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIGZ0dy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2djb252LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2djb252LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2ZDM4MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ2NvbnYuaApAQCAtMCwwICsxLDE4MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTksIDIwMDAtMjAwMiwgMjAwNywgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogVGhpcyBoZWFkZXIgcHJvdmlkZXMgbm8gaW50ZXJmYWNlIGZvciBhIHVzZXIgdG8gdGhlIGludGVybmFscyBvZgorICAgdGhlIGdjb252IGltcGxlbWVudGF0aW9uIGluIHRoZSBsaWJjLiAgVGhlcmVmb3JlIHRoZXJlIGlzIG5vIHVzZQorICAgZm9yIHRoZXNlIGRlZmluaXRpb25zIGJlc2lkZSBmb3Igd3JpdGluZyBhZGRpdGlvbmFsIGdjb252IG1vZHVsZXMuICAqLworCisjaWZuZGVmIF9HQ09OVl9ICisjZGVmaW5lIF9HQ09OVl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZGVmaW5lIF9fbmVlZF9tYnN0YXRlX3QKKyNkZWZpbmUgX19uZWVkX3dpbnRfdAorI2luY2x1ZGUgPHdjaGFyLmg+CisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNkZWZpbmUgX19uZWVkX3djaGFyX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogSVNPIDEwNjQ2IHZhbHVlIHVzZWQgdG8gc2lnbmFsIGludmFsaWQgdmFsdWUuICAqLworI2RlZmluZSBfX1VOS05PV05fMTA2NDZfQ0hBUgkoKHdjaGFyX3QpIDB4ZmZmZCkKKworLyogRXJyb3IgY29kZXMgZm9yIGdjb252IGZ1bmN0aW9ucy4gICovCitlbnVtCit7CisgIF9fR0NPTlZfT0sgPSAwLAorICBfX0dDT05WX05PQ09OViwKKyAgX19HQ09OVl9OT0RCLAorICBfX0dDT05WX05PTUVNLAorCisgIF9fR0NPTlZfRU1QVFlfSU5QVVQsCisgIF9fR0NPTlZfRlVMTF9PVVRQVVQsCisgIF9fR0NPTlZfSUxMRUdBTF9JTlBVVCwKKyAgX19HQ09OVl9JTkNPTVBMRVRFX0lOUFVULAorCisgIF9fR0NPTlZfSUxMRUdBTF9ERVNDUklQVE9SLAorICBfX0dDT05WX0lOVEVSTkFMX0VSUk9SCit9OworCisKKy8qIEZsYWdzIHRoZSBgX19nY29udl9vcGVuJyBmdW5jdGlvbiBjYW4gc2V0LiAgKi8KK2VudW0KK3sKKyAgX19HQ09OVl9JU19MQVNUID0gMHgwMDAxLAorICBfX0dDT05WX0lHTk9SRV9FUlJPUlMgPSAweDAwMDIsCisgIF9fR0NPTlZfU1dBUCA9IDB4MDAwNAorfTsKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gICovCitzdHJ1Y3QgX19nY29udl9zdGVwOworc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhOworc3RydWN0IF9fZ2NvbnZfbG9hZGVkX29iamVjdDsKK3N0cnVjdCBfX2djb252X3RyYW5zX2RhdGE7CisKKworLyogVHlwZSBvZiBhIGNvbnZlcnNpb24gZnVuY3Rpb24uICAqLwordHlwZWRlZiBpbnQgKCpfX2djb252X2ZjdCkgKHN0cnVjdCBfX2djb252X3N0ZXAgKiwgc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhICosCisJCQkgICAgX19jb25zdCB1bnNpZ25lZCBjaGFyICoqLCBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwKKwkJCSAgICB1bnNpZ25lZCBjaGFyICoqLCBzaXplX3QgKiwgaW50LCBpbnQpOworCisvKiBUeXBlIG9mIGEgc3BlY2lhbGl6ZWQgY29udmVyc2lvbiBmdW5jdGlvbiBmb3IgYSBzaW5nbGUgYnl0ZSB0byBJTlRFUk5BTC4gICovCit0eXBlZGVmIHdpbnRfdCAoKl9fZ2NvbnZfYnRvd2NfZmN0KSAoc3RydWN0IF9fZ2NvbnZfc3RlcCAqLCB1bnNpZ25lZCBjaGFyKTsKKworLyogQ29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgZm9yIGxvY2FsIGRhdGEgZm9yIGNvbnZlcnNpb24gc3RlcC4gICovCit0eXBlZGVmIGludCAoKl9fZ2NvbnZfaW5pdF9mY3QpIChzdHJ1Y3QgX19nY29udl9zdGVwICopOwordHlwZWRlZiB2b2lkICgqX19nY29udl9lbmRfZmN0KSAoc3RydWN0IF9fZ2NvbnZfc3RlcCAqKTsKKworCisvKiBUeXBlIG9mIGEgdHJhbnNsaXRlcmF0aW9uL3RyYW5zc2NyaXB0aW9uIGZ1bmN0aW9uLiAgKi8KK3R5cGVkZWYgaW50ICgqX19nY29udl90cmFuc19mY3QpIChzdHJ1Y3QgX19nY29udl9zdGVwICosCisJCQkJICBzdHJ1Y3QgX19nY29udl9zdGVwX2RhdGEgKiwgdm9pZCAqLAorCQkJCSAgX19jb25zdCB1bnNpZ25lZCBjaGFyICosCisJCQkJICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiosCisJCQkJICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKiwKKwkJCQkgIHNpemVfdCAqKTsKKworLyogRnVuY3Rpb24gdG8gY2FsbCB0byBwcm92aWRlIHRyYW5zbGl0ZXJhdGlvbiBtb2R1bGUgd2l0aCBjb250ZXh0LiAgKi8KK3R5cGVkZWYgaW50ICgqX19nY29udl90cmFuc19jb250ZXh0X2ZjdCkgKHZvaWQgKiwgX19jb25zdCB1bnNpZ25lZCBjaGFyICosCisJCQkJCSAgX19jb25zdCB1bnNpZ25lZCBjaGFyICosCisJCQkJCSAgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopOworCisvKiBGdW5jdGlvbiB0byBxdWVyeSBtb2R1bGUgYWJvdXQgc3VwcG9ydGVkIGVuY29kZWQgY2hhcmFjdGVyIHNldHMuICAqLwordHlwZWRlZiBpbnQgKCpfX2djb252X3RyYW5zX3F1ZXJ5X2ZjdCkgKF9fY29uc3QgY2hhciAqLCBfX2NvbnN0IGNoYXIgKioqLAorCQkJCQlzaXplX3QgKik7CisKKy8qIENvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIGZvciBsb2NhbCBkYXRhIGZvciB0cmFuc2xpdGVyYXRpb24uICAqLwordHlwZWRlZiBpbnQgKCpfX2djb252X3RyYW5zX2luaXRfZmN0KSAodm9pZCAqKiwgY29uc3QgY2hhciAqKTsKK3R5cGVkZWYgdm9pZCAoKl9fZ2NvbnZfdHJhbnNfZW5kX2ZjdCkgKHZvaWQgKik7CisKK3N0cnVjdCBfX2djb252X3RyYW5zX2RhdGEKK3sKKyAgLyogVHJhbnNsaXRlcmF0aW9uL1RyYW5zc2NyaXB0aW9uIGZ1bmN0aW9uLiAgKi8KKyAgX19nY29udl90cmFuc19mY3QgX190cmFuc19mY3Q7CisgIF9fZ2NvbnZfdHJhbnNfY29udGV4dF9mY3QgX190cmFuc19jb250ZXh0X2ZjdDsKKyAgX19nY29udl90cmFuc19lbmRfZmN0IF9fdHJhbnNfZW5kX2ZjdDsKKyAgdm9pZCAqX19kYXRhOworICBzdHJ1Y3QgX19nY29udl90cmFuc19kYXRhICpfX25leHQ7Cit9OworCisKKy8qIERlc2NyaXB0aW9uIG9mIGEgY29udmVyc2lvbiBzdGVwLiAgKi8KK3N0cnVjdCBfX2djb252X3N0ZXAKK3sKKyAgc3RydWN0IF9fZ2NvbnZfbG9hZGVkX29iamVjdCAqX19zaGxpYl9oYW5kbGU7CisgIF9fY29uc3QgY2hhciAqX19tb2RuYW1lOworCisgIGludCBfX2NvdW50ZXI7CisKKyAgY2hhciAqX19mcm9tX25hbWU7CisgIGNoYXIgKl9fdG9fbmFtZTsKKworICBfX2djb252X2ZjdCBfX2ZjdDsKKyAgX19nY29udl9idG93Y19mY3QgX19idG93Y19mY3Q7CisgIF9fZ2NvbnZfaW5pdF9mY3QgX19pbml0X2ZjdDsKKyAgX19nY29udl9lbmRfZmN0IF9fZW5kX2ZjdDsKKworICAvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCBvciBwcm9kdWNlZCBpbiB0aGlzCisgICAgIHN0ZXAuICBUaGlzIGhlbHBzIG9wdGltaXppbmcgdGhlIGJ1ZmZlciBzaXplcy4gICovCisgIGludCBfX21pbl9uZWVkZWRfZnJvbTsKKyAgaW50IF9fbWF4X25lZWRlZF9mcm9tOworICBpbnQgX19taW5fbmVlZGVkX3RvOworICBpbnQgX19tYXhfbmVlZGVkX3RvOworCisgIC8qIEZsYWcgd2hldGhlciB0aGlzIGlzIGEgc3RhdGVmdWwgZW5jb2Rpbmcgb3Igbm90LiAgKi8KKyAgaW50IF9fc3RhdGVmdWw7CisKKyAgdm9pZCAqX19kYXRhOwkJLyogUG9pbnRlciB0byBzdGVwLWxvY2FsIGRhdGEuICAqLworfTsKKworLyogQWRkaXRpb25hbCBkYXRhIGZvciBzdGVwcyBpbiB1c2Ugb2YgY29udmVyc2lvbiBkZXNjcmlwdG9yLiAgVGhpcyBpcworICAgYWxsb2NhdGVkIGJ5IHRoZSBgaW5pdCcgZnVuY3Rpb24uICAqLworc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhCit7CisgIHVuc2lnbmVkIGNoYXIgKl9fb3V0YnVmOyAgICAvKiBPdXRwdXQgYnVmZmVyIGZvciB0aGlzIHN0ZXAuICAqLworICB1bnNpZ25lZCBjaGFyICpfX291dGJ1ZmVuZDsgLyogQWRkcmVzcyBvZiBmaXJzdCBieXRlIGFmdGVyIHRoZSBvdXRwdXQKKwkJCQkgYnVmZmVyLiAgKi8KKworICAvKiBJcyB0aGlzIHRoZSBsYXN0IG1vZHVsZSBpbiB0aGUgY2hhaW4uICAqLworICBpbnQgX19mbGFnczsKKworICAvKiBDb3VudGVyIGZvciBudW1iZXIgb2YgaW52b2NhdGlvbnMgb2YgdGhlIG1vZHVsZSBmdW5jdGlvbiBmb3IgdGhpcworICAgICBkZXNjcmlwdG9yLiAgKi8KKyAgaW50IF9faW52b2NhdGlvbl9jb3VudGVyOworCisgIC8qIEZsYWcgd2hldGhlciB0aGlzIGlzIGFuIGludGVybmFsIHVzZSBvZiB0aGUgbW9kdWxlIChpbiB0aGUgbWIqdG93YyoKKyAgICAgYW5kIHdjKnRvbWIqIGZ1bmN0aW9ucykgb3IgcmVndWxhciB3aXRoIGljb252KDMpLiAgKi8KKyAgaW50IF9faW50ZXJuYWxfdXNlOworCisgIF9fbWJzdGF0ZV90ICpfX3N0YXRlcDsKKyAgX19tYnN0YXRlX3QgX19zdGF0ZTsJLyogVGhpcyBlbGVtZW50IG11c3Qgbm90IGJlIHVzZWQgZGlyZWN0bHkgYnkKKwkJCSAgIGFueSBtb2R1bGU7IGFsd2F5cyB1c2UgU1RBVEVQISAgKi8KKworICAvKiBUcmFuc2xpdGVyYXRpb24gaW5mb3JtYXRpb24uICAqLworICBzdHJ1Y3QgX19nY29udl90cmFuc19kYXRhICpfX3RyYW5zOworfTsKKworCisvKiBDb21iaW5lIGNvbnZlcnNpb24gc3RlcCBkZXNjcmlwdGlvbiB3aXRoIGRhdGEuICAqLwordHlwZWRlZiBzdHJ1Y3QgX19nY29udl9pbmZvCit7CisgIHNpemVfdCBfX25zdGVwczsKKyAgc3RydWN0IF9fZ2NvbnZfc3RlcCAqX19zdGVwczsKKyAgX19leHRlbnNpb25fXyBzdHJ1Y3QgX19nY29udl9zdGVwX2RhdGEgX19kYXRhIF9fZmxleGFycjsKK30gKl9fZ2NvbnZfdDsKKworI2VuZGlmIC8qIGdjb252LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ2V0b3B0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2dldG9wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMmZhMjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2dldG9wdC5oCkBAIC0wLDAgKzEsMTkzIEBACisvKiBEZWNsYXJhdGlvbnMgZm9yIGdldG9wdC4KKyAgIENvcHlyaWdodCAoQykgMTk4OS0xOTk0LDE5OTYtMTk5OSwyMDAxLDIwMDMsMjAwNCwyMDA5LDIwMTAKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9HRVRPUFRfSAorCisjaWZuZGVmIF9fbmVlZF9nZXRvcHQKKyMgZGVmaW5lIF9HRVRPUFRfSCAxCisjZW5kaWYKKworLyogSWYgX19HTlVfTElCUkFSWV9fIGlzIG5vdCBhbHJlYWR5IGRlZmluZWQsIGVpdGhlciB3ZSBhcmUgYmVpbmcgdXNlZAorICAgc3RhbmRhbG9uZSwgb3IgdGhpcyBpcyB0aGUgZmlyc3QgaGVhZGVyIGluY2x1ZGVkIGluIHRoZSBzb3VyY2UgZmlsZS4KKyAgIElmIHdlIGFyZSBiZWluZyB1c2VkIHdpdGggZ2xpYmMsIHdlIG5lZWQgdG8gaW5jbHVkZSA8ZmVhdHVyZXMuaD4sIGJ1dAorICAgdGhhdCBkb2VzIG5vdCBleGlzdCBpZiB3ZSBhcmUgc3RhbmRhbG9uZS4gIFNvOiBpZiBfX0dOVV9MSUJSQVJZX18gaXMKKyAgIG5vdCBkZWZpbmVkLCBpbmNsdWRlIDxjdHlwZS5oPiwgd2hpY2ggd2lsbCBwdWxsIGluIDxmZWF0dXJlcy5oPiBmb3IgdXMKKyAgIGlmIGl0J3MgZnJvbSBnbGliYy4gIChXaHkgY3R5cGUuaD8gIEl0J3MgZ3VhcmFudGVlZCB0byBleGlzdCBhbmQgaXQKKyAgIGRvZXNuJ3QgZmxvb2QgdGhlIG5hbWVzcGFjZSB3aXRoIHN0dWZmIHRoZSB3YXkgc29tZSBvdGhlciBoZWFkZXJzIGRvLikgICovCisjaWYgIWRlZmluZWQgX19HTlVfTElCUkFSWV9fCisjIGluY2x1ZGUgPGN0eXBlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfX1RIUk9XCisjIGlmbmRlZiBfX0dOVUNfUFJFUkVRCisjICBkZWZpbmUgX19HTlVDX1BSRVJFUShtYWosIG1pbikgKDApCisjIGVuZGlmCisjIGlmIGRlZmluZWQgX19jcGx1c3BsdXMgJiYgX19HTlVDX1BSRVJFUSAoMiw4KQorIyAgZGVmaW5lIF9fVEhST1cJdGhyb3cgKCkKKyMgZWxzZQorIyAgZGVmaW5lIF9fVEhST1cKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEZvciBjb21tdW5pY2F0aW9uIGZyb20gYGdldG9wdCcgdG8gdGhlIGNhbGxlci4KKyAgIFdoZW4gYGdldG9wdCcgZmluZHMgYW4gb3B0aW9uIHRoYXQgdGFrZXMgYW4gYXJndW1lbnQsCisgICB0aGUgYXJndW1lbnQgdmFsdWUgaXMgcmV0dXJuZWQgaGVyZS4KKyAgIEFsc28sIHdoZW4gYG9yZGVyaW5nJyBpcyBSRVRVUk5fSU5fT1JERVIsCisgICBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50IGlzIHJldHVybmVkIGhlcmUuICAqLworCitleHRlcm4gY2hhciAqb3B0YXJnOworCisvKiBJbmRleCBpbiBBUkdWIG9mIHRoZSBuZXh0IGVsZW1lbnQgdG8gYmUgc2Nhbm5lZC4KKyAgIFRoaXMgaXMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiB0byBhbmQgZnJvbSB0aGUgY2FsbGVyCisgICBhbmQgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBzdWNjZXNzaXZlIGNhbGxzIHRvIGBnZXRvcHQnLgorCisgICBPbiBlbnRyeSB0byBgZ2V0b3B0JywgemVybyBtZWFucyB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsOyBpbml0aWFsaXplLgorCisgICBXaGVuIGBnZXRvcHQnIHJldHVybnMgLTEsIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvZiB0aGUKKyAgIG5vbi1vcHRpb24gZWxlbWVudHMgdGhhdCB0aGUgY2FsbGVyIHNob3VsZCBpdHNlbGYgc2Nhbi4KKworICAgT3RoZXJ3aXNlLCBgb3B0aW5kJyBjb21tdW5pY2F0ZXMgZnJvbSBvbmUgY2FsbCB0byB0aGUgbmV4dAorICAgaG93IG11Y2ggb2YgQVJHViBoYXMgYmVlbiBzY2FubmVkIHNvIGZhci4gICovCisKK2V4dGVybiBpbnQgb3B0aW5kOworCisvKiBDYWxsZXJzIHN0b3JlIHplcm8gaGVyZSB0byBpbmhpYml0IHRoZSBlcnJvciBtZXNzYWdlIGBnZXRvcHQnIHByaW50cworICAgZm9yIHVucmVjb2duaXplZCBvcHRpb25zLiAgKi8KKworZXh0ZXJuIGludCBvcHRlcnI7CisKKy8qIFNldCB0byBhbiBvcHRpb24gY2hhcmFjdGVyIHdoaWNoIHdhcyB1bnJlY29nbml6ZWQuICAqLworCitleHRlcm4gaW50IG9wdG9wdDsKKworI2lmbmRlZiBfX25lZWRfZ2V0b3B0CisvKiBEZXNjcmliZSB0aGUgbG9uZy1uYW1lZCBvcHRpb25zIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICBUaGUgTE9OR19PUFRJT05TIGFyZ3VtZW50IHRvIGdldG9wdF9sb25nIG9yIGdldG9wdF9sb25nX29ubHkgaXMgYSB2ZWN0b3IKKyAgIG9mIGBzdHJ1Y3Qgb3B0aW9uJyB0ZXJtaW5hdGVkIGJ5IGFuIGVsZW1lbnQgY29udGFpbmluZyBhIG5hbWUgd2hpY2ggaXMKKyAgIHplcm8uCisKKyAgIFRoZSBmaWVsZCBgaGFzX2FyZycgaXM6CisgICBub19hcmd1bWVudAkJKG9yIDApIGlmIHRoZSBvcHRpb24gZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudCwKKyAgIHJlcXVpcmVkX2FyZ3VtZW50CShvciAxKSBpZiB0aGUgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50LAorICAgb3B0aW9uYWxfYXJndW1lbnQgCShvciAyKSBpZiB0aGUgb3B0aW9uIHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LgorCisgICBJZiB0aGUgZmllbGQgYGZsYWcnIGlzIG5vdCBOVUxMLCBpdCBwb2ludHMgdG8gYSB2YXJpYWJsZSB0aGF0IGlzIHNldAorICAgdG8gdGhlIHZhbHVlIGdpdmVuIGluIHRoZSBmaWVsZCBgdmFsJyB3aGVuIHRoZSBvcHRpb24gaXMgZm91bmQsIGJ1dAorICAgbGVmdCB1bmNoYW5nZWQgaWYgdGhlIG9wdGlvbiBpcyBub3QgZm91bmQuCisKKyAgIFRvIGhhdmUgYSBsb25nLW5hbWVkIG9wdGlvbiBkbyBzb21ldGhpbmcgb3RoZXIgdGhhbiBzZXQgYW4gYGludCcgdG8KKyAgIGEgY29tcGlsZWQtaW4gY29uc3RhbnQsIHN1Y2ggYXMgc2V0IGEgdmFsdWUgZnJvbSBgb3B0YXJnJywgc2V0IHRoZQorICAgb3B0aW9uJ3MgYGZsYWcnIGZpZWxkIHRvIHplcm8gYW5kIGl0cyBgdmFsJyBmaWVsZCB0byBhIG5vbnplcm8KKyAgIHZhbHVlICh0aGUgZXF1aXZhbGVudCBzaW5nbGUtbGV0dGVyIG9wdGlvbiBjaGFyYWN0ZXIsIGlmIHRoZXJlIGlzCisgICBvbmUpLiAgRm9yIGxvbmcgb3B0aW9ucyB0aGF0IGhhdmUgYSB6ZXJvIGBmbGFnJyBmaWVsZCwgYGdldG9wdCcKKyAgIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBgdmFsJyBmaWVsZC4gICovCisKK3N0cnVjdCBvcHRpb24KK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgLyogaGFzX2FyZyBjYW4ndCBiZSBhbiBlbnVtIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgY29tcGxhaW4gYWJvdXQKKyAgICAgdHlwZSBtaXNtYXRjaGVzIGluIGFsbCB0aGUgY29kZSB0aGF0IGFzc3VtZXMgaXQgaXMgYW4gaW50LiAgKi8KKyAgaW50IGhhc19hcmc7CisgIGludCAqZmxhZzsKKyAgaW50IHZhbDsKK307CisKKy8qIE5hbWVzIGZvciB0aGUgdmFsdWVzIG9mIHRoZSBgaGFzX2FyZycgZmllbGQgb2YgYHN0cnVjdCBvcHRpb24nLiAgKi8KKworIyBkZWZpbmUgbm9fYXJndW1lbnQJCTAKKyMgZGVmaW5lIHJlcXVpcmVkX2FyZ3VtZW50CTEKKyMgZGVmaW5lIG9wdGlvbmFsX2FyZ3VtZW50CTIKKyNlbmRpZgkvKiBuZWVkIGdldG9wdCAqLworCisKKy8qIEdldCBkZWZpbml0aW9ucyBhbmQgcHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIHRvIHByb2Nlc3MgdGhlCisgICBhcmd1bWVudHMgaW4gQVJHViAoQVJHQyBvZiB0aGVtLCBtaW51cyB0aGUgcHJvZ3JhbSBuYW1lKSBmb3IKKyAgIG9wdGlvbnMgZ2l2ZW4gaW4gT1BUUy4KKworICAgUmV0dXJuIHRoZSBvcHRpb24gY2hhcmFjdGVyIGZyb20gT1BUUyBqdXN0IHJlYWQuICBSZXR1cm4gLTEgd2hlbgorICAgdGhlcmUgYXJlIG5vIG1vcmUgb3B0aW9ucy4gIEZvciB1bnJlY29nbml6ZWQgb3B0aW9ucywgb3Igb3B0aW9ucworICAgbWlzc2luZyBhcmd1bWVudHMsIGBvcHRvcHQnIGlzIHNldCB0byB0aGUgb3B0aW9uIGxldHRlciwgYW5kICc/JyBpcworICAgcmV0dXJuZWQuCisKKyAgIFRoZSBPUFRTIHN0cmluZyBpcyBhIGxpc3Qgb2YgY2hhcmFjdGVycyB3aGljaCBhcmUgcmVjb2duaXplZCBvcHRpb24KKyAgIGxldHRlcnMsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgY29sb25zLCBzcGVjaWZ5aW5nIHRoYXQgdGhhdCBsZXR0ZXIKKyAgIHRha2VzIGFuIGFyZ3VtZW50LCB0byBiZSBwbGFjZWQgaW4gYG9wdGFyZycuCisKKyAgIElmIGEgbGV0dGVyIGluIE9QVFMgaXMgZm9sbG93ZWQgYnkgdHdvIGNvbG9ucywgaXRzIGFyZ3VtZW50IGlzCisgICBvcHRpb25hbC4gIFRoaXMgYmVoYXZpb3IgaXMgc3BlY2lmaWMgdG8gdGhlIEdOVSBgZ2V0b3B0Jy4KKworICAgVGhlIGFyZ3VtZW50IGAtLScgY2F1c2VzIHByZW1hdHVyZSB0ZXJtaW5hdGlvbiBvZiBhcmd1bWVudAorICAgc2Nhbm5pbmcsIGV4cGxpY2l0bHkgdGVsbGluZyBgZ2V0b3B0JyB0aGF0IHRoZXJlIGFyZSBubyBtb3JlCisgICBvcHRpb25zLgorCisgICBJZiBPUFRTIGJlZ2lucyB3aXRoIGAtLScsIHRoZW4gbm9uLW9wdGlvbiBhcmd1bWVudHMgYXJlIHRyZWF0ZWQgYXMKKyAgIGFyZ3VtZW50cyB0byB0aGUgb3B0aW9uICdcMCcuICBUaGlzIGJlaGF2aW9yIGlzIHNwZWNpZmljIHRvIHRoZSBHTlUKKyAgIGBnZXRvcHQnLiAgKi8KKworI2lmZGVmIF9fR05VX0xJQlJBUllfXworLyogTWFueSBvdGhlciBsaWJyYXJpZXMgaGF2ZSBjb25mbGljdGluZyBwcm90b3R5cGVzIGZvciBnZXRvcHQsIHdpdGgKKyAgIGRpZmZlcmVuY2VzIGluIHRoZSBjb25zdHMsIGluIHN0ZGxpYi5oLiAgVG8gYXZvaWQgY29tcGlsYXRpb24KKyAgIGVycm9ycywgb25seSBwcm90b3R5cGUgZ2V0b3B0IGZvciB0aGUgR05VIEMgbGlicmFyeS4gICovCitleHRlcm4gaW50IGdldG9wdCAoaW50IF9fX2FyZ2MsIGNoYXIgKmNvbnN0ICpfX19hcmd2LCBjb25zdCBjaGFyICpfX3Nob3J0b3B0cykKKyAgICAgICBfX1RIUk9XOworCisjIGlmIGRlZmluZWQgX19uZWVkX2dldG9wdCAmJiBkZWZpbmVkIF9fVVNFX1BPU0lYMiBcCisgICYmICFkZWZpbmVkIF9fVVNFX1BPU0lYX0lNUExJQ0lUTFkgJiYgIWRlZmluZWQgX19VU0VfR05VCisvKiBUaGUgR05VIGdldG9wdCBoYXMgbW9yZSBmdW5jdGlvbmFsaXR5IHRoYW4gdGhlIHN0YW5kYXJkIHZlcnNpb24uICBUaGUKKyAgIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBjYW4gYmUgZGlzYWJsZSBhdCBydW50aW1lLiAgVGhpcyByZWRpcmVjdGlvbgorICAgaGVscHMgdG8gYWxzbyBkbyB0aGlzIGF0IHJ1bnRpbWUuICAqLworIyAgaWZkZWYgX19SRURJUkVDVAorICBleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChnZXRvcHQsIChpbnQgX19fYXJnYywgY2hhciAqY29uc3QgKl9fX2FyZ3YsCisJCQkJICAgICAgY29uc3QgY2hhciAqX19zaG9ydG9wdHMpLAorCQkJICAgICBfX3Bvc2l4X2dldG9wdCk7CisjICBlbHNlCitleHRlcm4gaW50IF9fcG9zaXhfZ2V0b3B0IChpbnQgX19fYXJnYywgY2hhciAqY29uc3QgKl9fX2FyZ3YsCisJCQkgICBjb25zdCBjaGFyICpfX3Nob3J0b3B0cykgX19USFJPVzsKKyMgICBkZWZpbmUgZ2V0b3B0IF9fcG9zaXhfZ2V0b3B0CisjICBlbmRpZgorIyBlbmRpZgorI2Vsc2UgLyogbm90IF9fR05VX0xJQlJBUllfXyAqLworZXh0ZXJuIGludCBnZXRvcHQgKCk7CisjZW5kaWYgLyogX19HTlVfTElCUkFSWV9fICovCisKKyNpZm5kZWYgX19uZWVkX2dldG9wdAorZXh0ZXJuIGludCBnZXRvcHRfbG9uZyAoaW50IF9fX2FyZ2MsIGNoYXIgKmNvbnN0ICpfX19hcmd2LAorCQkJY29uc3QgY2hhciAqX19zaG9ydG9wdHMsCisJCSAgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqX19sb25nb3B0cywgaW50ICpfX2xvbmdpbmQpCisgICAgICAgX19USFJPVzsKK2V4dGVybiBpbnQgZ2V0b3B0X2xvbmdfb25seSAoaW50IF9fX2FyZ2MsIGNoYXIgKmNvbnN0ICpfX19hcmd2LAorCQkJICAgICBjb25zdCBjaGFyICpfX3Nob3J0b3B0cywKKwkJICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKl9fbG9uZ29wdHMsIGludCAqX19sb25naW5kKQorICAgICAgIF9fVEhST1c7CisKKyNlbmRpZgorCisjaWZkZWYJX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvKiBNYWtlIHN1cmUgd2UgbGF0ZXIgY2FuIGdldCBhbGwgdGhlIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMuICAqLworI3VuZGVmIF9fbmVlZF9nZXRvcHQKKworI2VuZGlmIC8qIGdldG9wdC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2dsb2IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ2xvYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjJhYzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2dsb2IuaApAQCAtMCwwICsxLDE4MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDE5OTIsMTk5NS0xOTk4LDIwMDAsMjAwMSwyMDA0LDIwMTAsMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0dMT0JfSAorI2RlZmluZQlfR0xPQl9ICTEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFdlIG5lZWQgYHNpemVfdCcgZm9yIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMuICAqLworI2lmbmRlZiBfX3NpemVfdAordHlwZWRlZiBfX1NJWkVfVFlQRV9fIF9fc2l6ZV90OworIyBpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IF9fVVNFX1hPUEVOMks4Cit0eXBlZGVmIF9fU0laRV9UWVBFX18gc2l6ZV90OworIyBlbmRpZgorI2Vsc2UKKy8qIFRoZSBHTlUgQ0Mgc3RkZGVmLmggdmVyc2lvbiBkZWZpbmVzIF9fc2l6ZV90IGFzIGVtcHR5LiAgV2UgbmVlZCBhIHJlYWwKKyAgIGRlZmluaXRpb24uICAqLworIyB1bmRlZiBfX3NpemVfdAorIyBkZWZpbmUgX19zaXplX3Qgc2l6ZV90CisjZW5kaWYKKworLyogQml0cyBzZXQgaW4gdGhlIEZMQUdTIGFyZ3VtZW50IHRvIGBnbG9iJy4gICovCisjZGVmaW5lCUdMT0JfRVJSCSgxIDw8IDApLyogUmV0dXJuIG9uIHJlYWQgZXJyb3JzLiAgKi8KKyNkZWZpbmUJR0xPQl9NQVJLCSgxIDw8IDEpLyogQXBwZW5kIGEgc2xhc2ggdG8gZWFjaCBuYW1lLiAgKi8KKyNkZWZpbmUJR0xPQl9OT1NPUlQJKDEgPDwgMikvKiBEb24ndCBzb3J0IHRoZSBuYW1lcy4gICovCisjZGVmaW5lCUdMT0JfRE9PRkZTCSgxIDw8IDMpLyogSW5zZXJ0IFBHTE9CLT5nbF9vZmZzIE5VTExzLiAgKi8KKyNkZWZpbmUJR0xPQl9OT0NIRUNLCSgxIDw8IDQpLyogSWYgbm90aGluZyBtYXRjaGVzLCByZXR1cm4gdGhlIHBhdHRlcm4uICAqLworI2RlZmluZQlHTE9CX0FQUEVORAkoMSA8PCA1KS8qIEFwcGVuZCB0byByZXN1bHRzIG9mIGEgcHJldmlvdXMgY2FsbC4gICovCisjZGVmaW5lCUdMT0JfTk9FU0NBUEUJKDEgPDwgNikvKiBCYWNrc2xhc2hlcyBkb24ndCBxdW90ZSBtZXRhY2hhcmFjdGVycy4gICovCisjZGVmaW5lCUdMT0JfUEVSSU9ECSgxIDw8IDcpLyogTGVhZGluZyBgLicgY2FuIGJlIG1hdGNoZWQgYnkgbWV0YWNoYXJzLiAgKi8KKworI2lmICFkZWZpbmVkIF9fVVNFX1BPU0lYMiB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX0dOVQorIyBkZWZpbmUgR0xPQl9NQUdDSEFSCSAoMSA8PCA4KS8qIFNldCBpbiBnbF9mbGFncyBpZiBhbnkgbWV0YWNoYXJzIHNlZW4uICAqLworIyBkZWZpbmUgR0xPQl9BTFRESVJGVU5DICgxIDw8IDkpLyogVXNlIGdsX29wZW5kaXIgZXQgYWwgZnVuY3Rpb25zLiAgKi8KKyMgZGVmaW5lIEdMT0JfQlJBQ0UJICgxIDw8IDEwKS8qIEV4cGFuZCAie2EsYn0iIHRvICJhIiAiYiIuICAqLworIyBkZWZpbmUgR0xPQl9OT01BR0lDCSAoMSA8PCAxMSkvKiBJZiBubyBtYWdpYyBjaGFycywgcmV0dXJuIHRoZSBwYXR0ZXJuLiAgKi8KKyMgZGVmaW5lIEdMT0JfVElMREUJICgxIDw8IDEyKS8qIEV4cGFuZCB+dXNlciBhbmQgfiB0byBob21lIGRpcmVjdG9yaWVzLiAqLworIyBkZWZpbmUgR0xPQl9PTkxZRElSCSAoMSA8PCAxMykvKiBNYXRjaCBvbmx5IGRpcmVjdG9yaWVzLiAgKi8KKyMgZGVmaW5lIEdMT0JfVElMREVfQ0hFQ0sgKDEgPDwgMTQpLyogTGlrZSBHTE9CX1RJTERFIGJ1dCByZXR1cm4gYW4gZXJyb3IKKwkJCQkgICAgICBpZiB0aGUgdXNlciBuYW1lIGlzIG5vdCBhdmFpbGFibGUuICAqLworIyBkZWZpbmUgX19HTE9CX0ZMQUdTCShHTE9CX0VSUnxHTE9CX01BUkt8R0xPQl9OT1NPUlR8R0xPQl9ET09GRlN8IFwKKwkJCSBHTE9CX05PRVNDQVBFfEdMT0JfTk9DSEVDS3xHTE9CX0FQUEVORHwgICAgIFwKKwkJCSBHTE9CX1BFUklPRHxHTE9CX0FMVERJUkZVTkN8R0xPQl9CUkFDRXwgICAgIFwKKwkJCSBHTE9CX05PTUFHSUN8R0xPQl9USUxERXxHTE9CX09OTFlESVJ8R0xPQl9USUxERV9DSEVDSykKKyNlbHNlCisjIGRlZmluZSBfX0dMT0JfRkxBR1MJKEdMT0JfRVJSfEdMT0JfTUFSS3xHTE9CX05PU09SVHxHTE9CX0RPT0ZGU3wgXAorCQkJIEdMT0JfTk9FU0NBUEV8R0xPQl9OT0NIRUNLfEdMT0JfQVBQRU5EfCAgICAgXAorCQkJIEdMT0JfUEVSSU9EKQorI2VuZGlmCisKKy8qIEVycm9yIHJldHVybnMgZnJvbSBgZ2xvYicuICAqLworI2RlZmluZQlHTE9CX05PU1BBQ0UJMQkvKiBSYW4gb3V0IG9mIG1lbW9yeS4gICovCisjZGVmaW5lCUdMT0JfQUJPUlRFRAkyCS8qIFJlYWQgZXJyb3IuICAqLworI2RlZmluZQlHTE9CX05PTUFUQ0gJMwkvKiBObyBtYXRjaGVzIGZvdW5kLiAgKi8KKyNkZWZpbmUgR0xPQl9OT1NZUwk0CS8qIE5vdCBpbXBsZW1lbnRlZC4gICovCisjaWZkZWYgX19VU0VfR05VCisvKiBQcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUgZGVmaW5lZCBHTE9CX0FCRU5EIGluc3RlYWQgb2YKKyAgIEdMT0JfQUJPUlRFRC4gIFByb3ZpZGUgYSBjb21wYXRpYmlsaXR5IGRlZmluaXRpb24gaGVyZS4gICovCisjIGRlZmluZSBHTE9CX0FCRU5EIEdMT0JfQUJPUlRFRAorI2VuZGlmCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGEgZ2xvYmJpbmcgcnVuLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKK3N0cnVjdCBzdGF0OworI2VuZGlmCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgX19zaXplX3QgZ2xfcGF0aGM7CQkvKiBDb3VudCBvZiBwYXRocyBtYXRjaGVkIGJ5IHRoZSBwYXR0ZXJuLiAgKi8KKyAgICBjaGFyICoqZ2xfcGF0aHY7CQkvKiBMaXN0IG9mIG1hdGNoZWQgcGF0aG5hbWVzLiAgKi8KKyAgICBfX3NpemVfdCBnbF9vZmZzOwkJLyogU2xvdHMgdG8gcmVzZXJ2ZSBpbiBgZ2xfcGF0aHYnLiAgKi8KKyAgICBpbnQgZ2xfZmxhZ3M7CQkvKiBTZXQgdG8gRkxBR1MsIG1heWJlIHwgR0xPQl9NQUdDSEFSLiAgKi8KKworICAgIC8qIElmIHRoZSBHTE9CX0FMVERJUkZVTkMgZmxhZyBpcyBzZXQsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zCisgICAgICAgYXJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucy4gICovCisgICAgdm9pZCAoKmdsX2Nsb3NlZGlyKSAodm9pZCAqKTsKKyNpZmRlZiBfX1VTRV9HTlUKKyAgICBzdHJ1Y3QgZGlyZW50ICooKmdsX3JlYWRkaXIpICh2b2lkICopOworI2Vsc2UKKyAgICB2b2lkICooKmdsX3JlYWRkaXIpICh2b2lkICopOworI2VuZGlmCisgICAgdm9pZCAqKCpnbF9vcGVuZGlyKSAoX19jb25zdCBjaGFyICopOworI2lmZGVmIF9fVVNFX0dOVQorICAgIGludCAoKmdsX2xzdGF0KSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0LCBzdHJ1Y3Qgc3RhdCAqX19yZXN0cmljdCk7CisgICAgaW50ICgqZ2xfc3RhdCkgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCwgc3RydWN0IHN0YXQgKl9fcmVzdHJpY3QpOworI2Vsc2UKKyAgICBpbnQgKCpnbF9sc3RhdCkgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCwgdm9pZCAqX19yZXN0cmljdCk7CisgICAgaW50ICgqZ2xfc3RhdCkgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCwgdm9pZCAqX19yZXN0cmljdCk7CisjZW5kaWYKKyAgfSBnbG9iX3Q7CisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorIyBpZmRlZiBfX1VTRV9HTlUKK3N0cnVjdCBzdGF0NjQ7CisjIGVuZGlmCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgX19zaXplX3QgZ2xfcGF0aGM7CisgICAgY2hhciAqKmdsX3BhdGh2OworICAgIF9fc2l6ZV90IGdsX29mZnM7CisgICAgaW50IGdsX2ZsYWdzOworCisgICAgLyogSWYgdGhlIEdMT0JfQUxURElSRlVOQyBmbGFnIGlzIHNldCwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMKKyAgICAgICBhcmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZmlsZSBhY2Nlc3MgZnVuY3Rpb25zLiAgKi8KKyAgICB2b2lkICgqZ2xfY2xvc2VkaXIpICh2b2lkICopOworIyBpZmRlZiBfX1VTRV9HTlUKKyAgICBzdHJ1Y3QgZGlyZW50NjQgKigqZ2xfcmVhZGRpcikgKHZvaWQgKik7CisjIGVsc2UKKyAgICB2b2lkICooKmdsX3JlYWRkaXIpICh2b2lkICopOworIyBlbmRpZgorICAgIHZvaWQgKigqZ2xfb3BlbmRpcikgKF9fY29uc3QgY2hhciAqKTsKKyMgaWZkZWYgX19VU0VfR05VCisgICAgaW50ICgqZ2xfbHN0YXQpIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QsIHN0cnVjdCBzdGF0NjQgKl9fcmVzdHJpY3QpOworICAgIGludCAoKmdsX3N0YXQpIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QsIHN0cnVjdCBzdGF0NjQgKl9fcmVzdHJpY3QpOworIyBlbHNlCisgICAgaW50ICgqZ2xfbHN0YXQpIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QsIHZvaWQgKl9fcmVzdHJpY3QpOworICAgIGludCAoKmdsX3N0YXQpIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QsIHZvaWQgKl9fcmVzdHJpY3QpOworIyBlbmRpZgorICB9IGdsb2I2NF90OworI2VuZGlmCisKKy8qIERvIGdsb2Igc2VhcmNoaW5nIGZvciBQQVRURVJOLCBwbGFjaW5nIHJlc3VsdHMgaW4gUEdMT0IuCisgICBUaGUgYml0cyBkZWZpbmVkIGFib3ZlIG1heSBiZSBzZXQgaW4gRkxBR1MuCisgICBJZiBhIGRpcmVjdG9yeSBjYW5ub3QgYmUgb3BlbmVkIG9yIHJlYWQgYW5kIEVSUkZVTkMgaXMgbm90IG5pbCwKKyAgIGl0IGlzIGNhbGxlZCB3aXRoIHRoZSBwYXRobmFtZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IsIGFuZCB0aGUKKyAgIGBlcnJubycgdmFsdWUgZnJvbSB0aGUgZmFpbGluZyBjYWxsOyBpZiBpdCByZXR1cm5zIG5vbi16ZXJvCisgICBgZ2xvYicgcmV0dXJucyBHTE9CX0FCRU5EOyBpZiBpdCByZXR1cm5zIHplcm8sIHRoZSBlcnJvciBpcyBpZ25vcmVkLgorICAgSWYgbWVtb3J5IGNhbm5vdCBiZSBhbGxvY2F0ZWQgZm9yIFBHTE9CLCBHTE9CX05PU1BBQ0UgaXMgcmV0dXJuZWQuCisgICBPdGhlcndpc2UsIGBnbG9iJyByZXR1cm5zIHplcm8uICAqLworI2lmICFkZWZpbmVkIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgZ2xvYiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0dGVybiwgaW50IF9fZmxhZ3MsCisJCSBpbnQgKCpfX2VycmZ1bmMpIChfX2NvbnN0IGNoYXIgKiwgaW50KSwKKwkJIGdsb2JfdCAqX19yZXN0cmljdCBfX3BnbG9iKSBfX1RIUk9XOworCisvKiBGcmVlIHN0b3JhZ2UgYWxsb2NhdGVkIGluIFBHTE9CIGJ5IGEgcHJldmlvdXMgYGdsb2InIGNhbGwuICAqLworZXh0ZXJuIHZvaWQgZ2xvYmZyZWUgKGdsb2JfdCAqX19wZ2xvYikgX19USFJPVzsKKyNlbHNlCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChnbG9iLCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0dGVybiwKKwkJCQkgIGludCBfX2ZsYWdzLAorCQkJCSAgaW50ICgqX19lcnJmdW5jKSAoX19jb25zdCBjaGFyICosIGludCksCisJCQkJICBnbG9iX3QgKl9fcmVzdHJpY3QgX19wZ2xvYiksIGdsb2I2NCk7CisKK2V4dGVybiB2b2lkIF9fUkVESVJFQ1RfTlRIIChnbG9iZnJlZSwgKGdsb2JfdCAqX19wZ2xvYiksIGdsb2JmcmVlNjQpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBnbG9iNjQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdHRlcm4sIGludCBfX2ZsYWdzLAorCQkgICBpbnQgKCpfX2VycmZ1bmMpIChfX2NvbnN0IGNoYXIgKiwgaW50KSwKKwkJICAgZ2xvYjY0X3QgKl9fcmVzdHJpY3QgX19wZ2xvYikgX19USFJPVzsKKworZXh0ZXJuIHZvaWQgZ2xvYmZyZWU2NCAoZ2xvYjY0X3QgKl9fcGdsb2IpIF9fVEhST1c7CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfR05VCisvKiBSZXR1cm4gbm9uemVybyBpZiBQQVRURVJOIGNvbnRhaW5zIGFueSBtZXRhY2hhcmFjdGVycy4KKyAgIE1ldGFjaGFyYWN0ZXJzIGNhbiBiZSBxdW90ZWQgd2l0aCBiYWNrc2xhc2hlcyBpZiBRVU9URSBpcyBub256ZXJvLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2Ugc3BlY2lmaWVkIGJ5IFBPU0lYLjIKKyAgIGJ1dCBzZXZlcmFsIHByb2dyYW1zIHdhbnQgdG8gdXNlIGl0LiAgKi8KK2V4dGVybiBpbnQgZ2xvYl9wYXR0ZXJuX3AgKF9fY29uc3QgY2hhciAqX19wYXR0ZXJuLCBpbnQgX19xdW90ZSkgX19USFJPVzsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZ2xvYi5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9nbnUtdmVyc2lvbnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ251LXZlcnNpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllNjE3YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ251LXZlcnNpb25zLmgKQEAgLTAsMCArMSw1MyBAQAorLyogSGVhZGVyIHdpdGggaW50ZXJmYWNlIHZlcnNpb24gbWFjcm9zIGZvciBsaWJyYXJ5IHBpZWNlcyBjb3BpZWQgZWxzZXdoZXJlLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9HTlVfVkVSU0lPTlNfSAorI2RlZmluZQlfR05VX1ZFUlNJT05TX0gJMQorCisvKiBUaGlzIGZpbGUgZXhpc3RzIHRvIGRlZmluZSB0aGVzZSBmZXcgbWFjcm9zLiAgRWFjaCBzcGVjaWZpZXMgYSB2ZXJzaW9uCisgICBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaWJyYXJ5IGludGVyZmFjZSBvZiBhIHBpZWNlIG9mIHRoZSBDIGxpYnJhcnkKKyAgIHdoaWNoIGlzIGFsc28gZGlzdHJpYnV0ZWQgd2l0aCBvdGhlciBHTlUgcGFja2FnZXMuICBUaGVzZSBwaWVjZXMgYXJlCisgICBib3RoIHBhcnQgb2YgdGhlIEdOVSBDIGxpYnJhcnkgYW5kIGFsc28gZGlzdHJpYnV0ZWQgd2l0aCBvdGhlciBHTlUKKyAgIHBhY2thZ2VzIHNvIHRob3NlIHBhY2thZ2VzIG1heSB1c2UgdGhlaXIgZmFjaWxpdGllcyBvbiBzeXN0ZW1zIGxhY2tpbmcKKyAgIHRoZSBHTlUgQyBsaWJyYXJ5LiAgVGhlIHNvdXJjZSBmaWxlcyBmb3IgZWFjaCBwaWVjZSBzdXJyb3VuZCBhbGwgdGhlaXIKKyAgIGNvZGUgd2l0aCBgI2lmbmRlZiBFTElERV9DT0RFJyBhZnRlciBkZWZpbmluZyBpdCB3aXRoIHRoaXM6CisKKyAgICNkZWZpbmUgT0JTVEFDS19JTlRFUkZBQ0VfVkVSU0lPTiAxCisgICAjaWYgIWRlZmluZWQgKF9MSUJDKSAmJiBkZWZpbmVkIChfX0dOVV9MSUJSQVJZX18pICYmIF9fR05VX0xJQlJBUllfXyA+IDEKKyAgICNpbmNsdWRlIDxnbnUtdmVyc2lvbnMuaD4KKyAgICNpZiBfR05VX09CU1RBQ0tfSU5URVJGQUNFX1ZFUlNJT04gPT0gT0JTVEFDS19JTlRFUkZBQ0VfVkVSU0lPTgorICAgI2RlZmluZSBFTElERV9DT0RFCisgICAjZW5kaWYKKyAgICNlbmRpZgorCisgICBUaGlzIGFsbG93cyB0aG9zZSBvbmUgdG8gYXZvaWQgY29tcGlsaW5nIHRob3NlIGZpbGVzIHdoZW4gcGFydCBvZiBhIEdOVQorICAgcGFja2FnZSBub3QgbGliYywgb24gYSBzeXN0ZW0gdXNpbmcgYSBHTlUgQyBsaWJyYXJ5IHRoYXQgc3VwcG9ydHMgdGhlCisgICBzYW1lIGludGVyZmFjZS4KKworICAgUGxlYXNlIHByZXNlcnZlIHRoZSBmb3JtYXQgb2YgdGhlIGNvbW1lbnRzIGFmdGVyIGVhY2ggbWFjcm8uICBBbmQKKyAgIHJlbWVtYmVyLCBpZiBhbnkgb2YgdGhlc2UgdmVyc2lvbnMgY2hhbmdlLCB0aGUgbGliYy5zbyBtYWpvciB2ZXJzaW9uCisgICBudW1iZXIgbXVzdCBjaGFuZ2UgdG9vIChzbyBhdm9pZCBpdCkhICAqLworCisjZGVmaW5lIF9HTlVfT0JTVEFDS19JTlRFUkZBQ0VfVkVSU0lPTgkxIC8qIHZzIG1hbGxvYy9vYnN0YWNrLmMgKi8KKyNkZWZpbmUgX0dOVV9SRUdFWF9JTlRFUkZBQ0VfVkVSU0lPTgkxIC8qIHZzIHBvc2l4L3JlZ2V4LmMgKi8KKyNkZWZpbmUgX0dOVV9HTE9CX0lOVEVSRkFDRV9WRVJTSU9OCTEgLyogdnMgcG9zaXgvZ2xvYi5jICovCisjZGVmaW5lIF9HTlVfR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OCTIgLyogdnMgcG9zaXgvZ2V0b3B0LmMgYW5kCisJCQkJCSAgICAgcG9zaXgvZ2V0b3B0MS5jICovCisKKyNlbmRpZgkvKiBnbnUtdmVyc2lvbnMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ncnAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ3JwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2ZWYwMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ3JwLmgKQEAgLTAsMCArMSwyMDkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwxOTkyLDE5OTUtMjAwMSwyMDAzLDIwMDQsMjAxMAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogOS4yLjEgR3JvdXAgRGF0YWJhc2UgQWNjZXNzCTxncnAuaD4KKyAqLworCisjaWZuZGVmCV9HUlBfSAorI2RlZmluZQlfR1JQX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworCisvKiBGb3IgdGhlIFNpbmdsZSBVbml4IHNwZWNpZmljYXRpb24gd2UgbXVzdCBkZWZpbmUgdGhpcyB0eXBlIGhlcmUuICAqLworI2lmIChkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykgJiYgIWRlZmluZWQgX19naWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZ2lkX3QgZ2lkX3Q7CisjIGRlZmluZSBfX2dpZF90X2RlZmluZWQKKyNlbmRpZgorCisvKiBUaGUgZ3JvdXAgc3RydWN0dXJlLgkgKi8KK3N0cnVjdCBncm91cAorICB7CisgICAgY2hhciAqZ3JfbmFtZTsJCS8qIEdyb3VwIG5hbWUuCSovCisgICAgY2hhciAqZ3JfcGFzc3dkOwkJLyogUGFzc3dvcmQuCSovCisgICAgX19naWRfdCBncl9naWQ7CQkvKiBHcm91cCBJRC4JKi8KKyAgICBjaGFyICoqZ3JfbWVtOwkJLyogTWVtYmVyIGxpc3QuCSovCisgIH07CisKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX0dOVQorIyBkZWZpbmUgX19uZWVkX0ZJTEUKKyMgaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogUmV3aW5kIHRoZSBncm91cC1maWxlIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBzZXRncmVudCAodm9pZCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIFwKKyAgICB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisvKiBDbG9zZSB0aGUgZ3JvdXAtZmlsZSBzdHJlYW0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgZW5kZ3JlbnQgKHZvaWQpOworCisvKiBSZWFkIGFuIGVudHJ5IGZyb20gdGhlIGdyb3VwLWZpbGUgc3RyZWFtLCBvcGVuaW5nIGl0IGlmIG5lY2Vzc2FyeS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IGdyb3VwICpnZXRncmVudCAodm9pZCk7CisjZW5kaWYKKworI2lmZGVmCV9fVVNFX1NWSUQKKy8qIFJlYWQgYSBncm91cCBlbnRyeSBmcm9tIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBncm91cCAqZmdldGdyZW50IChGSUxFICpfX3N0cmVhbSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogV3JpdGUgdGhlIGdpdmVuIGVudHJ5IG9udG8gdGhlIGdpdmVuIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdXRncmVudCAoX19jb25zdCBzdHJ1Y3QgZ3JvdXAgKl9fcmVzdHJpY3QgX19wLAorCQkgICAgIEZJTEUgKl9fcmVzdHJpY3QgX19mKTsKKyNlbmRpZgorCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IHdpdGggYSBtYXRjaGluZyBncm91cCBJRC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IGdyb3VwICpnZXRncmdpZCAoX19naWRfdCBfX2dpZCk7CisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIGdyb3VwIG5hbWUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBncm91cCAqZ2V0Z3JuYW0gKF9fY29uc3QgY2hhciAqX19uYW1lKTsKKworI2lmIGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisKKyMgaWZkZWYgX19VU0VfTUlTQworLyogUmVhc29uYWJsZSB2YWx1ZSBmb3IgdGhlIGJ1ZmZlciBzaXplZCB1c2VkIGluIHRoZSByZWVudHJhbnQKKyAgIGZ1bmN0aW9ucyBiZWxvdy4gIEJ1dCBiZXR0ZXIgdXNlIGBzeXNjb25mJy4gICovCisjICBkZWZpbmUgTlNTX0JVRkxFTl9HUk9VUAkxMDI0CisjIGVuZGlmCisKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiBzb21lIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUuCisKKyAgIFBMRUFTRSBOT1RFOiB0aGUgYGdldGdyZW50X3InIGZ1bmN0aW9uIGlzIG5vdCAoeWV0KSBzdGFuZGFyZGl6ZWQuCisgICBUaGUgaW50ZXJmYWNlIG1heSBjaGFuZ2UgaW4gbGF0ZXIgdmVyc2lvbnMgb2YgdGhpcyBsaWJyYXJ5LiAgQnV0CisgICB0aGUgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIGZvbGxvd2luZyB0aGUgcHJpbmNpcGFscyB1c2VkIGZvciB0aGUKKyAgIG90aGVyIHJlZW50cmFudCBmdW5jdGlvbnMgc28gdGhlIGNoYW5jZXMgYXJlIGdvb2QgdGhpcyBpcyB3aGF0IHRoZQorICAgUE9TSVggcGVvcGxlIHdvdWxkIGNob29zZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworCisjIGlmZGVmIF9fVVNFX0dOVQorZXh0ZXJuIGludCBnZXRncmVudF9yIChzdHJ1Y3QgZ3JvdXAgKl9fcmVzdHJpY3QgX19yZXN1bHRidWYsCisJCSAgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCSAgICAgICBzdHJ1Y3QgZ3JvdXAgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKyMgZW5kaWYKKworLyogU2VhcmNoIGZvciBhbiBlbnRyeSB3aXRoIGEgbWF0Y2hpbmcgZ3JvdXAgSUQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRncmdpZF9yIChfX2dpZF90IF9fZ2lkLCBzdHJ1Y3QgZ3JvdXAgKl9fcmVzdHJpY3QgX19yZXN1bHRidWYsCisJCSAgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCSAgICAgICBzdHJ1Y3QgZ3JvdXAgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworLyogU2VhcmNoIGZvciBhbiBlbnRyeSB3aXRoIGEgbWF0Y2hpbmcgZ3JvdXAgbmFtZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldGdybmFtX3IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCSAgICAgICBzdHJ1Y3QgZ3JvdXAgKl9fcmVzdHJpY3QgX19yZXN1bHRidWYsCisJCSAgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCSAgICAgICBzdHJ1Y3QgZ3JvdXAgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworIyBpZmRlZglfX1VTRV9TVklECisvKiBSZWFkIGEgZ3JvdXAgZW50cnkgZnJvbSBTVFJFQU0uICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBzdGFuZGFyZGl6ZWQKKyAgIGFuIHByb2JhYmx5IG5ldmVyIHdpbGwuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmdldGdyZW50X3IgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCQlzdHJ1Y3QgZ3JvdXAgKl9fcmVzdHJpY3QgX19yZXN1bHRidWYsCisJCQljaGFyICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCQlzdHJ1Y3QgZ3JvdXAgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKyMgZW5kaWYKKworI2VuZGlmCS8qIFBPU0lYIG9yIHJlZW50cmFudCAqLworCisKKyNpZmRlZglfX1VTRV9CU0QKKworIyBkZWZpbmUgX19uZWVkX3NpemVfdAorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogU2V0IHRoZSBncm91cCBzZXQgZm9yIHRoZSBjdXJyZW50IHVzZXIgdG8gR1JPVVBTIChOIG9mIHRoZW0pLiAgKi8KK2V4dGVybiBpbnQgc2V0Z3JvdXBzIChzaXplX3QgX19uLCBfX2NvbnN0IF9fZ2lkX3QgKl9fZ3JvdXBzKSBfX1RIUk9XOworCisvKiBTdG9yZSBhdCBtb3N0ICpOR1JPVVBTIG1lbWJlcnMgb2YgdGhlIGdyb3VwIHNldCBmb3IgVVNFUiBpbnRvCisgICAqR1JPVVBTLiAgQWxzbyBpbmNsdWRlIEdST1VQLiAgVGhlIGFjdHVhbCBudW1iZXIgb2YgZ3JvdXBzIGZvdW5kIGlzCisgICByZXR1cm5lZCBpbiAqTkdST1VQUy4gIFJldHVybiAtMSBpZiB0aGUgaWYgKk5HUk9VUFMgaXMgdG9vIHNtYWxsLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldGdyb3VwbGlzdCAoX19jb25zdCBjaGFyICpfX3VzZXIsIF9fZ2lkX3QgX19ncm91cCwKKwkJCSBfX2dpZF90ICpfX2dyb3VwcywgaW50ICpfX25ncm91cHMpOworCisvKiBJbml0aWFsaXplIHRoZSBncm91cCBzZXQgZm9yIHRoZSBjdXJyZW50IHVzZXIKKyAgIGJ5IHJlYWRpbmcgdGhlIGdyb3VwIGRhdGFiYXNlIGFuZCB1c2luZyBhbGwgZ3JvdXBzCisgICBvZiB3aGljaCBVU0VSIGlzIGEgbWVtYmVyLiAgQWxzbyBpbmNsdWRlIEdST1VQLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGluaXRncm91cHMgKF9fY29uc3QgY2hhciAqX191c2VyLCBfX2dpZF90IF9fZ3JvdXApOworCisjZW5kaWYgLyogVXNlIEJTRC4gICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBncnAuaCAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ3NoYWRvdy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9nc2hhZG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiMjhhZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ3NoYWRvdy5oCkBAIC0wLDAgKzEsMTMxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIERlY2xhcmF0aW9uIG9mIHR5cGVzIGFuZCBmdW5jdGlvbnMgZm9yIHNoYWRvdyBncm91cCBzdWl0ZS4gICovCisKKyNpZm5kZWYgX0dTSEFET1dfSAorI2RlZmluZSBfR1NIQURPV19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxwYXRocy5oPgorCisjZGVmaW5lCV9fbmVlZF9GSUxFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBQYXRoIHRvIHRoZSB1c2VyIGRhdGFiYXNlIGZpbGVzLiAgKi8KKyNkZWZpbmUJR1NIQURPVyBfUEFUSF9HU0hBRE9XCisKKworX19CRUdJTl9ERUNMUworCisvKiBTdHJ1Y3R1cmUgb2YgdGhlIGdyb3VwIGZpbGUuICAqLworc3RydWN0IHNncnAKKyAgeworICAgIGNoYXIgKnNnX25hbXA7CQkvKiBHcm91cCBuYW1lLiAgKi8KKyAgICBjaGFyICpzZ19wYXNzd2Q7CQkvKiBFbmNyeXB0ZWQgcGFzc3dvcmQuICAqLworICAgIGNoYXIgKipzZ19hZG07CQkvKiBHcm91cCBhZG1pbmlzdHJhdG9yIGxpc3QuICAqLworICAgIGNoYXIgKipzZ19tZW07CQkvKiBHcm91cCBtZW1iZXIgbGlzdC4gICovCisgIH07CisKKworLyogT3BlbiBkYXRhYmFzZSBmb3IgcmVhZGluZy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgc2V0c2dlbnQgKHZvaWQpOworCisvKiBDbG9zZSBkYXRhYmFzZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgZW5kc2dlbnQgKHZvaWQpOworCisvKiBHZXQgbmV4dCBlbnRyeSBmcm9tIGRhdGFiYXNlLCBwZXJoYXBzIGFmdGVyIG9wZW5pbmcgdGhlIGZpbGUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgc2dycCAqZ2V0c2dlbnQgKHZvaWQpOworCisvKiBHZXQgc2hhZG93IGVudHJ5IG1hdGNoaW5nIE5BTUUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgc2dycCAqZ2V0c2duYW0gKF9fY29uc3QgY2hhciAqX19uYW1lKTsKKworLyogUmVhZCBzaGFkb3cgZW50cnkgZnJvbSBTVFJJTkcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgc2dycCAqc2dldHNnZW50IChfX2NvbnN0IGNoYXIgKl9fc3RyaW5nKTsKKworLyogUmVhZCBuZXh0IHNoYWRvdyBlbnRyeSBmcm9tIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBzZ3JwICpmZ2V0c2dlbnQgKEZJTEUgKl9fc3RyZWFtKTsKKworLyogV3JpdGUgbGluZSBjb250YWluaW5nIHNoYWRvdyBwYXNzd29yZCBlbnRyeSB0byBzdHJlYW0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcHV0c2dlbnQgKF9fY29uc3Qgc3RydWN0IHNncnAgKl9fZywgRklMRSAqX19zdHJlYW0pOworCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2Ygc29tZSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGV5IGFyZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0c2dlbnRfciAoc3RydWN0IHNncnAgKl9fcmVzdWx0X2J1ZiwgY2hhciAqX19idWZmZXIsCisJCSAgICAgICBzaXplX3QgX19idWZsZW4sIHN0cnVjdCBzZ3JwICoqX19yZXN1bHQpOworCitleHRlcm4gaW50IGdldHNnbmFtX3IgKF9fY29uc3QgY2hhciAqX19uYW1lLCBzdHJ1Y3Qgc2dycCAqX19yZXN1bHRfYnVmLAorCQkgICAgICAgY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJICAgICAgIHN0cnVjdCBzZ3JwICoqX19yZXN1bHQpOworCitleHRlcm4gaW50IHNnZXRzZ2VudF9yIChfX2NvbnN0IGNoYXIgKl9fc3RyaW5nLCBzdHJ1Y3Qgc2dycCAqX19yZXN1bHRfYnVmLAorCQkJY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCXN0cnVjdCBzZ3JwICoqX19yZXN1bHQpOworCitleHRlcm4gaW50IGZnZXRzZ2VudF9yIChGSUxFICpfX3N0cmVhbSwgc3RydWN0IHNncnAgKl9fcmVzdWx0X2J1ZiwKKwkJCWNoYXIgKl9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCQlzdHJ1Y3Qgc2dycCAqKl9fcmVzdWx0KTsKKyNlbmRpZgkvKiBtaXNjICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBnc2hhZG93LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2Eub3V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9hLm91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ODRmOTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9hLm91dC5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX0FTTV9YODZfQV9PVVRfSAorI2RlZmluZSBfQVNNX1g4Nl9BX09VVF9ICisKK3N0cnVjdCBleGVjCit7CisJdW5zaWduZWQgaW50IGFfaW5mbzsJLyogVXNlIG1hY3JvcyBOX01BR0lDLCBldGMgZm9yIGFjY2VzcyAqLworCXVuc2lnbmVkIGFfdGV4dDsJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCisJdW5zaWduZWQgYV9kYXRhOwkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBhX3N5bXM7CS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGFfZW50cnk7CS8qIHN0YXJ0IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBhX3Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBhX2Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KK307CisKKyNkZWZpbmUgTl9UUlNJWkUoYSkJKChhKS5hX3Ryc2l6ZSkKKyNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKKyNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQorCisjZW5kaWYgLyogX0FTTV9YODZfQV9PVVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vYXV4dmVjLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzE2YjRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vYXV4dmVjLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9BVVhWRUNfSAorI2RlZmluZSBfQVNNX1g4Nl9BVVhWRUNfSAorLyoKKyAqIEFyY2hpdGVjdHVyZS1uZXV0cmFsIEFUXyB2YWx1ZXMgaW4gMC0xNywgbGVhdmUgc29tZSByb29tCisgKiBmb3IgbW9yZSBvZiB0aGVtLCBzdGFydCB0aGUgeDg2LXNwZWNpZmljIG9uZXMgYXQgMzIuCisgKi8KKyNpZmRlZiBfX2kzODZfXworI2RlZmluZSBBVF9TWVNJTkZPCQkzMgorI2VuZGlmCisjZGVmaW5lIEFUX1NZU0lORk9fRUhEUgkJMzMKKworI2VuZGlmIC8qIF9BU01fWDg2X0FVWFZFQ19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9iaXRzcGVybG9uZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vYml0c3BlcmxvbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGFlMWM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vYml0c3BlcmxvbmcuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9fQVNNX1g4Nl9CSVRTUEVSTE9OR19ICisjZGVmaW5lIF9fQVNNX1g4Nl9CSVRTUEVSTE9OR19ICisKKyNpZmRlZiBfX3g4Nl82NF9fCisjIGRlZmluZSBfX0JJVFNfUEVSX0xPTkcgNjQKKyNlbHNlCisjIGRlZmluZSBfX0JJVFNfUEVSX0xPTkcgMzIKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0c3BlcmxvbmcuaD4KKworI2VuZGlmIC8qIF9fQVNNX1g4Nl9CSVRTUEVSTE9OR19IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2Jvb3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2Jvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjIwMGFjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vYm9vdC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0FTTV9YODZfQk9PVF9ICisjZGVmaW5lIF9BU01fWDg2X0JPT1RfSAorCisvKiBJbnRlcm5hbCBzdmdhIHN0YXJ0dXAgY29uc3RhbnRzICovCisjZGVmaW5lIE5PUk1BTF9WR0EJMHhmZmZmCQkvKiA4MHgyNSBtb2RlICovCisjZGVmaW5lIEVYVEVOREVEX1ZHQQkweGZmZmUJCS8qIDgweDUwIG1vZGUgKi8KKyNkZWZpbmUgQVNLX1ZHQQkJMHhmZmZkCQkvKiBhc2sgZm9yIGl0IGF0IGJvb3R1cCAqLworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9CT09UX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2Jvb3RwYXJhbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vYm9vdHBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyMGQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2Jvb3RwYXJhbS5oCkBAIC0wLDAgKzEsMTM0IEBACisjaWZuZGVmIF9BU01fWDg2X0JPT1RQQVJBTV9ICisjZGVmaW5lIF9BU01fWDg2X0JPT1RQQVJBTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgvYXBtX2Jpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9lZGQuaD4KKyNpbmNsdWRlIDxhc20vZTgyMC5oPgorI2luY2x1ZGUgPGFzbS9pc3QuaD4KKyNpbmNsdWRlIDx2aWRlby9lZGlkLmg+CisKKy8qIHNldHVwIGRhdGEgdHlwZXMgKi8KKyNkZWZpbmUgU0VUVVBfTk9ORQkJCTAKKyNkZWZpbmUgU0VUVVBfRTgyMF9FWFQJCQkxCisjZGVmaW5lIFNFVFVQX0RUQgkJCTIKKworLyogZXh0ZW5zaWJsZSBzZXR1cCBkYXRhIGxpc3Qgbm9kZSAqLworc3RydWN0IHNldHVwX2RhdGEgeworCV9fdTY0IG5leHQ7CisJX191MzIgdHlwZTsKKwlfX3UzMiBsZW47CisJX191OCBkYXRhWzBdOworfTsKKworc3RydWN0IHNldHVwX2hlYWRlciB7CisJX191OAlzZXR1cF9zZWN0czsKKwlfX3UxNglyb290X2ZsYWdzOworCV9fdTMyCXN5c3NpemU7CisJX191MTYJcmFtX3NpemU7CisjZGVmaW5lIFJBTURJU0tfSU1BR0VfU1RBUlRfTUFTSwkweDA3RkYKKyNkZWZpbmUgUkFNRElTS19QUk9NUFRfRkxBRwkJMHg4MDAwCisjZGVmaW5lIFJBTURJU0tfTE9BRF9GTEFHCQkweDQwMDAKKwlfX3UxNgl2aWRfbW9kZTsKKwlfX3UxNglyb290X2RldjsKKwlfX3UxNglib290X2ZsYWc7CisJX191MTYJanVtcDsKKwlfX3UzMgloZWFkZXI7CisJX191MTYJdmVyc2lvbjsKKwlfX3UzMglyZWFsbW9kZV9zd3RjaDsKKwlfX3UxNglzdGFydF9zeXM7CisJX191MTYJa2VybmVsX3ZlcnNpb247CisJX191OAl0eXBlX29mX2xvYWRlcjsKKwlfX3U4CWxvYWRmbGFnczsKKyNkZWZpbmUgTE9BREVEX0hJR0gJKDE8PDApCisjZGVmaW5lIFFVSUVUX0ZMQUcJKDE8PDUpCisjZGVmaW5lIEtFRVBfU0VHTUVOVFMJKDE8PDYpCisjZGVmaW5lIENBTl9VU0VfSEVBUAkoMTw8NykKKwlfX3UxNglzZXR1cF9tb3ZlX3NpemU7CisJX191MzIJY29kZTMyX3N0YXJ0OworCV9fdTMyCXJhbWRpc2tfaW1hZ2U7CisJX191MzIJcmFtZGlza19zaXplOworCV9fdTMyCWJvb3RzZWN0X2tsdWRnZTsKKwlfX3UxNgloZWFwX2VuZF9wdHI7CisJX191OAlleHRfbG9hZGVyX3ZlcjsKKwlfX3U4CWV4dF9sb2FkZXJfdHlwZTsKKwlfX3UzMgljbWRfbGluZV9wdHI7CisJX191MzIJaW5pdHJkX2FkZHJfbWF4OworCV9fdTMyCWtlcm5lbF9hbGlnbm1lbnQ7CisJX191OAlyZWxvY2F0YWJsZV9rZXJuZWw7CisJX191OAlfcGFkMlszXTsKKwlfX3UzMgljbWRsaW5lX3NpemU7CisJX191MzIJaGFyZHdhcmVfc3ViYXJjaDsKKwlfX3U2NAloYXJkd2FyZV9zdWJhcmNoX2RhdGE7CisJX191MzIJcGF5bG9hZF9vZmZzZXQ7CisJX191MzIJcGF5bG9hZF9sZW5ndGg7CisJX191NjQJc2V0dXBfZGF0YTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzeXNfZGVzY190YWJsZSB7CisJX191MTYgbGVuZ3RoOworCV9fdTggIHRhYmxlWzE0XTsKK307CisKKy8qIEdsZWFuZWQgZnJvbSBPRlcncyBzZXQtcGFyYW1ldGVycyBpbiBjcHUveDg2L3BjL2xpbnV4LmZ0aCAqLworc3RydWN0IG9scGNfb2Z3X2hlYWRlciB7CisJX191MzIgb2Z3X21hZ2ljOwkvKiBPRlcgc2lnbmF0dXJlICovCisJX191MzIgb2Z3X3ZlcnNpb247CisJX191MzIgY2lmX2hhbmRsZXI7CS8qIGNhbGxiYWNrIGludG8gT0ZXICovCisJX191MzIgaXJxX2Rlc2NfdGFibGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZWZpX2luZm8geworCV9fdTMyIGVmaV9sb2FkZXJfc2lnbmF0dXJlOworCV9fdTMyIGVmaV9zeXN0YWI7CisJX191MzIgZWZpX21lbWRlc2Nfc2l6ZTsKKwlfX3UzMiBlZmlfbWVtZGVzY192ZXJzaW9uOworCV9fdTMyIGVmaV9tZW1tYXA7CisJX191MzIgZWZpX21lbW1hcF9zaXplOworCV9fdTMyIGVmaV9zeXN0YWJfaGk7CisJX191MzIgZWZpX21lbW1hcF9oaTsKK307CisKKy8qIFRoZSBzby1jYWxsZWQgInplcm9wYWdlIiAqLworc3RydWN0IGJvb3RfcGFyYW1zIHsKKwlzdHJ1Y3Qgc2NyZWVuX2luZm8gc2NyZWVuX2luZm87CQkJLyogMHgwMDAgKi8KKwlzdHJ1Y3QgYXBtX2Jpb3NfaW5mbyBhcG1fYmlvc19pbmZvOwkJLyogMHgwNDAgKi8KKwlfX3U4ICBfcGFkMls0XTsJCQkJCS8qIDB4MDU0ICovCisJX191NjQgIHRib290X2FkZHI7CQkJCS8qIDB4MDU4ICovCisJc3RydWN0IGlzdF9pbmZvIGlzdF9pbmZvOwkJCS8qIDB4MDYwICovCisJX191OCAgX3BhZDNbMTZdOwkJCQkvKiAweDA3MCAqLworCV9fdTggIGhkMF9pbmZvWzE2XTsJLyogb2Jzb2xldGUhICovCQkvKiAweDA4MCAqLworCV9fdTggIGhkMV9pbmZvWzE2XTsJLyogb2Jzb2xldGUhICovCQkvKiAweDA5MCAqLworCXN0cnVjdCBzeXNfZGVzY190YWJsZSBzeXNfZGVzY190YWJsZTsJCS8qIDB4MGEwICovCisJc3RydWN0IG9scGNfb2Z3X2hlYWRlciBvbHBjX29md19oZWFkZXI7CQkvKiAweDBiMCAqLworCV9fdTggIF9wYWQ0WzEyOF07CQkJCS8qIDB4MGMwICovCisJc3RydWN0IGVkaWRfaW5mbyBlZGlkX2luZm87CQkJLyogMHgxNDAgKi8KKwlzdHJ1Y3QgZWZpX2luZm8gZWZpX2luZm87CQkJLyogMHgxYzAgKi8KKwlfX3UzMiBhbHRfbWVtX2s7CQkJCS8qIDB4MWUwICovCisJX191MzIgc2NyYXRjaDsJCS8qIFNjcmF0Y2ggZmllbGQhICovCS8qIDB4MWU0ICovCisJX191OCAgZTgyMF9lbnRyaWVzOwkJCQkvKiAweDFlOCAqLworCV9fdTggIGVkZGJ1Zl9lbnRyaWVzOwkJCQkvKiAweDFlOSAqLworCV9fdTggIGVkZF9tYnJfc2lnX2J1Zl9lbnRyaWVzOwkJCS8qIDB4MWVhICovCisJX191OCAgX3BhZDZbNl07CQkJCQkvKiAweDFlYiAqLworCXN0cnVjdCBzZXR1cF9oZWFkZXIgaGRyOyAgICAvKiBzZXR1cCBoZWFkZXIgKi8JLyogMHgxZjEgKi8KKwlfX3U4ICBfcGFkN1sweDI5MC0weDFmMS1zaXplb2Yoc3RydWN0IHNldHVwX2hlYWRlcildOworCV9fdTMyIGVkZF9tYnJfc2lnX2J1ZmZlcltFRERfTUJSX1NJR19NQVhdOwkvKiAweDI5MCAqLworCXN0cnVjdCBlODIwZW50cnkgZTgyMF9tYXBbRTgyME1BWF07CQkvKiAweDJkMCAqLworCV9fdTggIF9wYWQ4WzQ4XTsJCQkJLyogMHhjZDAgKi8KKwlzdHJ1Y3QgZWRkX2luZm8gZWRkYnVmW0VERE1BWE5SXTsJCS8qIDB4ZDAwICovCisJX191OCAgX3BhZDlbMjc2XTsJCQkJLyogMHhlZWMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK2VudW0geworCVg4Nl9TVUJBUkNIX1BDID0gMCwKKwlYODZfU1VCQVJDSF9MR1VFU1QsCisJWDg2X1NVQkFSQ0hfWEVOLAorCVg4Nl9TVUJBUkNIX01SU1QsCisJWDg2X1NVQkFSQ0hfQ0U0MTAwLAorCVg4Nl9OUl9TVUJBUkNIUywKK307CisKKworCisjZW5kaWYgLyogX0FTTV9YODZfQk9PVFBBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2J5dGVvcmRlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vYnl0ZW9yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzYTdhOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2J5dGVvcmRlci5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9CWVRFT1JERVJfSAorI2RlZmluZSBfQVNNX1g4Nl9CWVRFT1JERVJfSAorCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KKworI2VuZGlmIC8qIF9BU01fWDg2X0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9kZWJ1Z3JlZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vZGVidWdyZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q5YmQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vZGVidWdyZWcuaApAQCAtMCwwICsxLDgwIEBACisjaWZuZGVmIF9BU01fWDg2X0RFQlVHUkVHX0gKKyNkZWZpbmUgX0FTTV9YODZfREVCVUdSRUdfSAorCisKKy8qIEluZGljYXRlIHRoZSByZWdpc3RlciBudW1iZXJzIGZvciBhIG51bWJlciBvZiB0aGUgc3BlY2lmaWMKKyAgIGRlYnVnIHJlZ2lzdGVycy4gIFJlZ2lzdGVycyAwLTMgY29udGFpbiB0aGUgYWRkcmVzc2VzIHdlIHdpc2ggdG8gdHJhcCBvbiAqLworI2RlZmluZSBEUl9GSVJTVEFERFIgMCAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9GSVJTVEFERFJdICovCisjZGVmaW5lIERSX0xBU1RBRERSIDMgICAgICAgICAvKiB1X2RlYnVncmVnW0RSX0xBU1RBRERSXSAgKi8KKworI2RlZmluZSBEUl9TVEFUVVMgNiAgICAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9TVEFUVVNdICAgICAqLworI2RlZmluZSBEUl9DT05UUk9MIDcgICAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9DT05UUk9MXSAqLworCisvKiBEZWZpbmUgYSBmZXcgdGhpbmdzIGZvciB0aGUgc3RhdHVzIHJlZ2lzdGVyLiAgV2UgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZQorICAgd2hpY2ggZGVidWdnaW5nIHJlZ2lzdGVyIHdhcyByZXNwb25zaWJsZSBmb3IgdGhlIHRyYXAuICBUaGUgb3RoZXIgYml0cworICAgYXJlIGVpdGhlciByZXNlcnZlZCBvciBub3Qgb2YgaW50ZXJlc3QgdG8gdXMuICovCisKKy8qIERlZmluZSByZXNlcnZlZCBiaXRzIGluIERSNiB3aGljaCBhcmUgYWx3YXlzIHNldCB0byAxICovCisjZGVmaW5lIERSNl9SRVNFUlZFRAkoMHhGRkZGMEZGMCkKKworI2RlZmluZSBEUl9UUkFQMAkoMHgxKQkJLyogZGIwICovCisjZGVmaW5lIERSX1RSQVAxCSgweDIpCQkvKiBkYjEgKi8KKyNkZWZpbmUgRFJfVFJBUDIJKDB4NCkJCS8qIGRiMiAqLworI2RlZmluZSBEUl9UUkFQMwkoMHg4KQkJLyogZGIzICovCisjZGVmaW5lIERSX1RSQVBfQklUUwkoRFJfVFJBUDB8RFJfVFJBUDF8RFJfVFJBUDJ8RFJfVFJBUDMpCisKKyNkZWZpbmUgRFJfU1RFUAkJKDB4NDAwMCkJLyogc2luZ2xlLXN0ZXAgKi8KKyNkZWZpbmUgRFJfU1dJVENICSgweDgwMDApCS8qIHRhc2sgc3dpdGNoICovCisKKy8qIE5vdyBkZWZpbmUgYSBidW5jaCBvZiB0aGluZ3MgZm9yIG1hbmlwdWxhdGluZyB0aGUgY29udHJvbCByZWdpc3Rlci4KKyAgIFRoZSB0b3AgdHdvIGJ5dGVzIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyIGNvbnNpc3Qgb2YgNCBmaWVsZHMgb2YgNAorICAgYml0cyAtIGVhY2ggZmllbGQgY29ycmVzcG9uZHMgdG8gb25lIG9mIHRoZSBmb3VyIGRlYnVnIHJlZ2lzdGVycywKKyAgIGFuZCBpbmRpY2F0ZXMgd2hhdCB0eXBlcyBvZiBhY2Nlc3Mgd2UgdHJhcCBvbiwgYW5kIGhvdyBsYXJnZSB0aGUgZGF0YQorICAgZmllbGQgaXMgdGhhdCB3ZSBhcmUgbG9va2luZyBhdCAqLworCisjZGVmaW5lIERSX0NPTlRST0xfU0hJRlQgMTYgLyogU2tpcCB0aGlzIG1hbnkgYml0cyBpbiBjdGwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRFJfQ09OVFJPTF9TSVpFIDQgICAvKiA0IGNvbnRyb2wgYml0cyBwZXIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBEUl9SV19FWEVDVVRFICgweDApICAgLyogU2V0dGluZ3MgZm9yIHRoZSBhY2Nlc3MgdHlwZXMgdG8gdHJhcCBvbiAqLworI2RlZmluZSBEUl9SV19XUklURSAoMHgxKQorI2RlZmluZSBEUl9SV19SRUFEICgweDMpCisKKyNkZWZpbmUgRFJfTEVOXzEgKDB4MCkgLyogU2V0dGluZ3MgZm9yIGRhdGEgbGVuZ3RoIHRvIHRyYXAgb24gKi8KKyNkZWZpbmUgRFJfTEVOXzIgKDB4NCkKKyNkZWZpbmUgRFJfTEVOXzQgKDB4QykKKyNkZWZpbmUgRFJfTEVOXzggKDB4OCkKKworLyogVGhlIGxvdyBieXRlIHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyIGRldGVybWluZSB3aGljaCByZWdpc3RlcnMgYXJlCisgICBlbmFibGVkLiAgVGhlcmUgYXJlIDQgZmllbGRzIG9mIHR3byBiaXRzLiAgT25lIGJpdCBpcyAibG9jYWwiLCBtZWFuaW5nCisgICB0aGF0IHRoZSBwcm9jZXNzb3Igd2lsbCByZXNldCB0aGUgYml0IGFmdGVyIGEgdGFzayBzd2l0Y2ggYW5kIHRoZSBvdGhlcgorICAgaXMgZ2xvYmFsIG1lYW5pbmcgdGhhdCB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgcmVzZXQgdGhlIGJpdC4gIFdpdGggbGludXgsCisgICB5b3UgY2FuIHVzZSBlaXRoZXIgb25lLCBzaW5jZSB3ZSBleHBsaWNpdGx5IHplcm8gdGhlIHJlZ2lzdGVyIHdoZW4gd2UgZW50ZXIKKyAgIGtlcm5lbCBtb2RlLiAqLworCisjZGVmaW5lIERSX0xPQ0FMX0VOQUJMRV9TSElGVCAwICAgIC8qIEV4dHJhIHNoaWZ0IHRvIHRoZSBsb2NhbCBlbmFibGUgYml0ICovCisjZGVmaW5lIERSX0dMT0JBTF9FTkFCTEVfU0hJRlQgMSAgIC8qIEV4dHJhIHNoaWZ0IHRvIHRoZSBnbG9iYWwgZW5hYmxlIGJpdCAqLworI2RlZmluZSBEUl9MT0NBTF9FTkFCTEUgKDB4MSkgICAgICAvKiBMb2NhbCBlbmFibGUgZm9yIHJlZyAwICovCisjZGVmaW5lIERSX0dMT0JBTF9FTkFCTEUgKDB4MikgICAgIC8qIEdsb2JhbCBlbmFibGUgZm9yIHJlZyAwICovCisjZGVmaW5lIERSX0VOQUJMRV9TSVpFIDIgICAgICAgICAgIC8qIDIgZW5hYmxlIGJpdHMgcGVyIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgRFJfTE9DQUxfRU5BQkxFX01BU0sgKDB4NTUpICAvKiBTZXQgIGxvY2FsIGJpdHMgZm9yIGFsbCA0IHJlZ3MgKi8KKyNkZWZpbmUgRFJfR0xPQkFMX0VOQUJMRV9NQVNLICgweEFBKSAvKiBTZXQgZ2xvYmFsIGJpdHMgZm9yIGFsbCA0IHJlZ3MgKi8KKworLyogVGhlIHNlY29uZCBieXRlIHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyIGhhcyBhIGZldyBzcGVjaWFsIHRoaW5ncy4KKyAgIFdlIGNhbiBzbG93IHRoZSBpbnN0cnVjdGlvbiBwaXBlbGluZSBmb3IgaW5zdHJ1Y3Rpb25zIGNvbWluZyB2aWEgdGhlCisgICBnZHQgb3IgdGhlIGxkdCBpZiB3ZSB3YW50IHRvLiAgSSBhbSBub3Qgc3VyZSB3aHkgdGhpcyBpcyBhbiBhZHZhbnRhZ2UgKi8KKworI2lmZGVmIF9faTM4Nl9fCisjZGVmaW5lIERSX0NPTlRST0xfUkVTRVJWRUQgKDB4RkMwMCkgLyogUmVzZXJ2ZWQgYnkgSW50ZWwgKi8KKyNlbHNlCisjZGVmaW5lIERSX0NPTlRST0xfUkVTRVJWRUQgKDB4RkZGRkZGRkYwMDAwRkMwMFVMKSAvKiBSZXNlcnZlZCAqLworI2VuZGlmCisKKyNkZWZpbmUgRFJfTE9DQUxfU0xPV0RPV04gKDB4MTAwKSAgIC8qIExvY2FsIHNsb3cgdGhlIHBpcGVsaW5lICovCisjZGVmaW5lIERSX0dMT0JBTF9TTE9XRE9XTiAoMHgyMDApICAvKiBHbG9iYWwgc2xvdyB0aGUgcGlwZWxpbmUgKi8KKworLyoKKyAqIEhXIGJyZWFrcG9pbnQgYWRkaXRpb25zCisgKi8KKworI2VuZGlmIC8qIF9BU01fWDg2X0RFQlVHUkVHX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2U4MjAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2U4MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmVlNTU4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vZTgyMC5oCkBAIC0wLDAgKzEsNzIgQEAKKyNpZm5kZWYgX0FTTV9YODZfRTgyMF9ICisjZGVmaW5lIF9BU01fWDg2X0U4MjBfSAorI2RlZmluZSBFODIwTUFQCTB4MmQwCQkvKiBvdXIgbWFwICovCisjZGVmaW5lIEU4MjBNQVgJMTI4CQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBFODIwTUFQICovCisKKy8qCisgKiBMZWdhY3kgRTgyMCBCSU9TIGxpbWl0cyB1cyB0byAxMjggKEU4MjBNQVgpIG5vZGVzIGR1ZSB0byB0aGUKKyAqIGNvbnN0cmFpbmVkIHNwYWNlIGluIHRoZSB6ZXJvcGFnZS4gIElmIHdlIGhhdmUgbW9yZSBub2RlcyB0aGFuCisgKiB0aGF0LCBhbmQgaWYgd2UndmUgYm9vdGVkIG9mZiBFRkkgZmlybXdhcmUsIHRoZW4gdGhlIEVGSSB0YWJsZXMKKyAqIHBhc3NlZCB1cyBmcm9tIHRoZSBFRkkgZmlybXdhcmUgY2FuIGxpc3QgbW9yZSBub2Rlcy4gIFNpemUgb3VyCisgKiBpbnRlcm5hbCBtZW1vcnkgbWFwIHRhYmxlcyB0byBoYXZlIHJvb20gZm9yIHRoZXNlIGFkZGl0aW9uYWwKKyAqIG5vZGVzLCBiYXNlZCBvbiB1cCB0byB0aHJlZSBlbnRyaWVzIHBlciBub2RlIGZvciB3aGljaCB0aGUKKyAqIGtlcm5lbCB3YXMgYnVpbHQ6IE1BWF9OVU1OT0RFUyA9PSAoMSA8PCBDT05GSUdfTk9ERVNfU0hJRlQpLAorICogcGx1cyBFODIwTUFYLCBhbGxvd2luZyBzcGFjZSBmb3IgdGhlIHBvc3NpYmxlIGR1cGxpY2F0ZSBFODIwCisgKiBlbnRyaWVzIHRoYXQgbWlnaHQgbmVlZCByb29tIGluIHRoZSBzYW1lIGFycmF5cywgcHJpb3IgdG8gdGhlCisgKiBjYWxsIHRvIHNhbml0aXplX2U4MjBfbWFwKCkgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMuICBUaGUgYWxsb3dhbmNlCisgKiBvZiB0aHJlZSBtZW1vcnkgbWFwIGVudHJpZXMgcGVyIG5vZGUgaXMgImVub3VnaCIgZW50cmllcyBmb3IKKyAqIHRoZSBpbml0aWFsIGhhcmR3YXJlIHBsYXRmb3JtIG1vdGl2YXRpbmcgdGhpcyBtZWNoYW5pc20gdG8gbWFrZQorICogdXNlIG9mIGFkZGl0aW9uYWwgRUZJIG1hcCBlbnRyaWVzLiAgRnV0dXJlIHBsYXRmb3JtcyBtYXkgd2FudAorICogdG8gYWxsb3cgbW9yZSB0aGFuIHRocmVlIGVudHJpZXMgcGVyIG5vZGUgb3Igb3RoZXJ3aXNlIHJlZmluZQorICogdGhpcyBzaXplLgorICovCisKKy8qCisgKiBPZGQ6ICdtYWtlIGhlYWRlcnNfY2hlY2snIGNvbXBsYWlucyBhYm91dCBudW1hLmggaWYgSSB0cnkKKyAqIHRvIGNvbGxhcHNlIHRoZSBuZXh0IHR3byAjaWZkZWYgbGluZXMgdG8gYSBzaW5nbGUgbGluZToKKyAqCSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pICYmIGRlZmluZWQoQ09ORklHX0VGSSkKKyAqLworI2RlZmluZSBFODIwX1hfTUFYIEU4MjBNQVgKKworI2RlZmluZSBFODIwTlIJMHgxZTgJCS8qICMgZW50cmllcyBpbiBFODIwTUFQICovCisKKyNkZWZpbmUgRTgyMF9SQU0JMQorI2RlZmluZSBFODIwX1JFU0VSVkVECTIKKyNkZWZpbmUgRTgyMF9BQ1BJCTMKKyNkZWZpbmUgRTgyMF9OVlMJNAorI2RlZmluZSBFODIwX1VOVVNBQkxFCTUKKworLyoKKyAqIHJlc2VydmVkIFJBTSB1c2VkIGJ5IGtlcm5lbCBpdHNlbGYKKyAqIGlmIENPTkZJR19JTlRFTF9UWFQgaXMgZW5hYmxlZCwgbWVtb3J5IG9mIHRoaXMgdHlwZSB3aWxsIGJlCisgKiBpbmNsdWRlZCBpbiB0aGUgUzMgaW50ZWdyaXR5IGNhbGN1bGF0aW9uIGFuZCBzbyBzaG91bGQgbm90IGluY2x1ZGUKKyAqIGFueSBtZW1vcnkgdGhhdCBCSU9TIG1pZ2h0IGFsdGVyIG92ZXIgdGhlIFMzIHRyYW5zaXRpb24KKyAqLworI2RlZmluZSBFODIwX1JFU0VSVkVEX0tFUk4gICAgICAgIDEyOAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CitzdHJ1Y3QgZTgyMGVudHJ5IHsKKwlfX3U2NCBhZGRyOwkvKiBzdGFydCBvZiBtZW1vcnkgc2VnbWVudCAqLworCV9fdTY0IHNpemU7CS8qIHNpemUgb2YgbWVtb3J5IHNlZ21lbnQgKi8KKwlfX3UzMiB0eXBlOwkvKiB0eXBlIG9mIG1lbW9yeSBzZWdtZW50ICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZTgyMG1hcCB7CisJX191MzIgbnJfbWFwOworCXN0cnVjdCBlODIwZW50cnkgbWFwW0U4MjBfWF9NQVhdOworfTsKKworI2RlZmluZSBJU0FfU1RBUlRfQUREUkVTUwkweGEwMDAwCisjZGVmaW5lIElTQV9FTkRfQUREUkVTUwkJMHgxMDAwMDAKKworI2RlZmluZSBCSU9TX0JFR0lOCQkweDAwMGEwMDAwCisjZGVmaW5lIEJJT1NfRU5ECQkweDAwMTAwMDAwCisKKyNkZWZpbmUgQklPU19ST01fQkFTRQkJMHhmZmUwMDAwMAorI2RlZmluZSBCSU9TX1JPTV9FTkQJCTB4ZmZmZmZmZmYKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9FODIwX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2Vycm5vLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODJiNTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9lcnJuby5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9lcnJuby5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vZmNudGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2ZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhYjEyZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2ZjbnRsLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9od19icmVha3BvaW50LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9od19icmVha3BvaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2NGU5YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2h3X2JyZWFrcG9pbnQuaApAQCAtMCwwICsxLDUgQEAKKyNpZm5kZWYJX0kzODZfSFdfQlJFQUtQT0lOVF9ICisjZGVmaW5lCV9JMzg2X0hXX0JSRUFLUE9JTlRfSAorCisjZW5kaWYJLyogX0kzODZfSFdfQlJFQUtQT0lOVF9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2h5cGVydi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaHlwZXJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwNDIwYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2h5cGVydi5oCkBAIC0wLDAgKzEsMTk0IEBACisjaWZuZGVmIF9BU01fWDg2X0hZUEVSVl9ICisjZGVmaW5lIF9BU01fWDg2X0hZUEVSVl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogVGhlIGJlbG93IENQVUlEIGxlYXZlcyBhcmUgcHJlc2VudCBpZiBWZXJzaW9uQW5kRmVhdHVyZXMuSHlwZXJ2aXNvclByZXNlbnQKKyAqIGlzIHNldCBieSBDUFVJRChIdkNwdUlkRnVuY3Rpb25WZXJzaW9uQW5kRmVhdHVyZXMpLgorICovCisjZGVmaW5lIEhZUEVSVl9DUFVJRF9WRU5ET1JfQU5EX01BWF9GVU5DVElPTlMJMHg0MDAwMDAwMAorI2RlZmluZSBIWVBFUlZfQ1BVSURfSU5URVJGQUNFCQkJMHg0MDAwMDAwMQorI2RlZmluZSBIWVBFUlZfQ1BVSURfVkVSU0lPTgkJCTB4NDAwMDAwMDIKKyNkZWZpbmUgSFlQRVJWX0NQVUlEX0ZFQVRVUkVTCQkJMHg0MDAwMDAwMworI2RlZmluZSBIWVBFUlZfQ1BVSURfRU5MSUdIVE1FTlRfSU5GTwkJMHg0MDAwMDAwNAorI2RlZmluZSBIWVBFUlZfQ1BVSURfSU1QTEVNRU5UX0xJTUlUUwkJMHg0MDAwMDAwNQorCisjZGVmaW5lIEhZUEVSVl9IWVBFUlZJU09SX1BSRVNFTlRfQklUCQkweDgwMDAwMDAwCisjZGVmaW5lIEhZUEVSVl9DUFVJRF9NSU4JCQkweDQwMDAwMDA1CisjZGVmaW5lIEhZUEVSVl9DUFVJRF9NQVgJCQkweDQwMDBmZmZmCisKKy8qCisgKiBGZWF0dXJlIGlkZW50aWZpY2F0aW9uLiBFQVggaW5kaWNhdGVzIHdoaWNoIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUKKyAqIHRvIHRoZSBwYXJ0aXRpb24gYmFzZWQgdXBvbiB0aGUgY3VycmVudCBwYXJ0aXRpb24gcHJpdmlsZWdlcy4KKyAqLworCisvKiBWUCBSdW50aW1lIChIVl9YNjRfTVNSX1ZQX1JVTlRJTUUpIGF2YWlsYWJsZSAqLworI2RlZmluZSBIVl9YNjRfTVNSX1ZQX1JVTlRJTUVfQVZBSUxBQkxFCQkoMSA8PCAwKQorLyogUGFydGl0aW9uIFJlZmVyZW5jZSBDb3VudGVyIChIVl9YNjRfTVNSX1RJTUVfUkVGX0NPVU5UKSBhdmFpbGFibGUqLworI2RlZmluZSBIVl9YNjRfTVNSX1RJTUVfUkVGX0NPVU5UX0FWQUlMQUJMRQkoMSA8PCAxKQorLyoKKyAqIEJhc2ljIFN5bklDIE1TUnMgKEhWX1g2NF9NU1JfU0NPTlRST0wgdGhyb3VnaCBIVl9YNjRfTVNSX0VPTQorICogYW5kIEhWX1g2NF9NU1JfU0lOVDAgdGhyb3VnaCBIVl9YNjRfTVNSX1NJTlQxNSkgYXZhaWxhYmxlCisgKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9TWU5JQ19BVkFJTEFCTEUJCSgxIDw8IDIpCisvKgorICogU3ludGhldGljIFRpbWVyIE1TUnMgKEhWX1g2NF9NU1JfU1RJTUVSMF9DT05GSUcgdGhyb3VnaAorICogSFZfWDY0X01TUl9TVElNRVIzX0NPVU5UKSBhdmFpbGFibGUKKyAqLworI2RlZmluZSBIVl9YNjRfTVNSX1NZTlRJTUVSX0FWQUlMQUJMRQkJKDEgPDwgMykKKy8qCisgKiBBUElDIGFjY2VzcyBNU1JzIChIVl9YNjRfTVNSX0VPSSwgSFZfWDY0X01TUl9JQ1IgYW5kIEhWX1g2NF9NU1JfVFBSKQorICogYXJlIGF2YWlsYWJsZQorICovCisjZGVmaW5lIEhWX1g2NF9NU1JfQVBJQ19BQ0NFU1NfQVZBSUxBQkxFCSgxIDw8IDQpCisvKiBIeXBlcmNhbGwgTVNScyAoSFZfWDY0X01TUl9HVUVTVF9PU19JRCBhbmQgSFZfWDY0X01TUl9IWVBFUkNBTEwpIGF2YWlsYWJsZSovCisjZGVmaW5lIEhWX1g2NF9NU1JfSFlQRVJDQUxMX0FWQUlMQUJMRQkJKDEgPDwgNSkKKy8qIEFjY2VzcyB2aXJ0dWFsIHByb2Nlc3NvciBpbmRleCBNU1IgKEhWX1g2NF9NU1JfVlBfSU5ERVgpIGF2YWlsYWJsZSovCisjZGVmaW5lIEhWX1g2NF9NU1JfVlBfSU5ERVhfQVZBSUxBQkxFCQkoMSA8PCA2KQorLyogVmlydHVhbCBzeXN0ZW0gcmVzZXQgTVNSIChIVl9YNjRfTVNSX1JFU0VUKSBpcyBhdmFpbGFibGUqLworI2RlZmluZSBIVl9YNjRfTVNSX1JFU0VUX0FWQUlMQUJMRQkJKDEgPDwgNykKKyAvKgorICAqIEFjY2VzcyBzdGF0aXN0aWNzIHBhZ2VzIE1TUnMgKEhWX1g2NF9NU1JfU1RBVFNfUEFSVElUSU9OX1JFVEFJTF9QQUdFLAorICAqIEhWX1g2NF9NU1JfU1RBVFNfUEFSVElUSU9OX0lOVEVSTkFMX1BBR0UsIEhWX1g2NF9NU1JfU1RBVFNfVlBfUkVUQUlMX1BBR0UsCisgICogSFZfWDY0X01TUl9TVEFUU19WUF9JTlRFUk5BTF9QQUdFKSBhdmFpbGFibGUKKyAgKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9TVEFUX1BBR0VTX0FWQUlMQUJMRQkJKDEgPDwgOCkKKworLyoKKyAqIEZlYXR1cmUgaWRlbnRpZmljYXRpb246IEVCWCBpbmRpY2F0ZXMgd2hpY2ggZmxhZ3Mgd2VyZSBzcGVjaWZpZWQgYXQKKyAqIHBhcnRpdGlvbiBjcmVhdGlvbi4gVGhlIGZvcm1hdCBpcyB0aGUgc2FtZSBhcyB0aGUgcGFydGl0aW9uIGNyZWF0aW9uCisgKiBmbGFnIHN0cnVjdHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gUGFydGl0aW9uIENyZWF0aW9uIEZsYWdzLgorICovCisjZGVmaW5lIEhWX1g2NF9DUkVBVEVfUEFSVElUSU9OUwkJKDEgPDwgMCkKKyNkZWZpbmUgSFZfWDY0X0FDQ0VTU19QQVJUSVRJT05fSUQJCSgxIDw8IDEpCisjZGVmaW5lIEhWX1g2NF9BQ0NFU1NfTUVNT1JZX1BPT0wJCSgxIDw8IDIpCisjZGVmaW5lIEhWX1g2NF9BREpVU1RfTUVTU0FHRV9CVUZGRVJTCQkoMSA8PCAzKQorI2RlZmluZSBIVl9YNjRfUE9TVF9NRVNTQUdFUwkJCSgxIDw8IDQpCisjZGVmaW5lIEhWX1g2NF9TSUdOQUxfRVZFTlRTCQkJKDEgPDwgNSkKKyNkZWZpbmUgSFZfWDY0X0NSRUFURV9QT1JUCQkJKDEgPDwgNikKKyNkZWZpbmUgSFZfWDY0X0NPTk5FQ1RfUE9SVAkJCSgxIDw8IDcpCisjZGVmaW5lIEhWX1g2NF9BQ0NFU1NfU1RBVFMJCQkoMSA8PCA4KQorI2RlZmluZSBIVl9YNjRfREVCVUdHSU5HCQkJKDEgPDwgMTEpCisjZGVmaW5lIEhWX1g2NF9DUFVfUE9XRVJfTUFOQUdFTUVOVAkJKDEgPDwgMTIpCisjZGVmaW5lIEhWX1g2NF9DT05GSUdVUkVfUFJPRklMRVIJCSgxIDw8IDEzKQorCisvKgorICogRmVhdHVyZSBpZGVudGlmaWNhdGlvbi4gRURYIGluZGljYXRlcyB3aGljaCBtaXNjZWxsYW5lb3VzIGZlYXR1cmVzCisgKiBhcmUgYXZhaWxhYmxlIHRvIHRoZSBwYXJ0aXRpb24uCisgKi8KKy8qIFRoZSBNV0FJVCBpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUgKHBlciBzZWN0aW9uIE1PTklUT1IgLyBNV0FJVCkgKi8KKyNkZWZpbmUgSFZfWDY0X01XQUlUX0FWQUlMQUJMRQkJCQkoMSA8PCAwKQorLyogR3Vlc3QgZGVidWdnaW5nIHN1cHBvcnQgaXMgYXZhaWxhYmxlICovCisjZGVmaW5lIEhWX1g2NF9HVUVTVF9ERUJVR0dJTkdfQVZBSUxBQkxFCQkoMSA8PCAxKQorLyogUGVyZm9ybWFuY2UgTW9uaXRvciBzdXBwb3J0IGlzIGF2YWlsYWJsZSovCisjZGVmaW5lIEhWX1g2NF9QRVJGX01PTklUT1JfQVZBSUxBQkxFCQkJKDEgPDwgMikKKy8qIFN1cHBvcnQgZm9yIHBoeXNpY2FsIENQVSBkeW5hbWljIHBhcnRpdGlvbmluZyBldmVudHMgaXMgYXZhaWxhYmxlKi8KKyNkZWZpbmUgSFZfWDY0X0NQVV9EWU5BTUlDX1BBUlRJVElPTklOR19BVkFJTEFCTEUJKDEgPDwgMykKKy8qCisgKiBTdXBwb3J0IGZvciBwYXNzaW5nIGh5cGVyY2FsbCBpbnB1dCBwYXJhbWV0ZXIgYmxvY2sgdmlhIFhNTQorICogcmVnaXN0ZXJzIGlzIGF2YWlsYWJsZQorICovCisjZGVmaW5lIEhWX1g2NF9IWVBFUkNBTExfUEFSQU1TX1hNTV9BVkFJTEFCTEUJCSgxIDw8IDQpCisvKiBTdXBwb3J0IGZvciBhIHZpcnR1YWwgZ3Vlc3QgaWRsZSBzdGF0ZSBpcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgSFZfWDY0X0dVRVNUX0lETEVfU1RBVEVfQVZBSUxBQkxFCQkoMSA8PCA1KQorCisvKgorICogSW1wbGVtZW50YXRpb24gcmVjb21tZW5kYXRpb25zLiBJbmRpY2F0ZXMgd2hpY2ggYmVoYXZpb3JzIHRoZSBoeXBlcnZpc29yCisgKiByZWNvbW1lbmRzIHRoZSBPUyBpbXBsZW1lbnQgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2UuCisgKi8KKyAvKgorICAqIFJlY29tbWVuZCB1c2luZyBoeXBlcmNhbGwgZm9yIGFkZHJlc3Mgc3BhY2Ugc3dpdGNoZXMgcmF0aGVyCisgICogdGhhbiBNT1YgdG8gQ1IzIGluc3RydWN0aW9uCisgICovCisjZGVmaW5lIEhWX1g2NF9NV0FJVF9SRUNPTU1FTkRFRAkJKDEgPDwgMCkKKy8qIFJlY29tbWVuZCB1c2luZyBoeXBlcmNhbGwgZm9yIGxvY2FsIFRMQiBmbHVzaGVzIHJhdGhlcgorICogdGhhbiBJTlZMUEcgb3IgTU9WIHRvIENSMyBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgSFZfWDY0X0xPQ0FMX1RMQl9GTFVTSF9SRUNPTU1FTkRFRAkoMSA8PCAxKQorLyoKKyAqIFJlY29tbWVuZCB1c2luZyBoeXBlcmNhbGwgZm9yIHJlbW90ZSBUTEIgZmx1c2hlcyByYXRoZXIKKyAqIHRoYW4gaW50ZXItcHJvY2Vzc29yIGludGVycnVwdHMKKyAqLworI2RlZmluZSBIVl9YNjRfUkVNT1RFX1RMQl9GTFVTSF9SRUNPTU1FTkRFRAkoMSA8PCAyKQorLyoKKyAqIFJlY29tbWVuZCB1c2luZyBNU1JzIGZvciBhY2Nlc3NpbmcgQVBJQyByZWdpc3RlcnMKKyAqIEVPSSwgSUNSIGFuZCBUUFIgcmF0aGVyIHRoYW4gdGhlaXIgbWVtb3J5LW1hcHBlZCBjb3VudGVycGFydHMKKyAqLworI2RlZmluZSBIVl9YNjRfQVBJQ19BQ0NFU1NfUkVDT01NRU5ERUQJCSgxIDw8IDMpCisvKiBSZWNvbW1lbmQgdXNpbmcgdGhlIGh5cGVydmlzb3ItcHJvdmlkZWQgTVNSIHRvIGluaXRpYXRlIGEgc3lzdGVtIFJFU0VUICovCisjZGVmaW5lIEhWX1g2NF9TWVNURU1fUkVTRVRfUkVDT01NRU5ERUQJCSgxIDw8IDQpCisvKgorICogUmVjb21tZW5kIHVzaW5nIHJlbGF4ZWQgdGltaW5nIGZvciB0aGlzIHBhcnRpdGlvbi4gSWYgdXNlZCwKKyAqIHRoZSBWTSBzaG91bGQgZGlzYWJsZSBhbnkgd2F0Y2hkb2cgdGltZW91dHMgdGhhdCByZWx5IG9uIHRoZQorICogdGltZWx5IGRlbGl2ZXJ5IG9mIGV4dGVybmFsIGludGVycnVwdHMKKyAqLworI2RlZmluZSBIVl9YNjRfUkVMQVhFRF9USU1JTkdfUkVDT01NRU5ERUQJKDEgPDwgNSkKKworLyogTVNSIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGd1ZXN0IE9TLiAqLworI2RlZmluZSBIVl9YNjRfTVNSX0dVRVNUX09TX0lECQkJMHg0MDAwMDAwMAorCisvKiBNU1IgdXNlZCB0byBzZXR1cCBwYWdlcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGh5cGVydmlzb3IuICovCisjZGVmaW5lIEhWX1g2NF9NU1JfSFlQRVJDQUxMCQkJMHg0MDAwMDAwMQorCisvKiBNU1IgdXNlZCB0byBwcm92aWRlIHZjcHUgaW5kZXggKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9WUF9JTkRFWAkJCTB4NDAwMDAwMDIKKworLyogTVNSIHVzZWQgdG8gcmVhZCB0aGUgcGVyLXBhcnRpdGlvbiB0aW1lIHJlZmVyZW5jZSBjb3VudGVyICovCisjZGVmaW5lIEhWX1g2NF9NU1JfVElNRV9SRUZfQ09VTlQJCTB4NDAwMDAwMjAKKworLyogRGVmaW5lIHRoZSB2aXJ0dWFsIEFQSUMgcmVnaXN0ZXJzICovCisjZGVmaW5lIEhWX1g2NF9NU1JfRU9JCQkJCTB4NDAwMDAwNzAKKyNkZWZpbmUgSFZfWDY0X01TUl9JQ1IJCQkJMHg0MDAwMDA3MQorI2RlZmluZSBIVl9YNjRfTVNSX1RQUgkJCQkweDQwMDAwMDcyCisjZGVmaW5lIEhWX1g2NF9NU1JfQVBJQ19BU1NJU1RfUEFHRQkJMHg0MDAwMDA3MworCisvKiBEZWZpbmUgc3ludGhldGljIGludGVycnVwdCBjb250cm9sbGVyIG1vZGVsIHNwZWNpZmljIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9TQ09OVFJPTAkJCTB4NDAwMDAwODAKKyNkZWZpbmUgSFZfWDY0X01TUl9TVkVSU0lPTgkJCTB4NDAwMDAwODEKKyNkZWZpbmUgSFZfWDY0X01TUl9TSUVGUAkJCTB4NDAwMDAwODIKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU1QCQkJCTB4NDAwMDAwODMKKyNkZWZpbmUgSFZfWDY0X01TUl9FT00JCQkJMHg0MDAwMDA4NAorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQwCQkJMHg0MDAwMDA5MAorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQxCQkJMHg0MDAwMDA5MQorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQyCQkJMHg0MDAwMDA5MgorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQzCQkJMHg0MDAwMDA5MworI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQ0CQkJMHg0MDAwMDA5NAorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQ1CQkJMHg0MDAwMDA5NQorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQ2CQkJMHg0MDAwMDA5NgorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQ3CQkJMHg0MDAwMDA5NworI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQ4CQkJMHg0MDAwMDA5OAorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQ5CQkJMHg0MDAwMDA5OQorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQxMAkJCTB4NDAwMDAwOUEKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UMTEJCQkweDQwMDAwMDlCCisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDEyCQkJMHg0MDAwMDA5QworI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQxMwkJCTB4NDAwMDAwOUQKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UMTQJCQkweDQwMDAwMDlFCisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDE1CQkJMHg0MDAwMDA5RgorCisKKyNkZWZpbmUgSFZfWDY0X01TUl9IWVBFUkNBTExfRU5BQkxFCQkweDAwMDAwMDAxCisjZGVmaW5lIEhWX1g2NF9NU1JfSFlQRVJDQUxMX1BBR0VfQUREUkVTU19TSElGVAkxMgorI2RlZmluZSBIVl9YNjRfTVNSX0hZUEVSQ0FMTF9QQUdFX0FERFJFU1NfTUFTSwlcCisJCSh+KCgxdWxsIDw8IEhWX1g2NF9NU1JfSFlQRVJDQUxMX1BBR0VfQUREUkVTU19TSElGVCkgLSAxKSkKKworLyogRGVjbGFyZSB0aGUgdmFyaW91cyBoeXBlcmNhbGwgb3BlcmF0aW9ucy4gKi8KKyNkZWZpbmUgSFZfWDY0X0hWX05PVElGWV9MT05HX1NQSU5fV0FJVAkJMHgwMDA4CisKKyNkZWZpbmUgSFZfWDY0X01TUl9BUElDX0FTU0lTVF9QQUdFX0VOQUJMRQkJMHgwMDAwMDAwMQorI2RlZmluZSBIVl9YNjRfTVNSX0FQSUNfQVNTSVNUX1BBR0VfQUREUkVTU19TSElGVAkxMgorI2RlZmluZSBIVl9YNjRfTVNSX0FQSUNfQVNTSVNUX1BBR0VfQUREUkVTU19NQVNLCVwKKwkJKH4oKDF1bGwgPDwgSFZfWDY0X01TUl9BUElDX0FTU0lTVF9QQUdFX0FERFJFU1NfU0hJRlQpIC0gMSkpCisKKyNkZWZpbmUgSFZfUFJPQ0VTU09SX1BPV0VSX1NUQVRFX0MwCQkwCisjZGVmaW5lIEhWX1BST0NFU1NPUl9QT1dFUl9TVEFURV9DMQkJMQorI2RlZmluZSBIVl9QUk9DRVNTT1JfUE9XRVJfU1RBVEVfQzIJCTIKKyNkZWZpbmUgSFZfUFJPQ0VTU09SX1BPV0VSX1NUQVRFX0MzCQkzCisKKy8qIGh5cGVyY2FsbCBzdGF0dXMgY29kZSAqLworI2RlZmluZSBIVl9TVEFUVVNfU1VDQ0VTUwkJCTAKKyNkZWZpbmUgSFZfU1RBVFVTX0lOVkFMSURfSFlQRVJDQUxMX0NPREUJMgorI2RlZmluZSBIVl9TVEFUVVNfSU5WQUxJRF9IWVBFUkNBTExfSU5QVVQJMworI2RlZmluZSBIVl9TVEFUVVNfSU5WQUxJRF9BTElHTk1FTlQJCTQKKyNkZWZpbmUgSFZfU1RBVFVTX0lOU1VGRklDSUVOVF9CVUZGRVJTCQkxOQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2lvY3RsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNzlmZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9pb2N0bC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaW9jdGxzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9pb2N0bHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzM0Yzc2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaW9jdGxzLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lvY3Rscy5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaXBjYnVmLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9pcGNidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGM3ZTUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaXBjYnVmLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lwY2J1Zi5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaXN0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9pc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTE1NjRiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaXN0LmgKQEAgLTAsMCArMSwyOSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9JU1RfSAorI2RlZmluZSBfQVNNX1g4Nl9JU1RfSAorCisvKgorICogSW5jbHVkZSBmaWxlIGZvciB0aGUgaW50ZXJmYWNlIHRvIElTVCBCSU9TCisgKiBDb3B5cmlnaHQgMjAwMiBBbmR5IEdyb3ZlciA8YW5kcmV3Lmdyb3ZlckBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBpc3RfaW5mbyB7CisJX191MzIgc2lnbmF0dXJlOworCV9fdTMyIGNvbW1hbmQ7CisJX191MzIgZXZlbnQ7CisJX191MzIgcGVyZl9sZXZlbDsKK307CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9JU1RfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20va3ZtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9rdm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDhkY2JkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20va3ZtLmgKQEAgLTAsMCArMSwzMjQgQEAKKyNpZm5kZWYgX0FTTV9YODZfS1ZNX0gKKyNkZWZpbmUgX0FTTV9YODZfS1ZNX0gKKworLyoKKyAqIEtWTSB4ODYgc3BlY2lmaWMgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworLyogU2VsZWN0IHg4NiBzcGVjaWZpYyBmZWF0dXJlcyBpbiA8bGludXgva3ZtLmg+ICovCisjZGVmaW5lIF9fS1ZNX0hBVkVfUElUCisjZGVmaW5lIF9fS1ZNX0hBVkVfSU9BUElDCisjZGVmaW5lIF9fS1ZNX0hBVkVfREVWSUNFX0FTU0lHTk1FTlQKKyNkZWZpbmUgX19LVk1fSEFWRV9NU0kKKyNkZWZpbmUgX19LVk1fSEFWRV9VU0VSX05NSQorI2RlZmluZSBfX0tWTV9IQVZFX0dVRVNUX0RFQlVHCisjZGVmaW5lIF9fS1ZNX0hBVkVfTVNJWAorI2RlZmluZSBfX0tWTV9IQVZFX01DRQorI2RlZmluZSBfX0tWTV9IQVZFX1BJVF9TVEFURTIKKyNkZWZpbmUgX19LVk1fSEFWRV9YRU5fSFZNCisjZGVmaW5lIF9fS1ZNX0hBVkVfVkNQVV9FVkVOVFMKKyNkZWZpbmUgX19LVk1fSEFWRV9ERUJVR1JFR1MKKyNkZWZpbmUgX19LVk1fSEFWRV9YU0FWRQorI2RlZmluZSBfX0tWTV9IQVZFX1hDUlMKKworLyogQXJjaGl0ZWN0dXJhbCBpbnRlcnJ1cHQgbGluZSBjb3VudC4gKi8KKyNkZWZpbmUgS1ZNX05SX0lOVEVSUlVQVFMgMjU2CisKK3N0cnVjdCBrdm1fbWVtb3J5X2FsaWFzIHsKKwlfX3UzMiBzbG90OyAgLyogdGhpcyBoYXMgYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gbWVtb3J5IHNsb3RzICovCisJX191MzIgZmxhZ3M7CisJX191NjQgZ3Vlc3RfcGh5c19hZGRyOworCV9fdTY0IG1lbW9yeV9zaXplOworCV9fdTY0IHRhcmdldF9waHlzX2FkZHI7Cit9OworCisvKiBmb3IgS1ZNX0dFVF9JUlFDSElQIGFuZCBLVk1fU0VUX0lSUUNISVAgKi8KK3N0cnVjdCBrdm1fcGljX3N0YXRlIHsKKwlfX3U4IGxhc3RfaXJyOwkvKiBlZGdlIGRldGVjdGlvbiAqLworCV9fdTggaXJyOwkJLyogaW50ZXJydXB0IHJlcXVlc3QgcmVnaXN0ZXIgKi8KKwlfX3U4IGltcjsJCS8qIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisJX191OCBpc3I7CQkvKiBpbnRlcnJ1cHQgc2VydmljZSByZWdpc3RlciAqLworCV9fdTggcHJpb3JpdHlfYWRkOwkvKiBoaWdoZXN0IGlycSBwcmlvcml0eSAqLworCV9fdTggaXJxX2Jhc2U7CisJX191OCByZWFkX3JlZ19zZWxlY3Q7CisJX191OCBwb2xsOworCV9fdTggc3BlY2lhbF9tYXNrOworCV9fdTggaW5pdF9zdGF0ZTsKKwlfX3U4IGF1dG9fZW9pOworCV9fdTggcm90YXRlX29uX2F1dG9fZW9pOworCV9fdTggc3BlY2lhbF9mdWxseV9uZXN0ZWRfbW9kZTsKKwlfX3U4IGluaXQ0OwkJLyogdHJ1ZSBpZiA0IGJ5dGUgaW5pdCAqLworCV9fdTggZWxjcjsJCS8qIFBJSVggZWRnZS90cmlnZ2VyIHNlbGVjdGlvbiAqLworCV9fdTggZWxjcl9tYXNrOworfTsKKworI2RlZmluZSBLVk1fSU9BUElDX05VTV9QSU5TICAyNAorc3RydWN0IGt2bV9pb2FwaWNfc3RhdGUgeworCV9fdTY0IGJhc2VfYWRkcmVzczsKKwlfX3UzMiBpb3JlZ3NlbDsKKwlfX3UzMiBpZDsKKwlfX3UzMiBpcnI7CisJX191MzIgcGFkOworCXVuaW9uIHsKKwkJX191NjQgYml0czsKKwkJc3RydWN0IHsKKwkJCV9fdTggdmVjdG9yOworCQkJX191OCBkZWxpdmVyeV9tb2RlOjM7CisJCQlfX3U4IGRlc3RfbW9kZToxOworCQkJX191OCBkZWxpdmVyeV9zdGF0dXM6MTsKKwkJCV9fdTggcG9sYXJpdHk6MTsKKwkJCV9fdTggcmVtb3RlX2lycjoxOworCQkJX191OCB0cmlnX21vZGU6MTsKKwkJCV9fdTggbWFzazoxOworCQkJX191OCByZXNlcnZlOjc7CisJCQlfX3U4IHJlc2VydmVkWzRdOworCQkJX191OCBkZXN0X2lkOworCQl9IGZpZWxkczsKKwl9IHJlZGlydGJsW0tWTV9JT0FQSUNfTlVNX1BJTlNdOworfTsKKworI2RlZmluZSBLVk1fSVJRQ0hJUF9QSUNfTUFTVEVSICAgMAorI2RlZmluZSBLVk1fSVJRQ0hJUF9QSUNfU0xBVkUgICAgMQorI2RlZmluZSBLVk1fSVJRQ0hJUF9JT0FQSUMgICAgICAgMgorI2RlZmluZSBLVk1fTlJfSVJRQ0hJUFMgICAgICAgICAgMworCisvKiBmb3IgS1ZNX0dFVF9SRUdTIGFuZCBLVk1fU0VUX1JFR1MgKi8KK3N0cnVjdCBrdm1fcmVncyB7CisJLyogb3V0IChLVk1fR0VUX1JFR1MpIC8gaW4gKEtWTV9TRVRfUkVHUykgKi8KKwlfX3U2NCByYXgsIHJieCwgcmN4LCByZHg7CisJX191NjQgcnNpLCByZGksIHJzcCwgcmJwOworCV9fdTY0IHI4LCAgcjksICByMTAsIHIxMTsKKwlfX3U2NCByMTIsIHIxMywgcjE0LCByMTU7CisJX191NjQgcmlwLCByZmxhZ3M7Cit9OworCisvKiBmb3IgS1ZNX0dFVF9MQVBJQyBhbmQgS1ZNX1NFVF9MQVBJQyAqLworI2RlZmluZSBLVk1fQVBJQ19SRUdfU0laRSAweDQwMAorc3RydWN0IGt2bV9sYXBpY19zdGF0ZSB7CisJY2hhciByZWdzW0tWTV9BUElDX1JFR19TSVpFXTsKK307CisKK3N0cnVjdCBrdm1fc2VnbWVudCB7CisJX191NjQgYmFzZTsKKwlfX3UzMiBsaW1pdDsKKwlfX3UxNiBzZWxlY3RvcjsKKwlfX3U4ICB0eXBlOworCV9fdTggIHByZXNlbnQsIGRwbCwgZGIsIHMsIGwsIGcsIGF2bDsKKwlfX3U4ICB1bnVzYWJsZTsKKwlfX3U4ICBwYWRkaW5nOworfTsKKworc3RydWN0IGt2bV9kdGFibGUgeworCV9fdTY0IGJhc2U7CisJX191MTYgbGltaXQ7CisJX191MTYgcGFkZGluZ1szXTsKK307CisKKworLyogZm9yIEtWTV9HRVRfU1JFR1MgYW5kIEtWTV9TRVRfU1JFR1MgKi8KK3N0cnVjdCBrdm1fc3JlZ3MgeworCS8qIG91dCAoS1ZNX0dFVF9TUkVHUykgLyBpbiAoS1ZNX1NFVF9TUkVHUykgKi8KKwlzdHJ1Y3Qga3ZtX3NlZ21lbnQgY3MsIGRzLCBlcywgZnMsIGdzLCBzczsKKwlzdHJ1Y3Qga3ZtX3NlZ21lbnQgdHIsIGxkdDsKKwlzdHJ1Y3Qga3ZtX2R0YWJsZSBnZHQsIGlkdDsKKwlfX3U2NCBjcjAsIGNyMiwgY3IzLCBjcjQsIGNyODsKKwlfX3U2NCBlZmVyOworCV9fdTY0IGFwaWNfYmFzZTsKKwlfX3U2NCBpbnRlcnJ1cHRfYml0bWFwWyhLVk1fTlJfSU5URVJSVVBUUyArIDYzKSAvIDY0XTsKK307CisKKy8qIGZvciBLVk1fR0VUX0ZQVSBhbmQgS1ZNX1NFVF9GUFUgKi8KK3N0cnVjdCBrdm1fZnB1IHsKKwlfX3U4ICBmcHJbOF1bMTZdOworCV9fdTE2IGZjdzsKKwlfX3UxNiBmc3c7CisJX191OCAgZnR3eDsgIC8qIGluIGZ4c2F2ZSBmb3JtYXQgKi8KKwlfX3U4ICBwYWQxOworCV9fdTE2IGxhc3Rfb3Bjb2RlOworCV9fdTY0IGxhc3RfaXA7CisJX191NjQgbGFzdF9kcDsKKwlfX3U4ICB4bW1bMTZdWzE2XTsKKwlfX3UzMiBteGNzcjsKKwlfX3UzMiBwYWQyOworfTsKKworc3RydWN0IGt2bV9tc3JfZW50cnkgeworCV9fdTMyIGluZGV4OworCV9fdTMyIHJlc2VydmVkOworCV9fdTY0IGRhdGE7Cit9OworCisvKiBmb3IgS1ZNX0dFVF9NU1JTIGFuZCBLVk1fU0VUX01TUlMgKi8KK3N0cnVjdCBrdm1fbXNycyB7CisJX191MzIgbm1zcnM7IC8qIG51bWJlciBvZiBtc3JzIGluIGVudHJpZXMgKi8KKwlfX3UzMiBwYWQ7CisKKwlzdHJ1Y3Qga3ZtX21zcl9lbnRyeSBlbnRyaWVzWzBdOworfTsKKworLyogZm9yIEtWTV9HRVRfTVNSX0lOREVYX0xJU1QgKi8KK3N0cnVjdCBrdm1fbXNyX2xpc3QgeworCV9fdTMyIG5tc3JzOyAvKiBudW1iZXIgb2YgbXNycyBpbiBlbnRyaWVzICovCisJX191MzIgaW5kaWNlc1swXTsKK307CisKKworc3RydWN0IGt2bV9jcHVpZF9lbnRyeSB7CisJX191MzIgZnVuY3Rpb247CisJX191MzIgZWF4OworCV9fdTMyIGVieDsKKwlfX3UzMiBlY3g7CisJX191MzIgZWR4OworCV9fdTMyIHBhZGRpbmc7Cit9OworCisvKiBmb3IgS1ZNX1NFVF9DUFVJRCAqLworc3RydWN0IGt2bV9jcHVpZCB7CisJX191MzIgbmVudDsKKwlfX3UzMiBwYWRkaW5nOworCXN0cnVjdCBrdm1fY3B1aWRfZW50cnkgZW50cmllc1swXTsKK307CisKK3N0cnVjdCBrdm1fY3B1aWRfZW50cnkyIHsKKwlfX3UzMiBmdW5jdGlvbjsKKwlfX3UzMiBpbmRleDsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBlYXg7CisJX191MzIgZWJ4OworCV9fdTMyIGVjeDsKKwlfX3UzMiBlZHg7CisJX191MzIgcGFkZGluZ1szXTsKK307CisKKyNkZWZpbmUgS1ZNX0NQVUlEX0ZMQUdfU0lHTklGQ0FOVF9JTkRFWCAxCisjZGVmaW5lIEtWTV9DUFVJRF9GTEFHX1NUQVRFRlVMX0ZVTkMgICAgMgorI2RlZmluZSBLVk1fQ1BVSURfRkxBR19TVEFURV9SRUFEX05FWFQgIDQKKworLyogZm9yIEtWTV9TRVRfQ1BVSUQyICovCitzdHJ1Y3Qga3ZtX2NwdWlkMiB7CisJX191MzIgbmVudDsKKwlfX3UzMiBwYWRkaW5nOworCXN0cnVjdCBrdm1fY3B1aWRfZW50cnkyIGVudHJpZXNbMF07Cit9OworCisvKiBmb3IgS1ZNX0dFVF9QSVQgYW5kIEtWTV9TRVRfUElUICovCitzdHJ1Y3Qga3ZtX3BpdF9jaGFubmVsX3N0YXRlIHsKKwlfX3UzMiBjb3VudDsgLyogY2FuIGJlIDY1NTM2ICovCisJX191MTYgbGF0Y2hlZF9jb3VudDsKKwlfX3U4IGNvdW50X2xhdGNoZWQ7CisJX191OCBzdGF0dXNfbGF0Y2hlZDsKKwlfX3U4IHN0YXR1czsKKwlfX3U4IHJlYWRfc3RhdGU7CisJX191OCB3cml0ZV9zdGF0ZTsKKwlfX3U4IHdyaXRlX2xhdGNoOworCV9fdTggcndfbW9kZTsKKwlfX3U4IG1vZGU7CisJX191OCBiY2Q7CisJX191OCBnYXRlOworCV9fczY0IGNvdW50X2xvYWRfdGltZTsKK307CisKK3N0cnVjdCBrdm1fZGVidWdfZXhpdF9hcmNoIHsKKwlfX3UzMiBleGNlcHRpb247CisJX191MzIgcGFkOworCV9fdTY0IHBjOworCV9fdTY0IGRyNjsKKwlfX3U2NCBkcjc7Cit9OworCisjZGVmaW5lIEtWTV9HVUVTVERCR19VU0VfU1dfQlAJCTB4MDAwMTAwMDAKKyNkZWZpbmUgS1ZNX0dVRVNUREJHX1VTRV9IV19CUAkJMHgwMDAyMDAwMAorI2RlZmluZSBLVk1fR1VFU1REQkdfSU5KRUNUX0RCCQkweDAwMDQwMDAwCisjZGVmaW5lIEtWTV9HVUVTVERCR19JTkpFQ1RfQlAJCTB4MDAwODAwMDAKKworLyogZm9yIEtWTV9TRVRfR1VFU1RfREVCVUcgKi8KK3N0cnVjdCBrdm1fZ3Vlc3RfZGVidWdfYXJjaCB7CisJX191NjQgZGVidWdyZWdbOF07Cit9OworCitzdHJ1Y3Qga3ZtX3BpdF9zdGF0ZSB7CisJc3RydWN0IGt2bV9waXRfY2hhbm5lbF9zdGF0ZSBjaGFubmVsc1szXTsKK307CisKKyNkZWZpbmUgS1ZNX1BJVF9GTEFHU19IUEVUX0xFR0FDWSAgMHgwMDAwMDAwMQorCitzdHJ1Y3Qga3ZtX3BpdF9zdGF0ZTIgeworCXN0cnVjdCBrdm1fcGl0X2NoYW5uZWxfc3RhdGUgY2hhbm5lbHNbM107CisJX191MzIgZmxhZ3M7CisJX191MzIgcmVzZXJ2ZWRbOV07Cit9OworCitzdHJ1Y3Qga3ZtX3JlaW5qZWN0X2NvbnRyb2wgeworCV9fdTggcGl0X3JlaW5qZWN0OworCV9fdTggcmVzZXJ2ZWRbMzFdOworfTsKKworLyogV2hlbiBzZXQgaW4gZmxhZ3MsIGluY2x1ZGUgY29ycmVzcG9uZGluZyBmaWVsZHMgb24gS1ZNX1NFVF9WQ1BVX0VWRU5UUyAqLworI2RlZmluZSBLVk1fVkNQVUVWRU5UX1ZBTElEX05NSV9QRU5ESU5HCTB4MDAwMDAwMDEKKyNkZWZpbmUgS1ZNX1ZDUFVFVkVOVF9WQUxJRF9TSVBJX1ZFQ1RPUgkweDAwMDAwMDAyCisjZGVmaW5lIEtWTV9WQ1BVRVZFTlRfVkFMSURfU0hBRE9XCTB4MDAwMDAwMDQKKworLyogSW50ZXJydXB0IHNoYWRvdyBzdGF0ZXMgKi8KKyNkZWZpbmUgS1ZNX1g4Nl9TSEFET1dfSU5UX01PVl9TUwkweDAxCisjZGVmaW5lIEtWTV9YODZfU0hBRE9XX0lOVF9TVEkJCTB4MDIKKworLyogZm9yIEtWTV9HRVQvU0VUX1ZDUFVfRVZFTlRTICovCitzdHJ1Y3Qga3ZtX3ZjcHVfZXZlbnRzIHsKKwlzdHJ1Y3QgeworCQlfX3U4IGluamVjdGVkOworCQlfX3U4IG5yOworCQlfX3U4IGhhc19lcnJvcl9jb2RlOworCQlfX3U4IHBhZDsKKwkJX191MzIgZXJyb3JfY29kZTsKKwl9IGV4Y2VwdGlvbjsKKwlzdHJ1Y3QgeworCQlfX3U4IGluamVjdGVkOworCQlfX3U4IG5yOworCQlfX3U4IHNvZnQ7CisJCV9fdTggc2hhZG93OworCX0gaW50ZXJydXB0OworCXN0cnVjdCB7CisJCV9fdTggaW5qZWN0ZWQ7CisJCV9fdTggcGVuZGluZzsKKwkJX191OCBtYXNrZWQ7CisJCV9fdTggcGFkOworCX0gbm1pOworCV9fdTMyIHNpcGlfdmVjdG9yOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHJlc2VydmVkWzEwXTsKK307CisKKy8qIGZvciBLVk1fR0VUL1NFVF9ERUJVR1JFR1MgKi8KK3N0cnVjdCBrdm1fZGVidWdyZWdzIHsKKwlfX3U2NCBkYls0XTsKKwlfX3U2NCBkcjY7CisJX191NjQgZHI3OworCV9fdTY0IGZsYWdzOworCV9fdTY0IHJlc2VydmVkWzldOworfTsKKworLyogZm9yIEtWTV9DQVBfWFNBVkUgKi8KK3N0cnVjdCBrdm1feHNhdmUgeworCV9fdTMyIHJlZ2lvblsxMDI0XTsKK307CisKKyNkZWZpbmUgS1ZNX01BWF9YQ1JTCTE2CisKK3N0cnVjdCBrdm1feGNyIHsKKwlfX3UzMiB4Y3I7CisJX191MzIgcmVzZXJ2ZWQ7CisJX191NjQgdmFsdWU7Cit9OworCitzdHJ1Y3Qga3ZtX3hjcnMgeworCV9fdTMyIG5yX3hjcnM7CisJX191MzIgZmxhZ3M7CisJc3RydWN0IGt2bV94Y3IgeGNyc1tLVk1fTUFYX1hDUlNdOworCV9fdTY0IHBhZGRpbmdbMTZdOworfTsKKworI2VuZGlmIC8qIF9BU01fWDg2X0tWTV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9rdm1fcGFyYS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20va3ZtX3BhcmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmFjNDZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20va3ZtX3BhcmEuaApAQCAtMCwwICsxLDkzIEBACisjaWZuZGVmIF9BU01fWDg2X0tWTV9QQVJBX0gKKyNkZWZpbmUgX0FTTV9YODZfS1ZNX1BBUkFfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaHlwZXJ2Lmg+CisKKy8qIFRoaXMgQ1BVSUQgcmV0dXJucyB0aGUgc2lnbmF0dXJlICdLVk1LVk1LVk0nIGluIGVieCwgZWN4LCBhbmQgZWR4LiAgSXQKKyAqIHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGF0IGEgVk0gaXMgcnVubmluZyB1bmRlciBLVk0uCisgKi8KKyNkZWZpbmUgS1ZNX0NQVUlEX1NJR05BVFVSRQkweDQwMDAwMDAwCisKKy8qIFRoaXMgQ1BVSUQgcmV0dXJucyBhIGZlYXR1cmUgYml0bWFwIGluIGVheC4gIEJlZm9yZSBlbmFibGluZyBhIHBhcnRpY3VsYXIKKyAqIHBhcmF2aXJ0dWFsaXphdGlvbiwgdGhlIGFwcHJvcHJpYXRlIGZlYXR1cmUgYml0IHNob3VsZCBiZSBjaGVja2VkLgorICovCisjZGVmaW5lIEtWTV9DUFVJRF9GRUFUVVJFUwkweDQwMDAwMDAxCisjZGVmaW5lIEtWTV9GRUFUVVJFX0NMT0NLU09VUkNFCQkwCisjZGVmaW5lIEtWTV9GRUFUVVJFX05PUF9JT19ERUxBWQkxCisjZGVmaW5lIEtWTV9GRUFUVVJFX01NVV9PUAkJMgorLyogVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgbmV3IHNldCBvZiBrdm1jbG9jayBtc3JzCisgKiBhcmUgYXZhaWxhYmxlLiBUaGUgdXNlIG9mIDB4MTEgYW5kIDB4MTIgaXMgZGVwcmVjYXRlZAorICovCisjZGVmaW5lIEtWTV9GRUFUVVJFX0NMT0NLU09VUkNFMiAgICAgICAgMworI2RlZmluZSBLVk1fRkVBVFVSRV9BU1lOQ19QRgkJNAorI2RlZmluZSBLVk1fRkVBVFVSRV9TVEVBTF9USU1FCQk1CisKKy8qIFRoZSBsYXN0IDggYml0cyBhcmUgdXNlZCB0byBpbmRpY2F0ZSBob3cgdG8gaW50ZXJwcmV0IHRoZSBmbGFncyBmaWVsZAorICogaW4gcHZjbG9jayBzdHJ1Y3R1cmUuIElmIG5vIGJpdHMgYXJlIHNldCwgYWxsIGZsYWdzIGFyZSBpZ25vcmVkLgorICovCisjZGVmaW5lIEtWTV9GRUFUVVJFX0NMT0NLU09VUkNFX1NUQUJMRV9CSVQJMjQKKworI2RlZmluZSBNU1JfS1ZNX1dBTExfQ0xPQ0sgIDB4MTEKKyNkZWZpbmUgTVNSX0tWTV9TWVNURU1fVElNRSAweDEyCisKKyNkZWZpbmUgS1ZNX01TUl9FTkFCTEVEIDEKKy8qIEN1c3RvbSBNU1JzIGZhbGxzIGluIHRoZSByYW5nZSAweDRiNTY0ZDAwLTB4NGI1NjRkZmYgKi8KKyNkZWZpbmUgTVNSX0tWTV9XQUxMX0NMT0NLX05FVyAgMHg0YjU2NGQwMAorI2RlZmluZSBNU1JfS1ZNX1NZU1RFTV9USU1FX05FVyAweDRiNTY0ZDAxCisjZGVmaW5lIE1TUl9LVk1fQVNZTkNfUEZfRU4gMHg0YjU2NGQwMgorI2RlZmluZSBNU1JfS1ZNX1NURUFMX1RJTUUgIDB4NGI1NjRkMDMKKworc3RydWN0IGt2bV9zdGVhbF90aW1lIHsKKwlfX3U2NCBzdGVhbDsKKwlfX3UzMiB2ZXJzaW9uOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHBhZFsxMl07Cit9OworCisjZGVmaW5lIEtWTV9TVEVBTF9BTElHTk1FTlRfQklUUyA1CisjZGVmaW5lIEtWTV9TVEVBTF9WQUxJRF9CSVRTICgoLTFVTEwgPDwgKEtWTV9TVEVBTF9BTElHTk1FTlRfQklUUyArIDEpKSkKKyNkZWZpbmUgS1ZNX1NURUFMX1JFU0VSVkVEX01BU0sgKCgoMSA8PCBLVk1fU1RFQUxfQUxJR05NRU5UX0JJVFMpIC0gMSApIDw8IDEpCisKKyNkZWZpbmUgS1ZNX01BWF9NTVVfT1BfQkFUQ0ggICAgICAgICAgIDMyCisKKyNkZWZpbmUgS1ZNX0FTWU5DX1BGX0VOQUJMRUQJCQkoMSA8PCAwKQorI2RlZmluZSBLVk1fQVNZTkNfUEZfU0VORF9BTFdBWVMJCSgxIDw8IDEpCisKKy8qIE9wZXJhdGlvbnMgZm9yIEtWTV9IQ19NTVVfT1AgKi8KKyNkZWZpbmUgS1ZNX01NVV9PUF9XUklURV9QVEUgICAgICAgICAgICAxCisjZGVmaW5lIEtWTV9NTVVfT1BfRkxVU0hfVExCCSAgICAgICAgMgorI2RlZmluZSBLVk1fTU1VX09QX1JFTEVBU0VfUFQJICAgICAgICAzCisKKy8qIFBheWxvYWQgZm9yIEtWTV9IQ19NTVVfT1AgKi8KK3N0cnVjdCBrdm1fbW11X29wX2hlYWRlciB7CisJX191MzIgb3A7CisJX191MzIgcGFkOworfTsKKworc3RydWN0IGt2bV9tbXVfb3Bfd3JpdGVfcHRlIHsKKwlzdHJ1Y3Qga3ZtX21tdV9vcF9oZWFkZXIgaGVhZGVyOworCV9fdTY0IHB0ZV9waHlzOworCV9fdTY0IHB0ZV92YWw7Cit9OworCitzdHJ1Y3Qga3ZtX21tdV9vcF9mbHVzaF90bGIgeworCXN0cnVjdCBrdm1fbW11X29wX2hlYWRlciBoZWFkZXI7Cit9OworCitzdHJ1Y3Qga3ZtX21tdV9vcF9yZWxlYXNlX3B0IHsKKwlzdHJ1Y3Qga3ZtX21tdV9vcF9oZWFkZXIgaGVhZGVyOworCV9fdTY0IHB0X3BoeXM7Cit9OworCisjZGVmaW5lIEtWTV9QVl9SRUFTT05fUEFHRV9OT1RfUFJFU0VOVCAxCisjZGVmaW5lIEtWTV9QVl9SRUFTT05fUEFHRV9SRUFEWSAyCisKK3N0cnVjdCBrdm1fdmNwdV9wdl9hcGZfZGF0YSB7CisJX191MzIgcmVhc29uOworCV9fdTggcGFkWzYwXTsKKwlfX3UzMiBlbmFibGVkOworfTsKKworCisjZW5kaWYgLyogX0FTTV9YODZfS1ZNX1BBUkFfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbGR0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9sZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjcyN2ViCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbGR0LmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIGxkdC5oCisgKgorICogRGVmaW5pdGlvbnMgb2Ygc3RydWN0dXJlcyB1c2VkIHdpdGggdGhlIG1vZGlmeV9sZHQgc3lzdGVtIGNhbGwuCisgKi8KKyNpZm5kZWYgX0FTTV9YODZfTERUX0gKKyNkZWZpbmUgX0FTTV9YODZfTERUX0gKKworLyogTWF4aW11bSBudW1iZXIgb2YgTERUIGVudHJpZXMgc3VwcG9ydGVkLiAqLworI2RlZmluZSBMRFRfRU5UUklFUwk4MTkyCisvKiBUaGUgc2l6ZSBvZiBlYWNoIExEVCBlbnRyeS4gKi8KKyNkZWZpbmUgTERUX0VOVFJZX1NJWkUJOAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworLyoKKyAqIE5vdGUgb24gNjRiaXQgYmFzZSBhbmQgbGltaXQgaXMgaWdub3JlZCBhbmQgeW91IGNhbm5vdCBzZXQgRFMvRVMvQ1MKKyAqIG5vdCB0byB0aGUgZGVmYXVsdCB2YWx1ZXMgaWYgeW91IHN0aWxsIHdhbnQgdG8gZG8gc3lzY2FsbHMuIFRoaXMKKyAqIGNhbGwgaXMgbW9yZSBmb3IgMzJiaXQgbW9kZSB0aGVyZWZvcmUuCisgKi8KK3N0cnVjdCB1c2VyX2Rlc2MgeworCXVuc2lnbmVkIGludCAgZW50cnlfbnVtYmVyOworCXVuc2lnbmVkIGludCAgYmFzZV9hZGRyOworCXVuc2lnbmVkIGludCAgbGltaXQ7CisJdW5zaWduZWQgaW50ICBzZWdfMzJiaXQ6MTsKKwl1bnNpZ25lZCBpbnQgIGNvbnRlbnRzOjI7CisJdW5zaWduZWQgaW50ICByZWFkX2V4ZWNfb25seToxOworCXVuc2lnbmVkIGludCAgbGltaXRfaW5fcGFnZXM6MTsKKwl1bnNpZ25lZCBpbnQgIHNlZ19ub3RfcHJlc2VudDoxOworCXVuc2lnbmVkIGludCAgdXNlYWJsZToxOworI2lmZGVmIF9feDg2XzY0X18KKwl1bnNpZ25lZCBpbnQgIGxtOjE7CisjZW5kaWYKK307CisKKyNkZWZpbmUgTU9ESUZZX0xEVF9DT05URU5UU19EQVRBCTAKKyNkZWZpbmUgTU9ESUZZX0xEVF9DT05URU5UU19TVEFDSwkxCisjZGVmaW5lIE1PRElGWV9MRFRfQ09OVEVOVFNfQ09ERQkyCisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogX0FTTV9YODZfTERUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL21jZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwYjJmYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL21jZS5oCkBAIC0wLDAgKzEsMTIzIEBACisjaWZuZGVmIF9BU01fWDg2X01DRV9ICisjZGVmaW5lIF9BU01fWDg2X01DRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworLyoKKyAqIE1hY2hpbmUgQ2hlY2sgc3VwcG9ydCBmb3IgeDg2CisgKi8KKworLyogTUNHX0NBUCByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIE1DR19CQU5LQ05UX01BU0sJMHhmZiAgICAgICAgIC8qIE51bWJlciBvZiBCYW5rcyAqLworI2RlZmluZSBNQ0dfQ1RMX1AJCSgxVUxMPDw4KSAgICAvKiBNQ0dfQ1RMIHJlZ2lzdGVyIGF2YWlsYWJsZSAqLworI2RlZmluZSBNQ0dfRVhUX1AJCSgxVUxMPDw5KSAgICAvKiBFeHRlbmRlZCByZWdpc3RlcnMgYXZhaWxhYmxlICovCisjZGVmaW5lIE1DR19DTUNJX1AJCSgxVUxMPDwxMCkgICAvKiBDTUNJIHN1cHBvcnRlZCAqLworI2RlZmluZSBNQ0dfRVhUX0NOVF9NQVNLCTB4ZmYwMDAwICAgICAvKiBOdW1iZXIgb2YgRXh0ZW5kZWQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1DR19FWFRfQ05UX1NISUZUCTE2CisjZGVmaW5lIE1DR19FWFRfQ05UKGMpCQkoKChjKSAmIE1DR19FWFRfQ05UX01BU0spID4+IE1DR19FWFRfQ05UX1NISUZUKQorI2RlZmluZSBNQ0dfU0VSX1AJIAkoMVVMTDw8MjQpICAgLyogTUNBIHJlY292ZXJ5L25ldyBzdGF0dXMgYml0cyAqLworCisvKiBNQ0dfU1RBVFVTIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgTUNHX1NUQVRVU19SSVBWICAoMVVMTDw8MCkgICAvKiByZXN0YXJ0IGlwIHZhbGlkICovCisjZGVmaW5lIE1DR19TVEFUVVNfRUlQViAgKDFVTEw8PDEpICAgLyogaXAgcG9pbnRzIHRvIGNvcnJlY3QgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgTUNHX1NUQVRVU19NQ0lQICAoMVVMTDw8MikgICAvKiBtYWNoaW5lIGNoZWNrIGluIHByb2dyZXNzICovCisKKy8qIE1DaV9TVEFUVVMgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBNQ0lfU1RBVFVTX1ZBTCAgICgxVUxMPDw2MykgIC8qIHZhbGlkIGVycm9yICovCisjZGVmaW5lIE1DSV9TVEFUVVNfT1ZFUiAgKDFVTEw8PDYyKSAgLyogcHJldmlvdXMgZXJyb3JzIGxvc3QgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19VQyAgICAoMVVMTDw8NjEpICAvKiB1bmNvcnJlY3RlZCBlcnJvciAqLworI2RlZmluZSBNQ0lfU1RBVFVTX0VOICAgICgxVUxMPDw2MCkgIC8qIGVycm9yIGVuYWJsZWQgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19NSVNDViAoMVVMTDw8NTkpICAvKiBtaXNjIGVycm9yIHJlZy4gdmFsaWQgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19BRERSViAoMVVMTDw8NTgpICAvKiBhZGRyIHJlZy4gdmFsaWQgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19QQ0MgICAoMVVMTDw8NTcpICAvKiBwcm9jZXNzb3IgY29udGV4dCBjb3JydXB0ICovCisjZGVmaW5lIE1DSV9TVEFUVVNfUwkgKDFVTEw8PDU2KSAgLyogU2lnbmFsZWQgbWFjaGluZSBjaGVjayAqLworI2RlZmluZSBNQ0lfU1RBVFVTX0FSCSAoMVVMTDw8NTUpICAvKiBBY3Rpb24gcmVxdWlyZWQgKi8KKworLyogTUNpX01JU0MgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBNQ0lfTUlTQ19BRERSX0xTQihtKQkoKG0pICYgMHgzZikKKyNkZWZpbmUgTUNJX01JU0NfQUREUl9NT0RFKG0pCSgoKG0pID4+IDYpICYgNykKKyNkZWZpbmUgIE1DSV9NSVNDX0FERFJfU0VHT0ZGCTAJLyogc2VnbWVudCBvZmZzZXQgKi8KKyNkZWZpbmUgIE1DSV9NSVNDX0FERFJfTElORUFSCTEJLyogbGluZWFyIGFkZHJlc3MgKi8KKyNkZWZpbmUgIE1DSV9NSVNDX0FERFJfUEhZUwkyCS8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KKyNkZWZpbmUgIE1DSV9NSVNDX0FERFJfTUVNCTMJLyogbWVtb3J5IGFkZHJlc3MgKi8KKyNkZWZpbmUgIE1DSV9NSVNDX0FERFJfR0VORVJJQwk3CS8qIGdlbmVyaWMgKi8KKworLyogQ1RMMiByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIE1DSV9DVEwyX0NNQ0lfRU4JCSgxVUxMIDw8IDMwKQorI2RlZmluZSBNQ0lfQ1RMMl9DTUNJX1RIUkVTSE9MRF9NQVNLCTB4N2ZmZlVMTAorCisjZGVmaW5lIE1DSl9DVFhfTUFTSwkJMworI2RlZmluZSBNQ0pfQ1RYKGZsYWdzKQkJKChmbGFncykgJiBNQ0pfQ1RYX01BU0spCisjZGVmaW5lIE1DSl9DVFhfUkFORE9NCQkwICAgIC8qIGluamVjdCBjb250ZXh0OiByYW5kb20gKi8KKyNkZWZpbmUgTUNKX0NUWF9QUk9DRVNTCQkxICAgIC8qIGluamVjdCBjb250ZXh0OiBwcm9jZXNzICovCisjZGVmaW5lIE1DSl9DVFhfSVJRCQkyICAgIC8qIGluamVjdCBjb250ZXh0OiBJUlEgKi8KKyNkZWZpbmUgTUNKX05NSV9CUk9BRENBU1QJNCAgICAvKiBkbyBOTUkgYnJvYWRjYXN0aW5nICovCisjZGVmaW5lIE1DSl9FWENFUFRJT04JCTggICAgLyogcmFpc2UgYXMgZXhjZXB0aW9uICovCisKKy8qIEZpZWxkcyBhcmUgemVybyB3aGVuIG5vdCBhdmFpbGFibGUgKi8KK3N0cnVjdCBtY2UgeworCV9fdTY0IHN0YXR1czsKKwlfX3U2NCBtaXNjOworCV9fdTY0IGFkZHI7CisJX191NjQgbWNnc3RhdHVzOworCV9fdTY0IGlwOworCV9fdTY0IHRzYzsJLyogY3B1IHRpbWUgc3RhbXAgY291bnRlciAqLworCV9fdTY0IHRpbWU7CS8qIHdhbGwgdGltZV90IHdoZW4gZXJyb3Igd2FzIGRldGVjdGVkICovCisJX191OCAgY3B1dmVuZG9yOwkvKiBjcHUgdmVuZG9yIGFzIGVuY29kZWQgaW4gc3lzdGVtLmggKi8KKwlfX3U4ICBpbmplY3RfZmxhZ3M7CS8qIHNvZnR3YXJlIGluamVjdCBmbGFncyAqLworCV9fdTE2ICBwYWQ7CisJX191MzIgY3B1aWQ7CS8qIENQVUlEIDEgRUFYICovCisJX191OCAgY3M7CQkvKiBjb2RlIHNlZ21lbnQgKi8KKwlfX3U4ICBiYW5rOwkvKiBtYWNoaW5lIGNoZWNrIGJhbmsgKi8KKwlfX3U4ICBjcHU7CS8qIGNwdSBudW1iZXI7IG9ic29sZXRlOyB1c2UgZXh0Y3B1IG5vdyAqLworCV9fdTggIGZpbmlzaGVkOyAgIC8qIGVudHJ5IGlzIHZhbGlkICovCisJX191MzIgZXh0Y3B1OwkvKiBsaW51eCBjcHUgbnVtYmVyIHRoYXQgZGV0ZWN0ZWQgdGhlIGVycm9yICovCisJX191MzIgc29ja2V0aWQ7CS8qIENQVSBzb2NrZXQgSUQgKi8KKwlfX3UzMiBhcGljaWQ7CS8qIENQVSBpbml0aWFsIGFwaWMgSUQgKi8KKwlfX3U2NCBtY2djYXA7CS8qIE1DR0NBUCBNU1I6IG1hY2hpbmUgY2hlY2sgY2FwYWJpbGl0aWVzIG9mIENQVSAqLworCV9fdTY0IGF1eDA7CS8qIG1vZGVsIHNwZWNpZmljICovCisJX191NjQgYXV4MTsJLyogbW9kZWwgc3BlY2lmaWMgKi8KK307CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgZGF0YSByZWxhdGVkIHRvIHRoZSBNQ0UgbG9nLiAgQWxzbworICogY2FycmllcyBhIHNpZ25hdHVyZSB0byBtYWtlIGl0IGVhc2llciB0byBmaW5kIGZyb20gZXh0ZXJuYWwKKyAqIGRlYnVnZ2luZyB0b29scy4gIEVhY2ggZW50cnkgaXMgb25seSB2YWxpZCB3aGVuIGl0cyBmaW5pc2hlZCBmbGFnCisgKiBpcyBzZXQuCisgKi8KKworI2RlZmluZSBNQ0VfTE9HX0xFTiAzMgorCitzdHJ1Y3QgbWNlX2xvZyB7CisJY2hhciBzaWduYXR1cmVbMTJdOyAvKiAiTUFDSElORUNIRUNLIiAqLworCXVuc2lnbmVkIGxlbjsJICAgIC8qID0gTUNFX0xPR19MRU4gKi8KKwl1bnNpZ25lZCBuZXh0OworCXVuc2lnbmVkIGZsYWdzOworCXVuc2lnbmVkIHJlY29yZGxlbjsJLyogbGVuZ3RoIG9mIHN0cnVjdCBtY2UgKi8KKwlzdHJ1Y3QgbWNlIGVudHJ5W01DRV9MT0dfTEVOXTsKK307CisKKyNkZWZpbmUgTUNFX09WRVJGTE9XIDAJCS8qIGJpdCAwIGluIGZsYWdzIG1lYW5zIG92ZXJmbG93ICovCisKKyNkZWZpbmUgTUNFX0xPR19TSUdOQVRVUkUJIk1BQ0hJTkVDSEVDSyIKKworI2RlZmluZSBNQ0VfR0VUX1JFQ09SRF9MRU4gICBfSU9SKCdNJywgMSwgaW50KQorI2RlZmluZSBNQ0VfR0VUX0xPR19MRU4gICAgICBfSU9SKCdNJywgMiwgaW50KQorI2RlZmluZSBNQ0VfR0VUQ0xFQVJfRkxBR1MgICBfSU9SKCdNJywgMywgaW50KQorCisvKiBTb2Z0d2FyZSBkZWZpbmVkIGJhbmtzICovCisjZGVmaW5lIE1DRV9FWFRFTkRFRF9CQU5LCTEyOAorI2RlZmluZSBNQ0VfVEhFUk1BTF9CQU5LCU1DRV9FWFRFTkRFRF9CQU5LICsgMAorCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFTRSAgICAgIChNQ0VfRVhURU5ERURfQkFOSyArIDEpICAgICAgLyogTUNFX0FNRCAqLworI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBTktfMCAgICAoTUNFX1RIUkVTSE9MRF9CQVNFICsgMCAqIDkpCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFOS18xICAgIChNQ0VfVEhSRVNIT0xEX0JBU0UgKyAxICogOSkKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQU5LXzIgICAgKE1DRV9USFJFU0hPTERfQkFTRSArIDIgKiA5KQorI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBTktfMyAgICAoTUNFX1RIUkVTSE9MRF9CQVNFICsgMyAqIDkpCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFOS180ICAgIChNQ0VfVEhSRVNIT0xEX0JBU0UgKyA0ICogOSkKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQU5LXzUgICAgKE1DRV9USFJFU0hPTERfQkFTRSArIDUgKiA5KQorI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0RSQU1fRUNDICAoTUNFX1RIUkVTSE9MRF9CQU5LXzQgKyAwKQorCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9NQ0VfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbW1hbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5M2U1MWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9tbWFuLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9BU01fWDg2X01NQU5fSAorI2RlZmluZSBfQVNNX1g4Nl9NTUFOX0gKKworI2RlZmluZSBNQVBfMzJCSVQJMHg0MAkJLyogb25seSBnaXZlIG91dCAzMmJpdCBhZGRyZXNzZXMgKi8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL21tYW4uaD4KKworI2VuZGlmIC8qIF9BU01fWDg2X01NQU5fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbXNnYnVmLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9tc2didWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDkxMzRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbXNnYnVmLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL21zZ2J1Zi5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbXNyLWluZGV4LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9tc3ItaW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjk2MmQ5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbXNyLWluZGV4LmgKQEAgLTAsMCArMSw0NjUgQEAKKyNpZm5kZWYgX0FTTV9YODZfTVNSX0lOREVYX0gKKyNkZWZpbmUgX0FTTV9YODZfTVNSX0lOREVYX0gKKworLyogQ1BVIG1vZGVsIHNwZWNpZmljIHJlZ2lzdGVyIChNU1IpIG51bWJlcnMgKi8KKworLyogeDg2LTY0IHNwZWNpZmljIE1TUnMgKi8KKyNkZWZpbmUgTVNSX0VGRVIJCTB4YzAwMDAwODAgLyogZXh0ZW5kZWQgZmVhdHVyZSByZWdpc3RlciAqLworI2RlZmluZSBNU1JfU1RBUgkJMHhjMDAwMDA4MSAvKiBsZWdhY3kgbW9kZSBTWVNDQUxMIHRhcmdldCAqLworI2RlZmluZSBNU1JfTFNUQVIJCTB4YzAwMDAwODIgLyogbG9uZyBtb2RlIFNZU0NBTEwgdGFyZ2V0ICovCisjZGVmaW5lIE1TUl9DU1RBUgkJMHhjMDAwMDA4MyAvKiBjb21wYXQgbW9kZSBTWVNDQUxMIHRhcmdldCAqLworI2RlZmluZSBNU1JfU1lTQ0FMTF9NQVNLCTB4YzAwMDAwODQgLyogRUZMQUdTIG1hc2sgZm9yIHN5c2NhbGwgKi8KKyNkZWZpbmUgTVNSX0ZTX0JBU0UJCTB4YzAwMDAxMDAgLyogNjRiaXQgRlMgYmFzZSAqLworI2RlZmluZSBNU1JfR1NfQkFTRQkJMHhjMDAwMDEwMSAvKiA2NGJpdCBHUyBiYXNlICovCisjZGVmaW5lIE1TUl9LRVJORUxfR1NfQkFTRQkweGMwMDAwMTAyIC8qIFN3YXBHUyBHUyBzaGFkb3cgKi8KKyNkZWZpbmUgTVNSX1RTQ19BVVgJCTB4YzAwMDAxMDMgLyogQXV4aWxpYXJ5IFRTQyAqLworCisvKiBFRkVSIGJpdHM6ICovCisjZGVmaW5lIF9FRkVSX1NDRQkJMCAgLyogU1lTQ0FMTC9TWVNSRVQgKi8KKyNkZWZpbmUgX0VGRVJfTE1FCQk4ICAvKiBMb25nIG1vZGUgZW5hYmxlICovCisjZGVmaW5lIF9FRkVSX0xNQQkJMTAgLyogTG9uZyBtb2RlIGFjdGl2ZSAocmVhZC1vbmx5KSAqLworI2RlZmluZSBfRUZFUl9OWAkJMTEgLyogTm8gZXhlY3V0ZSBlbmFibGUgKi8KKyNkZWZpbmUgX0VGRVJfU1ZNRQkJMTIgLyogRW5hYmxlIHZpcnR1YWxpemF0aW9uICovCisjZGVmaW5lIF9FRkVSX0xNU0xFCQkxMyAvKiBMb25nIE1vZGUgU2VnbWVudCBMaW1pdCBFbmFibGUgKi8KKyNkZWZpbmUgX0VGRVJfRkZYU1IJCTE0IC8qIEVuYWJsZSBGYXN0IEZYU0FWRS9GWFJTVE9SICovCisKKyNkZWZpbmUgRUZFUl9TQ0UJCSgxPDxfRUZFUl9TQ0UpCisjZGVmaW5lIEVGRVJfTE1FCQkoMTw8X0VGRVJfTE1FKQorI2RlZmluZSBFRkVSX0xNQQkJKDE8PF9FRkVSX0xNQSkKKyNkZWZpbmUgRUZFUl9OWAkJCSgxPDxfRUZFUl9OWCkKKyNkZWZpbmUgRUZFUl9TVk1FCQkoMTw8X0VGRVJfU1ZNRSkKKyNkZWZpbmUgRUZFUl9MTVNMRQkJKDE8PF9FRkVSX0xNU0xFKQorI2RlZmluZSBFRkVSX0ZGWFNSCQkoMTw8X0VGRVJfRkZYU1IpCisKKy8qIEludGVsIE1TUnMuIFNvbWUgYWxzbyBhdmFpbGFibGUgb24gb3RoZXIgQ1BVcyAqLworI2RlZmluZSBNU1JfSUEzMl9QRVJGQ1RSMAkJMHgwMDAwMDBjMQorI2RlZmluZSBNU1JfSUEzMl9QRVJGQ1RSMQkJMHgwMDAwMDBjMgorI2RlZmluZSBNU1JfRlNCX0ZSRVEJCQkweDAwMDAwMGNkCisKKyNkZWZpbmUgTVNSX05ITV9TTkJfUEtHX0NTVF9DRkdfQ1RMCTB4MDAwMDAwZTIKKyNkZWZpbmUgTkhNX0MzX0FVVE9fREVNT1RFCQkoMVVMIDw8IDI1KQorI2RlZmluZSBOSE1fQzFfQVVUT19ERU1PVEUJCSgxVUwgPDwgMjYpCisjZGVmaW5lIEFUTV9MTkNfQzZfQVVUT19ERU1PVEUJCSgxVUwgPDwgMjUpCisKKyNkZWZpbmUgTVNSX01UUlJjYXAJCQkweDAwMDAwMGZlCisjZGVmaW5lIE1TUl9JQTMyX0JCTF9DUl9DVEwJCTB4MDAwMDAxMTkKKyNkZWZpbmUgTVNSX0lBMzJfQkJMX0NSX0NUTDMJCTB4MDAwMDAxMWUKKworI2RlZmluZSBNU1JfSUEzMl9TWVNFTlRFUl9DUwkJMHgwMDAwMDE3NAorI2RlZmluZSBNU1JfSUEzMl9TWVNFTlRFUl9FU1AJCTB4MDAwMDAxNzUKKyNkZWZpbmUgTVNSX0lBMzJfU1lTRU5URVJfRUlQCQkweDAwMDAwMTc2CisKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0NBUAkJMHgwMDAwMDE3OQorI2RlZmluZSBNU1JfSUEzMl9NQ0dfU1RBVFVTCQkweDAwMDAwMTdhCisjZGVmaW5lIE1TUl9JQTMyX01DR19DVEwJCTB4MDAwMDAxN2IKKworI2RlZmluZSBNU1JfT0ZGQ09SRV9SU1BfMAkJMHgwMDAwMDFhNgorI2RlZmluZSBNU1JfT0ZGQ09SRV9SU1BfMQkJMHgwMDAwMDFhNworCisjZGVmaW5lIE1TUl9JQTMyX1BFQlNfRU5BQkxFCQkweDAwMDAwM2YxCisjZGVmaW5lIE1TUl9JQTMyX0RTX0FSRUEJCTB4MDAwMDA2MDAKKyNkZWZpbmUgTVNSX0lBMzJfUEVSRl9DQVBBQklMSVRJRVMJMHgwMDAwMDM0NQorCisjZGVmaW5lIE1TUl9NVFJSZml4NjRLXzAwMDAwCQkweDAwMDAwMjUwCisjZGVmaW5lIE1TUl9NVFJSZml4MTZLXzgwMDAwCQkweDAwMDAwMjU4CisjZGVmaW5lIE1TUl9NVFJSZml4MTZLX0EwMDAwCQkweDAwMDAwMjU5CisjZGVmaW5lIE1TUl9NVFJSZml4NEtfQzAwMDAJCTB4MDAwMDAyNjgKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19DODAwMAkJMHgwMDAwMDI2OQorI2RlZmluZSBNU1JfTVRSUmZpeDRLX0QwMDAwCQkweDAwMDAwMjZhCisjZGVmaW5lIE1TUl9NVFJSZml4NEtfRDgwMDAJCTB4MDAwMDAyNmIKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19FMDAwMAkJMHgwMDAwMDI2YworI2RlZmluZSBNU1JfTVRSUmZpeDRLX0U4MDAwCQkweDAwMDAwMjZkCisjZGVmaW5lIE1TUl9NVFJSZml4NEtfRjAwMDAJCTB4MDAwMDAyNmUKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19GODAwMAkJMHgwMDAwMDI2ZgorI2RlZmluZSBNU1JfTVRSUmRlZlR5cGUJCQkweDAwMDAwMmZmCisKKyNkZWZpbmUgTVNSX0lBMzJfQ1JfUEFUCQkJMHgwMDAwMDI3NworCisjZGVmaW5lIE1TUl9JQTMyX0RFQlVHQ1RMTVNSCQkweDAwMDAwMWQ5CisjZGVmaW5lIE1TUl9JQTMyX0xBU1RCUkFOQ0hGUk9NSVAJMHgwMDAwMDFkYgorI2RlZmluZSBNU1JfSUEzMl9MQVNUQlJBTkNIVE9JUAkJMHgwMDAwMDFkYworI2RlZmluZSBNU1JfSUEzMl9MQVNUSU5URlJPTUlQCQkweDAwMDAwMWRkCisjZGVmaW5lIE1TUl9JQTMyX0xBU1RJTlRUT0lQCQkweDAwMDAwMWRlCisKKy8qIERFQlVHQ1RMTVNSIGJpdHMgKG90aGVycyB2YXJ5IGJ5IG1vZGVsKTogKi8KKyNkZWZpbmUgREVCVUdDVExNU1JfTEJSCQkJKDFVTCA8PCAgMCkgLyogbGFzdCBicmFuY2ggcmVjb3JkaW5nICovCisjZGVmaW5lIERFQlVHQ1RMTVNSX0JURgkJCSgxVUwgPDwgIDEpIC8qIHNpbmdsZS1zdGVwIG9uIGJyYW5jaGVzICovCisjZGVmaW5lIERFQlVHQ1RMTVNSX1RSCQkJKDFVTCA8PCAgNikKKyNkZWZpbmUgREVCVUdDVExNU1JfQlRTCQkJKDFVTCA8PCAgNykKKyNkZWZpbmUgREVCVUdDVExNU1JfQlRJTlQJCSgxVUwgPDwgIDgpCisjZGVmaW5lIERFQlVHQ1RMTVNSX0JUU19PRkZfT1MJCSgxVUwgPDwgIDkpCisjZGVmaW5lIERFQlVHQ1RMTVNSX0JUU19PRkZfVVNSCQkoMVVMIDw8IDEwKQorI2RlZmluZSBERUJVR0NUTE1TUl9GUkVFWkVfTEJSU19PTl9QTUkJKDFVTCA8PCAxMSkKKworI2RlZmluZSBNU1JfSUEzMl9NQzBfQ1RMCQkweDAwMDAwNDAwCisjZGVmaW5lIE1TUl9JQTMyX01DMF9TVEFUVVMJCTB4MDAwMDA0MDEKKyNkZWZpbmUgTVNSX0lBMzJfTUMwX0FERFIJCTB4MDAwMDA0MDIKKyNkZWZpbmUgTVNSX0lBMzJfTUMwX01JU0MJCTB4MDAwMDA0MDMKKworI2RlZmluZSBNU1JfQU1ENjRfTUMwX01BU0sJCTB4YzAwMTAwNDQKKworI2RlZmluZSBNU1JfSUEzMl9NQ3hfQ1RMKHgpCQkoTVNSX0lBMzJfTUMwX0NUTCArIDQqKHgpKQorI2RlZmluZSBNU1JfSUEzMl9NQ3hfU1RBVFVTKHgpCQkoTVNSX0lBMzJfTUMwX1NUQVRVUyArIDQqKHgpKQorI2RlZmluZSBNU1JfSUEzMl9NQ3hfQUREUih4KQkJKE1TUl9JQTMyX01DMF9BRERSICsgNCooeCkpCisjZGVmaW5lIE1TUl9JQTMyX01DeF9NSVNDKHgpCQkoTVNSX0lBMzJfTUMwX01JU0MgKyA0Kih4KSkKKworI2RlZmluZSBNU1JfQU1ENjRfTUN4X01BU0soeCkJCShNU1JfQU1ENjRfTUMwX01BU0sgKyAoeCkpCisKKy8qIFRoZXNlIGFyZSBjb25zZWN1dGl2ZSBhbmQgbm90IGluIHRoZSBub3JtYWwgNGVyIE1DRSBiYW5rIGJsb2NrICovCisjZGVmaW5lIE1TUl9JQTMyX01DMF9DVEwyCQkweDAwMDAwMjgwCisjZGVmaW5lIE1TUl9JQTMyX01DeF9DVEwyKHgpCQkoTVNSX0lBMzJfTUMwX0NUTDIgKyAoeCkpCisKKyNkZWZpbmUgTVNSX1A2X1BFUkZDVFIwCQkJMHgwMDAwMDBjMQorI2RlZmluZSBNU1JfUDZfUEVSRkNUUjEJCQkweDAwMDAwMGMyCisjZGVmaW5lIE1TUl9QNl9FVk5UU0VMMAkJCTB4MDAwMDAxODYKKyNkZWZpbmUgTVNSX1A2X0VWTlRTRUwxCQkJMHgwMDAwMDE4NworCisvKiBBTUQ2NCBNU1JzLiBOb3QgY29tcGxldGUuIFNlZSB0aGUgYXJjaGl0ZWN0dXJlIG1hbnVhbCBmb3IgYSBtb3JlCisgICBjb21wbGV0ZSBsaXN0LiAqLworCisjZGVmaW5lIE1TUl9BTUQ2NF9QQVRDSF9MRVZFTAkJMHgwMDAwMDA4YgorI2RlZmluZSBNU1JfQU1ENjRfVFNDX1JBVElPCQkweGMwMDAwMTA0CisjZGVmaW5lIE1TUl9BTUQ2NF9OQl9DRkcJCTB4YzAwMTAwMWYKKyNkZWZpbmUgTVNSX0FNRDY0X1BBVENIX0xPQURFUgkJMHhjMDAxMDAyMAorI2RlZmluZSBNU1JfQU1ENjRfT1NWV19JRF9MRU5HVEgJMHhjMDAxMDE0MAorI2RlZmluZSBNU1JfQU1ENjRfT1NWV19TVEFUVVMJCTB4YzAwMTAxNDEKKyNkZWZpbmUgTVNSX0FNRDY0X0RDX0NGRwkJMHhjMDAxMTAyMgorI2RlZmluZSBNU1JfQU1ENjRfSUJTRkVUQ0hDVEwJCTB4YzAwMTEwMzAKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU0ZFVENITElOQUQJCTB4YzAwMTEwMzEKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU0ZFVENIUEhZU0FECTB4YzAwMTEwMzIKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU09QQ1RMCQkweGMwMDExMDMzCisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNPUFJJUAkJMHhjMDAxMTAzNAorI2RlZmluZSBNU1JfQU1ENjRfSUJTT1BEQVRBCQkweGMwMDExMDM1CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNPUERBVEEyCQkweGMwMDExMDM2CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNPUERBVEEzCQkweGMwMDExMDM3CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNEQ0xJTkFECQkweGMwMDExMDM4CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNEQ1BIWVNBRAkJMHhjMDAxMTAzOQorI2RlZmluZSBNU1JfQU1ENjRfSUJTQ1RMCQkweGMwMDExMDNhCisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNCUlRBUkdFVAkJMHhjMDAxMTAzYgorCisvKiBGYW0gMTVoIE1TUnMgKi8KKyNkZWZpbmUgTVNSX0YxNUhfUEVSRl9DVEwJCTB4YzAwMTAyMDAKKyNkZWZpbmUgTVNSX0YxNUhfUEVSRl9DVFIJCTB4YzAwMTAyMDEKKworLyogRmFtIDEwaCBNU1JzICovCisjZGVmaW5lIE1TUl9GQU0xMEhfTU1JT19DT05GX0JBU0UJMHhjMDAxMDA1OAorI2RlZmluZSBGQU0xMEhfTU1JT19DT05GX0VOQUJMRQkJKDE8PDApCisjZGVmaW5lIEZBTTEwSF9NTUlPX0NPTkZfQlVTUkFOR0VfTUFTSwkweGYKKyNkZWZpbmUgRkFNMTBIX01NSU9fQ09ORl9CVVNSQU5HRV9TSElGVCAyCisjZGVmaW5lIEZBTTEwSF9NTUlPX0NPTkZfQkFTRV9NQVNLCTB4ZmZmZmZmZlVMTAorI2RlZmluZSBGQU0xMEhfTU1JT19DT05GX0JBU0VfU0hJRlQJMjAKKyNkZWZpbmUgTVNSX0ZBTTEwSF9OT0RFX0lECQkweGMwMDExMDBjCisKKy8qIEs4IE1TUnMgKi8KKyNkZWZpbmUgTVNSX0s4X1RPUF9NRU0xCQkJMHhjMDAxMDAxYQorI2RlZmluZSBNU1JfSzhfVE9QX01FTTIJCQkweGMwMDEwMDFkCisjZGVmaW5lIE1TUl9LOF9TWVNDRkcJCQkweGMwMDEwMDEwCisjZGVmaW5lIE1TUl9LOF9JTlRfUEVORElOR19NU0cJCTB4YzAwMTAwNTUKKy8qIEMxRSBhY3RpdmUgYml0cyBpbiBpbnQgcGVuZGluZyBtZXNzYWdlICovCisjZGVmaW5lIEs4X0lOVFBfQzFFX0FDVElWRV9NQVNLCQkweDE4MDAwMDAwCisjZGVmaW5lIE1TUl9LOF9UU0VHX0FERFIJCTB4YzAwMTAxMTIKKyNkZWZpbmUgSzhfTVRSUkZJWFJBTkdFX0RSQU1fRU5BQkxFCTB4MDAwNDAwMDAgLyogTXRyckZpeERyYW1FbiBiaXQgICAgKi8KKyNkZWZpbmUgSzhfTVRSUkZJWFJBTkdFX0RSQU1fTU9ESUZZCTB4MDAwODAwMDAgLyogTXRyckZpeERyYW1Nb2RFbiBiaXQgKi8KKyNkZWZpbmUgSzhfTVRSUl9SRE1FTV9XUk1FTV9NQVNLCTB4MTgxODE4MTggLyogTWFzazogUmRNZW18V3JNZW0gICAgKi8KKworLyogSzcgTVNScyAqLworI2RlZmluZSBNU1JfSzdfRVZOVFNFTDAJCQkweGMwMDEwMDAwCisjZGVmaW5lIE1TUl9LN19QRVJGQ1RSMAkJCTB4YzAwMTAwMDQKKyNkZWZpbmUgTVNSX0s3X0VWTlRTRUwxCQkJMHhjMDAxMDAwMQorI2RlZmluZSBNU1JfSzdfUEVSRkNUUjEJCQkweGMwMDEwMDA1CisjZGVmaW5lIE1TUl9LN19FVk5UU0VMMgkJCTB4YzAwMTAwMDIKKyNkZWZpbmUgTVNSX0s3X1BFUkZDVFIyCQkJMHhjMDAxMDAwNgorI2RlZmluZSBNU1JfSzdfRVZOVFNFTDMJCQkweGMwMDEwMDAzCisjZGVmaW5lIE1TUl9LN19QRVJGQ1RSMwkJCTB4YzAwMTAwMDcKKyNkZWZpbmUgTVNSX0s3X0NMS19DVEwJCQkweGMwMDEwMDFiCisjZGVmaW5lIE1TUl9LN19IV0NSCQkJMHhjMDAxMDAxNQorI2RlZmluZSBNU1JfSzdfRklEX1ZJRF9DVEwJCTB4YzAwMTAwNDEKKyNkZWZpbmUgTVNSX0s3X0ZJRF9WSURfU1RBVFVTCQkweGMwMDEwMDQyCisKKy8qIEs2IE1TUnMgKi8KKyNkZWZpbmUgTVNSX0s2X1dIQ1IJCQkweGMwMDAwMDgyCisjZGVmaW5lIE1TUl9LNl9VV0NDUgkJCTB4YzAwMDAwODUKKyNkZWZpbmUgTVNSX0s2X0VQTVIJCQkweGMwMDAwMDg2CisjZGVmaW5lIE1TUl9LNl9QU09SCQkJMHhjMDAwMDA4NworI2RlZmluZSBNU1JfSzZfUEZJUgkJCTB4YzAwMDAwODgKKworLyogQ2VudGF1ci1IYXVscy9JRFQgZGVmaW5lZCBNU1JzLiAqLworI2RlZmluZSBNU1JfSURUX0ZDUjEJCQkweDAwMDAwMTA3CisjZGVmaW5lIE1TUl9JRFRfRkNSMgkJCTB4MDAwMDAxMDgKKyNkZWZpbmUgTVNSX0lEVF9GQ1IzCQkJMHgwMDAwMDEwOQorI2RlZmluZSBNU1JfSURUX0ZDUjQJCQkweDAwMDAwMTBhCisKKyNkZWZpbmUgTVNSX0lEVF9NQ1IwCQkJMHgwMDAwMDExMAorI2RlZmluZSBNU1JfSURUX01DUjEJCQkweDAwMDAwMTExCisjZGVmaW5lIE1TUl9JRFRfTUNSMgkJCTB4MDAwMDAxMTIKKyNkZWZpbmUgTVNSX0lEVF9NQ1IzCQkJMHgwMDAwMDExMworI2RlZmluZSBNU1JfSURUX01DUjQJCQkweDAwMDAwMTE0CisjZGVmaW5lIE1TUl9JRFRfTUNSNQkJCTB4MDAwMDAxMTUKKyNkZWZpbmUgTVNSX0lEVF9NQ1I2CQkJMHgwMDAwMDExNgorI2RlZmluZSBNU1JfSURUX01DUjcJCQkweDAwMDAwMTE3CisjZGVmaW5lIE1TUl9JRFRfTUNSX0NUUkwJCTB4MDAwMDAxMjAKKworLyogVklBIEN5cml4IGRlZmluZWQgTVNScyovCisjZGVmaW5lIE1TUl9WSUFfRkNSCQkJMHgwMDAwMTEwNworI2RlZmluZSBNU1JfVklBX0xPTkdIQVVMCQkweDAwMDAxMTBhCisjZGVmaW5lIE1TUl9WSUFfUk5HCQkJMHgwMDAwMTEwYgorI2RlZmluZSBNU1JfVklBX0JDUjIJCQkweDAwMDAxMTQ3CisKKy8qIFRyYW5zbWV0YSBkZWZpbmVkIE1TUnMgKi8KKyNkZWZpbmUgTVNSX1RNVEFfTE9OR1JVTl9DVFJMCQkweDgwODY4MDEwCisjZGVmaW5lIE1TUl9UTVRBX0xPTkdSVU5fRkxBR1MJCTB4ODA4NjgwMTEKKyNkZWZpbmUgTVNSX1RNVEFfTFJUSV9SRUFET1VUCQkweDgwODY4MDE4CisjZGVmaW5lIE1TUl9UTVRBX0xSVElfVk9MVF9NSFoJCTB4ODA4NjgwMWEKKworLyogSW50ZWwgZGVmaW5lZCBNU1JzLiAqLworI2RlZmluZSBNU1JfSUEzMl9QNV9NQ19BRERSCQkweDAwMDAwMDAwCisjZGVmaW5lIE1TUl9JQTMyX1A1X01DX1RZUEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTVNSX0lBMzJfVFNDCQkJMHgwMDAwMDAxMAorI2RlZmluZSBNU1JfSUEzMl9QTEFURk9STV9JRAkJMHgwMDAwMDAxNworI2RlZmluZSBNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTgkJMHgwMDAwMDAyYQorI2RlZmluZSBNU1JfRUJDX0ZSRVFVRU5DWV9JRAkJMHgwMDAwMDAyYworI2RlZmluZSBNU1JfSUEzMl9GRUFUVVJFX0NPTlRST0wgICAgICAgIDB4MDAwMDAwM2EKKworI2RlZmluZSBGRUFUVVJFX0NPTlRST0xfTE9DS0VECQkJCSgxPDwwKQorI2RlZmluZSBGRUFUVVJFX0NPTlRST0xfVk1YT05fRU5BQkxFRF9JTlNJREVfU01YCSgxPDwxKQorI2RlZmluZSBGRUFUVVJFX0NPTlRST0xfVk1YT05fRU5BQkxFRF9PVVRTSURFX1NNWAkoMTw8MikKKworI2RlZmluZSBNU1JfSUEzMl9BUElDQkFTRQkJMHgwMDAwMDAxYgorI2RlZmluZSBNU1JfSUEzMl9BUElDQkFTRV9CU1AJCSgxPDw4KQorI2RlZmluZSBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUJKDE8PDExKQorI2RlZmluZSBNU1JfSUEzMl9BUElDQkFTRV9CQVNFCQkoMHhmZmZmZjw8MTIpCisKKyNkZWZpbmUgTVNSX0lBMzJfVFNDREVBRExJTkUJCTB4MDAwMDA2ZTAKKworI2RlZmluZSBNU1JfSUEzMl9VQ09ERV9XUklURQkJMHgwMDAwMDA3OQorI2RlZmluZSBNU1JfSUEzMl9VQ09ERV9SRVYJCTB4MDAwMDAwOGIKKworI2RlZmluZSBNU1JfSUEzMl9QRVJGX1NUQVRVUwkJMHgwMDAwMDE5OAorI2RlZmluZSBNU1JfSUEzMl9QRVJGX0NUTAkJMHgwMDAwMDE5OQorCisjZGVmaW5lIE1TUl9JQTMyX01QRVJGCQkJMHgwMDAwMDBlNworI2RlZmluZSBNU1JfSUEzMl9BUEVSRgkJCTB4MDAwMDAwZTgKKworI2RlZmluZSBNU1JfSUEzMl9USEVSTV9DT05UUk9MCQkweDAwMDAwMTlhCisjZGVmaW5lIE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVAkweDAwMDAwMTliCisKKyNkZWZpbmUgVEhFUk1fSU5UX0hJR0hfRU5BQkxFCQkoMSA8PCAwKQorI2RlZmluZSBUSEVSTV9JTlRfTE9XX0VOQUJMRQkJKDEgPDwgMSkKKyNkZWZpbmUgVEhFUk1fSU5UX1BMTl9FTkFCTEUJCSgxIDw8IDI0KQorCisjZGVmaW5lIE1TUl9JQTMyX1RIRVJNX1NUQVRVUwkJMHgwMDAwMDE5YworCisjZGVmaW5lIFRIRVJNX1NUQVRVU19QUk9DSE9UCQkoMSA8PCAwKQorI2RlZmluZSBUSEVSTV9TVEFUVVNfUE9XRVJfTElNSVQJKDEgPDwgMTApCisKKyNkZWZpbmUgTVNSX1RIRVJNMl9DVEwJCQkweDAwMDAwMTlkCisKKyNkZWZpbmUgTVNSX1RIRVJNMl9DVExfVE1fU0VMRUNUCSgxVUxMIDw8IDE2KQorCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFCQkweDAwMDAwMWEwCisKKyNkZWZpbmUgTVNSX0lBMzJfVEVNUEVSQVRVUkVfVEFSR0VUCTB4MDAwMDAxYTIKKworI2RlZmluZSBNU1JfSUEzMl9FTkVSR1lfUEVSRl9CSUFTCTB4MDAwMDAxYjAKKyNkZWZpbmUgRU5FUkdZX1BFUkZfQklBU19QRVJGT1JNQU5DRQkwCisjZGVmaW5lIEVORVJHWV9QRVJGX0JJQVNfTk9STUFMCQk2CisjZGVmaW5lIEVORVJHWV9QRVJGX0JJQVNfUE9XRVJTQVZFCTE1CisKKyNkZWZpbmUgTVNSX0lBMzJfUEFDS0FHRV9USEVSTV9TVEFUVVMJCTB4MDAwMDAxYjEKKworI2RlZmluZSBQQUNLQUdFX1RIRVJNX1NUQVRVU19QUk9DSE9UCQkoMSA8PCAwKQorI2RlZmluZSBQQUNLQUdFX1RIRVJNX1NUQVRVU19QT1dFUl9MSU1JVAkoMSA8PCAxMCkKKworI2RlZmluZSBNU1JfSUEzMl9QQUNLQUdFX1RIRVJNX0lOVEVSUlVQVAkweDAwMDAwMWIyCisKKyNkZWZpbmUgUEFDS0FHRV9USEVSTV9JTlRfSElHSF9FTkFCTEUJCSgxIDw8IDApCisjZGVmaW5lIFBBQ0tBR0VfVEhFUk1fSU5UX0xPV19FTkFCTEUJCSgxIDw8IDEpCisjZGVmaW5lIFBBQ0tBR0VfVEhFUk1fSU5UX1BMTl9FTkFCTEUJCSgxIDw8IDI0KQorCisvKiBUaGVybWFsIFRocmVzaG9sZHMgU3VwcG9ydCAqLworI2RlZmluZSBUSEVSTV9JTlRfVEhSRVNIT0xEMF9FTkFCTEUgICAgKDEgPDwgMTUpCisjZGVmaW5lIFRIRVJNX1NISUZUX1RIUkVTSE9MRDAgICAgICAgIDgKKyNkZWZpbmUgVEhFUk1fTUFTS19USFJFU0hPTEQwICAgICAgICAgICgweDdmIDw8IFRIRVJNX1NISUZUX1RIUkVTSE9MRDApCisjZGVmaW5lIFRIRVJNX0lOVF9USFJFU0hPTEQxX0VOQUJMRSAgICAoMSA8PCAyMykKKyNkZWZpbmUgVEhFUk1fU0hJRlRfVEhSRVNIT0xEMSAgICAgICAgMTYKKyNkZWZpbmUgVEhFUk1fTUFTS19USFJFU0hPTEQxICAgICAgICAgICgweDdmIDw8IFRIRVJNX1NISUZUX1RIUkVTSE9MRDEpCisjZGVmaW5lIFRIRVJNX1NUQVRVU19USFJFU0hPTEQwICAgICAgICAoMSA8PCA2KQorI2RlZmluZSBUSEVSTV9MT0dfVEhSRVNIT0xEMCAgICAgICAgICAgKDEgPDwgNykKKyNkZWZpbmUgVEhFUk1fU1RBVFVTX1RIUkVTSE9MRDEgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIFRIRVJNX0xPR19USFJFU0hPTEQxICAgICAgICAgICAoMSA8PCA5KQorCisvKiBNSVNDX0VOQUJMRSBiaXRzOiBhcmNoaXRlY3R1cmFsICovCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZBU1RfU1RSSU5HCSgxVUxMIDw8IDApCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RDQwkJKDFVTEwgPDwgMSkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRU1PTgkJKDFVTEwgPDwgNykKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfQlRTX1VOQVZBSUwJKDFVTEwgPDwgMTEpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1BFQlNfVU5BVkFJTAkoMVVMTCA8PCAxMikKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRU5IQU5DRURfU1BFRURTVEVQCSgxVUxMIDw8IDE2KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9NV0FJVAkJKDFVTEwgPDwgMTgpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0xJTUlUX0NQVUlECSgxVUxMIDw8IDIyKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YVFBSX0RJU0FCTEUJKDFVTEwgPDwgMjMpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1hEX0RJU0FCTEUJCSgxVUxMIDw8IDM0KQorCisvKiBNSVNDX0VOQUJMRSBiaXRzOiBtb2RlbC1zcGVjaWZpYywgbWVhbmluZyBtYXkgdmFyeSBmcm9tIGNvcmUgdG8gY29yZSAqLworI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YODdfQ09NUEFUCQkoMVVMTCA8PCAyKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9UTTEJCSgxVUxMIDw8IDMpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1NQTElUX0xPQ0tfRElTQUJMRQkoMVVMTCA8PCA0KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MM0NBQ0hFX0RJU0FCTEUJKDFVTEwgPDwgNikKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1VQUFJFU1NfTE9DSwkoMVVMTCA8PCA4KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9QUkVGRVRDSF9ESVNBQkxFCSgxVUxMIDw8IDkpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZFUlIJCSgxVUxMIDw8IDEwKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GRVJSX01VTFRJUExFWAkoMVVMTCA8PCAxMCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVE0yCQkoMVVMTCA8PCAxMykKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfQURKX1BSRUZfRElTQUJMRQkoMVVMTCA8PCAxOSkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1BFRURTVEVQX0xPQ0sJKDFVTEwgPDwgMjApCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0wxRF9DT05URVhUCSgxVUxMIDw8IDI0KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9EQ1VfUFJFRl9ESVNBQkxFCSgxVUxMIDw8IDM3KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9UVVJCT19ESVNBQkxFCSgxVUxMIDw8IDM4KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9JUF9QUkVGX0RJU0FCTEUJKDFVTEwgPDwgMzkpCisKKy8qIFA0L1hlb24rIHNwZWNpZmljICovCisjZGVmaW5lIE1TUl9JQTMyX01DR19FQVgJCTB4MDAwMDAxODAKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VCWAkJMHgwMDAwMDE4MQorI2RlZmluZSBNU1JfSUEzMl9NQ0dfRUNYCQkweDAwMDAwMTgyCisjZGVmaW5lIE1TUl9JQTMyX01DR19FRFgJCTB4MDAwMDAxODMKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VTSQkJMHgwMDAwMDE4NAorI2RlZmluZSBNU1JfSUEzMl9NQ0dfRURJCQkweDAwMDAwMTg1CisjZGVmaW5lIE1TUl9JQTMyX01DR19FQlAJCTB4MDAwMDAxODYKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VTUAkJMHgwMDAwMDE4NworI2RlZmluZSBNU1JfSUEzMl9NQ0dfRUZMQUdTCQkweDAwMDAwMTg4CisjZGVmaW5lIE1TUl9JQTMyX01DR19FSVAJCTB4MDAwMDAxODkKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX1JFU0VSVkVECQkweDAwMDAwMThhCisKKy8qIFBlbnRpdW0gSVYgcGVyZm9ybWFuY2UgY291bnRlciBNU1JzICovCisjZGVmaW5lIE1TUl9QNF9CUFVfUEVSRkNUUjAJCTB4MDAwMDAzMDAKKyNkZWZpbmUgTVNSX1A0X0JQVV9QRVJGQ1RSMQkJMHgwMDAwMDMwMQorI2RlZmluZSBNU1JfUDRfQlBVX1BFUkZDVFIyCQkweDAwMDAwMzAyCisjZGVmaW5lIE1TUl9QNF9CUFVfUEVSRkNUUjMJCTB4MDAwMDAzMDMKKyNkZWZpbmUgTVNSX1A0X01TX1BFUkZDVFIwCQkweDAwMDAwMzA0CisjZGVmaW5lIE1TUl9QNF9NU19QRVJGQ1RSMQkJMHgwMDAwMDMwNQorI2RlZmluZSBNU1JfUDRfTVNfUEVSRkNUUjIJCTB4MDAwMDAzMDYKKyNkZWZpbmUgTVNSX1A0X01TX1BFUkZDVFIzCQkweDAwMDAwMzA3CisjZGVmaW5lIE1TUl9QNF9GTEFNRV9QRVJGQ1RSMAkJMHgwMDAwMDMwOAorI2RlZmluZSBNU1JfUDRfRkxBTUVfUEVSRkNUUjEJCTB4MDAwMDAzMDkKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX1BFUkZDVFIyCQkweDAwMDAwMzBhCisjZGVmaW5lIE1TUl9QNF9GTEFNRV9QRVJGQ1RSMwkJMHgwMDAwMDMwYgorI2RlZmluZSBNU1JfUDRfSVFfUEVSRkNUUjAJCTB4MDAwMDAzMGMKKyNkZWZpbmUgTVNSX1A0X0lRX1BFUkZDVFIxCQkweDAwMDAwMzBkCisjZGVmaW5lIE1TUl9QNF9JUV9QRVJGQ1RSMgkJMHgwMDAwMDMwZQorI2RlZmluZSBNU1JfUDRfSVFfUEVSRkNUUjMJCTB4MDAwMDAzMGYKKyNkZWZpbmUgTVNSX1A0X0lRX1BFUkZDVFI0CQkweDAwMDAwMzEwCisjZGVmaW5lIE1TUl9QNF9JUV9QRVJGQ1RSNQkJMHgwMDAwMDMxMQorI2RlZmluZSBNU1JfUDRfQlBVX0NDQ1IwCQkweDAwMDAwMzYwCisjZGVmaW5lIE1TUl9QNF9CUFVfQ0NDUjEJCTB4MDAwMDAzNjEKKyNkZWZpbmUgTVNSX1A0X0JQVV9DQ0NSMgkJMHgwMDAwMDM2MgorI2RlZmluZSBNU1JfUDRfQlBVX0NDQ1IzCQkweDAwMDAwMzYzCisjZGVmaW5lIE1TUl9QNF9NU19DQ0NSMAkJCTB4MDAwMDAzNjQKKyNkZWZpbmUgTVNSX1A0X01TX0NDQ1IxCQkJMHgwMDAwMDM2NQorI2RlZmluZSBNU1JfUDRfTVNfQ0NDUjIJCQkweDAwMDAwMzY2CisjZGVmaW5lIE1TUl9QNF9NU19DQ0NSMwkJCTB4MDAwMDAzNjcKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX0NDQ1IwCQkweDAwMDAwMzY4CisjZGVmaW5lIE1TUl9QNF9GTEFNRV9DQ0NSMQkJMHgwMDAwMDM2OQorI2RlZmluZSBNU1JfUDRfRkxBTUVfQ0NDUjIJCTB4MDAwMDAzNmEKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX0NDQ1IzCQkweDAwMDAwMzZiCisjZGVmaW5lIE1TUl9QNF9JUV9DQ0NSMAkJCTB4MDAwMDAzNmMKKyNkZWZpbmUgTVNSX1A0X0lRX0NDQ1IxCQkJMHgwMDAwMDM2ZAorI2RlZmluZSBNU1JfUDRfSVFfQ0NDUjIJCQkweDAwMDAwMzZlCisjZGVmaW5lIE1TUl9QNF9JUV9DQ0NSMwkJCTB4MDAwMDAzNmYKKyNkZWZpbmUgTVNSX1A0X0lRX0NDQ1I0CQkJMHgwMDAwMDM3MAorI2RlZmluZSBNU1JfUDRfSVFfQ0NDUjUJCQkweDAwMDAwMzcxCisjZGVmaW5lIE1TUl9QNF9BTEZfRVNDUjAJCTB4MDAwMDAzY2EKKyNkZWZpbmUgTVNSX1A0X0FMRl9FU0NSMQkJMHgwMDAwMDNjYgorI2RlZmluZSBNU1JfUDRfQlBVX0VTQ1IwCQkweDAwMDAwM2IyCisjZGVmaW5lIE1TUl9QNF9CUFVfRVNDUjEJCTB4MDAwMDAzYjMKKyNkZWZpbmUgTVNSX1A0X0JTVV9FU0NSMAkJMHgwMDAwMDNhMAorI2RlZmluZSBNU1JfUDRfQlNVX0VTQ1IxCQkweDAwMDAwM2ExCisjZGVmaW5lIE1TUl9QNF9DUlVfRVNDUjAJCTB4MDAwMDAzYjgKKyNkZWZpbmUgTVNSX1A0X0NSVV9FU0NSMQkJMHgwMDAwMDNiOQorI2RlZmluZSBNU1JfUDRfQ1JVX0VTQ1IyCQkweDAwMDAwM2NjCisjZGVmaW5lIE1TUl9QNF9DUlVfRVNDUjMJCTB4MDAwMDAzY2QKKyNkZWZpbmUgTVNSX1A0X0NSVV9FU0NSNAkJMHgwMDAwMDNlMAorI2RlZmluZSBNU1JfUDRfQ1JVX0VTQ1I1CQkweDAwMDAwM2UxCisjZGVmaW5lIE1TUl9QNF9EQUNfRVNDUjAJCTB4MDAwMDAzYTgKKyNkZWZpbmUgTVNSX1A0X0RBQ19FU0NSMQkJMHgwMDAwMDNhOQorI2RlZmluZSBNU1JfUDRfRklSTV9FU0NSMAkJMHgwMDAwMDNhNAorI2RlZmluZSBNU1JfUDRfRklSTV9FU0NSMQkJMHgwMDAwMDNhNQorI2RlZmluZSBNU1JfUDRfRkxBTUVfRVNDUjAJCTB4MDAwMDAzYTYKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX0VTQ1IxCQkweDAwMDAwM2E3CisjZGVmaW5lIE1TUl9QNF9GU0JfRVNDUjAJCTB4MDAwMDAzYTIKKyNkZWZpbmUgTVNSX1A0X0ZTQl9FU0NSMQkJMHgwMDAwMDNhMworI2RlZmluZSBNU1JfUDRfSVFfRVNDUjAJCQkweDAwMDAwM2JhCisjZGVmaW5lIE1TUl9QNF9JUV9FU0NSMQkJCTB4MDAwMDAzYmIKKyNkZWZpbmUgTVNSX1A0X0lTX0VTQ1IwCQkJMHgwMDAwMDNiNAorI2RlZmluZSBNU1JfUDRfSVNfRVNDUjEJCQkweDAwMDAwM2I1CisjZGVmaW5lIE1TUl9QNF9JVExCX0VTQ1IwCQkweDAwMDAwM2I2CisjZGVmaW5lIE1TUl9QNF9JVExCX0VTQ1IxCQkweDAwMDAwM2I3CisjZGVmaW5lIE1TUl9QNF9JWF9FU0NSMAkJCTB4MDAwMDAzYzgKKyNkZWZpbmUgTVNSX1A0X0lYX0VTQ1IxCQkJMHgwMDAwMDNjOQorI2RlZmluZSBNU1JfUDRfTU9CX0VTQ1IwCQkweDAwMDAwM2FhCisjZGVmaW5lIE1TUl9QNF9NT0JfRVNDUjEJCTB4MDAwMDAzYWIKKyNkZWZpbmUgTVNSX1A0X01TX0VTQ1IwCQkJMHgwMDAwMDNjMAorI2RlZmluZSBNU1JfUDRfTVNfRVNDUjEJCQkweDAwMDAwM2MxCisjZGVmaW5lIE1TUl9QNF9QTUhfRVNDUjAJCTB4MDAwMDAzYWMKKyNkZWZpbmUgTVNSX1A0X1BNSF9FU0NSMQkJMHgwMDAwMDNhZAorI2RlZmluZSBNU1JfUDRfUkFUX0VTQ1IwCQkweDAwMDAwM2JjCisjZGVmaW5lIE1TUl9QNF9SQVRfRVNDUjEJCTB4MDAwMDAzYmQKKyNkZWZpbmUgTVNSX1A0X1NBQVRfRVNDUjAJCTB4MDAwMDAzYWUKKyNkZWZpbmUgTVNSX1A0X1NBQVRfRVNDUjEJCTB4MDAwMDAzYWYKKyNkZWZpbmUgTVNSX1A0X1NTVV9FU0NSMAkJMHgwMDAwMDNiZQorI2RlZmluZSBNU1JfUDRfU1NVX0VTQ1IxCQkweDAwMDAwM2JmIC8qIGd1ZXNzOiBub3QgaW4gbWFudWFsICovCisKKyNkZWZpbmUgTVNSX1A0X1RCUFVfRVNDUjAJCTB4MDAwMDAzYzIKKyNkZWZpbmUgTVNSX1A0X1RCUFVfRVNDUjEJCTB4MDAwMDAzYzMKKyNkZWZpbmUgTVNSX1A0X1RDX0VTQ1IwCQkJMHgwMDAwMDNjNAorI2RlZmluZSBNU1JfUDRfVENfRVNDUjEJCQkweDAwMDAwM2M1CisjZGVmaW5lIE1TUl9QNF9VMkxfRVNDUjAJCTB4MDAwMDAzYjAKKyNkZWZpbmUgTVNSX1A0X1UyTF9FU0NSMQkJMHgwMDAwMDNiMQorCisjZGVmaW5lIE1TUl9QNF9QRUJTX01BVFJJWF9WRVJUCQkweDAwMDAwM2YyCisKKy8qIEludGVsIENvcmUtYmFzZWQgQ1BVIHBlcmZvcm1hbmNlIGNvdW50ZXJzICovCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMAkweDAwMDAwMzA5CisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMQkweDAwMDAwMzBhCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMgkweDAwMDAwMzBiCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSX0NUUkwJMHgwMDAwMDM4ZAorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0dMT0JBTF9TVEFUVVMJMHgwMDAwMDM4ZQorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0dMT0JBTF9DVFJMCTB4MDAwMDAzOGYKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9HTE9CQUxfT1ZGX0NUUkwJMHgwMDAwMDM5MAorCisvKiBHZW9kZSBkZWZpbmVkIE1TUnMgKi8KKyNkZWZpbmUgTVNSX0dFT0RFX0JVU0NPTlRfQ09ORjAJCTB4MDAwMDE5MDAKKworLyogSW50ZWwgVlQgTVNScyAqLworI2RlZmluZSBNU1JfSUEzMl9WTVhfQkFTSUMgICAgICAgICAgICAgIDB4MDAwMDA0ODAKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX1BJTkJBU0VEX0NUTFMgICAgICAweDAwMDAwNDgxCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9QUk9DQkFTRURfQ1RMUyAgICAgMHgwMDAwMDQ4MgorI2RlZmluZSBNU1JfSUEzMl9WTVhfRVhJVF9DVExTICAgICAgICAgIDB4MDAwMDA0ODMKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0VOVFJZX0NUTFMgICAgICAgICAweDAwMDAwNDg0CisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9NSVNDICAgICAgICAgICAgICAgMHgwMDAwMDQ4NQorI2RlZmluZSBNU1JfSUEzMl9WTVhfQ1IwX0ZJWEVEMCAgICAgICAgIDB4MDAwMDA0ODYKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0NSMF9GSVhFRDEgICAgICAgICAweDAwMDAwNDg3CisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9DUjRfRklYRUQwICAgICAgICAgMHgwMDAwMDQ4OAorI2RlZmluZSBNU1JfSUEzMl9WTVhfQ1I0X0ZJWEVEMSAgICAgICAgIDB4MDAwMDA0ODkKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX1ZNQ1NfRU5VTSAgICAgICAgICAweDAwMDAwNDhhCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9QUk9DQkFTRURfQ1RMUzIgICAgMHgwMDAwMDQ4YgorI2RlZmluZSBNU1JfSUEzMl9WTVhfRVBUX1ZQSURfQ0FQICAgICAgIDB4MDAwMDA0OGMKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX1RSVUVfUElOQkFTRURfQ1RMUyAgMHgwMDAwMDQ4ZAorI2RlZmluZSBNU1JfSUEzMl9WTVhfVFJVRV9QUk9DQkFTRURfQ1RMUyAweDAwMDAwNDhlCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9UUlVFX0VYSVRfQ1RMUyAgICAgIDB4MDAwMDA0OGYKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX1RSVUVfRU5UUllfQ1RMUyAgICAgMHgwMDAwMDQ5MAorCisvKiBWTVhfQkFTSUMgYml0cyBhbmQgYml0bWFza3MgKi8KKyNkZWZpbmUgVk1YX0JBU0lDX1ZNQ1NfU0laRV9TSElGVAkzMgorI2RlZmluZSBWTVhfQkFTSUNfNjQJCTB4MDAwMTAwMDAwMDAwMDAwMExMVQorI2RlZmluZSBWTVhfQkFTSUNfTUVNX1RZUEVfU0hJRlQJNTAKKyNkZWZpbmUgVk1YX0JBU0lDX01FTV9UWVBFX01BU0sJMHgwMDNjMDAwMDAwMDAwMDAwTExVCisjZGVmaW5lIFZNWF9CQVNJQ19NRU1fVFlQRV9XQgk2TExVCisjZGVmaW5lIFZNWF9CQVNJQ19JTk9VVAkJMHgwMDQwMDAwMDAwMDAwMDAwTExVCisKKy8qIEFNRC1WIE1TUnMgKi8KKworI2RlZmluZSBNU1JfVk1fQ1IgICAgICAgICAgICAgICAgICAgICAgIDB4YzAwMTAxMTQKKyNkZWZpbmUgTVNSX1ZNX0lHTk5FICAgICAgICAgICAgICAgICAgICAweGMwMDEwMTE1CisjZGVmaW5lIE1TUl9WTV9IU0FWRV9QQSAgICAgICAgICAgICAgICAgMHhjMDAxMDExNworCisjZW5kaWYgLyogX0FTTV9YODZfTVNSX0lOREVYX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL21zci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbXNyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhZWFmNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL21zci5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX0FTTV9YODZfTVNSX0gKKyNkZWZpbmUgX0FTTV9YODZfTVNSX0gKKworI2luY2x1ZGUgPGFzbS9tc3ItaW5kZXguaD4KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBYODZfSU9DX1JETVNSX1JFR1MJX0lPV1IoJ2MnLCAweEEwLCBfX3UzMls4XSkKKyNkZWZpbmUgWDg2X0lPQ19XUk1TUl9SRUdTCV9JT1dSKCdjJywgMHhBMSwgX191MzJbOF0pCisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBfQVNNX1g4Nl9NU1JfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbXRyci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbXRyci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZjhmMmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9tdHJyLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qICBHZW5lcmljIE1UUlIgKE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVyKSBpb2N0bHMuCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMTk5OSAgUmljaGFyZCBHb29jaAorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAgICBSaWNoYXJkIEdvb2NoIG1heSBiZSByZWFjaGVkIGJ5IGVtYWlsIGF0ICByZ29vY2hAYXRuZi5jc2lyby5hdQorICAgIFRoZSBwb3N0YWwgYWRkcmVzcyBpczoKKyAgICAgIFJpY2hhcmQgR29vY2gsIGMvbyBBVE5GLCBQLiBPLiBCb3ggNzYsIEVwcGluZywgTi5TLlcuLCAyMTIxLCBBdXN0cmFsaWEuCisqLworI2lmbmRlZiBfQVNNX1g4Nl9NVFJSX0gKKyNkZWZpbmUgX0FTTV9YODZfTVRSUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2RlZmluZQlNVFJSX0lPQ1RMX0JBU0UJJ00nCisKK3N0cnVjdCBtdHJyX3NlbnRyeSB7CisgICAgdW5zaWduZWQgbG9uZyBiYXNlOyAgICAvKiAgQmFzZSBhZGRyZXNzICAgICAqLworICAgIHVuc2lnbmVkIGludCBzaXplOyAgICAvKiAgU2l6ZSBvZiByZWdpb24gICAqLworICAgIHVuc2lnbmVkIGludCB0eXBlOyAgICAgLyogIFR5cGUgb2YgcmVnaW9uICAgKi8KK307CisKKy8qIFdhcm5pbmc6IHRoaXMgc3RydWN0dXJlIGhhcyBhIGRpZmZlcmVudCBvcmRlciBmcm9tIGkzODYKKyAgIG9uIHg4Ni02NC4gVGhlIDMyYml0IGVtdWxhdGlvbiBjb2RlIHRha2VzIGNhcmUgb2YgdGhhdC4KKyAgIEJ1dCB5b3UgbmVlZCB0byB1c2UgdGhpcyBmb3IgNjRiaXQsIG90aGVyd2lzZSB5b3VyIFggc2VydmVyCisgICB3aWxsIGJyZWFrLiAqLworCisjaWZkZWYgX19pMzg2X18KK3N0cnVjdCBtdHJyX2dlbnRyeSB7CisgICAgdW5zaWduZWQgaW50IHJlZ251bTsgICAvKiAgUmVnaXN0ZXIgbnVtYmVyICAqLworICAgIHVuc2lnbmVkIGxvbmcgYmFzZTsgICAgLyogIEJhc2UgYWRkcmVzcyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsgICAgLyogIFNpemUgb2YgcmVnaW9uICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgdHlwZTsgICAgIC8qICBUeXBlIG9mIHJlZ2lvbiAgICovCit9OworCisjZWxzZSAvKiBfX2kzODZfXyAqLworCitzdHJ1Y3QgbXRycl9nZW50cnkgeworICAgIHVuc2lnbmVkIGxvbmcgYmFzZTsgICAgLyogIEJhc2UgYWRkcmVzcyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsgICAgLyogIFNpemUgb2YgcmVnaW9uICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgcmVnbnVtOyAgIC8qICBSZWdpc3RlciBudW1iZXIgICovCisgICAgdW5zaWduZWQgaW50IHR5cGU7ICAgICAvKiAgVHlwZSBvZiByZWdpb24gICAqLworfTsKKyNlbmRpZiAvKiAhX19pMzg2X18gKi8KKworc3RydWN0IG10cnJfdmFyX3JhbmdlIHsKKwlfX3UzMiBiYXNlX2xvOworCV9fdTMyIGJhc2VfaGk7CisJX191MzIgbWFza19sbzsKKwlfX3UzMiBtYXNrX2hpOworfTsKKworLyogSW4gdGhlIEludGVsIHByb2Nlc3NvcidzIE1UUlIgaW50ZXJmYWNlLCB0aGUgTVRSUiB0eXBlIGlzIGFsd2F5cyBoZWxkIGluCisgICBhbiA4IGJpdCBmaWVsZDogKi8KK3R5cGVkZWYgX191OCBtdHJyX3R5cGU7CisKKyNkZWZpbmUgTVRSUl9OVU1fRklYRURfUkFOR0VTIDg4CisjZGVmaW5lIE1UUlJfTUFYX1ZBUl9SQU5HRVMgMjU2CisKK3N0cnVjdCBtdHJyX3N0YXRlX3R5cGUgeworCXN0cnVjdCBtdHJyX3Zhcl9yYW5nZSB2YXJfcmFuZ2VzW01UUlJfTUFYX1ZBUl9SQU5HRVNdOworCW10cnJfdHlwZSBmaXhlZF9yYW5nZXNbTVRSUl9OVU1fRklYRURfUkFOR0VTXTsKKwl1bnNpZ25lZCBjaGFyIGVuYWJsZWQ7CisJdW5zaWduZWQgY2hhciBoYXZlX2ZpeGVkOworCW10cnJfdHlwZSBkZWZfdHlwZTsKK307CisKKyNkZWZpbmUgTVRSUnBoeXNCYXNlX01TUihyZWcpICgweDIwMCArIDIgKiAocmVnKSkKKyNkZWZpbmUgTVRSUnBoeXNNYXNrX01TUihyZWcpICgweDIwMCArIDIgKiAocmVnKSArIDEpCisKKy8qICBUaGVzZSBhcmUgdGhlIHZhcmlvdXMgaW9jdGxzICAqLworI2RlZmluZSBNVFJSSU9DX0FERF9FTlRSWSAgICAgICAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICAwLCBzdHJ1Y3QgbXRycl9zZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfU0VUX0VOVFJZICAgICAgICBfSU9XKE1UUlJfSU9DVExfQkFTRSwgIDEsIHN0cnVjdCBtdHJyX3NlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19ERUxfRU5UUlkgICAgICAgIF9JT1coTVRSUl9JT0NUTF9CQVNFLCAgMiwgc3RydWN0IG10cnJfc2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX0dFVF9FTlRSWSAgICAgICAgX0lPV1IoTVRSUl9JT0NUTF9CQVNFLCAzLCBzdHJ1Y3QgbXRycl9nZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfS0lMTF9FTlRSWSAgICAgICBfSU9XKE1UUlJfSU9DVExfQkFTRSwgIDQsIHN0cnVjdCBtdHJyX3NlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19BRERfUEFHRV9FTlRSWSAgIF9JT1coTVRSUl9JT0NUTF9CQVNFLCAgNSwgc3RydWN0IG10cnJfc2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX1NFVF9QQUdFX0VOVFJZICAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICA2LCBzdHJ1Y3QgbXRycl9zZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfREVMX1BBR0VfRU5UUlkgICBfSU9XKE1UUlJfSU9DVExfQkFTRSwgIDcsIHN0cnVjdCBtdHJyX3NlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19HRVRfUEFHRV9FTlRSWSAgIF9JT1dSKE1UUlJfSU9DVExfQkFTRSwgOCwgc3RydWN0IG10cnJfZ2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX0tJTExfUEFHRV9FTlRSWSAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICA5LCBzdHJ1Y3QgbXRycl9zZW50cnkpCisKKy8qICBUaGVzZSBhcmUgdGhlIHJlZ2lvbiB0eXBlcyAgKi8KKyNkZWZpbmUgTVRSUl9UWVBFX1VOQ0FDSEFCTEUgMAorI2RlZmluZSBNVFJSX1RZUEVfV1JDT01CICAgICAxCisvKiNkZWZpbmUgTVRSUl9UWVBFXyAgICAgICAgIDIqLworLyojZGVmaW5lIE1UUlJfVFlQRV8gICAgICAgICAzKi8KKyNkZWZpbmUgTVRSUl9UWVBFX1dSVEhST1VHSCAgNAorI2RlZmluZSBNVFJSX1RZUEVfV1JQUk9UICAgICA1CisjZGVmaW5lIE1UUlJfVFlQRV9XUkJBQ0sgICAgIDYKKyNkZWZpbmUgTVRSUl9OVU1fVFlQRVMgICAgICAgNworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9NVFJSX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3BhcmFtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NWQ0NTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wYXJhbS5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYXJhbS5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcG9sbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcG9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ODUwOWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wb2xsLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BvbGwuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wb3NpeF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZGNmZjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wb3NpeF90eXBlcy5oCkBAIC0wLDAgKzEsNSBAQAorIyBpZmRlZiBfX2kzODZfXworIyAgaW5jbHVkZSA8YXNtL3Bvc2l4X3R5cGVzXzMyLmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPGFzbS9wb3NpeF90eXBlc182NC5oPgorIyBlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcG9zaXhfdHlwZXNfMzIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzXzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllNDU2MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzXzMyLmgKQEAgLTAsMCArMSw0NiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9QT1NJWF9UWVBFU18zMl9ICisjZGVmaW5lIF9BU01fWDg2X1BPU0lYX1RZUEVTXzMyX0gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBnZW5lcmFsbHkgdXNlZCBieSB1c2VyLWxldmVsIHNvZnR3YXJlLCBzbyB5b3UgbmVlZCB0bworICogYmUgYSBsaXR0bGUgY2FyZWZ1bCBhYm91dCBuYW1lc3BhY2UgcG9sbHV0aW9uIGV0Yy4gIEFsc28sIHdlIGNhbm5vdAorICogYXNzdW1lIEdDQyBpcyBiZWluZyB1c2VkLgorICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlfX2tlcm5lbF9pbm9fdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfbW9kZV90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9ubGlua190OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9vZmZfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9waWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfaXBjX3BpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfZ2lkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF9zaXplX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfc3NpemVfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9wdHJkaWZmX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3RpbWVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfc3VzZWNvbmRzX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX2Nsb2NrX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfdGltZXJfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9jbG9ja2lkX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfZGFkZHJfdDsKK3R5cGVkZWYgY2hhciAqCQlfX2tlcm5lbF9jYWRkcl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF91aWQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9naWQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfdWlkMzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX2dpZDMyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfb2xkX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9vbGRfZ2lkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX29sZF9kZXZfdDsKKworI2lmZGVmIF9fR05VQ19fCit0eXBlZGVmIGxvbmcgbG9uZwlfX2tlcm5lbF9sb2ZmX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludAl2YWxbMl07Cit9IF9fa2VybmVsX2ZzaWRfdDsKKworCisjZW5kaWYgLyogX0FTTV9YODZfUE9TSVhfVFlQRVNfMzJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcG9zaXhfdHlwZXNfNjQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzXzY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3NjNjMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzXzY0LmgKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBfQVNNX1g4Nl9QT1NJWF9UWVBFU182NF9ICisjZGVmaW5lIF9BU01fWDg2X1BPU0lYX1RZUEVTXzY0X0gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBnZW5lcmFsbHkgdXNlZCBieSB1c2VyLWxldmVsIHNvZnR3YXJlLCBzbyB5b3UgbmVlZCB0bworICogYmUgYSBsaXR0bGUgY2FyZWZ1bCBhYm91dCBuYW1lc3BhY2UgcG9sbHV0aW9uIGV0Yy4gIEFsc28sIHdlIGNhbm5vdAorICogYXNzdW1lIEdDQyBpcyBiZWluZyB1c2VkLgorICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlfX2tlcm5lbF9pbm9fdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX21vZGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlfX2tlcm5lbF9ubGlua190OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9vZmZfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9waWRfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9pcGNfcGlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX2dpZF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX3NpemVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfc3NpemVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfcHRyZGlmZl90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF90aW1lX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3N1c2Vjb25kc190OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9jbG9ja190OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3RpbWVyX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfY2xvY2tpZF90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX2RhZGRyX3Q7Cit0eXBlZGVmIGNoYXIgKgkJX19rZXJuZWxfY2FkZHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfdWlkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfZ2lkMTZfdDsKKworI2lmZGVmIF9fR05VQ19fCit0eXBlZGVmIGxvbmcgbG9uZwlfX2tlcm5lbF9sb2ZmX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludAl2YWxbMl07Cit9IF9fa2VybmVsX2ZzaWRfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX2tlcm5lbF9vbGRfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fa2VybmVsX29sZF9naWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfdWlkX3QgX19rZXJuZWxfdWlkMzJfdDsKK3R5cGVkZWYgX19rZXJuZWxfZ2lkX3QgX19rZXJuZWxfZ2lkMzJfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX29sZF9kZXZfdDsKKworCisjZW5kaWYgLyogX0FTTV9YODZfUE9TSVhfVFlQRVNfNjRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcHJjdGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3ByY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjNTAzMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3ByY3RsLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9BU01fWDg2X1BSQ1RMX0gKKyNkZWZpbmUgX0FTTV9YODZfUFJDVExfSAorCisjZGVmaW5lIEFSQ0hfU0VUX0dTIDB4MTAwMQorI2RlZmluZSBBUkNIX1NFVF9GUyAweDEwMDIKKyNkZWZpbmUgQVJDSF9HRVRfRlMgMHgxMDAzCisjZGVmaW5lIEFSQ0hfR0VUX0dTIDB4MTAwNAorCisjZW5kaWYgLyogX0FTTV9YODZfUFJDVExfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcHJvY2Vzc29yLWZsYWdzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wcm9jZXNzb3ItZmxhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmUxMzlhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcHJvY2Vzc29yLWZsYWdzLmgKQEAgLTAsMCArMSw5NSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9QUk9DRVNTT1JfRkxBR1NfSAorI2RlZmluZSBfQVNNX1g4Nl9QUk9DRVNTT1JfRkxBR1NfSAorLyogVmFyaW91cyBmbGFncyBkZWZpbmVkOiBjYW4gYmUgaW5jbHVkZWQgZnJvbSBhc3NlbWJsZXIuICovCisKKy8qCisgKiBFRkxBR1MgYml0cworICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfQ0YJMHgwMDAwMDAwMSAvKiBDYXJyeSBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfUEYJMHgwMDAwMDAwNCAvKiBQYXJpdHkgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0FGCTB4MDAwMDAwMTAgLyogQXV4aWxpYXJ5IGNhcnJ5IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19aRgkweDAwMDAwMDQwIC8qIFplcm8gRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1NGCTB4MDAwMDAwODAgLyogU2lnbiBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfVEYJMHgwMDAwMDEwMCAvKiBUcmFwIEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19JRgkweDAwMDAwMjAwIC8qIEludGVycnVwdCBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfREYJMHgwMDAwMDQwMCAvKiBEaXJlY3Rpb24gRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX09GCTB4MDAwMDA4MDAgLyogT3ZlcmZsb3cgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0lPUEwJMHgwMDAwMzAwMCAvKiBJT1BMIG1hc2sgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19OVAkweDAwMDA0MDAwIC8qIE5lc3RlZCBUYXNrICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfUkYJMHgwMDAxMDAwMCAvKiBSZXN1bWUgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1ZNCTB4MDAwMjAwMDAgLyogVmlydHVhbCBNb2RlICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfQUMJMHgwMDA0MDAwMCAvKiBBbGlnbm1lbnQgQ2hlY2sgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19WSUYJMHgwMDA4MDAwMCAvKiBWaXJ0dWFsIEludGVycnVwdCBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfVklQCTB4MDAxMDAwMDAgLyogVmlydHVhbCBJbnRlcnJ1cHQgUGVuZGluZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0lECTB4MDAyMDAwMDAgLyogQ1BVSUQgZGV0ZWN0aW9uIGZsYWcgKi8KKworLyoKKyAqIEJhc2ljIENQVSBjb250cm9sIGluIENSMAorICovCisjZGVmaW5lIFg4Nl9DUjBfUEUJMHgwMDAwMDAwMSAvKiBQcm90ZWN0aW9uIEVuYWJsZSAqLworI2RlZmluZSBYODZfQ1IwX01QCTB4MDAwMDAwMDIgLyogTW9uaXRvciBDb3Byb2Nlc3NvciAqLworI2RlZmluZSBYODZfQ1IwX0VNCTB4MDAwMDAwMDQgLyogRW11bGF0aW9uICovCisjZGVmaW5lIFg4Nl9DUjBfVFMJMHgwMDAwMDAwOCAvKiBUYXNrIFN3aXRjaGVkICovCisjZGVmaW5lIFg4Nl9DUjBfRVQJMHgwMDAwMDAxMCAvKiBFeHRlbnNpb24gVHlwZSAqLworI2RlZmluZSBYODZfQ1IwX05FCTB4MDAwMDAwMjAgLyogTnVtZXJpYyBFcnJvciAqLworI2RlZmluZSBYODZfQ1IwX1dQCTB4MDAwMTAwMDAgLyogV3JpdGUgUHJvdGVjdCAqLworI2RlZmluZSBYODZfQ1IwX0FNCTB4MDAwNDAwMDAgLyogQWxpZ25tZW50IE1hc2sgKi8KKyNkZWZpbmUgWDg2X0NSMF9OVwkweDIwMDAwMDAwIC8qIE5vdCBXcml0ZS10aHJvdWdoICovCisjZGVmaW5lIFg4Nl9DUjBfQ0QJMHg0MDAwMDAwMCAvKiBDYWNoZSBEaXNhYmxlICovCisjZGVmaW5lIFg4Nl9DUjBfUEcJMHg4MDAwMDAwMCAvKiBQYWdpbmcgKi8KKworLyoKKyAqIFBhZ2luZyBvcHRpb25zIGluIENSMworICovCisjZGVmaW5lIFg4Nl9DUjNfUFdUCTB4MDAwMDAwMDggLyogUGFnZSBXcml0ZSBUaHJvdWdoICovCisjZGVmaW5lIFg4Nl9DUjNfUENECTB4MDAwMDAwMTAgLyogUGFnZSBDYWNoZSBEaXNhYmxlICovCisKKy8qCisgKiBJbnRlbCBDUFUgZmVhdHVyZXMgaW4gQ1I0CisgKi8KKyNkZWZpbmUgWDg2X0NSNF9WTUUJMHgwMDAwMDAwMSAvKiBlbmFibGUgdm04NiBleHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9DUjRfUFZJCTB4MDAwMDAwMDIgLyogdmlydHVhbCBpbnRlcnJ1cHRzIGZsYWcgZW5hYmxlICovCisjZGVmaW5lIFg4Nl9DUjRfVFNECTB4MDAwMDAwMDQgLyogZGlzYWJsZSB0aW1lIHN0YW1wIGF0IGlwbCAzICovCisjZGVmaW5lIFg4Nl9DUjRfREUJMHgwMDAwMDAwOCAvKiBlbmFibGUgZGVidWdnaW5nIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0NSNF9QU0UJMHgwMDAwMDAxMCAvKiBlbmFibGUgcGFnZSBzaXplIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0NSNF9QQUUJMHgwMDAwMDAyMCAvKiBlbmFibGUgcGh5c2ljYWwgYWRkcmVzcyBleHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9DUjRfTUNFCTB4MDAwMDAwNDAgLyogTWFjaGluZSBjaGVjayBlbmFibGUgKi8KKyNkZWZpbmUgWDg2X0NSNF9QR0UJMHgwMDAwMDA4MCAvKiBlbmFibGUgZ2xvYmFsIHBhZ2VzICovCisjZGVmaW5lIFg4Nl9DUjRfUENFCTB4MDAwMDAxMDAgLyogZW5hYmxlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGF0IGlwbCAzICovCisjZGVmaW5lIFg4Nl9DUjRfT1NGWFNSCTB4MDAwMDAyMDAgLyogZW5hYmxlIGZhc3QgRlBVIHNhdmUgYW5kIHJlc3RvcmUgKi8KKyNkZWZpbmUgWDg2X0NSNF9PU1hNTUVYQ1BUIDB4MDAwMDA0MDAgLyogZW5hYmxlIHVubWFza2VkIFNTRSBleGNlcHRpb25zICovCisjZGVmaW5lIFg4Nl9DUjRfVk1YRQkweDAwMDAyMDAwIC8qIGVuYWJsZSBWTVggdmlydHVhbGl6YXRpb24gKi8KKyNkZWZpbmUgWDg2X0NSNF9SRFdSR1NGUyAweDAwMDEwMDAwIC8qIGVuYWJsZSBSRFdSR1NGUyBzdXBwb3J0ICovCisjZGVmaW5lIFg4Nl9DUjRfT1NYU0FWRSAweDAwMDQwMDAwIC8qIGVuYWJsZSB4c2F2ZSBhbmQgeHJlc3RvcmUgKi8KKyNkZWZpbmUgWDg2X0NSNF9TTUVQCTB4MDAxMDAwMDAgLyogZW5hYmxlIFNNRVAgc3VwcG9ydCAqLworCisvKgorICogeDg2LTY0IFRhc2sgUHJpb3JpdHkgUmVnaXN0ZXIsIENSOAorICovCisjZGVmaW5lIFg4Nl9DUjhfVFBSCTB4MDAwMDAwMEYgLyogdGFzayBwcmlvcml0eSByZWdpc3RlciAqLworCisvKgorICogQU1EIGFuZCBUcmFuc21ldGEgdXNlIE1TUnMgZm9yIGNvbmZpZ3VyYXRpb247IHNlZSA8YXNtL21zci1pbmRleC5oPgorICovCisKKy8qCisgKiAgICAgIE5TQy9DeXJpeCBDUFUgY29uZmlndXJhdGlvbiByZWdpc3RlciBpbmRleGVzCisgKi8KKyNkZWZpbmUgQ1g4Nl9QQ1IwCTB4MjAKKyNkZWZpbmUgQ1g4Nl9HQ1IJMHhiOAorI2RlZmluZSBDWDg2X0NDUjAJMHhjMAorI2RlZmluZSBDWDg2X0NDUjEJMHhjMQorI2RlZmluZSBDWDg2X0NDUjIJMHhjMgorI2RlZmluZSBDWDg2X0NDUjMJMHhjMworI2RlZmluZSBDWDg2X0NDUjQJMHhlOAorI2RlZmluZSBDWDg2X0NDUjUJMHhlOQorI2RlZmluZSBDWDg2X0NDUjYJMHhlYQorI2RlZmluZSBDWDg2X0NDUjcJMHhlYgorI2RlZmluZSBDWDg2X1BDUjEJMHhmMAorI2RlZmluZSBDWDg2X0RJUjAJMHhmZQorI2RlZmluZSBDWDg2X0RJUjEJMHhmZgorI2RlZmluZSBDWDg2X0FSUl9CQVNFCTB4YzQKKyNkZWZpbmUgQ1g4Nl9SQ1JfQkFTRQkweGRjCisKKworI2VuZGlmIC8qIF9BU01fWDg2X1BST0NFU1NPUl9GTEFHU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wdHJhY2UtYWJpLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wdHJhY2UtYWJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwYTU1YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3B0cmFjZS1hYmkuaApAQCAtMCwwICsxLDg3IEBACisjaWZuZGVmIF9BU01fWDg2X1BUUkFDRV9BQklfSAorI2RlZmluZSBfQVNNX1g4Nl9QVFJBQ0VfQUJJX0gKKworI2lmZGVmIF9faTM4Nl9fCisKKyNkZWZpbmUgRUJYIDAKKyNkZWZpbmUgRUNYIDEKKyNkZWZpbmUgRURYIDIKKyNkZWZpbmUgRVNJIDMKKyNkZWZpbmUgRURJIDQKKyNkZWZpbmUgRUJQIDUKKyNkZWZpbmUgRUFYIDYKKyNkZWZpbmUgRFMgNworI2RlZmluZSBFUyA4CisjZGVmaW5lIEZTIDkKKyNkZWZpbmUgR1MgMTAKKyNkZWZpbmUgT1JJR19FQVggMTEKKyNkZWZpbmUgRUlQIDEyCisjZGVmaW5lIENTICAxMworI2RlZmluZSBFRkwgMTQKKyNkZWZpbmUgVUVTUCAxNQorI2RlZmluZSBTUyAgIDE2CisjZGVmaW5lIEZSQU1FX1NJWkUgMTcKKworI2Vsc2UgLyogX19pMzg2X18gKi8KKworI2lmIGRlZmluZWQoX19BU1NFTUJMWV9fKSB8fCBkZWZpbmVkKF9fRlJBTUVfT0ZGU0VUUykKKyNkZWZpbmUgUjE1IDAKKyNkZWZpbmUgUjE0IDgKKyNkZWZpbmUgUjEzIDE2CisjZGVmaW5lIFIxMiAyNAorI2RlZmluZSBSQlAgMzIKKyNkZWZpbmUgUkJYIDQwCisvKiBhcmd1bWVudHM6IGludGVycnVwdHMvbm9uIHRyYWNpbmcgc3lzY2FsbHMgb25seSBzYXZlIHVwIHRvIGhlcmUqLworI2RlZmluZSBSMTEgNDgKKyNkZWZpbmUgUjEwIDU2CisjZGVmaW5lIFI5IDY0CisjZGVmaW5lIFI4IDcyCisjZGVmaW5lIFJBWCA4MAorI2RlZmluZSBSQ1ggODgKKyNkZWZpbmUgUkRYIDk2CisjZGVmaW5lIFJTSSAxMDQKKyNkZWZpbmUgUkRJIDExMgorI2RlZmluZSBPUklHX1JBWCAxMjAgICAgICAgLyogPSBFUlJPUiAqLworLyogZW5kIG9mIGFyZ3VtZW50cyAqLworLyogY3B1IGV4Y2VwdGlvbiBmcmFtZSBvciB1bmRlZmluZWQgaW4gY2FzZSBvZiBmYXN0IHN5c2NhbGwuICovCisjZGVmaW5lIFJJUCAxMjgKKyNkZWZpbmUgQ1MgMTM2CisjZGVmaW5lIEVGTEFHUyAxNDQKKyNkZWZpbmUgUlNQIDE1MgorI2RlZmluZSBTUyAxNjAKKyNkZWZpbmUgQVJHT0ZGU0VUIFIxMQorI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisvKiB0b3Agb2Ygc3RhY2sgcGFnZSAqLworI2RlZmluZSBGUkFNRV9TSVpFIDE2OAorCisjZW5kaWYgLyogIV9faTM4Nl9fICovCisKKy8qIEFyYml0cmFyaWx5IGNob29zZSB0aGUgc2FtZSBwdHJhY2UgbnVtYmVycyBhcyB1c2VkIGJ5IHRoZSBTcGFyYyBjb2RlLiAqLworI2RlZmluZSBQVFJBQ0VfR0VUUkVHUyAgICAgICAgICAgIDEyCisjZGVmaW5lIFBUUkFDRV9TRVRSRUdTICAgICAgICAgICAgMTMKKyNkZWZpbmUgUFRSQUNFX0dFVEZQUkVHUyAgICAgICAgICAxNAorI2RlZmluZSBQVFJBQ0VfU0VURlBSRUdTICAgICAgICAgIDE1CisjZGVmaW5lIFBUUkFDRV9HRVRGUFhSRUdTICAgICAgICAgMTgKKyNkZWZpbmUgUFRSQUNFX1NFVEZQWFJFR1MgICAgICAgICAxOQorCisjZGVmaW5lIFBUUkFDRV9PTERTRVRPUFRJT05TICAgICAgMjEKKworLyogb25seSB1c2VmdWwgZm9yIGFjY2VzcyAzMmJpdCBwcm9ncmFtcyAvIGtlcm5lbHMgKi8KKyNkZWZpbmUgUFRSQUNFX0dFVF9USFJFQURfQVJFQSAgICAyNQorI2RlZmluZSBQVFJBQ0VfU0VUX1RIUkVBRF9BUkVBICAgIDI2CisKKyNpZmRlZiBfX3g4Nl82NF9fCisjIGRlZmluZSBQVFJBQ0VfQVJDSF9QUkNUTAkgIDMwCisjZW5kaWYKKworI2RlZmluZSBQVFJBQ0VfU1lTRU1VCQkgIDMxCisjZGVmaW5lIFBUUkFDRV9TWVNFTVVfU0lOR0xFU1RFUCAgMzIKKworI2RlZmluZSBQVFJBQ0VfU0lOR0xFQkxPQ0sJMzMJLyogcmVzdW1lIGV4ZWN1dGlvbiB1bnRpbCBuZXh0IGJyYW5jaCAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIF9BU01fWDg2X1BUUkFDRV9BQklfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcHRyYWNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGMxOGU5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcHRyYWNlLmgKQEAgLTAsMCArMSw3NCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9QVFJBQ0VfSAorI2RlZmluZSBfQVNNX1g4Nl9QVFJBQ0VfSAorCisJLyogRm9yICovCisjaW5jbHVkZSA8YXNtL3B0cmFjZS1hYmkuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLWZsYWdzLmg+CisKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2lmZGVmIF9faTM4Nl9fCisvKiB0aGlzIHN0cnVjdCBkZWZpbmVzIHRoZSB3YXkgdGhlIHJlZ2lzdGVycyBhcmUgc3RvcmVkIG9uIHRoZQorICAgc3RhY2sgZHVyaW5nIGEgc3lzdGVtIGNhbGwuICovCisKKworc3RydWN0IHB0X3JlZ3MgeworCWxvbmcgZWJ4OworCWxvbmcgZWN4OworCWxvbmcgZWR4OworCWxvbmcgZXNpOworCWxvbmcgZWRpOworCWxvbmcgZWJwOworCWxvbmcgZWF4OworCWludCAgeGRzOworCWludCAgeGVzOworCWludCAgeGZzOworCWludCAgeGdzOworCWxvbmcgb3JpZ19lYXg7CisJbG9uZyBlaXA7CisJaW50ICB4Y3M7CisJbG9uZyBlZmxhZ3M7CisJbG9uZyBlc3A7CisJaW50ICB4c3M7Cit9OworCisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKKworc3RydWN0IHB0X3JlZ3MgeworCXVuc2lnbmVkIGxvbmcgcjE1OworCXVuc2lnbmVkIGxvbmcgcjE0OworCXVuc2lnbmVkIGxvbmcgcjEzOworCXVuc2lnbmVkIGxvbmcgcjEyOworCXVuc2lnbmVkIGxvbmcgcmJwOworCXVuc2lnbmVkIGxvbmcgcmJ4OworLyogYXJndW1lbnRzOiBub24gaW50ZXJydXB0cy9ub24gdHJhY2luZyBzeXNjYWxscyBvbmx5IHNhdmUgdXAgdG8gaGVyZSovCisJdW5zaWduZWQgbG9uZyByMTE7CisJdW5zaWduZWQgbG9uZyByMTA7CisJdW5zaWduZWQgbG9uZyByOTsKKwl1bnNpZ25lZCBsb25nIHI4OworCXVuc2lnbmVkIGxvbmcgcmF4OworCXVuc2lnbmVkIGxvbmcgcmN4OworCXVuc2lnbmVkIGxvbmcgcmR4OworCXVuc2lnbmVkIGxvbmcgcnNpOworCXVuc2lnbmVkIGxvbmcgcmRpOworCXVuc2lnbmVkIGxvbmcgb3JpZ19yYXg7CisvKiBlbmQgb2YgYXJndW1lbnRzICovCisvKiBjcHUgZXhjZXB0aW9uIGZyYW1lIG9yIHVuZGVmaW5lZCAqLworCXVuc2lnbmVkIGxvbmcgcmlwOworCXVuc2lnbmVkIGxvbmcgY3M7CisJdW5zaWduZWQgbG9uZyBlZmxhZ3M7CisJdW5zaWduZWQgbG9uZyByc3A7CisJdW5zaWduZWQgbG9uZyBzczsKKy8qIHRvcCBvZiBzdGFjayBwYWdlICovCit9OworCisjZW5kaWYgLyogIV9faTM4Nl9fICovCisKKworCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX0FTTV9YODZfUFRSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Jlc291cmNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YmM0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9yZXNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9yZXNvdXJjZS5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc2VtYnVmLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zZW1idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTUwYzgwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc2VtYnVmLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TRU1CVUZfSAorI2RlZmluZSBfQVNNX1g4Nl9TRU1CVUZfSAorCisvKgorICogVGhlIHNlbWlkNjRfZHMgc3RydWN0dXJlIGZvciB4ODYgYXJjaGl0ZWN0dXJlLgorICogTm90ZSBleHRyYSBwYWRkaW5nIGJlY2F1c2UgdGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIGJhY2sgYW5kIGZvcnRoCisgKiBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlciBzcGFjZS4KKyAqCisgKiBQYWQgc3BhY2UgaXMgbGVmdCBmb3I6CisgKiAtIDY0LWJpdCB0aW1lX3QgdG8gc29sdmUgeTIwMzggcHJvYmxlbQorICogLSAyIG1pc2NlbGxhbmVvdXMgMzItYml0IHZhbHVlcworICovCitzdHJ1Y3Qgc2VtaWQ2NF9kcyB7CisJc3RydWN0IGlwYzY0X3Blcm0gc2VtX3Blcm07CS8qIHBlcm1pc3Npb25zIC4uIHNlZSBpcGMuaCAqLworCV9fa2VybmVsX3RpbWVfdAlzZW1fb3RpbWU7CS8qIGxhc3Qgc2Vtb3AgdGltZSAqLworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQxOworCV9fa2VybmVsX3RpbWVfdAlzZW1fY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMjsKKwl1bnNpZ25lZCBsb25nCXNlbV9uc2VtczsJLyogbm8uIG9mIHNlbWFwaG9yZXMgaW4gYXJyYXkgKi8KKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMzsKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkNDsKK307CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TRU1CVUZfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc2V0dXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NldHVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhZWY2MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NldHVwLmgKQEAgLTAsMCArMSw1IEBACisjaWZuZGVmIF9BU01fWDg2X1NFVFVQX0gKKyNkZWZpbmUgX0FTTV9YODZfU0VUVVBfSAorCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TRVRVUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zaG1idWYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NobWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzA1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zaG1idWYuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2htYnVmLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zaWdjb250ZXh0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zaWdjb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4YzhjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NpZ2NvbnRleHQuaApAQCAtMCwwICsxLDIxNCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TSUdDT05URVhUX0gKKyNkZWZpbmUgX0FTTV9YODZfU0lHQ09OVEVYVF9ICisKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRlBfWFNUQVRFX01BR0lDMQkweDQ2NTA1ODUzVQorI2RlZmluZSBGUF9YU1RBVEVfTUFHSUMyCTB4NDY1MDU4NDVVCisjZGVmaW5lIEZQX1hTVEFURV9NQUdJQzJfU0laRQlzaXplb2YoRlBfWFNUQVRFX01BR0lDMikKKworLyoKKyAqIGJ5dGVzIDQ2NC4uNTExIGluIHRoZSBjdXJyZW50IDUxMmJ5dGUgbGF5b3V0IG9mIGZ4c2F2ZS9meHJzdG9yIGZyYW1lCisgKiBhcmUgcmVzZXJ2ZWQgZm9yIFNXIHVzYWdlLiBPbiBjcHUncyBzdXBwb3J0aW5nIHhzYXZlL3hyc3RvciwgdGhlc2UgYnl0ZXMKKyAqIGFyZSB1c2VkIHRvIGV4dGVuZGVkIHRoZSBmcHN0YXRlIHBvaW50ZXIgaW4gdGhlIHNpZ2NvbnRleHQsIHdoaWNoIG5vdworICogaW5jbHVkZXMgdGhlIGV4dGVuZGVkIHN0YXRlIGluZm9ybWF0aW9uIGFsb25nIHdpdGggZnBzdGF0ZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBQcmVzZW5jZSBvZiBGUF9YU1RBVEVfTUFHSUMxIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBTVyByZXNlcnZlZAorICogYXJlYSBhbmQgRlBfWFNUQVRFX01BR0lDMiBhdCB0aGUgZW5kIG9mIG1lbW9yeSBsYXlvdXQKKyAqIChleHRlbmRlZF9zaXplIC0gRlBfWFNUQVRFX01BR0lDMl9TSVpFKSBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIHRoZQorICogZXh0ZW5kZWQgc3RhdGUgaW5mb3JtYXRpb24gaW4gdGhlIG1lbW9yeSBsYXlvdXQgcG9pbnRlZCBieSB0aGUgZnBzdGF0ZQorICogcG9pbnRlciBpbiBzaWdjb250ZXh0LgorICovCitzdHJ1Y3QgX2ZweF9zd19ieXRlcyB7CisJX191MzIgbWFnaWMxOwkJLyogRlBfWFNUQVRFX01BR0lDMSAqLworCV9fdTMyIGV4dGVuZGVkX3NpemU7CS8qIHRvdGFsIHNpemUgb2YgdGhlIGxheW91dCByZWZlcnJlZCBieQorCQkJCSAqIGZwc3RhdGUgcG9pbnRlciBpbiB0aGUgc2lnY29udGV4dC4KKwkJCQkgKi8KKwlfX3U2NCB4c3RhdGVfYnY7CisJCQkJLyogZmVhdHVyZSBiaXQgbWFzayAoaW5jbHVkaW5nIGZwL3NzZS9leHRlbmRlZAorCQkJCSAqIHN0YXRlKSB0aGF0IGlzIHByZXNlbnQgaW4gdGhlIG1lbW9yeQorCQkJCSAqIGxheW91dC4KKwkJCQkgKi8KKwlfX3UzMiB4c3RhdGVfc2l6ZTsJLyogYWN0dWFsIHhzYXZlIHN0YXRlIHNpemUsIGJhc2VkIG9uIHRoZQorCQkJCSAqIGZlYXR1cmVzIHNhdmVkIGluIHRoZSBsYXlvdXQuCisJCQkJICogJ2V4dGVuZGVkX3NpemUnIHdpbGwgYmUgZ3JlYXRlciB0aGFuCisJCQkJICogJ3hzdGF0ZV9zaXplJy4KKwkJCQkgKi8KKwlfX3UzMiBwYWRkaW5nWzddOwkvKiAgZm9yIGZ1dHVyZSB1c2UuICovCit9OworCisjaWZkZWYgX19pMzg2X18KKy8qCisgKiBBcyBkb2N1bWVudGVkIGluIHRoZSBpQkNTMiBzdGFuZGFyZC4uCisgKgorICogVGhlIGZpcnN0IHBhcnQgb2YgInN0cnVjdCBfZnBzdGF0ZSIgaXMganVzdCB0aGUgbm9ybWFsIGkzODcKKyAqIGhhcmR3YXJlIHNldHVwLCB0aGUgZXh0cmEgInN0YXR1cyIgd29yZCBpcyB1c2VkIHRvIHNhdmUgdGhlCisgKiBjb3Byb2Nlc3NvciBzdGF0dXMgd29yZCBiZWZvcmUgZW50ZXJpbmcgdGhlIGhhbmRsZXIuCisgKgorICogUGVudGl1bSBJSUkgRlhTUiwgU1NFIHN1cHBvcnQKKyAqCUdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4sIE1heSAyMDAwCisgKgorICogVGhlIEZQVSBzdGF0ZSBkYXRhIHN0cnVjdHVyZSBoYXMgaGFkIHRvIGdyb3cgdG8gYWNjb21tb2RhdGUgdGhlCisgKiBleHRlbmRlZCBGUFUgc3RhdGUgcmVxdWlyZWQgYnkgdGhlIFN0cmVhbWluZyBTSU1EIEV4dGVuc2lvbnMuCisgKiBUaGVyZSBpcyBubyBkb2N1bWVudGVkIHN0YW5kYXJkIHRvIGFjY29tcGxpc2ggdGhpcyBhdCB0aGUgbW9tZW50LgorICovCitzdHJ1Y3QgX2ZwcmVnIHsKKwl1bnNpZ25lZCBzaG9ydCBzaWduaWZpY2FuZFs0XTsKKwl1bnNpZ25lZCBzaG9ydCBleHBvbmVudDsKK307CisKK3N0cnVjdCBfZnB4cmVnIHsKKwl1bnNpZ25lZCBzaG9ydCBzaWduaWZpY2FuZFs0XTsKKwl1bnNpZ25lZCBzaG9ydCBleHBvbmVudDsKKwl1bnNpZ25lZCBzaG9ydCBwYWRkaW5nWzNdOworfTsKKworc3RydWN0IF94bW1yZWcgeworCXVuc2lnbmVkIGxvbmcgZWxlbWVudFs0XTsKK307CisKK3N0cnVjdCBfZnBzdGF0ZSB7CisJLyogUmVndWxhciBGUFUgZW52aXJvbm1lbnQgKi8KKwl1bnNpZ25lZCBsb25nCWN3OworCXVuc2lnbmVkIGxvbmcJc3c7CisJdW5zaWduZWQgbG9uZwl0YWc7CisJdW5zaWduZWQgbG9uZwlpcG9mZjsKKwl1bnNpZ25lZCBsb25nCWNzc2VsOworCXVuc2lnbmVkIGxvbmcJZGF0YW9mZjsKKwl1bnNpZ25lZCBsb25nCWRhdGFzZWw7CisJc3RydWN0IF9mcHJlZwlfc3RbOF07CisJdW5zaWduZWQgc2hvcnQJc3RhdHVzOworCXVuc2lnbmVkIHNob3J0CW1hZ2ljOwkJLyogMHhmZmZmID0gcmVndWxhciBGUFUgZGF0YSBvbmx5ICovCisKKwkvKiBGWFNSIEZQVSBlbnZpcm9ubWVudCAqLworCXVuc2lnbmVkIGxvbmcJX2Z4c3JfZW52WzZdOwkvKiBGWFNSIEZQVSBlbnYgaXMgaWdub3JlZCAqLworCXVuc2lnbmVkIGxvbmcJbXhjc3I7CisJdW5zaWduZWQgbG9uZwlyZXNlcnZlZDsKKwlzdHJ1Y3QgX2ZweHJlZwlfZnhzcl9zdFs4XTsJLyogRlhTUiBGUFUgcmVnIGRhdGEgaXMgaWdub3JlZCAqLworCXN0cnVjdCBfeG1tcmVnCV94bW1bOF07CisJdW5zaWduZWQgbG9uZwlwYWRkaW5nMVs0NF07CisKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGxvbmcJcGFkZGluZzJbMTJdOworCQlzdHJ1Y3QgX2ZweF9zd19ieXRlcyBzd19yZXNlcnZlZDsgLyogcmVwcmVzZW50cyB0aGUgZXh0ZW5kZWQKKwkJCQkJCSAgICogc3RhdGUgaW5mbyAqLworCX07Cit9OworCisjZGVmaW5lIFg4Nl9GWFNSX01BR0lDCQkweDAwMDAKKworLyoKKyAqIFVzZXItc3BhY2UgbWlnaHQgc3RpbGwgcmVseSBvbiB0aGUgb2xkIGRlZmluaXRpb246CisgKi8KK3N0cnVjdCBzaWdjb250ZXh0IHsKKwl1bnNpZ25lZCBzaG9ydCBncywgX19nc2g7CisJdW5zaWduZWQgc2hvcnQgZnMsIF9fZnNoOworCXVuc2lnbmVkIHNob3J0IGVzLCBfX2VzaDsKKwl1bnNpZ25lZCBzaG9ydCBkcywgX19kc2g7CisJdW5zaWduZWQgbG9uZyBlZGk7CisJdW5zaWduZWQgbG9uZyBlc2k7CisJdW5zaWduZWQgbG9uZyBlYnA7CisJdW5zaWduZWQgbG9uZyBlc3A7CisJdW5zaWduZWQgbG9uZyBlYng7CisJdW5zaWduZWQgbG9uZyBlZHg7CisJdW5zaWduZWQgbG9uZyBlY3g7CisJdW5zaWduZWQgbG9uZyBlYXg7CisJdW5zaWduZWQgbG9uZyB0cmFwbm87CisJdW5zaWduZWQgbG9uZyBlcnI7CisJdW5zaWduZWQgbG9uZyBlaXA7CisJdW5zaWduZWQgc2hvcnQgY3MsIF9fY3NoOworCXVuc2lnbmVkIGxvbmcgZWZsYWdzOworCXVuc2lnbmVkIGxvbmcgZXNwX2F0X3NpZ25hbDsKKwl1bnNpZ25lZCBzaG9ydCBzcywgX19zc2g7CisJc3RydWN0IF9mcHN0YXRlICpmcHN0YXRlOworCXVuc2lnbmVkIGxvbmcgb2xkbWFzazsKKwl1bnNpZ25lZCBsb25nIGNyMjsKK307CisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKKy8qIEZYU0FWRSBmcmFtZSAqLworLyogTm90ZTogcmVzZXJ2ZWQxLzIgbWF5IHNvbWVkYXkgY29udGFpbiB2YWx1YWJsZSBkYXRhLiBBbHdheXMgc2F2ZS9yZXN0b3JlCisgICB0aGVtIHdoZW4geW91IGNoYW5nZSBzaWduYWwgZnJhbWVzLiAqLworc3RydWN0IF9mcHN0YXRlIHsKKwlfX3UxNgljd2Q7CisJX191MTYJc3dkOworCV9fdTE2CXR3ZDsJCS8qIE5vdGUgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlCisJCQkJICAgMzJiaXQveDg3L0ZTQVZFIHR3ZCAqLworCV9fdTE2CWZvcDsKKwlfX3U2NAlyaXA7CisJX191NjQJcmRwOworCV9fdTMyCW14Y3NyOworCV9fdTMyCW14Y3NyX21hc2s7CisJX191MzIJc3Rfc3BhY2VbMzJdOwkvKiA4KjE2IGJ5dGVzIGZvciBlYWNoIEZQLXJlZyAqLworCV9fdTMyCXhtbV9zcGFjZVs2NF07CS8qIDE2KjE2IGJ5dGVzIGZvciBlYWNoIFhNTS1yZWcgICovCisJX191MzIJcmVzZXJ2ZWQyWzEyXTsKKwl1bmlvbiB7CisJCV9fdTMyCXJlc2VydmVkM1sxMl07CisJCXN0cnVjdCBfZnB4X3N3X2J5dGVzIHN3X3Jlc2VydmVkOyAvKiByZXByZXNlbnRzIHRoZSBleHRlbmRlZAorCQkJCQkJICAgKiBzdGF0ZSBpbmZvcm1hdGlvbiAqLworCX07Cit9OworCisvKgorICogVXNlci1zcGFjZSBtaWdodCBzdGlsbCByZWx5IG9uIHRoZSBvbGQgZGVmaW5pdGlvbjoKKyAqLworc3RydWN0IHNpZ2NvbnRleHQgeworCXVuc2lnbmVkIGxvbmcgcjg7CisJdW5zaWduZWQgbG9uZyByOTsKKwl1bnNpZ25lZCBsb25nIHIxMDsKKwl1bnNpZ25lZCBsb25nIHIxMTsKKwl1bnNpZ25lZCBsb25nIHIxMjsKKwl1bnNpZ25lZCBsb25nIHIxMzsKKwl1bnNpZ25lZCBsb25nIHIxNDsKKwl1bnNpZ25lZCBsb25nIHIxNTsKKwl1bnNpZ25lZCBsb25nIHJkaTsKKwl1bnNpZ25lZCBsb25nIHJzaTsKKwl1bnNpZ25lZCBsb25nIHJicDsKKwl1bnNpZ25lZCBsb25nIHJieDsKKwl1bnNpZ25lZCBsb25nIHJkeDsKKwl1bnNpZ25lZCBsb25nIHJheDsKKwl1bnNpZ25lZCBsb25nIHJjeDsKKwl1bnNpZ25lZCBsb25nIHJzcDsKKwl1bnNpZ25lZCBsb25nIHJpcDsKKwl1bnNpZ25lZCBsb25nIGVmbGFnczsJCS8qIFJGTEFHUyAqLworCXVuc2lnbmVkIHNob3J0IGNzOworCXVuc2lnbmVkIHNob3J0IGdzOworCXVuc2lnbmVkIHNob3J0IGZzOworCXVuc2lnbmVkIHNob3J0IF9fcGFkMDsKKwl1bnNpZ25lZCBsb25nIGVycjsKKwl1bnNpZ25lZCBsb25nIHRyYXBubzsKKwl1bnNpZ25lZCBsb25nIG9sZG1hc2s7CisJdW5zaWduZWQgbG9uZyBjcjI7CisJc3RydWN0IF9mcHN0YXRlICpmcHN0YXRlOwkvKiB6ZXJvIHdoZW4gbm8gRlBVIGNvbnRleHQgKi8KKwl1bnNpZ25lZCBsb25nIHJlc2VydmVkMVs4XTsKK307CisKKyNlbmRpZiAvKiAhX19pMzg2X18gKi8KKworc3RydWN0IF94c2F2ZV9oZHIgeworCV9fdTY0IHhzdGF0ZV9idjsKKwlfX3U2NCByZXNlcnZlZDFbMl07CisJX191NjQgcmVzZXJ2ZWQyWzVdOworfTsKKworc3RydWN0IF95bW1oX3N0YXRlIHsKKwkvKiAxNiAqIDE2IGJ5dGVzIGZvciBlYWNoIFlNTUgtcmVnICovCisJX191MzIgeW1taF9zcGFjZVs2NF07Cit9OworCisvKgorICogRXh0ZW5kZWQgc3RhdGUgcG9pbnRlZCBieSB0aGUgZnBzdGF0ZSBwb2ludGVyIGluIHRoZSBzaWdjb250ZXh0LgorICogSW4gYWRkaXRpb24gdG8gdGhlIGZwc3RhdGUsIGluZm9ybWF0aW9uIGVuY29kZWQgaW4gdGhlIHhzdGF0ZV9oZHIKKyAqIGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2Ygb3RoZXIgZXh0ZW5kZWQgc3RhdGUgaW5mb3JtYXRpb24KKyAqIHN1cHBvcnRlZCBieSB0aGUgcHJvY2Vzc29yIGFuZCBPUy4KKyAqLworc3RydWN0IF94c3RhdGUgeworCXN0cnVjdCBfZnBzdGF0ZSBmcHN0YXRlOworCXN0cnVjdCBfeHNhdmVfaGRyIHhzdGF0ZV9oZHI7CisJc3RydWN0IF95bW1oX3N0YXRlIHltbWg7CisJLyogbmV3IHByb2Nlc3NvciBzdGF0ZSBleHRlbnNpb25zIGdvIGhlcmUgKi8KK307CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TSUdDT05URVhUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NpZ2NvbnRleHQzMi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc2lnY29udGV4dDMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxNDc4YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NpZ2NvbnRleHQzMi5oCkBAIC0wLDAgKzEsNzcgQEAKKyNpZm5kZWYgX0FTTV9YODZfU0lHQ09OVEVYVDMyX0gKKyNkZWZpbmUgX0FTTV9YODZfU0lHQ09OVEVYVDMyX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIHNpZ25hbCBjb250ZXh0IGZvciAzMmJpdCBwcm9ncmFtcy4gKi8KKworI2RlZmluZSBYODZfRlhTUl9NQUdJQwkJMHgwMDAwCisKK3N0cnVjdCBfZnByZWcgeworCXVuc2lnbmVkIHNob3J0IHNpZ25pZmljYW5kWzRdOworCXVuc2lnbmVkIHNob3J0IGV4cG9uZW50OworfTsKKworc3RydWN0IF9mcHhyZWcgeworCXVuc2lnbmVkIHNob3J0IHNpZ25pZmljYW5kWzRdOworCXVuc2lnbmVkIHNob3J0IGV4cG9uZW50OworCXVuc2lnbmVkIHNob3J0IHBhZGRpbmdbM107Cit9OworCitzdHJ1Y3QgX3htbXJlZyB7CisJX191MzIJZWxlbWVudFs0XTsKK307CisKKy8qIEZTQVZFIGZyYW1lIHdpdGggZXh0ZW5zaW9ucyAqLworc3RydWN0IF9mcHN0YXRlX2lhMzIgeworCS8qIFJlZ3VsYXIgRlBVIGVudmlyb25tZW50ICovCisJX191MzIgCWN3OworCV9fdTMyCXN3OworCV9fdTMyCXRhZzsJLyogbm90IGNvbXBhdGlibGUgdG8gNjRiaXQgdHdkICovCisJX191MzIJaXBvZmY7CisJX191MzIJY3NzZWw7CisJX191MzIJZGF0YW9mZjsKKwlfX3UzMglkYXRhc2VsOworCXN0cnVjdCBfZnByZWcJX3N0WzhdOworCXVuc2lnbmVkIHNob3J0CXN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydAltYWdpYzsJCS8qIDB4ZmZmZiA9IHJlZ3VsYXIgRlBVIGRhdGEgb25seSAqLworCisJLyogRlhTUiBGUFUgZW52aXJvbm1lbnQgKi8KKwlfX3UzMglfZnhzcl9lbnZbNl07CisJX191MzIJbXhjc3I7CisJX191MzIJcmVzZXJ2ZWQ7CisJc3RydWN0IF9mcHhyZWcJX2Z4c3Jfc3RbOF07CisJc3RydWN0IF94bW1yZWcJX3htbVs4XTsJLyogSXQncyBhY3R1YWxseSAxNiAqLworCV9fdTMyCXBhZGRpbmdbNDRdOworCXVuaW9uIHsKKwkJX191MzIgcGFkZGluZzJbMTJdOworCQlzdHJ1Y3QgX2ZweF9zd19ieXRlcyBzd19yZXNlcnZlZDsKKwl9OworfTsKKworc3RydWN0IHNpZ2NvbnRleHRfaWEzMiB7CisgICAgICAgdW5zaWduZWQgc2hvcnQgZ3MsIF9fZ3NoOworICAgICAgIHVuc2lnbmVkIHNob3J0IGZzLCBfX2ZzaDsKKyAgICAgICB1bnNpZ25lZCBzaG9ydCBlcywgX19lc2g7CisgICAgICAgdW5zaWduZWQgc2hvcnQgZHMsIF9fZHNoOworICAgICAgIHVuc2lnbmVkIGludCBkaTsKKyAgICAgICB1bnNpZ25lZCBpbnQgc2k7CisgICAgICAgdW5zaWduZWQgaW50IGJwOworICAgICAgIHVuc2lnbmVkIGludCBzcDsKKyAgICAgICB1bnNpZ25lZCBpbnQgYng7CisgICAgICAgdW5zaWduZWQgaW50IGR4OworICAgICAgIHVuc2lnbmVkIGludCBjeDsKKyAgICAgICB1bnNpZ25lZCBpbnQgYXg7CisgICAgICAgdW5zaWduZWQgaW50IHRyYXBubzsKKyAgICAgICB1bnNpZ25lZCBpbnQgZXJyOworICAgICAgIHVuc2lnbmVkIGludCBpcDsKKyAgICAgICB1bnNpZ25lZCBzaG9ydCBjcywgX19jc2g7CisgICAgICAgdW5zaWduZWQgaW50IGZsYWdzOworICAgICAgIHVuc2lnbmVkIGludCBzcF9hdF9zaWduYWw7CisgICAgICAgdW5zaWduZWQgc2hvcnQgc3MsIF9fc3NoOworICAgICAgIHVuc2lnbmVkIGludCBmcHN0YXRlOwkJLyogcmVhbGx5IChzdHJ1Y3QgX2Zwc3RhdGVfaWEzMiAqKSAqLworICAgICAgIHVuc2lnbmVkIGludCBvbGRtYXNrOworICAgICAgIHVuc2lnbmVkIGludCBjcjI7Cit9OworCisjZW5kaWYgLyogX0FTTV9YODZfU0lHQ09OVEVYVDMyX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NpZ2luZm8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NpZ2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzFhYTU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc2lnaW5mby5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0FTTV9YODZfU0lHSU5GT19ICisjZGVmaW5lIF9BU01fWDg2X1NJR0lORk9fSAorCisjaWZkZWYgX194ODZfNjRfXworIyBkZWZpbmUgX19BUkNIX1NJX1BSRUFNQkxFX1NJWkUJKDQgKiBzaXplb2YoaW50KSkKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnaW5mby5oPgorCisjZW5kaWYgLyogX0FTTV9YODZfU0lHSU5GT19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zaWduYWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjM2ExZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zaWduYWwuaApAQCAtMCwwICsxLDE0MCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TSUdOQUxfSAorI2RlZmluZSBfQVNNX1g4Nl9TSUdOQUxfSAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisKKy8qIEF2b2lkIHRvbyBtYW55IGhlYWRlciBvcmRlcmluZyBwcm9ibGVtcy4gICovCitzdHJ1Y3Qgc2lnaW5mbzsKKworLyogSGVyZSB3ZSBtdXN0IGNhdGVyIHRvIGxpYmNzIHRoYXQgcG9rZSBhYm91dCBpbiBrZXJuZWwgaGVhZGVycy4gICovCisKKyNkZWZpbmUgTlNJRwkJMzIKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzaWdzZXRfdDsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZGVmaW5lIFNJR0hVUAkJIDEKKyNkZWZpbmUgU0lHSU5UCQkgMgorI2RlZmluZSBTSUdRVUlUCQkgMworI2RlZmluZSBTSUdJTEwJCSA0CisjZGVmaW5lIFNJR1RSQVAJCSA1CisjZGVmaW5lIFNJR0FCUlQJCSA2CisjZGVmaW5lIFNJR0lPVAkJIDYKKyNkZWZpbmUgU0lHQlVTCQkgNworI2RlZmluZSBTSUdGUEUJCSA4CisjZGVmaW5lIFNJR0tJTEwJCSA5CisjZGVmaW5lIFNJR1VTUjEJCTEwCisjZGVmaW5lIFNJR1NFR1YJCTExCisjZGVmaW5lIFNJR1VTUjIJCTEyCisjZGVmaW5lIFNJR1BJUEUJCTEzCisjZGVmaW5lIFNJR0FMUk0JCTE0CisjZGVmaW5lIFNJR1RFUk0JCTE1CisjZGVmaW5lIFNJR1NUS0ZMVAkxNgorI2RlZmluZSBTSUdDSExECQkxNworI2RlZmluZSBTSUdDT05UCQkxOAorI2RlZmluZSBTSUdTVE9QCQkxOQorI2RlZmluZSBTSUdUU1RQCQkyMAorI2RlZmluZSBTSUdUVElOCQkyMQorI2RlZmluZSBTSUdUVE9VCQkyMgorI2RlZmluZSBTSUdVUkcJCTIzCisjZGVmaW5lIFNJR1hDUFUJCTI0CisjZGVmaW5lIFNJR1hGU1oJCTI1CisjZGVmaW5lIFNJR1ZUQUxSTQkyNgorI2RlZmluZSBTSUdQUk9GCQkyNworI2RlZmluZSBTSUdXSU5DSAkyOAorI2RlZmluZSBTSUdJTwkJMjkKKyNkZWZpbmUgU0lHUE9MTAkJU0lHSU8KKy8qCisjZGVmaW5lIFNJR0xPU1QJCTI5CisqLworI2RlZmluZSBTSUdQV1IJCTMwCisjZGVmaW5lIFNJR1NZUwkJMzEKKyNkZWZpbmUJU0lHVU5VU0VECTMxCisKKy8qIFRoZXNlIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBjb25zdGFudHMgZnJvbSB1c2VybGFuZC4gICovCisjZGVmaW5lIFNJR1JUTUlOCTMyCisjZGVmaW5lIFNJR1JUTUFYCV9OU0lHCisKKy8qCisgKiBTQV9GTEFHUyB2YWx1ZXM6CisgKgorICogU0FfT05TVEFDSyBpbmRpY2F0ZXMgdGhhdCBhIHJlZ2lzdGVyZWQgc3RhY2tfdCB3aWxsIGJlIHVzZWQuCisgKiBTQV9SRVNUQVJUIGZsYWcgdG8gZ2V0IHJlc3RhcnRpbmcgc2lnbmFscyAod2hpY2ggd2VyZSB0aGUgZGVmYXVsdCBsb25nIGFnbykKKyAqIFNBX05PQ0xEU1RPUCBmbGFnIHRvIHR1cm4gb2ZmIFNJR0NITEQgd2hlbiBjaGlsZHJlbiBzdG9wLgorICogU0FfUkVTRVRIQU5EIGNsZWFycyB0aGUgaGFuZGxlciB3aGVuIHRoZSBzaWduYWwgaXMgZGVsaXZlcmVkLgorICogU0FfTk9DTERXQUlUIGZsYWcgb24gU0lHQ0hMRCB0byBpbmhpYml0IHpvbWJpZXMuCisgKiBTQV9OT0RFRkVSIHByZXZlbnRzIHRoZSBjdXJyZW50IHNpZ25hbCBmcm9tIGJlaW5nIG1hc2tlZCBpbiB0aGUgaGFuZGxlci4KKyAqCisgKiBTQV9PTkVTSE9UIGFuZCBTQV9OT01BU0sgYXJlIHRoZSBoaXN0b3JpY2FsIExpbnV4IG5hbWVzIGZvciB0aGUgU2luZ2xlCisgKiBVbml4IG5hbWVzIFJFU0VUSEFORCBhbmQgTk9ERUZFUiByZXNwZWN0aXZlbHkuCisgKi8KKyNkZWZpbmUgU0FfTk9DTERTVE9QCTB4MDAwMDAwMDF1CisjZGVmaW5lIFNBX05PQ0xEV0FJVAkweDAwMDAwMDAydQorI2RlZmluZSBTQV9TSUdJTkZPCTB4MDAwMDAwMDR1CisjZGVmaW5lIFNBX09OU1RBQ0sJMHgwODAwMDAwMHUKKyNkZWZpbmUgU0FfUkVTVEFSVAkweDEwMDAwMDAwdQorI2RlZmluZSBTQV9OT0RFRkVSCTB4NDAwMDAwMDB1CisjZGVmaW5lIFNBX1JFU0VUSEFORAkweDgwMDAwMDAwdQorCisjZGVmaW5lIFNBX05PTUFTSwlTQV9OT0RFRkVSCisjZGVmaW5lIFNBX09ORVNIT1QJU0FfUkVTRVRIQU5ECisKKyNkZWZpbmUgU0FfUkVTVE9SRVIJMHgwNDAwMDAwMAorCisvKgorICogc2lnYWx0c3RhY2sgY29udHJvbHMKKyAqLworI2RlZmluZSBTU19PTlNUQUNLCTEKKyNkZWZpbmUgU1NfRElTQUJMRQkyCisKKyNkZWZpbmUgTUlOU0lHU1RLU1oJMjA0OAorI2RlZmluZSBTSUdTVEtTWgk4MTkyCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zaWduYWwtZGVmcy5oPgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisKKyNpZmRlZiBfX2kzODZfXworLyogSGVyZSB3ZSBtdXN0IGNhdGVyIHRvIGxpYmNzIHRoYXQgcG9rZSBhYm91dCBpbiBrZXJuZWwgaGVhZGVycy4gICovCisKK3N0cnVjdCBzaWdhY3Rpb24geworCXVuaW9uIHsKKwkgIF9fc2lnaGFuZGxlcl90IF9zYV9oYW5kbGVyOworCSAgdm9pZCAoKl9zYV9zaWdhY3Rpb24pKGludCwgc3RydWN0IHNpZ2luZm8gKiwgdm9pZCAqKTsKKwl9IF91OworCXNpZ3NldF90IHNhX21hc2s7CisJdW5zaWduZWQgbG9uZyBzYV9mbGFnczsKKwl2b2lkICgqc2FfcmVzdG9yZXIpKHZvaWQpOworfTsKKworI2RlZmluZSBzYV9oYW5kbGVyCV91Ll9zYV9oYW5kbGVyCisjZGVmaW5lIHNhX3NpZ2FjdGlvbglfdS5fc2Ffc2lnYWN0aW9uCisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKK3N0cnVjdCBzaWdhY3Rpb24geworCV9fc2lnaGFuZGxlcl90IHNhX2hhbmRsZXI7CisJdW5zaWduZWQgbG9uZyBzYV9mbGFnczsKKwlfX3NpZ3Jlc3RvcmVfdCBzYV9yZXN0b3JlcjsKKwlzaWdzZXRfdCBzYV9tYXNrOwkJLyogbWFzayBsYXN0IGZvciBleHRlbnNpYmlsaXR5ICovCit9OworCitzdHJ1Y3Qga19zaWdhY3Rpb24geworCXN0cnVjdCBzaWdhY3Rpb24gc2E7Cit9OworCisjZW5kaWYgLyogIV9faTM4Nl9fICovCisKK3R5cGVkZWYgc3RydWN0IHNpZ2FsdHN0YWNrIHsKKwl2b2lkICpzc19zcDsKKwlpbnQgc3NfZmxhZ3M7CisJc2l6ZV90IHNzX3NpemU7Cit9IHN0YWNrX3Q7CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fWDg2X1NJR05BTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zb2NrZXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNzEzODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zb2NrZXQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc29ja2V0Lmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zb2NraW9zLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zb2NraW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmNmQ0NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NvY2tpb3MuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc29ja2lvcy5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc3RhdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjFkOWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zdGF0LmgKQEAgLTAsMCArMSwxMTQgQEAKKyNpZm5kZWYgX0FTTV9YODZfU1RBVF9ICisjZGVmaW5lIF9BU01fWDg2X1NUQVRfSAorCisjZGVmaW5lIFNUQVRfSEFWRV9OU0VDIDEKKworI2lmZGVmIF9faTM4Nl9fCitzdHJ1Y3Qgc3RhdCB7CisJdW5zaWduZWQgbG9uZyAgc3RfZGV2OworCXVuc2lnbmVkIGxvbmcgIHN0X2lubzsKKwl1bnNpZ25lZCBzaG9ydCBzdF9tb2RlOworCXVuc2lnbmVkIHNob3J0IHN0X25saW5rOworCXVuc2lnbmVkIHNob3J0IHN0X3VpZDsKKwl1bnNpZ25lZCBzaG9ydCBzdF9naWQ7CisJdW5zaWduZWQgbG9uZyAgc3RfcmRldjsKKwl1bnNpZ25lZCBsb25nICBzdF9zaXplOworCXVuc2lnbmVkIGxvbmcgIHN0X2Jsa3NpemU7CisJdW5zaWduZWQgbG9uZyAgc3RfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZyAgc3RfbXRpbWU7CisJdW5zaWduZWQgbG9uZyAgc3RfbXRpbWVfbnNlYzsKKwl1bnNpZ25lZCBsb25nICBzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nICBzdF9jdGltZV9uc2VjOworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNDsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDU7Cit9OworCisjZGVmaW5lIFNUQVQ2NF9IQVNfQlJPS0VOX1NUX0lOTwkxCisKKy8qIFRoaXMgbWF0Y2hlcyBzdHJ1Y3Qgc3RhdDY0IGluIGdsaWJjMi4xLCBoZW5jZSB0aGUgYWJzb2x1dGVseQorICogaW5zYW5lIGFtb3VudHMgb2YgcGFkZGluZyBhcm91bmQgZGV2X3Qncy4KKyAqLworc3RydWN0IHN0YXQ2NCB7CisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2RldjsKKwl1bnNpZ25lZCBjaGFyCV9fcGFkMFs0XTsKKworCXVuc2lnbmVkIGxvbmcJX19zdF9pbm87CisKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3Rfbmxpbms7CisKKwl1bnNpZ25lZCBsb25nCXN0X3VpZDsKKwl1bnNpZ25lZCBsb25nCXN0X2dpZDsKKworCXVuc2lnbmVkIGxvbmcgbG9uZwlzdF9yZGV2OworCXVuc2lnbmVkIGNoYXIJX19wYWQzWzRdOworCisJbG9uZyBsb25nCXN0X3NpemU7CisJdW5zaWduZWQgbG9uZwlzdF9ibGtzaXplOworCisJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2Jsb2NrczsKKworCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWU7CisJdW5zaWduZWQgbG9uZwlzdF9hdGltZV9uc2VjOworCisJdW5zaWduZWQgbG9uZwlzdF9tdGltZTsKKwl1bnNpZ25lZCBpbnQJc3RfbXRpbWVfbnNlYzsKKworCXVuc2lnbmVkIGxvbmcJc3RfY3RpbWU7CisJdW5zaWduZWQgbG9uZwlzdF9jdGltZV9uc2VjOworCisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2lubzsKK307CisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKK3N0cnVjdCBzdGF0IHsKKwl1bnNpZ25lZCBsb25nCXN0X2RldjsKKwl1bnNpZ25lZCBsb25nCXN0X2lubzsKKwl1bnNpZ25lZCBsb25nCXN0X25saW5rOworCisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X3VpZDsKKwl1bnNpZ25lZCBpbnQJc3RfZ2lkOworCXVuc2lnbmVkIGludAlfX3BhZDA7CisJdW5zaWduZWQgbG9uZwlzdF9yZGV2OworCWxvbmcJCXN0X3NpemU7CisJbG9uZwkJc3RfYmxrc2l6ZTsKKwlsb25nCQlzdF9ibG9ja3M7CS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworCisJdW5zaWduZWQgbG9uZwlzdF9hdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X2F0aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZwlzdF9tdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X210aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZwlzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nICAgc3RfY3RpbWVfbnNlYzsKKwlsb25nCQlfX3VudXNlZFszXTsKK307CisjZW5kaWYKKworLyogZm9yIDMyYml0IGVtdWxhdGlvbiBhbmQgMzIgYml0IGtlcm5lbHMgKi8KK3N0cnVjdCBfX29sZF9rZXJuZWxfc3RhdCB7CisJdW5zaWduZWQgc2hvcnQgc3RfZGV2OworCXVuc2lnbmVkIHNob3J0IHN0X2lubzsKKwl1bnNpZ25lZCBzaG9ydCBzdF9tb2RlOworCXVuc2lnbmVkIHNob3J0IHN0X25saW5rOworCXVuc2lnbmVkIHNob3J0IHN0X3VpZDsKKwl1bnNpZ25lZCBzaG9ydCBzdF9naWQ7CisJdW5zaWduZWQgc2hvcnQgc3RfcmRldjsKKyNpZmRlZiBfX2kzODZfXworCXVuc2lnbmVkIGxvbmcgIHN0X3NpemU7CisJdW5zaWduZWQgbG9uZyAgc3RfYXRpbWU7CisJdW5zaWduZWQgbG9uZyAgc3RfbXRpbWU7CisJdW5zaWduZWQgbG9uZyAgc3RfY3RpbWU7CisjZWxzZQorCXVuc2lnbmVkIGludCAgc3Rfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgIHN0X2F0aW1lOworCXVuc2lnbmVkIGludCAgc3RfbXRpbWU7CisJdW5zaWduZWQgaW50ICBzdF9jdGltZTsKKyNlbmRpZgorfTsKKworI2VuZGlmIC8qIF9BU01fWDg2X1NUQVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc3RhdGZzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zdGF0ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDBhZGJmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc3RhdGZzLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TVEFURlNfSAorI2RlZmluZSBfQVNNX1g4Nl9TVEFURlNfSAorCisvKgorICogV2UgbmVlZCBjb21wYXRfc3RhdGZzNjQgdG8gYmUgcGFja2VkLCBiZWNhdXNlIHRoZSBpMzg2IEFCSSB3b24ndAorICogYWRkIHBhZGRpbmcgYXQgdGhlIGVuZCB0byBicmluZyBpdCB0byBhIG11bHRpcGxlIG9mIDggYnl0ZXMsIGJ1dAorICogdGhlIHg4Nl82NCBBQkkgd2lsbC4KKyAqLworI2RlZmluZSBBUkNIX1BBQ0tfQ09NUEFUX1NUQVRGUzY0IF9fYXR0cmlidXRlX18oKHBhY2tlZCxhbGlnbmVkKDQpKSkKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N0YXRmcy5oPgorI2VuZGlmIC8qIF9BU01fWDg2X1NUQVRGU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zd2FiLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczNjVkZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDYxIEBACisjaWZuZGVmIF9BU01fWDg2X1NXQUJfSAorI2RlZmluZSBfQVNNX1g4Nl9TV0FCX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKworc3RhdGljIF9faW5saW5lX18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWwpCit7CisjaWZkZWYgX19pMzg2X18KKyMgaWZkZWYgQ09ORklHX1g4Nl9CU1dBUAorCV9fYXNtX18oImJzd2FwICUwIiA6ICI9ciIgKHZhbCkgOiAiMCIgKHZhbCkpOworIyBlbHNlCisJX19hc21fXygieGNoZ2IgJWIwLCVoMFxuXHQiCS8qIHN3YXAgbG93ZXIgYnl0ZXMJKi8KKwkgICAgInJvcmwgJDE2LCUwXG5cdCIJLyogc3dhcCB3b3JkcwkJKi8KKwkgICAgInhjaGdiICViMCwlaDAiCS8qIHN3YXAgaGlnaGVyIGJ5dGVzCSovCisJICAgIDogIj1xIiAodmFsKQorCSAgICA6ICIwIiAodmFsKSk7CisjIGVuZGlmCisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisJX19hc21fXygiYnN3YXBsICUwIgorCSAgICA6ICI9ciIgKHZhbCkKKwkgICAgOiAiMCIgKHZhbCkpOworI2VuZGlmCisJcmV0dXJuIHZhbDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTY0IF9fYXJjaF9zd2FiNjQoX191NjQgdmFsKQoreworI2lmZGVmIF9faTM4Nl9fCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191MzIgYTsKKwkJCV9fdTMyIGI7CisJCX0gczsKKwkJX191NjQgdTsKKwl9IHY7CisJdi51ID0gdmFsOworIyBpZmRlZiBDT05GSUdfWDg2X0JTV0FQCisJX19hc21fXygiYnN3YXBsICUwIDsgYnN3YXBsICUxIDsgeGNoZ2wgJTAsJTEiCisJICAgIDogIj1yIiAodi5zLmEpLCAiPXIiICh2LnMuYikKKwkgICAgOiAiMCIgKHYucy5hKSwgIjEiICh2LnMuYikpOworIyBlbHNlCisJdi5zLmEgPSBfX2FyY2hfc3dhYjMyKHYucy5hKTsKKwl2LnMuYiA9IF9fYXJjaF9zd2FiMzIodi5zLmIpOworCV9fYXNtX18oInhjaGdsICUwLCUxIgorCSAgICA6ICI9ciIgKHYucy5hKSwgIj1yIiAodi5zLmIpCisJICAgIDogIjAiICh2LnMuYSksICIxIiAodi5zLmIpKTsKKyMgZW5kaWYKKwlyZXR1cm4gdi51OworI2Vsc2UgLyogX19pMzg2X18gKi8KKwlfX2FzbV9fKCJic3dhcHEgJTAiCisJICAgIDogIj1yIiAodmFsKQorCSAgICA6ICIwIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKKyNlbmRpZgorfQorI2RlZmluZSBfX2FyY2hfc3dhYjY0IF9fYXJjaF9zd2FiNjQKKworI2VuZGlmIC8qIF9BU01fWDg2X1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdGVybWJpdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Rlcm1iaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkzNWIxMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Rlcm1iaXRzLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Rlcm1iaXRzLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS90ZXJtaW9zLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS90ZXJtaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwZDc4YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Rlcm1pb3MuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdGVybWlvcy5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdHlwZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4YzIzZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3R5cGVzLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9BU01fWDg2X1RZUEVTX0gKKyNkZWZpbmUgX0FTTV9YODZfVFlQRVNfSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdHlwZXMuaD4KKworI2VuZGlmIC8qIF9BU01fWDg2X1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Vjb250ZXh0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS91Y29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzI5YzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS91Y29udGV4dC5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9YODZfVUNPTlRFWFRfSAorI2RlZmluZSBfQVNNX1g4Nl9VQ09OVEVYVF9ICisKKyNkZWZpbmUgVUNfRlBfWFNUQVRFCTB4MQkvKiBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIGV4dGVuZGVkIHN0YXRlCisJCQkJICogaW5mb3JtYXRpb24gaW4gdGhlIG1lbW9yeSBsYXlvdXQgcG9pbnRlZAorCQkJCSAqIGJ5IHRoZSBmcHN0YXRlIHBvaW50ZXIgaW4gdGhlIHVjb250ZXh0J3MKKwkJCQkgKiBzaWdjb250ZXh0IHN0cnVjdCAodWNfbWNvbnRleHQpLgorCQkJCSAqLworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdWNvbnRleHQuaD4KKworI2VuZGlmIC8qIF9BU01fWDg2X1VDT05URVhUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3VuaXN0ZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlZDkxMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3VuaXN0ZC5oCkBAIC0wLDAgKzEsNSBAQAorIyBpZmRlZiBfX2kzODZfXworIyAgaW5jbHVkZSA8YXNtL3VuaXN0ZF8zMi5oPgorIyBlbHNlCisjICBpbmNsdWRlIDxhc20vdW5pc3RkXzY0Lmg+CisjIGVuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS91bmlzdGRfMzIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3VuaXN0ZF8zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTc5ODAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS91bmlzdGRfMzIuaApAQCAtMCwwICsxLDM1OCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9VTklTVERfMzJfSAorI2RlZmluZSBfQVNNX1g4Nl9VTklTVERfMzJfSAorCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzeXN0ZW0gY2FsbCBudW1iZXJzLgorICovCisKKyNkZWZpbmUgX19OUl9yZXN0YXJ0X3N5c2NhbGwgICAgICAwCisjZGVmaW5lIF9fTlJfZXhpdAkJICAxCisjZGVmaW5lIF9fTlJfZm9yawkJICAyCisjZGVmaW5lIF9fTlJfcmVhZAkJICAzCisjZGVmaW5lIF9fTlJfd3JpdGUJCSAgNAorI2RlZmluZSBfX05SX29wZW4JCSAgNQorI2RlZmluZSBfX05SX2Nsb3NlCQkgIDYKKyNkZWZpbmUgX19OUl93YWl0cGlkCQkgIDcKKyNkZWZpbmUgX19OUl9jcmVhdAkJICA4CisjZGVmaW5lIF9fTlJfbGluawkJICA5CisjZGVmaW5lIF9fTlJfdW5saW5rCQkgMTAKKyNkZWZpbmUgX19OUl9leGVjdmUJCSAxMQorI2RlZmluZSBfX05SX2NoZGlyCQkgMTIKKyNkZWZpbmUgX19OUl90aW1lCQkgMTMKKyNkZWZpbmUgX19OUl9ta25vZAkJIDE0CisjZGVmaW5lIF9fTlJfY2htb2QJCSAxNQorI2RlZmluZSBfX05SX2xjaG93bgkJIDE2CisjZGVmaW5lIF9fTlJfYnJlYWsJCSAxNworI2RlZmluZSBfX05SX29sZHN0YXQJCSAxOAorI2RlZmluZSBfX05SX2xzZWVrCQkgMTkKKyNkZWZpbmUgX19OUl9nZXRwaWQJCSAyMAorI2RlZmluZSBfX05SX21vdW50CQkgMjEKKyNkZWZpbmUgX19OUl91bW91bnQJCSAyMgorI2RlZmluZSBfX05SX3NldHVpZAkJIDIzCisjZGVmaW5lIF9fTlJfZ2V0dWlkCQkgMjQKKyNkZWZpbmUgX19OUl9zdGltZQkJIDI1CisjZGVmaW5lIF9fTlJfcHRyYWNlCQkgMjYKKyNkZWZpbmUgX19OUl9hbGFybQkJIDI3CisjZGVmaW5lIF9fTlJfb2xkZnN0YXQJCSAyOAorI2RlZmluZSBfX05SX3BhdXNlCQkgMjkKKyNkZWZpbmUgX19OUl91dGltZQkJIDMwCisjZGVmaW5lIF9fTlJfc3R0eQkJIDMxCisjZGVmaW5lIF9fTlJfZ3R0eQkJIDMyCisjZGVmaW5lIF9fTlJfYWNjZXNzCQkgMzMKKyNkZWZpbmUgX19OUl9uaWNlCQkgMzQKKyNkZWZpbmUgX19OUl9mdGltZQkJIDM1CisjZGVmaW5lIF9fTlJfc3luYwkJIDM2CisjZGVmaW5lIF9fTlJfa2lsbAkJIDM3CisjZGVmaW5lIF9fTlJfcmVuYW1lCQkgMzgKKyNkZWZpbmUgX19OUl9ta2RpcgkJIDM5CisjZGVmaW5lIF9fTlJfcm1kaXIJCSA0MAorI2RlZmluZSBfX05SX2R1cAkJIDQxCisjZGVmaW5lIF9fTlJfcGlwZQkJIDQyCisjZGVmaW5lIF9fTlJfdGltZXMJCSA0MworI2RlZmluZSBfX05SX3Byb2YJCSA0NAorI2RlZmluZSBfX05SX2JyawkJIDQ1CisjZGVmaW5lIF9fTlJfc2V0Z2lkCQkgNDYKKyNkZWZpbmUgX19OUl9nZXRnaWQJCSA0NworI2RlZmluZSBfX05SX3NpZ25hbAkJIDQ4CisjZGVmaW5lIF9fTlJfZ2V0ZXVpZAkJIDQ5CisjZGVmaW5lIF9fTlJfZ2V0ZWdpZAkJIDUwCisjZGVmaW5lIF9fTlJfYWNjdAkJIDUxCisjZGVmaW5lIF9fTlJfdW1vdW50MgkJIDUyCisjZGVmaW5lIF9fTlJfbG9jawkJIDUzCisjZGVmaW5lIF9fTlJfaW9jdGwJCSA1NAorI2RlZmluZSBfX05SX2ZjbnRsCQkgNTUKKyNkZWZpbmUgX19OUl9tcHgJCSA1NgorI2RlZmluZSBfX05SX3NldHBnaWQJCSA1NworI2RlZmluZSBfX05SX3VsaW1pdAkJIDU4CisjZGVmaW5lIF9fTlJfb2xkb2xkdW5hbWUJIDU5CisjZGVmaW5lIF9fTlJfdW1hc2sJCSA2MAorI2RlZmluZSBfX05SX2Nocm9vdAkJIDYxCisjZGVmaW5lIF9fTlJfdXN0YXQJCSA2MgorI2RlZmluZSBfX05SX2R1cDIJCSA2MworI2RlZmluZSBfX05SX2dldHBwaWQJCSA2NAorI2RlZmluZSBfX05SX2dldHBncnAJCSA2NQorI2RlZmluZSBfX05SX3NldHNpZAkJIDY2CisjZGVmaW5lIF9fTlJfc2lnYWN0aW9uCQkgNjcKKyNkZWZpbmUgX19OUl9zZ2V0bWFzawkJIDY4CisjZGVmaW5lIF9fTlJfc3NldG1hc2sJCSA2OQorI2RlZmluZSBfX05SX3NldHJldWlkCQkgNzAKKyNkZWZpbmUgX19OUl9zZXRyZWdpZAkJIDcxCisjZGVmaW5lIF9fTlJfc2lnc3VzcGVuZAkJIDcyCisjZGVmaW5lIF9fTlJfc2lncGVuZGluZwkJIDczCisjZGVmaW5lIF9fTlJfc2V0aG9zdG5hbWUJIDc0CisjZGVmaW5lIF9fTlJfc2V0cmxpbWl0CQkgNzUKKyNkZWZpbmUgX19OUl9nZXRybGltaXQJCSA3NiAgIC8qIEJhY2sgY29tcGF0aWJsZSAyR2lnIGxpbWl0ZWQgcmxpbWl0ICovCisjZGVmaW5lIF9fTlJfZ2V0cnVzYWdlCQkgNzcKKyNkZWZpbmUgX19OUl9nZXR0aW1lb2ZkYXkJIDc4CisjZGVmaW5lIF9fTlJfc2V0dGltZW9mZGF5CSA3OQorI2RlZmluZSBfX05SX2dldGdyb3VwcwkJIDgwCisjZGVmaW5lIF9fTlJfc2V0Z3JvdXBzCQkgODEKKyNkZWZpbmUgX19OUl9zZWxlY3QJCSA4MgorI2RlZmluZSBfX05SX3N5bWxpbmsJCSA4MworI2RlZmluZSBfX05SX29sZGxzdGF0CQkgODQKKyNkZWZpbmUgX19OUl9yZWFkbGluawkJIDg1CisjZGVmaW5lIF9fTlJfdXNlbGliCQkgODYKKyNkZWZpbmUgX19OUl9zd2Fwb24JCSA4NworI2RlZmluZSBfX05SX3JlYm9vdAkJIDg4CisjZGVmaW5lIF9fTlJfcmVhZGRpcgkJIDg5CisjZGVmaW5lIF9fTlJfbW1hcAkJIDkwCisjZGVmaW5lIF9fTlJfbXVubWFwCQkgOTEKKyNkZWZpbmUgX19OUl90cnVuY2F0ZQkJIDkyCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlCQkgOTMKKyNkZWZpbmUgX19OUl9mY2htb2QJCSA5NAorI2RlZmluZSBfX05SX2ZjaG93bgkJIDk1CisjZGVmaW5lIF9fTlJfZ2V0cHJpb3JpdHkJIDk2CisjZGVmaW5lIF9fTlJfc2V0cHJpb3JpdHkJIDk3CisjZGVmaW5lIF9fTlJfcHJvZmlsCQkgOTgKKyNkZWZpbmUgX19OUl9zdGF0ZnMJCSA5OQorI2RlZmluZSBfX05SX2ZzdGF0ZnMJCTEwMAorI2RlZmluZSBfX05SX2lvcGVybQkJMTAxCisjZGVmaW5lIF9fTlJfc29ja2V0Y2FsbAkJMTAyCisjZGVmaW5lIF9fTlJfc3lzbG9nCQkxMDMKKyNkZWZpbmUgX19OUl9zZXRpdGltZXIJCTEwNAorI2RlZmluZSBfX05SX2dldGl0aW1lcgkJMTA1CisjZGVmaW5lIF9fTlJfc3RhdAkJMTA2CisjZGVmaW5lIF9fTlJfbHN0YXQJCTEwNworI2RlZmluZSBfX05SX2ZzdGF0CQkxMDgKKyNkZWZpbmUgX19OUl9vbGR1bmFtZQkJMTA5CisjZGVmaW5lIF9fTlJfaW9wbAkJMTEwCisjZGVmaW5lIF9fTlJfdmhhbmd1cAkJMTExCisjZGVmaW5lIF9fTlJfaWRsZQkJMTEyCisjZGVmaW5lIF9fTlJfdm04Nm9sZAkJMTEzCisjZGVmaW5lIF9fTlJfd2FpdDQJCTExNAorI2RlZmluZSBfX05SX3N3YXBvZmYJCTExNQorI2RlZmluZSBfX05SX3N5c2luZm8JCTExNgorI2RlZmluZSBfX05SX2lwYwkJMTE3CisjZGVmaW5lIF9fTlJfZnN5bmMJCTExOAorI2RlZmluZSBfX05SX3NpZ3JldHVybgkJMTE5CisjZGVmaW5lIF9fTlJfY2xvbmUJCTEyMAorI2RlZmluZSBfX05SX3NldGRvbWFpbm5hbWUJMTIxCisjZGVmaW5lIF9fTlJfdW5hbWUJCTEyMgorI2RlZmluZSBfX05SX21vZGlmeV9sZHQJCTEyMworI2RlZmluZSBfX05SX2FkanRpbWV4CQkxMjQKKyNkZWZpbmUgX19OUl9tcHJvdGVjdAkJMTI1CisjZGVmaW5lIF9fTlJfc2lncHJvY21hc2sJMTI2CisjZGVmaW5lIF9fTlJfY3JlYXRlX21vZHVsZQkxMjcKKyNkZWZpbmUgX19OUl9pbml0X21vZHVsZQkxMjgKKyNkZWZpbmUgX19OUl9kZWxldGVfbW9kdWxlCTEyOQorI2RlZmluZSBfX05SX2dldF9rZXJuZWxfc3ltcwkxMzAKKyNkZWZpbmUgX19OUl9xdW90YWN0bAkJMTMxCisjZGVmaW5lIF9fTlJfZ2V0cGdpZAkJMTMyCisjZGVmaW5lIF9fTlJfZmNoZGlyCQkxMzMKKyNkZWZpbmUgX19OUl9iZGZsdXNoCQkxMzQKKyNkZWZpbmUgX19OUl9zeXNmcwkJMTM1CisjZGVmaW5lIF9fTlJfcGVyc29uYWxpdHkJMTM2CisjZGVmaW5lIF9fTlJfYWZzX3N5c2NhbGwJMTM3IC8qIFN5c2NhbGwgZm9yIEFuZHJldyBGaWxlIFN5c3RlbSAqLworI2RlZmluZSBfX05SX3NldGZzdWlkCQkxMzgKKyNkZWZpbmUgX19OUl9zZXRmc2dpZAkJMTM5CisjZGVmaW5lIF9fTlJfX2xsc2VlawkJMTQwCisjZGVmaW5lIF9fTlJfZ2V0ZGVudHMJCTE0MQorI2RlZmluZSBfX05SX19uZXdzZWxlY3QJCTE0MgorI2RlZmluZSBfX05SX2Zsb2NrCQkxNDMKKyNkZWZpbmUgX19OUl9tc3luYwkJMTQ0CisjZGVmaW5lIF9fTlJfcmVhZHYJCTE0NQorI2RlZmluZSBfX05SX3dyaXRldgkJMTQ2CisjZGVmaW5lIF9fTlJfZ2V0c2lkCQkxNDcKKyNkZWZpbmUgX19OUl9mZGF0YXN5bmMJCTE0OAorI2RlZmluZSBfX05SX19zeXNjdGwJCTE0OQorI2RlZmluZSBfX05SX21sb2NrCQkxNTAKKyNkZWZpbmUgX19OUl9tdW5sb2NrCQkxNTEKKyNkZWZpbmUgX19OUl9tbG9ja2FsbAkJMTUyCisjZGVmaW5lIF9fTlJfbXVubG9ja2FsbAkJMTUzCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0cGFyYW0JCTE1NAorI2RlZmluZSBfX05SX3NjaGVkX2dldHBhcmFtCQkxNTUKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIJCTE1NgorI2RlZmluZSBfX05SX3NjaGVkX2dldHNjaGVkdWxlcgkJMTU3CisjZGVmaW5lIF9fTlJfc2NoZWRfeWllbGQJCTE1OAorI2RlZmluZSBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9tYXgJMTU5CisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbgkxNjAKKyNkZWZpbmUgX19OUl9zY2hlZF9ycl9nZXRfaW50ZXJ2YWwJMTYxCisjZGVmaW5lIF9fTlJfbmFub3NsZWVwCQkxNjIKKyNkZWZpbmUgX19OUl9tcmVtYXAJCTE2MworI2RlZmluZSBfX05SX3NldHJlc3VpZAkJMTY0CisjZGVmaW5lIF9fTlJfZ2V0cmVzdWlkCQkxNjUKKyNkZWZpbmUgX19OUl92bTg2CQkxNjYKKyNkZWZpbmUgX19OUl9xdWVyeV9tb2R1bGUJMTY3CisjZGVmaW5lIF9fTlJfcG9sbAkJMTY4CisjZGVmaW5lIF9fTlJfbmZzc2VydmN0bAkJMTY5CisjZGVmaW5lIF9fTlJfc2V0cmVzZ2lkCQkxNzAKKyNkZWZpbmUgX19OUl9nZXRyZXNnaWQJCTE3MQorI2RlZmluZSBfX05SX3ByY3RsICAgICAgICAgICAgICAxNzIKKyNkZWZpbmUgX19OUl9ydF9zaWdyZXR1cm4JMTczCisjZGVmaW5lIF9fTlJfcnRfc2lnYWN0aW9uCTE3NAorI2RlZmluZSBfX05SX3J0X3NpZ3Byb2NtYXNrCTE3NQorI2RlZmluZSBfX05SX3J0X3NpZ3BlbmRpbmcJMTc2CisjZGVmaW5lIF9fTlJfcnRfc2lndGltZWR3YWl0CTE3NworI2RlZmluZSBfX05SX3J0X3NpZ3F1ZXVlaW5mbwkxNzgKKyNkZWZpbmUgX19OUl9ydF9zaWdzdXNwZW5kCTE3OQorI2RlZmluZSBfX05SX3ByZWFkNjQJCTE4MAorI2RlZmluZSBfX05SX3B3cml0ZTY0CQkxODEKKyNkZWZpbmUgX19OUl9jaG93bgkJMTgyCisjZGVmaW5lIF9fTlJfZ2V0Y3dkCQkxODMKKyNkZWZpbmUgX19OUl9jYXBnZXQJCTE4NAorI2RlZmluZSBfX05SX2NhcHNldAkJMTg1CisjZGVmaW5lIF9fTlJfc2lnYWx0c3RhY2sJMTg2CisjZGVmaW5lIF9fTlJfc2VuZGZpbGUJCTE4NworI2RlZmluZSBfX05SX2dldHBtc2cJCTE4OAkvKiBzb21lIHBlb3BsZSBhY3R1YWxseSB3YW50IHN0cmVhbXMgKi8KKyNkZWZpbmUgX19OUl9wdXRwbXNnCQkxODkJLyogc29tZSBwZW9wbGUgYWN0dWFsbHkgd2FudCBzdHJlYW1zICovCisjZGVmaW5lIF9fTlJfdmZvcmsJCTE5MAorI2RlZmluZSBfX05SX3VnZXRybGltaXQJCTE5MQkvKiBTdVMgY29tcGxpYW50IGdldHJsaW1pdCAqLworI2RlZmluZSBfX05SX21tYXAyCQkxOTIKKyNkZWZpbmUgX19OUl90cnVuY2F0ZTY0CQkxOTMKKyNkZWZpbmUgX19OUl9mdHJ1bmNhdGU2NAkxOTQKKyNkZWZpbmUgX19OUl9zdGF0NjQJCTE5NQorI2RlZmluZSBfX05SX2xzdGF0NjQJCTE5NgorI2RlZmluZSBfX05SX2ZzdGF0NjQJCTE5NworI2RlZmluZSBfX05SX2xjaG93bjMyCQkxOTgKKyNkZWZpbmUgX19OUl9nZXR1aWQzMgkJMTk5CisjZGVmaW5lIF9fTlJfZ2V0Z2lkMzIJCTIwMAorI2RlZmluZSBfX05SX2dldGV1aWQzMgkJMjAxCisjZGVmaW5lIF9fTlJfZ2V0ZWdpZDMyCQkyMDIKKyNkZWZpbmUgX19OUl9zZXRyZXVpZDMyCQkyMDMKKyNkZWZpbmUgX19OUl9zZXRyZWdpZDMyCQkyMDQKKyNkZWZpbmUgX19OUl9nZXRncm91cHMzMgkyMDUKKyNkZWZpbmUgX19OUl9zZXRncm91cHMzMgkyMDYKKyNkZWZpbmUgX19OUl9mY2hvd24zMgkJMjA3CisjZGVmaW5lIF9fTlJfc2V0cmVzdWlkMzIJMjA4CisjZGVmaW5lIF9fTlJfZ2V0cmVzdWlkMzIJMjA5CisjZGVmaW5lIF9fTlJfc2V0cmVzZ2lkMzIJMjEwCisjZGVmaW5lIF9fTlJfZ2V0cmVzZ2lkMzIJMjExCisjZGVmaW5lIF9fTlJfY2hvd24zMgkJMjEyCisjZGVmaW5lIF9fTlJfc2V0dWlkMzIJCTIxMworI2RlZmluZSBfX05SX3NldGdpZDMyCQkyMTQKKyNkZWZpbmUgX19OUl9zZXRmc3VpZDMyCQkyMTUKKyNkZWZpbmUgX19OUl9zZXRmc2dpZDMyCQkyMTYKKyNkZWZpbmUgX19OUl9waXZvdF9yb290CQkyMTcKKyNkZWZpbmUgX19OUl9taW5jb3JlCQkyMTgKKyNkZWZpbmUgX19OUl9tYWR2aXNlCQkyMTkKKyNkZWZpbmUgX19OUl9tYWR2aXNlMQkJMjE5CS8qIGRlbGV0ZSB3aGVuIEMgbGliIHN0dWIgaXMgcmVtb3ZlZCAqLworI2RlZmluZSBfX05SX2dldGRlbnRzNjQJCTIyMAorI2RlZmluZSBfX05SX2ZjbnRsNjQJCTIyMQorLyogMjIzIGlzIHVudXNlZCAqLworI2RlZmluZSBfX05SX2dldHRpZAkJMjI0CisjZGVmaW5lIF9fTlJfcmVhZGFoZWFkCQkyMjUKKyNkZWZpbmUgX19OUl9zZXR4YXR0cgkJMjI2CisjZGVmaW5lIF9fTlJfbHNldHhhdHRyCQkyMjcKKyNkZWZpbmUgX19OUl9mc2V0eGF0dHIJCTIyOAorI2RlZmluZSBfX05SX2dldHhhdHRyCQkyMjkKKyNkZWZpbmUgX19OUl9sZ2V0eGF0dHIJCTIzMAorI2RlZmluZSBfX05SX2ZnZXR4YXR0cgkJMjMxCisjZGVmaW5lIF9fTlJfbGlzdHhhdHRyCQkyMzIKKyNkZWZpbmUgX19OUl9sbGlzdHhhdHRyCQkyMzMKKyNkZWZpbmUgX19OUl9mbGlzdHhhdHRyCQkyMzQKKyNkZWZpbmUgX19OUl9yZW1vdmV4YXR0cgkyMzUKKyNkZWZpbmUgX19OUl9scmVtb3ZleGF0dHIJMjM2CisjZGVmaW5lIF9fTlJfZnJlbW92ZXhhdHRyCTIzNworI2RlZmluZSBfX05SX3RraWxsCQkyMzgKKyNkZWZpbmUgX19OUl9zZW5kZmlsZTY0CQkyMzkKKyNkZWZpbmUgX19OUl9mdXRleAkJMjQwCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkJMjQxCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkJMjQyCisjZGVmaW5lIF9fTlJfc2V0X3RocmVhZF9hcmVhCTI0MworI2RlZmluZSBfX05SX2dldF90aHJlYWRfYXJlYQkyNDQKKyNkZWZpbmUgX19OUl9pb19zZXR1cAkJMjQ1CisjZGVmaW5lIF9fTlJfaW9fZGVzdHJveQkJMjQ2CisjZGVmaW5lIF9fTlJfaW9fZ2V0ZXZlbnRzCTI0NworI2RlZmluZSBfX05SX2lvX3N1Ym1pdAkJMjQ4CisjZGVmaW5lIF9fTlJfaW9fY2FuY2VsCQkyNDkKKyNkZWZpbmUgX19OUl9mYWR2aXNlNjQJCTI1MAorLyogMjUxIGlzIGF2YWlsYWJsZSBmb3IgcmV1c2UgKHdhcyBicmllZmx5IHN5c19zZXRfem9uZV9yZWNsYWltKSAqLworI2RlZmluZSBfX05SX2V4aXRfZ3JvdXAJCTI1MgorI2RlZmluZSBfX05SX2xvb2t1cF9kY29va2llCTI1MworI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZQkyNTQKKyNkZWZpbmUgX19OUl9lcG9sbF9jdGwJCTI1NQorI2RlZmluZSBfX05SX2Vwb2xsX3dhaXQJCTI1NgorI2RlZmluZSBfX05SX3JlbWFwX2ZpbGVfcGFnZXMJMjU3CisjZGVmaW5lIF9fTlJfc2V0X3RpZF9hZGRyZXNzCTI1OAorI2RlZmluZSBfX05SX3RpbWVyX2NyZWF0ZQkyNTkKKyNkZWZpbmUgX19OUl90aW1lcl9zZXR0aW1lCShfX05SX3RpbWVyX2NyZWF0ZSsxKQorI2RlZmluZSBfX05SX3RpbWVyX2dldHRpbWUJKF9fTlJfdGltZXJfY3JlYXRlKzIpCisjZGVmaW5lIF9fTlJfdGltZXJfZ2V0b3ZlcnJ1bgkoX19OUl90aW1lcl9jcmVhdGUrMykKKyNkZWZpbmUgX19OUl90aW1lcl9kZWxldGUJKF9fTlJfdGltZXJfY3JlYXRlKzQpCisjZGVmaW5lIF9fTlJfY2xvY2tfc2V0dGltZQkoX19OUl90aW1lcl9jcmVhdGUrNSkKKyNkZWZpbmUgX19OUl9jbG9ja19nZXR0aW1lCShfX05SX3RpbWVyX2NyZWF0ZSs2KQorI2RlZmluZSBfX05SX2Nsb2NrX2dldHJlcwkoX19OUl90aW1lcl9jcmVhdGUrNykKKyNkZWZpbmUgX19OUl9jbG9ja19uYW5vc2xlZXAJKF9fTlJfdGltZXJfY3JlYXRlKzgpCisjZGVmaW5lIF9fTlJfc3RhdGZzNjQJCTI2OAorI2RlZmluZSBfX05SX2ZzdGF0ZnM2NAkJMjY5CisjZGVmaW5lIF9fTlJfdGdraWxsCQkyNzAKKyNkZWZpbmUgX19OUl91dGltZXMJCTI3MQorI2RlZmluZSBfX05SX2ZhZHZpc2U2NF82NAkyNzIKKyNkZWZpbmUgX19OUl92c2VydmVyCQkyNzMKKyNkZWZpbmUgX19OUl9tYmluZAkJMjc0CisjZGVmaW5lIF9fTlJfZ2V0X21lbXBvbGljeQkyNzUKKyNkZWZpbmUgX19OUl9zZXRfbWVtcG9saWN5CTI3NgorI2RlZmluZSBfX05SX21xX29wZW4gCQkyNzcKKyNkZWZpbmUgX19OUl9tcV91bmxpbmsJCShfX05SX21xX29wZW4rMSkKKyNkZWZpbmUgX19OUl9tcV90aW1lZHNlbmQJKF9fTlJfbXFfb3BlbisyKQorI2RlZmluZSBfX05SX21xX3RpbWVkcmVjZWl2ZQkoX19OUl9tcV9vcGVuKzMpCisjZGVmaW5lIF9fTlJfbXFfbm90aWZ5CQkoX19OUl9tcV9vcGVuKzQpCisjZGVmaW5lIF9fTlJfbXFfZ2V0c2V0YXR0cgkoX19OUl9tcV9vcGVuKzUpCisjZGVmaW5lIF9fTlJfa2V4ZWNfbG9hZAkJMjgzCisjZGVmaW5lIF9fTlJfd2FpdGlkCQkyODQKKy8qICNkZWZpbmUgX19OUl9zeXNfc2V0YWx0cm9vdAkyODUgKi8KKyNkZWZpbmUgX19OUl9hZGRfa2V5CQkyODYKKyNkZWZpbmUgX19OUl9yZXF1ZXN0X2tleQkyODcKKyNkZWZpbmUgX19OUl9rZXljdGwJCTI4OAorI2RlZmluZSBfX05SX2lvcHJpb19zZXQJCTI4OQorI2RlZmluZSBfX05SX2lvcHJpb19nZXQJCTI5MAorI2RlZmluZSBfX05SX2lub3RpZnlfaW5pdAkyOTEKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2FkZF93YXRjaAkyOTIKKyNkZWZpbmUgX19OUl9pbm90aWZ5X3JtX3dhdGNoCTI5MworI2RlZmluZSBfX05SX21pZ3JhdGVfcGFnZXMJMjk0CisjZGVmaW5lIF9fTlJfb3BlbmF0CQkyOTUKKyNkZWZpbmUgX19OUl9ta2RpcmF0CQkyOTYKKyNkZWZpbmUgX19OUl9ta25vZGF0CQkyOTcKKyNkZWZpbmUgX19OUl9mY2hvd25hdAkJMjk4CisjZGVmaW5lIF9fTlJfZnV0aW1lc2F0CQkyOTkKKyNkZWZpbmUgX19OUl9mc3RhdGF0NjQJCTMwMAorI2RlZmluZSBfX05SX3VubGlua2F0CQkzMDEKKyNkZWZpbmUgX19OUl9yZW5hbWVhdAkJMzAyCisjZGVmaW5lIF9fTlJfbGlua2F0CQkzMDMKKyNkZWZpbmUgX19OUl9zeW1saW5rYXQJCTMwNAorI2RlZmluZSBfX05SX3JlYWRsaW5rYXQJCTMwNQorI2RlZmluZSBfX05SX2ZjaG1vZGF0CQkzMDYKKyNkZWZpbmUgX19OUl9mYWNjZXNzYXQJCTMwNworI2RlZmluZSBfX05SX3BzZWxlY3Q2CQkzMDgKKyNkZWZpbmUgX19OUl9wcG9sbAkJMzA5CisjZGVmaW5lIF9fTlJfdW5zaGFyZQkJMzEwCisjZGVmaW5lIF9fTlJfc2V0X3JvYnVzdF9saXN0CTMxMQorI2RlZmluZSBfX05SX2dldF9yb2J1c3RfbGlzdAkzMTIKKyNkZWZpbmUgX19OUl9zcGxpY2UJCTMxMworI2RlZmluZSBfX05SX3N5bmNfZmlsZV9yYW5nZQkzMTQKKyNkZWZpbmUgX19OUl90ZWUJCTMxNQorI2RlZmluZSBfX05SX3Ztc3BsaWNlCQkzMTYKKyNkZWZpbmUgX19OUl9tb3ZlX3BhZ2VzCQkzMTcKKyNkZWZpbmUgX19OUl9nZXRjcHUJCTMxOAorI2RlZmluZSBfX05SX2Vwb2xsX3B3YWl0CTMxOQorI2RlZmluZSBfX05SX3V0aW1lbnNhdAkJMzIwCisjZGVmaW5lIF9fTlJfc2lnbmFsZmQJCTMyMQorI2RlZmluZSBfX05SX3RpbWVyZmRfY3JlYXRlCTMyMgorI2RlZmluZSBfX05SX2V2ZW50ZmQJCTMyMworI2RlZmluZSBfX05SX2ZhbGxvY2F0ZQkJMzI0CisjZGVmaW5lIF9fTlJfdGltZXJmZF9zZXR0aW1lCTMyNQorI2RlZmluZSBfX05SX3RpbWVyZmRfZ2V0dGltZQkzMjYKKyNkZWZpbmUgX19OUl9zaWduYWxmZDQJCTMyNworI2RlZmluZSBfX05SX2V2ZW50ZmQyCQkzMjgKKyNkZWZpbmUgX19OUl9lcG9sbF9jcmVhdGUxCTMyOQorI2RlZmluZSBfX05SX2R1cDMJCTMzMAorI2RlZmluZSBfX05SX3BpcGUyCQkzMzEKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQxCTMzMgorI2RlZmluZSBfX05SX3ByZWFkdgkJMzMzCisjZGVmaW5lIF9fTlJfcHdyaXRldgkJMzM0CisjZGVmaW5lIF9fTlJfcnRfdGdzaWdxdWV1ZWluZm8JMzM1CisjZGVmaW5lIF9fTlJfcGVyZl9ldmVudF9vcGVuCTMzNgorI2RlZmluZSBfX05SX3JlY3ZtbXNnCQkzMzcKKyNkZWZpbmUgX19OUl9mYW5vdGlmeV9pbml0CTMzOAorI2RlZmluZSBfX05SX2Zhbm90aWZ5X21hcmsJMzM5CisjZGVmaW5lIF9fTlJfcHJsaW1pdDY0CQkzNDAKKyNkZWZpbmUgX19OUl9uYW1lX3RvX2hhbmRsZV9hdAkzNDEKKyNkZWZpbmUgX19OUl9vcGVuX2J5X2hhbmRsZV9hdCAgMzQyCisjZGVmaW5lIF9fTlJfY2xvY2tfYWRqdGltZQkzNDMKKyNkZWZpbmUgX19OUl9zeW5jZnMgICAgICAgICAgICAgMzQ0CisjZGVmaW5lIF9fTlJfc2VuZG1tc2cJCTM0NQorI2RlZmluZSBfX05SX3NldG5zCQkzNDYKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3JlYWR2CTM0NworI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fd3JpdGV2CTM0OAorCisjZW5kaWYgLyogX0FTTV9YODZfVU5JU1REXzMyX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3VuaXN0ZF82NC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdW5pc3RkXzY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlMGNlNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3VuaXN0ZF82NC5oCkBAIC0wLDAgKzEsNzE3IEBACisjaWZuZGVmIF9BU01fWDg2X1VOSVNURF82NF9ICisjZGVmaW5lIF9BU01fWDg2X1VOSVNURF82NF9ICisKKyNpZm5kZWYgX19TWVNDQUxMCisjZGVmaW5lIF9fU1lTQ0FMTChhLCBiKQorI2VuZGlmCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN5c3RlbSBjYWxsIG51bWJlcnMuCisgKgorICogTm90ZTogaG9sZXMgYXJlIG5vdCBhbGxvd2VkLgorICovCisKKy8qIGF0IGxlYXN0IDggc3lzY2FsbCBwZXIgY2FjaGVsaW5lICovCisjZGVmaW5lIF9fTlJfcmVhZAkJCQkwCitfX1NZU0NBTEwoX19OUl9yZWFkLCBzeXNfcmVhZCkKKyNkZWZpbmUgX19OUl93cml0ZQkJCQkxCitfX1NZU0NBTEwoX19OUl93cml0ZSwgc3lzX3dyaXRlKQorI2RlZmluZSBfX05SX29wZW4JCQkJMgorX19TWVNDQUxMKF9fTlJfb3Blbiwgc3lzX29wZW4pCisjZGVmaW5lIF9fTlJfY2xvc2UJCQkJMworX19TWVNDQUxMKF9fTlJfY2xvc2UsIHN5c19jbG9zZSkKKyNkZWZpbmUgX19OUl9zdGF0CQkJCTQKK19fU1lTQ0FMTChfX05SX3N0YXQsIHN5c19uZXdzdGF0KQorI2RlZmluZSBfX05SX2ZzdGF0CQkJCTUKK19fU1lTQ0FMTChfX05SX2ZzdGF0LCBzeXNfbmV3ZnN0YXQpCisjZGVmaW5lIF9fTlJfbHN0YXQJCQkJNgorX19TWVNDQUxMKF9fTlJfbHN0YXQsIHN5c19uZXdsc3RhdCkKKyNkZWZpbmUgX19OUl9wb2xsCQkJCTcKK19fU1lTQ0FMTChfX05SX3BvbGwsIHN5c19wb2xsKQorCisjZGVmaW5lIF9fTlJfbHNlZWsJCQkJOAorX19TWVNDQUxMKF9fTlJfbHNlZWssIHN5c19sc2VlaykKKyNkZWZpbmUgX19OUl9tbWFwCQkJCTkKK19fU1lTQ0FMTChfX05SX21tYXAsIHN5c19tbWFwKQorI2RlZmluZSBfX05SX21wcm90ZWN0CQkJCTEwCitfX1NZU0NBTEwoX19OUl9tcHJvdGVjdCwgc3lzX21wcm90ZWN0KQorI2RlZmluZSBfX05SX211bm1hcAkJCQkxMQorX19TWVNDQUxMKF9fTlJfbXVubWFwLCBzeXNfbXVubWFwKQorI2RlZmluZSBfX05SX2JyawkJCQkxMgorX19TWVNDQUxMKF9fTlJfYnJrLCBzeXNfYnJrKQorI2RlZmluZSBfX05SX3J0X3NpZ2FjdGlvbgkJCTEzCitfX1NZU0NBTEwoX19OUl9ydF9zaWdhY3Rpb24sIHN5c19ydF9zaWdhY3Rpb24pCisjZGVmaW5lIF9fTlJfcnRfc2lncHJvY21hc2sJCQkxNAorX19TWVNDQUxMKF9fTlJfcnRfc2lncHJvY21hc2ssIHN5c19ydF9zaWdwcm9jbWFzaykKKyNkZWZpbmUgX19OUl9ydF9zaWdyZXR1cm4JCQkxNQorX19TWVNDQUxMKF9fTlJfcnRfc2lncmV0dXJuLCBzdHViX3J0X3NpZ3JldHVybikKKworI2RlZmluZSBfX05SX2lvY3RsCQkJCTE2CitfX1NZU0NBTEwoX19OUl9pb2N0bCwgc3lzX2lvY3RsKQorI2RlZmluZSBfX05SX3ByZWFkNjQJCQkJMTcKK19fU1lTQ0FMTChfX05SX3ByZWFkNjQsIHN5c19wcmVhZDY0KQorI2RlZmluZSBfX05SX3B3cml0ZTY0CQkJCTE4CitfX1NZU0NBTEwoX19OUl9wd3JpdGU2NCwgc3lzX3B3cml0ZTY0KQorI2RlZmluZSBfX05SX3JlYWR2CQkJCTE5CitfX1NZU0NBTEwoX19OUl9yZWFkdiwgc3lzX3JlYWR2KQorI2RlZmluZSBfX05SX3dyaXRldgkJCQkyMAorX19TWVNDQUxMKF9fTlJfd3JpdGV2LCBzeXNfd3JpdGV2KQorI2RlZmluZSBfX05SX2FjY2VzcwkJCQkyMQorX19TWVNDQUxMKF9fTlJfYWNjZXNzLCBzeXNfYWNjZXNzKQorI2RlZmluZSBfX05SX3BpcGUJCQkJMjIKK19fU1lTQ0FMTChfX05SX3BpcGUsIHN5c19waXBlKQorI2RlZmluZSBfX05SX3NlbGVjdAkJCQkyMworX19TWVNDQUxMKF9fTlJfc2VsZWN0LCBzeXNfc2VsZWN0KQorCisjZGVmaW5lIF9fTlJfc2NoZWRfeWllbGQJCQkyNAorX19TWVNDQUxMKF9fTlJfc2NoZWRfeWllbGQsIHN5c19zY2hlZF95aWVsZCkKKyNkZWZpbmUgX19OUl9tcmVtYXAJCQkJMjUKK19fU1lTQ0FMTChfX05SX21yZW1hcCwgc3lzX21yZW1hcCkKKyNkZWZpbmUgX19OUl9tc3luYwkJCQkyNgorX19TWVNDQUxMKF9fTlJfbXN5bmMsIHN5c19tc3luYykKKyNkZWZpbmUgX19OUl9taW5jb3JlCQkJCTI3CitfX1NZU0NBTEwoX19OUl9taW5jb3JlLCBzeXNfbWluY29yZSkKKyNkZWZpbmUgX19OUl9tYWR2aXNlCQkJCTI4CitfX1NZU0NBTEwoX19OUl9tYWR2aXNlLCBzeXNfbWFkdmlzZSkKKyNkZWZpbmUgX19OUl9zaG1nZXQJCQkJMjkKK19fU1lTQ0FMTChfX05SX3NobWdldCwgc3lzX3NobWdldCkKKyNkZWZpbmUgX19OUl9zaG1hdAkJCQkzMAorX19TWVNDQUxMKF9fTlJfc2htYXQsIHN5c19zaG1hdCkKKyNkZWZpbmUgX19OUl9zaG1jdGwJCQkJMzEKK19fU1lTQ0FMTChfX05SX3NobWN0bCwgc3lzX3NobWN0bCkKKworI2RlZmluZSBfX05SX2R1cAkJCQkzMgorX19TWVNDQUxMKF9fTlJfZHVwLCBzeXNfZHVwKQorI2RlZmluZSBfX05SX2R1cDIJCQkJMzMKK19fU1lTQ0FMTChfX05SX2R1cDIsIHN5c19kdXAyKQorI2RlZmluZSBfX05SX3BhdXNlCQkJCTM0CitfX1NZU0NBTEwoX19OUl9wYXVzZSwgc3lzX3BhdXNlKQorI2RlZmluZSBfX05SX25hbm9zbGVlcAkJCQkzNQorX19TWVNDQUxMKF9fTlJfbmFub3NsZWVwLCBzeXNfbmFub3NsZWVwKQorI2RlZmluZSBfX05SX2dldGl0aW1lcgkJCQkzNgorX19TWVNDQUxMKF9fTlJfZ2V0aXRpbWVyLCBzeXNfZ2V0aXRpbWVyKQorI2RlZmluZSBfX05SX2FsYXJtCQkJCTM3CitfX1NZU0NBTEwoX19OUl9hbGFybSwgc3lzX2FsYXJtKQorI2RlZmluZSBfX05SX3NldGl0aW1lcgkJCQkzOAorX19TWVNDQUxMKF9fTlJfc2V0aXRpbWVyLCBzeXNfc2V0aXRpbWVyKQorI2RlZmluZSBfX05SX2dldHBpZAkJCQkzOQorX19TWVNDQUxMKF9fTlJfZ2V0cGlkLCBzeXNfZ2V0cGlkKQorCisjZGVmaW5lIF9fTlJfc2VuZGZpbGUJCQkJNDAKK19fU1lTQ0FMTChfX05SX3NlbmRmaWxlLCBzeXNfc2VuZGZpbGU2NCkKKyNkZWZpbmUgX19OUl9zb2NrZXQJCQkJNDEKK19fU1lTQ0FMTChfX05SX3NvY2tldCwgc3lzX3NvY2tldCkKKyNkZWZpbmUgX19OUl9jb25uZWN0CQkJCTQyCitfX1NZU0NBTEwoX19OUl9jb25uZWN0LCBzeXNfY29ubmVjdCkKKyNkZWZpbmUgX19OUl9hY2NlcHQJCQkJNDMKK19fU1lTQ0FMTChfX05SX2FjY2VwdCwgc3lzX2FjY2VwdCkKKyNkZWZpbmUgX19OUl9zZW5kdG8JCQkJNDQKK19fU1lTQ0FMTChfX05SX3NlbmR0bywgc3lzX3NlbmR0bykKKyNkZWZpbmUgX19OUl9yZWN2ZnJvbQkJCQk0NQorX19TWVNDQUxMKF9fTlJfcmVjdmZyb20sIHN5c19yZWN2ZnJvbSkKKyNkZWZpbmUgX19OUl9zZW5kbXNnCQkJCTQ2CitfX1NZU0NBTEwoX19OUl9zZW5kbXNnLCBzeXNfc2VuZG1zZykKKyNkZWZpbmUgX19OUl9yZWN2bXNnCQkJCTQ3CitfX1NZU0NBTEwoX19OUl9yZWN2bXNnLCBzeXNfcmVjdm1zZykKKworI2RlZmluZSBfX05SX3NodXRkb3duCQkJCTQ4CitfX1NZU0NBTEwoX19OUl9zaHV0ZG93biwgc3lzX3NodXRkb3duKQorI2RlZmluZSBfX05SX2JpbmQJCQkJNDkKK19fU1lTQ0FMTChfX05SX2JpbmQsIHN5c19iaW5kKQorI2RlZmluZSBfX05SX2xpc3RlbgkJCQk1MAorX19TWVNDQUxMKF9fTlJfbGlzdGVuLCBzeXNfbGlzdGVuKQorI2RlZmluZSBfX05SX2dldHNvY2tuYW1lCQkJNTEKK19fU1lTQ0FMTChfX05SX2dldHNvY2tuYW1lLCBzeXNfZ2V0c29ja25hbWUpCisjZGVmaW5lIF9fTlJfZ2V0cGVlcm5hbWUJCQk1MgorX19TWVNDQUxMKF9fTlJfZ2V0cGVlcm5hbWUsIHN5c19nZXRwZWVybmFtZSkKKyNkZWZpbmUgX19OUl9zb2NrZXRwYWlyCQkJCTUzCitfX1NZU0NBTEwoX19OUl9zb2NrZXRwYWlyLCBzeXNfc29ja2V0cGFpcikKKyNkZWZpbmUgX19OUl9zZXRzb2Nrb3B0CQkJCTU0CitfX1NZU0NBTEwoX19OUl9zZXRzb2Nrb3B0LCBzeXNfc2V0c29ja29wdCkKKyNkZWZpbmUgX19OUl9nZXRzb2Nrb3B0CQkJCTU1CitfX1NZU0NBTEwoX19OUl9nZXRzb2Nrb3B0LCBzeXNfZ2V0c29ja29wdCkKKworI2RlZmluZSBfX05SX2Nsb25lCQkJCTU2CitfX1NZU0NBTEwoX19OUl9jbG9uZSwgc3R1Yl9jbG9uZSkKKyNkZWZpbmUgX19OUl9mb3JrCQkJCTU3CitfX1NZU0NBTEwoX19OUl9mb3JrLCBzdHViX2ZvcmspCisjZGVmaW5lIF9fTlJfdmZvcmsJCQkJNTgKK19fU1lTQ0FMTChfX05SX3Zmb3JrLCBzdHViX3Zmb3JrKQorI2RlZmluZSBfX05SX2V4ZWN2ZQkJCQk1OQorX19TWVNDQUxMKF9fTlJfZXhlY3ZlLCBzdHViX2V4ZWN2ZSkKKyNkZWZpbmUgX19OUl9leGl0CQkJCTYwCitfX1NZU0NBTEwoX19OUl9leGl0LCBzeXNfZXhpdCkKKyNkZWZpbmUgX19OUl93YWl0NAkJCQk2MQorX19TWVNDQUxMKF9fTlJfd2FpdDQsIHN5c193YWl0NCkKKyNkZWZpbmUgX19OUl9raWxsCQkJCTYyCitfX1NZU0NBTEwoX19OUl9raWxsLCBzeXNfa2lsbCkKKyNkZWZpbmUgX19OUl91bmFtZQkJCQk2MworX19TWVNDQUxMKF9fTlJfdW5hbWUsIHN5c19uZXd1bmFtZSkKKworI2RlZmluZSBfX05SX3NlbWdldAkJCQk2NAorX19TWVNDQUxMKF9fTlJfc2VtZ2V0LCBzeXNfc2VtZ2V0KQorI2RlZmluZSBfX05SX3NlbW9wCQkJCTY1CitfX1NZU0NBTEwoX19OUl9zZW1vcCwgc3lzX3NlbW9wKQorI2RlZmluZSBfX05SX3NlbWN0bAkJCQk2NgorX19TWVNDQUxMKF9fTlJfc2VtY3RsLCBzeXNfc2VtY3RsKQorI2RlZmluZSBfX05SX3NobWR0CQkJCTY3CitfX1NZU0NBTEwoX19OUl9zaG1kdCwgc3lzX3NobWR0KQorI2RlZmluZSBfX05SX21zZ2dldAkJCQk2OAorX19TWVNDQUxMKF9fTlJfbXNnZ2V0LCBzeXNfbXNnZ2V0KQorI2RlZmluZSBfX05SX21zZ3NuZAkJCQk2OQorX19TWVNDQUxMKF9fTlJfbXNnc25kLCBzeXNfbXNnc25kKQorI2RlZmluZSBfX05SX21zZ3JjdgkJCQk3MAorX19TWVNDQUxMKF9fTlJfbXNncmN2LCBzeXNfbXNncmN2KQorI2RlZmluZSBfX05SX21zZ2N0bAkJCQk3MQorX19TWVNDQUxMKF9fTlJfbXNnY3RsLCBzeXNfbXNnY3RsKQorCisjZGVmaW5lIF9fTlJfZmNudGwJCQkJNzIKK19fU1lTQ0FMTChfX05SX2ZjbnRsLCBzeXNfZmNudGwpCisjZGVmaW5lIF9fTlJfZmxvY2sJCQkJNzMKK19fU1lTQ0FMTChfX05SX2Zsb2NrLCBzeXNfZmxvY2spCisjZGVmaW5lIF9fTlJfZnN5bmMJCQkJNzQKK19fU1lTQ0FMTChfX05SX2ZzeW5jLCBzeXNfZnN5bmMpCisjZGVmaW5lIF9fTlJfZmRhdGFzeW5jCQkJCTc1CitfX1NZU0NBTEwoX19OUl9mZGF0YXN5bmMsIHN5c19mZGF0YXN5bmMpCisjZGVmaW5lIF9fTlJfdHJ1bmNhdGUJCQkJNzYKK19fU1lTQ0FMTChfX05SX3RydW5jYXRlLCBzeXNfdHJ1bmNhdGUpCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlCQkJCTc3CitfX1NZU0NBTEwoX19OUl9mdHJ1bmNhdGUsIHN5c19mdHJ1bmNhdGUpCisjZGVmaW5lIF9fTlJfZ2V0ZGVudHMJCQkJNzgKK19fU1lTQ0FMTChfX05SX2dldGRlbnRzLCBzeXNfZ2V0ZGVudHMpCisjZGVmaW5lIF9fTlJfZ2V0Y3dkCQkJCTc5CitfX1NZU0NBTEwoX19OUl9nZXRjd2QsIHN5c19nZXRjd2QpCisKKyNkZWZpbmUgX19OUl9jaGRpcgkJCQk4MAorX19TWVNDQUxMKF9fTlJfY2hkaXIsIHN5c19jaGRpcikKKyNkZWZpbmUgX19OUl9mY2hkaXIJCQkJODEKK19fU1lTQ0FMTChfX05SX2ZjaGRpciwgc3lzX2ZjaGRpcikKKyNkZWZpbmUgX19OUl9yZW5hbWUJCQkJODIKK19fU1lTQ0FMTChfX05SX3JlbmFtZSwgc3lzX3JlbmFtZSkKKyNkZWZpbmUgX19OUl9ta2RpcgkJCQk4MworX19TWVNDQUxMKF9fTlJfbWtkaXIsIHN5c19ta2RpcikKKyNkZWZpbmUgX19OUl9ybWRpcgkJCQk4NAorX19TWVNDQUxMKF9fTlJfcm1kaXIsIHN5c19ybWRpcikKKyNkZWZpbmUgX19OUl9jcmVhdAkJCQk4NQorX19TWVNDQUxMKF9fTlJfY3JlYXQsIHN5c19jcmVhdCkKKyNkZWZpbmUgX19OUl9saW5rCQkJCTg2CitfX1NZU0NBTEwoX19OUl9saW5rLCBzeXNfbGluaykKKyNkZWZpbmUgX19OUl91bmxpbmsJCQkJODcKK19fU1lTQ0FMTChfX05SX3VubGluaywgc3lzX3VubGluaykKKworI2RlZmluZSBfX05SX3N5bWxpbmsJCQkJODgKK19fU1lTQ0FMTChfX05SX3N5bWxpbmssIHN5c19zeW1saW5rKQorI2RlZmluZSBfX05SX3JlYWRsaW5rCQkJCTg5CitfX1NZU0NBTEwoX19OUl9yZWFkbGluaywgc3lzX3JlYWRsaW5rKQorI2RlZmluZSBfX05SX2NobW9kCQkJCTkwCitfX1NZU0NBTEwoX19OUl9jaG1vZCwgc3lzX2NobW9kKQorI2RlZmluZSBfX05SX2ZjaG1vZAkJCQk5MQorX19TWVNDQUxMKF9fTlJfZmNobW9kLCBzeXNfZmNobW9kKQorI2RlZmluZSBfX05SX2Nob3duCQkJCTkyCitfX1NZU0NBTEwoX19OUl9jaG93biwgc3lzX2Nob3duKQorI2RlZmluZSBfX05SX2ZjaG93bgkJCQk5MworX19TWVNDQUxMKF9fTlJfZmNob3duLCBzeXNfZmNob3duKQorI2RlZmluZSBfX05SX2xjaG93bgkJCQk5NAorX19TWVNDQUxMKF9fTlJfbGNob3duLCBzeXNfbGNob3duKQorI2RlZmluZSBfX05SX3VtYXNrCQkJCTk1CitfX1NZU0NBTEwoX19OUl91bWFzaywgc3lzX3VtYXNrKQorCisjZGVmaW5lIF9fTlJfZ2V0dGltZW9mZGF5CQkJOTYKK19fU1lTQ0FMTChfX05SX2dldHRpbWVvZmRheSwgc3lzX2dldHRpbWVvZmRheSkKKyNkZWZpbmUgX19OUl9nZXRybGltaXQJCQkJOTcKK19fU1lTQ0FMTChfX05SX2dldHJsaW1pdCwgc3lzX2dldHJsaW1pdCkKKyNkZWZpbmUgX19OUl9nZXRydXNhZ2UJCQkJOTgKK19fU1lTQ0FMTChfX05SX2dldHJ1c2FnZSwgc3lzX2dldHJ1c2FnZSkKKyNkZWZpbmUgX19OUl9zeXNpbmZvCQkJCTk5CitfX1NZU0NBTEwoX19OUl9zeXNpbmZvLCBzeXNfc3lzaW5mbykKKyNkZWZpbmUgX19OUl90aW1lcwkJCQkxMDAKK19fU1lTQ0FMTChfX05SX3RpbWVzLCBzeXNfdGltZXMpCisjZGVmaW5lIF9fTlJfcHRyYWNlCQkJCTEwMQorX19TWVNDQUxMKF9fTlJfcHRyYWNlLCBzeXNfcHRyYWNlKQorI2RlZmluZSBfX05SX2dldHVpZAkJCQkxMDIKK19fU1lTQ0FMTChfX05SX2dldHVpZCwgc3lzX2dldHVpZCkKKyNkZWZpbmUgX19OUl9zeXNsb2cJCQkJMTAzCitfX1NZU0NBTEwoX19OUl9zeXNsb2csIHN5c19zeXNsb2cpCisKKy8qIGF0IHRoZSB2ZXJ5IGVuZCB0aGUgc3R1ZmYgdGhhdCBuZXZlciBydW5zIGR1cmluZyB0aGUgYmVuY2htYXJrcyAqLworI2RlZmluZSBfX05SX2dldGdpZAkJCQkxMDQKK19fU1lTQ0FMTChfX05SX2dldGdpZCwgc3lzX2dldGdpZCkKKyNkZWZpbmUgX19OUl9zZXR1aWQJCQkJMTA1CitfX1NZU0NBTEwoX19OUl9zZXR1aWQsIHN5c19zZXR1aWQpCisjZGVmaW5lIF9fTlJfc2V0Z2lkCQkJCTEwNgorX19TWVNDQUxMKF9fTlJfc2V0Z2lkLCBzeXNfc2V0Z2lkKQorI2RlZmluZSBfX05SX2dldGV1aWQJCQkJMTA3CitfX1NZU0NBTEwoX19OUl9nZXRldWlkLCBzeXNfZ2V0ZXVpZCkKKyNkZWZpbmUgX19OUl9nZXRlZ2lkCQkJCTEwOAorX19TWVNDQUxMKF9fTlJfZ2V0ZWdpZCwgc3lzX2dldGVnaWQpCisjZGVmaW5lIF9fTlJfc2V0cGdpZAkJCQkxMDkKK19fU1lTQ0FMTChfX05SX3NldHBnaWQsIHN5c19zZXRwZ2lkKQorI2RlZmluZSBfX05SX2dldHBwaWQJCQkJMTEwCitfX1NZU0NBTEwoX19OUl9nZXRwcGlkLCBzeXNfZ2V0cHBpZCkKKyNkZWZpbmUgX19OUl9nZXRwZ3JwCQkJCTExMQorX19TWVNDQUxMKF9fTlJfZ2V0cGdycCwgc3lzX2dldHBncnApCisKKyNkZWZpbmUgX19OUl9zZXRzaWQJCQkJMTEyCitfX1NZU0NBTEwoX19OUl9zZXRzaWQsIHN5c19zZXRzaWQpCisjZGVmaW5lIF9fTlJfc2V0cmV1aWQJCQkJMTEzCitfX1NZU0NBTEwoX19OUl9zZXRyZXVpZCwgc3lzX3NldHJldWlkKQorI2RlZmluZSBfX05SX3NldHJlZ2lkCQkJCTExNAorX19TWVNDQUxMKF9fTlJfc2V0cmVnaWQsIHN5c19zZXRyZWdpZCkKKyNkZWZpbmUgX19OUl9nZXRncm91cHMJCQkJMTE1CitfX1NZU0NBTEwoX19OUl9nZXRncm91cHMsIHN5c19nZXRncm91cHMpCisjZGVmaW5lIF9fTlJfc2V0Z3JvdXBzCQkJCTExNgorX19TWVNDQUxMKF9fTlJfc2V0Z3JvdXBzLCBzeXNfc2V0Z3JvdXBzKQorI2RlZmluZSBfX05SX3NldHJlc3VpZAkJCQkxMTcKK19fU1lTQ0FMTChfX05SX3NldHJlc3VpZCwgc3lzX3NldHJlc3VpZCkKKyNkZWZpbmUgX19OUl9nZXRyZXN1aWQJCQkJMTE4CitfX1NZU0NBTEwoX19OUl9nZXRyZXN1aWQsIHN5c19nZXRyZXN1aWQpCisjZGVmaW5lIF9fTlJfc2V0cmVzZ2lkCQkJCTExOQorX19TWVNDQUxMKF9fTlJfc2V0cmVzZ2lkLCBzeXNfc2V0cmVzZ2lkKQorCisjZGVmaW5lIF9fTlJfZ2V0cmVzZ2lkCQkJCTEyMAorX19TWVNDQUxMKF9fTlJfZ2V0cmVzZ2lkLCBzeXNfZ2V0cmVzZ2lkKQorI2RlZmluZSBfX05SX2dldHBnaWQJCQkJMTIxCitfX1NZU0NBTEwoX19OUl9nZXRwZ2lkLCBzeXNfZ2V0cGdpZCkKKyNkZWZpbmUgX19OUl9zZXRmc3VpZAkJCQkxMjIKK19fU1lTQ0FMTChfX05SX3NldGZzdWlkLCBzeXNfc2V0ZnN1aWQpCisjZGVmaW5lIF9fTlJfc2V0ZnNnaWQJCQkJMTIzCitfX1NZU0NBTEwoX19OUl9zZXRmc2dpZCwgc3lzX3NldGZzZ2lkKQorI2RlZmluZSBfX05SX2dldHNpZAkJCQkxMjQKK19fU1lTQ0FMTChfX05SX2dldHNpZCwgc3lzX2dldHNpZCkKKyNkZWZpbmUgX19OUl9jYXBnZXQJCQkJMTI1CitfX1NZU0NBTEwoX19OUl9jYXBnZXQsIHN5c19jYXBnZXQpCisjZGVmaW5lIF9fTlJfY2Fwc2V0CQkJCTEyNgorX19TWVNDQUxMKF9fTlJfY2Fwc2V0LCBzeXNfY2Fwc2V0KQorCisjZGVmaW5lIF9fTlJfcnRfc2lncGVuZGluZwkJCTEyNworX19TWVNDQUxMKF9fTlJfcnRfc2lncGVuZGluZywgc3lzX3J0X3NpZ3BlbmRpbmcpCisjZGVmaW5lIF9fTlJfcnRfc2lndGltZWR3YWl0CQkJMTI4CitfX1NZU0NBTEwoX19OUl9ydF9zaWd0aW1lZHdhaXQsIHN5c19ydF9zaWd0aW1lZHdhaXQpCisjZGVmaW5lIF9fTlJfcnRfc2lncXVldWVpbmZvCQkJMTI5CitfX1NZU0NBTEwoX19OUl9ydF9zaWdxdWV1ZWluZm8sIHN5c19ydF9zaWdxdWV1ZWluZm8pCisjZGVmaW5lIF9fTlJfcnRfc2lnc3VzcGVuZAkJCTEzMAorX19TWVNDQUxMKF9fTlJfcnRfc2lnc3VzcGVuZCwgc3lzX3J0X3NpZ3N1c3BlbmQpCisjZGVmaW5lIF9fTlJfc2lnYWx0c3RhY2sJCQkxMzEKK19fU1lTQ0FMTChfX05SX3NpZ2FsdHN0YWNrLCBzdHViX3NpZ2FsdHN0YWNrKQorI2RlZmluZSBfX05SX3V0aW1lCQkJCTEzMgorX19TWVNDQUxMKF9fTlJfdXRpbWUsIHN5c191dGltZSkKKyNkZWZpbmUgX19OUl9ta25vZAkJCQkxMzMKK19fU1lTQ0FMTChfX05SX21rbm9kLCBzeXNfbWtub2QpCisKKy8qIE9ubHkgbmVlZGVkIGZvciBhLm91dCAqLworI2RlZmluZSBfX05SX3VzZWxpYgkJCQkxMzQKK19fU1lTQ0FMTChfX05SX3VzZWxpYiwgc3lzX25pX3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfcGVyc29uYWxpdHkJCQkxMzUKK19fU1lTQ0FMTChfX05SX3BlcnNvbmFsaXR5LCBzeXNfcGVyc29uYWxpdHkpCisKKyNkZWZpbmUgX19OUl91c3RhdAkJCQkxMzYKK19fU1lTQ0FMTChfX05SX3VzdGF0LCBzeXNfdXN0YXQpCisjZGVmaW5lIF9fTlJfc3RhdGZzCQkJCTEzNworX19TWVNDQUxMKF9fTlJfc3RhdGZzLCBzeXNfc3RhdGZzKQorI2RlZmluZSBfX05SX2ZzdGF0ZnMJCQkJMTM4CitfX1NZU0NBTEwoX19OUl9mc3RhdGZzLCBzeXNfZnN0YXRmcykKKyNkZWZpbmUgX19OUl9zeXNmcwkJCQkxMzkKK19fU1lTQ0FMTChfX05SX3N5c2ZzLCBzeXNfc3lzZnMpCisKKyNkZWZpbmUgX19OUl9nZXRwcmlvcml0eQkJCTE0MAorX19TWVNDQUxMKF9fTlJfZ2V0cHJpb3JpdHksIHN5c19nZXRwcmlvcml0eSkKKyNkZWZpbmUgX19OUl9zZXRwcmlvcml0eQkJCTE0MQorX19TWVNDQUxMKF9fTlJfc2V0cHJpb3JpdHksIHN5c19zZXRwcmlvcml0eSkKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRwYXJhbQkJCTE0MgorX19TWVNDQUxMKF9fTlJfc2NoZWRfc2V0cGFyYW0sIHN5c19zY2hlZF9zZXRwYXJhbSkKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRwYXJhbQkJCTE0MworX19TWVNDQUxMKF9fTlJfc2NoZWRfZ2V0cGFyYW0sIHN5c19zY2hlZF9nZXRwYXJhbSkKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIJCQkxNDQKK19fU1lTQ0FMTChfX05SX3NjaGVkX3NldHNjaGVkdWxlciwgc3lzX3NjaGVkX3NldHNjaGVkdWxlcikKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRzY2hlZHVsZXIJCQkxNDUKK19fU1lTQ0FMTChfX05SX3NjaGVkX2dldHNjaGVkdWxlciwgc3lzX3NjaGVkX2dldHNjaGVkdWxlcikKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWF4CQkxNDYKK19fU1lTQ0FMTChfX05SX3NjaGVkX2dldF9wcmlvcml0eV9tYXgsIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4KQorI2RlZmluZSBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9taW4JCTE0NworX19TWVNDQUxMKF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiwgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4pCisjZGVmaW5lIF9fTlJfc2NoZWRfcnJfZ2V0X2ludGVydmFsCQkxNDgKK19fU1lTQ0FMTChfX05SX3NjaGVkX3JyX2dldF9pbnRlcnZhbCwgc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbCkKKworI2RlZmluZSBfX05SX21sb2NrCQkJCTE0OQorX19TWVNDQUxMKF9fTlJfbWxvY2ssIHN5c19tbG9jaykKKyNkZWZpbmUgX19OUl9tdW5sb2NrCQkJCTE1MAorX19TWVNDQUxMKF9fTlJfbXVubG9jaywgc3lzX211bmxvY2spCisjZGVmaW5lIF9fTlJfbWxvY2thbGwJCQkJMTUxCitfX1NZU0NBTEwoX19OUl9tbG9ja2FsbCwgc3lzX21sb2NrYWxsKQorI2RlZmluZSBfX05SX211bmxvY2thbGwJCQkJMTUyCitfX1NZU0NBTEwoX19OUl9tdW5sb2NrYWxsLCBzeXNfbXVubG9ja2FsbCkKKworI2RlZmluZSBfX05SX3ZoYW5ndXAJCQkJMTUzCitfX1NZU0NBTEwoX19OUl92aGFuZ3VwLCBzeXNfdmhhbmd1cCkKKworI2RlZmluZSBfX05SX21vZGlmeV9sZHQJCQkJMTU0CitfX1NZU0NBTEwoX19OUl9tb2RpZnlfbGR0LCBzeXNfbW9kaWZ5X2xkdCkKKworI2RlZmluZSBfX05SX3Bpdm90X3Jvb3QJCQkJMTU1CitfX1NZU0NBTEwoX19OUl9waXZvdF9yb290LCBzeXNfcGl2b3Rfcm9vdCkKKworI2RlZmluZSBfX05SX19zeXNjdGwJCQkJMTU2CitfX1NZU0NBTEwoX19OUl9fc3lzY3RsLCBzeXNfc3lzY3RsKQorCisjZGVmaW5lIF9fTlJfcHJjdGwJCQkJMTU3CitfX1NZU0NBTEwoX19OUl9wcmN0bCwgc3lzX3ByY3RsKQorI2RlZmluZSBfX05SX2FyY2hfcHJjdGwJCQkJMTU4CitfX1NZU0NBTEwoX19OUl9hcmNoX3ByY3RsLCBzeXNfYXJjaF9wcmN0bCkKKworI2RlZmluZSBfX05SX2FkanRpbWV4CQkJCTE1OQorX19TWVNDQUxMKF9fTlJfYWRqdGltZXgsIHN5c19hZGp0aW1leCkKKworI2RlZmluZSBfX05SX3NldHJsaW1pdAkJCQkxNjAKK19fU1lTQ0FMTChfX05SX3NldHJsaW1pdCwgc3lzX3NldHJsaW1pdCkKKworI2RlZmluZSBfX05SX2Nocm9vdAkJCQkxNjEKK19fU1lTQ0FMTChfX05SX2Nocm9vdCwgc3lzX2Nocm9vdCkKKworI2RlZmluZSBfX05SX3N5bmMJCQkJMTYyCitfX1NZU0NBTEwoX19OUl9zeW5jLCBzeXNfc3luYykKKworI2RlZmluZSBfX05SX2FjY3QJCQkJMTYzCitfX1NZU0NBTEwoX19OUl9hY2N0LCBzeXNfYWNjdCkKKworI2RlZmluZSBfX05SX3NldHRpbWVvZmRheQkJCTE2NAorX19TWVNDQUxMKF9fTlJfc2V0dGltZW9mZGF5LCBzeXNfc2V0dGltZW9mZGF5KQorCisjZGVmaW5lIF9fTlJfbW91bnQJCQkJMTY1CitfX1NZU0NBTEwoX19OUl9tb3VudCwgc3lzX21vdW50KQorI2RlZmluZSBfX05SX3Vtb3VudDIJCQkJMTY2CitfX1NZU0NBTEwoX19OUl91bW91bnQyLCBzeXNfdW1vdW50KQorCisjZGVmaW5lIF9fTlJfc3dhcG9uCQkJCTE2NworX19TWVNDQUxMKF9fTlJfc3dhcG9uLCBzeXNfc3dhcG9uKQorI2RlZmluZSBfX05SX3N3YXBvZmYJCQkJMTY4CitfX1NZU0NBTEwoX19OUl9zd2Fwb2ZmLCBzeXNfc3dhcG9mZikKKworI2RlZmluZSBfX05SX3JlYm9vdAkJCQkxNjkKK19fU1lTQ0FMTChfX05SX3JlYm9vdCwgc3lzX3JlYm9vdCkKKworI2RlZmluZSBfX05SX3NldGhvc3RuYW1lCQkJMTcwCitfX1NZU0NBTEwoX19OUl9zZXRob3N0bmFtZSwgc3lzX3NldGhvc3RuYW1lKQorI2RlZmluZSBfX05SX3NldGRvbWFpbm5hbWUJCQkxNzEKK19fU1lTQ0FMTChfX05SX3NldGRvbWFpbm5hbWUsIHN5c19zZXRkb21haW5uYW1lKQorCisjZGVmaW5lIF9fTlJfaW9wbAkJCQkxNzIKK19fU1lTQ0FMTChfX05SX2lvcGwsIHN0dWJfaW9wbCkKKyNkZWZpbmUgX19OUl9pb3Blcm0JCQkJMTczCitfX1NZU0NBTEwoX19OUl9pb3Blcm0sIHN5c19pb3Blcm0pCisKKyNkZWZpbmUgX19OUl9jcmVhdGVfbW9kdWxlCQkJMTc0CitfX1NZU0NBTEwoX19OUl9jcmVhdGVfbW9kdWxlLCBzeXNfbmlfc3lzY2FsbCkKKyNkZWZpbmUgX19OUl9pbml0X21vZHVsZQkJCTE3NQorX19TWVNDQUxMKF9fTlJfaW5pdF9tb2R1bGUsIHN5c19pbml0X21vZHVsZSkKKyNkZWZpbmUgX19OUl9kZWxldGVfbW9kdWxlCQkJMTc2CitfX1NZU0NBTEwoX19OUl9kZWxldGVfbW9kdWxlLCBzeXNfZGVsZXRlX21vZHVsZSkKKyNkZWZpbmUgX19OUl9nZXRfa2VybmVsX3N5bXMJCQkxNzcKK19fU1lTQ0FMTChfX05SX2dldF9rZXJuZWxfc3ltcywgc3lzX25pX3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfcXVlcnlfbW9kdWxlCQkJMTc4CitfX1NZU0NBTEwoX19OUl9xdWVyeV9tb2R1bGUsIHN5c19uaV9zeXNjYWxsKQorCisjZGVmaW5lIF9fTlJfcXVvdGFjdGwJCQkJMTc5CitfX1NZU0NBTEwoX19OUl9xdW90YWN0bCwgc3lzX3F1b3RhY3RsKQorCisjZGVmaW5lIF9fTlJfbmZzc2VydmN0bAkJCQkxODAKK19fU1lTQ0FMTChfX05SX25mc3NlcnZjdGwsIHN5c19uaV9zeXNjYWxsKQorCisvKiByZXNlcnZlZCBmb3IgTGlTL1NUUkVBTVMgKi8KKyNkZWZpbmUgX19OUl9nZXRwbXNnCQkJCTE4MQorX19TWVNDQUxMKF9fTlJfZ2V0cG1zZywgc3lzX25pX3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfcHV0cG1zZwkJCQkxODIKK19fU1lTQ0FMTChfX05SX3B1dHBtc2csIHN5c19uaV9zeXNjYWxsKQorCisvKiByZXNlcnZlZCBmb3IgQUZTICovCisjZGVmaW5lIF9fTlJfYWZzX3N5c2NhbGwJCQkxODMKK19fU1lTQ0FMTChfX05SX2Fmc19zeXNjYWxsLCBzeXNfbmlfc3lzY2FsbCkKKworLyogcmVzZXJ2ZWQgZm9yIHR1eCAqLworI2RlZmluZSBfX05SX3R1eGNhbGwJCQkJMTg0CitfX1NZU0NBTEwoX19OUl90dXhjYWxsLCBzeXNfbmlfc3lzY2FsbCkKKworI2RlZmluZSBfX05SX3NlY3VyaXR5CQkJCTE4NQorX19TWVNDQUxMKF9fTlJfc2VjdXJpdHksIHN5c19uaV9zeXNjYWxsKQorCisjZGVmaW5lIF9fTlJfZ2V0dGlkCQkJCTE4NgorX19TWVNDQUxMKF9fTlJfZ2V0dGlkLCBzeXNfZ2V0dGlkKQorCisjZGVmaW5lIF9fTlJfcmVhZGFoZWFkCQkJCTE4NworX19TWVNDQUxMKF9fTlJfcmVhZGFoZWFkLCBzeXNfcmVhZGFoZWFkKQorI2RlZmluZSBfX05SX3NldHhhdHRyCQkJCTE4OAorX19TWVNDQUxMKF9fTlJfc2V0eGF0dHIsIHN5c19zZXR4YXR0cikKKyNkZWZpbmUgX19OUl9sc2V0eGF0dHIJCQkJMTg5CitfX1NZU0NBTEwoX19OUl9sc2V0eGF0dHIsIHN5c19sc2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfZnNldHhhdHRyCQkJCTE5MAorX19TWVNDQUxMKF9fTlJfZnNldHhhdHRyLCBzeXNfZnNldHhhdHRyKQorI2RlZmluZSBfX05SX2dldHhhdHRyCQkJCTE5MQorX19TWVNDQUxMKF9fTlJfZ2V0eGF0dHIsIHN5c19nZXR4YXR0cikKKyNkZWZpbmUgX19OUl9sZ2V0eGF0dHIJCQkJMTkyCitfX1NZU0NBTEwoX19OUl9sZ2V0eGF0dHIsIHN5c19sZ2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfZmdldHhhdHRyCQkJCTE5MworX19TWVNDQUxMKF9fTlJfZmdldHhhdHRyLCBzeXNfZmdldHhhdHRyKQorI2RlZmluZSBfX05SX2xpc3R4YXR0cgkJCQkxOTQKK19fU1lTQ0FMTChfX05SX2xpc3R4YXR0ciwgc3lzX2xpc3R4YXR0cikKKyNkZWZpbmUgX19OUl9sbGlzdHhhdHRyCQkJCTE5NQorX19TWVNDQUxMKF9fTlJfbGxpc3R4YXR0ciwgc3lzX2xsaXN0eGF0dHIpCisjZGVmaW5lIF9fTlJfZmxpc3R4YXR0cgkJCQkxOTYKK19fU1lTQ0FMTChfX05SX2ZsaXN0eGF0dHIsIHN5c19mbGlzdHhhdHRyKQorI2RlZmluZSBfX05SX3JlbW92ZXhhdHRyCQkJMTk3CitfX1NZU0NBTEwoX19OUl9yZW1vdmV4YXR0ciwgc3lzX3JlbW92ZXhhdHRyKQorI2RlZmluZSBfX05SX2xyZW1vdmV4YXR0cgkJCTE5OAorX19TWVNDQUxMKF9fTlJfbHJlbW92ZXhhdHRyLCBzeXNfbHJlbW92ZXhhdHRyKQorI2RlZmluZSBfX05SX2ZyZW1vdmV4YXR0cgkJCTE5OQorX19TWVNDQUxMKF9fTlJfZnJlbW92ZXhhdHRyLCBzeXNfZnJlbW92ZXhhdHRyKQorI2RlZmluZSBfX05SX3RraWxsCQkJCTIwMAorX19TWVNDQUxMKF9fTlJfdGtpbGwsIHN5c190a2lsbCkKKyNkZWZpbmUgX19OUl90aW1lCQkJCTIwMQorX19TWVNDQUxMKF9fTlJfdGltZSwgc3lzX3RpbWUpCisjZGVmaW5lIF9fTlJfZnV0ZXgJCQkJMjAyCitfX1NZU0NBTEwoX19OUl9mdXRleCwgc3lzX2Z1dGV4KQorI2RlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5CQkJMjAzCitfX1NZU0NBTEwoX19OUl9zY2hlZF9zZXRhZmZpbml0eSwgc3lzX3NjaGVkX3NldGFmZmluaXR5KQorI2RlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5CQkJMjA0CitfX1NZU0NBTEwoX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgc3lzX3NjaGVkX2dldGFmZmluaXR5KQorI2RlZmluZSBfX05SX3NldF90aHJlYWRfYXJlYQkJCTIwNQorX19TWVNDQUxMKF9fTlJfc2V0X3RocmVhZF9hcmVhLCBzeXNfbmlfc3lzY2FsbCkJLyogdXNlIGFyY2hfcHJjdGwgKi8KKyNkZWZpbmUgX19OUl9pb19zZXR1cAkJCQkyMDYKK19fU1lTQ0FMTChfX05SX2lvX3NldHVwLCBzeXNfaW9fc2V0dXApCisjZGVmaW5lIF9fTlJfaW9fZGVzdHJveQkJCQkyMDcKK19fU1lTQ0FMTChfX05SX2lvX2Rlc3Ryb3ksIHN5c19pb19kZXN0cm95KQorI2RlZmluZSBfX05SX2lvX2dldGV2ZW50cwkJCTIwOAorX19TWVNDQUxMKF9fTlJfaW9fZ2V0ZXZlbnRzLCBzeXNfaW9fZ2V0ZXZlbnRzKQorI2RlZmluZSBfX05SX2lvX3N1Ym1pdAkJCQkyMDkKK19fU1lTQ0FMTChfX05SX2lvX3N1Ym1pdCwgc3lzX2lvX3N1Ym1pdCkKKyNkZWZpbmUgX19OUl9pb19jYW5jZWwJCQkJMjEwCitfX1NZU0NBTEwoX19OUl9pb19jYW5jZWwsIHN5c19pb19jYW5jZWwpCisjZGVmaW5lIF9fTlJfZ2V0X3RocmVhZF9hcmVhCQkJMjExCitfX1NZU0NBTEwoX19OUl9nZXRfdGhyZWFkX2FyZWEsIHN5c19uaV9zeXNjYWxsKQkvKiB1c2UgYXJjaF9wcmN0bCAqLworI2RlZmluZSBfX05SX2xvb2t1cF9kY29va2llCQkJMjEyCitfX1NZU0NBTEwoX19OUl9sb29rdXBfZGNvb2tpZSwgc3lzX2xvb2t1cF9kY29va2llKQorI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZQkJCTIxMworX19TWVNDQUxMKF9fTlJfZXBvbGxfY3JlYXRlLCBzeXNfZXBvbGxfY3JlYXRlKQorI2RlZmluZSBfX05SX2Vwb2xsX2N0bF9vbGQJCQkyMTQKK19fU1lTQ0FMTChfX05SX2Vwb2xsX2N0bF9vbGQsIHN5c19uaV9zeXNjYWxsKQorI2RlZmluZSBfX05SX2Vwb2xsX3dhaXRfb2xkCQkJMjE1CitfX1NZU0NBTEwoX19OUl9lcG9sbF93YWl0X29sZCwgc3lzX25pX3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfcmVtYXBfZmlsZV9wYWdlcwkJCTIxNgorX19TWVNDQUxMKF9fTlJfcmVtYXBfZmlsZV9wYWdlcywgc3lzX3JlbWFwX2ZpbGVfcGFnZXMpCisjZGVmaW5lIF9fTlJfZ2V0ZGVudHM2NAkJCQkyMTcKK19fU1lTQ0FMTChfX05SX2dldGRlbnRzNjQsIHN5c19nZXRkZW50czY0KQorI2RlZmluZSBfX05SX3NldF90aWRfYWRkcmVzcwkJCTIxOAorX19TWVNDQUxMKF9fTlJfc2V0X3RpZF9hZGRyZXNzLCBzeXNfc2V0X3RpZF9hZGRyZXNzKQorI2RlZmluZSBfX05SX3Jlc3RhcnRfc3lzY2FsbAkJCTIxOQorX19TWVNDQUxMKF9fTlJfcmVzdGFydF9zeXNjYWxsLCBzeXNfcmVzdGFydF9zeXNjYWxsKQorI2RlZmluZSBfX05SX3NlbXRpbWVkb3AJCQkJMjIwCitfX1NZU0NBTEwoX19OUl9zZW10aW1lZG9wLCBzeXNfc2VtdGltZWRvcCkKKyNkZWZpbmUgX19OUl9mYWR2aXNlNjQJCQkJMjIxCitfX1NZU0NBTEwoX19OUl9mYWR2aXNlNjQsIHN5c19mYWR2aXNlNjQpCisjZGVmaW5lIF9fTlJfdGltZXJfY3JlYXRlCQkJMjIyCitfX1NZU0NBTEwoX19OUl90aW1lcl9jcmVhdGUsIHN5c190aW1lcl9jcmVhdGUpCisjZGVmaW5lIF9fTlJfdGltZXJfc2V0dGltZQkJCTIyMworX19TWVNDQUxMKF9fTlJfdGltZXJfc2V0dGltZSwgc3lzX3RpbWVyX3NldHRpbWUpCisjZGVmaW5lIF9fTlJfdGltZXJfZ2V0dGltZQkJCTIyNAorX19TWVNDQUxMKF9fTlJfdGltZXJfZ2V0dGltZSwgc3lzX3RpbWVyX2dldHRpbWUpCisjZGVmaW5lIF9fTlJfdGltZXJfZ2V0b3ZlcnJ1bgkJCTIyNQorX19TWVNDQUxMKF9fTlJfdGltZXJfZ2V0b3ZlcnJ1biwgc3lzX3RpbWVyX2dldG92ZXJydW4pCisjZGVmaW5lIF9fTlJfdGltZXJfZGVsZXRlCQkJMjI2CitfX1NZU0NBTEwoX19OUl90aW1lcl9kZWxldGUsIHN5c190aW1lcl9kZWxldGUpCisjZGVmaW5lIF9fTlJfY2xvY2tfc2V0dGltZQkJCTIyNworX19TWVNDQUxMKF9fTlJfY2xvY2tfc2V0dGltZSwgc3lzX2Nsb2NrX3NldHRpbWUpCisjZGVmaW5lIF9fTlJfY2xvY2tfZ2V0dGltZQkJCTIyOAorX19TWVNDQUxMKF9fTlJfY2xvY2tfZ2V0dGltZSwgc3lzX2Nsb2NrX2dldHRpbWUpCisjZGVmaW5lIF9fTlJfY2xvY2tfZ2V0cmVzCQkJMjI5CitfX1NZU0NBTEwoX19OUl9jbG9ja19nZXRyZXMsIHN5c19jbG9ja19nZXRyZXMpCisjZGVmaW5lIF9fTlJfY2xvY2tfbmFub3NsZWVwCQkJMjMwCitfX1NZU0NBTEwoX19OUl9jbG9ja19uYW5vc2xlZXAsIHN5c19jbG9ja19uYW5vc2xlZXApCisjZGVmaW5lIF9fTlJfZXhpdF9ncm91cAkJCQkyMzEKK19fU1lTQ0FMTChfX05SX2V4aXRfZ3JvdXAsIHN5c19leGl0X2dyb3VwKQorI2RlZmluZSBfX05SX2Vwb2xsX3dhaXQJCQkJMjMyCitfX1NZU0NBTEwoX19OUl9lcG9sbF93YWl0LCBzeXNfZXBvbGxfd2FpdCkKKyNkZWZpbmUgX19OUl9lcG9sbF9jdGwJCQkJMjMzCitfX1NZU0NBTEwoX19OUl9lcG9sbF9jdGwsIHN5c19lcG9sbF9jdGwpCisjZGVmaW5lIF9fTlJfdGdraWxsCQkJCTIzNAorX19TWVNDQUxMKF9fTlJfdGdraWxsLCBzeXNfdGdraWxsKQorI2RlZmluZSBfX05SX3V0aW1lcwkJCQkyMzUKK19fU1lTQ0FMTChfX05SX3V0aW1lcywgc3lzX3V0aW1lcykKKyNkZWZpbmUgX19OUl92c2VydmVyCQkJCTIzNgorX19TWVNDQUxMKF9fTlJfdnNlcnZlciwgc3lzX25pX3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfbWJpbmQJCQkJMjM3CitfX1NZU0NBTEwoX19OUl9tYmluZCwgc3lzX21iaW5kKQorI2RlZmluZSBfX05SX3NldF9tZW1wb2xpY3kJCQkyMzgKK19fU1lTQ0FMTChfX05SX3NldF9tZW1wb2xpY3ksIHN5c19zZXRfbWVtcG9saWN5KQorI2RlZmluZSBfX05SX2dldF9tZW1wb2xpY3kJCQkyMzkKK19fU1lTQ0FMTChfX05SX2dldF9tZW1wb2xpY3ksIHN5c19nZXRfbWVtcG9saWN5KQorI2RlZmluZSBfX05SX21xX29wZW4JCQkJMjQwCitfX1NZU0NBTEwoX19OUl9tcV9vcGVuLCBzeXNfbXFfb3BlbikKKyNkZWZpbmUgX19OUl9tcV91bmxpbmsJCQkJMjQxCitfX1NZU0NBTEwoX19OUl9tcV91bmxpbmssIHN5c19tcV91bmxpbmspCisjZGVmaW5lIF9fTlJfbXFfdGltZWRzZW5kCQkJMjQyCitfX1NZU0NBTEwoX19OUl9tcV90aW1lZHNlbmQsIHN5c19tcV90aW1lZHNlbmQpCisjZGVmaW5lIF9fTlJfbXFfdGltZWRyZWNlaXZlCQkJMjQzCitfX1NZU0NBTEwoX19OUl9tcV90aW1lZHJlY2VpdmUsIHN5c19tcV90aW1lZHJlY2VpdmUpCisjZGVmaW5lIF9fTlJfbXFfbm90aWZ5CQkJCTI0NAorX19TWVNDQUxMKF9fTlJfbXFfbm90aWZ5LCBzeXNfbXFfbm90aWZ5KQorI2RlZmluZSBfX05SX21xX2dldHNldGF0dHIJCQkyNDUKK19fU1lTQ0FMTChfX05SX21xX2dldHNldGF0dHIsIHN5c19tcV9nZXRzZXRhdHRyKQorI2RlZmluZSBfX05SX2tleGVjX2xvYWQJCQkJMjQ2CitfX1NZU0NBTEwoX19OUl9rZXhlY19sb2FkLCBzeXNfa2V4ZWNfbG9hZCkKKyNkZWZpbmUgX19OUl93YWl0aWQJCQkJMjQ3CitfX1NZU0NBTEwoX19OUl93YWl0aWQsIHN5c193YWl0aWQpCisjZGVmaW5lIF9fTlJfYWRkX2tleQkJCQkyNDgKK19fU1lTQ0FMTChfX05SX2FkZF9rZXksIHN5c19hZGRfa2V5KQorI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CQkJMjQ5CitfX1NZU0NBTEwoX19OUl9yZXF1ZXN0X2tleSwgc3lzX3JlcXVlc3Rfa2V5KQorI2RlZmluZSBfX05SX2tleWN0bAkJCQkyNTAKK19fU1lTQ0FMTChfX05SX2tleWN0bCwgc3lzX2tleWN0bCkKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkJCTI1MQorX19TWVNDQUxMKF9fTlJfaW9wcmlvX3NldCwgc3lzX2lvcHJpb19zZXQpCisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJCQkyNTIKK19fU1lTQ0FMTChfX05SX2lvcHJpb19nZXQsIHN5c19pb3ByaW9fZ2V0KQorI2RlZmluZSBfX05SX2lub3RpZnlfaW5pdAkJCTI1MworX19TWVNDQUxMKF9fTlJfaW5vdGlmeV9pbml0LCBzeXNfaW5vdGlmeV9pbml0KQorI2RlZmluZSBfX05SX2lub3RpZnlfYWRkX3dhdGNoCQkJMjU0CitfX1NZU0NBTEwoX19OUl9pbm90aWZ5X2FkZF93YXRjaCwgc3lzX2lub3RpZnlfYWRkX3dhdGNoKQorI2RlZmluZSBfX05SX2lub3RpZnlfcm1fd2F0Y2gJCQkyNTUKK19fU1lTQ0FMTChfX05SX2lub3RpZnlfcm1fd2F0Y2gsIHN5c19pbm90aWZ5X3JtX3dhdGNoKQorI2RlZmluZSBfX05SX21pZ3JhdGVfcGFnZXMJCQkyNTYKK19fU1lTQ0FMTChfX05SX21pZ3JhdGVfcGFnZXMsIHN5c19taWdyYXRlX3BhZ2VzKQorI2RlZmluZSBfX05SX29wZW5hdAkJCQkyNTcKK19fU1lTQ0FMTChfX05SX29wZW5hdCwgc3lzX29wZW5hdCkKKyNkZWZpbmUgX19OUl9ta2RpcmF0CQkJCTI1OAorX19TWVNDQUxMKF9fTlJfbWtkaXJhdCwgc3lzX21rZGlyYXQpCisjZGVmaW5lIF9fTlJfbWtub2RhdAkJCQkyNTkKK19fU1lTQ0FMTChfX05SX21rbm9kYXQsIHN5c19ta25vZGF0KQorI2RlZmluZSBfX05SX2ZjaG93bmF0CQkJCTI2MAorX19TWVNDQUxMKF9fTlJfZmNob3duYXQsIHN5c19mY2hvd25hdCkKKyNkZWZpbmUgX19OUl9mdXRpbWVzYXQJCQkJMjYxCitfX1NZU0NBTEwoX19OUl9mdXRpbWVzYXQsIHN5c19mdXRpbWVzYXQpCisjZGVmaW5lIF9fTlJfbmV3ZnN0YXRhdAkJCQkyNjIKK19fU1lTQ0FMTChfX05SX25ld2ZzdGF0YXQsIHN5c19uZXdmc3RhdGF0KQorI2RlZmluZSBfX05SX3VubGlua2F0CQkJCTI2MworX19TWVNDQUxMKF9fTlJfdW5saW5rYXQsIHN5c191bmxpbmthdCkKKyNkZWZpbmUgX19OUl9yZW5hbWVhdAkJCQkyNjQKK19fU1lTQ0FMTChfX05SX3JlbmFtZWF0LCBzeXNfcmVuYW1lYXQpCisjZGVmaW5lIF9fTlJfbGlua2F0CQkJCTI2NQorX19TWVNDQUxMKF9fTlJfbGlua2F0LCBzeXNfbGlua2F0KQorI2RlZmluZSBfX05SX3N5bWxpbmthdAkJCQkyNjYKK19fU1lTQ0FMTChfX05SX3N5bWxpbmthdCwgc3lzX3N5bWxpbmthdCkKKyNkZWZpbmUgX19OUl9yZWFkbGlua2F0CQkJCTI2NworX19TWVNDQUxMKF9fTlJfcmVhZGxpbmthdCwgc3lzX3JlYWRsaW5rYXQpCisjZGVmaW5lIF9fTlJfZmNobW9kYXQJCQkJMjY4CitfX1NZU0NBTEwoX19OUl9mY2htb2RhdCwgc3lzX2ZjaG1vZGF0KQorI2RlZmluZSBfX05SX2ZhY2Nlc3NhdAkJCQkyNjkKK19fU1lTQ0FMTChfX05SX2ZhY2Nlc3NhdCwgc3lzX2ZhY2Nlc3NhdCkKKyNkZWZpbmUgX19OUl9wc2VsZWN0NgkJCQkyNzAKK19fU1lTQ0FMTChfX05SX3BzZWxlY3Q2LCBzeXNfcHNlbGVjdDYpCisjZGVmaW5lIF9fTlJfcHBvbGwJCQkJMjcxCitfX1NZU0NBTEwoX19OUl9wcG9sbCwJc3lzX3Bwb2xsKQorI2RlZmluZSBfX05SX3Vuc2hhcmUJCQkJMjcyCitfX1NZU0NBTEwoX19OUl91bnNoYXJlLAlzeXNfdW5zaGFyZSkKKyNkZWZpbmUgX19OUl9zZXRfcm9idXN0X2xpc3QJCQkyNzMKK19fU1lTQ0FMTChfX05SX3NldF9yb2J1c3RfbGlzdCwgc3lzX3NldF9yb2J1c3RfbGlzdCkKKyNkZWZpbmUgX19OUl9nZXRfcm9idXN0X2xpc3QJCQkyNzQKK19fU1lTQ0FMTChfX05SX2dldF9yb2J1c3RfbGlzdCwgc3lzX2dldF9yb2J1c3RfbGlzdCkKKyNkZWZpbmUgX19OUl9zcGxpY2UJCQkJMjc1CitfX1NZU0NBTEwoX19OUl9zcGxpY2UsIHN5c19zcGxpY2UpCisjZGVmaW5lIF9fTlJfdGVlCQkJCTI3NgorX19TWVNDQUxMKF9fTlJfdGVlLCBzeXNfdGVlKQorI2RlZmluZSBfX05SX3N5bmNfZmlsZV9yYW5nZQkJCTI3NworX19TWVNDQUxMKF9fTlJfc3luY19maWxlX3JhbmdlLCBzeXNfc3luY19maWxlX3JhbmdlKQorI2RlZmluZSBfX05SX3Ztc3BsaWNlCQkJCTI3OAorX19TWVNDQUxMKF9fTlJfdm1zcGxpY2UsIHN5c192bXNwbGljZSkKKyNkZWZpbmUgX19OUl9tb3ZlX3BhZ2VzCQkJCTI3OQorX19TWVNDQUxMKF9fTlJfbW92ZV9wYWdlcywgc3lzX21vdmVfcGFnZXMpCisjZGVmaW5lIF9fTlJfdXRpbWVuc2F0CQkJCTI4MAorX19TWVNDQUxMKF9fTlJfdXRpbWVuc2F0LCBzeXNfdXRpbWVuc2F0KQorI2RlZmluZSBfX05SX2Vwb2xsX3B3YWl0CQkJMjgxCitfX1NZU0NBTEwoX19OUl9lcG9sbF9wd2FpdCwgc3lzX2Vwb2xsX3B3YWl0KQorI2RlZmluZSBfX05SX3NpZ25hbGZkCQkJCTI4MgorX19TWVNDQUxMKF9fTlJfc2lnbmFsZmQsIHN5c19zaWduYWxmZCkKKyNkZWZpbmUgX19OUl90aW1lcmZkX2NyZWF0ZQkJCTI4MworX19TWVNDQUxMKF9fTlJfdGltZXJmZF9jcmVhdGUsIHN5c190aW1lcmZkX2NyZWF0ZSkKKyNkZWZpbmUgX19OUl9ldmVudGZkCQkJCTI4NAorX19TWVNDQUxMKF9fTlJfZXZlbnRmZCwgc3lzX2V2ZW50ZmQpCisjZGVmaW5lIF9fTlJfZmFsbG9jYXRlCQkJCTI4NQorX19TWVNDQUxMKF9fTlJfZmFsbG9jYXRlLCBzeXNfZmFsbG9jYXRlKQorI2RlZmluZSBfX05SX3RpbWVyZmRfc2V0dGltZQkJCTI4NgorX19TWVNDQUxMKF9fTlJfdGltZXJmZF9zZXR0aW1lLCBzeXNfdGltZXJmZF9zZXR0aW1lKQorI2RlZmluZSBfX05SX3RpbWVyZmRfZ2V0dGltZQkJCTI4NworX19TWVNDQUxMKF9fTlJfdGltZXJmZF9nZXR0aW1lLCBzeXNfdGltZXJmZF9nZXR0aW1lKQorI2RlZmluZSBfX05SX2FjY2VwdDQJCQkJMjg4CitfX1NZU0NBTEwoX19OUl9hY2NlcHQ0LCBzeXNfYWNjZXB0NCkKKyNkZWZpbmUgX19OUl9zaWduYWxmZDQJCQkJMjg5CitfX1NZU0NBTEwoX19OUl9zaWduYWxmZDQsIHN5c19zaWduYWxmZDQpCisjZGVmaW5lIF9fTlJfZXZlbnRmZDIJCQkJMjkwCitfX1NZU0NBTEwoX19OUl9ldmVudGZkMiwgc3lzX2V2ZW50ZmQyKQorI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZTEJCQkyOTEKK19fU1lTQ0FMTChfX05SX2Vwb2xsX2NyZWF0ZTEsIHN5c19lcG9sbF9jcmVhdGUxKQorI2RlZmluZSBfX05SX2R1cDMJCQkJMjkyCitfX1NZU0NBTEwoX19OUl9kdXAzLCBzeXNfZHVwMykKKyNkZWZpbmUgX19OUl9waXBlMgkJCQkyOTMKK19fU1lTQ0FMTChfX05SX3BpcGUyLCBzeXNfcGlwZTIpCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0MQkJCTI5NAorX19TWVNDQUxMKF9fTlJfaW5vdGlmeV9pbml0MSwgc3lzX2lub3RpZnlfaW5pdDEpCisjZGVmaW5lIF9fTlJfcHJlYWR2CQkJCTI5NQorX19TWVNDQUxMKF9fTlJfcHJlYWR2LCBzeXNfcHJlYWR2KQorI2RlZmluZSBfX05SX3B3cml0ZXYJCQkJMjk2CitfX1NZU0NBTEwoX19OUl9wd3JpdGV2LCBzeXNfcHdyaXRldikKKyNkZWZpbmUgX19OUl9ydF90Z3NpZ3F1ZXVlaW5mbwkJCTI5NworX19TWVNDQUxMKF9fTlJfcnRfdGdzaWdxdWV1ZWluZm8sIHN5c19ydF90Z3NpZ3F1ZXVlaW5mbykKKyNkZWZpbmUgX19OUl9wZXJmX2V2ZW50X29wZW4JCQkyOTgKK19fU1lTQ0FMTChfX05SX3BlcmZfZXZlbnRfb3Blbiwgc3lzX3BlcmZfZXZlbnRfb3BlbikKKyNkZWZpbmUgX19OUl9yZWN2bW1zZwkJCQkyOTkKK19fU1lTQ0FMTChfX05SX3JlY3ZtbXNnLCBzeXNfcmVjdm1tc2cpCisjZGVmaW5lIF9fTlJfZmFub3RpZnlfaW5pdAkJCTMwMAorX19TWVNDQUxMKF9fTlJfZmFub3RpZnlfaW5pdCwgc3lzX2Zhbm90aWZ5X2luaXQpCisjZGVmaW5lIF9fTlJfZmFub3RpZnlfbWFyawkJCTMwMQorX19TWVNDQUxMKF9fTlJfZmFub3RpZnlfbWFyaywgc3lzX2Zhbm90aWZ5X21hcmspCisjZGVmaW5lIF9fTlJfcHJsaW1pdDY0CQkJCTMwMgorX19TWVNDQUxMKF9fTlJfcHJsaW1pdDY0LCBzeXNfcHJsaW1pdDY0KQorI2RlZmluZSBfX05SX25hbWVfdG9faGFuZGxlX2F0CQkJMzAzCitfX1NZU0NBTEwoX19OUl9uYW1lX3RvX2hhbmRsZV9hdCwgc3lzX25hbWVfdG9faGFuZGxlX2F0KQorI2RlZmluZSBfX05SX29wZW5fYnlfaGFuZGxlX2F0CQkJMzA0CitfX1NZU0NBTEwoX19OUl9vcGVuX2J5X2hhbmRsZV9hdCwgc3lzX29wZW5fYnlfaGFuZGxlX2F0KQorI2RlZmluZSBfX05SX2Nsb2NrX2FkanRpbWUJCQkzMDUKK19fU1lTQ0FMTChfX05SX2Nsb2NrX2FkanRpbWUsIHN5c19jbG9ja19hZGp0aW1lKQorI2RlZmluZSBfX05SX3N5bmNmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA2CitfX1NZU0NBTEwoX19OUl9zeW5jZnMsIHN5c19zeW5jZnMpCisjZGVmaW5lIF9fTlJfc2VuZG1tc2cJCQkJMzA3CitfX1NZU0NBTEwoX19OUl9zZW5kbW1zZywgc3lzX3NlbmRtbXNnKQorI2RlZmluZSBfX05SX3NldG5zCQkJCTMwOAorX19TWVNDQUxMKF9fTlJfc2V0bnMsIHN5c19zZXRucykKKyNkZWZpbmUgX19OUl9nZXRjcHUJCQkJMzA5CitfX1NZU0NBTEwoX19OUl9nZXRjcHUsIHN5c19nZXRjcHUpCisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV9yZWFkdgkJCTMxMAorX19TWVNDQUxMKF9fTlJfcHJvY2Vzc192bV9yZWFkdiwgc3lzX3Byb2Nlc3Nfdm1fcmVhZHYpCisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYJCQkzMTEKK19fU1lTQ0FMTChfX05SX3Byb2Nlc3Nfdm1fd3JpdGV2LCBzeXNfcHJvY2Vzc192bV93cml0ZXYpCisKKyNpZm5kZWYgX19OT19TVFVCUworI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgorI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfU1RBVAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfQUxBUk0KKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0dFVEhPU1ROQU1FCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19QQVVTRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0dFVE1BU0sKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR05BTAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVVRJTUUKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1dBSVRQSUQKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NPQ0tFVENBTEwKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0ZBRFZJU0U2NAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUUEdSUAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfTExTRUVLCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19OSUNFCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19PTERfR0VUUkxJTUlUCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19PTERfVU5BTUUKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX09MRFVNT1VOVAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUEVORElORworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUFJPQ01BU0sKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR0FDVElPTgorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHU1VTUEVORAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVElNRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX1RJTUUKKyNlbmRpZgkvKiBfX05PX1NUVUJTICovCisKKworI2VuZGlmIC8qIF9BU01fWDg2X1VOSVNURF82NF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS92bTg2LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS92bTg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExZGExMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3ZtODYuaApAQCAtMCwwICsxLDEyOSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9WTTg2X0gKKyNkZWZpbmUgX0FTTV9YODZfVk04Nl9ICisKKy8qCisgKiBJJ20gZ3Vlc3NpbmcgYXQgdGhlIFZJRi9WSVAgZmxhZyB1c2FnZSwgYnV0IGhvcGUgdGhhdCB0aGlzIGlzIGhvdworICogdGhlIFBlbnRpdW0gdXNlcyB0aGVtLiBMaW51eCB3aWxsIHJldHVybiBmcm9tIHZtODYgbW9kZSB3aGVuIGJvdGgKKyAqIFZJRiBhbmQgVklQIGlzIHNldC4KKyAqCisgKiBPbiBhIFBlbnRpdW0sIHdlIGNvdWxkIHByb2JhYmx5IG9wdGltaXplIHRoZSB2aXJ0dWFsIGZsYWdzIGRpcmVjdGx5CisgKiBpbiB0aGUgZWZsYWdzIHJlZ2lzdGVyIGluc3RlYWQgb2YgZG9pbmcgaXQgImJ5IGhhbmQiIGluIHZmbGFncy4uLgorICoKKyAqIExpbnVzCisgKi8KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZmxhZ3MuaD4KKworI2RlZmluZSBCSU9TU0VHCQkweDBmMDAwCisKKyNkZWZpbmUgQ1BVXzA4NgkJMAorI2RlZmluZSBDUFVfMTg2CQkxCisjZGVmaW5lIENQVV8yODYJCTIKKyNkZWZpbmUgQ1BVXzM4NgkJMworI2RlZmluZSBDUFVfNDg2CQk0CisjZGVmaW5lIENQVV81ODYJCTUKKworLyoKKyAqIFJldHVybiB2YWx1ZXMgZm9yIHRoZSAndm04NigpJyBzeXN0ZW0gY2FsbAorICovCisjZGVmaW5lIFZNODZfVFlQRShyZXR2YWwpCSgocmV0dmFsKSAmIDB4ZmYpCisjZGVmaW5lIFZNODZfQVJHKHJldHZhbCkJKChyZXR2YWwpID4+IDgpCisKKyNkZWZpbmUgVk04Nl9TSUdOQUwJMAkvKiByZXR1cm4gZHVlIHRvIHNpZ25hbCAqLworI2RlZmluZSBWTTg2X1VOS05PV04JMQkvKiB1bmhhbmRsZWQgR1AgZmF1bHQKKwkJCQkgICAtIElPLWluc3RydWN0aW9uIG9yIHNpbWlsYXIgKi8KKyNkZWZpbmUgVk04Nl9JTlR4CTIJLyogaW50My9pbnQgeCBpbnN0cnVjdGlvbiAoQVJHID0geCkgKi8KKyNkZWZpbmUgVk04Nl9TVEkJMwkvKiBzdGkvcG9wZi9pcmV0IGluc3RydWN0aW9uIGVuYWJsZWQKKwkJCQkgICB2aXJ0dWFsIGludGVycnVwdHMgKi8KKworLyoKKyAqIEFkZGl0aW9uYWwgcmV0dXJuIHZhbHVlcyB3aGVuIGludm9raW5nIG5ldyB2bTg2KCkKKyAqLworI2RlZmluZSBWTTg2X1BJQ1JFVFVSTgk0CS8qIHJldHVybiBkdWUgdG8gcGVuZGluZyBQSUMgcmVxdWVzdCAqLworI2RlZmluZSBWTTg2X1RSQVAJNgkvKiByZXR1cm4gZHVlIHRvIERPUy1kZWJ1Z2dlciByZXF1ZXN0ICovCisKKy8qCisgKiBmdW5jdGlvbiBjb2RlcyB3aGVuIGludm9raW5nIG5ldyB2bTg2KCkKKyAqLworI2RlZmluZSBWTTg2X1BMVVNfSU5TVEFMTF9DSEVDSwkwCisjZGVmaW5lIFZNODZfRU5URVIJCTEKKyNkZWZpbmUgVk04Nl9FTlRFUl9OT19CWVBBU1MJMgorI2RlZmluZQlWTTg2X1JFUVVFU1RfSVJRCTMKKyNkZWZpbmUgVk04Nl9GUkVFX0lSUQkJNAorI2RlZmluZSBWTTg2X0dFVF9JUlFfQklUUwk1CisjZGVmaW5lIFZNODZfR0VUX0FORF9SRVNFVF9JUlEJNgorCisvKgorICogVGhpcyBpcyB0aGUgc3RhY2stbGF5b3V0IHNlZW4gYnkgdGhlIHVzZXIgc3BhY2UgcHJvZ3JhbSB3aGVuIHdlIGhhdmUKKyAqIGRvbmUgYSB0cmFuc2xhdGlvbiBvZiAiU0FWRV9BTEwiIGZyb20gdm04NiBtb2RlLiBUaGUgcmVhbCBrZXJuZWwgbGF5b3V0CisgKiBpcyAna2VybmVsX3ZtODZfcmVncycgKHNlZSBiZWxvdykuCisgKi8KKworc3RydWN0IHZtODZfcmVncyB7CisvKgorICogbm9ybWFsIHJlZ3MsIHdpdGggc3BlY2lhbCBtZWFuaW5nIGZvciB0aGUgc2VnbWVudCBkZXNjcmlwdG9ycy4uCisgKi8KKwlsb25nIGVieDsKKwlsb25nIGVjeDsKKwlsb25nIGVkeDsKKwlsb25nIGVzaTsKKwlsb25nIGVkaTsKKwlsb25nIGVicDsKKwlsb25nIGVheDsKKwlsb25nIF9fbnVsbF9kczsKKwlsb25nIF9fbnVsbF9lczsKKwlsb25nIF9fbnVsbF9mczsKKwlsb25nIF9fbnVsbF9nczsKKwlsb25nIG9yaWdfZWF4OworCWxvbmcgZWlwOworCXVuc2lnbmVkIHNob3J0IGNzLCBfX2NzaDsKKwlsb25nIGVmbGFnczsKKwlsb25nIGVzcDsKKwl1bnNpZ25lZCBzaG9ydCBzcywgX19zc2g7CisvKgorICogdGhlc2UgYXJlIHNwZWNpZmljIHRvIHY4NiBtb2RlOgorICovCisJdW5zaWduZWQgc2hvcnQgZXMsIF9fZXNoOworCXVuc2lnbmVkIHNob3J0IGRzLCBfX2RzaDsKKwl1bnNpZ25lZCBzaG9ydCBmcywgX19mc2g7CisJdW5zaWduZWQgc2hvcnQgZ3MsIF9fZ3NoOworfTsKKworc3RydWN0IHJldmVjdG9yZWRfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIF9fbWFwWzhdOwkJCS8qIDI1NiBiaXRzICovCit9OworCitzdHJ1Y3Qgdm04Nl9zdHJ1Y3QgeworCXN0cnVjdCB2bTg2X3JlZ3MgcmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgc2NyZWVuX2JpdG1hcDsKKwl1bnNpZ25lZCBsb25nIGNwdV90eXBlOworCXN0cnVjdCByZXZlY3RvcmVkX3N0cnVjdCBpbnRfcmV2ZWN0b3JlZDsKKwlzdHJ1Y3QgcmV2ZWN0b3JlZF9zdHJ1Y3QgaW50MjFfcmV2ZWN0b3JlZDsKK307CisKKy8qCisgKiBmbGFncyBtYXNrcworICovCisjZGVmaW5lIFZNODZfU0NSRUVOX0JJVE1BUAkweDAwMDEKKworc3RydWN0IHZtODZwbHVzX2luZm9fc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGZvcmNlX3JldHVybl9mb3JfcGljOjE7CisJdW5zaWduZWQgbG9uZyB2bTg2ZGJnX2FjdGl2ZToxOyAgICAgICAvKiBmb3IgZGVidWdnZXIgKi8KKwl1bnNpZ25lZCBsb25nIHZtODZkYmdfVEZwZW5kaWc6MTsgICAgIC8qIGZvciBkZWJ1Z2dlciAqLworCXVuc2lnbmVkIGxvbmcgdW51c2VkOjI4OworCXVuc2lnbmVkIGxvbmcgaXNfdm04NnB1czoxOwkgICAgICAvKiBmb3Igdm04NiBpbnRlcm5hbCB1c2UgKi8KKwl1bnNpZ25lZCBjaGFyIHZtODZkYmdfaW50eHh0YWJbMzJdOyAgIC8qIGZvciBkZWJ1Z2dlciAqLworfTsKK3N0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgeworCXN0cnVjdCB2bTg2X3JlZ3MgcmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgc2NyZWVuX2JpdG1hcDsKKwl1bnNpZ25lZCBsb25nIGNwdV90eXBlOworCXN0cnVjdCByZXZlY3RvcmVkX3N0cnVjdCBpbnRfcmV2ZWN0b3JlZDsKKwlzdHJ1Y3QgcmV2ZWN0b3JlZF9zdHJ1Y3QgaW50MjFfcmV2ZWN0b3JlZDsKKwlzdHJ1Y3Qgdm04NnBsdXNfaW5mb19zdHJ1Y3Qgdm04NnBsdXM7Cit9OworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9WTTg2X0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3ZzeXNjYWxsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS92c3lzY2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjViYjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS92c3lzY2FsbC5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX0FTTV9YODZfVlNZU0NBTExfSAorI2RlZmluZSBfQVNNX1g4Nl9WU1lTQ0FMTF9ICisKK2VudW0gdnN5c2NhbGxfbnVtIHsKKwlfX05SX3ZnZXR0aW1lb2ZkYXksCisJX19OUl92dGltZSwKKwlfX05SX3ZnZXRjcHUsCit9OworCisjZGVmaW5lIFZTWVNDQUxMX1NUQVJUICgtMTBVTCA8PCAyMCkKKyNkZWZpbmUgVlNZU0NBTExfU0laRSAxMDI0CisjZGVmaW5lIFZTWVNDQUxMX0VORCAoLTJVTCA8PCAyMCkKKyNkZWZpbmUgVlNZU0NBTExfTUFQUEVEX1BBR0VTIDEKKyNkZWZpbmUgVlNZU0NBTExfQUREUih2c3lzY2FsbF9ucikgKFZTWVNDQUxMX1NUQVJUK1ZTWVNDQUxMX1NJWkUqKHZzeXNjYWxsX25yKSkKKworCisjZW5kaWYgLyogX0FTTV9YODZfVlNZU0NBTExfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2Eub3V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvYS5vdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmI1MmMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2Eub3V0LmgKQEAgLTAsMCArMSwzIEBACisjaWZuZGVmIF9fQV9PVVRfR05VX0hfXworIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2Eub3V0Lmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxhLm91dC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2J5dGVzd2FwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvYnl0ZXN3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGZiNzg1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2J5dGVzd2FwLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qIE1hY3JvcyB0byBzd2FwIHRoZSBvcmRlciBvZiBieXRlcyBpbiBpbnRlZ2VyIHZhbHVlcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMjAwMCwgMjAwMiwgMjAwMywgMjAwNiwgMjAwNywgMjAwOCwgMjAxMCwgMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfQllURVNXQVBfSCAmJiAhZGVmaW5lZCBfTkVUSU5FVF9JTl9IICYmICFkZWZpbmVkIF9FTkRJQU5fSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2J5dGVzd2FwLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxieXRlc3dhcC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX0JZVEVTV0FQX0gKKyNkZWZpbmUgX0JJVFNfQllURVNXQVBfSCAxCisKKy8qIFN3YXAgYnl0ZXMgaW4gMTYgYml0IHZhbHVlLiAgKi8KKyNkZWZpbmUgX19ic3dhcF9jb25zdGFudF8xNih4KSBcCisgICAgICgodW5zaWduZWQgc2hvcnQgaW50KSAoKCgoeCkgPj4gOCkgJiAweGZmKSB8ICgoKHgpICYgMHhmZikgPDwgOCkpKQorCisjaWZkZWYgX19HTlVDX18KKyMgaWYgX19HTlVDX18gPj0gMgorIyAgZGVmaW5lIF9fYnN3YXBfMTYoeCkgXAorICAgICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgICAoeyByZWdpc3RlciB1bnNpZ25lZCBzaG9ydCBpbnQgX192LCBfX3ggPSAodW5zaWduZWQgc2hvcnQgaW50KSAoeCk7ICAgICBcCisJIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX194KSkJCQkJICAgICAgXAorCSAgIF9fdiA9IF9fYnN3YXBfY29uc3RhbnRfMTYgKF9feCk7CQkJCSAgICAgIFwKKwkgZWxzZQkJCQkJCQkJICAgICAgXAorCSAgIF9fYXNtX18gKCJyb3J3ICQ4LCAldzAiCQkJCQkgICAgICBcCisJCSAgICA6ICI9ciIgKF9fdikJCQkJCSAgICAgIFwKKwkJICAgIDogIjAiIChfX3gpCQkJCQkJICAgICAgXAorCQkgICAgOiAiY2MiKTsJCQkJCQkgICAgICBcCisJIF9fdjsgfSkpCisjIGVsc2UKKy8qIFRoaXMgaXMgYmV0dGVyIHRoYW4gbm90aGluZy4gICovCisjICBkZWZpbmUgX19ic3dhcF8xNih4KSBcCisgICAgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICAgICh7IHJlZ2lzdGVyIHVuc2lnbmVkIHNob3J0IGludCBfX3ggPSAodW5zaWduZWQgc2hvcnQgaW50KSAoeCk7CSAgICAgIFwKKwkgX19ic3dhcF9jb25zdGFudF8xNiAoX194KTsgfSkpCisjIGVuZGlmCisjZWxzZQorc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIHNob3J0IGludAorX19ic3dhcF8xNiAodW5zaWduZWQgc2hvcnQgaW50IF9fYnN4KQoreworICByZXR1cm4gX19ic3dhcF9jb25zdGFudF8xNiAoX19ic3gpOworfQorI2VuZGlmCisKKy8qIFN3YXAgYnl0ZXMgaW4gMzIgYml0IHZhbHVlLiAgKi8KKyNkZWZpbmUgX19ic3dhcF9jb25zdGFudF8zMih4KSBcCisgICAgICgoKCh4KSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHgpICYgMHgwMGZmMDAwMCkgPj4gIDgpIHwJCSAgICAgIFwKKyAgICAgICgoKHgpICYgMHgwMDAwZmYwMCkgPDwgIDgpIHwgKCgoeCkgJiAweDAwMDAwMGZmKSA8PCAyNCkpCisKKyNpZmRlZiBfX0dOVUNfXworIyBpZiBfX0dOVUNfXyA+PSAyCisvKiBUbyBzd2FwIHRoZSBieXRlcyBpbiBhIHdvcmQgdGhlIGk0ODYgcHJvY2Vzc29ycyBhbmQgdXAgcHJvdmlkZSB0aGUKKyAgIGBic3dhcCcgb3Bjb2RlLiAgT24gaTM4NiB3ZSBoYXZlIHRvIHVzZSB0aHJlZSBpbnN0cnVjdGlvbnMuICAqLworIyAgaWYgIWRlZmluZWQgX19pNDg2X18gJiYgIWRlZmluZWQgX19wZW50aXVtX18gJiYgIWRlZmluZWQgX19wZW50aXVtcHJvX18gXAorICAgICAgJiYgIWRlZmluZWQgX19wZW50aXVtNF9fICYmICFkZWZpbmVkIF9fazhfXyAmJiAhZGVmaW5lZCBfX2F0aGxvbl9fIFwKKyAgICAgICYmICFkZWZpbmVkIF9fazZfXyAmJiAhZGVmaW5lZCBfX25vY29uYV9fICYmICFkZWZpbmVkIF9fY29yZTJfXyBcCisgICAgICAmJiAhZGVmaW5lZCBfX2dlb2RlX18gJiYgIWRlZmluZWQgX19hbWRmYW0xMF9fCisjICAgZGVmaW5lIF9fYnN3YXBfMzIoeCkJCQkJCQkgICAgICBcCisgICAgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICAgICh7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCBfX3YsIF9feCA9ICh4KTsJCQkJICAgICAgXAorCSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9feCkpCQkJCSAgICAgIFwKKwkgICBfX3YgPSBfX2Jzd2FwX2NvbnN0YW50XzMyIChfX3gpOwkJCQkgICAgICBcCisJIGVsc2UJCQkJCQkJCSAgICAgIFwKKwkgICBfX2FzbV9fICgicm9ydyAkOCwgJXcwOyIJCQkJCSAgICAgIFwKKwkJICAgICJyb3JsICQxNiwgJTA7IgkJCQkJICAgICAgXAorCQkgICAgInJvcncgJDgsICV3MCIJCQkJCSAgICAgIFwKKwkJICAgIDogIj1yIiAoX192KQkJCQkJICAgICAgXAorCQkgICAgOiAiMCIgKF9feCkJCQkJCQkgICAgICBcCisJCSAgICA6ICJjYyIpOwkJCQkJCSAgICAgIFwKKwkgX192OyB9KSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19ic3dhcF8zMih4KSBcCisgICAgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICAgICh7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCBfX3YsIF9feCA9ICh4KTsJCQkJICAgICAgXAorCSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9feCkpCQkJCSAgICAgIFwKKwkgICBfX3YgPSBfX2Jzd2FwX2NvbnN0YW50XzMyIChfX3gpOwkJCQkgICAgICBcCisJIGVsc2UJCQkJCQkJCSAgICAgIFwKKwkgICBfX2FzbV9fICgiYnN3YXAgJTAiIDogIj1yIiAoX192KSA6ICIwIiAoX194KSk7CQkgICAgICBcCisJIF9fdjsgfSkpCisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgX19ic3dhcF8zMih4KSBcCisgICAgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICAgICh7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCBfX3ggPSAoeCk7IF9fYnN3YXBfY29uc3RhbnRfMzIgKF9feCk7IH0pKQorIyBlbmRpZgorI2Vsc2UKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fYnN3YXBfMzIgKHVuc2lnbmVkIGludCBfX2JzeCkKK3sKKyAgcmV0dXJuIF9fYnN3YXBfY29uc3RhbnRfMzIgKF9fYnN4KTsKK30KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKy8qIFN3YXAgYnl0ZXMgaW4gNjQgYml0IHZhbHVlLiAgKi8KKyMgZGVmaW5lIF9fYnN3YXBfY29uc3RhbnRfNjQoeCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKCgoeCkgJiAweGZmMDAwMDAwMDAwMDAwMDB1bGwpID4+IDU2KQkJICAgICAgXAorCQkgICAgIHwgKCgoeCkgJiAweDAwZmYwMDAwMDAwMDAwMDB1bGwpID4+IDQwKQkJICAgICAgXAorCQkgICAgIHwgKCgoeCkgJiAweDAwMDBmZjAwMDAwMDAwMDB1bGwpID4+IDI0KQkJICAgICAgXAorCQkgICAgIHwgKCgoeCkgJiAweDAwMDAwMGZmMDAwMDAwMDB1bGwpID4+IDgpCQkgICAgICBcCisJCSAgICAgfCAoKCh4KSAmIDB4MDAwMDAwMDBmZjAwMDAwMHVsbCkgPDwgOCkJCSAgICAgIFwKKwkJICAgICB8ICgoKHgpICYgMHgwMDAwMDAwMDAwZmYwMDAwdWxsKSA8PCAyNCkJCSAgICAgIFwKKwkJICAgICB8ICgoKHgpICYgMHgwMDAwMDAwMDAwMDBmZjAwdWxsKSA8PCA0MCkJCSAgICAgIFwKKwkJICAgICB8ICgoKHgpICYgMHgwMDAwMDAwMDAwMDAwMGZmdWxsKSA8PCA1NikpKQorCisjIGRlZmluZSBfX2Jzd2FwXzY0KHgpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgICAgKHsgdW5pb24geyBfX2V4dGVuc2lvbl9fIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19sbDsJCSAgICAgIFwKKwkJIHVuc2lnbmVkIGxvbmcgaW50IF9fbFsyXTsgfSBfX3csIF9fcjsJCQkgICAgICBcCisJIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoeCkpCQkJCQkgICAgICBcCisJICAgX19yLl9fbGwgPSBfX2Jzd2FwX2NvbnN0YW50XzY0ICh4KTsJCQkJICAgICAgXAorCSBlbHNlCQkJCQkJCQkgICAgICBcCisJICAgewkJCQkJCQkJICAgICAgXAorCSAgICAgX193Ll9fbGwgPSAoeCk7CQkJCQkJICAgICAgXAorCSAgICAgX19yLl9fbFswXSA9IF9fYnN3YXBfMzIgKF9fdy5fX2xbMV0pOwkJCSAgICAgIFwKKwkgICAgIF9fci5fX2xbMV0gPSBfX2Jzd2FwXzMyIChfX3cuX19sWzBdKTsJCQkgICAgICBcCisJICAgfQkJCQkJCQkJICAgICAgXAorCSBfX3IuX19sbDsgfSkpCisjZW5kaWYKKworI2VuZGlmIC8qIF9CSVRTX0JZVEVTV0FQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9jbWF0aGNhbGxzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvY21hdGhjYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljN2ZkYmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvY21hdGhjYWxscy5oCkBAIC0wLDAgKzEsMTU5IEBACisvKiBQcm90b3R5cGUgZGVjbGFyYXRpb25zIGZvciBjb21wbGV4IG1hdGggZnVuY3Rpb25zOworICAgaGVscGVyIGZpbGUgZm9yIDxjb21wbGV4Lmg+LgorICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAyMDAxLCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBOT1RFOiBCZWNhdXNlIG9mIHRoZSBzcGVjaWFsIHdheSB0aGlzIGZpbGUgaXMgdXNlZCBieSA8Y29tcGxleC5oPiwgdGhpcworICAgZmlsZSBtdXN0IE5PVCBiZSBwcm90ZWN0ZWQgZnJvbSBtdWx0aXBsZSBpbmNsdXNpb24gYXMgaGVhZGVyIGZpbGVzCisgICB1c3VhbGx5IGFyZS4KKworICAgVGhpcyBmaWxlIHByb3ZpZGVzIHByb3RvdHlwZSBkZWNsYXJhdGlvbnMgZm9yIHRoZSBtYXRoIGZ1bmN0aW9ucy4KKyAgIE1vc3QgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCB1c2luZyB0aGUgbWFjcm86CisKKyAgIF9fTUFUSENBTEwgKE5BTUUsIChBUkdTLi4uKSk7CisKKyAgIFRoaXMgbWVhbnMgdGhlcmUgaXMgYSBmdW5jdGlvbiBgTkFNRScgcmV0dXJuaW5nIGBkb3VibGUnIGFuZCBhIGZ1bmN0aW9uCisgICBgTkFNRWYnIHJldHVybmluZyBgZmxvYXQnLiAgRWFjaCBwbGFjZSBgX01kb3VibGVfJyBhcHBlYXJzIGluIHRoZQorICAgcHJvdG90eXBlLCB0aGF0IGlzIGFjdHVhbGx5IGBkb3VibGUnIGluIHRoZSBwcm90b3R5cGUgZm9yIGBOQU1FJyBhbmQKKyAgIGBmbG9hdCcgaW4gdGhlIHByb3RvdHlwZSBmb3IgYE5BTUVmJy4gIFJlZW50cmFudCB2YXJpYW50IGZ1bmN0aW9ucyBhcmUKKyAgIGNhbGxlZCBgTkFNRV9yJyBhbmQgYE5BTUVmX3InLgorCisgICBGdW5jdGlvbnMgcmV0dXJuaW5nIG90aGVyIHR5cGVzIGxpa2UgYGludCcgYXJlIGRlY2xhcmVkIHVzaW5nIHRoZSBtYWNybzoKKworICAgX19NQVRIREVDTCAoVFlQRSwgTkFNRSwgKEFSR1MuLi4pKTsKKworICAgVGhpcyBpcyBqdXN0IGxpa2UgX19NQVRIQ0FMTCBidXQgZm9yIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGBUWVBFJworICAgaW5zdGVhZCBvZiBgX01kb3VibGVfJy4gIEluIGFsbCBvZiB0aGVzZSBjYXNlcywgdGhlcmUgaXMgc3RpbGwKKyAgIGJvdGggYSBgTkFNRScgYW5kIGEgYE5BTUVmJyB0aGF0IHRha2VzIGBmbG9hdCcgYXJndW1lbnRzLiAgKi8KKworI2lmbmRlZiBfQ09NUExFWF9ICisjZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9jbWF0aGNhbGxzLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxjb21wbGV4Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNkZWZpbmUgX01kb3VibGVfY29tcGxleF8gX01kb3VibGVfIF9Db21wbGV4CisKKworLyogVHJpZ29ub21ldHJpYyBmdW5jdGlvbnMuICAqLworCisvKiBBcmMgY29zaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2Fjb3MsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIEFyYyBzaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2FzaW4sIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIEFyYyB0YW5nZW50IG9mIFouICAqLworX19NQVRIQ0FMTCAoY2F0YW4sIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogQ29zaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2NvcywgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworLyogU2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNzaW4sIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIFRhbmdlbnQgb2YgWi4gICovCitfX01BVEhDQUxMIChjdGFuLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKworLyogSHlwZXJib2xpYyBmdW5jdGlvbnMuICAqLworCisvKiBIeXBlcmJvbGljIGFyYyBjb3NpbmUgb2YgWi4gICovCitfX01BVEhDQUxMIChjYWNvc2gsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIEh5cGVyYm9saWMgYXJjIHNpbmUgb2YgWi4gICovCitfX01BVEhDQUxMIChjYXNpbmgsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIEh5cGVyYm9saWMgYXJjIHRhbmdlbnQgb2YgWi4gICovCitfX01BVEhDQUxMIChjYXRhbmgsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogSHlwZXJib2xpYyBjb3NpbmUgb2YgWi4gICovCitfX01BVEhDQUxMIChjY29zaCwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworLyogSHlwZXJib2xpYyBzaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY3NpbmgsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIEh5cGVyYm9saWMgdGFuZ2VudCBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGN0YW5oLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKworLyogRXhwb25lbnRpYWwgYW5kIGxvZ2FyaXRobWljIGZ1bmN0aW9ucy4gICovCisKKy8qIEV4cG9uZW50aWFsIGZ1bmN0aW9uIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2V4cCwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisvKiBOYXR1cmFsIGxvZ2FyaXRobSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNsb2csIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhlIGJhc2UgMTAgbG9nYXJpdGhtIGlzIG5vdCBkZWZpbmVkIGJ5IHRoZSBzdGFuZGFyZCBidXQgdG8gaW1wbGVtZW50CisgICB0aGUgc3RhbmRhcmQgQysrIGxpYnJhcnkgaXQgaXMgaGFuZHkuICAqLworX19NQVRIQ0FMTCAoY2xvZzEwLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisjZW5kaWYKKworLyogUG93ZXIgZnVuY3Rpb25zLiAgKi8KKworLyogUmV0dXJuIFggdG8gdGhlIFkgcG93ZXIuICAqLworX19NQVRIQ0FMTCAoY3BvdywgKF9NZG91YmxlX2NvbXBsZXhfIF9feCwgX01kb3VibGVfY29tcGxleF8gX195KSk7CisKKy8qIFJldHVybiB0aGUgc3F1YXJlIHJvb3Qgb2YgWi4gICovCitfX01BVEhDQUxMIChjc3FydCwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisKKy8qIEFic29sdXRlIHZhbHVlLCBjb25qdWdhdGVzLCBhbmQgcHJvamVjdGlvbi4gICovCisKKy8qIEFic29sdXRlIHZhbHVlIG9mIFouICAqLworX19NQVRIREVDTCAoX01kb3VibGVfLGNhYnMsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogQXJndW1lbnQgdmFsdWUgb2YgWi4gICovCitfX01BVEhERUNMIChfTWRvdWJsZV8sY2FyZywgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisvKiBDb21wbGV4IGNvbmp1Z2F0ZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNvbmosIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogUHJvamVjdGlvbiBvZiBaIG9udG8gdGhlIFJpZW1hbm4gc3BoZXJlLiAgKi8KK19fTUFUSENBTEwgKGNwcm9qLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKworLyogRGVjb21wb3NpbmcgY29tcGxleCB2YWx1ZXMuICAqLworCisvKiBJbWFnaW5hcnkgcGFydCBvZiBaLiAgKi8KK19fTUFUSERFQ0wgKF9NZG91YmxlXyxjaW1hZywgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisvKiBSZWFsIHBhcnQgb2YgWi4gICovCitfX01BVEhERUNMIChfTWRvdWJsZV8sY3JlYWwsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworCisvKiBOb3cgc29tZSBvcHRpbWl6ZWQgdmVyc2lvbnMuICBHQ0MgaGFzIGhhbmR5IG5vdGF0aW9ucyBmb3IgdGhlc2UKKyAgIGZ1bmN0aW9ucy4gIFJlY2VudCBHQ0MgaGFuZGxlcyB0aGVzZSBhcyBidWlsdGluIGZ1bmN0aW9ucyBzbyBkb2VzCisgICBub3QgbmVlZCBpbmxpbmVzLiAgKi8KKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmICFfX0dOVUNfUFJFUkVRICgyLCA5NykgJiYgZGVmaW5lZCBfX09QVElNSVpFX18gXAorICAgICYmIGRlZmluZWQgX19leHRlcm5faW5saW5lCisKKy8qIEltYWdpbmFyeSBwYXJ0IG9mIFouICAqLworX19leHRlcm5faW5saW5lIF9NZG91YmxlXworX19NQVRIX1BSRUNOQU1FKGNpbWFnKSAoX01kb3VibGVfY29tcGxleF8gX196KSBfX1RIUk9XCit7CisgIHJldHVybiBfX2ltYWdfXyBfX3o7Cit9CisKKy8qIFJlYWwgcGFydCBvZiBaLiAgKi8KK19fZXh0ZXJuX2lubGluZSBfTWRvdWJsZV8KK19fTUFUSF9QUkVDTkFNRShjcmVhbCkgKF9NZG91YmxlX2NvbXBsZXhfIF9feikgX19USFJPVworeworICByZXR1cm4gX19yZWFsX18gX196OworfQorCisvKiBDb21wbGV4IGNvbmp1Z2F0ZSBvZiBaLiAgKi8KK19fZXh0ZXJuX2lubGluZSBfTWRvdWJsZV9jb21wbGV4XworX19NQVRIX1BSRUNOQU1FKGNvbmopIChfTWRvdWJsZV9jb21wbGV4XyBfX3opIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gfl9fejsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvY29uZm5hbWUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9jb25mbmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZmNhZmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvY29uZm5hbWUuaApAQCAtMCwwICsxLDY3NyBAQAorLyogYHN5c2NvbmYnLCBgcGF0aGNvbmYnLCBhbmQgYGNvbmZzdHInIE5BTUUgdmFsdWVzLiAgR2VuZXJpYyB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLDE5OTUtMTk5OCwyMDAwLDIwMDEsMjAwMywyMDA0LDIwMDcsMjAwOSwyMDEwCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfVU5JU1REX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9jb25mbmFtZS5oPiBkaXJlY3RseTsgaW5jbHVkZSA8dW5pc3RkLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFZhbHVlcyBmb3IgdGhlIE5BTUUgYXJndW1lbnQgdG8gYHBhdGhjb25mJyBhbmQgYGZwYXRoY29uZicuICAqLworZW51bQorICB7CisgICAgX1BDX0xJTktfTUFYLAorI2RlZmluZQlfUENfTElOS19NQVgJCQlfUENfTElOS19NQVgKKyAgICBfUENfTUFYX0NBTk9OLAorI2RlZmluZQlfUENfTUFYX0NBTk9OCQkJX1BDX01BWF9DQU5PTgorICAgIF9QQ19NQVhfSU5QVVQsCisjZGVmaW5lCV9QQ19NQVhfSU5QVVQJCQlfUENfTUFYX0lOUFVUCisgICAgX1BDX05BTUVfTUFYLAorI2RlZmluZQlfUENfTkFNRV9NQVgJCQlfUENfTkFNRV9NQVgKKyAgICBfUENfUEFUSF9NQVgsCisjZGVmaW5lCV9QQ19QQVRIX01BWAkJCV9QQ19QQVRIX01BWAorICAgIF9QQ19QSVBFX0JVRiwKKyNkZWZpbmUJX1BDX1BJUEVfQlVGCQkJX1BDX1BJUEVfQlVGCisgICAgX1BDX0NIT1dOX1JFU1RSSUNURUQsCisjZGVmaW5lCV9QQ19DSE9XTl9SRVNUUklDVEVECQlfUENfQ0hPV05fUkVTVFJJQ1RFRAorICAgIF9QQ19OT19UUlVOQywKKyNkZWZpbmUJX1BDX05PX1RSVU5DCQkJX1BDX05PX1RSVU5DCisgICAgX1BDX1ZESVNBQkxFLAorI2RlZmluZSBfUENfVkRJU0FCTEUJCQlfUENfVkRJU0FCTEUKKyAgICBfUENfU1lOQ19JTywKKyNkZWZpbmUJX1BDX1NZTkNfSU8JCQlfUENfU1lOQ19JTworICAgIF9QQ19BU1lOQ19JTywKKyNkZWZpbmUJX1BDX0FTWU5DX0lPCQkJX1BDX0FTWU5DX0lPCisgICAgX1BDX1BSSU9fSU8sCisjZGVmaW5lCV9QQ19QUklPX0lPCQkJX1BDX1BSSU9fSU8KKyAgICBfUENfU09DS19NQVhCVUYsCisjZGVmaW5lCV9QQ19TT0NLX01BWEJVRgkJCV9QQ19TT0NLX01BWEJVRgorICAgIF9QQ19GSUxFU0laRUJJVFMsCisjZGVmaW5lIF9QQ19GSUxFU0laRUJJVFMJCV9QQ19GSUxFU0laRUJJVFMKKyAgICBfUENfUkVDX0lOQ1JfWEZFUl9TSVpFLAorI2RlZmluZSBfUENfUkVDX0lOQ1JfWEZFUl9TSVpFCQlfUENfUkVDX0lOQ1JfWEZFUl9TSVpFCisgICAgX1BDX1JFQ19NQVhfWEZFUl9TSVpFLAorI2RlZmluZSBfUENfUkVDX01BWF9YRkVSX1NJWkUJCV9QQ19SRUNfTUFYX1hGRVJfU0laRQorICAgIF9QQ19SRUNfTUlOX1hGRVJfU0laRSwKKyNkZWZpbmUgX1BDX1JFQ19NSU5fWEZFUl9TSVpFCQlfUENfUkVDX01JTl9YRkVSX1NJWkUKKyAgICBfUENfUkVDX1hGRVJfQUxJR04sCisjZGVmaW5lIF9QQ19SRUNfWEZFUl9BTElHTgkJX1BDX1JFQ19YRkVSX0FMSUdOCisgICAgX1BDX0FMTE9DX1NJWkVfTUlOLAorI2RlZmluZSBfUENfQUxMT0NfU0laRV9NSU4JCV9QQ19BTExPQ19TSVpFX01JTgorICAgIF9QQ19TWU1MSU5LX01BWCwKKyNkZWZpbmUgX1BDX1NZTUxJTktfTUFYCQkJX1BDX1NZTUxJTktfTUFYCisgICAgX1BDXzJfU1lNTElOS1MKKyNkZWZpbmUgX1BDXzJfU1lNTElOS1MJCQlfUENfMl9TWU1MSU5LUworICB9OworCisvKiBWYWx1ZXMgZm9yIHRoZSBhcmd1bWVudCB0byBgc3lzY29uZicuICAqLworZW51bQorICB7CisgICAgX1NDX0FSR19NQVgsCisjZGVmaW5lCV9TQ19BUkdfTUFYCQkJX1NDX0FSR19NQVgKKyAgICBfU0NfQ0hJTERfTUFYLAorI2RlZmluZQlfU0NfQ0hJTERfTUFYCQkJX1NDX0NISUxEX01BWAorICAgIF9TQ19DTEtfVENLLAorI2RlZmluZQlfU0NfQ0xLX1RDSwkJCV9TQ19DTEtfVENLCisgICAgX1NDX05HUk9VUFNfTUFYLAorI2RlZmluZQlfU0NfTkdST1VQU19NQVgJCQlfU0NfTkdST1VQU19NQVgKKyAgICBfU0NfT1BFTl9NQVgsCisjZGVmaW5lCV9TQ19PUEVOX01BWAkJCV9TQ19PUEVOX01BWAorICAgIF9TQ19TVFJFQU1fTUFYLAorI2RlZmluZQlfU0NfU1RSRUFNX01BWAkJCV9TQ19TVFJFQU1fTUFYCisgICAgX1NDX1RaTkFNRV9NQVgsCisjZGVmaW5lCV9TQ19UWk5BTUVfTUFYCQkJX1NDX1RaTkFNRV9NQVgKKyAgICBfU0NfSk9CX0NPTlRST0wsCisjZGVmaW5lCV9TQ19KT0JfQ09OVFJPTAkJCV9TQ19KT0JfQ09OVFJPTAorICAgIF9TQ19TQVZFRF9JRFMsCisjZGVmaW5lCV9TQ19TQVZFRF9JRFMJCQlfU0NfU0FWRURfSURTCisgICAgX1NDX1JFQUxUSU1FX1NJR05BTFMsCisjZGVmaW5lCV9TQ19SRUFMVElNRV9TSUdOQUxTCQlfU0NfUkVBTFRJTUVfU0lHTkFMUworICAgIF9TQ19QUklPUklUWV9TQ0hFRFVMSU5HLAorI2RlZmluZQlfU0NfUFJJT1JJVFlfU0NIRURVTElORwkJX1NDX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyAgICBfU0NfVElNRVJTLAorI2RlZmluZQlfU0NfVElNRVJTCQkJX1NDX1RJTUVSUworICAgIF9TQ19BU1lOQ0hST05PVVNfSU8sCisjZGVmaW5lCV9TQ19BU1lOQ0hST05PVVNfSU8JCV9TQ19BU1lOQ0hST05PVVNfSU8KKyAgICBfU0NfUFJJT1JJVElaRURfSU8sCisjZGVmaW5lCV9TQ19QUklPUklUSVpFRF9JTwkJX1NDX1BSSU9SSVRJWkVEX0lPCisgICAgX1NDX1NZTkNIUk9OSVpFRF9JTywKKyNkZWZpbmUJX1NDX1NZTkNIUk9OSVpFRF9JTwkJX1NDX1NZTkNIUk9OSVpFRF9JTworICAgIF9TQ19GU1lOQywKKyNkZWZpbmUJX1NDX0ZTWU5DCQkJX1NDX0ZTWU5DCisgICAgX1NDX01BUFBFRF9GSUxFUywKKyNkZWZpbmUJX1NDX01BUFBFRF9GSUxFUwkJX1NDX01BUFBFRF9GSUxFUworICAgIF9TQ19NRU1MT0NLLAorI2RlZmluZQlfU0NfTUVNTE9DSwkJCV9TQ19NRU1MT0NLCisgICAgX1NDX01FTUxPQ0tfUkFOR0UsCisjZGVmaW5lCV9TQ19NRU1MT0NLX1JBTkdFCQlfU0NfTUVNTE9DS19SQU5HRQorICAgIF9TQ19NRU1PUllfUFJPVEVDVElPTiwKKyNkZWZpbmUJX1NDX01FTU9SWV9QUk9URUNUSU9OCQlfU0NfTUVNT1JZX1BST1RFQ1RJT04KKyAgICBfU0NfTUVTU0FHRV9QQVNTSU5HLAorI2RlZmluZQlfU0NfTUVTU0FHRV9QQVNTSU5HCQlfU0NfTUVTU0FHRV9QQVNTSU5HCisgICAgX1NDX1NFTUFQSE9SRVMsCisjZGVmaW5lCV9TQ19TRU1BUEhPUkVTCQkJX1NDX1NFTUFQSE9SRVMKKyAgICBfU0NfU0hBUkVEX01FTU9SWV9PQkpFQ1RTLAorI2RlZmluZQlfU0NfU0hBUkVEX01FTU9SWV9PQkpFQ1RTCV9TQ19TSEFSRURfTUVNT1JZX09CSkVDVFMKKyAgICBfU0NfQUlPX0xJU1RJT19NQVgsCisjZGVmaW5lCV9TQ19BSU9fTElTVElPX01BWAkJX1NDX0FJT19MSVNUSU9fTUFYCisgICAgX1NDX0FJT19NQVgsCisjZGVmaW5lCV9TQ19BSU9fTUFYCQkJX1NDX0FJT19NQVgKKyAgICBfU0NfQUlPX1BSSU9fREVMVEFfTUFYLAorI2RlZmluZQlfU0NfQUlPX1BSSU9fREVMVEFfTUFYCQlfU0NfQUlPX1BSSU9fREVMVEFfTUFYCisgICAgX1NDX0RFTEFZVElNRVJfTUFYLAorI2RlZmluZQlfU0NfREVMQVlUSU1FUl9NQVgJCV9TQ19ERUxBWVRJTUVSX01BWAorICAgIF9TQ19NUV9PUEVOX01BWCwKKyNkZWZpbmUJX1NDX01RX09QRU5fTUFYCQkJX1NDX01RX09QRU5fTUFYCisgICAgX1NDX01RX1BSSU9fTUFYLAorI2RlZmluZQlfU0NfTVFfUFJJT19NQVgJCQlfU0NfTVFfUFJJT19NQVgKKyAgICBfU0NfVkVSU0lPTiwKKyNkZWZpbmUJX1NDX1ZFUlNJT04JCQlfU0NfVkVSU0lPTgorICAgIF9TQ19QQUdFU0laRSwKKyNkZWZpbmUJX1NDX1BBR0VTSVpFCQkJX1NDX1BBR0VTSVpFCisjZGVmaW5lCV9TQ19QQUdFX1NJWkUJCQlfU0NfUEFHRVNJWkUKKyAgICBfU0NfUlRTSUdfTUFYLAorI2RlZmluZQlfU0NfUlRTSUdfTUFYCQkJX1NDX1JUU0lHX01BWAorICAgIF9TQ19TRU1fTlNFTVNfTUFYLAorI2RlZmluZQlfU0NfU0VNX05TRU1TX01BWAkJX1NDX1NFTV9OU0VNU19NQVgKKyAgICBfU0NfU0VNX1ZBTFVFX01BWCwKKyNkZWZpbmUJX1NDX1NFTV9WQUxVRV9NQVgJCV9TQ19TRU1fVkFMVUVfTUFYCisgICAgX1NDX1NJR1FVRVVFX01BWCwKKyNkZWZpbmUJX1NDX1NJR1FVRVVFX01BWAkJX1NDX1NJR1FVRVVFX01BWAorICAgIF9TQ19USU1FUl9NQVgsCisjZGVmaW5lCV9TQ19USU1FUl9NQVgJCQlfU0NfVElNRVJfTUFYCisKKyAgICAvKiBWYWx1ZXMgZm9yIHRoZSBhcmd1bWVudCB0byBgc3lzY29uZicKKyAgICAgICBjb3JyZXNwb25kaW5nIHRvIF9QT1NJWDJfKiBzeW1ib2xzLiAgKi8KKyAgICBfU0NfQkNfQkFTRV9NQVgsCisjZGVmaW5lCV9TQ19CQ19CQVNFX01BWAkJCV9TQ19CQ19CQVNFX01BWAorICAgIF9TQ19CQ19ESU1fTUFYLAorI2RlZmluZQlfU0NfQkNfRElNX01BWAkJCV9TQ19CQ19ESU1fTUFYCisgICAgX1NDX0JDX1NDQUxFX01BWCwKKyNkZWZpbmUJX1NDX0JDX1NDQUxFX01BWAkJX1NDX0JDX1NDQUxFX01BWAorICAgIF9TQ19CQ19TVFJJTkdfTUFYLAorI2RlZmluZQlfU0NfQkNfU1RSSU5HX01BWAkJX1NDX0JDX1NUUklOR19NQVgKKyAgICBfU0NfQ09MTF9XRUlHSFRTX01BWCwKKyNkZWZpbmUJX1NDX0NPTExfV0VJR0hUU19NQVgJCV9TQ19DT0xMX1dFSUdIVFNfTUFYCisgICAgX1NDX0VRVUlWX0NMQVNTX01BWCwKKyNkZWZpbmUJX1NDX0VRVUlWX0NMQVNTX01BWAkJX1NDX0VRVUlWX0NMQVNTX01BWAorICAgIF9TQ19FWFBSX05FU1RfTUFYLAorI2RlZmluZQlfU0NfRVhQUl9ORVNUX01BWAkJX1NDX0VYUFJfTkVTVF9NQVgKKyAgICBfU0NfTElORV9NQVgsCisjZGVmaW5lCV9TQ19MSU5FX01BWAkJCV9TQ19MSU5FX01BWAorICAgIF9TQ19SRV9EVVBfTUFYLAorI2RlZmluZQlfU0NfUkVfRFVQX01BWAkJCV9TQ19SRV9EVVBfTUFYCisgICAgX1NDX0NIQVJDTEFTU19OQU1FX01BWCwKKyNkZWZpbmUJX1NDX0NIQVJDTEFTU19OQU1FX01BWAkJX1NDX0NIQVJDTEFTU19OQU1FX01BWAorCisgICAgX1NDXzJfVkVSU0lPTiwKKyNkZWZpbmUJX1NDXzJfVkVSU0lPTgkJCV9TQ18yX1ZFUlNJT04KKyAgICBfU0NfMl9DX0JJTkQsCisjZGVmaW5lCV9TQ18yX0NfQklORAkJCV9TQ18yX0NfQklORAorICAgIF9TQ18yX0NfREVWLAorI2RlZmluZQlfU0NfMl9DX0RFVgkJCV9TQ18yX0NfREVWCisgICAgX1NDXzJfRk9SVF9ERVYsCisjZGVmaW5lCV9TQ18yX0ZPUlRfREVWCQkJX1NDXzJfRk9SVF9ERVYKKyAgICBfU0NfMl9GT1JUX1JVTiwKKyNkZWZpbmUJX1NDXzJfRk9SVF9SVU4JCQlfU0NfMl9GT1JUX1JVTgorICAgIF9TQ18yX1NXX0RFViwKKyNkZWZpbmUJX1NDXzJfU1dfREVWCQkJX1NDXzJfU1dfREVWCisgICAgX1NDXzJfTE9DQUxFREVGLAorI2RlZmluZQlfU0NfMl9MT0NBTEVERUYJCQlfU0NfMl9MT0NBTEVERUYKKworICAgIF9TQ19QSUksCisjZGVmaW5lCV9TQ19QSUkJCQkJX1NDX1BJSQorICAgIF9TQ19QSUlfWFRJLAorI2RlZmluZQlfU0NfUElJX1hUSQkJCV9TQ19QSUlfWFRJCisgICAgX1NDX1BJSV9TT0NLRVQsCisjZGVmaW5lCV9TQ19QSUlfU09DS0VUCQkJX1NDX1BJSV9TT0NLRVQKKyAgICBfU0NfUElJX0lOVEVSTkVULAorI2RlZmluZQlfU0NfUElJX0lOVEVSTkVUCQlfU0NfUElJX0lOVEVSTkVUCisgICAgX1NDX1BJSV9PU0ksCisjZGVmaW5lCV9TQ19QSUlfT1NJCQkJX1NDX1BJSV9PU0kKKyAgICBfU0NfUE9MTCwKKyNkZWZpbmUJX1NDX1BPTEwJCQlfU0NfUE9MTAorICAgIF9TQ19TRUxFQ1QsCisjZGVmaW5lCV9TQ19TRUxFQ1QJCQlfU0NfU0VMRUNUCisgICAgX1NDX1VJT19NQVhJT1YsCisjZGVmaW5lCV9TQ19VSU9fTUFYSU9WCQkJX1NDX1VJT19NQVhJT1YKKyAgICBfU0NfSU9WX01BWCA9IF9TQ19VSU9fTUFYSU9WLAorI2RlZmluZSBfU0NfSU9WX01BWAkJCV9TQ19JT1ZfTUFYCisgICAgX1NDX1BJSV9JTlRFUk5FVF9TVFJFQU0sCisjZGVmaW5lCV9TQ19QSUlfSU5URVJORVRfU1RSRUFNCQlfU0NfUElJX0lOVEVSTkVUX1NUUkVBTQorICAgIF9TQ19QSUlfSU5URVJORVRfREdSQU0sCisjZGVmaW5lCV9TQ19QSUlfSU5URVJORVRfREdSQU0JCV9TQ19QSUlfSU5URVJORVRfREdSQU0KKyAgICBfU0NfUElJX09TSV9DT1RTLAorI2RlZmluZQlfU0NfUElJX09TSV9DT1RTCQlfU0NfUElJX09TSV9DT1RTCisgICAgX1NDX1BJSV9PU0lfQ0xUUywKKyNkZWZpbmUJX1NDX1BJSV9PU0lfQ0xUUwkJX1NDX1BJSV9PU0lfQ0xUUworICAgIF9TQ19QSUlfT1NJX00sCisjZGVmaW5lCV9TQ19QSUlfT1NJX00JCQlfU0NfUElJX09TSV9NCisgICAgX1NDX1RfSU9WX01BWCwKKyNkZWZpbmUJX1NDX1RfSU9WX01BWAkJCV9TQ19UX0lPVl9NQVgKKworICAgIC8qIFZhbHVlcyBhY2NvcmRpbmcgdG8gUE9TSVggMTAwMy4xYyAoUE9TSVggdGhyZWFkcykuICAqLworICAgIF9TQ19USFJFQURTLAorI2RlZmluZQlfU0NfVEhSRUFEUwkJCV9TQ19USFJFQURTCisgICAgX1NDX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUywKKyNkZWZpbmUgX1NDX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUwlfU0NfVEhSRUFEX1NBRkVfRlVOQ1RJT05TCisgICAgX1NDX0dFVEdSX1JfU0laRV9NQVgsCisjZGVmaW5lCV9TQ19HRVRHUl9SX1NJWkVfTUFYCQlfU0NfR0VUR1JfUl9TSVpFX01BWAorICAgIF9TQ19HRVRQV19SX1NJWkVfTUFYLAorI2RlZmluZQlfU0NfR0VUUFdfUl9TSVpFX01BWAkJX1NDX0dFVFBXX1JfU0laRV9NQVgKKyAgICBfU0NfTE9HSU5fTkFNRV9NQVgsCisjZGVmaW5lCV9TQ19MT0dJTl9OQU1FX01BWAkJX1NDX0xPR0lOX05BTUVfTUFYCisgICAgX1NDX1RUWV9OQU1FX01BWCwKKyNkZWZpbmUJX1NDX1RUWV9OQU1FX01BWAkJX1NDX1RUWV9OQU1FX01BWAorICAgIF9TQ19USFJFQURfREVTVFJVQ1RPUl9JVEVSQVRJT05TLAorI2RlZmluZQlfU0NfVEhSRUFEX0RFU1RSVUNUT1JfSVRFUkFUSU9OUyBfU0NfVEhSRUFEX0RFU1RSVUNUT1JfSVRFUkFUSU9OUworICAgIF9TQ19USFJFQURfS0VZU19NQVgsCisjZGVmaW5lCV9TQ19USFJFQURfS0VZU19NQVgJCV9TQ19USFJFQURfS0VZU19NQVgKKyAgICBfU0NfVEhSRUFEX1NUQUNLX01JTiwKKyNkZWZpbmUJX1NDX1RIUkVBRF9TVEFDS19NSU4JCV9TQ19USFJFQURfU1RBQ0tfTUlOCisgICAgX1NDX1RIUkVBRF9USFJFQURTX01BWCwKKyNkZWZpbmUJX1NDX1RIUkVBRF9USFJFQURTX01BWAkJX1NDX1RIUkVBRF9USFJFQURTX01BWAorICAgIF9TQ19USFJFQURfQVRUUl9TVEFDS0FERFIsCisjZGVmaW5lCV9TQ19USFJFQURfQVRUUl9TVEFDS0FERFIJX1NDX1RIUkVBRF9BVFRSX1NUQUNLQUREUgorICAgIF9TQ19USFJFQURfQVRUUl9TVEFDS1NJWkUsCisjZGVmaW5lCV9TQ19USFJFQURfQVRUUl9TVEFDS1NJWkUJX1NDX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgIF9TQ19USFJFQURfUFJJT1JJVFlfU0NIRURVTElORywKKyNkZWZpbmUJX1NDX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCV9TQ19USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworICAgIF9TQ19USFJFQURfUFJJT19JTkhFUklULAorI2RlZmluZQlfU0NfVEhSRUFEX1BSSU9fSU5IRVJJVAkJX1NDX1RIUkVBRF9QUklPX0lOSEVSSVQKKyAgICBfU0NfVEhSRUFEX1BSSU9fUFJPVEVDVCwKKyNkZWZpbmUJX1NDX1RIUkVBRF9QUklPX1BST1RFQ1QJCV9TQ19USFJFQURfUFJJT19QUk9URUNUCisgICAgX1NDX1RIUkVBRF9QUk9DRVNTX1NIQVJFRCwKKyNkZWZpbmUJX1NDX1RIUkVBRF9QUk9DRVNTX1NIQVJFRAlfU0NfVEhSRUFEX1BST0NFU1NfU0hBUkVECisKKyAgICBfU0NfTlBST0NFU1NPUlNfQ09ORiwKKyNkZWZpbmUgX1NDX05QUk9DRVNTT1JTX0NPTkYJCV9TQ19OUFJPQ0VTU09SU19DT05GCisgICAgX1NDX05QUk9DRVNTT1JTX09OTE4sCisjZGVmaW5lIF9TQ19OUFJPQ0VTU09SU19PTkxOCQlfU0NfTlBST0NFU1NPUlNfT05MTgorICAgIF9TQ19QSFlTX1BBR0VTLAorI2RlZmluZSBfU0NfUEhZU19QQUdFUwkJCV9TQ19QSFlTX1BBR0VTCisgICAgX1NDX0FWUEhZU19QQUdFUywKKyNkZWZpbmUgX1NDX0FWUEhZU19QQUdFUwkJX1NDX0FWUEhZU19QQUdFUworICAgIF9TQ19BVEVYSVRfTUFYLAorI2RlZmluZSBfU0NfQVRFWElUX01BWAkJCV9TQ19BVEVYSVRfTUFYCisgICAgX1NDX1BBU1NfTUFYLAorI2RlZmluZSBfU0NfUEFTU19NQVgJCQlfU0NfUEFTU19NQVgKKworICAgIF9TQ19YT1BFTl9WRVJTSU9OLAorI2RlZmluZSBfU0NfWE9QRU5fVkVSU0lPTgkJX1NDX1hPUEVOX1ZFUlNJT04KKyAgICBfU0NfWE9QRU5fWENVX1ZFUlNJT04sCisjZGVmaW5lIF9TQ19YT1BFTl9YQ1VfVkVSU0lPTgkJX1NDX1hPUEVOX1hDVV9WRVJTSU9OCisgICAgX1NDX1hPUEVOX1VOSVgsCisjZGVmaW5lIF9TQ19YT1BFTl9VTklYCQkJX1NDX1hPUEVOX1VOSVgKKyAgICBfU0NfWE9QRU5fQ1JZUFQsCisjZGVmaW5lIF9TQ19YT1BFTl9DUllQVAkJCV9TQ19YT1BFTl9DUllQVAorICAgIF9TQ19YT1BFTl9FTkhfSTE4TiwKKyNkZWZpbmUgX1NDX1hPUEVOX0VOSF9JMThOCQlfU0NfWE9QRU5fRU5IX0kxOE4KKyAgICBfU0NfWE9QRU5fU0hNLAorI2RlZmluZSBfU0NfWE9QRU5fU0hNCQkJX1NDX1hPUEVOX1NITQorCisgICAgX1NDXzJfQ0hBUl9URVJNLAorI2RlZmluZSBfU0NfMl9DSEFSX1RFUk0JCQlfU0NfMl9DSEFSX1RFUk0KKyAgICBfU0NfMl9DX1ZFUlNJT04sCisjZGVmaW5lIF9TQ18yX0NfVkVSU0lPTgkJCV9TQ18yX0NfVkVSU0lPTgorICAgIF9TQ18yX1VQRSwKKyNkZWZpbmUgX1NDXzJfVVBFCQkJX1NDXzJfVVBFCisKKyAgICBfU0NfWE9QRU5fWFBHMiwKKyNkZWZpbmUgX1NDX1hPUEVOX1hQRzIJCQlfU0NfWE9QRU5fWFBHMgorICAgIF9TQ19YT1BFTl9YUEczLAorI2RlZmluZSBfU0NfWE9QRU5fWFBHMwkJCV9TQ19YT1BFTl9YUEczCisgICAgX1NDX1hPUEVOX1hQRzQsCisjZGVmaW5lIF9TQ19YT1BFTl9YUEc0CQkJX1NDX1hPUEVOX1hQRzQKKworICAgIF9TQ19DSEFSX0JJVCwKKyNkZWZpbmUJX1NDX0NIQVJfQklUCQkJX1NDX0NIQVJfQklUCisgICAgX1NDX0NIQVJfTUFYLAorI2RlZmluZQlfU0NfQ0hBUl9NQVgJCQlfU0NfQ0hBUl9NQVgKKyAgICBfU0NfQ0hBUl9NSU4sCisjZGVmaW5lCV9TQ19DSEFSX01JTgkJCV9TQ19DSEFSX01JTgorICAgIF9TQ19JTlRfTUFYLAorI2RlZmluZQlfU0NfSU5UX01BWAkJCV9TQ19JTlRfTUFYCisgICAgX1NDX0lOVF9NSU4sCisjZGVmaW5lCV9TQ19JTlRfTUlOCQkJX1NDX0lOVF9NSU4KKyAgICBfU0NfTE9OR19CSVQsCisjZGVmaW5lCV9TQ19MT05HX0JJVAkJCV9TQ19MT05HX0JJVAorICAgIF9TQ19XT1JEX0JJVCwKKyNkZWZpbmUJX1NDX1dPUkRfQklUCQkJX1NDX1dPUkRfQklUCisgICAgX1NDX01CX0xFTl9NQVgsCisjZGVmaW5lCV9TQ19NQl9MRU5fTUFYCQkJX1NDX01CX0xFTl9NQVgKKyAgICBfU0NfTlpFUk8sCisjZGVmaW5lCV9TQ19OWkVSTwkJCV9TQ19OWkVSTworICAgIF9TQ19TU0laRV9NQVgsCisjZGVmaW5lCV9TQ19TU0laRV9NQVgJCQlfU0NfU1NJWkVfTUFYCisgICAgX1NDX1NDSEFSX01BWCwKKyNkZWZpbmUJX1NDX1NDSEFSX01BWAkJCV9TQ19TQ0hBUl9NQVgKKyAgICBfU0NfU0NIQVJfTUlOLAorI2RlZmluZQlfU0NfU0NIQVJfTUlOCQkJX1NDX1NDSEFSX01JTgorICAgIF9TQ19TSFJUX01BWCwKKyNkZWZpbmUJX1NDX1NIUlRfTUFYCQkJX1NDX1NIUlRfTUFYCisgICAgX1NDX1NIUlRfTUlOLAorI2RlZmluZQlfU0NfU0hSVF9NSU4JCQlfU0NfU0hSVF9NSU4KKyAgICBfU0NfVUNIQVJfTUFYLAorI2RlZmluZQlfU0NfVUNIQVJfTUFYCQkJX1NDX1VDSEFSX01BWAorICAgIF9TQ19VSU5UX01BWCwKKyNkZWZpbmUJX1NDX1VJTlRfTUFYCQkJX1NDX1VJTlRfTUFYCisgICAgX1NDX1VMT05HX01BWCwKKyNkZWZpbmUJX1NDX1VMT05HX01BWAkJCV9TQ19VTE9OR19NQVgKKyAgICBfU0NfVVNIUlRfTUFYLAorI2RlZmluZQlfU0NfVVNIUlRfTUFYCQkJX1NDX1VTSFJUX01BWAorCisgICAgX1NDX05MX0FSR01BWCwKKyNkZWZpbmUJX1NDX05MX0FSR01BWAkJCV9TQ19OTF9BUkdNQVgKKyAgICBfU0NfTkxfTEFOR01BWCwKKyNkZWZpbmUJX1NDX05MX0xBTkdNQVgJCQlfU0NfTkxfTEFOR01BWAorICAgIF9TQ19OTF9NU0dNQVgsCisjZGVmaW5lCV9TQ19OTF9NU0dNQVgJCQlfU0NfTkxfTVNHTUFYCisgICAgX1NDX05MX05NQVgsCisjZGVmaW5lCV9TQ19OTF9OTUFYCQkJX1NDX05MX05NQVgKKyAgICBfU0NfTkxfU0VUTUFYLAorI2RlZmluZQlfU0NfTkxfU0VUTUFYCQkJX1NDX05MX1NFVE1BWAorICAgIF9TQ19OTF9URVhUTUFYLAorI2RlZmluZQlfU0NfTkxfVEVYVE1BWAkJCV9TQ19OTF9URVhUTUFYCisKKyAgICBfU0NfWEJTNV9JTFAzMl9PRkYzMiwKKyNkZWZpbmUgX1NDX1hCUzVfSUxQMzJfT0ZGMzIJCV9TQ19YQlM1X0lMUDMyX09GRjMyCisgICAgX1NDX1hCUzVfSUxQMzJfT0ZGQklHLAorI2RlZmluZSBfU0NfWEJTNV9JTFAzMl9PRkZCSUcJCV9TQ19YQlM1X0lMUDMyX09GRkJJRworICAgIF9TQ19YQlM1X0xQNjRfT0ZGNjQsCisjZGVmaW5lIF9TQ19YQlM1X0xQNjRfT0ZGNjQJCV9TQ19YQlM1X0xQNjRfT0ZGNjQKKyAgICBfU0NfWEJTNV9MUEJJR19PRkZCSUcsCisjZGVmaW5lIF9TQ19YQlM1X0xQQklHX09GRkJJRwkJX1NDX1hCUzVfTFBCSUdfT0ZGQklHCisKKyAgICBfU0NfWE9QRU5fTEVHQUNZLAorI2RlZmluZSBfU0NfWE9QRU5fTEVHQUNZCQlfU0NfWE9QRU5fTEVHQUNZCisgICAgX1NDX1hPUEVOX1JFQUxUSU1FLAorI2RlZmluZSBfU0NfWE9QRU5fUkVBTFRJTUUJCV9TQ19YT1BFTl9SRUFMVElNRQorICAgIF9TQ19YT1BFTl9SRUFMVElNRV9USFJFQURTLAorI2RlZmluZSBfU0NfWE9QRU5fUkVBTFRJTUVfVEhSRUFEUwlfU0NfWE9QRU5fUkVBTFRJTUVfVEhSRUFEUworCisgICAgX1NDX0FEVklTT1JZX0lORk8sCisjZGVmaW5lIF9TQ19BRFZJU09SWV9JTkZPCQlfU0NfQURWSVNPUllfSU5GTworICAgIF9TQ19CQVJSSUVSUywKKyNkZWZpbmUgX1NDX0JBUlJJRVJTCQkJX1NDX0JBUlJJRVJTCisgICAgX1NDX0JBU0UsCisjZGVmaW5lIF9TQ19CQVNFCQkJX1NDX0JBU0UKKyAgICBfU0NfQ19MQU5HX1NVUFBPUlQsCisjZGVmaW5lIF9TQ19DX0xBTkdfU1VQUE9SVAkJX1NDX0NfTEFOR19TVVBQT1JUCisgICAgX1NDX0NfTEFOR19TVVBQT1JUX1IsCisjZGVmaW5lIF9TQ19DX0xBTkdfU1VQUE9SVF9SCQlfU0NfQ19MQU5HX1NVUFBPUlRfUgorICAgIF9TQ19DTE9DS19TRUxFQ1RJT04sCisjZGVmaW5lIF9TQ19DTE9DS19TRUxFQ1RJT04JCV9TQ19DTE9DS19TRUxFQ1RJT04KKyAgICBfU0NfQ1BVVElNRSwKKyNkZWZpbmUgX1NDX0NQVVRJTUUJCQlfU0NfQ1BVVElNRQorICAgIF9TQ19USFJFQURfQ1BVVElNRSwKKyNkZWZpbmUgX1NDX1RIUkVBRF9DUFVUSU1FCQlfU0NfVEhSRUFEX0NQVVRJTUUKKyAgICBfU0NfREVWSUNFX0lPLAorI2RlZmluZSBfU0NfREVWSUNFX0lPCQkJX1NDX0RFVklDRV9JTworICAgIF9TQ19ERVZJQ0VfU1BFQ0lGSUMsCisjZGVmaW5lIF9TQ19ERVZJQ0VfU1BFQ0lGSUMJCV9TQ19ERVZJQ0VfU1BFQ0lGSUMKKyAgICBfU0NfREVWSUNFX1NQRUNJRklDX1IsCisjZGVmaW5lIF9TQ19ERVZJQ0VfU1BFQ0lGSUNfUgkJX1NDX0RFVklDRV9TUEVDSUZJQ19SCisgICAgX1NDX0ZEX01HTVQsCisjZGVmaW5lIF9TQ19GRF9NR01UCQkJX1NDX0ZEX01HTVQKKyAgICBfU0NfRklGTywKKyNkZWZpbmUgX1NDX0ZJRk8JCQlfU0NfRklGTworICAgIF9TQ19QSVBFLAorI2RlZmluZSBfU0NfUElQRQkJCV9TQ19QSVBFCisgICAgX1NDX0ZJTEVfQVRUUklCVVRFUywKKyNkZWZpbmUgX1NDX0ZJTEVfQVRUUklCVVRFUwkJX1NDX0ZJTEVfQVRUUklCVVRFUworICAgIF9TQ19GSUxFX0xPQ0tJTkcsCisjZGVmaW5lIF9TQ19GSUxFX0xPQ0tJTkcJCV9TQ19GSUxFX0xPQ0tJTkcKKyAgICBfU0NfRklMRV9TWVNURU0sCisjZGVmaW5lIF9TQ19GSUxFX1NZU1RFTQkJCV9TQ19GSUxFX1NZU1RFTQorICAgIF9TQ19NT05PVE9OSUNfQ0xPQ0ssCisjZGVmaW5lIF9TQ19NT05PVE9OSUNfQ0xPQ0sJCV9TQ19NT05PVE9OSUNfQ0xPQ0sKKyAgICBfU0NfTVVMVElfUFJPQ0VTUywKKyNkZWZpbmUgX1NDX01VTFRJX1BST0NFU1MJCV9TQ19NVUxUSV9QUk9DRVNTCisgICAgX1NDX1NJTkdMRV9QUk9DRVNTLAorI2RlZmluZSBfU0NfU0lOR0xFX1BST0NFU1MJCV9TQ19TSU5HTEVfUFJPQ0VTUworICAgIF9TQ19ORVRXT1JLSU5HLAorI2RlZmluZSBfU0NfTkVUV09SS0lORwkJCV9TQ19ORVRXT1JLSU5HCisgICAgX1NDX1JFQURFUl9XUklURVJfTE9DS1MsCisjZGVmaW5lIF9TQ19SRUFERVJfV1JJVEVSX0xPQ0tTCQlfU0NfUkVBREVSX1dSSVRFUl9MT0NLUworICAgIF9TQ19TUElOX0xPQ0tTLAorI2RlZmluZSBfU0NfU1BJTl9MT0NLUwkJCV9TQ19TUElOX0xPQ0tTCisgICAgX1NDX1JFR0VYUCwKKyNkZWZpbmUgX1NDX1JFR0VYUAkJCV9TQ19SRUdFWFAKKyAgICBfU0NfUkVHRVhfVkVSU0lPTiwKKyNkZWZpbmUgX1NDX1JFR0VYX1ZFUlNJT04JCV9TQ19SRUdFWF9WRVJTSU9OCisgICAgX1NDX1NIRUxMLAorI2RlZmluZSBfU0NfU0hFTEwJCQlfU0NfU0hFTEwKKyAgICBfU0NfU0lHTkFMUywKKyNkZWZpbmUgX1NDX1NJR05BTFMJCQlfU0NfU0lHTkFMUworICAgIF9TQ19TUEFXTiwKKyNkZWZpbmUgX1NDX1NQQVdOCQkJX1NDX1NQQVdOCisgICAgX1NDX1NQT1JBRElDX1NFUlZFUiwKKyNkZWZpbmUgX1NDX1NQT1JBRElDX1NFUlZFUgkJX1NDX1NQT1JBRElDX1NFUlZFUgorICAgIF9TQ19USFJFQURfU1BPUkFESUNfU0VSVkVSLAorI2RlZmluZSBfU0NfVEhSRUFEX1NQT1JBRElDX1NFUlZFUglfU0NfVEhSRUFEX1NQT1JBRElDX1NFUlZFUgorICAgIF9TQ19TWVNURU1fREFUQUJBU0UsCisjZGVmaW5lIF9TQ19TWVNURU1fREFUQUJBU0UJCV9TQ19TWVNURU1fREFUQUJBU0UKKyAgICBfU0NfU1lTVEVNX0RBVEFCQVNFX1IsCisjZGVmaW5lIF9TQ19TWVNURU1fREFUQUJBU0VfUgkJX1NDX1NZU1RFTV9EQVRBQkFTRV9SCisgICAgX1NDX1RJTUVPVVRTLAorI2RlZmluZSBfU0NfVElNRU9VVFMJCQlfU0NfVElNRU9VVFMKKyAgICBfU0NfVFlQRURfTUVNT1JZX09CSkVDVFMsCisjZGVmaW5lIF9TQ19UWVBFRF9NRU1PUllfT0JKRUNUUwlfU0NfVFlQRURfTUVNT1JZX09CSkVDVFMKKyAgICBfU0NfVVNFUl9HUk9VUFMsCisjZGVmaW5lIF9TQ19VU0VSX0dST1VQUwkJCV9TQ19VU0VSX0dST1VQUworICAgIF9TQ19VU0VSX0dST1VQU19SLAorI2RlZmluZSBfU0NfVVNFUl9HUk9VUFNfUgkJX1NDX1VTRVJfR1JPVVBTX1IKKyAgICBfU0NfMl9QQlMsCisjZGVmaW5lIF9TQ18yX1BCUwkJCV9TQ18yX1BCUworICAgIF9TQ18yX1BCU19BQ0NPVU5USU5HLAorI2RlZmluZSBfU0NfMl9QQlNfQUNDT1VOVElORwkJX1NDXzJfUEJTX0FDQ09VTlRJTkcKKyAgICBfU0NfMl9QQlNfTE9DQVRFLAorI2RlZmluZSBfU0NfMl9QQlNfTE9DQVRFCQlfU0NfMl9QQlNfTE9DQVRFCisgICAgX1NDXzJfUEJTX01FU1NBR0UsCisjZGVmaW5lIF9TQ18yX1BCU19NRVNTQUdFCQlfU0NfMl9QQlNfTUVTU0FHRQorICAgIF9TQ18yX1BCU19UUkFDSywKKyNkZWZpbmUgX1NDXzJfUEJTX1RSQUNLCQkJX1NDXzJfUEJTX1RSQUNLCisgICAgX1NDX1NZTUxPT1BfTUFYLAorI2RlZmluZSBfU0NfU1lNTE9PUF9NQVgJCQlfU0NfU1lNTE9PUF9NQVgKKyAgICBfU0NfU1RSRUFNUywKKyNkZWZpbmUgX1NDX1NUUkVBTVMJCQlfU0NfU1RSRUFNUworICAgIF9TQ18yX1BCU19DSEVDS1BPSU5ULAorI2RlZmluZSBfU0NfMl9QQlNfQ0hFQ0tQT0lOVAkJX1NDXzJfUEJTX0NIRUNLUE9JTlQKKworICAgIF9TQ19WNl9JTFAzMl9PRkYzMiwKKyNkZWZpbmUgX1NDX1Y2X0lMUDMyX09GRjMyCQlfU0NfVjZfSUxQMzJfT0ZGMzIKKyAgICBfU0NfVjZfSUxQMzJfT0ZGQklHLAorI2RlZmluZSBfU0NfVjZfSUxQMzJfT0ZGQklHCQlfU0NfVjZfSUxQMzJfT0ZGQklHCisgICAgX1NDX1Y2X0xQNjRfT0ZGNjQsCisjZGVmaW5lIF9TQ19WNl9MUDY0X09GRjY0CQlfU0NfVjZfTFA2NF9PRkY2NAorICAgIF9TQ19WNl9MUEJJR19PRkZCSUcsCisjZGVmaW5lIF9TQ19WNl9MUEJJR19PRkZCSUcJCV9TQ19WNl9MUEJJR19PRkZCSUcKKworICAgIF9TQ19IT1NUX05BTUVfTUFYLAorI2RlZmluZSBfU0NfSE9TVF9OQU1FX01BWAkJX1NDX0hPU1RfTkFNRV9NQVgKKyAgICBfU0NfVFJBQ0UsCisjZGVmaW5lIF9TQ19UUkFDRQkJCV9TQ19UUkFDRQorICAgIF9TQ19UUkFDRV9FVkVOVF9GSUxURVIsCisjZGVmaW5lIF9TQ19UUkFDRV9FVkVOVF9GSUxURVIJCV9TQ19UUkFDRV9FVkVOVF9GSUxURVIKKyAgICBfU0NfVFJBQ0VfSU5IRVJJVCwKKyNkZWZpbmUgX1NDX1RSQUNFX0lOSEVSSVQJCV9TQ19UUkFDRV9JTkhFUklUCisgICAgX1NDX1RSQUNFX0xPRywKKyNkZWZpbmUgX1NDX1RSQUNFX0xPRwkJCV9TQ19UUkFDRV9MT0cKKworICAgIF9TQ19MRVZFTDFfSUNBQ0hFX1NJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDFfSUNBQ0hFX1NJWkUJCV9TQ19MRVZFTDFfSUNBQ0hFX1NJWkUKKyAgICBfU0NfTEVWRUwxX0lDQUNIRV9BU1NPQywKKyNkZWZpbmUgX1NDX0xFVkVMMV9JQ0FDSEVfQVNTT0MJCV9TQ19MRVZFTDFfSUNBQ0hFX0FTU09DCisgICAgX1NDX0xFVkVMMV9JQ0FDSEVfTElORVNJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDFfSUNBQ0hFX0xJTkVTSVpFCV9TQ19MRVZFTDFfSUNBQ0hFX0xJTkVTSVpFCisgICAgX1NDX0xFVkVMMV9EQ0FDSEVfU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMMV9EQ0FDSEVfU0laRQkJX1NDX0xFVkVMMV9EQ0FDSEVfU0laRQorICAgIF9TQ19MRVZFTDFfRENBQ0hFX0FTU09DLAorI2RlZmluZSBfU0NfTEVWRUwxX0RDQUNIRV9BU1NPQwkJX1NDX0xFVkVMMV9EQ0FDSEVfQVNTT0MKKyAgICBfU0NfTEVWRUwxX0RDQUNIRV9MSU5FU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMMV9EQ0FDSEVfTElORVNJWkUJX1NDX0xFVkVMMV9EQ0FDSEVfTElORVNJWkUKKyAgICBfU0NfTEVWRUwyX0NBQ0hFX1NJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDJfQ0FDSEVfU0laRQkJX1NDX0xFVkVMMl9DQUNIRV9TSVpFCisgICAgX1NDX0xFVkVMMl9DQUNIRV9BU1NPQywKKyNkZWZpbmUgX1NDX0xFVkVMMl9DQUNIRV9BU1NPQwkJX1NDX0xFVkVMMl9DQUNIRV9BU1NPQworICAgIF9TQ19MRVZFTDJfQ0FDSEVfTElORVNJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDJfQ0FDSEVfTElORVNJWkUJX1NDX0xFVkVMMl9DQUNIRV9MSU5FU0laRQorICAgIF9TQ19MRVZFTDNfQ0FDSEVfU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMM19DQUNIRV9TSVpFCQlfU0NfTEVWRUwzX0NBQ0hFX1NJWkUKKyAgICBfU0NfTEVWRUwzX0NBQ0hFX0FTU09DLAorI2RlZmluZSBfU0NfTEVWRUwzX0NBQ0hFX0FTU09DCQlfU0NfTEVWRUwzX0NBQ0hFX0FTU09DCisgICAgX1NDX0xFVkVMM19DQUNIRV9MSU5FU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMM19DQUNIRV9MSU5FU0laRQlfU0NfTEVWRUwzX0NBQ0hFX0xJTkVTSVpFCisgICAgX1NDX0xFVkVMNF9DQUNIRV9TSVpFLAorI2RlZmluZSBfU0NfTEVWRUw0X0NBQ0hFX1NJWkUJCV9TQ19MRVZFTDRfQ0FDSEVfU0laRQorICAgIF9TQ19MRVZFTDRfQ0FDSEVfQVNTT0MsCisjZGVmaW5lIF9TQ19MRVZFTDRfQ0FDSEVfQVNTT0MJCV9TQ19MRVZFTDRfQ0FDSEVfQVNTT0MKKyAgICBfU0NfTEVWRUw0X0NBQ0hFX0xJTkVTSVpFLAorI2RlZmluZSBfU0NfTEVWRUw0X0NBQ0hFX0xJTkVTSVpFCV9TQ19MRVZFTDRfQ0FDSEVfTElORVNJWkUKKyAgICAvKiBMZWF2ZSByb29tIGhlcmUsIG1heWJlIHdlIG5lZWQgYSBmZXcgbW9yZSBjYWNoZSBsZXZlbHMgc29tZSBkYXkuICAqLworCisgICAgX1NDX0lQVjYgPSBfU0NfTEVWRUwxX0lDQUNIRV9TSVpFICsgNTAsCisjZGVmaW5lIF9TQ19JUFY2CQkJX1NDX0lQVjYKKyAgICBfU0NfUkFXX1NPQ0tFVFMsCisjZGVmaW5lIF9TQ19SQVdfU09DS0VUUwkJCV9TQ19SQVdfU09DS0VUUworCisgICAgX1NDX1Y3X0lMUDMyX09GRjMyLAorI2RlZmluZSBfU0NfVjdfSUxQMzJfT0ZGMzIJCV9TQ19WN19JTFAzMl9PRkYzMgorICAgIF9TQ19WN19JTFAzMl9PRkZCSUcsCisjZGVmaW5lIF9TQ19WN19JTFAzMl9PRkZCSUcJCV9TQ19WN19JTFAzMl9PRkZCSUcKKyAgICBfU0NfVjdfTFA2NF9PRkY2NCwKKyNkZWZpbmUgX1NDX1Y3X0xQNjRfT0ZGNjQJCV9TQ19WN19MUDY0X09GRjY0CisgICAgX1NDX1Y3X0xQQklHX09GRkJJRywKKyNkZWZpbmUgX1NDX1Y3X0xQQklHX09GRkJJRwkJX1NDX1Y3X0xQQklHX09GRkJJRworCisgICAgX1NDX1NTX1JFUExfTUFYLAorI2RlZmluZSBfU0NfU1NfUkVQTF9NQVgJCQlfU0NfU1NfUkVQTF9NQVgKKworICAgIF9TQ19UUkFDRV9FVkVOVF9OQU1FX01BWCwKKyNkZWZpbmUgX1NDX1RSQUNFX0VWRU5UX05BTUVfTUFYCV9TQ19UUkFDRV9FVkVOVF9OQU1FX01BWAorICAgIF9TQ19UUkFDRV9OQU1FX01BWCwKKyNkZWZpbmUgX1NDX1RSQUNFX05BTUVfTUFYCQlfU0NfVFJBQ0VfTkFNRV9NQVgKKyAgICBfU0NfVFJBQ0VfU1lTX01BWCwKKyNkZWZpbmUgX1NDX1RSQUNFX1NZU19NQVgJCV9TQ19UUkFDRV9TWVNfTUFYCisgICAgX1NDX1RSQUNFX1VTRVJfRVZFTlRfTUFYLAorI2RlZmluZSBfU0NfVFJBQ0VfVVNFUl9FVkVOVF9NQVgJX1NDX1RSQUNFX1VTRVJfRVZFTlRfTUFYCisKKyAgICBfU0NfWE9QRU5fU1RSRUFNUywKKyNkZWZpbmUgX1NDX1hPUEVOX1NUUkVBTVMJCV9TQ19YT1BFTl9TVFJFQU1TCisKKyAgICBfU0NfVEhSRUFEX1JPQlVTVF9QUklPX0lOSEVSSVQsCisjZGVmaW5lIF9TQ19USFJFQURfUk9CVVNUX1BSSU9fSU5IRVJJVAlfU0NfVEhSRUFEX1JPQlVTVF9QUklPX0lOSEVSSVQKKyAgICBfU0NfVEhSRUFEX1JPQlVTVF9QUklPX1BST1RFQ1QKKyNkZWZpbmUgX1NDX1RIUkVBRF9ST0JVU1RfUFJJT19QUk9URUNUCV9TQ19USFJFQURfUk9CVVNUX1BSSU9fUFJPVEVDVAorICB9OworCisvKiBWYWx1ZXMgZm9yIHRoZSBOQU1FIGFyZ3VtZW50IHRvIGBjb25mc3RyJy4gICovCitlbnVtCisgIHsKKyAgICBfQ1NfUEFUSCwJCQkvKiBUaGUgZGVmYXVsdCBzZWFyY2ggcGF0aC4gICovCisjZGVmaW5lIF9DU19QQVRICQlfQ1NfUEFUSAorCisgICAgX0NTX1Y2X1dJRFRIX1JFU1RSSUNURURfRU5WUywKKyNkZWZpbmUgX0NTX1Y2X1dJRFRIX1JFU1RSSUNURURfRU5WUwlfQ1NfVjZfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCisjZGVmaW5lIF9DU19QT1NJWF9WNl9XSURUSF9SRVNUUklDVEVEX0VOVlMJX0NTX1Y2X1dJRFRIX1JFU1RSSUNURURfRU5WUworCisgICAgX0NTX0dOVV9MSUJDX1ZFUlNJT04sCisjZGVmaW5lIF9DU19HTlVfTElCQ19WRVJTSU9OCV9DU19HTlVfTElCQ19WRVJTSU9OCisgICAgX0NTX0dOVV9MSUJQVEhSRUFEX1ZFUlNJT04sCisjZGVmaW5lIF9DU19HTlVfTElCUFRIUkVBRF9WRVJTSU9OCV9DU19HTlVfTElCUFRIUkVBRF9WRVJTSU9OCisKKyAgICBfQ1NfVjVfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTLAorI2RlZmluZSBfQ1NfVjVfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCV9DU19WNV9XSURUSF9SRVNUUklDVEVEX0VOVlMKKyNkZWZpbmUgX0NTX1BPU0lYX1Y1X1dJRFRIX1JFU1RSSUNURURfRU5WUwlfQ1NfVjVfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCisKKyAgICBfQ1NfVjdfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTLAorI2RlZmluZSBfQ1NfVjdfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCV9DU19WN19XSURUSF9SRVNUUklDVEVEX0VOVlMKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X1dJRFRIX1JFU1RSSUNURURfRU5WUwlfQ1NfVjdfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCisKKyAgICBfQ1NfTEZTX0NGTEFHUyA9IDEwMDAsCisjZGVmaW5lIF9DU19MRlNfQ0ZMQUdTCV9DU19MRlNfQ0ZMQUdTCisgICAgX0NTX0xGU19MREZMQUdTLAorI2RlZmluZSBfQ1NfTEZTX0xERkxBR1MJX0NTX0xGU19MREZMQUdTCisgICAgX0NTX0xGU19MSUJTLAorI2RlZmluZSBfQ1NfTEZTX0xJQlMJCV9DU19MRlNfTElCUworICAgIF9DU19MRlNfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfTEZTX0xJTlRGTEFHUwlfQ1NfTEZTX0xJTlRGTEFHUworICAgIF9DU19MRlM2NF9DRkxBR1MsCisjZGVmaW5lIF9DU19MRlM2NF9DRkxBR1MJX0NTX0xGUzY0X0NGTEFHUworICAgIF9DU19MRlM2NF9MREZMQUdTLAorI2RlZmluZSBfQ1NfTEZTNjRfTERGTEFHUwlfQ1NfTEZTNjRfTERGTEFHUworICAgIF9DU19MRlM2NF9MSUJTLAorI2RlZmluZSBfQ1NfTEZTNjRfTElCUwlfQ1NfTEZTNjRfTElCUworICAgIF9DU19MRlM2NF9MSU5URkxBR1MsCisjZGVmaW5lIF9DU19MRlM2NF9MSU5URkxBR1MJX0NTX0xGUzY0X0xJTlRGTEFHUworCisgICAgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfQ0ZMQUdTID0gMTEwMCwKKyNkZWZpbmUgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfQ0ZMQUdTIF9DU19YQlM1X0lMUDMyX09GRjMyX0NGTEFHUworICAgIF9DU19YQlM1X0lMUDMyX09GRjMyX0xERkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRjMyX0xERkxBR1MgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTERGTEFHUworICAgIF9DU19YQlM1X0lMUDMyX09GRjMyX0xJQlMsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRjMyX0xJQlMgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTElCUworICAgIF9DU19YQlM1X0lMUDMyX09GRjMyX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTElOVEZMQUdTIF9DU19YQlM1X0lMUDMyX09GRjMyX0xJTlRGTEFHUworICAgIF9DU19YQlM1X0lMUDMyX09GRkJJR19DRkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRkJJR19DRkxBR1MgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0NGTEFHUworICAgIF9DU19YQlM1X0lMUDMyX09GRkJJR19MREZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTERGTEFHUyBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTERGTEFHUworICAgIF9DU19YQlM1X0lMUDMyX09GRkJJR19MSUJTLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTElCUyBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTElCUworICAgIF9DU19YQlM1X0lMUDMyX09GRkJJR19MSU5URkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRkJJR19MSU5URkxBR1MgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xJTlRGTEFHUworICAgIF9DU19YQlM1X0xQNjRfT0ZGNjRfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9MUDY0X09GRjY0X0NGTEFHUyBfQ1NfWEJTNV9MUDY0X09GRjY0X0NGTEFHUworICAgIF9DU19YQlM1X0xQNjRfT0ZGNjRfTERGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfTFA2NF9PRkY2NF9MREZMQUdTIF9DU19YQlM1X0xQNjRfT0ZGNjRfTERGTEFHUworICAgIF9DU19YQlM1X0xQNjRfT0ZGNjRfTElCUywKKyNkZWZpbmUgX0NTX1hCUzVfTFA2NF9PRkY2NF9MSUJTIF9DU19YQlM1X0xQNjRfT0ZGNjRfTElCUworICAgIF9DU19YQlM1X0xQNjRfT0ZGNjRfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9MUDY0X09GRjY0X0xJTlRGTEFHUyBfQ1NfWEJTNV9MUDY0X09GRjY0X0xJTlRGTEFHUworICAgIF9DU19YQlM1X0xQQklHX09GRkJJR19DRkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0xQQklHX09GRkJJR19DRkxBR1MgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0NGTEFHUworICAgIF9DU19YQlM1X0xQQklHX09GRkJJR19MREZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTERGTEFHUyBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTERGTEFHUworICAgIF9DU19YQlM1X0xQQklHX09GRkJJR19MSUJTLAorI2RlZmluZSBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTElCUyBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTElCUworICAgIF9DU19YQlM1X0xQQklHX09GRkJJR19MSU5URkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0xQQklHX09GRkJJR19MSU5URkxBR1MgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUworCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0NGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0NGTEFHUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xERkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MREZMQUdTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xJQlMsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MSUJTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MSUJTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xJTlRGTEFHUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTElOVEZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19DRkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfQ0ZMQUdTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MREZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0xERkxBR1MgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MSUJTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0xJQlMgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MSUJTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MSU5URkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTElOVEZMQUdTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTElOVEZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9DRkxBR1MgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTERGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTERGTEFHUyBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTElCUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTElCUyBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9MSUJTCisgICAgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9MSU5URkxBR1MgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTElOVEZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19DRkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfQ0ZMQUdTIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MREZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xERkxBR1MgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MSUJTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xJQlMgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MSUJTCisgICAgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MSU5URkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTElOVEZMQUdTIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTElOVEZMQUdTCisKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfQ0ZMQUdTIF9DU19QT1NJWF9WN19JTFAzMl9PRkYzMl9DRkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfTERGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xERkxBR1MgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xERkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfTElCUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xJQlMgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xJQlMKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfTElOVEZMQUdTIF9DU19QT1NJWF9WN19JTFAzMl9PRkYzMl9MSU5URkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0NGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19DRkxBR1MgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19DRkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xERkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19JTFAzMl9PRkZCSUdfTERGTEFHUyBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xERkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xJQlMsCisjZGVmaW5lIF9DU19QT1NJWF9WN19JTFAzMl9PRkZCSUdfTElCUyBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xJQlMKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MSU5URkxBR1MgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MSU5URkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9DRkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19MUDY0X09GRjY0X0NGTEFHUyBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9DRkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MREZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MREZMQUdTIF9DU19QT1NJWF9WN19MUDY0X09GRjY0X0xERkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MSUJTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MSUJTIF9DU19QT1NJWF9WN19MUDY0X09GRjY0X0xJQlMKKyAgICBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MSU5URkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19MUDY0X09GRjY0X0xJTlRGTEFHUyBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MSU5URkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0NGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19DRkxBR1MgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19DRkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xERkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19MUEJJR19PRkZCSUdfTERGTEFHUyBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xERkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xJQlMsCisjZGVmaW5lIF9DU19QT1NJWF9WN19MUEJJR19PRkZCSUdfTElCUyBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xJQlMKKyAgICBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MSU5URkxBR1MgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MSU5URkxBR1MKKworICAgIF9DU19WNl9FTlYsCisjZGVmaW5lIF9DU19WNl9FTlYJCQlfQ1NfVjZfRU5WCisgICAgX0NTX1Y3X0VOVgorI2RlZmluZSBfQ1NfVjdfRU5WCQkJX0NTX1Y3X0VOVgorICB9OwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2RpcmVudC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2RpcmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Nzk0YjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZGlyZW50LmgKQEAgLTAsMCArMSw1MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ESVJFTlRfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2RpcmVudC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8ZGlyZW50Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKK3N0cnVjdCBkaXJlbnQKKyAgeworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19pbm9fdCBkX2lubzsKKyAgICBfX29mZl90IGRfb2ZmOworI2Vsc2UKKyAgICBfX2lubzY0X3QgZF9pbm87CisgICAgX19vZmY2NF90IGRfb2ZmOworI2VuZGlmCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGRfcmVjbGVuOworICAgIHVuc2lnbmVkIGNoYXIgZF90eXBlOworICAgIGNoYXIgZF9uYW1lWzI1Nl07CQkvKiBXZSBtdXN0IG5vdCBpbmNsdWRlIGxpbWl0cy5oISAqLworICB9OworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3N0cnVjdCBkaXJlbnQ2NAorICB7CisgICAgX19pbm82NF90IGRfaW5vOworICAgIF9fb2ZmNjRfdCBkX29mZjsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgZF9yZWNsZW47CisgICAgdW5zaWduZWQgY2hhciBkX3R5cGU7CisgICAgY2hhciBkX25hbWVbMjU2XTsJCS8qIFdlIG11c3Qgbm90IGluY2x1ZGUgbGltaXRzLmghICovCisgIH07CisjZW5kaWYKKworI2RlZmluZSBkX2ZpbGVubwlkX2lubwkvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gICovCisKKyN1bmRlZiAgX0RJUkVOVF9IQVZFX0RfTkFNTEVOCisjZGVmaW5lIF9ESVJFTlRfSEFWRV9EX1JFQ0xFTgorI2RlZmluZSBfRElSRU5UX0hBVkVfRF9PRkYKKyNkZWZpbmUgX0RJUkVOVF9IQVZFX0RfVFlQRQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2RsZmNuLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZGxmY24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2ZkOTZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2RsZmNuLmgKQEAgLTAsMCArMSw2NSBAQAorLyogU3lzdGVtIGRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgcnVuLXRpbWUgZHluYW1pYyBsb2FkaW5nLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDEsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0RMRkNOX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9kbGZjbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8ZGxmY24uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogVGhlIE1PREUgYXJndW1lbnQgdG8gYGRsb3BlbicgY29udGFpbnMgb25lIG9mIHRoZSBmb2xsb3dpbmc6ICovCisjZGVmaW5lIFJUTERfTEFaWQkweDAwMDAxCS8qIExhenkgZnVuY3Rpb24gY2FsbCBiaW5kaW5nLiAgKi8KKyNkZWZpbmUgUlRMRF9OT1cJMHgwMDAwMgkvKiBJbW1lZGlhdGUgZnVuY3Rpb24gY2FsbCBiaW5kaW5nLiAgKi8KKyNkZWZpbmUJUlRMRF9CSU5ESU5HX01BU0sgICAweDMJLyogTWFzayBvZiBiaW5kaW5nIHRpbWUgdmFsdWUuICAqLworI2RlZmluZSBSVExEX05PTE9BRAkweDAwMDA0CS8qIERvIG5vdCBsb2FkIHRoZSBvYmplY3QuICAqLworI2RlZmluZSBSVExEX0RFRVBCSU5ECTB4MDAwMDgJLyogVXNlIGRlZXAgYmluZGluZy4gICovCisKKy8qIElmIHRoZSBmb2xsb3dpbmcgYml0IGlzIHNldCBpbiB0aGUgTU9ERSBhcmd1bWVudCB0byBgZGxvcGVuJywKKyAgIHRoZSBzeW1ib2xzIG9mIHRoZSBsb2FkZWQgb2JqZWN0IGFuZCBpdHMgZGVwZW5kZW5jaWVzIGFyZSBtYWRlCisgICB2aXNpYmxlIGFzIGlmIHRoZSBvYmplY3Qgd2VyZSBsaW5rZWQgZGlyZWN0bHkgaW50byB0aGUgcHJvZ3JhbS4gICovCisjZGVmaW5lIFJUTERfR0xPQkFMCTB4MDAxMDAKKworLyogVW5peDk4IGRlbWFuZHMgdGhlIGZvbGxvd2luZyBmbGFnIHdoaWNoIGlzIHRoZSBpbnZlcnNlIHRvIFJUTERfR0xPQkFMLgorICAgVGhlIGltcGxlbWVudGF0aW9uIGRvZXMgdGhpcyBieSBkZWZhdWx0IGFuZCBzbyB3ZSBjYW4gZGVmaW5lIHRoZQorICAgdmFsdWUgdG8gemVyby4gICovCisjZGVmaW5lIFJUTERfTE9DQUwJMAorCisvKiBEbyBub3QgZGVsZXRlIG9iamVjdCB3aGVuIGNsb3NlZC4gICovCisjZGVmaW5lIFJUTERfTk9ERUxFVEUJMHgwMTAwMAorCisjaWZkZWYgX19VU0VfR05VCisvKiBUbyBzdXBwb3J0IHByb2ZpbGluZyBvZiBzaGFyZWQgb2JqZWN0cyBpdCBpcyBhIGdvb2QgaWRlYSB0byBjYWxsCisgICB0aGUgZnVuY3Rpb24gZm91bmQgdXNpbmcgYGRsc3ltJyB1c2luZyB0aGUgZm9sbG93aW5nIG1hY3JvIHNpbmNlCisgICB0aGVzZSBjYWxscyBkbyBub3QgdXNlIHRoZSBQTFQuICBCdXQgdGhpcyB3b3VsZCBtZWFuIHRoZSBkeW5hbWljCisgICBsb2FkZXIgaGFzIG5vIGNoYW5jZSB0byBmaW5kIG91dCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuICBUaGUKKyAgIG1hY3JvIGFwcGxpZXMgdGhlIG5lY2Vzc2FyeSBtYWdpYyBzbyB0aGF0IHByb2ZpbGluZyBpcyBwb3NzaWJsZS4KKyAgIFJld3JpdGUKKwlmb28gPSAoKmZjdHApIChhcmcxLCBhcmcyKTsKKyAgIGludG8KKyAgICAgICAgZm9vID0gRExfQ0FMTF9GQ1QgKGZjdHAsIChhcmcxLCBhcmcyKSk7CisqLworIyBkZWZpbmUgRExfQ0FMTF9GQ1QoZmN0cCwgYXJncykgXAorICAoX2RsX21jb3VudF93cmFwcGVyX2NoZWNrICgodm9pZCAqKSAoZmN0cCkpLCAoKihmY3RwKSkgYXJncykKKworX19CRUdJTl9ERUNMUworCisvKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBwcm9maWxpbmcgZnVuY3Rpb25zLiAgKi8KK2V4dGVybiB2b2lkIF9kbF9tY291bnRfd3JhcHBlcl9jaGVjayAodm9pZCAqX19zZWxmcGMpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2VsZmNsYXNzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZWxmY2xhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAyMjdkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2VsZmNsYXNzLmgKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBmaWxlIHNwZWNpZmllcyB0aGUgbmF0aXZlIHdvcmQgc2l6ZSBvZiB0aGUgbWFjaGluZSwgd2hpY2ggaW5kaWNhdGVzCisgICB0aGUgRUxGIGZpbGUgY2xhc3MgdXNlZCBmb3IgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZCBvYmplY3RzIG9uIHRoaXMKKyAgIG1hY2hpbmUuICAqLworCisjaWZuZGVmIF9MSU5LX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9lbGZjbGFzcy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bGluay5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjZGVmaW5lIF9fRUxGX05BVElWRV9DTEFTUyBfX1dPUkRTSVpFCisKKy8qIFRoZSBlbnRyaWVzIGluIHRoZSAuaGFzaCB0YWJsZSBhbHdheXMgaGF2ZSBhIHNpemUgb2YgMzIgYml0cy4gICovCit0eXBlZGVmIHVpbnQzMl90IEVsZl9TeW1uZHg7CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZW5kaWFuLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiZDlkMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9lbmRpYW4uaApAQCAtMCwwICsxLDcgQEAKKy8qIGkzODYgaXMgbGl0dGxlLWVuZGlhbi4gICovCisKKyNpZm5kZWYgX0VORElBTl9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvZW5kaWFuLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxlbmRpYW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2RlZmluZSBfX0JZVEVfT1JERVIgX19MSVRUTEVfRU5ESUFOCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZW52aXJvbm1lbnRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZW52aXJvbm1lbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1ZGQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9lbnZpcm9ubWVudHMuaApAQCAtMCwwICsxLDY4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDEsIDIwMDQsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1VOSVNURF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gIFVzZSA8dW5pc3RkLmg+IGluc3RlYWQiCisjZW5kaWYKKworLyogVGhpcyBoZWFkZXIgc2hvdWxkIGRlZmluZSB0aGUgZm9sbG93aW5nIHN5bWJvbHMgdW5kZXIgdGhlIGRlc2NyaWJlZAorICAgc2l0dWF0aW9ucy4gIEEgdmFsdWUgYDEnIG1lYW5zIHRoYXQgdGhlIG1vZGVsIGlzIGFsd2F5cyBzdXBwb3J0ZWQsCisgICBgLTEnIG1lYW5zIGl0IGlzIG5ldmVyIHN1cHBvcnRlZC4gIFVuZGVmaW5lZCBtZWFucyBpdCBjYW5ub3QgYmUKKyAgIHN0YXRpY2FsbHkgZGVjaWRlZC4KKworICAgX1BPU0lYX1Y3X0lMUDMyX09GRjMyICAgMzJiaXQgaW50LCBsb25nLCBwb2ludGVycywgYW5kIG9mZl90IHR5cGUKKyAgIF9QT1NJWF9WN19JTFAzMl9PRkZCSUcgIDMyYml0IGludCwgbG9uZywgYW5kIHBvaW50ZXJzIGFuZCBsYXJnZXIgb2ZmX3QgdHlwZQorCisgICBfUE9TSVhfVjdfTFA2NF9PRkYzMgkgICA2NGJpdCBsb25nIGFuZCBwb2ludGVycyBhbmQgMzJiaXQgb2ZmX3QgdHlwZQorICAgX1BPU0lYX1Y3X0xQQklHX09GRkJJRyAgNjRiaXQgbG9uZyBhbmQgcG9pbnRlcnMgYW5kIGxhcmdlIG9mZl90IHR5cGUKKworICAgVGhlIG1hY3JvcyBfUE9TSVhfVjZfSUxQMzJfT0ZGMzIsIF9QT1NJWF9WNl9JTFAzMl9PRkZCSUcsCisgICBfUE9TSVhfVjZfTFA2NF9PRkYzMiwgX1BPU0lYX1Y2X0xQQklHX09GRkJJRywgX1hCUzVfSUxQMzJfT0ZGMzIsCisgICBfWEJTNV9JTFAzMl9PRkZCSUcsIF9YQlM1X0xQNjRfT0ZGMzIsIGFuZCBfWEJTNV9MUEJJR19PRkZCSUcgd2VyZQorICAgdXNlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgVW5peCBzdGFuZGFyZCBhbmQgYXJlIGF2YWlsYWJsZQorICAgb25seSBmb3IgY29tcGF0aWJpbGl0eS4KKyovCisKKy8qIEJ5IGRlZmF1bHQgd2UgaGF2ZSAzMi1iaXQgd2lkZSBgaW50JywgYGxvbmcgaW50JywgcG9pbnRlcnMgYW5kIGBvZmZfdCcKKyAgIGFuZCBhbGwgcGxhdGZvcm1zIHN1cHBvcnQgTEZTLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1Y3X0lMUDMyX09GRjMyCTEKKyNkZWZpbmUgX1BPU0lYX1Y3X0lMUDMyX09GRkJJRwkxCisjZGVmaW5lIF9QT1NJWF9WNl9JTFAzMl9PRkYzMgkxCisjZGVmaW5lIF9QT1NJWF9WNl9JTFAzMl9PRkZCSUcJMQorI2RlZmluZSBfWEJTNV9JTFAzMl9PRkYzMgkxCisjZGVmaW5lIF9YQlM1X0lMUDMyX09GRkJJRwkxCisKKy8qIFdlIG9wdGlvbmFsbHkgcHJvdmlkZSBhbiBlbnZpcm9ubWVudCB3aXRoIHRoZSBhYm92ZSBzaXplIGJ1dCBhbiA2NC1iaXQKKyAgIHNpZGUgYG9mZl90Jy4gIFRoZXJlZm9yZSB3ZSBkb24ndCBkZWZpbmUgX1BPU0lYX1Y3X0lMUDMyX09GRkJJRy4gICovCisKKy8qIEVudmlyb25tZW50cyB3aXRoIDY0LWJpdCB3aWRlIHBvaW50ZXJzIGNhbiBiZSBwcm92aWRlZCwKKyAgIHNvIHRoZXNlIG1hY3JvcyBhcmVuJ3QgZGVmaW5lZDoKKyAgICMgdW5kZWYgX1BPU0lYX1Y3X0xQNjRfT0ZGNjQKKyAgICMgdW5kZWYgX1BPU0lYX1Y3X0xQQklHX09GRkJJRworICAgIyB1bmRlZiBfUE9TSVhfVjZfTFA2NF9PRkY2NAorICAgIyB1bmRlZiBfUE9TSVhfVjZfTFBCSUdfT0ZGQklHCisgICAjIHVuZGVmIF9YQlM1X0xQNjRfT0ZGNjQKKyAgICMgdW5kZWYgX1hCUzVfTFBCSUdfT0ZGQklHCisgICBhbmQgc3lzY29uZiB0ZXN0cyBmb3IgaXQgYXQgcnVudGltZS4gICovCisKKyNkZWZpbmUgX19JTFAzMl9PRkYzMl9DRkxBR1MJIi1tMzIiCisjZGVmaW5lIF9fSUxQMzJfT0ZGQklHX0NGTEFHUwkiLW0zMiAtRF9MQVJHRUZJTEVfU09VUkNFIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiCisjZGVmaW5lIF9fSUxQMzJfT0ZGMzJfTERGTEFHUwkiLW0zMiIKKyNkZWZpbmUgX19JTFAzMl9PRkZCSUdfTERGTEFHUwkiLW0zMiIKKyNkZWZpbmUgX19MUDY0X09GRjY0X0NGTEFHUwkiLW02NCIKKyNkZWZpbmUgX19MUDY0X09GRjY0X0xERkxBR1MJIi1tNjQiCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZXJybm8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmM2Q3YWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZXJybm8uaApAQCAtMCwwICsxLDYzIEBACisvKiBFcnJvciBjb25zdGFudHMuICBMaW51eCBzcGVjaWZpYyB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTksIDIwMDUsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZmRlZiBfRVJSTk9fSAorCisjIHVuZGVmIEVET00KKyMgdW5kZWYgRUlMU0VRCisjIHVuZGVmIEVSQU5HRQorIyBpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisvKiBMaW51eCBoYXMgbm8gRU5PVFNVUCBlcnJvciBjb2RlLiAgKi8KKyMgZGVmaW5lIEVOT1RTVVAgRU9QTk9UU1VQUAorCisvKiBPbGRlciBMaW51eCB2ZXJzaW9ucyBhbHNvIGhhZCBubyBFQ0FOQ0VMRUQgZXJyb3IgY29kZS4gICovCisjIGlmbmRlZiBFQ0FOQ0VMRUQKKyMgIGRlZmluZSBFQ0FOQ0VMRUQJMTI1CisjIGVuZGlmCisKKy8qIFN1cHBvcnQgZm9yIGVycm9yIGNvZGVzIHRvIHN1cHBvcnQgcm9idXN0IG11dGV4ZXMgd2FzIGFkZGVkIGxhdGVyLCB0b28uICAqLworIyBpZm5kZWYgRU9XTkVSREVBRAorIyAgZGVmaW5lIEVPV05FUkRFQUQJCTEzMAorIyAgZGVmaW5lIEVOT1RSRUNPVkVSQUJMRQkxMzEKKyMgZW5kaWYKKworIyBpZm5kZWYgRVJGS0lMTAorIyAgZGVmaW5lIEVSRktJTEwJCTEzMgorIyBlbmRpZgorCisjIGlmbmRlZiBfX0FTU0VNQkxFUl9fCisvKiBGdW5jdGlvbiB0byBnZXQgYWRkcmVzcyBvZiBnbG9iYWwgYGVycm5vJyB2YXJpYWJsZS4gICovCitleHRlcm4gaW50ICpfX2Vycm5vX2xvY2F0aW9uICh2b2lkKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworIyAgaWYgIWRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBfTElCQ19SRUVOVFJBTlQKKy8qIFdoZW4gdXNpbmcgdGhyZWFkcywgZXJybm8gaXMgYSBwZXItdGhyZWFkIHZhbHVlLiAgKi8KKyMgICBkZWZpbmUgZXJybm8gKCpfX2Vycm5vX2xvY2F0aW9uICgpKQorIyAgZW5kaWYKKyMgZW5kaWYgLyogIV9fQVNTRU1CTEVSX18gKi8KKyNlbmRpZiAvKiBfRVJSTk9fSCAqLworCisjaWYgIWRlZmluZWQgX0VSUk5PX0ggJiYgZGVmaW5lZCBfX25lZWRfRW1hdGgKKy8qIFRoaXMgaXMgdWdseSBidXQgdGhlIGtlcm5lbCBoZWFkZXIgaXMgbm90IGNsZWFuIGVub3VnaC4gIFdlIG11c3QKKyAgIGRlZmluZSBvbmx5IHRoZSB2YWx1ZXMgRURPTSwgRUlMU0VRIGFuZCBFUkFOR0UgaW4gY2FzZSBfX25lZWRfRW1hdGggaXMKKyAgIGRlZmluZWQuICAqLworIyBkZWZpbmUgRURPTQkzMwkvKiBNYXRoIGFyZ3VtZW50IG91dCBvZiBkb21haW4gb2YgZnVuY3Rpb24uICAqLworIyBkZWZpbmUgRUlMU0VRCTg0CS8qIElsbGVnYWwgYnl0ZSBzZXF1ZW5jZS4gICovCisjIGRlZmluZSBFUkFOR0UJMzQJLyogTWF0aCByZXN1bHQgbm90IHJlcHJlc2VudGFibGUuICAqLworI2VuZGlmIC8qICFfRVJSTk9fSCAmJiBfX25lZWRfRW1hdGggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9lcnJvci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5YTNmMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9lcnJvci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIFNwZWNpYWxpemF0aW9ucyBmb3IgZXJyb3IgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9FUlJPUl9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL2Vycm9yLmg+IGRpcmVjdGx5OyB1c2UgPGVycm9yLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworZXh0ZXJuIHZvaWQgX19SRURJUkVDVCAoX19lcnJvcl9hbGlhcywgKGludCBfX3N0YXR1cywgaW50IF9fZXJybnVtLAorCQkJCQlfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pLAorCQkJZXJyb3IpCisgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOworZXh0ZXJuIHZvaWQgX19SRURJUkVDVCAoX19lcnJvcl9ub3JldHVybiwgKGludCBfX3N0YXR1cywgaW50IF9fZXJybnVtLAorCQkJCQkgICBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pLAorCQkJZXJyb3IpCisgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18sIF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSk7CisKKworLyogSWYgd2Uga25vdyB0aGUgZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gbWFrZSBzdXJlIHRoZSBjb21waWxlcgorICAgcmVhbGl6ZXMgdGhhdCwgdG9vLiAgKi8KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZAorZXJyb3IgKGludCBfX3N0YXR1cywgaW50IF9fZXJybnVtLCBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pCit7CisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zdGF0dXMpICYmIF9fc3RhdHVzICE9IDApCisgICAgX19lcnJvcl9ub3JldHVybiAoX19zdGF0dXMsIF9fZXJybnVtLCBfX2Zvcm1hdCwgX192YV9hcmdfcGFjayAoKSk7CisgIGVsc2UKKyAgICBfX2Vycm9yX2FsaWFzIChfX3N0YXR1cywgX19lcnJudW0sIF9fZm9ybWF0LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworCitleHRlcm4gdm9pZCBfX1JFRElSRUNUIChfX2Vycm9yX2F0X2xpbmVfYWxpYXMsIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCQkJCV9fY29uc3QgY2hhciAqX19mbmFtZSwKKwkJCQkJCXVuc2lnbmVkIGludCBfX2xpbmUsCisJCQkJCQlfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pLAorCQkJZXJyb3JfYXRfbGluZSkKKyAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDUsIDYpKSk7CitleHRlcm4gdm9pZCBfX1JFRElSRUNUIChfX2Vycm9yX2F0X2xpbmVfbm9yZXR1cm4sIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCQkJCSAgIF9fY29uc3QgY2hhciAqX19mbmFtZSwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCBfX2xpbmUsCisJCQkJCQkgICBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LAorCQkJCQkJICAgLi4uKSwKKwkJCWVycm9yX2F0X2xpbmUpCisgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18sIF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDUsIDYpKSk7CisKKworLyogSWYgd2Uga25vdyB0aGUgZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gbWFrZSBzdXJlIHRoZSBjb21waWxlcgorICAgcmVhbGl6ZXMgdGhhdCwgdG9vLiAgKi8KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZAorZXJyb3JfYXRfbGluZSAoaW50IF9fc3RhdHVzLCBpbnQgX19lcnJudW0sIF9fY29uc3QgY2hhciAqX19mbmFtZSwKKwkgICAgICAgdW5zaWduZWQgaW50IF9fbGluZSxfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pCit7CisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zdGF0dXMpICYmIF9fc3RhdHVzICE9IDApCisgICAgX19lcnJvcl9hdF9saW5lX25vcmV0dXJuIChfX3N0YXR1cywgX19lcnJudW0sIF9fZm5hbWUsIF9fbGluZSwgX19mb3JtYXQsCisJCQkgICAgICBfX3ZhX2FyZ19wYWNrICgpKTsKKyAgZWxzZQorICAgIF9fZXJyb3JfYXRfbGluZV9hbGlhcyAoX19zdGF0dXMsIF9fZXJybnVtLCBfX2ZuYW1lLCBfX2xpbmUsCisJCQkgICBfX2Zvcm1hdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZmNudGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNmJlMDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZmNudGwuaApAQCAtMCwwICsxLDMzNyBAQAorLyogT18qLCBGXyosIEZEXyogYml0IHZhbHVlcyBmb3IgTGludXguCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgMjAwMCwgMjAwNCwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMCwgMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0ZDTlRMX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9mY250bC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8ZmNudGwuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIF9fVVNFX0dOVQorIyBpbmNsdWRlIDxiaXRzL3Vpby5oPgorI2VuZGlmCisKKworLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcworICAgbG9jYXRlZCBvbiBhIGZldyBmaWxlIHN5c3RlbXMuICAqLworI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMworI2RlZmluZSBPX1JET05MWQkgICAgIDAwCisjZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKKyNkZWZpbmUgT19SRFdSCQkgICAgIDAyCisjZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KKyNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KKyNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KKyNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAorI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKKyNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSworI2RlZmluZSBPX1NZTkMJICAgICAgIDA0MDEwMDAwCisjZGVmaW5lIE9fRlNZTkMJCSBPX1NZTkMKKyNkZWZpbmUgT19BU1lOQwkJIDAyMDAwMAorCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKyMgZGVmaW5lIE9fRElSRUNUT1JZCTAyMDAwMDAJLyogTXVzdCBiZSBhIGRpcmVjdG9yeS4JICovCisjIGRlZmluZSBPX05PRk9MTE9XCTA0MDAwMDAJLyogRG8gbm90IGZvbGxvdyBsaW5rcy4JICovCisjIGRlZmluZSBPX0NMT0VYRUMgICAgIDAyMDAwMDAwIC8qIFNldCBjbG9zZV9vbl9leGVjLiAgKi8KKyNlbmRpZgorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgT19ESVJFQ1QJIDA0MDAwMAkvKiBEaXJlY3QgZGlzayBhY2Nlc3MuCSovCisjIGRlZmluZSBPX05PQVRJTUUgICAgIDAxMDAwMDAwIC8qIERvIG5vdCBzZXQgYXRpbWUuICAqLworIyBkZWZpbmUgT19QQVRICSAgICAgIDAxMDAwMDAwMCAvKiBSZXNvbHZlIHBhdGhuYW1lIGJ1dCBkbyBub3Qgb3BlbiBmaWxlLiAgKi8KKyNlbmRpZgorCisvKiBGb3Igbm93IExpbnV4IGhhcyBzeW5jaHJvbmlzaXR5IG9wdGlvbnMgZm9yIGRhdGEgYW5kIHJlYWQgb3BlcmF0aW9ucy4KKyAgIFdlIGRlZmluZSB0aGUgc3ltYm9scyBoZXJlIGJ1dCBsZXQgdGhlbSBkbyB0aGUgc2FtZSBhcyBPX1NZTkMgc2luY2UKKyAgIHRoaXMgaXMgYSBzdXBlcnNldC4JKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYMTk5MzA5IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CisjIGRlZmluZSBPX0RTWU5DCTAxMDAwMAkvKiBTeW5jaHJvbml6ZSBkYXRhLiAgKi8KKyMgZGVmaW5lIE9fUlNZTkMJT19TWU5DCS8qIFN5bmNocm9uaXplIHJlYWQgb3BlcmF0aW9ucy4JICovCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CisjIGRlZmluZSBPX0xBUkdFRklMRQkwMTAwMDAwCisjZW5kaWYKKworLyogVmFsdWVzIGZvciB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBmY250bCcuICAqLworI2RlZmluZSBGX0RVUEZECQkwCS8qIER1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3IuICAqLworI2RlZmluZSBGX0dFVEZECQkxCS8qIEdldCBmaWxlIGRlc2NyaXB0b3IgZmxhZ3MuICAqLworI2RlZmluZSBGX1NFVEZECQkyCS8qIFNldCBmaWxlIGRlc2NyaXB0b3IgZmxhZ3MuICAqLworI2RlZmluZSBGX0dFVEZMCQkzCS8qIEdldCBmaWxlIHN0YXR1cyBmbGFncy4gICovCisjZGVmaW5lIEZfU0VURkwJCTQJLyogU2V0IGZpbGUgc3RhdHVzIGZsYWdzLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorIyBkZWZpbmUgRl9HRVRMSwk1CS8qIEdldCByZWNvcmQgbG9ja2luZyBpbmZvLiAgKi8KKyMgZGVmaW5lIEZfU0VUTEsJNgkvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAobm9uLWJsb2NraW5nKS4gICovCisjIGRlZmluZSBGX1NFVExLVwk3CS8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChibG9ja2luZykuCSovCisjZWxzZQorIyBkZWZpbmUgRl9HRVRMSwlGX0dFVExLNjQgIC8qIEdldCByZWNvcmQgbG9ja2luZyBpbmZvLgkqLworIyBkZWZpbmUgRl9TRVRMSwlGX1NFVExLNjQgIC8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChub24tYmxvY2tpbmcpLiovCisjIGRlZmluZSBGX1NFVExLVwlGX1NFVExLVzY0IC8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChibG9ja2luZykuICAqLworI2VuZGlmCisjZGVmaW5lIEZfR0VUTEs2NAkxMgkvKiBHZXQgcmVjb3JkIGxvY2tpbmcgaW5mby4gICovCisjZGVmaW5lIEZfU0VUTEs2NAkxMwkvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAobm9uLWJsb2NraW5nKS4gICovCisjZGVmaW5lIEZfU0VUTEtXNjQJMTQJLyogU2V0IHJlY29yZCBsb2NraW5nIGluZm8gKGJsb2NraW5nKS4JKi8KKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKyMgZGVmaW5lIEZfU0VUT1dOCTgJLyogR2V0IG93bmVyIChwcm9jZXNzIHJlY2VpdmluZyBTSUdJTykuICAqLworIyBkZWZpbmUgRl9HRVRPV04JOQkvKiBTZXQgb3duZXIgKHByb2Nlc3MgcmVjZWl2aW5nIFNJR0lPKS4gICovCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgRl9TRVRTSUcJMTAJLyogU2V0IG51bWJlciBvZiBzaWduYWwgdG8gYmUgc2VudC4gICovCisjIGRlZmluZSBGX0dFVFNJRwkxMQkvKiBHZXQgbnVtYmVyIG9mIHNpZ25hbCB0byBiZSBzZW50LiAgKi8KKyMgZGVmaW5lIEZfU0VUT1dOX0VYCTE1CS8qIEdldCBvd25lciAodGhyZWFkIHJlY2VpdmluZyBTSUdJTykuICAqLworIyBkZWZpbmUgRl9HRVRPV05fRVgJMTYJLyogU2V0IG93bmVyICh0aHJlYWQgcmVjZWl2aW5nIFNJR0lPKS4gICovCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgRl9TRVRMRUFTRQkxMDI0CS8qIFNldCBhIGxlYXNlLgkgKi8KKyMgZGVmaW5lIEZfR0VUTEVBU0UJMTAyNQkvKiBFbnF1aXJlIHdoYXQgbGVhc2UgaXMgYWN0aXZlLiAgKi8KKyMgZGVmaW5lIEZfTk9USUZZCTEwMjYJLyogUmVxdWVzdCBub3RmaWNhdGlvbnMgb24gYSBkaXJlY3RvcnkuCSAqLworIyBkZWZpbmUgRl9TRVRQSVBFX1NaCTEwMzEJLyogU2V0IHBpcGUgcGFnZSBzaXplIGFycmF5LiAgKi8KKyMgZGVmaW5lIEZfR0VUUElQRV9TWgkxMDMyCS8qIFNldCBwaXBlIHBhZ2Ugc2l6ZSBhcnJheS4gICovCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorIyBkZWZpbmUgRl9EVVBGRF9DTE9FWEVDIDEwMzAJLyogRHVwbGljYXRlIGZpbGUgZGVzY3JpcHRvciB3aXRoCisJCQkJICAgY2xvc2Utb24tZXhpdCBzZXQuICAqLworI2VuZGlmCisKKy8qIEZvciBGX1tHRVR8U0VUXUZELiAgKi8KKyNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLworCisvKiBGb3IgcG9zaXggZmNudGwoKSBhbmQgYGxfdHlwZScgZmllbGQgb2YgYSBgc3RydWN0IGZsb2NrJyBmb3IgbG9ja2YoKS4gICovCisjZGVmaW5lIEZfUkRMQ0sJCTAJLyogUmVhZCBsb2NrLiAgKi8KKyNkZWZpbmUgRl9XUkxDSwkJMQkvKiBXcml0ZSBsb2NrLgkqLworI2RlZmluZSBGX1VOTENLCQkyCS8qIFJlbW92ZSBsb2NrLgkgKi8KKworLyogRm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2soKS4gICovCisjZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLworI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KKworI2lmZGVmIF9fVVNFX0JTRAorLyogT3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uLgkqLworIyBkZWZpbmUgTE9DS19TSAkxCS8qIHNoYXJlZCBsb2NrICovCisjIGRlZmluZSBMT0NLX0VYCTIJLyogZXhjbHVzaXZlIGxvY2sgKi8KKyMgZGVmaW5lIExPQ0tfTkIJNAkvKiBvcidkIHdpdGggb25lIG9mIHRoZSBhYm92ZSB0byBwcmV2ZW50CisJCQkJICAgYmxvY2tpbmcgKi8KKyMgZGVmaW5lIExPQ0tfVU4JOAkvKiByZW1vdmUgbG9jayAqLworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIExPQ0tfTUFORAkzMgkvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrOgkqLworIyBkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiB3aGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMuCSAqLworIyBkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIHdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMuICAqLworIyBkZWZpbmUgTE9DS19SVwkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcGVyYXRpb25zLgkgKi8KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBUeXBlcyBvZiBkaXJlY3Rvcnkgbm90aWZpY2F0aW9ucyB0aGF0IG1heSBiZSByZXF1ZXN0ZWQgd2l0aCBGX05PVElGWS4gICovCisjIGRlZmluZSBETl9BQ0NFU1MJMHgwMDAwMDAwMQkvKiBGaWxlIGFjY2Vzc2VkLiAgKi8KKyMgZGVmaW5lIEROX01PRElGWQkweDAwMDAwMDAyCS8qIEZpbGUgbW9kaWZpZWQuICAqLworIyBkZWZpbmUgRE5fQ1JFQVRFCTB4MDAwMDAwMDQJLyogRmlsZSBjcmVhdGVkLiAgKi8KKyMgZGVmaW5lIEROX0RFTEVURQkweDAwMDAwMDA4CS8qIEZpbGUgcmVtb3ZlZC4gICovCisjIGRlZmluZSBETl9SRU5BTUUJMHgwMDAwMDAxMAkvKiBGaWxlIHJlbmFtZWQuICAqLworIyBkZWZpbmUgRE5fQVRUUklCCTB4MDAwMDAwMjAJLyogRmlsZSBjaGFuZ2VkIGF0dGlidXRlcy4gICovCisjIGRlZmluZSBETl9NVUxUSVNIT1QJMHg4MDAwMDAwMAkvKiBEb24ndCByZW1vdmUgbm90aWZpZXIuICAqLworI2VuZGlmCisKK3N0cnVjdCBmbG9jaworICB7CisgICAgc2hvcnQgaW50IGxfdHlwZTsJLyogVHlwZSBvZiBsb2NrOiBGX1JETENLLCBGX1dSTENLLCBvciBGX1VOTENLLgkqLworICAgIHNob3J0IGludCBsX3doZW5jZTsJLyogV2hlcmUgYGxfc3RhcnQnIGlzIHJlbGF0aXZlIHRvIChsaWtlIGBsc2VlaycpLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgIF9fb2ZmX3QgbF9zdGFydDsJLyogT2Zmc2V0IHdoZXJlIHRoZSBsb2NrIGJlZ2lucy4gICovCisgICAgX19vZmZfdCBsX2xlbjsJLyogU2l6ZSBvZiB0aGUgbG9ja2VkIGFyZWE7IHplcm8gbWVhbnMgdW50aWwgRU9GLiAgKi8KKyNlbHNlCisgICAgX19vZmY2NF90IGxfc3RhcnQ7CS8qIE9mZnNldCB3aGVyZSB0aGUgbG9jayBiZWdpbnMuICAqLworICAgIF9fb2ZmNjRfdCBsX2xlbjsJLyogU2l6ZSBvZiB0aGUgbG9ja2VkIGFyZWE7IHplcm8gbWVhbnMgdW50aWwgRU9GLiAgKi8KKyNlbmRpZgorICAgIF9fcGlkX3QgbF9waWQ7CS8qIFByb2Nlc3MgaG9sZGluZyB0aGUgbG9jay4gICovCisgIH07CisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorc3RydWN0IGZsb2NrNjQKKyAgeworICAgIHNob3J0IGludCBsX3R5cGU7CS8qIFR5cGUgb2YgbG9jazogRl9SRExDSywgRl9XUkxDSywgb3IgRl9VTkxDSy4JKi8KKyAgICBzaG9ydCBpbnQgbF93aGVuY2U7CS8qIFdoZXJlIGBsX3N0YXJ0JyBpcyByZWxhdGl2ZSB0byAobGlrZSBgbHNlZWsnKS4gICovCisgICAgX19vZmY2NF90IGxfc3RhcnQ7CS8qIE9mZnNldCB3aGVyZSB0aGUgbG9jayBiZWdpbnMuICAqLworICAgIF9fb2ZmNjRfdCBsX2xlbjsJLyogU2l6ZSBvZiB0aGUgbG9ja2VkIGFyZWE7IHplcm8gbWVhbnMgdW50aWwgRU9GLiAgKi8KKyAgICBfX3BpZF90IGxfcGlkOwkvKiBQcm9jZXNzIGhvbGRpbmcgdGhlIGxvY2suICAqLworICB9OworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIE93bmVyIHR5cGVzLiAgKi8KK2VudW0gX19waWRfdHlwZQorICB7CisgICAgRl9PV05FUl9USUQgPSAwLAkJLyogS2VybmVsIHRocmVhZC4gICovCisgICAgRl9PV05FUl9QSUQsCQkvKiBQcm9jZXNzLiAgKi8KKyAgICBGX09XTkVSX1BHUlAsCQkvKiBQcm9jZXNzIGdyb3VwLiAgKi8KKyAgICBGX09XTkVSX0dJRCA9IEZfT1dORVJfUEdSUAkvKiBBbHRlcm5hdGl2ZSwgb2Jzb2xldGUgbmFtZS4gICovCisgIH07CisKKy8qIFN0cnVjdHVyZSB0byB1c2Ugd2l0aCBGX0dFVE9XTl9FWCBhbmQgRl9TRVRPV05fRVguICAqLworc3RydWN0IGZfb3duZXJfZXgKKyAgeworICAgIGVudW0gX19waWRfdHlwZSB0eXBlOwkvKiBPd25lciB0eXBlIG9mIElELiAgKi8KKyAgICBfX3BpZF90IHBpZDsJCS8qIElEIG9mIG93bmVyLiAgKi8KKyAgfTsKKyNlbmRpZgorCisvKiBEZWZpbmUgc29tZSBtb3JlIGNvbXBhdGliaWxpdHkgbWFjcm9zIHRvIGJlIGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aAorICAgQlNEIHN5c3RlbXMgd2hpY2ggZGlkIG5vdCBtYW5hZ2VkIHRvIGhpZGUgdGhlc2Uga2VybmVsIG1hY3Jvcy4gICovCisjaWZkZWYJX19VU0VfQlNECisjIGRlZmluZSBGQVBQRU5ECU9fQVBQRU5ECisjIGRlZmluZSBGRlNZTkMJCU9fRlNZTkMKKyMgZGVmaW5lIEZBU1lOQwkJT19BU1lOQworIyBkZWZpbmUgRk5PTkJMT0NLCU9fTk9OQkxPQ0sKKyMgZGVmaW5lIEZOREVMQVkJT19OREVMQVkKKyNlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworLyogQWR2aXNlIHRvIGBwb3NpeF9mYWR2aXNlJy4gICovCisjaWZkZWYgX19VU0VfWE9QRU4ySworIyBkZWZpbmUgUE9TSVhfRkFEVl9OT1JNQUwJMCAvKiBObyBmdXJ0aGVyIHNwZWNpYWwgdHJlYXRtZW50LiAgKi8KKyMgZGVmaW5lIFBPU0lYX0ZBRFZfUkFORE9NCTEgLyogRXhwZWN0IHJhbmRvbSBwYWdlIHJlZmVyZW5jZXMuICAqLworIyBkZWZpbmUgUE9TSVhfRkFEVl9TRVFVRU5USUFMCTIgLyogRXhwZWN0IHNlcXVlbnRpYWwgcGFnZSByZWZlcmVuY2VzLgkgKi8KKyMgZGVmaW5lIFBPU0lYX0ZBRFZfV0lMTE5FRUQJMyAvKiBXaWxsIG5lZWQgdGhlc2UgcGFnZXMuICAqLworIyBkZWZpbmUgUE9TSVhfRkFEVl9ET05UTkVFRAk0IC8qIERvbid0IG5lZWQgdGhlc2UgcGFnZXMuICAqLworIyBkZWZpbmUgUE9TSVhfRkFEVl9OT1JFVVNFCTUgLyogRGF0YSB3aWxsIGJlIGFjY2Vzc2VkIG9uY2UuICAqLworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0dOVQorLyogRmxhZ3MgZm9yIFNZTkNfRklMRV9SQU5HRS4gICovCisjIGRlZmluZSBTWU5DX0ZJTEVfUkFOR0VfV0FJVF9CRUZPUkUJMSAvKiBXYWl0IHVwb24gd3JpdGVvdXQgb2YgYWxsIHBhZ2VzCisJCQkJCSAgICAgaW4gdGhlIHJhbmdlIGJlZm9yZSBwZXJmb3JtaW5nIHRoZQorCQkJCQkgICAgIHdyaXRlLiAgKi8KKyMgZGVmaW5lIFNZTkNfRklMRV9SQU5HRV9XUklURQkJMiAvKiBJbml0aWF0ZSB3cml0ZW91dCBvZiBhbGwgdGhvc2UKKwkJCQkJICAgICBkaXJ0eSBwYWdlcyBpbiB0aGUgcmFuZ2Ugd2hpY2ggYXJlCisJCQkJCSAgICAgbm90IHByZXNlbnRseSB1bmRlciB3cml0ZWJhY2suICAqLworIyBkZWZpbmUgU1lOQ19GSUxFX1JBTkdFX1dBSVRfQUZURVIJNCAvKiBXYWl0IHVwb24gd3JpdGVvdXQgb2YgYWxsIHBhZ2VzIGluCisJCQkJCSAgICAgdGhlIHJhbmdlIGFmdGVyIHBlcmZvcm1pbmcgdGhlCisJCQkJCSAgICAgd3JpdGUuICAqLworCisvKiBGbGFncyBmb3IgU1BMSUNFIGFuZCBWTVNQTElDRS4gICovCisjIGRlZmluZSBTUExJQ0VfRl9NT1ZFCQkxCS8qIE1vdmUgcGFnZXMgaW5zdGVhZCBvZiBjb3B5aW5nLiAgKi8KKyMgZGVmaW5lIFNQTElDRV9GX05PTkJMT0NLCTIJLyogRG9uJ3QgYmxvY2sgb24gdGhlIHBpcGUgc3BsaWNpbmcKKwkJCQkJICAgKGJ1dCB3ZSBtYXkgc3RpbGwgYmxvY2sgb24gdGhlIGZkCisJCQkJCSAgIHdlIHNwbGljZSBmcm9tL3RvKS4gICovCisjIGRlZmluZSBTUExJQ0VfRl9NT1JFCQk0CS8qIEV4cGVjdCBtb3JlIGRhdGEuICAqLworIyBkZWZpbmUgU1BMSUNFX0ZfR0lGVAkJOAkvKiBQYWdlcyBwYXNzZWQgaW4gYXJlIGEgZ2lmdC4gICovCisKKworLyogRmlsZSBoYW5kbGUgc3RydWN0dXJlLiAgKi8KK3N0cnVjdCBmaWxlX2hhbmRsZQoreworICB1bnNpZ25lZCBpbnQgaGFuZGxlX2J5dGVzOworICBpbnQgaGFuZGxlX3R5cGU7CisgIC8qIEZpbGUgaWRlbnRpZmllci4gICovCisgIHVuc2lnbmVkIGNoYXIgZl9oYW5kbGVbMF07Cit9OworCisvKiBNYXhpbXVtIGhhbmRsZSBzaXplIChmb3Igbm93KS4gICovCisjIGRlZmluZSBNQVhfSEFORExFX1NaCTEyOAorI2VuZGlmCisKKy8qIFZhbHVlcyBmb3IgYCphdCcgZnVuY3Rpb25zLiAgKi8KKyNpZmRlZiBfX1VTRV9BVEZJTEUKKyMgZGVmaW5lIEFUX0ZEQ1dECQktMTAwCS8qIFNwZWNpYWwgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZQorCQkJCQkgICB0aGUgKmF0IGZ1bmN0aW9ucyBzaG91bGQgdXNlIHRoZQorCQkJCQkgICBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAqLworIyBkZWZpbmUgQVRfU1lNTElOS19OT0ZPTExPVwkweDEwMAkvKiBEbyBub3QgZm9sbG93IHN5bWJvbGljIGxpbmtzLiAgKi8KKyMgZGVmaW5lIEFUX1JFTU9WRURJUgkJMHgyMDAJLyogUmVtb3ZlIGRpcmVjdG9yeSBpbnN0ZWFkIG9mCisJCQkJCSAgIHVubGlua2luZyBmaWxlLiAgKi8KKyMgZGVmaW5lIEFUX1NZTUxJTktfRk9MTE9XCTB4NDAwCS8qIEZvbGxvdyBzeW1ib2xpYyBsaW5rcy4gICovCisjIGRlZmluZSBBVF9OT19BVVRPTU9VTlQJMHg4MDAJLyogU3VwcHJlc3MgdGVybWluYWwgYXV0b21vdW50CisJCQkJCSAgIHRyYXZlcnNhbC4gICovCisjIGRlZmluZSBBVF9FQUNDRVNTCQkweDIwMAkvKiBUZXN0IGFjY2VzcyBwZXJtaXR0ZWQgZm9yCisJCQkJCSAgIGVmZmVjdGl2ZSBJRHMsIG5vdCByZWFsIElEcy4gICovCisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisjaWZkZWYgX19VU0VfR05VCisKKy8qIFByb3ZpZGUga2VybmVsIGhpbnQgdG8gcmVhZCBhaGVhZC4gICovCitleHRlcm4gc3NpemVfdCByZWFkYWhlYWQgKGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQsIHNpemVfdCBfX2NvdW50KQorICAgIF9fVEhST1c7CisKKworLyogU2VsZWN0aXZlIGZpbGUgY29udGVudCBzeW5jaCdpbmcuICAqLworZXh0ZXJuIGludCBzeW5jX2ZpbGVfcmFuZ2UgKGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQsIF9fb2ZmNjRfdCBfX2NvdW50LAorCQkJICAgIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKKworCisvKiBTcGxpY2UgYWRkcmVzcyByYW5nZSBpbnRvIGEgcGlwZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCB2bXNwbGljZSAoaW50IF9fZmRvdXQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqX19pb3YsCisJCQkgc2l6ZV90IF9fY291bnQsIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKKworLyogU3BsaWNlIHR3byBmaWxlcyB0b2dldGhlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCBzcGxpY2UgKGludCBfX2ZkaW4sIF9fb2ZmNjRfdCAqX19vZmZpbiwgaW50IF9fZmRvdXQsCisJCSAgICAgICBfX29mZjY0X3QgKl9fb2Zmb3V0LCBzaXplX3QgX19sZW4sCisJCSAgICAgICB1bnNpZ25lZCBpbnQgX19mbGFncyk7CisKKy8qIEluLWtlcm5lbCBpbXBsZW1lbnRhdGlvbiBvZiB0ZWUgZm9yIHBpcGUgYnVmZmVycy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCB0ZWUgKGludCBfX2ZkaW4sIGludCBfX2Zkb3V0LCBzaXplX3QgX19sZW4sCisJCSAgICB1bnNpZ25lZCBpbnQgX19mbGFncyk7CisKKy8qIFJlc2VydmUgc3RvcmFnZSBmb3IgdGhlIGRhdGEgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIEZELgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgZmFsbG9jYXRlIChpbnQgX19mZCwgaW50IF9fbW9kZSwgX19vZmZfdCBfX29mZnNldCwgX19vZmZfdCBfX2xlbik7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoZmFsbG9jYXRlLCAoaW50IF9fZmQsIGludCBfX21vZGUsIF9fb2ZmNjRfdCBfX29mZnNldCwKKwkJCQkgICBfX29mZjY0X3QgX19sZW4pLAorCQkgICAgICAgZmFsbG9jYXRlNjQpOworIyAgZWxzZQorIyAgIGRlZmluZSBmYWxsb2NhdGUgZmFsbG9jYXRlNjQKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IGZhbGxvY2F0ZTY0IChpbnQgX19mZCwgaW50IF9fbW9kZSwgX19vZmY2NF90IF9fb2Zmc2V0LAorCQkJX19vZmY2NF90IF9fbGVuKTsKKyMgZW5kaWYKKworCisvKiBNYXAgZmlsZSBuYW1lIHRvIGZpbGUgaGFuZGxlLiAgKi8KK2V4dGVybiBpbnQgbmFtZV90b19oYW5kbGVfYXQgKGludCBfX2RmZCwgY29uc3QgY2hhciAqX19uYW1lLAorCQkJICAgICAgc3RydWN0IGZpbGVfaGFuZGxlICpfX2hhbmRsZSwgaW50ICpfX21udF9pZCwKKwkJCSAgICAgIGludCBfX2ZsYWdzKSBfX1RIUk9XOworCisvKiBPcGVuIGZpbGUgdXNpbmcgdGhlIGZpbGUgaGFuZGxlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgb3Blbl9ieV9oYW5kbGVfYXQgKGludCBfX21vdW50ZGlyZmQsIHN0cnVjdCBmaWxlX2hhbmRsZSAqX19oYW5kbGUsCisJCQkgICAgICBpbnQgX19mbGFncyk7CisKKyNlbmRpZgorCitfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2ZjbnRsMi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2ZjbnRsMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZTg1ODUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZmNudGwyLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qIENoZWNraW5nIG1hY3JvcyBmb3IgZmNudGwgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9GQ05UTF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL2ZjbnRsMi5oPiBkaXJlY3RseTsgdXNlIDxmY250bC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBDaGVjayB0aGF0IGNhbGxzIHRvIG9wZW4gYW5kIG9wZW5hdCB3aXRoIE9fQ1JFQVQgc2V0IGhhdmUgYW4KKyAgIGFwcHJvcHJpYXRlIHRoaXJkL2ZvdXJ0aCBwYXJhbWV0ZXIuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IF9fb3Blbl8yIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcpIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuX2FsaWFzLCAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnLCAuLi4pLAorCQkgICAgICAgb3BlbikgX19ub25udWxsICgoMSkpOworI2Vsc2UKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuXzIsIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcpLAorCQkgICAgICAgX19vcGVuNjRfMikgX19ub25udWxsICgoMSkpOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX29wZW5fYWxpYXMsIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcsIC4uLiksCisJCSAgICAgICBvcGVuNjQpIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorX19lcnJvcmRlY2wgKF9fb3Blbl90b29fbWFueV9hcmdzLAorCSAgICAgIm9wZW4gY2FuIGJlIGNhbGxlZCBlaXRoZXIgd2l0aCAyIG9yIDMgYXJndW1lbnRzLCBub3QgbW9yZSIpOworX19lcnJvcmRlY2wgKF9fb3Blbl9taXNzaW5nX21vZGUsCisJICAgICAib3BlbiB3aXRoIE9fQ1JFQVQgaW4gc2Vjb25kIGFyZ3VtZW50IG5lZWRzIDMgYXJndW1lbnRzIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitvcGVuIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcsIC4uLikKK3sKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpID4gMSkKKyAgICBfX29wZW5fdG9vX21hbnlfYXJncyAoKTsKKworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fb2ZsYWcpKQorICAgIHsKKyAgICAgIGlmICgoX19vZmxhZyAmIE9fQ1JFQVQpICE9IDAgJiYgX192YV9hcmdfcGFja19sZW4gKCkgPCAxKQorCXsKKwkgIF9fb3Blbl9taXNzaW5nX21vZGUgKCk7CisJICByZXR1cm4gX19vcGVuXzIgKF9fcGF0aCwgX19vZmxhZyk7CisJfQorICAgICAgcmV0dXJuIF9fb3Blbl9hbGlhcyAoX19wYXRoLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKKyAgICB9CisKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKyAgICByZXR1cm4gX19vcGVuXzIgKF9fcGF0aCwgX19vZmxhZyk7CisKKyAgcmV0dXJuIF9fb3Blbl9hbGlhcyAoX19wYXRoLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgX19vcGVuNjRfMiAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnKSBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3BlbjY0X2FsaWFzLCAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnLAorCQkJCQkuLi4pLCBvcGVuNjQpIF9fbm9ubnVsbCAoKDEpKTsKK19fZXJyb3JkZWNsIChfX29wZW42NF90b29fbWFueV9hcmdzLAorCSAgICAgIm9wZW42NCBjYW4gYmUgY2FsbGVkIGVpdGhlciB3aXRoIDIgb3IgMyBhcmd1bWVudHMsIG5vdCBtb3JlIik7CitfX2Vycm9yZGVjbCAoX19vcGVuNjRfbWlzc2luZ19tb2RlLAorCSAgICAgIm9wZW42NCB3aXRoIE9fQ1JFQVQgaW4gc2Vjb25kIGFyZ3VtZW50IG5lZWRzIDMgYXJndW1lbnRzIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitvcGVuNjQgKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZywgLi4uKQoreworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPiAxKQorICAgIF9fb3BlbjY0X3Rvb19tYW55X2FyZ3MgKCk7CisKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX29mbGFnKSkKKyAgICB7CisgICAgICBpZiAoKF9fb2ZsYWcgJiBPX0NSRUFUKSAhPSAwICYmIF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKwl7CisJICBfX29wZW42NF9taXNzaW5nX21vZGUgKCk7CisJICByZXR1cm4gX19vcGVuNjRfMiAoX19wYXRoLCBfX29mbGFnKTsKKwl9CisgICAgICByZXR1cm4gX19vcGVuNjRfYWxpYXMgKF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7CisgICAgfQorCisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisgICAgcmV0dXJuIF9fb3BlbjY0XzIgKF9fcGF0aCwgX19vZmxhZyk7CisKKyAgcmV0dXJuIF9fb3BlbjY0X2FsaWFzIChfX3BhdGgsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworfQorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0FURklMRQorIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBfX29wZW5hdF8yIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnKQorICAgICBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3BlbmF0X2FsaWFzLCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLAorCQkJCQlpbnQgX19vZmxhZywgLi4uKSwgb3BlbmF0KQorICAgICBfX25vbm51bGwgKCgyKSk7CisjIGVsc2UKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuYXRfMiwgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwKKwkJCQkgICAgaW50IF9fb2ZsYWcpLCBfX29wZW5hdDY0XzIpCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuYXRfYWxpYXMsIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsCisJCQkJCWludCBfX29mbGFnLCAuLi4pLCBvcGVuYXQ2NCkKKyAgICAgX19ub25udWxsICgoMikpOworIyBlbmRpZgorX19lcnJvcmRlY2wgKF9fb3BlbmF0X3Rvb19tYW55X2FyZ3MsCisJICAgICAib3BlbmF0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIHdpdGggMyBvciA0IGFyZ3VtZW50cywgbm90IG1vcmUiKTsKK19fZXJyb3JkZWNsIChfX29wZW5hdF9taXNzaW5nX21vZGUsCisJICAgICAib3BlbmF0IHdpdGggT19DUkVBVCBpbiB0aGlyZCBhcmd1bWVudCBuZWVkcyA0IGFyZ3VtZW50cyIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorb3BlbmF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnLCAuLi4pCit7CisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA+IDEpCisgICAgX19vcGVuYXRfdG9vX21hbnlfYXJncyAoKTsKKworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fb2ZsYWcpKQorICAgIHsKKyAgICAgIGlmICgoX19vZmxhZyAmIE9fQ1JFQVQpICE9IDAgJiYgX192YV9hcmdfcGFja19sZW4gKCkgPCAxKQorCXsKKwkgIF9fb3BlbmF0X21pc3NpbmdfbW9kZSAoKTsKKwkgIHJldHVybiBfX29wZW5hdF8yIChfX2ZkLCBfX3BhdGgsIF9fb2ZsYWcpOworCX0KKyAgICAgIHJldHVybiBfX29wZW5hdF9hbGlhcyAoX19mZCwgX19wYXRoLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKKyAgICB9CisKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKyAgICByZXR1cm4gX19vcGVuYXRfMiAoX19mZCwgX19wYXRoLCBfX29mbGFnKTsKKworICByZXR1cm4gX19vcGVuYXRfYWxpYXMgKF9fZmQsIF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7Cit9CisKKworIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBfX29wZW5hdDY0XzIgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcpCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuYXQ2NF9hbGlhcywgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwKKwkJCQkJICBpbnQgX19vZmxhZywgLi4uKSwgb3BlbmF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKK19fZXJyb3JkZWNsIChfX29wZW5hdDY0X3Rvb19tYW55X2FyZ3MsCisJICAgICAib3BlbmF0NjQgY2FuIGJlIGNhbGxlZCBlaXRoZXIgd2l0aCAzIG9yIDQgYXJndW1lbnRzLCBub3QgbW9yZSIpOworX19lcnJvcmRlY2wgKF9fb3BlbmF0NjRfbWlzc2luZ19tb2RlLAorCSAgICAgIm9wZW5hdDY0IHdpdGggT19DUkVBVCBpbiB0aGlyZCBhcmd1bWVudCBuZWVkcyA0IGFyZ3VtZW50cyIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorb3BlbmF0NjQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcsIC4uLikKK3sKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpID4gMSkKKyAgICBfX29wZW5hdDY0X3Rvb19tYW55X2FyZ3MgKCk7CisKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX29mbGFnKSkKKyAgICB7CisgICAgICBpZiAoKF9fb2ZsYWcgJiBPX0NSRUFUKSAhPSAwICYmIF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKwl7CisJICBfX29wZW5hdDY0X21pc3NpbmdfbW9kZSAoKTsKKwkgIHJldHVybiBfX29wZW5hdDY0XzIgKF9fZmQsIF9fcGF0aCwgX19vZmxhZyk7CisJfQorICAgICAgcmV0dXJuIF9fb3BlbmF0NjRfYWxpYXMgKF9fZmQsIF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7CisgICAgfQorCisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisgICAgcmV0dXJuIF9fb3BlbmF0NjRfMiAoX19mZCwgX19wYXRoLCBfX29mbGFnKTsKKworICByZXR1cm4gX19vcGVuYXQ2NF9hbGlhcyAoX19mZCwgX19wYXRoLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyMgZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2ZlbnYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9mZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwMDc3MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9mZW52LmgKQEAgLTAsMCArMSwxMzggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfRkVOVl9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvZmVudi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8ZmVudi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKy8qIERlZmluZSBiaXRzIHJlcHJlc2VudGluZyB0aGUgZXhjZXB0aW9uLiAgV2UgdXNlIHRoZSBiaXQgcG9zaXRpb25zCisgICBvZiB0aGUgYXBwcm9wcmlhdGUgYml0cyBpbiB0aGUgRlBVIGNvbnRyb2wgd29yZC4gICovCitlbnVtCisgIHsKKyAgICBGRV9JTlZBTElEID0gMHgwMSwKKyNkZWZpbmUgRkVfSU5WQUxJRAlGRV9JTlZBTElECisgICAgX19GRV9ERU5PUk0gPSAweDAyLAorICAgIEZFX0RJVkJZWkVSTyA9IDB4MDQsCisjZGVmaW5lIEZFX0RJVkJZWkVSTwlGRV9ESVZCWVpFUk8KKyAgICBGRV9PVkVSRkxPVyA9IDB4MDgsCisjZGVmaW5lIEZFX09WRVJGTE9XCUZFX09WRVJGTE9XCisgICAgRkVfVU5ERVJGTE9XID0gMHgxMCwKKyNkZWZpbmUgRkVfVU5ERVJGTE9XCUZFX1VOREVSRkxPVworICAgIEZFX0lORVhBQ1QgPSAweDIwCisjZGVmaW5lIEZFX0lORVhBQ1QJRkVfSU5FWEFDVAorICB9OworCisjZGVmaW5lIEZFX0FMTF9FWENFUFQgXAorCShGRV9JTkVYQUNUIHwgRkVfRElWQllaRVJPIHwgRkVfVU5ERVJGTE9XIHwgRkVfT1ZFUkZMT1cgfCBGRV9JTlZBTElEKQorCisvKiBUaGUgaXg4NyBGUFUgc3VwcG9ydHMgYWxsIG9mIHRoZSBmb3VyIGRlZmluZWQgcm91bmRpbmcgbW9kZXMuICBXZQorICAgdXNlIGFnYWluIHRoZSBiaXQgcG9zaXRpb25zIGluIHRoZSBGUFUgY29udHJvbCB3b3JkIGFzIHRoZSB2YWx1ZXMKKyAgIGZvciB0aGUgYXBwcm9wcmlhdGUgbWFjcm9zLiAgKi8KK2VudW0KKyAgeworICAgIEZFX1RPTkVBUkVTVCA9IDAsCisjZGVmaW5lIEZFX1RPTkVBUkVTVAlGRV9UT05FQVJFU1QKKyAgICBGRV9ET1dOV0FSRCA9IDB4NDAwLAorI2RlZmluZSBGRV9ET1dOV0FSRAlGRV9ET1dOV0FSRAorICAgIEZFX1VQV0FSRCA9IDB4ODAwLAorI2RlZmluZSBGRV9VUFdBUkQJRkVfVVBXQVJECisgICAgRkVfVE9XQVJEWkVSTyA9IDB4YzAwCisjZGVmaW5lIEZFX1RPV0FSRFpFUk8JRkVfVE9XQVJEWkVSTworICB9OworCisKKy8qIFR5cGUgcmVwcmVzZW50aW5nIGV4Y2VwdGlvbiBmbGFncy4gICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBmZXhjZXB0X3Q7CisKKworLyogVHlwZSByZXByZXNlbnRpbmcgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQuICBUaGlzIGZ1bmN0aW9uIGNvcnJlc3BvbmRzCisgICB0byB0aGUgbGF5b3V0IG9mIHRoZSBibG9jayB3cml0dGVuIGJ5IHRoZSBgZnN0ZW52Jy4gICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fY29udHJvbF93b3JkOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3VudXNlZDE7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fc3RhdHVzX3dvcmQ7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdW51c2VkMjsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX190YWdzOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3VudXNlZDM7CisgICAgdW5zaWduZWQgaW50IF9fZWlwOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX2NzX3NlbGVjdG9yOworICAgIHVuc2lnbmVkIGludCBfX29wY29kZToxMTsKKyAgICB1bnNpZ25lZCBpbnQgX191bnVzZWQ0OjU7CisgICAgdW5zaWduZWQgaW50IF9fZGF0YV9vZmZzZXQ7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fZGF0YV9zZWxlY3RvcjsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX191bnVzZWQ1OworICB9CitmZW52X3Q7CisKKy8qIElmIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGlzIHVzZWQgd2UgdXNlIHRoaXMgdmFsdWUuICAqLworI2RlZmluZSBGRV9ERkxfRU5WCSgoX19jb25zdCBmZW52X3QgKikgLTEpCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50IHdoZXJlIG5vbmUgb2YgdGhlIGV4Y2VwdGlvbiBpcyBtYXNrZWQuICAqLworIyBkZWZpbmUgRkVfTk9NQVNLX0VOVgkoKF9fY29uc3QgZmVudl90ICopIC0yKQorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCitfX0JFR0lOX0RFQ0xTCisKKy8qIE9wdGltaXplZCB2ZXJzaW9ucy4gICovCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2ZlcmFpc2VleGNlcHRfcmVuYW1lZCwgKGludCksIGZlcmFpc2VleGNlcHQpOworX19leHRlcm5faW5saW5lIGludAorX19OVEggKGZlcmFpc2VleGNlcHQgKGludCBfX2V4Y2VwdHMpKQoreworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fZXhjZXB0cykKKyAgICAgICYmIChfX2V4Y2VwdHMgJiB+KEZFX0lOVkFMSUQgfCBGRV9ESVZCWVpFUk8pKSA9PSAwKQorICAgIHsKKyAgICAgIGlmICgoRkVfSU5WQUxJRCAmIF9fZXhjZXB0cykgIT0gMCkKKwl7CisJICAvKiBPbmUgZXhhbXBsZSBvZiBhIGludmFsaWQgb3BlcmF0aW9uIGlzIDAuMCAvIDAuMC4gICovCisJICBmbG9hdCBfX2YgPSAwLjA7CisKKyMgaWZkZWYgX19TU0VfTUFUSF9fCisJICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImRpdnNzICUwLCAlMCAiIDogOiAieCIgKF9fZikpOworIyBlbHNlCisJICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZkaXYgJSVzdCwgJSVzdCgwKTsgZndhaXQiCisJCQkJOiAiPXQiIChfX2YpIDogIjAiIChfX2YpKTsKKyMgZW5kaWYKKwkgICh2b2lkKSAmX19mOworCX0KKyAgICAgIGlmICgoRkVfRElWQllaRVJPICYgX19leGNlcHRzKSAhPSAwKQorCXsKKwkgIGZsb2F0IF9fZiA9IDEuMDsKKwkgIGZsb2F0IF9fZyA9IDAuMDsKKworIyBpZmRlZiBfX1NTRV9NQVRIX18KKwkgIF9fYXNtX18gX192b2xhdGlsZV9fICgiZGl2c3MgJTEsICUwIiA6IDogIngiIChfX2YpLCAieCIgKF9fZykpOworIyBlbHNlCisJICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZkaXZwICUlc3QoMSksICUlc3Q7IGZ3YWl0IgorCQkJCTogIj10IiAoX19mKSA6ICIwIiAoX19mKSwgInUiIChfX2cpIDogInN0KDEpIik7CisjIGVuZGlmCisJICAodm9pZCkgJl9fZjsKKwl9CisKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gX19mZXJhaXNlZXhjZXB0X3JlbmFtZWQgKF9fZXhjZXB0cyk7Cit9CisKK19fRU5EX0RFQ0xTCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9mZW52aW5saW5lLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZmVudmlubGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjc3YjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZmVudmlubGluZS5oCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyBmaWxlIHByb3ZpZGVzIGlubGluZSB2ZXJzaW9ucyBvZiBmbG9hdGluZy1waW50IGVudmlyb25tZW50CisgICBoYW5kbGluZyBmdW5jdGlvbnMuICBJZiB0aGVyZSB3ZXJlIGFueS4gICovCisKKyNpZm5kZWYgX19OT19NQVRIX0lOTElORVMKKworLyogSGVyZSBpcyB3aGVyZSB0aGUgY29kZSB3b3VsZCBnby4gICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2h1Z2VfdmFsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaHVnZV92YWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWNhMTFmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2h1Z2VfdmFsLmgKQEAgLTAsMCArMSw1NSBAQAorLyogYEhVR0VfVkFMJyBjb25zdGFudCBmb3IgSUVFRSA3NTQgbWFjaGluZXMgKHdoZXJlIGl0IGlzIGluZmluaXR5KS4KKyAgIFVzZWQgYnkgPHN0ZGxpYi5oPiBhbmQgPG1hdGguaD4gZnVuY3Rpb25zIGZvciBvdmVyZmxvdy4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwNAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2h1Z2VfdmFsLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIElFRUUgcG9zaXRpdmUgaW5maW5pdHkgKC1IVUdFX1ZBTCBpcyBuZWdhdGl2ZSBpbmZpbml0eSkuICAqLworCisjaWYgX19HTlVDX1BSRVJFUSgzLDMpCisjIGRlZmluZSBIVUdFX1ZBTAkoX19idWlsdGluX2h1Z2VfdmFsKCkpCisjZWxpZiBfX0dOVUNfUFJFUkVRKDIsOTYpCisjIGRlZmluZSBIVUdFX1ZBTAkoX19leHRlbnNpb25fXyAweDEuMHAyMDQ3KQorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworCisjIGRlZmluZSBIVUdFX1ZBTCBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICgodW5pb24geyB1bnNpZ25lZCBfX2wgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ESV9fKSkpOyBkb3VibGUgX19kOyB9KSAgIFwKKyAgICB7IF9fbDogMHg3ZmYwMDAwMDAwMDAwMDAwVUxMIH0pLl9fZCkKKworI2Vsc2UgLyogbm90IEdDQyAqLworCisjIGluY2x1ZGUgPGVuZGlhbi5oPgorCit0eXBlZGVmIHVuaW9uIHsgdW5zaWduZWQgY2hhciBfX2NbOF07IGRvdWJsZSBfX2Q7IH0gX19odWdlX3ZhbF90OworCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgIGRlZmluZSBfX0hVR0VfVkFMX2J5dGVzCXsgMHg3ZiwgMHhmMCwgMCwgMCwgMCwgMCwgMCwgMCB9CisjIGVuZGlmCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgIGRlZmluZSBfX0hVR0VfVkFMX2J5dGVzCXsgMCwgMCwgMCwgMCwgMCwgMCwgMHhmMCwgMHg3ZiB9CisjIGVuZGlmCisKK3N0YXRpYyBfX2h1Z2VfdmFsX3QgX19odWdlX3ZhbCA9IHsgX19IVUdFX1ZBTF9ieXRlcyB9OworIyBkZWZpbmUgSFVHRV9WQUwJKF9faHVnZV92YWwuX19kKQorCisjZW5kaWYJLyogR0NDLiAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9odWdlX3ZhbGYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9odWdlX3ZhbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzg1MzQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2h1Z2VfdmFsZi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIGBIVUdFX1ZBTEYnIGNvbnN0YW50IGZvciBJRUVFIDc1NCBtYWNoaW5lcyAod2hlcmUgaXQgaXMgaW5maW5pdHkpLgorICAgVXNlZCBieSA8c3RkbGliLmg+IGFuZCA8bWF0aC5oPiBmdW5jdGlvbnMgZm9yIG92ZXJmbG93LgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwLCAyMDA0CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTUFUSF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaHVnZV92YWxmLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIElFRUUgcG9zaXRpdmUgaW5maW5pdHkgKC1IVUdFX1ZBTCBpcyBuZWdhdGl2ZSBpbmZpbml0eSkuICAqLworCisjaWYgX19HTlVDX1BSRVJFUSgzLDMpCisjIGRlZmluZSBIVUdFX1ZBTEYJKF9fYnVpbHRpbl9odWdlX3ZhbGYoKSkKKyNlbGlmIF9fR05VQ19QUkVSRVEoMiw5NikKKyMgZGVmaW5lIEhVR0VfVkFMRgkoX19leHRlbnNpb25fXyAweDEuMHAyNTVmKQorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworCisjICAgZGVmaW5lIEhVR0VfVkFMRiBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICgodW5pb24geyB1bnNpZ25lZCBfX2wgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19TSV9fKSkpOyBmbG9hdCBfX2Q7IH0pICAgIFwKKyAgICB7IF9fbDogMHg3ZjgwMDAwMFVMIH0pLl9fZCkKKworI2Vsc2UgLyogbm90IEdDQyAqLworCit0eXBlZGVmIHVuaW9uIHsgdW5zaWduZWQgY2hhciBfX2NbNF07IGZsb2F0IF9fZjsgfSBfX2h1Z2VfdmFsZl90OworCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgIGRlZmluZSBfX0hVR0VfVkFMRl9ieXRlcwl7IDB4N2YsIDB4ODAsIDAsIDAgfQorIyBlbmRpZgorIyBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgX19IVUdFX1ZBTEZfYnl0ZXMJeyAwLCAwLCAweDgwLCAweDdmIH0KKyMgZW5kaWYKKworc3RhdGljIF9faHVnZV92YWxmX3QgX19odWdlX3ZhbGYgPSB7IF9fSFVHRV9WQUxGX2J5dGVzIH07CisjIGRlZmluZSBIVUdFX1ZBTEYJKF9faHVnZV92YWxmLl9fZikKKworI2VuZGlmCS8qIEdDQy4gICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaHVnZV92YWxsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaHVnZV92YWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3OGM3YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9odWdlX3ZhbGwuaApAQCAtMCwwICsxLDQzIEBACisvKiBgSFVHRV9WQUxMJyBjb25zdGFudCBmb3IgaXg4NiAod2hlcmUgaXQgaXMgaW5maW5pdHkpLgorICAgVXNlZCBieSA8c3RkbGliLmg+IGFuZCA8bWF0aC5oPiBmdW5jdGlvbnMgZm9yIG92ZXJmbG93LgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwLCAyMDA0CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTUFUSF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaHVnZV92YWxsLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZiBfX0dOVUNfUFJFUkVRKDMsMykKKyMgZGVmaW5lIEhVR0VfVkFMTAkoX19idWlsdGluX2h1Z2VfdmFsbCgpKQorI2VsaWYgX19HTlVDX1BSRVJFUSgyLDk2KQorIyBkZWZpbmUgSFVHRV9WQUxMCShfX2V4dGVuc2lvbl9fIDB4MS4wcDMyNzY3TCkKKyNlbHNlCisKKyMgZGVmaW5lIF9fSFVHRV9WQUxMX2J5dGVzCXsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHg4MCwgMHhmZiwgMHg3ZiwgMCwgMCB9CisKKyMgZGVmaW5lIF9faHVnZV92YWxsX3QJdW5pb24geyB1bnNpZ25lZCBjaGFyIF9fY1sxMl07IGxvbmcgZG91YmxlIF9fbGQ7IH0KKyMgaWZkZWYgX19HTlVDX18KKyMgIGRlZmluZSBIVUdFX1ZBTEwJKF9fZXh0ZW5zaW9uX18gXAorCQkJICgoX19odWdlX3ZhbGxfdCkgeyBfX2M6IF9fSFVHRV9WQUxMX2J5dGVzIH0pLl9fbGQpCisjIGVsc2UJLyogTm90IEdDQy4gICovCitzdGF0aWMgX19odWdlX3ZhbGxfdCBfX2h1Z2VfdmFsbCA9IHsgX19IVUdFX1ZBTExfYnl0ZXMgfTsKKyMgIGRlZmluZSBIVUdFX1ZBTEwJKF9faHVnZV92YWxsLl9fbGQpCisjICBlbmRpZiAvKiBHQ0MuICAqLworCisjZW5kaWYgLyogR0NDIDIuOTUgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1ZTE0NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pbi5oCkBAIC0wLDAgKzEsMTg5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwMCwyMDA0LDIwMDgsMjAxMCwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBMaW51eCB2ZXJzaW9uLiAgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9JTl9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG5ldGluZXQvaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogT3B0aW9ucyBmb3IgdXNlIHdpdGggYGdldHNvY2tvcHQnIGFuZCBgc2V0c29ja29wdCcgYXQgdGhlIElQIGxldmVsLgorICAgVGhlIGZpcnN0IHdvcmQgaW4gdGhlIGNvbW1lbnQgYXQgdGhlIHJpZ2h0IGlzIHRoZSBkYXRhIHR5cGUgdXNlZDsKKyAgICJib29sIiBtZWFucyBhIGJvb2xlYW4gdmFsdWUgc3RvcmVkIGluIGFuIGBpbnQnLiAgKi8KKyNkZWZpbmUgICAgICAgIElQX09QVElPTlMgICAgICA0ICAgICAgIC8qIGlwX29wdHM7IElQIHBlci1wYWNrZXQgb3B0aW9ucy4gICovCisjZGVmaW5lICAgICAgICBJUF9IRFJJTkNMICAgICAgMyAgICAgICAvKiBpbnQ7IEhlYWRlciBpcyBpbmNsdWRlZCB3aXRoIGRhdGEuICAqLworI2RlZmluZSAgICAgICAgSVBfVE9TICAgICAgICAgIDEgICAgICAgLyogaW50OyBJUCB0eXBlIG9mIHNlcnZpY2UgYW5kIHByZWNlZGVuY2UuICAqLworI2RlZmluZSAgICAgICAgSVBfVFRMICAgICAgICAgIDIgICAgICAgLyogaW50OyBJUCB0aW1lIHRvIGxpdmUuICAqLworI2RlZmluZSAgICAgICAgSVBfUkVDVk9QVFMgICAgIDYgICAgICAgLyogYm9vbDsgUmVjZWl2ZSBhbGwgSVAgb3B0aW9ucyB3L2RhdGFncmFtLiAgKi8KKy8qIEZvciBCU0QgY29tcGF0aWJpbGl0eS4gICovCisjZGVmaW5lICAgICAgICBJUF9SRUNWUkVUT1BUUyAgSVBfUkVUT1BUUyAgICAgICAvKiBib29sOyBSZWNlaXZlIElQIG9wdGlvbnMgZm9yIHJlc3BvbnNlLiAgKi8KKyNkZWZpbmUgICAgICAgIElQX1JFVE9QVFMgICAgICA3ICAgICAgIC8qIGlwX29wdHM7IFNldC9nZXQgSVAgcGVyLXBhY2tldCBvcHRpb25zLiAgKi8KKyNkZWZpbmUgSVBfTVVMVElDQVNUX0lGIDMyCS8qIGluX2FkZHI7IHNldC9nZXQgSVAgbXVsdGljYXN0IGkvZiAqLworI2RlZmluZSBJUF9NVUxUSUNBU1RfVFRMIDMzCS8qIHVfY2hhcjsgc2V0L2dldCBJUCBtdWx0aWNhc3QgdHRsICovCisjZGVmaW5lIElQX01VTFRJQ0FTVF9MT09QIDM0CS8qIGlfY2hhcjsgc2V0L2dldCBJUCBtdWx0aWNhc3QgbG9vcGJhY2sgKi8KKyNkZWZpbmUgSVBfQUREX01FTUJFUlNISVAgMzUJLyogaXBfbXJlcTsgYWRkIGFuIElQIGdyb3VwIG1lbWJlcnNoaXAgKi8KKyNkZWZpbmUgSVBfRFJPUF9NRU1CRVJTSElQIDM2CS8qIGlwX21yZXE7IGRyb3AgYW4gSVAgZ3JvdXAgbWVtYmVyc2hpcCAqLworI2RlZmluZSBJUF9VTkJMT0NLX1NPVVJDRSAzNwkvKiBpcF9tcmVxX3NvdXJjZTogdW5ibG9jayBkYXRhIGZyb20gc291cmNlICovCisjZGVmaW5lIElQX0JMT0NLX1NPVVJDRSAzOAkvKiBpcF9tcmVxX3NvdXJjZTogYmxvY2sgZGF0YSBmcm9tIHNvdXJjZSAqLworI2RlZmluZSBJUF9BRERfU09VUkNFX01FTUJFUlNISVAgMzkgLyogaXBfbXJlcV9zb3VyY2U6IGpvaW4gc291cmNlIGdyb3VwICovCisjZGVmaW5lIElQX0RST1BfU09VUkNFX01FTUJFUlNISVAgNDAgLyogaXBfbXJlcV9zb3VyY2U6IGxlYXZlIHNvdXJjZSBncm91cCAqLworI2RlZmluZSBJUF9NU0ZJTFRFUiA0MQorI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0dOVQorIyBkZWZpbmUgTUNBU1RfSk9JTl9HUk9VUCA0MgkvKiBncm91cF9yZXE6IGpvaW4gYW55LXNvdXJjZSBncm91cCAqLworIyBkZWZpbmUgTUNBU1RfQkxPQ0tfU09VUkNFIDQzCS8qIGdyb3VwX3NvdXJjZV9yZXE6IGJsb2NrIGZyb20gZ2l2ZW4gZ3JvdXAgKi8KKyMgZGVmaW5lIE1DQVNUX1VOQkxPQ0tfU09VUkNFIDQ0IC8qIGdyb3VwX3NvdXJjZV9yZXE6IHVuYmxvY2sgZnJvbSBnaXZlbiBncm91cCovCisjIGRlZmluZSBNQ0FTVF9MRUFWRV9HUk9VUCA0NQkvKiBncm91cF9yZXE6IGxlYXZlIGFueS1zb3VyY2UgZ3JvdXAgKi8KKyMgZGVmaW5lIE1DQVNUX0pPSU5fU09VUkNFX0dST1VQIDQ2IC8qIGdyb3VwX3NvdXJjZV9yZXE6IGpvaW4gc291cmNlLXNwZWMgZ3IgKi8KKyMgZGVmaW5lIE1DQVNUX0xFQVZFX1NPVVJDRV9HUk9VUCA0NyAvKiBncm91cF9zb3VyY2VfcmVxOiBsZWF2ZSBzb3VyY2Utc3BlYyBnciovCisjIGRlZmluZSBNQ0FTVF9NU0ZJTFRFUiA0OAorCisjIGRlZmluZSBNQ0FTVF9FWENMVURFICAgMAorIyBkZWZpbmUgTUNBU1RfSU5DTFVERSAgIDEKKyNlbmRpZgorCisjZGVmaW5lIElQX1JPVVRFUl9BTEVSVAk1CS8qIGJvb2wgKi8KKyNkZWZpbmUgSVBfUEtUSU5GTwk4CS8qIGJvb2wgKi8KKyNkZWZpbmUgSVBfUEtUT1BUSU9OUwk5CisjZGVmaW5lIElQX1BNVFVESVNDCTEwCS8qIG9ic29sZXRlIG5hbWU/ICovCisjZGVmaW5lIElQX01UVV9ESVNDT1ZFUgkxMAkvKiBpbnQ7IHNlZSBiZWxvdyAqLworI2RlZmluZSBJUF9SRUNWRVJSCTExCS8qIGJvb2wgKi8KKyNkZWZpbmUgSVBfUkVDVlRUTAkxMgkvKiBib29sICovCisjZGVmaW5lIElQX1JFQ1ZUT1MJMTMJLyogYm9vbCAqLworI2RlZmluZSBJUF9NVFUJCTE0CS8qIGludCAqLworI2RlZmluZSBJUF9GUkVFQklORAkxNQorI2RlZmluZSBJUF9JUFNFQ19QT0xJQ1kgMTYKKyNkZWZpbmUgSVBfWEZSTV9QT0xJQ1kJMTcKKyNkZWZpbmUgSVBfUEFTU1NFQwkxOAorI2RlZmluZSBJUF9UUkFOU1BBUkVOVAkxOQorI2RlZmluZSBJUF9NVUxUSUNBU1RfQUxMIDQ5CS8qIGJvb2wgKi8KKworLyogVFByb3h5IG9yaWdpbmFsIGFkZHJlc3NlcyAqLworI2RlZmluZSBJUF9PUklHRFNUQUREUiAgICAgICAyMAorI2RlZmluZSBJUF9SRUNWT1JJR0RTVEFERFIgICBJUF9PUklHRFNUQUREUgorCisjZGVmaW5lIElQX01JTlRUTCAgICAgICAyMQorCisKKy8qIElQX01UVV9ESVNDT1ZFUiBhcmd1bWVudHMuICAqLworI2RlZmluZSBJUF9QTVRVRElTQ19ET05UICAgMAkvKiBOZXZlciBzZW5kIERGIGZyYW1lcy4gICovCisjZGVmaW5lIElQX1BNVFVESVNDX1dBTlQgICAxCS8qIFVzZSBwZXIgcm91dGUgaGludHMuICAqLworI2RlZmluZSBJUF9QTVRVRElTQ19ETyAgICAgMgkvKiBBbHdheXMgREYuICAqLworI2RlZmluZSBJUF9QTVRVRElTQ19QUk9CRSAgMwkvKiBJZ25vcmUgZHN0IHBtdHUuICAqLworCisvKiBUbyBzZWxlY3QgdGhlIElQIGxldmVsLiAgKi8KKyNkZWZpbmUgU09MX0lQCTAKKworI2RlZmluZSBJUF9ERUZBVUxUX01VTFRJQ0FTVF9UVEwgICAgICAgIDEKKyNkZWZpbmUgSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCAgICAgICAxCisjZGVmaW5lIElQX01BWF9NRU1CRVJTSElQUyAgICAgICAgICAgICAgMjAKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0dOVQorLyogU3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgSVAgb3B0aW9ucyBmb3IgSVBfT1BUSU9OUyBhbmQgSVBfUkVUT1BUUy4KKyAgIFRoZSBgaXBfZHN0JyBmaWVsZCBpcyB1c2VkIGZvciB0aGUgZmlyc3QtaG9wIGdhdGV3YXkgd2hlbiB1c2luZyBhCisgICBzb3VyY2Ugcm91dGUgKHRoaXMgZ2V0cyBwdXQgaW50byB0aGUgaGVhZGVyIHByb3BlcikuICAqLworc3RydWN0IGlwX29wdHMKKyAgeworICAgIHN0cnVjdCBpbl9hZGRyIGlwX2RzdDsJLyogRmlyc3QgaG9wOyB6ZXJvIHdpdGhvdXQgc291cmNlIHJvdXRlLiAgKi8KKyAgICBjaGFyIGlwX29wdHNbNDBdOwkJLyogQWN0dWFsbHkgdmFyaWFibGUgaW4gc2l6ZS4gICovCisgIH07CisKKy8qIExpa2UgYHN0cnVjdCBpcF9tcmVxJyBidXQgaW5jbHVkaW5nIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGJ5IGluZGV4LiAgKi8KK3N0cnVjdCBpcF9tcmVxbgorICB7CisgICAgc3RydWN0IGluX2FkZHIgaW1yX211bHRpYWRkcjsJLyogSVAgbXVsdGljYXN0IGFkZHJlc3Mgb2YgZ3JvdXAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpbXJfYWRkcmVzczsJCS8qIGxvY2FsIElQIGFkZHJlc3Mgb2YgaW50ZXJmYWNlICovCisgICAgaW50CWltcl9pZmluZGV4OwkJCS8qIEludGVyZmFjZSBpbmRleCAqLworICB9OworCisvKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgSVBfUEtUSU5GTy4gICovCitzdHJ1Y3QgaW5fcGt0aW5mbworICB7CisgICAgaW50IGlwaV9pZmluZGV4OwkJCS8qIEludGVyZmFjZSBpbmRleCAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpcGlfc3BlY19kc3Q7CS8qIFJvdXRpbmcgZGVzdGluYXRpb24gYWRkcmVzcyAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpcGlfYWRkcjsJCS8qIEhlYWRlciBkZXN0aW5hdGlvbiBhZGRyZXNzICAqLworICB9OworI2VuZGlmCisKKy8qIE9wdGlvbnMgZm9yIHVzZSB3aXRoIGBnZXRzb2Nrb3B0JyBhbmQgYHNldHNvY2tvcHQnIGF0IHRoZSBJUHY2IGxldmVsLgorICAgVGhlIGZpcnN0IHdvcmQgaW4gdGhlIGNvbW1lbnQgYXQgdGhlIHJpZ2h0IGlzIHRoZSBkYXRhIHR5cGUgdXNlZDsKKyAgICJib29sIiBtZWFucyBhIGJvb2xlYW4gdmFsdWUgc3RvcmVkIGluIGFuIGBpbnQnLiAgKi8KKyNkZWZpbmUgSVBWNl9BRERSRk9STQkJMQorI2RlZmluZSBJUFY2XzIyOTJQS1RJTkZPCTIKKyNkZWZpbmUgSVBWNl8yMjkySE9QT1BUUwkzCisjZGVmaW5lIElQVjZfMjI5MkRTVE9QVFMJNAorI2RlZmluZSBJUFY2XzIyOTJSVEhEUgkJNQorI2RlZmluZSBJUFY2XzIyOTJQS1RPUFRJT05TCTYKKyNkZWZpbmUgSVBWNl9DSEVDS1NVTQkJNworI2RlZmluZSBJUFY2XzIyOTJIT1BMSU1JVAk4CisKKyNkZWZpbmUgU0NNX1NSQ1JUCQlJUFY2X1JYU1JDUlQKKworI2RlZmluZSBJUFY2X05FWFRIT1AJCTkKKyNkZWZpbmUgSVBWNl9BVVRISERSCQkxMAorI2RlZmluZSBJUFY2X1VOSUNBU1RfSE9QUwkxNgorI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9JRgkxNworI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9IT1BTCTE4CisjZGVmaW5lIElQVjZfTVVMVElDQVNUX0xPT1AJMTkKKyNkZWZpbmUgSVBWNl9KT0lOX0dST1VQCQkyMAorI2RlZmluZSBJUFY2X0xFQVZFX0dST1VQCTIxCisjZGVmaW5lIElQVjZfUk9VVEVSX0FMRVJUCTIyCisjZGVmaW5lIElQVjZfTVRVX0RJU0NPVkVSCTIzCisjZGVmaW5lIElQVjZfTVRVCQkyNAorI2RlZmluZSBJUFY2X1JFQ1ZFUlIJCTI1CisjZGVmaW5lIElQVjZfVjZPTkxZCQkyNgorI2RlZmluZSBJUFY2X0pPSU5fQU5ZQ0FTVAkyNworI2RlZmluZSBJUFY2X0xFQVZFX0FOWUNBU1QJMjgKKyNkZWZpbmUgSVBWNl9JUFNFQ19QT0xJQ1kJMzQKKyNkZWZpbmUgSVBWNl9YRlJNX1BPTElDWQkzNQorCisjZGVmaW5lIElQVjZfUkVDVlBLVElORk8JNDkKKyNkZWZpbmUgSVBWNl9QS1RJTkZPCQk1MAorI2RlZmluZSBJUFY2X1JFQ1ZIT1BMSU1JVAk1MQorI2RlZmluZSBJUFY2X0hPUExJTUlUCQk1MgorI2RlZmluZSBJUFY2X1JFQ1ZIT1BPUFRTCTUzCisjZGVmaW5lIElQVjZfSE9QT1BUUwkJNTQKKyNkZWZpbmUgSVBWNl9SVEhEUkRTVE9QVFMJNTUKKyNkZWZpbmUgSVBWNl9SRUNWUlRIRFIJCTU2CisjZGVmaW5lIElQVjZfUlRIRFIJCTU3CisjZGVmaW5lIElQVjZfUkVDVkRTVE9QVFMJNTgKKyNkZWZpbmUgSVBWNl9EU1RPUFRTCQk1OQorCisjZGVmaW5lIElQVjZfUkVDVlRDTEFTUwkJNjYKKyNkZWZpbmUgSVBWNl9UQ0xBU1MJCTY3CisKKy8qIE9ic29sZXRlIHN5bm9ueW1zIGZvciB0aGUgYWJvdmUuICAqLworI2RlZmluZSBJUFY2X0FERF9NRU1CRVJTSElQCUlQVjZfSk9JTl9HUk9VUAorI2RlZmluZSBJUFY2X0RST1BfTUVNQkVSU0hJUAlJUFY2X0xFQVZFX0dST1VQCisjZGVmaW5lIElQVjZfUlhIT1BPUFRTCQlJUFY2X0hPUE9QVFMKKyNkZWZpbmUgSVBWNl9SWERTVE9QVFMJCUlQVjZfRFNUT1BUUworCisvKiBJUFY2X01UVV9ESVNDT1ZFUiB2YWx1ZXMuICAqLworI2RlZmluZSBJUFY2X1BNVFVESVNDX0RPTlQJMAkvKiBOZXZlciBzZW5kIERGIGZyYW1lcy4gICovCisjZGVmaW5lIElQVjZfUE1UVURJU0NfV0FOVAkxCS8qIFVzZSBwZXIgcm91dGUgaGludHMuICAqLworI2RlZmluZSBJUFY2X1BNVFVESVNDX0RPCTIJLyogQWx3YXlzIERGLiAgKi8KKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19QUk9CRQkzCS8qIElnbm9yZSBkc3QgcG10dS4gICovCisKKy8qIFNvY2tldCBsZXZlbCB2YWx1ZXMgZm9yIElQdjYuICAqLworI2RlZmluZSBTT0xfSVBWNiAgICAgICAgNDEKKyNkZWZpbmUgU09MX0lDTVBWNiAgICAgIDU4CisKKy8qIFJvdXRpbmcgaGVhZGVyIG9wdGlvbnMgZm9yIElQdjYuICAqLworI2RlZmluZSBJUFY2X1JUSERSX0xPT1NFCTAJLyogSG9wIGRvZXNuJ3QgbmVlZCB0byBiZSBuZWlnaGJvdXIuICovCisjZGVmaW5lIElQVjZfUlRIRFJfU1RSSUNUCTEJLyogSG9wIG11c3QgYmUgYSBuZWlnaGJvdXIuICAqLworCisjZGVmaW5lIElQVjZfUlRIRFJfVFlQRV8wCTAJLyogSVB2NiBSb3V0aW5nIGhlYWRlciB0eXBlIDAuICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2luZi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2luZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTlmNzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaW5mLmgKQEAgLTAsMCArMSwzMCBAQAorLyogYElORklOSVRZJyBjb25zdGFudCBmb3IgSUVFRSA3NTQgbWFjaGluZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2luZi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBJRUVFIHBvc2l0aXZlIGluZmluaXR5LiAgKi8KKworI2lmIF9fR05VQ19QUkVSRVEoMywzKQorIyBkZWZpbmUgSU5GSU5JVFkJKF9fYnVpbHRpbl9pbmZmKCkpCisjZWxzZQorIyBkZWZpbmUgSU5GSU5JVFkJSFVHRV9WQUxGCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pbml0c3Bpbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2luaXRzcGluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2ZjE3OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pbml0c3Bpbi5oCkBAIC0wLDAgKzEgQEAKKy8qIE5vIHRocmVhZCBzdXBwb3J0LiAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2lvY3RsLXR5cGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaW9jdGwtdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODU2YTA0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2lvY3RsLXR5cGVzLmgKQEAgLTAsMCArMSw3OCBAQAorLyogU3RydWN0dXJlIHR5cGVzIGZvciBwcmUtdGVybWlvcyB0ZXJtaW5hbCBpb2N0bHMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfSU9DVExfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2lvY3RsLXR5cGVzLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvaW9jdGwuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogR2V0IGRlZmluaXRpb24gb2YgY29uc3RhbnRzIGZvciB1c2Ugd2l0aCBgaW9jdGwnLiAgKi8KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisKKworc3RydWN0IHdpbnNpemUKKyAgeworICAgIHVuc2lnbmVkIHNob3J0IGludCB3c19yb3c7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHdzX2NvbDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgd3NfeHBpeGVsOworICAgIHVuc2lnbmVkIHNob3J0IGludCB3c195cGl4ZWw7CisgIH07CisKKyNkZWZpbmUgTkNDIDgKK3N0cnVjdCB0ZXJtaW8KKyAgeworICAgIHVuc2lnbmVkIHNob3J0IGludCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworICAgIHVuc2lnbmVkIGNoYXIgY19saW5lOwkJLyogbGluZSBkaXNjaXBsaW5lICovCisgICAgdW5zaWduZWQgY2hhciBjX2NjW05DQ107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KK307CisKKy8qIG1vZGVtIGxpbmVzICovCisjZGVmaW5lIFRJT0NNX0xFCTB4MDAxCisjZGVmaW5lIFRJT0NNX0RUUgkweDAwMgorI2RlZmluZSBUSU9DTV9SVFMJMHgwMDQKKyNkZWZpbmUgVElPQ01fU1QJMHgwMDgKKyNkZWZpbmUgVElPQ01fU1IJMHgwMTAKKyNkZWZpbmUgVElPQ01fQ1RTCTB4MDIwCisjZGVmaW5lIFRJT0NNX0NBUgkweDA0MAorI2RlZmluZSBUSU9DTV9STkcJMHgwODAKKyNkZWZpbmUgVElPQ01fRFNSCTB4MTAwCisjZGVmaW5lIFRJT0NNX0NECVRJT0NNX0NBUgorI2RlZmluZSBUSU9DTV9SSQlUSU9DTV9STkcKKworLyogaW9jdGwgKGZkLCBUSU9DU0VSR0VUTFNSLCAmcmVzdWx0KSB3aGVyZSByZXN1bHQgbWF5IGJlIGFzIGJlbG93ICovCisKKy8qIGxpbmUgZGlzY2lwbGluZXMgKi8KKyNkZWZpbmUgTl9UVFkJCTAKKyNkZWZpbmUgTl9TTElQCQkxCisjZGVmaW5lIE5fTU9VU0UJCTIKKyNkZWZpbmUgTl9QUFAJCTMKKyNkZWZpbmUgTl9TVFJJUAkJNAorI2RlZmluZSBOX0FYMjUJCTUKKyNkZWZpbmUgTl9YMjUJCTYJLyogWC4yNSBhc3luYyAgKi8KKyNkZWZpbmUgTl82UEFDSwkJNworI2RlZmluZSBOX01BU0MJCTgJLyogTW9iaXRleCBtb2R1bGUgICovCisjZGVmaW5lIE5fUjM5NjQJCTkJLyogU2ltYXRpYyBSMzk2NCBtb2R1bGUgICovCisjZGVmaW5lIE5fUFJPRklCVVNfRkRMCTEwCS8qIFByb2ZpYnVzICAqLworI2RlZmluZSBOX0lSREEJCTExCS8qIExpbnV4IElSICAqLworI2RlZmluZSBOX1NNU0JMT0NLCTEyCS8qIFNNUyBibG9jayBtb2RlICAqLworI2RlZmluZSBOX0hETEMJCTEzCS8qIHN5bmNocm9ub3VzIEhETEMgICovCisjZGVmaW5lIE5fU1lOQ19QUFAJMTQJLyogc3luY2hyb25vdXMgUFBQICAqLworI2RlZmluZQlOX0hDSQkJMTUJLyogQmx1ZXRvb3RoIEhDSSBVQVJUICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2lvY3Rscy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2lvY3Rscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmI0YzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaW9jdGxzLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0lPQ1RMX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9pb2N0bHMuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9pb2N0bC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBVc2UgdGhlIGRlZmluaXRpb25zIGZyb20gdGhlIGtlcm5lbCBoZWFkZXIgZmlsZXMuICAqLworI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworLyogUm91dGluZyB0YWJsZSBjYWxscy4gICovCisjZGVmaW5lIFNJT0NBRERSVAkweDg5MEIJCS8qIGFkZCByb3V0aW5nIHRhYmxlIGVudHJ5CSovCisjZGVmaW5lIFNJT0NERUxSVAkweDg5MEMJCS8qIGRlbGV0ZSByb3V0aW5nIHRhYmxlIGVudHJ5CSovCisjZGVmaW5lIFNJT0NSVE1TRwkweDg5MEQJCS8qIGNhbGwgdG8gcm91dGluZyBzeXN0ZW0JKi8KKworLyogU29ja2V0IGNvbmZpZ3VyYXRpb24gY29udHJvbHMuICovCisjZGVmaW5lIFNJT0NHSUZOQU1FCTB4ODkxMAkJLyogZ2V0IGlmYWNlIG5hbWUJCSovCisjZGVmaW5lIFNJT0NTSUZMSU5LCTB4ODkxMQkJLyogc2V0IGlmYWNlIGNoYW5uZWwJCSovCisjZGVmaW5lIFNJT0NHSUZDT05GCTB4ODkxMgkJLyogZ2V0IGlmYWNlIGxpc3QJCSovCisjZGVmaW5lIFNJT0NHSUZGTEFHUwkweDg5MTMJCS8qIGdldCBmbGFncwkJCSovCisjZGVmaW5lIFNJT0NTSUZGTEFHUwkweDg5MTQJCS8qIHNldCBmbGFncwkJCSovCisjZGVmaW5lIFNJT0NHSUZBRERSCTB4ODkxNQkJLyogZ2V0IFBBIGFkZHJlc3MJCSovCisjZGVmaW5lIFNJT0NTSUZBRERSCTB4ODkxNgkJLyogc2V0IFBBIGFkZHJlc3MJCSovCisjZGVmaW5lIFNJT0NHSUZEU1RBRERSCTB4ODkxNwkJLyogZ2V0IHJlbW90ZSBQQSBhZGRyZXNzCSovCisjZGVmaW5lIFNJT0NTSUZEU1RBRERSCTB4ODkxOAkJLyogc2V0IHJlbW90ZSBQQSBhZGRyZXNzCSovCisjZGVmaW5lIFNJT0NHSUZCUkRBRERSCTB4ODkxOQkJLyogZ2V0IGJyb2FkY2FzdCBQQSBhZGRyZXNzCSovCisjZGVmaW5lIFNJT0NTSUZCUkRBRERSCTB4ODkxYQkJLyogc2V0IGJyb2FkY2FzdCBQQSBhZGRyZXNzCSovCisjZGVmaW5lIFNJT0NHSUZORVRNQVNLCTB4ODkxYgkJLyogZ2V0IG5ldHdvcmsgUEEgbWFzawkJKi8KKyNkZWZpbmUgU0lPQ1NJRk5FVE1BU0sJMHg4OTFjCQkvKiBzZXQgbmV0d29yayBQQSBtYXNrCQkqLworI2RlZmluZSBTSU9DR0lGTUVUUklDCTB4ODkxZAkJLyogZ2V0IG1ldHJpYwkJCSovCisjZGVmaW5lIFNJT0NTSUZNRVRSSUMJMHg4OTFlCQkvKiBzZXQgbWV0cmljCQkJKi8KKyNkZWZpbmUgU0lPQ0dJRk1FTQkweDg5MWYJCS8qIGdldCBtZW1vcnkgYWRkcmVzcyAoQlNEKQkqLworI2RlZmluZSBTSU9DU0lGTUVNCTB4ODkyMAkJLyogc2V0IG1lbW9yeSBhZGRyZXNzIChCU0QpCSovCisjZGVmaW5lIFNJT0NHSUZNVFUJMHg4OTIxCQkvKiBnZXQgTVRVIHNpemUJCQkqLworI2RlZmluZSBTSU9DU0lGTVRVCTB4ODkyMgkJLyogc2V0IE1UVSBzaXplCQkJKi8KKyNkZWZpbmUgU0lPQ1NJRk5BTUUJMHg4OTIzCQkvKiBzZXQgaW50ZXJmYWNlIG5hbWUJCSovCisjZGVmaW5lCVNJT0NTSUZIV0FERFIJMHg4OTI0CQkvKiBzZXQgaGFyZHdhcmUgYWRkcmVzcyAJKi8KKyNkZWZpbmUgU0lPQ0dJRkVOQ0FQCTB4ODkyNQkJLyogZ2V0L3NldCBlbmNhcHN1bGF0aW9ucyAgICAgICAqLworI2RlZmluZSBTSU9DU0lGRU5DQVAJMHg4OTI2CisjZGVmaW5lIFNJT0NHSUZIV0FERFIJMHg4OTI3CQkvKiBHZXQgaGFyZHdhcmUgYWRkcmVzcwkJKi8KKyNkZWZpbmUgU0lPQ0dJRlNMQVZFCTB4ODkyOQkJLyogRHJpdmVyIHNsYXZpbmcgc3VwcG9ydAkqLworI2RlZmluZSBTSU9DU0lGU0xBVkUJMHg4OTMwCisjZGVmaW5lIFNJT0NBRERNVUxUSQkweDg5MzEJCS8qIE11bHRpY2FzdCBhZGRyZXNzIGxpc3RzCSovCisjZGVmaW5lIFNJT0NERUxNVUxUSQkweDg5MzIKKyNkZWZpbmUgU0lPQ0dJRklOREVYCTB4ODkzMwkJLyogbmFtZSAtPiBpZl9pbmRleCBtYXBwaW5nCSovCisjZGVmaW5lIFNJT0dJRklOREVYCVNJT0NHSUZJTkRFWAkvKiBtaXNwcmludCBjb21wYXRpYmlsaXR5IDotKQkqLworI2RlZmluZSBTSU9DU0lGUEZMQUdTCTB4ODkzNAkJLyogc2V0L2dldCBleHRlbmRlZCBmbGFncyBzZXQJKi8KKyNkZWZpbmUgU0lPQ0dJRlBGTEFHUwkweDg5MzUKKyNkZWZpbmUgU0lPQ0RJRkFERFIJMHg4OTM2CQkvKiBkZWxldGUgUEEgYWRkcmVzcwkJKi8KKyNkZWZpbmUJU0lPQ1NJRkhXQlJPQURDQVNUCTB4ODkzNwkvKiBzZXQgaGFyZHdhcmUgYnJvYWRjYXN0IGFkZHIJKi8KKyNkZWZpbmUgU0lPQ0dJRkNPVU5UCTB4ODkzOAkJLyogZ2V0IG51bWJlciBvZiBkZXZpY2VzICovCisKKyNkZWZpbmUgU0lPQ0dJRkJSCTB4ODk0MAkJLyogQnJpZGdpbmcgc3VwcG9ydAkJKi8KKyNkZWZpbmUgU0lPQ1NJRkJSCTB4ODk0MQkJLyogU2V0IGJyaWRnaW5nIG9wdGlvbnMgCSovCisKKyNkZWZpbmUgU0lPQ0dJRlRYUUxFTgkweDg5NDIJCS8qIEdldCB0aGUgdHggcXVldWUgbGVuZ3RoCSovCisjZGVmaW5lIFNJT0NTSUZUWFFMRU4JMHg4OTQzCQkvKiBTZXQgdGhlIHR4IHF1ZXVlIGxlbmd0aCAJKi8KKworCisvKiBBUlAgY2FjaGUgY29udHJvbCBjYWxscy4gKi8KKwkJICAgIC8qICAweDg5NTAgLSAweDg5NTIgICogb2Jzb2xldGUgY2FsbHMsIGRvbid0IHJlLXVzZSAqLworI2RlZmluZSBTSU9DREFSUAkweDg5NTMJCS8qIGRlbGV0ZSBBUlAgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ0dBUlAJMHg4OTU0CQkvKiBnZXQgQVJQIHRhYmxlIGVudHJ5CQkqLworI2RlZmluZSBTSU9DU0FSUAkweDg5NTUJCS8qIHNldCBBUlAgdGFibGUgZW50cnkJCSovCisKKy8qIFJBUlAgY2FjaGUgY29udHJvbCBjYWxscy4gKi8KKyNkZWZpbmUgU0lPQ0RSQVJQCTB4ODk2MAkJLyogZGVsZXRlIFJBUlAgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ0dSQVJQCTB4ODk2MQkJLyogZ2V0IFJBUlAgdGFibGUgZW50cnkJCSovCisjZGVmaW5lIFNJT0NTUkFSUAkweDg5NjIJCS8qIHNldCBSQVJQIHRhYmxlIGVudHJ5CQkqLworCisvKiBEcml2ZXIgY29uZmlndXJhdGlvbiBjYWxscyAqLworCisjZGVmaW5lIFNJT0NHSUZNQVAJMHg4OTcwCQkvKiBHZXQgZGV2aWNlIHBhcmFtZXRlcnMJKi8KKyNkZWZpbmUgU0lPQ1NJRk1BUAkweDg5NzEJCS8qIFNldCBkZXZpY2UgcGFyYW1ldGVycwkqLworCisvKiBETENJIGNvbmZpZ3VyYXRpb24gY2FsbHMgKi8KKworI2RlZmluZSBTSU9DQURERExDSQkweDg5ODAJCS8qIENyZWF0ZSBuZXcgRExDSSBkZXZpY2UJKi8KKyNkZWZpbmUgU0lPQ0RFTERMQ0kJMHg4OTgxCQkvKiBEZWxldGUgRExDSSBkZXZpY2UJCSovCisKKy8qIERldmljZSBwcml2YXRlIGlvY3RsIGNhbGxzLiAgKi8KKworLyogVGhlc2UgMTYgaW9jdGxzIGFyZSBhdmFpbGFibGUgdG8gZGV2aWNlcyB2aWEgdGhlIGRvX2lvY3RsKCkgZGV2aWNlCisgICB2ZWN0b3IuICBFYWNoIGRldmljZSBzaG91bGQgaW5jbHVkZSB0aGlzIGZpbGUgYW5kIHJlZGVmaW5lIHRoZXNlCisgICBuYW1lcyBhcyB0aGVpciBvd24uIEJlY2F1c2UgdGhlc2UgYXJlIGRldmljZSBkZXBlbmRlbnQgaXQgaXMgYSBnb29kCisgICBpZGVhIF9OT1RfIHRvIGlzc3VlIHRoZW0gdG8gcmFuZG9tIG9iamVjdHMgYW5kIGhvcGUuICAqLworCisjZGVmaW5lIFNJT0NERVZQUklWQVRFIAkJMHg4OUYwCS8qIHRvIDg5RkYgKi8KKworLyoKKyAqCVRoZXNlIDE2IGlvY3RsIGNhbGxzIGFyZSBwcm90b2NvbCBwcml2YXRlCisgKi8KKworI2RlZmluZSBTSU9DUFJPVE9QUklWQVRFIDB4ODlFMCAvKiB0byA4OUVGICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaXBjLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhMDQzZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pcGMuaApAQCAtMCwwICsxLDU2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0lQQ19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaXBjLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvaXBjLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIE1vZGUgYml0cyBmb3IgYG1zZ2dldCcsIGBzZW1nZXQnLCBhbmQgYHNobWdldCcuICAqLworI2RlZmluZSBJUENfQ1JFQVQJMDEwMDAJCS8qIENyZWF0ZSBrZXkgaWYga2V5IGRvZXMgbm90IGV4aXN0LiAqLworI2RlZmluZSBJUENfRVhDTAkwMjAwMAkJLyogRmFpbCBpZiBrZXkgZXhpc3RzLiAgKi8KKyNkZWZpbmUgSVBDX05PV0FJVAkwNDAwMAkJLyogUmV0dXJuIGVycm9yIG9uIHdhaXQuICAqLworCisvKiBDb250cm9sIGNvbW1hbmRzIGZvciBgbXNnY3RsJywgYHNlbWN0bCcsIGFuZCBgc2htY3RsJy4gICovCisjZGVmaW5lIElQQ19STUlECTAJCS8qIFJlbW92ZSBpZGVudGlmaWVyLiAgKi8KKyNkZWZpbmUgSVBDX1NFVAkJMQkJLyogU2V0IGBpcGNfcGVybScgb3B0aW9ucy4gICovCisjZGVmaW5lIElQQ19TVEFUCTIJCS8qIEdldCBgaXBjX3Blcm0nIG9wdGlvbnMuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgSVBDX0lORk8JMwkJLyogU2VlIGlwY3MuICAqLworI2VuZGlmCisKKy8qIFNwZWNpYWwga2V5IHZhbHVlcy4gICovCisjZGVmaW5lIElQQ19QUklWQVRFCSgoX19rZXlfdCkgMCkJLyogUHJpdmF0ZSBrZXkuICAqLworCisKKy8qIERhdGEgc3RydWN0dXJlIHVzZWQgdG8gcGFzcyBwZXJtaXNzaW9uIGluZm9ybWF0aW9uIHRvIElQQyBvcGVyYXRpb25zLiAgKi8KK3N0cnVjdCBpcGNfcGVybQorICB7CisgICAgX19rZXlfdCBfX2tleTsJCQkvKiBLZXkuICAqLworICAgIF9fdWlkX3QgdWlkOwkJCS8qIE93bmVyJ3MgdXNlciBJRC4gICovCisgICAgX19naWRfdCBnaWQ7CQkJLyogT3duZXIncyBncm91cCBJRC4gICovCisgICAgX191aWRfdCBjdWlkOwkJCS8qIENyZWF0b3IncyB1c2VyIElELiAgKi8KKyAgICBfX2dpZF90IGNnaWQ7CQkJLyogQ3JlYXRvcidzIGdyb3VwIElELiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgbW9kZTsJCS8qIFJlYWQvd3JpdGUgcGVybWlzc2lvbi4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fcGFkMTsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19zZXE7CQkvKiBTZXF1ZW5jZSBudW1iZXIuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3BhZDI7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQxOworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMjsKKyAgfTsKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pcGN0eXBlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2lwY3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4Y2ExZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pcGN0eXBlcy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIGJpdHMvaXBjdHlwZXMuaCAtLSBEZWZpbmUgc29tZSB0eXBlcyB1c2VkIGJ5IFN5c1YgSVBDL01TRy9TSE0uICBHZW5lcmljLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogTmV2ZXIgaW5jbHVkZSA8Yml0cy9pcGN0eXBlcy5oPiBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9CSVRTX0lQQ1RZUEVTX0gKKyNkZWZpbmUgX0JJVFNfSVBDVFlQRVNfSAkxCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIFVzZWQgaW4gYHN0cnVjdCBzaG1pZF9kcycuICAqLworIyBpZiBfX1dPUkRTSVpFID09IDMyCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBfX2lwY19waWRfdDsKKyMgZWxzZQordHlwZWRlZiBpbnQgX19pcGNfcGlkX3Q7CisjIGVuZGlmCisKKworI2VuZGlmIC8qIGJpdHMvaXBjdHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2xpYmMtbG9jay5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2xpYmMtbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOGY5NTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbGliYy1sb2NrLmgKQEAgLTAsMCArMSw2NTkgQEAKKy8qIGxpYmMtaW50ZXJuYWwgaW50ZXJmYWNlIGZvciBtdXRleCBsb2Nrcy4gIE5QVEwgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDAzLCAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCisgICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX0JJVFNfTElCQ19MT0NLX0gKKyNkZWZpbmUgX0JJVFNfTElCQ19MT0NLX0ggMQorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2RlZmluZSBfX25lZWRfTlVMTAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKKy8qIEZvcnR1bmF0ZWx5IExpbnV4IG5vdyBoYXMgYSBtZWFuIHRvIGRvIGxvY2tpbmcgd2hpY2ggaXMgcmVhbHRpbWUKKyAgIHNhZmUgd2l0aG91dCB0aGUgYWlkIG9mIHRoZSB0aHJlYWQgbGlicmFyeS4gIFdlIGFsc28gbmVlZCBubyBmYW5jeQorICAgb3B0aW9ucyBsaWtlIGVycm9yIGNoZWNraW5nIG11dGV4ZXMgZXRjLiAgV2Ugb25seSBuZWVkIHNpbXBsZQorICAgbG9ja3MsIG1heWJlIHJlY3Vyc2l2ZS4gIFRoaXMgY2FuIGJlIGVhc2lseSBhbmQgY2hlYXBseSBpbXBsZW1lbnRlZAorICAgdXNpbmcgZnV0ZXhlcy4gIFdlIHdpbGwgdXNlIHRoZW0gZXZlcnl3aGVyZSBleGNlcHQgaW4gbGQuc28gc2luY2UKKyAgIGxkLnNvIG1pZ2h0IGJlIHVzZWQgb24gb2xkIGtlcm5lbHMgd2l0aCBhIGRpZmZlcmVudCBsaWJjLnNvLiAgKi8KKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsb3dsZXZlbGxvY2suaD4KKyMgaW5jbHVkZSA8dGxzLmg+CisjIGluY2x1ZGUgPHB0aHJlYWQtZnVuY3Rpb25zLmg+CisjIGluY2x1ZGUgPGVycm5vLmg+IC8qIEZvciBFQlVTWS4gICovCisjIGluY2x1ZGUgPGdudS9vcHRpb24tZ3JvdXBzLmg+IC8qIEZvciBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUy4gICovCisjZW5kaWYKKworLyogTXV0ZXggdHlwZS4gICovCisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9JT19NVFNBRkVfSU8KKyMgaWYgKGRlZmluZWQgTk9UX0lOX2xpYmMgJiYgIWRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkgfHwgIWRlZmluZWQgX0xJQkMKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IF9fbGliY19sb2NrX3Q7Cit0eXBlZGVmIHN0cnVjdCB7IHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsgfSBfX2xpYmNfbG9ja19yZWN1cnNpdmVfdDsKKyMgZWxzZQordHlwZWRlZiBpbnQgX19saWJjX2xvY2tfdDsKK3R5cGVkZWYgc3RydWN0IHsgaW50IGxvY2s7IGludCBjbnQ7IHZvaWQgKm93bmVyOyB9IF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90OworIyBlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeyBwdGhyZWFkX211dGV4X3QgbXV0ZXg7IH0gX19ydGxkX2xvY2tfcmVjdXJzaXZlX3Q7CisjIGlmZGVmIF9fVVNFX1VOSVg5OAordHlwZWRlZiBwdGhyZWFkX3J3bG9ja190IF9fbGliY19yd2xvY2tfdDsKKyMgZWxzZQordHlwZWRlZiBzdHJ1Y3QgX19saWJjX3J3bG9ja19vcGFxdWVfXyBfX2xpYmNfcndsb2NrX3Q7CisjIGVuZGlmCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgX19saWJjX2xvY2tfb3BhcXVlX18gX19saWJjX2xvY2tfdDsKK3R5cGVkZWYgc3RydWN0IF9fbGliY19sb2NrX3JlY3Vyc2l2ZV9vcGFxdWVfXyBfX2xpYmNfbG9ja19yZWN1cnNpdmVfdDsKK3R5cGVkZWYgc3RydWN0IF9fbGliY19yd2xvY2tfb3BhcXVlX18gX19saWJjX3J3bG9ja190OworI2VuZGlmCisKKy8qIFR5cGUgZm9yIGtleSB0byB0aHJlYWQtc3BlY2lmaWMgZGF0YS4gICovCit0eXBlZGVmIHB0aHJlYWRfa2V5X3QgX19saWJjX2tleV90OworCisvKiBEZWZpbmUgYSBsb2NrIHZhcmlhYmxlIE5BTUUgd2l0aCBzdG9yYWdlIGNsYXNzIENMQVNTLiAgVGhlIGxvY2sgbXVzdCBiZQorICAgaW5pdGlhbGl6ZWQgd2l0aCBfX2xpYmNfbG9ja19pbml0IGJlZm9yZSBpdCBjYW4gYmUgdXNlZCAob3IgZGVmaW5lIGl0CisgICB3aXRoIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZCwgYmVsb3cpLiAgVXNlIGBleHRlcm4nIGZvciBDTEFTUyB0bworICAgZGVjbGFyZSBhIGxvY2sgZGVmaW5lZCBpbiBhbm90aGVyIG1vZHVsZS4gIEluIHB1YmxpYyBzdHJ1Y3R1cmUKKyAgIGRlZmluaXRpb25zIHlvdSBtdXN0IHVzZSBhIHBvaW50ZXIgdG8gdGhlIGxvY2sgc3RydWN0dXJlIChpLmUuLCBOQU1FCisgICBiZWdpbnMgd2l0aCBhIGAqJyksIGJlY2F1c2UgaXRzIHN0b3JhZ2Ugc2l6ZSB3aWxsIG5vdCBiZSBrbm93biBvdXRzaWRlCisgICBvZiBsaWJjLiAgKi8KKyNkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfdCBOQU1FOworI2RlZmluZSBfX2xpYmNfcndsb2NrX2RlZmluZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19yd2xvY2tfdCBOQU1FOworI2RlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfcmVjdXJzaXZlKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfcmVjdXJzaXZlX3QgTkFNRTsKKyNkZWZpbmUgX19ydGxkX2xvY2tfZGVmaW5lX3JlY3Vyc2l2ZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fcnRsZF9sb2NrX3JlY3Vyc2l2ZV90IE5BTUU7CisKKy8qIERlZmluZSBhbiBpbml0aWFsaXplZCBsb2NrIHZhcmlhYmxlIE5BTUUgd2l0aCBzdG9yYWdlIGNsYXNzIENMQVNTLgorCisgICBGb3IgdGhlIEMgbGlicmFyeSB3ZSB0YWtlIGEgZGVlcGVyIGxvb2sgYXQgdGhlIGluaXRpYWxpemVyLiAgRm9yCisgICB0aGlzIGltcGxlbWVudGF0aW9uIGFsbCBmaWVsZHMgYXJlIGluaXRpYWxpemVkIHRvIHplcm8uICBUaGVyZWZvcmUKKyAgIHdlIGRvbid0IGluaXRpYWxpemUgdGhlIHZhcmlhYmxlIHdoaWNoIGFsbG93cyBwdXR0aW5nIGl0IGludG8gdGhlCisgICBCU1Mgc2VjdGlvbi4gIChFeGNlcHQgb24gUEEtUklTQyBhbmQgb3RoZXIgb2RkIGFyY2hpdGVjdHVyZXMsIHdoZXJlCisgICBpbml0aWFsaXplZCBsb2NrcyBtdXN0IGJlIHNldCB0byBvbmUgZHVlIHRvIHRoZSBsYWNrIG9mIG5vcm1hbAorICAgYXRvbWljIG9wZXJhdGlvbnMuKSAqLworCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBpZiBMTExfTE9DS19JTklUSUFMSVpFUiA9PSAwCisjICBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfdCBOQU1FOworIyBlbHNlCisjICBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfdCBOQU1FID0gTExMX0xPQ0tfSU5JVElBTElaRVI7CisjIGVuZGlmCisjZWxzZQorIyBpZiBfX0xUX1NQSU5MT0NLX0lOSVQgPT0gMAorIyAgZGVmaW5lIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZChDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3QgTkFNRTsKKyMgZWxzZQorIyAgZGVmaW5lIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZChDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3QgTkFNRSA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBfX2xpYmNfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZChDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19yd2xvY2tfdCBOQU1FID0gUFRIUkVBRF9SV0xPQ0tfSU5JVElBTElaRVI7CisKKy8qIERlZmluZSBhbiBpbml0aWFsaXplZCByZWN1cnNpdmUgbG9jayB2YXJpYWJsZSBOQU1FIHdpdGggc3RvcmFnZQorICAgY2xhc3MgQ0xBU1MuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgaWYgTExMX0xPQ0tfSU5JVElBTElaRVIgPT0gMAorIyAgZGVmaW5lIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZF9yZWN1cnNpdmUoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja19yZWN1cnNpdmVfdCBOQU1FOworIyBlbHNlCisjICBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkX3JlY3Vyc2l2ZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90IE5BTUUgPSBfTElCQ19MT0NLX1JFQ1VSU0lWRV9JTklUSUFMSVpFUjsKKyMgZW5kaWYKKyMgZGVmaW5lIF9MSUJDX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSIFwKKyAgeyBMTExfTE9DS19JTklUSUFMSVpFUiwgMCwgTlVMTCB9CisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkX3JlY3Vyc2l2ZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90IE5BTUUgPSBfTElCQ19MT0NLX1JFQ1VSU0lWRV9JTklUSUFMSVpFUjsKKyMgZGVmaW5lIF9MSUJDX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSIFwKKyAge1BUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QfQorI2VuZGlmCisKKyNkZWZpbmUgX19ydGxkX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkX3JlY3Vyc2l2ZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fcnRsZF9sb2NrX3JlY3Vyc2l2ZV90IE5BTUUgPSBfUlRMRF9MT0NLX1JFQ1VSU0lWRV9JTklUSUFMSVpFUjsKKyNkZWZpbmUgX1JUTERfTE9DS19SRUNVUlNJVkVfSU5JVElBTElaRVIgXAorICB7UFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlB9CisKKyNkZWZpbmUgX19ydGxkX2xvY2tfaW5pdGlhbGl6ZShOQU1FKSBcCisgICh2b2lkKSAoKE5BTUUpID0gKF9fcnRsZF9sb2NrX3JlY3Vyc2l2ZV90KSBfUlRMRF9MT0NLX1JFQ1VSU0lWRV9JTklUSUFMSVpFUikKKworLyogSWYgd2UgY2hlY2sgZm9yIGEgd2Vha2x5IHJlZmVyZW5jZWQgc3ltYm9sIGFuZCB0aGVuIHBlcmZvcm0gYQorICAgbm9ybWFsIGp1bXAgdG8gaXQgdGUgY29kZSBnZW5lcmF0ZWQgZm9yIHNvbWUgcGxhdGZvcm1zIGluIGNhc2Ugb2YKKyAgIFBJQyBpcyB1bm5lY2Vzc2FyaWx5IHNsb3cuICBXaGF0IHdvdWxkIGhhcHBlbiBpcyB0aGF0IHRoZSBmdW5jdGlvbgorICAgaXMgZmlyc3QgcmVmZXJlbmNlZCBhcyBkYXRhIGFuZCB0aGVuIGl0IGlzIGNhbGxlZCBpbmRpcmVjdGx5CisgICB0aHJvdWdoIHRoZSBQTFQuICBXZSBjYW4gbWFrZSB0aGlzIGEgZGlyZWN0IGp1bXAuICAqLworI2lmZGVmIF9fUElDX18KKyMgZGVmaW5lIF9fbGliY19tYXliZV9jYWxsKEZVTkMsIEFSR1MsIEVMU0UpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgX190eXBlb2YgKEZVTkMpICpfZm4gPSAoRlVOQyk7IFwKKyAgICAgICAgICAgICAgICAgICAgX2ZuICE9IE5VTEwgPyAoKl9mbikgQVJHUyA6IEVMU0U7IH0pKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19tYXliZV9jYWxsKEZVTkMsIEFSR1MsIEVMU0UpIFwKKyAgKEZVTkMgIT0gTlVMTCA/IEZVTkMgQVJHUyA6IEVMU0UpCisjZW5kaWYKKworLyogQ2FsbCB0aHJlYWQgZnVuY3Rpb25zIHRocm91Z2ggdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdGFibGUuICAqLworI2lmIGRlZmluZWQgU0hBUkVEICYmICFkZWZpbmVkIE5PVF9JTl9saWJjCisjIGRlZmluZSBQVEZBVkFJTChOQU1FKSBfX2xpYmNfcHRocmVhZF9mdW5jdGlvbnNfaW5pdAorIyBkZWZpbmUgX19saWJjX3B0Zl9jYWxsKEZVTkMsIEFSR1MsIEVMU0UpIFwKKyAgKF9fbGliY19wdGhyZWFkX2Z1bmN0aW9uc19pbml0ID8gUFRIRkNUX0NBTEwgKHB0cl8jI0ZVTkMsIEFSR1MpIDogRUxTRSkKKyMgZGVmaW5lIF9fbGliY19wdGZfY2FsbF9hbHdheXMoRlVOQywgQVJHUykgXAorICBQVEhGQ1RfQ0FMTCAocHRyXyMjRlVOQywgQVJHUykKKyNlbHNlCisjIGRlZmluZSBQVEZBVkFJTChOQU1FKSAoTkFNRSAhPSBOVUxMKQorIyBkZWZpbmUgX19saWJjX3B0Zl9jYWxsKEZVTkMsIEFSR1MsIEVMU0UpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKEZVTkMsIEFSR1MsIEVMU0UpCisjIGRlZmluZSBfX2xpYmNfcHRmX2NhbGxfYWx3YXlzKEZVTkMsIEFSR1MpIFwKKyAgRlVOQyBBUkdTCisjZW5kaWYKKworCisvKiBJbml0aWFsaXplIHRoZSBuYW1lZCBsb2NrIHZhcmlhYmxlLCBsZWF2aW5nIGl0IGluIGEgY29uc2lzdGVudCwgdW5sb2NrZWQKKyAgIHN0YXRlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGRlZmluZSBfX2xpYmNfbG9ja19pbml0KE5BTUUpICgoTkFNRSkgPSBMTExfTE9DS19JTklUSUFMSVpFUiwgMCkKKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja19pbml0KE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF9pbml0LCAoJihOQU1FKSwgTlVMTCksIDApCisjZW5kaWYKKyNpZiBkZWZpbmVkIFNIQVJFRCAmJiAhZGVmaW5lZCBOT1RfSU5fbGliYworLyogKChOQU1FKSA9IChfX2xpYmNfcndsb2NrX3QpIFBUSFJFQURfUldMT0NLX0lOSVRJQUxJWkVSLCAwKSBpcworICAgaW5lZmZpY2llbnQuICAqLworIyBkZWZpbmUgX19saWJjX3J3bG9ja19pbml0KE5BTUUpIFwKKyAgKF9fYnVpbHRpbl9tZW1zZXQgKCYoTkFNRSksICdcMCcsIHNpemVvZiAoTkFNRSkpLCAwKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfaW5pdChOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfcndsb2NrX2luaXQsICgmKE5BTUUpLCBOVUxMKSwgMCkKKyNlbmRpZgorCisvKiBTYW1lIGFzIGxhc3QgYnV0IHRoaXMgdGltZSB3ZSBpbml0aWFsaXplIGEgcmVjdXJzaXZlIG11dGV4LiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGRlZmluZSBfX2xpYmNfbG9ja19pbml0X3JlY3Vyc2l2ZShOQU1FKSBcCisgICgoTkFNRSkgPSAoX19saWJjX2xvY2tfcmVjdXJzaXZlX3QpIF9MSUJDX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSLCAwKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX2luaXRfcmVjdXJzaXZlKE5BTUUpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBpZiAoX19wdGhyZWFkX211dGV4X2luaXQgIT0gTlVMTCkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJcHRocmVhZF9tdXRleGF0dHJfdCBfX2F0dHI7CQkJCQkgICAgICBcCisJX19wdGhyZWFkX211dGV4YXR0cl9pbml0ICgmX19hdHRyKTsJCQkJICAgICAgXAorCV9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSAoJl9fYXR0ciwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlApOyAgICBcCisJX19wdGhyZWFkX211dGV4X2luaXQgKCYoTkFNRSkubXV0ZXgsICZfX2F0dHIpOwkJCSAgICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kgKCZfX2F0dHIpOwkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgX19ydGxkX2xvY2tfaW5pdF9yZWN1cnNpdmUoTkFNRSkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGlmIChfX3B0aHJlYWRfbXV0ZXhfaW5pdCAhPSBOVUxMKQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwlwdGhyZWFkX211dGV4YXR0cl90IF9fYXR0cjsJCQkJCSAgICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQgKCZfX2F0dHIpOwkJCQkgICAgICBcCisJX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlICgmX19hdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCk7ICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhfaW5pdCAoJihOQU1FKS5tdXRleCwgJl9fYXR0cik7CQkJICAgICAgXAorCV9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSAoJl9fYXR0cik7CQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8qIEZpbmFsaXplIHRoZSBuYW1lZCBsb2NrIHZhcmlhYmxlLCB3aGljaCBtdXN0IGJlIGxvY2tlZC4gIEl0IGNhbm5vdCBiZQorICAgdXNlZCBhZ2FpbiB1bnRpbCBfX2xpYmNfbG9ja19pbml0IGlzIGNhbGxlZCBhZ2FpbiBvbiBpdC4gIFRoaXMgbXVzdCBiZQorICAgY2FsbGVkIG9uIGEgbG9jayB2YXJpYWJsZSBiZWZvcmUgdGhlIGNvbnRhaW5pbmcgc3RvcmFnZSBpcyByZXVzZWQuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgZGVmaW5lIF9fbGliY19sb2NrX2ZpbmkoTkFNRSkgKCh2b2lkKSAwKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX2ZpbmkoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X2Rlc3Ryb3ksICgmKE5BTUUpKSwgMCkKKyNlbmRpZgorI2lmIGRlZmluZWQgU0hBUkVEICYmICFkZWZpbmVkIE5PVF9JTl9saWJjCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX2ZpbmkoTkFNRSkgKCh2b2lkKSAwKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfZmluaShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3ksICgmKE5BTUUpKSwgMCkKKyNlbmRpZgorCisvKiBGaW5hbGl6ZSByZWN1cnNpdmUgbmFtZWQgbG9jay4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBkZWZpbmUgX19saWJjX2xvY2tfZmluaV9yZWN1cnNpdmUoTkFNRSkgKCh2b2lkKSAwKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX2ZpbmlfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF9kZXN0cm95LCAoJihOQU1FKSksIDApCisjZW5kaWYKKworLyogTG9jayB0aGUgbmFtZWQgbG9jayB2YXJpYWJsZS4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAhPSAxCisvKiBFR0xJQkM6IERlY2xhcmUgd3JhcHBlciBmdW5jdGlvbiBmb3IgYSBiaWcgbWFjcm8gaWYgZWl0aGVyCisgICAhX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1Mgb3Igd2UgYXJlIHVzaW5nIGEgYmFjayBkb29yIGZyb20KKyAgIHNtYWxsLW1hY3Jvcy1mbnMuYyAoX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgPT0gMikuICAqLworZXh0ZXJuIHZvaWQgX19saWJjX2xvY2tfbG9ja19mbiAoX19saWJjX2xvY2tfdCAqKTsKK2xpYmNfaGlkZGVuX3Byb3RvIChfX2xpYmNfbG9ja19sb2NrX2ZuKTsKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMSAqLworIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUworIyBkZWZpbmUgX19saWJjX2xvY2tfbG9jayhOQU1FKSBcCisgICh7IGxsbF9sb2NrIChOQU1FLCBMTExfUFJJVkFURSk7IDA7IH0pCisjIGVsc2UKKyMgIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrKE5BTUUpCQlcCisgIF9fbGliY19sb2NrX2xvY2tfZm4gKCYoTkFNRSkpCisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICovCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfbG9jayhOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfbG9jaywgKCYoTkFNRSkpLCAwKQorI2VuZGlmCisjZGVmaW5lIF9fbGliY19yd2xvY2tfcmRsb2NrKE5BTUUpIFwKKyAgX19saWJjX3B0Zl9jYWxsIChfX3B0aHJlYWRfcndsb2NrX3JkbG9jaywgKCYoTkFNRSkpLCAwKQorI2RlZmluZSBfX2xpYmNfcndsb2NrX3dybG9jayhOQU1FKSBcCisgIF9fbGliY19wdGZfY2FsbCAoX19wdGhyZWFkX3J3bG9ja193cmxvY2ssICgmKE5BTUUpKSwgMCkKKworLyogTG9jayB0aGUgcmVjdXJzaXZlIG5hbWVkIGxvY2sgdmFyaWFibGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMQorLyogRUdMSUJDOiBEZWNsYXJlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGEgYmlnIG1hY3JvIGlmIGVpdGhlcgorICAgIV9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TIG9yIHdlIGFyZSB1c2luZyBhIGJhY2sgZG9vciBmcm9tCisgICBzbWFsbC1tYWNyb3MtZm5zLmMgKF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TID09IDIpLiAgKi8KK2V4dGVybiB2b2lkIF9fbGliY19sb2NrX2xvY2tfcmVjdXJzaXZlX2ZuIChfX2xpYmNfbG9ja19yZWN1cnNpdmVfdCAqKTsKK2xpYmNfaGlkZGVuX3Byb3RvIChfX2xpYmNfbG9ja19sb2NrX3JlY3Vyc2l2ZV9mbik7CisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEgKi8KKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MKKyMgZGVmaW5lIF9fbGliY19sb2NrX2xvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICB2b2lkICpzZWxmID0gVEhSRUFEX1NFTEY7CQkJCQkJICAgICAgXAorICAgIGlmICgoTkFNRSkub3duZXIgIT0gc2VsZikJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCWxsbF9sb2NrICgoTkFNRSkubG9jaywgTExMX1BSSVZBVEUpOwkJCQkgICAgICBcCisJKE5BTUUpLm93bmVyID0gc2VsZjsJCQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICAgICsrKE5BTUUpLmNudDsJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorIyBlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrX3JlY3Vyc2l2ZShOQU1FKQkJCQlcCisgIF9fbGliY19sb2NrX2xvY2tfcmVjdXJzaXZlX2ZuICgmKE5BTUUpKQorIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAqLworI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX2xvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF9sb2NrLCAoJihOQU1FKS5tdXRleCksIDApCisjZW5kaWYKKworLyogVHJ5IHRvIGxvY2sgdGhlIG5hbWVkIGxvY2sgdmFyaWFibGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMQorLyogRUdMSUJDOiBEZWNsYXJlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGEgYmlnIG1hY3JvIGlmIGVpdGhlcgorICAgIV9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TIG9yIHdlIGFyZSB1c2luZyBhIGJhY2sgZG9vciBmcm9tCisgICBzbWFsbC1tYWNyb3MtZm5zLmMgKF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TID09IDIpLiAgKi8KK2V4dGVybiBpbnQgX19saWJjX2xvY2tfdHJ5bG9ja19mbiAoX19saWJjX2xvY2tfdCAqKTsKK2xpYmNfaGlkZGVuX3Byb3RvIChfX2xpYmNfbG9ja190cnlsb2NrX2ZuKTsKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMSAqLworIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUworIyBkZWZpbmUgX19saWJjX2xvY2tfdHJ5bG9jayhOQU1FKSBcCisgIGxsbF90cnlsb2NrIChOQU1FKQorIyBlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja190cnlsb2NrKE5BTUUpIFwKKyAgX19saWJjX2xvY2tfdHJ5bG9ja19mbiAoJihOQU1FKSkKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgKi8KKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja190cnlsb2NrKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF90cnlsb2NrLCAoJihOQU1FKSksIDApCisjZW5kaWYKKyNkZWZpbmUgX19saWJjX3J3bG9ja190cnlyZGxvY2soTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2ssICgmKE5BTUUpKSwgMCkKKyNkZWZpbmUgX19saWJjX3J3bG9ja190cnl3cmxvY2soTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX3J3bG9ja190cnl3cmxvY2ssICgmKE5BTUUpKSwgMCkKKworLyogVHJ5IHRvIGxvY2sgdGhlIHJlY3Vyc2l2ZSBuYW1lZCBsb2NrIHZhcmlhYmxlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEKKy8qIEVHTElCQzogRGVjbGFyZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBhIGJpZyBtYWNybyBpZiBlaXRoZXIKKyAgICFfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyBvciB3ZSBhcmUgdXNpbmcgYSBiYWNrIGRvb3IgZnJvbQorICAgc21hbGwtbWFjcm9zLWZucy5jIChfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyA9PSAyKS4gICovCitleHRlcm4gaW50IF9fbGliY19sb2NrX3RyeWxvY2tfcmVjdXJzaXZlX2ZuIChfX2xpYmNfbG9ja19yZWN1cnNpdmVfdCAqKTsKK2xpYmNfaGlkZGVuX3Byb3RvIChfX2xpYmNfbG9ja190cnlsb2NrX3JlY3Vyc2l2ZV9mbik7CisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEgKi8KKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MKKyMgZGVmaW5lIF9fbGliY19sb2NrX3RyeWxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgKHsJCQkJCQkJCQkgICAgICBcCisgICAgaW50IHJlc3VsdCA9IDA7CQkJCQkJCSAgICAgIFwKKyAgICB2b2lkICpzZWxmID0gVEhSRUFEX1NFTEY7CQkJCQkJICAgICAgXAorICAgIGlmICgoTkFNRSkub3duZXIgIT0gc2VsZikJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCWlmIChsbGxfdHJ5bG9jayAoKE5BTUUpLmxvY2spID09IDApCQkJCSAgICAgIFwKKwkgIHsJCQkJCQkJCSAgICAgIFwKKwkgICAgKE5BTUUpLm93bmVyID0gc2VsZjsJCQkJCSAgICAgIFwKKwkgICAgKE5BTUUpLmNudCA9IDE7CQkJCQkJICAgICAgXAorCSAgfQkJCQkJCQkJICAgICAgXAorCWVsc2UJCQkJCQkJCSAgICAgIFwKKwkgIHJlc3VsdCA9IEVCVVNZOwkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgZWxzZQkJCQkJCQkJICAgICAgXAorICAgICAgKysoTkFNRSkuY250OwkJCQkJCQkgICAgICBcCisgICAgcmVzdWx0OwkJCQkJCQkJICAgICAgXAorICB9KQorIyBlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja190cnlsb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19sb2NrX3RyeWxvY2tfcmVjdXJzaXZlX2ZuICgmKE5BTUUpKQorIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAqLworI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX3RyeWxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF90cnlsb2NrLCAoJihOQU1FKSksIDApCisjZW5kaWYKKworI2RlZmluZSBfX3J0bGRfbG9ja190cnlsb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaywgKCYoTkFNRSkubXV0ZXgpLCAwKQorCisvKiBVbmxvY2sgdGhlIG5hbWVkIGxvY2sgdmFyaWFibGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMQorLyogRUdMSUJDOiBEZWNsYXJlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGEgYmlnIG1hY3JvIGlmIGVpdGhlcgorICAgIV9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TLCBvciB3ZSBhcmUgdXNpbmcgYSBiYWNrIGRvb3IgZnJvbQorICAgc21hbGwtbWFjcm9zLWZucy5jIChfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyA9PSAyKS4gICovCitleHRlcm4gdm9pZCBfX2xpYmNfbG9ja191bmxvY2tfZm4gKF9fbGliY19sb2NrX3QgKik7CitsaWJjX2hpZGRlbl9wcm90byAoX19saWJjX2xvY2tfdW5sb2NrX2ZuKTsKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMSAqLworIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUworIyBkZWZpbmUgX19saWJjX2xvY2tfdW5sb2NrKE5BTUUpIFwKKyAgbGxsX3VubG9jayAoTkFNRSwgTExMX1BSSVZBVEUpCisjIGVsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX3VubG9jayhOQU1FKSBcCisgIF9fbGliY19sb2NrX3VubG9ja19mbiAoJihOQU1FKSkKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgKi8KKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja191bmxvY2soTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X3VubG9jaywgKCYoTkFNRSkpLCAwKQorI2VuZGlmCisjZGVmaW5lIF9fbGliY19yd2xvY2tfdW5sb2NrKE5BTUUpIFwKKyAgX19saWJjX3B0Zl9jYWxsIChfX3B0aHJlYWRfcndsb2NrX3VubG9jaywgKCYoTkFNRSkpLCAwKQorCisvKiBVbmxvY2sgdGhlIHJlY3Vyc2l2ZSBuYW1lZCBsb2NrIHZhcmlhYmxlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEKKy8qIEVHTElCQzogRGVjbGFyZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBhIGJpZyBtYWNybyBpZiBlaXRoZXIKKyAgICFfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUywgb3Igd2UgYXJlIHVzaW5nIGEgYmFjayBkb29yIGZyb20KKyAgIHNtYWxsLW1hY3Jvcy1mbnMuYyAoX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgPT0gMikuICAqLworZXh0ZXJuIHZvaWQgX19saWJjX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZV9mbiAoX19saWJjX2xvY2tfcmVjdXJzaXZlX3QgKik7CitsaWJjX2hpZGRlbl9wcm90byAoX19saWJjX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZV9mbik7CisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEgKi8KKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MKKy8qIFdlIGRvIG5vIGVycm9yIGNoZWNraW5nIGhlcmUuICAqLworIyBkZWZpbmUgX19saWJjX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaWYgKC0tKE5BTUUpLmNudCA9PSAwKQkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJKE5BTUUpLm93bmVyID0gTlVMTDsJCQkJCQkgICAgICBcCisJbGxsX3VubG9jayAoKE5BTUUpLmxvY2ssIExMTF9QUklWQVRFKTsJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19sb2NrX3VubG9ja19yZWN1cnNpdmVfZm4gKCYoTkFNRSkpCisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICovCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCAoJihOQU1FKSksIDApCisjZW5kaWYKKworI2lmIGRlZmluZWQgX0xJQkMgJiYgZGVmaW5lZCBTSEFSRUQKKyMgZGVmaW5lIF9fcnRsZF9sb2NrX2RlZmF1bHRfbG9ja19yZWN1cnNpdmUobG9jaykgXAorICArKygocHRocmVhZF9tdXRleF90ICopKGxvY2spKS0+X19kYXRhLl9fY291bnQ7CisKKyMgZGVmaW5lIF9fcnRsZF9sb2NrX2RlZmF1bHRfdW5sb2NrX3JlY3Vyc2l2ZShsb2NrKSBcCisgIC0tKChwdGhyZWFkX211dGV4X3QgKikobG9jaykpLT5fX2RhdGEuX19jb3VudDsKKworIyBkZWZpbmUgX19ydGxkX2xvY2tfbG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBHTChkbF9ydGxkX2xvY2tfcmVjdXJzaXZlKSAoJihOQU1FKS5tdXRleCkKKworIyBkZWZpbmUgX19ydGxkX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIEdMKGRsX3J0bGRfdW5sb2NrX3JlY3Vyc2l2ZSkgKCYoTkFNRSkubXV0ZXgpCisjZWxzZQorIyBkZWZpbmUgX19ydGxkX2xvY2tfbG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X2xvY2ssICgmKE5BTUUpLm11dGV4KSwgMCkKKworIyBkZWZpbmUgX19ydGxkX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCAoJihOQU1FKS5tdXRleCksIDApCisjZW5kaWYKKworLyogRGVmaW5lIG9uY2UgY29udHJvbCB2YXJpYWJsZS4gICovCisjaWYgUFRIUkVBRF9PTkNFX0lOSVQgPT0gMAorLyogU3BlY2lhbCBjYXNlIGZvciBzdGF0aWMgdmFyaWFibGVzIHdoZXJlIHdlIGNhbiBhdm9pZCB0aGUgaW5pdGlhbGl6YXRpb24KKyAgIGlmIGl0IGlzIHplcm8uICAqLworIyBkZWZpbmUgX19saWJjX29uY2VfZGVmaW5lKENMQVNTLCBOQU1FKSBcCisgIENMQVNTIHB0aHJlYWRfb25jZV90IE5BTUUKKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfb25jZV9kZWZpbmUoQ0xBU1MsIE5BTUUpIFwKKyAgQ0xBU1MgcHRocmVhZF9vbmNlX3QgTkFNRSA9IFBUSFJFQURfT05DRV9JTklUCisjZW5kaWYKKworLyogQ2FsbCBoYW5kbGVyIGlmZiB0aGUgZmlyc3QgY2FsbC4gICovCisjZGVmaW5lIF9fbGliY19vbmNlKE9OQ0VfQ09OVFJPTCwgSU5JVF9GVU5DVElPTikgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGlmIChQVEZBVkFJTCAoX19wdGhyZWFkX29uY2UpKQkJCQkJICAgICAgXAorICAgICAgX19saWJjX3B0Zl9jYWxsX2Fsd2F5cyAoX19wdGhyZWFkX29uY2UsICgmKE9OQ0VfQ09OVFJPTCksCQkgICAgICBcCisJCQkJCSAgICAgICBJTklUX0ZVTkNUSU9OKSk7CQkgICAgICBcCisgICAgZWxzZSBpZiAoKE9OQ0VfQ09OVFJPTCkgPT0gUFRIUkVBRF9PTkNFX0lOSVQpIHsJCQkgICAgICBcCisgICAgICBJTklUX0ZVTkNUSU9OICgpOwkJCQkJCQkgICAgICBcCisgICAgICAoT05DRV9DT05UUk9MKSB8PSAyOwkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisKKy8qIE5vdGUgdGhhdCBmb3IgSS9PIGNsZWFudXAgaGFuZGxpbmcgd2UgYXJlIHVzaW5nIHRoZSBvbGQtc3R5bGUKKyAgIGNhbmNlbCBoYW5kbGluZy4gIEl0IGRvZXMgbm90IGhhdmUgdG8gYmUgaW50ZWdyYXRlZCB3aXRoIEMrKyBzbmNlCisgICBubyBDKysgY29kZSBpcyBjYWxsZWQgaW4gdGhlIG1pZGRsZS4gIFRoZSBvbGQtc3R5bGUgaGFuZGxpbmcgaXMKKyAgIGZhc3RlciBhbmQgdGhlIHN1cHBvcnQgaXMgbm90IGdvaW5nIGF3YXkuICAqLworZXh0ZXJuIHZvaWQgX3B0aHJlYWRfY2xlYW51cF9wdXNoIChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnJvdXRpbmUpICh2b2lkICopLCB2b2lkICphcmcpOworZXh0ZXJuIHZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3AgKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGVjdXRlKTsKK2V4dGVybiB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlciAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyb3V0aW5lKSAodm9pZCAqKSwgdm9pZCAqYXJnKTsKK2V4dGVybiB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcG9wX3Jlc3RvcmUgKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4ZWN1dGUpOworCisvKiBTdGFydCBjcml0aWNhbCByZWdpb24gd2l0aCBjbGVhbnVwLiAgKi8KKyNkZWZpbmUgX19saWJjX2NsZWFudXBfcmVnaW9uX3N0YXJ0KERPSVQsIEZDVCwgQVJHKSBcCisgIHsgc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyIF9idWZmZXI7CQkJCSAgICAgIFwKKyAgICBpbnQgX2F2YWlsOwkJCQkJCQkJICAgICAgXAorICAgIGlmIChET0lUKSB7CQkJCQkJCQkgICAgICBcCisgICAgICBfYXZhaWwgPSBQVEZBVkFJTCAoX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyKTsJCQkgICAgICBcCisgICAgICBpZiAoX2F2YWlsKSB7CQkJCQkJCSAgICAgIFwKKwlfX2xpYmNfcHRmX2NhbGxfYWx3YXlzIChfcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIsICgmX2J1ZmZlciwgRkNULCAgXAorCQkJCQkJCSAgICAgIEFSRykpOwkgICAgICBcCisgICAgICB9IGVsc2UgewkJCQkJCQkJICAgICAgXAorCV9idWZmZXIuX19yb3V0aW5lID0gKEZDVCk7CQkJCQkgICAgICBcCisJX2J1ZmZlci5fX2FyZyA9IChBUkcpOwkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgfSBlbHNlIHsJCQkJCQkJCSAgICAgIFwKKyAgICAgIF9hdmFpbCA9IDA7CQkJCQkJCSAgICAgIFwKKyAgICB9CisKKy8qIEVuZCBjcml0aWNhbCByZWdpb24gd2l0aCBjbGVhbnVwLiAgKi8KKyNkZWZpbmUgX19saWJjX2NsZWFudXBfcmVnaW9uX2VuZChET0lUKSBcCisgICAgaWYgKF9hdmFpbCkgewkJCQkJCQkgICAgICBcCisgICAgICBfX2xpYmNfcHRmX2NhbGxfYWx3YXlzIChfcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlLCAoJl9idWZmZXIsIERPSVQpKTtcCisgICAgfSBlbHNlIGlmIChET0lUKQkJCQkJCQkgICAgICBcCisgICAgICBfYnVmZmVyLl9fcm91dGluZSAoX2J1ZmZlci5fX2FyZyk7CQkJCSAgICAgIFwKKyAgfQorCisvKiBTb21ldGltZXMgd2UgaGF2ZSB0byBleGl0IHRoZSBibG9jayBpbiB0aGUgbWlkZGxlLiAgKi8KKyNkZWZpbmUgX19saWJjX2NsZWFudXBfZW5kKERPSVQpIFwKKyAgICBpZiAoX2F2YWlsKSB7CQkJCQkJCSAgICAgIFwKKyAgICAgIF9fbGliY19wdGZfY2FsbF9hbHdheXMgKF9wdGhyZWFkX2NsZWFudXBfcG9wX3Jlc3RvcmUsICgmX2J1ZmZlciwgRE9JVCkpO1wKKyAgICB9IGVsc2UgaWYgKERPSVQpCQkJCQkJCSAgICAgIFwKKyAgICAgIF9idWZmZXIuX19yb3V0aW5lIChfYnVmZmVyLl9fYXJnKQorCisKKy8qIE5vcm1hbCBjbGVhbnVwIGhhbmRsaW5nLCBiYXNlZCBvbiBDIGNsZWFudXAgYXR0cmlidXRlLiAgKi8KK19fZXh0ZXJuX2lubGluZSB2b2lkCitfX2xpYmNfY2xlYW51cF9yb3V0aW5lIChzdHJ1Y3QgX19wdGhyZWFkX2NsZWFudXBfZnJhbWUgKmYpCit7CisgIGlmIChmLT5fX2RvX2l0KQorICAgIGYtPl9fY2FuY2VsX3JvdXRpbmUgKGYtPl9fY2FuY2VsX2FyZyk7Cit9CisKKyNkZWZpbmUgX19saWJjX2NsZWFudXBfcHVzaChmY3QsIGFyZykgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHN0cnVjdCBfX3B0aHJlYWRfY2xlYW51cF9mcmFtZSBfX2NsZnJhbWUJCQkJICAgICAgXAorICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY2xlYW51cF9fIChfX2xpYmNfY2xlYW51cF9yb3V0aW5lKSkpCQkgICAgICBcCisgICAgICA9IHsgLl9fY2FuY2VsX3JvdXRpbmUgPSAoZmN0KSwgLl9fY2FuY2VsX2FyZyA9IChhcmcpLAkJICAgICAgXAorICAgICAgICAgIC5fX2RvX2l0ID0gMSB9OworCisjZGVmaW5lIF9fbGliY19jbGVhbnVwX3BvcChleGVjdXRlKSBcCisgICAgX19jbGZyYW1lLl9fZG9faXQgPSAoZXhlY3V0ZSk7CQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworLyogQ3JlYXRlIHRocmVhZC1zcGVjaWZpYyBrZXkuICAqLworI2RlZmluZSBfX2xpYmNfa2V5X2NyZWF0ZShLRVksIERFU1RSVUNUT1IpIFwKKyAgX19saWJjX3B0Zl9jYWxsIChfX3B0aHJlYWRfa2V5X2NyZWF0ZSwgKEtFWSwgREVTVFJVQ1RPUiksIDEpCisKKy8qIEdldCB0aHJlYWQtc3BlY2lmaWMgZGF0YS4gICovCisjZGVmaW5lIF9fbGliY19nZXRzcGVjaWZpYyhLRVkpIFwKKyAgX19saWJjX3B0Zl9jYWxsIChfX3B0aHJlYWRfZ2V0c3BlY2lmaWMsIChLRVkpLCBOVUxMKQorCisvKiBTZXQgdGhyZWFkLXNwZWNpZmljIGRhdGEuICAqLworI2RlZmluZSBfX2xpYmNfc2V0c3BlY2lmaWMoS0VZLCBWQUxVRSkgXAorICBfX2xpYmNfcHRmX2NhbGwgKF9fcHRocmVhZF9zZXRzcGVjaWZpYywgKEtFWSwgVkFMVUUpLCAwKQorCisKKy8qIFJlZ2lzdGVyIGhhbmRsZXJzIHRvIGV4ZWN1dGUgYmVmb3JlIGFuZCBhZnRlciBgZm9yaycuICBOb3RlIHRoYXQgdGhlCisgICBsYXN0IHBhcmFtZXRlciBpcyBOVUxMLiAgVGhlIGhhbmRsZXJzIHJlZ2lzdGVyZWQgYnkgdGhlIGxpYmMgYXJlCisgICBuZXZlciByZW1vdmVkIHNvIHRoaXMgaXMgT0suICAqLworI2RlZmluZSBfX2xpYmNfYXRmb3JrKFBSRVBBUkUsIFBBUkVOVCwgQ0hJTEQpIFwKKyAgX19yZWdpc3Rlcl9hdGZvcmsgKFBSRVBBUkUsIFBBUkVOVCwgQ0hJTEQsIE5VTEwpCitleHRlcm4gaW50IF9fcmVnaXN0ZXJfYXRmb3JrICh2b2lkICgqX19wcmVwYXJlKSAodm9pZCksCisJCQkgICAgICB2b2lkICgqX19wYXJlbnQpICh2b2lkKSwKKwkJCSAgICAgIHZvaWQgKCpfX2NoaWxkKSAodm9pZCksCisJCQkgICAgICB2b2lkICpfX2Rzb19oYW5kbGUpOworCisvKiBGdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCBieSB0aGlzIGZpbGUgYW5kIGFyZSBpbnRlcm5hbCB0byB0aGUgR05VIEMKKyAgIGxpYnJhcnkuICAqLworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF9pbml0IChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkJIF9fY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqX19tdXRleF9hdHRyKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSAocHRocmVhZF9tdXRleF90ICpfX211dGV4KTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayAocHRocmVhZF9tdXRleF90ICpfX211dGV4KTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhfbG9jayAocHRocmVhZF9tdXRleF90ICpfX211dGV4KTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleGF0dHJfaW5pdCAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0cik7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlIChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIsCisJCQkJCWludCBfX2tpbmQpOworCisjaWZkZWYgX19VU0VfVU5JWDk4CitleHRlcm4gaW50IF9fcHRocmVhZF9yd2xvY2tfaW5pdCAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2ssCisJCQkJICBfX2NvbnN0IHB0aHJlYWRfcndsb2NrYXR0cl90ICpfX2F0dHIpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveSAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spOworCitleHRlcm4gaW50IF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jayk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfcndsb2NrX3dybG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spOworCitleHRlcm4gaW50IF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jayk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX3J3bG9ja191bmxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKTsKKyNlbmRpZgorCitleHRlcm4gaW50IF9fcHRocmVhZF9rZXlfY3JlYXRlIChwdGhyZWFkX2tleV90ICpfX2tleSwKKwkJCQkgdm9pZCAoKl9fZGVzdHJfZnVuY3Rpb24pICh2b2lkICopKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfc2V0c3BlY2lmaWMgKHB0aHJlYWRfa2V5X3QgX19rZXksCisJCQkJICBfX2NvbnN0IHZvaWQgKl9fcG9pbnRlcik7CisKK2V4dGVybiB2b2lkICpfX3B0aHJlYWRfZ2V0c3BlY2lmaWMgKHB0aHJlYWRfa2V5X3QgX19rZXkpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9vbmNlIChwdGhyZWFkX29uY2VfdCAqX19vbmNlX2NvbnRyb2wsCisJCQkgICB2b2lkICgqX19pbml0X3JvdXRpbmUpICh2b2lkKSk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX2F0Zm9yayAodm9pZCAoKl9fcHJlcGFyZSkgKHZvaWQpLAorCQkJICAgICB2b2lkICgqX19wYXJlbnQpICh2b2lkKSwKKwkJCSAgICAgdm9pZCAoKl9fY2hpbGQpICh2b2lkKSk7CisKKworCisvKiBNYWtlIHRoZSBwdGhyZWFkIGZ1bmN0aW9ucyB3ZWFrIHNvIHRoYXQgd2UgY2FuIGVsaWRlIHRoZW0gZnJvbQorICAgc2luZ2xlLXRocmVhZGVkIHByb2Nlc3Nlcy4gICovCisjaWZuZGVmIF9fTk9fV0VBS19QVEhSRUFEX0FMSUFTRVMKKyMgaWZkZWYgd2Vha19leHRlcm4KKyMgIGlmIF9MSUJDCisjICAgaW5jbHVkZSA8YnAtc3ltLmg+CisjICBlbHNlCisjICAgZGVmaW5lIEJQX1NZTShzeW0pIHN5bQorIyAgZW5kaWYKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF9pbml0KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF9kZXN0cm95KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF9sb2NrKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF90cnlsb2NrKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF91bmxvY2spKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX211dGV4YXR0cl9pbml0KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX3J3bG9ja19pbml0KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveSkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3JkbG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3dybG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3VubG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfa2V5X2NyZWF0ZSkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfc2V0c3BlY2lmaWMpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX2dldHNwZWNpZmljKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9vbmNlKSkKK3dlYWtfZXh0ZXJuIChfX3B0aHJlYWRfaW5pdGlhbGl6ZSkKK3dlYWtfZXh0ZXJuIChfX3B0aHJlYWRfYXRmb3JrKQord2Vha19leHRlcm4gKEJQX1NZTSAoX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9wdGhyZWFkX2NsZWFudXBfcG9wX3Jlc3RvcmUpKQord2Vha19leHRlcm4gKEJQX1NZTSAocHRocmVhZF9zZXRjYW5jZWxzdGF0ZSkpCisjIGVsc2UKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleF9pbml0CisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX211dGV4X2xvY2sKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleF90cnlsb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3kKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX3J3bG9ja193cmxvY2sKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfcndsb2NrX3VubG9jaworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX2tleV9jcmVhdGUKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9zZXRzcGVjaWZpYworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX2dldHNwZWNpZmljCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfb25jZQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX2luaXRpYWxpemUKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9hdGZvcmsKKyMgIHByYWdtYSB3ZWFrIF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcgorIyAgcHJhZ21hIHdlYWsgX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZQorIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZQorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZgkvKiBiaXRzL2xpYmMtbG9jay5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbGliaW8tbGRibC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2xpYmlvLWxkYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njc0YmNiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2xpYmlvLWxkYmwuaApAQCAtMCwwICsxLDI1IEBACisvKiAtbWxvbmctZG91YmxlLTY0IGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgbGliaW8gZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9JT19TVERJT19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL2xpYmlvLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8bGliaW8uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworX19MREJMX1JFRElSX0RFQ0wgKF9JT192ZnNjYW5mKQorX19MREJMX1JFRElSX0RFQ0wgKF9JT192ZnByaW50ZikKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9saW5rLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZjVmNzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbGluay5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfTElOS19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL2xpbmsuaD4gZGlyZWN0bHk7IHVzZSA8bGluay5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKy8qIFJlZ2lzdGVycyBmb3IgZW50cnkgaW50byBQTFQgb24gSUEtMzIuICAqLwordHlwZWRlZiBzdHJ1Y3QgTGFfaTg2X3JlZ3MKK3sKKyAgdWludDMyX3QgbHJfZWR4OworICB1aW50MzJfdCBscl9lY3g7CisgIHVpbnQzMl90IGxyX2VheDsKKyAgdWludDMyX3QgbHJfZWJwOworICB1aW50MzJfdCBscl9lc3A7Cit9IExhX2k4Nl9yZWdzOworCisvKiBSZXR1cm4gdmFsdWVzIGZvciBjYWxscyBmcm9tIFBMVCBvbiBJQS0zMi4gICovCit0eXBlZGVmIHN0cnVjdCBMYV9pODZfcmV0dmFsCit7CisgIHVpbnQzMl90IGxydl9lYXg7CisgIHVpbnQzMl90IGxydl9lZHg7CisgIGxvbmcgZG91YmxlIGxydl9zdDA7CisgIGxvbmcgZG91YmxlIGxydl9zdDE7Cit9IExhX2k4Nl9yZXR2YWw7CisKKworX19CRUdJTl9ERUNMUworCitleHRlcm4gRWxmMzJfQWRkciBsYV9pODZfZ251X3BsdGVudGVyIChFbGYzMl9TeW0gKl9fc3ltLCB1bnNpZ25lZCBpbnQgX19uZHgsCisJCQkJICAgICAgIHVpbnRwdHJfdCAqX19yZWZjb29rLAorCQkJCSAgICAgICB1aW50cHRyX3QgKl9fZGVmY29vaywKKwkJCQkgICAgICAgTGFfaTg2X3JlZ3MgKl9fcmVncywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpfX2ZsYWdzLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpfX3N5bW5hbWUsCisJCQkJICAgICAgIGxvbmcgaW50ICpfX2ZyYW1lc2l6ZXApOworZXh0ZXJuIHVuc2lnbmVkIGludCBsYV9pODZfZ251X3BsdGV4aXQgKEVsZjMyX1N5bSAqX19zeW0sIHVuc2lnbmVkIGludCBfX25keCwKKwkJCQkJdWludHB0cl90ICpfX3JlZmNvb2ssCisJCQkJCXVpbnRwdHJfdCAqX19kZWZjb29rLAorCQkJCQljb25zdCBMYV9pODZfcmVncyAqX19pbnJlZ3MsCisJCQkJCUxhX2k4Nl9yZXR2YWwgKl9fb3V0cmVncywKKwkJCQkJY29uc3QgY2hhciAqX19zeW1uYW1lKTsKKworX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9sb2NhbF9saW0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9sb2NhbF9saW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjBkZjRmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2xvY2FsX2xpbS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKiBNaW5pbXVtIGd1YXJhbnRlZWQgbWF4aW11bSB2YWx1ZXMgZm9yIHN5c3RlbSBsaW1pdHMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTgsMjAwMCwyMDAyLTIwMDQsMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAorICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGUga2VybmVsIGhlYWRlciBwb2xsdXRlcyB0aGUgbmFtZXNwYWNlIHdpdGggdGhlIE5SX09QRU4gc3ltYm9sCisgICBhbmQgZGVmaW5lcyBMSU5LX01BWCBhbHRob3VnaCBmaWxlc3lzdGVtcyBoYXZlIGRpZmZlcmVudCBtYXhpbWEuICBBCisgICBzaW1pbGFyIHRoaW5nIGlzIHRydWUgZm9yIE9QRU5fTUFYOiB0aGUgbGltaXQgY2FuIGJlIGNoYW5nZWQgYXQKKyAgIHJ1bnRpbWUgYW5kIHRoZXJlZm9yZSB0aGUgbWFjcm8gbXVzdCBub3QgYmUgZGVmaW5lZC4gIFJlbW92ZSB0aGlzCisgICBhZnRlciBpbmNsdWRpbmcgdGhlIGhlYWRlciBpZiBuZWNlc3NhcnkuICAqLworI2lmbmRlZiBOUl9PUEVOCisjIGRlZmluZSBfX3VuZGVmX05SX09QRU4KKyNlbmRpZgorI2lmbmRlZiBMSU5LX01BWAorIyBkZWZpbmUgX191bmRlZl9MSU5LX01BWAorI2VuZGlmCisjaWZuZGVmIE9QRU5fTUFYCisjIGRlZmluZSBfX3VuZGVmX09QRU5fTUFYCisjZW5kaWYKKyNpZm5kZWYgQVJHX01BWAorIyBkZWZpbmUgX191bmRlZl9BUkdfTUFYCisjZW5kaWYKKworLyogVGhlIGtlcm5lbCBzb3VyY2VzIGNvbnRhaW4gYSBmaWxlIHdpdGggYWxsIHRoZSBuZWVkZWQgaW5mb3JtYXRpb24uICAqLworI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorCisvKiBIYXZlIHRvIHJlbW92ZSBOUl9PUEVOPyAgKi8KKyNpZmRlZiBfX3VuZGVmX05SX09QRU4KKyMgdW5kZWYgTlJfT1BFTgorIyB1bmRlZiBfX3VuZGVmX05SX09QRU4KKyNlbmRpZgorLyogSGF2ZSB0byByZW1vdmUgTElOS19NQVg/ICAqLworI2lmZGVmIF9fdW5kZWZfTElOS19NQVgKKyMgdW5kZWYgTElOS19NQVgKKyMgdW5kZWYgX191bmRlZl9MSU5LX01BWAorI2VuZGlmCisvKiBIYXZlIHRvIHJlbW92ZSBPUEVOX01BWD8gICovCisjaWZkZWYgX191bmRlZl9PUEVOX01BWAorIyB1bmRlZiBPUEVOX01BWAorIyB1bmRlZiBfX3VuZGVmX09QRU5fTUFYCisjZW5kaWYKKy8qIEhhdmUgdG8gcmVtb3ZlIEFSR19NQVg/ICAqLworI2lmZGVmIF9fdW5kZWZfQVJHX01BWAorIyB1bmRlZiBBUkdfTUFYCisjIHVuZGVmIF9fdW5kZWZfQVJHX01BWAorI2VuZGlmCisKKy8qIFRoZSBudW1iZXIgb2YgZGF0YSBrZXlzIHBlciBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9LRVlTX01BWAkxMjgKKy8qIFRoaXMgaXMgdGhlIHZhbHVlIHRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMuICAqLworI2RlZmluZSBQVEhSRUFEX0tFWVNfTUFYCTEwMjQKKworLyogQ29udHJvbGxpbmcgdGhlIGl0ZXJhdGlvbnMgb2YgZGVzdHJ1Y3RvcnMgZm9yIHRocmVhZC1zcGVjaWZpYyBkYXRhLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMJNAorLyogTnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzLiAgKi8KKyNkZWZpbmUgUFRIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMJX1BPU0lYX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMKKworLyogVGhlIG51bWJlciBvZiB0aHJlYWRzIHBlciBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9USFJFQURTX01BWAk2NAorLyogV2UgaGF2ZSBubyBwcmVkZWZpbmVkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcy4gICovCisjdW5kZWYgUFRIUkVBRF9USFJFQURTX01BWAorCisvKiBNYXhpbXVtIGFtb3VudCBieSB3aGljaCBhIHByb2Nlc3MgY2FuIGRlc2NyZWFzZSBpdHMgYXN5bmNocm9ub3VzIEkvTworICAgcHJpb3JpdHkgbGV2ZWwuICAqLworI2RlZmluZSBBSU9fUFJJT19ERUxUQV9NQVgJMjAKKworLyogTWluaW11bSBzaXplIGZvciBhIHRocmVhZC4gIFdlIGFyZSBmcmVlIHRvIGNob29zZSBhIHJlYXNvbmFibGUgdmFsdWUuICAqLworI2RlZmluZSBQVEhSRUFEX1NUQUNLX01JTgkxNjM4NAorCisvKiBNYXhpbXVtIG51bWJlciBvZiB0aW1lciBleHBpcmF0aW9uIG92ZXJydW5zLiAgKi8KKyNkZWZpbmUgREVMQVlUSU1FUl9NQVgJMjE0NzQ4MzY0NworCisvKiBNYXhpbXVtIHR0eSBuYW1lIGxlbmd0aC4gICovCisjZGVmaW5lIFRUWV9OQU1FX01BWAkJMzIKKworLyogTWF4aW11bSBsb2dpbiBuYW1lIGxlbmd0aC4gIFRoaXMgaXMgYXJiaXRyYXJ5LiAgKi8KKyNkZWZpbmUgTE9HSU5fTkFNRV9NQVgJCTI1NgorCisvKiBNYXhpbXVtIGhvc3QgbmFtZSBsZW5ndGguICAqLworI2RlZmluZSBIT1NUX05BTUVfTUFYCQk2NAorCisvKiBNYXhpbXVtIG1lc3NhZ2UgcXVldWUgcHJpb3JpdHkgbGV2ZWwuICAqLworI2RlZmluZSBNUV9QUklPX01BWAkJMzI3NjgKKworLyogTWF4aW11bSB2YWx1ZSB0aGUgc2VtYXBob3JlIGNhbiBoYXZlLiAgKi8KKyNkZWZpbmUgU0VNX1ZBTFVFX01BWCAgICgyMTQ3NDgzNjQ3KQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2xvY2FsZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMDY0YjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbG9jYWxlLmgKQEAgLTAsMCArMSw0NCBAQAorLyogRGVmaW5pdGlvbiBvZiBsb2NhbGUgY2F0ZWdvcnkgc3ltYm9sIHZhbHVlcy4KKyAgIENvcHlyaWdodCAoQykgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9MT0NBTEVfSCAmJiAhZGVmaW5lZCBfTEFOR0lORk9fSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2xvY2FsZS5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bG9jYWxlLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX0JJVFNfTE9DQUxFX0gKKyNkZWZpbmUgX0JJVFNfTE9DQUxFX0gJMQorCitlbnVtCit7CisgIF9fTENfQ1RZUEUgPSAwLAorICBfX0xDX05VTUVSSUMgPSAxLAorICBfX0xDX1RJTUUgPSAyLAorICBfX0xDX0NPTExBVEUgPSAzLAorICBfX0xDX01PTkVUQVJZID0gNCwKKyAgX19MQ19NRVNTQUdFUyA9IDUsCisgIF9fTENfQUxMID0gNiwKKyAgX19MQ19QQVBFUiA9IDcsCisgIF9fTENfTkFNRSA9IDgsCisgIF9fTENfQUREUkVTUyA9IDksCisgIF9fTENfVEVMRVBIT05FID0gMTAsCisgIF9fTENfTUVBU1VSRU1FTlQgPSAxMSwKKyAgX19MQ19JREVOVElGSUNBVElPTiA9IDEyCit9OworCisjZW5kaWYJLyogYml0cy9sb2NhbGUuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21hdGgtZmluaXRlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbWF0aC1maW5pdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2Y0MjdjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21hdGgtZmluaXRlLmgKQEAgLTAsMCArMSwzMjkgQEAKKy8qIEVudHJ5IHBvaW50cyB0byBmaW5pdGUtbWF0aC1vbmx5IGNvbXBpbGVyIHJ1bnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL21hdGgtZmluaXRlLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIGFjb3MuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYWNvcywgKGRvdWJsZSksIF9fYWNvc19maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChhY29zZiwgKGZsb2F0KSwgX19hY29zZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYWNvc2wsIChsb25nIGRvdWJsZSksIF9fYWNvc2xfZmluaXRlKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKKy8qIGFjb3NoLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGFjb3NoLCAoZG91YmxlKSwgX19hY29zaF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChhY29zaGYsIChmbG9hdCksIF9fYWNvc2hmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYWNvc2hsLCAobG9uZyBkb3VibGUpLCBfX2Fjb3NobF9maW5pdGUpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIGFzaW4uICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYXNpbiwgKGRvdWJsZSksIF9fYXNpbl9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChhc2luZiwgKGZsb2F0KSwgX19hc2luZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYXNpbmwsIChsb25nIGRvdWJsZSksIF9fYXNpbmxfZmluaXRlKTsKKyNlbmRpZgorCisvKiBhdGFuMi4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChhdGFuMiwgKGRvdWJsZSwgZG91YmxlKSwgX19hdGFuMl9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChhdGFuMmYsIChmbG9hdCwgZmxvYXQpLCBfX2F0YW4yZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYXRhbjJsLCAobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKSwKKwkJCQkgICBfX2F0YW4ybF9maW5pdGUpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorLyogYXRhbmguICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYXRhbmgsIChkb3VibGUpLCBfX2F0YW5oX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGF0YW5oZiwgKGZsb2F0KSwgX19hdGFuaGZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChhdGFuaGwsIChsb25nIGRvdWJsZSksIF9fYXRhbmhsX2Zpbml0ZSk7CisjIGVuZGlmCisjZW5kaWYKKworLyogY29zaC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChjb3NoLCAoZG91YmxlKSwgX19jb3NoX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGNvc2hmLCAoZmxvYXQpLCBfX2Nvc2hmX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChjb3NobCwgKGxvbmcgZG91YmxlKSwgX19jb3NobF9maW5pdGUpOworI2VuZGlmCisKKy8qIGV4cC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChleHAsIChkb3VibGUpLCBfX2V4cF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChleHBmLCAoZmxvYXQpLCBfX2V4cGZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGV4cGwsIChsb25nIGRvdWJsZSksIF9fZXhwbF9maW5pdGUpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIGV4cDEwLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGV4cDEwLCAoZG91YmxlKSwgX19leHAxMF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChleHAxMGYsIChmbG9hdCksIF9fZXhwMTBmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoZXhwMTBsLCAobG9uZyBkb3VibGUpLCBfX2V4cDEwbF9maW5pdGUpOworIyBlbmRpZgorCisvKiBwb3cxMC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChwb3cxMCwgKGRvdWJsZSksIF9fZXhwMTBfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAocG93MTBmLCAoZmxvYXQpLCBfX2V4cDEwZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKHBvdzEwbCwgKGxvbmcgZG91YmxlKSwgX19leHAxMGxfZmluaXRlKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CisvKiBleHAyLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGV4cDIsIChkb3VibGUpLCBfX2V4cDJfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoZXhwMmYsIChmbG9hdCksIF9fZXhwMmZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChleHAybCwgKGxvbmcgZG91YmxlKSwgX19leHAybF9maW5pdGUpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIGZtb2QuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoZm1vZCwgKGRvdWJsZSwgZG91YmxlKSwgX19mbW9kX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGZtb2RmLCAoZmxvYXQsIGZsb2F0KSwgX19mbW9kZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoZm1vZGwsIChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpLAorCQkJCSAgIF9fZm1vZGxfZmluaXRlKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CisvKiBoeXBvdC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChoeXBvdCwgKGRvdWJsZSwgZG91YmxlKSwgX19oeXBvdF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChoeXBvdGYsIChmbG9hdCwgZmxvYXQpLCBfX2h5cG90Zl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGh5cG90bCwgKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSksCisJCQkJICAgX19oeXBvdGxfZmluaXRlKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIGowLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGowLCAoZG91YmxlKSwgX19qMF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChqMGYsIChmbG9hdCksIF9fajBmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoajBsLCAobG9uZyBkb3VibGUpLCBfX2owbF9maW5pdGUpOworIyBlbmRpZgorCisvKiB5MC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIICh5MCwgKGRvdWJsZSksIF9feTBfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoeTBmLCAoZmxvYXQpLCBfX3kwZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKHkwbCwgKGxvbmcgZG91YmxlKSwgX195MGxfZmluaXRlKTsKKyMgZW5kaWYKKworLyogajEuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoajEsIChkb3VibGUpLCBfX2oxX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGoxZiwgKGZsb2F0KSwgX19qMWZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChqMWwsIChsb25nIGRvdWJsZSksIF9fajFsX2Zpbml0ZSk7CisjIGVuZGlmCisKKy8qIHkxLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKHkxLCAoZG91YmxlKSwgX195MV9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIICh5MWYsIChmbG9hdCksIF9feTFmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoeTFsLCAobG9uZyBkb3VibGUpLCBfX3kxbF9maW5pdGUpOworIyBlbmRpZgorCisvKiBqbi4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChqbiwgKGludCwgZG91YmxlKSwgX19qbl9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChqbmYsIChpbnQsIGZsb2F0KSwgX19qbmZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChqbmwsIChpbnQsIGxvbmcgZG91YmxlKSwgX19qbmxfZmluaXRlKTsKKyMgZW5kaWYKKworLyogeW4uICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoeW4sIChpbnQsIGRvdWJsZSksIF9feW5fZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoeW5mLCAoaW50LCBmbG9hdCksIF9feW5mX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoeW5sLCAoaW50LCBsb25nIGRvdWJsZSksIF9feW5sX2Zpbml0ZSk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIGxnYW1tYV9yLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGxnYW1tYV9yLCAoZG91YmxlLCBpbnQgKiksIF9fbGdhbW1hX3JfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAobGdhbW1hZl9yLCAoZmxvYXQsIGludCAqKSwgX19sZ2FtbWFmX3JfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChsZ2FtbWFsX3IsIChsb25nIGRvdWJsZSwgaW50ICopLAorCQkJCSAgIF9fbGdhbW1hbF9yX2Zpbml0ZSk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CisvKiBsZ2FtbWEuICAqLworX19leHRlcm5fYWx3YXlzX2lubGluZSBkb3VibGUgX19OVEggKGxnYW1tYSAoZG91YmxlIF9fZCkpCit7CisjIGlmZGVmIF9fVVNFX0lTT0M5OQorICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgcmV0dXJuIGxnYW1tYV9yIChfX2QsICZfX2xvY2FsX3NpZ25nYW0pOworIyBlbHNlCisgIHJldHVybiBsZ2FtbWFfciAoX19kLCAmc2lnbmdhbSk7CisjIGVuZGlmCit9CitfX2V4dGVybl9hbHdheXNfaW5saW5lIGZsb2F0IF9fTlRIIChsZ2FtbWFmIChmbG9hdCBfX2QpKQoreworIyBpZmRlZiBfX1VTRV9JU09DOTkKKyAgaW50IF9fbG9jYWxfc2lnbmdhbSA9IDA7CisgIHJldHVybiBsZ2FtbWFmX3IgKF9fZCwgJl9fbG9jYWxfc2lnbmdhbSk7CisjIGVsc2UKKyAgcmV0dXJuIGxnYW1tYWZfciAoX19kLCAmc2lnbmdhbSk7CisjIGVuZGlmCit9CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgbG9uZyBkb3VibGUgX19OVEggKGxnYW1tYWwgKGxvbmcgZG91YmxlIF9fZCkpCit7CisjIGlmZGVmIF9fVVNFX0lTT0M5OQorICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgcmV0dXJuIGxnYW1tYWxfciAoX19kLCAmX19sb2NhbF9zaWduZ2FtKTsKKyMgZWxzZQorICByZXR1cm4gbGdhbW1hbF9yIChfX2QsICZzaWduZ2FtKTsKKyMgZW5kaWYKK30KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIGdhbW1hLiAgKi8KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgZG91YmxlIF9fTlRIIChnYW1tYSAoZG91YmxlIF9fZCkpCit7CisjIGlmZGVmIF9fVVNFX0lTT0M5OQorICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgcmV0dXJuIGxnYW1tYV9yIChfX2QsICZfX2xvY2FsX3NpZ25nYW0pOworIyBlbHNlCisgIHJldHVybiBsZ2FtbWFfciAoX19kLCAmc2lnbmdhbSk7CisjIGVuZGlmCit9CitfX2V4dGVybl9hbHdheXNfaW5saW5lIGZsb2F0IF9fTlRIIChnYW1tYWYgKGZsb2F0IF9fZCkpCit7CisjIGlmZGVmIF9fVVNFX0lTT0M5OQorICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgcmV0dXJuIGxnYW1tYWZfciAoX19kLCAmX19sb2NhbF9zaWduZ2FtKTsKKyMgZWxzZQorICByZXR1cm4gbGdhbW1hZl9yIChfX2QsICZzaWduZ2FtKTsKKyMgZW5kaWYKK30KKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorX19leHRlcm5fYWx3YXlzX2lubGluZSBsb25nIGRvdWJsZSBfX05USCAoZ2FtbWFsIChsb25nIGRvdWJsZSBfX2QpKQoreworIyAgaWZkZWYgX19VU0VfSVNPQzk5CisgIGludCBfX2xvY2FsX3NpZ25nYW0gPSAwOworICByZXR1cm4gbGdhbW1hbF9yIChfX2QsICZfX2xvY2FsX3NpZ25nYW0pOworIyAgZWxzZQorICByZXR1cm4gbGdhbW1hbF9yIChfX2QsICZzaWduZ2FtKTsKKyMgIGVuZGlmCit9CisjIGVuZGlmCisjZW5kaWYKKworLyogbG9nLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGxvZywgKGRvdWJsZSksIF9fbG9nX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGxvZ2YsIChmbG9hdCksIF9fbG9nZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAobG9nbCwgKGxvbmcgZG91YmxlKSwgX19sb2dsX2Zpbml0ZSk7CisjZW5kaWYKKworLyogbG9nMTAuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAobG9nMTAsIChkb3VibGUpLCBfX2xvZzEwX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGxvZzEwZiwgKGZsb2F0KSwgX19sb2cxMGZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGxvZzEwbCwgKGxvbmcgZG91YmxlKSwgX19sb2cxMGxfZmluaXRlKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CisvKiBsb2cyLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGxvZzIsIChkb3VibGUpLCBfX2xvZzJfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAobG9nMmYsIChmbG9hdCksIF9fbG9nMmZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChsb2cybCwgKGxvbmcgZG91YmxlKSwgX19sb2cybF9maW5pdGUpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIHBvdy4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChwb3csIChkb3VibGUsIGRvdWJsZSksIF9fcG93X2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKHBvd2YsIChmbG9hdCwgZmxvYXQpLCBfX3Bvd2ZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKHBvd2wsIChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpLAorCQkJCSAgIF9fcG93bF9maW5pdGUpOworI2VuZGlmCisKKy8qIHJlbWFpbmRlci4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChyZW1haW5kZXIsIChkb3VibGUsIGRvdWJsZSksIF9fcmVtYWluZGVyX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKHJlbWFpbmRlcmYsIChmbG9hdCwgZmxvYXQpLCBfX3JlbWFpbmRlcmZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKHJlbWFpbmRlcmwsIChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpLAorCQkJCSAgIF9fcmVtYWluZGVybF9maW5pdGUpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogc2NhbGIuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoc2NhbGIsIChkb3VibGUsIGRvdWJsZSksIF9fc2NhbGJfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoc2NhbGJmLCAoZmxvYXQsIGZsb2F0KSwgX19zY2FsYmZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChzY2FsYmwsIChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpLAorCQkJCSAgIF9fc2NhbGJsX2Zpbml0ZSk7CisjIGVuZGlmCisjZW5kaWYKKworLyogc2luaC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChzaW5oLCAoZG91YmxlKSwgX19zaW5oX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKHNpbmhmLCAoZmxvYXQpLCBfX3NpbmhmX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChzaW5obCwgKGxvbmcgZG91YmxlKSwgX19zaW5obF9maW5pdGUpOworI2VuZGlmCisKKy8qIHNxcnQuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoc3FydCwgKGRvdWJsZSksIF9fc3FydF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChzcXJ0ZiwgKGZsb2F0KSwgX19zcXJ0Zl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoc3FydGwsIChsb25nIGRvdWJsZSksIF9fc3FydGxfZmluaXRlKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CisvKiB0Z2FtbWEuICAqLworZXh0ZXJuIGRvdWJsZSBfX2dhbW1hX3JfZmluaXRlIChkb3VibGUsIGludCAqKTsKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgZG91YmxlIF9fTlRIICh0Z2FtbWEgKGRvdWJsZSBfX2QpKQoreworICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgZG91YmxlIF9fcmVzID0gX19nYW1tYV9yX2Zpbml0ZSAoX19kLCAmX19sb2NhbF9zaWduZ2FtKTsKKyAgcmV0dXJuIF9fbG9jYWxfc2lnbmdhbSA8IDAgPyAtX19yZXMgOiBfX3JlczsKK30KK2V4dGVybiBmbG9hdCBfX2dhbW1hZl9yX2Zpbml0ZSAoZmxvYXQsIGludCAqKTsKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgZmxvYXQgX19OVEggKHRnYW1tYWYgKGZsb2F0IF9fZCkpCit7CisgIGludCBfX2xvY2FsX3NpZ25nYW0gPSAwOworICBmbG9hdCBfX3JlcyA9IF9fZ2FtbWFmX3JfZmluaXRlIChfX2QsICZfX2xvY2FsX3NpZ25nYW0pOworICByZXR1cm4gX19sb2NhbF9zaWduZ2FtIDwgMCA/IC1fX3JlcyA6IF9fcmVzOworfQorIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19nYW1tYWxfcl9maW5pdGUgKGxvbmcgZG91YmxlLCBpbnQgKik7CitfX2V4dGVybl9hbHdheXNfaW5saW5lIGxvbmcgZG91YmxlIF9fTlRIICh0Z2FtbWFsIChsb25nIGRvdWJsZSBfX2QpKQoreworICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgbG9uZyBkb3VibGUgX19yZXMgPSBfX2dhbW1hbF9yX2Zpbml0ZSAoX19kLCAmX19sb2NhbF9zaWduZ2FtKTsKKyAgcmV0dXJuIF9fbG9jYWxfc2lnbmdhbSA8IDAgPyAtX19yZXMgOiBfX3JlczsKK30KKyMgZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21hdGhjYWxscy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21hdGhjYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMjJhYmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbWF0aGNhbGxzLmgKQEAgLTAsMCArMSwzNjYgQEAKKy8qIFByb3RvdHlwZSBkZWNsYXJhdGlvbnMgZm9yIG1hdGggZnVuY3Rpb25zOyBoZWxwZXIgZmlsZSBmb3IgPG1hdGguaD4uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMiwgMjAwMywgMjAwNiwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogTk9URTogQmVjYXVzZSBvZiB0aGUgc3BlY2lhbCB3YXkgdGhpcyBmaWxlIGlzIHVzZWQgYnkgPG1hdGguaD4sIHRoaXMKKyAgIGZpbGUgbXVzdCBOT1QgYmUgcHJvdGVjdGVkIGZyb20gbXVsdGlwbGUgaW5jbHVzaW9uIGFzIGhlYWRlciBmaWxlcworICAgdXN1YWxseSBhcmUuCisKKyAgIFRoaXMgZmlsZSBwcm92aWRlcyBwcm90b3R5cGUgZGVjbGFyYXRpb25zIGZvciB0aGUgbWF0aCBmdW5jdGlvbnMuCisgICBNb3N0IGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgdXNpbmcgdGhlIG1hY3JvOgorCisgICBfX01BVEhDQUxMIChOQU1FLFtfcl0sIChBUkdTLi4uKSk7CisKKyAgIFRoaXMgbWVhbnMgdGhlcmUgaXMgYSBmdW5jdGlvbiBgTkFNRScgcmV0dXJuaW5nIGBkb3VibGUnIGFuZCBhIGZ1bmN0aW9uCisgICBgTkFNRWYnIHJldHVybmluZyBgZmxvYXQnLiAgRWFjaCBwbGFjZSBgX01kb3VibGVfJyBhcHBlYXJzIGluIHRoZQorICAgcHJvdG90eXBlLCB0aGF0IGlzIGFjdHVhbGx5IGBkb3VibGUnIGluIHRoZSBwcm90b3R5cGUgZm9yIGBOQU1FJyBhbmQKKyAgIGBmbG9hdCcgaW4gdGhlIHByb3RvdHlwZSBmb3IgYE5BTUVmJy4gIFJlZW50cmFudCB2YXJpYW50IGZ1bmN0aW9ucyBhcmUKKyAgIGNhbGxlZCBgTkFNRV9yJyBhbmQgYE5BTUVmX3InLgorCisgICBGdW5jdGlvbnMgcmV0dXJuaW5nIG90aGVyIHR5cGVzIGxpa2UgYGludCcgYXJlIGRlY2xhcmVkIHVzaW5nIHRoZSBtYWNybzoKKworICAgX19NQVRIREVDTCAoVFlQRSwgTkFNRSxbX3JdLCAoQVJHUy4uLikpOworCisgICBUaGlzIGlzIGp1c3QgbGlrZSBfX01BVEhDQUxMIGJ1dCBmb3IgYSBmdW5jdGlvbiByZXR1cm5pbmcgYFRZUEUnCisgICBpbnN0ZWFkIG9mIGBfTWRvdWJsZV8nLiAgSW4gYWxsIG9mIHRoZXNlIGNhc2VzLCB0aGVyZSBpcyBzdGlsbAorICAgYm90aCBhIGBOQU1FJyBhbmQgYSBgTkFNRWYnIHRoYXQgdGFrZXMgYGZsb2F0JyBhcmd1bWVudHMuCisKKyAgIE5vdGUgdGhhdCB0aGVyZSBtdXN0IGJlIG5vIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBhcmd1bWVudCBwYXNzZWQgZm9yCisgICBOQU1FLCB0byBtYWtlIHRva2VuIHBhc3Rpbmcgd29yayB3aXRoIC10cmFkaXRpb25hbC4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9tYXRoY2FsbHMuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG1hdGguaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBUcmlnb25vbWV0cmljIGZ1bmN0aW9ucy4gICovCisKK19NZG91YmxlX0JFR0lOX05BTUVTUEFDRQorLyogQXJjIGNvc2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGFjb3MsLCAoX01kb3VibGVfIF9feCkpOworLyogQXJjIHNpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChhc2luLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIEFyYyB0YW5nZW50IG9mIFguICAqLworX19NQVRIQ0FMTCAoYXRhbiwsIChfTWRvdWJsZV8gX194KSk7CisvKiBBcmMgdGFuZ2VudCBvZiBZL1guICAqLworX19NQVRIQ0FMTCAoYXRhbjIsLCAoX01kb3VibGVfIF9feSwgX01kb3VibGVfIF9feCkpOworCisvKiBDb3NpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChjb3MsLCAoX01kb3VibGVfIF9feCkpOworLyogU2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKHNpbiwsIChfTWRvdWJsZV8gX194KSk7CisvKiBUYW5nZW50IG9mIFguICAqLworX19NQVRIQ0FMTCAodGFuLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogSHlwZXJib2xpYyBmdW5jdGlvbnMuICAqLworCisvKiBIeXBlcmJvbGljIGNvc2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGNvc2gsLCAoX01kb3VibGVfIF9feCkpOworLyogSHlwZXJib2xpYyBzaW5lIG9mIFguICAqLworX19NQVRIQ0FMTCAoc2luaCwsIChfTWRvdWJsZV8gX194KSk7CisvKiBIeXBlcmJvbGljIHRhbmdlbnQgb2YgWC4gICovCitfX01BVEhDQUxMICh0YW5oLCwgKF9NZG91YmxlXyBfX3gpKTsKK19NZG91YmxlX0VORF9OQU1FU1BBQ0UKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQ29zaW5lIGFuZCBzaW5lIG9mIFguICAqLworX19NQVRIREVDTCAodm9pZCxzaW5jb3MsLAorCSAgICAoX01kb3VibGVfIF9feCwgX01kb3VibGVfICpfX3NpbngsIF9NZG91YmxlXyAqX19jb3N4KSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIEh5cGVyYm9saWMgYXJjIGNvc2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGFjb3NoLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIEh5cGVyYm9saWMgYXJjIHNpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChhc2luaCwsIChfTWRvdWJsZV8gX194KSk7CisvKiBIeXBlcmJvbGljIGFyYyB0YW5nZW50IG9mIFguICAqLworX19NQVRIQ0FMTCAoYXRhbmgsLCAoX01kb3VibGVfIF9feCkpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKy8qIEV4cG9uZW50aWFsIGFuZCBsb2dhcml0aG1pYyBmdW5jdGlvbnMuICAqLworCitfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UKKy8qIEV4cG9uZW50aWFsIGZ1bmN0aW9uIG9mIFguICAqLworX19NQVRIQ0FMTCAoZXhwLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogQnJlYWsgVkFMVUUgaW50byBhIG5vcm1hbGl6ZWQgZnJhY3Rpb24gYW5kIGFuIGludGVncmFsIHBvd2VyIG9mIDIuICAqLworX19NQVRIQ0FMTCAoZnJleHAsLCAoX01kb3VibGVfIF9feCwgaW50ICpfX2V4cG9uZW50KSk7CisKKy8qIFggdGltZXMgKHR3byB0byB0aGUgRVhQIHBvd2VyKS4gICovCitfX01BVEhDQUxMIChsZGV4cCwsIChfTWRvdWJsZV8gX194LCBpbnQgX19leHBvbmVudCkpOworCisvKiBOYXR1cmFsIGxvZ2FyaXRobSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGxvZywsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIEJhc2UtdGVuIGxvZ2FyaXRobSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGxvZzEwLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogQnJlYWsgVkFMVUUgaW50byBpbnRlZ3JhbCBhbmQgZnJhY3Rpb25hbCBwYXJ0cy4gICovCitfX01BVEhDQUxMIChtb2RmLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyAqX19pcHRyKSkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fbm9ubnVsbF9fICgyKSkpOworX01kb3VibGVfRU5EX05BTUVTUEFDRQorCisjaWZkZWYgX19VU0VfR05VCisvKiBBIGZ1bmN0aW9uIG1pc3NpbmcgaW4gYWxsIHN0YW5kYXJkczogY29tcHV0ZSBleHBvbmVudCB0byBiYXNlIHRlbi4gICovCitfX01BVEhDQUxMIChleHAxMCwsIChfTWRvdWJsZV8gX194KSk7CisvKiBBbm90aGVyIG5hbWUgb2NjYXNpb25hbGx5IHVzZWQuICAqLworX19NQVRIQ0FMTCAocG93MTAsLCAoX01kb3VibGVfIF9feCkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZXR1cm4gZXhwKFgpIC0gMS4gICovCitfX01BVEhDQUxMIChleHBtMSwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIFJldHVybiBsb2coMSArIFgpLiAgKi8KK19fTUFUSENBTEwgKGxvZzFwLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogUmV0dXJuIHRoZSBiYXNlIDIgc2lnbmVkIGludGVncmFsIGV4cG9uZW50IG9mIFguICAqLworX19NQVRIQ0FMTCAobG9nYiwsIChfTWRvdWJsZV8gX194KSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBDb21wdXRlIGJhc2UtMiBleHBvbmVudGlhbCBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGV4cDIsLCAoX01kb3VibGVfIF9feCkpOworCisvKiBDb21wdXRlIGJhc2UtMiBsb2dhcml0aG0gb2YgWC4gICovCitfX01BVEhDQUxMIChsb2cyLCwgKF9NZG91YmxlXyBfX3gpKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisKKy8qIFBvd2VyIGZ1bmN0aW9ucy4gICovCisKK19NZG91YmxlX0JFR0lOX05BTUVTUEFDRQorLyogUmV0dXJuIFggdG8gdGhlIFkgcG93ZXIuICAqLworX19NQVRIQ0FMTCAocG93LCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKKworLyogUmV0dXJuIHRoZSBzcXVhcmUgcm9vdCBvZiBYLiAgKi8KK19fTUFUSENBTEwgKHNxcnQsLCAoX01kb3VibGVfIF9feCkpOworX01kb3VibGVfRU5EX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogUmV0dXJuIGBzcXJ0KFgqWCArIFkqWSknLiAgKi8KK19fTUFUSENBTEwgKGh5cG90LCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogUmV0dXJuIHRoZSBjdWJlIHJvb3Qgb2YgWC4gICovCitfX01BVEhDQUxMIChjYnJ0LCwgKF9NZG91YmxlXyBfX3gpKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisKKy8qIE5lYXJlc3QgaW50ZWdlciwgYWJzb2x1dGUgdmFsdWUsIGFuZCByZW1haW5kZXIgZnVuY3Rpb25zLiAgKi8KKworX01kb3VibGVfQkVHSU5fTkFNRVNQQUNFCisvKiBTbWFsbGVzdCBpbnRlZ3JhbCB2YWx1ZSBub3QgbGVzcyB0aGFuIFguICAqLworX19NQVRIQ0FMTFggKGNlaWwsLCAoX01kb3VibGVfIF9feCksIChfX2NvbnN0X18pKTsKKworLyogQWJzb2x1dGUgdmFsdWUgb2YgWC4gICovCitfX01BVEhDQUxMWCAoZmFicywsIChfTWRvdWJsZV8gX194KSwgKF9fY29uc3RfXykpOworCisvKiBMYXJnZXN0IGludGVnZXIgbm90IGdyZWF0ZXIgdGhhbiBYLiAgKi8KK19fTUFUSENBTExYIChmbG9vciwsIChfTWRvdWJsZV8gX194KSwgKF9fY29uc3RfXykpOworCisvKiBGbG9hdGluZy1wb2ludCBtb2R1bG8gcmVtYWluZGVyIG9mIFgvWS4gICovCitfX01BVEhDQUxMIChmbW9kLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKKworCisvKiBSZXR1cm4gMCBpZiBWQUxVRSBpcyBmaW5pdGUgb3IgTmFOLCArMSBpZiBpdAorICAgaXMgK0luZmluaXR5LCAtMSBpZiBpdCBpcyAtSW5maW5pdHkuICAqLworX19NQVRIREVDTF8xIChpbnQsX19pc2luZiwsIChfTWRvdWJsZV8gX192YWx1ZSkpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworLyogUmV0dXJuIG5vbnplcm8gaWYgVkFMVUUgaXMgZmluaXRlIGFuZCBub3QgTmFOLiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LF9fZmluaXRlLCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworX01kb3VibGVfRU5EX05BTUVTUEFDRQorCisjaWZkZWYgX19VU0VfTUlTQworLyogUmV0dXJuIDAgaWYgVkFMVUUgaXMgZmluaXRlIG9yIE5hTiwgKzEgaWYgaXQKKyAgIGlzICtJbmZpbml0eSwgLTEgaWYgaXQgaXMgLUluZmluaXR5LiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LGlzaW5mLCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisvKiBSZXR1cm4gbm9uemVybyBpZiBWQUxVRSBpcyBmaW5pdGUgYW5kIG5vdCBOYU4uICAqLworX19NQVRIREVDTF8xIChpbnQsZmluaXRlLCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisvKiBSZXR1cm4gdGhlIHJlbWFpbmRlciBvZiBYL1kuICAqLworX19NQVRIQ0FMTCAoZHJlbSwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSk7CisKKworLyogUmV0dXJuIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgWCBhZnRlciBkaXZpZGluZyBvdXQgYGlsb2diIChYKScuICAqLworX19NQVRIQ0FMTCAoc2lnbmlmaWNhbmQsLCAoX01kb3VibGVfIF9feCkpOworI2VuZGlmIC8qIFVzZSBtaXNjLiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZXR1cm4gWCB3aXRoIGl0cyBzaWduZWQgY2hhbmdlZCB0byBZJ3MuICAqLworX19NQVRIQ0FMTFggKGNvcHlzaWduLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpLCAoX19jb25zdF9fKSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZXR1cm4gcmVwcmVzZW50YXRpb24gb2YgTmFOIGZvciBkb3VibGUgdHlwZS4gICovCitfX01BVEhDQUxMWCAobmFuLCwgKF9fY29uc3QgY2hhciAqX190YWdiKSwgKF9fY29uc3RfXykpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKworLyogUmV0dXJuIG5vbnplcm8gaWYgVkFMVUUgaXMgbm90IGEgbnVtYmVyLiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LF9faXNuYW4sLCAoX01kb3VibGVfIF9fdmFsdWUpKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorLyogUmV0dXJuIG5vbnplcm8gaWYgVkFMVUUgaXMgbm90IGEgbnVtYmVyLiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LGlzbmFuLCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisvKiBCZXNzZWwgZnVuY3Rpb25zLiAgKi8KK19fTUFUSENBTEwgKGowLCwgKF9NZG91YmxlXykpOworX19NQVRIQ0FMTCAoajEsLCAoX01kb3VibGVfKSk7CitfX01BVEhDQUxMIChqbiwsIChpbnQsIF9NZG91YmxlXykpOworX19NQVRIQ0FMTCAoeTAsLCAoX01kb3VibGVfKSk7CitfX01BVEhDQUxMICh5MSwsIChfTWRvdWJsZV8pKTsKK19fTUFUSENBTEwgKHluLCwgKGludCwgX01kb3VibGVfKSk7CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogRXJyb3IgYW5kIGdhbW1hIGZ1bmN0aW9ucy4gICovCitfX01BVEhDQUxMIChlcmYsLCAoX01kb3VibGVfKSk7CitfX01BVEhDQUxMIChlcmZjLCwgKF9NZG91YmxlXykpOworX19NQVRIQ0FMTCAobGdhbW1hLCwgKF9NZG91YmxlXykpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogVHJ1ZSBnYW1tYSBmdW5jdGlvbi4gICovCitfX01BVEhDQUxMICh0Z2FtbWEsLCAoX01kb3VibGVfKSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBPYnNvbGV0ZSBhbGlhcyBmb3IgYGxnYW1tYScuICAqLworX19NQVRIQ0FMTCAoZ2FtbWEsLCAoX01kb3VibGVfKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9uIG9mIGxnYW1tYS4gIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZ2xvYmFsIHZhcmlhYmxlCisgICBgc2lnbmdhbScuICBUaGUgcmVlbnRyYW50IHZlcnNpb24gaW5zdGVhZCB0YWtlcyBhIHBvaW50ZXIgYW5kIHN0b3JlcworICAgdGhlIHZhbHVlIHRocm91Z2ggaXQuICAqLworX19NQVRIQ0FMTCAobGdhbW1hLF9yLCAoX01kb3VibGVfLCBpbnQgKl9fc2lnbmdhbXApKTsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZXR1cm4gdGhlIGludGVnZXIgbmVhcmVzdCBYIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlCisgICBwcmV2YWlsaW5nIHJvdW5kaW5nIG1vZGUuICAqLworX19NQVRIQ0FMTCAocmludCwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIFJldHVybiBYICsgZXBzaWxvbiBpZiBYIDwgWSwgWCAtIGVwc2lsb24gaWYgWCA+IFkuICAqLworX19NQVRIQ0FMTFggKG5leHRhZnRlciwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSwgKF9fY29uc3RfXykpOworIyBpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSAmJiAhZGVmaW5lZCBfX0xEQkxfQ09NUEFUCitfX01BVEhDQUxMWCAobmV4dHRvd2FyZCwsIChfTWRvdWJsZV8gX194LCBsb25nIGRvdWJsZSBfX3kpLCAoX19jb25zdF9fKSk7CisjIGVuZGlmCisKKy8qIFJldHVybiB0aGUgcmVtYWluZGVyIG9mIGludGVnZXIgZGl2aXNvbiBYIC8gWSB3aXRoIGluZmluaXRlIHByZWNpc2lvbi4gICovCitfX01BVEhDQUxMIChyZW1haW5kZXIsLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworCisjIGlmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorLyogUmV0dXJuIFggdGltZXMgKDIgdG8gdGhlIE50aCBwb3dlcikuICAqLworX19NQVRIQ0FMTCAoc2NhbGJuLCwgKF9NZG91YmxlXyBfX3gsIGludCBfX24pKTsKKyMgZW5kaWYKKworLyogUmV0dXJuIHRoZSBiaW5hcnkgZXhwb25lbnQgb2YgWCwgd2hpY2ggbXVzdCBiZSBub256ZXJvLiAgKi8KK19fTUFUSERFQ0wgKGludCxpbG9nYiwsIChfTWRvdWJsZV8gX194KSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorLyogUmV0dXJuIFggdGltZXMgKDIgdG8gdGhlIE50aCBwb3dlcikuICAqLworX19NQVRIQ0FMTCAoc2NhbGJsbiwsIChfTWRvdWJsZV8gX194LCBsb25nIGludCBfX24pKTsKKworLyogUm91bmQgWCB0byBpbnRlZ3JhbCB2YWx1ZSBpbiBmbG9hdGluZy1wb2ludCBmb3JtYXQgdXNpbmcgY3VycmVudAorICAgcm91bmRpbmcgZGlyZWN0aW9uLCBidXQgZG8gbm90IHJhaXNlIGluZXhhY3QgZXhjZXB0aW9uLiAgKi8KK19fTUFUSENBTEwgKG5lYXJieWludCwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIFJvdW5kIFggdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZSwgcm91bmRpbmcgaGFsZndheSBjYXNlcyBhd2F5IGZyb20KKyAgIHplcm8uICAqLworX19NQVRIQ0FMTFggKHJvdW5kLCwgKF9NZG91YmxlXyBfX3gpLCAoX19jb25zdF9fKSk7CisKKy8qIFJvdW5kIFggdG8gdGhlIGludGVncmFsIHZhbHVlIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCBuZWFyZXN0IGJ1dAorICAgbm90IGxhcmdlciBpbiBtYWduaXR1ZGUuICAqLworX19NQVRIQ0FMTFggKHRydW5jLCwgKF9NZG91YmxlXyBfX3gpLCAoX19jb25zdF9fKSk7CisKKy8qIENvbXB1dGUgcmVtYWluZGVyIG9mIFggYW5kIFkgYW5kIHB1dCBpbiAqUVVPIGEgdmFsdWUgd2l0aCBzaWduIG9mIHgveQorICAgYW5kIG1hZ25pdHVkZSBjb25ncnVlbnQgYG1vZCAyXm4nIHRvIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGludGVncmFsCisgICBxdW90aWVudCB4L3ksIHdpdGggbiA+PSAzLiAgKi8KK19fTUFUSENBTEwgKHJlbXF1bywsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195LCBpbnQgKl9fcXVvKSk7CisKKworLyogQ29udmVyc2lvbiBmdW5jdGlvbnMuICAqLworCisvKiBSb3VuZCBYIHRvIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUgYWNjb3JkaW5nIHRvIGN1cnJlbnQgcm91bmRpbmcKKyAgIGRpcmVjdGlvbi4gICovCitfX01BVEhERUNMIChsb25nIGludCxscmludCwsIChfTWRvdWJsZV8gX194KSk7CitfX01BVEhERUNMIChsb25nIGxvbmcgaW50LGxscmludCwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIFJvdW5kIFggdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZSwgcm91bmRpbmcgaGFsZndheSBjYXNlcyBhd2F5IGZyb20KKyAgIHplcm8uICAqLworX19NQVRIREVDTCAobG9uZyBpbnQsbHJvdW5kLCwgKF9NZG91YmxlXyBfX3gpKTsKK19fTUFUSERFQ0wgKGxvbmcgbG9uZyBpbnQsbGxyb3VuZCwsIChfTWRvdWJsZV8gX194KSk7CisKKworLyogUmV0dXJuIHBvc2l0aXZlIGRpZmZlcmVuY2UgYmV0d2VlbiBYIGFuZCBZLiAgKi8KK19fTUFUSENBTEwgKGZkaW0sLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworCisvKiBSZXR1cm4gbWF4aW11bSBudW1lcmljIHZhbHVlIGZyb20gWCBhbmQgWS4gICovCitfX01BVEhDQUxMIChmbWF4LCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKKworLyogUmV0dXJuIG1pbmltdW0gbnVtZXJpYyB2YWx1ZSBmcm9tIFggYW5kIFkuICAqLworX19NQVRIQ0FMTCAoZm1pbiwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSk7CisKKworLyogQ2xhc3NpZnkgZ2l2ZW4gbnVtYmVyLiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LCBfX2ZwY2xhc3NpZnksLCAoX01kb3VibGVfIF9fdmFsdWUpKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIFRlc3QgZm9yIG5lZ2F0aXZlIG51bWJlci4gICovCitfX01BVEhERUNMXzEgKGludCwgX19zaWduYml0LCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisKKy8qIE11bHRpcGx5LWFkZCBmdW5jdGlvbiBjb21wdXRlZCBhcyBhIHRlcm5hcnkgb3BlcmF0aW9uLiAgKi8KK19fTUFUSENBTEwgKGZtYSwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195LCBfTWRvdWJsZV8gX196KSk7CisjZW5kaWYgLyogVXNlIElTTyBDOTkuICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFJldHVybiBYIHRpbWVzICgyIHRvIHRoZSBOdGggcG93ZXIpLiAgKi8KK19fTUFUSENBTEwgKHNjYWxiLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX24pKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21hdGhkZWYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tYXRoZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5ZWI5NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tYXRoZGVmLmgKQEAgLTAsMCArMSw2MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDA0LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX01BVEhfSCAmJiAhZGVmaW5lZCBfQ09NUExFWF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbWF0aGRlZi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSAmJiBkZWZpbmVkIF9NQVRIX0ggJiYgIWRlZmluZWQgX01BVEhfSF9NQVRIREVGCisjIGRlZmluZSBfTUFUSF9IX01BVEhERUYJMQorCisjIGlmIGRlZmluZWQgX19GTFRfRVZBTF9NRVRIT0RfXyAmJiBfX0ZMVF9FVkFMX01FVEhPRF9fID09IDAKKy8qIFdoZW4gdXNpbmcgLW1mcG1hdGg9c3NlLCB2YWx1ZXMgYXJlIGNvbXB1dGVkIHdpdGggdGhlIHByZWNpc3Npb24gb2YgdGhlCisgICB1c2VkIHR5cGUuICAqLwordHlwZWRlZiBmbG9hdCBmbG9hdF90OwkJLyogYGZsb2F0JyBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGFzIGBmbG9hdCcuICAqLwordHlwZWRlZiBkb3VibGUgZG91YmxlX3Q7CS8qIGBkb3VibGUnIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgYXMKKwkJCQkgICBgZG91YmxlJy4gICovCisjIGVsc2UKKy8qIFRoZSBpeDg3IEZQVXMgZXZhbHVhdGUgYWxsIHZhbHVlcyBpbiB0aGUgODAgYml0IGZsb2F0aW5nLXBvaW50IGZvcm1hdAorICAgd2hpY2ggaXMgYWxzbyBhdmFpbGFibGUgZm9yIHRoZSB1c2VyIGFzIGBsb25nIGRvdWJsZScuICBUaGVyZWZvcmUgd2UKKyAgIGRlZmluZTogICovCit0eXBlZGVmIGxvbmcgZG91YmxlIGZsb2F0X3Q7CS8qIGBmbG9hdCcgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBhcworCQkJCSAgIGBsb25nIGRvdWJsZScuICAqLwordHlwZWRlZiBsb25nIGRvdWJsZSBkb3VibGVfdDsJLyogYGRvdWJsZScgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBhcworCQkJCSAgIGBsb25nIGRvdWJsZScuICAqLworIyBlbmRpZgorCisvKiBUaGUgdmFsdWVzIHJldHVybmVkIGJ5IGBpbG9nYicgZm9yIDAgYW5kIE5hTiByZXNwZWN0aXZlbHkuICAqLworIyBkZWZpbmUgRlBfSUxPR0IwCSgtMjE0NzQ4MzY0NyAtIDEpCisjIGRlZmluZSBGUF9JTE9HQk5BTgkoLTIxNDc0ODM2NDcgLSAxKQorCisvKiBUaGUgR0NDIDQuNiBjb21waWxlciB3aWxsIGRlZmluZSBfX0ZQX0ZBU1RfRk1BeyxGLEx9IGlmIHRoZSBmbWF7LGYsbH0KKyAgIGJ1aWx0aW5zIGFyZSBzdXBwb3J0ZWQuICAqLworIyBpZiBfX0ZQX0ZBU1RfRk1BCisjICBkZWZpbmUgRlBfRkFTVF9GTUEgMQorIyBlbmRpZgorCisjIGlmIF9fRlBfRkFTVF9GTUFGCisjICBkZWZpbmUgRlBfRkFTVF9GTUFGIDEKKyMgZW5kaWYKKworIyBpZiBfX0ZQX0ZBU1RfRk1BTAorIyAgZGVmaW5lIEZQX0ZBU1RfRk1BTCAxCisjIGVuZGlmCisKKyNlbmRpZgkvKiBJU08gQzk5ICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbWF0aGlubGluZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21hdGhpbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjZlYzJiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21hdGhpbmxpbmUuaApAQCAtMCwwICsxLDc3MSBAQAorLyogSW5saW5lIG1hdGggZnVuY3Rpb25zIGZvciBpMzg3LgorICAgQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxLDIwMDMsMjAwNCwyMDA2LDIwMDcsMjAwOSwKKyAgIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IEpvaG4gQy4gQm93bWFuIDxib3dtYW5AbWF0aC51YWxiZXJ0YS5jYT4sIDE5OTUuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NQVRIX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9tYXRoaW5saW5lLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19leHRlcm5faW5saW5lCisjIGRlZmluZSBfX01BVEhfSU5MSU5FIF9faW5saW5lCisjZWxzZQorIyBkZWZpbmUgX19NQVRIX0lOTElORSBfX2V4dGVybl9pbmxpbmUKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSAmJiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKy8qIEdDQyAyLjk3IGFuZCB1cCBoYXZlIGJ1aWx0aW5zIHRoYXQgYWN0dWFsbHkgY2FuIGJlIHVzZWQuICAqLworIyBpZiAhX19HTlVDX1BSRVJFUSAoMiw5NykKKy8qIElTTyBDOTkgZGVmaW5lcyBzb21lIG1hY3JvcyB0byBwZXJmb3JtIHVub3JkZXJlZCBjb21wYXJpc29ucy4gIFRoZQorICAgaXg4NyBGUFUgc3VwcG9ydHMgdGhpcyB3aXRoIHNwZWNpYWwgb3Bjb2RlcyBhbmQgd2Ugc2hvdWxkIHVzZSB0aGVtLgorICAgVGhlc2UgbXVzdCBub3QgYmUgaW5saW5lIGZ1bmN0aW9ucyBzaW5jZSB3ZSBoYXZlIHRvIGJlIGFibGUgdG8gaGFuZGxlCisgICBhbGwgZmxvYXRpbmctcG9pbnQgdHlwZXMuICAqLworIyAgdW5kZWYgaXNncmVhdGVyCisjICB1bmRlZiBpc2dyZWF0ZXJlcXVhbAorIyAgdW5kZWYgaXNsZXNzCisjICB1bmRlZiBpc2xlc3NlcXVhbAorIyAgdW5kZWYgaXNsZXNzZ3JlYXRlcgorIyAgdW5kZWYgaXN1bm9yZGVyZWQKKyMgIGlmZGVmIF9faTY4Nl9fCisvKiBGb3IgdGhlIFBlbnRpdW1Qcm8gYW5kIG1vcmUgcmVjZW50IHByb2Nlc3NvcnMgd2UgY2FuIHByb3ZpZGUKKyAgIGJldHRlciBjb2RlLiAgKi8KKyMgICBkZWZpbmUgaXNncmVhdGVyKHgsIHkpIFwKKyAgICAgKHsgcmVnaXN0ZXIgY2hhciBfX3Jlc3VsdDsJCQkJCQkgICAgICBcCisJX19hc21fXyAoImZ1Y29taXAgJSVzdCgxKSwgJSVzdDsgc2V0YSAlJWFsIgkJCSAgICAgIFwKKwkJIDogIj1hIiAoX19yZXN1bHQpIDogInUiICh5KSwgInQiICh4KSA6ICJjYyIsICJzdCIpOwkgICAgICBcCisJX19yZXN1bHQ7IH0pCisjICAgZGVmaW5lIGlzZ3JlYXRlcmVxdWFsKHgsIHkpIFwKKyAgICAgKHsgcmVnaXN0ZXIgY2hhciBfX3Jlc3VsdDsJCQkJCQkgICAgICBcCisJX19hc21fXyAoImZ1Y29taXAgJSVzdCgxKSwgJSVzdDsgc2V0YWUgJSVhbCIJCQkgICAgICBcCisJCSA6ICI9YSIgKF9fcmVzdWx0KSA6ICJ1IiAoeSksICJ0IiAoeCkgOiAiY2MiLCAic3QiKTsJICAgICAgXAorCV9fcmVzdWx0OyB9KQorCisjICAgZGVmaW5lIGlzbGVzcyh4LCB5KSBcCisgICAgICh7IHJlZ2lzdGVyIGNoYXIgX19yZXN1bHQ7CQkJCQkJICAgICAgXAorCV9fYXNtX18gKCJmdWNvbWlwICUlc3QoMSksICUlc3Q7IHNldGEgJSVhbCIJCQkgICAgICBcCisJCSA6ICI9YSIgKF9fcmVzdWx0KSA6ICJ1IiAoeCksICJ0IiAoeSkgOiAiY2MiLCAic3QiKTsJICAgICAgXAorCV9fcmVzdWx0OyB9KQorCisjICAgZGVmaW5lIGlzbGVzc2VxdWFsKHgsIHkpIFwKKyAgICAgKHsgcmVnaXN0ZXIgY2hhciBfX3Jlc3VsdDsJCQkJCQkgICAgICBcCisJX19hc21fXyAoImZ1Y29taXAgJSVzdCgxKSwgJSVzdDsgc2V0YWUgJSVhbCIJCQkgICAgICBcCisJCSA6ICI9YSIgKF9fcmVzdWx0KSA6ICJ1IiAoeCksICJ0IiAoeSkgOiAiY2MiLCAic3QiKTsJICAgICAgXAorCV9fcmVzdWx0OyB9KQorCisjICAgZGVmaW5lIGlzbGVzc2dyZWF0ZXIoeCwgeSkgXAorICAgICAoeyByZWdpc3RlciBjaGFyIF9fcmVzdWx0OwkJCQkJCSAgICAgIFwKKwlfX2FzbV9fICgiZnVjb21pcCAlJXN0KDEpLCAlJXN0OyBzZXRuZSAlJWFsIgkJCSAgICAgIFwKKwkJIDogIj1hIiAoX19yZXN1bHQpIDogInUiICh5KSwgInQiICh4KSA6ICJjYyIsICJzdCIpOwkgICAgICBcCisJX19yZXN1bHQ7IH0pCisKKyMgICBkZWZpbmUgaXN1bm9yZGVyZWQoeCwgeSkgXAorICAgICAoeyByZWdpc3RlciBjaGFyIF9fcmVzdWx0OwkJCQkJCSAgICAgIFwKKwlfX2FzbV9fICgiZnVjb21pcCAlJXN0KDEpLCAlJXN0OyBzZXRwICUlYWwiCQkJICAgICAgXAorCQkgOiAiPWEiIChfX3Jlc3VsdCkgOiAidSIgKHkpLCAidCIgKHgpIDogImNjIiwgInN0Iik7CSAgICAgIFwKKwlfX3Jlc3VsdDsgfSkKKyMgIGVsc2UKKy8qIFRoaXMgaXMgdGhlIGR1bWIsIHBvcnRhYmxlIGNvZGUgZm9yIGkzODYgYW5kIGFib3ZlLiAgKi8KKyMgICBkZWZpbmUgaXNncmVhdGVyKHgsIHkpIFwKKyAgICAgKHsgcmVnaXN0ZXIgY2hhciBfX3Jlc3VsdDsJCQkJCQkgICAgICBcCisJX19hc21fXyAoImZ1Y29tcHA7IGZuc3RzdzsgdGVzdGIgJDB4NDUsICUlYWg7IHNldHogJSVhbCIJICAgICAgXAorCQkgOiAiPWEiIChfX3Jlc3VsdCkgOiAidSIgKHkpLCAidCIgKHgpIDogImNjIiwgInN0IiwgInN0KDEpIik7IFwKKwlfX3Jlc3VsdDsgfSkKKworIyAgIGRlZmluZSBpc2dyZWF0ZXJlcXVhbCh4LCB5KSBcCisgICAgICh7IHJlZ2lzdGVyIGNoYXIgX19yZXN1bHQ7CQkJCQkJICAgICAgXAorCV9fYXNtX18gKCJmdWNvbXBwOyBmbnN0c3c7IHRlc3RiICQweDA1LCAlJWFoOyBzZXR6ICUlYWwiCSAgICAgIFwKKwkJIDogIj1hIiAoX19yZXN1bHQpIDogInUiICh5KSwgInQiICh4KSA6ICJjYyIsICJzdCIsICJzdCgxKSIpOyBcCisJX19yZXN1bHQ7IH0pCisKKyMgICBkZWZpbmUgaXNsZXNzKHgsIHkpIFwKKyAgICAgKHsgcmVnaXN0ZXIgY2hhciBfX3Jlc3VsdDsJCQkJCQkgICAgICBcCisJX19hc21fXyAoImZ1Y29tcHA7IGZuc3RzdzsgdGVzdGIgJDB4NDUsICUlYWg7IHNldHogJSVhbCIJICAgICAgXAorCQkgOiAiPWEiIChfX3Jlc3VsdCkgOiAidSIgKHgpLCAidCIgKHkpIDogImNjIiwgInN0IiwgInN0KDEpIik7IFwKKwlfX3Jlc3VsdDsgfSkKKworIyAgIGRlZmluZSBpc2xlc3NlcXVhbCh4LCB5KSBcCisgICAgICh7IHJlZ2lzdGVyIGNoYXIgX19yZXN1bHQ7CQkJCQkJICAgICAgXAorCV9fYXNtX18gKCJmdWNvbXBwOyBmbnN0c3c7IHRlc3RiICQweDA1LCAlJWFoOyBzZXR6ICUlYWwiCSAgICAgIFwKKwkJIDogIj1hIiAoX19yZXN1bHQpIDogInUiICh4KSwgInQiICh5KSA6ICJjYyIsICJzdCIsICJzdCgxKSIpOyBcCisJX19yZXN1bHQ7IH0pCisKKyMgICBkZWZpbmUgaXNsZXNzZ3JlYXRlcih4LCB5KSBcCisgICAgICh7IHJlZ2lzdGVyIGNoYXIgX19yZXN1bHQ7CQkJCQkJICAgICAgXAorCV9fYXNtX18gKCJmdWNvbXBwOyBmbnN0c3c7IHRlc3RiICQweDQ0LCAlJWFoOyBzZXR6ICUlYWwiCSAgICAgIFwKKwkJIDogIj1hIiAoX19yZXN1bHQpIDogInUiICh5KSwgInQiICh4KSA6ICJjYyIsICJzdCIsICJzdCgxKSIpOyBcCisJX19yZXN1bHQ7IH0pCisKKyMgICBkZWZpbmUgaXN1bm9yZGVyZWQoeCwgeSkgXAorICAgICAoeyByZWdpc3RlciBjaGFyIF9fcmVzdWx0OwkJCQkJCSAgICAgIFwKKwlfX2FzbV9fICgiZnVjb21wcDsgZm5zdHN3OyBzYWhmOyBzZXRwICUlYWwiCQkJICAgICAgXAorCQkgOiAiPWEiIChfX3Jlc3VsdCkgOiAidSIgKHkpLCAidCIgKHgpIDogImNjIiwgInN0IiwgInN0KDEpIik7IFwKKwlfX3Jlc3VsdDsgfSkKKyMgIGVuZGlmIC8qIF9faTY4Nl9fICovCisjIGVuZGlmCS8qIEdDQyAyLjk3ICovCisKKy8qIFRoZSBnY2MsIHZlcnNpb24gMi43IG9yIGJlbG93LCBoYXMgcHJvYmxlbXMgd2l0aCBhbGwgdGhpcyBpbmxpbmluZworICAgY29kZS4gIFNvIGRpc2FibGUgaXQgZm9yIHRoaXMgdmVyc2lvbiBvZiB0aGUgY29tcGlsZXIuICAqLworIyBpZiBfX0dOVUNfUFJFUkVRICgyLCA4KQorLyogVGVzdCBmb3IgbmVnYXRpdmUgbnVtYmVyLiAgVXNlZCBpbiB0aGUgc2lnbmJpdCgpIG1hY3JvLiAgKi8KK19fTUFUSF9JTkxJTkUgaW50CitfX05USCAoX19zaWduYml0ZiAoZmxvYXQgX194KSkKK3sKKyAgX19leHRlbnNpb25fXyB1bmlvbiB7IGZsb2F0IF9fZjsgaW50IF9faTsgfSBfX3UgPSB7IF9fZjogX194IH07CisgIHJldHVybiBfX3UuX19pIDwgMDsKK30KK19fTUFUSF9JTkxJTkUgaW50CitfX05USCAoX19zaWduYml0IChkb3VibGUgX194KSkKK3sKKyAgX19leHRlbnNpb25fXyB1bmlvbiB7IGRvdWJsZSBfX2Q7IGludCBfX2lbMl07IH0gX191ID0geyBfX2Q6IF9feCB9OworICByZXR1cm4gX191Ll9faVsxXSA8IDA7Cit9CitfX01BVEhfSU5MSU5FIGludAorX19OVEggKF9fc2lnbmJpdGwgKGxvbmcgZG91YmxlIF9feCkpCit7CisgIF9fZXh0ZW5zaW9uX18gdW5pb24geyBsb25nIGRvdWJsZSBfX2w7IGludCBfX2lbM107IH0gX191ID0geyBfX2w6IF9feCB9OworICByZXR1cm4gKF9fdS5fX2lbMl0gJiAweDgwMDApICE9IDA7Cit9CisjIGVuZGlmCisjZW5kaWYKKworCisvKiBUaGUgZ2NjLCB2ZXJzaW9uIDIuNyBvciBiZWxvdywgaGFzIHByb2JsZW1zIHdpdGggYWxsIHRoaXMgaW5saW5pbmcKKyAgIGNvZGUuICBTbyBkaXNhYmxlIGl0IGZvciB0aGlzIHZlcnNpb24gb2YgdGhlIGNvbXBpbGVyLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgyLCA4KQorCisjaWYgKCghZGVmaW5lZCBfX05PX01BVEhfSU5MSU5FUyB8fCBkZWZpbmVkIF9fTElCQ19JTlRFUk5BTF9NQVRIX0lOTElORVMpIFwKKyAgICAgJiYgZGVmaW5lZCBfX09QVElNSVpFX18pCisKKy8qIFRoZSBpbmxpbmUgZnVuY3Rpb25zIGRvIG5vdCBzZXQgZXJybm8gb3IgcmFpc2UgbmVjZXNzYXJpbHkgdGhlCisgICBjb3JyZWN0IGV4Y2VwdGlvbnMuICAqLworIyB1bmRlZiBtYXRoX2VycmhhbmRsaW5nCisKKy8qIEEgbWFjcm8gdG8gZGVmaW5lIGZsb2F0LCBkb3VibGUsIGFuZCBsb25nIGRvdWJsZSB2ZXJzaW9ucyBvZiB2YXJpb3VzCisgICBtYXRoIGZ1bmN0aW9ucyBmb3IgdGhlIGl4ODcgRlBVLiAgRlVOQyBpcyB0aGUgZnVuY3Rpb24gbmFtZSAod2hpY2ggd2lsbAorICAgYmUgc3VmZml4ZWQgd2l0aCBmIGFuZCBsIGZvciB0aGUgZmxvYXQgYW5kIGxvbmcgZG91YmxlIHZlcnNpb24sCisgICByZXNwZWN0aXZlbHkpLiAgT1AgaXMgdGhlIG5hbWUgb2YgdGhlIEZQVSBvcGVyYXRpb24uCisgICBXZSBkZWZpbmUgdHdvIHNldHMgb2YgbWFjcm9zLiAgVGhlIHNldCB3aXRoIHRoZSBhZGRpdGlvbmFsIE5QCisgICBkb2Vzbid0IGFkZCBhIHByb3RvdHlwZSBkZWNsYXJhdGlvbi4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKKyMgZGVmaW5lIF9faW5saW5lX21hdGhvcChmdW5jLCBvcCkgXAorICBfX2lubGluZV9tYXRob3BfIChkb3VibGUsIGZ1bmMsIG9wKQkJCQkJICAgICAgXAorICBfX2lubGluZV9tYXRob3BfIChmbG9hdCwgX19DT05DQVQoZnVuYyxmKSwgb3ApCQkJICAgICAgXAorICBfX2lubGluZV9tYXRob3BfIChsb25nIGRvdWJsZSwgX19DT05DQVQoZnVuYyxsKSwgb3ApCisjIGRlZmluZSBfX2lubGluZV9tYXRob3BOUChmdW5jLCBvcCkgXAorICBfX2lubGluZV9tYXRob3BOUF8gKGRvdWJsZSwgZnVuYywgb3ApCQkJCQkgICAgICBcCisgIF9faW5saW5lX21hdGhvcE5QXyAoZmxvYXQsIF9fQ09OQ0FUKGZ1bmMsZiksIG9wKQkJCSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aG9wTlBfIChsb25nIGRvdWJsZSwgX19DT05DQVQoZnVuYyxsKSwgb3ApCisjZWxzZQorIyBkZWZpbmUgX19pbmxpbmVfbWF0aG9wKGZ1bmMsIG9wKSBcCisgIF9faW5saW5lX21hdGhvcF8gKGRvdWJsZSwgZnVuYywgb3ApCisjIGRlZmluZSBfX2lubGluZV9tYXRob3BOUChmdW5jLCBvcCkgXAorICBfX2lubGluZV9tYXRob3BOUF8gKGRvdWJsZSwgZnVuYywgb3ApCisjZW5kaWYKKworI2RlZmluZSBfX2lubGluZV9tYXRob3BfKGZsb2F0X3R5cGUsIGZ1bmMsIG9wKSBcCisgIF9faW5saW5lX21hdGhvcF9kZWNsXyAoZmxvYXRfdHlwZSwgZnVuYywgb3AsICIwIiAoX194KSkKKyNkZWZpbmUgX19pbmxpbmVfbWF0aG9wTlBfKGZsb2F0X3R5cGUsIGZ1bmMsIG9wKSBcCisgIF9faW5saW5lX21hdGhvcF9kZWNsTlBfIChmbG9hdF90eXBlLCBmdW5jLCBvcCwgIjAiIChfX3gpKQorCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKKyMgZGVmaW5lIF9faW5saW5lX21hdGhvcF9kZWNsKGZ1bmMsIG9wLCBwYXJhbXMuLi4pIFwKKyAgX19pbmxpbmVfbWF0aG9wX2RlY2xfIChkb3VibGUsIGZ1bmMsIG9wLCBwYXJhbXMpCQkJICAgICAgXAorICBfX2lubGluZV9tYXRob3BfZGVjbF8gKGZsb2F0LCBfX0NPTkNBVChmdW5jLGYpLCBvcCwgcGFyYW1zKQkJICAgICAgXAorICBfX2lubGluZV9tYXRob3BfZGVjbF8gKGxvbmcgZG91YmxlLCBfX0NPTkNBVChmdW5jLGwpLCBvcCwgcGFyYW1zKQorIyBkZWZpbmUgX19pbmxpbmVfbWF0aG9wX2RlY2xOUChmdW5jLCBvcCwgcGFyYW1zLi4uKSBcCisgIF9faW5saW5lX21hdGhvcF9kZWNsTlBfIChkb3VibGUsIGZ1bmMsIG9wLCBwYXJhbXMpCQkJICAgICAgXAorICBfX2lubGluZV9tYXRob3BfZGVjbE5QXyAoZmxvYXQsIF9fQ09OQ0FUKGZ1bmMsZiksIG9wLCBwYXJhbXMpCQkgICAgICBcCisgIF9faW5saW5lX21hdGhvcF9kZWNsTlBfIChsb25nIGRvdWJsZSwgX19DT05DQVQoZnVuYyxsKSwgb3AsIHBhcmFtcykKKyNlbHNlCisjIGRlZmluZSBfX2lubGluZV9tYXRob3BfZGVjbChmdW5jLCBvcCwgcGFyYW1zLi4uKSBcCisgIF9faW5saW5lX21hdGhvcF9kZWNsXyAoZG91YmxlLCBmdW5jLCBvcCwgcGFyYW1zKQorIyBkZWZpbmUgX19pbmxpbmVfbWF0aG9wX2RlY2xOUChmdW5jLCBvcCwgcGFyYW1zLi4uKSBcCisgIF9faW5saW5lX21hdGhvcF9kZWNsTlBfIChkb3VibGUsIGZ1bmMsIG9wLCBwYXJhbXMpCisjZW5kaWYKKworI2RlZmluZSBfX2lubGluZV9tYXRob3BfZGVjbF8oZmxvYXRfdHlwZSwgZnVuYywgb3AsIHBhcmFtcy4uLikgXAorICBfX01BVEhfSU5MSU5FIGZsb2F0X3R5cGUgZnVuYyAoZmxvYXRfdHlwZSkgX19USFJPVzsJCQkgICAgICBcCisgIF9faW5saW5lX21hdGhvcF9kZWNsTlBfIChmbG9hdF90eXBlLCBmdW5jLCBvcCwgcGFyYW1zKQorCisjZGVmaW5lIF9faW5saW5lX21hdGhvcF9kZWNsTlBfKGZsb2F0X3R5cGUsIGZ1bmMsIG9wLCBwYXJhbXMuLi4pIFwKKyAgX19NQVRIX0lOTElORSBmbG9hdF90eXBlIF9fTlRIIChmdW5jIChmbG9hdF90eXBlIF9feCkpCQkgICAgICBcCisgIHsJCQkJCQkJCQkgICAgICBcCisgICAgcmVnaXN0ZXIgZmxvYXRfdHlwZSBfX3Jlc3VsdDsJCQkJCSAgICAgIFwKKyAgICBfX2FzbSBfX3ZvbGF0aWxlX18gKG9wIDogIj10IiAoX19yZXN1bHQpIDogcGFyYW1zKTsJCQkgICAgICBcCisgICAgcmV0dXJuIF9fcmVzdWx0OwkJCQkJCQkgICAgICBcCisgIH0KKworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CisjIGRlZmluZSBfX2lubGluZV9tYXRoY29kZShmdW5jLCBhcmcsIGNvZGUpIFwKKyAgX19pbmxpbmVfbWF0aGNvZGVfIChkb3VibGUsIGZ1bmMsIGFyZywgY29kZSkJCQkJICAgICAgXAorICBfX2lubGluZV9tYXRoY29kZV8gKGZsb2F0LCBfX0NPTkNBVChmdW5jLGYpLCBhcmcsIGNvZGUpCQkgICAgICBcCisgIF9faW5saW5lX21hdGhjb2RlXyAobG9uZyBkb3VibGUsIF9fQ09OQ0FUKGZ1bmMsbCksIGFyZywgY29kZSkKKyMgZGVmaW5lIF9faW5saW5lX21hdGhjb2RlTlAoZnVuYywgYXJnLCBjb2RlKSBcCisgIF9faW5saW5lX21hdGhjb2RlTlBfIChkb3VibGUsIGZ1bmMsIGFyZywgY29kZSkJCQkgICAgICBcCisgIF9faW5saW5lX21hdGhjb2RlTlBfIChmbG9hdCwgX19DT05DQVQoZnVuYyxmKSwgYXJnLCBjb2RlKQkJICAgICAgXAorICBfX2lubGluZV9tYXRoY29kZU5QXyAobG9uZyBkb3VibGUsIF9fQ09OQ0FUKGZ1bmMsbCksIGFyZywgY29kZSkKKyMgZGVmaW5lIF9faW5saW5lX21hdGhjb2RlMihmdW5jLCBhcmcxLCBhcmcyLCBjb2RlKSBcCisgIF9faW5saW5lX21hdGhjb2RlMl8gKGRvdWJsZSwgZnVuYywgYXJnMSwgYXJnMiwgY29kZSkJCQkgICAgICBcCisgIF9faW5saW5lX21hdGhjb2RlMl8gKGZsb2F0LCBfX0NPTkNBVChmdW5jLGYpLCBhcmcxLCBhcmcyLCBjb2RlKQkgICAgICBcCisgIF9faW5saW5lX21hdGhjb2RlMl8gKGxvbmcgZG91YmxlLCBfX0NPTkNBVChmdW5jLGwpLCBhcmcxLCBhcmcyLCBjb2RlKQorIyBkZWZpbmUgX19pbmxpbmVfbWF0aGNvZGVOUDIoZnVuYywgYXJnMSwgYXJnMiwgY29kZSkgXAorICBfX2lubGluZV9tYXRoY29kZU5QMl8gKGRvdWJsZSwgZnVuYywgYXJnMSwgYXJnMiwgY29kZSkJCSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aGNvZGVOUDJfIChmbG9hdCwgX19DT05DQVQoZnVuYyxmKSwgYXJnMSwgYXJnMiwgY29kZSkJICAgICAgXAorICBfX2lubGluZV9tYXRoY29kZU5QMl8gKGxvbmcgZG91YmxlLCBfX0NPTkNBVChmdW5jLGwpLCBhcmcxLCBhcmcyLCBjb2RlKQorIyBkZWZpbmUgX19pbmxpbmVfbWF0aGNvZGUzKGZ1bmMsIGFyZzEsIGFyZzIsIGFyZzMsIGNvZGUpIFwKKyAgX19pbmxpbmVfbWF0aGNvZGUzXyAoZG91YmxlLCBmdW5jLCBhcmcxLCBhcmcyLCBhcmczLCBjb2RlKQkJICAgICAgXAorICBfX2lubGluZV9tYXRoY29kZTNfIChmbG9hdCwgX19DT05DQVQoZnVuYyxmKSwgYXJnMSwgYXJnMiwgYXJnMywgY29kZSkJICAgICAgXAorICBfX2lubGluZV9tYXRoY29kZTNfIChsb25nIGRvdWJsZSwgX19DT05DQVQoZnVuYyxsKSwgYXJnMSwgYXJnMiwgYXJnMywgY29kZSkKKyMgZGVmaW5lIF9faW5saW5lX21hdGhjb2RlTlAzKGZ1bmMsIGFyZzEsIGFyZzIsIGFyZzMsIGNvZGUpIFwKKyAgX19pbmxpbmVfbWF0aGNvZGVOUDNfIChkb3VibGUsIGZ1bmMsIGFyZzEsIGFyZzIsIGFyZzMsIGNvZGUpCQkgICAgICBcCisgIF9faW5saW5lX21hdGhjb2RlTlAzXyAoZmxvYXQsIF9fQ09OQ0FUKGZ1bmMsZiksIGFyZzEsIGFyZzIsIGFyZzMsIGNvZGUpICAgICBcCisgIF9faW5saW5lX21hdGhjb2RlTlAzXyAobG9uZyBkb3VibGUsIF9fQ09OQ0FUKGZ1bmMsbCksIGFyZzEsIGFyZzIsIGFyZzMsIGNvZGUpCisjZWxzZQorIyBkZWZpbmUgX19pbmxpbmVfbWF0aGNvZGUoZnVuYywgYXJnLCBjb2RlKSBcCisgIF9faW5saW5lX21hdGhjb2RlXyAoZG91YmxlLCBmdW5jLCAoYXJnKSwgY29kZSkKKyMgZGVmaW5lIF9faW5saW5lX21hdGhjb2RlTlAoZnVuYywgYXJnLCBjb2RlKSBcCisgIF9faW5saW5lX21hdGhjb2RlTlBfIChkb3VibGUsIGZ1bmMsIChhcmcpLCBjb2RlKQorIyBkZWZpbmUgX19pbmxpbmVfbWF0aGNvZGUyKGZ1bmMsIGFyZzEsIGFyZzIsIGNvZGUpIFwKKyAgX19pbmxpbmVfbWF0aGNvZGUyXyAoZG91YmxlLCBmdW5jLCBhcmcxLCBhcmcyLCBjb2RlKQorIyBkZWZpbmUgX19pbmxpbmVfbWF0aGNvZGVOUDIoZnVuYywgYXJnMSwgYXJnMiwgY29kZSkgXAorICBfX2lubGluZV9tYXRoY29kZU5QMl8gKGRvdWJsZSwgZnVuYywgYXJnMSwgYXJnMiwgY29kZSkKKyMgZGVmaW5lIF9faW5saW5lX21hdGhjb2RlMyhmdW5jLCBhcmcxLCBhcmcyLCBhcmczLCBjb2RlKSBcCisgIF9faW5saW5lX21hdGhjb2RlM18gKGRvdWJsZSwgZnVuYywgYXJnMSwgYXJnMiwgYXJnMywgY29kZSkKKyMgZGVmaW5lIF9faW5saW5lX21hdGhjb2RlTlAzKGZ1bmMsIGFyZzEsIGFyZzIsIGFyZzMsIGNvZGUpIFwKKyAgX19pbmxpbmVfbWF0aGNvZGVOUDNfIChkb3VibGUsIGZ1bmMsIGFyZzEsIGFyZzIsIGFyZzMsIGNvZGUpCisjZW5kaWYKKworI2RlZmluZSBfX2lubGluZV9tYXRoY29kZV8oZmxvYXRfdHlwZSwgZnVuYywgYXJnLCBjb2RlKSBcCisgIF9fTUFUSF9JTkxJTkUgZmxvYXRfdHlwZSBmdW5jIChmbG9hdF90eXBlKSBfX1RIUk9XOwkJCSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aGNvZGVOUF8oZmxvYXRfdHlwZSwgZnVuYywgYXJnLCBjb2RlKQorCisjZGVmaW5lIF9faW5saW5lX21hdGhjb2RlTlBfKGZsb2F0X3R5cGUsIGZ1bmMsIGFyZywgY29kZSkgXAorICBfX01BVEhfSU5MSU5FIGZsb2F0X3R5cGUgX19OVEggKGZ1bmMgKGZsb2F0X3R5cGUgYXJnKSkJCSAgICAgIFwKKyAgewkJCQkJCQkJCSAgICAgIFwKKyAgICBjb2RlOwkJCQkJCQkJICAgICAgXAorICB9CisKKworI2RlZmluZSBfX2lubGluZV9tYXRoY29kZTJfKGZsb2F0X3R5cGUsIGZ1bmMsIGFyZzEsIGFyZzIsIGNvZGUpIFwKKyAgX19NQVRIX0lOTElORSBmbG9hdF90eXBlIGZ1bmMgKGZsb2F0X3R5cGUsIGZsb2F0X3R5cGUpIF9fVEhST1c7CSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aGNvZGVOUDJfIChmbG9hdF90eXBlLCBmdW5jLCBhcmcxLCBhcmcyLCBjb2RlKQorCisjZGVmaW5lIF9faW5saW5lX21hdGhjb2RlTlAyXyhmbG9hdF90eXBlLCBmdW5jLCBhcmcxLCBhcmcyLCBjb2RlKSBcCisgIF9fTUFUSF9JTkxJTkUgZmxvYXRfdHlwZSBfX05USCAoZnVuYyAoZmxvYXRfdHlwZSBhcmcxLCBmbG9hdF90eXBlIGFyZzIpKSAgICBcCisgIHsJCQkJCQkJCQkgICAgICBcCisgICAgY29kZTsJCQkJCQkJCSAgICAgIFwKKyAgfQorCisjZGVmaW5lIF9faW5saW5lX21hdGhjb2RlM18oZmxvYXRfdHlwZSwgZnVuYywgYXJnMSwgYXJnMiwgYXJnMywgY29kZSkgXAorICBfX01BVEhfSU5MSU5FIGZsb2F0X3R5cGUgZnVuYyAoZmxvYXRfdHlwZSwgZmxvYXRfdHlwZSwgZmxvYXRfdHlwZSkgX19USFJPVzsgXAorICBfX2lubGluZV9tYXRoY29kZU5QM18oZmxvYXRfdHlwZSwgZnVuYywgYXJnMSwgYXJnMiwgYXJnMywgY29kZSkKKworI2RlZmluZSBfX2lubGluZV9tYXRoY29kZU5QM18oZmxvYXRfdHlwZSwgZnVuYywgYXJnMSwgYXJnMiwgYXJnMywgY29kZSkgXAorICBfX01BVEhfSU5MSU5FIGZsb2F0X3R5cGUgX19OVEggKGZ1bmMgKGZsb2F0X3R5cGUgYXJnMSwgZmxvYXRfdHlwZSBhcmcyLCAgICAgXAorCQkJCQlmbG9hdF90eXBlIGFyZzMpKQkJICAgICAgXAorICB7CQkJCQkJCQkJICAgICAgXAorICAgIGNvZGU7CQkJCQkJCQkgICAgICBcCisgIH0KKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZCBfX05PX01BVEhfSU5MSU5FUyAmJiBkZWZpbmVkIF9fT1BUSU1JWkVfXworLyogTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgKi8KKworX19pbmxpbmVfbWF0aGNvZGUgKF9fc2duLCBfX3gsIFwKKyAgcmV0dXJuIF9feCA9PSAwLjAgPyAwLjAgOiAoX194ID4gMC4wID8gMS4wIDogLTEuMCkpCisKKy8qIF9fRkFTVF9NQVRIX18gaXMgZGVmaW5lZCBieSBnY2MgLWZmYXN0LW1hdGguICAqLworI2lmZGVmIF9fRkFTVF9NQVRIX18KK19faW5saW5lX21hdGhjb2RlIChfX3BvdzIsIF9feCwgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX19leHBvbmVudDsJCQkJCSAgICAgIFwKKyAgX19leHRlbnNpb25fXyBsb25nIGxvbmcgaW50IF9fcCA9IChsb25nIGxvbmcgaW50KSBfX3g7CQkgICAgICBcCisgIGlmIChfX3ggPT0gKGxvbmcgZG91YmxlKSBfX3ApCQkJCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkgICAgICBcCisJKCJmc2NhbGUiCQkJCQkJCSAgICAgIFwKKwkgOiAiPXQiIChfX3ZhbHVlKSA6ICIwIiAoMS4wKSwgInUiIChfX3gpKTsJCQkgICAgICBcCisgICAgICByZXR1cm4gX192YWx1ZTsJCQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIF9fYXNtIF9fdm9sYXRpbGVfXwkJCQkJCQkgICAgICBcCisgICAgKCJmbGQJJSVzdCgwKVxuXHQiCQkJCQkJICAgICAgXAorICAgICAiZnJuZGludAkJCSMgaW50KHgpXG5cdCIJCQkJICAgICAgXAorICAgICAiZnhjaFxuXHQiCQkJCQkJCQkgICAgICBcCisgICAgICJmc3ViCSUlc3QoMSkJCSMgZnJhY3QoeClcblx0IgkJCQkgICAgICBcCisgICAgICJmMnhtMQkJCSMgMl4oZnJhY3QoeCkpIC0gMVxuXHQiCQkJICAgICAgXAorICAgICA6ICI9dCIgKF9fdmFsdWUpLCAiPXUiIChfX2V4cG9uZW50KSA6ICIwIiAoX194KSk7CQkJICAgICAgXAorICBfX3ZhbHVlICs9IDEuMDsJCQkJCQkJICAgICAgXAorICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICgiZnNjYWxlIgkJCQkJCQkJICAgICAgXAorICAgICA6ICI9dCIgKF9fdmFsdWUpIDogIjAiIChfX3ZhbHVlKSwgInUiIChfX2V4cG9uZW50KSk7CQkgICAgICBcCisgIHJldHVybiBfX3ZhbHVlKQorCisjIGlmZGVmIF9fVVNFX0dOVQorIyAgZGVmaW5lIF9fc2luY29zX2NvZGUgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX2Nvc3I7CQkJCQkJICAgICAgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3NpbnI7CQkJCQkJICAgICAgXAorICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICgiZnNpbmNvc1xuXHQiCQkJCQkJCSAgICAgIFwKKyAgICAgImZuc3RzdwklJWF4XG5cdCIJCQkJCQkgICAgICBcCisgICAgICJ0ZXN0bAkkMHg0MDAsICUlZWF4XG5cdCIJCQkJCSAgICAgIFwKKyAgICAgImp6CTFmXG5cdCIJCQkJCQkJICAgICAgXAorICAgICAiZmxkcGlcblx0IgkJCQkJCQkgICAgICBcCisgICAgICJmYWRkCSUlc3QoMClcblx0IgkJCQkJCSAgICAgIFwKKyAgICAgImZ4Y2gJJSVzdCgxKVxuXHQiCQkJCQkJICAgICAgXAorICAgICAiMjogZnByZW0xXG5cdCIJCQkJCQkJICAgICAgXAorICAgICAiZm5zdHN3CSUlYXhcblx0IgkJCQkJCSAgICAgIFwKKyAgICAgInRlc3RsCSQweDQwMCwgJSVlYXhcblx0IgkJCQkJICAgICAgXAorICAgICAiam56CTJiXG5cdCIJCQkJCQkJICAgICAgXAorICAgICAiZnN0cAklJXN0KDEpXG5cdCIJCQkJCQkgICAgICBcCisgICAgICJmc2luY29zXG5cdCIJCQkJCQkJICAgICAgXAorICAgICAiMToiCQkJCQkJCQkgICAgICBcCisgICAgIDogIj10IiAoX19jb3NyKSwgIj11IiAoX19zaW5yKSA6ICIwIiAoX194KSk7CQkJICAgICAgXAorICAqX19zaW54ID0gX19zaW5yOwkJCQkJCQkgICAgICBcCisgICpfX2Nvc3ggPSBfX2Nvc3IKKworX19NQVRIX0lOTElORSB2b2lkCitfX05USCAoX19zaW5jb3MgKGRvdWJsZSBfX3gsIGRvdWJsZSAqX19zaW54LCBkb3VibGUgKl9fY29zeCkpCit7CisgIF9fc2luY29zX2NvZGU7Cit9CisKK19fTUFUSF9JTkxJTkUgdm9pZAorX19OVEggKF9fc2luY29zZiAoZmxvYXQgX194LCBmbG9hdCAqX19zaW54LCBmbG9hdCAqX19jb3N4KSkKK3sKKyAgX19zaW5jb3NfY29kZTsKK30KKworX19NQVRIX0lOTElORSB2b2lkCitfX05USCAoX19zaW5jb3NsIChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlICpfX3NpbngsIGxvbmcgZG91YmxlICpfX2Nvc3gpKQoreworICBfX3NpbmNvc19jb2RlOworfQorIyBlbmRpZgorCisKKy8qIE9wdGltaXplZCBpbmxpbmUgaW1wbGVtZW50YXRpb24sIHNvbWV0aW1lcyB3aXRoIHJlZHVjZWQgcHJlY2lzaW9uCisgICBhbmQvb3IgYXJndW1lbnQgcmFuZ2UuICAqLworCisjIGlmIF9fR05VQ19QUkVSRVEgKDMsIDUpCisjICBkZWZpbmUgX19leHBtMV9jb2RlIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX190ZW1wOwkJCQkJCSAgICAgIFwKKyAgX190ZW1wID0gX19idWlsdGluX2V4cG0xbCAoX194KTsJCQkJCSAgICAgIFwKKyAgcmV0dXJuIF9fdGVtcCA/IF9fdGVtcCA6IF9feAorIyBlbHNlCisjICBkZWZpbmUgX19leHBtMV9jb2RlIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsJCQkJCQkgICAgICBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fZXhwb25lbnQ7CQkJCQkgICAgICBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fdGVtcDsJCQkJCQkgICAgICBcCisgIF9fYXNtIF9fdm9sYXRpbGVfXwkJCQkJCQkgICAgICBcCisgICAgKCJmbGRsMmUJCQkjIGVeeCAtIDEgPSAyXih4ICogbG9nMihlKSkgLSAxXG5cdCIJICAgICAgXAorICAgICAiZm11bAklJXN0KDEpCQkjIHggKiBsb2cyKGUpXG5cdCIJCQkgICAgICBcCisgICAgICJmc3QJJSVzdCgxKVxuXHQiCQkJCQkJICAgICAgXAorICAgICAiZnJuZGludAkJCSMgaW50KHggKiBsb2cyKGUpKVxuXHQiCQkJICAgICAgXAorICAgICAiZnhjaFxuXHQiCQkJCQkJCQkgICAgICBcCisgICAgICJmc3ViCSUlc3QoMSkJCSMgZnJhY3QoeCAqIGxvZzIoZSkpXG5cdCIJCSAgICAgIFwKKyAgICAgImYyeG0xCQkJIyAyXihmcmFjdCh4ICogbG9nMihlKSkpIC0gMVxuXHQiCSAgICAgIFwKKyAgICAgImZzY2FsZQkJCSMgMl4oeCAqIGxvZzIoZSkpIC0gMl4oaW50KHggKiBsb2cyKGUpKSlcblx0IiBcCisgICAgIDogIj10IiAoX192YWx1ZSksICI9dSIgKF9fZXhwb25lbnQpIDogIjAiIChfX3gpKTsJCQkgICAgICBcCisgIF9fYXNtIF9fdm9sYXRpbGVfXwkJCQkJCQkgICAgICBcCisgICAgKCJmc2NhbGUJCQkjIDJeaW50KHggKiBsb2cyKGUpKVxuXHQiCQkgICAgICBcCisgICAgIDogIj10IiAoX190ZW1wKSA6ICIwIiAoMS4wKSwgInUiIChfX2V4cG9uZW50KSk7CQkJICAgICAgXAorICBfX3RlbXAgLT0gMS4wOwkJCQkJCQkgICAgICBcCisgIF9fdGVtcCArPSBfX3ZhbHVlOwkJCQkJCQkgICAgICBcCisgIHJldHVybiBfX3RlbXAgPyBfX3RlbXAgOiBfX3gKKyMgZW5kaWYKK19faW5saW5lX21hdGhjb2RlTlBfIChsb25nIGRvdWJsZSwgX19leHBtMWwsIF9feCwgX19leHBtMV9jb2RlKQorCisjIGlmIF9fR05VQ19QUkVSRVEgKDMsIDQpCitfX2lubGluZV9tYXRoY29kZU5QXyAobG9uZyBkb3VibGUsIF9fZXhwbCwgX194LCByZXR1cm4gX19idWlsdGluX2V4cGwgKF9feCkpCisjIGVsc2UKKyMgIGRlZmluZSBfX2V4cF9jb2RlIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsJCQkJCQkgICAgICBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fZXhwb25lbnQ7CQkJCQkgICAgICBcCisgIF9fYXNtIF9fdm9sYXRpbGVfXwkJCQkJCQkgICAgICBcCisgICAgKCJmbGRsMmUJCQkjIGVeeCA9IDJeKHggKiBsb2cyKGUpKVxuXHQiCQkgICAgICBcCisgICAgICJmbXVsCSUlc3QoMSkJCSMgeCAqIGxvZzIoZSlcblx0IgkJCSAgICAgIFwKKyAgICAgImZzdAklJXN0KDEpXG5cdCIJCQkJCQkgICAgICBcCisgICAgICJmcm5kaW50CQkJIyBpbnQoeCAqIGxvZzIoZSkpXG5cdCIJCQkgICAgICBcCisgICAgICJmeGNoXG5cdCIJCQkJCQkJCSAgICAgIFwKKyAgICAgImZzdWIJJSVzdCgxKQkJIyBmcmFjdCh4ICogbG9nMihlKSlcblx0IgkJICAgICAgXAorICAgICAiZjJ4bTEJCQkjIDJeKGZyYWN0KHggKiBsb2cyKGUpKSkgLSAxXG5cdCIJICAgICAgXAorICAgICA6ICI9dCIgKF9fdmFsdWUpLCAiPXUiIChfX2V4cG9uZW50KSA6ICIwIiAoX194KSk7CQkJICAgICAgXAorICBfX3ZhbHVlICs9IDEuMDsJCQkJCQkJICAgICAgXAorICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICgiZnNjYWxlIgkJCQkJCQkJICAgICAgXAorICAgICA6ICI9dCIgKF9fdmFsdWUpIDogIjAiIChfX3ZhbHVlKSwgInUiIChfX2V4cG9uZW50KSk7CQkgICAgICBcCisgIHJldHVybiBfX3ZhbHVlCitfX2lubGluZV9tYXRoY29kZU5QIChleHAsIF9feCwgX19leHBfY29kZSkKK19faW5saW5lX21hdGhjb2RlTlBfIChsb25nIGRvdWJsZSwgX19leHBsLCBfX3gsIF9fZXhwX2NvZGUpCisjIGVuZGlmCisKKworIyBpZiAhX19HTlVDX1BSRVJFUSAoMywgNSkKK19faW5saW5lX21hdGhjb2RlTlAgKHRhbiwgX194LCBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fdmFsdWU7CQkJCQkJICAgICAgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlMiBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwkJICAgICAgXAorICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICgiZnB0YW4iCQkJCQkJCQkgICAgICBcCisgICAgIDogIj10IiAoX192YWx1ZTIpLCAiPXUiIChfX3ZhbHVlKSA6ICIwIiAoX194KSk7CQkJICAgICAgXAorICByZXR1cm4gX192YWx1ZSkKKyMgZW5kaWYKKyNlbmRpZiAvKiBfX0ZBU1RfTUFUSF9fICovCisKKworI2lmIF9fR05VQ19QUkVSRVEgKDMsIDQpCitfX2lubGluZV9tYXRoY29kZU5QMl8gKGxvbmcgZG91YmxlLCBfX2F0YW4ybCwgX195LCBfX3gsCisJCSAgICAgICByZXR1cm4gX19idWlsdGluX2F0YW4ybCAoX195LCBfX3gpKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXRhbjJfY29kZSBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fdmFsdWU7CQkJCQkJICAgICAgXAorICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICgiZnBhdGFuIgkJCQkJCQkJICAgICAgXAorICAgICA6ICI9dCIgKF9fdmFsdWUpIDogIjAiIChfX3gpLCAidSIgKF9feSkgOiAic3QoMSkiKTsJCSAgICAgIFwKKyAgcmV0dXJuIF9fdmFsdWUKKyMgaWZkZWYgX19GQVNUX01BVEhfXworX19pbmxpbmVfbWF0aGNvZGVOUDIgKGF0YW4yLCBfX3ksIF9feCwgX19hdGFuMl9jb2RlKQorIyBlbmRpZgorX19pbmxpbmVfbWF0aGNvZGVOUDJfIChsb25nIGRvdWJsZSwgX19hdGFuMmwsIF9feSwgX194LCBfX2F0YW4yX2NvZGUpCisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX0ZBU1RfTUFUSF9fICYmICFfX0dOVUNfUFJFUkVRICgzLCA1KQorX19pbmxpbmVfbWF0aGNvZGVOUDIgKGZtb2QsIF9feCwgX195LCBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fdmFsdWU7CQkJCQkJICAgICAgXAorICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICgiMToJZnByZW1cblx0IgkJCQkJCSAgICAgIFwKKyAgICAgImZuc3RzdwklJWF4XG5cdCIJCQkJCQkgICAgICBcCisgICAgICJzYWhmXG5cdCIJCQkJCQkJCSAgICAgIFwKKyAgICAgImpwCTFiIgkJCQkJCQkgICAgICBcCisgICAgIDogIj10IiAoX192YWx1ZSkgOiAiMCIgKF9feCksICJ1IiAoX195KSA6ICJheCIsICJjYyIpOwkJICAgICAgXAorICByZXR1cm4gX192YWx1ZSkKKyNlbmRpZgorCisKKyNpZmRlZiBfX0ZBU1RfTUFUSF9fCisjIGlmICFfX0dOVUNfUFJFUkVRICgzLDMpCitfX2lubGluZV9tYXRob3BOUCAoc3FydCwgImZzcXJ0IikKK19faW5saW5lX21hdGhvcE5QXyAobG9uZyBkb3VibGUsIF9fc3FydGwsICJmc3FydCIpCisjICBkZWZpbmUgX19saWJjX3NxcnRsKG4pIF9fc3FydGwgKG4pCisjIGVsc2UKKyMgIGRlZmluZSBfX2xpYmNfc3FydGwobikgX19idWlsdGluX3NxcnRsIChuKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBfX0dOVUNfUFJFUkVRICgyLCA4KQorX19pbmxpbmVfbWF0aGNvZGVOUF8gKGRvdWJsZSwgZmFicywgX194LCByZXR1cm4gX19idWlsdGluX2ZhYnMgKF9feCkpCisjIGlmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19pbmxpbmVfbWF0aGNvZGVOUF8gKGZsb2F0LCBmYWJzZiwgX194LCByZXR1cm4gX19idWlsdGluX2ZhYnNmIChfX3gpKQorX19pbmxpbmVfbWF0aGNvZGVOUF8gKGxvbmcgZG91YmxlLCBmYWJzbCwgX194LCByZXR1cm4gX19idWlsdGluX2ZhYnNsIChfX3gpKQorIyBlbmRpZgorX19pbmxpbmVfbWF0aGNvZGVOUF8gKGxvbmcgZG91YmxlLCBfX2ZhYnNsLCBfX3gsIHJldHVybiBfX2J1aWx0aW5fZmFic2wgKF9feCkpCisjZWxzZQorX19pbmxpbmVfbWF0aG9wIChmYWJzLCAiZmFicyIpCitfX2lubGluZV9tYXRob3BfIChsb25nIGRvdWJsZSwgX19mYWJzbCwgImZhYnMiKQorI2VuZGlmCisKKyNpZmRlZiBfX0ZBU1RfTUFUSF9fCisjIGlmICFfX0dOVUNfUFJFUkVRICgzLCA0KQorLyogVGhlIGFyZ3VtZW50IHJhbmdlIG9mIHRoaXMgaW5saW5lIHZlcnNpb24gaXMgcmVkdWNlZC4gICovCitfX2lubGluZV9tYXRob3BOUCAoc2luLCAiZnNpbiIpCisvKiBUaGUgYXJndW1lbnQgcmFuZ2Ugb2YgdGhpcyBpbmxpbmUgdmVyc2lvbiBpcyByZWR1Y2VkLiAgKi8KK19faW5saW5lX21hdGhvcE5QIChjb3MsICJmY29zIikKKworX19pbmxpbmVfbWF0aG9wX2RlY2xOUCAobG9nLCAiZmxkbG4yOyBmeGNoOyBmeWwyeCIsICIwIiAoX194KSA6ICJzdCgxKSIpCisjIGVuZGlmCisKKyMgaWYgIV9fR05VQ19QUkVSRVEgKDMsIDUpCitfX2lubGluZV9tYXRob3BfZGVjbE5QIChsb2cxMCwgImZsZGxnMjsgZnhjaDsgZnlsMngiLCAiMCIgKF9feCkgOiAic3QoMSkiKQorCitfX2lubGluZV9tYXRoY29kZU5QIChhc2luLCBfX3gsIHJldHVybiBfX2F0YW4ybCAoX194LCBfX2xpYmNfc3FydGwgKDEuMCAtIF9feCAqIF9feCkpKQorX19pbmxpbmVfbWF0aGNvZGVOUCAoYWNvcywgX194LCByZXR1cm4gX19hdGFuMmwgKF9fbGliY19zcXJ0bCAoMS4wIC0gX194ICogX194KSwgX194KSkKKyMgZW5kaWYKKworIyBpZiAhX19HTlVDX1BSRVJFUSAoMywgNCkKK19faW5saW5lX21hdGhvcF9kZWNsTlAgKGF0YW4sICJmbGQxOyBmcGF0YW4iLCAiMCIgKF9feCkgOiAic3QoMSkiKQorIyBlbmRpZgorI2VuZGlmIC8qIF9fRkFTVF9NQVRIX18gKi8KKworX19pbmxpbmVfbWF0aGNvZGVfIChsb25nIGRvdWJsZSwgX19zZ24xbCwgX194LCBcCisgIF9fZXh0ZW5zaW9uX18gdW5pb24geyBsb25nIGRvdWJsZSBfX3hsZDsgdW5zaWduZWQgaW50IF9feGlbM107IH0gX19uID0gICAgICBcCisgICAgeyBfX3hsZDogX194IH07CQkJCQkJCSAgICAgIFwKKyAgX19uLl9feGlbMl0gPSAoX19uLl9feGlbMl0gJiAweDgwMDApIHwgMHgzZmZmOwkJCSAgICAgIFwKKyAgX19uLl9feGlbMV0gPSAweDgwMDAwMDAwOwkJCQkJCSAgICAgIFwKKyAgX19uLl9feGlbMF0gPSAwOwkJCQkJCQkgICAgICBcCisgIHJldHVybiBfX24uX194bGQpCisKKworI2lmZGVmIF9fRkFTVF9NQVRIX18KKy8qIFRoZSBhcmd1bWVudCByYW5nZSBvZiB0aGUgaW5saW5lIHZlcnNpb24gb2Ygc2luaGwgaXMgc2xpZ2h0bHkgcmVkdWNlZC4gICovCitfX2lubGluZV9tYXRoY29kZU5QIChzaW5oLCBfX3gsIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX19leG0xID0gX19leHBtMWwgKF9fZmFic2wgKF9feCkpOwkJICAgICAgXAorICByZXR1cm4gMC41ICogKF9fZXhtMSAvIChfX2V4bTEgKyAxLjApICsgX19leG0xKSAqIF9fc2duMWwgKF9feCkpCisKK19faW5saW5lX21hdGhjb2RlTlAgKGNvc2gsIF9feCwgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX2V4ID0gX19leHBsIChfX3gpOwkJCQkgICAgICBcCisgIHJldHVybiAwLjUgKiAoX19leCArIDEuMCAvIF9fZXgpKQorCitfX2lubGluZV9tYXRoY29kZU5QICh0YW5oLCBfX3gsIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX19leG0xID0gX19leHBtMWwgKC1fX2ZhYnNsIChfX3ggKyBfX3gpKTsJICAgICAgXAorICByZXR1cm4gX19leG0xIC8gKF9fZXhtMSArIDIuMCkgKiBfX3NnbjFsICgtX194KSkKKyNlbmRpZgorCitfX2lubGluZV9tYXRoY29kZU5QIChmbG9vciwgX194LCBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fdmFsdWU7CQkJCQkJICAgICAgXAorICByZWdpc3RlciBpbnQgX19pZ25vcmU7CQkJCQkJICAgICAgXAorICB1bnNpZ25lZCBzaG9ydCBpbnQgX19jdzsJCQkJCQkgICAgICBcCisgIHVuc2lnbmVkIHNob3J0IGludCBfX2N3dG1wOwkJCQkJCSAgICAgIFwKKyAgX19hc20gX192b2xhdGlsZSAoImZuc3RjdyAlM1xuXHQiCQkJCQkgICAgICBcCisJCSAgICAibW92endsICUzLCAlMVxuXHQiCQkJCQkgICAgICBcCisJCSAgICAiYW5kbCAkMHhmM2ZmLCAlMVxuXHQiCQkJCSAgICAgIFwKKwkJICAgICJvcmwgJDB4MDQwMCwgJTFcblx0IgkvKiByb3VuZGluZyBkb3duICovCSAgICAgIFwKKwkJICAgICJtb3Z3ICV3MSwgJTJcblx0IgkJCQkJICAgICAgXAorCQkgICAgImZsZGN3ICUyXG5cdCIJCQkJCSAgICAgIFwKKwkJICAgICJmcm5kaW50XG5cdCIJCQkJCSAgICAgIFwKKwkJICAgICJmbGRjdyAlMyIJCQkJCQkgICAgICBcCisJCSAgICA6ICI9dCIgKF9fdmFsdWUpLCAiPSZxIiAoX19pZ25vcmUpLCAiPW0iIChfX2N3dG1wKSwJICAgICAgXAorCQkgICAgICAiPW0iIChfX2N3KQkJCQkJICAgICAgXAorCQkgICAgOiAiMCIgKF9feCkpOwkJCQkJICAgICAgXAorICByZXR1cm4gX192YWx1ZSkKKworX19pbmxpbmVfbWF0aGNvZGVOUCAoY2VpbCwgX194LCBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fdmFsdWU7CQkJCQkJICAgICAgXAorICByZWdpc3RlciBpbnQgX19pZ25vcmU7CQkJCQkJICAgICAgXAorICB1bnNpZ25lZCBzaG9ydCBpbnQgX19jdzsJCQkJCQkgICAgICBcCisgIHVuc2lnbmVkIHNob3J0IGludCBfX2N3dG1wOwkJCQkJCSAgICAgIFwKKyAgX19hc20gX192b2xhdGlsZSAoImZuc3RjdyAlM1xuXHQiCQkJCQkgICAgICBcCisJCSAgICAibW92endsICUzLCAlMVxuXHQiCQkJCQkgICAgICBcCisJCSAgICAiYW5kbCAkMHhmM2ZmLCAlMVxuXHQiCQkJCSAgICAgIFwKKwkJICAgICJvcmwgJDB4MDgwMCwgJTFcblx0IgkvKiByb3VuZGluZyB1cCAqLwkgICAgICBcCisJCSAgICAibW92dyAldzEsICUyXG5cdCIJCQkJCSAgICAgIFwKKwkJICAgICJmbGRjdyAlMlxuXHQiCQkJCQkgICAgICBcCisJCSAgICAiZnJuZGludFxuXHQiCQkJCQkgICAgICBcCisJCSAgICAiZmxkY3cgJTMiCQkJCQkJICAgICAgXAorCQkgICAgOiAiPXQiIChfX3ZhbHVlKSwgIj0mcSIgKF9faWdub3JlKSwgIj1tIiAoX19jd3RtcCksCSAgICAgIFwKKwkJICAgICAgIj1tIiAoX19jdykJCQkJCSAgICAgIFwKKwkJICAgIDogIjAiIChfX3gpKTsJCQkJCSAgICAgIFwKKyAgcmV0dXJuIF9fdmFsdWUpCisKKyNpZmRlZiBfX0ZBU1RfTUFUSF9fCisjIGRlZmluZSBfX2xkZXhwX2NvZGUgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgIFwKKyAgX19hc20gX192b2xhdGlsZV9fCQkJCQkJCSAgICAgIFwKKyAgICAoImZzY2FsZSIJCQkJCQkJCSAgICAgIFwKKyAgICAgOiAiPXQiIChfX3ZhbHVlKSA6ICIwIiAoX194KSwgInUiICgobG9uZyBkb3VibGUpIF9feSkpOwkJICAgICAgXAorICByZXR1cm4gX192YWx1ZQorCitfX01BVEhfSU5MSU5FIGRvdWJsZQorX19OVEggKGxkZXhwIChkb3VibGUgX194LCBpbnQgX195KSkKK3sKKyAgX19sZGV4cF9jb2RlOworfQorI2VuZGlmCisKKworLyogT3B0aW1pemVkIHZlcnNpb25zIGZvciBzb21lIG5vbi1zdGFuZGFyZGl6ZWQgZnVuY3Rpb25zLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKworIyBpZmRlZiBfX0ZBU1RfTUFUSF9fCitfX2lubGluZV9tYXRoY29kZU5QIChleHBtMSwgX194LCBfX2V4cG0xX2NvZGUpCisKKy8qIFdlIGNhbm5vdCByZWx5IG9uIE1fU1FSVCBiZWluZyBkZWZpbmVkLiAgU28gd2UgZG8gaXQgZm9yIG91cnNlbGYKKyAgIGhlcmUuICAqLworIyAgZGVmaW5lIF9fTV9TUVJUMgkxLjQxNDIxMzU2MjM3MzA5NTA0ODgwTAkvKiBzcXJ0KDIpICovCisKKyMgIGlmICFfX0dOVUNfUFJFUkVRICgzLCA1KQorX19pbmxpbmVfbWF0aGNvZGVOUCAobG9nMXAsIF9feCwgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgIFwKKyAgaWYgKF9fZmFic2wgKF9feCkgPj0gMS4wIC0gMC41ICogX19NX1NRUlQyKQkJCQkgICAgICBcCisgICAgX192YWx1ZSA9IGxvZ2wgKDEuMCArIF9feCk7CQkJCQkJICAgICAgXAorICBlbHNlCQkJCQkJCQkJICAgICAgXAorICAgIF9fYXNtIF9fdm9sYXRpbGVfXwkJCQkJCQkgICAgICBcCisgICAgICAoImZsZGxuMlxuXHQiCQkJCQkJCSAgICAgIFwKKyAgICAgICAiZnhjaFxuXHQiCQkJCQkJCSAgICAgIFwKKyAgICAgICAiZnlsMnhwMSIJCQkJCQkJICAgICAgXAorICAgICAgIDogIj10IiAoX192YWx1ZSkgOiAiMCIgKF9feCkgOiAic3QoMSkiKTsJCQkJICAgICAgXAorICByZXR1cm4gX192YWx1ZSkKKyMgIGVuZGlmCisKKworLyogVGhlIGFyZ3VtZW50IHJhbmdlIG9mIHRoZSBpbmxpbmUgdmVyc2lvbiBvZiBhc2luaGwgaXMgc2xpZ2h0bHkgcmVkdWNlZC4gICovCitfX2lubGluZV9tYXRoY29kZU5QIChhc2luaCwgX194LCBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlICBfX3kgPSBfX2ZhYnNsIChfX3gpOwkJCQkgICAgICBcCisgIHJldHVybiAobG9nMXBsIChfX3kgKiBfX3kgLyAoX19saWJjX3NxcnRsIChfX3kgKiBfX3kgKyAxLjApICsgMS4wKSArIF9feSkgICBcCisJICAqIF9fc2duMWwgKF9feCkpKQorCitfX2lubGluZV9tYXRoY29kZU5QIChhY29zaCwgX194LCBcCisgIHJldHVybiBsb2dsIChfX3ggKyBfX2xpYmNfc3FydGwgKF9feCAtIDEuMCkgKiBfX2xpYmNfc3FydGwgKF9feCArIDEuMCkpKQorCitfX2lubGluZV9tYXRoY29kZU5QIChhdGFuaCwgX194LCBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9feSA9IF9fZmFic2wgKF9feCk7CQkJCSAgICAgIFwKKyAgcmV0dXJuIC0wLjUgKiBsb2cxcGwgKC0oX195ICsgX195KSAvICgxLjAgKyBfX3kpKSAqIF9fc2duMWwgKF9feCkpCisKKy8qIFRoZSBhcmd1bWVudCByYW5nZSBvZiB0aGUgaW5saW5lIHZlcnNpb24gb2YgaHlwb3RsIGlzIHNsaWdodGx5IHJlZHVjZWQuICAqLworX19pbmxpbmVfbWF0aGNvZGVOUDIgKGh5cG90LCBfX3gsIF9feSwKKwkJICAgICAgcmV0dXJuIF9fbGliY19zcXJ0bCAoX194ICogX194ICsgX195ICogX195KSkKKworIyAgaWYgIV9fR05VQ19QUkVSRVEgKDMsIDUpCitfX2lubGluZV9tYXRoY29kZU5QKGxvZ2IsIF9feCwgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX19qdW5rOwkJCQkJCSAgICAgIFwKKyAgX19hc20gX192b2xhdGlsZV9fCQkJCQkJCSAgICAgIFwKKyAgICAoImZ4dHJhY3Rcblx0IgkJCQkJCQkgICAgICBcCisgICAgIDogIj10IiAoX19qdW5rKSwgIj11IiAoX192YWx1ZSkgOiAiMCIgKF9feCkpOwkJCSAgICAgIFwKKyAgcmV0dXJuIF9fdmFsdWUpCisjICBlbmRpZgorCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorIyBpZmRlZiBfX0ZBU1RfTUFUSF9fCisKKyMgIGlmICFfX0dOVUNfUFJFUkVRICgzLCA1KQorX19pbmxpbmVfbWF0aG9wX2RlY2xOUCAobG9nMiwgImZsZDE7IGZ4Y2g7IGZ5bDJ4IiwgIjAiIChfX3gpIDogInN0KDEpIikKKyMgIGVuZGlmCisKK19fTUFUSF9JTkxJTkUgZmxvYXQKK19fTlRIIChsZGV4cGYgKGZsb2F0IF9feCwgaW50IF9feSkpCit7CisgIF9fbGRleHBfY29kZTsKK30KKworX19NQVRIX0lOTElORSBsb25nIGRvdWJsZQorX19OVEggKGxkZXhwbCAobG9uZyBkb3VibGUgX194LCBpbnQgX195KSkKK3sKKyAgX19sZGV4cF9jb2RlOworfQorCitfX2lubGluZV9tYXRob3BOUCAocmludCwgImZybmRpbnQiKQorIyBlbmRpZiAvKiBfX0ZBU1RfTUFUSF9fICovCisKKyMgZGVmaW5lIF9fbHJpbnRfY29kZSBcCisgIGxvbmcgaW50IF9fbHJpbnRyZXM7CQkJCQkJCSAgICAgIFwKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICgiZmlzdHBsICUwIgkJCQkJCQkgICAgICBcCisgICAgIDogIj1tIiAoX19scmludHJlcykgOiAidCIgKF9feCkgOiAic3QiKTsJCQkJICAgICAgXAorICByZXR1cm4gX19scmludHJlcworX19NQVRIX0lOTElORSBsb25nIGludAorX19OVEggKGxyaW50ZiAoZmxvYXQgX194KSkKK3sKKyAgX19scmludF9jb2RlOworfQorX19NQVRIX0lOTElORSBsb25nIGludAorX19OVEggKGxyaW50IChkb3VibGUgX194KSkKK3sKKyAgX19scmludF9jb2RlOworfQorX19NQVRIX0lOTElORSBsb25nIGludAorX19OVEggKGxyaW50bCAobG9uZyBkb3VibGUgX194KSkKK3sKKyAgX19scmludF9jb2RlOworfQorIyB1bmRlZiBfX2xyaW50X2NvZGUKKworIyBkZWZpbmUgX19sbHJpbnRfY29kZSBcCisgIGxvbmcgbG9uZyBpbnQgX19sbHJpbnRyZXM7CQkJCQkJICAgICAgXAorICBfX2FzbV9fIF9fdm9sYXRpbGVfXwkJCQkJCQkgICAgICBcCisgICAgKCJmaXN0cGxsICUwIgkJCQkJCQkgICAgICBcCisgICAgIDogIj1tIiAoX19sbHJpbnRyZXMpIDogInQiIChfX3gpIDogInN0Iik7CQkJCSAgICAgIFwKKyAgcmV0dXJuIF9fbGxyaW50cmVzCitfX01BVEhfSU5MSU5FIGxvbmcgbG9uZyBpbnQKK19fTlRIIChsbHJpbnRmIChmbG9hdCBfX3gpKQoreworICBfX2xscmludF9jb2RlOworfQorX19NQVRIX0lOTElORSBsb25nIGxvbmcgaW50CitfX05USCAobGxyaW50IChkb3VibGUgX194KSkKK3sKKyAgX19sbHJpbnRfY29kZTsKK30KK19fTUFUSF9JTkxJTkUgbG9uZyBsb25nIGludAorX19OVEggKGxscmludGwgKGxvbmcgZG91YmxlIF9feCkpCit7CisgIF9fbGxyaW50X2NvZGU7Cit9CisjIHVuZGVmIF9fbGxyaW50X2NvZGUKKworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX01JU0MKKworIyBpZiBkZWZpbmVkIF9fRkFTVF9NQVRIX18gJiYgIV9fR05VQ19QUkVSRVEgKDMsIDUpCitfX2lubGluZV9tYXRoY29kZU5QMiAoZHJlbSwgX194LCBfX3ksIFwKKyAgcmVnaXN0ZXIgZG91YmxlIF9fdmFsdWU7CQkJCQkJICAgICAgXAorICByZWdpc3RlciBpbnQgX19jbG9iYmVyZWQ7CQkJCQkJICAgICAgXAorICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICgiMToJZnByZW0xXG5cdCIJCQkJCQkgICAgICBcCisgICAgICJmc3RzdwklJWF4XG5cdCIJCQkJCQkgICAgICBcCisgICAgICJzYWhmXG5cdCIJCQkJCQkJCSAgICAgIFwKKyAgICAgImpwCTFiIgkJCQkJCQkgICAgICBcCisgICAgIDogIj10IiAoX192YWx1ZSksICI9JmEiIChfX2Nsb2JiZXJlZCkgOiAiMCIgKF9feCksICJ1IiAoX195KSA6ICJjYyIpOyAgICBcCisgIHJldHVybiBfX3ZhbHVlKQorIyBlbmRpZgorCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiB0aGUgYGlzZmluaXRlJyBtYWNyby4gICovCitfX01BVEhfSU5MSU5FIGludAorX19OVEggKF9fZmluaXRlIChkb3VibGUgX194KSkKK3sKKyAgcmV0dXJuIChfX2V4dGVuc2lvbl9fCisJICAoKCgoKHVuaW9uIHsgZG91YmxlIF9fZDsgaW50IF9faVsyXTsgfSkge19fZDogX194fSkuX19pWzFdCisJICAgICB8IDB4ODAwZmZmZmZ1KSArIDEpID4+IDMxKSk7Cit9CisKKy8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zICovCisjIGlmZGVmIF9fRkFTVF9NQVRIX18KK19faW5saW5lX21hdGhjb2RlIChfX2Nvc2htMSwgX194LCBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fZXhtMSA9IF9fZXhwbTFsIChfX2ZhYnNsIChfX3gpKTsJCSAgICAgIFwKKyAgcmV0dXJuIDAuNSAqIChfX2V4bTEgLyAoX19leG0xICsgMS4wKSkgKiBfX2V4bTEpCisKK19faW5saW5lX21hdGhjb2RlIChfX2Fjb3NoMXAsIF9feCwgXAorICByZXR1cm4gbG9nMXBsIChfX3ggKyBfX2xpYmNfc3FydGwgKF9feCkgKiBfX2xpYmNfc3FydGwgKF9feCArIDIuMCkpKQorCisjIGVuZGlmIC8qIF9fRkFTVF9NQVRIX18gKi8KKyNlbmRpZiAvKiBfX1VTRV9NSVNDICAqLworCisvKiBVbmRlZmluZSBzb21lIG9mIHRoZSBsYXJnZSBtYWNyb3Mgd2hpY2ggYXJlIG5vdCB1c2VkIGFueW1vcmUuICAqLworI3VuZGVmIF9fYXRhbjJfY29kZQorI2lmZGVmIF9fRkFTVF9NQVRIX18KKyMgdW5kZWYgX19leHBtMV9jb2RlCisjIHVuZGVmIF9fZXhwX2NvZGUKKyMgdW5kZWYgX19zaW5jb3NfY29kZQorI2VuZGlmIC8qIF9fRkFTVF9NQVRIX18gKi8KKworI2VuZGlmIC8qIF9fTk9fTUFUSF9JTkxJTkVTICAqLworCisKKy8qIFRoaXMgY29kZSBpcyB1c2VkIGludGVybmFsbHkgaW4gdGhlIEdOVSBsaWJjLiAgKi8KKyNpZmRlZiBfX0xJQkNfSU5URVJOQUxfTUFUSF9JTkxJTkVTCitfX2lubGluZV9tYXRob3AgKF9faWVlZTc1NF9zcXJ0LCAiZnNxcnQiKQorX19pbmxpbmVfbWF0aGNvZGUyIChfX2llZWU3NTRfYXRhbjIsIF9feSwgX194LAorCQkgICAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsKKwkJICAgIF9fYXNtIF9fdm9sYXRpbGVfXyAoImZwYXRhblxuXHQiCisJCQkJCTogIj10IiAoX192YWx1ZSkKKwkJCQkJOiAiMCIgKF9feCksICJ1IiAoX195KSA6ICJzdCgxKSIpOworCQkgICAgcmV0dXJuIF9fdmFsdWU7KQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0dOVUNfXyAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tbWFuLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmJkN2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbW1hbi5oCkBAIC0wLDAgKzEsMTExIEBACisvKiBEZWZpbml0aW9ucyBmb3IgUE9TSVggbWVtb3J5IG1hcCBpbnRlcmZhY2UuICBMaW51eC9pMzg2IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsMjAwMCwyMDAzLDIwMDUsMjAwNiwyMDA5LDIwMTAsMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19NTUFOX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9tbWFuLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvbW1hbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGJhc2ljYWxseSBjb21lIGZyb20gdGhlIGtlcm5lbCBoZWFkZXJzLgorICAgQnV0IHRoZSBrZXJuZWwgaGVhZGVyIGlzIG5vdCBuYW1lc3BhY2UgY2xlYW4uICAqLworCisKKy8qIFByb3RlY3Rpb25zIGFyZSBjaG9zZW4gZnJvbSB0aGVzZSBiaXRzLCBPUidkIHRvZ2V0aGVyLiAgVGhlCisgICBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBuZWNlc3NhcmlseSBzdXBwb3J0IFBST1RfRVhFQyBvciBQUk9UX1dSSVRFCisgICB3aXRob3V0IFBST1RfUkVBRC4gIFRoZSBvbmx5IGd1YXJhbnRlZXMgYXJlIHRoYXQgbm8gd3JpdGluZyB3aWxsIGJlCisgICBhbGxvd2VkIHdpdGhvdXQgUFJPVF9XUklURSBhbmQgbm8gYWNjZXNzIHdpbGwgYmUgYWxsb3dlZCBmb3IgUFJPVF9OT05FLiAqLworCisjZGVmaW5lIFBST1RfUkVBRAkweDEJCS8qIFBhZ2UgY2FuIGJlIHJlYWQuICAqLworI2RlZmluZSBQUk9UX1dSSVRFCTB4MgkJLyogUGFnZSBjYW4gYmUgd3JpdHRlbi4gICovCisjZGVmaW5lIFBST1RfRVhFQwkweDQJCS8qIFBhZ2UgY2FuIGJlIGV4ZWN1dGVkLiAgKi8KKyNkZWZpbmUgUFJPVF9OT05FCTB4MAkJLyogUGFnZSBjYW4gbm90IGJlIGFjY2Vzc2VkLiAgKi8KKyNkZWZpbmUgUFJPVF9HUk9XU0RPV04JMHgwMTAwMDAwMAkvKiBFeHRlbmQgY2hhbmdlIHRvIHN0YXJ0IG9mCisJCQkJCSAgIGdyb3dzZG93biB2bWEgKG1wcm90ZWN0IG9ubHkpLiAgKi8KKyNkZWZpbmUgUFJPVF9HUk9XU1VQCTB4MDIwMDAwMDAJLyogRXh0ZW5kIGNoYW5nZSB0byBzdGFydCBvZgorCQkJCQkgICBncm93c3VwIHZtYSAobXByb3RlY3Qgb25seSkuICAqLworCisvKiBTaGFyaW5nIHR5cGVzIChtdXN0IGNob29zZSBvbmUgYW5kIG9ubHkgb25lIG9mIHRoZXNlKS4gICovCisjZGVmaW5lIE1BUF9TSEFSRUQJMHgwMQkJLyogU2hhcmUgY2hhbmdlcy4gICovCisjZGVmaW5lIE1BUF9QUklWQVRFCTB4MDIJCS8qIENoYW5nZXMgYXJlIHByaXZhdGUuICAqLworI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIE1BUF9UWVBFCTB4MGYJCS8qIE1hc2sgZm9yIHR5cGUgb2YgbWFwcGluZy4gICovCisjZW5kaWYKKworLyogT3RoZXIgZmxhZ3MuICAqLworI2RlZmluZSBNQVBfRklYRUQJMHgxMAkJLyogSW50ZXJwcmV0IGFkZHIgZXhhY3RseS4gICovCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgTUFQX0ZJTEUJMAorIyBkZWZpbmUgTUFQX0FOT05ZTU9VUwkweDIwCQkvKiBEb24ndCB1c2UgYSBmaWxlLiAgKi8KKyMgZGVmaW5lIE1BUF9BTk9OCU1BUF9BTk9OWU1PVVMKKyNlbmRpZgorCisvKiBUaGVzZSBhcmUgTGludXgtc3BlY2lmaWMuICAqLworI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIE1BUF9HUk9XU0RPV04JMHgwMDEwMAkJLyogU3RhY2stbGlrZSBzZWdtZW50LiAgKi8KKyMgZGVmaW5lIE1BUF9ERU5ZV1JJVEUJMHgwMDgwMAkJLyogRVRYVEJTWSAqLworIyBkZWZpbmUgTUFQX0VYRUNVVEFCTEUJMHgwMTAwMAkJLyogTWFyayBpdCBhcyBhbiBleGVjdXRhYmxlLiAgKi8KKyMgZGVmaW5lIE1BUF9MT0NLRUQJMHgwMjAwMAkJLyogTG9jayB0aGUgbWFwcGluZy4gICovCisjIGRlZmluZSBNQVBfTk9SRVNFUlZFCTB4MDQwMDAJCS8qIERvbid0IGNoZWNrIGZvciByZXNlcnZhdGlvbnMuICAqLworIyBkZWZpbmUgTUFQX1BPUFVMQVRFCTB4MDgwMDAJCS8qIFBvcHVsYXRlIChwcmVmYXVsdCkgcGFnZXRhYmxlcy4gICovCisjIGRlZmluZSBNQVBfTk9OQkxPQ0sJMHgxMDAwMAkJLyogRG8gbm90IGJsb2NrIG9uIElPLiAgKi8KKyMgZGVmaW5lIE1BUF9TVEFDSwkweDIwMDAwCQkvKiBBbGxvY2F0aW9uIGlzIGZvciBhIHN0YWNrLiAgKi8KKyMgZGVmaW5lIE1BUF9IVUdFVExCCTB4NDAwMDAJCS8qIENyZWF0ZSBodWdlIHBhZ2UgbWFwcGluZy4gICovCisjZW5kaWYKKworLyogRmxhZ3MgdG8gYG1zeW5jJy4gICovCisjZGVmaW5lIE1TX0FTWU5DCTEJCS8qIFN5bmMgbWVtb3J5IGFzeW5jaHJvbm91c2x5LiAgKi8KKyNkZWZpbmUgTVNfU1lOQwkJNAkJLyogU3luY2hyb25vdXMgbWVtb3J5IHN5bmMuICAqLworI2RlZmluZSBNU19JTlZBTElEQVRFCTIJCS8qIEludmFsaWRhdGUgdGhlIGNhY2hlcy4gICovCisKKy8qIEZsYWdzIGZvciBgbWxvY2thbGwnLiAgKi8KKyNkZWZpbmUgTUNMX0NVUlJFTlQJMQkJLyogTG9jayBhbGwgY3VycmVudGx5IG1hcHBlZCBwYWdlcy4gICovCisjZGVmaW5lIE1DTF9GVVRVUkUJMgkJLyogTG9jayBhbGwgYWRkaXRpb25zIHRvIGFkZHJlc3MKKwkJCQkJICAgc3BhY2UuICAqLworCisvKiBGbGFncyBmb3IgYG1yZW1hcCcuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTVJFTUFQX01BWU1PVkUJMQorIyBkZWZpbmUgTVJFTUFQX0ZJWEVECTIKKyNlbmRpZgorCisvKiBBZHZpY2UgdG8gYG1hZHZpc2UnLiAgKi8KKyNpZmRlZiBfX1VTRV9CU0QKKyMgZGVmaW5lIE1BRFZfTk9STUFMCSAgMAkvKiBObyBmdXJ0aGVyIHNwZWNpYWwgdHJlYXRtZW50LiAgKi8KKyMgZGVmaW5lIE1BRFZfUkFORE9NCSAgMQkvKiBFeHBlY3QgcmFuZG9tIHBhZ2UgcmVmZXJlbmNlcy4gICovCisjIGRlZmluZSBNQURWX1NFUVVFTlRJQUwgIDIJLyogRXhwZWN0IHNlcXVlbnRpYWwgcGFnZSByZWZlcmVuY2VzLiAgKi8KKyMgZGVmaW5lIE1BRFZfV0lMTE5FRUQJICAzCS8qIFdpbGwgbmVlZCB0aGVzZSBwYWdlcy4gICovCisjIGRlZmluZSBNQURWX0RPTlRORUVECSAgNAkvKiBEb24ndCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIE1BRFZfUkVNT1ZFCSAgOQkvKiBSZW1vdmUgdGhlc2UgcGFnZXMgYW5kIHJlc291cmNlcy4gICovCisjIGRlZmluZSBNQURWX0RPTlRGT1JLCSAgMTAJLyogRG8gbm90IGluaGVyaXQgYWNyb3NzIGZvcmsuICAqLworIyBkZWZpbmUgTUFEVl9ET0ZPUksJICAxMQkvKiBEbyBpbmhlcml0IGFjcm9zcyBmb3JrLiAgKi8KKyMgZGVmaW5lIE1BRFZfTUVSR0VBQkxFCSAgMTIJLyogS1NNIG1heSBtZXJnZSBpZGVudGljYWwgcGFnZXMuICAqLworIyBkZWZpbmUgTUFEVl9VTk1FUkdFQUJMRSAxMwkvKiBLU00gbWF5IG5vdCBtZXJnZSBpZGVudGljYWwgcGFnZXMuICAqLworIyBkZWZpbmUgTUFEVl9IVUdFUEFHRQkgIDE0CS8qIFdvcnRoIGJhY2tpbmcgd2l0aCBodWdlcGFnZXMuICAqLworIyBkZWZpbmUgTUFEVl9OT0hVR0VQQUdFICAxNQkvKiBOb3Qgd29ydGggYmFja2luZyB3aXRoIGh1Z2VwYWdlcy4gICovCisjIGRlZmluZSBNQURWX0hXUE9JU09OCSAgMTAwCS8qIFBvaXNvbiBhIHBhZ2UgZm9yIHRlc3RpbmcuICAqLworI2VuZGlmCisKKy8qIFRoZSBQT1NJWCBwZW9wbGUgaGFkIHRvIGludmVudCBzaW1pbGFyIG5hbWVzIGZvciB0aGUgc2FtZSB0aGluZ3MuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIFBPU0lYX01BRFZfTk9STUFMCTAgLyogTm8gZnVydGhlciBzcGVjaWFsIHRyZWF0bWVudC4gICovCisjIGRlZmluZSBQT1NJWF9NQURWX1JBTkRPTQkxIC8qIEV4cGVjdCByYW5kb20gcGFnZSByZWZlcmVuY2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX01BRFZfU0VRVUVOVElBTAkyIC8qIEV4cGVjdCBzZXF1ZW50aWFsIHBhZ2UgcmVmZXJlbmNlcy4gICovCisjIGRlZmluZSBQT1NJWF9NQURWX1dJTExORUVECTMgLyogV2lsbCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX01BRFZfRE9OVE5FRUQJNCAvKiBEb24ndCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21vbmV0YXJ5LWxkYmwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tb25ldGFyeS1sZGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwODBmOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tb25ldGFyeS1sZGJsLmgKQEAgLTAsMCArMSwyOCBAQAorLyogLW1sb25nLWRvdWJsZS02NCBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIG1vbmV0YXJ5IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTU9ORVRBUllfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9tb25ldGFyeS1sZGJsLmg+IGRpcmVjdGx5OyB1c2UgPG1vbmV0YXJ5Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKK19fTERCTF9SRURJUl9ERUNMIChzdHJmbW9uKQorCisjaWZkZWYgX19VU0VfR05VCitfX0xEQkxfUkVESVJfREVDTCAoc3RyZm1vbl9sKQorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbXF1ZXVlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbXF1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1MjhmOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tcXVldWUuaApAQCAtMCwwICsxLDMyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01RVUVVRV9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbXF1ZXVlLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtcXVldWUuaD4gaW5zdGVhZC4iCisjZW5kaWYKKwordHlwZWRlZiBpbnQgbXFkX3Q7CisKK3N0cnVjdCBtcV9hdHRyCit7CisgIGxvbmcgaW50IG1xX2ZsYWdzOwkvKiBNZXNzYWdlIHF1ZXVlIGZsYWdzLiAgKi8KKyAgbG9uZyBpbnQgbXFfbWF4bXNnOwkvKiBNYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcy4gICovCisgIGxvbmcgaW50IG1xX21zZ3NpemU7CS8qIE1heGltdW0gbWVzc2FnZSBzaXplLiAgKi8KKyAgbG9uZyBpbnQgbXFfY3VybXNnczsJLyogTnVtYmVyIG9mIG1lc3NhZ2VzIGN1cnJlbnRseSBxdWV1ZWQuICAqLworICBsb25nIGludCBfX3BhZFs0XTsKK307CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbXF1ZXVlMi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21xdWV1ZTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmQwODE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21xdWV1ZTIuaApAQCAtMCwwICsxLDU4IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIG1xIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNywgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfRkNOVExfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9tcXVldWUyLmg+IGRpcmVjdGx5OyB1c2UgPG1xdWV1ZS5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBDaGVjayB0aGF0IGNhbGxzIHRvIG1xX29wZW4gd2l0aCBPX0NSRUFUIHNldCBoYXZlIGFuIGFwcHJvcHJpYXRlIHRoaXJkIGFuZCBmb3VydGgKKyAgIHBhcmFtZXRlci4gICovCitleHRlcm4gbXFkX3QgbXFfb3BlbiAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX29mbGFnLCAuLi4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworZXh0ZXJuIG1xZF90IF9fbXFfb3Blbl8yIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fb2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworZXh0ZXJuIG1xZF90IF9fUkVESVJFQ1RfTlRIIChfX21xX29wZW5fYWxpYXMsIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwKKwkJCQkJICAgICAgIGludCBfX29mbGFnLCAuLi4pLCBtcV9vcGVuKQorICAgICBfX25vbm51bGwgKCgxKSk7CitfX2Vycm9yZGVjbCAoX19tcV9vcGVuX3dyb25nX251bWJlcl9vZl9hcmdzLAorCSAgICAgIm1xX29wZW4gY2FuIGJlIGNhbGxlZCBlaXRoZXIgd2l0aCAyIG9yIDQgYXJndW1lbnRzIik7CitfX2Vycm9yZGVjbCAoX19tcV9vcGVuX21pc3NpbmdfbW9kZV9hbmRfYXR0ciwKKwkgICAgICJtcV9vcGVuIHdpdGggT19DUkVBVCBpbiBzZWNvbmQgYXJndW1lbnQgbmVlZHMgNCBhcmd1bWVudHMiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBtcWRfdAorX19OVEggKG1xX29wZW4gKF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQgX19vZmxhZywgLi4uKSkKK3sKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpICE9IDAgJiYgX192YV9hcmdfcGFja19sZW4gKCkgIT0gMikKKyAgICBfX21xX29wZW5fd3JvbmdfbnVtYmVyX29mX2FyZ3MgKCk7CisKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX29mbGFnKSkKKyAgICB7CisgICAgICBpZiAoKF9fb2ZsYWcgJiBPX0NSRUFUKSAhPSAwICYmIF9fdmFfYXJnX3BhY2tfbGVuICgpID09IDApCisJeworCSAgX19tcV9vcGVuX21pc3NpbmdfbW9kZV9hbmRfYXR0ciAoKTsKKwkgIHJldHVybiBfX21xX29wZW5fMiAoX19uYW1lLCBfX29mbGFnKTsKKwl9CisgICAgICByZXR1cm4gX19tcV9vcGVuX2FsaWFzIChfX25hbWUsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworICAgIH0KKworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPT0gMCkKKyAgICByZXR1cm4gX19tcV9vcGVuXzIgKF9fbmFtZSwgX19vZmxhZyk7CisKKyAgcmV0dXJuIF9fbXFfb3Blbl9hbGlhcyAoX19uYW1lLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tc3EuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tc3EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmE0OWI1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21zcS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX01TR19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbXNxLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvbXNnLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIERlZmluZSBvcHRpb25zIGZvciBtZXNzYWdlIHF1ZXVlIGZ1bmN0aW9ucy4gICovCisjZGVmaW5lIE1TR19OT0VSUk9SCTAxMDAwMAkvKiBubyBlcnJvciBpZiBtZXNzYWdlIGlzIHRvbyBiaWcgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE1TR19FWENFUFQJMDIwMDAwCS8qIHJlY3YgYW55IG1zZyBleGNlcHQgb2Ygc3BlY2lmaWVkIHR5cGUgKi8KKyNlbmRpZgorCisvKiBUeXBlcyB1c2VkIGluIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IG1zZ3FudW1fdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgbXNnbGVuX3Q7CisKKworLyogU3RydWN0dXJlIG9mIHJlY29yZCBmb3Igb25lIG1lc3NhZ2UgaW5zaWRlIHRoZSBrZXJuZWwuCisgICBUaGUgdHlwZSBgc3RydWN0IG1zZycgaXMgb3BhcXVlLiAgKi8KK3N0cnVjdCBtc3FpZF9kcworeworICBzdHJ1Y3QgaXBjX3Blcm0gbXNnX3Blcm07CS8qIHN0cnVjdHVyZSBkZXNjcmliaW5nIG9wZXJhdGlvbiBwZXJtaXNzaW9uICovCisgIF9fdGltZV90IG1zZ19zdGltZTsJCS8qIHRpbWUgb2YgbGFzdCBtc2dzbmQgY29tbWFuZCAqLworICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDE7CisgIF9fdGltZV90IG1zZ19ydGltZTsJCS8qIHRpbWUgb2YgbGFzdCBtc2dyY3YgY29tbWFuZCAqLworICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDI7CisgIF9fdGltZV90IG1zZ19jdGltZTsJCS8qIHRpbWUgb2YgbGFzdCBjaGFuZ2UgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQzOworICB1bnNpZ25lZCBsb25nIGludCBfX21zZ19jYnl0ZXM7IC8qIGN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzIG9uIHF1ZXVlICovCisgIG1zZ3FudW1fdCBtc2dfcW51bTsJCS8qIG51bWJlciBvZiBtZXNzYWdlcyBjdXJyZW50bHkgb24gcXVldWUgKi8KKyAgbXNnbGVuX3QgbXNnX3FieXRlczsJCS8qIG1heCBudW1iZXIgb2YgYnl0ZXMgYWxsb3dlZCBvbiBxdWV1ZSAqLworICBfX3BpZF90IG1zZ19sc3BpZDsJCS8qIHBpZCBvZiBsYXN0IG1zZ3NuZCgpICovCisgIF9fcGlkX3QgbXNnX2xycGlkOwkJLyogcGlkIG9mIGxhc3QgbXNncmN2KCkgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ0OworICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDU7Cit9OworCisjaWZkZWYgX19VU0VfTUlTQworCisjIGRlZmluZSBtc2dfY2J5dGVzCV9fbXNnX2NieXRlcworCisvKiBpcGNzIGN0bCBjb21tYW5kcyAqLworIyBkZWZpbmUgTVNHX1NUQVQgMTEKKyMgZGVmaW5lIE1TR19JTkZPIDEyCisKKy8qIGJ1ZmZlciBmb3IgbXNnY3RsIGNhbGxzIElQQ19JTkZPLCBNU0dfSU5GTyAqLworc3RydWN0IG1zZ2luZm8KKyAgeworICAgIGludCBtc2dwb29sOworICAgIGludCBtc2dtYXA7CisgICAgaW50IG1zZ21heDsKKyAgICBpbnQgbXNnbW5iOworICAgIGludCBtc2dtbmk7CisgICAgaW50IG1zZ3NzejsKKyAgICBpbnQgbXNndHFsOworICAgIHVuc2lnbmVkIHNob3J0IGludCBtc2dzZWc7CisgIH07CisKKyNlbmRpZiAvKiBfX1VTRV9NSVNDICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbmFuLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbmFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlOTdmMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9uYW4uaApAQCAtMCwwICsxLDUzIEBACisvKiBgTkFOJyBjb25zdGFudCBmb3IgSUVFRSA3NTQgbWFjaGluZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5NiwxOTk3LDE5OTksMjAwNCwyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NQVRIX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9uYW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG1hdGguaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBJRUVFIE5vdCBBIE51bWJlci4gICovCisKKyNpZiBfX0dOVUNfUFJFUkVRKDMsMykKKworIyBkZWZpbmUgTkFOCShfX2J1aWx0aW5fbmFuZiAoIiIpKQorCisjZWxpZiBkZWZpbmVkIF9fR05VQ19fCisKKyMgZGVmaW5lIE5BTiBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICgodW5pb24geyB1bnNpZ25lZCBfX2wgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX1NJX18pKSk7IGZsb2F0IF9fZDsgfSkgIFwKKyAgICB7IF9fbDogMHg3ZmMwMDAwMFVMIH0pLl9fZCkKKworI2Vsc2UKKworIyBpbmNsdWRlIDxlbmRpYW4uaD4KKworIyBpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjICBkZWZpbmUgX19uYW5fYnl0ZXMJCXsgMHg3ZiwgMHhjMCwgMCwgMCB9CisjIGVuZGlmCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgIGRlZmluZSBfX25hbl9ieXRlcwkJeyAwLCAwLCAweGMwLCAweDdmIH0KKyMgZW5kaWYKKworc3RhdGljIHVuaW9uIHsgdW5zaWduZWQgY2hhciBfX2NbNF07IGZsb2F0IF9fZDsgfSBfX25hbl91bmlvbgorICAgIF9fYXR0cmlidXRlX3VzZWRfXyA9IHsgX19uYW5fYnl0ZXMgfTsKKyMgZGVmaW5lIE5BTgkoX19uYW5fdW5pb24uX19kKQorCisjZW5kaWYJLyogR0NDLiAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9uZXRkYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL25ldGRiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkYzczMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9uZXRkYi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUREJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9uZXRkYi5oPiBkaXJlY3RseTsgdXNlIDxuZXRkYi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKy8qIERlc2NyaXB0aW9uIG9mIGRhdGEgYmFzZSBlbnRyeSBmb3IgYSBzaW5nbGUgbmV0d29yay4gIE5PVEU6IGhlcmUgYQorICAgcG9vciBhc3N1bXB0aW9uIGlzIG1hZGUuICBUaGUgbmV0d29yayBudW1iZXIgaXMgZXhwZWN0ZWQgdG8gZml0CisgICBpbnRvIGFuIHVuc2lnbmVkIGxvbmcgaW50IHZhcmlhYmxlLiAgKi8KK3N0cnVjdCBuZXRlbnQKK3sKKyAgY2hhciAqbl9uYW1lOwkJCS8qIE9mZmljaWFsIG5hbWUgb2YgbmV0d29yay4gICovCisgIGNoYXIgKipuX2FsaWFzZXM7CQkvKiBBbGlhcyBsaXN0LiAgKi8KKyAgaW50IG5fYWRkcnR5cGU7CQkvKiBOZXQgYWRkcmVzcyB0eXBlLiAgKi8KKyAgdWludDMyX3Qgbl9uZXQ7CQkvKiBOZXR3b3JrIG51bWJlci4gICovCit9OwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3BvbGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkNzVjYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wb2xsLmgKQEAgLTAsMCArMSw1MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAxLCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUE9MTF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvcG9sbC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3lzL3BvbGwuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogRXZlbnQgdHlwZXMgdGhhdCBjYW4gYmUgcG9sbGVkIGZvci4gIFRoZXNlIGJpdHMgbWF5IGJlIHNldCBpbiBgZXZlbnRzJworICAgdG8gaW5kaWNhdGUgdGhlIGludGVyZXN0aW5nIGV2ZW50IHR5cGVzOyB0aGV5IHdpbGwgYXBwZWFyIGluIGByZXZlbnRzJworICAgdG8gaW5kaWNhdGUgdGhlIHN0YXR1cyBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KKyNkZWZpbmUgUE9MTElOCQkweDAwMQkJLyogVGhlcmUgaXMgZGF0YSB0byByZWFkLiAgKi8KKyNkZWZpbmUgUE9MTFBSSQkJMHgwMDIJCS8qIFRoZXJlIGlzIHVyZ2VudCBkYXRhIHRvIHJlYWQuICAqLworI2RlZmluZSBQT0xMT1VUCQkweDAwNAkJLyogV3JpdGluZyBub3cgd2lsbCBub3QgYmxvY2suICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisvKiBUaGVzZSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gWFBHNC4yLiAgKi8KKyMgZGVmaW5lIFBPTExSRE5PUk0JMHgwNDAJCS8qIE5vcm1hbCBkYXRhIG1heSBiZSByZWFkLiAgKi8KKyMgZGVmaW5lIFBPTExSREJBTkQJMHgwODAJCS8qIFByaW9yaXR5IGRhdGEgbWF5IGJlIHJlYWQuICAqLworIyBkZWZpbmUgUE9MTFdSTk9STQkweDEwMAkJLyogV3JpdGluZyBub3cgd2lsbCBub3QgYmxvY2suICAqLworIyBkZWZpbmUgUE9MTFdSQkFORAkweDIwMAkJLyogUHJpb3JpdHkgZGF0YSBtYXkgYmUgd3JpdHRlbi4gICovCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhlc2UgYXJlIGV4dGVuc2lvbnMgZm9yIExpbnV4LiAgKi8KKyMgZGVmaW5lIFBPTExNU0cJMHg0MDAKKyMgZGVmaW5lIFBPTExSRU1PVkUJMHgxMDAwCisjIGRlZmluZSBQT0xMUkRIVVAJMHgyMDAwCisjZW5kaWYKKworLyogRXZlbnQgdHlwZXMgYWx3YXlzIGltcGxpY2l0bHkgcG9sbGVkIGZvci4gIFRoZXNlIGJpdHMgbmVlZCBub3QgYmUgc2V0IGluCisgICBgZXZlbnRzJywgYnV0IHRoZXkgd2lsbCBhcHBlYXIgaW4gYHJldmVudHMnIHRvIGluZGljYXRlIHRoZSBzdGF0dXMgb2YKKyAgIHRoZSBmaWxlIGRlc2NyaXB0b3IuICAqLworI2RlZmluZSBQT0xMRVJSCQkweDAwOAkJLyogRXJyb3IgY29uZGl0aW9uLiAgKi8KKyNkZWZpbmUgUE9MTEhVUAkJMHgwMTAJCS8qIEh1bmcgdXAuICAqLworI2RlZmluZSBQT0xMTlZBTAkweDAyMAkJLyogSW52YWxpZCBwb2xsaW5nIHJlcXVlc3QuICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3Bvc2l4MV9saW0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wb3NpeDFfbGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlYjQzMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wb3NpeDFfbGltLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTkzLDk2LDk4LDIwMDAtMjAwMywyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDIuOS4yIE1pbmltdW0gVmFsdWVzCUFkZGVkIHRvIDxsaW1pdHMuaD4KKyAqCisgKglOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseTsgdXNlIDxsaW1pdHMuaD4gaW5zdGVhZC4KKyAqLworCisjaWZuZGVmCV9CSVRTX1BPU0lYMV9MSU1fSAorI2RlZmluZQlfQklUU19QT1NJWDFfTElNX0gJMQorCisKKy8qIFRoZXNlIGFyZSB0aGUgc3RhbmRhcmQtbWFuZGF0ZWQgbWluaW11bSB2YWx1ZXMuICAqLworCisvKiBNaW5pbXVtIG51bWJlciBvZiBvcGVyYXRpb25zIGluIG9uZSBsaXN0IEkvTyBjYWxsLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0FJT19MSVNUSU9fTUFYCTIKKworLyogTWluaW1hbCBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgYXN5bmNocm9ub3VzIEkvTyBvcGVyYXRpb25zLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0FJT19NQVgJCTEKKworLyogTWF4aW11bSBsZW5ndGggb2YgYXJndW1lbnRzIHRvIGBleGVjdmUnLCBpbmNsdWRpbmcgZW52aXJvbm1lbnQuICAqLworI2RlZmluZQlfUE9TSVhfQVJHX01BWAkJNDA5NgorCisvKiBNYXhpbXVtIHNpbXVsdGFuZW91cyBwcm9jZXNzZXMgcGVyIHJlYWwgdXNlciBJRC4gICovCisjaWZkZWYgX19VU0VfWE9QRU4ySworIyBkZWZpbmUgX1BPU0lYX0NISUxEX01BWAkyNQorI2Vsc2UKKyMgZGVmaW5lIF9QT1NJWF9DSElMRF9NQVgJNgorI2VuZGlmCisKKy8qIE1pbmltYWwgbnVtYmVyIG9mIHRpbWVyIGV4cGlyYXRpb24gb3ZlcnJ1bnMuICAqLworI2RlZmluZSBfUE9TSVhfREVMQVlUSU1FUl9NQVgJMzIKKworLyogTWF4aW11bSBsZW5ndGggb2YgYSBob3N0IG5hbWUgKG5vdCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIG51bGwpCisgICBhcyByZXR1cm5lZCBmcm9tIHRoZSBHRVRIT1NUTkFNRSBmdW5jdGlvbi4gICovCisjZGVmaW5lIF9QT1NJWF9IT1NUX05BTUVfTUFYCTI1NQorCisvKiBNYXhpbXVtIGxpbmsgY291bnQgb2YgYSBmaWxlLiAgKi8KKyNkZWZpbmUJX1BPU0lYX0xJTktfTUFYCQk4CisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGxvZ2luIG5hbWUuICAqLworI2RlZmluZQlfUE9TSVhfTE9HSU5fTkFNRV9NQVgJOQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gYSB0ZXJtaW5hbCBjYW5vbmljYWwgaW5wdXQgcXVldWUuICAqLworI2RlZmluZQlfUE9TSVhfTUFYX0NBTk9OCTI1NQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgZm9yIHdoaWNoIHNwYWNlIHdpbGwgYmUKKyAgIGF2YWlsYWJsZSBpbiBhIHRlcm1pbmFsIGlucHV0IHF1ZXVlLiAgKi8KKyNkZWZpbmUJX1BPU0lYX01BWF9JTlBVVAkyNTUKKworLyogTWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZSBxdWV1ZXMgb3BlbiBmb3IgYSBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX01RX09QRU5fTUFYCTgKKworLyogTWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIG1lc3NhZ2UgcHJpb3JpdGllcy4gICovCisjZGVmaW5lIF9QT1NJWF9NUV9QUklPX01BWAkzMgorCisvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gYSBmaWxlbmFtZS4gICovCisjZGVmaW5lCV9QT1NJWF9OQU1FX01BWAkJMTQKKworLyogTnVtYmVyIG9mIHNpbXVsdGFuZW91cyBzdXBwbGVtZW50YXJ5IGdyb3VwIElEcyBwZXIgcHJvY2Vzcy4gICovCisjaWZkZWYgX19VU0VfWE9QRU4ySworIyBkZWZpbmUgX1BPU0lYX05HUk9VUFNfTUFYCTgKKyNlbHNlCisjIGRlZmluZSBfUE9TSVhfTkdST1VQU19NQVgJMAorI2VuZGlmCisKKy8qIE51bWJlciBvZiBmaWxlcyBvbmUgcHJvY2VzcyBjYW4gaGF2ZSBvcGVuIGF0IG9uY2UuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIF9QT1NJWF9PUEVOX01BWAkyMAorI2Vsc2UKKyMgZGVmaW5lIF9QT1NJWF9PUEVOX01BWAkxNgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLIHx8IGRlZmluZWQgX19VU0VfR05VCisvKiBOdW1iZXIgb2YgZGVzY3JpcHRvcnMgdGhhdCBhIHByb2Nlc3MgbWF5IGV4YW1pbmUgd2l0aCBgcHNlbGVjdCcgb3IKKyAgIGBzZWxlY3QnLiAgKi8KKyMgZGVmaW5lIF9QT1NJWF9GRF9TRVRTSVpFCV9QT1NJWF9PUEVOX01BWAorI2VuZGlmCisKKy8qIE51bWJlciBvZiBieXRlcyBpbiBhIHBhdGhuYW1lLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1BBVEhfTUFYCQkyNTYKKworLyogTnVtYmVyIG9mIGJ5dGVzIHRoYW4gY2FuIGJlIHdyaXR0ZW4gYXRvbWljYWxseSB0byBhIHBpcGUuICAqLworI2RlZmluZQlfUE9TSVhfUElQRV9CVUYJCTUxMgorCisvKiBUaGUgbnVtYmVyIG9mIHJlcGVhdGVkIG9jY3VycmVuY2VzIG9mIGEgQlJFIHBlcm1pdHRlZCBieSB0aGUKKyAgIFJFR0VYRUMgYW5kIFJFR0NPTVAgZnVuY3Rpb25zIHdoZW4gdXNpbmcgdGhlIGludGVydmFsIG5vdGF0aW9uLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1JFX0RVUF9NQVgJMjU1CisKKy8qIE1pbmltYWwgbnVtYmVyIG9mIHJlYWx0aW1lIHNpZ25hbHMgcmVzZXJ2ZWQgZm9yIHRoZSBhcHBsaWNhdGlvbi4gICovCisjZGVmaW5lIF9QT1NJWF9SVFNJR19NQVgJOAorCisvKiBOdW1iZXIgb2Ygc2VtYXBob3JlcyBhIHByb2Nlc3MgY2FuIGhhdmUuICAqLworI2RlZmluZSBfUE9TSVhfU0VNX05TRU1TX01BWAkyNTYKKworLyogTWF4aW1hbCB2YWx1ZSBvZiBhIHNlbWFwaG9yZS4gICovCisjZGVmaW5lIF9QT1NJWF9TRU1fVkFMVUVfTUFYCTMyNzY3CisKKy8qIE51bWJlciBvZiBwZW5kaW5nIHJlYWx0aW1lIHNpZ25hbHMuICAqLworI2RlZmluZSBfUE9TSVhfU0lHUVVFVUVfTUFYCTMyCisKKy8qIExhcmdlc3QgdmFsdWUgb2YgYSBgc3NpemVfdCcuICAqLworI2RlZmluZQlfUE9TSVhfU1NJWkVfTUFYCTMyNzY3CisKKy8qIE51bWJlciBvZiBzdHJlYW1zIGEgcHJvY2VzcyBjYW4gaGF2ZSBvcGVuIGF0IG9uY2UuICAqLworI2RlZmluZQlfUE9TSVhfU1RSRUFNX01BWAk4CisKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBzeW1ib2xpYyBsaW5rLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NZTUxJTktfTUFYCTI1NQorCisvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbGljIGxpbmtzIHRoYXQgY2FuIGJlIHRyYXZlcnNlZCBpbiB0aGUKKyAgIHJlc29sdXRpb24gb2YgYSBwYXRobmFtZSBpbiB0aGUgYWJzZW5jZSBvZiBhIGxvb3AuICAqLworI2RlZmluZSBfUE9TSVhfU1lNTE9PUF9NQVgJOAorCisvKiBOdW1iZXIgb2YgdGltZXIgZm9yIGEgcHJvY2Vzcy4gICovCisjZGVmaW5lIF9QT1NJWF9USU1FUl9NQVgJMzIKKworLyogTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIHR0eSBuYW1lLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1RUWV9OQU1FX01BWAk5CisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGEgdGltZXpvbmUgbmFtZSAoZWxlbWVudCBvZiBgdHpuYW1lJykuICAqLworI2RlZmluZQlfUE9TSVhfVFpOQU1FX01BWAk2CisKKyNpZiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLIHx8IGRlZmluZWQgX19VU0VfR05VCisvKiBNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IGNhbiBiZSBxdWV1ZWQgb24gYSBzb2NrZXQuICAqLworIyBkZWZpbmUgX1BPU0lYX1FMSU1JVAkJMQorCisvKiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSBidWZmZXJlZCBvbiBhIHNvY2tldCBmb3Igc2VuZAorICAgb3IgcmVjZWl2ZS4gICovCisjIGRlZmluZSBfUE9TSVhfSElXQVQJCV9QT1NJWF9QSVBFX0JVRgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBgaW92ZWMnIGFycmF5LiAgKi8KKyMgZGVmaW5lIF9QT1NJWF9VSU9fTUFYSU9WCTE2CisjZW5kaWYKKworLyogTWF4aW11bSBjbG9jayByZXNvbHV0aW9uIGluIG5hbm9zZWNvbmRzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0NMT0NLUkVTX01JTgkyMDAwMDAwMAorCisKKy8qIEdldCB0aGUgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgYWJvdmUuICAqLworI2luY2x1ZGUgPGJpdHMvbG9jYWxfbGltLmg+CisKKworI2lmbmRlZglTU0laRV9NQVgKKyMgZGVmaW5lIFNTSVpFX01BWAlMT05HX01BWAorI2VuZGlmCisKKworLyogVGhpcyB2YWx1ZSBpcyBhIGd1YXJhbnRlZWQgbWluaW11bSBtYXhpbXVtLgorICAgVGhlIGN1cnJlbnQgbWF4aW11bSBjYW4gYmUgZ290IGZyb20gYHN5c2NvbmYnLiAgKi8KKworI2lmbmRlZglOR1JPVVBTX01BWAorIyBkZWZpbmUgTkdST1VQU19NQVgJOAorI2VuZGlmCisKKyNlbmRpZgkvKiBiaXRzL3Bvc2l4MV9saW0uaCAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wb3NpeDJfbGltLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcG9zaXgyX2xpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDgzYTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcG9zaXgyX2xpbS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NiwgMTk5OSwgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIE5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5OyBpbmNsdWRlIDxsaW1pdHMuaD4gaW5zdGVhZC4KKyAqLworCisjaWZuZGVmCV9CSVRTX1BPU0lYMl9MSU1fSAorI2RlZmluZQlfQklUU19QT1NJWDJfTElNX0gJMQorCisKKy8qIFRoZSBtYXhpbXVtIGBpYmFzZScgYW5kIGBvYmFzZScgdmFsdWVzIGFsbG93ZWQgYnkgdGhlIGBiYycgdXRpbGl0eS4gICovCisjZGVmaW5lCV9QT1NJWDJfQkNfQkFTRV9NQVgJCTk5CisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBhbGxvd2VkIGluIGFuIGFycmF5IGJ5IHRoZSBgYmMnIHV0aWxpdHkuICAqLworI2RlZmluZQlfUE9TSVgyX0JDX0RJTV9NQVgJCTIwNDgKKworLyogVGhlIG1heGltdW0gYHNjYWxlJyB2YWx1ZSBhbGxvd2VkIGJ5IHRoZSBgYmMnIHV0aWxpdHkuICAqLworI2RlZmluZQlfUE9TSVgyX0JDX1NDQUxFX01BWAkJOTkKKworLyogVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc3RyaW5nIGNvbnN0YW50IGFjY2VwdGVkIGJ5IHRoZSBgYmMnIHV0aWxpdHkuICAqLworI2RlZmluZQlfUE9TSVgyX0JDX1NUUklOR19NQVgJCTEwMDAKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIHdlaWdodHMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gYW4gZW50cnkgb2YKKyAgIHRoZSBMQ19DT0xMQVRFIGBvcmRlcicga2V5d29yZCBpbiB0aGUgbG9jYWxlIGRlZmluaXRpb24gZmlsZS4gICovCisjZGVmaW5lCV9QT1NJWDJfQ09MTF9XRUlHSFRTX01BWAkyCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBleHByZXNzaW9ucyB0aGF0IGNhbiBiZSBuZXN0ZWQKKyAgIHdpdGhpbiBwYXJlbnRoZXNlcyBieSB0aGUgYGV4cHInIHV0aWxpdHkuICAqLworI2RlZmluZQlfUE9TSVgyX0VYUFJfTkVTVF9NQVgJCTMyCisKKy8qIFRoZSBtYXhpbXVtIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIGFuIGlucHV0IGxpbmUuICAqLworI2RlZmluZQlfUE9TSVgyX0xJTkVfTUFYCQkyMDQ4CisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXBlYXRlZCBvY2N1cnJlbmNlcyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgcGVybWl0dGVkIHdoZW4gdXNpbmcgdGhlIGludGVydmFsIG5vdGF0aW9uIGBce00sTlx9Jy4gICovCisjZGVmaW5lCV9QT1NJWDJfUkVfRFVQX01BWAkJMjU1CisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBpbiBhIGNoYXJhY3RlciBjbGFzcyBuYW1lLiAgV2UgaGF2ZSBubworICAgZml4ZWQgbGltaXQsIDIwNDggaXMgYSBoaWdoIG51bWJlci4gICovCisjZGVmaW5lCV9QT1NJWDJfQ0hBUkNMQVNTX05BTUVfTUFYCTE0CisKKworLyogVGhlc2UgdmFsdWVzIGFyZSBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYywKKyAgIGFuZCBtYXkgdmFyeSB3aXRoaW4gdGhlIGltcGxlbWVudGF0aW9uLgorICAgVGhlaXIgcHJlY2lzZSB2YWx1ZXMgY2FuIGJlIG9idGFpbmVkIGZyb20gc3lzY29uZi4gICovCisKKyNpZm5kZWYJQkNfQkFTRV9NQVgKKyNkZWZpbmUJQkNfQkFTRV9NQVgJCV9QT1NJWDJfQkNfQkFTRV9NQVgKKyNlbmRpZgorI2lmbmRlZglCQ19ESU1fTUFYCisjZGVmaW5lCUJDX0RJTV9NQVgJCV9QT1NJWDJfQkNfRElNX01BWAorI2VuZGlmCisjaWZuZGVmCUJDX1NDQUxFX01BWAorI2RlZmluZQlCQ19TQ0FMRV9NQVgJCV9QT1NJWDJfQkNfU0NBTEVfTUFYCisjZW5kaWYKKyNpZm5kZWYJQkNfU1RSSU5HX01BWAorI2RlZmluZQlCQ19TVFJJTkdfTUFYCQlfUE9TSVgyX0JDX1NUUklOR19NQVgKKyNlbmRpZgorI2lmbmRlZglDT0xMX1dFSUdIVFNfTUFYCisjZGVmaW5lCUNPTExfV0VJR0hUU19NQVgJMjU1CisjZW5kaWYKKyNpZm5kZWYJRVhQUl9ORVNUX01BWAorI2RlZmluZQlFWFBSX05FU1RfTUFYCQlfUE9TSVgyX0VYUFJfTkVTVF9NQVgKKyNlbmRpZgorI2lmbmRlZglMSU5FX01BWAorI2RlZmluZQlMSU5FX01BWAkJX1BPU0lYMl9MSU5FX01BWAorI2VuZGlmCisjaWZuZGVmCUNIQVJDTEFTU19OQU1FX01BWAorI2RlZmluZQlDSEFSQ0xBU1NfTkFNRV9NQVgJMjA0OAorI2VuZGlmCisKKy8qIFRoaXMgdmFsdWUgaXMgZGVmaW5lZCBsaWtlIHRoaXMgaW4gcmVnZXguaC4gICovCisjZGVmaW5lCVJFX0RVUF9NQVggKDB4N2ZmZikKKworI2VuZGlmCS8qIGJpdHMvcG9zaXgyX2xpbS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcG9zaXhfb3B0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcG9zaXhfb3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1MDM1NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wb3NpeF9vcHQuaApAQCAtMCwwICsxLDE5MiBAQAorLyogRGVmaW5lIFBPU0lYIG9wdGlvbnMgZm9yIExpbnV4LgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDQsIDIwMDYsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZglfQklUU19QT1NJWF9PUFRfSAorI2RlZmluZQlfQklUU19QT1NJWF9PUFRfSAkxCisKKy8qIEpvYiBjb250cm9sIGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lCV9QT1NJWF9KT0JfQ09OVFJPTAkxCisKKy8qIFByb2Nlc3NlcyBoYXZlIGEgc2F2ZWQgc2V0LXVzZXItSUQgYW5kIGEgc2F2ZWQgc2V0LWdyb3VwLUlELiAgKi8KKyNkZWZpbmUJX1BPU0lYX1NBVkVEX0lEUwkxCisKKy8qIFByaW9yaXR5IHNjaGVkdWxpbmcgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcJMjAwODA5TAorCisvKiBTeW5jaHJvbml6aW5nIGZpbGUgZGF0YSBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfU1lOQ0hST05JWkVEX0lPCTIwMDgwOUwKKworLyogVGhlIGZzeW5jIGZ1bmN0aW9uIGlzIHByZXNlbnQuICAqLworI2RlZmluZQlfUE9TSVhfRlNZTkMJMjAwODA5TAorCisvKiBNYXBwaW5nIG9mIGZpbGVzIHRvIG1lbW9yeSBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfTUFQUEVEX0ZJTEVTCTIwMDgwOUwKKworLyogTG9ja2luZyBvZiBhbGwgbWVtb3J5IGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lCV9QT1NJWF9NRU1MT0NLCTIwMDgwOUwKKworLyogTG9ja2luZyBvZiByYW5nZXMgb2YgbWVtb3J5IGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lCV9QT1NJWF9NRU1MT0NLX1JBTkdFCTIwMDgwOUwKKworLyogU2V0dGluZyBvZiBtZW1vcnkgcHJvdGVjdGlvbnMgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUJX1BPU0lYX01FTU9SWV9QUk9URUNUSU9OCTIwMDgwOUwKKworLyogU29tZSBmaWxlc3lzdGVtcyBhbGxvdyBhbGwgdXNlcnMgdG8gY2hhbmdlIGZpbGUgb3duZXJzaGlwLiAgKi8KKyNkZWZpbmUJX1BPU0lYX0NIT1dOX1JFU1RSSUNURUQJMAorCisvKiBgY19jYycgbWVtYmVyIG9mICdzdHJ1Y3QgdGVybWlvcycgc3RydWN0dXJlIGNhbiBiZSBkaXNhYmxlZCBieQorICAgdXNpbmcgdGhlIHZhbHVlIF9QT1NJWF9WRElTQUJMRS4gICovCisjZGVmaW5lCV9QT1NJWF9WRElTQUJMRQknXDAnCisKKy8qIEZpbGVuYW1lcyBhcmUgbm90IHNpbGVudGx5IHRydW5jYXRlZC4gICovCisjZGVmaW5lCV9QT1NJWF9OT19UUlVOQwkxCisKKy8qIFgvT3BlbiByZWFsdGltZSBzdXBwb3J0IGlzIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9YT1BFTl9SRUFMVElNRQkxCisKKy8qIFgvT3BlbiB0aHJlYWQgcmVhbHRpbWUgc3VwcG9ydCBpcyBhdmFpbGFibGUuICAqLworI2RlZmluZSBfWE9QRU5fUkVBTFRJTUVfVEhSRUFEUwkxCisKKy8qIFhQRzQuMiBzaGFyZWQgbWVtb3J5IGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lCV9YT1BFTl9TSE0JMQorCisvKiBUZWxsIHdlIGhhdmUgUE9TSVggdGhyZWFkcy4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURTCTIwMDgwOUwKKworLyogV2UgaGF2ZSB0aGUgcmVlbnRyYW50IGZ1bmN0aW9ucyBkZXNjcmliZWQgaW4gUE9TSVguICAqLworI2RlZmluZSBfUE9TSVhfUkVFTlRSQU5UX0ZVTkNUSU9OUyAgICAgIDEKKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUwkyMDA4MDlMCisKKy8qIFdlIHByb3ZpZGUgcHJpb3JpdHkgc2NoZWR1bGluZyBmb3IgdGhyZWFkcy4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORwkyMDA4MDlMCisKKy8qIFdlIHN1cHBvcnQgdXNlci1kZWZpbmVkIHN0YWNrIHNpemVzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQkyMDA4MDlMCisKKy8qIFdlIHN1cHBvcnQgdXNlci1kZWZpbmVkIHN0YWNrcy4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS0FERFIJMjAwODA5TAorCisvKiBXZSBzdXBwb3J0IHByaW9yaXR5IGluaGVyaXRlbmNlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9QUklPX0lOSEVSSVQJMjAwODA5TAorCisvKiBXZSBzdXBwb3J0IHByaW9yaXR5IHByb3RlY3Rpb24sIHRob3VnaCBvbmx5IGZvciBub24tcm9idXN0CisgICBtdXRleGVzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9QUklPX1BST1RFQ1QJMjAwODA5TAorCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKy8qIFdlIHN1cHBvcnQgcHJpb3JpdHkgaW5oZXJpdGVuY2UgZm9yIHJvYnVzdCBtdXRleGVzLiAgKi8KKyMgZGVmaW5lIF9QT1NJWF9USFJFQURfUk9CVVNUX1BSSU9fSU5IRVJJVAkyMDA4MDlMCisKKy8qIFdlIGRvIG5vdCBzdXBwb3J0IHByaW9yaXR5IHByb3RlY3Rpb24gZm9yIHJvYnVzdCBtdXRleGVzLiAgKi8KKyMgZGVmaW5lIF9QT1NJWF9USFJFQURfUk9CVVNUX1BSSU9fUFJPVEVDVAktMQorI2VuZGlmCisKKy8qIFdlIHN1cHBvcnQgUE9TSVguMWIgc2VtYXBob3Jlcy4gICovCisjZGVmaW5lIF9QT1NJWF9TRU1BUEhPUkVTCTIwMDgwOUwKKworLyogUmVhbC10aW1lIHNpZ25hbHMgYXJlIHN1cHBvcnRlZC4gICovCisjZGVmaW5lIF9QT1NJWF9SRUFMVElNRV9TSUdOQUxTCTIwMDgwOUwKKworLyogV2Ugc3VwcG9ydCBhc3luY2hyb25vdXMgSS9PLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0FTWU5DSFJPTk9VU19JTwkyMDA4MDlMCisjZGVmaW5lIF9QT1NJWF9BU1lOQ19JTwkJMQorLyogQWx0ZXJuYXRpdmUgbmFtZSBmb3IgVW5peDk4LiAgKi8KKyNkZWZpbmUgX0xGU19BU1lOQ0hST05PVVNfSU8JMQorLyogU3VwcG9ydCBmb3IgcHJpb3JpdGl6YXRpb24gaXMgYWxzbyBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfUFJJT1JJVElaRURfSU8JMjAwODA5TAorCisvKiBUaGUgTEZTIHN1cHBvcnQgaW4gYXN5bmNocm9ub3VzIEkvTyBpcyBhbHNvIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9MRlM2NF9BU1lOQ0hST05PVVNfSU8JMQorCisvKiBUaGUgcmVzdCBvZiB0aGUgTEZTIGlzIGFsc28gYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX0xGU19MQVJHRUZJTEUJCTEKKyNkZWZpbmUgX0xGUzY0X0xBUkdFRklMRQkxCisjZGVmaW5lIF9MRlM2NF9TVERJTwkJMQorCisvKiBQT1NJWCBzaGFyZWQgbWVtb3J5IG9iamVjdHMgYXJlIGltcGxlbWVudGVkLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NIQVJFRF9NRU1PUllfT0JKRUNUUwkyMDA4MDlMCisKKy8qIENQVS10aW1lIGNsb2NrcyBzdXBwb3J0IG5lZWRzIHRvIGJlIGNoZWNrZWQgYXQgcnVudGltZS4gICovCisjZGVmaW5lIF9QT1NJWF9DUFVUSU1FCTAKKworLyogQ2xvY2sgc3VwcG9ydCBpbiB0aHJlYWRzIG11c3QgYmUgYWxzbyBjaGVja2VkIGF0IHJ1bnRpbWUuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX0NQVVRJTUUJMAorCisvKiBHTlUgbGliYyBwcm92aWRlcyByZWd1bGFyIGV4cHJlc3Npb24gaGFuZGxpbmcuICAqLworI2RlZmluZSBfUE9TSVhfUkVHRVhQCTEKKworLyogUmVhZGVyL1dyaXRlciBsb2NrcyBhcmUgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1JFQURFUl9XUklURVJfTE9DS1MJMjAwODA5TAorCisvKiBXZSBoYXZlIGEgUE9TSVggc2hlbGwuICAqLworI2RlZmluZSBfUE9TSVhfU0hFTEwJMQorCisvKiBXZSBzdXBwb3J0IHRoZSBUaW1lb3V0cyBvcHRpb24uICAqLworI2RlZmluZSBfUE9TSVhfVElNRU9VVFMJMjAwODA5TAorCisvKiBXZSBzdXBwb3J0IHNwaW5sb2Nrcy4gICovCisjZGVmaW5lIF9QT1NJWF9TUElOX0xPQ0tTCTIwMDgwOUwKKworLyogVGhlIGBzcGF3bicgZnVuY3Rpb24gZmFtaWx5IGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lIF9QT1NJWF9TUEFXTgkyMDA4MDlMCisKKy8qIFdlIGhhdmUgUE9TSVggdGltZXJzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RJTUVSUwkyMDA4MDlMCisKKy8qIFRoZSBiYXJyaWVyIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0JBUlJJRVJTCTIwMDgwOUwKKworLyogUE9TSVggbWVzc2FnZSBxdWV1ZXMgYXJlIGF2YWlsYWJsZS4gICovCisjZGVmaW5lCV9QT1NJWF9NRVNTQUdFX1BBU1NJTkcJMjAwODA5TAorCisvKiBUaHJlYWQgcHJvY2Vzcy1zaGFyZWQgc3luY2hyb25pemF0aW9uIGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfUFJPQ0VTU19TSEFSRUQJMjAwODA5TAorCisvKiBUaGUgbW9ub3RvbmljIGNsb2NrIG1pZ2h0IGJlIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9NT05PVE9OSUNfQ0xPQ0sJMAorCisvKiBUaGUgY2xvY2sgc2VsZWN0aW9uIGludGVyZmFjZXMgYXJlIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9DTE9DS19TRUxFQ1RJT04JMjAwODA5TAorCisvKiBBZHZpc29yeSBpbmZvcm1hdGlvbiBpbnRlcmZhY2VzIGFyZSBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfQURWSVNPUllfSU5GTwkyMDA4MDlMCisKKy8qIElQdjYgc3VwcG9ydCBpcyBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfSVBWNgkyMDA4MDlMCisKKy8qIFJhdyBzb2NrZXQgc3VwcG9ydCBpcyBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfUkFXX1NPQ0tFVFMJMjAwODA5TAorCisvKiBXZSBoYXZlIGF0IGxlYXN0IG9uZSB0ZXJtaW5hbC4gICovCisjZGVmaW5lIF9QT1NJWDJfQ0hBUl9URVJNCTIwMDgwOUwKKworLyogTmVpdGhlciBwcm9jZXNzIG5vciB0aHJlYWQgc3BvcmFkaWMgc2VydmVyIGludGVyZmFjZXMgaXMgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NQT1JBRElDX1NFUlZFUgktMQorI2RlZmluZSBfUE9TSVhfVEhSRUFEX1NQT1JBRElDX1NFUlZFUgktMQorCisvKiB0cmFjZS5oIGlzIG5vdCBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfVFJBQ0UJLTEKKyNkZWZpbmUgX1BPU0lYX1RSQUNFX0VWRU5UX0ZJTFRFUgktMQorI2RlZmluZSBfUE9TSVhfVFJBQ0VfSU5IRVJJVAktMQorI2RlZmluZSBfUE9TSVhfVFJBQ0VfTE9HCS0xCisKKy8qIFR5cGVkIG1lbW9yeSBvYmplY3RzIGFyZSBub3QgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RZUEVEX01FTU9SWV9PQkpFQ1RTCS0xCisKKyNlbmRpZiAvKiBiaXRzL3Bvc2l4X29wdC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcHJlZGVmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3ByZWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjA0ODRhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3ByZWRlZnMuaApAQCAtMCwwICsxLDMwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0ZFQVRVUkVTX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9wcmVkZWZzLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxmZWF0dXJlcy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9QUkVERUZTX0gKKyNkZWZpbmUgX1BSRURFRlNfSAorCisvKiBXZSBkbyBzdXBwb3J0IHRoZSBJRUMgNTU5IG1hdGggZnVuY3Rpb25hbGl0eSwgcmVhbCBhbmQgY29tcGxleC4gICovCisjZGVmaW5lIF9fU1REQ19JRUNfNTU5X18JCTEKKyNkZWZpbmUgX19TVERDX0lFQ181NTlfQ09NUExFWF9fCTEKKworI2VuZGlmIC8qIHByZWRlZnMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3ByaW50Zi1sZGJsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcHJpbnRmLWxkYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmRjM2YxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3ByaW50Zi1sZGJsLmgKQEAgLTAsMCArMSwyNCBAQAorLyogLW1sb25nLWRvdWJsZS02NCBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIDxwcmludGYuaD4gZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9QUklOVEZfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9wcmludGYtbGRibC5oPiBkaXJlY3RseTsgdXNlIDxwcmludGYuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworX19MREJMX1JFRElSX0RFQ0wgKHByaW50Zl9zaXplKQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3B0aHJlYWR0eXBlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3B0aHJlYWR0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllM2UwMTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcHRocmVhZHR5cGVzLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiwyMDAzLDIwMDQsMjAwNSwyMDA2LDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0JJVFNfUFRIUkVBRFRZUEVTX0gKKyNkZWZpbmUgX0JJVFNfUFRIUkVBRFRZUEVTX0gJMQorCisjZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQVRUUl9UIDM2CisjZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfTVVURVhfVCAyNAorI2RlZmluZSBfX1NJWkVPRl9QVEhSRUFEX01VVEVYQVRUUl9UIDQKKyNkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9DT05EX1QgNDgKKyNkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9DT05EX0NPTVBBVF9UIDEyCisjZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQ09OREFUVFJfVCA0CisjZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfUldMT0NLX1QgMzIKKyNkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9SV0xPQ0tBVFRSX1QgOAorI2RlZmluZSBfX1NJWkVPRl9QVEhSRUFEX0JBUlJJRVJfVCAyMAorI2RlZmluZSBfX1NJWkVPRl9QVEhSRUFEX0JBUlJJRVJBVFRSX1QgNAorCisKKy8qIFRocmVhZCBpZGVudGlmaWVycy4gIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlIGlzIG5vdAorICAgZXhwb3NlZCBvbiBwdXJwb3NlLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgcHRocmVhZF90OworCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfUFRIUkVBRF9BVFRSX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX2F0dHJfdDsKKworCit0eXBlZGVmIHN0cnVjdCBfX3B0aHJlYWRfaW50ZXJuYWxfc2xpc3QKK3sKKyAgc3RydWN0IF9fcHRocmVhZF9pbnRlcm5hbF9zbGlzdCAqX19uZXh0OworfSBfX3B0aHJlYWRfc2xpc3RfdDsKKworCisvKiBEYXRhIHN0cnVjdHVyZXMgZm9yIG11dGV4IGhhbmRsaW5nLiAgVGhlIHN0cnVjdHVyZSBvZiB0aGUgYXR0cmlidXRlCisgICB0eXBlIGlzIG5vdCBleHBvc2VkIG9uIHB1cnBvc2UuICAqLwordHlwZWRlZiB1bmlvbgoreworICBzdHJ1Y3QgX19wdGhyZWFkX211dGV4X3MKKyAgeworICAgIGludCBfX2xvY2s7CisgICAgdW5zaWduZWQgaW50IF9fY291bnQ7CisgICAgaW50IF9fb3duZXI7CisgICAgLyogS0lORCBtdXN0IHN0YXkgYXQgdGhpcyBwb3NpdGlvbiBpbiB0aGUgc3RydWN0dXJlIHRvIG1haW50YWluCisgICAgICAgYmluYXJ5IGNvbXBhdGliaWxpdHkuICAqLworICAgIGludCBfX2tpbmQ7CisgICAgdW5zaWduZWQgaW50IF9fbnVzZXJzOworICAgIF9fZXh0ZW5zaW9uX18gdW5pb24KKyAgICB7CisgICAgICBpbnQgX19zcGluczsKKyAgICAgIF9fcHRocmVhZF9zbGlzdF90IF9fbGlzdDsKKyAgICB9OworICB9IF9fZGF0YTsKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfUFRIUkVBRF9NVVRFWF9UXTsKKyAgbG9uZyBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9tdXRleF90OworCit0eXBlZGVmIHVuaW9uCit7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfTVVURVhBVFRSX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX211dGV4YXR0cl90OworCisKKy8qIERhdGEgc3RydWN0dXJlIGZvciBjb25kaXRpb25hbCB2YXJpYWJsZSBoYW5kbGluZy4gIFRoZSBzdHJ1Y3R1cmUgb2YKKyAgIHRoZSBhdHRyaWJ1dGUgdHlwZSBpcyBub3QgZXhwb3NlZCBvbiBwdXJwb3NlLiAgKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgc3RydWN0CisgIHsKKyAgICBpbnQgX19sb2NrOworICAgIHVuc2lnbmVkIGludCBfX2Z1dGV4OworICAgIF9fZXh0ZW5zaW9uX18gdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3RvdGFsX3NlcTsKKyAgICBfX2V4dGVuc2lvbl9fIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX193YWtldXBfc2VxOworICAgIF9fZXh0ZW5zaW9uX18gdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3dva2VuX3NlcTsKKyAgICB2b2lkICpfX211dGV4OworICAgIHVuc2lnbmVkIGludCBfX253YWl0ZXJzOworICAgIHVuc2lnbmVkIGludCBfX2Jyb2FkY2FzdF9zZXE7CisgIH0gX19kYXRhOworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX0NPTkRfVF07CisgIF9fZXh0ZW5zaW9uX18gbG9uZyBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX2NvbmRfdDsKKwordHlwZWRlZiB1bmlvbgoreworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX0NPTkRBVFRSX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX2NvbmRhdHRyX3Q7CisKKworLyogS2V5cyBmb3IgdGhyZWFkLXNwZWNpZmljIGRhdGEgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHB0aHJlYWRfa2V5X3Q7CisKKworLyogT25jZS1vbmx5IGV4ZWN1dGlvbiAqLwordHlwZWRlZiBpbnQgcHRocmVhZF9vbmNlX3Q7CisKKworI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIHJlYWQtd3JpdGUgbG9jayB2YXJpYWJsZSBoYW5kbGluZy4gIFRoZQorICAgc3RydWN0dXJlIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZSBpcyBub3QgZXhwb3NlZCBvbiBwdXJwb3NlLiAgKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgc3RydWN0CisgIHsKKyAgICBpbnQgX19sb2NrOworICAgIHVuc2lnbmVkIGludCBfX25yX3JlYWRlcnM7CisgICAgdW5zaWduZWQgaW50IF9fcmVhZGVyc193YWtldXA7CisgICAgdW5zaWduZWQgaW50IF9fd3JpdGVyX3dha2V1cDsKKyAgICB1bnNpZ25lZCBpbnQgX19ucl9yZWFkZXJzX3F1ZXVlZDsKKyAgICB1bnNpZ25lZCBpbnQgX19ucl93cml0ZXJzX3F1ZXVlZDsKKyAgICAvKiBGTEFHUyBtdXN0IHN0YXkgYXQgdGhpcyBwb3NpdGlvbiBpbiB0aGUgc3RydWN0dXJlIHRvIG1haW50YWluCisgICAgICAgYmluYXJ5IGNvbXBhdGliaWxpdHkuICAqLworICAgIHVuc2lnbmVkIGNoYXIgX19mbGFnczsKKyAgICB1bnNpZ25lZCBjaGFyIF9fc2hhcmVkOworICAgIHVuc2lnbmVkIGNoYXIgX19wYWQxOworICAgIHVuc2lnbmVkIGNoYXIgX19wYWQyOworICAgIGludCBfX3dyaXRlcjsKKyAgfSBfX2RhdGE7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfUldMT0NLX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX3J3bG9ja190OworCit0eXBlZGVmIHVuaW9uCit7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfUldMT0NLQVRUUl9UXTsKKyAgbG9uZyBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9yd2xvY2thdHRyX3Q7CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogUE9TSVggc3BpbmxvY2sgZGF0YSB0eXBlLiAgKi8KK3R5cGVkZWYgdm9sYXRpbGUgaW50IHB0aHJlYWRfc3BpbmxvY2tfdDsKKworCisvKiBQT1NJWCBiYXJyaWVycyBkYXRhIHR5cGUuICBUaGUgc3RydWN0dXJlIG9mIHRoZSB0eXBlIGlzCisgICBkZWxpYmVyYXRlbHkgbm90IGV4cG9zZWQuICAqLwordHlwZWRlZiB1bmlvbgoreworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX0JBUlJJRVJfVF07CisgIGxvbmcgaW50IF9fYWxpZ247Cit9IHB0aHJlYWRfYmFycmllcl90OworCit0eXBlZGVmIHVuaW9uCit7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfQkFSUklFUkFUVFJfVF07CisgIGludCBfX2FsaWduOworfSBwdGhyZWFkX2JhcnJpZXJhdHRyX3Q7CisjZW5kaWYKKworCisvKiBFeHRyYSBhdHRyaWJ1dGVzIGZvciB0aGUgY2xlYW51cCBmdW5jdGlvbnMuICAqLworI2RlZmluZSBfX2NsZWFudXBfZmN0X2F0dHJpYnV0ZSBfX2F0dHJpYnV0ZV9fICgoX19yZWdwYXJtX18gKDEpKSkKKworI2VuZGlmCS8qIGJpdHMvcHRocmVhZHR5cGVzLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9yZXNvdXJjZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2YzE5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9yZXNvdXJjZS5oCkBAIC0wLDAgKzEsMjY4IEBACisvKiBCaXQgdmFsdWVzICYgc3RydWN0dXJlcyBmb3IgcmVzb3VyY2UgbGltaXRzLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5Ni0yMDAwLCAyMDA0LCAyMDA1LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1JFU09VUkNFX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9yZXNvdXJjZS5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIFRyYW5zbXV0ZSBkZWZpbmVzIHRvIGVudW1lcmF0aW9ucy4gIFRoZSBtYWNybyByZS1kZWZpbml0aW9ucyBhcmUKKyAgIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgcHJvZ3JhbXMgd2FudCB0byB0ZXN0IGZvciBvcGVyYXRpbmcgc3lzdGVtCisgICBmZWF0dXJlcyB3aXRoICNpZmRlZiBSVVNBR0VfU0VMRi4gIEluIElTTyBDIHRoZSByZWZsZXhpdmUKKyAgIGRlZmluaXRpb24gaXMgYSBuby1vcC4gICovCisKKy8qIEtpbmRzIG9mIHJlc291cmNlIGxpbWl0LiAgKi8KK2VudW0gX19ybGltaXRfcmVzb3VyY2UKK3sKKyAgLyogUGVyLXByb2Nlc3MgQ1BVIGxpbWl0LCBpbiBzZWNvbmRzLiAgKi8KKyAgUkxJTUlUX0NQVSA9IDAsCisjZGVmaW5lIFJMSU1JVF9DUFUgUkxJTUlUX0NQVQorCisgIC8qIExhcmdlc3QgZmlsZSB0aGF0IGNhbiBiZSBjcmVhdGVkLCBpbiBieXRlcy4gICovCisgIFJMSU1JVF9GU0laRSA9IDEsCisjZGVmaW5lCVJMSU1JVF9GU0laRSBSTElNSVRfRlNJWkUKKworICAvKiBNYXhpbXVtIHNpemUgb2YgZGF0YSBzZWdtZW50LCBpbiBieXRlcy4gICovCisgIFJMSU1JVF9EQVRBID0gMiwKKyNkZWZpbmUJUkxJTUlUX0RBVEEgUkxJTUlUX0RBVEEKKworICAvKiBNYXhpbXVtIHNpemUgb2Ygc3RhY2sgc2VnbWVudCwgaW4gYnl0ZXMuICAqLworICBSTElNSVRfU1RBQ0sgPSAzLAorI2RlZmluZQlSTElNSVRfU1RBQ0sgUkxJTUlUX1NUQUNLCisKKyAgLyogTGFyZ2VzdCBjb3JlIGZpbGUgdGhhdCBjYW4gYmUgY3JlYXRlZCwgaW4gYnl0ZXMuICAqLworICBSTElNSVRfQ09SRSA9IDQsCisjZGVmaW5lCVJMSU1JVF9DT1JFIFJMSU1JVF9DT1JFCisKKyAgLyogTGFyZ2VzdCByZXNpZGVudCBzZXQgc2l6ZSwgaW4gYnl0ZXMuCisgICAgIFRoaXMgYWZmZWN0cyBzd2FwcGluZzsgcHJvY2Vzc2VzIHRoYXQgYXJlIGV4Y2VlZGluZyB0aGVpcgorICAgICByZXNpZGVudCBzZXQgc2l6ZSB3aWxsIGJlIG1vcmUgbGlrZWx5IHRvIGhhdmUgcGh5c2ljYWwgbWVtb3J5CisgICAgIHRha2VuIGZyb20gdGhlbS4gICovCisgIF9fUkxJTUlUX1JTUyA9IDUsCisjZGVmaW5lCVJMSU1JVF9SU1MgX19STElNSVRfUlNTCisKKyAgLyogTnVtYmVyIG9mIG9wZW4gZmlsZXMuICAqLworICBSTElNSVRfTk9GSUxFID0gNywKKyAgX19STElNSVRfT0ZJTEUgPSBSTElNSVRfTk9GSUxFLCAvKiBCU0QgbmFtZSBmb3Igc2FtZS4gICovCisjZGVmaW5lIFJMSU1JVF9OT0ZJTEUgUkxJTUlUX05PRklMRQorI2RlZmluZSBSTElNSVRfT0ZJTEUgX19STElNSVRfT0ZJTEUKKworICAvKiBBZGRyZXNzIHNwYWNlIGxpbWl0LiAgKi8KKyAgUkxJTUlUX0FTID0gOSwKKyNkZWZpbmUgUkxJTUlUX0FTIFJMSU1JVF9BUworCisgIC8qIE51bWJlciBvZiBwcm9jZXNzZXMuICAqLworICBfX1JMSU1JVF9OUFJPQyA9IDYsCisjZGVmaW5lIFJMSU1JVF9OUFJPQyBfX1JMSU1JVF9OUFJPQworCisgIC8qIExvY2tlZC1pbi1tZW1vcnkgYWRkcmVzcyBzcGFjZS4gICovCisgIF9fUkxJTUlUX01FTUxPQ0sgPSA4LAorI2RlZmluZSBSTElNSVRfTUVNTE9DSyBfX1JMSU1JVF9NRU1MT0NLCisKKyAgLyogTWF4aW11bSBudW1iZXIgb2YgZmlsZSBsb2Nrcy4gICovCisgIF9fUkxJTUlUX0xPQ0tTID0gMTAsCisjZGVmaW5lIFJMSU1JVF9MT0NLUyBfX1JMSU1JVF9MT0NLUworCisgIC8qIE1heGltdW0gbnVtYmVyIG9mIHBlbmRpbmcgc2lnbmFscy4gICovCisgIF9fUkxJTUlUX1NJR1BFTkRJTkcgPSAxMSwKKyNkZWZpbmUgUkxJTUlUX1NJR1BFTkRJTkcgX19STElNSVRfU0lHUEVORElORworCisgIC8qIE1heGltdW0gYnl0ZXMgaW4gUE9TSVggbWVzc2FnZSBxdWV1ZXMuICAqLworICBfX1JMSU1JVF9NU0dRVUVVRSA9IDEyLAorI2RlZmluZSBSTElNSVRfTVNHUVVFVUUgX19STElNSVRfTVNHUVVFVUUKKworICAvKiBNYXhpbXVtIG5pY2UgcHJpb3JpdHkgYWxsb3dlZCB0byByYWlzZSB0by4KKyAgICAgTmljZSBsZXZlbHMgMTkgLi4gLTIwIGNvcnJlc3BvbmQgdG8gMCAuLiAzOQorICAgICB2YWx1ZXMgb2YgdGhpcyByZXNvdXJjZSBsaW1pdC4gICovCisgIF9fUkxJTUlUX05JQ0UgPSAxMywKKyNkZWZpbmUgUkxJTUlUX05JQ0UgX19STElNSVRfTklDRQorCisgIC8qIE1heGltdW0gcmVhbHRpbWUgcHJpb3JpdHkgYWxsb3dlZCBmb3Igbm9uLXByaXZpbGVkZ2VkCisgICAgIHByb2Nlc3Nlcy4gICovCisgIF9fUkxJTUlUX1JUUFJJTyA9IDE0LAorI2RlZmluZSBSTElNSVRfUlRQUklPIF9fUkxJTUlUX1JUUFJJTworCisgIC8qIE1heGltdW0gQ1BVIHRpbWUgaW4gwrVzIHRoYXQgYSBwcm9jZXNzIHNjaGVkdWxlZCB1bmRlciBhIHJlYWwtdGltZQorICAgICBzY2hlZHVsaW5nIHBvbGljeSBtYXkgY29uc3VtZSB3aXRob3V0IG1ha2luZyBhIGJsb2NraW5nIHN5c3RlbQorICAgICBjYWxsIGJlZm9yZSBiZWluZyBmb3JjaWJseSBkZXNjaGVkdWxlZC4gICovCisgIF9fUkxJTUlUX1JUVElNRSA9IDE1LAorI2RlZmluZSBSTElNSVRfUlRUSU1FIF9fUkxJTUlUX1JUVElNRQorCisgIF9fUkxJTUlUX05MSU1JVFMgPSAxNiwKKyAgX19STElNX05MSU1JVFMgPSBfX1JMSU1JVF9OTElNSVRTCisjZGVmaW5lIFJMSU1JVF9OTElNSVRTIF9fUkxJTUlUX05MSU1JVFMKKyNkZWZpbmUgUkxJTV9OTElNSVRTIF9fUkxJTV9OTElNSVRTCit9OworCisvKiBWYWx1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIGxpbWl0LiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorIyBkZWZpbmUgUkxJTV9JTkZJTklUWSAoKHVuc2lnbmVkIGxvbmcgaW50KSh+MFVMKSkKKyNlbHNlCisjIGRlZmluZSBSTElNX0lORklOSVRZIDB4ZmZmZmZmZmZmZmZmZmZmZnVMTAorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorIyBkZWZpbmUgUkxJTTY0X0lORklOSVRZIDB4ZmZmZmZmZmZmZmZmZmZmZnVMTAorI2VuZGlmCisKKy8qIFdlIGNhbiByZXByZXNlbnQgYWxsIGxpbWl0cy4gICovCisjZGVmaW5lIFJMSU1fU0FWRURfTUFYCVJMSU1fSU5GSU5JVFkKKyNkZWZpbmUgUkxJTV9TQVZFRF9DVVIJUkxJTV9JTkZJTklUWQorCisKKy8qIFR5cGUgZm9yIHJlc291cmNlIHF1YW50aXR5IG1lYXN1cmVtZW50LiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAordHlwZWRlZiBfX3JsaW1fdCBybGltX3Q7CisjZWxzZQordHlwZWRlZiBfX3JsaW02NF90IHJsaW1fdDsKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0Cit0eXBlZGVmIF9fcmxpbTY0X3QgcmxpbTY0X3Q7CisjZW5kaWYKKworc3RydWN0IHJsaW1pdAorICB7CisgICAgLyogVGhlIGN1cnJlbnQgKHNvZnQpIGxpbWl0LiAgKi8KKyAgICBybGltX3QgcmxpbV9jdXI7CisgICAgLyogVGhlIGhhcmQgbGltaXQuICAqLworICAgIHJsaW1fdCBybGltX21heDsKKyAgfTsKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitzdHJ1Y3QgcmxpbWl0NjQKKyAgeworICAgIC8qIFRoZSBjdXJyZW50IChzb2Z0KSBsaW1pdC4gICovCisgICAgcmxpbTY0X3QgcmxpbV9jdXI7CisgICAgLyogVGhlIGhhcmQgbGltaXQuICAqLworICAgIHJsaW02NF90IHJsaW1fbWF4OworIH07CisjZW5kaWYKKworLyogV2hvc2UgdXNhZ2Ugc3RhdGlzdGljcyBkbyB5b3Ugd2FudD8gICovCitlbnVtIF9fcnVzYWdlX3dobworeworICAvKiBUaGUgY2FsbGluZyBwcm9jZXNzLiAgKi8KKyAgUlVTQUdFX1NFTEYgPSAwLAorI2RlZmluZSBSVVNBR0VfU0VMRiBSVVNBR0VfU0VMRgorCisgIC8qIEFsbCBvZiBpdHMgdGVybWluYXRlZCBjaGlsZCBwcm9jZXNzZXMuICAqLworICBSVVNBR0VfQ0hJTERSRU4gPSAtMQorI2RlZmluZSBSVVNBR0VfQ0hJTERSRU4gUlVTQUdFX0NISUxEUkVOCisKKyNpZmRlZiBfX1VTRV9HTlUKKyAgLAorICAvKiBUaGUgY2FsbGluZyB0aHJlYWQuICAqLworICBSVVNBR0VfVEhSRUFEID0gMQorIyBkZWZpbmUgUlVTQUdFX1RIUkVBRCBSVVNBR0VfVEhSRUFECisgIC8qIE5hbWUgZm9yIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgb24gU29sYXJpcy4gICovCisjIGRlZmluZSBSVVNBR0VfTFdQIFJVU0FHRV9USFJFQUQKKyNlbmRpZgorfTsKKworI2RlZmluZSBfX25lZWRfdGltZXZhbAorI2luY2x1ZGUgPGJpdHMvdGltZS5oPgkJLyogRm9yIGBzdHJ1Y3QgdGltZXZhbCcuICAqLworCisvKiBTdHJ1Y3R1cmUgd2hpY2ggc2F5cyBob3cgbXVjaCBvZiBlYWNoIHJlc291cmNlIGhhcyBiZWVuIHVzZWQuICAqLworc3RydWN0IHJ1c2FnZQorICB7CisgICAgLyogVG90YWwgYW1vdW50IG9mIHVzZXIgdGltZSB1c2VkLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXZhbCBydV91dGltZTsKKyAgICAvKiBUb3RhbCBhbW91bnQgb2Ygc3lzdGVtIHRpbWUgdXNlZC4gICovCisgICAgc3RydWN0IHRpbWV2YWwgcnVfc3RpbWU7CisgICAgLyogTWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSAoaW4ga2lsb2J5dGVzKS4gICovCisgICAgbG9uZyBpbnQgcnVfbWF4cnNzOworICAgIC8qIEFtb3VudCBvZiBzaGFyaW5nIG9mIHRleHQgc2VnbWVudCBtZW1vcnkKKyAgICAgICB3aXRoIG90aGVyIHByb2Nlc3NlcyAoa2lsb2J5dGUtc2Vjb25kcykuICAqLworICAgIGxvbmcgaW50IHJ1X2l4cnNzOworICAgIC8qIEFtb3VudCBvZiBkYXRhIHNlZ21lbnQgbWVtb3J5IHVzZWQgKGtpbG9ieXRlLXNlY29uZHMpLiAgKi8KKyAgICBsb25nIGludCBydV9pZHJzczsKKyAgICAvKiBBbW91bnQgb2Ygc3RhY2sgbWVtb3J5IHVzZWQgKGtpbG9ieXRlLXNlY29uZHMpLiAgKi8KKyAgICBsb25nIGludCBydV9pc3JzczsKKyAgICAvKiBOdW1iZXIgb2Ygc29mdCBwYWdlIGZhdWx0cyAoaS5lLiB0aG9zZSBzZXJ2aWNlZCBieSByZWNsYWltaW5nCisgICAgICAgYSBwYWdlIGZyb20gdGhlIGxpc3Qgb2YgcGFnZXMgYXdhaXRpbmcgcmVhbGxvY2F0aW9uLiAgKi8KKyAgICBsb25nIGludCBydV9taW5mbHQ7CisgICAgLyogTnVtYmVyIG9mIGhhcmQgcGFnZSBmYXVsdHMgKGkuZS4gdGhvc2UgdGhhdCByZXF1aXJlZCBJL08pLiAgKi8KKyAgICBsb25nIGludCBydV9tYWpmbHQ7CisgICAgLyogTnVtYmVyIG9mIHRpbWVzIGEgcHJvY2VzcyB3YXMgc3dhcHBlZCBvdXQgb2YgcGh5c2ljYWwgbWVtb3J5LiAgKi8KKyAgICBsb25nIGludCBydV9uc3dhcDsKKyAgICAvKiBOdW1iZXIgb2YgaW5wdXQgb3BlcmF0aW9ucyB2aWEgdGhlIGZpbGUgc3lzdGVtLiAgTm90ZTogVGhpcworICAgICAgIGFuZCBgcnVfb3VibG9jaycgZG8gbm90IGluY2x1ZGUgb3BlcmF0aW9ucyB3aXRoIHRoZSBjYWNoZS4gICovCisgICAgbG9uZyBpbnQgcnVfaW5ibG9jazsKKyAgICAvKiBOdW1iZXIgb2Ygb3V0cHV0IG9wZXJhdGlvbnMgdmlhIHRoZSBmaWxlIHN5c3RlbS4gICovCisgICAgbG9uZyBpbnQgcnVfb3VibG9jazsKKyAgICAvKiBOdW1iZXIgb2YgSVBDIG1lc3NhZ2VzIHNlbnQuICAqLworICAgIGxvbmcgaW50IHJ1X21zZ3NuZDsKKyAgICAvKiBOdW1iZXIgb2YgSVBDIG1lc3NhZ2VzIHJlY2VpdmVkLiAgKi8KKyAgICBsb25nIGludCBydV9tc2dyY3Y7CisgICAgLyogTnVtYmVyIG9mIHNpZ25hbHMgZGVsaXZlcmVkLiAgKi8KKyAgICBsb25nIGludCBydV9uc2lnbmFsczsKKyAgICAvKiBOdW1iZXIgb2Ygdm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMsIGkuZS4gYmVjYXVzZSB0aGUgcHJvY2VzcworICAgICAgIGdhdmUgdXAgdGhlIHByb2Nlc3MgYmVmb3JlIGl0IGhhZCB0byAodXN1YWxseSB0byB3YWl0IGZvciBzb21lCisgICAgICAgcmVzb3VyY2UgdG8gYmUgYXZhaWxhYmxlKS4gICovCisgICAgbG9uZyBpbnQgcnVfbnZjc3c7CisgICAgLyogTnVtYmVyIG9mIGludm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMsIGkuZS4gYSBoaWdoZXIgcHJpb3JpdHkgcHJvY2VzcworICAgICAgIGJlY2FtZSBydW5uYWJsZSBvciB0aGUgY3VycmVudCBwcm9jZXNzIHVzZWQgdXAgaXRzIHRpbWUgc2xpY2UuICAqLworICAgIGxvbmcgaW50IHJ1X25pdmNzdzsKKyAgfTsKKworLyogUHJpb3JpdHkgbGltaXRzLiAgKi8KKyNkZWZpbmUgUFJJT19NSU4JLTIwCS8qIE1pbmltdW0gcHJpb3JpdHkgYSBwcm9jZXNzIGNhbiBoYXZlLiAgKi8KKyNkZWZpbmUgUFJJT19NQVgJMjAJLyogTWF4aW11bSBwcmlvcml0eSBhIHByb2Nlc3MgY2FuIGhhdmUuICAqLworCisvKiBUaGUgdHlwZSBvZiB0aGUgV0hJQ0ggYXJndW1lbnQgdG8gYGdldHByaW9yaXR5JyBhbmQgYHNldHByaW9yaXR5JywKKyAgIGluZGljYXRpbmcgd2hhdCBmbGF2b3Igb2YgZW50aXR5IHRoZSBXSE8gYXJndW1lbnQgc3BlY2lmaWVzLiAgKi8KK2VudW0gX19wcmlvcml0eV93aGljaAoreworICBQUklPX1BST0NFU1MgPSAwLAkJLyogV0hPIGlzIGEgcHJvY2VzcyBJRC4gICovCisjZGVmaW5lIFBSSU9fUFJPQ0VTUyBQUklPX1BST0NFU1MKKyAgUFJJT19QR1JQID0gMSwJCS8qIFdITyBpcyBhIHByb2Nlc3MgZ3JvdXAgSUQuICAqLworI2RlZmluZSBQUklPX1BHUlAgUFJJT19QR1JQCisgIFBSSU9fVVNFUiA9IDIJCQkvKiBXSE8gaXMgYSB1c2VyIElELiAgKi8KKyNkZWZpbmUgUFJJT19VU0VSIFBSSU9fVVNFUgorfTsKKworCitfX0JFR0lOX0RFQ0xTCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIE1vZGlmeSBhbmQgcmV0dXJuIHJlc291cmNlIGxpbWl0cyBvZiBhIHByb2Nlc3MgYXRvbWljYWxseS4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHBybGltaXQgKF9fcGlkX3QgX19waWQsIGVudW0gX19ybGltaXRfcmVzb3VyY2UgX19yZXNvdXJjZSwKKwkJICAgIF9fY29uc3Qgc3RydWN0IHJsaW1pdCAqX19uZXdfbGltaXQsCisJCSAgICBzdHJ1Y3QgcmxpbWl0ICpfX29sZF9saW1pdCkgX19USFJPVzsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHBybGltaXQsIChfX3BpZF90IF9fcGlkLAorCQkJCSAgICAgZW51bSBfX3JsaW1pdF9yZXNvdXJjZSBfX3Jlc291cmNlLAorCQkJCSAgICAgX19jb25zdCBzdHJ1Y3QgcmxpbWl0ICpfX25ld19saW1pdCwKKwkJCQkgICAgIHN0cnVjdCBybGltaXQgKl9fb2xkX2xpbWl0KSwgcHJsaW1pdDY0KTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgcHJsaW1pdCBwcmxpbWl0NjQKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IHBybGltaXQ2NCAoX19waWRfdCBfX3BpZCwgZW51bSBfX3JsaW1pdF9yZXNvdXJjZSBfX3Jlc291cmNlLAorCQkgICAgICBfX2NvbnN0IHN0cnVjdCBybGltaXQ2NCAqX19uZXdfbGltaXQsCisJCSAgICAgIHN0cnVjdCBybGltaXQ2NCAqX19vbGRfbGltaXQpIF9fVEhST1c7CisjIGVuZGlmCisjZW5kaWYKKworX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zY2hlZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NjaGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxNDMxZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zY2hlZC5oCkBAIC0wLDAgKzEsMjEyIEBACisvKiBEZWZpbml0aW9ucyBvZiBjb25zdGFudHMgYW5kIGRhdGEgc3RydWN0dXJlIGZvciBQT1NJWCAxMDAzLjFiLTE5OTMKKyAgIHNjaGVkdWxpbmcgaW50ZXJmYWNlLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTksMjAwMS0yMDAzLDIwMDUsMjAwNiwyMDA3LDIwMDgsMjAwOSwyMDExCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfX25lZWRfc2NoZWRwYXJhbQorCisjaWZuZGVmIF9TQ0hFRF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NjaGVkLmg+IGRpcmVjdGx5OyB1c2UgPHNjaGVkLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworLyogU2NoZWR1bGluZyBhbGdvcml0aG1zLiAgKi8KKyNkZWZpbmUgU0NIRURfT1RIRVIJCTAKKyNkZWZpbmUgU0NIRURfRklGTwkJMQorI2RlZmluZSBTQ0hFRF9SUgkJMgorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgU0NIRURfQkFUQ0gJCTMKKyMgZGVmaW5lIFNDSEVEX0lETEUJCTUKKworIyBkZWZpbmUgU0NIRURfUkVTRVRfT05fRk9SSwkweDQwMDAwMDAwCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQ2xvbmluZyBmbGFncy4gICovCisjIGRlZmluZSBDU0lHTkFMICAgICAgIDB4MDAwMDAwZmYgLyogU2lnbmFsIG1hc2sgdG8gYmUgc2VudCBhdCBleGl0LiAgKi8KKyMgZGVmaW5lIENMT05FX1ZNICAgICAgMHgwMDAwMDEwMCAvKiBTZXQgaWYgVk0gc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzLiAgKi8KKyMgZGVmaW5lIENMT05FX0ZTICAgICAgMHgwMDAwMDIwMCAvKiBTZXQgaWYgZnMgaW5mbyBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMuICAqLworIyBkZWZpbmUgQ0xPTkVfRklMRVMgICAweDAwMDAwNDAwIC8qIFNldCBpZiBvcGVuIGZpbGVzIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3Nlcy4gICovCisjIGRlZmluZSBDTE9ORV9TSUdIQU5EIDB4MDAwMDA4MDAgLyogU2V0IGlmIHNpZ25hbCBoYW5kbGVycyBzaGFyZWQuICAqLworIyBkZWZpbmUgQ0xPTkVfUFRSQUNFICAweDAwMDAyMDAwIC8qIFNldCBpZiB0cmFjaW5nIGNvbnRpbnVlcyBvbiB0aGUgY2hpbGQuICAqLworIyBkZWZpbmUgQ0xPTkVfVkZPUksgICAweDAwMDA0MDAwIC8qIFNldCBpZiB0aGUgcGFyZW50IHdhbnRzIHRoZSBjaGlsZCB0bworCQkJCSAgICAgd2FrZSBpdCB1cCBvbiBtbV9yZWxlYXNlLiAgKi8KKyMgZGVmaW5lIENMT05FX1BBUkVOVCAgMHgwMDAwODAwMCAvKiBTZXQgaWYgd2Ugd2FudCB0byBoYXZlIHRoZSBzYW1lCisJCQkJICAgICBwYXJlbnQgYXMgdGhlIGNsb25lci4gICovCisjIGRlZmluZSBDTE9ORV9USFJFQUQgIDB4MDAwMTAwMDAgLyogU2V0IHRvIGFkZCB0byBzYW1lIHRocmVhZCBncm91cC4gICovCisjIGRlZmluZSBDTE9ORV9ORVdOUyAgIDB4MDAwMjAwMDAgLyogU2V0IHRvIGNyZWF0ZSBuZXcgbmFtZXNwYWNlLiAgKi8KKyMgZGVmaW5lIENMT05FX1NZU1ZTRU0gMHgwMDA0MDAwMCAvKiBTZXQgdG8gc2hhcmVkIFNWSUQgU0VNX1VORE8gc2VtYW50aWNzLiAgKi8KKyMgZGVmaW5lIENMT05FX1NFVFRMUyAgMHgwMDA4MDAwMCAvKiBTZXQgVExTIGluZm8uICAqLworIyBkZWZpbmUgQ0xPTkVfUEFSRU5UX1NFVFRJRCAweDAwMTAwMDAwIC8qIFN0b3JlIFRJRCBpbiB1c2VybGV2ZWwgYnVmZmVyCisJCQkJCSAgIGJlZm9yZSBNTSBjb3B5LiAgKi8KKyMgZGVmaW5lIENMT05FX0NISUxEX0NMRUFSVElEIDB4MDAyMDAwMDAgLyogUmVnaXN0ZXIgZXhpdCBmdXRleCBhbmQgbWVtb3J5CisJCQkJCSAgICBsb2NhdGlvbiB0byBjbGVhci4gICovCisjIGRlZmluZSBDTE9ORV9ERVRBQ0hFRCAweDAwNDAwMDAwIC8qIENyZWF0ZSBjbG9uZSBkZXRhY2hlZC4gICovCisjIGRlZmluZSBDTE9ORV9VTlRSQUNFRCAweDAwODAwMDAwIC8qIFNldCBpZiB0aGUgdHJhY2luZyBwcm9jZXNzIGNhbid0CisJCQkJICAgICAgZm9yY2UgQ0xPTkVfUFRSQUNFIG9uIHRoaXMgY2xvbmUuICAqLworIyBkZWZpbmUgQ0xPTkVfQ0hJTERfU0VUVElEIDB4MDEwMDAwMDAgLyogU3RvcmUgVElEIGluIHVzZXJsZXZlbCBidWZmZXIgaW4KKwkJCQkJICB0aGUgY2hpbGQuICAqLworIyBkZWZpbmUgQ0xPTkVfTkVXVVRTCTB4MDQwMDAwMDAJLyogTmV3IHV0c25hbWUgZ3JvdXAuICAqLworIyBkZWZpbmUgQ0xPTkVfTkVXSVBDCTB4MDgwMDAwMDAJLyogTmV3IGlwY3MuICAqLworIyBkZWZpbmUgQ0xPTkVfTkVXVVNFUgkweDEwMDAwMDAwCS8qIE5ldyB1c2VyIG5hbWVzcGFjZS4gICovCisjIGRlZmluZSBDTE9ORV9ORVdQSUQJMHgyMDAwMDAwMAkvKiBOZXcgcGlkIG5hbWVzcGFjZS4gICovCisjIGRlZmluZSBDTE9ORV9ORVdORVQJMHg0MDAwMDAwMAkvKiBOZXcgbmV0d29yayBuYW1lc3BhY2UuICAqLworIyBkZWZpbmUgQ0xPTkVfSU8JMHg4MDAwMDAwMAkvKiBDbG9uZSBJL08gY29udGV4dC4gICovCisjZW5kaWYKKworLyogVGhlIG9mZmljaWFsIGRlZmluaXRpb24uICAqLworc3RydWN0IHNjaGVkX3BhcmFtCisgIHsKKyAgICBpbnQgX19zY2hlZF9wcmlvcml0eTsKKyAgfTsKKworX19CRUdJTl9ERUNMUworCisjaWZkZWYgX19VU0VfR05VCisvKiBDbG9uZSBjdXJyZW50IHByb2Nlc3MuICAqLworZXh0ZXJuIGludCBjbG9uZSAoaW50ICgqX19mbikgKHZvaWQgKl9fYXJnKSwgdm9pZCAqX19jaGlsZF9zdGFjaywKKwkJICBpbnQgX19mbGFncywgdm9pZCAqX19hcmcsIC4uLikgX19USFJPVzsKKworLyogVW5zaGFyZSB0aGUgc3BlY2lmaWVkIHJlc291cmNlcy4gICovCitleHRlcm4gaW50IHVuc2hhcmUgKGludCBfX2ZsYWdzKSBfX1RIUk9XOworCisvKiBHZXQgaW5kZXggb2YgY3VycmVudGx5IHVzZWQgQ1BVLiAgKi8KK2V4dGVybiBpbnQgc2NoZWRfZ2V0Y3B1ICh2b2lkKSBfX1RIUk9XOworCisvKiBTd2l0Y2ggcHJvY2VzcyB0byBuYW1lc3BhY2Ugb2YgdHlwZSBOU1RZUEUgaW5kaWNhdGVkIGJ5IEZELiAgKi8KK2V4dGVybiBpbnQgc2V0bnMgKGludCBfX2ZkLCBpbnQgX19uc3R5cGUpIF9fVEhST1c7CisjZW5kaWYKKworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogbmVlZCBzY2hlZHBhcmFtICovCisKKyNpZiAhZGVmaW5lZCBfX2RlZmluZWRfc2NoZWRwYXJhbSBcCisgICAgJiYgKGRlZmluZWQgX19uZWVkX3NjaGVkcGFyYW0gfHwgZGVmaW5lZCBfU0NIRURfSCkKKyMgZGVmaW5lIF9fZGVmaW5lZF9zY2hlZHBhcmFtCTEKKy8qIERhdGEgc3RydWN0dXJlIHRvIGRlc2NyaWJlIGEgcHJvY2Vzcycgc2NoZWR1bGFiaWxpdHkuICAqLworc3RydWN0IF9fc2NoZWRfcGFyYW0KKyAgeworICAgIGludCBfX3NjaGVkX3ByaW9yaXR5OworICB9OworIyB1bmRlZiBfX25lZWRfc2NoZWRwYXJhbQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX1NDSEVEX0ggJiYgIWRlZmluZWQgX19jcHVfc2V0X3RfZGVmaW5lZAorIyBkZWZpbmUgX19jcHVfc2V0X3RfZGVmaW5lZAorLyogU2l6ZSBkZWZpbml0aW9uIGZvciBDUFUgc2V0cy4gICovCisjIGRlZmluZSBfX0NQVV9TRVRTSVpFCTEwMjQKKyMgZGVmaW5lIF9fTkNQVUJJVFMJKDggKiBzaXplb2YgKF9fY3B1X21hc2spKQorCisvKiBUeXBlIGZvciBhcnJheSBlbGVtZW50cyBpbiAnY3B1X3NldF90Jy4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IF9fY3B1X21hc2s7CisKKy8qIEJhc2ljIGFjY2VzcyBmdW5jdGlvbnMuICAqLworIyBkZWZpbmUgX19DUFVFTFQoY3B1KQkoKGNwdSkgLyBfX05DUFVCSVRTKQorIyBkZWZpbmUgX19DUFVNQVNLKGNwdSkJKChfX2NwdV9tYXNrKSAxIDw8ICgoY3B1KSAlIF9fTkNQVUJJVFMpKQorCisvKiBEYXRhIHN0cnVjdHVyZSB0byBkZXNjcmliZSBDUFUgbWFzay4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBfX2NwdV9tYXNrIF9fYml0c1tfX0NQVV9TRVRTSVpFIC8gX19OQ1BVQklUU107Cit9IGNwdV9zZXRfdDsKKworLyogQWNjZXNzIGZ1bmN0aW9ucyBmb3IgQ1BVIG1hc2tzLiAgKi8KKyMgaWYgX19HTlVDX1BSRVJFUSAoMiwgOTEpCisjICBkZWZpbmUgX19DUFVfWkVST19TKHNldHNpemUsIGNwdXNldHApIFwKKyAgZG8gX19idWlsdGluX21lbXNldCAoY3B1c2V0cCwgJ1wwJywgc2V0c2l6ZSk7IHdoaWxlICgwKQorIyBlbHNlCisjICBkZWZpbmUgX19DUFVfWkVST19TKHNldHNpemUsIGNwdXNldHApIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBzaXplX3QgX19pOwkJCQkJCQkJICAgICAgXAorICAgIHNpemVfdCBfX2ltYXggPSAoc2V0c2l6ZSkgLyBzaXplb2YgKF9fY3B1X21hc2spOwkJCSAgICAgIFwKKyAgICBfX2NwdV9tYXNrICpfX2JpdHMgPSAoY3B1c2V0cCktPl9fYml0czsJCQkJICAgICAgXAorICAgIGZvciAoX19pID0gMDsgX19pIDwgX19pbWF4OyArK19faSkJCQkJCSAgICAgIFwKKyAgICAgIF9fYml0c1tfX2ldID0gMDsJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorIyBlbmRpZgorIyBkZWZpbmUgX19DUFVfU0VUX1MoY3B1LCBzZXRzaXplLCBjcHVzZXRwKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IHNpemVfdCBfX2NwdSA9IChjcHUpOwkJCQkJCSAgICAgIFwKKyAgICAgIF9fY3B1IDwgOCAqIChzZXRzaXplKQkJCQkJCSAgICAgIFwKKyAgICAgID8gKCgoX19jcHVfbWFzayAqKSAoKGNwdXNldHApLT5fX2JpdHMpKVtfX0NQVUVMVCAoX19jcHUpXQkJICAgICAgXAorCSB8PSBfX0NQVU1BU0sgKF9fY3B1KSkJCQkJCQkgICAgICBcCisgICAgICA6IDA7IH0pKQorIyBkZWZpbmUgX19DUFVfQ0xSX1MoY3B1LCBzZXRzaXplLCBjcHVzZXRwKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IHNpemVfdCBfX2NwdSA9IChjcHUpOwkJCQkJCSAgICAgIFwKKyAgICAgIF9fY3B1IDwgOCAqIChzZXRzaXplKQkJCQkJCSAgICAgIFwKKyAgICAgID8gKCgoX19jcHVfbWFzayAqKSAoKGNwdXNldHApLT5fX2JpdHMpKVtfX0NQVUVMVCAoX19jcHUpXQkJICAgICAgXAorCSAmPSB+X19DUFVNQVNLIChfX2NwdSkpCQkJCQkJICAgICAgXAorICAgICAgOiAwOyB9KSkKKyMgZGVmaW5lIF9fQ1BVX0lTU0VUX1MoY3B1LCBzZXRzaXplLCBjcHVzZXRwKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IHNpemVfdCBfX2NwdSA9IChjcHUpOwkJCQkJCSAgICAgIFwKKyAgICAgIF9fY3B1IDwgOCAqIChzZXRzaXplKQkJCQkJCSAgICAgIFwKKyAgICAgID8gKCgoKF9fY29uc3QgX19jcHVfbWFzayAqKSAoKGNwdXNldHApLT5fX2JpdHMpKVtfX0NQVUVMVCAoX19jcHUpXSAgICAgIFwKKwkgICYgX19DUFVNQVNLIChfX2NwdSkpKSAhPSAwCQkJCQkgICAgICBcCisgICAgICA6IDA7IH0pKQorCisjIGRlZmluZSBfX0NQVV9DT1VOVF9TKHNldHNpemUsIGNwdXNldHApIFwKKyAgX19zY2hlZF9jcHVjb3VudCAoc2V0c2l6ZSwgY3B1c2V0cCkKKworIyBpZiBfX0dOVUNfUFJFUkVRICgyLCA5MSkKKyMgIGRlZmluZSBfX0NQVV9FUVVBTF9TKHNldHNpemUsIGNwdXNldHAxLCBjcHVzZXRwMikgXAorICAoX19idWlsdGluX21lbWNtcCAoY3B1c2V0cDEsIGNwdXNldHAyLCBzZXRzaXplKSA9PSAwKQorIyBlbHNlCisjICBkZWZpbmUgX19DUFVfRVFVQUxfUyhzZXRzaXplLCBjcHVzZXRwMSwgY3B1c2V0cDIpIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgX19jb25zdCBfX2NwdV9tYXNrICpfX2FycjEgPSAoY3B1c2V0cDEpLT5fX2JpdHM7CQkJICAgICAgXAorICAgICAgX19jb25zdCBfX2NwdV9tYXNrICpfX2FycjIgPSAoY3B1c2V0cDIpLT5fX2JpdHM7CQkJICAgICAgXAorICAgICAgc2l6ZV90IF9faW1heCA9IChzZXRzaXplKSAvIHNpemVvZiAoX19jcHVfbWFzayk7CQkJICAgICAgXAorICAgICAgc2l6ZV90IF9faTsJCQkJCQkJICAgICAgXAorICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ltYXg7ICsrX19pKQkJCQkgICAgICBcCisJaWYgKF9fYXJyMVtfX2ldICE9IF9fYXJyMltfX2ldKQkJCQkJICAgICAgXAorCSAgYnJlYWs7CQkJCQkJCSAgICAgIFwKKyAgICAgIF9faSA9PSBfX2ltYXg7IH0pKQorIyBlbmRpZgorCisjIGRlZmluZSBfX0NQVV9PUF9TKHNldHNpemUsIGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIsIG9wKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IGNwdV9zZXRfdCAqX19kZXN0ID0gKGRlc3RzZXQpOwkJCQkJICAgICAgXAorICAgICAgX19jb25zdCBfX2NwdV9tYXNrICpfX2FycjEgPSAoc3Jjc2V0MSktPl9fYml0czsJCQkgICAgICBcCisgICAgICBfX2NvbnN0IF9fY3B1X21hc2sgKl9fYXJyMiA9IChzcmNzZXQyKS0+X19iaXRzOwkJCSAgICAgIFwKKyAgICAgIHNpemVfdCBfX2ltYXggPSAoc2V0c2l6ZSkgLyBzaXplb2YgKF9fY3B1X21hc2spOwkJCSAgICAgIFwKKyAgICAgIHNpemVfdCBfX2k7CQkJCQkJCSAgICAgIFwKKyAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19pbWF4OyArK19faSkJCQkJICAgICAgXAorCSgoX19jcHVfbWFzayAqKSBfX2Rlc3QtPl9fYml0cylbX19pXSA9IF9fYXJyMVtfX2ldIG9wIF9fYXJyMltfX2ldOyAgICBcCisgICAgICBfX2Rlc3Q7IH0pKQorCisjIGRlZmluZSBfX0NQVV9BTExPQ19TSVpFKGNvdW50KSBcCisgICgoKChjb3VudCkgKyBfX05DUFVCSVRTIC0gMSkgLyBfX05DUFVCSVRTKSAqIHNpemVvZiAoX19jcHVfbWFzaykpCisjIGRlZmluZSBfX0NQVV9BTExPQyhjb3VudCkgX19zY2hlZF9jcHVhbGxvYyAoY291bnQpCisjIGRlZmluZSBfX0NQVV9GUkVFKGNwdXNldCkgX19zY2hlZF9jcHVmcmVlIChjcHVzZXQpCisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCBfX3NjaGVkX2NwdWNvdW50IChzaXplX3QgX19zZXRzaXplLCBjb25zdCBjcHVfc2V0X3QgKl9fc2V0cCkKKyAgX19USFJPVzsKK2V4dGVybiBjcHVfc2V0X3QgKl9fc2NoZWRfY3B1YWxsb2MgKHNpemVfdCBfX2NvdW50KSBfX1RIUk9XIF9fd3VyOworZXh0ZXJuIHZvaWQgX19zY2hlZF9jcHVmcmVlIChjcHVfc2V0X3QgKl9fc2V0KSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zZWxlY3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zZWxlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTRjNTZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NlbGVjdC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMSwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NFTEVDVF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvc2VsZWN0Lmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgorIyBkZWZpbmUgX19GRF9aRVJPKGZkc3ApIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBpbnQgX19kMCwgX19kMTsJCQkJCQkJICAgICAgXAorICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkOyByZXA7IHN0b3NsIgkJCQkgICAgICBcCisJCQkgIDogIj1jIiAoX19kMCksICI9RCIgKF9fZDEpCQkJICAgICAgXAorCQkJICA6ICJhIiAoMCksICIwIiAoc2l6ZW9mIChmZF9zZXQpCQkgICAgICBcCisJCQkJCSAgLyBzaXplb2YgKF9fZmRfbWFzaykpLAkgICAgICBcCisJCQkgICAgIjEiICgmX19GRFNfQklUUyAoZmRzcClbMF0pCQkJICAgICAgXAorCQkJICA6ICJtZW1vcnkiKTsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2Vsc2UJLyogISBHTlUgQ0MgKi8KKworLyogV2UgZG9uJ3QgdXNlIGBtZW1zZXQnIGJlY2F1c2UgdGhpcyB3b3VsZCByZXF1aXJlIGEgcHJvdG90eXBlIGFuZAorICAgdGhlIGFycmF5IGlzbid0IHRvbyBiaWcuICAqLworIyBkZWZpbmUgX19GRF9aRVJPKHNldCkgIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICB1bnNpZ25lZCBpbnQgX19pOwkJCQkJCQkgICAgICBcCisgICAgZmRfc2V0ICpfX2FyciA9IChzZXQpOwkJCQkJCSAgICAgIFwKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IHNpemVvZiAoZmRfc2V0KSAvIHNpemVvZiAoX19mZF9tYXNrKTsgKytfX2kpCSAgICAgIFwKKyAgICAgIF9fRkRTX0JJVFMgKF9fYXJyKVtfX2ldID0gMDsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2VuZGlmCS8qIEdOVSBDQyAqLworCisjZGVmaW5lIF9fRkRfU0VUKGQsIHNldCkgXAorICAoKHZvaWQpIChfX0ZEU19CSVRTIChzZXQpW19fRkRfRUxUIChkKV0gfD0gX19GRF9NQVNLIChkKSkpCisjZGVmaW5lIF9fRkRfQ0xSKGQsIHNldCkgXAorICAoKHZvaWQpIChfX0ZEU19CSVRTIChzZXQpW19fRkRfRUxUIChkKV0gJj0gfl9fRkRfTUFTSyAoZCkpKQorI2RlZmluZSBfX0ZEX0lTU0VUKGQsIHNldCkgXAorICAoKF9fRkRTX0JJVFMgKHNldClbX19GRF9FTFQgKGQpXSAmIF9fRkRfTUFTSyAoZCkpICE9IDApCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2VsZWN0Mi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NlbGVjdDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2NlMWI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NlbGVjdDIuaApAQCAtMCwwICsxLDM1IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHNlbGVjdCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TRUxFQ1RfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zZWxlY3QyLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zZWxlY3QuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogSGVscGVyIGZ1bmN0aW9ucyB0byBpc3N1ZSB3YXJuaW5ncyBhbmQgZXJyb3JzIHdoZW4gbmVlZGVkLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGludCBfX2ZkZWx0X2NoayAodW5zaWduZWQgbG9uZyBpbnQgX19kKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGludCBfX2ZkZWx0X3dhcm4gKHVuc2lnbmVkIGxvbmcgaW50IF9fZCkKKyAgX193YXJuYXR0ciAoImJpdCBvdXRzaWRlIG9mIGZkX3NldCBzZWxlY3RlZCIpOworI3VuZGVmIF9fRkRfRUxUCisjZGVmaW5lCV9fRkRfRUxUKGQpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgIFwKKyAgKHsgdW5zaWduZWQgbG9uZyBpbnQgX19kID0gKGQpOwkJCQkJICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX2QpCQkJCQkgICAgXAorICAgICAgPyAoX19kID49IF9fRkRfU0VUU0laRQkJCQkJCSAgICBcCisJID8gX19mZGVsdF93YXJuIChfX2QpIDogKF9fZCAvIF9fTkZEQklUUykpCQkJICAgIFwKKyAgICAgIDogX19mZGVsdF9jaGsgKF9fZCkpOyB9KQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NlbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOTM1MDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2VtLmgKQEAgLTAsMCArMSw4NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0VNX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc2VtLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zZW0uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiBGbGFncyBmb3IgYHNlbW9wJy4gICovCisjZGVmaW5lIFNFTV9VTkRPCTB4MTAwMAkJLyogdW5kbyB0aGUgb3BlcmF0aW9uIG9uIGV4aXQgKi8KKworLyogQ29tbWFuZHMgZm9yIGBzZW1jdGwnLiAgKi8KKyNkZWZpbmUgR0VUUElECQkxMQkJLyogZ2V0IHNlbXBpZCAqLworI2RlZmluZSBHRVRWQUwJCTEyCQkvKiBnZXQgc2VtdmFsICovCisjZGVmaW5lIEdFVEFMTAkJMTMJCS8qIGdldCBhbGwgc2VtdmFsJ3MgKi8KKyNkZWZpbmUgR0VUTkNOVAkJMTQJCS8qIGdldCBzZW1uY250ICovCisjZGVmaW5lIEdFVFpDTlQJCTE1CQkvKiBnZXQgc2VtemNudCAqLworI2RlZmluZSBTRVRWQUwJCTE2CQkvKiBzZXQgc2VtdmFsICovCisjZGVmaW5lIFNFVEFMTAkJMTcJCS8qIHNldCBhbGwgc2VtdmFsJ3MgKi8KKworCisvKiBEYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgc2V0IG9mIHNlbWFwaG9yZXMuICAqLworc3RydWN0IHNlbWlkX2RzCit7CisgIHN0cnVjdCBpcGNfcGVybSBzZW1fcGVybTsJCS8qIG9wZXJhdGlvbiBwZXJtaXNzaW9uIHN0cnVjdCAqLworICBfX3RpbWVfdCBzZW1fb3RpbWU7CQkJLyogbGFzdCBzZW1vcCgpIHRpbWUgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQxOworICBfX3RpbWVfdCBzZW1fY3RpbWU7CQkJLyogbGFzdCB0aW1lIGNoYW5nZWQgYnkgc2VtY3RsKCkgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQyOworICB1bnNpZ25lZCBsb25nIGludCBzZW1fbnNlbXM7CQkvKiBudW1iZXIgb2Ygc2VtYXBob3JlcyBpbiBzZXQgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQzOworICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDQ7Cit9OworCisvKiBUaGUgdXNlciBzaG91bGQgZGVmaW5lIGEgdW5pb24gbGlrZSB0aGUgZm9sbG93aW5nIHRvIHVzZSBpdCBmb3IgYXJndW1lbnRzCisgICBmb3IgYHNlbWN0bCcuCisKKyAgIHVuaW9uIHNlbXVuCisgICB7CisgICAgIGludCB2YWw7CQkJCTw9IHZhbHVlIGZvciBTRVRWQUwKKyAgICAgc3RydWN0IHNlbWlkX2RzICpidWY7CQk8PSBidWZmZXIgZm9yIElQQ19TVEFUICYgSVBDX1NFVAorICAgICB1bnNpZ25lZCBzaG9ydCBpbnQgKmFycmF5OwkJPD0gYXJyYXkgZm9yIEdFVEFMTCAmIFNFVEFMTAorICAgICBzdHJ1Y3Qgc2VtaW5mbyAqX19idWY7CQk8PSBidWZmZXIgZm9yIElQQ19JTkZPCisgICB9OworCisgICBQcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUgdXNlZCB0byBkZWZpbmUgdGhpcyB1bmlvbiBidXQgdGhpcyBpcworICAgaW5jb3JyZWN0LiAgT25lIGNhbiB0ZXN0IHRoZSBtYWNybyBfU0VNX1NFTVVOX1VOREVGSU5FRCB0byBzZWUgd2hldGhlcgorICAgb25lIG11c3QgZGVmaW5lIHRoZSB1bmlvbiBvciBub3QuICAqLworI2RlZmluZSBfU0VNX1NFTVVOX1VOREVGSU5FRAkxCisKKyNpZmRlZiBfX1VTRV9NSVNDCisKKy8qIGlwY3MgY3RsIGNtZHMgKi8KKyMgZGVmaW5lIFNFTV9TVEFUIDE4CisjIGRlZmluZSBTRU1fSU5GTyAxOQorCitzdHJ1Y3QgIHNlbWluZm8KK3sKKyAgaW50IHNlbW1hcDsKKyAgaW50IHNlbW1uaTsKKyAgaW50IHNlbW1uczsKKyAgaW50IHNlbW1udTsKKyAgaW50IHNlbW1zbDsKKyAgaW50IHNlbW9wbTsKKyAgaW50IHNlbXVtZTsKKyAgaW50IHNlbXVzejsKKyAgaW50IHNlbXZteDsKKyAgaW50IHNlbWFlbTsKK307CisKKyNlbmRpZiAvKiBfX1VTRV9NSVNDICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2VtYXBob3JlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2VtYXBob3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0NDkzYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zZW1hcGhvcmUuaApAQCAtMCwwICsxLDM2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU0VNQVBIT1JFX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9zZW1hcGhvcmUuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHNlbWFwaG9yZS5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKyNkZWZpbmUgX19TSVpFT0ZfU0VNX1QJMTYKKworCisvKiBWYWx1ZSByZXR1cm5lZCBpZiBgc2VtX29wZW4nIGZhaWxlZC4gICovCisjZGVmaW5lIFNFTV9GQUlMRUQgICAgICAoKHNlbV90ICopIDApCisKKwordHlwZWRlZiB1bmlvbgoreworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9TRU1fVF07CisgIGxvbmcgaW50IF9fYWxpZ247Cit9IHNlbV90OwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NldGptcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMzNjNDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2V0am1wLmgKQEAgLTAsMCArMSwzMiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMjAwMCwyMDAxLDIwMDMsMjAwNSwyMDA2CisJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIERlZmluZSB0aGUgbWFjaGluZS1kZXBlbmRlbnQgdHlwZSBgam1wX2J1ZicuICBJbnRlbCAzODYgdmVyc2lvbi4gICovCisjaWZuZGVmIF9CSVRTX1NFVEpNUF9ICisjZGVmaW5lIF9CSVRTX1NFVEpNUF9ICTEKKworI2lmICFkZWZpbmVkIF9TRVRKTVBfSCAmJiAhZGVmaW5lZCBfUFRIUkVBRF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NldGptcC5oPiBkaXJlY3RseTsgdXNlIDxzZXRqbXAuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZglfQVNNCit0eXBlZGVmIGludCBfX2ptcF9idWZbNl07CisjZW5kaWYKKworI2VuZGlmCS8qIGJpdHMvc2V0am1wLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zZXRqbXAyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2V0am1wMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjVkMjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2V0am1wMi5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIENoZWNraW5nIG1hY3JvcyBmb3Igc2V0am1wIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU0VUSk1QX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc2V0am1wMi5oPiBkaXJlY3RseTsgdXNlIDxzZXRqbXAuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogVmFyaWFudCBvZiB0aGUgbG9uZ2ptcCBmdW5jdGlvbnMgd2hpY2ggcGVyZm9ybSBzb21lIHNhbml0eSBjaGVja2luZy4gICovCisjaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiB2b2lkIF9fUkVESVJFQ1RfTlRITkwgKGxvbmdqbXAsCisJCQkgICAgICAoc3RydWN0IF9fam1wX2J1Zl90YWcgX19lbnZbMV0sIGludCBfX3ZhbCksCisJCQkgICAgICBfX2xvbmdqbXBfY2hrKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CitleHRlcm4gdm9pZCBfX1JFRElSRUNUX05USE5MIChfbG9uZ2ptcCwKKwkJCSAgICAgIChzdHJ1Y3QgX19qbXBfYnVmX3RhZyBfX2VudlsxXSwgaW50IF9fdmFsKSwKKwkJCSAgICAgIF9fbG9uZ2ptcF9jaGspIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKK2V4dGVybiB2b2lkIF9fUkVESVJFQ1RfTlRITkwgKHNpZ2xvbmdqbXAsCisJCQkgICAgICAoc3RydWN0IF9fam1wX2J1Zl90YWcgX19lbnZbMV0sIGludCBfX3ZhbCksCisJCQkgICAgICBfX2xvbmdqbXBfY2hrKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisjZWxzZQorZXh0ZXJuIHZvaWQgX19sb25nam1wX2NoayAoc3RydWN0IF9fam1wX2J1Zl90YWcgX19lbnZbMV0sIGludCBfX3ZhbCksCisgICAgIF9fVEhST1dOTCBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisjIGRlZmluZSBsb25nam1wIF9fbG9uZ2ptcF9jaGsKKyMgZGVmaW5lIF9sb25nam1wIF9fbG9uZ2ptcF9jaGsKKyMgZGVmaW5lIHNpZ2xvbmdqbXAgX19sb25nam1wX2NoaworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2htLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2htLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhZDBjNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaG0uaApAQCAtMCwwICsxLDEwNCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywyMDAwLDIwMDIsMjAwNCwyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0hNX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc2htLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zaG0uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogUGVybWlzc2lvbiBmbGFnIGZvciBzaG1nZXQuICAqLworI2RlZmluZSBTSE1fUgkJMDQwMAkJLyogb3IgU19JUlVHTyBmcm9tIDxsaW51eC9zdGF0Lmg+ICovCisjZGVmaW5lIFNITV9XCQkwMjAwCQkvKiBvciBTX0lXVUdPIGZyb20gPGxpbnV4L3N0YXQuaD4gKi8KKworLyogRmxhZ3MgZm9yIGBzaG1hdCcuICAqLworI2RlZmluZSBTSE1fUkRPTkxZCTAxMDAwMAkJLyogYXR0YWNoIHJlYWQtb25seSBlbHNlIHJlYWQtd3JpdGUgKi8KKyNkZWZpbmUgU0hNX1JORAkJMDIwMDAwCQkvKiByb3VuZCBhdHRhY2ggYWRkcmVzcyB0byBTSE1MQkEgKi8KKyNkZWZpbmUgU0hNX1JFTUFQCTA0MDAwMAkJLyogdGFrZS1vdmVyIHJlZ2lvbiBvbiBhdHRhY2ggKi8KKyNkZWZpbmUgU0hNX0VYRUMJMDEwMDAwMAkJLyogZXhlY3V0aW9uIGFjY2VzcyAqLworCisvKiBDb21tYW5kcyBmb3IgYHNobWN0bCcuICAqLworI2RlZmluZSBTSE1fTE9DSwkxMQkJLyogbG9jayBzZWdtZW50IChyb290IG9ubHkpICovCisjZGVmaW5lIFNITV9VTkxPQ0sJMTIJCS8qIHVubG9jayBzZWdtZW50IChyb290IG9ubHkpICovCisKK19fQkVHSU5fREVDTFMKKworLyogU2VnbWVudCBsb3cgYm91bmRhcnkgYWRkcmVzcyBtdWx0aXBsZS4gICovCisjZGVmaW5lIFNITUxCQQkJKF9fZ2V0cGFnZXNpemUgKCkpCitleHRlcm4gaW50IF9fZ2V0cGFnZXNpemUgKHZvaWQpIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisKKy8qIFR5cGUgdG8gY291bnQgbnVtYmVyIG9mIGF0dGFjaGVzLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgc2htYXR0X3Q7CisKKy8qIERhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgYSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQuICAqLworc3RydWN0IHNobWlkX2RzCisgIHsKKyAgICBzdHJ1Y3QgaXBjX3Blcm0gc2htX3Blcm07CQkvKiBvcGVyYXRpb24gcGVybWlzc2lvbiBzdHJ1Y3QgKi8KKyAgICBzaXplX3Qgc2htX3NlZ3N6OwkJCS8qIHNpemUgb2Ygc2VnbWVudCBpbiBieXRlcyAqLworICAgIF9fdGltZV90IHNobV9hdGltZTsJCQkvKiB0aW1lIG9mIGxhc3Qgc2htYXQoKSAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMTsKKyAgICBfX3RpbWVfdCBzaG1fZHRpbWU7CQkJLyogdGltZSBvZiBsYXN0IHNobWR0KCkgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDI7CisgICAgX190aW1lX3Qgc2htX2N0aW1lOwkJCS8qIHRpbWUgb2YgbGFzdCBjaGFuZ2UgYnkgc2htY3RsKCkgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDM7CisgICAgX19waWRfdCBzaG1fY3BpZDsJCQkvKiBwaWQgb2YgY3JlYXRvciAqLworICAgIF9fcGlkX3Qgc2htX2xwaWQ7CQkJLyogcGlkIG9mIGxhc3Qgc2htb3AgKi8KKyAgICBzaG1hdHRfdCBzaG1fbmF0dGNoOwkJLyogbnVtYmVyIG9mIGN1cnJlbnQgYXR0YWNoZXMgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDQ7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ1OworICB9OworCisjaWZkZWYgX19VU0VfTUlTQworCisvKiBpcGNzIGN0bCBjb21tYW5kcyAqLworIyBkZWZpbmUgU0hNX1NUQVQgCTEzCisjIGRlZmluZSBTSE1fSU5GTyAJMTQKKworLyogc2htX21vZGUgdXBwZXIgYnl0ZSBmbGFncyAqLworIyBkZWZpbmUgU0hNX0RFU1QJMDEwMDAJLyogc2VnbWVudCB3aWxsIGJlIGRlc3Ryb3llZCBvbiBsYXN0IGRldGFjaCAqLworIyBkZWZpbmUgU0hNX0xPQ0tFRAkwMjAwMCAgIC8qIHNlZ21lbnQgd2lsbCBub3QgYmUgc3dhcHBlZCAqLworIyBkZWZpbmUgU0hNX0hVR0VUTEIJMDQwMDAJLyogc2VnbWVudCBpcyBtYXBwZWQgdmlhIGh1Z2V0bGIgKi8KKyMgZGVmaW5lIFNITV9OT1JFU0VSVkUJMDEwMDAwCS8qIGRvbid0IGNoZWNrIGZvciByZXNlcnZhdGlvbnMgKi8KKworc3RydWN0CXNobWluZm8KKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNobW1heDsKKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1taW47CisgICAgdW5zaWduZWQgbG9uZyBpbnQgc2htbW5pOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNobXNlZzsKKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1hbGw7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQxOworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMjsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDM7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ0OworICB9OworCitzdHJ1Y3Qgc2htX2luZm8KKyAgeworICAgIGludCB1c2VkX2lkczsKKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1fdG90OwkvKiB0b3RhbCBhbGxvY2F0ZWQgc2htICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc2htX3JzczsJLyogdG90YWwgcmVzaWRlbnQgc2htICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc2htX3N3cDsJLyogdG90YWwgc3dhcHBlZCBzaG0gKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzd2FwX2F0dGVtcHRzOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN3YXBfc3VjY2Vzc2VzOworICB9OworCisjZW5kaWYgLyogX19VU0VfTUlTQyAqLworCitfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ2FjdGlvbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ2FjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmUwNjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2lnYWN0aW9uLmgKQEAgLTAsMCArMSw3OSBAQAorLyogVGhlIHByb3BlciBkZWZpbml0aW9ucyBmb3IgTGludXgncyBzaWdhY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5OSwgMjAwMCwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU0lHTkFMX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc2lnYWN0aW9uLmg+IGRpcmVjdGx5OyB1c2UgPHNpZ25hbC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgYWN0aW9uIHRvIGJlIHRha2VuIHdoZW4gYSBzaWduYWwgYXJyaXZlcy4gICovCitzdHJ1Y3Qgc2lnYWN0aW9uCisgIHsKKyAgICAvKiBTaWduYWwgaGFuZGxlci4gICovCisjaWZkZWYgX19VU0VfUE9TSVgxOTkzMDkKKyAgICB1bmlvbgorICAgICAgeworCS8qIFVzZWQgaWYgU0FfU0lHSU5GTyBpcyBub3Qgc2V0LiAgKi8KKwlfX3NpZ2hhbmRsZXJfdCBzYV9oYW5kbGVyOworCS8qIFVzZWQgaWYgU0FfU0lHSU5GTyBpcyBzZXQuICAqLworCXZvaWQgKCpzYV9zaWdhY3Rpb24pIChpbnQsIHNpZ2luZm9fdCAqLCB2b2lkICopOworICAgICAgfQorICAgIF9fc2lnYWN0aW9uX2hhbmRsZXI7CisjIGRlZmluZSBzYV9oYW5kbGVyCV9fc2lnYWN0aW9uX2hhbmRsZXIuc2FfaGFuZGxlcgorIyBkZWZpbmUgc2Ffc2lnYWN0aW9uCV9fc2lnYWN0aW9uX2hhbmRsZXIuc2Ffc2lnYWN0aW9uCisjZWxzZQorICAgIF9fc2lnaGFuZGxlcl90IHNhX2hhbmRsZXI7CisjZW5kaWYKKworICAgIC8qIEFkZGl0aW9uYWwgc2V0IG9mIHNpZ25hbHMgdG8gYmUgYmxvY2tlZC4gICovCisgICAgX19zaWdzZXRfdCBzYV9tYXNrOworCisgICAgLyogU3BlY2lhbCBmbGFncy4gICovCisgICAgaW50IHNhX2ZsYWdzOworCisgICAgLyogUmVzdG9yZSBoYW5kbGVyLiAgKi8KKyAgICB2b2lkICgqc2FfcmVzdG9yZXIpICh2b2lkKTsKKyAgfTsKKworLyogQml0cyBpbiBgc2FfZmxhZ3MnLiAgKi8KKyNkZWZpbmUJU0FfTk9DTERTVE9QICAxCQkgLyogRG9uJ3Qgc2VuZCBTSUdDSExEIHdoZW4gY2hpbGRyZW4gc3RvcC4gICovCisjZGVmaW5lIFNBX05PQ0xEV0FJVCAgMgkJIC8qIERvbid0IGNyZWF0ZSB6b21iaWUgb24gY2hpbGQgZGVhdGguICAqLworI2RlZmluZSBTQV9TSUdJTkZPICAgIDQJCSAvKiBJbnZva2Ugc2lnbmFsLWNhdGNoaW5nIGZ1bmN0aW9uIHdpdGgKKwkJCQkgICAgdGhyZWUgYXJndW1lbnRzIGluc3RlYWQgb2Ygb25lLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKyMgZGVmaW5lIFNBX09OU1RBQ0sgICAweDA4MDAwMDAwIC8qIFVzZSBzaWduYWwgc3RhY2sgYnkgdXNpbmcgYHNhX3Jlc3RvcmVyJy4gKi8KKyNlbmRpZgorI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisjIGRlZmluZSBTQV9SRVNUQVJUICAgMHgxMDAwMDAwMCAvKiBSZXN0YXJ0IHN5c2NhbGwgb24gc2lnbmFsIHJldHVybi4gICovCisjIGRlZmluZSBTQV9OT0RFRkVSICAgMHg0MDAwMDAwMCAvKiBEb24ndCBhdXRvbWF0aWNhbGx5IGJsb2NrIHRoZSBzaWduYWwgd2hlbgorCQkJCSAgICBpdHMgaGFuZGxlciBpcyBiZWluZyBleGVjdXRlZC4gICovCisjIGRlZmluZSBTQV9SRVNFVEhBTkQgMHg4MDAwMDAwMCAvKiBSZXNldCB0byBTSUdfREZMIG9uIGVudHJ5IHRvIGhhbmRsZXIuICAqLworI2VuZGlmCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgU0FfSU5URVJSVVBUIDB4MjAwMDAwMDAgLyogSGlzdG9yaWNhbCBuby1vcC4gICovCisKKy8qIFNvbWUgYWxpYXNlcyBmb3IgdGhlIFNBXyBjb25zdGFudHMuICAqLworIyBkZWZpbmUgU0FfTk9NQVNLICAgIFNBX05PREVGRVIKKyMgZGVmaW5lIFNBX09ORVNIT1QgICBTQV9SRVNFVEhBTkQKKyMgZGVmaW5lIFNBX1NUQUNLICAgICBTQV9PTlNUQUNLCisjZW5kaWYKKworLyogVmFsdWVzIGZvciB0aGUgSE9XIGFyZ3VtZW50IHRvIGBzaWdwcm9jbWFzaycuICAqLworI2RlZmluZQlTSUdfQkxPQ0sgICAgIDAJCSAvKiBCbG9jayBzaWduYWxzLiAgKi8KKyNkZWZpbmUJU0lHX1VOQkxPQ0sgICAxCQkgLyogVW5ibG9jayBzaWduYWxzLiAgKi8KKyNkZWZpbmUJU0lHX1NFVE1BU0sgICAyCQkgLyogU2V0IHRoZSBzZXQgb2YgYmxvY2tlZCBzaWduYWxzLiAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWdjb250ZXh0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2lnY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNWI2MDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2lnY29udGV4dC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9TSUdOQUxfSCAmJiAhZGVmaW5lZCBfU1lTX1VDT05URVhUX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9zaWdjb250ZXh0Lmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzaWduYWwuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBzaWdjb250ZXh0X3N0cnVjdAorLyogS2VybmVsIGhlYWRlcnMgYmVmb3JlIDIuMS4xIGRlZmluZSBhIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCwgYnV0CisgICB3ZSBuZWVkIHNpZ2NvbnRleHQuICAqLworIyBkZWZpbmUgc2lnY29udGV4dF9zdHJ1Y3Qgc2lnY29udGV4dAorCisjIGluY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+CisKKy8qIFRoZSBMaW51eCBrZXJuZWwgaGVhZGVycyByZWRlZmluZSBOVUxMIHdyb25nbHksIHNvIGNsZWFudXAgYWZ0ZXJ3YXJkcy4gICovCisjIGRlZmluZSBfX25lZWRfTlVMTAorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ2luZm8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWdpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkZDRjMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWdpbmZvLmgKQEAgLTAsMCArMSwzMTMgQEAKKy8qIHNpZ2luZm9fdCwgc2lnZXZlbnQgYW5kIGNvbnN0YW50cy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiwgMjAwMywgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9TSUdOQUxfSCAmJiAhZGVmaW5lZCBfX25lZWRfc2lnaW5mb190IFwKKyAgICAmJiAhZGVmaW5lZCBfX25lZWRfc2lnZXZlbnRfdAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuICBVc2UgPHNpZ25hbC5oPiBpbnN0ZWFkIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKyNpZiAoIWRlZmluZWQgX19oYXZlX3NpZ3ZhbF90IFwKKyAgICAgJiYgKGRlZmluZWQgX1NJR05BTF9IIHx8IGRlZmluZWQgX19uZWVkX3NpZ2luZm9fdCBcCisJIHx8IGRlZmluZWQgX19uZWVkX3NpZ2V2ZW50X3QpKQorIyBkZWZpbmUgX19oYXZlX3NpZ3ZhbF90CTEKKworLyogVHlwZSBmb3IgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBzaWduYWwuICAqLwordHlwZWRlZiB1bmlvbiBzaWd2YWwKKyAgeworICAgIGludCBzaXZhbF9pbnQ7CisgICAgdm9pZCAqc2l2YWxfcHRyOworICB9IHNpZ3ZhbF90OworI2VuZGlmCisKKyNpZiAoIWRlZmluZWQgX19oYXZlX3NpZ2luZm9fdCBcCisgICAgICYmIChkZWZpbmVkIF9TSUdOQUxfSCB8fCBkZWZpbmVkIF9fbmVlZF9zaWdpbmZvX3QpKQorIyBkZWZpbmUgX19oYXZlX3NpZ2luZm9fdAkxCisKKyMgZGVmaW5lIF9fU0lfTUFYX1NJWkUgICAgIDEyOAorIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgX19TSV9QQURfU0laRSAgICAgKChfX1NJX01BWF9TSVpFIC8gc2l6ZW9mIChpbnQpKSAtIDQpCisjIGVsc2UKKyMgIGRlZmluZSBfX1NJX1BBRF9TSVpFICAgICAoKF9fU0lfTUFYX1NJWkUgLyBzaXplb2YgKGludCkpIC0gMykKKyMgZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc2lnaW5mbworICB7CisgICAgaW50IHNpX3NpZ25vOwkJLyogU2lnbmFsIG51bWJlci4gICovCisgICAgaW50IHNpX2Vycm5vOwkJLyogSWYgbm9uLXplcm8sIGFuIGVycm5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aAorCQkJCSAgIHRoaXMgc2lnbmFsLCBhcyBkZWZpbmVkIGluIDxlcnJuby5oPi4gICovCisgICAgaW50IHNpX2NvZGU7CQkvKiBTaWduYWwgY29kZS4gICovCisKKyAgICB1bmlvbgorICAgICAgeworCWludCBfcGFkW19fU0lfUEFEX1NJWkVdOworCisJIC8qIGtpbGwoKS4gICovCisJc3RydWN0CisJICB7CisJICAgIF9fcGlkX3Qgc2lfcGlkOwkvKiBTZW5kaW5nIHByb2Nlc3MgSUQuICAqLworCSAgICBfX3VpZF90IHNpX3VpZDsJLyogUmVhbCB1c2VyIElEIG9mIHNlbmRpbmcgcHJvY2Vzcy4gICovCisJICB9IF9raWxsOworCisJLyogUE9TSVguMWIgdGltZXJzLiAgKi8KKwlzdHJ1Y3QKKwkgIHsKKwkgICAgaW50IHNpX3RpZDsJCS8qIFRpbWVyIElELiAgKi8KKwkgICAgaW50IHNpX292ZXJydW47CS8qIE92ZXJydW4gY291bnQuICAqLworCSAgICBzaWd2YWxfdCBzaV9zaWd2YWw7CS8qIFNpZ25hbCB2YWx1ZS4gICovCisJICB9IF90aW1lcjsKKworCS8qIFBPU0lYLjFiIHNpZ25hbHMuICAqLworCXN0cnVjdAorCSAgeworCSAgICBfX3BpZF90IHNpX3BpZDsJLyogU2VuZGluZyBwcm9jZXNzIElELiAgKi8KKwkgICAgX191aWRfdCBzaV91aWQ7CS8qIFJlYWwgdXNlciBJRCBvZiBzZW5kaW5nIHByb2Nlc3MuICAqLworCSAgICBzaWd2YWxfdCBzaV9zaWd2YWw7CS8qIFNpZ25hbCB2YWx1ZS4gICovCisJICB9IF9ydDsKKworCS8qIFNJR0NITEQuICAqLworCXN0cnVjdAorCSAgeworCSAgICBfX3BpZF90IHNpX3BpZDsJLyogV2hpY2ggY2hpbGQuICAqLworCSAgICBfX3VpZF90IHNpX3VpZDsJLyogUmVhbCB1c2VyIElEIG9mIHNlbmRpbmcgcHJvY2Vzcy4gICovCisJICAgIGludCBzaV9zdGF0dXM7CS8qIEV4aXQgdmFsdWUgb3Igc2lnbmFsLiAgKi8KKwkgICAgX19jbG9ja190IHNpX3V0aW1lOworCSAgICBfX2Nsb2NrX3Qgc2lfc3RpbWU7CisJICB9IF9zaWdjaGxkOworCisJLyogU0lHSUxMLCBTSUdGUEUsIFNJR1NFR1YsIFNJR0JVUy4gICovCisJc3RydWN0CisJICB7CisJICAgIHZvaWQgKnNpX2FkZHI7CS8qIEZhdWx0aW5nIGluc24vbWVtb3J5IHJlZi4gICovCisJICB9IF9zaWdmYXVsdDsKKworCS8qIFNJR1BPTEwuICAqLworCXN0cnVjdAorCSAgeworCSAgICBsb25nIGludCBzaV9iYW5kOwkvKiBCYW5kIGV2ZW50IGZvciBTSUdQT0xMLiAgKi8KKwkgICAgaW50IHNpX2ZkOworCSAgfSBfc2lncG9sbDsKKyAgICAgIH0gX3NpZmllbGRzOworICB9IHNpZ2luZm9fdDsKKworCisvKiBYL09wZW4gcmVxdWlyZXMgc29tZSBtb3JlIGZpZWxkcyB3aXRoIGZpeGVkIG5hbWVzLiAgKi8KKyMgZGVmaW5lIHNpX3BpZAkJX3NpZmllbGRzLl9raWxsLnNpX3BpZAorIyBkZWZpbmUgc2lfdWlkCQlfc2lmaWVsZHMuX2tpbGwuc2lfdWlkCisjIGRlZmluZSBzaV90aW1lcmlkCV9zaWZpZWxkcy5fdGltZXIuc2lfdGlkCisjIGRlZmluZSBzaV9vdmVycnVuCV9zaWZpZWxkcy5fdGltZXIuc2lfb3ZlcnJ1bgorIyBkZWZpbmUgc2lfc3RhdHVzCV9zaWZpZWxkcy5fc2lnY2hsZC5zaV9zdGF0dXMKKyMgZGVmaW5lIHNpX3V0aW1lCV9zaWZpZWxkcy5fc2lnY2hsZC5zaV91dGltZQorIyBkZWZpbmUgc2lfc3RpbWUJX3NpZmllbGRzLl9zaWdjaGxkLnNpX3N0aW1lCisjIGRlZmluZSBzaV92YWx1ZQlfc2lmaWVsZHMuX3J0LnNpX3NpZ3ZhbAorIyBkZWZpbmUgc2lfaW50CQlfc2lmaWVsZHMuX3J0LnNpX3NpZ3ZhbC5zaXZhbF9pbnQKKyMgZGVmaW5lIHNpX3B0cgkJX3NpZmllbGRzLl9ydC5zaV9zaWd2YWwuc2l2YWxfcHRyCisjIGRlZmluZSBzaV9hZGRyCV9zaWZpZWxkcy5fc2lnZmF1bHQuc2lfYWRkcgorIyBkZWZpbmUgc2lfYmFuZAlfc2lmaWVsZHMuX3NpZ3BvbGwuc2lfYmFuZAorIyBkZWZpbmUgc2lfZmQJCV9zaWZpZWxkcy5fc2lncG9sbC5zaV9mZAorCisKKy8qIFZhbHVlcyBmb3IgYHNpX2NvZGUnLiAgUG9zaXRpdmUgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3Iga2VybmVsLWdlbmVyYXRlZAorICAgc2lnbmFscy4gICovCitlbnVtCit7CisgIFNJX0FTWU5DTkwgPSAtNjAsCQkvKiBTZW50IGJ5IGFzeW5jaCBuYW1lIGxvb2t1cCBjb21wbGV0aW9uLiAgKi8KKyMgZGVmaW5lIFNJX0FTWU5DTkwJU0lfQVNZTkNOTAorICBTSV9US0lMTCA9IC02LAkJLyogU2VudCBieSB0a2lsbC4gICovCisjIGRlZmluZSBTSV9US0lMTAlTSV9US0lMTAorICBTSV9TSUdJTywJCQkvKiBTZW50IGJ5IHF1ZXVlZCBTSUdJTy4gKi8KKyMgZGVmaW5lIFNJX1NJR0lPCVNJX1NJR0lPCisgIFNJX0FTWU5DSU8sCQkJLyogU2VudCBieSBBSU8gY29tcGxldGlvbi4gICovCisjIGRlZmluZSBTSV9BU1lOQ0lPCVNJX0FTWU5DSU8KKyAgU0lfTUVTR1EsCQkJLyogU2VudCBieSByZWFsIHRpbWUgbWVzcSBzdGF0ZSBjaGFuZ2UuICAqLworIyBkZWZpbmUgU0lfTUVTR1EJU0lfTUVTR1EKKyAgU0lfVElNRVIsCQkJLyogU2VudCBieSB0aW1lciBleHBpcmF0aW9uLiAgKi8KKyMgZGVmaW5lIFNJX1RJTUVSCVNJX1RJTUVSCisgIFNJX1FVRVVFLAkJCS8qIFNlbnQgYnkgc2lncXVldWUuICAqLworIyBkZWZpbmUgU0lfUVVFVUUJU0lfUVVFVUUKKyAgU0lfVVNFUiwJCQkvKiBTZW50IGJ5IGtpbGwsIHNpZ3NlbmQuICAqLworIyBkZWZpbmUgU0lfVVNFUglTSV9VU0VSCisgIFNJX0tFUk5FTCA9IDB4ODAJCS8qIFNlbmQgYnkga2VybmVsLiAgKi8KKyNkZWZpbmUgU0lfS0VSTkVMCVNJX0tFUk5FTAorfTsKKworCisvKiBgc2lfY29kZScgdmFsdWVzIGZvciBTSUdJTEwgc2lnbmFsLiAgKi8KK2VudW0KK3sKKyAgSUxMX0lMTE9QQyA9IDEsCQkvKiBJbGxlZ2FsIG9wY29kZS4gICovCisjIGRlZmluZSBJTExfSUxMT1BDCUlMTF9JTExPUEMKKyAgSUxMX0lMTE9QTiwJCQkvKiBJbGxlZ2FsIG9wZXJhbmQuICAqLworIyBkZWZpbmUgSUxMX0lMTE9QTglJTExfSUxMT1BOCisgIElMTF9JTExBRFIsCQkJLyogSWxsZWdhbCBhZGRyZXNzaW5nIG1vZGUuICAqLworIyBkZWZpbmUgSUxMX0lMTEFEUglJTExfSUxMQURSCisgIElMTF9JTExUUlAsCQkJLyogSWxsZWdhbCB0cmFwLiAqLworIyBkZWZpbmUgSUxMX0lMTFRSUAlJTExfSUxMVFJQCisgIElMTF9QUlZPUEMsCQkJLyogUHJpdmlsZWdlZCBvcGNvZGUuICAqLworIyBkZWZpbmUgSUxMX1BSVk9QQwlJTExfUFJWT1BDCisgIElMTF9QUlZSRUcsCQkJLyogUHJpdmlsZWdlZCByZWdpc3Rlci4gICovCisjIGRlZmluZSBJTExfUFJWUkVHCUlMTF9QUlZSRUcKKyAgSUxMX0NPUFJPQywJCQkvKiBDb3Byb2Nlc3NvciBlcnJvci4gICovCisjIGRlZmluZSBJTExfQ09QUk9DCUlMTF9DT1BST0MKKyAgSUxMX0JBRFNUSwkJCS8qIEludGVybmFsIHN0YWNrIGVycm9yLiAgKi8KKyMgZGVmaW5lIElMTF9CQURTVEsJSUxMX0JBRFNUSworfTsKKworLyogYHNpX2NvZGUnIHZhbHVlcyBmb3IgU0lHRlBFIHNpZ25hbC4gICovCitlbnVtCit7CisgIEZQRV9JTlRESVYgPSAxLAkJLyogSW50ZWdlciBkaXZpZGUgYnkgemVyby4gICovCisjIGRlZmluZSBGUEVfSU5URElWCUZQRV9JTlRESVYKKyAgRlBFX0lOVE9WRiwJCQkvKiBJbnRlZ2VyIG92ZXJmbG93LiAgKi8KKyMgZGVmaW5lIEZQRV9JTlRPVkYJRlBFX0lOVE9WRgorICBGUEVfRkxURElWLAkJCS8qIEZsb2F0aW5nIHBvaW50IGRpdmlkZSBieSB6ZXJvLiAgKi8KKyMgZGVmaW5lIEZQRV9GTFRESVYJRlBFX0ZMVERJVgorICBGUEVfRkxUT1ZGLAkJCS8qIEZsb2F0aW5nIHBvaW50IG92ZXJmbG93LiAgKi8KKyMgZGVmaW5lIEZQRV9GTFRPVkYJRlBFX0ZMVE9WRgorICBGUEVfRkxUVU5ELAkJCS8qIEZsb2F0aW5nIHBvaW50IHVuZGVyZmxvdy4gICovCisjIGRlZmluZSBGUEVfRkxUVU5ECUZQRV9GTFRVTkQKKyAgRlBFX0ZMVFJFUywJCQkvKiBGbG9hdGluZyBwb2ludCBpbmV4YWN0IHJlc3VsdC4gICovCisjIGRlZmluZSBGUEVfRkxUUkVTCUZQRV9GTFRSRVMKKyAgRlBFX0ZMVElOViwJCQkvKiBGbG9hdGluZyBwb2ludCBpbnZhbGlkIG9wZXJhdGlvbi4gICovCisjIGRlZmluZSBGUEVfRkxUSU5WCUZQRV9GTFRJTlYKKyAgRlBFX0ZMVFNVQgkJCS8qIFN1YnNjcmlwdCBvdXQgb2YgcmFuZ2UuICAqLworIyBkZWZpbmUgRlBFX0ZMVFNVQglGUEVfRkxUU1VCCit9OworCisvKiBgc2lfY29kZScgdmFsdWVzIGZvciBTSUdTRUdWIHNpZ25hbC4gICovCitlbnVtCit7CisgIFNFR1ZfTUFQRVJSID0gMSwJCS8qIEFkZHJlc3Mgbm90IG1hcHBlZCB0byBvYmplY3QuICAqLworIyBkZWZpbmUgU0VHVl9NQVBFUlIJU0VHVl9NQVBFUlIKKyAgU0VHVl9BQ0NFUlIJCQkvKiBJbnZhbGlkIHBlcm1pc3Npb25zIGZvciBtYXBwZWQgb2JqZWN0LiAgKi8KKyMgZGVmaW5lIFNFR1ZfQUNDRVJSCVNFR1ZfQUNDRVJSCit9OworCisvKiBgc2lfY29kZScgdmFsdWVzIGZvciBTSUdCVVMgc2lnbmFsLiAgKi8KK2VudW0KK3sKKyAgQlVTX0FEUkFMTiA9IDEsCQkvKiBJbnZhbGlkIGFkZHJlc3MgYWxpZ25tZW50LiAgKi8KKyMgZGVmaW5lIEJVU19BRFJBTE4JQlVTX0FEUkFMTgorICBCVVNfQURSRVJSLAkJCS8qIE5vbi1leGlzdGFudCBwaHlzaWNhbCBhZGRyZXNzLiAgKi8KKyMgZGVmaW5lIEJVU19BRFJFUlIJQlVTX0FEUkVSUgorICBCVVNfT0JKRVJSCQkJLyogT2JqZWN0IHNwZWNpZmljIGhhcmR3YXJlIGVycm9yLiAgKi8KKyMgZGVmaW5lIEJVU19PQkpFUlIJQlVTX09CSkVSUgorfTsKKworLyogYHNpX2NvZGUnIHZhbHVlcyBmb3IgU0lHVFJBUCBzaWduYWwuICAqLworZW51bQoreworICBUUkFQX0JSS1BUID0gMSwJCS8qIFByb2Nlc3MgYnJlYWtwb2ludC4gICovCisjIGRlZmluZSBUUkFQX0JSS1BUCVRSQVBfQlJLUFQKKyAgVFJBUF9UUkFDRQkJCS8qIFByb2Nlc3MgdHJhY2UgdHJhcC4gICovCisjIGRlZmluZSBUUkFQX1RSQUNFCVRSQVBfVFJBQ0UKK307CisKKy8qIGBzaV9jb2RlJyB2YWx1ZXMgZm9yIFNJR0NITEQgc2lnbmFsLiAgKi8KK2VudW0KK3sKKyAgQ0xEX0VYSVRFRCA9IDEsCQkvKiBDaGlsZCBoYXMgZXhpdGVkLiAgKi8KKyMgZGVmaW5lIENMRF9FWElURUQJQ0xEX0VYSVRFRAorICBDTERfS0lMTEVELAkJCS8qIENoaWxkIHdhcyBraWxsZWQuICAqLworIyBkZWZpbmUgQ0xEX0tJTExFRAlDTERfS0lMTEVECisgIENMRF9EVU1QRUQsCQkJLyogQ2hpbGQgdGVybWluYXRlZCBhYm5vcm1hbGx5LiAgKi8KKyMgZGVmaW5lIENMRF9EVU1QRUQJQ0xEX0RVTVBFRAorICBDTERfVFJBUFBFRCwJCQkvKiBUcmFjZWQgY2hpbGQgaGFzIHRyYXBwZWQuICAqLworIyBkZWZpbmUgQ0xEX1RSQVBQRUQJQ0xEX1RSQVBQRUQKKyAgQ0xEX1NUT1BQRUQsCQkJLyogQ2hpbGQgaGFzIHN0b3BwZWQuICAqLworIyBkZWZpbmUgQ0xEX1NUT1BQRUQJQ0xEX1NUT1BQRUQKKyAgQ0xEX0NPTlRJTlVFRAkJCS8qIFN0b3BwZWQgY2hpbGQgaGFzIGNvbnRpbnVlZC4gICovCisjIGRlZmluZSBDTERfQ09OVElOVUVECUNMRF9DT05USU5VRUQKK307CisKKy8qIGBzaV9jb2RlJyB2YWx1ZXMgZm9yIFNJR1BPTEwgc2lnbmFsLiAgKi8KK2VudW0KK3sKKyAgUE9MTF9JTiA9IDEsCQkJLyogRGF0YSBpbnB1dCBhdmFpbGFibGUuICAqLworIyBkZWZpbmUgUE9MTF9JTglQT0xMX0lOCisgIFBPTExfT1VULAkJCS8qIE91dHB1dCBidWZmZXJzIGF2YWlsYWJsZS4gICovCisjIGRlZmluZSBQT0xMX09VVAlQT0xMX09VVAorICBQT0xMX01TRywJCQkvKiBJbnB1dCBtZXNzYWdlIGF2YWlsYWJsZS4gICAqLworIyBkZWZpbmUgUE9MTF9NU0cJUE9MTF9NU0cKKyAgUE9MTF9FUlIsCQkJLyogSS9PIGVycm9yLiAgKi8KKyMgZGVmaW5lIFBPTExfRVJSCVBPTExfRVJSCisgIFBPTExfUFJJLAkJCS8qIEhpZ2ggcHJpb3JpdHkgaW5wdXQgYXZhaWxhYmxlLiAgKi8KKyMgZGVmaW5lIFBPTExfUFJJCVBPTExfUFJJCisgIFBPTExfSFVQCQkJLyogRGV2aWNlIGRpc2Nvbm5lY3RlZC4gICovCisjIGRlZmluZSBQT0xMX0hVUAlQT0xMX0hVUAorfTsKKworIyB1bmRlZiBfX25lZWRfc2lnaW5mb190CisjZW5kaWYJLyogIWhhdmUgc2lnaW5mb190ICYmIChoYXZlIF9TSUdOQUxfSCB8fCBuZWVkIHNpZ2luZm9fdCkuICAqLworCisKKyNpZiAoZGVmaW5lZCBfU0lHTkFMX0ggfHwgZGVmaW5lZCBfX25lZWRfc2lnZXZlbnRfdCkgXAorICAgICYmICFkZWZpbmVkIF9faGF2ZV9zaWdldmVudF90CisjIGRlZmluZSBfX2hhdmVfc2lnZXZlbnRfdAkxCisKKy8qIFN0cnVjdHVyZSB0byB0cmFuc3BvcnQgYXBwbGljYXRpb24tZGVmaW5lZCB2YWx1ZXMgd2l0aCBzaWduYWxzLiAgKi8KKyMgZGVmaW5lIF9fU0lHRVZfTUFYX1NJWkUJNjQKKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIF9fU0lHRVZfUEFEX1NJWkUJKChfX1NJR0VWX01BWF9TSVpFIC8gc2l6ZW9mIChpbnQpKSAtIDQpCisjIGVsc2UKKyMgIGRlZmluZSBfX1NJR0VWX1BBRF9TSVpFCSgoX19TSUdFVl9NQVhfU0laRSAvIHNpemVvZiAoaW50KSkgLSAzKQorIyBlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzaWdldmVudAorICB7CisgICAgc2lndmFsX3Qgc2lnZXZfdmFsdWU7CisgICAgaW50IHNpZ2V2X3NpZ25vOworICAgIGludCBzaWdldl9ub3RpZnk7CisKKyAgICB1bmlvbgorICAgICAgeworCWludCBfcGFkW19fU0lHRVZfUEFEX1NJWkVdOworCisJLyogV2hlbiBTSUdFVl9TSUdOQUwgYW5kIFNJR0VWX1RIUkVBRF9JRCBzZXQsIExXUCBJRCBvZiB0aGUKKwkgICB0aHJlYWQgdG8gcmVjZWl2ZSB0aGUgc2lnbmFsLiAgKi8KKwlfX3BpZF90IF90aWQ7CisKKwlzdHJ1Y3QKKwkgIHsKKwkgICAgdm9pZCAoKl9mdW5jdGlvbikgKHNpZ3ZhbF90KTsJLyogRnVuY3Rpb24gdG8gc3RhcnQuICAqLworCSAgICB2b2lkICpfYXR0cmlidXRlOwkJCS8qIFJlYWxseSBwdGhyZWFkX2F0dHJfdC4gICovCisJICB9IF9zaWdldl90aHJlYWQ7CisgICAgICB9IF9zaWdldl91bjsKKyAgfSBzaWdldmVudF90OworCisvKiBQT1NJWCBuYW1lcyB0byBhY2Nlc3Mgc29tZSBvZiB0aGUgbWVtYmVycy4gICovCisjIGRlZmluZSBzaWdldl9ub3RpZnlfZnVuY3Rpb24gICBfc2lnZXZfdW4uX3NpZ2V2X3RocmVhZC5fZnVuY3Rpb24KKyMgZGVmaW5lIHNpZ2V2X25vdGlmeV9hdHRyaWJ1dGVzIF9zaWdldl91bi5fc2lnZXZfdGhyZWFkLl9hdHRyaWJ1dGUKKworLyogYHNpZ2V2X25vdGlmeScgdmFsdWVzLiAgKi8KK2VudW0KK3sKKyAgU0lHRVZfU0lHTkFMID0gMCwJCS8qIE5vdGlmeSB2aWEgc2lnbmFsLiAgKi8KKyMgZGVmaW5lIFNJR0VWX1NJR05BTAlTSUdFVl9TSUdOQUwKKyAgU0lHRVZfTk9ORSwJCQkvKiBPdGhlciBub3RpZmljYXRpb246IG1lYW5pbmdsZXNzLiAgKi8KKyMgZGVmaW5lIFNJR0VWX05PTkUJU0lHRVZfTk9ORQorICBTSUdFVl9USFJFQUQsCQkJLyogRGVsaXZlciB2aWEgdGhyZWFkIGNyZWF0aW9uLiAgKi8KKyMgZGVmaW5lIFNJR0VWX1RIUkVBRAlTSUdFVl9USFJFQUQKKworICBTSUdFVl9USFJFQURfSUQgPSA0CQkvKiBTZW5kIHNpZ25hbCB0byBzcGVjaWZpYyB0aHJlYWQuICAqLworI2RlZmluZSBTSUdFVl9USFJFQURfSUQJU0lHRVZfVEhSRUFEX0lECit9OworCisjZW5kaWYJLyogaGF2ZSBfU0lHTkFMX0guICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ251bS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ251bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOGFjMTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2lnbnVtLmgKQEAgLTAsMCArMSw4MCBAQAorLyogU2lnbmFsIG51bWJlciBkZWZpbml0aW9ucy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsMTk5NiwxOTk3LDE5OTgsMTk5OSwyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZkZWYJX1NJR05BTF9ICisKKy8qIEZha2Ugc2lnbmFsIGZ1bmN0aW9ucy4gICovCisjZGVmaW5lIFNJR19FUlIJKChfX3NpZ2hhbmRsZXJfdCkgLTEpCQkvKiBFcnJvciByZXR1cm4uICAqLworI2RlZmluZSBTSUdfREZMCSgoX19zaWdoYW5kbGVyX3QpIDApCQkvKiBEZWZhdWx0IGFjdGlvbi4gICovCisjZGVmaW5lIFNJR19JR04JKChfX3NpZ2hhbmRsZXJfdCkgMSkJCS8qIElnbm9yZSBzaWduYWwuICAqLworCisjaWZkZWYgX19VU0VfVU5JWDk4CisjIGRlZmluZSBTSUdfSE9MRAkoKF9fc2lnaGFuZGxlcl90KSAyKQkvKiBBZGQgc2lnbmFsIHRvIGhvbGQgbWFzay4gICovCisjZW5kaWYKKworCisvKiBTaWduYWxzLiAgKi8KKyNkZWZpbmUJU0lHSFVQCQkxCS8qIEhhbmd1cCAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHSU5UCQkyCS8qIEludGVycnVwdCAoQU5TSSkuICAqLworI2RlZmluZQlTSUdRVUlUCQkzCS8qIFF1aXQgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR0lMTAkJNAkvKiBJbGxlZ2FsIGluc3RydWN0aW9uIChBTlNJKS4gICovCisjZGVmaW5lCVNJR1RSQVAJCTUJLyogVHJhY2UgdHJhcCAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHQUJSVAkJNgkvKiBBYm9ydCAoQU5TSSkuICAqLworI2RlZmluZQlTSUdJT1QJCTYJLyogSU9UIHRyYXAgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHQlVTCQk3CS8qIEJVUyBlcnJvciAoNC4yIEJTRCkuICAqLworI2RlZmluZQlTSUdGUEUJCTgJLyogRmxvYXRpbmctcG9pbnQgZXhjZXB0aW9uIChBTlNJKS4gICovCisjZGVmaW5lCVNJR0tJTEwJCTkJLyogS2lsbCwgdW5ibG9ja2FibGUgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1VTUjEJCTEwCS8qIFVzZXItZGVmaW5lZCBzaWduYWwgMSAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHU0VHVgkJMTEJLyogU2VnbWVudGF0aW9uIHZpb2xhdGlvbiAoQU5TSSkuICAqLworI2RlZmluZQlTSUdVU1IyCQkxMgkvKiBVc2VyLWRlZmluZWQgc2lnbmFsIDIgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1BJUEUJCTEzCS8qIEJyb2tlbiBwaXBlIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdBTFJNCQkxNAkvKiBBbGFybSBjbG9jayAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHVEVSTQkJMTUJLyogVGVybWluYXRpb24gKEFOU0kpLiAgKi8KKyNkZWZpbmUJU0lHU1RLRkxUCTE2CS8qIFN0YWNrIGZhdWx0LiAgKi8KKyNkZWZpbmUJU0lHQ0xECQlTSUdDSExECS8qIFNhbWUgYXMgU0lHQ0hMRCAoU3lzdGVtIFYpLiAgKi8KKyNkZWZpbmUJU0lHQ0hMRAkJMTcJLyogQ2hpbGQgc3RhdHVzIGhhcyBjaGFuZ2VkIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdDT05UCQkxOAkvKiBDb250aW51ZSAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHU1RPUAkJMTkJLyogU3RvcCwgdW5ibG9ja2FibGUgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1RTVFAJCTIwCS8qIEtleWJvYXJkIHN0b3AgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1RUSU4JCTIxCS8qIEJhY2tncm91bmQgcmVhZCBmcm9tIHR0eSAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHVFRPVQkJMjIJLyogQmFja2dyb3VuZCB3cml0ZSB0byB0dHkgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1VSRwkJMjMJLyogVXJnZW50IGNvbmRpdGlvbiBvbiBzb2NrZXQgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHWENQVQkJMjQJLyogQ1BVIGxpbWl0IGV4Y2VlZGVkICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR1hGU1oJCTI1CS8qIEZpbGUgc2l6ZSBsaW1pdCBleGNlZWRlZCAoNC4yIEJTRCkuICAqLworI2RlZmluZQlTSUdWVEFMUk0JMjYJLyogVmlydHVhbCBhbGFybSBjbG9jayAoNC4yIEJTRCkuICAqLworI2RlZmluZQlTSUdQUk9GCQkyNwkvKiBQcm9maWxpbmcgYWxhcm0gY2xvY2sgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHV0lOQ0gJMjgJLyogV2luZG93IHNpemUgY2hhbmdlICg0LjMgQlNELCBTdW4pLiAgKi8KKyNkZWZpbmUJU0lHUE9MTAkJU0lHSU8JLyogUG9sbGFibGUgZXZlbnQgb2NjdXJyZWQgKFN5c3RlbSBWKS4gICovCisjZGVmaW5lCVNJR0lPCQkyOQkvKiBJL08gbm93IHBvc3NpYmxlICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR1BXUgkJMzAJLyogUG93ZXIgZmFpbHVyZSByZXN0YXJ0IChTeXN0ZW0gVikuICAqLworI2RlZmluZSBTSUdTWVMJCTMxCS8qIEJhZCBzeXN0ZW0gY2FsbC4gICovCisjZGVmaW5lIFNJR1VOVVNFRAkzMQorCisjZGVmaW5lCV9OU0lHCQk2NQkvKiBCaWdnZXN0IHNpZ25hbCBudW1iZXIgKyAxCisJCQkJICAgKGluY2x1ZGluZyByZWFsLXRpbWUgc2lnbmFscykuICAqLworCisjZGVmaW5lIFNJR1JUTUlOICAgICAgICAoX19saWJjX2N1cnJlbnRfc2lncnRtaW4gKCkpCisjZGVmaW5lIFNJR1JUTUFYICAgICAgICAoX19saWJjX2N1cnJlbnRfc2lncnRtYXggKCkpCisKKy8qIFRoZXNlIGFyZSB0aGUgaGFyZCBsaW1pdHMgb2YgdGhlIGtlcm5lbC4gIFRoZXNlIHZhbHVlcyBzaG91bGQgbm90IGJlCisgICB1c2VkIGRpcmVjdGx5IGF0IHVzZXIgbGV2ZWwuICAqLworI2RlZmluZSBfX1NJR1JUTUlOCTMyCisjZGVmaW5lIF9fU0lHUlRNQVgJKF9OU0lHIC0gMSkKKworI2VuZGlmCS8qIDxzaWduYWwuaD4gaW5jbHVkZWQuICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ3NldC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZWM4YWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2lnc2V0LmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qIF9fc2lnX2F0b21pY190LCBfX3NpZ3NldF90LCBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTQsIDE5OTYsIDE5OTcsIDIwMDcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TSUdTRVRfSF90eXBlcworIyBkZWZpbmUgX1NJR1NFVF9IX3R5cGVzCTEKKwordHlwZWRlZiBpbnQgX19zaWdfYXRvbWljX3Q7CisKKy8qIEEgYHNpZ3NldF90JyBoYXMgYSBiaXQgZm9yIGVhY2ggc2lnbmFsLiAgKi8KKworIyBkZWZpbmUgX1NJR1NFVF9OV09SRFMJKDEwMjQgLyAoOCAqIHNpemVvZiAodW5zaWduZWQgbG9uZyBpbnQpKSkKK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3ZhbFtfU0lHU0VUX05XT1JEU107CisgIH0gX19zaWdzZXRfdDsKKworI2VuZGlmCisKKworLyogV2Ugb25seSB3YW50IHRvIGRlZmluZSB0aGVzZSBmdW5jdGlvbnMgaWYgPHNpZ25hbC5oPiB3YXMgYWN0dWFsbHkKKyAgIGluY2x1ZGVkOyBvdGhlcndpc2Ugd2Ugd2VyZSBpbmNsdWRlZCBqdXN0IHRvIGRlZmluZSB0aGUgdHlwZXMuICBTaW5jZSB3ZQorICAgYXJlIG5hbWVzcGFjZS1jbGVhbiwgaXQgd291bGRuJ3QgaHVydCB0byBkZWZpbmUgZXh0cmEgbWFjcm9zLiAgQnV0CisgICB0cm91YmxlIGNhbiBiZSBjYXVzZWQgYnkgZnVuY3Rpb25zIGJlaW5nIGRlZmluZWQgKGUuZy4sIGFueSBnbG9iYWwKKyAgIHJlZ2lzdGVyIHZhcnMgZGVjbGFyZWQgbGF0ZXIgd2lsbCBjYXVzZSBjb21waWxhdGlvbiBlcnJvcnMpLiAgKi8KKworI2lmICFkZWZpbmVkIF9TSUdTRVRfSF9mbnMgJiYgZGVmaW5lZCBfU0lHTkFMX0gKKyMgZGVmaW5lIF9TSUdTRVRfSF9mbnMgMQorCisjIGlmbmRlZiBfRVhURVJOX0lOTElORQorIyAgZGVmaW5lIF9FWFRFUk5fSU5MSU5FIF9fZXh0ZXJuX2lubGluZQorIyBlbmRpZgorCisvKiBSZXR1cm4gYSBtYXNrIHRoYXQgaW5jbHVkZXMgdGhlIGJpdCBmb3IgU0lHIG9ubHkuICAqLworIyBkZWZpbmUgX19zaWdtYXNrKHNpZykgXAorICAoKCh1bnNpZ25lZCBsb25nIGludCkgMSkgPDwgKCgoc2lnKSAtIDEpICUgKDggKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSkpKQorCisvKiBSZXR1cm4gdGhlIHdvcmQgaW5kZXggZm9yIFNJRy4gICovCisjIGRlZmluZSBfX3NpZ3dvcmQoc2lnKQkoKChzaWcpIC0gMSkgLyAoOCAqIHNpemVvZiAodW5zaWduZWQgbG9uZyBpbnQpKSkKKworIyBpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKyMgIGRlZmluZSBfX3NpZ2VtcHR5c2V0KHNldCkgXAorICAoX19leHRlbnNpb25fXyAoeyBpbnQgX19jbnQgPSBfU0lHU0VUX05XT1JEUzsJCQkJICAgICAgXAorCQkgICAgc2lnc2V0X3QgKl9fc2V0ID0gKHNldCk7CQkJCSAgICAgIFwKKwkJICAgIHdoaWxlICgtLV9fY250ID49IDApIF9fc2V0LT5fX3ZhbFtfX2NudF0gPSAwOwkgICAgICBcCisJCSAgICAwOyB9KSkKKyMgIGRlZmluZSBfX3NpZ2ZpbGxzZXQoc2V0KSBcCisgIChfX2V4dGVuc2lvbl9fICh7IGludCBfX2NudCA9IF9TSUdTRVRfTldPUkRTOwkJCQkgICAgICBcCisJCSAgICBzaWdzZXRfdCAqX19zZXQgPSAoc2V0KTsJCQkJICAgICAgXAorCQkgICAgd2hpbGUgKC0tX19jbnQgPj0gMCkgX19zZXQtPl9fdmFsW19fY250XSA9IH4wVUw7CSAgICAgIFwKKwkJICAgIDA7IH0pKQorCisjICBpZmRlZiBfX1VTRV9HTlUKKy8qIFRoZSBQT1NJWCBkb2VzIG5vdCBzcGVjaWZ5IGZvciBoYW5kbGluZyB0aGUgd2hvbGUgc2lnbmFsIHNldCBpbiBvbmUKKyAgIGNvbW1hbmQuICBUaGlzIGlzIG9mdGVuIHdhbnRlZCBhbmQgc28gd2UgZGVmaW5lIHRocmVlIG1vcmUgZnVuY3Rpb25zCisgICBoZXJlLiAgKi8KKyMgICBkZWZpbmUgX19zaWdpc2VtcHR5c2V0KHNldCkgXAorICAoX19leHRlbnNpb25fXyAoeyBpbnQgX19jbnQgPSBfU0lHU0VUX05XT1JEUzsJCQkJICAgICAgXAorCQkgICAgY29uc3Qgc2lnc2V0X3QgKl9fc2V0ID0gKHNldCk7CQkJICAgICAgXAorCQkgICAgaW50IF9fcmV0ID0gX19zZXQtPl9fdmFsWy0tX19jbnRdOwkJCSAgICAgIFwKKwkJICAgIHdoaWxlICghX19yZXQgJiYgLS1fX2NudCA+PSAwKQkJCSAgICAgIFwKKwkJCV9fcmV0ID0gX19zZXQtPl9fdmFsW19fY250XTsJCQkgICAgICBcCisJCSAgICBfX3JldCA9PSAwOyB9KSkKKyMgICBkZWZpbmUgX19zaWdhbmRzZXQoZGVzdCwgbGVmdCwgcmlnaHQpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgaW50IF9fY250ID0gX1NJR1NFVF9OV09SRFM7CQkJCSAgICAgIFwKKwkJICAgIHNpZ3NldF90ICpfX2Rlc3QgPSAoZGVzdCk7CQkJCSAgICAgIFwKKwkJICAgIGNvbnN0IHNpZ3NldF90ICpfX2xlZnQgPSAobGVmdCk7CQkJICAgICAgXAorCQkgICAgY29uc3Qgc2lnc2V0X3QgKl9fcmlnaHQgPSAocmlnaHQpOwkJCSAgICAgIFwKKwkJICAgIHdoaWxlICgtLV9fY250ID49IDApCQkJCSAgICAgIFwKKwkJICAgICAgX19kZXN0LT5fX3ZhbFtfX2NudF0gPSAoX19sZWZ0LT5fX3ZhbFtfX2NudF0JICAgICAgXAorCQkJCQkgICAgICAmIF9fcmlnaHQtPl9fdmFsW19fY250XSk7CSAgICAgIFwKKwkJICAgIDA7IH0pKQorIyAgIGRlZmluZSBfX3NpZ29yc2V0KGRlc3QsIGxlZnQsIHJpZ2h0KSBcCisgIChfX2V4dGVuc2lvbl9fICh7IGludCBfX2NudCA9IF9TSUdTRVRfTldPUkRTOwkJCQkgICAgICBcCisJCSAgICBzaWdzZXRfdCAqX19kZXN0ID0gKGRlc3QpOwkJCQkgICAgICBcCisJCSAgICBjb25zdCBzaWdzZXRfdCAqX19sZWZ0ID0gKGxlZnQpOwkJCSAgICAgIFwKKwkJICAgIGNvbnN0IHNpZ3NldF90ICpfX3JpZ2h0ID0gKHJpZ2h0KTsJCQkgICAgICBcCisJCSAgICB3aGlsZSAoLS1fX2NudCA+PSAwKQkJCQkgICAgICBcCisJCSAgICAgIF9fZGVzdC0+X192YWxbX19jbnRdID0gKF9fbGVmdC0+X192YWxbX19jbnRdCSAgICAgIFwKKwkJCQkJICAgICAgfCBfX3JpZ2h0LT5fX3ZhbFtfX2NudF0pOwkgICAgICBcCisJCSAgICAwOyB9KSkKKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qIFRoZXNlIGZ1bmN0aW9ucyBuZWVkbid0IGNoZWNrIGZvciBhIGJvZ3VzIHNpZ25hbCBudW1iZXIgLS0gZXJyb3IKKyAgIGNoZWNraW5nIGlzIGRvbmUgaW4gdGhlIG5vbiBfXyB2ZXJzaW9ucy4gICovCisKK2V4dGVybiBpbnQgX19zaWdpc21lbWJlciAoX19jb25zdCBfX3NpZ3NldF90ICosIGludCk7CitleHRlcm4gaW50IF9fc2lnYWRkc2V0IChfX3NpZ3NldF90ICosIGludCk7CitleHRlcm4gaW50IF9fc2lnZGVsc2V0IChfX3NpZ3NldF90ICosIGludCk7CisKKyMgaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKKyMgIGRlZmluZSBfX1NJR1NFVEZOKE5BTUUsIEJPRFksIENPTlNUKQkJCQkJICAgICAgXAorICBfRVhURVJOX0lOTElORSBpbnQJCQkJCQkJICAgICAgXAorICBOQU1FIChDT05TVCBfX3NpZ3NldF90ICpfX3NldCwgaW50IF9fc2lnKQkJCQkgICAgICBcCisgIHsJCQkJCQkJCQkgICAgICBcCisgICAgdW5zaWduZWQgbG9uZyBpbnQgX19tYXNrID0gX19zaWdtYXNrIChfX3NpZyk7CQkJICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fd29yZCA9IF9fc2lnd29yZCAoX19zaWcpOwkJCSAgICAgIFwKKyAgICByZXR1cm4gQk9EWTsJCQkJCQkJICAgICAgXAorICB9CisKK19fU0lHU0VURk4gKF9fc2lnaXNtZW1iZXIsIChfX3NldC0+X192YWxbX193b3JkXSAmIF9fbWFzaykgPyAxIDogMCwgX19jb25zdCkKK19fU0lHU0VURk4gKF9fc2lnYWRkc2V0LCAoKF9fc2V0LT5fX3ZhbFtfX3dvcmRdIHw9IF9fbWFzayksIDApLCApCitfX1NJR1NFVEZOIChfX3NpZ2RlbHNldCwgKChfX3NldC0+X192YWxbX193b3JkXSAmPSB+X19tYXNrKSwgMCksICkKKworIyAgdW5kZWYgX19TSUdTRVRGTgorIyBlbmRpZgorCisKKyNlbmRpZiAvKiAhIF9TSUdTRVRfSF9mbnMuICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ3N0YWNrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2lnc3RhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI2MDM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ3N0YWNrLmgKQEAgLTAsMCArMSw1NSBAQAorLyogc2lnc3RhY2ssIHNpZ2FsdHN0YWNrIGRlZmluaXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TSUdOQUxfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuICBVc2UgPHNpZ25hbC5oPiBpbnN0ZWFkIgorI2VuZGlmCisKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYSBzaWduYWwgc3RhY2sgKG9ic29sZXRlKS4gICovCitzdHJ1Y3Qgc2lnc3RhY2sKKyAgeworICAgIHZvaWQgKnNzX3NwOwkJLyogU2lnbmFsIHN0YWNrIHBvaW50ZXIuICAqLworICAgIGludCBzc19vbnN0YWNrOwkJLyogTm9uemVybyBpZiBleGVjdXRpbmcgb24gdGhpcyBzdGFjay4gICovCisgIH07CisKKworLyogUG9zc2libGUgdmFsdWVzIGZvciBgc3NfZmxhZ3MuJy4gICovCitlbnVtCit7CisgIFNTX09OU1RBQ0sgPSAxLAorI2RlZmluZSBTU19PTlNUQUNLCVNTX09OU1RBQ0sKKyAgU1NfRElTQUJMRQorI2RlZmluZSBTU19ESVNBQkxFCVNTX0RJU0FCTEUKK307CisKKy8qIE1pbmltdW0gc3RhY2sgc2l6ZSBmb3IgYSBzaWduYWwgaGFuZGxlci4gICovCisjZGVmaW5lIE1JTlNJR1NUS1NaCTIwNDgKKworLyogU3lzdGVtIGRlZmF1bHQgc3RhY2sgc2l6ZS4gICovCisjZGVmaW5lIFNJR1NUS1NaCTgxOTIKKworCisvKiBBbHRlcm5hdGUsIHByZWZlcnJlZCBpbnRlcmZhY2UuICAqLwordHlwZWRlZiBzdHJ1Y3Qgc2lnYWx0c3RhY2sKKyAgeworICAgIHZvaWQgKnNzX3NwOworICAgIGludCBzc19mbGFnczsKKyAgICBzaXplX3Qgc3Nfc2l6ZTsKKyAgfSBzdGFja190OwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ3RocmVhZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ3RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNTI0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2lndGhyZWFkLmgKQEAgLTAsMCArMSw0NCBAQAorLyogU2lnbmFsIGhhbmRsaW5nIGZ1bmN0aW9uIGZvciB0aHJlYWRlZCBwcm9ncmFtcy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAorICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9CSVRTX1NJR1RIUkVBRF9ICisjZGVmaW5lIF9CSVRTX1NJR1RIUkVBRF9ICTEKKworI2lmICFkZWZpbmVkIF9TSUdOQUxfSCAmJiAhZGVmaW5lZCBfUFRIUkVBRF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gIFVzZSA8cHRocmVhZC5oPiBpbnN0ZWFkIgorI2VuZGlmCisKKy8qIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgc2lnbmFscy4gKi8KKworLyogTW9kaWZ5IHRoZSBzaWduYWwgbWFzayBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkLiAgVGhlIGFyZ3VtZW50cyBoYXZlCisgICB0aGUgc2FtZSBtZWFuaW5nIGFzIGZvciBzaWdwcm9jbWFzaygyKS4gKi8KK2V4dGVybiBpbnQgcHRocmVhZF9zaWdtYXNrIChpbnQgX19ob3csCisJCQkgICAgX19jb25zdCBfX3NpZ3NldF90ICpfX3Jlc3RyaWN0IF9fbmV3bWFzaywKKwkJCSAgICBfX3NpZ3NldF90ICpfX3Jlc3RyaWN0IF9fb2xkbWFzaylfX1RIUk9XOworCisvKiBTZW5kIHNpZ25hbCBTSUdOTyB0byB0aGUgZ2l2ZW4gdGhyZWFkLiAqLworZXh0ZXJuIGludCBwdGhyZWFkX2tpbGwgKHB0aHJlYWRfdCBfX3RocmVhZGlkLCBpbnQgX19zaWdubykgX19USFJPVzsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogUXVldWUgc2lnbmFsIGFuZCBkYXRhIHRvIGEgdGhyZWFkLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9zaWdxdWV1ZSAocHRocmVhZF90IF9fdGhyZWFkaWQsIGludCBfX3NpZ25vLAorCQkJICAgICBjb25zdCB1bmlvbiBzaWd2YWwgX192YWx1ZSkgX19USFJPVzsKKyNlbmRpZgorCisjZW5kaWYJLyogYml0cy9zaWd0aHJlYWQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NvY2thZGRyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc29ja2FkZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTFkMTMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NvY2thZGRyLmgKQEAgLTAsMCArMSw0MCBAQAorLyogRGVmaW5pdGlvbiBvZiBgc3RydWN0IHNvY2thZGRyXyonIGNvbW1vbiBtZW1iZXJzLiAgR2VuZXJpYy80LjIgQlNEIHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsMTk5NiwxOTk3LDE5OTgsMjAwMCwyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHk7IHVzZSA8c3lzL3NvY2tldC5oPiBpbnN0ZWFkLgorICovCisKKyNpZm5kZWYgX0JJVFNfU09DS0FERFJfSAorI2RlZmluZSBfQklUU19TT0NLQUREUl9ICTEKKworCisvKiBQT1NJWC4xZyBzcGVjaWZpZXMgdGhpcyB0eXBlIG5hbWUgZm9yIHRoZSBgc2FfZmFtaWx5JyBtZW1iZXIuICAqLwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgc2FfZmFtaWx5X3Q7CisKKy8qIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBkZWNsYXJlIHRoZSBpbml0aWFsIGNvbW1vbiBtZW1iZXJzCisgICBvZiB0aGUgZGF0YSB0eXBlcyB1c2VkIGZvciBzb2NrZXQgYWRkcmVzc2VzLCBgc3RydWN0IHNvY2thZGRyJywKKyAgIGBzdHJ1Y3Qgc29ja2FkZHJfaW4nLCBgc3RydWN0IHNvY2thZGRyX3VuJywgZXRjLiAgKi8KKworI2RlZmluZQlfX1NPQ0tBRERSX0NPTU1PTihzYV9wcmVmaXgpIFwKKyAgc2FfZmFtaWx5X3Qgc2FfcHJlZml4IyNmYW1pbHkKKworI2RlZmluZSBfX1NPQ0tBRERSX0NPTU1PTl9TSVpFCShzaXplb2YgKHVuc2lnbmVkIHNob3J0IGludCkpCisKKyNlbmRpZgkvKiBiaXRzL3NvY2thZGRyLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zb2NrZXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWUwOTBiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NvY2tldC5oCkBAIC0wLDAgKzEsNDQ0IEBACisvKiBTeXN0ZW0tc3BlY2lmaWMgc29ja2V0IGNvbnN0YW50cyBhbmQgdHlwZXMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk0LTIwMDEsIDIwMDQsIDIwMDYtMjAxMCwgMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19CSVRTX1NPQ0tFVF9ICisjZGVmaW5lIF9fQklUU19TT0NLRVRfSAorCisjaWZuZGVmIF9TWVNfU09DS0VUX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc29ja2V0Lmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zb2NrZXQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2RlZmluZQlfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogVHlwZSBmb3IgbGVuZ3RoIGFyZ3VtZW50cyBpbiBzb2NrZXQgY2FsbHMuICAqLworI2lmbmRlZiBfX3NvY2tsZW5fdF9kZWZpbmVkCit0eXBlZGVmIF9fc29ja2xlbl90IHNvY2tsZW5fdDsKKyMgZGVmaW5lIF9fc29ja2xlbl90X2RlZmluZWQKKyNlbmRpZgorCisvKiBUeXBlcyBvZiBzb2NrZXRzLiAgKi8KK2VudW0gX19zb2NrZXRfdHlwZQoreworICBTT0NLX1NUUkVBTSA9IDEsCQkvKiBTZXF1ZW5jZWQsIHJlbGlhYmxlLCBjb25uZWN0aW9uLWJhc2VkCisJCQkJICAgYnl0ZSBzdHJlYW1zLiAgKi8KKyNkZWZpbmUgU09DS19TVFJFQU0gU09DS19TVFJFQU0KKyAgU09DS19ER1JBTSA9IDIsCQkvKiBDb25uZWN0aW9ubGVzcywgdW5yZWxpYWJsZSBkYXRhZ3JhbXMKKwkJCQkgICBvZiBmaXhlZCBtYXhpbXVtIGxlbmd0aC4gICovCisjZGVmaW5lIFNPQ0tfREdSQU0gU09DS19ER1JBTQorICBTT0NLX1JBVyA9IDMsCQkJLyogUmF3IHByb3RvY29sIGludGVyZmFjZS4gICovCisjZGVmaW5lIFNPQ0tfUkFXIFNPQ0tfUkFXCisgIFNPQ0tfUkRNID0gNCwJCQkvKiBSZWxpYWJseS1kZWxpdmVyZWQgbWVzc2FnZXMuICAqLworI2RlZmluZSBTT0NLX1JETSBTT0NLX1JETQorICBTT0NLX1NFUVBBQ0tFVCA9IDUsCQkvKiBTZXF1ZW5jZWQsIHJlbGlhYmxlLCBjb25uZWN0aW9uLWJhc2VkLAorCQkJCSAgIGRhdGFncmFtcyBvZiBmaXhlZCBtYXhpbXVtIGxlbmd0aC4gICovCisjZGVmaW5lIFNPQ0tfU0VRUEFDS0VUIFNPQ0tfU0VRUEFDS0VUCisgIFNPQ0tfRENDUCA9IDYsCQkvKiBEYXRhZ3JhbSBDb25nZXN0aW9uIENvbnRyb2wgUHJvdG9jb2wuICAqLworI2RlZmluZSBTT0NLX0RDQ1AgU09DS19EQ0NQCisgIFNPQ0tfUEFDS0VUID0gMTAsCQkvKiBMaW51eCBzcGVjaWZpYyB3YXkgb2YgZ2V0dGluZyBwYWNrZXRzCisJCQkJICAgYXQgdGhlIGRldiBsZXZlbC4gIEZvciB3cml0aW5nIHJhcnAgYW5kCisJCQkJICAgb3RoZXIgc2ltaWxhciB0aGluZ3Mgb24gdGhlIHVzZXIgbGV2ZWwuICovCisjZGVmaW5lIFNPQ0tfUEFDS0VUIFNPQ0tfUEFDS0VUCisKKyAgLyogRmxhZ3MgdG8gYmUgT1JlZCBpbnRvIHRoZSB0eXBlIHBhcmFtZXRlciBvZiBzb2NrZXQgYW5kIHNvY2tldHBhaXIgYW5kCisgICAgIHVzZWQgZm9yIHRoZSBmbGFncyBwYXJhbWV0ZXIgb2YgcGFjY2VwdC4gICovCisKKyAgU09DS19DTE9FWEVDID0gMDIwMDAwMDAsCS8qIEF0b21pY2FsbHkgc2V0IGNsb3NlLW9uLWV4ZWMgZmxhZyBmb3IgdGhlCisJCQkJICAgbmV3IGRlc2NyaXB0b3IocykuICAqLworI2RlZmluZSBTT0NLX0NMT0VYRUMgU09DS19DTE9FWEVDCisgIFNPQ0tfTk9OQkxPQ0sgPSAwNDAwMAkJLyogQXRvbWljYWxseSBtYXJrIGRlc2NyaXB0b3IocykgYXMKKwkJCQkgICBub24tYmxvY2tpbmcuICAqLworI2RlZmluZSBTT0NLX05PTkJMT0NLIFNPQ0tfTk9OQkxPQ0sKK307CisKKy8qIFByb3RvY29sIGZhbWlsaWVzLiAgKi8KKyNkZWZpbmUJUEZfVU5TUEVDCTAJLyogVW5zcGVjaWZpZWQuICAqLworI2RlZmluZQlQRl9MT0NBTAkxCS8qIExvY2FsIHRvIGhvc3QgKHBpcGVzIGFuZCBmaWxlLWRvbWFpbikuICAqLworI2RlZmluZQlQRl9VTklYCQlQRl9MT0NBTCAvKiBQT1NJWCBuYW1lIGZvciBQRl9MT0NBTC4gICovCisjZGVmaW5lCVBGX0ZJTEUJCVBGX0xPQ0FMIC8qIEFub3RoZXIgbm9uLXN0YW5kYXJkIG5hbWUgZm9yIFBGX0xPQ0FMLiAgKi8KKyNkZWZpbmUJUEZfSU5FVAkJMgkvKiBJUCBwcm90b2NvbCBmYW1pbHkuICAqLworI2RlZmluZQlQRl9BWDI1CQkzCS8qIEFtYXRldXIgUmFkaW8gQVguMjUuICAqLworI2RlZmluZQlQRl9JUFgJCTQJLyogTm92ZWxsIEludGVybmV0IFByb3RvY29sLiAgKi8KKyNkZWZpbmUJUEZfQVBQTEVUQUxLCTUJLyogQXBwbGV0YWxrIEREUC4gICovCisjZGVmaW5lCVBGX05FVFJPTQk2CS8qIEFtYXRldXIgcmFkaW8gTmV0Uk9NLiAgKi8KKyNkZWZpbmUJUEZfQlJJREdFCTcJLyogTXVsdGlwcm90b2NvbCBicmlkZ2UuICAqLworI2RlZmluZQlQRl9BVE1QVkMJOAkvKiBBVE0gUFZDcy4gICovCisjZGVmaW5lCVBGX1gyNQkJOQkvKiBSZXNlcnZlZCBmb3IgWC4yNSBwcm9qZWN0LiAgKi8KKyNkZWZpbmUJUEZfSU5FVDYJMTAJLyogSVAgdmVyc2lvbiA2LiAgKi8KKyNkZWZpbmUJUEZfUk9TRQkJMTEJLyogQW1hdGV1ciBSYWRpbyBYLjI1IFBMUC4gICovCisjZGVmaW5lCVBGX0RFQ25ldAkxMgkvKiBSZXNlcnZlZCBmb3IgREVDbmV0IHByb2plY3QuICAqLworI2RlZmluZQlQRl9ORVRCRVVJCTEzCS8qIFJlc2VydmVkIGZvciA4MDIuMkxMQyBwcm9qZWN0LiAgKi8KKyNkZWZpbmUJUEZfU0VDVVJJVFkJMTQJLyogU2VjdXJpdHkgY2FsbGJhY2sgcHNldWRvIEFGLiAgKi8KKyNkZWZpbmUJUEZfS0VZCQkxNQkvKiBQRl9LRVkga2V5IG1hbmFnZW1lbnQgQVBJLiAgKi8KKyNkZWZpbmUJUEZfTkVUTElOSwkxNgorI2RlZmluZQlQRl9ST1VURQlQRl9ORVRMSU5LIC8qIEFsaWFzIHRvIGVtdWxhdGUgNC40QlNELiAgKi8KKyNkZWZpbmUJUEZfUEFDS0VUCTE3CS8qIFBhY2tldCBmYW1pbHkuICAqLworI2RlZmluZQlQRl9BU0gJCTE4CS8qIEFzaC4gICovCisjZGVmaW5lCVBGX0VDT05FVAkxOQkvKiBBY29ybiBFY29uZXQuICAqLworI2RlZmluZQlQRl9BVE1TVkMJMjAJLyogQVRNIFNWQ3MuICAqLworI2RlZmluZSBQRl9SRFMJCTIxCS8qIFJEUyBzb2NrZXRzLiAgKi8KKyNkZWZpbmUJUEZfU05BCQkyMgkvKiBMaW51eCBTTkEgUHJvamVjdCAqLworI2RlZmluZQlQRl9JUkRBCQkyMwkvKiBJUkRBIHNvY2tldHMuICAqLworI2RlZmluZQlQRl9QUFBPWAkyNAkvKiBQUFBvWCBzb2NrZXRzLiAgKi8KKyNkZWZpbmUJUEZfV0FOUElQRQkyNQkvKiBXYW5waXBlIEFQSSBzb2NrZXRzLiAgKi8KKyNkZWZpbmUgUEZfTExDCQkyNgkvKiBMaW51eCBMTEMuICAqLworI2RlZmluZSBQRl9DQU4JCTI5CS8qIENvbnRyb2xsZXIgQXJlYSBOZXR3b3JrLiAgKi8KKyNkZWZpbmUgUEZfVElQQwkJMzAJLyogVElQQyBzb2NrZXRzLiAgKi8KKyNkZWZpbmUJUEZfQkxVRVRPT1RICTMxCS8qIEJsdWV0b290aCBzb2NrZXRzLiAgKi8KKyNkZWZpbmUJUEZfSVVDVgkJMzIJLyogSVVDViBzb2NrZXRzLiAgKi8KKyNkZWZpbmUgUEZfUlhSUEMJMzMJLyogUnhSUEMgc29ja2V0cy4gICovCisjZGVmaW5lIFBGX0lTRE4JCTM0CS8qIG1JU0ROIHNvY2tldHMuICAqLworI2RlZmluZSBQRl9QSE9ORVQJMzUJLyogUGhvbmV0IHNvY2tldHMuICAqLworI2RlZmluZSBQRl9JRUVFODAyMTU0CTM2CS8qIElFRUUgODAyLjE1LjQgc29ja2V0cy4gICovCisjZGVmaW5lIFBGX0NBSUYJCTM3CS8qIENBSUYgc29ja2V0cy4gICovCisjZGVmaW5lIFBGX0FMRwkJMzgJLyogQWxnb3JpdGhtIHNvY2tldHMuICAqLworI2RlZmluZSBQRl9ORkMJCTM5CS8qIE5GQyBzb2NrZXRzLiAgKi8KKyNkZWZpbmUJUEZfTUFYCQk0MAkvKiBGb3Igbm93Li4gICovCisKKy8qIEFkZHJlc3MgZmFtaWxpZXMuICAqLworI2RlZmluZQlBRl9VTlNQRUMJUEZfVU5TUEVDCisjZGVmaW5lCUFGX0xPQ0FMCVBGX0xPQ0FMCisjZGVmaW5lCUFGX1VOSVgJCVBGX1VOSVgKKyNkZWZpbmUJQUZfRklMRQkJUEZfRklMRQorI2RlZmluZQlBRl9JTkVUCQlQRl9JTkVUCisjZGVmaW5lCUFGX0FYMjUJCVBGX0FYMjUKKyNkZWZpbmUJQUZfSVBYCQlQRl9JUFgKKyNkZWZpbmUJQUZfQVBQTEVUQUxLCVBGX0FQUExFVEFMSworI2RlZmluZQlBRl9ORVRST00JUEZfTkVUUk9NCisjZGVmaW5lCUFGX0JSSURHRQlQRl9CUklER0UKKyNkZWZpbmUJQUZfQVRNUFZDCVBGX0FUTVBWQworI2RlZmluZQlBRl9YMjUJCVBGX1gyNQorI2RlZmluZQlBRl9JTkVUNglQRl9JTkVUNgorI2RlZmluZQlBRl9ST1NFCQlQRl9ST1NFCisjZGVmaW5lCUFGX0RFQ25ldAlQRl9ERUNuZXQKKyNkZWZpbmUJQUZfTkVUQkVVSQlQRl9ORVRCRVVJCisjZGVmaW5lCUFGX1NFQ1VSSVRZCVBGX1NFQ1VSSVRZCisjZGVmaW5lCUFGX0tFWQkJUEZfS0VZCisjZGVmaW5lCUFGX05FVExJTksJUEZfTkVUTElOSworI2RlZmluZQlBRl9ST1VURQlQRl9ST1VURQorI2RlZmluZQlBRl9QQUNLRVQJUEZfUEFDS0VUCisjZGVmaW5lCUFGX0FTSAkJUEZfQVNICisjZGVmaW5lCUFGX0VDT05FVAlQRl9FQ09ORVQKKyNkZWZpbmUJQUZfQVRNU1ZDCVBGX0FUTVNWQworI2RlZmluZSBBRl9SRFMJCVBGX1JEUworI2RlZmluZQlBRl9TTkEJCVBGX1NOQQorI2RlZmluZQlBRl9JUkRBCQlQRl9JUkRBCisjZGVmaW5lCUFGX1BQUE9YCVBGX1BQUE9YCisjZGVmaW5lCUFGX1dBTlBJUEUJUEZfV0FOUElQRQorI2RlZmluZSBBRl9MTEMJCVBGX0xMQworI2RlZmluZSBBRl9DQU4JCVBGX0NBTgorI2RlZmluZSBBRl9USVBDCQlQRl9USVBDCisjZGVmaW5lCUFGX0JMVUVUT09USAlQRl9CTFVFVE9PVEgKKyNkZWZpbmUJQUZfSVVDVgkJUEZfSVVDVgorI2RlZmluZSBBRl9SWFJQQwlQRl9SWFJQQworI2RlZmluZSBBRl9JU0ROCQlQRl9JU0ROCisjZGVmaW5lIEFGX1BIT05FVAlQRl9QSE9ORVQKKyNkZWZpbmUgQUZfSUVFRTgwMjE1NAlQRl9JRUVFODAyMTU0CisjZGVmaW5lIEFGX0NBSUYJCVBGX0NBSUYKKyNkZWZpbmUgQUZfQUxHCQlQRl9BTEcKKyNkZWZpbmUgQUZfTkZDCQlQRl9ORkMKKyNkZWZpbmUJQUZfTUFYCQlQRl9NQVgKKworLyogU29ja2V0IGxldmVsIHZhbHVlcy4gIE90aGVycyBhcmUgZGVmaW5lZCBpbiB0aGUgYXBwcm9wcmlhdGUgaGVhZGVycy4KKworICAgWFhYIFRoZXNlIGRlZmluaXRpb25zIGFsc28gc2hvdWxkIGdvIGludG8gdGhlIGFwcHJvcHJpYXRlIGhlYWRlcnMgYXMKKyAgIGZhciBhcyB0aGV5IGFyZSBhdmFpbGFibGUuICAqLworI2RlZmluZSBTT0xfUkFXCQkyNTUKKyNkZWZpbmUgU09MX0RFQ05FVCAgICAgIDI2MQorI2RlZmluZSBTT0xfWDI1ICAgICAgICAgMjYyCisjZGVmaW5lIFNPTF9QQUNLRVQJMjYzCisjZGVmaW5lIFNPTF9BVE0JCTI2NAkvKiBBVE0gbGF5ZXIgKGNlbGwgbGV2ZWwpLiAgKi8KKyNkZWZpbmUgU09MX0FBTAkJMjY1CS8qIEFUTSBBZGFwdGlvbiBMYXllciAocGFja2V0IGxldmVsKS4gICovCisjZGVmaW5lIFNPTF9JUkRBCTI2NgorCisvKiBNYXhpbXVtIHF1ZXVlIGxlbmd0aCBzcGVjaWZpYWJsZSBieSBsaXN0ZW4uICAqLworI2RlZmluZSBTT01BWENPTk4JMTI4CisKKy8qIEdldCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgbWFjcm8gdG8gZGVmaW5lIHRoZSBjb21tb24gc29ja2FkZHIgbWVtYmVycy4gICovCisjaW5jbHVkZSA8Yml0cy9zb2NrYWRkci5oPgorCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIGdlbmVyaWMgc29ja2V0IGFkZHJlc3MuICAqLworc3RydWN0IHNvY2thZGRyCisgIHsKKyAgICBfX1NPQ0tBRERSX0NPTU1PTiAoc2FfKTsJLyogQ29tbW9uIGRhdGE6IGFkZHJlc3MgZmFtaWx5IGFuZCBsZW5ndGguICAqLworICAgIGNoYXIgc2FfZGF0YVsxNF07CQkvKiBBZGRyZXNzIGRhdGEuICAqLworICB9OworCisKKy8qIFN0cnVjdHVyZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgc29ja2V0IGFkZHJlc3MgKHdpdGggdGhlIGhpc3RvcmljYWwKKyAgIGV4Y2VwdGlvbiBvZiBBRl9VTklYKS4gIFdlIHJlc2VydmUgMTI4IGJ5dGVzLiAgKi8KKyNkZWZpbmUgX19zc19hbGlnbnR5cGUJdW5zaWduZWQgbG9uZyBpbnQKKyNkZWZpbmUgX1NTX1NJWkUJMTI4CisjZGVmaW5lIF9TU19QQURTSVpFCShfU1NfU0laRSAtICgyICogc2l6ZW9mIChfX3NzX2FsaWdudHlwZSkpKQorCitzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZQorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHNzXyk7CS8qIEFkZHJlc3MgZmFtaWx5LCBldGMuICAqLworICAgIF9fc3NfYWxpZ250eXBlIF9fc3NfYWxpZ247CS8qIEZvcmNlIGRlc2lyZWQgYWxpZ25tZW50LiAgKi8KKyAgICBjaGFyIF9fc3NfcGFkZGluZ1tfU1NfUEFEU0laRV07CisgIH07CisKKworLyogQml0cyBpbiB0aGUgRkxBR1MgYXJndW1lbnQgdG8gYHNlbmQnLCBgcmVjdicsIGV0IGFsLiAgKi8KK2VudW0KKyAgeworICAgIE1TR19PT0IJCT0gMHgwMSwJLyogUHJvY2VzcyBvdXQtb2YtYmFuZCBkYXRhLiAgKi8KKyNkZWZpbmUgTVNHX09PQgkJTVNHX09PQgorICAgIE1TR19QRUVLCQk9IDB4MDIsCS8qIFBlZWsgYXQgaW5jb21pbmcgbWVzc2FnZXMuICAqLworI2RlZmluZSBNU0dfUEVFSwlNU0dfUEVFSworICAgIE1TR19ET05UUk9VVEUJPSAweDA0LAkvKiBEb24ndCB1c2UgbG9jYWwgcm91dGluZy4gICovCisjZGVmaW5lIE1TR19ET05UUk9VVEUJTVNHX0RPTlRST1VURQorI2lmZGVmIF9fVVNFX0dOVQorICAgIC8qIERFQ25ldCB1c2VzIGEgZGlmZmVyZW50IG5hbWUuICAqLworICAgIE1TR19UUllIQVJECQk9IE1TR19ET05UUk9VVEUsCisjIGRlZmluZSBNU0dfVFJZSEFSRAlNU0dfRE9OVFJPVVRFCisjZW5kaWYKKyAgICBNU0dfQ1RSVU5DCQk9IDB4MDgsCS8qIENvbnRyb2wgZGF0YSBsb3N0IGJlZm9yZSBkZWxpdmVyeS4gICovCisjZGVmaW5lIE1TR19DVFJVTkMJTVNHX0NUUlVOQworICAgIE1TR19QUk9YWQkJPSAweDEwLAkvKiBTdXBwbHkgb3IgYXNrIHNlY29uZCBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgTVNHX1BST1hZCU1TR19QUk9YWQorICAgIE1TR19UUlVOQwkJPSAweDIwLAorI2RlZmluZQlNU0dfVFJVTkMJTVNHX1RSVU5DCisgICAgTVNHX0RPTlRXQUlUCT0gMHg0MCwgLyogTm9uYmxvY2tpbmcgSU8uICAqLworI2RlZmluZQlNU0dfRE9OVFdBSVQJTVNHX0RPTlRXQUlUCisgICAgTVNHX0VPUgkJPSAweDgwLCAvKiBFbmQgb2YgcmVjb3JkLiAgKi8KKyNkZWZpbmUJTVNHX0VPUgkJTVNHX0VPUgorICAgIE1TR19XQUlUQUxMCQk9IDB4MTAwLCAvKiBXYWl0IGZvciBhIGZ1bGwgcmVxdWVzdC4gICovCisjZGVmaW5lCU1TR19XQUlUQUxMCU1TR19XQUlUQUxMCisgICAgTVNHX0ZJTgkJPSAweDIwMCwKKyNkZWZpbmUJTVNHX0ZJTgkJTVNHX0ZJTgorICAgIE1TR19TWU4JCT0gMHg0MDAsCisjZGVmaW5lCU1TR19TWU4JCU1TR19TWU4KKyAgICBNU0dfQ09ORklSTQkJPSAweDgwMCwgLyogQ29uZmlybSBwYXRoIHZhbGlkaXR5LiAgKi8KKyNkZWZpbmUJTVNHX0NPTkZJUk0JTVNHX0NPTkZJUk0KKyAgICBNU0dfUlNUCQk9IDB4MTAwMCwKKyNkZWZpbmUJTVNHX1JTVAkJTVNHX1JTVAorICAgIE1TR19FUlJRVUVVRQk9IDB4MjAwMCwgLyogRmV0Y2ggbWVzc2FnZSBmcm9tIGVycm9yIHF1ZXVlLiAgKi8KKyNkZWZpbmUJTVNHX0VSUlFVRVVFCU1TR19FUlJRVUVVRQorICAgIE1TR19OT1NJR05BTAk9IDB4NDAwMCwgLyogRG8gbm90IGdlbmVyYXRlIFNJR1BJUEUuICAqLworI2RlZmluZQlNU0dfTk9TSUdOQUwJTVNHX05PU0lHTkFMCisgICAgTVNHX01PUkUJCT0gMHg4MDAwLCAgLyogU2VuZGVyIHdpbGwgc2VuZCBtb3JlLiAgKi8KKyNkZWZpbmUJTVNHX01PUkUJTVNHX01PUkUKKyAgICBNU0dfV0FJVEZPUk9ORQk9IDB4MTAwMDAsIC8qIFdhaXQgZm9yIGF0IGxlYXN0IG9uZSBwYWNrZXQgdG8gcmV0dXJuLiovCisjZGVmaW5lIE1TR19XQUlURk9ST05FCU1TR19XQUlURk9ST05FCisKKyAgICBNU0dfQ01TR19DTE9FWEVDCT0gMHg0MDAwMDAwMAkvKiBTZXQgY2xvc2Vfb25fZXhpdCBmb3IgZmlsZQorCQkJCQkgICBkZXNjcmlwdG9yIHJlY2VpdmVkIHRocm91Z2gKKwkJCQkJICAgU0NNX1JJR0hUUy4gICovCisjZGVmaW5lIE1TR19DTVNHX0NMT0VYRUMgTVNHX0NNU0dfQ0xPRVhFQworICB9OworCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIG1lc3NhZ2VzIHNlbnQgYnkKKyAgIGBzZW5kbXNnJyBhbmQgcmVjZWl2ZWQgYnkgYHJlY3Ztc2cnLiAgKi8KK3N0cnVjdCBtc2doZHIKKyAgeworICAgIHZvaWQgKm1zZ19uYW1lOwkJLyogQWRkcmVzcyB0byBzZW5kIHRvL3JlY2VpdmUgZnJvbS4gICovCisgICAgc29ja2xlbl90IG1zZ19uYW1lbGVuOwkvKiBMZW5ndGggb2YgYWRkcmVzcyBkYXRhLiAgKi8KKworICAgIHN0cnVjdCBpb3ZlYyAqbXNnX2lvdjsJLyogVmVjdG9yIG9mIGRhdGEgdG8gc2VuZC9yZWNlaXZlIGludG8uICAqLworICAgIHNpemVfdCBtc2dfaW92bGVuOwkJLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuICAqLworCisgICAgdm9pZCAqbXNnX2NvbnRyb2w7CQkvKiBBbmNpbGxhcnkgZGF0YSAoZWcgQlNEIGZpbGVkZXNjIHBhc3NpbmcpLiAqLworICAgIHNpemVfdCBtc2dfY29udHJvbGxlbjsJLyogQW5jaWxsYXJ5IGRhdGEgYnVmZmVyIGxlbmd0aC4KKwkJCQkgICAhISBUaGUgdHlwZSBzaG91bGQgYmUgc29ja2xlbl90IGJ1dCB0aGUKKwkJCQkgICBkZWZpbml0aW9uIG9mIHRoZSBrZXJuZWwgaXMgaW5jb21wYXRpYmxlCisJCQkJICAgd2l0aCB0aGlzLiAgKi8KKworICAgIGludCBtc2dfZmxhZ3M7CQkvKiBGbGFncyBvbiByZWNlaXZlZCBtZXNzYWdlLiAgKi8KKyAgfTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogRm9yIGByZWN2bW1zZycuICAqLworc3RydWN0IG1tc2doZHIKKyAgeworICAgIHN0cnVjdCBtc2doZHIgbXNnX2hkcjsJLyogQWN0dWFsIG1lc3NhZ2UgaGVhZGVyLiAgKi8KKyAgICB1bnNpZ25lZCBpbnQgbXNnX2xlbjsJLyogTnVtYmVyIG9mIHJlY2VpdmVkIGJ5dGVzIGZvciB0aGUgZW50cnkuICAqLworICB9OworI2VuZGlmCisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciBzdG9yYWdlIG9mIGFuY2lsbGFyeSBkYXRhIG9iamVjdCBpbmZvcm1hdGlvbi4gICovCitzdHJ1Y3QgY21zZ2hkcgorICB7CisgICAgc2l6ZV90IGNtc2dfbGVuOwkJLyogTGVuZ3RoIG9mIGRhdGEgaW4gY21zZ19kYXRhIHBsdXMgbGVuZ3RoCisJCQkJICAgb2YgY21zZ2hkciBzdHJ1Y3R1cmUuCisJCQkJICAgISEgVGhlIHR5cGUgc2hvdWxkIGJlIHNvY2tsZW5fdCBidXQgdGhlCisJCQkJICAgZGVmaW5pdGlvbiBvZiB0aGUga2VybmVsIGlzIGluY29tcGF0aWJsZQorCQkJCSAgIHdpdGggdGhpcy4gICovCisgICAgaW50IGNtc2dfbGV2ZWw7CQkvKiBPcmlnaW5hdGluZyBwcm90b2NvbC4gICovCisgICAgaW50IGNtc2dfdHlwZTsJCS8qIFByb3RvY29sIHNwZWNpZmljIHR5cGUuICAqLworI2lmICghZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gJiYgX19HTlVDX18gPj0gMikgfHwgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisgICAgX19leHRlbnNpb25fXyB1bnNpZ25lZCBjaGFyIF9fY21zZ19kYXRhIF9fZmxleGFycjsgLyogQW5jaWxsYXJ5IGRhdGEuICAqLworI2VuZGlmCisgIH07CisKKy8qIEFuY2lsbGFyeSBkYXRhIG9iamVjdCBtYW5pcHVsYXRpb24gbWFjcm9zLiAgKi8KKyNpZiAoIWRlZmluZWQgX19TVFJJQ1RfQU5TSV9fICYmIF9fR05VQ19fID49IDIpIHx8IF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorIyBkZWZpbmUgQ01TR19EQVRBKGNtc2cpICgoY21zZyktPl9fY21zZ19kYXRhKQorI2Vsc2UKKyMgZGVmaW5lIENNU0dfREFUQShjbXNnKSAoKHVuc2lnbmVkIGNoYXIgKikgKChzdHJ1Y3QgY21zZ2hkciAqKSAoY21zZykgKyAxKSkKKyNlbmRpZgorI2RlZmluZSBDTVNHX05YVEhEUihtaGRyLCBjbXNnKSBfX2Ntc2dfbnh0aGRyIChtaGRyLCBjbXNnKQorI2RlZmluZSBDTVNHX0ZJUlNUSERSKG1oZHIpIFwKKyAgKChzaXplX3QpIChtaGRyKS0+bXNnX2NvbnRyb2xsZW4gPj0gc2l6ZW9mIChzdHJ1Y3QgY21zZ2hkcikJCSAgICAgIFwKKyAgID8gKHN0cnVjdCBjbXNnaGRyICopIChtaGRyKS0+bXNnX2NvbnRyb2wgOiAoc3RydWN0IGNtc2doZHIgKikgMCkKKyNkZWZpbmUgQ01TR19BTElHTihsZW4pICgoKGxlbikgKyBzaXplb2YgKHNpemVfdCkgLSAxKSBcCisJCQkgJiAoc2l6ZV90KSB+KHNpemVvZiAoc2l6ZV90KSAtIDEpKQorI2RlZmluZSBDTVNHX1NQQUNFKGxlbikgKENNU0dfQUxJR04gKGxlbikgXAorCQkJICsgQ01TR19BTElHTiAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2hkcikpKQorI2RlZmluZSBDTVNHX0xFTihsZW4pICAgKENNU0dfQUxJR04gKHNpemVvZiAoc3RydWN0IGNtc2doZHIpKSArIChsZW4pKQorCitleHRlcm4gc3RydWN0IGNtc2doZHIgKl9fY21zZ19ueHRoZHIgKHN0cnVjdCBtc2doZHIgKl9fbWhkciwKKwkJCQkgICAgICBzdHJ1Y3QgY21zZ2hkciAqX19jbXNnKSBfX1RIUk9XOworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisjIGlmbmRlZiBfRVhURVJOX0lOTElORQorIyAgZGVmaW5lIF9FWFRFUk5fSU5MSU5FIF9fZXh0ZXJuX2lubGluZQorIyBlbmRpZgorX0VYVEVSTl9JTkxJTkUgc3RydWN0IGNtc2doZHIgKgorX19OVEggKF9fY21zZ19ueHRoZHIgKHN0cnVjdCBtc2doZHIgKl9fbWhkciwgc3RydWN0IGNtc2doZHIgKl9fY21zZykpCit7CisgIGlmICgoc2l6ZV90KSBfX2Ntc2ctPmNtc2dfbGVuIDwgc2l6ZW9mIChzdHJ1Y3QgY21zZ2hkcikpCisgICAgLyogVGhlIGtlcm5lbCBoZWFkZXIgZG9lcyB0aGlzIHNvIHRoZXJlIG1heSBiZSBhIHJlYXNvbi4gICovCisgICAgcmV0dXJuIChzdHJ1Y3QgY21zZ2hkciAqKSAwOworCisgIF9fY21zZyA9IChzdHJ1Y3QgY21zZ2hkciAqKSAoKHVuc2lnbmVkIGNoYXIgKikgX19jbXNnCisJCQkgICAgICAgKyBDTVNHX0FMSUdOIChfX2Ntc2ctPmNtc2dfbGVuKSk7CisgIGlmICgodW5zaWduZWQgY2hhciAqKSAoX19jbXNnICsgMSkgPiAoKHVuc2lnbmVkIGNoYXIgKikgX19taGRyLT5tc2dfY29udHJvbAorCQkJCQkrIF9fbWhkci0+bXNnX2NvbnRyb2xsZW4pCisgICAgICB8fCAoKHVuc2lnbmVkIGNoYXIgKikgX19jbXNnICsgQ01TR19BTElHTiAoX19jbXNnLT5jbXNnX2xlbikKKwkgID4gKCh1bnNpZ25lZCBjaGFyICopIF9fbWhkci0+bXNnX2NvbnRyb2wgKyBfX21oZHItPm1zZ19jb250cm9sbGVuKSkpCisgICAgLyogTm8gbW9yZSBlbnRyaWVzLiAgKi8KKyAgICByZXR1cm4gKHN0cnVjdCBjbXNnaGRyICopIDA7CisgIHJldHVybiBfX2Ntc2c7Cit9CisjZW5kaWYJLyogVXNlIGBleHRlcm4gaW5saW5lJy4gICovCisKKy8qIFNvY2tldCBsZXZlbCBtZXNzYWdlIHR5cGVzLiAgVGhpcyBtdXN0IG1hdGNoIHRoZSBkZWZpbml0aW9ucyBpbgorICAgPGxpbnV4L3NvY2tldC5oPi4gICovCitlbnVtCisgIHsKKyAgICBTQ01fUklHSFRTID0gMHgwMQkJLyogVHJhbnNmZXIgZmlsZSBkZXNjcmlwdG9ycy4gICovCisjZGVmaW5lIFNDTV9SSUdIVFMgU0NNX1JJR0hUUworI2lmZGVmIF9fVVNFX0dOVQorICAgICwgU0NNX0NSRURFTlRJQUxTID0gMHgwMgkvKiBDcmVkZW50aWFscyBwYXNzaW5nLiAgKi8KKyMgZGVmaW5lIFNDTV9DUkVERU5USUFMUyBTQ01fQ1JFREVOVElBTFMKKyNlbmRpZgorICB9OworCisjaWZkZWYgX19VU0VfR05VCisvKiBVc2VyIHZpc2libGUgc3RydWN0dXJlIGZvciBTQ01fQ1JFREVOVElBTFMgbWVzc2FnZSAqLworc3RydWN0IHVjcmVkCit7CisgIHBpZF90IHBpZDsJCQkvKiBQSUQgb2Ygc2VuZGluZyBwcm9jZXNzLiAgKi8KKyAgdWlkX3QgdWlkOwkJCS8qIFVJRCBvZiBzZW5kaW5nIHByb2Nlc3MuICAqLworICBnaWRfdCBnaWQ7CQkJLyogR0lEIG9mIHNlbmRpbmcgcHJvY2Vzcy4gICovCit9OworI2VuZGlmCisKKy8qIFVnbHkgd29ya2Fyb3VuZCBmb3IgdW5jbGVhbiBrZXJuZWwgaGVhZGVycy4gICovCisjaWYgIWRlZmluZWQgX19VU0VfTUlTQyAmJiAhZGVmaW5lZCBfX1VTRV9HTlUKKyMgaWZuZGVmIEZJT0dFVE9XTgorIyAgZGVmaW5lIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX0ZJT0dFVE9XTgorIyBlbmRpZgorIyBpZm5kZWYgRklPU0VUT1dOCisjICBkZWZpbmUgX19TWVNfU09DS0VUX0hfdW5kZWZfRklPU0VUT1dOCisjIGVuZGlmCisjIGlmbmRlZiBTSU9DQVRNQVJLCisjICBkZWZpbmUgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0FUTUFSSworIyBlbmRpZgorIyBpZm5kZWYgU0lPQ0dQR1JQCisjICBkZWZpbmUgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0dQR1JQCisjIGVuZGlmCisjIGlmbmRlZiBTSU9DR1NUQU1QCisjICBkZWZpbmUgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0dTVEFNUAorIyBlbmRpZgorIyBpZm5kZWYgU0lPQ0dTVEFNUE5TCisjICBkZWZpbmUgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0dTVEFNUE5TCisjIGVuZGlmCisjIGlmbmRlZiBTSU9DU1BHUlAKKyMgIGRlZmluZSBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DU1BHUlAKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBHZXQgc29ja2V0IG1hbmlwdWxhdGlvbiByZWxhdGVkIGluZm9ybWF0aW9ucyBmcm9tIGtlcm5lbCBoZWFkZXJzLiAgKi8KKyNpbmNsdWRlIDxhc20vc29ja2V0Lmg+CisKKyNpZiAhZGVmaW5lZCBfX1VTRV9NSVNDICYmICFkZWZpbmVkIF9fVVNFX0dOVQorIyBpZmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9GSU9HRVRPV04KKyMgIHVuZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX0ZJT0dFVE9XTgorIyAgdW5kZWYgRklPR0VUT1dOCisjIGVuZGlmCisjIGlmZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX0ZJT1NFVE9XTgorIyAgdW5kZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfRklPU0VUT1dOCisjICB1bmRlZiBGSU9TRVRPV04KKyMgZW5kaWYKKyMgaWZkZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0FUTUFSSworIyAgdW5kZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0FUTUFSSworIyAgdW5kZWYgU0lPQ0FUTUFSSworIyBlbmRpZgorIyBpZmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DR1BHUlAKKyMgIHVuZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NHUEdSUAorIyAgdW5kZWYgU0lPQ0dQR1JQCisjIGVuZGlmCisjIGlmZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NHU1RBTVAKKyMgIHVuZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NHU1RBTVAKKyMgIHVuZGVmIFNJT0NHU1RBTVAKKyMgZW5kaWYKKyMgaWZkZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0dTVEFNUE5TCisjICB1bmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DR1NUQU1QTlMKKyMgIHVuZGVmIFNJT0NHU1RBTVBOUworIyBlbmRpZgorIyBpZmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DU1BHUlAKKyMgIHVuZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NTUEdSUAorIyAgdW5kZWYgU0lPQ1NQR1JQCisjIGVuZGlmCisjZW5kaWYKKworLyogU3RydWN0dXJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgU09fTElOR0VSIG9wdGlvbi4gICovCitzdHJ1Y3QgbGluZ2VyCisgIHsKKyAgICBpbnQgbF9vbm9mZjsJCS8qIE5vbnplcm8gdG8gbGluZ2VyIG9uIGNsb3NlLiAgKi8KKyAgICBpbnQgbF9saW5nZXI7CQkvKiBUaW1lIHRvIGxpbmdlci4gICovCisgIH07CisKKworX19CRUdJTl9ERUNMUworCisvKiBSZWNlaXZlIHVwIHRvIFZMRU4gbWVzc2FnZXMgYXMgZGVzY3JpYmVkIGJ5IFZNRVNTQUdFUyBmcm9tIHNvY2tldCBGRC4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCByZWN2bW1zZyAoaW50IF9fZmQsIHN0cnVjdCBtbXNnaGRyICpfX3ZtZXNzYWdlcywKKwkJICAgICB1bnNpZ25lZCBpbnQgX192bGVuLCBpbnQgX19mbGFncywKKwkJICAgICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX190bW8pOworCisvKiBTZW5kIGEgVkxFTiBtZXNzYWdlcyBhcyBkZXNjcmliZWQgYnkgVk1FU1NBR0VTIHRvIHNvY2tldCBGRC4KKyAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGRhdGFncmFtcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiBvciAtMSBmb3IgZXJyb3JzLgorVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHNlbmRtbXNnIChpbnQgX19mZCwgc3RydWN0IG1tc2doZHIgKl9fdm1lc3NhZ2VzLAorCQkgICAgIHVuc2lnbmVkIGludCBfX3ZsZW4sIGludCBfX2ZsYWdzKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIGJpdHMvc29ja2V0LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zb2NrZXQyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc29ja2V0Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNGNiNDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc29ja2V0Mi5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIENoZWNraW5nIG1hY3JvcyBmb3Igc29ja2V0IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NPQ0tFVF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NvY2tldDIuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3NvY2tldC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitleHRlcm4gc3NpemVfdCBfX3JlY3ZfY2hrIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX24sIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgIGludCBfX2ZsYWdzKTsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcmVjdl9hbGlhcywgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbiwKKwkJCQkJICBpbnQgX19mbGFncyksIHJlY3YpOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19yZWN2X2Noa193YXJuLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbiwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgIGludCBfX2ZsYWdzKSwgX19yZWN2X2NoaykKKyAgICAgX193YXJuYXR0ciAoInJlY3YgY2FsbGVkIHdpdGggYmlnZ2VyIGxlbmd0aCB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNzaXplX3QKK3JlY3YgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbiwgaW50IF9fZmxhZ3MpCit7CisgIGlmIChfX2JvczAgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pKQorCXJldHVybiBfX3JlY3ZfY2hrIChfX2ZkLCBfX2J1ZiwgX19uLCBfX2JvczAgKF9fYnVmKSwgX19mbGFncyk7CisKKyAgICAgIGlmIChfX24gPiBfX2JvczAgKF9fYnVmKSkKKwlyZXR1cm4gX19yZWN2X2Noa193YXJuIChfX2ZkLCBfX2J1ZiwgX19uLCBfX2JvczAgKF9fYnVmKSwgX19mbGFncyk7CisgICAgfQorICByZXR1cm4gX19yZWN2X2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19uLCBfX2ZsYWdzKTsKK30KKworZXh0ZXJuIHNzaXplX3QgX19yZWN2ZnJvbV9jaGsgKGludCBfX2ZkLCB2b2lkICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19uLAorCQkJICAgICAgIHNpemVfdCBfX2J1ZmxlbiwgaW50IF9fZmxhZ3MsCisJCQkgICAgICAgX19TT0NLQUREUl9BUkcgX19hZGRyLAorCQkJICAgICAgIHNvY2tsZW5fdCAqX19yZXN0cmljdCBfX2FkZHJfbGVuKTsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcmVjdmZyb21fYWxpYXMsCisJCQkgICAoaW50IF9fZmQsIHZvaWQgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX24sCisJCQkgICAgaW50IF9fZmxhZ3MsIF9fU09DS0FERFJfQVJHIF9fYWRkciwKKwkJCSAgICBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19hZGRyX2xlbiksIHJlY3Zmcm9tKTsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcmVjdmZyb21fY2hrX3dhcm4sCisJCQkgICAoaW50IF9fZmQsIHZvaWQgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX24sCisJCQkgICAgc2l6ZV90IF9fYnVmbGVuLCBpbnQgX19mbGFncywKKwkJCSAgICBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCQkgICAgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fYWRkcl9sZW4pLCBfX3JlY3Zmcm9tX2NoaykKKyAgICAgX193YXJuYXR0ciAoInJlY3Zmcm9tIGNhbGxlZCB3aXRoIGJpZ2dlciBsZW5ndGggdGhhbiBzaXplIG9mICIKKwkJICJkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzc2l6ZV90CityZWN2ZnJvbSAoaW50IF9fZmQsIHZvaWQgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX24sIGludCBfX2ZsYWdzLAorCSAgX19TT0NLQUREUl9BUkcgX19hZGRyLCBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19hZGRyX2xlbikKK3sKKyAgaWYgKF9fYm9zMCAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikpCisJcmV0dXJuIF9fcmVjdmZyb21fY2hrIChfX2ZkLCBfX2J1ZiwgX19uLCBfX2JvczAgKF9fYnVmKSwgX19mbGFncywKKwkJCSAgICAgICBfX2FkZHIsIF9fYWRkcl9sZW4pOworICAgICAgaWYgKF9fbiA+IF9fYm9zMCAoX19idWYpKQorCXJldHVybiBfX3JlY3Zmcm9tX2Noa193YXJuIChfX2ZkLCBfX2J1ZiwgX19uLCBfX2JvczAgKF9fYnVmKSwgX19mbGFncywKKwkJCQkgICAgX19hZGRyLCBfX2FkZHJfbGVuKTsKKyAgICB9CisgIHJldHVybiBfX3JlY3Zmcm9tX2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19uLCBfX2ZsYWdzLCBfX2FkZHIsIF9fYWRkcl9sZW4pOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0YWIuZGVmIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0YWIuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNTQ3NzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RhYi5kZWYKQEAgLTAsMCArMSwyMzQgQEAKKy8qIFRhYmxlIG9mIERCWCBzeW1ib2wgY29kZXMgZm9yIHRoZSBHTlUgc3lzdGVtLgorICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBUaGlzIGNvbnRhaW5zIGNvbnRyaWJ1dGlvbiBmcm9tIEN5Z251cyBTdXBwb3J0LiAgKi8KKwwKKy8qIEdsb2JhbCB2YXJpYWJsZS4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuCisgICBUbyBmaW5kIHRoZSBhZGRyZXNzLCBsb29rIGluIHRoZSBjb3JyZXNwb25kaW5nIGV4dGVybmFsIHN5bWJvbC4gICovCitfX2RlZmluZV9zdGFiIChOX0dTWU0sIDB4MjAsICJHU1lNIikKKworLyogRnVuY3Rpb24gbmFtZSBmb3IgQlNEIEZvcnRyYW4uICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgorICAgVG8gZmluZCB0aGUgYWRkcmVzcywgbG9vayBpbiB0aGUgY29ycmVzcG9uZGluZyBleHRlcm5hbCBzeW1ib2wuICAqLworX19kZWZpbmVfc3RhYiAoTl9GTkFNRSwgMHgyMiwgIkZOQU1FIikKKworLyogRnVuY3Rpb24gbmFtZSBvciB0ZXh0LXNlZ21lbnQgdmFyaWFibGUgZm9yIEMuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4KKyAgIERlc2MgaXMgc3VwcG9zZWRseSBzdGFydGluZyBsaW5lIG51bWJlciwgYnV0IEdDQyBkb2Vzbid0IHNldCBpdAorICAgYW5kIERCWCBzZWVtcyBub3QgdG8gbWlzcyBpdC4gICovCitfX2RlZmluZV9zdGFiIChOX0ZVTiwgMHgyNCwgIkZVTiIpCisKKy8qIERhdGEtc2VnbWVudCB2YXJpYWJsZSB3aXRoIGludGVybmFsIGxpbmthZ2UuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4KKyAgICJTdGF0aWMgU3ltIi4gICovCitfX2RlZmluZV9zdGFiIChOX1NUU1lNLCAweDI2LCAiU1RTWU0iKQorCisvKiBCU1Mtc2VnbWVudCB2YXJpYWJsZSB3aXRoIGludGVybmFsIGxpbmthZ2UuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4gICovCitfX2RlZmluZV9zdGFiIChOX0xDU1lNLCAweDI4LCAiTENTWU0iKQorCisvKiBOYW1lIG9mIG1haW4gcm91dGluZS4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuCisgICBUaGlzIGlzIG5vdCB1c2VkIGluIEMuICAqLworX19kZWZpbmVfc3RhYiAoTl9NQUlOLCAweDJhLCAiTUFJTiIpCisKKy8qIEdsb2JhbCBzeW1ib2wgaW4gUGFzY2FsLgorICAgU3VwcG9zZWRseSB0aGUgdmFsdWUgaXMgaXRzIGxpbmUgbnVtYmVyOyBJJ20gc2tlcHRpY2FsLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fUEMsIDB4MzAsICJQQyIpCisKKy8qIE51bWJlciBvZiBzeW1ib2xzOiAgMCwgZmlsZXMsLGZ1bmNzLGxpbmVzIGFjY29yZGluZyB0byBVbHRyaXggVjQuMC4gKi8KK19fZGVmaW5lX3N0YWIgKE5fTlNZTVMsIDB4MzIsICJOU1lNUyIpCisKKy8qICJObyBEU1QgbWFwIGZvciBzeW06IG5hbWUsICwwLHR5cGUsaWdub3JlZCIgIGFjY29yZGluZyB0byBVbHRyaXggVjQuMC4gKi8KK19fZGVmaW5lX3N0YWIgKE5fTk9NQVAsIDB4MzQsICJOT01BUCIpCisKKy8qIE5ldyBzdGFiIGZyb20gU29sYXJpcy4gIEkgZG9uJ3Qga25vdyB3aGF0IGl0IG1lYW5zLCBidXQgaXQKKyAgIGRvbid0IHNlZW0gdG8gY29udGFpbiB1c2VmdWwgaW5mb3JtYXRpb24uICAqLworX19kZWZpbmVfc3RhYiAoTl9PQkosIDB4MzgsICJPQkoiKQorCisvKiBOZXcgc3RhYiBmcm9tIFNvbGFyaXMuICBJIGRvbid0IGtub3cgd2hhdCBpdCBtZWFucywgYnV0IGl0CisgICBkb24ndCBzZWVtIHRvIGNvbnRhaW4gdXNlZnVsIGluZm9ybWF0aW9uLiAgUG9zc2libHkgcmVsYXRlZCB0byB0aGUKKyAgIG9wdGltaXphdGlvbiBmbGFncyB1c2VkIGluIHRoaXMgbW9kdWxlLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fT1BULCAweDNjLCAiT1BUIikKKworLyogUmVnaXN0ZXIgdmFyaWFibGUuICBWYWx1ZSBpcyBudW1iZXIgb2YgcmVnaXN0ZXIuICAqLworX19kZWZpbmVfc3RhYiAoTl9SU1lNLCAweDQwLCAiUlNZTSIpCisKKy8qIE1vZHVsYS0yIGNvbXBpbGF0aW9uIHVuaXQuICBDYW4gc29tZW9uZSBzYXkgd2hhdCBpbmZvIGl0IGNvbnRhaW5zPyAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTTJDLCAweDQyLCAiTTJDIikKKworLyogTGluZSBudW1iZXIgaW4gdGV4dCBzZWdtZW50LiAgRGVzYyBpcyB0aGUgbGluZSBudW1iZXI7CisgICB2YWx1ZSBpcyBjb3JyZXNwb25kaW5nIGFkZHJlc3MuICAqLworX19kZWZpbmVfc3RhYiAoTl9TTElORSwgMHg0NCwgIlNMSU5FIikKKworLyogU2ltaWxhciwgZm9yIGRhdGEgc2VnbWVudC4gICovCitfX2RlZmluZV9zdGFiIChOX0RTTElORSwgMHg0NiwgIkRTTElORSIpCisKKy8qIFNpbWlsYXIsIGZvciBic3Mgc2VnbWVudC4gICovCitfX2RlZmluZV9zdGFiIChOX0JTTElORSwgMHg0OCwgIkJTTElORSIpCisKKy8qIFN1bidzIHNvdXJjZS1jb2RlIGJyb3dzZXIgc3RhYnMuICA/PyBEb24ndCBrbm93IHdoYXQgdGhlIGZpZWxkcyBhcmUuCisgICBTdXBwb3NlZGx5IHRoZSBmaWVsZCBpcyAicGF0aCB0byBhc3NvY2lhdGVkIC5jYiBmaWxlIi4gIFRISVMgVkFMVUUKKyAgIE9WRVJMQVBTIFdJVEggTl9CU0xJTkUhICAqLworX19kZWZpbmVfc3RhYiAoTl9CUk9XUywgMHg0OCwgIkJST1dTIikKKworLyogR05VIE1vZHVsYS0yIGRlZmluaXRpb24gbW9kdWxlIGRlcGVuZGVuY3kuICBWYWx1ZSBpcyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUKKyAgIG9mIHRoZSBkZWZpbml0aW9uIGZpbGUuICBPdGhlciBpcyBub24temVybyBpZiBpdCBpcyBpbXBvcnRlZCB3aXRoIHRoZQorICAgR05VIE0yIGtleXdvcmQgJUlOSVRJQUxJWkUuICBQZXJoYXBzIE5fTTJDIGNhbiBiZSB1c2VkIGlmIHRoZXJlCisgICBhcmUgZW5vdWdoIGVtcHR5IGZpZWxkcz8gKi8KK19fZGVmaW5lX3N0YWIoTl9ERUZELCAweDRhLCAiREVGRCIpCisKKy8qIFRIRSBGT0xMT1dJTkcgVFdPIFNUQUIgVkFMVUVTIENPTkZMSUNULiAgSGFwcGlseSwgb25lIGlzIGZvciBNb2R1bGEtMgorICAgYW5kIG9uZSBpcyBmb3IgQysrLiAgIFN0aWxsLC4uLiAqLworLyogR05VIEMrKyBleGNlcHRpb24gdmFyaWFibGUuICBOYW1lIGlzIHZhcmlhYmxlIG5hbWUuICAqLworX19kZWZpbmVfc3RhYiAoTl9FSERFQ0wsIDB4NTAsICJFSERFQ0wiKQorLyogTW9kdWxhMiBpbmZvICJmb3IgaW1jIjogIG5hbWUsLDAsMCwwICBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICAqLworX19kZWZpbmVfc3RhYiAoTl9NT0QyLCAweDUwLCAiTU9EMiIpCisKKy8qIEdOVSBDKysgYGNhdGNoJyBjbGF1c2UuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4gIERlc2MgaXMgbm9uemVybyBpZgorICAgdGhpcyBlbnRyeSBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIENBVUdIVCBzdGFiIHNheWluZyB3aGF0IGV4Y2VwdGlvbgorICAgd2FzIGNhdWdodC4gIE11bHRpcGxlIENBVUdIVCBzdGFicyBtZWFucyB0aGF0IG11bHRpcGxlIGV4Y2VwdGlvbnMKKyAgIGNhbiBiZSBjYXVnaHQgaGVyZS4gIElmIERlc2MgaXMgMCwgaXQgbWVhbnMgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodAorICAgaGVyZS4gICovCitfX2RlZmluZV9zdGFiIChOX0NBVENILCAweDU0LCAiQ0FUQ0giKQorCisvKiBTdHJ1Y3R1cmUgb3IgdW5pb24gZWxlbWVudC4gIFZhbHVlIGlzIG9mZnNldCBpbiB0aGUgc3RydWN0dXJlLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fU1NZTSwgMHg2MCwgIlNTWU0iKQorCisvKiBOYW1lIG9mIG1haW4gc291cmNlIGZpbGUuCisgICBWYWx1ZSBpcyBzdGFydGluZyB0ZXh0IGFkZHJlc3Mgb2YgdGhlIGNvbXBpbGF0aW9uLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fU08sIDB4NjQsICJTTyIpCisKKy8qIEF1dG9tYXRpYyB2YXJpYWJsZSBpbiB0aGUgc3RhY2suICBWYWx1ZSBpcyBvZmZzZXQgZnJvbSBmcmFtZSBwb2ludGVyLgorICAgQWxzbyB1c2VkIGZvciB0eXBlIGRlc2NyaXB0aW9ucy4gICovCitfX2RlZmluZV9zdGFiIChOX0xTWU0sIDB4ODAsICJMU1lNIikKKworLyogQmVnaW5uaW5nIG9mIGFuIGluY2x1ZGUgZmlsZS4gIE9ubHkgU3VuIHVzZXMgdGhpcy4KKyAgIEluIGFuIG9iamVjdCBmaWxlLCBvbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgorICAgVGhlIFN1biBsaW5rZXIgcHV0cyBkYXRhIGludG8gc29tZSBvZiB0aGUgb3RoZXIgZmllbGRzLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fQklOQ0wsIDB4ODIsICJCSU5DTCIpCisKKy8qIE5hbWUgb2Ygc3ViLXNvdXJjZSBmaWxlICgjaW5jbHVkZSBmaWxlKS4KKyAgIFZhbHVlIGlzIHN0YXJ0aW5nIHRleHQgYWRkcmVzcyBvZiB0aGUgY29tcGlsYXRpb24uICAqLworX19kZWZpbmVfc3RhYiAoTl9TT0wsIDB4ODQsICJTT0wiKQorCisvKiBQYXJhbWV0ZXIgdmFyaWFibGUuICBWYWx1ZSBpcyBvZmZzZXQgZnJvbSBhcmd1bWVudCBwb2ludGVyLgorICAgKE9uIG1vc3QgbWFjaGluZXMgdGhlIGFyZ3VtZW50IHBvaW50ZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGZyYW1lIHBvaW50ZXIuICAqLworX19kZWZpbmVfc3RhYiAoTl9QU1lNLCAweGEwLCAiUFNZTSIpCisKKy8qIEVuZCBvZiBhbiBpbmNsdWRlIGZpbGUuICBObyBuYW1lLgorICAgVGhpcyBhbmQgTl9CSU5DTCBhY3QgYXMgYnJhY2tldHMgYXJvdW5kIHRoZSBmaWxlJ3Mgb3V0cHV0LgorICAgSW4gYW4gb2JqZWN0IGZpbGUsIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGRhdGEgaW4gdGhpcyBlbnRyeS4KKyAgIFRoZSBTdW4gbGlua2VyIHB1dHMgZGF0YSBpbnRvIHNvbWUgb2YgdGhlIGZpZWxkcy4gICovCitfX2RlZmluZV9zdGFiIChOX0VJTkNMLCAweGEyLCAiRUlOQ0wiKQorCisvKiBBbHRlcm5hdGUgZW50cnkgcG9pbnQuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4gICovCitfX2RlZmluZV9zdGFiIChOX0VOVFJZLCAweGE0LCAiRU5UUlkiKQorCisvKiBCZWdpbm5pbmcgb2YgbGV4aWNhbCBibG9jay4KKyAgIFRoZSBkZXNjIGlzIHRoZSBuZXN0aW5nIGxldmVsIGluIGxleGljYWwgYmxvY2tzLgorICAgVGhlIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBmb3IgdGhlIGJsb2NrLgorICAgVGhlIHZhcmlhYmxlcyBkZWNsYXJlZCBpbnNpZGUgdGhlIGJsb2NrICpwcmVjZWRlKiB0aGUgTl9MQlJBQyBzeW1ib2wuICAqLworX19kZWZpbmVfc3RhYiAoTl9MQlJBQywgMHhjMCwgIkxCUkFDIikKKworLyogUGxhY2UgaG9sZGVyIGZvciBkZWxldGVkIGluY2x1ZGUgZmlsZS4gIFJlcGxhY2VzIGEgTl9CSU5DTCBhbmQgZXZlcnl0aGluZworICAgdXAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgTl9FSU5DTC4gIFRoZSBTdW4gbGlua2VyIGdlbmVyYXRlcyB0aGVzZSB3aGVuCisgICBpdCBmaW5kcyBtdWx0aXBsZSBpZGVudGljYWwgY29waWVzIG9mIHRoZSBzeW1ib2xzIGZyb20gYW4gaW5jbHVkZSBmaWxlLgorICAgVGhpcyBhcHBlYXJzIG9ubHkgaW4gb3V0cHV0IGZyb20gdGhlIFN1biBsaW5rZXIuICAqLworX19kZWZpbmVfc3RhYiAoTl9FWENMLCAweGMyLCAiRVhDTCIpCisKKy8qIE1vZHVsYS0yIHNjb3BlIGluZm9ybWF0aW9uLiAgQ2FuIHNvbWVvbmUgc2F5IHdoYXQgaW5mbyBpdCBjb250YWlucz8gICovCitfX2RlZmluZV9zdGFiIChOX1NDT1BFLCAweGM0LCAiU0NPUEUiKQorCisvKiBFbmQgb2YgYSBsZXhpY2FsIGJsb2NrLiAgRGVzYyBtYXRjaGVzIHRoZSBOX0xCUkFDJ3MgZGVzYy4KKyAgIFRoZSB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSB0ZXh0IGZvciB0aGUgYmxvY2suICAqLworX19kZWZpbmVfc3RhYiAoTl9SQlJBQywgMHhlMCwgIlJCUkFDIikKKworLyogQmVnaW4gbmFtZWQgY29tbW9uIGJsb2NrLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4gICovCitfX2RlZmluZV9zdGFiIChOX0JDT01NLCAweGUyLCAiQkNPTU0iKQorCisvKiBFbmQgbmFtZWQgY29tbW9uIGJsb2NrLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudAorICAgKGFuZCBpdCBzaG91bGQgbWF0Y2ggdGhlIE5fQkNPTU0pLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRUNPTU0sIDB4ZTQsICJFQ09NTSIpCisKKy8qIEVuZCBjb21tb24gKGxvY2FsIG5hbWUpOiB2YWx1ZSBpcyBhZGRyZXNzLgorICAgSSdtIG5vdCBzdXJlIGhvdyB0aGlzIGlzIHVzZWQuICAqLworX19kZWZpbmVfc3RhYiAoTl9FQ09NTCwgMHhlOCwgIkVDT01MIikKKworLyogVGhlc2UgU1RBQidzIGFyZSB1c2VkIG9uIEdvdWxkIHN5c3RlbXMgZm9yIE5vbi1CYXNlIHJlZ2lzdGVyIHN5bWJvbHMKKyAgIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuICBGSVhNRS4gIEkgaGF2ZSBhc3NpZ25lZCB0aGUgdmFsdWVzIGF0IHJhbmRvbQorICAgc2luY2UgSSBkb24ndCBoYXZlIGEgR291bGQgaGVyZS4gIEZpeHVwcyBmcm9tIEdvdWxkIGZvbGsgd2VsY29tZS4uLiAqLworX19kZWZpbmVfc3RhYiAoTl9OQlRFWFQsIDB4RjAsICJOQlRFWFQiKQorX19kZWZpbmVfc3RhYiAoTl9OQkRBVEEsIDB4RjIsICJOQkRBVEEiKQorX19kZWZpbmVfc3RhYiAoTl9OQkJTUywgIDB4RjQsICJOQkJTUyIpCitfX2RlZmluZV9zdGFiIChOX05CU1RTLCAgMHhGNiwgIk5CU1RTIikKK19fZGVmaW5lX3N0YWIgKE5fTkJMQ1MsICAweEY4LCAiTkJMQ1MiKQorCisvKiBTZWNvbmQgc3ltYm9sIGVudHJ5IGNvbnRhaW5pbmcgYSBsZW5ndGgtdmFsdWUgZm9yIHRoZSBwcmVjZWRpbmcgZW50cnkuCisgICBUaGUgdmFsdWUgaXMgdGhlIGxlbmd0aC4gICovCitfX2RlZmluZV9zdGFiIChOX0xFTkcsIDB4ZmUsICJMRU5HIikKKwwKKy8qIFRoZSBhYm92ZSBpbmZvcm1hdGlvbiwgaW4gbWF0cml4IGZvcm1hdC4KKworCQkJU1RBQiBNQVRSSVgKKwlfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisJfCAwMCAtIDFGIGFyZSBub3QgZGJ4IHN0YWIgc3ltYm9scwkJfAorCXwgSW4gbW9zdCBjYXNlcywgdGhlIGxvdyBiaXQgaXMgdGhlIEVYVGVybmFsIGJpdHwKKworCXwgMDAgVU5ERUYgIHwgMDIgQUJTCXwgMDQgVEVYVCAgIHwgMDYgREFUQQl8CisJfCAwMSAgfEVYVCAgfCAwMyAgfEVYVAl8IDA1ICB8RVhUICB8IDA3ICB8RVhUCXwKKworCXwgMDggQlNTICAgIHwgMEEgSU5EUgl8IDBDIEZOX1NFUSB8IDBFICAgCXwKKwl8IDA5ICB8RVhUICB8IDBCIAl8IDBECSAgICB8IDBGCXwKKworCXwgMTAgCSAgICB8IDEyIENPTU0JfCAxNCBTRVRBICAgfCAxNiBTRVRUCXwKKwl8IDExCSAgICB8IDEzCXwgMTUgCSAgICB8IDE3CXwKKworCXwgMTggU0VURCAgIHwgMUEgU0VUQgl8IDFDIFNFVFYgICB8IDFFIFdBUk5JTkd8CisJfCAxOQkgICAgfCAxQgl8IDFEIAkgICAgfCAxRiBGTgl8CisKKwl8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisJfCBEZWJ1ZyBlbnRyaWVzIHdpdGggYml0IDAxIHNldCBhcmUgdW51c2VkLgl8CisJfCAyMCBHU1lNICAgfCAyMiBGTkFNRQl8IDI0IEZVTiAgICB8IDI2IFNUU1lNCXwKKwl8IDI4IExDU1lNICB8IDJBIE1BSU4JfCAyQwkgICAgfCAyRQl8CisJfCAzMCBQQwkgICAgfCAzMiBOU1lNUwl8IDM0IE5PTUFQICB8IDM2CXwKKwl8IDM4IE9CSiAgICB8IDNBCXwgM0MgT1BUICAgIHwgM0UJfAorCXwgNDAgUlNZTSAgIHwgNDIgTTJDCXwgNDQgU0xJTkUgIHwgNDYgRFNMSU5FIHwKKwl8IDQ4IEJTTElORSp8IDRBIERFRkQJfCA0QyAgICAgICAgfCA0RQl8CisJfCA1MCBFSERFQ0wqfCA1Mgl8IDU0IENBVENIICB8IDU2ICAgICAgICB8CisJfCA1OCAgICAgICAgfCA1QSAgICAgICAgfCA1QyAgICAgICAgfCA1RQl8CisJfCA2MCBTU1lNICAgfCA2Mgl8IDY0IFNPCSAgICB8IDY2IAl8CisJfCA2OCAJICAgIHwgNkEJfCA2QwkgICAgfCA2RQl8CisJfCA3MAkgICAgfCA3Mgl8IDc0CSAgICB8IDc2CXwKKwl8IDc4CSAgICB8IDdBCXwgN0MJICAgIHwgN0UJfAorCXwgODAgTFNZTSAgIHwgODIgQklOQ0wJfCA4NCBTT0wgICAgfCA4Ngl8CisJfCA4OAkgICAgfCA4QQl8IDhDCSAgICB8IDhFCXwKKwl8IDkwCSAgICB8IDkyCXwgOTQJICAgIHwgOTYJfAorCXwgOTgJICAgIHwgOUEJfCA5QwkgICAgfCA5RQl8CisJfCBBMCBQU1lNICAgfCBBMiBFSU5DTAl8IEE0IEVOVFJZICB8IEE2CXwKKwl8IEE4CSAgICB8IEFBCXwgQUMJICAgIHwgQUUJfAorCXwgQjAJICAgIHwgQjIJfCBCNAkgICAgfCBCNgl8CisJfCBCOAkgICAgfCBCQQl8IEJDCSAgICB8IEJFCXwKKwl8IEMwIExCUkFDICB8IEMyIEVYQ0wJfCBDNCBTQ09QRSAgfCBDNgl8CisJfCBDOAkgICAgfCBDQQl8IENDCSAgICB8IENFCXwKKwl8IEQwCSAgICB8IEQyCXwgRDQJICAgIHwgRDYJfAorCXwgRDgJICAgIHwgREEJfCBEQwkgICAgfCBERQl8CisJfCBFMCBSQlJBQyAgfCBFMiBCQ09NTQl8IEU0IEVDT01NICB8IEU2CXwKKwl8IEU4IEVDT01MICB8IEVBCXwgRUMJICAgIHwgRUUJfAorCXwgRjAJICAgIHwgRjIJfCBGNAkgICAgfCBGNgl8CisJfCBGOAkgICAgfCBGQQl8IEZDCSAgICB8IEZFIExFTkcJfAorCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIDUwIEVIREVDTCBpcyBhbHNvIE1PRDIuCisgKiA0OCBCU0xJTkUgaXMgYWxzbyBCUk9XUy4KKyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0YXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjM2NkNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGF0LmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NS0yMDAyLCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX1NZU19TVEFUX0ggJiYgIWRlZmluZWQgX0ZDTlRMX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RhdC5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc3RhdC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX1NUQVRfSAorI2RlZmluZSBfQklUU19TVEFUX0gJMQorCisvKiBWZXJzaW9ucyBvZiB0aGUgYHN0cnVjdCBzdGF0JyBkYXRhIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIF9TVEFUX1ZFUl9MSU5VWF9PTEQJMQorI2RlZmluZSBfU1RBVF9WRVJfS0VSTkVMCTEKKyNkZWZpbmUgX1NUQVRfVkVSX1NWUjQJCTIKKyNkZWZpbmUgX1NUQVRfVkVSX0xJTlVYCQkzCisjZGVmaW5lIF9TVEFUX1ZFUgkJX1NUQVRfVkVSX0xJTlVYCS8qIFRoZSBvbmUgZGVmaW5lZCBiZWxvdy4gICovCisKKy8qIFZlcnNpb25zIG9mIHRoZSBgeG1rbm9kJyBpbnRlcmZhY2UuICAqLworI2RlZmluZSBfTUtOT0RfVkVSX0xJTlVYCTEKKyNkZWZpbmUgX01LTk9EX1ZFUl9TVlI0CQkyCisjZGVmaW5lIF9NS05PRF9WRVIJCV9NS05PRF9WRVJfTElOVVggLyogVGhlIGJpdHMgZGVmaW5lZCBiZWxvdy4gICovCisKKworc3RydWN0IHN0YXQKKyAgeworICAgIF9fZGV2X3Qgc3RfZGV2OwkJCS8qIERldmljZS4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fcGFkMTsKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgIF9faW5vX3Qgc3RfaW5vOwkJCS8qIEZpbGUgc2VyaWFsIG51bWJlci4JKi8KKyNlbHNlCisgICAgX19pbm9fdCBfX3N0X2lubzsJCQkvKiAzMmJpdCBmaWxlIHNlcmlhbCBudW1iZXIuCSovCisjZW5kaWYKKyAgICBfX21vZGVfdCBzdF9tb2RlOwkJCS8qIEZpbGUgbW9kZS4gICovCisgICAgX19ubGlua190IHN0X25saW5rOwkJCS8qIExpbmsgY291bnQuICAqLworICAgIF9fdWlkX3Qgc3RfdWlkOwkJCS8qIFVzZXIgSUQgb2YgdGhlIGZpbGUncyBvd25lci4JKi8KKyAgICBfX2dpZF90IHN0X2dpZDsJCQkvKiBHcm91cCBJRCBvZiB0aGUgZmlsZSdzIGdyb3VwLiovCisgICAgX19kZXZfdCBzdF9yZGV2OwkJCS8qIERldmljZSBudW1iZXIsIGlmIGRldmljZS4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fcGFkMjsKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgIF9fb2ZmX3Qgc3Rfc2l6ZTsJCQkvKiBTaXplIG9mIGZpbGUsIGluIGJ5dGVzLiAgKi8KKyNlbHNlCisgICAgX19vZmY2NF90IHN0X3NpemU7CQkJLyogU2l6ZSBvZiBmaWxlLCBpbiBieXRlcy4gICovCisjZW5kaWYKKyAgICBfX2Jsa3NpemVfdCBzdF9ibGtzaXplOwkJLyogT3B0aW1hbCBibG9jayBzaXplIGZvciBJL08uICAqLworCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICBfX2Jsa2NudF90IHN0X2Jsb2NrczsJCS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworI2Vsc2UKKyAgICBfX2Jsa2NudDY0X3Qgc3RfYmxvY2tzOwkJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisjZW5kaWYKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorICAgIC8qIE5hbm9zZWNvbmQgcmVzb2x1dGlvbiB0aW1lc3RhbXBzIGFyZSBzdG9yZWQgaW4gYSBmb3JtYXQKKyAgICAgICBlcXVpdmFsZW50IHRvICdzdHJ1Y3QgdGltZXNwZWMnLiAgVGhpcyBpcyB0aGUgdHlwZSB1c2VkCisgICAgICAgd2hlbmV2ZXIgcG9zc2libGUgYnV0IHRoZSBVbml4IG5hbWVzcGFjZSBydWxlcyBkbyBub3QgYWxsb3cgdGhlCisgICAgICAgaWRlbnRpZmllciAndGltZXNwZWMnIHRvIGFwcGVhciBpbiB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlci4KKyAgICAgICBUaGVyZWZvcmUgd2UgaGF2ZSB0byBoYW5kbGUgdGhlIHVzZSBvZiB0aGlzIGhlYWRlciBpbiBzdHJpY3RseQorICAgICAgIHN0YW5kYXJkLWNvbXBsaWFudCBzb3VyY2VzIHNwZWNpYWwuICAqLworICAgIHN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOwkJLyogVGltZSBvZiBsYXN0IGFjY2Vzcy4gICovCisgICAgc3RydWN0IHRpbWVzcGVjIHN0X210aW07CQkvKiBUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXNwZWMgc3RfY3RpbTsJCS8qIFRpbWUgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKyMgZGVmaW5lIHN0X2F0aW1lIHN0X2F0aW0udHZfc2VjCS8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICAqLworIyBkZWZpbmUgc3RfbXRpbWUgc3RfbXRpbS50dl9zZWMKKyMgZGVmaW5lIHN0X2N0aW1lIHN0X2N0aW0udHZfc2VjCisjZWxzZQorICAgIF9fdGltZV90IHN0X2F0aW1lOwkJCS8qIFRpbWUgb2YgbGFzdCBhY2Nlc3MuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN0X2F0aW1lbnNlYzsJLyogTnNjZWNzIG9mIGxhc3QgYWNjZXNzLiAgKi8KKyAgICBfX3RpbWVfdCBzdF9tdGltZTsJCQkvKiBUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzdF9tdGltZW5zZWM7CS8qIE5zZWNzIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKyAgICBfX3RpbWVfdCBzdF9jdGltZTsJCQkvKiBUaW1lIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3RfY3RpbWVuc2VjOwkvKiBOc2VjcyBvZiBsYXN0IHN0YXR1cyBjaGFuZ2UuICAqLworI2VuZGlmCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDQ7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ1OworI2Vsc2UKKyAgICBfX2lubzY0X3Qgc3RfaW5vOwkJCS8qIEZpbGUgc2VyaWFsIG51bWJlci4JKi8KKyNlbmRpZgorICB9OworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3N0cnVjdCBzdGF0NjQKKyAgeworICAgIF9fZGV2X3Qgc3RfZGV2OwkJCS8qIERldmljZS4gICovCisgICAgdW5zaWduZWQgaW50IF9fcGFkMTsKKworICAgIF9faW5vX3QgX19zdF9pbm87CQkJLyogMzJiaXQgZmlsZSBzZXJpYWwgbnVtYmVyLgkqLworICAgIF9fbW9kZV90IHN0X21vZGU7CQkJLyogRmlsZSBtb2RlLiAgKi8KKyAgICBfX25saW5rX3Qgc3Rfbmxpbms7CQkJLyogTGluayBjb3VudC4gICovCisgICAgX191aWRfdCBzdF91aWQ7CQkJLyogVXNlciBJRCBvZiB0aGUgZmlsZSdzIG93bmVyLgkqLworICAgIF9fZ2lkX3Qgc3RfZ2lkOwkJCS8qIEdyb3VwIElEIG9mIHRoZSBmaWxlJ3MgZ3JvdXAuKi8KKyAgICBfX2Rldl90IHN0X3JkZXY7CQkJLyogRGV2aWNlIG51bWJlciwgaWYgZGV2aWNlLiAgKi8KKyAgICB1bnNpZ25lZCBpbnQgX19wYWQyOworICAgIF9fb2ZmNjRfdCBzdF9zaXplOwkJCS8qIFNpemUgb2YgZmlsZSwgaW4gYnl0ZXMuICAqLworICAgIF9fYmxrc2l6ZV90IHN0X2Jsa3NpemU7CQkvKiBPcHRpbWFsIGJsb2NrIHNpemUgZm9yIEkvTy4gICovCisKKyAgICBfX2Jsa2NudDY0X3Qgc3RfYmxvY2tzOwkJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisjIGlmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisgICAgLyogTmFub3NlY29uZCByZXNvbHV0aW9uIHRpbWVzdGFtcHMgYXJlIHN0b3JlZCBpbiBhIGZvcm1hdAorICAgICAgIGVxdWl2YWxlbnQgdG8gJ3N0cnVjdCB0aW1lc3BlYycuICBUaGlzIGlzIHRoZSB0eXBlIHVzZWQKKyAgICAgICB3aGVuZXZlciBwb3NzaWJsZSBidXQgdGhlIFVuaXggbmFtZXNwYWNlIHJ1bGVzIGRvIG5vdCBhbGxvdyB0aGUKKyAgICAgICBpZGVudGlmaWVyICd0aW1lc3BlYycgdG8gYXBwZWFyIGluIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyLgorICAgICAgIFRoZXJlZm9yZSB3ZSBoYXZlIHRvIGhhbmRsZSB0aGUgdXNlIG9mIHRoaXMgaGVhZGVyIGluIHN0cmljdGx5CisgICAgICAgc3RhbmRhcmQtY29tcGxpYW50IHNvdXJjZXMgc3BlY2lhbC4gICovCisgICAgc3RydWN0IHRpbWVzcGVjIHN0X2F0aW07CQkvKiBUaW1lIG9mIGxhc3QgYWNjZXNzLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXNwZWMgc3RfbXRpbTsJCS8qIFRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24uICAqLworICAgIHN0cnVjdCB0aW1lc3BlYyBzdF9jdGltOwkJLyogVGltZSBvZiBsYXN0IHN0YXR1cyBjaGFuZ2UuICAqLworIyBlbHNlCisgICAgX190aW1lX3Qgc3RfYXRpbWU7CQkJLyogVGltZSBvZiBsYXN0IGFjY2Vzcy4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3RfYXRpbWVuc2VjOwkvKiBOc2NlY3Mgb2YgbGFzdCBhY2Nlc3MuICAqLworICAgIF9fdGltZV90IHN0X210aW1lOwkJCS8qIFRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24uICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN0X210aW1lbnNlYzsJLyogTnNlY3Mgb2YgbGFzdCBtb2RpZmljYXRpb24uICAqLworICAgIF9fdGltZV90IHN0X2N0aW1lOwkJCS8qIFRpbWUgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzdF9jdGltZW5zZWM7CS8qIE5zZWNzIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisjIGVuZGlmCisgICAgX19pbm82NF90IHN0X2lubzsJCQkvKiBGaWxlIHNlcmlhbCBudW1iZXIuCQkqLworICB9OworI2VuZGlmCisKKy8qIFRlbGwgY29kZSB3ZSBoYXZlIHRoZXNlIG1lbWJlcnMuICAqLworI2RlZmluZQlfU1RBVEJVRl9TVF9CTEtTSVpFCisjZGVmaW5lIF9TVEFUQlVGX1NUX1JERVYKKy8qIE5hbm9zZWNvbmQgcmVzb2x1dGlvbiB0aW1lIHZhbHVlcyBhcmUgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCisvKiBFbmNvZGluZyBvZiB0aGUgZmlsZSBtb2RlLiAgKi8KKworI2RlZmluZQlfX1NfSUZNVAkwMTcwMDAwCS8qIFRoZXNlIGJpdHMgZGV0ZXJtaW5lIGZpbGUgdHlwZS4gICovCisKKy8qIEZpbGUgdHlwZXMuICAqLworI2RlZmluZQlfX1NfSUZESVIJMDA0MDAwMAkvKiBEaXJlY3RvcnkuICAqLworI2RlZmluZQlfX1NfSUZDSFIJMDAyMDAwMAkvKiBDaGFyYWN0ZXIgZGV2aWNlLiAgKi8KKyNkZWZpbmUJX19TX0lGQkxLCTAwNjAwMDAJLyogQmxvY2sgZGV2aWNlLiAgKi8KKyNkZWZpbmUJX19TX0lGUkVHCTAxMDAwMDAJLyogUmVndWxhciBmaWxlLiAgKi8KKyNkZWZpbmUJX19TX0lGSUZPCTAwMTAwMDAJLyogRklGTy4gICovCisjZGVmaW5lCV9fU19JRkxOSwkwMTIwMDAwCS8qIFN5bWJvbGljIGxpbmsuICAqLworI2RlZmluZQlfX1NfSUZTT0NLCTAxNDAwMDAJLyogU29ja2V0LiAgKi8KKworLyogUE9TSVguMWIgb2JqZWN0cy4gIE5vdGUgdGhhdCB0aGVzZSBtYWNyb3MgYWx3YXlzIGV2YWx1YXRlIHRvIHplcm8uICBCdXQKKyAgIHRoZXkgZG8gaXQgYnkgZW5mb3JjaW5nIHRoZSBjb3JyZWN0IHVzZSBvZiB0aGUgbWFjcm9zLiAgKi8KKyNkZWZpbmUgX19TX1RZUEVJU01RKGJ1ZikgICgoYnVmKS0+c3RfbW9kZSAtIChidWYpLT5zdF9tb2RlKQorI2RlZmluZSBfX1NfVFlQRUlTU0VNKGJ1ZikgKChidWYpLT5zdF9tb2RlIC0gKGJ1ZiktPnN0X21vZGUpCisjZGVmaW5lIF9fU19UWVBFSVNTSE0oYnVmKSAoKGJ1ZiktPnN0X21vZGUgLSAoYnVmKS0+c3RfbW9kZSkKKworLyogUHJvdGVjdGlvbiBiaXRzLiAgKi8KKworI2RlZmluZQlfX1NfSVNVSUQJMDQwMDAJLyogU2V0IHVzZXIgSUQgb24gZXhlY3V0aW9uLiAgKi8KKyNkZWZpbmUJX19TX0lTR0lECTAyMDAwCS8qIFNldCBncm91cCBJRCBvbiBleGVjdXRpb24uICAqLworI2RlZmluZQlfX1NfSVNWVFgJMDEwMDAJLyogU2F2ZSBzd2FwcGVkIHRleHQgYWZ0ZXIgdXNlIChzdGlja3kpLiAgKi8KKyNkZWZpbmUJX19TX0lSRUFECTA0MDAJLyogUmVhZCBieSBvd25lci4gICovCisjZGVmaW5lCV9fU19JV1JJVEUJMDIwMAkvKiBXcml0ZSBieSBvd25lci4gICovCisjZGVmaW5lCV9fU19JRVhFQwkwMTAwCS8qIEV4ZWN1dGUgYnkgb3duZXIuICAqLworCisjaWZkZWYgX19VU0VfQVRGSUxFCisjIGRlZmluZSBVVElNRV9OT1cJKCgxbCA8PCAzMCkgLSAxbCkKKyMgZGVmaW5lIFVUSU1FX09NSVQJKCgxbCA8PCAzMCkgLSAybCkKKyNlbmRpZgorCisjZW5kaWYJLyogYml0cy9zdGF0LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGF0ZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGF0ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmQ5MGQwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0YXRmcy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywxOTk4LDIwMDAsMjAwMiwyMDAzLDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TVEFURlNfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGF0ZnMuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3N0YXRmcy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCitzdHJ1Y3Qgc3RhdGZzCisgIHsKKyAgICBfX1NXT1JEX1RZUEUgZl90eXBlOworICAgIF9fU1dPUkRfVFlQRSBmX2JzaXplOworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19mc2Jsa2NudF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnRfdCBmX2JmcmVlOworICAgIF9fZnNibGtjbnRfdCBmX2JhdmFpbDsKKyAgICBfX2ZzZmlsY250X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250X3QgZl9mZnJlZTsKKyNlbHNlCisgICAgX19mc2Jsa2NudDY0X3QgZl9ibG9ja3M7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iZnJlZTsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2JhdmFpbDsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZpbGVzOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmZyZWU7CisjZW5kaWYKKyAgICBfX2ZzaWRfdCBmX2ZzaWQ7CisgICAgX19TV09SRF9UWVBFIGZfbmFtZWxlbjsKKyAgICBfX1NXT1JEX1RZUEUgZl9mcnNpemU7CisgICAgX19TV09SRF9UWVBFIGZfZmxhZ3M7CisgICAgX19TV09SRF9UWVBFIGZfc3BhcmVbNF07CisgIH07CisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorc3RydWN0IHN0YXRmczY0CisgIHsKKyAgICBfX1NXT1JEX1RZUEUgZl90eXBlOworICAgIF9fU1dPUkRfVFlQRSBmX2JzaXplOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmZyZWU7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iYXZhaWw7CisgICAgX19mc2ZpbGNudDY0X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZmcmVlOworICAgIF9fZnNpZF90IGZfZnNpZDsKKyAgICBfX1NXT1JEX1RZUEUgZl9uYW1lbGVuOworICAgIF9fU1dPUkRfVFlQRSBmX2Zyc2l6ZTsKKyAgICBfX1NXT1JEX1RZUEUgZl9mbGFnczsKKyAgICBfX1NXT1JEX1RZUEUgZl9zcGFyZVs0XTsKKyAgfTsKKyNlbmRpZgorCisvKiBUZWxsIGNvZGUgd2UgaGF2ZSB0aGVzZSBtZW1iZXJzLiAgKi8KKyNkZWZpbmUgX1NUQVRGU19GX05BTUVMRU4KKyNkZWZpbmUgX1NUQVRGU19GX0ZSU0laRQorI2RlZmluZSBfU1RBVEZTX0ZfRkxBR1MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGF0dmZzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RhdHZmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzE3YzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RhdHZmcy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwyMDAwLDIwMDEsMjAwMiwyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1RBVFZGU19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0YXR2ZnMuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3N0YXR2ZnMuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4gIC8qIEZvciBfX2ZzYmxrY250X3QgYW5kIF9fZnNmaWxjbnRfdC4gICovCisKKyNpZiBfX1dPUkRTSVpFID09IDMyCisjZGVmaW5lIF9TVEFUVkZTQlVGX0ZfVU5VU0VECisjZW5kaWYKKworc3RydWN0IHN0YXR2ZnMKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfYnNpemU7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgZl9mcnNpemU7CisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICBfX2ZzYmxrY250X3QgZl9ibG9ja3M7CisgICAgX19mc2Jsa2NudF90IGZfYmZyZWU7CisgICAgX19mc2Jsa2NudF90IGZfYmF2YWlsOworICAgIF9fZnNmaWxjbnRfdCBmX2ZpbGVzOworICAgIF9fZnNmaWxjbnRfdCBmX2ZmcmVlOworICAgIF9fZnNmaWxjbnRfdCBmX2ZhdmFpbDsKKyNlbHNlCisgICAgX19mc2Jsa2NudDY0X3QgZl9ibG9ja3M7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iZnJlZTsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2JhdmFpbDsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZpbGVzOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmZyZWU7CisgICAgX19mc2ZpbGNudDY0X3QgZl9mYXZhaWw7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2ZzaWQ7CisjaWZkZWYgX1NUQVRWRlNCVUZfRl9VTlVTRUQKKyAgICBpbnQgX19mX3VudXNlZDsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfZmxhZzsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX25hbWVtYXg7CisgICAgaW50IF9fZl9zcGFyZVs2XTsKKyAgfTsKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitzdHJ1Y3Qgc3RhdHZmczY0CisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2JzaXplOworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfZnJzaXplOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmZyZWU7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iYXZhaWw7CisgICAgX19mc2ZpbGNudDY0X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZmcmVlOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmF2YWlsOworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfZnNpZDsKKyNpZmRlZiBfU1RBVFZGU0JVRl9GX1VOVVNFRAorICAgIGludCBfX2ZfdW51c2VkOworI2VuZGlmCisgICAgdW5zaWduZWQgbG9uZyBpbnQgZl9mbGFnOworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfbmFtZW1heDsKKyAgICBpbnQgX19mX3NwYXJlWzZdOworICB9OworI2VuZGlmCisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgZmxhZyBpbiBgZl9mbGFnJy4gIFRoZXNlIGRlZmluaXRpb25zIHNob3VsZCBiZQorICAga2VwdCBpbiBzeW5jIHdpdGggdGhlIGRlZmluaXRpb25zIGluIDxzeXMvbW91bnQuaD4uICAqLworZW51bQoreworICBTVF9SRE9OTFkgPSAxLAkJLyogTW91bnQgcmVhZC1vbmx5LiAgKi8KKyNkZWZpbmUgU1RfUkRPTkxZCVNUX1JET05MWQorICBTVF9OT1NVSUQgPSAyCQkJLyogSWdub3JlIHN1aWQgYW5kIHNnaWQgYml0cy4gICovCisjZGVmaW5lIFNUX05PU1VJRAlTVF9OT1NVSUQKKyNpZmRlZiBfX1VTRV9HTlUKKyAgLAorICBTVF9OT0RFViA9IDQsCQkJLyogRGlzYWxsb3cgYWNjZXNzIHRvIGRldmljZSBzcGVjaWFsIGZpbGVzLiAgKi8KKyMgZGVmaW5lIFNUX05PREVWCVNUX05PREVWCisgIFNUX05PRVhFQyA9IDgsCQkvKiBEaXNhbGxvdyBwcm9ncmFtIGV4ZWN1dGlvbi4gICovCisjIGRlZmluZSBTVF9OT0VYRUMJU1RfTk9FWEVDCisgIFNUX1NZTkNIUk9OT1VTID0gMTYsCQkvKiBXcml0ZXMgYXJlIHN5bmNlZCBhdCBvbmNlLiAgKi8KKyMgZGVmaW5lIFNUX1NZTkNIUk9OT1VTCVNUX1NZTkNIUk9OT1VTCisgIFNUX01BTkRMT0NLID0gNjQsCQkvKiBBbGxvdyBtYW5kYXRvcnkgbG9ja3Mgb24gYW4gRlMuICAqLworIyBkZWZpbmUgU1RfTUFORExPQ0sJU1RfTUFORExPQ0sKKyAgU1RfV1JJVEUgPSAxMjgsCQkvKiBXcml0ZSBvbiBmaWxlL2RpcmVjdG9yeS9zeW1saW5rLiAgKi8KKyMgZGVmaW5lIFNUX1dSSVRFCVNUX1dSSVRFCisgIFNUX0FQUEVORCA9IDI1NiwJCS8qIEFwcGVuZC1vbmx5IGZpbGUuICAqLworIyBkZWZpbmUgU1RfQVBQRU5ECVNUX0FQUEVORAorICBTVF9JTU1VVEFCTEUgPSA1MTIsCQkvKiBJbW11dGFibGUgZmlsZS4gICovCisjIGRlZmluZSBTVF9JTU1VVEFCTEUJU1RfSU1NVVRBQkxFCisgIFNUX05PQVRJTUUgPSAxMDI0LAkJLyogRG8gbm90IHVwZGF0ZSBhY2Nlc3MgdGltZXMuICAqLworIyBkZWZpbmUgU1RfTk9BVElNRQlTVF9OT0FUSU1FCisgIFNUX05PRElSQVRJTUUgPSAyMDQ4LAkJLyogRG8gbm90IHVwZGF0ZSBkaXJlY3RvcnkgYWNjZXNzIHRpbWVzLiAgKi8KKyMgZGVmaW5lIFNUX05PRElSQVRJTUUJU1RfTk9ESVJBVElNRQorICBTVF9SRUxBVElNRSA9IDQwOTYJCS8qIFVwZGF0ZSBhdGltZSByZWxhdGl2ZSB0byBtdGltZS9jdGltZS4gICovCisjIGRlZmluZSBTVF9SRUxBVElNRQlTVF9SRUxBVElNRQorI2VuZGlmCS8qIFVzZSBHTlUuICAqLworfTsKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRpby1sZGJsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkaW8tbGRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGYxMTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkaW8tbGRibC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBzdGRpbyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NURElPX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RkaW8tbGRibC5oPiBkaXJlY3RseTsgdXNlIDxzdGRpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKK19fTERCTF9SRURJUl9ERUNMIChmcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHByaW50ZikKK19fTERCTF9SRURJUl9ERUNMIChzcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHZmcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHZwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAodnNwcmludGYpCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgIWRlZmluZWQgX19VU0VfR05VIFwKKyAgICAmJiAhZGVmaW5lZCBfX1JFRElSRUNUIFwKKyAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorX19MREJMX1JFRElSMV9ERUNMIChmc2NhbmYsIF9fbmxkYmxfX19pc29jOTlfZnNjYW5mKQorX19MREJMX1JFRElSMV9ERUNMIChzY2FuZiwgX19ubGRibF9fX2lzb2M5OV9zY2FuZikKK19fTERCTF9SRURJUjFfREVDTCAoc3NjYW5mLCBfX25sZGJsX19faXNvYzk5X3NzY2FuZikKKyNlbHNlCitfX0xEQkxfUkVESVJfREVDTCAoZnNjYW5mKQorX19MREJMX1JFRElSX0RFQ0wgKHNjYW5mKQorX19MREJMX1JFRElSX0RFQ0wgKHNzY2FuZikKKyNlbmRpZgorX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorX19MREJMX1JFRElSX0RFQ0wgKHNucHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHZzbnByaW50ZikKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKyMgaWYgIWRlZmluZWQgX19VU0VfR05VICYmICFkZWZpbmVkIF9fUkVESVJFQ1QgXAorICAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorX19MREJMX1JFRElSMV9ERUNMICh2ZnNjYW5mLCBfX25sZGJsX19faXNvYzk5X3Zmc2NhbmYpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHZzY2FuZiwgX19ubGRibF9fX2lzb2M5OV92c2NhbmYpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHZzc2NhbmYsIF9fbmxkYmxfX19pc29jOTlfdnNzY2FuZikKKyMgZWxzZQorX19MREJMX1JFRElSX0RFQ0wgKHZmc2NhbmYpCitfX0xEQkxfUkVESVJfREVDTCAodnNzY2FuZikKK19fTERCTF9SRURJUl9ERUNMICh2c2NhbmYpCisjIGVuZGlmCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorX19MREJMX1JFRElSX0RFQ0wgKHZkcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKGRwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAodmFzcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKF9fYXNwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAoYXNwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAob2JzdGFja19wcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAob2JzdGFja192cHJpbnRmKQorI2VuZGlmCisKKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKK19fTERCTF9SRURJUl9ERUNMIChfX3NwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdnNwcmludGZfY2hrKQorIyBpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OSB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorX19MREJMX1JFRElSX0RFQ0wgKF9fc25wcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdnNucHJpbnRmX2NoaykKKyMgZW5kaWYKKyMgaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEKK19fTERCTF9SRURJUl9ERUNMIChfX2ZwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fcHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3ZmcHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3ZwcmludGZfY2hrKQorIyAgaWZkZWYgX19VU0VfR05VCitfX0xEQkxfUkVESVJfREVDTCAoX19hc3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192YXNwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fZHByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192ZHByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX19vYnN0YWNrX3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX19vYnN0YWNrX3ZwcmludGZfY2hrKQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0ZGlvLWxvY2suaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRpby1sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlZmRkOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRpby1sb2NrLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qIFRocmVhZCBwYWNrYWdlIHNwZWNpZmljIGRlZmluaXRpb25zIG9mIHN0cmVhbSBsb2NrIHR5cGUuICBOUFRMIHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0JJVFNfU1RESU9fTE9DS19ICisjZGVmaW5lIF9CSVRTX1NURElPX0xPQ0tfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgorI2luY2x1ZGUgPGxvd2xldmVsbG9jay5oPgorCisKKy8qIFRoZSBsb2NraW5nIGhlcmUgaXMgdmVyeSBpbmV4cGVuc2l2ZSwgZXZlbiBmb3IgaW5saW5pbmcuICAqLworI2RlZmluZSBfSU9fbG9ja19pbmV4cGVuc2l2ZQkxCisKK3R5cGVkZWYgc3RydWN0IHsgaW50IGxvY2s7IGludCBjbnQ7IHZvaWQgKm93bmVyOyB9IF9JT19sb2NrX3Q7CisKKyNkZWZpbmUgX0lPX2xvY2tfaW5pdGlhbGl6ZXIgeyBMTExfTE9DS19JTklUSUFMSVpFUiwgMCwgTlVMTCB9CisKKyNkZWZpbmUgX0lPX2xvY2tfaW5pdChfbmFtZSkgXAorICAoKF9uYW1lKSA9IChfSU9fbG9ja190KSBfSU9fbG9ja19pbml0aWFsaXplciAsIDApCisKKyNkZWZpbmUgX0lPX2xvY2tfZmluaShfbmFtZSkgXAorICAoKHZvaWQpIDApCisKKyNkZWZpbmUgX0lPX2xvY2tfbG9jayhfbmFtZSkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHZvaWQgKl9fc2VsZiA9IFRIUkVBRF9TRUxGOwkJCQkJCSAgICAgIFwKKyAgICBpZiAoKF9uYW1lKS5vd25lciAhPSBfX3NlbGYpCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCWxsbF9sb2NrICgoX25hbWUpLmxvY2ssIExMTF9QUklWQVRFKTsJCQkJICAgICAgXAorICAgICAgICAoX25hbWUpLm93bmVyID0gX19zZWxmOwkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgKysoX25hbWUpLmNudDsJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9JT19sb2NrX3RyeWxvY2soX25hbWUpIFwKKyAgKHsJCQkJCQkJCQkgICAgICBcCisgICAgaW50IF9fcmVzdWx0ID0gMDsJCQkJCQkJICAgICAgXAorICAgIHZvaWQgKl9fc2VsZiA9IFRIUkVBRF9TRUxGOwkJCQkJCSAgICAgIFwKKyAgICBpZiAoKF9uYW1lKS5vd25lciAhPSBfX3NlbGYpCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgICBpZiAobGxsX3RyeWxvY2sgKChfbmFtZSkubG9jaykgPT0gMCkJCQkJICAgICAgXAorICAgICAgICAgIHsJCQkJCQkJCSAgICAgIFwKKyAgICAgICAgICAgIChfbmFtZSkub3duZXIgPSBfX3NlbGY7CQkJCQkgICAgICBcCisgICAgICAgICAgICAoX25hbWUpLmNudCA9IDE7CQkJCQkJICAgICAgXAorICAgICAgICAgIH0JCQkJCQkJCSAgICAgIFwKKyAgICAgICAgZWxzZQkJCQkJCQkJICAgICAgXAorICAgICAgICAgIF9fcmVzdWx0ID0gRUJVU1k7CQkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgICBlbHNlCQkJCQkJCQkgICAgICBcCisgICAgICArKyhfbmFtZSkuY250OwkJCQkJCQkgICAgICBcCisgICAgX19yZXN1bHQ7CQkJCQkJCQkgICAgICBcCisgIH0pCisKKyNkZWZpbmUgX0lPX2xvY2tfdW5sb2NrKF9uYW1lKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaWYgKC0tKF9uYW1lKS5jbnQgPT0gMCkJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgICAoX25hbWUpLm93bmVyID0gTlVMTDsJCQkJCQkgICAgICBcCisJbGxsX3VubG9jayAoKF9uYW1lKS5sb2NrLCBMTExfUFJJVkFURSk7CQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworCisjZGVmaW5lIF9JT19jbGVhbnVwX3JlZ2lvbl9zdGFydChfZmN0LCBfZnApIFwKKyAgX19saWJjX2NsZWFudXBfcmVnaW9uX3N0YXJ0ICgoKF9mcCktPl9mbGFncyAmIF9JT19VU0VSX0xPQ0spID09IDAsIF9mY3QsIF9mcCkKKyNkZWZpbmUgX0lPX2NsZWFudXBfcmVnaW9uX3N0YXJ0X25vYXJnKF9mY3QpIFwKKyAgX19saWJjX2NsZWFudXBfcmVnaW9uX3N0YXJ0ICgxLCBfZmN0LCBOVUxMKQorI2RlZmluZSBfSU9fY2xlYW51cF9yZWdpb25fZW5kKF9kb2l0KSBcCisgIF9fbGliY19jbGVhbnVwX3JlZ2lvbl9lbmQgKF9kb2l0KQorCisjaWYgZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBOT1RfSU5fbGliYworCisjIGlmZGVmIF9fRVhDRVBUSU9OUworIyAgZGVmaW5lIF9JT19hY3F1aXJlX2xvY2soX2ZwKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgX0lPX0ZJTEUgKl9JT19hY3F1aXJlX2xvY2tfZmlsZQkJCQkJICAgICAgXAorCV9fYXR0cmlidXRlX18oKGNsZWFudXAgKF9JT19hY3F1aXJlX2xvY2tfZmN0KSkpCQkJICAgICAgXAorCT0gKF9mcCk7CQkJCQkJCSAgICAgIFwKKyAgICBfSU9fZmxvY2tmaWxlIChfSU9fYWNxdWlyZV9sb2NrX2ZpbGUpOworIyAgZGVmaW5lIF9JT19hY3F1aXJlX2xvY2tfY2xlYXJfZmxhZ3MyKF9mcCkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIF9JT19GSUxFICpfSU9fYWNxdWlyZV9sb2NrX2ZpbGUJCQkJCSAgICAgIFwKKwlfX2F0dHJpYnV0ZV9fKChjbGVhbnVwIChfSU9fYWNxdWlyZV9sb2NrX2NsZWFyX2ZsYWdzMl9mY3QpKSkJICAgICAgXAorCT0gKF9mcCk7CQkJCQkJCSAgICAgIFwKKyAgICBfSU9fZmxvY2tmaWxlIChfSU9fYWNxdWlyZV9sb2NrX2ZpbGUpOworIyBlbHNlCisjICBkZWZpbmUgX0lPX2FjcXVpcmVfbG9jayhfZnApIF9JT19hY3F1aXJlX2xvY2tfbmVlZHNfZXhjZXB0aW9uc19lbmFibGVkCisjICBkZWZpbmUgX0lPX2FjcXVpcmVfbG9ja19jbGVhcl9mbGFnczIoX2ZwKSBfSU9fYWNxdWlyZV9sb2NrIChfZnApCisjIGVuZGlmCisjIGRlZmluZSBfSU9fcmVsZWFzZV9sb2NrKF9mcCkgOyB9IHdoaWxlICgwKQorCisjZW5kaWYKKworI2VuZGlmIC8qIGJpdHMvc3RkaW8tbG9jay5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkaW8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MzAzYzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkaW8uaApAQCAtMCwwICsxLDE5MSBAQAorLyogT3B0aW1pemluZyBtYWNyb3MgYW5kIGlubGluZSBmdW5jdGlvbnMgZm9yIHN0ZGlvIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMjAwMCwgMjAwMSwgMjAwNCwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RESU9fSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGRpby5oPiBkaXJlY3RseTsgdXNlIDxzdGRpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fZXh0ZXJuX2lubGluZQorIyBkZWZpbmUgX19TVERJT19JTkxJTkUgaW5saW5lCisjZWxzZQorIyBkZWZpbmUgX19TVERJT19JTkxJTkUgX19leHRlcm5faW5saW5lCisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKKy8qIEZvciAtRF9GT1JUSUZZX1NPVVJDRXssPTJ9IGJpdHMvc3RkaW8yLmggd2lsbCBkZWZpbmUgYSBkaWZmZXJlbnQKKyAgIGlubGluZS4gICovCisjIGlmICEoX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lKQorLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBzdGRvdXQgZnJvbSBhcmd1bWVudCBsaXN0IEFSRy4gICovCitfX1NURElPX0lOTElORSBpbnQKK3ZwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FyZykKK3sKKyAgcmV0dXJuIHZmcHJpbnRmIChzdGRvdXQsIF9fZm10LCBfX2FyZyk7Cit9CisjIGVuZGlmCisKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSBzdGRpbi4gICovCitfX1NURElPX0lOTElORSBpbnQKK2dldGNoYXIgKHZvaWQpCit7CisgIHJldHVybiBfSU9fZ2V0YyAoc3RkaW4pOworfQorCisKKyMgaWZkZWYgX19VU0VfTUlTQworLyogRmFzdGVyIHZlcnNpb24gd2hlbiBsb2NraW5nIGlzIG5vdCBuZWNlc3NhcnkuICAqLworX19TVERJT19JTkxJTkUgaW50CitmZ2V0Y191bmxvY2tlZCAoRklMRSAqX19mcCkKK3sKKyAgcmV0dXJuIF9JT19nZXRjX3VubG9ja2VkIChfX2ZwKTsKK30KKyMgZW5kaWYgLyogbWlzYyAqLworCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKy8qIFRoaXMgaXMgZGVmaW5lZCBpbiBQT1NJWC4xOjE5OTYuICAqLworX19TVERJT19JTkxJTkUgaW50CitnZXRjX3VubG9ja2VkIChGSUxFICpfX2ZwKQoreworICByZXR1cm4gX0lPX2dldGNfdW5sb2NrZWQgKF9fZnApOworfQorCisvKiBUaGlzIGlzIGRlZmluZWQgaW4gUE9TSVguMToxOTk2LiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorZ2V0Y2hhcl91bmxvY2tlZCAodm9pZCkKK3sKKyAgcmV0dXJuIF9JT19nZXRjX3VubG9ja2VkIChzdGRpbik7Cit9CisjIGVuZGlmCS8qIFBPU0lYIHx8IG1pc2MgKi8KKworCisvKiBXcml0ZSBhIGNoYXJhY3RlciB0byBzdGRvdXQuICAqLworX19TVERJT19JTkxJTkUgaW50CitwdXRjaGFyIChpbnQgX19jKQoreworICByZXR1cm4gX0lPX3B1dGMgKF9fYywgc3Rkb3V0KTsKK30KKworCisjIGlmZGVmIF9fVVNFX01JU0MKKy8qIEZhc3RlciB2ZXJzaW9uIHdoZW4gbG9ja2luZyBpcyBub3QgbmVjZXNzYXJ5LiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorZnB1dGNfdW5sb2NrZWQgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKQoreworICByZXR1cm4gX0lPX3B1dGNfdW5sb2NrZWQgKF9fYywgX19zdHJlYW0pOworfQorIyBlbmRpZiAvKiBtaXNjICovCisKKworIyBpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworLyogVGhpcyBpcyBkZWZpbmVkIGluIFBPU0lYLjE6MTk5Ni4gICovCitfX1NURElPX0lOTElORSBpbnQKK3B1dGNfdW5sb2NrZWQgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKQoreworICByZXR1cm4gX0lPX3B1dGNfdW5sb2NrZWQgKF9fYywgX19zdHJlYW0pOworfQorCisvKiBUaGlzIGlzIGRlZmluZWQgaW4gUE9TSVguMToxOTk2LiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorcHV0Y2hhcl91bmxvY2tlZCAoaW50IF9fYykKK3sKKyAgcmV0dXJuIF9JT19wdXRjX3VubG9ja2VkIChfX2MsIHN0ZG91dCk7Cit9CisjIGVuZGlmCS8qIFBPU0lYIHx8IG1pc2MgKi8KKworCisjIGlmZGVmCV9fVVNFX0dOVQorLyogTGlrZSBgZ2V0ZGVsaW0nLCBidXQgcmVhZHMgdXAgdG8gYSBuZXdsaW5lLiAgKi8KK19fU1RESU9fSU5MSU5FIF9JT19zc2l6ZV90CitnZXRsaW5lIChjaGFyICoqX19saW5lcHRyLCBzaXplX3QgKl9fbiwgRklMRSAqX19zdHJlYW0pCit7CisgIHJldHVybiBfX2dldGRlbGltIChfX2xpbmVwdHIsIF9fbiwgJ1xuJywgX19zdHJlYW0pOworfQorIyBlbmRpZiAvKiBHTlUgKi8KKworCisjIGlmZGVmIF9fVVNFX01JU0MKKy8qIEZhc3RlciB2ZXJzaW9ucyB3aGVuIGxvY2tpbmcgaXMgbm90IHJlcXVpcmVkLiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorX19OVEggKGZlb2ZfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSkKK3sKKyAgcmV0dXJuIF9JT19mZW9mX3VubG9ja2VkIChfX3N0cmVhbSk7Cit9CisKKy8qIEZhc3RlciB2ZXJzaW9ucyB3aGVuIGxvY2tpbmcgaXMgbm90IHJlcXVpcmVkLiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorX19OVEggKGZlcnJvcl91bmxvY2tlZCAoRklMRSAqX19zdHJlYW0pKQoreworICByZXR1cm4gX0lPX2ZlcnJvcl91bmxvY2tlZCAoX19zdHJlYW0pOworfQorIyBlbmRpZiAvKiBtaXNjICovCisKKyNlbmRpZiAvKiBVc2UgZXh0ZXJuIGlubGluZXMuICAqLworCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgJiYgZGVmaW5lZCBfX0dOVUNfXyAmJiBkZWZpbmVkIF9fT1BUSU1JWkVfXyBcCisgICAgJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKKy8qIFBlcmZvcm0gc29tZSBzaW1wbGUgb3B0aW1pemF0aW9ucy4gICovCisjIGRlZmluZSBmcmVhZF91bmxvY2tlZChwdHIsIHNpemUsIG4sIHN0cmVhbSkgXAorICAoX19leHRlbnNpb25fXyAoKF9fYnVpbHRpbl9jb25zdGFudF9wIChzaXplKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgICAgXAorCQkgICAmJiAoc2l6ZV90KSAoc2l6ZSkgKiAoc2l6ZV90KSAobikgPD0gOAkJICAgICAgXAorCQkgICAmJiAoc2l6ZV90KSAoc2l6ZSkgIT0gMCkJCQkJICAgICAgXAorCQkgID8gKHsgY2hhciAqX19wdHIgPSAoY2hhciAqKSAocHRyKTsJCQkgICAgICBcCisJCSAgICAgICBGSUxFICpfX3N0cmVhbSA9IChzdHJlYW0pOwkJCSAgICAgIFwKKwkJICAgICAgIHNpemVfdCBfX2NudDsJCQkJCSAgICAgIFwKKwkJICAgICAgIGZvciAoX19jbnQgPSAoc2l6ZV90KSAoc2l6ZSkgKiAoc2l6ZV90KSAobik7CSAgICAgIFwKKwkJCSAgICBfX2NudCA+IDA7IC0tX19jbnQpCQkJCSAgICAgIFwKKwkJCSB7CQkJCQkJICAgICAgXAorCQkJICAgaW50IF9fYyA9IF9JT19nZXRjX3VubG9ja2VkIChfX3N0cmVhbSk7CSAgICAgIFwKKwkJCSAgIGlmIChfX2MgPT0gRU9GKQkJCQkgICAgICBcCisJCQkgICAgIGJyZWFrOwkJCQkJICAgICAgXAorCQkJICAgKl9fcHRyKysgPSBfX2M7CQkJCSAgICAgIFwKKwkJCSB9CQkJCQkJICAgICAgXAorCQkgICAgICAgKChzaXplX3QpIChzaXplKSAqIChzaXplX3QpIChuKSAtIF9fY250KQkJICAgICAgXAorCQkJLyAoc2l6ZV90KSAoc2l6ZSk7IH0pCQkJCSAgICAgIFwKKwkJICA6ICgoKF9fYnVpbHRpbl9jb25zdGFudF9wIChzaXplKSAmJiAoc2l6ZV90KSAoc2l6ZSkgPT0gMCkgICBcCisJCSAgICAgIHx8IChfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgJiYgKHNpemVfdCkgKG4pID09IDApKSAgICAgXAorCQkJLyogRXZhbHVhdGUgYWxsIHBhcmFtZXRlcnMgb25jZS4gICovCQkgICAgICBcCisJCSAgICAgPyAoKHZvaWQpIChwdHIpLCAodm9pZCkgKHN0cmVhbSksICh2b2lkKSAoc2l6ZSksCSAgICAgIFwKKwkJCSh2b2lkKSAobiksIChzaXplX3QpIDApCQkJCSAgICAgIFwKKwkJICAgICA6IGZyZWFkX3VubG9ja2VkIChwdHIsIHNpemUsIG4sIHN0cmVhbSkpKSkKKworIyBkZWZpbmUgZndyaXRlX3VubG9ja2VkKHB0ciwgc2l6ZSwgbiwgc3RyZWFtKSBcCisgIChfX2V4dGVuc2lvbl9fICgoX19idWlsdGluX2NvbnN0YW50X3AgKHNpemUpICYmIF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAgICBcCisJCSAgICYmIChzaXplX3QpIChzaXplKSAqIChzaXplX3QpIChuKSA8PSA4CQkgICAgICBcCisJCSAgICYmIChzaXplX3QpIChzaXplKSAhPSAwKQkJCQkgICAgICBcCisJCSAgPyAoeyBjb25zdCBjaGFyICpfX3B0ciA9IChjb25zdCBjaGFyICopIChwdHIpOwkgICAgICBcCisJCSAgICAgICBGSUxFICpfX3N0cmVhbSA9IChzdHJlYW0pOwkJCSAgICAgIFwKKwkJICAgICAgIHNpemVfdCBfX2NudDsJCQkJCSAgICAgIFwKKwkJICAgICAgIGZvciAoX19jbnQgPSAoc2l6ZV90KSAoc2l6ZSkgKiAoc2l6ZV90KSAobik7CSAgICAgIFwKKwkJCSAgICBfX2NudCA+IDA7IC0tX19jbnQpCQkJCSAgICAgIFwKKwkJCSBpZiAoX0lPX3B1dGNfdW5sb2NrZWQgKCpfX3B0cisrLCBfX3N0cmVhbSkgPT0gRU9GKSAgIFwKKwkJCSAgIGJyZWFrOwkJCQkJICAgICAgXAorCQkgICAgICAgKChzaXplX3QpIChzaXplKSAqIChzaXplX3QpIChuKSAtIF9fY250KQkJICAgICAgXAorCQkJLyAoc2l6ZV90KSAoc2l6ZSk7IH0pCQkJCSAgICAgIFwKKwkJICA6ICgoKF9fYnVpbHRpbl9jb25zdGFudF9wIChzaXplKSAmJiAoc2l6ZV90KSAoc2l6ZSkgPT0gMCkgICBcCisJCSAgICAgIHx8IChfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgJiYgKHNpemVfdCkgKG4pID09IDApKSAgICAgXAorCQkJLyogRXZhbHVhdGUgYWxsIHBhcmFtZXRlcnMgb25jZS4gICovCQkgICAgICBcCisJCSAgICAgPyAoKHZvaWQpIChwdHIpLCAodm9pZCkgKHN0cmVhbSksICh2b2lkKSAoc2l6ZSksCSAgICAgIFwKKwkJCSh2b2lkKSAobiksIChzaXplX3QpIDApCQkJCSAgICAgIFwKKwkJICAgICA6IGZ3cml0ZV91bmxvY2tlZCAocHRyLCBzaXplLCBuLCBzdHJlYW0pKSkpCisjZW5kaWYKKworLyogRGVmaW5lIGhlbHBlciBtYWNyby4gICovCisjdW5kZWYgX19TVERJT19JTkxJTkUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRpbzIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRpbzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzI1YWFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0ZGlvMi5oCkBAIC0wLDAgKzEsMzc0IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHN0ZGlvIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RESU9fSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGRpbzIuaD4gZGlyZWN0bHk7IHVzZSA8c3RkaW8uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworZXh0ZXJuIGludCBfX3NwcmludGZfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fZmxhZywgc2l6ZV90IF9fc2xlbiwKKwkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIF9fVEhST1c7CitleHRlcm4gaW50IF9fdnNwcmludGZfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fZmxhZywgc2l6ZV90IF9fc2xlbiwKKwkJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgIF9HX3ZhX2xpc3QgX19hcCkgX19USFJPVzsKKworI2lmZGVmIF9fdmFfYXJnX3BhY2sKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAoc3ByaW50ZiAoY2hhciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3NwcmludGZfY2hrIChfX3MsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLAorCQkJCSAgX19ib3MgKF9fcyksIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyNlbGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjIGRlZmluZSBzcHJpbnRmKHN0ciwgLi4uKSBcCisgIF9fYnVpbHRpbl9fX3NwcmludGZfY2hrIChzdHIsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2JvcyAoc3RyKSwgXAorCQkJICAgX19WQV9BUkdTX18pCisjZW5kaWYKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIICh2c3ByaW50ZiAoY2hhciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwKKwkJIF9HX3ZhX2xpc3QgX19hcCkpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX192c3ByaW50Zl9jaGsgKF9fcywgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsCisJCQkJICAgX19ib3MgKF9fcyksIF9fZm10LCBfX2FwKTsKK30KKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CisKK2V4dGVybiBpbnQgX19zbnByaW50Zl9jaGsgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLCBpbnQgX19mbGFnLAorCQkJICAgc2l6ZV90IF9fc2xlbiwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgLi4uKSBfX1RIUk9XOworZXh0ZXJuIGludCBfX3ZzbnByaW50Zl9jaGsgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLCBpbnQgX19mbGFnLAorCQkJICAgIHNpemVfdCBfX3NsZW4sIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgICBfR192YV9saXN0IF9fYXApIF9fVEhST1c7CisKKyMgaWZkZWYgX192YV9hcmdfcGFjaworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChzbnByaW50ZiAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zbnByaW50Zl9jaGsgKF9fcywgX19uLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwKKwkJCQkgICBfX2JvcyAoX19zKSwgX19mbXQsIF9fdmFfYXJnX3BhY2sgKCkpOworfQorIyBlbGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgc25wcmludGYoc3RyLCBsZW4sIC4uLikgXAorICBfX2J1aWx0aW5fX19zbnByaW50Zl9jaGsgKHN0ciwgbGVuLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19ib3MgKHN0ciksIFwKKwkJCSAgICBfX1ZBX0FSR1NfXykKKyMgZW5kaWYKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIICh2c25wcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FwKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3ZzbnByaW50Zl9jaGsgKF9fcywgX19uLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwKKwkJCQkgICAgX19ib3MgKF9fcyksIF9fZm10LCBfX2FwKTsKK30KKworI2VuZGlmCisKKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMQorCitleHRlcm4gaW50IF9fZnByaW50Zl9jaGsgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGludCBfX2ZsYWcsCisJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKTsKK2V4dGVybiBpbnQgX19wcmludGZfY2hrIChpbnQgX19mbGFnLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLik7CitleHRlcm4gaW50IF9fdmZwcmludGZfY2hrIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBpbnQgX19mbGFnLAorCQkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCBfR192YV9saXN0IF9fYXApOworZXh0ZXJuIGludCBfX3ZwcmludGZfY2hrIChpbnQgX19mbGFnLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgIF9HX3ZhX2xpc3QgX19hcCk7CisKKyMgaWZkZWYgX192YV9hcmdfcGFjaworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK2ZwcmludGYgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQoreworICByZXR1cm4gX19mcHJpbnRmX2NoayAoX19zdHJlYW0sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwKKwkJCV9fdmFfYXJnX3BhY2sgKCkpOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorcHJpbnRmIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKK3sKKyAgcmV0dXJuIF9fcHJpbnRmX2NoayAoX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyMgZWxpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgZGVmaW5lIHByaW50ZiguLi4pIFwKKyAgX19wcmludGZfY2hrIChfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19WQV9BUkdTX18pCisjICBkZWZpbmUgZnByaW50ZihzdHJlYW0sIC4uLikgXAorICBfX2ZwcmludGZfY2hrIChzdHJlYW0sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX1ZBX0FSR1NfXykKKyMgZW5kaWYKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3ZwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FwKQoreworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisgIHJldHVybiBfX3ZmcHJpbnRmX2NoayAoc3Rkb3V0LCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsIF9fYXApOworI2Vsc2UKKyAgcmV0dXJuIF9fdnByaW50Zl9jaGsgKF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX19hcCk7CisjZW5kaWYKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3ZmcHJpbnRmIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBfR192YV9saXN0IF9fYXApCit7CisgIHJldHVybiBfX3ZmcHJpbnRmX2NoayAoX19zdHJlYW0sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX19hcCk7Cit9CisKKyMgaWZkZWYgX19VU0VfR05VCisKK2V4dGVybiBpbnQgX19hc3ByaW50Zl9jaGsgKGNoYXIgKipfX3Jlc3RyaWN0IF9fcHRyLCBpbnQgX19mbGFnLAorCQkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSkgX193dXI7CitleHRlcm4gaW50IF9fdmFzcHJpbnRmX2NoayAoY2hhciAqKl9fcmVzdHJpY3QgX19wdHIsIGludCBfX2ZsYWcsCisJCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBfR192YV9saXN0IF9fYXJnKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpIF9fd3VyOworZXh0ZXJuIGludCBfX2RwcmludGZfY2hrIChpbnQgX19mZCwgaW50IF9fZmxhZywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LAorCQkJICAuLi4pIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOworZXh0ZXJuIGludCBfX3ZkcHJpbnRmX2NoayAoaW50IF9fZmQsIGludCBfX2ZsYWcsCisJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIF9HX3ZhX2xpc3QgX19hcmcpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpOworZXh0ZXJuIGludCBfX29ic3RhY2tfcHJpbnRmX2NoayAoc3RydWN0IG9ic3RhY2sgKl9fcmVzdHJpY3QgX19vYnN0YWNrLAorCQkJCSBpbnQgX19mbGFnLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkJIC4uLikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKK2V4dGVybiBpbnQgX19vYnN0YWNrX3ZwcmludGZfY2hrIChzdHJ1Y3Qgb2JzdGFjayAqX19yZXN0cmljdCBfX29ic3RhY2ssCisJCQkJICBpbnQgX19mbGFnLAorCQkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJCSAgX0dfdmFfbGlzdCBfX2FyZ3MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDApKSk7CisKKyMgIGlmZGVmIF9fdmFfYXJnX3BhY2sKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAoYXNwcmludGYgKGNoYXIgKipfX3Jlc3RyaWN0IF9fcHRyLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikpCit7CisgIHJldHVybiBfX2FzcHJpbnRmX2NoayAoX19wdHIsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwKKwkJCSBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChfX2FzcHJpbnRmIChjaGFyICoqX19yZXN0cmljdCBfX3B0ciwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LAorCQkgICAuLi4pKQoreworICByZXR1cm4gX19hc3ByaW50Zl9jaGsgKF9fcHRyLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsCisJCQkgX192YV9hcmdfcGFjayAoKSk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitkcHJpbnRmIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCit7CisgIHJldHVybiBfX2RwcmludGZfY2hrIChfX2ZkLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsCisJCQlfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChvYnN0YWNrX3ByaW50ZiAoc3RydWN0IG9ic3RhY2sgKl9fcmVzdHJpY3QgX19vYnN0YWNrLAorCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pKQoreworICByZXR1cm4gX19vYnN0YWNrX3ByaW50Zl9jaGsgKF9fb2JzdGFjaywgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LAorCQkJICAgICAgIF9fdmFfYXJnX3BhY2sgKCkpOworfQorIyAgZWxpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBhc3ByaW50ZihwdHIsIC4uLikgXAorICBfX2FzcHJpbnRmX2NoayAocHRyLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19WQV9BUkdTX18pCisjICAgZGVmaW5lIF9fYXNwcmludGYocHRyLCAuLi4pIFwKKyAgX19hc3ByaW50Zl9jaGsgKHB0ciwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyAgIGRlZmluZSBkcHJpbnRmKGZkLCAuLi4pIFwKKyAgX19kcHJpbnRmX2NoayAoZmQsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX1ZBX0FSR1NfXykKKyMgICBkZWZpbmUgb2JzdGFja19wcmludGYob2JzdGFjaywgLi4uKSBcCisgIF9fb2JzdGFja19wcmludGZfY2hrIChvYnN0YWNrLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19WQV9BUkdTX18pCisjICBlbmRpZgorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHZhc3ByaW50ZiAoY2hhciAqKl9fcmVzdHJpY3QgX19wdHIsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwKKwkJICBfR192YV9saXN0IF9fYXApKQoreworICByZXR1cm4gX192YXNwcmludGZfY2hrIChfX3B0ciwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3ZkcHJpbnRmIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBfR192YV9saXN0IF9fYXApCit7CisgIHJldHVybiBfX3ZkcHJpbnRmX2NoayAoX19mZCwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChvYnN0YWNrX3ZwcmludGYgKHN0cnVjdCBvYnN0YWNrICpfX3Jlc3RyaWN0IF9fb2JzdGFjaywKKwkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FwKSkKK3sKKyAgcmV0dXJuIF9fb2JzdGFja192cHJpbnRmX2NoayAoX19vYnN0YWNrLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsCisJCQkJX19hcCk7Cit9CisKKyMgZW5kaWYKKworI2VuZGlmCisKK2V4dGVybiBjaGFyICpfX2dldHNfY2hrIChjaGFyICpfX3N0ciwgc2l6ZV90KSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUIChfX2dldHNfd2FybiwgKGNoYXIgKl9fc3RyKSwgZ2V0cykKKyAgICAgX193dXIgX193YXJuYXR0ciAoInBsZWFzZSB1c2UgZmdldHMgb3IgZ2V0bGluZSBpbnN0ZWFkLCBnZXRzIGNhbid0ICIKKwkJICAgICAgICJzcGVjaWZ5IGJ1ZmZlciBzaXplIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgY2hhciAqCitnZXRzIChjaGFyICpfX3N0cikKK3sKKyAgaWYgKF9fYm9zIChfX3N0cikgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fZ2V0c19jaGsgKF9fc3RyLCBfX2JvcyAoX19zdHIpKTsKKyAgcmV0dXJuIF9fZ2V0c193YXJuIChfX3N0cik7Cit9CisKK2V4dGVybiBjaGFyICpfX2ZnZXRzX2NoayAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX3NpemUsIGludCBfX24sCisJCQkgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1QgKF9fZmdldHNfYWxpYXMsCisJCQkgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLAorCQkJICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwgZmdldHMpIF9fd3VyOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1QgKF9fZmdldHNfY2hrX3dhcm4sCisJCQkgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19zaXplLCBpbnQgX19uLAorCQkJICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwgX19mZ2V0c19jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJmZ2V0cyBjYWxsZWQgd2l0aCBiaWdnZXIgc2l6ZSB0aGFuIGxlbmd0aCAiCisJCSAgICAgICAib2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgY2hhciAqCitmZ2V0cyAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pCit7CisgIGlmIChfX2JvcyAoX19zKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pIHx8IF9fbiA8PSAwKQorCXJldHVybiBfX2ZnZXRzX2NoayAoX19zLCBfX2JvcyAoX19zKSwgX19uLCBfX3N0cmVhbSk7CisKKyAgICAgIGlmICgoc2l6ZV90KSBfX24gPiBfX2JvcyAoX19zKSkKKwlyZXR1cm4gX19mZ2V0c19jaGtfd2FybiAoX19zLCBfX2JvcyAoX19zKSwgX19uLCBfX3N0cmVhbSk7CisgICAgfQorICByZXR1cm4gX19mZ2V0c19hbGlhcyAoX19zLCBfX24sIF9fc3RyZWFtKTsKK30KKworZXh0ZXJuIHNpemVfdCBfX2ZyZWFkX2NoayAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fcHRybGVuLAorCQkJICAgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwKKwkJCSAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUIChfX2ZyZWFkX2FsaWFzLAorCQkJICAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKKwkJCSAgIHNpemVfdCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLAorCQkJICBmcmVhZCkgX193dXI7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1QgKF9fZnJlYWRfY2hrX3dhcm4sCisJCQkgICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19wdHJsZW4sCisJCQkgICBzaXplX3QgX19zaXplLCBzaXplX3QgX19uLAorCQkJICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksCisJCQkgIF9fZnJlYWRfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZnJlYWQgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgKiBubWVtYiB0aGFuIGxlbmd0aCAiCisJCSAgICAgICAib2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgc2l6ZV90CitmcmVhZCAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwKKyAgICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MwIChfX3B0cikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zaXplKQorCSAgfHwgIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pCisJICB8fCAoX19zaXplIHwgX19uKSA+PSAoKChzaXplX3QpIDEpIDw8ICg4ICogc2l6ZW9mIChzaXplX3QpIC8gMikpKQorCXJldHVybiBfX2ZyZWFkX2NoayAoX19wdHIsIF9fYm9zMCAoX19wdHIpLCBfX3NpemUsIF9fbiwgX19zdHJlYW0pOworCisgICAgICBpZiAoX19zaXplICogX19uID4gX19ib3MwIChfX3B0cikpCisJcmV0dXJuIF9fZnJlYWRfY2hrX3dhcm4gKF9fcHRyLCBfX2JvczAgKF9fcHRyKSwgX19zaXplLCBfX24sIF9fc3RyZWFtKTsKKyAgICB9CisgIHJldHVybiBfX2ZyZWFkX2FsaWFzIChfX3B0ciwgX19zaXplLCBfX24sIF9fc3RyZWFtKTsKK30KKworI2lmZGVmIF9fVVNFX0dOVQorZXh0ZXJuIGNoYXIgKl9fZmdldHNfdW5sb2NrZWRfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwKKwkJCQkgICBpbnQgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUIChfX2ZnZXRzX3VubG9ja2VkX2FsaWFzLAorCQkJIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwKKwkJCSAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIGZnZXRzX3VubG9ja2VkKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUIChfX2ZnZXRzX3VubG9ja2VkX2Noa193YXJuLAorCQkJIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIF9fZmdldHNfdW5sb2NrZWRfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZmdldHNfdW5sb2NrZWQgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgdGhhbiBsZW5ndGggIgorCQkgICAgICAgIm9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGNoYXIgKgorZmdldHNfdW5sb2NrZWQgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSB8fCBfX24gPD0gMCkKKwlyZXR1cm4gX19mZ2V0c191bmxvY2tlZF9jaGsgKF9fcywgX19ib3MgKF9fcyksIF9fbiwgX19zdHJlYW0pOworCisgICAgICBpZiAoKHNpemVfdCkgX19uID4gX19ib3MgKF9fcykpCisJcmV0dXJuIF9fZmdldHNfdW5sb2NrZWRfY2hrX3dhcm4gKF9fcywgX19ib3MgKF9fcyksIF9fbiwgX19zdHJlYW0pOworICAgIH0KKyAgcmV0dXJuIF9fZmdldHNfdW5sb2NrZWRfYWxpYXMgKF9fcywgX19uLCBfX3N0cmVhbSk7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX01JU0MKKyMgdW5kZWYgZnJlYWRfdW5sb2NrZWQKK2V4dGVybiBzaXplX3QgX19mcmVhZF91bmxvY2tlZF9jaGsgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3B0cmxlbiwKKwkJCQkgICAgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwKKwkJCQkgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1QgKF9fZnJlYWRfdW5sb2NrZWRfYWxpYXMsCisJCQkgICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXplLAorCQkJICAgc2l6ZV90IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksCisJCQkgIGZyZWFkX3VubG9ja2VkKSBfX3d1cjsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVCAoX19mcmVhZF91bmxvY2tlZF9jaGtfd2FybiwKKwkJCSAgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3B0cmxlbiwKKwkJCSAgIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX24sCisJCQkgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwKKwkJCSAgX19mcmVhZF91bmxvY2tlZF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJmcmVhZF91bmxvY2tlZCBjYWxsZWQgd2l0aCBiaWdnZXIgc2l6ZSAqIG5tZW1iIHRoYW4gIgorCQkgICAgICAgImxlbmd0aCBvZiBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBzaXplX3QKK2ZyZWFkX3VubG9ja2VkICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXplLCBzaXplX3QgX19uLAorCQlGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MwIChfX3B0cikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zaXplKQorCSAgfHwgIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pCisJICB8fCAoX19zaXplIHwgX19uKSA+PSAoKChzaXplX3QpIDEpIDw8ICg4ICogc2l6ZW9mIChzaXplX3QpIC8gMikpKQorCXJldHVybiBfX2ZyZWFkX3VubG9ja2VkX2NoayAoX19wdHIsIF9fYm9zMCAoX19wdHIpLCBfX3NpemUsIF9fbiwKKwkJCQkgICAgIF9fc3RyZWFtKTsKKworICAgICAgaWYgKF9fc2l6ZSAqIF9fbiA+IF9fYm9zMCAoX19wdHIpKQorCXJldHVybiBfX2ZyZWFkX3VubG9ja2VkX2Noa193YXJuIChfX3B0ciwgX19ib3MwIChfX3B0ciksIF9fc2l6ZSwgX19uLAorCQkJCQkgIF9fc3RyZWFtKTsKKyAgICB9CisKKyMgaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX3NpemUpCisgICAgICAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKQorICAgICAgJiYgKF9fc2l6ZSB8IF9fbikgPCAoKChzaXplX3QpIDEpIDw8ICg4ICogc2l6ZW9mIChzaXplX3QpIC8gMikpCisgICAgICAmJiBfX3NpemUgKiBfX24gPD0gOCkKKyAgICB7CisgICAgICBzaXplX3QgX19jbnQgPSBfX3NpemUgKiBfX247CisgICAgICBjaGFyICpfX2NwdHIgPSAoY2hhciAqKSBfX3B0cjsKKyAgICAgIGlmIChfX2NudCA9PSAwKQorCXJldHVybiAwOworCisgICAgICBmb3IgKDsgX19jbnQgPiAwOyAtLV9fY250KQorCXsKKwkgIGludCBfX2MgPSBfSU9fZ2V0Y191bmxvY2tlZCAoX19zdHJlYW0pOworCSAgaWYgKF9fYyA9PSBFT0YpCisJICAgIGJyZWFrOworCSAgKl9fY3B0cisrID0gX19jOworCX0KKyAgICAgIHJldHVybiAoX19jcHRyIC0gKGNoYXIgKikgX19wdHIpIC8gX19zaXplOworICAgIH0KKyMgZW5kaWYKKyAgcmV0dXJuIF9fZnJlYWRfdW5sb2NrZWRfYWxpYXMgKF9fcHRyLCBfX3NpemUsIF9fbiwgX19zdHJlYW0pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkaW9fbGltLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkaW9fbGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlZjZiNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRpb19saW0uaApAQCAtMCwwICsxLDQzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfU1RESU9fSCAmJiAhZGVmaW5lZCBfX25lZWRfRk9QRU5fTUFYICYmICFkZWZpbmVkIF9fbmVlZF9JT1ZfTUFYCisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0ZGlvX2xpbS5oPiBkaXJlY3RseTsgdXNlIDxzdGRpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZkZWYgX1NURElPX0gKKyMgZGVmaW5lIExfdG1wbmFtIDIwCisjIGRlZmluZSBUTVBfTUFYIDIzODMyOAorIyBkZWZpbmUgRklMRU5BTUVfTUFYIDQwOTYKKworIyBpZmRlZiBfX1VTRV9QT1NJWAorIyAgZGVmaW5lIExfY3Rlcm1pZCA5CisjICBpZiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLIHx8IGRlZmluZWQgX19VU0VfR05VCisjICAgZGVmaW5lIExfY3VzZXJpZCA5CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fbmVlZF9GT1BFTl9NQVggfHwgZGVmaW5lZCBfU1RESU9fSAorIyB1bmRlZiAgRk9QRU5fTUFYCisjIGRlZmluZSBGT1BFTl9NQVggMTYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX25lZWRfSU9WX01BWCAmJiAhZGVmaW5lZCBJT1ZfTUFYCisjIGRlZmluZSBJT1ZfTUFYIDEwMjQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0ZGxpYi1sZGJsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkbGliLWxkYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDhlMWY3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0ZGxpYi1sZGJsLmgKQEAgLTAsMCArMSw0MiBAQAorLyogLW1sb25nLWRvdWJsZS02NCBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIDxzdGRsaWIuaD4gZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVERMSUJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGRsaWItbGRibC5oPiBkaXJlY3RseTsgdXNlIDxzdGRsaWIuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmZGVmCV9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CitfX0xEQkxfUkVESVIxX0RFQ0wgKHN0cnRvbGQsIHN0cnRvZCkKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCitfX0xEQkxfUkVESVIxX0RFQ0wgKHN0cnRvbGRfbCwgc3RydG9kX2wpCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisjIGlmZGVmIF9fVVNFX01JU0MKK19fTERCTF9SRURJUjFfREVDTCAocWVjdnQsIGVjdnQpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHFmY3Z0LCBmY3Z0KQorX19MREJMX1JFRElSMV9ERUNMIChxZ2N2dCwgZ2N2dCkKK19fTERCTF9SRURJUjFfREVDTCAocWVjdnRfciwgZWN2dF9yKQorX19MREJMX1JFRElSMV9ERUNMIChxZmN2dF9yLCBmY3Z0X3IpCisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRsaWIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmFmNWU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0ZGxpYi5oCkBAIC0wLDAgKzEsMTU2IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHN0ZGxpYiBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NURExJQl9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0ZGxpYi5oPiBkaXJlY3RseTsgdXNlIDxzdGRsaWIuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworZXh0ZXJuIGNoYXIgKl9fcmVhbHBhdGhfY2hrIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkJICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQsCisJCQkgICAgIHNpemVfdCBfX3Jlc29sdmVkbGVuKSBfX1RIUk9XIF9fd3VyOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1RfTlRIIChfX3JlYWxwYXRoX2FsaWFzLAorCQkJICAgICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJCSAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19yZXNvbHZlZCksIHJlYWxwYXRoKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUX05USCAoX19yZWFscGF0aF9jaGtfd2FybiwKKwkJCSAgICAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCQkgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQsCisJCQkgICAgICBzaXplX3QgX19yZXNvbHZlZGxlbiksIF9fcmVhbHBhdGhfY2hrKSBfX3d1cgorICAgICBfX3dhcm5hdHRyICgic2Vjb25kIGFyZ3VtZW50IG9mIHJlYWxwYXRoIG11c3QgYmUgZWl0aGVyIE5VTEwgb3IgYXQgIgorCQkgImxlYXN0IFBBVEhfTUFYIGJ5dGVzIGxvbmcgYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgY2hhciAqCitfX05USCAocmVhbHBhdGggKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsIGNoYXIgKl9fcmVzdHJpY3QgX19yZXNvbHZlZCkpCit7CisgIGlmIChfX2JvcyAoX19yZXNvbHZlZCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworI2lmIGRlZmluZWQgX0xJQkNfTElNSVRTX0hfICYmIGRlZmluZWQgUEFUSF9NQVgKKyAgICAgIGlmIChfX2JvcyAoX19yZXNvbHZlZCkgPCBQQVRIX01BWCkKKwlyZXR1cm4gX19yZWFscGF0aF9jaGtfd2FybiAoX19uYW1lLCBfX3Jlc29sdmVkLCBfX2JvcyAoX19yZXNvbHZlZCkpOworI2VuZGlmCisgICAgICByZXR1cm4gX19yZWFscGF0aF9jaGsgKF9fbmFtZSwgX19yZXNvbHZlZCwgX19ib3MgKF9fcmVzb2x2ZWQpKTsKKyAgICB9CisKKyAgcmV0dXJuIF9fcmVhbHBhdGhfYWxpYXMgKF9fbmFtZSwgX19yZXNvbHZlZCk7Cit9CisKKworZXh0ZXJuIGludCBfX3B0c25hbWVfcl9jaGsgKGludCBfX2ZkLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgIHNpemVfdCBfX25yZWFsKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fcHRzbmFtZV9yX2FsaWFzLCAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLAorCQkJCQkgICAgICAgc2l6ZV90IF9fYnVmbGVuKSwgcHRzbmFtZV9yKQorICAgICBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3B0c25hbWVfcl9jaGtfd2FybiwKKwkJCSAgIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBzaXplX3QgX19ucmVhbCksIF9fcHRzbmFtZV9yX2NoaykKKyAgICAgX19ub25udWxsICgoMikpIF9fd2FybmF0dHIgKCJwdHNuYW1lX3IgY2FsbGVkIHdpdGggYnVmbGVuIGJpZ2dlciB0aGFuICIKKwkJCQkgInNpemUgb2YgYnVmIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAocHRzbmFtZV9yIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbikpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fYnVmbGVuKSkKKwlyZXR1cm4gX19wdHNuYW1lX3JfY2hrIChfX2ZkLCBfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworICAgICAgaWYgKF9fYnVmbGVuID4gX19ib3MgKF9fYnVmKSkKKwlyZXR1cm4gX19wdHNuYW1lX3JfY2hrX3dhcm4gKF9fZmQsIF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19wdHNuYW1lX3JfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX2J1Zmxlbik7Cit9CisKKworZXh0ZXJuIGludCBfX3djdG9tYl9jaGsgKGNoYXIgKl9fcywgd2NoYXJfdCBfX3djaGFyLCBzaXplX3QgX19idWZsZW4pCisgIF9fVEhST1cgX193dXI7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3djdG9tYl9hbGlhcywgKGNoYXIgKl9fcywgd2NoYXJfdCBfX3djaGFyKSwKKwkJCSAgIHdjdG9tYikgX193dXI7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgaW50CitfX05USCAod2N0b21iIChjaGFyICpfX3MsIHdjaGFyX3QgX193Y2hhcikpCit7CisgIC8qIFdlIHdvdWxkIGhhdmUgdG8gaW5jbHVkZSA8bGltaXRzLmg+IHRvIGdldCBhIGRlZmluaXRpb24gb2YgTUJfTEVOX01BWC4KKyAgICAgQnV0IHRoaXMgd291bGQgb25seSBkaXN0dXJiIHRoZSBuYW1lc3BhY2UuICBTbyB3ZSBkZWZpbmUgb3VyIG93bgorICAgICB2ZXJzaW9uIGhlcmUuICAqLworI2RlZmluZSBfX1NURExJQl9NQl9MRU5fTUFYCTE2CisjaWYgZGVmaW5lZCBNQl9MRU5fTUFYICYmIE1CX0xFTl9NQVggIT0gX19TVERMSUJfTUJfTEVOX01BWAorIyBlcnJvciAiQXNzdW1lZCB2YWx1ZSBvZiBNQl9MRU5fTUFYIHdyb25nIgorI2VuZGlmCisgIGlmIChfX2JvcyAoX19zKSAhPSAoc2l6ZV90KSAtMSAmJiBfX1NURExJQl9NQl9MRU5fTUFYID4gX19ib3MgKF9fcykpCisgICAgcmV0dXJuIF9fd2N0b21iX2NoayAoX19zLCBfX3djaGFyLCBfX2JvcyAoX19zKSk7CisgIHJldHVybiBfX3djdG9tYl9hbGlhcyAoX19zLCBfX3djaGFyKTsKK30KKworCitleHRlcm4gc2l6ZV90IF9fbWJzdG93Y3NfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgc2l6ZV90IF9fbGVuLCBzaXplX3QgX19kc3RsZW4pIF9fVEhST1c7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX21ic3Rvd2NzX2FsaWFzLAorCQkJICAgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiksIG1ic3Rvd2NzKTsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fbWJzdG93Y3NfY2hrX3dhcm4sCisJCQkgICAgICAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBzaXplX3QgX19kc3RsZW4pLCBfX21ic3Rvd2NzX2NoaykKKyAgICAgX193YXJuYXR0ciAoIm1ic3Rvd2NzIGNhbGxlZCB3aXRoIGRzdCBidWZmZXIgc21hbGxlciB0aGFuIGxlbiAiCisJCSAiKiBzaXplb2YgKHdjaGFyX3QpIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc2l6ZV90CitfX05USCAobWJzdG93Y3MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJIHNpemVfdCBfX2xlbikpCit7CisgIGlmIChfX2JvcyAoX19kc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX19tYnN0b3djc19jaGsgKF9fZHN0LCBfX3NyYywgX19sZW4sCisJCQkgICAgICAgX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworCisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX19tYnN0b3djc19jaGtfd2FybiAoX19kc3QsIF9fc3JjLCBfX2xlbiwKKwkJCQkgICAgIF9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICB9CisgIHJldHVybiBfX21ic3Rvd2NzX2FsaWFzIChfX2RzdCwgX19zcmMsIF9fbGVuKTsKK30KKworCitleHRlcm4gc2l6ZV90IF9fd2NzdG9tYnNfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgc2l6ZV90IF9fbGVuLCBzaXplX3QgX19kc3RsZW4pIF9fVEhST1c7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djc3RvbWJzX2FsaWFzLAorCQkJICAgICAgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiksIHdjc3RvbWJzKTsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fd2NzdG9tYnNfY2hrX3dhcm4sCisJCQkgICAgICAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBzaXplX3QgX19kc3RsZW4pLCBfX3djc3RvbWJzX2NoaykKKyAgICAgX193YXJuYXR0ciAoIndjc3RvbWJzIGNhbGxlZCB3aXRoIGRzdCBidWZmZXIgc21hbGxlciB0aGFuIGxlbiIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNpemVfdAorX19OVEggKHdjc3RvbWJzIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCSBzaXplX3QgX19sZW4pKQoreworICBpZiAoX19ib3MgKF9fZHN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fd2NzdG9tYnNfY2hrIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX2JvcyAoX19kc3QpKTsKKyAgICAgIGlmIChfX2xlbiA+IF9fYm9zIChfX2RzdCkpCisJcmV0dXJuIF9fd2NzdG9tYnNfY2hrX3dhcm4gKF9fZHN0LCBfX3NyYywgX19sZW4sIF9fYm9zIChfX2RzdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd2NzdG9tYnNfYWxpYXMgKF9fZHN0LCBfX3NyYywgX19sZW4pOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0cmluZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOGMxMDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RyaW5nLmgKQEAgLTAsMCArMSwxOTc1IEBACisvKiBPcHRpbWl6ZWQsIGlubGluZWQgc3RyaW5nIGZ1bmN0aW9ucy4gIGk0ODYgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMywyMDA0LDIwMDcsMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NUUklOR19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvc3RyaW5nLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzdHJpbmcuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogVGhlIGl4ODYgcHJvY2Vzc29ycyBjYW4gYWNjZXNzIHVuYWxpZ25lZCBtdWx0aS1ieXRlIHZhcmlhYmxlcy4gICovCisjZGVmaW5lIF9TVFJJTkdfQVJDSF91bmFsaWduZWQJMQorCisKKy8qIFdlIG9ubHkgcHJvdmlkZSBvcHRpbWl6YXRpb25zIGlmIHRoZSB1c2VyIHNlbGVjdHMgdGhlbSBhbmQgaWYKKyAgIEdOVSBDQyBpcyB1c2VkLiAgKi8KKyNpZiAhZGVmaW5lZCBfX05PX1NUUklOR19JTkxJTkVTICYmIGRlZmluZWQgX19VU0VfU1RSSU5HX0lOTElORVMgXAorICAgICYmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMiAmJiAhX19CT1VOREVEX1BPSU5URVJTX18KKworI2lmbmRlZiBfX1NUUklOR19JTkxJTkUKKyMgaWZuZGVmIF9fZXh0ZXJuX2lubGluZQorIyAgZGVmaW5lIF9fU1RSSU5HX0lOTElORSBpbmxpbmUKKyMgZWxzZQorIyAgZGVmaW5lIF9fU1RSSU5HX0lOTElORSBfX2V4dGVybl9pbmxpbmUKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgbWFjcm9zIGFyZSB1c2VkIGluIHNvbWUgb2YgdGhlIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbnMgYmVsb3cuICAqLworI2RlZmluZSBfX1NUUklOR19TTUFMTF9HRVQxNihzcmMsIGlkeCkgXAorICAoKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChzcmMpKVtpZHggKyAxXSA8PCA4KQkJCSAgICAgIFwKKyAgIHwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKHNyYykpW2lkeF0pCisjZGVmaW5lIF9fU1RSSU5HX1NNQUxMX0dFVDMyKHNyYywgaWR4KSBcCisgICgoKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChzcmMpKVtpZHggKyAzXSA8PCA4CQkJICAgICAgXAorICAgICB8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChzcmMpKVtpZHggKyAyXSkgPDwgOAkJCSAgICAgIFwKKyAgICB8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChzcmMpKVtpZHggKyAxXSkgPDwgOAkJCSAgICAgIFwKKyAgIHwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKHNyYykpW2lkeF0pCisKKworLyogQ29weSBOIGJ5dGVzIG9mIFNSQyB0byBERVNULiAgKi8KKyNkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfbWVtY3B5IDEKKyNkZWZpbmUgbWVtY3B5KGRlc3QsIHNyYywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKG4pCQkJCSAgICAgIFwKKwkJICA/IF9fbWVtY3B5X2MgKChkZXN0KSwgKHNyYyksIChuKSkJCQkgICAgICBcCisJCSAgOiBfX21lbWNweV9nICgoZGVzdCksIChzcmMpLCAobikpKSkKKyNkZWZpbmUgX19tZW1jcHlfYyhkZXN0LCBzcmMsIG4pIFwKKyAgKChuKSA9PSAwCQkJCQkJCQkgICAgICBcCisgICA/IChkZXN0KQkJCQkJCQkJICAgICAgXAorICAgOiAoKChuKSAlIDQgPT0gMCkJCQkJCQkJICAgICAgXAorICAgICAgPyBfX21lbWNweV9ieTQgKGRlc3QsIHNyYywgbikJCQkJCSAgICAgIFwKKyAgICAgIDogKCgobikgJSAyID09IDApCQkJCQkJCSAgICAgIFwKKwkgPyBfX21lbWNweV9ieTIgKGRlc3QsIHNyYywgbikJCQkJCSAgICAgIFwKKwkgOiBfX21lbWNweV9nIChkZXN0LCBzcmMsIG4pKSkpCisKK19fU1RSSU5HX0lOTElORSB2b2lkICpfX21lbWNweV9ieTQgKHZvaWQgKl9fZGVzdCwgX19jb25zdCB2b2lkICpfX3NyYywKKwkJCQkgICAgc2l6ZV90IF9fbik7CisKK19fU1RSSU5HX0lOTElORSB2b2lkICoKK19fbWVtY3B5X2J5NCAodm9pZCAqX19kZXN0LCBfX2NvbnN0IHZvaWQgKl9fc3JjLCBzaXplX3QgX19uKQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxOworICByZWdpc3RlciB2b2lkICpfX3RtcCA9IF9fZGVzdDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIjE6XG5cdCIKKyAgICAgIm1vdmwJKCUyKSwlMFxuXHQiCisgICAgICJsZWFsCTQoJTIpLCUyXG5cdCIKKyAgICAgIm1vdmwJJTAsKCUxKVxuXHQiCisgICAgICJsZWFsCTQoJTEpLCUxXG5cdCIKKyAgICAgImRlY2wJJTNcblx0IgorICAgICAiam56CTFiIgorICAgICA6ICI9JnIiIChfX2QwKSwgIj0mciIgKF9fdG1wKSwgIj0mciIgKF9fc3JjKSwgIj0mciIgKF9fZDEpCisgICAgIDogIjEiIChfX3RtcCksICIyIiAoX19zcmMpLCAiMyIgKF9fbiAvIDQpCisgICAgIDogIm1lbW9yeSIsICJjYyIpOworICByZXR1cm4gX19kZXN0OworfQorCitfX1NUUklOR19JTkxJTkUgdm9pZCAqX19tZW1jcHlfYnkyICh2b2lkICpfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19zcmMsCisJCQkJICAgIHNpemVfdCBfX24pOworCitfX1NUUklOR19JTkxJTkUgdm9pZCAqCitfX21lbWNweV9ieTIgKHZvaWQgKl9fZGVzdCwgX19jb25zdCB2b2lkICpfX3NyYywgc2l6ZV90IF9fbikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMTsKKyAgcmVnaXN0ZXIgdm9pZCAqX190bXAgPSBfX2Rlc3Q7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJzaHJsCSQxLCUzXG5cdCIKKyAgICAgImp6CTJmXG4iICAgICAgICAgICAgICAgICAvKiBvbmx5IGEgd29yZCAqLworICAgICAiMTpcblx0IgorICAgICAibW92bAkoJTIpLCUwXG5cdCIKKyAgICAgImxlYWwJNCglMiksJTJcblx0IgorICAgICAibW92bAklMCwoJTEpXG5cdCIKKyAgICAgImxlYWwJNCglMSksJTFcblx0IgorICAgICAiZGVjbAklM1xuXHQiCisgICAgICJqbnoJMWJcbiIKKyAgICAgIjI6XG5cdCIKKyAgICAgIm1vdncJKCUyKSwldzBcblx0IgorICAgICAibW92dwkldzAsKCUxKSIKKyAgICAgOiAiPSZxIiAoX19kMCksICI9JnIiIChfX3RtcCksICI9JnIiIChfX3NyYyksICI9JnIiIChfX2QxKQorICAgICA6ICIxIiAoX190bXApLCAiMiIgKF9fc3JjKSwgIjMiIChfX24gLyAyKQorICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyAgcmV0dXJuIF9fZGVzdDsKK30KKworX19TVFJJTkdfSU5MSU5FIHZvaWQgKl9fbWVtY3B5X2cgKHZvaWQgKl9fZGVzdCwgX19jb25zdCB2b2lkICpfX3NyYywKKwkJCQkgIHNpemVfdCBfX24pOworCitfX1NUUklOR19JTkxJTkUgdm9pZCAqCitfX21lbWNweV9nICh2b2lkICpfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19zcmMsIHNpemVfdCBfX24pCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDEsIF9fZDI7CisgIHJlZ2lzdGVyIHZvaWQgKl9fdG1wID0gX19kZXN0OworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiY2xkXG5cdCIKKyAgICAgInNocmwJJDEsJSVlY3hcblx0IgorICAgICAiam5jCTFmXG5cdCIKKyAgICAgIm1vdnNiXG4iCisgICAgICIxOlxuXHQiCisgICAgICJzaHJsCSQxLCUlZWN4XG5cdCIKKyAgICAgImpuYwkyZlxuXHQiCisgICAgICJtb3Zzd1xuIgorICAgICAiMjpcblx0IgorICAgICAicmVwOyBtb3ZzbCIKKyAgICAgOiAiPSZjIiAoX19kMCksICI9JkQiIChfX2QxKSwgIj0mUyIgKF9fZDIpLAorICAgICAgICI9bSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19uXTsgfSAqKV9fZGVzdCkKKyAgICAgOiAiMCIgKF9fbiksICIxIiAoX190bXApLCAiMiIgKF9fc3JjKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19uXTsgfSAqKV9fc3JjKQorICAgICA6ICJjYyIpOworICByZXR1cm4gX19kZXN0OworfQorCisjZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX21lbW1vdmUgMQorI2lmbmRlZiBfRk9SQ0VfSU5MSU5FUworLyogQ29weSBOIGJ5dGVzIG9mIFNSQyB0byBERVNULCBndWFyYW50ZWVpbmcKKyAgIGNvcnJlY3QgYmVoYXZpb3IgZm9yIG92ZXJsYXBwaW5nIHN0cmluZ3MuICAqLworI2RlZmluZSBtZW1tb3ZlKGRlc3QsIHNyYywgbikgX19tZW1tb3ZlX2cgKGRlc3QsIHNyYywgbikKKworX19TVFJJTkdfSU5MSU5FIHZvaWQgKl9fbWVtbW92ZV9nICh2b2lkICosIF9fY29uc3Qgdm9pZCAqLCBzaXplX3QpCisgICAgIF9fYXNtX18gKCJtZW1tb3ZlIik7CisKK19fU1RSSU5HX0lOTElORSB2b2lkICoKK19fbWVtbW92ZV9nICh2b2lkICpfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19zcmMsIHNpemVfdCBfX24pCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDEsIF9fZDI7CisgIHJlZ2lzdGVyIHZvaWQgKl9fdG1wID0gX19kZXN0OworICBpZiAoX19kZXN0IDwgX19zcmMpCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAgICgiY2xkXG5cdCIKKyAgICAgICAicmVwOyBtb3ZzYiIKKyAgICAgICA6ICI9JmMiIChfX2QwKSwgIj0mUyIgKF9fZDEpLCAiPSZEIiAoX19kMiksCisJICI9bSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19uXTsgfSAqKV9fZGVzdCkKKyAgICAgICA6ICIwIiAoX19uKSwgIjEiIChfX3NyYyksICIyIiAoX190bXApLAorCSAibSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19uXTsgfSAqKV9fc3JjKSk7CisgIGVsc2UKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICAgKCJzdGRcblx0IgorICAgICAgICJyZXA7IG1vdnNiXG5cdCIKKyAgICAgICAiY2xkIgorICAgICAgIDogIj0mYyIgKF9fZDApLCAiPSZTIiAoX19kMSksICI9JkQiIChfX2QyKSwKKwkgIj1tIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX25dOyB9ICopX19kZXN0KQorICAgICAgIDogIjAiIChfX24pLCAiMSIgKF9fbiAtIDEgKyAoX19jb25zdCBjaGFyICopIF9fc3JjKSwKKwkgIjIiIChfX24gLSAxICsgKGNoYXIgKikgX190bXApLAorCSAibSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19uXTsgfSAqKV9fc3JjKSk7CisgIHJldHVybiBfX2Rlc3Q7Cit9CisjZW5kaWYKKworLyogQ29tcGFyZSBOIGJ5dGVzIG9mIFMxIGFuZCBTMi4gICovCisjZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX21lbWNtcCAxCisjaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjIGlmbmRlZiBfX1BJQ19fCisvKiBnY2MgaGFzIHByb2JsZW1zIHRvIHNwaWxsIHJlZ2lzdGVycyB3aGVuIHVzaW5nIFBJQy4gICovCitfX1NUUklOR19JTkxJTkUgaW50CittZW1jbXAgKF9fY29uc3Qgdm9pZCAqX19zMSwgX19jb25zdCB2b2lkICpfX3MyLCBzaXplX3QgX19uKQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxLCBfX2QyOworICByZWdpc3RlciBpbnQgX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcblx0IgorICAgICAidGVzdGwgJTMsJTNcblx0IgorICAgICAicmVwZTsgY21wc2Jcblx0IgorICAgICAiamUJMWZcblx0IgorICAgICAic2JibAklMCwlMFxuXHQiCisgICAgICJvcmwJJDEsJTBcbiIKKyAgICAgIjE6IgorICAgICA6ICI9JmEiIChfX3JlcyksICI9JlMiIChfX2QwKSwgIj0mRCIgKF9fZDEpLCAiPSZjIiAoX19kMikKKyAgICAgOiAiMCIgKDApLCAiMSIgKF9fczEpLCAiMiIgKF9fczIpLCAiMyIgKF9fbiksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX3MxKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19uXTsgfSAqKV9fczIpCisgICAgIDogImNjIik7CisgIHJldHVybiBfX3JlczsKK30KKyMgZW5kaWYKKyNlbmRpZgorCisvKiBTZXQgTiBieXRlcyBvZiBTIHRvIEMuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9tZW1zZXQgMQorI2RlZmluZSBfVVNFX1NUUklOR19BUkNIX21lbXNldCAxCisjZGVmaW5lIG1lbXNldChzLCBjLCBuKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgJiYgKG4pIDw9IDE2CQkJICAgICAgXAorCQkgID8gKChuKSA9PSAxCQkJCQkJICAgICAgXAorCQkgICAgID8gX19tZW1zZXRfYzEgKChzKSwgKGMpKQkJCQkgICAgICBcCisJCSAgICAgOiBfX21lbXNldF9nYyAoKHMpLCAoYyksIChuKSkpCQkJICAgICAgXAorCQkgIDogKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKQkJCQkgICAgICBcCisJCSAgICAgPyAoX19idWlsdGluX2NvbnN0YW50X3AgKG4pCQkJICAgICAgXAorCQkJPyBfX21lbXNldF9jY24gKChzKSwgKGMpLCAobikpCQkJICAgICAgXAorCQkJOiBtZW1zZXQgKChzKSwgKGMpLCAobikpKQkJCSAgICAgIFwKKwkJICAgICA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAobikJCQkgICAgICBcCisJCQk/IF9fbWVtc2V0X2djbiAoKHMpLCAoYyksIChuKSkJCQkgICAgICBcCisJCQk6IG1lbXNldCAoKHMpLCAoYyksIChuKSkpKSkpCisKKyNkZWZpbmUgX19tZW1zZXRfYzEocywgYykgKHsgdm9pZCAqX19zID0gKHMpOwkJCQkgICAgICBcCisJCQkgICAgICooKHVuc2lnbmVkIGNoYXIgKikgX19zKSA9ICh1bnNpZ25lZCBjaGFyKSAoYyk7ICBcCisJCQkgICAgIF9fczsgfSkKKworI2RlZmluZSBfX21lbXNldF9nYyhzLCBjLCBuKSBcCisgICh7IHZvaWQgKl9fcyA9IChzKTsJCQkJCQkJICAgICAgXAorICAgICB1bmlvbiB7CQkJCQkJCQkgICAgICBcCisgICAgICAgdW5zaWduZWQgaW50IF9fdWk7CQkJCQkJICAgICAgXAorICAgICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3VzaTsJCQkJCSAgICAgIFwKKyAgICAgICB1bnNpZ25lZCBjaGFyIF9fdWM7CQkJCQkJICAgICAgXAorICAgICB9ICpfX3UgPSBfX3M7CQkJCQkJCSAgICAgIFwKKyAgICAgdW5zaWduZWQgaW50IF9fYyA9ICgodW5zaWduZWQgaW50KSAoKHVuc2lnbmVkIGNoYXIpIChjKSkpICogMHgwMTAxMDEwMTsgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgLyogV2UgYXBwbHkgYSB0cmljayBoZXJlLiAgYGdjYycgd291bGQgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcJICAgICAgXAorCWFzc2lnbm1lbnRzIHVzaW5nIGltbWVkaWF0ZSBvcGVyYW5kcy4gIEJ1dCB0aGlzIHVzZXMgdG8gbXVjaAkgICAgICBcCisJbWVtb3J5ICg3LCBpbnN0ZWFkIG9mIDQgYnl0ZXMpLiAgU28gd2UgZm9yY2UgdGhlIHZhbHVlIGluIGEJICAgICAgXAorCXJlZ2lzdGVycy4gICovCQkJCQkJCSAgICAgIFwKKyAgICAgaWYgKChuKSA9PSAzIHx8IChuKSA+PSA1KQkJCQkJCSAgICAgIFwKKyAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiIgOiAiPXIiIChfX2MpIDogIjAiIChfX2MpKTsJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgLyogVGhpcyBgc3dpdGNoJyBzdGF0ZW1lbnQgd2lsbCBiZSByZW1vdmVkIGF0IGNvbXBpbGUtdGltZS4gICovCSAgICAgIFwKKyAgICAgc3dpdGNoIChuKQkJCQkJCQkJICAgICAgXAorICAgICAgIHsJCQkJCQkJCSAgICAgIFwKKyAgICAgICBjYXNlIDE1OgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2M7CQkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSAxMToJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jOwkJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgNzoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jOwkJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMzoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VzaSA9ICh1bnNpZ25lZCBzaG9ydCBpbnQpIF9fYzsJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsJCQkgICAgICBcCisJIF9fdS0+X191YyA9ICh1bnNpZ25lZCBjaGFyKSBfX2M7CQkJCSAgICAgIFwKKwkgYnJlYWs7CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxNDoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jOwkJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMTA6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYzsJCQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDY6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYzsJCQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDI6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191c2kgPSAodW5zaWduZWQgc2hvcnQgaW50KSBfX2M7CQkJCSAgICAgIFwKKwkgYnJlYWs7CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxMzoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jOwkJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgOToJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jOwkJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgNToJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jOwkJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMToJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VjID0gKHVuc2lnbmVkIGNoYXIpIF9fYzsJCQkJICAgICAgXAorCSBicmVhazsJCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgICBjYXNlIDE2OgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2M7CQkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSAxMjoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jOwkJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgODoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jOwkJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgNDoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jOwkJCQkJCSAgICAgIFwKKyAgICAgICBjYXNlIDA6CQkJCQkJCQkgICAgICBcCisJIGJyZWFrOwkJCQkJCQkJICAgICAgXAorICAgICAgIH0JCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgX19zOyB9KQorCisjZGVmaW5lIF9fbWVtc2V0X2NjbihzLCBjLCBuKSBcCisgICgoKG4pICUgNCA9PSAwKQkJCQkJCQkgICAgICBcCisgICA/IF9fbWVtc2V0X2Njbl9ieTQgKHMsICgodW5zaWduZWQgaW50KSAoKHVuc2lnbmVkIGNoYXIpIChjKSkpICogMHgwMTAxMDEwMSxcCisJCSAgICAgICBuKQkJCQkJCSAgICAgIFwKKyAgIDogKCgobikgJSAyID09IDApCQkJCQkJCSAgICAgIFwKKyAgICAgID8gX19tZW1zZXRfY2NuX2J5MiAocywJCQkJCQkgICAgICBcCisJCQkgICgodW5zaWduZWQgaW50KSAoKHVuc2lnbmVkIGNoYXIpIChjKSkpICogMHgwMTAxMDEwMSxcCisJCQkgICBuKQkJCQkJCSAgICAgIFwKKyAgICAgIDogbWVtc2V0IChzLCBjLCBuKSkpCisKK19fU1RSSU5HX0lOTElORSB2b2lkICpfX21lbXNldF9jY25fYnk0ICh2b2lkICpfX3MsIHVuc2lnbmVkIGludCBfX2MsCisJCQkJCXNpemVfdCBfX24pOworCitfX1NUUklOR19JTkxJTkUgdm9pZCAqCitfX21lbXNldF9jY25fYnk0ICh2b2lkICpfX3MsIHVuc2lnbmVkIGludCBfX2MsIHNpemVfdCBfX24pCit7CisgIHJlZ2lzdGVyIHZvaWQgKl9fdG1wID0gX19zOworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwOworI2lmZGVmIF9faTY4Nl9fCisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcblx0IgorICAgICAicmVwOyBzdG9zbCIKKyAgICAgOiAiPSZhIiAoX19jKSwgIj0mRCIgKF9fdG1wKSwgIj0mYyIgKF9fZDApLAorICAgICAgICI9bSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19uXTsgfSAqKV9fcykKKyAgICAgOiAiMCIgKCh1bnNpZ25lZCBpbnQpIF9fYyksICIxIiAoX190bXApLCAiMiIgKF9fbiAvIDQpCisgICAgIDogImNjIik7CisjZWxzZQorICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiMTpcblx0IgorICAgICAibW92bAklMCwoJTEpXG5cdCIKKyAgICAgImFkZGwJJDQsJTFcblx0IgorICAgICAiZGVjbAklMlxuXHQiCisgICAgICJqbnoJMWJcbiIKKyAgICAgOiAiPSZyIiAoX19jKSwgIj0mciIgKF9fdG1wKSwgIj0mciIgKF9fZDApLAorICAgICAgICI9bSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19uXTsgfSAqKV9fcykKKyAgICAgOiAiMCIgKCh1bnNpZ25lZCBpbnQpIF9fYyksICIxIiAoX190bXApLCAiMiIgKF9fbiAvIDQpCisgICAgIDogImNjIik7CisjZW5kaWYKKyAgcmV0dXJuIF9fczsKK30KKworX19TVFJJTkdfSU5MSU5FIHZvaWQgKl9fbWVtc2V0X2Njbl9ieTIgKHZvaWQgKl9fcywgdW5zaWduZWQgaW50IF9fYywKKwkJCQkJc2l6ZV90IF9fbik7CisKK19fU1RSSU5HX0lOTElORSB2b2lkICoKK19fbWVtc2V0X2Njbl9ieTIgKHZvaWQgKl9fcywgdW5zaWduZWQgaW50IF9fYywgc2l6ZV90IF9fbikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMTsKKyAgcmVnaXN0ZXIgdm9pZCAqX190bXAgPSBfX3M7CisjaWZkZWYgX19pNjg2X18KKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoImNsZFxuXHQiCisgICAgICJyZXA7IHN0b3NsXG4iCisgICAgICJzdG9zdyIKKyAgICAgOiAiPSZhIiAoX19kMCksICI9JkQiIChfX3RtcCksICI9JmMiIChfX2QxKSwKKyAgICAgICAiPW0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX3MpCisgICAgIDogIjAiICgodW5zaWduZWQgaW50KSBfX2MpLCAiMSIgKF9fdG1wKSwgIjIiIChfX24gLyA0KQorICAgICA6ICJjYyIpOworI2Vsc2UKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIjE6XHRtb3ZsCSUwLCglMSlcblx0IgorICAgICAibGVhbAk0KCUxKSwlMVxuXHQiCisgICAgICJkZWNsCSUyXG5cdCIKKyAgICAgImpuegkxYlxuIgorICAgICAibW92dwkldzAsKCUxKSIKKyAgICAgOiAiPSZxIiAoX19kMCksICI9JnIiIChfX3RtcCksICI9JnIiIChfX2QxKSwKKyAgICAgICAiPW0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX3MpCisgICAgIDogIjAiICgodW5zaWduZWQgaW50KSBfX2MpLCAiMSIgKF9fdG1wKSwgIjIiIChfX24gLyA0KQorICAgICA6ICJjYyIpOworI2VuZGlmCisgIHJldHVybiBfX3M7Cit9CisKKyNkZWZpbmUgX19tZW1zZXRfZ2NuKHMsIGMsIG4pIFwKKyAgKCgobikgJSA0ID09IDApCQkJCQkJCSAgICAgIFwKKyAgID8gX19tZW1zZXRfZ2NuX2J5NCAocywgYywgbikJCQkJCQkgICAgICBcCisgICA6ICgoKG4pICUgMiA9PSAwKQkJCQkJCQkgICAgICBcCisgICAgICA/IF9fbWVtc2V0X2djbl9ieTIgKHMsIGMsIG4pCQkJCQkgICAgICBcCisgICAgICA6IG1lbXNldCAocywgYywgbikpKQorCitfX1NUUklOR19JTkxJTkUgdm9pZCAqX19tZW1zZXRfZ2NuX2J5NCAodm9pZCAqX19zLCBpbnQgX19jLCBzaXplX3QgX19uKTsKKworX19TVFJJTkdfSU5MSU5FIHZvaWQgKgorX19tZW1zZXRfZ2NuX2J5NCAodm9pZCAqX19zLCBpbnQgX19jLCBzaXplX3QgX19uKQoreworICByZWdpc3RlciB2b2lkICpfX3RtcCA9IF9fczsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIm1vdmIJJWIwLCVoMFxuIgorICAgICAicHVzaHcJJXcwXG5cdCIKKyAgICAgInNobGwJJDE2LCUwXG5cdCIKKyAgICAgInBvcHcJJXcwXG4iCisgICAgICIxOlxuXHQiCisgICAgICJtb3ZsCSUwLCglMSlcblx0IgorICAgICAiYWRkbAkkNCwlMVxuXHQiCisgICAgICJkZWNsCSUyXG5cdCIKKyAgICAgImpuegkxYlxuIgorICAgICA6ICI9JnEiIChfX2MpLCAiPSZyIiAoX190bXApLCAiPSZyIiAoX19kMCksCisgICAgICAgIj1tIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX25dOyB9ICopX19zKQorICAgICA6ICIwIiAoKHVuc2lnbmVkIGludCkgX19jKSwgIjEiIChfX3RtcCksICIyIiAoX19uIC8gNCkKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIF9fczsKK30KKworX19TVFJJTkdfSU5MSU5FIHZvaWQgKl9fbWVtc2V0X2djbl9ieTIgKHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbik7CisKK19fU1RSSU5HX0lOTElORSB2b2lkICoKK19fbWVtc2V0X2djbl9ieTIgKHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMTsKKyAgcmVnaXN0ZXIgdm9pZCAqX190bXAgPSBfX3M7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJtb3ZiCSViMCwlaDBcblx0IgorICAgICAicHVzaHcJJXcwXG5cdCIKKyAgICAgInNobGwJJDE2LCUwXG5cdCIKKyAgICAgInBvcHcJJXcwXG4iCisgICAgICIxOlxuXHQiCisgICAgICJtb3ZsCSUwLCglMSlcblx0IgorICAgICAibGVhbAk0KCUxKSwlMVxuXHQiCisgICAgICJkZWNsCSUyXG5cdCIKKyAgICAgImpuegkxYlxuIgorICAgICAibW92dwkldzAsKCUxKSIKKyAgICAgOiAiPSZxIiAoX19kMCksICI9JnIiIChfX3RtcCksICI9JnIiIChfX2QxKSwKKyAgICAgICAiPW0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX3MpCisgICAgIDogIjAiICgodW5zaWduZWQgaW50KSBfX2MpLCAiMSIgKF9fdG1wKSwgIjIiIChfX24gLyA0KQorICAgICA6ICJjYyIpOworICByZXR1cm4gX19zOworfQorCisKKy8qIFNlYXJjaCBOIGJ5dGVzIG9mIFMgZm9yIEMuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9tZW1jaHIgMQorI2lmbmRlZiBfRk9SQ0VfSU5MSU5FUworX19TVFJJTkdfSU5MSU5FIHZvaWQgKgorbWVtY2hyIChfX2NvbnN0IHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMDsKKyNpZmRlZiBfX2k2ODZfXworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QxOworI2VuZGlmCisgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKl9fcmVzOworICBpZiAoX19uID09IDApCisgICAgcmV0dXJuIE5VTEw7CisjaWZkZWYgX19pNjg2X18KKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoImNsZFxuXHQiCisgICAgICJyZXBuZTsgc2Nhc2Jcblx0IgorICAgICAiY21vdm5lICUyLCUwIgorICAgICA6ICI9RCIgKF9fcmVzKSwgIj0mYyIgKF9fZDApLCAiPSZyIiAoX19kMSkKKyAgICAgOiAiYSIgKF9fYyksICIwIiAoX19zKSwgIjEiIChfX24pLCAiMiIgKDEpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX25dOyB9ICopX19zKQorICAgICA6ICJjYyIpOworI2Vsc2UKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoImNsZFxuXHQiCisgICAgICJyZXBuZTsgc2Nhc2Jcblx0IgorICAgICAiamUJMWZcblx0IgorICAgICAibW92bAkkMSwlMFxuIgorICAgICAiMToiCisgICAgIDogIj1EIiAoX19yZXMpLCAiPSZjIiAoX19kMCkKKyAgICAgOiAiYSIgKF9fYyksICIwIiAoX19zKSwgIjEiIChfX24pLAorICAgICAgICJtIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX25dOyB9ICopX19zKQorICAgICA6ICJjYyIpOworI2VuZGlmCisgIHJldHVybiBfX3JlcyAtIDE7Cit9CisjZW5kaWYKKworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9tZW1yY2hyIDEKKyNpZm5kZWYgX0ZPUkNFX0lOTElORVMKK19fU1RSSU5HX0lOTElORSB2b2lkICpfX21lbXJjaHIgKF9fY29uc3Qgdm9pZCAqX19zLCBpbnQgX19jLCBzaXplX3QgX19uKTsKKworX19TVFJJTkdfSU5MSU5FIHZvaWQgKgorX19tZW1yY2hyIChfX2NvbnN0IHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMDsKKyMgaWZkZWYgX19pNjg2X18KKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMTsKKyMgZW5kaWYKKyAgcmVnaXN0ZXIgdm9pZCAqX19yZXM7CisgIGlmIChfX24gPT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKyMgaWZkZWYgX19pNjg2X18KKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoInN0ZFxuXHQiCisgICAgICJyZXBuZTsgc2Nhc2Jcblx0IgorICAgICAiY21vdm5lICUyLCUwXG5cdCIKKyAgICAgImNsZFxuXHQiCisgICAgICJpbmNsICUwIgorICAgICA6ICI9RCIgKF9fcmVzKSwgIj0mYyIgKF9fZDApLCAiPSZyIiAoX19kMSkKKyAgICAgOiAiYSIgKF9fYyksICIwIiAoX19zICsgX19uIC0gMSksICIxIiAoX19uKSwgIjIiICgtMSksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX3MpCisgICAgIDogImNjIik7CisjIGVsc2UKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoInN0ZFxuXHQiCisgICAgICJyZXBuZTsgc2Nhc2Jcblx0IgorICAgICAiamUgMWZcblx0IgorICAgICAib3JsICQtMSwlMFxuIgorICAgICAiMTpcdGNsZFxuXHQiCisgICAgICJpbmNsICUwIgorICAgICA6ICI9RCIgKF9fcmVzKSwgIj0mYyIgKF9fZDApCisgICAgIDogImEiIChfX2MpLCAiMCIgKF9fcyArIF9fbiAtIDEpLCAiMSIgKF9fbiksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX3MpCisgICAgIDogImNjIik7CisjIGVuZGlmCisgIHJldHVybiBfX3JlczsKK30KKyMgaWZkZWYgX19VU0VfR05VCisjICBkZWZpbmUgbWVtcmNocihzLCBjLCBuKSBfX21lbXJjaHIgKChzKSwgKGMpLCAobikpCisjIGVuZGlmCisjZW5kaWYKKworLyogUmV0dXJuIHBvaW50ZXIgdG8gQyBpbiBTLiAgKi8KKyNkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfcmF3bWVtY2hyIDEKK19fU1RSSU5HX0lOTElORSB2b2lkICpfX3Jhd21lbWNociAoY29uc3Qgdm9pZCAqX19zLCBpbnQgX19jKTsKKworI2lmbmRlZiBfRk9SQ0VfSU5MSU5FUworX19TVFJJTkdfSU5MSU5FIHZvaWQgKgorX19yYXdtZW1jaHIgKGNvbnN0IHZvaWQgKl9fcywgaW50IF9fYykKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMDsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgOiAiPUQiIChfX3JlcyksICI9JmMiIChfX2QwKQorICAgICA6ICJhIiAoX19jKSwgIjAiIChfX3MpLCAiMSIgKDB4ZmZmZmZmZmYpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fcykKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIF9fcmVzIC0gMTsKK30KKyMgaWZkZWYgX19VU0VfR05VCitfX1NUUklOR19JTkxJTkUgdm9pZCAqCityYXdtZW1jaHIgKGNvbnN0IHZvaWQgKl9fcywgaW50IF9fYykKK3sKKyAgcmV0dXJuIF9fcmF3bWVtY2hyIChfX3MsIF9fYyk7Cit9CisjIGVuZGlmCS8qIHVzZSBHTlUgKi8KKyNlbmRpZgorCisKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIFMuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9zdHJsZW4gMQorI2RlZmluZSBzdHJsZW4oc3RyKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3RyKQkJCQkgICAgICBcCisJCSAgPyBfX2J1aWx0aW5fc3RybGVuIChzdHIpCQkJCSAgICAgIFwKKwkJICA6IF9fc3RybGVuX2cgKHN0cikpKQorX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cmxlbl9nIChfX2NvbnN0IGNoYXIgKl9fc3RyKTsKKworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJsZW5fZyAoX19jb25zdCBjaGFyICpfX3N0cikKK3sKKyAgcmVnaXN0ZXIgY2hhciBfX2R1bW15OworICByZWdpc3RlciBfX2NvbnN0IGNoYXIgKl9fdG1wID0gX19zdHI7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCIxOlxuXHQiCisgICAgICJtb3ZiCSglMCksJWIxXG5cdCIKKyAgICAgImxlYWwJMSglMCksJTBcblx0IgorICAgICAidGVzdGIJJWIxLCViMVxuXHQiCisgICAgICJqbmUJMWIiCisgICAgIDogIj1yIiAoX190bXApLCAiPSZxIiAoX19kdW1teSkKKyAgICAgOiAiMCIgKF9fc3RyKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX3N0cikKKyAgICAgOiAiY2MiICk7CisgIHJldHVybiBfX3RtcCAtIF9fc3RyIC0gMTsKK30KKworCisvKiBDb3B5IFNSQyB0byBERVNULiAgKi8KKyNkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyY3B5IDEKKyNkZWZpbmUgc3RyY3B5KGRlc3QsIHNyYykgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykJCQkJICAgICAgXAorCQkgID8gKHNpemVvZiAoKHNyYylbMF0pID09IDEgJiYgc3RybGVuIChzcmMpICsgMSA8PSA4CSAgICAgIFwKKwkJICAgICA/IF9fc3RyY3B5X2Ffc21hbGwgKChkZXN0KSwgKHNyYyksIHN0cmxlbiAoc3JjKSArIDEpICAgICBcCisJCSAgICAgOiAoY2hhciAqKSBtZW1jcHkgKChjaGFyICopIChkZXN0KSwJCSAgICAgIFwKKwkJCQkJKF9fY29uc3QgY2hhciAqKSAoc3JjKSwJCSAgICAgIFwKKwkJCQkJc3RybGVuIChzcmMpICsgMSkpCQkgICAgICBcCisJCSAgOiBfX3N0cmNweV9nICgoZGVzdCksIChzcmMpKSkpCisKKyNkZWZpbmUgX19zdHJjcHlfYV9zbWFsbChkZXN0LCBzcmMsIHNyY2xlbikgXAorICAoX19leHRlbnNpb25fXyAoeyBjaGFyICpfX2Rlc3QgPSAoZGVzdCk7CQkJCSAgICAgIFwKKwkJICAgIHVuaW9uIHsJCQkJCQkgICAgICBcCisJCSAgICAgIHVuc2lnbmVkIGludCBfX3VpOwkJCQkgICAgICBcCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3VzaTsJCQkJICAgICAgXAorCQkgICAgICB1bnNpZ25lZCBjaGFyIF9fdWM7CQkJCSAgICAgIFwKKwkJICAgICAgY2hhciBfX2M7CQkJCQkJICAgICAgXAorCQkgICAgfSAqX191ID0gKHZvaWQgKikgX19kZXN0OwkJCQkgICAgICBcCisJCSAgICBzd2l0Y2ggKHNyY2xlbikJCQkJCSAgICAgIFwKKwkJICAgICAgewkJCQkJCQkgICAgICBcCisJCSAgICAgIGNhc2UgMToJCQkJCQkgICAgICBcCisJCQlfX3UtPl9fdWMgPSAnXDAnOwkJCQkgICAgICBcCisJCQlicmVhazsJCQkJCQkgICAgICBcCisJCSAgICAgIGNhc2UgMjoJCQkJCQkgICAgICBcCisJCQlfX3UtPl9fdXNpID0gX19TVFJJTkdfU01BTExfR0VUMTYgKHNyYywgMCk7CSAgICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICAgIFwKKwkJICAgICAgY2FzZSAzOgkJCQkJCSAgICAgIFwKKwkJCV9fdS0+X191c2kgPSBfX1NUUklOR19TTUFMTF9HRVQxNiAoc3JjLCAwKTsJICAgICAgXAorCQkJX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CQkgICAgICBcCisJCQlfX3UtPl9fdWMgPSAnXDAnOwkJCQkgICAgICBcCisJCQlicmVhazsJCQkJCQkgICAgICBcCisJCSAgICAgIGNhc2UgNDoJCQkJCQkgICAgICBcCisJCQlfX3UtPl9fdWkgPSBfX1NUUklOR19TTUFMTF9HRVQzMiAoc3JjLCAwKTsJICAgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgICAgXAorCQkgICAgICBjYXNlIDU6CQkJCQkJICAgICAgXAorCQkJX191LT5fX3VpID0gX19TVFJJTkdfU01BTExfR0VUMzIgKHNyYywgMCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJICAgICAgXAorCQkJX191LT5fX3VjID0gJ1wwJzsJCQkJICAgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgICAgXAorCQkgICAgICBjYXNlIDY6CQkJCQkJICAgICAgXAorCQkJX191LT5fX3VpID0gX19TVFJJTkdfU01BTExfR0VUMzIgKHNyYywgMCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJICAgICAgXAorCQkJX191LT5fX3VzaSA9IF9fU1RSSU5HX1NNQUxMX0dFVDE2IChzcmMsIDQpOwkgICAgICBcCisJCQlicmVhazsJCQkJCQkgICAgICBcCisJCSAgICAgIGNhc2UgNzoJCQkJCQkgICAgICBcCisJCQlfX3UtPl9fdWkgPSBfX1NUUklOR19TTUFMTF9HRVQzMiAoc3JjLCAwKTsJICAgICAgXAorCQkJX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkgICAgICBcCisJCQlfX3UtPl9fdXNpID0gX19TVFJJTkdfU01BTExfR0VUMTYgKHNyYywgNCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOwkJICAgICAgXAorCQkJX191LT5fX3VjID0gJ1wwJzsJCQkJICAgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgICAgXAorCQkgICAgICBjYXNlIDg6CQkJCQkJICAgICAgXAorCQkJX191LT5fX3VpID0gX19TVFJJTkdfU01BTExfR0VUMzIgKHNyYywgMCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJICAgICAgXAorCQkJX191LT5fX3VpID0gX19TVFJJTkdfU01BTExfR0VUMzIgKHNyYywgNCk7CSAgICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICAgIFwKKwkJICAgICAgfQkJCQkJCQkgICAgICBcCisJCSAgICAoY2hhciAqKSBfX2Rlc3Q7IH0pKQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJjcHlfZyAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJjcHlfZyAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjKQoreworICByZWdpc3RlciBjaGFyICpfX3RtcCA9IF9fZGVzdDsKKyAgcmVnaXN0ZXIgY2hhciBfX2R1bW15OworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgKKyAgICAgIjE6XG5cdCIKKyAgICAgIm1vdmIJKCUwKSwlYjJcblx0IgorICAgICAibGVhbAkxKCUwKSwlMFxuXHQiCisgICAgICJtb3ZiCSViMiwoJTEpXG5cdCIKKyAgICAgImxlYWwJMSglMSksJTFcblx0IgorICAgICAidGVzdGIJJWIyLCViMlxuXHQiCisgICAgICJqbmUJMWIiCisgICAgIDogIj0mciIgKF9fc3JjKSwgIj0mciIgKF9fdG1wKSwgIj0mcSIgKF9fZHVtbXkpLAorICAgICAgICI9bSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX2Rlc3QpCisgICAgIDogIjAiIChfX3NyYyksICIxIiAoX190bXApLAorICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fc3JjKQorICAgICA6ICJjYyIpOworICByZXR1cm4gX19kZXN0OworfQorCisKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX3N0cGNweSAxCisvKiBDb3B5IFNSQyB0byBERVNULiAgKi8KKyMgZGVmaW5lIF9fc3RwY3B5KGRlc3QsIHNyYykgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykJCQkJICAgICAgXAorCQkgID8gKHN0cmxlbiAoc3JjKSArIDEgPD0gOAkJCQkgICAgICBcCisJCSAgICAgPyBfX3N0cGNweV9hX3NtYWxsICgoZGVzdCksIChzcmMpLCBzdHJsZW4gKHNyYykgKyAxKSAgICAgXAorCQkgICAgIDogX19zdHBjcHlfYyAoKGRlc3QpLCAoc3JjKSwgc3RybGVuIChzcmMpICsgMSkpCSAgICAgIFwKKwkJICA6IF9fc3RwY3B5X2cgKChkZXN0KSwgKHNyYykpKSkKKyMgZGVmaW5lIF9fc3RwY3B5X2MoZGVzdCwgc3JjLCBzcmNsZW4pIFwKKyAgKChzcmNsZW4pICUgNCA9PSAwCQkJCQkJCSAgICAgIFwKKyAgID8gX19tZW1wY3B5X2J5NCAoZGVzdCwgc3JjLCBzcmNsZW4pIC0gMQkJCQkgICAgICBcCisgICA6ICgoc3JjbGVuKSAlIDIgPT0gMAkJCQkJCQkgICAgICBcCisgICAgICA/IF9fbWVtcGNweV9ieTIgKGRlc3QsIHNyYywgc3JjbGVuKSAtIDEJCQkJICAgICAgXAorICAgICAgOiBfX21lbXBjcHlfYnluIChkZXN0LCBzcmMsIHNyY2xlbikgLSAxKSkKKworLyogSW4gZ2xpYmMgaXRzZWxmIHdlIHVzZSB0aGlzIHN5bWJvbCBmb3IgbmFtZXNwYWNlIHJlYXNvbnMuICAqLworIyBkZWZpbmUgc3RwY3B5KGRlc3QsIHNyYykgX19zdHBjcHkgKChkZXN0KSwgKHNyYykpCisKKyMgZGVmaW5lIF9fc3RwY3B5X2Ffc21hbGwoZGVzdCwgc3JjLCBzcmNsZW4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgdW5pb24gewkJCQkJCSAgICAgIFwKKwkJICAgICAgdW5zaWduZWQgaW50IF9fdWk7CQkJCSAgICAgIFwKKwkJICAgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdXNpOwkJCQkgICAgICBcCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgX191YzsJCQkJICAgICAgXAorCQkgICAgICBjaGFyIF9fYzsJCQkJCQkgICAgICBcCisJCSAgICB9ICpfX3UgPSAodm9pZCAqKSAoZGVzdCk7CQkJCSAgICAgIFwKKwkJICAgIHN3aXRjaCAoc3JjbGVuKQkJCQkJICAgICAgXAorCQkgICAgICB7CQkJCQkJCSAgICAgIFwKKwkJICAgICAgY2FzZSAxOgkJCQkJCSAgICAgIFwKKwkJCV9fdS0+X191YyA9ICdcMCc7CQkJCSAgICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICAgIFwKKwkJICAgICAgY2FzZSAyOgkJCQkJCSAgICAgIFwKKwkJCV9fdS0+X191c2kgPSBfX1NUUklOR19TTUFMTF9HRVQxNiAoc3JjLCAwKTsJICAgICAgXAorCQkJX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMSk7CQkgICAgICBcCisJCQlicmVhazsJCQkJCQkgICAgICBcCisJCSAgICAgIGNhc2UgMzoJCQkJCQkgICAgICBcCisJCQlfX3UtPl9fdXNpID0gX19TVFJJTkdfU01BTExfR0VUMTYgKHNyYywgMCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOwkJICAgICAgXAorCQkJX191LT5fX3VjID0gJ1wwJzsJCQkJICAgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgICAgXAorCQkgICAgICBjYXNlIDQ6CQkJCQkJICAgICAgXAorCQkJX191LT5fX3VpID0gX19TVFJJTkdfU01BTExfR0VUMzIgKHNyYywgMCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDMpOwkJICAgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgICAgXAorCQkgICAgICBjYXNlIDU6CQkJCQkJICAgICAgXAorCQkJX191LT5fX3VpID0gX19TVFJJTkdfU01BTExfR0VUMzIgKHNyYywgMCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJICAgICAgXAorCQkJX191LT5fX3VjID0gJ1wwJzsJCQkJICAgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgICAgXAorCQkgICAgICBjYXNlIDY6CQkJCQkJICAgICAgXAorCQkJX191LT5fX3VpID0gX19TVFJJTkdfU01BTExfR0VUMzIgKHNyYywgMCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJICAgICAgXAorCQkJX191LT5fX3VzaSA9IF9fU1RSSU5HX1NNQUxMX0dFVDE2IChzcmMsIDQpOwkgICAgICBcCisJCQlfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsJCSAgICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICAgIFwKKwkJICAgICAgY2FzZSA3OgkJCQkJCSAgICAgIFwKKwkJCV9fdS0+X191aSA9IF9fU1RSSU5HX1NNQUxMX0dFVDMyIChzcmMsIDApOwkgICAgICBcCisJCQlfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCSAgICAgIFwKKwkJCV9fdS0+X191c2kgPSBfX1NUUklOR19TTUFMTF9HRVQxNiAoc3JjLCA0KTsJICAgICAgXAorCQkJX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CQkgICAgICBcCisJCQlfX3UtPl9fdWMgPSAnXDAnOwkJCQkgICAgICBcCisJCQlicmVhazsJCQkJCQkgICAgICBcCisJCSAgICAgIGNhc2UgODoJCQkJCQkgICAgICBcCisJCQlfX3UtPl9fdWkgPSBfX1NUUklOR19TTUFMTF9HRVQzMiAoc3JjLCAwKTsJICAgICAgXAorCQkJX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkgICAgICBcCisJCQlfX3UtPl9fdWkgPSBfX1NUUklOR19TTUFMTF9HRVQzMiAoc3JjLCA0KTsJICAgICAgXAorCQkJX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMyk7CQkgICAgICBcCisJCQlicmVhazsJCQkJCQkgICAgICBcCisJCSAgICAgIH0JCQkJCQkJICAgICAgXAorCQkgICAgKGNoYXIgKikgX191OyB9KSkKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fbWVtcGNweV9ieTQgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYywKKwkJCQkgICAgIHNpemVfdCBfX3NyY2xlbik7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fbWVtcGNweV9ieTQgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYywgc2l6ZV90IF9fc3JjbGVuKQoreworICByZWdpc3RlciBjaGFyICpfX3RtcCA9IF9fZGVzdDsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMTsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIjE6XG5cdCIKKyAgICAgIm1vdmwJKCUyKSwlMFxuXHQiCisgICAgICJsZWFsCTQoJTIpLCUyXG5cdCIKKyAgICAgIm1vdmwJJTAsKCUxKVxuXHQiCisgICAgICJsZWFsCTQoJTEpLCUxXG5cdCIKKyAgICAgImRlY2wJJTNcblx0IgorICAgICAiam56CTFiIgorICAgICA6ICI9JnIiIChfX2QwKSwgIj1yIiAoX190bXApLCAiPSZyIiAoX19zcmMpLCAiPSZyIiAoX19kMSkKKyAgICAgOiAiMSIgKF9fdG1wKSwgIjIiIChfX3NyYyksICIzIiAoX19zcmNsZW4gLyA0KQorICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19tZW1wY3B5X2J5MiAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjLAorCQkJCSAgICAgc2l6ZV90IF9fc3JjbGVuKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19tZW1wY3B5X2J5MiAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjLCBzaXplX3QgX19zcmNsZW4pCit7CisgIHJlZ2lzdGVyIGNoYXIgKl9fdG1wID0gX19kZXN0OworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgic2hybAkkMSwlM1xuXHQiCisgICAgICJqegkyZlxuIiAgICAgICAgICAgICAgICAgLyogb25seSBhIHdvcmQgKi8KKyAgICAgIjE6XG5cdCIKKyAgICAgIm1vdmwJKCUyKSwlMFxuXHQiCisgICAgICJsZWFsCTQoJTIpLCUyXG5cdCIKKyAgICAgIm1vdmwJJTAsKCUxKVxuXHQiCisgICAgICJsZWFsCTQoJTEpLCUxXG5cdCIKKyAgICAgImRlY2wJJTNcblx0IgorICAgICAiam56CTFiXG4iCisgICAgICIyOlxuXHQiCisgICAgICJtb3Z3CSglMiksJXcwXG5cdCIKKyAgICAgIm1vdncJJXcwLCglMSkiCisgICAgIDogIj0mcSIgKF9fZDApLCAiPXIiIChfX3RtcCksICI9JnIiIChfX3NyYyksICI9JnIiIChfX2QxKSwKKyAgICAgICAiPW0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fc3JjbGVuXTsgfSAqKV9fZGVzdCkKKyAgICAgOiAiMSIgKF9fdG1wKSwgIjIiIChfX3NyYyksICIzIiAoX19zcmNsZW4gLyAyKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19zcmNsZW5dOyB9ICopX19zcmMpCisgICAgIDogImNjIik7CisgIHJldHVybiBfX3RtcCArIDI7Cit9CisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX21lbXBjcHlfYnluIChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19zcmMsCisJCQkJICAgICBzaXplX3QgX19zcmNsZW4pOworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX21lbXBjcHlfYnluIChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19zcmMsIHNpemVfdCBfX3NyY2xlbikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2QwLCBfX2QxOworICByZWdpc3RlciBjaGFyICpfX3RtcCA9IF9fZGVzdDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoImNsZFxuXHQiCisgICAgICJzaHJsCSQxLCUlZWN4XG5cdCIKKyAgICAgImpuYwkxZlxuXHQiCisgICAgICJtb3ZzYlxuIgorICAgICAiMTpcblx0IgorICAgICAic2hybAkkMSwlJWVjeFxuXHQiCisgICAgICJqbmMJMmZcblx0IgorICAgICAibW92c3dcbiIKKyAgICAgIjI6XG5cdCIKKyAgICAgInJlcDsgbW92c2wiCisgICAgIDogIj1EIiAoX190bXApLCAiPSZjIiAoX19kMCksICI9JlMiIChfX2QxKSwKKyAgICAgICAiPW0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fc3JjbGVuXTsgfSAqKV9fZGVzdCkKKyAgICAgOiAiMCIgKF9fdG1wKSwgIjEiIChfX3NyY2xlbiksICIyIiAoX19zcmMpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX3NyY2xlbl07IH0gKilfX3NyYykKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIF9fdG1wOworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHBjcHlfZyAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHBjcHlfZyAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjKQoreworICByZWdpc3RlciBjaGFyICpfX3RtcCA9IF9fZGVzdDsKKyAgcmVnaXN0ZXIgY2hhciBfX2R1bW15OworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgKKyAgICAgIjE6XG5cdCIKKyAgICAgIm1vdmIJKCUwKSwlYjJcblx0IgorICAgICAibGVhbAkxKCUwKSwlMFxuXHQiCisgICAgICJtb3ZiCSViMiwoJTEpXG5cdCIKKyAgICAgImxlYWwJMSglMSksJTFcblx0IgorICAgICAidGVzdGIJJWIyLCViMlxuXHQiCisgICAgICJqbmUJMWIiCisgICAgIDogIj0mciIgKF9fc3JjKSwgIj1yIiAoX190bXApLCAiPSZxIiAoX19kdW1teSksCisgICAgICAgIj1tIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fZGVzdCkKKyAgICAgOiAiMCIgKF9fc3JjKSwgIjEiIChfX3RtcCksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19zcmMpCisgICAgIDogImNjIik7CisgIHJldHVybiBfX3RtcCAtIDE7Cit9CisjZW5kaWYKKworCisvKiBDb3B5IG5vIG1vcmUgdGhhbiBOIGNoYXJhY3RlcnMgb2YgU1JDIHRvIERFU1QuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9zdHJuY3B5IDEKKyNkZWZpbmUgc3RybmNweShkZXN0LCBzcmMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpCQkJCSAgICAgIFwKKwkJICA/ICgoc3RybGVuIChzcmMpICsgMSA+PSAoKHNpemVfdCkgKG4pKQkJICAgICAgXAorCQkgICAgICA/IChjaGFyICopIG1lbWNweSAoKGNoYXIgKikgKGRlc3QpLAkJICAgICAgXAorCQkJCQkgKF9fY29uc3QgY2hhciAqKSAoc3JjKSwgbikJICAgICAgXAorCQkgICAgICA6IF9fc3RybmNweV9jZyAoKGRlc3QpLCAoc3JjKSwgc3RybGVuIChzcmMpICsgMSwgbikpKSAgIFwKKwkJICA6IF9fc3RybmNweV9nZyAoKGRlc3QpLCAoc3JjKSwgbikpKQorI2RlZmluZSBfX3N0cm5jcHlfY2coZGVzdCwgc3JjLCBzcmNsZW4sIG4pIFwKKyAgKCgoc3JjbGVuKSAlIDQgPT0gMCkJCQkJCQkJICAgICAgXAorICAgPyBfX3N0cm5jcHlfYnk0IChkZXN0LCBzcmMsIHNyY2xlbiwgbikJCQkJICAgICAgXAorICAgOiAoKChzcmNsZW4pICUgMiA9PSAwKQkJCQkJCSAgICAgIFwKKyAgICAgID8gX19zdHJuY3B5X2J5MiAoZGVzdCwgc3JjLCBzcmNsZW4sIG4pCQkJCSAgICAgIFwKKyAgICAgIDogX19zdHJuY3B5X2J5biAoZGVzdCwgc3JjLCBzcmNsZW4sIG4pKSkKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RybmNweV9ieTQgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyIF9fc3JjW10sCisJCQkJICAgICBzaXplX3QgX19zcmNsZW4sIHNpemVfdCBfX24pOworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cm5jcHlfYnk0IChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciBfX3NyY1tdLCBzaXplX3QgX19zcmNsZW4sIHNpemVfdCBfX24pCit7CisgIHJlZ2lzdGVyIGNoYXIgKl9fdG1wID0gX19kZXN0OworICByZWdpc3RlciBpbnQgX19kdW1teTEsIF9fZHVtbXkyOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiMTpcblx0IgorICAgICAibW92bAkoJTIpLCUwXG5cdCIKKyAgICAgImxlYWwJNCglMiksJTJcblx0IgorICAgICAibW92bAklMCwoJTEpXG5cdCIKKyAgICAgImxlYWwJNCglMSksJTFcblx0IgorICAgICAiZGVjbAklM1xuXHQiCisgICAgICJqbnoJMWIiCisgICAgIDogIj0mciIgKF9fZHVtbXkxKSwgIj1yIiAoX190bXApLCAiPSZyIiAoX19zcmMpLCAiPSZyIiAoX19kdW1teTIpLAorICAgICAgICI9bSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19zcmNsZW5dOyB9ICopX19kZXN0KQorICAgICA6ICIxIiAoX190bXApLCAiMiIgKF9fc3JjKSwgIjMiIChfX3NyY2xlbiAvIDQpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX3NyY2xlbl07IH0gKilfX3NyYykKKyAgICAgOiAiY2MiKTsKKyAgKHZvaWQpIG1lbXNldCAoX190bXAsICdcMCcsIF9fbiAtIF9fc3JjbGVuKTsKKyAgcmV0dXJuIF9fZGVzdDsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RybmNweV9ieTIgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyIF9fc3JjW10sCisJCQkJICAgICBzaXplX3QgX19zcmNsZW4sIHNpemVfdCBfX24pOworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cm5jcHlfYnkyIChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciBfX3NyY1tdLCBzaXplX3QgX19zcmNsZW4sIHNpemVfdCBfX24pCit7CisgIHJlZ2lzdGVyIGNoYXIgKl9fdG1wID0gX19kZXN0OworICByZWdpc3RlciBpbnQgX19kdW1teTEsIF9fZHVtbXkyOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgic2hybAkkMSwlM1xuXHQiCisgICAgICJqegkyZlxuIiAgICAgICAgICAgICAgICAgLyogb25seSBhIHdvcmQgKi8KKyAgICAgIjE6XG5cdCIKKyAgICAgIm1vdmwJKCUyKSwlMFxuXHQiCisgICAgICJsZWFsCTQoJTIpLCUyXG5cdCIKKyAgICAgIm1vdmwJJTAsKCUxKVxuXHQiCisgICAgICJsZWFsCTQoJTEpLCUxXG5cdCIKKyAgICAgImRlY2wJJTNcblx0IgorICAgICAiam56CTFiXG4iCisgICAgICIyOlxuXHQiCisgICAgICJtb3Z3CSglMiksJXcwXG5cdCIKKyAgICAgIm1vdncJJXcwLCglMSlcblx0IgorICAgICA6ICI9JnEiIChfX2R1bW15MSksICI9ciIgKF9fdG1wKSwgIj0mciIgKF9fc3JjKSwgIj0mciIgKF9fZHVtbXkyKSwKKyAgICAgICAiPW0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fc3JjbGVuXTsgfSAqKV9fZGVzdCkKKyAgICAgOiAiMSIgKF9fdG1wKSwgIjIiIChfX3NyYyksICIzIiAoX19zcmNsZW4gLyAyKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19zcmNsZW5dOyB9ICopX19zcmMpCisgICAgIDogImNjIik7CisgICh2b2lkKSBtZW1zZXQgKF9fdG1wICsgMiwgJ1wwJywgX19uIC0gX19zcmNsZW4pOworICByZXR1cm4gX19kZXN0OworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJuY3B5X2J5biAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgX19zcmNbXSwKKwkJCQkgICAgIHNpemVfdCBfX3NyY2xlbiwgc2l6ZV90IF9fbik7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RybmNweV9ieW4gKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyIF9fc3JjW10sIHNpemVfdCBfX3NyY2xlbiwgc2l6ZV90IF9fbikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMTsKKyAgcmVnaXN0ZXIgY2hhciAqX190bXAgPSBfX2Rlc3Q7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcblx0IgorICAgICAic2hybAkkMSwlMVxuXHQiCisgICAgICJqbmMJMWZcblx0IgorICAgICAibW92c2JcbiIKKyAgICAgIjE6XG5cdCIKKyAgICAgInNocmwJJDEsJTFcblx0IgorICAgICAiam5jCTJmXG5cdCIKKyAgICAgIm1vdnN3XG4iCisgICAgICIyOlxuXHQiCisgICAgICJyZXA7IG1vdnNsIgorICAgICA6ICI9RCIgKF9fdG1wKSwgIj0mYyIgKF9fZDApLCAiPSZTIiAoX19kMSksCisgICAgICAgIj1tIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX3NyY2xlbl07IH0gKilfX2Rlc3QpCisgICAgIDogIjEiIChfX3NyY2xlbiksICIwIiAoX190bXApLCIyIiAoX19zcmMpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX3NyY2xlbl07IH0gKilfX3NyYykKKyAgICAgOiAiY2MiKTsKKyAgKHZvaWQpIG1lbXNldCAoX190bXAsICdcMCcsIF9fbiAtIF9fc3JjbGVuKTsKKyAgcmV0dXJuIF9fZGVzdDsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RybmNweV9nZyAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjLAorCQkJCSAgICBzaXplX3QgX19uKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJuY3B5X2dnIChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19zcmMsIHNpemVfdCBfX24pCit7CisgIHJlZ2lzdGVyIGNoYXIgKl9fdG1wID0gX19kZXN0OworICByZWdpc3RlciBjaGFyIF9fZHVtbXk7CisgIGlmIChfX24gPiAwKQorICAgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgICAoIjE6XG5cdCIKKyAgICAgICAibW92YgkoJTApLCUyXG5cdCIKKyAgICAgICAiaW5jbAklMFxuXHQiCisgICAgICAgIm1vdmIJJTIsKCUxKVxuXHQiCisgICAgICAgImluY2wJJTFcblx0IgorICAgICAgICJkZWNsCSUzXG5cdCIKKyAgICAgICAiamUJM2Zcblx0IgorICAgICAgICJ0ZXN0YgklMiwlMlxuXHQiCisgICAgICAgImpuZQkxYlxuXHQiCisgICAgICAgIjI6XG5cdCIKKyAgICAgICAibW92YgklMiwoJTEpXG5cdCIKKyAgICAgICAiaW5jbAklMVxuXHQiCisgICAgICAgImRlY2wJJTNcblx0IgorICAgICAgICJqbmUJMmJcblx0IgorICAgICAgICIzOiIKKyAgICAgICA6ICI9JnIiIChfX3NyYyksICI9JnIiIChfX3RtcCksICI9JnEiIChfX2R1bW15KSwgIj0mciIgKF9fbikKKyAgICAgICA6ICIwIiAoX19zcmMpLCAiMSIgKF9fdG1wKSwgIjMiIChfX24pCisgICAgICAgOiAibWVtb3J5IiwgImNjIik7CisKKyAgcmV0dXJuIF9fZGVzdDsKK30KKworCisvKiBBcHBlbmQgU1JDIG9udG8gREVTVC4gICovCisjZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX3N0cmNhdCAxCisjZGVmaW5lIHN0cmNhdChkZXN0LCBzcmMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpCQkJCSAgICAgIFwKKwkJICA/IF9fc3RyY2F0X2MgKChkZXN0KSwgKHNyYyksIHN0cmxlbiAoc3JjKSArIDEpCSAgICAgIFwKKwkJICA6IF9fc3RyY2F0X2cgKChkZXN0KSwgKHNyYykpKSkKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RyY2F0X2MgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyIF9fc3JjW10sCisJCQkJICBzaXplX3QgX19zcmNsZW4pOworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cmNhdF9jIChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciBfX3NyY1tdLCBzaXplX3QgX19zcmNsZW4pCit7CisjaWZkZWYgX19pNjg2X18KKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMDsKKyAgcmVnaXN0ZXIgY2hhciAqX190bXA7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJyZXBuZTsgc2Nhc2IiCisgICAgIDogIj1EIiAoX190bXApLCAiPSZjIiAoX19kMCksCisgICAgICAgIj1tIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fZGVzdCkKKyAgICAgOiAiMCIgKF9fZGVzdCksICIxIiAoMHhmZmZmZmZmZiksICJhIiAoMCksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fc3JjbGVuXTsgfSAqKV9fc3JjKQorICAgICA6ICJjYyIpOworICAtLV9fdG1wOworI2Vsc2UKKyAgcmVnaXN0ZXIgY2hhciAqX190bXAgPSBfX2Rlc3QgLSAxOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiMTpcblx0IgorICAgICAiaW5jbAklMFxuXHQiCisgICAgICJjbXBiCSQwLCglMClcblx0IgorICAgICAiam5lCTFiXG4iCisgICAgIDogIj1yIiAoX190bXApLAorICAgICAgICI9bSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX2Rlc3QpCisgICAgIDogIjAiIChfX3RtcCksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fc3JjbGVuXTsgfSAqKV9fc3JjKQorICAgICA6ICJjYyIpOworI2VuZGlmCisgICh2b2lkKSBtZW1jcHkgKF9fdG1wLCBfX3NyYywgX19zcmNsZW4pOworICByZXR1cm4gX19kZXN0OworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJjYXRfZyAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJjYXRfZyAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjKQoreworICByZWdpc3RlciBjaGFyICpfX3RtcCA9IF9fZGVzdCAtIDE7CisgIHJlZ2lzdGVyIGNoYXIgX19kdW1teTsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIjE6XG5cdCIKKyAgICAgImluY2wJJTFcblx0IgorICAgICAiY21wYgkkMCwoJTEpXG5cdCIKKyAgICAgImpuZQkxYlxuIgorICAgICAiMjpcblx0IgorICAgICAibW92YgkoJTIpLCViMFxuXHQiCisgICAgICJpbmNsCSUyXG5cdCIKKyAgICAgIm1vdmIJJWIwLCglMSlcblx0IgorICAgICAiaW5jbAklMVxuXHQiCisgICAgICJ0ZXN0YgklYjAsJWIwXG5cdCIKKyAgICAgImpuZQkyYlxuIgorICAgICA6ICI9JnEiIChfX2R1bW15KSwgIj0mciIgKF9fdG1wKSwgIj0mciIgKF9fc3JjKSwKKyAgICAgICAiPW0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19kZXN0KQorICAgICA6ICIxIiAgKF9fdG1wKSwgIjIiICAoX19zcmMpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fc3JjKQorICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyAgcmV0dXJuIF9fZGVzdDsKK30KKworCisvKiBBcHBlbmQgbm8gbW9yZSB0aGFuIE4gY2hhcmFjdGVycyBmcm9tIFNSQyBvbnRvIERFU1QuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9zdHJuY2F0IDEKKyNkZWZpbmUgc3RybmNhdChkZXN0LCBzcmMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgY2hhciAqX19kZXN0ID0gKGRlc3QpOwkJCQkgICAgICBcCisJCSAgICBfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgICAgXAorCQkgICAgPyAoc3RybGVuIChzcmMpIDwgKChzaXplX3QpIChuKSkJCQkgICAgICBcCisJCSAgICAgICA/IHN0cmNhdCAoX19kZXN0LCAoc3JjKSkJCQkJICAgICAgXAorCQkgICAgICAgOiAoKihjaGFyICopX19tZW1wY3B5IChzdHJjaHIgKF9fZGVzdCwgJ1wwJyksCSAgICAgIFwKKwkJCQkJICAgICAgIChfX2NvbnN0IGNoYXIgKikgKHNyYyksCSAgICAgIFwKKwkJCQkJICAgICAgKG4pKSA9IDAsIF9fZGVzdCkpCSAgICAgIFwKKwkJICAgIDogX19zdHJuY2F0X2cgKF9fZGVzdCwgKHNyYyksIChuKSk7IH0pKQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJuY2F0X2cgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyIF9fc3JjW10sCisJCQkJICAgc2l6ZV90IF9fbik7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RybmNhdF9nIChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciBfX3NyY1tdLCBzaXplX3QgX19uKQoreworICByZWdpc3RlciBjaGFyICpfX3RtcCA9IF9fZGVzdDsKKyAgcmVnaXN0ZXIgY2hhciBfX2R1bW15OworI2lmZGVmIF9faTY4Nl9fCisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJyZXBuZTsgc2Nhc2JcbiIKKyAgICAgIm1vdmwgJTQsICUzXG5cdCIKKyAgICAgImRlY2wgJTFcblx0IgorICAgICAiMTpcblx0IgorICAgICAic3VibAkkMSwlM1xuXHQiCisgICAgICJqYwkyZlxuXHQiCisgICAgICJtb3ZiCSglMiksJWIwXG5cdCIKKyAgICAgIm1vdnNiXG5cdCIKKyAgICAgInRlc3RiCSViMCwlYjBcblx0IgorICAgICAiam5lCTFiXG5cdCIKKyAgICAgImRlY2wJJTFcbiIKKyAgICAgIjI6XG5cdCIKKyAgICAgIm1vdmIJJDAsKCUxKSIKKyAgICAgOiAiPSZhIiAoX19kdW1teSksICI9JkQiIChfX3RtcCksICI9JlMiIChfX3NyYyksICI9JmMiIChfX24pCisgICAgIDogICJnIiAoX19uKSwgIjAiICgwKSwgIjEiIChfX3RtcCksICIyIiAoX19zcmMpLCAiMyIgKDB4ZmZmZmZmZmYpCisgICAgIDogIm1lbW9yeSIsICJjYyIpOworI2Vsc2UKKyAgLS1fX3RtcDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIjE6XG5cdCIKKyAgICAgImNtcGIJJDAsMSglMSlcblx0IgorICAgICAibGVhbAkxKCUxKSwlMVxuXHQiCisgICAgICJqbmUJMWJcbiIKKyAgICAgIjI6XG5cdCIKKyAgICAgInN1YmwJJDEsJTNcblx0IgorICAgICAiamMJM2Zcblx0IgorICAgICAibW92YgkoJTIpLCViMFxuXHQiCisgICAgICJsZWFsCTEoJTIpLCUyXG5cdCIKKyAgICAgIm1vdmIJJWIwLCglMSlcblx0IgorICAgICAibGVhbAkxKCUxKSwlMVxuXHQiCisgICAgICJ0ZXN0YgklYjAsJWIwXG5cdCIKKyAgICAgImpuZQkyYlxuXHQiCisgICAgICJkZWNsCSUxXG4iCisgICAgICIzOlxuXHQiCisgICAgICJtb3ZiCSQwLCglMSkiCisgICAgIDogIj0mcSIgKF9fZHVtbXkpLCAiPSZyIiAoX190bXApLCAiPSZyIiAoX19zcmMpLCAiPSZyIiAoX19uKQorICAgICA6ICIxIiAoX190bXApLCAiMiIgKF9fc3JjKSwgIjMiIChfX24pCisgICAgIDogIm1lbW9yeSIsICJjYyIpOworI2VuZGlmCisgIHJldHVybiBfX2Rlc3Q7Cit9CisKKworLyogQ29tcGFyZSBTMSBhbmQgUzIuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjbXAgMQorI2RlZmluZSBzdHJjbXAoczEsIHMyKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpICYmIF9fYnVpbHRpbl9jb25zdGFudF9wIChzMikgICAgICBcCisJCSAgJiYgKHNpemVvZiAoKHMxKVswXSkgIT0gMSB8fCBzdHJsZW4gKHMxKSA+PSA0KQkgICAgICBcCisJCSAgJiYgKHNpemVvZiAoKHMyKVswXSkgIT0gMSB8fCBzdHJsZW4gKHMyKSA+PSA0KQkgICAgICBcCisJCSAgPyBtZW1jbXAgKChfX2NvbnN0IGNoYXIgKikgKHMxKSwgKF9fY29uc3QgY2hhciAqKSAoczIpLCAgICAgXAorCQkJICAgIChzdHJsZW4gKHMxKSA8IHN0cmxlbiAoczIpCQkJICAgICAgXAorCQkJICAgICA/IHN0cmxlbiAoczEpIDogc3RybGVuIChzMikpICsgMSkJCSAgICAgIFwKKwkJICA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpICYmIHNpemVvZiAoKHMxKVswXSkgPT0gMQkgICAgICBcCisJCSAgICAgJiYgc2l6ZW9mICgoczIpWzBdKSA9PSAxICYmIHN0cmxlbiAoczEpIDwgNAkgICAgICBcCisJCSAgICAgPyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKSAmJiBzaXplb2YgKChzMilbMF0pID09IDEgICAgXAorCQkJPyBfX3N0cmNtcF9jYyAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoczEpLAkgICAgICBcCisJCQkJICAgICAgIChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKHMyKSwJICAgICAgXAorCQkJCSAgICAgICBzdHJsZW4gKHMxKSkJCQkgICAgICBcCisJCQk6IF9fc3RyY21wX2NnICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChzMSksCSAgICAgIFwKKwkJCQkgICAgICAgKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoczIpLAkgICAgICBcCisJCQkJICAgICAgIHN0cmxlbiAoczEpKSkJCQkgICAgICBcCisJCSAgICAgOiAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKSAmJiBzaXplb2YgKChzMSlbMF0pID09IDEgICAgXAorCQkJJiYgc2l6ZW9mICgoczIpWzBdKSA9PSAxICYmIHN0cmxlbiAoczIpIDwgNAkgICAgICBcCisJCQk/IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpCQkJICAgICAgXAorCQkJICAgPyBfX3N0cmNtcF9jYyAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoczEpLCAgICAgXAorCQkJCQkgIChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKHMyKSwgICAgIFwKKwkJCQkJICBzdHJsZW4gKHMyKSkJCQkgICAgICBcCisJCQkgICA6IF9fc3RyY21wX2djICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChzMSksICAgICBcCisJCQkJCSAgKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoczIpLCAgICAgXAorCQkJCQkgIHN0cmxlbiAoczIpKSkJCQkgICAgICBcCisJCQk6IF9fc3RyY21wX2dnICgoczEpLCAoczIpKSkpKSkKKworI2RlZmluZSBfX3N0cmNtcF9jYyhzMSwgczIsIGwpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgcmVnaXN0ZXIgaW50IF9fcmVzdWx0ID0gKHMxKVswXSAtIChzMilbMF07CQkgICAgICBcCisJCSAgICBpZiAobCA+IDAgJiYgX19yZXN1bHQgPT0gMCkJCQkJICAgICAgXAorCQkgICAgICB7CQkJCQkJCSAgICAgIFwKKwkJCV9fcmVzdWx0ID0gKHMxKVsxXSAtIChzMilbMV07CQkJICAgICAgXAorCQkJaWYgKGwgPiAxICYmIF9fcmVzdWx0ID09IDApCQkJICAgICAgXAorCQkJICB7CQkJCQkJICAgICAgXAorCQkJICAgIF9fcmVzdWx0ID0gKHMxKVsyXSAtIChzMilbMl07CQkgICAgICBcCisJCQkgICAgaWYgKGwgPiAyICYmIF9fcmVzdWx0ID09IDApCQkJICAgICAgXAorCQkJICAgICAgX19yZXN1bHQgPSAoczEpWzNdIC0gKHMyKVszXTsJCSAgICAgIFwKKwkJCSAgfQkJCQkJCSAgICAgIFwKKwkJICAgICAgfQkJCQkJCQkgICAgICBcCisJCSAgICBfX3Jlc3VsdDsgfSkpCisKKyNkZWZpbmUgX19zdHJjbXBfY2coczEsIHMyLCBsMSkgXAorICAoX19leHRlbnNpb25fXyAoeyBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKl9fczIgPSAoczIpOwkJCSAgICAgIFwKKwkJICAgIHJlZ2lzdGVyIGludCBfX3Jlc3VsdCA9IChzMSlbMF0gLSBfX3MyWzBdOwkJICAgICAgXAorCQkgICAgaWYgKGwxID4gMCAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJICAgICAgewkJCQkJCQkgICAgICBcCisJCQlfX3Jlc3VsdCA9IChzMSlbMV0gLSBfX3MyWzFdOwkJCSAgICAgIFwKKwkJCWlmIChsMSA+IDEgJiYgX19yZXN1bHQgPT0gMCkJCQkgICAgICBcCisJCQkgIHsJCQkJCQkgICAgICBcCisJCQkgICAgX19yZXN1bHQgPSAoczEpWzJdIC0gX19zMlsyXTsJCSAgICAgIFwKKwkJCSAgICBpZiAobDEgPiAyICYmIF9fcmVzdWx0ID09IDApCQkgICAgICBcCisJCQkgICAgICBfX3Jlc3VsdCA9IChzMSlbM10gLSBfX3MyWzNdOwkJICAgICAgXAorCQkJICB9CQkJCQkJICAgICAgXAorCQkgICAgICB9CQkJCQkJCSAgICAgIFwKKwkJICAgIF9fcmVzdWx0OyB9KSkKKworI2RlZmluZSBfX3N0cmNtcF9nYyhzMSwgczIsIGwyKSBcCisgIChfX2V4dGVuc2lvbl9fICh7IF9fY29uc3QgdW5zaWduZWQgY2hhciAqX19zMSA9IChzMSk7CQkJICAgICAgXAorCQkgICAgcmVnaXN0ZXIgaW50IF9fcmVzdWx0ID0gX19zMVswXSAtIChzMilbMF07CQkgICAgICBcCisJCSAgICBpZiAobDIgPiAwICYmIF9fcmVzdWx0ID09IDApCQkJICAgICAgXAorCQkgICAgICB7CQkJCQkJCSAgICAgIFwKKwkJCV9fcmVzdWx0ID0gX19zMVsxXSAtIChzMilbMV07CQkJICAgICAgXAorCQkJaWYgKGwyID4gMSAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJCSAgewkJCQkJCSAgICAgIFwKKwkJCSAgICBfX3Jlc3VsdCA9IF9fczFbMl0gLSAoczIpWzJdOwkJICAgICAgXAorCQkJICAgIGlmIChsMiA+IDIgJiYgX19yZXN1bHQgPT0gMCkJCSAgICAgIFwKKwkJCSAgICAgIF9fcmVzdWx0ID0gX19zMVszXSAtIChzMilbM107CQkgICAgICBcCisJCQkgIH0JCQkJCQkgICAgICBcCisJCSAgICAgIH0JCQkJCQkJICAgICAgXAorCQkgICAgX19yZXN1bHQ7IH0pKQorCitfX1NUUklOR19JTkxJTkUgaW50IF9fc3RyY21wX2dnIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMik7CisKK19fU1RSSU5HX0lOTElORSBpbnQKK19fc3RyY21wX2dnIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMikKK3sKKyAgcmVnaXN0ZXIgaW50IF9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiMTpcblx0IgorICAgICAibW92YgkoJTEpLCViMFxuXHQiCisgICAgICJsZWFsCTEoJTEpLCUxXG5cdCIKKyAgICAgImNtcGIJJWIwLCglMilcblx0IgorICAgICAiam5lCTJmXG5cdCIKKyAgICAgImxlYWwJMSglMiksJTJcblx0IgorICAgICAidGVzdGIJJWIwLCViMFxuXHQiCisgICAgICJqbmUJMWJcblx0IgorICAgICAieG9ybAklMCwlMFxuXHQiCisgICAgICJqbXAJM2ZcbiIKKyAgICAgIjI6XG5cdCIKKyAgICAgIm1vdmwJJDEsJTBcblx0IgorICAgICAiamIJM2Zcblx0IgorICAgICAibmVnbAklMFxuIgorICAgICAiMzoiCisgICAgIDogIj1xIiAoX19yZXMpLCAiPSZyIiAoX19zMSksICI9JnIiIChfX3MyKQorICAgICA6ICIxIiAoX19zMSksICIyIiAoX19zMiksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19zMSksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19zMikKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIF9fcmVzOworfQorCisKKy8qIENvbXBhcmUgTiBjaGFyYWN0ZXJzIG9mIFMxIGFuZCBTMi4gICovCisjZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX3N0cm5jbXAgMQorI2RlZmluZSBzdHJuY21wKHMxLCBzMiwgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMxKSAmJiBzdHJsZW4gKHMxKSA8ICgoc2l6ZV90KSAobikpICAgXAorCQkgID8gc3RyY21wICgoczEpLCAoczIpKQkJCQkJICAgICAgXAorCQkgIDogKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMikgJiYgc3RybGVuIChzMikgPCAoKHNpemVfdCkgKG4pKVwKKwkJICAgICA/IHN0cmNtcCAoKHMxKSwgKHMyKSkJCQkJICAgICAgXAorCQkgICAgIDogX19zdHJuY21wX2cgKChzMSksIChzMiksIChuKSkpKSkKKworX19TVFJJTkdfSU5MSU5FIGludCBfX3N0cm5jbXBfZyAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsCisJCQkJIHNpemVfdCBfX24pOworCitfX1NUUklOR19JTkxJTkUgaW50CitfX3N0cm5jbXBfZyAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsIHNpemVfdCBfX24pCit7CisgIHJlZ2lzdGVyIGludCBfX3JlczsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIjE6XG5cdCIKKyAgICAgInN1YmwJJDEsJTNcblx0IgorICAgICAiamMJMmZcblx0IgorICAgICAibW92YgkoJTEpLCViMFxuXHQiCisgICAgICJpbmNsCSUxXG5cdCIKKyAgICAgImNtcGIJJWIwLCglMilcblx0IgorICAgICAiam5lCTNmXG5cdCIKKyAgICAgImluY2wJJTJcblx0IgorICAgICAidGVzdGIJJWIwLCViMFxuXHQiCisgICAgICJqbmUJMWJcbiIKKyAgICAgIjI6XG5cdCIKKyAgICAgInhvcmwJJTAsJTBcblx0IgorICAgICAiam1wCTRmXG4iCisgICAgICIzOlxuXHQiCisgICAgICJtb3ZsCSQxLCUwXG5cdCIKKyAgICAgImpiCTRmXG5cdCIKKyAgICAgIm5lZ2wJJTBcbiIKKyAgICAgIjQ6IgorICAgICA6ICI9cSIgKF9fcmVzKSwgIj0mciIgKF9fczEpLCAiPSZyIiAoX19zMiksICI9JnIiIChfX24pCisgICAgIDogIjEiICAoX19zMSksICIyIiAgKF9fczIpLCAgIjMiIChfX24pLAorICAgICAgICJtIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX25dOyB9ICopX19zMSksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX3MyKQorICAgICA6ICJjYyIpOworICByZXR1cm4gX19yZXM7Cit9CisKKworLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBDIGluIFMuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjaHIgMQorI2RlZmluZSBfVVNFX1NUUklOR19BUkNIX3N0cmNociAxCisjZGVmaW5lIHN0cmNocihzLCBjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYykJCQkJICAgICAgXAorCQkgID8gKChjKSA9PSAnXDAnCQkJCQkgICAgICBcCisJCSAgICAgPyAoY2hhciAqKSBfX3Jhd21lbWNociAoKHMpLCAoYykpCQkJICAgICAgXAorCQkgICAgIDogX19zdHJjaHJfYyAoKHMpLCAoKGMpICYgMHhmZikgPDwgOCkpCQkgICAgICBcCisJCSAgOiBfX3N0cmNocl9nICgocyksIChjKSkpKQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJjaHJfYyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpOworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cmNocl9jIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMDsKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCIxOlxuXHQiCisgICAgICJtb3ZiCSglMCksJSVhbFxuXHQiCisgICAgICJjbXBiCSUlYWgsJSVhbFxuXHQiCisgICAgICJqZQkyZlxuXHQiCisgICAgICJsZWFsCTEoJTApLCUwXG5cdCIKKyAgICAgInRlc3RiCSUlYWwsJSVhbFxuXHQiCisgICAgICJqbmUJMWJcblx0IgorICAgICAieG9ybAklMCwlMFxuIgorICAgICAiMjoiCisgICAgIDogIj1yIiAoX19yZXMpLCAiPSZhIiAoX19kMCkKKyAgICAgOiAiMCIgKF9fcyksICIxIiAoX19jKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX3MpCisgICAgIDogImNjIik7CisgIHJldHVybiBfX3JlczsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RyY2hyX2cgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJjaHJfZyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDA7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgibW92YgklJWFsLCUlYWhcbiIKKyAgICAgIjE6XG5cdCIKKyAgICAgIm1vdmIJKCUwKSwlJWFsXG5cdCIKKyAgICAgImNtcGIJJSVhaCwlJWFsXG5cdCIKKyAgICAgImplCTJmXG5cdCIKKyAgICAgImxlYWwJMSglMCksJTBcblx0IgorICAgICAidGVzdGIJJSVhbCwlJWFsXG5cdCIKKyAgICAgImpuZQkxYlxuXHQiCisgICAgICJ4b3JsCSUwLCUwXG4iCisgICAgICIyOiIKKyAgICAgOiAiPXIiIChfX3JlcyksICI9JmEiIChfX2QwKQorICAgICA6ICIwIiAoX19zKSwgIjEiIChfX2MpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fcykKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIF9fcmVzOworfQorCisKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQyBpbiBTIG9yIHRoZSBmaW5hbCBOVUwgYnl0ZS4gICovCisjZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX3N0cmNocm51bCAxCisjZGVmaW5lIF9fc3RyY2hybnVsKHMsIGMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKQkJCQkgICAgICBcCisJCSAgPyAoKGMpID09ICdcMCcJCQkJCSAgICAgIFwKKwkJICAgICA/IChjaGFyICopIF9fcmF3bWVtY2hyICgocyksIGMpCQkJICAgICAgXAorCQkgICAgIDogX19zdHJjaHJudWxfYyAoKHMpLCAoKGMpICYgMHhmZikgPDwgOCkpCQkgICAgICBcCisJCSAgOiBfX3N0cmNocm51bF9nICgocyksIGMpKSkKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RyY2hybnVsX2MgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJjaHJudWxfYyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDA7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiMTpcblx0IgorICAgICAibW92YgkoJTApLCUlYWxcblx0IgorICAgICAiY21wYgklJWFoLCUlYWxcblx0IgorICAgICAiamUJMmZcblx0IgorICAgICAibGVhbAkxKCUwKSwlMFxuXHQiCisgICAgICJ0ZXN0YgklJWFsLCUlYWxcblx0IgorICAgICAiam5lCTFiXG5cdCIKKyAgICAgImRlY2wJJTBcbiIKKyAgICAgIjI6IgorICAgICA6ICI9ciIgKF9fcmVzKSwgIj0mYSIgKF9fZDApCisgICAgIDogIjAiIChfX3MpLCAiMSIgKF9fYyksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19zKQorICAgICA6ICJjYyIpOworICByZXR1cm4gX19yZXM7Cit9CisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cmNocm51bF9nIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYyk7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RyY2hybnVsX2cgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwOworICByZWdpc3RlciBjaGFyICpfX3JlczsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIm1vdmIJJSVhbCwlJWFoXG4iCisgICAgICIxOlxuXHQiCisgICAgICJtb3ZiCSglMCksJSVhbFxuXHQiCisgICAgICJjbXBiCSUlYWgsJSVhbFxuXHQiCisgICAgICJqZQkyZlxuXHQiCisgICAgICJsZWFsCTEoJTApLCUwXG5cdCIKKyAgICAgInRlc3RiCSUlYWwsJSVhbFxuXHQiCisgICAgICJqbmUJMWJcblx0IgorICAgICAiZGVjbAklMFxuIgorICAgICAiMjoiCisgICAgIDogIj1yIiAoX19yZXMpLCAiPSZhIiAoX19kMCkKKyAgICAgOiAiMCIgKF9fcyksICIxIiAoX19jKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX3MpCisgICAgIDogImNjIik7CisgIHJldHVybiBfX3JlczsKK30KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIHN0cmNocm51bChzLCBjKSBfX3N0cmNocm51bCAoKHMpLCAoYykpCisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBDIGluIFMuICBUaGlzIGlzIHRoZSBCU0QgbmFtZS4gICovCisjIGRlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9pbmRleCAxCisjIGRlZmluZSBpbmRleChzLCBjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYykJCQkJICAgICAgXAorCQkgID8gX19zdHJjaHJfYyAoKHMpLCAoKGMpICYgMHhmZikgPDwgOCkJCQkgICAgICBcCisJCSAgOiBfX3N0cmNocl9nICgocyksIChjKSkpKQorI2VuZGlmCisKKworLyogRmluZCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIEMgaW4gUy4gICovCisjZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX3N0cnJjaHIgMQorI2RlZmluZSBzdHJyY2hyKHMsIGMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKQkJCQkgICAgICBcCisJCSAgPyBfX3N0cnJjaHJfYyAoKHMpLCAoKGMpICYgMHhmZikgPDwgOCkJCSAgICAgIFwKKwkJICA6IF9fc3RycmNocl9nICgocyksIChjKSkpKQorCisjaWZkZWYgX19pNjg2X18KK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cnJjaHJfYyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpOworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnJjaHJfYyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDE7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiY2xkXG4iCisgICAgICIxOlxuXHQiCisgICAgICJsb2RzYlxuXHQiCisgICAgICJjbXBiCSVoMiwlYjJcblx0IgorICAgICAiY21vdmUJJTEsJTBcblx0IgorICAgICAidGVzdGIJJWIyLCViMlxuXHQiCisgICAgICJqbmUgMWIiCisgICAgIDogIj1kIiAoX19yZXMpLCAiPSZTIiAoX19kMCksICI9JmEiIChfX2QxKQorICAgICA6ICIwIiAoMSksICIxIiAoX19zKSwgIjIiIChfX2MpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fcykKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIF9fcmVzIC0gMTsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RycmNocl9nIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYyk7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RycmNocl9nIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMTsKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJtb3ZiCSViMiwlaDJcbiIKKyAgICAgImNsZFxuXHQiCisgICAgICIxOlxuXHQiCisgICAgICJsb2RzYlxuXHQiCisgICAgICJjbXBiCSVoMiwlYjJcblx0IgorICAgICAiY21vdmUJJTEsJTBcblx0IgorICAgICAidGVzdGIJJWIyLCViMlxuXHQiCisgICAgICJqbmUgMWIiCisgICAgIDogIj1kIiAoX19yZXMpLCAiPSZTIiAoX19kMCksICI9JmEiIChfX2QxKQorICAgICA6ICIwIiAoMSksICIxIiAoX19zKSwgIjIiIChfX2MpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fcykKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIF9fcmVzIC0gMTsKK30KKyNlbHNlCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJyY2hyX2MgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJyY2hyX2MgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxOworICByZWdpc3RlciBjaGFyICpfX3JlczsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoImNsZFxuIgorICAgICAiMTpcblx0IgorICAgICAibG9kc2Jcblx0IgorICAgICAiY21wYgklJWFoLCUlYWxcblx0IgorICAgICAiam5lCTJmXG5cdCIKKyAgICAgImxlYWwJLTEoJSVlc2kpLCUwXG4iCisgICAgICIyOlxuXHQiCisgICAgICJ0ZXN0YgklJWFsLCUlYWxcblx0IgorICAgICAiam5lIDFiIgorICAgICA6ICI9ZCIgKF9fcmVzKSwgIj0mUyIgKF9fZDApLCAiPSZhIiAoX19kMSkKKyAgICAgOiAiMCIgKDApLCAiMSIgKF9fcyksICIyIiAoX19jKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX3MpCisgICAgIDogImNjIik7CisgIHJldHVybiBfX3JlczsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RycmNocl9nIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYyk7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RycmNocl9nIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMTsKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJtb3ZiCSUlYWwsJSVhaFxuIgorICAgICAiY2xkXG5cdCIKKyAgICAgIjE6XG5cdCIKKyAgICAgImxvZHNiXG5cdCIKKyAgICAgImNtcGIJJSVhaCwlJWFsXG5cdCIKKyAgICAgImpuZQkyZlxuXHQiCisgICAgICJsZWFsCS0xKCUlZXNpKSwlMFxuIgorICAgICAiMjpcblx0IgorICAgICAidGVzdGIJJSVhbCwlJWFsXG5cdCIKKyAgICAgImpuZSAxYiIKKyAgICAgOiAiPXIiIChfX3JlcyksICI9JlMiIChfX2QwKSwgIj0mYSIgKF9fZDEpCisgICAgIDogIjAiICgwKSwgIjEiIChfX3MpLCAiMiIgKF9fYyksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19zKQorICAgICA6ICJjYyIpOworICByZXR1cm4gX19yZXM7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogRmluZCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIEMgaW4gUy4gIFRoaXMgaXMgdGhlIEJTRCBuYW1lLiAgKi8KKyMgZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX3JpbmRleCAxCisjIGRlZmluZSByaW5kZXgocywgYykgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKGMpCQkJCSAgICAgIFwKKwkJICA/IF9fc3RycmNocl9jICgocyksICgoYykgJiAweGZmKSA8PCA4KQkJICAgICAgXAorCQkgIDogX19zdHJyY2hyX2cgKChzKSwgKGMpKSkpCisjZW5kaWYKKworCisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCBzZWdtZW50IG9mIFMgd2hpY2gKKyAgIGNvbnNpc3RzIGVudGlyZWx5IG9mIGNoYXJhY3RlcnMgbm90IGluIFJFSkVDVC4gICovCisjZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX3N0cmNzcG4gMQorI2RlZmluZSBzdHJjc3BuKHMsIHJlamVjdCkgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHJlamVjdCkgJiYgc2l6ZW9mICgocmVqZWN0KVswXSkgPT0gMSAgXAorCQkgID8gKChyZWplY3QpWzBdID09ICdcMCcJCQkJICAgICAgXAorCQkgICAgID8gc3RybGVuIChzKQkJCQkJICAgICAgXAorCQkgICAgIDogKChyZWplY3QpWzFdID09ICdcMCcJCQkJICAgICAgXAorCQkJPyBfX3N0cmNzcG5fYzEgKChzKSwgKCgocmVqZWN0KVswXSA8PCA4KSAmIDB4ZmYwMCkpICAgXAorCQkJOiBfX3N0cmNzcG5fY2cgKChzKSwgKHJlamVjdCksIHN0cmxlbiAocmVqZWN0KSkpKSAgICAgXAorCQkgIDogX19zdHJjc3BuX2cgKChzKSwgKHJlamVjdCkpKSkKKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cmNzcG5fYzEgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19yZWplY3QpOworCisjaWZuZGVmIF9GT1JDRV9JTkxJTkVTCitfX1NUUklOR19JTkxJTkUgc2l6ZV90CitfX3N0cmNzcG5fYzEgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19yZWplY3QpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDA7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiMTpcblx0IgorICAgICAibW92YgkoJTApLCUlYWxcblx0IgorICAgICAibGVhbAkxKCUwKSwlMFxuXHQiCisgICAgICJjbXBiCSUlYWgsJSVhbFxuXHQiCisgICAgICJqZQkyZlxuXHQiCisgICAgICJ0ZXN0YgklJWFsLCUlYWxcblx0IgorICAgICAiam5lCTFiXG4iCisgICAgICIyOiIKKyAgICAgOiAiPXIiIChfX3JlcyksICI9JmEiIChfX2QwKQorICAgICA6ICIwIiAoX19zKSwgIjEiIChfX3JlamVjdCksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19zKQorICAgICA6ICJjYyIpOworICByZXR1cm4gKF9fcmVzIC0gMSkgLSBfX3M7Cit9CisjZW5kaWYKKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cmNzcG5fY2cgKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgX19yZWplY3RbXSwKKwkJCQkgICAgc2l6ZV90IF9fcmVqZWN0X2xlbik7CisKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3RyY3Nwbl9jZyAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciBfX3JlamVjdFtdLCBzaXplX3QgX19yZWplY3RfbGVuKQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxLCBfX2QyOworICByZWdpc3RlciBfX2NvbnN0IGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiY2xkXG4iCisgICAgICIxOlxuXHQiCisgICAgICJsb2RzYlxuXHQiCisgICAgICJ0ZXN0YgklJWFsLCUlYWxcblx0IgorICAgICAiamUJMmZcblx0IgorICAgICAibW92bAklNSwlJWVkaVxuXHQiCisgICAgICJtb3ZsCSU2LCUlZWN4XG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgICJqbmUJMWJcbiIKKyAgICAgIjI6IgorICAgICA6ICI9UyIgKF9fcmVzKSwgIj0mYSIgKF9fZDApLCAiPSZjIiAoX19kMSksICI9JkQiIChfX2QyKQorICAgICA6ICIwIiAoX19zKSwgImQiIChfX3JlamVjdCksICJnIiAoX19yZWplY3RfbGVuKQorICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyAgcmV0dXJuIChfX3JlcyAtIDEpIC0gX19zOworfQorCitfX1NUUklOR19JTkxJTkUgc2l6ZV90IF9fc3RyY3Nwbl9nIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX3JlamVjdCk7CisjaWZkZWYgX19QSUNfXworCitfX1NUUklOR19JTkxJTkUgc2l6ZV90CitfX3N0cmNzcG5fZyAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19yZWplY3QpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDEsIF9fZDI7CisgIHJlZ2lzdGVyIF9fY29uc3QgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJwdXNobAklJWVieFxuXHQiCisgICAgICJtb3ZsCSU0LCUlZWRpXG5cdCIKKyAgICAgImNsZFxuXHQiCisgICAgICJyZXBuZTsgc2Nhc2Jcblx0IgorICAgICAibm90bAklJWVjeFxuXHQiCisgICAgICJsZWFsCS0xKCUlZWN4KSwlJWVieFxuIgorICAgICAiMTpcblx0IgorICAgICAibG9kc2Jcblx0IgorICAgICAidGVzdGIJJSVhbCwlJWFsXG5cdCIKKyAgICAgImplCTJmXG5cdCIKKyAgICAgIm1vdmwJJTQsJSVlZGlcblx0IgorICAgICAibW92bAklJWVieCwlJWVjeFxuXHQiCisgICAgICJyZXBuZTsgc2Nhc2Jcblx0IgorICAgICAiam5lCTFiXG4iCisgICAgICIyOlxuXHQiCisgICAgICJwb3BsCSUlZWJ4IgorICAgICA6ICI9UyIgKF9fcmVzKSwgIj0mYSIgKF9fZDApLCAiPSZjIiAoX19kMSksICI9JkQiIChfX2QyKQorICAgICA6ICJyIiAoX19yZWplY3QpLCAiMCIgKF9fcyksICIxIiAoMCksICIyIiAoMHhmZmZmZmZmZikKKyAgICAgOiAibWVtb3J5IiwgImNjIik7CisgIHJldHVybiAoX19yZXMgLSAxKSAtIF9fczsKK30KKyNlbHNlCitfX1NUUklOR19JTkxJTkUgc2l6ZV90CitfX3N0cmNzcG5fZyAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19yZWplY3QpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDEsIF9fZDIsIF9fZDM7CisgIHJlZ2lzdGVyIF9fY29uc3QgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgIm5vdGwJJSVlY3hcblx0IgorICAgICAibGVhbAktMSglJWVjeCksJSVlZHhcbiIKKyAgICAgIjE6XG5cdCIKKyAgICAgImxvZHNiXG5cdCIKKyAgICAgInRlc3RiCSUlYWwsJSVhbFxuXHQiCisgICAgICJqZQkyZlxuXHQiCisgICAgICJtb3ZsCSUlZWJ4LCUlZWRpXG5cdCIKKyAgICAgIm1vdmwJJSVlZHgsJSVlY3hcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgImpuZQkxYlxuIgorICAgICAiMjoiCisgICAgIDogIj1TIiAoX19yZXMpLCAiPSZhIiAoX19kMCksICI9JmMiIChfX2QxKSwgIj0mRCIgKF9fZDIpLCAiPSZkIiAoX19kMykKKyAgICAgOiAiMCIgKF9fcyksICIxIiAoMCksICIyIiAoMHhmZmZmZmZmZiksICIzIiAoX19yZWplY3QpLCAiYiIgKF9fcmVqZWN0KQorICAgICAvKiBDbG9iYmVyIG1lbW9yeSwgb3RoZXJ3aXNlIEdDQyBjYW5ub3QgaGFuZGxlIHRoaXMuICAqLworICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyAgcmV0dXJuIChfX3JlcyAtIDEpIC0gX19zOworfQorI2VuZGlmCisKKworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBTIHdoaWNoCisgICBjb25zaXN0cyBlbnRpcmVseSBvZiBjaGFyYWN0ZXJzIGluIEFDQ0VQVC4gICovCisjZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX3N0cnNwbiAxCisjZGVmaW5lIHN0cnNwbihzLCBhY2NlcHQpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChhY2NlcHQpICYmIHNpemVvZiAoKGFjY2VwdClbMF0pID09IDEgIFwKKwkJICA/ICgoYWNjZXB0KVswXSA9PSAnXDAnCQkJCSAgICAgIFwKKwkJICAgICA/ICgodm9pZCkgKHMpLCAwKQkJCQkJICAgICAgXAorCQkgICAgIDogKChhY2NlcHQpWzFdID09ICdcMCcJCQkJICAgICAgXAorCQkJPyBfX3N0cnNwbl9jMSAoKHMpLCAoKChhY2NlcHQpWzBdIDw8IDggKSAmIDB4ZmYwMCkpICAgXAorCQkJOiBfX3N0cnNwbl9jZyAoKHMpLCAoYWNjZXB0KSwgc3RybGVuIChhY2NlcHQpKSkpICAgICAgXAorCQkgIDogX19zdHJzcG5fZyAoKHMpLCAoYWNjZXB0KSkpKQorCisjaWZuZGVmIF9GT1JDRV9JTkxJTkVTCitfX1NUUklOR19JTkxJTkUgc2l6ZV90IF9fc3Ryc3BuX2MxIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0KTsKKworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJzcG5fYzEgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDA7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmVzOworICAvKiBQbGVhc2Ugbm90ZSB0aGF0IF9fYWNjZXB0IG5ldmVyIGNhbiBiZSAnXDAnLiAgKi8KKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIjE6XG5cdCIKKyAgICAgIm1vdmIJKCUwKSwlYjFcblx0IgorICAgICAibGVhbAkxKCUwKSwlMFxuXHQiCisgICAgICJjbXBiCSVoMSwlYjFcblx0IgorICAgICAiamUJMWIiCisgICAgIDogIj1yIiAoX19yZXMpLCAiPSZxIiAoX19kMCkKKyAgICAgOiAiMCIgKF9fcyksICIxIiAoX19hY2NlcHQpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fcykKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIChfX3JlcyAtIDEpIC0gX19zOworfQorI2VuZGlmCisKK19fU1RSSU5HX0lOTElORSBzaXplX3QgX19zdHJzcG5fY2cgKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgX19hY2NlcHRbXSwKKwkJCQkgICAgc2l6ZV90IF9fYWNjZXB0X2xlbik7CisKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3Ryc3BuX2NnIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyIF9fYWNjZXB0W10sIHNpemVfdCBfX2FjY2VwdF9sZW4pCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDEsIF9fZDI7CisgIHJlZ2lzdGVyIF9fY29uc3QgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcbiIKKyAgICAgIjE6XG5cdCIKKyAgICAgImxvZHNiXG5cdCIKKyAgICAgInRlc3RiCSUlYWwsJSVhbFxuXHQiCisgICAgICJqZQkyZlxuXHQiCisgICAgICJtb3ZsCSU1LCUlZWRpXG5cdCIKKyAgICAgIm1vdmwJJTYsJSVlY3hcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgImplCTFiXG4iCisgICAgICIyOiIKKyAgICAgOiAiPVMiIChfX3JlcyksICI9JmEiIChfX2QwKSwgIj0mYyIgKF9fZDEpLCAiPSZEIiAoX19kMikKKyAgICAgOiAiMCIgKF9fcyksICJnIiAoX19hY2NlcHQpLCAiZyIgKF9fYWNjZXB0X2xlbiksCisgICAgICAgLyogU2luY2Ugd2UgZG8gbm90IGtub3cgaG93IGxhcmdlIHRoZSBtZW1vcnkgd2UgYWNjZXNzIGl0LCB1c2UgYQorCSAgcmVhbGx5IGxhcmdlIGFtb3VudC4gICovCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19zKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19hY2NlcHRfbGVuXTsgfSAqKV9fYWNjZXB0KQorICAgICA6ICJjYyIpOworICByZXR1cm4gKF9fcmVzIC0gMSkgLSBfX3M7Cit9CisKK19fU1RSSU5HX0lOTElORSBzaXplX3QgX19zdHJzcG5fZyAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19hY2NlcHQpOworI2lmZGVmIF9fUElDX18KKworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJzcG5fZyAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19hY2NlcHQpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDEsIF9fZDI7CisgIHJlZ2lzdGVyIF9fY29uc3QgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJwdXNobAklJWVieFxuXHQiCisgICAgICJjbGRcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgIm5vdGwJJSVlY3hcblx0IgorICAgICAibGVhbAktMSglJWVjeCksJSVlYnhcbiIKKyAgICAgIjE6XG5cdCIKKyAgICAgImxvZHNiXG5cdCIKKyAgICAgInRlc3RiCSUlYWwsJSVhbFxuXHQiCisgICAgICJqZQkyZlxuXHQiCisgICAgICJtb3ZsCSUlZWR4LCUlZWRpXG5cdCIKKyAgICAgIm1vdmwJJSVlYngsJSVlY3hcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgImplCTFiXG4iCisgICAgICIyOlxuXHQiCisgICAgICJwb3BsCSUlZWJ4IgorICAgICA6ICI9UyIgKF9fcmVzKSwgIj0mYSIgKF9fZDApLCAiPSZjIiAoX19kMSksICI9JkQiIChfX2QyKQorICAgICA6ICJkIiAoX19hY2NlcHQpLCAiMCIgKF9fcyksICIxIiAoMCksICIyIiAoMHhmZmZmZmZmZiksICIzIiAoX19hY2NlcHQpCisgICAgIDogIm1lbW9yeSIsICJjYyIpOworICByZXR1cm4gKF9fcmVzIC0gMSkgLSBfX3M7Cit9CisjZWxzZQorX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJzcG5fZyAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19hY2NlcHQpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDEsIF9fZDIsIF9fZDM7CisgIHJlZ2lzdGVyIF9fY29uc3QgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgIm5vdGwJJSVlY3hcblx0IgorICAgICAibGVhbAktMSglJWVjeCksJSVlZHhcbiIKKyAgICAgIjE6XG5cdCIKKyAgICAgImxvZHNiXG5cdCIKKyAgICAgInRlc3RiCSUlYWwsJSVhbFxuXHQiCisgICAgICJqZQkyZlxuXHQiCisgICAgICJtb3ZsCSUlZWJ4LCUlZWRpXG5cdCIKKyAgICAgIm1vdmwJJSVlZHgsJSVlY3hcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgImplCTFiXG4iCisgICAgICIyOiIKKyAgICAgOiAiPVMiIChfX3JlcyksICI9JmEiIChfX2QwKSwgIj0mYyIgKF9fZDEpLCAiPSZEIiAoX19kMiksICI9JmQiIChfX2QzKQorICAgICA6ICIwIiAoX19zKSwgIjEiICgwKSwgIjIiICgweGZmZmZmZmZmKSwgIjMiIChfX2FjY2VwdCksICJiIiAoX19hY2NlcHQpCisgICAgIDogIm1lbW9yeSIsICJjYyIpOworICByZXR1cm4gKF9fcmVzIC0gMSkgLSBfX3M7Cit9CisjZW5kaWYKKworCisvKiBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIGluIFMgb2YgYW55IGNoYXJhY3RlciBpbiBBQ0NFUFQuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9zdHJwYnJrIDEKKyNkZWZpbmUgc3RycGJyayhzLCBhY2NlcHQpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChhY2NlcHQpICYmIHNpemVvZiAoKGFjY2VwdClbMF0pID09IDEgIFwKKwkJICA/ICgoYWNjZXB0KVswXSA9PSAnXDAnCQkJCSAgICAgIFwKKwkJICAgICA/ICgodm9pZCkgKHMpLCAoY2hhciAqKSAwKQkJCQkgICAgICBcCisJCSAgICAgOiAoKGFjY2VwdClbMV0gPT0gJ1wwJwkJCQkgICAgICBcCisJCQk/IHN0cmNociAoKHMpLCAoYWNjZXB0KVswXSkJCQkgICAgICBcCisJCQk6IF9fc3RycGJya19jZyAoKHMpLCAoYWNjZXB0KSwgc3RybGVuIChhY2NlcHQpKSkpICAgICBcCisJCSAgOiBfX3N0cnBicmtfZyAoKHMpLCAoYWNjZXB0KSkpKQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJwYnJrX2NnIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyIF9fYWNjZXB0W10sCisJCQkJICAgIHNpemVfdCBfX2FjY2VwdF9sZW4pOworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnBicmtfY2cgKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgX19hY2NlcHRbXSwgc2l6ZV90IF9fYWNjZXB0X2xlbikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMSwgX19kMjsKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcbiIKKyAgICAgIjE6XG5cdCIKKyAgICAgImxvZHNiXG5cdCIKKyAgICAgInRlc3RiCSUlYWwsJSVhbFxuXHQiCisgICAgICJqZQkyZlxuXHQiCisgICAgICJtb3ZsCSU1LCUlZWRpXG5cdCIKKyAgICAgIm1vdmwJJTYsJSVlY3hcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgImpuZQkxYlxuXHQiCisgICAgICJkZWNsCSUwXG5cdCIKKyAgICAgImptcAkzZlxuIgorICAgICAiMjpcblx0IgorICAgICAieG9ybAklMCwlMFxuIgorICAgICAiMzoiCisgICAgIDogIj1TIiAoX19yZXMpLCAiPSZhIiAoX19kMCksICI9JmMiIChfX2QxKSwgIj0mRCIgKF9fZDIpCisgICAgIDogIjAiIChfX3MpLCAiZCIgKF9fYWNjZXB0KSwgImciIChfX2FjY2VwdF9sZW4pCisgICAgIDogIm1lbW9yeSIsICJjYyIpOworICByZXR1cm4gX19yZXM7Cit9CisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cnBicmtfZyAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19hY2NlcHQpOworI2lmZGVmIF9fUElDX18KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJwYnJrX2cgKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fYWNjZXB0KQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxLCBfX2QyOworICByZWdpc3RlciBjaGFyICpfX3JlczsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoInB1c2hsCSUlZWJ4XG5cdCIKKyAgICAgIm1vdmwJJSVlZHgsJSVlZGlcblx0IgorICAgICAiY2xkXG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgICJub3RsCSUlZWN4XG5cdCIKKyAgICAgImxlYWwJLTEoJSVlY3gpLCUlZWJ4XG4iCisgICAgICIxOlxuXHQiCisgICAgICJsb2RzYlxuXHQiCisgICAgICJ0ZXN0YgklJWFsLCUlYWxcblx0IgorICAgICAiamUJMmZcblx0IgorICAgICAibW92bAklJWVkeCwlJWVkaVxuXHQiCisgICAgICJtb3ZsCSUlZWJ4LCUlZWN4XG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgICJqbmUJMWJcblx0IgorICAgICAiZGVjbAklMFxuXHQiCisgICAgICJqbXAJM2ZcbiIKKyAgICAgIjI6XG5cdCIKKyAgICAgInhvcmwJJTAsJTBcbiIKKyAgICAgIjM6XG5cdCIKKyAgICAgInBvcGwJJSVlYngiCisgICAgIDogIj1TIiAoX19yZXMpLCAiPSZhIiAoX19kMCksICI9JmMiIChfX2QxKSwgIj0mRCIgKF9fZDIpCisgICAgIDogImQiIChfX2FjY2VwdCksICIwIiAoX19zKSwgIjEiICgwKSwgIjIiICgweGZmZmZmZmZmKQorICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyAgcmV0dXJuIF9fcmVzOworfQorI2Vsc2UKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RycGJya19nIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMSwgX19kMiwgX19kMzsKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJtb3ZsCSUlZWJ4LCUlZWRpXG5cdCIKKyAgICAgImNsZFxuXHQiCisgICAgICJyZXBuZTsgc2Nhc2Jcblx0IgorICAgICAibm90bAklJWVjeFxuXHQiCisgICAgICJsZWFsCS0xKCUlZWN4KSwlJWVkeFxuIgorICAgICAiMTpcblx0IgorICAgICAibG9kc2Jcblx0IgorICAgICAidGVzdGIJJSVhbCwlJWFsXG5cdCIKKyAgICAgImplCTJmXG5cdCIKKyAgICAgIm1vdmwJJSVlYngsJSVlZGlcblx0IgorICAgICAibW92bAklJWVkeCwlJWVjeFxuXHQiCisgICAgICJyZXBuZTsgc2Nhc2Jcblx0IgorICAgICAiam5lCTFiXG5cdCIKKyAgICAgImRlY2wJJTBcblx0IgorICAgICAiam1wCTNmXG4iCisgICAgICIyOlxuXHQiCisgICAgICJ4b3JsCSUwLCUwXG4iCisgICAgICIzOiIKKyAgICAgOiAiPVMiIChfX3JlcyksICI9JmEiIChfX2QwKSwgIj0mYyIgKF9fZDEpLCAiPSZkIiAoX19kMiksICI9JkQiIChfX2QzKQorICAgICA6ICIwIiAoX19zKSwgIjEiICgwKSwgIjIiICgweGZmZmZmZmZmKSwgImIiIChfX2FjY2VwdCkKKyAgICAgOiAibWVtb3J5IiwgImNjIik7CisgIHJldHVybiBfX3JlczsKK30KKyNlbmRpZgorCisKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgTkVFRExFIGluIEhBWVNUQUNLLiAgKi8KKyNkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfc3Ryc3RyIDEKKyNkZWZpbmUgc3Ryc3RyKGhheXN0YWNrLCBuZWVkbGUpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChuZWVkbGUpICYmIHNpemVvZiAoKG5lZWRsZSlbMF0pID09IDEgIFwKKwkJICA/ICgobmVlZGxlKVswXSA9PSAnXDAnCQkJCSAgICAgIFwKKwkJICAgICA/IChoYXlzdGFjaykJCQkJCSAgICAgIFwKKwkJICAgICA6ICgobmVlZGxlKVsxXSA9PSAnXDAnCQkJCSAgICAgIFwKKwkJCT8gc3RyY2hyICgoaGF5c3RhY2spLCAobmVlZGxlKVswXSkJCSAgICAgIFwKKwkJCTogX19zdHJzdHJfY2cgKChoYXlzdGFjayksIChuZWVkbGUpLAkJICAgICAgXAorCQkJCSAgICAgICBzdHJsZW4gKG5lZWRsZSkpKSkJCSAgICAgIFwKKwkJICA6IF9fc3Ryc3RyX2cgKChoYXlzdGFjayksIChuZWVkbGUpKSkpCisKKy8qIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBuZWVkIG5vdCBoYW5kbGUgTkVFRExFcyB3aXRoIGEKKyAgIGxlbmd0aCBzaG9ydGVyIHRoYW4gdHdvLiAgKi8KK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cnN0cl9jZyAoX19jb25zdCBjaGFyICpfX2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgX19uZWVkbGVbXSwKKwkJCQkgICBzaXplX3QgX19uZWVkbGVfbGVuKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJzdHJfY2cgKF9fY29uc3QgY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFyIF9fbmVlZGxlW10sCisJICAgICBzaXplX3QgX19uZWVkbGVfbGVuKQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxLCBfX2QyOworICByZWdpc3RlciBjaGFyICpfX3JlczsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoImNsZFxuIiBcCisgICAgICIxOlxuXHQiCisgICAgICJtb3ZsCSU2LCUlZWRpXG5cdCIKKyAgICAgIm1vdmwJJTUsJSVlYXhcblx0IgorICAgICAibW92bAklNCwlJWVjeFxuXHQiCisgICAgICJyZXBlOyBjbXBzYlxuXHQiCisgICAgICJqZQkyZlxuXHQiCisgICAgICJjbXBiCSQwLC0xKCUlZXNpKVxuXHQiCisgICAgICJsZWFsCTEoJSVlYXgpLCU1XG5cdCIKKyAgICAgImpuZQkxYlxuXHQiCisgICAgICJ4b3JsCSUlZWF4LCUlZWF4XG4iCisgICAgICIyOiIKKyAgICAgOiAiPSZhIiAoX19yZXMpLCAiPSZTIiAoX19kMCksICI9JkQiIChfX2QxKSwgIj0mYyIgKF9fZDIpCisgICAgIDogImciIChfX25lZWRsZV9sZW4pLCAiMSIgKF9faGF5c3RhY2spLCAiZCIgKF9fbmVlZGxlKQorICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyAgcmV0dXJuIF9fcmVzOworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJzdHJfZyAoX19jb25zdCBjaGFyICpfX2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKTsKKyNpZmRlZiBfX1BJQ19fCisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3Ryc3RyX2cgKF9fY29uc3QgY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFyICpfX25lZWRsZSkKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMSwgX19kMjsKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgIm5vdGwJJSVlY3hcblx0IgorICAgICAicHVzaGwJJSVlYnhcblx0IgorICAgICAiZGVjbAklJWVjeFxuXHQiCS8qIE5PVEUhIFRoaXMgYWxzbyBzZXRzIFogaWYgc2VhcmNoc3RyaW5nPScnICovCisgICAgICJtb3ZsCSUlZWN4LCUlZWJ4XG4iCisgICAgICIxOlxuXHQiCisgICAgICJtb3ZsCSUlZWR4LCUlZWRpXG5cdCIKKyAgICAgIm1vdmwJJSVlc2ksJSVlYXhcblx0IgorICAgICAibW92bAklJWVieCwlJWVjeFxuXHQiCisgICAgICJyZXBlOyBjbXBzYlxuXHQiCisgICAgICJqZQkyZlxuXHQiCQkvKiBhbHNvIHdvcmtzIGZvciBlbXB0eSBzdHJpbmcsIHNlZSBhYm92ZSAqLworICAgICAiY21wYgkkMCwtMSglJWVzaSlcblx0IgorICAgICAibGVhbAkxKCUlZWF4KSwlJWVzaVxuXHQiCisgICAgICJqbmUJMWJcblx0IgorICAgICAieG9ybAklJWVheCwlJWVheFxuIgorICAgICAiMjpcblx0IgorICAgICAicG9wbAklJWVieCIKKyAgICAgOiAiPSZhIiAoX19yZXMpLCAiPSZjIiAoX19kMCksICI9JlMiIChfX2QxKSwgIj0mRCIgKF9fZDIpCisgICAgIDogIjAiICgwKSwgIjEiICgweGZmZmZmZmZmKSwgIjIiIChfX2hheXN0YWNrKSwgIjMiIChfX25lZWRsZSksCisgICAgICAgImQiIChfX25lZWRsZSkKKyAgICAgOiAibWVtb3J5IiwgImNjIik7CisgIHJldHVybiBfX3JlczsKK30KKyNlbHNlCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnN0cl9nIChfX2NvbnN0IGNoYXIgKl9faGF5c3RhY2ssIF9fY29uc3QgY2hhciAqX19uZWVkbGUpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDEsIF9fZDIsIF9fZDM7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiY2xkXG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgICJub3RsCSUlZWN4XG5cdCIKKyAgICAgImRlY2wJJSVlY3hcblx0IgkvKiBOT1RFISBUaGlzIGFsc28gc2V0cyBaIGlmIHNlYXJjaHN0cmluZz0nJyAqLworICAgICAibW92bAklJWVjeCwlJWVkeFxuIgorICAgICAiMTpcblx0IgorICAgICAibW92bAklJWVieCwlJWVkaVxuXHQiCisgICAgICJtb3ZsCSUlZXNpLCUlZWF4XG5cdCIKKyAgICAgIm1vdmwJJSVlZHgsJSVlY3hcblx0IgorICAgICAicmVwZTsgY21wc2Jcblx0IgorICAgICAiamUJMmZcblx0IgkJLyogYWxzbyB3b3JrcyBmb3IgZW1wdHkgc3RyaW5nLCBzZWUgYWJvdmUgKi8KKyAgICAgImNtcGIJJDAsLTEoJSVlc2kpXG5cdCIKKyAgICAgImxlYWwJMSglJWVheCksJSVlc2lcblx0IgorICAgICAiam5lCTFiXG5cdCIKKyAgICAgInhvcmwJJSVlYXgsJSVlYXhcbiIKKyAgICAgIjI6IgorICAgICA6ICI9JmEiIChfX3JlcyksICI9JmMiIChfX2QwKSwgIj0mUyIgKF9fZDEpLCAiPSZEIiAoX19kMiksICI9JmQiIChfX2QzKQorICAgICA6ICIwIiAoMCksICIxIiAoMHhmZmZmZmZmZiksICIyIiAoX19oYXlzdGFjayksICIzIiAoX19uZWVkbGUpLAorICAgICAgICJiIiAoX19uZWVkbGUpCisgICAgIDogIm1lbW9yeSIsICJjYyIpOworICByZXR1cm4gX19yZXM7Cit9CisjZW5kaWYKKworCisvKiBCaXQgZmluZCBmdW5jdGlvbnMuICBXZSBkZWZpbmUgb25seSB0aGUgaTY4NiB2ZXJzaW9uIHNpbmNlIGZvciB0aGUgb3RoZXIKKyAgIHByb2Nlc3NvcnMgZ2NjIGdlbmVyYXRlcyBnb29kIGNvZGUuICAqLworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKyMgaWZkZWYgX19pNjg2X18KKyMgIGRlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9mZnMgMQorIyAgZGVmaW5lIGZmcyh3b3JkKSAoX19idWlsdGluX2NvbnN0YW50X3AgKHdvcmQpCQkJICAgICAgXAorCQkgICAgID8gX19idWlsdGluX2ZmcyAod29yZCkJCQkJICAgICAgXAorCQkgICAgIDogKHsgaW50IF9fY250LCBfX3RtcDsJCQkJICAgICAgXAorCQkJICBfX2FzbV9fIF9fdm9sYXRpbGVfXwkJCQkgICAgICBcCisJCQkgICAgKCJic2ZsICUyLCUwXG5cdCIJCQkJICAgICAgXAorCQkJICAgICAiY21vdmVsICUxLCUwIgkJCQkgICAgICBcCisJCQkgICAgIDogIj0mciIgKF9fY250KSwgIj1yIiAoX190bXApCQkgICAgICBcCisJCQkgICAgIDogInJtIiAod29yZCksICIxIiAoLTEpKTsJCQkgICAgICBcCisJCQkgIF9fY250ICsgMTsgfSkpCisKKyMgIGlmbmRlZiBmZnNsCisjICAgZGVmaW5lIGZmc2wod29yZCkgZmZzKHdvcmQpCisjICBlbmRpZgorIyBlbmRpZgkvKiBpNjg2ICovCisjZW5kaWYJLyogQlNEIHx8IFgvT3BlbiAqLworCisjaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjIHVuZGVmIF9fU1RSSU5HX0lOTElORQorI2VuZGlmCisKKyNlbmRpZgkvKiB1c2Ugc3RyaW5nIGlubGluZXMgJiYgR05VIENDICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RyaW5nMi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0cmluZzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzk4YWNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0cmluZzIuaApAQCAtMCwwICsxLDEzNTQgQEAKKy8qIE1hY2hpbmUtaW5kZXBlbmRhbnQgc3RyaW5nIGZ1bmN0aW9uIG9wdGltaXphdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMywgMjAwNCwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTcuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVFJJTkdfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3N0cmluZzIuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN0cmluZy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgX19OT19TVFJJTkdfSU5MSU5FUyAmJiAhZGVmaW5lZCBfX0JPVU5ERURfUE9JTlRFUlNfXworCisvKiBVbmxpa2UgdGhlIGRlZmluaXRpb25zIGluIHRoZSBoZWFkZXIgPGJpdHMvc3RyaW5nLmg+IHRoZQorICAgZGVmaW5pdGlvbnMgY29udGFpbmVkIGhlcmUgYXJlIG5vdCBvcHRpbWl6ZWQgZG93biB0byBhc3NlbWJsZXIKKyAgIGxldmVsLiAgVGhvc2Ugb3B0aW1pemF0aW9ucyBhcmUgbm90IGFsd2F5cyBhIGdvb2QgaWRlYSBzaW5jZSB0aGlzCisgICBtZWFucyB0aGUgY29kZSBzaXplIGluY3JlYXNlcyBhIGxvdC4gIEluc3RlYWQgdGhlIGRlZmluaXRpb25zIGhlcmUKKyAgIG9wdGltaXplIHNvbWUgZnVuY3Rpb25zIGluIGEgd2F5IHdoaWNoIGRvIG5vdCBkcmFtYXRpY2FsbHkKKyAgIGluY3JlYXNlIHRoZSBjb2RlIHNpemUgYW5kIHdoaWNoIGRvIG5vdCB1c2UgYXNzZW1ibGVyLiAgVGhlIG1haW4KKyAgIHRyaWNrIGlzIHRvIHVzZSBHQ0MncyBgX19idWlsdGluX2NvbnN0YW50X3AnIGZ1bmN0aW9uLgorCisgICBFdmVyeSBmdW5jdGlvbiBYWFggd2hpY2ggaGFzIGEgZGVmaW5lZCB2ZXJzaW9uIGluCisgICA8Yml0cy9zdHJpbmcuaD4gbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIHN5bWJvbCBfSEFWRV9TVFJJTkdfQVJDSF9YWFgKKyAgIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgcmVkZWZpbml0aW9ucy4KKworICAgV2UgbXVzdCB1c2UgaGVyZSBtYWNyb3MgaW5zdGVhZCBvZiBpbmxpbmUgZnVuY3Rpb25zIHNpbmNlIHRoZQorICAgdHJpY2sgd29uJ3Qgd29yayB3aXRoIHRoZSBsYXR0ZXIuICAqLworCisjaWZuZGVmIF9fU1RSSU5HX0lOTElORQorIyBpZmRlZiBfX2NwbHVzcGx1cworIyAgZGVmaW5lIF9fU1RSSU5HX0lOTElORSBpbmxpbmUKKyMgZWxzZQorIyAgZGVmaW5lIF9fU1RSSU5HX0lOTElORSBfX2V4dGVybl9pbmxpbmUKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgX1NUUklOR19BUkNIX3VuYWxpZ25lZAorLyogSWYgd2UgY2FuIGRvIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMgd2UgbXVzdCBrbm93IHRoZSBlbmRpYW5lc3MuICAqLworIyBpbmNsdWRlIDxlbmRpYW4uaD4KKyMgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgIGRlZmluZSBfX1NUUklORzJfU01BTExfR0VUMTYoc3JjLCBpZHgpIFwKKyAgICAgKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeCArIDFdIDw8IDgJICAgICAgXAorICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHhdKQorIyAgZGVmaW5lIF9fU1RSSU5HMl9TTUFMTF9HRVQzMihzcmMsIGlkeCkgXAorICAgICAoKCgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAzXSA8PCA4ICAgICAgXAorCXwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4ICsgMl0pIDw8IDggICBcCisgICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAxXSkgPDwgOCAgICBcCisgICAgICB8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeF0pCisjIGVsc2UKKyMgIGRlZmluZSBfX1NUUklORzJfU01BTExfR0VUMTYoc3JjLCBpZHgpIFwKKyAgICAgKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeF0gPDwgOAkgICAgICBcCisgICAgICB8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeCArIDFdKQorIyAgZGVmaW5lIF9fU1RSSU5HMl9TTUFMTF9HRVQzMihzcmMsIGlkeCkgXAorICAgICAoKCgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHhdIDw8IDgJICAgICAgXAorCXwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4ICsgMV0pIDw8IDggICBcCisgICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAyXSkgPDwgOCAgICBcCisgICAgICB8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeCArIDNdKQorIyBlbmRpZgorI2Vsc2UKKy8qIFRoZXNlIGFyZSBhIGZldyB0eXBlcyB3ZSBuZWVkIGZvciB0aGUgb3B0aW1pemF0aW9ucyBpZiB3ZSBjYW5ub3QKKyAgIHVzZSB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzLiAgKi8KKyMgZGVmaW5lIF9fU1RSSU5HMl9DT1BZX1RZUEUoTikgXAorICB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGNoYXIgX19hcnJbTl07IH0JCQkJICAgICAgXAorICAgIF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgX19TVFJJTkcyX0NPUFlfQVJSIyNOCitfX1NUUklORzJfQ09QWV9UWVBFICgyKTsKK19fU1RSSU5HMl9DT1BZX1RZUEUgKDMpOworX19TVFJJTkcyX0NPUFlfVFlQRSAoNCk7CitfX1NUUklORzJfQ09QWV9UWVBFICg1KTsKK19fU1RSSU5HMl9DT1BZX1RZUEUgKDYpOworX19TVFJJTkcyX0NPUFlfVFlQRSAoNyk7CitfX1NUUklORzJfQ09QWV9UWVBFICg4KTsKKyMgdW5kZWYgX19TVFJJTkcyX0NPUFlfVFlQRQorI2VuZGlmCisKKy8qIERlcmVmZXJlbmNpbmcgYSBwb2ludGVyIGFyZyB0byBydW4gc2l6ZW9mIG9uIGl0IGZhaWxzIGZvciB0aGUgdm9pZAorICAgcG9pbnRlciBjYXNlLCBzbyB3ZSB1c2UgdGhpcyBpbnN0ZWFkLgorICAgTm90ZSB0aGF0IF9feCBpcyBldmFsdWF0ZWQgdHdpY2UuICovCisjZGVmaW5lIF9fc3RyaW5nMl8xYnB0cl9wKF9feCkgXAorICAoKHNpemVfdCkoY29uc3Qgdm9pZCAqKSgoX194KSArIDEpIC0gKHNpemVfdCkoY29uc3Qgdm9pZCAqKShfX3gpID09IDEpCisKKy8qIFNldCBOIGJ5dGVzIG9mIFMgdG8gQy4gICovCisjaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfbWVtc2V0CisjIGlmICFfX0dOVUNfUFJFUkVRICgzLCAwKQorIyAgaWYgX1NUUklOR19BUkNIX3VuYWxpZ25lZAorIyAgIGRlZmluZSBtZW1zZXQocywgYywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKG4pICYmIChuKSA8PSAxNgkJCSAgICAgIFwKKwkJICA/ICgobikgPT0gMQkJCQkJCSAgICAgIFwKKwkJICAgICA/IF9fbWVtc2V0XzEgKHMsIGMpCQkJCSAgICAgIFwKKwkJICAgICA6IF9fbWVtc2V0X2djIChzLCBjLCBuKSkJCQkJICAgICAgXAorCQkgIDogKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKSAmJiAoYykgPT0gJ1wwJwkJICAgICAgXAorCQkgICAgID8gKHsgdm9pZCAqX19zID0gKHMpOyBfX2J6ZXJvIChfX3MsIG4pOyBfX3M7IH0pCSAgICAgIFwKKwkJICAgICA6IG1lbXNldCAocywgYywgbikpKSkKKworIyAgIGRlZmluZSBfX21lbXNldF8xKHMsIGMpICh7IHZvaWQgKl9fcyA9IChzKTsJCQkJICAgICAgXAorCQkJICAgICooKF9fdWludDhfdCAqKSBfX3MpID0gKF9fdWludDhfdCkgYzsgX19zOyB9KQorCisjICAgZGVmaW5lIF9fbWVtc2V0X2djKHMsIGMsIG4pIFwKKyAgKHsgdm9pZCAqX19zID0gKHMpOwkJCQkJCQkgICAgICBcCisgICAgIHVuaW9uIHsJCQkJCQkJCSAgICAgIFwKKyAgICAgICB1bnNpZ25lZCBpbnQgX191aTsJCQkJCQkgICAgICBcCisgICAgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdXNpOwkJCQkJICAgICAgXAorICAgICAgIHVuc2lnbmVkIGNoYXIgX191YzsJCQkJCQkgICAgICBcCisgICAgIH0gKl9fdSA9IF9fczsJCQkJCQkJICAgICAgXAorICAgICBfX3VpbnQ4X3QgX19jID0gKF9fdWludDhfdCkgKGMpOwkJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorICAgICAvKiBUaGlzIGBzd2l0Y2gnIHN0YXRlbWVudCB3aWxsIGJlIHJlbW92ZWQgYXQgY29tcGlsZS10aW1lLiAgKi8JICAgICAgXAorICAgICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIChuKSkJCQkJCSAgICAgIFwKKyAgICAgICB7CQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxNToJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMTE6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDc6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDM6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191c2kgPSAodW5zaWduZWQgc2hvcnQgaW50KSBfX2MgKiAweDAxMDE7CQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOwkJCSAgICAgIFwKKwkgX191LT5fX3VjID0gKHVuc2lnbmVkIGNoYXIpIF9fYzsJCQkJICAgICAgXAorCSBicmVhazsJCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgICBjYXNlIDE0OgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2MgKiAweDAxMDEwMTAxOwkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSAxMDoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgNjoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMjoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VzaSA9ICh1bnNpZ25lZCBzaG9ydCBpbnQpIF9fYyAqIDB4MDEwMTsJCSAgICAgIFwKKwkgYnJlYWs7CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxMzoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgOToJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgNToJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMToJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VjID0gKHVuc2lnbmVkIGNoYXIpIF9fYzsJCQkJICAgICAgXAorCSBicmVhazsJCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgICBjYXNlIDE2OgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2MgKiAweDAxMDEwMTAxOwkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSAxMjoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgODoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgNDoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKyAgICAgICBjYXNlIDA6CQkJCQkJCQkgICAgICBcCisJIGJyZWFrOwkJCQkJCQkJICAgICAgXAorICAgICAgIH0JCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgX19zOyB9KQorIyAgZWxzZQorIyAgIGRlZmluZSBtZW1zZXQocywgYywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKGMpICYmIChjKSA9PSAnXDAnCQkgICAgICBcCisJCSAgPyAoeyB2b2lkICpfX3MgPSAocyk7IF9fYnplcm8gKF9fcywgbik7IF9fczsgfSkJICAgICAgXAorCQkgIDogbWVtc2V0IChzLCBjLCBuKSkpCisjICBlbmRpZgorIyBlbmRpZgorCisvKiBHQ0MgPCAzLjAgb3B0aW1pemVzIG1lbXNldChzLCAwLCBuKSBidXQgbm90IGJ6ZXJvKHMsIG4pLgorICAgVGhlIG9wdGltaXphdGlvbiBpcyBicm9rZW4gYmVmb3JlIEVHQ1MgMS4xLgorICAgR0NDIDMuMCsgaGFzIF9fYnVpbHRpbl9iemVybyBhcyB3ZWxsLCBidXQgYXQgbGVhc3QgdGlsbCBHQ0MgMy40CisgICBpZiBpdCBkZWNpZGVzIHRvIGNhbGwgdGhlIGxpYnJhcnkgZnVuY3Rpb24sIGl0IGNhbGxzIG1lbXNldAorICAgYW5kIG5vdCBiemVyby4gICovCisjIGlmIF9fR05VQ19QUkVSRVEgKDIsIDkxKQorIyAgZGVmaW5lIF9fYnplcm8ocywgbikgX19idWlsdGluX21lbXNldCAocywgJ1wwJywgbikKKyMgZW5kaWYKKworI2VuZGlmCisKKworLyogQ29weSBOIGJ5dGVzIGZyb20gU1JDIHRvIERFU1QsIHJldHVybmluZyBwb2ludGVyIHRvIGJ5dGUgZm9sbG93aW5nIHRoZQorICAgbGFzdCBjb3BpZWQuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9tZW1wY3B5IHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9tZW1wY3B5CisjICAgaWYgX19HTlVDX1BSRVJFUSAoMywgNCkKKyMgICAgZGVmaW5lIF9fbWVtcGNweShkZXN0LCBzcmMsIG4pIF9fYnVpbHRpbl9tZW1wY3B5IChkZXN0LCBzcmMsIG4pCisjICAgZWxpZiBfX0dOVUNfUFJFUkVRICgzLCAwKQorIyAgICBkZWZpbmUgX19tZW1wY3B5KGRlc3QsIHNyYywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgICAgXAorCQkgICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzcmMpICYmIG4gPD0gOAkJCSAgICAgIFwKKwkJICA/IF9fYnVpbHRpbl9tZW1jcHkgKGRlc3QsIHNyYywgbikgKyAobikJCSAgICAgIFwKKwkJICA6IF9fbWVtcGNweSAoZGVzdCwgc3JjLCBuKSkpCisjICAgZWxzZQorIyAgICBkZWZpbmUgX19tZW1wY3B5KGRlc3QsIHNyYywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgICAgXAorCQkgICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzcmMpICYmIG4gPD0gOAkJCSAgICAgIFwKKwkJICA/IF9fbWVtcGNweV9zbWFsbCAoZGVzdCwgX19tZW1wY3B5X2FyZ3MgKHNyYyksIG4pCSAgICAgIFwKKwkJICA6IF9fbWVtcGNweSAoZGVzdCwgc3JjLCBuKSkpCisjICAgZW5kaWYKKy8qIEluIGdsaWJjIHdlIHVzZSB0aGlzIGZ1bmN0aW9uIGZyZXF1ZW50bHkgYnV0IGZvciBuYW1lc3BhY2UgcmVhc29ucworICAgd2UgaGF2ZSB0byB1c2UgdGhlIG5hbWUgYF9fbWVtcGNweScuICAqLworIyAgIGRlZmluZSBtZW1wY3B5KGRlc3QsIHNyYywgbikgX19tZW1wY3B5IChkZXN0LCBzcmMsIG4pCisjICBlbmRpZgorCisjICBpZiAhX19HTlVDX1BSRVJFUSAoMywgMCkgfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyAgIGlmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKyMgICAgaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjICAgICBkZWZpbmUgX19tZW1wY3B5X2FyZ3Moc3JjKSBcCisgICAgICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLAkJICAgICAgXAorICAgICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs2XSwJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMTYgKHNyYywgMCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQxNiAoc3JjLCA0KSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDMyIChzcmMsIDApLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMzIgKHNyYywgNCkKKyMgICAgZW5kaWYKK19fU1RSSU5HX0lOTElORSB2b2lkICpfX21lbXBjcHlfc21hbGwgKHZvaWQgKiwgY2hhciwgY2hhciwgY2hhciwgY2hhciwKKwkJCQkgICAgICAgX191aW50MTZfdCwgX191aW50MTZfdCwgX191aW50MzJfdCwKKwkJCQkgICAgICAgX191aW50MzJfdCwgc2l6ZV90KTsKK19fU1RSSU5HX0lOTElORSB2b2lkICoKK19fbWVtcGNweV9zbWFsbCAodm9pZCAqX19kZXN0MSwKKwkJIGNoYXIgX19zcmMwXzEsIGNoYXIgX19zcmMyXzEsIGNoYXIgX19zcmM0XzEsIGNoYXIgX19zcmM2XzEsCisJCSBfX3VpbnQxNl90IF9fc3JjMF8yLCBfX3VpbnQxNl90IF9fc3JjNF8yLAorCQkgX191aW50MzJfdCBfX3NyYzBfNCwgX191aW50MzJfdCBfX3NyYzRfNCwKKwkJIHNpemVfdCBfX3NyY2xlbikKK3sKKyAgdW5pb24geworICAgIF9fdWludDMyX3QgX191aTsKKyAgICBfX3VpbnQxNl90IF9fdXNpOworICAgIHVuc2lnbmVkIGNoYXIgX191YzsKKyAgICB1bnNpZ25lZCBjaGFyIF9fYzsKKyAgfSAqX191ID0gX19kZXN0MTsKKyAgc3dpdGNoICgodW5zaWduZWQgaW50KSBfX3NyY2xlbikKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgX191LT5fX2MgPSBfX3NyYzBfMTsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgX191LT5fX3VzaSA9IF9fc3JjMF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBfX3UtPl9fdXNpID0gX19zcmMwXzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsKKyAgICAgIF9fdS0+X19jID0gX19zcmMyXzE7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX2MgPSBfX3NyYzRfMTsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzRfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzRfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgX191LT5fX2MgPSBfX3NyYzZfMTsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjNF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAodm9pZCAqKSBfX3U7Cit9CisjICAgZWxzZQorIyAgICBpZm5kZWYgX0ZPUkNFX0lOTElORVMKKyMgICAgIGRlZmluZSBfX21lbXBjcHlfYXJncyhzcmMpIFwKKyAgICAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLAkJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSMikJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdIH0gfSksICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSMykJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0gfSB9KSwJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNCkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSB9IH0pLCAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjUpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs0XSB9IH0pLAkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI2KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSB9IH0pLCAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjcpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs0XSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzVdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNl0gfSB9KSwJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSOCkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs2XSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzddIH0gfSkKKyMgICAgZW5kaWYKK19fU1RSSU5HX0lOTElORSB2b2lkICpfX21lbXBjcHlfc21hbGwgKHZvaWQgKiwgY2hhciwgX19TVFJJTkcyX0NPUFlfQVJSMiwKKwkJCQkgICAgICAgX19TVFJJTkcyX0NPUFlfQVJSMywKKwkJCQkgICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNCwKKwkJCQkgICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNSwKKwkJCQkgICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNiwKKwkJCQkgICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNywKKwkJCQkgICAgICAgX19TVFJJTkcyX0NPUFlfQVJSOCwgc2l6ZV90KTsKK19fU1RSSU5HX0lOTElORSB2b2lkICoKK19fbWVtcGNweV9zbWFsbCAodm9pZCAqX19kZXN0LCBjaGFyIF9fc3JjMSwKKwkJIF9fU1RSSU5HMl9DT1BZX0FSUjIgX19zcmMyLCBfX1NUUklORzJfQ09QWV9BUlIzIF9fc3JjMywKKwkJIF9fU1RSSU5HMl9DT1BZX0FSUjQgX19zcmM0LCBfX1NUUklORzJfQ09QWV9BUlI1IF9fc3JjNSwKKwkJIF9fU1RSSU5HMl9DT1BZX0FSUjYgX19zcmM2LCBfX1NUUklORzJfQ09QWV9BUlI3IF9fc3JjNywKKwkJIF9fU1RSSU5HMl9DT1BZX0FSUjggX19zcmM4LCBzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIF9fYzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIyIF9fc2NhMjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIzIF9fc2NhMzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI0IF9fc2NhNDsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI1IF9fc2NhNTsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI2IF9fc2NhNjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI3IF9fc2NhNzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI4IF9fc2NhODsKKyAgfSAqX191ID0gX19kZXN0OworICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIF9fc3JjbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBfX3UtPl9fYyA9IF9fc3JjMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTIgPSBfX3NyYzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EzID0gX19zcmMzOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNCA9IF9fc3JjNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTUgPSBfX3NyYzU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E2ID0gX19zcmM2OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNyA9IF9fc3JjNzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTggPSBfX3NyYzg7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyBfX3NyY2xlbik7Cit9CisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworCisvKiBSZXR1cm4gcG9pbnRlciB0byBDIGluIFMuICAqLworI2lmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjaHIKK2V4dGVybiB2b2lkICpfX3Jhd21lbWNociAoY29uc3Qgdm9pZCAqX19zLCBpbnQgX19jKTsKKyMgaWYgX19HTlVDX1BSRVJFUSAoMywgMikKKyMgIGRlZmluZSBzdHJjaHIocywgYykgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKGMpICYmICFfX2J1aWx0aW5fY29uc3RhbnRfcCAocykJICAgICAgXAorCQkgICYmIChjKSA9PSAnXDAnCQkJCQkgICAgICBcCisJCSAgPyAoY2hhciAqKSBfX3Jhd21lbWNociAocywgYykJCQkJICAgICAgXAorCQkgIDogX19idWlsdGluX3N0cmNociAocywgYykpKQorIyBlbHNlCisjICBkZWZpbmUgc3RyY2hyKHMsIGMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKSAmJiAoYykgPT0gJ1wwJwkJICAgICAgXAorCQkgID8gKGNoYXIgKikgX19yYXdtZW1jaHIgKHMsIGMpCQkJCSAgICAgIFwKKwkJICA6IHN0cmNociAocywgYykpKQorIyBlbmRpZgorI2VuZGlmCisKKworLyogQ29weSBTUkMgdG8gREVTVC4gICovCisjaWYgKCFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cmNweSAmJiAhX19HTlVDX1BSRVJFUSAoMywgMCkpIFwKKyAgICB8fCBkZWZpbmVkIF9GT1JDRV9JTkxJTkVTCisjIGlmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cmNweSAmJiAhX19HTlVDX1BSRVJFUSAoMywgMCkKKyMgIGRlZmluZSBzdHJjcHkoZGVzdCwgc3JjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKQkJCQkgICAgICBcCisJCSAgPyAoX19zdHJpbmcyXzFicHRyX3AgKHNyYykgJiYgc3RybGVuIChzcmMpICsgMSA8PSA4CSAgICAgIFwKKwkJICAgICA/IF9fc3RyY3B5X3NtYWxsIChkZXN0LCBfX3N0cmNweV9hcmdzIChzcmMpLAkgICAgICBcCisJCQkJICAgICAgIHN0cmxlbiAoc3JjKSArIDEpCQkgICAgICBcCisJCSAgICAgOiAoY2hhciAqKSBtZW1jcHkgKGRlc3QsIHNyYywgc3RybGVuIChzcmMpICsgMSkpCSAgICAgIFwKKwkJICA6IHN0cmNweSAoZGVzdCwgc3JjKSkpCisjIGVuZGlmCisKKyMgaWYgX1NUUklOR19BUkNIX3VuYWxpZ25lZAorIyAgaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjICAgZGVmaW5lIF9fc3RyY3B5X2FyZ3Moc3JjKSBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDE2IChzcmMsIDApLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMTYgKHNyYywgNCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQzMiAoc3JjLCAwKSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDMyIChzcmMsIDQpCisjICBlbmRpZgorX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RyY3B5X3NtYWxsIChjaGFyICosIF9fdWludDE2X3QsIF9fdWludDE2X3QsCisJCQkJICAgICAgX191aW50MzJfdCwgX191aW50MzJfdCwgc2l6ZV90KTsKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RyY3B5X3NtYWxsIChjaGFyICpfX2Rlc3QsCisJCV9fdWludDE2X3QgX19zcmMwXzIsIF9fdWludDE2X3QgX19zcmM0XzIsCisJCV9fdWludDMyX3QgX19zcmMwXzQsIF9fdWludDMyX3QgX19zcmM0XzQsCisJCXNpemVfdCBfX3NyY2xlbikKK3sKKyAgdW5pb24geworICAgIF9fdWludDMyX3QgX191aTsKKyAgICBfX3VpbnQxNl90IF9fdXNpOworICAgIHVuc2lnbmVkIGNoYXIgX191YzsKKyAgfSAqX191ID0gKHZvaWQgKikgX19kZXN0OworICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIF9fc3JjbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBfX3UtPl9fdWMgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgX191LT5fX3VzaSA9IF9fc3JjMF8yOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX191LT5fX3VzaSA9IF9fc3JjMF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CisgICAgICBfX3UtPl9fdWMgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdXNpID0gX19zcmM0XzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VzaSA9IF9fc3JjNF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CisgICAgICBfX3UtPl9fdWMgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjNF80OworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gX19kZXN0OworfQorIyBlbHNlCisjICBpZm5kZWYgX0ZPUkNFX0lOTElORVMKKyMgICBkZWZpbmUgX19zdHJjcHlfYXJncyhzcmMpIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjIpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICdcMCcgfSB9KSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlIzKQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICdcMCcgfSB9KSwJCQkJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNCkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICdcMCcgfSB9KSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI1KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAnXDAnIH0gfSksCQkJCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjYpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs0XSwgJ1wwJyB9IH0pLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjcpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs0XSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzVdLAkgICAgICBcCisJICAnXDAnIH0gfSksCQkJCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjgpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs0XSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzVdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNl0sICdcMCcgfSB9KQorIyAgZW5kaWYKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cmNweV9zbWFsbCAoY2hhciAqLCBfX1NUUklORzJfQ09QWV9BUlIyLAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjMsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNCwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI1LAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjYsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNywKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI4LCBzaXplX3QpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJjcHlfc21hbGwgKGNoYXIgKl9fZGVzdCwKKwkJX19TVFJJTkcyX0NPUFlfQVJSMiBfX3NyYzIsIF9fU1RSSU5HMl9DT1BZX0FSUjMgX19zcmMzLAorCQlfX1NUUklORzJfQ09QWV9BUlI0IF9fc3JjNCwgX19TVFJJTkcyX0NPUFlfQVJSNSBfX3NyYzUsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjYgX19zcmM2LCBfX1NUUklORzJfQ09QWV9BUlI3IF9fc3JjNywKKwkJX19TVFJJTkcyX0NPUFlfQVJSOCBfX3NyYzgsIHNpemVfdCBfX3NyY2xlbikKK3sKKyAgdW5pb24geworICAgIGNoYXIgX19jOworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjIgX19zY2EyOworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjMgX19zY2EzOworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjQgX19zY2E0OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjUgX19zY2E1OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjYgX19zY2E2OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjcgX19zY2E3OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjggX19zY2E4OworICB9ICpfX3UgPSAodm9pZCAqKSBfX2Rlc3Q7CisgIHN3aXRjaCAoKHVuc2lnbmVkIGludCkgX19zcmNsZW4pCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIF9fdS0+X19jID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTIgPSBfX3NyYzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EzID0gX19zcmMzOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNCA9IF9fc3JjNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTUgPSBfX3NyYzU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E2ID0gX19zcmM2OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNyA9IF9fc3JjNzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTggPSBfX3NyYzg7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gX19kZXN0OworfQorIyBlbmRpZgorI2VuZGlmCisKKworLyogQ29weSBTUkMgdG8gREVTVCwgcmV0dXJuaW5nIHBvaW50ZXIgdG8gZmluYWwgTlVMIGJ5dGUuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHBjcHkgfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyAgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cGNweQorIyAgIGlmIF9fR05VQ19QUkVSRVEgKDMsIDQpCisjICAgIGRlZmluZSBfX3N0cGNweShkZXN0LCBzcmMpIF9fYnVpbHRpbl9zdHBjcHkgKGRlc3QsIHNyYykKKyMgICBlbGlmIF9fR05VQ19QUkVSRVEgKDMsIDApCisjICAgIGRlZmluZSBfX3N0cGNweShkZXN0LCBzcmMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpCQkJCSAgICAgIFwKKwkJICA/IChfX3N0cmluZzJfMWJwdHJfcCAoc3JjKSAmJiBzdHJsZW4gKHNyYykgKyAxIDw9IDgJICAgICAgXAorCQkgICAgID8gX19idWlsdGluX3N0cmNweSAoZGVzdCwgc3JjKSArIHN0cmxlbiAoc3JjKQkgICAgICBcCisJCSAgICAgOiAoKGNoYXIgKikgKF9fbWVtcGNweSkgKGRlc3QsIHNyYywgc3RybGVuIChzcmMpICsgMSkgICAgXAorCQkJLSAxKSkJCQkJCQkgICAgICBcCisJCSAgOiBfX3N0cGNweSAoZGVzdCwgc3JjKSkpCisjICAgZWxzZQorIyAgICBkZWZpbmUgX19zdHBjcHkoZGVzdCwgc3JjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKQkJCQkgICAgICBcCisJCSAgPyAoX19zdHJpbmcyXzFicHRyX3AgKHNyYykgJiYgc3RybGVuIChzcmMpICsgMSA8PSA4CSAgICAgIFwKKwkJICAgICA/IF9fc3RwY3B5X3NtYWxsIChkZXN0LCBfX3N0cGNweV9hcmdzIChzcmMpLAkgICAgICBcCisJCQkJICAgICAgIHN0cmxlbiAoc3JjKSArIDEpCQkgICAgICBcCisJCSAgICAgOiAoKGNoYXIgKikgKF9fbWVtcGNweSkgKGRlc3QsIHNyYywgc3RybGVuIChzcmMpICsgMSkgICAgXAorCQkJLSAxKSkJCQkJCQkgICAgICBcCisJCSAgOiBfX3N0cGNweSAoZGVzdCwgc3JjKSkpCisjICAgZW5kaWYKKy8qIEluIGdsaWJjIHdlIHVzZSB0aGlzIGZ1bmN0aW9uIGZyZXF1ZW50bHkgYnV0IGZvciBuYW1lc3BhY2UgcmVhc29ucworICAgd2UgaGF2ZSB0byB1c2UgdGhlIG5hbWUgYF9fc3RwY3B5Jy4gICovCisjICAgZGVmaW5lIHN0cGNweShkZXN0LCBzcmMpIF9fc3RwY3B5IChkZXN0LCBzcmMpCisjICBlbmRpZgorCisjICBpZiAhX19HTlVDX1BSRVJFUSAoMywgMCkgfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyAgIGlmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKyMgICAgaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjICAgICBkZWZpbmUgX19zdHBjcHlfYXJncyhzcmMpIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMTYgKHNyYywgMCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQxNiAoc3JjLCA0KSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDMyIChzcmMsIDApLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMzIgKHNyYywgNCkKKyMgICAgZW5kaWYKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cGNweV9zbWFsbCAoY2hhciAqLCBfX3VpbnQxNl90LCBfX3VpbnQxNl90LAorCQkJCSAgICAgIF9fdWludDMyX3QsIF9fdWludDMyX3QsIHNpemVfdCk7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cGNweV9zbWFsbCAoY2hhciAqX19kZXN0LAorCQlfX3VpbnQxNl90IF9fc3JjMF8yLCBfX3VpbnQxNl90IF9fc3JjNF8yLAorCQlfX3VpbnQzMl90IF9fc3JjMF80LCBfX3VpbnQzMl90IF9fc3JjNF80LAorCQlzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICB1bnNpZ25lZCBpbnQgX191aTsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX191c2k7CisgICAgdW5zaWduZWQgY2hhciBfX3VjOworICAgIGNoYXIgX19jOworICB9ICpfX3UgPSAodm9pZCAqKSBfX2Rlc3Q7CisgIHN3aXRjaCAoKHVuc2lnbmVkIGludCkgX19zcmNsZW4pCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIF9fdS0+X191YyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBfX3UtPl9fdXNpID0gX19zcmMwXzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzBfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdXNpID0gX19zcmM0XzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdXNpID0gX19zcmM0XzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsKKyAgICAgIF9fdS0+X191YyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VpID0gX19zcmM0XzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuICZfX3UtPl9fYzsKK30KKyMgICBlbHNlCisjICAgIGlmbmRlZiBfRk9SQ0VfSU5MSU5FUworIyAgICAgZGVmaW5lIF9fc3RwY3B5X2FyZ3Moc3JjKSBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlIyKQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAnXDAnIH0gfSksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSMykJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAnXDAnIH0gfSksCQkJCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjQpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAnXDAnIH0gfSksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNSkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgJ1wwJyB9IH0pLAkJCQkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI2KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICdcMCcgfSB9KSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI3KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSwJICAgICAgXAorCSAgJ1wwJyB9IH0pLAkJCQkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI4KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzZdLCAnXDAnIH0gfSkKKyMgICAgZW5kaWYKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cGNweV9zbWFsbCAoY2hhciAqLCBfX1NUUklORzJfQ09QWV9BUlIyLAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjMsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNCwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI1LAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjYsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNywKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI4LCBzaXplX3QpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHBjcHlfc21hbGwgKGNoYXIgKl9fZGVzdCwKKwkJX19TVFJJTkcyX0NPUFlfQVJSMiBfX3NyYzIsIF9fU1RSSU5HMl9DT1BZX0FSUjMgX19zcmMzLAorCQlfX1NUUklORzJfQ09QWV9BUlI0IF9fc3JjNCwgX19TVFJJTkcyX0NPUFlfQVJSNSBfX3NyYzUsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjYgX19zcmM2LCBfX1NUUklORzJfQ09QWV9BUlI3IF9fc3JjNywKKwkJX19TVFJJTkcyX0NPUFlfQVJSOCBfX3NyYzgsIHNpemVfdCBfX3NyY2xlbikKK3sKKyAgdW5pb24geworICAgIGNoYXIgX19jOworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjIgX19zY2EyOworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjMgX19zY2EzOworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjQgX19zY2E0OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjUgX19zY2E1OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjYgX19zY2E2OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjcgX19zY2E3OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjggX19zY2E4OworICB9ICpfX3UgPSAodm9pZCAqKSBfX2Rlc3Q7CisgIHN3aXRjaCAoKHVuc2lnbmVkIGludCkgX19zcmNsZW4pCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIF9fdS0+X19jID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTIgPSBfX3NyYzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EzID0gX19zcmMzOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNCA9IF9fc3JjNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTUgPSBfX3NyYzU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E2ID0gX19zcmM2OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNyA9IF9fc3JjNzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTggPSBfX3NyYzg7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gX19kZXN0ICsgX19zcmNsZW4gLSAxOworfQorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKworLyogQ29weSBubyBtb3JlIHRoYW4gTiBjaGFyYWN0ZXJzIG9mIFNSQyB0byBERVNULiAgKi8KKyNpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RybmNweQorIyBpZiBfX0dOVUNfUFJFUkVRICgzLCAyKQorIyAgZGVmaW5lIHN0cm5jcHkoZGVzdCwgc3JjLCBuKSBfX2J1aWx0aW5fc3RybmNweSAoZGVzdCwgc3JjLCBuKQorIyBlbHNlCisjICBkZWZpbmUgc3RybmNweShkZXN0LCBzcmMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpICYmIF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAgICAgIFwKKwkJICA/IChzdHJsZW4gKHNyYykgKyAxID49ICgoc2l6ZV90KSAobikpCQkJICAgICAgXAorCQkgICAgID8gKGNoYXIgKikgbWVtY3B5IChkZXN0LCBzcmMsIG4pCQkJICAgICAgXAorCQkgICAgIDogc3RybmNweSAoZGVzdCwgc3JjLCBuKSkJCQkJICAgICAgXAorCQkgIDogc3RybmNweSAoZGVzdCwgc3JjLCBuKSkpCisjIGVuZGlmCisjZW5kaWYKKworCisvKiBBcHBlbmQgbm8gbW9yZSB0aGFuIE4gY2hhcmFjdGVycyBmcm9tIFNSQyBvbnRvIERFU1QuICAqLworI2lmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJuY2F0CisjIGlmZGVmIF9VU0VfU1RSSU5HX0FSQ0hfc3RyY2hyCisjICBkZWZpbmUgc3RybmNhdChkZXN0LCBzcmMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgY2hhciAqX19kZXN0ID0gKGRlc3QpOwkJCQkgICAgICBcCisJCSAgICBfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgICAgXAorCQkgICAgPyAoc3RybGVuIChzcmMpIDwgKChzaXplX3QpIChuKSkJCQkgICAgICBcCisJCSAgICAgICA/IHN0cmNhdCAoX19kZXN0LCBzcmMpCQkJCSAgICAgIFwKKwkJICAgICAgIDogKCooKGNoYXIgKikgX19tZW1wY3B5IChzdHJjaHIgKF9fZGVzdCwgJ1wwJyksCSAgICAgIFwKKwkJCQkJCXNyYywgbikpID0gJ1wwJywgX19kZXN0KSkgICAgIFwKKwkJICAgIDogc3RybmNhdCAoZGVzdCwgc3JjLCBuKTsgfSkpCisjIGVsaWYgX19HTlVDX1BSRVJFUSAoMywgMikKKyMgIGRlZmluZSBzdHJuY2F0KGRlc3QsIHNyYywgbikgX19idWlsdGluX3N0cm5jYXQgKGRlc3QsIHNyYywgbikKKyMgZWxzZQorIyAgZGVmaW5lIHN0cm5jYXQoZGVzdCwgc3JjLCBuKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgICAgICBcCisJCSAgPyAoc3RybGVuIChzcmMpIDwgKChzaXplX3QpIChuKSkJCQkgICAgICBcCisJCSAgICAgPyBzdHJjYXQgKGRlc3QsIHNyYykJCQkJICAgICAgXAorCQkgICAgIDogc3RybmNhdCAoZGVzdCwgc3JjLCBuKSkJCQkJICAgICAgXAorCQkgIDogc3RybmNhdCAoZGVzdCwgc3JjLCBuKSkpCisjIGVuZGlmCisjZW5kaWYKKworCisvKiBDb21wYXJlIGNoYXJhY3RlcnMgb2YgUzEgYW5kIFMyLiAgKi8KKyNpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyY21wCisjIGlmIF9fR05VQ19QUkVSRVEgKDMsIDIpCisjICBkZWZpbmUgc3RyY21wKHMxLCBzMikgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IHNpemVfdCBfX3MxX2xlbiwgX19zMl9sZW47CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKHMxKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAoczIpCQkgICAgICBcCisgICAgICAmJiAoX19zMV9sZW4gPSBfX2J1aWx0aW5fc3RybGVuIChzMSksIF9fczJfbGVuID0gX19idWlsdGluX3N0cmxlbiAoczIpLCBcCisJICAoIV9fc3RyaW5nMl8xYnB0cl9wIChzMSkgfHwgX19zMV9sZW4gPj0gNCkJCQkgICAgICBcCisJICAmJiAoIV9fc3RyaW5nMl8xYnB0cl9wIChzMikgfHwgX19zMl9sZW4gPj0gNCkpCQkgICAgICBcCisgICAgICA/IF9fYnVpbHRpbl9zdHJjbXAgKHMxLCBzMikJCQkJCSAgICAgIFwKKyAgICAgIDogKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMxKQkJICAgICAgXAorCSAmJiAoX19zMV9sZW4gPSBfX2J1aWx0aW5fc3RybGVuIChzMSksIF9fczFfbGVuIDwgNCkJCSAgICAgIFwKKwkgPyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoczIpCQkgICAgICBcCisJICAgID8gX19idWlsdGluX3N0cmNtcCAoczEsIHMyKQkJCQkJICAgICAgXAorCSAgICA6IF9fc3RyY21wX2NnIChzMSwgczIsIF9fczFfbGVuKSkJCQkJICAgICAgXAorCSA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczIpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzMikJCSAgICAgIFwKKwkgICAgJiYgKF9fczJfbGVuID0gX19idWlsdGluX3N0cmxlbiAoczIpLCBfX3MyX2xlbiA8IDQpCQkgICAgICBcCisJICAgID8gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMxKQkgICAgICBcCisJICAgICAgID8gX19idWlsdGluX3N0cmNtcCAoczEsIHMyKQkJCQkgICAgICBcCisJICAgICAgIDogX19zdHJjbXBfZ2MgKHMxLCBzMiwgX19zMl9sZW4pKQkJCSAgICAgIFwKKwkgICAgOiBfX2J1aWx0aW5fc3RyY21wIChzMSwgczIpKSkpOyB9KQorIyBlbHNlCisjICBkZWZpbmUgc3RyY21wKHMxLCBzMikgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IHNpemVfdCBfX3MxX2xlbiwgX19zMl9sZW47CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKHMxKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAoczIpCQkgICAgICBcCisgICAgICAmJiAoX19zMV9sZW4gPSBzdHJsZW4gKHMxKSwgX19zMl9sZW4gPSBzdHJsZW4gKHMyKSwJCSAgICAgIFwKKwkgICghX19zdHJpbmcyXzFicHRyX3AgKHMxKSB8fCBfX3MxX2xlbiA+PSA0KQkJCSAgICAgIFwKKwkgICYmICghX19zdHJpbmcyXzFicHRyX3AgKHMyKSB8fCBfX3MyX2xlbiA+PSA0KSkJCSAgICAgIFwKKyAgICAgID8gbWVtY21wICgoX19jb25zdCBjaGFyICopIChzMSksIChfX2NvbnN0IGNoYXIgKikgKHMyKSwJCSAgICAgIFwKKwkJKF9fczFfbGVuIDwgX19zMl9sZW4gPyBfX3MxX2xlbiA6IF9fczJfbGVuKSArIDEpCSAgICAgIFwKKyAgICAgIDogKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMxKQkJICAgICAgXAorCSAmJiAoX19zMV9sZW4gPSBzdHJsZW4gKHMxKSwgX19zMV9sZW4gPCA0KQkJCSAgICAgIFwKKwkgPyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoczIpCQkgICAgICBcCisJICAgID8gX19zdHJjbXBfY2MgKHMxLCBzMiwgX19zMV9sZW4pCQkJCSAgICAgIFwKKwkgICAgOiBfX3N0cmNtcF9jZyAoczEsIHMyLCBfX3MxX2xlbikpCQkJCSAgICAgIFwKKwkgOiAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoczIpCQkgICAgICBcCisJICAgICYmIChfX3MyX2xlbiA9IHN0cmxlbiAoczIpLCBfX3MyX2xlbiA8IDQpCQkJICAgICAgXAorCSAgICA/IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzMSkJICAgICAgXAorCSAgICAgICA/IF9fc3RyY21wX2NjIChzMSwgczIsIF9fczJfbGVuKQkJCQkgICAgICBcCisJICAgICAgIDogX19zdHJjbXBfZ2MgKHMxLCBzMiwgX19zMl9sZW4pKQkJCSAgICAgIFwKKwkgICAgOiBzdHJjbXAgKHMxLCBzMikpKSk7IH0pCisjIGVuZGlmCisKKyMgZGVmaW5lIF9fc3RyY21wX2NjKHMxLCBzMiwgbCkgXAorICAoX19leHRlbnNpb25fXyAoeyByZWdpc3RlciBpbnQgX19yZXN1bHQgPQkJCQkgICAgICBcCisJCSAgICAgICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzMSkpWzBdICAgXAorCQkgICAgICAgLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopKHMyKSlbMF0pO1wKKwkJICAgIGlmIChsID4gMCAmJiBfX3Jlc3VsdCA9PSAwKQkJCQkgICAgICBcCisJCSAgICAgIHsJCQkJCQkJICAgICAgXAorCQkJX19yZXN1bHQgPSAoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJCSAgICAgIFwKKwkJCQkgICAgIChfX2NvbnN0IGNoYXIgKikgKHMxKSlbMV0JCSAgICAgIFwKKwkJCQkgICAgLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkgICAgICBcCisJCQkJICAgICAgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbMV0pOwkgICAgICBcCisJCQlpZiAobCA+IDEgJiYgX19yZXN1bHQgPT0gMCkJCQkgICAgICBcCisJCQkgIHsJCQkJCQkgICAgICBcCisJCQkgICAgX19yZXN1bHQgPQkJCQkJICAgICAgXAorCQkJICAgICAgKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCQkgICAgICBcCisJCQkJKF9fY29uc3QgY2hhciAqKSAoczEpKVsyXQkJICAgICAgXAorCQkJICAgICAgIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJCSAgICAgIFwKKwkJCQkgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbMl0pOwkJICAgICAgXAorCQkJICAgIGlmIChsID4gMiAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJCSAgICAgIF9fcmVzdWx0ID0JCQkJICAgICAgXAorCQkJCSgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCSAgKF9fY29uc3QgY2hhciAqKSAoczEpKVszXQkJICAgICAgXAorCQkJCSAtICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCQkgICAgICBcCisJCQkJICAgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbM10pOwkJICAgICAgXAorCQkJICB9CQkJCQkJICAgICAgXAorCQkgICAgICB9CQkJCQkJCSAgICAgIFwKKwkJICAgIF9fcmVzdWx0OyB9KSkKKworIyBkZWZpbmUgX19zdHJjbXBfY2coczEsIHMyLCBsMSkgXAorICAoX19leHRlbnNpb25fXyAoeyBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKl9fczIgPQkJCSAgICAgIFwKKwkJICAgICAgKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzMik7CSAgICAgIFwKKwkJICAgIHJlZ2lzdGVyIGludCBfX3Jlc3VsdCA9CQkJCSAgICAgIFwKKwkJICAgICAgKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHMxKSlbMF0gICBcCisJCSAgICAgICAtIF9fczJbMF0pOwkJCQkJICAgICAgXAorCQkgICAgaWYgKGwxID4gMCAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJICAgICAgewkJCQkJCQkgICAgICBcCisJCQlfX3Jlc3VsdCA9ICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCSAgICAgKF9fY29uc3QgY2hhciAqKSAoczEpKVsxXSAtIF9fczJbMV0pOyAgICBcCisJCQlpZiAobDEgPiAxICYmIF9fcmVzdWx0ID09IDApCQkJICAgICAgXAorCQkJICB7CQkJCQkJICAgICAgXAorCQkJICAgIF9fcmVzdWx0ID0gKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCSAgICAgIFwKKwkJCQkJIChfX2NvbnN0IGNoYXIgKikgKHMxKSlbMl0gLSBfX3MyWzJdKTtcCisJCQkgICAgaWYgKGwxID4gMiAmJiBfX3Jlc3VsdCA9PSAwKQkJICAgICAgXAorCQkJICAgICAgX19yZXN1bHQgPSAoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJICAgICAgXAorCQkJCQkgIChfX2NvbnN0IGNoYXIgKikgIChzMSkpWzNdCSAgICAgIFwKKwkJCQkJICAtIF9fczJbM10pOwkJCSAgICAgIFwKKwkJCSAgfQkJCQkJCSAgICAgIFwKKwkJICAgICAgfQkJCQkJCQkgICAgICBcCisJCSAgICBfX3Jlc3VsdDsgfSkpCisKKyMgZGVmaW5lIF9fc3RyY21wX2djKHMxLCBzMiwgbDIpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgX19jb25zdCB1bnNpZ25lZCBjaGFyICpfX3MxID0JCQkgICAgICBcCisJCSAgICAgIChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoczEpOwkgICAgICBcCisJCSAgICByZWdpc3RlciBpbnQgX19yZXN1bHQgPQkJCQkgICAgICBcCisJCSAgICAgIF9fczFbMF0gLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCSAoX19jb25zdCBjaGFyICopIChzMikpWzBdOwkJICAgICAgXAorCQkgICAgaWYgKGwyID4gMCAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJICAgICAgewkJCQkJCQkgICAgICBcCisJCQlfX3Jlc3VsdCA9IChfX3MxWzFdCQkJCSAgICAgIFwKKwkJCQkgICAgLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkgICAgICBcCisJCQkJICAgICAgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbMV0pOwkgICAgICBcCisJCQlpZiAobDIgPiAxICYmIF9fcmVzdWx0ID09IDApCQkJICAgICAgXAorCQkJICB7CQkJCQkJICAgICAgXAorCQkJICAgIF9fcmVzdWx0ID0JCQkJCSAgICAgIFwKKwkJCSAgICAgIChfX3MxWzJdIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJICAgICAgXAorCQkJCQkgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbMl0pOwkgICAgICBcCisJCQkgICAgaWYgKGwyID4gMiAmJiBfX3Jlc3VsdCA9PSAwKQkJICAgICAgXAorCQkJICAgICAgX19yZXN1bHQgPQkJCQkgICAgICBcCisJCQkJKF9fczFbM10JCQkJICAgICAgXAorCQkJCSAtICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCQkgICAgICBcCisJCQkJICAgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbM10pOwkJICAgICAgXAorCQkJICB9CQkJCQkJICAgICAgXAorCQkgICAgICB9CQkJCQkJCSAgICAgIFwKKwkJICAgIF9fcmVzdWx0OyB9KSkKKyNlbmRpZgorCisKKy8qIENvbXBhcmUgTiBjaGFyYWN0ZXJzIG9mIFMxIGFuZCBTMi4gICovCisjaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cm5jbXAKKyMgZGVmaW5lIHN0cm5jbXAoczEsIHMyLCBuKQkJCQkJCSAgICAgIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChuKQkJCQkgICAgICBcCisJCSAgJiYgKChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpCQkJICAgICAgXAorCQkgICAgICAgJiYgc3RybGVuIChzMSkgPCAoKHNpemVfdCkgKG4pKSkJCQkgICAgICBcCisJCSAgICAgIHx8IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczIpCQkJICAgICAgXAorCQkJICAmJiBzdHJsZW4gKHMyKSA8ICgoc2l6ZV90KSAobikpKSkJCSAgICAgIFwKKwkJICA/IHN0cmNtcCAoczEsIHMyKSA6IHN0cm5jbXAgKHMxLCBzMiwgbikpKQorI2VuZGlmCisKKworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBTIHdoaWNoCisgICBjb25zaXN0cyBlbnRpcmVseSBvZiBjaGFyYWN0ZXJzIG5vdCBpbiBSRUpFQ1QuICAqLworI2lmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cmNzcG4gfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyBpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyY3NwbgorIyAgaWYgX19HTlVDX1BSRVJFUSAoMywgMikKKyMgICBkZWZpbmUgc3RyY3NwbihzLCByZWplY3QpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBjaGFyIF9fcjAsIF9fcjEsIF9fcjI7CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKHJlamVjdCkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHJlamVjdCkJICAgICAgXAorICAgICAgPyAoKF9fYnVpbHRpbl9jb25zdGFudF9wIChzKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAocykpCQkgICAgICBcCisJID8gX19idWlsdGluX3N0cmNzcG4gKHMsIHJlamVjdCkJCQkJICAgICAgXAorCSA6ICgoX19yMCA9ICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVswXSwgX19yMCA9PSAnXDAnKQkgICAgICBcCisJICAgID8gc3RybGVuIChzKQkJCQkJCSAgICAgIFwKKwkgICAgOiAoKF9fcjEgPSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMV0sIF9fcjEgPT0gJ1wwJykJICAgICAgXAorCSAgICAgICA/IF9fc3RyY3Nwbl9jMSAocywgX19yMCkJCQkJCSAgICAgIFwKKwkgICAgICAgOiAoKF9fcjIgPSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMl0sIF9fcjIgPT0gJ1wwJykJICAgICAgXAorCQkgID8gX19zdHJjc3BuX2MyIChzLCBfX3IwLCBfX3IxKQkJCSAgICAgIFwKKwkJICA6ICgoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbM10gPT0gJ1wwJwkJICAgICAgXAorCQkgICAgID8gX19zdHJjc3BuX2MzIChzLCBfX3IwLCBfX3IxLCBfX3IyKQkJICAgICAgXAorCQkgICAgIDogX19idWlsdGluX3N0cmNzcG4gKHMsIHJlamVjdCkpKSkpKQkJICAgICAgXAorICAgICAgOiBfX2J1aWx0aW5fc3RyY3NwbiAocywgcmVqZWN0KSk7IH0pCisjICBlbHNlCisjICAgZGVmaW5lIHN0cmNzcG4ocywgcmVqZWN0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX3IwLCBfX3IxLCBfX3IyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChyZWplY3QpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChyZWplY3QpCSAgICAgIFwKKyAgICAgID8gKChfX3IwID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzBdLCBfX3IwID09ICdcMCcpCQkgICAgICBcCisJID8gc3RybGVuIChzKQkJCQkJCQkgICAgICBcCisJIDogKChfX3IxID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzFdLCBfX3IxID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyBfX3N0cmNzcG5fYzEgKHMsIF9fcjApCQkJCQkgICAgICBcCisJICAgIDogKChfX3IyID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzJdLCBfX3IyID09ICdcMCcpCSAgICAgIFwKKwkgICAgICAgPyBfX3N0cmNzcG5fYzIgKHMsIF9fcjAsIF9fcjEpCQkJCSAgICAgIFwKKwkgICAgICAgOiAoKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzNdID09ICdcMCcJCSAgICAgIFwKKwkJICA/IF9fc3RyY3Nwbl9jMyAocywgX19yMCwgX19yMSwgX19yMikJCQkgICAgICBcCisJCSAgOiBzdHJjc3BuIChzLCByZWplY3QpKSkpKQkJCQkgICAgICBcCisgICAgICA6IHN0cmNzcG4gKHMsIHJlamVjdCkpOyB9KQorIyAgZW5kaWYKKyMgZW5kaWYKKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cmNzcG5fYzEgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19yZWplY3QpOworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJjc3BuX2MxIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fcmVqZWN0KQoreworICByZWdpc3RlciBzaXplX3QgX19yZXN1bHQgPSAwOworICB3aGlsZSAoX19zW19fcmVzdWx0XSAhPSAnXDAnICYmIF9fc1tfX3Jlc3VsdF0gIT0gX19yZWplY3QpCisgICAgKytfX3Jlc3VsdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCitfX1NUUklOR19JTkxJTkUgc2l6ZV90IF9fc3RyY3Nwbl9jMiAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdDEsCisJCQkJICAgICBpbnQgX19yZWplY3QyKTsKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3RyY3Nwbl9jMiAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdDEsIGludCBfX3JlamVjdDIpCit7CisgIHJlZ2lzdGVyIHNpemVfdCBfX3Jlc3VsdCA9IDA7CisgIHdoaWxlIChfX3NbX19yZXN1bHRdICE9ICdcMCcgJiYgX19zW19fcmVzdWx0XSAhPSBfX3JlamVjdDEKKwkgJiYgX19zW19fcmVzdWx0XSAhPSBfX3JlamVjdDIpCisgICAgKytfX3Jlc3VsdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCitfX1NUUklOR19JTkxJTkUgc2l6ZV90IF9fc3RyY3Nwbl9jMyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdDEsCisJCQkJICAgICBpbnQgX19yZWplY3QyLCBpbnQgX19yZWplY3QzKTsKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3RyY3Nwbl9jMyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdDEsIGludCBfX3JlamVjdDIsCisJICAgICAgaW50IF9fcmVqZWN0MykKK3sKKyAgcmVnaXN0ZXIgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgd2hpbGUgKF9fc1tfX3Jlc3VsdF0gIT0gJ1wwJyAmJiBfX3NbX19yZXN1bHRdICE9IF9fcmVqZWN0MQorCSAmJiBfX3NbX19yZXN1bHRdICE9IF9fcmVqZWN0MiAmJiBfX3NbX19yZXN1bHRdICE9IF9fcmVqZWN0MykKKyAgICArK19fcmVzdWx0OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisjZW5kaWYKKworCisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCBzZWdtZW50IG9mIFMgd2hpY2gKKyAgIGNvbnNpc3RzIGVudGlyZWx5IG9mIGNoYXJhY3RlcnMgaW4gQUNDRVBULiAgKi8KKyNpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJzcG4gfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyBpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3Ryc3BuCisjICBpZiBfX0dOVUNfUFJFUkVRICgzLCAyKQorIyAgIGRlZmluZSBzdHJzcG4ocywgYWNjZXB0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX2EwLCBfX2ExLCBfX2EyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhY2NlcHQpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChhY2NlcHQpCSAgICAgIFwKKyAgICAgID8gKChfX2J1aWx0aW5fY29uc3RhbnRfcCAocykgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMpKQkJICAgICAgXAorCSA/IF9fYnVpbHRpbl9zdHJzcG4gKHMsIGFjY2VwdCkJCQkJCSAgICAgIFwKKwkgOiAoKF9fYTAgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMF0sIF9fYTAgPT0gJ1wwJykJICAgICAgXAorCSAgICA/ICgodm9pZCkgKHMpLCAwKQkJCQkJCSAgICAgIFwKKwkgICAgOiAoKF9fYTEgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMV0sIF9fYTEgPT0gJ1wwJykJICAgICAgXAorCSAgICAgICA/IF9fc3Ryc3BuX2MxIChzLCBfX2EwKQkJCQkJICAgICAgXAorCSAgICAgICA6ICgoX19hMiA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsyXSwgX19hMiA9PSAnXDAnKQkgICAgICBcCisJCSAgPyBfX3N0cnNwbl9jMiAocywgX19hMCwgX19hMSkJCQkJICAgICAgXAorCQkgIDogKCgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVszXSA9PSAnXDAnCQkgICAgICBcCisJCSAgICAgPyBfX3N0cnNwbl9jMyAocywgX19hMCwgX19hMSwgX19hMikJCSAgICAgIFwKKwkJICAgICA6IF9fYnVpbHRpbl9zdHJzcG4gKHMsIGFjY2VwdCkpKSkpKQkJICAgICAgXAorICAgICAgOiBfX2J1aWx0aW5fc3Ryc3BuIChzLCBhY2NlcHQpKTsgfSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgc3Ryc3BuKHMsIGFjY2VwdCkgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IGNoYXIgX19hMCwgX19hMSwgX19hMjsJCQkJCQkgICAgICBcCisgICAgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWNjZXB0KSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoYWNjZXB0KQkgICAgICBcCisgICAgICA/ICgoX19hMCA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVswXSwgX19hMCA9PSAnXDAnKQkJICAgICAgXAorCSA/ICgodm9pZCkgKHMpLCAwKQkJCQkJCSAgICAgIFwKKwkgOiAoKF9fYTEgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMV0sIF9fYTEgPT0gJ1wwJykJICAgICAgXAorCSAgICA/IF9fc3Ryc3BuX2MxIChzLCBfX2EwKQkJCQkJICAgICAgXAorCSAgICA6ICgoX19hMiA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsyXSwgX19hMiA9PSAnXDAnKQkgICAgICBcCisJICAgICAgID8gX19zdHJzcG5fYzIgKHMsIF9fYTAsIF9fYTEpCQkJCSAgICAgIFwKKwkgICAgICAgOiAoKChfX2NvbnN0IGNoYXIgKikgKGFjY2VwdCkpWzNdID09ICdcMCcJCSAgICAgIFwKKwkJICA/IF9fc3Ryc3BuX2MzIChzLCBfX2EwLCBfX2ExLCBfX2EyKQkJCSAgICAgIFwKKwkJICA6IHN0cnNwbiAocywgYWNjZXB0KSkpKSkJCQkJICAgICAgXAorICAgICAgOiBzdHJzcG4gKHMsIGFjY2VwdCkpOyB9KQorIyAgZW5kaWYKKyMgZW5kaWYKKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cnNwbl9jMSAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2FjY2VwdCk7CitfX1NUUklOR19JTkxJTkUgc2l6ZV90CitfX3N0cnNwbl9jMSAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2FjY2VwdCkKK3sKKyAgcmVnaXN0ZXIgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgLyogUGxlYXNlIG5vdGUgdGhhdCBfX2FjY2VwdCBuZXZlciBjYW4gYmUgJ1wwJy4gICovCisgIHdoaWxlIChfX3NbX19yZXN1bHRdID09IF9fYWNjZXB0KQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cnNwbl9jMiAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2FjY2VwdDEsCisJCQkJICAgIGludCBfX2FjY2VwdDIpOworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJzcG5fYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLCBpbnQgX19hY2NlcHQyKQoreworICByZWdpc3RlciBzaXplX3QgX19yZXN1bHQgPSAwOworICAvKiBQbGVhc2Ugbm90ZSB0aGF0IF9fYWNjZXB0MSBhbmQgX19hY2NlcHQyIG5ldmVyIGNhbiBiZSAnXDAnLiAgKi8KKyAgd2hpbGUgKF9fc1tfX3Jlc3VsdF0gPT0gX19hY2NlcHQxIHx8IF9fc1tfX3Jlc3VsdF0gPT0gX19hY2NlcHQyKQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cnNwbl9jMyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2FjY2VwdDEsCisJCQkJICAgIGludCBfX2FjY2VwdDIsIGludCBfX2FjY2VwdDMpOworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJzcG5fYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLCBpbnQgX19hY2NlcHQyLCBpbnQgX19hY2NlcHQzKQoreworICByZWdpc3RlciBzaXplX3QgX19yZXN1bHQgPSAwOworICAvKiBQbGVhc2Ugbm90ZSB0aGF0IF9fYWNjZXB0MSB0byBfX2FjY2VwdDMgbmV2ZXIgY2FuIGJlICdcMCcuICAqLworICB3aGlsZSAoX19zW19fcmVzdWx0XSA9PSBfX2FjY2VwdDEgfHwgX19zW19fcmVzdWx0XSA9PSBfX2FjY2VwdDIKKwkgfHwgX19zW19fcmVzdWx0XSA9PSBfX2FjY2VwdDMpCisgICAgKytfX3Jlc3VsdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorI2VuZGlmCisKKworLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiBTIG9mIGFueSBjaGFyYWN0ZXIgaW4gQUNDRVBULiAgKi8KKyNpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJwYnJrIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cnBicmsKKyMgIGlmIF9fR05VQ19QUkVSRVEgKDMsIDIpCisjICAgZGVmaW5lIHN0cnBicmsocywgYWNjZXB0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX2EwLCBfX2ExLCBfX2EyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhY2NlcHQpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChhY2NlcHQpCSAgICAgIFwKKyAgICAgID8gKChfX2J1aWx0aW5fY29uc3RhbnRfcCAocykgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMpKQkJICAgICAgXAorCSA/IF9fYnVpbHRpbl9zdHJwYnJrIChzLCBhY2NlcHQpCQkJCSAgICAgIFwKKwkgOiAoKF9fYTAgPSAoKF9fY29uc3QgY2hhciAgKikgKGFjY2VwdCkpWzBdLCBfX2EwID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyAoKHZvaWQpIChzKSwgKGNoYXIgKikgTlVMTCkJCQkJICAgICAgXAorCSAgICA6ICgoX19hMSA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsxXSwgX19hMSA9PSAnXDAnKQkgICAgICBcCisJICAgICAgID8gX19idWlsdGluX3N0cmNociAocywgX19hMCkJCQkJICAgICAgXAorCSAgICAgICA6ICgoX19hMiA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsyXSwgX19hMiA9PSAnXDAnKQkgICAgICBcCisJCSAgPyBfX3N0cnBicmtfYzIgKHMsIF9fYTAsIF9fYTEpCQkJICAgICAgXAorCQkgIDogKCgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVszXSA9PSAnXDAnCQkgICAgICBcCisJCSAgICAgPyBfX3N0cnBicmtfYzMgKHMsIF9fYTAsIF9fYTEsIF9fYTIpCQkgICAgICBcCisJCSAgICAgOiBfX2J1aWx0aW5fc3RycGJyayAocywgYWNjZXB0KSkpKSkpCQkgICAgICBcCisgICAgICA6IF9fYnVpbHRpbl9zdHJwYnJrIChzLCBhY2NlcHQpKTsgfSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgc3RycGJyayhzLCBhY2NlcHQpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBjaGFyIF9fYTAsIF9fYTEsIF9fYTI7CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKGFjY2VwdCkgJiYgX19zdHJpbmcyXzFicHRyX3AgKGFjY2VwdCkJICAgICAgXAorICAgICAgPyAoKF9fYTAgPSAoKF9fY29uc3QgY2hhciAgKikgKGFjY2VwdCkpWzBdLCBfX2EwID09ICdcMCcpCQkgICAgICBcCisJID8gKCh2b2lkKSAocyksIChjaGFyICopIE5VTEwpCQkJCQkgICAgICBcCisJIDogKChfX2ExID0gKChfX2NvbnN0IGNoYXIgKikgKGFjY2VwdCkpWzFdLCBfX2ExID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyBzdHJjaHIgKHMsIF9fYTApCQkJCQkJICAgICAgXAorCSAgICA6ICgoX19hMiA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsyXSwgX19hMiA9PSAnXDAnKQkgICAgICBcCisJICAgICAgID8gX19zdHJwYnJrX2MyIChzLCBfX2EwLCBfX2ExKQkJCQkgICAgICBcCisJICAgICAgIDogKCgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVszXSA9PSAnXDAnCQkgICAgICBcCisJCSAgPyBfX3N0cnBicmtfYzMgKHMsIF9fYTAsIF9fYTEsIF9fYTIpCQkJICAgICAgXAorCQkgIDogc3RycGJyayAocywgYWNjZXB0KSkpKSkJCQkJICAgICAgXAorICAgICAgOiBzdHJwYnJrIChzLCBhY2NlcHQpKTsgfSkKKyMgIGVuZGlmCisjIGVuZGlmCisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cnBicmtfYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLAorCQkJCSAgICAgaW50IF9fYWNjZXB0Mik7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnBicmtfYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLCBpbnQgX19hY2NlcHQyKQoreworICAvKiBQbGVhc2Ugbm90ZSB0aGF0IF9fYWNjZXB0MSBhbmQgX19hY2NlcHQyIG5ldmVyIGNhbiBiZSAnXDAnLiAgKi8KKyAgd2hpbGUgKCpfX3MgIT0gJ1wwJyAmJiAqX19zICE9IF9fYWNjZXB0MSAmJiAqX19zICE9IF9fYWNjZXB0MikKKyAgICArK19fczsKKyAgcmV0dXJuICpfX3MgPT0gJ1wwJyA/IE5VTEwgOiAoY2hhciAqKSAoc2l6ZV90KSBfX3M7Cit9CisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cnBicmtfYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLAorCQkJCSAgICAgaW50IF9fYWNjZXB0MiwgaW50IF9fYWNjZXB0Myk7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnBicmtfYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLCBpbnQgX19hY2NlcHQyLAorCSAgICAgIGludCBfX2FjY2VwdDMpCit7CisgIC8qIFBsZWFzZSBub3RlIHRoYXQgX19hY2NlcHQxIHRvIF9fYWNjZXB0MyBuZXZlciBjYW4gYmUgJ1wwJy4gICovCisgIHdoaWxlICgqX19zICE9ICdcMCcgJiYgKl9fcyAhPSBfX2FjY2VwdDEgJiYgKl9fcyAhPSBfX2FjY2VwdDIKKwkgJiYgKl9fcyAhPSBfX2FjY2VwdDMpCisgICAgKytfX3M7CisgIHJldHVybiAqX19zID09ICdcMCcgPyBOVUxMIDogKGNoYXIgKikgKHNpemVfdCkgX19zOworfQorI2VuZGlmCisKKworLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBORUVETEUgaW4gSEFZU1RBQ0suICBOZXdlciBnY2MgdmVyc2lvbnMKKyAgIGRvIHRoaXMgaXRzZWxmLiAgKi8KKyNpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJzdHIgJiYgIV9fR05VQ19QUkVSRVEgKDIsIDk3KQorIyBkZWZpbmUgc3Ryc3RyKGhheXN0YWNrLCBuZWVkbGUpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChuZWVkbGUpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChuZWVkbGUpIFwKKwkJICA/ICgoKF9fY29uc3QgY2hhciAqKSAobmVlZGxlKSlbMF0gPT0gJ1wwJwkJICAgICAgXAorCQkgICAgID8gKGNoYXIgKikgKHNpemVfdCkgKGhheXN0YWNrKQkJCSAgICAgIFwKKwkJICAgICA6ICgoKF9fY29uc3QgY2hhciAqKSAobmVlZGxlKSlbMV0gPT0gJ1wwJwkJICAgICAgXAorCQkJPyBzdHJjaHIgKGhheXN0YWNrLAkJCQkgICAgICBcCisJCQkJICAoKF9fY29uc3QgY2hhciAqKSAobmVlZGxlKSlbMF0pIAkgICAgICBcCisJCQk6IHN0cnN0ciAoaGF5c3RhY2ssIG5lZWRsZSkpKQkJCSAgICAgIFwKKwkJICA6IHN0cnN0ciAoaGF5c3RhY2ssIG5lZWRsZSkpKQorI2VuZGlmCisKKworI2lmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cnRva19yIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cnRva19yCisjICBkZWZpbmUgX19zdHJ0b2tfcihzLCBzZXAsIG5leHRwKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc2VwKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoc2VwKQkgICAgICBcCisJCSAgJiYgKChfX2NvbnN0IGNoYXIgKikgKHNlcCkpWzBdICE9ICdcMCcJCSAgICAgIFwKKwkJICAmJiAoKF9fY29uc3QgY2hhciAqKSAoc2VwKSlbMV0gPT0gJ1wwJwkJICAgICAgXAorCQkgID8gX19zdHJ0b2tfcl8xYyAocywgKChfX2NvbnN0IGNoYXIgKikgKHNlcCkpWzBdLCBuZXh0cCkgICAgIFwKKwkJICA6IF9fc3RydG9rX3IgKHMsIHNlcCwgbmV4dHApKSkKKyMgZW5kaWYKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RydG9rX3JfMWMgKGNoYXIgKl9fcywgY2hhciBfX3NlcCwgY2hhciAqKl9fbmV4dHApOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJ0b2tfcl8xYyAoY2hhciAqX19zLCBjaGFyIF9fc2VwLCBjaGFyICoqX19uZXh0cCkKK3sKKyAgY2hhciAqX19yZXN1bHQ7CisgIGlmIChfX3MgPT0gTlVMTCkKKyAgICBfX3MgPSAqX19uZXh0cDsKKyAgd2hpbGUgKCpfX3MgPT0gX19zZXApCisgICAgKytfX3M7CisgIF9fcmVzdWx0ID0gTlVMTDsKKyAgaWYgKCpfX3MgIT0gJ1wwJykKKyAgICB7CisgICAgICBfX3Jlc3VsdCA9IF9fcysrOworICAgICAgd2hpbGUgKCpfX3MgIT0gJ1wwJykKKwlpZiAoKl9fcysrID09IF9fc2VwKQorCSAgeworCSAgICBfX3NbLTFdID0gJ1wwJzsKKwkgICAgYnJlYWs7CisJICB9CisgICAgfQorICAqX19uZXh0cCA9IF9fczsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorIyBpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworIyAgZGVmaW5lIHN0cnRva19yKHMsIHNlcCwgbmV4dHApIF9fc3RydG9rX3IgKHMsIHNlcCwgbmV4dHApCisjIGVuZGlmCisjZW5kaWYKKworCisjaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfc3Ryc2VwIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cnNlcAorCitleHRlcm4gY2hhciAqX19zdHJzZXBfZyAoY2hhciAqKl9fc3RyaW5ncCwgX19jb25zdCBjaGFyICpfX2RlbGltKTsKKyMgIGRlZmluZSBfX3N0cnNlcChzLCByZWplY3QpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBjaGFyIF9fcjAsIF9fcjEsIF9fcjI7CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKHJlamVjdCkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHJlamVjdCkJICAgICAgXAorICAgICAgJiYgKF9fcjAgPSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMF0sCQkJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzBdICE9ICdcMCcpCQkJICAgICAgXAorICAgICAgPyAoKF9fcjEgPSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMV0sCQkJICAgICAgXAorCSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMV0gPT0gJ1wwJykJCQkgICAgICBcCisJID8gX19zdHJzZXBfMWMgKHMsIF9fcjApCQkJCQkgICAgICBcCisJIDogKChfX3IyID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzJdLCBfX3IyID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyBfX3N0cnNlcF8yYyAocywgX19yMCwgX19yMSkJCQkJICAgICAgXAorCSAgICA6ICgoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbM10gPT0gJ1wwJwkJCSAgICAgIFwKKwkgICAgICAgPyBfX3N0cnNlcF8zYyAocywgX19yMCwgX19yMSwgX19yMikJCQkgICAgICBcCisJICAgICAgIDogX19zdHJzZXBfZyAocywgcmVqZWN0KSkpKQkJCQkgICAgICBcCisgICAgICA6IF9fc3Ryc2VwX2cgKHMsIHJlamVjdCkpOyB9KQorIyBlbmRpZgorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJzZXBfMWMgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJzZXBfMWMgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QpCit7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmV0dmFsID0gKl9fczsKKyAgaWYgKF9fcmV0dmFsICE9IE5VTEwgJiYgKCpfX3MgPSBzdHJjaHIgKF9fcmV0dmFsLCBfX3JlamVjdCkpICE9IE5VTEwpCisgICAgKigqX19zKSsrID0gJ1wwJzsKKyAgcmV0dXJuIF9fcmV0dmFsOworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJzZXBfMmMgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QxLCBjaGFyIF9fcmVqZWN0Mik7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnNlcF8yYyAoY2hhciAqKl9fcywgY2hhciBfX3JlamVjdDEsIGNoYXIgX19yZWplY3QyKQoreworICByZWdpc3RlciBjaGFyICpfX3JldHZhbCA9ICpfX3M7CisgIGlmIChfX3JldHZhbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIGNoYXIgKl9fY3AgPSBfX3JldHZhbDsKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIGlmICgqX19jcCA9PSAnXDAnKQorCSAgICB7CisJICAgICAgX19jcCA9IE5VTEw7CisJICBicmVhazsKKwkgICAgfQorCSAgaWYgKCpfX2NwID09IF9fcmVqZWN0MSB8fCAqX19jcCA9PSBfX3JlamVjdDIpCisJICAgIHsKKwkgICAgICAqX19jcCsrID0gJ1wwJzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgKytfX2NwOworCX0KKyAgICAgICpfX3MgPSBfX2NwOworICAgIH0KKyAgcmV0dXJuIF9fcmV0dmFsOworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJzZXBfM2MgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QxLCBjaGFyIF9fcmVqZWN0MiwKKwkJCQkgICBjaGFyIF9fcmVqZWN0Myk7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnNlcF8zYyAoY2hhciAqKl9fcywgY2hhciBfX3JlamVjdDEsIGNoYXIgX19yZWplY3QyLCBjaGFyIF9fcmVqZWN0MykKK3sKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXR2YWwgPSAqX19zOworICBpZiAoX19yZXR2YWwgIT0gTlVMTCkKKyAgICB7CisgICAgICByZWdpc3RlciBjaGFyICpfX2NwID0gX19yZXR2YWw7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBpZiAoKl9fY3AgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIF9fY3AgPSBOVUxMOworCSAgYnJlYWs7CisJICAgIH0KKwkgIGlmICgqX19jcCA9PSBfX3JlamVjdDEgfHwgKl9fY3AgPT0gX19yZWplY3QyIHx8ICpfX2NwID09IF9fcmVqZWN0MykKKwkgICAgeworCSAgICAgICpfX2NwKysgPSAnXDAnOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICArK19fY3A7CisJfQorICAgICAgKl9fcyA9IF9fY3A7CisgICAgfQorICByZXR1cm4gX19yZXR2YWw7Cit9CisjIGlmZGVmIF9fVVNFX0JTRAorIyAgZGVmaW5lIHN0cnNlcChzLCByZWplY3QpIF9fc3Ryc2VwIChzLCByZWplY3QpCisjIGVuZGlmCisjZW5kaWYKKworLyogV2UgbmVlZCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGZvciBpbmxpbmUgc3RyZHVwKCkuCisgICBSZWZlcnJpbmcgdG8gc3RkbGliLmggKGV2ZW4gbWluaW1hbGx5KSBpcyBub3QgYWxsb3dlZAorICAgaW4gYW55IG9mIHRoZSB0aWdodCBzdGFuZGFyZHMgY29tcGxpYW50IG1vZGVzLiAgKi8KKyNpZmRlZiBfX1VTRV9NSVNDCisKKyMgaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyZHVwIHx8ICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cm5kdXAKKyMgIGRlZmluZSBfX25lZWRfbWFsbG9jX2FuZF9jYWxsb2MKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbmRpZgorCisjIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJkdXAKKworZXh0ZXJuIGNoYXIgKl9fc3RyZHVwIChfX2NvbnN0IGNoYXIgKl9fc3RyaW5nKSBfX1RIUk9XIF9fYXR0cmlidXRlX21hbGxvY19fOworIyAgZGVmaW5lIF9fc3RyZHVwKHMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAocykJICAgICAgXAorCQkgID8gKCgoX19jb25zdCBjaGFyICopIChzKSlbMF0gPT0gJ1wwJwkJCSAgICAgIFwKKwkJICAgICA/IChjaGFyICopIGNhbGxvYyAoKHNpemVfdCkgMSwgKHNpemVfdCkgMSkJCSAgICAgIFwKKwkJICAgICA6ICh7IHNpemVfdCBfX2xlbiA9IHN0cmxlbiAocykgKyAxOwkJICAgICAgXAorCQkJICBjaGFyICpfX3JldHZhbCA9IChjaGFyICopIG1hbGxvYyAoX19sZW4pOwkgICAgICBcCisJCQkgIGlmIChfX3JldHZhbCAhPSBOVUxMKQkJCQkgICAgICBcCisJCQkgICAgX19yZXR2YWwgPSAoY2hhciAqKSBtZW1jcHkgKF9fcmV0dmFsLCBzLCBfX2xlbik7ICBcCisJCQkgIF9fcmV0dmFsOyB9KSkJCQkJCSAgICAgIFwKKwkJICA6IF9fc3RyZHVwIChzKSkpCisKKyMgIGlmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisjICAgZGVmaW5lIHN0cmR1cChzKSBfX3N0cmR1cCAocykKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cm5kdXAKKworZXh0ZXJuIGNoYXIgKl9fc3RybmR1cCAoX19jb25zdCBjaGFyICpfX3N0cmluZywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXzsKKyMgIGRlZmluZSBfX3N0cm5kdXAocywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzKQkgICAgICBcCisJCSAgPyAoKChfX2NvbnN0IGNoYXIgKikgKHMpKVswXSA9PSAnXDAnCQkJICAgICAgXAorCQkgICAgID8gKGNoYXIgKikgY2FsbG9jICgoc2l6ZV90KSAxLCAoc2l6ZV90KSAxKQkJICAgICAgXAorCQkgICAgIDogKHsgc2l6ZV90IF9fbGVuID0gc3RybGVuIChzKSArIDE7CQkgICAgICBcCisJCQkgIHNpemVfdCBfX24gPSAobik7CQkJCSAgICAgIFwKKwkJCSAgY2hhciAqX19yZXR2YWw7CQkJCSAgICAgIFwKKwkJCSAgaWYgKF9fbiA8IF9fbGVuKQkJCQkgICAgICBcCisJCQkgICAgX19sZW4gPSBfX24gKyAxOwkJCQkgICAgICBcCisJCQkgIF9fcmV0dmFsID0gKGNoYXIgKikgbWFsbG9jIChfX2xlbik7CQkgICAgICBcCisJCQkgIGlmIChfX3JldHZhbCAhPSBOVUxMKQkJCQkgICAgICBcCisJCQkgICAgewkJCQkJCSAgICAgIFwKKwkJCSAgICAgIF9fcmV0dmFsW19fbGVuIC0gMV0gPSAnXDAnOwkJICAgICAgXAorCQkJICAgICAgX19yZXR2YWwgPSAoY2hhciAqKSBtZW1jcHkgKF9fcmV0dmFsLCBzLAkgICAgICBcCisJCQkJCQkJICBfX2xlbiAtIDEpOwkgICAgICBcCisJCQkgICAgfQkJCQkJCSAgICAgIFwKKwkJCSAgX19yZXR2YWw7IH0pKQkJCQkJICAgICAgXAorCQkgIDogX19zdHJuZHVwIChzLCBuKSkpCisKKyMgIGlmZGVmIF9fVVNFX0dOVQorIyAgIGRlZmluZSBzdHJuZHVwKHMsIG4pIF9fc3RybmR1cCAocywgbikKKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbmRpZiAvKiBVc2UgbWlzYy4gb3IgdXNlIEdOVS4gICovCisKKyNpZm5kZWYgX0ZPUkNFX0lOTElORVMKKyMgdW5kZWYgX19TVFJJTkdfSU5MSU5FCisjZW5kaWYKKworI2VuZGlmIC8qIE5vIHN0cmluZyBpbmxpbmVzLiAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdHJpbmczLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RyaW5nMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NDc3MjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RyaW5nMy5oCkBAIC0wLDAgKzEsMTUzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NUUklOR19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvc3RyaW5nMy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3RyaW5nLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK19fd2FybmRlY2wgKF9fd2Fybl9tZW1zZXRfemVyb19sZW4sCisJICAgICJtZW1zZXQgdXNlZCB3aXRoIGNvbnN0YW50IHplcm8gbGVuZ3RoIHBhcmFtZXRlcjsgdGhpcyBjb3VsZCBiZSBkdWUgdG8gdHJhbnNwb3NlZCBwYXJhbWV0ZXJzIik7CisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKy8qIFhYWCBUaGlzIGlzIHRlbXBvcmFyaWx5LiAgV2Ugc2hvdWxkIG5vdCByZWRlZmluZSBhbnkgb2YgdGhlIHN5bWJvbHMKKyAgIGFuZCBpbnN0ZWFkIGludGVncmF0ZSB0aGUgZXJyb3IgY2hlY2tpbmcgaW50byB0aGUgb3JpZ2luYWwKKyAgIGRlZmluaXRpb25zLiAgKi8KKyMgdW5kZWYgbWVtY3B5CisjIHVuZGVmIG1lbW1vdmUKKyMgdW5kZWYgbWVtc2V0CisjIHVuZGVmIHN0cmNhdAorIyB1bmRlZiBzdHJjcHkKKyMgdW5kZWYgc3RybmNhdAorIyB1bmRlZiBzdHJuY3B5CisjIGlmZGVmIF9fVVNFX0dOVQorIyAgdW5kZWYgbWVtcGNweQorIyAgdW5kZWYgc3RwY3B5CisjIGVuZGlmCisjIGlmZGVmIF9fVVNFX0JTRAorIyAgdW5kZWYgYmNvcHkKKyMgIHVuZGVmIGJ6ZXJvCisjIGVuZGlmCisjZW5kaWYKKworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQgKgorX19OVEggKG1lbWNweSAodm9pZCAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3NyYywKKwkgICAgICAgc2l6ZV90IF9fbGVuKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX21lbWNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX2JvczAgKF9fZGVzdCkpOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQgKgorX19OVEggKG1lbW1vdmUgKHZvaWQgKl9fZGVzdCwgX19jb25zdCB2b2lkICpfX3NyYywgc2l6ZV90IF9fbGVuKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX21lbW1vdmVfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MwIChfX2Rlc3QpKTsKK30KKworI2lmZGVmIF9fVVNFX0dOVQorX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkICoKK19fTlRIIChtZW1wY3B5ICh2b2lkICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fc3JjLAorCQlzaXplX3QgX19sZW4pKQoreworICByZXR1cm4gX19idWlsdGluX19fbWVtcGNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX2JvczAgKF9fZGVzdCkpOworfQorI2VuZGlmCisKKworLyogVGhlIGZpcnN0IHR3byB0ZXN0cyBoZXJlIGhlbHAgdG8gY2F0Y2ggYSBzb21ld2hhdCBjb21tb24gcHJvYmxlbQorICAgd2hlcmUgdGhlIHNlY29uZCBhbmQgdGhpcmQgcGFyYW1ldGVyIGFyZSB0cmFuc3Bvc2VkLiAgVGhpcyBpcworICAgZXNwZWNpYWxseSBwcm9ibGVtYXRpYyBpZiB0aGUgaW50ZW5kZWQgZmlsbCB2YWx1ZSBpcyB6ZXJvLiAgSW4gdGhpcworICAgY2FzZSBubyB3b3JrIGlzIGRvbmUgYXQgYWxsLiAgV2UgZGV0ZWN0IHRoZXNlIHByb2JsZW1zIGJ5IHJlZmVycmluZworICAgbm9uLWV4aXN0aW5nIGZ1bmN0aW9ucy4gICovCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQgKgorX19OVEggKG1lbXNldCAodm9pZCAqX19kZXN0LCBpbnQgX19jaCwgc2l6ZV90IF9fbGVuKSkKK3sKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikgJiYgX19sZW4gPT0gMAorICAgICAgJiYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19jaCkgfHwgX19jaCAhPSAwKSkKKyAgICB7CisgICAgICBfX3dhcm5fbWVtc2V0X3plcm9fbGVuICgpOworICAgICAgcmV0dXJuIF9fZGVzdDsKKyAgICB9CisgIHJldHVybiBfX2J1aWx0aW5fX19tZW1zZXRfY2hrIChfX2Rlc3QsIF9fY2gsIF9fbGVuLCBfX2JvczAgKF9fZGVzdCkpOworfQorCisjaWZkZWYgX19VU0VfQlNECitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQKK19fTlRIIChiY29weSAoX19jb25zdCB2b2lkICpfX3NyYywgdm9pZCAqX19kZXN0LCBzaXplX3QgX19sZW4pKQoreworICAodm9pZCkgX19idWlsdGluX19fbWVtbW92ZV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX2JvczAgKF9fZGVzdCkpOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQKK19fTlRIIChiemVybyAodm9pZCAqX19kZXN0LCBzaXplX3QgX19sZW4pKQoreworICAodm9pZCkgX19idWlsdGluX19fbWVtc2V0X2NoayAoX19kZXN0LCAnXDAnLCBfX2xlbiwgX19ib3MwIChfX2Rlc3QpKTsKK30KKyNlbmRpZgorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorX19OVEggKHN0cmNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHJjcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2JvcyAoX19kZXN0KSk7Cit9CisKKyNpZmRlZiBfX1VTRV9HTlUKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgY2hhciAqCitfX05USCAoc3RwY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3N0cGNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fYm9zIChfX2Rlc3QpKTsKK30KKyNlbmRpZgorCisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgY2hhciAqCitfX05USCAoc3RybmNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJc2l6ZV90IF9fbGVuKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3N0cm5jcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MgKF9fZGVzdCkpOworfQorCisvLyBYWFggV2UgaGF2ZSBubyBjb3JyZXNwb25kaW5nIGJ1aWx0aW4geWV0LgorZXh0ZXJuIGNoYXIgKl9fc3RwbmNweV9jaGsgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYywgc2l6ZV90IF9fbiwKKwkJCSAgICBzaXplX3QgX19kZXN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1RfTlRIIChfX3N0cG5jcHlfYWxpYXMsIChjaGFyICpfX2Rlc3QsCisJCQkJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fc3JjLAorCQkJCQkgICAgICAgc2l6ZV90IF9fbiksIHN0cG5jcHkpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorX19OVEggKHN0cG5jcHkgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYywgc2l6ZV90IF9fbikpCit7CisgIGlmIChfX2JvcyAoX19kZXN0KSAhPSAoc2l6ZV90KSAtMQorICAgICAgJiYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSB8fCBfX24gPD0gX19ib3MgKF9fZGVzdCkpKQorICAgIHJldHVybiBfX3N0cG5jcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX24sIF9fYm9zIChfX2Rlc3QpKTsKKyAgcmV0dXJuIF9fc3RwbmNweV9hbGlhcyAoX19kZXN0LCBfX3NyYywgX19uKTsKK30KKworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorX19OVEggKHN0cmNhdCAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHJjYXRfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2JvcyAoX19kZXN0KSk7Cit9CisKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK19fTlRIIChzdHJuY2F0IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLAorCQlzaXplX3QgX19sZW4pKQoreworICByZXR1cm4gX19idWlsdGluX19fc3RybmNhdF9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX2JvcyAoX19kZXN0KSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3Ryb3B0cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0cm9wdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGUyYzJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0cm9wdHMuaApAQCAtMCwwICsxLDIzMSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVFJPUFRTX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3Ryb3B0cy5oPiBkaXJlY3RseTsgdXNlIDxzdHJvcHRzLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX0JJVFNfU1RST1BUU19ICisjZGVmaW5lIF9CSVRTX1NUUk9QVFNfSAkxCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIE1hY3JvcyB1c2VkIGFzIGByZXF1ZXN0JyBhcmd1bWVudCB0byBgaW9jdGwnLiAgKi8KKyNkZWZpbmUgX19TSUQJCSgnUycgPDwgOCkKKworI2RlZmluZSBJX05SRUFECSAgICAoX19TSUQgfCAxKQkvKiBDb3VudHMgdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIHRoZSBkYXRhCisJCQkJICAgYmxvY2sgaW4gdGhlIGZpcnN0IG1lc3NhZ2UuICAqLworI2RlZmluZSBJX1BVU0gJICAgIChfX1NJRCB8IDIpCS8qIFB1c2ggU1RSRUFNUyBtb2R1bGUgb250byB0b3Agb2YgdGhlIGN1cnJlbnQKKwkJCQkgICBTVFJFQU0sIGp1c3QgYmVsb3cgdGhlIFNUUkVBTSBoZWFkLiAgKi8KKyNkZWZpbmUgSV9QT1AJICAgIChfX1NJRCB8IDMpCS8qIFJlbW92ZSBTVFJFQU1TIG1vZHVsZSBmcm9tIGp1c3QgYmVsb3cgdGhlCisJCQkJICAgU1RSRUFNIGhlYWQuICAqLworI2RlZmluZSBJX0xPT0sJICAgIChfX1NJRCB8IDQpCS8qIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUganVzdCBiZWxvdworCQkJCSAgIHRoZSBTVFJFQU0gaGVhZCBhbmQgcGxhY2UgaXQgaW4gYSBjaGFyYWN0ZXIKKwkJCQkgICBzdHJpbmcuICAqLworI2RlZmluZSBJX0ZMVVNICSAgICAoX19TSUQgfCA1KQkvKiBGbHVzaCBhbGwgaW5wdXQgYW5kL29yIG91dHB1dC4gICovCisjZGVmaW5lIElfU1JET1BUICAgIChfX1NJRCB8IDYpCS8qIFNldHMgdGhlIHJlYWQgbW9kZS4gICovCisjZGVmaW5lIElfR1JET1BUICAgIChfX1NJRCB8IDcpCS8qIFJldHVybnMgdGhlIGN1cnJlbnQgcmVhZCBtb2RlIHNldHRpbmcuICAqLworI2RlZmluZSBJX1NUUgkgICAgKF9fU0lEIHwgOCkJLyogQ29uc3RydWN0IGFuIGludGVybmFsIFNUUkVBTVMgYGlvY3RsJworCQkJCSAgIG1lc3NhZ2UgYW5kIHNlbmQgdGhhdCBtZXNzYWdlIGRvd25zdHJlYW0uICovCisjZGVmaW5lIElfU0VUU0lHICAgIChfX1NJRCB8IDkpCS8qIEluZm9ybSB0aGUgU1RSRUFNIGhlYWQgdGhhdCB0aGUgcHJvY2VzcworCQkJCSAgIHdhbnRzIHRoZSBTSUdQT0xMIHNpZ25hbCBpc3N1ZWQuICAqLworI2RlZmluZSBJX0dFVFNJRyAgICAoX19TSUQgfDEwKSAvKiBSZXR1cm4gdGhlIGV2ZW50cyBmb3Igd2hpY2ggdGhlIGNhbGxpbmcKKwkJCQkgICBwcm9jZXNzIGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIHRvIGJlIHNlbnQKKwkJCQkgICBhIFNJR1BPTEwgc2lnbmFsLiAgKi8KKyNkZWZpbmUgSV9GSU5ECSAgICAoX19TSUQgfDExKSAvKiBDb21wYXJlcyB0aGUgbmFtZXMgb2YgYWxsIG1vZHVsZXMgY3VycmVudGx5CisJCQkJICAgcHJlc2VudCBpbiB0aGUgU1RSRUFNIHRvIHRoZSBuYW1lIHBvaW50ZWQgdG8KKwkJCQkgICBieSBgYXJnJy4gICovCisjZGVmaW5lIElfTElOSwkgICAgKF9fU0lEIHwxMikgLyogQ29ubmVjdCB0d28gU1RSRUFNcy4gICovCisjZGVmaW5lIElfVU5MSU5LICAgIChfX1NJRCB8MTMpIC8qIERpc2Nvbm5lY3RzIHRoZSB0d28gU1RSRUFNcy4gICovCisjZGVmaW5lIElfUEVFSwkgICAgKF9fU0lEIHwxNSkgLyogQWxsb3dzIGEgcHJvY2VzcyB0byByZXRyaWV2ZSB0aGUgaW5mb3JtYXRpb24KKwkJCQkgICBpbiB0aGUgZmlyc3QgbWVzc2FnZSBvbiB0aGUgU1RSRUFNIGhlYWQgcmVhZAorCQkJCSAgIHF1ZXVlIHdpdGhvdXQgdGFraW5nIHRoZSBtZXNzYWdlIG9mZiB0aGUKKwkJCQkgICBxdWV1ZS4gICovCisjZGVmaW5lIElfRkRJTlNFUlQgIChfX1NJRCB8MTYpIC8qIENyZWF0ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgc3BlY2lmaWVkCisJCQkJICAgYnVmZmVyKHMpLCBhZGRzIGluZm9ybWF0aW9uIGFib3V0IGFub3RoZXIKKwkJCQkgICBTVFJFQU0sIGFuZCBzZW5kIHRoZSBtZXNzYWdlIGRvd25zdHJlYW0uICAqLworI2RlZmluZSBJX1NFTkRGRCAgICAoX19TSUQgfDE3KSAvKiBSZXF1ZXN0cyB0aGUgU1RSRUFNIGFzc29jaWF0ZWQgd2l0aCBgZmlsZGVzJworCQkJCSAgIHRvIHNlbmQgYSBtZXNzYWdlLCBjb250YWluaW5nIGEgZmlsZQorCQkJCSAgIHBvaW50ZXIsIHRvIHRoZSBTVFJFQU0gaGVhZCBhdCB0aGUgb3RoZXIgZW5kCisJCQkJICAgb2YgYSBTVFJFQU1TIHBpcGUuICAqLworI2RlZmluZSBJX1JFQ1ZGRCAgICAoX19TSUQgfDE0KSAvKiBOb24tRUZUIGRlZmluaXRpb24uICAqLworI2RlZmluZSBJX1NXUk9QVCAgICAoX19TSUQgfDE5KSAvKiBTZXQgdGhlIHdyaXRlIG1vZGUuICAqLworI2RlZmluZSBJX0dXUk9QVCAgICAoX19TSUQgfDIwKSAvKiBSZXR1cm4gdGhlIGN1cnJlbnQgd3JpdGUgbW9kZSBzZXR0aW5nLiAgKi8KKyNkZWZpbmUgSV9MSVNUCSAgICAoX19TSUQgfDIxKSAvKiBMaXN0IGFsbCB0aGUgbW9kdWxlIG5hbWVzIG9uIHRoZSBTVFJFQU0sIHVwCisJCQkJICAgdG8gYW5kIGluY2x1ZGluZyB0aGUgdG9wbW9zdCBkcml2ZXIgbmFtZS4gKi8KKyNkZWZpbmUgSV9QTElOSwkgICAgKF9fU0lEIHwyMikgLyogQ29ubmVjdCB0d28gU1RSRUFNcyB3aXRoIGEgcGVyc2lzdGVudAorCQkJCSAgIGxpbmsuICAqLworI2RlZmluZSBJX1BVTkxJTksgICAoX19TSUQgfDIzKSAvKiBEaXNjb25uZWN0IHRoZSB0d28gU1RSRUFNcyB0aGF0IHdlcmUKKwkJCQkgICBjb25uZWN0ZWQgd2l0aCBhIHBlcnNpc3RlbnQgbGluay4gICovCisjZGVmaW5lIElfRkxVU0hCQU5EIChfX1NJRCB8MjgpIC8qIEZsdXNoIG9ubHkgYmFuZCBzcGVjaWZpZWQuICAqLworI2RlZmluZSBJX0NLQkFORCAgICAoX19TSUQgfDI5KSAvKiBDaGVjayBpZiB0aGUgbWVzc2FnZSBvZiBhIGdpdmVuIHByaW9yaXR5CisJCQkJICAgYmFuZCBleGlzdHMgb24gdGhlIFNUUkVBTSBoZWFkIHJlYWQKKwkJCQkgICBxdWV1ZS4gICovCisjZGVmaW5lIElfR0VUQkFORCAgIChfX1NJRCB8MzApIC8qIFJldHVybiB0aGUgcHJpb3JpdHkgYmFuZCBvZiB0aGUgZmlyc3QKKwkJCQkgICBtZXNzYWdlIG9uIHRoZSBTVFJFQU0gaGVhZCByZWFkIHF1ZXVlLiAgKi8KKyNkZWZpbmUgSV9BVE1BUksgICAgKF9fU0lEIHwzMSkgLyogU2VlIGlmIHRoZSBjdXJyZW50IG1lc3NhZ2Ugb24gdGhlIFNUUkVBTQorCQkJCSAgIGhlYWQgcmVhZCBxdWV1ZSBpcyAibWFya2VkIiBieSBzb21lIG1vZHVsZQorCQkJCSAgIGRvd25zdHJlYW0uICAqLworI2RlZmluZSBJX1NFVENMVElNRSAoX19TSUQgfDMyKSAvKiBTZXQgdGhlIHRpbWUgdGhlIFNUUkVBTSBoZWFkIHdpbGwgZGVsYXkgd2hlbgorCQkJCSAgIGEgU1RSRUFNIGlzIGNsb3NpbmcgYW5kIHRoZXJlIGlzIGRhdGEgb24KKwkJCQkgICB0aGUgd3JpdGUgcXVldWVzLiAgKi8KKyNkZWZpbmUgSV9HRVRDTFRJTUUgKF9fU0lEIHwzMykgLyogR2V0IGN1cnJlbnQgdmFsdWUgZm9yIGNsb3NpbmcgdGltZW91dC4gICovCisjZGVmaW5lIElfQ0FOUFVUICAgIChfX1NJRCB8MzQpIC8qIENoZWNrIGlmIGEgY2VydGFpbiBiYW5kIGlzIHdyaXRhYmxlLiAgKi8KKworCisvKiBVc2VkIGluIGBJX0xPT0snIHJlcXVlc3QuICAqLworI2RlZmluZSBGTU5BTUVTWgk4CS8qIGNvbXBhdGliaWxpdHkgdy9Vbml4V2FyZS9Tb2xhcmlzLiAgKi8KKworLyogRmx1c2ggb3B0aW9ucy4gICovCisjZGVmaW5lIEZMVVNIUgkJMHgwMQkvKiBGbHVzaCByZWFkIHF1ZXVlcy4gICovCisjZGVmaW5lIEZMVVNIVwkJMHgwMgkvKiBGbHVzaCB3cml0ZSBxdWV1ZXMuICAqLworI2RlZmluZSBGTFVTSFJXCQkweDAzCS8qIEZsdXNoIHJlYWQgYW5kIHdyaXRlIHF1ZXVlcy4gICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBGTFVTSEJBTkQJMHgwNAkvKiBGbHVzaCBvbmx5IHNwZWNpZmllZCBiYW5kLiAgKi8KKyNlbmRpZgorCisvKiBQb3NzaWJsZSBhcmd1bWVudHMgZm9yIGBJX1NFVFNJRycuICAqLworI2RlZmluZSBTX0lOUFVUCQkweDAwMDEJLyogQSBtZXNzYWdlLCBvdGhlciB0aGFuIGEgaGlnaC1wcmlvcml0eQorCQkJCSAgIG1lc3NhZ2UsIGhhcyBhcnJpdmVkLiAgKi8KKyNkZWZpbmUgU19ISVBSSQkJMHgwMDAyCS8qIEEgaGlnaC1wcmlvcml0eSBtZXNzYWdlIGlzIHByZXNlbnQuICAqLworI2RlZmluZSBTX09VVFBVVAkweDAwMDQJLyogVGhlIHdyaXRlIHF1ZXVlIGZvciBub3JtYWwgZGF0YSBpcyBubyBsb25nZXIKKwkJCQkgICBmdWxsLiAgKi8KKyNkZWZpbmUgU19NU0cJCTB4MDAwOAkvKiBBIFNUUkVBTVMgc2lnbmFsIG1lc3NhZ2UgdGhhdCBjb250YWlucyB0aGUKKwkJCQkgICBTSUdQT0xMIHNpZ25hbCByZWFjaGVzIHRoZSBmcm9udCBvZiB0aGUKKwkJCQkgICBTVFJFQU0gaGVhZCByZWFkIHF1ZXVlLiAgKi8KKyNkZWZpbmUgU19FUlJPUgkJMHgwMDEwCS8qIE5vdGlmaWNhdGlvbiBvZiBhbiBlcnJvciBjb25kaXRpb24uICAqLworI2RlZmluZSBTX0hBTkdVUAkweDAwMjAJLyogTm90aWZpY2F0aW9uIG9mIGEgaGFuZ3VwLiAgKi8KKyNkZWZpbmUgU19SRE5PUk0JMHgwMDQwCS8qIEEgbm9ybWFsIG1lc3NhZ2UgaGFzIGFycml2ZWQuICAqLworI2RlZmluZSBTX1dSTk9STQlTX09VVFBVVAorI2RlZmluZSBTX1JEQkFORAkweDAwODAJLyogQSBtZXNzYWdlIHdpdGggYSBub24temVybyBwcmlvcml0eSBoYXMKKwkJCQkgICBhcnJpdmVkLiAgKi8KKyNkZWZpbmUgU19XUkJBTkQJMHgwMTAwCS8qIFRoZSB3cml0ZSBxdWV1ZSBmb3IgYSBub24temVybyBwcmlvcml0eQorCQkJCSAgIGJhbmQgaXMgbm8gbG9uZ2VyIGZ1bGwuICAqLworI2RlZmluZSBTX0JBTkRVUkcJMHgwMjAwCS8qIFdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNfUkRCQU5ELAorCQkJCSAgIFNJR1VSRyBpcyBnZW5lcmF0ZWQgaW5zdGVhZCBvZiBTSUdQT0xMIHdoZW4KKwkJCQkgICBhIHByaW9yaXR5IG1lc3NhZ2UgcmVhY2hlcyB0aGUgZnJvbnQgb2YgdGhlCisJCQkJICAgU1RSRUFNIGhlYWQgcmVhZCBxdWV1ZS4gICovCisKKy8qIE9wdGlvbiBmb3IgYElfUEVFSycuICAqLworI2RlZmluZSBSU19ISVBSSQkweDAxCS8qIE9ubHkgbG9vayBmb3IgaGlnaC1wcmlvcml0eSBtZXNzYWdlcy4gICovCisKKy8qIE9wdGlvbnMgZm9yIGBJX1NSRE9QVCcuICAqLworI2RlZmluZSBSTk9STQkJMHgwMDAwCS8qIEJ5dGUtU1RSRUFNIG1vZGUsIHRoZSBkZWZhdWx0LiAgKi8KKyNkZWZpbmUgUk1TR0QJCTB4MDAwMQkvKiBNZXNzYWdlLWRpc2NhcmQgbW9kZS4gICAqLworI2RlZmluZSBSTVNHTgkJMHgwMDAyCS8qIE1lc3NhZ2Utbm9uZGlzY2FyZCBtb2RlLiAgICovCisjZGVmaW5lIFJQUk9UREFUCTB4MDAwNAkvKiBEZWxpdmVyIHRoZSBjb250cm9sIHBhcnQgb2YgYSBtZXNzYWdlIGFzCisJCQkJICAgZGF0YS4gICovCisjZGVmaW5lIFJQUk9URElTCTB4MDAwOAkvKiBEaXNjYXJkIHRoZSBjb250cm9sIHBhcnQgb2YgYSBtZXNzYWdlLAorCQkJCSAgIGRlbGl2ZXJpbmcgYW55IGRhdGEgcGFydC4gICovCisjZGVmaW5lIFJQUk9UTk9STQkweDAwMTAJLyogRmFpbCBgcmVhZCcgd2l0aCBFQkFETVNHIGlmIGEgbWVzc2FnZQorCQkJCSAgIGNvbnRhaW5pbmcgYSBjb250cm9sIHBhcnQgaXMgYXQgdGhlIGZyb250CisJCQkJICAgb2YgdGhlIFNUUkVBTSBoZWFkIHJlYWQgcXVldWUuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgUlBST1RNQVNLCTB4MDAxQwkvKiBUaGUgUlBST1QgYml0cyAqLworI2VuZGlmCisKKy8qIFBvc3NpYmxlIG1vZGUgZm9yIGBJX1NXUk9QVCcuICAqLworI2RlZmluZSBTTkRaRVJPCQkweDAwMQkvKiBTZW5kIGEgemVyby1sZW5ndGggbWVzc2FnZSBkb3duc3RyZWFtIHdoZW4gYQorCQkJCSAgIGB3cml0ZScgb2YgMCBieXRlcyBvY2N1cnMuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgU05EUElQRQkweDAwMgkvKiBTZW5kIFNJR1BJUEUgb24gd3JpdGUgYW5kIHB1dG1zZyBpZgorCQkJCSAgIHNkX3dlcnJvciBpcyBzZXQuICAqLworI2VuZGlmCisKKy8qIEFyZ3VtZW50cyBmb3IgYElfQVRNQVJLJy4gICovCisjZGVmaW5lIEFOWU1BUksJCTB4MDEJLyogQ2hlY2sgaWYgdGhlIG1lc3NhZ2UgaXMgbWFya2VkLiAgKi8KKyNkZWZpbmUgTEFTVE1BUksJMHgwMgkvKiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyB0aGUgbGFzdCBvbmUgbWFya2VkCisJCQkJICAgb24gdGhlIHF1ZXVlLiAgKi8KKworLyogQXJndW1lbnQgZm9yIGBJX1VOTElOSycuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTVVYSURfQUxMCSgtMSkJLyogVW5saW5rIGFsbCBTVFJFQU1zIGxpbmtlZCB0byB0aGUgU1RSRUFNCisJCQkJICAgYXNzb2NpYXRlZCB3aXRoIGBmaWxkZXMnLiAgKi8KKyNlbmRpZgorCisKKy8qIE1hY3JvcyBmb3IgYGdldG1zZycsIGBnZXRwbXNnJywgYHB1dG1zZycgYW5kIGBwdXRwbXNnJy4gICovCisjZGVmaW5lIE1TR19ISVBSSQkweDAxCS8qIFNlbmQvcmVjZWl2ZSBoaWdoIHByaW9yaXR5IG1lc3NhZ2UuICAqLworI2RlZmluZSBNU0dfQU5ZCQkweDAyCS8qIFJlY2VpdmUgYW55IG1lc3NhZ2UuICAqLworI2RlZmluZSBNU0dfQkFORAkweDA0CS8qIFJlY2VpdmUgbWVzc2FnZSBmcm9tIHNwZWNpZmllZCBiYW5kLiAgKi8KKworLyogVmFsdWVzIHJldHVybmVkIGJ5IGdldG1zZyBhbmQgZ2V0cG1zZyAqLworI2RlZmluZSBNT1JFQ1RMCQkxCS8qIE1vcmUgY29udHJvbCBpbmZvcm1hdGlvbiBpcyBsZWZ0IGluCisJCQkJICAgbWVzc2FnZS4gICovCisjZGVmaW5lIE1PUkVEQVRBCTIJLyogTW9yZSBkYXRhIGlzIGxlZnQgaW4gbWVzc2FnZS4gICovCisKKworLyogU3RydWN0dXJlIHVzZWQgZm9yIHRoZSBJX0ZMVVNIQkFORCBpb2N0bCBvbiBzdHJlYW1zLiAgKi8KK3N0cnVjdCBiYW5kaW5mbworICB7CisgICAgdW5zaWduZWQgY2hhciBiaV9wcmk7CisgICAgaW50IGJpX2ZsYWc7CisgIH07CisKK3N0cnVjdCBzdHJidWYKKyAgeworICAgIGludCBtYXhsZW47CQkvKiBNYXhpbXVtIGJ1ZmZlciBsZW5ndGguICAqLworICAgIGludCBsZW47CQkvKiBMZW5ndGggb2YgZGF0YS4gICovCisgICAgY2hhciAqYnVmOwkJLyogUG9pbnRlciB0byBidWZmZXIuICAqLworICB9OworCitzdHJ1Y3Qgc3RycGVlaworICB7CisgICAgc3RydWN0IHN0cmJ1ZiBjdGxidWY7CisgICAgc3RydWN0IHN0cmJ1ZiBkYXRhYnVmOworICAgIHRfdXNjYWxhcl90IGZsYWdzOwkJCS8qIFVuaXhXYXJlL1NvbGFyaXMgY29tcGF0aWJpbGl0eS4gICovCisgIH07CisKK3N0cnVjdCBzdHJmZGluc2VydAorICB7CisgICAgc3RydWN0IHN0cmJ1ZiBjdGxidWY7CisgICAgc3RydWN0IHN0cmJ1ZiBkYXRhYnVmOworICAgIHRfdXNjYWxhcl90IGZsYWdzOwkJCS8qIFVuaXhXYXJlL1NvbGFyaXMgY29tcGF0aWJpbGl0eS4gICovCisgICAgaW50IGZpbGRlczsKKyAgICBpbnQgb2Zmc2V0OworICB9OworCitzdHJ1Y3Qgc3RyaW9jdGwKKyAgeworICAgIGludCBpY19jbWQ7CisgICAgaW50IGljX3RpbW91dDsKKyAgICBpbnQgaWNfbGVuOworICAgIGNoYXIgKmljX2RwOworICB9OworCitzdHJ1Y3Qgc3RycmVjdmZkCisgIHsKKyAgICBpbnQgZmQ7CisgICAgdWlkX3QgdWlkOworICAgIGdpZF90IGdpZDsKKyAgICBjaGFyIF9fZmlsbFs4XTsJCQkvKiBVbml4V2FyZS9Tb2xhcmlzIGNvbXBhdGliaWxpdHkgKi8KKyAgfTsKKworCitzdHJ1Y3Qgc3RyX21saXN0CisgIHsKKyAgICBjaGFyIGxfbmFtZVtGTU5BTUVTWiArIDFdOworICB9OworCitzdHJ1Y3Qgc3RyX2xpc3QKKyAgeworICAgIGludCBzbF9ubW9kczsKKyAgICBzdHJ1Y3Qgc3RyX21saXN0ICpzbF9tb2RsaXN0OworICB9OworCisjZW5kaWYgLyogYml0cy9zdHJvcHRzLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zeXNfZXJybGlzdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N5c19lcnJsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1NTZlOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zeXNfZXJybGlzdC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIERlY2xhcmUgc3lzX2Vycmxpc3QgYW5kIHN5c19uZXJyLCBvciBkb24ndC4gIENvbXBhdGliaWxpdHkgKGRvKSB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVERJT19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N5c19lcnJsaXN0Lmg+IGRpcmVjdGx5OyB1c2UgPHN0ZGlvLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIHN5c19lcnJsaXN0IGFuZCBzeXNfbmVyciBhcmUgZGVwcmVjYXRlZC4gIFVzZSBzdHJlcnJvciBpbnN0ZWFkLiAgKi8KKworI2lmZGVmICBfX1VTRV9CU0QKK2V4dGVybiBpbnQgc3lzX25lcnI7CitleHRlcm4gX19jb25zdCBjaGFyICpfX2NvbnN0IHN5c19lcnJsaXN0W107CisjZW5kaWYKKyNpZmRlZiAgX19VU0VfR05VCitleHRlcm4gaW50IF9zeXNfbmVycjsKK2V4dGVybiBfX2NvbnN0IGNoYXIgKl9fY29uc3QgX3N5c19lcnJsaXN0W107CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zeXNjYWxsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3lzY2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZTIxMjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3lzY2FsbC5oCkBAIC0wLDAgKzEsMzU0IEBACisvKiBHZW5lcmF0ZWQgYXQgbGliYyBidWlsZCB0aW1lIGZyb20ga2VybmVsIHN5c2NhbGwgbGlzdC4gICovCisKKyNpZm5kZWYgX1NZU0NBTExfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3N5c2NhbGwuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9zeXNjYWxsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKyNkZWZpbmUgU1lTX19sbHNlZWsgX19OUl9fbGxzZWVrCisjZGVmaW5lIFNZU19fbmV3c2VsZWN0IF9fTlJfX25ld3NlbGVjdAorI2RlZmluZSBTWVNfX3N5c2N0bCBfX05SX19zeXNjdGwKKyNkZWZpbmUgU1lTX2FjY2VzcyBfX05SX2FjY2VzcworI2RlZmluZSBTWVNfYWNjdCBfX05SX2FjY3QKKyNkZWZpbmUgU1lTX2FkZF9rZXkgX19OUl9hZGRfa2V5CisjZGVmaW5lIFNZU19hZGp0aW1leCBfX05SX2FkanRpbWV4CisjZGVmaW5lIFNZU19hZnNfc3lzY2FsbCBfX05SX2Fmc19zeXNjYWxsCisjZGVmaW5lIFNZU19hbGFybSBfX05SX2FsYXJtCisjZGVmaW5lIFNZU19iZGZsdXNoIF9fTlJfYmRmbHVzaAorI2RlZmluZSBTWVNfYnJlYWsgX19OUl9icmVhaworI2RlZmluZSBTWVNfYnJrIF9fTlJfYnJrCisjZGVmaW5lIFNZU19jYXBnZXQgX19OUl9jYXBnZXQKKyNkZWZpbmUgU1lTX2NhcHNldCBfX05SX2NhcHNldAorI2RlZmluZSBTWVNfY2hkaXIgX19OUl9jaGRpcgorI2RlZmluZSBTWVNfY2htb2QgX19OUl9jaG1vZAorI2RlZmluZSBTWVNfY2hvd24gX19OUl9jaG93bgorI2RlZmluZSBTWVNfY2hvd24zMiBfX05SX2Nob3duMzIKKyNkZWZpbmUgU1lTX2Nocm9vdCBfX05SX2Nocm9vdAorI2RlZmluZSBTWVNfY2xvY2tfYWRqdGltZSBfX05SX2Nsb2NrX2FkanRpbWUKKyNkZWZpbmUgU1lTX2Nsb2NrX2dldHJlcyBfX05SX2Nsb2NrX2dldHJlcworI2RlZmluZSBTWVNfY2xvY2tfZ2V0dGltZSBfX05SX2Nsb2NrX2dldHRpbWUKKyNkZWZpbmUgU1lTX2Nsb2NrX25hbm9zbGVlcCBfX05SX2Nsb2NrX25hbm9zbGVlcAorI2RlZmluZSBTWVNfY2xvY2tfc2V0dGltZSBfX05SX2Nsb2NrX3NldHRpbWUKKyNkZWZpbmUgU1lTX2Nsb25lIF9fTlJfY2xvbmUKKyNkZWZpbmUgU1lTX2Nsb3NlIF9fTlJfY2xvc2UKKyNkZWZpbmUgU1lTX2NyZWF0IF9fTlJfY3JlYXQKKyNkZWZpbmUgU1lTX2NyZWF0ZV9tb2R1bGUgX19OUl9jcmVhdGVfbW9kdWxlCisjZGVmaW5lIFNZU19kZWxldGVfbW9kdWxlIF9fTlJfZGVsZXRlX21vZHVsZQorI2RlZmluZSBTWVNfZHVwIF9fTlJfZHVwCisjZGVmaW5lIFNZU19kdXAyIF9fTlJfZHVwMgorI2RlZmluZSBTWVNfZHVwMyBfX05SX2R1cDMKKyNkZWZpbmUgU1lTX2Vwb2xsX2NyZWF0ZSBfX05SX2Vwb2xsX2NyZWF0ZQorI2RlZmluZSBTWVNfZXBvbGxfY3JlYXRlMSBfX05SX2Vwb2xsX2NyZWF0ZTEKKyNkZWZpbmUgU1lTX2Vwb2xsX2N0bCBfX05SX2Vwb2xsX2N0bAorI2RlZmluZSBTWVNfZXBvbGxfcHdhaXQgX19OUl9lcG9sbF9wd2FpdAorI2RlZmluZSBTWVNfZXBvbGxfd2FpdCBfX05SX2Vwb2xsX3dhaXQKKyNkZWZpbmUgU1lTX2V2ZW50ZmQgX19OUl9ldmVudGZkCisjZGVmaW5lIFNZU19ldmVudGZkMiBfX05SX2V2ZW50ZmQyCisjZGVmaW5lIFNZU19leGVjdmUgX19OUl9leGVjdmUKKyNkZWZpbmUgU1lTX2V4aXQgX19OUl9leGl0CisjZGVmaW5lIFNZU19leGl0X2dyb3VwIF9fTlJfZXhpdF9ncm91cAorI2RlZmluZSBTWVNfZmFjY2Vzc2F0IF9fTlJfZmFjY2Vzc2F0CisjZGVmaW5lIFNZU19mYWR2aXNlNjQgX19OUl9mYWR2aXNlNjQKKyNkZWZpbmUgU1lTX2ZhZHZpc2U2NF82NCBfX05SX2ZhZHZpc2U2NF82NAorI2RlZmluZSBTWVNfZmFsbG9jYXRlIF9fTlJfZmFsbG9jYXRlCisjZGVmaW5lIFNZU19mYW5vdGlmeV9pbml0IF9fTlJfZmFub3RpZnlfaW5pdAorI2RlZmluZSBTWVNfZmFub3RpZnlfbWFyayBfX05SX2Zhbm90aWZ5X21hcmsKKyNkZWZpbmUgU1lTX2ZjaGRpciBfX05SX2ZjaGRpcgorI2RlZmluZSBTWVNfZmNobW9kIF9fTlJfZmNobW9kCisjZGVmaW5lIFNZU19mY2htb2RhdCBfX05SX2ZjaG1vZGF0CisjZGVmaW5lIFNZU19mY2hvd24gX19OUl9mY2hvd24KKyNkZWZpbmUgU1lTX2ZjaG93bjMyIF9fTlJfZmNob3duMzIKKyNkZWZpbmUgU1lTX2ZjaG93bmF0IF9fTlJfZmNob3duYXQKKyNkZWZpbmUgU1lTX2ZjbnRsIF9fTlJfZmNudGwKKyNkZWZpbmUgU1lTX2ZjbnRsNjQgX19OUl9mY250bDY0CisjZGVmaW5lIFNZU19mZGF0YXN5bmMgX19OUl9mZGF0YXN5bmMKKyNkZWZpbmUgU1lTX2ZnZXR4YXR0ciBfX05SX2ZnZXR4YXR0cgorI2RlZmluZSBTWVNfZmxpc3R4YXR0ciBfX05SX2ZsaXN0eGF0dHIKKyNkZWZpbmUgU1lTX2Zsb2NrIF9fTlJfZmxvY2sKKyNkZWZpbmUgU1lTX2ZvcmsgX19OUl9mb3JrCisjZGVmaW5lIFNZU19mcmVtb3ZleGF0dHIgX19OUl9mcmVtb3ZleGF0dHIKKyNkZWZpbmUgU1lTX2ZzZXR4YXR0ciBfX05SX2ZzZXR4YXR0cgorI2RlZmluZSBTWVNfZnN0YXQgX19OUl9mc3RhdAorI2RlZmluZSBTWVNfZnN0YXQ2NCBfX05SX2ZzdGF0NjQKKyNkZWZpbmUgU1lTX2ZzdGF0YXQ2NCBfX05SX2ZzdGF0YXQ2NAorI2RlZmluZSBTWVNfZnN0YXRmcyBfX05SX2ZzdGF0ZnMKKyNkZWZpbmUgU1lTX2ZzdGF0ZnM2NCBfX05SX2ZzdGF0ZnM2NAorI2RlZmluZSBTWVNfZnN5bmMgX19OUl9mc3luYworI2RlZmluZSBTWVNfZnRpbWUgX19OUl9mdGltZQorI2RlZmluZSBTWVNfZnRydW5jYXRlIF9fTlJfZnRydW5jYXRlCisjZGVmaW5lIFNZU19mdHJ1bmNhdGU2NCBfX05SX2Z0cnVuY2F0ZTY0CisjZGVmaW5lIFNZU19mdXRleCBfX05SX2Z1dGV4CisjZGVmaW5lIFNZU19mdXRpbWVzYXQgX19OUl9mdXRpbWVzYXQKKyNkZWZpbmUgU1lTX2dldF9rZXJuZWxfc3ltcyBfX05SX2dldF9rZXJuZWxfc3ltcworI2RlZmluZSBTWVNfZ2V0X21lbXBvbGljeSBfX05SX2dldF9tZW1wb2xpY3kKKyNkZWZpbmUgU1lTX2dldF9yb2J1c3RfbGlzdCBfX05SX2dldF9yb2J1c3RfbGlzdAorI2RlZmluZSBTWVNfZ2V0X3RocmVhZF9hcmVhIF9fTlJfZ2V0X3RocmVhZF9hcmVhCisjZGVmaW5lIFNZU19nZXRjcHUgX19OUl9nZXRjcHUKKyNkZWZpbmUgU1lTX2dldGN3ZCBfX05SX2dldGN3ZAorI2RlZmluZSBTWVNfZ2V0ZGVudHMgX19OUl9nZXRkZW50cworI2RlZmluZSBTWVNfZ2V0ZGVudHM2NCBfX05SX2dldGRlbnRzNjQKKyNkZWZpbmUgU1lTX2dldGVnaWQgX19OUl9nZXRlZ2lkCisjZGVmaW5lIFNZU19nZXRlZ2lkMzIgX19OUl9nZXRlZ2lkMzIKKyNkZWZpbmUgU1lTX2dldGV1aWQgX19OUl9nZXRldWlkCisjZGVmaW5lIFNZU19nZXRldWlkMzIgX19OUl9nZXRldWlkMzIKKyNkZWZpbmUgU1lTX2dldGdpZCBfX05SX2dldGdpZAorI2RlZmluZSBTWVNfZ2V0Z2lkMzIgX19OUl9nZXRnaWQzMgorI2RlZmluZSBTWVNfZ2V0Z3JvdXBzIF9fTlJfZ2V0Z3JvdXBzCisjZGVmaW5lIFNZU19nZXRncm91cHMzMiBfX05SX2dldGdyb3VwczMyCisjZGVmaW5lIFNZU19nZXRpdGltZXIgX19OUl9nZXRpdGltZXIKKyNkZWZpbmUgU1lTX2dldHBnaWQgX19OUl9nZXRwZ2lkCisjZGVmaW5lIFNZU19nZXRwZ3JwIF9fTlJfZ2V0cGdycAorI2RlZmluZSBTWVNfZ2V0cGlkIF9fTlJfZ2V0cGlkCisjZGVmaW5lIFNZU19nZXRwbXNnIF9fTlJfZ2V0cG1zZworI2RlZmluZSBTWVNfZ2V0cHBpZCBfX05SX2dldHBwaWQKKyNkZWZpbmUgU1lTX2dldHByaW9yaXR5IF9fTlJfZ2V0cHJpb3JpdHkKKyNkZWZpbmUgU1lTX2dldHJlc2dpZCBfX05SX2dldHJlc2dpZAorI2RlZmluZSBTWVNfZ2V0cmVzZ2lkMzIgX19OUl9nZXRyZXNnaWQzMgorI2RlZmluZSBTWVNfZ2V0cmVzdWlkIF9fTlJfZ2V0cmVzdWlkCisjZGVmaW5lIFNZU19nZXRyZXN1aWQzMiBfX05SX2dldHJlc3VpZDMyCisjZGVmaW5lIFNZU19nZXRybGltaXQgX19OUl9nZXRybGltaXQKKyNkZWZpbmUgU1lTX2dldHJ1c2FnZSBfX05SX2dldHJ1c2FnZQorI2RlZmluZSBTWVNfZ2V0c2lkIF9fTlJfZ2V0c2lkCisjZGVmaW5lIFNZU19nZXR0aWQgX19OUl9nZXR0aWQKKyNkZWZpbmUgU1lTX2dldHRpbWVvZmRheSBfX05SX2dldHRpbWVvZmRheQorI2RlZmluZSBTWVNfZ2V0dWlkIF9fTlJfZ2V0dWlkCisjZGVmaW5lIFNZU19nZXR1aWQzMiBfX05SX2dldHVpZDMyCisjZGVmaW5lIFNZU19nZXR4YXR0ciBfX05SX2dldHhhdHRyCisjZGVmaW5lIFNZU19ndHR5IF9fTlJfZ3R0eQorI2RlZmluZSBTWVNfaWRsZSBfX05SX2lkbGUKKyNkZWZpbmUgU1lTX2luaXRfbW9kdWxlIF9fTlJfaW5pdF9tb2R1bGUKKyNkZWZpbmUgU1lTX2lub3RpZnlfYWRkX3dhdGNoIF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2gKKyNkZWZpbmUgU1lTX2lub3RpZnlfaW5pdCBfX05SX2lub3RpZnlfaW5pdAorI2RlZmluZSBTWVNfaW5vdGlmeV9pbml0MSBfX05SX2lub3RpZnlfaW5pdDEKKyNkZWZpbmUgU1lTX2lub3RpZnlfcm1fd2F0Y2ggX19OUl9pbm90aWZ5X3JtX3dhdGNoCisjZGVmaW5lIFNZU19pb19jYW5jZWwgX19OUl9pb19jYW5jZWwKKyNkZWZpbmUgU1lTX2lvX2Rlc3Ryb3kgX19OUl9pb19kZXN0cm95CisjZGVmaW5lIFNZU19pb19nZXRldmVudHMgX19OUl9pb19nZXRldmVudHMKKyNkZWZpbmUgU1lTX2lvX3NldHVwIF9fTlJfaW9fc2V0dXAKKyNkZWZpbmUgU1lTX2lvX3N1Ym1pdCBfX05SX2lvX3N1Ym1pdAorI2RlZmluZSBTWVNfaW9jdGwgX19OUl9pb2N0bAorI2RlZmluZSBTWVNfaW9wZXJtIF9fTlJfaW9wZXJtCisjZGVmaW5lIFNZU19pb3BsIF9fTlJfaW9wbAorI2RlZmluZSBTWVNfaW9wcmlvX2dldCBfX05SX2lvcHJpb19nZXQKKyNkZWZpbmUgU1lTX2lvcHJpb19zZXQgX19OUl9pb3ByaW9fc2V0CisjZGVmaW5lIFNZU19pcGMgX19OUl9pcGMKKyNkZWZpbmUgU1lTX2tleGVjX2xvYWQgX19OUl9rZXhlY19sb2FkCisjZGVmaW5lIFNZU19rZXljdGwgX19OUl9rZXljdGwKKyNkZWZpbmUgU1lTX2tpbGwgX19OUl9raWxsCisjZGVmaW5lIFNZU19sY2hvd24gX19OUl9sY2hvd24KKyNkZWZpbmUgU1lTX2xjaG93bjMyIF9fTlJfbGNob3duMzIKKyNkZWZpbmUgU1lTX2xnZXR4YXR0ciBfX05SX2xnZXR4YXR0cgorI2RlZmluZSBTWVNfbGluayBfX05SX2xpbmsKKyNkZWZpbmUgU1lTX2xpbmthdCBfX05SX2xpbmthdAorI2RlZmluZSBTWVNfbGlzdHhhdHRyIF9fTlJfbGlzdHhhdHRyCisjZGVmaW5lIFNZU19sbGlzdHhhdHRyIF9fTlJfbGxpc3R4YXR0cgorI2RlZmluZSBTWVNfbG9jayBfX05SX2xvY2sKKyNkZWZpbmUgU1lTX2xvb2t1cF9kY29va2llIF9fTlJfbG9va3VwX2Rjb29raWUKKyNkZWZpbmUgU1lTX2xyZW1vdmV4YXR0ciBfX05SX2xyZW1vdmV4YXR0cgorI2RlZmluZSBTWVNfbHNlZWsgX19OUl9sc2VlaworI2RlZmluZSBTWVNfbHNldHhhdHRyIF9fTlJfbHNldHhhdHRyCisjZGVmaW5lIFNZU19sc3RhdCBfX05SX2xzdGF0CisjZGVmaW5lIFNZU19sc3RhdDY0IF9fTlJfbHN0YXQ2NAorI2RlZmluZSBTWVNfbWFkdmlzZSBfX05SX21hZHZpc2UKKyNkZWZpbmUgU1lTX21hZHZpc2UxIF9fTlJfbWFkdmlzZTEKKyNkZWZpbmUgU1lTX21iaW5kIF9fTlJfbWJpbmQKKyNkZWZpbmUgU1lTX21pZ3JhdGVfcGFnZXMgX19OUl9taWdyYXRlX3BhZ2VzCisjZGVmaW5lIFNZU19taW5jb3JlIF9fTlJfbWluY29yZQorI2RlZmluZSBTWVNfbWtkaXIgX19OUl9ta2RpcgorI2RlZmluZSBTWVNfbWtkaXJhdCBfX05SX21rZGlyYXQKKyNkZWZpbmUgU1lTX21rbm9kIF9fTlJfbWtub2QKKyNkZWZpbmUgU1lTX21rbm9kYXQgX19OUl9ta25vZGF0CisjZGVmaW5lIFNZU19tbG9jayBfX05SX21sb2NrCisjZGVmaW5lIFNZU19tbG9ja2FsbCBfX05SX21sb2NrYWxsCisjZGVmaW5lIFNZU19tbWFwIF9fTlJfbW1hcAorI2RlZmluZSBTWVNfbW1hcDIgX19OUl9tbWFwMgorI2RlZmluZSBTWVNfbW9kaWZ5X2xkdCBfX05SX21vZGlmeV9sZHQKKyNkZWZpbmUgU1lTX21vdW50IF9fTlJfbW91bnQKKyNkZWZpbmUgU1lTX21vdmVfcGFnZXMgX19OUl9tb3ZlX3BhZ2VzCisjZGVmaW5lIFNZU19tcHJvdGVjdCBfX05SX21wcm90ZWN0CisjZGVmaW5lIFNZU19tcHggX19OUl9tcHgKKyNkZWZpbmUgU1lTX21xX2dldHNldGF0dHIgX19OUl9tcV9nZXRzZXRhdHRyCisjZGVmaW5lIFNZU19tcV9ub3RpZnkgX19OUl9tcV9ub3RpZnkKKyNkZWZpbmUgU1lTX21xX29wZW4gX19OUl9tcV9vcGVuCisjZGVmaW5lIFNZU19tcV90aW1lZHJlY2VpdmUgX19OUl9tcV90aW1lZHJlY2VpdmUKKyNkZWZpbmUgU1lTX21xX3RpbWVkc2VuZCBfX05SX21xX3RpbWVkc2VuZAorI2RlZmluZSBTWVNfbXFfdW5saW5rIF9fTlJfbXFfdW5saW5rCisjZGVmaW5lIFNZU19tcmVtYXAgX19OUl9tcmVtYXAKKyNkZWZpbmUgU1lTX21zeW5jIF9fTlJfbXN5bmMKKyNkZWZpbmUgU1lTX211bmxvY2sgX19OUl9tdW5sb2NrCisjZGVmaW5lIFNZU19tdW5sb2NrYWxsIF9fTlJfbXVubG9ja2FsbAorI2RlZmluZSBTWVNfbXVubWFwIF9fTlJfbXVubWFwCisjZGVmaW5lIFNZU19uYW1lX3RvX2hhbmRsZV9hdCBfX05SX25hbWVfdG9faGFuZGxlX2F0CisjZGVmaW5lIFNZU19uYW5vc2xlZXAgX19OUl9uYW5vc2xlZXAKKyNkZWZpbmUgU1lTX25mc3NlcnZjdGwgX19OUl9uZnNzZXJ2Y3RsCisjZGVmaW5lIFNZU19uaWNlIF9fTlJfbmljZQorI2RlZmluZSBTWVNfb2xkZnN0YXQgX19OUl9vbGRmc3RhdAorI2RlZmluZSBTWVNfb2xkbHN0YXQgX19OUl9vbGRsc3RhdAorI2RlZmluZSBTWVNfb2xkb2xkdW5hbWUgX19OUl9vbGRvbGR1bmFtZQorI2RlZmluZSBTWVNfb2xkc3RhdCBfX05SX29sZHN0YXQKKyNkZWZpbmUgU1lTX29sZHVuYW1lIF9fTlJfb2xkdW5hbWUKKyNkZWZpbmUgU1lTX29wZW4gX19OUl9vcGVuCisjZGVmaW5lIFNZU19vcGVuX2J5X2hhbmRsZV9hdCBfX05SX29wZW5fYnlfaGFuZGxlX2F0CisjZGVmaW5lIFNZU19vcGVuYXQgX19OUl9vcGVuYXQKKyNkZWZpbmUgU1lTX3BhdXNlIF9fTlJfcGF1c2UKKyNkZWZpbmUgU1lTX3BlcmZfZXZlbnRfb3BlbiBfX05SX3BlcmZfZXZlbnRfb3BlbgorI2RlZmluZSBTWVNfcGVyc29uYWxpdHkgX19OUl9wZXJzb25hbGl0eQorI2RlZmluZSBTWVNfcGlwZSBfX05SX3BpcGUKKyNkZWZpbmUgU1lTX3BpcGUyIF9fTlJfcGlwZTIKKyNkZWZpbmUgU1lTX3Bpdm90X3Jvb3QgX19OUl9waXZvdF9yb290CisjZGVmaW5lIFNZU19wb2xsIF9fTlJfcG9sbAorI2RlZmluZSBTWVNfcHBvbGwgX19OUl9wcG9sbAorI2RlZmluZSBTWVNfcHJjdGwgX19OUl9wcmN0bAorI2RlZmluZSBTWVNfcHJlYWQ2NCBfX05SX3ByZWFkNjQKKyNkZWZpbmUgU1lTX3ByZWFkdiBfX05SX3ByZWFkdgorI2RlZmluZSBTWVNfcHJsaW1pdDY0IF9fTlJfcHJsaW1pdDY0CisjZGVmaW5lIFNZU19wcm9jZXNzX3ZtX3JlYWR2IF9fTlJfcHJvY2Vzc192bV9yZWFkdgorI2RlZmluZSBTWVNfcHJvY2Vzc192bV93cml0ZXYgX19OUl9wcm9jZXNzX3ZtX3dyaXRldgorI2RlZmluZSBTWVNfcHJvZiBfX05SX3Byb2YKKyNkZWZpbmUgU1lTX3Byb2ZpbCBfX05SX3Byb2ZpbAorI2RlZmluZSBTWVNfcHNlbGVjdDYgX19OUl9wc2VsZWN0NgorI2RlZmluZSBTWVNfcHRyYWNlIF9fTlJfcHRyYWNlCisjZGVmaW5lIFNZU19wdXRwbXNnIF9fTlJfcHV0cG1zZworI2RlZmluZSBTWVNfcHdyaXRlNjQgX19OUl9wd3JpdGU2NAorI2RlZmluZSBTWVNfcHdyaXRldiBfX05SX3B3cml0ZXYKKyNkZWZpbmUgU1lTX3F1ZXJ5X21vZHVsZSBfX05SX3F1ZXJ5X21vZHVsZQorI2RlZmluZSBTWVNfcXVvdGFjdGwgX19OUl9xdW90YWN0bAorI2RlZmluZSBTWVNfcmVhZCBfX05SX3JlYWQKKyNkZWZpbmUgU1lTX3JlYWRhaGVhZCBfX05SX3JlYWRhaGVhZAorI2RlZmluZSBTWVNfcmVhZGRpciBfX05SX3JlYWRkaXIKKyNkZWZpbmUgU1lTX3JlYWRsaW5rIF9fTlJfcmVhZGxpbmsKKyNkZWZpbmUgU1lTX3JlYWRsaW5rYXQgX19OUl9yZWFkbGlua2F0CisjZGVmaW5lIFNZU19yZWFkdiBfX05SX3JlYWR2CisjZGVmaW5lIFNZU19yZWJvb3QgX19OUl9yZWJvb3QKKyNkZWZpbmUgU1lTX3JlY3ZtbXNnIF9fTlJfcmVjdm1tc2cKKyNkZWZpbmUgU1lTX3JlbWFwX2ZpbGVfcGFnZXMgX19OUl9yZW1hcF9maWxlX3BhZ2VzCisjZGVmaW5lIFNZU19yZW1vdmV4YXR0ciBfX05SX3JlbW92ZXhhdHRyCisjZGVmaW5lIFNZU19yZW5hbWUgX19OUl9yZW5hbWUKKyNkZWZpbmUgU1lTX3JlbmFtZWF0IF9fTlJfcmVuYW1lYXQKKyNkZWZpbmUgU1lTX3JlcXVlc3Rfa2V5IF9fTlJfcmVxdWVzdF9rZXkKKyNkZWZpbmUgU1lTX3Jlc3RhcnRfc3lzY2FsbCBfX05SX3Jlc3RhcnRfc3lzY2FsbAorI2RlZmluZSBTWVNfcm1kaXIgX19OUl9ybWRpcgorI2RlZmluZSBTWVNfcnRfc2lnYWN0aW9uIF9fTlJfcnRfc2lnYWN0aW9uCisjZGVmaW5lIFNZU19ydF9zaWdwZW5kaW5nIF9fTlJfcnRfc2lncGVuZGluZworI2RlZmluZSBTWVNfcnRfc2lncHJvY21hc2sgX19OUl9ydF9zaWdwcm9jbWFzaworI2RlZmluZSBTWVNfcnRfc2lncXVldWVpbmZvIF9fTlJfcnRfc2lncXVldWVpbmZvCisjZGVmaW5lIFNZU19ydF9zaWdyZXR1cm4gX19OUl9ydF9zaWdyZXR1cm4KKyNkZWZpbmUgU1lTX3J0X3NpZ3N1c3BlbmQgX19OUl9ydF9zaWdzdXNwZW5kCisjZGVmaW5lIFNZU19ydF9zaWd0aW1lZHdhaXQgX19OUl9ydF9zaWd0aW1lZHdhaXQKKyNkZWZpbmUgU1lTX3J0X3Rnc2lncXVldWVpbmZvIF9fTlJfcnRfdGdzaWdxdWV1ZWluZm8KKyNkZWZpbmUgU1lTX3NjaGVkX2dldF9wcmlvcml0eV9tYXggX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWF4CisjZGVmaW5lIFNZU19zY2hlZF9nZXRfcHJpb3JpdHlfbWluIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbgorI2RlZmluZSBTWVNfc2NoZWRfZ2V0YWZmaW5pdHkgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorI2RlZmluZSBTWVNfc2NoZWRfZ2V0cGFyYW0gX19OUl9zY2hlZF9nZXRwYXJhbQorI2RlZmluZSBTWVNfc2NoZWRfZ2V0c2NoZWR1bGVyIF9fTlJfc2NoZWRfZ2V0c2NoZWR1bGVyCisjZGVmaW5lIFNZU19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwgX19OUl9zY2hlZF9ycl9nZXRfaW50ZXJ2YWwKKyNkZWZpbmUgU1lTX3NjaGVkX3NldGFmZmluaXR5IF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyNkZWZpbmUgU1lTX3NjaGVkX3NldHBhcmFtIF9fTlJfc2NoZWRfc2V0cGFyYW0KKyNkZWZpbmUgU1lTX3NjaGVkX3NldHNjaGVkdWxlciBfX05SX3NjaGVkX3NldHNjaGVkdWxlcgorI2RlZmluZSBTWVNfc2NoZWRfeWllbGQgX19OUl9zY2hlZF95aWVsZAorI2RlZmluZSBTWVNfc2VsZWN0IF9fTlJfc2VsZWN0CisjZGVmaW5lIFNZU19zZW5kZmlsZSBfX05SX3NlbmRmaWxlCisjZGVmaW5lIFNZU19zZW5kZmlsZTY0IF9fTlJfc2VuZGZpbGU2NAorI2RlZmluZSBTWVNfc2VuZG1tc2cgX19OUl9zZW5kbW1zZworI2RlZmluZSBTWVNfc2V0X21lbXBvbGljeSBfX05SX3NldF9tZW1wb2xpY3kKKyNkZWZpbmUgU1lTX3NldF9yb2J1c3RfbGlzdCBfX05SX3NldF9yb2J1c3RfbGlzdAorI2RlZmluZSBTWVNfc2V0X3RocmVhZF9hcmVhIF9fTlJfc2V0X3RocmVhZF9hcmVhCisjZGVmaW5lIFNZU19zZXRfdGlkX2FkZHJlc3MgX19OUl9zZXRfdGlkX2FkZHJlc3MKKyNkZWZpbmUgU1lTX3NldGRvbWFpbm5hbWUgX19OUl9zZXRkb21haW5uYW1lCisjZGVmaW5lIFNZU19zZXRmc2dpZCBfX05SX3NldGZzZ2lkCisjZGVmaW5lIFNZU19zZXRmc2dpZDMyIF9fTlJfc2V0ZnNnaWQzMgorI2RlZmluZSBTWVNfc2V0ZnN1aWQgX19OUl9zZXRmc3VpZAorI2RlZmluZSBTWVNfc2V0ZnN1aWQzMiBfX05SX3NldGZzdWlkMzIKKyNkZWZpbmUgU1lTX3NldGdpZCBfX05SX3NldGdpZAorI2RlZmluZSBTWVNfc2V0Z2lkMzIgX19OUl9zZXRnaWQzMgorI2RlZmluZSBTWVNfc2V0Z3JvdXBzIF9fTlJfc2V0Z3JvdXBzCisjZGVmaW5lIFNZU19zZXRncm91cHMzMiBfX05SX3NldGdyb3VwczMyCisjZGVmaW5lIFNZU19zZXRob3N0bmFtZSBfX05SX3NldGhvc3RuYW1lCisjZGVmaW5lIFNZU19zZXRpdGltZXIgX19OUl9zZXRpdGltZXIKKyNkZWZpbmUgU1lTX3NldG5zIF9fTlJfc2V0bnMKKyNkZWZpbmUgU1lTX3NldHBnaWQgX19OUl9zZXRwZ2lkCisjZGVmaW5lIFNZU19zZXRwcmlvcml0eSBfX05SX3NldHByaW9yaXR5CisjZGVmaW5lIFNZU19zZXRyZWdpZCBfX05SX3NldHJlZ2lkCisjZGVmaW5lIFNZU19zZXRyZWdpZDMyIF9fTlJfc2V0cmVnaWQzMgorI2RlZmluZSBTWVNfc2V0cmVzZ2lkIF9fTlJfc2V0cmVzZ2lkCisjZGVmaW5lIFNZU19zZXRyZXNnaWQzMiBfX05SX3NldHJlc2dpZDMyCisjZGVmaW5lIFNZU19zZXRyZXN1aWQgX19OUl9zZXRyZXN1aWQKKyNkZWZpbmUgU1lTX3NldHJlc3VpZDMyIF9fTlJfc2V0cmVzdWlkMzIKKyNkZWZpbmUgU1lTX3NldHJldWlkIF9fTlJfc2V0cmV1aWQKKyNkZWZpbmUgU1lTX3NldHJldWlkMzIgX19OUl9zZXRyZXVpZDMyCisjZGVmaW5lIFNZU19zZXRybGltaXQgX19OUl9zZXRybGltaXQKKyNkZWZpbmUgU1lTX3NldHNpZCBfX05SX3NldHNpZAorI2RlZmluZSBTWVNfc2V0dGltZW9mZGF5IF9fTlJfc2V0dGltZW9mZGF5CisjZGVmaW5lIFNZU19zZXR1aWQgX19OUl9zZXR1aWQKKyNkZWZpbmUgU1lTX3NldHVpZDMyIF9fTlJfc2V0dWlkMzIKKyNkZWZpbmUgU1lTX3NldHhhdHRyIF9fTlJfc2V0eGF0dHIKKyNkZWZpbmUgU1lTX3NnZXRtYXNrIF9fTlJfc2dldG1hc2sKKyNkZWZpbmUgU1lTX3NpZ2FjdGlvbiBfX05SX3NpZ2FjdGlvbgorI2RlZmluZSBTWVNfc2lnYWx0c3RhY2sgX19OUl9zaWdhbHRzdGFjaworI2RlZmluZSBTWVNfc2lnbmFsIF9fTlJfc2lnbmFsCisjZGVmaW5lIFNZU19zaWduYWxmZCBfX05SX3NpZ25hbGZkCisjZGVmaW5lIFNZU19zaWduYWxmZDQgX19OUl9zaWduYWxmZDQKKyNkZWZpbmUgU1lTX3NpZ3BlbmRpbmcgX19OUl9zaWdwZW5kaW5nCisjZGVmaW5lIFNZU19zaWdwcm9jbWFzayBfX05SX3NpZ3Byb2NtYXNrCisjZGVmaW5lIFNZU19zaWdyZXR1cm4gX19OUl9zaWdyZXR1cm4KKyNkZWZpbmUgU1lTX3NpZ3N1c3BlbmQgX19OUl9zaWdzdXNwZW5kCisjZGVmaW5lIFNZU19zb2NrZXRjYWxsIF9fTlJfc29ja2V0Y2FsbAorI2RlZmluZSBTWVNfc3BsaWNlIF9fTlJfc3BsaWNlCisjZGVmaW5lIFNZU19zc2V0bWFzayBfX05SX3NzZXRtYXNrCisjZGVmaW5lIFNZU19zdGF0IF9fTlJfc3RhdAorI2RlZmluZSBTWVNfc3RhdDY0IF9fTlJfc3RhdDY0CisjZGVmaW5lIFNZU19zdGF0ZnMgX19OUl9zdGF0ZnMKKyNkZWZpbmUgU1lTX3N0YXRmczY0IF9fTlJfc3RhdGZzNjQKKyNkZWZpbmUgU1lTX3N0aW1lIF9fTlJfc3RpbWUKKyNkZWZpbmUgU1lTX3N0dHkgX19OUl9zdHR5CisjZGVmaW5lIFNZU19zd2Fwb2ZmIF9fTlJfc3dhcG9mZgorI2RlZmluZSBTWVNfc3dhcG9uIF9fTlJfc3dhcG9uCisjZGVmaW5lIFNZU19zeW1saW5rIF9fTlJfc3ltbGluaworI2RlZmluZSBTWVNfc3ltbGlua2F0IF9fTlJfc3ltbGlua2F0CisjZGVmaW5lIFNZU19zeW5jIF9fTlJfc3luYworI2RlZmluZSBTWVNfc3luY19maWxlX3JhbmdlIF9fTlJfc3luY19maWxlX3JhbmdlCisjZGVmaW5lIFNZU19zeW5jZnMgX19OUl9zeW5jZnMKKyNkZWZpbmUgU1lTX3N5c2ZzIF9fTlJfc3lzZnMKKyNkZWZpbmUgU1lTX3N5c2luZm8gX19OUl9zeXNpbmZvCisjZGVmaW5lIFNZU19zeXNsb2cgX19OUl9zeXNsb2cKKyNkZWZpbmUgU1lTX3RlZSBfX05SX3RlZQorI2RlZmluZSBTWVNfdGdraWxsIF9fTlJfdGdraWxsCisjZGVmaW5lIFNZU190aW1lIF9fTlJfdGltZQorI2RlZmluZSBTWVNfdGltZXJfY3JlYXRlIF9fTlJfdGltZXJfY3JlYXRlCisjZGVmaW5lIFNZU190aW1lcl9kZWxldGUgX19OUl90aW1lcl9kZWxldGUKKyNkZWZpbmUgU1lTX3RpbWVyX2dldG92ZXJydW4gX19OUl90aW1lcl9nZXRvdmVycnVuCisjZGVmaW5lIFNZU190aW1lcl9nZXR0aW1lIF9fTlJfdGltZXJfZ2V0dGltZQorI2RlZmluZSBTWVNfdGltZXJfc2V0dGltZSBfX05SX3RpbWVyX3NldHRpbWUKKyNkZWZpbmUgU1lTX3RpbWVyZmRfY3JlYXRlIF9fTlJfdGltZXJmZF9jcmVhdGUKKyNkZWZpbmUgU1lTX3RpbWVyZmRfZ2V0dGltZSBfX05SX3RpbWVyZmRfZ2V0dGltZQorI2RlZmluZSBTWVNfdGltZXJmZF9zZXR0aW1lIF9fTlJfdGltZXJmZF9zZXR0aW1lCisjZGVmaW5lIFNZU190aW1lcyBfX05SX3RpbWVzCisjZGVmaW5lIFNZU190a2lsbCBfX05SX3RraWxsCisjZGVmaW5lIFNZU190cnVuY2F0ZSBfX05SX3RydW5jYXRlCisjZGVmaW5lIFNZU190cnVuY2F0ZTY0IF9fTlJfdHJ1bmNhdGU2NAorI2RlZmluZSBTWVNfdWdldHJsaW1pdCBfX05SX3VnZXRybGltaXQKKyNkZWZpbmUgU1lTX3VsaW1pdCBfX05SX3VsaW1pdAorI2RlZmluZSBTWVNfdW1hc2sgX19OUl91bWFzaworI2RlZmluZSBTWVNfdW1vdW50IF9fTlJfdW1vdW50CisjZGVmaW5lIFNZU191bW91bnQyIF9fTlJfdW1vdW50MgorI2RlZmluZSBTWVNfdW5hbWUgX19OUl91bmFtZQorI2RlZmluZSBTWVNfdW5saW5rIF9fTlJfdW5saW5rCisjZGVmaW5lIFNZU191bmxpbmthdCBfX05SX3VubGlua2F0CisjZGVmaW5lIFNZU191bnNoYXJlIF9fTlJfdW5zaGFyZQorI2RlZmluZSBTWVNfdXNlbGliIF9fTlJfdXNlbGliCisjZGVmaW5lIFNZU191c3RhdCBfX05SX3VzdGF0CisjZGVmaW5lIFNZU191dGltZSBfX05SX3V0aW1lCisjZGVmaW5lIFNZU191dGltZW5zYXQgX19OUl91dGltZW5zYXQKKyNkZWZpbmUgU1lTX3V0aW1lcyBfX05SX3V0aW1lcworI2RlZmluZSBTWVNfdmZvcmsgX19OUl92Zm9yaworI2RlZmluZSBTWVNfdmhhbmd1cCBfX05SX3ZoYW5ndXAKKyNkZWZpbmUgU1lTX3ZtODYgX19OUl92bTg2CisjZGVmaW5lIFNZU192bTg2b2xkIF9fTlJfdm04Nm9sZAorI2RlZmluZSBTWVNfdm1zcGxpY2UgX19OUl92bXNwbGljZQorI2RlZmluZSBTWVNfdnNlcnZlciBfX05SX3ZzZXJ2ZXIKKyNkZWZpbmUgU1lTX3dhaXQ0IF9fTlJfd2FpdDQKKyNkZWZpbmUgU1lTX3dhaXRpZCBfX05SX3dhaXRpZAorI2RlZmluZSBTWVNfd2FpdHBpZCBfX05SX3dhaXRwaWQKKyNkZWZpbmUgU1lTX3dyaXRlIF9fTlJfd3JpdGUKKyNkZWZpbmUgU1lTX3dyaXRldiBfX05SX3dyaXRldgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N5c2xvZy1sZGJsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3lzbG9nLWxkYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTRlNzBjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N5c2xvZy1sZGJsLmgKQEAgLTAsMCArMSwzNiBAQAorLyogLW1sb25nLWRvdWJsZS02NCBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIHN5c2xvZyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TWVNMT0dfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zeXNsb2ctbGRibC5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc3lzbG9nLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK19fTERCTF9SRURJUl9ERUNMIChzeXNsb2cpCisKKyNpZmRlZiBfX1VTRV9CU0QKK19fTERCTF9SRURJUl9ERUNMICh2c3lzbG9nKQorI2VuZGlmCisKKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKK19fTERCTF9SRURJUl9ERUNMIChfX3N5c2xvZ19jaGspCisKKyMgaWZkZWYgX19VU0VfQlNECitfX0xEQkxfUkVESVJfREVDTCAoX192c3lzbG9nX2NoaykKKyMgZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N5c2xvZy1wYXRoLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3lzbG9nLXBhdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWJiZDZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N5c2xvZy1wYXRoLmgKQEAgLTAsMCArMSwyOSBAQAorLyogPGJpdHMvc3lzbG9nLXBhdGguaD4gLS0gX1BBVEhfTE9HIGRlZmluaXRpb24KKyAgIENvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NZU0xPR19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gIFVzZSA8c3lzL3N5c2xvZy5oPiBpbnN0ZWFkIgorI2VuZGlmCisKKyNpZm5kZWYgX0JJVFNfU1lTTE9HX1BBVEhfSAorI2RlZmluZSBfQklUU19TWVNMT0dfUEFUSF9IIDEKKworI2RlZmluZQlfUEFUSF9MT0cJIi9kZXYvbG9nIgorCisjZW5kaWYgLyogYml0cy9zeXNsb2ctcGF0aC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3lzbG9nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3lzbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2NGQ3YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zeXNsb2cuaApAQCAtMCwwICsxLDUwIEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHN5c2xvZyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcsIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TWVNMT0dfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zeXNsb2cuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3N5c2xvZy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKK2V4dGVybiB2b2lkIF9fc3lzbG9nX2NoayAoaW50IF9fcHJpLCBpbnQgX19mbGFnLCBfX2NvbnN0IGNoYXIgKl9fZm10LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOworCisjaWZkZWYgX192YV9hcmdfcGFjaworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkCitzeXNsb2cgKGludCBfX3ByaSwgX19jb25zdCBjaGFyICpfX2ZtdCwgLi4uKQoreworICBfX3N5c2xvZ19jaGsgKF9fcHJpLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsIF9fdmFfYXJnX3BhY2sgKCkpOworfQorI2VsaWYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgZGVmaW5lIHN5c2xvZyhwcmksIC4uLikgXAorICBfX3N5c2xvZ19jaGsgKHByaSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0JTRAorZXh0ZXJuIHZvaWQgX192c3lzbG9nX2NoayAoaW50IF9fcHJpLCBpbnQgX19mbGFnLCBfX2NvbnN0IGNoYXIgKl9fZm10LAorCQkJICAgX19nbnVjX3ZhX2xpc3QgX19hcCkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDApKSk7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZAordnN5c2xvZyAoaW50IF9fcHJpLCBfX2NvbnN0IGNoYXIgKl9fZm10LCBfX2dudWNfdmFfbGlzdCBfX2FwKQoreworICBfX3ZzeXNsb2dfY2hrIChfX3ByaSwgIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX19hcCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy90ZXJtaW9zLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdGVybWlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjRjZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdGVybWlvcy5oCkBAIC0wLDAgKzEsMjIwIEBACisvKiB0ZXJtaW9zIHR5cGUgYW5kIG1hY3JvIGRlZmluaXRpb25zLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5My0xOTk5LCAyMDAzLCAyMDA1LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9URVJNSU9TX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvdGVybWlvcy5oPiBkaXJlY3RseTsgdXNlIDx0ZXJtaW9zLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgljY190OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJc3BlZWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CXRjZmxhZ190OworCisjZGVmaW5lIE5DQ1MgMzIKK3N0cnVjdCB0ZXJtaW9zCisgIHsKKyAgICB0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworICAgIHRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworICAgIHRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKyAgICB0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworICAgIGNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworICAgIGNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworICAgIHNwZWVkX3QgY19pc3BlZWQ7CQkvKiBpbnB1dCBzcGVlZCAqLworICAgIHNwZWVkX3QgY19vc3BlZWQ7CQkvKiBvdXRwdXQgc3BlZWQgKi8KKyNkZWZpbmUgX0hBVkVfU1RSVUNUX1RFUk1JT1NfQ19JU1BFRUQgMQorI2RlZmluZSBfSEFWRV9TVFJVQ1RfVEVSTUlPU19DX09TUEVFRCAxCisgIH07CisKKy8qIGNfY2MgY2hhcmFjdGVycyAqLworI2RlZmluZSBWSU5UUiAwCisjZGVmaW5lIFZRVUlUIDEKKyNkZWZpbmUgVkVSQVNFIDIKKyNkZWZpbmUgVktJTEwgMworI2RlZmluZSBWRU9GIDQKKyNkZWZpbmUgVlRJTUUgNQorI2RlZmluZSBWTUlOIDYKKyNkZWZpbmUgVlNXVEMgNworI2RlZmluZSBWU1RBUlQgOAorI2RlZmluZSBWU1RPUCA5CisjZGVmaW5lIFZTVVNQIDEwCisjZGVmaW5lIFZFT0wgMTEKKyNkZWZpbmUgVlJFUFJJTlQgMTIKKyNkZWZpbmUgVkRJU0NBUkQgMTMKKyNkZWZpbmUgVldFUkFTRSAxNAorI2RlZmluZSBWTE5FWFQgMTUKKyNkZWZpbmUgVkVPTDIgMTYKKworLyogY19pZmxhZyBiaXRzICovCisjZGVmaW5lIElHTkJSSwkwMDAwMDAxCisjZGVmaW5lIEJSS0lOVAkwMDAwMDAyCisjZGVmaW5lIElHTlBBUgkwMDAwMDA0CisjZGVmaW5lIFBBUk1SSwkwMDAwMDEwCisjZGVmaW5lIElOUENLCTAwMDAwMjAKKyNkZWZpbmUgSVNUUklQCTAwMDAwNDAKKyNkZWZpbmUgSU5MQ1IJMDAwMDEwMAorI2RlZmluZSBJR05DUgkwMDAwMjAwCisjZGVmaW5lIElDUk5MCTAwMDA0MDAKKyNkZWZpbmUgSVVDTEMJMDAwMTAwMAorI2RlZmluZSBJWE9OCTAwMDIwMDAKKyNkZWZpbmUgSVhBTlkJMDAwNDAwMAorI2RlZmluZSBJWE9GRgkwMDEwMDAwCisjZGVmaW5lIElNQVhCRUwJMDAyMDAwMAorI2RlZmluZSBJVVRGOAkwMDQwMDAwCisKKy8qIGNfb2ZsYWcgYml0cyAqLworI2RlZmluZSBPUE9TVAkwMDAwMDAxCisjZGVmaW5lIE9MQ1VDCTAwMDAwMDIKKyNkZWZpbmUgT05MQ1IJMDAwMDAwNAorI2RlZmluZSBPQ1JOTAkwMDAwMDEwCisjZGVmaW5lIE9OT0NSCTAwMDAwMjAKKyNkZWZpbmUgT05MUkVUCTAwMDAwNDAKKyNkZWZpbmUgT0ZJTEwJMDAwMDEwMAorI2RlZmluZSBPRkRFTAkwMDAwMjAwCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKyMgZGVmaW5lIE5MRExZCTAwMDA0MDAKKyMgZGVmaW5lICAgTkwwCTAwMDAwMDAKKyMgZGVmaW5lICAgTkwxCTAwMDA0MDAKKyMgZGVmaW5lIENSRExZCTAwMDMwMDAKKyMgZGVmaW5lICAgQ1IwCTAwMDAwMDAKKyMgZGVmaW5lICAgQ1IxCTAwMDEwMDAKKyMgZGVmaW5lICAgQ1IyCTAwMDIwMDAKKyMgZGVmaW5lICAgQ1IzCTAwMDMwMDAKKyMgZGVmaW5lIFRBQkRMWQkwMDE0MDAwCisjIGRlZmluZSAgIFRBQjAJMDAwMDAwMAorIyBkZWZpbmUgICBUQUIxCTAwMDQwMDAKKyMgZGVmaW5lICAgVEFCMgkwMDEwMDAwCisjIGRlZmluZSAgIFRBQjMJMDAxNDAwMAorIyBkZWZpbmUgQlNETFkJMDAyMDAwMAorIyBkZWZpbmUgICBCUzAJMDAwMDAwMAorIyBkZWZpbmUgICBCUzEJMDAyMDAwMAorIyBkZWZpbmUgRkZETFkJMDEwMDAwMAorIyBkZWZpbmUgICBGRjAJMDAwMDAwMAorIyBkZWZpbmUgICBGRjEJMDEwMDAwMAorI2VuZGlmCisKKyNkZWZpbmUgVlRETFkJMDA0MDAwMAorI2RlZmluZSAgIFZUMAkwMDAwMDAwCisjZGVmaW5lICAgVlQxCTAwNDAwMDAKKworI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIFhUQUJTCTAwMTQwMDAKKyNlbmRpZgorCisvKiBjX2NmbGFnIGJpdCBtZWFuaW5nICovCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgQ0JBVUQJMDAxMDAxNworI2VuZGlmCisjZGVmaW5lICBCMAkwMDAwMDAwCQkvKiBoYW5nIHVwICovCisjZGVmaW5lICBCNTAJMDAwMDAwMQorI2RlZmluZSAgQjc1CTAwMDAwMDIKKyNkZWZpbmUgIEIxMTAJMDAwMDAwMworI2RlZmluZSAgQjEzNAkwMDAwMDA0CisjZGVmaW5lICBCMTUwCTAwMDAwMDUKKyNkZWZpbmUgIEIyMDAJMDAwMDAwNgorI2RlZmluZSAgQjMwMAkwMDAwMDA3CisjZGVmaW5lICBCNjAwCTAwMDAwMTAKKyNkZWZpbmUgIEIxMjAwCTAwMDAwMTEKKyNkZWZpbmUgIEIxODAwCTAwMDAwMTIKKyNkZWZpbmUgIEIyNDAwCTAwMDAwMTMKKyNkZWZpbmUgIEI0ODAwCTAwMDAwMTQKKyNkZWZpbmUgIEI5NjAwCTAwMDAwMTUKKyNkZWZpbmUgIEIxOTIwMAkwMDAwMDE2CisjZGVmaW5lICBCMzg0MDAJMDAwMDAxNworI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIEVYVEEgQjE5MjAwCisjIGRlZmluZSBFWFRCIEIzODQwMAorI2VuZGlmCisjZGVmaW5lIENTSVpFCTAwMDAwNjAKKyNkZWZpbmUgICBDUzUJMDAwMDAwMAorI2RlZmluZSAgIENTNgkwMDAwMDIwCisjZGVmaW5lICAgQ1M3CTAwMDAwNDAKKyNkZWZpbmUgICBDUzgJMDAwMDA2MAorI2RlZmluZSBDU1RPUEIJMDAwMDEwMAorI2RlZmluZSBDUkVBRAkwMDAwMjAwCisjZGVmaW5lIFBBUkVOQgkwMDAwNDAwCisjZGVmaW5lIFBBUk9ERAkwMDAxMDAwCisjZGVmaW5lIEhVUENMCTAwMDIwMDAKKyNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBDQkFVREVYIDAwMTAwMDAKKyNlbmRpZgorI2RlZmluZSAgQjU3NjAwICAgMDAxMDAwMQorI2RlZmluZSAgQjExNTIwMCAgMDAxMDAwMgorI2RlZmluZSAgQjIzMDQwMCAgMDAxMDAwMworI2RlZmluZSAgQjQ2MDgwMCAgMDAxMDAwNAorI2RlZmluZSAgQjUwMDAwMCAgMDAxMDAwNQorI2RlZmluZSAgQjU3NjAwMCAgMDAxMDAwNgorI2RlZmluZSAgQjkyMTYwMCAgMDAxMDAwNworI2RlZmluZSAgQjEwMDAwMDAgMDAxMDAxMAorI2RlZmluZSAgQjExNTIwMDAgMDAxMDAxMQorI2RlZmluZSAgQjE1MDAwMDAgMDAxMDAxMgorI2RlZmluZSAgQjIwMDAwMDAgMDAxMDAxMworI2RlZmluZSAgQjI1MDAwMDAgMDAxMDAxNAorI2RlZmluZSAgQjMwMDAwMDAgMDAxMDAxNQorI2RlZmluZSAgQjM1MDAwMDAgMDAxMDAxNgorI2RlZmluZSAgQjQwMDAwMDAgMDAxMDAxNworI2RlZmluZSBfX01BWF9CQVVEIEI0MDAwMDAwCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCQkvKiBpbnB1dCBiYXVkIHJhdGUgKG5vdCB1c2VkKSAqLworIyBkZWZpbmUgQ01TUEFSICAgMDEwMDAwMDAwMDAwCQkvKiBtYXJrIG9yIHNwYWNlIChzdGljaykgcGFyaXR5ICovCisjIGRlZmluZSBDUlRTQ1RTICAwMjAwMDAwMDAwMDAJCS8qIGZsb3cgY29udHJvbCAqLworI2VuZGlmCisKKy8qIGNfbGZsYWcgYml0cyAqLworI2RlZmluZSBJU0lHCTAwMDAwMDEKKyNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorIyBkZWZpbmUgWENBU0UJMDAwMDAwNAorI2VuZGlmCisjZGVmaW5lIEVDSE8JMDAwMDAxMAorI2RlZmluZSBFQ0hPRQkwMDAwMDIwCisjZGVmaW5lIEVDSE9LCTAwMDAwNDAKKyNkZWZpbmUgRUNIT05MCTAwMDAxMDAKKyNkZWZpbmUgTk9GTFNICTAwMDAyMDAKKyNkZWZpbmUgVE9TVE9QCTAwMDA0MDAKKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBFQ0hPQ1RMIDAwMDEwMDAKKyMgZGVmaW5lIEVDSE9QUlQgMDAwMjAwMAorIyBkZWZpbmUgRUNIT0tFCSAwMDA0MDAwCisjIGRlZmluZSBGTFVTSE8JIDAwMTAwMDAKKyMgZGVmaW5lIFBFTkRJTgkgMDA0MDAwMAorI2VuZGlmCisjZGVmaW5lIElFWFRFTgkwMTAwMDAwCisjaWZkZWYgX19VU0VfQlNECisjIGRlZmluZSBFWFRQUk9DIDAyMDAwMDAKKyNlbmRpZgorCisvKiB0Y2Zsb3coKSBhbmQgVENYT05DIHVzZSB0aGVzZSAqLworI2RlZmluZQlUQ09PRkYJCTAKKyNkZWZpbmUJVENPT04JCTEKKyNkZWZpbmUJVENJT0ZGCQkyCisjZGVmaW5lCVRDSU9OCQkzCisKKy8qIHRjZmx1c2goKSBhbmQgVENGTFNIIHVzZSB0aGVzZSAqLworI2RlZmluZQlUQ0lGTFVTSAkwCisjZGVmaW5lCVRDT0ZMVVNICTEKKyNkZWZpbmUJVENJT0ZMVVNICTIKKworLyogdGNzZXRhdHRyIHVzZXMgdGhlc2UgKi8KKyNkZWZpbmUJVENTQU5PVwkJMAorI2RlZmluZQlUQ1NBRFJBSU4JMQorI2RlZmluZQlUQ1NBRkxVU0gJMgorCisKKyNkZWZpbmUgX0lPVF90ZXJtaW9zIC8qIEh1cmQgaW9jdGwgdHlwZSBmaWVsZC4gICovIFwKKyAgX0lPVCAoX0lPVFMgKGNmbGFnX3QpLCA0LCBfSU9UUyAoY2NfdCksIE5DQ1MsIF9JT1RTIChzcGVlZF90KSwgMikKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy90aW1lLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjlhNjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdGltZS5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qIFN5c3RlbS1kZXBlbmRlbnQgdGltaW5nIGRlZmluaXRpb25zLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwxOTk3LDE5OTktMjAwMywyMDEwLDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseTsgdXNlIDx0aW1lLmg+IGluc3RlYWQuCisgKi8KKworI2lmIGRlZmluZWQgX19uZWVkX3RpbWV2YWwgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKyMgaWZuZGVmIF9TVFJVQ1RfVElNRVZBTAorIyAgZGVmaW5lIF9TVFJVQ1RfVElNRVZBTAkxCisjICBpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIEEgdGltZSB2YWx1ZSB0aGF0IGlzIGFjY3VyYXRlIHRvIHRoZSBuZWFyZXN0CisgICBtaWNyb3NlY29uZCBidXQgYWxzbyBoYXMgYSByYW5nZSBvZiB5ZWFycy4gICovCitzdHJ1Y3QgdGltZXZhbAorICB7CisgICAgX190aW1lX3QgdHZfc2VjOwkJLyogU2Vjb25kcy4gICovCisgICAgX19zdXNlY29uZHNfdCB0dl91c2VjOwkvKiBNaWNyb3NlY29uZHMuICAqLworICB9OworIyBlbmRpZgkvKiBzdHJ1Y3QgdGltZXZhbCAqLworI2VuZGlmCisKKyNpZm5kZWYgX19uZWVkX3RpbWV2YWwKKyMgaWZuZGVmIF9CSVRTX1RJTUVfSAorIyAgZGVmaW5lIF9CSVRTX1RJTUVfSAkxCisKKy8qIElTTy9JRUMgOTg5OToxOTkwIDcuMTIuMTogPHRpbWUuaD4KKyAgIFRoZSBtYWNybyBgQ0xPQ0tTX1BFUl9TRUMnIGlzIHRoZSBudW1iZXIgcGVyIHNlY29uZCBvZiB0aGUgdmFsdWUKKyAgIHJldHVybmVkIGJ5IHRoZSBgY2xvY2snIGZ1bmN0aW9uLiAqLworLyogQ0FFIFhTSCwgSXNzdWUgNCwgVmVyc2lvbiAyOiA8dGltZS5oPgorICAgVGhlIHZhbHVlIG9mIENMT0NLU19QRVJfU0VDIGlzIHJlcXVpcmVkIHRvIGJlIDEgbWlsbGlvbiBvbiBhbGwKKyAgIFhTSS1jb25mb3JtYW50IHN5c3RlbXMuICovCisjICBkZWZpbmUgQ0xPQ0tTX1BFUl9TRUMgIDEwMDAwMDBsCisKKyMgIGlmICFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXyAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisvKiBFdmVuIHRob3VnaCBDTE9DS1NfUEVSX1NFQyBoYXMgc3VjaCBhIHN0cmFuZ2UgdmFsdWUgQ0xLX1RDSworICAgcHJlc2VudHMgdGhlIHJlYWwgdmFsdWUgZm9yIGNsb2NrIHRpY2tzIHBlciBzZWNvbmQgZm9yIHRoZSBzeXN0ZW0uICAqLworIyAgIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4KK2V4dGVybiBsb25nIGludCBfX3N5c2NvbmYgKGludCk7CisjICAgZGVmaW5lIENMS19UQ0sgKChfX2Nsb2NrX3QpIF9fc3lzY29uZiAoMikpCS8qIDIgaXMgX1NDX0NMS19UQ0sgKi8KKyMgIGVuZGlmCisKKyMgIGlmZGVmIF9fVVNFX1BPU0lYMTk5MzA5CisvKiBJZGVudGlmaWVyIGZvciBzeXN0ZW0td2lkZSByZWFsdGltZSBjbG9jay4gICovCisjICAgZGVmaW5lIENMT0NLX1JFQUxUSU1FCQkwCisvKiBNb25vdG9uaWMgc3lzdGVtLXdpZGUgY2xvY2suICAqLworIyAgIGRlZmluZSBDTE9DS19NT05PVE9OSUMJCTEKKy8qIEhpZ2gtcmVzb2x1dGlvbiB0aW1lciBmcm9tIHRoZSBDUFUuICAqLworIyAgIGRlZmluZSBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQJMgorLyogVGhyZWFkLXNwZWNpZmljIENQVS10aW1lIGNsb2NrLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQJMworLyogTW9ub3RvbmljIHN5c3RlbS13aWRlIGNsb2NrLCBub3QgYWRqdXN0ZWQgZm9yIGZyZXF1ZW5jeSBzY2FsaW5nLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX1JBVwkJNAorLyogSWRlbnRpZmllciBmb3Igc3lzdGVtLXdpZGUgcmVhbHRpbWUgY2xvY2ssIHVwZGF0ZWQgb25seSBvbiB0aWNrcy4gICovCisjICAgZGVmaW5lIENMT0NLX1JFQUxUSU1FX0NPQVJTRQk1CisvKiBNb25vdG9uaWMgc3lzdGVtLXdpZGUgY2xvY2ssIHVwZGF0ZWQgb25seSBvbiB0aWNrcy4gICovCisjICAgZGVmaW5lIENMT0NLX01PTk9UT05JQ19DT0FSU0UJNgorLyogTW9ub3RvbmljIHN5c3RlbS13aWRlIGNsb2NrIHRoYXQgaW5jbHVkZXMgdGltZSBzcGVudCBpbiBzdXNwZW5zaW9uLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfQk9PVFRJTUUJCTcKKy8qIExpa2UgQ0xPQ0tfUkVBTFRJTUUgYnV0IGFsc28gd2FrZXMgc3VzcGVuZGVkIHN5c3RlbS4gICovCisjICAgZGVmaW5lIENMT0NLX1JFQUxUSU1FX0FMQVJNCQk4CisvKiBMaWtlIENMT0NLX0JPT1RUSU1FIGJ1dCBhbHNvIHdha2VzIHN1c3BlbmRlZCBzeXN0ZW0uICAqLworIyAgIGRlZmluZSBDTE9DS19CT09UVElNRV9BTEFSTQkJOQorCisvKiBGbGFnIHRvIGluZGljYXRlIHRpbWUgaXMgYWJzb2x1dGUuICAqLworIyAgIGRlZmluZSBUSU1FUl9BQlNUSU1FCQkxCisjICBlbmRpZgorCisjICBpZmRlZiBfX1VTRV9HTlUKKyMgICBpbmNsdWRlIDxiaXRzL3RpbWV4Lmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVHVuZSBhIFBPU0lYIGNsb2NrLiAgKi8KK2V4dGVybiBpbnQgY2xvY2tfYWRqdGltZSAoX19jbG9ja2lkX3QgX19jbG9ja19pZCwgc3RydWN0IHRpbWV4ICpfX3V0eCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKyMgIGVuZGlmIC8qIHVzZSBHTlUgKi8KKworIyBlbmRpZgkvKiBiaXRzL3RpbWUuaCAqLworI2VuZGlmCisKKyN1bmRlZiBfX25lZWRfdGltZXZhbApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3RpbWV4LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdGltZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RlNjdlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3RpbWV4LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LDE5OTksMjAwNywyMDA5LDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0JJVFNfVElNRVhfSAorI2RlZmluZQlfQklUU19USU1FWF9ICTEKKworLyogVGhlc2UgZGVmaW5pdGlvbnMgZnJvbSBsaW51eC90aW1leC5oIGFzIG9mIDIuNi4zMC4gICovCisKK3N0cnVjdCB0aW1leAoreworICB1bnNpZ25lZCBpbnQgbW9kZXM7CS8qIG1vZGUgc2VsZWN0b3IgKi8KKyAgbG9uZyBpbnQgb2Zmc2V0OwkvKiB0aW1lIG9mZnNldCAodXNlYykgKi8KKyAgbG9uZyBpbnQgZnJlcTsJLyogZnJlcXVlbmN5IG9mZnNldCAoc2NhbGVkIHBwbSkgKi8KKyAgbG9uZyBpbnQgbWF4ZXJyb3I7CS8qIG1heGltdW0gZXJyb3IgKHVzZWMpICovCisgIGxvbmcgaW50IGVzdGVycm9yOwkvKiBlc3RpbWF0ZWQgZXJyb3IgKHVzZWMpICovCisgIGludCBzdGF0dXM7CQkvKiBjbG9jayBjb21tYW5kL3N0YXR1cyAqLworICBsb25nIGludCBjb25zdGFudDsJLyogcGxsIHRpbWUgY29uc3RhbnQgKi8KKyAgbG9uZyBpbnQgcHJlY2lzaW9uOwkvKiBjbG9jayBwcmVjaXNpb24gKHVzZWMpIChyZWFkIG9ubHkpICovCisgIGxvbmcgaW50IHRvbGVyYW5jZTsJLyogY2xvY2sgZnJlcXVlbmN5IHRvbGVyYW5jZSAocHBtKSAocmVhZCBvbmx5KSAqLworICBzdHJ1Y3QgdGltZXZhbCB0aW1lOwkvKiAocmVhZCBvbmx5KSAqLworICBsb25nIGludCB0aWNrOwkvKiAobW9kaWZpZWQpIHVzZWNzIGJldHdlZW4gY2xvY2sgdGlja3MgKi8KKworICBsb25nIGludCBwcHNmcmVxOwkvKiBwcHMgZnJlcXVlbmN5IChzY2FsZWQgcHBtKSAocm8pICovCisgIGxvbmcgaW50IGppdHRlcjsJLyogcHBzIGppdHRlciAodXMpIChybykgKi8KKyAgaW50IHNoaWZ0OwkJLyogaW50ZXJ2YWwgZHVyYXRpb24gKHMpIChzaGlmdCkgKHJvKSAqLworICBsb25nIGludCBzdGFiaWw7CS8qIHBwcyBzdGFiaWxpdHkgKHNjYWxlZCBwcG0pIChybykgKi8KKyAgbG9uZyBpbnQgaml0Y250OwkvKiBqaXR0ZXIgbGltaXQgZXhjZWVkZWQgKHJvKSAqLworICBsb25nIGludCBjYWxjbnQ7CS8qIGNhbGlicmF0aW9uIGludGVydmFscyAocm8pICovCisgIGxvbmcgaW50IGVycmNudDsJLyogY2FsaWJyYXRpb24gZXJyb3JzIChybykgKi8KKyAgbG9uZyBpbnQgc3RiY250OwkvKiBzdGFiaWxpdHkgbGltaXQgZXhjZWVkZWQgKHJvKSAqLworCisgIGludCB0YWk7CQkvKiBUQUkgb2Zmc2V0IChybykgKi8KKworICAvKiA/Pz8gKi8KKyAgaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7CisgIGludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOworICBpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOworfTsKKworLyogTW9kZSBjb2RlcyAodGltZXgubW9kZSkgKi8KKyNkZWZpbmUgQURKX09GRlNFVAkJMHgwMDAxCS8qIHRpbWUgb2Zmc2V0ICovCisjZGVmaW5lIEFESl9GUkVRVUVOQ1kJCTB4MDAwMgkvKiBmcmVxdWVuY3kgb2Zmc2V0ICovCisjZGVmaW5lIEFESl9NQVhFUlJPUgkJMHgwMDA0CS8qIG1heGltdW0gdGltZSBlcnJvciAqLworI2RlZmluZSBBREpfRVNURVJST1IJCTB4MDAwOAkvKiBlc3RpbWF0ZWQgdGltZSBlcnJvciAqLworI2RlZmluZSBBREpfU1RBVFVTCQkweDAwMTAJLyogY2xvY2sgc3RhdHVzICovCisjZGVmaW5lIEFESl9USU1FQ09OU1QJCTB4MDAyMAkvKiBwbGwgdGltZSBjb25zdGFudCAqLworI2RlZmluZSBBREpfVEFJCQkJMHgwMDgwCS8qIHNldCBUQUkgb2Zmc2V0ICovCisjZGVmaW5lIEFESl9NSUNSTwkJMHgxMDAwCS8qIHNlbGVjdCBtaWNyb3NlY29uZCByZXNvbHV0aW9uICovCisjZGVmaW5lIEFESl9OQU5PCQkweDIwMDAJLyogc2VsZWN0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbiAqLworI2RlZmluZSBBREpfVElDSwkJMHg0MDAwCS8qIHRpY2sgdmFsdWUgKi8KKyNkZWZpbmUgQURKX09GRlNFVF9TSU5HTEVTSE9UCTB4ODAwMQkvKiBvbGQtZmFzaGlvbmVkIGFkanRpbWUgKi8KKyNkZWZpbmUgQURKX09GRlNFVF9TU19SRUFECTB4YTAwMQkvKiByZWFkLW9ubHkgYWRqdGltZSAqLworCisvKiB4bnRwIDMuNCBjb21wYXRpYmlsaXR5IG5hbWVzICovCisjZGVmaW5lIE1PRF9PRkZTRVQJQURKX09GRlNFVAorI2RlZmluZSBNT0RfRlJFUVVFTkNZCUFESl9GUkVRVUVOQ1kKKyNkZWZpbmUgTU9EX01BWEVSUk9SCUFESl9NQVhFUlJPUgorI2RlZmluZSBNT0RfRVNURVJST1IJQURKX0VTVEVSUk9SCisjZGVmaW5lIE1PRF9TVEFUVVMJQURKX1NUQVRVUworI2RlZmluZSBNT0RfVElNRUNPTlNUCUFESl9USU1FQ09OU1QKKyNkZWZpbmUgTU9EX0NMS0IJQURKX1RJQ0sKKyNkZWZpbmUgTU9EX0NMS0EJQURKX09GRlNFVF9TSU5HTEVTSE9UIC8qIDB4ODAwMCBpbiBvcmlnaW5hbCAqLworI2RlZmluZSBNT0RfVEFJCQlBREpfVEFJCisjZGVmaW5lIE1PRF9NSUNSTwlBREpfTUlDUk8KKyNkZWZpbmUgTU9EX05BTk8JQURKX05BTk8KKworCisvKiBTdGF0dXMgY29kZXMgKHRpbWV4LnN0YXR1cykgKi8KKyNkZWZpbmUgU1RBX1BMTAkJMHgwMDAxCS8qIGVuYWJsZSBQTEwgdXBkYXRlcyAocncpICovCisjZGVmaW5lIFNUQV9QUFNGUkVRCTB4MDAwMgkvKiBlbmFibGUgUFBTIGZyZXEgZGlzY2lwbGluZSAocncpICovCisjZGVmaW5lIFNUQV9QUFNUSU1FCTB4MDAwNAkvKiBlbmFibGUgUFBTIHRpbWUgZGlzY2lwbGluZSAocncpICovCisjZGVmaW5lIFNUQV9GTEwJCTB4MDAwOAkvKiBzZWxlY3QgZnJlcXVlbmN5LWxvY2sgbW9kZSAocncpICovCisKKyNkZWZpbmUgU1RBX0lOUwkJMHgwMDEwCS8qIGluc2VydCBsZWFwIChydykgKi8KKyNkZWZpbmUgU1RBX0RFTAkJMHgwMDIwCS8qIGRlbGV0ZSBsZWFwIChydykgKi8KKyNkZWZpbmUgU1RBX1VOU1lOQwkweDAwNDAJLyogY2xvY2sgdW5zeW5jaHJvbml6ZWQgKHJ3KSAqLworI2RlZmluZSBTVEFfRlJFUUhPTEQJMHgwMDgwCS8qIGhvbGQgZnJlcXVlbmN5IChydykgKi8KKworI2RlZmluZSBTVEFfUFBTU0lHTkFMCTB4MDEwMAkvKiBQUFMgc2lnbmFsIHByZXNlbnQgKHJvKSAqLworI2RlZmluZSBTVEFfUFBTSklUVEVSCTB4MDIwMAkvKiBQUFMgc2lnbmFsIGppdHRlciBleGNlZWRlZCAocm8pICovCisjZGVmaW5lIFNUQV9QUFNXQU5ERVIJMHgwNDAwCS8qIFBQUyBzaWduYWwgd2FuZGVyIGV4Y2VlZGVkIChybykgKi8KKyNkZWZpbmUgU1RBX1BQU0VSUk9SCTB4MDgwMAkvKiBQUFMgc2lnbmFsIGNhbGlicmF0aW9uIGVycm9yIChybykgKi8KKworI2RlZmluZSBTVEFfQ0xPQ0tFUlIJMHgxMDAwCS8qIGNsb2NrIGhhcmR3YXJlIGZhdWx0IChybykgKi8KKyNkZWZpbmUgU1RBX05BTk8JMHgyMDAwCS8qIHJlc29sdXRpb24gKDAgPSB1cywgMSA9IG5zKSAocm8pICovCisjZGVmaW5lIFNUQV9NT0RFCTB4NDAwMAkvKiBtb2RlICgwID0gUExMLCAxID0gRkxMKSAocm8pICovCisjZGVmaW5lIFNUQV9DTEsJCTB4ODAwMAkvKiBjbG9jayBzb3VyY2UgKDAgPSBBLCAxID0gQikgKHJvKSAqLworCisvKiBSZWFkLW9ubHkgYml0cyAqLworI2RlZmluZSBTVEFfUk9OTFkgKFNUQV9QUFNTSUdOQUwgfCBTVEFfUFBTSklUVEVSIHwgU1RBX1BQU1dBTkRFUiB8IFwKKyAgICBTVEFfUFBTRVJST1IgfCBTVEFfQ0xPQ0tFUlIgfCBTVEFfTkFOTyB8IFNUQV9NT0RFIHwgU1RBX0NMSykKKworI2VuZGlmIC8qIGJpdHMvdGltZXguaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3R5cGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJlODJmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3R5cGVzLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8qIGJpdHMvdHlwZXMuaCAtLSBkZWZpbml0aW9ucyBvZiBfXypfdCB0eXBlcyB1bmRlcmx5aW5nICpfdCB0eXBlcy4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIE5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5OyB1c2UgPHN5cy90eXBlcy5oPiBpbnN0ZWFkLgorICovCisKKyNpZm5kZWYJX0JJVFNfVFlQRVNfSAorI2RlZmluZQlfQklUU19UWVBFU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisvKiBDb252ZW5pZW5jZSB0eXBlcy4gICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX191X2NoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBfX3Vfc2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfX3VfaW50OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX3VfbG9uZzsKKworLyogRml4ZWQtc2l6ZSB0eXBlcywgdW5kZXJseWluZyB0eXBlcyBkZXBlbmQgb24gd29yZCBzaXplIGFuZCBjb21waWxlci4gICovCit0eXBlZGVmIHNpZ25lZCBjaGFyIF9faW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdWludDhfdDsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludCBfX2ludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBfX3VpbnQxNl90OwordHlwZWRlZiBzaWduZWQgaW50IF9faW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IF9fdWludDMyX3Q7CisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBzaWduZWQgbG9uZyBpbnQgX19pbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX3VpbnQ2NF90OworI2VsaWYgZGVmaW5lZCBfX0dMSUJDX0hBVkVfTE9OR19MT05HCitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19pbnQ2NF90OworX19leHRlbnNpb25fXyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX191aW50NjRfdDsKKyNlbmRpZgorCisvKiBxdWFkX3QgaXMgYWxzbyA2NCBiaXRzLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIGxvbmcgaW50IF9fcXVhZF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX3VfcXVhZF90OworI2VsaWYgZGVmaW5lZCBfX0dMSUJDX0hBVkVfTE9OR19MT05HCitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgbG9uZyBsb25nIGludCBfX3F1YWRfdDsKK19fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fdV9xdWFkX3Q7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgbG9uZyBfX3ZhbFsyXTsKK30gX19xdWFkX3Q7Cit0eXBlZGVmIHN0cnVjdAoreworICBfX3VfbG9uZyBfX3ZhbFsyXTsKK30gX191X3F1YWRfdDsKKyNlbmRpZgorCisKKy8qIFRoZSBtYWNoaW5lLWRlcGVuZGVudCBmaWxlIDxiaXRzL3R5cGVzaXplcy5oPiBkZWZpbmVzIF9fKl9UX1RZUEUKKyAgIG1hY3JvcyBmb3IgZWFjaCBvZiB0aGUgT1MgdHlwZXMgd2UgZGVmaW5lIGJlbG93LiAgVGhlIGRlZmluaXRpb25zCisgICBvZiB0aG9zZSBtYWNyb3MgbXVzdCB1c2UgdGhlIGZvbGxvd2luZyBtYWNyb3MgZm9yIHVuZGVybHlpbmcgdHlwZXMuCisgICBXZSBkZWZpbmUgX19TPFNJWkU+X1RZUEUgYW5kIF9fVTxTSVpFPl9UWVBFIGZvciB0aGUgc2lnbmVkIGFuZCB1bnNpZ25lZAorICAgdmFyaWFudHMgb2YgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGludGVnZXIgdHlwZXMgb24gdGhpcyBtYWNoaW5lLgorCisJMTYJCS0tICJuYXR1cmFsIiAxNi1iaXQgdHlwZSAoYWx3YXlzIHNob3J0KQorCTMyCQktLSAibmF0dXJhbCIgMzItYml0IHR5cGUgKGFsd2F5cyBpbnQpCisJNjQJCS0tICJuYXR1cmFsIiA2NC1iaXQgdHlwZSAobG9uZyBvciBsb25nIGxvbmcpCisJTE9ORzMyCQktLSAzMi1iaXQgdHlwZSwgdHJhZGl0aW9uYWxseSBsb25nCisJUVVBRAkJLS0gNjQtYml0IHR5cGUsIGFsd2F5cyBsb25nIGxvbmcKKwlXT1JECQktLSBuYXR1cmFsIHR5cGUgb2YgX19XT1JEU0laRSBiaXRzIChpbnQgb3IgbG9uZykKKwlMT05HV09SRAktLSB0eXBlIG9mIF9fV09SRFNJWkUgYml0cywgdHJhZGl0aW9uYWxseSBsb25nCisKKyAgIFdlIGRpc3Rpbmd1aXNoIFdPUkQvTE9OR1dPUkQsIDMyL0xPTkczMiwgYW5kIDY0L1FVQUQgc28gdGhhdCB0aGUKKyAgIGNvbnZlbnRpb25hbCB1c2VzIG9mIGBsb25nJyBvciBgbG9uZyBsb25nJyB0eXBlIG1vZGlmaWVycyBtYXRjaCB0aGUKKyAgIHR5cGVzIHdlIGRlZmluZSwgZXZlbiB3aGVuIGEgbGVzcy1hZG9ybmVkIHR5cGUgd291bGQgYmUgdGhlIHNhbWUgc2l6ZS4KKyAgIFRoaXMgbWF0dGVycyBmb3IgKHNvbWV3aGF0KSBwb3J0YWJseSB3cml0aW5nIHByaW50Zi9zY2FuZiBmb3JtYXRzIGZvcgorICAgdGhlc2UgdHlwZXMsIHdoZXJlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBsIG9yIGxsIGZvcm1hdCBtb2RpZmllcnMgY2FuCisgICBtYWtlIHRoZSB0eXBlZGVmcyBhbmQgdGhlIGZvcm1hdHMgbWF0Y2ggdXAgYWNyb3NzIGFsbCBHTlUgcGxhdGZvcm1zLiAgSWYKKyAgIHdlIHVzZWQgYGxvbmcnIHdoZW4gaXQncyA2NCBiaXRzIHdoZXJlIGBsb25nIGxvbmcnIGlzIGV4cGVjdGVkLCB0aGVuIHRoZQorICAgY29tcGlsZXIgd291bGQgd2FybiBhYm91dCB0aGUgZm9ybWF0cyBub3QgbWF0Y2hpbmcgdGhlIGFyZ3VtZW50IHR5cGVzLAorICAgYW5kIHRoZSBwcm9ncmFtbWVyIGNoYW5naW5nIHRoZW0gdG8gc2h1dCB1cCB0aGUgY29tcGlsZXIgd291bGQgYnJlYWsgdGhlCisgICBwcm9ncmFtJ3MgcG9ydGFiaWxpdHkuCisKKyAgIEhlcmUgd2UgYXNzdW1lIHdoYXQgaXMgcHJlc2VudGx5IHRoZSBjYXNlIGluIGFsbCB0aGUgR0NDIGNvbmZpZ3VyYXRpb25zCisgICB3ZSBzdXBwb3J0OiBsb25nIGxvbmcgaXMgYWx3YXlzIDY0IGJpdHMsIGxvbmcgaXMgYWx3YXlzIHdvcmQvYWRkcmVzcyBzaXplLAorICAgYW5kIGludCBpcyBhbHdheXMgMzIgYml0cy4gICovCisKKyNkZWZpbmUJX19TMTZfVFlQRQkJc2hvcnQgaW50CisjZGVmaW5lIF9fVTE2X1RZUEUJCXVuc2lnbmVkIHNob3J0IGludAorI2RlZmluZQlfX1MzMl9UWVBFCQlpbnQKKyNkZWZpbmUgX19VMzJfVFlQRQkJdW5zaWduZWQgaW50CisjZGVmaW5lIF9fU0xPTkdXT1JEX1RZUEUJbG9uZyBpbnQKKyNkZWZpbmUgX19VTE9OR1dPUkRfVFlQRQl1bnNpZ25lZCBsb25nIGludAorI2lmIF9fV09SRFNJWkUgPT0gMzIKKyMgZGVmaW5lIF9fU1FVQURfVFlQRQkJX19xdWFkX3QKKyMgZGVmaW5lIF9fVVFVQURfVFlQRQkJX191X3F1YWRfdAorIyBkZWZpbmUgX19TV09SRF9UWVBFCQlpbnQKKyMgZGVmaW5lIF9fVVdPUkRfVFlQRQkJdW5zaWduZWQgaW50CisjIGRlZmluZSBfX1NMT05HMzJfVFlQRQkJbG9uZyBpbnQKKyMgZGVmaW5lIF9fVUxPTkczMl9UWVBFCQl1bnNpZ25lZCBsb25nIGludAorIyBkZWZpbmUgX19TNjRfVFlQRQkJX19xdWFkX3QKKyMgZGVmaW5lIF9fVTY0X1RZUEUJCV9fdV9xdWFkX3QKKy8qIFdlIHdhbnQgX19leHRlbnNpb25fXyBiZWZvcmUgdHlwZWRlZidzIHRoYXQgdXNlIG5vbnN0YW5kYXJkIGJhc2UgdHlwZXMKKyAgIHN1Y2ggYXMgYGxvbmcgbG9uZycgaW4gQzg5IG1vZGUuICAqLworIyBkZWZpbmUgX19TVERfVFlQRQkJX19leHRlbnNpb25fXyB0eXBlZGVmCisjZWxpZiBfX1dPUkRTSVpFID09IDY0CisjIGRlZmluZSBfX1NRVUFEX1RZUEUJCWxvbmcgaW50CisjIGRlZmluZSBfX1VRVUFEX1RZUEUJCXVuc2lnbmVkIGxvbmcgaW50CisjIGRlZmluZSBfX1NXT1JEX1RZUEUJCWxvbmcgaW50CisjIGRlZmluZSBfX1VXT1JEX1RZUEUJCXVuc2lnbmVkIGxvbmcgaW50CisjIGRlZmluZSBfX1NMT05HMzJfVFlQRQkJaW50CisjIGRlZmluZSBfX1VMT05HMzJfVFlQRQkJdW5zaWduZWQgaW50CisjIGRlZmluZSBfX1M2NF9UWVBFCQlsb25nIGludAorIyBkZWZpbmUgX19VNjRfVFlQRQkJdW5zaWduZWQgbG9uZyBpbnQKKy8qIE5vIG5lZWQgdG8gbWFyayB0aGUgdHlwZWRlZiB3aXRoIF9fZXh0ZW5zaW9uX18uICAgKi8KKyMgZGVmaW5lIF9fU1REX1RZUEUJCXR5cGVkZWYKKyNlbHNlCisjIGVycm9yCisjZW5kaWYKKyNpbmNsdWRlIDxiaXRzL3R5cGVzaXplcy5oPgkvKiBEZWZpbmVzIF9fKl9UX1RZUEUgbWFjcm9zLiAgKi8KKworCitfX1NURF9UWVBFIF9fREVWX1RfVFlQRSBfX2Rldl90OwkvKiBUeXBlIG9mIGRldmljZSBudW1iZXJzLiAgKi8KK19fU1REX1RZUEUgX19VSURfVF9UWVBFIF9fdWlkX3Q7CS8qIFR5cGUgb2YgdXNlciBpZGVudGlmaWNhdGlvbnMuICAqLworX19TVERfVFlQRSBfX0dJRF9UX1RZUEUgX19naWRfdDsJLyogVHlwZSBvZiBncm91cCBpZGVudGlmaWNhdGlvbnMuICAqLworX19TVERfVFlQRSBfX0lOT19UX1RZUEUgX19pbm9fdDsJLyogVHlwZSBvZiBmaWxlIHNlcmlhbCBudW1iZXJzLiAgKi8KK19fU1REX1RZUEUgX19JTk82NF9UX1RZUEUgX19pbm82NF90OwkvKiBUeXBlIG9mIGZpbGUgc2VyaWFsIG51bWJlcnMgKExGUykuKi8KK19fU1REX1RZUEUgX19NT0RFX1RfVFlQRSBfX21vZGVfdDsJLyogVHlwZSBvZiBmaWxlIGF0dHJpYnV0ZSBiaXRtYXNrcy4gICovCitfX1NURF9UWVBFIF9fTkxJTktfVF9UWVBFIF9fbmxpbmtfdDsJLyogVHlwZSBvZiBmaWxlIGxpbmsgY291bnRzLiAgKi8KK19fU1REX1RZUEUgX19PRkZfVF9UWVBFIF9fb2ZmX3Q7CS8qIFR5cGUgb2YgZmlsZSBzaXplcyBhbmQgb2Zmc2V0cy4gICovCitfX1NURF9UWVBFIF9fT0ZGNjRfVF9UWVBFIF9fb2ZmNjRfdDsJLyogVHlwZSBvZiBmaWxlIHNpemVzIGFuZCBvZmZzZXRzIChMRlMpLiAgKi8KK19fU1REX1RZUEUgX19QSURfVF9UWVBFIF9fcGlkX3Q7CS8qIFR5cGUgb2YgcHJvY2VzcyBpZGVudGlmaWNhdGlvbnMuICAqLworX19TVERfVFlQRSBfX0ZTSURfVF9UWVBFIF9fZnNpZF90OwkvKiBUeXBlIG9mIGZpbGUgc3lzdGVtIElEcy4gICovCitfX1NURF9UWVBFIF9fQ0xPQ0tfVF9UWVBFIF9fY2xvY2tfdDsJLyogVHlwZSBvZiBDUFUgdXNhZ2UgY291bnRzLiAgKi8KK19fU1REX1RZUEUgX19STElNX1RfVFlQRSBfX3JsaW1fdDsJLyogVHlwZSBmb3IgcmVzb3VyY2UgbWVhc3VyZW1lbnQuICAqLworX19TVERfVFlQRSBfX1JMSU02NF9UX1RZUEUgX19ybGltNjRfdDsJLyogVHlwZSBmb3IgcmVzb3VyY2UgbWVhc3VyZW1lbnQgKExGUykuICAqLworX19TVERfVFlQRSBfX0lEX1RfVFlQRSBfX2lkX3Q7CQkvKiBHZW5lcmFsIHR5cGUgZm9yIElEcy4gICovCitfX1NURF9UWVBFIF9fVElNRV9UX1RZUEUgX190aW1lX3Q7CS8qIFNlY29uZHMgc2luY2UgdGhlIEVwb2NoLiAgKi8KK19fU1REX1RZUEUgX19VU0VDT05EU19UX1RZUEUgX191c2Vjb25kc190OyAvKiBDb3VudCBvZiBtaWNyb3NlY29uZHMuICAqLworX19TVERfVFlQRSBfX1NVU0VDT05EU19UX1RZUEUgX19zdXNlY29uZHNfdDsgLyogU2lnbmVkIGNvdW50IG9mIG1pY3Jvc2Vjb25kcy4gICovCisKK19fU1REX1RZUEUgX19EQUREUl9UX1RZUEUgX19kYWRkcl90OwkvKiBUaGUgdHlwZSBvZiBhIGRpc2sgYWRkcmVzcy4gICovCitfX1NURF9UWVBFIF9fU1dCTEtfVF9UWVBFIF9fc3dibGtfdDsJLyogVHlwZSBvZiBhIHN3YXAgYmxvY2sgbWF5YmU/ICAqLworX19TVERfVFlQRSBfX0tFWV9UX1RZUEUgX19rZXlfdDsJLyogVHlwZSBvZiBhbiBJUEMga2V5LiAgKi8KKworLyogQ2xvY2sgSUQgdXNlZCBpbiBjbG9jayBhbmQgdGltZXIgZnVuY3Rpb25zLiAgKi8KK19fU1REX1RZUEUgX19DTE9DS0lEX1RfVFlQRSBfX2Nsb2NraWRfdDsKKworLyogVGltZXIgSUQgcmV0dXJuZWQgYnkgYHRpbWVyX2NyZWF0ZScuICAqLworX19TVERfVFlQRSBfX1RJTUVSX1RfVFlQRSBfX3RpbWVyX3Q7CisKKy8qIFR5cGUgdG8gcmVwcmVzZW50IGJsb2NrIHNpemUuICAqLworX19TVERfVFlQRSBfX0JMS1NJWkVfVF9UWVBFIF9fYmxrc2l6ZV90OworCisvKiBUeXBlcyBmcm9tIHRoZSBMYXJnZSBGaWxlIFN1cHBvcnQgaW50ZXJmYWNlLiAgKi8KKworLyogVHlwZSB0byBjb3VudCBudW1iZXIgb2YgZGlzayBibG9ja3MuICAqLworX19TVERfVFlQRSBfX0JMS0NOVF9UX1RZUEUgX19ibGtjbnRfdDsKK19fU1REX1RZUEUgX19CTEtDTlQ2NF9UX1RZUEUgX19ibGtjbnQ2NF90OworCisvKiBUeXBlIHRvIGNvdW50IGZpbGUgc3lzdGVtIGJsb2Nrcy4gICovCitfX1NURF9UWVBFIF9fRlNCTEtDTlRfVF9UWVBFIF9fZnNibGtjbnRfdDsKK19fU1REX1RZUEUgX19GU0JMS0NOVDY0X1RfVFlQRSBfX2ZzYmxrY250NjRfdDsKKworLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBub2Rlcy4gICovCitfX1NURF9UWVBFIF9fRlNGSUxDTlRfVF9UWVBFIF9fZnNmaWxjbnRfdDsKK19fU1REX1RZUEUgX19GU0ZJTENOVDY0X1RfVFlQRSBfX2ZzZmlsY250NjRfdDsKKworX19TVERfVFlQRSBfX1NTSVpFX1RfVFlQRSBfX3NzaXplX3Q7IC8qIFR5cGUgb2YgYSBieXRlIGNvdW50LCBvciBlcnJvci4gICovCisKKy8qIFRoZXNlIGZldyBkb24ndCByZWFsbHkgdmFyeSBieSBzeXN0ZW0sIHRoZXkgYWx3YXlzIGNvcnJlc3BvbmQKKyAgIHRvIG9uZSBvZiB0aGUgb3RoZXIgZGVmaW5lZCB0eXBlcy4gICovCit0eXBlZGVmIF9fb2ZmNjRfdCBfX2xvZmZfdDsJLyogVHlwZSBvZiBmaWxlIHNpemVzIGFuZCBvZmZzZXRzIChMRlMpLiAgKi8KK3R5cGVkZWYgX19xdWFkX3QgKl9fcWFkZHJfdDsKK3R5cGVkZWYgY2hhciAqX19jYWRkcl90OworCisvKiBEdXBsaWNhdGVzIGluZm8gZnJvbSBzdGRpbnQuaCBidXQgdGhpcyBpcyB1c2VkIGluIHVuaXN0ZC5oLiAgKi8KK19fU1REX1RZUEUgX19TV09SRF9UWVBFIF9faW50cHRyX3Q7CisKKy8qIER1cGxpY2F0ZSBpbmZvIGZyb20gc3lzL3NvY2tldC5oLiAgKi8KK19fU1REX1RZUEUgX19VMzJfVFlQRSBfX3NvY2tsZW5fdDsKKworCisjdW5kZWYgX19TVERfVFlQRQorCisjZW5kaWYgLyogYml0cy90eXBlcy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdHlwZXNpemVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdHlwZXNpemVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyMjZjNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy90eXBlc2l6ZXMuaApAQCAtMCwwICsxLDY2IEBACisvKiBiaXRzL3R5cGVzaXplcy5oIC0tIHVuZGVybHlpbmcgdHlwZXMgZm9yICpfdC4gIEdlbmVyaWMgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfQklUU19UWVBFU19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3R5cGVzaXplcy5oPiBkaXJlY3RseTsgdXNlIDxzeXMvdHlwZXMuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZglfQklUU19UWVBFU0laRVNfSAorI2RlZmluZQlfQklUU19UWVBFU0laRVNfSAkxCisKKy8qIFNlZSA8Yml0cy90eXBlcy5oPiBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlc2UgbWFjcm9zLiAgVGhpcyBmaWxlIGV4aXN0cyBzbworICAgdGhhdCA8Yml0cy90eXBlcy5oPiBuZWVkIG5vdCB2YXJ5IGFjcm9zcyBkaWZmZXJlbnQgR05VIHBsYXRmb3Jtcy4gICovCisKKyNkZWZpbmUgX19ERVZfVF9UWVBFCQlfX1VRVUFEX1RZUEUKKyNkZWZpbmUgX19VSURfVF9UWVBFCQlfX1UzMl9UWVBFCisjZGVmaW5lIF9fR0lEX1RfVFlQRQkJX19VMzJfVFlQRQorI2RlZmluZSBfX0lOT19UX1RZUEUJCV9fVUxPTkdXT1JEX1RZUEUKKyNkZWZpbmUgX19JTk82NF9UX1RZUEUJCV9fVVFVQURfVFlQRQorI2RlZmluZSBfX01PREVfVF9UWVBFCQlfX1UzMl9UWVBFCisjZGVmaW5lIF9fTkxJTktfVF9UWVBFCQlfX1VXT1JEX1RZUEUKKyNkZWZpbmUgX19PRkZfVF9UWVBFCQlfX1NMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fT0ZGNjRfVF9UWVBFCQlfX1NRVUFEX1RZUEUKKyNkZWZpbmUgX19QSURfVF9UWVBFCQlfX1MzMl9UWVBFCisjZGVmaW5lIF9fUkxJTV9UX1RZUEUJCV9fVUxPTkdXT1JEX1RZUEUKKyNkZWZpbmUgX19STElNNjRfVF9UWVBFCQlfX1VRVUFEX1RZUEUKKyNkZWZpbmUJX19CTEtDTlRfVF9UWVBFCQlfX1NMT05HV09SRF9UWVBFCisjZGVmaW5lCV9fQkxLQ05UNjRfVF9UWVBFCV9fU1FVQURfVFlQRQorI2RlZmluZQlfX0ZTQkxLQ05UX1RfVFlQRQlfX1VMT05HV09SRF9UWVBFCisjZGVmaW5lCV9fRlNCTEtDTlQ2NF9UX1RZUEUJX19VUVVBRF9UWVBFCisjZGVmaW5lCV9fRlNGSUxDTlRfVF9UWVBFCV9fVUxPTkdXT1JEX1RZUEUKKyNkZWZpbmUJX19GU0ZJTENOVDY0X1RfVFlQRQlfX1VRVUFEX1RZUEUKKyNkZWZpbmUJX19JRF9UX1RZUEUJCV9fVTMyX1RZUEUKKyNkZWZpbmUgX19DTE9DS19UX1RZUEUJCV9fU0xPTkdXT1JEX1RZUEUKKyNkZWZpbmUgX19USU1FX1RfVFlQRQkJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX1VTRUNPTkRTX1RfVFlQRQlfX1UzMl9UWVBFCisjZGVmaW5lIF9fU1VTRUNPTkRTX1RfVFlQRQlfX1NMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fREFERFJfVF9UWVBFCQlfX1MzMl9UWVBFCisjZGVmaW5lIF9fU1dCTEtfVF9UWVBFCQlfX1NMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fS0VZX1RfVFlQRQkJX19TMzJfVFlQRQorI2RlZmluZSBfX0NMT0NLSURfVF9UWVBFCV9fUzMyX1RZUEUKKyNkZWZpbmUgX19USU1FUl9UX1RZUEUJCXZvaWQgKgorI2RlZmluZSBfX0JMS1NJWkVfVF9UWVBFCV9fU0xPTkdXT1JEX1RZUEUKKyNkZWZpbmUgX19GU0lEX1RfVFlQRQkJc3RydWN0IHsgaW50IF9fdmFsWzJdOyB9CisjZGVmaW5lIF9fU1NJWkVfVF9UWVBFCQlfX1NXT1JEX1RZUEUKKworLyogTnVtYmVyIG9mIGRlc2NyaXB0b3JzIHRoYXQgY2FuIGZpdCBpbiBhbiBgZmRfc2V0Jy4gICovCisjZGVmaW5lCV9fRkRfU0VUU0laRQkJMTAyNAorCisKKyNlbmRpZiAvKiBiaXRzL3R5cGVzaXplcy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdWlvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkNzcxOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy91aW8uaApAQCAtMCwwICsxLDc1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDYsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfU1lTX1VJT19IICYmICFkZWZpbmVkIF9GQ05UTF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3Vpby5oPiBkaXJlY3RseTsgdXNlIDxzeXMvdWlvLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX0JJVFNfVUlPX0gKKyNkZWZpbmUgX0JJVFNfVUlPX0gJMQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKworLyogV2Ugc2hvdWxkIG5vcm1hbGx5IHVzZSB0aGUgTGludXgga2VybmVsIGhlYWRlciBmaWxlIHRvIGRlZmluZSB0aGlzCisgICB0eXBlIGFuZCBtYWNyb3MgYnV0IHRoaXMgY2FsbHMgZm9yIHRyb3VibGUgYmVjYXVzZSBvZiB0aGUgaGVhZGVyCisgICBpbmNsdWRlcyBvdGhlciBrZXJuZWwgaGVhZGVycy4gICovCisKKy8qIFNpemUgb2Ygb2JqZWN0IHdoaWNoIGNhbiBiZSB3cml0dGVuIGF0b21pY2FsbHkuCisKKyAgIFRoaXMgbWFjcm8gaGFzIGRpZmZlcmVudCB2YWx1ZXMgaW4gZGlmZmVyZW50IGtlcm5lbCB2ZXJzaW9ucy4gIFRoZQorICAgbGF0ZXN0IHZlcnNpb25zIG9mIHRoZSBrZXJuZWwgdXNlIDEwMjQgYW5kIHRoaXMgaXMgZ29vZCBjaG9pY2UuICBTaW5jZQorICAgdGhlIEMgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiBvZiByZWFkdi93cml0ZXYgaXMgYWJsZSB0byBlbXVsYXRlIHRoZQorICAgZnVuY3Rpb25hbGl0eSBldmVuIGlmIHRoZSBjdXJyZW50bHkgcnVubmluZyBrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydAorICAgdGhpcyBsYXJnZSB2YWx1ZSB0aGUgcmVhZHYvd3JpdGV2IGNhbGwgd2lsbCBub3QgZmFpbCBiZWNhdXNlIG9mIHRoaXMuICAqLworI2RlZmluZSBVSU9fTUFYSU9WCTEwMjQKKworCisvKiBTdHJ1Y3R1cmUgZm9yIHNjYXR0ZXIvZ2F0aGVyIEkvTy4gICovCitzdHJ1Y3QgaW92ZWMKKyAgeworICAgIHZvaWQgKmlvdl9iYXNlOwkvKiBQb2ludGVyIHRvIGRhdGEuICAqLworICAgIHNpemVfdCBpb3ZfbGVuOwkvKiBMZW5ndGggb2YgZGF0YS4gICovCisgIH07CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfU1lTX1VJT19IICYmICFkZWZpbmVkIF9CSVRTX1VJT19IX0ZPUl9TWVNfVUlPX0gKKyNkZWZpbmUgX0JJVFNfVUlPX0hfRk9SX1NZU19VSU9fSCAxCisKK19fQkVHSU5fREVDTFMKKworLyogUmVhZCBmcm9tIGFub3RoZXIgcHJvY2VzcycgYWRkcmVzcyBzcGFjZS4gICovCitleHRlcm4gc3NpemVfdCBwcm9jZXNzX3ZtX3JlYWR2IChwaWRfdCBfX3BpZCwgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9fbHZlYywKKwkJCQkgdW5zaWduZWQgbG9uZyBpbnQgX19saW92Y250LAorCQkJCSBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19ydmVjLAorCQkJCSB1bnNpZ25lZCBsb25nIGludCBfX3Jpb3ZjbnQsCisJCQkJIHVuc2lnbmVkIGxvbmcgaW50IF9fZmxhZ3MpCisgIF9fVEhST1c7CisKKy8qIFdyaXRlIHRvIGFub3RoZXIgcHJvY2VzcycgYWRkcmVzcyBzcGFjZS4gICovCitleHRlcm4gc3NpemVfdCBwcm9jZXNzX3ZtX3dyaXRldiAocGlkX3QgX19waWQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2x2ZWMsCisJCQkJICB1bnNpZ25lZCBsb25nIGludCBfX2xpb3ZjbnQsCisJCQkJICBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19ydmVjLAorCQkJCSAgdW5zaWduZWQgbG9uZyBpbnQgX19yaW92Y250LAorCQkJCSAgdW5zaWduZWQgbG9uZyBpbnQgX19mbGFncykKKyAgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdW5pc3RkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI5YjRjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy91bmlzdGQuaApAQCAtMCwwICsxLDM4NiBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciB1bmlzdGQgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9VTklTVERfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy91bmlzdGQuaD4gZGlyZWN0bHk7IHVzZSA8dW5pc3RkLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK2V4dGVybiBzc2l6ZV90IF9fcmVhZF9jaGsgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJICAgc2l6ZV90IF9fYnVmbGVuKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcmVhZF9hbGlhcywgKGludCBfX2ZkLCB2b2lkICpfX2J1ZiwKKwkJCQkJICBzaXplX3QgX19uYnl0ZXMpLCByZWFkKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcmVhZF9jaGtfd2FybiwKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgICBzaXplX3QgX19idWZsZW4pLCBfX3JlYWRfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgicmVhZCBjYWxsZWQgd2l0aCBiaWdnZXIgbGVuZ3RoIHRoYW4gc2l6ZSBvZiAiCisJCSAgICAgICAidGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHNzaXplX3QKK3JlYWQgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzKQoreworICBpZiAoX19ib3MwIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uYnl0ZXMpKQorCXJldHVybiBfX3JlYWRfY2hrIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fYm9zMCAoX19idWYpKTsKKworICAgICAgaWYgKF9fbmJ5dGVzID4gX19ib3MwIChfX2J1ZikpCisJcmV0dXJuIF9fcmVhZF9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX2JvczAgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19yZWFkX2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMpOworfQorCisjaWZkZWYgX19VU0VfVU5JWDk4CitleHRlcm4gc3NpemVfdCBfX3ByZWFkX2NoayAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkgICAgX19vZmZfdCBfX29mZnNldCwgc2l6ZV90IF9fYnVmc2l6ZSkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX3ByZWFkNjRfY2hrIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgICAgIF9fb2ZmNjRfdCBfX29mZnNldCwgc2l6ZV90IF9fYnVmc2l6ZSkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3ByZWFkX2FsaWFzLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJICAgIF9fb2ZmX3QgX19vZmZzZXQpLCBwcmVhZCkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3ByZWFkNjRfYWxpYXMsCisJCQkgICAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkgICAgX19vZmY2NF90IF9fb2Zmc2V0KSwgcHJlYWQ2NCkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3ByZWFkX2Noa193YXJuLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJICAgIF9fb2ZmX3QgX19vZmZzZXQsIHNpemVfdCBfX2J1ZnNpemUpLCBfX3ByZWFkX2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoInByZWFkIGNhbGxlZCB3aXRoIGJpZ2dlciBsZW5ndGggdGhhbiBzaXplIG9mICIKKwkJICAgICAgICJ0aGUgZGVzdGluYXRpb24gYnVmZmVyIik7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3ByZWFkNjRfY2hrX3dhcm4sCisJCQkgICAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkgICAgX19vZmY2NF90IF9fb2Zmc2V0LCBzaXplX3QgX19idWZzaXplKSwKKwkJCSAgICBfX3ByZWFkNjRfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgicHJlYWQ2NCBjYWxsZWQgd2l0aCBiaWdnZXIgbGVuZ3RoIHRoYW4gc2l6ZSBvZiAiCisJCSAgICAgICAidGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHNzaXplX3QKK3ByZWFkIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywgX19vZmZfdCBfX29mZnNldCkKK3sKKyAgaWYgKF9fYm9zMCAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbmJ5dGVzKSkKKwlyZXR1cm4gX19wcmVhZF9jaGsgKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQsIF9fYm9zMCAoX19idWYpKTsKKworICAgICAgaWYgKCBfX25ieXRlcyA+IF9fYm9zMCAoX19idWYpKQorCXJldHVybiBfX3ByZWFkX2Noa193YXJuIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0LAorCQkJCSBfX2JvczAgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19wcmVhZF9hbGlhcyAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCk7Cit9CisjIGVsc2UKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgc3NpemVfdAorcHJlYWQgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLCBfX29mZjY0X3QgX19vZmZzZXQpCit7CisgIGlmIChfX2JvczAgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX25ieXRlcykpCisJcmV0dXJuIF9fcHJlYWQ2NF9jaGsgKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQsIF9fYm9zMCAoX19idWYpKTsKKworICAgICAgaWYgKCBfX25ieXRlcyA+IF9fYm9zMCAoX19idWYpKQorCXJldHVybiBfX3ByZWFkNjRfY2hrX3dhcm4gKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQsCisJCQkJICAgX19ib3MwIChfX2J1ZikpOworICAgIH0KKworICByZXR1cm4gX19wcmVhZDY0X2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0KTsKK30KKyMgZW5kaWYKKworIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBzc2l6ZV90CitwcmVhZDY0IChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywgX19vZmY2NF90IF9fb2Zmc2V0KQoreworICBpZiAoX19ib3MwIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uYnl0ZXMpKQorCXJldHVybiBfX3ByZWFkNjRfY2hrIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0LCBfX2JvczAgKF9fYnVmKSk7CisKKyAgICAgIGlmICggX19uYnl0ZXMgPiBfX2JvczAgKF9fYnVmKSkKKwlyZXR1cm4gX19wcmVhZDY0X2Noa193YXJuIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0LAorCQkJCSAgIF9fYm9zMCAoX19idWYpKTsKKyAgICB9CisKKyAgcmV0dXJuIF9fcHJlYWQ2NF9hbGlhcyAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCk7Cit9CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCitleHRlcm4gc3NpemVfdCBfX3JlYWRsaW5rX2NoayAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwKKwkJCSAgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4sCisJCQkgICAgICAgc2l6ZV90IF9fYnVmbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3JlYWRsaW5rX2FsaWFzLAorCQkJICAgICAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJCWNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbiksIHJlYWRsaW5rKQorICAgICBfX25vbm51bGwgKCgxLCAyKSkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUX05USCAoX19yZWFkbGlua19jaGtfd2FybiwKKwkJCSAgICAgICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwKKwkJCQljaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4sCisJCQkJc2l6ZV90IF9fYnVmbGVuKSwgX19yZWFkbGlua19jaGspCisgICAgIF9fbm9ubnVsbCAoKDEsIDIpKSBfX3d1ciBfX3dhcm5hdHRyICgicmVhZGxpbmsgY2FsbGVkIHdpdGggYmlnZ2VyIGxlbmd0aCAiCisJCQkJCSAgInRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX25vbm51bGwgKCgxLCAyKSkgX193dXIgc3NpemVfdAorX19OVEggKHJlYWRsaW5rIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLAorCQkgc2l6ZV90IF9fbGVuKSkKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX3JlYWRsaW5rX2NoayAoX19wYXRoLCBfX2J1ZiwgX19sZW4sIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoIF9fbGVuID4gX19ib3MgKF9fYnVmKSkKKwlyZXR1cm4gX19yZWFkbGlua19jaGtfd2FybiAoX19wYXRoLCBfX2J1ZiwgX19sZW4sIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fcmVhZGxpbmtfYWxpYXMgKF9fcGF0aCwgX19idWYsIF9fbGVuKTsKK30KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfQVRGSUxFCitleHRlcm4gc3NpemVfdCBfX3JlYWRsaW5rYXRfY2hrIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwKKwkJCQkgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuLAorCQkJCSBzaXplX3QgX19idWZsZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVF9OVEggKF9fcmVhZGxpbmthdF9hbGlhcywKKwkJCSAgICAgICAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkJY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuKSwKKwkJCSAgICAgICByZWFkbGlua2F0KQorICAgICBfX25vbm51bGwgKCgyLCAzKSkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUX05USCAoX19yZWFkbGlua2F0X2Noa193YXJuLAorCQkJICAgICAgIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwKKwkJCQljaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4sCisJCQkJc2l6ZV90IF9fYnVmbGVuKSwgX19yZWFkbGlua2F0X2NoaykKKyAgICAgX19ub25udWxsICgoMiwgMykpIF9fd3VyIF9fd2FybmF0dHIgKCJyZWFkbGlua2F0IGNhbGxlZCB3aXRoIGJpZ2dlciAiCisJCQkJCSAgImxlbmd0aCB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkJCQkgICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX25vbm51bGwgKCgyLCAzKSkgX193dXIgc3NpemVfdAorX19OVEggKHJlYWRsaW5rYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4pKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fcmVhZGxpbmthdF9jaGsgKF9fZmQsIF9fcGF0aCwgX19idWYsIF9fbGVuLCBfX2JvcyAoX19idWYpKTsKKworICAgICAgaWYgKF9fbGVuID4gX19ib3MgKF9fYnVmKSkKKwlyZXR1cm4gX19yZWFkbGlua2F0X2Noa193YXJuIChfX2ZkLCBfX3BhdGgsIF9fYnVmLCBfX2xlbiwKKwkJCQkgICAgICBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX3JlYWRsaW5rYXRfYWxpYXMgKF9fZmQsIF9fcGF0aCwgX19idWYsIF9fbGVuKTsKK30KKyNlbmRpZgorCitleHRlcm4gY2hhciAqX19nZXRjd2RfY2hrIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fYnVmbGVuKQorICAgICBfX1RIUk9XIF9fd3VyOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1RfTlRIIChfX2dldGN3ZF9hbGlhcywKKwkJCSAgICAgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19zaXplKSwgZ2V0Y3dkKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUX05USCAoX19nZXRjd2RfY2hrX3dhcm4sCisJCQkgICAgIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fYnVmbGVuKSwKKwkJCSAgICAgX19nZXRjd2RfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZ2V0Y3dkIGNhbGxlciB3aXRoIGJpZ2dlciBsZW5ndGggdGhhbiBzaXplIG9mICIKKwkJICAgICAgICJkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBjaGFyICoKK19fTlRIIChnZXRjd2QgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19zaXplKSkKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zaXplKSkKKwlyZXR1cm4gX19nZXRjd2RfY2hrIChfX2J1ZiwgX19zaXplLCBfX2JvcyAoX19idWYpKTsKKworICAgICAgaWYgKF9fc2l6ZSA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fZ2V0Y3dkX2Noa193YXJuIChfX2J1ZiwgX19zaXplLCBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX2dldGN3ZF9hbGlhcyAoX19idWYsIF9fc2l6ZSk7Cit9CisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECitleHRlcm4gY2hhciAqX19nZXR3ZF9jaGsgKGNoYXIgKl9fYnVmLCBzaXplX3QgYnVmbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUX05USCAoX19nZXR3ZF93YXJuLCAoY2hhciAqX19idWYpLCBnZXR3ZCkKKyAgICAgX19ub25udWxsICgoMSkpIF9fd3VyIF9fd2FybmF0dHIgKCJwbGVhc2UgdXNlIGdldGN3ZCBpbnN0ZWFkLCBhcyBnZXR3ZCAiCisJCQkJICAgICAgICJkb2Vzbid0IHNwZWNpZnkgYnVmZmVyIHNpemUiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX25vbm51bGwgKCgxKSkgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fIF9fd3VyIGNoYXIgKgorX19OVEggKGdldHdkIChjaGFyICpfX2J1ZikpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHJldHVybiBfX2dldHdkX2NoayAoX19idWYsIF9fYm9zIChfX2J1ZikpOworICByZXR1cm4gX19nZXR3ZF93YXJuIChfX2J1Zik7Cit9CisjZW5kaWYKKworZXh0ZXJuIHNpemVfdCBfX2NvbmZzdHJfY2hrIChpbnQgX19uYW1lLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fbGVuLAorCQkJICAgICBzaXplX3QgX19idWZsZW4pIF9fVEhST1c7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX2NvbmZzdHJfYWxpYXMsIChpbnQgX19uYW1lLCBjaGFyICpfX2J1ZiwKKwkJCQkJCXNpemVfdCBfX2xlbiksIGNvbmZzdHIpOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX19jb25mc3RyX2Noa193YXJuLAorCQkJICAgICAgKGludCBfX25hbWUsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19sZW4sCisJCQkgICAgICAgc2l6ZV90IF9fYnVmbGVuKSwgX19jb25mc3RyX2NoaykKKyAgICAgX193YXJuYXR0ciAoImNvbmZzdHIgY2FsbGVkIHdpdGggYmlnZ2VyIGxlbmd0aCB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNpemVfdAorX19OVEggKGNvbmZzdHIgKGludCBfX25hbWUsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19sZW4pKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fY29uZnN0cl9jaGsgKF9fbmFtZSwgX19idWYsIF9fbGVuLCBfX2JvcyAoX19idWYpKTsKKworICAgICAgaWYgKF9fYm9zIChfX2J1ZikgPCBfX2xlbikKKwlyZXR1cm4gX19jb25mc3RyX2Noa193YXJuIChfX25hbWUsIF9fYnVmLCBfX2xlbiwgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19jb25mc3RyX2FsaWFzIChfX25hbWUsIF9fYnVmLCBfX2xlbik7Cit9CisKKworZXh0ZXJuIGludCBfX2dldGdyb3Vwc19jaGsgKGludCBfX3NpemUsIF9fZ2lkX3QgX19saXN0W10sIHNpemVfdCBfX2xpc3RsZW4pCisgICAgIF9fVEhST1cgX193dXI7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2dldGdyb3Vwc19hbGlhcywgKGludCBfX3NpemUsIF9fZ2lkX3QgX19saXN0W10pLAorCQkJICAgZ2V0Z3JvdXBzKSBfX3d1cjsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZ2V0Z3JvdXBzX2Noa193YXJuLAorCQkJICAgKGludCBfX3NpemUsIF9fZ2lkX3QgX19saXN0W10sIHNpemVfdCBfX2xpc3RsZW4pLAorCQkJICAgX19nZXRncm91cHNfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZ2V0Z3JvdXBzIGNhbGxlZCB3aXRoIGJpZ2dlciBncm91cCBjb3VudCB0aGFuIHdoYXQgIgorCQkgICAgICAgImNhbiBmaXQgaW50byBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChnZXRncm91cHMgKGludCBfX3NpemUsIF9fZ2lkX3QgX19saXN0W10pKQoreworICBpZiAoX19ib3MgKF9fbGlzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zaXplKSB8fCBfX3NpemUgPCAwKQorCXJldHVybiBfX2dldGdyb3Vwc19jaGsgKF9fc2l6ZSwgX19saXN0LCBfX2JvcyAoX19saXN0KSk7CisKKyAgICAgIGlmIChfX3NpemUgKiBzaXplb2YgKF9fZ2lkX3QpID4gX19ib3MgKF9fbGlzdCkpCisJcmV0dXJuIF9fZ2V0Z3JvdXBzX2Noa193YXJuIChfX3NpemUsIF9fbGlzdCwgX19ib3MgKF9fbGlzdCkpOworICAgIH0KKyAgcmV0dXJuIF9fZ2V0Z3JvdXBzX2FsaWFzIChfX3NpemUsIF9fbGlzdCk7Cit9CisKKworZXh0ZXJuIGludCBfX3R0eW5hbWVfcl9jaGsgKGludCBfX2ZkLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgIHNpemVfdCBfX25yZWFsKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fdHR5bmFtZV9yX2FsaWFzLCAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLAorCQkJCQkgICAgICAgc2l6ZV90IF9fYnVmbGVuKSwgdHR5bmFtZV9yKQorICAgICBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3R0eW5hbWVfcl9jaGtfd2FybiwKKwkJCSAgIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBzaXplX3QgX19ucmVhbCksIF9fdHR5bmFtZV9yX2NoaykKKyAgICAgX19ub25udWxsICgoMikpIF9fd2FybmF0dHIgKCJ0dHluYW1lX3IgY2FsbGVkIHdpdGggYmlnZ2VyIGJ1ZmxlbiB0aGFuICIKKwkJCQkgInNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAodHR5bmFtZV9yIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbikpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fYnVmbGVuKSkKKwlyZXR1cm4gX190dHluYW1lX3JfY2hrIChfX2ZkLCBfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoX19idWZsZW4gPiBfX2JvcyAoX19idWYpKQorCXJldHVybiBfX3R0eW5hbWVfcl9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX3R0eW5hbWVfcl9hbGlhcyAoX19mZCwgX19idWYsIF9fYnVmbGVuKTsKK30KKworCisjaWYgZGVmaW5lZCBfX1VTRV9SRUVOVFJBTlQgfHwgZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTUwNgorZXh0ZXJuIGludCBfX2dldGxvZ2luX3JfY2hrIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLCBzaXplX3QgX19ucmVhbCkKKyAgICAgX19ub25udWxsICgoMSkpOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX2dldGxvZ2luX3JfYWxpYXMsIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSwKKwkJICAgICAgIGdldGxvZ2luX3IpIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19nZXRsb2dpbl9yX2Noa193YXJuLAorCQkgICAgICAgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sIHNpemVfdCBfX25yZWFsKSwKKwkJICAgICAgIF9fZ2V0bG9naW5fcl9jaGspCisgICAgIF9fbm9ubnVsbCAoKDEpKSBfX3dhcm5hdHRyICgiZ2V0bG9naW5fciBjYWxsZWQgd2l0aCBiaWdnZXIgYnVmbGVuIHRoYW4gIgorCQkJCSAic2l6ZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK2dldGxvZ2luX3IgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fYnVmbGVuKSkKKwlyZXR1cm4gX19nZXRsb2dpbl9yX2NoayAoX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKworICAgICAgaWYgKF9fYnVmbGVuID4gX19ib3MgKF9fYnVmKSkKKwlyZXR1cm4gX19nZXRsb2dpbl9yX2Noa193YXJuIChfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fZ2V0bG9naW5fcl9hbGlhcyAoX19idWYsIF9fYnVmbGVuKTsKK30KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorZXh0ZXJuIGludCBfX2dldGhvc3RuYW1lX2NoayAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1Zmxlbiwgc2l6ZV90IF9fbnJlYWwpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19nZXRob3N0bmFtZV9hbGlhcywgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pLAorCQkJICAgZ2V0aG9zdG5hbWUpIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZ2V0aG9zdG5hbWVfY2hrX3dhcm4sCisJCQkgICAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1Zmxlbiwgc2l6ZV90IF9fbnJlYWwpLAorCQkJICAgX19nZXRob3N0bmFtZV9jaGspCisgICAgIF9fbm9ubnVsbCAoKDEpKSBfX3dhcm5hdHRyICgiZ2V0aG9zdG5hbWUgY2FsbGVkIHdpdGggYmlnZ2VyIGJ1ZmxlbiB0aGFuICIKKwkJCQkgInNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAoZ2V0aG9zdG5hbWUgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2J1ZmxlbikpCisJcmV0dXJuIF9fZ2V0aG9zdG5hbWVfY2hrIChfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoX19idWZsZW4gPiBfX2JvcyAoX19idWYpKQorCXJldHVybiBfX2dldGhvc3RuYW1lX2Noa193YXJuIChfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fZ2V0aG9zdG5hbWVfYWxpYXMgKF9fYnVmLCBfX2J1Zmxlbik7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgKGRlZmluZWQgX19VU0VfWE9QRU4gJiYgIWRlZmluZWQgX19VU0VfVU5JWDk4KQorZXh0ZXJuIGludCBfX2dldGRvbWFpbm5hbWVfY2hrIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLCBzaXplX3QgX19ucmVhbCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2dldGRvbWFpbm5hbWVfYWxpYXMsIChjaGFyICpfX2J1ZiwKKwkJCQkJCSAgIHNpemVfdCBfX2J1ZmxlbiksCisJCQkgICBnZXRkb21haW5uYW1lKSBfX25vbm51bGwgKCgxKSkgX193dXI7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2dldGRvbWFpbm5hbWVfY2hrX3dhcm4sCisJCQkgICAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1Zmxlbiwgc2l6ZV90IF9fbnJlYWwpLAorCQkJICAgX19nZXRkb21haW5uYW1lX2NoaykKKyAgICAgX19ub25udWxsICgoMSkpIF9fd3VyIF9fd2FybmF0dHIgKCJnZXRkb21haW5uYW1lIGNhbGxlZCB3aXRoIGJpZ2dlciAiCisJCQkJICAgICAgICJidWZsZW4gdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJCQkgICAgICAgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKGdldGRvbWFpbm5hbWUgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2J1ZmxlbikpCisJcmV0dXJuIF9fZ2V0ZG9tYWlubmFtZV9jaGsgKF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX2J1ZmxlbiA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fZ2V0ZG9tYWlubmFtZV9jaGtfd2FybiAoX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX2dldGRvbWFpbm5hbWVfYWxpYXMgKF9fYnVmLCBfX2J1Zmxlbik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy91c3RhdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3VzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljNmI3MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy91c3RhdC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1VTVEFUX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvdXN0YXQuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3VzdGF0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworc3RydWN0IHVzdGF0CisgIHsKKyAgICBfX2RhZGRyX3QgZl90ZnJlZTsJCS8qIE51bWJlciBvZiBmcmVlIGJsb2Nrcy4gICovCisgICAgX19pbm9fdCBmX3Rpbm9kZTsJCS8qIE51bWJlciBvZiBmcmVlIGlub2Rlcy4gICovCisgICAgY2hhciBmX2ZuYW1lWzZdOworICAgIGNoYXIgZl9mcGFja1s2XTsKKyAgfTsKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy91dG1wLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdXRtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTVhZDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdXRtcC5oCkBAIC0wLDAgKzEsMTI1IEBACisvKiBUaGUgYHN0cnVjdCB1dG1wJyB0eXBlLCBkZXNjcmliaW5nIGVudHJpZXMgaW4gdGhlIHV0bXAgZmlsZS4gIEdOVSB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAyCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfVVRNUF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3V0bXAuaD4gZGlyZWN0bHk7IHVzZSA8dXRtcC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8cGF0aHMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworCisjZGVmaW5lIFVUX0xJTkVTSVpFCTMyCisjZGVmaW5lIFVUX05BTUVTSVpFCTMyCisjZGVmaW5lIFVUX0hPU1RTSVpFCTI1NgorCisKKy8qIFRoZSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBlbnRyeSBpbiB0aGUgZGF0YWJhc2Ugb2YKKyAgIHByZXZpb3VzIGxvZ2lucy4gICovCitzdHJ1Y3QgbGFzdGxvZworICB7CisjaWYgX19XT1JEU0laRSA9PSA2NCAmJiBkZWZpbmVkIF9fV09SRFNJWkVfQ09NUEFUMzIKKyAgICBpbnQzMl90IGxsX3RpbWU7CisjZWxzZQorICAgIF9fdGltZV90IGxsX3RpbWU7CisjZW5kaWYKKyAgICBjaGFyIGxsX2xpbmVbVVRfTElORVNJWkVdOworICAgIGNoYXIgbGxfaG9zdFtVVF9IT1NUU0laRV07CisgIH07CisKKworLyogVGhlIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBzdGF0dXMgb2YgYSB0ZXJtaW5hdGVkIHByb2Nlc3MuICBUaGlzCisgICB0eXBlIGlzIHVzZWQgaW4gYHN0cnVjdCB1dG1wJyBiZWxvdy4gICovCitzdHJ1Y3QgZXhpdF9zdGF0dXMKKyAgeworICAgIHNob3J0IGludCBlX3Rlcm1pbmF0aW9uOwkvKiBQcm9jZXNzIHRlcm1pbmF0aW9uIHN0YXR1cy4gICovCisgICAgc2hvcnQgaW50IGVfZXhpdDsJCS8qIFByb2Nlc3MgZXhpdCBzdGF0dXMuICAqLworICB9OworCisKKy8qIFRoZSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBlbnRyeSBpbiB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlLiAgKi8KK3N0cnVjdCB1dG1wCit7CisgIHNob3J0IGludCB1dF90eXBlOwkJLyogVHlwZSBvZiBsb2dpbi4gICovCisgIHBpZF90IHV0X3BpZDsJCQkvKiBQcm9jZXNzIElEIG9mIGxvZ2luIHByb2Nlc3MuICAqLworICBjaGFyIHV0X2xpbmVbVVRfTElORVNJWkVdOwkvKiBEZXZpY2VuYW1lLiAgKi8KKyAgY2hhciB1dF9pZFs0XTsJCS8qIEluaXR0YWIgSUQuICAqLworICBjaGFyIHV0X3VzZXJbVVRfTkFNRVNJWkVdOwkvKiBVc2VybmFtZS4gICovCisgIGNoYXIgdXRfaG9zdFtVVF9IT1NUU0laRV07CS8qIEhvc3RuYW1lIGZvciByZW1vdGUgbG9naW4uICAqLworICBzdHJ1Y3QgZXhpdF9zdGF0dXMgdXRfZXhpdDsJLyogRXhpdCBzdGF0dXMgb2YgYSBwcm9jZXNzIG1hcmtlZAorCQkJCSAgIGFzIERFQURfUFJPQ0VTUy4gICovCisvKiBUaGUgdXRfc2Vzc2lvbiBhbmQgdXRfdHYgZmllbGRzIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSB3aGVuIGNvbXBpbGVkCisgICAzMi0gYW5kIDY0LWJpdC4gIFRoaXMgYWxsb3dzIGRhdGEgZmlsZXMgYW5kIHNoYXJlZCBtZW1vcnkgdG8gYmUKKyAgIHNoYXJlZCBiZXR3ZWVuIDMyLSBhbmQgNjQtYml0IGFwcGxpY2F0aW9ucy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NCAmJiBkZWZpbmVkIF9fV09SRFNJWkVfQ09NUEFUMzIKKyAgaW50MzJfdCB1dF9zZXNzaW9uOwkJLyogU2Vzc2lvbiBJRCwgdXNlZCBmb3Igd2luZG93aW5nLiAgKi8KKyAgc3RydWN0CisgIHsKKyAgICBpbnQzMl90IHR2X3NlYzsJCS8qIFNlY29uZHMuICAqLworICAgIGludDMyX3QgdHZfdXNlYzsJCS8qIE1pY3Jvc2Vjb25kcy4gICovCisgIH0gdXRfdHY7CQkJLyogVGltZSBlbnRyeSB3YXMgbWFkZS4gICovCisjZWxzZQorICBsb25nIGludCB1dF9zZXNzaW9uOwkJLyogU2Vzc2lvbiBJRCwgdXNlZCBmb3Igd2luZG93aW5nLiAgKi8KKyAgc3RydWN0IHRpbWV2YWwgdXRfdHY7CQkvKiBUaW1lIGVudHJ5IHdhcyBtYWRlLiAgKi8KKyNlbmRpZgorCisgIGludDMyX3QgdXRfYWRkcl92Nls0XTsJLyogSW50ZXJuZXQgYWRkcmVzcyBvZiByZW1vdGUgaG9zdC4gICovCisgIGNoYXIgX191bnVzZWRbMjBdOwkJLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICAqLworfTsKKworLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaGFja3MuICAqLworI2RlZmluZSB1dF9uYW1lCQl1dF91c2VyCisjaWZuZGVmIF9OT19VVF9USU1FCisvKiBXZSBoYXZlIGEgcHJvYmxlbSBoZXJlOiBgdXRfdGltZScgaXMgYWxzbyB1c2VkIG90aGVyd2lzZS4gIERlZmluZQorICAgX05PX1VUX1RJTUUgaWYgdGhlIGNvbXBpbGVyIGNvbXBsYWlucy4gICovCisjIGRlZmluZSB1dF90aW1lCXV0X3R2LnR2X3NlYworI2VuZGlmCisjZGVmaW5lIHV0X3h0aW1lCXV0X3R2LnR2X3NlYworI2RlZmluZSB1dF9hZGRyCQl1dF9hZGRyX3Y2WzBdCisKKworLyogVmFsdWVzIGZvciB0aGUgYHV0X3R5cGUnIGZpZWxkIG9mIGEgYHN0cnVjdCB1dG1wJy4gICovCisjZGVmaW5lIEVNUFRZCQkwCS8qIE5vIHZhbGlkIHVzZXIgYWNjb3VudGluZyBpbmZvcm1hdGlvbi4gICovCisKKyNkZWZpbmUgUlVOX0xWTAkJMQkvKiBUaGUgc3lzdGVtJ3MgcnVubGV2ZWwuICAqLworI2RlZmluZSBCT09UX1RJTUUJMgkvKiBUaW1lIG9mIHN5c3RlbSBib290LiAgKi8KKyNkZWZpbmUgTkVXX1RJTUUJMwkvKiBUaW1lIGFmdGVyIHN5c3RlbSBjbG9jayBjaGFuZ2VkLiAgKi8KKyNkZWZpbmUgT0xEX1RJTUUJNAkvKiBUaW1lIHdoZW4gc3lzdGVtIGNsb2NrIGNoYW5nZWQuICAqLworCisjZGVmaW5lIElOSVRfUFJPQ0VTUwk1CS8qIFByb2Nlc3Mgc3Bhd25lZCBieSB0aGUgaW5pdCBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgTE9HSU5fUFJPQ0VTUwk2CS8qIFNlc3Npb24gbGVhZGVyIG9mIGEgbG9nZ2VkIGluIHVzZXIuICAqLworI2RlZmluZSBVU0VSX1BST0NFU1MJNwkvKiBOb3JtYWwgcHJvY2Vzcy4gICovCisjZGVmaW5lIERFQURfUFJPQ0VTUwk4CS8qIFRlcm1pbmF0ZWQgcHJvY2Vzcy4gICovCisKKyNkZWZpbmUgQUNDT1VOVElORwk5CisKKy8qIE9sZCBMaW51eCBuYW1lIGZvciB0aGUgRU1QVFkgdHlwZS4gICovCisjZGVmaW5lIFVUX1VOS05PV04JRU1QVFkKKworCisvKiBUZWxsIHRoZSB1c2VyIHRoYXQgd2UgaGF2ZSBhIG1vZGVybiBzeXN0ZW0gd2l0aCBVVF9IT1NULCBVVF9QSUQsCisgICBVVF9UWVBFLCBVVF9JRCBhbmQgVVRfVFYgZmllbGRzLiAgKi8KKyNkZWZpbmUgX0hBVkVfVVRfVFlQRQkxCisjZGVmaW5lIF9IQVZFX1VUX1BJRAkxCisjZGVmaW5lIF9IQVZFX1VUX0lECTEKKyNkZWZpbmUgX0hBVkVfVVRfVFYJMQorI2RlZmluZSBfSEFWRV9VVF9IT1NUCTEKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy91dG1weC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3V0bXB4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0Y2RhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy91dG1weC5oCkBAIC0wLDAgKzEsMTAzIEBACisvKiBTdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyBmb3IgdGhlIHVzZXIgYWNjb3VudGluZyBkYXRhYmFzZS4gIEdOVSB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAyMDAwLCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9VVE1QWF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3V0bXB4Lmg+IGRpcmVjdGx5OyB1c2UgPHV0bXB4Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKworI2lmZGVmIF9fVVNFX0dOVQorIyBpbmNsdWRlIDxwYXRocy5oPgorIyBkZWZpbmUgX1BBVEhfVVRNUFgJX1BBVEhfVVRNUAorIyBkZWZpbmUgX1BBVEhfV1RNUFgJX1BBVEhfV1RNUAorI2VuZGlmCisKKworI2RlZmluZSBfX1VUX0xJTkVTSVpFCTMyCisjZGVmaW5lIF9fVVRfTkFNRVNJWkUJMzIKKyNkZWZpbmUgX19VVF9IT1NUU0laRQkyNTYKKworCisvKiBUaGUgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIHN0YXR1cyBvZiBhIHRlcm1pbmF0ZWQgcHJvY2Vzcy4gIFRoaXMKKyAgIHR5cGUgaXMgdXNlZCBpbiBgc3RydWN0IHV0bXB4JyBiZWxvdy4gICovCitzdHJ1Y3QgX19leGl0X3N0YXR1cworICB7CisjaWZkZWYgX19VU0VfR05VCisgICAgc2hvcnQgaW50IGVfdGVybWluYXRpb247CS8qIFByb2Nlc3MgdGVybWluYXRpb24gc3RhdHVzLiAgKi8KKyAgICBzaG9ydCBpbnQgZV9leGl0OwkJLyogUHJvY2VzcyBleGl0IHN0YXR1cy4gICovCisjZWxzZQorICAgIHNob3J0IGludCBfX2VfdGVybWluYXRpb247CS8qIFByb2Nlc3MgdGVybWluYXRpb24gc3RhdHVzLiAgKi8KKyAgICBzaG9ydCBpbnQgX19lX2V4aXQ7CQkvKiBQcm9jZXNzIGV4aXQgc3RhdHVzLiAgKi8KKyNlbmRpZgorICB9OworCisKKy8qIFRoZSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBlbnRyeSBpbiB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlLiAgKi8KK3N0cnVjdCB1dG1weAoreworICBzaG9ydCBpbnQgdXRfdHlwZTsJCS8qIFR5cGUgb2YgbG9naW4uICAqLworICBfX3BpZF90IHV0X3BpZDsJCS8qIFByb2Nlc3MgSUQgb2YgbG9naW4gcHJvY2Vzcy4gICovCisgIGNoYXIgdXRfbGluZVtfX1VUX0xJTkVTSVpFXTsJLyogRGV2aWNlbmFtZS4gICovCisgIGNoYXIgdXRfaWRbNF07CQkvKiBJbml0dGFiIElELiAqLworICBjaGFyIHV0X3VzZXJbX19VVF9OQU1FU0laRV07CS8qIFVzZXJuYW1lLiAgKi8KKyAgY2hhciB1dF9ob3N0W19fVVRfSE9TVFNJWkVdOwkvKiBIb3N0bmFtZSBmb3IgcmVtb3RlIGxvZ2luLiAgKi8KKyAgc3RydWN0IF9fZXhpdF9zdGF0dXMgdXRfZXhpdDsJLyogRXhpdCBzdGF0dXMgb2YgYSBwcm9jZXNzIG1hcmtlZAorCQkJCSAgIGFzIERFQURfUFJPQ0VTUy4gICovCisKKy8qIFRoZSBmaWVsZHMgdXRfc2Vzc2lvbiBhbmQgdXRfdHYgbXVzdCBiZSB0aGUgc2FtZSBzaXplIHdoZW4gY29tcGlsZWQKKyAgIDMyLSBhbmQgNjQtYml0LiAgVGhpcyBhbGxvd3MgZmlsZXMgYW5kIHNoYXJlZCBtZW1vcnkgdG8gYmUgc2hhcmVkCisgICBiZXR3ZWVuIDMyLSBhbmQgNjQtYml0IGFwcGxpY2F0aW9ucy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NCAmJiBkZWZpbmVkIF9fV09SRFNJWkVfQ09NUEFUMzIKKyAgX19pbnQzMl90IHV0X3Nlc3Npb247CQkvKiBTZXNzaW9uIElELCB1c2VkIGZvciB3aW5kb3dpbmcuICAqLworICBzdHJ1Y3QKKyAgeworICAgIF9faW50MzJfdCB0dl9zZWM7CQkvKiBTZWNvbmRzLiAgKi8KKyAgICBfX2ludDMyX3QgdHZfdXNlYzsJCS8qIE1pY3Jvc2Vjb25kcy4gICovCisgIH0gdXRfdHY7CQkJLyogVGltZSBlbnRyeSB3YXMgbWFkZS4gICovCisjZWxzZQorICBsb25nIGludCB1dF9zZXNzaW9uOwkJLyogU2Vzc2lvbiBJRCwgdXNlZCBmb3Igd2luZG93aW5nLiAgKi8KKyAgc3RydWN0IHRpbWV2YWwgdXRfdHY7CQkvKiBUaW1lIGVudHJ5IHdhcyBtYWRlLiAgKi8KKyNlbmRpZgorICBfX2ludDMyX3QgdXRfYWRkcl92Nls0XTsJLyogSW50ZXJuZXQgYWRkcmVzcyBvZiByZW1vdGUgaG9zdC4gICovCisgIGNoYXIgX191bnVzZWRbMjBdOwkJLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICAqLworfTsKKworCisvKiBWYWx1ZXMgZm9yIHRoZSBgdXRfdHlwZScgZmllbGQgb2YgYSBgc3RydWN0IHV0bXB4Jy4gICovCisjZGVmaW5lIEVNUFRZCQkwCS8qIE5vIHZhbGlkIHVzZXIgYWNjb3VudGluZyBpbmZvcm1hdGlvbi4gICovCisKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFJVTl9MVkwJMQkvKiBUaGUgc3lzdGVtJ3MgcnVubGV2ZWwuICAqLworI2VuZGlmCisjZGVmaW5lIEJPT1RfVElNRQkyCS8qIFRpbWUgb2Ygc3lzdGVtIGJvb3QuICAqLworI2RlZmluZSBORVdfVElNRQkzCS8qIFRpbWUgYWZ0ZXIgc3lzdGVtIGNsb2NrIGNoYW5nZWQuICAqLworI2RlZmluZSBPTERfVElNRQk0CS8qIFRpbWUgd2hlbiBzeXN0ZW0gY2xvY2sgY2hhbmdlZC4gICovCisKKyNkZWZpbmUgSU5JVF9QUk9DRVNTCTUJLyogUHJvY2VzcyBzcGF3bmVkIGJ5IHRoZSBpbml0IHByb2Nlc3MuICAqLworI2RlZmluZSBMT0dJTl9QUk9DRVNTCTYJLyogU2Vzc2lvbiBsZWFkZXIgb2YgYSBsb2dnZWQgaW4gdXNlci4gICovCisjZGVmaW5lIFVTRVJfUFJPQ0VTUwk3CS8qIE5vcm1hbCBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgREVBRF9QUk9DRVNTCTgJLyogVGVybWluYXRlZCBwcm9jZXNzLiAgKi8KKworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgQUNDT1VOVElORwk5CS8qIFN5c3RlbSBhY2NvdW50aW5nLiAgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3V0c25hbWUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy91dHNuYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVlNzFlMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy91dHNuYW1lLmgKQEAgLTAsMCArMSwyOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVVRTTkFNRV9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3V0c25hbWUuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3V0c25hbWUuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogTGVuZ3RoIG9mIHRoZSBlbnRyaWVzIGluIGBzdHJ1Y3QgdXRzbmFtZScgaXMgNjUuICAqLworI2RlZmluZSBfVVRTTkFNRV9MRU5HVEggNjUKKworLyogTGludXggcHJvdmlkZXMgYXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgYHN0cnVjdCB1dHNuYW1lJworICAgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZG9tYWluLiAgRGVmaW5lIF9VVFNOQU1FX0RPTUFJTl9MRU5HVEgKKyAgIHRvIGEgdmFsdWUgIT0gMCB0byBhY3RpdmF0ZSB0aGlzIGVudHJ5LiAgKi8KKyNkZWZpbmUgX1VUU05BTUVfRE9NQUlOX0xFTkdUSCBfVVRTTkFNRV9MRU5HVEgKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93YWl0ZmxhZ3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93YWl0ZmxhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjRjZWRiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3dhaXRmbGFncy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIERlZmluaXRpb25zIG9mIGZsYWcgYml0cyBmb3IgYHdhaXRwaWQnIGV0IGFsLgorICAgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTYsMTk5NywyMDAwLDIwMDQsMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9TWVNfV0FJVF9IICYmICFkZWZpbmVkIF9TVERMSUJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy93YWl0ZmxhZ3MuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3dhaXQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBCaXRzIGluIHRoZSB0aGlyZCBhcmd1bWVudCB0byBgd2FpdHBpZCcuICAqLworI2RlZmluZQlXTk9IQU5HCQkxCS8qIERvbid0IGJsb2NrIHdhaXRpbmcuICAqLworI2RlZmluZQlXVU5UUkFDRUQJMgkvKiBSZXBvcnQgc3RhdHVzIG9mIHN0b3BwZWQgY2hpbGRyZW4uICAqLworCisvKiBCaXRzIGluIHRoZSBmb3VydGggYXJndW1lbnQgdG8gYHdhaXRpZCcuICAqLworI2RlZmluZSBXU1RPUFBFRAkyCS8qIFJlcG9ydCBzdG9wcGVkIGNoaWxkIChzYW1lIGFzIFdVTlRSQUNFRCkuICovCisjZGVmaW5lIFdFWElURUQJCTQJLyogUmVwb3J0IGRlYWQgY2hpbGQuICAqLworI2RlZmluZSBXQ09OVElOVUVECTgJLyogUmVwb3J0IGNvbnRpbnVlZCBjaGlsZC4gICovCisjZGVmaW5lIFdOT1dBSVQJCTB4MDEwMDAwMDAgLyogRG9uJ3QgcmVhcCwganVzdCBwb2xsIHN0YXR1cy4gICovCisKKyNkZWZpbmUgX19XTk9USFJFQUQgICAgIDB4MjAwMDAwMDAgLyogRG9uJ3Qgd2FpdCBvbiBjaGlsZHJlbiBvZiBvdGhlciB0aHJlYWRzCisJCQkJICAgICAgaW4gdGhpcyBncm91cCAqLworI2RlZmluZSBfX1dBTEwJCTB4NDAwMDAwMDAgLyogV2FpdCBmb3IgYW55IGNoaWxkLiAgKi8KKyNkZWZpbmUgX19XQ0xPTkUJMHg4MDAwMDAwMCAvKiBXYWl0IGZvciBjbG9uZWQgcHJvY2Vzcy4gICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvd2FpdHN0YXR1cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3dhaXRzdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTljMjI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3dhaXRzdGF0dXMuaApAQCAtMCwwICsxLDEwNiBAQAorLyogRGVmaW5pdGlvbnMgb2Ygc3RhdHVzIGJpdHMgZm9yIGB3YWl0JyBldCBhbC4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwxOTk0LDE5OTYsMTk5NywyMDAwLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfU1lTX1dBSVRfSCAmJiAhZGVmaW5lZCBfU1RETElCX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvd2FpdHN0YXR1cy5oPiBkaXJlY3RseTsgdXNlIDxzeXMvd2FpdC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKy8qIEV2ZXJ5dGhpbmcgZXh0YW50IHNvIGZhciB1c2VzIHRoZXNlIHNhbWUgYml0cy4gICovCisKKworLyogSWYgV0lGRVhJVEVEKFNUQVRVUyksIHRoZSBsb3ctb3JkZXIgOCBiaXRzIG9mIHRoZSBzdGF0dXMuICAqLworI2RlZmluZQlfX1dFWElUU1RBVFVTKHN0YXR1cykJKCgoc3RhdHVzKSAmIDB4ZmYwMCkgPj4gOCkKKworLyogSWYgV0lGU0lHTkFMRUQoU1RBVFVTKSwgdGhlIHRlcm1pbmF0aW5nIHNpZ25hbC4gICovCisjZGVmaW5lCV9fV1RFUk1TSUcoc3RhdHVzKQkoKHN0YXR1cykgJiAweDdmKQorCisvKiBJZiBXSUZTVE9QUEVEKFNUQVRVUyksIHRoZSBzaWduYWwgdGhhdCBzdG9wcGVkIHRoZSBjaGlsZC4gICovCisjZGVmaW5lCV9fV1NUT1BTSUcoc3RhdHVzKQlfX1dFWElUU1RBVFVTKHN0YXR1cykKKworLyogTm9uemVybyBpZiBTVEFUVVMgaW5kaWNhdGVzIG5vcm1hbCB0ZXJtaW5hdGlvbi4gICovCisjZGVmaW5lCV9fV0lGRVhJVEVEKHN0YXR1cykJKF9fV1RFUk1TSUcoc3RhdHVzKSA9PSAwKQorCisvKiBOb256ZXJvIGlmIFNUQVRVUyBpbmRpY2F0ZXMgdGVybWluYXRpb24gYnkgYSBzaWduYWwuICAqLworI2RlZmluZSBfX1dJRlNJR05BTEVEKHN0YXR1cykgXAorICAoKChzaWduZWQgY2hhcikgKCgoc3RhdHVzKSAmIDB4N2YpICsgMSkgPj4gMSkgPiAwKQorCisvKiBOb256ZXJvIGlmIFNUQVRVUyBpbmRpY2F0ZXMgdGhlIGNoaWxkIGlzIHN0b3BwZWQuICAqLworI2RlZmluZQlfX1dJRlNUT1BQRUQoc3RhdHVzKQkoKChzdGF0dXMpICYgMHhmZikgPT0gMHg3ZikKKworLyogTm9uemVybyBpZiBTVEFUVVMgaW5kaWNhdGVzIHRoZSBjaGlsZCBjb250aW51ZWQgYWZ0ZXIgYSBzdG9wLiAgV2Ugb25seQorICAgZGVmaW5lIHRoaXMgaWYgPGJpdHMvd2FpdGZsYWdzLmg+IHByb3ZpZGVzIHRoZSBXQ09OVElOVUVEIGZsYWcgYml0LiAgKi8KKyNpZmRlZiBXQ09OVElOVUVECisjIGRlZmluZSBfX1dJRkNPTlRJTlVFRChzdGF0dXMpCSgoc3RhdHVzKSA9PSBfX1dfQ09OVElOVUVEKQorI2VuZGlmCisKKy8qIE5vbnplcm8gaWYgU1RBVFVTIGluZGljYXRlcyB0aGUgY2hpbGQgZHVtcGVkIGNvcmUuICAqLworI2RlZmluZQlfX1dDT1JFRFVNUChzdGF0dXMpCSgoc3RhdHVzKSAmIF9fV0NPUkVGTEFHKQorCisvKiBNYWNyb3MgZm9yIGNvbnN0cnVjdGluZyBzdGF0dXMgdmFsdWVzLiAgKi8KKyNkZWZpbmUJX19XX0VYSVRDT0RFKHJldCwgc2lnKQkoKHJldCkgPDwgOCB8IChzaWcpKQorI2RlZmluZQlfX1dfU1RPUENPREUoc2lnKQkoKHNpZykgPDwgOCB8IDB4N2YpCisjZGVmaW5lIF9fV19DT05USU5VRUQJCTB4ZmZmZgorI2RlZmluZQlfX1dDT1JFRkxBRwkJMHg4MAorCisKKyNpZmRlZglfX1VTRV9CU0QKKworIyBpbmNsdWRlIDxlbmRpYW4uaD4KKwordW5pb24gd2FpdAorICB7CisgICAgaW50IHdfc3RhdHVzOworICAgIHN0cnVjdAorICAgICAgeworIyBpZglfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdW5zaWduZWQgaW50IF9fd190ZXJtc2lnOjc7IC8qIFRlcm1pbmF0aW5nIHNpZ25hbC4gICovCisJdW5zaWduZWQgaW50IF9fd19jb3JlZHVtcDoxOyAvKiBTZXQgaWYgZHVtcGVkIGNvcmUuICAqLworCXVuc2lnbmVkIGludCBfX3dfcmV0Y29kZTo4OyAvKiBSZXR1cm4gY29kZSBpZiBleGl0ZWQgbm9ybWFsbHkuICAqLworCXVuc2lnbmVkIGludDoxNjsKKyMgZW5kaWYJCQkJLyogTGl0dGxlIGVuZGlhbi4gICovCisjIGlmCV9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQ6MTY7CisJdW5zaWduZWQgaW50IF9fd19yZXRjb2RlOjg7CisJdW5zaWduZWQgaW50IF9fd19jb3JlZHVtcDoxOworCXVuc2lnbmVkIGludCBfX3dfdGVybXNpZzo3OworIyBlbmRpZgkJCQkvKiBCaWcgZW5kaWFuLiAgKi8KKyAgICAgIH0gX193YWl0X3Rlcm1pbmF0ZWQ7CisgICAgc3RydWN0CisgICAgICB7CisjIGlmCV9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1bnNpZ25lZCBpbnQgX193X3N0b3B2YWw6ODsgLyogV19TVE9QUEVEIGlmIHN0b3BwZWQuICAqLworCXVuc2lnbmVkIGludCBfX3dfc3RvcHNpZzo4OyAvKiBTdG9wcGluZyBzaWduYWwuICAqLworCXVuc2lnbmVkIGludDoxNjsKKyMgZW5kaWYJCQkJLyogTGl0dGxlIGVuZGlhbi4gICovCisjIGlmCV9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQ6MTY7CisJdW5zaWduZWQgaW50IF9fd19zdG9wc2lnOjg7IC8qIFN0b3BwaW5nIHNpZ25hbC4gICovCisJdW5zaWduZWQgaW50IF9fd19zdG9wdmFsOjg7IC8qIFdfU1RPUFBFRCBpZiBzdG9wcGVkLiAgKi8KKyMgZW5kaWYJCQkJLyogQmlnIGVuZGlhbi4gICovCisgICAgICB9IF9fd2FpdF9zdG9wcGVkOworICB9OworCisjIGRlZmluZSB3X3Rlcm1zaWcJX193YWl0X3Rlcm1pbmF0ZWQuX193X3Rlcm1zaWcKKyMgZGVmaW5lIHdfY29yZWR1bXAJX193YWl0X3Rlcm1pbmF0ZWQuX193X2NvcmVkdW1wCisjIGRlZmluZSB3X3JldGNvZGUJX193YWl0X3Rlcm1pbmF0ZWQuX193X3JldGNvZGUKKyMgZGVmaW5lIHdfc3RvcHNpZwlfX3dhaXRfc3RvcHBlZC5fX3dfc3RvcHNpZworIyBkZWZpbmUgd19zdG9wdmFsCV9fd2FpdF9zdG9wcGVkLl9fd19zdG9wdmFsCisKKyNlbmRpZgkvKiBVc2UgQlNELiAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93Y2hhci1sZGJsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvd2NoYXItbGRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTZhNjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvd2NoYXItbGRibC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciA8d2NoYXIuaD4gZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9XQ0hBUl9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3djaGFyLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8d2NoYXIuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfSVNPQzk1IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKK19fTERCTF9SRURJUl9ERUNMIChmd3ByaW50Zik7CitfX0xEQkxfUkVESVJfREVDTCAod3ByaW50Zik7CitfX0xEQkxfUkVESVJfREVDTCAoc3dwcmludGYpOworX19MREJMX1JFRElSX0RFQ0wgKHZmd3ByaW50Zik7CitfX0xEQkxfUkVESVJfREVDTCAodndwcmludGYpOworX19MREJMX1JFRElSX0RFQ0wgKHZzd3ByaW50Zik7CisjIGlmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmICFkZWZpbmVkIF9fVVNFX0dOVSBcCisgICAgICYmICFkZWZpbmVkIF9fUkVESVJFQ1QgXAorICAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorX19MREJMX1JFRElSMV9ERUNMIChmd3NjYW5mLCBfX25sZGJsX19faXNvYzk5X2Z3c2NhbmYpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHdzY2FuZiwgX19ubGRibF9fX2lzb2M5OV93c2NhbmYpICAKK19fTERCTF9SRURJUjFfREVDTCAoc3dzY2FuZiwgX19ubGRibF9fX2lzb2M5OV9zd3NjYW5mKQorIyBlbHNlCitfX0xEQkxfUkVESVJfREVDTCAoZndzY2FuZik7CitfX0xEQkxfUkVESVJfREVDTCAod3NjYW5mKTsKK19fTERCTF9SRURJUl9ERUNMIChzd3NjYW5mKTsKKyMgZW5kaWYKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKK19fTERCTF9SRURJUjFfREVDTCAod2NzdG9sZCwgd2NzdG9kKTsKKyMgaWYgIWRlZmluZWQgX19VU0VfR05VICYmICFkZWZpbmVkIF9fUkVESVJFQ1QgXAorICAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorX19MREJMX1JFRElSMV9ERUNMICh2ZndzY2FuZiwgX19ubGRibF9fX2lzb2M5OV92ZndzY2FuZikKK19fTERCTF9SRURJUjFfREVDTCAodndzY2FuZiwgX19ubGRibF9fX2lzb2M5OV92d3NjYW5mKSAgCitfX0xEQkxfUkVESVIxX0RFQ0wgKHZzd3NjYW5mLCBfX25sZGJsX19faXNvYzk5X3Zzd3NjYW5mKQorIyBlbHNlCitfX0xEQkxfUkVESVJfREVDTCAodmZ3c2NhbmYpOworX19MREJMX1JFRElSX0RFQ0wgKHZ3c2NhbmYpOworX19MREJMX1JFRElSX0RFQ0wgKHZzd3NjYW5mKTsKKyMgZW5kaWYKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCitfX0xEQkxfUkVESVIxX0RFQ0wgKHdjc3RvbGRfbCwgd2NzdG9kX2wpOworI2VuZGlmCisKKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKK19fTERCTF9SRURJUl9ERUNMIChfX3N3cHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3Zzd3ByaW50Zl9jaGspCisjIGlmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAxCitfX0xEQkxfUkVESVJfREVDTCAoX19md3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX193cHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3Zmd3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192d3ByaW50Zl9jaGspCisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93Y2hhci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3djaGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyYTQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93Y2hhci5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIHdjaGFyX3QgdHlwZSByZWxhdGVkIGRlZmluaXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9CSVRTX1dDSEFSX0gKKyNkZWZpbmUgX0JJVFNfV0NIQVJfSAkxCisKKyNkZWZpbmUgX19XQ0hBUl9NSU4JKC0yMTQ3NDgzNjQ3bCAtIDFsKQorI2RlZmluZSBfX1dDSEFSX01BWAkoMjE0NzQ4MzY0N2wpCisKKyNlbmRpZgkvKiBiaXRzL3djaGFyLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93Y2hhcjIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93Y2hhcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzhlYWEzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3djaGFyMi5oCkBAIC0wLDAgKzEsNTk0IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHdjaGFyIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfV0NIQVJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy93Y2hhcjIuaD4gZGlyZWN0bHk7IHVzZSA8d2NoYXIuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCitleHRlcm4gd2NoYXJfdCAqX193bWVtY3B5X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uLAorCQkJICAgICAgIHNpemVfdCBfX25zMSkgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtY3B5X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczEsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uKSwKKwkJCQl3bWVtY3B5KTsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtY3B5X2Noa193YXJuLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczEsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uLAorCQkJCSBzaXplX3QgX19uczEpLCBfX3dtZW1jcHlfY2hrKQorICAgICBfX3dhcm5hdHRyICgid21lbWNweSBjYWxsZWQgd2l0aCBsZW5ndGggYmlnZ2VyIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod21lbWNweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwKKwkJc2l6ZV90IF9fbikpCit7CisgIGlmIChfX2JvczAgKF9fczEpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikpCisJcmV0dXJuIF9fd21lbWNweV9jaGsgKF9fczEsIF9fczIsIF9fbiwKKwkJCSAgICAgIF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbiA+IF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX3dtZW1jcHlfY2hrX3dhcm4gKF9fczEsIF9fczIsIF9fbiwKKwkJCQkgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193bWVtY3B5X2FsaWFzIChfX3MxLCBfX3MyLCBfX24pOworfQorCisKK2V4dGVybiB3Y2hhcl90ICpfX3dtZW1tb3ZlX2NoayAod2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLAorCQkJCXNpemVfdCBfX24sIHNpemVfdCBfX25zMSkgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtbW92ZV9hbGlhcywgKHdjaGFyX3QgKl9fczEsCisJCQkJCQkgICBfX2NvbnN0IHdjaGFyX3QgKl9fczIsCisJCQkJCQkgICBzaXplX3QgX19uKSwgd21lbW1vdmUpOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3dtZW1tb3ZlX2Noa193YXJuLAorCQkJCSh3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIsCisJCQkJIHNpemVfdCBfX24sIHNpemVfdCBfX25zMSksIF9fd21lbW1vdmVfY2hrKQorICAgICBfX3dhcm5hdHRyICgid21lbW1vdmUgY2FsbGVkIHdpdGggbGVuZ3RoIGJpZ2dlciB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdtZW1tb3ZlICh3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIsIHNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MwIChfX3MxKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pKQorCXJldHVybiBfX3dtZW1tb3ZlX2NoayAoX19zMSwgX19zMiwgX19uLAorCQkJICAgICAgIF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbiA+IF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX3dtZW1tb3ZlX2Noa193YXJuIChfX3MxLCBfX3MyLCBfX24sCisJCQkJICAgIF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICB9CisgIHJldHVybiBfX3dtZW1tb3ZlX2FsaWFzIChfX3MxLCBfX3MyLCBfX24pOworfQorCisKKyNpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiB3Y2hhcl90ICpfX3dtZW1wY3B5X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJCV9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uLAorCQkJCXNpemVfdCBfX25zMSkgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtcGNweV9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwKKwkJCQkgc2l6ZV90IF9fbiksIHdtZW1wY3B5KTsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtcGNweV9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbiwKKwkJCQkgc2l6ZV90IF9fbnMxKSwgX193bWVtcGNweV9jaGspCisgICAgIF9fd2FybmF0dHIgKCJ3bWVtcGNweSBjYWxsZWQgd2l0aCBsZW5ndGggYmlnZ2VyIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod21lbXBjcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczIsCisJCSBzaXplX3QgX19uKSkKK3sKKyAgaWYgKF9fYm9zMCAoX19zMSkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX193bWVtcGNweV9jaGsgKF9fczEsIF9fczIsIF9fbiwKKwkJCSAgICAgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisKKyAgICAgIGlmIChfX24gPiBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX193bWVtcGNweV9jaGtfd2FybiAoX19zMSwgX19zMiwgX19uLAorCQkJCSAgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193bWVtcGNweV9hbGlhcyAoX19zMSwgX19zMiwgX19uKTsKK30KKyNlbmRpZgorCisKK2V4dGVybiB3Y2hhcl90ICpfX3dtZW1zZXRfY2hrICh3Y2hhcl90ICpfX3MsIHdjaGFyX3QgX19jLCBzaXplX3QgX19uLAorCQkJICAgICAgIHNpemVfdCBfX25zKSBfX1RIUk9XOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3dtZW1zZXRfYWxpYXMsICh3Y2hhcl90ICpfX3MsIHdjaGFyX3QgX19jLAorCQkJCQkJICBzaXplX3QgX19uKSwgd21lbXNldCk7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd21lbXNldF9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fYywgc2l6ZV90IF9fbiwKKwkJCQkgc2l6ZV90IF9fbnMpLCBfX3dtZW1zZXRfY2hrKQorICAgICBfX3dhcm5hdHRyICgid21lbXNldCBjYWxsZWQgd2l0aCBsZW5ndGggYmlnZ2VyIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod21lbXNldCAod2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fYywgc2l6ZV90IF9fbikpCit7CisgIGlmIChfX2JvczAgKF9fcykgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX193bWVtc2V0X2NoayAoX19zLCBfX2MsIF9fbiwgX19ib3MwIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisKKyAgICAgIGlmIChfX24gPiBfX2JvczAgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX3dtZW1zZXRfY2hrX3dhcm4gKF9fcywgX19jLCBfX24sCisJCQkJICAgX19ib3MwIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193bWVtc2V0X2FsaWFzIChfX3MsIF9fYywgX19uKTsKK30KKworCitleHRlcm4gd2NoYXJfdCAqX193Y3NjcHlfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCSAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgIHNpemVfdCBfX24pIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NzY3B5X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjKSwgd2NzY3B5KTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3Y3NjcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fd2NzY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgcmV0dXJuIF9fd2NzY3B5X2FsaWFzIChfX2Rlc3QsIF9fc3JjKTsKK30KKworCitleHRlcm4gd2NoYXJfdCAqX193Y3BjcHlfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCSAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgIHNpemVfdCBfX2Rlc3RsZW4pIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NwY3B5X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjKSwgd2NwY3B5KTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3Y3BjcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fd2NwY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgcmV0dXJuIF9fd2NwY3B5X2FsaWFzIChfX2Rlc3QsIF9fc3JjKTsKK30KKworCitleHRlcm4gd2NoYXJfdCAqX193Y3NuY3B5X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uLAorCQkJICAgICAgIHNpemVfdCBfX2Rlc3RsZW4pIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NzbmNweV9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCQkgc2l6ZV90IF9fbiksIHdjc25jcHkpOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3djc25jcHlfY2hrX3dhcm4sCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkJIHNpemVfdCBfX24sIHNpemVfdCBfX2Rlc3RsZW4pLCBfX3djc25jcHlfY2hrKQorICAgICBfX3dhcm5hdHRyICgid2NzbmNweSBjYWxsZWQgd2l0aCBsZW5ndGggYmlnZ2VyIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod2NzbmNweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJc2l6ZV90IF9fbikpCit7CisgIGlmIChfX2JvcyAoX19kZXN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pKQorCXJldHVybiBfX3djc25jcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX24sCisJCQkgICAgICBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgICAgaWYgKF9fbiA+IF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX193Y3NuY3B5X2Noa193YXJuIChfX2Rlc3QsIF9fc3JjLCBfX24sCisJCQkJICAgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICB9CisgIHJldHVybiBfX3djc25jcHlfYWxpYXMgKF9fZGVzdCwgX19zcmMsIF9fbik7Cit9CisKKworZXh0ZXJuIHdjaGFyX3QgKl9fd2NwbmNweV9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbiwKKwkJCSAgICAgICBzaXplX3QgX19kZXN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3djcG5jcHlfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkJIHNpemVfdCBfX24pLCB3Y3BuY3B5KTsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3BuY3B5X2Noa193YXJuLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJCSBzaXplX3QgX19uLCBzaXplX3QgX19kZXN0bGVuKSwgX193Y3BuY3B5X2NoaykKKyAgICAgX193YXJuYXR0ciAoIndjcG5jcHkgY2FsbGVkIHdpdGggbGVuZ3RoIGJpZ2dlciB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdjcG5jcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCXNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX193Y3BuY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJICAgICAgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICAgIGlmIChfX24gPiBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fd2NwbmNweV9jaGtfd2FybiAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJCSAgIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193Y3BuY3B5X2FsaWFzIChfX2Rlc3QsIF9fc3JjLCBfX24pOworfQorCisKK2V4dGVybiB3Y2hhcl90ICpfX3djc2NhdF9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgc2l6ZV90IF9fZGVzdGxlbikgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3NjYXRfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpLCB3Y3NjYXQpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdjc2NhdCAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYykpCit7CisgIGlmIChfX2JvcyAoX19kZXN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICByZXR1cm4gX193Y3NjYXRfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworICByZXR1cm4gX193Y3NjYXRfYWxpYXMgKF9fZGVzdCwgX19zcmMpOworfQorCisKK2V4dGVybiB3Y2hhcl90ICpfX3djc25jYXRfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbiwgc2l6ZV90IF9fZGVzdGxlbikgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3NuY2F0X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJCSBzaXplX3QgX19uKSwgd2NzbmNhdCk7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod2NzbmNhdCAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJc2l6ZV90IF9fbikpCit7CisgIGlmIChfX2JvcyAoX19kZXN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICByZXR1cm4gX193Y3NuY2F0X2NoayAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJICBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworICByZXR1cm4gX193Y3NuY2F0X2FsaWFzIChfX2Rlc3QsIF9fc3JjLCBfX24pOworfQorCisKK2V4dGVybiBpbnQgX19zd3ByaW50Zl9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkJICAgaW50IF9fZmxhZywgc2l6ZV90IF9fc19sZW4sCisJCQkgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKKyAgICAgX19USFJPVyAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193cHJpbnRmX18sIDUsIDYpKSkgKi87CisKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEhfTERCTCAoX19zd3ByaW50Zl9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKSwKKwkJCQlzd3ByaW50Zik7CisKKyNpZmRlZiBfX3ZhX2FyZ19wYWNrCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHN3cHJpbnRmICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKSkKK3sKKyAgaWYgKF9fYm9zIChfX3MpICE9IChzaXplX3QpIC0xIHx8IF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAxKQorICAgIHJldHVybiBfX3N3cHJpbnRmX2NoayAoX19zLCBfX24sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLAorCQkJICAgX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpLAorCQkJICAgX19mbXQsIF9fdmFfYXJnX3BhY2sgKCkpOworICByZXR1cm4gX19zd3ByaW50Zl9hbGlhcyAoX19zLCBfX24sIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyNlbGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisvKiBYWFggV2UgbWlnaHQgd2FudCB0byBoYXZlIHN1cHBvcnQgaW4gZ2NjIGZvciBzd3ByaW50Zi4gICovCisjIGRlZmluZSBzd3ByaW50ZihzLCBuLCAuLi4pIFwKKyAgKF9fYm9zIChzKSAhPSAoc2l6ZV90KSAtMSB8fCBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMQkJCSAgICAgIFwKKyAgID8gX19zd3ByaW50Zl9jaGsgKHMsIG4sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLAkJCSAgICAgIFwKKwkJICAgICBfX2JvcyAocykgLyBzaXplb2YgKHdjaGFyX3QpLCBfX1ZBX0FSR1NfXykJCSAgICAgIFwKKyAgIDogc3dwcmludGYgKHMsIG4sIF9fVkFfQVJHU19fKSkKKyNlbmRpZgorCitleHRlcm4gaW50IF9fdnN3cHJpbnRmX2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCQkgICAgaW50IF9fZmxhZywgc2l6ZV90IF9fc19sZW4sCisJCQkgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgIF9fZ251Y192YV9saXN0IF9fYXJnKQorICAgICBfX1RIUk9XIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dwcmludGZfXywgNSwgMCkpKSAqLzsKKworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USF9MREJMIChfX3Zzd3ByaW50Zl9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwKKwkJCQkgX19nbnVjX3ZhX2xpc3QgX19hcCksIHZzd3ByaW50Zik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAodnN3cHJpbnRmICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIF9fZ251Y192YV9saXN0IF9fYXApKQoreworICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEgfHwgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEpCisgICAgcmV0dXJuIF9fdnN3cHJpbnRmX2NoayAoX19zLCBfX24sICBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwKKwkJCSAgICBfX2JvcyAoX19zKSAvIHNpemVvZiAod2NoYXJfdCksIF9fZm10LCBfX2FwKTsKKyAgcmV0dXJuIF9fdnN3cHJpbnRmX2FsaWFzIChfX3MsIF9fbiwgX19mbXQsIF9fYXApOworfQorCisKKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMQorCitleHRlcm4gaW50IF9fZndwcmludGZfY2hrIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGludCBfX2ZsYWcsCisJCQkgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLik7CitleHRlcm4gaW50IF9fd3ByaW50Zl9jaGsgKGludCBfX2ZsYWcsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgLi4uKTsKK2V4dGVybiBpbnQgX192ZndwcmludGZfY2hrIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGludCBfX2ZsYWcsCisJCQkgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgIF9fZ251Y192YV9saXN0IF9fYXApOworZXh0ZXJuIGludCBfX3Z3cHJpbnRmX2NoayAoaW50IF9fZmxhZywgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgX19nbnVjX3ZhX2xpc3QgX19hcCk7CisKKyMgaWZkZWYgX192YV9hcmdfcGFjaworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3dwcmludGYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQoreworICByZXR1cm4gX193cHJpbnRmX2NoayAoX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK2Z3cHJpbnRmIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQoreworICByZXR1cm4gX19md3ByaW50Zl9jaGsgKF9fc3RyZWFtLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsCisJCQkgX192YV9hcmdfcGFjayAoKSk7Cit9CisjIGVsaWYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgIGRlZmluZSB3cHJpbnRmKC4uLikgXAorICBfX3dwcmludGZfY2hrIChfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19WQV9BUkdTX18pCisjICBkZWZpbmUgZndwcmludGYoc3RyZWFtLCAuLi4pIFwKKyAgX19md3ByaW50Zl9jaGsgKHN0cmVhbSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyBlbmRpZgorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAordndwcmludGYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwgX19nbnVjX3ZhX2xpc3QgX19hcCkKK3sKKyAgcmV0dXJuIF9fdndwcmludGZfY2hrIChfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsIF9fYXApOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAordmZ3cHJpbnRmIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm10LCBfX2dudWNfdmFfbGlzdCBfX2FwKQoreworICByZXR1cm4gX192ZndwcmludGZfY2hrIChfX3N0cmVhbSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKK30KKworI2VuZGlmCisKK2V4dGVybiB3Y2hhcl90ICpfX2ZnZXR3c19jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19zaXplLCBpbnQgX19uLAorCQkJICAgICAgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUIChfX2ZnZXR3c19hbGlhcywKKwkJCSAgICAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIGludCBfX24sCisJCQkgICAgIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIGZnZXR3cykgX193dXI7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVCAoX19mZ2V0d3NfY2hrX3dhcm4sCisJCQkgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19zaXplLCBpbnQgX19uLAorCQkJICAgICBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLCBfX2ZnZXR3c19jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJmZ2V0d3MgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgdGhhbiBsZW5ndGggIgorCQkgICAgICAgIm9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHdjaGFyX3QgKgorZmdldHdzICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSB8fCBfX24gPD0gMCkKKwlyZXR1cm4gX19mZ2V0d3NfY2hrIChfX3MsIF9fYm9zIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSwKKwkJCSAgICAgX19uLCBfX3N0cmVhbSk7CisKKyAgICAgIGlmICgoc2l6ZV90KSBfX24gPiBfX2JvcyAoX19zKSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fZmdldHdzX2Noa193YXJuIChfX3MsIF9fYm9zIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSwKKwkJCQkgIF9fbiwgX19zdHJlYW0pOworICAgIH0KKyAgcmV0dXJuIF9fZmdldHdzX2FsaWFzIChfX3MsIF9fbiwgX19zdHJlYW0pOworfQorCisjaWZkZWYgX19VU0VfR05VCitleHRlcm4gd2NoYXJfdCAqX19mZ2V0d3NfdW5sb2NrZWRfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwKKwkJCQkgICAgICAgaW50IF9fbiwgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQorICBfX3d1cjsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUIChfX2ZnZXR3c191bmxvY2tlZF9hbGlhcywKKwkJCSAgICAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIGludCBfX24sCisJCQkgICAgIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIGZnZXR3c191bmxvY2tlZCkKKyAgX193dXI7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVCAoX19mZ2V0d3NfdW5sb2NrZWRfY2hrX3dhcm4sCisJCQkgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19zaXplLCBpbnQgX19uLAorCQkJICAgICBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLAorCQkJICAgIF9fZmdldHdzX3VubG9ja2VkX2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoImZnZXR3c191bmxvY2tlZCBjYWxsZWQgd2l0aCBiaWdnZXIgc2l6ZSB0aGFuIGxlbmd0aCAiCisJCSAgICAgICAib2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgd2NoYXJfdCAqCitmZ2V0d3NfdW5sb2NrZWQgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLCBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pCit7CisgIGlmIChfX2JvcyAoX19zKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pIHx8IF9fbiA8PSAwKQorCXJldHVybiBfX2ZnZXR3c191bmxvY2tlZF9jaGsgKF9fcywgX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpLAorCQkJCSAgICAgIF9fbiwgX19zdHJlYW0pOworCisgICAgICBpZiAoKHNpemVfdCkgX19uID4gX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX2ZnZXR3c191bmxvY2tlZF9jaGtfd2FybiAoX19zLCBfX2JvcyAoX19zKSAvIHNpemVvZiAod2NoYXJfdCksCisJCQkJCSAgIF9fbiwgX19zdHJlYW0pOworICAgIH0KKyAgcmV0dXJuIF9fZmdldHdzX3VubG9ja2VkX2FsaWFzIChfX3MsIF9fbiwgX19zdHJlYW0pOworfQorI2VuZGlmCisKKworZXh0ZXJuIHNpemVfdCBfX3djcnRvbWJfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgd2NoYXJfdCBfX3djaGFyLAorCQkJICAgICBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wLAorCQkJICAgICBzaXplX3QgX19idWZsZW4pIF9fVEhST1cgX193dXI7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djcnRvbWJfYWxpYXMsCisJCQkgICAgICAoY2hhciAqX19yZXN0cmljdCBfX3MsIHdjaGFyX3QgX193Y2hhciwKKwkJCSAgICAgICBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcyksIHdjcnRvbWIpIF9fd3VyOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHNpemVfdAorX19OVEggKHdjcnRvbWIgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCB3Y2hhcl90IF9fd2NoYXIsCisJCW1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSkKK3sKKyAgLyogV2Ugd291bGQgaGF2ZSB0byBpbmNsdWRlIDxsaW1pdHMuaD4gdG8gZ2V0IGEgZGVmaW5pdGlvbiBvZiBNQl9MRU5fTUFYLgorICAgICBCdXQgdGhpcyB3b3VsZCBvbmx5IGRpc3R1cmIgdGhlIG5hbWVzcGFjZS4gIFNvIHdlIGRlZmluZSBvdXIgb3duCisgICAgIHZlcnNpb24gaGVyZS4gICovCisjZGVmaW5lIF9fV0NIQVJfTUJfTEVOX01BWAkxNgorI2lmIGRlZmluZWQgTUJfTEVOX01BWCAmJiBNQl9MRU5fTUFYICE9IF9fV0NIQVJfTUJfTEVOX01BWAorIyBlcnJvciAiQXNzdW1lZCB2YWx1ZSBvZiBNQl9MRU5fTUFYIHdyb25nIgorI2VuZGlmCisgIGlmIChfX2JvcyAoX19zKSAhPSAoc2l6ZV90KSAtMSAmJiBfX1dDSEFSX01CX0xFTl9NQVggPiBfX2JvcyAoX19zKSkKKyAgICByZXR1cm4gX193Y3J0b21iX2NoayAoX19zLCBfX3djaGFyLCBfX3BzLCBfX2JvcyAoX19zKSk7CisgIHJldHVybiBfX3djcnRvbWJfYWxpYXMgKF9fcywgX193Y2hhciwgX19wcyk7Cit9CisKKworZXh0ZXJuIHNpemVfdCBfX21ic3J0b3djc19jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLAorCQkJICAgICAgIHNpemVfdCBfX2RzdGxlbikgX19USFJPVzsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fbWJzcnRvd2NzX2FsaWFzLAorCQkJICAgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSwKKwkJCSAgICAgIG1ic3J0b3djcyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX21ic3J0b3djc19jaGtfd2FybiwKKwkJCSAgICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcywKKwkJCSAgICAgICBzaXplX3QgX19kc3RsZW4pLCBfX21ic3J0b3djc19jaGspCisgICAgIF9fd2FybmF0dHIgKCJtYnNydG93Y3MgY2FsbGVkIHdpdGggZHN0IGJ1ZmZlciBzbWFsbGVyIHRoYW4gbGVuICIKKwkJICIqIHNpemVvZiAod2NoYXJfdCkiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzaXplX3QKK19fTlRIIChtYnNydG93Y3MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsCisJCSAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykpCit7CisgIGlmIChfX2JvcyAoX19kc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX19tYnNydG93Y3NfY2hrIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX3BzLAorCQkJCV9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbGVuID4gX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fbWJzcnRvd2NzX2Noa193YXJuIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX3BzLAorCQkJCSAgICAgX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgIH0KKyAgcmV0dXJuIF9fbWJzcnRvd2NzX2FsaWFzIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX3BzKTsKK30KKworCitleHRlcm4gc2l6ZV90IF9fd2NzcnRvbWJzX2NoayAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMsCisJCQkgICAgICAgc2l6ZV90IF9fZHN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX193Y3NydG9tYnNfYWxpYXMsCisJCQkgICAgICAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpLAorCQkJICAgICAgd2NzcnRvbWJzKTsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fd2NzcnRvbWJzX2Noa193YXJuLAorCQkJICAgICAgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLAorCQkJICAgICAgIHNpemVfdCBfX2RzdGxlbiksIF9fd2NzcnRvbWJzX2NoaykKKyAgICBfX3dhcm5hdHRyICgid2NzcnRvbWJzIGNhbGxlZCB3aXRoIGRzdCBidWZmZXIgc21hbGxlciB0aGFuIGxlbiIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNpemVfdAorX19OVEggKHdjc3J0b21icyAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwgX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywKKwkJICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSkKK3sKKyAgaWYgKF9fYm9zIChfX2RzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX3djc3J0b21ic19jaGsgKF9fZHN0LCBfX3NyYywgX19sZW4sIF9fcHMsIF9fYm9zIChfX2RzdCkpOworCisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19kc3QpKQorCXJldHVybiBfX3djc3J0b21ic19jaGtfd2FybiAoX19kc3QsIF9fc3JjLCBfX2xlbiwgX19wcywgX19ib3MgKF9fZHN0KSk7CisgICAgfQorICByZXR1cm4gX193Y3NydG9tYnNfYWxpYXMgKF9fZHN0LCBfX3NyYywgX19sZW4sIF9fcHMpOworfQorCisKKyNpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiBzaXplX3QgX19tYnNucnRvd2NzX2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCQlfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19ubWMsCisJCQkJc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcywKKwkJCQlzaXplX3QgX19kc3RsZW4pIF9fVEhST1c7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX21ic25ydG93Y3NfYWxpYXMsCisJCQkgICAgICAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19ubWMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcyksCisJCQkgICAgICBtYnNucnRvd2NzKTsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fbWJzbnJ0b3djc19jaGtfd2FybiwKKwkJCSAgICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX25tYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLAorCQkJICAgICAgIHNpemVfdCBfX2RzdGxlbiksIF9fbWJzbnJ0b3djc19jaGspCisgICAgIF9fd2FybmF0dHIgKCJtYnNucnRvd2NzIGNhbGxlZCB3aXRoIGRzdCBidWZmZXIgc21hbGxlciB0aGFuIGxlbiAiCisJCSAiKiBzaXplb2YgKHdjaGFyX3QpIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc2l6ZV90CitfX05USCAobWJzbnJ0b3djcyAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwgX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywKKwkJICAgc2l6ZV90IF9fbm1jLCBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSkKK3sKKyAgaWYgKF9fYm9zIChfX2RzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX21ic25ydG93Y3NfY2hrIChfX2RzdCwgX19zcmMsIF9fbm1jLCBfX2xlbiwgX19wcywKKwkJCQkgX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworCisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX19tYnNucnRvd2NzX2Noa193YXJuIChfX2RzdCwgX19zcmMsIF9fbm1jLCBfX2xlbiwgX19wcywKKwkJCQkgICAgICBfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX19tYnNucnRvd2NzX2FsaWFzIChfX2RzdCwgX19zcmMsIF9fbm1jLCBfX2xlbiwgX19wcyk7Cit9CisKKworZXh0ZXJuIHNpemVfdCBfX3djc25ydG9tYnNfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJCV9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkJc2l6ZV90IF9fbndjLCBzaXplX3QgX19sZW4sCisJCQkJbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMsIHNpemVfdCBfX2RzdGxlbikKKyAgICAgX19USFJPVzsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fd2NzbnJ0b21ic19hbGlhcywKKwkJCSAgICAgIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbndjLCBzaXplX3QgX19sZW4sCisJCQkgICAgICAgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpLCB3Y3NucnRvbWJzKTsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fd2NzbnJ0b21ic19jaGtfd2FybiwKKwkJCSAgICAgIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbndjLCBzaXplX3QgX19sZW4sCisJCQkgICAgICAgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMsCisJCQkgICAgICAgc2l6ZV90IF9fZHN0bGVuKSwgX193Y3NucnRvbWJzX2NoaykKKyAgICAgX193YXJuYXR0ciAoIndjc25ydG9tYnMgY2FsbGVkIHdpdGggZHN0IGJ1ZmZlciBzbWFsbGVyIHRoYW4gbGVuIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc2l6ZV90CitfX05USCAod2NzbnJ0b21icyAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwgX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywKKwkJICAgc2l6ZV90IF9fbndjLCBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSkKK3sKKyAgaWYgKF9fYm9zIChfX2RzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX3djc25ydG9tYnNfY2hrIChfX2RzdCwgX19zcmMsIF9fbndjLCBfX2xlbiwgX19wcywKKwkJCQkgX19ib3MgKF9fZHN0KSk7CisKKyAgICAgIGlmIChfX2xlbiA+IF9fYm9zIChfX2RzdCkpCisJcmV0dXJuIF9fd2NzbnJ0b21ic19jaGtfd2FybiAoX19kc3QsIF9fc3JjLCBfX253YywgX19sZW4sIF9fcHMsCisJCQkJICAgICAgX19ib3MgKF9fZHN0KSk7CisgICAgfQorICByZXR1cm4gX193Y3NucnRvbWJzX2FsaWFzIChfX2RzdCwgX19zcmMsIF9fbndjLCBfX2xlbiwgX19wcyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93b3Jkc2l6ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3dvcmRzaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2NDNiNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93b3Jkc2l6ZS5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2RlZmluZSBfX1dPUkRTSVpFCTMyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMveG9wZW5fbGltLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMveG9wZW5fbGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzNjExOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy94b3Blbl9saW0uaApAQCAtMCwwICsxLDE0NCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHk7IHVzZSA8bGltaXRzLmg+IGluc3RlYWQuCisgKi8KKworLyogQWRkaXRpb25hbCBkZWZpbml0aW9ucyBmcm9tIFgvT3BlbiBQb3J0YWJpbGl0eSBHdWlkZSwgSXNzdWUgNCwgVmVyc2lvbiAyCisgICBTeXN0ZW0gSW50ZXJmYWNlcyBhbmQgSGVhZGVycywgNC4xNiA8bGltaXRzLmg+CisKKyAgIFBsZWFzZSBub3RlIG9ubHkgdGhlIHZhbHVlcyB3aGljaCBhcmUgbm90IGdyZWF0ZXIgdGhhbiB0aGUgbWluaW11bQorICAgc3RhdGVkIGluIHRoZSBzdGFuZGFyZCBkb2N1bWVudCBhcmUgbGlzdGVkLiAgVGhlIGBzeXNjb25mJyBmdW5jdGlvbnMKKyAgIHNob3VsZCBiZSB1c2VkIHRvIG9idGFpbiB0aGUgYWN0dWFsIHZhbHVlLiAgKi8KKworI2lmbmRlZiBfWE9QRU5fTElNX0gKKyNkZWZpbmUgX1hPUEVOX0xJTV9ICTEKKworI2RlZmluZSBfX25lZWRfSU9WX01BWAorI2luY2x1ZGUgPGJpdHMvc3RkaW9fbGltLmg+CisKKy8qIFdlIGRvIG5vdCBwcm92aWRlIGZpeGVkIHZhbHVlcyBmb3IKKworICAgQVJHX01BWAlNYXhpbXVtIGxlbmd0aCBvZiBhcmd1bWVudCB0byB0aGUgYGV4ZWMnIGZ1bmN0aW9uCisJCWluY2x1ZGluZyBlbnZpcm9ubWVudCBkYXRhLgorCisgICBBVEVYSVRfTUFYCU1heGltdW0gbnVtYmVyIG9mIGZ1bmN0aW9ucyB0aGF0IG1heSBiZSByZWdpc3RlcmVkCisJCXdpdGggYGF0ZXhpdCcuCisKKyAgIENISUxEX01BWAlNYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgcHJvY2Vzc2VzIHBlciByZWFsCisJCXVzZXIgSUQuCisKKyAgIE9QRU5fTUFYCU1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRoYXQgb25lIHByb2Nlc3MgY2FuIGhhdmUgb3BlbgorCQlhdCBhbnlvbmUgdGltZS4KKworICAgUEFHRVNJWkUKKyAgIFBBR0VfU0laRQlTaXplIG9mIGJ5dGVzIG9mIGEgcGFnZS4KKworICAgUEFTU19NQVgJTWF4aW11bSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4gYSBwYXNzd29yZC4KKworICAgV2Ugb25seSBwcm92aWRlIGEgZml4ZWQgbGltaXQgZm9yCisKKyAgIElPVl9NQVgJTWF4aW11bSBudW1iZXIgb2YgYGlvdmVjJyBzdHJ1Y3R1cmVzIHRoYXQgb25lIHByb2Nlc3MgaGFzCisJCWF2YWlsYWJsZSBmb3IgdXNlIHdpdGggYHJlYWR2JyBvciB3cml0ZXYnLgorCisgICBpZiB0aGlzIGlzIGluZGVlZCBmaXhlZCBieSB0aGUgdW5kZXJseWluZyBzeXN0ZW0uCisqLworCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGBpb3ZlYycgc3RydWN0dXJlcyB0aGF0IG9uZSBwcm9jZXNzIGhhcyBhdmFpbGFibGUKKyAgIGZvciB1c2Ugd2l0aCBgcmVhZHYnIG9yIHdyaXRldicuICAqLworI2RlZmluZQlfWE9QRU5fSU9WX01BWAlfUE9TSVhfVUlPX01BWElPVgorCisKKy8qIE1heGltdW0gdmFsdWUgb2YgYGRpZ2l0JyBpbiBjYWxscyB0byB0aGUgYHByaW50ZicgYW5kIGBzY2FuZicKKyAgIGZ1bmN0aW9ucy4gIFdlIGhhdmUgbm8gbGltaXQsIHNvIHJldHVybiBhIHJlYXNvbmFibGUgdmFsdWUuICAqLworI2RlZmluZSBOTF9BUkdNQVgJX1BPU0lYX0FSR19NQVgKKworLyogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBgTEFORycgbmFtZS4gIFdlIGhhdmUgbm8gbGltaXQuICAqLworI2RlZmluZSBOTF9MQU5HTUFYCV9QT1NJWDJfTElORV9NQVgKKworLyogTWF4aW11bSBtZXNzYWdlIG51bWJlci4gIFdlIGhhdmUgbm8gbGltaXQuICAqLworI2RlZmluZSBOTF9NU0dNQVgJSU5UX01BWAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyBpbiBOLXRvLTEgY29sbGF0aW9uIG1hcHBpbmcuICBXZSBoYXZlIG5vCisgICBsaW1pdC4gICovCisjZGVmaW5lIE5MX05NQVgJCUlOVF9NQVgKKworLyogTWF4aW11bSBzZXQgbnVtYmVyLiAgV2UgaGF2ZSBubyBsaW1pdC4gICovCisjZGVmaW5lIE5MX1NFVE1BWAlJTlRfTUFYCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGEgbWVzc2FnZS4gIFdlIGhhdmUgbm8gbGltaXQuICAqLworI2RlZmluZSBOTF9URVhUTUFYCUlOVF9NQVgKKworLyogRGVmYXVsdCBwcm9jZXNzIHByaW9yaXR5LiAgKi8KKyNkZWZpbmUgTlpFUk8JCTIwCisKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSB3b3JkIG9mIHR5cGUgYGludCcuICAqLworI2lmZGVmIElOVF9NQVgKKyMgaWYgSU5UX01BWCA9PSAzMjc2NworIyAgZGVmaW5lIFdPUkRfQklUCTE2CisjIGVsc2UKKyMgIGlmIElOVF9NQVggPT0gMjE0NzQ4MzY0NworIyAgIGRlZmluZSBXT1JEX0JJVAkzMgorIyAgZWxzZQorLyogU2FmZSBhc3N1bXB0aW9uLiAgKi8KKyMgICBkZWZpbmUgV09SRF9CSVQJNjQKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fSU5UX01BWF9fCisjIGlmIF9fSU5UX01BWF9fID09IDMyNzY3CisjICBkZWZpbmUgV09SRF9CSVQJMTYKKyMgZWxzZQorIyAgaWYgX19JTlRfTUFYX18gPT0gMjE0NzQ4MzY0NworIyAgIGRlZmluZSBXT1JEX0JJVAkzMgorIyAgZWxzZQorLyogU2FmZSBhc3N1bXB0aW9uLiAgKi8KKyMgICBkZWZpbmUgV09SRF9CSVQJNjQKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgV09SRF9CSVQJMzIKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIHdvcmQgb2YgdHlwZSBgbG9uZyBpbnQnLiAgKi8KKyNpZmRlZiBMT05HX01BWAorIyBpZiBMT05HX01BWCA9PSAyMTQ3NDgzNjQ3CisjICBkZWZpbmUgTE9OR19CSVQJMzIKKyMgZWxzZQorLyogU2FmZSBhc3N1bXB0aW9uLiAgKi8KKyMgIGRlZmluZSBMT05HX0JJVAk2NAorIyBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX0xPTkdfTUFYX18KKyMgaWYgX19MT05HX01BWF9fID09IDIxNDc0ODM2NDcKKyMgIGRlZmluZSBMT05HX0JJVAkzMgorIyBlbHNlCisvKiBTYWZlIGFzc3VtcHRpb24uICAqLworIyAgZGVmaW5lIExPTkdfQklUCTY0CisjIGVuZGlmCisjZWxzZQorIyBpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBMT05HX0JJVAk2NAorIyBlbHNlCisjICBkZWZpbmUgTE9OR19CSVQJMzIKKyMgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogYml0cy94b3Blbl9saW0uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3h0aXR5cGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMveHRpdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjFiZmIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3h0aXR5cGVzLmgKQEAgLTAsMCArMSwzNCBAQAorLyogYml0cy94dGl0eXBlcy5oIC0tIERlZmluZSBzb21lIHR5cGVzIHVzZWQgYnkgPGJpdHMvc3Ryb3B0cy5oPi4gIEdlbmVyaWMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NUUk9QVFNfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy94dGl0eXBlcy5oPiBkaXJlY3RseTsgdXNlIDxzdHJvcHRzLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX0JJVFNfWFRJVFlQRVNfSAorI2RlZmluZSBfQklUU19YVElUWVBFU19ICTEKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogVGhpcyB0eXBlIGlzIHVzZWQgYnkgc29tZSBzdHJ1Y3RzIGluIDxiaXRzL3N0cm9wdHMuaD4uICAqLwordHlwZWRlZiBfX1NMT05HV09SRF9UWVBFIF9fdF9zY2FsYXJfdDsKK3R5cGVkZWYgX19VTE9OR1dPUkRfVFlQRSBfX3RfdXNjYWxhcl90OworCisKKyNlbmRpZiAvKiBiaXRzL3h0aXR5cGVzLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZnB1X2NvbnRyb2wuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZnB1X2NvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTliNTdjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9mcHVfY29udHJvbC5oCkBAIC0wLDAgKzEsMTAyIEBACisvKiBGUFUgY29udHJvbCB3b3JkIGJpdHMuICBpMzg3IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTMsMTk5NS0xOTk4LDIwMDAsMjAwMSwyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBPbGFmIEZsZWJiZS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0ZQVV9DT05UUk9MX0gKKyNkZWZpbmUgX0ZQVV9DT05UUk9MX0gJMQorCisvKiBIZXJlIGlzIHRoZSBkaXJ0eSBwYXJ0LiBTZXQgdXAgeW91ciAzODcgdGhyb3VnaCB0aGUgY29udHJvbCB3b3JkCisgKiAoY3cpIHJlZ2lzdGVyLgorICoKKyAqICAgICAxNS0xMyAgICAxMiAgMTEtMTAgIDktOCAgICAgNy02ICAgICA1ICAgIDQgICAgMyAgICAyICAgIDEgICAgMAorICogfCByZXNlcnZlZCB8IElDIHwgUkMgIHwgUEMgfCByZXNlcnZlZCB8IFBNIHwgVU0gfCBPTSB8IFpNIHwgRE0gfCBJTQorICoKKyAqIElNOiBJbnZhbGlkIG9wZXJhdGlvbiBtYXNrCisgKiBETTogRGVub3JtYWxpemVkIG9wZXJhbmQgbWFzaworICogWk06IFplcm8tZGl2aWRlIG1hc2sKKyAqIE9NOiBPdmVyZmxvdyBtYXNrCisgKiBVTTogVW5kZXJmbG93IG1hc2sKKyAqIFBNOiBQcmVjaXNpb24gKGluZXhhY3QgcmVzdWx0KSBtYXNrCisgKgorICogTWFzayBiaXQgaXMgMSBtZWFucyBubyBpbnRlcnJ1cHQuCisgKgorICogUEM6IFByZWNpc2lvbiBjb250cm9sCisgKiAxMSAtIHJvdW5kIHRvIGV4dGVuZGVkIHByZWNpc2lvbgorICogMTAgLSByb3VuZCB0byBkb3VibGUgcHJlY2lzaW9uCisgKiAwMCAtIHJvdW5kIHRvIHNpbmdsZSBwcmVjaXNpb24KKyAqCisgKiBSQzogUm91bmRpbmcgY29udHJvbAorICogMDAgLSByb3VuZGluZyB0byBuZWFyZXN0CisgKiAwMSAtIHJvdW5kaW5nIGRvd24gKHRvd2FyZCAtIGluZmluaXR5KQorICogMTAgLSByb3VuZGluZyB1cCAodG93YXJkICsgaW5maW5pdHkpCisgKiAxMSAtIHJvdW5kaW5nIHRvd2FyZCB6ZXJvCisgKgorICogSUM6IEluZmluaXR5IGNvbnRyb2wKKyAqIFRoYXQgaXMgZm9yIDgwODcgYW5kIDgwMjg3IG9ubHkuCisgKgorICogVGhlIGhhcmR3YXJlIGRlZmF1bHQgaXMgMHgwMzdmIHdoaWNoIHdlIHVzZS4KKyAqLworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogbWFza2luZyBvZiBpbnRlcnJ1cHRzICovCisjZGVmaW5lIF9GUFVfTUFTS19JTSAgMHgwMQorI2RlZmluZSBfRlBVX01BU0tfRE0gIDB4MDIKKyNkZWZpbmUgX0ZQVV9NQVNLX1pNICAweDA0CisjZGVmaW5lIF9GUFVfTUFTS19PTSAgMHgwOAorI2RlZmluZSBfRlBVX01BU0tfVU0gIDB4MTAKKyNkZWZpbmUgX0ZQVV9NQVNLX1BNICAweDIwCisKKy8qIHByZWNpc2lvbiBjb250cm9sICovCisjZGVmaW5lIF9GUFVfRVhURU5ERUQgMHgzMDAJLyogbGlibSByZXF1aXJlcyBkb3VibGUgZXh0ZW5kZWQgcHJlY2lzaW9uLiAgKi8KKyNkZWZpbmUgX0ZQVV9ET1VCTEUgICAweDIwMAorI2RlZmluZSBfRlBVX1NJTkdMRSAgIDB4MAorCisvKiByb3VuZGluZyBjb250cm9sICovCisjZGVmaW5lIF9GUFVfUkNfTkVBUkVTVCAweDAgICAgLyogUkVDT01NRU5ERUQgKi8KKyNkZWZpbmUgX0ZQVV9SQ19ET1dOICAgIDB4NDAwCisjZGVmaW5lIF9GUFVfUkNfVVAgICAgICAweDgwMAorI2RlZmluZSBfRlBVX1JDX1pFUk8gICAgMHhDMDAKKworI2RlZmluZSBfRlBVX1JFU0VSVkVEIDB4RjBDMCAgLyogUmVzZXJ2ZWQgYml0cyBpbiBjdyAqLworCisKKy8qIFRoZSBmZGxpYm0gY29kZSByZXF1aXJlcyBzdHJpY3QgSUVFRSBkb3VibGUgcHJlY2lzaW9uIGFyaXRobWV0aWMsCisgICBhbmQgbm8gaW50ZXJydXB0cyBmb3IgZXhjZXB0aW9ucywgcm91bmRpbmcgdG8gbmVhcmVzdC4gICovCisKKyNkZWZpbmUgX0ZQVV9ERUZBVUxUICAweDAzN2YKKworLyogSUVFRTogIHNhbWUgYXMgYWJvdmUuICAqLworI2RlZmluZSBfRlBVX0lFRUUgICAgIDB4MDM3ZgorCisvKiBUeXBlIG9mIHRoZSBjb250cm9sIHdvcmQuICAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZnB1X2NvbnRyb2xfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fSElfXykpKTsKKworLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgdGhlIGhhcmR3YXJlIGNvbnRyb2wgd29yZC4KKworICAgTm90ZSB0aGF0IHRoZSB1c2Ugb2YgdGhlc2UgbWFjcm9zIGlzIG5vIHN1ZmZpY2llbnQgYW55bW9yZSB3aXRoCisgICByZWNlbnQgaGFyZHdhcmUuICBTb21lIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgYXJlIGV4ZWN1dGVkIGluCisgICB0aGUgU1NFL1NTRTIgZW5naW5lcyB3aGljaCBoYXZlIHRoZWlyIG93biBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIuICAqLworI2RlZmluZSBfRlBVX0dFVENXKGN3KSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZuc3RjdyAlMCIgOiAiPW0iICgqJmN3KSkKKyNkZWZpbmUgX0ZQVV9TRVRDVyhjdykgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJmbGRjdyAlMCIgOiA6ICJtIiAoKiZjdykpCisKKy8qIERlZmF1bHQgY29udHJvbCB3b3JkIHNldCBhdCBzdGFydHVwLiAgKi8KK2V4dGVybiBmcHVfY29udHJvbF90IF9fZnB1X2NvbnRyb2w7CisKKyNlbmRpZgkvKiBmcHVfY29udHJvbC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2dudS9saWItbmFtZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZ251L2xpYi1uYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NzJmMjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2dudS9saWItbmFtZXMuaApAQCAtMCwwICsxLDYxIEBACisvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuCisgICBJdCBkZWZpbmVzIG1hY3JvcyB0byBhbGxvdyB1c2VyIHByb2dyYW0gdG8gZmluZCB0aGUgc2hhcmVkCisgICBsaWJyYXJ5IGZpbGVzIHdoaWNoIGNvbWUgYXMgcGFydCBvZiBHTlUgbGliYy4gICovCisjaWZuZGVmIF9fR05VX0xJQl9OQU1FU19ICisjZGVmaW5lIF9fR05VX0xJQl9OQU1FU19ICTEKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2lmIF9fV09SRFNJWkUgPT0gMzIKKyMgZGVmaW5lIExEX0xJTlVYX1NPICAgICAgICAgICAgICAgICAgICAibGQtbGludXguc28uMiIKKyMgZGVmaW5lIExEX1NPICAgICAgICAgICAgICAgICAgICAgICAgICAibGQtbGludXguc28uMiIKKyMgZGVmaW5lIExJQkFOTF9TTyAgICAgICAgICAgICAgICAgICAgICAibGliYW5sLnNvLjEiCisjIGRlZmluZSBMSUJCUk9LRU5MT0NBTEVfU08gICAgICAgICAgICAgImxpYkJyb2tlbkxvY2FsZS5zby4xIgorIyBkZWZpbmUgTElCQ0lETl9TTyAgICAgICAgICAgICAgICAgICAgICJsaWJjaWRuLnNvLjEiCisjIGRlZmluZSBMSUJDUllQVF9TTyAgICAgICAgICAgICAgICAgICAgImxpYmNyeXB0LnNvLjEiCisjIGRlZmluZSBMSUJDX1NPICAgICAgICAgICAgICAgICAgICAgICAgImxpYmMuc28uNiIKKyMgZGVmaW5lIExJQkRMX1NPICAgICAgICAgICAgICAgICAgICAgICAibGliZGwuc28uMiIKKyMgZGVmaW5lIExJQk1fU08gICAgICAgICAgICAgICAgICAgICAgICAibGlibS5zby42IgorIyBkZWZpbmUgTElCTlNMX1NPICAgICAgICAgICAgICAgICAgICAgICJsaWJuc2wuc28uMSIKKyMgZGVmaW5lIExJQk5TU19DT01QQVRfU08gICAgICAgICAgICAgICAibGlibnNzX2NvbXBhdC5zby4yIgorIyBkZWZpbmUgTElCTlNTX0RCX1NPICAgICAgICAgICAgICAgICAgICJsaWJuc3NfZGIuc28uMiIKKyMgZGVmaW5lIExJQk5TU19ETlNfU08gICAgICAgICAgICAgICAgICAibGlibnNzX2Rucy5zby4yIgorIyBkZWZpbmUgTElCTlNTX0ZJTEVTX1NPICAgICAgICAgICAgICAgICJsaWJuc3NfZmlsZXMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19IRVNJT0RfU08gICAgICAgICAgICAgICAibGlibnNzX2hlc2lvZC5zby4yIgorIyBkZWZpbmUgTElCTlNTX0xEQVBfU08gICAgICAgICAgICAgICAgICJsaWJuc3NfbGRhcC5zby4yIgorIyBkZWZpbmUgTElCTlNTX05JU1BMVVNfU08gICAgICAgICAgICAgICJsaWJuc3NfbmlzcGx1cy5zby4yIgorIyBkZWZpbmUgTElCTlNTX05JU19TTyAgICAgICAgICAgICAgICAgICJsaWJuc3NfbmlzLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfVEVTVDFfU08gICAgICAgICAgICAgICAgImxpYm5zc190ZXN0MS5zby4yIgorIyBkZWZpbmUgTElCUFRIUkVBRF9TTyAgICAgICAgICAgICAgICAgICJsaWJwdGhyZWFkLnNvLjAiCisjIGRlZmluZSBMSUJSRVNPTFZfU08gICAgICAgICAgICAgICAgICAgImxpYnJlc29sdi5zby4yIgorIyBkZWZpbmUgTElCUlRfU08gICAgICAgICAgICAgICAgICAgICAgICJsaWJydC5zby4xIgorIyBkZWZpbmUgTElCVEhSRUFEX0RCX1NPICAgICAgICAgICAgICAgICJsaWJ0aHJlYWRfZGIuc28uMSIKKyMgZGVmaW5lIExJQlVUSUxfU08gICAgICAgICAgICAgICAgICAgICAibGlidXRpbC5zby4xIgorI2Vsc2UKKyMgZGVmaW5lIExEX0xJTlVYX1g4Nl82NF9TTyAgICAgICAgICAgICAibGQtbGludXgteDg2LTY0LnNvLjIiCisjIGRlZmluZSBMRF9TTyAgICAgICAgICAgICAgICAgICAgICAgICAgImxkLWxpbnV4LXg4Ni02NC5zby4yIgorIyBkZWZpbmUgTElCQU5MX1NPICAgICAgICAgICAgICAgICAgICAgICJsaWJhbmwuc28uMSIKKyMgZGVmaW5lIExJQkJST0tFTkxPQ0FMRV9TTyAgICAgICAgICAgICAibGliQnJva2VuTG9jYWxlLnNvLjEiCisjIGRlZmluZSBMSUJDSUROX1NPICAgICAgICAgICAgICAgICAgICAgImxpYmNpZG4uc28uMSIKKyMgZGVmaW5lIExJQkNSWVBUX1NPICAgICAgICAgICAgICAgICAgICAibGliY3J5cHQuc28uMSIKKyMgZGVmaW5lIExJQkNfU08gICAgICAgICAgICAgICAgICAgICAgICAibGliYy5zby42IgorIyBkZWZpbmUgTElCRExfU08gICAgICAgICAgICAgICAgICAgICAgICJsaWJkbC5zby4yIgorIyBkZWZpbmUgTElCTV9TTyAgICAgICAgICAgICAgICAgICAgICAgICJsaWJtLnNvLjYiCisjIGRlZmluZSBMSUJOU0xfU08gICAgICAgICAgICAgICAgICAgICAgImxpYm5zbC5zby4xIgorIyBkZWZpbmUgTElCTlNTX0NPTVBBVF9TTyAgICAgICAgICAgICAgICJsaWJuc3NfY29tcGF0LnNvLjIiCisjIGRlZmluZSBMSUJOU1NfREJfU08gICAgICAgICAgICAgICAgICAgImxpYm5zc19kYi5zby4yIgorIyBkZWZpbmUgTElCTlNTX0ROU19TTyAgICAgICAgICAgICAgICAgICJsaWJuc3NfZG5zLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfRklMRVNfU08gICAgICAgICAgICAgICAgImxpYm5zc19maWxlcy5zby4yIgorIyBkZWZpbmUgTElCTlNTX0hFU0lPRF9TTyAgICAgICAgICAgICAgICJsaWJuc3NfaGVzaW9kLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfTERBUF9TTyAgICAgICAgICAgICAgICAgImxpYm5zc19sZGFwLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfTklTUExVU19TTyAgICAgICAgICAgICAgImxpYm5zc19uaXNwbHVzLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfTklTX1NPICAgICAgICAgICAgICAgICAgImxpYm5zc19uaXMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19URVNUMV9TTyAgICAgICAgICAgICAgICAibGlibnNzX3Rlc3QxLnNvLjIiCisjIGRlZmluZSBMSUJQVEhSRUFEX1NPICAgICAgICAgICAgICAgICAgImxpYnB0aHJlYWQuc28uMCIKKyMgZGVmaW5lIExJQlJFU09MVl9TTyAgICAgICAgICAgICAgICAgICAibGlicmVzb2x2LnNvLjIiCisjIGRlZmluZSBMSUJSVF9TTyAgICAgICAgICAgICAgICAgICAgICAgImxpYnJ0LnNvLjEiCisjIGRlZmluZSBMSUJUSFJFQURfREJfU08gICAgICAgICAgICAgICAgImxpYnRocmVhZF9kYi5zby4xIgorIyBkZWZpbmUgTElCVVRJTF9TTyAgICAgICAgICAgICAgICAgICAgICJsaWJ1dGlsLnNvLjEiCisjZW5kaWYKKworI2VuZGlmCS8qIGdudS9saWItbmFtZXMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9nbnUvbGliYy12ZXJzaW9uLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2dudS9saWJjLXZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzA3MWZkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9nbnUvbGliYy12ZXJzaW9uLmgKQEAgLTAsMCArMSwzNSBAQAorLyogSW50ZXJmYWNlIHRvIEdOVSBsaWJjIHNwZWNpZmljIGZ1bmN0aW9ucyBmb3IgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfR05VX0xJQkNfVkVSU0lPTl9ICisjZGVmaW5lCV9HTlVfTElCQ19WRVJTSU9OX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gc3RyaW5nIGRlc2NyaWJpbmcgcmVsZWFzZSBzdGF0dXMgb2YgY3VycmVudGx5IHJ1bm5pbmcgR05VIGxpYmMuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmdudV9nZXRfbGliY19yZWxlYXNlICh2b2lkKSBfX1RIUk9XOworCisvKiBSZXR1cm4gc3RyaW5nIGRlc2NyaWJpbmcgdmVyc2lvbiBvZiBjdXJyZW50bHkgcnVubmluZyBHTlUgbGliYy4gICovCitleHRlcm4gY29uc3QgY2hhciAqZ251X2dldF9saWJjX3ZlcnNpb24gKHZvaWQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBnbnUvbGliYy12ZXJzaW9uLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZ251L29wdGlvbi1ncm91cHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZ251L29wdGlvbi1ncm91cHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWQ2ZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9nbnUvb3B0aW9uLWdyb3Vwcy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBzY3JpcHRzL29wdGlvbi1ncm91cHMuYXdrCisgICBpbiB0aGUgRUdMSUJDIHNvdXJjZSB0cmVlLgorCisgICBJdCBkZWZpbmVzIG1hY3JvcyB0aGF0IGluZGljYXRlIHdoaWNoIEVHTElCQyBvcHRpb24gZ3JvdXBzIHdlcmUKKyAgIGNvbmZpZ3VyZWQgaW4gJ29wdGlvbi1ncm91cHMuY29uZmlnJyB3aGVuIHRoaXMgQyBsaWJyYXJ5IHdhcworICAgYnVpbHQuICBGb3IgZWFjaCBvcHRpb24gZ3JvdXAgbmFtZWQgT1BUSU9OX2ZvbywgaXQgI2RlZmluZXMKKyAgIF9fT1BUSU9OX2ZvbyB0byBiZSAxIGlmIHRoZSBncm91cCBpcyBlbmFibGVkLCBvciBsZWF2ZXMgdGhhdAorICAgc3ltYm9sIHVuZGVmaW5lZCBpZiB0aGUgZ3JvdXAgaXMgZGlzYWJsZWQuICAqLworCisjaWZuZGVmIF9fR05VX09QVElPTl9HUk9VUFNfSAorI2RlZmluZSBfX0dOVV9PUFRJT05fR1JPVVBTX0gKKworI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQURWQU5DRURfSU5FVDYgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQkFDS1RSQUNFIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQlNEIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0NBVEdFVFMgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQ0hBUlNFVFMgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQ1JZUFQgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQ1JZUFRfVUZDIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0NYWF9URVNUUyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19EQl9BTElBU0VTIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0VOVlogMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfRkNWVCAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19GTVRNU0cgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfRlNUQUIgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfRlRSQVZFUlNFIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0dFVExPR0lOIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0lETiAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19JTkVUIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0lORVRfQU5MIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0xJQk0gMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfTElCTV9CSUcgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfTE9DQUxFUyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19MT0NBTEVfQ09ERSAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19NRU1VU0FHRSAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19OSVMgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfTlNTV0lUQ0ggMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfUkNNRCAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19SVExEX0RFQlVHIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX1NQQVdOIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX1NUUkVBTVMgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfU1VOUlBDIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX1VUTVAgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfVVRNUFggMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfV09SREVYUCAxCisjZGVmaW5lIF9fT1BUSU9OX1BPU0lYX0NfTEFOR19XSURFX0NIQVIgMQorI2RlZmluZSBfX09QVElPTl9QT1NJWF9SRUdFWFAgMQorI2RlZmluZSBfX09QVElPTl9QT1NJWF9SRUdFWFBfR0xJQkMgMQorI2RlZmluZSBfX09QVElPTl9QT1NJWF9XSURFX0NIQVJfREVWSUNFX0lPIDEKKworI2VuZGlmIC8qIF9fR05VX09QVElPTl9HUk9VUFNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9nbnUvc3R1YnMtMzIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZ251L3N0dWJzLTMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4NjliYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZ251L3N0dWJzLTMyLmgKQEAgLTAsMCArMSwyMyBAQAorLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLgorICAgSXQgZGVmaW5lcyBhIHN5bWJvbCBgX19zdHViX0ZVTkNUSU9OJyBmb3IgZWFjaCBmdW5jdGlvbgorICAgaW4gdGhlIEMgbGlicmFyeSB3aGljaCBpcyBhIHN0dWIsIG1lYW5pbmcgaXQgd2lsbCBmYWlsCisgICBldmVyeSB0aW1lIGNhbGxlZCwgdXN1YWxseSBzZXR0aW5nIGVycm5vIHRvIEVOT1NZUy4gICovCisKKyNpZmRlZiBfTElCQworIyBlcnJvciBBcHBsaWNhdGlvbnMgbWF5IG5vdCBkZWZpbmUgdGhlIG1hY3JvIF9MSUJDCisjZW5kaWYKKworI2RlZmluZSBfX3N0dWJfX19rZXJuZWxfY29zbAorI2RlZmluZSBfX3N0dWJfX19rZXJuZWxfc2lubAorI2RlZmluZSBfX3N0dWJfX19rZXJuZWxfdGFubAorI2RlZmluZSBfX3N0dWJfY2hmbGFncworI2RlZmluZSBfX3N0dWJfZmF0dGFjaAorI2RlZmluZSBfX3N0dWJfZmNoZmxhZ3MKKyNkZWZpbmUgX19zdHViX2ZkZXRhY2gKKyNkZWZpbmUgX19zdHViX2d0dHkKKyNkZWZpbmUgX19zdHViX2xjaG1vZAorI2RlZmluZSBfX3N0dWJfcmV2b2tlCisjZGVmaW5lIF9fc3R1Yl9zZXRsb2dpbgorI2RlZmluZSBfX3N0dWJfc2lncmV0dXJuCisjZGVmaW5lIF9fc3R1Yl9zc3RrCisjZGVmaW5lIF9fc3R1Yl9zdHR5CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2dudS9zdHVicy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9nbnUvc3R1YnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzA4NmJkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9nbnUvc3R1YnMuaApAQCAtMCwwICsxLDEyIEBACisvKiBUaGlzIGZpbGUgc2VsZWN0cyB0aGUgcmlnaHQgZ2VuZXJhdGVkIGZpbGUgb2YgYF9fc3R1Yl9GVU5DVElPTicgbWFjcm9zCisgICBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlIGJlaW5nIGNvbXBpbGVkIGZvci4gICovCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKyNpZiBfX1dPUkRTSVpFID09IDMyCisjIGluY2x1ZGUgPGdudS9zdHVicy0zMi5oPgorI2VsaWYgX19XT1JEU0laRSA9PSA2NAorIyBpbmNsdWRlIDxnbnUvc3R1YnMtNjQuaD4KKyNlbHNlCisjIGVycm9yICJ1bmV4cGVjdGVkIHZhbHVlIGZvciBfX1dPUkRTSVpFIG1hY3JvIgorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9hY2N0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9hY2N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdjNjNlYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2FjY3QuaApAQCAtMCwwICsxLDEwOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfQUNDVF9ICisjZGVmaW5lIF9TWVNfQUNDVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNkZWZpbmUJX19uZWVkX3RpbWVfdAorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjZGVmaW5lIEFDQ1RfQ09NTSAxNgorCisvKgorICBjb21wX3QgaXMgYSAxNi1iaXQgImZsb2F0aW5nIiBwb2ludCBudW1iZXIgd2l0aCBhIDMtYml0IGJhc2UgOAorICBleHBvbmVudCBhbmQgYSAxMy1iaXQgZnJhY3Rpb24uIFNlZSBsaW51eC9rZXJuZWwvYWNjdC5jIGZvciB0aGUKKyAgc3BlY2lmaWMgZW5jb2Rpbmcgc3lzdGVtIHVzZWQuCisqLworCit0eXBlZGVmIHVfaW50MTZfdCBjb21wX3Q7CisKK3N0cnVjdCBhY2N0Cit7CisgIGNoYXIgYWNfZmxhZzsJCQkvKiBGbGFncy4gICovCisgIHVfaW50MTZfdCBhY191aWQ7CQkvKiBSZWFsIHVzZXIgSUQuICAqLworICB1X2ludDE2X3QgYWNfZ2lkOwkJLyogUmVhbCBncm91cCBJRC4gICovCisgIHVfaW50MTZfdCBhY190dHk7CQkvKiBDb250cm9sbGluZyB0ZXJtaW5hbC4gICovCisgIHVfaW50MzJfdCBhY19idGltZTsJCS8qIEJlZ2lubmluZyB0aW1lLiAgKi8KKyAgY29tcF90IGFjX3V0aW1lOwkJLyogVXNlciB0aW1lLiAgKi8KKyAgY29tcF90IGFjX3N0aW1lOwkJLyogU3lzdGVtIHRpbWUuICAqLworICBjb21wX3QgYWNfZXRpbWU7CQkvKiBFbGFwc2VkIHRpbWUuICAqLworICBjb21wX3QgYWNfbWVtOwkJLyogQXZlcmFnZSBtZW1vcnkgdXNhZ2UuICAqLworICBjb21wX3QgYWNfaW87CQkJLyogQ2hhcnMgdHJhbnNmZXJyZWQuICAqLworICBjb21wX3QgYWNfcnc7CQkJLyogQmxvY2tzIHJlYWQgb3Igd3JpdHRlbi4gICovCisgIGNvbXBfdCBhY19taW5mbHQ7CQkvKiBNaW5vciBwYWdlZmF1bHRzLiAgKi8KKyAgY29tcF90IGFjX21hamZsdDsJCS8qIE1ham9yIHBhZ2VmYXVsdHMuICAqLworICBjb21wX3QgYWNfc3dhcHM7CQkvKiBOdW1iZXIgb2Ygc3dhcHMuICAqLworICB1X2ludDMyX3QgYWNfZXhpdGNvZGU7CS8qIFByb2Nlc3MgZXhpdGNvZGUuICAqLworICBjaGFyIGFjX2NvbW1bQUNDVF9DT01NKzFdOwkvKiBDb21tYW5kIG5hbWUuICAqLworICBjaGFyIGFjX3BhZFsxMF07CQkvKiBQYWRkaW5nIGJ5dGVzLiAgKi8KK307CisKKworc3RydWN0IGFjY3RfdjMKK3sKKyAgY2hhciBhY19mbGFnOwkJCS8qIEZsYWdzICovCisgIGNoYXIgYWNfdmVyc2lvbjsJCS8qIEFsd2F5cyBzZXQgdG8gQUNDVF9WRVJTSU9OICovCisgIHVfaW50MTZfdCBhY190dHk7CQkvKiBDb250cm9sIFRlcm1pbmFsICovCisgIHVfaW50MzJfdCBhY19leGl0Y29kZTsJLyogRXhpdGNvZGUgKi8KKyAgdV9pbnQzMl90IGFjX3VpZDsJCS8qIFJlYWwgVXNlciBJRCAqLworICB1X2ludDMyX3QgYWNfZ2lkOwkJLyogUmVhbCBHcm91cCBJRCAqLworICB1X2ludDMyX3QgYWNfcGlkOwkJLyogUHJvY2VzcyBJRCAqLworICB1X2ludDMyX3QgYWNfcHBpZDsJCS8qIFBhcmVudCBQcm9jZXNzIElEICovCisgIHVfaW50MzJfdCBhY19idGltZTsJCS8qIFByb2Nlc3MgQ3JlYXRpb24gVGltZSAqLworICBmbG9hdCBhY19ldGltZTsJCS8qIEVsYXBzZWQgVGltZSAqLworICBjb21wX3QgYWNfdXRpbWU7CQkvKiBVc2VyIFRpbWUgKi8KKyAgY29tcF90IGFjX3N0aW1lOwkJLyogU3lzdGVtIFRpbWUgKi8KKyAgY29tcF90IGFjX21lbTsJCS8qIEF2ZXJhZ2UgTWVtb3J5IFVzYWdlICovCisgIGNvbXBfdCBhY19pbzsJCQkvKiBDaGFycyBUcmFuc2ZlcnJlZCAqLworICBjb21wX3QgYWNfcnc7CQkJLyogQmxvY2tzIFJlYWQgb3IgV3JpdHRlbiAqLworICBjb21wX3QgYWNfbWluZmx0OwkJLyogTWlub3IgUGFnZWZhdWx0cyAqLworICBjb21wX3QgYWNfbWFqZmx0OwkJLyogTWFqb3IgUGFnZWZhdWx0cyAqLworICBjb21wX3QgYWNfc3dhcHM7CQkvKiBOdW1iZXIgb2YgU3dhcHMgKi8KKyAgY2hhciBhY19jb21tW0FDQ1RfQ09NTV07CS8qIENvbW1hbmQgTmFtZSAqLworfTsKKworCitlbnVtCisgIHsKKyAgICBBRk9SSyA9IDB4MDEsCQkvKiBIYXMgZXhlY3V0ZWQgZm9yaywgYnV0IG5vIGV4ZWMuICAqLworICAgIEFTVSA9IDB4MDIsCQkJLyogVXNlZCBzdXBlci11c2VyIHByaXZpbGVnZXMuICAqLworICAgIEFDT1JFID0gMHgwOCwJCS8qIER1bXBlZCBjb3JlLiAgKi8KKyAgICBBWFNJRyA9IDB4MTAJCS8qIEtpbGxlZCBieSBhIHNpZ25hbC4gICovCisgIH07CisKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjIGRlZmluZSBBQ0NUX0JZVEVPUkRFUiAweDgwCS8qIEFjY291bnRpbmcgZmlsZSBpcyBiaWcgZW5kaWFuLiAgKi8KKyNlbHNlCisjIGRlZmluZSBBQ0NUX0JZVEVPUkRFUiAweDAwCS8qIEFjY291bnRpbmcgZmlsZSBpcyBsaXR0bGUgZW5kaWFuLiAgKi8KKyNlbmRpZgorCisjZGVmaW5lIEFIWiAgICAgMTAwCisKKworLyogU3dpdGNoIHByb2Nlc3MgYWNjb3VudGluZyBvbiBhbmQgb2ZmLiAgKi8KK2V4dGVybiBpbnQgYWNjdCAoX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL2FjY3QuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvYml0eXBlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvYml0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTg2MGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9iaXR5cGVzLmgKQEAgLTAsMCArMSwzIEBACisvKiBUaGUgR05VIDxzeXMvdHlwZXMuaD4gZGVmaW5lcyBhbGwgdGhlIG5lY2Vzc2FyeSB0eXBlcy4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2NkZWZzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9jZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NTZlODcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9jZGVmcy5oCkBAIC0wLDAgKzEsNDEyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTItMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19DREVGU19ICisjZGVmaW5lCV9TWVNfQ0RFRlNfSAkxCisKKy8qIFdlIGFyZSBhbG1vc3QgYWx3YXlzIGluY2x1ZGVkIGZyb20gZmVhdHVyZXMuaC4gKi8KKyNpZm5kZWYgX0ZFQVRVUkVTX0gKKyMgaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNlbmRpZgorCisvKiBUaGUgR05VIGxpYmMgZG9lcyBub3Qgc3VwcG9ydCBhbnkgSyZSIGNvbXBpbGVycyBvciB0aGUgdHJhZGl0aW9uYWwgbW9kZQorICAgb2YgSVNPIEMgY29tcGlsZXJzIGFueW1vcmUuICBDaGVjayBmb3Igc29tZSBvZiB0aGUgY29tYmluYXRpb25zIG5vdAorICAgYW55bW9yZSBzdXBwb3J0ZWQuICAqLworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgIWRlZmluZWQgX19TVERDX18KKyMgZXJyb3IgIllvdSBuZWVkIGEgSVNPIEMgY29uZm9ybWluZyBjb21waWxlciB0byB1c2UgdGhlIGdsaWJjIGhlYWRlcnMiCisjZW5kaWYKKworLyogU29tZSB1c2VyIGhlYWRlciBmaWxlIG1pZ2h0IGhhdmUgZGVmaW5lZCB0aGlzIGJlZm9yZS4gICovCisjdW5kZWYJX19QCisjdW5kZWYJX19QTVQKKworI2lmZGVmIF9fR05VQ19fCisKKy8qIEFsbCBmdW5jdGlvbnMsIGV4Y2VwdCB0aG9zZSB3aXRoIGNhbGxiYWNrcyBvciB0aG9zZSB0aGF0CisgICBzeW5jaHJvbml6ZSBtZW1vcnksIGFyZSBsZWFmIGZ1bmN0aW9ucy4gICovCisjIGlmIF9fR05VQ19QUkVSRVEgKDQsIDYpICYmICFkZWZpbmVkIF9MSUJDCisjICBkZWZpbmUgX19MRUFGICwgX19sZWFmX18KKyMgIGRlZmluZSBfX0xFQUZfQVRUUiBfX2F0dHJpYnV0ZV9fICgoX19sZWFmX18pKQorIyBlbHNlCisjICBkZWZpbmUgX19MRUFGCisjICBkZWZpbmUgX19MRUFGX0FUVFIKKyMgZW5kaWYKKworLyogR0NDIGNhbiBhbHdheXMgZ3JvayBwcm90b3R5cGVzLiAgRm9yIEMrKyBwcm9ncmFtcyB3ZSBhZGQgdGhyb3coKQorICAgdG8gaGVscCBpdCBvcHRpbWl6ZSB0aGUgZnVuY3Rpb24gY2FsbHMuICBCdXQgdGhpcyB3b3JrcyBvbmx5IHdpdGgKKyAgIGdjYyAyLjgueCBhbmQgZWdjcy4gIEZvciBnY2MgMy4yIGFuZCB1cCB3ZSBldmVuIG1hcmsgQyBmdW5jdGlvbnMKKyAgIGFzIG5vbi10aHJvd2luZyB1c2luZyBhIGZ1bmN0aW9uIGF0dHJpYnV0ZSBzaW5jZSBwcm9ncmFtcyBjYW4gdXNlCisgICB0aGUgLWZleGNlcHRpb25zIG9wdGlvbnMgZm9yIEMgY29kZSBhcyB3ZWxsLiAgKi8KKyMgaWYgIWRlZmluZWQgX19jcGx1c3BsdXMgJiYgX19HTlVDX1BSRVJFUSAoMywgMykKKyMgIGRlZmluZSBfX1RIUk9XCV9fYXR0cmlidXRlX18gKChfX25vdGhyb3dfXyBfX0xFQUYpKQorIyAgZGVmaW5lIF9fVEhST1dOTAlfX2F0dHJpYnV0ZV9fICgoX19ub3Rocm93X18pKQorIyAgZGVmaW5lIF9fTlRIKGZjdCkJX19hdHRyaWJ1dGVfXyAoKF9fbm90aHJvd19fIF9fTEVBRikpIGZjdAorIyBlbHNlCisjICBpZiBkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fR05VQ19QUkVSRVEgKDIsOCkKKyMgICBkZWZpbmUgX19USFJPVwl0aHJvdyAoKQorIyAgIGRlZmluZSBfX1RIUk9XTkwJdGhyb3cgKCkKKyMgICBkZWZpbmUgX19OVEgoZmN0KQlfX0xFQUZfQVRUUiBmY3QgdGhyb3cgKCkKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19USFJPVworIyAgIGRlZmluZSBfX1RIUk9XTkwKKyMgICBkZWZpbmUgX19OVEgoZmN0KQlmY3QKKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbHNlCS8qIE5vdCBHQ0MuICAqLworCisjIGRlZmluZSBfX2lubGluZQkJLyogTm8gaW5saW5lIGZ1bmN0aW9ucy4gICovCisKKyMgZGVmaW5lIF9fVEhST1cKKyMgZGVmaW5lIF9fVEhST1dOTAorIyBkZWZpbmUgX19OVEgoZmN0KQlmY3QKKworIyBkZWZpbmUgX19jb25zdAljb25zdAorIyBkZWZpbmUgX19zaWduZWQJc2lnbmVkCisjIGRlZmluZSBfX3ZvbGF0aWxlCXZvbGF0aWxlCisKKyNlbmRpZgkvKiBHQ0MuICAqLworCisvKiBUaGVzZSB0d28gbWFjcm9zIGFyZSBub3QgdXNlZCBpbiBnbGliYyBhbnltb3JlLiAgVGhleSBhcmUga2VwdCBoZXJlCisgICBvbmx5IGJlY2F1c2Ugc29tZSBvdGhlciBwcm9qZWN0cyBleHBlY3QgdGhlIG1hY3JvcyB0byBiZSBkZWZpbmVkLiAgKi8KKyNkZWZpbmUgX19QKGFyZ3MpCWFyZ3MKKyNkZWZpbmUgX19QTVQoYXJncykJYXJncworCisvKiBGb3IgdGhlc2UgdGhpbmdzLCBHQ0MgYmVoYXZlcyB0aGUgQU5TSSB3YXkgbm9ybWFsbHksCisgICBhbmQgdGhlIG5vbi1BTlNJIHdheSB1bmRlciAtdHJhZGl0aW9uYWwuICAqLworCisjZGVmaW5lIF9fQ09OQ0FUKHgseSkJeCAjIyB5CisjZGVmaW5lIF9fU1RSSU5HKHgpCSN4CisKKy8qIFRoaXMgaXMgbm90IGEgdHlwZWRlZiBzbyBgY29uc3QgX19wdHJfdCcgZG9lcyB0aGUgcmlnaHQgdGhpbmcuICAqLworI2RlZmluZSBfX3B0cl90IHZvaWQgKgorI2RlZmluZSBfX2xvbmdfZG91YmxlX3QgIGxvbmcgZG91YmxlCisKKworLyogQysrIG5lZWRzIHRvIGtub3cgdGhhdCB0eXBlcyBhbmQgZGVjbGFyYXRpb25zIGFyZSBDLCBub3QgQysrLiAgKi8KKyNpZmRlZglfX2NwbHVzcGx1cworIyBkZWZpbmUgX19CRUdJTl9ERUNMUwlleHRlcm4gIkMiIHsKKyMgZGVmaW5lIF9fRU5EX0RFQ0xTCX0KKyNlbHNlCisjIGRlZmluZSBfX0JFR0lOX0RFQ0xTCisjIGRlZmluZSBfX0VORF9ERUNMUworI2VuZGlmCisKKworLyogVGhlIHN0YW5kYXJkIGxpYnJhcnkgbmVlZHMgdGhlIGZ1bmN0aW9ucyBmcm9tIHRoZSBJU08gQzkwIHN0YW5kYXJkCisgICBpbiB0aGUgc3RkIG5hbWVzcGFjZS4gIEF0IHRoZSBzYW1lIHRpbWUgd2Ugd2FudCB0byBiZSBzYWZlIGZvcgorICAgZnV0dXJlIGNoYW5nZXMgYW5kIHdlIGluY2x1ZGUgdGhlIElTTyBDOTkgY29kZSBpbiB0aGUgbm9uLXN0YW5kYXJkCisgICBuYW1lc3BhY2UgX19jOTkuICBUaGUgQysrIHdyYXBwZXIgaGVhZGVyIHRha2UgY2FzZSBvZiBhZGRpbmcgdGhlCisgICBkZWZpbml0aW9ucyB0byB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gICovCisjaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiBkZWZpbmVkIF9HTElCQ1BQX1VTRV9OQU1FU1BBQ0VTCisjIGRlZmluZSBfX0JFR0lOX05BTUVTUEFDRV9TVEQJbmFtZXNwYWNlIHN0ZCB7CisjIGRlZmluZSBfX0VORF9OQU1FU1BBQ0VfU1RECX0KKyMgZGVmaW5lIF9fVVNJTkdfTkFNRVNQQUNFX1NURChuYW1lKSB1c2luZyBzdGQ6Om5hbWU7CisjIGRlZmluZSBfX0JFR0lOX05BTUVTUEFDRV9DOTkJbmFtZXNwYWNlIF9fYzk5IHsKKyMgZGVmaW5lIF9fRU5EX05BTUVTUEFDRV9DOTkJfQorIyBkZWZpbmUgX19VU0lOR19OQU1FU1BBQ0VfQzk5KG5hbWUpIHVzaW5nIF9fYzk5OjpuYW1lOworI2Vsc2UKKy8qIEZvciBjb21wYXRpYmlsaXR5IHdlIGRvIG5vdCBhZGQgdGhlIGRlY2xhcmF0aW9ucyBpbnRvIGFueQorICAgbmFtZXNwYWNlLiAgVGhleSB3aWxsIGVuZCB1cCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB3aGljaCBpcyB3aGF0CisgICBvbGQgY29kZSBleHBlY3RzLiAgKi8KKyMgZGVmaW5lIF9fQkVHSU5fTkFNRVNQQUNFX1NURAorIyBkZWZpbmUgX19FTkRfTkFNRVNQQUNFX1NURAorIyBkZWZpbmUgX19VU0lOR19OQU1FU1BBQ0VfU1REKG5hbWUpCisjIGRlZmluZSBfX0JFR0lOX05BTUVTUEFDRV9DOTkKKyMgZGVmaW5lIF9fRU5EX05BTUVTUEFDRV9DOTkKKyMgZGVmaW5lIF9fVVNJTkdfTkFNRVNQQUNFX0M5OShuYW1lKQorI2VuZGlmCisKKworLyogU3VwcG9ydCBmb3IgYm91bmRlZCBwb2ludGVycy4gICovCisjaWZuZGVmIF9fQk9VTkRFRF9QT0lOVEVSU19fCisjIGRlZmluZSBfX2JvdW5kZWQJLyogbm90aGluZyAqLworIyBkZWZpbmUgX191bmJvdW5kZWQJLyogbm90aGluZyAqLworIyBkZWZpbmUgX19wdHJ2YWx1ZQkvKiBub3RoaW5nICovCisjZW5kaWYKKworCisvKiBGb3J0aWZ5IHN1cHBvcnQuICAqLworI2RlZmluZSBfX2JvcyhwdHIpIF9fYnVpbHRpbl9vYmplY3Rfc2l6ZSAocHRyLCBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMSkKKyNkZWZpbmUgX19ib3MwKHB0cikgX19idWlsdGluX29iamVjdF9zaXplIChwdHIsIDApCisKKyNpZiBfX0dOVUNfUFJFUkVRICg0LDMpCisjIGRlZmluZSBfX3dhcm5kZWNsKG5hbWUsIG1zZykgXAorICBleHRlcm4gdm9pZCBuYW1lICh2b2lkKSBfX2F0dHJpYnV0ZV9fKChfX3dhcm5pbmdfXyAobXNnKSkpCisjIGRlZmluZSBfX3dhcm5hdHRyKG1zZykgX19hdHRyaWJ1dGVfXygoX193YXJuaW5nX18gKG1zZykpKQorIyBkZWZpbmUgX19lcnJvcmRlY2wobmFtZSwgbXNnKSBcCisgIGV4dGVybiB2b2lkIG5hbWUgKHZvaWQpIF9fYXR0cmlidXRlX18oKF9fZXJyb3JfXyAobXNnKSkpCisjZWxzZQorIyBkZWZpbmUgX193YXJuZGVjbChuYW1lLCBtc2cpIGV4dGVybiB2b2lkIG5hbWUgKHZvaWQpCisjIGRlZmluZSBfX3dhcm5hdHRyKG1zZykKKyMgZGVmaW5lIF9fZXJyb3JkZWNsKG5hbWUsIG1zZykgZXh0ZXJuIHZvaWQgbmFtZSAodm9pZCkKKyNlbmRpZgorCisvKiBTdXBwb3J0IGZvciBmbGV4aWJsZSBhcnJheXMuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsOTcpCisvKiBHQ0MgMi45NyBzdXBwb3J0cyBDOTkgZmxleGlibGUgYXJyYXkgbWVtYmVycy4gICovCisjIGRlZmluZSBfX2ZsZXhhcnIJW10KKyNlbHNlCisjIGlmZGVmIF9fR05VQ19fCisjICBkZWZpbmUgX19mbGV4YXJyCVswXQorIyBlbHNlCisjICBpZiBkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgZGVmaW5lIF9fZmxleGFycglbXQorIyAgZWxzZQorLyogU29tZSBvdGhlciBub24tQzk5IGNvbXBpbGVyLiAgQXBwcm94aW1hdGUgd2l0aCBbMV0uICAqLworIyAgIGRlZmluZSBfX2ZsZXhhcnIJWzFdCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKworLyogX19hc21fXyAoInh5eiIpIGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgaGVhZGVycyB0byByZW5hbWUgZnVuY3Rpb25zCisgICBhdCB0aGUgYXNzZW1ibHkgbGFuZ3VhZ2UgbGV2ZWwuICBUaGlzIGlzIHdyYXBwZWQgYnkgdGhlIF9fUkVESVJFQ1QKKyAgIG1hY3JvLCBpbiBvcmRlciB0byBzdXBwb3J0IGNvbXBpbGVycyB0aGF0IGNhbiBkbyB0aGlzIHNvbWUgb3RoZXIKKyAgIHdheS4gIFdoZW4gY29tcGlsZXJzIGRvbid0IHN1cHBvcnQgYXNtLW5hbWVzIGF0IGFsbCwgd2UgaGF2ZSB0byBkbworICAgcHJlcHJvY2Vzc29yIHRyaWNrcyBpbnN0ZWFkICh3aGljaCBkb24ndCBoYXZlIGV4YWN0bHkgdGhlIHJpZ2h0CisgICBzZW1hbnRpY3MsIGJ1dCBpdCdzIHRoZSBiZXN0IHdlIGNhbiBkbykuCisKKyAgIEV4YW1wbGU6CisgICBpbnQgX19SRURJUkVDVChzZXRwZ3JwLCAoX19waWRfdCBwaWQsIF9fcGlkX3QgcGdycCksIHNldHBnaWQpOyAqLworCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisKKyMgZGVmaW5lIF9fUkVESVJFQ1QobmFtZSwgcHJvdG8sIGFsaWFzKSBuYW1lIHByb3RvIF9fYXNtX18gKF9fQVNNTkFNRSAoI2FsaWFzKSkKKyMgaWZkZWYgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgICAgbmFtZSBwcm90byBfX1RIUk9XIF9fYXNtX18gKF9fQVNNTkFNRSAoI2FsaWFzKSkKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USE5MKG5hbWUsIHByb3RvLCBhbGlhcykgXAorICAgICBuYW1lIHByb3RvIF9fVEhST1dOTCBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpCisjIGVsc2UKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgICAgbmFtZSBwcm90byBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpIF9fVEhST1cKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USE5MKG5hbWUsIHByb3RvLCBhbGlhcykgXAorICAgICBuYW1lIHByb3RvIF9fYXNtX18gKF9fQVNNTkFNRSAoI2FsaWFzKSkgX19USFJPV05MCisjIGVuZGlmCisjIGRlZmluZSBfX0FTTU5BTUUoY25hbWUpICBfX0FTTU5BTUUyIChfX1VTRVJfTEFCRUxfUFJFRklYX18sIGNuYW1lKQorIyBkZWZpbmUgX19BU01OQU1FMihwcmVmaXgsIGNuYW1lKSBfX1NUUklORyAocHJlZml4KSBjbmFtZQorCisvKgorI2VsaWYgX19TT01FX09USEVSX0NPTVBJTEVSX18KKworIyBkZWZpbmUgX19SRURJUkVDVChuYW1lLCBwcm90bywgYWxpYXMpIG5hbWUgcHJvdG87IFwKKwlfUHJhZ21hKCJsZXQgIiAjbmFtZSAiID0gIiAjYWxpYXMpCisqLworI2VuZGlmCisKKy8qIEdDQyBoYXMgdmFyaW91cyB1c2VmdWwgZGVjbGFyYXRpb25zIHRoYXQgY2FuIGJlIG1hZGUgd2l0aCB0aGUKKyAgIGBfX2F0dHJpYnV0ZV9fJyBzeW50YXguICBBbGwgb2YgdGhlIHdheXMgd2UgdXNlIHRoaXMgZG8gZmluZSBpZgorICAgdGhleSBhcmUgb21pdHRlZCBmb3IgY29tcGlsZXJzIHRoYXQgZG9uJ3QgdW5kZXJzdGFuZCBpdC4gKi8KKyNpZiAhZGVmaW5lZCBfX0dOVUNfXyB8fCBfX0dOVUNfXyA8IDIKKyMgZGVmaW5lIF9fYXR0cmlidXRlX18oeHl6KQkvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgZ2NjIDIuOTYgZGV2ZWxvcG1lbnQgdGhlIGBtYWxsb2MnIGF0dHJpYnV0ZQorICAgZm9yIGZ1bmN0aW9ucyB3YXMgaW50cm9kdWNlZC4gIFdlIGRvbid0IHdhbnQgdG8gdXNlIGl0IHVuY29uZGl0aW9uYWxseQorICAgKGFsdGhvdWdoIHRoaXMgd291bGQgYmUgcG9zc2libGUpIHNpbmNlIGl0IGdlbmVyYXRlcyB3YXJuaW5ncy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMiw5NikKKyMgZGVmaW5lIF9fYXR0cmlidXRlX21hbGxvY19fIF9fYXR0cmlidXRlX18gKChfX21hbGxvY19fKSkKKyNlbHNlCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9tYWxsb2NfXyAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgZ2NjIDIuOTYgZGV2ZWxvcG1lbnQgdGhlIGBwdXJlJyBhdHRyaWJ1dGUKKyAgIGZvciBmdW5jdGlvbnMgd2FzIGludHJvZHVjZWQuICBXZSBkb24ndCB3YW50IHRvIHVzZSBpdCB1bmNvbmRpdGlvbmFsbHkKKyAgIChhbHRob3VnaCB0aGlzIHdvdWxkIGJlIHBvc3NpYmxlKSBzaW5jZSBpdCBnZW5lcmF0ZXMgd2FybmluZ3MuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsOTYpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9wdXJlX18gX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKKyNlbHNlCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9wdXJlX18gLyogSWdub3JlICovCisjZW5kaWYKKworLyogVGhpcyBkZWNsYXJhdGlvbiB0ZWxscyB0aGUgY29tcGlsZXIgdGhhdCB0aGUgdmFsdWUgaXMgY29uc3RhbnQuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsNSkKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpCisjZWxzZQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgZ2NjIDMuMSBkZXZlbG9wbWVudCB0aGUgYHVzZWQnIGF0dHJpYnV0ZQorICAgZm9yIGZ1bmN0aW9ucyB3YXMgaW50cm9kdWNlZC4gIFdlIGRvbid0IHdhbnQgdG8gdXNlIGl0IHVuY29uZGl0aW9uYWxseQorICAgKGFsdGhvdWdoIHRoaXMgd291bGQgYmUgcG9zc2libGUpIHNpbmNlIGl0IGdlbmVyYXRlcyB3YXJuaW5ncy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMywxKQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfdXNlZF9fIF9fYXR0cmlidXRlX18gKChfX3VzZWRfXykpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9ub2lubGluZV9fIF9fYXR0cmlidXRlX18gKChfX25vaW5saW5lX18pKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX3VzZWRfXyBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9ub2lubGluZV9fIC8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIGdjYyBhbGxvd3MgbWFya2luZyBkZXByZWNhdGVkIGZ1bmN0aW9ucy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMywyKQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fIF9fYXR0cmlidXRlX18gKChfX2RlcHJlY2F0ZWRfXykpCisjZWxzZQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fIC8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIEF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZSBnY2MgMi44IGRldmVsb3BtZW50IHRoZSBgZm9ybWF0X2FyZycgYXR0cmlidXRlCisgICBmb3IgZnVuY3Rpb25zIHdhcyBpbnRyb2R1Y2VkLiAgV2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQgdW5jb25kaXRpb25hbGx5CisgICAoYWx0aG91Z2ggdGhpcyB3b3VsZCBiZSBwb3NzaWJsZSkgc2luY2UgaXQgZ2VuZXJhdGVzIHdhcm5pbmdzLgorICAgSWYgc2V2ZXJhbCBgZm9ybWF0X2FyZycgYXR0cmlidXRlcyBhcmUgZ2l2ZW4gZm9yIHRoZSBzYW1lIGZ1bmN0aW9uLCBpbgorICAgZ2NjLTMuMCBhbmQgb2xkZXIsIGFsbCBidXQgdGhlIGxhc3Qgb25lIGFyZSBpZ25vcmVkLiAgSW4gbmV3ZXIgZ2NjcywKKyAgIGFsbCBkZXNpZ25hdGVkIGFyZ3VtZW50cyBhcmUgY29uc2lkZXJlZC4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMiw4KQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9hcmdfXyAoeCkpKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyh4KSAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgZ2NjIDIuOTcgZGV2ZWxvcG1lbnQgdGhlIGBzdHJmbW9uJyBmb3JtYXQKKyAgIGF0dHJpYnV0ZSBmb3IgZnVuY3Rpb25zIHdhcyBpbnRyb2R1Y2VkLiAgV2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQKKyAgIHVuY29uZGl0aW9uYWxseSAoYWx0aG91Z2ggdGhpcyB3b3VsZCBiZSBwb3NzaWJsZSkgc2luY2UgaXQKKyAgIGdlbmVyYXRlcyB3YXJuaW5ncy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMiw5NykKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2Zvcm1hdF9zdHJmbW9uX18oYSxiKSBcCisgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3N0cmZtb25fXywgYSwgYikpKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2Zvcm1hdF9zdHJmbW9uX18oYSxiKSAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBUaGUgbm9udWxsIGZ1bmN0aW9uIGF0dHJpYnV0ZSBhbGxvd3MgdG8gbWFyayBwb2ludGVyIHBhcmFtZXRlcnMgd2hpY2gKKyAgIG11c3Qgbm90IGJlIE5VTEwuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDMsMykKKyMgZGVmaW5lIF9fbm9ubnVsbChwYXJhbXMpIF9fYXR0cmlidXRlX18gKChfX25vbm51bGxfXyBwYXJhbXMpKQorI2Vsc2UKKyMgZGVmaW5lIF9fbm9ubnVsbChwYXJhbXMpCisjZW5kaWYKKworLyogSWYgZm9ydGlmaWNhdGlvbiBtb2RlLCB3ZSB3YXJuIGFib3V0IHVudXNlZCByZXN1bHRzIG9mIGNlcnRhaW4KKyAgIGZ1bmN0aW9uIGNhbGxzIHdoaWNoIGNhbiBsZWFkIHRvIHByb2JsZW1zLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgzLDQpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV93YXJuX3VudXNlZF9yZXN1bHRfXyBcCisgICBfX2F0dHJpYnV0ZV9fICgoX193YXJuX3VudXNlZF9yZXN1bHRfXykpCisjIGlmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwCisjICBkZWZpbmUgX193dXIgX19hdHRyaWJ1dGVfd2Fybl91bnVzZWRfcmVzdWx0X18KKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBfX2F0dHJpYnV0ZV93YXJuX3VudXNlZF9yZXN1bHRfXyAvKiBlbXB0eSAqLworI2VuZGlmCisjaWZuZGVmIF9fd3VyCisjIGRlZmluZSBfX3d1ciAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBGb3JjZXMgYSBmdW5jdGlvbiB0byBiZSBhbHdheXMgaW5saW5lZC4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMywyKQorIyBkZWZpbmUgX19hbHdheXNfaW5saW5lIF9faW5saW5lIF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykpCisjZWxzZQorIyBkZWZpbmUgX19hbHdheXNfaW5saW5lIF9faW5saW5lCisjZW5kaWYKKworLyogR0NDIDQuMyBhbmQgYWJvdmUgd2l0aCAtc3RkPWM5OSBvciAtc3RkPWdudTk5IGltcGxlbWVudHMgSVNPIEM5OQorICAgaW5saW5lIHNlbWFudGljcywgdW5sZXNzIC1mZ251ODktaW5saW5lIGlzIHVzZWQuICAqLworI2lmICFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IF9fR05VQ19QUkVSRVEgKDQsMykKKyMgaWYgZGVmaW5lZCBfX0dOVUNfU1REQ19JTkxJTkVfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgX19leHRlcm5faW5saW5lIGV4dGVybiBfX2lubGluZSBfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18pKQorIyAgaWYgX19HTlVDX1BSRVJFUSAoNCwzKQorIyAgIGRlZmluZSBfX2V4dGVybl9hbHdheXNfaW5saW5lIFwKKyAgZXh0ZXJuIF9fYWx3YXlzX2lubGluZSBfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19leHRlcm5fYWx3YXlzX2lubGluZSBcCisgIGV4dGVybiBfX2Fsd2F5c19pbmxpbmUgX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fKSkKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBfX2V4dGVybl9pbmxpbmUgZXh0ZXJuIF9faW5saW5lCisjICBpZiBfX0dOVUNfUFJFUkVRICg0LDMpCisjICAgZGVmaW5lIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgXAorICBleHRlcm4gX19hbHdheXNfaW5saW5lIF9fYXR0cmlidXRlX18gKChfX2FydGlmaWNpYWxfXykpCisjICBlbHNlCisjICAgZGVmaW5lIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgZXh0ZXJuIF9fYWx3YXlzX2lubGluZQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBHQ0MgNC4zIGFuZCBhYm92ZSBhbGxvdyBwYXNzaW5nIGFsbCBhbm9ueW1vdXMgYXJndW1lbnRzIG9mIGFuCisgICBfX2V4dGVybl9hbHdheXNfaW5saW5lIGZ1bmN0aW9uIHRvIHNvbWUgb3RoZXIgdmFyYXJnIGZ1bmN0aW9uLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICg0LDMpCisjIGRlZmluZSBfX3ZhX2FyZ19wYWNrKCkgX19idWlsdGluX3ZhX2FyZ19wYWNrICgpCisjIGRlZmluZSBfX3ZhX2FyZ19wYWNrX2xlbigpIF9fYnVpbHRpbl92YV9hcmdfcGFja19sZW4gKCkKKyNlbmRpZgorCisvKiBJdCBpcyBwb3NzaWJsZSB0byBjb21waWxlIGNvbnRhaW5pbmcgR0NDIGV4dGVuc2lvbnMgZXZlbiBpZiBHQ0MgaXMKKyAgIHJ1biBpbiBwZWRhbnRpYyBtb2RlIGlmIHRoZSB1c2VzIGFyZSBjYXJlZnVsbHkgbWFya2VkIHVzaW5nIHRoZQorICAgYF9fZXh0ZW5zaW9uX18nIGtleXdvcmQuICBCdXQgdGhpcyBpcyBub3QgZ2VuZXJhbGx5IGF2YWlsYWJsZSBiZWZvcmUKKyAgIHZlcnNpb24gMi44LiAgKi8KKyNpZiAhX19HTlVDX1BSRVJFUSAoMiw4KQorIyBkZWZpbmUgX19leHRlbnNpb25fXwkJLyogSWdub3JlICovCisjZW5kaWYKKworLyogX19yZXN0cmljdCBpcyBrbm93biBpbiBFR0NTIDEuMiBhbmQgYWJvdmUuICovCisjaWYgIV9fR05VQ19QUkVSRVEgKDIsOTIpCisjIGRlZmluZSBfX3Jlc3RyaWN0CS8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIElTTyBDOTkgYWxzbyBhbGxvd3MgdG8gZGVjbGFyZSBhcnJheXMgYXMgbm9uLW92ZXJsYXBwaW5nLiAgVGhlIHN5bnRheCBpcworICAgICBhcnJheV9uYW1lW3Jlc3RyaWN0XQorICAgR0NDIDMuMSBzdXBwb3J0cyB0aGlzLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgzLDEpICYmICFkZWZpbmVkIF9fR05VR19fCisjIGRlZmluZSBfX3Jlc3RyaWN0X2FycglfX3Jlc3RyaWN0CisjZWxzZQorIyBpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIF9fcmVzdHJpY3RfYXJyCS8qIE5vdCBzdXBwb3J0ZWQgaW4gb2xkIEdDQy4gICovCisjIGVsc2UKKyMgIGlmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgICBkZWZpbmUgX19yZXN0cmljdF9hcnIJcmVzdHJpY3QKKyMgIGVsc2UKKy8qIFNvbWUgb3RoZXIgbm9uLUM5OSBjb21waWxlci4gICovCisjICAgZGVmaW5lIF9fcmVzdHJpY3RfYXJyCS8qIE5vdCBzdXBwb3J0ZWQuICAqLworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFX01BVEhfT1BUSU9OQUwgJiYgZGVmaW5lZCBfX05PX0xPTkdfRE9VQkxFX01BVEgKKyMgZGVmaW5lIF9fTERCTF9DT01QQVQgMQorIyBpZmRlZiBfX1JFRElSRUNUCisjICBkZWZpbmUgX19MREJMX1JFRElSMShuYW1lLCBwcm90bywgYWxpYXMpIF9fUkVESVJFQ1QgKG5hbWUsIHByb3RvLCBhbGlhcykKKyMgIGRlZmluZSBfX0xEQkxfUkVESVIobmFtZSwgcHJvdG8pIFwKKyAgX19MREJMX1JFRElSMSAobmFtZSwgcHJvdG8sIF9fbmxkYmxfIyNuYW1lKQorIyAgZGVmaW5lIF9fTERCTF9SRURJUjFfTlRIKG5hbWUsIHByb3RvLCBhbGlhcykgX19SRURJUkVDVF9OVEggKG5hbWUsIHByb3RvLCBhbGlhcykKKyMgIGRlZmluZSBfX0xEQkxfUkVESVJfTlRIKG5hbWUsIHByb3RvKSBcCisgIF9fTERCTF9SRURJUjFfTlRIIChuYW1lLCBwcm90bywgX19ubGRibF8jI25hbWUpCisjICBkZWZpbmUgX19MREJMX1JFRElSMV9ERUNMKG5hbWUsIGFsaWFzKSBcCisgIGV4dGVybiBfX3R5cGVvZiAobmFtZSkgbmFtZSBfX2FzbSAoX19BU01OQU1FICgjYWxpYXMpKTsKKyMgIGRlZmluZSBfX0xEQkxfUkVESVJfREVDTChuYW1lKSBcCisgIGV4dGVybiBfX3R5cGVvZiAobmFtZSkgbmFtZSBfX2FzbSAoX19BU01OQU1FICgiX19ubGRibF8iICNuYW1lKSk7CisjICBkZWZpbmUgX19SRURJUkVDVF9MREJMKG5hbWUsIHByb3RvLCBhbGlhcykgXAorICBfX0xEQkxfUkVESVIxIChuYW1lLCBwcm90bywgX19ubGRibF8jI2FsaWFzKQorIyAgZGVmaW5lIF9fUkVESVJFQ1RfTlRIX0xEQkwobmFtZSwgcHJvdG8sIGFsaWFzKSBcCisgIF9fTERCTF9SRURJUjFfTlRIIChuYW1lLCBwcm90bywgX19ubGRibF8jI2FsaWFzKQorIyBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQgX19MREJMX0NPTVBBVCB8fCAhZGVmaW5lZCBfX1JFRElSRUNUCisjIGRlZmluZSBfX0xEQkxfUkVESVIxKG5hbWUsIHByb3RvLCBhbGlhcykgbmFtZSBwcm90bworIyBkZWZpbmUgX19MREJMX1JFRElSKG5hbWUsIHByb3RvKSBuYW1lIHByb3RvCisjIGRlZmluZSBfX0xEQkxfUkVESVIxX05USChuYW1lLCBwcm90bywgYWxpYXMpIG5hbWUgcHJvdG8gX19USFJPVworIyBkZWZpbmUgX19MREJMX1JFRElSX05USChuYW1lLCBwcm90bykgbmFtZSBwcm90byBfX1RIUk9XCisjIGRlZmluZSBfX0xEQkxfUkVESVJfREVDTChuYW1lKQorIyBpZmRlZiBfX1JFRElSRUNUCisjICBkZWZpbmUgX19SRURJUkVDVF9MREJMKG5hbWUsIHByb3RvLCBhbGlhcykgX19SRURJUkVDVCAobmFtZSwgcHJvdG8sIGFsaWFzKQorIyAgZGVmaW5lIF9fUkVESVJFQ1RfTlRIX0xEQkwobmFtZSwgcHJvdG8sIGFsaWFzKSBcCisgIF9fUkVESVJFQ1RfTlRIIChuYW1lLCBwcm90bywgYWxpYXMpCisjIGVuZGlmCisjZW5kaWYKKworI2VuZGlmCSAvKiBzeXMvY2RlZnMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZGVidWdyZWcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2RlYnVncmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5Yzk0MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2RlYnVncmVnLmgKQEAgLTAsMCArMSw5MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfREVCVUdSRUdfSAorI2RlZmluZSBfU1lTX0RFQlVHUkVHX0gJMQorCisvKiBJbmRpY2F0ZSB0aGUgcmVnaXN0ZXIgbnVtYmVycyBmb3IgYSBudW1iZXIgb2YgdGhlIHNwZWNpZmljCisgICBkZWJ1ZyByZWdpc3RlcnMuICBSZWdpc3RlcnMgMC0zIGNvbnRhaW4gdGhlIGFkZHJlc3NlcyB3ZSB3aXNoIHRvIHRyYXAgb24gKi8KKyNkZWZpbmUgRFJfRklSU1RBRERSIDAgICAgICAgIC8qIHVfZGVidWdyZWdbRFJfRklSU1RBRERSXSAqLworI2RlZmluZSBEUl9MQVNUQUREUiAzICAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9MQVNUQUREUl0gICovCisKKyNkZWZpbmUgRFJfU1RBVFVTIDYgICAgICAgICAgIC8qIHVfZGVidWdyZWdbRFJfU1RBVFVTXSAgICAgKi8KKyNkZWZpbmUgRFJfQ09OVFJPTCA3ICAgICAgICAgIC8qIHVfZGVidWdyZWdbRFJfQ09OVFJPTF0gKi8KKworLyogRGVmaW5lIGEgZmV3IHRoaW5ncyBmb3IgdGhlIHN0YXR1cyByZWdpc3Rlci4gIFdlIGNhbiB1c2UgdGhpcyB0byBkZXRlcm1pbmUKKyAgIHdoaWNoIGRlYnVnZ2luZyByZWdpc3RlciB3YXMgcmVzcG9uc2libGUgZm9yIHRoZSB0cmFwLiAgVGhlIG90aGVyIGJpdHMKKyAgIGFyZSBlaXRoZXIgcmVzZXJ2ZWQgb3Igbm90IG9mIGludGVyZXN0IHRvIHVzLiAqLworCisjZGVmaW5lIERSX1RSQVAwCSgweDEpCQkvKiBkYjAgKi8KKyNkZWZpbmUgRFJfVFJBUDEJKDB4MikJCS8qIGRiMSAqLworI2RlZmluZSBEUl9UUkFQMgkoMHg0KQkJLyogZGIyICovCisjZGVmaW5lIERSX1RSQVAzCSgweDgpCQkvKiBkYjMgKi8KKworI2RlZmluZSBEUl9TVEVQCQkoMHg0MDAwKQkvKiBzaW5nbGUtc3RlcCAqLworI2RlZmluZSBEUl9TV0lUQ0gJKDB4ODAwMCkJLyogdGFzayBzd2l0Y2ggKi8KKworLyogTm93IGRlZmluZSBhIGJ1bmNoIG9mIHRoaW5ncyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorICAgVGhlIHRvcCB0d28gYnl0ZXMgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgY29uc2lzdCBvZiA0IGZpZWxkcyBvZiA0CisgICBiaXRzIC0gZWFjaCBmaWVsZCBjb3JyZXNwb25kcyB0byBvbmUgb2YgdGhlIGZvdXIgZGVidWcgcmVnaXN0ZXJzLAorICAgYW5kIGluZGljYXRlcyB3aGF0IHR5cGVzIG9mIGFjY2VzcyB3ZSB0cmFwIG9uLCBhbmQgaG93IGxhcmdlIHRoZSBkYXRhCisgICBmaWVsZCBpcyB0aGF0IHdlIGFyZSBsb29raW5nIGF0ICovCisKKyNkZWZpbmUgRFJfQ09OVFJPTF9TSElGVCAxNiAgIC8qIFNraXAgdGhpcyBtYW55IGJpdHMgaW4gY3RsIHJlZ2lzdGVyICovCisjZGVmaW5lIERSX0NPTlRST0xfU0laRSAgNCAgICAvKiA0IGNvbnRyb2wgYml0cyBwZXIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBEUl9SV19FWEVDVVRFCSgweDApIC8qIFNldHRpbmdzIGZvciB0aGUgYWNjZXNzIHR5cGVzIHRvIHRyYXAgb24gKi8KKyNkZWZpbmUgRFJfUldfV1JJVEUJKDB4MSkKKyNkZWZpbmUgRFJfUldfUkVBRAkoMHgzKQorCisjZGVmaW5lIERSX0xFTl8xICgweDApCSAgICAgIC8qIFNldHRpbmdzIGZvciBkYXRhIGxlbmd0aCB0byB0cmFwIG9uICovCisjZGVmaW5lIERSX0xFTl8yICgweDQpCisjZGVmaW5lIERSX0xFTl80ICgweEMpCisKKy8qIFRoZSBsb3cgYnl0ZSB0byB0aGUgY29udHJvbCByZWdpc3RlciBkZXRlcm1pbmUgd2hpY2ggcmVnaXN0ZXJzIGFyZQorICAgZW5hYmxlZC4gIFRoZXJlIGFyZSA0IGZpZWxkcyBvZiB0d28gYml0cy4gIE9uZSBiaXQgaXMgImxvY2FsIiwgbWVhbmluZworICAgdGhhdCB0aGUgcHJvY2Vzc29yIHdpbGwgcmVzZXQgdGhlIGJpdCBhZnRlciBhIHRhc2sgc3dpdGNoIGFuZCB0aGUgb3RoZXIKKyAgIGlzIGdsb2JhbCBtZWFuaW5nIHRoYXQgd2UgaGF2ZSB0byBleHBsaWNpdGx5IHJlc2V0IHRoZSBiaXQuICBXaXRoIGxpbnV4LAorICAgeW91IGNhbiB1c2UgZWl0aGVyIG9uZSwgc2luY2Ugd2UgZXhwbGljaXRseSB6ZXJvIHRoZSByZWdpc3RlciB3aGVuIHdlIGVudGVyCisgICBrZXJuZWwgbW9kZS4gKi8KKworI2RlZmluZSBEUl9MT0NBTF9FTkFCTEVfU0hJRlQgIDAgICAvKiBFeHRyYSBzaGlmdCB0byB0aGUgbG9jYWwgZW5hYmxlIGJpdCAqLworI2RlZmluZSBEUl9HTE9CQUxfRU5BQkxFX1NISUZUIDEgICAvKiBFeHRyYSBzaGlmdCB0byB0aGUgZ2xvYmFsIGVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgRFJfRU5BQkxFX1NJWkUJICAgICAgIDIgICAvKiAyIGVuYWJsZSBiaXRzIHBlciByZWdpc3RlciAqLworCisjZGVmaW5lIERSX0xPQ0FMX0VOQUJMRV9NQVNLICAoMHg1NSkgLyogU2V0ICBsb2NhbCBiaXRzIGZvciBhbGwgNCByZWdzICovCisjZGVmaW5lIERSX0dMT0JBTF9FTkFCTEVfTUFTSyAoMHhBQSkgLyogU2V0IGdsb2JhbCBiaXRzIGZvciBhbGwgNCByZWdzICovCisKKy8qIFRoZSBzZWNvbmQgYnl0ZSB0byB0aGUgY29udHJvbCByZWdpc3RlciBoYXMgYSBmZXcgc3BlY2lhbCB0aGluZ3MuCisKKyAgICBPbiB0aGUgaTM4NiwgeW91IHNob3VsZCBzZXQgdGhlIERSX0xPQ0FMX1NMT1dET1dOIG9yCisgICAgRFJfR0xPQkFMX1NMT1dET1dOIGJpdHMgaWYgeW91IHdhbnQgdG8ga25vdyBleGFjdGx5IHdoaWNoCisgICAgaW5zdHJ1Y3Rpb24gdHJpZ2dlcmVkIHRoZSB3YXRjaHBvaW50LiAgU2V0dGluZyB0aGVzZSBiaXRzIGNhdXNlcworICAgIHRoZSBwcm9jZXNzb3IgdG8gcnVuIG1vcmUgc2xvd2x5LCBidXQgbGVhdmluZyB0aGVtIGNsZWFyIG1ha2VzIGl0CisgICAgdHJlYXQgd2F0Y2hwb2ludCBoaXRzIGFzIGltcHJlY2lzZSBleGNlcHRpb25zLCBzbyB5b3UgY2FuJ3QKKyAgICByZWxpYWJseSBkZXRlcm1pbmUgd2hpY2ggaW5zdHJ1Y3Rpb24gY2F1c2VkIHRoZSBoaXQuCisKKyAgICBUaGUgaTQ4NiBhbmQgYWxsIGxhdGVyIElBLTMyIHByb2Nlc3NvcnMgaWdub3JlIERSX0xPQ0FMX1NMT1dET1dOCisgICAgYW5kIERSX0dMT0JBTF9TTE9XRE9XTi4gIFRoZXkgYWx3YXlzIHJlcG9ydCB0aGUgZXhjZXB0aW9uCisgICAgcHJlY2lzZWx5LCBleGNlcHQgaW4gc29tZSByYXJlIGNhc2VzLCB3aGljaCB0aGUgdXNlciBjYW4ndCBkbworICAgIGFueXRoaW5nIGFib3V0LiAgKi8KKworI2RlZmluZSBEUl9DT05UUk9MX1JFU0VSVkVEICgweEZDMDApIC8qIFJlc2VydmVkIGJ5IEludGVsICovCisjZGVmaW5lIERSX0xPQ0FMX1NMT1dET1dOICAgKDB4MTAwKSAgLyogTG9jYWwgc2xvdyB0aGUgcGlwZWxpbmUgKi8KKyNkZWZpbmUgRFJfR0xPQkFMX1NMT1dET1dOICAoMHgyMDApICAvKiBHbG9iYWwgc2xvdyB0aGUgcGlwZWxpbmUgKi8KKworI2VuZGlmCS8qIHN5cy9kZWJ1Z3JlZy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9kaXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2Rpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MTFkNmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9kaXIuaApAQCAtMCwwICsxLDI4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19ESVJfSAorI2RlZmluZQlfU1lTX0RJUl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKworI2RlZmluZQlkaXJlY3QJZGlyZW50CisKKyNlbmRpZgkvKiBzeXMvZGlyLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9lbGYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2VsZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NTljZGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9lbGYuaApAQCAtMCwwICsxLDI2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19FTEZfSAorI2RlZmluZSBfU1lTX0VMRl9ICTEKKworI3dhcm5pbmcgIlRoaXMgaGVhZGVyIGlzIG9ic29sZXRlOyB1c2UgPHN5cy9wcm9jZnMuaD4gaW5zdGVhZC4iCisKKyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CisKKyNlbmRpZgkvKiBfU1lTX0VMRl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9lcG9sbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZXBvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjNkYjkyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZXBvbGwuaApAQCAtMCwwICsxLDE0NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDksIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19FUE9MTF9ICisjZGVmaW5lCV9TWVNfRVBPTExfSAkxCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogR2V0IF9fc2lnc2V0X3QuICAqLworI2luY2x1ZGUgPGJpdHMvc2lnc2V0Lmg+CisKKyNpZm5kZWYgX19zaWdzZXRfdF9kZWZpbmVkCisjIGRlZmluZSBfX3NpZ3NldF90X2RlZmluZWQKK3R5cGVkZWYgX19zaWdzZXRfdCBzaWdzZXRfdDsKKyNlbmRpZgorCisKKy8qIEZsYWdzIHRvIGJlIHBhc3NlZCB0byBlcG9sbF9jcmVhdGUxLiAgKi8KK2VudW0KKyAgeworICAgIEVQT0xMX0NMT0VYRUMgPSAwMjAwMDAwMCwKKyNkZWZpbmUgRVBPTExfQ0xPRVhFQyBFUE9MTF9DTE9FWEVDCisgICAgRVBPTExfTk9OQkxPQ0sgPSAwNDAwMAorI2RlZmluZSBFUE9MTF9OT05CTE9DSyBFUE9MTF9OT05CTE9DSworICB9OworCisKK2VudW0gRVBPTExfRVZFTlRTCisgIHsKKyAgICBFUE9MTElOID0gMHgwMDEsCisjZGVmaW5lIEVQT0xMSU4gRVBPTExJTgorICAgIEVQT0xMUFJJID0gMHgwMDIsCisjZGVmaW5lIEVQT0xMUFJJIEVQT0xMUFJJCisgICAgRVBPTExPVVQgPSAweDAwNCwKKyNkZWZpbmUgRVBPTExPVVQgRVBPTExPVVQKKyAgICBFUE9MTFJETk9STSA9IDB4MDQwLAorI2RlZmluZSBFUE9MTFJETk9STSBFUE9MTFJETk9STQorICAgIEVQT0xMUkRCQU5EID0gMHgwODAsCisjZGVmaW5lIEVQT0xMUkRCQU5EIEVQT0xMUkRCQU5ECisgICAgRVBPTExXUk5PUk0gPSAweDEwMCwKKyNkZWZpbmUgRVBPTExXUk5PUk0gRVBPTExXUk5PUk0KKyAgICBFUE9MTFdSQkFORCA9IDB4MjAwLAorI2RlZmluZSBFUE9MTFdSQkFORCBFUE9MTFdSQkFORAorICAgIEVQT0xMTVNHID0gMHg0MDAsCisjZGVmaW5lIEVQT0xMTVNHIEVQT0xMTVNHCisgICAgRVBPTExFUlIgPSAweDAwOCwKKyNkZWZpbmUgRVBPTExFUlIgRVBPTExFUlIKKyAgICBFUE9MTEhVUCA9IDB4MDEwLAorI2RlZmluZSBFUE9MTEhVUCBFUE9MTEhVUAorICAgIEVQT0xMUkRIVVAgPSAweDIwMDAsCisjZGVmaW5lIEVQT0xMUkRIVVAgRVBPTExSREhVUAorICAgIEVQT0xMT05FU0hPVCA9IDF1IDw8IDMwLAorI2RlZmluZSBFUE9MTE9ORVNIT1QgRVBPTExPTkVTSE9UCisgICAgRVBPTExFVCA9IDF1IDw8IDMxCisjZGVmaW5lIEVQT0xMRVQgRVBPTExFVAorICB9OworCisKKy8qIFZhbGlkIG9wY29kZXMgKCAib3AiIHBhcmFtZXRlciApIHRvIGlzc3VlIHRvIGVwb2xsX2N0bCgpLiAgKi8KKyNkZWZpbmUgRVBPTExfQ1RMX0FERCAxCS8qIEFkZCBhIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgaW50ZXJmYWNlLiAgKi8KKyNkZWZpbmUgRVBPTExfQ1RMX0RFTCAyCS8qIFJlbW92ZSBhIGZpbGUgZGVzY3JpcHRvciBmcm9tIHRoZSBpbnRlcmZhY2UuICAqLworI2RlZmluZSBFUE9MTF9DVExfTU9EIDMJLyogQ2hhbmdlIGZpbGUgZGVzY3JpcHRvciBlcG9sbF9ldmVudCBzdHJ1Y3R1cmUuICAqLworCisKK3R5cGVkZWYgdW5pb24gZXBvbGxfZGF0YQoreworICB2b2lkICpwdHI7CisgIGludCBmZDsKKyAgdWludDMyX3QgdTMyOworICB1aW50NjRfdCB1NjQ7Cit9IGVwb2xsX2RhdGFfdDsKKworc3RydWN0IGVwb2xsX2V2ZW50Cit7CisgIHVpbnQzMl90IGV2ZW50czsJLyogRXBvbGwgZXZlbnRzICovCisgIGVwb2xsX2RhdGFfdCBkYXRhOwkvKiBVc2VyIGRhdGEgdmFyaWFibGUgKi8KK307CisKKworX19CRUdJTl9ERUNMUworCisvKiBDcmVhdGVzIGFuIGVwb2xsIGluc3RhbmNlLiAgUmV0dXJucyBhbiBmZCBmb3IgdGhlIG5ldyBpbnN0YW5jZS4KKyAgIFRoZSAic2l6ZSIgcGFyYW1ldGVyIGlzIGEgaGludCBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgZmlsZQorICAgZGVzY3JpcHRvcnMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgaW5zdGFuY2UuICBUaGUgZmQKKyAgIHJldHVybmVkIGJ5IGVwb2xsX2NyZWF0ZSgpIHNob3VsZCBiZSBjbG9zZWQgd2l0aCBjbG9zZSgpLiAgKi8KK2V4dGVybiBpbnQgZXBvbGxfY3JlYXRlIChpbnQgX19zaXplKSBfX1RIUk9XOworCisvKiBTYW1lIGFzIGVwb2xsX2NyZWF0ZSBidXQgd2l0aCBhbiBGTEFHUyBwYXJhbWV0ZXIuICBUaGUgdW51c2VkIFNJWkUKKyAgIHBhcmFtZXRlciBoYXMgYmVlbiBkcm9wcGVkLiAgKi8KK2V4dGVybiBpbnQgZXBvbGxfY3JlYXRlMSAoaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKworLyogTWFuaXB1bGF0ZSBhbiBlcG9sbCBpbnN0YW5jZSAiZXBmZCIuIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsCisgICAtMSBpbiBjYXNlIG9mIGVycm9yICggdGhlICJlcnJubyIgdmFyaWFibGUgd2lsbCBjb250YWluIHRoZQorICAgc3BlY2lmaWMgZXJyb3IgY29kZSApIFRoZSAib3AiIHBhcmFtZXRlciBpcyBvbmUgb2YgdGhlIEVQT0xMX0NUTF8qCisgICBjb25zdGFudHMgZGVmaW5lZCBhYm92ZS4gVGhlICJmZCIgcGFyYW1ldGVyIGlzIHRoZSB0YXJnZXQgb2YgdGhlCisgICBvcGVyYXRpb24uIFRoZSAiZXZlbnQiIHBhcmFtZXRlciBkZXNjcmliZXMgd2hpY2ggZXZlbnRzIHRoZSBjYWxsZXIKKyAgIGlzIGludGVyZXN0ZWQgaW4gYW5kIGFueSBhc3NvY2lhdGVkIHVzZXIgZGF0YS4gICovCitleHRlcm4gaW50IGVwb2xsX2N0bCAoaW50IF9fZXBmZCwgaW50IF9fb3AsIGludCBfX2ZkLAorCQkgICAgICBzdHJ1Y3QgZXBvbGxfZXZlbnQgKl9fZXZlbnQpIF9fVEhST1c7CisKKworLyogV2FpdCBmb3IgZXZlbnRzIG9uIGFuIGVwb2xsIGluc3RhbmNlICJlcGZkIi4gUmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICB0cmlnZ2VyZWQgZXZlbnRzIHJldHVybmVkIGluICJldmVudHMiIGJ1ZmZlci4gT3IgLTEgaW4gY2FzZSBvZgorICAgZXJyb3Igd2l0aCB0aGUgImVycm5vIiB2YXJpYWJsZSBzZXQgdG8gdGhlIHNwZWNpZmljIGVycm9yIGNvZGUuIFRoZQorICAgImV2ZW50cyIgcGFyYW1ldGVyIGlzIGEgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRyaWdnZXJlZAorICAgZXZlbnRzLiBUaGUgIm1heGV2ZW50cyIgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGV2ZW50cyB0byBiZQorICAgcmV0dXJuZWQgKCB1c3VhbGx5IHNpemUgb2YgImV2ZW50cyIgKS4gVGhlICJ0aW1lb3V0IiBwYXJhbWV0ZXIKKyAgIHNwZWNpZmllcyB0aGUgbWF4aW11bSB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzICgtMSA9PSBpbmZpbml0ZSkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBlcG9sbF93YWl0IChpbnQgX19lcGZkLCBzdHJ1Y3QgZXBvbGxfZXZlbnQgKl9fZXZlbnRzLAorCQkgICAgICAgaW50IF9fbWF4ZXZlbnRzLCBpbnQgX190aW1lb3V0KTsKKworCisvKiBTYW1lIGFzIGVwb2xsX3dhaXQsIGJ1dCB0aGUgdGhyZWFkJ3Mgc2lnbmFsIG1hc2sgaXMgdGVtcG9yYXJpbHkKKyAgIGFuZCBhdG9taWNhbGx5IHJlcGxhY2VkIHdpdGggdGhlIG9uZSBwcm92aWRlZCBhcyBwYXJhbWV0ZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBlcG9sbF9wd2FpdCAoaW50IF9fZXBmZCwgc3RydWN0IGVwb2xsX2V2ZW50ICpfX2V2ZW50cywKKwkJCWludCBfX21heGV2ZW50cywgaW50IF9fdGltZW91dCwKKwkJCV9fY29uc3QgX19zaWdzZXRfdCAqX19zcyk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvZXBvbGwuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZXJybm8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM5ZjRmYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2Vycm5vLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGVycm5vLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9ldmVudGZkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9ldmVudGZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0MmRmNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2V2ZW50ZmQuaApAQCAtMCwwICsxLDU0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19FVkVOVEZEX0gKKyNkZWZpbmUJX1NZU19FVkVOVEZEX0gJMQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKworLyogVHlwZSBmb3IgZXZlbnQgY291bnRlci4gICovCit0eXBlZGVmIHVpbnQ2NF90IGV2ZW50ZmRfdDsKKworLyogRmxhZ3MgZm9yIHNpZ25hbGZkLiAgKi8KK2VudW0KKyAgeworICAgIEVGRF9TRU1BUEhPUkUgPSAxLAorI2RlZmluZSBFRkRfU0VNQVBIT1JFIEVGRF9TRU1BUEhPUkUKKyAgICBFRkRfQ0xPRVhFQyA9IDAyMDAwMDAwLAorI2RlZmluZSBFRkRfQ0xPRVhFQyBFRkRfQ0xPRVhFQworICAgIEVGRF9OT05CTE9DSyA9IDA0MDAwCisjZGVmaW5lIEVGRF9OT05CTE9DSyBFRkRfTk9OQkxPQ0sKKyAgfTsKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJldHVybiBmaWxlIGRlc2NyaXB0b3IgZm9yIGdlbmVyaWMgZXZlbnQgY2hhbm5lbC4gIFNldCBpbml0aWFsCisgICB2YWx1ZSB0byBDT1VOVC4gICovCitleHRlcm4gaW50IGV2ZW50ZmQgKGludCBfX2NvdW50LCBpbnQgX19mbGFncykgX19USFJPVzsKKworLyogUmVhZCBldmVudCBjb3VudGVyIGFuZCBwb3NzaWJseSB3YWl0IGZvciBldmVudHMuICAqLworZXh0ZXJuIGludCBldmVudGZkX3JlYWQgKGludCBfX2ZkLCBldmVudGZkX3QgKl9fdmFsdWUpOworCisvKiBJbmNyZW1lbnQgZXZlbnQgY291bnRlci4gICovCitleHRlcm4gaW50IGV2ZW50ZmRfd3JpdGUgKGludCBfX2ZkLCBldmVudGZkX3QgX192YWx1ZSk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvZXZlbnRmZC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9mYW5vdGlmeS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZmFub3RpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjg1MDBjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZmFub3RpZnkuaApAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19GQU5PVElGWV9ICisjZGVmaW5lCV9TWVNfRkFOT1RJRllfSAkxCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9mYW5vdGlmeS5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGZhbm90aWZ5IGdyb3VwLiAgKi8KK2V4dGVybiBpbnQgZmFub3RpZnlfaW5pdCAodW5zaWduZWQgaW50IF9fZmxhZ3MsIHVuc2lnbmVkIGludCBfX2V2ZW50X2ZfZmxhZ3MpCisgIF9fVEhST1c7CisKKy8qIEFkZCwgcmVtb3ZlLCBvciBtb2RpZnkgYW4gZmFub3RpZnkgbWFyayBvbiBhIGZpbGVzeXN0ZW0gb2JqZWN0LiAgKi8KK2V4dGVybiBpbnQgZmFub3RpZnlfbWFyayAoaW50IF9fZmFub3RpZnlfZmQsIHVuc2lnbmVkIGludCBfX2ZsYWdzLAorCQkJICB1aW50NjRfdCBfX21hc2ssIGludCBfX2RmZCwgY29uc3QgY2hhciAqX19wYXRobmFtZSkKKyAgICAgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9mYW5vdGlmeS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9mY250bC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZmNudGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDMwNDU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZmNudGwuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8ZmNudGwuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2ZpbGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2IzNjM1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZmlsZS5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDk2LCA5NywgOTgsIDk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfRklMRV9ICisjZGVmaW5lCV9TWVNfRklMRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpZm5kZWYJX0ZDTlRMX0gKKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKworLyogQWx0ZXJuYXRlIG5hbWVzIGZvciB2YWx1ZXMgZm9yIHRoZSBXSEVOQ0UgYXJndW1lbnQgdG8gYGxzZWVrJy4KKyAgIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyBTRUVLX1NFVCwgU0VFS19DVVIsIGFuZCBTRUVLX0VORCwgcmVzcGVjdGl2ZWx5LiAgKi8KKyNpZm5kZWYgTF9TRVQKKyMgZGVmaW5lIExfU0VUCTAJLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyMgZGVmaW5lIExfSU5DUgkxCS8qIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KKyMgZGVmaW5lIExfWFRORAkyCS8qIFNlZWsgZnJvbSBlbmQgb2YgZmlsZS4gICovCisjZW5kaWYKKworCisvKiBPcGVyYXRpb25zIGZvciB0aGUgYGZsb2NrJyBjYWxsLiAgKi8KKyNkZWZpbmUJTE9DS19TSAkxCS8qIFNoYXJlZCBsb2NrLiAgKi8KKyNkZWZpbmUJTE9DS19FWAkyIAkvKiBFeGNsdXNpdmUgbG9jay4gICovCisjZGVmaW5lCUxPQ0tfVU4JOAkvKiBVbmxvY2suICAqLworCisvKiBDYW4gYmUgT1InZCBpbiB0byBvbmUgb2YgdGhlIGFib3ZlLiAgKi8KKyNkZWZpbmUJTE9DS19OQgk0CS8qIERvbid0IGJsb2NrIHdoZW4gbG9ja2luZy4gICovCisKKworLyogQXBwbHkgb3IgcmVtb3ZlIGFuIGFkdmlzb3J5IGxvY2ssIGFjY29yZGluZyB0byBPUEVSQVRJT04sCisgICBvbiB0aGUgZmlsZSBGRCByZWZlcnMgdG8uICAqLworZXh0ZXJuIGludCBmbG9jayAoaW50IF9fZmQsIGludCBfX29wZXJhdGlvbikgX19USFJPVzsKKworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL2ZpbGUuaCAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2ZzdWlkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9mc3VpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlY2IxOTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9mc3VpZC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0ZTVUlEX0gKKyNkZWZpbmUgX1NZU19GU1VJRF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogQ2hhbmdlIHVpZCB1c2VkIGZvciBmaWxlIGFjY2VzcyBjb250cm9sIHRvIFVJRCwgd2l0aG91dCBhZmZlY3RpbmcKKyAgIG90aGVyIHByaXZpbGVnZXMgKHN1Y2ggYXMgd2hvIGNhbiBzZW5kIHNpZ25hbHMgYXQgdGhlIHByb2Nlc3MpLiAgKi8KK2V4dGVybiBpbnQgc2V0ZnN1aWQgKF9fdWlkX3QgX191aWQpIF9fVEhST1c7CisKKy8qIERpdHRvIGZvciBncm91cCBpZC4gKi8KK2V4dGVybiBpbnQgc2V0ZnNnaWQgKF9fZ2lkX3QgX19naWQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBmc3VpZC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9nbW9uLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9nbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAyZjgzMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2dtb24uaApAQCAtMCwwICsxLDIwMSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpZ21vbi5oCTguMiAoQmVya2VsZXkpIDEvNC85NAorICovCisKKyNpZm5kZWYJX1NZU19HTU9OX0gKKyNkZWZpbmUJX1NZU19HTU9OX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKgorICogU2VlIGdtb25fb3V0LmggZm9yIGdtb24ub3V0IGZvcm1hdC4KKyAqLworCisvKiBzdHJ1Y3R1cmUgZW1pdHRlZCBieSAiZ2NjIC1hIi4gIFRoaXMgbXVzdCBtYXRjaCBzdHJ1Y3QgYmIgaW4KKyAgIGdjYy9saWJnY2MyLmMuICBJdCBpcyBPSyBmb3IgZ2NjIHRvIGRlY2xhcmUgYSBsb25nZXIgc3RydWN0dXJlIGFzCisgICBsb25nIGFzIHRoZSBtZW1iZXJzIGJlbG93IGFyZSBwcmVzZW50LiAgKi8KK3N0cnVjdCBfX2JiCit7CisgIGxvbmcJCQl6ZXJvX3dvcmQ7CisgIGNvbnN0IGNoYXIJCSpmaWxlbmFtZTsKKyAgbG9uZwkJCSpjb3VudHM7CisgIGxvbmcJCQluY291bnRzOworICBzdHJ1Y3QgX19iYgkJKm5leHQ7CisgIGNvbnN0IHVuc2lnbmVkIGxvbmcJKmFkZHJlc3NlczsKK307CisKK2V4dGVybiBzdHJ1Y3QgX19iYiAqX19iYl9oZWFkOworCisvKgorICogaGlzdG9ncmFtIGNvdW50ZXJzIGFyZSB1bnNpZ25lZCBzaG9ydHMgKGFjY29yZGluZyB0byB0aGUga2VybmVsKS4KKyAqLworI2RlZmluZQlISVNUQ09VTlRFUgl1bnNpZ25lZCBzaG9ydAorCisvKgorICogZnJhY3Rpb24gb2YgdGV4dCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgaGlzdG9ncmFtIGNvdW50ZXJzIGhlcmUsIDEvMgorICovCisjZGVmaW5lCUhJU1RGUkFDVElPTgkyCisKKy8qCisgKiBGcmFjdGlvbiBvZiB0ZXh0IHNwYWNlIHRvIGFsbG9jYXRlIGZvciBmcm9tIGhhc2ggYnVja2V0cy4KKyAqIFRoZSB2YWx1ZSBvZiBIQVNIRlJBQ1RJT04gaXMgYmFzZWQgb24gdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzCisgKiBvZiBzZXBhcmF0aW9uIGJldHdlZW4gdHdvIHN1YnJvdXRpbmUgY2FsbCBwb2ludHMgaW4gdGhlIG9iamVjdCBjb2RlLgorICogR2l2ZW4gTUlOX1NVQlJfU0VQQVJBVElPTiBieXRlcyBvZiBzZXBhcmF0aW9uIHRoZSB2YWx1ZSBvZgorICogSEFTSEZSQUNUSU9OIGlzIGNhbGN1bGF0ZWQgYXM6CisgKgorICoJSEFTSEZSQUNUSU9OID0gTUlOX1NVQlJfU0VQQVJBVElPTiAvICgyICogc2l6ZW9mKHNob3J0KSAtIDEpOworICoKKyAqIEZvciBleGFtcGxlLCBvbiB0aGUgVkFYLCB0aGUgc2hvcnRlc3QgdHdvIGNhbGwgc2VxdWVuY2UgaXM6CisgKgorICoJY2FsbHMJJDAsKHIwKQorICoJY2FsbHMJJDAsKHIwKQorICoKKyAqIHdoaWNoIGlzIHNlcGFyYXRlZCBieSBvbmx5IHRocmVlIGJ5dGVzLCB0aHVzIEhBU0hGUkFDVElPTiBpcworICogY2FsY3VsYXRlZCBhczoKKyAqCisgKglIQVNIRlJBQ1RJT04gPSAzIC8gKDIgKiAyIC0gMSkgPSAxCisgKgorICogTm90ZSB0aGF0IHRoZSBkaXZpc2lvbiBhYm92ZSByb3VuZHMgZG93biwgdGh1cyBpZiBNSU5fU1VCUl9GUkFDVElPTgorICogaXMgbGVzcyB0aGFuIHRocmVlLCB0aGlzIGFsZ29yaXRobSB3aWxsIG5vdCB3b3JrIQorICoKKyAqIEluIHByYWN0aWNlLCBob3dldmVyLCBjYWxsIGluc3RydWN0aW9ucyBhcmUgcmFyZWx5IGF0IGEgbWluaW1hbAorICogZGlzdGFuY2UuICBIZW5jZSwgd2Ugd2lsbCBkZWZpbmUgSEFTSEZSQUNUSU9OIHRvIGJlIDIgYWNyb3NzIGFsbAorICogYXJjaGl0ZWN0dXJlcy4gIFRoaXMgc2F2ZXMgYSByZWFzb25hYmxlIGFtb3VudCBvZiBzcGFjZSBmb3IKKyAqIHByb2ZpbGluZyBkYXRhIHN0cnVjdHVyZXMgd2l0aG91dCAoaW4gcHJhY3RpY2UpIHNhY3JpZmljaW5nCisgKiBhbnkgZ3JhbnVsYXJpdHkuCisgKi8KKyNkZWZpbmUJSEFTSEZSQUNUSU9OCTIKKworLyoKKyAqIFBlcmNlbnQgb2YgdGV4dCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgdG9zdHJ1Y3RzLgorICogVGhpcyBpcyBhIGhldXJpc3RpYzsgd2Ugd2lsbCBmYWlsIHdpdGggYSB3YXJuaW5nIHdoZW4gcHJvZmlsaW5nIHByb2dyYW1zCisgKiB3aXRoIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YgdmVyeSBzbWFsbCBmdW5jdGlvbnMsIGJ1dCB0aGF0J3MKKyAqIG5vcm1hbGx5IE9LLgorICogMiBpcyBwcm9iYWJseSBzdGlsbCBhIGdvb2QgdmFsdWUgZm9yIG5vcm1hbCBwcm9ncmFtcy4KKyAqIFByb2ZpbGluZyBhIHRlc3QgY2FzZSB3aXRoIDY0MDAwIHNtYWxsIGZ1bmN0aW9ucyB3aWxsIHdvcmsgaWYKKyAqIHlvdSByYWlzZSB0aGlzIHZhbHVlIHRvIDMgYW5kIGxpbmsgc3RhdGljYWxseSAod2hpY2ggYmxvYXRzIHRoZQorICogdGV4dCBzaXplLCB0aHVzIHJhaXNpbmcgdGhlIG51bWJlciBvZiBhcmNzIGV4cGVjdGVkIGJ5IHRoZSBoZXVyaXN0aWMpLgorICovCisjZGVmaW5lIEFSQ0RFTlNJVFkJMworCisvKgorICogQWx3YXlzIGFsbG9jYXRlIGF0IGxlYXN0IHRoaXMgbWFueSB0b3N0cnVjdHMuICBUaGlzCisgKiBoaWRlcyB0aGUgaW5hZGVxdWFjeSBvZiB0aGUgQVJDREVOU0lUWSBoZXVyaXN0aWMsIGF0IGxlYXN0CisgKiBmb3Igc21hbGwgcHJvZ3JhbXMuCisgKi8KKyNkZWZpbmUgTUlOQVJDUwkJNTAKKworLyoKKyAqIFRoZSB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IGluZGljZXMgaW50byBnbW9ucGFyYW0udG9zW10uCisgKi8KKyNkZWZpbmUJQVJDSU5ERVgJdV9sb25nCisKKy8qIAorICogTWF4aW11bSBudW1iZXIgb2YgYXJjcyB3ZSB3YW50IHRvIGFsbG93LgorICogVXNlZCB0byBiZSBtYXggcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiBBUkNJTkRFWCBtaW51cyAyLCBidXQgbm93IAorICogdGhhdCBBUkNJTkRFWCBpcyBhIGxvbmcsIHRoYXQncyB0b28gbGFyZ2U7IHdlIGRvbid0IHJlYWxseSB3YW50IAorICogdG8gYWxsb3cgYSA0OCBnaWdhYnl0ZSB0YWJsZS4KKyAqIFRoZSBvbGQgdmFsdWUgb2YgMTw8MTYgd2Fzbid0IGhpZ2ggZW5vdWdoIGluIHByYWN0aWNlIGZvciBsYXJnZSBDKysKKyAqIHByb2dyYW1zOyB3aWxsIDE8PDIwIGJlIGFkZXF1YXRlIGZvciBsb25nPyAgRklYTUUKKyAqLworI2RlZmluZSBNQVhBUkNTCQkoMSA8PCAyMCkKKworc3RydWN0IHRvc3RydWN0IHsKKwl1X2xvbmcJCXNlbGZwYzsKKwlsb25nCQljb3VudDsKKwlBUkNJTkRFWAlsaW5rOworfTsKKworLyoKKyAqIGEgcmF3IGFyYywgd2l0aCBwb2ludGVycyB0byB0aGUgY2FsbGluZyBzaXRlIGFuZAorICogdGhlIGNhbGxlZCBzaXRlIGFuZCBhIGNvdW50LgorICovCitzdHJ1Y3QgcmF3YXJjIHsKKwl1X2xvbmcJcmF3X2Zyb21wYzsKKwl1X2xvbmcJcmF3X3NlbGZwYzsKKwlsb25nCXJhd19jb3VudDsKK307CisKKy8qCisgKiBnZW5lcmFsIHJvdW5kaW5nIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBST1VORERPV04oeCx5KQkoKCh4KS8oeSkpKih5KSkKKyNkZWZpbmUgUk9VTkRVUCh4LHkpCSgoKCh4KSsoeSktMSkvKHkpKSooeSkpCisKKy8qCisgKiBUaGUgcHJvZmlsaW5nIGRhdGEgc3RydWN0dXJlcyBhcmUgaG91c2VkIGluIHRoaXMgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgZ21vbnBhcmFtIHsKKwlsb25nIGludAlzdGF0ZTsKKwl1X3Nob3J0CQkqa2NvdW50OworCXVfbG9uZwkJa2NvdW50c2l6ZTsKKwlBUkNJTkRFWAkqZnJvbXM7CisJdV9sb25nCQlmcm9tc3NpemU7CisJc3RydWN0IHRvc3RydWN0CSp0b3M7CisJdV9sb25nCQl0b3NzaXplOworCWxvbmcJCXRvbGltaXQ7CisJdV9sb25nCQlsb3dwYzsKKwl1X2xvbmcJCWhpZ2hwYzsKKwl1X2xvbmcJCXRleHRzaXplOworCXVfbG9uZwkJaGFzaGZyYWN0aW9uOworCWxvbmcJCWxvZ19oYXNoZnJhY3Rpb247Cit9OworCisvKgorICogUG9zc2libGUgc3RhdGVzIG9mIHByb2ZpbGluZy4KKyAqLworI2RlZmluZQlHTU9OX1BST0ZfT04JMAorI2RlZmluZQlHTU9OX1BST0ZfQlVTWQkxCisjZGVmaW5lCUdNT05fUFJPRl9FUlJPUgkyCisjZGVmaW5lCUdNT05fUFJPRl9PRkYJMworCisvKgorICogU3lzY3RsIGRlZmluaXRpb25zIGZvciBleHRyYWN0aW5nIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBrZXJuZWwuCisgKi8KKyNkZWZpbmUJR1BST0ZfU1RBVEUJMAkvKiBpbnQ6IHByb2ZpbGluZyBlbmFibGluZyB2YXJpYWJsZSAqLworI2RlZmluZQlHUFJPRl9DT1VOVAkxCS8qIHN0cnVjdDogcHJvZmlsZSB0aWNrIGNvdW50IGJ1ZmZlciAqLworI2RlZmluZQlHUFJPRl9GUk9NUwkyCS8qIHN0cnVjdDogZnJvbSBsb2NhdGlvbiBoYXNoIGJ1Y2tldCAqLworI2RlZmluZQlHUFJPRl9UT1MJMwkvKiBzdHJ1Y3Q6IGRlc3RpbmF0aW9uL2NvdW50IHN0cnVjdHVyZSAqLworI2RlZmluZQlHUFJPRl9HTU9OUEFSQU0JNAkvKiBzdHJ1Y3Q6IHByb2ZpbGluZyBwYXJhbWV0ZXJzIChzZWUgYWJvdmUpICovCisKK19fQkVHSU5fREVDTFMKKworLyogU2V0IHVwIGRhdGEgc3RydWN0dXJlcyBhbmQgc3RhcnQgcHJvZmlsaW5nLiAgKi8KK2V4dGVybiB2b2lkIF9fbW9uc3RhcnR1cCAodV9sb25nIF9fbG93cGMsIHVfbG9uZyBfX2hpZ2hwYykgX19USFJPVzsKK2V4dGVybiB2b2lkIG1vbnN0YXJ0dXAgKHVfbG9uZyBfX2xvd3BjLCB1X2xvbmcgX19oaWdocGMpIF9fVEhST1c7CisKKy8qIENsZWFuIHVwIHByb2ZpbGluZyBhbmQgd3JpdGUgb3V0IGdtb24ub3V0LiAgKi8KK2V4dGVybiB2b2lkIF9tY2xlYW51cCAodm9pZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9nbW9uLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2dtb25fb3V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9nbW9uX291dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYTA5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9nbW9uX291dC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyIDxkYXZpZG1AY3MuYXJpem9uYS5lZHU+LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIGdtb24ub3V0IGZpbGVzLiAgSXQgc2hvdWxkIGhhdmUKKyAgIGFzIGZldyBleHRlcm5hbCBkZXBlbmRlbmNpZXMgYXMgcG9zc2libGUgYXMgaXQgaXMgZ29pbmcgdG8gYmUgaW5jbHVkZWQKKyAgIGluIG1hbnkgZGlmZmVyZW50IHByb2dyYW1zLiAgVGhhdCBpcywgbWluaW1pemUgdGhlIG51bWJlciBvZiAjaW5jbHVkZSdzLgorCisgICBBIGdtb24ub3V0IGZpbGUgY29uc2lzdHMgb2YgYSBoZWFkZXIgKGRlZmluZWQgYnkgZ21vbl9oZHIpIGZvbGxvd2VkIGJ5CisgICBhIHNlcXVlbmNlIG9mIHJlY29yZHMuICBFYWNoIHJlY29yZCBzdGFydHMgd2l0aCBhIG9uZS1ieXRlIHRhZworICAgaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgcmVjb3JkcywgZm9sbG93ZWQgYnkgcmVjb3JkcyBzcGVjaWZpYyBkYXRhLiAqLworCisjaWZuZGVmIF9TWVNfR01PTl9PVVRfSAorI2RlZmluZSBfU1lTX0dNT05fT1VUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZQlHTU9OX01BR0lDCSJnbW9uIgkvKiBtYWdpYyBjb29raWUgKi8KKyNkZWZpbmUgR01PTl9WRVJTSU9OCTEJLyogdmVyc2lvbiBudW1iZXIgKi8KKworLyogRm9yIHByb2ZpbGluZyBzaGFyZWQgb2JqZWN0IHdlIG5lZWQgYSBuZXcgZm9ybWF0LiAgKi8KKyNkZWZpbmUgR01PTl9TSE9CSl9WRVJTSU9OCTB4MWZmZmYKKworX19CRUdJTl9ERUNMUworCisvKgorICogUmF3IGhlYWRlciBhcyBpdCBhcHBlYXJzIG9uIGZpbGUgKHdpdGhvdXQgcGFkZGluZykuICBUaGlzIGhlYWRlcgorICogYWx3YXlzIGNvbWVzIGZpcnN0IGluIGdtb24ub3V0IGFuZCBpcyB0aGVuIGZvbGxvd2VkIGJ5IGEgc2VyaWVzCisgKiByZWNvcmRzIGRlZmluZWQgYmVsb3cuCisgKi8KK3N0cnVjdCBnbW9uX2hkcgorICB7CisgICAgY2hhciBjb29raWVbNF07CisgICAgY2hhciB2ZXJzaW9uWzRdOworICAgIGNoYXIgc3BhcmVbMyAqIDRdOworICB9OworCisvKiB0eXBlcyBvZiByZWNvcmRzIGluIHRoaXMgZmlsZTogKi8KK3R5cGVkZWYgZW51bQorICB7CisgICAgR01PTl9UQUdfVElNRV9ISVNUID0gMCwKKyAgICBHTU9OX1RBR19DR19BUkMgPSAxLAorICAgIEdNT05fVEFHX0JCX0NPVU5UID0gMgorICB9IEdNT05fUmVjb3JkX1RhZzsKKworc3RydWN0IGdtb25faGlzdF9oZHIKKyAgeworICAgIGNoYXIgbG93X3BjW3NpemVvZiAoY2hhciAqKV07CS8qIGJhc2UgcGMgYWRkcmVzcyBvZiBzYW1wbGUgYnVmZmVyICovCisgICAgY2hhciBoaWdoX3BjW3NpemVvZiAoY2hhciAqKV07CS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCisgICAgY2hhciBoaXN0X3NpemVbNF07CQkJLyogc2l6ZSBvZiBzYW1wbGUgYnVmZmVyICovCisgICAgY2hhciBwcm9mX3JhdGVbNF07CQkJLyogcHJvZmlsaW5nIGNsb2NrIHJhdGUgKi8KKyAgICBjaGFyIGRpbWVuWzE1XTsJCQkvKiBwaHlzLiBkaW0uLCB1c3VhbGx5ICJzZWNvbmRzIiAqLworICAgIGNoYXIgZGltZW5fYWJicmV2OwkJCS8qIHVzdWFsbHkgJ3MnIGZvciAic2Vjb25kcyIgKi8KKyAgfTsKKworc3RydWN0IGdtb25fY2dfYXJjX3JlY29yZAorICB7CisgICAgY2hhciBmcm9tX3BjW3NpemVvZiAoY2hhciAqKV07CS8qIGFkZHJlc3Mgd2l0aGluIGNhbGxlcidzIGJvZHkgKi8KKyAgICBjaGFyIHNlbGZfcGNbc2l6ZW9mIChjaGFyICopXTsJLyogYWRkcmVzcyB3aXRoaW4gY2FsbGVlJ3MgYm9keSAqLworICAgIGNoYXIgY291bnRbNF07CQkJLyogbnVtYmVyIG9mIGFyYyB0cmF2ZXJzYWxzICovCisgIH07CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvZ21vbl9vdXQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvaW5vdGlmeS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvaW5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTk5OWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9pbm90aWZ5LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0lOT1RJRllfSAorI2RlZmluZQlfU1lTX0lOT1RJRllfSAkxCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisvKiBGbGFncyBmb3IgdGhlIHBhcmFtZXRlciBvZiBpbm90aWZ5X2luaXQxLiAgKi8KK2VudW0KKyAgeworICAgIElOX0NMT0VYRUMgPSAwMjAwMDAwMCwKKyNkZWZpbmUgSU5fQ0xPRVhFQyBJTl9DTE9FWEVDCisgICAgSU5fTk9OQkxPQ0sgPSAwNDAwMAorI2RlZmluZSBJTl9OT05CTE9DSyBJTl9OT05CTE9DSworICB9OworCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGFuIGlub3RpZnkgZXZlbnQuICAqLworc3RydWN0IGlub3RpZnlfZXZlbnQKK3sKKyAgaW50IHdkOwkJLyogV2F0Y2ggZGVzY3JpcHRvci4gICovCisgIHVpbnQzMl90IG1hc2s7CS8qIFdhdGNoIG1hc2suICAqLworICB1aW50MzJfdCBjb29raWU7CS8qIENvb2tpZSB0byBzeW5jaHJvbml6ZSB0d28gZXZlbnRzLiAgKi8KKyAgdWludDMyX3QgbGVuOwkJLyogTGVuZ3RoIChpbmNsdWRpbmcgTlVMcykgb2YgbmFtZS4gICovCisgIGNoYXIgbmFtZSBfX2ZsZXhhcnI7CS8qIE5hbWUuICAqLworfTsKKworCisvKiBTdXBwb3J0ZWQgZXZlbnRzIHN1aXRhYmxlIGZvciBNQVNLIHBhcmFtZXRlciBvZiBJTk9USUZZX0FERF9XQVRDSC4gICovCisjZGVmaW5lIElOX0FDQ0VTUwkgMHgwMDAwMDAwMQkvKiBGaWxlIHdhcyBhY2Nlc3NlZC4gICovCisjZGVmaW5lIElOX01PRElGWQkgMHgwMDAwMDAwMgkvKiBGaWxlIHdhcyBtb2RpZmllZC4gICovCisjZGVmaW5lIElOX0FUVFJJQgkgMHgwMDAwMDAwNAkvKiBNZXRhZGF0YSBjaGFuZ2VkLiAgKi8KKyNkZWZpbmUgSU5fQ0xPU0VfV1JJVEUJIDB4MDAwMDAwMDgJLyogV3JpdHRhYmxlIGZpbGUgd2FzIGNsb3NlZC4gICovCisjZGVmaW5lIElOX0NMT1NFX05PV1JJVEUgMHgwMDAwMDAxMAkvKiBVbndyaXR0YWJsZSBmaWxlIGNsb3NlZC4gICovCisjZGVmaW5lIElOX0NMT1NFCSAoSU5fQ0xPU0VfV1JJVEUgfCBJTl9DTE9TRV9OT1dSSVRFKSAvKiBDbG9zZS4gICovCisjZGVmaW5lIElOX09QRU4JCSAweDAwMDAwMDIwCS8qIEZpbGUgd2FzIG9wZW5lZC4gICovCisjZGVmaW5lIElOX01PVkVEX0ZST00JIDB4MDAwMDAwNDAJLyogRmlsZSB3YXMgbW92ZWQgZnJvbSBYLiAgKi8KKyNkZWZpbmUgSU5fTU9WRURfVE8gICAgICAweDAwMDAwMDgwCS8qIEZpbGUgd2FzIG1vdmVkIHRvIFkuICAqLworI2RlZmluZSBJTl9NT1ZFCQkgKElOX01PVkVEX0ZST00gfCBJTl9NT1ZFRF9UTykgLyogTW92ZXMuICAqLworI2RlZmluZSBJTl9DUkVBVEUJIDB4MDAwMDAxMDAJLyogU3ViZmlsZSB3YXMgY3JlYXRlZC4gICovCisjZGVmaW5lIElOX0RFTEVURQkgMHgwMDAwMDIwMAkvKiBTdWJmaWxlIHdhcyBkZWxldGVkLiAgKi8KKyNkZWZpbmUgSU5fREVMRVRFX1NFTEYJIDB4MDAwMDA0MDAJLyogU2VsZiB3YXMgZGVsZXRlZC4gICovCisjZGVmaW5lIElOX01PVkVfU0VMRgkgMHgwMDAwMDgwMAkvKiBTZWxmIHdhcyBtb3ZlZC4gICovCisKKy8qIEV2ZW50cyBzZW50IGJ5IHRoZSBrZXJuZWwuICAqLworI2RlZmluZSBJTl9VTk1PVU5UCSAweDAwMDAyMDAwCS8qIEJhY2tpbmcgZnMgd2FzIHVubW91bnRlZC4gICovCisjZGVmaW5lIElOX1FfT1ZFUkZMT1cJIDB4MDAwMDQwMDAJLyogRXZlbnQgcXVldWVkIG92ZXJmbG93ZWQuICAqLworI2RlZmluZSBJTl9JR05PUkVECSAweDAwMDA4MDAwCS8qIEZpbGUgd2FzIGlnbm9yZWQuICAqLworCisvKiBIZWxwZXIgZXZlbnRzLiAgKi8KKyNkZWZpbmUgSU5fQ0xPU0UJIChJTl9DTE9TRV9XUklURSB8IElOX0NMT1NFX05PV1JJVEUpCS8qIENsb3NlLiAgKi8KKyNkZWZpbmUgSU5fTU9WRQkJIChJTl9NT1ZFRF9GUk9NIHwgSU5fTU9WRURfVE8pCQkvKiBNb3Zlcy4gICovCisKKy8qIFNwZWNpYWwgZmxhZ3MuICAqLworI2RlZmluZSBJTl9PTkxZRElSCSAweDAxMDAwMDAwCS8qIE9ubHkgd2F0Y2ggdGhlIHBhdGggaWYgaXQgaXMgYQorCQkJCQkgICBkaXJlY3RvcnkuICAqLworI2RlZmluZSBJTl9ET05UX0ZPTExPVwkgMHgwMjAwMDAwMAkvKiBEbyBub3QgZm9sbG93IGEgc3ltIGxpbmsuICAqLworI2RlZmluZSBJTl9FWENMX1VOTElOSwkgMHgwNDAwMDAwMAkvKiBFeGNsdWRlIGV2ZW50cyBvbiB1bmxpbmtlZAorCQkJCQkgICBvYmplY3RzLiAgKi8KKyNkZWZpbmUgSU5fTUFTS19BREQJIDB4MjAwMDAwMDAJLyogQWRkIHRvIHRoZSBtYXNrIG9mIGFuIGFscmVhZHkKKwkJCQkJICAgZXhpc3Rpbmcgd2F0Y2guICAqLworI2RlZmluZSBJTl9JU0RJUgkgMHg0MDAwMDAwMAkvKiBFdmVudCBvY2N1cnJlZCBhZ2FpbnN0IGRpci4gICovCisjZGVmaW5lIElOX09ORVNIT1QJIDB4ODAwMDAwMDAJLyogT25seSBzZW5kIGV2ZW50IG9uY2UuICAqLworCisvKiBBbGwgZXZlbnRzIHdoaWNoIGEgcHJvZ3JhbSBjYW4gd2FpdCBvbi4gICovCisjZGVmaW5lIElOX0FMTF9FVkVOVFMJIChJTl9BQ0NFU1MgfCBJTl9NT0RJRlkgfCBJTl9BVFRSSUIgfCBJTl9DTE9TRV9XUklURSAgXAorCQkJICB8IElOX0NMT1NFX05PV1JJVEUgfCBJTl9PUEVOIHwgSU5fTU9WRURfRlJPTQkgICAgICBcCisJCQkgIHwgSU5fTU9WRURfVE8gfCBJTl9DUkVBVEUgfCBJTl9ERUxFVEUJCSAgICAgIFwKKwkJCSAgfCBJTl9ERUxFVEVfU0VMRiB8IElOX01PVkVfU0VMRikKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBpbm90aWZ5IGluc3RhbmNlLiAgKi8KK2V4dGVybiBpbnQgaW5vdGlmeV9pbml0ICh2b2lkKSBfX1RIUk9XOworCisvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgaW5vdGlmeSBpbnN0YW5jZS4gICovCitleHRlcm4gaW50IGlub3RpZnlfaW5pdDEgKGludCBfX2ZsYWdzKSBfX1RIUk9XOworCisvKiBBZGQgd2F0Y2ggb2Ygb2JqZWN0IE5BTUUgdG8gaW5vdGlmeSBpbnN0YW5jZSBGRC4gIE5vdGlmeSBhYm91dAorICAgZXZlbnRzIHNwZWNpZmllZCBieSBNQVNLLiAgKi8KK2V4dGVybiBpbnQgaW5vdGlmeV9hZGRfd2F0Y2ggKGludCBfX2ZkLCBjb25zdCBjaGFyICpfX25hbWUsIHVpbnQzMl90IF9fbWFzaykKKyAgX19USFJPVzsKKworLyogUmVtb3ZlIHRoZSB3YXRjaCBzcGVjaWZpZWQgYnkgV0QgZnJvbSB0aGUgaW5vdGlmeSBpbnN0YW5jZSBGRC4gICovCitleHRlcm4gaW50IGlub3RpZnlfcm1fd2F0Y2ggKGludCBfX2ZkLCBpbnQgX193ZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9pbm90aWZ5LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2lvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOGMyY2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9pby5oCkBAIC0wLDAgKzEsMTg1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDIwMDAsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19JT19ICisjZGVmaW5lCV9TWVNfSU9fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIElmIFRVUk5fT04gaXMgVFJVRSwgcmVxdWVzdCBmb3IgcGVybWlzc2lvbiB0byBkbyBkaXJlY3QgaS9vIG9uIHRoZQorICAgcG9ydCBudW1iZXJzIGluIHRoZSByYW5nZSBbRlJPTSxGUk9NK05VTS0xXS4gIE90aGVyd2lzZSwgdHVybiBJL08KKyAgIHBlcm1pc3Npb24gb2ZmIGZvciB0aGF0IHJhbmdlLiAgVGhpcyBjYWxsIHJlcXVpcmVzIHJvb3QgcHJpdmlsZWdlcy4KKworICAgUG9ydGFiaWxpdHkgbm90ZTogbm90IGFsbCBMaW51eCBwbGF0Zm9ybXMgc3VwcG9ydCB0aGlzIGNhbGwuICBNb3N0CisgICBwbGF0Zm9ybXMgYmFzZWQgb24gdGhlIFBDIEkvTyBhcmNoaXRlY3R1cmUgcHJvYmFibHkgd2lsbCwgaG93ZXZlci4KKyAgIEUuZy4sIExpbnV4L0FscGhhIGZvciBBbHBoYSBQQ3Mgc3VwcG9ydHMgdGhpcy4gICovCitleHRlcm4gaW50IGlvcGVybSAodW5zaWduZWQgbG9uZyBpbnQgX19mcm9tLCB1bnNpZ25lZCBsb25nIGludCBfX251bSwKKyAgICAgICAgICAgICAgICAgICBpbnQgX190dXJuX29uKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIEkvTyBwcml2aWxlZ2UgbGV2ZWwgdG8gTEVWRUwuICBJZiBMRVZFTD4zLCBwZXJtaXNzaW9uIHRvCisgICBhY2Nlc3MgYW55IEkvTyBwb3J0IGlzIGdyYW50ZWQuICBUaGlzIGNhbGwgcmVxdWlyZXMgcm9vdAorICAgcHJpdmlsZWdlcy4gKi8KK2V4dGVybiBpbnQgaW9wbCAoaW50IF9fbGV2ZWwpIF9fVEhST1c7CisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGNoYXIKK2luYiAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgdW5zaWduZWQgY2hhciBfdjsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImluYiAldzEsJTAiOiI9YSIgKF92KToiTmQiIChfX3BvcnQpKTsKKyAgcmV0dXJuIF92OworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgY2hhcgoraW5iX3AgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIHVuc2lnbmVkIGNoYXIgX3Y7CisKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpbmIgJXcxLCUwXG5vdXRiICUlYWwsJDB4ODAiOiI9YSIgKF92KToiTmQiIChfX3BvcnQpKTsKKyAgcmV0dXJuIF92OworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50CitpbncgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIHVuc2lnbmVkIHNob3J0IF92OworCisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiaW53ICV3MSwlMCI6Ij1hIiAoX3YpOiJOZCIgKF9fcG9ydCkpOworICByZXR1cm4gX3Y7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQKK2lud19wICh1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICB1bnNpZ25lZCBzaG9ydCBpbnQgX3Y7CisKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpbncgJXcxLCUwXG5vdXRiICUlYWwsJDB4ODAiOiI9YSIgKF92KToiTmQiIChfX3BvcnQpKTsKKyAgcmV0dXJuIF92OworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitpbmwgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIHVuc2lnbmVkIGludCBfdjsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlubCAldzEsJTAiOiI9YSIgKF92KToiTmQiIChfX3BvcnQpKTsKKyAgcmV0dXJuIF92OworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitpbmxfcCAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgdW5zaWduZWQgaW50IF92OworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlubCAldzEsJTBcbm91dGIgJSVhbCwkMHg4MCI6Ij1hIiAoX3YpCisJCQk6Ik5kIiAoX19wb3J0KSk7CisgIHJldHVybiBfdjsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dGIgKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgib3V0YiAlYjAsJXcxIjogOiJhIiAodmFsdWUpLCAiTmQiIChfX3BvcnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dGJfcCAodW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJvdXRiICViMCwldzFcbm91dGIgJSVhbCwkMHg4MCI6IDoiYSIgKHZhbHVlKSwKKwkJCSJOZCIgKF9fcG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0dyAodW5zaWduZWQgc2hvcnQgaW50IHZhbHVlLCB1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm91dHcgJXcwLCV3MSI6IDoiYSIgKHZhbHVlKSwgIk5kIiAoX19wb3J0KSk7CisKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dHdfcCAodW5zaWduZWQgc2hvcnQgaW50IHZhbHVlLCB1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm91dHcgJXcwLCV3MVxub3V0YiAlJWFsLCQweDgwIjogOiJhIiAodmFsdWUpLAorCQkJIk5kIiAoX19wb3J0KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitvdXRsICh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgib3V0bCAlMCwldzEiOiA6ImEiICh2YWx1ZSksICJOZCIgKF9fcG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0bF9wICh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgib3V0bCAlMCwldzFcbm91dGIgJSVhbCwkMHg4MCI6IDoiYSIgKHZhbHVlKSwKKwkJCSJOZCIgKF9fcG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAoraW5zYiAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCwgdm9pZCAqX19hZGRyLCB1bnNpZ25lZCBsb25nIGludCBfX2NvdW50KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsZCA7IHJlcCA7IGluc2IiOiI9RCIgKF9fYWRkciksICI9YyIgKF9fY291bnQpCisJCQk6ImQiIChfX3BvcnQpLCAiMCIgKF9fYWRkciksICIxIiAoX19jb3VudCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAoraW5zdyAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCwgdm9pZCAqX19hZGRyLCB1bnNpZ25lZCBsb25nIGludCBfX2NvdW50KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsZCA7IHJlcCA7IGluc3ciOiI9RCIgKF9fYWRkciksICI9YyIgKF9fY291bnQpCisJCQk6ImQiIChfX3BvcnQpLCAiMCIgKF9fYWRkciksICIxIiAoX19jb3VudCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAoraW5zbCAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCwgdm9pZCAqX19hZGRyLCB1bnNpZ25lZCBsb25nIGludCBfX2NvdW50KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsZCA7IHJlcCA7IGluc2wiOiI9RCIgKF9fYWRkciksICI9YyIgKF9fY291bnQpCisJCQk6ImQiIChfX3BvcnQpLCAiMCIgKF9fYWRkciksICIxIiAoX19jb3VudCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0c2IgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQsIGNvbnN0IHZvaWQgKl9fYWRkciwKKyAgICAgICB1bnNpZ25lZCBsb25nIGludCBfX2NvdW50KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsZCA7IHJlcCA7IG91dHNiIjoiPVMiIChfX2FkZHIpLCAiPWMiIChfX2NvdW50KQorCQkJOiJkIiAoX19wb3J0KSwgIjAiIChfX2FkZHIpLCAiMSIgKF9fY291bnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dHN3ICh1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0LCBjb25zdCB2b2lkICpfX2FkZHIsCisgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgX19jb3VudCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBvdXRzdyI6Ij1TIiAoX19hZGRyKSwgIj1jIiAoX19jb3VudCkKKwkJCToiZCIgKF9fcG9ydCksICIwIiAoX19hZGRyKSwgIjEiIChfX2NvdW50KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitvdXRzbCAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCwgY29uc3Qgdm9pZCAqX19hZGRyLAorICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fY291bnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkIDsgcmVwIDsgb3V0c2wiOiI9UyIgKF9fYWRkciksICI9YyIgKF9fY291bnQpCisJCQk6ImQiIChfX3BvcnQpLCAiMCIgKF9fYWRkciksICIxIiAoX19jb3VudCkpOworfQorCisjZW5kaWYJLyogR05VIEMgKi8KKworX19FTkRfREVDTFMKKyNlbmRpZiAvKiBfU1lTX0lPX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2lvY3RsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOGEwZjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9pb2N0bC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTYsIDk4LCA5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0lPQ1RMX0gKKyNkZWZpbmUJX1NZU19JT0NUTF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogR2V0IHRoZSBsaXN0IG9mIGBpb2N0bCcgcmVxdWVzdHMgYW5kIHJlbGF0ZWQgY29uc3RhbnRzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL2lvY3Rscy5oPgorCisvKiBEZWZpbmUgc29tZSB0eXBlcyB1c2VkIGJ5IGBpb2N0bCcgcmVxdWVzdHMuICAqLworI2luY2x1ZGUgPGJpdHMvaW9jdGwtdHlwZXMuaD4KKworLyogT24gYSBVbml4IHN5c3RlbSwgdGhlIHN5c3RlbSA8c3lzL2lvY3RsLmg+IHByb2JhYmx5IGRlZmluZXMgc29tZSBvZgorICAgdGhlIHN5bWJvbHMgd2UgZGVmaW5lIGluIDxzeXMvdHR5ZGVmYXVsdHMuaD4gKHVzdWFsbHkgd2l0aCB0aGUgc2FtZQorICAgdmFsdWVzKS4gIFRoZSBjb2RlIHRvIGdlbmVyYXRlIDxiaXRzL2lvY3Rscy5oPiBoYXMgb21pdHRlZCB0aGVzZQorICAgc3ltYm9scyB0byBhdm9pZCB0aGUgY29uZmxpY3QsIGJ1dCBhIFVuaXggcHJvZ3JhbSBleHBlY3RzIDxzeXMvaW9jdGwuaD4KKyAgIHRvIGRlZmluZSB0aGVtLCBzbyB3ZSBtdXN0IGluY2x1ZGUgPHN5cy90dHlkZWZhdWx0cy5oPiBoZXJlLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHR5ZGVmYXVsdHMuaD4KKworLyogUGVyZm9ybSB0aGUgSS9PIGNvbnRyb2wgb3BlcmF0aW9uIHNwZWNpZmllZCBieSBSRVFVRVNUIG9uIEZELgorICAgT25lIGFyZ3VtZW50IG1heSBmb2xsb3c7IGl0cyBwcmVzZW5jZSBhbmQgdHlwZSBkZXBlbmQgb24gUkVRVUVTVC4KKyAgIFJldHVybiB2YWx1ZSBkZXBlbmRzIG9uIFJFUVVFU1QuICBVc3VhbGx5IC0xIGluZGljYXRlcyBlcnJvci4gICovCitleHRlcm4gaW50IGlvY3RsIChpbnQgX19mZCwgdW5zaWduZWQgbG9uZyBpbnQgX19yZXF1ZXN0LCAuLi4pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvaW9jdGwuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvaXBjLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9pcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThjMDllCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvaXBjLmgKQEAgLTAsMCArMSw1OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywxOTk5LDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19JUENfSAorI2RlZmluZSBfU1lTX0lQQ19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpZiAhZGVmaW5lZCBfX1VTRV9TVklEICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOICYmIF9fR05VQ19fID49IDIKKyMgd2FybmluZyAiRmlsZXMgdXNpbmcgdGhpcyBoZWFkZXIgbXVzdCBiZSBjb21waWxlZCB3aXRoIF9TVklEX1NPVVJDRSBvciBfWE9QRU5fU09VUkNFIgorI2VuZGlmCisKKy8qIEdldCBzeXN0ZW0gZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYHN0cnVjdCBpcGNfcGVybScgYW5kIG1vcmUuICAqLworI2luY2x1ZGUgPGJpdHMvaXBjdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL2lwYy5oPgorCisjaWZuZGVmIF9fdWlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3VpZF90IHVpZF90OworIyBkZWZpbmUgX191aWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX2dpZF90X2RlZmluZWQKK3R5cGVkZWYgX19naWRfdCBnaWRfdDsKKyMgZGVmaW5lIF9fZ2lkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19tb2RlX3RfZGVmaW5lZAordHlwZWRlZiBfX21vZGVfdCBtb2RlX3Q7CisjIGRlZmluZSBfX21vZGVfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX2tleV90X2RlZmluZWQKK3R5cGVkZWYgX19rZXlfdCBrZXlfdDsKKyMgZGVmaW5lIF9fa2V5X3RfZGVmaW5lZAorI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworLyogR2VuZXJhdGVzIGtleSBmb3IgU3lzdGVtIFYgc3R5bGUgSVBDLiAgKi8KK2V4dGVybiBrZXlfdCBmdG9rIChfX2NvbnN0IGNoYXIgKl9fcGF0aG5hbWUsIGludCBfX3Byb2pfaWQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvaXBjLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2tkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9rZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTljMDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9rZC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0tEX0gKKyNkZWZpbmUgX1NZU19LRF9ICTEKKworLyogTWFrZSBzdXJlIHRoZSA8bGludXgvdHlwZXMuaD4gaGVhZGVyIGlzIG5vdCBsb2FkZWQuICAqLworI2lmbmRlZiBfTElOVVhfVFlQRVNfSAorIyBkZWZpbmUgX0xJTlVYX1RZUEVTX0gJCTEKKyMgZGVmaW5lIF9fdW5kZWZfTElOVVhfVFlQRVNfSAorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorCisjaWZkZWYgX191bmRlZl9MSU5VWF9UWVBFU19ICisjIHVuZGVmIF9MSU5VWF9UWVBFU19ICisjIHVuZGVmIF9fdW5kZWZfTElOVVhfVFlQRVNfSAorI2VuZGlmCisKKyNlbmRpZgkvKiBzeXMva2QuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMva2RhZW1vbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMva2RhZW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDkxZjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9rZGFlbW9uLmgKQEAgLTAsMCArMSwzMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBJbnRlcmZhY2VzIHRvIGNvbnRyb2wgdGhlIHZhcmlvdXMga2VybmVsIGRhZW1vbnMuICAqLworCisjaWZuZGVmIF9TWVNfS0RBRU1PTl9ICisKKyNkZWZpbmUgX1NZU19LREFFTU9OX0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogU3RhcnQsIGZsdXNoLCBvciB0dW5lIHRoZSBrZXJuZWwncyBidWZmZXIgZmx1c2hpbmcgZGFlbW9uLiAgKi8KK2V4dGVybiBpbnQgYmRmbHVzaCAoaW50IF9fZnVuYywgbG9uZyBpbnQgX19kYXRhKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX1NZU19LREFFTU9OX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2tsb2cuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2tsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWY1ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMva2xvZy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0tMT0dfSAorCisjZGVmaW5lCV9TWVNfS0xPR19ICTEKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIENvbnRyb2wgdGhlIGtlcm5lbCdzIGxvZ2dpbmcgZmFjaWxpdHkuICBUaGlzIGNvcnJlc3BvbmRzIGV4YWN0bHkgdG8KKyAgIHRoZSBrZXJuZWwncyBzeXNsb2cgc3lzdGVtIGNhbGwsIGJ1dCB0aGF0IG5hbWUgaXMgZWFzaWx5IGNvbmZ1c2VkCisgICB3aXRoIHRoZSB1c2VyLWxldmVsIHN5c2xvZyBmYWNpbGl0eSwgd2hpY2ggaXMgc29tZXRoaW5nIGNvbXBsZXRlbHkKKyAgIGRpZmZlcmVudC4gICovCitleHRlcm4gaW50IGtsb2djdGwgKGludCBfX3R5cGUsIGNoYXIgKl9fYnVmcCwgaW50IF9fbGVuKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX1NZU19LTE9HX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL21tYW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q4YTNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvbW1hbi5oCkBAIC0wLDAgKzEsMTUyIEBACisvKiBEZWZpbml0aW9ucyBmb3IgQlNELXN0eWxlIG1lbW9yeSBtYW5hZ2VtZW50LgorICAgQ29weXJpZ2h0IChDKSAxOTk0LTIwMDAsIDIwMDMsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19NTUFOX0gKKyNkZWZpbmUJX1NZU19NTUFOX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmbmRlZiBfX29mZl90X2RlZmluZWQKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19vZmZfdCBvZmZfdDsKKyMgZWxzZQordHlwZWRlZiBfX29mZjY0X3Qgb2ZmX3Q7CisjIGVuZGlmCisjIGRlZmluZSBfX29mZl90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fbW9kZV90X2RlZmluZWQKK3R5cGVkZWYgX19tb2RlX3QgbW9kZV90OworIyBkZWZpbmUgX19tb2RlX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL21tYW4uaD4KKworLyogUmV0dXJuIHZhbHVlIG9mIGBtbWFwJyBpbiBjYXNlIG9mIGFuIGVycm9yLiAgKi8KKyNkZWZpbmUgTUFQX0ZBSUxFRAkoKHZvaWQgKikgLTEpCisKK19fQkVHSU5fREVDTFMKKy8qIE1hcCBhZGRyZXNzZXMgc3RhcnRpbmcgbmVhciBBRERSIGFuZCBleHRlbmRpbmcgZm9yIExFTiBieXRlcy4gIGZyb20KKyAgIE9GRlNFVCBpbnRvIHRoZSBmaWxlIEZEIGRlc2NyaWJlcyBhY2NvcmRpbmcgdG8gUFJPVCBhbmQgRkxBR1MuICBJZiBBRERSCisgICBpcyBub256ZXJvLCBpdCBpcyB0aGUgZGVzaXJlZCBtYXBwaW5nIGFkZHJlc3MuICBJZiB0aGUgTUFQX0ZJWEVEIGJpdCBpcworICAgc2V0IGluIEZMQUdTLCB0aGUgbWFwcGluZyB3aWxsIGJlIGF0IEFERFIgZXhhY3RseSAod2hpY2ggbXVzdCBiZQorICAgcGFnZS1hbGlnbmVkKTsgb3RoZXJ3aXNlIHRoZSBzeXN0ZW0gY2hvb3NlcyBhIGNvbnZlbmllbnQgbmVhcmJ5IGFkZHJlc3MuCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBhY3R1YWwgbWFwcGluZyBhZGRyZXNzIGNob3NlbiBvciBNQVBfRkFJTEVECisgICBmb3IgZXJyb3JzIChpbiB3aGljaCBjYXNlIGBlcnJubycgaXMgc2V0KS4gIEEgc3VjY2Vzc2Z1bCBgbW1hcCcgY2FsbAorICAgZGVhbGxvY2F0ZXMgYW55IHByZXZpb3VzIG1hcHBpbmcgZm9yIHRoZSBhZmZlY3RlZCByZWdpb24uICAqLworCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiB2b2lkICptbWFwICh2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbiwgaW50IF9fcHJvdCwKKwkJICAgaW50IF9fZmxhZ3MsIGludCBfX2ZkLCBfX29mZl90IF9fb2Zmc2V0KSBfX1RIUk9XOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiB2b2lkICogX19SRURJUkVDVF9OVEggKG1tYXAsCisJCQkgICAgICAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4sIGludCBfX3Byb3QsCisJCQkgICAgICAgaW50IF9fZmxhZ3MsIGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQpLAorCQkJICAgICAgbW1hcDY0KTsKKyMgZWxzZQorIyAgZGVmaW5lIG1tYXAgbW1hcDY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIHZvaWQgKm1tYXA2NCAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4sIGludCBfX3Byb3QsCisJCSAgICAgaW50IF9fZmxhZ3MsIGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQpIF9fVEhST1c7CisjZW5kaWYKKworLyogRGVhbGxvY2F0ZSBhbnkgbWFwcGluZyBmb3IgdGhlIHJlZ2lvbiBzdGFydGluZyBhdCBBRERSIGFuZCBleHRlbmRpbmcgTEVOCisgICBieXRlcy4gIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAtMSBmb3IgZXJyb3JzIChhbmQgc2V0cyBlcnJubykuICAqLworZXh0ZXJuIGludCBtdW5tYXAgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuKSBfX1RIUk9XOworCisvKiBDaGFuZ2UgdGhlIG1lbW9yeSBwcm90ZWN0aW9uIG9mIHRoZSByZWdpb24gc3RhcnRpbmcgYXQgQUREUiBhbmQKKyAgIGV4dGVuZGluZyBMRU4gYnl0ZXMgdG8gUFJPVC4gIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAtMSBmb3IgZXJyb3JzCisgICAoYW5kIHNldHMgZXJybm8pLiAgKi8KK2V4dGVybiBpbnQgbXByb3RlY3QgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuLCBpbnQgX19wcm90KSBfX1RIUk9XOworCisvKiBTeW5jaHJvbml6ZSB0aGUgcmVnaW9uIHN0YXJ0aW5nIGF0IEFERFIgYW5kIGV4dGVuZGluZyBMRU4gYnl0ZXMgd2l0aCB0aGUKKyAgIGZpbGUgaXQgbWFwcy4gIEZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBvbiBhIGZpbGUgYmVpbmcgbWFwcGVkIGFyZQorICAgdW5wcmVkaWN0YWJsZSBiZWZvcmUgdGhpcyBpcyBkb25lLiAgRmxhZ3MgYXJlIGZyb20gdGhlIE1TXyogc2V0LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgbXN5bmMgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuLCBpbnQgX19mbGFncyk7CisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIEFkdmlzZSB0aGUgc3lzdGVtIGFib3V0IHBhcnRpY3VsYXIgdXNhZ2UgcGF0dGVybnMgdGhlIHByb2dyYW0gZm9sbG93cworICAgZm9yIHRoZSByZWdpb24gc3RhcnRpbmcgYXQgQUREUiBhbmQgZXh0ZW5kaW5nIExFTiBieXRlcy4gICovCitleHRlcm4gaW50IG1hZHZpc2UgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuLCBpbnQgX19hZHZpY2UpIF9fVEhST1c7CisjZW5kaWYKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBUaGlzIGlzIHRoZSBQT1NJWCBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfbWFkdmlzZSAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4sIGludCBfX2FkdmljZSkgX19USFJPVzsKKyNlbmRpZgorCisvKiBHdWFyYW50ZWUgYWxsIHdob2xlIHBhZ2VzIG1hcHBlZCBieSB0aGUgcmFuZ2UgW0FERFIsQUREUitMRU4pIHRvCisgICBiZSBtZW1vcnkgcmVzaWRlbnQuICAqLworZXh0ZXJuIGludCBtbG9jayAoX19jb25zdCB2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbikgX19USFJPVzsKKworLyogVW5sb2NrIHdob2xlIHBhZ2VzIHByZXZpb3VzbHkgbWFwcGVkIGJ5IHRoZSByYW5nZSBbQUREUixBRERSK0xFTikuICAqLworZXh0ZXJuIGludCBtdW5sb2NrIChfX2NvbnN0IHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuKSBfX1RIUk9XOworCisvKiBDYXVzZSBhbGwgY3VycmVudGx5IG1hcHBlZCBwYWdlcyBvZiB0aGUgcHJvY2VzcyB0byBiZSBtZW1vcnkgcmVzaWRlbnQKKyAgIHVudGlsIHVubG9ja2VkIGJ5IGEgY2FsbCB0byB0aGUgYG11bmxvY2thbGwnLCB1bnRpbCB0aGUgcHJvY2VzcyBleGl0cywKKyAgIG9yIHVudGlsIHRoZSBwcm9jZXNzIGNhbGxzIGBleGVjdmUnLiAgKi8KK2V4dGVybiBpbnQgbWxvY2thbGwgKGludCBfX2ZsYWdzKSBfX1RIUk9XOworCisvKiBBbGwgY3VycmVudGx5IG1hcHBlZCBwYWdlcyBvZiB0aGUgcHJvY2VzcycgYWRkcmVzcyBzcGFjZSBiZWNvbWUKKyAgIHVubG9ja2VkLiAgKi8KK2V4dGVybiBpbnQgbXVubG9ja2FsbCAodm9pZCkgX19USFJPVzsKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIG1pbmNvcmUgcmV0dXJucyB0aGUgbWVtb3J5IHJlc2lkZW5jeSBzdGF0dXMgb2YgdGhlIHBhZ2VzIGluIHRoZQorICAgY3VycmVudCBwcm9jZXNzJ3MgYWRkcmVzcyBzcGFjZSBzcGVjaWZpZWQgYnkgW3N0YXJ0LCBzdGFydCArIGxlbikuCisgICBUaGUgc3RhdHVzIGlzIHJldHVybmVkIGluIGEgdmVjdG9yIG9mIGJ5dGVzLiAgVGhlIGxlYXN0IHNpZ25pZmljYW50CisgICBiaXQgb2YgZWFjaCBieXRlIGlzIDEgaWYgdGhlIHJlZmVyZW5jZWQgcGFnZSBpcyBpbiBtZW1vcnksIG90aGVyd2lzZQorICAgaXQgaXMgemVyby4gICovCitleHRlcm4gaW50IG1pbmNvcmUgKHZvaWQgKl9fc3RhcnQsIHNpemVfdCBfX2xlbiwgdW5zaWduZWQgY2hhciAqX192ZWMpCisgICAgIF9fVEhST1c7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogUmVtYXAgcGFnZXMgbWFwcGVkIGJ5IHRoZSByYW5nZSBbQUREUixBRERSK09MRF9MRU4pIHRvIG5ldyBsZW5ndGgKKyAgIE5FV19MRU4uICBJZiBNUkVNQVBfTUFZTU9WRSBpcyBzZXQgaW4gRkxBR1MgdGhlIHJldHVybmVkIGFkZHJlc3MKKyAgIG1heSBkaWZmZXIgZnJvbSBBRERSLiAgSWYgTVJFTUFQX0ZJWEVEIGlzIHNldCBpbiBGTEFHUyB0aGUgZnVuY3Rpb24KKyAgIHRha2VzIGFub3RoZXIgcGFyYW10ZXIgd2hpY2ggaXMgYSBmaXhlZCBhZGRyZXNzIGF0IHdoaWNoIHRoZSBibG9jaworICAgcmVzaWRlcyBhZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbC4gICovCitleHRlcm4gdm9pZCAqbXJlbWFwICh2b2lkICpfX2FkZHIsIHNpemVfdCBfX29sZF9sZW4sIHNpemVfdCBfX25ld19sZW4sCisJCSAgICAgaW50IF9fZmxhZ3MsIC4uLikgX19USFJPVzsKKworLyogUmVtYXAgYXJiaXRyYXJ5IHBhZ2VzIG9mIGEgc2hhcmVkIGJhY2tpbmcgc3RvcmUgd2l0aGluIGFuIGV4aXN0aW5nCisgICBWTUEuICAqLworZXh0ZXJuIGludCByZW1hcF9maWxlX3BhZ2VzICh2b2lkICpfX3N0YXJ0LCBzaXplX3QgX19zaXplLCBpbnQgX19wcm90LAorCQkJICAgICBzaXplX3QgX19wZ29mZiwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBPcGVuIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gICovCitleHRlcm4gaW50IHNobV9vcGVuIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fb2ZsYWcsIG1vZGVfdCBfX21vZGUpOworCisvKiBSZW1vdmUgc2hhcmVkIG1lbW9yeSBzZWdtZW50LiAgKi8KK2V4dGVybiBpbnQgc2htX3VubGluayAoX19jb25zdCBjaGFyICpfX25hbWUpOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL21tYW4uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvbW91bnQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL21vdW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIzYjQ2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL21vdW50LmgKQEAgLTAsMCArMSwxNDggQEAKKy8qIEhlYWRlciBmaWxlIGZvciBtb3VudGluZy91bm1vdW50IExpbnV4IGZpbGVzeXN0ZW1zLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDAsIDIwMDQsIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFRoaXMgaXMgdGFrZW4gZnJvbSAvdXNyL2luY2x1ZGUvbGludXgvZnMuaC4gICovCisKKyNpZm5kZWYgX1NZU19NT1VOVF9ICisjZGVmaW5lIF9TWVNfTU9VTlRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjZGVmaW5lIEJMT0NLX1NJWkUJMTAyNAorI2RlZmluZSBCTE9DS19TSVpFX0JJVFMJMTAKKworCisvKiBUaGVzZSBhcmUgdGhlIGZzLWluZGVwZW5kZW50IG1vdW50LWZsYWdzOiB1cCB0byAxNiBmbGFncyBhcmUKKyAgIHN1cHBvcnRlZCAgKi8KK2VudW0KK3sKKyAgTVNfUkRPTkxZID0gMSwJCS8qIE1vdW50IHJlYWQtb25seS4gICovCisjZGVmaW5lIE1TX1JET05MWQlNU19SRE9OTFkKKyAgTVNfTk9TVUlEID0gMiwJCS8qIElnbm9yZSBzdWlkIGFuZCBzZ2lkIGJpdHMuICAqLworI2RlZmluZSBNU19OT1NVSUQJTVNfTk9TVUlECisgIE1TX05PREVWID0gNCwJCQkvKiBEaXNhbGxvdyBhY2Nlc3MgdG8gZGV2aWNlIHNwZWNpYWwgZmlsZXMuICAqLworI2RlZmluZSBNU19OT0RFVglNU19OT0RFVgorICBNU19OT0VYRUMgPSA4LAkJLyogRGlzYWxsb3cgcHJvZ3JhbSBleGVjdXRpb24uICAqLworI2RlZmluZSBNU19OT0VYRUMJTVNfTk9FWEVDCisgIE1TX1NZTkNIUk9OT1VTID0gMTYsCQkvKiBXcml0ZXMgYXJlIHN5bmNlZCBhdCBvbmNlLiAgKi8KKyNkZWZpbmUgTVNfU1lOQ0hST05PVVMJTVNfU1lOQ0hST05PVVMKKyAgTVNfUkVNT1VOVCA9IDMyLAkJLyogQWx0ZXIgZmxhZ3Mgb2YgYSBtb3VudGVkIEZTLiAgKi8KKyNkZWZpbmUgTVNfUkVNT1VOVAlNU19SRU1PVU5UCisgIE1TX01BTkRMT0NLID0gNjQsCQkvKiBBbGxvdyBtYW5kYXRvcnkgbG9ja3Mgb24gYW4gRlMuICAqLworI2RlZmluZSBNU19NQU5ETE9DSwlNU19NQU5ETE9DSworICBNU19ESVJTWU5DID0gMTI4LAkJLyogRGlyZWN0b3J5IG1vZGlmaWNhdGlvbnMgYXJlIHN5bmNocm9ub3VzLiAgKi8KKyNkZWZpbmUgTVNfRElSU1lOQwlNU19ESVJTWU5DCisgIE1TX05PQVRJTUUgPSAxMDI0LAkJLyogRG8gbm90IHVwZGF0ZSBhY2Nlc3MgdGltZXMuICAqLworI2RlZmluZSBNU19OT0FUSU1FCU1TX05PQVRJTUUKKyAgTVNfTk9ESVJBVElNRSA9IDIwNDgsCQkvKiBEbyBub3QgdXBkYXRlIGRpcmVjdG9yeSBhY2Nlc3MgdGltZXMuICAqLworI2RlZmluZSBNU19OT0RJUkFUSU1FCU1TX05PRElSQVRJTUUKKyAgTVNfQklORCA9IDQwOTYsCQkvKiBCaW5kIGRpcmVjdG9yeSBhdCBkaWZmZXJlbnQgcGxhY2UuICAqLworI2RlZmluZSBNU19CSU5ECQlNU19CSU5ECisgIE1TX01PVkUgPSA4MTkyLAorI2RlZmluZSBNU19NT1ZFCQlNU19NT1ZFCisgIE1TX1JFQyA9IDE2Mzg0LAorI2RlZmluZSBNU19SRUMJCU1TX1JFQworICBNU19TSUxFTlQgPSAzMjc2OCwKKyNkZWZpbmUgTVNfU0lMRU5UCU1TX1NJTEVOVAorICBNU19QT1NJWEFDTCA9IDEgPDwgMTYsCS8qIFZGUyBkb2VzIG5vdCBhcHBseSB0aGUgdW1hc2suICAqLworI2RlZmluZSBNU19QT1NJWEFDTAlNU19QT1NJWEFDTAorICBNU19VTkJJTkRBQkxFID0gMSA8PCAxNywJLyogQ2hhbmdlIHRvIHVuYmluZGFibGUuICAqLworI2RlZmluZSBNU19VTkJJTkRBQkxFCU1TX1VOQklOREFCTEUKKyAgTVNfUFJJVkFURSA9IDEgPDwgMTgsCQkvKiBDaGFuZ2UgdG8gcHJpdmF0ZS4gICovCisjZGVmaW5lIE1TX1BSSVZBVEUJTVNfUFJJVkFURQorICBNU19TTEFWRSA9IDEgPDwgMTksCQkvKiBDaGFuZ2UgdG8gc2xhdmUuICAqLworI2RlZmluZSBNU19TTEFWRQlNU19TTEFWRQorICBNU19TSEFSRUQgPSAxIDw8IDIwLAkJLyogQ2hhbmdlIHRvIHNoYXJlZC4gICovCisjZGVmaW5lIE1TX1NIQVJFRAlNU19TSEFSRUQKKyAgTVNfUkVMQVRJTUUgPSAxIDw8IDIxLAkvKiBVcGRhdGUgYXRpbWUgcmVsYXRpdmUgdG8gbXRpbWUvY3RpbWUuICAqLworI2RlZmluZSBNU19SRUxBVElNRQlNU19SRUxBVElNRQorICBNU19LRVJOTU9VTlQgPSAxIDw8IDIyLAkvKiBUaGlzIGlzIGEga2Vybl9tb3VudCBjYWxsLiAgKi8KKyNkZWZpbmUgTVNfS0VSTk1PVU5UCU1TX0tFUk5NT1VOVAorICBNU19JX1ZFUlNJT04gPSAgMSA8PCAyMywJLyogVXBkYXRlIGlub2RlIElfdmVyc2lvbiBmaWVsZC4gICovCisjZGVmaW5lIE1TX0lfVkVSU0lPTglNU19JX1ZFUlNJT04KKyAgTVNfU1RSSUNUQVRJTUUgPSAxIDw8IDI0LAkvKiBBbHdheXMgcGVyZm9ybSBhdGltZSB1cGRhdGVzLiAgKi8KKyNkZWZpbmUgTVNfU1RSSUNUQVRJTUUJTVNfU1RSSUNUQVRJTUUKKyAgTVNfQUNUSVZFID0gMSA8PCAzMCwKKyNkZWZpbmUgTVNfQUNUSVZFCU1TX0FDVElWRQorICBNU19OT1VTRVIgPSAxIDw8IDMxCisjZGVmaW5lIE1TX05PVVNFUglNU19OT1VTRVIKK307CisKKy8qIEZsYWdzIHRoYXQgY2FuIGJlIGFsdGVyZWQgYnkgTVNfUkVNT1VOVCAgKi8KKyNkZWZpbmUgTVNfUk1UX01BU0sgKE1TX1JET05MWXxNU19TWU5DSFJPTk9VU3xNU19NQU5ETE9DS3xNU19JX1ZFUlNJT04pCisKKworLyogTWFnaWMgbW91bnQgZmxhZyBudW1iZXIuIEhhcyB0byBiZSBvci1lZCB0byB0aGUgZmxhZyB2YWx1ZXMuICAqLworCisjZGVmaW5lIE1TX01HQ19WQUwgMHhjMGVkMDAwMAkvKiBNYWdpYyBmbGFnIG51bWJlciB0byBpbmRpY2F0ZSAibmV3IiBmbGFncyAqLworI2RlZmluZSBNU19NR0NfTVNLIDB4ZmZmZjAwMDAJLyogTWFnaWMgZmxhZyBudW1iZXIgbWFzayAqLworCisKKy8qIFRoZSByZWFkLW9ubHkgc3R1ZmYgZG9lc24ndCByZWFsbHkgYmVsb25nIGhlcmUsIGJ1dCBhbnkgb3RoZXIgcGxhY2UKKyAgIGlzIHByb2JhYmx5IGFzIGJhZCBhbmQgSSBkb24ndCB3YW50IHRvIGNyZWF0ZSB5ZXQgYW5vdGhlciBpbmNsdWRlCisgICBmaWxlLiAgKi8KKworI2RlZmluZSBCTEtST1NFVCAgIF9JTygweDEyLCA5MykgLyogU2V0IGRldmljZSByZWFkLW9ubHkgKDAgPSByZWFkLXdyaXRlKS4gICovCisjZGVmaW5lIEJMS1JPR0VUICAgX0lPKDB4MTIsIDk0KSAvKiBHZXQgcmVhZC1vbmx5IHN0YXR1cyAoMCA9IHJlYWRfd3JpdGUpLiAgKi8KKyNkZWZpbmUgQkxLUlJQQVJUICBfSU8oMHgxMiwgOTUpIC8qIFJlLXJlYWQgcGFydGl0aW9uIHRhYmxlLiAgKi8KKyNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiwgOTYpIC8qIFJldHVybiBkZXZpY2Ugc2l6ZS4gICovCisjZGVmaW5lIEJMS0ZMU0JVRiAgX0lPKDB4MTIsIDk3KSAvKiBGbHVzaCBidWZmZXIgY2FjaGUuICAqLworI2RlZmluZSBCTEtSQVNFVCAgIF9JTygweDEyLCA5OCkgLyogU2V0IHJlYWQgYWhlYWQgZm9yIGJsb2NrIGRldmljZS4gICovCisjZGVmaW5lIEJMS1JBR0VUICAgX0lPKDB4MTIsIDk5KSAvKiBHZXQgY3VycmVudCByZWFkIGFoZWFkIHNldHRpbmcuICAqLworI2RlZmluZSBCTEtGUkFTRVQgIF9JTygweDEyLDEwMCkgLyogU2V0IGZpbGVzeXN0ZW0gcmVhZC1haGVhZC4gICovCisjZGVmaW5lIEJMS0ZSQUdFVCAgX0lPKDB4MTIsMTAxKSAvKiBHZXQgZmlsZXN5c3RlbSByZWFkLWFoZWFkLiAgKi8KKyNkZWZpbmUgQkxLU0VDVFNFVCBfSU8oMHgxMiwxMDIpIC8qIFNldCBtYXggc2VjdG9ycyBwZXIgcmVxdWVzdC4gICovCisjZGVmaW5lIEJMS1NFQ1RHRVQgX0lPKDB4MTIsMTAzKSAvKiBHZXQgbWF4IHNlY3RvcnMgcGVyIHJlcXVlc3QuICAqLworI2RlZmluZSBCTEtTU1pHRVQgIF9JTygweDEyLDEwNCkgLyogR2V0IGJsb2NrIGRldmljZSBzZWN0b3Igc2l6ZS4gICovCisjZGVmaW5lIEJMS0JTWkdFVCAgX0lPUigweDEyLDExMixzaXplX3QpCisjZGVmaW5lIEJMS0JTWlNFVCAgX0lPVygweDEyLDExMyxzaXplX3QpCisjZGVmaW5lIEJMS0dFVFNJWkU2NCBfSU9SKDB4MTIsMTE0LHNpemVfdCkgLyogcmV0dXJuIGRldmljZSBzaXplLiAgKi8KKworCisvKiBQb3NzaWJsZSB2YWx1ZSBmb3IgRkxBR1MgcGFyYW1ldGVyIG9mIGB1bW91bnQyJy4gICovCitlbnVtCit7CisgIE1OVF9GT1JDRSA9IDEsCQkvKiBGb3JjZSB1bm1vdW50aW5nLiAgKi8KKyNkZWZpbmUgTU5UX0ZPUkNFIE1OVF9GT1JDRQorICBNTlRfREVUQUNIID0gMiwJCS8qIEp1c3QgZGV0YWNoIGZyb20gdGhlIHRyZWUuICAqLworI2RlZmluZSBNTlRfREVUQUNIIE1OVF9ERVRBQ0gKKyAgTU5UX0VYUElSRSA9IDQsCQkvKiBNYXJrIGZvciBleHBpcnkuICAqLworI2RlZmluZSBNTlRfRVhQSVJFIE1OVF9FWFBJUkUKKyAgVU1PVU5UX05PRk9MTE9XID0gOAkJLyogRG9uJ3QgZm9sbG93IHN5bWxpbmsgb24gdW1vdW50LiAgKi8KKyNkZWZpbmUgVU1PVU5UX05PRk9MTE9XIFVNT1VOVF9OT0ZPTExPVworfTsKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIE1vdW50IGEgZmlsZXN5c3RlbS4gICovCitleHRlcm4gaW50IG1vdW50IChfX2NvbnN0IGNoYXIgKl9fc3BlY2lhbF9maWxlLCBfX2NvbnN0IGNoYXIgKl9fZGlyLAorCQkgIF9fY29uc3QgY2hhciAqX19mc3R5cGUsIHVuc2lnbmVkIGxvbmcgaW50IF9fcndmbGFnLAorCQkgIF9fY29uc3Qgdm9pZCAqX19kYXRhKSBfX1RIUk9XOworCisvKiBVbm1vdW50IGEgZmlsZXN5c3RlbS4gICovCitleHRlcm4gaW50IHVtb3VudCAoX19jb25zdCBjaGFyICpfX3NwZWNpYWxfZmlsZSkgX19USFJPVzsKKworLyogVW5tb3VudCBhIGZpbGVzeXN0ZW0uICBGb3JjZSB1bm1vdW50aW5nIGlmIEZMQUdTIGlzIHNldCB0byBNTlRfRk9SQ0UuICAqLworZXh0ZXJuIGludCB1bW91bnQyIChfX2NvbnN0IGNoYXIgKl9fc3BlY2lhbF9maWxlLCBpbnQgX19mbGFncykgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9TWVNfTU9VTlRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvbXNnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGM5NmJlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvbXNnLmgKQEAgLTAsMCArMSw4NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsMTk5OSwyMDAwLDIwMDMsMjAwNiwyMDA3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX01TR19ICisjZGVmaW5lIF9TWVNfTVNHX0gKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBHZXQgY29tbW9uIGRlZmluaXRpb24gb2YgU3lzdGVtIFYgc3R5bGUgSVBDLiAgKi8KKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisKKy8qIEdldCBzeXN0ZW0gZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYHN0cnVjdCBtc3FpZF9kcycgYW5kIG1vcmUuICAqLworI2luY2x1ZGUgPGJpdHMvbXNxLmg+CisKKy8qIERlZmluZSB0eXBlcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQuICAqLworI2RlZmluZQlfX25lZWRfdGltZV90CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZuZGVmIF9fcGlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3BpZF90IHBpZF90OworIyBkZWZpbmUgX19waWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX3NzaXplX3RfZGVmaW5lZAordHlwZWRlZiBfX3NzaXplX3Qgc3NpemVfdDsKKyMgZGVmaW5lIF9fc3NpemVfdF9kZWZpbmVkCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBTeXN0ZW0gViBzdHlsZSBJUEMgZnVuY3Rpb25zIGltcGxlbWVudCBhIG1lc3NhZ2UgcXVldWUKKyAgIHN5c3RlbS4gIFRoZSBkZWZpbml0aW9uIGlzIGZvdW5kIGluIFhQRzIuICAqLworCisjaWZkZWYgX19VU0VfR05VCisvKiBUZW1wbGF0ZSBmb3Igc3RydWN0IHRvIGJlIHVzZWQgYXMgYXJndW1lbnQgZm9yIGBtc2dzbmQnIGFuZCBgbXNncmN2Jy4gICovCitzdHJ1Y3QgbXNnYnVmCisgIHsKKyAgICBsb25nIGludCBtdHlwZTsJCS8qIHR5cGUgb2YgcmVjZWl2ZWQvc2VudCBtZXNzYWdlICovCisgICAgY2hhciBtdGV4dFsxXTsJCS8qIHRleHQgb2YgdGhlIG1lc3NhZ2UgKi8KKyAgfTsKKyNlbmRpZgorCisKK19fQkVHSU5fREVDTFMKKworLyogTWVzc2FnZSBxdWV1ZSBjb250cm9sIG9wZXJhdGlvbi4gICovCitleHRlcm4gaW50IG1zZ2N0bCAoaW50IF9fbXNxaWQsIGludCBfX2NtZCwgc3RydWN0IG1zcWlkX2RzICpfX2J1ZikgX19USFJPVzsKKworLyogR2V0IG1lc3NhZ2VzIHF1ZXVlLiAgKi8KK2V4dGVybiBpbnQgbXNnZ2V0IChrZXlfdCBfX2tleSwgaW50IF9fbXNnZmxnKSBfX1RIUk9XOworCisvKiBSZWNlaXZlIG1lc3NhZ2UgZnJvbSBtZXNzYWdlIHF1ZXVlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IG1zZ3JjdiAoaW50IF9fbXNxaWQsIHZvaWQgKl9fbXNncCwgc2l6ZV90IF9fbXNnc3osCisJCSAgICAgICBsb25nIGludCBfX21zZ3R5cCwgaW50IF9fbXNnZmxnKTsKKworLyogU2VuZCBtZXNzYWdlIHRvIG1lc3NhZ2UgcXVldWUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBtc2dzbmQgKGludCBfX21zcWlkLCBfX2NvbnN0IHZvaWQgKl9fbXNncCwgc2l6ZV90IF9fbXNnc3osCisJCSAgIGludCBfX21zZ2ZsZyk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvbXNnLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL210aW8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL210aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWZhNTUwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvbXRpby5oCkBAIC0wLDAgKzEsMjc3IEBACisvKiBTdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyBmb3IgbWFnbmV0aWMgdGFwZSBJL08gY29udHJvbCBjb21tYW5kcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogV3JpdHRlbiBieSBILiBCZXJnbWFuIDxoZW5udXNAY3liZXJjb21tLm5sPi4gICovCisKKyNpZm5kZWYgX1NZU19NVElPX0gKKyNkZWZpbmUgX1NZU19NVElPX0gJMQorCisvKiBHZXQgbmVjZXNzYXJ5IGRlZmluaXRpb25zIGZyb20gc3lzdGVtIGFuZCBrZXJuZWwgaGVhZGVycy4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKworLyogU3RydWN0dXJlIGZvciBNVElPQ1RPUCAtIG1hZ25ldGljIHRhcGUgb3BlcmF0aW9uIGNvbW1hbmQuICAqLworc3RydWN0IG10b3AKKyAgeworICAgIHNob3J0IGludCBtdF9vcDsJCS8qIE9wZXJhdGlvbnMgZGVmaW5lZCBiZWxvdy4gICovCisgICAgaW50IG10X2NvdW50OwkJLyogSG93IG1hbnkgb2YgdGhlbS4gICovCisgIH07CisjZGVmaW5lIF9JT1RfbXRvcCAvKiBIdXJkIGlvY3RsIHR5cGUgZmllbGQuICAqLyBcCisgIF9JT1QgKF9JT1RTIChzaG9ydCksIDEsIF9JT1RTIChpbnQpLCAxLCAwLCAwKQorCisvKiBNYWduZXRpYyBUYXBlIG9wZXJhdGlvbnMgW05vdCBhbGwgb3BlcmF0aW9ucyBzdXBwb3J0ZWQgYnkgYWxsIGRyaXZlcnNdLiAgKi8KKyNkZWZpbmUgTVRSRVNFVCAwCS8qICtyZXNldCBkcml2ZSBpbiBjYXNlIG9mIHByb2JsZW1zLiAgKi8KKyNkZWZpbmUgTVRGU0YJMQkvKiBGb3J3YXJkIHNwYWNlIG92ZXIgRmlsZU1hcmssCisJCQkgKiBwb3NpdGlvbiBhdCBmaXJzdCByZWNvcmQgb2YgbmV4dCBmaWxlLiAgKi8KKyNkZWZpbmUgTVRCU0YJMgkvKiBCYWNrd2FyZCBzcGFjZSBGaWxlTWFyayAocG9zaXRpb24gYmVmb3JlIEZNKS4gICovCisjZGVmaW5lIE1URlNSCTMJLyogRm9yd2FyZCBzcGFjZSByZWNvcmQuICAqLworI2RlZmluZSBNVEJTUgk0CS8qIEJhY2t3YXJkIHNwYWNlIHJlY29yZC4gICovCisjZGVmaW5lIE1UV0VPRgk1CS8qIFdyaXRlIGFuIGVuZC1vZi1maWxlIHJlY29yZCAobWFyaykuICAqLworI2RlZmluZSBNVFJFVwk2CS8qIFJld2luZC4gICovCisjZGVmaW5lIE1UT0ZGTAk3CS8qIFJld2luZCBhbmQgcHV0IHRoZSBkcml2ZSBvZmZsaW5lIChlamVjdD8pLiAgKi8KKyNkZWZpbmUgTVROT1AJOAkvKiBObyBvcCwgc2V0IHN0YXR1cyBvbmx5IChyZWFkIHdpdGggTVRJT0NHRVQpLiAgKi8KKyNkZWZpbmUgTVRSRVRFTiA5CS8qIFJldGVuc2lvbiB0YXBlLiAgKi8KKyNkZWZpbmUgTVRCU0ZNCTEwCS8qICtiYWNrd2FyZCBzcGFjZSBGaWxlTWFyaywgcG9zaXRpb24gYXQgRk0uICAqLworI2RlZmluZSBNVEZTRk0gIDExCS8qICtmb3J3YXJkIHNwYWNlIEZpbGVNYXJrLCBwb3NpdGlvbiBhdCBGTS4gICovCisjZGVmaW5lIE1URU9NCTEyCS8qIEdvdG8gZW5kIG9mIHJlY29yZGVkIG1lZGlhIChmb3IgYXBwZW5kaW5nIGZpbGVzKS4KKwkJCSAgIE1URU9NIHBvc2l0aW9ucyBhZnRlciB0aGUgbGFzdCBGTSwgcmVhZHkgZm9yCisJCQkgICBhcHBlbmRpbmcgYW5vdGhlciBmaWxlLiAgKi8KKyNkZWZpbmUgTVRFUkFTRSAxMwkvKiBFcmFzZSB0YXBlIC0tIGJlIGNhcmVmdWwhICAqLworCisjZGVmaW5lIE1UUkFTMSAgMTQJLyogUnVuIHNlbGYgdGVzdCAxIChub25kZXN0cnVjdGl2ZSkuICAqLworI2RlZmluZSBNVFJBUzIJMTUJLyogUnVuIHNlbGYgdGVzdCAyIChkZXN0cnVjdGl2ZSkuICAqLworI2RlZmluZSBNVFJBUzMgIDE2CS8qIFJlc2VydmVkIGZvciBzZWxmIHRlc3QgMy4gICovCisKKyNkZWZpbmUgTVRTRVRCTEsgMjAJLyogU2V0IGJsb2NrIGxlbmd0aCAoU0NTSSkuICAqLworI2RlZmluZSBNVFNFVERFTlNJVFkgMjEJLyogU2V0IHRhcGUgZGVuc2l0eSAoU0NTSSkuICAqLworI2RlZmluZSBNVFNFRUsJMjIJLyogU2VlayB0byBibG9jayAoVGFuZGJlcmcsIGV0Yy4pLiAgKi8KKyNkZWZpbmUgTVRURUxMCTIzCS8qIFRlbGwgYmxvY2sgKFRhbmRiZXJnLCBldGMuKS4gICovCisjZGVmaW5lIE1UU0VURFJWQlVGRkVSIDI0IC8qIFNldCB0aGUgZHJpdmUgYnVmZmVyaW5nIGFjY29yZGluZyB0byBTQ1NJLTIuCisJCQkgICAgIE9yZGluYXJ5IGJ1ZmZlcmVkIG9wZXJhdGlvbiB3aXRoIGNvZGUgMS4gICovCisjZGVmaW5lIE1URlNTCTI1CS8qIFNwYWNlIGZvcndhcmQgb3ZlciBzZXRtYXJrcy4gICovCisjZGVmaW5lIE1UQlNTCTI2CS8qIFNwYWNlIGJhY2t3YXJkIG92ZXIgc2V0bWFya3MuICAqLworI2RlZmluZSBNVFdTTQkyNwkvKiBXcml0ZSBzZXRtYXJrcy4gICovCisKKyNkZWZpbmUgTVRMT0NLICAyOAkvKiBMb2NrIHRoZSBkcml2ZSBkb29yLiAgKi8KKyNkZWZpbmUgTVRVTkxPQ0sgMjkJLyogVW5sb2NrIHRoZSBkcml2ZSBkb29yLiAgKi8KKyNkZWZpbmUgTVRMT0FEICAzMAkvKiBFeGVjdXRlIHRoZSBTQ1NJIGxvYWQgY29tbWFuZC4gICovCisjZGVmaW5lIE1UVU5MT0FEIDMxCS8qIEV4ZWN1dGUgdGhlIFNDU0kgdW5sb2FkIGNvbW1hbmQuICAqLworI2RlZmluZSBNVENPTVBSRVNTSU9OIDMyLyogQ29udHJvbCBjb21wcmVzc2lvbiB3aXRoIFNDU0kgbW9kZSBwYWdlIDE1LiAgKi8KKyNkZWZpbmUgTVRTRVRQQVJUIDMzCS8qIENoYW5nZSB0aGUgYWN0aXZlIHRhcGUgcGFydGl0aW9uLiAgKi8KKyNkZWZpbmUgTVRNS1BBUlQgIDM0CS8qIEZvcm1hdCB0aGUgdGFwZSB3aXRoIG9uZSBvciB0d28gcGFydGl0aW9ucy4gICovCisKKy8qIHN0cnVjdHVyZSBmb3IgTVRJT0NHRVQgLSBtYWcgdGFwZSBnZXQgc3RhdHVzIGNvbW1hbmQgKi8KKworc3RydWN0IG10Z2V0CisgIHsKKyAgICBsb25nIGludCBtdF90eXBlOwkJLyogVHlwZSBvZiBtYWd0YXBlIGRldmljZS4gICovCisgICAgbG9uZyBpbnQgbXRfcmVzaWQ7CQkvKiBSZXNpZHVhbCBjb3VudDogKG5vdCBzdXJlKQorCQkJCSAgIG51bWJlciBvZiBieXRlcyBpZ25vcmVkLCBvcgorCQkJCSAgIG51bWJlciBvZiBmaWxlcyBub3Qgc2tpcHBlZCwgb3IKKwkJCQkgICBudW1iZXIgb2YgcmVjb3JkcyBub3Qgc2tpcHBlZC4gICovCisgICAgLyogVGhlIGZvbGxvd2luZyByZWdpc3RlcnMgYXJlIGRldmljZSBkZXBlbmRlbnQuICAqLworICAgIGxvbmcgaW50IG10X2RzcmVnOwkJLyogU3RhdHVzIHJlZ2lzdGVyLiAgKi8KKyAgICBsb25nIGludCBtdF9nc3RhdDsJCS8qIEdlbmVyaWMgKGRldmljZSBpbmRlcGVuZGVudCkgc3RhdHVzLiAgKi8KKyAgICBsb25nIGludCBtdF9lcnJlZzsJCS8qIEVycm9yIHJlZ2lzdGVyLiAgKi8KKyAgICAvKiBUaGUgbmV4dCB0d28gZmllbGRzIGFyZSBub3QgYWx3YXlzIHVzZWQuICAqLworICAgIF9fZGFkZHJfdCBtdF9maWxlbm87CS8qIE51bWJlciBvZiBjdXJyZW50IGZpbGUgb24gdGFwZS4gICovCisgICAgX19kYWRkcl90IG10X2Jsa25vOwkJLyogQ3VycmVudCBibG9jayBudW1iZXIuICAqLworICB9OworI2RlZmluZSBfSU9UX210Z2V0IC8qIEh1cmQgaW9jdGwgdHlwZSBmaWVsZC4gICovIFwKKyAgX0lPVCAoX0lPVFMgKGxvbmcpLCA3LCAwLCAwLCAwLCAwKQorCisKKy8qIENvbnN0YW50cyBmb3IgbXRfdHlwZS4gTm90IGFsbCBvZiB0aGVzZSBhcmUgc3VwcG9ydGVkLCBhbmQKKyAgIHRoZXNlIGFyZSBub3QgYWxsIG9mIHRoZSBvbmVzIHRoYXQgYXJlIHN1cHBvcnRlZC4gICovCisjZGVmaW5lIE1UX0lTVU5LTk9XTgkJMHgwMQorI2RlZmluZSBNVF9JU1FJQzAyCQkweDAyCS8qIEdlbmVyaWMgUUlDLTAyIHRhcGUgc3RyZWFtZXIuICAqLworI2RlZmluZSBNVF9JU1dUNTE1MAkJMHgwMwkvKiBXYW5ndGVrIDUxNTBFUSwgUUlDLTE1MCwgUUlDLTAyLiAgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFXzU5NDVMMgkweDA0CS8qIEFyY2hpdmUgNTk0NUwtMiwgUUlDLTI0LCBRSUMtMDI/LiAqLworI2RlZmluZSBNVF9JU0NNU0o1MDAJCTB4MDUJLyogQ01TIEp1bWJvIDUwMCAoUUlDLTAyPykuICAqLworI2RlZmluZSBNVF9JU1REQzM2MTAJCTB4MDYJLyogVGFuZGJlcmcgNjMxMCwgUUlDLTI0LiAgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFX1ZQNjBJCTB4MDcJLyogQXJjaGl2ZSBWUDYwaSwgUUlDLTAyLiAgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFXzIxNTBMCTB4MDgJLyogQXJjaGl2ZSBWaXBlciAyMTUwTC4gICovCisjZGVmaW5lIE1UX0lTQVJDSElWRV8yMDYwTAkweDA5CS8qIEFyY2hpdmUgVmlwZXIgMjA2MEwuICAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVTQzQ5OQkweDBBCS8qIEFyY2hpdmUgU0MtNDk5IFFJQy0zNiBjb250cm9sbGVyLiAqLworI2RlZmluZSBNVF9JU1FJQzAyX0FMTF9GRUFUVVJFUwkweDBGCS8qIEdlbmVyaWMgUUlDLTAyIHdpdGggYWxsIGZlYXR1cmVzLiAqLworI2RlZmluZSBNVF9JU1dUNTA5OUVFTjI0CTB4MTEJLyogV2FuZ3RlayA1MDk5LWVlbjI0LCA2ME1CLCBRSUMtMjQuICovCisjZGVmaW5lIE1UX0lTVEVBQ19NVDJTVAkJMHgxMgkvKiBUZWFjIE1ULTJTVCAxNTVtYiBkcml2ZSwKKwkJCQkJICAgVGVhYyBEQy0xIGNhcmQgKFdhbmd0ZWsgdHlwZSkuICAqLworI2RlZmluZSBNVF9JU0VWRVJFWF9GVDQwQQkweDMyCS8qIEV2ZXJleCBGVDQwQSAoUUlDLTQwKS4gICovCisjZGVmaW5lIE1UX0lTRERTMQkJMHg1MQkvKiBERFMgZGV2aWNlIHdpdGhvdXQgcGFydGl0aW9ucy4gICovCisjZGVmaW5lIE1UX0lTRERTMgkJMHg1MgkvKiBERFMgZGV2aWNlIHdpdGggcGFydGl0aW9ucy4gICovCisjZGVmaW5lIE1UX0lTU0NTSTEJCTB4NzEJLyogR2VuZXJpYyBBTlNJIFNDU0ktMSB0YXBlIHVuaXQuICAqLworI2RlZmluZSBNVF9JU1NDU0kyCQkweDcyCS8qIEdlbmVyaWMgQU5TSSBTQ1NJLTIgdGFwZSB1bml0LiAgKi8KKworLyogUUlDLTQwLzgwLzMwMTAvMzAyMCBmdGFwZSBzdXBwb3J0ZWQgZHJpdmVzLgorICAgMjBiaXQgdmVuZG9yIElEICsgMHg4MDAwMDAgKHNlZSB2ZW5kb3JzLmggaW4gZnRhcGUgZGlzdHJpYnV0aW9uKS4gICovCisjZGVmaW5lIE1UX0lTRlRBUEVfVU5LTk9XTgkweDgwMDAwMCAvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBNVF9JU0ZUQVBFX0ZMQUcJCTB4ODAwMDAwCisKK3N0cnVjdCBtdF90YXBlX2luZm8KKyAgeworICAgIGxvbmcgaW50IHRfdHlwZTsJCS8qIERldmljZSB0eXBlIGlkIChtdF90eXBlKS4gICovCisgICAgY2hhciAqdF9uYW1lOwkJLyogRGVzY3JpcHRpdmUgbmFtZS4gICovCisgIH07CisKKyNkZWZpbmUgTVRfVEFQRV9JTkZPIFwKKyAgewkJCQkJCQkJCSAgICAgIFwKKwl7TVRfSVNVTktOT1dOLAkJIlVua25vd24gdHlwZSBvZiB0YXBlIGRldmljZSJ9LAkJICAgICAgXAorCXtNVF9JU1FJQzAyLAkJIkdlbmVyaWMgUUlDLTAyIHRhcGUgc3RyZWFtZXIifSwJICAgICAgXAorCXtNVF9JU1dUNTE1MCwJCSJXYW5ndGVrIDUxNTAsIFFJQy0xNTAifSwJCSAgICAgIFwKKwl7TVRfSVNBUkNISVZFXzU5NDVMMiwJIkFyY2hpdmUgNTk0NUwtMiJ9LAkJCSAgICAgIFwKKwl7TVRfSVNDTVNKNTAwLAkJIkNNUyBKdW1ibyA1MDAifSwJCQkgICAgICBcCisJe01UX0lTVERDMzYxMCwJCSJUYW5kYmVyZyBUREMgMzYxMCwgUUlDLTI0In0sCQkgICAgICBcCisJe01UX0lTQVJDSElWRV9WUDYwSSwJIkFyY2hpdmUgVlA2MGksIFFJQy0wMiJ9LAkJICAgICAgXAorCXtNVF9JU0FSQ0hJVkVfMjE1MEwsCSJBcmNoaXZlIFZpcGVyIDIxNTBMIn0sCQkJICAgICAgXAorCXtNVF9JU0FSQ0hJVkVfMjA2MEwsCSJBcmNoaXZlIFZpcGVyIDIwNjBMIn0sCQkJICAgICAgXAorCXtNVF9JU0FSQ0hJVkVTQzQ5OSwJIkFyY2hpdmUgU0MtNDk5IFFJQy0zNiBjb250cm9sbGVyIn0sCSAgICAgIFwKKwl7TVRfSVNRSUMwMl9BTExfRkVBVFVSRVMsICJHZW5lcmljIFFJQy0wMiB0YXBlLCBhbGwgZmVhdHVyZXMifSwJICAgICAgXAorCXtNVF9JU1dUNTA5OUVFTjI0LAkiV2FuZ3RlayA1MDk5LWVlbjI0LCA2ME1CIn0sCQkgICAgICBcCisJe01UX0lTVEVBQ19NVDJTVCwJIlRlYWMgTVQtMlNUIDE1NW1iIGRhdGEgY2Fzc2V0dGUgZHJpdmUifSwgICAgIFwKKwl7TVRfSVNFVkVSRVhfRlQ0MEEsCSJFdmVyZXggRlQ0MEEsIFFJQy00MCJ9LAkJICAgICAgXAorCXtNVF9JU1NDU0kxLAkJIkdlbmVyaWMgU0NTSS0xIHRhcGUifSwJCQkgICAgICBcCisJe01UX0lTU0NTSTIsCQkiR2VuZXJpYyBTQ1NJLTIgdGFwZSJ9LAkJCSAgICAgIFwKKwl7MCwgTlVMTH0JCQkJCQkJICAgICAgXAorICB9CisKKworLyogU3RydWN0dXJlIGZvciBNVElPQ1BPUyAtIG1hZyB0YXBlIGdldCBwb3NpdGlvbiBjb21tYW5kLiAgKi8KKworc3RydWN0IG10cG9zCisgIHsKKyAgICBsb25nIGludCBtdF9ibGtubzsJLyogQ3VycmVudCBibG9jayBudW1iZXIuICAqLworICB9OworI2RlZmluZSBfSU9UX210cG9zIC8qIEh1cmQgaW9jdGwgdHlwZSBmaWVsZC4gICovIFwKKyAgX0lPVF9TSU1QTEUgKGxvbmcpCisKKworLyogU3RydWN0dXJlIGZvciBNVElPQ0dFVENPTkZJRy9NVElPQ1NFVENPTkZJRyBwcmltYXJpbHkgaW50ZW5kZWQKKyAgIGFzIGFuIGludGVyaW0gc29sdXRpb24gZm9yIFFJQy0wMiB1bnRpbCBEREkgaXMgZnVsbHkgaW1wbGVtZW50ZWQuICAqLworc3RydWN0IG10Y29uZmlnaW5mbworICB7CisgICAgbG9uZyBpbnQgbXRfdHlwZTsJCS8qIERyaXZlIHR5cGUuICAqLworICAgIGxvbmcgaW50IGlmY190eXBlOwkJLyogSW50ZXJmYWNlIGNhcmQgdHlwZS4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGlycW5yOwkvKiBJUlEgbnVtYmVyIHRvIHVzZS4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGRtYW5yOwkvKiBETUEgY2hhbm5lbCB0byB1c2UuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBwb3J0OwkvKiBJTyBwb3J0IGJhc2UgYWRkcmVzcy4gICovCisKKyAgICB1bnNpZ25lZCBsb25nIGludCBkZWJ1ZzsJLyogRGVidWdnaW5nIGZsYWdzLiAgKi8KKworICAgIHVuc2lnbmVkIGhhdmVfZGVuczoxOworICAgIHVuc2lnbmVkIGhhdmVfYnNmOjE7CisgICAgdW5zaWduZWQgaGF2ZV9mc3I6MTsKKyAgICB1bnNpZ25lZCBoYXZlX2JzcjoxOworICAgIHVuc2lnbmVkIGhhdmVfZW9kOjE7CisgICAgdW5zaWduZWQgaGF2ZV9zZWVrOjE7CisgICAgdW5zaWduZWQgaGF2ZV90ZWxsOjE7CisgICAgdW5zaWduZWQgaGF2ZV9yYXMxOjE7CisgICAgdW5zaWduZWQgaGF2ZV9yYXMyOjE7CisgICAgdW5zaWduZWQgaGF2ZV9yYXMzOjE7CisgICAgdW5zaWduZWQgaGF2ZV9xZmE6MTsKKworICAgIHVuc2lnbmVkIHBhZDE6NTsKKyAgICBjaGFyIHJlc2VydmVkWzEwXTsKKyAgfTsKKyNkZWZpbmUgX0lPVF9tdGNvbmZpZ2luZm8gLyogSHVyZCBpb2N0bCB0eXBlIGZpZWxkLiAgKi8gXAorICBfSU9UIChfSU9UUyAobG9uZyksIDIsIF9JT1RTIChzaG9ydCksIDMsIF9JT1RTIChsb25nKSwgMSkgLyogWFhYIHdyb25nICovCisKKworLyogTWFnbmV0aWMgdGFwZSBJL08gY29udHJvbCBjb21tYW5kcy4gICovCisjZGVmaW5lCU1USU9DVE9QCV9JT1coJ20nLCAxLCBzdHJ1Y3QgbXRvcCkJLyogRG8gYSBtYWcgdGFwZSBvcC4gKi8KKyNkZWZpbmUJTVRJT0NHRVQJX0lPUignbScsIDIsIHN0cnVjdCBtdGdldCkJLyogR2V0IHRhcGUgc3RhdHVzLiAgKi8KKyNkZWZpbmUJTVRJT0NQT1MJX0lPUignbScsIDMsIHN0cnVjdCBtdHBvcykJLyogR2V0IHRhcGUgcG9zaXRpb24uKi8KKworLyogVGhlIG5leHQgdHdvIGFyZSB1c2VkIGJ5IHRoZSBRSUMtMDIgZHJpdmVyIGZvciBydW50aW1lIHJlY29uZmlndXJhdGlvbi4KKyAgIFNlZSB0cHFpYzAyLmggZm9yIHN0cnVjdCBtdGNvbmZpZ2luZm8uICAqLworI2RlZmluZQlNVElPQ0dFVENPTkZJRwlfSU9SKCdtJywgNCwgc3RydWN0IG10Y29uZmlnaW5mbykgLyogR2V0IHRhcGUgY29uZmlnLiovCisjZGVmaW5lCU1USU9DU0VUQ09ORklHCV9JT1coJ20nLCA1LCBzdHJ1Y3QgbXRjb25maWdpbmZvKSAvKiBTZXQgdGFwZSBjb25maWcuKi8KKworLyogR2VuZXJpYyBNYWcgVGFwZSAoZGV2aWNlIGluZGVwZW5kZW50KSBzdGF0dXMgbWFjcm9zIGZvciBleGFtaW5pbmcKKyAgIG10X2dzdGF0IC0tIEhQLVVYIGNvbXBhdGlibGUuCisgICBUaGVyZSBpcyByb29tIGZvciBtb3JlIGdlbmVyaWMgc3RhdHVzIGJpdHMgaGVyZSwgYnV0IEkgZG9uJ3QKKyAgIGtub3cgd2hpY2ggb2YgdGhlbSBhcmUgcmVzZXJ2ZWQuIEF0IGxlYXN0IHRocmVlIG9yIHNvIHNob3VsZAorICAgYmUgYWRkZWQgdG8gbWFrZSB0aGlzIHJlYWxseSB1c2VmdWwuICAqLworI2RlZmluZSBHTVRfRU9GKHgpICAgICAgICAgICAgICAoKHgpICYgMHg4MDAwMDAwMCkKKyNkZWZpbmUgR01UX0JPVCh4KSAgICAgICAgICAgICAgKCh4KSAmIDB4NDAwMDAwMDApCisjZGVmaW5lIEdNVF9FT1QoeCkgICAgICAgICAgICAgICgoeCkgJiAweDIwMDAwMDAwKQorI2RlZmluZSBHTVRfU00oeCkgICAgICAgICAgICAgICAoKHgpICYgMHgxMDAwMDAwMCkgIC8qIEREUyBzZXRtYXJrICovCisjZGVmaW5lIEdNVF9FT0QoeCkgICAgICAgICAgICAgICgoeCkgJiAweDA4MDAwMDAwKSAgLyogRERTIEVPRCAqLworI2RlZmluZSBHTVRfV1JfUFJPVCh4KSAgICAgICAgICAoKHgpICYgMHgwNDAwMDAwMCkKKy8qICNkZWZpbmUgR01UXyA/IAkJKCh4KSAmIDB4MDIwMDAwMDApICovCisjZGVmaW5lIEdNVF9PTkxJTkUoeCkgICAgICAgICAgICgoeCkgJiAweDAxMDAwMDAwKQorI2RlZmluZSBHTVRfRF82MjUwKHgpICAgICAgICAgICAoKHgpICYgMHgwMDgwMDAwMCkKKyNkZWZpbmUgR01UX0RfMTYwMCh4KSAgICAgICAgICAgKCh4KSAmIDB4MDA0MDAwMDApCisjZGVmaW5lIEdNVF9EXzgwMCh4KSAgICAgICAgICAgICgoeCkgJiAweDAwMjAwMDAwKQorLyogI2RlZmluZSBHTVRfID8gCQkoKHgpICYgMHgwMDEwMDAwMCkgKi8KKy8qICNkZWZpbmUgR01UXyA/IAkJKCh4KSAmIDB4MDAwODAwMDApICovCisjZGVmaW5lIEdNVF9EUl9PUEVOKHgpICAgICAgICAgICgoeCkgJiAweDAwMDQwMDAwKSAgLyogRG9vciBvcGVuIChubyB0YXBlKS4gICovCisvKiAjZGVmaW5lIEdNVF8gPyAJCSgoeCkgJiAweDAwMDIwMDAwKSAqLworI2RlZmluZSBHTVRfSU1fUkVQX0VOKHgpICAgICAgICAoKHgpICYgMHgwMDAxMDAwMCkgIC8qIEltbWVkaWF0ZSByZXBvcnQgbW9kZS4qLworLyogMTYgZ2VuZXJpYyBzdGF0dXMgYml0cyB1bnVzZWQuICAqLworCisKKy8qIFNDU0ktdGFwZSBzcGVjaWZpYyBkZWZpbml0aW9ucy4gIEJpdGZpZWxkIHNoaWZ0cyBpbiB0aGUgc3RhdHVzICAqLworI2RlZmluZSBNVF9TVF9CTEtTSVpFX1NISUZUCTAKKyNkZWZpbmUgTVRfU1RfQkxLU0laRV9NQVNLCTB4ZmZmZmZmCisjZGVmaW5lIE1UX1NUX0RFTlNJVFlfU0hJRlQJMjQKKyNkZWZpbmUgTVRfU1RfREVOU0lUWV9NQVNLCTB4ZmYwMDAwMDAKKworI2RlZmluZSBNVF9TVF9TT0ZURVJSX1NISUZUCTAKKyNkZWZpbmUgTVRfU1RfU09GVEVSUl9NQVNLCTB4ZmZmZgorCisvKiBCaXRmaWVsZHMgZm9yIHRoZSBNVFNFVERSVkJVRkZFUiBpb2N0bC4gICovCisjZGVmaW5lIE1UX1NUX09QVElPTlMJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfQk9PTEVBTlMJCTB4MTAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfU0VUQk9PTEVBTlMJMHgzMDAwMDAwMAorI2RlZmluZSBNVF9TVF9DTEVBUkJPT0xFQU5TCTB4NDAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfV1JJVEVfVEhSRVNIT0xECTB4MjAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfREVGX0JMS1NJWkUJMHg1MDAwMDAwMAorI2RlZmluZSBNVF9TVF9ERUZfT1BUSU9OUwkweDYwMDAwMDAwCisKKyNkZWZpbmUgTVRfU1RfQlVGRkVSX1dSSVRFUwkweDEKKyNkZWZpbmUgTVRfU1RfQVNZTkNfV1JJVEVTCTB4MgorI2RlZmluZSBNVF9TVF9SRUFEX0FIRUFECTB4NAorI2RlZmluZSBNVF9TVF9ERUJVR0dJTkcJCTB4OAorI2RlZmluZSBNVF9TVF9UV09fRk0JCTB4MTAKKyNkZWZpbmUgTVRfU1RfRkFTVF9NVEVPTQkweDIwCisjZGVmaW5lIE1UX1NUX0FVVE9fTE9DSwkJMHg0MAorI2RlZmluZSBNVF9TVF9ERUZfV1JJVEVTCTB4ODAKKyNkZWZpbmUgTVRfU1RfQ0FOX0JTUgkJMHgxMDAKKyNkZWZpbmUgTVRfU1RfTk9fQkxLTElNUwkweDIwMAorI2RlZmluZSBNVF9TVF9DQU5fUEFSVElUSU9OUyAgICAweDQwMAorI2RlZmluZSBNVF9TVF9TQ1NJMkxPR0lDQUwgICAgICAweDgwMAorCisvKiBUaGUgbW9kZSBwYXJhbWV0ZXJzIHRvIGJlIGNvbnRyb2xsZWQuIFBhcmFtZXRlciBjaG9zZW4gd2l0aCBiaXRzIDIwLTI4LiAgKi8KKyNkZWZpbmUgTVRfU1RfQ0xFQVJfREVGQVVMVAkweGZmZmZmCisjZGVmaW5lIE1UX1NUX0RFRl9ERU5TSVRZCShNVF9TVF9ERUZfT1BUSU9OUyB8IDB4MTAwMDAwKQorI2RlZmluZSBNVF9TVF9ERUZfQ09NUFJFU1NJT04JKE1UX1NUX0RFRl9PUFRJT05TIHwgMHgyMDAwMDApCisjZGVmaW5lIE1UX1NUX0RFRl9EUlZCVUZGRVIJKE1UX1NUX0RFRl9PUFRJT05TIHwgMHgzMDAwMDApCisKKy8qIFRoZSBvZmZzZXQgZm9yIHRoZSBhcmd1bWVudHMgZm9yIHRoZSBzcGVjaWFsIEhQIGNoYW5nZXIgbG9hZCBjb21tYW5kLiAgKi8KKyNkZWZpbmUgTVRfU1RfSFBMT0FERVJfT0ZGU0VUIDEwMDAwCisKKworLyogU3BlY2lmeSBkZWZhdWx0IHRhcGUgZGV2aWNlLiAgKi8KKyNpZm5kZWYgREVGVEFQRQorIyBkZWZpbmUgREVGVEFQRQkiL2Rldi90YXBlIgorI2VuZGlmCisKKyNlbmRpZiAvKiBtdGlvLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3BhcmFtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOGY1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wYXJhbS5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LDIwMDAsMjAwMSwyMDAzLDIwMDgsMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19QQVJBTV9ICisjZGVmaW5lIF9TWVNfUEFSQU1fSAkxCisKKyNpZm5kZWYgQVJHX01BWAorIyBkZWZpbmUgX191bmRlZl9BUkdfTUFYCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisKKy8qIFRoZSBrZXJuZWwgaGVhZGVycyBkZWZpbmVzIEFSR19NQVguICBUaGUgdmFsdWUgaXMgd3JvbmcsIHRob3VnaC4gICovCisjaWZkZWYgX191bmRlZl9BUkdfTUFYCisjIHVuZGVmIEFSR19NQVgKKyMgdW5kZWYgX191bmRlZl9BUkdfTUFYCisjZW5kaWYKKworLyogQlNEIG5hbWVzIGZvciBzb21lIDxsaW1pdHMuaD4gdmFsdWVzLiAgKi8KKworI2RlZmluZQlOQkJZCQlDSEFSX0JJVAorI2lmbmRlZglOR1JPVVBTCisjIGRlZmluZSBOR1JPVVBTCU5HUk9VUFNfTUFYCisjZW5kaWYKKyNkZWZpbmUJTUFYU1lNTElOS1MJMjAKKyNkZWZpbmUJQ0FOQlNJWgkJTUFYX0NBTk9OCisjZGVmaW5lIE1BWFBBVEhMRU4JUEFUSF9NQVgKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIG5vdCByZWFsbHkgY29ycmVjdCBidXQgaXQgaXMgYSB2YWx1ZSB3ZSB1c2VkIGZvciBhCisgICBsb25nIHRpbWUgYW5kIHdoaWNoIHNlZW1zIHRvIGJlIHVzYWJsZS4gIFBlb3BsZSBzaG91bGQgbm90IHVzZSBOT0ZJTEUKKyAgIGFuZCBOQ0FSR1MgYW55d2F5LiAgKi8KKyNkZWZpbmUgTk9GSUxFCQkyNTYKKyNkZWZpbmUJTkNBUkdTCQkxMzEwNzIKKworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIEJpdCBtYXAgcmVsYXRlZCBtYWNyb3MuICAqLworI2RlZmluZQlzZXRiaXQoYSxpKQkoKGEpWyhpKS9OQkJZXSB8PSAxPDwoKGkpJU5CQlkpKQorI2RlZmluZQljbHJiaXQoYSxpKQkoKGEpWyhpKS9OQkJZXSAmPSB+KDE8PCgoaSklTkJCWSkpKQorI2RlZmluZQlpc3NldChhLGkpCSgoYSlbKGkpL05CQlldICYgKDE8PCgoaSklTkJCWSkpKQorI2RlZmluZQlpc2NscihhLGkpCSgoKGEpWyhpKS9OQkJZXSAmICgxPDwoKGkpJU5CQlkpKSkgPT0gMCkKKworLyogTWFjcm9zIGZvciBjb3VudGluZyBhbmQgcm91bmRpbmcuICAqLworI2lmbmRlZiBob3dtYW55CisjIGRlZmluZSBob3dtYW55KHgsIHkpCSgoKHgpICsgKCh5KSAtIDEpKSAvICh5KSkKKyNlbmRpZgorI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSByb3VuZHVwKHgsIHkpCShfX2J1aWx0aW5fY29uc3RhbnRfcCAoeSkgJiYgcG93ZXJvZjIgKHkpCSAgICAgIFwKKwkJCSA/ICgoKHgpICsgKHkpIC0gMSkgJiB+KCh5KSAtIDEpKQkJICAgICAgXAorCQkJIDogKCgoKHgpICsgKCh5KSAtIDEpKSAvICh5KSkgKiAoeSkpKQorI2Vsc2UKKyMgZGVmaW5lIHJvdW5kdXAoeCwgeSkJKCgoKHgpICsgKCh5KSAtIDEpKSAvICh5KSkgKiAoeSkpCisjZW5kaWYKKyNkZWZpbmUgcG93ZXJvZjIoeCkJKCgoKHgpIC0gMSkgJiAoeCkpID09IDApCisKKy8qIE1hY3JvcyBmb3IgbWluL21heC4gICovCisjZGVmaW5lCU1JTihhLGIpICgoKGEpPChiKSk/KGEpOihiKSkKKyNkZWZpbmUJTUFYKGEsYikgKCgoYSk+KGIpKT8oYSk6KGIpKQorCisKKy8qIFVuaXQgb2YgYHN0X2Jsb2NrcycuICAqLworI2RlZmluZSBERVZfQlNJWkUgICAgICAgNTEyCisKKworI2VuZGlmCS8qIHN5cy9wYXJhbS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wY2kuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjYyNjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wY2kuaApAQCAtMCwwICsxLDI1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19QQ0lfSAorI2RlZmluZSBfU1lTX1BDSV9ICTEKKworLyogV2UgdXNlIHRoZSBjb25zdGFudHMgZnJvbSB0aGUga2VybmVsLiAgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2VuZGlmIC8qIHN5cy9wY2kuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcGVybS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcGVybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODllNjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wZXJtLmgKQEAgLTAsMCArMSwzNiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUEVSTV9ICisKKyNkZWZpbmUgX1NZU19QRVJNX0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogU2V0IHBvcnQgaW5wdXQvb3V0cHV0IHBlcm1pc3Npb25zLiAgKi8KK2V4dGVybiBpbnQgaW9wZXJtICh1bnNpZ25lZCBsb25nIGludCBfX2Zyb20sIHVuc2lnbmVkIGxvbmcgaW50IF9fbnVtLAorCQkgICBpbnQgX190dXJuX29uKSBfX1RIUk9XOworCisKKy8qIENoYW5nZSBJL08gcHJpdmlsZWdlIGxldmVsLiAgKi8KK2V4dGVybiBpbnQgaW9wbCAoaW50IF9fbGV2ZWwpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBfU1lTX1BFUk1fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcGVyc29uYWxpdHkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3BlcnNvbmFsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzYTRlZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3BlcnNvbmFsaXR5LmgKQEAgLTAsMCArMSw3OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBUYWtlbiB2ZXJiYXRpbSBmcm9tIExpbnV4IDIuNiAoaW5jbHVkZS9saW51eC9wZXJzb25hbGl0eS5oKS4gICovCisKKyNpZm5kZWYgX1NZU19QRVJTT05BTElUWV9ICisjZGVmaW5lIF9TWVNfUEVSU09OQUxJVFlfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBGbGFncyBmb3IgYnVnIGVtdWxhdGlvbi4KKyAgIFRoZXNlIG9jY3VweSB0aGUgdG9wIHRocmVlIGJ5dGVzLiAgKi8KK2VudW0KKyAgeworICAgIEFERFJfTk9fUkFORE9NSVpFID0gMHgwMDQwMDAwLAorICAgIE1NQVBfUEFHRV9aRVJPID0gMHgwMTAwMDAwLAorICAgIEFERFJfQ09NUEFUX0xBWU9VVCA9IDB4MDIwMDAwMCwKKyAgICBSRUFEX0lNUExJRVNfRVhFQyA9IDB4MDQwMDAwMCwKKyAgICBBRERSX0xJTUlUXzMyQklUID0gMHgwODAwMDAwLAorICAgIFNIT1JUX0lOT0RFID0gMHgxMDAwMDAwLAorICAgIFdIT0xFX1NFQ09ORFMgPSAweDIwMDAwMDAsCisgICAgU1RJQ0tZX1RJTUVPVVRTID0gMHg0MDAwMDAwLAorICAgIEFERFJfTElNSVRfM0dCID0gCTB4ODAwMDAwMAorICB9OworCisvKiBQZXJzb25hbGl0eSB0eXBlcy4KKworICAgVGhlc2UgZ28gaW4gdGhlIGxvdyBieXRlLiAgQXZvaWQgdXNpbmcgdGhlIHRvcCBiaXQsIGl0IHdpbGwKKyAgIGNvbmZsaWN0IHdpdGggZXJyb3IgcmV0dXJucy4gICovCitlbnVtIAorICB7CisgICAgUEVSX0xJTlVYID0gMHgwMDAwLAorICAgIFBFUl9MSU5VWF8zMkJJVCA9IDB4MDAwMCB8IEFERFJfTElNSVRfMzJCSVQsCisgICAgUEVSX1NWUjQgPSAweDAwMDEgfCBTVElDS1lfVElNRU9VVFMgfCBNTUFQX1BBR0VfWkVSTywKKyAgICBQRVJfU1ZSMyA9IDB4MDAwMiB8IFNUSUNLWV9USU1FT1VUUyB8IFNIT1JUX0lOT0RFLAorICAgIFBFUl9TQ09TVlIzID0gMHgwMDAzIHwgU1RJQ0tZX1RJTUVPVVRTIHwgV0hPTEVfU0VDT05EUyB8IFNIT1JUX0lOT0RFLAorICAgIFBFUl9PU1I1ID0gMHgwMDAzIHwgU1RJQ0tZX1RJTUVPVVRTIHwgV0hPTEVfU0VDT05EUywKKyAgICBQRVJfV1lTRVYzODYgPSAweDAwMDQgfCBTVElDS1lfVElNRU9VVFMgfCBTSE9SVF9JTk9ERSwKKyAgICBQRVJfSVNDUjQgPSAweDAwMDUgfCBTVElDS1lfVElNRU9VVFMsCisgICAgUEVSX0JTRCA9IDB4MDAwNiwKKyAgICBQRVJfU1VOT1MgPSAweDAwMDYgfCBTVElDS1lfVElNRU9VVFMsCisgICAgUEVSX1hFTklYID0gMHgwMDA3IHwgU1RJQ0tZX1RJTUVPVVRTIHwgU0hPUlRfSU5PREUsCisgICAgUEVSX0xJTlVYMzIgPSAweDAwMDgsCisgICAgUEVSX0xJTlVYMzJfM0dCID0gMHgwMDA4IHwgQUREUl9MSU1JVF8zR0IsCisgICAgUEVSX0lSSVgzMiA9IDB4MDAwOSB8IFNUSUNLWV9USU1FT1VUUywJLyogSVJJWDUgMzItYml0ICovCisgICAgUEVSX0lSSVhOMzIgPSAweDAwMGEgfCBTVElDS1lfVElNRU9VVFMsCS8qIElSSVg2IG5ldyAzMi1iaXQgKi8KKyAgICBQRVJfSVJJWDY0ID0gMHgwMDBiIHwgU1RJQ0tZX1RJTUVPVVRTLAkvKiBJUklYNiA2NC1iaXQgKi8KKyAgICBQRVJfUklTQ09TID0gMHgwMDBjLAorICAgIFBFUl9TT0xBUklTID0gMHgwMDBkIHwgU1RJQ0tZX1RJTUVPVVRTLAorICAgIFBFUl9VVzcgPSAweDAwMGUgfCBTVElDS1lfVElNRU9VVFMgfCBNTUFQX1BBR0VfWkVSTywKKyAgICBQRVJfT1NGNCA9IDB4MDAwZiwKKyAgICBQRVJfSFBVWCA9IDB4MDAxMCwKKyAgICBQRVJfTUFTSyA9IDB4MDBmZiwKKyAgfTsKKworX19CRUdJTl9ERUNMUworCisvKiBTZXQgZGlmZmVyZW50IEFCSXMgKHBlcnNvbmFsaXRpZXMpLiAgKi8KK2V4dGVybiBpbnQgcGVyc29uYWxpdHkgKHVuc2lnbmVkIGxvbmcgaW50IF9fcGVyc29uYSkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9wZXJzb25hbGl0eS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wb2xsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4NWI3OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3BvbGwuaApAQCAtMCwwICsxLDc0IEBACisvKiBDb21wYXRpYmlsaXR5IGRlZmluaXRpb25zIGZvciBTeXN0ZW0gViBgcG9sbCcgaW50ZXJmYWNlLgorICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTYtMjAwMSwyMDA0LDIwMDUsMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX1BPTExfSAorI2RlZmluZQlfU1lTX1BPTExfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgdGhlIHBsYXRmb3JtIGRlcGVuZGVudCBiaXRzIG9mIGBwb2xsJy4gICovCisjaW5jbHVkZSA8Yml0cy9wb2xsLmg+CisjaWZkZWYgX19VU0VfR05VCisvKiBHZXQgdGhlIF9fc2lnc2V0X3QgZGVmaW5pdGlvbi4gICovCisjIGluY2x1ZGUgPGJpdHMvc2lnc2V0Lmg+CisvKiBHZXQgdGhlIHRpbWVzcGVjIGRlZmluaXRpb24uICAqLworIyBkZWZpbmUgX19uZWVkX3RpbWVzcGVjCisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisKKy8qIFR5cGUgdXNlZCBmb3IgdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgbmZkc190OworCisvKiBEYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgcG9sbGluZyByZXF1ZXN0LiAgKi8KK3N0cnVjdCBwb2xsZmQKKyAgeworICAgIGludCBmZDsJCQkvKiBGaWxlIGRlc2NyaXB0b3IgdG8gcG9sbC4gICovCisgICAgc2hvcnQgaW50IGV2ZW50czsJCS8qIFR5cGVzIG9mIGV2ZW50cyBwb2xsZXIgY2FyZXMgYWJvdXQuICAqLworICAgIHNob3J0IGludCByZXZlbnRzOwkJLyogVHlwZXMgb2YgZXZlbnRzIHRoYXQgYWN0dWFsbHkgb2NjdXJyZWQuICAqLworICB9OworCisKK19fQkVHSU5fREVDTFMKKworLyogUG9sbCB0aGUgZmlsZSBkZXNjcmlwdG9ycyBkZXNjcmliZWQgYnkgdGhlIE5GRFMgc3RydWN0dXJlcyBzdGFydGluZyBhdAorICAgRkRTLiAgSWYgVElNRU9VVCBpcyBub256ZXJvIGFuZCBub3QgLTEsIGFsbG93IFRJTUVPVVQgbWlsbGlzZWNvbmRzIGZvcgorICAgYW4gZXZlbnQgdG8gb2NjdXI7IGlmIFRJTUVPVVQgaXMgLTEsIGJsb2NrIHVudGlsIGFuIGV2ZW50IG9jY3Vycy4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIHdpdGggZXZlbnRzLCB6ZXJvIGlmIHRpbWVkIG91dCwKKyAgIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwb2xsIChzdHJ1Y3QgcG9sbGZkICpfX2ZkcywgbmZkc190IF9fbmZkcywgaW50IF9fdGltZW91dCk7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIExpa2UgcG9sbCwgYnV0IGJlZm9yZSB3YWl0aW5nIHRoZSB0aHJlYWRzIHNpZ25hbCBtYXNrIGlzIHJlcGxhY2VkCisgICB3aXRoIHRoYXQgc3BlY2lmaWVkIGluIHRoZSBmb3VydGggcGFyYW1ldGVyLiAgRm9yIGJldHRlciB1c2FiaWxpdHksCisgICB0aGUgdGltZW91dCB2YWx1ZSBpcyBzcGVjaWZpZWQgdXNpbmcgYSBUSU1FU1BFQyBvYmplY3QuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwcG9sbCAoc3RydWN0IHBvbGxmZCAqX19mZHMsIG5mZHNfdCBfX25mZHMsCisJCSAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fdGltZW91dCwKKwkJICBfX2NvbnN0IF9fc2lnc2V0X3QgKl9fc3MpOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvcG9sbC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wcmN0bC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcHJjdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTliNzJkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcHJjdGwuaApAQCAtMCwwICsxLDMyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19QUkNUTF9ICisjZGVmaW5lIF9TWVNfUFJDVExfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ByY3RsLmg+ICAvKiAgVGhlIG1hZ2ljIHZhbHVlcyBjb21lIGZyb20gaGVyZSAgKi8KKworX19CRUdJTl9ERUNMUworCisvKiBDb250cm9sIHByb2Nlc3MgZXhlY3V0aW9uLiAgKi8KK2V4dGVybiBpbnQgcHJjdGwgKGludCBfX29wdGlvbiwgLi4uKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgIC8qIHN5cy9wcmN0bC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wcm9jZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Byb2Nmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYmU0MzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wcm9jZnMuaApAQCAtMCwwICsxLDEzMSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUFJPQ0ZTX0gKKyNkZWZpbmUgX1NZU19QUk9DRlNfSAkxCisKKy8qIFRoaXMgaXMgc29tZXdoYXQgbW9kZWxsZWQgYWZ0ZXIgdGhlIGZpbGUgb2YgdGhlIHNhbWUgbmFtZSBvbiBTVlI0CisgICBzeXN0ZW1zLiAgSXQgcHJvdmlkZXMgYSBkZWZpbml0aW9uIG9mIHRoZSBjb3JlIGZpbGUgZm9ybWF0IGZvciBFTEYKKyAgIHVzZWQgb24gTGludXguICBJdCBkb2Vzbid0IGhhdmUgYW55dGhpbmcgdG8gZG8gd2l0aCB0aGUgL3Byb2MgZmlsZQorICAgc3lzdGVtLCBldmVuIHRob3VnaCBMaW51eCBoYXMgb25lLgorCisgICBBbnl3YXksIHRoZSB3aG9sZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyBmb3IgR0RCIGFuZCBHREIgb25seS4KKyAgIERvbid0IHJlYWQgdG9vIG11Y2ggaW50byBpdC4gIERvbid0IHVzZSBpdCBmb3IgYW55dGhpbmcgb3RoZXIgdGhhbgorICAgR0RCIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuICAqLworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy91c2VyLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVHlwZSBmb3IgYSBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXIuICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9ncmVnX3Q7CisKKy8qIEFuZCB0aGUgd2hvbGUgYnVuY2ggb2YgdGhlbS4gIFdlIGNvdWxkIGhhdmUgdXNlZCBgc3RydWN0CisgICB1c2VyX3JlZ3Nfc3RydWN0JyBkaXJlY3RseSBpbiB0aGUgdHlwZWRlZiwgYnV0IHRyYWRpdGlvbiBzYXlzIHRoYXQKKyAgIHRoZSByZWdpc3RlciBzZXQgaXMgYW4gYXJyYXksIHdoaWNoIGRvZXMgaGF2ZSBzb21lIHBlY3VsaWFyCisgICBzZW1hbnRpY3MsIHNvIGxlYXZlIGl0IHRoYXQgd2F5LiAgKi8KKyNkZWZpbmUgRUxGX05HUkVHIChzaXplb2YgKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0KSAvIHNpemVvZihlbGZfZ3JlZ190KSkKK3R5cGVkZWYgZWxmX2dyZWdfdCBlbGZfZ3JlZ3NldF90W0VMRl9OR1JFR107CisKKy8qIFJlZ2lzdGVyIHNldCBmb3IgdGhlIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycy4gICovCit0eXBlZGVmIHN0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QgZWxmX2ZwcmVnc2V0X3Q7CisKKy8qIFJlZ2lzdGVyIHNldCBmb3IgdGhlIGV4dGVuZGVkIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycy4gIEluY2x1ZGVzCisgICB0aGUgUGVudGl1bSBJSUkgU1NFIHJlZ2lzdGVycyBpbiBhZGRpdGlvbiB0byB0aGUgY2xhc3NpYworICAgZmxvYXRpbmctcG9pbnQgc3R1ZmYuICAqLwordHlwZWRlZiBzdHJ1Y3QgdXNlcl9mcHhyZWdzX3N0cnVjdCBlbGZfZnB4cmVnc2V0X3Q7CisKKworLyogU2lnbmFsIGluZm8uICAqLworc3RydWN0IGVsZl9zaWdpbmZvCisgIHsKKyAgICBpbnQgc2lfc2lnbm87CQkJLyogU2lnbmFsIG51bWJlci4gICovCisgICAgaW50IHNpX2NvZGU7CQkJLyogRXh0cmEgY29kZS4gICovCisgICAgaW50IHNpX2Vycm5vOwkJCS8qIEVycm5vLiAgKi8KKyAgfTsKKworCisvKiBEZWZpbml0aW9ucyB0byBnZW5lcmF0ZSBJbnRlbCBTVlI0LWxpa2UgY29yZSBmaWxlcy4gIFRoZXNlIG1vc3RseQorICAgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgU1ZSNCB0eXBlcyB3aXRoICJlbGZfIiB0YWNrZWQgb24gdGhlCisgICBmcm9udCB0byBwcmV2ZW50IGNsYXNoZXMgd2l0aCBMaW51eCBkZWZpbml0aW9ucywgYW5kIHRoZSB0eXBlZGVmCisgICBmb3JtcyBoYXZlIGJlZW4gYXZvaWRlZC4gIFRoaXMgaXMgbW9zdGx5IGxpa2UgdGhlIFNWUjQgc3RydWN0dXJlLAorICAgYnV0IG1vcmUgTGludXh5LCB3aXRoIHRoaW5ncyB0aGF0IExpbnV4IGRvZXMgbm90IHN1cHBvcnQgYW5kIHdoaWNoCisgICBHREIgZG9lc24ndCByZWFsbHkgdXNlIGV4Y2x1ZGVkLiAgKi8KKworc3RydWN0IGVsZl9wcnN0YXR1cworICB7CisgICAgc3RydWN0IGVsZl9zaWdpbmZvIHByX2luZm87CQkvKiBJbmZvIGFzc29jaWF0ZWQgd2l0aCBzaWduYWwuICAqLworICAgIHNob3J0IGludCBwcl9jdXJzaWc7CQkvKiBDdXJyZW50IHNpZ25hbC4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgcHJfc2lncGVuZDsJLyogU2V0IG9mIHBlbmRpbmcgc2lnbmFscy4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgcHJfc2lnaG9sZDsJLyogU2V0IG9mIGhlbGQgc2lnbmFscy4gICovCisgICAgX19waWRfdCBwcl9waWQ7CisgICAgX19waWRfdCBwcl9wcGlkOworICAgIF9fcGlkX3QgcHJfcGdycDsKKyAgICBfX3BpZF90IHByX3NpZDsKKyAgICBzdHJ1Y3QgdGltZXZhbCBwcl91dGltZTsJCS8qIFVzZXIgdGltZS4gICovCisgICAgc3RydWN0IHRpbWV2YWwgcHJfc3RpbWU7CQkvKiBTeXN0ZW0gdGltZS4gICovCisgICAgc3RydWN0IHRpbWV2YWwgcHJfY3V0aW1lOwkJLyogQ3VtdWxhdGl2ZSB1c2VyIHRpbWUuICAqLworICAgIHN0cnVjdCB0aW1ldmFsIHByX2NzdGltZTsJCS8qIEN1bXVsYXRpdmUgc3lzdGVtIHRpbWUuICAqLworICAgIGVsZl9ncmVnc2V0X3QgcHJfcmVnOwkJLyogR1AgcmVnaXN0ZXJzLiAgKi8KKyAgICBpbnQgcHJfZnB2YWxpZDsJCQkvKiBUcnVlIGlmIG1hdGggY29wcm8gYmVpbmcgdXNlZC4gICovCisgIH07CisKKworI2RlZmluZSBFTEZfUFJBUkdTWiAgICAgKDgwKSAgICAvKiBOdW1iZXIgb2YgY2hhcnMgZm9yIGFyZ3MuICAqLworCitzdHJ1Y3QgZWxmX3BycHNpbmZvCisgIHsKKyAgICBjaGFyIHByX3N0YXRlOwkJCS8qIE51bWVyaWMgcHJvY2VzcyBzdGF0ZS4gICovCisgICAgY2hhciBwcl9zbmFtZTsJCQkvKiBDaGFyIGZvciBwcl9zdGF0ZS4gICovCisgICAgY2hhciBwcl96b21iOwkJCS8qIFpvbWJpZS4gICovCisgICAgY2hhciBwcl9uaWNlOwkJCS8qIE5pY2UgdmFsLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBwcl9mbGFnOwkJLyogRmxhZ3MuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBwcl91aWQ7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHByX2dpZDsKKyAgICBpbnQgcHJfcGlkLCBwcl9wcGlkLCBwcl9wZ3JwLCBwcl9zaWQ7CisgICAgLyogTG90cyBtaXNzaW5nICovCisgICAgY2hhciBwcl9mbmFtZVsxNl07CQkJLyogRmlsZW5hbWUgb2YgZXhlY3V0YWJsZS4gICovCisgICAgY2hhciBwcl9wc2FyZ3NbRUxGX1BSQVJHU1pdOwkvKiBJbml0aWFsIHBhcnQgb2YgYXJnIGxpc3QuICAqLworICB9OworCisKKy8qIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBwcm92aWRlcyB0aGUgdHlwZXMgZm9yIGVtdWxhdGlvbiBvZiB0aGUKKyAgIFNvbGFyaXMgPHByb2Nfc2VydmljZS5oPiBpbnRlcmZhY2VzIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5CisgICB1c2VycyBvZiBsaWJ0aHJlYWRfZGIuICAqLworCisvKiBBZGRyZXNzZXMuICAqLwordHlwZWRlZiB2b2lkICpwc2FkZHJfdDsKKworLyogUmVnaXN0ZXIgc2V0cy4gIExpbnV4IGhhcyBkaWZmZXJlbnQgbmFtZXMuICAqLwordHlwZWRlZiBlbGZfZ3JlZ3NldF90IHByZ3JlZ3NldF90OwordHlwZWRlZiBlbGZfZnByZWdzZXRfdCBwcmZwcmVnc2V0X3Q7CisKKy8qIFdlIGRvbid0IGhhdmUgYW55IGRpZmZlcmVuY2VzIGJldHdlZW4gcHJvY2Vzc2VzIGFuZCB0aHJlYWRzLAorICAgdGhlcmVmb3JlIGhhdmUgb25seSBvbmUgUElEIHR5cGUuICAqLwordHlwZWRlZiBfX3BpZF90IGx3cGlkX3Q7CisKKy8qIFByb2Nlc3Mgc3RhdHVzIGFuZCBpbmZvLiAgSW4gdGhlIGVuZCB3ZSBkbyBwcm92aWRlIHR5cGVkZWZzIGZvciB0aGVtLiAgKi8KK3R5cGVkZWYgc3RydWN0IGVsZl9wcnN0YXR1cyBwcnN0YXR1c190OwordHlwZWRlZiBzdHJ1Y3QgZWxmX3BycHNpbmZvIHBycHNpbmZvX3Q7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvcHJvY2ZzLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Byb2ZpbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcHJvZmlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0OGVjNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Byb2ZpbC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUFJPRklMX0gKKyNkZWZpbmUgX1BST0ZJTF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIHNwcm9maWwoKSBzeXN0ZW0gY2FsbHMgYXMKKyAgIGRlc2NyaWJlZCBieSB0aGUgc3Byb2ZpbCgyKSBtYW4gcGFnZSBvZiBJcml4IHY2LjUsIGV4Y2VwdCB0aGF0OgorCisJLSB0aGVyZSBpcyBubyBhIHByaW9yaSBsaW1pdCBvbiBudW1iZXIgb2YgdGV4dCBzZWN0aW9ucworCS0gcHJfc2NhbGUgaXMgZGVjbGFyZWQgYXMgdW5zaWduZWQgbG9uZyAoaW5zdGVhZCBvZiAidW5zaWduZWQgaW50IikKKwktIHByX3NpemUgaXMgZGVjbGFyZWQgYXMgc2l6ZV90IChpbnN0ZWFkIG9mICJ1bnNpZ25lZCBpbnQiKQorCS0gcHJfb2ZmIGlzIGRlY2xhcmVkIGFzIHZvaWQgKiAoaW5zdGVhZCBvZiAiX19wc3Vuc2lnbmVkX3QiKQorCS0gdGhlIG92ZXJmbG93IGJpbiAocHJfYmFzZT09MCwgcHJfc2NhbGU9PTIpIGNhbiBhcHBlYXIgYW55d2hlcmUKKwkgIGluIHRoZSBwcm9mcCBhcnJheQorCS0gUFJPRl9GQVNUIGhhcyBubyBlZmZlY3QgICovCisKK3N0cnVjdCBwcm9mCisgIHsKKyAgICB2b2lkICpwcl9iYXNlOwkJLyogYnVmZmVyIGJhc2UgKi8KKyAgICBzaXplX3QgcHJfc2l6ZTsJCS8qIGJ1ZmZlciBzaXplICovCisgICAgc2l6ZV90IHByX29mZjsJCS8qIHBjIG9mZnNldCAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHByX3NjYWxlOwkvKiBwYyBzY2FsaW5nIChmaXhlZC1wb2ludCBudW1iZXIpICovCisgIH07CisKK2VudW0KKyAgeworICAgIFBST0ZfVVNIT1JUCT0gMCwJCS8qIHVzZSAxNi1iaXQgY291bnRlcnMgKGRlZmF1bHQpICovCisgICAgUFJPRl9VSU5UCT0gMSA8PCAwLAkvKiB1c2UgMzItYml0IGNvdW50ZXJzICovCisgICAgUFJPRl9GQVNUICAgPSAxIDw8IDEJLyogcHJvZmlsZSBmYXN0ZXIgdGhhbiB1c3VhbCAqLworICB9OworCisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCBzcHJvZmlsIChzdHJ1Y3QgcHJvZiAqX19wcm9mcCwgaW50IF9fcHJvZmNudCwKKwkJICAgIHN0cnVjdCB0aW1ldmFsICpfX3R2cCwgdW5zaWduZWQgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBwcm9maWwuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcHRyYWNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBmMjk0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcHRyYWNlLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qIGBwdHJhY2UnIGRlYnVnZ2VyIHN1cHBvcnQgaW50ZXJmYWNlLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5LDIwMDAsMjAwNiwyMDA3LDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19QVFJBQ0VfSAorI2RlZmluZSBfU1lTX1BUUkFDRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVHlwZSBvZiB0aGUgUkVRVUVTVCBhcmd1bWVudCB0byBgcHRyYWNlLicgICovCitlbnVtIF9fcHRyYWNlX3JlcXVlc3QKK3sKKyAgLyogSW5kaWNhdGUgdGhhdCB0aGUgcHJvY2VzcyBtYWtpbmcgdGhpcyByZXF1ZXN0IHNob3VsZCBiZSB0cmFjZWQuCisgICAgIEFsbCBzaWduYWxzIHJlY2VpdmVkIGJ5IHRoaXMgcHJvY2VzcyBjYW4gYmUgaW50ZXJjZXB0ZWQgYnkgaXRzCisgICAgIHBhcmVudCwgYW5kIGl0cyBwYXJlbnQgY2FuIHVzZSB0aGUgb3RoZXIgYHB0cmFjZScgcmVxdWVzdHMuICAqLworICBQVFJBQ0VfVFJBQ0VNRSA9IDAsCisjZGVmaW5lIFBUX1RSQUNFX01FIFBUUkFDRV9UUkFDRU1FCisKKyAgLyogUmV0dXJuIHRoZSB3b3JkIGluIHRoZSBwcm9jZXNzJ3MgdGV4dCBzcGFjZSBhdCBhZGRyZXNzIEFERFIuICAqLworICBQVFJBQ0VfUEVFS1RFWFQgPSAxLAorI2RlZmluZSBQVF9SRUFEX0kgUFRSQUNFX1BFRUtURVhUCisKKyAgLyogUmV0dXJuIHRoZSB3b3JkIGluIHRoZSBwcm9jZXNzJ3MgZGF0YSBzcGFjZSBhdCBhZGRyZXNzIEFERFIuICAqLworICBQVFJBQ0VfUEVFS0RBVEEgPSAyLAorI2RlZmluZSBQVF9SRUFEX0QgUFRSQUNFX1BFRUtEQVRBCisKKyAgLyogUmV0dXJuIHRoZSB3b3JkIGluIHRoZSBwcm9jZXNzJ3MgdXNlciBhcmVhIGF0IG9mZnNldCBBRERSLiAgKi8KKyAgUFRSQUNFX1BFRUtVU0VSID0gMywKKyNkZWZpbmUgUFRfUkVBRF9VIFBUUkFDRV9QRUVLVVNFUgorCisgIC8qIFdyaXRlIHRoZSB3b3JkIERBVEEgaW50byB0aGUgcHJvY2VzcydzIHRleHQgc3BhY2UgYXQgYWRkcmVzcyBBRERSLiAgKi8KKyAgUFRSQUNFX1BPS0VURVhUID0gNCwKKyNkZWZpbmUgUFRfV1JJVEVfSSBQVFJBQ0VfUE9LRVRFWFQKKworICAvKiBXcml0ZSB0aGUgd29yZCBEQVRBIGludG8gdGhlIHByb2Nlc3MncyBkYXRhIHNwYWNlIGF0IGFkZHJlc3MgQUREUi4gICovCisgIFBUUkFDRV9QT0tFREFUQSA9IDUsCisjZGVmaW5lIFBUX1dSSVRFX0QgUFRSQUNFX1BPS0VEQVRBCisKKyAgLyogV3JpdGUgdGhlIHdvcmQgREFUQSBpbnRvIHRoZSBwcm9jZXNzJ3MgdXNlciBhcmVhIGF0IG9mZnNldCBBRERSLiAgKi8KKyAgUFRSQUNFX1BPS0VVU0VSID0gNiwKKyNkZWZpbmUgUFRfV1JJVEVfVSBQVFJBQ0VfUE9LRVVTRVIKKworICAvKiBDb250aW51ZSB0aGUgcHJvY2Vzcy4gICovCisgIFBUUkFDRV9DT05UID0gNywKKyNkZWZpbmUgUFRfQ09OVElOVUUgUFRSQUNFX0NPTlQKKworICAvKiBLaWxsIHRoZSBwcm9jZXNzLiAgKi8KKyAgUFRSQUNFX0tJTEwgPSA4LAorI2RlZmluZSBQVF9LSUxMIFBUUkFDRV9LSUxMCisKKyAgLyogU2luZ2xlIHN0ZXAgdGhlIHByb2Nlc3MuCisgICAgIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgbWFjaGluZXMuICAqLworICBQVFJBQ0VfU0lOR0xFU1RFUCA9IDksCisjZGVmaW5lIFBUX1NURVAgUFRSQUNFX1NJTkdMRVNURVAKKworICAvKiBHZXQgYWxsIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgdXNlZCBieSBhIHByb2Nlc3Nlcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgICBQVFJBQ0VfR0VUUkVHUyA9IDEyLAorI2RlZmluZSBQVF9HRVRSRUdTIFBUUkFDRV9HRVRSRUdTCisKKyAgLyogU2V0IGFsbCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIHVzZWQgYnkgYSBwcm9jZXNzZXMuCisgICAgIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgbWFjaGluZXMuICAqLworICAgUFRSQUNFX1NFVFJFR1MgPSAxMywKKyNkZWZpbmUgUFRfU0VUUkVHUyBQVFJBQ0VfU0VUUkVHUworCisgIC8qIEdldCBhbGwgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHVzZWQgYnkgYSBwcm9jZXNzZXMuCisgICAgIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgbWFjaGluZXMuICAqLworICAgUFRSQUNFX0dFVEZQUkVHUyA9IDE0LAorI2RlZmluZSBQVF9HRVRGUFJFR1MgUFRSQUNFX0dFVEZQUkVHUworCisgIC8qIFNldCBhbGwgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHVzZWQgYnkgYSBwcm9jZXNzZXMuCisgICAgIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgbWFjaGluZXMuICAqLworICAgUFRSQUNFX1NFVEZQUkVHUyA9IDE1LAorI2RlZmluZSBQVF9TRVRGUFJFR1MgUFRSQUNFX1NFVEZQUkVHUworCisgIC8qIEF0dGFjaCB0byBhIHByb2Nlc3MgdGhhdCBpcyBhbHJlYWR5IHJ1bm5pbmcuICovCisgIFBUUkFDRV9BVFRBQ0ggPSAxNiwKKyNkZWZpbmUgUFRfQVRUQUNIIFBUUkFDRV9BVFRBQ0gKKworICAvKiBEZXRhY2ggZnJvbSBhIHByb2Nlc3MgYXR0YWNoZWQgdG8gd2l0aCBQVFJBQ0VfQVRUQUNILiAgKi8KKyAgUFRSQUNFX0RFVEFDSCA9IDE3LAorI2RlZmluZSBQVF9ERVRBQ0ggUFRSQUNFX0RFVEFDSAorCisgIC8qIEdldCBhbGwgZXh0ZW5kZWQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHVzZWQgYnkgYSBwcm9jZXNzZXMuCisgICAgIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgbWFjaGluZXMuICAqLworICAgUFRSQUNFX0dFVEZQWFJFR1MgPSAxOCwKKyNkZWZpbmUgUFRfR0VURlBYUkVHUyBQVFJBQ0VfR0VURlBYUkVHUworCisgIC8qIFNldCBhbGwgZXh0ZW5kZWQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHVzZWQgYnkgYSBwcm9jZXNzZXMuCisgICAgIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgbWFjaGluZXMuICAqLworICAgUFRSQUNFX1NFVEZQWFJFR1MgPSAxOSwKKyNkZWZpbmUgUFRfU0VURlBYUkVHUyBQVFJBQ0VfU0VURlBYUkVHUworCisgIC8qIENvbnRpbnVlIGFuZCBzdG9wIGF0IHRoZSBuZXh0IChyZXR1cm4gZnJvbSkgc3lzY2FsbC4gICovCisgIFBUUkFDRV9TWVNDQUxMID0gMjQsCisjZGVmaW5lIFBUX1NZU0NBTEwgUFRSQUNFX1NZU0NBTEwKKworICAvKiBTZXQgcHRyYWNlIGZpbHRlciBvcHRpb25zLiAgKi8KKyAgUFRSQUNFX1NFVE9QVElPTlMgPSAweDQyMDAsCisjZGVmaW5lIFBUX1NFVE9QVElPTlMgUFRSQUNFX1NFVE9QVElPTlMKKworICAvKiBHZXQgbGFzdCBwdHJhY2UgbWVzc2FnZS4gICovCisgIFBUUkFDRV9HRVRFVkVOVE1TRyA9IDB4NDIwMSwKKyNkZWZpbmUgUFRfR0VURVZFTlRNU0cgUFRSQUNFX0dFVEVWRU5UTVNHCisKKyAgLyogR2V0IHNpZ2luZm8gZm9yIHByb2Nlc3MuICAqLworICBQVFJBQ0VfR0VUU0lHSU5GTyA9IDB4NDIwMiwKKyNkZWZpbmUgUFRfR0VUU0lHSU5GTyBQVFJBQ0VfR0VUU0lHSU5GTworCisgIC8qIFNldCBuZXcgc2lnaW5mbyBmb3IgcHJvY2Vzcy4gICovCisgIFBUUkFDRV9TRVRTSUdJTkZPID0gMHg0MjAzLAorI2RlZmluZSBQVF9TRVRTSUdJTkZPIFBUUkFDRV9TRVRTSUdJTkZPCisKKyAgLyogR2V0IHJlZ2lzdGVyIGNvbnRlbnQuICAqLworICBQVFJBQ0VfR0VUUkVHU0VUID0gMHg0MjA0LAorI2RlZmluZSBQVFJBQ0VfR0VUUkVHU0VUIFBUUkFDRV9HRVRSRUdTRVQKKworICAvKiBTZXQgcmVnaXN0ZXIgY29udGVudC4gICovCisgIFBUUkFDRV9TRVRSRUdTRVQgPSAweDQyMDUsCisjZGVmaW5lIFBUUkFDRV9TRVRSRUdTRVQgUFRSQUNFX1NFVFJFR1NFVAorCisgIC8qIExpa2UgUFRSQUNFX0FUVEFDSCwgYnV0IGRvIG5vdCBmb3JjZSB0cmFjZWUgdG8gdHJhcCBhbmQgZG8gbm90IGFmZmVjdAorICAgICBzaWduYWwgb3IgZ3JvdXAgc3RvcCBzdGF0ZS4gICovCisgIFBUUkFDRV9TRUlaRSA9IDB4NDIwNiwKKyNkZWZpbmUgUFRSQUNFX1NFSVpFIFBUUkFDRV9TRUlaRQorCisgIC8qIFRyYXAgc2VpemVkIHRyYWNlZS4gICovCisgIFBUUkFDRV9JTlRFUlJVUFQgPSAweDQyMDcsCisjZGVmaW5lIFBUUkFDRV9JTlRFUlJVUFQgUFRSQUNFX0lOVEVSUlVQVAorCisgIC8qIFdhaXQgZm9yIG5leHQgZ3JvdXAgZXZlbnQuICAqLworICBQVFJBQ0VfTElTVEVOID0gMHg0MjA4Cit9OworCisKKy8qIEZsYWcgZm9yIFBUUkFDRV9MSVNURU4uICAqLworZW51bSBfX3B0cmFjZV9mbGFncworeworICBQVFJBQ0VfU0VJWkVfREVWRUwgPSAweDgwMDAwMDAwCit9OworCisvKiBPcHRpb25zIHNldCB1c2luZyBQVFJBQ0VfU0VUT1BUSU9OUy4gICovCitlbnVtIF9fcHRyYWNlX3NldG9wdGlvbnMKK3sKKyAgUFRSQUNFX09fVFJBQ0VTWVNHT09ECT0gMHgwMDAwMDAwMSwKKyAgUFRSQUNFX09fVFJBQ0VGT1JLCT0gMHgwMDAwMDAwMiwKKyAgUFRSQUNFX09fVFJBQ0VWRk9SSyAgID0gMHgwMDAwMDAwNCwKKyAgUFRSQUNFX09fVFJBQ0VDTE9ORQk9IDB4MDAwMDAwMDgsCisgIFBUUkFDRV9PX1RSQUNFRVhFQwk9IDB4MDAwMDAwMTAsCisgIFBUUkFDRV9PX1RSQUNFVkZPUktET05FID0gMHgwMDAwMDAyMCwKKyAgUFRSQUNFX09fVFJBQ0VFWElUCT0gMHgwMDAwMDA0MCwKKyAgUFRSQUNFX09fTUFTSwkJPSAweDAwMDAwMDdmCit9OworCisvKiBXYWl0IGV4dGVuZGVkIHJlc3VsdCBjb2RlcyBmb3IgdGhlIGFib3ZlIHRyYWNlIG9wdGlvbnMuICAqLworZW51bSBfX3B0cmFjZV9ldmVudGNvZGVzCit7CisgIFBUUkFDRV9FVkVOVF9GT1JLCT0gMSwKKyAgUFRSQUNFX0VWRU5UX1ZGT1JLCT0gMiwKKyAgUFRSQUNFX0VWRU5UX0NMT05FCT0gMywKKyAgUFRSQUNFX0VWRU5UX0VYRUMJPSA0LAorICBQVFJBQ0VfRVZFTlRfVkZPUktfRE9ORSA9IDUsCisgIFBUUkFDRV9FVkVOVF9FWElUCT0gNgorfTsKKworLyogUGVyZm9ybSBwcm9jZXNzIHRyYWNpbmcgZnVuY3Rpb25zLiAgUkVRVUVTVCBpcyBvbmUgb2YgdGhlIHZhbHVlcworICAgYWJvdmUsIGFuZCBkZXRlcm1pbmVzIHRoZSBhY3Rpb24gdG8gYmUgdGFrZW4uCisgICBGb3IgYWxsIHJlcXVlc3RzIGV4Y2VwdCBQVFJBQ0VfVFJBQ0VNRSwgUElEIHNwZWNpZmllcyB0aGUgcHJvY2VzcyB0byBiZQorICAgdHJhY2VkLgorCisgICBQSUQgYW5kIHRoZSBvdGhlciBhcmd1bWVudHMgZGVzY3JpYmVkIGFib3ZlIGZvciB0aGUgdmFyaW91cyByZXF1ZXN0cyBzaG91bGQKKyAgIGFwcGVhciAodGhvc2UgdGhhdCBhcmUgdXNlZCBmb3IgdGhlIHBhcnRpY3VsYXIgcmVxdWVzdCkgYXM6CisgICAgIHBpZF90IFBJRCwgdm9pZCAqQUREUiwgaW50IERBVEEsIHZvaWQgKkFERFIyCisgICBhZnRlciBSRVFVRVNULiAgKi8KK2V4dGVybiBsb25nIGludCBwdHJhY2UgKGVudW0gX19wdHJhY2VfcmVxdWVzdCBfX3JlcXVlc3QsIC4uLikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9TWVNfUFRSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3F1ZXVlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjQ1NTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9xdWV1ZS5oCkBAIC0wLDAgKzEsNTc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXF1ZXVlLmgJOC41IChCZXJrZWxleSkgOC8yMC85NAorICovCisKKyNpZm5kZWYJX1NZU19RVUVVRV9IXworI2RlZmluZQlfU1lTX1FVRVVFX0hfCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBmaXZlIHR5cGVzIG9mIGRhdGEgc3RydWN0dXJlczogc2luZ2x5LWxpbmtlZCBsaXN0cywKKyAqIGxpc3RzLCBzaW1wbGUgcXVldWVzLCB0YWlsIHF1ZXVlcywgYW5kIGNpcmN1bGFyIHF1ZXVlcy4KKyAqCisgKiBBIHNpbmdseS1saW5rZWQgbGlzdCBpcyBoZWFkZWQgYnkgYSBzaW5nbGUgZm9yd2FyZCBwb2ludGVyLiBUaGUKKyAqIGVsZW1lbnRzIGFyZSBzaW5nbHkgbGlua2VkIGZvciBtaW5pbXVtIHNwYWNlIGFuZCBwb2ludGVyIG1hbmlwdWxhdGlvbgorICogb3ZlcmhlYWQgYXQgdGhlIGV4cGVuc2Ugb2YgTyhuKSByZW1vdmFsIGZvciBhcmJpdHJhcnkgZWxlbWVudHMuIE5ldworICogZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQgb3IgYXQgdGhlCisgKiBoZWFkIG9mIHRoZSBsaXN0LiAgRWxlbWVudHMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBoZWFkIG9mIHRoZSBsaXN0CisgKiBzaG91bGQgdXNlIHRoZSBleHBsaWNpdCBtYWNybyBmb3IgdGhpcyBwdXJwb3NlIGZvciBvcHRpbXVtCisgKiBlZmZpY2llbmN5LiBBIHNpbmdseS1saW5rZWQgbGlzdCBtYXkgb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQKKyAqIGRpcmVjdGlvbi4gIFNpbmdseS1saW5rZWQgbGlzdHMgYXJlIGlkZWFsIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsYXJnZQorICogZGF0YXNldHMgYW5kIGZldyBvciBubyByZW1vdmFscyBvciBmb3IgaW1wbGVtZW50aW5nIGEgTElGTyBxdWV1ZS4KKyAqCisgKiBBIGxpc3QgaXMgaGVhZGVkIGJ5IGEgc2luZ2xlIGZvcndhcmQgcG9pbnRlciAob3IgYW4gYXJyYXkgb2YgZm9yd2FyZAorICogcG9pbnRlcnMgZm9yIGEgaGFzaCB0YWJsZSBoZWFkZXIpLiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseSBsaW5rZWQKKyAqIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZQorICogb3IgYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCBvciBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gQSBsaXN0CisgKiBtYXkgb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLgorICoKKyAqIEEgc2ltcGxlIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0aGUgaGVhZCBvZiB0aGUKKyAqIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBzaW5nbHkKKyAqIGxpbmtlZCB0byBzYXZlIHNwYWNlLCBzbyBlbGVtZW50cyBjYW4gb25seSBiZSByZW1vdmVkIGZyb20gdGhlCisgKiBoZWFkIG9mIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGFmdGVyCisgKiBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlIGVuZCBvZiB0aGUKKyAqIGxpc3QuIEEgc2ltcGxlIHF1ZXVlIG1heSBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCisgKgorICogQSB0YWlsIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0byB0aGUgaGVhZCBvZiB0aGUKKyAqIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkKKyAqIGxpbmtlZCBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUgb3IKKyAqIGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQsIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBvciBhdCB0aGUgZW5kIG9mCisgKiB0aGUgbGlzdC4gQSB0YWlsIHF1ZXVlIG1heSBiZSB0cmF2ZXJzZWQgaW4gZWl0aGVyIGRpcmVjdGlvbi4KKyAqCisgKiBBIGNpcmNsZSBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdG8gdGhlIGhlYWQgb2YgdGhlCisgKiBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUgZG91Ymx5CisgKiBsaW5rZWQgc28gdGhhdCBhbiBhcmJpdHJhcnkgZWxlbWVudCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IGEgbmVlZCB0bworICogdHJhdmVyc2UgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlIG9yIGFmdGVyCisgKiBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAqIEEgY2lyY2xlIHF1ZXVlIG1heSBiZSB0cmF2ZXJzZWQgaW4gZWl0aGVyIGRpcmVjdGlvbiwgYnV0IGhhcyBhIG1vcmUKKyAqIGNvbXBsZXggZW5kIG9mIGxpc3QgZGV0ZWN0aW9uLgorICoKKyAqIEZvciBkZXRhaWxzIG9uIHRoZSB1c2Ugb2YgdGhlc2UgbWFjcm9zLCBzZWUgdGhlIHF1ZXVlKDMpIG1hbnVhbCBwYWdlLgorICovCisKKy8qCisgKiBMaXN0IGRlZmluaXRpb25zLgorICovCisjZGVmaW5lCUxJU1RfSEVBRChuYW1lLCB0eXBlKQkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqbGhfZmlyc3Q7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCit9CisKKyNkZWZpbmUJTElTVF9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMIH0KKworI2RlZmluZQlMSVNUX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqbGVfbmV4dDsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorCXN0cnVjdCB0eXBlICoqbGVfcHJldjsJLyogYWRkcmVzcyBvZiBwcmV2aW91cyBuZXh0IGVsZW1lbnQgKi8JXAorfQorCisvKgorICogTGlzdCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJTElTVF9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJKGhlYWQpLT5saF9maXJzdCA9IE5VTEw7CQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlMSVNUX0lOU0VSVF9BRlRFUihsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoKGVsbSktPmZpZWxkLmxlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLmxlX25leHQpICE9IE5VTEwpCVwKKwkJKGxpc3RlbG0pLT5maWVsZC5sZV9uZXh0LT5maWVsZC5sZV9wcmV2ID0JCVwKKwkJICAgICYoZWxtKS0+ZmllbGQubGVfbmV4dDsJCQkJXAorCShsaXN0ZWxtKS0+ZmllbGQubGVfbmV4dCA9IChlbG0pOwkJCQlcCisJKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAmKGxpc3RlbG0pLT5maWVsZC5sZV9uZXh0OwkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJTElTVF9JTlNFUlRfQkVGT1JFKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLmxlX3ByZXY7CQlcCisJKGVsbSktPmZpZWxkLmxlX25leHQgPSAobGlzdGVsbSk7CQkJCVwKKwkqKGxpc3RlbG0pLT5maWVsZC5sZV9wcmV2ID0gKGVsbSk7CQkJCVwKKwkobGlzdGVsbSktPmZpZWxkLmxlX3ByZXYgPSAmKGVsbSktPmZpZWxkLmxlX25leHQ7CQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlMSVNUX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQkJXAorCWlmICgoKGVsbSktPmZpZWxkLmxlX25leHQgPSAoaGVhZCktPmxoX2ZpcnN0KSAhPSBOVUxMKQkJXAorCQkoaGVhZCktPmxoX2ZpcnN0LT5maWVsZC5sZV9wcmV2ID0gJihlbG0pLT5maWVsZC5sZV9uZXh0O1wKKwkoaGVhZCktPmxoX2ZpcnN0ID0gKGVsbSk7CQkJCQlcCisJKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAmKGhlYWQpLT5saF9maXJzdDsJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlMSVNUX1JFTU9WRShlbG0sIGZpZWxkKSBkbyB7CQkJCQlcCisJaWYgKChlbG0pLT5maWVsZC5sZV9uZXh0ICE9IE5VTEwpCQkJCVwKKwkJKGVsbSktPmZpZWxkLmxlX25leHQtPmZpZWxkLmxlX3ByZXYgPSAJCQlcCisJCSAgICAoZWxtKS0+ZmllbGQubGVfcHJldjsJCQkJXAorCSooZWxtKS0+ZmllbGQubGVfcHJldiA9IChlbG0pLT5maWVsZC5sZV9uZXh0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUxJU1RfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvciAoKHZhcikgPSAoKGhlYWQpLT5saF9maXJzdCk7CQkJCVwKKwkJKHZhcik7CQkJCQkJCVwKKwkJKHZhcikgPSAoKHZhciktPmZpZWxkLmxlX25leHQpKQorCisvKgorICogTGlzdCBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZQlMSVNUX0VNUFRZKGhlYWQpCQkoKGhlYWQpLT5saF9maXJzdCA9PSBOVUxMKQorI2RlZmluZQlMSVNUX0ZJUlNUKGhlYWQpCQkoKGhlYWQpLT5saF9maXJzdCkKKyNkZWZpbmUJTElTVF9ORVhUKGVsbSwgZmllbGQpCQkoKGVsbSktPmZpZWxkLmxlX25leHQpCisKKworLyoKKyAqIFNpbmdseS1saW5rZWQgTGlzdCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZQlTTElTVF9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzbGhfZmlyc3Q7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCit9CisKKyNkZWZpbmUJU0xJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCB9CisKKyNkZWZpbmUJU0xJU1RfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzbGVfbmV4dDsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorfQorCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTTElTVF9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJKGhlYWQpLT5zbGhfZmlyc3QgPSBOVUxMOwkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0xJU1RfSU5TRVJUX0FGVEVSKHNsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChzbGlzdGVsbSktPmZpZWxkLnNsZV9uZXh0OwkJXAorCShzbGlzdGVsbSktPmZpZWxkLnNsZV9uZXh0ID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNMSVNUX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnNsZV9uZXh0ID0gKGhlYWQpLT5zbGhfZmlyc3Q7CQkJXAorCShoZWFkKS0+c2xoX2ZpcnN0ID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTTElTVF9SRU1PVkVfSEVBRChoZWFkLCBmaWVsZCkgZG8gewkJCQlcCisJKGhlYWQpLT5zbGhfZmlyc3QgPSAoaGVhZCktPnNsaF9maXJzdC0+ZmllbGQuc2xlX25leHQ7CQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTTElTVF9SRU1PVkUoaGVhZCwgZWxtLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKGhlYWQpLT5zbGhfZmlyc3QgPT0gKGVsbSkpIHsJCQkJXAorCQlTTElTVF9SRU1PVkVfSEVBRCgoaGVhZCksIGZpZWxkKTsJCQlcCisJfQkJCQkJCQkJXAorCWVsc2UgewkJCQkJCQkJXAorCQlzdHJ1Y3QgdHlwZSAqY3VyZWxtID0gKGhlYWQpLT5zbGhfZmlyc3Q7CQlcCisJCXdoaWxlKGN1cmVsbS0+ZmllbGQuc2xlX25leHQgIT0gKGVsbSkpCQkJXAorCQkJY3VyZWxtID0gY3VyZWxtLT5maWVsZC5zbGVfbmV4dDsJCVwKKwkJY3VyZWxtLT5maWVsZC5zbGVfbmV4dCA9CQkJCVwKKwkJICAgIGN1cmVsbS0+ZmllbGQuc2xlX25leHQtPmZpZWxkLnNsZV9uZXh0OwkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNMSVNUX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJCVwKKwlmb3IoKHZhcikgPSAoaGVhZCktPnNsaF9maXJzdDsgKHZhcik7ICh2YXIpID0gKHZhciktPmZpZWxkLnNsZV9uZXh0KQorCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGFjY2VzcyBtZXRob2RzLgorICovCisjZGVmaW5lCVNMSVNUX0VNUFRZKGhlYWQpCSgoaGVhZCktPnNsaF9maXJzdCA9PSBOVUxMKQorI2RlZmluZQlTTElTVF9GSVJTVChoZWFkKQkoKGhlYWQpLT5zbGhfZmlyc3QpCisjZGVmaW5lCVNMSVNUX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5zbGVfbmV4dCkKKworCisvKgorICogU2luZ2x5LWxpbmtlZCBUYWlsIHF1ZXVlIGRlY2xhcmF0aW9ucy4KKyAqLworI2RlZmluZQlTVEFJTFFfSEVBRChuYW1lLCB0eXBlKQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzdHFoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAorCXN0cnVjdCB0eXBlICoqc3RxaF9sYXN0OwkvKiBhZGRyIG9mIGxhc3QgbmV4dCBlbGVtZW50ICovCQlcCit9CisKKyNkZWZpbmUJU1RBSUxRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwsICYoaGVhZCkuc3RxaF9maXJzdCB9CisKKyNkZWZpbmUJU1RBSUxRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc3RxZV9uZXh0OwkvKiBuZXh0IGVsZW1lbnQgKi8JCQlcCit9CisKKy8qCisgKiBTaW5nbHktbGlua2VkIFRhaWwgcXVldWUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCVNUQUlMUV9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJKGhlYWQpLT5zdHFoX2ZpcnN0ID0gTlVMTDsJCQkJCVwKKwkoaGVhZCktPnN0cWhfbGFzdCA9ICYoaGVhZCktPnN0cWhfZmlyc3Q7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNUQUlMUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoKGVsbSktPmZpZWxkLnN0cWVfbmV4dCA9IChoZWFkKS0+c3RxaF9maXJzdCkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3RxZV9uZXh0OwkJXAorCShoZWFkKS0+c3RxaF9maXJzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU1RBSUxRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnN0cWVfbmV4dCA9IE5VTEw7CQkJCQlcCisJKihoZWFkKS0+c3RxaF9sYXN0ID0gKGVsbSk7CQkJCQlcCisJKGhlYWQpLT5zdHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnN0cWVfbmV4dDsJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTVEFJTFFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwlpZiAoKChlbG0pLT5maWVsZC5zdHFlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLnN0cWVfbmV4dCkgPT0gTlVMTClcCisJCShoZWFkKS0+c3RxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zdHFlX25leHQ7CQlcCisJKGxpc3RlbG0pLT5maWVsZC5zdHFlX25leHQgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU1RBSUxRX1JFTU9WRV9IRUFEKGhlYWQsIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKChoZWFkKS0+c3RxaF9maXJzdCA9IChoZWFkKS0+c3RxaF9maXJzdC0+ZmllbGQuc3RxZV9uZXh0KSA9PSBOVUxMKSBcCisJCShoZWFkKS0+c3RxaF9sYXN0ID0gJihoZWFkKS0+c3RxaF9maXJzdDsJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTVEFJTFFfUkVNT1ZFKGhlYWQsIGVsbSwgdHlwZSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKChoZWFkKS0+c3RxaF9maXJzdCA9PSAoZWxtKSkgewkJCQlcCisJCVNUQUlMUV9SRU1PVkVfSEVBRCgoaGVhZCksIGZpZWxkKTsJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlzdHJ1Y3QgdHlwZSAqY3VyZWxtID0gKGhlYWQpLT5zdHFoX2ZpcnN0OwkJXAorCQl3aGlsZSAoY3VyZWxtLT5maWVsZC5zdHFlX25leHQgIT0gKGVsbSkpCQkJXAorCQkJY3VyZWxtID0gY3VyZWxtLT5maWVsZC5zdHFlX25leHQ7CQlcCisJCWlmICgoY3VyZWxtLT5maWVsZC5zdHFlX25leHQgPQkJCQlcCisJCQljdXJlbG0tPmZpZWxkLnN0cWVfbmV4dC0+ZmllbGQuc3RxZV9uZXh0KSA9PSBOVUxMKSBcCisJCQkgICAgKGhlYWQpLT5zdHFoX2xhc3QgPSAmKGN1cmVsbSktPmZpZWxkLnN0cWVfbmV4dDsgXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNUQUlMUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCVwKKwlmb3IgKCh2YXIpID0gKChoZWFkKS0+c3RxaF9maXJzdCk7CQkJCVwKKwkJKHZhcik7CQkJCQkJCVwKKwkJKHZhcikgPSAoKHZhciktPmZpZWxkLnN0cWVfbmV4dCkpCisKKyNkZWZpbmUJU1RBSUxRX0NPTkNBVChoZWFkMSwgaGVhZDIpIGRvIHsJCQkJXAorCWlmICghU1RBSUxRX0VNUFRZKChoZWFkMikpKSB7CQkJCQlcCisJCSooaGVhZDEpLT5zdHFoX2xhc3QgPSAoaGVhZDIpLT5zdHFoX2ZpcnN0OwkJXAorCQkoaGVhZDEpLT5zdHFoX2xhc3QgPSAoaGVhZDIpLT5zdHFoX2xhc3Q7CQlcCisJCVNUQUlMUV9JTklUKChoZWFkMikpOwkJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisvKgorICogU2luZ2x5LWxpbmtlZCBUYWlsIHF1ZXVlIGFjY2VzcyBtZXRob2RzLgorICovCisjZGVmaW5lCVNUQUlMUV9FTVBUWShoZWFkKQkoKGhlYWQpLT5zdHFoX2ZpcnN0ID09IE5VTEwpCisjZGVmaW5lCVNUQUlMUV9GSVJTVChoZWFkKQkoKGhlYWQpLT5zdHFoX2ZpcnN0KQorI2RlZmluZQlTVEFJTFFfTkVYVChlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLnN0cWVfbmV4dCkKKworCisvKgorICogU2ltcGxlIHF1ZXVlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lCVNJTVBMRVFfSEVBRChuYW1lLCB0eXBlKQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzcWhfZmlyc3Q7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCisJc3RydWN0IHR5cGUgKipzcWhfbGFzdDsJLyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lCVNJTVBMRVFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCwgJihoZWFkKS5zcWhfZmlyc3QgfQorCisjZGVmaW5lCVNJTVBMRVFfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzcWVfbmV4dDsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorfQorCisvKgorICogU2ltcGxlIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTSU1QTEVRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwkoaGVhZCktPnNxaF9maXJzdCA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT5zcWhfbGFzdCA9ICYoaGVhZCktPnNxaF9maXJzdDsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0lNUExFUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoKGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gKGhlYWQpLT5zcWhfZmlyc3QpID09IE5VTEwpCVwKKwkJKGhlYWQpLT5zcWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3FlX25leHQ7CQlcCisJKGhlYWQpLT5zcWhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNJTVBMRVFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuc3FlX25leHQgPSBOVUxMOwkJCQkJXAorCSooaGVhZCktPnNxaF9sYXN0ID0gKGVsbSk7CQkJCQlcCisJKGhlYWQpLT5zcWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3FlX25leHQ7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0lNUExFUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCWlmICgoKGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTClcCisJCShoZWFkKS0+c3FoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnNxZV9uZXh0OwkJXAorCShsaXN0ZWxtKS0+ZmllbGQuc3FlX25leHQgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0lNUExFUV9SRU1PVkVfSEVBRChoZWFkLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCgoaGVhZCktPnNxaF9maXJzdCA9IChoZWFkKS0+c3FoX2ZpcnN0LT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTCkgXAorCQkoaGVhZCktPnNxaF9sYXN0ID0gJihoZWFkKS0+c3FoX2ZpcnN0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNJTVBMRVFfUkVNT1ZFKGhlYWQsIGVsbSwgdHlwZSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKChoZWFkKS0+c3FoX2ZpcnN0ID09IChlbG0pKSB7CQkJCVwKKwkJU0lNUExFUV9SRU1PVkVfSEVBRCgoaGVhZCksIGZpZWxkKTsJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlzdHJ1Y3QgdHlwZSAqY3VyZWxtID0gKGhlYWQpLT5zcWhfZmlyc3Q7CQlcCisJCXdoaWxlIChjdXJlbG0tPmZpZWxkLnNxZV9uZXh0ICE9IChlbG0pKQkJCVwKKwkJCWN1cmVsbSA9IGN1cmVsbS0+ZmllbGQuc3FlX25leHQ7CQlcCisJCWlmICgoY3VyZWxtLT5maWVsZC5zcWVfbmV4dCA9CQkJCVwKKwkJCWN1cmVsbS0+ZmllbGQuc3FlX25leHQtPmZpZWxkLnNxZV9uZXh0KSA9PSBOVUxMKSBcCisJCQkgICAgKGhlYWQpLT5zcWhfbGFzdCA9ICYoY3VyZWxtKS0+ZmllbGQuc3FlX25leHQ7IFwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTSU1QTEVRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJXAorCWZvciAoKHZhcikgPSAoKGhlYWQpLT5zcWhfZmlyc3QpOwkJCQlcCisJCSh2YXIpOwkJCQkJCQlcCisJCSh2YXIpID0gKCh2YXIpLT5maWVsZC5zcWVfbmV4dCkpCisKKy8qCisgKiBTaW1wbGUgcXVldWUgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUJU0lNUExFUV9FTVBUWShoZWFkKQkJKChoZWFkKS0+c3FoX2ZpcnN0ID09IE5VTEwpCisjZGVmaW5lCVNJTVBMRVFfRklSU1QoaGVhZCkJCSgoaGVhZCktPnNxaF9maXJzdCkKKyNkZWZpbmUJU0lNUExFUV9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuc3FlX25leHQpCisKKworLyoKKyAqIFRhaWwgcXVldWUgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUJX1RBSUxRX0hFQUQobmFtZSwgdHlwZSwgcXVhbCkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlxdWFsIHR5cGUgKnRxaF9maXJzdDsJCS8qIGZpcnN0IGVsZW1lbnQgKi8JCVwKKwlxdWFsIHR5cGUgKnF1YWwgKnRxaF9sYXN0OwkvKiBhZGRyIG9mIGxhc3QgbmV4dCBlbGVtZW50ICovCVwKK30KKyNkZWZpbmUgVEFJTFFfSEVBRChuYW1lLCB0eXBlKQlfVEFJTFFfSEVBRChuYW1lLCBzdHJ1Y3QgdHlwZSwpCisKKyNkZWZpbmUJVEFJTFFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCwgJihoZWFkKS50cWhfZmlyc3QgfQorCisjZGVmaW5lCV9UQUlMUV9FTlRSWSh0eXBlLCBxdWFsKQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlxdWFsIHR5cGUgKnRxZV9uZXh0OwkJLyogbmV4dCBlbGVtZW50ICovCQlcCisJcXVhbCB0eXBlICpxdWFsICp0cWVfcHJldjsJLyogYWRkcmVzcyBvZiBwcmV2aW91cyBuZXh0IGVsZW1lbnQgKi9cCit9CisjZGVmaW5lIFRBSUxRX0VOVFJZKHR5cGUpCV9UQUlMUV9FTlRSWShzdHJ1Y3QgdHlwZSwpCisKKy8qCisgKiBUYWlsIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlUQUlMUV9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJKGhlYWQpLT50cWhfZmlyc3QgPSBOVUxMOwkJCQkJXAorCShoZWFkKS0+dHFoX2xhc3QgPSAmKGhlYWQpLT50cWhfZmlyc3Q7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQudHFlX25leHQgPSAoaGVhZCktPnRxaF9maXJzdCkgIT0gTlVMTCkJXAorCQkoaGVhZCktPnRxaF9maXJzdC0+ZmllbGQudHFlX3ByZXYgPQkJCVwKKwkJICAgICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJXAorCShoZWFkKS0+dHFoX2ZpcnN0ID0gKGVsbSk7CQkJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJihoZWFkKS0+dHFoX2ZpcnN0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gTlVMTDsJCQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoaGVhZCktPnRxaF9sYXN0OwkJCVwKKwkqKGhlYWQpLT50cWhfbGFzdCA9IChlbG0pOwkJCQkJXAorCShoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9BRlRFUihoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJaWYgKCgoZWxtKS0+ZmllbGQudHFlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLnRxZV9uZXh0KSAhPSBOVUxMKVwKKwkJKGVsbSktPmZpZWxkLnRxZV9uZXh0LT5maWVsZC50cWVfcHJldiA9IAkJXAorCQkgICAgJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT50cWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQlcCisJKGxpc3RlbG0pLT5maWVsZC50cWVfbmV4dCA9IChlbG0pOwkJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJihsaXN0ZWxtKS0+ZmllbGQudHFlX25leHQ7CQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlUQUlMUV9JTlNFUlRfQkVGT1JFKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldjsJCVwKKwkoZWxtKS0+ZmllbGQudHFlX25leHQgPSAobGlzdGVsbSk7CQkJCVwKKwkqKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldiA9IChlbG0pOwkJCQlcCisJKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldiA9ICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlUQUlMUV9SRU1PVkUoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQudHFlX25leHQpICE9IE5VTEwpCQkJCVwKKwkJKGVsbSktPmZpZWxkLnRxZV9uZXh0LT5maWVsZC50cWVfcHJldiA9IAkJXAorCQkgICAgKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJXAorCSooZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJVEFJTFFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvciAoKHZhcikgPSAoKGhlYWQpLT50cWhfZmlyc3QpOwkJCQlcCisJCSh2YXIpOwkJCQkJCQlcCisJCSh2YXIpID0gKCh2YXIpLT5maWVsZC50cWVfbmV4dCkpCisKKyNkZWZpbmUJVEFJTFFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgaGVhZG5hbWUsIGZpZWxkKQkJXAorCWZvciAoKHZhcikgPSAoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgoaGVhZCktPnRxaF9sYXN0KSktPnRxaF9sYXN0KSk7CVwKKwkJKHZhcik7CQkJCQkJCVwKKwkJKHZhcikgPSAoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgodmFyKS0+ZmllbGQudHFlX3ByZXYpKS0+dHFoX2xhc3QpKSkKKworI2RlZmluZQlUQUlMUV9DT05DQVQoaGVhZDEsIGhlYWQyLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCFUQUlMUV9FTVBUWShoZWFkMikpIHsJCQkJCVwKKwkJKihoZWFkMSktPnRxaF9sYXN0ID0gKGhlYWQyKS0+dHFoX2ZpcnN0OwkJXAorCQkoaGVhZDIpLT50cWhfZmlyc3QtPmZpZWxkLnRxZV9wcmV2ID0gKGhlYWQxKS0+dHFoX2xhc3Q7CVwKKwkJKGhlYWQxKS0+dHFoX2xhc3QgPSAoaGVhZDIpLT50cWhfbGFzdDsJCQlcCisJCVRBSUxRX0lOSVQoKGhlYWQyKSk7CQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKy8qCisgKiBUYWlsIHF1ZXVlIGFjY2VzcyBtZXRob2RzLgorICovCisjZGVmaW5lCVRBSUxRX0VNUFRZKGhlYWQpCQkoKGhlYWQpLT50cWhfZmlyc3QgPT0gTlVMTCkKKyNkZWZpbmUJVEFJTFFfRklSU1QoaGVhZCkJCSgoaGVhZCktPnRxaF9maXJzdCkKKyNkZWZpbmUJVEFJTFFfTkVYVChlbG0sIGZpZWxkKQkJKChlbG0pLT5maWVsZC50cWVfbmV4dCkKKworI2RlZmluZQlUQUlMUV9MQVNUKGhlYWQsIGhlYWRuYW1lKSBcCisJKCooKChzdHJ1Y3QgaGVhZG5hbWUgKikoKGhlYWQpLT50cWhfbGFzdCkpLT50cWhfbGFzdCkpCisjZGVmaW5lCVRBSUxRX1BSRVYoZWxtLCBoZWFkbmFtZSwgZmllbGQpIFwKKwkoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgoZWxtKS0+ZmllbGQudHFlX3ByZXYpKS0+dHFoX2xhc3QpKQorCisKKy8qCisgKiBDaXJjdWxhciBxdWV1ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZQlDSVJDTEVRX0hFQUQobmFtZSwgdHlwZSkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqY3FoX2ZpcnN0OwkJLyogZmlyc3QgZWxlbWVudCAqLwkJXAorCXN0cnVjdCB0eXBlICpjcWhfbGFzdDsJCS8qIGxhc3QgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lCUNJUkNMRVFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgKHZvaWQgKikmaGVhZCwgKHZvaWQgKikmaGVhZCB9CisKKyNkZWZpbmUJQ0lSQ0xFUV9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmNxZV9uZXh0OwkJLyogbmV4dCBlbGVtZW50ICovCQlcCisJc3RydWN0IHR5cGUgKmNxZV9wcmV2OwkJLyogcHJldmlvdXMgZWxlbWVudCAqLwkJXAorfQorCisvKgorICogQ2lyY3VsYXIgcXVldWUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCUNJUkNMRVFfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCShoZWFkKS0+Y3FoX2ZpcnN0ID0gKHZvaWQgKikoaGVhZCk7CQkJCVwKKwkoaGVhZCktPmNxaF9sYXN0ID0gKHZvaWQgKikoaGVhZCk7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUNJUkNMRVFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0OwkJXAorCShlbG0pLT5maWVsZC5jcWVfcHJldiA9IChsaXN0ZWxtKTsJCQkJXAorCWlmICgobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0ID09ICh2b2lkICopKGhlYWQpKQkJXAorCQkoaGVhZCktPmNxaF9sYXN0ID0gKGVsbSk7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShsaXN0ZWxtKS0+ZmllbGQuY3FlX25leHQtPmZpZWxkLmNxZV9wcmV2ID0gKGVsbSk7CVwKKwkobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUNJUkNMRVFfSU5TRVJUX0JFRk9SRShoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGxpc3RlbG0pOwkJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9wcmV2ID0gKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldjsJCVwKKwlpZiAoKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldiA9PSAodm9pZCAqKShoZWFkKSkJCVwKKwkJKGhlYWQpLT5jcWhfZmlyc3QgPSAoZWxtKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldi0+ZmllbGQuY3FlX25leHQgPSAoZWxtKTsJXAorCShsaXN0ZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5jcWVfbmV4dCA9IChoZWFkKS0+Y3FoX2ZpcnN0OwkJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAodm9pZCAqKShoZWFkKTsJCQkJXAorCWlmICgoaGVhZCktPmNxaF9sYXN0ID09ICh2b2lkICopKGhlYWQpKQkJCQlcCisJCShoZWFkKS0+Y3FoX2xhc3QgPSAoZWxtKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT5jcWhfZmlyc3QtPmZpZWxkLmNxZV9wcmV2ID0gKGVsbSk7CQlcCisJKGhlYWQpLT5jcWhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUNJUkNMRVFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX25leHQgPSAodm9pZCAqKShoZWFkKTsJCQkJXAorCShlbG0pLT5maWVsZC5jcWVfcHJldiA9IChoZWFkKS0+Y3FoX2xhc3Q7CQkJXAorCWlmICgoaGVhZCktPmNxaF9maXJzdCA9PSAodm9pZCAqKShoZWFkKSkJCQlcCisJCShoZWFkKS0+Y3FoX2ZpcnN0ID0gKGVsbSk7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+Y3FoX2xhc3QtPmZpZWxkLmNxZV9uZXh0ID0gKGVsbSk7CQlcCisJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJQ0lSQ0xFUV9SRU1PVkUoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKChlbG0pLT5maWVsZC5jcWVfbmV4dCA9PSAodm9pZCAqKShoZWFkKSkJCQlcCisJCShoZWFkKS0+Y3FoX2xhc3QgPSAoZWxtKS0+ZmllbGQuY3FlX3ByZXY7CQlcCisJZWxzZQkJCQkJCQkJXAorCQkoZWxtKS0+ZmllbGQuY3FlX25leHQtPmZpZWxkLmNxZV9wcmV2ID0JCQlcCisJCSAgICAoZWxtKS0+ZmllbGQuY3FlX3ByZXY7CQkJCVwKKwlpZiAoKGVsbSktPmZpZWxkLmNxZV9wcmV2ID09ICh2b2lkICopKGhlYWQpKQkJCVwKKwkJKGhlYWQpLT5jcWhfZmlyc3QgPSAoZWxtKS0+ZmllbGQuY3FlX25leHQ7CQlcCisJZWxzZQkJCQkJCQkJXAorCQkoZWxtKS0+ZmllbGQuY3FlX3ByZXYtPmZpZWxkLmNxZV9uZXh0ID0JCQlcCisJCSAgICAoZWxtKS0+ZmllbGQuY3FlX25leHQ7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUNJUkNMRVFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQlcCisJZm9yICgodmFyKSA9ICgoaGVhZCktPmNxaF9maXJzdCk7CQkJCVwKKwkJKHZhcikgIT0gKGNvbnN0IHZvaWQgKikoaGVhZCk7CQkJCVwKKwkJKHZhcikgPSAoKHZhciktPmZpZWxkLmNxZV9uZXh0KSkKKworI2RlZmluZQlDSVJDTEVRX0ZPUkVBQ0hfUkVWRVJTRSh2YXIsIGhlYWQsIGZpZWxkKQkJCVwKKwlmb3IgKCh2YXIpID0gKChoZWFkKS0+Y3FoX2xhc3QpOwkJCQlcCisJCSh2YXIpICE9IChjb25zdCB2b2lkICopKGhlYWQpOwkJCQlcCisJCSh2YXIpID0gKCh2YXIpLT5maWVsZC5jcWVfcHJldikpCisKKy8qCisgKiBDaXJjdWxhciBxdWV1ZSBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZQlDSVJDTEVRX0VNUFRZKGhlYWQpCQkoKGhlYWQpLT5jcWhfZmlyc3QgPT0gKHZvaWQgKikoaGVhZCkpCisjZGVmaW5lCUNJUkNMRVFfRklSU1QoaGVhZCkJCSgoaGVhZCktPmNxaF9maXJzdCkKKyNkZWZpbmUJQ0lSQ0xFUV9MQVNUKGhlYWQpCQkoKGhlYWQpLT5jcWhfbGFzdCkKKyNkZWZpbmUJQ0lSQ0xFUV9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuY3FlX25leHQpCisjZGVmaW5lCUNJUkNMRVFfUFJFVihlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLmNxZV9wcmV2KQorCisjZGVmaW5lIENJUkNMRVFfTE9PUF9ORVhUKGhlYWQsIGVsbSwgZmllbGQpCQkJCVwKKwkoKChlbG0pLT5maWVsZC5jcWVfbmV4dCA9PSAodm9pZCAqKShoZWFkKSkJCQlcCisJICAgID8gKChoZWFkKS0+Y3FoX2ZpcnN0KQkJCQkJXAorCSAgICA6IChlbG0tPmZpZWxkLmNxZV9uZXh0KSkKKyNkZWZpbmUgQ0lSQ0xFUV9MT09QX1BSRVYoaGVhZCwgZWxtLCBmaWVsZCkJCQkJXAorCSgoKGVsbSktPmZpZWxkLmNxZV9wcmV2ID09ICh2b2lkICopKGhlYWQpKQkJCVwKKwkgICAgPyAoKGhlYWQpLT5jcWhfbGFzdCkJCQkJCVwKKwkgICAgOiAoZWxtLT5maWVsZC5jcWVfcHJldikpCisKKyNlbmRpZgkvKiBzeXMvcXVldWUuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcXVvdGEuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3F1b3RhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhMGVjMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3F1b3RhLmgKQEAgLTAsMCArMSwyMjUgQEAKKy8qIFRoaXMganVzdCByZXByZXNlbnRzIHRoZSBub24ta2VybmVsIHBhcnRzIG9mIDxsaW51eC9xdW90YS5oPi4KKyAqCisgKiBoZXJlJ3MgdGhlIGNvcnJlc3BvbmRpbmcgY29weXJpZ2h0OgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogUm9iZXJ0IEVseiBhdCBUaGUgVW5pdmVyc2l0eSBvZiBNZWxib3VybmUuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NZU19RVU9UQV9ICisjZGVmaW5lIF9TWVNfUVVPVEFfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKgorICogU2VsZWN0IGJldHdlZW4gZGlmZmVyZW50IGluY29tcGF0aWJsZSBxdW90YSB2ZXJzaW9ucy4KKyAqIERlZmF1bHQgdG8gdGhlIHZlcnNpb24gdXNlZCBieSBMaW51eCBrZXJuZWwgdmVyc2lvbiAyLjQuMjIKKyAqIG9yIGxhdGVyLiAgKi8KKyNpZm5kZWYgX0xJTlVYX1FVT1RBX1ZFUlNJT04KKyMgZGVmaW5lIF9MSU5VWF9RVU9UQV9WRVJTSU9OIDIKKyNlbmRpZgorCisvKgorICogQ29udmVydCBkaXNrYmxvY2tzIHRvIGJsb2NrcyBhbmQgdGhlIG90aGVyIHdheSBhcm91bmQuCisgKiBjdXJyZW50bHkgb25seSB0byBmb29sIHRoZSBCU0Qgc291cmNlLiA6LSkKKyAqLworI2RlZmluZSBkYnRvYihudW0pICgobnVtKSA8PCAxMCkKKyNkZWZpbmUgYnRvZGIobnVtKSAoKG51bSkgPj4gMTApCisKKy8qCisgKiBDb252ZXJ0IGNvdW50IG9mIGZpbGVzeXN0ZW0gYmxvY2tzIHRvIGRpc2txdW90YSBibG9ja3MsIG1lYW50CisgKiBmb3IgZmlsZXN5c3RlbXMgd2hlcmUgaV9ibGtzaXplICE9IEJMT0NLX1NJWkUKKyAqLworI2RlZmluZSBmc190b19kcV9ibG9ja3MobnVtLCBibGtzaXplKSAoKChudW0pICogKGJsa3NpemUpKSAvIEJMT0NLX1NJWkUpCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgZGlzayBxdW90YXMgaW1wb3NlZCBvbiB0aGUgYXZlcmFnZSB1c2VyCisgKiAoYmlnIGJyb3RoZXIgZmluYWxseSBoaXRzIExpbnV4KS4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBkZWZpbmUgdGhlIGFtb3VudCBvZiB0aW1lIGdpdmVuIGEgdXNlcgorICogYmVmb3JlIHRoZSBzb2Z0IGxpbWl0cyBhcmUgdHJlYXRlZCBhcyBoYXJkIGxpbWl0cyAodXN1YWxseSByZXN1bHRpbmcKKyAqIGluIGFuIGFsbG9jYXRpb24gZmFpbHVyZSkuIFRoZSB0aW1lciBpcyBzdGFydGVkIHdoZW4gdGhlIHVzZXIgY3Jvc3NlcworICogdGhlaXIgc29mdCBsaW1pdCwgaXQgaXMgcmVzZXQgd2hlbiB0aGV5IGdvIGJlbG93IHRoZWlyIHNvZnQgbGltaXQuCisgKi8KKyNkZWZpbmUgTUFYX0lRX1RJTUUgIDYwNDgwMAkvKiAoNyoyNCo2MCo2MCkgMSB3ZWVrICovCisjZGVmaW5lIE1BWF9EUV9USU1FICA2MDQ4MDAJLyogKDcqMjQqNjAqNjApIDEgd2VlayAqLworCisjZGVmaW5lIE1BWFFVT1RBUyAyCisjZGVmaW5lIFVTUlFVT1RBICAwCQkvKiBlbGVtZW50IHVzZWQgZm9yIHVzZXIgcXVvdGFzICovCisjZGVmaW5lIEdSUFFVT1RBICAxCQkvKiBlbGVtZW50IHVzZWQgZm9yIGdyb3VwIHF1b3RhcyAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBkZWZhdWx0IG5hbWVzIG9mIHRoZSBxdW90YXMgZmlsZXMuCisgKi8KKyNkZWZpbmUgSU5JVFFGTkFNRVMgeyBcCisgICAidXNlciIsICAgICAgLyogVVNSUVVPVEEgKi8gXAorICAgImdyb3VwIiwgICAvKiBHUlBRVU9UQSAqLyBcCisgICAidW5kZWZpbmVkIiwgXAorfTsKKworI2RlZmluZSBRVU9UQUZJTEVOQU1FICJxdW90YSIKKyNkZWZpbmUgUVVPVEFHUk9VUCAic3RhZmYiCisKKyNkZWZpbmUgTlJfRFFIQVNIIDQzICAgICAgICAgIC8qIEp1c3QgYW4gYXJiaXRyYXJ5IG51bWJlciBhbnkgc3VnZ2VzdGlvbnMgPyAqLworI2RlZmluZSBOUl9EUVVPVFMgMjU2ICAgICAgICAgLyogTnVtYmVyIG9mIHF1b3RhcyBhY3RpdmUgYXQgb25lIHRpbWUgKi8KKworLyoKKyAqIENvbW1hbmQgZGVmaW5pdGlvbnMgZm9yIHRoZSAncXVvdGFjdGwnIHN5c3RlbSBjYWxsLgorICogVGhlIGNvbW1hbmRzIGFyZSBicm9rZW4gaW50byBhIG1haW4gY29tbWFuZCBkZWZpbmVkIGJlbG93CisgKiBhbmQgYSBzdWJjb21tYW5kIHRoYXQgaXMgdXNlZCB0byBjb252ZXkgdGhlIHR5cGUgb2YKKyAqIHF1b3RhIHRoYXQgaXMgYmVpbmcgbWFuaXB1bGF0ZWQgKHNlZSBhYm92ZSkuCisgKi8KKyNkZWZpbmUgU1VCQ01ETUFTSyAgMHgwMGZmCisjZGVmaW5lIFNVQkNNRFNISUZUIDgKKyNkZWZpbmUgUUNNRChjbWQsIHR5cGUpICAoKChjbWQpIDw8IFNVQkNNRFNISUZUKSB8ICgodHlwZSkgJiBTVUJDTURNQVNLKSkKKworI2lmIF9MSU5VWF9RVU9UQV9WRVJTSU9OIDwgMgorIyBkZWZpbmUgUV9RVU9UQU9OICAweDAxMDAJLyogZW5hYmxlIHF1b3RhcyAqLworIyBkZWZpbmUgUV9RVU9UQU9GRiAweDAyMDAJLyogZGlzYWJsZSBxdW90YXMgKi8KKyMgZGVmaW5lIFFfR0VUUVVPVEEgMHgwMzAwCS8qIGdldCBsaW1pdHMgYW5kIHVzYWdlICovCisjIGRlZmluZSBRX1NFVFFVT1RBIDB4MDQwMAkvKiBzZXQgbGltaXRzIGFuZCB1c2FnZSAqLworIyBkZWZpbmUgUV9TRVRVU0UgICAweDA1MDAJLyogc2V0IHVzYWdlICovCisjIGRlZmluZSBRX1NZTkMgICAgIDB4MDYwMAkvKiBzeW5jIGRpc2sgY29weSBvZiBhIGZpbGVzeXN0ZW1zIHF1b3RhcyAqLworIyBkZWZpbmUgUV9TRVRRTElNICAweDA3MDAJLyogc2V0IGxpbWl0cyAqLworIyBkZWZpbmUgUV9HRVRTVEFUUyAweDA4MDAJLyogZ2V0IGNvbGxlY3RlZCBzdGF0cyAqLworIyBkZWZpbmUgUV9SU1FVQVNIICAweDEwMDAJLyogc2V0IHJvb3Rfc3F1YXNoIG9wdGlvbiAqLworI2Vsc2UKKyMgZGVmaW5lIFFfU1lOQyAgICAgMHg4MDAwMDEJLyogc3luYyBkaXNrIGNvcHkgb2YgYSBmaWxlc3lzdGVtcyBxdW90YXMgKi8KKyMgZGVmaW5lIFFfUVVPVEFPTiAgMHg4MDAwMDIJLyogdHVybiBxdW90YXMgb24gKi8KKyMgZGVmaW5lIFFfUVVPVEFPRkYgMHg4MDAwMDMJLyogdHVybiBxdW90YXMgb2ZmICovCisjIGRlZmluZSBRX0dFVEZNVCAgIDB4ODAwMDA0CS8qIGdldCBxdW90YSBmb3JtYXQgdXNlZCBvbiBnaXZlbiBmaWxlc3lzdGVtICovCisjIGRlZmluZSBRX0dFVElORk8gIDB4ODAwMDA1CS8qIGdldCBpbmZvcm1hdGlvbiBhYm91dCBxdW90YSBmaWxlcyAqLworIyBkZWZpbmUgUV9TRVRJTkZPICAweDgwMDAwNgkvKiBzZXQgaW5mb3JtYXRpb24gYWJvdXQgcXVvdGEgZmlsZXMgKi8KKyMgZGVmaW5lIFFfR0VUUVVPVEEgMHg4MDAwMDcJLyogZ2V0IHVzZXIgcXVvdGEgc3RydWN0dXJlICovCisjIGRlZmluZSBRX1NFVFFVT1RBIDB4ODAwMDA4CS8qIHNldCB1c2VyIHF1b3RhIHN0cnVjdHVyZSAqLworI2VuZGlmCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmb3JtYXQgb2YgdGhlIGRpc2sgcXVvdGEgZmlsZQorICogKGFzIGl0IGFwcGVhcnMgb24gZGlzaykgLSB0aGUgZmlsZSBpcyBhbiBhcnJheSBvZiB0aGVzZSBzdHJ1Y3R1cmVzCisgKiBpbmRleGVkIGJ5IHVzZXIgb3IgZ3JvdXAgbnVtYmVyLgorICovCisjaWYgX0xJTlVYX1FVT1RBX1ZFUlNJT04gPCAyCitzdHJ1Y3QgZHFibGsKKyAgeworICAgIHVfaW50MzJfdCBkcWJfYmhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gZGlzayBibGtzIGFsbG9jICovCisgICAgdV9pbnQzMl90IGRxYl9ic29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgbGltaXQgb24gZGlzayBibGtzICovCisgICAgdV9pbnQzMl90IGRxYl9jdXJibG9ja3M7CS8qIGN1cnJlbnQgYmxvY2sgY291bnQgKi8KKyAgICB1X2ludDMyX3QgZHFiX2loYXJkbGltaXQ7CS8qIG1heGltdW0gIyBhbGxvY2F0ZWQgaW5vZGVzICovCisgICAgdV9pbnQzMl90IGRxYl9pc29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgaW5vZGUgbGltaXQgKi8KKyAgICB1X2ludDMyX3QgZHFiX2N1cmlub2RlczsJLyogY3VycmVudCAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KKyAgICB0aW1lX3QgZHFiX2J0aW1lOwkJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGRpc2sgdXNlICovCisgICAgdGltZV90IGRxYl9pdGltZTsJCS8qIHRpbWUgbGltaXQgZm9yIGV4Y2Vzc2l2ZSBmaWxlcyAqLworICB9OworI2Vsc2UKKworLyogRmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGljaCBmaWVsZHMgaW4gZHFibGsgc3RydWN0dXJlIGFyZSB2YWxpZC4gICovCisjZGVmaW5lIFFJRl9CTElNSVRTCTEKKyNkZWZpbmUgUUlGX1NQQUNFCTIKKyNkZWZpbmUgUUlGX0lMSU1JVFMJNAorI2RlZmluZSBRSUZfSU5PREVTCTgKKyNkZWZpbmUgUUlGX0JUSU1FCTE2CisjZGVmaW5lIFFJRl9JVElNRQkzMgorI2RlZmluZSBRSUZfTElNSVRTCShRSUZfQkxJTUlUUyB8IFFJRl9JTElNSVRTKQorI2RlZmluZSBRSUZfVVNBR0UJKFFJRl9TUEFDRSB8IFFJRl9JTk9ERVMpCisjZGVmaW5lIFFJRl9USU1FUwkoUUlGX0JUSU1FIHwgUUlGX0lUSU1FKQorI2RlZmluZSBRSUZfQUxMCQkoUUlGX0xJTUlUUyB8IFFJRl9VU0FHRSB8IFFJRl9USU1FUykKKworc3RydWN0IGRxYmxrCisgIHsKKyAgICB1X2ludDY0X3QgZHFiX2JoYXJkbGltaXQ7CS8qIGFic29sdXRlIGxpbWl0IG9uIGRpc2sgcXVvdGEgYmxvY2tzIGFsbG9jICovCisgICAgdV9pbnQ2NF90IGRxYl9ic29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgbGltaXQgb24gZGlzayBxdW90YSBibG9ja3MgKi8KKyAgICB1X2ludDY0X3QgZHFiX2N1cnNwYWNlOwkvKiBjdXJyZW50IHF1b3RhIGJsb2NrIGNvdW50ICovCisgICAgdV9pbnQ2NF90IGRxYl9paGFyZGxpbWl0OwkvKiBtYXhpbXVtICMgYWxsb2NhdGVkIGlub2RlcyAqLworICAgIHVfaW50NjRfdCBkcWJfaXNvZnRsaW1pdDsJLyogcHJlZmVycmVkIGlub2RlIGxpbWl0ICovCisgICAgdV9pbnQ2NF90IGRxYl9jdXJpbm9kZXM7CS8qIGN1cnJlbnQgIyBhbGxvY2F0ZWQgaW5vZGVzICovCisgICAgdV9pbnQ2NF90IGRxYl9idGltZTsJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGRpc2sgdXNlICovCisgICAgdV9pbnQ2NF90IGRxYl9pdGltZTsJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGZpbGVzICovCisgICAgdV9pbnQzMl90IGRxYl92YWxpZDsJLyogYml0bWFzayBvZiBRSUZfKiBjb25zdGFudHMgKi8KKyAgfTsKKyNlbmRpZgorCisvKgorICogU2hvcnRoYW5kIG5vdGF0aW9uLgorICovCisjZGVmaW5lCWRxX2JoYXJkbGltaXQJZHFfZHFiLmRxYl9iaGFyZGxpbWl0CisjZGVmaW5lCWRxX2Jzb2Z0bGltaXQJZHFfZHFiLmRxYl9ic29mdGxpbWl0CisjaWYgX0xJTlVYX1FVT1RBX1ZFUlNJT04gPCAyCisjIGRlZmluZSBkcV9jdXJibG9ja3MJZHFfZHFiLmRxYl9jdXJibG9ja3MKKyNlbHNlCisjIGRlZmluZSBkcV9jdXJzcGFjZQlkcV9kcWIuZHFiX2N1cnNwYWNlCisjIGRlZmluZSBkcV92YWxpZAlkcV9kcWIuZHFiX3ZhbGlkCisjZW5kaWYKKyNkZWZpbmUJZHFfaWhhcmRsaW1pdAlkcV9kcWIuZHFiX2loYXJkbGltaXQKKyNkZWZpbmUJZHFfaXNvZnRsaW1pdAlkcV9kcWIuZHFiX2lzb2Z0bGltaXQKKyNkZWZpbmUJZHFfY3VyaW5vZGVzCWRxX2RxYi5kcWJfY3VyaW5vZGVzCisjZGVmaW5lCWRxX2J0aW1lCWRxX2RxYi5kcWJfYnRpbWUKKyNkZWZpbmUJZHFfaXRpbWUJZHFfZHFiLmRxYl9pdGltZQorCisjZGVmaW5lIGRxb2ZmKFVJRCkgICAgICAoKGxvZmZfdCkoKFVJRCkgKiBzaXplb2YgKHN0cnVjdCBkcWJsaykpKQorCisjaWYgX0xJTlVYX1FVT1RBX1ZFUlNJT04gPCAyCitzdHJ1Y3QgZHFzdGF0cworICB7CisgICAgdV9pbnQzMl90IGxvb2t1cHM7CisgICAgdV9pbnQzMl90IGRyb3BzOworICAgIHVfaW50MzJfdCByZWFkczsKKyAgICB1X2ludDMyX3Qgd3JpdGVzOworICAgIHVfaW50MzJfdCBjYWNoZV9oaXRzOworICAgIHVfaW50MzJfdCBwYWdlc19hbGxvY2F0ZWQ7CisgICAgdV9pbnQzMl90IGFsbG9jYXRlZF9kcXVvdHM7CisgICAgdV9pbnQzMl90IGZyZWVfZHF1b3RzOworICAgIHVfaW50MzJfdCBzeW5jczsKKyAgfTsKKyNlbHNlCisKKy8qIEZsYWdzIHRoYXQgaW5kaWNhdGUgd2hpY2ggZmllbGRzIGluIGRxaW5mbyBzdHJ1Y3R1cmUgYXJlIHZhbGlkLiAgKi8KKyMgZGVmaW5lIElJRl9CR1JBQ0UJMQorIyBkZWZpbmUgSUlGX0lHUkFDRQkyCisjIGRlZmluZSBJSUZfRkxBR1MJNAorIyBkZWZpbmUgSUlGX0FMTAkoSUlGX0JHUkFDRSB8IElJRl9JR1JBQ0UgfCBJSUZfRkxBR1MpCisKK3N0cnVjdCBkcWluZm8KKyAgeworICAgIHVfaW50NjRfdCBkcWlfYmdyYWNlOworICAgIHVfaW50NjRfdCBkcWlfaWdyYWNlOworICAgIHVfaW50MzJfdCBkcWlfZmxhZ3M7CisgICAgdV9pbnQzMl90IGRxaV92YWxpZDsKKyAgfTsKKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKK2V4dGVybiBpbnQgcXVvdGFjdGwgKGludCBfX2NtZCwgY29uc3QgY2hhciAqX19zcGVjaWFsLCBpbnQgX19pZCwKKwkJICAgICBjYWRkcl90IF9fYWRkcikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9xdW90YS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9yYXcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Jhdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MmY3OGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9yYXcuaApAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19SQVdfSAorI2RlZmluZSBfU1lTX1JBV19ICTEKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisvKiBUaGUgbWFqb3IgZGV2aWNlIG51bWJlciBmb3IgcmF3IGRldmljZXMuICAqLworI2RlZmluZSBSQVdfTUFKT1IJMTYyCisKKy8qIGBpb2N0bCcgY29tbWFuZHMgZm9yIHJhdyBkZXZpY2VzLiAgKi8KKyNkZWZpbmUgUkFXX1NFVEJJTkQgICAgIF9JTygweGFjLCAwKQorI2RlZmluZSBSQVdfR0VUQklORCAgICAgX0lPKDB4YWMsIDEpCisKK3N0cnVjdCByYXdfY29uZmlnX3JlcXVlc3QKK3sKKyAgaW50IHJhd19taW5vcjsKKyAgdWludDY0X3QgYmxvY2tfbWFqb3I7CisgIHVpbnQ2NF90IGJsb2NrX21pbm9yOworfTsKKworI2VuZGlmIC8qIHN5cy9yYXcuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcmVib290LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9yZWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTcxOWM3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcmVib290LmgKQEAgLTAsMCArMSw0OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgc2hvdWxkIGRlZmluZSBSQl8qIG1hY3JvcyB0byBiZSB1c2VkIGFzIGZsYWcKKyAgIGJpdHMgaW4gdGhlIGFyZ3VtZW50IHRvIHRoZSBgcmVib290JyBzeXN0ZW0gY2FsbC4gICovCisKKyNpZm5kZWYgX1NZU19SRUJPT1RfSAorI2RlZmluZSBfU1lTX1JFQk9PVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIFBlcmZvcm0gYSBoYXJkIHJlc2V0IG5vdy4gICovCisjZGVmaW5lIFJCX0FVVE9CT09UCTB4MDEyMzQ1NjcKKworLyogSGFsdCB0aGUgc3lzdGVtLiAgKi8KKyNkZWZpbmUgUkJfSEFMVF9TWVNURU0JMHhjZGVmMDEyMworCisvKiBFbmFibGUgcmVib290IHVzaW5nIEN0cmwtQWx0LURlbGV0ZSBrZXlzdHJva2UuICAqLworI2RlZmluZSBSQl9FTkFCTEVfQ0FECTB4ODlhYmNkZWYKKworLyogRGlzYWJsZSByZWJvb3QgdXNpbmcgQ3RybC1BbHQtRGVsZXRlIGtleXN0cm9rZS4gICovCisjZGVmaW5lIFJCX0RJU0FCTEVfQ0FECTAKKworLyogU3RvcCBzeXN0ZW0gYW5kIHN3aXRjaCBwb3dlciBvZmYgaWYgcG9zc2libGUuICAqLworI2RlZmluZSBSQl9QT1dFUl9PRkYJMHg0MzIxZmVkYworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJlYm9vdCBvciBoYWx0IHRoZSBzeXN0ZW0uICAqLworZXh0ZXJuIGludCByZWJvb3QgKGludCBfX2hvd3RvKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogX1NZU19SRUJPT1RfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcmVnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTAwM2M0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcmVnLmgKQEAgLTAsMCArMSw0MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUkVHX0gKKyNkZWZpbmUgX1NZU19SRUdfSAkxCisKKy8qIEluZGV4IGludG8gYW4gYXJyYXkgb2YgNCBieXRlIGludGVnZXJzIHJldHVybmVkIGZyb20gcHRyYWNlIGZvcgorICogbG9jYXRpb24gb2YgdGhlIHVzZXJzJyBzdG9yZWQgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4gKi8KKworI2RlZmluZSBFQlggMAorI2RlZmluZSBFQ1ggMQorI2RlZmluZSBFRFggMgorI2RlZmluZSBFU0kgMworI2RlZmluZSBFREkgNAorI2RlZmluZSBFQlAgNQorI2RlZmluZSBFQVggNgorI2RlZmluZSBEUyA3CisjZGVmaW5lIEVTIDgKKyNkZWZpbmUgRlMgOQorI2RlZmluZSBHUyAxMAorI2RlZmluZSBPUklHX0VBWCAxMQorI2RlZmluZSBFSVAgMTIKKyNkZWZpbmUgQ1MgIDEzCisjZGVmaW5lIEVGTCAxNAorI2RlZmluZSBVRVNQIDE1CisjZGVmaW5lIFNTICAgMTYKKworI2VuZGlmCS8qIF9TWVNfUkVHX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Jlc291cmNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTI3NDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9yZXNvdXJjZS5oCkBAIC0wLDAgKzEsMTAzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTIsOTQsMTk5Ni0yMDAwLDIwMDIsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX1JFU09VUkNFX0gKKyNkZWZpbmUJX1NZU19SRVNPVVJDRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWZpbml0aW9ucyBvZiBzdHJ1Y3R1cmVzIGFuZCBiaXQgdmFsdWVzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3Jlc291cmNlLmg+CisKKyNpZm5kZWYgX19pZF90X2RlZmluZWQKK3R5cGVkZWYgX19pZF90IGlkX3Q7CisjIGRlZmluZSBfX2lkX3RfZGVmaW5lZAorI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworLyogVGhlIFgvT3BlbiBzdGFuZGFyZCBkZWZpbmVzIHRoYXQgYWxsIHRoZSBmdW5jdGlvbnMgYmVsb3cgbXVzdCB1c2UKKyAgIGBpbnQnIGFzIHRoZSB0eXBlIGZvciB0aGUgZmlyc3QgYXJndW1lbnQuICBXaGVuIHdlIGFyZSBjb21waWxpbmcgd2l0aAorICAgR05VIGV4dGVuc2lvbnMgd2UgY2hhbmdlIHRoaXMgc2xpZ2h0bHkgdG8gcHJvdmlkZSBiZXR0ZXIgZXJyb3IKKyAgIGNoZWNraW5nLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX0dOVSAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cwordHlwZWRlZiBlbnVtIF9fcmxpbWl0X3Jlc291cmNlIF9fcmxpbWl0X3Jlc291cmNlX3Q7Cit0eXBlZGVmIGVudW0gX19ydXNhZ2Vfd2hvIF9fcnVzYWdlX3dob190OwordHlwZWRlZiBlbnVtIF9fcHJpb3JpdHlfd2hpY2ggX19wcmlvcml0eV93aGljaF90OworI2Vsc2UKK3R5cGVkZWYgaW50IF9fcmxpbWl0X3Jlc291cmNlX3Q7Cit0eXBlZGVmIGludCBfX3J1c2FnZV93aG9fdDsKK3R5cGVkZWYgaW50IF9fcHJpb3JpdHlfd2hpY2hfdDsKKyNlbmRpZgorCisvKiBQdXQgdGhlIHNvZnQgYW5kIGhhcmQgbGltaXRzIGZvciBSRVNPVVJDRSBpbiAqUkxJTUlUUy4KKyAgIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAtMSBpZiBub3QgKGFuZCBzZXRzIGVycm5vKS4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgZ2V0cmxpbWl0IChfX3JsaW1pdF9yZXNvdXJjZV90IF9fcmVzb3VyY2UsCisJCSAgICAgIHN0cnVjdCBybGltaXQgKl9fcmxpbWl0cykgX19USFJPVzsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChnZXRybGltaXQsIChfX3JsaW1pdF9yZXNvdXJjZV90IF9fcmVzb3VyY2UsCisJCQkJICAgICAgIHN0cnVjdCBybGltaXQgKl9fcmxpbWl0cyksIGdldHJsaW1pdDY0KTsKKyMgZWxzZQorIyAgZGVmaW5lIGdldHJsaW1pdCBnZXRybGltaXQ2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZ2V0cmxpbWl0NjQgKF9fcmxpbWl0X3Jlc291cmNlX3QgX19yZXNvdXJjZSwKKwkJCXN0cnVjdCBybGltaXQ2NCAqX19ybGltaXRzKSBfX1RIUk9XOworI2VuZGlmCisKKy8qIFNldCB0aGUgc29mdCBhbmQgaGFyZCBsaW1pdHMgZm9yIFJFU09VUkNFIHRvICpSTElNSVRTLgorICAgT25seSB0aGUgc3VwZXItdXNlciBjYW4gaW5jcmVhc2UgaGFyZCBsaW1pdHMuCisgICBSZXR1cm4gMCBpZiBzdWNjZXNzZnVsLCAtMSBpZiBub3QgKGFuZCBzZXRzIGVycm5vKS4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgc2V0cmxpbWl0IChfX3JsaW1pdF9yZXNvdXJjZV90IF9fcmVzb3VyY2UsCisJCSAgICAgIF9fY29uc3Qgc3RydWN0IHJsaW1pdCAqX19ybGltaXRzKSBfX1RIUk9XOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHNldHJsaW1pdCwgKF9fcmxpbWl0X3Jlc291cmNlX3QgX19yZXNvdXJjZSwKKwkJCQkgICAgICAgX19jb25zdCBzdHJ1Y3QgcmxpbWl0ICpfX3JsaW1pdHMpLAorCQkJICAgc2V0cmxpbWl0NjQpOworIyBlbHNlCisjICBkZWZpbmUgc2V0cmxpbWl0IHNldHJsaW1pdDY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBzZXRybGltaXQ2NCAoX19ybGltaXRfcmVzb3VyY2VfdCBfX3Jlc291cmNlLAorCQkJX19jb25zdCBzdHJ1Y3QgcmxpbWl0NjQgKl9fcmxpbWl0cykgX19USFJPVzsKKyNlbmRpZgorCisvKiBSZXR1cm4gcmVzb3VyY2UgdXNhZ2UgaW5mb3JtYXRpb24gb24gcHJvY2VzcyBpbmRpY2F0ZWQgYnkgV0hPCisgICBhbmQgcHV0IGl0IGluICpVU0FHRS4gIFJldHVybnMgMCBmb3Igc3VjY2VzcywgLTEgZm9yIGZhaWx1cmUuICAqLworZXh0ZXJuIGludCBnZXRydXNhZ2UgKF9fcnVzYWdlX3dob190IF9fd2hvLCBzdHJ1Y3QgcnVzYWdlICpfX3VzYWdlKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgb2YgYW55IHByb2Nlc3Mgc3BlY2lmaWVkIGJ5IFdISUNIIGFuZCBXSE8KKyAgIChzZWUgYWJvdmUpOyBpZiBXSE8gaXMgemVybywgdGhlIGN1cnJlbnQgcHJvY2VzcywgcHJvY2VzcyBncm91cCwgb3IgdXNlcgorICAgKGFzIHNwZWNpZmllZCBieSBXSE8pIGlzIHVzZWQuICBBIGxvd2VyIHByaW9yaXR5IG51bWJlciBtZWFucyBoaWdoZXIKKyAgIHByaW9yaXR5LiAgUHJpb3JpdGllcyByYW5nZSBmcm9tIFBSSU9fTUlOIHRvIFBSSU9fTUFYIChhYm92ZSkuICAqLworZXh0ZXJuIGludCBnZXRwcmlvcml0eSAoX19wcmlvcml0eV93aGljaF90IF9fd2hpY2gsIGlkX3QgX193aG8pIF9fVEhST1c7CisKKy8qIFNldCB0aGUgcHJpb3JpdHkgb2YgYWxsIHByb2Nlc3NlcyBzcGVjaWZpZWQgYnkgV0hJQ0ggYW5kIFdITyAoc2VlIGFib3ZlKQorICAgdG8gUFJJTy4gIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzZXRwcmlvcml0eSAoX19wcmlvcml0eV93aGljaF90IF9fd2hpY2gsIGlkX3QgX193aG8sIGludCBfX3ByaW8pCisgICAgIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvcmVzb3VyY2UuaCAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NlbGVjdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc2VsZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmMmIzZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NlbGVjdC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKiBgZmRfc2V0JyB0eXBlIGFuZCByZWxhdGVkIG1hY3JvcywgYW5kIGBzZWxlY3QnL2Bwc2VsZWN0JyBkZWNsYXJhdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMywgMjAwOSwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoJUE9TSVggMTAwMy4xZzogNi4yIFNlbGVjdCBmcm9tIEZpbGUgRGVzY3JpcHRvciBTZXRzIDxzeXMvc2VsZWN0Lmg+ICAqLworCisjaWZuZGVmIF9TWVNfU0VMRUNUX0gKKyNkZWZpbmUgX1NZU19TRUxFQ1RfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgZGVmaW5pdGlvbiBvZiBuZWVkZWQgYmFzaWMgdHlwZXMuICAqLworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogR2V0IF9fRkRfKiBkZWZpbml0aW9ucy4gICovCisjaW5jbHVkZSA8Yml0cy9zZWxlY3QuaD4KKworLyogR2V0IF9fc2lnc2V0X3QuICAqLworI2luY2x1ZGUgPGJpdHMvc2lnc2V0Lmg+CisKKyNpZm5kZWYgX19zaWdzZXRfdF9kZWZpbmVkCisjIGRlZmluZSBfX3NpZ3NldF90X2RlZmluZWQKK3R5cGVkZWYgX19zaWdzZXRfdCBzaWdzZXRfdDsKKyNlbmRpZgorCisvKiBHZXQgZGVmaW5pdGlvbiBvZiB0aW1lciBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZXMuICAqLworI2RlZmluZSBfX25lZWRfdGltZV90CisjZGVmaW5lIF9fbmVlZF90aW1lc3BlYworI2luY2x1ZGUgPHRpbWUuaD4KKyNkZWZpbmUgX19uZWVkX3RpbWV2YWwKKyNpbmNsdWRlIDxiaXRzL3RpbWUuaD4KKworI2lmbmRlZiBfX3N1c2Vjb25kc190X2RlZmluZWQKK3R5cGVkZWYgX19zdXNlY29uZHNfdCBzdXNlY29uZHNfdDsKKyMgZGVmaW5lIF9fc3VzZWNvbmRzX3RfZGVmaW5lZAorI2VuZGlmCisKKworLyogVGhlIGZkX3NldCBtZW1iZXIgaXMgcmVxdWlyZWQgdG8gYmUgYW4gYXJyYXkgb2YgbG9uZ3MuICAqLwordHlwZWRlZiBsb25nIGludCBfX2ZkX21hc2s7CisKKy8qIFNvbWUgdmVyc2lvbnMgb2YgPGxpbnV4L3Bvc2l4X3R5cGVzLmg+IGRlZmluZSB0aGlzIG1hY3Jvcy4gICovCisjdW5kZWYJX19ORkRCSVRTCisvKiBJdCdzIGVhc2llciB0byBhc3N1bWUgOC1iaXQgYnl0ZXMgdGhhbiB0byBnZXQgQ0hBUl9CSVQuICAqLworI2RlZmluZSBfX05GREJJVFMJKDggKiAoaW50KSBzaXplb2YgKF9fZmRfbWFzaykpCisjZGVmaW5lCV9fRkRfRUxUKGQpCSgoZCkgLyBfX05GREJJVFMpCisjZGVmaW5lCV9fRkRfTUFTSyhkKQkoKF9fZmRfbWFzaykgMSA8PCAoKGQpICUgX19ORkRCSVRTKSkKKworLyogZmRfc2V0IGZvciBzZWxlY3QgYW5kIHBzZWxlY3QuICAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIC8qIFhQRzQuMiByZXF1aXJlcyB0aGlzIG1lbWJlciBuYW1lLiAgT3RoZXJ3aXNlIGF2b2lkIHRoZSBuYW1lCisgICAgICAgZnJvbSB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gICovCisjaWZkZWYgX19VU0VfWE9QRU4KKyAgICBfX2ZkX21hc2sgZmRzX2JpdHNbX19GRF9TRVRTSVpFIC8gX19ORkRCSVRTXTsKKyMgZGVmaW5lIF9fRkRTX0JJVFMoc2V0KSAoKHNldCktPmZkc19iaXRzKQorI2Vsc2UKKyAgICBfX2ZkX21hc2sgX19mZHNfYml0c1tfX0ZEX1NFVFNJWkUgLyBfX05GREJJVFNdOworIyBkZWZpbmUgX19GRFNfQklUUyhzZXQpICgoc2V0KS0+X19mZHNfYml0cykKKyNlbmRpZgorICB9IGZkX3NldDsKKworLyogTWF4aW11bSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBpbiBgZmRfc2V0Jy4gICovCisjZGVmaW5lCUZEX1NFVFNJWkUJCV9fRkRfU0VUU0laRQorCisjaWZkZWYgX19VU0VfTUlTQworLyogU29tZXRpbWVzIHRoZSBmZF9zZXQgbWVtYmVyIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGlzIHR5cGUuICAqLwordHlwZWRlZiBfX2ZkX21hc2sgZmRfbWFzazsKKworLyogTnVtYmVyIG9mIGJpdHMgcGVyIHdvcmQgb2YgYGZkX3NldCcgKHNvbWUgY29kZSBhc3N1bWVzIHRoaXMgaXMgMzIpLiAgKi8KKyMgZGVmaW5lIE5GREJJVFMJCV9fTkZEQklUUworI2VuZGlmCisKKworLyogQWNjZXNzIG1hY3JvcyBmb3IgYGZkX3NldCcuICAqLworI2RlZmluZQlGRF9TRVQoZmQsIGZkc2V0cCkJX19GRF9TRVQgKGZkLCBmZHNldHApCisjZGVmaW5lCUZEX0NMUihmZCwgZmRzZXRwKQlfX0ZEX0NMUiAoZmQsIGZkc2V0cCkKKyNkZWZpbmUJRkRfSVNTRVQoZmQsIGZkc2V0cCkJX19GRF9JU1NFVCAoZmQsIGZkc2V0cCkKKyNkZWZpbmUJRkRfWkVSTyhmZHNldHApCQlfX0ZEX1pFUk8gKGZkc2V0cCkKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIENoZWNrIHRoZSBmaXJzdCBORkRTIGRlc2NyaXB0b3JzIGVhY2ggaW4gUkVBREZEUyAoaWYgbm90IE5VTEwpIGZvciByZWFkCisgICByZWFkaW5lc3MsIGluIFdSSVRFRkRTIChpZiBub3QgTlVMTCkgZm9yIHdyaXRlIHJlYWRpbmVzcywgYW5kIGluIEVYQ0VQVEZEUworICAgKGlmIG5vdCBOVUxMKSBmb3IgZXhjZXB0aW9uYWwgY29uZGl0aW9ucy4gIElmIFRJTUVPVVQgaXMgbm90IE5VTEwsIHRpbWUgb3V0CisgICBhZnRlciB3YWl0aW5nIHRoZSBpbnRlcnZhbCBzcGVjaWZpZWQgdGhlcmVpbi4gIFJldHVybnMgdGhlIG51bWJlciBvZiByZWFkeQorICAgZGVzY3JpcHRvcnMsIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzZWxlY3QgKGludCBfX25mZHMsIGZkX3NldCAqX19yZXN0cmljdCBfX3JlYWRmZHMsCisJCSAgIGZkX3NldCAqX19yZXN0cmljdCBfX3dyaXRlZmRzLAorCQkgICBmZF9zZXQgKl9fcmVzdHJpY3QgX19leGNlcHRmZHMsCisJCSAgIHN0cnVjdCB0aW1ldmFsICpfX3Jlc3RyaWN0IF9fdGltZW91dCk7CisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBTYW1lIGFzIGFib3ZlIG9ubHkgdGhhdCB0aGUgVElNRU9VVCB2YWx1ZSBpcyBnaXZlbiB3aXRoIGhpZ2hlcgorICAgcmVzb2x1dGlvbiBhbmQgYSBzaWdtYXNrIHdoaWNoIGlzIGJlZW4gc2V0IHRlbXBvcmFyaWx5LiAgVGhpcyB2ZXJzaW9uCisgICBzaG91bGQgYmUgdXNlZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHBzZWxlY3QgKGludCBfX25mZHMsIGZkX3NldCAqX19yZXN0cmljdCBfX3JlYWRmZHMsCisJCSAgICBmZF9zZXQgKl9fcmVzdHJpY3QgX193cml0ZWZkcywKKwkJICAgIGZkX3NldCAqX19yZXN0cmljdCBfX2V4Y2VwdGZkcywKKwkJICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXN0cmljdCBfX3RpbWVvdXQsCisJCSAgICBjb25zdCBfX3NpZ3NldF90ICpfX3Jlc3RyaWN0IF9fc2lnbWFzayk7CisjZW5kaWYKKworCisvKiBEZWZpbmUgc29tZSBpbmxpbmVzIGhlbHBpbmcgdG8gY2F0Y2ggY29tbW9uIHByb2JsZW1zLiAgKi8KKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fR05VQ19fCisjIGluY2x1ZGUgPGJpdHMvc2VsZWN0Mi5oPgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvc2VsZWN0LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NlbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc2VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhNTdmYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NlbS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0VNX0gKKyNkZWZpbmUgX1NZU19TRU1fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogR2V0IGNvbW1vbiBkZWZpbml0aW9uIG9mIFN5c3RlbSBWIHN0eWxlIElQQy4gICovCisjaW5jbHVkZSA8c3lzL2lwYy5oPgorCisvKiBHZXQgc3lzdGVtIGRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgc2VtaWRfZHMnIGFuZCBtb3JlLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NlbS5oPgorCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBfX25lZWRfdGltZXNwZWMKKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgU3lzdGVtIFYgc3R5bGUgSVBDIGZ1bmN0aW9ucyBpbXBsZW1lbnQgYSBzZW1hcGhvcmUKKyAgIGhhbmRsaW5nLiAgVGhlIGRlZmluaXRpb24gaXMgZm91bmQgaW4gWFBHMi4gICovCisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciBhcmd1bWVudCB0byBgc2Vtb3AnIHRvIGRlc2NyaWJlIG9wZXJhdGlvbnMuICAqLworc3RydWN0IHNlbWJ1ZgoreworICB1bnNpZ25lZCBzaG9ydCBpbnQgc2VtX251bTsJLyogc2VtYXBob3JlIG51bWJlciAqLworICBzaG9ydCBpbnQgc2VtX29wOwkJLyogc2VtYXBob3JlIG9wZXJhdGlvbiAqLworICBzaG9ydCBpbnQgc2VtX2ZsZzsJCS8qIG9wZXJhdGlvbiBmbGFnICovCit9OworCisKK19fQkVHSU5fREVDTFMKKworLyogU2VtYXBob3JlIGNvbnRyb2wgb3BlcmF0aW9uLiAgKi8KK2V4dGVybiBpbnQgc2VtY3RsIChpbnQgX19zZW1pZCwgaW50IF9fc2VtbnVtLCBpbnQgX19jbWQsIC4uLikgX19USFJPVzsKKworLyogR2V0IHNlbWFwaG9yZS4gICovCitleHRlcm4gaW50IHNlbWdldCAoa2V5X3QgX19rZXksIGludCBfX25zZW1zLCBpbnQgX19zZW1mbGcpIF9fVEhST1c7CisKKy8qIE9wZXJhdGUgb24gc2VtYXBob3JlLiAgKi8KK2V4dGVybiBpbnQgc2Vtb3AgKGludCBfX3NlbWlkLCBzdHJ1Y3Qgc2VtYnVmICpfX3NvcHMsIHNpemVfdCBfX25zb3BzKSBfX1RIUk9XOworCisjaWZkZWYgX19VU0VfR05VCisvKiBPcGVyYXRlIG9uIHNlbWFwaG9yZSB3aXRoIHRpbWVvdXQuICAqLworZXh0ZXJuIGludCBzZW10aW1lZG9wIChpbnQgX19zZW1pZCwgc3RydWN0IHNlbWJ1ZiAqX19zb3BzLCBzaXplX3QgX19uc29wcywKKwkJICAgICAgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3RpbWVvdXQpIF9fVEhST1c7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9zZW0uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc2VuZGZpbGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NlbmRmaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxMzY3YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NlbmRmaWxlLmgKQEAgLTAsMCArMSw1MiBAQAorLyogc2VuZGZpbGUgLS0gY29weSBkYXRhIGRpcmVjdGx5IGZyb20gb25lIGZpbGUgZGVzY3JpcHRvciB0byBhbm90aGVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsOTksMDEsMjAwMiwyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0VOREZJTEVfSAorI2RlZmluZSBfU1lTX1NFTkRGSUxFX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBTZW5kIHVwIHRvIENPVU5UIGJ5dGVzIGZyb20gZmlsZSBhc3NvY2lhdGVkIHdpdGggSU5fRkQgc3RhcnRpbmcgYXQKKyAgICpPRkZTRVQgdG8gZGVzY3JpcHRvciBPVVRfRkQuICBTZXQgKk9GRlNFVCB0byB0aGUgSU5fRkQncyBmaWxlIHBvc2l0aW9uCisgICBmb2xsb3dpbmcgdGhlIHJlYWQgYnl0ZXMuICBJZiBPRkZTRVQgaXMgYSBudWxsIHBvaW50ZXIsIHVzZSB0aGUgbm9ybWFsCisgICBmaWxlIHBvc2l0aW9uIGluc3RlYWQuICBSZXR1cm4gdGhlIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzLCBvciAtMSBpbgorICAgY2FzZSBvZiBlcnJvci4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBzc2l6ZV90IHNlbmRmaWxlIChpbnQgX19vdXRfZmQsIGludCBfX2luX2ZkLCBvZmZfdCAqX19vZmZzZXQsCisJCQkgc2l6ZV90IF9fY291bnQpIF9fVEhST1c7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVF9OVEggKHNlbmRmaWxlLAorCQkJICAgICAgIChpbnQgX19vdXRfZmQsIGludCBfX2luX2ZkLCBfX29mZjY0X3QgKl9fb2Zmc2V0LAorCQkJCXNpemVfdCBfX2NvdW50KSwgc2VuZGZpbGU2NCk7CisjIGVsc2UKKyMgIGRlZmluZSBzZW5kZmlsZSBzZW5kZmlsZTY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIHNzaXplX3Qgc2VuZGZpbGU2NCAoaW50IF9fb3V0X2ZkLCBpbnQgX19pbl9mZCwgX19vZmY2NF90ICpfX29mZnNldCwKKwkJCSAgIHNpemVfdCBfX2NvdW50KSBfX1RIUk9XOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvc2VuZGZpbGUuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc2htLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zaG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODZjZTc1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc2htLmgKQEAgLTAsMCArMSw2NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TSE1fSAorI2RlZmluZSBfU1lTX1NITV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBHZXQgY29tbW9uIGRlZmluaXRpb24gb2YgU3lzdGVtIFYgc3R5bGUgSVBDLiAgKi8KKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisKKy8qIEdldCBzeXN0ZW0gZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYHN0cnVjdCBzaG1pZF9kcycgYW5kIG1vcmUuICAqLworI2luY2x1ZGUgPGJpdHMvc2htLmg+CisKKy8qIERlZmluZSB0eXBlcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQuICAqLworI2RlZmluZSBfX25lZWRfdGltZV90CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgX19VU0VfWE9QRU4KKyMgaWZuZGVmIF9fcGlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3BpZF90IHBpZF90OworIyAgZGVmaW5lIF9fcGlkX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCS8qIFgvT3BlbiAqLworCisKK19fQkVHSU5fREVDTFMKKworLyogVGhlIGZvbGxvd2luZyBTeXN0ZW0gViBzdHlsZSBJUEMgZnVuY3Rpb25zIGltcGxlbWVudCBhIHNoYXJlZCBtZW1vcnkKKyAgIGZhY2lsaXR5LiAgVGhlIGRlZmluaXRpb24gaXMgZm91bmQgaW4gWFBHNC4yLiAgKi8KKworLyogU2hhcmVkIG1lbW9yeSBjb250cm9sIG9wZXJhdGlvbi4gICovCitleHRlcm4gaW50IHNobWN0bCAoaW50IF9fc2htaWQsIGludCBfX2NtZCwgc3RydWN0IHNobWlkX2RzICpfX2J1ZikgX19USFJPVzsKKworLyogR2V0IHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gICovCitleHRlcm4gaW50IHNobWdldCAoa2V5X3QgX19rZXksIHNpemVfdCBfX3NpemUsIGludCBfX3NobWZsZykgX19USFJPVzsKKworLyogQXR0YWNoIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gICovCitleHRlcm4gdm9pZCAqc2htYXQgKGludCBfX3NobWlkLCBfX2NvbnN0IHZvaWQgKl9fc2htYWRkciwgaW50IF9fc2htZmxnKQorICAgICBfX1RIUk9XOworCisvKiBEZXRhY2ggc2hhcmVkIG1lbW9yeSBzZWdtZW50LiAgKi8KK2V4dGVybiBpbnQgc2htZHQgKF9fY29uc3Qgdm9pZCAqX19zaG1hZGRyKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3NobS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zaWduYWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjAyZGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zaWduYWwuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8c2lnbmFsLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zaWduYWxmZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc2lnbmFsZmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWIyN2VlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc2lnbmFsZmQuaApAQCAtMCwwICsxLDY2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19TSUdOQUxGRF9ICisjZGVmaW5lCV9TWVNfU0lHTkFMRkRfSAkxCisKKyNkZWZpbmUgX19uZWVkX3NpZ3NldF90CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKworc3RydWN0IHNpZ25hbGZkX3NpZ2luZm8KK3sKKyAgdWludDMyX3Qgc3NpX3NpZ25vOworICBpbnQzMl90IHNzaV9lcnJubzsKKyAgaW50MzJfdCBzc2lfY29kZTsKKyAgdWludDMyX3Qgc3NpX3BpZDsKKyAgdWludDMyX3Qgc3NpX3VpZDsKKyAgaW50MzJfdCBzc2lfZmQ7CisgIHVpbnQzMl90IHNzaV90aWQ7CisgIHVpbnQzMl90IHNzaV9iYW5kOworICB1aW50MzJfdCBzc2lfb3ZlcnJ1bjsKKyAgdWludDMyX3Qgc3NpX3RyYXBubzsKKyAgaW50MzJfdCBzc2lfc3RhdHVzOworICBpbnQzMl90IHNzaV9pbnQ7CisgIHVpbnQ2NF90IHNzaV9wdHI7CisgIHVpbnQ2NF90IHNzaV91dGltZTsKKyAgdWludDY0X3Qgc3NpX3N0aW1lOworICB1aW50NjRfdCBzc2lfYWRkcjsKKyAgdWludDhfdCBfX3BhZFs0OF07Cit9OworCisvKiBGbGFncyBmb3Igc2lnbmFsZmQuICAqLworZW51bQorICB7CisgICAgU0ZEX0NMT0VYRUMgPSAwMjAwMDAwMCwKKyNkZWZpbmUgU0ZEX0NMT0VYRUMgU0ZEX0NMT0VYRUMKKyAgICBTRkRfTk9OQkxPQ0sgPSAwNDAwMAorI2RlZmluZSBTRkRfTk9OQkxPQ0sgU0ZEX05PTkJMT0NLCisgIH07CisKK19fQkVHSU5fREVDTFMKKworLyogUmVxdWVzdCBub3RpZmljYXRpb24gZm9yIGRlbGl2ZXJ5IG9mIHNpZ25hbHMgaW4gTUFTSyB0byBiZQorICAgcGVyZm9ybWVkIHVzaW5nIGRlc2NyaXB0b3IgRkQuKi8KK2V4dGVybiBpbnQgc2lnbmFsZmQgKGludCBfX2ZkLCBjb25zdCBzaWdzZXRfdCAqX19tYXNrLCBpbnQgX19mbGFncykKKyAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvc2lnbmFsZmQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc29ja2V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjFmNTZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc29ja2V0LmgKQEAgLTAsMCArMSwyNTYgQEAKKy8qIERlY2xhcmF0aW9ucyBvZiBzb2NrZXQgY29uc3RhbnRzLCB0eXBlcywgYW5kIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5MSw5MiwxOTk0LTIwMDEsMjAwMywyMDA1LDIwMDcsMjAwOAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19TT0NLRVRfSAorI2RlZmluZQlfU1lTX1NPQ0tFVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNkZWZpbmUJX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmZGVmIF9fVVNFX0dOVQorLyogR2V0IHRoZSBfX3NpZ3NldF90IGRlZmluaXRpb24uICAqLworIyBpbmNsdWRlIDxiaXRzL3NpZ3NldC5oPgorI2VuZGlmCisKKworLyogVGhpcyBvcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIFNPQ0tfKiwgUEZfKiwKKyAgIEFGXyosIE1TR18qLCBTT0xfKiwgYW5kIFNPXyogY29uc3RhbnRzLCBhbmQgdGhlIGBzdHJ1Y3Qgc29ja2FkZHInLAorICAgYHN0cnVjdCBtc2doZHInLCBhbmQgYHN0cnVjdCBsaW5nZXInIHR5cGVzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NvY2tldC5oPgorCisjaWZkZWYgX19VU0VfQlNECisvKiBUaGlzIGlzIHRoZSA0LjMgQlNEIGBzdHJ1Y3Qgc29ja2FkZHInIGZvcm1hdCwgd2hpY2ggaXMgdXNlZCBhcyB3aXJlCisgICBmb3JtYXQgaW4gdGhlIGdyb3R0eSBvbGQgNC4zIGB0YWxrJyBwcm90b2NvbC4gICovCitzdHJ1Y3Qgb3NvY2thZGRyCisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgc2FfZmFtaWx5OworICAgIHVuc2lnbmVkIGNoYXIgc2FfZGF0YVsxNF07CisgIH07CisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mCisgICBgc2h1dGRvd24nLiAgKi8KK2VudW0KK3sKKyAgU0hVVF9SRCA9IDAsCQkvKiBObyBtb3JlIHJlY2VwdGlvbnMuICAqLworI2RlZmluZSBTSFVUX1JECQlTSFVUX1JECisgIFNIVVRfV1IsCQkvKiBObyBtb3JlIHRyYW5zbWlzc2lvbnMuICAqLworI2RlZmluZSBTSFVUX1dSCQlTSFVUX1dSCisgIFNIVVRfUkRXUgkJLyogTm8gbW9yZSByZWNlcHRpb25zIG9yIHRyYW5zbWlzc2lvbnMuICAqLworI2RlZmluZSBTSFVUX1JEV1IJU0hVVF9SRFdSCit9OworCisvKiBUaGlzIGlzIHRoZSB0eXBlIHdlIHVzZSBmb3IgZ2VuZXJpYyBzb2NrZXQgYWRkcmVzcyBhcmd1bWVudHMuCisKKyAgIFdpdGggR0NDIDIuNyBhbmQgbGF0ZXIsIHRoZSBmdW5reSB1bmlvbiBjYXVzZXMgcmVkZWNsYXJhdGlvbnMgb3IKKyAgIHVzZXMgd2l0aCBhbnkgb2YgdGhlIGxpc3RlZCB0eXBlcyB0byBiZSBhbGxvd2VkIHdpdGhvdXQgY29tcGxhaW50LgorICAgRysrIDIuNyBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zcGFyZW50IHVuaW9ucyBzbyB0aGVyZSB3ZSB3YW50IHRoZQorICAgb2xkLXN0eWxlIGRlY2xhcmF0aW9uLCB0b28uICAqLworI2lmIGRlZmluZWQgX19jcGx1c3BsdXMgfHwgIV9fR05VQ19QUkVSRVEgKDIsIDcpIHx8ICFkZWZpbmVkIF9fVVNFX0dOVQorIyBkZWZpbmUgX19TT0NLQUREUl9BUkcJCXN0cnVjdCBzb2NrYWRkciAqX19yZXN0cmljdAorIyBkZWZpbmUgX19DT05TVF9TT0NLQUREUl9BUkcJX19jb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKgorI2Vsc2UKKy8qIEFkZCBtb3JlIGBzdHJ1Y3Qgc29ja2FkZHJfQUYnIHR5cGVzIGhlcmUgYXMgbmVjZXNzYXJ5LgorICAgVGhlc2UgYXJlIGFsbCB0aGUgb25lcyBJIGZvdW5kIG9uIE5ldEJTRCBhbmQgTGludXguICAqLworIyBkZWZpbmUgX19TT0NLQUREUl9BTExUWVBFUyBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHIpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9hdCkgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX2F4MjUpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9kbCkgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX2VvbikgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX2luKSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfaW42KSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfaW5hcnApIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9pcHgpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9pc28pIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9ucykgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX3VuKSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfeDI1KQorCisjIGRlZmluZSBfX1NPQ0tBRERSX09ORVRZUEUodHlwZSkgc3RydWN0IHR5cGUgKl9fcmVzdHJpY3QgX18jI3R5cGUjI19fOwordHlwZWRlZiB1bmlvbiB7IF9fU09DS0FERFJfQUxMVFlQRVMKKwkgICAgICB9IF9fU09DS0FERFJfQVJHIF9fYXR0cmlidXRlX18gKChfX3RyYW5zcGFyZW50X3VuaW9uX18pKTsKKyMgdW5kZWYgX19TT0NLQUREUl9PTkVUWVBFCisjIGRlZmluZSBfX1NPQ0tBRERSX09ORVRZUEUodHlwZSkgX19jb25zdCBzdHJ1Y3QgdHlwZSAqX19yZXN0cmljdCBfXyMjdHlwZSMjX187Cit0eXBlZGVmIHVuaW9uIHsgX19TT0NLQUREUl9BTExUWVBFUworCSAgICAgIH0gX19DT05TVF9TT0NLQUREUl9BUkcgX19hdHRyaWJ1dGVfXyAoKF9fdHJhbnNwYXJlbnRfdW5pb25fXykpOworIyB1bmRlZiBfX1NPQ0tBRERSX09ORVRZUEUKKyNlbmRpZgorCisKKy8qIENyZWF0ZSBhIG5ldyBzb2NrZXQgb2YgdHlwZSBUWVBFIGluIGRvbWFpbiBET01BSU4sIHVzaW5nCisgICBwcm90b2NvbCBQUk9UT0NPTC4gIElmIFBST1RPQ09MIGlzIHplcm8sIG9uZSBpcyBjaG9zZW4gYXV0b21hdGljYWxseS4KKyAgIFJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBuZXcgc29ja2V0LCBvciAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgc29ja2V0IChpbnQgX19kb21haW4sIGludCBfX3R5cGUsIGludCBfX3Byb3RvY29sKSBfX1RIUk9XOworCisvKiBDcmVhdGUgdHdvIG5ldyBzb2NrZXRzLCBvZiB0eXBlIFRZUEUgaW4gZG9tYWluIERPTUFJTiBhbmQgdXNpbmcKKyAgIHByb3RvY29sIFBST1RPQ09MLCB3aGljaCBhcmUgY29ubmVjdGVkIHRvIGVhY2ggb3RoZXIsIGFuZCBwdXQgZmlsZQorICAgZGVzY3JpcHRvcnMgZm9yIHRoZW0gaW4gRkRTWzBdIGFuZCBGRFNbMV0uICBJZiBQUk9UT0NPTCBpcyB6ZXJvLAorICAgb25lIHdpbGwgYmUgY2hvc2VuIGF1dG9tYXRpY2FsbHkuICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IHNvY2tldHBhaXIgKGludCBfX2RvbWFpbiwgaW50IF9fdHlwZSwgaW50IF9fcHJvdG9jb2wsCisJCSAgICAgICBpbnQgX19mZHNbMl0pIF9fVEhST1c7CisKKy8qIEdpdmUgdGhlIHNvY2tldCBGRCB0aGUgbG9jYWwgYWRkcmVzcyBBRERSICh3aGljaCBpcyBMRU4gYnl0ZXMgbG9uZykuICAqLworZXh0ZXJuIGludCBiaW5kIChpbnQgX19mZCwgX19DT05TVF9TT0NLQUREUl9BUkcgX19hZGRyLCBzb2NrbGVuX3QgX19sZW4pCisgICAgIF9fVEhST1c7CisKKy8qIFB1dCB0aGUgbG9jYWwgYWRkcmVzcyBvZiBGRCBpbnRvICpBRERSIGFuZCBpdHMgbGVuZ3RoIGluICpMRU4uICAqLworZXh0ZXJuIGludCBnZXRzb2NrbmFtZSAoaW50IF9fZmQsIF9fU09DS0FERFJfQVJHIF9fYWRkciwKKwkJCXNvY2tsZW5fdCAqX19yZXN0cmljdCBfX2xlbikgX19USFJPVzsKKworLyogT3BlbiBhIGNvbm5lY3Rpb24gb24gc29ja2V0IEZEIHRvIHBlZXIgYXQgQUREUiAod2hpY2ggTEVOIGJ5dGVzIGxvbmcpLgorICAgRm9yIGNvbm5lY3Rpb25sZXNzIHNvY2tldCB0eXBlcywganVzdCBzZXQgdGhlIGRlZmF1bHQgYWRkcmVzcyB0byBzZW5kIHRvCisgICBhbmQgdGhlIG9ubHkgYWRkcmVzcyBmcm9tIHdoaWNoIHRvIGFjY2VwdCB0cmFuc21pc3Npb25zLgorICAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGNvbm5lY3QgKGludCBfX2ZkLCBfX0NPTlNUX1NPQ0tBRERSX0FSRyBfX2FkZHIsIHNvY2tsZW5fdCBfX2xlbik7CisKKy8qIFB1dCB0aGUgYWRkcmVzcyBvZiB0aGUgcGVlciBjb25uZWN0ZWQgdG8gc29ja2V0IEZEIGludG8gKkFERFIKKyAgICh3aGljaCBpcyAqTEVOIGJ5dGVzIGxvbmcpLCBhbmQgaXRzIGFjdHVhbCBsZW5ndGggaW50byAqTEVOLiAgKi8KK2V4dGVybiBpbnQgZ2V0cGVlcm5hbWUgKGludCBfX2ZkLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCQlzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19sZW4pIF9fVEhST1c7CisKKworLyogU2VuZCBOIGJ5dGVzIG9mIEJVRiB0byBzb2NrZXQgRkQuICBSZXR1cm5zIHRoZSBudW1iZXIgc2VudCBvciAtMS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCBzZW5kIChpbnQgX19mZCwgX19jb25zdCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbiwgaW50IF9fZmxhZ3MpOworCisvKiBSZWFkIE4gYnl0ZXMgaW50byBCVUYgZnJvbSBzb2NrZXQgRkQuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgcmVhZCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHJlY3YgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbiwgaW50IF9fZmxhZ3MpOworCisvKiBTZW5kIE4gYnl0ZXMgb2YgQlVGIG9uIHNvY2tldCBGRCB0byBwZWVyIGF0IGFkZHJlc3MgQUREUiAod2hpY2ggaXMKKyAgIEFERFJfTEVOIGJ5dGVzIGxvbmcpLiAgUmV0dXJucyB0aGUgbnVtYmVyIHNlbnQsIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3Qgc2VuZHRvIChpbnQgX19mZCwgX19jb25zdCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbiwKKwkJICAgICAgIGludCBfX2ZsYWdzLCBfX0NPTlNUX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCSAgICAgICBzb2NrbGVuX3QgX19hZGRyX2xlbik7CisKKy8qIFJlYWQgTiBieXRlcyBpbnRvIEJVRiB0aHJvdWdoIHNvY2tldCBGRC4KKyAgIElmIEFERFIgaXMgbm90IE5VTEwsIGZpbGwgaW4gKkFERFJfTEVOIGJ5dGVzIG9mIGl0IHdpdGggdGhhIGFkZHJlc3Mgb2YKKyAgIHRoZSBzZW5kZXIsIGFuZCBzdG9yZSB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGFkZHJlc3MgaW4gKkFERFJfTEVOLgorICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEgZm9yIGVycm9ycy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCByZWN2ZnJvbSAoaW50IF9fZmQsIHZvaWQgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX24sCisJCQkgaW50IF9fZmxhZ3MsIF9fU09DS0FERFJfQVJHIF9fYWRkciwKKwkJCSBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19hZGRyX2xlbik7CisKKworLyogU2VuZCBhIG1lc3NhZ2UgZGVzY3JpYmVkIE1FU1NBR0Ugb24gc29ja2V0IEZELgorICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQsIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3Qgc2VuZG1zZyAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IG1zZ2hkciAqX19tZXNzYWdlLAorCQkJaW50IF9fZmxhZ3MpOworCisvKiBSZWNlaXZlIGEgbWVzc2FnZSBhcyBkZXNjcmliZWQgYnkgTUVTU0FHRSBmcm9tIHNvY2tldCBGRC4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgcmVjdm1zZyAoaW50IF9fZmQsIHN0cnVjdCBtc2doZHIgKl9fbWVzc2FnZSwgaW50IF9fZmxhZ3MpOworCisKKy8qIFB1dCB0aGUgY3VycmVudCB2YWx1ZSBmb3Igc29ja2V0IEZEJ3Mgb3B0aW9uIE9QVE5BTUUgYXQgcHJvdG9jb2wgbGV2ZWwgTEVWRUwKKyAgIGludG8gT1BUVkFMICh3aGljaCBpcyAqT1BUTEVOIGJ5dGVzIGxvbmcpLCBhbmQgc2V0ICpPUFRMRU4gdG8gdGhlIHZhbHVlJ3MKKyAgIGFjdHVhbCBsZW5ndGguICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IGdldHNvY2tvcHQgKGludCBfX2ZkLCBpbnQgX19sZXZlbCwgaW50IF9fb3B0bmFtZSwKKwkJICAgICAgIHZvaWQgKl9fcmVzdHJpY3QgX19vcHR2YWwsCisJCSAgICAgICBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19vcHRsZW4pIF9fVEhST1c7CisKKy8qIFNldCBzb2NrZXQgRkQncyBvcHRpb24gT1BUTkFNRSBhdCBwcm90b2NvbCBsZXZlbCBMRVZFTAorICAgdG8gKk9QVFZBTCAod2hpY2ggaXMgT1BUTEVOIGJ5dGVzIGxvbmcpLgorICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzZXRzb2Nrb3B0IChpbnQgX19mZCwgaW50IF9fbGV2ZWwsIGludCBfX29wdG5hbWUsCisJCSAgICAgICBfX2NvbnN0IHZvaWQgKl9fb3B0dmFsLCBzb2NrbGVuX3QgX19vcHRsZW4pIF9fVEhST1c7CisKKworLyogUHJlcGFyZSB0byBhY2NlcHQgY29ubmVjdGlvbnMgb24gc29ja2V0IEZELgorICAgTiBjb25uZWN0aW9uIHJlcXVlc3RzIHdpbGwgYmUgcXVldWVkIGJlZm9yZSBmdXJ0aGVyIHJlcXVlc3RzIGFyZSByZWZ1c2VkLgorICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBsaXN0ZW4gKGludCBfX2ZkLCBpbnQgX19uKSBfX1RIUk9XOworCisvKiBBd2FpdCBhIGNvbm5lY3Rpb24gb24gc29ja2V0IEZELgorICAgV2hlbiBhIGNvbm5lY3Rpb24gYXJyaXZlcywgb3BlbiBhIG5ldyBzb2NrZXQgdG8gY29tbXVuaWNhdGUgd2l0aCBpdCwKKyAgIHNldCAqQUREUiAod2hpY2ggaXMgKkFERFJfTEVOIGJ5dGVzIGxvbmcpIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW5nCisgICBwZWVyIGFuZCAqQUREUl9MRU4gdG8gdGhlIGFkZHJlc3MncyBhY3R1YWwgbGVuZ3RoLCBhbmQgcmV0dXJuIHRoZQorICAgbmV3IHNvY2tldCdzIGRlc2NyaXB0b3IsIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBhY2NlcHQgKGludCBfX2ZkLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCSAgIHNvY2tsZW5fdCAqX19yZXN0cmljdCBfX2FkZHJfbGVuKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogU2ltaWxhciB0byAnYWNjZXB0JyBidXQgdGFrZXMgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgdG8gc3BlY2lmeSBmbGFncy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGFjY2VwdDQgKGludCBfX2ZkLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCSAgICBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19hZGRyX2xlbiwgaW50IF9fZmxhZ3MpOworI2VuZGlmCisKKy8qIFNodXQgZG93biBhbGwgb3IgcGFydCBvZiB0aGUgY29ubmVjdGlvbiBvcGVuIG9uIHNvY2tldCBGRC4KKyAgIEhPVyBkZXRlcm1pbmVzIHdoYXQgdG8gc2h1dCBkb3duOgorICAgICBTSFVUX1JEICAgPSBObyBtb3JlIHJlY2VwdGlvbnM7CisgICAgIFNIVVRfV1IgICA9IE5vIG1vcmUgdHJhbnNtaXNzaW9uczsKKyAgICAgU0hVVF9SRFdSID0gTm8gbW9yZSByZWNlcHRpb25zIG9yIHRyYW5zbWlzc2lvbnMuCisgICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IHNodXRkb3duIChpbnQgX19mZCwgaW50IF9faG93KSBfX1RIUk9XOworCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBEZXRlcm1pbmUgd2hldGVyIHNvY2tldCBpcyBhdCBhIG91dC1vZi1iYW5kIG1hcmsuICAqLworZXh0ZXJuIGludCBzb2NrYXRtYXJrIChpbnQgX19mZCkgX19USFJPVzsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBGRFRZUEUgaXMgU19JRlNPQ0sgb3IgYW5vdGhlciBTX0lGKiBtYWNybyBkZWZpbmVkIGluIDxzeXMvc3RhdC5oPjsKKyAgIHJldHVybnMgMSBpZiBGRCBpcyBvcGVuIG9uIGFuIG9iamVjdCBvZiB0aGUgaW5kaWNhdGVkIHR5cGUsIDAgaWYgbm90LAorICAgb3IgLTEgZm9yIGVycm9ycyAoc2V0dGluZyBlcnJubykuICAqLworZXh0ZXJuIGludCBpc2ZkdHlwZSAoaW50IF9fZmQsIGludCBfX2ZkdHlwZSkgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIERlZmluZSBzb21lIG1hY3JvcyBoZWxwaW5nIHRvIGNhdGNoIGJ1ZmZlciBvdmVyZmxvd3MuICAqLworI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZQorIyBpbmNsdWRlIDxiaXRzL3NvY2tldDIuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3NvY2tldC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zb2NrZXR2YXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NvY2tldHZhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNzcxNTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zb2NrZXR2YXIuaApAQCAtMCwwICsxLDMgQEAKKy8qIFRoaXMgaGVhZGVyIGlzIHVzZWQgb24gbWFueSBzeXN0ZW1zIGJ1dCBmb3IgR05VIHdlIGhhdmUgZXZlcnl0aGluZworICAgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSBzdGFuZGFyZCBoZWFkZXIuICAqLworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NvdW5kY2FyZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc291bmRjYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkZTk4NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NvdW5kY2FyZC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N0YXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM4OWVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3RhdC5oCkBAIC0wLDAgKzEsNTM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTUtMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogNS42IEZpbGUgQ2hhcmFjdGVyaXN0aWNzCTxzeXMvc3RhdC5oPgorICovCisKKyNpZm5kZWYJX1NZU19TVEFUX0gKKyNkZWZpbmUJX1NZU19TVEFUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4JCS8qIEZvciBfX21vZGVfdCBhbmQgX19kZXZfdC4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySyB8fCBkZWZpbmVkIF9fVVNFX01JU0MgXAorCSB8fCBkZWZpbmVkIF9fVVNFX0FURklMRQorIyBpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworIyAgZGVmaW5lIF9fbmVlZF90aW1lX3QKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfQVRGSUxFCisjICBkZWZpbmUgX19uZWVkX3RpbWVzcGVjCisjIGVuZGlmCisjIGluY2x1ZGUgPHRpbWUuaD4JCS8qIEZvciB0aW1lX3QgcmVzcC4gdGltZXNwZWMuICAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworLyogVGhlIFNpbmdsZSBVbml4IHNwZWNpZmljYXRpb24gc2F5cyB0aGF0IHNvbWUgbW9yZSB0eXBlcyBhcmUKKyAgIGF2YWlsYWJsZSBoZXJlLiAgKi8KKyMgaWZuZGVmIF9fZGV2X3RfZGVmaW5lZAordHlwZWRlZiBfX2Rldl90IGRldl90OworIyAgZGVmaW5lIF9fZGV2X3RfZGVmaW5lZAorIyBlbmRpZgorCisjIGlmbmRlZiBfX2dpZF90X2RlZmluZWQKK3R5cGVkZWYgX19naWRfdCBnaWRfdDsKKyMgIGRlZmluZSBfX2dpZF90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19pbm9fdF9kZWZpbmVkCisjICBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAordHlwZWRlZiBfX2lub190IGlub190OworIyAgZWxzZQordHlwZWRlZiBfX2lubzY0X3QgaW5vX3Q7CisjICBlbmRpZgorIyAgZGVmaW5lIF9faW5vX3RfZGVmaW5lZAorIyBlbmRpZgorCisjIGlmbmRlZiBfX21vZGVfdF9kZWZpbmVkCit0eXBlZGVmIF9fbW9kZV90IG1vZGVfdDsKKyMgIGRlZmluZSBfX21vZGVfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fbmxpbmtfdF9kZWZpbmVkCit0eXBlZGVmIF9fbmxpbmtfdCBubGlua190OworIyAgZGVmaW5lIF9fbmxpbmtfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fb2ZmX3RfZGVmaW5lZAorIyAgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19vZmZfdCBvZmZfdDsKKyMgIGVsc2UKK3R5cGVkZWYgX19vZmY2NF90IG9mZl90OworIyAgZW5kaWYKKyMgIGRlZmluZSBfX29mZl90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX191aWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fdWlkX3QgdWlkX3Q7CisjICBkZWZpbmUgX191aWRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYJLyogWC9PcGVuICovCisKKyNpZmRlZiBfX1VTRV9VTklYOTgKKyMgaWZuZGVmIF9fYmxrY250X3RfZGVmaW5lZAorIyAgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19ibGtjbnRfdCBibGtjbnRfdDsKKyMgIGVsc2UKK3R5cGVkZWYgX19ibGtjbnQ2NF90IGJsa2NudF90OworIyAgZW5kaWYKKyMgIGRlZmluZSBfX2Jsa2NudF90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19ibGtzaXplX3RfZGVmaW5lZAordHlwZWRlZiBfX2Jsa3NpemVfdCBibGtzaXplX3Q7CisjICBkZWZpbmUgX19ibGtzaXplX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCS8qIFVuaXg5OCAqLworCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxiaXRzL3N0YXQuaD4KKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisjIGRlZmluZSBTX0lGTVQJCV9fU19JRk1UCisjIGRlZmluZSBTX0lGRElSCV9fU19JRkRJUgorIyBkZWZpbmUgU19JRkNIUglfX1NfSUZDSFIKKyMgZGVmaW5lIFNfSUZCTEsJX19TX0lGQkxLCisjIGRlZmluZSBTX0lGUkVHCV9fU19JRlJFRworIyBpZmRlZiBfX1NfSUZJRk8KKyMgIGRlZmluZSBTX0lGSUZPCV9fU19JRklGTworIyBlbmRpZgorIyBpZmRlZiBfX1NfSUZMTksKKyMgIGRlZmluZSBTX0lGTE5LCV9fU19JRkxOSworIyBlbmRpZgorIyBpZiAoZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfVU5JWDk4KSBcCisgICAgICYmIGRlZmluZWQgX19TX0lGU09DSworIyAgZGVmaW5lIFNfSUZTT0NLCV9fU19JRlNPQ0sKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBUZXN0IG1hY3JvcyBmb3IgZmlsZSB0eXBlcy4JKi8KKworI2RlZmluZQlfX1NfSVNUWVBFKG1vZGUsIG1hc2spCSgoKG1vZGUpICYgX19TX0lGTVQpID09IChtYXNrKSkKKworI2RlZmluZQlTX0lTRElSKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGRElSKQorI2RlZmluZQlTX0lTQ0hSKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGQ0hSKQorI2RlZmluZQlTX0lTQkxLKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGQkxLKQorI2RlZmluZQlTX0lTUkVHKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGUkVHKQorI2lmZGVmIF9fU19JRklGTworIyBkZWZpbmUgU19JU0ZJRk8obW9kZSkJIF9fU19JU1RZUEUoKG1vZGUpLCBfX1NfSUZJRk8pCisjZW5kaWYKKyNpZmRlZiBfX1NfSUZMTksKKyMgZGVmaW5lIFNfSVNMTksobW9kZSkJIF9fU19JU1RZUEUoKG1vZGUpLCBfX1NfSUZMTkspCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEICYmICFkZWZpbmVkIF9fU19JRkxOSworIyBkZWZpbmUgU19JU0xOSyhtb2RlKSAgMAorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTggfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKSBcCisgICAgJiYgZGVmaW5lZCBfX1NfSUZTT0NLCisjIGRlZmluZSBTX0lTU09DSyhtb2RlKSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGU09DSykKKyNlbGlmIGRlZmluZWQgX19VU0VfWE9QRU4ySworIyBkZWZpbmUgU19JU1NPQ0sobW9kZSkgMAorI2VuZGlmCisKKy8qIFRoZXNlIGFyZSBmcm9tIFBPU0lYLjFiLiAgSWYgdGhlIG9iamVjdHMgYXJlIG5vdCBpbXBsZW1lbnRlZCB1c2luZyBzZXBhcmF0ZQorICAgZGlzdGluY3QgZmlsZSB0eXBlcywgdGhlIG1hY3JvcyBhbHdheXMgd2lsbCBldmFsdWF0ZSB0byB6ZXJvLiAgVW5saWtlIHRoZQorICAgb3RoZXIgU18qIG1hY3JvcyB0aGUgZm9sbG93aW5nIHRocmVlIHRha2UgYSBwb2ludGVyIHRvIGEgYHN0cnVjdCBzdGF0JworICAgb2JqZWN0IGFzIHRoZSBhcmd1bWVudC4gICovCisjaWZkZWYJX19VU0VfUE9TSVgxOTkzMDkKKyMgZGVmaW5lIFNfVFlQRUlTTVEoYnVmKSBfX1NfVFlQRUlTTVEoYnVmKQorIyBkZWZpbmUgU19UWVBFSVNTRU0oYnVmKSBfX1NfVFlQRUlTU0VNKGJ1ZikKKyMgZGVmaW5lIFNfVFlQRUlTU0hNKGJ1ZikgX19TX1RZUEVJU1NITShidWYpCisjZW5kaWYKKworCisvKiBQcm90ZWN0aW9uIGJpdHMuICAqLworCisjZGVmaW5lCVNfSVNVSUQgX19TX0lTVUlECS8qIFNldCB1c2VyIElEIG9uIGV4ZWN1dGlvbi4gICovCisjZGVmaW5lCVNfSVNHSUQJX19TX0lTR0lECS8qIFNldCBncm91cCBJRCBvbiBleGVjdXRpb24uICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIFNhdmUgc3dhcHBlZCB0ZXh0IGFmdGVyIHVzZSAoc3RpY2t5IGJpdCkuICBUaGlzIGlzIHByZXR0eSB3ZWxsIG9ic29sZXRlLiAgKi8KKyMgZGVmaW5lIFNfSVNWVFgJX19TX0lTVlRYCisjZW5kaWYKKworI2RlZmluZQlTX0lSVVNSCV9fU19JUkVBRAkvKiBSZWFkIGJ5IG93bmVyLiAgKi8KKyNkZWZpbmUJU19JV1VTUglfX1NfSVdSSVRFCS8qIFdyaXRlIGJ5IG93bmVyLiAgKi8KKyNkZWZpbmUJU19JWFVTUglfX1NfSUVYRUMJLyogRXhlY3V0ZSBieSBvd25lci4gICovCisvKiBSZWFkLCB3cml0ZSwgYW5kIGV4ZWN1dGUgYnkgb3duZXIuICAqLworI2RlZmluZQlTX0lSV1hVCShfX1NfSVJFQUR8X19TX0lXUklURXxfX1NfSUVYRUMpCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgJiYgZGVmaW5lZCBfX1VTRV9CU0QKKyMgZGVmaW5lIFNfSVJFQUQJU19JUlVTUgorIyBkZWZpbmUgU19JV1JJVEUJU19JV1VTUgorIyBkZWZpbmUgU19JRVhFQwlTX0lYVVNSCisjZW5kaWYKKworI2RlZmluZQlTX0lSR1JQCShTX0lSVVNSID4+IDMpCS8qIFJlYWQgYnkgZ3JvdXAuICAqLworI2RlZmluZQlTX0lXR1JQCShTX0lXVVNSID4+IDMpCS8qIFdyaXRlIGJ5IGdyb3VwLiAgKi8KKyNkZWZpbmUJU19JWEdSUAkoU19JWFVTUiA+PiAzKQkvKiBFeGVjdXRlIGJ5IGdyb3VwLiAgKi8KKy8qIFJlYWQsIHdyaXRlLCBhbmQgZXhlY3V0ZSBieSBncm91cC4gICovCisjZGVmaW5lCVNfSVJXWEcJKFNfSVJXWFUgPj4gMykKKworI2RlZmluZQlTX0lST1RICShTX0lSR1JQID4+IDMpCS8qIFJlYWQgYnkgb3RoZXJzLiAgKi8KKyNkZWZpbmUJU19JV09USAkoU19JV0dSUCA+PiAzKQkvKiBXcml0ZSBieSBvdGhlcnMuICAqLworI2RlZmluZQlTX0lYT1RICShTX0lYR1JQID4+IDMpCS8qIEV4ZWN1dGUgYnkgb3RoZXJzLiAgKi8KKy8qIFJlYWQsIHdyaXRlLCBhbmQgZXhlY3V0ZSBieSBvdGhlcnMuICAqLworI2RlZmluZQlTX0lSV1hPCShTX0lSV1hHID4+IDMpCisKKworI2lmZGVmCV9fVVNFX0JTRAorLyogTWFjcm9zIGZvciBjb21tb24gbW9kZSBiaXQgbWFza3MuICAqLworIyBkZWZpbmUgQUNDRVNTUEVSTVMgKFNfSVJXWFV8U19JUldYR3xTX0lSV1hPKSAvKiAwNzc3ICovCisjIGRlZmluZSBBTExQRVJNUyAoU19JU1VJRHxTX0lTR0lEfFNfSVNWVFh8U19JUldYVXxTX0lSV1hHfFNfSVJXWE8pLyogMDc3NzcgKi8KKyMgZGVmaW5lIERFRkZJTEVNT0RFIChTX0lSVVNSfFNfSVdVU1J8U19JUkdSUHxTX0lXR1JQfFNfSVJPVEh8U19JV09USCkvKiAwNjY2Ki8KKworIyBkZWZpbmUgU19CTEtTSVpFCTUxMgkvKiBCbG9jayBzaXplIGZvciBgc3RfYmxvY2tzJy4gICovCisjZW5kaWYKKworCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKy8qIEdldCBmaWxlIGF0dHJpYnV0ZXMgZm9yIEZJTEUgYW5kIHB1dCB0aGVtIGluIEJVRi4gICovCitleHRlcm4gaW50IHN0YXQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZpbGUsCisJCSBzdHJ1Y3Qgc3RhdCAqX19yZXN0cmljdCBfX2J1ZikgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIEdldCBmaWxlIGF0dHJpYnV0ZXMgZm9yIHRoZSBmaWxlLCBkZXZpY2UsIHBpcGUsIG9yIHNvY2tldAorICAgdGhhdCBmaWxlIGRlc2NyaXB0b3IgRkQgaXMgb3BlbiBvbiBhbmQgcHV0IHRoZW0gaW4gQlVGLiAgKi8KK2V4dGVybiBpbnQgZnN0YXQgKGludCBfX2ZkLCBzdHJ1Y3Qgc3RhdCAqX19idWYpIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHN0YXQsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkJCSAgc3RydWN0IHN0YXQgKl9fcmVzdHJpY3QgX19idWYpLCBzdGF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDEsIDIpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGZzdGF0LCAoaW50IF9fZmQsIHN0cnVjdCBzdGF0ICpfX2J1ZiksIGZzdGF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKKyMgZWxzZQorIyAgZGVmaW5lIHN0YXQgc3RhdDY0CisjICBkZWZpbmUgZnN0YXQgZnN0YXQ2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgc3RhdDY0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICBzdHJ1Y3Qgc3RhdDY0ICpfX3Jlc3RyaWN0IF9fYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKK2V4dGVybiBpbnQgZnN0YXQ2NCAoaW50IF9fZmQsIHN0cnVjdCBzdGF0NjQgKl9fYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBTaW1pbGFyIHRvIHN0YXQsIGdldCB0aGUgYXR0cmlidXRlcyBmb3IgRklMRSBhbmQgcHV0IHRoZW0gaW4gQlVGLgorICAgUmVsYXRpdmUgcGF0aCBuYW1lcyBhcmUgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gRkQgdW5sZXNzIEZEIGlzCisgICBBVF9GRENXRC4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGZzdGF0YXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICAgc3RydWN0IHN0YXQgKl9fcmVzdHJpY3QgX19idWYsIGludCBfX2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZnN0YXRhdCwgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkJCSAgICAgc3RydWN0IHN0YXQgKl9fcmVzdHJpY3QgX19idWYsCisJCQkJICAgICBpbnQgX19mbGFnKSwKKwkJCSAgIGZzdGF0YXQ2NCkgX19ub25udWxsICgoMiwgMykpOworIyAgZWxzZQorIyAgIGRlZmluZSBmc3RhdGF0IGZzdGF0YXQ2NAorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBmc3RhdGF0NjQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICAgICBzdHJ1Y3Qgc3RhdDY0ICpfX3Jlc3RyaWN0IF9fYnVmLCBpbnQgX19mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKy8qIEdldCBmaWxlIGF0dHJpYnV0ZXMgYWJvdXQgRklMRSBhbmQgcHV0IHRoZW0gaW4gQlVGLgorICAgSWYgRklMRSBpcyBhIHN5bWJvbGljIGxpbmssIGRvIG5vdCBmb2xsb3cgaXQuICAqLworZXh0ZXJuIGludCBsc3RhdCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICBzdHJ1Y3Qgc3RhdCAqX19yZXN0cmljdCBfX2J1ZikgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChsc3RhdCwKKwkJCSAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkJICAgIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0IF9fYnVmKSwgbHN0YXQ2NCkKKyAgICAgX19ub25udWxsICgoMSwgMikpOworIyAgZWxzZQorIyAgIGRlZmluZSBsc3RhdCBsc3RhdDY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBsc3RhdDY0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICAgc3RydWN0IHN0YXQ2NCAqX19yZXN0cmljdCBfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVuZGlmCisjZW5kaWYKKworLyogU2V0IGZpbGUgYWNjZXNzIHBlcm1pc3Npb25zIGZvciBGSUxFIHRvIE1PREUuCisgICBJZiBGSUxFIGlzIGEgc3ltYm9saWMgbGluaywgdGhpcyBhZmZlY3RzIGl0cyB0YXJnZXQgaW5zdGVhZC4gICovCitleHRlcm4gaW50IGNobW9kIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19tb2RlX3QgX19tb2RlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0JTRAorLyogU2V0IGZpbGUgYWNjZXNzIHBlcm1pc3Npb25zIGZvciBGSUxFIHRvIE1PREUuCisgICBJZiBGSUxFIGlzIGEgc3ltYm9saWMgbGluaywgdGhpcyBhZmZlY3RzIHRoZSBsaW5rIGl0c2VsZgorICAgcmF0aGVyIHRoYW4gaXRzIHRhcmdldC4gICovCitleHRlcm4gaW50IGxjaG1vZCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fbW9kZV90IF9fbW9kZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworLyogU2V0IGZpbGUgYWNjZXNzIHBlcm1pc3Npb25zIG9mIHRoZSBmaWxlIEZEIGlzIG9wZW4gb24gdG8gTU9ERS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CitleHRlcm4gaW50IGZjaG1vZCAoaW50IF9fZmQsIF9fbW9kZV90IF9fbW9kZSkgX19USFJPVzsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBTZXQgZmlsZSBhY2Nlc3MgcGVybWlzc2lvbnMgb2YgRklMRSByZWxhdGl2ZSB0bworICAgdGhlIGRpcmVjdG9yeSBGRCBpcyBvcGVuIG9uLiAgKi8KK2V4dGVybiBpbnQgZmNobW9kYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19tb2RlX3QgX19tb2RlLAorCQkgICAgIGludCBfX2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpIF9fd3VyOworI2VuZGlmIC8qIFVzZSBBVEZJTEUuICAqLworCisKKworLyogU2V0IHRoZSBmaWxlIGNyZWF0aW9uIG1hc2sgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyB0byBNQVNLLAorICAgYW5kIHJldHVybiB0aGUgb2xkIGNyZWF0aW9uIG1hc2suICAqLworZXh0ZXJuIF9fbW9kZV90IHVtYXNrIChfX21vZGVfdCBfX21hc2spIF9fVEhST1c7CisKKyNpZmRlZglfX1VTRV9HTlUKKy8qIEdldCB0aGUgY3VycmVudCBgdW1hc2snIHZhbHVlIHdpdGhvdXQgY2hhbmdpbmcgaXQuCisgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgSHVyZC4gICovCitleHRlcm4gX19tb2RlX3QgZ2V0dW1hc2sgKHZvaWQpIF9fVEhST1c7CisjZW5kaWYKKworLyogQ3JlYXRlIGEgbmV3IGRpcmVjdG9yeSBuYW1lZCBQQVRILCB3aXRoIHBlcm1pc3Npb24gYml0cyBNT0RFLiAgKi8KK2V4dGVybiBpbnQgbWtkaXIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBMaWtlIG1rZGlyLCBjcmVhdGUgYSBuZXcgZGlyZWN0b3J5IHdpdGggcGVybWlzc2lvbiBiaXRzIE1PREUuICBCdXQKKyAgIGludGVycHJldCByZWxhdGl2ZSBQQVRIIG5hbWVzIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgYXNzb2NpYXRlZAorICAgd2l0aCBGRC4gICovCitleHRlcm4gaW50IG1rZGlyYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCisvKiBDcmVhdGUgYSBkZXZpY2UgZmlsZSBuYW1lZCBQQVRILCB3aXRoIHBlcm1pc3Npb24gYW5kIHNwZWNpYWwgYml0cyBNT0RFCisgICBhbmQgZGV2aWNlIG51bWJlciBERVYgKHdoaWNoIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIG1ham9yIGFuZCBtaW5vcgorICAgZGV2aWNlIG51bWJlcnMgd2l0aCB0aGUgYG1ha2VkZXYnIG1hY3JvIGFib3ZlKS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKK2V4dGVybiBpbnQgbWtub2QgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUsIF9fZGV2X3QgX19kZXYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjIGlmZGVmIF9fVVNFX0FURklMRQorLyogTGlrZSBta25vZCwgY3JlYXRlIGEgbmV3IGRldmljZSBmaWxlIHdpdGggcGVybWlzc2lvbiBiaXRzIE1PREUgYW5kCisgICBkZXZpY2UgbnVtYmVyIERFVi4gIEJ1dCBpbnRlcnByZXQgcmVsYXRpdmUgUEFUSCBuYW1lcyByZWxhdGl2ZSB0bworICAgdGhlIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggRkQuICAqLworZXh0ZXJuIGludCBta25vZGF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsIF9fbW9kZV90IF9fbW9kZSwKKwkJICAgIF9fZGV2X3QgX19kZXYpIF9fVEhST1cgX19ub25udWxsICgoMikpOworIyBlbmRpZgorI2VuZGlmCisKKworLyogQ3JlYXRlIGEgbmV3IEZJRk8gbmFtZWQgUEFUSCwgd2l0aCBwZXJtaXNzaW9uIGJpdHMgTU9ERS4gICovCitleHRlcm4gaW50IG1rZmlmbyAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fbW9kZV90IF9fbW9kZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIExpa2UgbWtmaWZvLCBjcmVhdGUgYSBuZXcgRklGTyB3aXRoIHBlcm1pc3Npb24gYml0cyBNT0RFLiAgQnV0CisgICBpbnRlcnByZXQgcmVsYXRpdmUgUEFUSCBuYW1lcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGFzc29jaWF0ZWQKKyAgIHdpdGggRkQuICAqLworZXh0ZXJuIGludCBta2ZpZm9hdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisMCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBTZXQgZmlsZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0aW1lcyByZWxhdGl2ZSB0byBkaXJlY3RvcnkgZmlsZQorICAgZGVzY3JpcHRvci4gICovCitleHRlcm4gaW50IHV0aW1lbnNhdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLAorCQkgICAgICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3RpbWVzWzJdLAorCQkgICAgICBpbnQgX19mbGFncykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBTZXQgZmlsZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0aW1lcyBvZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggRkQuICAqLworZXh0ZXJuIGludCBmdXRpbWVucyAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjIF9fdGltZXNbMl0pIF9fVEhST1c7CisjZW5kaWYKKwwKKy8qIFRvIGFsbG93IHRoZSBgc3RydWN0IHN0YXQnIHN0cnVjdHVyZSBhbmQgdGhlIGZpbGUgdHlwZSBgbW9kZV90JworICAgYml0cyB0byB2YXJ5IHdpdGhvdXQgY2hhbmdpbmcgc2hhcmVkIGxpYnJhcnkgbWFqb3IgdmVyc2lvbiBudW1iZXIsCisgICB0aGUgYHN0YXQnIGZhbWlseSBvZiBmdW5jdGlvbnMgYW5kIGBta25vZCcgYXJlIGluIGZhY3QgaW5saW5lCisgICB3cmFwcGVycyBhcm91bmQgY2FsbHMgdG8gYHhzdGF0JywgYGZ4c3RhdCcsIGBseHN0YXQnLCBhbmQgYHhta25vZCcsCisgICB3aGljaCBhbGwgdGFrZSBhIGxlYWRpbmcgdmVyc2lvbi1udW1iZXIgYXJndW1lbnQgZGVzaWduYXRpbmcgdGhlCisgICBkYXRhIHN0cnVjdHVyZSBhbmQgYml0cyB1c2VkLiAgPGJpdHMvc3RhdC5oPiBkZWZpbmVzIF9TVEFUX1ZFUiB3aXRoCisgICB0aGUgdmVyc2lvbiBudW1iZXIgY29ycmVzcG9uZGluZyB0byBgc3RydWN0IHN0YXQnIGFzIGRlZmluZWQgaW4KKyAgIHRoYXQgZmlsZTsgYW5kIF9NS05PRF9WRVIgd2l0aCB0aGUgdmVyc2lvbiBudW1iZXIgY29ycmVzcG9uZGluZyB0bworICAgdGhlIFNfSUYqIG1hY3JvcyBkZWZpbmVkIHRoZXJlaW4uICBJdCBpcyBhcnJhbmdlZCB0aGF0IHdoZW4gbm90CisgICBpbmxpbmVkIHRoZXNlIGZ1bmN0aW9uIGFyZSBhbHdheXMgc3RhdGljYWxseSBsaW5rZWQ7IHRoYXQgd2F5IGEKKyAgIGR5bmFtaWNhbGx5LWxpbmtlZCBleGVjdXRhYmxlIGFsd2F5cyBlbmNvZGVzIHRoZSB2ZXJzaW9uIG51bWJlcgorICAgY29ycmVzcG9uZGluZyB0byB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGl0IHVzZXMsIHNvIHRoZSBgeCcgZnVuY3Rpb25zCisgICBpbiB0aGUgc2hhcmVkIGxpYnJhcnkgY2FuIGFkYXB0IHdpdGhvdXQgbmVlZGluZyB0byByZWNvbXBpbGUgYWxsCisgICBjYWxsZXJzLiAgKi8KKworI2lmbmRlZiBfU1RBVF9WRVIKKyMgZGVmaW5lIF9TVEFUX1ZFUgkwCisjZW5kaWYKKyNpZm5kZWYgX01LTk9EX1ZFUgorIyBkZWZpbmUgX01LTk9EX1ZFUgkwCisjZW5kaWYKKworLyogV3JhcHBlcnMgZm9yIHN0YXQgYW5kIG1rbm9kIHN5c3RlbSBjYWxscy4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgX19meHN0YXQgKGludCBfX3ZlciwgaW50IF9fZmlsZGVzLCBzdHJ1Y3Qgc3RhdCAqX19zdGF0X2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzKSk7CitleHRlcm4gaW50IF9feHN0YXQgKGludCBfX3ZlciwgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX2x4c3RhdCAoaW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCSAgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX2Z4c3RhdGF0IChpbnQgX192ZXIsIGludCBfX2ZpbGRlcywgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkgICAgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYsIGludCBfX2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMywgNCkpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZnhzdGF0LCAoaW50IF9fdmVyLCBpbnQgX19maWxkZXMsCisJCQkJICAgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpLCBfX2Z4c3RhdDY0KQorICAgICBfX25vbm51bGwgKCgzKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3hzdGF0LCAoaW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCQkJICAgICBzdHJ1Y3Qgc3RhdCAqX19zdGF0X2J1ZiksIF9feHN0YXQ2NCkKKyAgICAgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19seHN0YXQsIChpbnQgX192ZXIsIF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJCQkgICAgICBzdHJ1Y3Qgc3RhdCAqX19zdGF0X2J1ZiksIF9fbHhzdGF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDIsIDMpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZnhzdGF0YXQsIChpbnQgX192ZXIsIGludCBfX2ZpbGRlcywKKwkJCQkJX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkJCQlzdHJ1Y3Qgc3RhdCAqX19zdGF0X2J1ZiwgaW50IF9fZmxhZyksCisJCQkgICBfX2Z4c3RhdGF0NjQpIF9fbm9ubnVsbCAoKDMsIDQpKTsKKworIyBlbHNlCisjICBkZWZpbmUgX19meHN0YXQgX19meHN0YXQ2NAorIyAgZGVmaW5lIF9feHN0YXQgX194c3RhdDY0CisjICBkZWZpbmUgX19seHN0YXQgX19seHN0YXQ2NAorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBfX2Z4c3RhdDY0IChpbnQgX192ZXIsIGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXQ2NCAqX19zdGF0X2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzKSk7CitleHRlcm4gaW50IF9feHN0YXQ2NCAoaW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCSAgICAgIHN0cnVjdCBzdGF0NjQgKl9fc3RhdF9idWYpIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX2x4c3RhdDY0IChpbnQgX192ZXIsIF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJICAgICAgIHN0cnVjdCBzdGF0NjQgKl9fc3RhdF9idWYpIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX2Z4c3RhdGF0NjQgKGludCBfX3ZlciwgaW50IF9fZmlsZGVzLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCQkgc3RydWN0IHN0YXQ2NCAqX19zdGF0X2J1ZiwgaW50IF9fZmxhZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzLCA0KSk7CisjZW5kaWYKK2V4dGVybiBpbnQgX194bWtub2QgKGludCBfX3ZlciwgX19jb25zdCBjaGFyICpfX3BhdGgsIF9fbW9kZV90IF9fbW9kZSwKKwkJICAgICBfX2Rldl90ICpfX2RldikgX19USFJPVyBfX25vbm51bGwgKCgyLCA0KSk7CisKK2V4dGVybiBpbnQgX194bWtub2RhdCAoaW50IF9fdmVyLCBpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsCisJCSAgICAgICBfX21vZGVfdCBfX21vZGUsIF9fZGV2X3QgKl9fZGV2KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDMsIDUpKTsKKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMiAmJiBkZWZpbmVkIF9fVVNFX0VYVEVSTl9JTkxJTkVTX0lOX0xJQkMKKy8qIElubGluZWQgdmVyc2lvbnMgb2YgdGhlIHJlYWwgc3RhdCBhbmQgbWtub2QgZnVuY3Rpb25zLiAgKi8KKworX19leHRlcm5faW5saW5lIGludAorX19OVEggKHN0YXQgKF9fY29uc3QgY2hhciAqX19wYXRoLCBzdHJ1Y3Qgc3RhdCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9feHN0YXQgKF9TVEFUX1ZFUiwgX19wYXRoLCBfX3N0YXRidWYpOworfQorCisjIGlmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChsc3RhdCAoX19jb25zdCBjaGFyICpfX3BhdGgsIHN0cnVjdCBzdGF0ICpfX3N0YXRidWYpKQoreworICByZXR1cm4gX19seHN0YXQgKF9TVEFUX1ZFUiwgX19wYXRoLCBfX3N0YXRidWYpOworfQorIyBlbmRpZgorCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAoZnN0YXQgKGludCBfX2ZkLCBzdHJ1Y3Qgc3RhdCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9fZnhzdGF0IChfU1RBVF9WRVIsIF9fZmQsIF9fc3RhdGJ1Zik7Cit9CisKKyMgaWZkZWYgX19VU0VfQVRGSUxFCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAoZnN0YXRhdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwgc3RydWN0IHN0YXQgKl9fc3RhdGJ1ZiwKKwkJaW50IF9fZmxhZykpCit7CisgIHJldHVybiBfX2Z4c3RhdGF0IChfU1RBVF9WRVIsIF9fZmQsIF9fZmlsZW5hbWUsIF9fc3RhdGJ1ZiwgX19mbGFnKTsKK30KKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9CU0QKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChta25vZCAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fbW9kZV90IF9fbW9kZSwgX19kZXZfdCBfX2RldikpCit7CisgIHJldHVybiBfX3hta25vZCAoX01LTk9EX1ZFUiwgX19wYXRoLCBfX21vZGUsICZfX2Rldik7Cit9CisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfQVRGSUxFCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAobWtub2RhdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUsCisJCV9fZGV2X3QgX19kZXYpKQoreworICByZXR1cm4gX194bWtub2RhdCAoX01LTk9EX1ZFUiwgX19mZCwgX19wYXRoLCBfX21vZGUsICZfX2Rldik7Cit9CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9MQVJHRUZJTEU2NCBcCisgICYmICghIGRlZmluZWQgX19VU0VfRklMRV9PRkZTRVQ2NCBcCisgICAgICB8fCAoZGVmaW5lZCBfX1JFRElSRUNUX05USCAmJiBkZWZpbmVkIF9fT1BUSU1JWkVfXykpCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAoc3RhdDY0IChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgc3RydWN0IHN0YXQ2NCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9feHN0YXQ2NCAoX1NUQVRfVkVSLCBfX3BhdGgsIF9fc3RhdGJ1Zik7Cit9CisKKyMgIGlmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChsc3RhdDY0IChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgc3RydWN0IHN0YXQ2NCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9fbHhzdGF0NjQgKF9TVEFUX1ZFUiwgX19wYXRoLCBfX3N0YXRidWYpOworfQorIyAgZW5kaWYKKworX19leHRlcm5faW5saW5lIGludAorX19OVEggKGZzdGF0NjQgKGludCBfX2ZkLCBzdHJ1Y3Qgc3RhdDY0ICpfX3N0YXRidWYpKQoreworICByZXR1cm4gX19meHN0YXQ2NCAoX1NUQVRfVkVSLCBfX2ZkLCBfX3N0YXRidWYpOworfQorCisjICBpZmRlZiBfX1VTRV9BVEZJTEUKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChmc3RhdGF0NjQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsIHN0cnVjdCBzdGF0NjQgKl9fc3RhdGJ1ZiwKKwkJICBpbnQgX19mbGFnKSkKK3sKKyAgcmV0dXJuIF9fZnhzdGF0YXQ2NCAoX1NUQVRfVkVSLCBfX2ZkLCBfX2ZpbGVuYW1lLCBfX3N0YXRidWYsIF9fZmxhZyk7Cit9CisjICBlbmRpZgorCisjIGVuZGlmCisKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBzeXMvc3RhdC5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3RhdGZzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zdGF0ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjIyMjZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3RhdGZzLmgKQEAgLTAsMCArMSw2OCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlc3lzdGVtLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfU1RBVEZTX0gKKyNkZWZpbmUJX1NZU19TVEFURlNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgdGhlIHN5c3RlbS1zcGVjaWZpYyBkZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgc3RhdGZzJy4gICovCisjaW5jbHVkZSA8Yml0cy9zdGF0ZnMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGVzeXN0ZW0gb24gd2hpY2ggRklMRSByZXNpZGVzLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBzdGF0ZnMgKF9fY29uc3QgY2hhciAqX19maWxlLCBzdHJ1Y3Qgc3RhdGZzICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoc3RhdGZzLAorCQkJICAgKF9fY29uc3QgY2hhciAqX19maWxlLCBzdHJ1Y3Qgc3RhdGZzICpfX2J1ZiksCisJCQkgICBzdGF0ZnM2NCkgX19ub25udWxsICgoMSwgMikpOworIyBlbHNlCisjICBkZWZpbmUgc3RhdGZzIHN0YXRmczY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBzdGF0ZnM2NCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIHN0cnVjdCBzdGF0ZnM2NCAqX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworI2VuZGlmCisKKy8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZXN5c3RlbSBjb250YWluaW5nIHRoZSBmaWxlIEZJTERFUworICAgcmVmZXJzIHRvLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBmc3RhdGZzIChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0ZnMgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChmc3RhdGZzLCAoaW50IF9fZmlsZGVzLCBzdHJ1Y3Qgc3RhdGZzICpfX2J1ZiksCisJCQkgICBmc3RhdGZzNjQpIF9fbm9ubnVsbCAoKDIpKTsKKyMgZWxzZQorIyAgZGVmaW5lIGZzdGF0ZnMgZnN0YXRmczY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBmc3RhdGZzNjQgKGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXRmczY0ICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy9zdGF0ZnMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3RhdHZmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3RhdHZmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTY2MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zdGF0dmZzLmgKQEAgLTAsMCArMSw5MSBAQAorLyogRGVmaW5pdGlvbnMgZm9yIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlc3lzdGVtLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfU1RBVFZGU19ICisjZGVmaW5lCV9TWVNfU1RBVFZGU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCB0aGUgc3lzdGVtLXNwZWNpZmljIGRlZmluaXRpb24gb2YgYHN0cnVjdCBzdGF0ZnMnLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3N0YXR2ZnMuaD4KKworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisjIGlmbmRlZiBfX2ZzYmxrY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2ZzYmxrY250X3QgZnNibGtjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBibG9ja3MuICAqLworIyAgZGVmaW5lIF9fZnNibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmbmRlZiBfX2ZzZmlsY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2ZzZmlsY250X3QgZnNmaWxjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBpbm9kZXMuICAqLworIyAgZGVmaW5lIF9fZnNmaWxjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjZWxzZQorIyBpZm5kZWYgX19mc2Jsa2NudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2Jsa2NudDY0X3QgZnNibGtjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBibG9ja3MuICAqLworIyAgZGVmaW5lIF9fZnNibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmbmRlZiBfX2ZzZmlsY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2ZzZmlsY250NjRfdCBmc2ZpbGNudF90OyAvKiBUeXBlIHRvIGNvdW50IGZpbGUgc3lzdGVtIGlub2Rlcy4gICovCisjICBkZWZpbmUgX19mc2ZpbGNudF90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZXN5c3RlbSBvbiB3aGljaCBGSUxFIHJlc2lkZXMuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHN0YXR2ZnMgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZpbGUsCisJCSAgICBzdHJ1Y3Qgc3RhdHZmcyAqX19yZXN0cmljdCBfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoc3RhdHZmcywKKwkJCSAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkJICAgIHN0cnVjdCBzdGF0dmZzICpfX3Jlc3RyaWN0IF9fYnVmKSwgc3RhdHZmczY0KQorICAgICBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVsc2UKKyMgIGRlZmluZSBzdGF0dmZzIHN0YXR2ZnM2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgc3RhdHZmczY0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICAgICBzdHJ1Y3Qgc3RhdHZmczY0ICpfX3Jlc3RyaWN0IF9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZgorCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGVzeXN0ZW0gY29udGFpbmluZyB0aGUgZmlsZSBGSUxERVMKKyAgIHJlZmVycyB0by4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgZnN0YXR2ZnMgKGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXR2ZnMgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChmc3RhdHZmcywgKGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXR2ZnMgKl9fYnVmKSwKKwkJCSAgIGZzdGF0dmZzNjQpIF9fbm9ubnVsbCAoKDIpKTsKKyMgZWxzZQorIyAgZGVmaW5lIGZzdGF0dmZzIGZzdGF0dmZzNjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IGZzdGF0dmZzNjQgKGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXR2ZnM2NCAqX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvc3RhdHZmcy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zdHJvcHRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zdHJvcHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1YmMwMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N0cm9wdHMuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8c3Ryb3B0cy5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3dhcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3dhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MTAwNmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zd2FwLmgKQEAgLTAsMCArMSw0NCBAQAorLyogQ2FsbHMgdG8gZW5hYmxlIGFuZCBkaXNhYmxlIHN3YXBwaW5nIG9uIHNwZWNpZmllZCBsb2NhdGlvbnMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAxOTk5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1dBUF9ICisKKyNkZWZpbmUgX1NZU19TV0FQX0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIFRoZSBzd2FwIHByaW9yaXR5IGlzIGVuY29kZWQgYXM6CisgICAocHJpbyA8PCBTV0FQX0ZMQUdfUFJJT19TSElGVCkgJiBTV0FQX0ZMQUdfUFJJT19NQVNLCisqLworI2RlZmluZQlTV0FQX0ZMQUdfUFJFRkVSCTB4ODAwMAkvKiBTZXQgaWYgc3dhcCBwcmlvcml0eSBpcyBzcGVjaWZpZWQuICovCisjZGVmaW5lCVNXQVBfRkxBR19QUklPX01BU0sJMHg3ZmZmCisjZGVmaW5lCVNXQVBfRkxBR19QUklPX1NISUZUCTAKKyNkZWZpbmUgU1dBUF9GTEFHX0RJU0NBUkQJMHgxMDAwMAkvKiBEaXNjYXJkIHN3YXAgY2x1c3RlciBhZnRlciB1c2UuICAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIE1ha2UgdGhlIGJsb2NrIHNwZWNpYWwgZGV2aWNlIFBBVEggYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0gZm9yIHN3YXBwaW5nLgorICAgVGhpcyBjYWxsIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHN1cGVyLXVzZXIuICAqLworZXh0ZXJuIGludCBzd2Fwb24gKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19mbGFncykgX19USFJPVzsKKworLyogU3RvcCB1c2luZyBibG9jayBzcGVjaWFsIGRldmljZSBQQVRIIGZvciBzd2FwcGluZy4gICovCitleHRlcm4gaW50IHN3YXBvZmYgKF9fY29uc3QgY2hhciAqX19wYXRoKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX1NZU19TV0FQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N5c2NhbGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmQ3MmQwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3lzY2FsbC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTQ0FMTF9ICisjZGVmaW5lIF9TWVNDQUxMX0gJMQorCisvKiBUaGlzIGZpbGUgc2hvdWxkIGxpc3QgdGhlIG51bWJlcnMgb2YgdGhlIHN5c3RlbSBjYWxscyB0aGUgc3lzdGVtIGtub3dzLgorICAgQnV0IGluc3RlYWQgb2YgZHVwbGljYXRpbmcgdGhpcyB3ZSB1c2UgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZQorICAgZnJvbSB0aGUga2VybmVsIHNvdXJjZXMuICAqLworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworI2lmbmRlZiBfTElCQworLyogVGhlIExpbnV4IGtlcm5lbCBoZWFkZXIgZmlsZSBkZWZpbmVzIG1hY3JvcyBgX19OUl88bmFtZT4nLCBidXQgc29tZQorICAgcHJvZ3JhbXMgZXhwZWN0IHRoZSB0cmFkaXRpb25hbCBmb3JtIGBTWVNfPG5hbWU+Jy4gIFNvIGluIGJ1aWxkaW5nIGxpYmMKKyAgIHdlIHNjYW4gdGhlIGtlcm5lbCdzIGxpc3QgYW5kIHByb2R1Y2UgPGJpdHMvc3lzY2FsbC5oPiB3aXRoIG1hY3JvcyBmb3IKKyAgIGFsbCB0aGUgYFNZU18nIG5hbWVzLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9zeXNjYWxsLmg+CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zeXNjdGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N5c2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMGVmYWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zeXNjdGwuaApAQCAtMCwwICsxLDcyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTksIDIwMDIsIDIwMDMsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19TWVNDVExfSAorI2RlZmluZQlfU1lTX1NZU0NUTF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKy8qIFByZXZlbnQgbW9yZSBrZXJuZWwgaGVhZGVycyB0aGFuIG5lY2Vzc2FyeSB0byBiZSBpbmNsdWRlZC4gICovCisjaWZuZGVmIF9MSU5VWF9LRVJORUxfSAorIyBkZWZpbmUgX0xJTlVYX0tFUk5FTF9ICTEKKyMgZGVmaW5lIF9fdW5kZWZfTElOVVhfS0VSTkVMX0gKKyNlbmRpZgorI2lmbmRlZiBfTElOVVhfVFlQRVNfSAorIyBkZWZpbmUgX0xJTlVYX1RZUEVTX0gJCTEKKyMgZGVmaW5lIF9fdW5kZWZfTElOVVhfVFlQRVNfSAorI2VuZGlmCisjaWZuZGVmIF9MSU5VWF9MSVNUX0gKKyMgZGVmaW5lIF9MSU5VWF9MSVNUX0gJCTEKKyMgZGVmaW5lIF9fdW5kZWZfTElOVVhfTElTVF9ICisjZW5kaWYKKyNpZm5kZWYgX19MSU5VWF9DT01QSUxFUl9ICisjIGRlZmluZSBfX0xJTlVYX0NPTVBJTEVSX0gJMQorIyBkZWZpbmUgX191c2VyCisjIGRlZmluZSBfX3VuZGVmX19MSU5VWF9DT01QSUxFUl9ICisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorCisjaWZkZWYgX191bmRlZl9MSU5VWF9LRVJORUxfSAorIyB1bmRlZiBfTElOVVhfS0VSTkVMX0gKKyMgdW5kZWYgX191bmRlZl9MSU5VWF9LRVJORUxfSAorI2VuZGlmCisjaWZkZWYgX191bmRlZl9MSU5VWF9UWVBFU19ICisjIHVuZGVmIF9MSU5VWF9UWVBFU19ICisjIHVuZGVmIF9fdW5kZWZfTElOVVhfVFlQRVNfSAorI2VuZGlmCisjaWZkZWYgX191bmRlZl9MSU5VWF9MSVNUX0gKKyMgdW5kZWYgX0xJTlVYX0xJU1RfSAorIyB1bmRlZiBfX3VuZGVmX0xJTlVYX0xJU1RfSAorI2VuZGlmCisjaWZkZWYgX191bmRlZl9fTElOVVhfQ09NUElMRVJfSAorIyB1bmRlZiBfX0xJTlVYX0NPTVBJTEVSX0gKKyMgdW5kZWYgX191c2VyCisjIHVuZGVmIF9fdW5kZWZfX0xJTlVYX0NPTVBJTEVSX0gKKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJlYWQgb3Igd3JpdGUgc3lzdGVtIHBhcmFtZXRlcnMuICAqLworZXh0ZXJuIGludCBzeXNjdGwgKGludCAqX19uYW1lLCBpbnQgX19ubGVuLCB2b2lkICpfX29sZHZhbCwKKwkJICAgc2l6ZV90ICpfX29sZGxlbnAsIHZvaWQgKl9fbmV3dmFsLCBzaXplX3QgX19uZXdsZW4pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBfU1lTX1NZU0NUTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zeXNpbmZvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zeXNpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY3MjdiMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N5c2luZm8uaApAQCAtMCwwICsxLDQ4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTksIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TWVNJTkZPX0gKKyNkZWZpbmUgX1NZU19TWVNJTkZPX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IHN5c2luZm8gc3RydWN0dXJlIGZyb20ga2VybmVsIGhlYWRlci4gICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogUmV0dXJucyBpbmZvcm1hdGlvbiBvbiBvdmVyYWxsIHN5c3RlbSBzdGF0aXN0aWNzLiAgKi8KK2V4dGVybiBpbnQgc3lzaW5mbyAoc3RydWN0IHN5c2luZm8gKl9faW5mbykgX19USFJPVzsKKworCisvKiBSZXR1cm4gbnVtYmVyIG9mIGNvbmZpZ3VyZWQgcHJvY2Vzc29ycy4gICovCitleHRlcm4gaW50IGdldF9ucHJvY3NfY29uZiAodm9pZCkgX19USFJPVzsKKworLyogUmV0dXJuIG51bWJlciBvZiBhdmFpbGFibGUgcHJvY2Vzc29ycy4gICovCitleHRlcm4gaW50IGdldF9ucHJvY3MgKHZvaWQpIF9fVEhST1c7CisKKworLyogUmV0dXJuIG51bWJlciBvZiBwaHlzaWNhbCBwYWdlcyBvZiBtZW1vcnkgaW4gdGhlIHN5c3RlbS4gICovCitleHRlcm4gbG9uZyBpbnQgZ2V0X3BoeXNfcGFnZXMgKHZvaWQpIF9fVEhST1c7CisKKy8qIFJldHVybiBudW1iZXIgb2YgYXZhaWxhYmxlIHBoeXNpY2FsIHBhZ2VzIG9mIG1lbW9yeSBpbiB0aGUgc3lzdGVtLiAgKi8KK2V4dGVybiBsb25nIGludCBnZXRfYXZwaHlzX3BhZ2VzICh2b2lkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3N5c2luZm8uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3lzbG9nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zeXNsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmRhMWNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3lzbG9nLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5ODgsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpc3lzbG9nLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfU1lTX1NZU0xPR19ICisjZGVmaW5lIF9TWVNfU1lTTE9HX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNkZWZpbmUgX19uZWVkX19fdmFfbGlzdAorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiBUaGlzIGZpbGUgZGVmaW5lcyBfUEFUSF9MT0cuICAqLworI2luY2x1ZGUgPGJpdHMvc3lzbG9nLXBhdGguaD4KKworLyoKKyAqIHByaW9yaXRpZXMvZmFjaWxpdGllcyBhcmUgZW5jb2RlZCBpbnRvIGEgc2luZ2xlIDMyLWJpdCBxdWFudGl0eSwgd2hlcmUgdGhlCisgKiBib3R0b20gMyBiaXRzIGFyZSB0aGUgcHJpb3JpdHkgKDAtNykgYW5kIHRoZSB0b3AgMjggYml0cyBhcmUgdGhlIGZhY2lsaXR5CisgKiAoMC1iaWcgbnVtYmVyKS4gIEJvdGggdGhlIHByaW9yaXRpZXMgYW5kIHRoZSBmYWNpbGl0aWVzIG1hcCByb3VnaGx5CisgKiBvbmUtdG8tb25lIHRvIHN0cmluZ3MgaW4gdGhlIHN5c2xvZ2QoOCkgc291cmNlIGNvZGUuICBUaGlzIG1hcHBpbmcgaXMKKyAqIGluY2x1ZGVkIGluIHRoaXMgZmlsZS4KKyAqCisgKiBwcmlvcml0aWVzICh0aGVzZSBhcmUgb3JkZXJlZCkKKyAqLworI2RlZmluZQlMT0dfRU1FUkcJMAkvKiBzeXN0ZW0gaXMgdW51c2FibGUgKi8KKyNkZWZpbmUJTE9HX0FMRVJUCTEJLyogYWN0aW9uIG11c3QgYmUgdGFrZW4gaW1tZWRpYXRlbHkgKi8KKyNkZWZpbmUJTE9HX0NSSVQJMgkvKiBjcml0aWNhbCBjb25kaXRpb25zICovCisjZGVmaW5lCUxPR19FUlIJCTMJLyogZXJyb3IgY29uZGl0aW9ucyAqLworI2RlZmluZQlMT0dfV0FSTklORwk0CS8qIHdhcm5pbmcgY29uZGl0aW9ucyAqLworI2RlZmluZQlMT0dfTk9USUNFCTUJLyogbm9ybWFsIGJ1dCBzaWduaWZpY2FudCBjb25kaXRpb24gKi8KKyNkZWZpbmUJTE9HX0lORk8JNgkvKiBpbmZvcm1hdGlvbmFsICovCisjZGVmaW5lCUxPR19ERUJVRwk3CS8qIGRlYnVnLWxldmVsIG1lc3NhZ2VzICovCisKKyNkZWZpbmUJTE9HX1BSSU1BU0sJMHgwNwkvKiBtYXNrIHRvIGV4dHJhY3QgcHJpb3JpdHkgcGFydCAoaW50ZXJuYWwpICovCisJCQkJLyogZXh0cmFjdCBwcmlvcml0eSAqLworI2RlZmluZQlMT0dfUFJJKHApCSgocCkgJiBMT0dfUFJJTUFTSykKKyNkZWZpbmUJTE9HX01BS0VQUkkoZmFjLCBwcmkpCSgoKGZhYykgPDwgMykgfCAocHJpKSkKKworI2lmZGVmIFNZU0xPR19OQU1FUworI2RlZmluZQlJTlRFUk5BTF9OT1BSSQkweDEwCS8qIHRoZSAibm8gcHJpb3JpdHkiIHByaW9yaXR5ICovCisJCQkJLyogbWFyayAiZmFjaWxpdHkiICovCisjZGVmaW5lCUlOVEVSTkFMX01BUksJTE9HX01BS0VQUkkoTE9HX05GQUNJTElUSUVTLCAwKQordHlwZWRlZiBzdHJ1Y3QgX2NvZGUgeworCWNoYXIJKmNfbmFtZTsKKwlpbnQJY192YWw7Cit9IENPREU7CisKK0NPREUgcHJpb3JpdHluYW1lc1tdID0KKyAgeworICAgIHsgImFsZXJ0IiwgTE9HX0FMRVJUIH0sCisgICAgeyAiY3JpdCIsIExPR19DUklUIH0sCisgICAgeyAiZGVidWciLCBMT0dfREVCVUcgfSwKKyAgICB7ICJlbWVyZyIsIExPR19FTUVSRyB9LAorICAgIHsgImVyciIsIExPR19FUlIgfSwKKyAgICB7ICJlcnJvciIsIExPR19FUlIgfSwJCS8qIERFUFJFQ0FURUQgKi8KKyAgICB7ICJpbmZvIiwgTE9HX0lORk8gfSwKKyAgICB7ICJub25lIiwgSU5URVJOQUxfTk9QUkkgfSwJCS8qIElOVEVSTkFMICovCisgICAgeyAibm90aWNlIiwgTE9HX05PVElDRSB9LAorICAgIHsgInBhbmljIiwgTE9HX0VNRVJHIH0sCQkvKiBERVBSRUNBVEVEICovCisgICAgeyAid2FybiIsIExPR19XQVJOSU5HIH0sCQkvKiBERVBSRUNBVEVEICovCisgICAgeyAid2FybmluZyIsIExPR19XQVJOSU5HIH0sCisgICAgeyBOVUxMLCAtMSB9CisgIH07CisjZW5kaWYKKworLyogZmFjaWxpdHkgY29kZXMgKi8KKyNkZWZpbmUJTE9HX0tFUk4JKDA8PDMpCS8qIGtlcm5lbCBtZXNzYWdlcyAqLworI2RlZmluZQlMT0dfVVNFUgkoMTw8MykJLyogcmFuZG9tIHVzZXItbGV2ZWwgbWVzc2FnZXMgKi8KKyNkZWZpbmUJTE9HX01BSUwJKDI8PDMpCS8qIG1haWwgc3lzdGVtICovCisjZGVmaW5lCUxPR19EQUVNT04JKDM8PDMpCS8qIHN5c3RlbSBkYWVtb25zICovCisjZGVmaW5lCUxPR19BVVRICSg0PDwzKQkvKiBzZWN1cml0eS9hdXRob3JpemF0aW9uIG1lc3NhZ2VzICovCisjZGVmaW5lCUxPR19TWVNMT0cJKDU8PDMpCS8qIG1lc3NhZ2VzIGdlbmVyYXRlZCBpbnRlcm5hbGx5IGJ5IHN5c2xvZ2QgKi8KKyNkZWZpbmUJTE9HX0xQUgkJKDY8PDMpCS8qIGxpbmUgcHJpbnRlciBzdWJzeXN0ZW0gKi8KKyNkZWZpbmUJTE9HX05FV1MJKDc8PDMpCS8qIG5ldHdvcmsgbmV3cyBzdWJzeXN0ZW0gKi8KKyNkZWZpbmUJTE9HX1VVQ1AJKDg8PDMpCS8qIFVVQ1Agc3Vic3lzdGVtICovCisjZGVmaW5lCUxPR19DUk9OCSg5PDwzKQkvKiBjbG9jayBkYWVtb24gKi8KKyNkZWZpbmUJTE9HX0FVVEhQUklWCSgxMDw8MykJLyogc2VjdXJpdHkvYXV0aG9yaXphdGlvbiBtZXNzYWdlcyAocHJpdmF0ZSkgKi8KKyNkZWZpbmUJTE9HX0ZUUAkJKDExPDwzKQkvKiBmdHAgZGFlbW9uICovCisKKwkvKiBvdGhlciBjb2RlcyB0aHJvdWdoIDE1IHJlc2VydmVkIGZvciBzeXN0ZW0gdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDAJKDE2PDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDEJKDE3PDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDIJKDE4PDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDMJKDE5PDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDQJKDIwPDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDUJKDIxPDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDYJKDIyPDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDcJKDIzPDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisKKyNkZWZpbmUJTE9HX05GQUNJTElUSUVTCTI0CS8qIGN1cnJlbnQgbnVtYmVyIG9mIGZhY2lsaXRpZXMgKi8KKyNkZWZpbmUJTE9HX0ZBQ01BU0sJMHgwM2Y4CS8qIG1hc2sgdG8gZXh0cmFjdCBmYWNpbGl0eSBwYXJ0ICovCisJCQkJLyogZmFjaWxpdHkgb2YgcHJpICovCisjZGVmaW5lCUxPR19GQUMocCkJKCgocCkgJiBMT0dfRkFDTUFTSykgPj4gMykKKworI2lmZGVmIFNZU0xPR19OQU1FUworQ09ERSBmYWNpbGl0eW5hbWVzW10gPQorICB7CisgICAgeyAiYXV0aCIsIExPR19BVVRIIH0sCisgICAgeyAiYXV0aHByaXYiLCBMT0dfQVVUSFBSSVYgfSwKKyAgICB7ICJjcm9uIiwgTE9HX0NST04gfSwKKyAgICB7ICJkYWVtb24iLCBMT0dfREFFTU9OIH0sCisgICAgeyAiZnRwIiwgTE9HX0ZUUCB9LAorICAgIHsgImtlcm4iLCBMT0dfS0VSTiB9LAorICAgIHsgImxwciIsIExPR19MUFIgfSwKKyAgICB7ICJtYWlsIiwgTE9HX01BSUwgfSwKKyAgICB7ICJtYXJrIiwgSU5URVJOQUxfTUFSSyB9LAkJLyogSU5URVJOQUwgKi8KKyAgICB7ICJuZXdzIiwgTE9HX05FV1MgfSwKKyAgICB7ICJzZWN1cml0eSIsIExPR19BVVRIIH0sCQkvKiBERVBSRUNBVEVEICovCisgICAgeyAic3lzbG9nIiwgTE9HX1NZU0xPRyB9LAorICAgIHsgInVzZXIiLCBMT0dfVVNFUiB9LAorICAgIHsgInV1Y3AiLCBMT0dfVVVDUCB9LAorICAgIHsgImxvY2FsMCIsIExPR19MT0NBTDAgfSwKKyAgICB7ICJsb2NhbDEiLCBMT0dfTE9DQUwxIH0sCisgICAgeyAibG9jYWwyIiwgTE9HX0xPQ0FMMiB9LAorICAgIHsgImxvY2FsMyIsIExPR19MT0NBTDMgfSwKKyAgICB7ICJsb2NhbDQiLCBMT0dfTE9DQUw0IH0sCisgICAgeyAibG9jYWw1IiwgTE9HX0xPQ0FMNSB9LAorICAgIHsgImxvY2FsNiIsIExPR19MT0NBTDYgfSwKKyAgICB7ICJsb2NhbDciLCBMT0dfTE9DQUw3IH0sCisgICAgeyBOVUxMLCAtMSB9CisgIH07CisjZW5kaWYKKworLyoKKyAqIGFyZ3VtZW50cyB0byBzZXRsb2dtYXNrLgorICovCisjZGVmaW5lCUxPR19NQVNLKHByaSkJKDEgPDwgKHByaSkpCQkvKiBtYXNrIGZvciBvbmUgcHJpb3JpdHkgKi8KKyNkZWZpbmUJTE9HX1VQVE8ocHJpKQkoKDEgPDwgKChwcmkpKzEpKSAtIDEpCS8qIGFsbCBwcmlvcml0aWVzIHRocm91Z2ggcHJpICovCisKKy8qCisgKiBPcHRpb24gZmxhZ3MgZm9yIG9wZW5sb2cuCisgKgorICogTE9HX09ERUxBWSBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4KKyAqIExPR19OREVMQVkgaXMgdGhlIGludmVyc2Ugb2Ygd2hhdCBpdCB1c2VkIHRvIGJlLgorICovCisjZGVmaW5lCUxPR19QSUQJCTB4MDEJLyogbG9nIHRoZSBwaWQgd2l0aCBlYWNoIG1lc3NhZ2UgKi8KKyNkZWZpbmUJTE9HX0NPTlMJMHgwMgkvKiBsb2cgb24gdGhlIGNvbnNvbGUgaWYgZXJyb3JzIGluIHNlbmRpbmcgKi8KKyNkZWZpbmUJTE9HX09ERUxBWQkweDA0CS8qIGRlbGF5IG9wZW4gdW50aWwgZmlyc3Qgc3lzbG9nKCkgKGRlZmF1bHQpICovCisjZGVmaW5lCUxPR19OREVMQVkJMHgwOAkvKiBkb24ndCBkZWxheSBvcGVuICovCisjZGVmaW5lCUxPR19OT1dBSVQJMHgxMAkvKiBkb24ndCB3YWl0IGZvciBjb25zb2xlIGZvcmtzOiBERVBSRUNBVEVEICovCisjZGVmaW5lCUxPR19QRVJST1IJMHgyMAkvKiBsb2cgdG8gc3RkZXJyIGFzIHdlbGwgKi8KKworX19CRUdJTl9ERUNMUworCisvKiBDbG9zZSBkZXNjcmlwdG9yIHVzZWQgdG8gd3JpdGUgdG8gc3lzdGVtIGxvZ2dlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBjbG9zZWxvZyAodm9pZCk7CisKKy8qIE9wZW4gY29ubmVjdGlvbiB0byBzeXN0ZW0gbG9nZ2VyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIG9wZW5sb2cgKF9fY29uc3QgY2hhciAqX19pZGVudCwgaW50IF9fb3B0aW9uLCBpbnQgX19mYWNpbGl0eSk7CisKKy8qIFNldCB0aGUgbG9nIG1hc2sgbGV2ZWwuICAqLworZXh0ZXJuIGludCBzZXRsb2dtYXNrIChpbnQgX19tYXNrKSBfX1RIUk9XOworCisvKiBHZW5lcmF0ZSBhIGxvZyBtZXNzYWdlIHVzaW5nIEZNVCBzdHJpbmcgYW5kIG9wdGlvbiBhcmd1bWVudHMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgc3lzbG9nIChpbnQgX19wcmksIF9fY29uc3QgY2hhciAqX19mbXQsIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDMpKSk7CisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIEdlbmVyYXRlIGEgbG9nIG1lc3NhZ2UgdXNpbmcgRk1UIGFuZCB1c2luZyBhcmd1bWVudHMgcG9pbnRlZCB0byBieSBBUC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgdnN5c2xvZyAoaW50IF9fcHJpLCBfX2NvbnN0IGNoYXIgKl9fZm10LCBfX2dudWNfdmFfbGlzdCBfX2FwKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMCkpKTsKKyNlbmRpZgorCisKKy8qIERlZmluZSBzb21lIG1hY3JvcyBoZWxwaW5nIHRvIGNhdGNoIGJ1ZmZlciBvdmVyZmxvd3MuICAqLworI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZQorIyBpbmNsdWRlIDxiaXRzL3N5c2xvZy5oPgorI2VuZGlmCisjaWZkZWYgX19MREJMX0NPTVBBVAorIyBpbmNsdWRlIDxiaXRzL3N5c2xvZy1sZGJsLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9zeXNsb2cuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3lzbWFjcm9zLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zeXNtYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjAwYzkzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3lzbWFjcm9zLmgKQEAgLTAsMCArMSw3MiBAQAorLyogRGVmaW5pdGlvbnMgb2YgbWFjcm9zIHRvIGFjY2VzcyBgZGV2X3QnIHZhbHVlcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMywgMjAwNCwgMjAwNywgMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TWVNNQUNST1NfSAorI2RlZmluZSBfU1lTX1NZU01BQ1JPU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIElmIHRoZSBjb21waWxlciBkb2VzIG5vdCBrbm93IGxvbmcgbG9uZyBpdCBpcyBvdXQgb2YgbHVjay4gIFdlIGFyZQorICAgbm90IGdvaW5nIHRvIGhhY2sgd2VpcmQgaGFja3MgdG8gc3VwcG9ydCB0aGUgZGV2X3QgcmVwcmVzZW50YXRpb24KKyAgIHRoZXkgbmVlZC4gICovCisjaWZkZWYgX19HTElCQ19IQVZFX0xPTkdfTE9ORworX19CRUdJTl9ERUNMUworCitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgaW50IGdudV9kZXZfbWFqb3IgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19kZXYpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfY29uc3RfXzsKK19fZXh0ZW5zaW9uX18KK2V4dGVybiB1bnNpZ25lZCBpbnQgZ251X2Rldl9taW5vciAodW5zaWduZWQgbG9uZyBsb25nIGludCBfX2RldikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9jb25zdF9fOworX19leHRlbnNpb25fXworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgZ251X2Rldl9tYWtlZGV2ICh1bnNpZ25lZCBpbnQgX19tYWpvciwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBfX21pbm9yKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2NvbnN0X187CisKKyMgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyICYmIGRlZmluZWQgX19VU0VfRVhURVJOX0lOTElORVMKK19fZXh0ZW5zaW9uX18gX19leHRlcm5faW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gdW5zaWduZWQgaW50CitfX05USCAoZ251X2Rldl9tYWpvciAodW5zaWduZWQgbG9uZyBsb25nIGludCBfX2RldikpCit7CisgIHJldHVybiAoKF9fZGV2ID4+IDgpICYgMHhmZmYpIHwgKCh1bnNpZ25lZCBpbnQpIChfX2RldiA+PiAzMikgJiB+MHhmZmYpOworfQorCitfX2V4dGVuc2lvbl9fIF9fZXh0ZXJuX2lubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIHVuc2lnbmVkIGludAorX19OVEggKGdudV9kZXZfbWlub3IgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19kZXYpKQoreworICByZXR1cm4gKF9fZGV2ICYgMHhmZikgfCAoKHVuc2lnbmVkIGludCkgKF9fZGV2ID4+IDEyKSAmIH4weGZmKTsKK30KKworX19leHRlbnNpb25fXyBfX2V4dGVybl9pbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyB1bnNpZ25lZCBsb25nIGxvbmcgaW50CitfX05USCAoZ251X2Rldl9tYWtlZGV2ICh1bnNpZ25lZCBpbnQgX19tYWpvciwgdW5zaWduZWQgaW50IF9fbWlub3IpKQoreworICByZXR1cm4gKChfX21pbm9yICYgMHhmZikgfCAoKF9fbWFqb3IgJiAweGZmZikgPDwgOCkKKwkgIHwgKCgodW5zaWduZWQgbG9uZyBsb25nIGludCkgKF9fbWlub3IgJiB+MHhmZikpIDw8IDEyKQorCSAgfCAoKCh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSAoX19tYWpvciAmIH4weGZmZikpIDw8IDMyKSk7Cit9CisjIGVuZGlmCitfX0VORF9ERUNMUworCisvKiBBY2Nlc3MgdGhlIGZ1bmN0aW9ucyB3aXRoIHRoZWlyIHRyYWRpdGlvbmFsIG5hbWVzLiAgKi8KKyMgZGVmaW5lIG1ham9yKGRldikgZ251X2Rldl9tYWpvciAoZGV2KQorIyBkZWZpbmUgbWlub3IoZGV2KSBnbnVfZGV2X21pbm9yIChkZXYpCisjIGRlZmluZSBtYWtlZGV2KG1haiwgbWluKSBnbnVfZGV2X21ha2VkZXYgKG1haiwgbWluKQorI2VuZGlmCisKKyNlbmRpZiAvKiBzeXMvc3lzbWFjcm9zLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Rlcm1pb3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Rlcm1pb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTE4ODA1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGVybWlvcy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfU1lTX1RFUk1JT1NfSAorI2RlZmluZSBfU1lTX1RFUk1JT1NfSAorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGltZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZWNmNjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90aW1lLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTk0LDE5OTYtMjAwMywyMDA1LDIwMDYsMjAwOQorCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVElNRV9ICisjZGVmaW5lIF9TWVNfVElNRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisjZGVmaW5lIF9fbmVlZF90aW1lX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisjZGVmaW5lIF9fbmVlZF90aW1ldmFsCisjaW5jbHVkZSA8Yml0cy90aW1lLmg+CisKKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisKKyNpZm5kZWYgX19zdXNlY29uZHNfdF9kZWZpbmVkCit0eXBlZGVmIF9fc3VzZWNvbmRzX3Qgc3VzZWNvbmRzX3Q7CisjIGRlZmluZSBfX3N1c2Vjb25kc190X2RlZmluZWQKKyNlbmRpZgorCisKK19fQkVHSU5fREVDTFMKKworI2lmZGVmIF9fVVNFX0dOVQorLyogTWFjcm9zIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gYHN0cnVjdCB0aW1ldmFsJyBhbmQgYHN0cnVjdCB0aW1lc3BlYycuICAqLworIyBkZWZpbmUgVElNRVZBTF9UT19USU1FU1BFQyh0diwgdHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHRzKS0+dHZfc2VjID0gKHR2KS0+dHZfc2VjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHRzKS0+dHZfbnNlYyA9ICh0diktPnR2X3VzZWMgKiAxMDAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyMgZGVmaW5lIFRJTUVTUEVDX1RPX1RJTUVWQUwodHYsIHRzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh0diktPnR2X3NlYyA9ICh0cyktPnR2X3NlYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh0diktPnR2X3VzZWMgPSAodHMpLT50dl9uc2VjIC8gMTAwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfQlNECisvKiBTdHJ1Y3R1cmUgY3J1ZGVseSByZXByZXNlbnRpbmcgYSB0aW1lem9uZS4KKyAgIFRoaXMgaXMgb2Jzb2xldGUgYW5kIHNob3VsZCBuZXZlciBiZSB1c2VkLiAgKi8KK3N0cnVjdCB0aW1lem9uZQorICB7CisgICAgaW50IHR6X21pbnV0ZXN3ZXN0OwkJLyogTWludXRlcyB3ZXN0IG9mIEdNVC4gICovCisgICAgaW50IHR6X2RzdHRpbWU7CQkvKiBOb256ZXJvIGlmIERTVCBpcyBldmVyIGluIGVmZmVjdC4gICovCisgIH07CisKK3R5cGVkZWYgc3RydWN0IHRpbWV6b25lICpfX3Jlc3RyaWN0IF9fdGltZXpvbmVfcHRyX3Q7CisjZWxzZQordHlwZWRlZiB2b2lkICpfX3Jlc3RyaWN0IF9fdGltZXpvbmVfcHRyX3Q7CisjZW5kaWYKKworLyogR2V0IHRoZSBjdXJyZW50IHRpbWUgb2YgZGF5IGFuZCB0aW1lem9uZSBpbmZvcm1hdGlvbiwKKyAgIHB1dHRpbmcgaXQgaW50byAqVFYgYW5kICpUWi4gIElmIFRaIGlzIE5VTEwsICpUWiBpcyBub3QgZmlsbGVkLgorICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9ycy4KKyAgIE5PVEU6IFRoaXMgZm9ybSBvZiB0aW1lem9uZSBpbmZvcm1hdGlvbiBpcyBvYnNvbGV0ZS4KKyAgIFVzZSB0aGUgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gPHRpbWUuaD4gaW5zdGVhZC4gICovCitleHRlcm4gaW50IGdldHRpbWVvZmRheSAoc3RydWN0IHRpbWV2YWwgKl9fcmVzdHJpY3QgX190diwKKwkJCSBfX3RpbWV6b25lX3B0cl90IF9fdHopIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfQlNECisvKiBTZXQgdGhlIGN1cnJlbnQgdGltZSBvZiBkYXkgYW5kIHRpbWV6b25lIGluZm9ybWF0aW9uLgorICAgVGhpcyBjYWxsIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHN1cGVyLXVzZXIuICAqLworZXh0ZXJuIGludCBzZXR0aW1lb2ZkYXkgKF9fY29uc3Qgc3RydWN0IHRpbWV2YWwgKl9fdHYsCisJCQkgX19jb25zdCBzdHJ1Y3QgdGltZXpvbmUgKl9fdHopCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBBZGp1c3QgdGhlIGN1cnJlbnQgdGltZSBvZiBkYXkgYnkgdGhlIGFtb3VudCBpbiBERUxUQS4KKyAgIElmIE9MRERFTFRBIGlzIG5vdCBOVUxMLCBpdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgYW1vdW50CisgICBvZiB0aW1lIGFkanVzdG1lbnQgcmVtYWluaW5nIHRvIGJlIGRvbmUgZnJvbSB0aGUgbGFzdCBgYWRqdGltZScgY2FsbC4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgYWRqdGltZSAoX19jb25zdCBzdHJ1Y3QgdGltZXZhbCAqX19kZWx0YSwKKwkJICAgIHN0cnVjdCB0aW1ldmFsICpfX29sZGRlbHRhKSBfX1RIUk9XOworI2VuZGlmCisKKworLyogVmFsdWVzIGZvciB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYGdldGl0aW1lcicgYW5kIGBzZXRpdGltZXInLiAgKi8KK2VudW0gX19pdGltZXJfd2hpY2gKKyAgeworICAgIC8qIFRpbWVycyBydW4gaW4gcmVhbCB0aW1lLiAgKi8KKyAgICBJVElNRVJfUkVBTCA9IDAsCisjZGVmaW5lIElUSU1FUl9SRUFMIElUSU1FUl9SRUFMCisgICAgLyogVGltZXJzIHJ1biBvbmx5IHdoZW4gdGhlIHByb2Nlc3MgaXMgZXhlY3V0aW5nLiAgKi8KKyAgICBJVElNRVJfVklSVFVBTCA9IDEsCisjZGVmaW5lIElUSU1FUl9WSVJUVUFMIElUSU1FUl9WSVJUVUFMCisgICAgLyogVGltZXJzIHJ1biB3aGVuIHRoZSBwcm9jZXNzIGlzIGV4ZWN1dGluZyBhbmQgd2hlbgorICAgICAgIHRoZSBzeXN0ZW0gaXMgZXhlY3V0aW5nIG9uIGJlaGFsZiBvZiB0aGUgcHJvY2Vzcy4gICovCisgICAgSVRJTUVSX1BST0YgPSAyCisjZGVmaW5lIElUSU1FUl9QUk9GIElUSU1FUl9QUk9GCisgIH07CisKKy8qIFR5cGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZ2V0aXRpbWVyJyBhbmQKKyAgIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGFyZ3VtZW50cyBgc2V0aXRpbWVyJy4gICovCitzdHJ1Y3QgaXRpbWVydmFsCisgIHsKKyAgICAvKiBWYWx1ZSB0byBwdXQgaW50byBgaXRfdmFsdWUnIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMuICAqLworICAgIHN0cnVjdCB0aW1ldmFsIGl0X2ludGVydmFsOworICAgIC8qIFRpbWUgdG8gdGhlIG5leHQgdGltZXIgZXhwaXJhdGlvbi4gICovCisgICAgc3RydWN0IHRpbWV2YWwgaXRfdmFsdWU7CisgIH07CisKKyNpZiBkZWZpbmVkIF9fVVNFX0dOVSAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworLyogVXNlIHRoZSBuaWNlciBwYXJhbWV0ZXIgdHlwZSBvbmx5IGluIEdOVSBtb2RlIGFuZCBub3QgZm9yIEMrKyBzaW5jZSB0aGUKKyAgIHN0cmljdCBDKysgcnVsZXMgcHJldmVudCB0aGUgYXV0b21hdGljIHByb21vdGlvbi4gICovCit0eXBlZGVmIGVudW0gX19pdGltZXJfd2hpY2ggX19pdGltZXJfd2hpY2hfdDsKKyNlbHNlCit0eXBlZGVmIGludCBfX2l0aW1lcl93aGljaF90OworI2VuZGlmCisKKy8qIFNldCAqVkFMVUUgdG8gdGhlIGN1cnJlbnQgc2V0dGluZyBvZiB0aW1lciBXSElDSC4KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9ycy4gICovCitleHRlcm4gaW50IGdldGl0aW1lciAoX19pdGltZXJfd2hpY2hfdCBfX3doaWNoLAorCQkgICAgICBzdHJ1Y3QgaXRpbWVydmFsICpfX3ZhbHVlKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIHRpbWVyIFdISUNIIHRvICpORVcuICBJZiBPTEQgaXMgbm90IE5VTEwsCisgICBzZXQgKk9MRCB0byB0aGUgb2xkIHZhbHVlIG9mIHRpbWVyIFdISUNILgorICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9ycy4gICovCitleHRlcm4gaW50IHNldGl0aW1lciAoX19pdGltZXJfd2hpY2hfdCBfX3doaWNoLAorCQkgICAgICBfX2NvbnN0IHN0cnVjdCBpdGltZXJ2YWwgKl9fcmVzdHJpY3QgX19uZXcsCisJCSAgICAgIHN0cnVjdCBpdGltZXJ2YWwgKl9fcmVzdHJpY3QgX19vbGQpIF9fVEhST1c7CisKKy8qIENoYW5nZSB0aGUgYWNjZXNzIHRpbWUgb2YgRklMRSB0byBUVlBbMF0gYW5kIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZgorICAgRklMRSB0byBUVlBbMV0uICBJZiBUVlAgaXMgYSBudWxsIHBvaW50ZXIsIHVzZSB0aGUgY3VycmVudCB0aW1lIGluc3RlYWQuCisgICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgdXRpbWVzIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19jb25zdCBzdHJ1Y3QgdGltZXZhbCBfX3R2cFsyXSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIFNhbWUgYXMgYHV0aW1lcycsIGJ1dCBkb2VzIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3MuICAqLworZXh0ZXJuIGludCBsdXRpbWVzIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19jb25zdCBzdHJ1Y3QgdGltZXZhbCBfX3R2cFsyXSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFNhbWUgYXMgYHV0aW1lcycsIGJ1dCB0YWtlcyBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBpbnN0ZWFkIG9mIGEgbmFtZS4gICovCitleHRlcm4gaW50IGZ1dGltZXMgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCB0aW1ldmFsIF9fdHZwWzJdKSBfX1RIUk9XOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIENoYW5nZSB0aGUgYWNjZXNzIHRpbWUgb2YgRklMRSByZWxhdGl2ZSB0byBGRCB0byBUVlBbMF0gYW5kIHRoZQorICAgbW9kaWZpY2F0aW9uIHRpbWUgb2YgRklMRSB0byBUVlBbMV0uICBJZiBUVlAgaXMgYSBudWxsIHBvaW50ZXIsIHVzZQorICAgdGhlIGN1cnJlbnQgdGltZSBpbnN0ZWFkLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9ycy4gICovCitleHRlcm4gaW50IGZ1dGltZXNhdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19maWxlLAorCQkgICAgICBfX2NvbnN0IHN0cnVjdCB0aW1ldmFsIF9fdHZwWzJdKSBfX1RIUk9XOworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0JTRAorLyogQ29udmVuaWVuY2UgbWFjcm9zIGZvciBvcGVyYXRpb25zIG9uIHRpbWV2YWxzLgorICAgTk9URTogYHRpbWVyY21wJyBkb2VzIG5vdCB3b3JrIGZvciA+PSBvciA8PS4gICovCisjIGRlZmluZSB0aW1lcmlzc2V0KHR2cCkJKCh0dnApLT50dl9zZWMgfHwgKHR2cCktPnR2X3VzZWMpCisjIGRlZmluZSB0aW1lcmNsZWFyKHR2cCkJKCh0dnApLT50dl9zZWMgPSAodHZwKS0+dHZfdXNlYyA9IDApCisjIGRlZmluZSB0aW1lcmNtcChhLCBiLCBDTVApIAkJCQkJCSAgICAgIFwKKyAgKCgoYSktPnR2X3NlYyA9PSAoYiktPnR2X3NlYykgPyAJCQkJCSAgICAgIFwKKyAgICgoYSktPnR2X3VzZWMgQ01QIChiKS0+dHZfdXNlYykgOiAJCQkJCSAgICAgIFwKKyAgICgoYSktPnR2X3NlYyBDTVAgKGIpLT50dl9zZWMpKQorIyBkZWZpbmUgdGltZXJhZGQoYSwgYiwgcmVzdWx0KQkJCQkJCSAgICAgIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICAocmVzdWx0KS0+dHZfc2VjID0gKGEpLT50dl9zZWMgKyAoYiktPnR2X3NlYzsJCQkgICAgICBcCisgICAgKHJlc3VsdCktPnR2X3VzZWMgPSAoYSktPnR2X3VzZWMgKyAoYiktPnR2X3VzZWM7CQkJICAgICAgXAorICAgIGlmICgocmVzdWx0KS0+dHZfdXNlYyA+PSAxMDAwMDAwKQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwkrKyhyZXN1bHQpLT50dl9zZWM7CQkJCQkJICAgICAgXAorCShyZXN1bHQpLT50dl91c2VjIC09IDEwMDAwMDA7CQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorIyBkZWZpbmUgdGltZXJzdWIoYSwgYiwgcmVzdWx0KQkJCQkJCSAgICAgIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICAocmVzdWx0KS0+dHZfc2VjID0gKGEpLT50dl9zZWMgLSAoYiktPnR2X3NlYzsJCQkgICAgICBcCisgICAgKHJlc3VsdCktPnR2X3VzZWMgPSAoYSktPnR2X3VzZWMgLSAoYiktPnR2X3VzZWM7CQkJICAgICAgXAorICAgIGlmICgocmVzdWx0KS0+dHZfdXNlYyA8IDApIHsJCQkJCSAgICAgIFwKKyAgICAgIC0tKHJlc3VsdCktPnR2X3NlYzsJCQkJCQkgICAgICBcCisgICAgICAocmVzdWx0KS0+dHZfdXNlYyArPSAxMDAwMDAwOwkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYJLyogQlNEICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdGltZS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90aW1lYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGltZWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmRiZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGltZWIuaApAQCAtMCwwICsxLDQ2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19USU1FQl9ICisjZGVmaW5lIF9TWVNfVElNRUJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF90aW1lX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBTdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgdGhlIGBmdGltZScgZnVuY3Rpb24uICAqLworCitzdHJ1Y3QgdGltZWIKKyAgeworICAgIHRpbWVfdCB0aW1lOwkJLyogU2Vjb25kcyBzaW5jZSBlcG9jaCwgYXMgZnJvbSBgdGltZScuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBtaWxsaXRtOwkvKiBBZGRpdGlvbmFsIG1pbGxpc2Vjb25kcy4gICovCisgICAgc2hvcnQgaW50IHRpbWV6b25lOwkJLyogTWludXRlcyB3ZXN0IG9mIEdNVC4gICovCisgICAgc2hvcnQgaW50IGRzdGZsYWc7CQkvKiBOb256ZXJvIGlmIERheWxpZ2h0IFNhdmluZ3MgVGltZSB1c2VkLiAgKi8KKyAgfTsKKworLyogRmlsbCBpbiBUSU1FQlVGIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgdGltZS4gICovCisKK2V4dGVybiBpbnQgZnRpbWUgKHN0cnVjdCB0aW1lYiAqX190aW1lYnVmKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy90aW1lYi5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90aW1lcmZkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90aW1lcmZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiYjA2ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3RpbWVyZmQuaApAQCAtMCwwICsxLDYwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19USU1FUkZEX0gKKyNkZWZpbmUJX1NZU19USU1FUkZEX0gJMQorCisjaW5jbHVkZSA8dGltZS5oPgorCisKKy8qIEJpdHMgdG8gYmUgc2V0IGluIHRoZSBGTEFHUyBwYXJhbWV0ZXIgb2YgYHRpbWVyZmRfY3JlYXRlJy4gICovCitlbnVtCisgIHsKKyAgICBURkRfQ0xPRVhFQyA9IDAyMDAwMDAwLAorI2RlZmluZSBURkRfQ0xPRVhFQyBURkRfQ0xPRVhFQworICAgIFRGRF9OT05CTE9DSyA9IDA0MDAwCisjZGVmaW5lIFRGRF9OT05CTE9DSyBURkRfTk9OQkxPQ0sKKyAgfTsKKworCisvKiBCaXRzIHRvIGJlIHNldCBpbiB0aGUgRkxBR1MgcGFyYW1ldGVyIG9mIGB0aW1lcmZkX3NldHRpbWUnLiAgKi8KK2VudW0KKyAgeworICAgIFRGRF9USU1FUl9BQlNUSU1FID0gMSA8PCAwCisjZGVmaW5lIFRGRF9USU1FUl9BQlNUSU1FIFRGRF9USU1FUl9BQlNUSU1FCisgIH07CisKKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gZmlsZSBkZXNjcmlwdG9yIGZvciBuZXcgaW50ZXJ2YWwgdGltZXIgc291cmNlLiAgKi8KK2V4dGVybiBpbnQgdGltZXJmZF9jcmVhdGUgKGNsb2NraWRfdCBfX2Nsb2NrX2lkLCBpbnQgX19mbGFncykgX19USFJPVzsKKworLyogU2V0IG5leHQgZXhwaXJhdGlvbiB0aW1lIG9mIGludGVydmFsIHRpbWVyIHNvdXJjZSBVRkQgdG8gVVRNUi4gIElmCisgICBGTEFHUyBoYXMgdGhlIFRGRF9USU1FUl9BQlNUSU1FIGZsYWcgc2V0IHRoZSB0aW1lb3V0IHZhbHVlIGlzCisgICBhYnNvbHV0ZS4gIE9wdGlvbmFsbHkgcmV0dXJuIHRoZSBvbGQgZXhwaXJhdGlvbiB0aW1lIGluIE9UTVIuICAqLworZXh0ZXJuIGludCB0aW1lcmZkX3NldHRpbWUgKGludCBfX3VmZCwgaW50IF9fZmxhZ3MsCisJCQkgICAgX19jb25zdCBzdHJ1Y3QgaXRpbWVyc3BlYyAqX191dG1yLAorCQkJICAgIHN0cnVjdCBpdGltZXJzcGVjICpfX290bXIpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgbmV4dCBleHBpcmF0aW9uIHRpbWUgb2YgVUZELiAgKi8KK2V4dGVybiBpbnQgdGltZXJmZF9nZXR0aW1lIChpbnQgX191ZmQsIHN0cnVjdCBpdGltZXJzcGVjICpfX290bXIpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdGltZXJmZC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90aW1lcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGltZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDIyZjJmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGltZXMuaApAQCAtMCwwICsxLDUzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogNC41LjIgUHJvY2VzcyBUaW1lcwk8c3lzL3RpbWVzLmg+CisgKi8KKworI2lmbmRlZglfU1lTX1RJTUVTX0gKKyNkZWZpbmUJX1NZU19USU1FU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNkZWZpbmUJX19uZWVkX2Nsb2NrX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBDUFUgdGltZSB1c2VkIGJ5IGEgcHJvY2VzcyBhbmQgaXRzIGNoaWxkcmVuLiAgKi8KK3N0cnVjdCB0bXMKKyAgeworICAgIGNsb2NrX3QgdG1zX3V0aW1lOwkJLyogVXNlciBDUFUgdGltZS4gICovCisgICAgY2xvY2tfdCB0bXNfc3RpbWU7CQkvKiBTeXN0ZW0gQ1BVIHRpbWUuICAqLworCisgICAgY2xvY2tfdCB0bXNfY3V0aW1lOwkJLyogVXNlciBDUFUgdGltZSBvZiBkZWFkIGNoaWxkcmVuLiAgKi8KKyAgICBjbG9ja190IHRtc19jc3RpbWU7CQkvKiBTeXN0ZW0gQ1BVIHRpbWUgb2YgZGVhZCBjaGlsZHJlbi4gICovCisgIH07CisKKworLyogU3RvcmUgdGhlIENQVSB0aW1lIHVzZWQgYnkgdGhpcyBwcm9jZXNzIGFuZCBhbGwgaXRzCisgICBkZWFkIGNoaWxkcmVuIChhbmQgdGhlaXIgZGVhZCBjaGlsZHJlbikgaW4gQlVGRkVSLgorICAgUmV0dXJuIHRoZSBlbGFwc2VkIHJlYWwgdGltZSwgb3IgKGNsb2NrX3QpIC0xIGZvciBlcnJvcnMuCisgICBBbGwgdGltZXMgYXJlIGluIENMS19UQ0t0aHMgb2YgYSBzZWNvbmQuICAqLworZXh0ZXJuIGNsb2NrX3QgdGltZXMgKHN0cnVjdCB0bXMgKl9fYnVmZmVyKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3RpbWVzLmgJKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3RpbWV4LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90aW1leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjFiYjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90aW1leC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LDE5OTksMjAwNywyMDA5LDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19USU1FWF9ICisjZGVmaW5lCV9TWVNfVElNRVhfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKy8qIFRoZXNlIGRlZmluaXRpb25zIGZyb20gbGludXgvdGltZXguaCBhcyBvZiAyLjYuMzAuICAqLworCisjaW5jbHVkZSA8Yml0cy90aW1leC5oPgorCisjZGVmaW5lIE5UUF9BUEkJNAkvKiBOVFAgQVBJIHZlcnNpb24gKi8KKworc3RydWN0IG50cHRpbWV2YWwKK3sKKyAgc3RydWN0IHRpbWV2YWwgdGltZTsJLyogY3VycmVudCB0aW1lIChybykgKi8KKyAgbG9uZyBpbnQgbWF4ZXJyb3I7CS8qIG1heGltdW0gZXJyb3IgKHVzKSAocm8pICovCisgIGxvbmcgaW50IGVzdGVycm9yOwkvKiBlc3RpbWF0ZWQgZXJyb3IgKHVzKSAocm8pICovCisgIGxvbmcgaW50IHRhaTsJCS8qIFRBSSBvZmZzZXQgKHJvKSAqLworCisgIGxvbmcgaW50IF9fdW51c2VkMTsKKyAgbG9uZyBpbnQgX191bnVzZWQyOworICBsb25nIGludCBfX3VudXNlZDM7CisgIGxvbmcgaW50IF9fdW51c2VkNDsKK307CisKKy8qIENsb2NrIHN0YXRlcyAodGltZV9zdGF0ZSkgKi8KKyNkZWZpbmUgVElNRV9PSwkJMAkvKiBjbG9jayBzeW5jaHJvbml6ZWQsIG5vIGxlYXAgc2Vjb25kICovCisjZGVmaW5lIFRJTUVfSU5TCTEJLyogaW5zZXJ0IGxlYXAgc2Vjb25kICovCisjZGVmaW5lIFRJTUVfREVMCTIJLyogZGVsZXRlIGxlYXAgc2Vjb25kICovCisjZGVmaW5lIFRJTUVfT09QCTMJLyogbGVhcCBzZWNvbmQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgVElNRV9XQUlUCTQJLyogbGVhcCBzZWNvbmQgaGFzIG9jY3VycmVkICovCisjZGVmaW5lIFRJTUVfRVJST1IJNQkvKiBjbG9jayBub3Qgc3luY2hyb25pemVkICovCisjZGVmaW5lIFRJTUVfQkFECVRJTUVfRVJST1IgLyogYncgY29tcGF0ICovCisKKy8qIE1heGltdW0gdGltZSBjb25zdGFudCBvZiB0aGUgUExMLiAgKi8KKyNkZWZpbmUgTUFYVEMJCTYKKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IF9fYWRqdGltZXggKHN0cnVjdCB0aW1leCAqX19udHgpIF9fVEhST1c7CitleHRlcm4gaW50IGFkanRpbWV4IChzdHJ1Y3QgdGltZXggKl9fbnR4KSBfX1RIUk9XOworCisjaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKG50cF9nZXR0aW1lLCAoc3RydWN0IG50cHRpbWV2YWwgKl9fbnR2KSwKKwkJCSAgIG50cF9nZXR0aW1leCk7CisjZWxzZQorZXh0ZXJuIGludCBudHBfZ2V0dGltZXggKHN0cnVjdCBudHB0aW1ldmFsICpfX250dikgX19USFJPVzsKKyMgZGVmaW5lIG50cF9nZXR0aW1lIG50cF9nZXR0aW1leAorI2VuZGlmCitleHRlcm4gaW50IG50cF9hZGp0aW1lIChzdHJ1Y3QgdGltZXggKl9fdG50eCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy90aW1leC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90dHljaGFycy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdHR5Y2hhcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQzZjYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdHR5Y2hhcnMuaApAQCAtMCwwICsxLDYxIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MCwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0dHljaGFycy5oCTguMiAoQmVya2VsZXkpIDEvNC85NAorICovCisKKy8qCisgKiA0LjMgQ09NUEFUSUJJTElUWSBGSUxFCisgKgorICogVXNlciB2aXNpYmxlIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyByZWxhdGVkIHRvIHRlcm1pbmFsIGhhbmRsaW5nLgorICovCisjaWZuZGVmIF9TWVNfVFRZQ0hBUlNfSAorI2RlZmluZQlfU1lTX1RUWUNIQVJTX0ggMQorCitzdHJ1Y3QgdHR5Y2hhcnMgeworCWNoYXIJdGNfZXJhc2U7CS8qIGVyYXNlIGxhc3QgY2hhcmFjdGVyICovCisJY2hhcgl0Y19raWxsOwkvKiBlcmFzZSBlbnRpcmUgbGluZSAqLworCWNoYXIJdGNfaW50cmM7CS8qIGludGVycnVwdCAqLworCWNoYXIJdGNfcXVpdGM7CS8qIHF1aXQgKi8KKwljaGFyCXRjX3N0YXJ0YzsJLyogc3RhcnQgb3V0cHV0ICovCisJY2hhcgl0Y19zdG9wYzsJLyogc3RvcCBvdXRwdXQgKi8KKwljaGFyCXRjX2VvZmM7CS8qIGVuZC1vZi1maWxlICovCisJY2hhcgl0Y19icmtjOwkvKiBpbnB1dCBkZWxpbWl0ZXIgKGxpa2UgbmwpICovCisJY2hhcgl0Y19zdXNwYzsJLyogc3RvcCBwcm9jZXNzIHNpZ25hbCAqLworCWNoYXIJdGNfZHN1c3BjOwkvKiBkZWxheWVkIHN0b3AgcHJvY2VzcyBzaWduYWwgKi8KKwljaGFyCXRjX3Jwcm50YzsJLyogcmVwcmludCBsaW5lICovCisJY2hhcgl0Y19mbHVzaGM7CS8qIGZsdXNoIG91dHB1dCAodG9nZ2xlcykgKi8KKwljaGFyCXRjX3dlcmFzYzsJLyogd29yZCBlcmFzZSAqLworCWNoYXIJdGNfbG5leHRjOwkvKiBsaXRlcmFsIG5leHQgY2hhcmFjdGVyICovCit9OworCisjaWZkZWYgX19VU0VfT0xEX1RUWQorI2luY2x1ZGUgPHN5cy90dHlkZWZhdWx0cy5oPgkvKiB0byBwaWNrIHVwIGNoYXJhY3RlciBkZWZhdWx0cyAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBzeXMvdHR5Y2hhcnMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdHR5ZGVmYXVsdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3R0eWRlZmF1bHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlMTY4YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3R0eWRlZmF1bHRzLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIChjKSBVTklYIFN5c3RlbSBMYWJvcmF0b3JpZXMsIEluYy4KKyAqIEFsbCBvciBzb21lIHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIG1hdGVyaWFsIGxpY2Vuc2VkCisgKiB0byB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGJ5IEFtZXJpY2FuIFRlbGVwaG9uZSBhbmQgVGVsZWdyYXBoCisgKiBDby4gb3IgVW5peCBTeXN0ZW0gTGFib3JhdG9yaWVzLCBJbmMuIGFuZCBhcmUgcmVwcm9kdWNlZCBoZXJlaW4gd2l0aAorICogdGhlIHBlcm1pc3Npb24gb2YgVU5JWCBTeXN0ZW0gTGFib3JhdG9yaWVzLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0dHlkZWZhdWx0cy5oCTguNCAoQmVya2VsZXkpIDEvMjEvOTQKKyAqLworCisvKgorICogU3lzdGVtIHdpZGUgZGVmYXVsdHMgZm9yIHRlcm1pbmFsIHN0YXRlLiAgTGludXggdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfU1lTX1RUWURFRkFVTFRTX0hfCisjZGVmaW5lCV9TWVNfVFRZREVGQVVMVFNfSF8KKworLyoKKyAqIERlZmF1bHRzIG9uICJmaXJzdCIgb3Blbi4KKyAqLworI2RlZmluZQlUVFlERUZfSUZMQUcJKEJSS0lOVCB8IElTVFJJUCB8IElDUk5MIHwgSU1BWEJFTCB8IElYT04gfCBJWEFOWSkKKyNkZWZpbmUgVFRZREVGX09GTEFHCShPUE9TVCB8IE9OTENSIHwgWFRBQlMpCisjZGVmaW5lIFRUWURFRl9MRkxBRwkoRUNITyB8IElDQU5PTiB8IElTSUcgfCBJRVhURU4gfCBFQ0hPRXxFQ0hPS0V8RUNIT0NUTCkKKyNkZWZpbmUgVFRZREVGX0NGTEFHCShDUkVBRCB8IENTNyB8IFBBUkVOQiB8IEhVUENMKQorI2RlZmluZSBUVFlERUZfU1BFRUQJKEI5NjAwKQorCisvKgorICogQ29udHJvbCBDaGFyYWN0ZXIgRGVmYXVsdHMKKyAqLworI2RlZmluZSBDVFJMKHgpCSh4JjAzNykKKyNkZWZpbmUJQ0VPRgkJQ1RSTCgnZCcpCisjaWZkZWYgX1BPU0lYX1ZESVNBQkxFCisjIGRlZmluZSBDRU9MCQlfUE9TSVhfVkRJU0FCTEUKKyNlbHNlCisjIGRlZmluZSBDRU9MCQknXDAnCQkvKiBYWFggYXZvaWQgX1BPU0lYX1ZESVNBQkxFICovCisjZW5kaWYKKyNkZWZpbmUJQ0VSQVNFCQkwMTc3CisjZGVmaW5lCUNJTlRSCQlDVFJMKCdjJykKKyNpZmRlZiBfUE9TSVhfVkRJU0FCTEUKKyMgZGVmaW5lIENTVEFUVVMJX1BPU0lYX1ZESVNBQkxFCisjZWxzZQorIyBkZWZpbmUgQ1NUQVRVUwknXDAnCQkvKiBYWFggYXZvaWQgX1BPU0lYX1ZESVNBQkxFICovCisjZW5kaWYKKyNkZWZpbmUJQ0tJTEwJCUNUUkwoJ3UnKQorI2RlZmluZQlDTUlOCQkxCisjZGVmaW5lCUNRVUlUCQkwMzQJCS8qIEZTLCBeXCAqLworI2RlZmluZQlDU1VTUAkJQ1RSTCgneicpCisjZGVmaW5lCUNUSU1FCQkwCisjZGVmaW5lCUNEU1VTUAkJQ1RSTCgneScpCisjZGVmaW5lCUNTVEFSVAkJQ1RSTCgncScpCisjZGVmaW5lCUNTVE9QCQlDVFJMKCdzJykKKyNkZWZpbmUJQ0xORVhUCQlDVFJMKCd2JykKKyNkZWZpbmUJQ0RJU0NBUkQgCUNUUkwoJ28nKQorI2RlZmluZQlDV0VSQVNFIAlDVFJMKCd3JykKKyNkZWZpbmUJQ1JFUFJJTlQgCUNUUkwoJ3InKQorI2RlZmluZQlDRU9UCQlDRU9GCisvKiBjb21wYXQgKi8KKyNkZWZpbmUJQ0JSSwkJQ0VPTAorI2RlZmluZSBDUlBSTlQJCUNSRVBSSU5UCisjZGVmaW5lCUNGTFVTSAkJQ0RJU0NBUkQKKworLyogUFJPVEVDVEVEIElOQ0xVU0lPTiBFTkRTIEhFUkUgKi8KKyNlbmRpZiAvKiAhX1NZU19UVFlERUZBVUxUU19IXyAqLworCisvKgorICogI2RlZmluZSBUVFlERUZDSEFSUyB0byBpbmNsdWRlIGFuIGFycmF5IG9mIGRlZmF1bHQgY29udHJvbCBjaGFyYWN0ZXJzLgorICovCisjaWZkZWYgVFRZREVGQ0hBUlMKK2NjX3QJdHR5ZGVmY2hhcnNbTkNDU10gPSB7CisJQ0VPRiwJQ0VPTCwJQ0VPTCwJQ0VSQVNFLCBDV0VSQVNFLCBDS0lMTCwgQ1JFUFJJTlQsCisJX1BPU0lYX1ZESVNBQkxFLCBDSU5UUiwJQ1FVSVQsCUNTVVNQLAlDRFNVU1AsCUNTVEFSVCwJQ1NUT1AsCUNMTkVYVCwKKwlDRElTQ0FSRCwgQ01JTiwJQ1RJTUUsICBDU1RBVFVTLCBfUE9TSVhfVkRJU0FCTEUKK307CisjdW5kZWYgVFRZREVGQ0hBUlMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdHlwZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlOTA4NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3R5cGVzLmgKQEAgLTAsMCArMSwyNzYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwxOTkyLDE5OTQtMjAwMiwyMDA2LDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogMi42IFByaW1pdGl2ZSBTeXN0ZW0gRGF0YSBUeXBlcwk8c3lzL3R5cGVzLmg+CisgKi8KKworI2lmbmRlZglfU1lTX1RZUEVTX0gKKyNkZWZpbmUJX1NZU19UWVBFU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworI2lmZGVmCV9fVVNFX0JTRAorIyBpZm5kZWYgX191X2NoYXJfZGVmaW5lZAordHlwZWRlZiBfX3VfY2hhciB1X2NoYXI7Cit0eXBlZGVmIF9fdV9zaG9ydCB1X3Nob3J0OwordHlwZWRlZiBfX3VfaW50IHVfaW50OwordHlwZWRlZiBfX3VfbG9uZyB1X2xvbmc7Cit0eXBlZGVmIF9fcXVhZF90IHF1YWRfdDsKK3R5cGVkZWYgX191X3F1YWRfdCB1X3F1YWRfdDsKK3R5cGVkZWYgX19mc2lkX3QgZnNpZF90OworIyAgZGVmaW5lIF9fdV9jaGFyX2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIF9fbG9mZl90IGxvZmZfdDsKKworI2lmbmRlZiBfX2lub190X2RlZmluZWQKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19pbm9fdCBpbm9fdDsKKyMgZWxzZQordHlwZWRlZiBfX2lubzY0X3QgaW5vX3Q7CisjIGVuZGlmCisjIGRlZmluZSBfX2lub190X2RlZmluZWQKKyNlbmRpZgorI2lmIGRlZmluZWQgX19VU0VfTEFSR0VGSUxFNjQgJiYgIWRlZmluZWQgX19pbm82NF90X2RlZmluZWQKK3R5cGVkZWYgX19pbm82NF90IGlubzY0X3Q7CisjIGRlZmluZSBfX2lubzY0X3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19kZXZfdF9kZWZpbmVkCit0eXBlZGVmIF9fZGV2X3QgZGV2X3Q7CisjIGRlZmluZSBfX2Rldl90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fZ2lkX3RfZGVmaW5lZAordHlwZWRlZiBfX2dpZF90IGdpZF90OworIyBkZWZpbmUgX19naWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX21vZGVfdF9kZWZpbmVkCit0eXBlZGVmIF9fbW9kZV90IG1vZGVfdDsKKyMgZGVmaW5lIF9fbW9kZV90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fbmxpbmtfdF9kZWZpbmVkCit0eXBlZGVmIF9fbmxpbmtfdCBubGlua190OworIyBkZWZpbmUgX19ubGlua190X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fdWlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3VpZF90IHVpZF90OworIyBkZWZpbmUgX191aWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX29mZl90X2RlZmluZWQKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19vZmZfdCBvZmZfdDsKKyMgZWxzZQordHlwZWRlZiBfX29mZjY0X3Qgb2ZmX3Q7CisjIGVuZGlmCisjIGRlZmluZSBfX29mZl90X2RlZmluZWQKKyNlbmRpZgorI2lmIGRlZmluZWQgX19VU0VfTEFSR0VGSUxFNjQgJiYgIWRlZmluZWQgX19vZmY2NF90X2RlZmluZWQKK3R5cGVkZWYgX19vZmY2NF90IG9mZjY0X3Q7CisjIGRlZmluZSBfX29mZjY0X3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19waWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fcGlkX3QgcGlkX3Q7CisjIGRlZmluZSBfX3BpZF90X2RlZmluZWQKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgpIFwKKyAgICAmJiAhZGVmaW5lZCBfX2lkX3RfZGVmaW5lZAordHlwZWRlZiBfX2lkX3QgaWRfdDsKKyMgZGVmaW5lIF9faWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX3NzaXplX3RfZGVmaW5lZAordHlwZWRlZiBfX3NzaXplX3Qgc3NpemVfdDsKKyMgZGVmaW5lIF9fc3NpemVfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmZGVmCV9fVVNFX0JTRAorIyBpZm5kZWYgX19kYWRkcl90X2RlZmluZWQKK3R5cGVkZWYgX19kYWRkcl90IGRhZGRyX3Q7Cit0eXBlZGVmIF9fY2FkZHJfdCBjYWRkcl90OworIyAgZGVmaW5lIF9fZGFkZHJfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworI2lmIChkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTikgJiYgIWRlZmluZWQgX19rZXlfdF9kZWZpbmVkCit0eXBlZGVmIF9fa2V5X3Qga2V5X3Q7CisjIGRlZmluZSBfX2tleV90X2RlZmluZWQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisjIGRlZmluZSBfX25lZWRfY2xvY2tfdAorI2VuZGlmCisjZGVmaW5lCV9fbmVlZF90aW1lX3QKKyNkZWZpbmUgX19uZWVkX3RpbWVyX3QKKyNkZWZpbmUgX19uZWVkX2Nsb2NraWRfdAorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmZGVmIF9fVVNFX1hPUEVOCisjIGlmbmRlZiBfX3VzZWNvbmRzX3RfZGVmaW5lZAordHlwZWRlZiBfX3VzZWNvbmRzX3QgdXNlY29uZHNfdDsKKyMgIGRlZmluZSBfX3VzZWNvbmRzX3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19zdXNlY29uZHNfdF9kZWZpbmVkCit0eXBlZGVmIF9fc3VzZWNvbmRzX3Qgc3VzZWNvbmRzX3Q7CisjICBkZWZpbmUgX19zdXNlY29uZHNfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZQlfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBPbGQgY29tcGF0aWJpbGl0eSBuYW1lcyBmb3IgQyB0eXBlcy4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHVsb25nOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgdXNob3J0OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDsKKyNlbmRpZgorCisvKiBUaGVzZSBzaXplLXNwZWNpZmljIG5hbWVzIGFyZSB1c2VkIGJ5IHNvbWUgb2YgdGhlIGluZXQgY29kZS4gICovCisKKyNpZiAhX19HTlVDX1BSRVJFUSAoMiwgNykKKworLyogVGhlc2UgdHlwZXMgYXJlIGRlZmluZWQgYnkgdGhlIElTTyBDOTkgaGVhZGVyIDxpbnR0eXBlcy5oPi4gKi8KKyMgaWZuZGVmIF9faW50OF90X2RlZmluZWQKKyMgIGRlZmluZSBfX2ludDhfdF9kZWZpbmVkCit0eXBlZGVmCWNoYXIgaW50OF90OwordHlwZWRlZglzaG9ydCBpbnQgaW50MTZfdDsKK3R5cGVkZWYJaW50IGludDMyX3Q7CisjICBpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIGxvbmcgaW50IGludDY0X3Q7CisjICBlbGlmIF9fR0xJQkNfSEFWRV9MT05HX0xPTkcKK19fZXh0ZW5zaW9uX18gdHlwZWRlZiBsb25nIGxvbmcgaW50IGludDY0X3Q7CisjICBlbmRpZgorIyBlbmRpZgorCisvKiBCdXQgdGhlc2Ugd2VyZSBkZWZpbmVkIGJ5IElTTyBDIHdpdGhvdXQgdGhlIGZpcnN0IGBfJy4gICovCit0eXBlZGVmCXVuc2lnbmVkIGNoYXIgdV9pbnQ4X3Q7Cit0eXBlZGVmCXVuc2lnbmVkIHNob3J0IGludCB1X2ludDE2X3Q7Cit0eXBlZGVmCXVuc2lnbmVkIGludCB1X2ludDMyX3Q7CisjIGlmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgdV9pbnQ2NF90OworIyBlbGlmIF9fR0xJQkNfSEFWRV9MT05HX0xPTkcKK19fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHVfaW50NjRfdDsKKyMgZW5kaWYKKwordHlwZWRlZiBpbnQgcmVnaXN0ZXJfdDsKKworI2Vsc2UKKworLyogRm9yIEdDQyAyLjcgYW5kIGxhdGVyLCB3ZSBjYW4gdXNlIHNwZWNpZmljIHR5cGUtc2l6ZSBhdHRyaWJ1dGVzLiAgKi8KKyMgZGVmaW5lIF9faW50Tl90KE4sIE1PREUpIFwKKyAgdHlwZWRlZiBpbnQgaW50IyNOIyNfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKE1PREUpKSkKKyMgZGVmaW5lIF9fdV9pbnROX3QoTiwgTU9ERSkgXAorICB0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludCMjTiMjX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChNT0RFKSkpCisKKyMgaWZuZGVmIF9faW50OF90X2RlZmluZWQKKyMgIGRlZmluZSBfX2ludDhfdF9kZWZpbmVkCitfX2ludE5fdCAoOCwgX19RSV9fKTsKK19faW50Tl90ICgxNiwgX19ISV9fKTsKK19faW50Tl90ICgzMiwgX19TSV9fKTsKK19faW50Tl90ICg2NCwgX19ESV9fKTsKKyMgZW5kaWYKKworX191X2ludE5fdCAoOCwgX19RSV9fKTsKK19fdV9pbnROX3QgKDE2LCBfX0hJX18pOworX191X2ludE5fdCAoMzIsIF9fU0lfXyk7CitfX3VfaW50Tl90ICg2NCwgX19ESV9fKTsKKwordHlwZWRlZiBpbnQgcmVnaXN0ZXJfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fd29yZF9fKSkpOworCisKKy8qIFNvbWUgY29kZSBmcm9tIEJJTkQgdGVzdHMgdGhpcyBtYWNybyB0byBzZWUgaWYgdGhlIHR5cGVzIGFib3ZlIGFyZQorICAgZGVmaW5lZC4gICovCisjZW5kaWYKKyNkZWZpbmUgX19CSVRfVFlQRVNfREVGSU5FRF9fCTEKKworCisjaWZkZWYJX19VU0VfQlNECisvKiBJbiBCU0QgPHN5cy90eXBlcy5oPiBpcyBleHBlY3RlZCB0byBkZWZpbmUgQllURV9PUkRFUi4gICovCisjIGluY2x1ZGUgPGVuZGlhbi5oPgorCisvKiBJdCBhbHNvIGRlZmluZXMgYGZkX3NldCcgYW5kIHRoZSBGRF8qIG1hY3JvcyBmb3IgYHNlbGVjdCcuICAqLworIyBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisKKy8qIEJTRCBkZWZpbmVzIHRoZXNlIHN5bWJvbHMsIHNvIHdlIGZvbGxvdy4gICovCisjIGluY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworCisjaWYgKGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgpIFwKKyAgICAmJiAhZGVmaW5lZCBfX2Jsa3NpemVfdF9kZWZpbmVkCit0eXBlZGVmIF9fYmxrc2l6ZV90IGJsa3NpemVfdDsKKyMgZGVmaW5lIF9fYmxrc2l6ZV90X2RlZmluZWQKKyNlbmRpZgorCisvKiBUeXBlcyBmcm9tIHRoZSBMYXJnZSBGaWxlIFN1cHBvcnQgaW50ZXJmYWNlLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorIyBpZm5kZWYgX19ibGtjbnRfdF9kZWZpbmVkCit0eXBlZGVmIF9fYmxrY250X3QgYmxrY250X3Q7CSAvKiBUeXBlIHRvIGNvdW50IG51bWJlciBvZiBkaXNrIGJsb2Nrcy4gICovCisjICBkZWZpbmUgX19ibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmbmRlZiBfX2ZzYmxrY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2ZzYmxrY250X3QgZnNibGtjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBibG9ja3MuICAqLworIyAgZGVmaW5lIF9fZnNibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmbmRlZiBfX2ZzZmlsY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2ZzZmlsY250X3QgZnNmaWxjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBpbm9kZXMuICAqLworIyAgZGVmaW5lIF9fZnNmaWxjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjZWxzZQorIyBpZm5kZWYgX19ibGtjbnRfdF9kZWZpbmVkCit0eXBlZGVmIF9fYmxrY250NjRfdCBibGtjbnRfdDsJICAgLyogVHlwZSB0byBjb3VudCBudW1iZXIgb2YgZGlzayBibG9ja3MuICAqLworIyAgZGVmaW5lIF9fYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2Jsa2NudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2Jsa2NudDY0X3QgZnNibGtjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBibG9ja3MuICAqLworIyAgZGVmaW5lIF9fZnNibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmbmRlZiBfX2ZzZmlsY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2ZzZmlsY250NjRfdCBmc2ZpbGNudF90OyAvKiBUeXBlIHRvIGNvdW50IGZpbGUgc3lzdGVtIGlub2Rlcy4gICovCisjICBkZWZpbmUgX19mc2ZpbGNudF90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3R5cGVkZWYgX19ibGtjbnQ2NF90IGJsa2NudDY0X3Q7ICAgICAvKiBUeXBlIHRvIGNvdW50IG51bWJlciBvZiBkaXNrIGJsb2Nrcy4gKi8KK3R5cGVkZWYgX19mc2Jsa2NudDY0X3QgZnNibGtjbnQ2NF90OyAvKiBUeXBlIHRvIGNvdW50IGZpbGUgc3lzdGVtIGJsb2Nrcy4gICovCit0eXBlZGVmIF9fZnNmaWxjbnQ2NF90IGZzZmlsY250NjRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBpbm9kZXMuICAqLworI2VuZGlmCisKKworLyogTm93IGFkZCB0aGUgdGhyZWFkIHR5cGVzLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYMTk5NTA2IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CisjIGluY2x1ZGUgPGJpdHMvcHRocmVhZHR5cGVzLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy90eXBlcy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91Y29udGV4dC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdWNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ3NGM3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdWNvbnRleHQuaApAQCAtMCwwICsxLDEyOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVUNPTlRFWFRfSAorI2RlZmluZSBfU1lTX1VDT05URVhUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworLyogV2UgbmVlZCB0aGUgc2lnbmFsIGNvbnRleHQgZGVmaW5pdGlvbnMgZXZlbiBpZiB0aGV5IGFyZSBub3QgdXNlZAorICAgaW5jbHVkZWQgaW4gPHNpZ25hbC5oPi4gICovCisjaW5jbHVkZSA8Yml0cy9zaWdjb250ZXh0Lmg+CisKKworLyogVHlwZSBmb3IgZ2VuZXJhbCByZWdpc3Rlci4gICovCit0eXBlZGVmIGludCBncmVnX3Q7CisKKy8qIE51bWJlciBvZiBnZW5lcmFsIHJlZ2lzdGVycy4gICovCisjZGVmaW5lIE5HUkVHCTE5CisKKy8qIENvbnRhaW5lciBmb3IgYWxsIGdlbmVyYWwgcmVnaXN0ZXJzLiAgKi8KK3R5cGVkZWYgZ3JlZ190IGdyZWdzZXRfdFtOR1JFR107CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIE51bWJlciBvZiBlYWNoIHJlZ2lzdGVyIGlzIHRoZSBgZ3JlZ3NldF90JyBhcnJheS4gICovCitlbnVtCit7CisgIFJFR19HUyA9IDAsCisjIGRlZmluZSBSRUdfR1MJCVJFR19HUworICBSRUdfRlMsCisjIGRlZmluZSBSRUdfRlMJCVJFR19GUworICBSRUdfRVMsCisjIGRlZmluZSBSRUdfRVMJCVJFR19FUworICBSRUdfRFMsCisjIGRlZmluZSBSRUdfRFMJCVJFR19EUworICBSRUdfRURJLAorIyBkZWZpbmUgUkVHX0VESQlSRUdfRURJCisgIFJFR19FU0ksCisjIGRlZmluZSBSRUdfRVNJCVJFR19FU0kKKyAgUkVHX0VCUCwKKyMgZGVmaW5lIFJFR19FQlAJUkVHX0VCUAorICBSRUdfRVNQLAorIyBkZWZpbmUgUkVHX0VTUAlSRUdfRVNQCisgIFJFR19FQlgsCisjIGRlZmluZSBSRUdfRUJYCVJFR19FQlgKKyAgUkVHX0VEWCwKKyMgZGVmaW5lIFJFR19FRFgJUkVHX0VEWAorICBSRUdfRUNYLAorIyBkZWZpbmUgUkVHX0VDWAlSRUdfRUNYCisgIFJFR19FQVgsCisjIGRlZmluZSBSRUdfRUFYCVJFR19FQVgKKyAgUkVHX1RSQVBOTywKKyMgZGVmaW5lIFJFR19UUkFQTk8JUkVHX1RSQVBOTworICBSRUdfRVJSLAorIyBkZWZpbmUgUkVHX0VSUglSRUdfRVJSCisgIFJFR19FSVAsCisjIGRlZmluZSBSRUdfRUlQCVJFR19FSVAKKyAgUkVHX0NTLAorIyBkZWZpbmUgUkVHX0NTCQlSRUdfQ1MKKyAgUkVHX0VGTCwKKyMgZGVmaW5lIFJFR19FRkwJUkVHX0VGTAorICBSRUdfVUVTUCwKKyMgZGVmaW5lIFJFR19VRVNQCVJFR19VRVNQCisgIFJFR19TUworIyBkZWZpbmUgUkVHX1NTCVJFR19TUworfTsKKyNlbmRpZgorCisvKiBEZWZpbml0aW9ucyB0YWtlbiBmcm9tIHRoZSBrZXJuZWwgaGVhZGVycy4gICovCitzdHJ1Y3QgX2xpYmNfZnByZWcKK3sKKyAgdW5zaWduZWQgc2hvcnQgaW50IHNpZ25pZmljYW5kWzRdOworICB1bnNpZ25lZCBzaG9ydCBpbnQgZXhwb25lbnQ7Cit9OworCitzdHJ1Y3QgX2xpYmNfZnBzdGF0ZQoreworICB1bnNpZ25lZCBsb25nIGludCBjdzsKKyAgdW5zaWduZWQgbG9uZyBpbnQgc3c7CisgIHVuc2lnbmVkIGxvbmcgaW50IHRhZzsKKyAgdW5zaWduZWQgbG9uZyBpbnQgaXBvZmY7CisgIHVuc2lnbmVkIGxvbmcgaW50IGNzc2VsOworICB1bnNpZ25lZCBsb25nIGludCBkYXRhb2ZmOworICB1bnNpZ25lZCBsb25nIGludCBkYXRhc2VsOworICBzdHJ1Y3QgX2xpYmNfZnByZWcgX3N0WzhdOworICB1bnNpZ25lZCBsb25nIGludCBzdGF0dXM7Cit9OworCisvKiBTdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgRlBVIHJlZ2lzdGVycy4gICovCit0eXBlZGVmIHN0cnVjdCBfbGliY19mcHN0YXRlICpmcHJlZ3NldF90OworCisvKiBDb250ZXh0IHRvIGRlc2NyaWJlIHdob2xlIHByb2Nlc3NvciBzdGF0ZS4gICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgZ3JlZ3NldF90IGdyZWdzOworICAgIC8qIER1ZSB0byBMaW51eCdzIGhpc3Rvcnkgd2UgaGF2ZSB0byB1c2UgYSBwb2ludGVyIGhlcmUuICBUaGUgU3lzVi9pMzg2CisgICAgICAgQUJJIHJlcXVpcmVzIGEgc3RydWN0IHdpdGggdGhlIHZhbHVlcy4gICovCisgICAgZnByZWdzZXRfdCBmcHJlZ3M7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgb2xkbWFzazsKKyAgICB1bnNpZ25lZCBsb25nIGludCBjcjI7CisgIH0gbWNvbnRleHRfdDsKKworLyogVXNlcmxldmVsIGNvbnRleHQuICAqLwordHlwZWRlZiBzdHJ1Y3QgdWNvbnRleHQKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IHVjX2ZsYWdzOworICAgIHN0cnVjdCB1Y29udGV4dCAqdWNfbGluazsKKyAgICBzdGFja190IHVjX3N0YWNrOworICAgIG1jb250ZXh0X3QgdWNfbWNvbnRleHQ7CisgICAgX19zaWdzZXRfdCB1Y19zaWdtYXNrOworICAgIHN0cnVjdCBfbGliY19mcHN0YXRlIF9fZnByZWdzX21lbTsKKyAgfSB1Y29udGV4dF90OworCisjZW5kaWYgLyogc3lzL3Vjb250ZXh0LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Vpby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyYjdlZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Vpby5oCkBAIC0wLDAgKzEsMTIzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsMTk5MiwxOTk2LTE5OTksMjAwMywyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVUlPX0gKKyNkZWZpbmUgX1NZU19VSU9fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVGhpcyBmaWxlIGRlZmluZXMgYHN0cnVjdCBpb3ZlYycuICAqLworI2luY2x1ZGUgPGJpdHMvdWlvLmg+CisKKworLyogUmVhZCBkYXRhIGZyb20gZmlsZSBkZXNjcmlwdG9yIEZELCBhbmQgcHV0IHRoZSByZXN1bHQgaW4gdGhlCisgICBidWZmZXJzIGRlc2NyaWJlZCBieSBJT1ZFQywgd2hpY2ggaXMgYSB2ZWN0b3Igb2YgQ09VTlQgJ3N0cnVjdCBpb3ZlYydzLgorICAgVGhlIGJ1ZmZlcnMgYXJlIGZpbGxlZCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLgorICAgT3BlcmF0ZXMganVzdCBsaWtlICdyZWFkJyAoc2VlIDx1bmlzdGQuaD4pIGV4Y2VwdCB0aGF0IGRhdGEgYXJlCisgICBwdXQgaW4gSU9WRUMgaW5zdGVhZCBvZiBhIGNvbnRpZ3VvdXMgYnVmZmVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHJlYWR2IChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9faW92ZWMsIGludCBfX2NvdW50KQorICBfX3d1cjsKKworLyogV3JpdGUgZGF0YSBwb2ludGVkIGJ5IHRoZSBidWZmZXJzIGRlc2NyaWJlZCBieSBJT1ZFQywgd2hpY2gKKyAgIGlzIGEgdmVjdG9yIG9mIENPVU5UICdzdHJ1Y3QgaW92ZWMncywgdG8gZmlsZSBkZXNjcmlwdG9yIEZELgorICAgVGhlIGRhdGEgaXMgd3JpdHRlbiBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLgorICAgT3BlcmF0ZXMganVzdCBsaWtlICd3cml0ZScgKHNlZSA8dW5pc3RkLmg+KSBleGNlcHQgdGhhdCB0aGUgZGF0YQorICAgYXJlIHRha2VuIGZyb20gSU9WRUMgaW5zdGVhZCBvZiBhIGNvbnRpZ3VvdXMgYnVmZmVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHdyaXRldiAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdmVjLCBpbnQgX19jb3VudCkKKyAgX193dXI7CisKKworI2lmZGVmIF9fVVNFX0JTRAorIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorLyogUmVhZCBkYXRhIGZyb20gZmlsZSBkZXNjcmlwdG9yIEZEIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBPRkZTRVQKKyAgIHdpdGhvdXQgY2hhbmdlIHRoZSBmaWxlIHBvaW50ZXIsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiB0aGUgYnVmZmVycworICAgZGVzY3JpYmVkIGJ5IElPVkVDLCB3aGljaCBpcyBhIHZlY3RvciBvZiBDT1VOVCAnc3RydWN0IGlvdmVjJ3MuCisgICBUaGUgYnVmZmVycyBhcmUgZmlsbGVkIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuICBPcGVyYXRlcyBqdXN0IGxpa2UKKyAgICdwcmVhZCcgKHNlZSA8dW5pc3RkLmg+KSBleGNlcHQgdGhhdCBkYXRhIGFyZSBwdXQgaW4gSU9WRUMgaW5zdGVhZAorICAgb2YgYSBjb250aWd1b3VzIGJ1ZmZlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCBwcmVhZHYgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19pb3ZlYywgaW50IF9fY291bnQsCisJCSAgICAgICBfX29mZl90IF9fb2Zmc2V0KSBfX3d1cjsKKworLyogV3JpdGUgZGF0YSBwb2ludGVkIGJ5IHRoZSBidWZmZXJzIGRlc2NyaWJlZCBieSBJT1ZFQywgd2hpY2ggaXMgYQorICAgdmVjdG9yIG9mIENPVU5UICdzdHJ1Y3QgaW92ZWMncywgdG8gZmlsZSBkZXNjcmlwdG9yIEZEIGF0IHRoZSBnaXZlbgorICAgcG9zaXRpb24gT0ZGU0VUIHdpdGhvdXQgY2hhbmdlIHRoZSBmaWxlIHBvaW50ZXIuICBUaGUgZGF0YSBpcworICAgd3JpdHRlbiBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLiAgT3BlcmF0ZXMganVzdCBsaWtlICdwd3JpdGUnIChzZWUKKyAgIDx1bmlzdGQuaD4pIGV4Y2VwdCB0aGF0IHRoZSBkYXRhIGFyZSB0YWtlbiBmcm9tIElPVkVDIGluc3RlYWQgb2YgYQorICAgY29udGlndW91cyBidWZmZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgcHdyaXRldiAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdmVjLCBpbnQgX19jb3VudCwKKwkJCV9fb2ZmX3QgX19vZmZzZXQpIF9fd3VyOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChwcmVhZHYsIChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9faW92ZWMsCisJCQkJICAgIGludCBfX2NvdW50LCBfX29mZjY0X3QgX19vZmZzZXQpLAorCQkJICAgcHJlYWR2NjQpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAocHdyaXRldiwgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19pb3ZlYywKKwkJCQkgICAgIGludCBfX2NvdW50LCBfX29mZjY0X3QgX19vZmZzZXQpLAorCQkJICAgcHdyaXRldjY0KSBfX3d1cjsKKyMgIGVsc2UKKyMgICBkZWZpbmUgcHJlYWR2IHByZWFkdjY0CisjICAgZGVmaW5lIHB3cml0ZXYgcHdyaXRldjY0CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CisvKiBSZWFkIGRhdGEgZnJvbSBmaWxlIGRlc2NyaXB0b3IgRkQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIE9GRlNFVAorICAgd2l0aG91dCBjaGFuZ2UgdGhlIGZpbGUgcG9pbnRlciwgYW5kIHB1dCB0aGUgcmVzdWx0IGluIHRoZSBidWZmZXJzCisgICBkZXNjcmliZWQgYnkgSU9WRUMsIHdoaWNoIGlzIGEgdmVjdG9yIG9mIENPVU5UICdzdHJ1Y3QgaW92ZWMncy4KKyAgIFRoZSBidWZmZXJzIGFyZSBmaWxsZWQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4gIE9wZXJhdGVzIGp1c3QgbGlrZQorICAgJ3ByZWFkJyAoc2VlIDx1bmlzdGQuaD4pIGV4Y2VwdCB0aGF0IGRhdGEgYXJlIHB1dCBpbiBJT1ZFQyBpbnN0ZWFkCisgICBvZiBhIGNvbnRpZ3VvdXMgYnVmZmVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHByZWFkdjY0IChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9faW92ZWMsIGludCBfX2NvdW50LAorCQkJIF9fb2ZmNjRfdCBfX29mZnNldCkgX193dXI7CisKKy8qIFdyaXRlIGRhdGEgcG9pbnRlZCBieSB0aGUgYnVmZmVycyBkZXNjcmliZWQgYnkgSU9WRUMsIHdoaWNoIGlzIGEKKyAgIHZlY3RvciBvZiBDT1VOVCAnc3RydWN0IGlvdmVjJ3MsIHRvIGZpbGUgZGVzY3JpcHRvciBGRCBhdCB0aGUgZ2l2ZW4KKyAgIHBvc2l0aW9uIE9GRlNFVCB3aXRob3V0IGNoYW5nZSB0aGUgZmlsZSBwb2ludGVyLiAgVGhlIGRhdGEgaXMKKyAgIHdyaXR0ZW4gaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4gIE9wZXJhdGVzIGp1c3QgbGlrZSAncHdyaXRlJyAoc2VlCisgICA8dW5pc3RkLmg+KSBleGNlcHQgdGhhdCB0aGUgZGF0YSBhcmUgdGFrZW4gZnJvbSBJT1ZFQyBpbnN0ZWFkIG9mIGEKKyAgIGNvbnRpZ3VvdXMgYnVmZmVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHB3cml0ZXY2NCAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdmVjLCBpbnQgX19jb3VudCwKKwkJCSAgX19vZmY2NF90IF9fb2Zmc2V0KSBfX3d1cjsKKyMgZW5kaWYKKyNlbmRpZgkvKiBVc2UgQlNEICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdWlvLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3VsdHJhc291bmQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3VsdHJhc291bmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjVjMzg1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdWx0cmFzb3VuZC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC91bHRyYXNvdW5kLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91bi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmExMGU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdW4uaApAQCAtMCwwICsxLDQ3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTUsIDE5OTYsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19VTl9ICisjZGVmaW5lCV9TWVNfVU5fSAkxCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworLyogR2V0IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBtYWNybyB0byBkZWZpbmUgdGhlIGNvbW1vbiBzb2NrYWRkciBtZW1iZXJzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NvY2thZGRyLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGFkZHJlc3Mgb2YgYW4gQUZfTE9DQUwgKGFrYSBBRl9VTklYKSBzb2NrZXQuICAqLworc3RydWN0IHNvY2thZGRyX3VuCisgIHsKKyAgICBfX1NPQ0tBRERSX0NPTU1PTiAoc3VuXyk7CisgICAgY2hhciBzdW5fcGF0aFsxMDhdOwkJLyogUGF0aCBuYW1lLiAgKi8KKyAgfTsKKworCisjaWZkZWYgX19VU0VfTUlTQworIyBpbmNsdWRlIDxzdHJpbmcuaD4JCS8qIEZvciBwcm90b3R5cGUgb2YgYHN0cmxlbicuICAqLworCisvKiBFdmFsdWF0ZSB0byBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBgc29ja2FkZHJfdW4nIHN0cnVjdHVyZS4gICovCisjIGRlZmluZSBTVU5fTEVOKHB0cikgKChzaXplX3QpICgoKHN0cnVjdCBzb2NrYWRkcl91biAqKSAwKS0+c3VuX3BhdGgpCSAgICAgIFwKKwkJICAgICAgKyBzdHJsZW4gKChwdHIpLT5zdW5fcGF0aCkpCisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy91bi5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdW5pc3RkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91bmlzdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTgyM2ZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdW5pc3RkLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdXNlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTQ2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91c2VyLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OCwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1VTRVJfSAorI2RlZmluZSBfU1lTX1VTRVJfSAkxCisKKy8qIFRoZSB3aG9sZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyBmb3IgR0RCIGFuZCBHREIgb25seS4gIERvbid0IHJlYWQKKyAgIHRvbyBtdWNoIGludG8gaXQuICBEb24ndCB1c2UgaXQgZm9yIGFueXRoaW5nIG90aGVyIHRoYW4gR0RCIHVubGVzcworICAgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiAgKi8KKworc3RydWN0IHVzZXJfZnByZWdzX3N0cnVjdAoreworICBsb25nIGludCBjd2Q7CisgIGxvbmcgaW50IHN3ZDsKKyAgbG9uZyBpbnQgdHdkOworICBsb25nIGludCBmaXA7CisgIGxvbmcgaW50IGZjczsKKyAgbG9uZyBpbnQgZm9vOworICBsb25nIGludCBmb3M7CisgIGxvbmcgaW50IHN0X3NwYWNlIFsyMF07Cit9OworCitzdHJ1Y3QgdXNlcl9mcHhyZWdzX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCBpbnQgY3dkOworICB1bnNpZ25lZCBzaG9ydCBpbnQgc3dkOworICB1bnNpZ25lZCBzaG9ydCBpbnQgdHdkOworICB1bnNpZ25lZCBzaG9ydCBpbnQgZm9wOworICBsb25nIGludCBmaXA7CisgIGxvbmcgaW50IGZjczsKKyAgbG9uZyBpbnQgZm9vOworICBsb25nIGludCBmb3M7CisgIGxvbmcgaW50IG14Y3NyOworICBsb25nIGludCByZXNlcnZlZDsKKyAgbG9uZyBpbnQgc3Rfc3BhY2VbMzJdOyAgIC8qIDgqMTYgYnl0ZXMgZm9yIGVhY2ggRlAtcmVnID0gMTI4IGJ5dGVzICovCisgIGxvbmcgaW50IHhtbV9zcGFjZVszMl07ICAvKiA4KjE2IGJ5dGVzIGZvciBlYWNoIFhNTS1yZWcgPSAxMjggYnl0ZXMgKi8KKyAgbG9uZyBpbnQgcGFkZGluZ1s1Nl07Cit9OworCitzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdAoreworICBsb25nIGludCBlYng7CisgIGxvbmcgaW50IGVjeDsKKyAgbG9uZyBpbnQgZWR4OworICBsb25nIGludCBlc2k7CisgIGxvbmcgaW50IGVkaTsKKyAgbG9uZyBpbnQgZWJwOworICBsb25nIGludCBlYXg7CisgIGxvbmcgaW50IHhkczsKKyAgbG9uZyBpbnQgeGVzOworICBsb25nIGludCB4ZnM7CisgIGxvbmcgaW50IHhnczsKKyAgbG9uZyBpbnQgb3JpZ19lYXg7CisgIGxvbmcgaW50IGVpcDsKKyAgbG9uZyBpbnQgeGNzOworICBsb25nIGludCBlZmxhZ3M7CisgIGxvbmcgaW50IGVzcDsKKyAgbG9uZyBpbnQgeHNzOworfTsKKworc3RydWN0IHVzZXIKK3sKKyAgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QJcmVnczsKKyAgaW50CQkJCXVfZnB2YWxpZDsKKyAgc3RydWN0IHVzZXJfZnByZWdzX3N0cnVjdAlpMzg3OworICB1bnNpZ25lZCBsb25nIGludAkJdV90c2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCXVfZHNpemU7CisgIHVuc2lnbmVkIGxvbmcgaW50CQl1X3NzaXplOworICB1bnNpZ25lZCBsb25nCQkJc3RhcnRfY29kZTsKKyAgdW5zaWduZWQgbG9uZwkJCXN0YXJ0X3N0YWNrOworICBsb25nIGludAkJCXNpZ25hbDsKKyAgaW50CQkJCXJlc2VydmVkOworICBzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCoJdV9hcjA7CisgIHN0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QqCXVfZnBzdGF0ZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCW1hZ2ljOworICBjaGFyCQkJCXVfY29tbSBbMzJdOworICBpbnQJCQkJdV9kZWJ1Z3JlZyBbOF07Cit9OworCisjZGVmaW5lIFBBR0VfU0hJRlQJCTEyCisjZGVmaW5lIFBBR0VfU0laRQkJKDFVTCA8PCBQQUdFX1NISUZUKQorI2RlZmluZSBQQUdFX01BU0sJCSh+KFBBR0VfU0laRS0xKSkKKyNkZWZpbmUgTkJQRwkJCVBBR0VfU0laRQorI2RlZmluZSBVUEFHRVMJCQkxCisjZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSCSh1LnN0YXJ0X2NvZGUpCisjZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIJKHUuc3RhcnRfc3RhY2sgKyB1LnVfc3NpemUgKiBOQlBHKQorCisjZW5kaWYJLyogX1NZU19VU0VSX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3VzdGF0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91c3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOWNkYWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91c3RhdC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIEhlYWRlciBkZXNjcmliaW5nIG9ic29sZXRlIGB1c3RhdCcgaW50ZXJmYWNlLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogVGhpcyBpbnRlcmZhY2UgaXMgb2Jzb2xldGUuICBVc2UgPHN5cy9zdGF0ZnMuaD4gaW5zdGVhZC4KKyAqLworCisjaWZuZGVmIF9TWVNfVVNUQVRfSAorI2RlZmluZQlfU1lTX1VTVEFUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMvdXN0YXQuaD4KKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IHVzdGF0IChfX2Rldl90IF9fZGV2LCBzdHJ1Y3QgdXN0YXQgKl9fdWJ1ZikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy91c3RhdC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91dHNuYW1lLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91dHNuYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzYWFiOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3V0c25hbWUuaApAQCAtMCwwICsxLDg3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsOTQsOTYsOTcsOTksMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVBPU0lYIFN0YW5kYXJkOiA0LjQgU3lzdGVtIElkZW50aWZpY2F0aW9uCTxzeXMvdXRzbmFtZS5oPgorICovCisKKyNpZm5kZWYJX1NZU19VVFNOQU1FX0gKKyNkZWZpbmUJX1NZU19VVFNOQU1FX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Yml0cy91dHNuYW1lLmg+CisKKyNpZm5kZWYgX1VUU05BTUVfU1lTTkFNRV9MRU5HVEgKKyMgZGVmaW5lIF9VVFNOQU1FX1NZU05BTUVfTEVOR1RIIF9VVFNOQU1FX0xFTkdUSAorI2VuZGlmCisjaWZuZGVmIF9VVFNOQU1FX05PREVOQU1FX0xFTkdUSAorIyBkZWZpbmUgX1VUU05BTUVfTk9ERU5BTUVfTEVOR1RIIF9VVFNOQU1FX0xFTkdUSAorI2VuZGlmCisjaWZuZGVmIF9VVFNOQU1FX1JFTEVBU0VfTEVOR1RICisjIGRlZmluZSBfVVRTTkFNRV9SRUxFQVNFX0xFTkdUSCBfVVRTTkFNRV9MRU5HVEgKKyNlbmRpZgorI2lmbmRlZiBfVVRTTkFNRV9WRVJTSU9OX0xFTkdUSAorIyBkZWZpbmUgX1VUU05BTUVfVkVSU0lPTl9MRU5HVEggX1VUU05BTUVfTEVOR1RICisjZW5kaWYKKyNpZm5kZWYgX1VUU05BTUVfTUFDSElORV9MRU5HVEgKKyMgZGVmaW5lIF9VVFNOQU1FX01BQ0hJTkVfTEVOR1RIIF9VVFNOQU1FX0xFTkdUSAorI2VuZGlmCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBzeXN0ZW0gYW5kIG1hY2hpbmUuICAqLworc3RydWN0IHV0c25hbWUKKyAgeworICAgIC8qIE5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgKi8KKyAgICBjaGFyIHN5c25hbWVbX1VUU05BTUVfU1lTTkFNRV9MRU5HVEhdOworCisgICAgLyogTmFtZSBvZiB0aGlzIG5vZGUgb24gdGhlIG5ldHdvcmsuICAqLworICAgIGNoYXIgbm9kZW5hbWVbX1VUU05BTUVfTk9ERU5BTUVfTEVOR1RIXTsKKworICAgIC8qIEN1cnJlbnQgcmVsZWFzZSBsZXZlbCBvZiB0aGlzIGltcGxlbWVudGF0aW9uLiAgKi8KKyAgICBjaGFyIHJlbGVhc2VbX1VUU05BTUVfUkVMRUFTRV9MRU5HVEhdOworICAgIC8qIEN1cnJlbnQgdmVyc2lvbiBsZXZlbCBvZiB0aGlzIHJlbGVhc2UuICAqLworICAgIGNoYXIgdmVyc2lvbltfVVRTTkFNRV9WRVJTSU9OX0xFTkdUSF07CisKKyAgICAvKiBOYW1lIG9mIHRoZSBoYXJkd2FyZSB0eXBlIHRoZSBzeXN0ZW0gaXMgcnVubmluZyBvbi4gICovCisgICAgY2hhciBtYWNoaW5lW19VVFNOQU1FX01BQ0hJTkVfTEVOR1RIXTsKKworI2lmIF9VVFNOQU1FX0RPTUFJTl9MRU5HVEggLSAwCisgICAgLyogTmFtZSBvZiB0aGUgZG9tYWluIG9mIHRoaXMgbm9kZSBvbiB0aGUgbmV0d29yay4gICovCisjIGlmZGVmIF9fVVNFX0dOVQorICAgIGNoYXIgZG9tYWlubmFtZVtfVVRTTkFNRV9ET01BSU5fTEVOR1RIXTsKKyMgZWxzZQorICAgIGNoYXIgX19kb21haW5uYW1lW19VVFNOQU1FX0RPTUFJTl9MRU5HVEhdOworIyBlbmRpZgorI2VuZGlmCisgIH07CisKKyNpZmRlZiBfX1VTRV9TVklECisvKiBOb3RlIHRoYXQgU1ZJRCBhc3N1bWVzIGFsbCBtZW1iZXJzIGhhdmUgdGhlIHNhbWUgc2l6ZS4gICovCisjIGRlZmluZSBTWVNfTk1MTiAgX1VUU05BTUVfTEVOR1RICisjZW5kaWYKKworCisvKiBQdXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5c3RlbSBpbiBOQU1FLiAgKi8KK2V4dGVybiBpbnQgdW5hbWUgKHN0cnVjdCB1dHNuYW1lICpfX25hbWUpIF9fVEhST1c7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy91dHNuYW1lLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy92ZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Zmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMjJkMzEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy92ZnMuaApAQCAtMCwwICsxLDQgQEAKKy8qIE90aGVyIHN5c3RlbXMgZGVjbGFyZSBgc3RydWN0IHN0YXRmcycgZXQgYWwgaW4gPHN5cy92ZnMuaD4sCisgICBzbyB3ZSBoYXZlIHRoaXMgZmlsZSB0byBiZSBjb21wYXRpYmxlIHdpdGggcHJvZ3JhbXMgZXhwZWN0aW5nIGl0LiAgKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3ZsaW1pdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdmxpbWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3YTA5YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3ZsaW1pdC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1ZMSU1JVF9ICisjZGVmaW5lIF9TWVNfVkxJTUlUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUaGlzIGludGVyZmFjZSBpcyBvYnNvbGV0ZSwgYW5kIGlzIHN1cGVyc2VkZWQgYnkgPHN5cy9yZXNvdXJjZS5oPi4gICovCisKKy8qIEtpbmRzIG9mIHJlc291cmNlIGxpbWl0LiAgKi8KK2VudW0gX192bGltaXRfcmVzb3VyY2UKK3sKKyAgLyogU2V0dGluZyB0aGlzIG5vbi16ZXJvIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcmFpc2UgbGltaXRzLgorICAgICBPbmx5IHRoZSBzdXBlci11c2UgY2FuIHNldCBpdCB0byB6ZXJvLgorCisgICAgIFRoaXMgaXMgbm90IGltcGxlbWVudGVkIGluIHJlY2VudCB2ZXJzaW9ucyBvZiBCU0QsIG5vciBieQorICAgICB0aGUgR05VIEMgbGlicmFyeS4gICovCisgIExJTV9OT1JBSVNFLAorCisgIC8qIENQVSB0aW1lIGF2YWlsYWJsZSBmb3IgZWFjaCBwcm9jZXNzIChzZWNvbmRzKS4gICovCisgIExJTV9DUFUsCisKKyAgLyogTGFyZ2VzdCBmaWxlIHdoaWNoIGNhbiBiZSBjcmVhdGVkIChieXRlcykuICAqLworICBMSU1fRlNJWkUsCisKKyAgLyogTWF4aW11bSBzaXplIG9mIHRoZSBkYXRhIHNlZ21lbnQgKGJ5dGVzKS4gICovCisgIExJTV9EQVRBLAorCisgIC8qIE1heGltdW0gc2l6ZSBvZiB0aGUgc3RhY2sgc2VnbWVudCAoYnl0ZXMpLiAgKi8KKyAgTElNX1NUQUNLLAorCisgIC8qIExhcmdlc3QgY29yZSBmaWxlIHRoYXQgd2lsbCBiZSBjcmVhdGVkIChieXRlcykuICAqLworICBMSU1fQ09SRSwKKworICAvKiBSZXNpZGVudCBzZXQgc2l6ZSAoYnl0ZXMpLiAgKi8KKyAgTElNX01BWFJTUworfTsKKworLyogVGhpcyBtZWFucyBubyBsaW1pdC4gICovCisjZGVmaW5lIElORklOSVRZIDB4N2ZmZmZmZmYKKworCisvKiBTZXQgdGhlIHNvZnQgbGltaXQgZm9yIFJFU09VUkNFIHRvIGJlIFZBTFVFLgorICAgUmV0dXJucyAwIGZvciBzdWNjZXNzLCAtMSBmb3IgZmFpbHVyZS4gICovCitleHRlcm4gaW50IHZsaW1pdCAoZW51bSBfX3ZsaW1pdF9yZXNvdXJjZSBfX3Jlc291cmNlLCBpbnQgX192YWx1ZSkgX19USFJPVzsKKworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3ZsaW1pdC5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdm04Ni5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdm04Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNTE1MmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy92bTg2LmgKQEAgLTAsMCArMSwzNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5LCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVk04Nl9ICisKKyNkZWZpbmUgX1NZU19WTTg2X0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCBjb25zdGFudHMgYW5kIGRhdGEgdHlwZXMgZnJvbSBrZXJuZWwgaGVhZGVyIGZpbGUuICAqLworI2luY2x1ZGUgPGFzbS92bTg2Lmg+CisKK19fQkVHSU5fREVDTFMKKworLyogRW50ZXIgdmlydHVhbCA4MDg2IG1vZGUuICAqLworZXh0ZXJuIGludCB2bTg2ICh1bnNpZ25lZCBsb25nIGludCBfX3N1YmZ1bmN0aW9uLAorCQkgc3RydWN0IHZtODZwbHVzX3N0cnVjdCAqX19pbmZvKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogX1NZU19WTTg2X0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Z0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy92dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNGFiZmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy92dC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC92dC5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdnRpbWVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy92dGltZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdmM2E3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdnRpbWVzLmgKQEAgLTAsMCArMSw2OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVlRJTUVTX0gKKyNkZWZpbmUgX1NZU19WVElNRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoaXMgaW50ZXJmYWNlIGlzIG9ic29sZXRlOyB1c2UgYGdldHJ1c2FnZScgaW5zdGVhZC4gICovCisKKy8qIEdyYW51bGFyaXR5IG9mIHRoZSBgdm1fdXRpbWUnIGFuZCBgdm1fc3RpbWUnIGZpZWxkcyBvZiBhIGBzdHJ1Y3QgdnRpbWVzJy4KKyAgIChUaGlzIGlzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIG1hY2hpbmUncyBwb3dlciBzdXBwbHksIGluIEh6LikgICovCisjZGVmaW5lCVZUSU1FU19VTklUU19QRVJfU0VDT05ECTYwCisKK3N0cnVjdCB2dGltZXMKK3sKKyAgLyogVXNlciB0aW1lIHVzZWQgaW4gdW5pdHMgb2YgMS9WVElNRVNfVU5JVFNfUEVSX1NFQ09ORCBzZWNvbmRzLiAgKi8KKyAgaW50IHZtX3V0aW1lOworICAvKiBTeXN0ZW0gdGltZSB1c2VkIGluIHVuaXRzIG9mIDEvVlRJTUVTX1VOSVRTX1BFUl9TRUNPTkQgc2Vjb25kcy4gICovCisgIGludCB2bV9zdGltZTsKKworICAvKiBBbW91bnQgb2YgZGF0YSBhbmQgc3RhY2sgbWVtb3J5IHVzZWQgKGtpbG9ieXRlLXNlY29uZHMpLiAgKi8KKyAgdW5zaWduZWQgaW50IHZtX2lkc3JzczsKKyAgLyogQW1vdW50IG9mIHRleHQgbWVtb3J5IHVzZWQgKGtpbG9ieXRlLXNlY29uZHMpLiAgKi8KKyAgdW5zaWduZWQgaW50IHZtX2l4cnNzOworICAvKiBNYXhpbXVtIHJlc2lkZW50IHNldCBzaXplICh0ZXh0LCBkYXRhLCBhbmQgc3RhY2spIChraWxvYnl0ZXMpLiAgKi8KKyAgaW50IHZtX21heHJzczsKKworICAvKiBOdW1iZXIgb2YgaGFyZCBwYWdlIGZhdWx0cyAoaS5lLiB0aG9zZSB0aGF0IHJlcXVpcmVkIEkvTykuICAqLworICBpbnQgdm1fbWFqZmx0OworICAvKiBOdW1iZXIgb2Ygc29mdCBwYWdlIGZhdWx0cyAoaS5lLiB0aG9zZSBzZXJ2aWNlZCBieSByZWNsYWltaW5nCisgICAgIGEgcGFnZSBmcm9tIHRoZSBsaXN0IG9mIHBhZ2VzIGF3YWl0aW5nIHJlYWxsb2NhdGlvbi4gICovCisgIGludCB2bV9taW5mbHQ7CisKKyAgLyogTnVtYmVyIG9mIHRpbWVzIGEgcHJvY2VzcyB3YXMgc3dhcHBlZCBvdXQgb2YgcGh5c2ljYWwgbWVtb3J5LiAgKi8KKyAgaW50IHZtX25zd2FwOworCisgIC8qIE51bWJlciBvZiBpbnB1dCBvcGVyYXRpb25zIHZpYSB0aGUgZmlsZSBzeXN0ZW0uICBOb3RlOiBUaGlzCisgICAgIGFuZCBgcnVfb3VibG9jaycgZG8gbm90IGluY2x1ZGUgb3BlcmF0aW9ucyB3aXRoIHRoZSBjYWNoZS4gICovCisgIGludCB2bV9pbmJsazsKKyAgLyogTnVtYmVyIG9mIG91dHB1dCBvcGVyYXRpb25zIHZpYSB0aGUgZmlsZSBzeXN0ZW0uICAqLworICBpbnQgdm1fb3VibGs7Cit9OworCisvKiBJZiBDVVJSRU5UIGlzIG5vdCBOVUxMLCB3cml0ZSBzdGF0aXN0aWNzIGZvciB0aGUgY3VycmVudCBwcm9jZXNzIGludG8KKyAgICpDVVJSRU5ULiAgSWYgQ0hJTEQgaXMgbm90IE5VTEwsIHdyaXRlIHN0YXRpc3RpY3MgZm9yIGFsbCB0ZXJtaW5hdGVkIGNoaWxkCisgICBwcm9jZXNzZXMgaW50byAqQ0hJTEQuICBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIC0xIGZvciBmYWlsdXJlLiAgKi8KK2V4dGVybiBpbnQgdnRpbWVzIChzdHJ1Y3QgdnRpbWVzICogX19jdXJyZW50LCBzdHJ1Y3QgdnRpbWVzICogX19jaGlsZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy92dGltZXMuaCAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3dhaXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3dhaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZkNThmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvd2FpdC5oCkBAIC0wLDAgKzEsMTgyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwxOTk2LTIwMDEsMjAwMywyMDA0LDIwMDUsMjAwNywyMDA5LDIwMTAsMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogMy4yLjEgV2FpdCBmb3IgUHJvY2VzcyBUZXJtaW5hdGlvbgk8c3lzL3dhaXQuaD4KKyAqLworCisjaWZuZGVmCV9TWVNfV0FJVF9ICisjZGVmaW5lCV9TWVNfV0FJVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCisvKiBUaGVzZSBtYWNyb3MgY291bGQgYWxzbyBiZSBkZWZpbmVkIGluIDxzdGRsaWIuaD4uICAqLworI2lmICFkZWZpbmVkIF9TVERMSUJfSCB8fCAoIWRlZmluZWQgX19VU0VfWE9QRU4gJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySzgpCisvKiBUaGlzIHdpbGwgZGVmaW5lIHRoZSBgVyonIG1hY3JvcyBmb3IgdGhlIGZsYWcKKyAgIGJpdHMgdG8gYHdhaXRwaWQnLCBgd2FpdDMnLCBhbmQgYHdhaXQ0Jy4gICovCisjIGluY2x1ZGUgPGJpdHMvd2FpdGZsYWdzLmg+CisKKyMgaWZkZWYJX19VU0VfQlNECisKKy8qIExvdHMgb2YgaGFpciB0byBhbGxvdyB0cmFkaXRpb25hbCBCU0QgdXNlIG9mIGB1bmlvbiB3YWl0JworICAgYXMgd2VsbCBhcyBQT1NJWC4xIHVzZSBvZiBgaW50JyBmb3IgdGhlIHN0YXR1cyB3b3JkLiAgKi8KKworIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBfX1dBSVRfSU5UKHN0YXR1cykgXAorICAoX19leHRlbnNpb25fXyAoKCh1bmlvbiB7IF9fdHlwZW9mKHN0YXR1cykgX19pbjsgaW50IF9faTsgfSkgXAorCQkgICB7IC5fX2luID0gKHN0YXR1cykgfSkuX19pKSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19XQUlUX0lOVChzdGF0dXMpCSgqKF9fY29uc3QgaW50ICopICYoc3RhdHVzKSkKKyMgIGVuZGlmCisKKy8qIFRoaXMgaXMgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50IHRvIGB3YWl0Jy4gIFRoZSBmdW5reSB1bmlvbgorICAgY2F1c2VzIHJlZGVjbGFyYXRpb25zIHdpdGggZWl0aGVyIGBpbnQgKicgb3IgYHVuaW9uIHdhaXQgKicgdG8gYmUKKyAgIGFsbG93ZWQgd2l0aG91dCBjb21wbGFpbnQuICBfX1dBSVRfU1RBVFVTX0RFRk4gaXMgdGhlIHR5cGUgdXNlZCBpbgorICAgdGhlIGFjdHVhbCBmdW5jdGlvbiBkZWZpbml0aW9ucy4gICovCisKKyMgIGlmICFkZWZpbmVkIF9fR05VQ19fIHx8IF9fR05VQ19fIDwgMiB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCisjICAgZGVmaW5lIF9fV0FJVF9TVEFUVVMJdm9pZCAqCisjICAgZGVmaW5lIF9fV0FJVF9TVEFUVVNfREVGTgl2b2lkICoKKyMgIGVsc2UKKy8qIFRoaXMgd29ya3MgaW4gR0NDIDIuNi4xIGFuZCBsYXRlci4gICovCit0eXBlZGVmIHVuaW9uCisgIHsKKyAgICB1bmlvbiB3YWl0ICpfX3VwdHI7CisgICAgaW50ICpfX2lwdHI7CisgIH0gX19XQUlUX1NUQVRVUyBfX2F0dHJpYnV0ZV9fICgoX190cmFuc3BhcmVudF91bmlvbl9fKSk7CisjICAgZGVmaW5lIF9fV0FJVF9TVEFUVVNfREVGTglpbnQgKgorIyAgZW5kaWYKKworIyBlbHNlIC8qIERvbid0IHVzZSBCU0QuICAqLworCisjICBkZWZpbmUgX19XQUlUX0lOVChzdGF0dXMpCShzdGF0dXMpCisjICBkZWZpbmUgX19XQUlUX1NUQVRVUwkJaW50ICoKKyMgIGRlZmluZSBfX1dBSVRfU1RBVFVTX0RFRk4JaW50ICoKKworIyBlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworLyogVGhpcyB3aWxsIGRlZmluZSBhbGwgdGhlIGBfX1cqJyBtYWNyb3MuICAqLworIyBpbmNsdWRlIDxiaXRzL3dhaXRzdGF0dXMuaD4KKworIyBkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdHVzKQlfX1dFWElUU1RBVFVTIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBkZWZpbmUgV1RFUk1TSUcoc3RhdHVzKQlfX1dURVJNU0lHIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBkZWZpbmUgV1NUT1BTSUcoc3RhdHVzKQlfX1dTVE9QU0lHIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBkZWZpbmUgV0lGRVhJVEVEKHN0YXR1cykJX19XSUZFWElURUQgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXSUZTSUdOQUxFRChzdGF0dXMpCV9fV0lGU0lHTkFMRUQgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXSUZTVE9QUEVEKHN0YXR1cykJX19XSUZTVE9QUEVEIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBpZmRlZiBfX1dJRkNPTlRJTlVFRAorIyAgZGVmaW5lIFdJRkNPTlRJTlVFRChzdGF0dXMpCV9fV0lGQ09OVElOVUVEIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBlbmRpZgorI2VuZGlmCS8qIDxzdGRsaWIuaD4gbm90IGluY2x1ZGVkLiAgKi8KKworI2lmZGVmCV9fVVNFX0JTRAorIyBkZWZpbmUgV0NPUkVGTEFHCQlfX1dDT1JFRkxBRworIyBkZWZpbmUgV0NPUkVEVU1QKHN0YXR1cykJX19XQ09SRURVTVAgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXX0VYSVRDT0RFKHJldCwgc2lnKQlfX1dfRVhJVENPREUgKHJldCwgc2lnKQorIyBkZWZpbmUgV19TVE9QQ09ERShzaWcpCV9fV19TVE9QQ09ERSAoc2lnKQorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkIGJ5IHRoZSBgd2FpdGlkJyBmdW5jdGlvbi4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAordHlwZWRlZiBlbnVtCit7CisgIFBfQUxMLAkJLyogV2FpdCBmb3IgYW55IGNoaWxkLiAgKi8KKyAgUF9QSUQsCQkvKiBXYWl0IGZvciBzcGVjaWZpZWQgcHJvY2Vzcy4gICovCisgIFBfUEdJRAkJLyogV2FpdCBmb3IgbWVtYmVycyBvZiBwcm9jZXNzIGdyb3VwLiAgKi8KK30gaWR0eXBlX3Q7CisjZW5kaWYKKworCisvKiBXYWl0IGZvciBhIGNoaWxkIHRvIGRpZS4gIFdoZW4gb25lIGRvZXMsIHB1dCBpdHMgc3RhdHVzIGluICpTVEFUX0xPQworICAgYW5kIHJldHVybiBpdHMgcHJvY2VzcyBJRC4gIEZvciBlcnJvcnMsIHJldHVybiAocGlkX3QpIC0xLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBfX3BpZF90IHdhaXQgKF9fV0FJVF9TVEFUVVMgX19zdGF0X2xvYyk7CisKKyNpZmRlZglfX1VTRV9CU0QKKy8qIFNwZWNpYWwgdmFsdWVzIGZvciB0aGUgUElEIGFyZ3VtZW50IHRvIGB3YWl0cGlkJyBhbmQgYHdhaXQ0Jy4gICovCisjIGRlZmluZSBXQUlUX0FOWQkoLTEpCS8qIEFueSBwcm9jZXNzLiAgKi8KKyMgZGVmaW5lIFdBSVRfTVlQR1JQCTAJLyogQW55IHByb2Nlc3MgaW4gbXkgcHJvY2VzcyBncm91cC4gICovCisjZW5kaWYKKworLyogV2FpdCBmb3IgYSBjaGlsZCBtYXRjaGluZyBQSUQgdG8gZGllLgorICAgSWYgUElEIGlzIGdyZWF0ZXIgdGhhbiAwLCBtYXRjaCBhbnkgcHJvY2VzcyB3aG9zZSBwcm9jZXNzIElEIGlzIFBJRC4KKyAgIElmIFBJRCBpcyAocGlkX3QpIC0xLCBtYXRjaCBhbnkgcHJvY2Vzcy4KKyAgIElmIFBJRCBpcyAocGlkX3QpIDAsIG1hdGNoIGFueSBwcm9jZXNzIHdpdGggdGhlCisgICBzYW1lIHByb2Nlc3MgZ3JvdXAgYXMgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAgIElmIFBJRCBpcyBsZXNzIHRoYW4gLTEsIG1hdGNoIGFueSBwcm9jZXNzIHdob3NlCisgICBwcm9jZXNzIGdyb3VwIGlzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBQSUQuCisgICBJZiB0aGUgV05PSEFORyBiaXQgaXMgc2V0IGluIE9QVElPTlMsIGFuZCB0aGF0IGNoaWxkCisgICBpcyBub3QgYWxyZWFkeSBkZWFkLCByZXR1cm4gKHBpZF90KSAwLiAgSWYgc3VjY2Vzc2Z1bCwKKyAgIHJldHVybiBQSUQgYW5kIHN0b3JlIHRoZSBkZWFkIGNoaWxkJ3Mgc3RhdHVzIGluIFNUQVRfTE9DLgorICAgUmV0dXJuIChwaWRfdCkgLTEgZm9yIGVycm9ycy4gIElmIHRoZSBXVU5UUkFDRUQgYml0IGlzCisgICBzZXQgaW4gT1BUSU9OUywgcmV0dXJuIHN0YXR1cyBmb3Igc3RvcHBlZCBjaGlsZHJlbjsgb3RoZXJ3aXNlIGRvbid0LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBfX3BpZF90IHdhaXRwaWQgKF9fcGlkX3QgX19waWQsIGludCAqX19zdGF0X2xvYywgaW50IF9fb3B0aW9ucyk7CisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisjIGRlZmluZSBfX25lZWRfc2lnaW5mb190CisjIGluY2x1ZGUgPGJpdHMvc2lnaW5mby5oPgorLyogV2FpdCBmb3IgYSBjaGlsZGluZyBtYXRjaGluZyBJRFRZUEUgYW5kIElEIHRvIGNoYW5nZSB0aGUgc3RhdHVzIGFuZAorICAgcGxhY2UgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24gaW4gKklORk9QLgorICAgSWYgSURUWVBFIGlzIFBfUElELCBtYXRjaCBhbnkgcHJvY2VzcyB3aG9zZSBwcm9jZXNzIElEIGlzIElELgorICAgSWYgSURUWVBFIGlzIFBfUEdJRCwgbWF0Y2ggYW55IHByb2Nlc3Mgd2hvc2UgcHJvY2VzcyBncm91cCBpcyBJRC4KKyAgIElmIElEVFlQRSBpcyBQX0FMTCwgbWF0Y2ggYW55IHByb2Nlc3MuCisgICBJZiB0aGUgV05PSEFORyBiaXQgaXMgc2V0IGluIE9QVElPTlMsIGFuZCB0aGF0IGNoaWxkCisgICBpcyBub3QgYWxyZWFkeSBkZWFkLCBjbGVhciAqSU5GT1AgYW5kIHJldHVybiAwLiAgSWYgc3VjY2Vzc2Z1bCwgc3RvcmUKKyAgIGV4aXQgY29kZSBhbmQgc3RhdHVzIGluICpJTkZPUC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHdhaXRpZCAoaWR0eXBlX3QgX19pZHR5cGUsIF9faWRfdCBfX2lkLCBzaWdpbmZvX3QgKl9faW5mb3AsCisJCSAgIGludCBfX29wdGlvbnMpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBUaGlzIGJlaW5nIGhlcmUgbWFrZXMgdGhlIHByb3RvdHlwZXMgdmFsaWQgd2hldGhlciBvciBub3QKKyAgIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCA8c3lzL3Jlc291cmNlLmg+IHRvIGRlZmluZSBgc3RydWN0IHJ1c2FnZScuICAqLworc3RydWN0IHJ1c2FnZTsKKworLyogV2FpdCBmb3IgYSBjaGlsZCB0byBleGl0LiAgV2hlbiBvbmUgZG9lcywgcHV0IGl0cyBzdGF0dXMgaW4gKlNUQVRfTE9DIGFuZAorICAgcmV0dXJuIGl0cyBwcm9jZXNzIElELiAgRm9yIGVycm9ycyByZXR1cm4gKHBpZF90KSAtMS4gIElmIFVTQUdFIGlzIG5vdAorICAgbmlsLCBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hpbGQncyByZXNvdXJjZSB1c2FnZSB0aGVyZS4gIElmIHRoZQorICAgV1VOVFJBQ0VEIGJpdCBpcyBzZXQgaW4gT1BUSU9OUywgcmV0dXJuIHN0YXR1cyBmb3Igc3RvcHBlZCBjaGlsZHJlbjsKKyAgIG90aGVyd2lzZSBkb24ndC4gICovCitleHRlcm4gX19waWRfdCB3YWl0MyAoX19XQUlUX1NUQVRVUyBfX3N0YXRfbG9jLCBpbnQgX19vcHRpb25zLAorCQkgICAgICBzdHJ1Y3QgcnVzYWdlICogX191c2FnZSkgX19USFJPV05MOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIFBJRCBpcyBsaWtlIHdhaXRwaWQuICBPdGhlciBhcmdzIGFyZSBsaWtlIHdhaXQzLiAgKi8KK2V4dGVybiBfX3BpZF90IHdhaXQ0IChfX3BpZF90IF9fcGlkLCBfX1dBSVRfU1RBVFVTIF9fc3RhdF9sb2MsIGludCBfX29wdGlvbnMsCisJCSAgICAgIHN0cnVjdCBydXNhZ2UgKl9fdXNhZ2UpIF9fVEhST1dOTDsKKyNlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3dhaXQuaCAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3hhdHRyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy94YXR0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MzdmOTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy94YXR0ci5oCkBAIC0wLDAgKzEsMTA0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19YQVRUUl9ICisjZGVmaW5lIF9TWVNfWEFUVFJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBmaWZ0aCBwYXJhbWV0ZXIgb2YKKyAgIGAqc2V0eGF0dHInLiAgKi8KK2VudW0KK3sKKyAgWEFUVFJfQ1JFQVRFID0gMSwJLyogc2V0IHZhbHVlLCBmYWlsIGlmIGF0dHIgYWxyZWFkeSBleGlzdHMuICAqLworI2RlZmluZSBYQVRUUl9DUkVBVEUJWEFUVFJfQ1JFQVRFCisgIFhBVFRSX1JFUExBQ0UgPSAyCS8qIHNldCB2YWx1ZSwgZmFpbCBpZiBhdHRyIGRvZXMgbm90IGV4aXN0LiAgKi8KKyNkZWZpbmUgWEFUVFJfUkVQTEFDRQlYQVRUUl9SRVBMQUNFCit9OworCisvKiBTZXQgdGhlIGF0dHJpYnV0ZSBOQU1FIG9mIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCB0byBWQUxVRSAod2hpY2gKKyAgIGlzIFNJWkUgYnl0ZXMgbG9uZykuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgc2V0eGF0dHIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSwKKwkJICAgICBfX2NvbnN0IHZvaWQgKl9fdmFsdWUsIHNpemVfdCBfX3NpemUsIGludCBfX2ZsYWdzKQorCV9fVEhST1c7CisKKy8qIFNldCB0aGUgYXR0cmlidXRlIE5BTUUgb2YgdGhlIGZpbGUgcG9pbnRlZCB0byBieSBQQVRIIHRvIFZBTFVFICh3aGljaCBpcworICAgU0laRSBieXRlcyBsb25nKSwgbm90IGZvbGxvd2luZyBzeW1saW5rcyBmb3IgdGhlIGxhc3QgcGF0aG5hbWUgY29tcG9uZW50LgorICAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IGxzZXR4YXR0ciAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fY29uc3QgY2hhciAqX19uYW1lLAorCQkgICAgICBfX2NvbnN0IHZvaWQgKl9fdmFsdWUsIHNpemVfdCBfX3NpemUsIGludCBfX2ZsYWdzKQorCV9fVEhST1c7CisKKy8qIFNldCB0aGUgYXR0cmlidXRlIE5BTUUgb2YgdGhlIGZpbGUgZGVzY3JpcHRvciBGRCB0byBWQUxVRSAod2hpY2ggaXMgU0laRQorICAgYnl0ZXMgbG9uZykuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgZnNldHhhdHRyIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX25hbWUsIF9fY29uc3Qgdm9pZCAqX192YWx1ZSwKKwkJICAgICAgc2l6ZV90IF9fc2l6ZSwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgYXR0cmlidXRlIE5BTUUgb2YgdGhlIGZpbGUgcG9pbnRlZCB0byBieSBQQVRIIHRvIFZBTFVFICh3aGljaCBpcworICAgU0laRSBieXRlcyBsb25nKS4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIHNzaXplX3QgZ2V0eGF0dHIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSwKKwkJCSB2b2lkICpfX3ZhbHVlLCBzaXplX3QgX19zaXplKSBfX1RIUk9XOworCisvKiBHZXQgdGhlIGF0dHJpYnV0ZSBOQU1FIG9mIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCB0byBWQUxVRSAod2hpY2ggaXMKKyAgIFNJWkUgYnl0ZXMgbG9uZyksIG5vdCBmb2xsb3dpbmcgc3ltbGlua3MgZm9yIHRoZSBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudC4KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIHNzaXplX3QgbGdldHhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19jb25zdCBjaGFyICpfX25hbWUsCisJCQkgIHZvaWQgKl9fdmFsdWUsIHNpemVfdCBfX3NpemUpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgYXR0cmlidXRlIE5BTUUgb2YgdGhlIGZpbGUgZGVzY3JpcHRvciBGRCB0byBWQUxVRSAod2hpY2ggaXMgU0laRQorICAgYnl0ZXMgbG9uZykuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBzc2l6ZV90IGZnZXR4YXR0ciAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19uYW1lLCB2b2lkICpfX3ZhbHVlLAorCQkJICBzaXplX3QgX19zaXplKSBfX1RIUk9XOworCisvKiBMaXN0IGF0dHJpYnV0ZXMgb2YgdGhlIGZpbGUgcG9pbnRlZCB0byBieSBQQVRIIGludG8gdGhlIHVzZXItc3VwcGxpZWQKKyAgIGJ1ZmZlciBMSVNUICh3aGljaCBpcyBTSVpFIGJ5dGVzIGJpZykuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IKKyAgIGVycm9ycy4gICovCitleHRlcm4gc3NpemVfdCBsaXN0eGF0dHIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBjaGFyICpfX2xpc3QsIHNpemVfdCBfX3NpemUpCisJX19USFJPVzsKKworLyogTGlzdCBhdHRyaWJ1dGVzIG9mIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCBpbnRvIHRoZSB1c2VyLXN1cHBsaWVkCisgICBidWZmZXIgTElTVCAod2hpY2ggaXMgU0laRSBieXRlcyBiaWcpLCBub3QgZm9sbG93aW5nIHN5bWxpbmtzIGZvciB0aGUKKyAgIGxhc3QgcGF0aG5hbWUgY29tcG9uZW50LiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gc3NpemVfdCBsbGlzdHhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgY2hhciAqX19saXN0LCBzaXplX3QgX19zaXplKQorCV9fVEhST1c7CisKKy8qIExpc3QgYXR0cmlidXRlcyBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yIEZEIGludG8gdGhlIHVzZXItc3VwcGxpZWQgYnVmZmVyCisgICBMSVNUICh3aGljaCBpcyBTSVpFIGJ5dGVzIGJpZykuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBzc2l6ZV90IGZsaXN0eGF0dHIgKGludCBfX2ZkLCBjaGFyICpfX2xpc3QsIHNpemVfdCBfX3NpemUpCisJX19USFJPVzsKKworLyogUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgTkFNRSBmcm9tIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSC4gIFJldHVybiAwCisgICBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgcmVtb3ZleGF0dHIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKKworLyogUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgTkFNRSBmcm9tIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCwgbm90CisgICBmb2xsb3dpbmcgc3ltbGlua3MgZm9yIHRoZSBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudC4gIFJldHVybiAwIG9uCisgICBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgbHJlbW92ZXhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CisKKy8qIFJlbW92ZSB0aGUgYXR0cmlidXRlIE5BTUUgZnJvbSB0aGUgZmlsZSBkZXNjcmlwdG9yIEZELiAgUmV0dXJuIDAgb24KKyAgIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBmcmVtb3ZleGF0dHIgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy94YXR0ci5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pY29udi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pY29udi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOWI3OWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2ljb252LmgKQEAgLTAsMCArMSw1NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAsIDIwMDMsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0lDT05WX0gKKyNkZWZpbmUgX0lDT05WX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogSWRlbnRpZmllciBmb3IgY29udmVyc2lvbiBtZXRob2QgZnJvbSBvbmUgY29kZXNldCB0byBhbm90aGVyLiAgKi8KK3R5cGVkZWYgdm9pZCAqaWNvbnZfdDsKKworCisvKiBBbGxvY2F0ZSBkZXNjcmlwdG9yIGZvciBjb2RlIGNvbnZlcnNpb24gZnJvbSBjb2Rlc2V0IEZST01DT0RFIHRvCisgICBjb2Rlc2V0IFRPQ09ERS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaWNvbnZfdCBpY29udl9vcGVuIChfX2NvbnN0IGNoYXIgKl9fdG9jb2RlLCBfX2NvbnN0IGNoYXIgKl9fZnJvbWNvZGUpOworCisvKiBDb252ZXJ0IGF0IG1vc3QgKklOQllURVNMRUZUIGJ5dGVzIGZyb20gKklOQlVGIGFjY29yZGluZyB0byB0aGUKKyAgIGNvZGUgY29udmVyc2lvbiBhbGdvcml0aG0gc3BlY2lmaWVkIGJ5IENEIGFuZCBwbGFjZSB1cCB0bworICAgKk9VVEJZVEVTTEVGVCBieXRlcyBpbiBidWZmZXIgYXQgKk9VVEJVRi4gICovCitleHRlcm4gc2l6ZV90IGljb252IChpY29udl90IF9fY2QsIGNoYXIgKipfX3Jlc3RyaWN0IF9faW5idWYsCisJCSAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9faW5ieXRlc2xlZnQsCisJCSAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19vdXRidWYsCisJCSAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fb3V0Ynl0ZXNsZWZ0KTsKKworLyogRnJlZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBkZXNjcmlwdG9yIENEIGZvciBjb2RlIGNvbnZlcnNpb24uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBpY29udl9jbG9zZSAoaWNvbnZfdCBfX2NkKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGljb252LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaWVlZTc1NC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pZWVlNzU0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3YzI5YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaWVlZTc1NC5oCkBAIC0wLDAgKzEsMTk5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTUsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0lFRUU3NTRfSAorCisjZGVmaW5lIF9JRUVFNzU0X0ggMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworX19CRUdJTl9ERUNMUworCit1bmlvbiBpZWVlNzU0X2Zsb2F0CisgIHsKKyAgICBmbG9hdCBmOworCisgICAgLyogVGhpcyBpcyB0aGUgSUVFRSA3NTQgc2luZ2xlLXByZWNpc2lvbiBmb3JtYXQuICAqLworICAgIHN0cnVjdAorICAgICAgeworI2lmCV9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6ODsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2E6MjM7CisjZW5kaWYJCQkJLyogQmlnIGVuZGlhbi4gICovCisjaWYJX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVuc2lnbmVkIGludCBtYW50aXNzYToyMzsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6ODsKKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKyNlbmRpZgkJCQkvKiBMaXR0bGUgZW5kaWFuLiAgKi8KKyAgICAgIH0gaWVlZTsKKworICAgIC8qIFRoaXMgZm9ybWF0IG1ha2VzIGl0IGVhc2llciB0byBzZWUgaWYgYSBOYU4gaXMgYSBzaWduYWxsaW5nIE5hTi4gICovCisgICAgc3RydWN0CisgICAgICB7CisjaWYJX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworCXVuc2lnbmVkIGludCBleHBvbmVudDo4OworCXVuc2lnbmVkIGludCBxdWlldF9uYW46MTsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2E6MjI7CisjZW5kaWYJCQkJLyogQmlnIGVuZGlhbi4gICovCisjaWYJX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVuc2lnbmVkIGludCBtYW50aXNzYToyMjsKKwl1bnNpZ25lZCBpbnQgcXVpZXRfbmFuOjE7CisJdW5zaWduZWQgaW50IGV4cG9uZW50Ojg7CisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisjZW5kaWYJCQkJLyogTGl0dGxlIGVuZGlhbi4gICovCisgICAgICB9IGllZWVfbmFuOworICB9OworCisjZGVmaW5lIElFRUU3NTRfRkxPQVRfQklBUwkweDdmIC8qIEFkZGVkIHRvIGV4cG9uZW50LiAgKi8KKworCit1bmlvbiBpZWVlNzU0X2RvdWJsZQorICB7CisgICAgZG91YmxlIGQ7CisKKyAgICAvKiBUaGlzIGlzIHRoZSBJRUVFIDc1NCBkb3VibGUtcHJlY2lzaW9uIGZvcm1hdC4gICovCisgICAgc3RydWN0CisgICAgICB7CisjaWYJX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworCXVuc2lnbmVkIGludCBleHBvbmVudDoxMTsKKwkvKiBUb2dldGhlciB0aGVzZSBjb21wcmlzZSB0aGUgbWFudGlzc2EuICAqLworCXVuc2lnbmVkIGludCBtYW50aXNzYTA6MjA7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMTozMjsKKyNlbmRpZgkJCQkvKiBCaWcgZW5kaWFuLiAgKi8KKyNpZglfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjIGlmCV9fRkxPQVRfV09SRF9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQgbWFudGlzc2EwOjIwOworCXVuc2lnbmVkIGludCBleHBvbmVudDoxMTsKKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2ExOjMyOworIyBlbHNlCisJLyogVG9nZXRoZXIgdGhlc2UgY29tcHJpc2UgdGhlIG1hbnRpc3NhLiAgKi8KKwl1bnNpZ25lZCBpbnQgbWFudGlzc2ExOjMyOworCXVuc2lnbmVkIGludCBtYW50aXNzYTA6MjA7CisJdW5zaWduZWQgaW50IGV4cG9uZW50OjExOworCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworIyBlbmRpZgorI2VuZGlmCQkJCS8qIExpdHRsZSBlbmRpYW4uICAqLworICAgICAgfSBpZWVlOworCisgICAgLyogVGhpcyBmb3JtYXQgbWFrZXMgaXQgZWFzaWVyIHRvIHNlZSBpZiBhIE5hTiBpcyBhIHNpZ25hbGxpbmcgTmFOLiAgKi8KKyAgICBzdHJ1Y3QKKyAgICAgIHsKKyNpZglfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisJdW5zaWduZWQgaW50IGV4cG9uZW50OjExOworCXVuc2lnbmVkIGludCBxdWlldF9uYW46MTsKKwkvKiBUb2dldGhlciB0aGVzZSBjb21wcmlzZSB0aGUgbWFudGlzc2EuICAqLworCXVuc2lnbmVkIGludCBtYW50aXNzYTA6MTk7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMTozMjsKKyNlbHNlCisjIGlmCV9fRkxPQVRfV09SRF9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQgbWFudGlzc2EwOjE5OworCXVuc2lnbmVkIGludCBxdWlldF9uYW46MTsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6MTE7CisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMTozMjsKKyMgZWxzZQorCS8qIFRvZ2V0aGVyIHRoZXNlIGNvbXByaXNlIHRoZSBtYW50aXNzYS4gICovCisJdW5zaWduZWQgaW50IG1hbnRpc3NhMTozMjsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2EwOjE5OworCXVuc2lnbmVkIGludCBxdWlldF9uYW46MTsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6MTE7CisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisjIGVuZGlmCisjZW5kaWYKKyAgICAgIH0gaWVlZV9uYW47CisgIH07CisKKyNkZWZpbmUgSUVFRTc1NF9ET1VCTEVfQklBUwkweDNmZiAvKiBBZGRlZCB0byBleHBvbmVudC4gICovCisKKwordW5pb24gaWVlZTg1NF9sb25nX2RvdWJsZQorICB7CisgICAgbG9uZyBkb3VibGUgZDsKKworICAgIC8qIFRoaXMgaXMgdGhlIElFRUUgODU0IGRvdWJsZS1leHRlbmRlZC1wcmVjaXNpb24gZm9ybWF0LiAgKi8KKyAgICBzdHJ1Y3QKKyAgICAgIHsKKyNpZglfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisJdW5zaWduZWQgaW50IGV4cG9uZW50OjE1OworCXVuc2lnbmVkIGludCBlbXB0eToxNjsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2EwOjMyOworCXVuc2lnbmVkIGludCBtYW50aXNzYTE6MzI7CisjZW5kaWYKKyNpZglfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjIGlmCV9fRkxPQVRfV09SRF9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6MTU7CisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisJdW5zaWduZWQgaW50IGVtcHR5OjE2OworCXVuc2lnbmVkIGludCBtYW50aXNzYTA6MzI7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMTozMjsKKyMgZWxzZQorCXVuc2lnbmVkIGludCBtYW50aXNzYTE6MzI7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMDozMjsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6MTU7CisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisJdW5zaWduZWQgaW50IGVtcHR5OjE2OworIyBlbmRpZgorI2VuZGlmCisgICAgICB9IGllZWU7CisKKyAgICAvKiBUaGlzIGlzIGZvciBOYU5zIGluIHRoZSBJRUVFIDg1NCBkb3VibGUtZXh0ZW5kZWQtcHJlY2lzaW9uIGZvcm1hdC4gICovCisgICAgc3RydWN0CisgICAgICB7CisjaWYJX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworCXVuc2lnbmVkIGludCBleHBvbmVudDoxNTsKKwl1bnNpZ25lZCBpbnQgZW1wdHk6MTY7CisJdW5zaWduZWQgaW50IG9uZToxOworCXVuc2lnbmVkIGludCBxdWlldF9uYW46MTsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2EwOjMwOworCXVuc2lnbmVkIGludCBtYW50aXNzYTE6MzI7CisjZW5kaWYKKyNpZglfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjIGlmCV9fRkxPQVRfV09SRF9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6MTU7CisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisJdW5zaWduZWQgaW50IGVtcHR5OjE2OworCXVuc2lnbmVkIGludCBtYW50aXNzYTA6MzA7CisJdW5zaWduZWQgaW50IHF1aWV0X25hbjoxOworCXVuc2lnbmVkIGludCBvbmU6MTsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2ExOjMyOworIyBlbHNlCisJdW5zaWduZWQgaW50IG1hbnRpc3NhMTozMjsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2EwOjMwOworCXVuc2lnbmVkIGludCBxdWlldF9uYW46MTsKKwl1bnNpZ25lZCBpbnQgb25lOjE7CisJdW5zaWduZWQgaW50IGV4cG9uZW50OjE1OworCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworCXVuc2lnbmVkIGludCBlbXB0eToxNjsKKyMgZW5kaWYKKyNlbmRpZgorICAgICAgfSBpZWVlX25hbjsKKyAgfTsKKworI2RlZmluZSBJRUVFODU0X0xPTkdfRE9VQkxFX0JJQVMgMHgzZmZmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBpZWVlNzU0LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaWZhZGRycy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pZmFkZHJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2YTE1NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaWZhZGRycy5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIGlmYWRkcnMuaCAtLSBkZWNsYXJhdGlvbnMgZm9yIGdldHRpbmcgbmV0d29yayBpbnRlcmZhY2UgYWRkcmVzc2VzCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0lGQUREUlNfSAorI2RlZmluZSBfSUZBRERSU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoZSBgZ2V0aWZhZGRycycgZnVuY3Rpb24gZ2VuZXJhdGVzIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcy4KKyAgIEVhY2ggZWxlbWVudCBvZiB0aGUgbGlzdCBkZXNjcmliZXMgb25lIG5ldHdvcmsgaW50ZXJmYWNlLiAgKi8KK3N0cnVjdCBpZmFkZHJzCit7CisgIHN0cnVjdCBpZmFkZHJzICppZmFfbmV4dDsJLyogUG9pbnRlciB0byB0aGUgbmV4dCBzdHJ1Y3R1cmUuICAqLworCisgIGNoYXIgKmlmYV9uYW1lOwkJLyogTmFtZSBvZiB0aGlzIG5ldHdvcmsgaW50ZXJmYWNlLiAgKi8KKyAgdW5zaWduZWQgaW50IGlmYV9mbGFnczsJLyogRmxhZ3MgYXMgZnJvbSBTSU9DR0lGRkxBR1MgaW9jdGwuICAqLworCisgIHN0cnVjdCBzb2NrYWRkciAqaWZhX2FkZHI7CS8qIE5ldHdvcmsgYWRkcmVzcyBvZiB0aGlzIGludGVyZmFjZS4gICovCisgIHN0cnVjdCBzb2NrYWRkciAqaWZhX25ldG1hc2s7IC8qIE5ldG1hc2sgb2YgdGhpcyBpbnRlcmZhY2UuICAqLworICB1bmlvbgorICB7CisgICAgLyogQXQgbW9zdCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gaXMgdmFsaWQuICBJZiB0aGUgSUZGX0JST0FEQ0FTVAorICAgICAgIGJpdCBpcyBzZXQgaW4gYGlmYV9mbGFncycsIHRoZW4gYGlmYV9icm9hZGFkZHInIGlzIHZhbGlkLiAgSWYgdGhlCisgICAgICAgSUZGX1BPSU5UT1BPSU5UIGJpdCBpcyBzZXQsIHRoZW4gYGlmYV9kc3RhZGRyJyBpcyB2YWxpZC4KKyAgICAgICBJdCBpcyBuZXZlciB0aGUgY2FzZSB0aGF0IGJvdGggdGhlc2UgYml0cyBhcmUgc2V0IGF0IG9uY2UuICAqLworICAgIHN0cnVjdCBzb2NrYWRkciAqaWZ1X2Jyb2FkYWRkcjsgLyogQnJvYWRjYXN0IGFkZHJlc3Mgb2YgdGhpcyBpbnRlcmZhY2UuICovCisgICAgc3RydWN0IHNvY2thZGRyICppZnVfZHN0YWRkcjsgLyogUG9pbnQtdG8tcG9pbnQgZGVzdGluYXRpb24gYWRkcmVzcy4gICovCisgIH0gaWZhX2lmdTsKKyAgLyogVGhlc2UgdmVyeSBzYW1lIG1hY3JvcyBhcmUgZGVmaW5lZCBieSA8bmV0L2lmLmg+IGZvciBgc3RydWN0IGlmYWRkcicuCisgICAgIFNvIGlmIHRoZXkgYXJlIGRlZmluZWQgYWxyZWFkeSwgdGhlIGV4aXN0aW5nIGRlZmluaXRpb25zIHdpbGwgYmUgZmluZS4gICovCisjIGlmbmRlZiBpZmFfYnJvYWRhZGRyCisjICBkZWZpbmUgaWZhX2Jyb2FkYWRkcglpZmFfaWZ1LmlmdV9icm9hZGFkZHIKKyMgZW5kaWYKKyMgaWZuZGVmIGlmYV9kc3RhZGRyCisjICBkZWZpbmUgaWZhX2RzdGFkZHIJaWZhX2lmdS5pZnVfZHN0YWRkcgorIyBlbmRpZgorCisgIHZvaWQgKmlmYV9kYXRhOwkJLyogQWRkcmVzcy1zcGVjaWZpYyBkYXRhIChtYXkgYmUgdW51c2VkKS4gICovCit9OworCisKKy8qIENyZWF0ZSBhIGxpbmtlZCBsaXN0IG9mIGBzdHJ1Y3QgaWZhZGRycycgc3RydWN0dXJlcywgb25lIGZvciBlYWNoCisgICBuZXR3b3JrIGludGVyZmFjZSBvbiB0aGUgaG9zdCBtYWNoaW5lLiAgSWYgc3VjY2Vzc2Z1bCwgc3RvcmUgdGhlCisgICBsaXN0IGluICpJRkFQIGFuZCByZXR1cm4gMC4gIE9uIGVycm9ycywgcmV0dXJuIC0xIGFuZCBzZXQgYGVycm5vJy4KKworICAgVGhlIHN0b3JhZ2UgcmV0dXJuZWQgaW4gKklGQVAgaXMgYWxsb2NhdGVkIGR5bmFtaWNhbGx5IGFuZCBjYW4KKyAgIG9ubHkgYmUgcHJvcGVybHkgZnJlZWQgYnkgcGFzc2luZyBpdCB0byBgZnJlZWlmYWRkcnMnLiAgKi8KK2V4dGVybiBpbnQgZ2V0aWZhZGRycyAoc3RydWN0IGlmYWRkcnMgKipfX2lmYXApIF9fVEhST1c7CisKKy8qIFJlY2xhaW0gdGhlIHN0b3JhZ2UgYWxsb2NhdGVkIGJ5IGEgcHJldmlvdXMgYGdldGlmYWRkcnMnIGNhbGwuICAqLworZXh0ZXJuIHZvaWQgZnJlZWlmYWRkcnMgKHN0cnVjdCBpZmFkZHJzICpfX2lmYSkgIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBpZmFkZHJzLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaW50dHlwZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvaW50dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBmZmZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9pbnR0eXBlcy5oCkBAIC0wLDAgKzEsNDQ0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSwgMjAwNCwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTk6IDcuOCBGb3JtYXQgY29udmVyc2lvbiBvZiBpbnRlZ2VyIHR5cGVzCTxpbnR0eXBlcy5oPgorICovCisKKyNpZm5kZWYgX0lOVFRZUEVTX0gKKyNkZWZpbmUgX0lOVFRZUEVTX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKy8qIEdldCB0aGUgdHlwZSBkZWZpbml0aW9ucy4gICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIEdldCBhIGRlZmluaXRpb24gZm9yIHdjaGFyX3QuICBCdXQgd2UgbXVzdCBub3QgZGVmaW5lIHdjaGFyX3QgaXRzZWxmLiAgKi8KKyNpZm5kZWYgX19fX2d3Y2hhcl90X2RlZmluZWQKKyMgaWZkZWYgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBfX2d3Y2hhcl90IHdjaGFyX3QKKyMgZWxpZiBkZWZpbmVkIF9fV0NIQVJfVFlQRV9fCit0eXBlZGVmIF9fV0NIQVJfVFlQRV9fIF9fZ3djaGFyX3Q7CisjIGVsc2UKKyMgIGRlZmluZSBfX25lZWRfd2NoYXJfdAorIyAgaW5jbHVkZSA8c3RkZGVmLmg+Cit0eXBlZGVmIHdjaGFyX3QgX19nd2NoYXJfdDsKKyMgZW5kaWYKKyMgZGVmaW5lIF9fX19nd2NoYXJfdF9kZWZpbmVkCTEKKyNlbmRpZgorCisKKy8qIFRoZSBJU08gQzk5IHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IHRoZXNlIG1hY3JvcyBtdXN0IG9ubHkgYmUKKyAgIGRlZmluZWQgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQuICAqLworI2lmICFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX19TVERDX0ZPUk1BVF9NQUNST1MKKworIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgX19QUkk2NF9QUkVGSVgJImwiCisjICBkZWZpbmUgX19QUklQVFJfUFJFRklYCSJsIgorIyBlbHNlCisjICBkZWZpbmUgX19QUkk2NF9QUkVGSVgJImxsIgorIyAgZGVmaW5lIF9fUFJJUFRSX1BSRUZJWAorIyBlbmRpZgorCisvKiBNYWNyb3MgZm9yIHByaW50aW5nIGZvcm1hdCBzcGVjaWZpZXJzLiAgKi8KKworLyogRGVjaW1hbCBub3RhdGlvbi4gICovCisjIGRlZmluZSBQUklkOAkJImQiCisjIGRlZmluZSBQUklkMTYJCSJkIgorIyBkZWZpbmUgUFJJZDMyCQkiZCIKKyMgZGVmaW5lIFBSSWQ2NAkJX19QUkk2NF9QUkVGSVggImQiCisKKyMgZGVmaW5lIFBSSWRMRUFTVDgJImQiCisjIGRlZmluZSBQUklkTEVBU1QxNgkiZCIKKyMgZGVmaW5lIFBSSWRMRUFTVDMyCSJkIgorIyBkZWZpbmUgUFJJZExFQVNUNjQJX19QUkk2NF9QUkVGSVggImQiCisKKyMgZGVmaW5lIFBSSWRGQVNUOAkiZCIKKyMgZGVmaW5lIFBSSWRGQVNUMTYJX19QUklQVFJfUFJFRklYICJkIgorIyBkZWZpbmUgUFJJZEZBU1QzMglfX1BSSVBUUl9QUkVGSVggImQiCisjIGRlZmluZSBQUklkRkFTVDY0CV9fUFJJNjRfUFJFRklYICJkIgorCisKKyMgZGVmaW5lIFBSSWk4CQkiaSIKKyMgZGVmaW5lIFBSSWkxNgkJImkiCisjIGRlZmluZSBQUklpMzIJCSJpIgorIyBkZWZpbmUgUFJJaTY0CQlfX1BSSTY0X1BSRUZJWCAiaSIKKworIyBkZWZpbmUgUFJJaUxFQVNUOAkiaSIKKyMgZGVmaW5lIFBSSWlMRUFTVDE2CSJpIgorIyBkZWZpbmUgUFJJaUxFQVNUMzIJImkiCisjIGRlZmluZSBQUklpTEVBU1Q2NAlfX1BSSTY0X1BSRUZJWCAiaSIKKworIyBkZWZpbmUgUFJJaUZBU1Q4CSJpIgorIyBkZWZpbmUgUFJJaUZBU1QxNglfX1BSSVBUUl9QUkVGSVggImkiCisjIGRlZmluZSBQUklpRkFTVDMyCV9fUFJJUFRSX1BSRUZJWCAiaSIKKyMgZGVmaW5lIFBSSWlGQVNUNjQJX19QUkk2NF9QUkVGSVggImkiCisKKy8qIE9jdGFsIG5vdGF0aW9uLiAgKi8KKyMgZGVmaW5lIFBSSW84CQkibyIKKyMgZGVmaW5lIFBSSW8xNgkJIm8iCisjIGRlZmluZSBQUklvMzIJCSJvIgorIyBkZWZpbmUgUFJJbzY0CQlfX1BSSTY0X1BSRUZJWCAibyIKKworIyBkZWZpbmUgUFJJb0xFQVNUOAkibyIKKyMgZGVmaW5lIFBSSW9MRUFTVDE2CSJvIgorIyBkZWZpbmUgUFJJb0xFQVNUMzIJIm8iCisjIGRlZmluZSBQUklvTEVBU1Q2NAlfX1BSSTY0X1BSRUZJWCAibyIKKworIyBkZWZpbmUgUFJJb0ZBU1Q4CSJvIgorIyBkZWZpbmUgUFJJb0ZBU1QxNglfX1BSSVBUUl9QUkVGSVggIm8iCisjIGRlZmluZSBQUklvRkFTVDMyCV9fUFJJUFRSX1BSRUZJWCAibyIKKyMgZGVmaW5lIFBSSW9GQVNUNjQJX19QUkk2NF9QUkVGSVggIm8iCisKKy8qIFVuc2lnbmVkIGludGVnZXJzLiAgKi8KKyMgZGVmaW5lIFBSSXU4CQkidSIKKyMgZGVmaW5lIFBSSXUxNgkJInUiCisjIGRlZmluZSBQUkl1MzIJCSJ1IgorIyBkZWZpbmUgUFJJdTY0CQlfX1BSSTY0X1BSRUZJWCAidSIKKworIyBkZWZpbmUgUFJJdUxFQVNUOAkidSIKKyMgZGVmaW5lIFBSSXVMRUFTVDE2CSJ1IgorIyBkZWZpbmUgUFJJdUxFQVNUMzIJInUiCisjIGRlZmluZSBQUkl1TEVBU1Q2NAlfX1BSSTY0X1BSRUZJWCAidSIKKworIyBkZWZpbmUgUFJJdUZBU1Q4CSJ1IgorIyBkZWZpbmUgUFJJdUZBU1QxNglfX1BSSVBUUl9QUkVGSVggInUiCisjIGRlZmluZSBQUkl1RkFTVDMyCV9fUFJJUFRSX1BSRUZJWCAidSIKKyMgZGVmaW5lIFBSSXVGQVNUNjQJX19QUkk2NF9QUkVGSVggInUiCisKKy8qIGxvd2VyY2FzZSBoZXhhZGVjaW1hbCBub3RhdGlvbi4gICovCisjIGRlZmluZSBQUkl4OAkJIngiCisjIGRlZmluZSBQUkl4MTYJCSJ4IgorIyBkZWZpbmUgUFJJeDMyCQkieCIKKyMgZGVmaW5lIFBSSXg2NAkJX19QUkk2NF9QUkVGSVggIngiCisKKyMgZGVmaW5lIFBSSXhMRUFTVDgJIngiCisjIGRlZmluZSBQUkl4TEVBU1QxNgkieCIKKyMgZGVmaW5lIFBSSXhMRUFTVDMyCSJ4IgorIyBkZWZpbmUgUFJJeExFQVNUNjQJX19QUkk2NF9QUkVGSVggIngiCisKKyMgZGVmaW5lIFBSSXhGQVNUOAkieCIKKyMgZGVmaW5lIFBSSXhGQVNUMTYJX19QUklQVFJfUFJFRklYICJ4IgorIyBkZWZpbmUgUFJJeEZBU1QzMglfX1BSSVBUUl9QUkVGSVggIngiCisjIGRlZmluZSBQUkl4RkFTVDY0CV9fUFJJNjRfUFJFRklYICJ4IgorCisvKiBVUFBFUkNBU0UgaGV4YWRlY2ltYWwgbm90YXRpb24uICAqLworIyBkZWZpbmUgUFJJWDgJCSJYIgorIyBkZWZpbmUgUFJJWDE2CQkiWCIKKyMgZGVmaW5lIFBSSVgzMgkJIlgiCisjIGRlZmluZSBQUklYNjQJCV9fUFJJNjRfUFJFRklYICJYIgorCisjIGRlZmluZSBQUklYTEVBU1Q4CSJYIgorIyBkZWZpbmUgUFJJWExFQVNUMTYJIlgiCisjIGRlZmluZSBQUklYTEVBU1QzMgkiWCIKKyMgZGVmaW5lIFBSSVhMRUFTVDY0CV9fUFJJNjRfUFJFRklYICJYIgorCisjIGRlZmluZSBQUklYRkFTVDgJIlgiCisjIGRlZmluZSBQUklYRkFTVDE2CV9fUFJJUFRSX1BSRUZJWCAiWCIKKyMgZGVmaW5lIFBSSVhGQVNUMzIJX19QUklQVFJfUFJFRklYICJYIgorIyBkZWZpbmUgUFJJWEZBU1Q2NAlfX1BSSTY0X1BSRUZJWCAiWCIKKworCisvKiBNYWNyb3MgZm9yIHByaW50aW5nIGBpbnRtYXhfdCcgYW5kIGB1aW50bWF4X3QnLiAgKi8KKyMgZGVmaW5lIFBSSWRNQVgJX19QUkk2NF9QUkVGSVggImQiCisjIGRlZmluZSBQUklpTUFYCV9fUFJJNjRfUFJFRklYICJpIgorIyBkZWZpbmUgUFJJb01BWAlfX1BSSTY0X1BSRUZJWCAibyIKKyMgZGVmaW5lIFBSSXVNQVgJX19QUkk2NF9QUkVGSVggInUiCisjIGRlZmluZSBQUkl4TUFYCV9fUFJJNjRfUFJFRklYICJ4IgorIyBkZWZpbmUgUFJJWE1BWAlfX1BSSTY0X1BSRUZJWCAiWCIKKworCisvKiBNYWNyb3MgZm9yIHByaW50aW5nIGBpbnRwdHJfdCcgYW5kIGB1aW50cHRyX3QnLiAgKi8KKyMgZGVmaW5lIFBSSWRQVFIJX19QUklQVFJfUFJFRklYICJkIgorIyBkZWZpbmUgUFJJaVBUUglfX1BSSVBUUl9QUkVGSVggImkiCisjIGRlZmluZSBQUklvUFRSCV9fUFJJUFRSX1BSRUZJWCAibyIKKyMgZGVmaW5lIFBSSXVQVFIJX19QUklQVFJfUFJFRklYICJ1IgorIyBkZWZpbmUgUFJJeFBUUglfX1BSSVBUUl9QUkVGSVggIngiCisjIGRlZmluZSBQUklYUFRSCV9fUFJJUFRSX1BSRUZJWCAiWCIKKworCisvKiBNYWNyb3MgZm9yIHNjYW5uaW5nIGZvcm1hdCBzcGVjaWZpZXJzLiAgKi8KKworLyogU2lnbmVkIGRlY2ltYWwgbm90YXRpb24uICAqLworIyBkZWZpbmUgU0NOZDgJCSJoaGQiCisjIGRlZmluZSBTQ05kMTYJCSJoZCIKKyMgZGVmaW5lIFNDTmQzMgkJImQiCisjIGRlZmluZSBTQ05kNjQJCV9fUFJJNjRfUFJFRklYICJkIgorCisjIGRlZmluZSBTQ05kTEVBU1Q4CSJoaGQiCisjIGRlZmluZSBTQ05kTEVBU1QxNgkiaGQiCisjIGRlZmluZSBTQ05kTEVBU1QzMgkiZCIKKyMgZGVmaW5lIFNDTmRMRUFTVDY0CV9fUFJJNjRfUFJFRklYICJkIgorCisjIGRlZmluZSBTQ05kRkFTVDgJImhoZCIKKyMgZGVmaW5lIFNDTmRGQVNUMTYJX19QUklQVFJfUFJFRklYICJkIgorIyBkZWZpbmUgU0NOZEZBU1QzMglfX1BSSVBUUl9QUkVGSVggImQiCisjIGRlZmluZSBTQ05kRkFTVDY0CV9fUFJJNjRfUFJFRklYICJkIgorCisvKiBTaWduZWQgZGVjaW1hbCBub3RhdGlvbi4gICovCisjIGRlZmluZSBTQ05pOAkJImhoaSIKKyMgZGVmaW5lIFNDTmkxNgkJImhpIgorIyBkZWZpbmUgU0NOaTMyCQkiaSIKKyMgZGVmaW5lIFNDTmk2NAkJX19QUkk2NF9QUkVGSVggImkiCisKKyMgZGVmaW5lIFNDTmlMRUFTVDgJImhoaSIKKyMgZGVmaW5lIFNDTmlMRUFTVDE2CSJoaSIKKyMgZGVmaW5lIFNDTmlMRUFTVDMyCSJpIgorIyBkZWZpbmUgU0NOaUxFQVNUNjQJX19QUkk2NF9QUkVGSVggImkiCisKKyMgZGVmaW5lIFNDTmlGQVNUOAkiaGhpIgorIyBkZWZpbmUgU0NOaUZBU1QxNglfX1BSSVBUUl9QUkVGSVggImkiCisjIGRlZmluZSBTQ05pRkFTVDMyCV9fUFJJUFRSX1BSRUZJWCAiaSIKKyMgZGVmaW5lIFNDTmlGQVNUNjQJX19QUkk2NF9QUkVGSVggImkiCisKKy8qIFVuc2lnbmVkIGRlY2ltYWwgbm90YXRpb24uICAqLworIyBkZWZpbmUgU0NOdTgJCSJoaHUiCisjIGRlZmluZSBTQ051MTYJCSJodSIKKyMgZGVmaW5lIFNDTnUzMgkJInUiCisjIGRlZmluZSBTQ051NjQJCV9fUFJJNjRfUFJFRklYICJ1IgorCisjIGRlZmluZSBTQ051TEVBU1Q4CSJoaHUiCisjIGRlZmluZSBTQ051TEVBU1QxNgkiaHUiCisjIGRlZmluZSBTQ051TEVBU1QzMgkidSIKKyMgZGVmaW5lIFNDTnVMRUFTVDY0CV9fUFJJNjRfUFJFRklYICJ1IgorCisjIGRlZmluZSBTQ051RkFTVDgJImhodSIKKyMgZGVmaW5lIFNDTnVGQVNUMTYJX19QUklQVFJfUFJFRklYICJ1IgorIyBkZWZpbmUgU0NOdUZBU1QzMglfX1BSSVBUUl9QUkVGSVggInUiCisjIGRlZmluZSBTQ051RkFTVDY0CV9fUFJJNjRfUFJFRklYICJ1IgorCisvKiBPY3RhbCBub3RhdGlvbi4gICovCisjIGRlZmluZSBTQ05vOAkJImhobyIKKyMgZGVmaW5lIFNDTm8xNgkJImhvIgorIyBkZWZpbmUgU0NObzMyCQkibyIKKyMgZGVmaW5lIFNDTm82NAkJX19QUkk2NF9QUkVGSVggIm8iCisKKyMgZGVmaW5lIFNDTm9MRUFTVDgJImhobyIKKyMgZGVmaW5lIFNDTm9MRUFTVDE2CSJobyIKKyMgZGVmaW5lIFNDTm9MRUFTVDMyCSJvIgorIyBkZWZpbmUgU0NOb0xFQVNUNjQJX19QUkk2NF9QUkVGSVggIm8iCisKKyMgZGVmaW5lIFNDTm9GQVNUOAkiaGhvIgorIyBkZWZpbmUgU0NOb0ZBU1QxNglfX1BSSVBUUl9QUkVGSVggIm8iCisjIGRlZmluZSBTQ05vRkFTVDMyCV9fUFJJUFRSX1BSRUZJWCAibyIKKyMgZGVmaW5lIFNDTm9GQVNUNjQJX19QUkk2NF9QUkVGSVggIm8iCisKKy8qIEhleGFkZWNpbWFsIG5vdGF0aW9uLiAgKi8KKyMgZGVmaW5lIFNDTng4CQkiaGh4IgorIyBkZWZpbmUgU0NOeDE2CQkiaHgiCisjIGRlZmluZSBTQ054MzIJCSJ4IgorIyBkZWZpbmUgU0NOeDY0CQlfX1BSSTY0X1BSRUZJWCAieCIKKworIyBkZWZpbmUgU0NOeExFQVNUOAkiaGh4IgorIyBkZWZpbmUgU0NOeExFQVNUMTYJImh4IgorIyBkZWZpbmUgU0NOeExFQVNUMzIJIngiCisjIGRlZmluZSBTQ054TEVBU1Q2NAlfX1BSSTY0X1BSRUZJWCAieCIKKworIyBkZWZpbmUgU0NOeEZBU1Q4CSJoaHgiCisjIGRlZmluZSBTQ054RkFTVDE2CV9fUFJJUFRSX1BSRUZJWCAieCIKKyMgZGVmaW5lIFNDTnhGQVNUMzIJX19QUklQVFJfUFJFRklYICJ4IgorIyBkZWZpbmUgU0NOeEZBU1Q2NAlfX1BSSTY0X1BSRUZJWCAieCIKKworCisvKiBNYWNyb3MgZm9yIHNjYW5uaW5nIGBpbnRtYXhfdCcgYW5kIGB1aW50bWF4X3QnLiAgKi8KKyMgZGVmaW5lIFNDTmRNQVgJX19QUkk2NF9QUkVGSVggImQiCisjIGRlZmluZSBTQ05pTUFYCV9fUFJJNjRfUFJFRklYICJpIgorIyBkZWZpbmUgU0NOb01BWAlfX1BSSTY0X1BSRUZJWCAibyIKKyMgZGVmaW5lIFNDTnVNQVgJX19QUkk2NF9QUkVGSVggInUiCisjIGRlZmluZSBTQ054TUFYCV9fUFJJNjRfUFJFRklYICJ4IgorCisvKiBNYWNyb3MgZm9yIHNjYW5pbmcgYGludHB0cl90JyBhbmQgYHVpbnRwdHJfdCcuICAqLworIyBkZWZpbmUgU0NOZFBUUglfX1BSSVBUUl9QUkVGSVggImQiCisjIGRlZmluZSBTQ05pUFRSCV9fUFJJUFRSX1BSRUZJWCAiaSIKKyMgZGVmaW5lIFNDTm9QVFIJX19QUklQVFJfUFJFRklYICJvIgorIyBkZWZpbmUgU0NOdVBUUglfX1BSSVBUUl9QUkVGSVggInUiCisjIGRlZmluZSBTQ054UFRSCV9fUFJJUFRSX1BSRUZJWCAieCIKKworI2VuZGlmCS8qIEMrKyAmJiBmb3JtYXQgbWFjcm9zICovCisKKworX19CRUdJTl9ERUNMUworCisjaWYgX19XT1JEU0laRSA9PSA2NAorCisvKiBXZSBoYXZlIHRvIGRlZmluZSB0aGUgYHVpbnRtYXhfdCcgdHlwZSB1c2luZyBgbGRpdl90Jy4gICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgbG9uZyBpbnQgcXVvdDsJCS8qIFF1b3RpZW50LiAgKi8KKyAgICBsb25nIGludCByZW07CQkvKiBSZW1haW5kZXIuICAqLworICB9IGltYXhkaXZfdDsKKworI2Vsc2UKKworLyogV2UgaGF2ZSB0byBkZWZpbmUgdGhlIGB1aW50bWF4X3QnIHR5cGUgdXNpbmcgYGxsZGl2X3QnLiAgKi8KK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBsb25nIGxvbmcgaW50IHF1b3Q7CQkvKiBRdW90aWVudC4gICovCisgICAgbG9uZyBsb25nIGludCByZW07CQkvKiBSZW1haW5kZXIuICAqLworICB9IGltYXhkaXZfdDsKKworI2VuZGlmCisKKworLyogQ29tcHV0ZSBhYnNvbHV0ZSB2YWx1ZSBvZiBOLiAgKi8KK2V4dGVybiBpbnRtYXhfdCBpbWF4YWJzIChpbnRtYXhfdCBfX24pIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisvKiBSZXR1cm4gdGhlIGBpbWF4ZGl2X3QnIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBvZiBOVU1FUiBvdmVyIERFTk9NLiAqLworZXh0ZXJuIGltYXhkaXZfdCBpbWF4ZGl2IChpbnRtYXhfdCBfX251bWVyLCBpbnRtYXhfdCBfX2Rlbm9tKQorICAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIExpa2UgYHN0cnRvbCcgYnV0IGNvbnZlcnQgdG8gYGludG1heF90Jy4gICovCitleHRlcm4gaW50bWF4X3Qgc3RydG9pbWF4IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpIF9fVEhST1c7CisKKy8qIExpa2UgYHN0cnRvdWwnIGJ1dCBjb252ZXJ0IHRvIGB1aW50bWF4X3QnLiAgKi8KK2V4dGVybiB1aW50bWF4X3Qgc3RydG91bWF4IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJICAgIGNoYXIgKiogX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkgX19USFJPVzsKKworLyogTGlrZSBgd2NzdG9sJyBidXQgY29udmVydCB0byBgaW50bWF4X3QnLiAgKi8KK2V4dGVybiBpbnRtYXhfdCB3Y3N0b2ltYXggKF9fY29uc3QgX19nd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgICBfX2d3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkKKyAgICAgX19USFJPVzsKKworLyogTGlrZSBgd2NzdG91bCcgYnV0IGNvbnZlcnQgdG8gYHVpbnRtYXhfdCcuICAqLworZXh0ZXJuIHVpbnRtYXhfdCB3Y3N0b3VtYXggKF9fY29uc3QgX19nd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgICAgX19nd2NoYXJfdCAqKiBfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKQorICAgICBfX1RIUk9XOworCisjaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKKworIyBpZiBfX1dPUkRTSVpFID09IDY0CisKK2V4dGVybiBsb25nIGludCBfX3N0cnRvbF9pbnRlcm5hbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkgICBpbnQgX19iYXNlLCBpbnQgX19ncm91cCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisvKiBMaWtlIGBzdHJ0b2wnIGJ1dCBjb252ZXJ0IHRvIGBpbnRtYXhfdCcuICAqLworX19leHRlcm5faW5saW5lIGludG1heF90CitfX05USCAoc3RydG9pbWF4IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgbnB0ciwgY2hhciAqKl9fcmVzdHJpY3QgZW5kcHRyLAorCQkgIGludCBiYXNlKSkKK3sKKyAgcmV0dXJuIF9fc3RydG9sX2ludGVybmFsIChucHRyLCBlbmRwdHIsIGJhc2UsIDApOworfQorCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgX19zdHJ0b3VsX2ludGVybmFsIChfX2NvbnN0IGNoYXIgKgorCQkJCQkgICAgIF9fcmVzdHJpY3QgX19ucHRyLAorCQkJCQkgICAgIGNoYXIgKiogX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkJICAgICBpbnQgX19iYXNlLCBpbnQgX19ncm91cCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisvKiBMaWtlIGBzdHJ0b3VsJyBidXQgY29udmVydCB0byBgdWludG1heF90Jy4gICovCitfX2V4dGVybl9pbmxpbmUgdWludG1heF90CitfX05USCAoc3RydG91bWF4IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgbnB0ciwgY2hhciAqKl9fcmVzdHJpY3QgZW5kcHRyLAorCQkgIGludCBiYXNlKSkKK3sKKyAgcmV0dXJuIF9fc3RydG91bF9pbnRlcm5hbCAobnB0ciwgZW5kcHRyLCBiYXNlLCAwKTsKK30KKworZXh0ZXJuIGxvbmcgaW50IF9fd2NzdG9sX2ludGVybmFsIChfX2NvbnN0IF9fZ3djaGFyX3QgKiBfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkgICBfX2d3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkgICBpbnQgX19iYXNlLCBpbnQgX19ncm91cCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisvKiBMaWtlIGB3Y3N0b2wnIGJ1dCBjb252ZXJ0IHRvIGBpbnRtYXhfdCcuICAqLworX19leHRlcm5faW5saW5lIGludG1heF90CitfX05USCAod2NzdG9pbWF4IChfX2NvbnN0IF9fZ3djaGFyX3QgKl9fcmVzdHJpY3QgbnB0ciwKKwkJICBfX2d3Y2hhcl90ICoqX19yZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKSkKK3sKKyAgcmV0dXJuIF9fd2NzdG9sX2ludGVybmFsIChucHRyLCBlbmRwdHIsIGJhc2UsIDApOworfQorCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgX193Y3N0b3VsX2ludGVybmFsIChfX2NvbnN0IF9fZ3djaGFyX3QgKgorCQkJCQkgICAgIF9fcmVzdHJpY3QgX19ucHRyLAorCQkJCQkgICAgIF9fZ3djaGFyX3QgKioKKwkJCQkJICAgICBfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJCQkgICAgIGludCBfX2Jhc2UsIGludCBfX2dyb3VwKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKy8qIExpa2UgYHdjc3RvdWwnIGJ1dCBjb252ZXJ0IHRvIGB1aW50bWF4X3QnLiAgKi8KK19fZXh0ZXJuX2lubGluZSB1aW50bWF4X3QKK19fTlRIICh3Y3N0b3VtYXggKF9fY29uc3QgX19nd2NoYXJfdCAqX19yZXN0cmljdCBucHRyLAorCQkgIF9fZ3djaGFyX3QgKipfX3Jlc3RyaWN0IGVuZHB0ciwgaW50IGJhc2UpKQoreworICByZXR1cm4gX193Y3N0b3VsX2ludGVybmFsIChucHRyLCBlbmRwdHIsIGJhc2UsIDApOworfQorCisjIGVsc2UgLyogX19XT1JEU0laRSA9PSAzMiAqLworCitfX2V4dGVuc2lvbl9fCitleHRlcm4gbG9uZyBsb25nIGludCBfX3N0cnRvbGxfaW50ZXJuYWwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJCSBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkJIGludCBfX2Jhc2UsIGludCBfX2dyb3VwKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKy8qIExpa2UgYHN0cnRvbCcgYnV0IGNvbnZlcnQgdG8gYGludG1heF90Jy4gICovCitfX2V4dGVybl9pbmxpbmUgaW50bWF4X3QKK19fTlRIIChzdHJ0b2ltYXggKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBucHRyLCBjaGFyICoqX19yZXN0cmljdCBlbmRwdHIsCisJCSAgaW50IGJhc2UpKQoreworICByZXR1cm4gX19zdHJ0b2xsX2ludGVybmFsIChucHRyLCBlbmRwdHIsIGJhc2UsIDApOworfQorCitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3N0cnRvdWxsX2ludGVybmFsIChfX2NvbnN0IGNoYXIgKgorCQkJCQkJICAgX19yZXN0cmljdCBfX25wdHIsCisJCQkJCQkgICBjaGFyICoqCisJCQkJCQkgICBfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJCQkJICAgaW50IF9fYmFzZSwKKwkJCQkJCSAgIGludCBfX2dyb3VwKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKy8qIExpa2UgYHN0cnRvdWwnIGJ1dCBjb252ZXJ0IHRvIGB1aW50bWF4X3QnLiAgKi8KK19fZXh0ZXJuX2lubGluZSB1aW50bWF4X3QKK19fTlRIIChzdHJ0b3VtYXggKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBucHRyLCBjaGFyICoqX19yZXN0cmljdCBlbmRwdHIsCisJCSAgaW50IGJhc2UpKQoreworICByZXR1cm4gX19zdHJ0b3VsbF9pbnRlcm5hbCAobnB0ciwgZW5kcHRyLCBiYXNlLCAwKTsKK30KKworX19leHRlbnNpb25fXworZXh0ZXJuIGxvbmcgbG9uZyBpbnQgX193Y3N0b2xsX2ludGVybmFsIChfX2NvbnN0IF9fZ3djaGFyX3QgKgorCQkJCQkgX19yZXN0cmljdCBfX25wdHIsCisJCQkJCSBfX2d3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkJIGludCBfX2Jhc2UsIGludCBfX2dyb3VwKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKy8qIExpa2UgYHdjc3RvbCcgYnV0IGNvbnZlcnQgdG8gYGludG1heF90Jy4gICovCitfX2V4dGVybl9pbmxpbmUgaW50bWF4X3QKK19fTlRIICh3Y3N0b2ltYXggKF9fY29uc3QgX19nd2NoYXJfdCAqX19yZXN0cmljdCBucHRyLAorCQkgIF9fZ3djaGFyX3QgKipfX3Jlc3RyaWN0IGVuZHB0ciwgaW50IGJhc2UpKQoreworICByZXR1cm4gX193Y3N0b2xsX2ludGVybmFsIChucHRyLCBlbmRwdHIsIGJhc2UsIDApOworfQorCisKK19fZXh0ZW5zaW9uX18KK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fd2NzdG91bGxfaW50ZXJuYWwgKF9fY29uc3QgX19nd2NoYXJfdCAqCisJCQkJCQkgICBfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkJCSAgIF9fZ3djaGFyX3QgKioKKwkJCQkJCSAgIF9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJCQkgICBpbnQgX19iYXNlLAorCQkJCQkJICAgaW50IF9fZ3JvdXApCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworLyogTGlrZSBgd2NzdG91bCcgYnV0IGNvbnZlcnQgdG8gYHVpbnRtYXhfdCcuICAqLworX19leHRlcm5faW5saW5lIHVpbnRtYXhfdAorX19OVEggKHdjc3RvdW1heCAoX19jb25zdCBfX2d3Y2hhcl90ICpfX3Jlc3RyaWN0IG5wdHIsCisJCSAgX19nd2NoYXJfdCAqKl9fcmVzdHJpY3QgZW5kcHRyLCBpbnQgYmFzZSkpCit7CisgIHJldHVybiBfX3djc3RvdWxsX2ludGVybmFsIChucHRyLCBlbmRwdHIsIGJhc2UsIDApOworfQorCisjIGVuZGlmCS8qIF9fV09SRFNJWkUgPT0gMzIJKi8KKyNlbmRpZgkvKiBVc2UgZXh0ZXJuIGlubGluZXMuICAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogaW50dHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9sYW5naW5mby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9sYW5naW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNTMzNjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xhbmdpbmZvLmgKQEAgLTAsMCArMSw2MDAgQEAKKy8qIEFjY2VzcyB0byBsb2NhbGUtZGVwZW5kZW50IHBhcmFtZXRlcnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiwyMDAzLDIwMDQsMjAwNSwyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9MQU5HSU5GT19ICisjZGVmaW5lCV9MQU5HSU5GT19IIDEKKworLyogR2V0IHRoZSB0eXBlIGRlZmluaXRpb24uICAqLworI2luY2x1ZGUgPG5sX3R5cGVzLmg+CisKKyNpbmNsdWRlIDxiaXRzL2xvY2FsZS5oPgkvKiBEZWZpbmUgdGhlIF9fTENfKiBjYXRlZ29yeSBuYW1lcy4gICovCisKKworX19CRUdJTl9ERUNMUworCisvKiBDb25zdHJ1Y3QgYW4gYG5sX2l0ZW0nIHZhbHVlIGZvciBgbmxfbGFuZ2luZm8nIGZyb20gYSBsb2NhbGUgY2F0ZWdvcnkKKyAgIChMQ18qKSBhbmQgYW4gaXRlbSBpbmRleCB3aXRoaW4gdGhlIGNhdGVnb3J5LiAgU29tZSBjb2RlIG1heSBkZXBlbmQgb24KKyAgIHRoZSBpdGVtIHZhbHVlcyB3aXRoaW4gYSBjYXRlZ29yeSBpbmNyZWFzaW5nIG1vbm90b25pY2FsbHkgd2l0aCB0aGUKKyAgIGluZGljZXMuICAqLworI2RlZmluZSBfTkxfSVRFTShjYXRlZ29yeSwgaW5kZXgpCSgoKGNhdGVnb3J5KSA8PCAxNikgfCAoaW5kZXgpKQorCisvKiBFeHRyYWN0IHRoZSBjYXRlZ29yeSBhbmQgaXRlbSBpbmRleCBmcm9tIGEgY29uc3RydWN0ZWQgYG5sX2l0ZW0nIHZhbHVlLiAgKi8KKyNkZWZpbmUgX05MX0lURU1fQ0FURUdPUlkoaXRlbSkJCSgoaW50KSAoaXRlbSkgPj4gMTYpCisjZGVmaW5lIF9OTF9JVEVNX0lOREVYKGl0ZW0pCQkoKGludCkgKGl0ZW0pICYgMHhmZmZmKQorCisvKiBFbnVtZXJhdGlvbiBvZiBsb2NhbGUgaXRlbXMgdGhhdCBjYW4gYmUgcXVlcmllZCB3aXRoIGBubF9sYW5naW5mbycuICAqLworZW51bQoreworICAvKiBMQ19USU1FIGNhdGVnb3J5OiBkYXRlIGFuZCB0aW1lIGZvcm1hdHRpbmcuICAqLworCisgIC8qIEFiYnJldmlhdGVkIGRheXMgb2YgdGhlIHdlZWsuICovCisgIEFCREFZXzEgPSBfTkxfSVRFTSAoX19MQ19USU1FLCAwKSwgLyogU3VuICovCisjZGVmaW5lIEFCREFZXzEJCQlBQkRBWV8xCisgIEFCREFZXzIsCisjZGVmaW5lIEFCREFZXzIJCQlBQkRBWV8yCisgIEFCREFZXzMsCisjZGVmaW5lIEFCREFZXzMJCQlBQkRBWV8zCisgIEFCREFZXzQsCisjZGVmaW5lIEFCREFZXzQJCQlBQkRBWV80CisgIEFCREFZXzUsCisjZGVmaW5lIEFCREFZXzUJCQlBQkRBWV81CisgIEFCREFZXzYsCisjZGVmaW5lIEFCREFZXzYJCQlBQkRBWV82CisgIEFCREFZXzcsCisjZGVmaW5lIEFCREFZXzcJCQlBQkRBWV83CisKKyAgLyogTG9uZy1uYW1lZCBkYXlzIG9mIHRoZSB3ZWVrLiAqLworICBEQVlfMSwJCQkvKiBTdW5kYXkgKi8KKyNkZWZpbmUgREFZXzEJCQlEQVlfMQorICBEQVlfMiwJCQkvKiBNb25kYXkgKi8KKyNkZWZpbmUgREFZXzIJCQlEQVlfMgorICBEQVlfMywJCQkvKiBUdWVzZGF5ICovCisjZGVmaW5lIERBWV8zCQkJREFZXzMKKyAgREFZXzQsCQkJLyogV2VkbmVzZGF5ICovCisjZGVmaW5lIERBWV80CQkJREFZXzQKKyAgREFZXzUsCQkJLyogVGh1cnNkYXkgKi8KKyNkZWZpbmUgREFZXzUJCQlEQVlfNQorICBEQVlfNiwJCQkvKiBGcmlkYXkgKi8KKyNkZWZpbmUgREFZXzYJCQlEQVlfNgorICBEQVlfNywJCQkvKiBTYXR1cmRheSAqLworI2RlZmluZSBEQVlfNwkJCURBWV83CisKKyAgLyogQWJicmV2aWF0ZWQgbW9udGggbmFtZXMuICAqLworICBBQk1PTl8xLAkJCS8qIEphbiAqLworI2RlZmluZSBBQk1PTl8xCQkJQUJNT05fMQorICBBQk1PTl8yLAorI2RlZmluZSBBQk1PTl8yCQkJQUJNT05fMgorICBBQk1PTl8zLAorI2RlZmluZSBBQk1PTl8zCQkJQUJNT05fMworICBBQk1PTl80LAorI2RlZmluZSBBQk1PTl80CQkJQUJNT05fNAorICBBQk1PTl81LAorI2RlZmluZSBBQk1PTl81CQkJQUJNT05fNQorICBBQk1PTl82LAorI2RlZmluZSBBQk1PTl82CQkJQUJNT05fNgorICBBQk1PTl83LAorI2RlZmluZSBBQk1PTl83CQkJQUJNT05fNworICBBQk1PTl84LAorI2RlZmluZSBBQk1PTl84CQkJQUJNT05fOAorICBBQk1PTl85LAorI2RlZmluZSBBQk1PTl85CQkJQUJNT05fOQorICBBQk1PTl8xMCwKKyNkZWZpbmUgQUJNT05fMTAJCUFCTU9OXzEwCisgIEFCTU9OXzExLAorI2RlZmluZSBBQk1PTl8xMQkJQUJNT05fMTEKKyAgQUJNT05fMTIsCisjZGVmaW5lIEFCTU9OXzEyCQlBQk1PTl8xMgorCisgIC8qIExvbmcgbW9udGggbmFtZXMuICAqLworICBNT05fMSwJCQkvKiBKYW51YXJ5ICovCisjZGVmaW5lIE1PTl8xCQkJTU9OXzEKKyAgTU9OXzIsCisjZGVmaW5lIE1PTl8yCQkJTU9OXzIKKyAgTU9OXzMsCisjZGVmaW5lIE1PTl8zCQkJTU9OXzMKKyAgTU9OXzQsCisjZGVmaW5lIE1PTl80CQkJTU9OXzQKKyAgTU9OXzUsCisjZGVmaW5lIE1PTl81CQkJTU9OXzUKKyAgTU9OXzYsCisjZGVmaW5lIE1PTl82CQkJTU9OXzYKKyAgTU9OXzcsCisjZGVmaW5lIE1PTl83CQkJTU9OXzcKKyAgTU9OXzgsCisjZGVmaW5lIE1PTl84CQkJTU9OXzgKKyAgTU9OXzksCisjZGVmaW5lIE1PTl85CQkJTU9OXzkKKyAgTU9OXzEwLAorI2RlZmluZSBNT05fMTAJCQlNT05fMTAKKyAgTU9OXzExLAorI2RlZmluZSBNT05fMTEJCQlNT05fMTEKKyAgTU9OXzEyLAorI2RlZmluZSBNT05fMTIJCQlNT05fMTIKKworICBBTV9TVFIsCQkJLyogQW50ZSBtZXJpZGllbSBzdHJpbmcuICAqLworI2RlZmluZSBBTV9TVFIJCQlBTV9TVFIKKyAgUE1fU1RSLAkJCS8qIFBvc3QgbWVyaWRpZW0gc3RyaW5nLiAgKi8KKyNkZWZpbmUgUE1fU1RSCQkJUE1fU1RSCisKKyAgRF9UX0ZNVCwJCQkvKiBEYXRlIGFuZCB0aW1lIGZvcm1hdCBmb3Igc3RyZnRpbWUuICAqLworI2RlZmluZSBEX1RfRk1UCQkJRF9UX0ZNVAorICBEX0ZNVCwJCQkvKiBEYXRlIGZvcm1hdCBmb3Igc3RyZnRpbWUuICAqLworI2RlZmluZSBEX0ZNVAkJCURfRk1UCisgIFRfRk1ULAkJCS8qIFRpbWUgZm9ybWF0IGZvciBzdHJmdGltZS4gICovCisjZGVmaW5lIFRfRk1UCQkJVF9GTVQKKyAgVF9GTVRfQU1QTSwJCQkvKiAxMi1ob3VyIHRpbWUgZm9ybWF0IGZvciBzdHJmdGltZS4gICovCisjZGVmaW5lIFRfRk1UX0FNUE0JCVRfRk1UX0FNUE0KKworICBFUkEsCQkJCS8qIEFsdGVybmF0ZSBlcmEuICAqLworI2RlZmluZSBFUkEJCQlFUkEKKyAgX19FUkFfWUVBUiwJCQkvKiBZZWFyIGluIGFsdGVybmF0ZSBlcmEgZm9ybWF0LiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIEVSQV9ZRUFSCQlfX0VSQV9ZRUFSCisjZW5kaWYKKyAgRVJBX0RfRk1ULAkJCS8qIERhdGUgaW4gYWx0ZXJuYXRlIGVyYSBmb3JtYXQuICAqLworI2RlZmluZSBFUkFfRF9GTVQJCUVSQV9EX0ZNVAorICBBTFRfRElHSVRTLAkJCS8qIEFsdGVybmF0ZSBzeW1ib2xzIGZvciBkaWdpdHMuICAqLworI2RlZmluZSBBTFRfRElHSVRTCQlBTFRfRElHSVRTCisgIEVSQV9EX1RfRk1ULAkJCS8qIERhdGUgYW5kIHRpbWUgaW4gYWx0ZXJuYXRlIGVyYSBmb3JtYXQuICAqLworI2RlZmluZSBFUkFfRF9UX0ZNVAkJRVJBX0RfVF9GTVQKKyAgRVJBX1RfRk1ULAkJCS8qIFRpbWUgaW4gYWx0ZXJuYXRlIGVyYSBmb3JtYXQuICAqLworI2RlZmluZSBFUkFfVF9GTVQJCUVSQV9UX0ZNVAorCisgIF9OTF9USU1FX0VSQV9OVU1fRU5UUklFUywJLyogTnVtYmVyIGVudHJpZXMgaW4gdGhlIGVyYSBhcnJheXMuICAqLworICBfTkxfVElNRV9FUkFfRU5UUklFUywJCS8qIFN0cnVjdHVyZSB3aXRoIGVyYSBlbnRyaWVzIGluIHVzYWJsZSBmb3JtLiovCisKKyAgX05MX1dBQkRBWV8xLAkJLyogU3VuICovCisgIF9OTF9XQUJEQVlfMiwKKyAgX05MX1dBQkRBWV8zLAorICBfTkxfV0FCREFZXzQsCisgIF9OTF9XQUJEQVlfNSwKKyAgX05MX1dBQkRBWV82LAorICBfTkxfV0FCREFZXzcsCisKKyAgLyogTG9uZy1uYW1lZCBkYXlzIG9mIHRoZSB3ZWVrLiAqLworICBfTkxfV0RBWV8xLAkJLyogU3VuZGF5ICovCisgIF9OTF9XREFZXzIsCQkvKiBNb25kYXkgKi8KKyAgX05MX1dEQVlfMywJCS8qIFR1ZXNkYXkgKi8KKyAgX05MX1dEQVlfNCwJCS8qIFdlZG5lc2RheSAqLworICBfTkxfV0RBWV81LAkJLyogVGh1cnNkYXkgKi8KKyAgX05MX1dEQVlfNiwJCS8qIEZyaWRheSAqLworICBfTkxfV0RBWV83LAkJLyogU2F0dXJkYXkgKi8KKworICAvKiBBYmJyZXZpYXRlZCBtb250aCBuYW1lcy4gICovCisgIF9OTF9XQUJNT05fMSwJCS8qIEphbiAqLworICBfTkxfV0FCTU9OXzIsCisgIF9OTF9XQUJNT05fMywKKyAgX05MX1dBQk1PTl80LAorICBfTkxfV0FCTU9OXzUsCisgIF9OTF9XQUJNT05fNiwKKyAgX05MX1dBQk1PTl83LAorICBfTkxfV0FCTU9OXzgsCisgIF9OTF9XQUJNT05fOSwKKyAgX05MX1dBQk1PTl8xMCwKKyAgX05MX1dBQk1PTl8xMSwKKyAgX05MX1dBQk1PTl8xMiwKKworICAvKiBMb25nIG1vbnRoIG5hbWVzLiAgKi8KKyAgX05MX1dNT05fMSwJCS8qIEphbnVhcnkgKi8KKyAgX05MX1dNT05fMiwKKyAgX05MX1dNT05fMywKKyAgX05MX1dNT05fNCwKKyAgX05MX1dNT05fNSwKKyAgX05MX1dNT05fNiwKKyAgX05MX1dNT05fNywKKyAgX05MX1dNT05fOCwKKyAgX05MX1dNT05fOSwKKyAgX05MX1dNT05fMTAsCisgIF9OTF9XTU9OXzExLAorICBfTkxfV01PTl8xMiwKKworICBfTkxfV0FNX1NUUiwJCS8qIEFudGUgbWVyaWRpZW0gc3RyaW5nLiAgKi8KKyAgX05MX1dQTV9TVFIsCQkvKiBQb3N0IG1lcmlkaWVtIHN0cmluZy4gICovCisKKyAgX05MX1dEX1RfRk1ULAkJLyogRGF0ZSBhbmQgdGltZSBmb3JtYXQgZm9yIHN0cmZ0aW1lLiAgKi8KKyAgX05MX1dEX0ZNVCwJCS8qIERhdGUgZm9ybWF0IGZvciBzdHJmdGltZS4gICovCisgIF9OTF9XVF9GTVQsCQkvKiBUaW1lIGZvcm1hdCBmb3Igc3RyZnRpbWUuICAqLworICBfTkxfV1RfRk1UX0FNUE0sCS8qIDEyLWhvdXIgdGltZSBmb3JtYXQgZm9yIHN0cmZ0aW1lLiAgKi8KKworICBfTkxfV0VSQV9ZRUFSLAkvKiBZZWFyIGluIGFsdGVybmF0ZSBlcmEgZm9ybWF0LiAgKi8KKyAgX05MX1dFUkFfRF9GTVQsCS8qIERhdGUgaW4gYWx0ZXJuYXRlIGVyYSBmb3JtYXQuICAqLworICBfTkxfV0FMVF9ESUdJVFMsCS8qIEFsdGVybmF0ZSBzeW1ib2xzIGZvciBkaWdpdHMuICAqLworICBfTkxfV0VSQV9EX1RfRk1ULAkvKiBEYXRlIGFuZCB0aW1lIGluIGFsdGVybmF0ZSBlcmEgZm9ybWF0LiAgKi8KKyAgX05MX1dFUkFfVF9GTVQsCS8qIFRpbWUgaW4gYWx0ZXJuYXRlIGVyYSBmb3JtYXQuICAqLworCisgIF9OTF9USU1FX1dFRUtfTkRBWVMsCisgIF9OTF9USU1FX1dFRUtfMVNUREFZLAorICBfTkxfVElNRV9XRUVLXzFTVFdFRUssCisgIF9OTF9USU1FX0ZJUlNUX1dFRUtEQVksCisgIF9OTF9USU1FX0ZJUlNUX1dPUktEQVksCisgIF9OTF9USU1FX0NBTF9ESVJFQ1RJT04sCisgIF9OTF9USU1FX1RJTUVaT05FLAorCisgIF9EQVRFX0ZNVCwJCS8qIHN0cmZ0aW1lIGZvcm1hdCBmb3IgZGF0ZS4gICovCisjZGVmaW5lIF9EQVRFX0ZNVAlfREFURV9GTVQKKyAgX05MX1dfREFURV9GTVQsCisKKyAgX05MX1RJTUVfQ09ERVNFVCwKKworICBfTkxfTlVNX0xDX1RJTUUsCS8qIE51bWJlciBvZiBpbmRpY2VzIGluIExDX1RJTUUgY2F0ZWdvcnkuICAqLworCisgIC8qIExDX0NPTExBVEUgY2F0ZWdvcnk6IHRleHQgc29ydGluZy4KKyAgICAgVGhpcyBpbmZvcm1hdGlvbiBpcyBhY2Nlc3NlZCBieSB0aGUgc3RyY29sbCBhbmQgc3RyeGZybSBmdW5jdGlvbnMuCisgICAgIFRoZXNlIGBubF9sYW5naW5mbycgbmFtZXMgYXJlIHVzZWQgb25seSBpbnRlcm5hbGx5LiAgKi8KKyAgX05MX0NPTExBVEVfTlJVTEVTID0gX05MX0lURU0gKF9fTENfQ09MTEFURSwgMCksCisgIF9OTF9DT0xMQVRFX1JVTEVTRVRTLAorICBfTkxfQ09MTEFURV9UQUJMRU1CLAorICBfTkxfQ09MTEFURV9XRUlHSFRNQiwKKyAgX05MX0NPTExBVEVfRVhUUkFNQiwKKyAgX05MX0NPTExBVEVfSU5ESVJFQ1RNQiwKKyAgX05MX0NPTExBVEVfR0FQMSwKKyAgX05MX0NPTExBVEVfR0FQMiwKKyAgX05MX0NPTExBVEVfR0FQMywKKyAgX05MX0NPTExBVEVfVEFCTEVXQywKKyAgX05MX0NPTExBVEVfV0VJR0hUV0MsCisgIF9OTF9DT0xMQVRFX0VYVFJBV0MsCisgIF9OTF9DT0xMQVRFX0lORElSRUNUV0MsCisgIF9OTF9DT0xMQVRFX1NZTUJfSEFTSF9TSVpFTUIsCisgIF9OTF9DT0xMQVRFX1NZTUJfVEFCTEVNQiwKKyAgX05MX0NPTExBVEVfU1lNQl9FWFRSQU1CLAorICBfTkxfQ09MTEFURV9DT0xMU0VRTUIsCisgIF9OTF9DT0xMQVRFX0NPTExTRVFXQywKKyAgX05MX0NPTExBVEVfQ09ERVNFVCwKKyAgX05MX05VTV9MQ19DT0xMQVRFLAorCisgIC8qIExDX0NUWVBFIGNhdGVnb3J5OiBjaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24uCisgICAgIFRoaXMgaW5mb3JtYXRpb24gaXMgYWNjZXNzZWQgYnkgdGhlIGZ1bmN0aW9ucyBpbiA8Y3R5cGUuaD4uCisgICAgIFRoZXNlIGBubF9sYW5naW5mbycgbmFtZXMgYXJlIHVzZWQgb25seSBpbnRlcm5hbGx5LiAgKi8KKyAgX05MX0NUWVBFX0NMQVNTID0gX05MX0lURU0gKF9fTENfQ1RZUEUsIDApLAorICBfTkxfQ1RZUEVfVE9VUFBFUiwKKyAgX05MX0NUWVBFX0dBUDEsCisgIF9OTF9DVFlQRV9UT0xPV0VSLAorICBfTkxfQ1RZUEVfR0FQMiwKKyAgX05MX0NUWVBFX0NMQVNTMzIsCisgIF9OTF9DVFlQRV9HQVAzLAorICBfTkxfQ1RZUEVfR0FQNCwKKyAgX05MX0NUWVBFX0dBUDUsCisgIF9OTF9DVFlQRV9HQVA2LAorICBfTkxfQ1RZUEVfQ0xBU1NfTkFNRVMsCisgIF9OTF9DVFlQRV9NQVBfTkFNRVMsCisgIF9OTF9DVFlQRV9XSURUSCwKKyAgX05MX0NUWVBFX01CX0NVUl9NQVgsCisgIF9OTF9DVFlQRV9DT0RFU0VUX05BTUUsCisgIENPREVTRVQgPSBfTkxfQ1RZUEVfQ09ERVNFVF9OQU1FLAorI2RlZmluZSBDT0RFU0VUCQkJQ09ERVNFVAorICBfTkxfQ1RZUEVfVE9VUFBFUjMyLAorICBfTkxfQ1RZUEVfVE9MT1dFUjMyLAorICBfTkxfQ1RZUEVfQ0xBU1NfT0ZGU0VULAorICBfTkxfQ1RZUEVfTUFQX09GRlNFVCwKKyAgX05MX0NUWVBFX0lORElHSVRTX01CX0xFTiwKKyAgX05MX0NUWVBFX0lORElHSVRTMF9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTMV9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTMl9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTM19NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTNF9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTNV9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTNl9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTN19NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTOF9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTOV9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTX1dDX0xFTiwKKyAgX05MX0NUWVBFX0lORElHSVRTMF9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTMV9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTMl9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTM19XQywKKyAgX05MX0NUWVBFX0lORElHSVRTNF9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTNV9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTNl9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTN19XQywKKyAgX05MX0NUWVBFX0lORElHSVRTOF9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTOV9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUMF9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUMV9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUMl9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUM19NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUNF9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUNV9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUNl9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUN19NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUOF9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUOV9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUMF9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUMV9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUMl9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUM19XQywKKyAgX05MX0NUWVBFX09VVERJR0lUNF9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUNV9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUNl9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUN19XQywKKyAgX05MX0NUWVBFX09VVERJR0lUOF9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUOV9XQywKKyAgX05MX0NUWVBFX1RSQU5TTElUX1RBQl9TSVpFLAorICBfTkxfQ1RZUEVfVFJBTlNMSVRfRlJPTV9JRFgsCisgIF9OTF9DVFlQRV9UUkFOU0xJVF9GUk9NX1RCTCwKKyAgX05MX0NUWVBFX1RSQU5TTElUX1RPX0lEWCwKKyAgX05MX0NUWVBFX1RSQU5TTElUX1RPX1RCTCwKKyAgX05MX0NUWVBFX1RSQU5TTElUX0RFRkFVTFRfTUlTU0lOR19MRU4sCisgIF9OTF9DVFlQRV9UUkFOU0xJVF9ERUZBVUxUX01JU1NJTkcsCisgIF9OTF9DVFlQRV9UUkFOU0xJVF9JR05PUkVfTEVOLAorICBfTkxfQ1RZUEVfVFJBTlNMSVRfSUdOT1JFLAorICBfTkxfQ1RZUEVfTUFQX1RPX05PTkFTQ0lJLAorICBfTkxfQ1RZUEVfTk9OQVNDSUlfQ0FTRSwKKyAgX05MX0NUWVBFX0VYVFJBX01BUF8xLAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzIsCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfMywKKyAgX05MX0NUWVBFX0VYVFJBX01BUF80LAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzUsCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfNiwKKyAgX05MX0NUWVBFX0VYVFJBX01BUF83LAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzgsCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfOSwKKyAgX05MX0NUWVBFX0VYVFJBX01BUF8xMCwKKyAgX05MX0NUWVBFX0VYVFJBX01BUF8xMSwKKyAgX05MX0NUWVBFX0VYVFJBX01BUF8xMiwKKyAgX05MX0NUWVBFX0VYVFJBX01BUF8xMywKKyAgX05MX0NUWVBFX0VYVFJBX01BUF8xNCwKKyAgX05MX05VTV9MQ19DVFlQRSwKKworICAvKiBMQ19NT05FVEFSWSBjYXRlZ29yeTogZm9ybWF0dGluZyBvZiBtb25ldGFyeSBxdWFudGl0aWVzLgorICAgICBUaGVzZSBpdGVtcyBlYWNoIGNvcnJlc3BvbmQgdG8gYSBtZW1iZXIgb2YgYHN0cnVjdCBsY29udicsCisgICAgIGRlZmluZWQgaW4gPGxvY2FsZS5oPi4gICovCisgIF9fSU5UX0NVUlJfU1lNQk9MID0gX05MX0lURU0gKF9fTENfTU9ORVRBUlksIDApLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgSU5UX0NVUlJfU1lNQk9MCV9fSU5UX0NVUlJfU1lNQk9MCisjZW5kaWYKKyAgX19DVVJSRU5DWV9TWU1CT0wsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBDVVJSRU5DWV9TWU1CT0wJX19DVVJSRU5DWV9TWU1CT0wKKyNlbmRpZgorICBfX01PTl9ERUNJTUFMX1BPSU5ULAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTU9OX0RFQ0lNQUxfUE9JTlQJX19NT05fREVDSU1BTF9QT0lOVAorI2VuZGlmCisgIF9fTU9OX1RIT1VTQU5EU19TRVAsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBNT05fVEhPVVNBTkRTX1NFUAlfX01PTl9USE9VU0FORFNfU0VQCisjZW5kaWYKKyAgX19NT05fR1JPVVBJTkcsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBNT05fR1JPVVBJTkcJCV9fTU9OX0dST1VQSU5HCisjZW5kaWYKKyAgX19QT1NJVElWRV9TSUdOLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgUE9TSVRJVkVfU0lHTgkJX19QT1NJVElWRV9TSUdOCisjZW5kaWYKKyAgX19ORUdBVElWRV9TSUdOLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTkVHQVRJVkVfU0lHTgkJX19ORUdBVElWRV9TSUdOCisjZW5kaWYKKyAgX19JTlRfRlJBQ19ESUdJVFMsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBJTlRfRlJBQ19ESUdJVFMJX19JTlRfRlJBQ19ESUdJVFMKKyNlbmRpZgorICBfX0ZSQUNfRElHSVRTLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgRlJBQ19ESUdJVFMJCV9fRlJBQ19ESUdJVFMKKyNlbmRpZgorICBfX1BfQ1NfUFJFQ0VERVMsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBQX0NTX1BSRUNFREVTCQlfX1BfQ1NfUFJFQ0VERVMKKyNlbmRpZgorICBfX1BfU0VQX0JZX1NQQUNFLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgUF9TRVBfQllfU1BBQ0UJCV9fUF9TRVBfQllfU1BBQ0UKKyNlbmRpZgorICBfX05fQ1NfUFJFQ0VERVMsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBOX0NTX1BSRUNFREVTCQlfX05fQ1NfUFJFQ0VERVMKKyNlbmRpZgorICBfX05fU0VQX0JZX1NQQUNFLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTl9TRVBfQllfU1BBQ0UJCV9fTl9TRVBfQllfU1BBQ0UKKyNlbmRpZgorICBfX1BfU0lHTl9QT1NOLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgUF9TSUdOX1BPU04JCV9fUF9TSUdOX1BPU04KKyNlbmRpZgorICBfX05fU0lHTl9QT1NOLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTl9TSUdOX1BPU04JCV9fTl9TSUdOX1BPU04KKyNlbmRpZgorICBfTkxfTU9ORVRBUllfQ1JOQ1lTVFIsCisjZGVmaW5lIENSTkNZU1RSCQlfTkxfTU9ORVRBUllfQ1JOQ1lTVFIKKyAgX19JTlRfUF9DU19QUkVDRURFUywKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIElOVF9QX0NTX1BSRUNFREVTCV9fSU5UX1BfQ1NfUFJFQ0VERVMKKyNlbmRpZgorICBfX0lOVF9QX1NFUF9CWV9TUEFDRSwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIElOVF9QX1NFUF9CWV9TUEFDRQlfX0lOVF9QX1NFUF9CWV9TUEFDRQorI2VuZGlmCisgIF9fSU5UX05fQ1NfUFJFQ0VERVMsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBJTlRfTl9DU19QUkVDRURFUwlfX0lOVF9OX0NTX1BSRUNFREVTCisjZW5kaWYKKyAgX19JTlRfTl9TRVBfQllfU1BBQ0UsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBJTlRfTl9TRVBfQllfU1BBQ0UJX19JTlRfTl9TRVBfQllfU1BBQ0UKKyNlbmRpZgorICBfX0lOVF9QX1NJR05fUE9TTiwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIElOVF9QX1NJR05fUE9TTglfX0lOVF9QX1NJR05fUE9TTgorI2VuZGlmCisgIF9fSU5UX05fU0lHTl9QT1NOLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgSU5UX05fU0lHTl9QT1NOCV9fSU5UX05fU0lHTl9QT1NOCisjZW5kaWYKKyAgX05MX01PTkVUQVJZX0RVT19JTlRfQ1VSUl9TWU1CT0wsCisgIF9OTF9NT05FVEFSWV9EVU9fQ1VSUkVOQ1lfU1lNQk9MLAorICBfTkxfTU9ORVRBUllfRFVPX0lOVF9GUkFDX0RJR0lUUywKKyAgX05MX01PTkVUQVJZX0RVT19GUkFDX0RJR0lUUywKKyAgX05MX01PTkVUQVJZX0RVT19QX0NTX1BSRUNFREVTLAorICBfTkxfTU9ORVRBUllfRFVPX1BfU0VQX0JZX1NQQUNFLAorICBfTkxfTU9ORVRBUllfRFVPX05fQ1NfUFJFQ0VERVMsCisgIF9OTF9NT05FVEFSWV9EVU9fTl9TRVBfQllfU1BBQ0UsCisgIF9OTF9NT05FVEFSWV9EVU9fSU5UX1BfQ1NfUFJFQ0VERVMsCisgIF9OTF9NT05FVEFSWV9EVU9fSU5UX1BfU0VQX0JZX1NQQUNFLAorICBfTkxfTU9ORVRBUllfRFVPX0lOVF9OX0NTX1BSRUNFREVTLAorICBfTkxfTU9ORVRBUllfRFVPX0lOVF9OX1NFUF9CWV9TUEFDRSwKKyAgX05MX01PTkVUQVJZX0RVT19QX1NJR05fUE9TTiwKKyAgX05MX01PTkVUQVJZX0RVT19OX1NJR05fUE9TTiwKKyAgX05MX01PTkVUQVJZX0RVT19JTlRfUF9TSUdOX1BPU04sCisgIF9OTF9NT05FVEFSWV9EVU9fSU5UX05fU0lHTl9QT1NOLAorICBfTkxfTU9ORVRBUllfVU5PX1ZBTElEX0ZST00sCisgIF9OTF9NT05FVEFSWV9VTk9fVkFMSURfVE8sCisgIF9OTF9NT05FVEFSWV9EVU9fVkFMSURfRlJPTSwKKyAgX05MX01PTkVUQVJZX0RVT19WQUxJRF9UTywKKyAgX05MX01PTkVUQVJZX0NPTlZFUlNJT05fUkFURSwKKyAgX05MX01PTkVUQVJZX0RFQ0lNQUxfUE9JTlRfV0MsCisgIF9OTF9NT05FVEFSWV9USE9VU0FORFNfU0VQX1dDLAorICBfTkxfTU9ORVRBUllfQ09ERVNFVCwKKyAgX05MX05VTV9MQ19NT05FVEFSWSwKKworICAvKiBMQ19OVU1FUklDIGNhdGVnb3J5OiBmb3JtYXR0aW5nIG9mIG51bWJlcnMuCisgICAgIFRoZXNlIGFsc28gY29ycmVzcG9uZCB0byBtZW1iZXJzIG9mIGBzdHJ1Y3QgbGNvbnYnOyBzZWUgPGxvY2FsZS5oPi4gICovCisgIF9fREVDSU1BTF9QT0lOVCA9IF9OTF9JVEVNIChfX0xDX05VTUVSSUMsIDApLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgREVDSU1BTF9QT0lOVAkJX19ERUNJTUFMX1BPSU5UCisjZW5kaWYKKyAgUkFESVhDSEFSID0gX19ERUNJTUFMX1BPSU5ULAorI2RlZmluZSBSQURJWENIQVIJCVJBRElYQ0hBUgorICBfX1RIT1VTQU5EU19TRVAsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBUSE9VU0FORFNfU0VQCQlfX1RIT1VTQU5EU19TRVAKKyNlbmRpZgorICBUSE9VU0VQID0gX19USE9VU0FORFNfU0VQLAorI2RlZmluZSBUSE9VU0VQCQkJVEhPVVNFUAorICBfX0dST1VQSU5HLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgR1JPVVBJTkcJCV9fR1JPVVBJTkcKKyNlbmRpZgorICBfTkxfTlVNRVJJQ19ERUNJTUFMX1BPSU5UX1dDLAorICBfTkxfTlVNRVJJQ19USE9VU0FORFNfU0VQX1dDLAorICBfTkxfTlVNRVJJQ19DT0RFU0VULAorICBfTkxfTlVNX0xDX05VTUVSSUMsCisKKyAgX19ZRVNFWFBSID0gX05MX0lURU0gKF9fTENfTUVTU0FHRVMsIDApLCAvKiBSZWdleCBtYXRjaGluZyBgYHllcycnIGlucHV0LiAgKi8KKyNkZWZpbmUgWUVTRVhQUgkJCV9fWUVTRVhQUgorICBfX05PRVhQUiwJCQkvKiBSZWdleCBtYXRjaGluZyBgYG5vJycgaW5wdXQuICAqLworI2RlZmluZSBOT0VYUFIJCQlfX05PRVhQUgorICBfX1lFU1NUUiwJCQkvKiBPdXRwdXQgc3RyaW5nIGZvciBgYHllcycnLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX0dOVSB8fCAoZGVmaW5lZCBfX1VTRV9YT1BFTiAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorIyBkZWZpbmUgWUVTU1RSCQkJX19ZRVNTVFIKKyNlbmRpZgorICBfX05PU1RSLAkJCS8qIE91dHB1dCBzdHJpbmcgZm9yIGBgbm8nJy4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9HTlUgfHwgKGRlZmluZWQgX19VU0VfWE9QRU4gJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySykKKyMgZGVmaW5lIE5PU1RSCQkJX19OT1NUUgorI2VuZGlmCisgIF9OTF9NRVNTQUdFU19DT0RFU0VULAorICBfTkxfTlVNX0xDX01FU1NBR0VTLAorCisgIF9OTF9QQVBFUl9IRUlHSFQgPSBfTkxfSVRFTSAoX19MQ19QQVBFUiwgMCksCisgIF9OTF9QQVBFUl9XSURUSCwKKyAgX05MX1BBUEVSX0NPREVTRVQsCisgIF9OTF9OVU1fTENfUEFQRVIsCisKKyAgX05MX05BTUVfTkFNRV9GTVQgPSBfTkxfSVRFTSAoX19MQ19OQU1FLCAwKSwKKyAgX05MX05BTUVfTkFNRV9HRU4sCisgIF9OTF9OQU1FX05BTUVfTVIsCisgIF9OTF9OQU1FX05BTUVfTVJTLAorICBfTkxfTkFNRV9OQU1FX01JU1MsCisgIF9OTF9OQU1FX05BTUVfTVMsCisgIF9OTF9OQU1FX0NPREVTRVQsCisgIF9OTF9OVU1fTENfTkFNRSwKKworICBfTkxfQUREUkVTU19QT1NUQUxfRk1UID0gX05MX0lURU0gKF9fTENfQUREUkVTUywgMCksCisgIF9OTF9BRERSRVNTX0NPVU5UUllfTkFNRSwKKyAgX05MX0FERFJFU1NfQ09VTlRSWV9QT1NULAorICBfTkxfQUREUkVTU19DT1VOVFJZX0FCMiwKKyAgX05MX0FERFJFU1NfQ09VTlRSWV9BQjMsCisgIF9OTF9BRERSRVNTX0NPVU5UUllfQ0FSLAorICBfTkxfQUREUkVTU19DT1VOVFJZX05VTSwKKyAgX05MX0FERFJFU1NfQ09VTlRSWV9JU0JOLAorICBfTkxfQUREUkVTU19MQU5HX05BTUUsCisgIF9OTF9BRERSRVNTX0xBTkdfQUIsCisgIF9OTF9BRERSRVNTX0xBTkdfVEVSTSwKKyAgX05MX0FERFJFU1NfTEFOR19MSUIsCisgIF9OTF9BRERSRVNTX0NPREVTRVQsCisgIF9OTF9OVU1fTENfQUREUkVTUywKKworICBfTkxfVEVMRVBIT05FX1RFTF9JTlRfRk1UID0gX05MX0lURU0gKF9fTENfVEVMRVBIT05FLCAwKSwKKyAgX05MX1RFTEVQSE9ORV9URUxfRE9NX0ZNVCwKKyAgX05MX1RFTEVQSE9ORV9JTlRfU0VMRUNULAorICBfTkxfVEVMRVBIT05FX0lOVF9QUkVGSVgsCisgIF9OTF9URUxFUEhPTkVfQ09ERVNFVCwKKyAgX05MX05VTV9MQ19URUxFUEhPTkUsCisKKyAgX05MX01FQVNVUkVNRU5UX01FQVNVUkVNRU5UID0gX05MX0lURU0gKF9fTENfTUVBU1VSRU1FTlQsIDApLAorICBfTkxfTUVBU1VSRU1FTlRfQ09ERVNFVCwKKyAgX05MX05VTV9MQ19NRUFTVVJFTUVOVCwKKworICBfTkxfSURFTlRJRklDQVRJT05fVElUTEUgPSBfTkxfSVRFTSAoX19MQ19JREVOVElGSUNBVElPTiwgMCksCisgIF9OTF9JREVOVElGSUNBVElPTl9TT1VSQ0UsCisgIF9OTF9JREVOVElGSUNBVElPTl9BRERSRVNTLAorICBfTkxfSURFTlRJRklDQVRJT05fQ09OVEFDVCwKKyAgX05MX0lERU5USUZJQ0FUSU9OX0VNQUlMLAorICBfTkxfSURFTlRJRklDQVRJT05fVEVMLAorICBfTkxfSURFTlRJRklDQVRJT05fRkFYLAorICBfTkxfSURFTlRJRklDQVRJT05fTEFOR1VBR0UsCisgIF9OTF9JREVOVElGSUNBVElPTl9URVJSSVRPUlksCisgIF9OTF9JREVOVElGSUNBVElPTl9BVURJRU5DRSwKKyAgX05MX0lERU5USUZJQ0FUSU9OX0FQUExJQ0FUSU9OLAorICBfTkxfSURFTlRJRklDQVRJT05fQUJCUkVWSUFUSU9OLAorICBfTkxfSURFTlRJRklDQVRJT05fUkVWSVNJT04sCisgIF9OTF9JREVOVElGSUNBVElPTl9EQVRFLAorICBfTkxfSURFTlRJRklDQVRJT05fQ0FURUdPUlksCisgIF9OTF9JREVOVElGSUNBVElPTl9DT0RFU0VULAorICBfTkxfTlVNX0xDX0lERU5USUZJQ0FUSU9OLAorCisgIC8qIFRoaXMgbWFya3MgdGhlIGhpZ2hlc3QgdmFsdWUgdXNlZC4gICovCisgIF9OTF9OVU0KK307CisKKy8qIFRoaXMgbWFjcm8gcHJvZHVjZXMgYW4gaXRlbSB5b3UgY2FuIHBhc3MgdG8gYG5sX2xhbmdpbmZvJyBvcgorICAgYG5sX2xhbmdpbmZvX2wnIHRvIGdldCB0aGUgbmFtZSBvZiB0aGUgbG9jYWxlIGluIHVzZSBmb3IgQ0FURUdPUlkuICAqLworI2RlZmluZSBfTkxfTE9DQUxFX05BTUUoY2F0ZWdvcnkpCV9OTF9JVEVNICgoY2F0ZWdvcnkpLAkJICAgICAgXAorCQkJCQkJICBfTkxfSVRFTV9JTkRFWCAoLTEpKQorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTkxfTE9DQUxFX05BTUUoY2F0ZWdvcnkpCV9OTF9MT0NBTEVfTkFNRSAoY2F0ZWdvcnkpCisjZW5kaWYKKworCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgbG9jYWxlJ3MgdmFsdWUgZm9yIElURU0uCisgICBJZiBJVEVNIGlzIGludmFsaWQsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKworICAgVGhlIHN0cmluZyByZXR1cm5lZCB3aWxsIG5vdCBjaGFuZ2UgdW50aWwgYHNldGxvY2FsZScgaXMgY2FsbGVkOworICAgaXQgaXMgdXN1YWxseSBpbiByZWFkLW9ubHkgbWVtb3J5IGFuZCBjYW5ub3QgYmUgbW9kaWZpZWQuICAqLworCitleHRlcm4gY2hhciAqbmxfbGFuZ2luZm8gKG5sX2l0ZW0gX19pdGVtKSBfX1RIUk9XOworCisKKyNpZmRlZglfX1VTRV9YT1BFTjJLCisvKiBUaGlzIGludGVyZmFjZSBpcyBmb3IgdGhlIGV4dGVuZGVkIGxvY2FsZSBtb2RlbC4gIFNlZSA8bG9jYWxlLmg+IGZvcgorICAgbW9yZSBpbmZvcm1hdGlvbi4gICovCisKKy8qIEdldCBsb2NhbGUgZGF0YXR5cGUgZGVmaW5pdGlvbi4gICovCisjIGluY2x1ZGUgPHhsb2NhbGUuaD4KKworLyogSnVzdCBsaWtlIG5sX2xhbmdpbmZvIGJ1dCBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGxvY2FsZSBvYmplY3QgTC4gICovCitleHRlcm4gY2hhciAqbmxfbGFuZ2luZm9fbCAobmxfaXRlbSBfX2l0ZW0sIF9fbG9jYWxlX3QgX19sKTsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogbGFuZ2luZm8uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9sYXN0bG9nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xhc3Rsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2M0MjU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9sYXN0bG9nLmgKQEAgLTAsMCArMSw0IEBACisvKiBUaGlzIGhlYWRlciBmaWxlIGlzIHVzZWQgaW4gNC4zQlNEIHRvIGRlZmluZSBgc3RydWN0IGxhc3Rsb2cnLAorICAgd2hpY2ggd2UgZGVmaW5lIGluIDxiaXRzL3V0bXAuaD4uICAqLworCisjaW5jbHVkZSA8dXRtcC5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saWJnZW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGliZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1MjU0MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGliZ2VuLmgKQEAgLTAsMCArMSw0MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9MSUJHRU5fSAorI2RlZmluZSBfTElCR0VOX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gZGlyZWN0b3J5IHBhcnQgb2YgUEFUSCBvciAiLiIgaWYgbm9uZSBpcyBhdmFpbGFibGUuICAqLworZXh0ZXJuIGNoYXIgKmRpcm5hbWUgKGNoYXIgKl9fcGF0aCkgX19USFJPVzsKKworLyogUmV0dXJuIGZpbmFsIGNvbXBvbmVudCBvZiBQQVRILgorCisgICBUaGlzIGlzIHRoZSB3ZWlyZCBYUEcgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uLiAgSXQgc29tZXRpbWVzIHdpbGwKKyAgIG1vZGlmeSBpdHMgYXJndW1lbnQuICBUaGVyZWZvcmUgd2Ugbm9ybWFsbHkgdXNlIHRoZSBHTlUgdmVyc2lvbiAoaW4KKyAgIDxzdHJpbmcuaD4pIGFuZCBvbmx5IGlmIHRoaXMgaGVhZGVyIGlzIGluY2x1ZGVkIG1ha2UgdGhlIFhQRworICAgdmVyc2lvbiBhdmFpbGFibGUgdW5kZXIgdGhlIHJlYWwgbmFtZS4gICovCitleHRlcm4gY2hhciAqX194cGdfYmFzZW5hbWUgKGNoYXIgKl9fcGF0aCkgX19USFJPVzsKKyNkZWZpbmUgYmFzZW5hbWUJX194cGdfYmFzZW5hbWUKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGxpYmdlbi5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpYmludGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGliaW50bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NGRlYzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpYmludGwuaApAQCAtMCwwICsxLDEyNCBAQAorLyogTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiwgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgZmlsZSBsaWJnZXR0ZXh0LmggaW4gdGhlIEdOVSBnZXR0ZXh0IHBhY2thZ2UuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9MSUJJTlRMX0gKKyNkZWZpbmUgX0xJQklOVExfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKKyAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLworI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCisKKy8qIFByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1cHBvcnRlZCBmaWxlIGZvcm1hdHMuICBSZXR1cm5zIHRoZQorICAgbWF4aW11bSBtaW5vciByZXZpc2lvbiBudW1iZXIgc3VwcG9ydGVkIGZvciBhIGdpdmVuIG1ham9yIHJldmlzaW9uLiAgKi8KKyNkZWZpbmUgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04obWFqb3IpIFwKKyAgKChtYWpvcikgPT0gMCA/IDEgOiAtMSkKKworX19CRUdJTl9ERUNMUworCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKKyAgIHRleHQpLiAgKi8KK2V4dGVybiBjaGFyICpnZXR0ZXh0IChfX2NvbnN0IGNoYXIgKl9fbXNnaWQpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fICgxKTsKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50CisgICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLworZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0IChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgX19jb25zdCBjaGFyICpfX21zZ2lkKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyAoMik7CitleHRlcm4gY2hhciAqX19kZ2V0dGV4dCAoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIF9fY29uc3QgY2hhciAqX19tc2dpZCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18gKDIpOworCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKKyAgIGxvY2FsZS4gICovCitleHRlcm4gY2hhciAqZGNnZXR0ZXh0IChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCV9fY29uc3QgY2hhciAqX19tc2dpZCwgaW50IF9fY2F0ZWdvcnkpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fICgyKTsKK2V4dGVybiBjaGFyICpfX2RjZ2V0dGV4dCAoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkgIF9fY29uc3QgY2hhciAqX19tc2dpZCwgaW50IF9fY2F0ZWdvcnkpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fICgyKTsKKworCisvKiBTaW1pbGFyIHRvIGBnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgbnVtYmVyIE4uICAqLworZXh0ZXJuIGNoYXIgKm5nZXR0ZXh0IChfX2NvbnN0IGNoYXIgKl9fbXNnaWQxLCBfX2NvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgX19uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyAoMSkgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fICgyKTsKKworLyogU2ltaWxhciB0byBgZGdldHRleHQnIGJ1dCBzZWxlY3QgdGhlIHBsdXJhbCBmb3JtIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICBudW1iZXIgTi4gICovCitleHRlcm4gY2hhciAqZG5nZXR0ZXh0IChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgX19jb25zdCBjaGFyICpfX21zZ2lkMSwKKwkJCV9fY29uc3QgY2hhciAqX19tc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18gKDIpIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyAoMyk7CisKKy8qIFNpbWlsYXIgdG8gYGRjZ2V0dGV4dCcgYnV0IHNlbGVjdCB0aGUgcGx1cmFsIGZvcm0gY29ycmVzcG9uZGluZyB0byB0aGUKKyAgIG51bWJlciBOLiAgKi8KK2V4dGVybiBjaGFyICpkY25nZXR0ZXh0IChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgX19jb25zdCBjaGFyICpfX21zZ2lkMSwKKwkJCSBfX2NvbnN0IGNoYXIgKl9fbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBfX24sCisJCQkgaW50IF9fY2F0ZWdvcnkpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fICgyKSBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18gKDMpOworCisKKy8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgorICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KKyAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLworZXh0ZXJuIGNoYXIgKnRleHRkb21haW4gKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lKSBfX1RIUk9XOworCisvKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKKyAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KK2V4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiAoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkgICAgIF9fY29uc3QgY2hhciAqX19kaXJuYW1lKSBfX1RIUk9XOworCisvKiBTcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gd2hpY2ggdGhlIG1lc3NhZ2VzIGZyb20gdGhlCisgICBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIHJldHVybmVkLiAgKi8KK2V4dGVybiBjaGFyICpiaW5kX3RleHRkb21haW5fY29kZXNldCAoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJICAgICAgX19jb25zdCBjaGFyICpfX2NvZGVzZXQpIF9fVEhST1c7CisKKworLyogT3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIGFib3ZlLiAgKi8KKyNpZiBkZWZpbmVkIF9fT1BUSU1JWkVfXyAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworCisvKiBXZSBuZWVkIE5VTEwgZm9yIGBnZXR0ZXh0Jy4gICovCisjIGRlZmluZSBfX25lZWRfTlVMTAorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogV2UgbmVlZCBMQ19NRVNTQUdFUyBmb3IgYGRnZXR0ZXh0Jy4gICovCisjIGluY2x1ZGUgPGxvY2FsZS5oPgorCisvKiBUaGVzZSBtdXN0IGJlIG1hY3Jvcy4gIElubGluZWQgZnVuY3Rpb25zIGFyZSB1c2VsZXNzIGJlY2F1c2UgdGhlCisgICBgX19idWlsdGluX2NvbnN0YW50X3AnIHByZWRpY2F0ZSBpbiBkY2dldHRleHQgd291bGQgYWx3YXlzIHJldHVybgorICAgZmFsc2UuICAqLworCisjIGRlZmluZSBnZXR0ZXh0KG1zZ2lkKSBkZ2V0dGV4dCAoTlVMTCwgbXNnaWQpCisKKyMgZGVmaW5lIGRnZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkKSBcCisgIGRjZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQsIExDX01FU1NBR0VTKQorCisjIGRlZmluZSBuZ2V0dGV4dChtc2dpZDEsIG1zZ2lkMiwgbikgZG5nZXR0ZXh0IChOVUxMLCBtc2dpZDEsIG1zZ2lkMiwgbikKKworIyBkZWZpbmUgZG5nZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBuKSBcCisgIGRjbmdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBuLCBMQ19NRVNTQUdFUykKKworI2VuZGlmCS8qIE9wdGltaXppbmcuICAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbGliaW50bC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpYmlvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpYmlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViYzExMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGliaW8uaApAQCAtMCwwICsxLDU1NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTUsMTk5Ny0yMDA2LDIwMDcsMjAwOSwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBXcml0dGVuIGJ5IFBlciBCb3RobmVyIDxib3RobmVyQGN5Z251cy5jb20+LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGUgY29kZSBpbiB0aGlzIGZpbGUgd2l0aAorICAgZmlsZXMgY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsCisgICB0aGF0IGRvZXMgbm90IGNhdXNlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5CisgICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QKKyAgIGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkgdGhlIGV4ZWN1dGFibGUgZmlsZQorICAgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICAgVGhpcyBleGNlcHRpb24gYXBwbGllcyB0byBjb2RlIHJlbGVhc2VkIGJ5IGl0cyBjb3B5cmlnaHQgaG9sZGVycworICAgaW4gZmlsZXMgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uLiAgKi8KKworI2lmbmRlZiBfSU9fU1RESU9fSAorI2RlZmluZSBfSU9fU1RESU9fSAorCisjaW5jbHVkZSA8X0dfY29uZmlnLmg+CisvKiBBTEwgb2YgdGhlc2Ugc2hvdWxkIGJlIGRlZmluZWQgaW4gX0dfY29uZmlnLmggKi8KKyNkZWZpbmUgX0lPX3Bvc190IF9HX2Zwb3NfdCAvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBfSU9fZnBvc190IF9HX2Zwb3NfdAorI2RlZmluZSBfSU9fZnBvczY0X3QgX0dfZnBvczY0X3QKKyNkZWZpbmUgX0lPX3NpemVfdCBfR19zaXplX3QKKyNkZWZpbmUgX0lPX3NzaXplX3QgX0dfc3NpemVfdAorI2RlZmluZSBfSU9fb2ZmX3QgX0dfb2ZmX3QKKyNkZWZpbmUgX0lPX29mZjY0X3QgX0dfb2ZmNjRfdAorI2RlZmluZSBfSU9fcGlkX3QgX0dfcGlkX3QKKyNkZWZpbmUgX0lPX3VpZF90IF9HX3VpZF90CisjZGVmaW5lIF9JT19pY29udl90IF9HX2ljb252X3QKKyNkZWZpbmUgX0lPX0hBVkVfU1lTX1dBSVQgX0dfSEFWRV9TWVNfV0FJVAorI2RlZmluZSBfSU9fSEFWRV9TVF9CTEtTSVpFIF9HX0hBVkVfU1RfQkxLU0laRQorI2RlZmluZSBfSU9fQlVGU0laIF9HX0JVRlNJWgorI2RlZmluZSBfSU9fdmFfbGlzdCBfR192YV9saXN0CisjZGVmaW5lIF9JT193aW50X3QgX0dfd2ludF90CisKKyNpZmRlZiBfR19ORUVEX1NUREFSR19ICisvKiBUaGlzIGRlZmluZSBhdm9pZHMgbmFtZSBwb2xsdXRpb24gaWYgd2UncmUgdXNpbmcgR05VIHN0ZGFyZy5oICovCisjIGRlZmluZSBfX25lZWRfX192YV9saXN0CisjIGluY2x1ZGUgPHN0ZGFyZy5oPgorIyBpZmRlZiBfX0dOVUNfVkFfTElTVAorIyAgdW5kZWYgX0lPX3ZhX2xpc3QKKyMgIGRlZmluZSBfSU9fdmFfbGlzdCBfX2dudWNfdmFfbGlzdAorIyBlbmRpZiAvKiBfX0dOVUNfVkFfTElTVCAqLworI2VuZGlmCisKKyNpZm5kZWYgX19QCisjIGlmIF9HX0hBVkVfU1lTX0NERUZTCisjICBpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyMgZWxzZQorIyAgaWZkZWYgX19TVERDX18KKyMgICBkZWZpbmUgX19QKHApIHAKKyMgICBkZWZpbmUgX19QTVQocCkgcAorIyAgZWxzZQorIyAgIGRlZmluZSBfX1AocCkgKCkKKyMgICBkZWZpbmUgX19QTVQocCkgKCkKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYgLyohX19QKi8KKworLyogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyNpZm5kZWYgX1BBUkFNUworIyBkZWZpbmUgX1BBUkFNUyhwcm90b3MpIF9fUChwcm90b3MpCisjZW5kaWYgLyohX1BBUkFNUyovCisKKyNpZm5kZWYgX19TVERDX18KKyMgaWZuZGVmIGNvbnN0CisjICBkZWZpbmUgY29uc3QKKyMgZW5kaWYKKyNlbmRpZgorI2RlZmluZSBfSU9fVU5JRklFRF9KVU1QVEFCTEVTIDEKKyNpZm5kZWYgX0dfSEFWRV9QUklOVEZfRlAKKyMgZGVmaW5lIF9JT19VU0VfRFRPQSAxCisjZW5kaWYKKworI2lmbmRlZiBFT0YKKyMgZGVmaW5lIEVPRiAoLTEpCisjZW5kaWYKKyNpZm5kZWYgTlVMTAorIyBpZiBkZWZpbmVkIF9fR05VR19fICYmIFwKKyAgICAoX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDgpKQorIyAgZGVmaW5lIE5VTEwgKF9fbnVsbCkKKyMgZWxzZQorIyAgaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpCisjICAgZGVmaW5lIE5VTEwgKCh2b2lkKikwKQorIyAgZWxzZQorIyAgIGRlZmluZSBOVUxMICgwKQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIF9JT1NfSU5QVVQJMQorI2RlZmluZSBfSU9TX09VVFBVVAkyCisjZGVmaW5lIF9JT1NfQVRFTkQJNAorI2RlZmluZSBfSU9TX0FQUEVORAk4CisjZGVmaW5lIF9JT1NfVFJVTkMJMTYKKyNkZWZpbmUgX0lPU19OT0NSRUFURQkzMgorI2RlZmluZSBfSU9TX05PUkVQTEFDRQk2NAorI2RlZmluZSBfSU9TX0JJTgkxMjgKKworLyogTWFnaWMgbnVtYmVycyBhbmQgYml0cyBmb3IgdGhlIF9mbGFncyBmaWVsZC4KKyAgIFRoZSBtYWdpYyBudW1iZXJzIHVzZSB0aGUgaGlnaC1vcmRlciBiaXRzIG9mIF9mbGFnczsKKyAgIHRoZSByZW1haW5pbmcgYml0cyBhcmUgYXZhaWxhYmxlIGZvciB2YXJpYWJsZSBmbGFncy4KKyAgIE5vdGU6IFRoZSBtYWdpYyBudW1iZXJzIG11c3QgYWxsIGJlIG5lZ2F0aXZlIGlmIHN0ZGlvCisgICBlbXVsYXRpb24gaXMgZGVzaXJlZC4gKi8KKworI2RlZmluZSBfSU9fTUFHSUMgMHhGQkFEMDAwMCAvKiBNYWdpYyBudW1iZXIgKi8KKyNkZWZpbmUgX09MRF9TVERJT19NQUdJQyAweEZBQkMwMDAwIC8qIEVtdWxhdGUgb2xkIHN0ZGlvLiAqLworI2RlZmluZSBfSU9fTUFHSUNfTUFTSyAweEZGRkYwMDAwCisjZGVmaW5lIF9JT19VU0VSX0JVRiAxIC8qIFVzZXIgb3ducyBidWZmZXI7IGRvbid0IGRlbGV0ZSBpdCBvbiBjbG9zZS4gKi8KKyNkZWZpbmUgX0lPX1VOQlVGRkVSRUQgMgorI2RlZmluZSBfSU9fTk9fUkVBRFMgNCAvKiBSZWFkaW5nIG5vdCBhbGxvd2VkICovCisjZGVmaW5lIF9JT19OT19XUklURVMgOCAvKiBXcml0aW5nIG5vdCBhbGxvd2QgKi8KKyNkZWZpbmUgX0lPX0VPRl9TRUVOIDB4MTAKKyNkZWZpbmUgX0lPX0VSUl9TRUVOIDB4MjAKKyNkZWZpbmUgX0lPX0RFTEVURV9ET05UX0NMT1NFIDB4NDAgLyogRG9uJ3QgY2FsbCBjbG9zZShfZmlsZW5vKSBvbiBjbGVhbnVwLiAqLworI2RlZmluZSBfSU9fTElOS0VEIDB4ODAgLyogU2V0IGlmIGxpbmtlZCAodXNpbmcgX2NoYWluKSB0byBzdHJlYW1idWY6Ol9saXN0X2FsbC4qLworI2RlZmluZSBfSU9fSU5fQkFDS1VQIDB4MTAwCisjZGVmaW5lIF9JT19MSU5FX0JVRiAweDIwMAorI2RlZmluZSBfSU9fVElFRF9QVVRfR0VUIDB4NDAwIC8qIFNldCBpZiBwdXQgYW5kIGdldCBwb2ludGVyIGxvZ2ljbHkgdGllZC4gKi8KKyNkZWZpbmUgX0lPX0NVUlJFTlRMWV9QVVRUSU5HIDB4ODAwCisjZGVmaW5lIF9JT19JU19BUFBFTkRJTkcgMHgxMDAwCisjZGVmaW5lIF9JT19JU19GSUxFQlVGIDB4MjAwMAorI2RlZmluZSBfSU9fQkFEX1NFRU4gMHg0MDAwCisjZGVmaW5lIF9JT19VU0VSX0xPQ0sgMHg4MDAwCisKKyNkZWZpbmUgX0lPX0ZMQUdTMl9NTUFQIDEKKyNkZWZpbmUgX0lPX0ZMQUdTMl9OT1RDQU5DRUwgMgorI2lmZGVmIF9MSUJDCisjIGRlZmluZSBfSU9fRkxBR1MyX0ZPUlRJRlkgNAorI2VuZGlmCisjZGVmaW5lIF9JT19GTEFHUzJfVVNFUl9XQlVGIDgKKyNpZmRlZiBfTElCQworIyBkZWZpbmUgX0lPX0ZMQUdTMl9TQ0FORl9TVEQgMTYKKyMgZGVmaW5lIF9JT19GTEFHUzJfTk9DTE9TRSAzMgorIyBkZWZpbmUgX0lPX0ZMQUdTMl9DTE9FWEVDIDY0CisjZW5kaWYKKworLyogVGhlc2UgYXJlICJmb3JtYXR0aW5nIGZsYWdzIiBtYXRjaGluZyB0aGUgaW9zdHJlYW0gZm10ZmxhZ3MgZW51bSB2YWx1ZXMuICovCisjZGVmaW5lIF9JT19TS0lQV1MgMDEKKyNkZWZpbmUgX0lPX0xFRlQgMDIKKyNkZWZpbmUgX0lPX1JJR0hUIDA0CisjZGVmaW5lIF9JT19JTlRFUk5BTCAwMTAKKyNkZWZpbmUgX0lPX0RFQyAwMjAKKyNkZWZpbmUgX0lPX09DVCAwNDAKKyNkZWZpbmUgX0lPX0hFWCAwMTAwCisjZGVmaW5lIF9JT19TSE9XQkFTRSAwMjAwCisjZGVmaW5lIF9JT19TSE9XUE9JTlQgMDQwMAorI2RlZmluZSBfSU9fVVBQRVJDQVNFIDAxMDAwCisjZGVmaW5lIF9JT19TSE9XUE9TIDAyMDAwCisjZGVmaW5lIF9JT19TQ0lFTlRJRklDIDA0MDAwCisjZGVmaW5lIF9JT19GSVhFRCAwMTAwMDAKKyNkZWZpbmUgX0lPX1VOSVRCVUYgMDIwMDAwCisjZGVmaW5lIF9JT19TVERJTyAwNDAwMDAKKyNkZWZpbmUgX0lPX0RPTlRfQ0xPU0UgMDEwMDAwMAorI2RlZmluZSBfSU9fQk9PTEFMUEhBIDAyMDAwMDAKKworCitzdHJ1Y3QgX0lPX2p1bXBfdDsgIHN0cnVjdCBfSU9fRklMRTsKKworLyogSGFuZGxlIGxvY2suICAqLworI2lmZGVmIF9JT19NVFNBRkVfSU8KKyMgaWYgZGVmaW5lZCBfX0dMSUJDX18gJiYgX19HTElCQ19fID49IDIKKyMgIGluY2x1ZGUgPGJpdHMvc3RkaW8tbG9jay5oPgorIyBlbHNlCisvKiMgaW5jbHVkZSA8Y29tdGhyZWFkLmg+Ki8KKyMgZW5kaWYKKyNlbHNlCit0eXBlZGVmIHZvaWQgX0lPX2xvY2tfdDsKKyNlbmRpZgorCisKKy8qIEEgc3RyZWFtbWFya2VyIHJlbWVtYmVycyBhIHBvc2l0aW9uIGluIGEgYnVmZmVyLiAqLworCitzdHJ1Y3QgX0lPX21hcmtlciB7CisgIHN0cnVjdCBfSU9fbWFya2VyICpfbmV4dDsKKyAgc3RydWN0IF9JT19GSUxFICpfc2J1ZjsKKyAgLyogSWYgX3BvcyA+PSAwCisgaXQgcG9pbnRzIHRvIF9idWYtPkdiYXNlKCkrX3Bvcy4gRklYTUUgY29tbWVudCAqLworICAvKiBpZiBfcG9zIDwgMCwgaXQgcG9pbnRzIHRvIF9idWYtPmVCcHRyKCkrX3Bvcy4gRklYTUUgY29tbWVudCAqLworICBpbnQgX3BvczsKKyNpZiAwCisgICAgdm9pZCBzZXRfc3RyZWFtcG9zKHN0cmVhbXBvcyBzcCkgeyBfc3BvcyA9IHNwOyB9CisgICAgdm9pZCBzZXRfb2Zmc2V0KGludCBvZmZzZXQpIHsgX3BvcyA9IG9mZnNldDsgX3Nwb3MgPSAoc3RyZWFtcG9zKSgtMik7IH0KKyAgcHVibGljOgorICAgIHN0cmVhbW1hcmtlcihzdHJlYW1idWYgKnNiKTsKKyAgICB+c3RyZWFtbWFya2VyKCk7CisgICAgaW50IHNhdmluZygpIHsgcmV0dXJuICBfc3BvcyA9PSAtMjsgfQorICAgIGludCBkZWx0YShzdHJlYW1tYXJrZXImKTsKKyAgICBpbnQgZGVsdGEoKTsKKyNlbmRpZgorfTsKKworLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIGZyb20gdGhlIGxpYnN0ZGMrKyBjb2RlY3Z0IGNsYXNzLiAgKi8KK2VudW0gX19jb2RlY3Z0X3Jlc3VsdAoreworICBfX2NvZGVjdnRfb2ssCisgIF9fY29kZWN2dF9wYXJ0aWFsLAorICBfX2NvZGVjdnRfZXJyb3IsCisgIF9fY29kZWN2dF9ub2NvbnYKK307CisKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgX0dMSUJDUFBfVVNFX1dDSEFSX1QKKy8qIFRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGZvbGxvd2luZyBzdHJ1Y3QgbXVzdCBtYXRjaCB0aGUgb3JkZXIKKyAgIG9mIHRoZSB2aXJ0dWFsIGZ1bmN0aW9ucyBpbiB0aGUgbGlic3RkYysrIGNvZGVjdnQgY2xhc3MuICAqLworc3RydWN0IF9JT19jb2RlY3Z0Cit7CisgIHZvaWQgKCpfX2NvZGVjdnRfZGVzdHIpIChzdHJ1Y3QgX0lPX2NvZGVjdnQgKik7CisgIGVudW0gX19jb2RlY3Z0X3Jlc3VsdCAoKl9fY29kZWN2dF9kb19vdXQpIChzdHJ1Y3QgX0lPX2NvZGVjdnQgKiwKKwkJCQkJICAgICBfX21ic3RhdGVfdCAqLAorCQkJCQkgICAgIGNvbnN0IHdjaGFyX3QgKiwKKwkJCQkJICAgICBjb25zdCB3Y2hhcl90ICosCisJCQkJCSAgICAgY29uc3Qgd2NoYXJfdCAqKiwgY2hhciAqLAorCQkJCQkgICAgIGNoYXIgKiwgY2hhciAqKik7CisgIGVudW0gX19jb2RlY3Z0X3Jlc3VsdCAoKl9fY29kZWN2dF9kb191bnNoaWZ0KSAoc3RydWN0IF9JT19jb2RlY3Z0ICosCisJCQkJCQkgX19tYnN0YXRlX3QgKiwgY2hhciAqLAorCQkJCQkJIGNoYXIgKiwgY2hhciAqKik7CisgIGVudW0gX19jb2RlY3Z0X3Jlc3VsdCAoKl9fY29kZWN2dF9kb19pbikgKHN0cnVjdCBfSU9fY29kZWN2dCAqLAorCQkJCQkgICAgX19tYnN0YXRlX3QgKiwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCQkJCQkgICAgY29uc3QgY2hhciAqKiwgd2NoYXJfdCAqLAorCQkJCQkgICAgd2NoYXJfdCAqLCB3Y2hhcl90ICoqKTsKKyAgaW50ICgqX19jb2RlY3Z0X2RvX2VuY29kaW5nKSAoc3RydWN0IF9JT19jb2RlY3Z0ICopOworICBpbnQgKCpfX2NvZGVjdnRfZG9fYWx3YXlzX25vY29udikgKHN0cnVjdCBfSU9fY29kZWN2dCAqKTsKKyAgaW50ICgqX19jb2RlY3Z0X2RvX2xlbmd0aCkgKHN0cnVjdCBfSU9fY29kZWN2dCAqLCBfX21ic3RhdGVfdCAqLAorCQkJICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIF9JT19zaXplX3QpOworICBpbnQgKCpfX2NvZGVjdnRfZG9fbWF4X2xlbmd0aCkgKHN0cnVjdCBfSU9fY29kZWN2dCAqKTsKKworICBfSU9faWNvbnZfdCBfX2NkX2luOworICBfSU9faWNvbnZfdCBfX2NkX291dDsKK307CisKKy8qIEV4dHJhIGRhdGEgZm9yIHdpZGUgY2hhcmFjdGVyIHN0cmVhbXMuICAqLworc3RydWN0IF9JT193aWRlX2RhdGEKK3sKKyAgd2NoYXJfdCAqX0lPX3JlYWRfcHRyOwkvKiBDdXJyZW50IHJlYWQgcG9pbnRlciAqLworICB3Y2hhcl90ICpfSU9fcmVhZF9lbmQ7CS8qIEVuZCBvZiBnZXQgYXJlYS4gKi8KKyAgd2NoYXJfdCAqX0lPX3JlYWRfYmFzZTsJLyogU3RhcnQgb2YgcHV0YmFjaytnZXQgYXJlYS4gKi8KKyAgd2NoYXJfdCAqX0lPX3dyaXRlX2Jhc2U7CS8qIFN0YXJ0IG9mIHB1dCBhcmVhLiAqLworICB3Y2hhcl90ICpfSU9fd3JpdGVfcHRyOwkvKiBDdXJyZW50IHB1dCBwb2ludGVyLiAqLworICB3Y2hhcl90ICpfSU9fd3JpdGVfZW5kOwkvKiBFbmQgb2YgcHV0IGFyZWEuICovCisgIHdjaGFyX3QgKl9JT19idWZfYmFzZTsJLyogU3RhcnQgb2YgcmVzZXJ2ZSBhcmVhLiAqLworICB3Y2hhcl90ICpfSU9fYnVmX2VuZDsJCS8qIEVuZCBvZiByZXNlcnZlIGFyZWEuICovCisgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSB1c2VkIHRvIHN1cHBvcnQgYmFja2luZyB1cCBhbmQgdW5kby4gKi8KKyAgd2NoYXJfdCAqX0lPX3NhdmVfYmFzZTsJLyogUG9pbnRlciB0byBzdGFydCBvZiBub24tY3VycmVudCBnZXQgYXJlYS4gKi8KKyAgd2NoYXJfdCAqX0lPX2JhY2t1cF9iYXNlOwkvKiBQb2ludGVyIHRvIGZpcnN0IHZhbGlkIGNoYXJhY3RlciBvZgorCQkJCSAgIGJhY2t1cCBhcmVhICovCisgIHdjaGFyX3QgKl9JT19zYXZlX2VuZDsJLyogUG9pbnRlciB0byBlbmQgb2Ygbm9uLWN1cnJlbnQgZ2V0IGFyZWEuICovCisKKyAgX19tYnN0YXRlX3QgX0lPX3N0YXRlOworICBfX21ic3RhdGVfdCBfSU9fbGFzdF9zdGF0ZTsKKyAgc3RydWN0IF9JT19jb2RlY3Z0IF9jb2RlY3Z0OworCisgIHdjaGFyX3QgX3Nob3J0YnVmWzFdOworCisgIGNvbnN0IHN0cnVjdCBfSU9fanVtcF90ICpfd2lkZV92dGFibGU7Cit9OworI2VuZGlmCisKK3N0cnVjdCBfSU9fRklMRSB7CisgIGludCBfZmxhZ3M7CQkvKiBIaWdoLW9yZGVyIHdvcmQgaXMgX0lPX01BR0lDOyByZXN0IGlzIGZsYWdzLiAqLworI2RlZmluZSBfSU9fZmlsZV9mbGFncyBfZmxhZ3MKKworICAvKiBUaGUgZm9sbG93aW5nIHBvaW50ZXJzIGNvcnJlc3BvbmQgdG8gdGhlIEMrKyBzdHJlYW1idWYgcHJvdG9jb2wuICovCisgIC8qIE5vdGU6ICBUayB1c2VzIHRoZSBfSU9fcmVhZF9wdHIgYW5kIF9JT19yZWFkX2VuZCBmaWVsZHMgZGlyZWN0bHkuICovCisgIGNoYXIqIF9JT19yZWFkX3B0cjsJLyogQ3VycmVudCByZWFkIHBvaW50ZXIgKi8KKyAgY2hhciogX0lPX3JlYWRfZW5kOwkvKiBFbmQgb2YgZ2V0IGFyZWEuICovCisgIGNoYXIqIF9JT19yZWFkX2Jhc2U7CS8qIFN0YXJ0IG9mIHB1dGJhY2srZ2V0IGFyZWEuICovCisgIGNoYXIqIF9JT193cml0ZV9iYXNlOwkvKiBTdGFydCBvZiBwdXQgYXJlYS4gKi8KKyAgY2hhciogX0lPX3dyaXRlX3B0cjsJLyogQ3VycmVudCBwdXQgcG9pbnRlci4gKi8KKyAgY2hhciogX0lPX3dyaXRlX2VuZDsJLyogRW5kIG9mIHB1dCBhcmVhLiAqLworICBjaGFyKiBfSU9fYnVmX2Jhc2U7CS8qIFN0YXJ0IG9mIHJlc2VydmUgYXJlYS4gKi8KKyAgY2hhciogX0lPX2J1Zl9lbmQ7CS8qIEVuZCBvZiByZXNlcnZlIGFyZWEuICovCisgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSB1c2VkIHRvIHN1cHBvcnQgYmFja2luZyB1cCBhbmQgdW5kby4gKi8KKyAgY2hhciAqX0lPX3NhdmVfYmFzZTsgLyogUG9pbnRlciB0byBzdGFydCBvZiBub24tY3VycmVudCBnZXQgYXJlYS4gKi8KKyAgY2hhciAqX0lPX2JhY2t1cF9iYXNlOyAgLyogUG9pbnRlciB0byBmaXJzdCB2YWxpZCBjaGFyYWN0ZXIgb2YgYmFja3VwIGFyZWEgKi8KKyAgY2hhciAqX0lPX3NhdmVfZW5kOyAvKiBQb2ludGVyIHRvIGVuZCBvZiBub24tY3VycmVudCBnZXQgYXJlYS4gKi8KKworICBzdHJ1Y3QgX0lPX21hcmtlciAqX21hcmtlcnM7CisKKyAgc3RydWN0IF9JT19GSUxFICpfY2hhaW47CisKKyAgaW50IF9maWxlbm87CisjaWYgMAorICBpbnQgX2Jsa3NpemU7CisjZWxzZQorICBpbnQgX2ZsYWdzMjsKKyNlbmRpZgorICBfSU9fb2ZmX3QgX29sZF9vZmZzZXQ7IC8qIFRoaXMgdXNlZCB0byBiZSBfb2Zmc2V0IGJ1dCBpdCdzIHRvbyBzbWFsbC4gICovCisKKyNkZWZpbmUgX19IQVZFX0NPTFVNTiAvKiB0ZW1wb3JhcnkgKi8KKyAgLyogMStjb2x1bW4gbnVtYmVyIG9mIHBiYXNlKCk7IDAgaXMgdW5rbm93bi4gKi8KKyAgdW5zaWduZWQgc2hvcnQgX2N1cl9jb2x1bW47CisgIHNpZ25lZCBjaGFyIF92dGFibGVfb2Zmc2V0OworICBjaGFyIF9zaG9ydGJ1ZlsxXTsKKworICAvKiAgY2hhciogX3NhdmVfZ3B0cjsgIGNoYXIqIF9zYXZlX2VncHRyOyAqLworCisgIF9JT19sb2NrX3QgKl9sb2NrOworI2lmZGVmIF9JT19VU0VfT0xEX0lPX0ZJTEUKK307CisKK3N0cnVjdCBfSU9fRklMRV9jb21wbGV0ZQoreworICBzdHJ1Y3QgX0lPX0ZJTEUgX2ZpbGU7CisjZW5kaWYKKyNpZiBkZWZpbmVkIF9HX0lPX0lPX0ZJTEVfVkVSU0lPTiAmJiBfR19JT19JT19GSUxFX1ZFUlNJT04gPT0gMHgyMDAwMQorICBfSU9fb2ZmNjRfdCBfb2Zmc2V0OworIyBpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgX0dMSUJDUFBfVVNFX1dDSEFSX1QKKyAgLyogV2lkZSBjaGFyYWN0ZXIgc3RyZWFtIHN0dWZmLiAgKi8KKyAgc3RydWN0IF9JT19jb2RlY3Z0ICpfY29kZWN2dDsKKyAgc3RydWN0IF9JT193aWRlX2RhdGEgKl93aWRlX2RhdGE7CisgIHN0cnVjdCBfSU9fRklMRSAqX2ZyZWVyZXNfbGlzdDsKKyAgdm9pZCAqX2ZyZWVyZXNfYnVmOworICBzaXplX3QgX2ZyZWVyZXNfc2l6ZTsKKyMgZWxzZQorICB2b2lkICpfX3BhZDE7CisgIHZvaWQgKl9fcGFkMjsKKyAgdm9pZCAqX19wYWQzOworICB2b2lkICpfX3BhZDQ7CisgIHNpemVfdCBfX3BhZDU7CisjIGVuZGlmCisgIGludCBfbW9kZTsKKyAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGdldCBpbnRvIHRyb3VibGUgYWdhaW4uICAqLworICBjaGFyIF91bnVzZWQyWzE1ICogc2l6ZW9mIChpbnQpIC0gNCAqIHNpemVvZiAodm9pZCAqKSAtIHNpemVvZiAoc2l6ZV90KV07CisjZW5kaWYKK307CisKKyNpZm5kZWYgX19jcGx1c3BsdXMKK3R5cGVkZWYgc3RydWN0IF9JT19GSUxFIF9JT19GSUxFOworI2VuZGlmCisKK3N0cnVjdCBfSU9fRklMRV9wbHVzOworCitleHRlcm4gc3RydWN0IF9JT19GSUxFX3BsdXMgX0lPXzJfMV9zdGRpbl87CitleHRlcm4gc3RydWN0IF9JT19GSUxFX3BsdXMgX0lPXzJfMV9zdGRvdXRfOworZXh0ZXJuIHN0cnVjdCBfSU9fRklMRV9wbHVzIF9JT18yXzFfc3RkZXJyXzsKKyNpZm5kZWYgX0xJQkMKKyNkZWZpbmUgX0lPX3N0ZGluICgoX0lPX0ZJTEUqKSgmX0lPXzJfMV9zdGRpbl8pKQorI2RlZmluZSBfSU9fc3Rkb3V0ICgoX0lPX0ZJTEUqKSgmX0lPXzJfMV9zdGRvdXRfKSkKKyNkZWZpbmUgX0lPX3N0ZGVyciAoKF9JT19GSUxFKikoJl9JT18yXzFfc3RkZXJyXykpCisjZWxzZQorZXh0ZXJuIF9JT19GSUxFICpfSU9fc3RkaW4gYXR0cmlidXRlX2hpZGRlbjsKK2V4dGVybiBfSU9fRklMRSAqX0lPX3N0ZG91dCBhdHRyaWJ1dGVfaGlkZGVuOworZXh0ZXJuIF9JT19GSUxFICpfSU9fc3RkZXJyIGF0dHJpYnV0ZV9oaWRkZW47CisjZW5kaWYKKworCisvKiBGdW5jdGlvbnMgdG8gZG8gSS9PIGFuZCBmaWxlIG1hbmFnZW1lbnQgZm9yIGEgc3RyZWFtLiAgKi8KKworLyogUmVhZCBOQllURVMgYnl0ZXMgZnJvbSBDT09LSUUgaW50byBhIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IEJVRi4KKyAgIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gICovCit0eXBlZGVmIF9fc3NpemVfdCBfX2lvX3JlYWRfZm4gKHZvaWQgKl9fY29va2llLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzKTsKKworLyogV3JpdGUgTiBieXRlcyBwb2ludGVkIHRvIGJ5IEJVRiB0byBDT09LSUUuICBXcml0ZSBhbGwgTiBieXRlcworICAgdW5sZXNzIHRoZXJlIGlzIGFuIGVycm9yLiAgUmV0dXJuIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBvciAtMSBpZgorICAgdGhlcmUgaXMgYW4gZXJyb3Igd2l0aG91dCB3cml0aW5nIGFueXRoaW5nLiAgSWYgdGhlIGZpbGUgaGFzIGJlZW4KKyAgIG9wZW5lZCBmb3IgYXBwZW5kIChfX21vZGUuX19hcHBlbmQgc2V0KSwgdGhlbiBzZXQgdGhlIGZpbGUgcG9pbnRlcgorICAgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgdGhlbiBkbyB0aGUgd3JpdGU7IGlmIG5vdCwganVzdCB3cml0ZSBhdAorICAgdGhlIGN1cnJlbnQgZmlsZSBwb2ludGVyLiAgKi8KK3R5cGVkZWYgX19zc2l6ZV90IF9faW9fd3JpdGVfZm4gKHZvaWQgKl9fY29va2llLCBfX2NvbnN0IGNoYXIgKl9fYnVmLAorCQkJCSBzaXplX3QgX19uKTsKKworLyogTW92ZSBDT09LSUUncyBmaWxlIHBvc2l0aW9uIHRvICpQT1MgYnl0ZXMgZnJvbSB0aGUKKyAgIGJlZ2lubmluZyBvZiB0aGUgZmlsZSAoaWYgVyBpcyBTRUVLX1NFVCksCisgICB0aGUgY3VycmVudCBwb3NpdGlvbiAoaWYgVyBpcyBTRUVLX0NVUiksCisgICBvciB0aGUgZW5kIG9mIHRoZSBmaWxlIChpZiBXIGlzIFNFRUtfRU5EKS4KKyAgIFNldCAqUE9TIHRvIHRoZSBuZXcgZmlsZSBwb3NpdGlvbi4KKyAgIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLCBub256ZXJvIGlmIG5vdC4gICovCit0eXBlZGVmIGludCBfX2lvX3NlZWtfZm4gKHZvaWQgKl9fY29va2llLCBfSU9fb2ZmNjRfdCAqX19wb3MsIGludCBfX3cpOworCisvKiBDbG9zZSBDT09LSUUuICAqLwordHlwZWRlZiBpbnQgX19pb19jbG9zZV9mbiAodm9pZCAqX19jb29raWUpOworCisKKyNpZmRlZiBfR05VX1NPVVJDRQorLyogVXNlci12aXNpYmxlIG5hbWVzIGZvciB0aGUgYWJvdmUuICAqLwordHlwZWRlZiBfX2lvX3JlYWRfZm4gY29va2llX3JlYWRfZnVuY3Rpb25fdDsKK3R5cGVkZWYgX19pb193cml0ZV9mbiBjb29raWVfd3JpdGVfZnVuY3Rpb25fdDsKK3R5cGVkZWYgX19pb19zZWVrX2ZuIGNvb2tpZV9zZWVrX2Z1bmN0aW9uX3Q7Cit0eXBlZGVmIF9faW9fY2xvc2VfZm4gY29va2llX2Nsb3NlX2Z1bmN0aW9uX3Q7CisKKy8qIFRoZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgY29va2llIGZ1bmN0aW9uIHBvaW50ZXJzLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIF9faW9fcmVhZF9mbiAqcmVhZDsJCS8qIFJlYWQgYnl0ZXMuICAqLworICBfX2lvX3dyaXRlX2ZuICp3cml0ZTsJCS8qIFdyaXRlIGJ5dGVzLiAgKi8KKyAgX19pb19zZWVrX2ZuICpzZWVrOwkJLyogU2Vlay90ZWxsIGZpbGUgcG9zaXRpb24uICAqLworICBfX2lvX2Nsb3NlX2ZuICpjbG9zZTsJCS8qIENsb3NlIGZpbGUuICAqLworfSBfSU9fY29va2llX2lvX2Z1bmN0aW9uc190OwordHlwZWRlZiBfSU9fY29va2llX2lvX2Z1bmN0aW9uc190IGNvb2tpZV9pb19mdW5jdGlvbnNfdDsKKworc3RydWN0IF9JT19jb29raWVfZmlsZTsKKworLyogSW5pdGlhbGl6ZSBvbmUgb2YgdGhvc2UuICAqLworZXh0ZXJuIHZvaWQgX0lPX2Nvb2tpZV9pbml0IChzdHJ1Y3QgX0lPX2Nvb2tpZV9maWxlICpfX2NmaWxlLCBpbnQgX19yZWFkX3dyaXRlLAorCQkJICAgICB2b2lkICpfX2Nvb2tpZSwgX0lPX2Nvb2tpZV9pb19mdW5jdGlvbnNfdCBfX2Zucyk7CisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiBpbnQgX191bmRlcmZsb3cgKF9JT19GSUxFICopOworZXh0ZXJuIGludCBfX3VmbG93IChfSU9fRklMRSAqKTsKK2V4dGVybiBpbnQgX19vdmVyZmxvdyAoX0lPX0ZJTEUgKiwgaW50KTsKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgX0dMSUJDUFBfVVNFX1dDSEFSX1QKK2V4dGVybiBfSU9fd2ludF90IF9fd3VuZGVyZmxvdyAoX0lPX0ZJTEUgKik7CitleHRlcm4gX0lPX3dpbnRfdCBfX3d1ZmxvdyAoX0lPX0ZJTEUgKik7CitleHRlcm4gX0lPX3dpbnRfdCBfX3dvdmVyZmxvdyAoX0lPX0ZJTEUgKiwgX0lPX3dpbnRfdCk7CisjZW5kaWYKKworI2lmICBfX0dOVUNfXyA+PSAzCisjIGRlZmluZSBfSU9fQkUoZXhwciwgcmVzKSBfX2J1aWx0aW5fZXhwZWN0ICgoZXhwciksIHJlcykKKyNlbHNlCisjIGRlZmluZSBfSU9fQkUoZXhwciwgcmVzKSAoZXhwcikKKyNlbmRpZgorCisjZGVmaW5lIF9JT19nZXRjX3VubG9ja2VkKF9mcCkgXAorICAgICAgIChfSU9fQkUgKChfZnApLT5fSU9fcmVhZF9wdHIgPj0gKF9mcCktPl9JT19yZWFkX2VuZCwgMCkgXAorCT8gX191ZmxvdyAoX2ZwKSA6ICoodW5zaWduZWQgY2hhciAqKSAoX2ZwKS0+X0lPX3JlYWRfcHRyKyspCisjZGVmaW5lIF9JT19wZWVrY191bmxvY2tlZChfZnApIFwKKyAgICAgICAoX0lPX0JFICgoX2ZwKS0+X0lPX3JlYWRfcHRyID49IChfZnApLT5fSU9fcmVhZF9lbmQsIDApIFwKKwkgICYmIF9fdW5kZXJmbG93IChfZnApID09IEVPRiA/IEVPRiBcCisJOiAqKHVuc2lnbmVkIGNoYXIgKikgKF9mcCktPl9JT19yZWFkX3B0cikKKyNkZWZpbmUgX0lPX3B1dGNfdW5sb2NrZWQoX2NoLCBfZnApIFwKKyAgIChfSU9fQkUgKChfZnApLT5fSU9fd3JpdGVfcHRyID49IChfZnApLT5fSU9fd3JpdGVfZW5kLCAwKSBcCisgICAgPyBfX292ZXJmbG93IChfZnAsICh1bnNpZ25lZCBjaGFyKSAoX2NoKSkgXAorICAgIDogKHVuc2lnbmVkIGNoYXIpICgqKF9mcCktPl9JT193cml0ZV9wdHIrKyA9IChfY2gpKSkKKworI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBfR0xJQkNQUF9VU0VfV0NIQVJfVAorIyBkZWZpbmUgX0lPX2dldHdjX3VubG9ja2VkKF9mcCkgXAorICAoX0lPX0JFICgoX2ZwKS0+X3dpZGVfZGF0YSA9PSBOVUxMCQkJCQlcCisJICAgfHwgKChfZnApLT5fd2lkZV9kYXRhLT5fSU9fcmVhZF9wdHIJCQkJXAorCSAgICAgICA+PSAoX2ZwKS0+X3dpZGVfZGF0YS0+X0lPX3JlYWRfZW5kKSwgMCkJCQlcCisgICA/IF9fd3VmbG93IChfZnApIDogKF9JT193aW50X3QpICooX2ZwKS0+X3dpZGVfZGF0YS0+X0lPX3JlYWRfcHRyKyspCisjIGRlZmluZSBfSU9fcHV0d2NfdW5sb2NrZWQoX3djaCwgX2ZwKSBcCisgIChfSU9fQkUgKChfZnApLT5fd2lkZV9kYXRhID09IE5VTEwJCQkJCVwKKwkgICB8fCAoKF9mcCktPl93aWRlX2RhdGEtPl9JT193cml0ZV9wdHIJCQkJXAorCSAgICAgICA+PSAoX2ZwKS0+X3dpZGVfZGF0YS0+X0lPX3dyaXRlX2VuZCksIDApCQkJXAorICAgPyBfX3dvdmVyZmxvdyAoX2ZwLCBfd2NoKQkJCQkJCVwKKyAgIDogKF9JT193aW50X3QpICgqKF9mcCktPl93aWRlX2RhdGEtPl9JT193cml0ZV9wdHIrKyA9IChfd2NoKSkpCisjZW5kaWYKKworI2RlZmluZSBfSU9fZmVvZl91bmxvY2tlZChfX2ZwKSAoKChfX2ZwKS0+X2ZsYWdzICYgX0lPX0VPRl9TRUVOKSAhPSAwKQorI2RlZmluZSBfSU9fZmVycm9yX3VubG9ja2VkKF9fZnApICgoKF9fZnApLT5fZmxhZ3MgJiBfSU9fRVJSX1NFRU4pICE9IDApCisKK2V4dGVybiBpbnQgX0lPX2dldGMgKF9JT19GSUxFICpfX2ZwKTsKK2V4dGVybiBpbnQgX0lPX3B1dGMgKGludCBfX2MsIF9JT19GSUxFICpfX2ZwKTsKK2V4dGVybiBpbnQgX0lPX2Zlb2YgKF9JT19GSUxFICpfX2ZwKSBfX1RIUk9XOworZXh0ZXJuIGludCBfSU9fZmVycm9yIChfSU9fRklMRSAqX19mcCkgX19USFJPVzsKKworZXh0ZXJuIGludCBfSU9fcGVla2NfbG9ja2VkIChfSU9fRklMRSAqX19mcCk7CisKKy8qIFRoaXMgb25lIGlzIGZvciBFbWFjcy4gKi8KKyNkZWZpbmUgX0lPX1BFTkRJTkdfT1VUUFVUX0NPVU5UKF9mcCkJXAorCSgoX2ZwKS0+X0lPX3dyaXRlX3B0ciAtIChfZnApLT5fSU9fd3JpdGVfYmFzZSkKKworZXh0ZXJuIHZvaWQgX0lPX2Zsb2NrZmlsZSAoX0lPX0ZJTEUgKikgX19USFJPVzsKK2V4dGVybiB2b2lkIF9JT19mdW5sb2NrZmlsZSAoX0lPX0ZJTEUgKikgX19USFJPVzsKK2V4dGVybiBpbnQgX0lPX2Z0cnlsb2NrZmlsZSAoX0lPX0ZJTEUgKikgX19USFJPVzsKKworI2lmZGVmIF9JT19NVFNBRkVfSU8KKyMgZGVmaW5lIF9JT19wZWVrYyhfZnApIF9JT19wZWVrY19sb2NrZWQgKF9mcCkKKyMgZGVmaW5lIF9JT19mbG9ja2ZpbGUoX2ZwKSBcCisgIGlmICgoKF9mcCktPl9mbGFncyAmIF9JT19VU0VSX0xPQ0spID09IDApIF9JT19mbG9ja2ZpbGUgKF9mcCkKKyMgZGVmaW5lIF9JT19mdW5sb2NrZmlsZShfZnApIFwKKyAgaWYgKCgoX2ZwKS0+X2ZsYWdzICYgX0lPX1VTRVJfTE9DSykgPT0gMCkgX0lPX2Z1bmxvY2tmaWxlIChfZnApCisjZWxzZQorIyBkZWZpbmUgX0lPX3BlZWtjKF9mcCkgX0lPX3BlZWtjX3VubG9ja2VkIChfZnApCisjIGRlZmluZSBfSU9fZmxvY2tmaWxlKF9mcCkgLyoqLworIyBkZWZpbmUgX0lPX2Z1bmxvY2tmaWxlKF9mcCkgLyoqLworIyBkZWZpbmUgX0lPX2Z0cnlsb2NrZmlsZShfZnApIC8qKi8KKyMgZGVmaW5lIF9JT19jbGVhbnVwX3JlZ2lvbl9zdGFydChfZmN0LCBfZnApIC8qKi8KKyMgZGVmaW5lIF9JT19jbGVhbnVwX3JlZ2lvbl9lbmQoX0RvaXQpIC8qKi8KKyNlbmRpZiAvKiAhX0lPX01UU0FGRV9JTyAqLworCitleHRlcm4gaW50IF9JT192ZnNjYW5mIChfSU9fRklMRSAqIF9fcmVzdHJpY3QsIGNvbnN0IGNoYXIgKiBfX3Jlc3RyaWN0LAorCQkJX0lPX3ZhX2xpc3QsIGludCAqX19yZXN0cmljdCk7CitleHRlcm4gaW50IF9JT192ZnByaW50ZiAoX0lPX0ZJTEUgKl9fcmVzdHJpY3QsIGNvbnN0IGNoYXIgKl9fcmVzdHJpY3QsCisJCQkgX0lPX3ZhX2xpc3QpOworZXh0ZXJuIF9JT19zc2l6ZV90IF9JT19wYWRuIChfSU9fRklMRSAqLCBpbnQsIF9JT19zc2l6ZV90KTsKK2V4dGVybiBfSU9fc2l6ZV90IF9JT19zZ2V0biAoX0lPX0ZJTEUgKiwgdm9pZCAqLCBfSU9fc2l6ZV90KTsKKworZXh0ZXJuIF9JT19vZmY2NF90IF9JT19zZWVrb2ZmIChfSU9fRklMRSAqLCBfSU9fb2ZmNjRfdCwgaW50LCBpbnQpOworZXh0ZXJuIF9JT19vZmY2NF90IF9JT19zZWVrcG9zIChfSU9fRklMRSAqLCBfSU9fb2ZmNjRfdCwgaW50KTsKKworZXh0ZXJuIHZvaWQgX0lPX2ZyZWVfYmFja3VwX2FyZWEgKF9JT19GSUxFICopIF9fVEhST1c7CisKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgX0dMSUJDUFBfVVNFX1dDSEFSX1QKK2V4dGVybiBfSU9fd2ludF90IF9JT19nZXR3YyAoX0lPX0ZJTEUgKl9fZnApOworZXh0ZXJuIF9JT193aW50X3QgX0lPX3B1dHdjICh3Y2hhcl90IF9fd2MsIF9JT19GSUxFICpfX2ZwKTsKK2V4dGVybiBpbnQgX0lPX2Z3aWRlIChfSU9fRklMRSAqX19mcCwgaW50IF9fbW9kZSkgX19USFJPVzsKKyMgaWYgX19HTlVDX18gPj0gMgorLyogV2hpbGUgY29tcGlsaW5nIGdsaWJjIHdlIGhhdmUgdG8gaGFuZGxlIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJ5IG9sZAorICAgdmVyc2lvbnMuICAqLworIyAgaWYgZGVmaW5lZCBfTElCQyAmJiBkZWZpbmVkIFNIQVJFRAorIyAgIGluY2x1ZGUgPHNobGliLWNvbXBhdC5oPgorIyAgIGlmIFNITElCX0NPTVBBVCAobGliYywgR0xJQkNfMl8wLCBHTElCQ18yXzEpCisjICAgIGRlZmluZSBfSU9fZndpZGVfbWF5YmVfaW5jb21wYXRpYmxlIFwKKyAgKF9fYnVpbHRpbl9leHBlY3QgKCZfSU9fc3RkaW5fdXNlZCA9PSBOVUxMLCAwKSkKK2V4dGVybiBjb25zdCBpbnQgX0lPX3N0ZGluX3VzZWQ7Cit3ZWFrX2V4dGVybiAoX0lPX3N0ZGluX3VzZWQpOworIyAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZuZGVmIF9JT19md2lkZV9tYXliZV9pbmNvbXBhdGlibGUKKyMgICBkZWZpbmUgX0lPX2Z3aWRlX21heWJlX2luY29tcGF0aWJsZSAoMCkKKyMgIGVuZGlmCisvKiBBIHNwZWNpYWwgb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIGFib3ZlLiAgSXQgb3B0aW1pemVzIHRoZQorICAgY2FzZSBvZiBpbml0aWFsaXppbmcgYW4gdW5vcmllbnRlZCBieXRlIHN0cmVhbS4gICovCisjICBkZWZpbmUgX0lPX2Z3aWRlKF9fZnAsIF9fbW9kZSkgXAorICAoeyBpbnQgX19yZXN1bHQgPSAoX19tb2RlKTsJCQkJCQkgICAgICBcCisgICAgIGlmIChfX3Jlc3VsdCA8IDAgJiYgISBfSU9fZndpZGVfbWF5YmVfaW5jb21wYXRpYmxlKQkJICAgICAgXAorICAgICAgIHsJCQkJCQkJCSAgICAgIFwKKwkgaWYgKChfX2ZwKS0+X21vZGUgPT0gMCkJCQkJCSAgICAgIFwKKwkgICAvKiBXZSBrbm93IHRoYXQgYWxsIHdlIGhhdmUgdG8gZG8gaXMgdG8gc2V0IHRoZSBmbGFnLiAgKi8JICAgICAgXAorCSAgIChfX2ZwKS0+X21vZGUgPSAtMTsJCQkJCQkgICAgICBcCisJIF9fcmVzdWx0ID0gKF9fZnApLT5fbW9kZTsJCQkJCSAgICAgIFwKKyAgICAgICB9CQkJCQkJCQkgICAgICBcCisgICAgIGVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX21vZGUpICYmIChfX21vZGUpID09IDApCQkgICAgICBcCisgICAgICAgX19yZXN1bHQgPSBfSU9fZndpZGVfbWF5YmVfaW5jb21wYXRpYmxlID8gLTEgOiAoX19mcCktPl9tb2RlOwkgICAgICBcCisgICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKyAgICAgICBfX3Jlc3VsdCA9IF9JT19md2lkZSAoX19mcCwgX19yZXN1bHQpOwkJCQkgICAgICBcCisgICAgIF9fcmVzdWx0OyB9KQorIyBlbmRpZgorCitleHRlcm4gaW50IF9JT192ZndzY2FuZiAoX0lPX0ZJTEUgKiBfX3Jlc3RyaWN0LCBjb25zdCB3Y2hhcl90ICogX19yZXN0cmljdCwKKwkJCSBfSU9fdmFfbGlzdCwgaW50ICpfX3Jlc3RyaWN0KTsKK2V4dGVybiBpbnQgX0lPX3Zmd3ByaW50ZiAoX0lPX0ZJTEUgKl9fcmVzdHJpY3QsIGNvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QsCisJCQkgIF9JT192YV9saXN0KTsKK2V4dGVybiBfSU9fc3NpemVfdCBfSU9fd3BhZG4gKF9JT19GSUxFICosIHdpbnRfdCwgX0lPX3NzaXplX3QpOworZXh0ZXJuIHZvaWQgX0lPX2ZyZWVfd2JhY2t1cF9hcmVhIChfSU9fRklMRSAqKSBfX1RIUk9XOworI2VuZGlmCisKKyNpZmRlZiBfX0xEQkxfQ09NUEFUCisjIGluY2x1ZGUgPGJpdHMvbGliaW8tbGRibC5oPgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfSU9fU1RESU9fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW1pdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5YTVkZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGltaXRzLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwNQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjEwLzUuMi40LjIuMSBTaXplcyBvZiBpbnRlZ2VyIHR5cGVzCTxsaW1pdHMuaD4KKyAqLworCisjaWZuZGVmIF9MSUJDX0xJTUlUU19IXworI2RlZmluZSBfTElCQ19MSU1JVFNfSF8JMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBhbnkgbXVsdGlieXRlIGNoYXJhY3RlciBpbiBhbnkgbG9jYWxlLgorICAgV2UgZGVmaW5lIHRoaXMgdmFsdWUgaGVyZSBzaW5jZSB0aGUgZ2NjIGhlYWRlciBkb2VzIG5vdCBkZWZpbmUKKyAgIHRoZSBjb3JyZWN0IHZhbHVlLiAgKi8KKyNkZWZpbmUgTUJfTEVOX01BWAkxNgorCisKKy8qIElmIHdlIGFyZSBub3QgdXNpbmcgR05VIENDIHdlIGhhdmUgdG8gZGVmaW5lIGFsbCB0aGUgc3ltYm9scyBvdXJzZWxmLgorICAgT3RoZXJ3aXNlIHVzZSBnY2MncyBkZWZpbml0aW9ucyAoc2VlIGJlbG93KS4gICovCisjaWYgIWRlZmluZWQgX19HTlVDX18gfHwgX19HTlVDX18gPCAyCisKKy8qIFdlIG9ubHkgcHJvdGVjdCBmcm9tIG11bHRpcGxlIGluY2x1c2lvbiBoZXJlLCBiZWNhdXNlIGFsbCB0aGUgb3RoZXIKKyAgICNpbmNsdWRlJ3MgcHJvdGVjdCB0aGVtc2VsdmVzLCBhbmQgaW4gR0NDIDIgd2UgbWF5ICNpbmNsdWRlX25leHQgdGhyb3VnaAorICAgbXVsdGlwbGUgY29waWVzIG9mIHRoaXMgZmlsZSBiZWZvcmUgd2UgZ2V0IHRvIEdDQydzLiAgKi8KKyMgaWZuZGVmIF9MSU1JVFNfSAorIyAgZGVmaW5lIF9MSU1JVFNfSAkxCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKy8qIFdlIGRvbid0IGhhdmUgI2luY2x1ZGVfbmV4dC4KKyAgIERlZmluZSBBTlNJIDxsaW1pdHMuaD4gZm9yIHN0YW5kYXJkIDMyLWJpdCB3b3Jkcy4gICovCisKKy8qIFRoZXNlIGFzc3VtZSA4LWJpdCBgY2hhcidzLCAxNi1iaXQgYHNob3J0IGludCdzLAorICAgYW5kIDMyLWJpdCBgaW50J3MgYW5kIGBsb25nIGludCdzLiAgKi8KKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBgY2hhcicuCSovCisjICBkZWZpbmUgQ0hBUl9CSVQJOAorCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgY2hhcicgY2FuIGhvbGQuICAqLworIyAgZGVmaW5lIFNDSEFSX01JTgkoLTEyOCkKKyMgIGRlZmluZSBTQ0hBUl9NQVgJMTI3CisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGNoYXInIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMC4pICAqLworIyAgZGVmaW5lIFVDSEFSX01BWAkyNTUKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgY2hhcicgY2FuIGhvbGQuICAqLworIyAgaWZkZWYgX19DSEFSX1VOU0lHTkVEX18KKyMgICBkZWZpbmUgQ0hBUl9NSU4JMAorIyAgIGRlZmluZSBDSEFSX01BWAlVQ0hBUl9NQVgKKyMgIGVsc2UKKyMgICBkZWZpbmUgQ0hBUl9NSU4JU0NIQVJfTUlOCisjICAgZGVmaW5lIENIQVJfTUFYCVNDSEFSX01BWAorIyAgZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIHNob3J0IGludCcgY2FuIGhvbGQuICAqLworIyAgZGVmaW5lIFNIUlRfTUlOCSgtMzI3NjgpCisjICBkZWZpbmUgU0hSVF9NQVgJMzI3NjcKKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgc2hvcnQgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDAuKSAgKi8KKyMgIGRlZmluZSBVU0hSVF9NQVgJNjU1MzUKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGludCcgY2FuIGhvbGQuICAqLworIyAgZGVmaW5lIElOVF9NSU4JKC1JTlRfTUFYIC0gMSkKKyMgIGRlZmluZSBJTlRfTUFYCTIxNDc0ODM2NDcKKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDAuKSAgKi8KKyMgIGRlZmluZSBVSU5UX01BWAk0Mjk0OTY3Mjk1VQorCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgbG9uZyBpbnQnIGNhbiBob2xkLiAgKi8KKyMgIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgICBkZWZpbmUgTE9OR19NQVgJOTIyMzM3MjAzNjg1NDc3NTgwN0wKKyMgIGVsc2UKKyMgICBkZWZpbmUgTE9OR19NQVgJMjE0NzQ4MzY0N0wKKyMgIGVuZGlmCisjICBkZWZpbmUgTE9OR19NSU4JKC1MT05HX01BWCAtIDFMKQorCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBsb25nIGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwLikgICovCisjICBpZiBfX1dPUkRTSVpFID09IDY0CisjICAgZGVmaW5lIFVMT05HX01BWAkxODQ0Njc0NDA3MzcwOTU1MTYxNVVMCisjICBlbHNlCisjICAgZGVmaW5lIFVMT05HX01BWAk0Mjk0OTY3Mjk1VUwKKyMgIGVuZGlmCisKKyMgIGlmZGVmIF9fVVNFX0lTT0M5OQorCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAqLworIyAgIGRlZmluZSBMTE9OR19NQVgJOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisjICAgZGVmaW5lIExMT05HX01JTgkoLUxMT05HX01BWCAtIDFMTCkKKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwLikgICovCisjICAgZGVmaW5lIFVMTE9OR19NQVgJMTg0NDY3NDQwNzM3MDk1NTE2MTVVTEwKKworIyAgZW5kaWYgLyogSVNPIEM5OSAqLworCisjIGVuZGlmCS8qIGxpbWl0cy5oICAqLworI2VuZGlmCS8qIEdDQyAyLiAgKi8KKworI2VuZGlmCS8qICFfTElCQ19MSU1JVFNfSF8gKi8KKworIC8qIEdldCB0aGUgY29tcGlsZXIncyBsaW1pdHMuaCwgd2hpY2ggZGVmaW5lcyBhbG1vc3QgYWxsIHRoZSBJU08gY29uc3RhbnRzLgorCisgICAgV2UgcHV0IHRoaXMgI2luY2x1ZGVfbmV4dCBvdXRzaWRlIHRoZSBkb3VibGUgaW5jbHVzaW9uIGNoZWNrIGJlY2F1c2UKKyAgICBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gaW5jbHVkZSB0aGlzIGZpbGUgbW9yZSB0aGFuIG9uY2UgYW5kIHN0aWxsIGdldAorICAgIHRoZSBkZWZpbml0aW9ucyBmcm9tIGdjYydzIGhlYWRlci4gICovCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiAhZGVmaW5lZCBfR0NDX0xJTUlUU19IXworLyogYF9HQ0NfTElNSVRTX0hfJyBpcyB3aGF0IEdDQydzIGZpbGUgZGVmaW5lcy4gICovCisjIGluY2x1ZGVfbmV4dCA8bGltaXRzLmg+CisjZW5kaWYKKworLyogVGhlIDxsaW1pdHMuaD4gZmlsZXMgaW4gc29tZSBnY2MgdmVyc2lvbnMgZG9uJ3QgZGVmaW5lIExMT05HX01JTiwKKyAgIExMT05HX01BWCwgYW5kIFVMTE9OR19NQVguICBJbnN0ZWFkIG9ubHkgdGhlIHZhbHVlcyBnY2MgZGVmaW5lZCBmb3IKKyAgIGFnZXMgYXJlIGF2YWlsYWJsZS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgZGVmaW5lZCBfX0dOVUNfXworIyBpZm5kZWYgTExPTkdfTUlOCisjICBkZWZpbmUgTExPTkdfTUlOCSgtTExPTkdfTUFYLTEpCisjIGVuZGlmCisjIGlmbmRlZiBMTE9OR19NQVgKKyMgIGRlZmluZSBMTE9OR19NQVgJX19MT05HX0xPTkdfTUFYX18KKyMgZW5kaWYKKyMgaWZuZGVmIFVMTE9OR19NQVgKKyMgIGRlZmluZSBVTExPTkdfTUFYCShMTE9OR19NQVggKiAyVUxMICsgMSkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfUE9TSVgKKy8qIFBPU0lYIGFkZHMgdGhpbmdzIHRvIDxsaW1pdHMuaD4uICAqLworIyBpbmNsdWRlIDxiaXRzL3Bvc2l4MV9saW0uaD4KKyNlbmRpZgorCisjaWZkZWYJX19VU0VfUE9TSVgyCisjIGluY2x1ZGUgPGJpdHMvcG9zaXgyX2xpbS5oPgorI2VuZGlmCisKKyNpZmRlZglfX1VTRV9YT1BFTgorIyBpbmNsdWRlIDxiaXRzL3hvcGVuX2xpbS5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbmsuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NjUzMWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbmsuaApAQCAtMCwwICsxLDE5NCBAQAorLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIGNvbW11bmljYXRpb24gZnJvbSB0aGUgcnVuLXRpbWUgZHluYW1pYyBsaW5rZXIgZm9yCisgICBsb2FkZWQgRUxGIHNoYXJlZCBvYmplY3RzLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDEsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0xJTktfSAorI2RlZmluZQlfTElOS19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8ZWxmLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogV2UgdXNlIHRoaXMgbWFjcm8gdG8gcmVmZXIgdG8gRUxGIHR5cGVzIGluZGVwZW5kZW50IG9mIHRoZSBuYXRpdmUgd29yZHNpemUuCisgICBgRWxmVyhUWVBFKScgaXMgdXNlZCBpbiBwbGFjZSBvZiBgRWxmMzJfVFlQRScgb3IgYEVsZjY0X1RZUEUnLiAgKi8KKyNkZWZpbmUgRWxmVyh0eXBlKQlfRWxmVyAoRWxmLCBfX0VMRl9OQVRJVkVfQ0xBU1MsIHR5cGUpCisjZGVmaW5lIF9FbGZXKGUsdyx0KQlfRWxmV18xIChlLCB3LCBfIyN0KQorI2RlZmluZSBfRWxmV18xKGUsdyx0KQllIyN3IyN0CisKKyNpbmNsdWRlIDxiaXRzL2VsZmNsYXNzLmg+CQkvKiBEZWZpbmVzIF9fRUxGX05BVElWRV9DTEFTUy4gICovCisjaW5jbHVkZSA8Yml0cy9saW5rLmg+CisKKy8qIFJlbmRlenZvdXMgc3RydWN0dXJlIHVzZWQgYnkgdGhlIHJ1bi10aW1lIGR5bmFtaWMgbGlua2VyIHRvIGNvbW11bmljYXRlCisgICBkZXRhaWxzIG9mIHNoYXJlZCBvYmplY3QgbG9hZGluZyB0byB0aGUgZGVidWdnZXIuICBJZiB0aGUgZXhlY3V0YWJsZSdzCisgICBkeW5hbWljIHNlY3Rpb24gaGFzIGEgRFRfREVCVUcgZWxlbWVudCwgdGhlIHJ1bi10aW1lIGxpbmtlciBzZXRzIHRoYXQKKyAgIGVsZW1lbnQncyB2YWx1ZSB0byB0aGUgYWRkcmVzcyB3aGVyZSB0aGlzIHN0cnVjdHVyZSBjYW4gYmUgZm91bmQuICAqLworCitzdHJ1Y3Qgcl9kZWJ1ZworICB7CisgICAgaW50IHJfdmVyc2lvbjsJCS8qIFZlcnNpb24gbnVtYmVyIGZvciB0aGlzIHByb3RvY29sLiAgKi8KKworICAgIHN0cnVjdCBsaW5rX21hcCAqcl9tYXA7CS8qIEhlYWQgb2YgdGhlIGNoYWluIG9mIGxvYWRlZCBvYmplY3RzLiAgKi8KKworICAgIC8qIFRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiBpbnRlcm5hbCB0byB0aGUgcnVuLXRpbWUgbGlua2VyLAorICAgICAgIHRoYXQgd2lsbCBhbHdheXMgYmUgY2FsbGVkIHdoZW4gdGhlIGxpbmtlciBiZWdpbnMgdG8gbWFwIGluIGEKKyAgICAgICBsaWJyYXJ5IG9yIHVubWFwIGl0LCBhbmQgYWdhaW4gd2hlbiB0aGUgbWFwcGluZyBjaGFuZ2UgaXMgY29tcGxldGUuCisgICAgICAgVGhlIGRlYnVnZ2VyIGNhbiBzZXQgYSBicmVha3BvaW50IGF0IHRoaXMgYWRkcmVzcyBpZiBpdCB3YW50cyB0bworICAgICAgIG5vdGljZSBzaGFyZWQgb2JqZWN0IG1hcHBpbmcgY2hhbmdlcy4gICovCisgICAgRWxmVyhBZGRyKSByX2JyazsKKyAgICBlbnVtCisgICAgICB7CisJLyogVGhpcyBzdGF0ZSB2YWx1ZSBkZXNjcmliZXMgdGhlIG1hcHBpbmcgY2hhbmdlIHRha2luZyBwbGFjZSB3aGVuCisJICAgdGhlIGByX2JyaycgYWRkcmVzcyBpcyBjYWxsZWQuICAqLworCVJUX0NPTlNJU1RFTlQsCQkvKiBNYXBwaW5nIGNoYW5nZSBpcyBjb21wbGV0ZS4gICovCisJUlRfQURELAkJCS8qIEJlZ2lubmluZyB0byBhZGQgYSBuZXcgb2JqZWN0LiAgKi8KKwlSVF9ERUxFVEUJCS8qIEJlZ2lubmluZyB0byByZW1vdmUgYW4gb2JqZWN0IG1hcHBpbmcuICAqLworICAgICAgfSByX3N0YXRlOworCisgICAgRWxmVyhBZGRyKSByX2xkYmFzZTsJLyogQmFzZSBhZGRyZXNzIHRoZSBsaW5rZXIgaXMgbG9hZGVkIGF0LiAgKi8KKyAgfTsKKworLyogVGhpcyBpcyB0aGUgaW5zdGFuY2Ugb2YgdGhhdCBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgZHluYW1pYyBsaW5rZXIuICAqLworZXh0ZXJuIHN0cnVjdCByX2RlYnVnIF9yX2RlYnVnOworCisvKiBUaGlzIHN5bWJvbCByZWZlcnMgdG8gdGhlICJkeW5hbWljIHN0cnVjdHVyZSIgaW4gdGhlIGAuZHluYW1pYycgc2VjdGlvbgorICAgb2Ygd2hhdGV2ZXIgbW9kdWxlIHJlZmVycyB0byBgX0RZTkFNSUMnLiAgU28sIHRvIGZpbmQgaXRzIG93bgorICAgYHN0cnVjdCByX2RlYnVnJywgYSBwcm9ncmFtIGNvdWxkIGRvOgorICAgICBmb3IgKGR5biA9IF9EWU5BTUlDOyBkeW4tPmRfdGFnICE9IERUX05VTEw7ICsrZHluKQorICAgICAgIGlmIChkeW4tPmRfdGFnID09IERUX0RFQlVHKQorCSByX2RlYnVnID0gKHN0cnVjdCByX2RlYnVnICopIGR5bi0+ZF91bi5kX3B0cjsKKyAgICovCitleHRlcm4gRWxmVyhEeW4pIF9EWU5BTUlDW107CisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGEgbG9hZGVkIHNoYXJlZCBvYmplY3QuICBUaGUgYGxfbmV4dCcgYW5kIGBsX3ByZXYnCisgICBtZW1iZXJzIGZvcm0gYSBjaGFpbiBvZiBhbGwgdGhlIHNoYXJlZCBvYmplY3RzIGxvYWRlZCBhdCBzdGFydHVwLgorCisgICBUaGVzZSBkYXRhIHN0cnVjdHVyZXMgZXhpc3QgaW4gc3BhY2UgdXNlZCBieSB0aGUgcnVuLXRpbWUgZHluYW1pYyBsaW5rZXI7CisgICBtb2RpZnlpbmcgdGhlbSBtYXkgaGF2ZSBkaXNhc3Ryb3VzIHJlc3VsdHMuICAqLworCitzdHJ1Y3QgbGlua19tYXAKKyAgeworICAgIC8qIFRoZXNlIGZpcnN0IGZldyBtZW1iZXJzIGFyZSBwYXJ0IG9mIHRoZSBwcm90b2NvbCB3aXRoIHRoZSBkZWJ1Z2dlci4KKyAgICAgICBUaGlzIGlzIHRoZSBzYW1lIGZvcm1hdCB1c2VkIGluIFNWUjQuICAqLworCisgICAgRWxmVyhBZGRyKSBsX2FkZHI7CQkvKiBCYXNlIGFkZHJlc3Mgc2hhcmVkIG9iamVjdCBpcyBsb2FkZWQgYXQuICAqLworICAgIGNoYXIgKmxfbmFtZTsJCS8qIEFic29sdXRlIGZpbGUgbmFtZSBvYmplY3Qgd2FzIGZvdW5kIGluLiAgKi8KKyAgICBFbGZXKER5bikgKmxfbGQ7CQkvKiBEeW5hbWljIHNlY3Rpb24gb2YgdGhlIHNoYXJlZCBvYmplY3QuICAqLworICAgIHN0cnVjdCBsaW5rX21hcCAqbF9uZXh0LCAqbF9wcmV2OyAvKiBDaGFpbiBvZiBsb2FkZWQgb2JqZWN0cy4gICovCisgIH07CisKKyNpZmRlZiBfX1VTRV9HTlUKKworLyogVmVyc2lvbiBudW1iZXJzIGZvciBsYV92ZXJzaW9uIGhhbmRzaGFrZSBpbnRlcmZhY2UuICAqLworI2RlZmluZSBMQVZfQ1VSUkVOVAkxCisKKy8qIEFjdGl2aXR5IHR5cGVzIHNpZ25hbGVkIHRocm91Z2ggbGFfYWN0aXZpdHkuICAqLworZW51bQorICB7CisgICAgTEFfQUNUX0NPTlNJU1RFTlQsCQkvKiBMaW5rIG1hcCBjb25zaXN0ZW50IGFnYWluLiAgKi8KKyAgICBMQV9BQ1RfQURELAkJCS8qIE5ldyBvYmplY3Qgd2lsbCBiZSBhZGRlZC4gICovCisgICAgTEFfQUNUX0RFTEVURQkJLyogT2JqZWN0cyB3aWxsIGJlIHJlbW92ZWQuICAqLworICB9OworCisvKiBWYWx1ZXMgcmVwcmVzZW50aW5nIG9yaWdpbiBvZiBuYW1lIGZvciBkeW5hbWljIGxvYWRpbmcuICAqLworZW51bQorICB7CisgICAgTEFfU0VSX09SSUcgPSAweDAxLAkJLyogT3JpZ2luYWwgbmFtZS4gICovCisgICAgTEFfU0VSX0xJQlBBVEggPSAweDAyLAkvKiBEaXJlY3RvcnkgZnJvbSBMRF9MSUJSQVJZX1BBVEguICAqLworICAgIExBX1NFUl9SVU5QQVRIID0gMHgwNCwJLyogRGlyZWN0b3J5IGZyb20gUlBBVEgvUlVOUEFUSC4gICovCisgICAgTEFfU0VSX0NPTkZJRyA9IDB4MDgsCS8qIEZvdW5kIHRocm91Z2ggbGRjb25maWcuICAqLworICAgIExBX1NFUl9ERUZBVUxUID0gMHg0MCwJLyogRGVmYXVsdCBkaXJlY3RvcnkuICAqLworICAgIExBX1NFUl9TRUNVUkUgPSAweDgwCS8qIFVudXNlZC4gICovCisgIH07CisKKy8qIFZhbHVlcyBmb3IgbGFfb2Jqb3BlbiByZXR1cm4gdmFsdWUuICAqLworZW51bQorICB7CisgICAgTEFfRkxHX0JJTkRUTyA9IDB4MDEsCS8qIEF1ZGl0IHN5bWJvbHMgYm91bmQgdG8gdGhpcyBvYmplY3QuICAqLworICAgIExBX0ZMR19CSU5ERlJPTSA9IDB4MDIJLyogQXVkaXQgc3ltYm9scyBib3VuZCBmcm9tIHRoaXMgb2JqZWN0LiAgKi8KKyAgfTsKKworLyogVmFsdWVzIGZvciBsYV9zeW1iaW5kIGZsYWdzIHBhcmFtZXRlci4gICovCitlbnVtCisgIHsKKyAgICBMQV9TWU1CX05PUExURU5URVIgPSAweDAxLAkvKiBsYV9wbHRlbnRlciB3aWxsIG5vdCBiZSBjYWxsZWQuICAqLworICAgIExBX1NZTUJfTk9QTFRFWElUID0gMHgwMiwJLyogbGFfcGx0ZXhpdCB3aWxsIG5vdCBiZSBjYWxsZWQuICAqLworICAgIExBX1NZTUJfU1RSVUNUQ0FMTCA9IDB4MDQsCS8qIFJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdHVyZS4gICovCisgICAgTEFfU1lNQl9ETFNZTSA9IDB4MDgsCS8qIEJpbmRpbmcgZHVlIHRvIGRsc3ltIGNhbGwuICAqLworICAgIExBX1NZTUJfQUxUVkFMVUUgPSAweDEwCS8qIFZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgYnkgYSBwcmV2aW91cworCQkJCSAgIGxhX3N5bWJpbmQgY2FsbC4gICovCisgIH07CisKK3N0cnVjdCBkbF9waGRyX2luZm8KKyAgeworICAgIEVsZlcoQWRkcikgZGxwaV9hZGRyOworICAgIGNvbnN0IGNoYXIgKmRscGlfbmFtZTsKKyAgICBjb25zdCBFbGZXKFBoZHIpICpkbHBpX3BoZHI7CisgICAgRWxmVyhIYWxmKSBkbHBpX3BobnVtOworCisgICAgLyogTm90ZTogRm9sbG93aW5nIG1lbWJlcnMgd2VyZSBpbnRyb2R1Y2VkIGFmdGVyIHRoZSBmaXJzdAorICAgICAgIHZlcnNpb24gb2YgdGhpcyBzdHJ1Y3R1cmUgd2FzIGF2YWlsYWJsZS4gIENoZWNrIHRoZSBTSVpFCisgICAgICAgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBkbF9pdGVyYXRlX3BoZHIgY2FsbGJhY2sgdG8gZGV0ZXJtaW5lCisgICAgICAgd2hldGhlciBvciBub3QgZWFjaCBsYXRlciBtZW1iZXIgaXMgYXZhaWxhYmxlLiAgKi8KKworICAgIC8qIEluY3JlbWVudGVkIHdoZW4gYSBuZXcgb2JqZWN0IG1heSBoYXZlIGJlZW4gYWRkZWQuICAqLworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgZGxwaV9hZGRzOworICAgIC8qIEluY3JlbWVudGVkIHdoZW4gYW4gb2JqZWN0IG1heSBoYXZlIGJlZW4gcmVtb3ZlZC4gICovCisgICAgdW5zaWduZWQgbG9uZyBsb25nIGludCBkbHBpX3N1YnM7CisKKyAgICAvKiBJZiB0aGVyZSBpcyBhIFBUX1RMUyBzZWdtZW50LCBpdHMgbW9kdWxlIElEIGFzIHVzZWQgaW4KKyAgICAgICBUTFMgcmVsb2NhdGlvbnMsIGVsc2UgemVyby4gICovCisgICAgc2l6ZV90IGRscGlfdGxzX21vZGlkOworCisgICAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGNhbGxpbmcgdGhyZWFkJ3MgaW5zdGFuY2Ugb2YgdGhpcyBtb2R1bGUncworICAgICAgIFBUX1RMUyBzZWdtZW50LCBpZiBpdCBoYXMgb25lIGFuZCBpdCBoYXMgYmVlbiBhbGxvY2F0ZWQKKyAgICAgICBpbiB0aGUgY2FsbGluZyB0aHJlYWQsIG90aGVyd2lzZSBhIG51bGwgcG9pbnRlci4gICovCisgICAgdm9pZCAqZGxwaV90bHNfZGF0YTsKKyAgfTsKKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IGRsX2l0ZXJhdGVfcGhkciAoaW50ICgqX19jYWxsYmFjaykgKHN0cnVjdCBkbF9waGRyX2luZm8gKiwKKwkJCQkJICAgICAgIHNpemVfdCwgdm9pZCAqKSwKKwkJCSAgICB2b2lkICpfX2RhdGEpOworCisKKy8qIFByb3RvdHlwZXMgZm9yIHRoZSBsZC5zbyBhdWRpdGluZyBpbnRlcmZhY2VzLiAgVGhlc2UgYXJlIG5vdAorICAgZGVmaW5lZCBhbnl3aGVyZSBpbiBsZC5zbyBidXQgaW5zdGVhZCBoYXZlIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZQorICAgYXVkaXRpbmcgRFNPLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgbGFfdmVyc2lvbiAodW5zaWduZWQgaW50IF9fdmVyc2lvbik7CitleHRlcm4gdm9pZCBsYV9hY3Rpdml0eSAodWludHB0cl90ICpfX2Nvb2tpZSwgdW5zaWduZWQgaW50IF9fZmxhZyk7CitleHRlcm4gY2hhciAqbGFfb2Jqc2VhcmNoIChjb25zdCBjaGFyICpfX25hbWUsIHVpbnRwdHJfdCAqX19jb29raWUsCisJCQkgICB1bnNpZ25lZCBpbnQgX19mbGFnKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbGFfb2Jqb3BlbiAoc3RydWN0IGxpbmtfbWFwICpfX21hcCwgTG1pZF90IF9fbG1pZCwKKwkJCQl1aW50cHRyX3QgKl9fY29va2llKTsKK2V4dGVybiB2b2lkIGxhX3ByZWluaXQgKHVpbnRwdHJfdCAqX19jb29raWUpOworZXh0ZXJuIHVpbnRwdHJfdCBsYV9zeW1iaW5kMzIgKEVsZjMyX1N5bSAqX19zeW0sIHVuc2lnbmVkIGludCBfX25keCwKKwkJCSAgICAgICB1aW50cHRyX3QgKl9fcmVmY29vaywgdWludHB0cl90ICpfX2RlZmNvb2ssCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpfX2ZsYWdzLCBjb25zdCBjaGFyICpfX3N5bW5hbWUpOworZXh0ZXJuIHVpbnRwdHJfdCBsYV9zeW1iaW5kNjQgKEVsZjY0X1N5bSAqX19zeW0sIHVuc2lnbmVkIGludCBfX25keCwKKwkJCSAgICAgICB1aW50cHRyX3QgKl9fcmVmY29vaywgdWludHB0cl90ICpfX2RlZmNvb2ssCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpfX2ZsYWdzLCBjb25zdCBjaGFyICpfX3N5bW5hbWUpOworZXh0ZXJuIHVuc2lnbmVkIGludCBsYV9vYmpjbG9zZSAodWludHB0cl90ICpfX2Nvb2tpZSk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgorCisjZW5kaWYgLyogbGluay5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Eub3V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Eub3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyNzE5NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYS5vdXQuaApAQCAtMCwwICsxLDI3MCBAQAorI2lmbmRlZiBfX0FfT1VUX0dOVV9IX18KKyNkZWZpbmUgX19BX09VVF9HTlVfSF9fCisKKyNkZWZpbmUgX19HTlVfRVhFQ19NQUNST1NfXworCisjaWZuZGVmIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXworCisjaW5jbHVkZSA8YXNtL2Eub3V0Lmg+CisKKyNlbmRpZiAvKiBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18gKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyogdGhlc2UgZ28gaW4gdGhlIE5fTUFDSFRZUEUgZmllbGQgKi8KK2VudW0gbWFjaGluZV90eXBlIHsKKyNpZiBkZWZpbmVkIChNX09MRFNVTjIpCisgIE1fX09MRFNVTjIgPSBNX09MRFNVTjIsCisjZWxzZQorICBNX09MRFNVTjIgPSAwLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoTV82ODAxMCkKKyAgTV9fNjgwMTAgPSBNXzY4MDEwLAorI2Vsc2UKKyAgTV82ODAxMCA9IDEsCisjZW5kaWYKKyNpZiBkZWZpbmVkIChNXzY4MDIwKQorICBNX182ODAyMCA9IE1fNjgwMjAsCisjZWxzZQorICBNXzY4MDIwID0gMiwKKyNlbmRpZgorI2lmIGRlZmluZWQgKE1fU1BBUkMpCisgIE1fX1NQQVJDID0gTV9TUEFSQywKKyNlbHNlCisgIE1fU1BBUkMgPSAzLAorI2VuZGlmCisgIC8qIHNraXAgYSBidW5jaCBzbyB3ZSBkb24ndCBydW4gaW50byBhbnkgb2Ygc3VuJ3MgbnVtYmVycyAqLworICBNXzM4NiA9IDEwMCwKKyAgTV9NSVBTMSA9IDE1MSwJLyogTUlQUyBSMzAwMC9SMzAwMCBiaW5hcnkgKi8KKyAgTV9NSVBTMiA9IDE1MgkJLyogTUlQUyBSNjAwMC9SNDAwMCBiaW5hcnkgKi8KK307CisKKyNpZiAhZGVmaW5lZCAoTl9NQUdJQykKKyNkZWZpbmUgTl9NQUdJQyhleGVjKSAoKGV4ZWMpLmFfaW5mbyAmIDB4ZmZmZikKKyNlbmRpZgorI2RlZmluZSBOX01BQ0hUWVBFKGV4ZWMpICgoZW51bSBtYWNoaW5lX3R5cGUpKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4ZmYpKQorI2RlZmluZSBOX0ZMQUdTKGV4ZWMpICgoKGV4ZWMpLmFfaW5mbyA+PiAyNCkgJiAweGZmKQorI2RlZmluZSBOX1NFVF9JTkZPKGV4ZWMsIG1hZ2ljLCB0eXBlLCBmbGFncykgXAorCSgoZXhlYykuYV9pbmZvID0gKChtYWdpYykgJiAweGZmZmYpIFwKKwkgfCAoKChpbnQpKHR5cGUpICYgMHhmZikgPDwgMTYpIFwKKwkgfCAoKChmbGFncykgJiAweGZmKSA8PCAyNCkpCisjZGVmaW5lIE5fU0VUX01BR0lDKGV4ZWMsIG1hZ2ljKSBcCisJKChleGVjKS5hX2luZm8gPSAoKChleGVjKS5hX2luZm8gJiAweGZmZmYwMDAwKSB8ICgobWFnaWMpICYgMHhmZmZmKSkpCisKKyNkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKKwkoKGV4ZWMpLmFfaW5mbyA9IFwKKwkgKChleGVjKS5hX2luZm8mMHhmZjAwZmZmZikgfCAoKCgoaW50KShtYWNodHlwZSkpJjB4ZmYpIDw8IDE2KSkKKworI2RlZmluZSBOX1NFVF9GTEFHUyhleGVjLCBmbGFncykgXAorCSgoZXhlYykuYV9pbmZvID0gXAorCSAoKGV4ZWMpLmFfaW5mbyYweDAwZmZmZmZmKSB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKKworLyogQ29kZSBpbmRpY2F0aW5nIG9iamVjdCBmaWxlIG9yIGltcHVyZSBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgT01BR0lDIDA0MDcKKy8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAqLworI2RlZmluZSBOTUFHSUMgMDQxMAorLyogQ29kZSBpbmRpY2F0aW5nIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgWk1BR0lDIDA0MTMKKy8qIFRoaXMgaW5kaWNhdGVzIGEgZGVtYW5kLXBhZ2VkIGV4ZWN1dGFibGUgd2l0aCB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAKKyAgIFRoZSBmaXJzdCBwYWdlIGlzIHVubWFwcGVkIHRvIGhlbHAgdHJhcCBOVUxMIHBvaW50ZXIgcmVmZXJlbmNlcyAqLworI2RlZmluZSBRTUFHSUMgMDMxNAorCisvKiBDb2RlIGluZGljYXRpbmcgY29yZSBmaWxlLiAgKi8KKyNkZWZpbmUgQ01BR0lDIDA0MjEKKworI2lmICFkZWZpbmVkIChOX0JBRE1BRykKKyNkZWZpbmUgTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKKwkJCSYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQlcCisgIAkJCSYmIE5fTUFHSUMoeCkgIT0gWk1BR0lDIFwKKwkJICAgICAgICAmJiBOX01BR0lDKHgpICE9IFFNQUdJQykKKyNlbmRpZgorCisjZGVmaW5lIF9OX0hEUk9GRih4KSAoMTAyNCAtIHNpemVvZiAoc3RydWN0IGV4ZWMpKQorCisjaWYgIWRlZmluZWQgKE5fVFhUT0ZGKQorI2RlZmluZSBOX1RYVE9GRih4KSBcCisgKE5fTUFHSUMoeCkgPT0gWk1BR0lDID8gX05fSERST0ZGKCh4KSkgKyBzaXplb2YgKHN0cnVjdCBleGVjKSA6IFwKKyAgKE5fTUFHSUMoeCkgPT0gUU1BR0lDID8gMCA6IHNpemVvZiAoc3RydWN0IGV4ZWMpKSkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKE5fREFUT0ZGKQorI2RlZmluZSBOX0RBVE9GRih4KSAoTl9UWFRPRkYoeCkgKyAoeCkuYV90ZXh0KQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoTl9UUkVMT0ZGKQorI2RlZmluZSBOX1RSRUxPRkYoeCkgKE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKE5fRFJFTE9GRikKKyNkZWZpbmUgTl9EUkVMT0ZGKHgpIChOX1RSRUxPRkYoeCkgKyBOX1RSU0laRSh4KSkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKE5fU1lNT0ZGKQorI2RlZmluZSBOX1NZTU9GRih4KSAoTl9EUkVMT0ZGKHgpICsgTl9EUlNJWkUoeCkpCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChOX1NUUk9GRikKKyNkZWZpbmUgTl9TVFJPRkYoeCkgKE5fU1lNT0ZGKHgpICsgTl9TWU1TSVpFKHgpKQorI2VuZGlmCisKKy8qIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuICAqLworI2lmICFkZWZpbmVkIChOX1RYVEFERFIpCisjZGVmaW5lIE5fVFhUQUREUih4KSAoTl9NQUdJQyh4KSA9PSBRTUFHSUMgPyBQQUdFX1NJWkUgOiAwKQorI2VuZGlmCisKKy8qIEFkZHJlc3Mgb2YgZGF0YSBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuCisgICBOb3RlIHRoYXQgaXQgaXMgdXAgdG8geW91IHRvIGRlZmluZSBTRUdNRU5UX1NJWkUKKyAgIG9uIG1hY2hpbmVzIG5vdCBsaXN0ZWQgaGVyZS4gICovCisjaWYgZGVmaW5lZCh2YXgpIHx8IGRlZmluZWQoaHAzMDApIHx8IGRlZmluZWQocHlyKQorI2RlZmluZSBTRUdNRU5UX1NJWkUgcGFnZV9zaXplCisjZW5kaWYKKyNpZmRlZglzb255CisjZGVmaW5lCVNFR01FTlRfU0laRQkweDIwMDAKKyNlbmRpZgkvKiBTb255LiAgKi8KKyNpZmRlZiBpczY4aworI2RlZmluZSBTRUdNRU5UX1NJWkUgMHgyMDAwMAorI2VuZGlmCisjaWYgZGVmaW5lZChtNjhrKSAmJiBkZWZpbmVkKFBPUlRBUikKKyNkZWZpbmUgUEFHRV9TSVpFIDB4NDAwCisjZGVmaW5lIFNFR01FTlRfU0laRSBQQUdFX1NJWkUKKyNlbmRpZgorCisjaWZkZWYgbGludXgKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fbWM2ODAwMF9fKQorI2RlZmluZSBTRUdNRU5UX1NJWkUJMTAyNAorI2Vsc2UKKyNpZm5kZWYgU0VHTUVOVF9TSVpFCisjZGVmaW5lIFNFR01FTlRfU0laRSAgIGdldHBhZ2VzaXplKCkKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBfTl9TRUdNRU5UX1JPVU5EKHgpIEFMSUdOKHgsIFNFR01FTlRfU0laRSkKKworI2RlZmluZSBfTl9UWFRFTkRBRERSKHgpIChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dCkKKworI2lmbmRlZiBOX0RBVEFERFIKKyNkZWZpbmUgTl9EQVRBRERSKHgpIFwKKyAgICAoTl9NQUdJQyh4KT09T01BR0lDPyAoX05fVFhURU5EQUREUih4KSkgXAorICAgICA6IChfTl9TRUdNRU5UX1JPVU5EIChfTl9UWFRFTkRBRERSKHgpKSkpCisjZW5kaWYKKworLyogQWRkcmVzcyBvZiBic3Mgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KKyNpZiAhZGVmaW5lZCAoTl9CU1NBRERSKQorI2RlZmluZSBOX0JTU0FERFIoeCkgKE5fREFUQUREUih4KSArICh4KS5hX2RhdGEpCisjZW5kaWYKKwwKKyNpZiAhZGVmaW5lZCAoTl9OTElTVF9ERUNMQVJFRCkKK3N0cnVjdCBubGlzdCB7CisgIHVuaW9uIHsKKyAgICBjaGFyICpuX25hbWU7CisgICAgc3RydWN0IG5saXN0ICpuX25leHQ7CisgICAgbG9uZyBuX3N0cng7CisgIH0gbl91bjsKKyAgdW5zaWduZWQgY2hhciBuX3R5cGU7CisgIGNoYXIgbl9vdGhlcjsKKyAgc2hvcnQgbl9kZXNjOworICB1bnNpZ25lZCBsb25nIG5fdmFsdWU7Cit9OworI2VuZGlmIC8qIG5vIE5fTkxJU1RfREVDTEFSRUQuICAqLworCisjaWYgIWRlZmluZWQgKE5fVU5ERikKKyNkZWZpbmUgTl9VTkRGIDAKKyNlbmRpZgorI2lmICFkZWZpbmVkIChOX0FCUykKKyNkZWZpbmUgTl9BQlMgMgorI2VuZGlmCisjaWYgIWRlZmluZWQgKE5fVEVYVCkKKyNkZWZpbmUgTl9URVhUIDQKKyNlbmRpZgorI2lmICFkZWZpbmVkIChOX0RBVEEpCisjZGVmaW5lIE5fREFUQSA2CisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoTl9CU1MpCisjZGVmaW5lIE5fQlNTIDgKKyNlbmRpZgorI2lmICFkZWZpbmVkIChOX0ZOKQorI2RlZmluZSBOX0ZOIDE1CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChOX0VYVCkKKyNkZWZpbmUgTl9FWFQgMQorI2VuZGlmCisjaWYgIWRlZmluZWQgKE5fVFlQRSkKKyNkZWZpbmUgTl9UWVBFIDAzNgorI2VuZGlmCisjaWYgIWRlZmluZWQgKE5fU1RBQikKKyNkZWZpbmUgTl9TVEFCIDAzNDAKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIHR5cGUgaW5kaWNhdGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3ltYm9sIGFzIGJlaW5nCisgICBhbiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gYW5vdGhlciBzeW1ib2wuICBUaGUgb3RoZXIgc3ltYm9sCisgICBhcHBlYXJzIGFzIGFuIHVuZGVmaW5lZCByZWZlcmVuY2UsIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGlzIHN5bWJvbC4KKworICAgSW5kaXJlY3Rpb24gaXMgYXN5bW1ldHJpY2FsLiAgVGhlIG90aGVyIHN5bWJvbCdzIHZhbHVlIHdpbGwgYmUgdXNlZAorICAgdG8gc2F0aXNmeSByZXF1ZXN0cyBmb3IgdGhlIGluZGlyZWN0IHN5bWJvbCwgYnV0IG5vdCB2aWNlIHZlcnNhLgorICAgSWYgdGhlIG90aGVyIHN5bWJvbCBkb2VzIG5vdCBoYXZlIGEgZGVmaW5pdGlvbiwgbGlicmFyaWVzIHdpbGwKKyAgIGJlIHNlYXJjaGVkIHRvIGZpbmQgYSBkZWZpbml0aW9uLiAgKi8KKyNkZWZpbmUgTl9JTkRSIDB4YQorCisvKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgcmVmZXIgdG8gc2V0IGVsZW1lbnRzLgorICAgQWxsIHRoZSBOX1NFVFtBVERCXSBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZSBmb3JtIG9uZSBzZXQuCisgICBTcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzZXQgaW4gdGhlIHRleHQgc2VjdGlvbiwgYW5kIGVhY2ggc2V0CisgICBlbGVtZW50J3MgdmFsdWUgaXMgc3RvcmVkIGludG8gb25lIHdvcmQgb2YgdGhlIHNwYWNlLgorICAgVGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNwYWNlIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNldCAobnVtYmVyIG9mIGVsZW1lbnRzKS4KKworICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHNldCBpcyBtYWRlIGludG8gYW4gTl9TRVRWIHN5bWJvbAorICAgd2hvc2UgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgc2V0LgorICAgVGhpcyBzeW1ib2wgYWN0cyBsaWtlIGEgTl9EQVRBIGdsb2JhbCBzeW1ib2wKKyAgIGluIHRoYXQgaXQgY2FuIHNhdGlzZnkgdW5kZWZpbmVkIGV4dGVybmFsIHJlZmVyZW5jZXMuICAqLworCisvKiBUaGVzZSBhcHBlYXIgYXMgaW5wdXQgdG8gTEQsIGluIGEgLm8gZmlsZS4gICovCisjZGVmaW5lCU5fU0VUQQkweDE0CQkvKiBBYnNvbHV0ZSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KKyNkZWZpbmUJTl9TRVRUCTB4MTYJCS8qIFRleHQgc2V0IGVsZW1lbnQgc3ltYm9sICovCisjZGVmaW5lCU5fU0VURAkweDE4CQkvKiBEYXRhIHNldCBlbGVtZW50IHN5bWJvbCAqLworI2RlZmluZQlOX1NFVEIJMHgxQQkJLyogQnNzIHNldCBlbGVtZW50IHN5bWJvbCAqLworCisvKiBUaGlzIGlzIG91dHB1dCBmcm9tIExELiAgKi8KKyNkZWZpbmUgTl9TRVRWCTB4MUMJCS8qIFBvaW50ZXIgdG8gc2V0IHZlY3RvciBpbiBkYXRhIGFyZWEuICAqLworDAorI2lmICFkZWZpbmVkIChOX1JFTE9DQVRJT05fSU5GT19ERUNMQVJFRCkKKy8qIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIHNpbmdsZSByZWxvY2F0aW9uIHRvIGJlIHBlcmZvcm1lZC4KKyAgIFRoZSB0ZXh0LXJlbG9jYXRpb24gc2VjdGlvbiBvZiB0aGUgZmlsZSBpcyBhIHZlY3RvciBvZiB0aGVzZSBzdHJ1Y3R1cmVzLAorICAgYWxsIG9mIHdoaWNoIGFwcGx5IHRvIHRoZSB0ZXh0IHNlY3Rpb24uCisgICBMaWtld2lzZSwgdGhlIGRhdGEtcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gdGhlIGRhdGEgc2VjdGlvbi4gICovCisKK3N0cnVjdCByZWxvY2F0aW9uX2luZm8KK3sKKyAgLyogQWRkcmVzcyAod2l0aGluIHNlZ21lbnQpIHRvIGJlIHJlbG9jYXRlZC4gICovCisgIGludCByX2FkZHJlc3M7CisgIC8qIFRoZSBtZWFuaW5nIG9mIHJfc3ltYm9sbnVtIGRlcGVuZHMgb24gcl9leHRlcm4uICAqLworICB1bnNpZ25lZCBpbnQgcl9zeW1ib2xudW06MjQ7CisgIC8qIE5vbnplcm8gbWVhbnMgdmFsdWUgaXMgYSBwYy1yZWxhdGl2ZSBvZmZzZXQKKyAgICAgYW5kIGl0IHNob3VsZCBiZSByZWxvY2F0ZWQgZm9yIGNoYW5nZXMgaW4gaXRzIG93biBhZGRyZXNzCisgICAgIGFzIHdlbGwgYXMgZm9yIGNoYW5nZXMgaW4gdGhlIHN5bWJvbCBvciBzZWN0aW9uIHNwZWNpZmllZC4gICovCisgIHVuc2lnbmVkIGludCByX3BjcmVsOjE7CisgIC8qIExlbmd0aCAoYXMgZXhwb25lbnQgb2YgMikgb2YgdGhlIGZpZWxkIHRvIGJlIHJlbG9jYXRlZC4KKyAgICAgVGh1cywgYSB2YWx1ZSBvZiAyIGluZGljYXRlcyAxPDwyIGJ5dGVzLiAgKi8KKyAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOjI7CisgIC8qIDEgPT4gcmVsb2NhdGUgd2l0aCB2YWx1ZSBvZiBzeW1ib2wuCisgICAgICAgICAgcl9zeW1ib2xudW0gaXMgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wKKwkgIGluIGZpbGUncyB0aGUgc3ltYm9sIHRhYmxlLgorICAgICAwID0+IHJlbG9jYXRlIHdpdGggdGhlIGFkZHJlc3Mgb2YgYSBzZWdtZW50LgorICAgICAgICAgIHJfc3ltYm9sbnVtIGlzIE5fVEVYVCwgTl9EQVRBLCBOX0JTUyBvciBOX0FCUworCSAgKHRoZSBOX0VYVCBiaXQgbWF5IGJlIHNldCBhbHNvLCBidXQgc2lnbmlmaWVzIG5vdGhpbmcpLiAgKi8KKyAgdW5zaWduZWQgaW50IHJfZXh0ZXJuOjE7CisgIC8qIEZvdXIgYml0cyB0aGF0IGFyZW4ndCB1c2VkLCBidXQgd2hlbiB3cml0aW5nIGFuIG9iamVjdCBmaWxlCisgICAgIGl0IGlzIGRlc2lyYWJsZSB0byBjbGVhciB0aGVtLiAgKi8KKyNpZmRlZiBOUzMySworICB1bnNpZ25lZCByX2JzcjoxOworICB1bnNpZ25lZCByX2Rpc3A6MTsKKyAgdW5zaWduZWQgcl9wYWQ6MjsKKyNlbHNlCisgIHVuc2lnbmVkIGludCByX3BhZDo0OworI2VuZGlmCit9OworI2VuZGlmIC8qIG5vIE5fUkVMT0NBVElPTl9JTkZPX0RFQ0xBUkVELiAgKi8KKworI2VuZGlmIC8qX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogX19BX09VVF9HTlVfSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FjY3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWNjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzJkYTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FjY3QuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqICBCU0QgUHJvY2VzcyBBY2NvdW50aW5nIGZvciBMaW51eCAtIERlZmluaXRpb25zCisgKgorICogIEF1dGhvcjogTWFyY28gdmFuIFdpZXJpbmdlbiAobXZ3QHBsYW5ldHMuZWxtLm5ldCkKKyAqCisgKiAgVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAorICogIEJTRC1zdHlsZSBwcm9jZXNzIGFjY291bnRpbmcuIFRoZSBrZXJuZWwgYWNjb3VudGluZyBjb2RlIGFuZCBhbGwKKyAqICB1c2VyLWxldmVsIHByb2dyYW1zIHRoYXQgdHJ5IHRvIGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCB0aGUKKyAqICBwcm9jZXNzIGFjY291bnRpbmcgbG9nIG11c3QgaW5jbHVkZSB0aGlzIGZpbGUuCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSAtIDE5OTcgTWFyY28gdmFuIFdpZXJpbmdlbiAtIEVMTSBDb25zdWx0YW5jeSBCLlYuCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FDQ1RfSAorI2RlZmluZSBfTElOVVhfQUNDVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKiAKKyAqICBjb21wX3QgaXMgYSAxNi1iaXQgImZsb2F0aW5nIiBwb2ludCBudW1iZXIgd2l0aCBhIDMtYml0IGJhc2UgOAorICogIGV4cG9uZW50IGFuZCBhIDEzLWJpdCBmcmFjdGlvbi4KKyAqICBjb21wMl90IGlzIDI0LWJpdCB3aXRoIDUtYml0IGJhc2UgMiBleHBvbmVudCBhbmQgMjAgYml0IGZyYWN0aW9uCisgKiAgKGxlYWRpbmcgMSBub3Qgc3RvcmVkKS4KKyAqICBTZWUgbGludXgva2VybmVsL2FjY3QuYyBmb3IgdGhlIHNwZWNpZmljIGVuY29kaW5nIHN5c3RlbXMgdXNlZC4KKyAqLworCit0eXBlZGVmIF9fdTE2CWNvbXBfdDsKK3R5cGVkZWYgX191MzIJY29tcDJfdDsKKworLyoKKyAqICAgYWNjb3VudGluZyBmaWxlIHJlY29yZAorICoKKyAqICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiB3cml0dGVuIG91dCB0byB0aGUKKyAqICAgcHJvY2VzcyBhY2NvdW50aW5nIGZpbGUgd2hlbmV2ZXIgYSBwcm9jZXNzIGV4aXRzLgorICovCisKKyNkZWZpbmUgQUNDVF9DT01NCTE2CisKK3N0cnVjdCBhY2N0Cit7CisJY2hhcgkJYWNfZmxhZzsJCS8qIEZsYWdzICovCisJY2hhcgkJYWNfdmVyc2lvbjsJCS8qIEFsd2F5cyBzZXQgdG8gQUNDVF9WRVJTSU9OICovCisJLyogZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5IGJhY2sgdW50aWwgMi4wICovCisJX191MTYJCWFjX3VpZDE2OwkJLyogTFNCIG9mIFJlYWwgVXNlciBJRCAqLworCV9fdTE2CQlhY19naWQxNjsJCS8qIExTQiBvZiBSZWFsIEdyb3VwIElEICovCisJX191MTYJCWFjX3R0eTsJCQkvKiBDb250cm9sIFRlcm1pbmFsICovCisJX191MzIJCWFjX2J0aW1lOwkJLyogUHJvY2VzcyBDcmVhdGlvbiBUaW1lICovCisJY29tcF90CQlhY191dGltZTsJCS8qIFVzZXIgVGltZSAqLworCWNvbXBfdAkJYWNfc3RpbWU7CQkvKiBTeXN0ZW0gVGltZSAqLworCWNvbXBfdAkJYWNfZXRpbWU7CQkvKiBFbGFwc2VkIFRpbWUgKi8KKwljb21wX3QJCWFjX21lbTsJCQkvKiBBdmVyYWdlIE1lbW9yeSBVc2FnZSAqLworCWNvbXBfdAkJYWNfaW87CQkJLyogQ2hhcnMgVHJhbnNmZXJyZWQgKi8KKwljb21wX3QJCWFjX3J3OwkJCS8qIEJsb2NrcyBSZWFkIG9yIFdyaXR0ZW4gKi8KKwljb21wX3QJCWFjX21pbmZsdDsJCS8qIE1pbm9yIFBhZ2VmYXVsdHMgKi8KKwljb21wX3QJCWFjX21hamZsdDsJCS8qIE1ham9yIFBhZ2VmYXVsdHMgKi8KKwljb21wX3QJCWFjX3N3YXBzOwkJLyogTnVtYmVyIG9mIFN3YXBzICovCisvKiBtNjhrIGhhZCBubyBwYWRkaW5nIGhlcmUuICovCisJX191MTYJCWFjX2FoejsJCQkvKiBBSFogKi8KKwlfX3UzMgkJYWNfZXhpdGNvZGU7CQkvKiBFeGl0Y29kZSAqLworCWNoYXIJCWFjX2NvbW1bQUNDVF9DT01NICsgMV07CS8qIENvbW1hbmQgTmFtZSAqLworCV9fdTgJCWFjX2V0aW1lX2hpOwkJLyogRWxhcHNlZCBUaW1lIE1TQiAqLworCV9fdTE2CQlhY19ldGltZV9sbzsJCS8qIEVsYXBzZWQgVGltZSBMU0IgKi8KKwlfX3UzMgkJYWNfdWlkOwkJCS8qIFJlYWwgVXNlciBJRCAqLworCV9fdTMyCQlhY19naWQ7CQkJLyogUmVhbCBHcm91cCBJRCAqLworfTsKKworc3RydWN0IGFjY3RfdjMKK3sKKwljaGFyCQlhY19mbGFnOwkJLyogRmxhZ3MgKi8KKwljaGFyCQlhY192ZXJzaW9uOwkJLyogQWx3YXlzIHNldCB0byBBQ0NUX1ZFUlNJT04gKi8KKwlfX3UxNgkJYWNfdHR5OwkJCS8qIENvbnRyb2wgVGVybWluYWwgKi8KKwlfX3UzMgkJYWNfZXhpdGNvZGU7CQkvKiBFeGl0Y29kZSAqLworCV9fdTMyCQlhY191aWQ7CQkJLyogUmVhbCBVc2VyIElEICovCisJX191MzIJCWFjX2dpZDsJCQkvKiBSZWFsIEdyb3VwIElEICovCisJX191MzIJCWFjX3BpZDsJCQkvKiBQcm9jZXNzIElEICovCisJX191MzIJCWFjX3BwaWQ7CQkvKiBQYXJlbnQgUHJvY2VzcyBJRCAqLworCV9fdTMyCQlhY19idGltZTsJCS8qIFByb2Nlc3MgQ3JlYXRpb24gVGltZSAqLworCWZsb2F0CQlhY19ldGltZTsJCS8qIEVsYXBzZWQgVGltZSAqLworCWNvbXBfdAkJYWNfdXRpbWU7CQkvKiBVc2VyIFRpbWUgKi8KKwljb21wX3QJCWFjX3N0aW1lOwkJLyogU3lzdGVtIFRpbWUgKi8KKwljb21wX3QJCWFjX21lbTsJCQkvKiBBdmVyYWdlIE1lbW9yeSBVc2FnZSAqLworCWNvbXBfdAkJYWNfaW87CQkJLyogQ2hhcnMgVHJhbnNmZXJyZWQgKi8KKwljb21wX3QJCWFjX3J3OwkJCS8qIEJsb2NrcyBSZWFkIG9yIFdyaXR0ZW4gKi8KKwljb21wX3QJCWFjX21pbmZsdDsJCS8qIE1pbm9yIFBhZ2VmYXVsdHMgKi8KKwljb21wX3QJCWFjX21hamZsdDsJCS8qIE1ham9yIFBhZ2VmYXVsdHMgKi8KKwljb21wX3QJCWFjX3N3YXBzOwkJLyogTnVtYmVyIG9mIFN3YXBzICovCisJY2hhcgkJYWNfY29tbVtBQ0NUX0NPTU1dOwkvKiBDb21tYW5kIE5hbWUgKi8KK307CisKKy8qCisgKiAgYWNjb3VudGluZyBmbGFncworICovCisJCQkJLyogYml0IHNldCB3aGVuIHRoZSBwcm9jZXNzIC4uLiAqLworI2RlZmluZSBBRk9SSwkJMHgwMQkvKiAuLi4gZXhlY3V0ZWQgZm9yaywgYnV0IGRpZCBub3QgZXhlYyAqLworI2RlZmluZSBBU1UJCTB4MDIJLyogLi4uIHVzZWQgc3VwZXItdXNlciBwcml2aWxlZ2VzICovCisjZGVmaW5lIEFDT01QQVQJCTB4MDQJLyogLi4uIHVzZWQgY29tcGF0aWJpbGl0eSBtb2RlIChWQVggb25seSBub3QgdXNlZCkgKi8KKyNkZWZpbmUgQUNPUkUJCTB4MDgJLyogLi4uIGR1bXBlZCBjb3JlICovCisjZGVmaW5lIEFYU0lHCQkweDEwCS8qIC4uLiB3YXMga2lsbGVkIGJ5IGEgc2lnbmFsICovCisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKyNkZWZpbmUgQUNDVF9CWVRFT1JERVIJMHg4MAkvKiBhY2NvdW50aW5nIGZpbGUgaXMgYmlnIGVuZGlhbiAqLworI2Vsc2UKKyNkZWZpbmUgQUNDVF9CWVRFT1JERVIJMHgwMAkvKiBhY2NvdW50aW5nIGZpbGUgaXMgbGl0dGxlIGVuZGlhbiAqLworI2VuZGlmCisKKyNkZWZpbmUgQUNDVF9WRVJTSU9OCTIKKyNkZWZpbmUgQUhaCQkoSFopCisKKworI2VuZGlmCS8qIF9MSU5VWF9BQ0NUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWRiLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FkYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTUwMjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FkYi5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgQURCIChBcHBsZSBEZXNrdG9wIEJ1cykgc3VwcG9ydC4KKyAqLworI2lmbmRlZiBfX0FEQl9ICisjZGVmaW5lIF9fQURCX0gKKworLyogQURCIGNvbW1hbmRzICovCisjZGVmaW5lIEFEQl9CVVNSRVNFVAkJMAorI2RlZmluZSBBREJfRkxVU0goaWQpCQkoMHgwMSB8ICgoaWQpIDw8IDQpKQorI2RlZmluZSBBREJfV1JJVEVSRUcoaWQsIHJlZykJKDB4MDggfCAocmVnKSB8ICgoaWQpIDw8IDQpKQorI2RlZmluZSBBREJfUkVBRFJFRyhpZCwgcmVnKQkoMHgwQyB8IChyZWcpIHwgKChpZCkgPDwgNCkpCisKKy8qIEFEQiBkZWZhdWx0IGRldmljZSBJRHMgKHVwcGVyIDQgYml0cyBvZiBBREIgY29tbWFuZCBieXRlKSAqLworI2RlZmluZSBBREJfRE9OR0xFCTEJLyogInNvZnR3YXJlIGV4ZWN1dGlvbiBjb250cm9sIiBkZXZpY2VzICovCisjZGVmaW5lIEFEQl9LRVlCT0FSRAkyCisjZGVmaW5lIEFEQl9NT1VTRQkzCisjZGVmaW5lIEFEQl9UQUJMRVQJNAorI2RlZmluZSBBREJfTU9ERU0JNQorI2RlZmluZSBBREJfTUlTQwk3CS8qIG1heWJlIGEgbW9uaXRvciAqLworCisjZGVmaW5lIEFEQl9SRVRfT0sJMAorI2RlZmluZSBBREJfUkVUX1RJTUVPVVQJMworCisvKiBUaGUga2luZCBvZiBBREIgcmVxdWVzdC4gVGhlIGNvbnRyb2xsZXIgbWF5IGVtdWxhdGUgc29tZQorICAgb3IgYWxsIG9mIHRob3NlIENVREEvUE1VIHBhY2tldCBraW5kcyAqLworI2RlZmluZSBBREJfUEFDS0VUCTAKKyNkZWZpbmUgQ1VEQV9QQUNLRVQJMQorI2RlZmluZSBFUlJPUl9QQUNLRVQJMgorI2RlZmluZSBUSU1FUl9QQUNLRVQJMworI2RlZmluZSBQT1dFUl9QQUNLRVQJNAorI2RlZmluZSBNQUNJSUNfUEFDS0VUCTUKKyNkZWZpbmUgUE1VX1BBQ0tFVAk2CisjZGVmaW5lIEFEQl9RVUVSWQk3CisKKy8qIEFEQiBxdWVyaWVzICovCisKKy8qIEFEQl9RVUVSWV9HRVRERVZJTkZPCisgKiBRdWVyeSBBREIgc2xvdCBmb3IgZGV2aWNlIHByZXNlbmNlCisgKiBkYXRhWzJdID0gaWQsIHJlcFswXSA9IG9yaWcgYWRkciwgcmVwWzFdID0gaGFuZGxlcl9pZAorICovCisjZGVmaW5lIEFEQl9RVUVSWV9HRVRERVZJTkZPCTEKKworCisjZW5kaWYgLyogX19BREJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hZGZzX2ZzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FkZnNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzlhNWExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hZGZzX2ZzLmgKQEAgLTAsMCArMSw0NCBAQAorI2lmbmRlZiBfQURGU19GU19ICisjZGVmaW5lIF9BREZTX0ZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworLyoKKyAqIERpc2MgUmVjb3JkIGF0IGRpc2MgYWRkcmVzcyAweGMwMAorICovCitzdHJ1Y3QgYWRmc19kaXNjcmVjb3JkIHsKKyAgICBfX3U4ICBsb2cyc2Vjc2l6ZTsKKyAgICBfX3U4ICBzZWNzcGVydHJhY2s7CisgICAgX191OCAgaGVhZHM7CisgICAgX191OCAgZGVuc2l0eTsKKyAgICBfX3U4ICBpZGxlbjsKKyAgICBfX3U4ICBsb2cyYnBtYjsKKyAgICBfX3U4ICBza2V3OworICAgIF9fdTggIGJvb3RvcHRpb247CisgICAgX191OCAgbG93c2VjdG9yOworICAgIF9fdTggIG56b25lczsKKyAgICBfX2xlMTYgem9uZV9zcGFyZTsKKyAgICBfX2xlMzIgcm9vdDsKKyAgICBfX2xlMzIgZGlzY19zaXplOworICAgIF9fbGUxNiBkaXNjX2lkOworICAgIF9fdTggIGRpc2NfbmFtZVsxMF07CisgICAgX19sZTMyIGRpc2NfdHlwZTsKKyAgICBfX2xlMzIgZGlzY19zaXplX2hpZ2g7CisgICAgX191OCAgbG9nMnNoYXJlc2l6ZTo0OworICAgIF9fdTggIHVudXNlZDQwOjQ7CisgICAgX191OCAgYmlnX2ZsYWc6MTsKKyAgICBfX3U4ICB1bnVzZWQ0MToxOworICAgIF9fdTggIG56b25lc19oaWdoOworICAgIF9fbGUzMiBmb3JtYXRfdmVyc2lvbjsKKyAgICBfX2xlMzIgcm9vdF9zaXplOworICAgIF9fdTggIHVudXNlZDUyWzYwIC0gNTJdOworfTsKKworI2RlZmluZSBBREZTX0RJU0NSRUNPUkQJCSgweGMwMCkKKyNkZWZpbmUgQURGU19EUl9PRkZTRVQJCSgweDFjMCkKKyNkZWZpbmUgQURGU19EUl9TSVpFCQkgNjAKKyNkZWZpbmUgQURGU19EUl9TSVpFX0JJVFMJKEFERlNfRFJfU0laRSA8PCAzKQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hZmZzX2hhcmRibG9ja3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWZmc19oYXJkYmxvY2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiOTQ4YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWZmc19oYXJkYmxvY2tzLmgKQEAgLTAsMCArMSw2OCBAQAorI2lmbmRlZglBRkZTX0hBUkRCTE9DS1NfSAorI2RlZmluZQlBRkZTX0hBUkRCTE9DS1NfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogSnVzdCB0aGUgbmVlZGVkIGRlZmluaXRpb25zIGZvciB0aGUgUkRCIG9mIGFuIEFtaWdhIEhELiAqLworCitzdHJ1Y3QgUmlnaWREaXNrQmxvY2sgeworCV9fdTMyCXJkYl9JRDsKKwlfX2JlMzIJcmRiX1N1bW1lZExvbmdzOworCV9fczMyCXJkYl9DaGtTdW07CisJX191MzIJcmRiX0hvc3RJRDsKKwlfX2JlMzIJcmRiX0Jsb2NrQnl0ZXM7CisJX191MzIJcmRiX0ZsYWdzOworCV9fdTMyCXJkYl9CYWRCbG9ja0xpc3Q7CisJX19iZTMyCXJkYl9QYXJ0aXRpb25MaXN0OworCV9fdTMyCXJkYl9GaWxlU3lzSGVhZGVyTGlzdDsKKwlfX3UzMglyZGJfRHJpdmVJbml0OworCV9fdTMyCXJkYl9SZXNlcnZlZDFbNl07CisJX191MzIJcmRiX0N5bGluZGVyczsKKwlfX3UzMglyZGJfU2VjdG9yczsKKwlfX3UzMglyZGJfSGVhZHM7CisJX191MzIJcmRiX0ludGVybGVhdmU7CisJX191MzIJcmRiX1Bhcms7CisJX191MzIJcmRiX1Jlc2VydmVkMlszXTsKKwlfX3UzMglyZGJfV3JpdGVQcmVDb21wOworCV9fdTMyCXJkYl9SZWR1Y2VkV3JpdGU7CisJX191MzIJcmRiX1N0ZXBSYXRlOworCV9fdTMyCXJkYl9SZXNlcnZlZDNbNV07CisJX191MzIJcmRiX1JEQkJsb2Nrc0xvOworCV9fdTMyCXJkYl9SREJCbG9ja3NIaTsKKwlfX3UzMglyZGJfTG9DeWxpbmRlcjsKKwlfX3UzMglyZGJfSGlDeWxpbmRlcjsKKwlfX3UzMglyZGJfQ3lsQmxvY2tzOworCV9fdTMyCXJkYl9BdXRvUGFya1NlY29uZHM7CisJX191MzIJcmRiX0hpZ2hSRFNLQmxvY2s7CisJX191MzIJcmRiX1Jlc2VydmVkNDsKKwljaGFyCXJkYl9EaXNrVmVuZG9yWzhdOworCWNoYXIJcmRiX0Rpc2tQcm9kdWN0WzE2XTsKKwljaGFyCXJkYl9EaXNrUmV2aXNpb25bNF07CisJY2hhcglyZGJfQ29udHJvbGxlclZlbmRvcls4XTsKKwljaGFyCXJkYl9Db250cm9sbGVyUHJvZHVjdFsxNl07CisJY2hhcglyZGJfQ29udHJvbGxlclJldmlzaW9uWzRdOworCV9fdTMyCXJkYl9SZXNlcnZlZDVbMTBdOworfTsKKworI2RlZmluZQlJRE5BTUVfUklHSURESVNLCTB4NTI0NDUzNEIJLyogIlJEU0siICovCisKK3N0cnVjdCBQYXJ0aXRpb25CbG9jayB7CisJX19iZTMyCXBiX0lEOworCV9fYmUzMglwYl9TdW1tZWRMb25nczsKKwlfX3MzMglwYl9DaGtTdW07CisJX191MzIJcGJfSG9zdElEOworCV9fYmUzMglwYl9OZXh0OworCV9fdTMyCXBiX0ZsYWdzOworCV9fdTMyCXBiX1Jlc2VydmVkMVsyXTsKKwlfX3UzMglwYl9EZXZGbGFnczsKKwlfX3U4CXBiX0RyaXZlTmFtZVszMl07CisJX191MzIJcGJfUmVzZXJ2ZWQyWzE1XTsKKwlfX2JlMzIJcGJfRW52aXJvbm1lbnRbMTddOworCV9fdTMyCXBiX0VSZXNlcnZlZFsxNV07Cit9OworCisjZGVmaW5lCUlETkFNRV9QQVJUSVRJT04JMHg1MDQxNTI1NAkvKiAiUEFSVCIgKi8KKworI2RlZmluZSBSREJfQUxMT0NBVElPTl9MSU1JVAkxNgorCisjZW5kaWYJLyogQUZGU19IQVJEQkxPQ0tTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWdwZ2FydC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hZ3BnYXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmOTVkZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWdwZ2FydC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQUdQR0FSVCBtb2R1bGUgdmVyc2lvbiAwLjk5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgSmVmZiBIYXJ0bWFubgorICogQ29weXJpZ2h0IChDKSAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgWGkgR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEpFRkYgSEFSVE1BTk4sIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIAorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIAorICogT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX0FHUF9ICisjZGVmaW5lIF9BR1BfSCAxCisKKyNkZWZpbmUgQUdQSU9DX0JBU0UgICAgICAgJ0EnCisjZGVmaW5lIEFHUElPQ19JTkZPICAgICAgIF9JT1IgKEFHUElPQ19CQVNFLCAwLCBzdHJ1Y3QgYWdwX2luZm8qKQorI2RlZmluZSBBR1BJT0NfQUNRVUlSRSAgICBfSU8gIChBR1BJT0NfQkFTRSwgMSkKKyNkZWZpbmUgQUdQSU9DX1JFTEVBU0UgICAgX0lPICAoQUdQSU9DX0JBU0UsIDIpCisjZGVmaW5lIEFHUElPQ19TRVRVUCAgICAgIF9JT1cgKEFHUElPQ19CQVNFLCAzLCBzdHJ1Y3QgYWdwX3NldHVwKikKKyNkZWZpbmUgQUdQSU9DX1JFU0VSVkUgICAgX0lPVyAoQUdQSU9DX0JBU0UsIDQsIHN0cnVjdCBhZ3BfcmVnaW9uKikKKyNkZWZpbmUgQUdQSU9DX1BST1RFQ1QgICAgX0lPVyAoQUdQSU9DX0JBU0UsIDUsIHN0cnVjdCBhZ3BfcmVnaW9uKikKKyNkZWZpbmUgQUdQSU9DX0FMTE9DQVRFICAgX0lPV1IoQUdQSU9DX0JBU0UsIDYsIHN0cnVjdCBhZ3BfYWxsb2NhdGUqKQorI2RlZmluZSBBR1BJT0NfREVBTExPQ0FURSBfSU9XIChBR1BJT0NfQkFTRSwgNywgaW50KQorI2RlZmluZSBBR1BJT0NfQklORCAgICAgICBfSU9XIChBR1BJT0NfQkFTRSwgOCwgc3RydWN0IGFncF9iaW5kKikKKyNkZWZpbmUgQUdQSU9DX1VOQklORCAgICAgX0lPVyAoQUdQSU9DX0JBU0UsIDksIHN0cnVjdCBhZ3BfdW5iaW5kKikKKyNkZWZpbmUgQUdQSU9DX0NISVBTRVRfRkxVU0ggX0lPIChBR1BJT0NfQkFTRSwgMTApCisKKyNkZWZpbmUgQUdQX0RFVklDRSAgICAgICIvZGV2L2FncGdhcnQiCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGFncF92ZXJzaW9uIHsKKwlfX3UxNiBtYWpvcjsKKwlfX3UxNiBtaW5vcjsKK307CisKK3R5cGVkZWYgc3RydWN0IF9hZ3BfaW5mbyB7CisJc3RydWN0IGFncF92ZXJzaW9uIHZlcnNpb247CS8qIHZlcnNpb24gb2YgdGhlIGRyaXZlciAgICAgICAgKi8KKwlfX3UzMiBicmlkZ2VfaWQ7CS8qIGJyaWRnZSB2ZW5kb3IvZGV2aWNlICAgICAgICAgKi8KKwlfX3UzMiBhZ3BfbW9kZTsJCS8qIG1vZGUgaW5mbyBvZiBicmlkZ2UgICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIGFwZXJfYmFzZTsvKiBiYXNlIG9mIGFwZXJ0dXJlICAgICAgICAgICAgICovCisJc2l6ZV90IGFwZXJfc2l6ZTsJLyogc2l6ZSBvZiBhcGVydHVyZSAgICAgICAgICAgICAqLworCXNpemVfdCBwZ190b3RhbDsJLyogbWF4IHBhZ2VzIChzd2FwICsgc3lzdGVtKSAgICAqLworCXNpemVfdCBwZ19zeXN0ZW07CS8qIG1heCBwYWdlcyAoc3lzdGVtKSAgICAgICAgICAgKi8KKwlzaXplX3QgcGdfdXNlZDsJCS8qIGN1cnJlbnQgcGFnZXMgdXNlZCAgICAgICAgICAgKi8KK30gYWdwX2luZm87CisKK3R5cGVkZWYgc3RydWN0IF9hZ3Bfc2V0dXAgeworCV9fdTMyIGFncF9tb2RlOwkJLyogbW9kZSBpbmZvIG9mIGJyaWRnZSAgICAgICAgICAqLworfSBhZ3Bfc2V0dXA7CisKKy8qCisgKiBUaGUgInByb3QiIGRvd24gYmVsb3cgbmVlZHMgc3RpbGwgYSAic2xlZXAiIGZsYWcgc29tZWhvdyAuLi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2FncF9zZWdtZW50IHsKKwlfX2tlcm5lbF9vZmZfdCBwZ19zdGFydDsJLyogc3RhcnRpbmcgcGFnZSB0byBwb3B1bGF0ZSAgICAqLworCV9fa2VybmVsX3NpemVfdCBwZ19jb3VudDsJLyogbnVtYmVyIG9mIHBhZ2VzICAgICAgICAgICAgICAqLworCWludCBwcm90OwkJCS8qIHByb3QgZmxhZ3MgZm9yIG1tYXAgICAgICAgICAgKi8KK30gYWdwX3NlZ21lbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9hZ3BfcmVnaW9uIHsKKwlfX2tlcm5lbF9waWRfdCBwaWQ7CQkvKiBwaWQgb2YgcHJvY2VzcyAgICAgICAqLworCV9fa2VybmVsX3NpemVfdCBzZWdfY291bnQ7CS8qIG51bWJlciBvZiBzZWdtZW50cyAgICovCisJc3RydWN0IF9hZ3Bfc2VnbWVudCAqc2VnX2xpc3Q7Cit9IGFncF9yZWdpb247CisKK3R5cGVkZWYgc3RydWN0IF9hZ3BfYWxsb2NhdGUgeworCWludCBrZXk7CQkvKiB0YWcgb2YgYWxsb2NhdGlvbiAgICAgICAgICAgICovCisJX19rZXJuZWxfc2l6ZV90IHBnX2NvdW50Oy8qIG51bWJlciBvZiBwYWdlcyAgICAgICAgICAgICAqLworCV9fdTMyIHR5cGU7CQkvKiAwID09IG5vcm1hbCwgb3RoZXIgZGV2c3BlYyAgICovCisgICAJX191MzIgcGh5c2ljYWw7ICAgICAgICAgLyogZGV2aWNlIHNwZWNpZmljIChzb21lIGRldmljZXMgIAorCQkJCSAqIG5lZWQgYSBwaHlzIGFkZHJlc3Mgb2YgdGhlICAgICAKKwkJCQkgKiBhY3R1YWwgcGFnZSBiZWhpbmQgdGhlIGdhdHQgICAgCisJCQkJICogdGFibGUpICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gYWdwX2FsbG9jYXRlOworCit0eXBlZGVmIHN0cnVjdCBfYWdwX2JpbmQgeworCWludCBrZXk7CQkvKiB0YWcgb2YgYWxsb2NhdGlvbiAgICAgICAgICAgICovCisJX19rZXJuZWxfb2ZmX3QgcGdfc3RhcnQ7Lyogc3RhcnRpbmcgcGFnZSB0byBwb3B1bGF0ZSAgICAqLworfSBhZ3BfYmluZDsKKwordHlwZWRlZiBzdHJ1Y3QgX2FncF91bmJpbmQgeworCWludCBrZXk7CQkvKiB0YWcgb2YgYWxsb2NhdGlvbiAgICAgICAgICAgICovCisJX191MzIgcHJpb3JpdHk7CQkvKiBwcmlvcml0eSBmb3IgcGFnaW5nIG91dCAgICAgICovCit9IGFncF91bmJpbmQ7CisKKworI2VuZGlmCQkJCS8qIF9BR1BfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9haW9fYWJpLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Fpb19hYmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg3MzE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9haW9fYWJpLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qIGluY2x1ZGUvbGludXgvYWlvX2FiaS5oCisgKgorICogQ29weXJpZ2h0IDIwMDAsMjAwMSwyMDAyIFJlZCBIYXQuCisgKgorICogV3JpdHRlbiBieSBCZW5qYW1pbiBMYUhhaXNlIDxiY3JsQGt2YWNrLm9yZz4KKyAqCisgKiBEaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMdjIgKHNlZSAuLi8uLi9DT1BZSU5HKSBvciB1bmRlciAKKyAqIHRoZSBmb2xsb3dpbmcgdGVybXMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSwgZXhwcmVzcyBvciBpbXBsaWVkLiAgUmVkIEhhdCBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQKKyAqIHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBSRUQgSEFUIEJFIExJQUJMRSBUTyBBTlkgUEFSVFkgRk9SIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sIEVWRU4gSUYgUkVEIEhBVCBIQVMgQkVFTiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogUkVEIEhBVCBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMgT04gQU4gIkFTIElTIiBCQVNJUywgQU5ECisgKiBSRUQgSEFUIEhBUyBOTyBPQkxJR0FUSU9OIFRPIFBST1ZJREUgTUFJTlRFTkFOQ0UsIFNVUFBPUlQsIFVQREFURVMsCisgKiBFTkhBTkNFTUVOVFMsIE9SIE1PRElGSUNBVElPTlMuCisgKi8KKyNpZm5kZWYgX19MSU5VWF9fQUlPX0FCSV9ICisjZGVmaW5lIF9fTElOVVhfX0FJT19BQklfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlhaW9fY29udGV4dF90OworCitlbnVtIHsKKwlJT0NCX0NNRF9QUkVBRCA9IDAsCisJSU9DQl9DTURfUFdSSVRFID0gMSwKKwlJT0NCX0NNRF9GU1lOQyA9IDIsCisJSU9DQl9DTURfRkRTWU5DID0gMywKKwkvKiBUaGVzZSB0d28gYXJlIGV4cGVyaW1lbnRhbC4KKwkgKiBJT0NCX0NNRF9QUkVBRFggPSA0LAorCSAqIElPQ0JfQ01EX1BPTEwgPSA1LAorCSAqLworCUlPQ0JfQ01EX05PT1AgPSA2LAorCUlPQ0JfQ01EX1BSRUFEViA9IDcsCisJSU9DQl9DTURfUFdSSVRFViA9IDgsCit9OworCisvKgorICogVmFsaWQgZmxhZ3MgZm9yIHRoZSAiYWlvX2ZsYWdzIiBtZW1iZXIgb2YgdGhlICJzdHJ1Y3QgaW9jYiIuCisgKgorICogSU9DQl9GTEFHX1JFU0ZEIC0gU2V0IGlmIHRoZSAiYWlvX3Jlc2ZkIiBtZW1iZXIgb2YgdGhlICJzdHJ1Y3QgaW9jYiIKKyAqICAgICAgICAgICAgICAgICAgIGlzIHZhbGlkLgorICovCisjZGVmaW5lIElPQ0JfRkxBR19SRVNGRAkJKDEgPDwgMCkKKworLyogcmVhZCgpIGZyb20gL2Rldi9haW8gcmV0dXJucyB0aGVzZSBzdHJ1Y3R1cmVzLiAqLworc3RydWN0IGlvX2V2ZW50IHsKKwlfX3U2NAkJZGF0YTsJCS8qIHRoZSBkYXRhIGZpZWxkIGZyb20gdGhlIGlvY2IgKi8KKwlfX3U2NAkJb2JqOwkJLyogd2hhdCBpb2NiIHRoaXMgZXZlbnQgY2FtZSBmcm9tICovCisJX19zNjQJCXJlczsJCS8qIHJlc3VsdCBjb2RlIGZvciB0aGlzIGV2ZW50ICovCisJX19zNjQJCXJlczI7CQkvKiBzZWNvbmRhcnkgcmVzdWx0ICovCit9OworCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisjZGVmaW5lIFBBRERFRCh4LHkpCXgsIHkKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorI2RlZmluZSBQQURERUQoeCx5KQl5LCB4CisjZWxzZQorI2Vycm9yIGVkaXQgZm9yIHlvdXIgb2RkIGJ5dGVvcmRlci4KKyNlbmRpZgorCisvKgorICogd2UgYWx3YXlzIHVzZSBhIDY0Yml0IG9mZl90IHdoZW4gY29tbXVuaWNhdGluZworICogd2l0aCB1c2VybGFuZC4gIGl0cyB1cCB0byBsaWJyYXJpZXMgdG8gZG8gdGhlCisgKiBwcm9wZXIgcGFkZGluZyBhbmQgYWlvX2Vycm9yIGFic3RyYWN0aW9uCisgKi8KKworc3RydWN0IGlvY2IgeworCS8qIHRoZXNlIGFyZSBpbnRlcm5hbCB0byB0aGUga2VybmVsL2xpYmMuICovCisJX191NjQJYWlvX2RhdGE7CS8qIGRhdGEgdG8gYmUgcmV0dXJuZWQgaW4gZXZlbnQncyBkYXRhICovCisJX191MzIJUEFEREVEKGFpb19rZXksIGFpb19yZXNlcnZlZDEpOworCQkJCS8qIHRoZSBrZXJuZWwgc2V0cyBhaW9fa2V5IHRvIHRoZSByZXEgIyAqLworCisJLyogY29tbW9uIGZpZWxkcyAqLworCV9fdTE2CWFpb19saW9fb3Bjb2RlOwkvKiBzZWUgSU9DQl9DTURfIGFib3ZlICovCisJX19zMTYJYWlvX3JlcXByaW87CisJX191MzIJYWlvX2ZpbGRlczsKKworCV9fdTY0CWFpb19idWY7CisJX191NjQJYWlvX25ieXRlczsKKwlfX3M2NAlhaW9fb2Zmc2V0OworCisJLyogZXh0cmEgcGFyYW1ldGVycyAqLworCV9fdTY0CWFpb19yZXNlcnZlZDI7CS8qIFRPRE86IHVzZSB0aGlzIGZvciBhIChzdHJ1Y3Qgc2lnZXZlbnQgKikgKi8KKworCS8qIGZsYWdzIGZvciB0aGUgInN0cnVjdCBpb2NiIiAqLworCV9fdTMyCWFpb19mbGFnczsKKworCS8qCisJICogaWYgdGhlIElPQ0JfRkxBR19SRVNGRCBmbGFnIG9mICJhaW9fZmxhZ3MiIGlzIHNldCwgdGhpcyBpcyBhbgorCSAqIGV2ZW50ZmQgdG8gc2lnbmFsIEFJTyByZWFkaW5lc3MgdG8KKwkgKi8KKwlfX3UzMglhaW9fcmVzZmQ7Cit9OyAvKiA2NCBieXRlcyAqLworCisjdW5kZWYgSUZCSUcKKyN1bmRlZiBJRkxJVFRMRQorCisjZW5kaWYgLyogX19MSU5VWF9fQUlPX0FCSV9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXBtX2Jpb3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXBtX2Jpb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWUxOWEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hcG1fYmlvcy5oCkBAIC0wLDAgKzEsMTM1IEBACisjaWZuZGVmIF9MSU5VWF9BUE1fSAorI2RlZmluZSBfTElOVVhfQVBNX0gKKworLyoKKyAqIEluY2x1ZGUgZmlsZSBmb3IgdGhlIGludGVyZmFjZSB0byBhbiBBUE0gQklPUworICogQ29weXJpZ2h0IDE5OTQtMjAwMSBTdGVwaGVuIFJvdGh3ZWxsIChzZnJAY2FuYi5hdXVnLm9yZy5hdSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJYXBtX2V2ZW50X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CWFwbV9ldmVudGluZm9fdDsKKworc3RydWN0IGFwbV9iaW9zX2luZm8geworCV9fdTE2CXZlcnNpb247CisJX191MTYJY3NlZzsKKwlfX3UzMglvZmZzZXQ7CisJX191MTYJY3NlZ18xNjsKKwlfX3UxNglkc2VnOworCV9fdTE2CWZsYWdzOworCV9fdTE2CWNzZWdfbGVuOworCV9fdTE2CWNzZWdfMTZfbGVuOworCV9fdTE2CWRzZWdfbGVuOworfTsKKworCisvKgorICogUG93ZXIgc3RhdGVzCisgKi8KKyNkZWZpbmUgQVBNX1NUQVRFX1JFQURZCQkweDAwMDAKKyNkZWZpbmUgQVBNX1NUQVRFX1NUQU5EQlkJMHgwMDAxCisjZGVmaW5lIEFQTV9TVEFURV9TVVNQRU5ECTB4MDAwMgorI2RlZmluZSBBUE1fU1RBVEVfT0ZGCQkweDAwMDMKKyNkZWZpbmUgQVBNX1NUQVRFX0JVU1kJCTB4MDAwNAorI2RlZmluZSBBUE1fU1RBVEVfUkVKRUNUCTB4MDAwNQorI2RlZmluZSBBUE1fU1RBVEVfT0VNX1NZUwkweDAwMjAKKyNkZWZpbmUgQVBNX1NUQVRFX09FTV9ERVYJMHgwMDQwCisKKyNkZWZpbmUgQVBNX1NUQVRFX0RJU0FCTEUJMHgwMDAwCisjZGVmaW5lIEFQTV9TVEFURV9FTkFCTEUJMHgwMDAxCisKKyNkZWZpbmUgQVBNX1NUQVRFX0RJU0VOR0FHRQkweDAwMDAKKyNkZWZpbmUgQVBNX1NUQVRFX0VOR0FHRQkweDAwMDEKKworLyoKKyAqIEV2ZW50cyAocmVzdWx0cyBvZiBHZXQgUE0gRXZlbnQpCisgKi8KKyNkZWZpbmUgQVBNX1NZU19TVEFOREJZCQkweDAwMDEKKyNkZWZpbmUgQVBNX1NZU19TVVNQRU5ECQkweDAwMDIKKyNkZWZpbmUgQVBNX05PUk1BTF9SRVNVTUUJMHgwMDAzCisjZGVmaW5lIEFQTV9DUklUSUNBTF9SRVNVTUUJMHgwMDA0CisjZGVmaW5lIEFQTV9MT1dfQkFUVEVSWQkJMHgwMDA1CisjZGVmaW5lIEFQTV9QT1dFUl9TVEFUVVNfQ0hBTkdFCTB4MDAwNgorI2RlZmluZSBBUE1fVVBEQVRFX1RJTUUJCTB4MDAwNworI2RlZmluZSBBUE1fQ1JJVElDQUxfU1VTUEVORAkweDAwMDgKKyNkZWZpbmUgQVBNX1VTRVJfU1RBTkRCWQkweDAwMDkKKyNkZWZpbmUgQVBNX1VTRVJfU1VTUEVORAkweDAwMGEKKyNkZWZpbmUgQVBNX1NUQU5EQllfUkVTVU1FCTB4MDAwYgorI2RlZmluZSBBUE1fQ0FQQUJJTElUWV9DSEFOR0UJMHgwMDBjCisKKy8qCisgKiBFcnJvciBjb2RlcworICovCisjZGVmaW5lIEFQTV9TVUNDRVNTCQkweDAwCisjZGVmaW5lIEFQTV9ESVNBQkxFRAkJMHgwMQorI2RlZmluZSBBUE1fQ09OTkVDVEVECQkweDAyCisjZGVmaW5lIEFQTV9OT1RfQ09OTkVDVEVECTB4MDMKKyNkZWZpbmUgQVBNXzE2X0NPTk5FQ1RFRAkweDA1CisjZGVmaW5lIEFQTV8xNl9VTlNVUFBPUlRFRAkweDA2CisjZGVmaW5lIEFQTV8zMl9DT05ORUNURUQJMHgwNworI2RlZmluZSBBUE1fMzJfVU5TVVBQT1JURUQJMHgwOAorI2RlZmluZSBBUE1fQkFEX0RFVklDRQkJMHgwOQorI2RlZmluZSBBUE1fQkFEX1BBUkFNCQkweDBhCisjZGVmaW5lIEFQTV9OT1RfRU5HQUdFRAkJMHgwYgorI2RlZmluZSBBUE1fQkFEX0ZVTkNUSU9OCTB4MGMKKyNkZWZpbmUgQVBNX1JFU1VNRV9ESVNBQkxFRAkweDBkCisjZGVmaW5lIEFQTV9OT19FUlJPUgkJMHg1MworI2RlZmluZSBBUE1fQkFEX1NUQVRFCQkweDYwCisjZGVmaW5lIEFQTV9OT19FVkVOVFMJCTB4ODAKKyNkZWZpbmUgQVBNX05PVF9QUkVTRU5UCQkweDg2CisKKy8qCisgKiBBUE0gRGV2aWNlIElEcworICovCisjZGVmaW5lIEFQTV9ERVZJQ0VfQklPUwkJMHgwMDAwCisjZGVmaW5lIEFQTV9ERVZJQ0VfQUxMCQkweDAwMDEKKyNkZWZpbmUgQVBNX0RFVklDRV9ESVNQTEFZCTB4MDEwMAorI2RlZmluZSBBUE1fREVWSUNFX1NUT1JBR0UJMHgwMjAwCisjZGVmaW5lIEFQTV9ERVZJQ0VfUEFSQUxMRUwJMHgwMzAwCisjZGVmaW5lIEFQTV9ERVZJQ0VfU0VSSUFMCTB4MDQwMAorI2RlZmluZSBBUE1fREVWSUNFX05FVFdPUksJMHgwNTAwCisjZGVmaW5lIEFQTV9ERVZJQ0VfUENNQ0lBCTB4MDYwMAorI2RlZmluZSBBUE1fREVWSUNFX0JBVFRFUlkJMHg4MDAwCisjZGVmaW5lIEFQTV9ERVZJQ0VfT0VNCQkweGUwMDAKKyNkZWZpbmUgQVBNX0RFVklDRV9PTERfQUxMCTB4ZmZmZgorI2RlZmluZSBBUE1fREVWSUNFX0NMQVNTCTB4MDBmZgorI2RlZmluZSBBUE1fREVWSUNFX01BU0sJCTB4ZmYwMAorCisKKy8qCisgKiBCYXR0ZXJ5IHN0YXR1cworICovCisjZGVmaW5lIEFQTV9NQVhfQkFUVEVSSUVTCTIKKworLyoKKyAqIEFQTSBkZWZpbmVkIGNhcGFiaWxpdHkgYml0IGZsYWdzCisgKi8KKyNkZWZpbmUgQVBNX0NBUF9HTE9CQUxfU1RBTkRCWQkJMHgwMDAxCisjZGVmaW5lIEFQTV9DQVBfR0xPQkFMX1NVU1BFTkQJCTB4MDAwMgorI2RlZmluZSBBUE1fQ0FQX1JFU1VNRV9TVEFOREJZX1RJTUVSCTB4MDAwNCAvKiBUaW1lciByZXN1bWUgZnJvbSBzdGFuZGJ5ICovCisjZGVmaW5lIEFQTV9DQVBfUkVTVU1FX1NVU1BFTkRfVElNRVIJMHgwMDA4IC8qIFRpbWVyIHJlc3VtZSBmcm9tIHN1c3BlbmQgKi8KKyNkZWZpbmUgQVBNX0NBUF9SRVNVTUVfU1RBTkRCWV9SSU5HCTB4MDAxMCAvKiBSZXN1bWUgb24gUmluZyBmciBzdGFuZGJ5ICovCisjZGVmaW5lIEFQTV9DQVBfUkVTVU1FX1NVU1BFTkRfUklORwkweDAwMjAgLyogUmVzdW1lIG9uIFJpbmcgZnIgc3VzcGVuZCAqLworI2RlZmluZSBBUE1fQ0FQX1JFU1VNRV9TVEFOREJZX1BDTUNJQQkweDAwNDAgLyogUmVzdW1lIG9uIFBDTUNJQSBSaW5nCSovCisjZGVmaW5lIEFQTV9DQVBfUkVTVU1FX1NVU1BFTkRfUENNQ0lBCTB4MDA4MCAvKiBSZXN1bWUgb24gUENNQ0lBIFJpbmcJKi8KKworLyoKKyAqIGlvY3RsIG9wZXJhdGlvbnMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUgQVBNX0lPQ19TVEFOREJZCQlfSU8oJ0EnLCAxKQorI2RlZmluZSBBUE1fSU9DX1NVU1BFTkQJCV9JTygnQScsIDIpCisKKyNlbmRpZgkvKiBMSU5VWF9BUE1fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hcmNmYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hcmNmYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMWU3NjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FyY2ZiLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9fTElOVVhfQVJDRkJfSF9fCisjZGVmaW5lIF9fTElOVVhfQVJDRkJfSF9fCisKKyNkZWZpbmUgRkJJT19XQUlURVZFTlQJCV9JTygnRicsIDB4ODgpCisjZGVmaW5lIEZCSU9fR0VUQ09OVFJPTDIJX0lPUignRicsIDB4ODksIHNpemVfdCkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRhbGsuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRhbGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTVlZWZlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdGFsay5oCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgX19MSU5VWF9BVEFMS19IX18KKyNkZWZpbmUgX19MSU5VWF9BVEFMS19IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCisvKgorICogQXBwbGVUYWxrIG5ldHdvcmtpbmcgc3RydWN0dXJlcworICoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIGRpcmVjdGx5IHJlZmVyZW5jZWQgZnJvbSB0aGUgVW5pdmVyc2l0eSBPZiBNaWNoaWdhbgorICogbmV0YXRhbGsgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4KKyAqLworI2RlZmluZSBBVFBPUlRfRklSU1QJMQorI2RlZmluZSBBVFBPUlRfUkVTRVJWRUQJMTI4CisjZGVmaW5lIEFUUE9SVF9MQVNUCTI1NAkJLyogMjU0IGlzIG9ubHkgbGVnYWwgb24gbG9jYWx0YWxrICovIAorI2RlZmluZSBBVEFERFJfQU5ZTkVUCShfX3UxNikwCisjZGVmaW5lIEFUQUREUl9BTllOT0RFCShfX3U4KTAKKyNkZWZpbmUgQVRBRERSX0FOWVBPUlQgIChfX3U4KTAKKyNkZWZpbmUgQVRBRERSX0JDQVNUCShfX3U4KTI1NQorI2RlZmluZSBERFBfTUFYU1oJNTg3CisjZGVmaW5lIEREUF9NQVhIT1BTICAgICAxNQkJLyogNCBiaXRzIG9mIGhvcCBjb3VudGVyICovCisKKyNkZWZpbmUgU0lPQ0FUQUxLRElGQUREUiAgICAgICAoU0lPQ1BST1RPUFJJVkFURSArIDApCisKK3N0cnVjdCBhdGFsa19hZGRyIHsKKwlfX2JlMTYJc19uZXQ7CisJX191OAlzX25vZGU7Cit9OworCitzdHJ1Y3Qgc29ja2FkZHJfYXQgeworCV9fa2VybmVsX3NhX2ZhbWlseV90IHNhdF9mYW1pbHk7CisJX191OAkJICBzYXRfcG9ydDsKKwlzdHJ1Y3QgYXRhbGtfYWRkciBzYXRfYWRkcjsKKwljaGFyCQkgIHNhdF96ZXJvWzhdOworfTsKKworc3RydWN0IGF0YWxrX25ldHJhbmdlIHsKKwlfX3U4CW5yX3BoYXNlOworCV9fYmUxNglucl9maXJzdG5ldDsKKwlfX2JlMTYJbnJfbGFzdG5ldDsKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX0FUQUxLX0hfXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxYzM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtLmgKQEAgLTAsMCArMSwyNDEgQEAKKy8qIGF0bS5oIC0gZ2VuZXJhbCBBVE0gZGVjbGFyYXRpb25zICovCisgCisvKiBXcml0dGVuIDE5OTUtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworIAorCisvKgorICogV0FSTklORzogVXNlci1zcGFjZSBwcm9ncmFtcyBzaG91bGQgbm90ICNpbmNsdWRlIDxsaW51eC9hdG0uaD4gZGlyZWN0bHkuCisgKiAgICAgICAgICBJbnN0ZWFkLCAjaW5jbHVkZSA8YXRtLmg+CisgKi8KKworI2lmbmRlZiBfTElOVVhfQVRNX0gKKyNkZWZpbmUgX0xJTlVYX0FUTV9ICisKKy8qCisgKiBCRUdJTl94eCBhbmQgRU5EX3h4IG1hcmtlcnMgYXJlIHVzZWQgZm9yIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mCisgKiBkb2N1bWVudGF0aW9uLiBEbyBub3QgY2hhbmdlIHRoZW0uCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvYXRtYXBpLmg+CisjaW5jbHVkZSA8bGludXgvYXRtc2FwLmg+CisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisvKiBnZW5lcmFsIEFUTSBjb25zdGFudHMgKi8KKyNkZWZpbmUgQVRNX0NFTExfU0laRQkJICAgIDUzCS8qIEFUTSBjZWxsIHNpemUgaW5jbC4gaGVhZGVyICovCisjZGVmaW5lIEFUTV9DRUxMX1BBWUxPQUQJICAgIDQ4CS8qIEFUTSBwYXlsb2FkIHNpemUgKi8KKyNkZWZpbmUgQVRNX0FBTDBfU0RVCQkgICAgNTIJLyogQUFMMCBTRFUgc2l6ZSAqLworI2RlZmluZSBBVE1fTUFYX0FBTDM0X1BEVQkgNjU1MzUJLyogbWF4aW11bSBBQUwzLzQgUERVIHBheWxvYWQgKi8KKyNkZWZpbmUgQVRNX0FBTDVfVFJBSUxFUgkgICAgIDgJLyogQUFMNSB0cmFpbGVyIHNpemUgKi8KKyNkZWZpbmUgQVRNX01BWF9BQUw1X1BEVQkgNjU1MzUJLyogbWF4aW11bSBBQUw1IFBEVSBwYXlsb2FkICovCisjZGVmaW5lIEFUTV9NQVhfQ0RWCQkgIDk5OTkJLyogbWF4aW11bSAoZGVmYXVsdCkgQ0RWICovCisjZGVmaW5lIEFUTV9OT1RfUlNWX1ZDSQkJICAgIDMyCS8qIGZpcnN0IG5vbi1yZXNlcnZlZCBWQ0kgdmFsdWUgKi8KKworI2RlZmluZSBBVE1fTUFYX1ZQSQkJICAgMjU1CS8qIG1heGltdW0gVlBJIGF0IHRoZSBVTkkgKi8KKyNkZWZpbmUgQVRNX01BWF9WUElfTk5JCQkgIDQwOTYJLyogbWF4aW11bSBWUEkgYXQgdGhlIE5OSSAqLworI2RlZmluZSBBVE1fTUFYX1ZDSQkJIDY1NTM1CS8qIG1heGltdW0gVkNJICovCisKKworLyogInByb3Rjb2wiIHZhbHVlcyBmb3IgdGhlIHNvY2tldCBzeXN0ZW0gY2FsbCAqLworI2RlZmluZSBBVE1fTk9fQUFMCTAJCS8qIEFBTCBub3Qgc3BlY2lmaWVkICovCisjZGVmaW5lIEFUTV9BQUwwCTEzCQkvKiAicmF3IiBBVE0gY2VsbHMgKi8KKyNkZWZpbmUgQVRNX0FBTDEJMQkJLyogQUFMMSAoQ0JSKSAqLworI2RlZmluZSBBVE1fQUFMMgkyCQkvKiBBQUwyIChWQlIpICovCisjZGVmaW5lIEFUTV9BQUwzNAkzCQkvKiBBQUwzLzQgKGRhdGEpICovCisjZGVmaW5lIEFUTV9BQUw1CTUJCS8qIEFBTDUgKGRhdGEpICovCisKKy8qCisgKiBzb2NrZXQgb3B0aW9uIG5hbWUgY29kaW5nIGZ1bmN0aW9ucworICoKKyAqIE5vdGUgdGhhdCBfX1NPX0VOQ09ERSBhbmQgX19TT19MRVZFTCBhcmUgc29tZXdoYXQgYSBoYWNrIHNpbmNlIHRoZQorICogPDwgMjIgb25seSByZXNlcnZlcyA5IGJpdHMgZm9yIHRoZSBsZXZlbC4gIE9uIHNvbWUgYXJjaGl0ZWN0dXJlcworICogU09MX1NPQ0tFVCBpcyAweEZGRkYsIHNvIHRoYXQncyBhIGJpdCBvZiBhIHByb2JsZW0KKyAqLworCisjZGVmaW5lIF9fU09fRU5DT0RFKGwsbix0KQkoKCgobCkgJiAweDFGRikgPDwgMjIpIHwgKChuKSA8PCAxNikgfCBcCisJCQkJc2l6ZW9mKHQpKQorI2RlZmluZSBfX1NPX0xFVkVMX01BVENIKGMsbSkJKCgoYykgPj4gMjIpID09ICgobSkgJiAweDFGRikpCisjZGVmaW5lIF9fU09fTlVNQkVSKGMpCQkoKChjKSA+PiAxNikgJiAweDNmKQorI2RlZmluZSBfX1NPX1NJWkUoYykJCSgoYykgJiAweDNmZmYpCisKKy8qCisgKiBBVE0gbGF5ZXIKKyAqLworCisjZGVmaW5lIFNPX1NFVENMUAlfX1NPX0VOQ09ERShTT0xfQVRNLDAsaW50KQorCQkJICAgIC8qIHNldCBDTFAgYml0IHZhbHVlIC0gVE9ETyAqLworI2RlZmluZSBTT19DSVJBTkdFCV9fU09fRU5DT0RFKFNPTF9BVE0sMSxzdHJ1Y3QgYXRtX2NpcmFuZ2UpCisJCQkgICAgLyogY29ubmVjdGlvbiBpZGVudGlmaWVyIHJhbmdlOyBzb2NrZXQgbXVzdCBiZQorCQkJICAgICAgIGJvdW5kIG9yIGNvbm5lY3RlZCAqLworI2RlZmluZSBTT19BVE1RT1MJX19TT19FTkNPREUoU09MX0FUTSwyLHN0cnVjdCBhdG1fcW9zKQorCQkJICAgIC8qIFF1YWxpdHkgb2YgU2VydmljZSBzZXR0aW5nICovCisjZGVmaW5lIFNPX0FUTVNBUAlfX1NPX0VOQ09ERShTT0xfQVRNLDMsc3RydWN0IGF0bV9zYXApCisJCQkgICAgLyogU2VydmljZSBBY2Nlc3MgUG9pbnQgKi8KKyNkZWZpbmUgU09fQVRNUFZDCV9fU09fRU5DT0RFKFNPTF9BVE0sNCxzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjKQorCQkJICAgIC8qICJQVkMiIGFkZHJlc3MgKGFsc28gZm9yIFNWQ3MpOyBnZXQgb25seSAqLworI2RlZmluZSBTT19NVUxUSVBPSU5UCV9fU09fRU5DT0RFKFNPTF9BVE0sIDUsIGludCkKKwkJCSAgICAvKiBtYWtlIHRoaXMgdmMgYSBwMm1wICovCisKKworLyoKKyAqIE5vdGUgQEBAOiBzaW5jZSB0aGUgc29ja2V0IGxheWVycyBkb24ndCByZWFsbHkgZGlzdGluZ3Vpc2ggdGhlIGNvbnRyb2wgYW5kCisgKiB0aGUgZGF0YSBwbGFuZSBidXQgZ2VuZXJhbGx5IHNlZW1zIHRvIGJlIGRhdGEgcGxhbmUtY2VudHJpYywgYW55IGxheWVyIGlzCisgKiBhYm91dCBlcXVhbGx5IHdyb25nIGZvciB0aGUgU0FQLiBJZiB5b3UgaGF2ZSBhIGJldHRlciBpZGVhIGFib3V0IHRoaXMsCisgKiBwbGVhc2Ugc3BlYWsgdXAgLi4uCisgKi8KKworCisvKiBBVE0gY2VsbCBoZWFkZXIgKGZvciBBQUwwKSAqLworCisvKiBCRUdJTl9DSCAqLworI2RlZmluZSBBVE1fSERSX0dGQ19NQVNLCTB4ZjAwMDAwMDAKKyNkZWZpbmUgQVRNX0hEUl9HRkNfU0hJRlQJMjgKKyNkZWZpbmUgQVRNX0hEUl9WUElfTUFTSwkweDBmZjAwMDAwCisjZGVmaW5lIEFUTV9IRFJfVlBJX1NISUZUCTIwCisjZGVmaW5lIEFUTV9IRFJfVkNJX01BU0sJMHgwMDBmZmZmMAorI2RlZmluZSBBVE1fSERSX1ZDSV9TSElGVAk0CisjZGVmaW5lIEFUTV9IRFJfUFRJX01BU0sJMHgwMDAwMDAwZQorI2RlZmluZSBBVE1fSERSX1BUSV9TSElGVAkxCisjZGVmaW5lIEFUTV9IRFJfQ0xQCQkweDAwMDAwMDAxCisvKiBFTkRfQ0ggKi8KKworCisvKiBQVEkgY29kaW5ncyAqLworCisvKiBCRUdJTl9QVEkgKi8KKyNkZWZpbmUgQVRNX1BUSV9VUzAJMCAgLyogdXNlciBkYXRhIGNlbGwsIGNvbmdlc3Rpb24gbm90IGV4cCwgU0RVLXR5cGUgMCAqLworI2RlZmluZSBBVE1fUFRJX1VTMQkxICAvKiB1c2VyIGRhdGEgY2VsbCwgY29uZ2VzdGlvbiBub3QgZXhwLCBTRFUtdHlwZSAxICovCisjZGVmaW5lIEFUTV9QVElfVUNFUzAJMiAgLyogdXNlciBkYXRhIGNlbGwsIGNvbmcuIGV4cGVyaWVuY2VkLCBTRFUtdHlwZSAwICovCisjZGVmaW5lIEFUTV9QVElfVUNFUzEJMyAgLyogdXNlciBkYXRhIGNlbGwsIGNvbmcuIGV4cGVyaWVuY2VkLCBTRFUtdHlwZSAxICovCisjZGVmaW5lIEFUTV9QVElfU0VHRjUJNCAgLyogc2VnbWVudCBPQU0gRjUgZmxvdyByZWxhdGVkIGNlbGwgKi8KKyNkZWZpbmUgQVRNX1BUSV9FMkVGNQk1ICAvKiBlbmQtdG8tZW5kIE9BTSBGNSBmbG93IHJlbGF0ZWQgY2VsbCAqLworI2RlZmluZSBBVE1fUFRJX1JTVl9STQk2ICAvKiByZXNlcnZlZCBmb3IgdHJhZmZpYyBjb250cm9sL3Jlc291cmNlIG1nbXQgKi8KKyNkZWZpbmUgQVRNX1BUSV9SU1YJNyAgLyogcmVzZXJ2ZWQgKi8KKy8qIEVORF9QVEkgKi8KKworCisvKgorICogVGhlIGZvbGxvd2luZyBpdGVtcyBzaG91bGQgc3RheSBpbiBsaW51eC9hdG0uaCwgd2hpY2ggc2hvdWxkIGJlIGxpbmtlZCB0bworICogbmV0YXRtL2F0bS5oCisgKi8KKworLyogVHJhZmZpYyBkZXNjcmlwdGlvbiAqLworCisjZGVmaW5lIEFUTV9OT05FCTAJCS8qIG5vIHRyYWZmaWMgKi8KKyNkZWZpbmUgQVRNX1VCUgkJMQorI2RlZmluZSBBVE1fQ0JSCQkyCisjZGVmaW5lIEFUTV9WQlIJCTMKKyNkZWZpbmUgQVRNX0FCUgkJNAorI2RlZmluZSBBVE1fQU5ZQ0xBU1MJNQkJLyogY29tcGF0aWJsZSB3aXRoIGV2ZXJ5dGhpbmcgKi8KKworI2RlZmluZSBBVE1fTUFYX1BDUgktMQkJLyogbWF4aW11bSBhdmFpbGFibGUgUENSICovCisKK3N0cnVjdCBhdG1fdHJhZnBybSB7CisJdW5zaWduZWQgY2hhcgl0cmFmZmljX2NsYXNzOwkvKiB0cmFmZmljIGNsYXNzIChBVE1fVUJSLCAuLi4pICovCisJaW50CQltYXhfcGNyOwkvKiBtYXhpbXVtIFBDUiBpbiBjZWxscyBwZXIgc2Vjb25kICovCisJaW50CQlwY3I7CQkvKiBkZXNpcmVkIFBDUiBpbiBjZWxscyBwZXIgc2Vjb25kICovCisJaW50CQltaW5fcGNyOwkvKiBtaW5pbXVtIFBDUiBpbiBjZWxscyBwZXIgc2Vjb25kICovCisJaW50CQltYXhfY2R2OwkvKiBtYXhpbXVtIENEViBpbiBtaWNyb3NlY29uZHMgKi8KKwlpbnQJCW1heF9zZHU7CS8qIG1heGltdW0gU0RVIGluIGJ5dGVzICovCisgICAgICAgIC8qIGV4dHJhIHBhcmFtcyBmb3IgQUJSICovCisgICAgICAgIHVuc2lnbmVkIGludCAJaWNyOyAgICAgICAgIAkvKiBJbml0aWFsIENlbGwgUmF0ZSAoMjQtYml0KSAqLworICAgICAgICB1bnNpZ25lZCBpbnQJdGJlOwkJLyogVHJhbnNpZW50IEJ1ZmZlciBFeHBvc3VyZSAoMjQtYml0KSAqLyAKKyAgICAgICAgdW5zaWduZWQgaW50IAlmcnR0IDogMjQ7CS8qIEZpeGVkIFJvdW5kIFRyaXAgVGltZSAoMjQtYml0KSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgCXJpZiAgOiA0OyAgICAgICAvKiBSYXRlIEluY3JlbWVudCBGYWN0b3IgKDQtYml0KSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgCXJkZiAgOiA0OyAgICAgICAvKiBSYXRlIERlY3JlYXNlIEZhY3RvciAoNC1iaXQpICovCisgICAgICAgIHVuc2lnbmVkIGludCBucm1fcHJlcyAgOjE7ICAgICAgLyogbnJtIHByZXNlbnQgYml0ICovCisgICAgICAgIHVuc2lnbmVkIGludCB0cm1fcHJlcyAgOjE7ICAgICAJLyogcm0gcHJlc2VudCBiaXQgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGFkdGZfcHJlcyA6MTsgICAgIAkvKiBhZHRmIHByZXNlbnQgYml0ICovCisgICAgICAgIHVuc2lnbmVkIGludCBjZGZfcHJlcyAgOjE7ICAgIAkvKiBjZGYgcHJlc2VudCBiaXQqLworICAgICAgICB1bnNpZ25lZCBpbnQgbnJtICAgICAgIDozOyAgICAgCS8qIE1heCAjIG9mIENlbGxzIGZvciBlYWNoIGZvcndhcmQgUk0gY2VsbCAoMy1iaXQpICovCisgICAgICAgIHVuc2lnbmVkIGludCB0cm0gICAgICAgOjM7ICAgIAkvKiBUaW1lIGJldHdlZW4gZm9yd2FyZCBSTSBjZWxscyAoMy1iaXQpICovICAgIAorCXVuc2lnbmVkIGludCBhZHRmICAgICAgOjEwOyAgICAgLyogQUNSIERlY3JlYXNlIFRpbWUgRmFjdG9yICgxMC1iaXQpICovCisJdW5zaWduZWQgaW50IGNkZiAgICAgICA6MzsgICAgICAvKiBDdXRvZmYgRGVjcmVhc2UgRmFjdG9yICgzLWJpdCkgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHNwYXJlICAgICA6OTsgICAgICAvKiBzcGFyZSBiaXRzICovIAorfTsKKworc3RydWN0IGF0bV9xb3MgeworCXN0cnVjdCBhdG1fdHJhZnBybSB0eHRwOwkvKiBwYXJhbWV0ZXJzIGluIFRYIGRpcmVjdGlvbiAqLworCXN0cnVjdCBhdG1fdHJhZnBybSByeHRwIF9fQVRNX0FQSV9BTElHTjsKKwkJCQkJLyogcGFyYW1ldGVycyBpbiBSWCBkaXJlY3Rpb24gKi8KKwl1bnNpZ25lZCBjaGFyIGFhbCBfX0FUTV9BUElfQUxJR047Cit9OworCisvKiBQVkMgYWRkcmVzc2luZyAqLworCisjZGVmaW5lIEFUTV9JVEZfQU5ZCS0xCQkvKiAibWFnaWMiIFBWQyBhZGRyZXNzIHZhbHVlcyAqLworI2RlZmluZSBBVE1fVlBJX0FOWQktMQorI2RlZmluZSBBVE1fVkNJX0FOWQktMQorI2RlZmluZSBBVE1fVlBJX1VOU1BFQwktMgorI2RlZmluZSBBVE1fVkNJX1VOU1BFQwktMgorCisKK3N0cnVjdCBzb2NrYWRkcl9hdG1wdmMgeworCXVuc2lnbmVkIHNob3J0IAlzYXBfZmFtaWx5OwkvKiBhZGRyZXNzIGZhbWlseSwgQUZfQVRNUFZDICAqLworCXN0cnVjdCB7CQkJLyogUFZDIGFkZHJlc3MgKi8KKwkJc2hvcnQJaXRmOwkJLyogQVRNIGludGVyZmFjZSAqLworCQlzaG9ydAl2cGk7CQkvKiBWUEkgKG9ubHkgOCBiaXRzIGF0IFVOSSkgKi8KKwkJaW50CXZjaTsJCS8qIFZDSSAob25seSAxNiBiaXRzIGF0IFVOSSkgKi8KKwl9IHNhcF9hZGRyIF9fQVRNX0FQSV9BTElHTjsJLyogUFZDIGFkZHJlc3MgKi8KK307CisKKy8qIFNWQyBhZGRyZXNzaW5nICovCisKKyNkZWZpbmUJQVRNX0VTQV9MRU4JMjAJCS8qIEFUTSBFbmQgU3lzdGVtIEFkZHJlc3MgbGVuZ3RoICovCisjZGVmaW5lIEFUTV9FMTY0X0xFTgkxMgkJLyogbWF4aW11bSBFLjE2NCBudW1iZXIgbGVuZ3RoICovCisKKyNkZWZpbmUgQVRNX0FGSV9EQ0MJMHgzOQkJLyogRENDIEFUTSBGb3JtYXQgKi8KKyNkZWZpbmUgQVRNX0FGSV9JQ0QJMHg0NwkJLyogSUNEIEFUTSBGb3JtYXQgKi8KKyNkZWZpbmUgQVRNX0FGSV9FMTY0CTB4NDUJCS8qIEUuMTY0IEFUTSBGb3JtYXQgKi8KKyNkZWZpbmUgQVRNX0FGSV9MT0NBTAkweDQ5CQkvKiBMb2NhbCBBVE0gRm9ybWF0ICovIAorCisjZGVmaW5lIEFUTV9BRklfRENDX0dST1VQCTB4QkQJLyogRENDIEFUTSBHcm91cCBGb3JtYXQgKi8KKyNkZWZpbmUgQVRNX0FGSV9JQ0RfR1JPVVAJMHhDNQkvKiBJQ0QgQVRNIEdyb3VwIEZvcm1hdCAqLworI2RlZmluZSBBVE1fQUZJX0UxNjRfR1JPVVAJMHhDMwkvKiBFLjE2NCBBVE0gR3JvdXAgRm9ybWF0ICovCisjZGVmaW5lIEFUTV9BRklfTE9DQUxfR1JPVVAJMHhDNwkvKiBMb2NhbCBBVE0gR3JvdXAgRm9ybWF0ICovCisKKyNkZWZpbmUgQVRNX0xJSl9OT05FCTAJCS8qIG5vIGxlYWYtaW5pdGlhdGVkIGpvaW4gKi8KKyNkZWZpbmUgQVRNX0xJSgkJMQkJLyogcmVxdWVzdCBqb2luaW5nICovCisjZGVmaW5lIEFUTV9MSUpfUlBKCTIJCS8qIHNldCB0byByb290LXByb21wdGVkIGpvaW4gKi8KKyNkZWZpbmUgQVRNX0xJSl9OSgkzCQkvKiBzZXQgdG8gbmV0d29yayBqb2luICovCisKKworc3RydWN0IHNvY2thZGRyX2F0bXN2YyB7CisgICAgdW5zaWduZWQgc2hvcnQgCXNhc19mYW1pbHk7CS8qIGFkZHJlc3MgZmFtaWx5LCBBRl9BVE1TVkMgKi8KKyAgICBzdHJ1Y3QgewkJCQkvKiBTVkMgYWRkcmVzcyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyCXBydltBVE1fRVNBX0xFTl07LyogcHJpdmF0ZSBBVE0gYWRkcmVzcyAqLworICAgICAgICBjaGFyCQlwdWJbQVRNX0UxNjRfTEVOKzFdOyAvKiBwdWJsaWMgYWRkcmVzcyAoRS4xNjQpICovCisgICAgCQkJCQkvKiB1bnVzZWQgYWRkcmVzc2VzIG11c3QgYmUgYnplcm8nZWQgKi8KKwljaGFyCQlsaWpfdHlwZTsJLyogcm9sZSBpbiBMSUogY2FsbDsgb25lIG9mIEFUTV9MSUoqICovCisJX191MzIJbGlqX2lkOwkJLyogTElKIGNhbGwgaWRlbnRpZmllciAqLworICAgIH0gc2FzX2FkZHIgX19BVE1fQVBJX0FMSUdOOwkJLyogU1ZDIGFkZHJlc3MgKi8KK307CisKKworc3RhdGljIF9faW5saW5lX18gaW50IGF0bXN2Y19hZGRyX2luX3VzZShzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjIGFkZHIpCit7CisJcmV0dXJuICphZGRyLnNhc19hZGRyLnBydiB8fCAqYWRkci5zYXNfYWRkci5wdWI7Cit9CisKKworc3RhdGljIF9faW5saW5lX18gaW50IGF0bXB2Y19hZGRyX2luX3VzZShzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjIGFkZHIpCit7CisJcmV0dXJuIGFkZHIuc2FwX2FkZHIuaXRmIHx8IGFkZHIuc2FwX2FkZHIudnBpIHx8IGFkZHIuc2FwX2FkZHIudmNpOworfQorCisKKy8qCisgKiBTb21lIHN0dWZmIGZvciBsaW51eC9zb2NraW9zLmgKKyAqLworCitzdHJ1Y3QgYXRtaWZfc2lvYyB7CisJaW50IG51bWJlcjsKKwlpbnQgbGVuZ3RoOworCXZvaWQgKmFyZzsKK307CisKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBhdG1fYmFja2VuZF90OworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9lbmkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtX2VuaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjMxNzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9lbmkuaApAQCAtMCwwICsxLDIzIEBACisvKiBhdG1fZW5pLmggLSBEcml2ZXItc3BlY2lmaWMgZGVjbGFyYXRpb25zIG9mIHRoZSBFTkkgZHJpdmVyIChmb3IgdXNlIGJ5CisJICAgICAgIGRyaXZlci1zcGVjaWZpYyB1dGlsaXRpZXMpICovCisKKy8qIFdyaXR0ZW4gMTk5NS0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisKKworI2lmbmRlZiBMSU5VWF9BVE1fRU5JX0gKKyNkZWZpbmUgTElOVVhfQVRNX0VOSV9ICisKKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKworCitzdHJ1Y3QgZW5pX211bHRpcGxpZXJzIHsKKwlpbnQgdHgscng7CS8qIHZhbHVlcyBhcmUgaW4gcGVyY2VudCBhbmQgbXVzdCBiZSA+IDEwMCAqLworfTsKKworCisjZGVmaW5lIEVOSV9NRU1EVU1QICAgICBfSU9XKCdhJyxBVE1JT0NfU0FSUFJWLHN0cnVjdCBhdG1pZl9zaW9jKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJpbnRrIG1lbW9yeSBtYXAgKi8KKyNkZWZpbmUgRU5JX1NFVE1VTFQJX0lPVygnYScsQVRNSU9DX1NBUlBSVis3LHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkJLyogc2V0IGJ1ZmZlciBtdWx0aXBsaWVycyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtX2hlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9oZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNzcxM2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9oZS5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qIGF0bV9oZS5oICovCisKKyNpZm5kZWYgTElOVVhfQVRNX0hFX0gKKyNkZWZpbmUgTElOVVhfQVRNX0hFX0gKKworI2luY2x1ZGUgPGxpbnV4L2F0bWlvYy5oPgorCisjZGVmaW5lIEhFX0dFVF9SRUcJX0lPVygnYScsIEFUTUlPQ19TQVJQUlYsIHN0cnVjdCBhdG1pZl9zaW9jKQorCisjZGVmaW5lIEhFX1JFR1RZUEVfUENJCTEKKyNkZWZpbmUgSEVfUkVHVFlQRV9SQ00JMgorI2RlZmluZSBIRV9SRUdUWVBFX1RDTQkzCisjZGVmaW5lIEhFX1JFR1RZUEVfTUJPWAk0CisKK3N0cnVjdCBoZV9pb2N0bF9yZWcgeworCXVuc2lnbmVkIGFkZHIsIHZhbDsKKwljaGFyIHR5cGU7Cit9OworCisjZW5kaWYgLyogTElOVVhfQVRNX0hFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtX2lkdDc3MTA1LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9pZHQ3NzEwNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzI0MDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9pZHQ3NzEwNS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qIGF0bV9pZHQ3NzEwNS5oIC0gRHJpdmVyLXNwZWNpZmljIGRlY2xhcmF0aW9ucyBvZiB0aGUgSURUNzcxMDUgZHJpdmVyIChmb3IKKyAqIHVzZSBieSBkcml2ZXItc3BlY2lmaWMgdXRpbGl0aWVzKSAqLworCisvKiBXcml0dGVuIDE5OTkgYnkgR3JlZyBCYW5rcyA8Z25iQGxpbnV4ZmFuLmNvbT4uIENvcGllZCBmcm9tIGF0bV9zdW5pLmguICovCisKKworI2lmbmRlZiBMSU5VWF9BVE1fSURUNzcxMDVfSAorI2RlZmluZSBMSU5VWF9BVE1fSURUNzcxMDVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KKworLyoKKyAqIFN0cnVjdHVyZSBmb3IgSURUNzcxMDVfR0VUU1RBVCBhbmQgSURUNzcxMDVfR0VUU1RBVFogaW9jdGxzLgorICogUG9pbnRlZCB0byBieSBgYXJnJyBpbiBhdG1pZl9zaW9jLgorICovCitzdHJ1Y3QgaWR0NzcxMDVfc3RhdHMgeworICAgICAgICBfX3UzMiBzeW1ib2xfZXJyb3JzOyAgLyogd2lyZSBzeW1ib2wgZXJyb3JzICovCisgICAgICAgIF9fdTMyIHR4X2NlbGxzOyAgICAgICAvKiBjZWxscyB0cmFuc21pdHRlZCAqLworICAgICAgICBfX3UzMiByeF9jZWxsczsgICAgICAgLyogY2VsbHMgcmVjZWl2ZWQgKi8KKyAgICAgICAgX191MzIgcnhfaGVjX2Vycm9yczsgIC8qIEhlYWRlciBFcnJvciBDaGVjayBlcnJvcnMgb24gcmVjZWl2ZSAqLworfTsKKworI2RlZmluZSBJRFQ3NzEwNV9HRVRTVEFUCV9JT1coJ2EnLEFUTUlPQ19QSFlQUlYrMixzdHJ1Y3QgYXRtaWZfc2lvYykJLyogZ2V0IHN0YXRzICovCisjZGVmaW5lIElEVDc3MTA1X0dFVFNUQVRaCV9JT1coJ2EnLEFUTUlPQ19QSFlQUlYrMyxzdHJ1Y3QgYXRtaWZfc2lvYykJLyogZ2V0IHN0YXRzIGFuZCB6ZXJvICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1fbmljc3Rhci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1fbmljc3Rhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3N2I3OWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9uaWNzdGFyLmgKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGF0bV9uaWNzdGFyLmgKKyAqCisgKiBEcml2ZXItc3BlY2lmaWMgZGVjbGFyYXRpb25zIGZvciB1c2UgYnkgTklDU1RBUiBkcml2ZXIgc3BlY2lmaWMgdXRpbHMuCisgKgorICogQXV0aG9yOiBSdWkgUHJpb3IKKyAqCisgKiAoQykgSU5FU0MgMTk5OAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBMSU5VWF9BVE1fTklDU1RBUl9ICisjZGVmaW5lIExJTlVYX0FUTV9OSUNTVEFSX0gKKworLyogTm90ZTogbm9uLWtlcm5lbCBwcm9ncmFtcyBpbmNsdWRpbmcgdGhpcyBmaWxlIG11c3QgYWxzbyBpbmNsdWRlCisgKiBzeXMvdHlwZXMuaCBmb3Igc3RydWN0IHRpbWV2YWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvYXRtYXBpLmg+CisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisKKyNkZWZpbmUgTlNfR0VUUFNUQVQJX0lPV1IoJ2EnLEFUTUlPQ19TQVJQUlYrMSxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJCS8qIGdldCBwb29sIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgTlNfU0VUQlVGTEVWCV9JT1coJ2EnLEFUTUlPQ19TQVJQUlYrMixzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJCS8qIHNldCBidWZmZXIgbGV2ZWwgbWFya2VycyAqLworI2RlZmluZSBOU19BREpCVUZMRVYJX0lPKCdhJyxBVE1JT0NfU0FSUFJWKzMpCisJCQkJCQkvKiBhZGp1c3QgYnVmZmVyIGxldmVsICovCisKK3R5cGVkZWYgc3RydWN0IGJ1Zl9ucgoreworICAgdW5zaWduZWQgbWluOworICAgdW5zaWduZWQgaW5pdDsKKyAgIHVuc2lnbmVkIG1heDsKK31idWZfbnI7CisKKwordHlwZWRlZiBzdHJ1Y3QgcG9vbF9sZXZlbHMKK3sKKyAgIGludCBidWZ0eXBlOworICAgaW50IGNvdW50OwkJLyogKEF0IGxlYXN0IGZvciBub3cpIG9ubHkgdXNlZCBpbiBOU19HRVRQU1RBVCAqLworICAgYnVmX25yIGxldmVsOworfSBwb29sX2xldmVsczsKKworLyogdHlwZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAqLworI2RlZmluZSBOU19CVUZUWVBFX1NNQUxMIDEKKyNkZWZpbmUgTlNfQlVGVFlQRV9MQVJHRSAyCisjZGVmaW5lIE5TX0JVRlRZUEVfSFVHRSAzCisjZGVmaW5lIE5TX0JVRlRZUEVfSU9WRUMgNAorCisKKyNlbmRpZiAvKiBMSU5VWF9BVE1fTklDU1RBUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV90Y3AuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtX3RjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MmU2YWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV90Y3AuaApAQCAtMCwwICsxLDYxIEBACisvKiBhdG1fdGNwLmggLSBEcml2ZXItc3BlY2lmaWMgZGVjbGFyYXRpb25zIG9mIHRoZSBBVE1UQ1AgZHJpdmVyIChmb3IgdXNlIGJ5CisJICAgICAgIGRyaXZlci1zcGVjaWZpYyB1dGlsaXRpZXMpICovCisKKy8qIFdyaXR0ZW4gMTk5Ny0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisKKworI2lmbmRlZiBMSU5VWF9BVE1fVENQX0gKKyNkZWZpbmUgTElOVVhfQVRNX1RDUF9ICisKKyNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG0uaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKy8qCisgKiBBbGwgdmFsdWVzIGluIHN0cnVjdCBhdG10Y3BfaGRyIGFyZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKKyAqLworCitzdHJ1Y3QgYXRtdGNwX2hkciB7CisJX191MTYJdnBpOworCV9fdTE2CXZjaTsKKwlfX3UzMglsZW5ndGg7CQkvKiAuLi4gb2YgZGF0YSBwYXJ0ICovCit9OworCisvKgorICogQWxsIHZhbHVlcyBpbiBzdHJ1Y3QgYXRtdGNwX2NvbW1hbmQgYXJlIGluIGhvc3QgYnl0ZSBvcmRlcgorICovCisKKyNkZWZpbmUgQVRNVENQX0hEUl9NQUdJQwkofjApCS8qIHRoaXMgbGVuZ3RoIGluZGljYXRlcyBhIGNvbW1hbmQgKi8KKyNkZWZpbmUgQVRNVENQX0NUUkxfT1BFTgkxCS8qIHJlcXVlc3QvcmVwbHkgKi8KKyNkZWZpbmUgQVRNVENQX0NUUkxfQ0xPU0UJMgkvKiByZXF1ZXN0L3JlcGx5ICovCisKK3N0cnVjdCBhdG10Y3BfY29udHJvbCB7CisJc3RydWN0IGF0bXRjcF9oZHIgaGRyOwkvKiBtdXN0IGJlIGZpcnN0ICovCisJaW50IHR5cGU7CQkvKiBtZXNzYWdlIHR5cGU7IGJvdGggZGlyZWN0aW9ucyAqLworCWF0bV9rcHRyX3QgdmNjOwkJLyogYm90aCBkaXJlY3Rpb25zICovCisJc3RydWN0IHNvY2thZGRyX2F0bXB2YyBhZGRyOyAvKiBzdWdnZXN0ZWQgdmFsdWUgZnJvbSBrZXJuZWwgKi8KKwlzdHJ1Y3QgYXRtX3Fvcwlxb3M7CS8qIGJvdGggZGlyZWN0aW9ucyAqLworCWludCByZXN1bHQ7CQkvKiB0byBrZXJuZWwgb25seSAqLworfSBfX0FUTV9BUElfQUxJR047CisKKy8qCisgKiBGaWVsZCB1c2FnZToKKyAqIE1lc3NnZSB0eXBlCWRpci4JaGRyLnY/aQl0eXBlCWFkZHIJcW9zCXZjYwlyZXN1bHQKKyAqIC0tLS0tLS0tLS0tICAtLS0tCS0tLS0tLS0gLS0tLQktLS0tCS0tLQktLS0JLS0tLS0tCisgKiBPUEVOCQlLLT5ECVkJWQlZCVkJWQkwCisgKiBPUEVOCQlELT5LCS0JWQlZCVkJWQlZCisgKiBDTE9TRQlLLT5ECS0JLQlZCS0JWQkwCisgKiBDTE9TRQlELT5LCS0JLQktCS0JWQlZCisgKi8KKworI2RlZmluZSBTSU9DU0lGQVRNVENQCV9JTygnYScsQVRNSU9DX0lURikJLyogc2V0IEFUTVRDUCBtb2RlICovCisjZGVmaW5lIEFUTVRDUF9DUkVBVEUJX0lPKCdhJyxBVE1JT0NfSVRGKzE0KQkvKiBjcmVhdGUgcGVyc2lzdGVudCBBVE1UQ1AKKwkJCQkJCSAgIGludGVyZmFjZSAqLworI2RlZmluZSBBVE1UQ1BfUkVNT1ZFCV9JTygnYScsQVRNSU9DX0lURisxNSkJLyogZGVzdHJveSBwZXJzaXN0ZW50IEFUTVRDUAorCQkJCQkJICAgaW50ZXJmYWNlICovCisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtX3phdG0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtX3phdG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGYwZmEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1femF0bS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIGF0bV96YXRtLmggLSBEcml2ZXItc3BlY2lmaWMgZGVjbGFyYXRpb25zIG9mIHRoZSBaQVRNIGRyaXZlciAoZm9yIHVzZSBieQorCQlkcml2ZXItc3BlY2lmaWMgdXRpbGl0aWVzKSAqLworCisvKiBXcml0dGVuIDE5OTUtMTk5OSBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworCisKKyNpZm5kZWYgTElOVVhfQVRNX1pBVE1fSAorI2RlZmluZSBMSU5VWF9BVE1fWkFUTV9ICisKKy8qCisgKiBOb3RlOiBub24ta2VybmVsIHByb2dyYW1zIGluY2x1ZGluZyB0aGlzIGZpbGUgbXVzdCBhbHNvIGluY2x1ZGUKKyAqIHN5cy90eXBlcy5oIGZvciBzdHJ1Y3QgdGltZXZhbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKworI2RlZmluZSBaQVRNX0dFVFBPT0wJX0lPVygnYScsQVRNSU9DX1NBUlBSVisxLHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkJLyogZ2V0IHBvb2wgc3RhdGlzdGljcyAqLworI2RlZmluZSBaQVRNX0dFVFBPT0xaCV9JT1coJ2EnLEFUTUlPQ19TQVJQUlYrMixzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJCS8qIGdldCBzdGF0aXN0aWNzIGFuZCB6ZXJvICovCisjZGVmaW5lIFpBVE1fU0VUUE9PTAlfSU9XKCdhJyxBVE1JT0NfU0FSUFJWKzMsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCQkvKiBzZXQgcG9vbCBwYXJhbWV0ZXJzICovCisKK3N0cnVjdCB6YXRtX3Bvb2xfaW5mbyB7CisJaW50IHJlZl9jb3VudDsJCQkvKiBmcmVlIGJ1ZmZlciBwb29sIHVzYWdlIGNvdW50ZXJzICovCisJaW50IGxvd193YXRlcixoaWdoX3dhdGVyOwkvKiByZWZpbGwgcGFyYW1ldGVycyAqLworCWludCBycWFfY291bnQscnF1X2NvdW50OwkvKiBxdWV1ZSBjb25kaXRpb24gY291bnRlcnMgKi8KKwlpbnQgb2Zmc2V0LG5leHRfb2ZmOwkJLyogYWxpZ25tZW50IG9wdGltaXphdGlvbnM6IG9mZnNldCAqLworCWludCBuZXh0X2NudCxuZXh0X3RocmVzOwkvKiByZXBldGl0aW9uIGNvdW50ZXIgYW5kIHRocmVzaG9sZCAqLworfTsKKworc3RydWN0IHphdG1fcG9vbF9yZXEgeworCWludCBwb29sX251bTsJCQkvKiBwb29sIG51bWJlciAqLworCXN0cnVjdCB6YXRtX3Bvb2xfaW5mbyBpbmZvOwkvKiBhY3R1YWwgaW5mb3JtYXRpb24gKi8KK307CisKK3N0cnVjdCB6YXRtX3RfaGlzdCB7CisJc3RydWN0IHRpbWV2YWwgcmVhbDsJCS8qIHJlYWwgKHdhbGwtY2xvY2spIHRpbWUgKi8KKwlzdHJ1Y3QgdGltZXZhbCBleHBlY3RlZDsJLyogZXhwZWN0ZWQgcmVhbCB0aW1lICovCit9OworCisKKyNkZWZpbmUgWkFUTV9PQU1fUE9PTAkJMAkvKiBmcmVlIGJ1ZmZlciBwb29sIGZvciBPQU0gY2VsbHMgKi8KKyNkZWZpbmUgWkFUTV9BQUwwX1BPT0wJCTEJLyogZnJlZSBidWZmZXIgcG9vbCBmb3IgQUFMMCBjZWxscyAqLworI2RlZmluZSBaQVRNX0FBTDVfUE9PTF9CQVNFCTIJLyogZmlyc3QgQUFMNSBmcmVlIGJ1ZmZlciBwb29sICovCisjZGVmaW5lIFpBVE1fTEFTVF9QT09MCVpBVE1fQUFMNV9QT09MX0JBU0UrMTAgLyogbWF4LiA2NCBrQiAqLworCisjZGVmaW5lIFpBVE1fVElNRVJfSElTVE9SWV9TSVpFCTE2CS8qIG51bWJlciBvZiB0aW1lciBhZGp1c3RtZW50cyB0bworCQkJCQkgICByZWNvcmQ7IG11c3QgYmUgMl5uICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1hcGkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlNTRkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtYXBpLmgKQEAgLTAsMCArMSwyOSBAQAorLyogYXRtYXBpLmggLSBBVE0gQVBJIHVzZXIgc3BhY2Uva2VybmVsIGNvbXBhdGliaWxpdHkgKi8KKyAKKy8qIFdyaXR0ZW4gMTk5OSwyMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBJQ0EgKi8KKyAKKworI2lmbmRlZiBfTElOVVhfQVRNQVBJX0gKKyNkZWZpbmUgX0xJTlVYX0FUTUFQSV9ICisKKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX2lhNjRfXykKKy8qIHN1Y2ggYWxpZ25tZW50IGlzIG5vdCByZXF1aXJlZCBvbiAzMiBiaXQgc3BhcmNzLCBidXQgd2UgY2FuJ3QKKyAgIGZpZ3VyZSB0aGF0IHdlIGFyZSBvbiBhIHNwYXJjNjQgd2hpbGUgY29tcGlsaW5nIHVzZXItc3BhY2UgcHJvZ3JhbXMuICovCisjZGVmaW5lIF9fQVRNX0FQSV9BTElHTglfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkKKyNlbHNlCisjZGVmaW5lIF9fQVRNX0FQSV9BTElHTgorI2VuZGlmCisKKworLyoKKyAqIE9wYXF1ZSB0eXBlIGZvciBrZXJuZWwgcG9pbnRlcnMuIE5vdGUgdGhhdCBfIGlzIG5ldmVyIGFjY2Vzc2VkLiBXZSBuZWVkCisgKiB0aGUgc3RydWN0IGluIG9yZGVyIGhpZGUgdGhlIGFycmF5LCBzbyB0aGF0IHdlIGNhbiBtYWtlIHNpbXBsZSBhc3NpZ25tZW50cworICogaW5zdGVhZCBvZiBiZWluZyBmb3JjZWQgdG8gdXNlIG1lbWNweS4gSXQgYWxzbyBpbXByb3ZlcyBlcnJvciByZXBvcnRpbmcgZm9yCisgKiBjb2RlIHRoYXQgc3RpbGwgYXNzdW1lcyB0aGF0IHdlJ3JlIHBhc3NpbmcgdW5zaWduZWQgbG9uZ3MuCisgKgorICogQ29udmVudGlvbjogTlVMTCBwb2ludGVycyBhcmUgcGFzc2VkIGFzIGEgZmllbGQgb2YgYWxsIHplcm9lcy4KKyAqLworIAordHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBjaGFyIF9bOF07IH0gX19BVE1fQVBJX0FMSUdOIGF0bV9rcHRyX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1hcnAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtYXJwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxZjRiZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtYXJwLmgKQEAgLTAsMCArMSw0MSBAQAorLyogYXRtYXJwLmggLSBBVE0gQVJQIHByb3RvY29sIGFuZCBrZXJuZWwtZGVtb24gaW50ZXJmYWNlIGRlZmluaXRpb25zICovCisgCisvKiBXcml0dGVuIDE5OTUtMTk5OSBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworIAorCisjaWZuZGVmIF9MSU5VWF9BVE1BUlBfSAorI2RlZmluZSBfTElOVVhfQVRNQVJQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYXRtYXBpLmg+CisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisKKworI2RlZmluZSBBVE1BUlBfUkVUUllfREVMQVkgMzAJCS8qIHJlcXVlc3QgbmV4dCByZXNvbHV0aW9uIG9yIGZvcmdldAorCQkJCQkgICBOQUsgYWZ0ZXIgMzAgc2VjIC0gc2hvdWxkIGdvIGludG8KKwkJCQkJICAgYXRtY2xpcC5oICovCisjZGVmaW5lIEFUTUFSUF9NQVhfVU5SRVNfUEFDS0VUUyA1CS8qIHF1ZXVlIHRoYXQgbWFueSBwYWNrZXRzIHdoaWxlCisJCQkJCSAgIHdhaXRpbmcgZm9yIHRoZSByZXNvbHZlciAqLworCisKKyNkZWZpbmUgQVRNQVJQRF9DVFJMCV9JTygnYScsQVRNSU9DX0NMSVArMSkJLyogYmVjb21lIGF0bWFycGQgY3RybCBzb2NrICovCisjZGVmaW5lIEFUTUFSUF9NS0lQCV9JTygnYScsQVRNSU9DX0NMSVArMikJLyogYXR0YWNoIHNvY2tldCB0byBJUCAqLworI2RlZmluZSBBVE1BUlBfU0VURU5UUlkJX0lPKCdhJyxBVE1JT0NfQ0xJUCszKQkvKiBmaWxsIG9yIGhpZGUgQVJQIGVudHJ5ICovCisjZGVmaW5lIEFUTUFSUF9FTkNBUAlfSU8oJ2EnLEFUTUlPQ19DTElQKzUpCS8qIGNoYW5nZSBlbmNhcHN1bGF0aW9uICovCisKKworZW51bSBhdG1hcnBfY3RybF90eXBlIHsKKwlhY3RfaW52YWxpZCwJCS8qIGNhdGNoIHVuaW5pdGlhbGl6ZWQgc3RydWN0dXJlcyAqLworCWFjdF9uZWVkLAkJLyogbmVlZCBhZGRyZXNzIHJlc29sdXRpb24gKi8KKwlhY3RfdXAsCQkJLyogaW50ZXJmYWNlIGlzIGNvbWluZyB1cCAqLworCWFjdF9kb3duLAkJLyogaW50ZXJmYWNlIGlzIGdvaW5nIGRvd24gKi8KKwlhY3RfY2hhbmdlCQkvKiBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZCAqLworfTsKKworc3RydWN0IGF0bWFycF9jdHJsIHsKKwllbnVtIGF0bWFycF9jdHJsX3R5cGUJdHlwZTsJLyogbWVzc2FnZSB0eXBlICovCisJaW50CQkJaXRmX251bTsvKiBpbnRlcmZhY2UgbnVtYmVyIChpZiBwcmVzZW50KSAqLworCV9fYmUzMgkJCWlwOwkvKiBJUCBhZGRyZXNzIChhY3RfbmVlZCBvbmx5KSAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWJyMjY4NC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1icjI2ODQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGIyNjI5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1icjI2ODQuaApAQCAtMCwwICsxLDExNyBAQAorI2lmbmRlZiBfTElOVVhfQVRNQlIyNjg0X0gKKyNkZWZpbmUgX0xJTlVYX0FUTUJSMjY4NF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CQkvKiBGb3IgSUZOQU1TSVogKi8KKworLyoKKyAqIFR5cGUgb2YgbWVkaWEgd2UncmUgYnJpZGdpbmcgKGV0aGVybmV0LCB0b2tlbiByaW5nLCBldGMpICBDdXJyZW50bHkgb25seQorICogZXRoZXJuZXQgaXMgc3VwcG9ydGVkCisgKi8KKyNkZWZpbmUgQlIyNjg0X01FRElBX0VUSEVSTkVUCSgwKQkvKiA4MDIuMyAqLworI2RlZmluZSBCUjI2ODRfTUVESUFfODAyXzQJKDEpCS8qIDgwMi40ICovCisjZGVmaW5lIEJSMjY4NF9NRURJQV9UUgkJKDIpCS8qIDgwMi41IC0gdG9rZW4gcmluZyAqLworI2RlZmluZSBCUjI2ODRfTUVESUFfRkRESQkoMykKKyNkZWZpbmUgQlIyNjg0X01FRElBXzgwMl82CSg0KQkvKiA4MDIuNiAqLworCisJCQkJCS8qIHVzZWQgb25seSBhdCBkZXZpY2UgY3JlYXRpb246ICAqLworI2RlZmluZSBCUjI2ODRfRkxBR19ST1VURUQJKDE8PDE2KQkvKiBwYXlsb2FkIGlzIHJvdXRlZCwgbm90IGJyaWRnZWQgKi8KKworLyoKKyAqIElzIHRoZXJlIEZDUyBpbmJvdW5kIG9uIHRoaXMgVkM/ICBUaGlzIGN1cnJlbnRseSBpc24ndCBzdXBwb3J0ZWQuCisgKi8KKyNkZWZpbmUgQlIyNjg0X0ZDU0lOX05PCQkoMCkKKyNkZWZpbmUgQlIyNjg0X0ZDU0lOX0lHTk9SRQkoMSkKKyNkZWZpbmUgQlIyNjg0X0ZDU0lOX1ZFUklGWQkoMikKKworLyoKKyAqIElzIHRoZXJlIEZDUyBvdXRib3VuZCBvbiB0aGlzIFZDPyAgVGhpcyBjdXJyZW50bHkgaXNuJ3Qgc3VwcG9ydGVkLgorICovCisjZGVmaW5lIEJSMjY4NF9GQ1NPVVRfTk8JKDApCisjZGVmaW5lIEJSMjY4NF9GQ1NPVVRfU0VORFpFUk8JKDEpCisjZGVmaW5lIEJSMjY4NF9GQ1NPVVRfR0VORVJBVEUJKDIpCisKKy8qCisgKiBEb2VzIHRoaXMgVkMgaW5jbHVkZSBMTEMgZW5jYXBzdWxhdGlvbj8KKyAqLworI2RlZmluZSBCUjI2ODRfRU5DQVBTX1ZDCSgwKQkvKiBWQy1tdXggKi8KKyNkZWZpbmUgQlIyNjg0X0VOQ0FQU19MTEMJKDEpCisjZGVmaW5lIEJSMjY4NF9FTkNBUFNfQVVUT0RFVEVDVCAoMikJLyogVW5zdXBvcnRlZCAqLworCisvKgorICogSXMgdGhpcyBWQyBicmlkZ2VkIG9yIHJvdXRlZD8KKyAqLworCisjZGVmaW5lIEJSMjY4NF9QQVlMT0FEX1JPVVRFRCAgICgwKQorI2RlZmluZSBCUjI2ODRfUEFZTE9BRF9CUklER0VEICAoMSkKKworLyoKKyAqIFRoaXMgaXMgZm9yIHRoZSBBVE1fTkVXQkFDS0VORElGIGNhbGwgLSB0aGVzZSBhcmUgbGlrZSBzb2NrZXQgZmFtaWxpZXM6CisgKiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc3RydWN0dXJlIGlzIHRoZSBiYWNrZW5kIG51bWJlciBhbmQgdGhlIHJlc3QKKyAqIGlzIHBlci1iYWNrZW5kIHNwZWNpZmljCisgKi8KK3N0cnVjdCBhdG1fbmV3aWZfYnIyNjg0IHsKKwlhdG1fYmFja2VuZF90IGJhY2tlbmRfbnVtOwkvKiBBVE1fQkFDS0VORF9CUjI2ODQgKi8KKwlpbnQgbWVkaWE7CQkvKiBCUjI2ODRfTUVESUFfKiwgZmxhZ3MgaW4gdXBwZXIgYml0cyAqLworCWNoYXIgaWZuYW1lW0lGTkFNU0laXTsKKwlpbnQgbXR1OworfTsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGJyMjY4NCBpbnRlcmZhY2UgLSBlaXRoZXIgYnkgYQorICogcG9zaXRpdmUgaW50ZWdlciAocmV0dXJuZWQgYnkgQVRNX05FV0JBQ0tFTkRJRikgb3IgdGhlIGludGVyZmFjZXMgbmFtZQorICovCisjZGVmaW5lIEJSMjY4NF9GSU5EX0JZTk9USElORwkoMCkKKyNkZWZpbmUgQlIyNjg0X0ZJTkRfQllOVU0JKDEpCisjZGVmaW5lIEJSMjY4NF9GSU5EX0JZSUZOQU1FCSgyKQorc3RydWN0IGJyMjY4NF9pZl9zcGVjIHsKKwlpbnQgbWV0aG9kOwkJLyogQlIyNjg0X0ZJTkRfKiAqLworCXVuaW9uIHsKKwkJY2hhciBpZm5hbWVbSUZOQU1TSVpdOworCQlpbnQgZGV2bnVtOworCX0gc3BlYzsKK307CisKKy8qCisgKiBUaGlzIGlzIGZvciB0aGUgQVRNX1NFVEJBQ0tFTkQgY2FsbCAtIHRoZXNlIGFyZSBsaWtlIHNvY2tldCBmYW1pbGllczoKKyAqIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBzdHJ1Y3R1cmUgaXMgdGhlIGJhY2tlbmQgbnVtYmVyIGFuZCB0aGUgcmVzdAorICogaXMgcGVyLWJhY2tlbmQgc3BlY2lmaWMKKyAqLworc3RydWN0IGF0bV9iYWNrZW5kX2JyMjY4NCB7CisJYXRtX2JhY2tlbmRfdCBiYWNrZW5kX251bTsJLyogQVRNX0JBQ0tFTkRfQlIyNjg0ICovCisJc3RydWN0IGJyMjY4NF9pZl9zcGVjIGlmc3BlYzsKKwlpbnQgZmNzX2luOwkJLyogQlIyNjg0X0ZDU0lOXyogKi8KKwlpbnQgZmNzX291dDsJCS8qIEJSMjY4NF9GQ1NPVVRfKiAqLworCWludCBmY3NfYXV0bzsJCS8qIDE6IGZjc197aW4sb3V0fSBkaXNhYmxlZCBpZiBubyBGQ1MgcngnZWQgKi8KKwlpbnQgZW5jYXBzOwkJLyogQlIyNjg0X0VOQ0FQU18qICovCisJaW50IGhhc192cGlpZDsJCS8qIDE6IHVzZSB2cG5faWQgLSBVbnN1cHBvcnRlZCAqLworCV9fdTggdnBuX2lkWzddOworCWludCBzZW5kX3BhZGRpbmc7CS8qIHVuc3VwcG9ydGVkICovCisJaW50IG1pbl9zaXplOwkJLyogd2Ugd2lsbCBwYWQgc21hbGxlciBwYWNrZXRzIHRoYW4gdGhpcyAqLworfTsKKworLyoKKyAqIFRoZSBCUjI2ODRfU0VURklMVCBpb2N0bCBpcyBhbiBleHBlcmltZW50YWwgbWVjaGFuaXNtIGZvciBmb2xrcworICogdGVybWluYXRpbmcgYSBsYXJnZSBudW1iZXIgb2YgSVAtb25seSB2Y2Mncy4gIFdoZW4gbmV0ZmlsdGVyIGFsbG93cworICogZWZmaWNpZW50IHBlci1pZiBpbi9vdXQgZmlsdGVycywgdGhpcyBzdXBwb3J0IHdpbGwgYmUgcmVtb3ZlZAorICovCitzdHJ1Y3QgYnIyNjg0X2ZpbHRlciB7CisJX19iZTMyIHByZWZpeDsJCS8qIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCV9fYmUzMiBuZXRtYXNrOwkJLyogMCA9IGRpc2FibGUgZmlsdGVyICovCit9OworCitzdHJ1Y3QgYnIyNjg0X2ZpbHRlcl9zZXQgeworCXN0cnVjdCBicjI2ODRfaWZfc3BlYyBpZnNwZWM7CisJc3RydWN0IGJyMjY4NF9maWx0ZXIgZmlsdGVyOworfTsKKworZW51bSBicjI2ODRfcGF5bG9hZCB7CisJcF9yb3V0ZWQgPSBCUjI2ODRfUEFZTE9BRF9ST1VURUQsCisJcF9icmlkZ2VkID0gQlIyNjg0X1BBWUxPQURfQlJJREdFRCwKK307CisKKyNkZWZpbmUgQlIyNjg0X1NFVEZJTFQJX0lPVyggJ2EnLCBBVE1JT0NfQkFDS0VORCArIDAsIFwKKwkJCQlzdHJ1Y3QgYnIyNjg0X2ZpbHRlcl9zZXQpCisKKyNlbmRpZiAvKiBfTElOVVhfQVRNQlIyNjg0X0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtY2xpcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1jbGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjOTRjNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtY2xpcC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qIGF0bWNsaXAuaCAtIENsYXNzaWNhbCBJUCBvdmVyIEFUTSAqLworIAorLyogV3JpdHRlbiAxOTk1LTE5OTggYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKyAKKworI2lmbmRlZiBMSU5VWF9BVE1DTElQX0gKKyNkZWZpbmUgTElOVVhfQVRNQ0xJUF9ICisKKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisKKworI2RlZmluZSBSRkMxNDgzTExDX0xFTgk4CQkvKiBMTEMrT1VJK1BJRCA9IDggKi8KKyNkZWZpbmUgUkZDMTYyNl9NVFUJOTE4MAkJLyogUkZDMTYyNiBkZWZhdWx0IE1UVSAqLworCisjZGVmaW5lIENMSVBfREVGQVVMVF9JRExFVElNRVIgMTIwMAkvKiAyMCBtaW51dGVzLCBzZWUgUkZDMTc1NSAqLworI2RlZmluZSBDTElQX0NIRUNLX0lOVEVSVkFMCSAxMAkvKiBjaGVjayBldmVyeSB0ZW4gc2Vjb25kcyAqLworCisjZGVmaW5lCVNJT0NNS0NMSVAJX0lPKCdhJyxBVE1JT0NfQ0xJUCkJLyogY3JlYXRlIElQIGludGVyZmFjZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtZGV2LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWRldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTFhNGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWRldi5oCkBAIC0wLDAgKzEsMjE1IEBACisvKiBhdG1kZXYuaCAtIEFUTSBkZXZpY2UgZHJpdmVyIGRlY2xhcmF0aW9ucyBhbmQgdmFyaW91cyByZWxhdGVkIGl0ZW1zICovCisgCisvKiBXcml0dGVuIDE5OTUtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworIAorCisjaWZuZGVmIExJTlVYX0FUTURFVl9ICisjZGVmaW5lIExJTlVYX0FUTURFVl9ICisKKworI2luY2x1ZGUgPGxpbnV4L2F0bWFwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWlvYy5oPgorCisKKyNkZWZpbmUgRVNJX0xFTgkJNgorCisjZGVmaW5lIEFUTV9PQzNfUENSCSgxNTU1MjAwMDAvMjcwKjI2MC84LzUzKQorCQkJLyogT0MzIGxpbmsgcmF0ZTogIDE1NTUyMDAwMCBicHMKKwkJCSAgIFNPTkVUIG92ZXJoZWFkOiAvMjcwKjI2MCAoOSBzZWN0aW9uLCAxIHBhdGgpCisJCQkgICBiaXRzIHBlciBjZWxsOiAgLzgvNTMKKwkJCSAgIG1heCBjZWxsIHJhdGU6ICAzNTMyMDcuNTQ3IGNlbGxzL3NlYyAqLworI2RlZmluZSBBVE1fMjVfUENSCSgoMjU2MDAwMDAvOC04MDAwKS81NCkKKwkJCS8qIDI1IE1icHMgQVRNIGNlbGwgcmF0ZSAoNTkxMTEpICovCisjZGVmaW5lIEFUTV9PQzEyX1BDUgkoNjIyMDgwMDAwLzEwODAqMTA0MC84LzUzKQorCQkJLyogT0MxMiBsaW5rIHJhdGU6IDYyMjA4MDAwMCBicHMKKwkJCSAgIFNPTkVUIG92ZXJoZWFkOiAvMTA4MCoxMDQwCisJCQkgICBiaXRzIHBlciBjZWxsOiAgLzgvNTMKKwkJCSAgIG1heCBjZWxsIHJhdGU6ICAxNDEyODMwLjE4OCBjZWxscy9zZWMgKi8KKyNkZWZpbmUgQVRNX0RTM19QQ1IJKDgwMDAqMTIpCisJCQkvKiBEUzM6IDEyIGNlbGxzIGluIGEgMTI1IHVzZWMgdGltZSBzbG90ICovCisKKworI2RlZmluZSBfX0FBTF9TVEFUX0lURU1TIFwKKyAgICBfX0hBTkRMRV9JVEVNKHR4KTsJCQkvKiBUWCBva2F5ICovIFwKKyAgICBfX0hBTkRMRV9JVEVNKHR4X2Vycik7CQkvKiBUWCBlcnJvcnMgKi8gXAorICAgIF9fSEFORExFX0lURU0ocngpOwkJCS8qIFJYIG9rYXkgKi8gXAorICAgIF9fSEFORExFX0lURU0ocnhfZXJyKTsJCS8qIFJYIGVycm9ycyAqLyBcCisgICAgX19IQU5ETEVfSVRFTShyeF9kcm9wKTsJCS8qIFJYIG91dCBvZiBtZW1vcnkgKi8KKworc3RydWN0IGF0bV9hYWxfc3RhdHMgeworI2RlZmluZSBfX0hBTkRMRV9JVEVNKGkpIGludCBpCisJX19BQUxfU1RBVF9JVEVNUworI3VuZGVmIF9fSEFORExFX0lURU0KK307CisKKworc3RydWN0IGF0bV9kZXZfc3RhdHMgeworCXN0cnVjdCBhdG1fYWFsX3N0YXRzIGFhbDA7CisJc3RydWN0IGF0bV9hYWxfc3RhdHMgYWFsMzQ7CisJc3RydWN0IGF0bV9hYWxfc3RhdHMgYWFsNTsKK30gX19BVE1fQVBJX0FMSUdOOworCisKKyNkZWZpbmUgQVRNX0dFVExJTktSQVRFCV9JT1coJ2EnLEFUTUlPQ19JVEYrMSxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogZ2V0IGxpbmsgcmF0ZSAqLworI2RlZmluZSBBVE1fR0VUTkFNRVMJX0lPVygnYScsQVRNSU9DX0lURiszLHN0cnVjdCBhdG1faW9idWYpCisJCQkJCS8qIGdldCBpbnRlcmZhY2UgbmFtZXMgKG51bWJlcnMpICovCisjZGVmaW5lIEFUTV9HRVRUWVBFCV9JT1coJ2EnLEFUTUlPQ19JVEYrNCxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogZ2V0IGludGVyZmFjZSB0eXBlIG5hbWUgKi8KKyNkZWZpbmUgQVRNX0dFVEVTSQlfSU9XKCdhJyxBVE1JT0NfSVRGKzUsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIGdldCBpbnRlcmZhY2UgRVNJICovCisjZGVmaW5lIEFUTV9HRVRBRERSCV9JT1coJ2EnLEFUTUlPQ19JVEYrNixzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogZ2V0IGl0ZidzIGxvY2FsIEFUTSBhZGRyLiBsaXN0ICovCisjZGVmaW5lIEFUTV9SU1RBRERSCV9JT1coJ2EnLEFUTUlPQ19JVEYrNyxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogcmVzZXQgaXRmJ3MgQVRNIGFkZHJlc3MgbGlzdCAqLworI2RlZmluZSBBVE1fQUREQUREUglfSU9XKCdhJyxBVE1JT0NfSVRGKzgsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIGFkZCBhIGxvY2FsIEFUTSBhZGRyZXNzICovCisjZGVmaW5lIEFUTV9ERUxBRERSCV9JT1coJ2EnLEFUTUlPQ19JVEYrOSxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogcmVtb3ZlIGEgbG9jYWwgQVRNIGFkZHJlc3MgKi8KKyNkZWZpbmUgQVRNX0dFVENJUkFOR0UJX0lPVygnYScsQVRNSU9DX0lURisxMCxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogZ2V0IGNvbm5lY3Rpb24gaWRlbnRpZmllciByYW5nZSAqLworI2RlZmluZSBBVE1fU0VUQ0lSQU5HRQlfSU9XKCdhJyxBVE1JT0NfSVRGKzExLHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiBzZXQgY29ubmVjdGlvbiBpZGVudGlmaWVyIHJhbmdlICovCisjZGVmaW5lIEFUTV9TRVRFU0kJX0lPVygnYScsQVRNSU9DX0lURisxMixzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogc2V0IGludGVyZmFjZSBFU0kgKi8KKyNkZWZpbmUgQVRNX1NFVEVTSUYJX0lPVygnYScsQVRNSU9DX0lURisxMyxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogZm9yY2UgaW50ZXJmYWNlIEVTSSAqLworI2RlZmluZSBBVE1fQURETEVDU0FERFIJX0lPVygnYScsIEFUTUlPQ19JVEYrMTQsIHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiByZWdpc3RlciBhIExFQ1MgYWRkcmVzcyAqLworI2RlZmluZSBBVE1fREVMTEVDU0FERFIJX0lPVygnYScsIEFUTUlPQ19JVEYrMTUsIHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiB1bnJlZ2lzdGVyIGEgTEVDUyBhZGRyZXNzICovCisjZGVmaW5lIEFUTV9HRVRMRUNTQUREUglfSU9XKCdhJywgQVRNSU9DX0lURisxNiwgc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIHJldHJpZXZlIExFQ1MgYWRkcmVzcyhlcykgKi8KKworI2RlZmluZSBBVE1fR0VUU1RBVAlfSU9XKCdhJyxBVE1JT0NfU0FSQ09NKzAsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIGdldCBBQUwgbGF5ZXIgc3RhdGlzdGljcyAqLworI2RlZmluZSBBVE1fR0VUU1RBVFoJX0lPVygnYScsQVRNSU9DX1NBUkNPTSsxLHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiBnZXQgQUFMIGxheWVyIHN0YXRpc3RpY3MgYW5kIHplcm8gKi8KKyNkZWZpbmUgQVRNX0dFVExPT1AJX0lPVygnYScsQVRNSU9DX1NBUkNPTSsyLHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiBnZXQgbG9vcGJhY2sgbW9kZSAqLworI2RlZmluZSBBVE1fU0VUTE9PUAlfSU9XKCdhJyxBVE1JT0NfU0FSQ09NKzMsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIHNldCBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIEFUTV9RVUVSWUxPT1AJX0lPVygnYScsQVRNSU9DX1NBUkNPTSs0LHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiBxdWVyeSBzdXBwb3J0ZWQgbG9vcGJhY2sgbW9kZXMgKi8KKyNkZWZpbmUgQVRNX1NFVFNDCV9JT1coJ2EnLEFUTUlPQ19TUEVDSUFMKzEsaW50KQorCQkJCQkvKiBlbmFibGUgb3IgZGlzYWJsZSBzaW5nbGUtY29weSAqLworI2RlZmluZSBBVE1fU0VUQkFDS0VORAlfSU9XKCdhJyxBVE1JT0NfU1BFQ0lBTCsyLGF0bV9iYWNrZW5kX3QpCisJCQkJCS8qIHNldCBiYWNrZW5kIGhhbmRsZXIgKi8KKyNkZWZpbmUgQVRNX05FV0JBQ0tFTkRJRiBfSU9XKCdhJyxBVE1JT0NfU1BFQ0lBTCszLGF0bV9iYWNrZW5kX3QpCisJCQkJCS8qIHVzZSBiYWNrZW5kIHRvIG1ha2UgbmV3IGlmICovCisjZGVmaW5lIEFUTV9BRERQQVJUWSAgCV9JT1coJ2EnLCBBVE1JT0NfU1BFQ0lBTCs0LHN0cnVjdCBhdG1faW9idWYpCisgCQkJCQkvKiBhZGQgcGFydHkgdG8gcDJtcCBjYWxsICovCisjaWZkZWYgQ09ORklHX0NPTVBBVAorLyogSXQgYWN0dWFsbHkgdGFrZXMgc3RydWN0IHNvY2thZGRyX2F0bXN2Yywgbm90IHN0cnVjdCBhdG1faW9idWYgKi8KKyNkZWZpbmUgQ09NUEFUX0FUTV9BRERQQVJUWSAgCV9JT1coJ2EnLCBBVE1JT0NfU1BFQ0lBTCs0LHN0cnVjdCBjb21wYXRfYXRtX2lvYnVmKQorI2VuZGlmCisjZGVmaW5lIEFUTV9EUk9QUEFSVFkgCV9JT1coJ2EnLCBBVE1JT0NfU1BFQ0lBTCs1LGludCkKKwkJCQkJLyogZHJvcCBwYXJ0eSBmcm9tIHAybXAgY2FsbCAqLworCisvKgorICogVGhlc2UgYXJlIGJhY2tlbmQgaGFuZGtlcnMgdGhhdCBjYW4gYmUgc2V0IHZpYSB0aGUgQVRNX1NFVEJBQ0tFTkQgY2FsbAorICogYWJvdmUuICBJbiB0aGUgZnV0dXJlIHdlIG1heSBzdXBwb3J0IGR5bmFtaWMgbG9hZGluZyBvZiB0aGVzZSAtIGZvciBub3csCisgKiB0aGV5J3JlIGp1c3QgYmVpbmcgdXNlZCB0byBzaGFyZSB0aGUgQVRNSU9DX0JBQ0tFTkQgaW9jdGxzCisgKi8KKyNkZWZpbmUgQVRNX0JBQ0tFTkRfUkFXCQkwCQorI2RlZmluZSBBVE1fQkFDS0VORF9QUFAJCTEJLyogUFBQb0FUTSAtIFJGQzIzNjQgKi8KKyNkZWZpbmUgQVRNX0JBQ0tFTkRfQlIyNjg0CTIJLyogQnJpZGdlZCBSRkMxNDgzLzI2ODQgKi8KKworLyogZm9yIEFUTV9HRVRUWVBFICovCisjZGVmaW5lIEFUTV9JVEZUWVBfTEVOCTgJLyogbWF4aW11bSBsZW5ndGggb2YgaW50ZXJmYWNlIHR5cGUgbmFtZSAqLworCisvKgorICogTG9vcGJhY2sgbW9kZXMgZm9yIEFUTV97UEhZLFNBUn1fe0dFVCxTRVR9TE9PUAorICovCisKKy8qIFBvaW50IG9mIGxvb3BiYWNrCQkJCUNQVS0tPlNBUi0tPlBIWS0tPmxpbmUtLT4gLi4uICovCisjZGVmaW5lIF9fQVRNX0xNX05PTkUJMAkvKiBubyBsb29wIGJhY2sgICAgIF4gICAgIF4gICAgIF4gICAgICBeICAgICAgKi8KKyNkZWZpbmUgX19BVE1fTE1fQUFMCTEJLyogbG9vcCBiYWNrIFBEVXMgLS0nICAgICB8ICAgICB8ICAgICAgfCAgICAgICovCisjZGVmaW5lIF9fQVRNX0xNX0FUTQkyCS8qIGxvb3AgYmFjayBBVE0gY2VsbHMgLS0tJyAgICAgfCAgICAgIHwgICAgICAqLworLyogUkVTRVJWRUQJCTQJbG9vcCBiYWNrIG9uIFBIWSBzaWRlICAtLS0nCQkgICAgICAqLworI2RlZmluZSBfX0FUTV9MTV9QSFkJOAkvKiBsb29wIGJhY2sgYml0cyAoZGlnaXRhbCkgLS0tLScgICAgICB8ICAgICAgKi8KKyNkZWZpbmUgX19BVE1fTE1fQU5BTE9HIDE2CS8qIGxvb3AgYmFjayB0aGUgYW5hbG9nIHNpZ25hbCAtLS0tLS0tLScgICAgICAqLworCisvKiBEaXJlY3Rpb24gb2YgbG9vcGJhY2sgKi8KKyNkZWZpbmUgX19BVE1fTE1fTUtMT0MobikJKChuKSkJICAgIC8qIExvY2FsIChpLmUuIGxvb3AgVFggdG8gUlgpICovCisjZGVmaW5lIF9fQVRNX0xNX01LUk1UKG4pCSgobikgPDwgOCkgIC8qIFJlbW90ZSAoaS5lLiBsb29wIFJYIHRvIFRYKSAqLworCisjZGVmaW5lIF9fQVRNX0xNX1hUTE9DKG4pCSgobikgJiAweGZmKQorI2RlZmluZSBfX0FUTV9MTV9YVFJNVChuKQkoKChuKSA+PiA4KSAmIDB4ZmYpCisKKyNkZWZpbmUgQVRNX0xNX05PTkUJMAkvKiBubyBsb29wYmFjayAqLworCisjZGVmaW5lIEFUTV9MTV9MT0NfQUFMCV9fQVRNX0xNX01LTE9DKF9fQVRNX0xNX0FBTCkKKyNkZWZpbmUgQVRNX0xNX0xPQ19BVE0JX19BVE1fTE1fTUtMT0MoX19BVE1fTE1fQVRNKQorI2RlZmluZSBBVE1fTE1fTE9DX1BIWQlfX0FUTV9MTV9NS0xPQyhfX0FUTV9MTV9QSFkpCisjZGVmaW5lIEFUTV9MTV9MT0NfQU5BTE9HIF9fQVRNX0xNX01LTE9DKF9fQVRNX0xNX0FOQUxPRykKKworI2RlZmluZSBBVE1fTE1fUk1UX0FBTAlfX0FUTV9MTV9NS1JNVChfX0FUTV9MTV9BQUwpCisjZGVmaW5lIEFUTV9MTV9STVRfQVRNCV9fQVRNX0xNX01LUk1UKF9fQVRNX0xNX0FUTSkKKyNkZWZpbmUgQVRNX0xNX1JNVF9QSFkJX19BVE1fTE1fTUtSTVQoX19BVE1fTE1fUEhZKQorI2RlZmluZSBBVE1fTE1fUk1UX0FOQUxPRyBfX0FUTV9MTV9NS1JNVChfX0FUTV9MTV9BTkFMT0cpCisKKy8qCisgKiBOb3RlOiBBVE1fTE1fTE9DXyogYW5kIEFUTV9MTV9STVRfKiBjYW4gYmUgY29tYmluZWQsIHByb3ZpZGVkIHRoYXQKKyAqIF9fQVRNX0xNX1hUTE9DKHgpIDw9IF9fQVRNX0xNX1hUUk1UKHgpCisgKi8KKworCitzdHJ1Y3QgYXRtX2lvYnVmIHsKKwlpbnQgbGVuZ3RoOworCXZvaWQgKmJ1ZmZlcjsKK307CisKKy8qIGZvciBBVE1fR0VUQ0lSQU5HRSAvIEFUTV9TRVRDSVJBTkdFICovCisKKyNkZWZpbmUgQVRNX0NJX01BWCAgICAgIC0xICAgICAgICAgICAgICAvKiB1c2UgbWF4aW11bSByYW5nZSBvZiBWUEkvVkNJICovCisgCitzdHJ1Y3QgYXRtX2NpcmFuZ2UgeworCXNpZ25lZCBjaGFyCXZwaV9iaXRzOwkvKiAxLi44LCBBVE1fQ0lfTUFYICgtMSkgZm9yIG1heGltdW0gKi8KKwlzaWduZWQgY2hhcgl2Y2lfYml0czsJLyogMS4uMTYsIEFUTV9DSV9NQVggKC0xKSBmb3IgbWF4aW11bSAqLworfTsKKworLyogZm9yIEFUTV9TRVRTQzsgYWN0dWFsbHkgdGFrZW4gZnJvbSB0aGUgQVRNX1ZGIG51bWJlciBzcGFjZSAqLworCisjZGVmaW5lIEFUTV9TQ19SWAkxMDI0CQkvKiBlbmFibGUgUlggc2luZ2xlLWNvcHkgKi8KKyNkZWZpbmUgQVRNX1NDX1RYCTIwNDgJCS8qIGVuYWJsZSBUWCBzaW5nbGUtY29weSAqLworCisjZGVmaW5lIEFUTV9CQUNLTE9HX0RFRkFVTFQgMzIgLyogaWYgd2UgZ2V0IG1vcmUsIHdlJ3JlIGxpa2VseSB0byB0aW1lIG91dAorCQkJCSAgYW55d2F5ICovCisKKy8qIE1GOiBjaGFuZ2VfcW9zIChNb2RpZnkpIGZsYWdzICovCisKKyNkZWZpbmUgQVRNX01GX0lNTUVECSAxCS8qIEJsb2NrIHVudGlsIGNoYW5nZSBpcyBlZmZlY3RpdmUgKi8KKyNkZWZpbmUgQVRNX01GX0lOQ19SU1YJIDIJLyogQ2hhbmdlIHJlc2VydmF0aW9uIG9uIGluY3JlYXNlICovCisjZGVmaW5lIEFUTV9NRl9JTkNfU0hQCSA0CS8qIENoYW5nZSBzaGFwaW5nIG9uIGluY3JlYXNlICovCisjZGVmaW5lIEFUTV9NRl9ERUNfUlNWCSA4CS8qIENoYW5nZSByZXNlcnZhdGlvbiBvbiBkZWNyZWFzZSAqLworI2RlZmluZSBBVE1fTUZfREVDX1NIUAkxNgkvKiBDaGFuZ2Ugc2hhcGluZyBvbiBkZWNyZWFzZSAqLworI2RlZmluZSBBVE1fTUZfQldECTMyCS8qIFNldCB0aGUgYmFja3dhcmQgZGlyZWN0aW9uIHBhcmFtZXRlcnMgKi8KKworI2RlZmluZSBBVE1fTUZfU0VUCShBVE1fTUZfSU5DX1JTViB8IEFUTV9NRl9JTkNfU0hQIHwgQVRNX01GX0RFQ19SU1YgfCBcCisJCQkgIEFUTV9NRl9ERUNfU0hQIHwgQVRNX01GX0JXRCkKKworLyoKKyAqIEFUTV9WU18qIGFyZSB1c2VkIHRvIGV4cHJlc3MgVkMgc3RhdGUgaW4gYSBodW1hbi1mcmllbmRseSB3YXkuCisgKi8KKworI2RlZmluZSBBVE1fVlNfSURMRQkwCS8qIFZDIGlzIG5vdCB1c2VkICovCisjZGVmaW5lIEFUTV9WU19DT05ORUNURUQgMQkvKiBWQyBpcyBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgQVRNX1ZTX0NMT1NJTkcJMgkvKiBWQyBpcyBjbG9zaW5nICovCisjZGVmaW5lIEFUTV9WU19MSVNURU4JMwkvKiBWQyBpcyBsaXN0ZW5pbmcgZm9yIGluY29taW5nIHNldHVwcyAqLworI2RlZmluZSBBVE1fVlNfSU5VU0UJNAkvKiBWQyBpcyBpbiB1c2UgKHJlZ2lzdGVyZWQgd2l0aCBhdG1zaWdkKSAqLworI2RlZmluZSBBVE1fVlNfQk9VTkQJNQkvKiBWQyBpcyBib3VuZCAqLworCisjZGVmaW5lIEFUTV9WUzJUWFRfTUFQIFwKKyAgICAiSURMRSIsICJDT05ORUNURUQiLCAiQ0xPU0lORyIsICJMSVNURU4iLCAiSU5VU0UiLCAiQk9VTkQiCisKKyNkZWZpbmUgQVRNX1ZGMlRYVF9NQVAgXAorICAgICJBRERSIiwJIlJFQURZIiwJIlBBUlRJQUwiLAkiUkVHSVMiLCBcCisgICAgIlJFTEVBU0VEIiwgIkhBU1FPUyIsCSJMSVNURU4iLAkiTUVUQSIsIFwKKyAgICAiMjU2IiwJIjUxMiIsCQkiMTAyNCIsCQkiMjA0OCIsIFwKKyAgICAiU0VTU0lPTiIsCSJIQVNTQVAiLAkiQk9VTkQiLAkiQ0xPU0UiCisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtaW9jLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWlvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZjY3YWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWlvYy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIGF0bWlvYy5oIC0gcmFuZ2VzIGZvciBBVE0tcmVsYXRlZCBpb2N0bCBudW1iZXJzICovCisgCisvKiBXcml0dGVuIDE5OTUtMTk5OSBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworCisKKy8qCisgKiBTZWUgaHR0cDovL2ljYXd3dzEuZXBmbC5jaC9saW51eC1hdG0vbWFnaWMuaHRtbCBmb3IgdGhlIGNvbXBsZXRlIGxpc3Qgb2YKKyAqICJtYWdpYyIgaW9jdGwgbnVtYmVycy4KKyAqLworCisKKyNpZm5kZWYgX0xJTlVYX0FUTUlPQ19ICisjZGVmaW5lIF9MSU5VWF9BVE1JT0NfSAorCisjaW5jbHVkZSA8YXNtL2lvY3RsLmg+CisJCS8qIGV2ZXJ5Ym9keSBpbmNsdWRpbmcgYXRtaW9jLmggd2lsbCBhbHNvIG5lZWQgX0lPeyxSLFcsV1J9ICovCisKKyNkZWZpbmUgQVRNSU9DX1BIWUNPTQkgIDB4MDAgLyogUEhZIGRldmljZSBjb21tb24gaW9jdGxzLCBnbG9iYWxseSB1bmlxdWUgKi8KKyNkZWZpbmUgQVRNSU9DX1BIWUNPTV9FTkQgMHgwZgorI2RlZmluZSBBVE1JT0NfUEhZVFlQCSAgMHgxMCAvKiBQSFkgZGV2IHR5cGUgaW9jdGxzLCB1bmlxdWUgcGVyIFBIWSB0eXBlICovCisjZGVmaW5lIEFUTUlPQ19QSFlUWVBfRU5EIDB4MmYKKyNkZWZpbmUgQVRNSU9DX1BIWVBSVgkgIDB4MzAgLyogUEhZIGRldiBwcml2YXRlIGlvY3RscywgdW5pcXVlIHBlciBkcml2ZXIgKi8KKyNkZWZpbmUgQVRNSU9DX1BIWVBSVl9FTkQgMHg0ZgorI2RlZmluZSBBVE1JT0NfU0FSQ09NCSAgMHg1MCAvKiBTQVIgZGV2aWNlIGNvbW1vbiBpb2N0bHMsIGdsb2JhbGx5IHVuaXF1ZSAqLworI2RlZmluZSBBVE1JT0NfU0FSQ09NX0VORCAweDUwCisjZGVmaW5lIEFUTUlPQ19TQVJQUlYJICAweDYwIC8qIFNBUiBkZXYgcHJpdmF0ZSBpb2N0bHMsIHVuaXF1ZSBwZXIgZHJpdmVyICovCisjZGVmaW5lIEFUTUlPQ19TQVJQUlZfRU5EIDB4N2YKKyNkZWZpbmUgQVRNSU9DX0lURgkgIDB4ODAgLyogSW50ZXJmYWNlIGlvY3RscywgZ2xvYmFsbHkgdW5pcXVlICovCisjZGVmaW5lIEFUTUlPQ19JVEZfRU5ECSAgMHg4ZgorI2RlZmluZSBBVE1JT0NfQkFDS0VORAkgIDB4OTAgLyogQVRNIGdlbmVyaWMgYmFja2VuZCBpb2N0bHMsIHUuIHBlciBiYWNrZW5kICovCisjZGVmaW5lIEFUTUlPQ19CQUNLRU5EX0VORCAweGFmCisvKiAweGIwLTB4YmY6IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisjZGVmaW5lIEFUTUlPQ19BUkVRVUlQQQkgIDB4YzAgLyogQXBwbGljYXRpb24gcmVxdWVzdGVkIElQIG92ZXIgQVRNLCBnbG9iLiB1LiAqLworI2RlZmluZSBBVE1JT0NfTEFORQkgIDB4ZDAgLyogTEFOIEVtdWxhdGlvbiwgZ2xvYmFsbHkgdW5pcXVlICovCisjZGVmaW5lIEFUTUlPQ19NUE9BICAgICAgIDB4ZDggLyogTVBPQSwgZ2xvYmFsbHkgdW5pcXVlICovCisjZGVmaW5lCUFUTUlPQ19DTElQCSAgMHhlMCAvKiBDbGFzc2ljYWwgSVAgb3ZlciBBVE0gY29udHJvbCwgZ2xvYmFsbHkgdS4gKi8KKyNkZWZpbmUJQVRNSU9DX0NMSVBfRU5ECSAgMHhlZgorI2RlZmluZQlBVE1JT0NfU1BFQ0lBTAkgIDB4ZjAgLyogU3BlY2lhbC1wdXJwb3NlIGNvbnRyb2xzLCBnbG9iYWxseSB1bmlxdWUgKi8KKyNkZWZpbmUJQVRNSU9DX1NQRUNJQUxfRU5EIDB4ZmYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWxlYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1sZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWM5MTdmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1sZWMuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQVRNIExhbiBFbXVsYXRpb24gRGFlbW9uIGRyaXZlciBpbnRlcmZhY2UKKyAqCisgKiBNYXJrbyBLaWlza2lsYSA8bWtpaXNraWxhQHlhaG9vLmNvbT4KKyAqLworCisjaWZuZGVmIF9BVE1MRUNfSF8KKyNkZWZpbmUgX0FUTUxFQ19IXworCisjaW5jbHVkZSA8bGludXgvYXRtYXBpLmg+CisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisjaW5jbHVkZSA8bGludXgvYXRtLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBBVE0gbGVjIGRhZW1vbiBjb250cm9sIHNvY2tldCAqLworI2RlZmluZSBBVE1MRUNfQ1RSTAlfSU8oJ2EnLCBBVE1JT0NfTEFORSkKKyNkZWZpbmUgQVRNTEVDX0RBVEEJX0lPKCdhJywgQVRNSU9DX0xBTkUrMSkKKyNkZWZpbmUgQVRNTEVDX01DQVNUCV9JTygnYScsIEFUTUlPQ19MQU5FKzIpCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIExFQyBpbnRlcmZhY2VzICh0d2Vha2FibGUpICovCisjZGVmaW5lIE1BWF9MRUNfSVRGIDQ4CisKKy8qCisgKiBGcm9tIHRoZSB0b3RhbCBvZiBNQVhfTEVDX0lURiwgbGFzdCBOVU1fVFJfREVWUyBhcmUgcmVzZXJ2ZWQgZm9yIFRva2VuIFJpbmcuCisgKiBFLmcuIGlmIE1BWF9MRUNfSVRGID0gNDggYW5kIE5VTV9UUl9ERVZTID0gOCwgdGhlbiBsZWMwLWxlYzM5IGFyZSBmb3IKKyAqIEV0aGVybmV0IEVMQU5zIGFuZCBsZWM0MC1sZWM0NyBhcmUgZm9yIFRva2VuIFJpbmcgRUxBTlMuCisgKi8KKyNkZWZpbmUgTlVNX1RSX0RFVlMgOAorCit0eXBlZGVmIGVudW0geworCWxfc2V0X21hY19hZGRyLAorCWxfZGVsX21hY19hZGRyLAorCWxfc3ZjX3NldHVwLAorCWxfYWRkcl9kZWxldGUsCisJbF90b3BvbG9neV9jaGFuZ2UsCisJbF9mbHVzaF9jb21wbGV0ZSwKKwlsX2FycF91cGRhdGUsCisJbF9uYXJwX3JlcSwJCS8qIExBTkUyIG1hbmRhdGVzIHRoZSB1c2Ugb2YgdGhpcyAqLworCWxfY29uZmlnLAorCWxfZmx1c2hfdHJhbl9pZCwKKwlsX3NldF9sZWNpZCwKKwlsX2FycF94bXQsCisJbF9yZGVzY19hcnBfeG10LAorCWxfYXNzb2NpYXRlX3JlcSwKKwlsX3Nob3VsZF9icmlkZ2UJCS8qIHNob3VsZCB3ZSBicmlkZ2UgdGhpcyBNQUM/ICovCit9IGF0bWxlY19tc2dfdHlwZTsKKworI2RlZmluZSBBVE1MRUNfTVNHX1RZUEVfTUFYIGxfc2hvdWxkX2JyaWRnZQorCitzdHJ1Y3QgYXRtbGVjX2NvbmZpZ19tc2cgeworCXVuc2lnbmVkIGludCBtYXhpbXVtX3Vua25vd25fZnJhbWVfY291bnQ7CisJdW5zaWduZWQgaW50IG1heF91bmtub3duX2ZyYW1lX3RpbWU7CisJdW5zaWduZWQgc2hvcnQgbWF4X3JldHJ5X2NvdW50OworCXVuc2lnbmVkIGludCBhZ2luZ190aW1lOworCXVuc2lnbmVkIGludCBmb3J3YXJkX2RlbGF5X3RpbWU7CisJdW5zaWduZWQgaW50IGFycF9yZXNwb25zZV90aW1lOworCXVuc2lnbmVkIGludCBmbHVzaF90aW1lb3V0OworCXVuc2lnbmVkIGludCBwYXRoX3N3aXRjaGluZ19kZWxheTsKKwl1bnNpZ25lZCBpbnQgbGFuZV92ZXJzaW9uOwkvKiBMQU5FMjogMSBmb3IgTEFORXYxLCAyIGZvciBMQU5FdjIgKi8KKwlpbnQgbXR1OworCWludCBpc19wcm94eTsKK307CisKK3N0cnVjdCBhdG1sZWNfbXNnIHsKKwlhdG1sZWNfbXNnX3R5cGUgdHlwZTsKKwlpbnQgc2l6ZW9mdGx2czsJCS8qIExBTkUyOiBpZiAhPSAwLCB0bHZzIGZvbGxvdyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGNoYXIgbWFjX2FkZHJbRVRIX0FMRU5dOworCQkJdW5zaWduZWQgY2hhciBhdG1fYWRkcltBVE1fRVNBX0xFTl07CisJCQl1bnNpZ25lZCBpbnQgZmxhZzsJLyoKKwkJCQkJCSAqIFRvcG9sb2d5X2NoYW5nZSBmbGFnLAorCQkJCQkJICogcmVtb3RlZmxhZywgcGVybWFuZW50IGZsYWcsCisJCQkJCQkgKiBsZWNpZCwgdHJhbnNhY3Rpb24gaWQKKwkJCQkJCSAqLworCQkJdW5zaWduZWQgaW50IHRhcmdldGxlc3NfbGVfYXJwOwkvKiBMQU5FMiAqLworCQkJdW5zaWduZWQgaW50IG5vX3NvdXJjZV9sZV9uYXJwOwkvKiBMQU5FMiAqLworCQl9IG5vcm1hbDsKKwkJc3RydWN0IGF0bWxlY19jb25maWdfbXNnIGNvbmZpZzsKKwkJc3RydWN0IHsKKwkJCV9fdTE2IGxlY19pZDsJCQkJLyogcmVxdWVzdG9yIGxlY19pZCAgKi8KKwkJCV9fdTMyIHRyYW5faWQ7CQkJCS8qIHRyYW5zYWN0aW9uIGlkICAgICovCisJCQl1bnNpZ25lZCBjaGFyIG1hY19hZGRyW0VUSF9BTEVOXTsJLyogZHN0IG1hYyBhZGRyICAgICAgKi8KKwkJCXVuc2lnbmVkIGNoYXIgYXRtX2FkZHJbQVRNX0VTQV9MRU5dOwkvKiByZXFlc3RvciBBVE0gYWRkciAqLworCQl9IHByb3h5OwkvKgorCQkJCSAqIEZvciBtYXBwaW5nIExFX0FSUCByZXF1ZXN0cyB0byByZXNwb25zZXMuIEZpbGxlZCBieQorCQkJCSAqIHplcHBlbGluLCByZXR1cm5lZCBieSBrZXJuZWwuIFVzZWQgb25seSB3aGVuIHByb3h5aW5nCisJCQkJICovCisJfSBjb250ZW50OworfSBfX0FUTV9BUElfQUxJR047CisKK3N0cnVjdCBhdG1sZWNfaW9jIHsKKwlpbnQgZGV2X251bTsKKwl1bnNpZ25lZCBjaGFyIGF0bV9hZGRyW0FUTV9FU0FfTEVOXTsKKwl1bnNpZ25lZCBjaGFyIHJlY2VpdmU7CS8qIDE9IHJlY2VpdmUgdmNjLCAwID0gc2VuZCB2Y2MgKi8KK307CisjZW5kaWYgLyogX0FUTUxFQ19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1tcGMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtbXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiYTU3OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtbXBjLmgKQEAgLTAsMCArMSwxMjYgQEAKKyNpZm5kZWYgX0FUTU1QQ19IXworI2RlZmluZSBfQVRNTVBDX0hfCisKKyNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEFUTU1QQ19DVFJMIF9JTygnYScsIEFUTUlPQ19NUE9BKQorI2RlZmluZSBBVE1NUENfREFUQSBfSU8oJ2EnLCBBVE1JT0NfTVBPQSsxKQorCisjZGVmaW5lIE1QQ19TT0NLRVRfSU5HUkVTUyAxCisjZGVmaW5lIE1QQ19TT0NLRVRfRUdSRVNTICAyCisKK3N0cnVjdCBhdG1tcGNfaW9jIHsKKyAgICAgICAgaW50IGRldl9udW07CisgICAgICAgIF9fYmUzMiBpcGFkZHI7ICAgICAgICAgICAgICAvKiB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgc2hvcnRjdXQgICAgKi8KKyAgICAgICAgaW50IHR5cGU7ICAgICAgICAgICAgICAgICAgICAgLyogaW5ncmVzcyBvciBlZ3Jlc3MgICAgICAgICAgICAgICAgICovCit9OworCit0eXBlZGVmIHN0cnVjdCBpbl9jdHJsX2luZm8geworICAgICAgICBfX3U4ICAgTGFzdF9OSFJQX0NJRV9jb2RlOworICAgICAgICBfX3U4ICAgTGFzdF9RMjkzMV9jYXVzZV92YWx1ZTsKKyAgICAgICAgX191OCAgIGVnX01QQ19BVE1fYWRkcltBVE1fRVNBX0xFTl07CisgICAgICAgIF9fYmUzMiAgdGFnOworICAgICAgICBfX2JlMzIgIGluX2RzdF9pcDsgICAgICAvKiBJUCBhZGRyZXNzIHRoaXMgaW5ncmVzcyBNUEMgc2VuZHMgcGFja2V0cyB0byAqLworICAgICAgICBfX3UxNiAgaG9sZGluZ190aW1lOworICAgICAgICBfX3UzMiAgcmVxdWVzdF9pZDsKK30gaW5fY3RybF9pbmZvOworCit0eXBlZGVmIHN0cnVjdCBlZ19jdHJsX2luZm8geworICAgICAgICBfX3U4ICAgRExMX2hlYWRlclsyNTZdOworICAgICAgICBfX3U4ICAgREhfbGVuZ3RoOworICAgICAgICBfX2JlMzIgIGNhY2hlX2lkOworICAgICAgICBfX2JlMzIgIHRhZzsKKyAgICAgICAgX19iZTMyICBtcHNfaXA7CisgICAgICAgIF9fYmUzMiAgZWdfZHN0X2lwOyAgICAgIC8qIElQIGFkZHJlc3MgdG8gd2hpY2ggaW5ncmVzcyBNUEMgc2VuZHMgcGFja2V0cyAqLworICAgICAgICBfX3U4ICAgaW5fTVBDX2RhdGFfQVRNX2FkZHJbQVRNX0VTQV9MRU5dOworICAgICAgICBfX3UxNiAgaG9sZGluZ190aW1lOworfSBlZ19jdHJsX2luZm87CisKK3N0cnVjdCBtcGNfcGFyYW1ldGVycyB7CisgICAgICAgIF9fdTE2IG1wY19wMTsgICAvKiBTaG9ydGN1dC1TZXR1cCBGcmFtZSBDb3VudCAgICAqLworICAgICAgICBfX3UxNiBtcGNfcDI7ICAgLyogU2hvcnRjdXQtU2V0dXAgRnJhbWUgVGltZSAgICAgKi8KKyAgICAgICAgX191OCBtcGNfcDNbOF07IC8qIEZsb3ctZGV0ZWN0aW9uIFByb3RvY29scyAgICAgICovCisgICAgICAgIF9fdTE2IG1wY19wNDsgICAvKiBNUEMgSW5pdGlhbCBSZXRyeSBUaW1lICAgICAgICAqLworICAgICAgICBfX3UxNiBtcGNfcDU7ICAgLyogTVBDIFJldHJ5IFRpbWUgTWF4aW11bSAgICAgICAgKi8KKyAgICAgICAgX191MTYgbXBjX3A2OyAgIC8qIEhvbGQgRG93biBUaW1lICAgICAgICAgICAgICAgICovCit9IDsKKworc3RydWN0IGtfbWVzc2FnZSB7CisgICAgICAgIF9fdTE2IHR5cGU7CisgICAgICAgIF9fYmUzMiBpcF9tYXNrOworICAgICAgICBfX3U4ICBNUFNfY3RybFtBVE1fRVNBX0xFTl07CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICBpbl9jdHJsX2luZm8gaW5faW5mbzsKKyAgICAgICAgICAgICAgICBlZ19jdHJsX2luZm8gZWdfaW5mbzsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgbXBjX3BhcmFtZXRlcnMgcGFyYW1zOworICAgICAgICB9IGNvbnRlbnQ7CisgICAgICAgIHN0cnVjdCBhdG1fcW9zIHFvczsgICAgICAgCit9IF9fQVRNX0FQSV9BTElHTjsKKworc3RydWN0IGxsY19zbmFwX2hkciB7CisJLyogUkZDIDE0ODMgTExDL1NOQVAgZW5jYXBzdWxhdGlvbiBmb3Igcm91dGVkIElQIFBEVXMgKi8KKyAgICAgICAgX191OCAgZHNhcDsgICAgLyogRGVzdGluYXRpb24gU2VydmljZSBBY2Nlc3MgUG9pbnQgKDB4QUEpICAgICAqLworICAgICAgICBfX3U4ICBzc2FwOyAgICAvKiBTb3VyY2UgU2VydmljZSBBY2Nlc3MgUG9pbnQgICAgICAoMHhBQSkgICAgICovCisgICAgICAgIF9fdTggIHVpOyAgICAgIC8qIFVubnVtYmVyZWQgSW5mb3JtYXRpb24gICAgICAgICAgICgweDAzKSAgICAgKi8KKyAgICAgICAgX191OCAgb3JnWzNdOyAgLyogT3JnYW5pemF0aW9uYWwgaWRlbnRpZmljYXRpb24gICAgKDB4MDAwMDAwKSAqLworICAgICAgICBfX3U4ICB0eXBlWzJdOyAvKiBFdGhlciB0eXBlIChmb3IgSVApICAgICAgICAgICAgICAoMHgwODAwKSAgICovCit9OworCisvKiBUTFZzIHRoaXMgTVBDIHJlY29nbml6ZXMgKi8KKyNkZWZpbmUgVExWX01QT0FfREVWSUNFX1RZUEUgICAgICAgICAweDAwYTAzZTJhICAKKworLyogTVBPQSBkZXZpY2UgdHlwZXMgaW4gTVBPQSBEZXZpY2UgVHlwZSBUTFYgKi8KKyNkZWZpbmUgTk9OX01QT0EgICAgMAorI2RlZmluZSBNUFMgICAgICAgICAxCisjZGVmaW5lIE1QQyAgICAgICAgIDIKKyNkZWZpbmUgTVBTX0FORF9NUEMgMworCisKKy8qIE1QQyBwYXJhbWV0ZXIgZGVmYXVsdHMgKi8KKworI2RlZmluZSBNUENfUDEgMTAgIC8qIFNob3J0Y3V0LVNldHVwIEZyYW1lIENvdW50ICAqLyAKKyNkZWZpbmUgTVBDX1AyIDEgICAvKiBTaG9ydGN1dC1TZXR1cCBGcmFtZSBUaW1lICAgKi8KKyNkZWZpbmUgTVBDX1AzIDAgICAvKiBGbG93LWRldGVjdGlvbiBQcm90b2NvbHMgICAgKi8KKyNkZWZpbmUgTVBDX1A0IDUgICAvKiBNUEMgSW5pdGlhbCBSZXRyeSBUaW1lICAgICAgKi8KKyNkZWZpbmUgTVBDX1A1IDQwICAvKiBNUEMgUmV0cnkgVGltZSBNYXhpbXVtICAgICAgKi8KKyNkZWZpbmUgTVBDX1A2IDE2MCAvKiBIb2xkIERvd24gVGltZSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSE9MRElOR19USU1FX0RFRkFVTFQgMTIwMCAvKiBzYW1lIGFzIE1QUy1wNyAqLworCisvKiBNUEMgY29uc3RhbnRzICovCisKKyNkZWZpbmUgTVBDX0MxIDIgICAvKiBSZXRyeSBUaW1lIE11bHRpcGxpZXIgICAgICAgKi8KKyNkZWZpbmUgTVBDX0MyIDYwICAvKiBJbml0aWFsIEtlZXAtQWxpdmUgTGlmZXRpbWUgKi8KKworLyogTWVzc2FnZSB0eXBlcyAtIHRvIE1QT0EgZGFlbW9uICovCisKKyNkZWZpbmUgU05EX01QT0FfUkVTX1JRU1QgICAgMjAxCisjZGVmaW5lIFNFVF9NUFNfQ1RSTF9BRERSICAgIDIwMgorI2RlZmluZSBTTkRfTVBPQV9SRVNfUlRSWSAgICAyMDMgLyogRGlmZmVyZW50IHR5cGUgaW4gYSByZXRyeSBkdWUgdG8gcmVxIGlkICAgICAgICAgKi8KKyNkZWZpbmUgU1RPUF9LRUVQX0FMSVZFX1NNICAgMjA0CisjZGVmaW5lIEVHUkVTU19FTlRSWV9SRU1PVkVEIDIwNQorI2RlZmluZSBTTkRfRUdSRVNTX1BVUkdFICAgICAyMDYKKyNkZWZpbmUgRElFICAgICAgICAgICAgICAgICAgMjA3IC8qIHRlbGwgdGhlIGRhZW1vbiB0byBleGl0KCkgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERBVEFfUExBTkVfUFVSR0UgICAgIDIwOCAvKiBEYXRhIHBsYW5lIHB1cmdlIGJlY2F1c2Ugb2YgZWdyZXNzIGNhY2hlIGhpdCBtaXNzIG9yIGRlYWQgTVBTICovCisjZGVmaW5lIE9QRU5fSU5HUkVTU19TVkMgICAgIDIwOQorCisvKiBNZXNzYWdlIHR5cGVzIC0gZnJvbSBNUE9BIGRhZW1vbiAqLworCisjZGVmaW5lIE1QT0FfVFJJR0dFUl9SQ1ZEICAgICAxMDEKKyNkZWZpbmUgTVBPQV9SRVNfUkVQTFlfUkNWRCAgIDEwMgorI2RlZmluZSBJTkdSRVNTX1BVUkdFX1JDVkQgICAgMTAzCisjZGVmaW5lIEVHUkVTU19QVVJHRV9SQ1ZEICAgICAxMDQKKyNkZWZpbmUgTVBTX0RFQVRIICAgICAgICAgICAgIDEwNQorI2RlZmluZSBDQUNIRV9JTVBPU19SQ1ZEICAgICAgMTA2CisjZGVmaW5lIFNFVF9NUENfQ1RSTF9BRERSICAgICAxMDcgLyogT3VyIE1QQydzIGNvbnRyb2wgQVRNIGFkZHJlc3MgICAqLworI2RlZmluZSBTRVRfTVBTX01BQ19BRERSICAgICAgMTA4CisjZGVmaW5lIENMRUFOX1VQX0FORF9FWElUICAgICAxMDkKKyNkZWZpbmUgU0VUX01QQ19QQVJBTVMgICAgICAgIDExMCAvKiBNUEMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICAgICovCisKKy8qIE1lc3NhZ2UgdHlwZXMgLSBiaWRpcmVjdGlvbmFsICovICAgICAgIAorCisjZGVmaW5lIFJFTE9BRCAgICAgICAgICAgICAgICAzMDEgLyoga2lsbCAtSFVQIHRoZSBkYWVtb24gZm9yIHJlbG9hZCAqLworCisjZW5kaWYgLyogX0FUTU1QQ19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1wcHAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtcHBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwZGNjZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtcHBwLmgKQEAgLTAsMCArMSwyNCBAQAorLyogYXRtcHBwLmggLSBSRkMyMzY0IFBQUG9BVE0gKi8KKworLyogV3JpdHRlbiAyMDAwIGJ5IE1pdGNoZWxsIEJsYW5rIEpyICovCisKKyNpZm5kZWYgX0xJTlVYX0FUTVBQUF9ICisjZGVmaW5lIF9MSU5VWF9BVE1QUFBfSAorCisjaW5jbHVkZSA8bGludXgvYXRtLmg+CisKKyNkZWZpbmUgUFBQT0FUTV9FTkNBUFNfQVVUT0RFVEVDVAkoMCkKKyNkZWZpbmUgUFBQT0FUTV9FTkNBUFNfVkMJCSgxKQorI2RlZmluZSBQUFBPQVRNX0VOQ0FQU19MTEMJCSgyKQorCisvKgorICogVGhpcyBpcyBmb3IgdGhlIEFUTV9TRVRCQUNLRU5EIGNhbGwgLSB0aGVzZSBhcmUgbGlrZSBzb2NrZXQgZmFtaWxpZXM6CisgKiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc3RydWN0dXJlIGlzIHRoZSBiYWNrZW5kIG51bWJlciBhbmQgdGhlIHJlc3QKKyAqIGlzIHBlci1iYWNrZW5kIHNwZWNpZmljCisgKi8KK3N0cnVjdCBhdG1fYmFja2VuZF9wcHAgeworCWF0bV9iYWNrZW5kX3QJYmFja2VuZF9udW07CS8qIEFUTV9CQUNLRU5EX1BQUCAqLworCWludAkJZW5jYXBzOwkJLyogUFBQT0FUTV9FTkNBUFNfKiAqLworfTsKKworI2VuZGlmCS8qIF9MSU5VWF9BVE1QUFBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1zYXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtc2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5YjEwNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtc2FwLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qIGF0bXNhcC5oIC0gQVRNIFNlcnZpY2UgQWNjZXNzIFBvaW50IGFkZHJlc3NpbmcgZGVmaW5pdGlvbnMgKi8KKworLyogV3JpdHRlbiAxOTk1LTE5OTkgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworCisjaWZuZGVmIF9MSU5VWF9BVE1TQVBfSAorI2RlZmluZSBfTElOVVhfQVRNU0FQX0gKKworI2luY2x1ZGUgPGxpbnV4L2F0bWFwaS5oPgorCisvKgorICogQkVHSU5feHggYW5kIEVORF94eCBtYXJrZXJzIGFyZSB1c2VkIGZvciBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZgorICogZG9jdW1lbnRhdGlvbi4gRG8gbm90IGNoYW5nZSB0aGVtLgorICovCisKKworLyoKKyAqIExheWVyIDIgcHJvdG9jb2wgaWRlbnRpZmllcnMKKyAqLworCisvKiBCRUdJTl9MMiAqLworI2RlZmluZSBBVE1fTDJfTk9ORQkwCS8qIEwyIG5vdCBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgQVRNX0wyX0lTTzE3NDUgIDB4MDEJLyogQmFzaWMgbW9kZSBJU08gMTc0NSAqLworI2RlZmluZSBBVE1fTDJfUTI5MQkweDAyCS8qIElUVS1UIFEuMjkxIChSZWMuIEkuNDQxKSAqLworI2RlZmluZSBBVE1fTDJfWDI1X0xMCTB4MDYJLyogSVRVLVQgWC4yNSwgbGluayBsYXllciAqLworI2RlZmluZSBBVE1fTDJfWDI1X01MCTB4MDcJLyogSVRVLVQgWC4yNSwgbXVsdGlsaW5rICovCisjZGVmaW5lIEFUTV9MMl9MQVBCCTB4MDgJLyogRXh0ZW5kZWQgTEFQQiwgaGFsZi1kdXBsZXggKFJlYy4gVC43MSkgKi8KKyNkZWZpbmUgQVRNX0wyX0hETENfQVJNCTB4MDkJLyogSERMQyBBUk0gKElTTy9JRUMgNDMzNSkgKi8KKyNkZWZpbmUgQVRNX0wyX0hETENfTlJNCTB4MGEJLyogSERMQyBOUk0gKElTTy9JRUMgNDMzNSkgKi8KKyNkZWZpbmUgQVRNX0wyX0hETENfQUJNCTB4MGIJLyogSERMQyBBQk0gKElTTy9JRUMgNDMzNSkgKi8KKyNkZWZpbmUgQVRNX0wyX0lTTzg4MDIJMHgwYwkvKiBMQU4gTExDIChJU08vSUVDIDg4MDIvMikgKi8KKyNkZWZpbmUgQVRNX0wyX1g3NQkweDBkCS8qIElUVS1UIFguNzUsIFNMUCAqLworI2RlZmluZSBBVE1fTDJfUTkyMgkweDBlCS8qIElUVS1UIFEuOTIyICovCisjZGVmaW5lIEFUTV9MMl9VU0VSCTB4MTAJLyogdXNlci1zcGVjaWZpZWQgKi8KKyNkZWZpbmUgQVRNX0wyX0lTTzc3NzYJMHgxMQkvKiBJU08gNzc3NiBEVEUtRFRFICovCisvKiBFTkRfTDIgKi8KKworCisvKgorICogTGF5ZXIgMyBwcm90b2NvbCBpZGVudGlmaWVycworICovCisKKy8qIEJFR0lOX0wzICovCisjZGVmaW5lIEFUTV9MM19OT05FCTAJLyogTDMgbm90IHNwZWNpZmllZCAqLworI2RlZmluZSBBVE1fTDNfWDI1CTB4MDYJLyogSVRVLVQgWC4yNSwgcGFja2V0IGxheWVyICovCisjZGVmaW5lIEFUTV9MM19JU084MjA4CTB4MDcJLyogSVNPL0lFQyA4MjA4ICovCisjZGVmaW5lIEFUTV9MM19YMjIzCTB4MDgJLyogSVRVLVQgWC4yMjMgfCBJU08vSUVDIDg4NzggKi8KKyNkZWZpbmUgQVRNX0wzX0lTTzg0NzMJMHgwOQkvKiBJVFUtVCBYLjIzMyB8IElTTy9JRUMgODQ3MyAqLworI2RlZmluZSBBVE1fTDNfVDcwCTB4MGEJLyogSVRVLVQgVC43MCBtaW5pbXVtIG5ldHdvcmsgbGF5ZXIgKi8KKyNkZWZpbmUgQVRNX0wzX1RSOTU3NwkweDBiCS8qIElTTy9JRUMgVFIgOTU3NyAqLworI2RlZmluZSBBVE1fTDNfSDMxMAkweDBjCS8qIElUVS1UIFJlY29tbWVuZGF0aW9uIEguMzEwICovCisjZGVmaW5lIEFUTV9MM19IMzIxCTB4MGQJLyogSVRVLVQgUmVjb21tZW5kYXRpb24gSC4zMjEgKi8KKyNkZWZpbmUgQVRNX0wzX1VTRVIJMHgxMAkvKiB1c2VyLXNwZWNpZmllZCAqLworLyogRU5EX0wzICovCisKKworLyoKKyAqIEhpZ2ggbGF5ZXIgaWRlbnRpZmllcnMKKyAqLworCisvKiBCRUdJTl9ITCAqLworI2RlZmluZSBBVE1fSExfTk9ORQkwCS8qIEhMIG5vdCBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgQVRNX0hMX0lTTwkweDAxCS8qIElTTyAqLworI2RlZmluZSBBVE1fSExfVVNFUgkweDAyCS8qIHVzZXItc3BlY2lmaWMgKi8KKyNkZWZpbmUgQVRNX0hMX0hMUAkweDAzCS8qIGhpZ2ggbGF5ZXIgcHJvZmlsZSAtIFVOSSAzLjAgb25seSAqLworI2RlZmluZSBBVE1fSExfVkVORE9SCTB4MDQJLyogdmVuZG9yLXNwZWNpZmljIGFwcGxpY2F0aW9uIGlkZW50aWZpZXIgKi8KKy8qIEVORF9ITCAqLworCisKKy8qCisgKiBJVFUtVCBjb2RlZCBtb2RlIG9mIG9wZXJhdGlvbgorICovCisKKy8qIEJFR0lOX0lNRCAqLworI2RlZmluZSBBVE1fSU1EX05PTkUJIDAJLyogbW9kZSBub3Qgc3BlY2lmaWVkICovCisjZGVmaW5lIEFUTV9JTURfTk9STUFMCSAxCS8qIG5vcm1hbCBtb2RlIG9mIG9wZXJhdGlvbiAqLworI2RlZmluZSBBVE1fSU1EX0VYVEVOREVEIDIJLyogZXh0ZW5kZWQgbW9kZSBvZiBvcGVyYXRpb24gKi8KKy8qIEVORF9JTUQgKi8KKworLyoKKyAqIEguMzEwIGNvZGUgcG9pbnRzCisgKi8KKworI2RlZmluZSBBVE1fVFRfTk9ORQkwCS8qIHRlcm1pbmFsIHR5cGUgbm90IHNwZWNpZmllZCAqLworI2RlZmluZSBBVE1fVFRfUlgJMQkvKiByZWNlaXZlIG9ubHkgKi8KKyNkZWZpbmUgQVRNX1RUX1RYCTIJLyogc2VuZCBvbmx5ICovCisjZGVmaW5lIEFUTV9UVF9SWFRYCTMJLyogcmVjZWl2ZSBhbmQgc2VuZCAqLworCisjZGVmaW5lIEFUTV9NQ19OT05FCTAJLyogbm8gbXVsdGlwbGV4aW5nICovCisjZGVmaW5lIEFUTV9NQ19UUwkxCS8qIHRyYW5zcG9ydCBzdHJlYW0gKFRTKSAqLworI2RlZmluZSBBVE1fTUNfVFNfRkVDCTIJLyogdHJhbnNwb3J0IHN0cmVhbSB3aXRoIGZvcndhcmQgZXJyb3IgY29yci4gKi8KKyNkZWZpbmUgQVRNX01DX1BTCTMJLyogcHJvZ3JhbSBzdHJlYW0gKFBTKSAqLworI2RlZmluZSBBVE1fTUNfUFNfRkVDCTQJLyogcHJvZ3JhbSBzdHJlYW0gd2l0aCBmb3J3YXJkIGVycm9yIGNvcnIuICovCisjZGVmaW5lIEFUTV9NQ19IMjIxCTUJLyogSVRVLVQgUmVjLiBILjIyMSAqLworCisvKgorICogU0FQIHN0cnVjdHVyZXMKKyAqLworCisjZGVmaW5lIEFUTV9NQVhfSExJCTgJLyogbWF4aW11bSBoaWdoLWxheWVyIGluZm9ybWF0aW9uIGxlbmd0aCAqLworCisKK3N0cnVjdCBhdG1fYmxsaSB7CisgICAgdW5zaWduZWQgY2hhciBsMl9wcm90bzsJLyogbGF5ZXIgMiBwcm90b2NvbCAqLworICAgIHVuaW9uIHsKKwlzdHJ1Y3QgeworCSAgICB1bnNpZ25lZCBjaGFyIG1vZGU7CS8qIG1vZGUgb2Ygb3BlcmF0aW9uIChBVE1fSU1EX3h4eCksIDAgaWYgKi8KKwkJCQkvKiBhYnNlbnQgKi8KKwkgICAgdW5zaWduZWQgY2hhciB3aW5kb3c7IC8qIHdpbmRvdyBzaXplIChrKSwgMS0xMjcgKDAgdG8gb21pdCkgKi8KKwl9IGl0dTsJCQkvKiBJVFUtVCBlbmNvZGluZyAqLworCXVuc2lnbmVkIGNoYXIgdXNlcjsJLyogdXNlci1zcGVjaWZpZWQgbDIgaW5mb3JtYXRpb24gKi8KKyAgICB9IGwyOworICAgIHVuc2lnbmVkIGNoYXIgbDNfcHJvdG87CS8qIGxheWVyIDMgcHJvdG9jb2wgKi8KKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdW5zaWduZWQgY2hhciBtb2RlOwkvKiBtb2RlIG9mIG9wZXJhdGlvbiAoQVRNX0lNRF94eHgpLCAwIGlmICovCisJCQkJLyogYWJzZW50ICovCisJICAgIHVuc2lnbmVkIGNoYXIgZGVmX3NpemU7IC8qIGRlZmF1bHQgcGFja2V0IHNpemUgKGxvZzIpLCA0LTEyICgwIHRvICovCisJCQkJICAgIC8qIG9taXQpICovCisJICAgIHVuc2lnbmVkIGNoYXIgd2luZG93Oy8qIHBhY2tldCB3aW5kb3cgc2l6ZSwgMS0xMjcgKDAgdG8gb21pdCkgKi8KKwl9IGl0dTsJCQkvKiBJVFUtVCBlbmNvZGluZyAqLworCXVuc2lnbmVkIGNoYXIgdXNlcjsJLyogdXNlciBzcGVjaWZpZWQgbDMgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgewkJICAgICAgLyogaWYgbDNfcHJvdG8gPSBBVE1fTDNfSDMxMCAqLworCSAgICB1bnNpZ25lZCBjaGFyIHRlcm1fdHlwZTsgIC8qIHRlcm1pbmFsIHR5cGUgKi8KKwkgICAgdW5zaWduZWQgY2hhciBmd19tcHhfY2FwOyAvKiBmb3J3YXJkIG11bHRpcGxleGluZyBjYXBhYmlsaXR5ICovCisJCQkJICAgICAgLyogb25seSBpZiB0ZXJtX3R5cGUgIT0gQVRNX1RUX05PTkUgKi8KKwkgICAgdW5zaWduZWQgY2hhciBid19tcHhfY2FwOyAvKiBiYWNrd2FyZCBtdWx0aXBsZXhpbmcgY2FwYWJpbGl0eSAqLworCQkJCSAgICAgIC8qIG9ubHkgaWYgdGVybV90eXBlICE9IEFUTV9UVF9OT05FICovCisJfSBoMzEwOworCXN0cnVjdCB7CQkgIC8qIGlmIGwzX3Byb3RvID0gQVRNX0wzX1RSOTU3NyAqLworCSAgICB1bnNpZ25lZCBjaGFyIGlwaTsJICAvKiBpbml0aWFsIHByb3RvY29sIGlkICovCisJICAgIHVuc2lnbmVkIGNoYXIgc25hcFs1XTsvKiBJRUVFIDgwMi4xIFNOQVAgaWRlbnRpZmllciAqLworCQkJCSAgLyogKG9ubHkgaWYgaXBpID09IE5MUElEX0lFRUU4MDJfMV9TTkFQKSAqLworCX0gdHI5NTc3OworICAgIH0gbDM7Cit9IF9fQVRNX0FQSV9BTElHTjsKKworCitzdHJ1Y3QgYXRtX2JobGkgeworICAgIHVuc2lnbmVkIGNoYXIgaGxfdHlwZTsJLyogaGlnaCBsYXllciBpbmZvcm1hdGlvbiB0eXBlICovCisgICAgdW5zaWduZWQgY2hhciBobF9sZW5ndGg7CS8qIGxlbmd0aCAob25seSBpZiBobF90eXBlID09IEFUTV9ITF9VU0VSIHx8ICovCisJCQkJLyogaGxfdHlwZSA9PSBBVE1fSExfSVNPKSAqLworICAgIHVuc2lnbmVkIGNoYXIgaGxfaW5mb1tBVE1fTUFYX0hMSV07LyogaGlnaCBsYXllciBpbmZvcm1hdGlvbiAqLworfTsKKworCisjZGVmaW5lIEFUTV9NQVhfQkxMSQkzCQkvKiBtYXhpbXVtIG51bWJlciBvZiBCTExJIGVsZW1lbnRzICovCisKKworc3RydWN0IGF0bV9zYXAgeworCXN0cnVjdCBhdG1fYmhsaSBiaGxpOwkJLyogbG9jYWwgU0FQLCBoaWdoLWxheWVyIGluZm9ybWF0aW9uICovCisJc3RydWN0IGF0bV9ibGxpIGJsbGlbQVRNX01BWF9CTExJXSBfX0FUTV9BUElfQUxJR047CisJCQkJCS8qIGxvY2FsIFNBUCwgbG93LWxheWVyIGluZm8gKi8KK307CisKKworc3RhdGljIF9faW5saW5lX18gaW50IGJsbGlfaW5fdXNlKHN0cnVjdCBhdG1fYmxsaSBibGxpKQoreworCXJldHVybiBibGxpLmwyX3Byb3RvIHx8IGJsbGkubDNfcHJvdG87Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1zdmMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtc3ZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3MTU4MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtc3ZjLmgKQEAgLTAsMCArMSw1NSBAQAorLyogYXRtc3ZjLmggLSBBVE0gc2lnbmFsaW5nIGtlcm5lbC1kZW1vbiBpbnRlcmZhY2UgZGVmaW5pdGlvbnMgKi8KKyAKKy8qIFdyaXR0ZW4gMTk5NS0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisgCisKKyNpZm5kZWYgX0xJTlVYX0FUTVNWQ19ICisjZGVmaW5lIF9MSU5VWF9BVE1TVkNfSAorCisjaW5jbHVkZSA8bGludXgvYXRtYXBpLmg+CisjaW5jbHVkZSA8bGludXgvYXRtLmg+CisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisKKworI2RlZmluZSBBVE1TSUdEX0NUUkwgX0lPKCdhJyxBVE1JT0NfU1BFQ0lBTCkKKwkJCQkvKiBiZWNvbWUgQVRNIHNpZ25hbGluZyBkZW1vbiBjb250cm9sIHNvY2tldCAqLworCitlbnVtIGF0bXN2Y19tc2dfdHlwZSB7IGFzX2NhdGNoX251bGwsIGFzX2JpbmQsIGFzX2Nvbm5lY3QsIGFzX2FjY2VwdCwgYXNfcmVqZWN0LAorCQkgICAgICAgYXNfbGlzdGVuLCBhc19va2F5LCBhc19lcnJvciwgYXNfaW5kaWNhdGUsIGFzX2Nsb3NlLAorCQkgICAgICAgYXNfaXRmX25vdGlmeSwgYXNfbW9kaWZ5LCBhc19pZGVudGlmeSwgYXNfdGVybWluYXRlLAorCQkgICAgICAgYXNfYWRkcGFydHksIGFzX2Ryb3BwYXJ0eSB9OworCitzdHJ1Y3QgYXRtc3ZjX21zZyB7CisJZW51bSBhdG1zdmNfbXNnX3R5cGUgdHlwZTsKKwlhdG1fa3B0cl90IHZjYzsKKwlhdG1fa3B0cl90IGxpc3Rlbl92Y2M7CQkvKiBpbmRpY2F0ZSAqLworCWludCByZXBseTsJCQkvKiBmb3Igb2theSBhbmQgY2xvc2U6CQkgICAqLworCQkJCQkvKiAgIDwgMDogZXJyb3IgYmVmb3JlIGFjdGl2ZQkgICAqLworCQkJCQkvKiAgICAgICAgKHNpZ2QgaGFzIGRpc2NhcmRlZCBjdHgpICovCisJCQkJCS8qICAgPT0wOiBzdWNjZXNzCQkgICAqLworCQkJCSAgICAgICAgLyogICA+IDA6IGVycm9yIHdoZW4gYWN0aXZlIChzdGlsbCAqLworCQkJCQkvKiAgICAgICAgbmVlZCB0byBjbG9zZSkJICAgKi8KKwlzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjIHB2YzsJLyogaW5kaWNhdGUsIG9rYXkgKGNvbm5lY3QpICovCisJc3RydWN0IHNvY2thZGRyX2F0bXN2YyBsb2NhbDsJLyogbG9jYWwgU1ZDIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYXRtX3FvcyBxb3M7CQkvKiBRT1MgcGFyYW1ldGVycyAqLworCXN0cnVjdCBhdG1fc2FwIHNhcDsJCS8qIFNBUCAqLworCXVuc2lnbmVkIGludCBzZXNzaW9uOwkJLyogZm9yIHAycG0gKi8KKwlzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjIHN2YzsJLyogU1ZDIGFkZHJlc3MgKi8KK30gX19BVE1fQVBJX0FMSUdOOworCisvKgorICogTWVzc2FnZSBjb250ZW50czogc2VlIGZ0cDovL2ljYWZ0cC5lcGZsLmNoL3B1Yi9saW51eC9hdG0vZG9jcy9pc3AtKi50YXIuZ3oKKyAqLworCisvKgorICogU29tZSBwb2xpY3kgc3R1ZmYgZm9yIGF0bXNpZ2QgYW5kIGZvciBuZXQvYXRtL3N2Yy5jLiBCb3RoIGhhdmUgdG8gYWdyZWUgb24KKyAqIHdoYXQgUENSIGlzIHVzZWQgdG8gcmVxdWVzdCBiYW5kd2lkdGggZnJvbSB0aGUgZGV2aWNlIGRyaXZlci4gbmV0L2F0bS9zdmMuYworICogdHJpZXMgdG8gZG8gYmV0dGVyIHRoYW4gdGhhdCwgYnV0IG9ubHkgaWYgdGhlcmUncyBubyByb3V0aW5nIGRlY2lzaW9uIChpLmUuCisgKiBpZiBzaWduYWxpbmcgb25seSB1c2VzIG9uZSBBVE0gaW50ZXJmYWNlKS4KKyAqLworCisjZGVmaW5lIFNFTEVDVF9UT1BfUENSKHRwKSAoKHRwKS5wY3IgPyAodHApLnBjciA6IFwKKyAgKHRwKS5tYXhfcGNyICYmICh0cCkubWF4X3BjciAhPSBBVE1fTUFYX1BDUiA/ICh0cCkubWF4X3BjciA6IFwKKyAgKHRwKS5taW5fcGNyID8gKHRwKS5taW5fcGNyIDogQVRNX01BWF9QQ1IpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdWRpdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OGExOWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKQEAgLTAsMCArMSwzNjQgQEAKKy8qIGF1ZGl0LmggLS0gQXVkaXRpbmcgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDQgUmVkIEhhdCBJbmMuLCBEdXJoYW0sIE5vcnRoIENhcm9saW5hLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogV3JpdHRlbiBieSBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEByZWRoYXQuY29tPgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9BVURJVF9IXworI2RlZmluZSBfTElOVVhfQVVESVRfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLWVtLmg+CisKKy8qIFRoZSBuZXRsaW5rIG1lc3NhZ2VzIGZvciB0aGUgYXVkaXQgc3lzdGVtIGlzIGRpdmlkZWQgaW50byBibG9ja3M6CisgKiAxMDAwIC0gMTA5OSBhcmUgZm9yIGNvbW1hbmRpbmcgdGhlIGF1ZGl0IHN5c3RlbQorICogMTEwMCAtIDExOTkgdXNlciBzcGFjZSB0cnVzdGVkIGFwcGxpY2F0aW9uIG1lc3NhZ2VzCisgKiAxMjAwIC0gMTI5OSBtZXNzYWdlcyBpbnRlcm5hbCB0byB0aGUgYXVkaXQgZGFlbW9uCisgKiAxMzAwIC0gMTM5OSBhdWRpdCBldmVudCBtZXNzYWdlcworICogMTQwMCAtIDE0OTkgU0UgTGludXggdXNlCisgKiAxNTAwIC0gMTU5OSBrZXJuZWwgTFNQUCBldmVudHMKKyAqIDE2MDAgLSAxNjk5IGtlcm5lbCBjcnlwdG8gZXZlbnRzCisgKiAxNzAwIC0gMTc5OSBrZXJuZWwgYW5vbWFseSByZWNvcmRzCisgKiAxODAwIC0gMTg5OSBrZXJuZWwgaW50ZWdyaXR5IGV2ZW50cworICogMTkwMCAtIDE5OTkgZnV0dXJlIGtlcm5lbCB1c2UKKyAqIDIwMDAgaXMgZm9yIG90aGVyd2lzZSB1bmNsYXNzaWZpZWQga2VybmVsIGF1ZGl0IG1lc3NhZ2VzIChsZWdhY3kpCisgKiAyMDAxIC0gMjA5OSB1bnVzZWQgKGtlcm5lbCkKKyAqIDIxMDAgLSAyMTk5IHVzZXIgc3BhY2UgYW5vbWFseSByZWNvcmRzCisgKiAyMjAwIC0gMjI5OSB1c2VyIHNwYWNlIGFjdGlvbnMgdGFrZW4gaW4gcmVzcG9uc2UgdG8gYW5vbWFsaWVzCisgKiAyMzAwIC0gMjM5OSB1c2VyIHNwYWNlIGdlbmVyYXRlZCBMU1BQIGV2ZW50cworICogMjQwMCAtIDI0OTkgdXNlciBzcGFjZSBjcnlwdG8gZXZlbnRzCisgKiAyNTAwIC0gMjk5OSBmdXR1cmUgdXNlciBzcGFjZSAobWF5YmUgaW50ZWdyaXR5IGxhYmVscyBhbmQgcmVsYXRlZCBldmVudHMpCisgKgorICogTWVzc2FnZXMgZnJvbSAxMDAwLTExOTkgYXJlIGJpLWRpcmVjdGlvbmFsLiAxMjAwLTEyOTkgJiAyMTAwIC0gMjk5OSBhcmUKKyAqIGV4Y2x1c2l2ZWx5IHVzZXIgc3BhY2UuIDEzMDAtMjA5OSBpcyBrZXJuZWwgLS0+IHVzZXIgc3BhY2UgCisgKiBjb21tdW5pY2F0aW9uLgorICovCisjZGVmaW5lIEFVRElUX0dFVAkJMTAwMAkvKiBHZXQgc3RhdHVzICovCisjZGVmaW5lIEFVRElUX1NFVAkJMTAwMQkvKiBTZXQgc3RhdHVzIChlbmFibGUvZGlzYWJsZS9hdWRpdGQpICovCisjZGVmaW5lIEFVRElUX0xJU1QJCTEwMDIJLyogTGlzdCBzeXNjYWxsIHJ1bGVzIC0tIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgQVVESVRfQURECQkxMDAzCS8qIEFkZCBzeXNjYWxsIHJ1bGUgLS0gZGVwcmVjYXRlZCAqLworI2RlZmluZSBBVURJVF9ERUwJCTEwMDQJLyogRGVsZXRlIHN5c2NhbGwgcnVsZSAtLSBkZXByZWNhdGVkICovCisjZGVmaW5lIEFVRElUX1VTRVIJCTEwMDUJLyogTWVzc2FnZSBmcm9tIHVzZXJzcGFjZSAtLSBkZXByZWNhdGVkICovCisjZGVmaW5lIEFVRElUX0xPR0lOCQkxMDA2CS8qIERlZmluZSB0aGUgbG9naW4gaWQgYW5kIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEFVRElUX1dBVENIX0lOUwkJMTAwNwkvKiBJbnNlcnQgZmlsZS9kaXIgd2F0Y2ggZW50cnkgKi8KKyNkZWZpbmUgQVVESVRfV0FUQ0hfUkVNCQkxMDA4CS8qIFJlbW92ZSBmaWxlL2RpciB3YXRjaCBlbnRyeSAqLworI2RlZmluZSBBVURJVF9XQVRDSF9MSVNUCTEwMDkJLyogTGlzdCBhbGwgZmlsZS9kaXIgd2F0Y2hlcyAqLworI2RlZmluZSBBVURJVF9TSUdOQUxfSU5GTwkxMDEwCS8qIEdldCBpbmZvIGFib3V0IHNlbmRlciBvZiBzaWduYWwgdG8gYXVkaXRkICovCisjZGVmaW5lIEFVRElUX0FERF9SVUxFCQkxMDExCS8qIEFkZCBzeXNjYWxsIGZpbHRlcmluZyBydWxlICovCisjZGVmaW5lIEFVRElUX0RFTF9SVUxFCQkxMDEyCS8qIERlbGV0ZSBzeXNjYWxsIGZpbHRlcmluZyBydWxlICovCisjZGVmaW5lIEFVRElUX0xJU1RfUlVMRVMJMTAxMwkvKiBMaXN0IHN5c2NhbGwgZmlsdGVyaW5nIHJ1bGVzICovCisjZGVmaW5lIEFVRElUX1RSSU0JCTEwMTQJLyogVHJpbSBqdW5rIGZyb20gd2F0Y2hlZCB0cmVlICovCisjZGVmaW5lIEFVRElUX01BS0VfRVFVSVYJMTAxNQkvKiBBcHBlbmQgdG8gd2F0Y2hlZCB0cmVlICovCisjZGVmaW5lIEFVRElUX1RUWV9HRVQJCTEwMTYJLyogR2V0IFRUWSBhdWRpdGluZyBzdGF0dXMgKi8KKyNkZWZpbmUgQVVESVRfVFRZX1NFVAkJMTAxNwkvKiBTZXQgVFRZIGF1ZGl0aW5nIHN0YXR1cyAqLworCisjZGVmaW5lIEFVRElUX0ZJUlNUX1VTRVJfTVNHCTExMDAJLyogVXNlcnNwYWNlIG1lc3NhZ2VzIG1vc3RseSB1bmludGVyZXN0aW5nIHRvIGtlcm5lbCAqLworI2RlZmluZSBBVURJVF9VU0VSX0FWQwkJMTEwNwkvKiBXZSBmaWx0ZXIgdGhpcyBkaWZmZXJlbnRseSAqLworI2RlZmluZSBBVURJVF9VU0VSX1RUWQkJMTEyNAkvKiBOb24tSUNBTk9OIFRUWSBpbnB1dCBtZWFuaW5nICovCisjZGVmaW5lIEFVRElUX0xBU1RfVVNFUl9NU0cJMTE5OQorI2RlZmluZSBBVURJVF9GSVJTVF9VU0VSX01TRzIJMjEwMAkvKiBNb3JlIHVzZXIgc3BhY2UgbWVzc2FnZXMgKi8KKyNkZWZpbmUgQVVESVRfTEFTVF9VU0VSX01TRzIJMjk5OQorIAorI2RlZmluZSBBVURJVF9EQUVNT05fU1RBUlQgICAgICAxMjAwICAgIC8qIERhZW1vbiBzdGFydHVwIHJlY29yZCAqLworI2RlZmluZSBBVURJVF9EQUVNT05fRU5EICAgICAgICAxMjAxICAgIC8qIERhZW1vbiBub3JtYWwgc3RvcCByZWNvcmQgKi8KKyNkZWZpbmUgQVVESVRfREFFTU9OX0FCT1JUICAgICAgMTIwMiAgICAvKiBEYWVtb24gZXJyb3Igc3RvcCByZWNvcmQgKi8KKyNkZWZpbmUgQVVESVRfREFFTU9OX0NPTkZJRyAgICAgMTIwMyAgICAvKiBEYWVtb24gY29uZmlnIGNoYW5nZSAqLworCisjZGVmaW5lIEFVRElUX1NZU0NBTEwJCTEzMDAJLyogU3lzY2FsbCBldmVudCAqLworLyogI2RlZmluZSBBVURJVF9GU19XQVRDSAkxMzAxCSAqIERlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgQVVESVRfUEFUSAkJMTMwMgkvKiBGaWxlbmFtZSBwYXRoIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEFVRElUX0lQQwkJMTMwMwkvKiBJUEMgcmVjb3JkICovCisjZGVmaW5lIEFVRElUX1NPQ0tFVENBTEwJMTMwNAkvKiBzeXNfc29ja2V0Y2FsbCBhcmd1bWVudHMgKi8KKyNkZWZpbmUgQVVESVRfQ09ORklHX0NIQU5HRQkxMzA1CS8qIEF1ZGl0IHN5c3RlbSBjb25maWd1cmF0aW9uIGNoYW5nZSAqLworI2RlZmluZSBBVURJVF9TT0NLQUREUgkJMTMwNgkvKiBzb2NrYWRkciBjb3BpZWQgYXMgc3lzY2FsbCBhcmcgKi8KKyNkZWZpbmUgQVVESVRfQ1dECQkxMzA3CS8qIEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgQVVESVRfRVhFQ1ZFCQkxMzA5CS8qIGV4ZWN2ZSBhcmd1bWVudHMgKi8KKyNkZWZpbmUgQVVESVRfSVBDX1NFVF9QRVJNCTEzMTEJLyogSVBDIG5ldyBwZXJtaXNzaW9ucyByZWNvcmQgdHlwZSAqLworI2RlZmluZSBBVURJVF9NUV9PUEVOCQkxMzEyCS8qIFBPU0lYIE1RIG9wZW4gcmVjb3JkIHR5cGUgKi8KKyNkZWZpbmUgQVVESVRfTVFfU0VORFJFQ1YJMTMxMwkvKiBQT1NJWCBNUSBzZW5kL3JlY2VpdmUgcmVjb3JkIHR5cGUgKi8KKyNkZWZpbmUgQVVESVRfTVFfTk9USUZZCQkxMzE0CS8qIFBPU0lYIE1RIG5vdGlmeSByZWNvcmQgdHlwZSAqLworI2RlZmluZSBBVURJVF9NUV9HRVRTRVRBVFRSCTEzMTUJLyogUE9TSVggTVEgZ2V0L3NldCBhdHRyaWJ1dGUgcmVjb3JkIHR5cGUgKi8KKyNkZWZpbmUgQVVESVRfS0VSTkVMX09USEVSCTEzMTYJLyogRm9yIHVzZSBieSAzcmQgcGFydHkgbW9kdWxlcyAqLworI2RlZmluZSBBVURJVF9GRF9QQUlSCQkxMzE3ICAgIC8qIGF1ZGl0IHJlY29yZCBmb3IgcGlwZS9zb2NrZXRwYWlyICovCisjZGVmaW5lIEFVRElUX09CSl9QSUQJCTEzMTgJLyogcHRyYWNlIHRhcmdldCAqLworI2RlZmluZSBBVURJVF9UVFkJCTEzMTkJLyogSW5wdXQgb24gYW4gYWRtaW5pc3RyYXRpdmUgVFRZICovCisjZGVmaW5lIEFVRElUX0VPRQkJMTMyMAkvKiBFbmQgb2YgbXVsdGktcmVjb3JkIGV2ZW50ICovCisjZGVmaW5lIEFVRElUX0JQUk1fRkNBUFMJMTMyMQkvKiBJbmZvcm1hdGlvbiBhYm91dCBmY2FwcyBpbmNyZWFzaW5nIHBlcm1zICovCisjZGVmaW5lIEFVRElUX0NBUFNFVAkJMTMyMgkvKiBSZWNvcmQgc2hvd2luZyBhcmd1bWVudCB0byBzeXNfY2Fwc2V0ICovCisjZGVmaW5lIEFVRElUX01NQVAJCTEzMjMJLyogUmVjb3JkIHNob3dpbmcgZGVzY3JpcHRvciBhbmQgZmxhZ3MgaW4gbW1hcCAqLworI2RlZmluZSBBVURJVF9ORVRGSUxURVJfUEtUCTEzMjQJLyogUGFja2V0cyB0cmF2ZXJzaW5nIG5ldGZpbHRlciBjaGFpbnMgKi8KKyNkZWZpbmUgQVVESVRfTkVURklMVEVSX0NGRwkxMzI1CS8qIE5ldGZpbHRlciBjaGFpbiBtb2RpZmljYXRpb25zICovCisKKyNkZWZpbmUgQVVESVRfQVZDCQkxNDAwCS8qIFNFIExpbnV4IGF2YyBkZW5pYWwgb3IgZ3JhbnQgKi8KKyNkZWZpbmUgQVVESVRfU0VMSU5VWF9FUlIJMTQwMQkvKiBJbnRlcm5hbCBTRSBMaW51eCBFcnJvcnMgKi8KKyNkZWZpbmUgQVVESVRfQVZDX1BBVEgJCTE0MDIJLyogZGVudHJ5LCB2ZnNtb3VudCBwYWlyIGZyb20gYXZjICovCisjZGVmaW5lIEFVRElUX01BQ19QT0xJQ1lfTE9BRAkxNDAzCS8qIFBvbGljeSBmaWxlIGxvYWQgKi8KKyNkZWZpbmUgQVVESVRfTUFDX1NUQVRVUwkxNDA0CS8qIENoYW5nZWQgZW5mb3JjaW5nLHBlcm1pc3NpdmUsb2ZmICovCisjZGVmaW5lIEFVRElUX01BQ19DT05GSUdfQ0hBTkdFCTE0MDUJLyogQ2hhbmdlcyB0byBib29sZWFucyAqLworI2RlZmluZSBBVURJVF9NQUNfVU5MQkxfQUxMT1cJMTQwNgkvKiBOZXRMYWJlbDogYWxsb3cgdW5sYWJlbGVkIHRyYWZmaWMgKi8KKyNkZWZpbmUgQVVESVRfTUFDX0NJUFNPVjRfQURECTE0MDcJLyogTmV0TGFiZWw6IGFkZCBDSVBTT3Y0IERPSSBlbnRyeSAqLworI2RlZmluZSBBVURJVF9NQUNfQ0lQU09WNF9ERUwJMTQwOAkvKiBOZXRMYWJlbDogZGVsIENJUFNPdjQgRE9JIGVudHJ5ICovCisjZGVmaW5lIEFVRElUX01BQ19NQVBfQURECTE0MDkJLyogTmV0TGFiZWw6IGFkZCBMU00gZG9tYWluIG1hcHBpbmcgKi8KKyNkZWZpbmUgQVVESVRfTUFDX01BUF9ERUwJMTQxMAkvKiBOZXRMYWJlbDogZGVsIExTTSBkb21haW4gbWFwcGluZyAqLworI2RlZmluZSBBVURJVF9NQUNfSVBTRUNfQUREU0EJMTQxMQkvKiBOb3QgdXNlZCAqLworI2RlZmluZSBBVURJVF9NQUNfSVBTRUNfREVMU0EJMTQxMgkvKiBOb3QgdXNlZCAgKi8KKyNkZWZpbmUgQVVESVRfTUFDX0lQU0VDX0FERFNQRAkxNDEzCS8qIE5vdCB1c2VkICovCisjZGVmaW5lIEFVRElUX01BQ19JUFNFQ19ERUxTUEQJMTQxNAkvKiBOb3QgdXNlZCAqLworI2RlZmluZSBBVURJVF9NQUNfSVBTRUNfRVZFTlQJMTQxNQkvKiBBdWRpdCBhbiBJUFNlYyBldmVudCAqLworI2RlZmluZSBBVURJVF9NQUNfVU5MQkxfU1RDQURECTE0MTYJLyogTmV0TGFiZWw6IGFkZCBhIHN0YXRpYyBsYWJlbCAqLworI2RlZmluZSBBVURJVF9NQUNfVU5MQkxfU1RDREVMCTE0MTcJLyogTmV0TGFiZWw6IGRlbCBhIHN0YXRpYyBsYWJlbCAqLworCisjZGVmaW5lIEFVRElUX0ZJUlNUX0tFUk5fQU5PTV9NU0cgICAxNzAwCisjZGVmaW5lIEFVRElUX0xBU1RfS0VSTl9BTk9NX01TRyAgICAxNzk5CisjZGVmaW5lIEFVRElUX0FOT01fUFJPTUlTQ1VPVVMgICAgICAxNzAwIC8qIERldmljZSBjaGFuZ2VkIHByb21pc2N1b3VzIG1vZGUgKi8KKyNkZWZpbmUgQVVESVRfQU5PTV9BQkVORCAgICAgICAgICAgIDE3MDEgLyogUHJvY2VzcyBlbmRlZCBhYm5vcm1hbGx5ICovCisjZGVmaW5lIEFVRElUX0lOVEVHUklUWV9EQVRBCSAgICAxODAwIC8qIERhdGEgaW50ZWdyaXR5IHZlcmlmaWNhdGlvbiAqLworI2RlZmluZSBBVURJVF9JTlRFR1JJVFlfTUVUQURBVEEgICAgMTgwMSAvKiBNZXRhZGF0YSBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uICovCisjZGVmaW5lIEFVRElUX0lOVEVHUklUWV9TVEFUVVMJICAgIDE4MDIgLyogSW50ZWdyaXR5IGVuYWJsZSBzdGF0dXMgKi8KKyNkZWZpbmUgQVVESVRfSU5URUdSSVRZX0hBU0gJICAgIDE4MDMgLyogSW50ZWdyaXR5IEhBU0ggdHlwZSAqLworI2RlZmluZSBBVURJVF9JTlRFR1JJVFlfUENSCSAgICAxODA0IC8qIFBDUiBpbnZhbGlkYXRpb24gbXNncyAqLworI2RlZmluZSBBVURJVF9JTlRFR1JJVFlfUlVMRQkgICAgMTgwNSAvKiBwb2xpY3kgcnVsZSAqLworCisjZGVmaW5lIEFVRElUX0tFUk5FTAkJMjAwMAkvKiBBc3luY2hyb25vdXMgYXVkaXQgcmVjb3JkLiBOT1QgQSBSRVFVRVNULiAqLworCisvKiBSdWxlIGZsYWdzICovCisjZGVmaW5lIEFVRElUX0ZJTFRFUl9VU0VSCTB4MDAJLyogQXBwbHkgcnVsZSB0byB1c2VyLWdlbmVyYXRlZCBtZXNzYWdlcyAqLworI2RlZmluZSBBVURJVF9GSUxURVJfVEFTSwkweDAxCS8qIEFwcGx5IHJ1bGUgYXQgdGFzayBjcmVhdGlvbiAobm90IHN5c2NhbGwpICovCisjZGVmaW5lIEFVRElUX0ZJTFRFUl9FTlRSWQkweDAyCS8qIEFwcGx5IHJ1bGUgYXQgc3lzY2FsbCBlbnRyeSAqLworI2RlZmluZSBBVURJVF9GSUxURVJfV0FUQ0gJMHgwMwkvKiBBcHBseSBydWxlIHRvIGZpbGUgc3lzdGVtIHdhdGNoZXMgKi8KKyNkZWZpbmUgQVVESVRfRklMVEVSX0VYSVQJMHgwNAkvKiBBcHBseSBydWxlIGF0IHN5c2NhbGwgZXhpdCAqLworI2RlZmluZSBBVURJVF9GSUxURVJfVFlQRQkweDA1CS8qIEFwcGx5IHJ1bGUgYXQgYXVkaXRfbG9nX3N0YXJ0ICovCisKKyNkZWZpbmUgQVVESVRfTlJfRklMVEVSUwk2CisKKyNkZWZpbmUgQVVESVRfRklMVEVSX1BSRVBFTkQJMHgxMAkvKiBQcmVwZW5kIHRvIGZyb250IG9mIGxpc3QgKi8KKworLyogUnVsZSBhY3Rpb25zICovCisjZGVmaW5lIEFVRElUX05FVkVSICAgIDAJLyogRG8gbm90IGJ1aWxkIGNvbnRleHQgaWYgcnVsZSBtYXRjaGVzICovCisjZGVmaW5lIEFVRElUX1BPU1NJQkxFIDEJLyogQnVpbGQgY29udGV4dCBpZiBydWxlIG1hdGNoZXMgICovCisjZGVmaW5lIEFVRElUX0FMV0FZUyAgIDIJLyogR2VuZXJhdGUgYXVkaXQgcmVjb3JkIGlmIHJ1bGUgbWF0Y2hlcyAqLworCisvKiBSdWxlIHN0cnVjdHVyZSBzaXplcyAtLSBpZiB0aGVzZSBjaGFuZ2UsIGRpZmZlcmVudCBBVURJVF9BREQgYW5kCisgKiBBVURJVF9MSVNUIGNvbW1hbmRzIG11c3QgYmUgaW1wbGVtZW50ZWQuICovCisjZGVmaW5lIEFVRElUX01BWF9GSUVMRFMgICA2NAorI2RlZmluZSBBVURJVF9NQVhfS0VZX0xFTiAgMjU2CisjZGVmaW5lIEFVRElUX0JJVE1BU0tfU0laRSA2NAorI2RlZmluZSBBVURJVF9XT1JEKG5yKSAoKF9fdTMyKSgobnIpLzMyKSkKKyNkZWZpbmUgQVVESVRfQklUKG5yKSAgKDEgPDwgKChucikgLSBBVURJVF9XT1JEKG5yKSozMikpCisKKyNkZWZpbmUgQVVESVRfU1lTQ0FMTF9DTEFTU0VTIDE2CisjZGVmaW5lIEFVRElUX0NMQVNTX0RJUl9XUklURSAwCisjZGVmaW5lIEFVRElUX0NMQVNTX0RJUl9XUklURV8zMiAxCisjZGVmaW5lIEFVRElUX0NMQVNTX0NIQVRUUiAyCisjZGVmaW5lIEFVRElUX0NMQVNTX0NIQVRUUl8zMiAzCisjZGVmaW5lIEFVRElUX0NMQVNTX1JFQUQgNAorI2RlZmluZSBBVURJVF9DTEFTU19SRUFEXzMyIDUKKyNkZWZpbmUgQVVESVRfQ0xBU1NfV1JJVEUgNgorI2RlZmluZSBBVURJVF9DTEFTU19XUklURV8zMiA3CisjZGVmaW5lIEFVRElUX0NMQVNTX1NJR05BTCA4CisjZGVmaW5lIEFVRElUX0NMQVNTX1NJR05BTF8zMiA5CisKKy8qIFRoaXMgYml0bWFzayBpcyB1c2VkIHRvIHZhbGlkYXRlIHVzZXIgaW5wdXQuICBJdCByZXByZXNlbnRzIGFsbCBiaXRzIHRoYXQKKyAqIGFyZSBjdXJyZW50bHkgdXNlZCBpbiBhbiBhdWRpdCBmaWVsZCBjb25zdGFudCB1bmRlcnN0b29kIGJ5IHRoZSBrZXJuZWwuCisgKiBJZiB5b3UgYXJlIGFkZGluZyBhIG5ldyAjZGVmaW5lIEFVRElUXzx3aGF0ZXZlcj4sIHBsZWFzZSBlbnN1cmUgdGhhdAorICogQVVESVRfVU5VU0VEX0JJVFMgaXMgdXBkYXRlZCBpZiBuZWVkIGJlLiAqLworI2RlZmluZSBBVURJVF9VTlVTRURfQklUUwkweDA3RkZGQzAwCisKKworLyogUnVsZSBmaWVsZHMgKi8KKwkJCQkvKiBUaGVzZSBhcmUgdXNlZnVsIHdoZW4gY2hlY2tpbmcgdGhlCisJCQkJICogdGFzayBzdHJ1Y3R1cmUgYXQgdGFzayBjcmVhdGlvbiB0aW1lCisJCQkJICogKEFVRElUX1BFUl9UQVNLKS4gICovCisjZGVmaW5lIEFVRElUX1BJRAkwCisjZGVmaW5lIEFVRElUX1VJRAkxCisjZGVmaW5lIEFVRElUX0VVSUQJMgorI2RlZmluZSBBVURJVF9TVUlECTMKKyNkZWZpbmUgQVVESVRfRlNVSUQJNAorI2RlZmluZSBBVURJVF9HSUQJNQorI2RlZmluZSBBVURJVF9FR0lECTYKKyNkZWZpbmUgQVVESVRfU0dJRAk3CisjZGVmaW5lIEFVRElUX0ZTR0lECTgKKyNkZWZpbmUgQVVESVRfTE9HSU5VSUQJOQorI2RlZmluZSBBVURJVF9QRVJTCTEwCisjZGVmaW5lIEFVRElUX0FSQ0gJMTEKKyNkZWZpbmUgQVVESVRfTVNHVFlQRQkxMgorI2RlZmluZSBBVURJVF9TVUJKX1VTRVIJMTMJLyogc2VjdXJpdHkgbGFiZWwgdXNlciAqLworI2RlZmluZSBBVURJVF9TVUJKX1JPTEUJMTQJLyogc2VjdXJpdHkgbGFiZWwgcm9sZSAqLworI2RlZmluZSBBVURJVF9TVUJKX1RZUEUJMTUJLyogc2VjdXJpdHkgbGFiZWwgdHlwZSAqLworI2RlZmluZSBBVURJVF9TVUJKX1NFTgkxNgkvKiBzZWN1cml0eSBsYWJlbCBzZW5zaXRpdml0eSBsYWJlbCAqLworI2RlZmluZSBBVURJVF9TVUJKX0NMUgkxNwkvKiBzZWN1cml0eSBsYWJlbCBjbGVhcmFuY2UgbGFiZWwgKi8KKyNkZWZpbmUgQVVESVRfUFBJRAkxOAorI2RlZmluZSBBVURJVF9PQkpfVVNFUgkxOQorI2RlZmluZSBBVURJVF9PQkpfUk9MRQkyMAorI2RlZmluZSBBVURJVF9PQkpfVFlQRQkyMQorI2RlZmluZSBBVURJVF9PQkpfTEVWX0xPVwkyMgorI2RlZmluZSBBVURJVF9PQkpfTEVWX0hJR0gJMjMKKworCQkJCS8qIFRoZXNlIGFyZSBPTkxZIHVzZWZ1bCB3aGVuIGNoZWNraW5nCisJCQkJICogYXQgc3lzY2FsbCBleGl0IHRpbWUgKEFVRElUX0FUX0VYSVQpLiAqLworI2RlZmluZSBBVURJVF9ERVZNQUpPUgkxMDAKKyNkZWZpbmUgQVVESVRfREVWTUlOT1IJMTAxCisjZGVmaW5lIEFVRElUX0lOT0RFCTEwMgorI2RlZmluZSBBVURJVF9FWElUCTEwMworI2RlZmluZSBBVURJVF9TVUNDRVNTICAgMTA0CS8qIGV4aXQgPj0gMDsgdmFsdWUgaWdub3JlZCAqLworI2RlZmluZSBBVURJVF9XQVRDSAkxMDUKKyNkZWZpbmUgQVVESVRfUEVSTQkxMDYKKyNkZWZpbmUgQVVESVRfRElSCTEwNworI2RlZmluZSBBVURJVF9GSUxFVFlQRQkxMDgKKworI2RlZmluZSBBVURJVF9BUkcwICAgICAgMjAwCisjZGVmaW5lIEFVRElUX0FSRzEgICAgICAoQVVESVRfQVJHMCsxKQorI2RlZmluZSBBVURJVF9BUkcyICAgICAgKEFVRElUX0FSRzArMikKKyNkZWZpbmUgQVVESVRfQVJHMyAgICAgIChBVURJVF9BUkcwKzMpCisKKyNkZWZpbmUgQVVESVRfRklMVEVSS0VZCTIxMAorCisjZGVmaW5lIEFVRElUX05FR0FURQkJCTB4ODAwMDAwMDAKKworLyogVGhlc2UgYXJlIHRoZSBzdXBwb3J0ZWQgb3BlcmF0b3JzLgorICoJNCAgMiAgMSAgOAorICoJPSAgPiAgPCAgPworICoJLS0tLS0tLS0tLQorICoJMCAgMCAgMAkgMAkwMAlub25zZW5zZQorICoJMCAgMCAgMAkgMQkwOAkmICBiaXQgbWFzaworICoJMCAgMCAgMQkgMAkxMAk8CisgKgkwICAxICAwCSAwCTIwCT4KKyAqCTAgIDEgIDEJIDAJMzAJIT0KKyAqCTEgIDAgIDAJIDAJNDAJPQorICoJMSAgMCAgMAkgMQk0OAkmPSAgYml0IHRlc3QKKyAqCTEgIDAgIDEJIDAJNTAJPD0KKyAqCTEgIDEgIDAJIDAJNjAJPj0KKyAqCTEgIDEgIDEJIDEJNzgJYWxsIG9wZXJhdG9ycworICovCisjZGVmaW5lIEFVRElUX0JJVF9NQVNLCQkJMHgwODAwMDAwMAorI2RlZmluZSBBVURJVF9MRVNTX1RIQU4JCQkweDEwMDAwMDAwCisjZGVmaW5lIEFVRElUX0dSRUFURVJfVEhBTgkJMHgyMDAwMDAwMAorI2RlZmluZSBBVURJVF9OT1RfRVFVQUwJCQkweDMwMDAwMDAwCisjZGVmaW5lIEFVRElUX0VRVUFMCQkJMHg0MDAwMDAwMAorI2RlZmluZSBBVURJVF9CSVRfVEVTVAkJCShBVURJVF9CSVRfTUFTS3xBVURJVF9FUVVBTCkKKyNkZWZpbmUgQVVESVRfTEVTU19USEFOX09SX0VRVUFMCShBVURJVF9MRVNTX1RIQU58QVVESVRfRVFVQUwpCisjZGVmaW5lIEFVRElUX0dSRUFURVJfVEhBTl9PUl9FUVVBTAkoQVVESVRfR1JFQVRFUl9USEFOfEFVRElUX0VRVUFMKQorI2RlZmluZSBBVURJVF9PUEVSQVRPUlMJCQkoQVVESVRfRVFVQUx8QVVESVRfTk9UX0VRVUFMfEFVRElUX0JJVF9NQVNLKQorCitlbnVtIHsKKwlBdWRpdF9lcXVhbCwKKwlBdWRpdF9ub3RfZXF1YWwsCisJQXVkaXRfYml0bWFzaywKKwlBdWRpdF9iaXR0ZXN0LAorCUF1ZGl0X2x0LAorCUF1ZGl0X2d0LAorCUF1ZGl0X2xlLAorCUF1ZGl0X2dlLAorCUF1ZGl0X2JhZAorfTsKKworLyogU3RhdHVzIHN5bWJvbHMgKi8KKwkJCQkvKiBNYXNrIHZhbHVlcyAqLworI2RlZmluZSBBVURJVF9TVEFUVVNfRU5BQkxFRAkJMHgwMDAxCisjZGVmaW5lIEFVRElUX1NUQVRVU19GQUlMVVJFCQkweDAwMDIKKyNkZWZpbmUgQVVESVRfU1RBVFVTX1BJRAkJMHgwMDA0CisjZGVmaW5lIEFVRElUX1NUQVRVU19SQVRFX0xJTUlUCQkweDAwMDgKKyNkZWZpbmUgQVVESVRfU1RBVFVTX0JBQ0tMT0dfTElNSVQJMHgwMDEwCisJCQkJLyogRmFpbHVyZS10by1sb2cgYWN0aW9ucyAqLworI2RlZmluZSBBVURJVF9GQUlMX1NJTEVOVAkwCisjZGVmaW5lIEFVRElUX0ZBSUxfUFJJTlRLCTEKKyNkZWZpbmUgQVVESVRfRkFJTF9QQU5JQwkyCisKKy8qIGRpc3Rpbmd1aXNoIHN5c2NhbGwgdGFibGVzICovCisjZGVmaW5lIF9fQVVESVRfQVJDSF82NEJJVCAweDgwMDAwMDAwCisjZGVmaW5lIF9fQVVESVRfQVJDSF9MRQkgICAweDQwMDAwMDAwCisjZGVmaW5lIEFVRElUX0FSQ0hfQUxQSEEJKEVNX0FMUEhBfF9fQVVESVRfQVJDSF82NEJJVHxfX0FVRElUX0FSQ0hfTEUpCisjZGVmaW5lIEFVRElUX0FSQ0hfQVJNCQkoRU1fQVJNfF9fQVVESVRfQVJDSF9MRSkKKyNkZWZpbmUgQVVESVRfQVJDSF9BUk1FQgkoRU1fQVJNKQorI2RlZmluZSBBVURJVF9BUkNIX0NSSVMJCShFTV9DUklTfF9fQVVESVRfQVJDSF9MRSkKKyNkZWZpbmUgQVVESVRfQVJDSF9GUlYJCShFTV9GUlYpCisjZGVmaW5lIEFVRElUX0FSQ0hfSDgzMDAJKEVNX0g4XzMwMCkKKyNkZWZpbmUgQVVESVRfQVJDSF9JMzg2CQkoRU1fMzg2fF9fQVVESVRfQVJDSF9MRSkKKyNkZWZpbmUgQVVESVRfQVJDSF9JQTY0CQkoRU1fSUFfNjR8X19BVURJVF9BUkNIXzY0QklUfF9fQVVESVRfQVJDSF9MRSkKKyNkZWZpbmUgQVVESVRfQVJDSF9NMzJSCQkoRU1fTTMyUikKKyNkZWZpbmUgQVVESVRfQVJDSF9NNjhLCQkoRU1fNjhLKQorI2RlZmluZSBBVURJVF9BUkNIX01JUFMJCShFTV9NSVBTKQorI2RlZmluZSBBVURJVF9BUkNIX01JUFNFTAkoRU1fTUlQU3xfX0FVRElUX0FSQ0hfTEUpCisjZGVmaW5lIEFVRElUX0FSQ0hfTUlQUzY0CShFTV9NSVBTfF9fQVVESVRfQVJDSF82NEJJVCkKKyNkZWZpbmUgQVVESVRfQVJDSF9NSVBTRUw2NAkoRU1fTUlQU3xfX0FVRElUX0FSQ0hfNjRCSVR8X19BVURJVF9BUkNIX0xFKQorI2RlZmluZSBBVURJVF9BUkNIX1BBUklTQwkoRU1fUEFSSVNDKQorI2RlZmluZSBBVURJVF9BUkNIX1BBUklTQzY0CShFTV9QQVJJU0N8X19BVURJVF9BUkNIXzY0QklUKQorI2RlZmluZSBBVURJVF9BUkNIX1BQQwkJKEVNX1BQQykKKyNkZWZpbmUgQVVESVRfQVJDSF9QUEM2NAkoRU1fUFBDNjR8X19BVURJVF9BUkNIXzY0QklUKQorI2RlZmluZSBBVURJVF9BUkNIX1MzOTAJCShFTV9TMzkwKQorI2RlZmluZSBBVURJVF9BUkNIX1MzOTBYCShFTV9TMzkwfF9fQVVESVRfQVJDSF82NEJJVCkKKyNkZWZpbmUgQVVESVRfQVJDSF9TSAkJKEVNX1NIKQorI2RlZmluZSBBVURJVF9BUkNIX1NIRUwJCShFTV9TSHxfX0FVRElUX0FSQ0hfTEUpCisjZGVmaW5lIEFVRElUX0FSQ0hfU0g2NAkJKEVNX1NIfF9fQVVESVRfQVJDSF82NEJJVCkKKyNkZWZpbmUgQVVESVRfQVJDSF9TSEVMNjQJKEVNX1NIfF9fQVVESVRfQVJDSF82NEJJVHxfX0FVRElUX0FSQ0hfTEUpCisjZGVmaW5lIEFVRElUX0FSQ0hfU1BBUkMJKEVNX1NQQVJDKQorI2RlZmluZSBBVURJVF9BUkNIX1NQQVJDNjQJKEVNX1NQQVJDVjl8X19BVURJVF9BUkNIXzY0QklUKQorI2RlZmluZSBBVURJVF9BUkNIX1g4Nl82NAkoRU1fWDg2XzY0fF9fQVVESVRfQVJDSF82NEJJVHxfX0FVRElUX0FSQ0hfTEUpCisKKyNkZWZpbmUgQVVESVRfUEVSTV9FWEVDCQkxCisjZGVmaW5lIEFVRElUX1BFUk1fV1JJVEUJMgorI2RlZmluZSBBVURJVF9QRVJNX1JFQUQJCTQKKyNkZWZpbmUgQVVESVRfUEVSTV9BVFRSCQk4CisKK3N0cnVjdCBhdWRpdF9zdGF0dXMgeworCV9fdTMyCQltYXNrOwkJLyogQml0IG1hc2sgZm9yIHZhbGlkIGVudHJpZXMgKi8KKwlfX3UzMgkJZW5hYmxlZDsJLyogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLworCV9fdTMyCQlmYWlsdXJlOwkvKiBGYWlsdXJlLXRvLWxvZyBhY3Rpb24gKi8KKwlfX3UzMgkJcGlkOwkJLyogcGlkIG9mIGF1ZGl0ZCBwcm9jZXNzICovCisJX191MzIJCXJhdGVfbGltaXQ7CS8qIG1lc3NhZ2VzIHJhdGUgbGltaXQgKHBlciBzZWNvbmQpICovCisJX191MzIJCWJhY2tsb2dfbGltaXQ7CS8qIHdhaXRpbmcgbWVzc2FnZXMgbGltaXQgKi8KKwlfX3UzMgkJbG9zdDsJCS8qIG1lc3NhZ2VzIGxvc3QgKi8KKwlfX3UzMgkJYmFja2xvZzsJLyogbWVzc2FnZXMgd2FpdGluZyBpbiBxdWV1ZSAqLworfTsKKworc3RydWN0IGF1ZGl0X3R0eV9zdGF0dXMgeworCV9fdTMyCQllbmFibGVkOyAvKiAxID0gZW5hYmxlZCwgMCA9IGRpc2FibGVkICovCit9OworCisvKiBhdWRpdF9ydWxlX2RhdGEgc3VwcG9ydHMgZmlsdGVyIHJ1bGVzIHdpdGggYm90aCBpbnRlZ2VyIGFuZCBzdHJpbmcKKyAqIGZpZWxkcy4gIEl0IGNvcnJlc3BvbmRzIHdpdGggQVVESVRfQUREX1JVTEUsIEFVRElUX0RFTF9SVUxFIGFuZAorICogQVVESVRfTElTVF9SVUxFUyByZXF1ZXN0cy4KKyAqLworc3RydWN0IGF1ZGl0X3J1bGVfZGF0YSB7CisJX191MzIJCWZsYWdzOwkvKiBBVURJVF9QRVJfe1RBU0ssQ0FMTH0sIEFVRElUX1BSRVBFTkQgKi8KKwlfX3UzMgkJYWN0aW9uOwkvKiBBVURJVF9ORVZFUiwgQVVESVRfUE9TU0lCTEUsIEFVRElUX0FMV0FZUyAqLworCV9fdTMyCQlmaWVsZF9jb3VudDsKKwlfX3UzMgkJbWFza1tBVURJVF9CSVRNQVNLX1NJWkVdOyAvKiBzeXNjYWxsKHMpIGFmZmVjdGVkICovCisJX191MzIJCWZpZWxkc1tBVURJVF9NQVhfRklFTERTXTsKKwlfX3UzMgkJdmFsdWVzW0FVRElUX01BWF9GSUVMRFNdOworCV9fdTMyCQlmaWVsZGZsYWdzW0FVRElUX01BWF9GSUVMRFNdOworCV9fdTMyCQlidWZsZW47CS8qIHRvdGFsIGxlbmd0aCBvZiBzdHJpbmcgZmllbGRzICovCisJY2hhcgkJYnVmWzBdOwkvKiBzdHJpbmcgZmllbGRzIGJ1ZmZlciAqLworfTsKKworLyogYXVkaXRfcnVsZSBpcyBzdXBwb3J0ZWQgdG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCisgKiB1c2Vyc3BhY2UuICBJdCBzdXBwb3J0cyBpbnRlZ2VyIGZpZWxkcyBvbmx5IGFuZCBjb3JyZXNwb25kcyB0bworICogQVVESVRfQURELCBBVURJVF9ERUwgYW5kIEFVRElUX0xJU1QgcmVxdWVzdHMuCisgKi8KK3N0cnVjdCBhdWRpdF9ydWxlIHsJCS8qIGZvciBBVURJVF9MSVNULCBBVURJVF9BREQsIGFuZCBBVURJVF9ERUwgKi8KKwlfX3UzMgkJZmxhZ3M7CS8qIEFVRElUX1BFUl97VEFTSyxDQUxMfSwgQVVESVRfUFJFUEVORCAqLworCV9fdTMyCQlhY3Rpb247CS8qIEFVRElUX05FVkVSLCBBVURJVF9QT1NTSUJMRSwgQVVESVRfQUxXQVlTICovCisJX191MzIJCWZpZWxkX2NvdW50OworCV9fdTMyCQltYXNrW0FVRElUX0JJVE1BU0tfU0laRV07CisJX191MzIJCWZpZWxkc1tBVURJVF9NQVhfRklFTERTXTsKKwlfX3UzMgkJdmFsdWVzW0FVRElUX01BWF9GSUVMRFNdOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1ZnNfdHlwZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdWZzX3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWI0OWJiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdWZzX3R5cGUuaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDEyIEp1bmppcm8gUi4gT2thamltYQorICoKKyAqIFRoaXMgcHJvZ3JhbSwgYXVmcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBfX0FVRlNfVFlQRV9IX18KKyNkZWZpbmUgX19BVUZTX1RZUEVfSF9fCisKKyNkZWZpbmUgQVVGU19OQU1FCSJhdWZzIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKworI2RlZmluZSBBVUZTX1ZFUlNJT04JIjMuMi0yMDEyMDEwOSIKKworLyogdG9kbz8gbW92ZSB0aGlzIHRvIGxpbnV4LTIuNi4xOS9pbmNsdWRlL21hZ2ljLmggKi8KKyNkZWZpbmUgQVVGU19TVVBFUl9NQUdJQwkoJ2EnIDw8IDI0IHwgJ3UnIDw8IDE2IHwgJ2YnIDw8IDggfCAncycpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19BVUZTX0JSQU5DSF9NQVhfMTI3Cit0eXBlZGVmIGludDhfdCBhdWZzX2JpbmRleF90OworI2RlZmluZSBBVUZTX0JSQU5DSF9NQVggMTI3CisjZWxzZQordHlwZWRlZiBpbnQxNl90IGF1ZnNfYmluZGV4X3Q7CisjaWZkZWYgQ09ORklHX0FVRlNfQlJBTkNIX01BWF81MTEKKyNkZWZpbmUgQVVGU19CUkFOQ0hfTUFYIDUxMQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVVGU19CUkFOQ0hfTUFYXzEwMjMpCisjZGVmaW5lIEFVRlNfQlJBTkNIX01BWCAxMDIzCisjZWxpZiBkZWZpbmVkKENPTkZJR19BVUZTX0JSQU5DSF9NQVhfMzI3NjcpCisjZGVmaW5lIEFVRlNfQlJBTkNIX01BWCAzMjc2NworI2VuZGlmCisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQVVGU19GU1RZUEUJCUFVRlNfTkFNRQorCisjZGVmaW5lIEFVRlNfUk9PVF9JTk8JCTIKKyNkZWZpbmUgQVVGU19GSVJTVF9JTk8JCTExCisKKyNkZWZpbmUgQVVGU19XSF9QRlgJCSIud2guIgorI2RlZmluZSBBVUZTX1dIX1BGWF9MRU4JCSgoaW50KXNpemVvZihBVUZTX1dIX1BGWCkgLSAxKQorI2RlZmluZSBBVUZTX1dIX1RNUF9MRU4JCTQKKy8qIGEgbGltaXQgZm9yIHJtZGlyL3JlbmFtZSBhIGRpciAqLworI2RlZmluZSBBVUZTX01BWF9OQU1FTEVOCShOQU1FX01BWCBcCisJCQkJLSBBVUZTX1dIX1BGWF9MRU4gKiAyCS8qIGRvdWJseSB3aGl0ZW91dGVkICovXAorCQkJCS0gMQkJCS8qIGRvdCAqL1wKKwkJCQktIEFVRlNfV0hfVE1QX0xFTikJLyogaGV4ICovCisjZGVmaW5lIEFVRlNfWElOT19GTkFNRQkJIi4iIEFVRlNfTkFNRSAiLnhpbm8iCisjZGVmaW5lIEFVRlNfWElOT19ERUZQQVRICSIvdG1wLyIgQVVGU19YSU5PX0ZOQU1FCisjZGVmaW5lIEFVRlNfWElOT19UUlVOQ19JTklUCTY0IC8qIGJsb2NrcyAqLworI2RlZmluZSBBVUZTX1hJTk9fVFJVTkNfU1RFUAk0ICAvKiBibG9ja3MgKi8KKyNkZWZpbmUgQVVGU19ESVJXSF9ERUYJCTMKKyNkZWZpbmUgQVVGU19SRENBQ0hFX0RFRgkxMCAvKiBzZWNvbmRzICovCisjZGVmaW5lIEFVRlNfUkRDQUNIRV9NQVgJMzYwMCAvKiBzZWNvbmRzICovCisjZGVmaW5lIEFVRlNfUkRCTEtfREVGCQk1MTIgLyogYnl0ZXMgKi8KKyNkZWZpbmUgQVVGU19SREhBU0hfREVGCQkzMgorI2RlZmluZSBBVUZTX1dLUV9OQU1FCQlBVUZTX05BTUUgImQiCisjZGVmaW5lIEFVRlNfTUZTX0RFRl9TRUMJMzAgLyogc2Vjb25kcyAqLworI2RlZmluZSBBVUZTX01GU19NQVhfU0VDCTM2MDAgLyogc2Vjb25kcyAqLworI2RlZmluZSBBVUZTX1BMSU5LX1dBUk4JCTEwMCAvKiBudW1iZXIgb2YgcGxpbmtzICovCisKKy8qIHBzZXVkby1saW5rIG1haW50ZW5hY2UgdW5kZXIgL3Byb2MgKi8KKyNkZWZpbmUgQVVGU19QTElOS19NQUlOVF9OQU1FCSJwbGlua19tYWludCIKKyNkZWZpbmUgQVVGU19QTElOS19NQUlOVF9ESVIJImZzLyIgQVVGU19OQU1FCisjZGVmaW5lIEFVRlNfUExJTktfTUFJTlRfUEFUSAlBVUZTX1BMSU5LX01BSU5UX0RJUiAiLyIgQVVGU19QTElOS19NQUlOVF9OQU1FCisKKyNkZWZpbmUgQVVGU19ESVJPUFFfTkFNRQlBVUZTX1dIX1BGWCAiLm9wcSIgLyogd2hpdGVvdXRlZCBkb3VibHkgKi8KKyNkZWZpbmUgQVVGU19XSF9ESVJPUFEJCUFVRlNfV0hfUEZYIEFVRlNfRElST1BRX05BTUUKKworI2RlZmluZSBBVUZTX0JBU0VfTkFNRQkJQVVGU19XSF9QRlggQVVGU19OQU1FCisjZGVmaW5lIEFVRlNfUExJTktESVJfTkFNRQlBVUZTX1dIX1BGWCAicGxuayIKKyNkZWZpbmUgQVVGU19PUlBIRElSX05BTUUJQVVGU19XSF9QRlggIm9ycGgiCisKKy8qIGRvdWJseSB3aGl0ZW91dGVkICovCisjZGVmaW5lIEFVRlNfV0hfQkFTRQkJQVVGU19XSF9QRlggQVVGU19CQVNFX05BTUUKKyNkZWZpbmUgQVVGU19XSF9QTElOS0RJUglBVUZTX1dIX1BGWCBBVUZTX1BMSU5LRElSX05BTUUKKyNkZWZpbmUgQVVGU19XSF9PUlBIRElSCQlBVUZTX1dIX1BGWCBBVUZTX09SUEhESVJfTkFNRQorCisvKiBicmFuY2ggcGVybWlzc2lvbnMgYW5kIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgQVVGU19CUlBFUk1fUlcJCSJydyIKKyNkZWZpbmUgQVVGU19CUlBFUk1fUk8JCSJybyIKKyNkZWZpbmUgQVVGU19CUlBFUk1fUlIJCSJyciIKKyNkZWZpbmUgQVVGU19CUlJBVFRSX1dICQkid2giCisjZGVmaW5lIEFVRlNfQlJXQVRUUl9OTFdICSJub2x3aCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBpb2N0bCAqLworZW51bSB7CisJLyogcmVhZGRpciBpbiB1c2Vyc3BhY2UgKi8KKwlBdUN0bF9SRFUsCisJQXVDdGxfUkRVX0lOTywKKworCS8qIHBhdGhjb25mIHdyYXBwZXIgKi8KKwlBdUN0bF9XQlJfRkQsCisKKwkvKiBidXN5IGlub2RlICovCisJQXVDdGxfSUJVU1kKK307CisKKy8qIGJvcnJvd2VkIGZyb20gbGludXgvaW5jbHVkZS9saW51eC9rZXJuZWwuaCAqLworI2lmbmRlZiBBTElHTgorI2RlZmluZSBBTElHTih4LCBhKQkJX19BTElHTl9NQVNLKHgsICh0eXBlb2YoeCkpKGEpLTEpCisjZGVmaW5lIF9fQUxJR05fTUFTSyh4LCBtYXNrKQkoKCh4KSsobWFzaykpJn4obWFzaykpCisjZW5kaWYKKworLyogYm9ycm93ZWQgZnJvbSBsaW51eC9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLWdjYzMuaCAqLworI2lmbmRlZiBfX2FsaWduZWQKKyNkZWZpbmUgX19hbGlnbmVkKHgpCQkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZCh4KSkpCisjZW5kaWYKKworCitzdHJ1Y3QgYXVfcmR1X2Nvb2tpZSB7CisJdWludDY0X3QJaF9wb3M7CisJaW50MTZfdAkJYmluZGV4OworCXVpbnQ4X3QJCWZsYWdzOworCXVpbnQ4X3QJCXBhZDsKKwl1aW50MzJfdAlnZW5lcmF0aW9uOworfSBfX2FsaWduZWQoOCk7CisKK3N0cnVjdCBhdV9yZHVfZW50IHsKKwl1aW50NjRfdAlpbm87CisJaW50MTZfdAkJYmluZGV4OworCXVpbnQ4X3QJCXR5cGU7CisJdWludDhfdAkJbmxlbjsKKwl1aW50OF90CQl3aDsKKwljaGFyCQluYW1lWzBdOworfSBfX2FsaWduZWQoOCk7CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBhdV9yZHVfbGVuKGludCBubGVuKQoreworCS8qIGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nIE5VTEwgKi8KKwlyZXR1cm4gQUxJR04oc2l6ZW9mKHN0cnVjdCBhdV9yZHVfZW50KSArIG5sZW4gKyAxLAorCQkgICAgIHNpemVvZih1aW50NjRfdCkpOworfQorCit1bmlvbiBhdV9yZHVfZW50X3VsIHsKKwlzdHJ1Y3QgYXVfcmR1X2VudCAqZTsKKwl1aW50NjRfdAkJCXVsOworfTsKKworZW51bSB7CisJQXVmc0N0bFJkdVZfU1osCisJQXVmc0N0bFJkdVZfRW5kCit9OworCitzdHJ1Y3QgYXVmc19yZHUgeworCS8qIGlucHV0ICovCisJdW5pb24geworCQl1aW50NjRfdAlzejsJLyogQXVDdGxfUkRVICovCisJCXVpbnQ2NF90CW5lbnQ7CS8qIEF1Q3RsX1JEVV9JTk8gKi8KKwl9OworCXVuaW9uIGF1X3JkdV9lbnRfdWwJZW50OworCXVpbnQxNl90CQl2ZXJpZnlbQXVmc0N0bFJkdVZfRW5kXTsKKworCS8qIGlucHV0L291dHB1dCAqLworCXVpbnQzMl90CQlibGs7CisKKwkvKiBvdXRwdXQgKi8KKwl1bmlvbiBhdV9yZHVfZW50X3VsCXRhaWw7CisJLyogbnVtYmVyIG9mIGVudHJpZXMgd2hpY2ggd2VyZSBhZGRlZCBpbiBhIHNpbmdsZSBjYWxsICovCisJdWludDY0X3QJCXJlbnQ7CisJdWludDhfdAkJCWZ1bGw7CisJdWludDhfdAkJCXNod2g7CisKKwlzdHJ1Y3QgYXVfcmR1X2Nvb2tpZQljb29raWU7Cit9IF9fYWxpZ25lZCg4KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgYXVmc193YnJfZmQgeworCXVpbnQzMl90CW9mbGFnczsKKwlpbnQxNl90CQlicmlkOworfSBfX2FsaWduZWQoOCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGF1ZnNfaWJ1c3kgeworCXVpbnQ2NF90CWlubywgaF9pbm87CisJaW50MTZfdAkJYmluZGV4OworfSBfX2FsaWduZWQoOCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBBdUN0bFR5cGUJCSdBJworI2RlZmluZSBBVUZTX0NUTF9SRFUJCV9JT1dSKEF1Q3RsVHlwZSwgQXVDdGxfUkRVLCBzdHJ1Y3QgYXVmc19yZHUpCisjZGVmaW5lIEFVRlNfQ1RMX1JEVV9JTk8JX0lPV1IoQXVDdGxUeXBlLCBBdUN0bF9SRFVfSU5PLCBzdHJ1Y3QgYXVmc19yZHUpCisjZGVmaW5lIEFVRlNfQ1RMX1dCUl9GRAkJX0lPVyhBdUN0bFR5cGUsIEF1Q3RsX1dCUl9GRCwgXAorCQkJCSAgICAgc3RydWN0IGF1ZnNfd2JyX2ZkKQorI2RlZmluZSBBVUZTX0NUTF9JQlVTWQkJX0lPV1IoQXVDdGxUeXBlLCBBdUN0bF9JQlVTWSwgc3RydWN0IGF1ZnNfaWJ1c3kpCisKKyNlbmRpZiAvKiBfX0FVRlNfVFlQRV9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXV0b19mcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdXRvX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmODZlNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXV0b19mcy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgCisgKiBsaW51eC9pbmNsdWRlL2xpbnV4L2F1dG9fZnMuaAorICoKKyAqICAgQ29weXJpZ2h0IDE5OTcgVHJhbnNtZXRhIENvcnBvcmF0aW9uIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworI2lmbmRlZiBfTElOVVhfQVVUT19GU19ICisjZGVmaW5lIF9MSU5VWF9BVVRPX0ZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKy8qIFRoaXMgZmlsZSBkZXNjcmliZXMgYXV0b2ZzIHYzICovCisjZGVmaW5lIEFVVE9GU19QUk9UT19WRVJTSU9OCTMKKworLyogUmFuZ2Ugb2YgcHJvdG9jb2wgdmVyc2lvbnMgZGVmaW5lZCAqLworI2RlZmluZSBBVVRPRlNfTUFYX1BST1RPX1ZFUlNJT04JQVVUT0ZTX1BST1RPX1ZFUlNJT04KKyNkZWZpbmUgQVVUT0ZTX01JTl9QUk9UT19WRVJTSU9OCUFVVE9GU19QUk9UT19WRVJTSU9OCisKKy8qCisgKiBBcmNoaXRlY3R1cmVzIHdoZXJlIGJvdGggMzItIGFuZCA2NC1iaXQgYmluYXJpZXMgY2FuIGJlIGV4ZWN1dGVkCisgKiBvbiA2NC1iaXQga2VybmVscyBuZWVkIHRoaXMuICBUaGlzIGtlZXBzIHRoZSBzdHJ1Y3R1cmUgZm9ybWF0CisgKiB1bmlmb3JtLCBhbmQgbWFrZXMgc3VyZSB0aGUgd2FpdF9xdWV1ZV90b2tlbiBpc24ndCB0b28gYmlnIHRvIGJlCisgKiBwYXNzZWQgYmFjayBkb3duIHRvIHRoZSBrZXJuZWwuCisgKgorICogVGhpcyBhc3N1bWVzIHRoYXQgb24gdGhlc2UgYXJjaGl0ZWN0dXJlczoKKyAqIG1vZGUgICAgIDMyIGJpdCAgICA2NCBiaXQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGludCAgICAgIDMyIGJpdCAgICAzMiBiaXQKKyAqIGxvbmcgICAgIDMyIGJpdCAgICA2NCBiaXQKKyAqCisgKiBJZiBzbywgMzItYml0IHVzZXItc3BhY2UgY29kZSBzaG91bGQgYmUgYmFja3dhcmRzIGNvbXBhdGlibGUuCisgKi8KKworI2lmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIFwKKyB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fczM5MF9fKQordHlwZWRlZiB1bnNpZ25lZCBpbnQgYXV0b2ZzX3dxdF90OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBhdXRvZnNfd3F0X3Q7CisjZW5kaWYKKworLyogUGFja2V0IHR5cGVzICovCisjZGVmaW5lIGF1dG9mc19wdHlwZV9taXNzaW5nCTAJLyogTWlzc2luZyBlbnRyeSAobW91bnQgcmVxdWVzdCkgKi8KKyNkZWZpbmUgYXV0b2ZzX3B0eXBlX2V4cGlyZQkxCS8qIEV4cGlyZSBlbnRyeSAodW1vdW50IHJlcXVlc3QpICovCisKK3N0cnVjdCBhdXRvZnNfcGFja2V0X2hkciB7CisJaW50IHByb3RvX3ZlcnNpb247CQkvKiBQcm90b2NvbCB2ZXJzaW9uICovCisJaW50IHR5cGU7CQkJLyogVHlwZSBvZiBwYWNrZXQgKi8KK307CisKK3N0cnVjdCBhdXRvZnNfcGFja2V0X21pc3NpbmcgeworCXN0cnVjdCBhdXRvZnNfcGFja2V0X2hkciBoZHI7CisgICAgICAgIGF1dG9mc193cXRfdCB3YWl0X3F1ZXVlX3Rva2VuOworCWludCBsZW47CisJY2hhciBuYW1lW05BTUVfTUFYKzFdOworfTsJCisKKy8qIHYzIGV4cGlyZSAodmlhIGlvY3RsKSAqLworc3RydWN0IGF1dG9mc19wYWNrZXRfZXhwaXJlIHsKKwlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9oZHIgaGRyOworCWludCBsZW47CisJY2hhciBuYW1lW05BTUVfTUFYKzFdOworfTsKKworI2RlZmluZSBBVVRPRlNfSU9DX1JFQURZICAgICAgX0lPKDB4OTMsMHg2MCkKKyNkZWZpbmUgQVVUT0ZTX0lPQ19GQUlMICAgICAgIF9JTygweDkzLDB4NjEpCisjZGVmaW5lIEFVVE9GU19JT0NfQ0FUQVRPTklDICBfSU8oMHg5MywweDYyKQorI2RlZmluZSBBVVRPRlNfSU9DX1BST1RPVkVSICAgX0lPUigweDkzLDB4NjMsaW50KQorI2RlZmluZSBBVVRPRlNfSU9DX1NFVFRJTUVPVVQzMiBfSU9XUigweDkzLDB4NjQsY29tcGF0X3Vsb25nX3QpCisjZGVmaW5lIEFVVE9GU19JT0NfU0VUVElNRU9VVCBfSU9XUigweDkzLDB4NjQsdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgQVVUT0ZTX0lPQ19FWFBJUkUgICAgIF9JT1IoMHg5MywweDY1LHN0cnVjdCBhdXRvZnNfcGFja2V0X2V4cGlyZSkKKworI2VuZGlmIC8qIF9MSU5VWF9BVVRPX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXV0b19mczQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXV0b19mczQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzRhYTc1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdXRvX2ZzNC5oCkBAIC0wLDAgKzEsMTY0IEBACisvKiAtKi0gYyAtKi0KKyAqIGxpbnV4L2luY2x1ZGUvbGludXgvYXV0b19mczQuaAorICoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDAgSmVyZW15IEZpdHpoYXJkaW5nZSA8amVyZW15QGdvb3Aub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FVVE9fRlM0X0gKKyNkZWZpbmUgX0xJTlVYX0FVVE9fRlM0X0gKKworLyogSW5jbHVkZSBjb21tb24gdjMgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F1dG9fZnMuaD4KKworLyogYXV0b2ZzIHY0IGRlZmluaXRpb25zICovCisjdW5kZWYgQVVUT0ZTX1BST1RPX1ZFUlNJT04KKyN1bmRlZiBBVVRPRlNfTUlOX1BST1RPX1ZFUlNJT04KKyN1bmRlZiBBVVRPRlNfTUFYX1BST1RPX1ZFUlNJT04KKworI2RlZmluZSBBVVRPRlNfUFJPVE9fVkVSU0lPTgkJNQorI2RlZmluZSBBVVRPRlNfTUlOX1BST1RPX1ZFUlNJT04JMworI2RlZmluZSBBVVRPRlNfTUFYX1BST1RPX1ZFUlNJT04JNQorCisjZGVmaW5lIEFVVE9GU19QUk9UT19TVUJWRVJTSU9OCQkyCisKKy8qIE1hc2sgZm9yIGV4cGlyZSBiZWhhdmlvdXIgKi8KKyNkZWZpbmUgQVVUT0ZTX0VYUF9JTU1FRElBVEUJCTEKKyNkZWZpbmUgQVVUT0ZTX0VYUF9MRUFWRVMJCTIKKworI2RlZmluZSBBVVRPRlNfVFlQRV9BTlkJCQkwVQorI2RlZmluZSBBVVRPRlNfVFlQRV9JTkRJUkVDVAkJMVUKKyNkZWZpbmUgQVVUT0ZTX1RZUEVfRElSRUNUCQkyVQorI2RlZmluZSBBVVRPRlNfVFlQRV9PRkZTRVQJCTRVCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X2F1dG9mc190eXBlX2luZGlyZWN0KHVuc2lnbmVkIGludCAqdHlwZSkKK3sKKwkqdHlwZSA9IEFVVE9GU19UWVBFX0lORElSRUNUOworCXJldHVybjsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGF1dG9mc190eXBlX2luZGlyZWN0KHVuc2lnbmVkIGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBBVVRPRlNfVFlQRV9JTkRJUkVDVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X2F1dG9mc190eXBlX2RpcmVjdCh1bnNpZ25lZCBpbnQgKnR5cGUpCit7CisJKnR5cGUgPSBBVVRPRlNfVFlQRV9ESVJFQ1Q7CisJcmV0dXJuOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgYXV0b2ZzX3R5cGVfZGlyZWN0KHVuc2lnbmVkIGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBBVVRPRlNfVFlQRV9ESVJFQ1QpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF9hdXRvZnNfdHlwZV9vZmZzZXQodW5zaWduZWQgaW50ICp0eXBlKQoreworCSp0eXBlID0gQVVUT0ZTX1RZUEVfT0ZGU0VUOworCXJldHVybjsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGF1dG9mc190eXBlX29mZnNldCh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gQVVUT0ZTX1RZUEVfT0ZGU0VUKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGF1dG9mc190eXBlX3RyaWdnZXIodW5zaWduZWQgaW50IHR5cGUpCit7CisJcmV0dXJuICh0eXBlID09IEFVVE9GU19UWVBFX0RJUkVDVCB8fCB0eXBlID09IEFVVE9GU19UWVBFX09GRlNFVCk7Cit9CisKKy8qCisgKiBUaGlzIGlzbid0IHJlYWxseSBhIHR5cGUgYXMgd2UgdXNlIGl0IHRvIHNheSAibm8gdHlwZSBzZXQiIHRvCisgKiBpbmRpY2F0ZSB3ZSB3YW50IHRvIHNlYXJjaCBmb3IgImFueSIgbW91bnQgaW4gdGhlCisgKiBhdXRvZnNfZGV2X2lvY3RsX2lzbW91bnRwb2ludCgpIGRldmljZSBpb2N0bCBmdW5jdGlvbi4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfYXV0b2ZzX3R5cGVfYW55KHVuc2lnbmVkIGludCAqdHlwZSkKK3sKKwkqdHlwZSA9IEFVVE9GU19UWVBFX0FOWTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBhdXRvZnNfdHlwZV9hbnkodW5zaWduZWQgaW50IHR5cGUpCit7CisJcmV0dXJuICh0eXBlID09IEFVVE9GU19UWVBFX0FOWSk7Cit9CisKKy8qIERhZW1vbiBub3RpZmljYXRpb24gcGFja2V0IHR5cGVzICovCitlbnVtIGF1dG9mc19ub3RpZnkgeworCU5GWV9OT05FLAorCU5GWV9NT1VOVCwKKwlORllfRVhQSVJFCit9OworCisvKiBLZXJuZWwgcHJvdG9jb2wgdmVyc2lvbiA0IHBhY2tldCB0eXBlcyAqLworCisvKiBFeHBpcmUgZW50cnkgKHVtb3VudCByZXF1ZXN0KSAqLworI2RlZmluZSBhdXRvZnNfcHR5cGVfZXhwaXJlX211bHRpCTIKKworLyogS2VybmVsIHByb3RvY29sIHZlcnNpb24gNSBwYWNrZXQgdHlwZXMgKi8KKworLyogSW5kaXJlY3QgbW91bnQgbWlzc2luZyBhbmQgZXhwaXJlIHJlcXVlc3RzLiAqLworI2RlZmluZSBhdXRvZnNfcHR5cGVfbWlzc2luZ19pbmRpcmVjdAkzCisjZGVmaW5lIGF1dG9mc19wdHlwZV9leHBpcmVfaW5kaXJlY3QJNAorCisvKiBEaXJlY3QgbW91bnQgbWlzc2luZyBhbmQgZXhwaXJlIHJlcXVlc3RzICovCisjZGVmaW5lIGF1dG9mc19wdHlwZV9taXNzaW5nX2RpcmVjdAk1CisjZGVmaW5lIGF1dG9mc19wdHlwZV9leHBpcmVfZGlyZWN0CTYKKworLyogdjQgbXVsdGkgZXhwaXJlICh2aWEgcGlwZSkgKi8KK3N0cnVjdCBhdXRvZnNfcGFja2V0X2V4cGlyZV9tdWx0aSB7CisJc3RydWN0IGF1dG9mc19wYWNrZXRfaGRyIGhkcjsKKyAgICAgICAgYXV0b2ZzX3dxdF90IHdhaXRfcXVldWVfdG9rZW47CisJaW50IGxlbjsKKwljaGFyIG5hbWVbTkFNRV9NQVgrMV07Cit9OworCit1bmlvbiBhdXRvZnNfcGFja2V0X3VuaW9uIHsKKwlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9oZHIgaGRyOworCXN0cnVjdCBhdXRvZnNfcGFja2V0X21pc3NpbmcgbWlzc2luZzsKKwlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmUgZXhwaXJlOworCXN0cnVjdCBhdXRvZnNfcGFja2V0X2V4cGlyZV9tdWx0aSBleHBpcmVfbXVsdGk7Cit9OworCisvKiBhdXRvZnMgdjUgY29tbW9uIHBhY2tldCBzdHJ1Y3QgKi8KK3N0cnVjdCBhdXRvZnNfdjVfcGFja2V0IHsKKwlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9oZHIgaGRyOworCWF1dG9mc193cXRfdCB3YWl0X3F1ZXVlX3Rva2VuOworCV9fdTMyIGRldjsKKwlfX3U2NCBpbm87CisJX191MzIgdWlkOworCV9fdTMyIGdpZDsKKwlfX3UzMiBwaWQ7CisJX191MzIgdGdpZDsKKwlfX3UzMiBsZW47CisJY2hhciBuYW1lW05BTUVfTUFYKzFdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgYXV0b2ZzX3Y1X3BhY2tldCBhdXRvZnNfcGFja2V0X21pc3NpbmdfaW5kaXJlY3RfdDsKK3R5cGVkZWYgc3RydWN0IGF1dG9mc192NV9wYWNrZXQgYXV0b2ZzX3BhY2tldF9leHBpcmVfaW5kaXJlY3RfdDsKK3R5cGVkZWYgc3RydWN0IGF1dG9mc192NV9wYWNrZXQgYXV0b2ZzX3BhY2tldF9taXNzaW5nX2RpcmVjdF90OwordHlwZWRlZiBzdHJ1Y3QgYXV0b2ZzX3Y1X3BhY2tldCBhdXRvZnNfcGFja2V0X2V4cGlyZV9kaXJlY3RfdDsKKwordW5pb24gYXV0b2ZzX3Y1X3BhY2tldF91bmlvbiB7CisJc3RydWN0IGF1dG9mc19wYWNrZXRfaGRyIGhkcjsKKwlzdHJ1Y3QgYXV0b2ZzX3Y1X3BhY2tldCB2NV9wYWNrZXQ7CisJYXV0b2ZzX3BhY2tldF9taXNzaW5nX2luZGlyZWN0X3QgbWlzc2luZ19pbmRpcmVjdDsKKwlhdXRvZnNfcGFja2V0X2V4cGlyZV9pbmRpcmVjdF90IGV4cGlyZV9pbmRpcmVjdDsKKwlhdXRvZnNfcGFja2V0X21pc3NpbmdfZGlyZWN0X3QgbWlzc2luZ19kaXJlY3Q7CisJYXV0b2ZzX3BhY2tldF9leHBpcmVfZGlyZWN0X3QgZXhwaXJlX2RpcmVjdDsKK307CisKKyNkZWZpbmUgQVVUT0ZTX0lPQ19FWFBJUkVfTVVMVEkJCV9JT1coMHg5MywweDY2LGludCkKKyNkZWZpbmUgQVVUT0ZTX0lPQ19FWFBJUkVfSU5ESVJFQ1QJQVVUT0ZTX0lPQ19FWFBJUkVfTVVMVEkKKyNkZWZpbmUgQVVUT0ZTX0lPQ19FWFBJUkVfRElSRUNUCUFVVE9GU19JT0NfRVhQSVJFX01VTFRJCisjZGVmaW5lIEFVVE9GU19JT0NfUFJPVE9TVUJWRVIJCV9JT1IoMHg5MywweDY3LGludCkKKyNkZWZpbmUgQVVUT0ZTX0lPQ19BU0tVTU9VTlQJCV9JT1IoMHg5MywweDcwLGludCkKKworCisjZW5kaWYgLyogX0xJTlVYX0FVVE9fRlM0X0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXV4dmVjLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDEzY2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgX0xJTlVYX0FVWFZFQ19ICisjZGVmaW5lIF9MSU5VWF9BVVhWRUNfSAorCisjaW5jbHVkZSA8YXNtL2F1eHZlYy5oPgorCisvKiBTeW1ib2xpYyB2YWx1ZXMgZm9yIHRoZSBlbnRyaWVzIGluIHRoZSBhdXhpbGlhcnkgdGFibGUKKyAgIHB1dCBvbiB0aGUgaW5pdGlhbCBzdGFjayAqLworI2RlZmluZSBBVF9OVUxMICAgMAkvKiBlbmQgb2YgdmVjdG9yICovCisjZGVmaW5lIEFUX0lHTk9SRSAxCS8qIGVudHJ5IHNob3VsZCBiZSBpZ25vcmVkICovCisjZGVmaW5lIEFUX0VYRUNGRCAyCS8qIGZpbGUgZGVzY3JpcHRvciBvZiBwcm9ncmFtICovCisjZGVmaW5lIEFUX1BIRFIgICAzCS8qIHByb2dyYW0gaGVhZGVycyBmb3IgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9QSEVOVCAgNAkvKiBzaXplIG9mIHByb2dyYW0gaGVhZGVyIGVudHJ5ICovCisjZGVmaW5lIEFUX1BITlVNICA1CS8qIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnMgKi8KKyNkZWZpbmUgQVRfUEFHRVNaIDYJLyogc3lzdGVtIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBBVF9CQVNFICAgNwkvKiBiYXNlIGFkZHJlc3Mgb2YgaW50ZXJwcmV0ZXIgKi8KKyNkZWZpbmUgQVRfRkxBR1MgIDgJLyogZmxhZ3MgKi8KKyNkZWZpbmUgQVRfRU5UUlkgIDkJLyogZW50cnkgcG9pbnQgb2YgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9OT1RFTEYgMTAJLyogcHJvZ3JhbSBpcyBub3QgRUxGICovCisjZGVmaW5lIEFUX1VJRCAgICAxMQkvKiByZWFsIHVpZCAqLworI2RlZmluZSBBVF9FVUlEICAgMTIJLyogZWZmZWN0aXZlIHVpZCAqLworI2RlZmluZSBBVF9HSUQgICAgMTMJLyogcmVhbCBnaWQgKi8KKyNkZWZpbmUgQVRfRUdJRCAgIDE0CS8qIGVmZmVjdGl2ZSBnaWQgKi8KKyNkZWZpbmUgQVRfUExBVEZPUk0gMTUgIC8qIHN0cmluZyBpZGVudGlmeWluZyBDUFUgZm9yIG9wdGltaXphdGlvbnMgKi8KKyNkZWZpbmUgQVRfSFdDQVAgIDE2ICAgIC8qIGFyY2ggZGVwZW5kZW50IGhpbnRzIGF0IENQVSBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQVRfQ0xLVENLIDE3CS8qIGZyZXF1ZW5jeSBhdCB3aGljaCB0aW1lcygpIGluY3JlbWVudHMgKi8KKy8qIEFUXyogdmFsdWVzIDE4IHRocm91Z2ggMjIgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIEFUX1NFQ1VSRSAyMyAgIC8qIHNlY3VyZSBtb2RlIGJvb2xlYW4gKi8KKyNkZWZpbmUgQVRfQkFTRV9QTEFURk9STSAyNAkvKiBzdHJpbmcgaWRlbnRpZnlpbmcgcmVhbCBwbGF0Zm9ybSwgbWF5CisJCQkJICogZGlmZmVyIGZyb20gQVRfUExBVEZPUk0uICovCisjZGVmaW5lIEFUX1JBTkRPTSAyNQkvKiBhZGRyZXNzIG9mIDE2IHJhbmRvbSBieXRlcyAqLworCisjZGVmaW5lIEFUX0VYRUNGTiAgMzEJLyogZmlsZW5hbWUgb2YgcHJvZ3JhbSAqLworCisKKyNlbmRpZiAvKiBfTElOVVhfQVVYVkVDX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXgyNS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9heDI1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjODlhNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXgyNS5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogVGhlc2UgYXJlIHRoZSBwdWJsaWMgZWxlbWVudHMgb2YgdGhlIExpbnV4IGtlcm5lbCBBWC4yNSBjb2RlLiBBIHNpbWlsYXIKKyAqIGZpbGUgbmV0cm9tLmggZXhpc3RzIGZvciB0aGUgTkVUL1JPTSBwcm90b2NvbC4KKyAqLworCisjaWZuZGVmCUFYMjVfS0VSTkVMX0gKKyNkZWZpbmUJQVgyNV9LRVJORUxfSAorCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisKKyNkZWZpbmUgQVgyNV9NVFUJMjU2CisjZGVmaW5lIEFYMjVfTUFYX0RJR0lTICA4CisKKyNkZWZpbmUgQVgyNV9XSU5ET1cJMQorI2RlZmluZSBBWDI1X1QxCQkyCisjZGVmaW5lIEFYMjVfTjIJCTMKKyNkZWZpbmUgQVgyNV9UMwkJNAorI2RlZmluZSBBWDI1X1QyCQk1CisjZGVmaW5lCUFYMjVfQkFDS09GRgk2CisjZGVmaW5lCUFYMjVfRVhUU0VRCTcKKyNkZWZpbmUJQVgyNV9QSURJTkNMCTgKKyNkZWZpbmUgQVgyNV9JRExFCTkKKyNkZWZpbmUgQVgyNV9QQUNMRU4JMTAKKyNkZWZpbmUgQVgyNV9JQU1ESUdJCTEyCisKKyNkZWZpbmUgQVgyNV9LSUxMCTk5CisKKyNkZWZpbmUgU0lPQ0FYMjVHRVRVSUQJCShTSU9DUFJPVE9QUklWQVRFKzApCisjZGVmaW5lIFNJT0NBWDI1QUREVUlECQkoU0lPQ1BST1RPUFJJVkFURSsxKQorI2RlZmluZSBTSU9DQVgyNURFTFVJRAkJKFNJT0NQUk9UT1BSSVZBVEUrMikKKyNkZWZpbmUgU0lPQ0FYMjVOT1VJRAkJKFNJT0NQUk9UT1BSSVZBVEUrMykKKyNkZWZpbmUgU0lPQ0FYMjVPUFRSVAkJKFNJT0NQUk9UT1BSSVZBVEUrNykKKyNkZWZpbmUgU0lPQ0FYMjVDVExDT04JCShTSU9DUFJPVE9QUklWQVRFKzgpCisjZGVmaW5lIFNJT0NBWDI1R0VUSU5GT09MRAkoU0lPQ1BST1RPUFJJVkFURSs5KQorI2RlZmluZSBTSU9DQVgyNUFEREZXRAkJKFNJT0NQUk9UT1BSSVZBVEUrMTApCisjZGVmaW5lIFNJT0NBWDI1REVMRldECQkoU0lPQ1BST1RPUFJJVkFURSsxMSkKKyNkZWZpbmUgU0lPQ0FYMjVERVZDVEwgICAgICAgICAgKFNJT0NQUk9UT1BSSVZBVEUrMTIpCisjZGVmaW5lIFNJT0NBWDI1R0VUSU5GTyAgICAgICAgIChTSU9DUFJPVE9QUklWQVRFKzEzKQorCisjZGVmaW5lIEFYMjVfU0VUX1JUX0lQTU9ERQkyCisKKyNkZWZpbmUgQVgyNV9OT1VJRF9ERUZBVUxUCTAKKyNkZWZpbmUgQVgyNV9OT1VJRF9CTE9DSwkxCisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyCQlheDI1X2NhbGxbN107CS8qIDYgY2FsbCArIFNTSUQgKHNoaWZ0ZWQgYXNjaWkhKSAqLworfSBheDI1X2FkZHJlc3M7CisKK3N0cnVjdCBzb2NrYWRkcl9heDI1IHsKKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCBzYXgyNV9mYW1pbHk7CisJYXgyNV9hZGRyZXNzCXNheDI1X2NhbGw7CisJaW50CQlzYXgyNV9uZGlnaXM7CisJLyogRGlnaXBlYXRlciBheDI1X2FkZHJlc3Mgc2V0cyBmb2xsb3cgKi8KK307CisKKyNkZWZpbmUgc2F4MjVfdWlkCXNheDI1X25kaWdpcworCitzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9heDI1IHsKKwlzdHJ1Y3Qgc29ja2FkZHJfYXgyNSBmc2FfYXgyNTsKKwlheDI1X2FkZHJlc3MJZnNhX2RpZ2lwZWF0ZXJbQVgyNV9NQVhfRElHSVNdOworfTsKKworc3RydWN0IGF4MjVfcm91dGVzX3N0cnVjdCB7CisJYXgyNV9hZGRyZXNzCXBvcnRfYWRkcjsKKwlheDI1X2FkZHJlc3MJZGVzdF9hZGRyOworCXVuc2lnbmVkIGNoYXIJZGlnaV9jb3VudDsKKwlheDI1X2FkZHJlc3MJZGlnaV9hZGRyW0FYMjVfTUFYX0RJR0lTXTsKK307CisKK3N0cnVjdCBheDI1X3JvdXRlX29wdF9zdHJ1Y3QgeworCWF4MjVfYWRkcmVzcwlwb3J0X2FkZHI7CisJYXgyNV9hZGRyZXNzCWRlc3RfYWRkcjsKKwlpbnQJCWNtZDsKKwlpbnQJCWFyZzsKK307CisKK3N0cnVjdCBheDI1X2N0bF9zdHJ1Y3QgeworICAgICAgICBheDI1X2FkZHJlc3MgICAgICAgICAgICBwb3J0X2FkZHI7CisgICAgICAgIGF4MjVfYWRkcmVzcyAgICAgICAgICAgIHNvdXJjZV9hZGRyOworICAgICAgICBheDI1X2FkZHJlc3MgICAgICAgICAgICBkZXN0X2FkZHI7CisgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIGNtZDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgYXJnOworICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICBkaWdpX2NvdW50OworICAgICAgICBheDI1X2FkZHJlc3MgICAgICAgICAgICBkaWdpX2FkZHJbQVgyNV9NQVhfRElHSVNdOworfTsKKworLyogdGhpcyB3aWxsIGdvIGF3YXkuIFBsZWFzZSBkbyBub3QgZXhwb3J0IHRvIHVzZXIgbGFuZCAqLworc3RydWN0IGF4MjVfaW5mb19zdHJ1Y3RfZGVwcmVjYXRlZCB7CisJdW5zaWduZWQgaW50CW4yLCBuMmNvdW50OworCXVuc2lnbmVkIGludAl0MSwgdDF0aW1lcjsKKwl1bnNpZ25lZCBpbnQJdDIsIHQydGltZXI7CisJdW5zaWduZWQgaW50CXQzLCB0M3RpbWVyOworCXVuc2lnbmVkIGludAlpZGxlLCBpZGxldGltZXI7CisJdW5zaWduZWQgaW50CXN0YXRlOworCXVuc2lnbmVkIGludAlyY3ZfcSwgc25kX3E7Cit9OworCitzdHJ1Y3QgYXgyNV9pbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgaW50CW4yLCBuMmNvdW50OworCXVuc2lnbmVkIGludAl0MSwgdDF0aW1lcjsKKwl1bnNpZ25lZCBpbnQJdDIsIHQydGltZXI7CisJdW5zaWduZWQgaW50CXQzLCB0M3RpbWVyOworCXVuc2lnbmVkIGludAlpZGxlLCBpZGxldGltZXI7CisJdW5zaWduZWQgaW50CXN0YXRlOworCXVuc2lnbmVkIGludAlyY3ZfcSwgc25kX3E7CisJdW5zaWduZWQgaW50CXZzLCB2ciwgdmEsIHZzX21heDsKKwl1bnNpZ25lZCBpbnQJcGFjbGVuOworCXVuc2lnbmVkIGludAl3aW5kb3c7Cit9OworCitzdHJ1Y3QgYXgyNV9md2Rfc3RydWN0IHsKKwlheDI1X2FkZHJlc3MJcG9ydF9mcm9tOworCWF4MjVfYWRkcmVzcwlwb3J0X3RvOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2IxbGxpLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2IxbGxpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzZjcxMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYjFsbGkuaApAQCAtMCwwICsxLDczIEBACisvKiAkSWQ6IGIxbGxpLmgsdiAxLjguOC4zIDIwMDEvMDkvMjMgMjI6MjU6MDUga2FpIEV4cCAkCisgKgorICogSVNETiBsb3dsZXZlbC1tb2R1bGUgZm9yIEFWTSBCMS1jYXJkLgorICoKKyAqIENvcHlyaWdodCAxOTk2IGJ5IENhcnN0ZW4gUGFldGggKGNhbGxlQGNhbGxlLmluLWJlcmxpbi5kZSkKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqLworCisjaWZuZGVmIF9CMUxMSV9IXworI2RlZmluZSBfQjFMTElfSF8KKy8qCisgKiBzdHJ1Y3QgZm9yIGxvYWRpbmcgdDQgZmlsZSAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXZtYjFfdDRmaWxlIHsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7Cit9IGF2bWIxX3Q0ZmlsZTsKKwordHlwZWRlZiBzdHJ1Y3QgYXZtYjFfbG9hZGRlZiB7CisJaW50IGNvbnRyOworCWF2bWIxX3Q0ZmlsZSB0NGZpbGU7Cit9IGF2bWIxX2xvYWRkZWY7CisKK3R5cGVkZWYgc3RydWN0IGF2bWIxX2xvYWRhbmRjb25maWdkZWYgeworCWludCBjb250cjsKKwlhdm1iMV90NGZpbGUgdDRmaWxlOworICAgICAgICBhdm1iMV90NGZpbGUgdDRjb25maWc7IAorfSBhdm1iMV9sb2FkYW5kY29uZmlnZGVmOworCit0eXBlZGVmIHN0cnVjdCBhdm1iMV9yZXNldGRlZiB7CisJaW50IGNvbnRyOworfSBhdm1iMV9yZXNldGRlZjsKKwordHlwZWRlZiBzdHJ1Y3QgYXZtYjFfZ2V0ZGVmIHsKKwlpbnQgY29udHI7CisJaW50IGNhcmR0eXBlOworCWludCBjYXJkc3RhdGU7Cit9IGF2bWIxX2dldGRlZjsKKworLyoKKyAqIHN0cnVjdCBmb3IgYWRkaW5nIG5ldyBjYXJkcyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXZtYjFfY2FyZGRlZiB7CisJaW50IHBvcnQ7CisJaW50IGlycTsKK30gYXZtYjFfY2FyZGRlZjsKKworI2RlZmluZSBBVk1fQ0FSRFRZUEVfQjEJCTAKKyNkZWZpbmUgQVZNX0NBUkRUWVBFX1QxCQkxCisjZGVmaW5lIEFWTV9DQVJEVFlQRV9NMQkJMgorI2RlZmluZSBBVk1fQ0FSRFRZUEVfTTIJCTMKKwordHlwZWRlZiBzdHJ1Y3QgYXZtYjFfZXh0Y2FyZGRlZiB7CisJaW50IHBvcnQ7CisJaW50IGlycTsKKyAgICAgICAgaW50IGNhcmR0eXBlOworICAgICAgICBpbnQgY2FyZG5yOyAgLyogZm9yIEhFTUEvVDEgKi8KK30gYXZtYjFfZXh0Y2FyZGRlZjsKKworI2RlZmluZQlBVk1CMV9MT0FECQkwCS8qIGxvYWQgaW1hZ2UgdG8gY2FyZCAqLworI2RlZmluZSBBVk1CMV9BRERDQVJECQkxCS8qIGFkZCBhIG5ldyBjYXJkIC0gT0JTT0xFVEUgKi8KKyNkZWZpbmUgQVZNQjFfUkVTRVRDQVJECQkyCS8qIHJlc2V0IGEgY2FyZCAqLworI2RlZmluZQlBVk1CMV9MT0FEX0FORF9DT05GSUcJMwkvKiBsb2FkIGltYWdlIGFuZCBjb25maWcgdG8gY2FyZCAqLworI2RlZmluZQlBVk1CMV9BRERDQVJEX1dJVEhfVFlQRQk0CS8qIGFkZCBhIG5ldyBjYXJkLCB3aXRoIGNhcmR0eXBlICovCisjZGVmaW5lIEFWTUIxX0dFVF9DQVJESU5GTwk1CS8qIGdldCBjYXJkdHlwZSAqLworI2RlZmluZSBBVk1CMV9SRU1PVkVDQVJECTYJLyogcmVtb3ZlIGEgY2FyZCAtIE9CU09MRVRFICovCisKKyNkZWZpbmUJQVZNQjFfUkVHSVNURVJDQVJEX0lTX09CU09MRVRFCisKKyNlbmRpZgkJCQkvKiBfQjFMTElfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmF5Y29tLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JheWNvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMjQ5ZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JheWNvbS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBUaGUgTGludXggQkFZQ09NIGRyaXZlciBmb3IgdGhlIEJheWNvbSBzZXJpYWwgMTIwMCBiYXVkIG1vZGVtCisgKiBhbmQgdGhlIHBhcmFsbGVsIDk2MDAgYmF1ZCBtb2RlbQorICogKEMpIDE5OTctMTk5OCBieSBUaG9tYXMgU2FpbGVyLCBIQjlKTlgvQUU0V0EKKyAqLworCisjaWZuZGVmIF9CQVlDT01fSAorI2RlZmluZSBfQkFZQ09NX0gKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBzdHJ1Y3RzIGZvciB0aGUgSU9DVEwgY29tbWFuZHMKKyAqLworCitzdHJ1Y3QgYmF5Y29tX2RlYnVnX2RhdGEgeworCXVuc2lnbmVkIGxvbmcgZGVidWcxOworCXVuc2lnbmVkIGxvbmcgZGVidWcyOworCWxvbmcgZGVidWczOworfTsKKworc3RydWN0IGJheWNvbV9pb2N0bCB7CisJaW50IGNtZDsKKwl1bmlvbiB7CisJCXN0cnVjdCBiYXljb21fZGVidWdfZGF0YSBkYmc7CisJfSBkYXRhOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGlvY3RsIHZhbHVlcyBjaGFuZ2UgZm9yIGJheWNvbQorICovCisjZGVmaW5lIEJBWUNPTUNUTF9HRVRERUJVRyAgICAgICAweDkyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNlbmRpZiAvKiBfQkFZQ09NX0ggKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Jmc19mcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iZnNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBiMzU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iZnNfZnMuaApAQCAtMCwwICsxLDgxIEBACisvKgorICoJaW5jbHVkZS9saW51eC9iZnNfZnMuaCAtIEJGUyBkYXRhIHN0cnVjdHVyZXMgb24gZGlzay4KKyAqCUNvcHlyaWdodCAoQykgMTk5OSBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9CRlNfRlNfSAorI2RlZmluZSBfTElOVVhfQkZTX0ZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgQkZTX0JTSVpFX0JJVFMJCTkKKyNkZWZpbmUgQkZTX0JTSVpFCQkoMTw8QkZTX0JTSVpFX0JJVFMpCisKKyNkZWZpbmUgQkZTX01BR0lDCQkweDFCQURGQUNFCisjZGVmaW5lIEJGU19ST09UX0lOTwkJMgorI2RlZmluZSBCRlNfSU5PREVTX1BFUl9CTE9DSwk4CisKKy8qIFNWUjQgdm5vZGUgdHlwZSB2YWx1ZXMgKGJmc19pbm9kZS0+aV92dHlwZSkgKi8KKyNkZWZpbmUgQkZTX1ZESVIgMkwKKyNkZWZpbmUgQkZTX1ZSRUcgMUwKKworLyogQkZTIGlub2RlIGxheW91dCBvbiBkaXNrICovCitzdHJ1Y3QgYmZzX2lub2RlIHsKKwlfX2xlMTYgaV9pbm87CisJX191MTYgaV91bnVzZWQ7CisJX19sZTMyIGlfc2Jsb2NrOworCV9fbGUzMiBpX2VibG9jazsKKwlfX2xlMzIgaV9lb2Zmc2V0OworCV9fbGUzMiBpX3Z0eXBlOworCV9fbGUzMiBpX21vZGU7CisJX19sZTMyIGlfdWlkOworCV9fbGUzMiBpX2dpZDsKKwlfX2xlMzIgaV9ubGluazsKKwlfX2xlMzIgaV9hdGltZTsKKwlfX2xlMzIgaV9tdGltZTsKKwlfX2xlMzIgaV9jdGltZTsKKwlfX3UzMiBpX3BhZGRpbmdbNF07Cit9OworCisjZGVmaW5lIEJGU19OQU1FTEVOCQkxNAkKKyNkZWZpbmUgQkZTX0RJUkVOVF9TSVpFCQkxNgorI2RlZmluZSBCRlNfRElSU19QRVJfQkxPQ0sJMzIKKworc3RydWN0IGJmc19kaXJlbnQgeworCV9fbGUxNiBpbm87CisJY2hhciBuYW1lW0JGU19OQU1FTEVOXTsKK307CisKKy8qIEJGUyBzdXBlcmJsb2NrIGxheW91dCBvbiBkaXNrICovCitzdHJ1Y3QgYmZzX3N1cGVyX2Jsb2NrIHsKKwlfX2xlMzIgc19tYWdpYzsKKwlfX2xlMzIgc19zdGFydDsKKwlfX2xlMzIgc19lbmQ7CisJX19sZTMyIHNfZnJvbTsKKwlfX2xlMzIgc190bzsKKwlfX3MzMiBzX2Jmcm9tOworCV9fczMyIHNfYnRvOworCWNoYXIgIHNfZnNuYW1lWzZdOworCWNoYXIgIHNfdm9sdW1lWzZdOworCV9fdTMyIHNfcGFkZGluZ1sxMThdOworfTsKKworCisjZGVmaW5lIEJGU19PRkYySU5PKG9mZnNldCkgXAorICAgICAgICAoKCgob2Zmc2V0KSAtIEJGU19CU0laRSkgLyBzaXplb2Yoc3RydWN0IGJmc19pbm9kZSkpICsgQkZTX1JPT1RfSU5PKQorCisjZGVmaW5lIEJGU19JTk8yT0ZGKGlubykgXAorCSgoX191MzIpKCgoaW5vKSAtIEJGU19ST09UX0lOTykgKiBzaXplb2Yoc3RydWN0IGJmc19pbm9kZSkpICsgQkZTX0JTSVpFKQorI2RlZmluZSBCRlNfTlpGSUxFU0laRShpcCkgXAorICAgICAgICAoKGxlMzJfdG9fY3B1KChpcCktPmlfZW9mZnNldCkgKyAxKSAtICBsZTMyX3RvX2NwdSgoaXApLT5pX3NibG9jaykgKiBCRlNfQlNJWkUpCisKKyNkZWZpbmUgQkZTX0ZJTEVTSVpFKGlwKSBcCisgICAgICAgICgoaXApLT5pX3NibG9jayA9PSAwID8gMCA6IEJGU19OWkZJTEVTSVpFKGlwKSkKKworI2RlZmluZSBCRlNfRklMRUJMT0NLUyhpcCkgXAorICAgICAgICAoKGlwKS0+aV9zYmxvY2sgPT0gMCA/IDAgOiAobGUzMl90b19jcHUoKGlwKS0+aV9lYmxvY2spICsgMSkgLSAgbGUzMl90b19jcHUoKGlwKS0+aV9zYmxvY2spKQorI2RlZmluZSBCRlNfVU5DTEVBTihiZnNfc2IsIHNiKQlcCisJKChsZTMyX3RvX2NwdShiZnNfc2ItPnNfZnJvbSkgIT0gLTEpICYmIChsZTMyX3RvX2NwdShiZnNfc2ItPnNfdG8pICE9IC0xKSAmJiAhKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKworCisjZW5kaWYJLyogX0xJTlVYX0JGU19GU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmluZm10cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MTY3OTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9MSU5VWF9CSU5GTVRTX0gKKyNkZWZpbmUgX0xJTlVYX0JJTkZNVFNfSAorCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorCitzdHJ1Y3QgcHRfcmVnczsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgbWF4aW11bSBsZW5ndGggYW5kIG1heGltdW0gbnVtYmVyIG9mIHN0cmluZ3MgcGFzc2VkIHRvIHRoZQorICogZXhlY3ZlKCkgc3lzdGVtIGNhbGwuICBNQVhfQVJHX1NUUkxFTiBpcyBlc3NlbnRpYWxseSByYW5kb20gYnV0IHNlcnZlcyB0bworICogcHJldmVudCB0aGUga2VybmVsIGZyb20gYmVpbmcgdW5kdWx5IGltcGFjdGVkIGJ5IG1pc2FkZHJlc3NlZCBwb2ludGVycy4KKyAqIE1BWF9BUkdfU1RSSU5HUyBpcyBjaG9zZW4gdG8gZml0IGluIGEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLgorICovCisjZGVmaW5lIE1BWF9BUkdfU1RSTEVOIChQQUdFX1NJWkUgKiAzMikKKyNkZWZpbmUgTUFYX0FSR19TVFJJTkdTIDB4N0ZGRkZGRkYKKworLyogc2l6ZW9mKGxpbnV4X2JpbnBybS0+YnVmKSAqLworI2RlZmluZSBCSU5QUk1fQlVGX1NJWkUgMTI4CisKKyNlbmRpZiAvKiBfTElOVVhfQklORk1UU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjdkMWJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIEJsb2NrIGRhdGEgdHlwZXMgYW5kIGNvbnN0YW50cy4gIERpcmVjdGx5IGluY2x1ZGUgdGhpcyBmaWxlIG9ubHkgdG8KKyAqIGJyZWFrIGluY2x1ZGUgZGVwZW5kZW5jeSBsb29wLgorICovCisjaWZuZGVmIF9fTElOVVhfQkxLX1RZUEVTX0gKKyNkZWZpbmUgX19MSU5VWF9CTEtfVFlQRVNfSAorCisjaWZkZWYgQ09ORklHX0JMT0NLCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgYmlvX3NldDsKK3N0cnVjdCBiaW87CitzdHJ1Y3QgYmlvX2ludGVncml0eV9wYXlsb2FkOworc3RydWN0IHBhZ2U7CitzdHJ1Y3QgYmxvY2tfZGV2aWNlOwordHlwZWRlZiB2b2lkIChiaW9fZW5kX2lvX3QpIChzdHJ1Y3QgYmlvICosIGludCk7Cit0eXBlZGVmIHZvaWQgKGJpb19kZXN0cnVjdG9yX3QpIChzdHJ1Y3QgYmlvICopOworCisvKgorICogd2FzIHVuc2lnbmVkIHNob3J0LCBidXQgd2UgbWlnaHQgYXMgd2VsbCBiZSByZWFkeSBmb3IgPiA2NGtCIEkvTyBwYWdlcworICovCitzdHJ1Y3QgYmlvX3ZlYyB7CisJc3RydWN0IHBhZ2UJKmJ2X3BhZ2U7CisJdW5zaWduZWQgaW50CWJ2X2xlbjsKKwl1bnNpZ25lZCBpbnQJYnZfb2Zmc2V0OworfTsKKworLyoKKyAqIG1haW4gdW5pdCBvZiBJL08gZm9yIHRoZSBibG9jayBsYXllciBhbmQgbG93ZXIgbGF5ZXJzIChpZSBkcml2ZXJzIGFuZAorICogc3RhY2tpbmcgZHJpdmVycykKKyAqLworc3RydWN0IGJpbyB7CisJc2VjdG9yX3QJCWJpX3NlY3RvcjsJLyogZGV2aWNlIGFkZHJlc3MgaW4gNTEyIGJ5dGUKKwkJCQkJCSAgIHNlY3RvcnMgKi8KKwlzdHJ1Y3QgYmlvCQkqYmlfbmV4dDsJLyogcmVxdWVzdCBxdWV1ZSBsaW5rICovCisJc3RydWN0IGJsb2NrX2RldmljZQkqYmlfYmRldjsKKwl1bnNpZ25lZCBsb25nCQliaV9mbGFnczsJLyogc3RhdHVzLCBjb21tYW5kLCBldGMgKi8KKwl1bnNpZ25lZCBsb25nCQliaV9ydzsJCS8qIGJvdHRvbSBiaXRzIFJFQUQvV1JJVEUsCisJCQkJCQkgKiB0b3AgYml0cyBwcmlvcml0eQorCQkJCQkJICovCisKKwl1bnNpZ25lZCBzaG9ydAkJYmlfdmNudDsJLyogaG93IG1hbnkgYmlvX3ZlYydzICovCisJdW5zaWduZWQgc2hvcnQJCWJpX2lkeDsJCS8qIGN1cnJlbnQgaW5kZXggaW50byBidmxfdmVjICovCisKKwkvKiBOdW1iZXIgb2Ygc2VnbWVudHMgaW4gdGhpcyBCSU8gYWZ0ZXIKKwkgKiBwaHlzaWNhbCBhZGRyZXNzIGNvYWxlc2NpbmcgaXMgcGVyZm9ybWVkLgorCSAqLworCXVuc2lnbmVkIGludAkJYmlfcGh5c19zZWdtZW50czsKKworCXVuc2lnbmVkIGludAkJYmlfc2l6ZTsJLyogcmVzaWR1YWwgSS9PIGNvdW50ICovCisKKwkvKgorCSAqIFRvIGtlZXAgdHJhY2sgb2YgdGhlIG1heCBzZWdtZW50IHNpemUsIHdlIGFjY291bnQgZm9yIHRoZQorCSAqIHNpemVzIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCBtZXJnZWFibGUgc2VnbWVudHMgaW4gdGhpcyBiaW8uCisJICovCisJdW5zaWduZWQgaW50CQliaV9zZWdfZnJvbnRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJCWJpX3NlZ19iYWNrX3NpemU7CisKKwl1bnNpZ25lZCBpbnQJCWJpX21heF92ZWNzOwkvKiBtYXggYnZsX3ZlY3Mgd2UgY2FuIGhvbGQgKi8KKworCWF0b21pY190CQliaV9jbnQ7CQkvKiBwaW4gY291bnQgKi8KKworCXN0cnVjdCBiaW9fdmVjCQkqYmlfaW9fdmVjOwkvKiB0aGUgYWN0dWFsIHZlYyBsaXN0ICovCisKKwliaW9fZW5kX2lvX3QJCSpiaV9lbmRfaW87CisKKwl2b2lkCQkJKmJpX3ByaXZhdGU7CisjaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkpCisJc3RydWN0IGJpb19pbnRlZ3JpdHlfcGF5bG9hZCAqYmlfaW50ZWdyaXR5OyAgLyogZGF0YSBpbnRlZ3JpdHkgKi8KKyNlbmRpZgorCisJYmlvX2Rlc3RydWN0b3JfdAkqYmlfZGVzdHJ1Y3RvcjsJLyogZGVzdHJ1Y3RvciAqLworCisJLyoKKwkgKiBXZSBjYW4gX19pbmxpbmVfXyBhIG51bWJlciBvZiB2ZWNzIGF0IHRoZSBlbmQgb2YgdGhlIGJpbywgdG8gYXZvaWQKKwkgKiBkb3VibGUgYWxsb2NhdGlvbnMgZm9yIGEgc21hbGwgbnVtYmVyIG9mIGJpb192ZWNzLiBUaGlzIG1lbWJlcgorCSAqIE1VU1Qgb2J2aW91c2x5IGJlIGtlcHQgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBiaW8uCisJICovCisJc3RydWN0IGJpb192ZWMJCWJpX2lubGluZV92ZWNzWzBdOworfTsKKworLyoKKyAqIGJpbyBmbGFncworICovCisjZGVmaW5lIEJJT19VUFRPREFURQkwCS8qIG9rIGFmdGVyIEkvTyBjb21wbGV0aW9uICovCisjZGVmaW5lIEJJT19SV19CTE9DSwkxCS8qIFJXX0FIRUFEIHNldCwgYW5kIHJlYWQvd3JpdGUgd291bGQgYmxvY2sgKi8KKyNkZWZpbmUgQklPX0VPRgkJMgkvKiBvdXQtb3V0LWJvdW5kcyBlcnJvciAqLworI2RlZmluZSBCSU9fU0VHX1ZBTElECTMJLyogYmlfcGh5c19zZWdtZW50cyB2YWxpZCAqLworI2RlZmluZSBCSU9fQ0xPTkVECTQJLyogZG9lc24ndCBvd24gZGF0YSAqLworI2RlZmluZSBCSU9fQk9VTkNFRAk1CS8qIGJpbyBpcyBhIGJvdW5jZSBiaW8gKi8KKyNkZWZpbmUgQklPX1VTRVJfTUFQUEVEIDYJLyogY29udGFpbnMgdXNlciBwYWdlcyAqLworI2RlZmluZSBCSU9fRU9QTk9UU1VQUAk3CS8qIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQklPX05VTExfTUFQUEVEIDgJLyogY29udGFpbnMgaW52YWxpZCB1c2VyIHBhZ2VzICovCisjZGVmaW5lIEJJT19GU19JTlRFR1JJVFkgOQkvKiBmcyBvd25zIGludGVncml0eSBkYXRhLCBub3QgYmxvY2sgbGF5ZXIgKi8KKyNkZWZpbmUgQklPX1FVSUVUCTEwCS8qIE1ha2UgQklPIFF1aWV0ICovCisjZGVmaW5lIEJJT19NQVBQRURfSU5URUdSSVRZIDExLyogaW50ZWdyaXR5IG1ldGFkYXRhIGhhcyBiZWVuIHJlbWFwcGVkICovCisjZGVmaW5lIGJpb19mbGFnZ2VkKGJpbywgZmxhZykJKChiaW8pLT5iaV9mbGFncyAmICgxIDw8IChmbGFnKSkpCisKKy8qCisgKiB0b3AgNCBiaXRzIG9mIGJpbyBmbGFncyBpbmRpY2F0ZSB0aGUgcG9vbCB0aGlzIGJpbyBjYW1lIGZyb20KKyAqLworI2RlZmluZSBCSU9fUE9PTF9CSVRTCQkoNCkKKyNkZWZpbmUgQklPX1BPT0xfTk9ORQkJKCgxVUwgPDwgQklPX1BPT0xfQklUUykgLSAxKQorI2RlZmluZSBCSU9fUE9PTF9PRkZTRVQJCShCSVRTX1BFUl9MT05HIC0gQklPX1BPT0xfQklUUykKKyNkZWZpbmUgQklPX1BPT0xfTUFTSwkJKDFVTCA8PCBCSU9fUE9PTF9PRkZTRVQpCisjZGVmaW5lIEJJT19QT09MX0lEWChiaW8pCSgoYmlvKS0+YmlfZmxhZ3MgPj4gQklPX1BPT0xfT0ZGU0VUKQorCisjZW5kaWYgLyogQ09ORklHX0JMT0NLICovCisKKy8qCisgKiBSZXF1ZXN0IGZsYWdzLiAgRm9yIHVzZSBpbiB0aGUgY21kX2ZsYWdzIGZpZWxkIG9mIHN0cnVjdCByZXF1ZXN0LCBhbmQgaW4KKyAqIGJpX3J3IG9mIHN0cnVjdCBiaW8uICBOb3RlIHRoYXQgc29tZSBmbGFncyBhcmUgb25seSB2YWxpZCBpbiBlaXRoZXIgb25lLgorICovCitlbnVtIHJxX2ZsYWdfYml0cyB7CisJLyogY29tbW9uIGZsYWdzICovCisJX19SRVFfV1JJVEUsCQkvKiBub3Qgc2V0LCByZWFkLiBzZXQsIHdyaXRlICovCisJX19SRVFfRkFJTEZBU1RfREVWLAkvKiBubyBkcml2ZXIgcmV0cmllcyBvZiBkZXZpY2UgZXJyb3JzICovCisJX19SRVFfRkFJTEZBU1RfVFJBTlNQT1JULCAvKiBubyBkcml2ZXIgcmV0cmllcyBvZiB0cmFuc3BvcnQgZXJyb3JzICovCisJX19SRVFfRkFJTEZBU1RfRFJJVkVSLAkvKiBubyBkcml2ZXIgcmV0cmllcyBvZiBkcml2ZXIgZXJyb3JzICovCisKKwlfX1JFUV9TWU5DLAkJLyogcmVxdWVzdCBpcyBzeW5jIChzeW5jIHdyaXRlIG9yIHJlYWQpICovCisJX19SRVFfTUVUQSwJCS8qIG1ldGFkYXRhIGlvIHJlcXVlc3QgKi8KKwlfX1JFUV9QUklPLAkJLyogYm9vc3QgcHJpb3JpdHkgaW4gY2ZxICovCisJX19SRVFfRElTQ0FSRCwJCS8qIHJlcXVlc3QgdG8gZGlzY2FyZCBzZWN0b3JzICovCisJX19SRVFfU0VDVVJFLAkJLyogc2VjdXJlIGRpc2NhcmQgKHVzZWQgd2l0aCBfX1JFUV9ESVNDQVJEKSAqLworCisJX19SRVFfTk9JRExFLAkJLyogZG9uJ3QgYW50aWNpcGF0ZSBtb3JlIElPIGFmdGVyIHRoaXMgb25lICovCisJX19SRVFfRlVBLAkJLyogZm9yY2VkIHVuaXQgYWNjZXNzICovCisJX19SRVFfRkxVU0gsCQkvKiByZXF1ZXN0IGZvciBjYWNoZSBmbHVzaCAqLworCisJLyogYmlvIG9ubHkgZmxhZ3MgKi8KKwlfX1JFUV9SQUhFQUQsCQkvKiByZWFkIGFoZWFkLCBjYW4gZmFpbCBhbnl0aW1lICovCisJX19SRVFfVEhST1RUTEVELAkvKiBUaGlzIGJpbyBoYXMgYWxyZWFkeSBiZWVuIHN1YmplY3RlZCB0bworCQkJCSAqIHRocm90dGxpbmcgcnVsZXMuIERvbid0IGRvIGl0IGFnYWluLiAqLworCisJLyogcmVxdWVzdCBvbmx5IGZsYWdzICovCisJX19SRVFfU09SVEVELAkJLyogZWxldmF0b3Iga25vd3MgYWJvdXQgdGhpcyByZXF1ZXN0ICovCisJX19SRVFfU09GVEJBUlJJRVIsCS8qIG1heSBub3QgYmUgcGFzc2VkIGJ5IGlvc2NoZWR1bGVyICovCisJX19SRVFfTk9NRVJHRSwJCS8qIGRvbid0IHRvdWNoIHRoaXMgZm9yIG1lcmdpbmcgKi8KKwlfX1JFUV9TVEFSVEVELAkJLyogZHJpdmUgYWxyZWFkeSBtYXkgaGF2ZSBzdGFydGVkIHRoaXMgb25lICovCisJX19SRVFfRE9OVFBSRVAsCQkvKiBkb24ndCBjYWxsIHByZXAgZm9yIHRoaXMgb25lICovCisJX19SRVFfUVVFVUVELAkJLyogdXNlcyBxdWV1ZWluZyAqLworCV9fUkVRX0VMVlBSSVYsCQkvKiBlbGV2YXRvciBwcml2YXRlIGRhdGEgYXR0YWNoZWQgKi8KKwlfX1JFUV9GQUlMRUQsCQkvKiBzZXQgaWYgdGhlIHJlcXVlc3QgZmFpbGVkICovCisJX19SRVFfUVVJRVQsCQkvKiBkb24ndCB3b3JyeSBhYm91dCBlcnJvcnMgKi8KKwlfX1JFUV9QUkVFTVBULAkJLyogc2V0IGZvciAiaWRlX3ByZWVtcHQiIHJlcXVlc3RzICovCisJX19SRVFfQUxMT0NFRCwJCS8qIHJlcXVlc3QgY2FtZSBmcm9tIG91ciBhbGxvYyBwb29sICovCisJX19SRVFfQ09QWV9VU0VSLAkvKiBjb250YWlucyBjb3BpZXMgb2YgdXNlciBwYWdlcyAqLworCV9fUkVRX0ZMVVNIX1NFUSwJLyogcmVxdWVzdCBmb3IgZmx1c2ggc2VxdWVuY2UgKi8KKwlfX1JFUV9JT19TVEFULAkJLyogYWNjb3VudCBJL08gc3RhdCAqLworCV9fUkVRX01JWEVEX01FUkdFLAkvKiBtZXJnZSBvZiBkaWZmZXJlbnQgdHlwZXMsIGZhaWwgc2VwYXJhdGVseSAqLworCV9fUkVRX05SX0JJVFMsCQkvKiBzdG9wcyBoZXJlICovCit9OworCisjZGVmaW5lIFJFUV9XUklURQkJKDEgPDwgX19SRVFfV1JJVEUpCisjZGVmaW5lIFJFUV9GQUlMRkFTVF9ERVYJKDEgPDwgX19SRVFfRkFJTEZBU1RfREVWKQorI2RlZmluZSBSRVFfRkFJTEZBU1RfVFJBTlNQT1JUCSgxIDw8IF9fUkVRX0ZBSUxGQVNUX1RSQU5TUE9SVCkKKyNkZWZpbmUgUkVRX0ZBSUxGQVNUX0RSSVZFUgkoMSA8PCBfX1JFUV9GQUlMRkFTVF9EUklWRVIpCisjZGVmaW5lIFJFUV9TWU5DCQkoMSA8PCBfX1JFUV9TWU5DKQorI2RlZmluZSBSRVFfTUVUQQkJKDEgPDwgX19SRVFfTUVUQSkKKyNkZWZpbmUgUkVRX1BSSU8JCSgxIDw8IF9fUkVRX1BSSU8pCisjZGVmaW5lIFJFUV9ESVNDQVJECQkoMSA8PCBfX1JFUV9ESVNDQVJEKQorI2RlZmluZSBSRVFfTk9JRExFCQkoMSA8PCBfX1JFUV9OT0lETEUpCisKKyNkZWZpbmUgUkVRX0ZBSUxGQVNUX01BU0sgXAorCShSRVFfRkFJTEZBU1RfREVWIHwgUkVRX0ZBSUxGQVNUX1RSQU5TUE9SVCB8IFJFUV9GQUlMRkFTVF9EUklWRVIpCisjZGVmaW5lIFJFUV9DT01NT05fTUFTSyBcCisJKFJFUV9XUklURSB8IFJFUV9GQUlMRkFTVF9NQVNLIHwgUkVRX1NZTkMgfCBSRVFfTUVUQSB8IFJFUV9QUklPIHwgXAorCSBSRVFfRElTQ0FSRCB8IFJFUV9OT0lETEUgfCBSRVFfRkxVU0ggfCBSRVFfRlVBIHwgUkVRX1NFQ1VSRSkKKyNkZWZpbmUgUkVRX0NMT05FX01BU0sJCVJFUV9DT01NT05fTUFTSworCisjZGVmaW5lIFJFUV9SQUhFQUQJCSgxIDw8IF9fUkVRX1JBSEVBRCkKKyNkZWZpbmUgUkVRX1RIUk9UVExFRAkJKDEgPDwgX19SRVFfVEhST1RUTEVEKQorCisjZGVmaW5lIFJFUV9TT1JURUQJCSgxIDw8IF9fUkVRX1NPUlRFRCkKKyNkZWZpbmUgUkVRX1NPRlRCQVJSSUVSCQkoMSA8PCBfX1JFUV9TT0ZUQkFSUklFUikKKyNkZWZpbmUgUkVRX0ZVQQkJCSgxIDw8IF9fUkVRX0ZVQSkKKyNkZWZpbmUgUkVRX05PTUVSR0UJCSgxIDw8IF9fUkVRX05PTUVSR0UpCisjZGVmaW5lIFJFUV9TVEFSVEVECQkoMSA8PCBfX1JFUV9TVEFSVEVEKQorI2RlZmluZSBSRVFfRE9OVFBSRVAJCSgxIDw8IF9fUkVRX0RPTlRQUkVQKQorI2RlZmluZSBSRVFfUVVFVUVECQkoMSA8PCBfX1JFUV9RVUVVRUQpCisjZGVmaW5lIFJFUV9FTFZQUklWCQkoMSA8PCBfX1JFUV9FTFZQUklWKQorI2RlZmluZSBSRVFfRkFJTEVECQkoMSA8PCBfX1JFUV9GQUlMRUQpCisjZGVmaW5lIFJFUV9RVUlFVAkJKDEgPDwgX19SRVFfUVVJRVQpCisjZGVmaW5lIFJFUV9QUkVFTVBUCQkoMSA8PCBfX1JFUV9QUkVFTVBUKQorI2RlZmluZSBSRVFfQUxMT0NFRAkJKDEgPDwgX19SRVFfQUxMT0NFRCkKKyNkZWZpbmUgUkVRX0NPUFlfVVNFUgkJKDEgPDwgX19SRVFfQ09QWV9VU0VSKQorI2RlZmluZSBSRVFfRkxVU0gJCSgxIDw8IF9fUkVRX0ZMVVNIKQorI2RlZmluZSBSRVFfRkxVU0hfU0VRCQkoMSA8PCBfX1JFUV9GTFVTSF9TRVEpCisjZGVmaW5lIFJFUV9JT19TVEFUCQkoMSA8PCBfX1JFUV9JT19TVEFUKQorI2RlZmluZSBSRVFfTUlYRURfTUVSR0UJCSgxIDw8IF9fUkVRX01JWEVEX01FUkdFKQorI2RlZmluZSBSRVFfU0VDVVJFCQkoMSA8PCBfX1JFUV9TRUNVUkUpCisKKyNlbmRpZiAvKiBfX0xJTlVYX0JMS19UWVBFU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Jsa3BnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Jsa3BnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyZGQ0YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmxrcGcuaApAQCAtMCwwICsxLDU4IEBACisjaWZuZGVmIF9MSU5VWF9CTEtQR19ICisjZGVmaW5lIF9MSU5VWF9CTEtQR19ICisKKy8qCisgKiBQYXJ0aXRpb24gdGFibGUgYW5kIGRpc2sgZ2VvbWV0cnkgaGFuZGxpbmcKKyAqCisgKiBBIHNpbmdsZSBpb2N0bCB3aXRoIGxvdHMgb2Ygc3ViZnVuY3Rpb25zOgorICoKKyAqIERldmljZSBudW1iZXIgc3R1ZmY6CisgKiAgICBnZXRfd2hvbGVfZGlzaygpCQkoZ2l2ZW4gdGhlIGRldmljZSBudW1iZXIgb2YgYSBwYXJ0aXRpb24sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kIHRoZSBkZXZpY2UgbnVtYmVyIG9mIHRoZSBlbmNvbXBhc3NpbmcgZGlzaykKKyAqICAgIGdldF9hbGxfcGFydGl0aW9ucygpCShnaXZlbiB0aGUgZGV2aWNlIG51bWJlciBvZiBhIGRpc2ssIHJldHVybiB0aGUKKyAqCQkJCSBkZXZpY2UgbnVtYmVycyBvZiBhbGwgaXRzIGtub3duIHBhcnRpdGlvbnMpCisgKgorICogUGFydGl0aW9uIHN0dWZmOgorICogICAgYWRkX3BhcnRpdGlvbigpCisgKiAgICBkZWxldGVfcGFydGl0aW9uKCkKKyAqICAgIHRlc3RfcGFydGl0aW9uX2luX3VzZSgpCShhbHNvIGZvciB0ZXN0X2Rpc2tfaW5fdXNlKQorICoKKyAqIEdlb21ldHJ5IHN0dWZmOgorICogICAgZ2V0X2dlb21ldHJ5KCkKKyAqICAgIHNldF9nZW9tZXRyeSgpCisgKiAgICBnZXRfYmlvc19kcml2ZWRhdGEoKQorICoKKyAqIEZvciB0b2RheSwgb25seSB0aGUgcGFydGl0aW9uIHN0dWZmIC0gYWViLCA5OTA1MTUKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBCTEtQRyAgICAgIF9JTygweDEyLDEwNSkKKworLyogVGhlIGFyZ3VtZW50IHN0cnVjdHVyZSAqLworc3RydWN0IGJsa3BnX2lvY3RsX2FyZyB7CisgICAgICAgIGludCBvcDsKKyAgICAgICAgaW50IGZsYWdzOworICAgICAgICBpbnQgZGF0YWxlbjsKKyAgICAgICAgdm9pZCAqZGF0YTsKK307CisKKy8qIFRoZSBzdWJmdW5jdGlvbnMgKGZvciB0aGUgb3AgZmllbGQpICovCisjZGVmaW5lIEJMS1BHX0FERF9QQVJUSVRJT04JMQorI2RlZmluZSBCTEtQR19ERUxfUEFSVElUSU9OCTIKKworLyogU2l6ZXMgb2YgbmFtZSBmaWVsZHMuIFVudXNlZCBhdCBwcmVzZW50LiAqLworI2RlZmluZSBCTEtQR19ERVZOQU1FTFRICTY0CisjZGVmaW5lIEJMS1BHX1ZPTE5BTUVMVEgJNjQKKworLyogVGhlIGRhdGEgc3RydWN0dXJlIGZvciBBRERfUEFSVElUSU9OIGFuZCBERUxfUEFSVElUSU9OICovCitzdHJ1Y3QgYmxrcGdfcGFydGl0aW9uIHsKKwlsb25nIGxvbmcgc3RhcnQ7CQkvKiBzdGFydGluZyBvZmZzZXQgaW4gYnl0ZXMgKi8KKwlsb25nIGxvbmcgbGVuZ3RoOwkJLyogbGVuZ3RoIGluIGJ5dGVzICovCisJaW50IHBubzsJCQkvKiBwYXJ0aXRpb24gbnVtYmVyICovCisJY2hhciBkZXZuYW1lW0JMS1BHX0RFVk5BTUVMVEhdOwkvKiBwYXJ0aXRpb24gbmFtZSwgbGlrZSBzZGE1IG9yIGMwZDFwMiwKKwkJCQkJICAgdG8gYmUgdXNlZCBpbiBrZXJuZWwgbWVzc2FnZXMgKi8KKwljaGFyIHZvbG5hbWVbQkxLUEdfVk9MTkFNRUxUSF07CS8qIHZvbHVtZSBsYWJlbCAqLworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9CTEtQR19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmQyMGViCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaApAQCAtMCwwICsxLDE0MiBAQAorI2lmbmRlZiBCTEtUUkFDRV9ICisjZGVmaW5lIEJMS1RSQUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBUcmFjZSBjYXRlZ29yaWVzCisgKi8KK2VudW0gYmxrdHJhY2VfY2F0IHsKKwlCTEtfVENfUkVBRAk9IDEgPDwgMCwJLyogcmVhZHMgKi8KKwlCTEtfVENfV1JJVEUJPSAxIDw8IDEsCS8qIHdyaXRlcyAqLworCUJMS19UQ19GTFVTSAk9IDEgPDwgMiwJLyogZmx1c2ggKi8KKwlCTEtfVENfU1lOQwk9IDEgPDwgMywJLyogc3luYyBJTyAqLworCUJMS19UQ19TWU5DSU8JPSBCTEtfVENfU1lOQywKKwlCTEtfVENfUVVFVUUJPSAxIDw8IDQsCS8qIHF1ZXVlaW5nL21lcmdpbmcgKi8KKwlCTEtfVENfUkVRVUVVRQk9IDEgPDwgNSwJLyogcmVxdWV1ZWluZyAqLworCUJMS19UQ19JU1NVRQk9IDEgPDwgNiwJLyogaXNzdWUgKi8KKwlCTEtfVENfQ09NUExFVEUJPSAxIDw8IDcsCS8qIGNvbXBsZXRpb25zICovCisJQkxLX1RDX0ZTCT0gMSA8PCA4LAkvKiBmcyByZXF1ZXN0cyAqLworCUJMS19UQ19QQwk9IDEgPDwgOSwJLyogcGMgcmVxdWVzdHMgKi8KKwlCTEtfVENfTk9USUZZCT0gMSA8PCAxMCwJLyogc3BlY2lhbCBtZXNzYWdlICovCisJQkxLX1RDX0FIRUFECT0gMSA8PCAxMSwJLyogcmVhZGFoZWFkICovCisJQkxLX1RDX01FVEEJPSAxIDw8IDEyLAkvKiBtZXRhZGF0YSAqLworCUJMS19UQ19ESVNDQVJECT0gMSA8PCAxMywJLyogZGlzY2FyZCByZXF1ZXN0cyAqLworCUJMS19UQ19EUlZfREFUQQk9IDEgPDwgMTQsCS8qIGJpbmFyeSBwZXItZHJpdmVyIGRhdGEgKi8KKwlCTEtfVENfRlVBCT0gMSA8PCAxNSwJLyogZnVhIHJlcXVlc3RzICovCisKKwlCTEtfVENfRU5ECT0gMSA8PCAxNSwJLyogd2UndmUgcnVuIG91dCBvZiBiaXRzISAqLworfTsKKworI2RlZmluZSBCTEtfVENfU0hJRlQJCSgxNikKKyNkZWZpbmUgQkxLX1RDX0FDVChhY3QpCQkoKGFjdCkgPDwgQkxLX1RDX1NISUZUKQorCisvKgorICogQmFzaWMgdHJhY2UgYWN0aW9ucworICovCitlbnVtIGJsa3RyYWNlX2FjdCB7CisJX19CTEtfVEFfUVVFVUUgPSAxLAkJLyogcXVldWVkICovCisJX19CTEtfVEFfQkFDS01FUkdFLAkJLyogYmFjayBtZXJnZWQgdG8gZXhpc3RpbmcgcnEgKi8KKwlfX0JMS19UQV9GUk9OVE1FUkdFLAkJLyogZnJvbnQgbWVyZ2UgdG8gZXhpc3RpbmcgcnEgKi8KKwlfX0JMS19UQV9HRVRSUSwJCQkvKiBhbGxvY2F0ZWQgbmV3IHJlcXVlc3QgKi8KKwlfX0JMS19UQV9TTEVFUFJRLAkJLyogc2xlZXBpbmcgb24gcnEgYWxsb2NhdGlvbiAqLworCV9fQkxLX1RBX1JFUVVFVUUsCQkvKiByZXF1ZXN0IHJlcXVldWVkICovCisJX19CTEtfVEFfSVNTVUUsCQkJLyogc2VudCB0byBkcml2ZXIgKi8KKwlfX0JMS19UQV9DT01QTEVURSwJCS8qIGNvbXBsZXRlZCBieSBkcml2ZXIgKi8KKwlfX0JMS19UQV9QTFVHLAkJCS8qIHF1ZXVlIHdhcyBwbHVnZ2VkICovCisJX19CTEtfVEFfVU5QTFVHX0lPLAkJLyogcXVldWUgd2FzIHVucGx1Z2dlZCBieSBpbyAqLworCV9fQkxLX1RBX1VOUExVR19USU1FUiwJCS8qIHF1ZXVlIHdhcyB1bnBsdWdnZWQgYnkgdGltZXIgKi8KKwlfX0JMS19UQV9JTlNFUlQsCQkvKiBpbnNlcnQgcmVxdWVzdCAqLworCV9fQkxLX1RBX1NQTElULAkJCS8qIGJpbyB3YXMgc3BsaXQgKi8KKwlfX0JMS19UQV9CT1VOQ0UsCQkvKiBiaW8gd2FzIGJvdW5jZWQgKi8KKwlfX0JMS19UQV9SRU1BUCwJCQkvKiBiaW8gd2FzIHJlbWFwcGVkICovCisJX19CTEtfVEFfQUJPUlQsCQkJLyogcmVxdWVzdCBhYm9ydGVkICovCisJX19CTEtfVEFfRFJWX0RBVEEsCQkvKiBkcml2ZXItc3BlY2lmaWMgYmluYXJ5IGRhdGEgKi8KK307CisKKy8qCisgKiBOb3RpZnkgZXZlbnRzLgorICovCitlbnVtIGJsa3RyYWNlX25vdGlmeSB7CisJX19CTEtfVE5fUFJPQ0VTUyA9IDAsCQkvKiBlc3RhYmxpc2ggcGlkL25hbWUgbWFwcGluZyAqLworCV9fQkxLX1ROX1RJTUVTVEFNUCwJCS8qIGluY2x1ZGUgc3lzdGVtIGNsb2NrICovCisJX19CTEtfVE5fTUVTU0FHRSwJCS8qIENoYXJhY3RlciBzdHJpbmcgbWVzc2FnZSAqLworfTsKKworCisvKgorICogVHJhY2UgYWN0aW9ucyBpbiBmdWxsLiBBZGRpdGlvbmFsbHksIHJlYWQgb3Igd3JpdGUgaXMgbWFza2VkCisgKi8KKyNkZWZpbmUgQkxLX1RBX1FVRVVFCQkoX19CTEtfVEFfUVVFVUUgfCBCTEtfVENfQUNUKEJMS19UQ19RVUVVRSkpCisjZGVmaW5lIEJMS19UQV9CQUNLTUVSR0UJKF9fQkxLX1RBX0JBQ0tNRVJHRSB8IEJMS19UQ19BQ1QoQkxLX1RDX1FVRVVFKSkKKyNkZWZpbmUgQkxLX1RBX0ZST05UTUVSR0UJKF9fQkxLX1RBX0ZST05UTUVSR0UgfCBCTEtfVENfQUNUKEJMS19UQ19RVUVVRSkpCisjZGVmaW5lCUJMS19UQV9HRVRSUQkJKF9fQkxLX1RBX0dFVFJRIHwgQkxLX1RDX0FDVChCTEtfVENfUVVFVUUpKQorI2RlZmluZQlCTEtfVEFfU0xFRVBSUQkJKF9fQkxLX1RBX1NMRUVQUlEgfCBCTEtfVENfQUNUKEJMS19UQ19RVUVVRSkpCisjZGVmaW5lCUJMS19UQV9SRVFVRVVFCQkoX19CTEtfVEFfUkVRVUVVRSB8IEJMS19UQ19BQ1QoQkxLX1RDX1JFUVVFVUUpKQorI2RlZmluZSBCTEtfVEFfSVNTVUUJCShfX0JMS19UQV9JU1NVRSB8IEJMS19UQ19BQ1QoQkxLX1RDX0lTU1VFKSkKKyNkZWZpbmUgQkxLX1RBX0NPTVBMRVRFCQkoX19CTEtfVEFfQ09NUExFVEV8IEJMS19UQ19BQ1QoQkxLX1RDX0NPTVBMRVRFKSkKKyNkZWZpbmUgQkxLX1RBX1BMVUcJCShfX0JMS19UQV9QTFVHIHwgQkxLX1RDX0FDVChCTEtfVENfUVVFVUUpKQorI2RlZmluZSBCTEtfVEFfVU5QTFVHX0lPCShfX0JMS19UQV9VTlBMVUdfSU8gfCBCTEtfVENfQUNUKEJMS19UQ19RVUVVRSkpCisjZGVmaW5lIEJMS19UQV9VTlBMVUdfVElNRVIJKF9fQkxLX1RBX1VOUExVR19USU1FUiB8IEJMS19UQ19BQ1QoQkxLX1RDX1FVRVVFKSkKKyNkZWZpbmUgQkxLX1RBX0lOU0VSVAkJKF9fQkxLX1RBX0lOU0VSVCB8IEJMS19UQ19BQ1QoQkxLX1RDX1FVRVVFKSkKKyNkZWZpbmUgQkxLX1RBX1NQTElUCQkoX19CTEtfVEFfU1BMSVQpCisjZGVmaW5lIEJMS19UQV9CT1VOQ0UJCShfX0JMS19UQV9CT1VOQ0UpCisjZGVmaW5lIEJMS19UQV9SRU1BUAkJKF9fQkxLX1RBX1JFTUFQIHwgQkxLX1RDX0FDVChCTEtfVENfUVVFVUUpKQorI2RlZmluZSBCTEtfVEFfQUJPUlQJCShfX0JMS19UQV9BQk9SVCB8IEJMS19UQ19BQ1QoQkxLX1RDX1FVRVVFKSkKKyNkZWZpbmUgQkxLX1RBX0RSVl9EQVRBCShfX0JMS19UQV9EUlZfREFUQSB8IEJMS19UQ19BQ1QoQkxLX1RDX0RSVl9EQVRBKSkKKworI2RlZmluZSBCTEtfVE5fUFJPQ0VTUwkJKF9fQkxLX1ROX1BST0NFU1MgfCBCTEtfVENfQUNUKEJMS19UQ19OT1RJRlkpKQorI2RlZmluZSBCTEtfVE5fVElNRVNUQU1QCShfX0JMS19UTl9USU1FU1RBTVAgfCBCTEtfVENfQUNUKEJMS19UQ19OT1RJRlkpKQorI2RlZmluZSBCTEtfVE5fTUVTU0FHRQkJKF9fQkxLX1ROX01FU1NBR0UgfCBCTEtfVENfQUNUKEJMS19UQ19OT1RJRlkpKQorCisjZGVmaW5lIEJMS19JT19UUkFDRV9NQUdJQwkweDY1NjE3NDAwCisjZGVmaW5lIEJMS19JT19UUkFDRV9WRVJTSU9OCTB4MDcKKworLyoKKyAqIFRoZSB0cmFjZSBpdHNlbGYKKyAqLworc3RydWN0IGJsa19pb190cmFjZSB7CisJX191MzIgbWFnaWM7CQkvKiBNQUdJQyA8PCA4IHwgdmVyc2lvbiAqLworCV9fdTMyIHNlcXVlbmNlOwkJLyogZXZlbnQgbnVtYmVyICovCisJX191NjQgdGltZTsJCS8qIGluIG1pY3Jvc2Vjb25kcyAqLworCV9fdTY0IHNlY3RvcjsJCS8qIGRpc2sgb2Zmc2V0ICovCisJX191MzIgYnl0ZXM7CQkvKiB0cmFuc2ZlciBsZW5ndGggKi8KKwlfX3UzMiBhY3Rpb247CQkvKiB3aGF0IGhhcHBlbmVkICovCisJX191MzIgcGlkOwkJLyogd2hvIGRpZCBpdCAqLworCV9fdTMyIGRldmljZTsJCS8qIGRldmljZSBudW1iZXIgKi8KKwlfX3UzMiBjcHU7CQkvKiBvbiB3aGF0IGNwdSBkaWQgaXQgaGFwcGVuICovCisJX191MTYgZXJyb3I7CQkvKiBjb21wbGV0aW9uIGVycm9yICovCisJX191MTYgcGR1X2xlbjsJCS8qIGxlbmd0aCBvZiBkYXRhIGFmdGVyIHRoaXMgdHJhY2UgKi8KK307CisKKy8qCisgKiBUaGUgcmVtYXAgZXZlbnQKKyAqLworc3RydWN0IGJsa19pb190cmFjZV9yZW1hcCB7CisJX19iZTMyIGRldmljZV9mcm9tOworCV9fYmUzMiBkZXZpY2VfdG87CisJX19iZTY0IHNlY3Rvcl9mcm9tOworfTsKKworZW51bSB7CisJQmxrdHJhY2Vfc2V0dXAgPSAxLAorCUJsa3RyYWNlX3J1bm5pbmcsCisJQmxrdHJhY2Vfc3RvcHBlZCwKK307CisKKyNkZWZpbmUgQkxLVFJBQ0VfQkRFVl9TSVpFCTMyCisKKy8qCisgKiBVc2VyIHNldHVwIHN0cnVjdHVyZSBwYXNzZWQgd2l0aCBCTEtUUkFDRVNUQVJUCisgKi8KK3N0cnVjdCBibGtfdXNlcl90cmFjZV9zZXR1cCB7CisJY2hhciBuYW1lW0JMS1RSQUNFX0JERVZfU0laRV07CS8qIG91dHB1dCAqLworCV9fdTE2IGFjdF9tYXNrOwkJCS8qIGlucHV0ICovCisJX191MzIgYnVmX3NpemU7CQkJLyogaW5wdXQgKi8KKwlfX3UzMiBidWZfbnI7CQkJLyogaW5wdXQgKi8KKwlfX3U2NCBzdGFydF9sYmE7CisJX191NjQgZW5kX2xiYTsKKwlfX3UzMiBwaWQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYnBxZXRoZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYnBxZXRoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmMzNWUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9icHFldGhlci5oCkBAIC0wLDAgKzEsNDEgQEAKKyNpZm5kZWYJX19CUFFFVEhFUl9ICisjZGVmaW5lCV9fQlBRRVRIRVJfSAorCisvKgorICogCURlZmluZXMgZm9yIHRoZSBCUFFFVEhFUiBwc2V1ZG8gZGV2aWNlIGRyaXZlcgorICovCisKKyNpZm5kZWYgX19MSU5VWF9JRl9FVEhFUl9ICisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNlbmRpZgorCisjZGVmaW5lIFNJT0NTQlBRRVRIT1BUCQkoU0lPQ0RFVlBSSVZBVEUrMCkJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgU0lPQ1NCUFFFVEhBRERSCQkoU0lPQ0RFVlBSSVZBVEUrMSkKKyAKK3N0cnVjdCBicHFfZXRoYWRkciB7CisJdW5zaWduZWQgY2hhciBkZXN0aW5hdGlvbltFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBhY2NlcHRbRVRIX0FMRU5dOworfTsKKworLyogCisgKiBGb3IgU0lPQ1NCUFFFVEhPUFQgLSB0aGlzIGlzIGNvbXBhdGlibGUgd2l0aCBQSTIvUGFja2V0VHdpbiBjYXJkIGRyaXZlcnMsCisgKiBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkLCB0aG91Z2guIElmIHNvbWVvbmUgd2FudHMgdG8gaG9vayBhIHJhZGlvCisgKiB0byBoaXMgRXRoZXJuZXQgY2FyZCBoZSBtYXkgZmluZCB0aGlzIHVzZWZ1bC4gOy0pCisgKi8KKworI2RlZmluZSBTSU9DR0JQUUVUSFBBUkFNCTB4NTAwMCAgLyogZ2V0IExldmVsIDEgcGFyYW1ldGVycyAqLworI2RlZmluZSBTSU9DU0JQUUVUSFBBUkFNCTB4NTAwMSAgLyogc2V0ICovCisKK3N0cnVjdCBicHFfcmVxICB7CisgICAgaW50IGNtZDsKKyAgICBpbnQgc3BlZWQ7CQkJLyogdW51c2VkICovCisgICAgaW50IGNsb2NrbW9kZTsJCS8qIHVudXNlZCAqLworICAgIGludCB0eGRlbGF5OworICAgIHVuc2lnbmVkIGNoYXIgcGVyc2lzdDsJLyogdW51c2VkICovCisgICAgaW50IHNsb3RpbWU7CQkvKiB1bnVzZWQgKi8KKyAgICBpbnQgc3F1ZWxkZWxheTsKKyAgICBpbnQgZG1hY2hhbjsJCS8qIHVudXNlZCAqLworICAgIGludCBpcnE7CQkJLyogdW51c2VkICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYnNnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JzZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTJkNWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JzZy5oCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgQlNHX0gKKyNkZWZpbmUgQlNHX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgQlNHX1BST1RPQ09MX1NDU0kJCTAKKworI2RlZmluZSBCU0dfU1VCX1BST1RPQ09MX1NDU0lfQ01ECTAKKyNkZWZpbmUgQlNHX1NVQl9QUk9UT0NPTF9TQ1NJX1RNRgkxCisjZGVmaW5lIEJTR19TVUJfUFJPVE9DT0xfU0NTSV9UUkFOU1BPUlQJMgorCisvKgorICogRm9yIGZsYWdzIG1lbWJlciBiZWxvdworICogc2cuaCBzZ19pb19oZHIgYWxzbyBoYXMgYml0cyBkZWZpbmVkIGZvciBpdCdzIGZsYWdzIG1lbWJlci4gSG93ZXZlcgorICogbm9uZSBvZiB0aGVzZSBiaXRzIGFyZSBpbXBsZW1lbnRlZC91c2VkIGJ5IGJzZy4gVGhlIGJpdHMgYmVsb3cgYXJlCisgKiBhbGxvY2F0ZWQgdG8gbm90IGNvbmZsaWN0IHdpdGggc2cuaCBvbmVzIGFueXdheS4KKyAqLworI2RlZmluZSBCU0dfRkxBR19RX0FUX1RBSUwgMHgxMCAvKiBkZWZhdWx0LCA9PSAwIGF0IHRoaXMgYml0LCBpcyBRX0FUX0hFQUQgKi8KKworc3RydWN0IHNnX2lvX3Y0IHsKKwlfX3MzMiBndWFyZDsJCS8qIFtpXSAnUScgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIHYzICovCisJX191MzIgcHJvdG9jb2w7CQkvKiBbaV0gMCAtPiBTQ1NJICwgLi4uLiAqLworCV9fdTMyIHN1YnByb3RvY29sOwkvKiBbaV0gMCAtPiBTQ1NJIGNvbW1hbmQsIDEgLT4gU0NTSSB0YXNrCisJCQkJICAgbWFuYWdlbWVudCBmdW5jdGlvbiwgLi4uLiAqLworCisJX191MzIgcmVxdWVzdF9sZW47CS8qIFtpXSBpbiBieXRlcyAqLworCV9fdTY0IHJlcXVlc3Q7CQkvKiBbaV0sIFsqaV0ge1NDU0k6IGNkYn0gKi8KKwlfX3U2NCByZXF1ZXN0X3RhZzsJLyogW2ldIHtTQ1NJOiB0YXNrIHRhZyAob25seSBpZiBmbGFnZ2VkKX0gKi8KKwlfX3UzMiByZXF1ZXN0X2F0dHI7CS8qIFtpXSB7U0NTSTogdGFzayBhdHRyaWJ1dGV9ICovCisJX191MzIgcmVxdWVzdF9wcmlvcml0eTsJLyogW2ldIHtTQ1NJOiB0YXNrIHByaW9yaXR5fSAqLworCV9fdTMyIHJlcXVlc3RfZXh0cmE7CS8qIFtpXSB7c3BhcmUsIGZvciBwYWRkaW5nfSAqLworCV9fdTMyIG1heF9yZXNwb25zZV9sZW47CS8qIFtpXSBpbiBieXRlcyAqLworCV9fdTY0IHJlc3BvbnNlOwkJLyogW2ldLCBbKm9dIHtTQ1NJOiAoYXV0bylzZW5zZSBkYXRhfSAqLworCisgICAgICAgIC8qICJkb3V0XyI6IGRhdGEgb3V0ICh0byBkZXZpY2UpOyAiZGluXyI6IGRhdGEgaW4gKGZyb20gZGV2aWNlKSAqLworCV9fdTMyIGRvdXRfaW92ZWNfY291bnQ7CS8qIFtpXSAwIC0+ICJmbGF0IiBkb3V0IHRyYW5zZmVyIGVsc2UKKwkJCQkgICBkb3V0X3hmZXIgcG9pbnRzIHRvIGFycmF5IG9mIGlvdmVjICovCisJX191MzIgZG91dF94ZmVyX2xlbjsJLyogW2ldIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkIHRvIGRldmljZSAqLworCV9fdTMyIGRpbl9pb3ZlY19jb3VudDsJLyogW2ldIDAgLT4gImZsYXQiIGRpbiB0cmFuc2ZlciAqLworCV9fdTMyIGRpbl94ZmVyX2xlbjsJLyogW2ldIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gZGV2aWNlICovCisJX191NjQgZG91dF94ZmVycDsJLyogW2ldLCBbKmldICovCisJX191NjQgZGluX3hmZXJwOwkvKiBbaV0sIFsqb10gKi8KKworCV9fdTMyIHRpbWVvdXQ7CQkvKiBbaV0gdW5pdHM6IG1pbGxpc2Vjb25kICovCisJX191MzIgZmxhZ3M7CQkvKiBbaV0gYml0IG1hc2sgKi8KKwlfX3U2NCB1c3JfcHRyOwkJLyogW2ktPm9dIHVudXNlZCBpbnRlcm5hbGx5ICovCisJX191MzIgc3BhcmVfaW47CQkvKiBbaV0gKi8KKworCV9fdTMyIGRyaXZlcl9zdGF0dXM7CS8qIFtvXSAwIC0+IG9rICovCisJX191MzIgdHJhbnNwb3J0X3N0YXR1czsJLyogW29dIDAgLT4gb2sgKi8KKwlfX3UzMiBkZXZpY2Vfc3RhdHVzOwkvKiBbb10ge1NDU0k6IGNvbW1hbmQgY29tcGxldGlvbiBzdGF0dXN9ICovCisJX191MzIgcmV0cnlfZGVsYXk7CS8qIFtvXSB7U0NTSTogc3RhdHVzIGF1eGlsaWFyeSBpbmZvcm1hdGlvbn0gKi8KKwlfX3UzMiBpbmZvOwkJLyogW29dIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKi8KKwlfX3UzMiBkdXJhdGlvbjsJCS8qIFtvXSB0aW1lIHRvIGNvbXBsZXRlLCBpbiBtaWxsaXNlY29uZHMgKi8KKwlfX3UzMiByZXNwb25zZV9sZW47CS8qIFtvXSBieXRlcyBvZiByZXNwb25zZSBhY3R1YWxseSB3cml0dGVuICovCisJX19zMzIgZGluX3Jlc2lkOwkvKiBbb10gZGluX3hmZXJfbGVuIC0gYWN0dWFsX2Rpbl94ZmVyX2xlbiAqLworCV9fczMyIGRvdXRfcmVzaWQ7CS8qIFtvXSBkb3V0X3hmZXJfbGVuIC0gYWN0dWFsX2RvdXRfeGZlcl9sZW4gKi8KKwlfX3U2NCBnZW5lcmF0ZWRfdGFnOwkvKiBbb10ge1NDU0k6IHRyYW5zcG9ydCBnZW5lcmF0ZWQgdGFzayB0YWd9ICovCisJX191MzIgc3BhcmVfb3V0OwkvKiBbb10gKi8KKworCV9fdTMyIHBhZGRpbmc7Cit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZWY5OGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmgKQEAgLTAsMCArMSwxMDUgQEAKKyNpZm5kZWYgX0xJTlVYX0JZVEVPUkRFUl9CSUdfRU5ESUFOX0gKKyNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9CSUdfRU5ESUFOX0gKKworI2lmbmRlZiBfX0JJR19FTkRJQU4KKyNkZWZpbmUgX19CSUdfRU5ESUFOIDQzMjEKKyNlbmRpZgorI2lmbmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgX19CSUdfRU5ESUFOX0JJVEZJRUxECisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3dhYi5oPgorCisjZGVmaW5lIF9fY29uc3RhbnRfaHRvbmwoeCkgKChfX2JlMzIpKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9udG9obCh4KSAoKF9fdTMyKShfX2JlMzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2h0b25zKHgpICgoX19iZTE2KShfX3UxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbnRvaHMoeCkgKChfX3UxNikoX19iZTE2KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGU2NCh4KSAoKF9fbGU2NClfX19jb25zdGFudF9zd2FiNjQoKHgpKSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTY0X3RvX2NwdSh4KSBfX19jb25zdGFudF9zd2FiNjQoKF9fdTY0KShfX2xlNjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTMyKHgpICgoX19sZTMyKV9fX2NvbnN0YW50X3N3YWIzMigoeCkpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlMzJfdG9fY3B1KHgpIF9fX2NvbnN0YW50X3N3YWIzMigoX191MzIpKF9fbGUzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoeCkgKChfX2xlMTYpX19fY29uc3RhbnRfc3dhYjE2KCh4KSkpCisjZGVmaW5lIF9fY29uc3RhbnRfbGUxNl90b19jcHUoeCkgX19fY29uc3RhbnRfc3dhYjE2KChfX3UxNikoX19sZTE2KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmU2NCh4KSAoKF9fYmU2NCkoX191NjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlNjRfdG9fY3B1KHgpICgoX191NjQpKF9fYmU2NCkoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoeCkgKChfX2JlMzIpKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9iZTMyX3RvX2NwdSh4KSAoKF9fdTMyKShfX2JlMzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTE2KHgpICgoX19iZTE2KShfX3UxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmUxNl90b19jcHUoeCkgKChfX3UxNikoX19iZTE2KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGU2NCh4KSAoKF9fbGU2NClfX3N3YWI2NCgoeCkpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1KHgpIF9fc3dhYjY0KChfX3U2NCkoX19sZTY0KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMih4KSAoKF9fbGUzMilfX3N3YWIzMigoeCkpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1KHgpIF9fc3dhYjMyKChfX3UzMikoX19sZTMyKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNih4KSAoKF9fbGUxNilfX3N3YWIxNigoeCkpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1KHgpIF9fc3dhYjE2KChfX3UxNikoX19sZTE2KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NCh4KSAoKF9fYmU2NCkoX191NjQpKHgpKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1KHgpICgoX191NjQpKF9fYmU2NCkoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzIoeCkgKChfX2JlMzIpKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdSh4KSAoKF9fdTMyKShfX2JlMzIpKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTE2KHgpICgoX19iZTE2KShfX3UxNikoeCkpCisjZGVmaW5lIF9fYmUxNl90b19jcHUoeCkgKChfX3UxNikoX19iZTE2KSh4KSkKKworc3RhdGljIF9faW5saW5lX18gX19sZTY0IF9fY3B1X3RvX2xlNjRwKGNvbnN0IF9fdTY0ICpwKQoreworCXJldHVybiAoX19sZTY0KV9fc3dhYjY0cChwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTY0IF9fbGU2NF90b19jcHVwKGNvbnN0IF9fbGU2NCAqcCkKK3sKKwlyZXR1cm4gX19zd2FiNjRwKChfX3U2NCAqKXApOworfQorc3RhdGljIF9faW5saW5lX18gX19sZTMyIF9fY3B1X3RvX2xlMzJwKGNvbnN0IF9fdTMyICpwKQoreworCXJldHVybiAoX19sZTMyKV9fc3dhYjMycChwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIF9fbGUzMl90b19jcHVwKGNvbnN0IF9fbGUzMiAqcCkKK3sKKwlyZXR1cm4gX19zd2FiMzJwKChfX3UzMiAqKXApOworfQorc3RhdGljIF9faW5saW5lX18gX19sZTE2IF9fY3B1X3RvX2xlMTZwKGNvbnN0IF9fdTE2ICpwKQoreworCXJldHVybiAoX19sZTE2KV9fc3dhYjE2cChwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IF9fbGUxNl90b19jcHVwKGNvbnN0IF9fbGUxNiAqcCkKK3sKKwlyZXR1cm4gX19zd2FiMTZwKChfX3UxNiAqKXApOworfQorc3RhdGljIF9faW5saW5lX18gX19iZTY0IF9fY3B1X3RvX2JlNjRwKGNvbnN0IF9fdTY0ICpwKQoreworCXJldHVybiAoX19iZTY0KSpwOworfQorc3RhdGljIF9faW5saW5lX18gX191NjQgX19iZTY0X3RvX2NwdXAoY29uc3QgX19iZTY0ICpwKQoreworCXJldHVybiAoX191NjQpKnA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX2JlMzIgX19jcHVfdG9fYmUzMnAoY29uc3QgX191MzIgKnApCit7CisJcmV0dXJuIChfX2JlMzIpKnA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX2JlMzJfdG9fY3B1cChjb25zdCBfX2JlMzIgKnApCit7CisJcmV0dXJuIChfX3UzMikqcDsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fYmUxNiBfX2NwdV90b19iZTE2cChjb25zdCBfX3UxNiAqcCkKK3sKKwlyZXR1cm4gKF9fYmUxNikqcDsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IF9fYmUxNl90b19jcHVwKGNvbnN0IF9fYmUxNiAqcCkKK3sKKwlyZXR1cm4gKF9fdTE2KSpwOworfQorI2RlZmluZSBfX2NwdV90b19sZTY0cyh4KSBfX3N3YWI2NHMoKHgpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1cyh4KSBfX3N3YWI2NHMoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTMycyh4KSBfX3N3YWIzMnMoKHgpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1cyh4KSBfX3N3YWIzMnMoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2cyh4KSBfX3N3YWIxNnMoKHgpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1cyh4KSBfX3N3YWIxNnMoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTY0cyh4KSBkbyB7ICh2b2lkKSh4KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdXMoeCkgZG8geyAodm9pZCkoeCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2JlMzJzKHgpIGRvIHsgKHZvaWQpKHgpOyB9IHdoaWxlICgwKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1cyh4KSBkbyB7ICh2b2lkKSh4KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNnMoeCkgZG8geyAodm9pZCkoeCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fYmUxNl90b19jcHVzKHgpIGRvIHsgKHZvaWQpKHgpOyB9IHdoaWxlICgwKQorCisKKyNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX0JJR19FTkRJQU5fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZThhMTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmgKQEAgLTAsMCArMSwxMDUgQEAKKyNpZm5kZWYgX0xJTlVYX0JZVEVPUkRFUl9MSVRUTEVfRU5ESUFOX0gKKyNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9MSVRUTEVfRU5ESUFOX0gKKworI2lmbmRlZiBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOIDEyMzQKKyNlbmRpZgorI2lmbmRlZiBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxECisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3dhYi5oPgorCisjZGVmaW5lIF9fY29uc3RhbnRfaHRvbmwoeCkgKChfX2JlMzIpX19fY29uc3RhbnRfc3dhYjMyKCh4KSkpCisjZGVmaW5lIF9fY29uc3RhbnRfbnRvaGwoeCkgX19fY29uc3RhbnRfc3dhYjMyKChfX2JlMzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2h0b25zKHgpICgoX19iZTE2KV9fX2NvbnN0YW50X3N3YWIxNigoeCkpKQorI2RlZmluZSBfX2NvbnN0YW50X250b2hzKHgpIF9fX2NvbnN0YW50X3N3YWIxNigoX19iZTE2KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGU2NCh4KSAoKF9fbGU2NCkoX191NjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlNjRfdG9fY3B1KHgpICgoX191NjQpKF9fbGU2NCkoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoeCkgKChfX2xlMzIpKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTMyX3RvX2NwdSh4KSAoKF9fdTMyKShfX2xlMzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTE2KHgpICgoX19sZTE2KShfX3UxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbGUxNl90b19jcHUoeCkgKChfX3UxNikoX19sZTE2KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmU2NCh4KSAoKF9fYmU2NClfX19jb25zdGFudF9zd2FiNjQoKHgpKSkKKyNkZWZpbmUgX19jb25zdGFudF9iZTY0X3RvX2NwdSh4KSBfX19jb25zdGFudF9zd2FiNjQoKF9fdTY0KShfX2JlNjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTMyKHgpICgoX19iZTMyKV9fX2NvbnN0YW50X3N3YWIzMigoeCkpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlMzJfdG9fY3B1KHgpIF9fX2NvbnN0YW50X3N3YWIzMigoX191MzIpKF9fYmUzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoeCkgKChfX2JlMTYpX19fY29uc3RhbnRfc3dhYjE2KCh4KSkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmUxNl90b19jcHUoeCkgX19fY29uc3RhbnRfc3dhYjE2KChfX3UxNikoX19iZTE2KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGU2NCh4KSAoKF9fbGU2NCkoX191NjQpKHgpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1KHgpICgoX191NjQpKF9fbGU2NCkoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMzIoeCkgKChfX2xlMzIpKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdSh4KSAoKF9fdTMyKShfX2xlMzIpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2KHgpICgoX19sZTE2KShfX3UxNikoeCkpCisjZGVmaW5lIF9fbGUxNl90b19jcHUoeCkgKChfX3UxNikoX19sZTE2KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NCh4KSAoKF9fYmU2NClfX3N3YWI2NCgoeCkpKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1KHgpIF9fc3dhYjY0KChfX3U2NCkoX19iZTY0KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUzMih4KSAoKF9fYmUzMilfX3N3YWIzMigoeCkpKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1KHgpIF9fc3dhYjMyKChfX3UzMikoX19iZTMyKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNih4KSAoKF9fYmUxNilfX3N3YWIxNigoeCkpKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1KHgpIF9fc3dhYjE2KChfX3UxNikoX19iZTE2KSh4KSkKKworc3RhdGljIF9faW5saW5lX18gX19sZTY0IF9fY3B1X3RvX2xlNjRwKGNvbnN0IF9fdTY0ICpwKQoreworCXJldHVybiAoX19sZTY0KSpwOworfQorc3RhdGljIF9faW5saW5lX18gX191NjQgX19sZTY0X3RvX2NwdXAoY29uc3QgX19sZTY0ICpwKQoreworCXJldHVybiAoX191NjQpKnA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX2xlMzIgX19jcHVfdG9fbGUzMnAoY29uc3QgX191MzIgKnApCit7CisJcmV0dXJuIChfX2xlMzIpKnA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX2xlMzJfdG9fY3B1cChjb25zdCBfX2xlMzIgKnApCit7CisJcmV0dXJuIChfX3UzMikqcDsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fbGUxNiBfX2NwdV90b19sZTE2cChjb25zdCBfX3UxNiAqcCkKK3sKKwlyZXR1cm4gKF9fbGUxNikqcDsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IF9fbGUxNl90b19jcHVwKGNvbnN0IF9fbGUxNiAqcCkKK3sKKwlyZXR1cm4gKF9fdTE2KSpwOworfQorc3RhdGljIF9faW5saW5lX18gX19iZTY0IF9fY3B1X3RvX2JlNjRwKGNvbnN0IF9fdTY0ICpwKQoreworCXJldHVybiAoX19iZTY0KV9fc3dhYjY0cChwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTY0IF9fYmU2NF90b19jcHVwKGNvbnN0IF9fYmU2NCAqcCkKK3sKKwlyZXR1cm4gX19zd2FiNjRwKChfX3U2NCAqKXApOworfQorc3RhdGljIF9faW5saW5lX18gX19iZTMyIF9fY3B1X3RvX2JlMzJwKGNvbnN0IF9fdTMyICpwKQoreworCXJldHVybiAoX19iZTMyKV9fc3dhYjMycChwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIF9fYmUzMl90b19jcHVwKGNvbnN0IF9fYmUzMiAqcCkKK3sKKwlyZXR1cm4gX19zd2FiMzJwKChfX3UzMiAqKXApOworfQorc3RhdGljIF9faW5saW5lX18gX19iZTE2IF9fY3B1X3RvX2JlMTZwKGNvbnN0IF9fdTE2ICpwKQoreworCXJldHVybiAoX19iZTE2KV9fc3dhYjE2cChwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IF9fYmUxNl90b19jcHVwKGNvbnN0IF9fYmUxNiAqcCkKK3sKKwlyZXR1cm4gX19zd2FiMTZwKChfX3UxNiAqKXApOworfQorI2RlZmluZSBfX2NwdV90b19sZTY0cyh4KSBkbyB7ICh2b2lkKSh4KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdXMoeCkgZG8geyAodm9pZCkoeCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2xlMzJzKHgpIGRvIHsgKHZvaWQpKHgpOyB9IHdoaWxlICgwKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1cyh4KSBkbyB7ICh2b2lkKSh4KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNnMoeCkgZG8geyAodm9pZCkoeCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fbGUxNl90b19jcHVzKHgpIGRvIHsgKHZvaWQpKHgpOyB9IHdoaWxlICgwKQorI2RlZmluZSBfX2NwdV90b19iZTY0cyh4KSBfX3N3YWI2NHMoKHgpKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1cyh4KSBfX3N3YWI2NHMoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTMycyh4KSBfX3N3YWIzMnMoKHgpKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1cyh4KSBfX3N3YWIzMnMoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTE2cyh4KSBfX3N3YWIxNnMoKHgpKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1cyh4KSBfX3N3YWIxNnMoKHgpKQorCisKKyNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX0xJVFRMRV9FTkRJQU5fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYWlmL2NhaWZfc29ja2V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NhaWYvY2FpZl9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjNiYWM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYWlmL2NhaWZfc29ja2V0LmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qIGxpbnV4L2NhaWZfc29ja2V0LmgKKyAqIENBSUYgRGVmaW5pdGlvbnMgZm9yIENBSUYgc29ja2V0IGFuZCBuZXR3b3JrIGxheWVyCisgKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIEFCIDIwMTAKKyAqIEF1dGhvcjoJIFNqdXIgQnJlbmRlbGFuZC8gc2p1ci5icmFuZGVsYW5kQHN0ZXJpY3Nzb24uY29tCisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKKyAqLworCisjaWZuZGVmIF9MSU5VWF9DQUlGX1NPQ0tFVF9ICisjZGVmaW5lIF9MSU5VWF9DQUlGX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCisvKioKKyAqIGVudW0gY2FpZl9saW5rX3NlbGVjdG9yIC0gICAgUGh5c2ljYWwgTGluayBTZWxlY3Rpb24uCisgKiBAQ0FJRl9MSU5LX0hJR0hfQkFORFc6CVBoeXNpY2FsIGludGVyZmFjZSBmb3IgaGlnaC1iYW5kd2lkdGgKKyAqCQkJCXRyYWZmaWMuCisgKiBAQ0FJRl9MSU5LX0xPV19MQVRFTkNZOglQaHlzaWNhbCBpbnRlcmZhY2UgZm9yIGxvdy1sYXRlbmN5CisgKgkJCQl0cmFmZmljLgorICoKKyAqIENBSUYgTGluayBMYXllcnMgY2FuIHJlZ2lzdGVyIHRoZWlyIGxpbmsgcHJvcGVydGllcy4KKyAqIFRoaXMgZW51bSBpcyB1c2VkIGZvciBjaG9vc2luZyBiZXR3ZWVuIENBSUYgTGluayBMYXllcnMgd2hlbgorICogc2V0dGluZyB1cCBDQUlGIENoYW5uZWxzIHdoZW4gbXVsdGlwbGUgQ0FJRiBMaW5rIExheWVycyBleGlzdHMuCisgKi8KK2VudW0gY2FpZl9saW5rX3NlbGVjdG9yIHsKKwlDQUlGX0xJTktfSElHSF9CQU5EVywKKwlDQUlGX0xJTktfTE9XX0xBVEVOQ1kKK307CisKKy8qKgorICogZW51bSBjYWlmX2NoYW5uZWxfcHJpb3JpdHkgLSBDQUlGIGNoYW5uZWwgcHJpb3JpdGllcy4KKyAqCisgKiBAQ0FJRl9QUklPX01JTjoJTWluIHByaW9yaXR5IGZvciBhIGNoYW5uZWwuCisgKiBAQ0FJRl9QUklPX0xPVzoJTG93LXByaW9yaXR5IGNoYW5uZWwuCisgKiBAQ0FJRl9QUklPX05PUk1BTDoJTm9ybWFsL2RlZmF1bHQgcHJpb3JpdHkgbGV2ZWwuCisgKiBAQ0FJRl9QUklPX0hJR0g6CUhpZ2ggcHJpb3JpdHkgbGV2ZWwKKyAqIEBDQUlGX1BSSU9fTUFYOglNYXggcHJpb3JpdHkgZm9yIGNoYW5uZWwKKyAqCisgKiBQcmlvcml0eSBjYW4gYmUgc2V0IG9uIENBSUYgQ2hhbm5lbHMgaW4gb3JkZXIgdG8KKyAqIHByaW9yaXRpemUgYmV0d2VlbiB0cmFmZmljIG9uIGRpZmZlcmVudCBDQUlGIENoYW5uZWxzLgorICogVGhlc2UgcHJpb3JpdHkgbGV2ZWxzIGFyZSByZWNvbW1lbmRlZCwgYnV0IHRoZSBwcmlvcml0eSB2YWx1ZQorICogaXMgbm90IHJlc3RyaWN0ZWQgdG8gdGhlIHZhbHVlcyBkZWZpbmVkIGluIHRoaXMgZW51bSwgYW55IHZhbHVlCisgKiBiZXR3ZWVuIENBSUZfUFJJT19NSU4gYW5kIENBSUZfUFJJT19NQVggY291bGQgYmUgdXNlZC4KKyAqLworZW51bSBjYWlmX2NoYW5uZWxfcHJpb3JpdHkgeworCUNBSUZfUFJJT19NSU4JID0gMHgwMSwKKwlDQUlGX1BSSU9fTE9XCSA9IDB4MDQsCisJQ0FJRl9QUklPX05PUk1BTCA9IDB4MGYsCisJQ0FJRl9QUklPX0hJR0gJID0gMHgxNCwKKwlDQUlGX1BSSU9fTUFYCSA9IDB4MUYKK307CisKKy8qKgorICogZW51bSBjYWlmX3Byb3RvY29sX3R5cGUgIC0JQ0FJRiBDaGFubmVsIHR5cGUuCisgKiBAQ0FJRlBST1RPX0FUOgkJQ2xhc3NpYyBBVCBjaGFubmVsLgorICogQENBSUZQUk9UT19EQVRBR1JBTToJRGF0YWdyYW0gY2hhbm5lbC4KKyAqIEBDQUlGUFJPVE9fREFUQUdSQU1fTE9PUDoJRGF0YWdyYW0gbG9vcGJhY2sgY2hhbm5lbCwgdXNlZCBmb3IgdGVzdGluZy4KKyAqIEBDQUlGUFJPVE9fVVRJTDoJCVV0aWxpdHkgKFBzb2NrKSBjaGFubmVsLgorICogQENBSUZQUk9UT19SRk06CQlSZW1vdGUgRmlsZSBNYW5hZ2VyCisgKiBAQ0FJRlBST1RPX0RFQlVHOgkJRGVidWcgbGluaworICoKKyAqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBDQUlGIENoYW5uZWwgdHlwZSB0byBiZSB1c2VkLiBUaGlzIGRlZmluZXMKKyAqIHRoZSBzZXJ2aWNlIHRvIGNvbm5lY3QgdG8gb24gdGhlIG1vZGVtLgorICovCitlbnVtIGNhaWZfcHJvdG9jb2xfdHlwZSB7CisJQ0FJRlBST1RPX0FULAorCUNBSUZQUk9UT19EQVRBR1JBTSwKKwlDQUlGUFJPVE9fREFUQUdSQU1fTE9PUCwKKwlDQUlGUFJPVE9fVVRJTCwKKwlDQUlGUFJPVE9fUkZNLAorCUNBSUZQUk9UT19ERUJVRywKKwlfQ0FJRlBST1RPX01BWAorfTsKKyNkZWZpbmUJQ0FJRlBST1RPX01BWCBfQ0FJRlBST1RPX01BWAorCisvKioKKyAqIGVudW0gY2FpZl9hdF90eXBlIC0gQVQgU2VydmljZSBFbmRwb2ludAorICogQENBSUZfQVRUWVBFX1BMQUlOOgkgICAgIENvbm5lY3RzIHRvIGEgcGxhaW4gdmFuaWxsYSBBVCBjaGFubmVsLgorICovCitlbnVtIGNhaWZfYXRfdHlwZSB7CisJQ0FJRl9BVFRZUEVfUExBSU4gPSAyCit9OworIC8qKgorICogZW51bSBjYWlmX2RlYnVnX3R5cGUgLSBDb250ZW50IHNlbGVjdGlvbiBmb3IgZGVidWcgY29ubmVjdGlvbgorICogQENBSUZfREVCVUdfVFJBQ0VfSU5URVJBQ1RJVkU6IENvbm5lY3Rpb24gd2lsbCBjb250YWluCisgKgkJCQlib3RoIHRyYWNlIGFuZCBpbnRlcmFjdGl2ZSBkZWJ1Zy4KKyAqIEBDQUlGX0RFQlVHX1RSQUNFOgkJQ29ubmVjdGlvbiBjb250YWlucyB0cmFjZSBvbmx5LgorICogQENBSUZfREVCVUdfSU5URVJBQ1RJVkU6CUNvbm5lY3Rpb24gdG8gaW50ZXJhY3RpdmUgZGVidWcuCisgKi8KK2VudW0gY2FpZl9kZWJ1Z190eXBlIHsKKwlDQUlGX0RFQlVHX1RSQUNFX0lOVEVSQUNUSVZFID0gMCwKKwlDQUlGX0RFQlVHX1RSQUNFLAorCUNBSUZfREVCVUdfSU5URVJBQ1RJVkUsCit9OworCisvKioKKyAqIGVudW0gY2FpZl9kZWJ1Z19zZXJ2aWNlIC0gRGVidWcgU2VydmljZSBFbmRwb2ludAorICogQENBSUZfUkFESU9fREVCVUdfU0VSVklDRToJRGVidWcgc2VydmljZSBvbiB0aGUgUmFkaW8gc3ViLXN5c3RlbQorICogQENBSUZfQVBQX0RFQlVHX1NFUlZJQ0U6CURlYnVnIGZvciB0aGUgYXBwbGljYXRpb25zIHN1Yi1zeXN0ZW0KKyAqLworZW51bSBjYWlmX2RlYnVnX3NlcnZpY2UgeworCUNBSUZfUkFESU9fREVCVUdfU0VSVklDRSA9IDEsCisJQ0FJRl9BUFBfREVCVUdfU0VSVklDRQorfTsKKworLyoqCisgKiBzdHJ1Y3Qgc29ja2FkZHJfY2FpZiAtIHRoZSBzb2NrYWRkciBzdHJ1Y3R1cmUgZm9yIENBSUYgc29ja2V0cy4KKyAqIEBmYW1pbHk6CQkgICAgIEFkZHJlc3MgZmFtaWx5IG51bWJlciwgbXVzdCBiZSBBRl9DQUlGLgorICogQHU6CQkJICAgICBVbmlvbiBvZiBhZGRyZXNzIGRhdGEgJ3N3aXRjaGVkJyBieSBmYW1pbHkuCisgKiA6CisgKiBAdS5hdDogICAgICAgICAgICAgICAgICAgIEFwcGxpZXMgd2hlbiBmYW1pbHkgPSBDQUlGUFJPVE9fQVQuCisgKgorICogQHUuYXQudHlwZTogICAgICAgICAgICAgICBUeXBlIG9mIEFUIGxpbmsgdG8gc2V0IHVwIChlbnVtIGNhaWZfYXRfdHlwZSkuCisgKgorICogQHUudXRpbDogICAgICAgICAgICAgICAgICBBcHBsaWVzIHdoZW4gZmFtaWx5ID0gQ0FJRlBST1RPX1VUSUwKKyAqCisgKiBAdS51dGlsLnNlcnZpY2U6ICAgICAgICAgIFV0aWxpdHkgc2VydmljZSBuYW1lLgorICoKKyAqIEB1LmRnbTogICAgICAgICAgICAgICAgICAgQXBwbGllcyB3aGVuIGZhbWlseSA9IENBSUZQUk9UT19EQVRBR1JBTQorICoKKyAqIEB1LmRnbS5jb25uZWN0aW9uX2lkOiAgICAgRGF0YWdyYW0gY29ubmVjdGlvbiBpZC4KKyAqCisgKiBAdS5kZ20ubnNhcGk6ICAgICAgICAgICAgIE5TQVBJIG9mIHRoZSBQRFAtQ29udGV4dC4KKyAqCisgKiBAdS5yZm06ICAgICAgICAgICAgICAgICAgIEFwcGxpZXMgd2hlbiBmYW1pbHkgPSBDQUlGUFJPVE9fUkZNCisgKgorICogQHUucmZtLmNvbm5lY3Rpb25faWQ6ICAgICBDb25uZWN0aW9uIElEIGZvciBSRk0uCisgKgorICogQHUucmZtLnZvbHVtZTogICAgICAgICAgICBWb2x1bWUgdG8gbW91bnQuCisgKgorICogQHUuZGJnOgkJICAgICAgQXBwbGllcyB3aGVuIGZhbWlseSA9IENBSUZQUk9UT19ERUJVRy4KKyAqCisgKiBAdS5kYmcudHlwZToJCQkgICAgIFR5cGUgb2YgZGVidWcgY29ubmVjdGlvbiB0byBzZXQgdXAKKyAqCQkJICAgICAgKGNhaWZfZGVidWdfdHlwZSkuCisgKgorICogQHUuZGJnLnNlcnZpY2U6CSAgICAgIFNlcnZpY2Ugc3ViLXN5c3RlbSB0byBjb25uZWN0IChjYWlmX2RlYnVnX3NlcnZpY2UKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGNvbm5lY3QgcGFyYW1ldGVycyB1c2VkIGZvciBzZXR0aW5nIHVwIGEKKyAqIENBSUYgQ2hhbm5lbC4gSXQgZGVmaW5lcyB0aGUgc2VydmljZSB0byBjb25uZWN0IHRvIG9uIHRoZSBtb2RlbS4KKyAqLworc3RydWN0IHNvY2thZGRyX2NhaWYgeworCV9fa2VybmVsX3NhX2ZhbWlseV90ICBmYW1pbHk7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191OCAgdHlwZTsJCS8qIHR5cGU6IGVudW0gY2FpZl9hdF90eXBlICovCisJCX0gYXQ7CQkJCS8qIENBSUZQUk9UT19BVCAqLworCQlzdHJ1Y3QgeworCQkJY2hhcgkgIHNlcnZpY2VbMTZdOworCQl9IHV0aWw7CQkJCS8qIENBSUZQUk9UT19VVElMICovCisJCXVuaW9uIHsKKwkJCV9fdTMyIGNvbm5lY3Rpb25faWQ7CisJCQlfX3U4ICBuc2FwaTsKKwkJfSBkZ207CQkJCS8qIENBSUZQUk9UT19EQVRBR1JBTShfTE9PUCkqLworCQlzdHJ1Y3QgeworCQkJX191MzIgY29ubmVjdGlvbl9pZDsKKwkJCWNoYXIJICB2b2x1bWVbMTZdOworCQl9IHJmbTsJCQkJLyogQ0FJRlBST1RPX1JGTSAqLworCQlzdHJ1Y3QgeworCQkJX191OCAgdHlwZTsJCS8qIHR5cGU6ZW51bSBjYWlmX2RlYnVnX3R5cGUgKi8KKwkJCV9fdTggIHNlcnZpY2U7CQkvKiBzZXJ2aWNlOmNhaWZfZGVidWdfc2VydmljZSAqLworCQl9IGRiZzsJCQkJLyogQ0FJRlBST1RPX0RFQlVHICovCisJfSB1OworfTsKKworLyoqCisgKiBlbnVtIGNhaWZfc29ja2V0X29wdHMgLSBDQUlGIG9wdGlvbiB2YWx1ZXMgZm9yIGdldHNvY2tvcHQgYW5kIHNldHNvY2tvcHQuCisgKgorICogQENBSUZTT19MSU5LX1NFTEVDVDoJCVNlbGVjdG9yIHVzZWQgaWYgbXVsdGlwbGUgQ0FJRiBMaW5rIGxheWVycyBhcmUKKyAqCQkJCWF2YWlsYWJsZS4gRWl0aGVyIGEgaGlnaCBiYW5kd2lkdGgKKyAqCQkJCWxpbmsgY2FuIGJlIHNlbGVjdGVkIChDQUlGX0xJTktfSElHSF9CQU5EVykgb3IKKyAqCQkJCW9yIGEgbG93IGxhdGVuY3kgbGluayAoQ0FJRl9MSU5LX0xPV19MQVRFTkNZKS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgb2YgdHlwZSBfX3UzMi4KKyAqCQkJCUFsdGVybmF0aXZlbHkgU09fQklORFRPREVWSUNFIGNhbiBiZSB1c2VkLgorICoKKyAqIEBDQUlGU09fUkVRX1BBUkFNOgkJVXNlZCB0byBzZXQgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyBmb3IgYQorICoJCQkJdXRpbGl0eSBjaGFubmVsLiAobWF4aW11bSAyNTYgYnl0ZXMpLiBUaGlzCisgKgkJCQlvcHRpb24gbXVzdCBiZSBzZXQgYmVmb3JlIGNvbm5lY3RpbmcuCisgKgorICogQENBSUZTT19SU1BfUEFSQU06CQlHZXRzIHRoZSByZXNwb25zZSBwYXJhbWV0ZXJzIGZvciBhIHV0aWxpdHkKKyAqCQkJCWNoYW5uZWwuIChtYXhpbXVtIDI1NiBieXRlcykuIFRoaXMgb3B0aW9uCisgKgkJCQlpcyB2YWxpZCBhZnRlciBhIHN1Y2Nlc3NmdWwgY29ubmVjdC4KKyAqCisgKgorICogVGhpcyBlbnVtIGRlZmluZXMgdGhlIENBSUYgU29ja2V0IG9wdGlvbnMgdG8gYmUgdXNlZCBvbiBhIHNvY2tldAorICogb2YgdHlwZSBQRl9DQUlGLgorICoKKyAqLworZW51bSBjYWlmX3NvY2tldF9vcHRzIHsKKwlDQUlGU09fTElOS19TRUxFQ1QJPSAxMjcsCisJQ0FJRlNPX1JFUV9QQVJBTQk9IDEyOCwKKwlDQUlGU09fUlNQX1BBUkFNCT0gMTI5LAorfTsKKworI2VuZGlmIC8qIF9MSU5VWF9DQUlGX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NhaWYvaWZfY2FpZi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYWlmL2lmX2NhaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTdlZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYWlmL2lmX2NhaWYuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBBQiAyMDEwCisgKiBBdXRob3I6CVNqdXIgQnJlbmRlbGFuZC8gc2p1ci5icmFuZGVsYW5kQHN0ZXJpY3Nzb24uY29tCisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKKyAqLworCisjaWZuZGVmIElGX0NBSUZfSF8KKyNkZWZpbmUgSUZfQ0FJRl9IXworI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCisvKioKKyAqIGVudW0gaWZsYV9jYWlmIC0gQ0FJRiBOZXRsaW5rUlQgcGFyYW1ldGVycy4KKyAqIEBJRkxBX0NBSUZfSVBWNF9DT05OSUQ6ICBDb25uZWN0aW9uIElEIGZvciBJUHY0IFBEUCBDb250ZXh0LgorICoJCQkgICAgVGhlIHR5cGUgb2YgYXR0cmlidXRlIGlzIE5MQV9VMzIuCisgKiBASUZMQV9DQUlGX0lQVjZfQ09OTklEOiAgQ29ubmVjdGlvbiBJRCBmb3IgSVB2NiBQRFAgQ29udGV4dC4KKyAqCQkJICAgIFRoZSB0eXBlIG9mIGF0dHJpYnV0ZSBpcyBOTEFfVTMyLgorICogQElGTEFfQ0FJRl9MT09QQkFDSzoJICAgIElmIGRpZmZlcmVudCBmcm9tIHplcm8sIGRldmljZSBpcyBkb2luZyBsb29wYmFjaworICoJCQkgICAgVGhlIHR5cGUgb2YgYXR0cmlidXRlIGlzIE5MQV9VOC4KKyAqCisgKiBXaGVuIHVzaW5nIFJUIE5ldGxpbmsgdG8gY3JlYXRlLCBkZXN0cm95IG9yIGNvbmZpZ3VyZSBhIENBSUYgSVAgaW50ZXJmYWNlLAorICogZW51bSBpZmxhX2NhaWYgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMuCisgKi8KK2VudW0gaWZsYV9jYWlmIHsKKwlfX0lGTEFfQ0FJRl9VTlNQRUMsCisJSUZMQV9DQUlGX0lQVjRfQ09OTklELAorCUlGTEFfQ0FJRl9JUFY2X0NPTk5JRCwKKwlJRkxBX0NBSUZfTE9PUEJBQ0ssCisJX19JRkxBX0NBSUZfTUFYCit9OworI2RlZmluZQlJRkxBX0NBSUZfTUFYIChfX0lGTEFfQ0FJRl9NQVgtMSkKKworI2VuZGlmIC8qSUZfQ0FJRl9IXyovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nhbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTE5YmNiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4uaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIGxpbnV4L2Nhbi5oCisgKgorICogRGVmaW5pdGlvbnMgZm9yIENBTiBuZXR3b3JrIGxheWVyIChzb2NrZXQgYWRkciAvIENBTiBmcmFtZSAvIENBTiBmaWx0ZXIpCisgKgorICogQXV0aG9yczogT2xpdmVyIEhhcnRrb3BwIDxvbGl2ZXIuaGFydGtvcHBAdm9sa3N3YWdlbi5kZT4KKyAqICAgICAgICAgIFVycyBUaHVlcm1hbm4gICA8dXJzLnRodWVybWFubkB2b2xrc3dhZ2VuLmRlPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDcgVm9sa3N3YWdlbiBHcm91cCBFbGVjdHJvbmljIFJlc2VhcmNoCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqLworCisjaWZuZGVmIENBTl9ICisjZGVmaW5lIENBTl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCisvKiBjb250cm9sbGVyIGFyZWEgbmV0d29yayAoQ0FOKSBrZXJuZWwgZGVmaW5pdGlvbnMgKi8KKworLyogc3BlY2lhbCBhZGRyZXNzIGRlc2NyaXB0aW9uIGZsYWdzIGZvciB0aGUgQ0FOX0lEICovCisjZGVmaW5lIENBTl9FRkZfRkxBRyAweDgwMDAwMDAwVSAvKiBFRkYvU0ZGIGlzIHNldCBpbiB0aGUgTVNCICovCisjZGVmaW5lIENBTl9SVFJfRkxBRyAweDQwMDAwMDAwVSAvKiByZW1vdGUgdHJhbnNtaXNzaW9uIHJlcXVlc3QgKi8KKyNkZWZpbmUgQ0FOX0VSUl9GTEFHIDB4MjAwMDAwMDBVIC8qIGVycm9yIGZyYW1lICovCisKKy8qIHZhbGlkIGJpdHMgaW4gQ0FOIElEIGZvciBmcmFtZSBmb3JtYXRzICovCisjZGVmaW5lIENBTl9TRkZfTUFTSyAweDAwMDAwN0ZGVSAvKiBzdGFuZGFyZCBmcmFtZSBmb3JtYXQgKFNGRikgKi8KKyNkZWZpbmUgQ0FOX0VGRl9NQVNLIDB4MUZGRkZGRkZVIC8qIGV4dGVuZGVkIGZyYW1lIGZvcm1hdCAoRUZGKSAqLworI2RlZmluZSBDQU5fRVJSX01BU0sgMHgxRkZGRkZGRlUgLyogb21pdCBFRkYsIFJUUiwgRVJSIGZsYWdzICovCisKKy8qCisgKiBDb250cm9sbGVyIEFyZWEgTmV0d29yayBJZGVudGlmaWVyIHN0cnVjdHVyZQorICoKKyAqIGJpdCAwLTI4CTogQ0FOIGlkZW50aWZpZXIgKDExLzI5IGJpdCkKKyAqIGJpdCAyOQk6IGVycm9yIGZyYW1lIGZsYWcgKDAgPSBkYXRhIGZyYW1lLCAxID0gZXJyb3IgZnJhbWUpCisgKiBiaXQgMzAJOiByZW1vdGUgdHJhbnNtaXNzaW9uIHJlcXVlc3QgZmxhZyAoMSA9IHJ0ciBmcmFtZSkKKyAqIGJpdCAzMQk6IGZyYW1lIGZvcm1hdCBmbGFnICgwID0gc3RhbmRhcmQgMTEgYml0LCAxID0gZXh0ZW5kZWQgMjkgYml0KQorICovCit0eXBlZGVmIF9fdTMyIGNhbmlkX3Q7CisKKy8qCisgKiBDb250cm9sbGVyIEFyZWEgTmV0d29yayBFcnJvciBGcmFtZSBNYXNrIHN0cnVjdHVyZQorICoKKyAqIGJpdCAwLTI4CTogZXJyb3IgY2xhc3MgbWFzayAoc2VlIGluY2x1ZGUvbGludXgvY2FuL2Vycm9yLmgpCisgKiBiaXQgMjktMzEJOiBzZXQgdG8gemVybworICovCit0eXBlZGVmIF9fdTMyIGNhbl9lcnJfbWFza190OworCisvKioKKyAqIHN0cnVjdCBjYW5fZnJhbWUgLSBiYXNpYyBDQU4gZnJhbWUgc3RydWN0dXJlCisgKiBAY2FuX2lkOiAgdGhlIENBTiBJRCBvZiB0aGUgZnJhbWUgYW5kIENBTl8qX0ZMQUcgZmxhZ3MsIHNlZSBhYm92ZS4KKyAqIEBjYW5fZGxjOiB0aGUgZGF0YSBsZW5ndGggZmllbGQgb2YgdGhlIENBTiBmcmFtZQorICogQGRhdGE6ICAgIHRoZSBDQU4gZnJhbWUgcGF5bG9hZC4KKyAqLworc3RydWN0IGNhbl9mcmFtZSB7CisJY2FuaWRfdCBjYW5faWQ7ICAvKiAzMiBiaXQgQ0FOX0lEICsgRUZGL1JUUi9FUlIgZmxhZ3MgKi8KKwlfX3U4ICAgIGNhbl9kbGM7IC8qIGRhdGEgbGVuZ3RoIGNvZGU6IDAgLi4gOCAqLworCV9fdTggICAgZGF0YVs4XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7Cit9OworCisvKiBwYXJ0aWN1bGFyIHByb3RvY29scyBvZiB0aGUgcHJvdG9jb2wgZmFtaWx5IFBGX0NBTiAqLworI2RlZmluZSBDQU5fUkFXCQkxIC8qIFJBVyBzb2NrZXRzICovCisjZGVmaW5lIENBTl9CQ00JCTIgLyogQnJvYWRjYXN0IE1hbmFnZXIgKi8KKyNkZWZpbmUgQ0FOX1RQMTYJMyAvKiBWQUcgVHJhbnNwb3J0IFByb3RvY29sIHYxLjYgKi8KKyNkZWZpbmUgQ0FOX1RQMjAJNCAvKiBWQUcgVHJhbnNwb3J0IFByb3RvY29sIHYyLjAgKi8KKyNkZWZpbmUgQ0FOX01DTkVUCTUgLyogQm9zY2ggTUNOZXQgKi8KKyNkZWZpbmUgQ0FOX0lTT1RQCTYgLyogSVNPIDE1NzY1LTIgVHJhbnNwb3J0IFByb3RvY29sICovCisjZGVmaW5lIENBTl9OUFJPVE8JNworCisjZGVmaW5lIFNPTF9DQU5fQkFTRSAxMDAKKworLyoqCisgKiBzdHJ1Y3Qgc29ja2FkZHJfY2FuIC0gdGhlIHNvY2thZGRyIHN0cnVjdHVyZSBmb3IgQ0FOIHNvY2tldHMKKyAqIEBjYW5fZmFtaWx5OiAgYWRkcmVzcyBmYW1pbHkgbnVtYmVyIEFGX0NBTi4KKyAqIEBjYW5faWZpbmRleDogQ0FOIG5ldHdvcmsgaW50ZXJmYWNlIGluZGV4LgorICogQGNhbl9hZGRyOiAgICBwcm90b2NvbCBzcGVjaWZpYyBhZGRyZXNzIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBzb2NrYWRkcl9jYW4geworCV9fa2VybmVsX3NhX2ZhbWlseV90IGNhbl9mYW1pbHk7CisJaW50ICAgICAgICAgY2FuX2lmaW5kZXg7CisJdW5pb24geworCQkvKiB0cmFuc3BvcnQgcHJvdG9jb2wgY2xhc3MgYWRkcmVzcyBpbmZvcm1hdGlvbiAoZS5nLiBJU09UUCkgKi8KKwkJc3RydWN0IHsgY2FuaWRfdCByeF9pZCwgdHhfaWQ7IH0gdHA7CisKKwkJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBDQU4gcHJvdG9jb2xzIGFkZHJlc3MgaW5mb3JtYXRpb24gKi8KKwl9IGNhbl9hZGRyOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FuX2ZpbHRlciAtIENBTiBJRCBiYXNlZCBmaWx0ZXIgaW4gY2FuX3JlZ2lzdGVyKCkuCisgKiBAY2FuX2lkOiAgIHJlbGV2YW50IGJpdHMgb2YgQ0FOIElEIHdoaWNoIGFyZSBub3QgbWFza2VkIG91dC4KKyAqIEBjYW5fbWFzazogQ0FOIG1hc2sgKHNlZSBkZXNjcmlwdGlvbikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEEgZmlsdGVyIG1hdGNoZXMsIHdoZW4KKyAqCisgKiAgICAgICAgICA8cmVjZWl2ZWRfY2FuX2lkPiAmIG1hc2sgPT0gY2FuX2lkICYgbWFzaworICoKKyAqIFRoZSBmaWx0ZXIgY2FuIGJlIGludmVydGVkIChDQU5fSU5WX0ZJTFRFUiBiaXQgc2V0IGluIGNhbl9pZCkgb3IgaXQgY2FuCisgKiBmaWx0ZXIgZm9yIGVycm9yIGZyYW1lcyAoQ0FOX0VSUl9GTEFHIGJpdCBzZXQgaW4gbWFzaykuCisgKi8KK3N0cnVjdCBjYW5fZmlsdGVyIHsKKwljYW5pZF90IGNhbl9pZDsKKwljYW5pZF90IGNhbl9tYXNrOworfTsKKworI2RlZmluZSBDQU5fSU5WX0ZJTFRFUiAweDIwMDAwMDAwVSAvKiB0byBiZSBzZXQgaW4gY2FuX2ZpbHRlci5jYW5faWQgKi8KKworI2VuZGlmIC8qIENBTl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nhbi9iY20uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FuL2JjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYmUzODcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nhbi9iY20uaApAQCAtMCwwICsxLDY2IEBACisvKgorICogbGludXgvY2FuL2JjbS5oCisgKgorICogRGVmaW5pdGlvbnMgZm9yIENBTiBCcm9hZGNhc3QgTWFuYWdlciAoQkNNKQorICoKKyAqIEF1dGhvcjogT2xpdmVyIEhhcnRrb3BwIDxvbGl2ZXIuaGFydGtvcHBAdm9sa3N3YWdlbi5kZT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA3IFZvbGtzd2FnZW4gR3JvdXAgRWxlY3Ryb25pYyBSZXNlYXJjaAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKi8KKworI2lmbmRlZiBDQU5fQkNNX0gKKyNkZWZpbmUgQ0FOX0JDTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi5oPgorCisvKioKKyAqIHN0cnVjdCBiY21fbXNnX2hlYWQgLSBoZWFkIG9mIG1lc3NhZ2VzIHRvL2Zyb20gdGhlIGJyb2FkY2FzdCBtYW5hZ2VyCisgKiBAb3Bjb2RlOiAgICBvcGNvZGUsIHNlZSBlbnVtIGJlbG93LgorICogQGZsYWdzOiAgICAgc3BlY2lhbCBmbGFncywgc2VlIGJlbG93LgorICogQGNvdW50OiAgICAgbnVtYmVyIG9mIGZyYW1lcyB0byBzZW5kIGJlZm9yZSBjaGFuZ2luZyBpbnRlcnZhbC4KKyAqIEBpdmFsMTogICAgIGludGVydmFsIGZvciB0aGUgZmlyc3QgQGNvdW50IGZyYW1lcy4KKyAqIEBpdmFsMjogICAgIGludGVydmFsIGZvciB0aGUgZm9sbG93aW5nIGZyYW1lcy4KKyAqIEBjYW5faWQ6ICAgIENBTiBJRCBvZiBmcmFtZXMgdG8gYmUgc2VudCBvciByZWNlaXZlZC4KKyAqIEBuZnJhbWVzOiAgIG51bWJlciBvZiBmcmFtZXMgYXBwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZC4KKyAqIEBmcmFtZXM6ICAgIGFycmF5IG9mIENBTiBmcmFtZXMuCisgKi8KK3N0cnVjdCBiY21fbXNnX2hlYWQgeworCV9fdTMyIG9wY29kZTsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBjb3VudDsKKwlzdHJ1Y3QgdGltZXZhbCBpdmFsMSwgaXZhbDI7CisJY2FuaWRfdCBjYW5faWQ7CisJX191MzIgbmZyYW1lczsKKwlzdHJ1Y3QgY2FuX2ZyYW1lIGZyYW1lc1swXTsKK307CisKK2VudW0geworCVRYX1NFVFVQID0gMSwJLyogY3JlYXRlIChjeWNsaWMpIHRyYW5zbWlzc2lvbiB0YXNrICovCisJVFhfREVMRVRFLAkvKiByZW1vdmUgKGN5Y2xpYykgdHJhbnNtaXNzaW9uIHRhc2sgKi8KKwlUWF9SRUFELAkvKiByZWFkIHByb3BlcnRpZXMgb2YgKGN5Y2xpYykgdHJhbnNtaXNzaW9uIHRhc2sgKi8KKwlUWF9TRU5ELAkvKiBzZW5kIG9uZSBDQU4gZnJhbWUgKi8KKwlSWF9TRVRVUCwJLyogY3JlYXRlIFJYIGNvbnRlbnQgZmlsdGVyIHN1YnNjcmlwdGlvbiAqLworCVJYX0RFTEVURSwJLyogcmVtb3ZlIFJYIGNvbnRlbnQgZmlsdGVyIHN1YnNjcmlwdGlvbiAqLworCVJYX1JFQUQsCS8qIHJlYWQgcHJvcGVydGllcyBvZiBSWCBjb250ZW50IGZpbHRlciBzdWJzY3JpcHRpb24gKi8KKwlUWF9TVEFUVVMsCS8qIHJlcGx5IHRvIFRYX1JFQUQgcmVxdWVzdCAqLworCVRYX0VYUElSRUQsCS8qIG5vdGlmaWNhdGlvbiBvbiBwZXJmb3JtZWQgdHJhbnNtaXNzaW9ucyAoY291bnQ9MCkgKi8KKwlSWF9TVEFUVVMsCS8qIHJlcGx5IHRvIFJYX1JFQUQgcmVxdWVzdCAqLworCVJYX1RJTUVPVVQsCS8qIGN5Y2xpYyBtZXNzYWdlIGlzIGFic2VudCAqLworCVJYX0NIQU5HRUQJLyogdXBkYXRlZCBDQU4gZnJhbWUgKGRldGVjdGVkIGNvbnRlbnQgY2hhbmdlKSAqLworfTsKKworI2RlZmluZSBTRVRUSU1FUiAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBTVEFSVFRJTUVSICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBUWF9DT1VOVEVWVCAgICAgICAgIDB4MDAwNAorI2RlZmluZSBUWF9BTk5PVU5DRSAgICAgICAgIDB4MDAwOAorI2RlZmluZSBUWF9DUF9DQU5fSUQgICAgICAgIDB4MDAxMAorI2RlZmluZSBSWF9GSUxURVJfSUQgICAgICAgIDB4MDAyMAorI2RlZmluZSBSWF9DSEVDS19ETEMgICAgICAgIDB4MDA0MAorI2RlZmluZSBSWF9OT19BVVRPVElNRVIgICAgIDB4MDA4MAorI2RlZmluZSBSWF9BTk5PVU5DRV9SRVNVTUUgIDB4MDEwMAorI2RlZmluZSBUWF9SRVNFVF9NVUxUSV9JRFggIDB4MDIwMAorI2RlZmluZSBSWF9SVFJfRlJBTUUgICAgICAgIDB4MDQwMAorCisjZW5kaWYgLyogQ0FOX0JDTV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nhbi9lcnJvci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4vZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2U4NTVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4vZXJyb3IuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogbGludXgvY2FuL2Vycm9yLmgKKyAqCisgKiBEZWZpbml0aW9ucyBvZiB0aGUgQ0FOIGVycm9yIGZyYW1lIHRvIGJlIGZpbHRlcmVkIGFuZCBwYXNzZWQgdG8gdGhlIHVzZXIuCisgKgorICogQXV0aG9yOiBPbGl2ZXIgSGFydGtvcHAgPG9saXZlci5oYXJ0a29wcEB2b2xrc3dhZ2VuLmRlPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDcgVm9sa3N3YWdlbiBHcm91cCBFbGVjdHJvbmljIFJlc2VhcmNoCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqLworCisjaWZuZGVmIENBTl9FUlJPUl9ICisjZGVmaW5lIENBTl9FUlJPUl9ICisKKyNkZWZpbmUgQ0FOX0VSUl9ETEMgOCAvKiBkbGMgZm9yIGVycm9yIGZyYW1lcyAqLworCisvKiBlcnJvciBjbGFzcyAobWFzaykgaW4gY2FuX2lkICovCisjZGVmaW5lIENBTl9FUlJfVFhfVElNRU9VVCAgIDB4MDAwMDAwMDFVIC8qIFRYIHRpbWVvdXQgKGJ5IG5ldGRldmljZSBkcml2ZXIpICovCisjZGVmaW5lIENBTl9FUlJfTE9TVEFSQiAgICAgIDB4MDAwMDAwMDJVIC8qIGxvc3QgYXJiaXRyYXRpb24gICAgLyBkYXRhWzBdICAgICovCisjZGVmaW5lIENBTl9FUlJfQ1JUTCAgICAgICAgIDB4MDAwMDAwMDRVIC8qIGNvbnRyb2xsZXIgcHJvYmxlbXMgLyBkYXRhWzFdICAgICovCisjZGVmaW5lIENBTl9FUlJfUFJPVCAgICAgICAgIDB4MDAwMDAwMDhVIC8qIHByb3RvY29sIHZpb2xhdGlvbnMgLyBkYXRhWzIuLjNdICovCisjZGVmaW5lIENBTl9FUlJfVFJYICAgICAgICAgIDB4MDAwMDAwMTBVIC8qIHRyYW5zY2VpdmVyIHN0YXR1cyAgLyBkYXRhWzRdICAgICovCisjZGVmaW5lIENBTl9FUlJfQUNLICAgICAgICAgIDB4MDAwMDAwMjBVIC8qIHJlY2VpdmVkIG5vIEFDSyBvbiB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgQ0FOX0VSUl9CVVNPRkYgICAgICAgMHgwMDAwMDA0MFUgLyogYnVzIG9mZiAqLworI2RlZmluZSBDQU5fRVJSX0JVU0VSUk9SICAgICAweDAwMDAwMDgwVSAvKiBidXMgZXJyb3IgKG1heSBmbG9vZCEpICovCisjZGVmaW5lIENBTl9FUlJfUkVTVEFSVEVEICAgIDB4MDAwMDAxMDBVIC8qIGNvbnRyb2xsZXIgcmVzdGFydGVkICovCisKKy8qIGFyYml0cmF0aW9uIGxvc3QgaW4gYml0IC4uLiAvIGRhdGFbMF0gKi8KKyNkZWZpbmUgQ0FOX0VSUl9MT1NUQVJCX1VOU1BFQyAgIDB4MDAgLyogdW5zcGVjaWZpZWQgKi8KKwkJCQkgICAgICAvKiBlbHNlIGJpdCBudW1iZXIgaW4gYml0c3RyZWFtICovCisKKy8qIGVycm9yIHN0YXR1cyBvZiBDQU4tY29udHJvbGxlciAvIGRhdGFbMV0gKi8KKyNkZWZpbmUgQ0FOX0VSUl9DUlRMX1VOU1BFQyAgICAgIDB4MDAgLyogdW5zcGVjaWZpZWQgKi8KKyNkZWZpbmUgQ0FOX0VSUl9DUlRMX1JYX09WRVJGTE9XIDB4MDEgLyogUlggYnVmZmVyIG92ZXJmbG93ICovCisjZGVmaW5lIENBTl9FUlJfQ1JUTF9UWF9PVkVSRkxPVyAweDAyIC8qIFRYIGJ1ZmZlciBvdmVyZmxvdyAqLworI2RlZmluZSBDQU5fRVJSX0NSVExfUlhfV0FSTklORyAgMHgwNCAvKiByZWFjaGVkIHdhcm5pbmcgbGV2ZWwgZm9yIFJYIGVycm9ycyAqLworI2RlZmluZSBDQU5fRVJSX0NSVExfVFhfV0FSTklORyAgMHgwOCAvKiByZWFjaGVkIHdhcm5pbmcgbGV2ZWwgZm9yIFRYIGVycm9ycyAqLworI2RlZmluZSBDQU5fRVJSX0NSVExfUlhfUEFTU0lWRSAgMHgxMCAvKiByZWFjaGVkIGVycm9yIHBhc3NpdmUgc3RhdHVzIFJYICovCisjZGVmaW5lIENBTl9FUlJfQ1JUTF9UWF9QQVNTSVZFICAweDIwIC8qIHJlYWNoZWQgZXJyb3IgcGFzc2l2ZSBzdGF0dXMgVFggKi8KKwkJCQkgICAgICAvKiAoYXQgbGVhc3Qgb25lIGVycm9yIGNvdW50ZXIgZXhjZWVkcyAqLworCQkJCSAgICAgIC8qIHRoZSBwcm90b2NvbC1kZWZpbmVkIGxldmVsIG9mIDEyNykgICovCisKKy8qIGVycm9yIGluIENBTiBwcm90b2NvbCAodHlwZSkgLyBkYXRhWzJdICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9VTlNQRUMgICAgICAweDAwIC8qIHVuc3BlY2lmaWVkICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9CSVQgICAgICAgICAweDAxIC8qIHNpbmdsZSBiaXQgZXJyb3IgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0ZPUk0gICAgICAgIDB4MDIgLyogZnJhbWUgZm9ybWF0IGVycm9yICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9TVFVGRiAgICAgICAweDA0IC8qIGJpdCBzdHVmZmluZyBlcnJvciAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfQklUMCAgICAgICAgMHgwOCAvKiB1bmFibGUgdG8gc2VuZCBkb21pbmFudCBiaXQgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0JJVDEgICAgICAgIDB4MTAgLyogdW5hYmxlIHRvIHNlbmQgcmVjZXNzaXZlIGJpdCAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfT1ZFUkxPQUQgICAgMHgyMCAvKiBidXMgb3ZlcmxvYWQgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0FDVElWRSAgICAgIDB4NDAgLyogYWN0aXZlIGVycm9yIGFubm91bmNlbWVudCAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfVFggICAgICAgICAgMHg4MCAvKiBlcnJvciBvY2N1cnJlZCBvbiB0cmFuc21pc3Npb24gKi8KKworLyogZXJyb3IgaW4gQ0FOIHByb3RvY29sIChsb2NhdGlvbikgLyBkYXRhWzNdICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfVU5TUEVDICAweDAwIC8qIHVuc3BlY2lmaWVkICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfU09GICAgICAweDAzIC8qIHN0YXJ0IG9mIGZyYW1lICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfSUQyOF8yMSAweDAyIC8qIElEIGJpdHMgMjggLSAyMSAoU0ZGOiAxMCAtIDMpICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfSUQyMF8xOCAweDA2IC8qIElEIGJpdHMgMjAgLSAxOCAoU0ZGOiAyIC0gMCApKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19TUlRSICAgIDB4MDQgLyogc3Vic3RpdHV0ZSBSVFIgKFNGRjogUlRSKSAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfTE9DX0lERSAgICAgMHgwNSAvKiBpZGVudGlmaWVyIGV4dGVuc2lvbiAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfTE9DX0lEMTdfMTMgMHgwNyAvKiBJRCBiaXRzIDE3LTEzICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfSUQxMl8wNSAweDBGIC8qIElEIGJpdHMgMTItNSAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfTE9DX0lEMDRfMDAgMHgwRSAvKiBJRCBiaXRzIDQtMCAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfTE9DX1JUUiAgICAgMHgwQyAvKiBSVFIgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19SRVMxICAgIDB4MEQgLyogcmVzZXJ2ZWQgYml0IDEgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19SRVMwICAgIDB4MDkgLyogcmVzZXJ2ZWQgYml0IDAgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19ETEMgICAgIDB4MEIgLyogZGF0YSBsZW5ndGggY29kZSAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfTE9DX0RBVEEgICAgMHgwQSAvKiBkYXRhIHNlY3Rpb24gKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19DUkNfU0VRIDB4MDggLyogQ1JDIHNlcXVlbmNlICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfQ1JDX0RFTCAweDE4IC8qIENSQyBkZWxpbWl0ZXIgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19BQ0sgICAgIDB4MTkgLyogQUNLIHNsb3QgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19BQ0tfREVMIDB4MUIgLyogQUNLIGRlbGltaXRlciAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfTE9DX0VPRiAgICAgMHgxQSAvKiBlbmQgb2YgZnJhbWUgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19JTlRFUk0gIDB4MTIgLyogaW50ZXJtaXNzaW9uICovCisKKy8qIGVycm9yIHN0YXR1cyBvZiBDQU4tdHJhbnNjZWl2ZXIgLyBkYXRhWzRdICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTkggQ0FOTCAqLworI2RlZmluZSBDQU5fRVJSX1RSWF9VTlNQRUMgICAgICAgICAgICAgMHgwMCAvKiAwMDAwIDAwMDAgKi8KKyNkZWZpbmUgQ0FOX0VSUl9UUlhfQ0FOSF9OT19XSVJFICAgICAgIDB4MDQgLyogMDAwMCAwMTAwICovCisjZGVmaW5lIENBTl9FUlJfVFJYX0NBTkhfU0hPUlRfVE9fQkFUICAweDA1IC8qIDAwMDAgMDEwMSAqLworI2RlZmluZSBDQU5fRVJSX1RSWF9DQU5IX1NIT1JUX1RPX1ZDQyAgMHgwNiAvKiAwMDAwIDAxMTAgKi8KKyNkZWZpbmUgQ0FOX0VSUl9UUlhfQ0FOSF9TSE9SVF9UT19HTkQgIDB4MDcgLyogMDAwMCAwMTExICovCisjZGVmaW5lIENBTl9FUlJfVFJYX0NBTkxfTk9fV0lSRSAgICAgICAweDQwIC8qIDAxMDAgMDAwMCAqLworI2RlZmluZSBDQU5fRVJSX1RSWF9DQU5MX1NIT1JUX1RPX0JBVCAgMHg1MCAvKiAwMTAxIDAwMDAgKi8KKyNkZWZpbmUgQ0FOX0VSUl9UUlhfQ0FOTF9TSE9SVF9UT19WQ0MgIDB4NjAgLyogMDExMCAwMDAwICovCisjZGVmaW5lIENBTl9FUlJfVFJYX0NBTkxfU0hPUlRfVE9fR05EICAweDcwIC8qIDAxMTEgMDAwMCAqLworI2RlZmluZSBDQU5fRVJSX1RSWF9DQU5MX1NIT1JUX1RPX0NBTkggMHg4MCAvKiAxMDAwIDAwMDAgKi8KKworLyogY29udHJvbGxlciBzcGVjaWZpYyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIC8gZGF0YVs1Li43XSAqLworCisjZW5kaWYgLyogQ0FOX0VSUk9SX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FuL2d3LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nhbi9ndy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMWRiMTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nhbi9ndy5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogbGludXgvY2FuL2d3LmgKKyAqCisgKiBEZWZpbml0aW9ucyBmb3IgQ0FOIGZyYW1lIEdhdGV3YXkvUm91dGVyL0JyaWRnZQorICoKKyAqIEF1dGhvcjogT2xpdmVyIEhhcnRrb3BwIDxvbGl2ZXIuaGFydGtvcHBAdm9sa3N3YWdlbi5kZT4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBWb2xrc3dhZ2VuIEdyb3VwIEVsZWN0cm9uaWMgUmVzZWFyY2gKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICovCisKKyNpZm5kZWYgQ0FOX0dXX0gKKyNkZWZpbmUgQ0FOX0dXX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY2FuLmg+CisKK3N0cnVjdCBydGNhbm1zZyB7CisJX191OCAgY2FuX2ZhbWlseTsKKwlfX3U4ICBnd3R5cGU7CisJX191MTYgZmxhZ3M7Cit9OworCisvKiBDQU4gZ2F0ZXdheSB0eXBlcyAqLworZW51bSB7CisJQ0dXX1RZUEVfVU5TUEVDLAorCUNHV19UWVBFX0NBTl9DQU4sCS8qIENBTi0+Q0FOIHJvdXRpbmcgKi8KKwlfX0NHV19UWVBFX01BWAorfTsKKworI2RlZmluZSBDR1dfVFlQRV9NQVggKF9fQ0dXX1RZUEVfTUFYIC0gMSkKKworLyogQ0FOIHJ0bmV0bGluayBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgKi8KK2VudW0geworCUNHV19VTlNQRUMsCisJQ0dXX01PRF9BTkQsCS8qIENBTiBmcmFtZSBtb2RpZmljYXRpb24gYmluYXJ5IEFORCAqLworCUNHV19NT0RfT1IsCS8qIENBTiBmcmFtZSBtb2RpZmljYXRpb24gYmluYXJ5IE9SICovCisJQ0dXX01PRF9YT1IsCS8qIENBTiBmcmFtZSBtb2RpZmljYXRpb24gYmluYXJ5IFhPUiAqLworCUNHV19NT0RfU0VULAkvKiBDQU4gZnJhbWUgbW9kaWZpY2F0aW9uIHNldCBhbHRlcm5hdGUgdmFsdWVzICovCisJQ0dXX0NTX1hPUiwJLyogc2V0IGRhdGFbXSBYT1IgY2hlY2tzdW0gaW50byBkYXRhW2luZGV4XSAqLworCUNHV19DU19DUkM4LAkvKiBzZXQgZGF0YVtdIENSQzggY2hlY2tzdW0gaW50byBkYXRhW2luZGV4XSAqLworCUNHV19IQU5ETEVELAkvKiBudW1iZXIgb2YgaGFuZGxlZCBDQU4gZnJhbWVzICovCisJQ0dXX0RST1BQRUQsCS8qIG51bWJlciBvZiBkcm9wcGVkIENBTiBmcmFtZXMgKi8KKwlDR1dfU1JDX0lGLAkvKiBpZmluZGV4IG9mIHNvdXJjZSBuZXR3b3JrIGludGVyZmFjZSAqLworCUNHV19EU1RfSUYsCS8qIGlmaW5kZXggb2YgZGVzdGluYXRpb24gbmV0d29yayBpbnRlcmZhY2UgKi8KKwlDR1dfRklMVEVSLAkvKiBzcGVjaWZ5IHN0cnVjdCBjYW5fZmlsdGVyIG9uIHNvdXJjZSBDQU4gZGV2aWNlICovCisJX19DR1dfTUFYCit9OworCisjZGVmaW5lIENHV19NQVggKF9fQ0dXX01BWCAtIDEpCisKKyNkZWZpbmUgQ0dXX0ZMQUdTX0NBTl9FQ0hPIDB4MDEKKyNkZWZpbmUgQ0dXX0ZMQUdTX0NBTl9TUkNfVFNUQU1QIDB4MDIKKworI2RlZmluZSBDR1dfTU9EX0ZVTkNTIDQgLyogQU5EIE9SIFhPUiBTRVQgKi8KKworLyogQ0FOIGZyYW1lIGVsZW1lbnRzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IGN1cnIuIDMgQ0FOIGZyYW1lIG1vZGlmaWNhdGlvbnMgKi8KKyNkZWZpbmUgQ0dXX01PRF9JRAkweDAxCisjZGVmaW5lIENHV19NT0RfRExDCTB4MDIKKyNkZWZpbmUgQ0dXX01PRF9EQVRBCTB4MDQKKworI2RlZmluZSBDR1dfRlJBTUVfTU9EUyAzIC8qIElEIERMQyBEQVRBICovCisKKyNkZWZpbmUgTUFYX01PREZVTkNUSU9OUyAoQ0dXX01PRF9GVU5DUyAqIENHV19GUkFNRV9NT0RTKQorCitzdHJ1Y3QgY2d3X2ZyYW1lX21vZCB7CisJc3RydWN0IGNhbl9mcmFtZSBjZjsKKwlfX3U4IG1vZHR5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIENHV19NT0RBVFRSX0xFTiBzaXplb2Yoc3RydWN0IGNnd19mcmFtZV9tb2QpCisKK3N0cnVjdCBjZ3dfY3N1bV94b3IgeworCV9fczggZnJvbV9pZHg7CisJX19zOCB0b19pZHg7CisJX19zOCByZXN1bHRfaWR4OworCV9fdTggaW5pdF94b3JfdmFsOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGNnd19jc3VtX2NyYzggeworCV9fczggZnJvbV9pZHg7CisJX19zOCB0b19pZHg7CisJX19zOCByZXN1bHRfaWR4OworCV9fdTggaW5pdF9jcmNfdmFsOworCV9fdTggZmluYWxfeG9yX3ZhbDsKKwlfX3U4IGNyY3RhYlsyNTZdOworCV9fdTggcHJvZmlsZTsKKwlfX3U4IHByb2ZpbGVfZGF0YVsyMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBsZW5ndGggb2YgY2hlY2tzdW0gb3BlcmF0aW9uIHBhcmFtZXRlcnMuIGlkeCA9IGluZGV4IGluIENBTiBmcmFtZSBkYXRhW10gKi8KKyNkZWZpbmUgQ0dXX0NTX1hPUl9MRU4gIHNpemVvZihzdHJ1Y3QgY2d3X2NzdW1feG9yKQorI2RlZmluZSBDR1dfQ1NfQ1JDOF9MRU4gIHNpemVvZihzdHJ1Y3QgY2d3X2NzdW1fY3JjOCkKKworLyogQ1JDOCBwcm9maWxlcyAoY29tcHV0ZSBDUkMgZm9yIGFkZGl0aW9uYWwgZGF0YSBlbGVtZW50cyAtIHNlZSBiZWxvdykgKi8KK2VudW0geworCUNHV19DUkM4UFJGX1VOU1BFQywKKwlDR1dfQ1JDOFBSRl8xVTgsCS8qIGNvbXB1dGUgb25lIGFkZGl0aW9uYWwgdTggdmFsdWUgKi8KKwlDR1dfQ1JDOFBSRl8xNlU4LAkvKiB1OCB2YWx1ZSB0YWJsZSBpbmRleGVkIGJ5IGRhdGFbMV0gJiAweEYgKi8KKwlDR1dfQ1JDOFBSRl9TRkZJRF9YT1IsCS8qIChjYW5faWQgJiAweEZGKSBeIChjYW5faWQgPj4gOCAmIDB4RkYpICovCisJX19DR1dfQ1JDOFBSRl9NQVgKK307CisKKyNkZWZpbmUgQ0dXX0NSQzhQUkZfTUFYIChfX0NHV19DUkM4UFJGX01BWCAtIDEpCisKKy8qCisgKiBDQU4gcnRuZXRsaW5rIGF0dHJpYnV0ZSBjb250ZW50cyBpbiBkZXRhaWwKKyAqCisgKiBDR1dfWFhYX0lGIChsZW5ndGggNCBieXRlcyk6CisgKiBTZXRzIGFuIGludGVyZmFjZSBpbmRleCBmb3Igc291cmNlL2Rlc3RpbmF0aW9uIG5ldHdvcmsgaW50ZXJmYWNlcy4KKyAqIEZvciB0aGUgQ0FOLT5DQU4gZ3d0eXBlIHRoZSBpbmRpY2VzIG9mIF90d29fIENBTiBpbnRlcmZhY2VzIGFyZSBtYW5kYXRvcnkuCisgKgorICogQ0dXX0ZJTFRFUiAobGVuZ3RoIDggYnl0ZXMpOgorICogU2V0cyBhIENBTiByZWNlaXZlIGZpbHRlciBmb3IgdGhlIGdhdGV3YXkgam9iIHNwZWNpZmllZCBieSB0aGUKKyAqIHN0cnVjdCBjYW5fZmlsdGVyIGRlc2NyaWJlZCBpbiBpbmNsdWRlL2xpbnV4L2Nhbi5oCisgKgorICogQ0dXX01PRF9YWFggKGxlbmd0aCAxNyBieXRlcyk6CisgKiBTcGVjaWZpZXMgYSBtb2RpZmljYXRpb24gdGhhdCdzIGRvbmUgdG8gYSByZWNlaXZlZCBDQU4gZnJhbWUgYmVmb3JlIGl0IGlzCisgKiBzZW5kIG91dCB0byB0aGUgZGVzdGluYXRpb24gaW50ZXJmYWNlLgorICoKKyAqIDxzdHJ1Y3QgY2FuX2ZyYW1lPiBkYXRhIHVzZWQgYXMgb3BlcmF0b3IKKyAqIDx1OD4gYWZmZWN0ZWQgQ0FOIGZyYW1lIGVsZW1lbnRzCisgKgorICogQ0dXX0NTX1hPUiAobGVuZ3RoIDQgYnl0ZXMpOgorICogU2V0IGEgc2ltcGxlIFhPUiBjaGVja3N1bSBzdGFydGluZyB3aXRoIGFuIGluaXRpYWwgdmFsdWUgaW50bworICogZGF0YVtyZXN1bHQtaWR4XSB1c2luZyBkYXRhW3N0YXJ0LWlkeF0gLi4gZGF0YVtlbmQtaWR4XQorICoKKyAqIFRoZSBYT1IgY2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBsaWtlIHRoaXM6CisgKgorICogeG9yID0gaW5pdF94b3JfdmFsCisgKgorICogZm9yIChpID0gZnJvbV9pZHggLi4gdG9faWR4KQorICogICAgICB4b3IgXj0gY2FuX2ZyYW1lLmRhdGFbaV0KKyAqCisgKiBjYW5fZnJhbWUuZGF0YVsgcmVzdWx0X2lkeCBdID0geG9yCisgKgorICogQ0dXX0NTX0NSQzggKGxlbmd0aCAyODIgYnl0ZXMpOgorICogU2V0IGEgQ1JDOCB2YWx1ZSBpbnRvIGRhdGFbcmVzdWx0LWlkeF0gdXNpbmcgYSBnaXZlbiAyNTYgYnl0ZSBDUkM4IHRhYmxlLAorICogYSBnaXZlbiBpbml0aWFsIHZhbHVlIGFuZCBhIGRlZmluZWQgaW5wdXQgZGF0YVtzdGFydC1pZHhdIC4uIGRhdGFbZW5kLWlkeF0uCisgKiBGaW5hbGx5IHRoZSByZXN1bHQgdmFsdWUgaXMgWE9SJ2VkIHdpdGggdGhlIGZpbmFsX3hvcl92YWwuCisgKgorICogVGhlIENSQzggY2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBsaWtlIHRoaXM6CisgKgorICogY3JjID0gaW5pdF9jcmNfdmFsCisgKgorICogZm9yIChpID0gZnJvbV9pZHggLi4gdG9faWR4KQorICogICAgICBjcmMgPSBjcmN0YWJbIGNyYyBeIGNhbl9mcmFtZS5kYXRhW2ldIF0KKyAqCisgKiBjYW5fZnJhbWUuZGF0YVsgcmVzdWx0X2lkeCBdID0gY3JjIF4gZmluYWxfeG9yX3ZhbAorICoKKyAqIFRoZSBjYWxjdWxhdGVkIENSQyBtYXkgY29udGFpbiBhZGRpdGlvbmFsIHNvdXJjZSBkYXRhIGVsZW1lbnRzIHRoYXQgY2FuIGJlCisgKiBkZWZpbmVkIGluIHRoZSBoYW5kbGluZyBvZiAnY2hlY2tzdW0gcHJvZmlsZXMnIGUuZy4gc2hvd24gaW4gQVVUT1NBUiBzcGVjcworICogbGlrZSBodHRwOi8vd3d3LmF1dG9zYXIub3JnL2Rvd25sb2FkL1I0LjAvQVVUT1NBUl9TV1NfRTJFTGlicmFyeS5wZGYKKyAqIEUuZy4gdGhlIHByb2ZpbGVfZGF0YVtdIG1heSBjb250YWluIGFkZGl0aW9uYWwgdTggdmFsdWVzIChjYWxsZWQgREFUQV9JRHMpCisgKiB0aGF0IGFyZSB1c2VkIGRlcGVuZGluZyBvbiBjb3VudGVyIHZhbHVlcyBpbnNpZGUgdGhlIENBTiBmcmFtZSBkYXRhW10uCisgKiBTbyBmYXIgb25seSB0aHJlZSBwcm9maWxlcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgZm9yIGlsbHVzdHJhdGlvbi4KKyAqCisgKiBSZW1hcms6IEluIGdlbmVyYWwgdGhlIGF0dHJpYnV0ZSBkYXRhIGlzIGEgbGluZWFyIGJ1ZmZlci4KKyAqICAgICAgICAgQmV3YXJlIG9mIHNlbmRpbmcgdW5wYWNrZWQgb3IgYWxpZ25lZCBzdHJ1Y3RzIQorICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4vbmV0bGluay5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4vbmV0bGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OTY2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nhbi9uZXRsaW5rLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBsaW51eC9jYW4vbmV0bGluay5oCisgKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBDQU4gbmV0bGluayBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+CisgKgorICovCisKKyNpZm5kZWYgQ0FOX05FVExJTktfSAorI2RlZmluZSBDQU5fTkVUTElOS19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogQ0FOIGJpdC10aW1pbmcgcGFyYW1ldGVycworICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVhZCBjaGFwdGVyICI4IEJJVCBUSU1JTkcKKyAqIFJFUVVJUkVNRU5UUyIgb2YgdGhlICJCb3NjaCBDQU4gU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDIuMCIKKyAqIGF0IGh0dHA6Ly93d3cuc2VtaWNvbmR1Y3RvcnMuYm9zY2guZGUvcGRmL2NhbjJzcGVjLnBkZi4KKyAqLworc3RydWN0IGNhbl9iaXR0aW1pbmcgeworCV9fdTMyIGJpdHJhdGU7CQkvKiBCaXQtcmF0ZSBpbiBiaXRzL3NlY29uZCAqLworCV9fdTMyIHNhbXBsZV9wb2ludDsJLyogU2FtcGxlIHBvaW50IGluIG9uZS10ZW50aCBvZiBhIHBlcmNlbnQgKi8KKwlfX3UzMiB0cTsJCS8qIFRpbWUgcXVhbnRhIChUUSkgaW4gbmFub3NlY29uZHMgKi8KKwlfX3UzMiBwcm9wX3NlZzsJCS8qIFByb3BhZ2F0aW9uIHNlZ21lbnQgaW4gVFFzICovCisJX191MzIgcGhhc2Vfc2VnMTsJLyogUGhhc2UgYnVmZmVyIHNlZ21lbnQgMSBpbiBUUXMgKi8KKwlfX3UzMiBwaGFzZV9zZWcyOwkvKiBQaGFzZSBidWZmZXIgc2VnbWVudCAyIGluIFRRcyAqLworCV9fdTMyIHNqdzsJCS8qIFN5bmNocm9uaXNhdGlvbiBqdW1wIHdpZHRoIGluIFRRcyAqLworCV9fdTMyIGJycDsJCS8qIEJpdC1yYXRlIHByZXNjYWxlciAqLworfTsKKworLyoKKyAqIENBTiBoYXJ3YXJlLWRlcGVuZGVudCBiaXQtdGltaW5nIGNvbnN0YW50CisgKgorICogVXNlZCBmb3IgY2FsY3VsYXRpbmcgYW5kIGNoZWNraW5nIGJpdC10aW1pbmcgcGFyYW1ldGVycworICovCitzdHJ1Y3QgY2FuX2JpdHRpbWluZ19jb25zdCB7CisJY2hhciBuYW1lWzE2XTsJCS8qIE5hbWUgb2YgdGhlIENBTiBjb250cm9sbGVyIGhhcmR3YXJlICovCisJX191MzIgdHNlZzFfbWluOwkvKiBUaW1lIHNlZ2VtZW50IDEgPSBwcm9wX3NlZyArIHBoYXNlX3NlZzEgKi8KKwlfX3UzMiB0c2VnMV9tYXg7CisJX191MzIgdHNlZzJfbWluOwkvKiBUaW1lIHNlZ2VtZW50IDIgPSBwaGFzZV9zZWcyICovCisJX191MzIgdHNlZzJfbWF4OworCV9fdTMyIHNqd19tYXg7CQkvKiBTeW5jaHJvbmlzYXRpb24ganVtcCB3aWR0aCAqLworCV9fdTMyIGJycF9taW47CQkvKiBCaXQtcmF0ZSBwcmVzY2FsZXIgKi8KKwlfX3UzMiBicnBfbWF4OworCV9fdTMyIGJycF9pbmM7Cit9OworCisvKgorICogQ0FOIGNsb2NrIHBhcmFtZXRlcnMKKyAqLworc3RydWN0IGNhbl9jbG9jayB7CisJX191MzIgZnJlcTsJCS8qIENBTiBzeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IGluIEh6ICovCit9OworCisvKgorICogQ0FOIG9wZXJhdGlvbmFsIGFuZCBlcnJvciBzdGF0ZXMKKyAqLworZW51bSBjYW5fc3RhdGUgeworCUNBTl9TVEFURV9FUlJPUl9BQ1RJVkUgPSAwLAkvKiBSWC9UWCBlcnJvciBjb3VudCA8IDk2ICovCisJQ0FOX1NUQVRFX0VSUk9SX1dBUk5JTkcsCS8qIFJYL1RYIGVycm9yIGNvdW50IDwgMTI4ICovCisJQ0FOX1NUQVRFX0VSUk9SX1BBU1NJVkUsCS8qIFJYL1RYIGVycm9yIGNvdW50IDwgMjU2ICovCisJQ0FOX1NUQVRFX0JVU19PRkYsCQkvKiBSWC9UWCBlcnJvciBjb3VudCA+PSAyNTYgKi8KKwlDQU5fU1RBVEVfU1RPUFBFRCwJCS8qIERldmljZSBpcyBzdG9wcGVkICovCisJQ0FOX1NUQVRFX1NMRUVQSU5HLAkJLyogRGV2aWNlIGlzIHNsZWVwaW5nICovCisJQ0FOX1NUQVRFX01BWAorfTsKKworLyoKKyAqIENBTiBidXMgZXJyb3IgY291bnRlcnMKKyAqLworc3RydWN0IGNhbl9iZXJyX2NvdW50ZXIgeworCV9fdTE2IHR4ZXJyOworCV9fdTE2IHJ4ZXJyOworfTsKKworLyoKKyAqIENBTiBjb250cm9sbGVyIG1vZGUKKyAqLworc3RydWN0IGNhbl9jdHJsbW9kZSB7CisJX191MzIgbWFzazsKKwlfX3UzMiBmbGFnczsKK307CisKKyNkZWZpbmUgQ0FOX0NUUkxNT0RFX0xPT1BCQUNLCQkweDAxCS8qIExvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgQ0FOX0NUUkxNT0RFX0xJU1RFTk9OTFkJCTB4MDIgCS8qIExpc3Rlbi1vbmx5IG1vZGUgKi8KKyNkZWZpbmUgQ0FOX0NUUkxNT0RFXzNfU0FNUExFUwkJMHgwNAkvKiBUcmlwbGUgc2FtcGxpbmcgbW9kZSAqLworI2RlZmluZSBDQU5fQ1RSTE1PREVfT05FX1NIT1QJCTB4MDgJLyogT25lLVNob3QgbW9kZSAqLworI2RlZmluZSBDQU5fQ1RSTE1PREVfQkVSUl9SRVBPUlRJTkcJMHgxMAkvKiBCdXMtZXJyb3IgcmVwb3J0aW5nICovCisKKy8qCisgKiBDQU4gZGV2aWNlIHN0YXRpc3RpY3MKKyAqLworc3RydWN0IGNhbl9kZXZpY2Vfc3RhdHMgeworCV9fdTMyIGJ1c19lcnJvcjsJLyogQnVzIGVycm9ycyAqLworCV9fdTMyIGVycm9yX3dhcm5pbmc7CS8qIENoYW5nZXMgdG8gZXJyb3Igd2FybmluZyBzdGF0ZSAqLworCV9fdTMyIGVycm9yX3Bhc3NpdmU7CS8qIENoYW5nZXMgdG8gZXJyb3IgcGFzc2l2ZSBzdGF0ZSAqLworCV9fdTMyIGJ1c19vZmY7CQkvKiBDaGFuZ2VzIHRvIGJ1cyBvZmYgc3RhdGUgKi8KKwlfX3UzMiBhcmJpdHJhdGlvbl9sb3N0OyAvKiBBcmJpdHJhdGlvbiBsb3N0IGVycm9ycyAqLworCV9fdTMyIHJlc3RhcnRzOwkJLyogQ0FOIGNvbnRyb2xsZXIgcmUtc3RhcnRzICovCit9OworCisvKgorICogQ0FOIG5ldGxpbmsgaW50ZXJmYWNlCisgKi8KK2VudW0geworCUlGTEFfQ0FOX1VOU1BFQywKKwlJRkxBX0NBTl9CSVRUSU1JTkcsCisJSUZMQV9DQU5fQklUVElNSU5HX0NPTlNULAorCUlGTEFfQ0FOX0NMT0NLLAorCUlGTEFfQ0FOX1NUQVRFLAorCUlGTEFfQ0FOX0NUUkxNT0RFLAorCUlGTEFfQ0FOX1JFU1RBUlRfTVMsCisJSUZMQV9DQU5fUkVTVEFSVCwKKwlJRkxBX0NBTl9CRVJSX0NPVU5URVIsCisJX19JRkxBX0NBTl9NQVgKK307CisKKyNkZWZpbmUgSUZMQV9DQU5fTUFYCShfX0lGTEFfQ0FOX01BWCAtIDEpCisKKyNlbmRpZiAvKiBDQU5fTkVUTElOS19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nhbi9yYXcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FuL3Jhdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MWYzYTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nhbi9yYXcuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogbGludXgvY2FuL3Jhdy5oCisgKgorICogRGVmaW5pdGlvbnMgZm9yIHJhdyBDQU4gc29ja2V0cworICoKKyAqIEF1dGhvcnM6IE9saXZlciBIYXJ0a29wcCA8b2xpdmVyLmhhcnRrb3BwQHZvbGtzd2FnZW4uZGU+CisgKiAgICAgICAgICBVcnMgVGh1ZXJtYW5uICAgPHVycy50aHVlcm1hbm5Adm9sa3N3YWdlbi5kZT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA3IFZvbGtzd2FnZW4gR3JvdXAgRWxlY3Ryb25pYyBSZXNlYXJjaAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKi8KKworI2lmbmRlZiBDQU5fUkFXX0gKKyNkZWZpbmUgQ0FOX1JBV19ICisKKyNpbmNsdWRlIDxsaW51eC9jYW4uaD4KKworI2RlZmluZSBTT0xfQ0FOX1JBVyAoU09MX0NBTl9CQVNFICsgQ0FOX1JBVykKKworLyogZm9yIHNvY2tldCBvcHRpb25zIGFmZmVjdGluZyB0aGUgc29ja2V0IChub3QgdGhlIGdsb2JhbCBzeXN0ZW0pICovCisKK2VudW0geworCUNBTl9SQVdfRklMVEVSID0gMSwJLyogc2V0IDAgLi4gbiBjYW5fZmlsdGVyKHMpICAgICAgICAgICovCisJQ0FOX1JBV19FUlJfRklMVEVSLAkvKiBzZXQgZmlsdGVyIGZvciBlcnJvciBmcmFtZXMgICAgICAgKi8KKwlDQU5fUkFXX0xPT1BCQUNLLAkvKiBsb2NhbCBsb29wYmFjayAoZGVmYXVsdDpvbikgICAgICAgKi8KKwlDQU5fUkFXX1JFQ1ZfT1dOX01TR1MJLyogcmVjZWl2ZSBteSBvd24gbXNncyAoZGVmYXVsdDpvZmYpICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyZmYzOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCkBAIC0wLDAgKzEsMzUzIEBACisvKgorICogVGhpcyBpcyA8bGludXgvY2FwYWJpbGl0eS5oPgorICoKKyAqIEFuZHJldyBHLiBNb3JnYW4gPG1vcmdhbkBrZXJuZWwub3JnPgorICogQWxleGFuZGVyIEtqZWxkYWFzIDxhc3RvckBndWFyZGlhbi5ubz4KKyAqIHdpdGggaGVscCBmcm9tIEFsZXBoMSwgUm9sYW5kIEJ1cmVzdW5kIGFuZCBBbmRyZXcgTWFpbi4KKyAqCisgKiBTZWUgaGVyZSBmb3IgdGhlIGxpYmNhcCBsaWJyYXJ5ICgiUE9TSVggZHJhZnQiIGNvbXBsaWFuY2UpOgorICoKKyAqIGZ0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC9saWJzL3NlY3VyaXR5L2xpbnV4LXByaXZzL2tlcm5lbC0yLjYvCisgKi8KKworI2lmbmRlZiBfTElOVVhfQ0FQQUJJTElUWV9ICisjZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB0YXNrX3N0cnVjdDsKKworLyogVXNlci1sZXZlbCBkbyBtb3N0IG9mIHRoZSBtYXBwaW5nIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyCisgICBjYXBhYmlsaXRpZXMgYmFzZWQgb24gdGhlIHZlcnNpb24gdGFnIGdpdmVuIGJ5IHRoZSBrZXJuZWwuIFRoZQorICAga2VybmVsIG1pZ2h0IGJlIHNvbWV3aGF0IGJhY2t3YXJkcyBjb21wYXRpYmxlLCBidXQgZG9uJ3QgYmV0IG9uCisgICBpdC4gKi8KKworLyogTm90ZSwgY2FwX3QsIGlzIGRlZmluZWQgYnkgUE9TSVggKGRyYWZ0KSB0byBiZSBhbiAib3BhcXVlIiBwb2ludGVyIHRvCisgICBhIHNldCBvZiB0aHJlZSBjYXBhYmlsaXR5IHNldHMuICBUaGUgdHJhbnNwb3NpdGlvbiBvZiAzKnRoZQorICAgZm9sbG93aW5nIHN0cnVjdHVyZSB0byBzdWNoIGEgY29tcG9zaXRlIGlzIGJldHRlciBoYW5kbGVkIGluIGEgdXNlcgorICAgbGlicmFyeSBzaW5jZSB0aGUgZHJhZnQgc3RhbmRhcmQgcmVxdWlyZXMgdGhlIHVzZSBvZiBtYWxsb2MvZnJlZQorICAgZXRjLi4gKi8KKworI2RlZmluZSBfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9OXzEgIDB4MTk5ODAzMzAKKyNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVTMyU18xICAgICAxCisKKyNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTl8yICAweDIwMDcxMDI2ICAvKiBkZXByZWNhdGVkIC0gdXNlIHYzICovCisjZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1UzMlNfMiAgICAgMgorCisjZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT05fMyAgMHgyMDA4MDUyMgorI2RlZmluZSBfTElOVVhfQ0FQQUJJTElUWV9VMzJTXzMgICAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgX191c2VyX2NhcF9oZWFkZXJfc3RydWN0IHsKKwlfX3UzMiB2ZXJzaW9uOworCWludCBwaWQ7Cit9ICpjYXBfdXNlcl9oZWFkZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX191c2VyX2NhcF9kYXRhX3N0cnVjdCB7CisgICAgICAgIF9fdTMyIGVmZmVjdGl2ZTsKKyAgICAgICAgX191MzIgcGVybWl0dGVkOworICAgICAgICBfX3UzMiBpbmhlcml0YWJsZTsKK30gKmNhcF91c2VyX2RhdGFfdDsKKworCisjZGVmaW5lIFZGU19DQVBfUkVWSVNJT05fTUFTSwkweEZGMDAwMDAwCisjZGVmaW5lIFZGU19DQVBfUkVWSVNJT05fU0hJRlQJMjQKKyNkZWZpbmUgVkZTX0NBUF9GTEFHU19NQVNLCX5WRlNfQ0FQX1JFVklTSU9OX01BU0sKKyNkZWZpbmUgVkZTX0NBUF9GTEFHU19FRkZFQ1RJVkUJMHgwMDAwMDEKKworI2RlZmluZSBWRlNfQ0FQX1JFVklTSU9OXzEJMHgwMTAwMDAwMAorI2RlZmluZSBWRlNfQ0FQX1UzMl8xICAgICAgICAgICAxCisjZGVmaW5lIFhBVFRSX0NBUFNfU1pfMSAgICAgICAgIChzaXplb2YoX19sZTMyKSooMSArIDIqVkZTX0NBUF9VMzJfMSkpCisKKyNkZWZpbmUgVkZTX0NBUF9SRVZJU0lPTl8yCTB4MDIwMDAwMDAKKyNkZWZpbmUgVkZTX0NBUF9VMzJfMiAgICAgICAgICAgMgorI2RlZmluZSBYQVRUUl9DQVBTX1NaXzIgICAgICAgICAoc2l6ZW9mKF9fbGUzMikqKDEgKyAyKlZGU19DQVBfVTMyXzIpKQorCisjZGVmaW5lIFhBVFRSX0NBUFNfU1ogICAgICAgICAgIFhBVFRSX0NBUFNfU1pfMgorI2RlZmluZSBWRlNfQ0FQX1UzMiAgICAgICAgICAgICBWRlNfQ0FQX1UzMl8yCisjZGVmaW5lIFZGU19DQVBfUkVWSVNJT04JVkZTX0NBUF9SRVZJU0lPTl8yCisKK3N0cnVjdCB2ZnNfY2FwX2RhdGEgeworCV9fbGUzMiBtYWdpY19ldGM7ICAgICAgICAgICAgLyogTGl0dGxlIGVuZGlhbiAqLworCXN0cnVjdCB7CisJCV9fbGUzMiBwZXJtaXR0ZWQ7ICAgIC8qIExpdHRsZSBlbmRpYW4gKi8KKwkJX19sZTMyIGluaGVyaXRhYmxlOyAgLyogTGl0dGxlIGVuZGlhbiAqLworCX0gZGF0YVtWRlNfQ0FQX1UzMl07Cit9OworCisKKy8qCisgKiBCYWNrd2FyZGx5IGNvbXBhdGlibGUgZGVmaW5pdGlvbiBmb3Igc291cmNlIGNvZGUgLSB0cmFwcGVkIGluIGEKKyAqIDMyLWJpdCB3b3JsZC4gSWYgeW91IGZpbmQgeW91IG5lZWQgdGhpcywgcGxlYXNlIGNvbnNpZGVyIHVzaW5nCisgKiBsaWJjYXAgdG8gdW50cmFwIHlvdXJzZWxmLi4uCisgKi8KKyNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTiAgX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTl8xCisjZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1UzMlMgICAgIF9MSU5VWF9DQVBBQklMSVRZX1UzMlNfMQorCisKKworLyoqCisgKiogUE9TSVgtZHJhZnQgZGVmaW5lZCBjYXBhYmlsaXRpZXMuCisgKiovCisKKy8qIEluIGEgc3lzdGVtIHdpdGggdGhlIFtfUE9TSVhfQ0hPV05fUkVTVFJJQ1RFRF0gb3B0aW9uIGRlZmluZWQsIHRoaXMKKyAgIG92ZXJyaWRlcyB0aGUgcmVzdHJpY3Rpb24gb2YgY2hhbmdpbmcgZmlsZSBvd25lcnNoaXAgYW5kIGdyb3VwCisgICBvd25lcnNoaXAuICovCisKKyNkZWZpbmUgQ0FQX0NIT1dOICAgICAgICAgICAgMAorCisvKiBPdmVycmlkZSBhbGwgREFDIGFjY2VzcywgaW5jbHVkaW5nIEFDTCBleGVjdXRlIGFjY2VzcyBpZgorICAgW19QT1NJWF9BQ0xdIGlzIGRlZmluZWQuIEV4Y2x1ZGluZyBEQUMgYWNjZXNzIGNvdmVyZWQgYnkKKyAgIENBUF9MSU5VWF9JTU1VVEFCTEUuICovCisKKyNkZWZpbmUgQ0FQX0RBQ19PVkVSUklERSAgICAgMQorCisvKiBPdmVycmlkZXMgYWxsIERBQyByZXN0cmljdGlvbnMgcmVnYXJkaW5nIHJlYWQgYW5kIHNlYXJjaCBvbiBmaWxlcworICAgYW5kIGRpcmVjdG9yaWVzLCBpbmNsdWRpbmcgQUNMIHJlc3RyaWN0aW9ucyBpZiBbX1BPU0lYX0FDTF0gaXMKKyAgIGRlZmluZWQuIEV4Y2x1ZGluZyBEQUMgYWNjZXNzIGNvdmVyZWQgYnkgQ0FQX0xJTlVYX0lNTVVUQUJMRS4gKi8KKworI2RlZmluZSBDQVBfREFDX1JFQURfU0VBUkNIICAyCisKKy8qIE92ZXJyaWRlcyBhbGwgcmVzdHJpY3Rpb25zIGFib3V0IGFsbG93ZWQgb3BlcmF0aW9ucyBvbiBmaWxlcywgd2hlcmUKKyAgIGZpbGUgb3duZXIgSUQgbXVzdCBiZSBlcXVhbCB0byB0aGUgdXNlciBJRCwgZXhjZXB0IHdoZXJlIENBUF9GU0VUSUQKKyAgIGlzIGFwcGxpY2FibGUuIEl0IGRvZXNuJ3Qgb3ZlcnJpZGUgTUFDIGFuZCBEQUMgcmVzdHJpY3Rpb25zLiAqLworCisjZGVmaW5lIENBUF9GT1dORVIgICAgICAgICAgIDMKKworLyogT3ZlcnJpZGVzIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zIHRoYXQgdGhlIGVmZmVjdGl2ZSB1c2VyIElECisgICBzaGFsbCBtYXRjaCB0aGUgZmlsZSBvd25lciBJRCB3aGVuIHNldHRpbmcgdGhlIFNfSVNVSUQgYW5kIFNfSVNHSUQKKyAgIGJpdHMgb24gdGhhdCBmaWxlOyB0aGF0IHRoZSBlZmZlY3RpdmUgZ3JvdXAgSUQgKG9yIG9uZSBvZiB0aGUKKyAgIHN1cHBsZW1lbnRhcnkgZ3JvdXAgSURzKSBzaGFsbCBtYXRjaCB0aGUgZmlsZSBvd25lciBJRCB3aGVuIHNldHRpbmcKKyAgIHRoZSBTX0lTR0lEIGJpdCBvbiB0aGF0IGZpbGU7IHRoYXQgdGhlIFNfSVNVSUQgYW5kIFNfSVNHSUQgYml0cyBhcmUKKyAgIGNsZWFyZWQgb24gc3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBjaG93bigyKSAobm90IGltcGxlbWVudGVkKS4gKi8KKworI2RlZmluZSBDQVBfRlNFVElEICAgICAgICAgICA0CisKKy8qIE92ZXJyaWRlcyB0aGUgcmVzdHJpY3Rpb24gdGhhdCB0aGUgcmVhbCBvciBlZmZlY3RpdmUgdXNlciBJRCBvZiBhCisgICBwcm9jZXNzIHNlbmRpbmcgYSBzaWduYWwgbXVzdCBtYXRjaCB0aGUgcmVhbCBvciBlZmZlY3RpdmUgdXNlciBJRAorICAgb2YgdGhlIHByb2Nlc3MgcmVjZWl2aW5nIHRoZSBzaWduYWwuICovCisKKyNkZWZpbmUgQ0FQX0tJTEwgICAgICAgICAgICAgNQorCisvKiBBbGxvd3Mgc2V0Z2lkKDIpIG1hbmlwdWxhdGlvbiAqLworLyogQWxsb3dzIHNldGdyb3VwcygyKSAqLworLyogQWxsb3dzIGZvcmdlZCBnaWRzIG9uIHNvY2tldCBjcmVkZW50aWFscyBwYXNzaW5nLiAqLworCisjZGVmaW5lIENBUF9TRVRHSUQgICAgICAgICAgIDYKKworLyogQWxsb3dzIHNldCp1aWQoMikgbWFuaXB1bGF0aW9uIChpbmNsdWRpbmcgZnN1aWQpLiAqLworLyogQWxsb3dzIGZvcmdlZCBwaWRzIG9uIHNvY2tldCBjcmVkZW50aWFscyBwYXNzaW5nLiAqLworCisjZGVmaW5lIENBUF9TRVRVSUQgICAgICAgICAgIDcKKworCisvKioKKyAqKiBMaW51eC1zcGVjaWZpYyBjYXBhYmlsaXRpZXMKKyAqKi8KKworLyogV2l0aG91dCBWRlMgc3VwcG9ydCBmb3IgY2FwYWJpbGl0aWVzOgorICogICBUcmFuc2ZlciBhbnkgY2FwYWJpbGl0eSBpbiB5b3VyIHBlcm1pdHRlZCBzZXQgdG8gYW55IHBpZCwKKyAqICAgcmVtb3ZlIGFueSBjYXBhYmlsaXR5IGluIHlvdXIgcGVybWl0dGVkIHNldCBmcm9tIGFueSBwaWQKKyAqIFdpdGggVkZTIHN1cHBvcnQgZm9yIGNhcGFiaWxpdGllcyAobmVpdGhlciBvZiBhYm92ZSwgYnV0KQorICogICBBZGQgYW55IGNhcGFiaWxpdHkgZnJvbSBjdXJyZW50J3MgY2FwYWJpbGl0eSBib3VuZGluZyBzZXQKKyAqICAgICAgIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MnIGluaGVyaXRhYmxlIHNldAorICogICBBbGxvdyB0YWtpbmcgYml0cyBvdXQgb2YgY2FwYWJpbGl0eSBib3VuZGluZyBzZXQKKyAqICAgQWxsb3cgbW9kaWZpY2F0aW9uIG9mIHRoZSBzZWN1cmViaXRzIGZvciBhIHByb2Nlc3MKKyAqLworCisjZGVmaW5lIENBUF9TRVRQQ0FQICAgICAgICAgIDgKKworLyogQWxsb3cgbW9kaWZpY2F0aW9uIG9mIFNfSU1NVVRBQkxFIGFuZCBTX0FQUEVORCBmaWxlIGF0dHJpYnV0ZXMgKi8KKworI2RlZmluZSBDQVBfTElOVVhfSU1NVVRBQkxFICA5CisKKy8qIEFsbG93cyBiaW5kaW5nIHRvIFRDUC9VRFAgc29ja2V0cyBiZWxvdyAxMDI0ICovCisvKiBBbGxvd3MgYmluZGluZyB0byBBVE0gVkNJcyBiZWxvdyAzMiAqLworCisjZGVmaW5lIENBUF9ORVRfQklORF9TRVJWSUNFIDEwCisKKy8qIEFsbG93IGJyb2FkY2FzdGluZywgbGlzdGVuIHRvIG11bHRpY2FzdCAqLworCisjZGVmaW5lIENBUF9ORVRfQlJPQURDQVNUICAgIDExCisKKy8qIEFsbG93IGludGVyZmFjZSBjb25maWd1cmF0aW9uICovCisvKiBBbGxvdyBhZG1pbmlzdHJhdGlvbiBvZiBJUCBmaXJld2FsbCwgbWFzcXVlcmFkaW5nIGFuZCBhY2NvdW50aW5nICovCisvKiBBbGxvdyBzZXR0aW5nIGRlYnVnIG9wdGlvbiBvbiBzb2NrZXRzICovCisvKiBBbGxvdyBtb2RpZmljYXRpb24gb2Ygcm91dGluZyB0YWJsZXMgKi8KKy8qIEFsbG93IHNldHRpbmcgYXJiaXRyYXJ5IHByb2Nlc3MgLyBwcm9jZXNzIGdyb3VwIG93bmVyc2hpcCBvbgorICAgc29ja2V0cyAqLworLyogQWxsb3cgYmluZGluZyB0byBhbnkgYWRkcmVzcyBmb3IgdHJhbnNwYXJlbnQgcHJveHlpbmcgKGFsc28gdmlhIE5FVF9SQVcpICovCisvKiBBbGxvdyBzZXR0aW5nIFRPUyAodHlwZSBvZiBzZXJ2aWNlKSAqLworLyogQWxsb3cgc2V0dGluZyBwcm9taXNjdW91cyBtb2RlICovCisvKiBBbGxvdyBjbGVhcmluZyBkcml2ZXIgc3RhdGlzdGljcyAqLworLyogQWxsb3cgbXVsdGljYXN0aW5nICovCisvKiBBbGxvdyByZWFkL3dyaXRlIG9mIGRldmljZS1zcGVjaWZpYyByZWdpc3RlcnMgKi8KKy8qIEFsbG93IGFjdGl2YXRpb24gb2YgQVRNIGNvbnRyb2wgc29ja2V0cyAqLworCisjZGVmaW5lIENBUF9ORVRfQURNSU4gICAgICAgIDEyCisKKy8qIEFsbG93IHVzZSBvZiBSQVcgc29ja2V0cyAqLworLyogQWxsb3cgdXNlIG9mIFBBQ0tFVCBzb2NrZXRzICovCisvKiBBbGxvdyBiaW5kaW5nIHRvIGFueSBhZGRyZXNzIGZvciB0cmFuc3BhcmVudCBwcm94eWluZyAoYWxzbyB2aWEgTkVUX0FETUlOKSAqLworCisjZGVmaW5lIENBUF9ORVRfUkFXICAgICAgICAgIDEzCisKKy8qIEFsbG93IGxvY2tpbmcgb2Ygc2hhcmVkIG1lbW9yeSBzZWdtZW50cyAqLworLyogQWxsb3cgbWxvY2sgYW5kIG1sb2NrYWxsICh3aGljaCBkb2Vzbid0IHJlYWxseSBoYXZlIGFueXRoaW5nIHRvIGRvCisgICB3aXRoIElQQykgKi8KKworI2RlZmluZSBDQVBfSVBDX0xPQ0sgICAgICAgICAxNAorCisvKiBPdmVycmlkZSBJUEMgb3duZXJzaGlwIGNoZWNrcyAqLworCisjZGVmaW5lIENBUF9JUENfT1dORVIgICAgICAgIDE1CisKKy8qIEluc2VydCBhbmQgcmVtb3ZlIGtlcm5lbCBtb2R1bGVzIC0gbW9kaWZ5IGtlcm5lbCB3aXRob3V0IGxpbWl0ICovCisjZGVmaW5lIENBUF9TWVNfTU9EVUxFICAgICAgIDE2CisKKy8qIEFsbG93IGlvcGVybS9pb3BsIGFjY2VzcyAqLworLyogQWxsb3cgc2VuZGluZyBVU0IgbWVzc2FnZXMgdG8gYW55IGRldmljZSB2aWEgL3Byb2MvYnVzL3VzYiAqLworCisjZGVmaW5lIENBUF9TWVNfUkFXSU8gICAgICAgIDE3CisKKy8qIEFsbG93IHVzZSBvZiBjaHJvb3QoKSAqLworCisjZGVmaW5lIENBUF9TWVNfQ0hST09UICAgICAgIDE4CisKKy8qIEFsbG93IHB0cmFjZSgpIG9mIGFueSBwcm9jZXNzICovCisKKyNkZWZpbmUgQ0FQX1NZU19QVFJBQ0UgICAgICAgMTkKKworLyogQWxsb3cgY29uZmlndXJhdGlvbiBvZiBwcm9jZXNzIGFjY291bnRpbmcgKi8KKworI2RlZmluZSBDQVBfU1lTX1BBQ0NUICAgICAgICAyMAorCisvKiBBbGxvdyBjb25maWd1cmF0aW9uIG9mIHRoZSBzZWN1cmUgYXR0ZW50aW9uIGtleSAqLworLyogQWxsb3cgYWRtaW5pc3RyYXRpb24gb2YgdGhlIHJhbmRvbSBkZXZpY2UgKi8KKy8qIEFsbG93IGV4YW1pbmF0aW9uIGFuZCBjb25maWd1cmF0aW9uIG9mIGRpc2sgcXVvdGFzICovCisvKiBBbGxvdyBzZXR0aW5nIHRoZSBkb21haW5uYW1lICovCisvKiBBbGxvdyBzZXR0aW5nIHRoZSBob3N0bmFtZSAqLworLyogQWxsb3cgY2FsbGluZyBiZGZsdXNoKCkgKi8KKy8qIEFsbG93IG1vdW50KCkgYW5kIHVtb3VudCgpLCBzZXR0aW5nIHVwIG5ldyBzbWIgY29ubmVjdGlvbiAqLworLyogQWxsb3cgc29tZSBhdXRvZnMgcm9vdCBpb2N0bHMgKi8KKy8qIEFsbG93IG5mc3NlcnZjdGwgKi8KKy8qIEFsbG93IFZNODZfUkVRVUVTVF9JUlEgKi8KKy8qIEFsbG93IHRvIHJlYWQvd3JpdGUgcGNpIGNvbmZpZyBvbiBhbHBoYSAqLworLyogQWxsb3cgaXJpeF9wcmN0bCBvbiBtaXBzIChzZXRzdGFja3NpemUpICovCisvKiBBbGxvdyBmbHVzaGluZyBhbGwgY2FjaGUgb24gbTY4ayAoc3lzX2NhY2hlZmx1c2gpICovCisvKiBBbGxvdyByZW1vdmluZyBzZW1hcGhvcmVzICovCisvKiBVc2VkIGluc3RlYWQgb2YgQ0FQX0NIT1dOIHRvICJjaG93biIgSVBDIG1lc3NhZ2UgcXVldWVzLCBzZW1hcGhvcmVzCisgICBhbmQgc2hhcmVkIG1lbW9yeSAqLworLyogQWxsb3cgbG9ja2luZy91bmxvY2tpbmcgb2Ygc2hhcmVkIG1lbW9yeSBzZWdtZW50ICovCisvKiBBbGxvdyB0dXJuaW5nIHN3YXAgb24vb2ZmICovCisvKiBBbGxvdyBmb3JnZWQgcGlkcyBvbiBzb2NrZXQgY3JlZGVudGlhbHMgcGFzc2luZyAqLworLyogQWxsb3cgc2V0dGluZyByZWFkYWhlYWQgYW5kIGZsdXNoaW5nIGJ1ZmZlcnMgb24gYmxvY2sgZGV2aWNlcyAqLworLyogQWxsb3cgc2V0dGluZyBnZW9tZXRyeSBpbiBmbG9wcHkgZHJpdmVyICovCisvKiBBbGxvdyB0dXJuaW5nIERNQSBvbi9vZmYgaW4geGQgZHJpdmVyICovCisvKiBBbGxvdyBhZG1pbmlzdHJhdGlvbiBvZiBtZCBkZXZpY2VzIChtb3N0bHkgdGhlIGFib3ZlLCBidXQgc29tZQorICAgZXh0cmEgaW9jdGxzKSAqLworLyogQWxsb3cgdHVuaW5nIHRoZSBpZGUgZHJpdmVyICovCisvKiBBbGxvdyBhY2Nlc3MgdG8gdGhlIG52cmFtIGRldmljZSAqLworLyogQWxsb3cgYWRtaW5pc3RyYXRpb24gb2YgYXBtX2Jpb3MsIHNlcmlhbCBhbmQgYnR0diAoVFYpIGRldmljZSAqLworLyogQWxsb3cgbWFudWZhY3R1cmVyIGNvbW1hbmRzIGluIGlzZG4gQ0FQSSBzdXBwb3J0IGRyaXZlciAqLworLyogQWxsb3cgcmVhZGluZyBub24tc3RhbmRhcmRpemVkIHBvcnRpb25zIG9mIHBjaSBjb25maWd1cmF0aW9uIHNwYWNlICovCisvKiBBbGxvdyBEREkgZGVidWcgaW9jdGwgb24gc2JwY2QgZHJpdmVyICovCisvKiBBbGxvdyBzZXR0aW5nIHVwIHNlcmlhbCBwb3J0cyAqLworLyogQWxsb3cgc2VuZGluZyByYXcgcWljLTExNyBjb21tYW5kcyAqLworLyogQWxsb3cgZW5hYmxpbmcvZGlzYWJsaW5nIHRhZ2dlZCBxdWV1aW5nIG9uIFNDU0kgY29udHJvbGxlcnMgYW5kIHNlbmRpbmcKKyAgIGFyYml0cmFyeSBTQ1NJIGNvbW1hbmRzICovCisvKiBBbGxvdyBzZXR0aW5nIGVuY3J5cHRpb24ga2V5IG9uIGxvb3BiYWNrIGZpbGVzeXN0ZW0gKi8KKy8qIEFsbG93IHNldHRpbmcgem9uZSByZWNsYWltIHBvbGljeSAqLworCisjZGVmaW5lIENBUF9TWVNfQURNSU4gICAgICAgIDIxCisKKy8qIEFsbG93IHVzZSBvZiByZWJvb3QoKSAqLworCisjZGVmaW5lIENBUF9TWVNfQk9PVCAgICAgICAgIDIyCisKKy8qIEFsbG93IHJhaXNpbmcgcHJpb3JpdHkgYW5kIHNldHRpbmcgcHJpb3JpdHkgb24gb3RoZXIgKGRpZmZlcmVudAorICAgVUlEKSBwcm9jZXNzZXMgKi8KKy8qIEFsbG93IHVzZSBvZiBGSUZPIGFuZCByb3VuZC1yb2JpbiAocmVhbHRpbWUpIHNjaGVkdWxpbmcgb24gb3duCisgICBwcm9jZXNzZXMgYW5kIHNldHRpbmcgdGhlIHNjaGVkdWxpbmcgYWxnb3JpdGhtIHVzZWQgYnkgYW5vdGhlcgorICAgcHJvY2Vzcy4gKi8KKy8qIEFsbG93IHNldHRpbmcgY3B1IGFmZmluaXR5IG9uIG90aGVyIHByb2Nlc3NlcyAqLworCisjZGVmaW5lIENBUF9TWVNfTklDRSAgICAgICAgIDIzCisKKy8qIE92ZXJyaWRlIHJlc291cmNlIGxpbWl0cy4gU2V0IHJlc291cmNlIGxpbWl0cy4gKi8KKy8qIE92ZXJyaWRlIHF1b3RhIGxpbWl0cy4gKi8KKy8qIE92ZXJyaWRlIHJlc2VydmVkIHNwYWNlIG9uIGV4dDIgZmlsZXN5c3RlbSAqLworLyogTW9kaWZ5IGRhdGEgam91cm5hbGluZyBtb2RlIG9uIGV4dDMgZmlsZXN5c3RlbSAodXNlcyBqb3VybmFsaW5nCisgICByZXNvdXJjZXMpICovCisvKiBOT1RFOiBleHQyIGhvbm9ycyBmc3VpZCB3aGVuIGNoZWNraW5nIGZvciByZXNvdXJjZSBvdmVycmlkZXMsIHNvCisgICB5b3UgY2FuIG92ZXJyaWRlIHVzaW5nIGZzdWlkIHRvbyAqLworLyogT3ZlcnJpZGUgc2l6ZSByZXN0cmljdGlvbnMgb24gSVBDIG1lc3NhZ2UgcXVldWVzICovCisvKiBBbGxvdyBtb3JlIHRoYW4gNjRoeiBpbnRlcnJ1cHRzIGZyb20gdGhlIHJlYWwtdGltZSBjbG9jayAqLworLyogT3ZlcnJpZGUgbWF4IG51bWJlciBvZiBjb25zb2xlcyBvbiBjb25zb2xlIGFsbG9jYXRpb24gKi8KKy8qIE92ZXJyaWRlIG1heCBudW1iZXIgb2Yga2V5bWFwcyAqLworCisjZGVmaW5lIENBUF9TWVNfUkVTT1VSQ0UgICAgIDI0CisKKy8qIEFsbG93IG1hbmlwdWxhdGlvbiBvZiBzeXN0ZW0gY2xvY2sgKi8KKy8qIEFsbG93IGlyaXhfc3RpbWUgb24gbWlwcyAqLworLyogQWxsb3cgc2V0dGluZyB0aGUgcmVhbC10aW1lIGNsb2NrICovCisKKyNkZWZpbmUgQ0FQX1NZU19USU1FICAgICAgICAgMjUKKworLyogQWxsb3cgY29uZmlndXJhdGlvbiBvZiB0dHkgZGV2aWNlcyAqLworLyogQWxsb3cgdmhhbmd1cCgpIG9mIHR0eSAqLworCisjZGVmaW5lIENBUF9TWVNfVFRZX0NPTkZJRyAgIDI2CisKKy8qIEFsbG93IHRoZSBwcml2aWxlZ2VkIGFzcGVjdHMgb2YgbWtub2QoKSAqLworCisjZGVmaW5lIENBUF9NS05PRCAgICAgICAgICAgIDI3CisKKy8qIEFsbG93IHRha2luZyBvZiBsZWFzZXMgb24gZmlsZXMgKi8KKworI2RlZmluZSBDQVBfTEVBU0UgICAgICAgICAgICAyOAorCisjZGVmaW5lIENBUF9BVURJVF9XUklURSAgICAgIDI5CisKKyNkZWZpbmUgQ0FQX0FVRElUX0NPTlRST0wgICAgMzAKKworI2RlZmluZSBDQVBfU0VURkNBUAkgICAgIDMxCisKKy8qIE92ZXJyaWRlIE1BQyBhY2Nlc3MuCisgICBUaGUgYmFzZSBrZXJuZWwgZW5mb3JjZXMgbm8gTUFDIHBvbGljeS4KKyAgIEFuIExTTSBtYXkgZW5mb3JjZSBhIE1BQyBwb2xpY3ksIGFuZCBpZiBpdCBkb2VzIGFuZCBpdCBjaG9vc2VzCisgICB0byBpbXBsZW1lbnQgY2FwYWJpbGl0eSBiYXNlZCBvdmVycmlkZXMgb2YgdGhhdCBwb2xpY3ksIHRoaXMgaXMKKyAgIHRoZSBjYXBhYmlsaXR5IGl0IHNob3VsZCB1c2UgdG8gZG8gc28uICovCisKKyNkZWZpbmUgQ0FQX01BQ19PVkVSUklERSAgICAgMzIKKworLyogQWxsb3cgTUFDIGNvbmZpZ3VyYXRpb24gb3Igc3RhdGUgY2hhbmdlcy4KKyAgIFRoZSBiYXNlIGtlcm5lbCByZXF1aXJlcyBubyBNQUMgY29uZmlndXJhdGlvbi4KKyAgIEFuIExTTSBtYXkgZW5mb3JjZSBhIE1BQyBwb2xpY3ksIGFuZCBpZiBpdCBkb2VzIGFuZCBpdCBjaG9vc2VzCisgICB0byBpbXBsZW1lbnQgY2FwYWJpbGl0eSBiYXNlZCBjaGVja3Mgb24gbW9kaWZpY2F0aW9ucyB0byB0aGF0CisgICBwb2xpY3kgb3IgdGhlIGRhdGEgcmVxdWlyZWQgdG8gbWFpbnRhaW4gaXQsIHRoaXMgaXMgdGhlCisgICBjYXBhYmlsaXR5IGl0IHNob3VsZCB1c2UgdG8gZG8gc28uICovCisKKyNkZWZpbmUgQ0FQX01BQ19BRE1JTiAgICAgICAgMzMKKworLyogQWxsb3cgY29uZmlndXJpbmcgdGhlIGtlcm5lbCdzIHN5c2xvZyAocHJpbnRrIGJlaGF2aW91cikgKi8KKworI2RlZmluZSBDQVBfU1lTTE9HICAgICAgICAgICAzNAorCisvKiBBbGxvdyB0cmlnZ2VyaW5nIHNvbWV0aGluZyB0aGF0IHdpbGwgd2FrZSB0aGUgc3lzdGVtICovCisKKyNkZWZpbmUgQ0FQX1dBS0VfQUxBUk0gICAgICAgICAgICAzNQorCisKKyNkZWZpbmUgQ0FQX0xBU1RfQ0FQICAgICAgICAgQ0FQX1dBS0VfQUxBUk0KKworI2RlZmluZSBjYXBfdmFsaWQoeCkgKCh4KSA+PSAwICYmICh4KSA8PSBDQVBfTEFTVF9DQVApCisKKy8qCisgKiBCaXQgbG9jYXRpb24gb2YgZWFjaCBjYXBhYmlsaXR5ICh1c2VkIGJ5IHVzZXItc3BhY2UgbGlicmFyeSBhbmQga2VybmVsKQorICovCisKKyNkZWZpbmUgQ0FQX1RPX0lOREVYKHgpICAgICAoKHgpID4+IDUpICAgICAgICAvKiAxIDw8IDUgPT0gYml0cyBpbiBfX3UzMiAqLworI2RlZmluZSBDQVBfVE9fTUFTSyh4KSAgICAgICgxIDw8ICgoeCkgJiAzMSkpIC8qIG1hc2sgZm9yIGluZGV4ZWQgX191MzIgKi8KKworCisjZW5kaWYgLyogIV9MSU5VWF9DQVBBQklMSVRZX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FwaS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwMGFmNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FwaS5oCkBAIC0wLDAgKzEsMTMxIEBACisvKiAkSWQ6IGNhcGkuaCx2IDEuNC42LjEgMjAwMS8wOS8yMyAyMjoyNTowNSBrYWkgRXhwICQKKyAqIAorICogQ0FQSSAyLjAgSW50ZXJmYWNlIGZvciBMaW51eAorICogCisgKiBDb3B5cmlnaHQgMTk5NyBieSBDYXJzdGVuIFBhZXRoIChjYWxsZUBjYWxsZS5pbi1iZXJsaW4uZGUpCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9DQVBJX0hfXworI2RlZmluZSBfX0xJTlVYX0NBUElfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsY2FwaS5oPgorCisvKgorICogQ0FQSV9SRUdJU1RFUgorICovCisKK3R5cGVkZWYgc3RydWN0IGNhcGlfcmVnaXN0ZXJfcGFyYW1zIHsJLyogQ0FQSV9SRUdJU1RFUiAqLworCV9fdTMyIGxldmVsM2NudDsJLyogTm8uIG9mIHNpbXVsYXRuZW91cyB1c2VyIGRhdGEgY29ubmVjdGlvbnMgKi8KKwlfX3UzMiBkYXRhYmxrY250OwkvKiBOby4gb2YgYnVmZmVyZWQgZGF0YSBtZXNzYWdlcyAqLworCV9fdTMyIGRhdGFibGtsZW47CS8qIFNpemUgb2YgYnVmZmVyZWQgZGF0YSBtZXNzYWdlcyAqLworfSBjYXBpX3JlZ2lzdGVyX3BhcmFtczsKKworI2RlZmluZQlDQVBJX1JFR0lTVEVSCV9JT1coJ0MnLDB4MDEsc3RydWN0IGNhcGlfcmVnaXN0ZXJfcGFyYW1zKQorCisvKgorICogQ0FQSV9HRVRfTUFOVUZBQ1RVUkVSCisgKi8KKworI2RlZmluZSBDQVBJX01BTlVGQUNUVVJFUl9MRU4JCTY0CisKKyNkZWZpbmUJQ0FQSV9HRVRfTUFOVUZBQ1RVUkVSCV9JT1dSKCdDJywweDA2LGludCkJLyogYnJva2VuOiB3YW50ZWQgc2l6ZSA2NCAoQ0FQSV9NQU5VRkFDVFVSRVJfTEVOKSAqLworCisvKgorICogQ0FQSV9HRVRfVkVSU0lPTgorICovCisKK3R5cGVkZWYgc3RydWN0IGNhcGlfdmVyc2lvbiB7CisJX191MzIgbWFqb3J2ZXJzaW9uOworCV9fdTMyIG1pbm9ydmVyc2lvbjsKKwlfX3UzMiBtYWpvcm1hbnV2ZXJzaW9uOworCV9fdTMyIG1pbm9ybWFudXZlcnNpb247Cit9IGNhcGlfdmVyc2lvbjsKKworI2RlZmluZSBDQVBJX0dFVF9WRVJTSU9OCV9JT1dSKCdDJywweDA3LHN0cnVjdCBjYXBpX3ZlcnNpb24pCisKKy8qCisgKiBDQVBJX0dFVF9TRVJJQUwKKyAqLworCisjZGVmaW5lIENBUElfU0VSSUFMX0xFTgkJOAorI2RlZmluZSBDQVBJX0dFVF9TRVJJQUwJCV9JT1dSKCdDJywweDA4LGludCkJLyogYnJva2VuOiB3YW50ZWQgc2l6ZSA4IChDQVBJX1NFUklBTF9MRU4pICovCisKKy8qCisgKiBDQVBJX0dFVF9QUk9GSUxFCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY2FwaV9wcm9maWxlIHsKKwlfX3UxNiBuY29udHJvbGxlcjsJLyogbnVtYmVyIG9mIGluc3RhbGxlZCBjb250cm9sbGVyICovCisJX191MTYgbmJjaGFubmVsOwkvKiBudW1iZXIgb2YgQi1DaGFubmVscyAqLworCV9fdTMyIGdvcHRpb25zOwkJLyogZ2xvYmFsIG9wdGlvbnMgKi8KKwlfX3UzMiBzdXBwb3J0MTsJCS8qIEIxIHByb3RvY29scyBzdXBwb3J0ICovCisJX191MzIgc3VwcG9ydDI7CQkvKiBCMiBwcm90b2NvbHMgc3VwcG9ydCAqLworCV9fdTMyIHN1cHBvcnQzOwkJLyogQjMgcHJvdG9jb2xzIHN1cHBvcnQgKi8KKwlfX3UzMiByZXNlcnZlZFs2XTsJLyogcmVzZXJ2ZWQgKi8KKwlfX3UzMiBtYW51WzVdOwkJLyogbWFudWZhY3R1cmVyIHNwZWNpZmljIGluZm9ybWF0aW9uICovCit9IGNhcGlfcHJvZmlsZTsKKworI2RlZmluZSBDQVBJX0dFVF9QUk9GSUxFCV9JT1dSKCdDJywweDA5LHN0cnVjdCBjYXBpX3Byb2ZpbGUpCisKK3R5cGVkZWYgc3RydWN0IGNhcGlfbWFudWZhY3R1cmVyX2NtZCB7CisJdW5zaWduZWQgbG9uZyBjbWQ7CisJdm9pZCAqZGF0YTsKK30gY2FwaV9tYW51ZmFjdHVyZXJfY21kOworCisvKgorICogQ0FQSV9NQU5VRkFDVFVSRVJfQ01ECisgKi8KKworI2RlZmluZSBDQVBJX01BTlVGQUNUVVJFUl9DTUQJX0lPV1IoJ0MnLDB4MjAsIHN0cnVjdCBjYXBpX21hbnVmYWN0dXJlcl9jbWQpCisKKy8qCisgKiBDQVBJX0dFVF9FUlJDT0RFCisgKiBjYXBpIGVycmNvZGUgaXMgc2V0LCAqIGlmIHJlYWQsIHdyaXRlLCBvciBpb2N0bCByZXR1cm5zIEVJTywKKyAqIGlvY3RsIHJldHVybnMgZXJyY29kZSBkaXJlY3RseSwgYW5kIGluIGFyZywgaWYgIT0gMAorICovCisKKyNkZWZpbmUgQ0FQSV9HRVRfRVJSQ09ERQlfSU9SKCdDJywweDIxLCBfX3UxNikKKworLyoKKyAqIENBUElfSU5TVEFMTEVECisgKi8KKyNkZWZpbmUgQ0FQSV9JTlNUQUxMRUQJCV9JT1IoJ0MnLDB4MjIsIF9fdTE2KQorCisKKy8qCisgKiBtZW1iZXIgY29udHIgaXMgaW5wdXQgZm9yCisgKiBDQVBJX0dFVF9NQU5VRkFDVFVSRVIsIENBUElfVkVSU0lPTiwgQ0FQSV9HRVRfU0VSSUFMCisgKiBhbmQgQ0FQSV9HRVRfUFJPRklMRQorICovCit0eXBlZGVmIHVuaW9uIGNhcGlfaW9jdGxfc3RydWN0IHsKKwlfX3UzMiBjb250cjsKKwljYXBpX3JlZ2lzdGVyX3BhcmFtcyBycGFyYW1zOworCV9fdTggbWFudWZhY3R1cmVyW0NBUElfTUFOVUZBQ1RVUkVSX0xFTl07CisJY2FwaV92ZXJzaW9uIHZlcnNpb247CisJX191OCBzZXJpYWxbQ0FQSV9TRVJJQUxfTEVOXTsKKwljYXBpX3Byb2ZpbGUgcHJvZmlsZTsKKwljYXBpX21hbnVmYWN0dXJlcl9jbWQgY21kOworCV9fdTE2IGVycmNvZGU7Cit9IGNhcGlfaW9jdGxfc3RydWN0OworCisvKgorICogTWlkZGxld2FyZSBleHRlbnNpb24KKyAqLworCisjZGVmaW5lIENBUElGTEFHX0hJR0hKQUNLSU5HCTB4MDAwMQorCisjZGVmaW5lIENBUElfR0VUX0ZMQUdTCQlfSU9SKCdDJywweDIzLCB1bnNpZ25lZCkKKyNkZWZpbmUgQ0FQSV9TRVRfRkxBR1MJCV9JT1IoJ0MnLDB4MjQsIHVuc2lnbmVkKQorI2RlZmluZSBDQVBJX0NMUl9GTEFHUwkJX0lPUignQycsMHgyNSwgdW5zaWduZWQpCisKKyNkZWZpbmUgQ0FQSV9OQ0NJX09QRU5DT1VOVAlfSU9SKCdDJywweDI2LCB1bnNpZ25lZCkKKworI2RlZmluZSBDQVBJX05DQ0lfR0VUVU5JVAlfSU9SKCdDJywweDI3LCB1bnNpZ25lZCkKKworI2VuZGlmCQkJCS8qIF9fTElOVVhfQ0FQSV9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2Npc3NfZGVmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jY2lzc19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2YjY3MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2Npc3NfZGVmcy5oCkBAIC0wLDAgKzEsMTMwIEBACisjaWZuZGVmIENDSVNTX0RFRlNfSAorI2RlZmluZSBDQ0lTU19ERUZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIGdlbmVyYWwgYm91bmRhcnkgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU0VOU0VJTkZPQllURVMgICAgICAgICAgMzIgLyogbm90ZSB0aGF0IHRoaXMgdmFsdWUgbWF5IHZhcnkKKwkJCQkgICAgICBiZXR3ZWVuIGhvc3QgaW1wbGVtZW50YXRpb25zICovCisKKy8qIENvbW1hbmQgU3RhdHVzIHZhbHVlICovCisjZGVmaW5lIENNRF9TVUNDRVNTICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBDTURfVEFSR0VUX1NUQVRVUyAgICAgICAweDAwMDEKKyNkZWZpbmUgQ01EX0RBVEFfVU5ERVJSVU4gICAgICAgMHgwMDAyCisjZGVmaW5lIENNRF9EQVRBX09WRVJSVU4gICAgICAgIDB4MDAwMworI2RlZmluZSBDTURfSU5WQUxJRCAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQ01EX1BST1RPQ09MX0VSUiAgICAgICAgMHgwMDA1CisjZGVmaW5lIENNRF9IQVJEV0FSRV9FUlIgICAgICAgIDB4MDAwNgorI2RlZmluZSBDTURfQ09OTkVDVElPTl9MT1NUICAgICAweDAwMDcKKyNkZWZpbmUgQ01EX0FCT1JURUQgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIENNRF9BQk9SVF9GQUlMRUQgICAgICAgIDB4MDAwOQorI2RlZmluZSBDTURfVU5TT0xJQ0lURURfQUJPUlQgICAweDAwMEEKKyNkZWZpbmUgQ01EX1RJTUVPVVQgICAgICAgICAgICAgMHgwMDBCCisjZGVmaW5lIENNRF9VTkFCT1JUQUJMRQkJMHgwMDBDCisKKy8qIHRyYW5zZmVyIGRpcmVjdGlvbiAqLworI2RlZmluZSBYRkVSX05PTkUgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFhGRVJfV1JJVEUgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgWEZFUl9SRUFEICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBYRkVSX1JTVkQgICAgICAgICAgICAgICAweDAzCisKKy8qIHRhc2sgYXR0cmlidXRlICovCisjZGVmaW5lIEFUVFJfVU5UQUdHRUQgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQVRUUl9TSU1QTEUgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBBVFRSX0hFQURPRlFVRVVFICAgICAgICAweDA1CisjZGVmaW5lIEFUVFJfT1JERVJFRCAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgQVRUUl9BQ0EgICAgICAgICAgICAgICAgMHgwNworCisvKiBjZGIgdHlwZSAqLworI2RlZmluZSBUWVBFX0NNRAkJCQkweDAwCisjZGVmaW5lIFRZUEVfTVNHCQkJCTB4MDEKKworLyogVHlwZSBkZWZzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBzdHJ1Y3RzICovCisjZGVmaW5lIEJZVEUgX191OAorI2RlZmluZSBXT1JEIF9fdTE2CisjZGVmaW5lIEhXT1JEIF9fdTE2CisjZGVmaW5lIERXT1JEIF9fdTMyCisKKyNkZWZpbmUgQ0lTU19NQVhfTFVOCTEwMjQKKworI2RlZmluZSBMRVZFTDJMVU4gICAxIC8qIGluZGV4IGludG8gVGFyZ2V0KHgpIHN0cnVjdHVyZSwgZHVlIHRvIGJ5dGUgc3dhcHBpbmcgKi8KKyNkZWZpbmUgTEVWRUwzTFVOICAgMAorCisjcHJhZ21hIHBhY2soMSkKKworLyogQ29tbWFuZCBMaXN0IFN0cnVjdHVyZSAqLwordHlwZWRlZiB1bmlvbiBfU0NTSTNBZGRyX3N0cnVjdCB7CisgICBzdHJ1Y3QgeworICAgIEJZVEUgRGV2OworICAgIEJZVEUgQnVzOjY7CisgICAgQllURSBNb2RlOjI7ICAgICAgICAvKiBiMDAgKi8KKyAgfSBQZXJpcERldjsKKyAgIHN0cnVjdCB7CisgICAgQllURSBEZXZMU0I7CisgICAgQllURSBEZXZNU0I6NjsKKyAgICBCWVRFIE1vZGU6MjsgICAgICAgIC8qIGIwMSAqLworICB9IExvZ0RldjsKKyAgIHN0cnVjdCB7CisgICAgQllURSBEZXY6NTsKKyAgICBCWVRFIEJ1czozOworICAgIEJZVEUgVGFyZzo2OworICAgIEJZVEUgTW9kZToyOyAgICAgICAgLyogYjEwICovCisgIH0gTG9nVW5pdDsKK30gU0NTSTNBZGRyX3N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX1BoeXNEZXZBZGRyX3N0cnVjdCB7CisgIERXT1JEICAgICAgICAgICAgIFRhcmdldElkOjI0OworICBEV09SRCAgICAgICAgICAgICBCdXM6NjsKKyAgRFdPUkQgICAgICAgICAgICAgTW9kZToyOworICBTQ1NJM0FkZHJfc3RydWN0ICBUYXJnZXRbMl07IC8qIDIgbGV2ZWwgdGFyZ2V0IGRldmljZSBhZGRyICovCit9IFBoeXNEZXZBZGRyX3N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX0xvZ0RldkFkZHJfc3RydWN0IHsKKyAgRFdPUkQgICAgICAgICAgICBWb2xJZDozMDsKKyAgRFdPUkQgICAgICAgICAgICBNb2RlOjI7CisgIEJZVEUgICAgICAgICAgICAgcmVzZXJ2ZWRbNF07Cit9IExvZ0RldkFkZHJfc3RydWN0OworCit0eXBlZGVmIHVuaW9uIF9MVU5BZGRyX3N0cnVjdCB7CisgIEJZVEUgICAgICAgICAgICAgICBMdW5BZGRyQnl0ZXNbOF07CisgIFNDU0kzQWRkcl9zdHJ1Y3QgICBTQ1NJM0x1bls0XTsKKyAgUGh5c0RldkFkZHJfc3RydWN0IFBoeXNEZXY7CisgIExvZ0RldkFkZHJfc3RydWN0ICBMb2dEZXY7Cit9IExVTkFkZHJfc3RydWN0OworCit0eXBlZGVmIHN0cnVjdCBfUmVxdWVzdEJsb2NrX3N0cnVjdCB7CisgIEJZVEUgICBDREJMZW47CisgIHN0cnVjdCB7CisgICAgQllURSBUeXBlOjM7CisgICAgQllURSBBdHRyaWJ1dGU6MzsKKyAgICBCWVRFIERpcmVjdGlvbjoyOworICB9IFR5cGU7CisgIEhXT1JEICBUaW1lb3V0OworICBCWVRFICAgQ0RCWzE2XTsKK30gUmVxdWVzdEJsb2NrX3N0cnVjdDsKKwordHlwZWRlZiB1bmlvbiBfTW9yZUVyckluZm9fc3RydWN0eworICBzdHJ1Y3QgeworICAgIEJZVEUgIFJlc2VydmVkWzNdOworICAgIEJZVEUgIFR5cGU7CisgICAgRFdPUkQgRXJyb3JJbmZvOworICB9IENvbW1vbl9JbmZvOworICBzdHJ1Y3R7CisgICAgQllURSAgUmVzZXJ2ZWRbMl07CisgICAgQllURSAgb2ZmZW5zZV9zaXplOyAvKiBzaXplIG9mIG9mZmVuZGluZyBlbnRyeSAqLworICAgIEJZVEUgIG9mZmVuc2VfbnVtOyAgLyogYnl0ZSAjIG9mIG9mZmVuc2UgMC1iYXNlICovCisgICAgRFdPUkQgb2ZmZW5zZV92YWx1ZTsKKyAgfSBJbnZhbGlkX0NtZDsKK30gTW9yZUVyckluZm9fc3RydWN0OwordHlwZWRlZiBzdHJ1Y3QgX0Vycm9ySW5mb19zdHJ1Y3QgeworICBCWVRFICAgICAgICAgICAgICAgU2NzaVN0YXR1czsKKyAgQllURSAgICAgICAgICAgICAgIFNlbnNlTGVuOworICBIV09SRCAgICAgICAgICAgICAgQ29tbWFuZFN0YXR1czsKKyAgRFdPUkQgICAgICAgICAgICAgIFJlc2lkdWFsQ250OworICBNb3JlRXJySW5mb19zdHJ1Y3QgTW9yZUVyckluZm87CisgIEJZVEUgICAgICAgICAgICAgICBTZW5zZUluZm9bU0VOU0VJTkZPQllURVNdOworfSBFcnJvckluZm9fc3RydWN0OworCisjcHJhZ21hIHBhY2soKQorCisjZW5kaWYgLyogQ0NJU1NfREVGU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NjaXNzX2lvY3RsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NjaXNzX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM1YzJiMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2Npc3NfaW9jdGwuaApAQCAtMCwwICsxLDg4IEBACisjaWZuZGVmIENDSVNTX0lPQ1RMSAorI2RlZmluZSBDQ0lTU19JT0NUTEgKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jY2lzc19kZWZzLmg+CisKKyNkZWZpbmUgQ0NJU1NfSU9DX01BR0lDICdCJworCisKK3R5cGVkZWYgc3RydWN0IF9jY2lzc19wY2lfaW5mb19zdHJ1Y3QKK3sKKwl1bnNpZ25lZCBjaGFyIAlidXM7CisJdW5zaWduZWQgY2hhciAJZGV2X2ZuOworCXVuc2lnbmVkIHNob3J0CWRvbWFpbjsKKwlfX3UzMiAJCWJvYXJkX2lkOworfSBjY2lzc19wY2lfaW5mb19zdHJ1Y3Q7IAorCit0eXBlZGVmIHN0cnVjdCBfY2Npc3NfY29hbGludF9zdHJ1Y3QKK3sKKwlfX3UzMiAgZGVsYXk7CisJX191MzIgIGNvdW50OworfSBjY2lzc19jb2FsaW50X3N0cnVjdDsKKwordHlwZWRlZiBjaGFyIE5vZGVOYW1lX3R5cGVbMTZdOworCit0eXBlZGVmIF9fdTMyIEhlYXJ0YmVhdF90eXBlOworCisjZGVmaW5lIENJU1NfUEFSU0NTSVUyIAkweDAwMDEKKyNkZWZpbmUgQ0lTU19QQVJDU0NJVTMgCTB4MDAwMgorI2RlZmluZSBDSVNTX0ZJQlJFMUcJMHgwMTAwCisjZGVmaW5lIENJU1NfRklCUkUyRwkweDAyMDAKK3R5cGVkZWYgX191MzIgQnVzVHlwZXNfdHlwZTsKKwordHlwZWRlZiBjaGFyIEZpcm13YXJlVmVyX3R5cGVbNF07Cit0eXBlZGVmIF9fdTMyIERyaXZlclZlcl90eXBlOworCisjZGVmaW5lIE1BWF9LTUFMTE9DX1NJWkUgMTI4MDAwCisKK3R5cGVkZWYgc3RydWN0IF9JT0NUTF9Db21tYW5kX3N0cnVjdCB7CisgIExVTkFkZHJfc3RydWN0CSAgIExVTl9pbmZvOworICBSZXF1ZXN0QmxvY2tfc3RydWN0ICAgICAgUmVxdWVzdDsKKyAgRXJyb3JJbmZvX3N0cnVjdCAgCSAgIGVycm9yX2luZm87IAorICBXT1JECQkJICAgYnVmX3NpemU7ICAvKiBzaXplIGluIGJ5dGVzIG9mIHRoZSBidWYgKi8KKyAgQllURQkJCSAgICpidWY7Cit9IElPQ1RMX0NvbW1hbmRfc3RydWN0OworCit0eXBlZGVmIHN0cnVjdCBfQklHX0lPQ1RMX0NvbW1hbmRfc3RydWN0IHsKKyAgTFVOQWRkcl9zdHJ1Y3QJICAgTFVOX2luZm87CisgIFJlcXVlc3RCbG9ja19zdHJ1Y3QgICAgICBSZXF1ZXN0OworICBFcnJvckluZm9fc3RydWN0ICAJICAgZXJyb3JfaW5mbzsKKyAgRFdPUkQJCQkgICBtYWxsb2Nfc2l6ZTsgLyogPCBNQVhfS01BTExPQ19TSVpFIGluIGNjaXNzLmMgKi8KKyAgRFdPUkQJCQkgICBidWZfc2l6ZTsgICAgLyogc2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmICovCisgIAkJCQkgICAgICAgIC8qIDwgbWFsbG9jX3NpemUgKiBNQVhTR0VOVFJJRVMgKi8KKyAgQllURQkJCSAgICpidWY7Cit9IEJJR19JT0NUTF9Db21tYW5kX3N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX0xvZ3ZvbEluZm9fc3RydWN0eworCV9fdTMyCUx1bklEOworCWludAludW1fb3BlbnM7ICAvKiBudW1iZXIgb2Ygb3BlbnMgb24gdGhlIGxvZ2ljYWwgdm9sdW1lICovCisJaW50CW51bV9wYXJ0czsgIC8qIG51bWJlciBvZiBwYXJ0aXRpb25zIGNvbmZpZ3VyZWQgb24gbG9ndm9sICovCit9IExvZ3ZvbEluZm9fc3RydWN0OworCisjZGVmaW5lIENDSVNTX0dFVFBDSUlORk8gX0lPUihDQ0lTU19JT0NfTUFHSUMsIDEsIGNjaXNzX3BjaV9pbmZvX3N0cnVjdCkKKworI2RlZmluZSBDQ0lTU19HRVRJTlRJTkZPIF9JT1IoQ0NJU1NfSU9DX01BR0lDLCAyLCBjY2lzc19jb2FsaW50X3N0cnVjdCkKKyNkZWZpbmUgQ0NJU1NfU0VUSU5USU5GTyBfSU9XKENDSVNTX0lPQ19NQUdJQywgMywgY2Npc3NfY29hbGludF9zdHJ1Y3QpCisKKyNkZWZpbmUgQ0NJU1NfR0VUTk9ERU5BTUUgX0lPUihDQ0lTU19JT0NfTUFHSUMsIDQsIE5vZGVOYW1lX3R5cGUpCisjZGVmaW5lIENDSVNTX1NFVE5PREVOQU1FIF9JT1coQ0NJU1NfSU9DX01BR0lDLCA1LCBOb2RlTmFtZV90eXBlKQorCisjZGVmaW5lIENDSVNTX0dFVEhFQVJUQkVBVCBfSU9SKENDSVNTX0lPQ19NQUdJQywgNiwgSGVhcnRiZWF0X3R5cGUpCisjZGVmaW5lIENDSVNTX0dFVEJVU1RZUEVTICBfSU9SKENDSVNTX0lPQ19NQUdJQywgNywgQnVzVHlwZXNfdHlwZSkKKyNkZWZpbmUgQ0NJU1NfR0VURklSTVZFUiAgIF9JT1IoQ0NJU1NfSU9DX01BR0lDLCA4LCBGaXJtd2FyZVZlcl90eXBlKQorI2RlZmluZSBDQ0lTU19HRVREUklWVkVSICAgX0lPUihDQ0lTU19JT0NfTUFHSUMsIDksIERyaXZlclZlcl90eXBlKQorI2RlZmluZSBDQ0lTU19SRVZBTElEVk9MUyAgX0lPKENDSVNTX0lPQ19NQUdJQywgMTApCisjZGVmaW5lIENDSVNTX1BBU1NUSFJVCSAgIF9JT1dSKENDSVNTX0lPQ19NQUdJQywgMTEsIElPQ1RMX0NvbW1hbmRfc3RydWN0KQorI2RlZmluZSBDQ0lTU19ERVJFR0RJU0sJICAgX0lPKENDSVNTX0lPQ19NQUdJQywgMTIpCisKKy8qIG5vIGxvbmdlciB1c2VkLi4uIHVzZSBSRUdORVdEIGluc3RlYWQgKi8gCisjZGVmaW5lIENDSVNTX1JFR05FV0RJU0sgIF9JT1coQ0NJU1NfSU9DX01BR0lDLCAxMywgaW50KQorCisjZGVmaW5lIENDSVNTX1JFR05FV0QJICAgX0lPKENDSVNTX0lPQ19NQUdJQywgMTQpCisjZGVmaW5lIENDSVNTX1JFU0NBTkRJU0sgICBfSU8oQ0NJU1NfSU9DX01BR0lDLCAxNikKKyNkZWZpbmUgQ0NJU1NfR0VUTFVOSU5GTyAgIF9JT1IoQ0NJU1NfSU9DX01BR0lDLCAxNywgTG9ndm9sSW5mb19zdHJ1Y3QpCisjZGVmaW5lIENDSVNTX0JJR19QQVNTVEhSVSBfSU9XUihDQ0lTU19JT0NfTUFHSUMsIDE4LCBCSUdfSU9DVExfQ29tbWFuZF9zdHJ1Y3QpCisKKyNlbmRpZiAgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nkay5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jZGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDA5M2E4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jZGsuaApAQCAtMCwwICsxLDQ4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJY2RrLmggIC0tIENESyBpbnRlcmZhY2UgZGVmaW5pdGlvbnMuCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggIFN0YWxsaW9uIFRlY2hub2xvZ2llcworICoJQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgIEdyZWcgVW5nZXJlci4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmCV9DREtfSAorI2RlZmluZQlfQ0RLX0gKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI3ByYWdtYQlwYWNrKDIpCisKKy8qCisgKglUaGUgZm9sbG93aW5nIHNldCBvZiBkZWZpbml0aW9ucyBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlCisgKglzaGFyZWQgbWVtb3J5IGludGVyZmFjZSBvZiB0aGUgU3RhbGxpb24gaW50ZWxsaWdlbnQgbXVsdGlwb3J0IHNlcmlhbAorICoJYm9hcmRzLiBUaGUgZGVmaW5pdGlvbnMgaW4gdGhpcyBmaWxlIGFyZSB0YWtlbiBkaXJlY3RseSBmcm9tIHRoZQorICoJZG9jdW1lbnQgdGl0bGVkICJHZW5lcmljIFN0YWNrYWJsZSBJbnRlcmZhY2UsIERvd25sb2FkZXIgYW5kCisgKglDb21tdW5pY2F0aW9ucyBEZXZlbG9wbWVudCBLaXQiLgorICovCisKKy8qCisgKglEZWZpbmUgdGhlIHNldCBvZiBpbXBvcnRhbnQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzZXMuIFRoZXNlIGFyZQorICoJcmVxdWlyZWQgdG8gaW5pdGlhbGl6ZSB0aGUgYm9hcmQgYW5kIGdldCB0aGluZ3Mgc3RhcnRlZC4gQWxsIG9mIHRoZXNlCisgKglhZGRyZXNzZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2hhcmVkIG1lbW9yeS4KKyAqLworI2RlZmluZQlDREtfU0lHQUREUgkweDIwMAorI2RlZmluZQlDREtfRkVBVEFERFIJMHgyODAKKyNkZWZpbmUJQ0RLX0NES0FERFIJMHgzMDAKKyNkZWZpbmUJQ0RLX1JEWUFERFIJMHgyNjIKKworI2RlZmluZQlDREtfQUxJVkVNQVJLRVIJMTMKKworLyoKKyAqCU9uIGhhcmR3YXJlIHBvd2VyIHVwIHRoZSBST01zIGxvY2F0ZWQgb24gdGhlIEVhc3lDb25uZWN0aW9uIDgvNjQgd2lsbAorICoJZmlsbCBvdXQgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgaW5mb3JtYXRpb24gaW50byBzaGFyZWQgbWVtb3J5LiBUaGlzCisgKgl3YXkgdGhlIGhvc3Qgc3lzdGVtIGNhbiBxdWlja2x5IGRldGVybWluZSB0aGF0IHRoZSBib2FyZCBpcyBwcmVzZW50CisgKglhbmQgaXMgb3BlcmF0aW9uYWwuCisgKi8KK3R5cGVkZWYgc3RydWN0IGNka2VjcHNpZyB7CisJdW5zaWduZWQgbG9uZwltYWdpYzsKKwl1bnNpZ25lZCBzaG9ydAlyb212ZXI7CisJdW5zaWduZWQgc2hvcnQJY3B1dHlwZTsKKwl1bnNpZ25lZCBjaGFyCXBhbmVsaWRbOF07Cit9IGNka2VjcHNpZ190OworCisjZGVmaW5lCUVDUF9NQUdJQwkweDIxNTA0MzQ1CisKKy8qCisgKglPbiBoYXJkd2FyZSBwb3dlciB1cCB0aGUgUk9NcyBsb2NhdGVkIG9uIHRoZSBPTmJvYXJkLCBTdGFsbGlvbiBhbmQKKyAqCUJydW1ieXMgd2lsbCBmaWxsIG91dCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZAorICoJbWVtb3J5LiBUaGlzIHdheSB0aGUgaG9zdCBzeXN0ZW0gY2FuIHF1aWNrbHkgZGV0ZXJtaW5lIHRoYXQgdGhlIGJvYXJkCisgKglpcyBwcmVzZW50IGFuZCBpcyBvcGVyYXRpb25hbC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY2Rrb25ic2lnIHsKKwl1bnNpZ25lZCBzaG9ydAltYWdpYzA7CisJdW5zaWduZWQgc2hvcnQJbWFnaWMxOworCXVuc2lnbmVkIHNob3J0CW1hZ2ljMjsKKwl1bnNpZ25lZCBzaG9ydAltYWdpYzM7CisJdW5zaWduZWQgc2hvcnQJcm9tdmVyOworCXVuc2lnbmVkIHNob3J0CW1lbW9mZjsKKwl1bnNpZ25lZCBzaG9ydAltZW1zZWc7CisJdW5zaWduZWQgc2hvcnQJYW1hc2swOworCXVuc2lnbmVkIHNob3J0CXBpYzsKKwl1bnNpZ25lZCBzaG9ydAlzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQJYnR5cGU7CisJdW5zaWduZWQgc2hvcnQJY2xrdGlja3M7CisJdW5zaWduZWQgc2hvcnQJY2xrc3BlZWQ7CisJdW5zaWduZWQgc2hvcnQJYW1hc2sxOworCXVuc2lnbmVkIHNob3J0CWFtYXNrMjsKK30gY2Rrb25ic2lnX3Q7CisKKyNkZWZpbmUJT05CX01BR0lDMAkweGYyYTcKKyNkZWZpbmUJT05CX01BR0lDMQkweGExNDkKKyNkZWZpbmUJT05CX01BR0lDMgkweDYzNTIKKyNkZWZpbmUJT05CX01BR0lDMwkweGYxMjEKKworLyoKKyAqCURlZmluZSB0aGUgZmVhdHVyZSBhcmVhIHN0cnVjdHVyZS4gVGhlIGZlYXR1cmUgYXJlYSBpcyB0aGUgc2V0IG9mCisgKglzdGFydHVwIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUgc2xhdmUgaW1hZ2Ugd2hlbiBpdCBzdGFydHMgZXhlY3V0aW5nLgorICoJVGhleSBhbGxvdyBmb3IgdGhlIHNwZWNpZmljYXRpb24gb2YgYnVmZmVyIHNpemVzLCBkZWJ1ZyB0cmFjZSwgZXRjLgorICovCit0eXBlZGVmIHN0cnVjdCBjZGtmZWF0dXJlIHsKKwl1bnNpZ25lZCBsb25nCWRlYnVnOworCXVuc2lnbmVkIGxvbmcJYmFubmVyOworCXVuc2lnbmVkIGxvbmcJZXR5cGU7CisJdW5zaWduZWQgbG9uZwlucmRldnM7CisJdW5zaWduZWQgbG9uZwlicmRzcGVjOworCXVuc2lnbmVkIGxvbmcJdHhycXNpemU7CisJdW5zaWduZWQgbG9uZwlyeHJxc2l6ZTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworfSBjZGtmZWF0dXJlX3Q7CisKKyNkZWZpbmUJRVRZUF9EREsJMAorI2RlZmluZQlFVFlQX0NESwkxCisKKy8qCisgKglEZWZpbmUgdGhlIENESyBoZWFkZXIgc3RydWN0dXJlLiBUaGlzIGlzIHRoZSBpbmZvIHRoYXQgdGhlIHNsYXZlCisgKgllbnZpcm9ubWVudCBzZXRzIHVwIGFmdGVyIGl0IGhhcyBiZWVuIGRvd25sb2FkZWQgYW5kIHN0YXJ0ZWQuIEl0CisgKgllc3NlbnRpYWxseSBwcm92aWRlcyBhIG1lbW9yeSBtYXAgZm9yIHRoZSBzaGFyZWQgbWVtb3J5IGludGVyZmFjZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY2RraGRyIHsKKwl1bnNpZ25lZCBzaG9ydAljb21tYW5kOworCXVuc2lnbmVkIHNob3J0CXN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydAlwb3J0OworCXVuc2lnbmVkIHNob3J0CW1vZGU7CisJdW5zaWduZWQgbG9uZwljbWRfYnVmWzE0XTsKKwl1bnNpZ25lZCBzaG9ydAlhbGl2ZV9jbnQ7CisJdW5zaWduZWQgc2hvcnQJaW50cnB0X21vZGU7CisJdW5zaWduZWQgY2hhcglpbnRycHRfaWRbOF07CisJdW5zaWduZWQgY2hhcgl2ZXJfcmVsZWFzZTsKKwl1bnNpZ25lZCBjaGFyCXZlcl9tb2RpZmljYXRpb247CisJdW5zaWduZWQgY2hhcgl2ZXJfZml4OworCXVuc2lnbmVkIGNoYXIJZGVhZG1hbl9yZXN0YXJ0OworCXVuc2lnbmVkIHNob3J0CWRlYWRtYW47CisJdW5zaWduZWQgc2hvcnQJbnJkZXZzOworCXVuc2lnbmVkIGxvbmcJbWVtcDsKKwl1bnNpZ25lZCBsb25nCWhvc3RwOworCXVuc2lnbmVkIGxvbmcJc2xhdmVwOworCXVuc2lnbmVkIGNoYXIJaG9zdHJlcTsKKwl1bnNpZ25lZCBjaGFyCXNsYXZlcmVxOworCXVuc2lnbmVkIGNoYXIJY21kX3Jlc2VydmVkWzMwXTsKK30gY2RraGRyX3Q7CisKKyNkZWZpbmUJTU9ERV9EREsJMAorI2RlZmluZQlNT0RFX0NESwkxCisKKyNkZWZpbmUJSU1EX0lOVFIJMHgwCisjZGVmaW5lCUlNRF9QUElOVFIJMHgxCisjZGVmaW5lCUlNRF9QT0xMCTB4ZmYKKworLyoKKyAqCURlZmluZSB0aGUgbWVtb3J5IG1hcHBpbmcgc3RydWN0dXJlLiBUaGlzIHN0cnVjdHVyZSBpcyBwb2ludGVkIHRvIGJ5CisgKgl0aGUgbWVtcCBmaWVsZCBpbiB0aGUgc3RsY2RraGRyIHN0cnVjdC4gQXMgbWFueSBhcyB0aGVzZSBzdHJ1Y3R1cmVzCisgKglhcyByZXF1aXJlZCBhcmUgbGFpZCBvdXQgaW4gc2hhcmVkIG1lbW9yeSB0byBkZWZpbmUgaG93IHRoZSByZXN0IG9mCisgKglzaGFyZWQgbWVtb3J5IGlzIGRpdmlkZWQgdXAuIFRoZXJlIHdpbGwgYmUgb25lIGZvciBlYWNoIHBvcnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGNka21lbSB7CisJdW5zaWduZWQgc2hvcnQJZHR5cGU7CisJdW5zaWduZWQgbG9uZwlvZmZzZXQ7Cit9IGNka21lbV90OworCisjZGVmaW5lCVRZUF9VTkRFRklORUQJMHgwCisjZGVmaW5lCVRZUF9BU1lOQ1RSTAkweDEKKyNkZWZpbmUJVFlQX0FTWU5DCTB4MjAKKyNkZWZpbmUJVFlQX1BBUkFMTEVMCTB4NDAKKyNkZWZpbmUJVFlQX1NZTkNYMjEJMHg2MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglGb2xsb3dpbmcgaXMgYSBzZXQgb2YgZGVmaW5lcyBhbmQgc3RydWN0dXJlcyB1c2VkIHRvIGFjdHVhbGx5IGRlYWwKKyAqCXdpdGggdGhlIHNlcmlhbCBwb3J0cyBvbiB0aGUgYm9hcmQuIEZpcnN0bHkgaXMgdGhlIHNldCBvZiBjb21tYW5kcworICoJdGhhdCBjYW4gYmUgYXBwbGllZCB0byBwb3J0cy4KKyAqLworI2RlZmluZQlBU1lDTUQJCSgoKHVuc2lnbmVkIGxvbmcpICdhJykgPDwgOCkKKworI2RlZmluZQlBX05VTEwJCShBU1lDTUQgfCAwKQorI2RlZmluZQlBX0ZMVVNICQkoQVNZQ01EIHwgMSkKKyNkZWZpbmUJQV9CUkVBSwkJKEFTWUNNRCB8IDIpCisjZGVmaW5lCUFfR0VUUE9SVAkoQVNZQ01EIHwgMykKKyNkZWZpbmUJQV9TRVRQT1JUCShBU1lDTUQgfCA0KQorI2RlZmluZQlBX1NFVFBPUlRGCShBU1lDTUQgfCA1KQorI2RlZmluZQlBX1NFVFBPUlRGVFgJKEFTWUNNRCB8IDYpCisjZGVmaW5lCUFfU0VUUE9SVEZSWAkoQVNZQ01EIHwgNykKKyNkZWZpbmUJQV9HRVRTSUdOQUxTCShBU1lDTUQgfCA4KQorI2RlZmluZQlBX1NFVFNJR05BTFMJKEFTWUNNRCB8IDkpCisjZGVmaW5lCUFfU0VUU0lHTkFMU0YJKEFTWUNNRCB8IDEwKQorI2RlZmluZQlBX1NFVFNJR05BTFNGVFgJKEFTWUNNRCB8IDExKQorI2RlZmluZQlBX1NFVFNJR05BTFNGUlgJKEFTWUNNRCB8IDEyKQorI2RlZmluZQlBX0dFVE5PVElGWQkoQVNZQ01EIHwgMTMpCisjZGVmaW5lCUFfU0VUTk9USUZZCShBU1lDTUQgfCAxNCkKKyNkZWZpbmUJQV9OT1RJRlkJKEFTWUNNRCB8IDE1KQorI2RlZmluZQlBX1BPUlRDVFJMCShBU1lDTUQgfCAxNikKKyNkZWZpbmUJQV9HRVRTVEFUUwkoQVNZQ01EIHwgMTcpCisjZGVmaW5lCUFfUlFTVEFURQkoQVNZQ01EIHwgMTgpCisjZGVmaW5lCUFfRkxPV1NUQVRFCShBU1lDTUQgfCAxOSkKKyNkZWZpbmUJQV9DTEVBUlNUQVRTCShBU1lDTUQgfCAyMCkKKworLyoKKyAqCURlZmluZSB0aG9zZSBhcmd1bWVudHMgdXNlZCBmb3Igc2ltcGxlIGNvbW1hbmRzLgorICovCisjZGVmaW5lCUZMVVNIUlgJCTB4MQorI2RlZmluZQlGTFVTSFRYCQkweDIKKworI2RlZmluZQlCUkVBS09OCQktMQorI2RlZmluZQlCUkVBS09GRgktMgorCisvKgorICoJRGVmaW5lIHRoZSBwb3J0IHNldHRpbmcgc3RydWN0dXJlLCBhbmQgYWxsIHRob3NlIGRlZmluZXMgdGhhdCBnbyBhbG9uZworICoJd2l0aCBpdC4gQmFzaWNhbGx5IHRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGlzCisgKglwb3J0OiBiYXVkIHJhdGUsIGNoYXJzLCBwYXJpdHksIGlucHV0L291dHB1dCBjaGFyIGNvb2tpbmcgZXRjLgorICovCit0eXBlZGVmIHN0cnVjdCBhc3lwb3J0IHsKKwl1bnNpZ25lZCBsb25nCWJhdWRvdXQ7CisJdW5zaWduZWQgbG9uZwliYXVkaW47CisJdW5zaWduZWQgbG9uZwlpZmxhZzsKKwl1bnNpZ25lZCBsb25nCW9mbGFnOworCXVuc2lnbmVkIGxvbmcJbGZsYWc7CisJdW5zaWduZWQgbG9uZwlwZmxhZzsKKwl1bnNpZ25lZCBsb25nCWZsb3c7CisJdW5zaWduZWQgbG9uZwlzcGFyZTE7CisJdW5zaWduZWQgc2hvcnQJdnRpbWU7CisJdW5zaWduZWQgc2hvcnQJdm1pbjsKKwl1bnNpZ25lZCBzaG9ydAl0eGxvOworCXVuc2lnbmVkIHNob3J0CXR4aGk7CisJdW5zaWduZWQgc2hvcnQJcnhsbzsKKwl1bnNpZ25lZCBzaG9ydAlyeGhpOworCXVuc2lnbmVkIHNob3J0CXJ4aG9nOworCXVuc2lnbmVkIHNob3J0CXNwYXJlMjsKKwl1bnNpZ25lZCBjaGFyCWNzaXplOworCXVuc2lnbmVkIGNoYXIJc3RvcGJzOworCXVuc2lnbmVkIGNoYXIJcGFyaXR5OworCXVuc2lnbmVkIGNoYXIJc3RvcGluOworCXVuc2lnbmVkIGNoYXIJc3RhcnRpbjsKKwl1bnNpZ25lZCBjaGFyCXN0b3BvdXQ7CisJdW5zaWduZWQgY2hhcglzdGFydG91dDsKKwl1bnNpZ25lZCBjaGFyCXBhcm1hcms7CisJdW5zaWduZWQgY2hhcglicmttYXJrOworCXVuc2lnbmVkIGNoYXIJY2NbMTFdOworfSBhc3lwb3J0X3Q7CisKKyNkZWZpbmUJUFRfU1RPUDEJMHgwCisjZGVmaW5lCVBUX1NUT1AxNQkweDEKKyNkZWZpbmUJUFRfU1RPUDIJMHgyCisKKyNkZWZpbmUJUFRfTk9QQVJJVFkJMHgwCisjZGVmaW5lCVBUX09ERFBBUklUWQkweDEKKyNkZWZpbmUJUFRfRVZFTlBBUklUWQkweDIKKyNkZWZpbmUJUFRfTUFSS1BBUklUWQkweDMKKyNkZWZpbmUJUFRfU1BBQ0VQQVJJVFkJMHg0CisKKyNkZWZpbmUJRl9OT05FCQkweDAKKyNkZWZpbmUJRl9JWE9OCQkweDEKKyNkZWZpbmUJRl9JWE9GRgkJMHgyCisjZGVmaW5lCUZfSVhBTlkJCTB4NAorI2RlZmluZQlGX0lPWEFOWQkweDgKKyNkZWZpbmUJRl9SVFNGTE9XCTB4MTAKKyNkZWZpbmUJRl9DVFNGTE9XCTB4MjAKKyNkZWZpbmUJRl9EVFJGTE9XCTB4NDAKKyNkZWZpbmUJRl9EQ0RGTE9XCTB4ODAKKyNkZWZpbmUJRl9EU1JPRkxPVwkweDEwMAorI2RlZmluZQlGX0RTUklGTE9XCTB4MjAwCisKKyNkZWZpbmUJRklfTk9SWAkJMHgxCisjZGVmaW5lCUZJX1JBVwkJMHgyCisjZGVmaW5lCUZJX0lTVFJJUAkweDQKKyNkZWZpbmUJRklfVUNMQwkJMHg4CisjZGVmaW5lCUZJX0lOTENSCTB4MTAKKyNkZWZpbmUJRklfSUNSTkwJMHgyMAorI2RlZmluZQlGSV9JR05DUgkweDQwCisjZGVmaW5lCUZJX0lHTkJSRUFLCTB4ODAKKyNkZWZpbmUJRklfRFNDUkRCUkVBSwkweDEwMAorI2RlZmluZQlGSV8xTUFSS0JSRUFLCTB4MjAwCisjZGVmaW5lCUZJXzJNQVJLQlJFQUsJMHg0MDAKKyNkZWZpbmUJRklfWENITkdCUkVBSwkweDgwMAorI2RlZmluZQlGSV9JR05SWEVSUlMJMHgxMDAwCisjZGVmaW5lCUZJX0RTQ0RSWEVSUlMJMHgyMDAwCisjZGVmaW5lCUZJXzFNQVJLUlhFUlJTCTB4NDAwMAorI2RlZmluZQlGSV8yTUFSS1JYRVJSUwkweDgwMDAKKyNkZWZpbmUJRklfWENITkdSWEVSUlMJMHgxMDAwMAorI2RlZmluZQlGSV9EU0NSRE5VTEwJMHgyMDAwMAorCisjZGVmaW5lCUZPX09MQ1VDCTB4MQorI2RlZmluZQlGT19PTkxDUgkweDIKKyNkZWZpbmUJRk9fT09DUk5MCTB4NAorI2RlZmluZQlGT19PTk9DUgkweDgKKyNkZWZpbmUJRk9fT05MUkVUCTB4MTAKKyNkZWZpbmUJRk9fT05MCQkweDIwCisjZGVmaW5lCUZPX09CUwkJMHg0MAorI2RlZmluZQlGT19PVlQJCTB4ODAKKyNkZWZpbmUJRk9fT0ZGCQkweDEwMAorI2RlZmluZQlGT19PVEFCMQkweDIwMAorI2RlZmluZQlGT19PVEFCMgkweDQwMAorI2RlZmluZQlGT19PVEFCMwkweDgwMAorI2RlZmluZQlGT19PQ1IxCQkweDEwMDAKKyNkZWZpbmUJRk9fT0NSMgkJMHgyMDAwCisjZGVmaW5lCUZPX09DUjMJCTB4NDAwMAorI2RlZmluZQlGT19PRklMTAkweDgwMDAKKyNkZWZpbmUJRk9fT0RFTEwJMHgxMDAwMAorCisjZGVmaW5lCVBfUlRTTE9DSwkweDEKKyNkZWZpbmUJUF9DVFNMT0NLCTB4MgorI2RlZmluZQlQX01BUFJUUwkweDQKKyNkZWZpbmUJUF9NQVBDVFMJMHg4CisjZGVmaW5lCVBfTE9PUEJBQ0sJMHgxMAorI2RlZmluZQlQX0RUUkZPTExPVwkweDIwCisjZGVmaW5lCVBfRkFLRURDRAkweDQwCisKKyNkZWZpbmUJUF9SWElNSU4JMHgxMDAwMAorI2RlZmluZQlQX1JYSVRJTUUJMHgyMDAwMAorI2RlZmluZQlQX1JYVEhPTEQJMHg0MDAwMAorCisvKgorICoJRGVmaW5lIGEgc3RydWN0dXJlIHRvIGNvbW11bmljYXRlIHNlcmlhbCBwb3J0IHNpZ25hbCBhbmQgZGF0YSBzdGF0ZQorICoJaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IGFzeXNpZ3MgeworCXVuc2lnbmVkIGxvbmcJZGF0YTsKKwl1bnNpZ25lZCBsb25nCXNpZ25hbDsKKwl1bnNpZ25lZCBsb25nCXNpZ3ZhbHVlOworfSBhc3lzaWdzX3Q7CisKKyNkZWZpbmUJRFRfVFhCVVNZCTB4MQorI2RlZmluZQlEVF9UWEVNUFRZCTB4MgorI2RlZmluZQlEVF9UWExPVwkweDQKKyNkZWZpbmUJRFRfVFhISUdICTB4OAorI2RlZmluZQlEVF9UWEZVTEwJMHgxMAorI2RlZmluZQlEVF9UWEhPRwkweDIwCisjZGVmaW5lCURUX1RYRkxPV0VECTB4NDAKKyNkZWZpbmUJRFRfVFhCUkVBSwkweDgwCisKKyNkZWZpbmUJRFRfUlhCVVNZCTB4MTAwCisjZGVmaW5lCURUX1JYRU1QVFkJMHgyMDAKKyNkZWZpbmUJRFRfUlhMT1cJMHg0MDAKKyNkZWZpbmUJRFRfUlhISUdICTB4ODAwCisjZGVmaW5lCURUX1JYRlVMTAkweDEwMDAKKyNkZWZpbmUJRFRfUlhIT0cJMHgyMDAwCisjZGVmaW5lCURUX1JYRkxPV0VECTB4NDAwMAorI2RlZmluZQlEVF9SWEJSRUFLCTB4ODAwMAorCisjZGVmaW5lCVNHX0RUUgkJMHgxCisjZGVmaW5lCVNHX0RDRAkJMHgyCisjZGVmaW5lCVNHX1JUUwkJMHg0CisjZGVmaW5lCVNHX0NUUwkJMHg4CisjZGVmaW5lCVNHX0RTUgkJMHgxMAorI2RlZmluZQlTR19SSQkJMHgyMAorCisvKgorICoJRGVmaW5lIHRoZSBub3RpZmljYXRpb24gc2V0dGluZyBzdHJ1Y3R1cmUuIFRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZQorICoJcG9ydCB3aGF0IGV2ZW50cyB3ZSB3YW50IHRvIGJlIGluZm9ybWVkIGFib3V0LiBGaWVsZHMgaGVyZSB1c2UgdGhlCisgKglzYW1lIGRlZmluZXMgYXMgZm9yIHRoZSBhc3lzaWdzIHN0cnVjdHVyZSBhYm92ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXN5bm90aWZ5IHsKKwl1bnNpZ25lZCBsb25nCWN0cmw7CisJdW5zaWduZWQgbG9uZwlkYXRhOworCXVuc2lnbmVkIGxvbmcJc2lnbmFsOworCXVuc2lnbmVkIGxvbmcJc2lndmFsdWU7Cit9IGFzeW5vdGlmeV90OworCisvKgorICoJRGVmaW5lIHRoZSBwb3J0IGNvbnRyb2wgc3RydWN0dXJlLiBJdCBpcyB1c2VkIHRvIGRvIGZpbmUgZ3JhaW4KKyAqCWNvbnRyb2wgb3BlcmF0aW9ucyBvbiB0aGUgcG9ydC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJcnhjdHJsOworCXVuc2lnbmVkIGxvbmcJdHhjdHJsOworCWNoYXIJCXJ4aW1kY2g7CisJY2hhcgkJdHhpbWRjaDsKKwljaGFyCQlzcGFyZTE7CisJY2hhcgkJc3BhcmUyOworfSBhc3ljdHJsX3Q7CisKKyNkZWZpbmUJQ1RfRU5BQkxFCTB4MQorI2RlZmluZQlDVF9ESVNBQkxFCTB4MgorI2RlZmluZQlDVF9TVE9QCQkweDQKKyNkZWZpbmUJQ1RfU1RBUlQJMHg4CisjZGVmaW5lCUNUX1NUQVJURkxPVwkweDEwCisjZGVmaW5lCUNUX1NUT1BGTE9XCTB4MjAKKyNkZWZpbmUJQ1RfU0VORENIUgkweDQwCisKKy8qCisgKglEZWZpbmUgdGhlIHN0YXRzIHN0cnVjdHVyZSBrZXB0IGZvciBlYWNoIHBvcnQuIFRoaXMgaXMgYSB1c2VmdWwgc2V0CisgKglvZiBkYXRhIGNvbGxlY3RlZCBmb3IgZWFjaCBwb3J0IG9uIHRoZSBzbGF2ZS4gVGhlIEFfR0VUU1RBVFMgY29tbWFuZAorICoJaXMgdXNlZCB0byByZXRyaWV2ZSB0aGlzIGRhdGEgZnJvbSB0aGUgc2xhdmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFzeXN0YXRzIHsKKwl1bnNpZ25lZCBsb25nCW9wZW5zOworCXVuc2lnbmVkIGxvbmcJdHhjaGFyczsKKwl1bnNpZ25lZCBsb25nCXJ4Y2hhcnM7CisJdW5zaWduZWQgbG9uZwl0eHJpbmdxOworCXVuc2lnbmVkIGxvbmcJcnhyaW5ncTsKKwl1bnNpZ25lZCBsb25nCXR4bXNnczsKKwl1bnNpZ25lZCBsb25nCXJ4bXNnczsKKwl1bnNpZ25lZCBsb25nCXR4Zmx1c2hlczsKKwl1bnNpZ25lZCBsb25nCXJ4Zmx1c2hlczsKKwl1bnNpZ25lZCBsb25nCW92ZXJydW5zOworCXVuc2lnbmVkIGxvbmcJZnJhbWluZzsKKwl1bnNpZ25lZCBsb25nCXBhcml0eTsKKwl1bnNpZ25lZCBsb25nCXJpbmdvdmVyOworCXVuc2lnbmVkIGxvbmcJbG9zdDsKKwl1bnNpZ25lZCBsb25nCXJ4c3RhcnQ7CisJdW5zaWduZWQgbG9uZwlyeHN0b3A7CisJdW5zaWduZWQgbG9uZwl0eHN0YXJ0OworCXVuc2lnbmVkIGxvbmcJdHhzdG9wOworCXVuc2lnbmVkIGxvbmcJZGNkY250OworCXVuc2lnbmVkIGxvbmcJZHRyY250OworCXVuc2lnbmVkIGxvbmcJY3RzY250OworCXVuc2lnbmVkIGxvbmcJcnRzY250OworCXVuc2lnbmVkIGxvbmcJZHNyY250OworCXVuc2lnbmVkIGxvbmcJcmljbnQ7CisJdW5zaWduZWQgbG9uZwl0eGJyZWFrczsKKwl1bnNpZ25lZCBsb25nCXJ4YnJlYWtzOworCXVuc2lnbmVkIGxvbmcJc2lnbmFsczsKKwl1bnNpZ25lZCBsb25nCXN0YXRlOworCXVuc2lnbmVkIGxvbmcJaHdpZDsKK30gYXN5c3RhdHNfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQWxsIGNvbW1hbmQgYW5kIGNvbnRyb2wgY29tbXVuaWNhdGlvbiB3aXRoIGEgZGV2aWNlIG9uIHRoZSBzbGF2ZSBpcworICoJdmlhIGEgY29udHJvbCBibG9jayBpbiBzaGFyZWQgbWVtb3J5LiBFYWNoIGRldmljZSBoYXMgaXRzIG93biBjb250cm9sCisgKglibG9jaywgZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZS4gVGhlIGNvbnRyb2wgYmxvY2sgYWxsb3dzCisgKgl0aGUgaG9zdCB0byBvcGVuLCBjbG9zZSBhbmQgY29udHJvbCB0aGUgZGV2aWNlIG9uIHRoZSBzbGF2ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY2RrY3RybCB7CisJdW5zaWduZWQgY2hhcglvcGVuOworCXVuc2lnbmVkIGNoYXIJY2xvc2U7CisJdW5zaWduZWQgbG9uZwlvcGVuYXJnOworCXVuc2lnbmVkIGxvbmcJY2xvc2Vhcmc7CisJdW5zaWduZWQgbG9uZwljbWQ7CisJdW5zaWduZWQgbG9uZwlzdGF0dXM7CisJdW5zaWduZWQgbG9uZwlhcmdzWzMyXTsKK30gY2RrY3RybF90OworCisvKgorICoJRWFjaCBkZXZpY2Ugb24gdGhlIHNsYXZlIHBhc3NlcyBkYXRhIHRvIGFuZCBmcm9tIHRoZSBob3N0IHZpYSBhIHJpbmcKKyAqCXF1ZXVlIGluIHNoYXJlZCBtZW1vcnkuIERlZmluZSBhIHJpbmcgcXVldWUgc3RydWN0dXJlIHRvIGhvbGQgdGhlCisgKgl2aXRhbCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJpbmcgcXVldWUuIFR3byByaW5nIHF1ZXVlcyB3aWxsIGJlCisgKglhbGxvY2F0ZWQgZm9yIGVhY2ggcG9ydCwgb25lIGZvciByZWNlaXZlIGRhdGEgYW5kIG9uZSBmb3IgdHJhbnNtaXQKKyAqCWRhdGEuCisgKi8KK3R5cGVkZWYgc3RydWN0IGNka2FzeXJxIHsKKwl1bnNpZ25lZCBsb25nCW9mZnNldDsKKwl1bnNpZ25lZCBzaG9ydAlzaXplOworCXVuc2lnbmVkIHNob3J0CWhlYWQ7CisJdW5zaWduZWQgc2hvcnQJdGFpbDsKK30gY2RrYXN5cnFfdDsKKworLyoKKyAqCUVhY2ggYXN5bmNocm9ub3VzIHBvcnQgaXMgZGVmaW5lZCBpbiBzaGFyZWQgbWVtb3J5IGJ5IHRoZSBmb2xsb3dpbmcKKyAqCXN0cnVjdHVyZS4gSXQgY29udGFpbnMgYSBjb250cm9sIGJsb2NrIHRvIGNvbW1hbmQgYSBkZXZpY2UsIGFuZCBhbHNvCisgKgl0aGUgbmVjZXNzYXJ5IGRhdGEgY2hhbm5lbCBpbmZvcm1hdGlvbiBhcyB3ZWxsLgorICovCit0eXBlZGVmIHN0cnVjdCBjZGthc3kgeworCWNka2N0cmxfdAljdHJsOworCXVuc2lnbmVkIHNob3J0CW5vdGlmeTsKKwlhc3lub3RpZnlfdAljaGFuZ2VkOworCXVuc2lnbmVkIHNob3J0CXJlY2VpdmU7CisJY2RrYXN5cnFfdAlyeHE7CisJdW5zaWduZWQgc2hvcnQJdHJhbnNtaXQ7CisJY2RrYXN5cnFfdAl0eHE7Cit9IGNka2FzeV90OworCisjcHJhZ21hCXBhY2soKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEZWZpbmUgdGhlIHNldCBvZiBpb2N0bHMgdXNlZCBieSB0aGUgZHJpdmVyIHRvIGRvIHNwZWNpYWwgdGhpbmdzCisgKgl0byB0aGUgYm9hcmQuIFRoZXNlIGluY2x1ZGUgaW50ZXJydXB0aW5nIGl0LCBhbmQgaW5pdGlhbGl6aW5nCisgKgl0aGUgZHJpdmVyIGFmdGVyIGJvYXJkIHN0YXJ0dXAgYW5kIHNodXRkb3duLgorICovCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZQlTVExfQklOVFIJX0lPKCdzJywyMCkKKyNkZWZpbmUJU1RMX0JTVEFSVAlfSU8oJ3MnLDIxKQorI2RlZmluZQlTVExfQlNUT1AJX0lPKCdzJywyMikKKyNkZWZpbmUJU1RMX0JSRVNFVAlfSU8oJ3MnLDIzKQorCisvKgorICoJRGVmaW5lIGEgc2V0IG9mIGlvY3RsIGV4dGVuc2lvbnMsIHVzZWQgdG8gZ2V0IGF0IHNwZWNpYWwgc3R1ZmYuCisgKi8KKyNkZWZpbmUJU1RMX0dFVFBGTEFHCV9JTygncycsODApCisjZGVmaW5lCVNUTF9TRVRQRkxBRwlfSU8oJ3MnLDgxKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2Ryb20uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2Ryb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWRjYWYxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jZHJvbS5oCkBAIC0wLDAgKzEsOTEyIEBACisvKgorICogLS0gPGxpbnV4L2Nkcm9tLmg+CisgKiBHZW5lcmFsIGhlYWRlciBmaWxlIGZvciBsaW51eCBDRC1ST00gZHJpdmVycyAKKyAqIENvcHlyaWdodCAoQykgMTk5MiAgICAgICAgIERhdmlkIEdpbGxlciwgcmFmZXRtYWRAb3h5LmVkdQorICogICAgICAgICAgICAgICAxOTk0LCAxOTk1ICAgRWJlcmhhcmQgTcO2bmtlYmVyZywgZW1vZW5rZUBnd2RnLmRlCisgKiAgICAgICAgICAgICAgIDE5OTYgICAgICAgICBEYXZpZCB2YW4gTGVldXdlbiwgZGF2aWRAdG0udG5vLm5sCisgKiAgICAgICAgICAgICAgIDE5OTcsIDE5OTggICBFcmlrIEFuZGVyc2VuLCBhbmRlcnNlZUBkZWJpYW4ub3JnCisgKiAgICAgICAgICAgICAgIDE5OTgtMjAwMiAgICBKZW5zIEF4Ym9lLCBheGJvZUBzdXNlLmRlCisgKi8KKyAKKyNpZm5kZWYJX0xJTlVYX0NEUk9NX0gKKyNkZWZpbmUJX0xJTlVYX0NEUk9NX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQXMgb2YgTGludXggMi4xLngsIGFsbCBMaW51eCBDRC1ST00gYXBwbGljYXRpb24gcHJvZ3JhbXMgd2lsbCB1c2UgdGhpcyAKKyAqIChhbmQgb25seSB0aGlzKSBpbmNsdWRlIGZpbGUuICBJdCBpcyBteSBob3BlIHRvIHByb3ZpZGUgTGludXggd2l0aAorICogYSB1bmlmb3JtIGludGVyZmFjZSBiZXR3ZWVuIHNvZnR3YXJlIGFjY2Vzc2luZyBDRC1ST01zIGFuZCB0aGUgdmFyaW91cyAKKyAqIGRldmljZSBkcml2ZXJzIHRoYXQgYWN0dWFsbHkgdGFsayB0byB0aGUgZHJpdmVzLiAgVGhlcmUgbWF5IHN0aWxsIGJlCisgKiAyMyBkaWZmZXJlbnQga2luZHMgb2Ygc3RyYW5nZSBDRC1ST00gZHJpdmVzLCBidXQgYXQgbGVhc3QgdGhlcmUgd2lsbCAKKyAqIG5vdyBiZSBvbmUsIGFuZCBvbmx5IG9uZSwgTGludXggQ0QtUk9NIGludGVyZmFjZS4KKyAqCisgKiBBZGRpdGlvbmFsbHksIGFzIG9mIExpbnV4IDIuMS54LCBhbGwgTGludXggYXBwbGljYXRpb24gcHJvZ3JhbXMgCisgKiBzaG91bGQgdXNlIHRoZSBPX05PTkJMT0NLIG9wdGlvbiB3aGVuIG9wZW5pbmcgYSBDRC1ST00gZGV2aWNlIAorICogZm9yIHN1YnNlcXVlbnQgaW9jdGwgY29tbWFuZHMuICBUaGlzIGFsbG93cyBmb3IgbmVhdCBzeXN0ZW0gZXJyb3JzIAorICogbGlrZSAiTm8gbWVkaXVtIGZvdW5kIiBvciAiV3JvbmcgbWVkaXVtIHR5cGUiIHVwb24gYXR0ZW1wdGluZyB0byAKKyAqIG1vdW50IG9yIHBsYXkgYW4gZW1wdHkgc2xvdCwgbW91bnQgYW4gYXVkaW8gZGlzYywgb3IgcGxheSBhIGRhdGEgZGlzYy4KKyAqIEdlbmVyYWxseSwgY2hhbmdpbmcgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0byBzdXBwb3J0IE9fTk9OQkxPQ0sKKyAqIGlzIGFzIGVhc3kgYXMgdGhlIGZvbGxvd2luZzoKKyAqICAgICAgIC0gICAgZHJpdmUgPSBvcGVuKCIvZGV2L2Nkcm9tIiwgT19SRE9OTFkpOworICogICAgICAgKyAgICBkcml2ZSA9IG9wZW4oIi9kZXYvY2Ryb20iLCBPX1JET05MWSB8IE9fTk9OQkxPQ0spOworICogSXQgaXMgd29ydGggdGhlIHNtYWxsIGNoYW5nZS4KKyAqCisgKiAgUGF0Y2hlcyBmb3IgbWFueSBjb21tb24gQ0QgcHJvZ3JhbXMgKHByb3ZpZGVkIGJ5IERhdmlkIEEuIHZhbiBMZWV1d2VuKQorICogIGNhbiBiZSBmb3VuZCBhdDogIGZ0cDovL2Z0cC5nd2RnLmRlL3B1Yi9saW51eC9jZHJvbS9kcml2ZXJzL2NtMjA2LworICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogV2hlbiBhIGRyaXZlciBzdXBwb3J0cyBhIGNlcnRhaW4gZnVuY3Rpb24sIGJ1dCB0aGUgY2Ryb20gZHJpdmUgd2UgYXJlIAorICogdXNpbmcgZG9lc24ndCwgd2Ugd2lsbCByZXR1cm4gdGhlIGVycm9yIEVEUklWRV9DQU5UX0RPX1RISVMuICBXZSB3aWxsIAorICogYm9ycm93IHRoZSAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQiIGVycm9yIGZyb20gdGhlIG5ldHdvcmsgZm9sa3MgdG8gCisgKiBhY2NvbXBsaXNoIHRoaXMuICBNYXliZSBzb21lZGF5IHdlIHdpbGwgZ2V0IGEgbW9yZSB0YXJnZXRlZCBlcnJvciBjb2RlLCAKKyAqIGJ1dCB0aGlzIHdpbGwgZG8gZm9yIG5vdy4uLiAqLworI2RlZmluZSBFRFJJVkVfQ0FOVF9ET19USElTICBFT1BOT1RTVVBQCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgQ0QtUk9NIElPQ1RMIGNvbW1hbmRzICAtLSB0aGVzZSBzaG91bGQgYmUgc3VwcG9ydGVkIGJ5IAorICogYWxsIHRoZSB2YXJpb3VzIGNkcm9tIGRyaXZlcnMuICBGb3IgdGhlIENELVJPTSBpb2N0bHMsIHdlIAorICogd2lsbCBjb21tYW5kZWVyIGJ5dGUgMHg1Mywgb3IgJ1MnLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENEUk9NUEFVU0UJCTB4NTMwMSAvKiBQYXVzZSBBdWRpbyBPcGVyYXRpb24gKi8gCisjZGVmaW5lIENEUk9NUkVTVU1FCQkweDUzMDIgLyogUmVzdW1lIHBhdXNlZCBBdWRpbyBPcGVyYXRpb24gKi8KKyNkZWZpbmUgQ0RST01QTEFZTVNGCQkweDUzMDMgLyogUGxheSBBdWRpbyBNU0YgKHN0cnVjdCBjZHJvbV9tc2YpICovCisjZGVmaW5lIENEUk9NUExBWVRSS0lORAkJMHg1MzA0IC8qIFBsYXkgQXVkaW8gVHJhY2svaW5kZXggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBjZHJvbV90aSkgKi8KKyNkZWZpbmUgQ0RST01SRUFEVE9DSERSCQkweDUzMDUgLyogUmVhZCBUT0MgaGVhZGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY2Ryb21fdG9jaGRyKSAqLworI2RlZmluZSBDRFJPTVJFQURUT0NFTlRSWQkweDUzMDYgLyogUmVhZCBUT0MgZW50cnkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBjZHJvbV90b2NlbnRyeSkgKi8KKyNkZWZpbmUgQ0RST01TVE9QCQkweDUzMDcgLyogU3RvcCB0aGUgY2Ryb20gZHJpdmUgKi8KKyNkZWZpbmUgQ0RST01TVEFSVAkJMHg1MzA4IC8qIFN0YXJ0IHRoZSBjZHJvbSBkcml2ZSAqLworI2RlZmluZSBDRFJPTUVKRUNUCQkweDUzMDkgLyogRWplY3RzIHRoZSBjZHJvbSBtZWRpYSAqLworI2RlZmluZSBDRFJPTVZPTENUUkwJCTB4NTMwYSAvKiBDb250cm9sIG91dHB1dCB2b2x1bWUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBjZHJvbV92b2xjdHJsKSAqLworI2RlZmluZSBDRFJPTVNVQkNITkwJCTB4NTMwYiAvKiBSZWFkIHN1YmNoYW5uZWwgZGF0YSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGNkcm9tX3N1YmNobmwpICovCisjZGVmaW5lIENEUk9NUkVBRE1PREUyCQkweDUzMGMgLyogUmVhZCBDRFJPTSBtb2RlIDIgZGF0YSAoMjMzNiBCeXRlcykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBjZHJvbV9yZWFkKSAqLworI2RlZmluZSBDRFJPTVJFQURNT0RFMQkJMHg1MzBkIC8qIFJlYWQgQ0RST00gbW9kZSAxIGRhdGEgKDIwNDggQnl0ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBjZHJvbV9yZWFkKSAqLworI2RlZmluZSBDRFJPTVJFQURBVURJTwkJMHg1MzBlIC8qIChzdHJ1Y3QgY2Ryb21fcmVhZF9hdWRpbykgKi8KKyNkZWZpbmUgQ0RST01FSkVDVF9TVwkJMHg1MzBmIC8qIGVuYWJsZSgxKS9kaXNhYmxlKDApIGF1dG8tZWplY3RpbmcgKi8KKyNkZWZpbmUgQ0RST01NVUxUSVNFU1NJT04JMHg1MzEwIC8qIE9idGFpbiB0aGUgc3RhcnQtb2YtbGFzdC1zZXNzaW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgb2YgbXVsdGkgc2Vzc2lvbiBkaXNrcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGNkcm9tX211bHRpc2Vzc2lvbikgKi8KKyNkZWZpbmUgQ0RST01fR0VUX01DTgkJMHg1MzExIC8qIE9idGFpbiB0aGUgIlVuaXZlcnNhbCBQcm9kdWN0IENvZGUiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGF2YWlsYWJsZSAoc3RydWN0IGNkcm9tX21jbikgKi8KKyNkZWZpbmUgQ0RST01fR0VUX1VQQwkJQ0RST01fR0VUX01DTiAgLyogVGhpcyBvbmUgaXMgZGVwcmVjYXRlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaGVyZSBhbnl3YXkgZm9yIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgQ0RST01SRVNFVAkJMHg1MzEyIC8qIGhhcmQtcmVzZXQgdGhlIGRyaXZlICovCisjZGVmaW5lIENEUk9NVk9MUkVBRAkJMHg1MzEzIC8qIEdldCB0aGUgZHJpdmUncyB2b2x1bWUgc2V0dGluZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY2Ryb21fdm9sY3RybCkgKi8KKyNkZWZpbmUgQ0RST01SRUFEUkFXCQkweDUzMTQJLyogcmVhZCBkYXRhIGluIHJhdyBtb2RlICgyMzUyIEJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY2Ryb21fcmVhZCkgKi8KKy8qIAorICogVGhlc2UgaW9jdGxzIGFyZSB1c2VkIG9ubHkgdXNlZCBpbiBhenRjZC5jIGFuZCBvcHRjZC5jCisgKi8KKyNkZWZpbmUgQ0RST01SRUFEQ09PS0VECQkweDUzMTUJLyogcmVhZCBkYXRhIGluIGNvb2tlZCBtb2RlICovCisjZGVmaW5lIENEUk9NU0VFSwkJMHg1MzE2ICAvKiBzZWVrIG1zZiBhZGRyZXNzICovCisgIAorLyoKKyAqIFRoaXMgaW9jdGwgaXMgb25seSB1c2VkIGJ5IHRoZSBzY3NpLWNkIGRyaXZlci4gIAorICAgSXQgaXMgZm9yIHBsYXlpbmcgYXVkaW8gaW4gbG9naWNhbCBibG9jayBhZGRyZXNzaW5nIG1vZGUuCisgKi8KKyNkZWZpbmUgQ0RST01QTEFZQkxLCQkweDUzMTcJLyogKHN0cnVjdCBjZHJvbV9ibGspICovCisKKy8qIAorICogVGhlc2UgaW9jdGxzIGFyZSBvbmx5IHVzZWQgaW4gb3B0Y2QuYworICovCisjZGVmaW5lIENEUk9NUkVBREFMTAkJMHg1MzE4CS8qIHJlYWQgYWxsIDI2NDYgYnl0ZXMgKi8KKworLyogCisgKiBUaGVzZSBpb2N0bHMgYXJlIChub3cpIG9ubHkgaW4gaWRlLWNkLmMgZm9yIGNvbnRyb2xsaW5nIAorICogZHJpdmUgc3BpbmRvd24gdGltZS4gIFRoZXkgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZQorICogVW5pZm9ybSBkcml2ZXIsIHZpYSBnZW5lcmljIHBhY2tldCBjb21tYW5kcywgR1BDTURfTU9ERV9TRUxFQ1RfMTAsCisgKiBHUENNRF9NT0RFX1NFTlNFXzEwIGFuZCB0aGUgR1BNT0RFX1BPV0VSX1BBR0UuLi4KKyAqICAtRXJpaworICovCisjZGVmaW5lIENEUk9NR0VUU1BJTkRPV04gICAgICAgIDB4NTMxZAorI2RlZmluZSBDRFJPTVNFVFNQSU5ET1dOICAgICAgICAweDUzMWUKKworLyogCisgKiBUaGVzZSBpb2N0bHMgYXJlIGltcGxlbWVudGVkIHRocm91Z2ggdGhlIHVuaWZvcm0gQ0QtUk9NIGRyaXZlcgorICogVGhleSBfd2lsbF8gYmUgYWRvcHRlZCBieSBhbGwgQ0QtUk9NIGRyaXZlcnMsIHdoZW4gYWxsIHRoZSBDRC1ST00KKyAqIGRyaXZlcnMgYXJlIGV2ZW50dWFsbHkgcG9ydGVkIHRvIHRoZSB1bmlmb3JtIENELVJPTSBkcml2ZXIgaW50ZXJmYWNlLgorICovCisjZGVmaW5lIENEUk9NQ0xPU0VUUkFZCQkweDUzMTkJLyogcGVuZGFudCBvZiBDRFJPTUVKRUNUICovCisjZGVmaW5lIENEUk9NX1NFVF9PUFRJT05TCTB4NTMyMCAgLyogU2V0IGJlaGF2aW9yIG9wdGlvbnMgKi8KKyNkZWZpbmUgQ0RST01fQ0xFQVJfT1BUSU9OUwkweDUzMjEgIC8qIENsZWFyIGJlaGF2aW9yIG9wdGlvbnMgKi8KKyNkZWZpbmUgQ0RST01fU0VMRUNUX1NQRUVECTB4NTMyMiAgLyogU2V0IHRoZSBDRC1ST00gc3BlZWQgKi8KKyNkZWZpbmUgQ0RST01fU0VMRUNUX0RJU0MJMHg1MzIzICAvKiBTZWxlY3QgZGlzYyAoZm9yIGp1a2UtYm94ZXMpICovCisjZGVmaW5lIENEUk9NX01FRElBX0NIQU5HRUQJMHg1MzI1ICAvKiBDaGVjayBpcyBtZWRpYSBjaGFuZ2VkICAqLworI2RlZmluZSBDRFJPTV9EUklWRV9TVEFUVVMJMHg1MzI2ICAvKiBHZXQgdHJheSBwb3NpdGlvbiwgZXRjLiAqLworI2RlZmluZSBDRFJPTV9ESVNDX1NUQVRVUwkweDUzMjcgIC8qIEdldCBkaXNjIHR5cGUsIGV0Yy4gKi8KKyNkZWZpbmUgQ0RST01fQ0hBTkdFUl9OU0xPVFMgICAgMHg1MzI4ICAvKiBHZXQgbnVtYmVyIG9mIHNsb3RzICovCisjZGVmaW5lIENEUk9NX0xPQ0tET09SCQkweDUzMjkgIC8qIGxvY2sgb3IgdW5sb2NrIGRvb3IgKi8KKyNkZWZpbmUgQ0RST01fREVCVUcJCTB4NTMzMAkvKiBUdXJuIGRlYnVnIG1lc3NhZ2VzIG9uL29mZiAqLworI2RlZmluZSBDRFJPTV9HRVRfQ0FQQUJJTElUWQkweDUzMzEJLyogZ2V0IGNhcGFiaWxpdGllcyAqLworCisvKiBOb3RlIHRoYXQgc2NzaS9zY3NpX2lvY3RsLmggYWxzbyB1c2VzIDB4NTM4MiAtIDB4NTM4Ni4KKyAqIEZ1dHVyZSBDRFJPTSBpb2N0bHMgc2hvdWxkIGJlIGtlcHQgYmVsb3cgMHg1MzdGCisgKi8KKworLyogVGhpcyBpb2N0bCBpcyBvbmx5IHVzZWQgYnkgc2JwY2QgYXQgdGhlIG1vbWVudCAqLworI2RlZmluZSBDRFJPTUFVRElPQlVGU0laICAgICAgICAweDUzODIJLyogc2V0IHRoZSBhdWRpbyBidWZmZXIgc2l6ZSAqLworCQkJCQkvKiBjb25mbGljdCB3aXRoIFNDU0lfSU9DVExfR0VUX0lETFVOICovCisKKy8qIERWRC1ST00gU3BlY2lmaWMgaW9jdGxzICovCisjZGVmaW5lIERWRF9SRUFEX1NUUlVDVAkJMHg1MzkwICAvKiBSZWFkIHN0cnVjdHVyZSAqLworI2RlZmluZSBEVkRfV1JJVEVfU1RSVUNUCTB4NTM5MSAgLyogV3JpdGUgc3RydWN0dXJlICovCisjZGVmaW5lIERWRF9BVVRICQkweDUzOTIgIC8qIEF1dGhlbnRpY2F0aW9uICovCisKKyNkZWZpbmUgQ0RST01fU0VORF9QQUNLRVQJMHg1MzkzCS8qIHNlbmQgYSBwYWNrZXQgdG8gdGhlIGRyaXZlICovCisjZGVmaW5lIENEUk9NX05FWFRfV1JJVEFCTEUJMHg1Mzk0CS8qIGdldCBuZXh0IHdyaXRhYmxlIGJsb2NrICovCisjZGVmaW5lIENEUk9NX0xBU1RfV1JJVFRFTgkweDUzOTUJLyogZ2V0IGxhc3QgYmxvY2sgd3JpdHRlbiBvbiBkaXNjICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDRFJPTSBJT0NUTCBzdHJ1Y3R1cmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQWRkcmVzcyBpbiBNU0YgZm9ybWF0ICovCitzdHJ1Y3QgY2Ryb21fbXNmMAkJCit7CisJX191OAltaW51dGU7CisJX191OAlzZWNvbmQ7CisJX191OAlmcmFtZTsKK307CisKKy8qIEFkZHJlc3MgaW4gZWl0aGVyIE1TRiBvciBsb2dpY2FsIGZvcm1hdCAqLwordW5pb24gY2Ryb21fYWRkcgkJCit7CisJc3RydWN0IGNkcm9tX21zZjAJbXNmOworCWludAkJCWxiYTsKK307CisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgYnkgdGhlIENEUk9NUExBWU1TRiBpb2N0bCAqLyAKK3N0cnVjdCBjZHJvbV9tc2YgCit7CisJX191OAljZG1zZl9taW4wOwkvKiBzdGFydCBtaW51dGUgKi8KKwlfX3U4CWNkbXNmX3NlYzA7CS8qIHN0YXJ0IHNlY29uZCAqLworCV9fdTgJY2Rtc2ZfZnJhbWUwOwkvKiBzdGFydCBmcmFtZSAqLworCV9fdTgJY2Rtc2ZfbWluMTsJLyogZW5kIG1pbnV0ZSAqLworCV9fdTgJY2Rtc2Zfc2VjMTsJLyogZW5kIHNlY29uZCAqLworCV9fdTgJY2Rtc2ZfZnJhbWUxOwkvKiBlbmQgZnJhbWUgKi8KK307CisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgYnkgdGhlIENEUk9NUExBWVRSS0lORCBpb2N0bCAqLworc3RydWN0IGNkcm9tX3RpIAoreworCV9fdTgJY2R0aV90cmswOwkvKiBzdGFydCB0cmFjayAqLworCV9fdTgJY2R0aV9pbmQwOwkvKiBzdGFydCBpbmRleCAqLworCV9fdTgJY2R0aV90cmsxOwkvKiBlbmQgdHJhY2sgKi8KKwlfX3U4CWNkdGlfaW5kMTsJLyogZW5kIGluZGV4ICovCit9OworCisvKiBUaGlzIHN0cnVjdCBpcyB1c2VkIGJ5IHRoZSBDRFJPTVJFQURUT0NIRFIgaW9jdGwgKi8KK3N0cnVjdCBjZHJvbV90b2NoZHIgCQoreworCV9fdTgJY2R0aF90cmswOwkvKiBzdGFydCB0cmFjayAqLworCV9fdTgJY2R0aF90cmsxOwkvKiBlbmQgdHJhY2sgKi8KK307CisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgYnkgdGhlIENEUk9NVk9MQ1RSTCBhbmQgQ0RST01WT0xSRUFEIGlvY3RscyAqLworc3RydWN0IGNkcm9tX3ZvbGN0cmwKK3sKKwlfX3U4CWNoYW5uZWwwOworCV9fdTgJY2hhbm5lbDE7CisJX191OAljaGFubmVsMjsKKwlfX3U4CWNoYW5uZWwzOworfTsKKworLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCBieSB0aGUgQ0RST01TVUJDSE5MIGlvY3RsICovCitzdHJ1Y3QgY2Ryb21fc3ViY2hubCAKK3sKKwlfX3U4CWNkc2NfZm9ybWF0OworCV9fdTgJY2RzY19hdWRpb3N0YXR1czsKKwlfX3U4CWNkc2NfYWRyOgk0OworCV9fdTgJY2RzY19jdHJsOgk0OworCV9fdTgJY2RzY190cms7CisJX191OAljZHNjX2luZDsKKwl1bmlvbiBjZHJvbV9hZGRyIGNkc2NfYWJzYWRkcjsKKwl1bmlvbiBjZHJvbV9hZGRyIGNkc2NfcmVsYWRkcjsKK307CisKKworLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCBieSB0aGUgQ0RST01SRUFEVE9DRU5UUlkgaW9jdGwgKi8KK3N0cnVjdCBjZHJvbV90b2NlbnRyeSAKK3sKKwlfX3U4CWNkdGVfdHJhY2s7CisJX191OAljZHRlX2Fkcgk6NDsKKwlfX3U4CWNkdGVfY3RybAk6NDsKKwlfX3U4CWNkdGVfZm9ybWF0OworCXVuaW9uIGNkcm9tX2FkZHIgY2R0ZV9hZGRyOworCV9fdTgJY2R0ZV9kYXRhbW9kZTsKK307CisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgYnkgdGhlIENEUk9NUkVBRE1PREUxLCBhbmQgQ0RST01SRUFETU9ERTIgaW9jdGxzICovCitzdHJ1Y3QgY2Ryb21fcmVhZCAgICAgIAoreworCWludAljZHJlYWRfbGJhOworCWNoYXIgCSpjZHJlYWRfYnVmYWRkcjsKKwlpbnQJY2RyZWFkX2J1ZmxlbjsKK307CisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgYnkgdGhlIENEUk9NUkVBREFVRElPIGlvY3RsICovCitzdHJ1Y3QgY2Ryb21fcmVhZF9hdWRpbworeworCXVuaW9uIGNkcm9tX2FkZHIgYWRkcjsgLyogZnJhbWUgYWRkcmVzcyAqLworCV9fdTggYWRkcl9mb3JtYXQ7ICAgICAgLyogQ0RST01fTEJBIG9yIENEUk9NX01TRiAqLworCWludCBuZnJhbWVzOyAgICAgICAgICAgLyogbnVtYmVyIG9mIDIzNTItYnl0ZS1mcmFtZXMgdG8gcmVhZCBhdCBvbmNlICovCisJX191OCAqYnVmOyAgICAgIC8qIGZyYW1lIGJ1ZmZlciAoc2l6ZTogbmZyYW1lcyoyMzUyIGJ5dGVzKSAqLworfTsKKworLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB3aXRoIHRoZSBDRFJPTU1VTFRJU0VTU0lPTiBpb2N0bCAqLworc3RydWN0IGNkcm9tX211bHRpc2Vzc2lvbgoreworCXVuaW9uIGNkcm9tX2FkZHIgYWRkcjsgLyogZnJhbWUgYWRkcmVzczogc3RhcnQtb2YtbGFzdC1zZXNzaW9uIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgdGhlIG5ldyAiZnJhbWUgMTYiISkuICBPbmx5IHZhbGlkCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlICJ4YV9mbGFnIiBpcyB0cnVlLiAqLworCV9fdTggeGFfZmxhZzsgICAgICAgIC8qIDE6ICJpcyBYQSBkaXNrIiAqLworCV9fdTggYWRkcl9mb3JtYXQ7ICAgIC8qIENEUk9NX0xCQSBvciBDRFJPTV9NU0YgKi8KK307CisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgd2l0aCB0aGUgQ0RST01fR0VUX01DTiBpb2N0bC4gIAorICogVmVyeSBmZXcgYXVkaW8gZGlzY3MgYWN0dWFsbHkgaGF2ZSBVbml2ZXJzYWwgUHJvZHVjdCBDb2RlIGluZm9ybWF0aW9uLCAKKyAqIHdoaWNoIHNob3VsZCBqdXN0IGJlIHRoZSBNZWRpdW0gQ2F0YWxvZyBOdW1iZXIgb24gdGhlIGJveC4gIEFsc28gbm90ZSAKKyAqIHRoYXQgdGhlIHdheSB0aGUgY29kZWlzIHdyaXR0ZW4gb24gQ0QgaXMgX25vdF8gdW5pZm9ybSBhY3Jvc3MgYWxsIGRpc2NzIQorICovICAKK3N0cnVjdCBjZHJvbV9tY24gCit7CisgIF9fdTggbWVkaXVtX2NhdGFsb2dfbnVtYmVyWzE0XTsgLyogMTMgQVNDSUkgZGlnaXRzLCBudWxsLXRlcm1pbmF0ZWQgKi8KK307CisKKy8qIFRoaXMgaXMgdXNlZCBieSB0aGUgQ0RST01QTEFZQkxLIGlvY3RsICovCitzdHJ1Y3QgY2Ryb21fYmxrIAoreworCXVuc2lnbmVkIGZyb207CisJdW5zaWduZWQgc2hvcnQgbGVuOworfTsKKworI2RlZmluZSBDRFJPTV9QQUNLRVRfU0laRQkxMgorCisjZGVmaW5lIENHQ19EQVRBX1VOS05PV04JMAorI2RlZmluZSBDR0NfREFUQV9XUklURQkJMQorI2RlZmluZSBDR0NfREFUQV9SRUFECQkyCisjZGVmaW5lIENHQ19EQVRBX05PTkUJCTMKKworLyogZm9yIENEUk9NX1BBQ0tFVF9DT01NQU5EIGlvY3RsICovCitzdHJ1Y3QgY2Ryb21fZ2VuZXJpY19jb21tYW5kCit7CisJdW5zaWduZWQgY2hhciAJCWNtZFtDRFJPTV9QQUNLRVRfU0laRV07CisJdW5zaWduZWQgY2hhcgkJKmJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgCQlidWZsZW47CisJaW50CQkJc3RhdDsKKwlzdHJ1Y3QgcmVxdWVzdF9zZW5zZQkqc2Vuc2U7CisJdW5zaWduZWQgY2hhcgkJZGF0YV9kaXJlY3Rpb247CisJaW50CQkJcXVpZXQ7CisJaW50CQkJdGltZW91dDsKKwl2b2lkCQkJKnJlc2VydmVkWzFdOwkvKiB1bnVzZWQsIGFjdHVhbGx5ICovCit9OworCisvKgorICogQSBDRC1ST00gcGh5c2ljYWwgc2VjdG9yIHNpemUgaXMgMjA0OCwgMjA1MiwgMjA1NiwgMjMyNCwgMjMzMiwgMjMzNiwgCisgKiAyMzQwLCBvciAyMzUyIGJ5dGVzIGxvbmcuICAKKworKiAgICAgICAgIFNlY3RvciB0eXBlcyBvZiB0aGUgc3RhbmRhcmQgQ0QtUk9NIGRhdGEgZm9ybWF0czoKKyAqCisgKiBmb3JtYXQgICBzZWN0b3IgdHlwZSAgICAgICAgICAgICAgIHVzZXIgZGF0YSBzaXplIChieXRlcykKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIDEgICAgIChSZWQgQm9vaykgICAgQ0QtREEgICAgICAgICAgMjM1MiAgICAoQ0RfRlJBTUVTSVpFX1JBVykKKyAqICAgMiAgICAgKFllbGxvdyBCb29rKSBNb2RlMSBGb3JtMSAgICAyMDQ4ICAgIChDRF9GUkFNRVNJWkUpCisgKiAgIDMgICAgIChZZWxsb3cgQm9vaykgTW9kZTEgRm9ybTIgICAgMjMzNiAgICAoQ0RfRlJBTUVTSVpFX1JBVzApCisgKiAgIDQgICAgIChHcmVlbiBCb29rKSAgTW9kZTIgRm9ybTEgICAgMjA0OCAgICAoQ0RfRlJBTUVTSVpFKQorICogICA1ICAgICAoR3JlZW4gQm9vaykgIE1vZGUyIEZvcm0yICAgIDIzMjggICAgKDIzMjQrNCBzcGFyZSBieXRlcykKKyAqCisgKgorICogICAgICAgVGhlIGxheW91dCBvZiB0aGUgc3RhbmRhcmQgQ0QtUk9NIGRhdGEgZm9ybWF0czoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAtIGF1ZGlvIChyZWQpOiAgICAgICAgICAgICAgICAgIHwgYXVkaW9fc2FtcGxlX2J5dGVzIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgMjM1MiAgICAgICAgfAorICoKKyAqIC0gZGF0YSAoeWVsbG93LCBtb2RlMSk6ICAgICAgICAgfCBzeW5jIC0gaGVhZCAtIGRhdGEgLSBFREMgLSB6ZXJvIC0gRUNDIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTIgIC0gICA0ICAtIDIwNDggLSAgNCAgLSAgIDggIC0gMjc2IHwKKyAqCisgKiAtIGRhdGEgKHllbGxvdywgbW9kZTIpOiAgICAgICAgIHwgc3luYyAtIGhlYWQgLSBkYXRhIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTIgIC0gICA0ICAtIDIzMzYgfAorICoKKyAqIC0gWEEgZGF0YSAoZ3JlZW4sIG1vZGUyIGZvcm0xKTogfCBzeW5jIC0gaGVhZCAtIHN1YiAtIGRhdGEgLSBFREMgLSBFQ0MgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMiAgLSAgIDQgIC0gIDggIC0gMjA0OCAtICA0ICAtIDI3NiB8CisgKgorICogLSBYQSBkYXRhIChncmVlbiwgbW9kZTIgZm9ybTIpOiB8IHN5bmMgLSBoZWFkIC0gc3ViIC0gZGF0YSAtIFNwYXJlIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTIgIC0gICA0ICAtICA4ICAtIDIzMjQgLSAgNCAgICB8CisgKgorICovCisKKy8qIFNvbWUgZ2VuZXJhbGx5IHVzZWZ1bCBDRC1ST00gaW5mb3JtYXRpb24gLS0gbW9zdGx5IGJhc2VkIG9uIHRoZSBhYm92ZSAqLworI2RlZmluZSBDRF9NSU5TICAgICAgICAgICAgICA3NCAvKiBtYXguIG1pbnV0ZXMgcGVyIENELCBub3QgcmVhbGx5IGEgbGltaXQgKi8KKyNkZWZpbmUgQ0RfU0VDUyAgICAgICAgICAgICAgNjAgLyogc2Vjb25kcyBwZXIgbWludXRlICovCisjZGVmaW5lIENEX0ZSQU1FUyAgICAgICAgICAgIDc1IC8qIGZyYW1lcyBwZXIgc2Vjb25kICovCisjZGVmaW5lIENEX1NZTkNfU0laRSAgICAgICAgIDEyIC8qIDEyIHN5bmMgYnl0ZXMgcGVyIHJhdyBkYXRhIGZyYW1lICovCisjZGVmaW5lIENEX01TRl9PRkZTRVQgICAgICAgMTUwIC8qIE1TRiBudW1iZXJpbmcgb2Zmc2V0IG9mIGZpcnN0IGZyYW1lICovCisjZGVmaW5lIENEX0NIVU5LX1NJWkUgICAgICAgIDI0IC8qIGxvd2VzdC1sZXZlbCAiZGF0YSBieXRlcyBwaWVjZSIgKi8KKyNkZWZpbmUgQ0RfTlVNX09GX0NIVU5LUyAgICAgOTggLyogY2h1bmtzIHBlciBmcmFtZSAqLworI2RlZmluZSBDRF9GUkFNRVNJWkVfU1VCICAgICA5NiAvKiBzdWJjaGFubmVsIGRhdGEgImZyYW1lIiBzaXplICovCisjZGVmaW5lIENEX0hFQURfU0laRSAgICAgICAgICA0IC8qIGhlYWRlciAoYWRkcmVzcykgYnl0ZXMgcGVyIHJhdyBkYXRhIGZyYW1lICovCisjZGVmaW5lIENEX1NVQkhFQURfU0laRSAgICAgICA4IC8qIHN1YmhlYWRlciBieXRlcyBwZXIgcmF3IFhBIGRhdGEgZnJhbWUgKi8KKyNkZWZpbmUgQ0RfRURDX1NJWkUgICAgICAgICAgIDQgLyogYnl0ZXMgRURDIHBlciBtb3N0IHJhdyBkYXRhIGZyYW1lIHR5cGVzICovCisjZGVmaW5lIENEX1pFUk9fU0laRSAgICAgICAgICA4IC8qIGJ5dGVzIHplcm8gcGVyIHllbGxvdyBib29rIG1vZGUgMSBmcmFtZSAqLworI2RlZmluZSBDRF9FQ0NfU0laRSAgICAgICAgIDI3NiAvKiBieXRlcyBFQ0MgcGVyIG1vc3QgcmF3IGRhdGEgZnJhbWUgdHlwZXMgKi8KKyNkZWZpbmUgQ0RfRlJBTUVTSVpFICAgICAgIDIwNDggLyogYnl0ZXMgcGVyIGZyYW1lLCAiY29va2VkIiBtb2RlICovCisjZGVmaW5lIENEX0ZSQU1FU0laRV9SQVcgICAyMzUyIC8qIGJ5dGVzIHBlciBmcmFtZSwgInJhdyIgbW9kZSAqLworI2RlZmluZSBDRF9GUkFNRVNJWkVfUkFXRVIgMjY0NiAvKiBUaGUgbWF4aW11bSBwb3NzaWJsZSByZXR1cm5lZCBieXRlcyAqLyAKKy8qIG1vc3QgZHJpdmVzIGRvbid0IGRlbGl2ZXIgZXZlcnl0aGluZzogKi8KKyNkZWZpbmUgQ0RfRlJBTUVTSVpFX1JBVzEgKENEX0ZSQU1FU0laRV9SQVctQ0RfU1lOQ19TSVpFKSAvKjIzNDAqLworI2RlZmluZSBDRF9GUkFNRVNJWkVfUkFXMCAoQ0RfRlJBTUVTSVpFX1JBVy1DRF9TWU5DX1NJWkUtQ0RfSEVBRF9TSVpFKSAvKjIzMzYqLworCisjZGVmaW5lIENEX1hBX0hFQUQgICAgICAgIChDRF9IRUFEX1NJWkUrQ0RfU1VCSEVBRF9TSVpFKSAvKiAiYmVmb3JlIGRhdGEiIHBhcnQgb2YgcmF3IFhBIGZyYW1lICovCisjZGVmaW5lIENEX1hBX1RBSUwgICAgICAgIChDRF9FRENfU0laRStDRF9FQ0NfU0laRSkgLyogImFmdGVyIGRhdGEiIHBhcnQgb2YgcmF3IFhBIGZyYW1lICovCisjZGVmaW5lIENEX1hBX1NZTkNfSEVBRCAgIChDRF9TWU5DX1NJWkUrQ0RfWEFfSEVBRCkgLyogc3luYyBieXRlcyArIGhlYWRlciBvZiBYQSBmcmFtZSAqLworCisvKiBDRC1ST00gYWRkcmVzcyB0eXBlcyAoY2Ryb21fdG9jZW50cnkuY2R0ZV9mb3JtYXQpICovCisjZGVmaW5lCUNEUk9NX0xCQSAweDAxIC8qICJsb2dpY2FsIGJsb2NrIjogZmlyc3QgZnJhbWUgaXMgIzAgKi8KKyNkZWZpbmUJQ0RST01fTVNGIDB4MDIgLyogIm1pbnV0ZS1zZWNvbmQtZnJhbWUiOiBiaW5hcnksIG5vdCBiY2QgaGVyZSEgKi8KKworLyogYml0IHRvIHRlbGwgd2hldGhlciB0cmFjayBpcyBkYXRhIG9yIGF1ZGlvIChjZHJvbV90b2NlbnRyeS5jZHRlX2N0cmwpICovCisjZGVmaW5lCUNEUk9NX0RBVEFfVFJBQ0sJMHgwNAorCisvKiBUaGUgbGVhZG91dCB0cmFjayBpcyBhbHdheXMgMHhBQSwgcmVnYXJkbGVzcyBvZiAjIG9mIHRyYWNrcyBvbiBkaXNjICovCisjZGVmaW5lCUNEUk9NX0xFQURPVVQJCTB4QUEKKworLyogYXVkaW8gc3RhdGVzIChmcm9tIFNDU0ktMiwgYnV0IHNlZW4gd2l0aCBvdGhlciBkcml2ZXMsIHRvbykgKi8KKyNkZWZpbmUJQ0RST01fQVVESU9fSU5WQUxJRAkweDAwCS8qIGF1ZGlvIHN0YXR1cyBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lCUNEUk9NX0FVRElPX1BMQVkJMHgxMQkvKiBhdWRpbyBwbGF5IG9wZXJhdGlvbiBpbiBwcm9ncmVzcyAqLworI2RlZmluZQlDRFJPTV9BVURJT19QQVVTRUQJMHgxMgkvKiBhdWRpbyBwbGF5IG9wZXJhdGlvbiBwYXVzZWQgKi8KKyNkZWZpbmUJQ0RST01fQVVESU9fQ09NUExFVEVECTB4MTMJLyogYXVkaW8gcGxheSBzdWNjZXNzZnVsbHkgY29tcGxldGVkICovCisjZGVmaW5lCUNEUk9NX0FVRElPX0VSUk9SCTB4MTQJLyogYXVkaW8gcGxheSBzdG9wcGVkIGR1ZSB0byBlcnJvciAqLworI2RlZmluZQlDRFJPTV9BVURJT19OT19TVEFUVVMJMHgxNQkvKiBubyBjdXJyZW50IGF1ZGlvIHN0YXR1cyB0byByZXR1cm4gKi8KKworLyogY2FwYWJpbGl0eSBmbGFncyB1c2VkIHdpdGggdGhlIHVuaWZvcm0gQ0QtUk9NIGRyaXZlciAqLyAKKyNkZWZpbmUgQ0RDX0NMT1NFX1RSQVkJCTB4MSAgICAgLyogY2FkZHkgc3lzdGVtcyBfY2FuJ3RfIGNsb3NlICovCisjZGVmaW5lIENEQ19PUEVOX1RSQVkJCTB4MiAgICAgLyogYnV0IF9jYW5fIGVqZWN0LiAgKi8KKyNkZWZpbmUgQ0RDX0xPQ0sJCTB4NCAgICAgLyogZGlzYWJsZSBtYW51YWwgZWplY3QgKi8KKyNkZWZpbmUgQ0RDX1NFTEVDVF9TUEVFRCAJMHg4ICAgICAvKiBwcm9ncmFtbWFibGUgc3BlZWQgKi8KKyNkZWZpbmUgQ0RDX1NFTEVDVF9ESVNDCQkweDEwICAgIC8qIHNlbGVjdCBkaXNjIGZyb20ganVrZS1ib3ggKi8KKyNkZWZpbmUgQ0RDX01VTFRJX1NFU1NJT04gCTB4MjAgICAgLyogcmVhZCBzZXNzaW9ucz4xICovCisjZGVmaW5lIENEQ19NQ04JCQkweDQwICAgIC8qIE1lZGl1bSBDYXRhbG9nIE51bWJlciAqLworI2RlZmluZSBDRENfTUVESUFfQ0hBTkdFRCAJMHg4MCAgICAvKiBtZWRpYSBjaGFuZ2VkICovCisjZGVmaW5lIENEQ19QTEFZX0FVRElPCQkweDEwMCAgIC8qIGF1ZGlvIGZ1bmN0aW9ucyAqLworI2RlZmluZSBDRENfUkVTRVQgICAgICAgICAgICAgICAweDIwMCAgIC8qIGhhcmQgcmVzZXQgZGV2aWNlICovCisjZGVmaW5lIENEQ19EUklWRV9TVEFUVVMgICAgICAgIDB4ODAwICAgLyogZHJpdmVyIGltcGxlbWVudHMgZHJpdmUgc3RhdHVzICovCisjZGVmaW5lIENEQ19HRU5FUklDX1BBQ0tFVAkweDEwMDAJLyogZHJpdmVyIGltcGxlbWVudHMgZ2VuZXJpYyBwYWNrZXRzICovCisjZGVmaW5lIENEQ19DRF9SCQkweDIwMDAJLyogZHJpdmUgaXMgYSBDRC1SICovCisjZGVmaW5lIENEQ19DRF9SVwkJMHg0MDAwCS8qIGRyaXZlIGlzIGEgQ0QtUlcgKi8KKyNkZWZpbmUgQ0RDX0RWRAkJCTB4ODAwMAkvKiBkcml2ZSBpcyBhIERWRCAqLworI2RlZmluZSBDRENfRFZEX1IJCTB4MTAwMDAJLyogZHJpdmUgY2FuIHdyaXRlIERWRC1SICovCisjZGVmaW5lIENEQ19EVkRfUkFNCQkweDIwMDAwCS8qIGRyaXZlIGNhbiB3cml0ZSBEVkQtUkFNICovCisjZGVmaW5lIENEQ19NT19EUklWRQkJMHg0MDAwMCAvKiBkcml2ZSBpcyBhbiBNTyBkZXZpY2UgKi8KKyNkZWZpbmUgQ0RDX01SVwkJCTB4ODAwMDAgLyogZHJpdmUgY2FuIHJlYWQgTVJXICovCisjZGVmaW5lIENEQ19NUldfVwkJMHgxMDAwMDAgLyogZHJpdmUgY2FuIHdyaXRlIE1SVyAqLworI2RlZmluZSBDRENfUkFNCQkJMHgyMDAwMDAgLyogb2sgdG8gb3BlbiBmb3IgV1JJVEUgKi8KKworLyogZHJpdmUgc3RhdHVzIHBvc3NpYmlsaXRpZXMgcmV0dXJuZWQgYnkgQ0RST01fRFJJVkVfU1RBVFVTIGlvY3RsICovCisjZGVmaW5lIENEU19OT19JTkZPCQkwCS8qIGlmIG5vdCBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBDRFNfTk9fRElTQwkJMQorI2RlZmluZSBDRFNfVFJBWV9PUEVOCQkyCisjZGVmaW5lIENEU19EUklWRV9OT1RfUkVBRFkJMworI2RlZmluZSBDRFNfRElTQ19PSwkJNAorCisvKiByZXR1cm4gdmFsdWVzIGZvciB0aGUgQ0RST01fRElTQ19TVEFUVVMgaW9jdGwgKi8KKy8qIGNhbiBhbHNvIHJldHVybiBDRFNfTk9fW0lORk98RElTQ10sIGZyb20gYWJvdmUgKi8KKyNkZWZpbmUgQ0RTX0FVRElPCQkxMDAKKyNkZWZpbmUgQ0RTX0RBVEFfMQkJMTAxCisjZGVmaW5lIENEU19EQVRBXzIJCTEwMgorI2RlZmluZSBDRFNfWEFfMl8xCQkxMDMKKyNkZWZpbmUgQ0RTX1hBXzJfMgkJMTA0CisjZGVmaW5lIENEU19NSVhFRAkJMTA1CisKKy8qIFVzZXItY29uZmlndXJhYmxlIGJlaGF2aW9yIG9wdGlvbnMgZm9yIHRoZSB1bmlmb3JtIENELVJPTSBkcml2ZXIgKi8KKyNkZWZpbmUgQ0RPX0FVVE9fQ0xPU0UJCTB4MSAgICAgLyogY2xvc2UgdHJheSBvbiBmaXJzdCBvcGVuKCkgKi8KKyNkZWZpbmUgQ0RPX0FVVE9fRUpFQ1QJCTB4MiAgICAgLyogb3BlbiB0cmF5IG9uIGxhc3QgcmVsZWFzZSgpICovCisjZGVmaW5lIENET19VU0VfRkZMQUdTCQkweDQgICAgIC8qIHVzZSBPX05PTkJMT0NLIGluZm9ybWF0aW9uIG9uIG9wZW4gKi8KKyNkZWZpbmUgQ0RPX0xPQ0sJCTB4OCAgICAgLyogbG9jayB0cmF5IG9uIG9wZW4gZmlsZXMgKi8KKyNkZWZpbmUgQ0RPX0NIRUNLX1RZUEUJCTB4MTAgICAgLyogY2hlY2sgdHlwZSBvbiBvcGVuIGZvciBkYXRhICovCisKKy8qIFNwZWNpYWwgY29kZXMgdXNlZCB3aGVuIHNwZWNpZnlpbmcgY2hhbmdlciBzbG90cy4gKi8KKyNkZWZpbmUgQ0RTTF9OT05FICAgICAgIAkoSU5UX01BWC0xKQorI2RlZmluZSBDRFNMX0NVUlJFTlQgICAgCUlOVF9NQVgKKworLyogRm9yIHBhcnRpdGlvbiBiYXNlZCBtdWx0aXNlc3Npb24gYWNjZXNzLiBJREUgY2FuIGhhbmRsZSA2NCBwYXJ0aXRpb25zCisgKiBwZXIgZHJpdmUgLSBTQ1NJIENELVJPTSdzIHVzZSBtaW5vcnMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZQorICogdmFyaW91cyBkcml2ZXMsIHNvIHdlIGNhbid0IGRvIG11bHRpc2Vzc2lvbnMgdGhlIHNhbWUgd2F5IHRoZXJlLgorICogVXNlIHRoZSAtbyBzZXNzaW9uPXggb3B0aW9uIHRvIG1vdW50IG9uIHRoZW0uCisgKi8KKyNkZWZpbmUgQ0RfUEFSVF9NQVgJCTY0CisjZGVmaW5lIENEX1BBUlRfTUFTSwkJKENEX1BBUlRfTUFYIC0gMSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2VuZXJpYyBQYWNrZXQgY29tbWFuZHMsIE1NQyBjb21tYW5kcywgYW5kIHN1Y2gKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAvKiBUaGUgZ2VuZXJpYyBwYWNrZXQgY29tbWFuZCBvcGNvZGVzIGZvciBDRC9EVkQgTG9naWNhbCBVbml0cywKKyAqIEZyb20gVGFibGUgNTcgb2YgdGhlIFNGRjgwOTAgVmVyLiAzIChNdC4gRnVqaSkgZHJhZnQgc3RhbmRhcmQuICovCisjZGVmaW5lIEdQQ01EX0JMQU5LCQkJICAgIDB4YTEKKyNkZWZpbmUgR1BDTURfQ0xPU0VfVFJBQ0sJCSAgICAweDViCisjZGVmaW5lIEdQQ01EX0ZMVVNIX0NBQ0hFCQkgICAgMHgzNQorI2RlZmluZSBHUENNRF9GT1JNQVRfVU5JVAkJICAgIDB4MDQKKyNkZWZpbmUgR1BDTURfR0VUX0NPTkZJR1VSQVRJT04JCSAgICAweDQ2CisjZGVmaW5lIEdQQ01EX0dFVF9FVkVOVF9TVEFUVVNfTk9USUZJQ0FUSU9OIDB4NGEKKyNkZWZpbmUgR1BDTURfR0VUX1BFUkZPUk1BTkNFCQkgICAgMHhhYworI2RlZmluZSBHUENNRF9JTlFVSVJZCQkJICAgIDB4MTIKKyNkZWZpbmUgR1BDTURfTE9BRF9VTkxPQUQJCSAgICAweGE2CisjZGVmaW5lIEdQQ01EX01FQ0hBTklTTV9TVEFUVVMJCSAgICAweGJkCisjZGVmaW5lIEdQQ01EX01PREVfU0VMRUNUXzEwCQkgICAgMHg1NQorI2RlZmluZSBHUENNRF9NT0RFX1NFTlNFXzEwCQkgICAgMHg1YQorI2RlZmluZSBHUENNRF9QQVVTRV9SRVNVTUUJCSAgICAweDRiCisjZGVmaW5lIEdQQ01EX1BMQVlfQVVESU9fMTAJCSAgICAweDQ1CisjZGVmaW5lIEdQQ01EX1BMQVlfQVVESU9fTVNGCQkgICAgMHg0NworI2RlZmluZSBHUENNRF9QTEFZX0FVRElPX1RJCQkgICAgMHg0OAorI2RlZmluZSBHUENNRF9QTEFZX0NECQkJICAgIDB4YmMKKyNkZWZpbmUgR1BDTURfUFJFVkVOVF9BTExPV19NRURJVU1fUkVNT1ZBTCAgMHgxZQorI2RlZmluZSBHUENNRF9SRUFEXzEwCQkJICAgIDB4MjgKKyNkZWZpbmUgR1BDTURfUkVBRF8xMgkJCSAgICAweGE4CisjZGVmaW5lIEdQQ01EX1JFQURfQlVGRkVSCQkgICAgMHgzYworI2RlZmluZSBHUENNRF9SRUFEX0JVRkZFUl9DQVBBQ0lUWQkgICAgMHg1YworI2RlZmluZSBHUENNRF9SRUFEX0NEVkRfQ0FQQUNJVFkJICAgIDB4MjUKKyNkZWZpbmUgR1BDTURfUkVBRF9DRAkJCSAgICAweGJlCisjZGVmaW5lIEdQQ01EX1JFQURfQ0RfTVNGCQkgICAgMHhiOQorI2RlZmluZSBHUENNRF9SRUFEX0RJU0NfSU5GTwkJICAgIDB4NTEKKyNkZWZpbmUgR1BDTURfUkVBRF9EVkRfU1RSVUNUVVJFCSAgICAweGFkCisjZGVmaW5lIEdQQ01EX1JFQURfRk9STUFUX0NBUEFDSVRJRVMJICAgIDB4MjMKKyNkZWZpbmUgR1BDTURfUkVBRF9IRUFERVIJCSAgICAweDQ0CisjZGVmaW5lIEdQQ01EX1JFQURfVFJBQ0tfUlpPTkVfSU5GTwkgICAgMHg1MgorI2RlZmluZSBHUENNRF9SRUFEX1NVQkNIQU5ORUwJCSAgICAweDQyCisjZGVmaW5lIEdQQ01EX1JFQURfVE9DX1BNQV9BVElQCQkgICAgMHg0MworI2RlZmluZSBHUENNRF9SRVBBSVJfUlpPTkVfVFJBQ0sJICAgIDB4NTgKKyNkZWZpbmUgR1BDTURfUkVQT1JUX0tFWQkJICAgIDB4YTQKKyNkZWZpbmUgR1BDTURfUkVRVUVTVF9TRU5TRQkJICAgIDB4MDMKKyNkZWZpbmUgR1BDTURfUkVTRVJWRV9SWk9ORV9UUkFDSwkgICAgMHg1MworI2RlZmluZSBHUENNRF9TRU5EX0NVRV9TSEVFVAkJICAgIDB4NWQKKyNkZWZpbmUgR1BDTURfU0NBTgkJCSAgICAweGJhCisjZGVmaW5lIEdQQ01EX1NFRUsJCQkgICAgMHgyYgorI2RlZmluZSBHUENNRF9TRU5EX0RWRF9TVFJVQ1RVUkUJICAgIDB4YmYKKyNkZWZpbmUgR1BDTURfU0VORF9FVkVOVAkJICAgIDB4YTIKKyNkZWZpbmUgR1BDTURfU0VORF9LRVkJCQkgICAgMHhhMworI2RlZmluZSBHUENNRF9TRU5EX09QQwkJCSAgICAweDU0CisjZGVmaW5lIEdQQ01EX1NFVF9SRUFEX0FIRUFECQkgICAgMHhhNworI2RlZmluZSBHUENNRF9TRVRfU1RSRUFNSU5HCQkgICAgMHhiNgorI2RlZmluZSBHUENNRF9TVEFSVF9TVE9QX1VOSVQJCSAgICAweDFiCisjZGVmaW5lIEdQQ01EX1NUT1BfUExBWV9TQ0FOCQkgICAgMHg0ZQorI2RlZmluZSBHUENNRF9URVNUX1VOSVRfUkVBRFkJCSAgICAweDAwCisjZGVmaW5lIEdQQ01EX1ZFUklGWV8xMAkJCSAgICAweDJmCisjZGVmaW5lIEdQQ01EX1dSSVRFXzEwCQkJICAgIDB4MmEKKyNkZWZpbmUgR1BDTURfV1JJVEVfMTIJCQkgICAgMHhhYQorI2RlZmluZSBHUENNRF9XUklURV9BTkRfVkVSSUZZXzEwCSAgICAweDJlCisjZGVmaW5lIEdQQ01EX1dSSVRFX0JVRkZFUgkJICAgIDB4M2IKKy8qIFRoaXMgaXMgbGlzdGVkIGFzIG9wdGlvbmFsIGluIEFUQVBJIDIuNiwgYnV0IGlzIChjdXJpb3VzbHkpIAorICogbWlzc2luZyBmcm9tIE10LiBGdWppLCBUYWJsZSA1Ny4gIEl0IF9pc18gbWVudGlvbmVkIGluIE10LiBGdWppCisgKiBUYWJsZSAzNzcgYXMgYW4gTU1DIGNvbW1hbmQgZm9yIFNDU2kgZGV2aWNlcyB0aG91Z2guLi4gIE1vc3QgQVRBUEkKKyAqIGRyaXZlcyBzdXBwb3J0IGl0LiAqLworI2RlZmluZSBHUENNRF9TRVRfU1BFRUQJCQkgICAgMHhiYgorLyogVGhpcyBzZWVtcyB0byBiZSBhIFNDU0kgc3BlY2lmaWMgQ0QtUk9NIG9wY29kZSAKKyAqIHRvIHBsYXkgZGF0YSBhdCB0cmFjay9pbmRleCAqLworI2RlZmluZSBHUENNRF9QTEFZQVVESU9fVEkJCSAgICAweDQ4CisvKgorICogRnJvbSBNUyBNZWRpYSBTdGF0dXMgTm90aWZpY2F0aW9uIFN1cHBvcnQgU3BlY2lmaWNhdGlvbi4gRm9yCisgKiBvbGRlciBkcml2ZXMgb25seS4KKyAqLworI2RlZmluZSBHUENNRF9HRVRfTUVESUFfU1RBVFVTCQkgICAgMHhkYQorCisvKiBNb2RlIHBhZ2UgY29kZXMgZm9yIG1vZGUgc2Vuc2Uvc2V0ICovCisjZGVmaW5lIEdQTU9ERV9WRU5ET1JfUEFHRQkJMHgwMAorI2RlZmluZSBHUE1PREVfUl9XX0VSUk9SX1BBR0UJCTB4MDEKKyNkZWZpbmUgR1BNT0RFX1dSSVRFX1BBUk1TX1BBR0UJCTB4MDUKKyNkZWZpbmUgR1BNT0RFX1dDQUNISU5HX1BBR0UJCTB4MDgKKyNkZWZpbmUgR1BNT0RFX0FVRElPX0NUTF9QQUdFCQkweDBlCisjZGVmaW5lIEdQTU9ERV9QT1dFUl9QQUdFCQkweDFhCisjZGVmaW5lIEdQTU9ERV9GQVVMVF9GQUlMX1BBR0UJCTB4MWMKKyNkZWZpbmUgR1BNT0RFX1RPX1BST1RFQ1RfUEFHRQkJMHgxZAorI2RlZmluZSBHUE1PREVfQ0FQQUJJTElUSUVTX1BBR0UJMHgyYQorI2RlZmluZSBHUE1PREVfQUxMX1BBR0VTCQkweDNmCisvKiBOb3QgaW4gTXQuIEZ1amksIGJ1dCBpbiBBVEFQSSAyLjYgLS0gZGVwcmVjYXRlZCBub3cgaW4gZmF2b3IKKyAqIG9mIE1PREVfU0VOU0VfUE9XRVJfUEFHRSAqLworI2RlZmluZSBHUE1PREVfQ0RST01fUEFHRQkJMHgwZAorCisKKworLyogRFZEIHN0cnVjdCB0eXBlcyAqLworI2RlZmluZSBEVkRfU1RSVUNUX1BIWVNJQ0FMCTB4MDAKKyNkZWZpbmUgRFZEX1NUUlVDVF9DT1BZUklHSFQJMHgwMQorI2RlZmluZSBEVkRfU1RSVUNUX0RJU0NLRVkJMHgwMgorI2RlZmluZSBEVkRfU1RSVUNUX0JDQQkJMHgwMworI2RlZmluZSBEVkRfU1RSVUNUX01BTlVGQUNUCTB4MDQKKworc3RydWN0IGR2ZF9sYXllciB7CisJX191OCBib29rX3ZlcnNpb24JOiA0OworCV9fdTggYm9va190eXBlCQk6IDQ7CisJX191OCBtaW5fcmF0ZQkJOiA0OworCV9fdTggZGlzY19zaXplCQk6IDQ7CisJX191OCBsYXllcl90eXBlCQk6IDQ7CisJX191OCB0cmFja19wYXRoCQk6IDE7CisJX191OCBubGF5ZXJzCQk6IDI7CisJX191OCB0cmFja19kZW5zaXR5CTogNDsKKwlfX3U4IGxpbmVhcl9kZW5zaXR5CTogNDsKKwlfX3U4IGJjYQkJOiAxOworCV9fdTMyIHN0YXJ0X3NlY3RvcjsKKwlfX3UzMiBlbmRfc2VjdG9yOworCV9fdTMyIGVuZF9zZWN0b3JfbDA7Cit9OworCisjZGVmaW5lIERWRF9MQVlFUlMJNAorCitzdHJ1Y3QgZHZkX3BoeXNpY2FsIHsKKwlfX3U4IHR5cGU7CisJX191OCBsYXllcl9udW07CisJc3RydWN0IGR2ZF9sYXllciBsYXllcltEVkRfTEFZRVJTXTsKK307CisKK3N0cnVjdCBkdmRfY29weXJpZ2h0IHsKKwlfX3U4IHR5cGU7CisKKwlfX3U4IGxheWVyX251bTsKKwlfX3U4IGNwc3Q7CisJX191OCBybWk7Cit9OworCitzdHJ1Y3QgZHZkX2Rpc2NrZXkgeworCV9fdTggdHlwZTsKKworCXVuc2lnbmVkIGFnaWQJCTogMjsKKwlfX3U4IHZhbHVlWzIwNDhdOworfTsKKworc3RydWN0IGR2ZF9iY2EgeworCV9fdTggdHlwZTsKKworCWludCBsZW47CisJX191OCB2YWx1ZVsxODhdOworfTsKKworc3RydWN0IGR2ZF9tYW51ZmFjdCB7CisJX191OCB0eXBlOworCisJX191OCBsYXllcl9udW07CisJaW50IGxlbjsKKwlfX3U4IHZhbHVlWzIwNDhdOworfTsKKwordHlwZWRlZiB1bmlvbiB7CisJX191OCB0eXBlOworCisJc3RydWN0IGR2ZF9waHlzaWNhbAlwaHlzaWNhbDsKKwlzdHJ1Y3QgZHZkX2NvcHlyaWdodAljb3B5cmlnaHQ7CisJc3RydWN0IGR2ZF9kaXNja2V5CWRpc2NrZXk7CisJc3RydWN0IGR2ZF9iY2EJCWJjYTsKKwlzdHJ1Y3QgZHZkX21hbnVmYWN0CW1hbnVmYWN0OworfSBkdmRfc3RydWN0OworCisvKgorICogRFZEIGF1dGhlbnRpY2F0aW9uIGlvY3RsCisgKi8KKworLyogQXV0aGVudGljYXRpb24gc3RhdGVzICovCisjZGVmaW5lIERWRF9MVV9TRU5EX0FHSUQJMAorI2RlZmluZSBEVkRfSE9TVF9TRU5EX0NIQUxMRU5HRQkxCisjZGVmaW5lIERWRF9MVV9TRU5EX0tFWTEJMgorI2RlZmluZSBEVkRfTFVfU0VORF9DSEFMTEVOR0UJMworI2RlZmluZSBEVkRfSE9TVF9TRU5EX0tFWTIJNAorCisvKiBUZXJtaW5hdGlvbiBzdGF0ZXMgKi8KKyNkZWZpbmUgRFZEX0FVVEhfRVNUQUJMSVNIRUQJNQorI2RlZmluZSBEVkRfQVVUSF9GQUlMVVJFCTYKKworLyogT3RoZXIgZnVuY3Rpb25zICovCisjZGVmaW5lIERWRF9MVV9TRU5EX1RJVExFX0tFWQk3CisjZGVmaW5lIERWRF9MVV9TRU5EX0FTRgkJOAorI2RlZmluZSBEVkRfSU5WQUxJREFURV9BR0lECTkKKyNkZWZpbmUgRFZEX0xVX1NFTkRfUlBDX1NUQVRFCTEwCisjZGVmaW5lIERWRF9IT1NUX1NFTkRfUlBDX1NUQVRFCTExCisKKy8qIFN0YXRlIGRhdGEgKi8KK3R5cGVkZWYgX191OCBkdmRfa2V5WzVdOwkJLyogNDAtYml0IHZhbHVlLCBNU0IgaXMgZmlyc3QgZWxlbS4gKi8KK3R5cGVkZWYgX191OCBkdmRfY2hhbGxlbmdlWzEwXTsJLyogODAtYml0IHZhbHVlLCBNU0IgaXMgZmlyc3QgZWxlbS4gKi8KKworc3RydWN0IGR2ZF9sdV9zZW5kX2FnaWQgeworCV9fdTggdHlwZTsKKwl1bnNpZ25lZCBhZ2lkCQk6IDI7Cit9OworCitzdHJ1Y3QgZHZkX2hvc3Rfc2VuZF9jaGFsbGVuZ2UgeworCV9fdTggdHlwZTsKKwl1bnNpZ25lZCBhZ2lkCQk6IDI7CisKKwlkdmRfY2hhbGxlbmdlIGNoYWw7Cit9OworCitzdHJ1Y3QgZHZkX3NlbmRfa2V5IHsKKwlfX3U4IHR5cGU7CisJdW5zaWduZWQgYWdpZAkJOiAyOworCisJZHZkX2tleSBrZXk7Cit9OworCitzdHJ1Y3QgZHZkX2x1X3NlbmRfY2hhbGxlbmdlIHsKKwlfX3U4IHR5cGU7CisJdW5zaWduZWQgYWdpZAkJOiAyOworCisJZHZkX2NoYWxsZW5nZSBjaGFsOworfTsKKworI2RlZmluZSBEVkRfQ1BNX05PX0NPUFlSSUdIVAkwCisjZGVmaW5lIERWRF9DUE1fQ09QWVJJR0hURUQJMQorCisjZGVmaW5lIERWRF9DUF9TRUNfTk9ORQkJMAorI2RlZmluZSBEVkRfQ1BfU0VDX0VYSVNUCTEKKworI2RlZmluZSBEVkRfQ0dNU19VTlJFU1RSSUNURUQJMAorI2RlZmluZSBEVkRfQ0dNU19TSU5HTEUJCTIKKyNkZWZpbmUgRFZEX0NHTVNfUkVTVFJJQ1RFRAkzCisKK3N0cnVjdCBkdmRfbHVfc2VuZF90aXRsZV9rZXkgeworCV9fdTggdHlwZTsKKwl1bnNpZ25lZCBhZ2lkCQk6IDI7CisKKwlkdmRfa2V5IHRpdGxlX2tleTsKKwlpbnQgbGJhOworCXVuc2lnbmVkIGNwbQkJOiAxOworCXVuc2lnbmVkIGNwX3NlYwkJOiAxOworCXVuc2lnbmVkIGNnbXMJCTogMjsKK307CisKK3N0cnVjdCBkdmRfbHVfc2VuZF9hc2YgeworCV9fdTggdHlwZTsKKwl1bnNpZ25lZCBhZ2lkCQk6IDI7CisKKwl1bnNpZ25lZCBhc2YJCTogMTsKK307CisKK3N0cnVjdCBkdmRfaG9zdF9zZW5kX3JwY3N0YXRlIHsKKwlfX3U4IHR5cGU7CisJX191OCBwZHJjOworfTsKKworc3RydWN0IGR2ZF9sdV9zZW5kX3JwY3N0YXRlIHsKKwlfX3U4IHR5cGUJCTogMjsKKwlfX3U4IHZyYQkJOiAzOworCV9fdTggdWNjYQkJOiAzOworCV9fdTggcmVnaW9uX21hc2s7CisJX191OCBycGNfc2NoZW1lOworfTsKKwordHlwZWRlZiB1bmlvbiB7CisJX191OCB0eXBlOworCisJc3RydWN0IGR2ZF9sdV9zZW5kX2FnaWQJCWxzYTsKKwlzdHJ1Y3QgZHZkX2hvc3Rfc2VuZF9jaGFsbGVuZ2UJaHNjOworCXN0cnVjdCBkdmRfc2VuZF9rZXkJCWxzazsKKwlzdHJ1Y3QgZHZkX2x1X3NlbmRfY2hhbGxlbmdlCWxzYzsKKwlzdHJ1Y3QgZHZkX3NlbmRfa2V5CQloc2s7CisJc3RydWN0IGR2ZF9sdV9zZW5kX3RpdGxlX2tleQlsc3RrOworCXN0cnVjdCBkdmRfbHVfc2VuZF9hc2YJCWxzYXNmOworCXN0cnVjdCBkdmRfaG9zdF9zZW5kX3JwY3N0YXRlCWhycGNzOworCXN0cnVjdCBkdmRfbHVfc2VuZF9ycGNzdGF0ZQlscnBjczsKK30gZHZkX2F1dGhpbmZvOworCitzdHJ1Y3QgcmVxdWVzdF9zZW5zZSB7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCB2YWxpZAkJOiAxOworCV9fdTggZXJyb3JfY29kZQkJOiA3OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCBlcnJvcl9jb2RlCQk6IDc7CisJX191OCB2YWxpZAkJOiAxOworI2VuZGlmCisJX191OCBzZWdtZW50X251bWJlcjsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHJlc2VydmVkMQkJOiAyOworCV9fdTggaWxpCQk6IDE7CisJX191OCByZXNlcnZlZDIJCTogMTsKKwlfX3U4IHNlbnNlX2tleQkJOiA0OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCBzZW5zZV9rZXkJCTogNDsKKwlfX3U4IHJlc2VydmVkMgkJOiAxOworCV9fdTggaWxpCQk6IDE7CisJX191OCByZXNlcnZlZDEJCTogMjsKKyNlbmRpZgorCV9fdTggaW5mb3JtYXRpb25bNF07CisJX191OCBhZGRfc2Vuc2VfbGVuOworCV9fdTggY29tbWFuZF9pbmZvWzRdOworCV9fdTggYXNjOworCV9fdTggYXNjcTsKKwlfX3U4IGZydWM7CisJX191OCBza3NbM107CisJX191OCBhc2JbNDZdOworfTsKKworLyoKKyAqIGZlYXR1cmUgcHJvZmlsZQorICovCisjZGVmaW5lIENERl9SV1JUCTB4MDAyMAkvKiAiUmFuZG9tIFdyaXRhYmxlIiAqLworI2RlZmluZSBDREZfSFdETQkweDAwMjQJLyogIkhhcmR3YXJlIERlZmVjdCBNYW5hZ2VtZW50IiAqLworI2RlZmluZSBDREZfTVJXIAkweDAwMjgKKworLyoKKyAqIG1lZGlhIHN0YXR1cyBiaXRzCisgKi8KKyNkZWZpbmUgQ0RNX01SV19OT1RNUlcJCQkwCisjZGVmaW5lIENETV9NUldfQkdGT1JNQVRfSU5BQ1RJVkUJMQorI2RlZmluZSBDRE1fTVJXX0JHRk9STUFUX0FDVElWRQkJMgorI2RlZmluZSBDRE1fTVJXX0JHRk9STUFUX0NPTVBMRVRFCTMKKworLyoKKyAqIG1ydyBhZGRyZXNzIHNwYWNlcworICovCisjZGVmaW5lIE1SV19MQkFfRE1BCQkJMAorI2RlZmluZSBNUldfTEJBX0dBQQkJCTEKKworLyoKKyAqIG1ydyBtb2RlIHBhZ2VzIChmaXJzdCBpcyBkZXByZWNhdGVkKSAtLSBwcm9iZWQgYXQgaW5pdCB0aW1lIGFuZAorICogY2RpLT5tcndfbW9kZV9wYWdlIGlzIHNldAorICovCisjZGVmaW5lIE1SV19NT0RFX1BDX1BSRTEJCTB4MmMKKyNkZWZpbmUgTVJXX01PREVfUEMJCQkweDAzCisKK3N0cnVjdCBtcndfZmVhdHVyZV9kZXNjIHsKKwlfX2JlMTYgZmVhdHVyZV9jb2RlOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcmVzZXJ2ZWQxCQk6IDI7CisJX191OCBmZWF0dXJlX3ZlcnNpb24JOiA0OworCV9fdTggcGVyc2lzdGVudAkJOiAxOworCV9fdTggY3VycgkJOiAxOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCBjdXJyCQk6IDE7CisJX191OCBwZXJzaXN0ZW50CQk6IDE7CisJX191OCBmZWF0dXJlX3ZlcnNpb24JOiA0OworCV9fdTggcmVzZXJ2ZWQxCQk6IDI7CisjZW5kaWYKKwlfX3U4IGFkZF9sZW47CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCByZXNlcnZlZDIJCTogNzsKKwlfX3U4IHdyaXRlCQk6IDE7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHdyaXRlCQk6IDE7CisJX191OCByZXNlcnZlZDIJCTogNzsKKyNlbmRpZgorCV9fdTggcmVzZXJ2ZWQzOworCV9fdTggcmVzZXJ2ZWQ0OworCV9fdTggcmVzZXJ2ZWQ1OworfTsKKworLyogY2YuIG1tYzRyMDJnLnBkZiA1LjMuMTAgUmFuZG9tIFdyaXRhYmxlIEZlYXR1cmUgKDAwMjBoKSBwZyAxOTcgb2YgNjM1ICovCitzdHJ1Y3QgcndydF9mZWF0dXJlX2Rlc2MgeworCV9fYmUxNiBmZWF0dXJlX2NvZGU7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCByZXNlcnZlZDEJCTogMjsKKwlfX3U4IGZlYXR1cmVfdmVyc2lvbgk6IDQ7CisJX191OCBwZXJzaXN0ZW50CQk6IDE7CisJX191OCBjdXJyCQk6IDE7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IGN1cnIJCTogMTsKKwlfX3U4IHBlcnNpc3RlbnQJCTogMTsKKwlfX3U4IGZlYXR1cmVfdmVyc2lvbgk6IDQ7CisJX191OCByZXNlcnZlZDEJCTogMjsKKyNlbmRpZgorCV9fdTggYWRkX2xlbjsKKwlfX3UzMiBsYXN0X2xiYTsKKwlfX3UzMiBibG9ja19zaXplOworCV9fdTE2IGJsb2NraW5nOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcmVzZXJ2ZWQyCQk6IDc7CisJX191OCBwYWdlX3ByZXNlbnQJOiAxOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCBwYWdlX3ByZXNlbnQJOiAxOworCV9fdTggcmVzZXJ2ZWQyCQk6IDc7CisjZW5kaWYKKwlfX3U4IHJlc2VydmVkMzsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2JlMTYgZGlzY19pbmZvcm1hdGlvbl9sZW5ndGg7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCByZXNlcnZlZDEJCQk6IDM7CisgICAgICAgIF9fdTggZXJhc2FibGUJCQk6IDE7CisgICAgICAgIF9fdTggYm9yZGVyX3N0YXR1cwkJOiAyOworICAgICAgICBfX3U4IGRpc2Nfc3RhdHVzCQk6IDI7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgX191OCBkaXNjX3N0YXR1cwkJOiAyOworICAgICAgICBfX3U4IGJvcmRlcl9zdGF0dXMJCTogMjsKKyAgICAgICAgX191OCBlcmFzYWJsZQkJCTogMTsKKwlfX3U4IHJlc2VydmVkMQkJCTogMzsKKyNlbHNlCisjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKwlfX3U4IG5fZmlyc3RfdHJhY2s7CisJX191OCBuX3Nlc3Npb25zX2xzYjsKKwlfX3U4IGZpcnN0X3RyYWNrX2xzYjsKKwlfX3U4IGxhc3RfdHJhY2tfbHNiOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggZGlkX3YJCQk6IDE7CisgICAgICAgIF9fdTggZGJjX3YJCQk6IDE7CisgICAgICAgIF9fdTggdXJ1CQkJOiAxOworICAgICAgICBfX3U4IHJlc2VydmVkMgkJCTogMjsKKwlfX3U4IGRiaXQJCQk6IDE7CisJX191OCBtcndfc3RhdHVzCQkJOiAyOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCBtcndfc3RhdHVzCQkJOiAyOworCV9fdTggZGJpdAkJCTogMTsKKyAgICAgICAgX191OCByZXNlcnZlZDIJCQk6IDI7CisgICAgICAgIF9fdTggdXJ1CQkJOiAxOworICAgICAgICBfX3U4IGRiY192CQkJOiAxOworCV9fdTggZGlkX3YJCQk6IDE7CisjZW5kaWYKKwlfX3U4IGRpc2NfdHlwZTsKKwlfX3U4IG5fc2Vzc2lvbnNfbXNiOworCV9fdTggZmlyc3RfdHJhY2tfbXNiOworCV9fdTggbGFzdF90cmFja19tc2I7CisJX191MzIgZGlzY19pZDsKKwlfX3UzMiBsZWFkX2luOworCV9fdTMyIGxlYWRfb3V0OworCV9fdTggZGlzY19iYXJfY29kZVs4XTsKKwlfX3U4IHJlc2VydmVkMzsKKwlfX3U4IG5fb3BjOworfSBkaXNjX2luZm9ybWF0aW9uOworCit0eXBlZGVmIHN0cnVjdCB7CisJX19iZTE2IHRyYWNrX2luZm9ybWF0aW9uX2xlbmd0aDsKKwlfX3U4IHRyYWNrX2xzYjsKKwlfX3U4IHNlc3Npb25fbHNiOworCV9fdTggcmVzZXJ2ZWQxOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcmVzZXJ2ZWQyCQkJOiAyOworICAgICAgICBfX3U4IGRhbWFnZQkJCTogMTsKKyAgICAgICAgX191OCBjb3B5CQkJOiAxOworICAgICAgICBfX3U4IHRyYWNrX21vZGUJCQk6IDQ7CisJX191OCBydAkJCQk6IDE7CisJX191OCBibGFuawkJCTogMTsKKwlfX3U4IHBhY2tldAkJCTogMTsKKwlfX3U4IGZwCQkJCTogMTsKKwlfX3U4IGRhdGFfbW9kZQkJCTogNDsKKwlfX3U4IHJlc2VydmVkMwkJCTogNjsKKwlfX3U4IGxyYV92CQkJOiAxOworCV9fdTggbndhX3YJCQk6IDE7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgX191OCB0cmFja19tb2RlCQkJOiA0OworICAgICAgICBfX3U4IGNvcHkJCQk6IDE7CisgICAgICAgIF9fdTggZGFtYWdlCQkJOiAxOworCV9fdTggcmVzZXJ2ZWQyCQkJOiAyOworCV9fdTggZGF0YV9tb2RlCQkJOiA0OworCV9fdTggZnAJCQkJOiAxOworCV9fdTggcGFja2V0CQkJOiAxOworCV9fdTggYmxhbmsJCQk6IDE7CisJX191OCBydAkJCQk6IDE7CisJX191OCBud2FfdgkJCTogMTsKKwlfX3U4IGxyYV92CQkJOiAxOworCV9fdTggcmVzZXJ2ZWQzCQkJOiA2OworI2VuZGlmCisJX19iZTMyIHRyYWNrX3N0YXJ0OworCV9fYmUzMiBuZXh0X3dyaXRhYmxlOworCV9fYmUzMiBmcmVlX2Jsb2NrczsKKwlfX2JlMzIgZml4ZWRfcGFja2V0X3NpemU7CisJX19iZTMyIHRyYWNrX3NpemU7CisJX19iZTMyIGxhc3RfcmVjX2FkZHJlc3M7Cit9IHRyYWNrX2luZm9ybWF0aW9uOworCitzdHJ1Y3QgZmVhdHVyZV9oZWFkZXIgeworCV9fdTMyIGRhdGFfbGVuOworCV9fdTggcmVzZXJ2ZWQxOworCV9fdTggcmVzZXJ2ZWQyOworCV9fdTE2IGN1cnJfcHJvZmlsZTsKK307CisKK3N0cnVjdCBtb2RlX3BhZ2VfaGVhZGVyIHsKKwlfX2JlMTYgbW9kZV9kYXRhX2xlbmd0aDsKKwlfX3U4IG1lZGl1bV90eXBlOworCV9fdTggcmVzZXJ2ZWQxOworCV9fdTggcmVzZXJ2ZWQyOworCV9fdTggcmVzZXJ2ZWQzOworCV9fYmUxNiBkZXNjX2xlbmd0aDsKK307CisKKworI2VuZGlmICAvKiBfTElOVVhfQ0RST01fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jZ3JvdXBzdGF0cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jZ3JvdXBzdGF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NTNjMzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nncm91cHN0YXRzLmgKQEAgLTAsMCArMSw3MSBAQAorLyogY2dyb3Vwc3RhdHMuaCAtIGV4cG9ydGluZyBwZXItY2dyb3VwIHN0YXRpc3RpY3MKKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA3CisgKiBBdXRob3IgQmFsYmlyIFNpbmdoIDxiYWxiaXJAbGludXgudm5ldC5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyLjEgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9DR1JPVVBTVEFUU19ICisjZGVmaW5lIF9MSU5VWF9DR1JPVVBTVEFUU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Rhc2tzdGF0cy5oPgorCisvKgorICogRGF0YSBzaGFyZWQgYmV0d2VlbiB1c2VyIHNwYWNlIGFuZCBrZXJuZWwgc3BhY2Ugb24gYSBwZXIgY2dyb3VwCisgKiBiYXNpcy4gVGhpcyBkYXRhIGlzIHNoYXJlZCB1c2luZyB0YXNrc3RhdHMuCisgKgorICogTW9zdCBvZiB0aGVzZSBzdGF0ZXMgYXJlIGRlcml2ZWQgYnkgbG9va2luZyBhdCB0aGUgdGFzay0+c3RhdGUgdmFsdWUKKyAqIEZvciB0aGUgbnJfaW9fd2FpdCBzdGF0ZSwgYSBmbGFnIGluIHRoZSBkZWxheSBhY2NvdW50aW5nIHN0cnVjdHVyZQorICogaW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sgaXMgd2FpdGluZyBvbiBJTworICoKKyAqIEVhY2ggbWVtYmVyIGlzIGFsaWduZWQgdG8gYSA4IGJ5dGUgYm91bmRhcnkuCisgKi8KK3N0cnVjdCBjZ3JvdXBzdGF0cyB7CisJX191NjQJbnJfc2xlZXBpbmc7CQkvKiBOdW1iZXIgb2YgdGFza3Mgc2xlZXBpbmcgKi8KKwlfX3U2NAlucl9ydW5uaW5nOwkJLyogTnVtYmVyIG9mIHRhc2tzIHJ1bm5pbmcgKi8KKwlfX3U2NAlucl9zdG9wcGVkOwkJLyogTnVtYmVyIG9mIHRhc2tzIGluIHN0b3BwZWQgc3RhdGUgKi8KKwlfX3U2NAlucl91bmludGVycnVwdGlibGU7CS8qIE51bWJlciBvZiB0YXNrcyBpbiB1bmludGVycnVwdGlibGUgKi8KKwkJCQkJLyogc3RhdGUgKi8KKwlfX3U2NAlucl9pb193YWl0OwkJLyogTnVtYmVyIG9mIHRhc2tzIHdhaXRpbmcgb24gSU8gKi8KK307CisKKy8qCisgKiBDb21tYW5kcyBzZW50IGZyb20gdXNlcnNwYWNlCisgKiBOb3QgdmVyc2lvbmVkLiBOZXcgY29tbWFuZHMgc2hvdWxkIG9ubHkgYmUgaW5zZXJ0ZWQgYXQgdGhlIGVudW0ncyBlbmQKKyAqIHByaW9yIHRvIF9fQ0dST1VQU1RBVFNfQ01EX01BWAorICovCisKK2VudW0geworCUNHUk9VUFNUQVRTX0NNRF9VTlNQRUMgPSBfX1RBU0tTVEFUU19DTURfTUFYLAkvKiBSZXNlcnZlZCAqLworCUNHUk9VUFNUQVRTX0NNRF9HRVQsCQkvKiB1c2VyLT5rZXJuZWwgcmVxdWVzdC9nZXQtcmVzcG9uc2UgKi8KKwlDR1JPVVBTVEFUU19DTURfTkVXLAkJLyoga2VybmVsLT51c2VyIGV2ZW50ICovCisJX19DR1JPVVBTVEFUU19DTURfTUFYLAorfTsKKworI2RlZmluZSBDR1JPVVBTVEFUU19DTURfTUFYIChfX0NHUk9VUFNUQVRTX0NNRF9NQVggLSAxKQorCitlbnVtIHsKKwlDR1JPVVBTVEFUU19UWVBFX1VOU1BFQyA9IDAsCS8qIFJlc2VydmVkICovCisJQ0dST1VQU1RBVFNfVFlQRV9DR1JPVVBfU1RBVFMsCS8qIGNvbnRhaW5zIG5hbWUgKyBzdGF0cyAqLworCV9fQ0dST1VQU1RBVFNfVFlQRV9NQVgsCit9OworCisjZGVmaW5lIENHUk9VUFNUQVRTX1RZUEVfTUFYIChfX0NHUk9VUFNUQVRTX1RZUEVfTUFYIC0gMSkKKworZW51bSB7CisJQ0dST1VQU1RBVFNfQ01EX0FUVFJfVU5TUEVDID0gMCwKKwlDR1JPVVBTVEFUU19DTURfQVRUUl9GRCwKKwlfX0NHUk9VUFNUQVRTX0NNRF9BVFRSX01BWCwKK307CisKKyNkZWZpbmUgQ0dST1VQU1RBVFNfQ01EX0FUVFJfTUFYIChfX0NHUk9VUFNUQVRTX0NNRF9BVFRSX01BWCAtIDEpCisKKyNlbmRpZiAvKiBfTElOVVhfQ0dST1VQU1RBVFNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jaGlvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NoaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTdjZDk4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jaGlvLmgKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBpb2N0bCBpbnRlcmZhY2UgZm9yIHRoZSBzY3NpIG1lZGlhIGNoYW5nZXIgZHJpdmVyCisgKi8KKworLyogY2hhbmdlciBlbGVtZW50IHR5cGVzICovCisjZGVmaW5lIENIRVRfTVQgICAwCS8qIG1lZGlhIHRyYW5zcG9ydCBlbGVtZW50IChyb2JvdCkgKi8KKyNkZWZpbmUgQ0hFVF9TVCAgIDEJLyogc3RvcmFnZSBlbGVtZW50IChtZWRpYSBzbG90cykgKi8KKyNkZWZpbmUgQ0hFVF9JRSAgIDIJLyogaW1wb3J0L2V4cG9ydCBlbGVtZW50ICovCisjZGVmaW5lIENIRVRfRFQgICAzCS8qIGRhdGEgdHJhbnNmZXIgZWxlbWVudCAodGFwZS9jZHJvbS93aGF0ZXZlcikgKi8KKyNkZWZpbmUgQ0hFVF9WMSAgIDQJLyogdmVuZG9yIHNwZWNpZmljICMxICovCisjZGVmaW5lIENIRVRfVjIgICA1CS8qIHZlbmRvciBzcGVjaWZpYyAjMiAqLworI2RlZmluZSBDSEVUX1YzICAgNgkvKiB2ZW5kb3Igc3BlY2lmaWMgIzMgKi8KKyNkZWZpbmUgQ0hFVF9WNCAgIDcJLyogdmVuZG9yIHNwZWNpZmljICM0ICovCisKKworLyoKKyAqIENISU9HUEFSQU1TCisgKiAgICBxdWVyeSBjaGFuZ2VyIHByb3BlcnRpZXMKKyAqCisgKiBDSElPVkdQQVJBTVMKKyAqICAgIHF1ZXJ5IHZlbmRvci1zcGVjaWZpYyBlbGVtZW50IHR5cGVzCisgKgorICogICAgYWNjZXNzaW5nIGVsZW1lbnRzIHdvcmtzIGJ5IHNwZWNpZmluZyB0eXBlIGFuZCB1bml0IG9mIHRoZSBlbGVtZW50LgorICogICAgZm9yIGV4YW1wbGUsIHN0b3JhZ2UgZWxlbWVudHMgYXJlIGFkZHJlc3NlZCB3aXRoIHR5cGUgPSBDSEVUX1NUIGFuZAorICogICAgdW5pdCA9IDAgLi4gY3BfbnNsb3RzLTEKKyAqCisgKi8KK3N0cnVjdCBjaGFuZ2VyX3BhcmFtcyB7CisJaW50IGNwX2N1cnBpY2tlcjsgIC8qIGN1cnJlbnQgdHJhbnNwb3J0IGVsZW1lbnQgKi8KKwlpbnQgY3BfbnBpY2tlcnM7ICAgLyogbnVtYmVyIG9mIHRyYW5zcG9ydCBlbGVtZW50cyAgICAgIChDSEVUX01UKSAqLworCWludCBjcF9uc2xvdHM7ICAgICAvKiBudW1iZXIgb2Ygc3RvcmFnZSBlbGVtZW50cyAgICAgICAgKENIRVRfU1QpICovCisJaW50IGNwX25wb3J0YWxzOyAgIC8qIG51bWJlciBvZiBpbXBvcnQvZXhwb3J0IGVsZW1lbnRzICAoQ0hFVF9JRSkgKi8KKwlpbnQgY3BfbmRyaXZlczsgICAgLyogbnVtYmVyIG9mIGRhdGEgdHJhbnNmZXIgZWxlbWVudHMgIChDSEVUX0RUKSAqLworfTsKK3N0cnVjdCBjaGFuZ2VyX3ZlbmRvcl9wYXJhbXMgeworCWludCAgY3ZwX24xOyAgICAgICAvKiBudW1iZXIgb2YgdmVuZG9yIHNwZWNpZmljIGVsZW1zICAgKENIRVRfVjEpICovCisJY2hhciBjdnBfbGFiZWwxWzE2XTsKKwlpbnQgIGN2cF9uMjsgICAgICAgLyogbnVtYmVyIG9mIHZlbmRvciBzcGVjaWZpYyBlbGVtcyAgIChDSEVUX1YyKSAqLworCWNoYXIgY3ZwX2xhYmVsMlsxNl07CisJaW50ICBjdnBfbjM7ICAgICAgIC8qIG51bWJlciBvZiB2ZW5kb3Igc3BlY2lmaWMgZWxlbXMgICAoQ0hFVF9WMykgKi8KKwljaGFyIGN2cF9sYWJlbDNbMTZdOworCWludCAgY3ZwX240OyAgICAgICAvKiBudW1iZXIgb2YgdmVuZG9yIHNwZWNpZmljIGVsZW1zICAgKENIRVRfVjQpICovCisJY2hhciBjdnBfbGFiZWw0WzE2XTsKKwlpbnQgIHJlc2VydmVkWzhdOworfTsKKworCisvKgorICogQ0hJT01PVkUKKyAqICAgIG1vdmUgYSBtZWRpdW0gZnJvbSBvbmUgZWxlbWVudCB0byBhbm90aGVyCisgKi8KK3N0cnVjdCBjaGFuZ2VyX21vdmUgeworCWludCBjbV9mcm9tdHlwZTsJLyogdHlwZS91bml0IG9mIHNvdXJjZSBlbGVtZW50ICovCisJaW50IGNtX2Zyb211bml0OwkKKwlpbnQgY21fdG90eXBlOwkvKiB0eXBlL3VuaXQgb2YgZGVzdGluYXRpb24gZWxlbWVudCAqLworCWludCBjbV90b3VuaXQ7CisJaW50IGNtX2ZsYWdzOworfTsKKyNkZWZpbmUgQ01fSU5WRVJUICAgMSAgIC8qIGZsYWc6IHJvdGF0ZSBtZWRpYSAoZm9yIGRvdWJsZS1zaWRlZCBsaWtlIE1PRCkgKi8KKworCisvKgorICogQ0hJT0VYQ0hBTkdFCisgKiAgICBtb3ZlIG9uZSBtZWRpdW0gZnJvbSBlbGVtZW50ICMxIHRvIGVsZW1lbnQgIzIsCisgKiAgICBhbmQgYW5vdGhlciBvbmUgZnJvbSBlbGVtZW50ICMyIHRvIGVsZW1lbnQgIzMuCisgKiAgICBlbGVtZW50ICMxIGFuZCAjMyBhcmUgYWxsb3dlZCB0byBiZSBpZGVudGljYWwuCisgKi8KK3N0cnVjdCBjaGFuZ2VyX2V4Y2hhbmdlIHsKKwlpbnQgY2Vfc3JjdHlwZTsJICAgIC8qIHR5cGUvdW5pdCBvZiBlbGVtZW50ICMxICovCisJaW50IGNlX3NyY3VuaXQ7CisJaW50IGNlX2Zkc3R0eXBlOyAgICAvKiB0eXBlL3VuaXQgb2YgZWxlbWVudCAjMiAqLworCWludCBjZV9mZHN0dW5pdDsKKwlpbnQgY2Vfc2RzdHR5cGU7ICAgIC8qIHR5cGUvdW5pdCBvZiBlbGVtZW50ICMzICovCisJaW50IGNlX3Nkc3R1bml0OworCWludCBjZV9mbGFnczsKK307CisjZGVmaW5lIENFX0lOVkVSVDEgICAxCisjZGVmaW5lIENFX0lOVkVSVDIgICAyCisKKworLyoKKyAqIENISU9QT1NJVElPTgorICogICAgbW92ZSB0aGUgdHJhbnNwb3J0IGVsZW1lbnQgKHJvYm90IGFybSkgdG8gYSBzcGVjaWZpYyBlbGVtZW50LgorICovCitzdHJ1Y3QgY2hhbmdlcl9wb3NpdGlvbiB7CisJaW50IGNwX3R5cGU7CisJaW50IGNwX3VuaXQ7CisJaW50IGNwX2ZsYWdzOworfTsKKyNkZWZpbmUgQ1BfSU5WRVJUICAgMQorCisKKy8qCisgKiBDSElPR1NUQVRVUworICogICAgZ2V0IGVsZW1lbnQgc3RhdHVzIGZvciBhbGwgZWxlbWVudHMgb2YgYSBzcGVjaWZpYyB0eXBlCisgKi8KK3N0cnVjdCBjaGFuZ2VyX2VsZW1lbnRfc3RhdHVzIHsKKwlpbnQgICAgICAgICAgICAgY2VzX3R5cGU7CisJdW5zaWduZWQgY2hhciAgICpjZXNfZGF0YTsKK307CisjZGVmaW5lIENFU1RBVFVTX0ZVTEwgICAgIDB4MDEgLyogZnVsbCAqLworI2RlZmluZSBDRVNUQVRVU19JTVBFWFAgICAweDAyCS8qIG1lZGlhIHdhcyBpbXBvcnRlZCAoaW5zZXJ0ZWQgYnkgc3lzb3ApICovCisjZGVmaW5lIENFU1RBVFVTX0VYQ0VQVCAgIDB4MDQJLyogZXJyb3IgY29uZGl0aW9uICovCisjZGVmaW5lIENFU1RBVFVTX0FDQ0VTUyAgIDB4MDgJLyogYWNjZXNzIGFsbG93ZWQgKi8KKyNkZWZpbmUgQ0VTVEFUVVNfRVhFTkFCICAgMHgxMAkvKiBlbGVtZW50IGNhbiBleHBvcnQgbWVkaWEgKi8KKyNkZWZpbmUgQ0VTVEFUVVNfSU5FTkFCICAgMHgyMAkvKiBlbGVtZW50IGNhbiBpbXBvcnQgbWVkaWEgKi8KKworCisvKgorICogQ0hJT0dFTEVNCisgKiAgICBnZXQgbW9yZSBkZXRhaWxlZCBzdGF0dXMgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIGVsZW1lbnQKKyAqLworc3RydWN0IGNoYW5nZXJfZ2V0X2VsZW1lbnQgeworCWludAljZ2VfdHlwZTsJIC8qIHR5cGUvdW5pdCAqLworCWludAljZ2VfdW5pdDsKKwlpbnQJY2dlX3N0YXR1czsgICAgICAvKiBzdGF0dXMgKi8KKwlpbnQgICAgIGNnZV9lcnJubzsgICAgICAgLyogZXJybm8gKi8KKwlpbnQgICAgIGNnZV9zcmN0eXBlOyAgICAgLyogc291cmNlIGVsZW1lbnQgb2YgdGhlIGxhc3QgbW92ZS9leGNoYW5nZSAqLworCWludCAgICAgY2dlX3NyY3VuaXQ7CisJaW50ICAgICBjZ2VfaWQ7ICAgICAgICAgIC8qIHNjc2kgaWQgIChmb3IgZGF0YSB0cmFuc2ZlciBlbGVtZW50cykgKi8KKwlpbnQgICAgIGNnZV9sdW47ICAgICAgICAgLyogc2NzaSBsdW4gKGZvciBkYXRhIHRyYW5zZmVyIGVsZW1lbnRzKSAqLworCWNoYXIgICAgY2dlX3B2b2x0YWdbMzZdOyAvKiBwcmltYXJ5IHZvbHVtZSB0YWcgKi8KKwljaGFyICAgIGNnZV9hdm9sdGFnWzM2XTsgLyogYWx0ZXJuYXRlIHZvbHVtZSB0YWcgKi8KKwlpbnQgICAgIGNnZV9mbGFnczsKK307CisvKiBmbGFncyAqLworI2RlZmluZSBDR0VfRVJSTk8gICAgIDB4MDEgICAgICAgLyogZXJybm8gYXZhaWxhYmxlICAgICAgICovCisjZGVmaW5lIENHRV9JTlZFUlQgICAgMHgwMiAgICAgICAvKiBtZWRpYSBpbnZlcnRlZCAgICAgICAgKi8KKyNkZWZpbmUgQ0dFX1NSQyAgICAgICAweDA0ICAgICAgIC8qIG1lZGlhIHNyYyBhdmFpbGFibGUgICAqLworI2RlZmluZSBDR0VfSURMVU4gICAgIDB4MDggICAgICAgLyogSUQrTFVOIGF2YWlsYWJsZSAgICAgICovCisjZGVmaW5lIENHRV9QVk9MVEFHICAgMHgxMCAgICAgICAvKiBwcmltYXJ5IHZvbHVtZSB0YWcgYXZhaWxhYmxlICovCisjZGVmaW5lIENHRV9BVk9MVEFHICAgMHgyMCAgICAgICAvKiBhbHRlcm5hdGUgdm9sdW1lIHRhZyBhdmFpbGFibGUgKi8KKworCisvKgorICogQ0hJT1NWT0xUQUcKKyAqICAgIHNldCB2b2x1bWUgdGFnCisgKi8KK3N0cnVjdCBjaGFuZ2VyX3NldF92b2x0YWcgeworCWludAljc3ZfdHlwZTsJIC8qIHR5cGUvdW5pdCAqLworCWludAljc3ZfdW5pdDsKKwljaGFyICAgIGNzdl92b2x0YWdbMzZdOyAgLyogdm9sdW1lIHRhZyAqLworCWludCAgICAgY3N2X2ZsYWdzOworfTsKKyNkZWZpbmUgQ1NWX1BWT0xUQUcgICAweDAxICAgICAgIC8qIHByaW1hcnkgdm9sdW1lIHRhZyAqLworI2RlZmluZSBDU1ZfQVZPTFRBRyAgIDB4MDIgICAgICAgLyogYWx0ZXJuYXRlIHZvbHVtZSB0YWcgKi8KKyNkZWZpbmUgQ1NWX0NMRUFSVEFHICAweDA0ICAgICAgIC8qIGNsZWFyIHZvbHVtZSB0YWcgKi8KKworLyogaW9jdGxzICovCisjZGVmaW5lIENISU9NT1ZFICAgICAgIF9JT1coJ2MnLCAxLHN0cnVjdCBjaGFuZ2VyX21vdmUpCisjZGVmaW5lIENISU9FWENIQU5HRSAgIF9JT1coJ2MnLCAyLHN0cnVjdCBjaGFuZ2VyX2V4Y2hhbmdlKQorI2RlZmluZSBDSElPUE9TSVRJT04gICBfSU9XKCdjJywgMyxzdHJ1Y3QgY2hhbmdlcl9wb3NpdGlvbikKKyNkZWZpbmUgQ0hJT0dQSUNLRVIgICAgX0lPUignYycsIDQsaW50KSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBpbXBsLiAqLworI2RlZmluZSBDSElPU1BJQ0tFUiAgICBfSU9XKCdjJywgNSxpbnQpICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGltcGwuICovCisjZGVmaW5lIENISU9HUEFSQU1TICAgIF9JT1IoJ2MnLCA2LHN0cnVjdCBjaGFuZ2VyX3BhcmFtcykKKyNkZWZpbmUgQ0hJT0dTVEFUVVMgICAgX0lPVygnYycsIDgsc3RydWN0IGNoYW5nZXJfZWxlbWVudF9zdGF0dXMpCisjZGVmaW5lIENISU9HRUxFTSAgICAgIF9JT1coJ2MnLDE2LHN0cnVjdCBjaGFuZ2VyX2dldF9lbGVtZW50KQorI2RlZmluZSBDSElPSU5JVEVMRU0gICBfSU8oJ2MnLDE3KQorI2RlZmluZSBDSElPU1ZPTFRBRyAgICBfSU9XKCdjJywxOCxzdHJ1Y3QgY2hhbmdlcl9zZXRfdm9sdGFnKQorI2RlZmluZSBDSElPR1ZQQVJBTVMgICBfSU9SKCdjJywxOSxzdHJ1Y3QgY2hhbmdlcl92ZW5kb3JfcGFyYW1zKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NtNDAwMF9jcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jbTQwMDBfY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTMwZjA2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jbTQwMDBfY3MuaApAQCAtMCwwICsxLDYyIEBACisjaWZuZGVmCV9DTTQwMDBfSF8KKyNkZWZpbmUJX0NNNDAwMF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZQlNQVhfQVRSCQkJMzMKKworI2RlZmluZQlDTTQwMDBfTUFYX0RFVgkJNAorCisvKiB0aG9zZSB0d28gc3RydWN0dXJlcyBhcmUgcGFzc2VkIHZpYSBpb2N0bCgpIGZyb20vdG8gdXNlcnNwYWNlLiAgVGhleSBhcmUKKyAqIHVzZWQgYnkgZXhpc3RpbmcgdXNlcnNwYWNlIHByb2dyYW1zLCBzbyBJIGtlcHRoIHRoZSBhd2t3YXJkICJiSUZTRCIgbmFtaW5nCisgKiBub3QgdG8gYnJlYWsgY29tcGlsYXRpb24gb2YgdXNlcnNwYWNlIGFwcHMuIC1IVyAqLworCit0eXBlZGVmIHN0cnVjdCBhdHJlcSB7CisJX19zMzIgYXRyX2xlbjsKKwl1bnNpZ25lZCBjaGFyIGF0cls2NF07CisJX19zMzIgcG93ZXJfYWN0OworCXVuc2lnbmVkIGNoYXIgYklGU0Q7CisJdW5zaWduZWQgY2hhciBiSUZTQzsKK30gYXRyZXFfdDsKKworCisvKiB3aGF0IGlzIHBhcnRpY3VsYXJseSBzdHVwaWQgaW4gdGhlIG9yaWdpbmFsIGRyaXZlciBpcyB0aGUgYXJjaC1kZXBlbmRlbnQKKyAqIG1lbWJlciBzaXplcy4gVGhpcyBsZWFkcyB0byBDT05GSUdfQ09NUEFUIGJyZWFrYWdlLCBzaW5jZSAzMmJpdCB1c2Vyc3BhY2UKKyAqIHdpbGwgbGF5IG91dCB0aGUgc3RydWN0dXJlIG1lbWJlcnMgZGlmZmVyZW50bHkgdGhhbiB0aGUgNjRiaXQga2VybmVsLgorICoKKyAqIEkndmUgY2hhbmdlZCAicHRzcmVxLnByb3RvY29sIiBmcm9tICJ1bnNpZ25lZCBsb25nIiB0byAiX191MzIiLgorICogT24gMzJiaXQgdGhpcyB3aWxsIG1ha2Ugbm8gZGlmZmVyZW5jZS4gIFdpdGggNjRiaXQga2VybmVscywgaXQgd2lsbCBtYWtlCisgKiAzMmJpdCBhcHBzIHdvcmssIHRvby4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBwdHNyZXEgeworCV9fdTMyIHByb3RvY29sOyAvKlQ9MDogMl4wLCBUPTE6ICAyXjEqLworIAl1bnNpZ25lZCBjaGFyIGZsYWdzOworIAl1bnNpZ25lZCBjaGFyIHB0czE7CisgCXVuc2lnbmVkIGNoYXIgcHRzMjsKKwl1bnNpZ25lZCBjaGFyIHB0czM7Cit9IHB0c3JlcV90OworCisjZGVmaW5lCUNNX0lPQ19NQUdJQwkJJ2MnCisjZGVmaW5lCUNNX0lPQ19NQVhOUgkgICAgICAgIDI1NQorCisjZGVmaW5lCUNNX0lPQ0dTVEFUVVMJCV9JT1IgKENNX0lPQ19NQUdJQywgMCwgdW5zaWduZWQgY2hhciAqKQorI2RlZmluZQlDTV9JT0NHQVRSCQlfSU9XUihDTV9JT0NfTUFHSUMsIDEsIGF0cmVxX3QgKikKKyNkZWZpbmUJQ01fSU9DU1BUUwkJX0lPVyAoQ01fSU9DX01BR0lDLCAyLCBwdHNyZXFfdCAqKQorI2RlZmluZQlDTV9JT0NTUkRSCQlfSU8gIChDTV9JT0NfTUFHSUMsIDMpCisjZGVmaW5lIENNX0lPQ0FSRE9GRiAgICAgICAgICAgIF9JTyAgKENNX0lPQ19NQUdJQywgNCkKKworI2RlZmluZSBDTV9JT1NEQkdMVkwgICAgICAgICAgICBfSU9XKENNX0lPQ19NQUdJQywgMjUwLCBpbnQqKQorCisvKiBjYXJkIGFuZCBkZXZpY2Ugc3RhdGVzICovCisjZGVmaW5lCUNNX0NBUkRfSU5TRVJURUQJCTB4MDEKKyNkZWZpbmUJQ01fQ0FSRF9QT1dFUkVECQkJMHgwMgorI2RlZmluZQlDTV9BVFJfUFJFU0VOVAkJCTB4MDQKKyNkZWZpbmUJQ01fQVRSX1ZBTElECSAJCTB4MDgKKyNkZWZpbmUJQ01fU1RBVEVfVkFMSUQJCQkweDBmCisvKiBleHRyYSBpbmZvIG9ubHkgZnJvbSBDTTQwMDAgKi8KKyNkZWZpbmUJQ01fTk9fUkVBREVSCQkJMHgxMAorI2RlZmluZQlDTV9CQURfQ0FSRAkJCTB4MjAKKworCisjZW5kaWYJLyogX0NNNDAwMF9IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jbl9wcm9jLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NuX3Byb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzIzY2I5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jbl9wcm9jLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBjbl9wcm9jLmggLSBwcm9jZXNzIGV2ZW50cyBjb25uZWN0b3IKKyAqCisgKiBDb3B5cmlnaHQgKEMpIE1hdHQgSGVsc2xleSwgSUJNIENvcnAuIDIwMDUKKyAqIEJhc2VkIG9uIGNuX2ZvcmsuaCBieSBOZ3V5ZW4gQW5oIFF1eW5oIGFuZCBHdWlsbGF1bWUgVGhvdXZlbmluCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTmd1eWVuIEFuaCBRdXluaCA8YXF1eW5oQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBHdWlsbGF1bWUgVGhvdXZlbmluIDxndWlsbGF1bWUudGhvdXZlbmluQGJ1bGwubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyLjEgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIENOX1BST0NfSAorI2RlZmluZSBDTl9QUk9DX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBVc2Vyc3BhY2Ugc2VuZHMgdGhpcyBlbnVtIHRvIHJlZ2lzdGVyIHdpdGggdGhlIGtlcm5lbCB0aGF0IGl0IGlzIGxpc3RlbmluZworICogZm9yIGV2ZW50cyBvbiB0aGUgY29ubmVjdG9yLgorICovCitlbnVtIHByb2NfY25fbWNhc3Rfb3AgeworCVBST0NfQ05fTUNBU1RfTElTVEVOID0gMSwKKwlQUk9DX0NOX01DQVNUX0lHTk9SRSA9IDIKK307CisKKy8qCisgKiBGcm9tIHRoZSB1c2VyJ3MgcG9pbnQgb2YgdmlldywgdGhlIHByb2Nlc3MKKyAqIElEIGlzIHRoZSB0aHJlYWQgZ3JvdXAgSUQgYW5kIHRocmVhZCBJRCBpcyB0aGUgaW50ZXJuYWwKKyAqIGtlcm5lbCAicGlkIi4gU28sIGZpZWxkcyBhcmUgYXNzaWduZWQgYXMgZm9sbG93OgorICoKKyAqICBJbiB1c2VyIHNwYWNlICAgICAtICBJbiAga2VybmVsIHNwYWNlCisgKgorICogcGFyZW50IHByb2Nlc3MgSUQgID0gIHBhcmVudC0+dGdpZAorICogcGFyZW50IHRocmVhZCAgSUQgID0gIHBhcmVudC0+cGlkCisgKiBjaGlsZCAgcHJvY2VzcyBJRCAgPSAgY2hpbGQtPnRnaWQKKyAqIGNoaWxkICB0aHJlYWQgIElEICA9ICBjaGlsZC0+cGlkCisgKi8KKworc3RydWN0IHByb2NfZXZlbnQgeworCWVudW0gd2hhdCB7CisJCS8qIFVzZSBzdWNjZXNzaXZlIGJpdHMgc28gdGhlIGVudW1zIGNhbiBiZSB1c2VkIHRvIHJlY29yZAorCQkgKiBzZXRzIG9mIGV2ZW50cyBhcyB3ZWxsCisJCSAqLworCQlQUk9DX0VWRU5UX05PTkUgPSAweDAwMDAwMDAwLAorCQlQUk9DX0VWRU5UX0ZPUksgPSAweDAwMDAwMDAxLAorCQlQUk9DX0VWRU5UX0VYRUMgPSAweDAwMDAwMDAyLAorCQlQUk9DX0VWRU5UX1VJRCAgPSAweDAwMDAwMDA0LAorCQlQUk9DX0VWRU5UX0dJRCAgPSAweDAwMDAwMDQwLAorCQlQUk9DX0VWRU5UX1NJRCAgPSAweDAwMDAwMDgwLAorCQlQUk9DX0VWRU5UX1BUUkFDRSA9IDB4MDAwMDAxMDAsCisJCVBST0NfRVZFTlRfQ09NTSA9IDB4MDAwMDAyMDAsCisJCS8qICJuZXh0IiBzaG91bGQgYmUgMHgwMDAwMDQwMCAqLworCQkvKiAibGFzdCIgaXMgdGhlIGxhc3QgcHJvY2VzcyBldmVudDogZXhpdCAqLworCQlQUk9DX0VWRU5UX0VYSVQgPSAweDgwMDAwMDAwCisJfSB3aGF0OworCV9fdTMyIGNwdTsKKwlfX3U2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkgdGltZXN0YW1wX25zOworCQkvKiBOdW1iZXIgb2YgbmFubyBzZWNvbmRzIHNpbmNlIHN5c3RlbSBib290ICovCisJdW5pb24geyAvKiBtdXN0IGJlIGxhc3QgZmllbGQgb2YgcHJvY19ldmVudCBzdHJ1Y3QgKi8KKwkJc3RydWN0IHsKKwkJCV9fdTMyIGVycjsKKwkJfSBhY2s7CisKKwkJc3RydWN0IGZvcmtfcHJvY19ldmVudCB7CisJCQlfX2tlcm5lbF9waWRfdCBwYXJlbnRfcGlkOworCQkJX19rZXJuZWxfcGlkX3QgcGFyZW50X3RnaWQ7CisJCQlfX2tlcm5lbF9waWRfdCBjaGlsZF9waWQ7CisJCQlfX2tlcm5lbF9waWRfdCBjaGlsZF90Z2lkOworCQl9IGZvcms7CisKKwkJc3RydWN0IGV4ZWNfcHJvY19ldmVudCB7CisJCQlfX2tlcm5lbF9waWRfdCBwcm9jZXNzX3BpZDsKKwkJCV9fa2VybmVsX3BpZF90IHByb2Nlc3NfdGdpZDsKKwkJfSBleGVjOworCisJCXN0cnVjdCBpZF9wcm9jX2V2ZW50IHsKKwkJCV9fa2VybmVsX3BpZF90IHByb2Nlc3NfcGlkOworCQkJX19rZXJuZWxfcGlkX3QgcHJvY2Vzc190Z2lkOworCQkJdW5pb24geworCQkJCV9fdTMyIHJ1aWQ7IC8qIHRhc2sgdWlkICovCisJCQkJX191MzIgcmdpZDsgLyogdGFzayBnaWQgKi8KKwkJCX0gcjsKKwkJCXVuaW9uIHsKKwkJCQlfX3UzMiBldWlkOworCQkJCV9fdTMyIGVnaWQ7CisJCQl9IGU7CisJCX0gaWQ7CisKKwkJc3RydWN0IHNpZF9wcm9jX2V2ZW50IHsKKwkJCV9fa2VybmVsX3BpZF90IHByb2Nlc3NfcGlkOworCQkJX19rZXJuZWxfcGlkX3QgcHJvY2Vzc190Z2lkOworCQl9IHNpZDsKKworCQlzdHJ1Y3QgcHRyYWNlX3Byb2NfZXZlbnQgeworCQkJX19rZXJuZWxfcGlkX3QgcHJvY2Vzc19waWQ7CisJCQlfX2tlcm5lbF9waWRfdCBwcm9jZXNzX3RnaWQ7CisJCQlfX2tlcm5lbF9waWRfdCB0cmFjZXJfcGlkOworCQkJX19rZXJuZWxfcGlkX3QgdHJhY2VyX3RnaWQ7CisJCX0gcHRyYWNlOworCisJCXN0cnVjdCBjb21tX3Byb2NfZXZlbnQgeworCQkJX19rZXJuZWxfcGlkX3QgcHJvY2Vzc19waWQ7CisJCQlfX2tlcm5lbF9waWRfdCBwcm9jZXNzX3RnaWQ7CisJCQljaGFyICAgICAgICAgICBjb21tWzE2XTsKKwkJfSBjb21tOworCisJCXN0cnVjdCBleGl0X3Byb2NfZXZlbnQgeworCQkJX19rZXJuZWxfcGlkX3QgcHJvY2Vzc19waWQ7CisJCQlfX2tlcm5lbF9waWRfdCBwcm9jZXNzX3RnaWQ7CisJCQlfX3UzMiBleGl0X2NvZGUsIGV4aXRfc2lnbmFsOworCQl9IGV4aXQ7CisJfSBldmVudF9kYXRhOworfTsKKworI2VuZGlmCS8qIENOX1BST0NfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb2RhLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NvZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjBjN2VhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb2RhLmgKQEAgLTAsMCArMSw3MzcgQEAKKy8qIAorICAgWW91IG1heSBkaXN0cmlidXRlIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgb2YgdGhlIHR3byBsaWNlbnNlcyB0aGF0CisgICBmb2xsb3cgYXQgeW91ciBkaXNjcmV0aW9uLgorKi8KKworLyogQkxVUkIgbGdwbAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RhIEZpbGUgU3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlIDUKKworICAgICAgICAgIENvcHlyaWdodCAoYykgMTk4Ny0xOTk5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIGNvcHlyaWdodHMgbGlzdGVkIGJlbG93CisKK1RoaXMgY29kZSBpcyBkaXN0cmlidXRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSBWZXJzaW9uIDIsIGFzCitzaG93biBpbiB0aGUgZmlsZSBMSUNFTlNFLCBvciB1bmRlciB0aGUgbGljZW5zZSBzaG93biBiZWxvdy4gVGhlCit0ZWNobmljYWwgYW5kIGZpbmFuY2lhbCBjb250cmlidXRvcnMgdG8gQ29kYSBhcmUgbGlzdGVkIGluIHRoZSBmaWxlCitDUkVESVRTLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIGNvcHlyaWdodHMgCisqLworCisvKgorCisgICAgICAgICAgICBDb2RhOiBhbiBFeHBlcmltZW50YWwgRGlzdHJpYnV0ZWQgRmlsZSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZSA0LjAKKworICAgICAgICAgIENvcHlyaWdodCAoYykgMTk4Ny0xOTk5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uICB0byAgdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLCAgcHJvdmlkZWQgIHRoYXQgIGJvdGggIHRoZSAgY29weXJpZ2h0Citub3RpY2UgIGFuZCAgdGhpcyAgcGVybWlzc2lvbiAgbm90aWNlICBhcHBlYXIgIGluICBhbGwgIGNvcGllcyAgb2YgdGhlCitzb2Z0d2FyZSwgZGVyaXZhdGl2ZSB3b3JrcyBvciAgbW9kaWZpZWQgIHZlcnNpb25zLCAgYW5kICBhbnkgIHBvcnRpb25zCit0aGVyZW9mLCBhbmQgdGhhdCBib3RoIG5vdGljZXMgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kCit0aGF0IGNyZWRpdCBpcyBnaXZlbiB0byBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAgaW4gIGFsbCAgZG9jdW1lbnRzCithbmQgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlyZWN0IG9yIGluZGlyZWN0IHVzZSBvZiB0aGlzIGNvZGUgb3IgaXRzCitkZXJpdmF0aXZlcy4KKworQ09EQSBJUyBBTiBFWFBFUklNRU5UQUwgU09GVFdBUkUgU1lTVEVNIEFORCBJUyAgS05PV04gIFRPICBIQVZFICBCVUdTLAorU09NRSAgT0YgIFdISUNIIE1BWSBIQVZFIFNFUklPVVMgQ09OU0VRVUVOQ0VTLiAgQ0FSTkVHSUUgTUVMTE9OIEFMTE9XUworRlJFRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBJTiBJVFMgIkFTIElTIiBDT05ESVRJT04uICAgQ0FSTkVHSUUgIE1FTExPTgorRElTQ0xBSU1TICBBTlkgIExJQUJJTElUWSAgT0YgIEFOWSAgS0lORCAgRk9SICBBTlkgIERBTUFHRVMgV0hBVFNPRVZFUgorUkVTVUxUSU5HIERJUkVDVExZIE9SIElORElSRUNUTFkgRlJPTSBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUgIE9SICBPRgorQU5ZIERFUklWQVRJVkUgV09SSy4KKworQ2FybmVnaWUgIE1lbGxvbiAgZW5jb3VyYWdlcyAgdXNlcnMgIG9mICB0aGlzICBzb2Z0d2FyZSAgdG8gcmV0dXJuIGFueQoraW1wcm92ZW1lbnRzIG9yIGV4dGVuc2lvbnMgdGhhdCAgdGhleSAgbWFrZSwgIGFuZCAgdG8gIGdyYW50ICBDYXJuZWdpZQorTWVsbG9uIHRoZSByaWdodHMgdG8gcmVkaXN0cmlidXRlIHRoZXNlIGNoYW5nZXMgd2l0aG91dCBlbmN1bWJyYW5jZS4KKyovCisKKy8qCisgKgorICogQmFzZWQgb24gY2ZzLmggZnJvbSBNYWNoLCBidXQgcmV2YW1wZWQgZm9yIGluY3JlYXNlZCBzaW1wbGljaXR5LgorICogTGludXggbW9kaWZpY2F0aW9ucyBieSAKKyAqIFBldGVyIEJyYWFtLCBBdWcgMTk5NgorICovCisKKyNpZm5kZWYgX0NPREFfSEVBREVSXworI2RlZmluZSBfQ09EQV9IRUFERVJfCisKKworLyogQ2F0Y2ggbmV3IF9LRVJORUwgZGVmbiBmb3IgTmV0QlNEIGFuZCBESkdQUC9fX0NZR1dJTjMyX18gKi8KKyNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IFwKKyAgKChkZWZpbmVkKERKR1BQKSB8fCBkZWZpbmVkKF9fQ1lHV0lOMzJfXykpICYmICFkZWZpbmVkKEtFUk5FTCkpCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYgCisKKyNpZm5kZWYgQ09EQV9NQVhTWU1MSU5LUworI2RlZmluZSBDT0RBX01BWFNZTUxJTktTIDEwCisjZW5kaWYKKworI2lmIGRlZmluZWQoREpHUFApIHx8IGRlZmluZWQoX19DWUdXSU4zMl9fKQorI2lmZGVmIEtFUk5FTAordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVfbG9uZzsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X3Nob3J0OwordHlwZWRlZiB1X2xvbmcgaW5vX3Q7Cit0eXBlZGVmIHVfbG9uZyBkZXZfdDsKK3R5cGVkZWYgdm9pZCAqIGNhZGRyX3Q7CisjaWZkZWYgRE9TCit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdV9xdWFkX3Q7CisjZWxzZSAKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVfcXVhZF90OworI2VuZGlmCisKKyNkZWZpbmUgX19pbmxpbmVfXworCitzdHJ1Y3QgdGltZXNwZWMgeworICAgICAgICBsb25nICAgICAgIHRzX3NlYzsKKyAgICAgICAgbG9uZyAgICAgICB0c19uc2VjOworfTsKKyNlbHNlICAvKiBESkdQUCBidXQgbm90IEtFUk5FTCAqLworI2luY2x1ZGUgPHN5cy90aW1lLmg+Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1X3F1YWRfdDsKKyNlbmRpZiAvKiAhS0VSTkVMICovCisjZW5kaWYgLyogIURKR1BQICovCisKKworI2lmIGRlZmluZWQoX19saW51eF9fKQorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNkZWZpbmUgY2Rldl90IHVfcXVhZF90CisjaWYgIWRlZmluZWQoX1VRVUFEX1RfKSAmJiAoIWRlZmluZWQoX19HTElCQ19fKSB8fCBfX0dMSUJDX18gPCAyKQorI2RlZmluZSBfVVFVQURfVF8gMQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdV9xdWFkX3Q7CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIGNkZXZfdCBkZXZfdAorI2VuZGlmCisKKyNpZmRlZiBfX0NZR1dJTjMyX18KK3N0cnVjdCB0aW1lc3BlYyB7CisgICAgICAgIHRpbWVfdCAgdHZfc2VjOyAgICAgICAgIC8qIHNlY29uZHMgKi8KKyAgICAgICAgbG9uZyAgICB0dl9uc2VjOyAgICAgICAgLyogbmFub3NlY29uZHMgKi8KK307CisjZW5kaWYKKworI2lmbmRlZiBfX0JJVF9UWVBFU19ERUZJTkVEX18KKyNkZWZpbmUgX19CSVRfVFlQRVNfREVGSU5FRF9fCit0eXBlZGVmIHNpZ25lZCBjaGFyCSAgICAgIGludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkgICAgdV9pbnQ4X3Q7Cit0eXBlZGVmIHNob3J0CQkgICAgIGludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CSAgIHVfaW50MTZfdDsKK3R5cGVkZWYgaW50CQkgICAgIGludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkgICB1X2ludDMyX3Q7CisjZW5kaWYKKworCisvKgorICogQ2ZzIGNvbnN0YW50cworICovCisjZGVmaW5lIENPREFfTUFYTkFNTEVOICAgMjU1CisjZGVmaW5lIENPREFfTUFYUEFUSExFTiAgMTAyNAorI2RlZmluZSBDT0RBX01BWFNZTUxJTksgIDEwCisKKy8qIHRoZXNlIGFyZSBDb2RhJ3MgdmVyc2lvbiBvZiBPX1JET05MWSBldGMgY29tYmluYXRpb25zCisgKiB0byBkZWFsIHdpdGggVkZTIG9wZW4gbW9kZXMKKyAqLworI2RlZmluZQlDX09fUkVBRAkweDAwMQorI2RlZmluZQlDX09fV1JJVEUgICAgICAgMHgwMDIKKyNkZWZpbmUgQ19PX1RSVU5DICAgICAgIDB4MDEwCisjZGVmaW5lIENfT19FWENMCTB4MTAwCisjZGVmaW5lIENfT19DUkVBVAkweDIwMAorCisvKiB0aGVzZSBhcmUgdG8gZmluZCBtb2RlIGJpdHMgaW4gVmVudXMgKi8gCisjZGVmaW5lIENfTV9SRUFEICAwMDQwMAorI2RlZmluZSBDX01fV1JJVEUgMDAyMDAKKworLyogZm9yIGFjY2VzcyBWZW51cyB3aWxsIHVzZSAqLworI2RlZmluZSBDX0FfQ19PSyAgICA4ICAgICAgICAgICAgICAgLyogVGVzdCBmb3Igd3JpdGluZyB1cG9uIGNyZWF0ZS4gICovCisjZGVmaW5lIENfQV9SX09LICAgIDQgICAgICAgICAgICAgICAvKiBUZXN0IGZvciByZWFkIHBlcm1pc3Npb24uICAqLworI2RlZmluZSBDX0FfV19PSyAgICAyICAgICAgICAgICAgICAgLyogVGVzdCBmb3Igd3JpdGUgcGVybWlzc2lvbi4gICovCisjZGVmaW5lIENfQV9YX09LICAgIDEgICAgICAgICAgICAgICAvKiBUZXN0IGZvciBleGVjdXRlIHBlcm1pc3Npb24uICAqLworI2RlZmluZSBDX0FfRl9PSyAgICAwICAgICAgICAgICAgICAgLyogVGVzdCBmb3IgZXhpc3RlbmNlLiAgKi8KKworCisKKyNpZm5kZWYgX1ZFTlVTX0RJUkVOVF9UXworI2RlZmluZSBfVkVOVVNfRElSRU5UX1RfIDEKK3N0cnVjdCB2ZW51c19kaXJlbnQgeworICAgICAgICB1X2ludDMyX3QgZF9maWxlbm87CQkvKiBmaWxlIG51bWJlciBvZiBlbnRyeSAqLworICAgICAgICB1X2ludDE2X3QgZF9yZWNsZW47CQkvKiBsZW5ndGggb2YgdGhpcyByZWNvcmQgKi8KKyAgICAgICAgdV9pbnQ4X3QgIGRfdHlwZTsJCQkvKiBmaWxlIHR5cGUsIHNlZSBiZWxvdyAqLworICAgICAgICB1X2ludDhfdCAgZF9uYW1sZW47CQkvKiBsZW5ndGggb2Ygc3RyaW5nIGluIGRfbmFtZSAqLworICAgICAgICBjaGFyCSAgZF9uYW1lW0NPREFfTUFYTkFNTEVOICsgMV07LyogbmFtZSBtdXN0IGJlIG5vIGxvbmdlciB0aGFuIHRoaXMgKi8KK307CisjdW5kZWYgRElSU0laCisjZGVmaW5lIERJUlNJWihkcCkgICAgICAoKHNpemVvZiAoc3RydWN0IHZlbnVzX2RpcmVudCkgLSAoQ09EQV9NQVhOQU1MRU4rMSkpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoKGRwKS0+ZF9uYW1sZW4rMSArIDMpICZ+IDMpKQorCisvKgorICogRmlsZSB0eXBlcworICovCisjZGVmaW5lCUNEVF9VTktOT1dOCSAwCisjZGVmaW5lCUNEVF9GSUZPCSAxCisjZGVmaW5lCUNEVF9DSFIJCSAyCisjZGVmaW5lCUNEVF9ESVIJCSA0CisjZGVmaW5lCUNEVF9CTEsJCSA2CisjZGVmaW5lCUNEVF9SRUcJCSA4CisjZGVmaW5lCUNEVF9MTksJCTEwCisjZGVmaW5lCUNEVF9TT0NLCTEyCisjZGVmaW5lCUNEVF9XSFQJCTE0CisKKy8qCisgKiBDb252ZXJ0IGJldHdlZW4gc3RhdCBzdHJ1Y3R1cmUgdHlwZXMgYW5kIGRpcmVjdG9yeSB0eXBlcy4KKyAqLworI2RlZmluZQlJRlRPQ0RUKG1vZGUpCSgoKG1vZGUpICYgMDE3MDAwMCkgPj4gMTIpCisjZGVmaW5lCUNEVFRPSUYoZGlydHlwZSkJKChkaXJ0eXBlKSA8PCAxMikKKworI2VuZGlmCisKKyNpZm5kZWYgX1ZVSURfVF8KKyNkZWZpbmUgX1ZVSURfVF8KK3R5cGVkZWYgdV9pbnQzMl90IHZ1aWRfdDsKK3R5cGVkZWYgdV9pbnQzMl90IHZnaWRfdDsKKyNlbmRpZiAvKl9WVUlEX1RfICovCisKK3N0cnVjdCBDb2RhRmlkIHsKKwl1X2ludDMyX3Qgb3BhcXVlWzRdOworfTsKKworI2RlZmluZSBjb2RhX2YyaShmaWQpXAorCShmaWQgPyAoZmlkLT5vcGFxdWVbM10gXiAoZmlkLT5vcGFxdWVbMl08PDEwKSBeIChmaWQtPm9wYXF1ZVsxXTw8MjApIF4gZmlkLT5vcGFxdWVbMF0pIDogMCkKKworI2lmbmRlZiBfVkVOVVNfVkFUVFJfVF8KKyNkZWZpbmUgX1ZFTlVTX1ZBVFRSX1RfCisvKgorICogVm5vZGUgdHlwZXMuICBWTk9OIG1lYW5zIG5vIHR5cGUuCisgKi8KK2VudW0gY29kYV92dHlwZQl7IENfVk5PTiwgQ19WUkVHLCBDX1ZESVIsIENfVkJMSywgQ19WQ0hSLCBDX1ZMTkssIENfVlNPQ0ssIENfVkZJRk8sIENfVkJBRCB9OworCitzdHJ1Y3QgY29kYV92YXR0ciB7CisJbG9uZyAgICAgCXZhX3R5cGU7CS8qIHZub2RlIHR5cGUgKGZvciBjcmVhdGUpICovCisJdV9zaG9ydAkJdmFfbW9kZTsJLyogZmlsZXMgYWNjZXNzIG1vZGUgYW5kIHR5cGUgKi8KKwlzaG9ydAkJdmFfbmxpbms7CS8qIG51bWJlciBvZiByZWZlcmVuY2VzIHRvIGZpbGUgKi8KKwl2dWlkX3QJCXZhX3VpZDsJCS8qIG93bmVyIHVzZXIgaWQgKi8KKwl2Z2lkX3QJCXZhX2dpZDsJCS8qIG93bmVyIGdyb3VwIGlkICovCisJbG9uZwkJdmFfZmlsZWlkOwkvKiBmaWxlIGlkICovCisJdV9xdWFkX3QJdmFfc2l6ZTsJLyogZmlsZSBzaXplIGluIGJ5dGVzICovCisJbG9uZwkJdmFfYmxvY2tzaXplOwkvKiBibG9ja3NpemUgcHJlZmVycmVkIGZvciBpL28gKi8KKwlzdHJ1Y3QgdGltZXNwZWMJdmFfYXRpbWU7CS8qIHRpbWUgb2YgbGFzdCBhY2Nlc3MgKi8KKwlzdHJ1Y3QgdGltZXNwZWMJdmFfbXRpbWU7CS8qIHRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24gKi8KKwlzdHJ1Y3QgdGltZXNwZWMJdmFfY3RpbWU7CS8qIHRpbWUgZmlsZSBjaGFuZ2VkICovCisJdV9sb25nCQl2YV9nZW47CQkvKiBnZW5lcmF0aW9uIG51bWJlciBvZiBmaWxlICovCisJdV9sb25nCQl2YV9mbGFnczsJLyogZmxhZ3MgZGVmaW5lZCBmb3IgZmlsZSAqLworCWNkZXZfdAkgICAgICAgIHZhX3JkZXY7CS8qIGRldmljZSBzcGVjaWFsIGZpbGUgcmVwcmVzZW50cyAqLworCXVfcXVhZF90CXZhX2J5dGVzOwkvKiBieXRlcyBvZiBkaXNrIHNwYWNlIGhlbGQgYnkgZmlsZSAqLworCXVfcXVhZF90CXZhX2ZpbGVyZXY7CS8qIGZpbGUgbW9kaWZpY2F0aW9uIG51bWJlciAqLworfTsKKworI2VuZGlmIAorCisvKiBzdHJ1Y3R1cmUgdXNlZCBieSBDT0RBX1NUQVRGUyBmb3IgZ2V0dGluZyBjYWNoZSBpbmZvcm1hdGlvbiBmcm9tIHZlbnVzICovCitzdHJ1Y3QgY29kYV9zdGF0ZnMgeworICAgIGludDMyX3QgZl9ibG9ja3M7CisgICAgaW50MzJfdCBmX2JmcmVlOworICAgIGludDMyX3QgZl9iYXZhaWw7CisgICAgaW50MzJfdCBmX2ZpbGVzOworICAgIGludDMyX3QgZl9mZnJlZTsKK307CisKKy8qCisgKiBLZXJuZWwgPC0tPiBWZW51cyBjb21tdW5pY2F0aW9ucy4KKyAqLworCisjZGVmaW5lIENPREFfUk9PVAkyCisjZGVmaW5lIENPREFfT1BFTl9CWV9GRAkzCisjZGVmaW5lIENPREFfT1BFTgk0CisjZGVmaW5lIENPREFfQ0xPU0UJNQorI2RlZmluZSBDT0RBX0lPQ1RMCTYKKyNkZWZpbmUgQ09EQV9HRVRBVFRSCTcKKyNkZWZpbmUgQ09EQV9TRVRBVFRSCTgKKyNkZWZpbmUgQ09EQV9BQ0NFU1MJOQorI2RlZmluZSBDT0RBX0xPT0tVUAkxMAorI2RlZmluZSBDT0RBX0NSRUFURQkxMQorI2RlZmluZSBDT0RBX1JFTU9WRQkxMgorI2RlZmluZSBDT0RBX0xJTksJMTMKKyNkZWZpbmUgQ09EQV9SRU5BTUUJMTQKKyNkZWZpbmUgQ09EQV9NS0RJUgkxNQorI2RlZmluZSBDT0RBX1JNRElSCTE2CisjZGVmaW5lIENPREFfU1lNTElOSwkxOAorI2RlZmluZSBDT0RBX1JFQURMSU5LCTE5CisjZGVmaW5lIENPREFfRlNZTkMJMjAKKyNkZWZpbmUgQ09EQV9WR0VUCTIyCisjZGVmaW5lIENPREFfU0lHTkFMCTIzCisjZGVmaW5lIENPREFfUkVQTEFDRQkgMjQgLyogRE9XTkNBTEwgKi8KKyNkZWZpbmUgQ09EQV9GTFVTSCAgICAgICAyNSAvKiBET1dOQ0FMTCAqLworI2RlZmluZSBDT0RBX1BVUkdFVVNFUiAgIDI2IC8qIERPV05DQUxMICovCisjZGVmaW5lIENPREFfWkFQRklMRSAgICAgMjcgLyogRE9XTkNBTEwgKi8KKyNkZWZpbmUgQ09EQV9aQVBESVIgICAgICAyOCAvKiBET1dOQ0FMTCAqLworI2RlZmluZSBDT0RBX1BVUkdFRklEICAgIDMwIC8qIERPV05DQUxMICovCisjZGVmaW5lIENPREFfT1BFTl9CWV9QQVRIIDMxCisjZGVmaW5lIENPREFfUkVTT0xWRSAgICAgMzIKKyNkZWZpbmUgQ09EQV9SRUlOVEVHUkFURSAzMworI2RlZmluZSBDT0RBX1NUQVRGUwkgMzQKKyNkZWZpbmUgQ09EQV9TVE9SRQkgMzUKKyNkZWZpbmUgQ09EQV9SRUxFQVNFCSAzNgorI2RlZmluZSBDT0RBX05DQUxMUyAzNworCisjZGVmaW5lIERPV05DQUxMKG9wY29kZSkgKG9wY29kZSA+PSBDT0RBX1JFUExBQ0UgJiYgb3Bjb2RlIDw9IENPREFfUFVSR0VGSUQpCisKKyNkZWZpbmUgVkNfTUFYREFUQVNJWkUJICAgIDgxOTIKKyNkZWZpbmUgVkNfTUFYTVNHU0laRSAgICAgIHNpemVvZih1bmlvbiBpbnB1dEFyZ3MpK3NpemVvZih1bmlvbiBvdXRwdXRBcmdzKSArXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDX01BWERBVEFTSVpFICAKKworI2RlZmluZSBDSU9DX0tFUk5FTF9WRVJTSU9OIF9JT1dSKCdjJywgMTAsIHNpemVfdCkKKworI2RlZmluZSBDT0RBX0tFUk5FTF9WRVJTSU9OIDMgLyogMTI4LWJpdCBmaWxlIGlkZW50aWZpZXJzICovCisKKy8qCisgKiAgICAgICAgVmVudXMgPC0+IENvZGEgIFJQQyBhcmd1bWVudHMKKyAqLworc3RydWN0IGNvZGFfaW5faGRyIHsKKyAgICB1X2ludDMyX3Qgb3Bjb2RlOworICAgIHVfaW50MzJfdCB1bmlxdWU7CSAgICAvKiBLZWVwIG11bHRpcGxlIG91dHN0YW5kaW5nIG1zZ3MgZGlzdGluY3QgKi8KKyAgICBwaWRfdCBwaWQ7CisgICAgcGlkX3QgcGdpZDsKKyAgICB2dWlkX3QgdWlkOworfTsKKworLyogUmVhbGx5IGltcG9ydGFudCB0aGF0IG9wY29kZSBhbmQgdW5pcXVlIGFyZSAxc3QgdHdvIGZpZWxkcyEgKi8KK3N0cnVjdCBjb2RhX291dF9oZHIgeworICAgIHVfaW50MzJfdCBvcGNvZGU7CisgICAgdV9pbnQzMl90IHVuaXF1ZTsJCisgICAgdV9pbnQzMl90IHJlc3VsdDsKK307CisKKy8qIGNvZGFfcm9vdDogTk9fSU4gKi8KK3N0cnVjdCBjb2RhX3Jvb3Rfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7Cit9OworCitzdHJ1Y3QgY29kYV9yb290X2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaW47Cit9OworCisvKiBjb2RhX29wZW46ICovCitzdHJ1Y3QgY29kYV9vcGVuX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQJZmxhZ3M7Cit9OworCitzdHJ1Y3QgY29kYV9vcGVuX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBjZGV2X3QJZGV2OworICAgIGlub190CWlub2RlOworfTsKKworCisvKiBjb2RhX3N0b3JlOiAqLworc3RydWN0IGNvZGFfc3RvcmVfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBWRmlkOworICAgIGludAlmbGFnczsKK307CisKK3N0cnVjdCBjb2RhX3N0b3JlX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvdXQ7Cit9OworCisvKiBjb2RhX3JlbGVhc2U6ICovCitzdHJ1Y3QgY29kYV9yZWxlYXNlX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQJZmxhZ3M7Cit9OworCitzdHJ1Y3QgY29kYV9yZWxlYXNlX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvdXQ7Cit9OworCisvKiBjb2RhX2Nsb3NlOiAqLworc3RydWN0IGNvZGFfY2xvc2VfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBWRmlkOworICAgIGludAlmbGFnczsKK307CisKK3N0cnVjdCBjb2RhX2Nsb3NlX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvdXQ7Cit9OworCisvKiBjb2RhX2lvY3RsOiAqLworc3RydWN0IGNvZGFfaW9jdGxfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBWRmlkOworICAgIGludAljbWQ7CisgICAgaW50CWxlbjsKKyAgICBpbnQJcndmbGFnOworICAgIGNoYXIgKmRhdGE7CQkJLyogUGxhY2UgaG9sZGVyIGZvciBkYXRhLiAqLworfTsKKworc3RydWN0IGNvZGFfaW9jdGxfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIGludAlsZW47CisgICAgY2FkZHJfdAlkYXRhOwkJLyogUGxhY2UgaG9sZGVyIGZvciBkYXRhLiAqLworfTsKKworCisvKiBjb2RhX2dldGF0dHI6ICovCitzdHJ1Y3QgY29kYV9nZXRhdHRyX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKK307CisKK3N0cnVjdCBjb2RhX2dldGF0dHJfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBjb2RhX3ZhdHRyIGF0dHI7Cit9OworCisKKy8qIGNvZGFfc2V0YXR0cjogTk9fT1VUICovCitzdHJ1Y3QgY29kYV9zZXRhdHRyX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBzdHJ1Y3QgY29kYV92YXR0ciBhdHRyOworfTsKKworc3RydWN0IGNvZGFfc2V0YXR0cl9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9hY2Nlc3M6IE5PX09VVCAqLworc3RydWN0IGNvZGFfYWNjZXNzX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQJZmxhZ3M7Cit9OworCitzdHJ1Y3QgY29kYV9hY2Nlc3Nfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG91dDsKK307CisKKworLyogbG9va3VwIGZsYWdzICovCisjZGVmaW5lIENMVV9DQVNFX1NFTlNJVElWRSAgICAgMHgwMQorI2RlZmluZSBDTFVfQ0FTRV9JTlNFTlNJVElWRSAgIDB4MDIKKworLyogY29kYV9sb29rdXA6ICovCitzdHJ1Y3QgIGNvZGFfbG9va3VwX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQgICAgICAgICBuYW1lOwkJLyogUGxhY2UgaG9sZGVyIGZvciBkYXRhLiAqLworICAgIGludCAgICAgICAgIGZsYWdzOwkKK307CisKK3N0cnVjdCBjb2RhX2xvb2t1cF9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQJdnR5cGU7Cit9OworCisKKy8qIGNvZGFfY3JlYXRlOiAqLworc3RydWN0IGNvZGFfY3JlYXRlX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBzdHJ1Y3QgY29kYV92YXR0ciBhdHRyOworICAgIGludCBleGNsOworICAgIGludCBtb2RlOworICAgIGludCAJbmFtZTsJCS8qIFBsYWNlIGhvbGRlciBmb3IgZGF0YS4gKi8KK307CisKK3N0cnVjdCBjb2RhX2NyZWF0ZV9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBzdHJ1Y3QgY29kYV92YXR0ciBhdHRyOworfTsKKworCisvKiBjb2RhX3JlbW92ZTogTk9fT1VUICovCitzdHJ1Y3QgY29kYV9yZW1vdmVfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBWRmlkOworICAgIGludCBuYW1lOwkJLyogUGxhY2UgaG9sZGVyIGZvciBkYXRhLiAqLworfTsKKworc3RydWN0IGNvZGFfcmVtb3ZlX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvdXQ7Cit9OworCisvKiBjb2RhX2xpbms6IE5PX09VVCAqLworc3RydWN0IGNvZGFfbGlua19pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIHNvdXJjZUZpZDsJLyogY25vZGUgdG8gbGluayAqdG8qICovCisgICAgc3RydWN0IENvZGFGaWQgZGVzdEZpZDsJLyogRGlyZWN0b3J5IGluIHdoaWNoIHRvIHBsYWNlIGxpbmsgKi8KKyAgICBpbnQgdG5hbWU7CQkvKiBQbGFjZSBob2xkZXIgZm9yIGRhdGEuICovCit9OworCitzdHJ1Y3QgY29kYV9saW5rX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvdXQ7Cit9OworCisKKy8qIGNvZGFfcmVuYW1lOiBOT19PVVQgKi8KK3N0cnVjdCBjb2RhX3JlbmFtZV9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIHNvdXJjZUZpZDsKKyAgICBpbnQgCXNyY25hbWU7CisgICAgc3RydWN0IENvZGFGaWQgZGVzdEZpZDsKKyAgICBpbnQgCWRlc3RuYW1lOworfTsKKworc3RydWN0IGNvZGFfcmVuYW1lX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvdXQ7Cit9OworCisvKiBjb2RhX21rZGlyOiAqLworc3RydWN0IGNvZGFfbWtkaXJfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBWRmlkOworICAgIHN0cnVjdCBjb2RhX3ZhdHRyIGF0dHI7CisgICAgaW50CSAgIG5hbWU7CQkvKiBQbGFjZSBob2xkZXIgZm9yIGRhdGEuICovCit9OworCitzdHJ1Y3QgY29kYV9ta2Rpcl9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBzdHJ1Y3QgY29kYV92YXR0ciBhdHRyOworfTsKKworCisvKiBjb2RhX3JtZGlyOiBOT19PVVQgKi8KK3N0cnVjdCBjb2RhX3JtZGlyX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQgbmFtZTsJCS8qIFBsYWNlIGhvbGRlciBmb3IgZGF0YS4gKi8KK307CisKK3N0cnVjdCBjb2RhX3JtZGlyX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvdXQ7Cit9OworCisvKiBjb2RhX3N5bWxpbms6IE5PX09VVCAqLworc3RydWN0IGNvZGFfc3ltbGlua19pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CS8qIERpcmVjdG9yeSB0byBwdXQgc3ltbGluayBpbiAqLworICAgIGludCBzcmNuYW1lOworICAgIHN0cnVjdCBjb2RhX3ZhdHRyIGF0dHI7CisgICAgaW50IHRuYW1lOworfTsKKworc3RydWN0IGNvZGFfc3ltbGlua19vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9yZWFkbGluazogKi8KK3N0cnVjdCBjb2RhX3JlYWRsaW5rX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKK307CisKK3N0cnVjdCBjb2RhX3JlYWRsaW5rX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBpbnQJY291bnQ7CisgICAgY2FkZHJfdAlkYXRhOwkJLyogUGxhY2UgaG9sZGVyIGZvciBkYXRhLiAqLworfTsKKworCisvKiBjb2RhX2ZzeW5jOiBOT19PVVQgKi8KK3N0cnVjdCBjb2RhX2ZzeW5jX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKK307CisKK3N0cnVjdCBjb2RhX2ZzeW5jX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvdXQ7Cit9OworCisvKiBjb2RhX3ZnZXQ6ICovCitzdHJ1Y3QgY29kYV92Z2V0X2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKK307CisKK3N0cnVjdCBjb2RhX3ZnZXRfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50CXZ0eXBlOworfTsKKworCisvKiBDT0RBX1NJR05BTCBpcyBvdXQtb2YtYmFuZCwgZG9lc24ndCBuZWVkIGRhdGEuICovCisvKiBDT0RBX0lOVkFMSURBVEUgaXMgYSB2ZW51cy0+a2VybmVsIGNhbGwgKi8KKy8qIENPREFfRkxVU0ggaXMgYSB2ZW51cy0+a2VybmVsIGNhbGwgKi8KKworLyogY29kYV9wdXJnZXVzZXI6ICovCisvKiBDT0RBX1BVUkdFVVNFUiBpcyBhIHZlbnVzLT5rZXJuZWwgY2FsbCAqLworc3RydWN0IGNvZGFfcHVyZ2V1c2VyX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICB2dWlkX3QgdWlkOworfTsKKworLyogY29kYV96YXBmaWxlOiAqLworLyogQ09EQV9aQVBGSUxFIGlzIGEgdmVudXMtPmtlcm5lbCBjYWxsICovCitzdHJ1Y3QgY29kYV96YXBmaWxlX291dCB7ICAKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBDb2RhRmlkIENvZGFGaWQ7Cit9OworCisvKiBjb2RhX3phcGRpcjogKi8KKy8qIENPREFfWkFQRElSIGlzIGEgdmVudXMtPmtlcm5lbCBjYWxsICovCQorc3RydWN0IGNvZGFfemFwZGlyX291dCB7CSAgCisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBDb2RhRmlkOworfTsKKworLyogY29kYV9wdXJnZWZpZDogKi8KKy8qIENPREFfUFVSR0VGSUQgaXMgYSB2ZW51cy0+a2VybmVsIGNhbGwgKi8JCitzdHJ1Y3QgY29kYV9wdXJnZWZpZF9vdXQgeyAKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBDb2RhRmlkIENvZGFGaWQ7Cit9OworCisvKiBjb2RhX3JlcGxhY2U6ICovCisvKiBDT0RBX1JFUExBQ0UgaXMgYSB2ZW51cy0+a2VybmVsIGNhbGwgKi8JCitzdHJ1Y3QgY29kYV9yZXBsYWNlX291dCB7IC8qIGNvZGFfcmVwbGFjZSBpcyBhIHZlbnVzLT5rZXJuZWwgY2FsbCAqLworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgc3RydWN0IENvZGFGaWQgTmV3RmlkOworICAgIHN0cnVjdCBDb2RhRmlkIE9sZEZpZDsKK307CisKKy8qIGNvZGFfb3Blbl9ieV9mZDogKi8KK3N0cnVjdCBjb2RhX29wZW5fYnlfZmRfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBWRmlkOworICAgIGludCAgICAgICAgZmxhZ3M7Cit9OworCitzdHJ1Y3QgY29kYV9vcGVuX2J5X2ZkX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBpbnQgZmQ7CisKK307CisKKy8qIGNvZGFfb3Blbl9ieV9wYXRoOiAqLworc3RydWN0IGNvZGFfb3Blbl9ieV9wYXRoX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQJZmxhZ3M7Cit9OworCitzdHJ1Y3QgY29kYV9vcGVuX2J5X3BhdGhfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworCWludCBwYXRoOworfTsKKworLyogY29kYV9zdGF0ZnM6IE5PX0lOICovCitzdHJ1Y3QgY29kYV9zdGF0ZnNfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpbjsKK307CisKK3N0cnVjdCBjb2RhX3N0YXRmc19vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgc3RydWN0IGNvZGFfc3RhdGZzIHN0YXQ7Cit9OworCisvKiAKKyAqIE9jY2FzaW9uYWxseSwgd2UgZG9uJ3QgY2FjaGUgdGhlIGZpZCByZXR1cm5lZCBieSBDT0RBX0xPT0tVUC4gCisgKiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBmaWQgaXMgaW5jb25zaXN0ZW50LiAKKyAqIFRoaXMgY2FzZSBpcyBoYW5kbGVkIGJ5IHNldHRpbmcgdGhlIHRvcCBiaXQgb2YgdGhlIHR5cGUgcmVzdWx0IHBhcmFtZXRlci4KKyAqLworI2RlZmluZSBDT0RBX05PQ0FDSEUgICAgICAgICAgMHg4MDAwMDAwMAorCit1bmlvbiBpbnB1dEFyZ3MgeworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsJCS8qIE5COiBldmVyeSBzdHJ1Y3QgYmVsb3cgYmVnaW5zIHdpdGggYW4gaWggKi8KKyAgICBzdHJ1Y3QgY29kYV9vcGVuX2luIGNvZGFfb3BlbjsKKyAgICBzdHJ1Y3QgY29kYV9zdG9yZV9pbiBjb2RhX3N0b3JlOworICAgIHN0cnVjdCBjb2RhX3JlbGVhc2VfaW4gY29kYV9yZWxlYXNlOworICAgIHN0cnVjdCBjb2RhX2Nsb3NlX2luIGNvZGFfY2xvc2U7CisgICAgc3RydWN0IGNvZGFfaW9jdGxfaW4gY29kYV9pb2N0bDsKKyAgICBzdHJ1Y3QgY29kYV9nZXRhdHRyX2luIGNvZGFfZ2V0YXR0cjsKKyAgICBzdHJ1Y3QgY29kYV9zZXRhdHRyX2luIGNvZGFfc2V0YXR0cjsKKyAgICBzdHJ1Y3QgY29kYV9hY2Nlc3NfaW4gY29kYV9hY2Nlc3M7CisgICAgc3RydWN0IGNvZGFfbG9va3VwX2luIGNvZGFfbG9va3VwOworICAgIHN0cnVjdCBjb2RhX2NyZWF0ZV9pbiBjb2RhX2NyZWF0ZTsKKyAgICBzdHJ1Y3QgY29kYV9yZW1vdmVfaW4gY29kYV9yZW1vdmU7CisgICAgc3RydWN0IGNvZGFfbGlua19pbiBjb2RhX2xpbms7CisgICAgc3RydWN0IGNvZGFfcmVuYW1lX2luIGNvZGFfcmVuYW1lOworICAgIHN0cnVjdCBjb2RhX21rZGlyX2luIGNvZGFfbWtkaXI7CisgICAgc3RydWN0IGNvZGFfcm1kaXJfaW4gY29kYV9ybWRpcjsKKyAgICBzdHJ1Y3QgY29kYV9zeW1saW5rX2luIGNvZGFfc3ltbGluazsKKyAgICBzdHJ1Y3QgY29kYV9yZWFkbGlua19pbiBjb2RhX3JlYWRsaW5rOworICAgIHN0cnVjdCBjb2RhX2ZzeW5jX2luIGNvZGFfZnN5bmM7CisgICAgc3RydWN0IGNvZGFfdmdldF9pbiBjb2RhX3ZnZXQ7CisgICAgc3RydWN0IGNvZGFfb3Blbl9ieV9mZF9pbiBjb2RhX29wZW5fYnlfZmQ7CisgICAgc3RydWN0IGNvZGFfb3Blbl9ieV9wYXRoX2luIGNvZGFfb3Blbl9ieV9wYXRoOworICAgIHN0cnVjdCBjb2RhX3N0YXRmc19pbiBjb2RhX3N0YXRmczsKK307CisKK3VuaW9uIG91dHB1dEFyZ3MgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CQkvKiBOQjogZXZlcnkgc3RydWN0IGJlbG93IGJlZ2lucyB3aXRoIGFuIG9oICovCisgICAgc3RydWN0IGNvZGFfcm9vdF9vdXQgY29kYV9yb290OworICAgIHN0cnVjdCBjb2RhX29wZW5fb3V0IGNvZGFfb3BlbjsKKyAgICBzdHJ1Y3QgY29kYV9pb2N0bF9vdXQgY29kYV9pb2N0bDsKKyAgICBzdHJ1Y3QgY29kYV9nZXRhdHRyX291dCBjb2RhX2dldGF0dHI7CisgICAgc3RydWN0IGNvZGFfbG9va3VwX291dCBjb2RhX2xvb2t1cDsKKyAgICBzdHJ1Y3QgY29kYV9jcmVhdGVfb3V0IGNvZGFfY3JlYXRlOworICAgIHN0cnVjdCBjb2RhX21rZGlyX291dCBjb2RhX21rZGlyOworICAgIHN0cnVjdCBjb2RhX3JlYWRsaW5rX291dCBjb2RhX3JlYWRsaW5rOworICAgIHN0cnVjdCBjb2RhX3ZnZXRfb3V0IGNvZGFfdmdldDsKKyAgICBzdHJ1Y3QgY29kYV9wdXJnZXVzZXJfb3V0IGNvZGFfcHVyZ2V1c2VyOworICAgIHN0cnVjdCBjb2RhX3phcGZpbGVfb3V0IGNvZGFfemFwZmlsZTsKKyAgICBzdHJ1Y3QgY29kYV96YXBkaXJfb3V0IGNvZGFfemFwZGlyOworICAgIHN0cnVjdCBjb2RhX3B1cmdlZmlkX291dCBjb2RhX3B1cmdlZmlkOworICAgIHN0cnVjdCBjb2RhX3JlcGxhY2Vfb3V0IGNvZGFfcmVwbGFjZTsKKyAgICBzdHJ1Y3QgY29kYV9vcGVuX2J5X2ZkX291dCBjb2RhX29wZW5fYnlfZmQ7CisgICAgc3RydWN0IGNvZGFfb3Blbl9ieV9wYXRoX291dCBjb2RhX29wZW5fYnlfcGF0aDsKKyAgICBzdHJ1Y3QgY29kYV9zdGF0ZnNfb3V0IGNvZGFfc3RhdGZzOworfTsgICAgCisKK3VuaW9uIGNvZGFfZG93bmNhbGxzIHsKKyAgICAvKiBDT0RBX0lOVkFMSURBVEUgaXMgYSB2ZW51cy0+a2VybmVsIGNhbGwgKi8KKyAgICAvKiBDT0RBX0ZMVVNIIGlzIGEgdmVudXMtPmtlcm5lbCBjYWxsICovCisgICAgc3RydWN0IGNvZGFfcHVyZ2V1c2VyX291dCBwdXJnZXVzZXI7CisgICAgc3RydWN0IGNvZGFfemFwZmlsZV9vdXQgemFwZmlsZTsKKyAgICBzdHJ1Y3QgY29kYV96YXBkaXJfb3V0IHphcGRpcjsKKyAgICBzdHJ1Y3QgY29kYV9wdXJnZWZpZF9vdXQgcHVyZ2VmaWQ7CisgICAgc3RydWN0IGNvZGFfcmVwbGFjZV9vdXQgcmVwbGFjZTsKK307CisKKworLyoKKyAqIFVzZWQgZm9yIGlkZW50aWZ5aW5nIHVzYWdlIG9mICJDb250cm9sIiBhbmQgcGlvY3RscworICovCisKKyNkZWZpbmUgUElPQ1BBUk1fTUFTSyAweDAwMDBmZmZmCitzdHJ1Y3QgVmljZUlvY3RsIHsKKyAgICAgICAgdm9pZCAqaW47ICAgICAgICAvKiBEYXRhIHRvIGJlIHRyYW5zZmVycmVkIGluICovCisgICAgICAgIHZvaWQgKm91dDsgICAgICAgLyogRGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBvdXQgKi8KKyAgICAgICAgdV9zaG9ydCBpbl9zaXplOyAgICAgICAgLyogU2l6ZSBvZiBpbnB1dCBidWZmZXIgPD0gMksgKi8KKyAgICAgICAgdV9zaG9ydCBvdXRfc2l6ZTsgICAgICAgLyogTWF4aW11bSBzaXplIG9mIG91dHB1dCBidWZmZXIsIDw9IDJLICovCit9OworCitzdHJ1Y3QgUGlvY3RsRGF0YSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnBhdGg7CisgICAgICAgIGludCBmb2xsb3c7CisgICAgICAgIHN0cnVjdCBWaWNlSW9jdGwgdmk7Cit9OworCisjZGVmaW5lIENPREFfQ09OVFJPTAkJIi5DT05UUk9MIgorI2RlZmluZSBDT0RBX0NPTlRST0xMRU4JCTgKKyNkZWZpbmUgQ1RMX0lOTwkJCS0xCisKKy8qIERhdGEgcGFzc2VkIHRvIG1vdW50ICovCisKKyNkZWZpbmUgQ09EQV9NT1VOVF9WRVJTSU9OIDEKKworc3RydWN0IGNvZGFfbW91bnRfZGF0YSB7CisJaW50CQl2ZXJzaW9uOworCWludAkJZmQ7ICAgICAgIC8qIE9wZW5lZCBkZXZpY2UgKi8KK307CisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb2RhX3BzZGV2LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NvZGFfcHNkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmFjMzI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb2RhX3BzZGV2LmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBfX0NPREFfUFNERVZfSAorI2RlZmluZSBfX0NPREFfUFNERVZfSAorCisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworI2RlZmluZSBDT0RBX1BTREVWX01BSk9SIDY3CisjZGVmaW5lIE1BWF9DT0RBREVWUyAgNQkgICAvKiBob3cgbWFueSBkbyB3ZSBhbGxvdyAqLworCisKKy8qIG1lc3NhZ2VzIGJldHdlZW4gY29kYSBmaWxlc3lzdGVtIGluIGtlcm5lbCBhbmQgVmVudXMgKi8KK3N0cnVjdCB1cGNfcmVxIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgIHVjX2NoYWluOworCWNhZGRyX3QJICAgICAgICAgICAgdWNfZGF0YTsKKwl1X3Nob3J0CSAgICAgICAgICAgIHVjX2ZsYWdzOworCXVfc2hvcnQgICAgICAgICAgICAgdWNfaW5TaXplOyAgLyogU2l6ZSBpcyBhdCBtb3N0IDUwMDAgYnl0ZXMgKi8KKwl1X3Nob3J0CSAgICAgICAgICAgIHVjX291dFNpemU7CisJdV9zaG9ydAkgICAgICAgICAgICB1Y19vcGNvZGU7ICAvKiBjb3BpZWQgZnJvbSBkYXRhIHRvIHNhdmUgbG9va3VwICovCisJaW50CQkgICAgdWNfdW5pcXVlOworCXdhaXRfcXVldWVfaGVhZF90ICAgdWNfc2xlZXA7ICAgLyogcHJvY2Vzcycgd2FpdCBxdWV1ZSAqLworfTsKKworI2RlZmluZSBDT0RBX1JFUV9BU1lOQyAgMHgxCisjZGVmaW5lIENPREFfUkVRX1JFQUQgICAweDIKKyNkZWZpbmUgQ09EQV9SRVFfV1JJVEUgIDB4NAorI2RlZmluZSBDT0RBX1JFUV9BQk9SVCAgMHg4CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb2ZmLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NvZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzU0YTdmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb2ZmLmgKQEAgLTAsMCArMSwzNTEgQEAKKy8qIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gdGhlIEdBUyAyLjEuNCBhc3NlbWJsZXIgY29udHJvbCBmaWxlLgorICAgVGhlIEdBUyBwcm9kdWN0IGlzIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyIG9yIGxhdGVyLgorICAgQXMgc3VjaCwgdGhpcyBmaWxlIGlzIGFsc28gdW5kZXIgdGhhdCBsaWNlbnNlLgorCisgICBJZiB0aGUgZmlsZSBmb3JtYXQgY2hhbmdlcyBpbiB0aGUgQ09GRiBvYmplY3QsIHRoaXMgZmlsZSBzaG91bGQgYmUKKyAgIHN1YnNlcXVlbnRseSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIGNoYW5nZXMuCisKKyAgIFRoZSBhY3R1YWwgbG9hZGVyIG1vZHVsZSBvbmx5IHVzZXMgYSBmZXcgb2YgdGhlc2Ugc3RydWN0dXJlcy4gVGhlIGZ1bGwKKyAgIHNldCBpcyBkb2N1bWVudGVkIGhlcmUgYmVjYXVzZSBJIHJlY2VpdmVkIHRoZSBmdWxsIHNldC4gSWYgeW91IHdpc2gKKyAgIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQ09GRiwgdGhlbiBPJ1JlaWxseSBoYXMgYSB2ZXJ5IGV4Y2VsbGVudCBib29rLgorKi8KKworI2RlZmluZSAgRV9TWU1OTUxFTiAgOCAgIC8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUgICAgICAgICAqLworI2RlZmluZSAgRV9GSUxOTUxFTiAxNCAgIC8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lICAgICAgICAgICAqLworI2RlZmluZSAgRV9ESU1OVU0gICAgNCAgIC8qIE51bWJlciBvZiBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLworCisvKgorICogVGhlc2UgZGVmaW5lcyBhcmUgYnl0ZSBvcmRlciBpbmRlcGVuZGVudC4gVGhlcmUgaXMgbm8gYWxpZ25tZW50IG9mIGZpZWxkcworICogcGVybWl0dGVkIGluIHRoZSBzdHJ1Y3R1cmVzLiBUaGVyZWZvcmUgdGhleSBhcmUgZGVjbGFyZWQgYXMgY2hhcmFjdGVycworICogYW5kIHRoZSB2YWx1ZXMgbG9hZGVkIGZyb20gdGhlIGNoYXJhY3RlciBwb3NpdGlvbnMuIEl0IGFsc28gbWFrZXMgaXQKKyAqIG5pY2UgdG8gaGF2ZSBpdCAiZW5kaWFuIiBpbmRlcGVuZGVudC4KKyAqLworIAorLyogTG9hZCBhIHNob3J0IGludCBmcm9tIHRoZSBmb2xsb3dpbmcgdGFibGVzIHdpdGggbGl0dGxlLWVuZGlhbiBmb3JtYXRzICovCisjZGVmaW5lIENPRkZfU0hPUlRfTChwcykgKChzaG9ydCkoKCh1bnNpZ25lZCBzaG9ydCkoKHVuc2lnbmVkIGNoYXIpcHNbMV0pPDw4KXxcCisJCQkJICAoKHVuc2lnbmVkIHNob3J0KSgodW5zaWduZWQgY2hhcilwc1swXSkpKSkKKworLyogTG9hZCBhIGxvbmcgaW50IGZyb20gdGhlIGZvbGxvd2luZyB0YWJsZXMgd2l0aCBsaXR0bGUtZW5kaWFuIGZvcm1hdHMgKi8KKyNkZWZpbmUgQ09GRl9MT05HX0wocHMpICgoKGxvbmcpKCgodW5zaWduZWQgbG9uZykoKHVuc2lnbmVkIGNoYXIpcHNbM10pPDwyNCkgfFwKKwkJCQkgKCh1bnNpZ25lZCBsb25nKSgodW5zaWduZWQgY2hhcilwc1syXSk8PDE2KSB8XAorCQkJCSAoKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBjaGFyKXBzWzFdKTw8OCkgIHxcCisJCQkJICgodW5zaWduZWQgbG9uZykoKHVuc2lnbmVkIGNoYXIpcHNbMF0pKSkpKQorIAorLyogTG9hZCBhIHNob3J0IGludCBmcm9tIHRoZSBmb2xsb3dpbmcgdGFibGVzIHdpdGggYmlnLWVuZGlhbiBmb3JtYXRzICovCisjZGVmaW5lIENPRkZfU0hPUlRfSChwcykgKChzaG9ydCkoKCh1bnNpZ25lZCBzaG9ydCkoKHVuc2lnbmVkIGNoYXIpcHNbMF0pPDw4KXxcCisJCQkJICAoKHVuc2lnbmVkIHNob3J0KSgodW5zaWduZWQgY2hhcilwc1sxXSkpKSkKKworLyogTG9hZCBhIGxvbmcgaW50IGZyb20gdGhlIGZvbGxvd2luZyB0YWJsZXMgd2l0aCBiaWctZW5kaWFuIGZvcm1hdHMgKi8KKyNkZWZpbmUgQ09GRl9MT05HX0gocHMpICgoKGxvbmcpKCgodW5zaWduZWQgbG9uZykoKHVuc2lnbmVkIGNoYXIpcHNbMF0pPDwyNCkgfFwKKwkJCQkgKCh1bnNpZ25lZCBsb25nKSgodW5zaWduZWQgY2hhcilwc1sxXSk8PDE2KSB8XAorCQkJCSAoKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBjaGFyKXBzWzJdKTw8OCkgIHxcCisJCQkJICgodW5zaWduZWQgbG9uZykoKHVuc2lnbmVkIGNoYXIpcHNbM10pKSkpKQorCisvKiBUaGVzZSBtYXkgYmUgb3ZlcnJpZGRlbiBsYXRlciBieSBicmFpbiBkZWFkIGltcGxlbWVudGF0aW9ucyB3aGljaCBnZW5lcmF0ZQorICAgYSBiaWctZW5kaWFuIGhlYWRlciB3aXRoIGxpdHRsZS1lbmRpYW4gZGF0YS4gSW4gdGhhdCBjYXNlLCBnZW5lcmF0ZSBhCisgICByZXBsYWNlbWVudCBtYWNybyB3aGljaCB0ZXN0cyBhIGZsYWcgYW5kIHVzZXMgZWl0aGVyIG9mIHRoZSB0d28gYWJvdmUKKyAgIGFzIGFwcHJvcHJpYXRlLiAqLworCisjZGVmaW5lIENPRkZfTE9ORyh2KSAgIENPRkZfTE9OR19MKHYpCisjZGVmaW5lIENPRkZfU0hPUlQodikgIENPRkZfU0hPUlRfTCh2KQorCisvKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEludGVsIDM4Ni80ODYuICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgQ09GRl9maWxlaGRyIHsKKwljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCisJY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCisJY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCisJY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLworCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCisJY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCisJY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCit9OworCisvKgorICogICBCaXRzIGZvciBmX2ZsYWdzOgorICoKKyAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKKyAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlICAoaS5lLiBubyB1bnJlc29sdmVkIGV4dGVybmFsCisgKgkJCXJlZmVyZW5jZXMpCisgKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKKyAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCisgKglGX01JTk1BTAl0aGlzIGlzIGEgbWluaW1hbCBvYmplY3QgZmlsZSAoIi5tIikgb3V0cHV0IG9mIGZleHRyYWN0CisgKglGX1VQREFURQl0aGlzIGlzIGEgZnVsbHkgYm91bmQgdXBkYXRlIGZpbGUsIG91dHB1dCBvZiBvZ2VuCisgKglGX1NXQUJECQl0aGlzIGZpbGUgaGFzIGhhZCBpdHMgYnl0ZXMgc3dhYmJlZCAoaW4gbmFtZXMpCisgKglGX0FSMTZXUgl0aGlzIGZpbGUgaGFzIHRoZSBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMTZXUgorICoJCQkoZS5nLiAxMS83MCkgbWFjaGluZQorICoJRl9BUjMyV1IJdGhpcyBmaWxlIGhhcyB0aGUgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZQorICoJCQkoZS5nLiB2YXggYW5kIGlOVEVMIDM4NikKKyAqCUZfQVIzMlcJCXRoaXMgZmlsZSBoYXMgdGhlIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMlcgbWFjaGluZQorICoJCQkoZS5nLiAzYixtYXhpKQorICoJRl9QQVRDSAkJZmlsZSBjb250YWlucyAicGF0Y2giIGxpc3QgaW4gb3B0aW9uYWwgaGVhZGVyCisgKglGX05PREYJCShtaW5pbWFsIGZpbGUgb25seSkgbm8gZGVjaXNpb24gZnVuY3Rpb25zIGZvcgorICoJCQlyZXBsYWNlZCBmdW5jdGlvbnMKKyAqLworCisjZGVmaW5lICBDT0ZGX0ZfUkVMRkxHCQkwMDAwMDAxCisjZGVmaW5lICBDT0ZGX0ZfRVhFQwkJMDAwMDAwMgorI2RlZmluZSAgQ09GRl9GX0xOTk8JCTAwMDAwMDQKKyNkZWZpbmUgIENPRkZfRl9MU1lNUwkJMDAwMDAxMAorI2RlZmluZSAgQ09GRl9GX01JTk1BTAkJMDAwMDAyMAorI2RlZmluZSAgQ09GRl9GX1VQREFURQkJMDAwMDA0MAorI2RlZmluZSAgQ09GRl9GX1NXQUJECQkwMDAwMTAwCisjZGVmaW5lICBDT0ZGX0ZfQVIxNldSCQkwMDAwMjAwCisjZGVmaW5lICBDT0ZGX0ZfQVIzMldSCQkwMDAwNDAwCisjZGVmaW5lICBDT0ZGX0ZfQVIzMlcJCTAwMDEwMDAKKyNkZWZpbmUgIENPRkZfRl9QQVRDSAkJMDAwMjAwMAorI2RlZmluZSAgQ09GRl9GX05PREYJCTAwMDIwMDAKKworI2RlZmluZQlDT0ZGX0kzODZNQUdJQwkgICAgICAgIDB4MTRjICAgLyogTGludXgncyBzeXN0ZW0gICAgKi8KKworI2lmIDAgICAvKiBQZXJoYXBzLCBzb21lZGF5LCB0aGVzZSBmb3JtYXRzIG1heSBiZSB1c2VkLiAgICAgICovCisjZGVmaW5lIENPRkZfSTM4NlBUWE1BR0lDCTB4MTU0CisjZGVmaW5lIENPRkZfSTM4NkFJWE1BR0lDCTB4MTc1ICAgLyogSUJNJ3MgQUlYIHN5c3RlbSAgKi8KKyNkZWZpbmUgQ09GRl9JMzg2QkFETUFHKHgpICgoQ09GRl9TSE9SVCgoeCkuZl9tYWdpYykgIT0gQ09GRl9JMzg2TUFHSUMpIFwKKwkJCSAgJiYgQ09GRl9TSE9SVCgoeCkuZl9tYWdpYykgIT0gQ09GRl9JMzg2UFRYTUFHSUMgXAorCQkJICAmJiBDT0ZGX1NIT1JUKCh4KS5mX21hZ2ljKSAhPSBDT0ZGX0kzODZBSVhNQUdJQykKKyNlbHNlCisjZGVmaW5lIENPRkZfSTM4NkJBRE1BRyh4KSAoQ09GRl9TSE9SVCgoeCkuZl9tYWdpYykgIT0gQ09GRl9JMzg2TUFHSUMpCisjZW5kaWYKKworI2RlZmluZQlDT0ZGX0ZJTEhEUglzdHJ1Y3QgQ09GRl9maWxlaGRyCisjZGVmaW5lCUNPRkZfRklMSFNaCXNpemVvZihDT0ZGX0ZJTEhEUikKKworLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBMaW51eCBDT0ZGIG11c3QgaGF2ZSB0aGlzICJvcHRpb25hbCIgaGVhZGVyLiBTdGFuZGFyZCBDT0ZGIGhhcyBubyBlbnRyeQorICAgbG9jYXRpb24gZm9yIHRoZSAiZW50cnkiIHBvaW50LiBUaGV5IG5vcm1hbGx5IHdvdWxkIHN0YXJ0IHdpdGggdGhlIGZpcnN0CisgICBsb2NhdGlvbiBvZiB0aGUgLnRleHQgc2VjdGlvbi4gVGhpcyBpcyBub3QgYSBnb29kIGlkZWEgZm9yIGxpbnV4LiBTbywKKyAgIHRoZSB1c2Ugb2YgdGhpcyAib3B0aW9uYWwiIGhlYWRlciBpcyBub3Qgb3B0aW9uYWwuIEl0IGlzIHJlcXVpcmVkLgorCisgICBEbyBub3QgYmUgdGVtcHRlZCB0byBhc3N1bWUgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgb3B0aW9uYWwgaGVhZGVyIGlzCisgICBhIGNvbnN0YW50IGFuZCBzaW1wbHkgaW5kZXggdGhlIG5leHQgYnl0ZSBieSB0aGUgc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZS4KKyAgIFVzZSB0aGUgJ2Zfb3B0aGRyJyBmaWVsZCBpbiB0aGUgbWFpbiBjb2ZmIGhlYWRlciBmb3IgdGhlIHNpemUgb2YgdGhlCisgICBzdHJ1Y3R1cmUgYWN0dWFsbHkgd3JpdHRlbiB0byB0aGUgZmlsZSEhCisqLworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJICovCisgIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSAqLworICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSAqLworICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgICBkYXRhICIgICAiCQkgKi8KKyAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJICovCisgIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJICovCisgIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICAgICAgICovCisgIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICAgICAgICovCit9CitDT0ZGX0FPVVRIRFI7CisKKyNkZWZpbmUgQ09GRl9BT1VUU1ogKHNpemVvZihDT0ZGX0FPVVRIRFIpKQorCisjZGVmaW5lIENPRkZfU1RNQUdJQwkwNDAxCisjZGVmaW5lIENPRkZfT01BR0lDICAgICAwNDA0CisjZGVmaW5lIENPRkZfSk1BR0lDICAgICAwNDA3ICAgIC8qIGRpcnR5IHRleHQgYW5kIGRhdGEgaW1hZ2UsIGNhbid0IHNoYXJlICAqLworI2RlZmluZSBDT0ZGX0RNQUdJQyAgICAgMDQxMCAgICAvKiBkaXJ0eSB0ZXh0IHNlZ21lbnQsIGRhdGEgYWxpZ25lZCAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9aTUFHSUMgICAgIDA0MTMgICAgLyogVGhlIHByb3BlciBtYWdpYyBudW1iZXIgZm9yIGV4ZWN1dGFibGVzICAqLworI2RlZmluZSBDT0ZGX1NITUFHSUMJMDQ0MwkvKiBzaGFyZWQgbGlicmFyeSBoZWFkZXIgICAgICAgICAgICAgICAgICAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IENPRkZfc2NuaGRyIHsKKyAgY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkgICAgKi8KKyAgY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KKyAgY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkgICAgKi8KKyAgY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkgICAgKi8KKyAgY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCisgIGNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSAgICAqLworICBjaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkgICAgKi8KKyAgY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJICAgICovCisgIGNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzICAgICovCisgIGNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJICAgICovCit9OworCisjZGVmaW5lCUNPRkZfU0NOSERSCXN0cnVjdCBDT0ZGX3NjbmhkcgorI2RlZmluZQlDT0ZGX1NDTkhTWglzaXplb2YoQ09GRl9TQ05IRFIpCisKKy8qCisgKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKKyAqLworCisjZGVmaW5lIENPRkZfVEVYVAkiLnRleHQiCisjZGVmaW5lIENPRkZfREFUQQkiLmRhdGEiCisjZGVmaW5lIENPRkZfQlNTCSIuYnNzIgorI2RlZmluZSBDT0ZGX0NPTU1FTlQgICAgIi5jb21tZW50IgorI2RlZmluZSBDT0ZGX0xJQiAgICAgICAgIi5saWIiCisKKyNkZWZpbmUgQ09GRl9TRUNUX1RFWFQgIDAgICAgICAvKiBTZWN0aW9uIGZvciBpbnN0cnVjdGlvbiBjb2RlICAgICAgICAgICAgICovCisjZGVmaW5lIENPRkZfU0VDVF9EQVRBICAxICAgICAgLyogU2VjdGlvbiBmb3IgaW5pdGlhbGl6ZWQgZ2xvYmFscyAgICAgICAgICAqLworI2RlZmluZSBDT0ZGX1NFQ1RfQlNTICAgMiAgICAgIC8qIFNlY3Rpb24gZm9yIHVuLWluaXRpYWxpemVkIGdsb2JhbHMgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TRUNUX1JFUUQgIDMgICAgICAvKiBNaW5pbXVtIG51bWJlciBvZiBzZWN0aW9ucyBmb3IgZ29vZCBmaWxlICovCisKKyNkZWZpbmUgQ09GRl9TVFlQX1JFRyAgICAgMHgwMCAvKiByZWd1bGFyIHNlZ21lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPRkZfU1RZUF9EU0VDVCAgIDB4MDEgLyogZHVtbXkgc2VnbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT0ZGX1NUWVBfTk9MT0FEICAweDAyIC8qIG5vLWxvYWQgc2VnbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TVFlQX0dST1VQICAgMHgwNCAvKiBncm91cCBzZWdtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPRkZfU1RZUF9QQUQgICAgIDB4MDggLyogLnBhZCBzZWdtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT0ZGX1NUWVBfQ09QWSAgICAweDEwIC8qIGNvcHkgc2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TVFlQX1RFWFQgICAgMHgyMCAvKiAudGV4dCBzZWdtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPRkZfU1RZUF9EQVRBICAgIDB4NDAgLyogLmRhdGEgc2VnbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT0ZGX1NUWVBfQlNTICAgICAweDgwIC8qIC5ic3Mgc2VnbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TVFlQX0lORk8gICAweDIwMCAvKiAuY29tbWVudCBzZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPRkZfU1RZUF9PVkVSICAgMHg0MDAgLyogb3ZlcmxheSBzZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT0ZGX1NUWVBfTElCICAgIDB4ODAwIC8qIGxpYnJhcnkgc2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoKKyAqIFNoYXJlZCBsaWJyYXJpZXMgaGF2ZSB0aGUgZm9sbG93aW5nIHNlY3Rpb24gaGVhZGVyIGluIHRoZSBkYXRhIGZpZWxkIGZvcgorICogZWFjaCBsaWJyYXJ5LgorICovCisKK3N0cnVjdCBDT0ZGX3NsaWIgeworICBjaGFyCQlzbF9lbnRzels0XTsJLyogU2l6ZSBvZiB0aGlzIGVudHJ5ICAgICAgICAgICAgICAgKi8KKyAgY2hhcgkJc2xfcGF0aG5keFs0XTsJLyogc2l6ZSBvZiB0aGUgaGVhZGVyIGZpZWxkICAgICAgICAgKi8KK307CisKKyNkZWZpbmUJQ09GRl9TTElCSEQJc3RydWN0IENPRkZfc2xpYgorI2RlZmluZQlDT0ZGX1NMSUJTWglzaXplb2YoQ09GRl9TTElCSEQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KKyAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgorICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKKyAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KKyAqLworCitzdHJ1Y3QgQ09GRl9saW5lbm8geworICB1bmlvbiB7CisgICAgY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCisgICAgY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KKyAgfSBsX2FkZHI7CisgIGNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KK307CisKKyNkZWZpbmUJQ09GRl9MSU5FTk8Jc3RydWN0IENPRkZfbGluZW5vCisjZGVmaW5lCUNPRkZfTElORVNaCTYKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENPRkZfRV9TWU1OTUxFTgkgOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzaG9ydCBzeW1ib2wgbmFtZQkqLworI2RlZmluZSBDT0ZGX0VfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLworI2RlZmluZSBDT0ZGX0VfRElNTlVNCSA0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KKworLyoKKyAqICBBbGwgc3ltYm9scyBhbmQgc2VjdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIGRlZmluaXRpb24KKyAqLworCitzdHJ1Y3QgQ09GRl9zeW1lbnQgCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsgICAgLyogU3ltYm9sIG5hbWUgKGZpcnN0IDggY2hhcmFjdGVycykgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciBlX3plcm9lc1s0XTsgICAgICAgICAvKiBMZWFkaW5nIHplcm9zICovCisgICAgICBjaGFyIGVfb2Zmc2V0WzRdOyAgICAgICAgIC8qIE9mZnNldCBpZiB0aGlzIGlzIGEgaGVhZGVyIHNlY3Rpb24gKi8KKyAgICB9IGU7CisgIH0gZTsKKworICBjaGFyIGVfdmFsdWVbNF07ICAgICAgICAgICAgICAvKiBWYWx1ZSAoYWRkcmVzcykgb2YgdGhlIHNlZ21lbnQgKi8KKyAgY2hhciBlX3NjbnVtWzJdOyAgICAgICAgICAgICAgLyogU2VjdGlvbiBudW1iZXIgKi8KKyAgY2hhciBlX3R5cGVbMl07ICAgICAgICAgICAgICAgLyogVHlwZSBvZiBzZWN0aW9uICovCisgIGNoYXIgZV9zY2xhc3NbMV07ICAgICAgICAgICAgIC8qIExvYWRlciBjbGFzcyAqLworICBjaGFyIGVfbnVtYXV4WzFdOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMgd2hpY2ggZm9sbG93ICovCit9OworCisjZGVmaW5lIENPRkZfTl9CVE1BU0sJKDB4ZikgICAvKiBNYXNrIGZvciBpbXBvcnRhbnQgY2xhc3MgYml0cyAqLworI2RlZmluZSBDT0ZGX05fVE1BU0sJKDB4MzApICAvKiBNYXNrIGZvciBpbXBvcnRhbnQgdHlwZSBiaXRzICAqLworI2RlZmluZSBDT0ZGX05fQlRTSEZUCSg0KSAgICAgLyogIyBiaXRzIHRvIHNoaWZ0IGNsYXNzIGZpZWxkICAgKi8KKyNkZWZpbmUgQ09GRl9OX1RTSElGVAkoMikgICAgIC8qICMgYml0cyB0byBzaGlmdCB0eXBlIGZpZWxkICAgICovCisKKy8qCisgKiAgQXV4aWxpYXJ5IGVudHJpZXMgYmVjYXVzZSB0aGUgbWFpbiB0YWJsZSBpcyB0b28gbGltaXRpbmcuCisgKi8KKyAgCit1bmlvbiBDT0ZGX2F1eGVudCB7CisKKy8qCisgKiAgRGVidWdnZXIgaW5mb3JtYXRpb24KKyAqLworCisgIHN0cnVjdCB7CisgICAgY2hhciB4X3RhZ25keFs0XTsJICAgICAgICAvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCisgICAgdW5pb24geworICAgICAgc3RydWN0IHsKKwljaGFyICB4X2xubm9bMl07ICAgICAgICAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLworCWNoYXIgIHhfc2l6ZVsyXTsgICAgICAgIC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCisgICAgICB9IHhfbG5zejsKKyAgICAgIGNoYXIgeF9mc2l6ZVs0XTsJICAgICAgICAvKiBzaXplIG9mIGZ1bmN0aW9uICovCisgICAgfSB4X21pc2M7CisKKyAgICB1bmlvbiB7CisgICAgICBzdHJ1Y3QgewkJICAgICAgICAvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KKwljaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KKwljaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KKyAgICAgIH0geF9mY247CisKKyAgICAgIHN0cnVjdCB7CQkgICAgICAgIC8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLworCWNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07CisgICAgICB9IHhfYXJ5OworICAgIH0geF9mY25hcnk7CisKKyAgICBjaGFyIHhfdHZuZHhbMl07CS8qIHR2IGluZGV4ICovCisgIH0geF9zeW07CisKKy8qCisgKiAgIFNvdXJjZSBmaWxlIG5hbWVzIChkZWJ1Z2dlciBpbmZvcm1hdGlvbikKKyAqLworCisgIHVuaW9uIHsKKyAgICBjaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisgICAgc3RydWN0IHsKKyAgICAgIGNoYXIgeF96ZXJvZXNbNF07CisgICAgICBjaGFyIHhfb2Zmc2V0WzRdOworICAgIH0geF9uOworICB9IHhfZmlsZTsKKworLyoKKyAqICAgU2VjdGlvbiBpbmZvcm1hdGlvbgorICovCisKKyAgc3RydWN0IHsKKyAgICBjaGFyIHhfc2NubGVuWzRdOwkvKiBzZWN0aW9uIGxlbmd0aCAqLworICAgIGNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisgICAgY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KKyAgfSB4X3NjbjsKKworLyoKKyAqICAgVHJhbnNmZXIgdmVjdG9yIChicmFuY2ggdGFibGUpCisgKi8KKyAgCisgIHN0cnVjdCB7CisgICAgY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLworICAgIGNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLworICAgIGNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KKyAgfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLworfTsKKworI2RlZmluZQlDT0ZGX1NZTUVOVAlzdHJ1Y3QgQ09GRl9zeW1lbnQKKyNkZWZpbmUJQ09GRl9TWU1FU1oJMTgJCisjZGVmaW5lCUNPRkZfQVVYRU5UCXVuaW9uIENPRkZfYXV4ZW50CisjZGVmaW5lCUNPRkZfQVVYRVNaCTE4CisKKyNkZWZpbmUgQ09GRl9FVEVYVAkiZXRleHQiCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgQ09GRl9yZWxvYyB7CisgIGNoYXIgcl92YWRkcls0XTsgICAgICAgIC8qIFZpcnR1YWwgYWRkcmVzcyBvZiBpdGVtICAgICovCisgIGNoYXIgcl9zeW1uZHhbNF07ICAgICAgIC8qIFN5bWJvbCBpbmRleCBpbiB0aGUgc3ltdGFiICovCisgIGNoYXIgcl90eXBlWzJdOyAgICAgICAgIC8qIFJlbG9jYXRpb24gdHlwZSAgICAgICAgICAgICovCit9OworCisjZGVmaW5lIENPRkZfUkVMT0Mgc3RydWN0IENPRkZfcmVsb2MKKyNkZWZpbmUgQ09GRl9SRUxTWiAxMAorCisjZGVmaW5lIENPRkZfREVGX0RBVEFfU0VDVElPTl9BTElHTk1FTlQgIDQKKyNkZWZpbmUgQ09GRl9ERUZfQlNTX1NFQ1RJT05fQUxJR05NRU5UICAgNAorI2RlZmluZSBDT0ZGX0RFRl9URVhUX1NFQ1RJT05fQUxJR05NRU5UICA0CisKKy8qIEZvciBuZXcgc2VjdGlvbnMgd2UgaGF2ZW4ndCBoZWFyZCBvZiBiZWZvcmUgKi8KKyNkZWZpbmUgQ09GRl9ERUZfU0VDVElPTl9BTElHTk1FTlQgICAgICAgNApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb21zdGF0cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb21zdGF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNWVhOGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NvbXN0YXRzLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCWNvbXN0YXRzLmggIC0tIFNlcmlhbCBQb3J0IFN0YXRzLgorICoKKyAqCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk4ICBTdGFsbGlvbiBUZWNobm9sb2dpZXMKKyAqCUNvcHlyaWdodCAoQykgMTk5NC0xOTk2ICBHcmVnIFVuZ2VyZXIuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZglfQ09NU1RBVFNfSAorI2RlZmluZQlfQ09NU1RBVFNfSAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2VyaWFsIHBvcnQgc3RhdHMgc3RydWN0dXJlLiBUaGUgc3RydWN0dXJlIGl0c2VsZiBpcyBVQVJUCisgKglpbmRlcGVuZGVudCwgYnV0IHNvbWUgZmllbGRzIG1heSBiZSBVQVJUL2RyaXZlciBzcGVjaWZpYyAoZm9yCisgKglleGFtcGxlIHN0YXRlKS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZwlicmQ7CisJdW5zaWduZWQgbG9uZwlwYW5lbDsKKwl1bnNpZ25lZCBsb25nCXBvcnQ7CisJdW5zaWduZWQgbG9uZwlod2lkOworCXVuc2lnbmVkIGxvbmcJdHlwZTsKKwl1bnNpZ25lZCBsb25nCXR4dG90YWw7CisJdW5zaWduZWQgbG9uZwlyeHRvdGFsOworCXVuc2lnbmVkIGxvbmcJdHhidWZmZXJlZDsKKwl1bnNpZ25lZCBsb25nCXJ4YnVmZmVyZWQ7CisJdW5zaWduZWQgbG9uZwlyeG92ZXJydW47CisJdW5zaWduZWQgbG9uZwlyeHBhcml0eTsKKwl1bnNpZ25lZCBsb25nCXJ4ZnJhbWluZzsKKwl1bnNpZ25lZCBsb25nCXJ4bG9zdDsKKwl1bnNpZ25lZCBsb25nCXR4YnJlYWtzOworCXVuc2lnbmVkIGxvbmcJcnhicmVha3M7CisJdW5zaWduZWQgbG9uZwl0eHhvbjsKKwl1bnNpZ25lZCBsb25nCXR4eG9mZjsKKwl1bnNpZ25lZCBsb25nCXJ4eG9uOworCXVuc2lnbmVkIGxvbmcJcnh4b2ZmOworCXVuc2lnbmVkIGxvbmcJdHhjdHNvbjsKKwl1bnNpZ25lZCBsb25nCXR4Y3Rzb2ZmOworCXVuc2lnbmVkIGxvbmcJcnhydHNvbjsKKwl1bnNpZ25lZCBsb25nCXJ4cnRzb2ZmOworCXVuc2lnbmVkIGxvbmcJbW9kZW07CisJdW5zaWduZWQgbG9uZwlzdGF0ZTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXVuc2lnbmVkIGxvbmcJdHR5c3RhdGU7CisJdW5zaWduZWQgbG9uZwljZmxhZ3M7CisJdW5zaWduZWQgbG9uZwlpZmxhZ3M7CisJdW5zaWduZWQgbG9uZwlvZmxhZ3M7CisJdW5zaWduZWQgbG9uZwlsZmxhZ3M7CisJdW5zaWduZWQgbG9uZwlzaWduYWxzOworfSBjb21zdGF0c190OworCisKKy8qCisgKglCb2FyZCBzdGF0cyBzdHJ1Y3R1cmUuIFJldHVybnMgdXNlZnVsIGluZm8gYWJvdXQgdGhlIGJvYXJkLgorICovCisKKyNkZWZpbmUJQ09NX01BWFBBTkVMUwk4CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nCXBhbmVsOworCXVuc2lnbmVkIGxvbmcJdHlwZTsKKwl1bnNpZ25lZCBsb25nCWh3aWQ7CisJdW5zaWduZWQgbG9uZwlucnBvcnRzOworfSBjb21wYW5lbF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZwlicmQ7CisJdW5zaWduZWQgbG9uZwl0eXBlOworCXVuc2lnbmVkIGxvbmcJaHdpZDsKKwl1bnNpZ25lZCBsb25nCXN0YXRlOworCXVuc2lnbmVkIGxvbmcJaW9hZGRyOworCXVuc2lnbmVkIGxvbmcJaW9hZGRyMjsKKwl1bnNpZ25lZCBsb25nCW1lbWFkZHI7CisJdW5zaWduZWQgbG9uZwlpcnE7CisJdW5zaWduZWQgbG9uZwlucnBhbmVsczsKKwl1bnNpZ25lZCBsb25nCW5ycG9ydHM7CisJY29tcGFuZWxfdAlwYW5lbHNbQ09NX01BWFBBTkVMU107Cit9IGNvbWJyZF90OworCisKKy8qCisgKglEZWZpbmUgdGhlIGlvY3RsIG9wZXJhdGlvbnMgZm9yIHN0YXRzIHN0dWZmLgorICovCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZQlDT01fR0VUUE9SVFNUQVRTCV9JTygnYycsMzApCisjZGVmaW5lCUNPTV9DTFJQT1JUU1RBVFMJX0lPKCdjJywzMSkKKyNkZWZpbmUJQ09NX0dFVEJSRFNUQVRTCQlfSU8oJ2MnLDMyKQorCisKKy8qCisgKglEZWZpbmUgdGhlIHNldCBvZiBpb2N0bHMgdGhhdCBnaXZlIHVzZXIgbGV2ZWwgYWNjZXNzIHRvIHRoZQorICoJcHJpdmF0ZSBwb3J0LCBwYW5lbCBhbmQgYm9hcmQgc3RydWN0dXJlcy4gVGhlIGFyZ3VtZW50IHJlcXVpcmVkCisgKgl3aWxsIGJlIGRyaXZlciBkZXBlbmRlbnQhICAKKyAqLworI2RlZmluZQlDT01fUkVBRFBPUlQJCV9JTygnYycsNDApCisjZGVmaW5lCUNPTV9SRUFEQk9BUkQJCV9JTygnYycsNDEpCisjZGVmaW5lCUNPTV9SRUFEUEFORUwJCV9JTygnYycsNDIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0ZDc0NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIAljb25uZWN0b3IuaAorICogCisgKiAyMDA0LTIwMDUgQ29weXJpZ2h0IChjKSBFdmdlbml5IFBvbHlha292IDx6YnJAaW9yZW1hcC5uZXQ+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTk5FQ1RPUl9ICisjZGVmaW5lIF9fQ09OTkVDVE9SX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBQcm9jZXNzIEV2ZW50cyBjb25uZWN0b3IgdW5pcXVlIGlkcyAtLSB1c2VkIGZvciBtZXNzYWdlIHJvdXRpbmcKKyAqLworI2RlZmluZSBDTl9JRFhfUFJPQwkJCTB4MQorI2RlZmluZSBDTl9WQUxfUFJPQwkJCTB4MQorI2RlZmluZSBDTl9JRFhfQ0lGUwkJCTB4MgorI2RlZmluZSBDTl9WQUxfQ0lGUyAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBDTl9XMV9JRFgJCQkweDMJLyogdzEgY29tbXVuaWNhdGlvbiAqLworI2RlZmluZSBDTl9XMV9WQUwJCQkweDEKKyNkZWZpbmUgQ05fSURYX1Y4NkQJCQkweDQKKyNkZWZpbmUgQ05fVkFMX1Y4NkRfVVZFU0FGQgkJMHgxCisjZGVmaW5lIENOX0lEWF9CQgkJCTB4NQkvKiBCbGFja0JvYXJkLCBmcm9tIHRoZSBUU1AgR1BMIHNhbXBsaW5nIGZyYW1ld29yayAqLworI2RlZmluZSBDTl9EU1RfSURYCQkJMHg2CisjZGVmaW5lIENOX0RTVF9WQUwJCQkweDEKKyNkZWZpbmUgQ05fSURYX0RNCQkJMHg3CS8qIERldmljZSBNYXBwZXIgKi8KKyNkZWZpbmUgQ05fVkFMX0RNX1VTRVJTUEFDRV9MT0cJCTB4MQorI2RlZmluZSBDTl9JRFhfRFJCRAkJCTB4OAorI2RlZmluZSBDTl9WQUxfRFJCRAkJCTB4MQorI2RlZmluZSBDTl9LVlBfSURYCQkJMHg5CS8qIEh5cGVyViBLVlAgKi8KKyNkZWZpbmUgQ05fS1ZQX1ZBTAkJCTB4MQkvKiBxdWVyaWVzIGZyb20gdGhlIGtlcm5lbCAqLworCisjZGVmaW5lIENOX05FVExJTktfVVNFUlMJCTEwCS8qIEhpZ2hlc3QgaW5kZXggKyAxICovCisKKy8qCisgKiBNYXhpbXVtIGNvbm5lY3RvcidzIG1lc3NhZ2Ugc2l6ZS4KKyAqLworI2RlZmluZSBDT05ORUNUT1JfTUFYX01TR19TSVpFCQkxNjM4NAorCisvKgorICogaWR4IGFuZCB2YWwgYXJlIHVuaXF1ZSBpZGVudGlmaWVycyB3aGljaCAKKyAqIGFyZSB1c2VkIGZvciBtZXNzYWdlIHJvdXRpbmcgYW5kIAorICogbXVzdCBiZSByZWdpc3RlcmVkIGluIGNvbm5lY3Rvci5oIGZvciBpbi1rZXJuZWwgdXNhZ2UuCisgKi8KKworc3RydWN0IGNiX2lkIHsKKwlfX3UzMiBpZHg7CisJX191MzIgdmFsOworfTsKKworc3RydWN0IGNuX21zZyB7CisJc3RydWN0IGNiX2lkIGlkOworCisJX191MzIgc2VxOworCV9fdTMyIGFjazsKKworCV9fdTE2IGxlbjsJCS8qIExlbmd0aCBvZiB0aGUgZm9sbG93aW5nIGRhdGEgKi8KKwlfX3UxNiBmbGFnczsKKwlfX3U4IGRhdGFbMF07Cit9OworCisjZW5kaWYJCQkJLyogX19DT05ORUNUT1JfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb25zdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmM3MDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NvbnN0LmgKQEAgLTAsMCArMSwyNCBAQAorLyogY29uc3QuaDogTWFjcm9zIGZvciBkZWFsaW5nIHdpdGggY29uc3RhbnRzLiAgKi8KKworI2lmbmRlZiBfTElOVVhfQ09OU1RfSAorI2RlZmluZSBfTElOVVhfQ09OU1RfSAorCisvKiBTb21lIGNvbnN0YW50IG1hY3JvcyBhcmUgdXNlZCBpbiBib3RoIGFzc2VtYmxlciBhbmQKKyAqIEMgY29kZS4gIFRoZXJlZm9yZSB3ZSBjYW5ub3QgYW5ub3RhdGUgdGhlbSBhbHdheXMgd2l0aAorICogJ1VMJyBhbmQgb3RoZXIgdHlwZSBzcGVjaWZpZXJzIHVuaWxhdGVyYWxseS4gIFdlCisgKiB1c2UgdGhlIGZvbGxvd2luZyBtYWNyb3MgdG8gZGVhbCB3aXRoIHRoaXMuCisgKgorICogU2ltaWxhcmx5LCBfQVQoKSB3aWxsIGNhc3QgYW4gZXhwcmVzc2lvbiB3aXRoIGEgdHlwZSBpbiBDLCBidXQKKyAqIGxlYXZlIGl0IHVuY2hhbmdlZCBpbiBhc20uCisgKi8KKworI2lmZGVmIF9fQVNTRU1CTFlfXworI2RlZmluZSBfQUMoWCxZKQlYCisjZGVmaW5lIF9BVChULFgpCVgKKyNlbHNlCisjZGVmaW5lIF9fQUMoWCxZKQkoWCMjWSkKKyNkZWZpbmUgX0FDKFgsWSkJX19BQyhYLFkpCisjZGVmaW5lIF9BVChULFgpCSgoVCkoWCkpCisjZW5kaWYKKworI2VuZGlmIC8qICEoX0xJTlVYX0NPTlNUX0gpICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NyYW1mc19mcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jcmFtZnNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWNhZjJkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jcmFtZnNfZnMuaApAQCAtMCwwICsxLDg4IEBACisjaWZuZGVmIF9fQ1JBTUZTX0gKKyNkZWZpbmUgX19DUkFNRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisjZGVmaW5lIENSQU1GU19TSUdOQVRVUkUJIkNvbXByZXNzZWQgUk9NRlMiCisKKy8qCisgKiBXaWR0aCBvZiB2YXJpb3VzIGJpdGZpZWxkcyBpbiBzdHJ1Y3QgY3JhbWZzX2lub2RlLgorICogUHJpbWFyaWx5IHVzZWQgdG8gZ2VuZXJhdGUgd2FybmluZ3MgaW4gbWtjcmFtZnMuCisgKi8KKyNkZWZpbmUgQ1JBTUZTX01PREVfV0lEVEggMTYKKyNkZWZpbmUgQ1JBTUZTX1VJRF9XSURUSCAxNgorI2RlZmluZSBDUkFNRlNfU0laRV9XSURUSCAyNAorI2RlZmluZSBDUkFNRlNfR0lEX1dJRFRIIDgKKyNkZWZpbmUgQ1JBTUZTX05BTUVMRU5fV0lEVEggNgorI2RlZmluZSBDUkFNRlNfT0ZGU0VUX1dJRFRIIDI2CisKKy8qCisgKiBTaW5jZSBpbm9kZS5uYW1lbGVuIGlzIGEgdW5zaWduZWQgNi1iaXQgbnVtYmVyLCB0aGUgbWF4aW11bSBjcmFtZnMKKyAqIHBhdGggbGVuZ3RoIGlzIDYzIDw8IDIgPSAyNTIuCisgKi8KKyNkZWZpbmUgQ1JBTUZTX01BWFBBVEhMRU4gKCgoMSA8PCBDUkFNRlNfTkFNRUxFTl9XSURUSCkgLSAxKSA8PCAyKQorCisvKgorICogUmVhc29uYWJseSB0ZXJzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5vZGUgZGF0YS4KKyAqLworc3RydWN0IGNyYW1mc19pbm9kZSB7CisJX191MzIgbW9kZTpDUkFNRlNfTU9ERV9XSURUSCwgdWlkOkNSQU1GU19VSURfV0lEVEg7CisJLyogU0laRSBmb3IgZGV2aWNlIGZpbGVzIGlzIGlfcmRldiAqLworCV9fdTMyIHNpemU6Q1JBTUZTX1NJWkVfV0lEVEgsIGdpZDpDUkFNRlNfR0lEX1dJRFRIOworCS8qIE5BTUVMRU4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSBuYW1lLCBkaXZpZGVkIGJ5IDQgYW5kCisgICAgICAgICAgIHJvdW5kZWQgdXAuICAoY3JhbWZzIGRvZXNuJ3Qgc3VwcG9ydCBoYXJkIGxpbmtzLikgKi8KKwkvKiBPRkZTRVQ6IEZvciBzeW1saW5rcyBhbmQgbm9uLWVtcHR5IHJlZ3VsYXIgZmlsZXMsIHRoaXMKKwkgICBjb250YWlucyB0aGUgb2Zmc2V0IChkaXZpZGVkIGJ5IDQpIG9mIHRoZSBmaWxlIGRhdGEgaW4KKwkgICBjb21wcmVzc2VkIGZvcm0gKHN0YXJ0aW5nIHdpdGggYW4gYXJyYXkgb2YgYmxvY2sgcG9pbnRlcnM7CisJICAgc2VlIFJFQURNRSkuICBGb3Igbm9uLWVtcHR5IGRpcmVjdG9yaWVzIGl0IGlzIHRoZSBvZmZzZXQKKwkgICAoZGl2aWRlZCBieSA0KSBvZiB0aGUgaW5vZGUgb2YgdGhlIGZpcnN0IGZpbGUgaW4gdGhhdAorCSAgIGRpcmVjdG9yeS4gIEZvciBhbnl0aGluZyBlbHNlLCBvZmZzZXQgaXMgemVyby4gKi8KKwlfX3UzMiBuYW1lbGVuOkNSQU1GU19OQU1FTEVOX1dJRFRILCBvZmZzZXQ6Q1JBTUZTX09GRlNFVF9XSURUSDsKK307CisKK3N0cnVjdCBjcmFtZnNfaW5mbyB7CisJX191MzIgY3JjOworCV9fdTMyIGVkaXRpb247CisJX191MzIgYmxvY2tzOworCV9fdTMyIGZpbGVzOworfTsKKworLyoKKyAqIFN1cGVyYmxvY2sgaW5mb3JtYXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgRlMuCisgKi8KK3N0cnVjdCBjcmFtZnNfc3VwZXIgeworCV9fdTMyIG1hZ2ljOwkJCS8qIDB4MjhjZDNkNDUgLSByYW5kb20gbnVtYmVyICovCisJX191MzIgc2l6ZTsJCQkvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKwlfX3UzMiBmbGFnczsJCQkvKiBmZWF0dXJlIGZsYWdzICovCisJX191MzIgZnV0dXJlOwkJCS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisJX191OCBzaWduYXR1cmVbMTZdOwkJLyogIkNvbXByZXNzZWQgUk9NRlMiICovCisJc3RydWN0IGNyYW1mc19pbmZvIGZzaWQ7CS8qIHVuaXF1ZSBmaWxlc3lzdGVtIGluZm8gKi8KKwlfX3U4IG5hbWVbMTZdOwkJCS8qIHVzZXItZGVmaW5lZCBuYW1lICovCisJc3RydWN0IGNyYW1mc19pbm9kZSByb290OwkvKiByb290IGlub2RlIGRhdGEgKi8KK307CisKKy8qCisgKiBGZWF0dXJlIGZsYWdzCisgKgorICogMHgwMDAwMDAwMCAtIDB4MDAwMDAwZmY6IGZlYXR1cmVzIHRoYXQgd29yayBmb3IgYWxsIHBhc3Qga2VybmVscworICogMHgwMDAwMDEwMCAtIDB4ZmZmZmZmZmY6IGZlYXR1cmVzIHRoYXQgZG9uJ3Qgd29yayBmb3IgcGFzdCBrZXJuZWxzCisgKi8KKyNkZWZpbmUgQ1JBTUZTX0ZMQUdfRlNJRF9WRVJTSU9OXzIJMHgwMDAwMDAwMQkvKiBmc2lkIHZlcnNpb24gIzIgKi8KKyNkZWZpbmUgQ1JBTUZTX0ZMQUdfU09SVEVEX0RJUlMJCTB4MDAwMDAwMDIJLyogc29ydGVkIGRpcnMgKi8KKyNkZWZpbmUgQ1JBTUZTX0ZMQUdfSE9MRVMJCTB4MDAwMDAxMDAJLyogc3VwcG9ydCBmb3IgaG9sZXMgKi8KKyNkZWZpbmUgQ1JBTUZTX0ZMQUdfV1JPTkdfU0lHTkFUVVJFCTB4MDAwMDAyMDAJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQ1JBTUZTX0ZMQUdfU0hJRlRFRF9ST09UX09GRlNFVAkweDAwMDAwNDAwCS8qIHNoaWZ0ZWQgcm9vdCBmcyAqLworCisvKgorICogVmFsaWQgdmFsdWVzIGluIHN1cGVyLmZsYWdzLiAgQ3VycmVudGx5IHdlIHJlZnVzZSB0byBtb3VudAorICogaWYgKGZsYWdzICYgfkNSQU1GU19TVVBQT1JURURfRkxBR1MpLiAgTWF5YmUgdGhhdCBzaG91bGQgYmUKKyAqIGNoYW5nZWQgdG8gdGVzdCBzdXBlci5mdXR1cmUgaW5zdGVhZC4KKyAqLworI2RlZmluZSBDUkFNRlNfU1VQUE9SVEVEX0ZMQUdTCSggMHgwMDAwMDBmZiBcCisJCQkJfCBDUkFNRlNfRkxBR19IT0xFUyBcCisJCQkJfCBDUkFNRlNfRkxBR19XUk9OR19TSUdOQVRVUkUgXAorCQkJCXwgQ1JBTUZTX0ZMQUdfU0hJRlRFRF9ST09UX09GRlNFVCApCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2N1ZGEuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY3VkYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YzhiZjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2N1ZGEuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRhbGtpbmcgdG8gdGhlIENVREEuICBUaGUgQ1VEQSBpcyBhIG1pY3JvY29udHJvbGxlcgorICogd2hpY2ggY29udHJvbHMgdGhlIEFEQiwgc3lzdGVtIHBvd2VyLCBSVEMsIGFuZCB2YXJpb3VzIG90aGVyIHRoaW5ncy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMuCisgKi8KKworLyogQ1VEQSBjb21tYW5kcyAoMm5kIGJ5dGUpICovCisjZGVmaW5lIENVREFfV0FSTV9TVEFSVAkJMAorI2RlZmluZSBDVURBX0FVVE9QT0xMCQkxCisjZGVmaW5lIENVREFfR0VUXzY4MDVfQUREUgkyCisjZGVmaW5lIENVREFfR0VUX1RJTUUJCTMKKyNkZWZpbmUgQ1VEQV9HRVRfUFJBTQkJNworI2RlZmluZSBDVURBX1NFVF82ODA1X0FERFIJOAorI2RlZmluZSBDVURBX1NFVF9USU1FCQk5CisjZGVmaW5lIENVREFfUE9XRVJET1dOCQkweGEKKyNkZWZpbmUgQ1VEQV9QT1dFUlVQX1RJTUUJMHhiCisjZGVmaW5lIENVREFfU0VUX1BSQU0JCTB4YworI2RlZmluZSBDVURBX01TX1JFU0VUCQkweGQKKyNkZWZpbmUgQ1VEQV9TRU5EX0RGQUMJCTB4ZQorI2RlZmluZSBDVURBX1JFU0VUX1NZU1RFTQkweDExCisjZGVmaW5lIENVREFfU0VUX0lQTAkJMHgxMgorI2RlZmluZSBDVURBX1NFVF9BVVRPX1JBVEUJMHgxNAorI2RlZmluZSBDVURBX0dFVF9BVVRPX1JBVEUJMHgxNgorI2RlZmluZSBDVURBX1NFVF9ERVZJQ0VfTElTVAkweDE5CisjZGVmaW5lIENVREFfR0VUX0RFVklDRV9MSVNUCTB4MWEKKyNkZWZpbmUgQ1VEQV9HRVRfU0VUX0lJQwkweDIyCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY3ljbGFkZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY3ljbGFkZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDVlM2M4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jeWNsYWRlcy5oCkBAIC0wLDAgKzEsNDkzIEBACisvKiAkUmV2aXNpb246IDMuMCAkJERhdGU6IDE5OTgvMTEvMDIgMTQ6MjA6NTkgJAorICogbGludXgvaW5jbHVkZS9saW51eC9jeWNsYWRlcy5oCisgKgorICogVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgd3JpdHRlbiBieQorICogUmFuZG9scGggQmVudHNvbiA8YmVudHNvbkBncmllZy5zZWFzbHVnLm9yZz4gYW5kIGlzIG1haW50YWluZWQgYnkKKyAqIEl2YW4gUGFzc29zIDxpdmFuQGN5Y2xhZGVzLmNvbT4uCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBnZW5lcmFsIGRlZmluaXRpb25zIGZvciB0aGUgY3ljbGFkZXMuYyBkcml2ZXIKKyAqJExvZzogY3ljbGFkZXMuaCx2ICQKKyAqUmV2aXNpb24gMy4xICAyMDAyLzAxLzI5IDExOjM2OjE2ICBoZW5yaXF1ZQorICphZGRlZCB0aHJvdHRsZSBmaWVsZCBvbiBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQorICpwb3J0IGlzIHRocm90dGxlZCBvciBub3QKKyAqCisgKlJldmlzaW9uIDMuMSAgMjAwMC8wNC8xOSAxODo1Mjo1MiAgaXZhbgorICpjb252ZXJ0ZWQgYWRkcmVzcyBmaWVsZHMgdG8gdW5zaWduZWQgbG9uZyBhbmQgYWRkZWQgZmllbGRzIGZvciBwaHlzaWNhbAorICphZGRyZXNzZXMgb24gY3ljbGFkZXNfY2FyZCBzdHJ1Y3R1cmU7CisgKgorICpSZXZpc2lvbiAzLjAgIDE5OTgvMTEvMDIgMTQ6MjA6NTkgIGl2YW4KKyAqYWRkZWQgbnBvcnRzIGZpZWxkIG9uIGN5Y2xhZGVzX2NhcmQgc3RydWN0dXJlOworICoKKyAqUmV2aXNpb24gMi41ICAxOTk4LzA4LzAzIDE2OjU3OjAxICBpdmFuCisgKmFkZGVkIGN5Y2xhZGVzX2lkbGVfc3RhdHMgc3RydWN0dXJlOworICogCisgKlJldmlzaW9uIDIuNCAgMTk5OC8wNi8wMSAxMjowOTo1MyAgaXZhbgorICpyZW1vdmVkIGNsb3Npbmdfd2FpdDIgZnJvbSBjeWNsYWRlc19wb3J0IHN0cnVjdHVyZTsKKyAqCisgKlJldmlzaW9uIDIuMyAgMTk5OC8wMy8xNiAxODowMToxMiAgaXZhbgorICpjaGFuZ2VzIGluIHRoZSBjeWNsYWRlc19wb3J0IHN0cnVjdHVyZSB0byBnZXQgaXQgY2xvc2VyIHRvIHRoZSAKKyAqc3RhbmRhcmQgc2VyaWFsIHBvcnQgc3RydWN0dXJlOworICphZGRlZCBjb25zdGFudHMgZm9yIG5ldyBpb2N0bHM7CisgKgorICpSZXZpc2lvbiAyLjIgIDE5OTgvMDIvMTcgMTY6NTA6MDAgIGl2YW4KKyAqY2hhbmdlcyBpbiB0aGUgY3ljbGFkZXNfcG9ydCBzdHJ1Y3R1cmUgKGFkZGl0aW9uIG9mIHNodXRkb3duX3dhaXQgYW5kIAorICpjaGlwX3JldiB2YXJpYWJsZXMpOworICphZGRlZCBjb25zdGFudHMgZm9yIG5ldyBpb2N0bHMgYW5kIGZvciBDRDE0MDAgcmV2LiBudW1iZXJzLgorICoKKyAqUmV2aXNpb24gMi4xCTE5OTcvMTAvMjQgMTY6MDM6MDAgIGl2YW4KKyAqYWRkZWQgcmZsb3cgKHdoaWNoIGFsbG93cyBlbmFibGluZyB0aGUgQ0QxNDAwIHNwZWNpYWwgZmxvdyBjb250cm9sIAorICpmZWF0dXJlKSBhbmQgcnRzZHRyX2ludiAod2hpY2ggYWxsb3dzIERUUi9SVFMgcGluIGludmVyc2lvbikgdG8gCisgKmN5Y2xhZGVzX3BvcnQgc3RydWN0dXJlOworICphZGRlZCBBbHBoYSBzdXBwb3J0CisgKgorICpSZXZpc2lvbiAyLjAgIDE5OTcvMDYvMzAgMTA6MzA6MDAgIGl2YW4KKyAqYWRkZWQgc29tZSBuZXcgZG9vcmJlbGwgY29tbWFuZCBjb25zdGFudHMgcmVsYXRlZCB0byBJT0NUTFcgYW5kCisgKlVBUlQgZXJyb3Igc2lnbmFsaW5nCisgKgorICpSZXZpc2lvbiAxLjggIDE5OTcvMDYvMDMgMTU6MzA6MDAgIGl2YW4KKyAqYWRkZWQgY29uc3RhbnQgWkZJUk1fSExUCisgKmFkZGVkIGNvbnN0YW50IEN5UENJX1plX3dpbiAoID0gMiAqIEN5X1BDSV9ad2luKQorICoKKyAqUmV2aXNpb24gMS43ICAxOTk3LzAzLzI2IDEwOjMwOjAwICBkYW5pZWwKKyAqbmV3IGVudHJpZXMgYXQgdGhlIGVuZCBvZiBjeWNsYWRlc19wb3J0IHN0cnVjdCB0byByZWFsbG9jYXRlCisgKnZhcmlhYmxlcyBpbGxlZ2FsbHkgYWxsb2NhdGVkIHdpdGhpbiBjYXJkIG1lbW9yeS4KKyAqCisgKlJldmlzaW9uIDEuNiAgMTk5Ni8wOS8wOSAxODozNTozMCAgYmVudHNvbgorICpmb2xkIGluIGNoYW5nZXMgZm9yIEN5Y2xvbS1aIC0tIGluY2x1ZGluZyBzdHJ1Y3R1cmVzIGZvcgorICpjb21tdW5pY2F0aW5nIHdpdGggYm9hcmQgYXMgd2VsbCBtb2Rlc3QgY2hhbmdlcyB0byBvcmlnaW5hbAorICpzdHJ1Y3R1cmVzIHRvIHN1cHBvcnQgbmV3IGZlYXR1cmVzLgorICoKKyAqUmV2aXNpb24gMS41ICAxOTk1LzExLzEzIDIxOjEzOjMxICBiZW50c29uCisgKmNoYW5nZXMgc3VnZ2VzdGVkIGJ5IE1pY2hhZWwgQ2hhc3RhaW4gPG1lY0BkdXJhY2VmLnNob3V0Lm5ldD4KKyAqdG8gc3VwcG9ydCB1c2Ugb2YgdGhpcyBmaWxlIGluIG5vbi1rZXJuZWwgYXBwbGljYXRpb25zCisgKgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9DWUNMQURFU19ICisjZGVmaW5lIF9MSU5VWF9DWUNMQURFU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgY3ljbGFkZXNfbW9uaXRvciB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGludF9jb3VudDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgY2hhcl9jb3VudDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgY2hhcl9tYXg7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGNoYXJfbGFzdDsKK307CisKKy8qCisgKiBUaGVzZSBzdGF0cyBhbGwgcmVmbGVjdCBhY3Rpdml0eSBzaW5jZSB0aGUgZGV2aWNlIHdhcyBsYXN0IGluaXRpYWxpemVkLgorICogKGkuZS4sIHNpbmNlIHRoZSBwb3J0IHdhcyBvcGVuZWQgd2l0aCBubyBvdGhlciBwcm9jZXNzZXMgYWxyZWFkeSBoYXZpbmcgaXQKKyAqIG9wZW4pCisgKi8KK3N0cnVjdCBjeWNsYWRlc19pZGxlX3N0YXRzIHsKKyAgICBfX2tlcm5lbF90aW1lX3QgaW5fdXNlOwkvKiBUaW1lIGRldmljZSBoYXMgYmVlbiBpbiB1c2UgKHNlY3MpICovCisgICAgX19rZXJuZWxfdGltZV90IHJlY3ZfaWRsZTsJLyogVGltZSBzaW5jZSBsYXN0IGNoYXIgcmVjZWl2ZWQgKHNlY3MpICovCisgICAgX19rZXJuZWxfdGltZV90IHhtaXRfaWRsZTsJLyogVGltZSBzaW5jZSBsYXN0IGNoYXIgdHJhbnNtaXR0ZWQgKHNlY3MpICovCisgICAgdW5zaWduZWQgbG9uZyAgcmVjdl9ieXRlczsJLyogQnl0ZXMgcmVjZWl2ZWQgKi8KKyAgICB1bnNpZ25lZCBsb25nICB4bWl0X2J5dGVzOwkvKiBCeXRlcyB0cmFuc21pdHRlZCAqLworICAgIHVuc2lnbmVkIGxvbmcgIG92ZXJydW5zOwkvKiBJbnB1dCBvdmVycnVucyAqLworICAgIHVuc2lnbmVkIGxvbmcgIGZyYW1lX2VycnM7CS8qIElucHV0IGZyYW1pbmcgZXJyb3JzICovCisgICAgdW5zaWduZWQgbG9uZyAgcGFyaXR5X2VycnM7CS8qIElucHV0IHBhcml0eSBlcnJvcnMgKi8KK307CisKKyNkZWZpbmUgQ1lDTEFERVNfTUFHSUMgIDB4NDM1OQorCisjZGVmaW5lIENZR0VUTU9OICAgICAgICAgICAgICAgIDB4NDM1OTAxCisjZGVmaW5lIENZR0VUVEhSRVNIICAgICAgICAgICAgIDB4NDM1OTAyCisjZGVmaW5lIENZU0VUVEhSRVNIICAgICAgICAgICAgIDB4NDM1OTAzCisjZGVmaW5lIENZR0VUREVGVEhSRVNIICAgICAgICAgIDB4NDM1OTA0CisjZGVmaW5lIENZU0VUREVGVEhSRVNIICAgICAgICAgIDB4NDM1OTA1CisjZGVmaW5lIENZR0VUVElNRU9VVCAgICAgICAgICAgIDB4NDM1OTA2CisjZGVmaW5lIENZU0VUVElNRU9VVCAgICAgICAgICAgIDB4NDM1OTA3CisjZGVmaW5lIENZR0VUREVGVElNRU9VVCAgICAgICAgIDB4NDM1OTA4CisjZGVmaW5lIENZU0VUREVGVElNRU9VVCAgICAgICAgIDB4NDM1OTA5CisjZGVmaW5lIENZU0VUUkZMT1cJCTB4NDM1OTBhCisjZGVmaW5lIENZR0VUUkZMT1cJCTB4NDM1OTBiCisjZGVmaW5lIENZU0VUUlRTRFRSX0lOVgkJMHg0MzU5MGMKKyNkZWZpbmUgQ1lHRVRSVFNEVFJfSU5WCQkweDQzNTkwZAorI2RlZmluZSBDWVpTRVRQT0xMQ1lDTEUJCTB4NDM1OTBlCisjZGVmaW5lIENZWkdFVFBPTExDWUNMRQkJMHg0MzU5MGYKKyNkZWZpbmUgQ1lHRVRDRDE0MDBWRVIJCTB4NDM1OTEwCisjZGVmaW5lCUNZU0VUV0FJVAkJMHg0MzU5MTIKKyNkZWZpbmUJQ1lHRVRXQUlUCQkweDQzNTkxMworCisvKioqKioqKioqKioqKioqIENZQ0xPTS1aIEFERElUSU9OUyAqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ1pJT0MgICAgICAgICAgICgnTScgPDwgOCkKKyNkZWZpbmUgQ1pfTkJPQVJEUyAgICAgIChDWklPQ3wweGZhKQorI2RlZmluZSBDWl9CT09UX1NUQVJUICAgKENaSU9DfDB4ZmIpCisjZGVmaW5lIENaX0JPT1RfREFUQSAgICAoQ1pJT0N8MHhmYykKKyNkZWZpbmUgQ1pfQk9PVF9FTkQgICAgIChDWklPQ3wweGZkKQorI2RlZmluZSBDWl9URVNUICAgICAgICAgKENaSU9DfDB4ZmUpCisKKyNkZWZpbmUgQ1pfREVGX1BPTEwJKEhaLzI1KQorCisjZGVmaW5lIE1BWF9CT0FSRCAgICAgICA0ICAgICAgIC8qIE1heCBudW1iZXIgb2YgYm9hcmRzICovCisjZGVmaW5lIE1BWF9ERVYgICAgICAgICAyNTYgICAgIC8qIE1heCBudW1iZXIgb2YgcG9ydHMgdG90YWwgKi8KKyNkZWZpbmUJQ1laX01BWF9TUEVFRAk5MjE2MDAKKworI2RlZmluZQlDWVpfRklGT19TSVpFCTE2CisKKyNkZWZpbmUgQ1laX0JPT1RfTldPUkRTIDB4MTAwCitzdHJ1Y3QgQ1laX0JPT1RfQ1RSTCB7CisgICAgICAgIHVuc2lnbmVkIHNob3J0ICBuYm9hcmQ7CisgICAgICAgIGludCAgICAgICAgICAgICBzdGF0dXNbTUFYX0JPQVJEXTsKKyAgICAgICAgaW50ICAgICAgICAgICAgIG5jaGFubmVsW01BWF9CT0FSRF07CisgICAgICAgIGludCAgICAgICAgICAgICBmd19yZXZbTUFYX0JPQVJEXTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgIG9mZnNldDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgIGRhdGFbQ1laX0JPT1RfTldPUkRTXTsKK307CisKKworI2lmbmRlZiBEUF9XSU5ET1dfU0laRQorLyoKKyAqCU1lbW9yeSBXaW5kb3cgU2l6ZXMKKyAqLworCisjZGVmaW5lCURQX1dJTkRPV19TSVpFCQkoMHgwMDA4MDAwMCkJLyogd2luZG93IHNpemUgNTEyIEtiICovCisjZGVmaW5lCVpFX0RQX1dJTkRPV19TSVpFCSgweDAwMTAwMDAwKQkvKiB3aW5kb3cgc2l6ZSAxIE1iIChaZSBhbmQKKwkJCQkJCSAgOFpvIFYuMiAqLworI2RlZmluZQlDVFJMX1dJTkRPV19TSVpFCSgweDAwMDAwMDgwKQkvKiBydW50aW1lIHJlZ3MgMTI4IGJ5dGVzICovCisKKy8qCisgKglDVVNUT01fUkVHIC0gQ3ljbG9tLVovUENJIEN1c3RvbSBSZWdpc3RlcnMgU2V0LiBUaGUgZHJpdmVyCisgKglub3JtYWxseSB3aWxsIGFjY2VzcyBvbmx5IGludGVyZXN0ZWQgb24gdGhlIGZwZ2FfaWQsIGZwZ2FfdmVyc2lvbiwKKyAqCXN0YXJ0X2NwdSBhbmQgc3RvcF9jcHUuCisgKi8KKworc3RydWN0CUNVU1RPTV9SRUcgeworCV9fdTMyCWZwZ2FfaWQ7CQkvKiBGUEdBIElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyICovCisJX191MzIJZnBnYV92ZXJzaW9uOwkJLyogRlBHQSBWZXJzaW9uIE51bWJlciBSZWdpc3RlciAqLworCV9fdTMyCWNwdV9zdGFydDsJCS8qIENQVSBzdGFydCBSZWdpc3RlciAod3JpdGUpICovCisJX191MzIJY3B1X3N0b3A7CQkvKiBDUFUgc3RvcCBSZWdpc3RlciAod3JpdGUpICovCisJX191MzIJbWlzY19yZWc7CQkvKiBNaXNjZWxsYW5lb3VzIFJlZ2lzdGVyICovCisJX191MzIJaWR0X21vZGU7CQkvKiBJRFQgbW9kZSBSZWdpc3RlciAqLworCV9fdTMyCXVhcnRfaXJxX3N0YXR1czsJLyogVUFSVCBJUlEgc3RhdHVzIFJlZ2lzdGVyICovCisJX191MzIJY2xlYXJfdGltZXIwX2lycTsJLyogQ2xlYXIgdGltZXIgaW50ZXJydXB0IFJlZ2lzdGVyICovCisJX191MzIJY2xlYXJfdGltZXIxX2lycTsJLyogQ2xlYXIgdGltZXIgaW50ZXJydXB0IFJlZ2lzdGVyICovCisJX191MzIJY2xlYXJfdGltZXIyX2lycTsJLyogQ2xlYXIgdGltZXIgaW50ZXJydXB0IFJlZ2lzdGVyICovCisJX191MzIJdGVzdF9yZWdpc3RlcjsJCS8qIFRlc3QgUmVnaXN0ZXIgKi8KKwlfX3UzMgl0ZXN0X2NvdW50OwkJLyogVGVzdCBDb3VudCBSZWdpc3RlciAqLworCV9fdTMyCXRpbWVyX3NlbGVjdDsJCS8qIFRpbWVyIHNlbGVjdCByZWdpc3RlciAqLworCV9fdTMyCXByX3VhcnRfaXJxX3N0YXR1czsJLyogUHJpb3JpdGl6ZWQgVUFSVCBJUlEgc3RhdCBSZWcgKi8KKwlfX3UzMglyYW1fd2FpdF9zdGF0ZTsJCS8qIFJBTSB3YWl0LXN0YXRlIFJlZ2lzdGVyICovCisJX191MzIJdWFydF93YWl0X3N0YXRlOwkvKiBVQVJUIHdhaXQtc3RhdGUgUmVnaXN0ZXIgKi8KKwlfX3UzMgl0aW1lcl93YWl0X3N0YXRlOwkvKiB0aW1lciB3YWl0LXN0YXRlIFJlZ2lzdGVyICovCisJX191MzIJYWNrX3dhaXRfc3RhdGU7CQkvKiBBQ0sgd2FpdCBTdGF0ZSBSZWdpc3RlciAqLworfTsKKworLyoKKyAqCVJVTlRJTUVfOTA2MCAtIFBMWCBQQ0k5MDYwRVMgbG9jYWwgY29uZmlndXJhdGlvbiBhbmQgc2hhcmVkIHJ1bnRpbWUKKyAqCXJlZ2lzdGVycy4gVGhpcyBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSA5MDYwIHJlZ2lzdGVycworICoJKG1lbW9yeSBtYXBwZWQpLgorICovCisKK3N0cnVjdCBSVU5USU1FXzkwNjAgeworCV9fdTMyCWxvY19hZGRyX3JhbmdlOwkvKiAwMGggLSBMb2NhbCBBZGRyZXNzIFJhbmdlICovCisJX191MzIJbG9jX2FkZHJfYmFzZTsJLyogMDRoIC0gTG9jYWwgQWRkcmVzcyBCYXNlICovCisJX191MzIJbG9jX2FyYml0cjsJLyogMDhoIC0gTG9jYWwgQXJiaXRyYXRpb24gKi8KKwlfX3UzMgllbmRpYW5fZGVzY3I7CS8qIDBDaCAtIEJpZy9MaXR0bGUgRW5kaWFuIERlc2NyaXB0b3IgKi8KKwlfX3UzMglsb2Nfcm9tX3JhbmdlOwkvKiAxMGggLSBMb2NhbCBST00gUmFuZ2UgKi8KKwlfX3UzMglsb2Nfcm9tX2Jhc2U7CS8qIDE0aCAtIExvY2FsIFJPTSBCYXNlICovCisJX191MzIJbG9jX2J1c19kZXNjcjsJLyogMThoIC0gTG9jYWwgQnVzIGRlc2NyaXB0b3IgKi8KKwlfX3UzMglsb2NfcmFuZ2VfbXN0OwkvKiAxQ2ggLSBMb2NhbCBSYW5nZSBmb3IgTWFzdGVyIHRvIFBDSSAqLworCV9fdTMyCWxvY19iYXNlX21zdDsJLyogMjBoIC0gTG9jYWwgQmFzZSBmb3IgTWFzdGVyIFBDSSAqLworCV9fdTMyCWxvY19yYW5nZV9pbzsJLyogMjRoIC0gTG9jYWwgUmFuZ2UgZm9yIE1hc3RlciBJTyAqLworCV9fdTMyCXBjaV9iYXNlX21zdDsJLyogMjhoIC0gUENJIEJhc2UgZm9yIE1hc3RlciBQQ0kgKi8KKwlfX3UzMglwY2lfY29uZl9pbzsJLyogMkNoIC0gUENJIGNvbmZpZ3VyYXRpb24gZm9yIE1hc3RlciBJTyAqLworCV9fdTMyCWZpbGxlcjE7CS8qIDMwaCAqLworCV9fdTMyCWZpbGxlcjI7CS8qIDM0aCAqLworCV9fdTMyCWZpbGxlcjM7CS8qIDM4aCAqLworCV9fdTMyCWZpbGxlcjQ7CS8qIDNDaCAqLworCV9fdTMyCW1haWxfYm94XzA7CS8qIDQwaCAtIE1haWwgQm94IDAgKi8KKwlfX3UzMgltYWlsX2JveF8xOwkvKiA0NGggLSBNYWlsIEJveCAxICovCisJX191MzIJbWFpbF9ib3hfMjsJLyogNDhoIC0gTWFpbCBCb3ggMiAqLworCV9fdTMyCW1haWxfYm94XzM7CS8qIDRDaCAtIE1haWwgQm94IDMgKi8KKwlfX3UzMglmaWxsZXI1OwkvKiA1MGggKi8KKwlfX3UzMglmaWxsZXI2OwkvKiA1NGggKi8KKwlfX3UzMglmaWxsZXI3OwkvKiA1OGggKi8KKwlfX3UzMglmaWxsZXI4OwkvKiA1Q2ggKi8KKwlfX3UzMglwY2lfZG9vcmJlbGw7CS8qIDYwaCAtIFBDSSB0byBMb2NhbCBEb29yYmVsbCAqLworCV9fdTMyCWxvY19kb29yYmVsbDsJLyogNjRoIC0gTG9jYWwgdG8gUENJIERvb3JiZWxsICovCisJX191MzIJaW50cl9jdHJsX3N0YXQ7CS8qIDY4aCAtIEludGVycnVwdCBDb250cm9sL1N0YXR1cyAqLworCV9fdTMyCWluaXRfY3RybDsJLyogNkNoIC0gRUVQUk9NIGNvbnRyb2wsIEluaXQgQ29udHJvbCwgZXRjICovCit9OworCisvKiBWYWx1ZXMgZm9yIHRoZSBMb2NhbCBCYXNlIEFkZHJlc3MgcmUtbWFwIHJlZ2lzdGVyICovCisKKyNkZWZpbmUJV0lOX1JBTQkJMHgwMDAwMDAwMUwJLyogc2V0IHRoZSBzbGlkaW5nIHdpbmRvdyB0byBSQU0gKi8KKyNkZWZpbmUJV0lOX0NSRUcJMHgxNDAwMDAwMUwJLyogc2V0IHRoZSB3aW5kb3cgdG8gY3VzdG9tIFJlZ2lzdGVycyAqLworCisvKiBWYWx1ZXMgdGltZXIgc2VsZWN0IHJlZ2lzdGVycyAqLworCisjZGVmaW5lCVRJTUVSX0JZXzFNCTB4MDAJCS8qIGNsb2NrIGRpdmlkZWQgYnkgMU0gKi8KKyNkZWZpbmUJVElNRVJfQllfMjU2SwkweDAxCQkvKiBjbG9jayBkaXZpZGVkIGJ5IDI1NmsgKi8KKyNkZWZpbmUJVElNRVJfQllfMTI4SwkweDAyCQkvKiBjbG9jayBkaXZpZGVkIGJ5IDEyOGsgKi8KKyNkZWZpbmUJVElNRVJfQllfMzJLCTB4MDMJCS8qIGNsb2NrIGRpdmlkZWQgYnkgMzJrICovCisKKy8qKioqKioqKioqKioqKioqKiogKioqKioqKioqKioqKioqKioqICoqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKKworI2lmbmRlZiBaRklSTV9JRAorLyogI2luY2x1ZGUgInpmd2ludC5oIiAqLworLyoqKioqKioqKioqKioqKioqKiAqKioqKioqKioqKioqKioqKiogKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKglUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciBpbnRlcmZhY2luZyB3aXRoIHRoZQorICoJQ3ljbG9tLVogWkZJUk0gRmlybXdhcmUuCisgKi8KKworLyogR2VuZXJhbCBDb25zdGFudCBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lCU1BWF9DSEFOCTY0CQkvKiBtYXggbnVtYmVyIG9mIGNoYW5uZWxzIHBlciBib2FyZCAqLworCisvKiBmaXJtd2FyZSBpZCBzdHJ1Y3R1cmUgKHNldCBhZnRlciBib290KSAqLworCisjZGVmaW5lIElEX0FERFJFU1MJMHgwMDAwMDE4MEwJLyogc2lnbmF0dXJlL3BvaW50ZXIgYWRkcmVzcyAqLworI2RlZmluZQlaRklSTV9JRAkweDU1NTc0NjVBTAkvKiBaRklSTS9VIHNpZ25hdHVyZSAqLworI2RlZmluZQlaRklSTV9ITFQJMHg1OTUwNUI1Q0wJLyogWkZJUk0gbmVlZHMgZXh0ZXJuYWwgcG93ZXIgc3VwcGx5ICovCisjZGVmaW5lCVpGSVJNX1JTVAkweDU2MDQwNjc0TAkvKiBSU1Qgc2lnbmFsIChkdWUgdG8gRlcgcmVzZXQpICovCisKKyNkZWZpbmUJWkZfVElOQUNUX0RFRgkxMDAwCQkvKiBkZWZhdWx0IGluYWN0aXZpdHkgdGltZW91dCAKKwkJCQkJICAgKDEwMDAgbXMpICovCisjZGVmaW5lCVpGX1RJTkFDVAlaRl9USU5BQ1RfREVGCisKK3N0cnVjdAlGSVJNX0lEIHsKKwlfX3UzMglzaWduYXR1cmU7CQkvKiBaRklSTS9VIHNpZ25hdHVyZSAqLworCV9fdTMyCXpmd2N0cmxfYWRkcjsJCS8qIHBvaW50ZXIgdG8gWkZXX0NUUkwgc3RydWN0dXJlICovCit9OworCisvKiBPcC4gU3lzdGVtIGlkICovCisKKyNkZWZpbmUJQ19PU19MSU5VWAkweDAwMDAwMDMwCS8qIGdlbmVyaWMgTGludXggc3lzdGVtICovCisKKy8qIGNoYW5uZWwgb3BfbW9kZSAqLworCisjZGVmaW5lCUNfQ0hfRElTQUJMRQkweDAwMDAwMDAwCS8qIGNoYW5uZWwgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUJQ19DSF9UWEVOQUJMRQkweDAwMDAwMDAxCS8qIGNoYW5uZWwgVHggZW5hYmxlZCAqLworI2RlZmluZQlDX0NIX1JYRU5BQkxFCTB4MDAwMDAwMDIJLyogY2hhbm5lbCBSeCBlbmFibGVkICovCisjZGVmaW5lCUNfQ0hfRU5BQkxFCTB4MDAwMDAwMDMJLyogY2hhbm5lbCBUeC9SeCBlbmFibGVkICovCisjZGVmaW5lCUNfQ0hfTE9PUEJBQ0sJMHgwMDAwMDAwNAkvKiBMb29wYmFjayBtb2RlICovCisKKy8qIGNvbW1fcGFyaXR5IC0gcGFyaXR5ICovCisKKyNkZWZpbmUJQ19QUl9OT05FCTB4MDAwMDAwMDAJLyogTm9uZSAqLworI2RlZmluZQlDX1BSX09ERAkweDAwMDAwMDAxCS8qIE9kZCAqLworI2RlZmluZSBDX1BSX0VWRU4JMHgwMDAwMDAwMgkvKiBFdmVuICovCisjZGVmaW5lIENfUFJfTUFSSwkweDAwMDAwMDA0CS8qIE1hcmsgKi8KKyNkZWZpbmUgQ19QUl9TUEFDRQkweDAwMDAwMDA4CS8qIFNwYWNlICovCisjZGVmaW5lIENfUFJfUEFSSVRZCTB4MDAwMDAwZmYKKworI2RlZmluZQlDX1BSX0RJU0NBUkQJMHgwMDAwMDEwMAkvKiBkaXNjYXJkIGNoYXIgd2l0aCBmcmFtZS9wYXIgZXJyb3IgKi8KKyNkZWZpbmUgQ19QUl9JR05PUkUJMHgwMDAwMDIwMAkvKiBpZ25vcmUgZnJhbWUvcGFyIGVycm9yICovCisKKy8qIGNvbW1fZGF0YV9sIC0gZGF0YSBsZW5ndGggYW5kIHN0b3AgYml0cyAqLworCisjZGVmaW5lIENfRExfQ1M1CTB4MDAwMDAwMDEKKyNkZWZpbmUgQ19ETF9DUzYJMHgwMDAwMDAwMgorI2RlZmluZSBDX0RMX0NTNwkweDAwMDAwMDA0CisjZGVmaW5lIENfRExfQ1M4CTB4MDAwMDAwMDgKKyNkZWZpbmUJQ19ETF9DUwkJMHgwMDAwMDAwZgorI2RlZmluZSBDX0RMXzFTVE9QCTB4MDAwMDAwMTAKKyNkZWZpbmUgQ19ETF8xNVNUT1AJMHgwMDAwMDAyMAorI2RlZmluZSBDX0RMXzJTVE9QCTB4MDAwMDAwNDAKKyNkZWZpbmUJQ19ETF9TVE9QCTB4MDAwMDAwZjAKKworLyogaW50ZXJydXB0IGVuYWJsaW5nL3N0YXR1cyAqLworCisjZGVmaW5lCUNfSU5fRElTQUJMRQkweDAwMDAwMDAwCS8qIHplcm8sIGRpc2FibGUgaW50ZXJydXB0cyAqLworI2RlZmluZQlDX0lOX1RYQkVNUFRZCTB4MDAwMDAwMDEJLyogdHggYnVmZmVyIGVtcHR5ICovCisjZGVmaW5lCUNfSU5fVFhMT1dXTQkweDAwMDAwMDAyCS8qIHR4IGJ1ZmZlciBiZWxvdyBMV00gKi8KKyNkZWZpbmUJQ19JTl9SWEhJV00JMHgwMDAwMDAxMAkvKiByeCBidWZmZXIgYWJvdmUgSFdNICovCisjZGVmaW5lCUNfSU5fUlhOTkRUCTB4MDAwMDAwMjAJLyogcnggbm8gbmV3IGRhdGEgdGltZW91dCAqLworI2RlZmluZQlDX0lOX01EQ0QJMHgwMDAwMDEwMAkvKiBtb2RlbSBEQ0QgY2hhbmdlICovCisjZGVmaW5lCUNfSU5fTURTUgkweDAwMDAwMjAwCS8qIG1vZGVtIERTUiBjaGFuZ2UgKi8KKyNkZWZpbmUJQ19JTl9NUkkJMHgwMDAwMDQwMAkvKiBtb2RlbSBSSSBjaGFuZ2UgKi8KKyNkZWZpbmUJQ19JTl9NQ1RTCTB4MDAwMDA4MDAJLyogbW9kZW0gQ1RTIGNoYW5nZSAqLworI2RlZmluZQlDX0lOX1JYQlJLCTB4MDAwMDEwMDAJLyogQnJlYWsgcmVjZWl2ZWQgKi8KKyNkZWZpbmUJQ19JTl9QUl9FUlJPUgkweDAwMDAyMDAwCS8qIHBhcml0eSBlcnJvciAqLworI2RlZmluZQlDX0lOX0ZSX0VSUk9SCTB4MDAwMDQwMDAJLyogZnJhbWUgZXJyb3IgKi8KKyNkZWZpbmUgQ19JTl9PVlJfRVJST1IgIDB4MDAwMDgwMDAgICAgICAvKiBvdmVycnVuIGVycm9yICovCisjZGVmaW5lIENfSU5fUlhPRkwJMHgwMDAxMDAwMCAgICAgIC8qIFJYIGJ1ZmZlciBvdmVyZmxvdyAqLworI2RlZmluZSBDX0lOX0lPQ1RMVwkweDAwMDIwMDAwICAgICAgLyogSS9PIGNvbnRyb2wgdy8gd2FpdCAqLworI2RlZmluZSBDX0lOX01SVFMJMHgwMDA0MDAwMAkvKiBtb2RlbSBSVFMgZHJvcCAqLworI2RlZmluZSBDX0lOX0lDSEFSCTB4MDAwODAwMDAKKyAKKy8qIGZsb3cgY29udHJvbCAqLworCisjZGVmaW5lCUNfRkxfT1hYCTB4MDAwMDAwMDEJLyogb3V0cHV0IFhvbi9Yb2ZmIGZsb3cgY29udHJvbCAqLworI2RlZmluZQlDX0ZMX0lYWAkweDAwMDAwMDAyCS8qIG91dHB1dCBYb24vWG9mZiBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgQ19GTF9PSVhBTlkJMHgwMDAwMDAwNAkvKiBvdXRwdXQgWG9uL1hvZmYgKGFueSB4b24pICovCisjZGVmaW5lCUNfRkxfU1dGTE9XCTB4MDAwMDAwMGYKKworLyogZmxvdyBzdGF0dXMgKi8KKworI2RlZmluZQlDX0ZTX1RYSURMRQkweDAwMDAwMDAwCS8qIG5vIFR4IGRhdGEgaW4gdGhlIGJ1ZmZlciBvciBVQVJUICovCisjZGVmaW5lCUNfRlNfU0VORElORwkweDAwMDAwMDAxCS8qIFVBUlQgaXMgc2VuZGluZyBkYXRhICovCisjZGVmaW5lCUNfRlNfU1dGTE9XCTB4MDAwMDAwMDIJLyogVHggaXMgc3RvcHBlZCBieSByZWNlaXZlZCBYb2ZmICovCisKKy8qIHJzX2NvbnRyb2wvcnNfc3RhdHVzIFJTLTIzMiBzaWduYWxzICovCisKKyNkZWZpbmUgQ19SU19QQVJBTQkweDgwMDAwMDAwCS8qIEluZGljYXRlcyBwcmVzZW5jZSBvZiBwYXJhbWV0ZXIgaW4gCisJCQkJCSAgIElPQ1RMTSBjb21tYW5kICovCisjZGVmaW5lCUNfUlNfUlRTCTB4MDAwMDAwMDEJLyogUlRTICovCisjZGVmaW5lCUNfUlNfRFRSCTB4MDAwMDAwMDQJLyogRFRSICovCisjZGVmaW5lCUNfUlNfRENECTB4MDAwMDAxMDAJLyogQ0QgKi8KKyNkZWZpbmUJQ19SU19EU1IJMHgwMDAwMDIwMAkvKiBEU1IgKi8KKyNkZWZpbmUJQ19SU19SSQkJMHgwMDAwMDQwMAkvKiBSSSAqLworI2RlZmluZQlDX1JTX0NUUwkweDAwMDAwODAwCS8qIENUUyAqLworCisvKiBjb21tYW5kcyBIb3N0IDwtPiBCb2FyZCAqLworCisjZGVmaW5lCUNfQ01fUkVTRVQJMHgwMQkJLyogcmVzZXQvZmx1c2ggYnVmZmVycyAqLworI2RlZmluZQlDX0NNX0lPQ1RMCTB4MDIJCS8qIHJlLXJlYWQgQ0hfQ1RSTCAqLworI2RlZmluZQlDX0NNX0lPQ1RMVwkweDAzCQkvKiByZS1yZWFkIENIX0NUUkwsIGludHIgd2hlbiBkb25lICovCisjZGVmaW5lCUNfQ01fSU9DVExNCTB4MDQJCS8qIFJTLTIzMiBvdXRwdXRzIGNoYW5nZSAqLworI2RlZmluZQlDX0NNX1NFTkRYT0ZGCTB4MTAJCS8qIHNlbmQgWG9mZiAqLworI2RlZmluZQlDX0NNX1NFTkRYT04JMHgxMQkJLyogc2VuZCBYb24gKi8KKyNkZWZpbmUgQ19DTV9DTEZMT1cJMHgxMgkJLyogQ2xlYXIgZmxvdyBjb250cm9sIChyZXN1bWUpICovCisjZGVmaW5lCUNfQ01fU0VOREJSSwkweDQxCQkvKiBzZW5kIGJyZWFrICovCisjZGVmaW5lCUNfQ01fSU5UQkFDSwkweDQyCQkvKiBJbnRlcnJ1cHQgYmFjayAqLworI2RlZmluZQlDX0NNX1NFVF9CUkVBSwkweDQzCQkvKiBUeCBicmVhayBvbiAqLworI2RlZmluZQlDX0NNX0NMUl9CUkVBSwkweDQ0CQkvKiBUeCBicmVhayBvZmYgKi8KKyNkZWZpbmUJQ19DTV9DTURfRE9ORQkweDQ1CQkvKiBQcmV2aW91cyBjb21tYW5kIGRvbmUgKi8KKyNkZWZpbmUgQ19DTV9JTlRCQUNLMgkweDQ2CQkvKiBBbHRlcm5hdGUgSW50ZXJydXB0IGJhY2sgKi8KKyNkZWZpbmUJQ19DTV9USU5BQ1QJMHg1MQkJLyogc2V0IGluYWN0aXZpdHkgZGV0ZWN0aW9uICovCisjZGVmaW5lCUNfQ01fSVJRX0VOQkwJMHg1MgkJLyogZW5hYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJydXB0cyAqLworI2RlZmluZQlDX0NNX0lSUV9EU0JMCTB4NTMJCS8qIGRpc2FibGUgZ2VuZXJhdGlvbiBvZiBpbnRlcnJ1cHRzICovCisjZGVmaW5lCUNfQ01fQUNLX0VOQkwJMHg1NAkJLyogZW5hYmxlIGFja25vd2xlZGdlZCBpbnRlcnJ1cHQgbW9kZSAqLworI2RlZmluZQlDX0NNX0FDS19EU0JMCTB4NTUJCS8qIGRpc2FibGUgYWNrbm93bGVkZ2VkIGludHIgbW9kZSAqLworI2RlZmluZQlDX0NNX0ZMVVNIX1JYCTB4NTYJCS8qIGZsdXNoZXMgUnggYnVmZmVyICovCisjZGVmaW5lCUNfQ01fRkxVU0hfVFgJMHg1NwkJLyogZmx1c2hlcyBUeCBidWZmZXIgKi8KKyNkZWZpbmUgQ19DTV9RX0VOQUJMRQkweDU4CQkvKiBlbmFibGVzIHF1ZXVlIGFjY2VzcyBmcm9tIHRoZSAKKwkJCQkJICAgZHJpdmVyICovCisjZGVmaW5lIENfQ01fUV9ESVNBQkxFICAweDU5ICAgICAgICAgICAgLyogZGlzYWJsZXMgcXVldWUgYWNjZXNzIGZyb20gdGhlIAorCQkJCQkgICBkcml2ZXIgKi8KKworI2RlZmluZQlDX0NNX1RYQkVNUFRZCTB4NjAJCS8qIFR4IGJ1ZmZlciBpcyBlbXB0eSAqLworI2RlZmluZQlDX0NNX1RYTE9XV00JMHg2MQkJLyogVHggYnVmZmVyIGxvdyB3YXRlciBtYXJrICovCisjZGVmaW5lCUNfQ01fUlhISVdNCTB4NjIJCS8qIFJ4IGJ1ZmZlciBoaWdoIHdhdGVyIG1hcmsgKi8KKyNkZWZpbmUJQ19DTV9SWE5ORFQJMHg2MwkJLyogcnggbm8gbmV3IGRhdGEgdGltZW91dCAqLworI2RlZmluZQlDX0NNX1RYRkVNUFRZCTB4NjQKKyNkZWZpbmUJQ19DTV9JQ0hBUgkweDY1CisjZGVmaW5lCUNfQ01fTURDRAkweDcwCQkvKiBtb2RlbSBEQ0QgY2hhbmdlICovCisjZGVmaW5lCUNfQ01fTURTUgkweDcxCQkvKiBtb2RlbSBEU1IgY2hhbmdlICovCisjZGVmaW5lCUNfQ01fTVJJCTB4NzIJCS8qIG1vZGVtIFJJIGNoYW5nZSAqLworI2RlZmluZQlDX0NNX01DVFMJMHg3MwkJLyogbW9kZW0gQ1RTIGNoYW5nZSAqLworI2RlZmluZSBDX0NNX01SVFMJMHg3NAkJLyogbW9kZW0gUlRTIGRyb3AgKi8KKyNkZWZpbmUJQ19DTV9SWEJSSwkweDg0CQkvKiBCcmVhayByZWNlaXZlZCAqLworI2RlZmluZQlDX0NNX1BSX0VSUk9SCTB4ODUJCS8qIFBhcml0eSBlcnJvciAqLworI2RlZmluZQlDX0NNX0ZSX0VSUk9SCTB4ODYJCS8qIEZyYW1lIGVycm9yICovCisjZGVmaW5lIENfQ01fT1ZSX0VSUk9SICAweDg3ICAgICAgICAgICAgLyogT3ZlcnJ1biBlcnJvciAqLworI2RlZmluZSBDX0NNX1JYT0ZMCTB4ODggICAgICAgICAgICAvKiBSWCBidWZmZXIgb3ZlcmZsb3cgKi8KKyNkZWZpbmUJQ19DTV9DTURFUlJPUgkweDkwCQkvKiBjb21tYW5kIGVycm9yICovCisjZGVmaW5lCUNfQ01fRkFUQUwJMHg5MQkJLyogZmF0YWwgZXJyb3IgKi8KKyNkZWZpbmUJQ19DTV9IV19SRVNFVAkweDkyCQkvKiByZXNldCBib2FyZCAqLworCisvKgorICoJQ0hfQ1RSTCAtIFRoaXMgcGVyIHBvcnQgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBwYXJhbWV0ZXJzCisgKgl0aGF0IGNvbnRyb2wgYW4gc3BlY2lmaWMgcG9ydC4gSXQgY2FuIGJlIHNlZW4gYXMgdGhlCisgKgljb25maWd1cmF0aW9uIHJlZ2lzdGVycyBvZiBhICJzdXBlci1zZXJpYWwtY29udHJvbGxlciIuCisgKi8KKworc3RydWN0IENIX0NUUkwgeworCV9fdTMyCW9wX21vZGU7CS8qIG9wZXJhdGlvbiBtb2RlICovCisJX191MzIJaW50cl9lbmFibGU7CS8qIGludGVycnVwdCBtYXNraW5nICovCisJX191MzIJc3dfZmxvdzsJLyogU1cgZmxvdyBjb250cm9sICovCisJX191MzIJZmxvd19zdGF0dXM7CS8qIG91dHB1dCBmbG93IHN0YXR1cyAqLworCV9fdTMyCWNvbW1fYmF1ZDsJLyogYmF1ZCByYXRlICAtIG51bWVyaWNhbGx5IHNwZWNpZmllZCAqLworCV9fdTMyCWNvbW1fcGFyaXR5OwkvKiBwYXJpdHkgKi8KKwlfX3UzMgljb21tX2RhdGFfbDsJLyogZGF0YSBsZW5ndGgvc3RvcCAqLworCV9fdTMyCWNvbW1fZmxhZ3M7CS8qIG90aGVyIGZsYWdzICovCisJX191MzIJaHdfZmxvdzsJLyogSFcgZmxvdyBjb250cm9sICovCisJX191MzIJcnNfY29udHJvbDsJLyogUlMtMjMyIG91dHB1dHMgKi8KKwlfX3UzMglyc19zdGF0dXM7CS8qIFJTLTIzMiBpbnB1dHMgKi8KKwlfX3UzMglmbG93X3hvbjsJLyogeG9uIGNoYXIgKi8KKwlfX3UzMglmbG93X3hvZmY7CS8qIHhvZmYgY2hhciAqLworCV9fdTMyCWh3X292ZXJmbG93OwkvKiBodyBvdmVyZmxvdyBjb3VudGVyICovCisJX191MzIJc3dfb3ZlcmZsb3c7CS8qIHN3IG92ZXJmbG93IGNvdW50ZXIgKi8KKwlfX3UzMgljb21tX2Vycm9yOwkvKiBmcmFtZS9wYXJpdHkgZXJyb3IgY291bnRlciAqLworCV9fdTMyIGljaGFyOworCV9fdTMyIGZpbGxlcls3XTsKK307CisKKworLyoKKyAqCUJVRl9DVFJMIC0gVGhpcyBwZXIgY2hhbm5lbCBzdHJ1Y3R1cmUgY29udGFpbnMKKyAqCWFsbCBUeCBhbmQgUnggYnVmZmVyIGNvbnRyb2wgZm9yIGEgZ2l2ZW4gY2hhbm5lbC4KKyAqLworCitzdHJ1Y3QJQlVGX0NUUkwJeworCV9fdTMyCWZsYWdfZG1hOwkvKiBidWZmZXJzIGFyZSBpbiBIb3N0IG1lbW9yeSAqLworCV9fdTMyCXR4X2J1ZmFkZHI7CS8qIGFkZHJlc3Mgb2YgdGhlIHR4IGJ1ZmZlciAqLworCV9fdTMyCXR4X2J1ZnNpemU7CS8qIHR4IGJ1ZmZlciBzaXplICovCisJX191MzIJdHhfdGhyZXNob2xkOwkvKiB0eCBsb3cgd2F0ZXIgbWFyayAqLworCV9fdTMyCXR4X2dldDsJCS8qIHRhaWwgaW5kZXggdHggYnVmICovCisJX191MzIJdHhfcHV0OwkJLyogaGVhZCBpbmRleCB0eCBidWYgKi8KKwlfX3UzMglyeF9idWZhZGRyOwkvKiBhZGRyZXNzIG9mIHRoZSByeCBidWZmZXIgKi8KKwlfX3UzMglyeF9idWZzaXplOwkvKiByeCBidWZmZXIgc2l6ZSAqLworCV9fdTMyCXJ4X3RocmVzaG9sZDsJLyogcnggaGlnaCB3YXRlciBtYXJrICovCisJX191MzIJcnhfZ2V0OwkJLyogdGFpbCBpbmRleCByeCBidWYgKi8KKwlfX3UzMglyeF9wdXQ7CQkvKiBoZWFkIGluZGV4IHJ4IGJ1ZiAqLworCV9fdTMyCWZpbGxlcls1XTsJLyogZmlsbGVyIHRvIGFsaWduIHN0cnVjdHVyZXMgKi8KK307CisKKy8qCisgKglCT0FSRF9DVFJMIC0gVGhpcyBwZXIgYm9hcmQgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBnbG9iYWwgCisgKgljb250cm9sIGZpZWxkcyByZWxhdGVkIHRvIHRoZSBib2FyZC4KKyAqLworCitzdHJ1Y3QgQk9BUkRfQ1RSTCB7CisKKwkvKiBzdGF0aWMgaW5mbyBwcm92aWRlZCBieSB0aGUgb24tYm9hcmQgQ1BVICovCisJX191MzIJbl9jaGFubmVsOwkvKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKwlfX3UzMglmd192ZXJzaW9uOwkvKiBmaXJtd2FyZSB2ZXJzaW9uICovCisKKwkvKiBzdGF0aWMgaW5mbyBwcm92aWRlZCBieSB0aGUgZHJpdmVyICovCisJX191MzIJb3Bfc3lzdGVtOwkvKiBvcF9zeXN0ZW0gaWQgKi8KKwlfX3UzMglkcl92ZXJzaW9uOwkvKiBkcml2ZXIgdmVyc2lvbiAqLworCisJLyogYm9hcmQgY29udHJvbCBhcmVhICovCisJX191MzIJaW5hY3Rpdml0eTsJLyogaW5hY3Rpdml0eSBjb250cm9sICovCisKKwkvKiBob3N0IHRvIEZXIGNvbW1hbmRzICovCisJX191MzIJaGNtZF9jaGFubmVsOwkvKiBjaGFubmVsIG51bWJlciAqLworCV9fdTMyCWhjbWRfcGFyYW07CS8qIHBvaW50ZXIgdG8gcGFyYW1ldGVycyAqLworCisJLyogRlcgdG8gSG9zdCBjb21tYW5kcyAqLworCV9fdTMyCWZ3Y21kX2NoYW5uZWw7CS8qIGNoYW5uZWwgbnVtYmVyICovCisJX191MzIJZndjbWRfcGFyYW07CS8qIHBvaW50ZXIgdG8gcGFyYW1ldGVycyAqLworCV9fdTMyCXpmX2ludF9xdWV1ZV9hZGRyOyAvKiBvZmZzZXQgZm9yIElOVF9RVUVVRSBzdHJ1Y3R1cmUgKi8KKworCS8qIGZpbGxlciBzbyB0aGUgc3RydWN0dXJlcyBhcmUgYWxpZ25lZCAqLworCV9fdTMyCWZpbGxlcls2XTsKK307CisKKy8qIEhvc3QgSW50ZXJydXB0IFF1ZXVlICovCisKKyNkZWZpbmUgUVVFVUVfU0laRQkoMTAqTUFYX0NIQU4pCisKK3N0cnVjdAlJTlRfUVVFVUUgeworCXVuc2lnbmVkIGNoYXIJaW50cl9jb2RlW1FVRVVFX1NJWkVdOworCXVuc2lnbmVkIGxvbmcJY2hhbm5lbFtRVUVVRV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nCXBhcmFtW1FVRVVFX1NJWkVdOworCXVuc2lnbmVkIGxvbmcJcHV0OworCXVuc2lnbmVkIGxvbmcJZ2V0OworfTsKKworLyoKKyAqCVpGV19DVFJMIC0gVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBpbmNsdWRlcyBhbGwgb3RoZXIKKyAqCWRhdGEgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBGaXJtd2FyZS4KKyAqLworIAorc3RydWN0IFpGV19DVFJMIHsKKwlzdHJ1Y3QgQk9BUkRfQ1RSTAlib2FyZF9jdHJsOworCXN0cnVjdCBDSF9DVFJMCQljaF9jdHJsW01BWF9DSEFOXTsKKwlzdHJ1Y3QgQlVGX0NUUkwJCWJ1Zl9jdHJsW01BWF9DSEFOXTsKK307CisKKy8qKioqKioqKioqKioqKioqKiogKioqKioqKioqKioqKioqKioqICoqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU5VWF9DWUNMQURFU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2N5Y3hfY2ZtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2N5Y3hfY2ZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyZDI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY3ljeF9jZm0uaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyogY3ljeF9jZm0uaAlDeWNsb20gMlggV0FOIExpbmsgRHJpdmVyLgorKgkJRGVmaW5pdGlvbnMgZm9yIHRoZSBDeWNsb20gMlggRmlybXdhcmUgTW9kdWxlIChDRk0pLgorKgorKiBBdXRob3I6CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk4LTIwMDMgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvCisqCisqIEJhc2VkIG9uIHNkbGFzZm0uaCBieSBHZW5lIEtvemluIDw3NDYwNC4xNTJAY29tcHVzZXJ2ZS5jb20+CisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIDE5OTgvMDgvMDgJYWNtZQkJSW5pdGlhbCB2ZXJzaW9uLgorKi8KKyNpZm5kZWYJX0NZQ1hfQ0ZNX0gKKyNkZWZpbmUJX0NZQ1hfQ0ZNX0gKKworLyogRGVmaW5lcyAqLworCisjZGVmaW5lCUNGTV9WRVJTSU9OCTIKKyNkZWZpbmUJQ0ZNX1NJR05BVFVSRQkiQ0ZNIC0gQ3ljbGFkZXMgQ1lDWCBGaXJtd2FyZSBNb2R1bGUiCisKKy8qIG1pbi9tYXggKi8KKyNkZWZpbmUJQ0ZNX0lNQUdFX1NJWkUJMHgyMDAwMAkvKiBtYXggc2l6ZSBvZiBDWUNYIGNvZGUgaW1hZ2UgZmlsZSAqLworI2RlZmluZQlDRk1fREVTQ1JfTEVOCTI1NgkvKiBtYXggbGVuZ3RoIG9mIGRlc2NyaXB0aW9uIHN0cmluZyAqLworI2RlZmluZQlDRk1fTUFYX0NZQ1gJMQkvKiBtYXggbnVtYmVyIG9mIGNvbXBhdGlibGUgYWRhcHRlcnMgKi8KKyNkZWZpbmUJQ0ZNX0xPQURfQlVGU1oJMHg0MDAJLyogYnVmZmVyIHNpemUgZm9yIHJlc2V0IGNvZGUgKGJ1ZmZlcl9sb2FkKSAqLworCisvKiBGaXJtd2FyZSBDb21tYW5kcyAqLworI2RlZmluZSBHRU5fUE9XRVJfT04JMHgxMjgwCisKKyNkZWZpbmUgR0VOX1NFVF9TRUcJMHgxNDAxCS8qIGJvb3Qgc2VnbWVudCBzZXR0aW5nLiAqLworI2RlZmluZSBHRU5fQk9PVF9EQVQJMHgxNDAyCS8qIGJvb3QgZGF0YS4gKi8KKyNkZWZpbmUgR0VOX1NUQVJUCTB4MTQwMwkvKiBib2FyZCBzdGFydC4gKi8KKyNkZWZpbmUgR0VOX0RFRlBBUgkweDE0MDQJLyogYnVmZmVyIGxlbmd0aCBmb3IgYm9vdC4gKi8KKworLyogQWRhcHRlciBUeXBlcyAqLworI2RlZmluZSBDWUNYXzJYCQkyCisvKiBmb3Igbm93IG9ubHkgdGhlIDJYIGlzIHN1cHBvcnRlZCwgbm8gcGxhbnMgdG8gc3VwcG9ydCA4WCBvciAxNlggKi8KKyNkZWZpbmUgQ1lDWF84WAkJOAorI2RlZmluZSBDWUNYXzE2WAkxNgorCisjZGVmaW5lCUNGSURfWDI1XzJYCTUyMDAKKworLyoqCisgKglzdHJ1Y3QgY3ljeF9md19pbmZvIC0gZmlybXdhcmUgbW9kdWxlIGluZm9ybWF0aW9uLgorICoJQGNvZGVpZCAtIGZpcm13YXJlIElECisgKglAdmVyc2lvbiAtIGZpcm13YXJlIHZlcnNpb24gbnVtYmVyCisgKglAYWRhcHRlciAtIGNvbXBhdGlibGUgYWRhcHRlciB0eXBlcworICoJQG1lbXNpemUgLSBtaW5pbXVtIG1lbW9yeSBzaXplCisgKglAcmVzZXJ2ZWQgLSByZXNlcnZlZAorICoJQHN0YXJ0b2ZmcyAtIGVudHJ5IHBvaW50IG9mZnNldAorICoJQHdpbm9mZnMgLSBkdWFsLXBvcnQgbWVtb3J5IHdpbmRvdyBvZmZzZXQKKyAqCUBjb2Rlb2ZmcyAtIGNvZGUgbG9hZCBvZmZzZXQKKyAqCUBjb2Rlc2l6ZSAtIGNvZGUgc2l6ZQorICoJQGRhdGFvZmZzIC0gY29uZmlndXJhdGlvbiBkYXRhIGxvYWQgb2Zmc2V0CisgKglAZGF0YXNpemUgLSBjb25maWd1cmF0aW9uIGRhdGEgc2l6ZQorICovCitzdHJ1Y3QgY3ljeF9md19pbmZvIHsKKwl1bnNpZ25lZCBzaG9ydAljb2RlaWQ7CisJdW5zaWduZWQgc2hvcnQJdmVyc2lvbjsKKwl1bnNpZ25lZCBzaG9ydAlhZGFwdGVyW0NGTV9NQVhfQ1lDWF07CisJdW5zaWduZWQgbG9uZwltZW1zaXplOworCXVuc2lnbmVkIHNob3J0CXJlc2VydmVkWzJdOworCXVuc2lnbmVkIHNob3J0CXN0YXJ0b2ZmczsKKwl1bnNpZ25lZCBzaG9ydAl3aW5vZmZzOworCXVuc2lnbmVkIHNob3J0CWNvZGVvZmZzOworCXVuc2lnbmVkIGxvbmcJY29kZXNpemU7CisJdW5zaWduZWQgc2hvcnQJZGF0YW9mZnM7CisJdW5zaWduZWQgbG9uZwlkYXRhc2l6ZTsKK307CisKKy8qKgorICoJc3RydWN0IGN5Y3hfZmlybXdhcmUgLSBDWUNYIGZpcm13YXJlIGZpbGUgc3RydWN0dXJlCisgKglAc2lnbmF0dXJlIC0gQ0ZNIGZpbGUgc2lnbmF0dXJlCisgKglAdmVyc2lvbiAtIGZpbGUgZm9ybWF0IHZlcnNpb24KKyAqCUBjaGVja3N1bSAtIGluZm8gKyBpbWFnZQorICoJQHJlc2VydmVkIC0gcmVzZXJ2ZWQKKyAqCUBkZXNjciAtIGRlc2NyaXB0aW9uIHN0cmluZworICoJQGluZm8gLSBmaXJtd2FyZSBtb2R1bGUgaW5mbworICoJQGltYWdlIC0gY29kZSBpbWFnZSAodmFyaWFibGUgc2l6ZSkKKyAqLworc3RydWN0IGN5Y3hfZmlybXdhcmUgeworCWNoYXIJCSAgICBzaWduYXR1cmVbODBdOworCXVuc2lnbmVkIHNob3J0CSAgICB2ZXJzaW9uOworCXVuc2lnbmVkIHNob3J0CSAgICBjaGVja3N1bTsKKwl1bnNpZ25lZCBzaG9ydAkgICAgcmVzZXJ2ZWRbNl07CisJY2hhcgkJICAgIGRlc2NyW0NGTV9ERVNDUl9MRU5dOworCXN0cnVjdCBjeWN4X2Z3X2luZm8gaW5mbzsKKwl1bnNpZ25lZCBjaGFyCSAgICBpbWFnZVswXTsKK307CisKK3N0cnVjdCBjeWN4X2Z3X2hlYWRlciB7CisJdW5zaWduZWQgbG9uZyAgcmVzZXRfc2l6ZTsKKwl1bnNpZ25lZCBsb25nICBkYXRhX3NpemU7CisJdW5zaWduZWQgbG9uZyAgY29kZV9zaXplOworfTsKKyNlbmRpZgkvKiBfQ1lDWF9DRk1fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kY2JubC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kY2JubC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YTI1NjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RjYm5sLmgKQEAgLTAsMCArMSw2NzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIEF1dGhvcjogTHVjeSBMaXUgPGx1Y3kubGl1QGludGVsLmNvbT4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfRENCTkxfSF9fCisjZGVmaW5lIF9fTElOVVhfRENCTkxfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBJRUVFIDgwMi4xUWF6IHN0ZCBzdXBwb3J0ZWQgdmFsdWVzICovCisjZGVmaW5lIElFRUVfODAyMVFBWl9NQVhfVENTCTgKKworI2RlZmluZSBJRUVFXzgwMjFRQVpfVFNBX1NUUklDVAkJMAorI2RlZmluZSBJRUVFXzgwMjFRQVpfVFNBX0NCX1NIQVBFUgkxCisjZGVmaW5lIElFRUVfODAyMVFBWl9UU0FfRVRTCQkyCisjZGVmaW5lIElFRUVfODAyMVFBWl9UU0FfVkVORE9SCQkyNTUKKworLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIElFRUUgODAyLjFRYXogRVRTIG1hbmFnZWQgb2JqZWN0CisgKgorICogQHdpbGxpbmc6IHdpbGxpbmcgYml0IGluIEVUUyBjb25maWd1cmF0aW9uIFRMVgorICogQGV0c19jYXA6IGluZGljYXRlcyBzdXBwb3J0ZWQgY2FwYWNpdHkgb2YgZXRzIGZlYXR1cmUKKyAqIEBjYnM6IGNyZWRpdCBiYXNlZCBzaGFwZXIgZXRzIGFsZ29yaXRobSBzdXBwb3J0ZWQKKyAqIEB0Y190eF9idzogdGMgdHggYmFuZHdpZHRoIGluZGV4ZWQgYnkgdHJhZmZpYyBjbGFzcworICogQHRjX3J4X2J3OiB0YyByeCBiYW5kd2lkdGggaW5kZXhlZCBieSB0cmFmZmljIGNsYXNzCisgKiBAdGNfdHNhOiBUU0EgQXNzaWdubWVudCB0YWJsZSwgaW5kZXhlZCBieSB0cmFmZmljIGNsYXNzCisgKiBAcHJpb190YzogcHJpb3JpdHkgYXNzaWdubWVudCB0YWJsZSBtYXBwaW5nIDgwMjFRcCB0byB0cmFmZmljIGNsYXNzCisgKiBAdGNfcmVjb19idzogcmVjb21tZW5kZWQgdGMgYmFuZHdpZHRoIGluZGV4ZWQgYnkgdHJhZmZpYyBjbGFzcyBmb3IgVExWCisgKiBAdGNfcmVjb190c2E6IHJlY29tbWVuZGVkIHRjIGJhbmR3aWR0aCBpbmRleGVkIGJ5IHRyYWZmaWMgY2xhc3MgZm9yIFRMVgorICogQHJlY29fcHJpb190YzogcmVjb21tZW5kZWQgdGMgdHggYmFuZHdpZHRoIGluZGV4ZWQgYnkgdHJhZmZpYyBjbGFzcyBmb3IgVExWCisgKgorICogUmVjb21tZW5kZWQgdmFsdWVzIGFyZSB1c2VkIHRvIHNldCBmaWVsZHMgaW4gdGhlIEVUUyByZWNvbW1lbmRhdGlvbiBUTFYKKyAqIHdpdGggaGFyZHdhcmUgb2ZmbG9hZGVkIExMRFAuCisgKgorICogLS0tLQorICogIFRTQSBBc3NpZ25tZW50IDggYml0IGlkZW50aWZpZXJzCisgKgkwCXN0cmljdCBwcmlvcml0eQorICoJMQljcmVkaXQtYmFzZWQgc2hhcGVyCisgKgkyCWVuaGFuY2VkIHRyYW5zbWlzc2lvbiBzZWxlY3Rpb24KKyAqCTMtMjU0CXJlc2VydmVkCisgKgkyNTUJdmVuZG9yIHNwZWNpZmljCisgKi8KK3N0cnVjdCBpZWVlX2V0cyB7CisJX191OAl3aWxsaW5nOworCV9fdTgJZXRzX2NhcDsKKwlfX3U4CWNiczsKKwlfX3U4CXRjX3R4X2J3W0lFRUVfODAyMVFBWl9NQVhfVENTXTsKKwlfX3U4CXRjX3J4X2J3W0lFRUVfODAyMVFBWl9NQVhfVENTXTsKKwlfX3U4CXRjX3RzYVtJRUVFXzgwMjFRQVpfTUFYX1RDU107CisJX191OAlwcmlvX3RjW0lFRUVfODAyMVFBWl9NQVhfVENTXTsKKwlfX3U4CXRjX3JlY29fYndbSUVFRV84MDIxUUFaX01BWF9UQ1NdOworCV9fdTgJdGNfcmVjb190c2FbSUVFRV84MDIxUUFaX01BWF9UQ1NdOworCV9fdTgJcmVjb19wcmlvX3RjW0lFRUVfODAyMVFBWl9NQVhfVENTXTsKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBJRUVFIDgwMi4xUWF6IFBGQyBtYW5hZ2VkIG9iamVjdAorICoKKyAqIEBwZmNfY2FwOiBJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgb24gdGhlIGxvY2FsIGRldmljZQorICoJICAgICB0aGF0IG1heSBzaW11bHRhbmVvdXNseSBoYXZlIFBGQyBlbmFibGVkLgorICogQHBmY19lbjogYml0bWFwIGluZGljYXRpbmcgcGZjIGVuYWJsZWQgdHJhZmZpYyBjbGFzc2VzCisgKiBAbWJjOiBlbmFibGUgbWFjc2VjIGJ5cGFzcyBjYXBhYmlsaXR5CisgKiBAZGVsYXk6IHRoZSBhbGxvd2FuY2UgbWFkZSBmb3IgYSByb3VuZC10cmlwIHByb3BhZ2F0aW9uIGRlbGF5IG9mIHRoZQorICoJICAgbGluayBpbiBiaXRzLgorICogQHJlcXVlc3RzOiBjb3VudCBvZiB0aGUgc2VudCBwZmMgZnJhbWVzCisgKiBAaW5kaWNhdGlvbnM6IGNvdW50IG9mIHRoZSByZWNlaXZlZCBwZmMgZnJhbWVzCisgKi8KK3N0cnVjdCBpZWVlX3BmYyB7CisJX191OAlwZmNfY2FwOworCV9fdTgJcGZjX2VuOworCV9fdTgJbWJjOworCV9fdTE2CWRlbGF5OworCV9fdTY0CXJlcXVlc3RzW0lFRUVfODAyMVFBWl9NQVhfVENTXTsKKwlfX3U2NAlpbmRpY2F0aW9uc1tJRUVFXzgwMjFRQVpfTUFYX1RDU107Cit9OworCisvKiBDRUUgRENCWCBzdGQgc3VwcG9ydGVkIHZhbHVlcyAqLworI2RlZmluZSBDRUVfRENCWF9NQVhfUEdTCTgKKyNkZWZpbmUgQ0VFX0RDQlhfTUFYX1BSSU8JOAorCisvKioKKyAqIHN0cnVjdCBjZWVfcGcgLSBDRUUgUHJpb3JpdHktR3JvdXAgbWFuYWdlZCBvYmplY3QKKyAqCisgKiBAd2lsbGluZzogd2lsbGluZyBiaXQgaW4gdGhlIFBHIHRsdgorICogQGVycm9yOiBlcnJvciBiaXQgaW4gdGhlIFBHIHRsdgorICogQHBnX2VuOiBlbmFibGUgYml0IG9mIHRoZSBQRyBmZWF0dXJlCisgKiBAdGNzX3N1cHBvcnRlZDogbnVtYmVyIG9mIHRyYWZmaWMgY2xhc3NlcyBzdXBwb3J0ZWQKKyAqIEBwZ19idzogYmFuZHdpZHRoIHBlcmNlbnRhZ2UgZm9yIGVhY2ggcHJpb3JpdHkgZ3JvdXAKKyAqIEBwcmlvX3BnOiBwcmlvcml0eSB0byBQRyBtYXBwaW5nIGluZGV4ZWQgYnkgcHJpb3JpdHkKKyAqLworc3RydWN0IGNlZV9wZyB7CisJX191OCAgICB3aWxsaW5nOworCV9fdTggICAgZXJyb3I7CisJX191OCAgICBwZ19lbjsKKwlfX3U4ICAgIHRjc19zdXBwb3J0ZWQ7CisJX191OCAgICBwZ19id1tDRUVfRENCWF9NQVhfUEdTXTsKKwlfX3U4ICAgIHByaW9fcGdbQ0VFX0RDQlhfTUFYX1BHU107Cit9OworCisvKioKKyAqIHN0cnVjdCBjZWVfcGZjIC0gQ0VFIFBGQyBtYW5hZ2VkIG9iamVjdAorICoKKyAqIEB3aWxsaW5nOiB3aWxsaW5nIGJpdCBpbiB0aGUgUEZDIHRsdgorICogQGVycm9yOiBlcnJvciBiaXQgaW4gdGhlIFBGQyB0bHYKKyAqIEBwZmNfZW46IGJpdG1hcCBpbmRpY2F0aW5nIHBmYyBlbmFibGVkIHRyYWZmaWMgY2xhc3NlcworICogQHRjc19zdXBwb3J0ZWQ6IG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgc3VwcG9ydGVkCisgKi8KK3N0cnVjdCBjZWVfcGZjIHsKKwlfX3U4ICAgIHdpbGxpbmc7CisJX191OCAgICBlcnJvcjsKKwlfX3U4ICAgIHBmY19lbjsKKwlfX3U4ICAgIHRjc19zdXBwb3J0ZWQ7Cit9OworCisvKiBJRUVFIDgwMi4xUWF6IHN0ZCBzdXBwb3J0ZWQgdmFsdWVzICovCisjZGVmaW5lIElFRUVfODAyMVFBWl9BUFBfU0VMX0VUSEVSVFlQRQkxCisjZGVmaW5lIElFRUVfODAyMVFBWl9BUFBfU0VMX1NUUkVBTQkyCisjZGVmaW5lIElFRUVfODAyMVFBWl9BUFBfU0VMX0RHUkFNCTMKKyNkZWZpbmUgSUVFRV84MDIxUUFaX0FQUF9TRUxfQU5ZCTQKKworLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIElFRUUgODAyLjFRYXogQVBQIG1hbmFnZWQgb2JqZWN0LiBUaGlzCisgKiBvYmplY3QgaXMgYWxzbyB1c2VkIGZvciB0aGUgQ0VFIHN0ZCBhcyB3ZWxsLiBUaGVyZSBpcyBubyBkaWZmZXJlbmNlCisgKiBiZXR3ZWVuIHRoZSBvYmplY3RzLgorICoKKyAqIEBzZWxlY3RvcjogcHJvdG9jb2wgaWRlbnRpZmllciB0eXBlCisgKiBAcHJvdG9jb2w6IHByb3RvY29sIG9mIHR5cGUgaW5kaWNhdGVkCisgKiBAcHJpb3JpdHk6IDMtYml0IHVuc2lnbmVkIGludGVnZXIgaW5kaWNhdGluZyBwcmlvcml0eQorICoKKyAqIC0tLS0KKyAqICBTZWxlY3RvciBmaWVsZCB2YWx1ZXMKKyAqCTAJUmVzZXJ2ZWQKKyAqCTEJRXRoZXJ0eXBlCisgKgkyCVdlbGwga25vd24gcG9ydCBudW1iZXIgb3ZlciBUQ1Agb3IgU0NUUAorICoJMwlXZWxsIGtub3duIHBvcnQgbnVtYmVyIG92ZXIgVURQIG9yIERDQ1AKKyAqCTQJV2VsbCBrbm93biBwb3J0IG51bWJlciBvdmVyIFRDUCwgU0NUUCwgVURQLCBvciBEQ0NQCisgKgk1LTcJUmVzZXJ2ZWQKKyAqLworc3RydWN0IGRjYl9hcHAgeworCV9fdTgJc2VsZWN0b3I7CisJX191OAlwcmlvcml0eTsKKwlfX3UxNglwcm90b2NvbDsKK307CisKKy8qKgorICogc3RydWN0IGRjYl9wZWVyX2FwcF9pbmZvIC0gQVBQIGZlYXR1cmUgaW5mb3JtYXRpb24gc2VudCBieSB0aGUgcGVlcgorICoKKyAqIEB3aWxsaW5nOiB3aWxsaW5nIGJpdCBpbiB0aGUgcGVlciBBUFAgdGx2CisgKiBAZXJyb3I6IGVycm9yIGJpdCBpbiB0aGUgcGVlciBBUFAgdGx2CisgKgorICogSW4gYWRkaXRpb24gdG8gdGhpcyBpbmZvcm1hdGlvbiB0aGUgZnVsbCBwZWVyIEFQUCB0bHYgYWxzbyBjb250YWlucworICogYSB0YWJsZSBvZiAnYXBwX2NvdW50JyBBUFAgb2JqZWN0cyBkZWZpbmVkIGFib3ZlLgorICovCitzdHJ1Y3QgZGNiX3BlZXJfYXBwX2luZm8geworCV9fdTgJd2lsbGluZzsKKwlfX3U4CWVycm9yOworfTsKKworc3RydWN0IGRjYm1zZyB7CisJX191OCAgICAgICAgICAgICAgIGRjYl9mYW1pbHk7CisJX191OCAgICAgICAgICAgICAgIGNtZDsKKwlfX3UxNiAgICAgICAgICAgICAgZGNiX3BhZDsKK307CisKKy8qKgorICogZW51bSBkY2JubF9jb21tYW5kcyAtIHN1cHBvcnRlZCBEQ0IgY29tbWFuZHMKKyAqCisgKiBARENCX0NNRF9VTkRFRklORUQ6IHVuc3BlY2lmaWVkIGNvbW1hbmQgdG8gY2F0Y2ggZXJyb3JzCisgKiBARENCX0NNRF9HU1RBVEU6IHJlcXVlc3QgdGhlIHN0YXRlIG9mIERDQiBpbiB0aGUgZGV2aWNlCisgKiBARENCX0NNRF9TU1RBVEU6IHNldCB0aGUgc3RhdGUgb2YgRENCIGluIHRoZSBkZXZpY2UKKyAqIEBEQ0JfQ01EX1BHVFhfR0NGRzogcmVxdWVzdCB0aGUgcHJpb3JpdHkgZ3JvdXAgY29uZmlndXJhdGlvbiBmb3IgVHgKKyAqIEBEQ0JfQ01EX1BHVFhfU0NGRzogc2V0IHRoZSBwcmlvcml0eSBncm91cCBjb25maWd1cmF0aW9uIGZvciBUeAorICogQERDQl9DTURfUEdSWF9HQ0ZHOiByZXF1ZXN0IHRoZSBwcmlvcml0eSBncm91cCBjb25maWd1cmF0aW9uIGZvciBSeAorICogQERDQl9DTURfUEdSWF9TQ0ZHOiBzZXQgdGhlIHByaW9yaXR5IGdyb3VwIGNvbmZpZ3VyYXRpb24gZm9yIFJ4CisgKiBARENCX0NNRF9QRkNfR0NGRzogcmVxdWVzdCB0aGUgcHJpb3JpdHkgZmxvdyBjb250cm9sIGNvbmZpZ3VyYXRpb24KKyAqIEBEQ0JfQ01EX1BGQ19TQ0ZHOiBzZXQgdGhlIHByaW9yaXR5IGZsb3cgY29udHJvbCBjb25maWd1cmF0aW9uCisgKiBARENCX0NNRF9TRVRfQUxMOiBhcHBseSBhbGwgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBkZXZpY2UKKyAqIEBEQ0JfQ01EX0dQRVJNX0hXQUREUjogZ2V0IHRoZSBwZXJtYW5lbnQgTUFDIGFkZHJlc3Mgb2YgdGhlIHVuZGVybHlpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLiAgT25seSB1c2VmdWwgd2hlbiB1c2luZyBib25kaW5nLgorICogQERDQl9DTURfR0NBUDogcmVxdWVzdCB0aGUgRENCIGNhcGFiaWxpdGllcyBvZiB0aGUgZGV2aWNlCisgKiBARENCX0NNRF9HTlVNVENTOiBnZXQgdGhlIG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgY3VycmVudGx5IHN1cHBvcnRlZAorICogQERDQl9DTURfU05VTVRDUzogc2V0IHRoZSBudW1iZXIgb2YgdHJhZmZpYyBjbGFzc2VzCisgKiBARENCX0NNRF9HQkNOOiBzZXQgYmFja3dhcmQgY29uZ2VzdGlvbiBub3RpZmljYXRpb24gY29uZmlndXJhdGlvbgorICogQERDQl9DTURfU0JDTjogZ2V0IGJhY2t3YXJkIGNvbmdlc3Rpb24gbm90aWZpY2F0aW9uIGNvbmZpZ3JhdGlvbi4KKyAqIEBEQ0JfQ01EX0dBUFA6IGdldCBhcHBsaWNhdGlvbiBwcm90b2NvbCBjb25maWd1cmF0aW9uCisgKiBARENCX0NNRF9TQVBQOiBzZXQgYXBwbGljYXRpb24gcHJvdG9jb2wgY29uZmlndXJhdGlvbgorICogQERDQl9DTURfSUVFRV9TRVQ6IHNldCBJRUVFIDgwMi4xUWF6IGNvbmZpZ3VyYXRpb24KKyAqIEBEQ0JfQ01EX0lFRUVfR0VUOiBnZXQgSUVFRSA4MDIuMVFheiBjb25maWd1cmF0aW9uCisgKiBARENCX0NNRF9HRENCWDogZ2V0IERDQlggZW5naW5lIGNvbmZpZ3VyYXRpb24KKyAqIEBEQ0JfQ01EX1NEQ0JYOiBzZXQgRENCWCBlbmdpbmUgY29uZmlndXJhdGlvbgorICogQERDQl9DTURfR0ZFQVRDRkc6IGdldCBEQ0JYIGZlYXR1cmVzIGZsYWdzCisgKiBARENCX0NNRF9TRkVBVENGRzogc2V0IERDQlggZmVhdHVyZXMgbmVnb3RpYXRpb24gZmxhZ3MKKyAqIEBEQ0JfQ01EX0NFRV9HRVQ6IGdldCBDRUUgYWdncmVnYXRlZCBjb25maWd1cmF0aW9uCisgKiBARENCX0NNRF9JRUVFX0RFTDogZGVsZXRlIElFRUUgODAyLjFRYXogY29uZmlndXJhdGlvbgorICovCitlbnVtIGRjYm5sX2NvbW1hbmRzIHsKKwlEQ0JfQ01EX1VOREVGSU5FRCwKKworCURDQl9DTURfR1NUQVRFLAorCURDQl9DTURfU1NUQVRFLAorCisJRENCX0NNRF9QR1RYX0dDRkcsCisJRENCX0NNRF9QR1RYX1NDRkcsCisJRENCX0NNRF9QR1JYX0dDRkcsCisJRENCX0NNRF9QR1JYX1NDRkcsCisKKwlEQ0JfQ01EX1BGQ19HQ0ZHLAorCURDQl9DTURfUEZDX1NDRkcsCisKKwlEQ0JfQ01EX1NFVF9BTEwsCisKKwlEQ0JfQ01EX0dQRVJNX0hXQUREUiwKKworCURDQl9DTURfR0NBUCwKKworCURDQl9DTURfR05VTVRDUywKKwlEQ0JfQ01EX1NOVU1UQ1MsCisKKwlEQ0JfQ01EX1BGQ19HU1RBVEUsCisJRENCX0NNRF9QRkNfU1NUQVRFLAorCisJRENCX0NNRF9CQ05fR0NGRywKKwlEQ0JfQ01EX0JDTl9TQ0ZHLAorCisJRENCX0NNRF9HQVBQLAorCURDQl9DTURfU0FQUCwKKworCURDQl9DTURfSUVFRV9TRVQsCisJRENCX0NNRF9JRUVFX0dFVCwKKworCURDQl9DTURfR0RDQlgsCisJRENCX0NNRF9TRENCWCwKKworCURDQl9DTURfR0ZFQVRDRkcsCisJRENCX0NNRF9TRkVBVENGRywKKworCURDQl9DTURfQ0VFX0dFVCwKKwlEQ0JfQ01EX0lFRUVfREVMLAorCisJX19EQ0JfQ01EX0VOVU1fTUFYLAorCURDQl9DTURfTUFYID0gX19EQ0JfQ01EX0VOVU1fTUFYIC0gMSwKK307CisKKy8qKgorICogZW51bSBkY2JubF9hdHRycyAtIERDQiB0b3AtbGV2ZWwgbmV0bGluayBhdHRyaWJ1dGVzCisgKgorICogQERDQl9BVFRSX1VOREVGSU5FRDogdW5zcGVjaWZpZWQgYXR0cmlidXRlIHRvIGNhdGNoIGVycm9ycworICogQERDQl9BVFRSX0lGTkFNRTogaW50ZXJmYWNlIG5hbWUgb2YgdGhlIHVuZGVybHlpbmcgZGV2aWNlIChOTEFfU1RSSU5HKQorICogQERDQl9BVFRSX1NUQVRFOiBlbmFibGUgc3RhdGUgb2YgRENCIGluIHRoZSBkZXZpY2UgKE5MQV9VOCkKKyAqIEBEQ0JfQVRUUl9QRkNfU1RBVEU6IGVuYWJsZSBzdGF0ZSBvZiBQRkMgaW4gdGhlIGRldmljZSAoTkxBX1U4KQorICogQERDQl9BVFRSX1BGQ19DRkc6IHByaW9yaXR5IGZsb3cgY29udHJvbCBjb25maWd1cmF0aW9uIChOTEFfTkVTVEVEKQorICogQERDQl9BVFRSX05VTV9UQzogbnVtYmVyIG9mIHRyYWZmaWMgY2xhc3NlcyBzdXBwb3J0ZWQgaW4gdGhlIGRldmljZSAoTkxBX1U4KQorICogQERDQl9BVFRSX1BHX0NGRzogcHJpb3JpdHkgZ3JvdXAgY29uZmlndXJhdGlvbiAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfQVRUUl9TRVRfQUxMOiBib29sIHRvIGNvbW1pdCBjaGFuZ2VzIHRvIGhhcmR3YXJlIG9yIG5vdCAoTkxBX1U4KQorICogQERDQl9BVFRSX1BFUk1fSFdBRERSOiBNQUMgYWRkcmVzcyBvZiB0aGUgcGh5c2ljYWwgZGV2aWNlIChOTEFfTkVTVEVEKQorICogQERDQl9BVFRSX0NBUDogRENCIGNhcGFiaWxpdGllcyBvZiB0aGUgZGV2aWNlIChOTEFfTkVTVEVEKQorICogQERDQl9BVFRSX05VTVRDUzogbnVtYmVyIG9mIHRyYWZmaWMgY2xhc3NlcyBzdXBwb3J0ZWQgKE5MQV9ORVNURUQpCisgKiBARENCX0FUVFJfQkNOOiBiYWNrd2FyZCBjb25nZXN0aW9uIG5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9uIChOTEFfTkVTVEVEKQorICogQERDQl9BVFRSX0lFRUU6IElFRUUgODAyLjFRYXogc3VwcG9ydGVkIGF0dHJpYnV0ZXMgKE5MQV9ORVNURUQpCisgKiBARENCX0FUVFJfRENCWDogRENCWCBlbmdpbmUgY29uZmlndXJhdGlvbiBpbiB0aGUgZGV2aWNlIChOTEFfVTgpCisgKiBARENCX0FUVFJfRkVBVENGRzogRENCWCBmZWF0dXJlcyBmbGFncyAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfQVRUUl9DRUU6IENFRSBzdGQgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgKE5MQV9ORVNURUQpCisgKi8KK2VudW0gZGNibmxfYXR0cnMgeworCURDQl9BVFRSX1VOREVGSU5FRCwKKworCURDQl9BVFRSX0lGTkFNRSwKKwlEQ0JfQVRUUl9TVEFURSwKKwlEQ0JfQVRUUl9QRkNfU1RBVEUsCisJRENCX0FUVFJfUEZDX0NGRywKKwlEQ0JfQVRUUl9OVU1fVEMsCisJRENCX0FUVFJfUEdfQ0ZHLAorCURDQl9BVFRSX1NFVF9BTEwsCisJRENCX0FUVFJfUEVSTV9IV0FERFIsCisJRENCX0FUVFJfQ0FQLAorCURDQl9BVFRSX05VTVRDUywKKwlEQ0JfQVRUUl9CQ04sCisJRENCX0FUVFJfQVBQLAorCisJLyogSUVFRSBzdGQgYXR0cmlidXRlcyAqLworCURDQl9BVFRSX0lFRUUsCisKKwlEQ0JfQVRUUl9EQ0JYLAorCURDQl9BVFRSX0ZFQVRDRkcsCisKKwkvKiBDRUUgbmVzdGVkIGF0dHJpYnV0ZXMgKi8KKwlEQ0JfQVRUUl9DRUUsCisKKwlfX0RDQl9BVFRSX0VOVU1fTUFYLAorCURDQl9BVFRSX01BWCA9IF9fRENCX0FUVFJfRU5VTV9NQVggLSAxLAorfTsKKworLyoqCisgKiBlbnVtIGllZWVfYXR0cnMgLSBJRUVFIDgwMi4xUWF6IGdldC9zZXQgYXR0cmlidXRlcworICoKKyAqIEBEQ0JfQVRUUl9JRUVFX1VOU1BFQzogdW5zcGVjaWZpZWQKKyAqIEBEQ0JfQVRUUl9JRUVFX0VUUzogbmVnb3RpYXRlZCBFVFMgY29uZmlndXJhdGlvbgorICogQERDQl9BVFRSX0lFRUVfUEZDOiBuZWdvdGlhdGVkIFBGQyBjb25maWd1cmF0aW9uCisgKiBARENCX0FUVFJfSUVFRV9BUFBfVEFCTEU6IG5lZ290aWF0ZWQgQVBQIGNvbmZpZ3VyYXRpb24KKyAqIEBEQ0JfQVRUUl9JRUVFX1BFRVJfRVRTOiBwZWVyIEVUUyBjb25maWd1cmF0aW9uIC0gZ2V0IG9ubHkKKyAqIEBEQ0JfQVRUUl9JRUVFX1BFRVJfUEZDOiBwZWVyIFBGQyBjb25maWd1cmF0aW9uIC0gZ2V0IG9ubHkKKyAqIEBEQ0JfQVRUUl9JRUVFX1BFRVJfQVBQOiBwZWVyIEFQUCB0bHYgLSBnZXQgb25seQorICovCitlbnVtIGllZWVfYXR0cnMgeworCURDQl9BVFRSX0lFRUVfVU5TUEVDLAorCURDQl9BVFRSX0lFRUVfRVRTLAorCURDQl9BVFRSX0lFRUVfUEZDLAorCURDQl9BVFRSX0lFRUVfQVBQX1RBQkxFLAorCURDQl9BVFRSX0lFRUVfUEVFUl9FVFMsCisJRENCX0FUVFJfSUVFRV9QRUVSX1BGQywKKwlEQ0JfQVRUUl9JRUVFX1BFRVJfQVBQLAorCV9fRENCX0FUVFJfSUVFRV9NQVgKK307CisjZGVmaW5lIERDQl9BVFRSX0lFRUVfTUFYIChfX0RDQl9BVFRSX0lFRUVfTUFYIC0gMSkKKworZW51bSBpZWVlX2F0dHJzX2FwcCB7CisJRENCX0FUVFJfSUVFRV9BUFBfVU5TUEVDLAorCURDQl9BVFRSX0lFRUVfQVBQLAorCV9fRENCX0FUVFJfSUVFRV9BUFBfTUFYCit9OworI2RlZmluZSBEQ0JfQVRUUl9JRUVFX0FQUF9NQVggKF9fRENCX0FUVFJfSUVFRV9BUFBfTUFYIC0gMSkKKworLyoqCisgKiBlbnVtIGNlZV9hdHRycyAtIENFRSBEQ0JYIGdldCBhdHRyaWJ1dGVzLgorICoKKyAqIEBEQ0JfQVRUUl9DRUVfVU5TUEVDOiB1bnNwZWNpZmllZAorICogQERDQl9BVFRSX0NFRV9QRUVSX1BHOiBwZWVyIFBHIGNvbmZpZ3VyYXRpb24gLSBnZXQgb25seQorICogQERDQl9BVFRSX0NFRV9QRUVSX1BGQzogcGVlciBQRkMgY29uZmlndXJhdGlvbiAtIGdldCBvbmx5CisgKiBARENCX0FUVFJfQ0VFX1BFRVJfQVBQX1RBQkxFOiBwZWVyIEFQUCB0bHYgLSBnZXQgb25seQorICogQERDQl9BVFRSX0NFRV9UWF9QRzogVFggUEcgY29uZmlndXJhdGlvbiAoRENCX0NNRF9QR1RYX0dDRkcpCisgKiBARENCX0FUVFJfQ0VFX1JYX1BHOiBSWCBQRyBjb25maWd1cmF0aW9uIChEQ0JfQ01EX1BHUlhfR0NGRykKKyAqIEBEQ0JfQVRUUl9DRUVfUEZDOiBQRkMgY29uZmlndXJhdGlvbiAoRENCX0NNRF9QRkNfR0NGRykKKyAqIEBEQ0JfQVRUUl9DRUVfQVBQX1RBQkxFOiBBUFAgY29uZmlndXJhdGlvbiAobXVsdGkgRENCX0NNRF9HQVBQKQorICogQERDQl9BVFRSX0NFRV9GRUFUOiBEQ0JYIGZlYXR1cmVzIGZsYWdzIChEQ0JfQ01EX0dGRUFUQ0ZHKQorICoKKyAqIEFuIGFnZ3JlZ2F0ZWQgY29sbGVjdGlvbiBvZiB0aGUgY2VlIHN0ZCBuZWdvdGlhdGVkIHBhcmFtZXRlcnMuCisgKi8KK2VudW0gY2VlX2F0dHJzIHsKKwlEQ0JfQVRUUl9DRUVfVU5TUEVDLAorCURDQl9BVFRSX0NFRV9QRUVSX1BHLAorCURDQl9BVFRSX0NFRV9QRUVSX1BGQywKKwlEQ0JfQVRUUl9DRUVfUEVFUl9BUFBfVEFCTEUsCisJRENCX0FUVFJfQ0VFX1RYX1BHLAorCURDQl9BVFRSX0NFRV9SWF9QRywKKwlEQ0JfQVRUUl9DRUVfUEZDLAorCURDQl9BVFRSX0NFRV9BUFBfVEFCTEUsCisJRENCX0FUVFJfQ0VFX0ZFQVQsCisJX19EQ0JfQVRUUl9DRUVfTUFYCit9OworI2RlZmluZSBEQ0JfQVRUUl9DRUVfTUFYIChfX0RDQl9BVFRSX0NFRV9NQVggLSAxKQorCitlbnVtIHBlZXJfYXBwX2F0dHIgeworCURDQl9BVFRSX0NFRV9QRUVSX0FQUF9VTlNQRUMsCisJRENCX0FUVFJfQ0VFX1BFRVJfQVBQX0lORk8sCisJRENCX0FUVFJfQ0VFX1BFRVJfQVBQLAorCV9fRENCX0FUVFJfQ0VFX1BFRVJfQVBQX01BWAorfTsKKyNkZWZpbmUgRENCX0FUVFJfQ0VFX1BFRVJfQVBQX01BWCAoX19EQ0JfQVRUUl9DRUVfUEVFUl9BUFBfTUFYIC0gMSkKKworZW51bSBjZWVfYXR0cnNfYXBwIHsKKwlEQ0JfQVRUUl9DRUVfQVBQX1VOU1BFQywKKwlEQ0JfQVRUUl9DRUVfQVBQLAorCV9fRENCX0FUVFJfQ0VFX0FQUF9NQVgKK307CisjZGVmaW5lIERDQl9BVFRSX0NFRV9BUFBfTUFYIChfX0RDQl9BVFRSX0NFRV9BUFBfTUFYIC0gMSkKKworLyoqCisgKiBlbnVtIGRjYm5sX3BmY19hdHRycyAtIERDQiBQcmlvcml0eSBGbG93IENvbnRyb2wgdXNlciBwcmlvcml0eSBuZXN0ZWQgYXR0cnMKKyAqCisgKiBARENCX1BGQ19VUF9BVFRSX1VOREVGSU5FRDogdW5zcGVjaWZpZWQgYXR0cmlidXRlIHRvIGNhdGNoIGVycm9ycworICogQERDQl9QRkNfVVBfQVRUUl8wOiBQcmlvcml0eSBGbG93IENvbnRyb2wgdmFsdWUgZm9yIFVzZXIgUHJpb3JpdHkgMCAoTkxBX1U4KQorICogQERDQl9QRkNfVVBfQVRUUl8xOiBQcmlvcml0eSBGbG93IENvbnRyb2wgdmFsdWUgZm9yIFVzZXIgUHJpb3JpdHkgMSAoTkxBX1U4KQorICogQERDQl9QRkNfVVBfQVRUUl8yOiBQcmlvcml0eSBGbG93IENvbnRyb2wgdmFsdWUgZm9yIFVzZXIgUHJpb3JpdHkgMiAoTkxBX1U4KQorICogQERDQl9QRkNfVVBfQVRUUl8zOiBQcmlvcml0eSBGbG93IENvbnRyb2wgdmFsdWUgZm9yIFVzZXIgUHJpb3JpdHkgMyAoTkxBX1U4KQorICogQERDQl9QRkNfVVBfQVRUUl80OiBQcmlvcml0eSBGbG93IENvbnRyb2wgdmFsdWUgZm9yIFVzZXIgUHJpb3JpdHkgNCAoTkxBX1U4KQorICogQERDQl9QRkNfVVBfQVRUUl81OiBQcmlvcml0eSBGbG93IENvbnRyb2wgdmFsdWUgZm9yIFVzZXIgUHJpb3JpdHkgNSAoTkxBX1U4KQorICogQERDQl9QRkNfVVBfQVRUUl82OiBQcmlvcml0eSBGbG93IENvbnRyb2wgdmFsdWUgZm9yIFVzZXIgUHJpb3JpdHkgNiAoTkxBX1U4KQorICogQERDQl9QRkNfVVBfQVRUUl83OiBQcmlvcml0eSBGbG93IENvbnRyb2wgdmFsdWUgZm9yIFVzZXIgUHJpb3JpdHkgNyAoTkxBX1U4KQorICogQERDQl9QRkNfVVBfQVRUUl9NQVg6IGhpZ2hlc3QgYXR0cmlidXRlIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZAorICogQERDQl9QRkNfVVBfQVRUUl9BTEw6IGFwcGx5IHRvIGFsbCBwcmlvcml0eSBmbG93IGNvbnRyb2wgYXR0cnMgKE5MQV9GTEFHKQorICoKKyAqLworZW51bSBkY2JubF9wZmNfdXBfYXR0cnMgeworCURDQl9QRkNfVVBfQVRUUl9VTkRFRklORUQsCisKKwlEQ0JfUEZDX1VQX0FUVFJfMCwKKwlEQ0JfUEZDX1VQX0FUVFJfMSwKKwlEQ0JfUEZDX1VQX0FUVFJfMiwKKwlEQ0JfUEZDX1VQX0FUVFJfMywKKwlEQ0JfUEZDX1VQX0FUVFJfNCwKKwlEQ0JfUEZDX1VQX0FUVFJfNSwKKwlEQ0JfUEZDX1VQX0FUVFJfNiwKKwlEQ0JfUEZDX1VQX0FUVFJfNywKKwlEQ0JfUEZDX1VQX0FUVFJfQUxMLAorCisJX19EQ0JfUEZDX1VQX0FUVFJfRU5VTV9NQVgsCisJRENCX1BGQ19VUF9BVFRSX01BWCA9IF9fRENCX1BGQ19VUF9BVFRSX0VOVU1fTUFYIC0gMSwKK307CisKKy8qKgorICogZW51bSBkY2JubF9wZ19hdHRycyAtIERDQiBQcmlvcml0eSBHcm91cCBhdHRyaWJ1dGVzCisgKgorICogQERDQl9QR19BVFRSX1VOREVGSU5FRDogdW5zcGVjaWZpZWQgYXR0cmlidXRlIHRvIGNhdGNoIGVycm9ycworICogQERDQl9QR19BVFRSX1RDXzA6IFByaW9yaXR5IEdyb3VwIFRyYWZmaWMgQ2xhc3MgMCBjb25maWd1cmF0aW9uIChOTEFfTkVTVEVEKQorICogQERDQl9QR19BVFRSX1RDXzE6IFByaW9yaXR5IEdyb3VwIFRyYWZmaWMgQ2xhc3MgMSBjb25maWd1cmF0aW9uIChOTEFfTkVTVEVEKQorICogQERDQl9QR19BVFRSX1RDXzI6IFByaW9yaXR5IEdyb3VwIFRyYWZmaWMgQ2xhc3MgMiBjb25maWd1cmF0aW9uIChOTEFfTkVTVEVEKQorICogQERDQl9QR19BVFRSX1RDXzM6IFByaW9yaXR5IEdyb3VwIFRyYWZmaWMgQ2xhc3MgMyBjb25maWd1cmF0aW9uIChOTEFfTkVTVEVEKQorICogQERDQl9QR19BVFRSX1RDXzQ6IFByaW9yaXR5IEdyb3VwIFRyYWZmaWMgQ2xhc3MgNCBjb25maWd1cmF0aW9uIChOTEFfTkVTVEVEKQorICogQERDQl9QR19BVFRSX1RDXzU6IFByaW9yaXR5IEdyb3VwIFRyYWZmaWMgQ2xhc3MgNSBjb25maWd1cmF0aW9uIChOTEFfTkVTVEVEKQorICogQERDQl9QR19BVFRSX1RDXzY6IFByaW9yaXR5IEdyb3VwIFRyYWZmaWMgQ2xhc3MgNiBjb25maWd1cmF0aW9uIChOTEFfTkVTVEVEKQorICogQERDQl9QR19BVFRSX1RDXzc6IFByaW9yaXR5IEdyb3VwIFRyYWZmaWMgQ2xhc3MgNyBjb25maWd1cmF0aW9uIChOTEFfTkVTVEVEKQorICogQERDQl9QR19BVFRSX1RDX01BWDogaGlnaGVzdCBhdHRyaWJ1dGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCisgKiBARENCX1BHX0FUVFJfVENfQUxMOiBhcHBseSB0byBhbGwgdHJhZmZpYyBjbGFzc2VzIChOTEFfTkVTVEVEKQorICogQERDQl9QR19BVFRSX0JXX0lEXzA6IFBlcmNlbnQgb2YgbGluayBiYW5kd2lkdGggZm9yIFByaW9yaXR5IEdyb3VwIDAgKE5MQV9VOCkKKyAqIEBEQ0JfUEdfQVRUUl9CV19JRF8xOiBQZXJjZW50IG9mIGxpbmsgYmFuZHdpZHRoIGZvciBQcmlvcml0eSBHcm91cCAxIChOTEFfVTgpCisgKiBARENCX1BHX0FUVFJfQldfSURfMjogUGVyY2VudCBvZiBsaW5rIGJhbmR3aWR0aCBmb3IgUHJpb3JpdHkgR3JvdXAgMiAoTkxBX1U4KQorICogQERDQl9QR19BVFRSX0JXX0lEXzM6IFBlcmNlbnQgb2YgbGluayBiYW5kd2lkdGggZm9yIFByaW9yaXR5IEdyb3VwIDMgKE5MQV9VOCkKKyAqIEBEQ0JfUEdfQVRUUl9CV19JRF80OiBQZXJjZW50IG9mIGxpbmsgYmFuZHdpZHRoIGZvciBQcmlvcml0eSBHcm91cCA0IChOTEFfVTgpCisgKiBARENCX1BHX0FUVFJfQldfSURfNTogUGVyY2VudCBvZiBsaW5rIGJhbmR3aWR0aCBmb3IgUHJpb3JpdHkgR3JvdXAgNSAoTkxBX1U4KQorICogQERDQl9QR19BVFRSX0JXX0lEXzY6IFBlcmNlbnQgb2YgbGluayBiYW5kd2lkdGggZm9yIFByaW9yaXR5IEdyb3VwIDYgKE5MQV9VOCkKKyAqIEBEQ0JfUEdfQVRUUl9CV19JRF83OiBQZXJjZW50IG9mIGxpbmsgYmFuZHdpZHRoIGZvciBQcmlvcml0eSBHcm91cCA3IChOTEFfVTgpCisgKiBARENCX1BHX0FUVFJfQldfSURfTUFYOiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKKyAqIEBEQ0JfUEdfQVRUUl9CV19JRF9BTEw6IGFwcGx5IHRvIGFsbCBwcmlvcml0eSBncm91cHMgKE5MQV9GTEFHKQorICoKKyAqLworZW51bSBkY2JubF9wZ19hdHRycyB7CisJRENCX1BHX0FUVFJfVU5ERUZJTkVELAorCisJRENCX1BHX0FUVFJfVENfMCwKKwlEQ0JfUEdfQVRUUl9UQ18xLAorCURDQl9QR19BVFRSX1RDXzIsCisJRENCX1BHX0FUVFJfVENfMywKKwlEQ0JfUEdfQVRUUl9UQ180LAorCURDQl9QR19BVFRSX1RDXzUsCisJRENCX1BHX0FUVFJfVENfNiwKKwlEQ0JfUEdfQVRUUl9UQ183LAorCURDQl9QR19BVFRSX1RDX01BWCwKKwlEQ0JfUEdfQVRUUl9UQ19BTEwsCisKKwlEQ0JfUEdfQVRUUl9CV19JRF8wLAorCURDQl9QR19BVFRSX0JXX0lEXzEsCisJRENCX1BHX0FUVFJfQldfSURfMiwKKwlEQ0JfUEdfQVRUUl9CV19JRF8zLAorCURDQl9QR19BVFRSX0JXX0lEXzQsCisJRENCX1BHX0FUVFJfQldfSURfNSwKKwlEQ0JfUEdfQVRUUl9CV19JRF82LAorCURDQl9QR19BVFRSX0JXX0lEXzcsCisJRENCX1BHX0FUVFJfQldfSURfTUFYLAorCURDQl9QR19BVFRSX0JXX0lEX0FMTCwKKworCV9fRENCX1BHX0FUVFJfRU5VTV9NQVgsCisJRENCX1BHX0FUVFJfTUFYID0gX19EQ0JfUEdfQVRUUl9FTlVNX01BWCAtIDEsCit9OworCisvKioKKyAqIGVudW0gZGNibmxfdGNfYXR0cnMgLSBEQ0IgVHJhZmZpYyBDbGFzcyBhdHRyaWJ1dGVzCisgKgorICogQERDQl9UQ19BVFRSX1BBUkFNX1VOREVGSU5FRDogdW5zcGVjaWZpZWQgYXR0cmlidXRlIHRvIGNhdGNoIGVycm9ycworICogQERDQl9UQ19BVFRSX1BBUkFNX1BHSUQ6IChOTEFfVTgpIFByaW9yaXR5IGdyb3VwIHRoZSB0cmFmZmljIGNsYXNzIGJlbG9uZ3MgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCB2YWx1ZXMgYXJlOiAgMC03CisgKiBARENCX1RDX0FUVFJfUEFSQU1fVVBfTUFQUElORzogKE5MQV9VOCkgVHJhZmZpYyBjbGFzcyB0byB1c2VyIHByaW9yaXR5IG1hcAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUgZGV2aWNlcyBtYXkgbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlciBwcmlvcml0eSBtYXAgb2YgYSBUQy4KKyAqIEBEQ0JfVENfQVRUUl9QQVJBTV9TVFJJQ1RfUFJJTzogKE5MQV9VOCkgU3RyaWN0IHByaW9yaXR5IHNldHRpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIG5vbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIGdyb3VwIHN0cmljdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gbGluayBzdHJpY3QKKyAqIEBEQ0JfVENfQVRUUl9QQVJBTV9CV19QQ1Q6IG9wdGlvbmFsIC0gKE5MQV9VOCkgSWYgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgY29uZmlndXJlZCB0byB1c2UgbGluayBzdHJpY3QgcHJpb3JpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBwZXJjZW50YWdlIG9mIGJhbmR3aWR0aCBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5IGdyb3VwIHRoaXMgdHJhZmZpYyBjbGFzcyBiZWxvbmdzIHRvCisgKiBARENCX1RDX0FUVFJfUEFSQU1fQUxMOiAoTkxBX0ZMQUcpIGFsbCB0cmFmZmljIGNsYXNzIHBhcmFtZXRlcnMKKyAqCisgKi8KK2VudW0gZGNibmxfdGNfYXR0cnMgeworCURDQl9UQ19BVFRSX1BBUkFNX1VOREVGSU5FRCwKKworCURDQl9UQ19BVFRSX1BBUkFNX1BHSUQsCisJRENCX1RDX0FUVFJfUEFSQU1fVVBfTUFQUElORywKKwlEQ0JfVENfQVRUUl9QQVJBTV9TVFJJQ1RfUFJJTywKKwlEQ0JfVENfQVRUUl9QQVJBTV9CV19QQ1QsCisJRENCX1RDX0FUVFJfUEFSQU1fQUxMLAorCisJX19EQ0JfVENfQVRUUl9QQVJBTV9FTlVNX01BWCwKKwlEQ0JfVENfQVRUUl9QQVJBTV9NQVggPSBfX0RDQl9UQ19BVFRSX1BBUkFNX0VOVU1fTUFYIC0gMSwKK307CisKKy8qKgorICogZW51bSBkY2JubF9jYXBfYXR0cnMgLSBEQ0IgQ2FwYWJpbGl0eSBhdHRyaWJ1dGVzCisgKgorICogQERDQl9DQVBfQVRUUl9VTkRFRklORUQ6IHVuc3BlY2lmaWVkIGF0dHJpYnV0ZSB0byBjYXRjaCBlcnJvcnMKKyAqIEBEQ0JfQ0FQX0FUVFJfQUxMOiAoTkxBX0ZMQUcpIGFsbCBjYXBhYmlsaXR5IHBhcmFtZXRlcnMKKyAqIEBEQ0JfQ0FQX0FUVFJfUEc6IChOTEFfVTgpIGRldmljZSBzdXBwb3J0cyBQcmlvcml0eSBHcm91cHMKKyAqIEBEQ0JfQ0FQX0FUVFJfUEZDOiAoTkxBX1U4KSBkZXZpY2Ugc3VwcG9ydHMgUHJpb3JpdHkgRmxvdyBDb250cm9sCisgKiBARENCX0NBUF9BVFRSX1VQMlRDOiAoTkxBX1U4KSBkZXZpY2Ugc3VwcG9ydHMgdXNlciBwcmlvcml0eSB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhZmZpYyBjbGFzcyBtYXBwaW5nCisgKiBARENCX0NBUF9BVFRSX1BHX1RDUzogKE5MQV9VOCkgYml0bWFwIHdoZXJlIGVhY2ggYml0IHJlcHJlc2VudHMgYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgdGhlIGRldmljZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBmb3IgUHJpb3JpdHkgR3JvdXBzCisgKiBARENCX0NBUF9BVFRSX1BGQ19UQ1M6IChOTEFfVTgpIGJpdG1hcCB3aGVyZSBlYWNoIGJpdCByZXByZXNlbnRzIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHRyYWZmaWMgY2xhc3NlcyB0aGUgZGV2aWNlIGNhbiBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVkIHRvIHVzZSBmb3IgUHJpb3JpdHkgRmxvdyBDb250cm9sCisgKiBARENCX0NBUF9BVFRSX0dTUDogKE5MQV9VOCkgZGV2aWNlIHN1cHBvcnRzIGdyb3VwIHN0cmljdCBwcmlvcml0eQorICogQERDQl9DQVBfQVRUUl9CQ046IChOTEFfVTgpIGRldmljZSBzdXBwb3J0cyBCYWNrd2FyZHMgQ29uZ2VzdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbgorICogQERDQl9DQVBfQVRUUl9EQ0JYOiAoTkxBX1U4KSBkZXZpY2Ugc3VwcG9ydHMgRENCWCBlbmdpbmUKKyAqCisgKi8KK2VudW0gZGNibmxfY2FwX2F0dHJzIHsKKwlEQ0JfQ0FQX0FUVFJfVU5ERUZJTkVELAorCURDQl9DQVBfQVRUUl9BTEwsCisJRENCX0NBUF9BVFRSX1BHLAorCURDQl9DQVBfQVRUUl9QRkMsCisJRENCX0NBUF9BVFRSX1VQMlRDLAorCURDQl9DQVBfQVRUUl9QR19UQ1MsCisJRENCX0NBUF9BVFRSX1BGQ19UQ1MsCisJRENCX0NBUF9BVFRSX0dTUCwKKwlEQ0JfQ0FQX0FUVFJfQkNOLAorCURDQl9DQVBfQVRUUl9EQ0JYLAorCisJX19EQ0JfQ0FQX0FUVFJfRU5VTV9NQVgsCisJRENCX0NBUF9BVFRSX01BWCA9IF9fRENCX0NBUF9BVFRSX0VOVU1fTUFYIC0gMSwKK307CisKKy8qKgorICogRENCWCBjYXBhYmlsaXR5IGZsYWdzCisgKgorICogQERDQl9DQVBfRENCWF9IT1NUOiBEQ0JYIG5lZ290aWF0aW9uIGlzIHBlcmZvcm1lZCBieSB0aGUgaG9zdCBMTERQIGFnZW50LgorICogICAgICAgICAgICAgICAgICAgICAnc2V0JyByb3V0aW5lcyBhcmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGRldmljZSB3aXRoCisgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBuZWdvdGlhdGVkIHBhcmFtZXRlcnMKKyAqCisgKiBARENCX0NBUF9EQ0JYX0xMRF9NQU5BR0VEOiBEQ0JYIG5lZ290aWF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgaW4gdGhlIGhvc3QgYnV0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBhbm90aGVyIGVudGl0eQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dldCcgcm91dGluZXMgYXJlIHVzZWQgdG8gcmV0cmlldmUgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdvdGlhdGVkIHBhcmFtZXRlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXQnIHJvdXRpbmVzIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnb3RpYXRpb24gY29uZmlndXJhdGlvbgorICoKKyAqIEBEQ0JfQ0FQX0RDQlhfVkVSX0NFRTogZm9yIGEgbm9uLWhvc3QgRENCWCBlbmdpbmUsIGluZGljYXRlcyB0aGUgZW5naW5lCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIHRoZSBDRUUgcHJvdG9jb2wgZmxhdm9yCisgKgorICogQERDQl9DQVBfRENCWF9WRVJfSUVFRTogZm9yIGEgbm9uLWhvc3QgRENCWCBlbmdpbmUsIGluZGljYXRlcyB0aGUgZW5naW5lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyB0aGUgSUVFRSBwcm90b2NvbCBmbGF2b3IKKyAqCisgKiBARENCX0NBUF9EQ0JYX1NUQVRJQzogZm9yIGEgbm9uLWhvc3QgRENCWCBlbmdpbmUsIGluZGljYXRlcyB0aGUgZW5naW5lCisgKiAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgc3RhdGljIGNvbmZpZ3VyYXRpb24gKGkuZSBubyBhY3R1YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICBuZWdvdGlhdGlvbiBpcyBwZXJmb3JtZWQgbmVnb3RpYXRlZCBwYXJhbWV0ZXJzIGVxdWFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGluaXRpYWwgY29uZmlndXJhdGlvbikKKyAqCisgKi8KKyNkZWZpbmUgRENCX0NBUF9EQ0JYX0hPU1QJCTB4MDEKKyNkZWZpbmUgRENCX0NBUF9EQ0JYX0xMRF9NQU5BR0VECTB4MDIKKyNkZWZpbmUgRENCX0NBUF9EQ0JYX1ZFUl9DRUUJCTB4MDQKKyNkZWZpbmUgRENCX0NBUF9EQ0JYX1ZFUl9JRUVFCQkweDA4CisjZGVmaW5lIERDQl9DQVBfRENCWF9TVEFUSUMJCTB4MTAKKworLyoqCisgKiBlbnVtIGRjYm5sX251bXRjc19hdHRycyAtIG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMKKyAqCisgKiBARENCX05VTVRDU19BVFRSX1VOREVGSU5FRDogdW5zcGVjaWZpZWQgYXR0cmlidXRlIHRvIGNhdGNoIGVycm9ycworICogQERDQl9OVU1UQ1NfQVRUUl9BTEw6IChOTEFfRkxBRykgYWxsIHRyYWZmaWMgY2xhc3MgYXR0cmlidXRlcworICogQERDQl9OVU1UQ1NfQVRUUl9QRzogKE5MQV9VOCkgbnVtYmVyIG9mIHRyYWZmaWMgY2xhc3NlcyB1c2VkIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgZ3JvdXBzCisgKiBARENCX05VTVRDU19BVFRSX1BGQzogKE5MQV9VOCkgbnVtYmVyIG9mIHRyYWZmaWMgY2xhc3NlcyB3aGljaCBjYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHByaW9yaXR5IGZsb3cgY29udHJvbAorICovCitlbnVtIGRjYm5sX251bXRjc19hdHRycyB7CisJRENCX05VTVRDU19BVFRSX1VOREVGSU5FRCwKKwlEQ0JfTlVNVENTX0FUVFJfQUxMLAorCURDQl9OVU1UQ1NfQVRUUl9QRywKKwlEQ0JfTlVNVENTX0FUVFJfUEZDLAorCisJX19EQ0JfTlVNVENTX0FUVFJfRU5VTV9NQVgsCisJRENCX05VTVRDU19BVFRSX01BWCA9IF9fRENCX05VTVRDU19BVFRSX0VOVU1fTUFYIC0gMSwKK307CisKK2VudW0gZGNibmxfYmNuX2F0dHJzeworCURDQl9CQ05fQVRUUl9VTkRFRklORUQgPSAwLAorCisJRENCX0JDTl9BVFRSX1JQXzAsCisJRENCX0JDTl9BVFRSX1JQXzEsCisJRENCX0JDTl9BVFRSX1JQXzIsCisJRENCX0JDTl9BVFRSX1JQXzMsCisJRENCX0JDTl9BVFRSX1JQXzQsCisJRENCX0JDTl9BVFRSX1JQXzUsCisJRENCX0JDTl9BVFRSX1JQXzYsCisJRENCX0JDTl9BVFRSX1JQXzcsCisJRENCX0JDTl9BVFRSX1JQX0FMTCwKKworCURDQl9CQ05fQVRUUl9CQ05BXzAsCisJRENCX0JDTl9BVFRSX0JDTkFfMSwKKwlEQ0JfQkNOX0FUVFJfQUxQSEEsCisJRENCX0JDTl9BVFRSX0JFVEEsCisJRENCX0JDTl9BVFRSX0dELAorCURDQl9CQ05fQVRUUl9HSSwKKwlEQ0JfQkNOX0FUVFJfVE1BWCwKKwlEQ0JfQkNOX0FUVFJfVEQsCisJRENCX0JDTl9BVFRSX1JNSU4sCisJRENCX0JDTl9BVFRSX1csCisJRENCX0JDTl9BVFRSX1JELAorCURDQl9CQ05fQVRUUl9SVSwKKwlEQ0JfQkNOX0FUVFJfV1JUVCwKKwlEQ0JfQkNOX0FUVFJfUkksCisJRENCX0JDTl9BVFRSX0MsCisJRENCX0JDTl9BVFRSX0FMTCwKKworCV9fRENCX0JDTl9BVFRSX0VOVU1fTUFYLAorCURDQl9CQ05fQVRUUl9NQVggPSBfX0RDQl9CQ05fQVRUUl9FTlVNX01BWCAtIDEsCit9OworCisvKioKKyAqIGVudW0gZGNiX2dlbmVyYWxfYXR0cl92YWx1ZXMgLSBnZW5lcmFsIERDQiBhdHRyaWJ1dGUgdmFsdWVzCisgKgorICogQERDQl9BVFRSX1VOREVGSU5FRDogdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSBhbiBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZAorICoKKyAqLworZW51bSBkY2JfZ2VuZXJhbF9hdHRyX3ZhbHVlcyB7CisJRENCX0FUVFJfVkFMVUVfVU5ERUZJTkVEID0gMHhmZgorfTsKKworI2RlZmluZSBEQ0JfQVBQX0lEVFlQRV9FVEhUWVBFCTB4MDAKKyNkZWZpbmUgRENCX0FQUF9JRFRZUEVfUE9SVE5VTQkweDAxCitlbnVtIGRjYm5sX2FwcF9hdHRycyB7CisJRENCX0FQUF9BVFRSX1VOREVGSU5FRCwKKworCURDQl9BUFBfQVRUUl9JRFRZUEUsCisJRENCX0FQUF9BVFRSX0lELAorCURDQl9BUFBfQVRUUl9QUklPUklUWSwKKworCV9fRENCX0FQUF9BVFRSX0VOVU1fTUFYLAorCURDQl9BUFBfQVRUUl9NQVggPSBfX0RDQl9BUFBfQVRUUl9FTlVNX01BWCAtIDEsCit9OworCisvKioKKyAqIGVudW0gZGNibmxfZmVhdGNmZ19hdHRycyAtIGZlYXR1cmVzIGNvbmlmaWd1cmF0aW9uIGZsYWdzCisgKgorICogQERDQl9GRUFUQ0ZHX0FUVFJfVU5ERUZJTkVEOiB1bnNwZWNpZmllZCBhdHRyaWJ1dGUgdG8gY2F0Y2ggZXJyb3JzCisgKiBARENCX0ZFQVRDRkdfQVRUUl9BTEw6IChOTEFfRkxBRykgYWxsIGZlYXR1cmVzIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcworICogQERDQl9GRUFUQ0ZHX0FUVFJfUEc6IChOTEFfVTgpIGNvbmZpZ3VyYXRpb24gZmxhZ3MgZm9yIHByaW9yaXR5IGdyb3VwcworICogQERDQl9GRUFUQ0ZHX0FUVFJfUEZDOiAoTkxBX1U4KSBjb25maWd1cmF0aW9uIGZsYWdzIGZvciBwcmlvcml0eQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93IGNvbnRyb2wKKyAqIEBEQ0JfRkVBVENGR19BVFRSX0FQUDogKE5MQV9VOCkgY29uZmlndXJhdGlvbiBmbGFncyBmb3IgYXBwbGljYXRpb24gVExWCisgKgorICovCisjZGVmaW5lIERDQl9GRUFUQ0ZHX0VSUk9SCTB4MDEJLyogZXJyb3IgaW4gZmVhdHVyZSByZXNvbHV0aW9uICovCisjZGVmaW5lIERDQl9GRUFUQ0ZHX0VOQUJMRQkweDAyCS8qIGVuYWJsZSBmZWF0dXJlICovCisjZGVmaW5lIERDQl9GRUFUQ0ZHX1dJTExJTkcJMHgwNAkvKiBmZWF0dXJlIGlzIHdpbGxpbmcgKi8KKyNkZWZpbmUgRENCX0ZFQVRDRkdfQURWRVJUSVNFCTB4MDgJLyogYWR2ZXJ0aXNlIGZlYXR1cmUgKi8KK2VudW0gZGNibmxfZmVhdGNmZ19hdHRycyB7CisJRENCX0ZFQVRDRkdfQVRUUl9VTkRFRklORUQsCisJRENCX0ZFQVRDRkdfQVRUUl9BTEwsCisJRENCX0ZFQVRDRkdfQVRUUl9QRywKKwlEQ0JfRkVBVENGR19BVFRSX1BGQywKKwlEQ0JfRkVBVENGR19BVFRSX0FQUCwKKworCV9fRENCX0ZFQVRDRkdfQVRUUl9FTlVNX01BWCwKKwlEQ0JfRkVBVENGR19BVFRSX01BWCA9IF9fRENCX0ZFQVRDRkdfQVRUUl9FTlVNX01BWCAtIDEsCit9OworCisjZW5kaWYgLyogX19MSU5VWF9EQ0JOTF9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGNjcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kY2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlMjIyNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGNjcC5oCkBAIC0wLDAgKzEsMjM3IEBACisjaWZuZGVmIF9MSU5VWF9EQ0NQX0gKKyNkZWZpbmUgX0xJTlVYX0RDQ1BfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qKgorICogc3RydWN0IGRjY3BfaGRyIC0gZ2VuZXJpYyBwYXJ0IG9mIERDQ1AgcGFja2V0IGhlYWRlcgorICoKKyAqIEBkY2NwaF9zcG9ydCAtIFJlbGV2YW50IHBvcnQgb24gdGhlIGVuZHBvaW50IHRoYXQgc2VudCB0aGlzIHBhY2tldAorICogQGRjY3BoX2Rwb3J0IC0gUmVsZXZhbnQgcG9ydCBvbiB0aGUgb3RoZXIgZW5kcG9pbnQKKyAqIEBkY2NwaF9kb2ZmIC0gRGF0YSBPZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIERDQ1AgaGVhZGVyLCBpbiAzMi1iaXQgd29yZHMKKyAqIEBkY2NwaF9jY3ZhbCAtIFVzZWQgYnkgdGhlIEhDLVNlbmRlciBDQ0lECisgKiBAZGNjcGhfY3Njb3YgLSBQYXJ0cyBvZiB0aGUgcGFja2V0IHRoYXQgYXJlIGNvdmVyZWQgYnkgdGhlIENoZWNrc3VtIGZpZWxkCisgKiBAZGNjcGhfY2hlY2tzdW0gLSBJbnRlcm5ldCBjaGVja3N1bSwgZGVwZW5kcyBvbiBkY2NwaF9jc2NvdgorICogQGRjY3BoX3ggLSAwID0gMjQgYml0IHNlcXVlbmNlIG51bWJlciwgMSA9IDQ4CisgKiBAZGNjcGhfdHlwZSAtIHBhY2tldCB0eXBlLCBzZWUgRENDUF9QS1RfIHByZWZpeGVkIG1hY3JvcworICogQGRjY3BoX3NlcSAtIHNlcXVlbmNlIG51bWJlciBoaWdoIG9yIGxvdyBvcmRlciAyNCBiaXRzLCBkZXBlbmRzIG9uIGRjY3BoX3gKKyAqLworc3RydWN0IGRjY3BfaGRyIHsKKwlfX2JlMTYJZGNjcGhfc3BvcnQsCisJCWRjY3BoX2Rwb3J0OworCV9fdTgJZGNjcGhfZG9mZjsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4CWRjY3BoX2NzY292OjQsCisJCWRjY3BoX2NjdmFsOjQ7CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4CWRjY3BoX2NjdmFsOjQsCisJCWRjY3BoX2NzY292OjQ7CisjZWxzZQorI2Vycm9yICAiQWRqdXN0IHlvdXIgPGFzbS9ieXRlb3JkZXIuaD4gZGVmaW5lcyIKKyNlbmRpZgorCV9fc3VtMTYJZGNjcGhfY2hlY2tzdW07CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OAlkY2NwaF94OjEsCisJCWRjY3BoX3R5cGU6NCwKKwkJZGNjcGhfcmVzZXJ2ZWQ6MzsKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJZGNjcGhfcmVzZXJ2ZWQ6MywKKwkJZGNjcGhfdHlwZTo0LAorCQlkY2NwaF94OjE7CisjZWxzZQorI2Vycm9yICAiQWRqdXN0IHlvdXIgPGFzbS9ieXRlb3JkZXIuaD4gZGVmaW5lcyIKKyNlbmRpZgorCV9fdTgJZGNjcGhfc2VxMjsKKwlfX2JlMTYJZGNjcGhfc2VxOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZGNjcF9oZHJfZXh0IC0gdGhlIGxvdyBiaXRzIG9mIGEgNDggYml0IHNlcSBwYWNrZXQKKyAqCisgKiBAZGNjcGhfc2VxX2xvdyAtIGxvdyAyNCBiaXRzIG9mIGEgNDggYml0IHNlcSBwYWNrZXQKKyAqLworc3RydWN0IGRjY3BfaGRyX2V4dCB7CisJX19iZTMyCWRjY3BoX3NlcV9sb3c7Cit9OworCisvKioKKyAqIHN0cnVjdCBkY2NwX2hkcl9yZXF1ZXN0IC0gQ29ubmVjdGlvbiBpbml0aWF0aW9uIHJlcXVlc3QgaGVhZGVyCisgKgorICogQGRjY3BoX3JlcV9zZXJ2aWNlIC0gU2VydmljZSB0byB3aGljaCB0aGUgY2xpZW50IGFwcCB3YW50cyB0byBjb25uZWN0CisgKi8KK3N0cnVjdCBkY2NwX2hkcl9yZXF1ZXN0IHsKKwlfX2JlMzIJZGNjcGhfcmVxX3NlcnZpY2U7Cit9OworLyoqCisgKiBzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMgLSBhY2tub3dsZWRnbWVudCBiaXRzIGNvbW1vbiB0byBtb3N0IHBhY2tldHMKKyAqCisgKiBAZGNjcGhfcmVzcF9hY2tfbnJfaGlnaCAtIDQ4IGJpdCBhY2sgbnVtYmVyIGhpZ2ggb3JkZXIgYml0cywgY29udGFpbnMgR1NSCisgKiBAZGNjcGhfcmVzcF9hY2tfbnJfbG93IC0gNDggYml0IGFjayBudW1iZXIgbG93IG9yZGVyIGJpdHMsIGNvbnRhaW5zIEdTUgorICovCitzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMgeworCV9fYmUxNglkY2NwaF9yZXNlcnZlZDE7CisJX19iZTE2CWRjY3BoX2Fja19ucl9oaWdoOworCV9fYmUzMglkY2NwaF9hY2tfbnJfbG93OworfTsKKy8qKgorICogc3RydWN0IGRjY3BfaGRyX3Jlc3BvbnNlIC0gQ29ubmVjdGlvbiBpbml0aWF0aW9uIHJlc3BvbnNlIGhlYWRlcgorICoKKyAqIEBkY2NwaF9yZXNwX2FjayAtIDQ4IGJpdCBBY2tub3dsZWRnbWVudCBOdW1iZXIgU3ViaGVhZGVyICg1LjMpCisgKiBAZGNjcGhfcmVzcF9zZXJ2aWNlIC0gRWNob2VzIHRoZSBTZXJ2aWNlIENvZGUgb24gYSByZWNlaXZlZCBEQ0NQLVJlcXVlc3QKKyAqLworc3RydWN0IGRjY3BfaGRyX3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMJZGNjcGhfcmVzcF9hY2s7CisJX19iZTMyCQkJCWRjY3BoX3Jlc3Bfc2VydmljZTsKK307CisKKy8qKgorICogc3RydWN0IGRjY3BfaGRyX3Jlc2V0IC0gVW5jb25kaXRpb25hbGx5IHNodXQgZG93biBhIGNvbm5lY3Rpb24KKyAqCisgKiBAZGNjcGhfcmVzZXRfYWNrIC0gNDggYml0IEFja25vd2xlZGdtZW50IE51bWJlciBTdWJoZWFkZXIgKDUuNikKKyAqIEBkY2NwaF9yZXNldF9jb2RlIC0gb25lIG9mICVkY2NwX3Jlc2V0X2NvZGVzCisgKiBAZGNjcGhfcmVzZXRfZGF0YSAtIHRoZSBEYXRhIDEgLi4uIERhdGEgMyBmaWVsZHMgZnJvbSA1LjYKKyAqLworc3RydWN0IGRjY3BfaGRyX3Jlc2V0IHsKKwlzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMJZGNjcGhfcmVzZXRfYWNrOworCV9fdTgJCQkJZGNjcGhfcmVzZXRfY29kZSwKKwkJCQkJZGNjcGhfcmVzZXRfZGF0YVszXTsKK307CisKK2VudW0gZGNjcF9wa3RfdHlwZSB7CisJRENDUF9QS1RfUkVRVUVTVCA9IDAsCisJRENDUF9QS1RfUkVTUE9OU0UsCisJRENDUF9QS1RfREFUQSwKKwlEQ0NQX1BLVF9BQ0ssCisJRENDUF9QS1RfREFUQUFDSywKKwlEQ0NQX1BLVF9DTE9TRVJFUSwKKwlEQ0NQX1BLVF9DTE9TRSwKKwlEQ0NQX1BLVF9SRVNFVCwKKwlEQ0NQX1BLVF9TWU5DLAorCURDQ1BfUEtUX1NZTkNBQ0ssCisJRENDUF9QS1RfSU5WQUxJRCwKK307CisKKyNkZWZpbmUgRENDUF9OUl9QS1RfVFlQRVMgRENDUF9QS1RfSU5WQUxJRAorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgZGNjcF9wYWNrZXRfaGRyX2xlbihjb25zdCBfX3U4IHR5cGUpCit7CisJaWYgKHR5cGUgPT0gRENDUF9QS1RfREFUQSkKKwkJcmV0dXJuIDA7CisJaWYgKHR5cGUgPT0gRENDUF9QS1RfREFUQUFDSwl8fAorCSAgICB0eXBlID09IERDQ1BfUEtUX0FDSwl8fAorCSAgICB0eXBlID09IERDQ1BfUEtUX1NZTkMJfHwKKwkgICAgdHlwZSA9PSBEQ0NQX1BLVF9TWU5DQUNLCXx8CisJICAgIHR5cGUgPT0gRENDUF9QS1RfQ0xPU0UJfHwKKwkgICAgdHlwZSA9PSBEQ0NQX1BLVF9DTE9TRVJFUSkKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMpOworCWlmICh0eXBlID09IERDQ1BfUEtUX1JFUVVFU1QpCisJCXJldHVybiBzaXplb2Yoc3RydWN0IGRjY3BfaGRyX3JlcXVlc3QpOworCWlmICh0eXBlID09IERDQ1BfUEtUX1JFU1BPTlNFKQorCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9yZXNwb25zZSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfcmVzZXQpOworfQorZW51bSBkY2NwX3Jlc2V0X2NvZGVzIHsKKwlEQ0NQX1JFU0VUX0NPREVfVU5TUEVDSUZJRUQgPSAwLAorCURDQ1BfUkVTRVRfQ09ERV9DTE9TRUQsCisJRENDUF9SRVNFVF9DT0RFX0FCT1JURUQsCisJRENDUF9SRVNFVF9DT0RFX05PX0NPTk5FQ1RJT04sCisJRENDUF9SRVNFVF9DT0RFX1BBQ0tFVF9FUlJPUiwKKwlEQ0NQX1JFU0VUX0NPREVfT1BUSU9OX0VSUk9SLAorCURDQ1BfUkVTRVRfQ09ERV9NQU5EQVRPUllfRVJST1IsCisJRENDUF9SRVNFVF9DT0RFX0NPTk5FQ1RJT05fUkVGVVNFRCwKKwlEQ0NQX1JFU0VUX0NPREVfQkFEX1NFUlZJQ0VfQ09ERSwKKwlEQ0NQX1JFU0VUX0NPREVfVE9PX0JVU1ksCisJRENDUF9SRVNFVF9DT0RFX0JBRF9JTklUX0NPT0tJRSwKKwlEQ0NQX1JFU0VUX0NPREVfQUdHUkVTU0lPTl9QRU5BTFRZLAorCisJRENDUF9NQVhfUkVTRVRfQ09ERVMJCS8qIExlYXZlIGF0IHRoZSBlbmQhICAqLworfTsKKworLyogRENDUCBvcHRpb25zICovCitlbnVtIHsKKwlEQ0NQT19QQURESU5HID0gMCwKKwlEQ0NQT19NQU5EQVRPUlkgPSAxLAorCURDQ1BPX01JTl9SRVNFUlZFRCA9IDMsCisJRENDUE9fTUFYX1JFU0VSVkVEID0gMzEsCisJRENDUE9fQ0hBTkdFX0wgPSAzMiwKKwlEQ0NQT19DT05GSVJNX0wgPSAzMywKKwlEQ0NQT19DSEFOR0VfUiA9IDM0LAorCURDQ1BPX0NPTkZJUk1fUiA9IDM1LAorCURDQ1BPX05EUF9DT1VOVCA9IDM3LAorCURDQ1BPX0FDS19WRUNUT1JfMCA9IDM4LAorCURDQ1BPX0FDS19WRUNUT1JfMSA9IDM5LAorCURDQ1BPX1RJTUVTVEFNUCA9IDQxLAorCURDQ1BPX1RJTUVTVEFNUF9FQ0hPID0gNDIsCisJRENDUE9fRUxBUFNFRF9USU1FID0gNDMsCisJRENDUE9fTUFYID0gNDUsCisJRENDUE9fTUlOX1JYX0NDSURfU1BFQ0lGSUMgPSAxMjgsCS8qIGZyb20gc2VuZGVyIHRvIHJlY2VpdmVyICovCisJRENDUE9fTUFYX1JYX0NDSURfU1BFQ0lGSUMgPSAxOTEsCisJRENDUE9fTUlOX1RYX0NDSURfU1BFQ0lGSUMgPSAxOTIsCS8qIGZyb20gcmVjZWl2ZXIgdG8gc2VuZGVyICovCisJRENDUE9fTUFYX1RYX0NDSURfU1BFQ0lGSUMgPSAyNTUsCit9OworLyogbWF4aW11bSBzaXplIG9mIGEgc2luZ2xlIFRMVi1lbmNvZGVkIERDQ1Agb3B0aW9uIChzYW5zIHR5cGUvbGVuIGJ5dGVzKSAqLworI2RlZmluZSBEQ0NQX1NJTkdMRV9PUFRfTUFYTEVOCTI1MworCisvKiBEQ0NQIENDSURTICovCitlbnVtIHsKKwlEQ0NQQ19DQ0lEMiA9IDIsCisJRENDUENfQ0NJRDMgPSAzLAorfTsKKworLyogRENDUCBmZWF0dXJlcyAoUkZDIDQzNDAgc2VjdGlvbiA2LjQpICovCitlbnVtIGRjY3BfZmVhdHVyZV9udW1iZXJzIHsKKwlEQ0NQRl9SRVNFUlZFRCA9IDAsCisJRENDUEZfQ0NJRCA9IDEsCisJRENDUEZfU0hPUlRfU0VRTk9TID0gMiwKKwlEQ0NQRl9TRVFVRU5DRV9XSU5ET1cgPSAzLAorCURDQ1BGX0VDTl9JTkNBUEFCTEUgPSA0LAorCURDQ1BGX0FDS19SQVRJTyA9IDUsCisJRENDUEZfU0VORF9BQ0tfVkVDVE9SID0gNiwKKwlEQ0NQRl9TRU5EX05EUF9DT1VOVCA9IDcsCisJRENDUEZfTUlOX0NTVU1fQ09WRVIgPSA4LAorCURDQ1BGX0RBVEFfQ0hFQ0tTVU0gPSA5LAorCS8qIDEwLTEyNyByZXNlcnZlZCAqLworCURDQ1BGX01JTl9DQ0lEX1NQRUNJRklDID0gMTI4LAorCURDQ1BGX1NFTkRfTEVWX1JBVEUgPSAxOTIsCS8qIFJGQyA0MzQyLCBzZWMuIDguNCAqLworCURDQ1BGX01BWF9DQ0lEX1NQRUNJRklDID0gMjU1LAorfTsKKworLyogRENDUCBzb2NrZXQgY29udHJvbCBtZXNzYWdlIHR5cGVzIGZvciBjbXNnICovCitlbnVtIGRjY3BfY21zZ190eXBlIHsKKwlEQ0NQX1NDTV9QUklPUklUWSA9IDEsCisJRENDUF9TQ01fUVBPTElDWV9NQVggPSAweEZGRkYsCisJLyogXi0tIFVwIHRvIGhlcmUgcmVzZXJ2ZWQgZXhjbHVzaXZlbHkgZm9yIHFwb2xpY3kgcGFyYW1ldGVycyAqLworCURDQ1BfU0NNX01BWAorfTsKKworLyogRENDUCBwcmlvcml0aWVzIGZvciBvdXRnb2luZy9xdWV1ZWQgcGFja2V0cyAqLworZW51bSBkY2NwX3BhY2tldF9kZXF1ZXVlaW5nX3BvbGljeSB7CisJRENDUFFfUE9MSUNZX1NJTVBMRSwKKwlEQ0NQUV9QT0xJQ1lfUFJJTywKKwlEQ0NQUV9QT0xJQ1lfTUFYCit9OworCisvKiBEQ0NQIHNvY2tldCBvcHRpb25zICovCisjZGVmaW5lIERDQ1BfU09DS09QVF9QQUNLRVRfU0laRQkxIC8qIFhYWCBkZXByZWNhdGVkLCB3aXRob3V0IGVmZmVjdCAqLworI2RlZmluZSBEQ0NQX1NPQ0tPUFRfU0VSVklDRQkJMgorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfQ0hBTkdFX0wJCTMKKyNkZWZpbmUgRENDUF9TT0NLT1BUX0NIQU5HRV9SCQk0CisjZGVmaW5lIERDQ1BfU09DS09QVF9HRVRfQ1VSX01QUwk1CisjZGVmaW5lIERDQ1BfU09DS09QVF9TRVJWRVJfVElNRVdBSVQJNgorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfU0VORF9DU0NPVgkJMTAKKyNkZWZpbmUgRENDUF9TT0NLT1BUX1JFQ1ZfQ1NDT1YJCTExCisjZGVmaW5lIERDQ1BfU09DS09QVF9BVkFJTEFCTEVfQ0NJRFMJMTIKKyNkZWZpbmUgRENDUF9TT0NLT1BUX0NDSUQJCTEzCisjZGVmaW5lIERDQ1BfU09DS09QVF9UWF9DQ0lECQkxNAorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfUlhfQ0NJRAkJMTUKKyNkZWZpbmUgRENDUF9TT0NLT1BUX1FQT0xJQ1lfSUQJCTE2CisjZGVmaW5lIERDQ1BfU09DS09QVF9RUE9MSUNZX1RYUUxFTgkxNworI2RlZmluZSBEQ0NQX1NPQ0tPUFRfQ0NJRF9SWF9JTkZPCTEyOAorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfQ0NJRF9UWF9JTkZPCTE5MgorCisvKiBtYXhpbXVtIG51bWJlciBvZiBzZXJ2aWNlcyBwcm92aWRlZCBvbiB0aGUgc2FtZSBsaXN0ZW5pbmcgcG9ydCAqLworI2RlZmluZSBEQ0NQX1NFUlZJQ0VfTElTVF9NQVhfTEVOICAgICAgMzIKKworCisjZW5kaWYgLyogX0xJTlVYX0RDQ1BfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbG0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3NzgwYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtLmgKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBDb3B5cmlnaHQgKEMpIFNpc3RpbmEgU29mdHdhcmUsIEluYy4gIDE5OTctMjAwMyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKioKKyoqICBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyoqICBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworKiogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fRExNX0RPVF9IX18KKyNkZWZpbmUgX19ETE1fRE9UX0hfXworCisvKgorICogSW50ZXJmYWNlIHRvIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlciAoRExNKQorICogcm91dGluZXMgYW5kIHN0cnVjdHVyZXMgdG8gdXNlIERMTSBsb2Nrc3BhY2VzCisgKi8KKworLyogTG9jayBsZXZlbHMgYW5kIGZsYWdzIGFyZSBoZXJlICovCisjaW5jbHVkZSA8bGludXgvZGxtY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwordHlwZWRlZiB2b2lkIGRsbV9sb2Nrc3BhY2VfdDsKKworLyoKKyAqIExvY2sgc3RhdHVzIGJsb2NrCisgKgorICogVXNlIHRoaXMgc3RydWN0dXJlIHRvIHNwZWNpZnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NrIHZhbHVlIGJsb2NrLiAgRm9yIGEKKyAqIGNvbnZlcnNpb24gcmVxdWVzdCwgdGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NrIElEIG9mIHRoZQorICogbG9jay4gIERMTSB3cml0ZXMgdGhlIHN0YXR1cyBvZiB0aGUgbG9jayByZXF1ZXN0IGFuZCB0aGUgbG9jayBJRCBhc3NpZ25lZAorICogdG8gdGhlIHJlcXVlc3QgaW4gdGhlIGxvY2sgc3RhdHVzIGJsb2NrLgorICoKKyAqIHNiX2xraWQ6IHRoZSByZXR1cm5lZCBsb2NrIElELiAgSXQgaXMgc2V0IG9uIG5ldyAobm9uLWNvbnZlcnNpb24pIHJlcXVlc3RzLgorICogSXQgaXMgYXZhaWxhYmxlIHdoZW4gZGxtX2xvY2sgcmV0dXJucy4KKyAqCisgKiBzYl9sdmJwdHI6IHNhdmVzIG9yIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NrJ3MgTFZCIGFjY29yZGluZyB0byBydWxlcworICogc2hvd24gZm9yIHRoZSBETE1fTEtGX1ZBTEJMSyBmbGFnLgorICoKKyAqIHNiX2ZsYWdzOiBETE1fU0JGX0RFTU9URUQgaXMgcmV0dXJuZWQgaWYgaW4gdGhlIHByb2Nlc3Mgb2YgcHJvbW90aW5nIGEgbG9jaywKKyAqIGl0IHdhcyBmaXJzdCBkZW1vdGVkIHRvIE5MIHRvIGF2b2lkIGNvbnZlcnNpb24gZGVhZGxvY2suCisgKiBETE1fU0JGX1ZBTE5PVFZBTElEIGlzIHJldHVybmVkIGlmIHRoZSByZXNvdXJjZSdzIExWQiBpcyBtYXJrZWQgaW52YWxpZC4KKyAqCisgKiBzYl9zdGF0dXM6IHRoZSByZXR1cm5lZCBzdGF0dXMgb2YgdGhlIGxvY2sgcmVxdWVzdCBzZXQgcHJpb3IgdG8gQVNUCisgKiBleGVjdXRpb24uICBQb3NzaWJsZSByZXR1cm4gdmFsdWVzOgorICoKKyAqIDAgaWYgbG9jayByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsCisgKiAtRUFHQUlOIGlmIHJlcXVlc3Qgd291bGQgYmxvY2sgYW5kIGlzIGZsYWdnZWQgRExNX0xLRl9OT1FVRVVFCisgKiAtRExNX0VVTkxPQ0sgaWYgdW5sb2NrIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwKKyAqIC1ETE1fRUNBTkNFTCBpZiBhIGNhbmNlbCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgKiAtRURFQURMSyBpZiBhIGRlYWRsb2NrIHdhcyBkZXRlY3RlZAorICogLUVUSU1FRE9VVCBpZiB0aGUgbG9jayByZXF1ZXN0IHdhcyBjYW5jZWxlZCBkdWUgdG8gYSB0aW1lb3V0CisgKi8KKworI2RlZmluZSBETE1fU0JGX0RFTU9URUQJCTB4MDEKKyNkZWZpbmUgRExNX1NCRl9WQUxOT1RWQUxJRAkweDAyCisjZGVmaW5lIERMTV9TQkZfQUxUTU9ERQkJMHgwNAorCitzdHJ1Y3QgZGxtX2xrc2IgeworCWludCAJIHNiX3N0YXR1czsKKwlfX3UzMgkgc2JfbGtpZDsKKwljaGFyIAkgc2JfZmxhZ3M7CisJY2hhciAqCSBzYl9sdmJwdHI7Cit9OworCisvKiBkbG1fbmV3X2xvY2tzcGFjZSgpIGZsYWdzICovCisKKyNkZWZpbmUgRExNX0xTRkxfTk9ESVIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRExNX0xTRkxfVElNRVdBUk4JMHgwMDAwMDAwMgorI2RlZmluZSBETE1fTFNGTF9GUyAgICAgCTB4MDAwMDAwMDQKKyNkZWZpbmUgRExNX0xTRkxfTkVXRVhDTCAgICAgCTB4MDAwMDAwMDgKKworCisjZW5kaWYJCQkJLyogX19ETE1fRE9UX0hfXyAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RsbV9kZXZpY2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDllYmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RsbV9kZXZpY2UuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBDb3B5cmlnaHQgKEMpIFNpc3RpbmEgU29mdHdhcmUsIEluYy4gIDE5OTctMjAwMyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKioKKyoqICBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyoqICBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworKiogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9MSU5VWF9ETE1fREVWSUNFX0gKKyNkZWZpbmUgX0xJTlVYX0RMTV9ERVZJQ0VfSAorCisvKiBUaGlzIGlzIHRoZSBkZXZpY2UgaW50ZXJmYWNlIGZvciBkbG0sIG1vc3QgdXNlcnMgd2lsbCB1c2UgYSBsaWJyYXJ5CisgKiBpbnRlcmZhY2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RsbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRExNX1VTRVJfTFZCX0xFTgkzMgorCisvKiBWZXJzaW9uIG9mIHRoZSBkZXZpY2UgaW50ZXJmYWNlICovCisjZGVmaW5lIERMTV9ERVZJQ0VfVkVSU0lPTl9NQUpPUiA2CisjZGVmaW5lIERMTV9ERVZJQ0VfVkVSU0lPTl9NSU5PUiAwCisjZGVmaW5lIERMTV9ERVZJQ0VfVkVSU0lPTl9QQVRDSCAxCisKKy8qIHN0cnVjdCBwYXNzZWQgdG8gdGhlIGxvY2sgd3JpdGUgKi8KK3N0cnVjdCBkbG1fbG9ja19wYXJhbXMgeworCV9fdTggbW9kZTsKKwlfX3U4IG5hbWVsZW47CisJX191MTYgdW51c2VkOworCV9fdTMyIGZsYWdzOworCV9fdTMyIGxraWQ7CisJX191MzIgcGFyZW50OworCV9fdTY0IHhpZDsKKwlfX3U2NCB0aW1lb3V0OworCXZvaWQgKmNhc3RwYXJhbTsKKwl2b2lkICpjYXN0YWRkcjsKKwl2b2lkICpiYXN0cGFyYW07CisJdm9pZCAqYmFzdGFkZHI7CisJc3RydWN0IGRsbV9sa3NiICpsa3NiOworCWNoYXIgbHZiW0RMTV9VU0VSX0xWQl9MRU5dOworCWNoYXIgbmFtZVswXTsKK307CisKK3N0cnVjdCBkbG1fbHNwYWNlX3BhcmFtcyB7CisJX191MzIgZmxhZ3M7CisJX191MzIgbWlub3I7CisJY2hhciBuYW1lWzBdOworfTsKKworc3RydWN0IGRsbV9wdXJnZV9wYXJhbXMgeworCV9fdTMyIG5vZGVpZDsKKwlfX3UzMiBwaWQ7Cit9OworCitzdHJ1Y3QgZGxtX3dyaXRlX3JlcXVlc3QgeworCV9fdTMyIHZlcnNpb25bM107CisJX191OCBjbWQ7CisJX191OCBpczY0Yml0OworCV9fdTggdW51c2VkWzJdOworCisJdW5pb24gIHsKKwkJc3RydWN0IGRsbV9sb2NrX3BhcmFtcyAgIGxvY2s7CisJCXN0cnVjdCBkbG1fbHNwYWNlX3BhcmFtcyBsc3BhY2U7CisJCXN0cnVjdCBkbG1fcHVyZ2VfcGFyYW1zICBwdXJnZTsKKwl9IGk7Cit9OworCitzdHJ1Y3QgZGxtX2RldmljZV92ZXJzaW9uIHsKKwlfX3UzMiB2ZXJzaW9uWzNdOworfTsKKworLyogc3RydWN0IHJlYWQgZnJvbSB0aGUgImRldmljZSIgZmQsCisgICBjb25zaXN0cyBtYWlubHkgb2YgdXNlcnNwYWNlIHBvaW50ZXJzIGZvciB0aGUgbGlicmFyeSB0byB1c2UgKi8KKworc3RydWN0IGRsbV9sb2NrX3Jlc3VsdCB7CisJX191MzIgdmVyc2lvblszXTsKKwlfX3UzMiBsZW5ndGg7CisJdm9pZCAqIHVzZXJfYXN0YWRkcjsKKwl2b2lkICogdXNlcl9hc3RwYXJhbTsKKwlzdHJ1Y3QgZGxtX2xrc2IgKiB1c2VyX2xrc2I7CisJc3RydWN0IGRsbV9sa3NiIGxrc2I7CisJX191OCBiYXN0X21vZGU7CisJX191OCB1bnVzZWRbM107CisJLyogT2Zmc2V0cyBtYXkgYmUgemVybyBpZiBubyBkYXRhIGlzIHByZXNlbnQgKi8KKwlfX3UzMiBsdmJfb2Zmc2V0OworfTsKKworLyogQ29tbWFuZHMgcGFzc2VkIHRvIHRoZSBkZXZpY2UgKi8KKyNkZWZpbmUgRExNX1VTRVJfTE9DSyAgICAgICAgIDEKKyNkZWZpbmUgRExNX1VTRVJfVU5MT0NLICAgICAgIDIKKyNkZWZpbmUgRExNX1VTRVJfUVVFUlkgICAgICAgIDMKKyNkZWZpbmUgRExNX1VTRVJfQ1JFQVRFX0xPQ0tTUEFDRSAgNAorI2RlZmluZSBETE1fVVNFUl9SRU1PVkVfTE9DS1NQQUNFICA1CisjZGVmaW5lIERMTV9VU0VSX1BVUkdFICAgICAgICA2CisjZGVmaW5lIERMTV9VU0VSX0RFQURMT0NLICAgICA3CisKKy8qIExvY2tzcGFjZSBmbGFncyAqLworI2RlZmluZSBETE1fVVNFUl9MU0ZMR19BVVRPRlJFRSAgIDEKKyNkZWZpbmUgRExNX1VTRVJfTFNGTEdfRk9SQ0VGUkVFICAyCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RsbV9uZXRsaW5rLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RsbV9uZXRsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3YzhlZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtX25ldGxpbmsuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqLworCisjaWZuZGVmIF9ETE1fTkVUTElOS19ICisjZGVmaW5lIF9ETE1fTkVUTElOS19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwlETE1fU1RBVFVTX1dBSVRJTkcgPSAxLAorCURMTV9TVEFUVVNfR1JBTlRFRCA9IDIsCisJRExNX1NUQVRVU19DT05WRVJUID0gMywKK307CisKKyNkZWZpbmUgRExNX0xPQ0tfREFUQV9WRVJTSU9OIDEKKworc3RydWN0IGRsbV9sb2NrX2RhdGEgeworCV9fdTE2IHZlcnNpb247CisJX191MzIgbG9ja3NwYWNlX2lkOworCWludCBub2RlaWQ7CisJaW50IG93bnBpZDsKKwlfX3UzMiBpZDsKKwlfX3UzMiByZW1pZDsKKwlfX3U2NCB4aWQ7CisJX19zOCBzdGF0dXM7CisJX19zOCBncm1vZGU7CisJX19zOCBycW1vZGU7CisJdW5zaWduZWQgbG9uZyB0aW1lc3RhbXA7CisJaW50IHJlc291cmNlX25hbWVsZW47CisJY2hhciByZXNvdXJjZV9uYW1lW0RMTV9SRVNOQU1FX01BWExFTl07Cit9OworCitlbnVtIHsKKwlETE1fQ01EX1VOU1BFQyA9IDAsCisJRExNX0NNRF9IRUxMTywJCS8qIHVzZXItPmtlcm5lbCAqLworCURMTV9DTURfVElNRU9VVCwJLyoga2VybmVsLT51c2VyICovCisJX19ETE1fQ01EX01BWCwKK307CisKKyNkZWZpbmUgRExNX0NNRF9NQVggKF9fRExNX0NNRF9NQVggLSAxKQorCitlbnVtIHsKKwlETE1fVFlQRV9VTlNQRUMgPSAwLAorCURMTV9UWVBFX0xPQ0ssCisJX19ETE1fVFlQRV9NQVgsCit9OworCisjZGVmaW5lIERMTV9UWVBFX01BWCAoX19ETE1fVFlQRV9NQVggLSAxKQorCisjZGVmaW5lIERMTV9HRU5MX1ZFUlNJT04gMHgxCisjZGVmaW5lIERMTV9HRU5MX05BTUUgIkRMTSIKKworI2VuZGlmIC8qIF9ETE1fTkVUTElOS19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RsbV9wbG9jay5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbG1fcGxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzViNDUzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbG1fcGxvY2suaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICovCisKKyNpZm5kZWYgX19ETE1fUExPQ0tfRE9UX0hfXworI2RlZmluZSBfX0RMTV9QTE9DS19ET1RfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIERMTV9QTE9DS19NSVNDX05BTUUJCSJkbG1fcGxvY2siCisKKyNkZWZpbmUgRExNX1BMT0NLX1ZFUlNJT05fTUFKT1IJMQorI2RlZmluZSBETE1fUExPQ0tfVkVSU0lPTl9NSU5PUgkyCisjZGVmaW5lIERMTV9QTE9DS19WRVJTSU9OX1BBVENICTAKKworZW51bSB7CisJRExNX1BMT0NLX09QX0xPQ0sgPSAxLAorCURMTV9QTE9DS19PUF9VTkxPQ0ssCisJRExNX1BMT0NLX09QX0dFVCwKK307CisKKyNkZWZpbmUgRExNX1BMT0NLX0ZMX0NMT1NFIDEKKworc3RydWN0IGRsbV9wbG9ja19pbmZvIHsKKwlfX3UzMiB2ZXJzaW9uWzNdOworCV9fdTggb3B0eXBlOworCV9fdTggZXg7CisJX191OCB3YWl0OworCV9fdTggZmxhZ3M7CisJX191MzIgcGlkOworCV9fczMyIG5vZGVpZDsKKwlfX3MzMiBydjsKKwlfX3UzMiBmc2lkOworCV9fdTY0IG51bWJlcjsKKwlfX3U2NCBzdGFydDsKKwlfX3U2NCBlbmQ7CisJX191NjQgb3duZXI7Cit9OworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RsbWNvbnN0YW50cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbG1jb25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2JmMDhkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbG1jb25zdGFudHMuaApAQCAtMCwwICsxLDE2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBDb3B5cmlnaHQgKEMpIFNpc3RpbmEgU29mdHdhcmUsIEluYy4gIDE5OTctMjAwMyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKioKKyoqICBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyoqICBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworKiogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fRExNQ09OU1RBTlRTX0RPVF9IX18KKyNkZWZpbmUgX19ETE1DT05TVEFOVFNfRE9UX0hfXworCisvKgorICogQ29uc3RhbnRzIHVzZWQgYnkgRExNIGludGVyZmFjZS4KKyAqLworCisjZGVmaW5lIERMTV9MT0NLU1BBQ0VfTEVOICAgICAgIDY0CisjZGVmaW5lIERMTV9SRVNOQU1FX01BWExFTiAgICAgIDY0CisKKworLyoKKyAqIExvY2sgTW9kZXMKKyAqLworCisjZGVmaW5lIERMTV9MT0NLX0lWCQkoLTEpCS8qIGludmFsaWQgKi8KKyNkZWZpbmUgRExNX0xPQ0tfTkwJCTAJLyogbnVsbCAqLworI2RlZmluZSBETE1fTE9DS19DUgkJMQkvKiBjb25jdXJyZW50IHJlYWQgKi8KKyNkZWZpbmUgRExNX0xPQ0tfQ1cJCTIJLyogY29uY3VycmVudCB3cml0ZSAqLworI2RlZmluZSBETE1fTE9DS19QUgkJMwkvKiBwcm90ZWN0ZWQgcmVhZCAqLworI2RlZmluZSBETE1fTE9DS19QVwkJNAkvKiBwcm90ZWN0ZWQgd3JpdGUgKi8KKyNkZWZpbmUgRExNX0xPQ0tfRVgJCTUJLyogZXhjbHVzaXZlICovCisKKworLyoKKyAqIEZsYWdzIHRvIGRsbV9sb2NrCisgKgorICogRExNX0xLRl9OT1FVRVVFCisgKgorICogRG8gbm90IHF1ZXVlIHRoZSBsb2NrIHJlcXVlc3Qgb24gdGhlIHdhaXQgcXVldWUgaWYgaXQgY2Fubm90IGJlIGdyYW50ZWQKKyAqIGltbWVkaWF0ZWx5LiAgSWYgdGhlIGxvY2sgY2Fubm90IGJlIGdyYW50ZWQgYmVjYXVzZSBvZiB0aGlzIGZsYWcsIERMTSB3aWxsCisgKiBlaXRoZXIgcmV0dXJuIC1FQUdBSU4gZnJvbSB0aGUgZGxtX2xvY2sgY2FsbCBvciB3aWxsIHJldHVybiAwIGZyb20KKyAqIGRsbV9sb2NrIGFuZCAtRUFHQUlOIGluIHRoZSBsb2NrIHN0YXR1cyBibG9jayB3aGVuIHRoZSBBU1QgaXMgZXhlY3V0ZWQuCisgKgorICogRExNX0xLRl9DQU5DRUwKKyAqCisgKiBVc2VkIHRvIGNhbmNlbCBhIHBlbmRpbmcgbG9jayByZXF1ZXN0IG9yIGNvbnZlcnNpb24uICBBIGNvbnZlcnRpbmcgbG9jayBpcworICogcmV0dXJuZWQgdG8gaXRzIHByZXZpb3VzbHkgZ3JhbnRlZCBtb2RlLgorICoKKyAqIERMTV9MS0ZfQ09OVkVSVAorICoKKyAqIEluZGljYXRlcyBhIGxvY2sgY29udmVyc2lvbiByZXF1ZXN0LiAgRm9yIGNvbnZlcnNpb25zIHRoZSBuYW1lIGFuZCBuYW1lbGVuCisgKiBhcmUgaWdub3JlZCBhbmQgdGhlIGxvY2sgSUQgaW4gdGhlIExLU0IgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgbG9jay4KKyAqCisgKiBETE1fTEtGX1ZBTEJMSworICoKKyAqIFJlcXVlc3RzIERMTSB0byByZXR1cm4gdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGxvY2sgdmFsdWUgYmxvY2sgaW4gdGhlCisgKiBsb2NrIHN0YXR1cyBibG9jay4gIFdoZW4gdGhpcyBmbGFnIGlzIHNldCBpbiBhIGxvY2sgY29udmVyc2lvbiBmcm9tIFBXIG9yIEVYCisgKiBtb2RlcywgRExNIGFzc2lnbnMgdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgbG9jayBzdGF0dXMgYmxvY2sgdG8gdGhlIGxvY2sKKyAqIHZhbHVlIGJsb2NrIG9mIHRoZSBsb2NrIHJlc291cmNlLiAgVGhlIExWQiBpcyBhIERMTV9MVkJfTEVOIHNpemUgYXJyYXkKKyAqIGNvbnRhaW5pbmcgYXBwbGljYXRpb24tc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgKgorICogRExNX0xLRl9RVUVDVlQKKyAqCisgKiBGb3JjZSBhIGNvbnZlcnNpb24gcmVxdWVzdCB0byBiZSBxdWV1ZWQsIGV2ZW4gaWYgaXQgaXMgY29tcGF0aWJsZSB3aXRoCisgKiB0aGUgZ3JhbnRlZCBtb2RlcyBvZiBvdGhlciBsb2NrcyBvbiB0aGUgc2FtZSByZXNvdXJjZS4KKyAqCisgKiBETE1fTEtGX0lWVkFMQkxLCisgKgorICogSW52YWxpZGF0ZSB0aGUgbG9jayB2YWx1ZSBibG9jay4KKyAqCisgKiBETE1fTEtGX0NPTlZERUFETEsKKyAqCisgKiBBbGxvd3MgdGhlIGRsbSB0byByZXNvbHZlIGNvbnZlcnNpb24gZGVhZGxvY2tzIGludGVybmFsbHkgYnkgZGVtb3RpbmcgdGhlCisgKiBncmFudGVkIG1vZGUgb2YgYSBjb252ZXJ0aW5nIGxvY2sgdG8gTkwuICBUaGUgRExNX1NCRl9ERU1PVEVEIGZsYWcgaXMKKyAqIHJldHVybmVkIGZvciBhIGNvbnZlcnNpb24gdGhhdCdzIGJlZW4gZWZmZWN0ZWQgYnkgdGhpcy4KKyAqCisgKiBETE1fTEtGX1BFUlNJU1RFTlQKKyAqCisgKiBPbmx5IHJlbGV2YW50IHRvIGxvY2tzIG9yaWdpbmF0aW5nIGluIHVzZXJzcGFjZS4gIEEgcGVyc2lzdGVudCBsb2NrIHdpbGwgbm90CisgKiBiZSByZW1vdmVkIGlmIHRoZSBwcm9jZXNzIGhvbGRpbmcgdGhlIGxvY2sgZXhpdHMuCisgKgorICogRExNX0xLRl9OT0RMQ0tXVAorICoKKyAqIERvIG5vdCBjYW5jZWwgdGhlIGxvY2sgaWYgaXQgZ2V0cyBpbnRvIGNvbnZlcnNpb24gZGVhZGxvY2suCisgKiBFeGNsdWRlIHRoaXMgbG9jayBmcm9tIGJlaW5nIG1vbml0b3JlZCBkdWUgdG8gRExNX0xTRkxfVElNRVdBUk4uCisgKgorICogRExNX0xLRl9OT0RMQ0tCTEsKKyAqCisgKiBuZXQgeWV0IGltcGxlbWVudGVkCisgKgorICogRExNX0xLRl9FWFBFRElURQorICoKKyAqIFVzZWQgb25seSB3aXRoIG5ldyByZXF1ZXN0cyBmb3IgTkwgbW9kZSBsb2Nrcy4gIFRlbGxzIHRoZSBsb2NrIG1hbmFnZXIKKyAqIHRvIGdyYW50IHRoZSBsb2NrLCBpZ25vcmluZyBvdGhlciBsb2NrcyBpbiBjb252ZXJ0IGFuZCB3YWl0IHF1ZXVlcy4KKyAqCisgKiBETE1fTEtGX05PUVVFVUVCQVNUCisgKgorICogU2VuZCBibG9ja2luZyBBU1QncyBiZWZvcmUgcmV0dXJuaW5nIC1FQUdBSU4gdG8gdGhlIGNhbGxlci4gIEl0IGlzIG9ubHkKKyAqIHVzZWQgYWxvbmcgd2l0aCB0aGUgTk9RVUVVRSBmbGFnLiAgQmxvY2tpbmcgQVNUJ3MgYXJlIG5vdCBzZW50IGZvciBmYWlsZWQKKyAqIE5PUVVFVUUgcmVxdWVzdHMgb3RoZXJ3aXNlLgorICoKKyAqIERMTV9MS0ZfSEVBRFFVRQorICoKKyAqIEFkZCBhIGxvY2sgdG8gdGhlIGhlYWQgb2YgdGhlIGNvbnZlcnQgb3Igd2FpdCBxdWV1ZSByYXRoZXIgdGhhbiB0aGUgdGFpbC4KKyAqCisgKiBETE1fTEtGX05PT1JERVIKKyAqCisgKiBEaXNyZWdhcmQgdGhlIHN0YW5kYXJkIGdyYW50IG9yZGVyIHJ1bGVzIGFuZCBncmFudCBhIGxvY2sgYXMgc29vbiBhcyBpdAorICogaXMgY29tcGF0aWJsZSB3aXRoIG90aGVyIGdyYW50ZWQgbG9ja3MuCisgKgorICogRExNX0xLRl9PUlBIQU4KKyAqCisgKiBub3QgeWV0IGltcGxlbWVudGVkCisgKgorICogRExNX0xLRl9BTFRQUgorICoKKyAqIElmIHRoZSByZXF1ZXN0ZWQgbW9kZSBjYW5ub3QgYmUgZ3JhbnRlZCBpbW1lZGlhdGVseSwgdHJ5IHRvIGdyYW50IHRoZSBsb2NrCisgKiBpbiBQUiBtb2RlIGluc3RlYWQuICBJZiB0aGlzIGFsdGVybmF0ZSBtb2RlIGlzIGdyYW50ZWQgaW5zdGVhZCBvZiB0aGUKKyAqIHJlcXVlc3RlZCBtb2RlLCBETE1fU0JGX0FMVE1PREUgaXMgcmV0dXJuZWQgaW4gdGhlIGxrc2IuCisgKgorICogRExNX0xLRl9BTFRDVworICoKKyAqIFRoZSBzYW1lIGFzIEFMVFBSLCBidXQgdGhlIGFsdGVybmF0ZSBtb2RlIGlzIENXLgorICoKKyAqIERMTV9MS0ZfRk9SQ0VVTkxPQ0sKKyAqCisgKiBVbmxvY2sgdGhlIGxvY2sgZXZlbiBpZiBpdCBpcyBjb252ZXJ0aW5nIG9yIHdhaXRpbmcgb3IgaGFzIHN1YmxvY2tzLgorICogT25seSByZWFsbHkgZm9yIHVzZSBieSB0aGUgdXNlcmxhbmQgZGV2aWNlLmMgY29kZS4KKyAqCisgKi8KKworI2RlZmluZSBETE1fTEtGX05PUVVFVUUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRExNX0xLRl9DQU5DRUwJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRExNX0xLRl9DT05WRVJUCQkweDAwMDAwMDA0CisjZGVmaW5lIERMTV9MS0ZfVkFMQkxLCQkweDAwMDAwMDA4CisjZGVmaW5lIERMTV9MS0ZfUVVFQ1ZUCQkweDAwMDAwMDEwCisjZGVmaW5lIERMTV9MS0ZfSVZWQUxCTEsJMHgwMDAwMDAyMAorI2RlZmluZSBETE1fTEtGX0NPTlZERUFETEsJMHgwMDAwMDA0MAorI2RlZmluZSBETE1fTEtGX1BFUlNJU1RFTlQJMHgwMDAwMDA4MAorI2RlZmluZSBETE1fTEtGX05PRExDS1dUCTB4MDAwMDAxMDAKKyNkZWZpbmUgRExNX0xLRl9OT0RMQ0tCTEsJMHgwMDAwMDIwMAorI2RlZmluZSBETE1fTEtGX0VYUEVESVRFCTB4MDAwMDA0MDAKKyNkZWZpbmUgRExNX0xLRl9OT1FVRVVFQkFTVAkweDAwMDAwODAwCisjZGVmaW5lIERMTV9MS0ZfSEVBRFFVRQkJMHgwMDAwMTAwMAorI2RlZmluZSBETE1fTEtGX05PT1JERVIJCTB4MDAwMDIwMDAKKyNkZWZpbmUgRExNX0xLRl9PUlBIQU4JCTB4MDAwMDQwMDAKKyNkZWZpbmUgRExNX0xLRl9BTFRQUgkJMHgwMDAwODAwMAorI2RlZmluZSBETE1fTEtGX0FMVENXCQkweDAwMDEwMDAwCisjZGVmaW5lIERMTV9MS0ZfRk9SQ0VVTkxPQ0sJMHgwMDAyMDAwMAorI2RlZmluZSBETE1fTEtGX1RJTUVPVVQJCTB4MDAwNDAwMDAKKworLyoKKyAqIFNvbWUgcmV0dXJuIGNvZGVzIHRoYXQgYXJlIG5vdCBpbiBlcnJuby5oCisgKi8KKworI2RlZmluZSBETE1fRUNBTkNFTAkJMHgxMDAwMQorI2RlZmluZSBETE1fRVVOTE9DSwkJMHgxMDAwMgorCisjZW5kaWYgIC8qIF9fRExNQ09OU1RBTlRTX0RPVF9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWZkNTU3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbS1pb2N0bC5oCkBAIC0wLDAgKzEsMzM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwMyBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgTEdQTC4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9ETV9JT0NUTF9WNF9ICisjZGVmaW5lIF9MSU5VWF9ETV9JT0NUTF9WNF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIERNX0RJUiAibWFwcGVyIgkJLyogU2xhc2hlcyBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIERNX0NPTlRST0xfTk9ERSAiY29udHJvbCIKKyNkZWZpbmUgRE1fTUFYX1RZUEVfTkFNRSAxNgorI2RlZmluZSBETV9OQU1FX0xFTiAxMjgKKyNkZWZpbmUgRE1fVVVJRF9MRU4gMTI5CisKKy8qCisgKiBBIHRyYWRpdGlvbmFsIGlvY3RsIGludGVyZmFjZSBmb3IgdGhlIGRldmljZSBtYXBwZXIuCisgKgorICogRWFjaCBkZXZpY2UgY2FuIGhhdmUgdHdvIHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggaXQsIGFuCisgKiAnYWN0aXZlJyB0YWJsZSB3aGljaCBpcyB0aGUgb25lIGN1cnJlbnRseSB1c2VkIGJ5IGlvIHBhc3NpbmcKKyAqIHRocm91Z2ggdGhlIGRldmljZSwgYW5kIGFuICdpbmFjdGl2ZScgb25lIHdoaWNoIGlzIGEgdGFibGUKKyAqIHRoYXQgaXMgYmVpbmcgcHJlcGFyZWQgYXMgYSByZXBsYWNlbWVudCBmb3IgdGhlICdhY3RpdmUnIG9uZS4KKyAqCisgKiBETV9WRVJTSU9OOgorICogSnVzdCBnZXQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBpb2N0bCBpbnRlcmZhY2UuCisgKgorICogRE1fUkVNT1ZFX0FMTDoKKyAqIFJlbW92ZSBhbGwgZG0gZGV2aWNlcywgZGVzdHJveSBhbGwgdGFibGVzLiAgT25seSByZWFsbHkgdXNlZAorICogZm9yIGRlYnVnLgorICoKKyAqIERNX0xJU1RfREVWSUNFUzoKKyAqIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBkbSBkZXZpY2UgbmFtZXMuCisgKgorICogRE1fREVWX0NSRUFURToKKyAqIENyZWF0ZSBhIG5ldyBkZXZpY2UsIG5laXRoZXIgdGhlICdhY3RpdmUnIG9yICdpbmFjdGl2ZScgdGFibGUKKyAqIHNsb3RzIHdpbGwgYmUgZmlsbGVkLiAgVGhlIGRldmljZSB3aWxsIGJlIGluIHN1c3BlbmRlZCBzdGF0ZQorICogYWZ0ZXIgY3JlYXRpb24sIGhvd2V2ZXIgYW55IGlvIHRvIHRoZSBkZXZpY2Ugd2lsbCBnZXQgZXJyb3JlZAorICogc2luY2UgaXQgd2lsbCBiZSBvdXQtb2YtYm91bmRzLgorICoKKyAqIERNX0RFVl9SRU1PVkU6CisgKiBSZW1vdmUgYSBkZXZpY2UsIGRlc3Ryb3kgYW55IHRhYmxlcy4KKyAqCisgKiBETV9ERVZfUkVOQU1FOgorICogUmVuYW1lIGEgZGV2aWNlIG9yIHNldCBpdHMgdXVpZCBpZiBub25lIHdhcyBwcmV2aW91c2x5IHN1cHBsaWVkLgorICoKKyAqIERNX1NVU1BFTkQ6CisgKiBUaGlzIHBlcmZvcm1zIGJvdGggc3VzcGVuZCBhbmQgcmVzdW1lLCBkZXBlbmRpbmcgd2hpY2ggZmxhZyBpcworICogcGFzc2VkIGluLgorICogU3VzcGVuZDogVGhpcyBjb21tYW5kIHdpbGwgbm90IHJldHVybiB1bnRpbCBhbGwgcGVuZGluZyBpbyB0bworICogdGhlIGRldmljZSBoYXMgY29tcGxldGVkLiAgRnVydGhlciBpbyB3aWxsIGJlIGRlZmVycmVkIHVudGlsCisgKiB0aGUgZGV2aWNlIGlzIHJlc3VtZWQuCisgKiBSZXN1bWU6IEl0IGlzIG5vIGxvbmdlciBhbiBlcnJvciB0byBpc3N1ZSB0aGlzIGNvbW1hbmQgb24gYW4KKyAqIHVuc3VzcGVuZGVkIGRldmljZS4gIElmIGEgdGFibGUgaXMgcHJlc2VudCBpbiB0aGUgJ2luYWN0aXZlJworICogc2xvdCwgaXQgd2lsbCBiZSBtb3ZlZCB0byB0aGUgYWN0aXZlIHNsb3QsIHRoZW4gdGhlIG9sZCB0YWJsZQorICogZnJvbSB0aGUgYWN0aXZlIHNsb3Qgd2lsbCBiZSBfZGVzdHJveWVkXy4gIEZpbmFsbHkgdGhlIGRldmljZQorICogaXMgcmVzdW1lZC4KKyAqCisgKiBETV9ERVZfU1RBVFVTOgorICogUmV0cmlldmVzIHRoZSBzdGF0dXMgZm9yIHRoZSB0YWJsZSBpbiB0aGUgJ2FjdGl2ZScgc2xvdC4KKyAqCisgKiBETV9ERVZfV0FJVDoKKyAqIFdhaXQgZm9yIGEgc2lnbmlmaWNhbnQgZXZlbnQgdG8gb2NjdXIgdG8gdGhlIGRldmljZS4gIFRoaXMKKyAqIGNvdWxkIGVpdGhlciBiZSBjYXVzZWQgYnkgYW4gZXZlbnQgdHJpZ2dlcmVkIGJ5IG9uZSBvZiB0aGUKKyAqIHRhcmdldHMgb2YgdGhlIHRhYmxlIGluIHRoZSAnYWN0aXZlJyBzbG90LCBvciBhIHRhYmxlIGNoYW5nZS4KKyAqCisgKiBETV9UQUJMRV9MT0FEOgorICogTG9hZCBhIHRhYmxlIGludG8gdGhlICdpbmFjdGl2ZScgc2xvdCBmb3IgdGhlIGRldmljZS4gIFRoZQorICogZGV2aWNlIGRvZXMgX25vdF8gbmVlZCB0byBiZSBzdXNwZW5kZWQgcHJpb3IgdG8gdGhpcyBjb21tYW5kLgorICoKKyAqIERNX1RBQkxFX0NMRUFSOgorICogRGVzdHJveSBhbnkgdGFibGUgaW4gdGhlICdpbmFjdGl2ZScgc2xvdCAoaWUuIGFib3J0KS4KKyAqCisgKiBETV9UQUJMRV9ERVBTOgorICogUmV0dXJuIGEgc2V0IG9mIGRldmljZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSAnYWN0aXZlJyB0YWJsZS4KKyAqCisgKiBETV9UQUJMRV9TVEFUVVM6CisgKiBSZXR1cm4gdGhlIHRhcmdldHMgc3RhdHVzIGZvciB0aGUgJ2FjdGl2ZScgdGFibGUuCisgKgorICogRE1fVEFSR0VUX01TRzoKKyAqIFBhc3MgYSBtZXNzYWdlIHN0cmluZyB0byB0aGUgdGFyZ2V0IGF0IGEgc3BlY2lmaWMgb2Zmc2V0IG9mIGEgZGV2aWNlLgorICoKKyAqIERNX0RFVl9TRVRfR0VPTUVUUlk6CisgKiBTZXQgdGhlIGdlb21ldHJ5IG9mIGEgZGV2aWNlIGJ5IHBhc3NpbmcgaW4gYSBzdHJpbmcgaW4gdGhpcyBmb3JtYXQ6CisgKgorICogImN5bGluZGVycyBoZWFkcyBzZWN0b3JzX3Blcl90cmFjayBzdGFydF9zZWN0b3IiCisgKgorICogQmV3YXJlIHRoYXQgQ0hTIGdlb21ldHJ5IGlzIG5lYXJseSBvYnNvbGV0ZSBhbmQgb25seSBwcm92aWRlZAorICogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBkbSBkZXZpY2VzIHRoYXQgY2FuIGJlIGJvb3RlZCBieSBhIFBDCisgKiBCSU9TLiAgU2VlIHN0cnVjdCBoZF9nZW9tZXRyeSBmb3IgcmFuZ2UgbGltaXRzLiAgQWxzbyBub3RlIHRoYXQKKyAqIHRoZSBnZW9tZXRyeSBpcyBlcmFzZWQgaWYgdGhlIGRldmljZSBzaXplIGNoYW5nZXMuCisgKi8KKworLyoKKyAqIEFsbCBpb2N0bCBhcmd1bWVudHMgY29uc2lzdCBvZiBhIHNpbmdsZSBjaHVuayBvZiBtZW1vcnksIHdpdGgKKyAqIHRoaXMgc3RydWN0dXJlIGF0IHRoZSBzdGFydC4gIElmIGEgdXVpZCBpcyBzcGVjaWZpZWQgYW55CisgKiBsb29rdXAgKGVnLiBmb3IgYSBETV9JTkZPKSB3aWxsIGJlIGRvbmUgb24gdGhhdCwgKm5vdCogdGhlCisgKiBuYW1lLgorICovCitzdHJ1Y3QgZG1faW9jdGwgeworCS8qCisJICogVGhlIHZlcnNpb24gbnVtYmVyIGlzIG1hZGUgdXAgb2YgdGhyZWUgcGFydHM6CisJICogbWFqb3IgLSBubyBiYWNrd2FyZCBvciBmb3J3YXJkIGNvbXBhdGliaWxpdHksCisJICogbWlub3IgLSBvbmx5IGJhY2t3YXJkcyBjb21wYXRpYmxlLAorCSAqIHBhdGNoIC0gYm90aCBiYWNrd2FyZHMgYW5kIGZvcndhcmRzIGNvbXBhdGlibGUuCisJICoKKwkgKiBBbGwgY2xpZW50cyBvZiB0aGUgaW9jdGwgaW50ZXJmYWNlIHNob3VsZCBmaWxsIGluIHRoZQorCSAqIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCB0aGV5IHdlcmUKKwkgKiBjb21waWxlZCB3aXRoLgorCSAqCisJICogQWxsIHJlY29nbmlzZWQgaW9jdGwgY29tbWFuZHMgKGllLiB0aG9zZSB0aGF0IGRvbid0CisJICogcmV0dXJuIC1FTk9UVFkpIGZpbGwgb3V0IHRoaXMgZmllbGQsIGV2ZW4gaWYgdGhlCisJICogY29tbWFuZCBmYWlsZWQuCisJICovCisJX191MzIgdmVyc2lvblszXTsJLyogaW4vb3V0ICovCisJX191MzIgZGF0YV9zaXplOwkvKiB0b3RhbCBzaXplIG9mIGRhdGEgcGFzc2VkIGluCisJCQkJICogaW5jbHVkaW5nIHRoaXMgc3RydWN0ICovCisKKwlfX3UzMiBkYXRhX3N0YXJ0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgZGF0YQorCQkJCSAqIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHRoaXMgc3RydWN0ICovCisKKwlfX3UzMiB0YXJnZXRfY291bnQ7CS8qIGluL291dCAqLworCV9fczMyIG9wZW5fY291bnQ7CS8qIG91dCAqLworCV9fdTMyIGZsYWdzOwkJLyogaW4vb3V0ICovCisKKwkvKgorCSAqIGV2ZW50X25yIGhvbGRzIGVpdGhlciB0aGUgZXZlbnQgbnVtYmVyIChpbnB1dCBhbmQgb3V0cHV0KSBvciB0aGUKKwkgKiB1ZGV2IGNvb2tpZSB2YWx1ZSAoaW5wdXQgb25seSkuCisJICogVGhlIERNX0RFVl9XQUlUIGlvY3RsIHRha2VzIGFuIGV2ZW50IG51bWJlciBhcyBpbnB1dC4KKwkgKiBUaGUgRE1fU1VTUEVORCwgRE1fREVWX1JFTU9WRSBhbmQgRE1fREVWX1JFTkFNRSBpb2N0bHMKKwkgKiB1c2UgdGhlIGZpZWxkIGFzIGEgY29va2llIHRvIHJldHVybiBpbiB0aGUgRE1fQ09PS0lFCisJICogdmFyaWFibGUgd2l0aCB0aGUgdWV2ZW50cyB0aGV5IGlzc3VlLgorCSAqIEZvciBvdXRwdXQsIHRoZSBpb2N0bHMgcmV0dXJuIHRoZSBldmVudCBudW1iZXIsIG5vdCB0aGUgY29va2llLgorCSAqLworCV9fdTMyIGV2ZW50X25yOyAgICAgIAkvKiBpbi9vdXQgKi8KKwlfX3UzMiBwYWRkaW5nOworCisJX191NjQgZGV2OwkJLyogaW4vb3V0ICovCisKKwljaGFyIG5hbWVbRE1fTkFNRV9MRU5dOwkvKiBkZXZpY2UgbmFtZSAqLworCWNoYXIgdXVpZFtETV9VVUlEX0xFTl07CS8qIHVuaXF1ZSBpZGVudGlmaWVyIGZvcgorCQkJCSAqIHRoZSBibG9jayBkZXZpY2UgKi8KKwljaGFyIGRhdGFbN107CQkvKiBwYWRkaW5nIG9yIGRhdGEgKi8KK307CisKKy8qCisgKiBVc2VkIHRvIHNwZWNpZnkgdGFibGVzLiAgVGhlc2Ugc3RydWN0dXJlcyBhcHBlYXIgYWZ0ZXIgdGhlCisgKiBkbV9pb2N0bC4KKyAqLworc3RydWN0IGRtX3RhcmdldF9zcGVjIHsKKwlfX3U2NCBzZWN0b3Jfc3RhcnQ7CisJX191NjQgbGVuZ3RoOworCV9fczMyIHN0YXR1czsJCS8qIHVzZWQgd2hlbiByZWFkaW5nIGZyb20ga2VybmVsIG9ubHkgKi8KKworCS8qCisJICogTG9jYXRpb24gb2YgdGhlIG5leHQgZG1fdGFyZ2V0X3NwZWMuCisJICogLSBXaGVuIHNwZWNpZnlpbmcgdGFyZ2V0cyBvbiBhIERNX1RBQkxFX0xPQUQgY29tbWFuZCwgdGhpcyB2YWx1ZSBpcworCSAqICAgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgImN1cnJlbnQiIGRtX3RhcmdldF9zcGVjCisJICogICB0byB0aGUgc3RhcnQgb2YgdGhlICJuZXh0IiBkbV90YXJnZXRfc3BlYy4KKwkgKiAtIFdoZW4gcmV0cmlldmluZyB0YXJnZXRzIG9uIGEgRE1fVEFCTEVfU1RBVFVTIGNvbW1hbmQsIHRoaXMgdmFsdWUKKwkgKiAgIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IGRtX3RhcmdldF9zcGVjCisJICogICAodGhhdCBmb2xsb3dzIHRoZSBkbV9pb2N0bCBzdHJ1Y3QpIHRvIHRoZSBzdGFydCBvZiB0aGUgIm5leHQiCisJICogICBkbV90YXJnZXRfc3BlYy4KKwkgKi8KKwlfX3UzMiBuZXh0OworCisJY2hhciB0YXJnZXRfdHlwZVtETV9NQVhfVFlQRV9OQU1FXTsKKworCS8qCisJICogUGFyYW1ldGVyIHN0cmluZyBzdGFydHMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBvYmplY3QuCisJICogQmUgY2FyZWZ1bCB0byBhZGQgcGFkZGluZyBhZnRlciBzdHJpbmcgdG8gZW5zdXJlIGNvcnJlY3QKKwkgKiBhbGlnbm1lbnQgb2Ygc3Vic2VxdWVudCBkbV90YXJnZXRfc3BlYy4KKwkgKi8KK307CisKKy8qCisgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSB0YXJnZXQgZGVwZW5kZW5jaWVzLgorICovCitzdHJ1Y3QgZG1fdGFyZ2V0X2RlcHMgeworCV9fdTMyIGNvdW50OwkvKiBBcnJheSBzaXplICovCisJX191MzIgcGFkZGluZzsJLyogdW51c2VkICovCisJX191NjQgZGV2WzBdOwkvKiBvdXQgKi8KK307CisKKy8qCisgKiBVc2VkIHRvIGdldCBhIGxpc3Qgb2YgYWxsIGRtIGRldmljZXMuCisgKi8KK3N0cnVjdCBkbV9uYW1lX2xpc3QgeworCV9fdTY0IGRldjsKKwlfX3UzMiBuZXh0OwkJLyogb2Zmc2V0IHRvIHRoZSBuZXh0IHJlY29yZCBmcm9tCisJCQkJICAgdGhlIF9zdGFydF8gb2YgdGhpcyAqLworCWNoYXIgbmFtZVswXTsKK307CisKKy8qCisgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSB0YXJnZXQgdmVyc2lvbnMKKyAqLworc3RydWN0IGRtX3RhcmdldF92ZXJzaW9ucyB7CisgICAgICAgIF9fdTMyIG5leHQ7CisgICAgICAgIF9fdTMyIHZlcnNpb25bM107CisKKyAgICAgICAgY2hhciBuYW1lWzBdOworfTsKKworLyoKKyAqIFVzZWQgdG8gcGFzcyBtZXNzYWdlIHRvIGEgdGFyZ2V0CisgKi8KK3N0cnVjdCBkbV90YXJnZXRfbXNnIHsKKwlfX3U2NCBzZWN0b3I7CS8qIERldmljZSBzZWN0b3IgKi8KKworCWNoYXIgbWVzc2FnZVswXTsKK307CisKKy8qCisgKiBJZiB5b3UgY2hhbmdlIHRoaXMgbWFrZSBzdXJlIHlvdSBtYWtlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5nZQorICogdG8gZG0taW9jdGwuYzpsb29rdXBfaW9jdGwoKQorICovCitlbnVtIHsKKwkvKiBUb3AgbGV2ZWwgY21kcyAqLworCURNX1ZFUlNJT05fQ01EID0gMCwKKwlETV9SRU1PVkVfQUxMX0NNRCwKKwlETV9MSVNUX0RFVklDRVNfQ01ELAorCisJLyogZGV2aWNlIGxldmVsIGNtZHMgKi8KKwlETV9ERVZfQ1JFQVRFX0NNRCwKKwlETV9ERVZfUkVNT1ZFX0NNRCwKKwlETV9ERVZfUkVOQU1FX0NNRCwKKwlETV9ERVZfU1VTUEVORF9DTUQsCisJRE1fREVWX1NUQVRVU19DTUQsCisJRE1fREVWX1dBSVRfQ01ELAorCisJLyogVGFibGUgbGV2ZWwgY21kcyAqLworCURNX1RBQkxFX0xPQURfQ01ELAorCURNX1RBQkxFX0NMRUFSX0NNRCwKKwlETV9UQUJMRV9ERVBTX0NNRCwKKwlETV9UQUJMRV9TVEFUVVNfQ01ELAorCisJLyogQWRkZWQgbGF0ZXIgKi8KKwlETV9MSVNUX1ZFUlNJT05TX0NNRCwKKwlETV9UQVJHRVRfTVNHX0NNRCwKKwlETV9ERVZfU0VUX0dFT01FVFJZX0NNRAorfTsKKworI2RlZmluZSBETV9JT0NUTCAweGZkCisKKyNkZWZpbmUgRE1fVkVSU0lPTiAgICAgICBfSU9XUihETV9JT0NUTCwgRE1fVkVSU0lPTl9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fUkVNT1ZFX0FMTCAgICBfSU9XUihETV9JT0NUTCwgRE1fUkVNT1ZFX0FMTF9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fTElTVF9ERVZJQ0VTICBfSU9XUihETV9JT0NUTCwgRE1fTElTVF9ERVZJQ0VTX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorCisjZGVmaW5lIERNX0RFVl9DUkVBVEUgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9DUkVBVEVfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9SRU1PVkUgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9SRU1PVkVfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9SRU5BTUUgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9SRU5BTUVfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9TVVNQRU5EICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9TVVNQRU5EX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9ERVZfU1RBVFVTICAgIF9JT1dSKERNX0lPQ1RMLCBETV9ERVZfU1RBVFVTX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9ERVZfV0FJVCAgICAgIF9JT1dSKERNX0lPQ1RMLCBETV9ERVZfV0FJVF9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKworI2RlZmluZSBETV9UQUJMRV9MT0FEICAgIF9JT1dSKERNX0lPQ1RMLCBETV9UQUJMRV9MT0FEX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9UQUJMRV9DTEVBUiAgIF9JT1dSKERNX0lPQ1RMLCBETV9UQUJMRV9DTEVBUl9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fVEFCTEVfREVQUyAgICBfSU9XUihETV9JT0NUTCwgRE1fVEFCTEVfREVQU19DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fVEFCTEVfU1RBVFVTICBfSU9XUihETV9JT0NUTCwgRE1fVEFCTEVfU1RBVFVTX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorCisjZGVmaW5lIERNX0xJU1RfVkVSU0lPTlMgX0lPV1IoRE1fSU9DVEwsIERNX0xJU1RfVkVSU0lPTlNfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisKKyNkZWZpbmUgRE1fVEFSR0VUX01TRwkgX0lPV1IoRE1fSU9DVEwsIERNX1RBUkdFVF9NU0dfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9TRVRfR0VPTUVUUlkJX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9TRVRfR0VPTUVUUllfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisKKyNkZWZpbmUgRE1fVkVSU0lPTl9NQUpPUgk0CisjZGVmaW5lIERNX1ZFUlNJT05fTUlOT1IJMjIKKyNkZWZpbmUgRE1fVkVSU0lPTl9QQVRDSExFVkVMCTAKKyNkZWZpbmUgRE1fVkVSU0lPTl9FWFRSQQkiLWlvY3RsICgyMDExLTEwLTE5KSIKKworLyogU3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUgRE1fUkVBRE9OTFlfRkxBRwkoMSA8PCAwKSAvKiBJbi9PdXQgKi8KKyNkZWZpbmUgRE1fU1VTUEVORF9GTEFHCQkoMSA8PCAxKSAvKiBJbi9PdXQgKi8KKyNkZWZpbmUgRE1fUEVSU0lTVEVOVF9ERVZfRkxBRwkoMSA8PCAzKSAvKiBJbiAqLworCisvKgorICogRmxhZyBwYXNzZWQgaW50byBpb2N0bCBTVEFUVVMgY29tbWFuZCB0byBnZXQgdGFibGUgaW5mb3JtYXRpb24KKyAqIHJhdGhlciB0aGFuIGN1cnJlbnQgc3RhdHVzLgorICovCisjZGVmaW5lIERNX1NUQVRVU19UQUJMRV9GTEFHCSgxIDw8IDQpIC8qIEluICovCisKKy8qCisgKiBGbGFncyB0aGF0IGluZGljYXRlIHdoZXRoZXIgYSB0YWJsZSBpcyBwcmVzZW50IGluIGVpdGhlciBvZgorICogdGhlIHR3byB0YWJsZSBzbG90cyB0aGF0IGEgZGV2aWNlIGhhcy4KKyAqLworI2RlZmluZSBETV9BQ1RJVkVfUFJFU0VOVF9GTEFHICAgKDEgPDwgNSkgLyogT3V0ICovCisjZGVmaW5lIERNX0lOQUNUSVZFX1BSRVNFTlRfRkxBRyAoMSA8PCA2KSAvKiBPdXQgKi8KKworLyoKKyAqIEluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgcGFzc2VkIGluIHdhc24ndCBiaWcgZW5vdWdoIGZvciB0aGUKKyAqIHJlc3VsdHMuCisgKi8KKyNkZWZpbmUgRE1fQlVGRkVSX0ZVTExfRkxBRwkoMSA8PCA4KSAvKiBPdXQgKi8KKworLyoKKyAqIFRoaXMgZmxhZyBpcyBub3cgaWdub3JlZC4KKyAqLworI2RlZmluZSBETV9TS0lQX0JER0VUX0ZMQUcJKDEgPDwgOSkgLyogSW4gKi8KKworLyoKKyAqIFNldCB0aGlzIHRvIGF2b2lkIGF0dGVtcHRpbmcgdG8gZnJlZXplIGFueSBmaWxlc3lzdGVtIHdoZW4gc3VzcGVuZGluZy4KKyAqLworI2RlZmluZSBETV9TS0lQX0xPQ0tGU19GTEFHCSgxIDw8IDEwKSAvKiBJbiAqLworCisvKgorICogU2V0IHRoaXMgdG8gc3VzcGVuZCB3aXRob3V0IGZsdXNoaW5nIHF1ZXVlZCBpb3MuCisgKi8KKyNkZWZpbmUgRE1fTk9GTFVTSF9GTEFHCQkoMSA8PCAxMSkgLyogSW4gKi8KKworLyoKKyAqIElmIHNldCwgYW55IHRhYmxlIGluZm9ybWF0aW9uIHJldHVybmVkIHdpbGwgcmVsYXRlIHRvIHRoZSBpbmFjdGl2ZQorICogdGFibGUgaW5zdGVhZCBvZiB0aGUgbGl2ZSBvbmUuICBBbHdheXMgY2hlY2sgRE1fSU5BQ1RJVkVfUFJFU0VOVF9GTEFHCisgKiBpcyBzZXQgYmVmb3JlIHVzaW5nIHRoZSBkYXRhIHJldHVybmVkLgorICovCisjZGVmaW5lIERNX1FVRVJZX0lOQUNUSVZFX1RBQkxFX0ZMQUcJKDEgPDwgMTIpIC8qIEluICovCisKKy8qCisgKiBJZiBzZXQsIGEgdWV2ZW50IHdhcyBnZW5lcmF0ZWQgZm9yIHdoaWNoIHRoZSBjYWxsZXIgbWF5IG5lZWQgdG8gd2FpdC4KKyAqLworI2RlZmluZSBETV9VRVZFTlRfR0VORVJBVEVEX0ZMQUcJKDEgPDwgMTMpIC8qIE91dCAqLworCisvKgorICogSWYgc2V0LCByZW5hbWUgY2hhbmdlcyB0aGUgdXVpZCBub3QgdGhlIG5hbWUuICBPbmx5IHBlcm1pdHRlZAorICogaWYgbm8gdXVpZCB3YXMgcHJldmlvdXNseSBzdXBwbGllZDogYW4gZXhpc3RpbmcgdXVpZCBjYW5ub3QgYmUgY2hhbmdlZC4KKyAqLworI2RlZmluZSBETV9VVUlEX0ZMQUcJCQkoMSA8PCAxNCkgLyogSW4gKi8KKworLyoKKyAqIElmIHNldCwgYWxsIGJ1ZmZlcnMgYXJlIHdpcGVkIGFmdGVyIHVzZS4gVXNlIHdoZW4gc2VuZGluZworICogb3IgcmVxdWVzdGluZyBzZW5zaXRpdmUgZGF0YSBzdWNoIGFzIGFuIGVuY3J5cHRpb24ga2V5LgorICovCisjZGVmaW5lIERNX1NFQ1VSRV9EQVRBX0ZMQUcJCSgxIDw8IDE1KSAvKiBJbiAqLworCisjZW5kaWYJCQkJLyogX0xJTlVYX0RNX0lPQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZG0tbG9nLXVzZXJzcGFjZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbS1sb2ctdXNlcnNwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3OGMyYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZG0tbG9nLXVzZXJzcGFjZS5oCkBAIC0wLDAgKzEsNDE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDkgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgTEdQTC4KKyAqLworCisjaWZuZGVmIF9fRE1fTE9HX1VTRVJTUEFDRV9IX18KKyNkZWZpbmUgX19ETV9MT0dfVVNFUlNQQUNFX0hfXworCisjaW5jbHVkZSA8bGludXgvZG0taW9jdGwuaD4gLyogRm9yIERNX1VVSURfTEVOICovCisKKy8qCisgKiBUaGUgZGV2aWNlLW1hcHBlciB1c2Vyc3BhY2UgbG9nIG1vZHVsZSBjb25zaXN0cyBvZiBhIGtlcm5lbCBjb21wb25lbnQgYW5kCisgKiBhIHVzZXItc3BhY2UgY29tcG9uZW50LiAgVGhlIGtlcm5lbCBjb21wb25lbnQgaW1wbGVtZW50cyB0aGUgQVBJIGRlZmluZWQKKyAqIGluIGRtLWRpcnR5LWxvZy5oLiAgSXRzIHB1cnBvc2UgaXMgc2ltcGx5IHRvIHBhc3MgdGhlIHBhcmFtZXRlcnMgYW5kCisgKiByZXR1cm4gdmFsdWVzIG9mIHRob3NlIEFQSSBmdW5jdGlvbnMgYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXItc3BhY2UuCisgKgorICogQmVsb3cgYXJlIGRlZmluZWQgdGhlICdyZXF1ZXN0X3R5cGVzJyAtIERNX1VMT0dfQ1RSLCBETV9VTE9HX0RUUiwgZXRjLgorICogVGhlc2UgcmVxdWVzdCB0eXBlcyByZXByZXNlbnQgdGhlIGRpZmZlcmVudCBmdW5jdGlvbnMgaW4gdGhlIGRldmljZS1tYXBwZXIKKyAqIGRpcnR5IGxvZyBBUEkuICBFYWNoIG9mIHRoZXNlIGlzIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBiZWxvdy4KKyAqCisgKiBUaGUgdXNlci1zcGFjZSBwcm9ncmFtIG11c3QgbGlzdGVuIGZvciByZXF1ZXN0cyBmcm9tIHRoZSBrZXJuZWwgKHJlcHJlc2VudGluZworICogdGhlIHZhcmlvdXMgQVBJIGZ1bmN0aW9ucykgYW5kIHByb2Nlc3MgdGhlbS4KKyAqCisgKiBVc2VyLXNwYWNlIGJlZ2lucyBieSBzZXR0aW5nIHVwIHRoZSBjb21tdW5pY2F0aW9uIGxpbmsgKGVycm9yIGNoZWNraW5nCisgKiByZW1vdmVkIGZvciBjbGFyaXR5KToKKyAqCWZkID0gc29ja2V0KFBGX05FVExJTkssIFNPQ0tfREdSQU0sIE5FVExJTktfQ09OTkVDVE9SKTsKKyAqCWFkZHIubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKyAqCWFkZHIubmxfZ3JvdXBzID0gQ05fSURYX0RNOworICoJYWRkci5ubF9waWQgPSAwOworICoJciA9IGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisgKglvcHQgPSBhZGRyLm5sX2dyb3VwczsKKyAqCXNldHNvY2tvcHQoZmQsIFNPTF9ORVRMSU5LLCBORVRMSU5LX0FERF9NRU1CRVJTSElQLCAmb3B0LCBzaXplb2Yob3B0KSk7CisgKgorICogVXNlci1zcGFjZSB3aWxsIHRoZW4gd2FpdCB0byByZWNlaXZlIHJlcXVlc3RzIGZvcm0gdGhlIGtlcm5lbCwgd2hpY2ggaXQKKyAqIHdpbGwgcHJvY2VzcyBhcyBkZXNjcmliZWQgYmVsb3cuICBUaGUgcmVxdWVzdHMgYXJlIHJlY2VpdmVkIGluIHRoZSBmb3JtLAorICogKChzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0KSArIChhZGRpdGlvbmFsIGRhdGEpKS4gIERlcGVuZGluZyBvbiB0aGUgcmVxdWVzdAorICogdHlwZSwgdGhlcmUgbWF5IG9yIG1heSBub3QgYmUgJ2FkZGl0aW9uYWwgZGF0YScuICBJbiB0aGUgZGVzY3JpcHRpb25zIGJlbG93LAorICogeW91IHdpbGwgc2VlICdQYXlsb2FkLXRvLXVzZXJzcGFjZScgYW5kICdQYXlsb2FkLXRvLWtlcm5lbCcuICBUaGUKKyAqICdQYXlsb2FkLXRvLXVzZXJzcGFjZScgaXMgd2hhdCB0aGUga2VybmVsIHNlbmRzIGluICdhZGRpdGlvbmFsIGRhdGEnIGFzCisgKiBuZWNlc3NhcnkgcGFyYW1ldGVycyB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdC4gIFRoZSAnUGF5bG9hZC10by1rZXJuZWwnIGlzCisgKiB0aGUgJ2FkZGl0aW9uYWwgZGF0YScgcmV0dXJuZWQgdG8gdGhlIGtlcm5lbCB0aGF0IGNvbnRhaW5zIHRoZSBuZWNlc3NhcnkKKyAqIHJlc3VsdHMgb2YgdGhlIHJlcXVlc3QuICBUaGUgJ2RhdGFfc2l6ZScgZmllbGQgaW4gdGhlIGRtX3Vsb2dfcmVxdWVzdAorICogc3RydWN0dXJlIGRlbm90ZXMgdGhlIGF2YWlsYWJpbGl0eSBhbmQgYW1vdW50IG9mIHBheWxvYWQgZGF0YS4KKyAqLworCisvKgorICogRE1fVUxPR19DVFIgY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIGludCAoKmN0cikoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKKyAqCSAgICAgIHVuc2lnbmVkIGFyZ2MsIGNoYXIgKiphcmd2KTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCUEgc2luZ2xlIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgYXJndiBhcmd1bWVudHMgc2VwYXJhdGVkIGJ5ICcgJ3MKKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJQSBOVUwtdGVybWluYXRlZCBzdHJpbmcgdGhhdCBpcyB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlIHRoYXQgaXMgdXNlZAorICoJYXMgdGhlIGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBsb2cgZGF0YS4gICdkbV9nZXRfZGV2aWNlJyB3aWxsIGJlIGNhbGxlZAorICoJb24gdGhpcyBkZXZpY2UuICAoJ2RtX3B1dF9kZXZpY2UnIHdpbGwgYmUgY2FsbGVkIG9uIHRoaXMgZGV2aWNlCisgKglhdXRvbWF0aWNhbGx5IGFmdGVyIGNhbGxpbmcgRE1fVUxPR19EVFIuKSAgSWYgdGhlcmUgaXMgbm8gZGV2aWNlIG5lZWRlZAorICoJZm9yIGxvZyBkYXRhLCAnZGF0YV9zaXplJyBpbiB0aGUgZG1fdWxvZ19yZXF1ZXN0IHN0cnVjdCBzaG91bGQgYmUgMC4KKyAqCisgKiBUaGUgVVVJRCBjb250YWluZWQgaW4gdGhlIGRtX3Vsb2dfcmVxdWVzdCBzdHJ1Y3R1cmUgaXMgdGhlIHJlZmVyZW5jZSB0aGF0CisgKiB3aWxsIGJlIHVzZWQgYnkgYWxsIHJlcXVlc3QgdHlwZXMgdG8gYSBzcGVjaWZpYyBsb2cuICBUaGUgY29uc3RydWN0b3IgbXVzdAorICogcmVjb3JkIHRoaXMgYXNzb2NpYXRpb24gd2l0aCB0aGUgaW5zdGFuY2UgY3JlYXRlZC4KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCwgZmlsbGluZyB0aGUKKyAqIGRhdGEgZmllbGQgd2l0aCB0aGUgbG9nIGRldmljZSBpZiBuZWNlc3NhcnksIGFuZCBzZXR0aW5nICdkYXRhX3NpemUnCisgKiBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfQ1RSICAgICAgICAgICAgICAgICAgICAxCisKKy8qCisgKiBETV9VTE9HX0RUUiBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogdm9pZCAoKmR0cikoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCUEgc2luZ2xlIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgYXJndiBhcmd1bWVudHMgc2VwYXJhdGVkIGJ5ICcgJ3MKKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJTm9uZS4gICgnZGF0YV9zaXplJyBpbiB0aGUgZG1fdWxvZ19yZXF1ZXN0IHN0cnVjdCBzaG91bGQgYmUgMC4pCisgKgorICogVGhlIFVVSUQgY29udGFpbmVkIGluIHRoZSBkbV91bG9nX3JlcXVlc3Qgc3RydWN0dXJlIGlzIGFsbCB0aGF0IGlzCisgKiBuZWNlc3NhcnkgdG8gaWRlbnRpZnkgdGhlIGxvZyBpbnN0YW5jZSBiZWluZyBkZXN0cm95ZWQuICBUaGVyZSBpcyBubworICogcGF5bG9hZCBkYXRhLgorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFuZCBjbGVhcmluZworICogJ2RhdGFfc2l6ZScgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX0RUUiAgICAgICAgICAgICAgICAgICAgMgorCisvKgorICogRE1fVUxPR19QUkVTVVNQRU5EIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiBpbnQgKCpwcmVzdXNwZW5kKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJTm9uZS4KKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJTm9uZS4KKyAqCisgKiBUaGUgVVVJRCBjb250YWluZWQgaW4gdGhlIGRtX3Vsb2dfcmVxdWVzdCBzdHJ1Y3R1cmUgaXMgYWxsIHRoYXQgaXMKKyAqIG5lY2Vzc2FyeSB0byBpZGVudGlmeSB0aGUgbG9nIGluc3RhbmNlIGJlaW5nIHByZXN1c3BlbmRlZC4gIFRoZXJlIGlzIG5vCisgKiBwYXlsb2FkIGRhdGEuCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYW5kCisgKiAnZGF0YV9zaXplJyBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfUFJFU1VTUEVORCAgICAgICAgICAgICAzCisKKy8qCisgKiBETV9VTE9HX1BPU1RTVVNQRU5EIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiBpbnQgKCpwb3N0c3VzcGVuZCkoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCU5vbmUuCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCU5vbmUuCisgKgorICogVGhlIFVVSUQgY29udGFpbmVkIGluIHRoZSBkbV91bG9nX3JlcXVlc3Qgc3RydWN0dXJlIGlzIGFsbCB0aGF0IGlzCisgKiBuZWNlc3NhcnkgdG8gaWRlbnRpZnkgdGhlIGxvZyBpbnN0YW5jZSBiZWluZyBwb3N0c3VzcGVuZGVkLiAgVGhlcmUgaXMgbm8KKyAqIHBheWxvYWQgZGF0YS4KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhbmQKKyAqICdkYXRhX3NpemUnIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19QT1NUU1VTUEVORCAgICAgICAgICAgIDQKKworLyoKKyAqIERNX1VMT0dfUkVTVU1FIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiBpbnQgKCpyZXN1bWUpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZyk7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKglOb25lLgorICogUGF5bG9hZC10by1rZXJuZWw6CisgKglOb25lLgorICoKKyAqIFRoZSBVVUlEIGNvbnRhaW5lZCBpbiB0aGUgZG1fdWxvZ19yZXF1ZXN0IHN0cnVjdHVyZSBpcyBhbGwgdGhhdCBpcworICogbmVjZXNzYXJ5IHRvIGlkZW50aWZ5IHRoZSBsb2cgaW5zdGFuY2UgYmVpbmcgcmVzdW1lZC4gIFRoZXJlIGlzIG5vCisgKiBwYXlsb2FkIGRhdGEuCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYW5kCisgKiAnZGF0YV9zaXplJyBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfUkVTVU1FICAgICAgICAgICAgICAgICA1CisKKy8qCisgKiBETV9VTE9HX0dFVF9SRUdJT05fU0laRSBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogdWludDMyX3QgKCpnZXRfcmVnaW9uX3NpemUpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZyk7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKglOb25lLgorICogUGF5bG9hZC10by1rZXJuZWw6CisgKgl1aW50NjRfdCAtIGNvbnRhaW5zIHRoZSByZWdpb24gc2l6ZQorICoKKyAqIFRoZSByZWdpb24gc2l6ZSBpcyBzb21ldGhpbmcgdGhhdCB3YXMgZGV0ZXJtaW5lZCBhdCBjb25zdHJ1Y3RvciB0aW1lLgorICogSXQgaXMgcmV0dXJuZWQgaW4gdGhlIHBheWxvYWQgYXJlYSBhbmQgJ2RhdGFfc2l6ZScgaXMgc2V0IHRvCisgKiByZWZsZWN0IHRoaXMuCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX0dFVF9SRUdJT05fU0laRSAgICAgICAgNgorCisvKgorICogRE1fVUxPR19JU19DTEVBTiBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogaW50ICgqaXNfY2xlYW4pKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywgcmVnaW9uX3QgcmVnaW9uKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCXVpbnQ2NF90IC0gdGhlIHJlZ2lvbiB0byBnZXQgY2xlYW4gc3RhdHVzIG9uCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCWludDY0X3QgIC0gMSBpZiBjbGVhbiwgMCBvdGhlcndpc2UKKyAqCisgKiBQYXlsb2FkIGlzIHNpemVvZih1aW50NjRfdCkgYW5kIGNvbnRhaW5zIHRoZSByZWdpb24gZm9yIHdoaWNoIHRoZSBjbGVhbgorICogc3RhdHVzIGlzIGJlaW5nIG1hZGUuCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIGZpbGxpbmcgdGhlIHBheWxvYWQgd2l0aCAwIChub3QgY2xlYW4pIG9yCisgKiAxIChjbGVhbiksIHNldHRpbmcgJ2RhdGFfc2l6ZScgYW5kICdlcnJvcicgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX0lTX0NMRUFOICAgICAgICAgICAgICAgNworCisvKgorICogRE1fVUxPR19JTl9TWU5DIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiBpbnQgKCppbl9zeW5jKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbiwKKyAqCQkgIGludCBjYW5fYmxvY2spOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJdWludDY0X3QgLSB0aGUgcmVnaW9uIHRvIGdldCBzeW5jIHN0YXR1cyBvbgorICogUGF5bG9hZC10by1rZXJuZWw6CisgKglpbnQ2NF90IC0gMSBpZiBpbi1zeW5jLCAwIG90aGVyd2lzZQorICoKKyAqIEV4YWN0bHkgdGhlIHNhbWUgYXMgJ2lzX2NsZWFuJyBhYm92ZSwgZXhjZXB0IHRoaXMgdGltZSBhc2tpbmcgImhhcyB0aGUKKyAqIHJlZ2lvbiBiZWVuIHJlY292ZXJlZD8iIHZzLiAiaXMgdGhlIHJlZ2lvbiBub3QgYmVpbmcgbW9kaWZpZWQ/IgorICovCisjZGVmaW5lIERNX1VMT0dfSU5fU1lOQyAgICAgICAgICAgICAgICA4CisKKy8qCisgKiBETV9VTE9HX0ZMVVNIIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiBpbnQgKCpmbHVzaCkoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCU5vbmUuCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCU5vbmUuCisgKgorICogTm8gaW5jb21pbmcgb3Igb3V0Z29pbmcgcGF5bG9hZC4gIFNpbXBseSBmbHVzaCBsb2cgc3RhdGUgdG8gZGlzay4KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhbmQgY2xlYXJpbmcKKyAqICdkYXRhX3NpemUnIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19GTFVTSCAgICAgICAgICAgICAgICAgIDkKKworLyoKKyAqIERNX1VMT0dfTUFSS19SRUdJT04gY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIHZvaWQgKCptYXJrX3JlZ2lvbikoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24pOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJdWludDY0X3QgW10gLSByZWdpb24ocykgdG8gbWFyaworICogUGF5bG9hZC10by1rZXJuZWw6CisgKglOb25lLgorICoKKyAqIEluY29taW5nIHBheWxvYWQgY29udGFpbnMgdGhlIG9uZSBvciBtb3JlIHJlZ2lvbnMgdG8gbWFyayBkaXJ0eS4KKyAqIFRoZSBudW1iZXIgb2YgcmVnaW9ucyBjb250YWluZWQgaW4gdGhlIHBheWxvYWQgY2FuIGJlIGRldGVybWluZWQgZnJvbQorICogJ2RhdGFfc2l6ZS9zaXplb2YodWludDY0X3QpJy4KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhbmQgY2xlYXJpbmcKKyAqICdkYXRhX3NpemUnIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19NQVJLX1JFR0lPTiAgICAgICAgICAgMTAKKworLyoKKyAqIERNX1VMT0dfQ0xFQVJfUkVHSU9OIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiB2b2lkICgqY2xlYXJfcmVnaW9uKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbik7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKgl1aW50NjRfdCBbXSAtIHJlZ2lvbihzKSB0byBjbGVhcgorICogUGF5bG9hZC10by1rZXJuZWw6CisgKglOb25lLgorICoKKyAqIEluY29taW5nIHBheWxvYWQgY29udGFpbnMgdGhlIG9uZSBvciBtb3JlIHJlZ2lvbnMgdG8gbWFyayBjbGVhbi4KKyAqIFRoZSBudW1iZXIgb2YgcmVnaW9ucyBjb250YWluZWQgaW4gdGhlIHBheWxvYWQgY2FuIGJlIGRldGVybWluZWQgZnJvbQorICogJ2RhdGFfc2l6ZS9zaXplb2YodWludDY0X3QpJy4KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhbmQgY2xlYXJpbmcKKyAqICdkYXRhX3NpemUnIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19DTEVBUl9SRUdJT04gICAgICAgICAgMTEKKworLyoKKyAqIERNX1VMT0dfR0VUX1JFU1lOQ19XT1JLIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiBpbnQgKCpnZXRfcmVzeW5jX3dvcmspKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywgcmVnaW9uX3QgKnJlZ2lvbik7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKglOb25lLgorICogUGF5bG9hZC10by1rZXJuZWw6CisgKgl7CisgKgkJaW50NjRfdCBpOyAtLSAxIGlmIHJlY292ZXJ5IG5lY2Vzc2FyeSwgMCBvdGhlcndpc2UKKyAqCQl1aW50NjRfdCByOyAtLSBUaGUgcmVnaW9uIHRvIHJlY292ZXIgaWYgaT0xCisgKgl9CisgKiAnZGF0YV9zaXplJyBzaG91bGQgYmUgc2V0IGFwcHJvcHJpYXRlbHkuCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX0dFVF9SRVNZTkNfV09SSyAgICAgICAxMgorCisvKgorICogRE1fVUxPR19TRVRfUkVHSU9OX1NZTkMgY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIHZvaWQgKCpzZXRfcmVnaW9uX3N5bmMpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywKKyAqCQkJICAgcmVnaW9uX3QgcmVnaW9uLCBpbnQgaW5fc3luYyk7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKgl7CisgKgkJdWludDY0X3QgLSByZWdpb24gdG8gc2V0IHN5bmMgc3RhdGUgb24KKyAqCQlpbnQ2NF90ICAtIDAgaWYgbm90LWluLXN5bmMsIDEgaWYgaW4tc3luYworICoJfQorICogUGF5bG9hZC10by1rZXJuZWw6CisgKglOb25lLgorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFuZCBjbGVhcmluZworICogJ2RhdGFfc2l6ZScgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX1NFVF9SRUdJT05fU1lOQyAgICAgICAxMworCisvKgorICogRE1fVUxPR19HRVRfU1lOQ19DT1VOVCBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogcmVnaW9uX3QgKCpnZXRfc3luY19jb3VudCkoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCU5vbmUuCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCXVpbnQ2NF90IC0gdGhlIG51bWJlciBvZiBpbi1zeW5jIHJlZ2lvbnMKKyAqCisgKiBObyBpbmNvbWluZyBwYXlsb2FkLiAgS2VybmVsLWJvdW5kIHBheWxvYWQgY29udGFpbnMgdGhlIG51bWJlciBvZgorICogcmVnaW9ucyB0aGF0IGFyZSBpbi1zeW5jIChpbiBhIHNpemVfdCkuCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYW5kCisgKiAnZGF0YV9zaXplJyBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfR0VUX1NZTkNfQ09VTlQgICAgICAgIDE0CisKKy8qCisgKiBETV9VTE9HX1NUQVRVU19JTkZPIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiBpbnQgKCpzdGF0dXMpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywgU1RBVFVTVFlQRV9JTkZPLAorICoJCSBjaGFyICpyZXN1bHQsIHVuc2lnbmVkIG1heGxlbik7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKglOb25lLgorICogUGF5bG9hZC10by1rZXJuZWw6CisgKglDaGFyYWN0ZXIgc3RyaW5nIGNvbnRhaW5pbmcgU1RBVFVTVFlQRV9JTkZPCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYW5kCisgKiAnZGF0YV9zaXplJyBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfU1RBVFVTX0lORk8gICAgICAgICAgIDE1CisKKy8qCisgKiBETV9VTE9HX1NUQVRVU19UQUJMRSBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogaW50ICgqc3RhdHVzKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIFNUQVRVU1RZUEVfVEFCTEUsCisgKgkJIGNoYXIgKnJlc3VsdCwgdW5zaWduZWQgbWF4bGVuKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCU5vbmUuCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCUNoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyBTVEFUVVNUWVBFX1RBQkxFCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYW5kCisgKiAnZGF0YV9zaXplJyBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfU1RBVFVTX1RBQkxFICAgICAgICAgIDE2CisKKy8qCisgKiBETV9VTE9HX0lTX1JFTU9URV9SRUNPVkVSSU5HIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiBpbnQgKCppc19yZW1vdGVfcmVjb3ZlcmluZykoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24pOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJdWludDY0X3QgLSByZWdpb24gdG8gZGV0ZXJtaW5lIHJlY292ZXJ5IHN0YXR1cyBvbgorICogUGF5bG9hZC10by1rZXJuZWw6CisgKgl7CisgKgkJaW50NjRfdCBpc19yZWNvdmVyaW5nOyAgLS0gMCBpZiBubywgMSBpZiB5ZXMKKyAqCQl1aW50NjRfdCBpbl9zeW5jX2hpbnQ7ICAtLSBsb3dlc3QgcmVnaW9uIHN0aWxsIG5lZWRpbmcgcmVzeW5jCisgKgl9CisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYW5kCisgKiAnZGF0YV9zaXplJyBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfSVNfUkVNT1RFX1JFQ09WRVJJTkcgIDE3CisKKy8qCisgKiAoRE1fVUxPR19SRVFVRVNUX01BU0sgJiByZXF1ZXN0X3R5cGUpIHRvIGdldCB0aGUgcmVxdWVzdCB0eXBlCisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKglBIHNpbmdsZSBzdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIGFyZ3YgYXJndW1lbnRzIHNlcGFyYXRlZCBieSAnICdzCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCU5vbmUuICAoJ2RhdGFfc2l6ZScgaW4gdGhlIGRtX3Vsb2dfcmVxdWVzdCBzdHJ1Y3Qgc2hvdWxkIGJlIDAuKQorICoKKyAqIFdlIGFyZSByZXNlcnZpbmcgOCBiaXRzIG9mIHRoZSAzMi1iaXQgJ3JlcXVlc3RfdHlwZScgZmllbGQgZm9yIHRoZQorICogdmFyaW91cyByZXF1ZXN0IHR5cGVzIGFib3ZlLiAgVGhlIHJlbWFpbmluZyAyNC1iaXRzIGFyZSBjdXJyZW50bHkKKyAqIHNldCB0byB6ZXJvIGFuZCBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGNvbXBhdGliaWxpdHkgY29uY2VybnMuCisgKgorICogVXNlci1zcGFjZSBzaG91bGQgYWx3YXlzIHVzZSBETV9VTE9HX1JFUVVFU1RfVFlQRSB0byBhY3F1aXJlIHRoZQorICogcmVxdWVzdCB0eXBlIGZyb20gdGhlICdyZXF1ZXN0X3R5cGUnIGZpZWxkIHRvIG1haW50YWluIGZvcndhcmQgY29tcGF0aWJpbGl0eS4KKyAqLworI2RlZmluZSBETV9VTE9HX1JFUVVFU1RfTUFTSyAweEZGCisjZGVmaW5lIERNX1VMT0dfUkVRVUVTVF9UWVBFKHJlcXVlc3RfdHlwZSkgXAorCShETV9VTE9HX1JFUVVFU1RfTUFTSyAmIChyZXF1ZXN0X3R5cGUpKQorCisvKgorICogRE1fVUxPR19SRVFVRVNUX1ZFUlNJT04gaXMgaW5jcmVtZW50ZWQgd2hlbiB0aGVyZSBpcyBhCisgKiBjaGFuZ2UgdG8gdGhlIHdheSBpbmZvcm1hdGlvbiBpcyBwYXNzZWQgYmV0d2VlbiBrZXJuZWwKKyAqIGFuZCB1c2Vyc3BhY2UuICBUaGlzIGNvdWxkIGJlIGEgc3RydWN0dXJlIGNoYW5nZSBvZgorICogZG1fdWxvZ19yZXF1ZXN0IG9yIGEgY2hhbmdlIGluIHRoZSB3YXkgcmVxdWVzdHMgYXJlCisgKiBpc3N1ZWQvaGFuZGxlZC4gIENoYW5nZXMgYXJlIG91dGxpbmVkIGhlcmU6CisgKgl2ZXJzaW9uIDE6ICBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgl2ZXJzaW9uIDI6ICBETV9VTE9HX0NUUiBhbGxvd2VkIHRvIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGEKKyAqCSAgICAgICAgICAgIGRldmljZSBuYW1lIHRoYXQgaXMgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIERNIHZpYQorICoJICAgICAgICAgICAgJ2RtX2dldF9kZXZpY2UnLgorICovCisjZGVmaW5lIERNX1VMT0dfUkVRVUVTVF9WRVJTSU9OIDIKKworc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCB7CisJLyoKKwkgKiBUaGUgbG9jYWwgdW5pcXVlIGlkZW50aWZpZXIgKGx1aWQpIGFuZCB0aGUgdW5pdmVyc2FsbHkgdW5pcXVlCisJICogaWRlbnRpZmllciAodXVpZCkgYXJlIHVzZWQgdG8gdGllIGEgcmVxdWVzdCB0byBhIHNwZWNpZmljCisJICogbWlycm9yIGxvZy4gIEEgc2luZ2xlIG1hY2hpbmUgbG9nIGNvdWxkIHByb2JhYmx5IG1ha2UgZHVlIHdpdGgKKwkgKiBqdXN0IHRoZSAnbHVpZCcsIGJ1dCBhIGNsdXN0ZXItYXdhcmUgbG9nIG11c3QgdXNlIHRoZSAndXVpZCcgYW5kCisJICogdGhlICdsdWlkJy4gIFRoZSB1dWlkIGlzIHdoYXQgaXMgcmVxdWlyZWQgZm9yIG5vZGUgdG8gbm9kZQorCSAqIGNvbW11bmljYXRpb24gY29uY2VybmluZyBhIHBhcnRpY3VsYXIgbG9nLCBidXQgdGhlICdsdWlkJyBoZWxwcworCSAqIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBsb2dzIHRoYXQgYXJlIGJlaW5nIHN3YXBwZWQgYW5kIGhhdmUgdGhlCisJICogc2FtZSAndXVpZCcuICAoVGhpbmsgImxpdmUiIGFuZCAiaW5hY3RpdmUiIGRldmljZS1tYXBwZXIgdGFibGVzLikKKwkgKi8KKwl1aW50NjRfdCBsdWlkOworCWNoYXIgdXVpZFtETV9VVUlEX0xFTl07CisJY2hhciBwYWRkaW5nWzNdOyAgICAgICAgLyogUGFkZGluZyBiZWNhdXNlIERNX1VVSURfTEVOID0gMTI5ICovCisKKwl1aW50MzJfdCB2ZXJzaW9uOyAgICAgICAvKiBTZWUgRE1fVUxPR19SRVFVRVNUX1ZFUlNJT04gKi8KKwlpbnQzMl90IGVycm9yOyAgICAgICAgICAvKiBVc2VkIHRvIHJlcG9ydCBiYWNrIHByb2Nlc3NpbmcgZXJyb3JzICovCisKKwl1aW50MzJfdCBzZXE7ICAgICAgICAgICAvKiBTZXF1ZW5jZSBudW1iZXIgZm9yIHJlcXVlc3QgKi8KKwl1aW50MzJfdCByZXF1ZXN0X3R5cGU7ICAvKiBETV9VTE9HXyogZGVmaW5lZCBhYm92ZSAqLworCXVpbnQzMl90IGRhdGFfc2l6ZTsgICAgIC8qIEhvdyBtdWNoIGRhdGEgKG5vdCBpbmNsdWRpbmcgdGhpcyBzdHJ1Y3QpICovCisKKwljaGFyIGRhdGFbMF07Cit9OworCisjZW5kaWYgLyogX19ETV9MT0dfVVNFUlNQQUNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNTA0NDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RuLmgKQEAgLTAsMCArMSwxNDYgQEAKKyNpZm5kZWYgX0xJTlVYX0ROX0gKKyNkZWZpbmUgX0xJTlVYX0ROX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisKKwlERUNuZXQgRGF0YSBTdHJ1Y3R1cmVzIGFuZCBDb25zdGFudHMKKworKi8KKworLyogCisgKiBETlBST1RPX05TUCBjYW4ndCBiZSB0aGUgc2FtZSBhcyBTT0xfU09DS0VULCAKKyAqIHNvIGluY3JlbWVudCBlYWNoIGJ5IG9uZSAoY29tcGFyZWQgdG8gVUxUUklYKQorICovCisjZGVmaW5lIEROUFJPVE9fTlNQICAgICAyICAgICAgICAgICAgICAgICAgICAgICAvKiBOU1AgcHJvdG9jb2wgbnVtYmVyICAgICAgICovCisjZGVmaW5lIEROUFJPVE9fUk9VICAgICAzICAgICAgICAgICAgICAgICAgICAgICAvKiBSb3V0aW5nIHByb3RvY29sIG51bWJlciAgICovCisjZGVmaW5lIEROUFJPVE9fTk1MICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXQgbWd0IHByb3RvY29sIG51bWJlciAgICovCisjZGVmaW5lIEROUFJPVE9fRVZMICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAvKiBFdmwgcHJvdG9jb2wgbnVtYmVyICh1c3IpICovCisjZGVmaW5lIEROUFJPVE9fRVZSICAgICA2ICAgICAgICAgICAgICAgICAgICAgICAvKiBFdmwgcHJvdG9jb2wgbnVtYmVyIChldmwpICovCisjZGVmaW5lIEROUFJPVE9fTlNQVCAgICA3ICAgICAgICAgICAgICAgICAgICAgICAvKiBOU1AgdHJhY2UgcHJvdG9jb2wgbnVtYmVyICovCisKKworI2RlZmluZSBETl9BRERMCQkyCisjZGVmaW5lIEROX01BWEFEREwJMiAvKiBVTFRSSVggaGVhZGVycyBoYXZlIDIwIGhlcmUsIGJ1dCBwYXRod29ya3MgaGFzIDIgKi8KKyNkZWZpbmUgRE5fTUFYT1BUTAkxNgorI2RlZmluZSBETl9NQVhPQkpMCTE2CisjZGVmaW5lIEROX01BWEFDQ0wJNDAKKyNkZWZpbmUgRE5fTUFYQUxJQVNMCTEyOAorI2RlZmluZSBETl9NQVhOT0RFTAkyNTYKKyNkZWZpbmUgRE5CVUZTSVpFCTY1MDIzCisKKy8qIAorICogU0VUL0dFVCBTb2NrZXQgb3B0aW9ucyAgLSBtdXN0IG1hdGNoIHRoZSBEU09fIG51bWJlcnMgYmVsb3cKKyAqLworI2RlZmluZSBTT19DT05EQVRBICAgICAgMQorI2RlZmluZSBTT19DT05BQ0NFU1MgICAgMgorI2RlZmluZSBTT19QUk9YWVVTUiAgICAgMworI2RlZmluZSBTT19MSU5LSU5GTyAgICAgNworCisjZGVmaW5lIERTT19DT05EQVRBICAgICAxICAgICAgICAvKiBTZXQvR2V0IGNvbm5lY3QgZGF0YSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEU09fRElTREFUQSAgICAgMTAgICAgICAgLyogU2V0L0dldCBkaXNjb25uZWN0IGRhdGEgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX0NPTkFDQ0VTUyAgIDIgICAgICAgIC8qIFNldC9HZXQgY29ubmVjdCBhY2Nlc3MgZGF0YSAgICAgICAgICovCisjZGVmaW5lIERTT19BQ0NFUFRNT0RFICA0ICAgICAgICAvKiBTZXQvR2V0IGFjY2VwdCBtb2RlICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEU09fQ09OQUNDRVBUICAgNSAgICAgICAgLyogQWNjZXB0IGRlZmVycmVkIGNvbm5lY3Rpb24gICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX0NPTlJFSkVDVCAgIDYgICAgICAgIC8qIFJlamVjdCBkZWZlcnJlZCBjb25uZWN0aW9uICAgICAgICAgICovCisjZGVmaW5lIERTT19MSU5LSU5GTyAgICA3ICAgICAgICAvKiBTZXQvR2V0IGxpbmsgaW5mb3JtYXRpb24gICAgICAgICAgICAqLworI2RlZmluZSBEU09fU1RSRUFNICAgICAgOCAgICAgICAgLyogU2V0IHNvY2tldCB0eXBlIHRvIHN0cmVhbSAgICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX1NFUVBBQ0tFVCAgIDkgICAgICAgIC8qIFNldCBzb2NrZXQgdHlwZSB0byBzZXF1ZW5jZWQgcGFja2V0ICovCisjZGVmaW5lIERTT19NQVhXSU5ET1cgICAxMSAgICAgICAvKiBNYXhpbXVtIHdpbmRvdyBzaXplIGFsbG93ZWQgICAgICAgICAqLworI2RlZmluZSBEU09fTk9ERUxBWQkxMiAgICAgICAvKiBUdXJuIG9mZiBuYWdsZSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEU09fQ09SSyAgICAgICAgMTMgICAgICAgLyogV2FpdCBmb3IgbW9yZSBkYXRhISAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX1NFUlZJQ0VTCTE0ICAgICAgIC8qIE5TUCBTZXJ2aWNlcyBmaWVsZCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERTT19JTkZPCTE1ICAgICAgIC8qIE5TUCBJbmZvIGZpZWxkICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERTT19NQVggICAgICAgICAxNSAgICAgICAvKiBNYXhpbXVtIG9wdGlvbiBudW1iZXIgICAgICAgICAgICAgICAqLworCisKKy8qIExJTksgU3RhdGVzICovCisjZGVmaW5lIExMX0lOQUNUSVZFCTAKKyNkZWZpbmUgTExfQ09OTkVDVElORwkxCisjZGVmaW5lIExMX1JVTk5JTkcJMgorI2RlZmluZSBMTF9ESVNDT05ORUNUSU5HIDMKKworI2RlZmluZSBBQ0NfSU1NRUQgMAorI2RlZmluZSBBQ0NfREVGRVIgMQorCisjZGVmaW5lIFNERl9XSUxEICAgICAgICAxICAgICAgICAgICAgICAgICAgLyogV2lsZCBjYXJkIG9iamVjdCAgICAgICAgICAqLworI2RlZmluZSBTREZfUFJPWFkgICAgICAgMiAgICAgICAgICAgICAgICAgIC8qIEFkZHIgZWxpZ2libGUgZm9yIHByb3h5ICAgKi8KKyNkZWZpbmUgU0RGX1VJQ1BST1hZICAgIDQgICAgICAgICAgICAgICAgICAvKiBVc2UgdWljLWJhc2VkIHByb3h5ICAgICAgICovCisKKy8qIFN0cnVjdHVyZXMgKi8KKworCitzdHJ1Y3QgZG5fbmFkZHIgeworCV9fbGUxNgkJYV9sZW47CisJX191OCBhX2FkZHJbRE5fTUFYQURETF07IC8qIFR3byBieXRlcyBsaXR0bGUgZW5kaWFuICovCit9OworCitzdHJ1Y3Qgc29ja2FkZHJfZG4geworCV9fdTE2CQlzZG5fZmFtaWx5OworCV9fdTgJCXNkbl9mbGFnczsKKwlfX3U4CQlzZG5fb2JqbnVtOworCV9fbGUxNgkJc2RuX29iam5hbWVsOworCV9fdTgJCXNkbl9vYmpuYW1lW0ROX01BWE9CSkxdOworCXN0cnVjdCAgIGRuX25hZGRyCXNkbl9hZGQ7Cit9OworI2RlZmluZSBzZG5fbm9kZWFkZHJsICAgc2RuX2FkZC5hX2xlbiAgIC8qIE5vZGUgYWRkcmVzcyBsZW5ndGggICovCisjZGVmaW5lIHNkbl9ub2RlYWRkciAgICBzZG5fYWRkLmFfYWRkciAgLyogTm9kZSBhZGRyZXNzICAgICAgICAgKi8KKworCisKKy8qCisgKiBERUNuZXQgc2V0L2dldCBEU09fQ09OREFUQSwgRFNPX0RJU0RBVEEgKG9wdGlvbmFsIGRhdGEpIHN0cnVjdHVyZQorICovCitzdHJ1Y3Qgb3B0ZGF0YV9kbiB7CisgICAgICAgIF9fbGUxNiAgb3B0X3N0YXR1czsgICAgIC8qIEV4dGVuZGVkIHN0YXR1cyByZXR1cm4gKi8KKyNkZWZpbmUgb3B0X3N0cyBvcHRfc3RhdHVzCisgICAgICAgIF9fbGUxNiAgb3B0X29wdGw7ICAgICAgIC8qIExlbmd0aCBvZiB1c2VyIGRhdGEgICAgKi8KKyAgICAgICAgX191OCAgIG9wdF9kYXRhWzE2XTsgICAvKiBVc2VyIGRhdGEgICAgICAgICAgICAgICovCit9OworCitzdHJ1Y3QgYWNjZXNzZGF0YV9kbiB7CisJX191OAkJYWNjX2FjY2w7CisJX191OAkJYWNjX2FjY1tETl9NQVhBQ0NMXTsKKwlfX3U4IAkJYWNjX3Bhc3NsOworCV9fdTgJCWFjY19wYXNzW0ROX01BWEFDQ0xdOworCV9fdTggCQlhY2NfdXNlcmw7CisJX191OAkJYWNjX3VzZXJbRE5fTUFYQUNDTF07Cit9OworCisvKgorICogREVDbmV0IGxvZ2ljYWwgbGluayBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGxpbmtpbmZvX2RuIHsKKyAgICAgICAgX191MTYgIGlkbl9zZWdzaXplOyAgICAvKiBTZWdtZW50IHNpemUgZm9yIGxpbmsgKi8KKyAgICAgICAgX191OCAgIGlkbl9saW5rc3RhdGU7ICAvKiBMb2dpY2FsIGxpbmsgc3RhdGUgICAgKi8KK307CisKKy8qCisgKiBFdGhlcm5ldCBhZGRyZXNzIGZvcm1hdCAoZm9yIERFQ25ldCkKKyAqLwordW5pb24gZXRoZXJhZGRyZXNzIHsKKyAgICAgICAgX191OCBkbmVfYWRkcls2XTsgICAgICAgICAgICAgLyogRnVsbCBldGhlcm5ldCBhZGRyZXNzICovCisgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgX191OCBkbmVfaGlvcmRbNF07ICAgIC8qIERFQ25ldCBISU9SRCBwcmVmaXggICAqLworICAgICAgICAgICAgICAgIF9fdTggZG5lX25vZGVhZGRyWzJdOyAvKiBERUNuZXQgbm9kZSBhZGRyZXNzICAgKi8KKyAgfSBkbmVfcmVtb3RlOworfTsKKworCisvKgorICogREVDbmV0IHBoeXNpY2FsIHNvY2tldCBhZGRyZXNzIGZvcm1hdAorICovCitzdHJ1Y3QgZG5fYWRkciB7CisgICAgICAgIF9fbGUxNiBkbmFfZmFtaWx5OyAgICAgIC8qIEFGX0RFQ25ldCAgICAgICAgICAgICAgICovCisgICAgICAgIHVuaW9uIGV0aGVyYWRkcmVzcyBkbmFfbmV0YWRkcjsgLyogREVDbmV0IGV0aGVybmV0IGFkZHJlc3MgKi8KK307CisKKyNkZWZpbmUgREVDTkVUX0lPQ1RMX0JBU0UgMHg4OSAvKiBQUk9UT1BSSVZBVEUgcmFuZ2UgKi8KKworI2RlZmluZSBTSU9DU05FVEFERFIgIF9JT1coREVDTkVUX0lPQ1RMX0JBU0UsIDB4ZTAsIHN0cnVjdCBkbl9uYWRkcikKKyNkZWZpbmUgU0lPQ0dORVRBRERSICBfSU9SKERFQ05FVF9JT0NUTF9CQVNFLCAweGUxLCBzdHJ1Y3QgZG5fbmFkZHIpCisjZGVmaW5lIE9TSU9DU05FVEFERFIgX0lPVyhERUNORVRfSU9DVExfQkFTRSwgMHhlMCwgaW50KQorI2RlZmluZSBPU0lPQ0dORVRBRERSIF9JT1IoREVDTkVUX0lPQ1RMX0JBU0UsIDB4ZTEsIGludCkKKworI2VuZGlmIC8qIF9MSU5VWF9ETl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RxYmxrX3hmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kcWJsa194ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjU1MjgwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kcWJsa194ZnMuaApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NS0yMDAxLDIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXQgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisjaWZuZGVmIF9MSU5VWF9EUUJMS19YRlNfSAorI2RlZmluZSBfTElOVVhfRFFCTEtfWEZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBEaXNrIHF1b3RhIC0gcXVvdGFjdGwoMikgY29tbWFuZHMgZm9yIHRoZSBYRlMgUXVvdGEgTWFuYWdlciAoWFFNKS4KKyAqLworCisjZGVmaW5lIFhRTV9DTUQoeCkJKCgnWCc8PDgpKyh4KSkJLyogbm90ZTogZm9ybXMgZmlyc3QgUUNNRCBhcmd1bWVudCAqLworI2RlZmluZSBYUU1fQ09NTUFORCh4KQkoKCh4KSAmICgweGZmPDw4KSkgPT0gKCdYJzw8OCkpCS8qIHRlc3QgaWYgZm9yIFhGUyAqLworCisjZGVmaW5lIFhRTV9VU1JRVU9UQQkwCS8qIHN5c3RlbSBjYWxsIHVzZXIgcXVvdGEgdHlwZSAqLworI2RlZmluZSBYUU1fR1JQUVVPVEEJMQkvKiBzeXN0ZW0gY2FsbCBncm91cCBxdW90YSB0eXBlICovCisjZGVmaW5lIFhRTV9QUkpRVU9UQQkyCS8qIHN5c3RlbSBjYWxsIHByb2plY3QgcXVvdGEgdHlwZSAqLworI2RlZmluZSBYUU1fTUFYUVVPVEFTCTMKKworI2RlZmluZSBRX1hRVU9UQU9OCVhRTV9DTUQoMSkJLyogZW5hYmxlIGFjY291bnRpbmcvZW5mb3JjZW1lbnQgKi8KKyNkZWZpbmUgUV9YUVVPVEFPRkYJWFFNX0NNRCgyKQkvKiBkaXNhYmxlIGFjY291bnRpbmcvZW5mb3JjZW1lbnQgKi8KKyNkZWZpbmUgUV9YR0VUUVVPVEEJWFFNX0NNRCgzKQkvKiBnZXQgZGlzayBsaW1pdHMgYW5kIHVzYWdlICovCisjZGVmaW5lIFFfWFNFVFFMSU0JWFFNX0NNRCg0KQkvKiBzZXQgZGlzayBsaW1pdHMgKi8KKyNkZWZpbmUgUV9YR0VUUVNUQVQJWFFNX0NNRCg1KQkvKiBnZXQgcXVvdGEgc3Vic3lzdGVtIHN0YXR1cyAqLworI2RlZmluZSBRX1hRVU9UQVJNCVhRTV9DTUQoNikJLyogZnJlZSBkaXNrIHNwYWNlIHVzZWQgYnkgZHF1b3RzICovCisjZGVmaW5lIFFfWFFVT1RBU1lOQwlYUU1fQ01EKDcpCS8qIGRlbGFsbG9jIGZsdXNoLCB1cGRhdGVzIGRxdW90cyAqLworCisvKgorICogZnNfZGlza19xdW90YSBzdHJ1Y3R1cmU6CisgKgorICogVGhpcyBjb250YWlucyB0aGUgY3VycmVudCBxdW90YSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgYSB1c2VyL3Byb2ovZ3JvdXAuCisgKiBJdCBpcyA2NC1iaXQgYWxpZ25lZCwgYW5kIGFsbCB0aGUgYmxrIHVuaXRzIGFyZSBpbiBCQnMgKEJhc2ljIEJsb2Nrcykgb2YKKyAqIDUxMiBieXRlcy4KKyAqLworI2RlZmluZSBGU19EUVVPVF9WRVJTSU9OCTEJLyogZnNfZGlza19xdW90YS5kX3ZlcnNpb24gKi8KK3R5cGVkZWYgc3RydWN0IGZzX2Rpc2tfcXVvdGEgeworCV9fczgJCWRfdmVyc2lvbjsJLyogdmVyc2lvbiBvZiB0aGlzIHN0cnVjdHVyZSAqLworCV9fczgJCWRfZmxhZ3M7CS8qIEZTX3tVU0VSLFBST0osR1JPVVB9X1FVT1RBICovCisJX191MTYJCWRfZmllbGRtYXNrOwkvKiBmaWVsZCBzcGVjaWZpZXIgKi8KKwlfX3UzMgkJZF9pZDsJCS8qIHVzZXIsIHByb2plY3QsIG9yIGdyb3VwIElEICovCisJX191NjQJCWRfYmxrX2hhcmRsaW1pdDsvKiBhYnNvbHV0ZSBsaW1pdCBvbiBkaXNrIGJsa3MgKi8KKwlfX3U2NAkJZF9ibGtfc29mdGxpbWl0Oy8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIGJsa3MgKi8KKwlfX3U2NAkJZF9pbm9faGFyZGxpbWl0Oy8qIG1heGltdW0gIyBhbGxvY2F0ZWQgaW5vZGVzICovCisJX191NjQJCWRfaW5vX3NvZnRsaW1pdDsvKiBwcmVmZXJyZWQgaW5vZGUgbGltaXQgKi8KKwlfX3U2NAkJZF9iY291bnQ7CS8qICMgZGlzayBibG9ja3Mgb3duZWQgYnkgdGhlIHVzZXIgKi8KKwlfX3U2NAkJZF9pY291bnQ7CS8qICMgaW5vZGVzIG93bmVkIGJ5IHRoZSB1c2VyICovCisJX19zMzIJCWRfaXRpbWVyOwkvKiB6ZXJvIGlmIHdpdGhpbiBpbm9kZSBsaW1pdHMgKi8KKwkJCQkJLyogaWYgbm90LCB3ZSByZWZ1c2Ugc2VydmljZSAqLworCV9fczMyCQlkX2J0aW1lcjsJLyogc2ltaWxhciB0byBhYm92ZTsgZm9yIGRpc2sgYmxvY2tzICovCisJX191MTYJICAJZF9pd2FybnM7ICAgICAgIC8qICMgd2FybmluZ3MgaXNzdWVkIHdydCBudW0gaW5vZGVzICovCisJX191MTYJICAJZF9id2FybnM7ICAgICAgIC8qICMgd2FybmluZ3MgaXNzdWVkIHdydCBkaXNrIGJsb2NrcyAqLworCV9fczMyCQlkX3BhZGRpbmcyOwkvKiBwYWRkaW5nMiAtIGZvciBmdXR1cmUgdXNlICovCisJX191NjQJCWRfcnRiX2hhcmRsaW1pdDsvKiBhYnNvbHV0ZSBsaW1pdCBvbiByZWFsdGltZSBibGtzICovCisJX191NjQJCWRfcnRiX3NvZnRsaW1pdDsvKiBwcmVmZXJyZWQgbGltaXQgb24gUlQgZGlzayBibGtzICovCisJX191NjQJCWRfcnRiY291bnQ7CS8qICMgcmVhbHRpbWUgYmxvY2tzIG93bmVkICovCisJX19zMzIJCWRfcnRidGltZXI7CS8qIHNpbWlsYXIgdG8gYWJvdmU7IGZvciBSVCBkaXNrIGJsa3MgKi8KKwlfX3UxNgkgIAlkX3J0Yndhcm5zOyAgICAgLyogIyB3YXJuaW5ncyBpc3N1ZWQgd3J0IFJUIGRpc2sgYmxrcyAqLworCV9fczE2CQlkX3BhZGRpbmczOwkvKiBwYWRkaW5nMyAtIGZvciBmdXR1cmUgdXNlICovCQorCWNoYXIJCWRfcGFkZGluZzRbOF07CS8qIHlldCBtb3JlIHBhZGRpbmcgKi8KK30gZnNfZGlza19xdW90YV90OworCisvKgorICogVGhlc2UgZmllbGRzIGFyZSBzZW50IHRvIFFfWFNFVFFMSU0gdG8gc3BlY2lmeSBmaWVsZHMgdGhhdCBuZWVkIHRvIGNoYW5nZS4KKyAqLworI2RlZmluZSBGU19EUV9JU09GVAkoMTw8MCkKKyNkZWZpbmUgRlNfRFFfSUhBUkQJKDE8PDEpCisjZGVmaW5lIEZTX0RRX0JTT0ZUCSgxPDwyKQorI2RlZmluZSBGU19EUV9CSEFSRCAJKDE8PDMpCisjZGVmaW5lIEZTX0RRX1JUQlNPRlQJKDE8PDQpCisjZGVmaW5lIEZTX0RRX1JUQkhBUkQJKDE8PDUpCisjZGVmaW5lIEZTX0RRX0xJTUlUX01BU0sJKEZTX0RRX0lTT0ZUIHwgRlNfRFFfSUhBUkQgfCBGU19EUV9CU09GVCB8IFwKKwkJCQkgRlNfRFFfQkhBUkQgfCBGU19EUV9SVEJTT0ZUIHwgRlNfRFFfUlRCSEFSRCkKKy8qCisgKiBUaGVzZSB0aW1lcnMgY2FuIG9ubHkgYmUgc2V0IGluIHN1cGVyIHVzZXIncyBkcXVvdC4gRm9yIG90aGVycywgdGltZXJzIGFyZQorICogYXV0b21hdGljYWxseSBzdGFydGVkIGFuZCBzdG9wcGVkLiBTdXBlcnVzZXJzIHRpbWVyIHZhbHVlcyBzZXQgdGhlIGxpbWl0cworICogZm9yIHRoZSByZXN0LiAgSW4gY2FzZSB0aGVzZSB2YWx1ZXMgYXJlIHplcm8sIHRoZSBEUV97RixCfVRJTUVMSU1JVCB2YWx1ZXMKKyAqIGRlZmluZWQgYmVsb3cgYXJlIHVzZWQuIAorICogVGhlc2UgdmFsdWVzIGFsc28gYXBwbHkgb25seSB0byB0aGUgZF9maWVsZG1hc2sgZmllbGQgZm9yIFFfWFNFVFFMSU0uCisgKi8KKyNkZWZpbmUgRlNfRFFfQlRJTUVSCSgxPDw2KQorI2RlZmluZSBGU19EUV9JVElNRVIJKDE8PDcpCisjZGVmaW5lIEZTX0RRX1JUQlRJTUVSIAkoMTw8OCkKKyNkZWZpbmUgRlNfRFFfVElNRVJfTUFTSwkoRlNfRFFfQlRJTUVSIHwgRlNfRFFfSVRJTUVSIHwgRlNfRFFfUlRCVElNRVIpCisKKy8qCisgKiBXYXJuaW5nIGNvdW50cyBhcmUgc2V0IGluIGJvdGggc3VwZXIgdXNlcidzIGRxdW90IGFuZCBvdGhlcnMuIEZvciBvdGhlcnMsCisgKiB3YXJuaW5ncyBhcmUgc2V0L2NsZWFyZWQgYnkgdGhlIGFkbWluaXN0cmF0b3JzIChvciBhdXRvbWF0aWNhbGx5IGJ5IGdvaW5nCisgKiBiZWxvdyB0aGUgc29mdCBsaW1pdCkuICBTdXBlcnVzZXJzIHdhcm5pbmcgdmFsdWVzIHNldCB0aGUgd2FybmluZyBsaW1pdHMKKyAqIGZvciB0aGUgcmVzdC4gIEluIGNhc2UgdGhlc2UgdmFsdWVzIGFyZSB6ZXJvLCB0aGUgRFFfe0YsQn1XQVJOTElNSVQgdmFsdWVzCisgKiBkZWZpbmVkIGJlbG93IGFyZSB1c2VkLiAKKyAqIFRoZXNlIHZhbHVlcyBhbHNvIGFwcGx5IG9ubHkgdG8gdGhlIGRfZmllbGRtYXNrIGZpZWxkIGZvciBRX1hTRVRRTElNLgorICovCisjZGVmaW5lIEZTX0RRX0JXQVJOUwkoMTw8OSkKKyNkZWZpbmUgRlNfRFFfSVdBUk5TCSgxPDwxMCkKKyNkZWZpbmUgRlNfRFFfUlRCV0FSTlMJKDE8PDExKQorI2RlZmluZSBGU19EUV9XQVJOU19NQVNLCShGU19EUV9CV0FSTlMgfCBGU19EUV9JV0FSTlMgfCBGU19EUV9SVEJXQVJOUykKKworLyoKKyAqIEFjY291bnRpbmcgdmFsdWVzLiAgVGhlc2UgY2FuIG9ubHkgYmUgc2V0IGZvciBmaWxlc3lzdGVtIHdpdGgKKyAqIG5vbi10cmFuc2FjdGlvbmFsIHF1b3RhcyB0aGF0IHJlcXVpcmUgcXVvdGFjaGVjayg4KSBpbiB1c2Vyc3BhY2UuCisgKi8KKyNkZWZpbmUgRlNfRFFfQkNPVU5UCQkoMTw8MTIpCisjZGVmaW5lIEZTX0RRX0lDT1VOVAkJKDE8PDEzKQorI2RlZmluZSBGU19EUV9SVEJDT1VOVAkJKDE8PDE0KQorI2RlZmluZSBGU19EUV9BQ0NUX01BU0sJCShGU19EUV9CQ09VTlQgfCBGU19EUV9JQ09VTlQgfCBGU19EUV9SVEJDT1VOVCkKKworLyoKKyAqIFZhcmlvdXMgZmxhZ3MgcmVsYXRlZCB0byBxdW90YWN0bCgyKS4KKyAqLworI2RlZmluZSBGU19RVU9UQV9VRFFfQUNDVAkoMTw8MCkgIC8qIHVzZXIgcXVvdGEgYWNjb3VudGluZyAqLworI2RlZmluZSBGU19RVU9UQV9VRFFfRU5GRAkoMTw8MSkgIC8qIHVzZXIgcXVvdGEgbGltaXRzIGVuZm9yY2VtZW50ICovCisjZGVmaW5lIEZTX1FVT1RBX0dEUV9BQ0NUCSgxPDwyKSAgLyogZ3JvdXAgcXVvdGEgYWNjb3VudGluZyAqLworI2RlZmluZSBGU19RVU9UQV9HRFFfRU5GRAkoMTw8MykgIC8qIGdyb3VwIHF1b3RhIGxpbWl0cyBlbmZvcmNlbWVudCAqLworI2RlZmluZSBGU19RVU9UQV9QRFFfQUNDVAkoMTw8NCkgIC8qIHByb2plY3QgcXVvdGEgYWNjb3VudGluZyAqLworI2RlZmluZSBGU19RVU9UQV9QRFFfRU5GRAkoMTw8NSkgIC8qIHByb2plY3QgcXVvdGEgbGltaXRzIGVuZm9yY2VtZW50ICovCisKKyNkZWZpbmUgRlNfVVNFUl9RVU9UQQkJKDE8PDApCS8qIHVzZXIgcXVvdGEgdHlwZSAqLworI2RlZmluZSBGU19QUk9KX1FVT1RBCQkoMTw8MSkJLyogcHJvamVjdCBxdW90YSB0eXBlICovCisjZGVmaW5lIEZTX0dST1VQX1FVT1RBCQkoMTw8MikJLyogZ3JvdXAgcXVvdGEgdHlwZSAqLworCisvKgorICogZnNfcXVvdGFfc3RhdCBpcyB0aGUgc3RydWN0IHJldHVybmVkIGluIFFfWEdFVFFTVEFUIGZvciBhIGdpdmVuIGZpbGUgc3lzdGVtLgorICogUHJvdmlkZXMgYSBjZW50cmFsaXplZCB3YXkgdG8gZ2V0IG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHF1b3RhIHN1YnN5c3RlbS4KKyAqIGVnLiBzcGFjZSB0YWtlbiB1cCBmb3IgdXNlciBhbmQgZ3JvdXAgcXVvdGFzLCBudW1iZXIgb2YgZHF1b3RzIGN1cnJlbnRseQorICogaW5jb3JlLgorICovCisjZGVmaW5lIEZTX1FTVEFUX1ZFUlNJT04JMQkvKiBmc19xdW90YV9zdGF0LnFzX3ZlcnNpb24gKi8KKworLyoKKyAqIFNvbWUgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgJ3F1b3RhIGZpbGVzJy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZnNfcWZpbGVzdGF0IHsKKwlfX3U2NAkJcWZzX2lubzsJLyogaW5vZGUgbnVtYmVyICovCisJX191NjQJCXFmc19uYmxrczsJLyogbnVtYmVyIG9mIEJCcyA1MTItYnl0ZS1ibGtzICovCisJX191MzIJCXFmc19uZXh0ZW50czsJLyogbnVtYmVyIG9mIGV4dGVudHMgKi8KK30gZnNfcWZpbGVzdGF0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGZzX3F1b3RhX3N0YXQgeworCV9fczgJCXFzX3ZlcnNpb247CS8qIHZlcnNpb24gbnVtYmVyIGZvciBmdXR1cmUgY2hhbmdlcyAqLworCV9fdTE2CQlxc19mbGFnczsJLyogRlNfUVVPVEFfe1UsUCxHfURRX3tBQ0NULEVORkR9ICovCisJX19zOAkJcXNfcGFkOwkJLyogdW51c2VkICovCisJZnNfcWZpbGVzdGF0X3QJcXNfdXF1b3RhOwkvKiB1c2VyIHF1b3RhIHN0b3JhZ2UgaW5mb3JtYXRpb24gKi8KKwlmc19xZmlsZXN0YXRfdAlxc19ncXVvdGE7CS8qIGdyb3VwIHF1b3RhIHN0b3JhZ2UgaW5mb3JtYXRpb24gKi8KKwlfX3UzMgkJcXNfaW5jb3JlZHFzOwkvKiBudW1iZXIgb2YgZHF1b3RzIGluY29yZSAqLworCV9fczMyCQlxc19idGltZWxpbWl0OyAgLyogbGltaXQgZm9yIGJsa3MgdGltZXIgKi8JCisJX19zMzIJCXFzX2l0aW1lbGltaXQ7ICAvKiBsaW1pdCBmb3IgaW5vZGVzIHRpbWVyICovCQorCV9fczMyCQlxc19ydGJ0aW1lbGltaXQ7LyogbGltaXQgZm9yIHJ0IGJsa3MgdGltZXIgKi8JCisJX191MTYJCXFzX2J3YXJubGltaXQ7CS8qIGxpbWl0IGZvciBudW0gd2FybmluZ3MgKi8KKwlfX3UxNgkJcXNfaXdhcm5saW1pdDsJLyogbGltaXQgZm9yIG51bSB3YXJuaW5ncyAqLworfSBmc19xdW90YV9zdGF0X3Q7CisKKyNlbmRpZgkvKiBfTElOVVhfRFFCTEtfWEZTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL2F1ZGlvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0N2JjY2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogYXVkaW8uaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBSYWxwaCAgTWV0emxlciA8cmFscGhAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICYgTWFyY3VzIE1ldHpsZXIgPG1hcmN1c0Bjb252ZXJnZW5jZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgICBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgTGVzc2VyIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EVkJBVURJT19IXworI2RlZmluZSBfRFZCQVVESU9fSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3R5cGVkZWYgZW51bSB7CisJQVVESU9fU09VUkNFX0RFTVVYLCAvKiBTZWxlY3QgdGhlIGRlbXV4IGFzIHRoZSBtYWluIHNvdXJjZSAqLworCUFVRElPX1NPVVJDRV9NRU1PUlkgLyogU2VsZWN0IGludGVybmFsIG1lbW9yeSBhcyB0aGUgbWFpbiBzb3VyY2UgKi8KK30gYXVkaW9fc3RyZWFtX3NvdXJjZV90OworCisKK3R5cGVkZWYgZW51bSB7CisJQVVESU9fU1RPUFBFRCwgICAgICAvKiBEZXZpY2UgaXMgc3RvcHBlZCAqLworCUFVRElPX1BMQVlJTkcsICAgICAgLyogRGV2aWNlIGlzIGN1cnJlbnRseSBwbGF5aW5nICovCisJQVVESU9fUEFVU0VEICAgICAgICAvKiBEZXZpY2UgaXMgcGF1c2VkICovCit9IGF1ZGlvX3BsYXlfc3RhdGVfdDsKKworCit0eXBlZGVmIGVudW0geworCUFVRElPX1NURVJFTywKKwlBVURJT19NT05PX0xFRlQsCisJQVVESU9fTU9OT19SSUdIVCwKKwlBVURJT19NT05PLAorCUFVRElPX1NURVJFT19TV0FQUEVECit9IGF1ZGlvX2NoYW5uZWxfc2VsZWN0X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgYXVkaW9fbWl4ZXIgeworCXVuc2lnbmVkIGludCB2b2x1bWVfbGVmdDsKKwl1bnNpZ25lZCBpbnQgdm9sdW1lX3JpZ2h0OworICAvLyB3aGF0IGVsc2UgZG8gd2UgbmVlZD8gYmFzcywgcGFzcy10aHJvdWdoLCAuLi4KK30gYXVkaW9fbWl4ZXJfdDsKKworCit0eXBlZGVmIHN0cnVjdCBhdWRpb19zdGF0dXMgeworCWludCAgICAgICAgICAgICAgICAgICAgQVZfc3luY19zdGF0ZTsgIC8qIHN5bmMgYXVkaW8gYW5kIHZpZGVvPyAqLworCWludCAgICAgICAgICAgICAgICAgICAgbXV0ZV9zdGF0ZTsgICAgIC8qIGF1ZGlvIGlzIG11dGVkICovCisJYXVkaW9fcGxheV9zdGF0ZV90ICAgICBwbGF5X3N0YXRlOyAgICAgLyogY3VycmVudCBwbGF5YmFjayBzdGF0ZSAqLworCWF1ZGlvX3N0cmVhbV9zb3VyY2VfdCAgc3RyZWFtX3NvdXJjZTsgIC8qIGN1cnJlbnQgc3RyZWFtIHNvdXJjZSAqLworCWF1ZGlvX2NoYW5uZWxfc2VsZWN0X3QgY2hhbm5lbF9zZWxlY3Q7IC8qIGN1cnJlbnRseSBzZWxlY3RlZCBjaGFubmVsICovCisJaW50ICAgICAgICAgICAgICAgICAgICBieXBhc3NfbW9kZTsgICAgLyogcGFzcyBvbiBhdWRpbyBkYXRhIHRvICovCisJYXVkaW9fbWl4ZXJfdAkgICAgICAgbWl4ZXJfc3RhdGU7ICAgIC8qIGN1cnJlbnQgbWl4ZXIgc3RhdGUgKi8KK30gYXVkaW9fc3RhdHVzX3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VwYXJhdGUgZGVjb2RlciBoYXJkd2FyZSAqLworCisKK3R5cGVkZWYKK3N0cnVjdCBhdWRpb19rYXJhb2tlIHsgIC8qIGlmIFZvY2FsMSBvciBWb2NhbDIgYXJlIG5vbi16ZXJvLCB0aGV5IGdldCBtaXhlZCAgKi8KKwlpbnQgdm9jYWwxOyAgICAvKiBpbnRvIGxlZnQgYW5kIHJpZ2h0IHQgYXQgNzAlIGVhY2ggKi8KKwlpbnQgdm9jYWwyOyAgICAvKiBpZiBib3RoLCBWb2NhbDEgYW5kIFZvY2FsMiBhcmUgbm9uLXplcm8sIFZvY2FsMSBnZXRzKi8KKwlpbnQgbWVsb2R5OyAgICAvKiBtaXhlZCBpbnRvIHRoZSBsZWZ0IGNoYW5uZWwgYW5kICovCisJCSAgICAgICAvKiBWb2NhbDIgaW50byB0aGUgcmlnaHQgY2hhbm5lbCBhdCAxMDAlIGVhY2guICovCisJCSAgICAgICAvKiBpZiBNZWxvZHkgaXMgbm9uLXplcm8sIHRoZSBtZWxvZHkgY2hhbm5lbCBnZXRzIG1peGVkKi8KK30gYXVkaW9fa2FyYW9rZV90OyAgICAgLyogaW50byBsZWZ0IGFuZCByaWdodCAgKi8KKworCit0eXBlZGVmIF9fdTE2IGF1ZGlvX2F0dHJpYnV0ZXNfdDsKKy8qICAgYml0czogZGVzY3IuICovCisvKiAgIDE1LTEzIGF1ZGlvIGNvZGluZyBtb2RlICgwPWFjMywgMj1tcGVnMSwgMz1tcGVnMmV4dCwgND1MUENNLCA2PURUUywgKi8KKy8qICAgMTIgICAgbXVsdGljaGFubmVsIGV4dGVuc2lvbiAqLworLyogICAxMS0xMCBhdWRpbyB0eXBlICgwPW5vdCBzcGVjLCAxPWxhbmd1YWdlIGluY2x1ZGVkKSAqLworLyogICAgOS0gOCBhdWRpbyBhcHBsaWNhdGlvbiBtb2RlICgwPW5vdCBzcGVjLCAxPWthcmFva2UsIDI9c3Vycm91bmQpICovCisvKiAgICA3LSA2IFF1YW50aXphdGlvbiAvIERSQyAobXBlZyBhdWRpbzogMT1EUkMgZXhpc3RzKShscGNtOiAwPTE2Yml0LCAgKi8KKy8qICAgIDUtIDQgU2FtcGxlIGZyZXF1ZW5jeSBmcyAoMD00OGtIeiwgMT05NmtIeikgKi8KKy8qICAgIDItIDAgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIChuKzEgY2hhbm5lbHMpICovCisKKworLyogZm9yIEdFVF9DQVBBQklMSVRJRVMgYW5kIFNFVF9GT1JNQVQsIHRoZSBsYXR0ZXIgc2hvdWxkIG9ubHkgc2V0IG9uZSBiaXQgKi8KKyNkZWZpbmUgQVVESU9fQ0FQX0RUUyAgICAxCisjZGVmaW5lIEFVRElPX0NBUF9MUENNICAgMgorI2RlZmluZSBBVURJT19DQVBfTVAxICAgIDQKKyNkZWZpbmUgQVVESU9fQ0FQX01QMiAgICA4CisjZGVmaW5lIEFVRElPX0NBUF9NUDMgICAxNgorI2RlZmluZSBBVURJT19DQVBfQUFDICAgMzIKKyNkZWZpbmUgQVVESU9fQ0FQX09HRyAgIDY0CisjZGVmaW5lIEFVRElPX0NBUF9TRERTIDEyOAorI2RlZmluZSBBVURJT19DQVBfQUMzICAyNTYKKworI2RlZmluZSBBVURJT19TVE9QICAgICAgICAgICAgICAgICBfSU8oJ28nLCAxKQorI2RlZmluZSBBVURJT19QTEFZICAgICAgICAgICAgICAgICBfSU8oJ28nLCAyKQorI2RlZmluZSBBVURJT19QQVVTRSAgICAgICAgICAgICAgICBfSU8oJ28nLCAzKQorI2RlZmluZSBBVURJT19DT05USU5VRSAgICAgICAgICAgICBfSU8oJ28nLCA0KQorI2RlZmluZSBBVURJT19TRUxFQ1RfU09VUkNFICAgICAgICBfSU8oJ28nLCA1KQorI2RlZmluZSBBVURJT19TRVRfTVVURSAgICAgICAgICAgICBfSU8oJ28nLCA2KQorI2RlZmluZSBBVURJT19TRVRfQVZfU1lOQyAgICAgICAgICBfSU8oJ28nLCA3KQorI2RlZmluZSBBVURJT19TRVRfQllQQVNTX01PREUgICAgICBfSU8oJ28nLCA4KQorI2RlZmluZSBBVURJT19DSEFOTkVMX1NFTEVDVCAgICAgICBfSU8oJ28nLCA5KQorI2RlZmluZSBBVURJT19HRVRfU1RBVFVTICAgICAgICAgICBfSU9SKCdvJywgMTAsIGF1ZGlvX3N0YXR1c190KQorCisjZGVmaW5lIEFVRElPX0dFVF9DQVBBQklMSVRJRVMgICAgIF9JT1IoJ28nLCAxMSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBBVURJT19DTEVBUl9CVUZGRVIgICAgICAgICBfSU8oJ28nLCAgMTIpCisjZGVmaW5lIEFVRElPX1NFVF9JRCAgICAgICAgICAgICAgIF9JTygnbycsIDEzKQorI2RlZmluZSBBVURJT19TRVRfTUlYRVIgICAgICAgICAgICBfSU9XKCdvJywgMTQsIGF1ZGlvX21peGVyX3QpCisjZGVmaW5lIEFVRElPX1NFVF9TVFJFQU1UWVBFICAgICAgIF9JTygnbycsIDE1KQorI2RlZmluZSBBVURJT19TRVRfRVhUX0lEICAgICAgICAgICBfSU8oJ28nLCAxNikKKyNkZWZpbmUgQVVESU9fU0VUX0FUVFJJQlVURVMgICAgICAgX0lPVygnbycsIDE3LCBhdWRpb19hdHRyaWJ1dGVzX3QpCisjZGVmaW5lIEFVRElPX1NFVF9LQVJBT0tFICAgICAgICAgIF9JT1coJ28nLCAxOCwgYXVkaW9fa2FyYW9rZV90KQorCisvKioKKyAqIEFVRElPX0dFVF9QVFMKKyAqCisgKiBSZWFkIHRoZSAzMyBiaXQgcHJlc2VudGF0aW9uIHRpbWUgc3RhbXAgYXMgZGVmaW5lZAorICogaW4gSVRVIFQtUkVDLUguMjIyLjAgLyBJU08vSUVDIDEzODE4LTEuCisgKgorICogVGhlIFBUUyBzaG91bGQgYmVsb25nIHRvIHRoZSBjdXJyZW50bHkgcGxheWVkCisgKiBmcmFtZSBpZiBwb3NzaWJsZSwgYnV0IG1heSBhbHNvIGJlIGEgdmFsdWUgY2xvc2UgdG8gaXQKKyAqIGxpa2UgdGhlIFBUUyBvZiB0aGUgbGFzdCBkZWNvZGVkIGZyYW1lIG9yIHRoZSBsYXN0IFBUUworICogZXh0cmFjdGVkIGJ5IHRoZSBQRVMgcGFyc2VyLgorICovCisjZGVmaW5lIEFVRElPX0dFVF9QVFMgICAgICAgICAgICAgIF9JT1IoJ28nLCAxOSwgX191NjQpCisjZGVmaW5lIEFVRElPX0JJTElOR1VBTF9DSEFOTkVMX1NFTEVDVCBfSU8oJ28nLCAyMCkKKworI2VuZGlmIC8qIF9EVkJBVURJT19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvY2EuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL2NhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4NTM3ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL2NhLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIGNhLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgUmFscGggIE1ldHpsZXIgPHJhbHBoQGNvbnZlcmdlbmNlLmRlPgorICogICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIDxtYXJjdXNAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgZm9yIGNvbnZlcmdlbmNlIGludGVncmF0ZWQgbWVkaWEgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIExlc3NlciBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMQorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfRFZCQ0FfSF8KKyNkZWZpbmUgX0RWQkNBX0hfCisKKy8qIHNsb3QgaW50ZXJmYWNlIHR5cGVzIGFuZCBpbmZvICovCisKK3R5cGVkZWYgc3RydWN0IGNhX3Nsb3RfaW5mbyB7CisJaW50IG51bTsgICAgICAgICAgICAgICAvKiBzbG90IG51bWJlciAqLworCisJaW50IHR5cGU7ICAgICAgICAgICAgICAvKiBDQSBpbnRlcmZhY2UgdGhpcyBzbG90IHN1cHBvcnRzICovCisjZGVmaW5lIENBX0NJICAgICAgICAgICAgMSAgICAgLyogQ0kgaGlnaCBsZXZlbCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQ0FfQ0lfTElOSyAgICAgICAyICAgICAvKiBDSSBsaW5rIGxheWVyIGxldmVsIGludGVyZmFjZSAqLworI2RlZmluZSBDQV9DSV9QSFlTICAgICAgIDQgICAgIC8qIENJIHBoeXNpY2FsIGxheWVyIGxldmVsIGludGVyZmFjZSAqLworI2RlZmluZSBDQV9ERVNDUiAgICAgICAgIDggICAgIC8qIGJ1aWx0LWluIGRlc2NyYW1ibGVyICovCisjZGVmaW5lIENBX1NDICAgICAgICAgIDEyOCAgICAgLyogc2ltcGxlIHNtYXJ0IGNhcmQgaW50ZXJmYWNlICovCisKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisjZGVmaW5lIENBX0NJX01PRFVMRV9QUkVTRU5UIDEgLyogbW9kdWxlIChvciBjYXJkKSBpbnNlcnRlZCAqLworI2RlZmluZSBDQV9DSV9NT0RVTEVfUkVBRFkgICAyCit9IGNhX3Nsb3RfaW5mb190OworCisKKy8qIGRlc2NyYW1ibGVyIHR5cGVzIGFuZCBpbmZvICovCisKK3R5cGVkZWYgc3RydWN0IGNhX2Rlc2NyX2luZm8geworCXVuc2lnbmVkIGludCBudW07ICAgICAgICAgIC8qIG51bWJlciBvZiBhdmFpbGFibGUgZGVzY3JhbWJsZXJzIChrZXlzKSAqLworCXVuc2lnbmVkIGludCB0eXBlOyAgICAgICAgIC8qIHR5cGUgb2Ygc3VwcG9ydGVkIHNjcmFtYmxpbmcgc3lzdGVtICovCisjZGVmaW5lIENBX0VDRCAgICAgICAgICAgMQorI2RlZmluZSBDQV9ORFMgICAgICAgICAgIDIKKyNkZWZpbmUgQ0FfRFNTICAgICAgICAgICA0Cit9IGNhX2Rlc2NyX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2FfY2FwcyB7CisJdW5zaWduZWQgaW50IHNsb3RfbnVtOyAgICAgLyogdG90YWwgbnVtYmVyIG9mIENBIGNhcmQgYW5kIG1vZHVsZSBzbG90cyAqLworCXVuc2lnbmVkIGludCBzbG90X3R5cGU7ICAgIC8qIE9SIG9mIGFsbCBzdXBwb3J0ZWQgdHlwZXMgKi8KKwl1bnNpZ25lZCBpbnQgZGVzY3JfbnVtOyAgICAvKiB0b3RhbCBudW1iZXIgb2YgZGVzY3JhbWJsZXIgc2xvdHMgKGtleXMpICovCisJdW5zaWduZWQgaW50IGRlc2NyX3R5cGU7ICAgLyogT1Igb2YgYWxsIHN1cHBvcnRlZCB0eXBlcyAqLworfSBjYV9jYXBzX3Q7CisKKy8qIGEgbWVzc2FnZSB0by9mcm9tIGEgQ0ktQ0FNICovCit0eXBlZGVmIHN0cnVjdCBjYV9tc2cgeworCXVuc2lnbmVkIGludCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgbXNnWzI1Nl07Cit9IGNhX21zZ190OworCit0eXBlZGVmIHN0cnVjdCBjYV9kZXNjciB7CisJdW5zaWduZWQgaW50IGluZGV4OworCXVuc2lnbmVkIGludCBwYXJpdHk7CS8qIDAgPT0gZXZlbiwgMSA9PSBvZGQgKi8KKwl1bnNpZ25lZCBjaGFyIGN3WzhdOworfSBjYV9kZXNjcl90OworCit0eXBlZGVmIHN0cnVjdCBjYV9waWQgeworCXVuc2lnbmVkIGludCBwaWQ7CisJaW50IGluZGV4OwkJLyogLTEgPT0gZGlzYWJsZSovCit9IGNhX3BpZF90OworCisjZGVmaW5lIENBX1JFU0VUICAgICAgICAgIF9JTygnbycsIDEyOCkKKyNkZWZpbmUgQ0FfR0VUX0NBUCAgICAgICAgX0lPUignbycsIDEyOSwgY2FfY2Fwc190KQorI2RlZmluZSBDQV9HRVRfU0xPVF9JTkZPICBfSU9SKCdvJywgMTMwLCBjYV9zbG90X2luZm9fdCkKKyNkZWZpbmUgQ0FfR0VUX0RFU0NSX0lORk8gX0lPUignbycsIDEzMSwgY2FfZGVzY3JfaW5mb190KQorI2RlZmluZSBDQV9HRVRfTVNHICAgICAgICBfSU9SKCdvJywgMTMyLCBjYV9tc2dfdCkKKyNkZWZpbmUgQ0FfU0VORF9NU0cgICAgICAgX0lPVygnbycsIDEzMywgY2FfbXNnX3QpCisjZGVmaW5lIENBX1NFVF9ERVNDUiAgICAgIF9JT1coJ28nLCAxMzQsIGNhX2Rlc2NyX3QpCisjZGVmaW5lIENBX1NFVF9QSUQgICAgICAgIF9JT1coJ28nLCAxMzUsIGNhX3BpZF90KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL2RteC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvZG14LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxZThhZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL2RteC5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogZG14LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTWFyY3VzIE1ldHpsZXIgPG1hcmN1c0Bjb252ZXJnZW5jZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgJiBSYWxwaCAgTWV0emxlciA8cmFscGhAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgZm9yIGNvbnZlcmdlbmNlIGludGVncmF0ZWQgbWVkaWEgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMQorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfRFZCRE1YX0hfCisjZGVmaW5lIF9EVkJETVhfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisKKyNkZWZpbmUgRE1YX0ZJTFRFUl9TSVpFIDE2CisKK3R5cGVkZWYgZW51bQoreworCURNWF9PVVRfREVDT0RFUiwgLyogU3RyZWFtaW5nIGRpcmVjdGx5IHRvIGRlY29kZXIuICovCisJRE1YX09VVF9UQVAsICAgICAvKiBPdXRwdXQgZ29pbmcgdG8gYSBtZW1vcnkgYnVmZmVyICovCisJCQkgLyogKHRvIGJlIHJldHJpZXZlZCB2aWEgdGhlIHJlYWQgY29tbWFuZCkuKi8KKwlETVhfT1VUX1RTX1RBUCwgIC8qIE91dHB1dCBtdWx0aXBsZXhlZCBpbnRvIGEgbmV3IFRTICAqLworCQkJIC8qICh0byBiZSByZXRyaWV2ZWQgYnkgcmVhZGluZyBmcm9tIHRoZSAqLworCQkJIC8qIGxvZ2ljYWwgRFZSIGRldmljZSkuICAgICAgICAgICAgICAgICAqLworCURNWF9PVVRfVFNERU1VWF9UQVAgLyogTGlrZSBUU19UQVAgYnV0IHJldHJpZXZlZCBmcm9tIHRoZSBETVggZGV2aWNlICovCit9IGRteF9vdXRwdXRfdDsKKworCit0eXBlZGVmIGVudW0KK3sKKwlETVhfSU5fRlJPTlRFTkQsIC8qIElucHV0IGZyb20gYSBmcm9udC1lbmQgZGV2aWNlLiAgKi8KKwlETVhfSU5fRFZSICAgICAgIC8qIElucHV0IGZyb20gdGhlIGxvZ2ljYWwgRFZSIGRldmljZS4gICovCit9IGRteF9pbnB1dF90OworCisKK3R5cGVkZWYgZW51bQoreworCURNWF9QRVNfQVVESU8wLAorCURNWF9QRVNfVklERU8wLAorCURNWF9QRVNfVEVMRVRFWFQwLAorCURNWF9QRVNfU1VCVElUTEUwLAorCURNWF9QRVNfUENSMCwKKworCURNWF9QRVNfQVVESU8xLAorCURNWF9QRVNfVklERU8xLAorCURNWF9QRVNfVEVMRVRFWFQxLAorCURNWF9QRVNfU1VCVElUTEUxLAorCURNWF9QRVNfUENSMSwKKworCURNWF9QRVNfQVVESU8yLAorCURNWF9QRVNfVklERU8yLAorCURNWF9QRVNfVEVMRVRFWFQyLAorCURNWF9QRVNfU1VCVElUTEUyLAorCURNWF9QRVNfUENSMiwKKworCURNWF9QRVNfQVVESU8zLAorCURNWF9QRVNfVklERU8zLAorCURNWF9QRVNfVEVMRVRFWFQzLAorCURNWF9QRVNfU1VCVElUTEUzLAorCURNWF9QRVNfUENSMywKKworCURNWF9QRVNfT1RIRVIKK30gZG14X3Blc190eXBlX3Q7CisKKyNkZWZpbmUgRE1YX1BFU19BVURJTyAgICBETVhfUEVTX0FVRElPMAorI2RlZmluZSBETVhfUEVTX1ZJREVPICAgIERNWF9QRVNfVklERU8wCisjZGVmaW5lIERNWF9QRVNfVEVMRVRFWFQgRE1YX1BFU19URUxFVEVYVDAKKyNkZWZpbmUgRE1YX1BFU19TVUJUSVRMRSBETVhfUEVTX1NVQlRJVExFMAorI2RlZmluZSBETVhfUEVTX1BDUiAgICAgIERNWF9QRVNfUENSMAorCisKK3R5cGVkZWYgc3RydWN0IGRteF9maWx0ZXIKK3sKKwlfX3U4ICBmaWx0ZXJbRE1YX0ZJTFRFUl9TSVpFXTsKKwlfX3U4ICBtYXNrW0RNWF9GSUxURVJfU0laRV07CisJX191OCAgbW9kZVtETVhfRklMVEVSX1NJWkVdOworfSBkbXhfZmlsdGVyX3Q7CisKKworc3RydWN0IGRteF9zY3RfZmlsdGVyX3BhcmFtcworeworCV9fdTE2ICAgICAgICAgIHBpZDsKKwlkbXhfZmlsdGVyX3QgICBmaWx0ZXI7CisJX191MzIgICAgICAgICAgdGltZW91dDsKKwlfX3UzMiAgICAgICAgICBmbGFnczsKKyNkZWZpbmUgRE1YX0NIRUNLX0NSQyAgICAgICAxCisjZGVmaW5lIERNWF9PTkVTSE9UICAgICAgICAgMgorI2RlZmluZSBETVhfSU1NRURJQVRFX1NUQVJUIDQKKyNkZWZpbmUgRE1YX0tFUk5FTF9DTElFTlQgICAweDgwMDAKK307CisKKworc3RydWN0IGRteF9wZXNfZmlsdGVyX3BhcmFtcworeworCV9fdTE2ICAgICAgICAgIHBpZDsKKwlkbXhfaW5wdXRfdCAgICBpbnB1dDsKKwlkbXhfb3V0cHV0X3QgICBvdXRwdXQ7CisJZG14X3Blc190eXBlX3QgcGVzX3R5cGU7CisJX191MzIgICAgICAgICAgZmxhZ3M7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkbXhfY2FwcyB7CisJX191MzIgY2FwczsKKwlpbnQgbnVtX2RlY29kZXJzOworfSBkbXhfY2Fwc190OworCit0eXBlZGVmIGVudW0geworCURNWF9TT1VSQ0VfRlJPTlQwID0gMCwKKwlETVhfU09VUkNFX0ZST05UMSwKKwlETVhfU09VUkNFX0ZST05UMiwKKwlETVhfU09VUkNFX0ZST05UMywKKwlETVhfU09VUkNFX0RWUjAgICA9IDE2LAorCURNWF9TT1VSQ0VfRFZSMSwKKwlETVhfU09VUkNFX0RWUjIsCisJRE1YX1NPVVJDRV9EVlIzCit9IGRteF9zb3VyY2VfdDsKKworc3RydWN0IGRteF9zdGMgeworCXVuc2lnbmVkIGludCBudW07CS8qIGlucHV0IDogd2hpY2ggU1RDPyAwLi5OICovCisJdW5zaWduZWQgaW50IGJhc2U7CS8qIG91dHB1dDogZGl2aXNvciBmb3Igc3RjIHRvIGdldCA5MCBrSHogY2xvY2sgKi8KKwlfX3U2NCBzdGM7CQkvKiBvdXRwdXQ6IHN0YyBpbiAnYmFzZScqOTAga0h6IHVuaXRzICovCit9OworCisKKyNkZWZpbmUgRE1YX1NUQVJUICAgICAgICAgICAgICAgIF9JTygnbycsIDQxKQorI2RlZmluZSBETVhfU1RPUCAgICAgICAgICAgICAgICAgX0lPKCdvJywgNDIpCisjZGVmaW5lIERNWF9TRVRfRklMVEVSICAgICAgICAgICBfSU9XKCdvJywgNDMsIHN0cnVjdCBkbXhfc2N0X2ZpbHRlcl9wYXJhbXMpCisjZGVmaW5lIERNWF9TRVRfUEVTX0ZJTFRFUiAgICAgICBfSU9XKCdvJywgNDQsIHN0cnVjdCBkbXhfcGVzX2ZpbHRlcl9wYXJhbXMpCisjZGVmaW5lIERNWF9TRVRfQlVGRkVSX1NJWkUgICAgICBfSU8oJ28nLCA0NSkKKyNkZWZpbmUgRE1YX0dFVF9QRVNfUElEUyAgICAgICAgIF9JT1IoJ28nLCA0NywgX191MTZbNV0pCisjZGVmaW5lIERNWF9HRVRfQ0FQUyAgICAgICAgICAgICBfSU9SKCdvJywgNDgsIGRteF9jYXBzX3QpCisjZGVmaW5lIERNWF9TRVRfU09VUkNFICAgICAgICAgICBfSU9XKCdvJywgNDksIGRteF9zb3VyY2VfdCkKKyNkZWZpbmUgRE1YX0dFVF9TVEMgICAgICAgICAgICAgIF9JT1dSKCdvJywgNTAsIHN0cnVjdCBkbXhfc3RjKQorI2RlZmluZSBETVhfQUREX1BJRCAgICAgICAgICAgICAgX0lPVygnbycsIDUxLCBfX3UxNikKKyNkZWZpbmUgRE1YX1JFTU9WRV9QSUQgICAgICAgICAgIF9JT1coJ28nLCA1MiwgX191MTYpCisKKyNlbmRpZiAvKl9EVkJETVhfSF8qLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL2Zyb250ZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxMDk0YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL2Zyb250ZW5kLmgKQEAgLTAsMCArMSw0MjcgQEAKKy8qCisgKiBmcm9udGVuZC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIE1hcmN1cyBNZXR6bGVyIDxtYXJjdXNAY29udmVyZ2VuY2UuZGU+CisgKgkJICAgIFJhbHBoICBNZXR6bGVyIDxyYWxwaEBjb252ZXJnZW5jZS5kZT4KKyAqCQkgICAgSG9sZ2VyIFdhZWNodGxlciA8aG9sZ2VyQGNvbnZlcmdlbmNlLmRlPgorICoJCSAgICBBbmRyZSBEcmFzemlrIDxhZEBjb252ZXJnZW5jZS5kZT4KKyAqCQkgICAgZm9yIGNvbnZlcmdlbmNlIGludGVncmF0ZWQgbWVkaWEgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMQorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfRFZCRlJPTlRFTkRfSF8KKyNkZWZpbmUgX0RWQkZST05URU5EX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCit0eXBlZGVmIGVudW0gZmVfdHlwZSB7CisJRkVfUVBTSywKKwlGRV9RQU0sCisJRkVfT0ZETSwKKwlGRV9BVFNDCit9IGZlX3R5cGVfdDsKKworCit0eXBlZGVmIGVudW0gZmVfY2FwcyB7CisJRkVfSVNfU1RVUElECQkJPSAwLAorCUZFX0NBTl9JTlZFUlNJT05fQVVUTwkJPSAweDEsCisJRkVfQ0FOX0ZFQ18xXzIJCQk9IDB4MiwKKwlGRV9DQU5fRkVDXzJfMwkJCT0gMHg0LAorCUZFX0NBTl9GRUNfM180CQkJPSAweDgsCisJRkVfQ0FOX0ZFQ180XzUJCQk9IDB4MTAsCisJRkVfQ0FOX0ZFQ181XzYJCQk9IDB4MjAsCisJRkVfQ0FOX0ZFQ182XzcJCQk9IDB4NDAsCisJRkVfQ0FOX0ZFQ183XzgJCQk9IDB4ODAsCisJRkVfQ0FOX0ZFQ184XzkJCQk9IDB4MTAwLAorCUZFX0NBTl9GRUNfQVVUTwkJCT0gMHgyMDAsCisJRkVfQ0FOX1FQU0sJCQk9IDB4NDAwLAorCUZFX0NBTl9RQU1fMTYJCQk9IDB4ODAwLAorCUZFX0NBTl9RQU1fMzIJCQk9IDB4MTAwMCwKKwlGRV9DQU5fUUFNXzY0CQkJPSAweDIwMDAsCisJRkVfQ0FOX1FBTV8xMjgJCQk9IDB4NDAwMCwKKwlGRV9DQU5fUUFNXzI1NgkJCT0gMHg4MDAwLAorCUZFX0NBTl9RQU1fQVVUTwkJCT0gMHgxMDAwMCwKKwlGRV9DQU5fVFJBTlNNSVNTSU9OX01PREVfQVVUTwk9IDB4MjAwMDAsCisJRkVfQ0FOX0JBTkRXSURUSF9BVVRPCQk9IDB4NDAwMDAsCisJRkVfQ0FOX0dVQVJEX0lOVEVSVkFMX0FVVE8JPSAweDgwMDAwLAorCUZFX0NBTl9ISUVSQVJDSFlfQVVUTwkJPSAweDEwMDAwMCwKKwlGRV9DQU5fOFZTQgkJCT0gMHgyMDAwMDAsCisJRkVfQ0FOXzE2VlNCCQkJPSAweDQwMDAwMCwKKwlGRV9IQVNfRVhURU5ERURfQ0FQUwkJPSAweDgwMDAwMCwgICAvKiBXZSBuZWVkIG1vcmUgYml0c3BhY2UgZm9yIG5ld2VyIEFQSXMsIGluZGljYXRlIHRoaXMuICovCisJRkVfQ0FOX1RVUkJPX0ZFQwkJPSAweDgwMDAwMDAsICAvKiBmcm9udGVuZCBzdXBwb3J0cyAidHVyYm8gZmVjIG1vZHVsYXRpb24iICovCisJRkVfQ0FOXzJHX01PRFVMQVRJT04JCT0gMHgxMDAwMDAwMCwgLyogZnJvbnRlbmQgc3VwcG9ydHMgIjJuZCBnZW5lcmF0aW9uIG1vZHVsYXRpb24iIChEVkItUzIpICovCisJRkVfTkVFRFNfQkVORElORwkJPSAweDIwMDAwMDAwLCAvKiBub3Qgc3VwcG9ydGVkIGFueW1vcmUsIGRvbid0IHVzZSAoZnJvbnRlbmQgcmVxdWlyZXMgZnJlcXVlbmN5IGJlbmRpbmcpICovCisJRkVfQ0FOX1JFQ09WRVIJCQk9IDB4NDAwMDAwMDAsIC8qIGZyb250ZW5kIGNhbiByZWNvdmVyIGZyb20gYSBjYWJsZSB1bnBsdWcgYXV0b21hdGljYWxseSAqLworCUZFX0NBTl9NVVRFX1RTCQkJPSAweDgwMDAwMDAwICAvKiBmcm9udGVuZCBjYW4gc3RvcCBzcHVyaW91cyBUUyBkYXRhIG91dHB1dCAqLworfSBmZV9jYXBzX3Q7CisKKworc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvIHsKKwljaGFyICAgICAgIG5hbWVbMTI4XTsKKwlmZV90eXBlX3QgIHR5cGU7CisJX191MzIgICAgICBmcmVxdWVuY3lfbWluOworCV9fdTMyICAgICAgZnJlcXVlbmN5X21heDsKKwlfX3UzMiAgICAgIGZyZXF1ZW5jeV9zdGVwc2l6ZTsKKwlfX3UzMiAgICAgIGZyZXF1ZW5jeV90b2xlcmFuY2U7CisJX191MzIgICAgICBzeW1ib2xfcmF0ZV9taW47CisJX191MzIgICAgICBzeW1ib2xfcmF0ZV9tYXg7CisJX191MzIgICAgICBzeW1ib2xfcmF0ZV90b2xlcmFuY2U7CS8qIHBwbSAqLworCV9fdTMyICAgICAgbm90aWZpZXJfZGVsYXk7CQkvKiBERVBSRUNBVEVEICovCisJZmVfY2Fwc190ICBjYXBzOworfTsKKworCisvKioKKyAqICBDaGVjayBvdXQgdGhlIERpU0VxQyBidXMgc3BlYyBhdmFpbGFibGUgb24gaHR0cDovL3d3dy5ldXRlbHNhdC5vcmcvIGZvcgorICogIHRoZSBtZWFuaW5nIG9mIHRoaXMgc3RydWN0Li4uCisgKi8KK3N0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgeworCV9fdTggbXNnIFs2XTsJLyogIHsgZnJhbWluZywgYWRkcmVzcywgY29tbWFuZCwgZGF0YSBbM10gfSAqLworCV9fdTggbXNnX2xlbjsJLyogIHZhbGlkIHZhbHVlcyBhcmUgMy4uLjYgICovCit9OworCisKK3N0cnVjdCBkdmJfZGlzZXFjX3NsYXZlX3JlcGx5IHsKKwlfX3U4IG1zZyBbNF07CS8qICB7IGZyYW1pbmcsIGRhdGEgWzNdIH0gKi8KKwlfX3U4IG1zZ19sZW47CS8qICB2YWxpZCB2YWx1ZXMgYXJlIDAuLi40LCAwIG1lYW5zIG5vIG1zZyAgKi8KKwlpbnQgIHRpbWVvdXQ7CS8qICByZXR1cm4gZnJvbSBpb2N0bCBhZnRlciB0aW1lb3V0IG1zIHdpdGggKi8KK307CQkJLyogIGVycm9yY29kZSB3aGVuIG5vIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkICAqLworCisKK3R5cGVkZWYgZW51bSBmZV9zZWNfdm9sdGFnZSB7CisJU0VDX1ZPTFRBR0VfMTMsCisJU0VDX1ZPTFRBR0VfMTgsCisJU0VDX1ZPTFRBR0VfT0ZGCit9IGZlX3NlY192b2x0YWdlX3Q7CisKKwordHlwZWRlZiBlbnVtIGZlX3NlY190b25lX21vZGUgeworCVNFQ19UT05FX09OLAorCVNFQ19UT05FX09GRgorfSBmZV9zZWNfdG9uZV9tb2RlX3Q7CisKKwordHlwZWRlZiBlbnVtIGZlX3NlY19taW5pX2NtZCB7CisJU0VDX01JTklfQSwKKwlTRUNfTUlOSV9CCit9IGZlX3NlY19taW5pX2NtZF90OworCisKK3R5cGVkZWYgZW51bSBmZV9zdGF0dXMgeworCUZFX0hBU19TSUdOQUwJPSAweDAxLCAgIC8qIGZvdW5kIHNvbWV0aGluZyBhYm92ZSB0aGUgbm9pc2UgbGV2ZWwgKi8KKwlGRV9IQVNfQ0FSUklFUgk9IDB4MDIsICAgLyogZm91bmQgYSBEVkIgc2lnbmFsICAqLworCUZFX0hBU19WSVRFUkJJCT0gMHgwNCwgICAvKiBGRUMgaXMgc3RhYmxlICAqLworCUZFX0hBU19TWU5DCT0gMHgwOCwgICAvKiBmb3VuZCBzeW5jIGJ5dGVzICAqLworCUZFX0hBU19MT0NLCT0gMHgxMCwgICAvKiBldmVyeXRoaW5nJ3Mgd29ya2luZy4uLiAqLworCUZFX1RJTUVET1VUCT0gMHgyMCwgICAvKiBubyBsb2NrIHdpdGhpbiB0aGUgbGFzdCB+MiBzZWNvbmRzICovCisJRkVfUkVJTklUCT0gMHg0MCAgICAvKiBmcm9udGVuZCB3YXMgcmVpbml0aWFsaXplZCwgICovCit9IGZlX3N0YXR1c190OwkJCSAgLyogYXBwbGljYXRpb24gaXMgcmVjb21tZW5kZWQgdG8gcmVzZXQgKi8KKwkJCQkgIC8qIERpU0VxQywgdG9uZSBhbmQgcGFyYW1ldGVycyAqLworCit0eXBlZGVmIGVudW0gZmVfc3BlY3RyYWxfaW52ZXJzaW9uIHsKKwlJTlZFUlNJT05fT0ZGLAorCUlOVkVSU0lPTl9PTiwKKwlJTlZFUlNJT05fQVVUTworfSBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdDsKKworCit0eXBlZGVmIGVudW0gZmVfY29kZV9yYXRlIHsKKwlGRUNfTk9ORSA9IDAsCisJRkVDXzFfMiwKKwlGRUNfMl8zLAorCUZFQ18zXzQsCisJRkVDXzRfNSwKKwlGRUNfNV82LAorCUZFQ182XzcsCisJRkVDXzdfOCwKKwlGRUNfOF85LAorCUZFQ19BVVRPLAorCUZFQ18zXzUsCisJRkVDXzlfMTAsCit9IGZlX2NvZGVfcmF0ZV90OworCisKK3R5cGVkZWYgZW51bSBmZV9tb2R1bGF0aW9uIHsKKwlRUFNLLAorCVFBTV8xNiwKKwlRQU1fMzIsCisJUUFNXzY0LAorCVFBTV8xMjgsCisJUUFNXzI1NiwKKwlRQU1fQVVUTywKKwlWU0JfOCwKKwlWU0JfMTYsCisJUFNLXzgsCisJQVBTS18xNiwKKwlBUFNLXzMyLAorCURRUFNLLAorfSBmZV9tb2R1bGF0aW9uX3Q7CisKK3R5cGVkZWYgZW51bSBmZV90cmFuc21pdF9tb2RlIHsKKwlUUkFOU01JU1NJT05fTU9ERV8ySywKKwlUUkFOU01JU1NJT05fTU9ERV84SywKKwlUUkFOU01JU1NJT05fTU9ERV9BVVRPLAorCVRSQU5TTUlTU0lPTl9NT0RFXzRLLAorCVRSQU5TTUlTU0lPTl9NT0RFXzFLLAorCVRSQU5TTUlTU0lPTl9NT0RFXzE2SywKKwlUUkFOU01JU1NJT05fTU9ERV8zMkssCit9IGZlX3RyYW5zbWl0X21vZGVfdDsKKwordHlwZWRlZiBlbnVtIGZlX2JhbmR3aWR0aCB7CisJQkFORFdJRFRIXzhfTUhaLAorCUJBTkRXSURUSF83X01IWiwKKwlCQU5EV0lEVEhfNl9NSFosCisJQkFORFdJRFRIX0FVVE8sCisJQkFORFdJRFRIXzVfTUhaLAorCUJBTkRXSURUSF8xMF9NSFosCisJQkFORFdJRFRIXzFfNzEyX01IWiwKK30gZmVfYmFuZHdpZHRoX3Q7CisKKwordHlwZWRlZiBlbnVtIGZlX2d1YXJkX2ludGVydmFsIHsKKwlHVUFSRF9JTlRFUlZBTF8xXzMyLAorCUdVQVJEX0lOVEVSVkFMXzFfMTYsCisJR1VBUkRfSU5URVJWQUxfMV84LAorCUdVQVJEX0lOVEVSVkFMXzFfNCwKKwlHVUFSRF9JTlRFUlZBTF9BVVRPLAorCUdVQVJEX0lOVEVSVkFMXzFfMTI4LAorCUdVQVJEX0lOVEVSVkFMXzE5XzEyOCwKKwlHVUFSRF9JTlRFUlZBTF8xOV8yNTYsCit9IGZlX2d1YXJkX2ludGVydmFsX3Q7CisKKwordHlwZWRlZiBlbnVtIGZlX2hpZXJhcmNoeSB7CisJSElFUkFSQ0hZX05PTkUsCisJSElFUkFSQ0hZXzEsCisJSElFUkFSQ0hZXzIsCisJSElFUkFSQ0hZXzQsCisJSElFUkFSQ0hZX0FVVE8KK30gZmVfaGllcmFyY2h5X3Q7CisKKworc3RydWN0IGR2Yl9xcHNrX3BhcmFtZXRlcnMgeworCV9fdTMyCQlzeW1ib2xfcmF0ZTsgIC8qIHN5bWJvbCByYXRlIGluIFN5bWJvbHMgcGVyIHNlY29uZCAqLworCWZlX2NvZGVfcmF0ZV90CWZlY19pbm5lcjsgICAgLyogZm9yd2FyZCBlcnJvciBjb3JyZWN0aW9uIChzZWUgYWJvdmUpICovCit9OworCitzdHJ1Y3QgZHZiX3FhbV9wYXJhbWV0ZXJzIHsKKwlfX3UzMgkJc3ltYm9sX3JhdGU7IC8qIHN5bWJvbCByYXRlIGluIFN5bWJvbHMgcGVyIHNlY29uZCAqLworCWZlX2NvZGVfcmF0ZV90CWZlY19pbm5lcjsgICAvKiBmb3J3YXJkIGVycm9yIGNvcnJlY3Rpb24gKHNlZSBhYm92ZSkgKi8KKwlmZV9tb2R1bGF0aW9uX3QJbW9kdWxhdGlvbjsgIC8qIG1vZHVsYXRpb24gdHlwZSAoc2VlIGFib3ZlKSAqLworfTsKKworc3RydWN0IGR2Yl92c2JfcGFyYW1ldGVycyB7CisJZmVfbW9kdWxhdGlvbl90CW1vZHVsYXRpb247ICAvKiBtb2R1bGF0aW9uIHR5cGUgKHNlZSBhYm92ZSkgKi8KK307CisKK3N0cnVjdCBkdmJfb2ZkbV9wYXJhbWV0ZXJzIHsKKwlmZV9iYW5kd2lkdGhfdCAgICAgIGJhbmR3aWR0aDsKKwlmZV9jb2RlX3JhdGVfdCAgICAgIGNvZGVfcmF0ZV9IUDsgIC8qIGhpZ2ggcHJpb3JpdHkgc3RyZWFtIGNvZGUgcmF0ZSAqLworCWZlX2NvZGVfcmF0ZV90ICAgICAgY29kZV9yYXRlX0xQOyAgLyogbG93IHByaW9yaXR5IHN0cmVhbSBjb2RlIHJhdGUgKi8KKwlmZV9tb2R1bGF0aW9uX3QgICAgIGNvbnN0ZWxsYXRpb247IC8qIG1vZHVsYXRpb24gdHlwZSAoc2VlIGFib3ZlKSAqLworCWZlX3RyYW5zbWl0X21vZGVfdCAgdHJhbnNtaXNzaW9uX21vZGU7CisJZmVfZ3VhcmRfaW50ZXJ2YWxfdCBndWFyZF9pbnRlcnZhbDsKKwlmZV9oaWVyYXJjaHlfdCAgICAgIGhpZXJhcmNoeV9pbmZvcm1hdGlvbjsKK307CisKKworc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzIHsKKwlfX3UzMiBmcmVxdWVuY3k7ICAgICAvKiAoYWJzb2x1dGUpIGZyZXF1ZW5jeSBpbiBIeiBmb3IgUUFNL09GRE0vQVRTQyAqLworCQkJICAgICAvKiBpbnRlcm1lZGlhdGUgZnJlcXVlbmN5IGluIGtIeiBmb3IgUVBTSyAqLworCWZlX3NwZWN0cmFsX2ludmVyc2lvbl90IGludmVyc2lvbjsKKwl1bmlvbiB7CisJCXN0cnVjdCBkdmJfcXBza19wYXJhbWV0ZXJzIHFwc2s7CisJCXN0cnVjdCBkdmJfcWFtX3BhcmFtZXRlcnMgIHFhbTsKKwkJc3RydWN0IGR2Yl9vZmRtX3BhcmFtZXRlcnMgb2ZkbTsKKwkJc3RydWN0IGR2Yl92c2JfcGFyYW1ldGVycyB2c2I7CisJfSB1OworfTsKKworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kX2V2ZW50IHsKKwlmZV9zdGF0dXNfdCBzdGF0dXM7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzIHBhcmFtZXRlcnM7Cit9OworCisvKiBTMkFQSSBDb21tYW5kcyAqLworI2RlZmluZSBEVFZfVU5ERUZJTkVECQkwCisjZGVmaW5lIERUVl9UVU5FCQkxCisjZGVmaW5lIERUVl9DTEVBUgkJMgorI2RlZmluZSBEVFZfRlJFUVVFTkNZCQkzCisjZGVmaW5lIERUVl9NT0RVTEFUSU9OCQk0CisjZGVmaW5lIERUVl9CQU5EV0lEVEhfSFoJNQorI2RlZmluZSBEVFZfSU5WRVJTSU9OCQk2CisjZGVmaW5lIERUVl9ESVNFUUNfTUFTVEVSCTcKKyNkZWZpbmUgRFRWX1NZTUJPTF9SQVRFCQk4CisjZGVmaW5lIERUVl9JTk5FUl9GRUMJCTkKKyNkZWZpbmUgRFRWX1ZPTFRBR0UJCTEwCisjZGVmaW5lIERUVl9UT05FCQkxMQorI2RlZmluZSBEVFZfUElMT1QJCTEyCisjZGVmaW5lIERUVl9ST0xMT0ZGCQkxMworI2RlZmluZSBEVFZfRElTRVFDX1NMQVZFX1JFUExZCTE0CisKKy8qIEJhc2ljIGVudW1lcmF0aW9uIHNldCBmb3IgcXVlcnlpbmcgdW5saW1pdGVkIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBEVFZfRkVfQ0FQQUJJTElUWV9DT1VOVAkxNQorI2RlZmluZSBEVFZfRkVfQ0FQQUJJTElUWQkxNgorI2RlZmluZSBEVFZfREVMSVZFUllfU1lTVEVNCTE3CisKKy8qIElTREItVCBhbmQgSVNEQi1Uc2IgKi8KKyNkZWZpbmUgRFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OCTE4CisjZGVmaW5lIERUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkcJMTkKKworI2RlZmluZSBEVFZfSVNEQlRfU0JfU1VCQ0hBTk5FTF9JRAkyMAorI2RlZmluZSBEVFZfSVNEQlRfU0JfU0VHTUVOVF9JRFgJMjEKKyNkZWZpbmUgRFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQJMjIKKworI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJBX0ZFQwkJCTIzCisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfTU9EVUxBVElPTgkJMjQKKyNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQV9TRUdNRU5UX0NPVU5UCQkyNQorI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJBX1RJTUVfSU5URVJMRUFWSU5HCTI2CisKKyNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQl9GRUMJCQkyNworI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJCX01PRFVMQVRJT04JCTI4CisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkJfU0VHTUVOVF9DT1VOVAkJMjkKKyNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQl9USU1FX0lOVEVSTEVBVklORwkzMAorCisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfRkVDCQkJMzEKKyNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQ19NT0RVTEFUSU9OCQkzMgorI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJDX1NFR01FTlRfQ09VTlQJCTMzCisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfVElNRV9JTlRFUkxFQVZJTkcJMzQKKworI2RlZmluZSBEVFZfQVBJX1ZFUlNJT04JCTM1CisKKyNkZWZpbmUgRFRWX0NPREVfUkFURV9IUAkzNgorI2RlZmluZSBEVFZfQ09ERV9SQVRFX0xQCTM3CisjZGVmaW5lIERUVl9HVUFSRF9JTlRFUlZBTAkzOAorI2RlZmluZSBEVFZfVFJBTlNNSVNTSU9OX01PREUJMzkKKyNkZWZpbmUgRFRWX0hJRVJBUkNIWQkJNDAKKworI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJfRU5BQkxFRAk0MQorCisjZGVmaW5lIERUVl9JU0RCU19UU19JRAkJNDIKKworI2RlZmluZSBEVFZfRFZCVDJfUExQX0lECTQzCisKKyNkZWZpbmUgRFRWX01BWF9DT01NQU5ECQkJCURUVl9EVkJUMl9QTFBfSUQKKwordHlwZWRlZiBlbnVtIGZlX3BpbG90IHsKKwlQSUxPVF9PTiwKKwlQSUxPVF9PRkYsCisJUElMT1RfQVVUTywKK30gZmVfcGlsb3RfdDsKKwordHlwZWRlZiBlbnVtIGZlX3JvbGxvZmYgeworCVJPTExPRkZfMzUsIC8qIEltcGxpZWQgdmFsdWUgaW4gRFZCLVMsIGRlZmF1bHQgZm9yIERWQi1TMiAqLworCVJPTExPRkZfMjAsCisJUk9MTE9GRl8yNSwKKwlST0xMT0ZGX0FVVE8sCit9IGZlX3JvbGxvZmZfdDsKKwordHlwZWRlZiBlbnVtIGZlX2RlbGl2ZXJ5X3N5c3RlbSB7CisJU1lTX1VOREVGSU5FRCwKKwlTWVNfRFZCQ19BTk5FWF9BQywKKwlTWVNfRFZCQ19BTk5FWF9CLAorCVNZU19EVkJULAorCVNZU19EU1MsCisJU1lTX0RWQlMsCisJU1lTX0RWQlMyLAorCVNZU19EVkJILAorCVNZU19JU0RCVCwKKwlTWVNfSVNEQlMsCisJU1lTX0lTREJDLAorCVNZU19BVFNDLAorCVNZU19BVFNDTUgsCisJU1lTX0RNQlRILAorCVNZU19DTU1CLAorCVNZU19EQUIsCisJU1lTX0RWQlQyLAorCVNZU19UVVJCTywKK30gZmVfZGVsaXZlcnlfc3lzdGVtX3Q7CisKK3N0cnVjdCBkdHZfY21kc19oIHsKKwljaGFyCSpuYW1lOwkJLyogQSBkaXNwbGF5IG5hbWUgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyAqLworCisJX191MzIJY21kOwkJLyogQSB1bmlxdWUgSUQgKi8KKworCS8qIEZsYWdzICovCisJX191MzIJc2V0OjE7CQkvKiBFaXRoZXIgYSBzZXQgb3IgZ2V0IHByb3BlcnR5ICovCisJX191MzIJYnVmZmVyOjE7CS8qIERvZXMgdGhpcyBwcm9wZXJ0eSB1c2UgdGhlIGJ1ZmZlcj8gKi8KKwlfX3UzMglyZXNlcnZlZDozMDsJLyogQWxpZ24gKi8KK307CisKK3N0cnVjdCBkdHZfcHJvcGVydHkgeworCV9fdTMyIGNtZDsKKwlfX3UzMiByZXNlcnZlZFszXTsKKwl1bmlvbiB7CisJCV9fdTMyIGRhdGE7CisJCXN0cnVjdCB7CisJCQlfX3U4IGRhdGFbMzJdOworCQkJX191MzIgbGVuOworCQkJX191MzIgcmVzZXJ2ZWQxWzNdOworCQkJdm9pZCAqcmVzZXJ2ZWQyOworCQl9IGJ1ZmZlcjsKKwl9IHU7CisJaW50IHJlc3VsdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBudW0gb2YgcHJvcGVydGllcyBjYW5ub3QgZXhjZWVkIERUVl9JT0NUTF9NQVhfTVNHUyBwZXIgaW9jdGwgKi8KKyNkZWZpbmUgRFRWX0lPQ1RMX01BWF9NU0dTIDY0CisKK3N0cnVjdCBkdHZfcHJvcGVydGllcyB7CisJX191MzIgbnVtOworCXN0cnVjdCBkdHZfcHJvcGVydHkgKnByb3BzOworfTsKKworI2RlZmluZSBGRV9TRVRfUFJPUEVSVFkJCSAgIF9JT1coJ28nLCA4Miwgc3RydWN0IGR0dl9wcm9wZXJ0aWVzKQorI2RlZmluZSBGRV9HRVRfUFJPUEVSVFkJCSAgIF9JT1IoJ28nLCA4Mywgc3RydWN0IGR0dl9wcm9wZXJ0aWVzKQorCisKKy8qKgorICogV2hlbiBzZXQsIHRoaXMgZmxhZyB3aWxsIGRpc2FibGUgYW55IHppZ3phZ2dpbmcgb3Igb3RoZXIgIm5vcm1hbCIgdHVuaW5nCisgKiBiZWhhdmlvdXIuIEFkZGl0aW9uYWxseSwgdGhlcmUgd2lsbCBiZSBubyBhdXRvbWF0aWMgbW9uaXRvcmluZyBvZiB0aGUgbG9jaworICogc3RhdHVzLCBhbmQgaGVuY2Ugbm8gZnJvbnRlbmQgZXZlbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBJZiBhIGZyb250ZW5kIGRldmljZQorICogaXMgY2xvc2VkLCB0aGlzIGZsYWcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvZmYgd2hlbiB0aGUgZGV2aWNlIGlzCisgKiByZW9wZW5lZCByZWFkLXdyaXRlLgorICovCisjZGVmaW5lIEZFX1RVTkVfTU9ERV9PTkVTSE9UIDB4MDEKKworCisjZGVmaW5lIEZFX0dFVF9JTkZPCQkgICBfSU9SKCdvJywgNjEsIHN0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbykKKworI2RlZmluZSBGRV9ESVNFUUNfUkVTRVRfT1ZFUkxPQUQgICBfSU8oJ28nLCA2MikKKyNkZWZpbmUgRkVfRElTRVFDX1NFTkRfTUFTVEVSX0NNRCAgX0lPVygnbycsIDYzLCBzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kKQorI2RlZmluZSBGRV9ESVNFUUNfUkVDVl9TTEFWRV9SRVBMWSBfSU9SKCdvJywgNjQsIHN0cnVjdCBkdmJfZGlzZXFjX3NsYXZlX3JlcGx5KQorI2RlZmluZSBGRV9ESVNFUUNfU0VORF9CVVJTVCAgICAgICBfSU8oJ28nLCA2NSkgIC8qIGZlX3NlY19taW5pX2NtZF90ICovCisKKyNkZWZpbmUgRkVfU0VUX1RPTkUJCSAgIF9JTygnbycsIDY2KSAgLyogZmVfc2VjX3RvbmVfbW9kZV90ICovCisjZGVmaW5lIEZFX1NFVF9WT0xUQUdFCQkgICBfSU8oJ28nLCA2NykgIC8qIGZlX3NlY192b2x0YWdlX3QgKi8KKyNkZWZpbmUgRkVfRU5BQkxFX0hJR0hfTE5CX1ZPTFRBR0UgX0lPKCdvJywgNjgpICAvKiBpbnQgKi8KKworI2RlZmluZSBGRV9SRUFEX1NUQVRVUwkJICAgX0lPUignbycsIDY5LCBmZV9zdGF0dXNfdCkKKyNkZWZpbmUgRkVfUkVBRF9CRVIJCSAgIF9JT1IoJ28nLCA3MCwgX191MzIpCisjZGVmaW5lIEZFX1JFQURfU0lHTkFMX1NUUkVOR1RIICAgIF9JT1IoJ28nLCA3MSwgX191MTYpCisjZGVmaW5lIEZFX1JFQURfU05SCQkgICBfSU9SKCdvJywgNzIsIF9fdTE2KQorI2RlZmluZSBGRV9SRUFEX1VOQ09SUkVDVEVEX0JMT0NLUyBfSU9SKCdvJywgNzMsIF9fdTMyKQorCisjZGVmaW5lIEZFX1NFVF9GUk9OVEVORAkJICAgX0lPVygnbycsIDc2LCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMpCisjZGVmaW5lIEZFX0dFVF9GUk9OVEVORAkJICAgX0lPUignbycsIDc3LCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMpCisjZGVmaW5lIEZFX1NFVF9GUk9OVEVORF9UVU5FX01PREUgIF9JTygnbycsIDgxKSAvKiB1bnNpZ25lZCBpbnQgKi8KKyNkZWZpbmUgRkVfR0VUX0VWRU5UCQkgICBfSU9SKCdvJywgNzgsIHN0cnVjdCBkdmJfZnJvbnRlbmRfZXZlbnQpCisKKyNkZWZpbmUgRkVfRElTSE5FVFdPUktfU0VORF9MRUdBQ1lfQ01EIF9JTygnbycsIDgwKSAvKiB1bnNpZ25lZCBpbnQgKi8KKworI2VuZGlmIC8qX0RWQkZST05URU5EX0hfKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL25ldC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1MWU3ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL25ldC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBuZXQuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBNYXJjdXMgTWV0emxlciA8bWFyY3VzQGNvbnZlcmdlbmNlLmRlPgorICogICAgICAgICAgICAgICAgICAmIFJhbHBoICBNZXR6bGVyIDxyYWxwaEBjb252ZXJnZW5jZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgICBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EVkJORVRfSF8KKyNkZWZpbmUgX0RWQk5FVF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGR2Yl9uZXRfaWYgeworCV9fdTE2IHBpZDsKKwlfX3UxNiBpZl9udW07CisJX191OCAgZmVlZHR5cGU7CisjZGVmaW5lIERWQl9ORVRfRkVFRFRZUEVfTVBFIDAJLyogbXVsdGkgcHJvdG9jb2wgZW5jYXBzdWxhdGlvbiAqLworI2RlZmluZSBEVkJfTkVUX0ZFRURUWVBFX1VMRSAxCS8qIHVsdHJhIGxpZ2h0d2VpZ2h0IGVuY2Fwc3VsYXRpb24gKi8KK307CisKKworI2RlZmluZSBORVRfQUREX0lGICAgIF9JT1dSKCdvJywgNTIsIHN0cnVjdCBkdmJfbmV0X2lmKQorI2RlZmluZSBORVRfUkVNT1ZFX0lGIF9JTygnbycsIDUzKQorI2RlZmluZSBORVRfR0VUX0lGICAgIF9JT1dSKCdvJywgNTQsIHN0cnVjdCBkdmJfbmV0X2lmKQorCisKKy8qIGJpbmFyeSBjb21wYXRpYmlsaXR5IGNydWZ0OiAqLworc3RydWN0IF9fZHZiX25ldF9pZl9vbGQgeworCV9fdTE2IHBpZDsKKwlfX3UxNiBpZl9udW07Cit9OworI2RlZmluZSBfX05FVF9BRERfSUZfT0xEIF9JT1dSKCdvJywgNTIsIHN0cnVjdCBfX2R2Yl9uZXRfaWZfb2xkKQorI2RlZmluZSBfX05FVF9HRVRfSUZfT0xEIF9JT1dSKCdvJywgNTQsIHN0cnVjdCBfX2R2Yl9uZXRfaWZfb2xkKQorCisKKyNlbmRpZiAvKl9EVkJORVRfSF8qLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvb3NkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9vc2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjhjN2NiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvb3NkLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBvc2QuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBSYWxwaCAgTWV0emxlciA8cmFscGhAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICYgTWFyY3VzIE1ldHpsZXIgPG1hcmN1c0Bjb252ZXJnZW5jZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgICBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgTGVzc2VyIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EVkJPU0RfSF8KKyNkZWZpbmUgX0RWQk9TRF9IXworCisKKwordHlwZWRlZiBlbnVtIHsKKyAgLy8gQWxsIGZ1bmN0aW9ucyByZXR1cm4gLTIgb24gIm5vdCBvcGVuIgorICBPU0RfQ2xvc2U9MSwgICAgLy8gKCkKKyAgLy8gRGlzYWJsZXMgT1NEIGFuZCByZWxlYXNlcyB0aGUgYnVmZmVycworICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcworICBPU0RfT3BlbiwgICAgICAgLy8gKHgwLHkwLHgxLHkxLEJpdFBlclBpeGVsWzIvNC84XShjb2xvciYweDBGKSxtaXhbMC4uMTVdKGNvbG9yJjB4RjApKQorICAvLyBPcGVucyBPU0Qgd2l0aCB0aGlzIHNpemUgYW5kIGJpdCBkZXB0aAorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gRFJBTSBhbGxvY2F0aW9uIGVycm9yLCAtMiBvbiAiYWxyZWFkeSBvcGVuIgorICBPU0RfU2hvdywgICAgICAgLy8gKCkKKyAgLy8gZW5hYmxlcyBPU0QgbW9kZQorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcworICBPU0RfSGlkZSwgICAgICAgLy8gKCkKKyAgLy8gZGlzYWJsZXMgT1NEIG1vZGUKKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgT1NEX0NsZWFyLCAgICAgIC8vICgpCisgIC8vIFNldHMgYWxsIHBpeGVsIHRvIGNvbG9yIDAKKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgT1NEX0ZpbGwsICAgICAgIC8vIChjb2xvcikKKyAgLy8gU2V0cyBhbGwgcGl4ZWwgdG8gY29sb3IgPGNvbD4KKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgT1NEX1NldENvbG9yLCAgIC8vIChjb2xvcixSe3gwfSxHe3kwfSxCe3gxfSxvcGFjaXR5e3kxfSkKKyAgLy8gc2V0IHBhbGV0dGUgZW50cnkgPG51bT4gdG8gPHIsZyxiPiwgPG1peD4gYW5kIDx0cmFucz4gYXBwbHkKKyAgLy8gUixHLEI6IDAuLjI1NQorICAvLyBSPVJlZCwgRz1HcmVlbiwgQj1CbHVlCisgIC8vIG9wYWNpdHk9MDogICAgICBwaXhlbCBvcGFjaXR5IDAlIChvbmx5IHZpZGVvIHBpeGVsIHNob3dzKQorICAvLyBvcGFjaXR5PTEuLjI1NDogcGl4ZWwgb3BhY2l0eSBhcyBzcGVjaWZpZWQgaW4gaGVhZGVyCisgIC8vIG9wYWNpdHk9MjU1OiAgICBwaXhlbCBvcGFjaXR5IDEwMCUgKG9ubHkgT1NEIHBpeGVsIHNob3dzKQorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKyAgT1NEX1NldFBhbGV0dGUsIC8vIChmaXJzdGNvbG9ye2NvbG9yfSxsYXN0Y29sb3J7eDB9LGRhdGEpCisgIC8vIFNldCBhIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwYWxldHRlCisgIC8vIHNldHMgdGhlIGVudHJpZXMgImZpcnN0Y29sb3IiIHRocm91Z2ggImxhc3Rjb2xvciIgZnJvbSB0aGUgYXJyYXkgImRhdGEiCisgIC8vIGRhdGEgaGFzIDQgYnl0ZSBmb3IgZWFjaCBjb2xvcjoKKyAgLy8gUixHLEIsIGFuZCBhIG9wYWNpdHkgdmFsdWU6IDAtPnRyYW5zcGFyZW50LCAxLi4yNTQtPm1peCwgMjU1LT5waXhlbAorICBPU0RfU2V0VHJhbnMsICAgLy8gKHRyYW5zcGFyZW5jeXtjb2xvcn0pCisgIC8vIFNldHMgdHJhbnNwYXJlbmN5IG9mIG1peGVkIHBpeGVsICgwLi4xNSkKKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgT1NEX1NldFBpeGVsLCAgIC8vICh4MCx5MCxjb2xvcikKKyAgLy8gc2V0cyBwaXhlbCA8eD4sPHk+IHRvIGNvbG9yIG51bWJlciA8Y29sPgorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKyAgT1NEX0dldFBpeGVsLCAgIC8vICh4MCx5MCkKKyAgLy8gcmV0dXJucyBjb2xvciBudW1iZXIgb2YgcGl4ZWwgPHg+LDx5PiwgIG9yIC0xCisgIE9TRF9TZXRSb3csICAgICAvLyAoeDAseTAseDEsZGF0YSkKKyAgLy8gZmlsbHMgcGl4ZWxzIHgwLHkgdGhyb3VnaCAgeDEseSB3aXRoIHRoZSBjb250ZW50IG9mIGRhdGFbXQorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gY2xpcHBpbmcgYWxsIHBpeGVsIChubyBwaXhlbCBkcmF3bikKKyAgT1NEX1NldEJsb2NrLCAgIC8vICh4MCx5MCx4MSx5MSxpbmNyZW1lbnR7Y29sb3J9LGRhdGEpCisgIC8vIGZpbGxzIHBpeGVscyB4MCx5MCB0aHJvdWdoICB4MSx5MSB3aXRoIHRoZSBjb250ZW50IG9mIGRhdGFbXQorICAvLyBpbmMgY29udGFpbnMgdGhlIHdpZHRoIG9mIG9uZSBsaW5lIGluIHRoZSBkYXRhIGJsb2NrLAorICAvLyBpbmM8PTAgdXNlcyBibG9ja3dpZHRoIGFzIGxpbmV3aWR0aAorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gY2xpcHBpbmcgYWxsIHBpeGVsCisgIE9TRF9GaWxsUm93LCAgICAvLyAoeDAseTAseDEsY29sb3IpCisgIC8vIGZpbGxzIHBpeGVscyB4MCx5IHRocm91Z2ggIHgxLHkgd2l0aCB0aGUgY29sb3IgPGNvbD4KKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGNsaXBwaW5nIGFsbCBwaXhlbAorICBPU0RfRmlsbEJsb2NrLCAgLy8gKHgwLHkwLHgxLHkxLGNvbG9yKQorICAvLyBmaWxscyBwaXhlbHMgeDAseTAgdGhyb3VnaCAgeDEseTEgd2l0aCB0aGUgY29sb3IgPGNvbD4KKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGNsaXBwaW5nIGFsbCBwaXhlbAorICBPU0RfTGluZSwgICAgICAgLy8gKHgwLHkwLHgxLHkxLGNvbG9yKQorICAvLyBkcmF3IGEgbGluZSBmcm9tIHgwLHkwIHRvIHgxLHkxIHdpdGggdGhlIGNvbG9yIDxjb2w+CisgIC8vIHJldHVybnMgMCBvbiBzdWNjZXNzCisgIE9TRF9RdWVyeSwgICAgICAvLyAoeDAseTAseDEseTEseGFzcHtjb2xvcn19KSwgeWFzcD0xMQorICAvLyBmaWxscyBwYXJhbWV0ZXJzIHdpdGggdGhlIHBpY3R1cmUgZGltZW5zaW9ucyBhbmQgdGhlIHBpeGVsIGFzcGVjdCByYXRpbworICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcworICBPU0RfVGVzdCwgICAgICAgLy8gKCkKKyAgLy8gZHJhd3MgYSB0ZXN0IHBpY3R1cmUuIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seQorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcworLy8gVE9ETzogcmVtb3ZlICJ0ZXN0IiBpbiBmaW5hbCB2ZXJzaW9uCisgIE9TRF9UZXh0LCAgICAgICAvLyAoeDAseTAsc2l6ZSxjb2xvcix0ZXh0KQorICBPU0RfU2V0V2luZG93LCAvLyAgKHgwKSBzZXQgd2luZG93IHdpdGggbnVtYmVyIDA8eDA8OCBhcyBjdXJyZW50CisgIE9TRF9Nb3ZlV2luZG93LCAvLyAgbW92ZSBjdXJyZW50IHdpbmRvdyB0byAoeDAsIHkwKQorICBPU0RfT3BlblJhdywJLy8gT3BlbiBvdGhlciB0eXBlcyBvZiBPU0Qgd2luZG93cworfSBPU0RfQ29tbWFuZDsKKwordHlwZWRlZiBzdHJ1Y3Qgb3NkX2NtZF9zIHsKKwlPU0RfQ29tbWFuZCBjbWQ7CisJaW50IHgwOworCWludCB5MDsKKwlpbnQgeDE7CisJaW50IHkxOworCWludCBjb2xvcjsKKwl2b2lkICpkYXRhOworfSBvc2RfY21kX3Q7CisKKy8qIE9TRF9PcGVuUmF3OiBzZXQgJ2NvbG9yJyB0byBkZXNpcmVkIHdpbmRvdyB0eXBlICovCit0eXBlZGVmIGVudW0geworCU9TRF9CSVRNQVAxLCAgICAgICAgICAgLyogMSBiaXQgYml0bWFwICovCisJT1NEX0JJVE1BUDIsICAgICAgICAgICAvKiAyIGJpdCBiaXRtYXAgKi8KKwlPU0RfQklUTUFQNCwgICAgICAgICAgIC8qIDQgYml0IGJpdG1hcCAqLworCU9TRF9CSVRNQVA4LCAgICAgICAgICAgLyogOCBiaXQgYml0bWFwICovCisJT1NEX0JJVE1BUDFIUiwgICAgICAgICAvKiAxIEJpdCBiaXRtYXAgaGFsZiByZXNvbHV0aW9uICovCisJT1NEX0JJVE1BUDJIUiwgICAgICAgICAvKiAyIGJpdCBiaXRtYXAgaGFsZiByZXNvbHV0aW9uICovCisJT1NEX0JJVE1BUDRIUiwgICAgICAgICAvKiA0IGJpdCBiaXRtYXAgaGFsZiByZXNvbHV0aW9uICovCisJT1NEX0JJVE1BUDhIUiwgICAgICAgICAvKiA4IGJpdCBiaXRtYXAgaGFsZiByZXNvbHV0aW9uICovCisJT1NEX1lDUkNCNDIyLCAgICAgICAgICAvKiA0OjI6MiBZQ1JDQiBHcmFwaGljIERpc3BsYXkgKi8KKwlPU0RfWUNSQ0I0NDQsICAgICAgICAgIC8qIDQ6NDo0IFlDUkNCIEdyYXBoaWMgRGlzcGxheSAqLworCU9TRF9ZQ1JDQjQ0NEhSLCAgICAgICAgLyogNDo0OjQgWUNSQ0IgZ3JhcGhpYyBoYWxmIHJlc29sdXRpb24gKi8KKwlPU0RfVklERU9UU0laRSwgICAgICAgIC8qIFRydWUgU2l6ZSBOb3JtYWwgTVBFRyBWaWRlbyBEaXNwbGF5ICovCisJT1NEX1ZJREVPSFNJWkUsICAgICAgICAvKiBNUEVHIFZpZGVvIERpc3BsYXkgSGFsZiBSZXNvbHV0aW9uICovCisJT1NEX1ZJREVPUVNJWkUsICAgICAgICAvKiBNUEVHIFZpZGVvIERpc3BsYXkgUXVhcnRlciBSZXNvbHV0aW9uICovCisJT1NEX1ZJREVPRFNJWkUsICAgICAgICAvKiBNUEVHIFZpZGVvIERpc3BsYXkgRG91YmxlIFJlc29sdXRpb24gKi8KKwlPU0RfVklERU9USFNJWkUsICAgICAgIC8qIFRydWUgU2l6ZSBNUEVHIFZpZGVvIERpc3BsYXkgSGFsZiBSZXNvbHV0aW9uICovCisJT1NEX1ZJREVPVFFTSVpFLCAgICAgICAvKiBUcnVlIFNpemUgTVBFRyBWaWRlbyBEaXNwbGF5IFF1YXJ0ZXIgUmVzb2x1dGlvbiovCisJT1NEX1ZJREVPVERTSVpFLCAgICAgICAvKiBUcnVlIFNpemUgTVBFRyBWaWRlbyBEaXNwbGF5IERvdWJsZSBSZXNvbHV0aW9uICovCisJT1NEX1ZJREVPTlNJWkUsICAgICAgICAvKiBGdWxsIFNpemUgTVBFRyBWaWRlbyBEaXNwbGF5ICovCisJT1NEX0NVUlNPUiAgICAgICAgICAgICAvKiBDdXJzb3IgKi8KK30gb3NkX3Jhd193aW5kb3dfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgb3NkX2NhcF9zIHsKKwlpbnQgIGNtZDsKKyNkZWZpbmUgT1NEX0NBUF9NRU1TSVpFICAgICAgICAgMSAgLyogbWVtb3J5IHNpemUgKi8KKwlsb25nIHZhbDsKK30gb3NkX2NhcF90OworCisKKyNkZWZpbmUgT1NEX1NFTkRfQ01EICAgICAgICAgICAgX0lPVygnbycsIDE2MCwgb3NkX2NtZF90KQorI2RlZmluZSBPU0RfR0VUX0NBUEFCSUxJVFkgICAgICBfSU9SKCdvJywgMTYxLCBvc2RfY2FwX3QpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTk0YjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi92ZXJzaW9uLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIHZlcnNpb24uaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBIb2xnZXIgV2FlY2h0bGVyIDxob2xnZXJAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgZm9yIGNvbnZlcmdlbmNlIGludGVncmF0ZWQgbWVkaWEgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMQorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfRFZCVkVSU0lPTl9IXworI2RlZmluZSBfRFZCVkVSU0lPTl9IXworCisjZGVmaW5lIERWQl9BUElfVkVSU0lPTiA1CisjZGVmaW5lIERWQl9BUElfVkVSU0lPTl9NSU5PUiA0CisKKyNlbmRpZiAvKl9EVkJWRVJTSU9OX0hfKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL3ZpZGVvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi92aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYzc5YTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi92aWRlby5oCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogdmlkZW8uaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBNYXJjdXMgTWV0emxlciA8bWFyY3VzQGNvbnZlcmdlbmNlLmRlPgorICogICAgICAgICAgICAgICAgICAmIFJhbHBoICBNZXR6bGVyIDxyYWxwaEBjb252ZXJnZW5jZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgICBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EVkJWSURFT19IXworI2RlZmluZSBfRFZCVklERU9fSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorCit0eXBlZGVmIGVudW0geworCVZJREVPX0ZPUk1BVF80XzMsICAgICAvKiBTZWxlY3QgNDozIGZvcm1hdCAqLworCVZJREVPX0ZPUk1BVF8xNl85LCAgICAvKiBTZWxlY3QgMTY6OSBmb3JtYXQuICovCisJVklERU9fRk9STUFUXzIyMV8xICAgIC8qIDIuMjE6MSAqLworfSB2aWRlb19mb3JtYXRfdDsKKworCit0eXBlZGVmIGVudW0geworCSBWSURFT19TWVNURU1fUEFMLAorCSBWSURFT19TWVNURU1fTlRTQywKKwkgVklERU9fU1lTVEVNX1BBTE4sCisJIFZJREVPX1NZU1RFTV9QQUxOYywKKwkgVklERU9fU1lTVEVNX1BBTE0sCisJIFZJREVPX1NZU1RFTV9OVFNDNjAsCisJIFZJREVPX1NZU1RFTV9QQUw2MCwKKwkgVklERU9fU1lTVEVNX1BBTE02MAorfSB2aWRlb19zeXN0ZW1fdDsKKworCit0eXBlZGVmIGVudW0geworCVZJREVPX1BBTl9TQ0FOLCAgICAgICAvKiB1c2UgcGFuIGFuZCBzY2FuIGZvcm1hdCAqLworCVZJREVPX0xFVFRFUl9CT1gsICAgICAvKiB1c2UgbGV0dGVyYm94IGZvcm1hdCAqLworCVZJREVPX0NFTlRFUl9DVVRfT1VUICAvKiB1c2UgY2VudGVyIGN1dCBvdXQgZm9ybWF0ICovCit9IHZpZGVvX2Rpc3BsYXlmb3JtYXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB3OworCWludCBoOworCXZpZGVvX2Zvcm1hdF90IGFzcGVjdF9yYXRpbzsKK30gdmlkZW9fc2l6ZV90OworCit0eXBlZGVmIGVudW0geworCVZJREVPX1NPVVJDRV9ERU1VWCwgLyogU2VsZWN0IHRoZSBkZW11eCBhcyB0aGUgbWFpbiBzb3VyY2UgKi8KKwlWSURFT19TT1VSQ0VfTUVNT1JZIC8qIElmIHRoaXMgc291cmNlIGlzIHNlbGVjdGVkLCB0aGUgc3RyZWFtCisJCQkgICAgICAgY29tZXMgZnJvbSB0aGUgdXNlciB0aHJvdWdoIHRoZSB3cml0ZQorCQkJICAgICAgIHN5c3RlbSBjYWxsICovCit9IHZpZGVvX3N0cmVhbV9zb3VyY2VfdDsKKworCit0eXBlZGVmIGVudW0geworCVZJREVPX1NUT1BQRUQsIC8qIFZpZGVvIGlzIHN0b3BwZWQgKi8KKwlWSURFT19QTEFZSU5HLCAvKiBWaWRlbyBpcyBjdXJyZW50bHkgcGxheWluZyAqLworCVZJREVPX0ZSRUVaRUQgIC8qIFZpZGVvIGlzIGZyZWV6ZWQgKi8KK30gdmlkZW9fcGxheV9zdGF0ZV90OworCisKKy8qIERlY29kZXIgY29tbWFuZHMgKi8KKyNkZWZpbmUgVklERU9fQ01EX1BMQVkgICAgICAgICgwKQorI2RlZmluZSBWSURFT19DTURfU1RPUCAgICAgICAgKDEpCisjZGVmaW5lIFZJREVPX0NNRF9GUkVFWkUgICAgICAoMikKKyNkZWZpbmUgVklERU9fQ01EX0NPTlRJTlVFICAgICgzKQorCisvKiBGbGFncyBmb3IgVklERU9fQ01EX0ZSRUVaRSAqLworI2RlZmluZSBWSURFT19DTURfRlJFRVpFX1RPX0JMQUNLICAgICAJKDEgPDwgMCkKKworLyogRmxhZ3MgZm9yIFZJREVPX0NNRF9TVE9QICovCisjZGVmaW5lIFZJREVPX0NNRF9TVE9QX1RPX0JMQUNLICAgICAgCSgxIDw8IDApCisjZGVmaW5lIFZJREVPX0NNRF9TVE9QX0lNTUVESUFURUxZICAgICAJKDEgPDwgMSkKKworLyogUGxheSBpbnB1dCBmb3JtYXRzOiAqLworLyogVGhlIGRlY29kZXIgaGFzIG5vIHNwZWNpYWwgZm9ybWF0IHJlcXVpcmVtZW50cyAqLworI2RlZmluZSBWSURFT19QTEFZX0ZNVF9OT05FICAgICAgICAgKDApCisvKiBUaGUgZGVjb2RlciByZXF1aXJlcyBmdWxsIEdPUHMgKi8KKyNkZWZpbmUgVklERU9fUExBWV9GTVRfR09QICAgICAgICAgICgxKQorCisvKiBUaGUgc3RydWN0dXJlIG11c3QgYmUgemVyb2VkIGJlZm9yZSB1c2UgYnkgdGhlIGFwcGxpY2F0aW9uCisgICBUaGlzIGVuc3VyZXMgaXQgY2FuIGJlIGV4dGVuZGVkIHNhZmVseSBpbiB0aGUgZnV0dXJlLiAqLworc3RydWN0IHZpZGVvX2NvbW1hbmQgeworCV9fdTMyIGNtZDsKKwlfX3UzMiBmbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U2NCBwdHM7CisJCX0gc3RvcDsKKworCQlzdHJ1Y3QgeworCQkJLyogMCBvciAxMDAwIHNwZWNpZmllcyBub3JtYWwgc3BlZWQsCisJCQkgICAxIHNwZWNpZmllcyBmb3J3YXJkIHNpbmdsZSBzdGVwcGluZywKKwkJCSAgIC0xIHNwZWNpZmllcyBiYWNrd2FyZCBzaW5nbGUgc3RlcHBpbmcsCisJCQkgICA+MTogcGxheWJhY2sgYXQgc3BlZWQvMTAwMCBvZiB0aGUgbm9ybWFsIHNwZWVkLAorCQkJICAgPC0xOiByZXZlcnNlIHBsYXliYWNrIGF0ICgtc3BlZWQvMTAwMCkgb2YgdGhlIG5vcm1hbCBzcGVlZC4gKi8KKwkJCV9fczMyIHNwZWVkOworCQkJX191MzIgZm9ybWF0OworCQl9IHBsYXk7CisKKwkJc3RydWN0IHsKKwkJCV9fdTMyIGRhdGFbMTZdOworCQl9IHJhdzsKKwl9OworfTsKKworLyogRklFTERfVU5LTk9XTiBjYW4gYmUgdXNlZCBpZiB0aGUgaGFyZHdhcmUgZG9lcyBub3Qga25vdyB3aGV0aGVyCisgICB0aGUgVnN5bmMgaXMgZm9yIGFuIG9kZCwgZXZlbiBvciBwcm9ncmVzc2l2ZSAoaS5lLiBub24taW50ZXJsYWNlZCkKKyAgIGZpZWxkLiAqLworI2RlZmluZSBWSURFT19WU1lOQ19GSUVMRF9VTktOT1dOICAJKDApCisjZGVmaW5lIFZJREVPX1ZTWU5DX0ZJRUxEX09ERCAJCSgxKQorI2RlZmluZSBWSURFT19WU1lOQ19GSUVMRF9FVkVOCQkoMikKKyNkZWZpbmUgVklERU9fVlNZTkNfRklFTERfUFJPR1JFU1NJVkUJKDMpCisKK3N0cnVjdCB2aWRlb19ldmVudCB7CisJX19zMzIgdHlwZTsKKyNkZWZpbmUgVklERU9fRVZFTlRfU0laRV9DSEFOR0VECTEKKyNkZWZpbmUgVklERU9fRVZFTlRfRlJBTUVfUkFURV9DSEFOR0VECTIKKyNkZWZpbmUgVklERU9fRVZFTlRfREVDT0RFUl9TVE9QUEVEIAkzCisjZGVmaW5lIFZJREVPX0VWRU5UX1ZTWU5DIAkJNAorCV9fa2VybmVsX3RpbWVfdCB0aW1lc3RhbXA7CisJdW5pb24geworCQl2aWRlb19zaXplX3Qgc2l6ZTsKKwkJdW5zaWduZWQgaW50IGZyYW1lX3JhdGU7CS8qIGluIGZyYW1lcyBwZXIgMTAwMHNlYyAqLworCQl1bnNpZ25lZCBjaGFyIHZzeW5jX2ZpZWxkOwkvKiB1bmtub3duL29kZC9ldmVuL3Byb2dyZXNzaXZlICovCisJfSB1OworfTsKKworCitzdHJ1Y3QgdmlkZW9fc3RhdHVzIHsKKwlpbnQgICAgICAgICAgICAgICAgICAgdmlkZW9fYmxhbms7ICAgLyogYmxhbmsgdmlkZW8gb24gZnJlZXplPyAqLworCXZpZGVvX3BsYXlfc3RhdGVfdCAgICBwbGF5X3N0YXRlOyAgICAvKiBjdXJyZW50IHN0YXRlIG9mIHBsYXliYWNrICovCisJdmlkZW9fc3RyZWFtX3NvdXJjZV90IHN0cmVhbV9zb3VyY2U7IC8qIGN1cnJlbnQgc291cmNlIChkZW11eC9tZW1vcnkpICovCisJdmlkZW9fZm9ybWF0X3QgICAgICAgIHZpZGVvX2Zvcm1hdDsgIC8qIGN1cnJlbnQgYXNwZWN0IHJhdGlvIG9mIHN0cmVhbSovCisJdmlkZW9fZGlzcGxheWZvcm1hdF90IGRpc3BsYXlfZm9ybWF0Oy8qIHNlbGVjdGVkIGNyb3BwaW5nIG1vZGUgKi8KK307CisKKworc3RydWN0IHZpZGVvX3N0aWxsX3BpY3R1cmUgeworCWNoYXIgKmlGcmFtZTsgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBzaW5nbGUgaWZyYW1lIGluIG1lbW9yeSAqLworCV9fczMyIHNpemU7Cit9OworCisKK3R5cGVkZWYKK3N0cnVjdCB2aWRlb19oaWdobGlnaHQgeworCWludCAgICAgYWN0aXZlOyAgICAgIC8qICAgIDE9c2hvdyBoaWdobGlnaHQsIDA9aGlkZSBoaWdobGlnaHQgKi8KKwlfX3U4ICAgIGNvbnRyYXN0MTsgICAvKiAgICA3LSA0ICBQYXR0ZXJuIHBpeGVsIGNvbnRyYXN0ICovCisJCQkgICAgIC8qICAgIDMtIDAgIEJhY2tncm91bmQgcGl4ZWwgY29udHJhc3QgKi8KKwlfX3U4ICAgIGNvbnRyYXN0MjsgICAvKiAgICA3LSA0ICBFbXBoYXNpcyBwaXhlbC0yIGNvbnRyYXN0ICovCisJCQkgICAgIC8qICAgIDMtIDAgIEVtcGhhc2lzIHBpeGVsLTEgY29udHJhc3QgKi8KKwlfX3U4ICAgIGNvbG9yMTsgICAgICAvKiAgICA3LSA0ICBQYXR0ZXJuIHBpeGVsIGNvbG9yICovCisJCQkgICAgIC8qICAgIDMtIDAgIEJhY2tncm91bmQgcGl4ZWwgY29sb3IgKi8KKwlfX3U4ICAgIGNvbG9yMjsgICAgICAvKiAgICA3LSA0ICBFbXBoYXNpcyBwaXhlbC0yIGNvbG9yICovCisJCQkgICAgIC8qICAgIDMtIDAgIEVtcGhhc2lzIHBpeGVsLTEgY29sb3IgKi8KKwlfX3UzMiAgICB5cG9zOyAgICAgICAvKiAgIDIzLTIyICBhdXRvIGFjdGlvbiBtb2RlICovCisJCQkgICAgIC8qICAgMjEtMTIgIHN0YXJ0IHkgKi8KKwkJCSAgICAgLyogICAgOS0gMCAgZW5kIHkgKi8KKwlfX3UzMiAgICB4cG9zOyAgICAgICAvKiAgIDIzLTIyICBidXR0b24gY29sb3IgbnVtYmVyICovCisJCQkgICAgIC8qICAgMjEtMTIgIHN0YXJ0IHggKi8KKwkJCSAgICAgLyogICAgOS0gMCAgZW5kIHggKi8KK30gdmlkZW9faGlnaGxpZ2h0X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgdmlkZW9fc3B1IHsKKwlpbnQgYWN0aXZlOworCWludCBzdHJlYW1faWQ7Cit9IHZpZGVvX3NwdV90OworCisKK3R5cGVkZWYgc3RydWN0IHZpZGVvX3NwdV9wYWxldHRlIHsgICAgICAvKiBTUFUgUGFsZXR0ZSBpbmZvcm1hdGlvbiAqLworCWludCBsZW5ndGg7CisJX191OCAqcGFsZXR0ZTsKK30gdmlkZW9fc3B1X3BhbGV0dGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCB2aWRlb19uYXZpX3BhY2sgeworCWludCBsZW5ndGg7ICAgICAgICAgIC8qIDAgLi4uIDEwMjQgKi8KKwlfX3U4IGRhdGFbMTAyNF07Cit9IHZpZGVvX25hdmlfcGFja190OworCisKK3R5cGVkZWYgX191MTYgdmlkZW9fYXR0cmlidXRlc190OworLyogICBiaXRzOiBkZXNjci4gKi8KKy8qICAgMTUtMTQgVmlkZW8gY29tcHJlc3Npb24gbW9kZSAoMD1NUEVHLTEsIDE9TVBFRy0yKSAqLworLyogICAxMy0xMiBUViBzeXN0ZW0gKDA9NTI1LzYwLCAxPTYyNS81MCkgKi8KKy8qICAgMTEtMTAgQXNwZWN0IHJhdGlvICgwPTQ6MywgMz0xNjo5KSAqLworLyogICAgOS0gOCBwZXJtaXR0ZWQgZGlzcGxheSBtb2RlIG9uIDQ6MyBtb25pdG9yICgwPWJvdGgsIDE9b25seSBwYW4tc2NhICovCisvKiAgICA3ICAgIGxpbmUgMjEtMSBkYXRhIHByZXNlbnQgaW4gR09QICgxPXllcywgMD1ubykgKi8KKy8qICAgIDYgICAgbGluZSAyMS0yIGRhdGEgcHJlc2VudCBpbiBHT1AgKDE9eWVzLCAwPW5vKSAqLworLyogICAgNS0gMyBzb3VyY2UgcmVzb2x1dGlvbiAoMD03MjB4NDgwLzU3NiwgMT03MDR4NDgwLzU3NiwgMj0zNTJ4NDgwLzU3ICovCisvKiAgICAyICAgIHNvdXJjZSBsZXR0ZXJib3hlZCAoMT15ZXMsIDA9bm8pICovCisvKiAgICAwICAgIGZpbG0vY2FtZXJhIG1vZGUgKDA9Y2FtZXJhLCAxPWZpbG0gKDYyNS81MCBvbmx5KSkgKi8KKworCisvKiBiaXQgZGVmaW5pdGlvbnMgZm9yIGNhcGFiaWxpdGllczogKi8KKy8qIGNhbiB0aGUgaGFyZHdhcmUgZGVjb2RlIE1QRUcxIGFuZC9vciBNUEVHMj8gKi8KKyNkZWZpbmUgVklERU9fQ0FQX01QRUcxICAgMQorI2RlZmluZSBWSURFT19DQVBfTVBFRzIgICAyCisvKiBjYW4geW91IHNlbmQgYSBzeXN0ZW0gYW5kL29yIHByb2dyYW0gc3RyZWFtIHRvIHZpZGVvIGRldmljZT8KKyAgICh5b3Ugc3RpbGwgaGF2ZSB0byBvcGVuIHRoZSB2aWRlbyBhbmQgdGhlIGF1ZGlvIGRldmljZSBidXQgb25seQorICAgIHNlbmQgdGhlIHN0cmVhbSB0byB0aGUgdmlkZW8gZGV2aWNlKSAqLworI2RlZmluZSBWSURFT19DQVBfU1lTICAgICA0CisjZGVmaW5lIFZJREVPX0NBUF9QUk9HICAgIDgKKy8qIGNhbiB0aGUgZHJpdmVyIGFsc28gaGFuZGxlIFNQVSwgTkFWSSBhbmQgQ1NTIGVuY29kZWQgZGF0YT8KKyAgIChDU1MgQVBJIGlzIG5vdCBwcmVzZW50IHlldCkgKi8KKyNkZWZpbmUgVklERU9fQ0FQX1NQVSAgICAxNgorI2RlZmluZSBWSURFT19DQVBfTkFWSSAgIDMyCisjZGVmaW5lIFZJREVPX0NBUF9DU1MgICAgNjQKKworCisjZGVmaW5lIFZJREVPX1NUT1AgICAgICAgICAgICAgICAgIF9JTygnbycsIDIxKQorI2RlZmluZSBWSURFT19QTEFZICAgICAgICAgICAgICAgICBfSU8oJ28nLCAyMikKKyNkZWZpbmUgVklERU9fRlJFRVpFICAgICAgICAgICAgICAgX0lPKCdvJywgMjMpCisjZGVmaW5lIFZJREVPX0NPTlRJTlVFICAgICAgICAgICAgIF9JTygnbycsIDI0KQorI2RlZmluZSBWSURFT19TRUxFQ1RfU09VUkNFICAgICAgICBfSU8oJ28nLCAyNSkKKyNkZWZpbmUgVklERU9fU0VUX0JMQU5LICAgICAgICAgICAgX0lPKCdvJywgMjYpCisjZGVmaW5lIFZJREVPX0dFVF9TVEFUVVMgICAgICAgICAgIF9JT1IoJ28nLCAyNywgc3RydWN0IHZpZGVvX3N0YXR1cykKKyNkZWZpbmUgVklERU9fR0VUX0VWRU5UICAgICAgICAgICAgX0lPUignbycsIDI4LCBzdHJ1Y3QgdmlkZW9fZXZlbnQpCisjZGVmaW5lIFZJREVPX1NFVF9ESVNQTEFZX0ZPUk1BVCAgIF9JTygnbycsIDI5KQorI2RlZmluZSBWSURFT19TVElMTFBJQ1RVUkUgICAgICAgICBfSU9XKCdvJywgMzAsIHN0cnVjdCB2aWRlb19zdGlsbF9waWN0dXJlKQorI2RlZmluZSBWSURFT19GQVNUX0ZPUldBUkQgICAgICAgICBfSU8oJ28nLCAzMSkKKyNkZWZpbmUgVklERU9fU0xPV01PVElPTiAgICAgICAgICAgX0lPKCdvJywgMzIpCisjZGVmaW5lIFZJREVPX0dFVF9DQVBBQklMSVRJRVMgICAgIF9JT1IoJ28nLCAzMywgdW5zaWduZWQgaW50KQorI2RlZmluZSBWSURFT19DTEVBUl9CVUZGRVIgICAgICAgICBfSU8oJ28nLCAgMzQpCisjZGVmaW5lIFZJREVPX1NFVF9JRCAgICAgICAgICAgICAgIF9JTygnbycsIDM1KQorI2RlZmluZSBWSURFT19TRVRfU1RSRUFNVFlQRSAgICAgICBfSU8oJ28nLCAzNikKKyNkZWZpbmUgVklERU9fU0VUX0ZPUk1BVCAgICAgICAgICAgX0lPKCdvJywgMzcpCisjZGVmaW5lIFZJREVPX1NFVF9TWVNURU0gICAgICAgICAgIF9JTygnbycsIDM4KQorI2RlZmluZSBWSURFT19TRVRfSElHSExJR0hUICAgICAgICBfSU9XKCdvJywgMzksIHZpZGVvX2hpZ2hsaWdodF90KQorI2RlZmluZSBWSURFT19TRVRfU1BVICAgICAgICAgICAgICBfSU9XKCdvJywgNTAsIHZpZGVvX3NwdV90KQorI2RlZmluZSBWSURFT19TRVRfU1BVX1BBTEVUVEUgICAgICBfSU9XKCdvJywgNTEsIHZpZGVvX3NwdV9wYWxldHRlX3QpCisjZGVmaW5lIFZJREVPX0dFVF9OQVZJICAgICAgICAgICAgIF9JT1IoJ28nLCA1MiwgdmlkZW9fbmF2aV9wYWNrX3QpCisjZGVmaW5lIFZJREVPX1NFVF9BVFRSSUJVVEVTICAgICAgIF9JTygnbycsIDUzKQorI2RlZmluZSBWSURFT19HRVRfU0laRSAgICAgICAgICAgICBfSU9SKCdvJywgNTUsIHZpZGVvX3NpemVfdCkKKyNkZWZpbmUgVklERU9fR0VUX0ZSQU1FX1JBVEUgICAgICAgX0lPUignbycsIDU2LCB1bnNpZ25lZCBpbnQpCisKKy8qKgorICogVklERU9fR0VUX1BUUworICoKKyAqIFJlYWQgdGhlIDMzIGJpdCBwcmVzZW50YXRpb24gdGltZSBzdGFtcCBhcyBkZWZpbmVkCisgKiBpbiBJVFUgVC1SRUMtSC4yMjIuMCAvIElTTy9JRUMgMTM4MTgtMS4KKyAqCisgKiBUaGUgUFRTIHNob3VsZCBiZWxvbmcgdG8gdGhlIGN1cnJlbnRseSBwbGF5ZWQKKyAqIGZyYW1lIGlmIHBvc3NpYmxlLCBidXQgbWF5IGFsc28gYmUgYSB2YWx1ZSBjbG9zZSB0byBpdAorICogbGlrZSB0aGUgUFRTIG9mIHRoZSBsYXN0IGRlY29kZWQgZnJhbWUgb3IgdGhlIGxhc3QgUFRTCisgKiBleHRyYWN0ZWQgYnkgdGhlIFBFUyBwYXJzZXIuCisgKi8KKyNkZWZpbmUgVklERU9fR0VUX1BUUyAgICAgICAgICAgICAgX0lPUignbycsIDU3LCBfX3U2NCkKKworLyogUmVhZCB0aGUgbnVtYmVyIG9mIGRpc3BsYXllZCBmcmFtZXMgc2luY2UgdGhlIGRlY29kZXIgd2FzIHN0YXJ0ZWQgKi8KKyNkZWZpbmUgVklERU9fR0VUX0ZSQU1FX0NPVU5UICAJICAgX0lPUignbycsIDU4LCBfX3U2NCkKKworI2RlZmluZSBWSURFT19DT01NQU5EICAgICAJICAgX0lPV1IoJ28nLCA1OSwgc3RydWN0IHZpZGVvX2NvbW1hbmQpCisjZGVmaW5lIFZJREVPX1RSWV9DT01NQU5EIAkgICBfSU9XUignbycsIDYwLCBzdHJ1Y3QgdmlkZW9fY29tbWFuZCkKKworI2VuZGlmIC8qX0RWQlZJREVPX0hfKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWRkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VkZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzJiMTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VkZC5oCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogbGludXgvaW5jbHVkZS9saW51eC9lZGQuaAorICogIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCBEZWxsIEluYy4KKyAqICBieSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKgorICogc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIHRoZSBpbnQgMTNoLCBheD17NDEsNDh9aAorICogQklPUyBFbmhhbmNlZCBEaXNrIERyaXZlIFNlcnZpY2VzCisgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBUMTMgZ3JvdXAgZG9jdW1lbnQgRDE1NzIgUmV2aXNpb24gMCAoQXVndXN0IDE0IDIwMDIpCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy50MTMub3JnL2RvY3MyMDAyL2QxNTcycjAucGRmLiAgSXQgaXMKKyAqIHZlcnkgc2ltaWxhciB0byBEMTQ4NCBSZXZpc2lvbiAzIGh0dHA6Ly93d3cudDEzLm9yZy9kb2NzMjAwMi9kMTQ4NHIzLnBkZgorICoKKyAqIEluIGEgbnV0c2hlbGwsIGFyY2gve2kzODYseDg2XzY0fS9ib290L3NldHVwLlMgcG9wdWxhdGVzIGEgc2NyYXRjaAorICogdGFibGUgaW4gdGhlIGJvb3RfcGFyYW1zIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIEJJT1MtZW51bWVyYXRlZAorICogYm9vdCBkZXZpY2VzLgorICogSW4gYXJjaC97aTM4Nix4ODZfNjR9L2tlcm5lbC9zZXR1cC5jLCB0aGlzIGluZm9ybWF0aW9uIGlzCisgKiB0cmFuc2ZlcnJlZCBpbnRvIHRoZSBlZGQgc3RydWN0dXJlLCBhbmQgaW4gZHJpdmVycy9maXJtd2FyZS9lZGQuYywgdGhhdAorICogaW5mb3JtYXRpb24gaXMgdXNlZCB0byBpZGVudGlmeSBCSU9TIGJvb3QgZGlzay4gIFRoZSBjb2RlIGluIHNldHVwLlMKKyAqIGlzIHZlcnkgc2Vuc2l0aXZlIHRvIHRoZSBzaXplIG9mIHRoZXNlIHN0cnVjdHVyZXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2lmbmRlZiBfTElOVVhfRUREX0gKKyNkZWZpbmUgX0xJTlVYX0VERF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEVERE5SIDB4MWU5CQkvKiBhZGRyIG9mIG51bWJlciBvZiBlZGRfaW5mbyBzdHJ1Y3RzIGF0IEVEREJVRgorCQkJCSAgIGluIGJvb3RfcGFyYW1zIC0gdHJlYXQgdGhpcyBhcyAxIGJ5dGUgICovCisjZGVmaW5lIEVEREJVRgkweGQwMAkJLyogYWRkciBvZiBlZGRfaW5mbyBzdHJ1Y3RzIGluIGJvb3RfcGFyYW1zICovCisjZGVmaW5lIEVERE1BWE5SIDYJCS8qIG51bWJlciBvZiBlZGRfaW5mbyBzdHJ1Y3RzIHN0YXJ0aW5nIGF0IEVEREJVRiAgKi8KKyNkZWZpbmUgRURERVhUU0laRSA4CQkvKiBjaGFuZ2UgdGhlc2UgaWYgeW91IG11Y2sgd2l0aCB0aGUgc3RydWN0dXJlcyAqLworI2RlZmluZSBFRERQQVJNU0laRSA3NAorI2RlZmluZSBDSEVDS0VYVEVOU0lPTlNQUkVTRU5UIDB4NDEKKyNkZWZpbmUgR0VUREVWSUNFUEFSQU1FVEVSUyAweDQ4CisjZGVmaW5lIExFR0FDWUdFVERFVklDRVBBUkFNRVRFUlMgMHgwOAorI2RlZmluZSBFRERNQUdJQzEgMHg1NUFBCisjZGVmaW5lIEVERE1BR0lDMiAweEFBNTUKKworCisjZGVmaW5lIFJFQURfU0VDVE9SUyAweDAyICAgICAgICAgLyogaW50MTMgQUg9MHgwMiBpcyBSRUFEX1NFQ1RPUlMgY29tbWFuZCAqLworI2RlZmluZSBFRERfTUJSX1NJR19PRkZTRVQgMHgxQjggIC8qIG9mZnNldCBvZiBzaWduYXR1cmUgaW4gdGhlIE1CUiAqLworI2RlZmluZSBFRERfTUJSX1NJR19CVUYgICAgMHgyOTAgIC8qIGFkZHIgaW4gYm9vdCBwYXJhbXMgKi8KKyNkZWZpbmUgRUREX01CUl9TSUdfTUFYIDE2ICAgICAgICAvKiBtYXggbnVtYmVyIG9mIHNpZ25hdHVyZXMgdG8gc3RvcmUgKi8KKyNkZWZpbmUgRUREX01CUl9TSUdfTlJfQlVGIDB4MWVhICAvKiBhZGRyIG9mIG51bWJlciBvZiBNQlIgc2lnbnRhdXJlcyBhdCBFRERfTUJSX1NJR19CVUYKKwkJCQkgICAgIGluIGJvb3RfcGFyYW1zIC0gdHJlYXQgdGhpcyBhcyAxIGJ5dGUgICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNkZWZpbmUgRUREX0VYVF9GSVhFRF9ESVNLX0FDQ0VTUyAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgRUREX0VYVF9ERVZJQ0VfTE9DS0lOR19BTkRfRUpFQ1RJTkcgKDEgPDwgMSkKKyNkZWZpbmUgRUREX0VYVF9FTkhBTkNFRF9ESVNLX0RSSVZFX1NVUFBPUlQgKDEgPDwgMikKKyNkZWZpbmUgRUREX0VYVF82NEJJVF9FWFRFTlNJT05TICAgICAgICAgICAgKDEgPDwgMykKKworI2RlZmluZSBFRERfSU5GT19ETUFfQk9VTkRBUllfRVJST1JfVFJBTlNQQVJFTlQgKDEgPDwgMCkKKyNkZWZpbmUgRUREX0lORk9fR0VPTUVUUllfVkFMSUQgICAgICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgRUREX0lORk9fUkVNT1ZBQkxFICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgRUREX0lORk9fV1JJVEVfVkVSSUZZICAgICAgICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgRUREX0lORk9fTUVESUFfQ0hBTkdFX05PVElGSUNBVElPTiAgICAgKDEgPDwgNCkKKyNkZWZpbmUgRUREX0lORk9fTE9DS0FCTEUgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgRUREX0lORk9fTk9fTUVESUFfUFJFU0VOVCAgICAgICAgICAgICAgKDEgPDwgNikKKyNkZWZpbmUgRUREX0lORk9fVVNFX0lOVDEzX0ZONTAgICAgICAgICAgICAgICAgKDEgPDwgNykKKworc3RydWN0IGVkZF9kZXZpY2VfcGFyYW1zIHsKKwlfX3UxNiBsZW5ndGg7CisJX191MTYgaW5mb19mbGFnczsKKwlfX3UzMiBudW1fZGVmYXVsdF9jeWxpbmRlcnM7CisJX191MzIgbnVtX2RlZmF1bHRfaGVhZHM7CisJX191MzIgc2VjdG9yc19wZXJfdHJhY2s7CisJX191NjQgbnVtYmVyX29mX3NlY3RvcnM7CisJX191MTYgYnl0ZXNfcGVyX3NlY3RvcjsKKwlfX3UzMiBkcHRlX3B0cjsJCS8qIDB4RkZGRkZGRkYgZm9yIG91ciBwdXJwb3NlcyAqLworCV9fdTE2IGtleTsJCS8qID0gMHhCRUREICovCisJX191OCBkZXZpY2VfcGF0aF9pbmZvX2xlbmd0aDsJLyogPSA0NCAqLworCV9fdTggcmVzZXJ2ZWQyOworCV9fdTE2IHJlc2VydmVkMzsKKwlfX3U4IGhvc3RfYnVzX3R5cGVbNF07CisJX191OCBpbnRlcmZhY2VfdHlwZVs4XTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3UxNiBiYXNlX2FkZHJlc3M7CisJCQlfX3UxNiByZXNlcnZlZDE7CisJCQlfX3UzMiByZXNlcnZlZDI7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGlzYTsKKwkJc3RydWN0IHsKKwkJCV9fdTggYnVzOworCQkJX191OCBzbG90OworCQkJX191OCBmdW5jdGlvbjsKKwkJCV9fdTggY2hhbm5lbDsKKwkJCV9fdTMyIHJlc2VydmVkOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwY2k7CisJCS8qIHBjaXggaXMgc2FtZSBhcyBwY2kgKi8KKwkJc3RydWN0IHsKKwkJCV9fdTY0IHJlc2VydmVkOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBpYm5kOworCQlzdHJ1Y3QgeworCQkJX191NjQgcmVzZXJ2ZWQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHhwcnM7CisJCXN0cnVjdCB7CisJCQlfX3U2NCByZXNlcnZlZDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaHRwdDsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IHJlc2VydmVkOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1bmtub3duOworCX0gaW50ZXJmYWNlX3BhdGg7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191OCBkZXZpY2U7CisJCQlfX3U4IHJlc2VydmVkMTsKKwkJCV9fdTE2IHJlc2VydmVkMjsKKwkJCV9fdTMyIHJlc2VydmVkMzsKKwkJCV9fdTY0IHJlc2VydmVkNDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgYXRhOworCQlzdHJ1Y3QgeworCQkJX191OCBkZXZpY2U7CisJCQlfX3U4IGx1bjsKKwkJCV9fdTggcmVzZXJ2ZWQxOworCQkJX191OCByZXNlcnZlZDI7CisJCQlfX3UzMiByZXNlcnZlZDM7CisJCQlfX3U2NCByZXNlcnZlZDQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGF0YXBpOworCQlzdHJ1Y3QgeworCQkJX191MTYgaWQ7CisJCQlfX3U2NCBsdW47CisJCQlfX3UxNiByZXNlcnZlZDE7CisJCQlfX3UzMiByZXNlcnZlZDI7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHNjc2k7CisJCXN0cnVjdCB7CisJCQlfX3U2NCBzZXJpYWxfbnVtYmVyOworCQkJX191NjQgcmVzZXJ2ZWQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVzYjsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IGV1aTsKKwkJCV9fdTY0IHJlc2VydmVkOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBpMTM5NDsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IHd3aWQ7CisJCQlfX3U2NCBsdW47CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGZpYnJlOworCQlzdHJ1Y3QgeworCQkJX191NjQgaWRlbnRpdHlfdGFnOworCQkJX191NjQgcmVzZXJ2ZWQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGkybzsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIGFycmF5X251bWJlcjsKKwkJCV9fdTMyIHJlc2VydmVkMTsKKwkJCV9fdTY0IHJlc2VydmVkMjsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcmFpZDsKKwkJc3RydWN0IHsKKwkJCV9fdTggZGV2aWNlOworCQkJX191OCByZXNlcnZlZDE7CisJCQlfX3UxNiByZXNlcnZlZDI7CisJCQlfX3UzMiByZXNlcnZlZDM7CisJCQlfX3U2NCByZXNlcnZlZDQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHNhdGE7CisJCXN0cnVjdCB7CisJCQlfX3U2NCByZXNlcnZlZDE7CisJCQlfX3U2NCByZXNlcnZlZDI7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVua25vd247CisJfSBkZXZpY2VfcGF0aDsKKwlfX3U4IHJlc2VydmVkNDsKKwlfX3U4IGNoZWNrc3VtOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBlZGRfaW5mbyB7CisJX191OCBkZXZpY2U7CisJX191OCB2ZXJzaW9uOworCV9fdTE2IGludGVyZmFjZV9zdXBwb3J0OworCV9fdTE2IGxlZ2FjeV9tYXhfY3lsaW5kZXI7CisJX191OCBsZWdhY3lfbWF4X2hlYWQ7CisJX191OCBsZWdhY3lfc2VjdG9yc19wZXJfdHJhY2s7CisJc3RydWN0IGVkZF9kZXZpY2VfcGFyYW1zIHBhcmFtczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgZWRkIHsKKwl1bnNpZ25lZCBpbnQgbWJyX3NpZ25hdHVyZVtFRERfTUJSX1NJR19NQVhdOworCXN0cnVjdCBlZGRfaW5mbyBlZGRfaW5mb1tFRERNQVhOUl07CisJdW5zaWduZWQgY2hhciBtYnJfc2lnbmF0dXJlX25yOworCXVuc2lnbmVkIGNoYXIgZWRkX2luZm9fbnI7Cit9OworCisjZW5kaWYJCQkJLyohX19BU1NFTUJMWV9fICovCisKKyNlbmRpZgkJCQkvKiBfTElOVVhfRUREX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWZzX2ZzX3NiLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Vmc19mc19zYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMWJlOTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Vmc19mc19zYi5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBlZnNfZnNfc2IuaAorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBBbCBTbWl0aAorICoKKyAqIFBvcnRpb25zIGRlcml2ZWQgZnJvbSBJUklYIGhlYWRlciBmaWxlcyAoYykgMTk4OCBTaWxpY29uIEdyYXBoaWNzCisgKi8KKworI2lmbmRlZiBfX0VGU19GU19TQl9IX18KKyNkZWZpbmUgX19FRlNfRlNfU0JfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisKKy8qIEVGUyBzdXBlcmJsb2NrIG1hZ2ljIG51bWJlcnMgKi8KKyNkZWZpbmUgRUZTX01BR0lDCTB4MDcyOTU5CisjZGVmaW5lIEVGU19ORVdNQUdJQwkweDA3Mjk1YQorCisjZGVmaW5lIElTX0VGU19NQUdJQyh4KQkoKHggPT0gRUZTX01BR0lDKSB8fCAoeCA9PSBFRlNfTkVXTUFHSUMpKQorCisjZGVmaW5lIEVGU19TVVBFUgkJMQorI2RlZmluZSBFRlNfUk9PVElOT0RFCQkyCisKKy8qIGVmcyBzdXBlcmJsb2NrIG9uIGRpc2sgKi8KK3N0cnVjdCBlZnNfc3VwZXIgeworCV9fYmUzMgkJZnNfc2l6ZTsgICAgICAgIC8qIHNpemUgb2YgZmlsZXN5c3RlbSwgaW4gc2VjdG9ycyAqLworCV9fYmUzMgkJZnNfZmlyc3RjZzsgICAgIC8qIGJiIG9mZnNldCB0byBmaXJzdCBjZyAqLworCV9fYmUzMgkJZnNfY2dmc2l6ZTsgICAgIC8qIHNpemUgb2YgY3lsaW5kZXIgZ3JvdXAgaW4gYmIncyAqLworCV9fYmUxNgkJZnNfY2dpc2l6ZTsgICAgIC8qIGJiJ3Mgb2YgaW5vZGVzIHBlciBjeWxpbmRlciBncm91cCAqLworCV9fYmUxNgkJZnNfc2VjdG9yczsgICAgIC8qIHNlY3RvcnMgcGVyIHRyYWNrICovCisJX19iZTE2CQlmc19oZWFkczsgICAgICAgLyogaGVhZHMgcGVyIGN5bGluZGVyICovCisJX19iZTE2CQlmc19uY2c7ICAgICAgICAgLyogIyBvZiBjeWxpbmRlciBncm91cHMgaW4gZmlsZXN5c3RlbSAqLworCV9fYmUxNgkJZnNfZGlydHk7ICAgICAgIC8qIGZzIG5lZWRzIHRvIGJlIGZzY2snZCAqLworCV9fYmUzMgkJZnNfdGltZTsgICAgICAgIC8qIGxhc3Qgc3VwZXItYmxvY2sgdXBkYXRlICovCisJX19iZTMyCQlmc19tYWdpYzsgICAgICAgLyogbWFnaWMgbnVtYmVyICovCisJY2hhcgkJZnNfZm5hbWVbNl07ICAgIC8qIGZpbGUgc3lzdGVtIG5hbWUgKi8KKwljaGFyCQlmc19mcGFja1s2XTsgICAgLyogZmlsZSBzeXN0ZW0gcGFjayBuYW1lICovCisJX19iZTMyCQlmc19ibXNpemU7ICAgICAgLyogc2l6ZSBvZiBiaXRtYXAgaW4gYnl0ZXMgKi8KKwlfX2JlMzIJCWZzX3RmcmVlOyAgICAgICAvKiB0b3RhbCBmcmVlIGRhdGEgYmxvY2tzICovCisJX19iZTMyCQlmc190aW5vZGU7ICAgICAgLyogdG90YWwgZnJlZSBpbm9kZXMgKi8KKwlfX2JlMzIJCWZzX2JtYmxvY2s7ICAgICAvKiBiaXRtYXAgbG9jYXRpb24uICovCisJX19iZTMyCQlmc19yZXBsc2I7ICAgICAgLyogTG9jYXRpb24gb2YgcmVwbGljYXRlZCBzdXBlcmJsb2NrLiAqLworCV9fYmUzMgkJZnNfbGFzdGlhbGxvYzsgIC8qIGxhc3QgYWxsb2NhdGVkIGlub2RlICovCisJY2hhcgkJZnNfc3BhcmVbMjBdOyAgIC8qIHNwYWNlIGZvciBleHBhbnNpb24gLSBNVVNUIEJFIFpFUk8gKi8KKwlfX2JlMzIJCWZzX2NoZWNrc3VtOyAgICAvKiBjaGVja3N1bSBvZiB2b2x1bWUgcG9ydGlvbiBvZiBmcyAqLworfTsKKworLyogZWZzIHN1cGVyYmxvY2sgaW5mb3JtYXRpb24gaW4gbWVtb3J5ICovCitzdHJ1Y3QgZWZzX3NiX2luZm8geworCV9fdTMyCWZzX21hZ2ljOwkvKiBzdXBlcmJsb2NrIG1hZ2ljIG51bWJlciAqLworCV9fdTMyCWZzX3N0YXJ0OwkvKiBmaXJzdCBibG9jayBvZiBmaWxlc3lzdGVtICovCisJX191MzIJZmlyc3RfYmxvY2s7CS8qIGZpcnN0IGRhdGEgYmxvY2sgaW4gZmlsZXN5c3RlbSAqLworCV9fdTMyCXRvdGFsX2Jsb2NrczsJLyogdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBpbiBmaWxlc3lzdGVtICovCisJX191MzIJZ3JvdXBfc2l6ZTsJLyogIyBvZiBibG9ja3MgYSBncm91cCBjb25zaXN0cyBvZiAqLyAKKwlfX3UzMglkYXRhX2ZyZWU7CS8qICMgb2YgZnJlZSBkYXRhIGJsb2NrcyAqLworCV9fdTMyCWlub2RlX2ZyZWU7CS8qICMgb2YgZnJlZSBpbm9kZXMgKi8KKwlfX3UxNglpbm9kZV9ibG9ja3M7CS8qICMgb2YgYmxvY2tzIHVzZWQgZm9yIGlub2RlcyBpbiBldmVyeSBncnAgKi8KKwlfX3UxNgl0b3RhbF9ncm91cHM7CS8qICMgb2YgZ3JvdXBzICovCit9OworCisjZW5kaWYgLyogX19FRlNfRlNfU0JfSF9fICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWxmLWVtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZi1lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YmVhNzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZi1lbS5oCkBAIC0wLDAgKzEsNTUgQEAKKyNpZm5kZWYgX0xJTlVYX0VMRl9FTV9ICisjZGVmaW5lIF9MSU5VWF9FTEZfRU1fSAorCisvKiBUaGVzZSBjb25zdGFudHMgZGVmaW5lIHRoZSB2YXJpb3VzIEVMRiB0YXJnZXQgbWFjaGluZXMgKi8KKyNkZWZpbmUgRU1fTk9ORQkJMAorI2RlZmluZSBFTV9NMzIJCTEKKyNkZWZpbmUgRU1fU1BBUkMJMgorI2RlZmluZSBFTV8zODYJCTMKKyNkZWZpbmUgRU1fNjhLCQk0CisjZGVmaW5lIEVNXzg4SwkJNQorI2RlZmluZSBFTV80ODYJCTYJLyogUGVyaGFwcyBkaXN1c2VkICovCisjZGVmaW5lIEVNXzg2MAkJNworI2RlZmluZSBFTV9NSVBTCQk4CS8qIE1JUFMgUjMwMDAgKG9mZmljaWFsbHksIGJpZy1lbmRpYW4gb25seSkgKi8KKwkJCQkvKiBOZXh0IHR3byBhcmUgaGlzdG9yaWNhbCBhbmQgYmluYXJpZXMgYW5kCisJCQkJICAgbW9kdWxlcyBvZiB0aGVzZSB0eXBlcyB3aWxsIGJlIHJlamVjdGVkIGJ5CisJCQkJICAgTGludXguICAqLworI2RlZmluZSBFTV9NSVBTX1JTM19MRQkxMAkvKiBNSVBTIFIzMDAwIGxpdHRsZS1lbmRpYW4gKi8KKyNkZWZpbmUgRU1fTUlQU19SUzRfQkUJMTAJLyogTUlQUyBSNDAwMCBiaWctZW5kaWFuICovCisKKyNkZWZpbmUgRU1fUEFSSVNDCTE1CS8qIEhQUEEgKi8KKyNkZWZpbmUgRU1fU1BBUkMzMlBMVVMJMTgJLyogU3VuJ3MgInY4cGx1cyIgKi8KKyNkZWZpbmUgRU1fUFBDCQkyMAkvKiBQb3dlclBDICovCisjZGVmaW5lIEVNX1BQQzY0CTIxCSAvKiBQb3dlclBDNjQgKi8KKyNkZWZpbmUgRU1fU1BVCQkyMwkvKiBDZWxsIEJFIFNQVSAqLworI2RlZmluZSBFTV9TSAkJNDIJLyogU3VwZXJIICovCisjZGVmaW5lIEVNX1NQQVJDVjkJNDMJLyogU1BBUkMgdjkgNjQtYml0ICovCisjZGVmaW5lIEVNX0lBXzY0CTUwCS8qIEhQL0ludGVsIElBLTY0ICovCisjZGVmaW5lIEVNX1g4Nl82NAk2MgkvKiBBTUQgeDg2LTY0ICovCisjZGVmaW5lIEVNX1MzOTAJCTIyCS8qIElCTSBTLzM5MCAqLworI2RlZmluZSBFTV9DUklTCQk3NgkvKiBBeGlzIENvbW11bmljYXRpb25zIDMyLWJpdCBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fVjg1MAkJODcJLyogTkVDIHY4NTAgKi8KKyNkZWZpbmUgRU1fTTMyUgkJODgJLyogUmVuZXNhcyBNMzJSICovCisjZGVmaW5lIEVNX0g4XzMwMAk0NgkvKiBSZW5lc2FzIEg4LzMwMCwzMDBILEg4UyAqLworI2RlZmluZSBFTV9NTjEwMzAwCTg5CS8qIFBhbmFzb25pYy9NRUkgTU4xMDMwMCwgQU0zMyAqLworI2RlZmluZSBFTV9CTEFDS0ZJTiAgICAgMTA2ICAgICAvKiBBREkgQmxhY2tmaW4gUHJvY2Vzc29yICovCisjZGVmaW5lIEVNX0ZSVgkJMHg1NDQxCS8qIEZ1aml0c3UgRlItViAqLworI2RlZmluZSBFTV9BVlIzMgkweDE4YWQJLyogQXRtZWwgQVZSMzIgKi8KKworLyoKKyAqIFRoaXMgaXMgYW4gaW50ZXJpbSB2YWx1ZSB0aGF0IHdlIHdpbGwgdXNlIHVudGlsIHRoZSBjb21taXR0ZWUgY29tZXMKKyAqIHVwIHdpdGggYSBmaW5hbCBudW1iZXIuCisgKi8KKyNkZWZpbmUgRU1fQUxQSEEJMHg5MDI2CisKKy8qIEJvZ3VzIG9sZCB2ODUwIG1hZ2ljIG51bWJlciwgdXNlZCBieSBvbGQgdG9vbHMuICovCisjZGVmaW5lIEVNX0NZR05VU19WODUwCTB4OTA4MAorLyogQm9ndXMgb2xkIG0zMnIgbWFnaWMgbnVtYmVyLCB1c2VkIGJ5IG9sZCB0b29scy4gKi8KKyNkZWZpbmUgRU1fQ1lHTlVTX00zMlIJMHg5MDQxCisvKiBUaGlzIGlzIHRoZSBvbGQgaW50ZXJpbSB2YWx1ZSBmb3IgUy8zOTAgYXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIEVNX1MzOTBfT0xECTB4QTM5MAorLyogQWxzbyBQYW5hc29uaWMvTUVJIE1OMTAzMDAsIEFNMzMgKi8KKyNkZWZpbmUgRU1fQ1lHTlVTX01OMTAzMDAgMHhiZWVmCisKKworI2VuZGlmIC8qIF9MSU5VWF9FTEZfRU1fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lbGYtZmRwaWMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWxmLWZkcGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyZjYzNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWxmLWZkcGljLmgKQEAgLTAsMCArMSw2MiBAQAorLyogZWxmLWZkcGljLmg6IEZEUElDIEVMRiBsb2FkIG1hcAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9FTEZfRkRQSUNfSAorI2RlZmluZSBfTElOVVhfRUxGX0ZEUElDX0gKKworI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorCisjZGVmaW5lIFBUX0dOVV9TVEFDSyAgICAoUFRfTE9PUyArIDB4NDc0ZTU1MSkKKworLyogc2VnbWVudCBtYXBwaW5ncyBmb3IgRUxGIEZEUElDIGxpYnJhcmllcy9leGVjdXRhYmxlcy9pbnRlcnByZXRlcnMgKi8KK3N0cnVjdCBlbGYzMl9mZHBpY19sb2Fkc2VnIHsKKwlFbGYzMl9BZGRyCWFkZHI7CQkvKiBjb3JlIGFkZHJlc3MgdG8gd2hpY2ggbWFwcGVkICovCisJRWxmMzJfQWRkcglwX3ZhZGRyOwkvKiBWTUEgcmVjb3JkZWQgaW4gZmlsZSAqLworCUVsZjMyX1dvcmQJcF9tZW1zejsJLyogYWxsb2NhdGlvbiBzaXplIHJlY29yZGVkIGluIGZpbGUgKi8KK307CisKK3N0cnVjdCBlbGYzMl9mZHBpY19sb2FkbWFwIHsKKwlFbGYzMl9IYWxmCXZlcnNpb247CS8qIHZlcnNpb24gb2YgdGhlc2Ugc3RydWN0dXJlcywganVzdCBpbiBjYXNlLi4uICovCisJRWxmMzJfSGFsZgluc2VnczsJCS8qIG51bWJlciBvZiBzZWdtZW50cyAqLworCXN0cnVjdCBlbGYzMl9mZHBpY19sb2Fkc2VnIHNlZ3NbXTsKK307CisKKyNkZWZpbmUgRUxGMzJfRkRQSUNfTE9BRE1BUF9WRVJTSU9OCTB4MDAwMAorCisvKgorICogYmluZm10IGJpbmFyeSBwYXJhbWV0ZXJzIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgZWxmX2ZkcGljX3BhcmFtcyB7CisJc3RydWN0IGVsZmhkcgkJCWhkcjsJCS8qIHJlZiBjb3B5IG9mIEVMRiBoZWFkZXIgKi8KKwlzdHJ1Y3QgZWxmX3BoZHIJCQkqcGhkcnM7CQkvKiByZWYgY29weSBvZiBQVF9QSERSIHRhYmxlICovCisJc3RydWN0IGVsZjMyX2ZkcGljX2xvYWRtYXAJKmxvYWRtYXA7CS8qIGxvYWRtYXAgdG8gYmUgcGFzc2VkIHRvIHVzZXJzcGFjZSAqLworCXVuc2lnbmVkIGxvbmcJCQllbGZoZHJfYWRkcjsJLyogbWFwcGVkIEVMRiBoZWFkZXIgdXNlciBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZwkJCXBoX2FkZHI7CS8qIG1hcHBlZCBQVF9QSERSIHVzZXIgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcJCQltYXBfYWRkcjsJLyogbWFwcGVkIGxvYWRtYXAgdXNlciBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZwkJCWVudHJ5X2FkZHI7CS8qIG1hcHBlZCBlbnRyeSB1c2VyIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nCQkJc3RhY2tfc2l6ZTsJLyogc3RhY2sgc2l6ZSByZXF1ZXN0ZWQgKFBUX0dOVV9TVEFDSykgKi8KKwl1bnNpZ25lZCBsb25nCQkJZHluYW1pY19hZGRyOwkvKiBtYXBwZWQgUFRfRFlOQU1JQyB1c2VyIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nCQkJbG9hZF9hZGRyOwkvKiB1c2VyIGFkZHJlc3MgYXQgd2hpY2ggdG8gbWFwIGJpbmFyeSAqLworCXVuc2lnbmVkIGxvbmcJCQlmbGFnczsKKyNkZWZpbmUgRUxGX0ZEUElDX0ZMQUdfQVJSQU5HRU1FTlQJMHgwMDAwMDAwZgkvKiBQVF9MT0FEIGFycmFuZ2VtZW50IGZsYWdzICovCisjZGVmaW5lIEVMRl9GRFBJQ19GTEFHX0lOREVQRU5ERU5UCTB4MDAwMDAwMDAJLyogUFRfTE9BRHMgY2FuIGJlIHB1dCBhbnl3aGVyZSAqLworI2RlZmluZSBFTEZfRkRQSUNfRkxBR19IT05PVVJWQUREUgkweDAwMDAwMDAxCS8qIFBUX0xPQUQudmFkZHIgbXVzdCBiZSBob25vdXJlZCAqLworI2RlZmluZSBFTEZfRkRQSUNfRkxBR19DT05TVERJU1AJMHgwMDAwMDAwMgkvKiBQVF9MT0FEcyByZXF1aXJlIGNvbnN0YW50CisJCQkJCQkJICogZGlzcGxhY2VtZW50ICovCisjZGVmaW5lIEVMRl9GRFBJQ19GTEFHX0NPTlRJR1VPVVMJMHgwMDAwMDAwMwkvKiBQVF9MT0FEcyBzaG91bGQgYmUgY29udGlndW91cyAqLworI2RlZmluZSBFTEZfRkRQSUNfRkxBR19FWEVDX1NUQUNLCTB4MDAwMDAwMTAJLyogVCBpZiBzdGFjayB0byBiZSBleGVjdXRhYmxlICovCisjZGVmaW5lIEVMRl9GRFBJQ19GTEFHX05PRVhFQ19TVEFDSwkweDAwMDAwMDIwCS8qIFQgaWYgc3RhY2sgbm90IHRvIGJlIGV4ZWN1dGFibGUgKi8KKyNkZWZpbmUgRUxGX0ZEUElDX0ZMQUdfRVhFQ1VUQUJMRQkweDAwMDAwMDQwCS8qIFQgaWYgdGhpcyBvYmplY3QgaXMgdGhlIGV4ZWN1dGFibGUgKi8KKyNkZWZpbmUgRUxGX0ZEUElDX0ZMQUdfUFJFU0VOVAkJMHg4MDAwMDAwMAkvKiBUIGlmIHRoaXMgb2JqZWN0IGlzIHByZXNlbnQgKi8KK307CisKKworI2VuZGlmIC8qIF9MSU5VWF9FTEZfRkRQSUNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lbGYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3ZDU2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWxmLmgKQEAgLTAsMCArMSw0MTMgQEAKKyNpZm5kZWYgX0xJTlVYX0VMRl9ICisjZGVmaW5lIF9MSU5VWF9FTEZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYtZW0uaD4KKworc3RydWN0IGZpbGU7CisKKyNpZm5kZWYgZWxmX3JlYWRfaW1wbGllc19leGVjCisgIC8qIEV4ZWN1dGFibGVzIGZvciB3aGljaCBlbGZfcmVhZF9pbXBsaWVzX2V4ZWMoKSByZXR1cm5zIFRSVUUgd2lsbAorICAgICBoYXZlIHRoZSBSRUFEX0lNUExJRVNfRVhFQyBwZXJzb25hbGl0eSBmbGFnIHNldCBhdXRvbWF0aWNhbGx5LgorICAgICBPdmVycmlkZSBpbiBhc20vZWxmLmggYXMgbmVlZGVkLiAgKi8KKyMgZGVmaW5lIGVsZl9yZWFkX2ltcGxpZXNfZXhlYyhleCwgaGF2ZV9wdF9nbnVfc3RhY2spCTAKKyNlbmRpZgorCisvKiAzMi1iaXQgRUxGIGJhc2UgdHlwZXMuICovCit0eXBlZGVmIF9fdTMyCUVsZjMyX0FkZHI7Cit0eXBlZGVmIF9fdTE2CUVsZjMyX0hhbGY7Cit0eXBlZGVmIF9fdTMyCUVsZjMyX09mZjsKK3R5cGVkZWYgX19zMzIJRWxmMzJfU3dvcmQ7Cit0eXBlZGVmIF9fdTMyCUVsZjMyX1dvcmQ7CisKKy8qIDY0LWJpdCBFTEYgYmFzZSB0eXBlcy4gKi8KK3R5cGVkZWYgX191NjQJRWxmNjRfQWRkcjsKK3R5cGVkZWYgX191MTYJRWxmNjRfSGFsZjsKK3R5cGVkZWYgX19zMTYJRWxmNjRfU0hhbGY7Cit0eXBlZGVmIF9fdTY0CUVsZjY0X09mZjsKK3R5cGVkZWYgX19zMzIJRWxmNjRfU3dvcmQ7Cit0eXBlZGVmIF9fdTMyCUVsZjY0X1dvcmQ7Cit0eXBlZGVmIF9fdTY0CUVsZjY0X1h3b3JkOwordHlwZWRlZiBfX3M2NAlFbGY2NF9TeHdvcmQ7CisKKy8qIFRoZXNlIGNvbnN0YW50cyBhcmUgZm9yIHRoZSBzZWdtZW50IHR5cGVzIHN0b3JlZCBpbiB0aGUgaW1hZ2UgaGVhZGVycyAqLworI2RlZmluZSBQVF9OVUxMICAgIDAKKyNkZWZpbmUgUFRfTE9BRCAgICAxCisjZGVmaW5lIFBUX0RZTkFNSUMgMgorI2RlZmluZSBQVF9JTlRFUlAgIDMKKyNkZWZpbmUgUFRfTk9URSAgICA0CisjZGVmaW5lIFBUX1NITElCICAgNQorI2RlZmluZSBQVF9QSERSICAgIDYKKyNkZWZpbmUgUFRfVExTICAgICA3ICAgICAgICAgICAgICAgLyogVGhyZWFkIGxvY2FsIHN0b3JhZ2Ugc2VnbWVudCAqLworI2RlZmluZSBQVF9MT09TICAgIDB4NjAwMDAwMDAgICAgICAvKiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBQVF9ISU9TICAgIDB4NmZmZmZmZmYgICAgICAvKiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBQVF9MT1BST0MgIDB4NzAwMDAwMDAKKyNkZWZpbmUgUFRfSElQUk9DICAweDdmZmZmZmZmCisjZGVmaW5lIFBUX0dOVV9FSF9GUkFNRQkJMHg2NDc0ZTU1MAorCisjZGVmaW5lIFBUX0dOVV9TVEFDSwkoUFRfTE9PUyArIDB4NDc0ZTU1MSkKKworLyoKKyAqIEV4dGVuZGVkIE51bWJlcmluZworICoKKyAqIElmIHRoZSByZWFsIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzIGlzIGxhcmdlciB0aGFuCisgKiBvciBlcXVhbCB0byBQTl9YTlVNKDB4ZmZmZiksIGl0IGlzIHNldCB0byBzaF9pbmZvIGZpZWxkIG9mIHRoZQorICogc2VjdGlvbiBoZWFkZXIgYXQgaW5kZXggMCwgYW5kIFBOX1hOVU0gaXMgc2V0IHRvIGVfcGhudW0KKyAqIGZpZWxkLiBPdGhlcndpc2UsIHRoZSBzZWN0aW9uIGhlYWRlciBhdCBpbmRleCAwIGlzIHplcm8KKyAqIGluaXRpYWxpemVkLCBpZiBpdCBleGlzdHMuCisgKgorICogU3BlY2lmaWNhdGlvbnMgYXJlIGF2YWlsYWJsZSBpbjoKKyAqCisgKiAtIFN1biBtaWNyb3N5c3RlbXM6IExpbmtlciBhbmQgTGlicmFyaWVzLgorICogICBQYXJ0IE5vOiA4MTctMTk4NC0xNywgU2VwdGVtYmVyIDIwMDguCisgKiAgIFVSTDogaHR0cDovL2RvY3Muc3VuLmNvbS9hcHAvZG9jcy9kb2MvODE3LTE5ODQKKyAqCisgKiAtIFN5c3RlbSBWIEFCSSBBTUQ2NCBBcmNoaXRlY3R1cmUgUHJvY2Vzc29yIFN1cHBsZW1lbnQKKyAqICAgRHJhZnQgVmVyc2lvbiAwLjk5LiwKKyAqICAgTWF5IDExLCAyMDA5LgorICogICBVUkw6IGh0dHA6Ly93d3cueDg2LTY0Lm9yZy8KKyAqLworI2RlZmluZSBQTl9YTlVNIDB4ZmZmZgorCisvKiBUaGVzZSBjb25zdGFudHMgZGVmaW5lIHRoZSBkaWZmZXJlbnQgZWxmIGZpbGUgdHlwZXMgKi8KKyNkZWZpbmUgRVRfTk9ORSAgIDAKKyNkZWZpbmUgRVRfUkVMICAgIDEKKyNkZWZpbmUgRVRfRVhFQyAgIDIKKyNkZWZpbmUgRVRfRFlOICAgIDMKKyNkZWZpbmUgRVRfQ09SRSAgIDQKKyNkZWZpbmUgRVRfTE9QUk9DIDB4ZmYwMAorI2RlZmluZSBFVF9ISVBST0MgMHhmZmZmCisKKy8qIFRoaXMgaXMgdGhlIGluZm8gdGhhdCBpcyBuZWVkZWQgdG8gcGFyc2UgdGhlIGR5bmFtaWMgc2VjdGlvbiBvZiB0aGUgZmlsZSAqLworI2RlZmluZSBEVF9OVUxMCQkwCisjZGVmaW5lIERUX05FRURFRAkxCisjZGVmaW5lIERUX1BMVFJFTFNaCTIKKyNkZWZpbmUgRFRfUExUR09UCTMKKyNkZWZpbmUgRFRfSEFTSAkJNAorI2RlZmluZSBEVF9TVFJUQUIJNQorI2RlZmluZSBEVF9TWU1UQUIJNgorI2RlZmluZSBEVF9SRUxBCQk3CisjZGVmaW5lIERUX1JFTEFTWgk4CisjZGVmaW5lIERUX1JFTEFFTlQJOQorI2RlZmluZSBEVF9TVFJTWgkxMAorI2RlZmluZSBEVF9TWU1FTlQJMTEKKyNkZWZpbmUgRFRfSU5JVAkJMTIKKyNkZWZpbmUgRFRfRklOSQkJMTMKKyNkZWZpbmUgRFRfU09OQU1FCTE0CisjZGVmaW5lIERUX1JQQVRIIAkxNQorI2RlZmluZSBEVF9TWU1CT0xJQwkxNgorI2RlZmluZSBEVF9SRUwJICAgICAgICAxNworI2RlZmluZSBEVF9SRUxTWgkxOAorI2RlZmluZSBEVF9SRUxFTlQJMTkKKyNkZWZpbmUgRFRfUExUUkVMCTIwCisjZGVmaW5lIERUX0RFQlVHCTIxCisjZGVmaW5lIERUX1RFWFRSRUwJMjIKKyNkZWZpbmUgRFRfSk1QUkVMCTIzCisjZGVmaW5lIERUX0VOQ09ESU5HCTMyCisjZGVmaW5lIE9MRF9EVF9MT09TCTB4NjAwMDAwMDAKKyNkZWZpbmUgRFRfTE9PUwkJMHg2MDAwMDAwZAorI2RlZmluZSBEVF9ISU9TCQkweDZmZmZmMDAwCisjZGVmaW5lIERUX1ZBTFJOR0xPCTB4NmZmZmZkMDAKKyNkZWZpbmUgRFRfVkFMUk5HSEkJMHg2ZmZmZmRmZgorI2RlZmluZSBEVF9BRERSUk5HTE8JMHg2ZmZmZmUwMAorI2RlZmluZSBEVF9BRERSUk5HSEkJMHg2ZmZmZmVmZgorI2RlZmluZSBEVF9WRVJTWU0JMHg2ZmZmZmZmMAorI2RlZmluZSBEVF9SRUxBQ09VTlQJMHg2ZmZmZmZmOQorI2RlZmluZSBEVF9SRUxDT1VOVAkweDZmZmZmZmZhCisjZGVmaW5lIERUX0ZMQUdTXzEJMHg2ZmZmZmZmYgorI2RlZmluZSBEVF9WRVJERUYJMHg2ZmZmZmZmYworI2RlZmluZQlEVF9WRVJERUZOVU0JMHg2ZmZmZmZmZAorI2RlZmluZSBEVF9WRVJORUVECTB4NmZmZmZmZmUKKyNkZWZpbmUJRFRfVkVSTkVFRE5VTQkweDZmZmZmZmZmCisjZGVmaW5lIE9MRF9EVF9ISU9TICAgICAweDZmZmZmZmZmCisjZGVmaW5lIERUX0xPUFJPQwkweDcwMDAwMDAwCisjZGVmaW5lIERUX0hJUFJPQwkweDdmZmZmZmZmCisKKy8qIFRoaXMgaW5mbyBpcyBuZWVkZWQgd2hlbiBwYXJzaW5nIHRoZSBzeW1ib2wgdGFibGUgKi8KKyNkZWZpbmUgU1RCX0xPQ0FMICAwCisjZGVmaW5lIFNUQl9HTE9CQUwgMQorI2RlZmluZSBTVEJfV0VBSyAgIDIKKworI2RlZmluZSBTVFRfTk9UWVBFICAwCisjZGVmaW5lIFNUVF9PQkpFQ1QgIDEKKyNkZWZpbmUgU1RUX0ZVTkMgICAgMgorI2RlZmluZSBTVFRfU0VDVElPTiAzCisjZGVmaW5lIFNUVF9GSUxFICAgIDQKKyNkZWZpbmUgU1RUX0NPTU1PTiAgNQorI2RlZmluZSBTVFRfVExTICAgICA2CisKKyNkZWZpbmUgRUxGX1NUX0JJTkQoeCkJCSgoeCkgPj4gNCkKKyNkZWZpbmUgRUxGX1NUX1RZUEUoeCkJCSgoKHVuc2lnbmVkIGludCkgeCkgJiAweGYpCisjZGVmaW5lIEVMRjMyX1NUX0JJTkQoeCkJRUxGX1NUX0JJTkQoeCkKKyNkZWZpbmUgRUxGMzJfU1RfVFlQRSh4KQlFTEZfU1RfVFlQRSh4KQorI2RlZmluZSBFTEY2NF9TVF9CSU5EKHgpCUVMRl9TVF9CSU5EKHgpCisjZGVmaW5lIEVMRjY0X1NUX1RZUEUoeCkJRUxGX1NUX1RZUEUoeCkKKwordHlwZWRlZiBzdHJ1Y3QgZHluYW1pY3sKKyAgRWxmMzJfU3dvcmQgZF90YWc7CisgIHVuaW9ueworICAgIEVsZjMyX1N3b3JkCWRfdmFsOworICAgIEVsZjMyX0FkZHIJZF9wdHI7CisgIH0gZF91bjsKK30gRWxmMzJfRHluOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEVsZjY0X1N4d29yZCBkX3RhZzsJCS8qIGVudHJ5IHRhZyB2YWx1ZSAqLworICB1bmlvbiB7CisgICAgRWxmNjRfWHdvcmQgZF92YWw7CisgICAgRWxmNjRfQWRkciBkX3B0cjsKKyAgfSBkX3VuOworfSBFbGY2NF9EeW47CisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgd2l0aCByZWxvY2F0aW9ucyAqLworI2RlZmluZSBFTEYzMl9SX1NZTSh4KSAoKHgpID4+IDgpCisjZGVmaW5lIEVMRjMyX1JfVFlQRSh4KSAoKHgpICYgMHhmZikKKworI2RlZmluZSBFTEY2NF9SX1NZTShpKQkJCSgoaSkgPj4gMzIpCisjZGVmaW5lIEVMRjY0X1JfVFlQRShpKQkJCSgoaSkgJiAweGZmZmZmZmZmKQorCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9yZWwgeworICBFbGYzMl9BZGRyCXJfb2Zmc2V0OworICBFbGYzMl9Xb3JkCXJfaW5mbzsKK30gRWxmMzJfUmVsOworCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9yZWwgeworICBFbGY2NF9BZGRyIHJfb2Zmc2V0OwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCisgIEVsZjY0X1h3b3JkIHJfaW5mbzsJLyogaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiAqLworfSBFbGY2NF9SZWw7CisKK3R5cGVkZWYgc3RydWN0IGVsZjMyX3JlbGF7CisgIEVsZjMyX0FkZHIJcl9vZmZzZXQ7CisgIEVsZjMyX1dvcmQJcl9pbmZvOworICBFbGYzMl9Td29yZAlyX2FkZGVuZDsKK30gRWxmMzJfUmVsYTsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfcmVsYSB7CisgIEVsZjY0X0FkZHIgcl9vZmZzZXQ7CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KKyAgRWxmNjRfWHdvcmQgcl9pbmZvOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCisgIEVsZjY0X1N4d29yZCByX2FkZGVuZDsJLyogQ29uc3RhbnQgYWRkZW5kIHVzZWQgdG8gY29tcHV0ZSB2YWx1ZSAqLworfSBFbGY2NF9SZWxhOworCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9zeW17CisgIEVsZjMyX1dvcmQJc3RfbmFtZTsKKyAgRWxmMzJfQWRkcglzdF92YWx1ZTsKKyAgRWxmMzJfV29yZAlzdF9zaXplOworICB1bnNpZ25lZCBjaGFyCXN0X2luZm87CisgIHVuc2lnbmVkIGNoYXIJc3Rfb3RoZXI7CisgIEVsZjMyX0hhbGYJc3Rfc2huZHg7Cit9IEVsZjMyX1N5bTsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfc3ltIHsKKyAgRWxmNjRfV29yZCBzdF9uYW1lOwkJLyogU3ltYm9sIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KKyAgdW5zaWduZWQgY2hhcglzdF9pbmZvOwkvKiBUeXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMgKi8KKyAgdW5zaWduZWQgY2hhcglzdF9vdGhlcjsJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCisgIEVsZjY0X0hhbGYgc3Rfc2huZHg7CQkvKiBBc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KKyAgRWxmNjRfQWRkciBzdF92YWx1ZTsJCS8qIFZhbHVlIG9mIHRoZSBzeW1ib2wgKi8KKyAgRWxmNjRfWHdvcmQgc3Rfc2l6ZTsJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIHNpemUgKi8KK30gRWxmNjRfU3ltOworCisKKyNkZWZpbmUgRUlfTklERU5UCTE2CisKK3R5cGVkZWYgc3RydWN0IGVsZjMyX2hkcnsKKyAgdW5zaWduZWQgY2hhcgllX2lkZW50W0VJX05JREVOVF07CisgIEVsZjMyX0hhbGYJZV90eXBlOworICBFbGYzMl9IYWxmCWVfbWFjaGluZTsKKyAgRWxmMzJfV29yZAllX3ZlcnNpb247CisgIEVsZjMyX0FkZHIJZV9lbnRyeTsgIC8qIEVudHJ5IHBvaW50ICovCisgIEVsZjMyX09mZgllX3Bob2ZmOworICBFbGYzMl9PZmYJZV9zaG9mZjsKKyAgRWxmMzJfV29yZAllX2ZsYWdzOworICBFbGYzMl9IYWxmCWVfZWhzaXplOworICBFbGYzMl9IYWxmCWVfcGhlbnRzaXplOworICBFbGYzMl9IYWxmCWVfcGhudW07CisgIEVsZjMyX0hhbGYJZV9zaGVudHNpemU7CisgIEVsZjMyX0hhbGYJZV9zaG51bTsKKyAgRWxmMzJfSGFsZgllX3Noc3RybmR4OworfSBFbGYzMl9FaGRyOworCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9oZHIgeworICB1bnNpZ25lZCBjaGFyCWVfaWRlbnRbRUlfTklERU5UXTsJLyogRUxGICJtYWdpYyBudW1iZXIiICovCisgIEVsZjY0X0hhbGYgZV90eXBlOworICBFbGY2NF9IYWxmIGVfbWFjaGluZTsKKyAgRWxmNjRfV29yZCBlX3ZlcnNpb247CisgIEVsZjY0X0FkZHIgZV9lbnRyeTsJCS8qIEVudHJ5IHBvaW50IHZpcnR1YWwgYWRkcmVzcyAqLworICBFbGY2NF9PZmYgZV9waG9mZjsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIEVsZjY0X09mZiBlX3Nob2ZmOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KKyAgRWxmNjRfV29yZCBlX2ZsYWdzOworICBFbGY2NF9IYWxmIGVfZWhzaXplOworICBFbGY2NF9IYWxmIGVfcGhlbnRzaXplOworICBFbGY2NF9IYWxmIGVfcGhudW07CisgIEVsZjY0X0hhbGYgZV9zaGVudHNpemU7CisgIEVsZjY0X0hhbGYgZV9zaG51bTsKKyAgRWxmNjRfSGFsZiBlX3Noc3RybmR4OworfSBFbGY2NF9FaGRyOworCisvKiBUaGVzZSBjb25zdGFudHMgZGVmaW5lIHRoZSBwZXJtaXNzaW9ucyBvbiBzZWN0aW9ucyBpbiB0aGUgcHJvZ3JhbQorICAgaGVhZGVyLCBwX2ZsYWdzLiAqLworI2RlZmluZSBQRl9SCQkweDQKKyNkZWZpbmUgUEZfVwkJMHgyCisjZGVmaW5lIFBGX1gJCTB4MQorCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9waGRyeworICBFbGYzMl9Xb3JkCXBfdHlwZTsKKyAgRWxmMzJfT2ZmCXBfb2Zmc2V0OworICBFbGYzMl9BZGRyCXBfdmFkZHI7CisgIEVsZjMyX0FkZHIJcF9wYWRkcjsKKyAgRWxmMzJfV29yZAlwX2ZpbGVzejsKKyAgRWxmMzJfV29yZAlwX21lbXN6OworICBFbGYzMl9Xb3JkCXBfZmxhZ3M7CisgIEVsZjMyX1dvcmQJcF9hbGlnbjsKK30gRWxmMzJfUGhkcjsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfcGhkciB7CisgIEVsZjY0X1dvcmQgcF90eXBlOworICBFbGY2NF9Xb3JkIHBfZmxhZ3M7CisgIEVsZjY0X09mZiBwX29mZnNldDsJCS8qIFNlZ21lbnQgZmlsZSBvZmZzZXQgKi8KKyAgRWxmNjRfQWRkciBwX3ZhZGRyOwkJLyogU2VnbWVudCB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgRWxmNjRfQWRkciBwX3BhZGRyOwkJLyogU2VnbWVudCBwaHlzaWNhbCBhZGRyZXNzICovCisgIEVsZjY0X1h3b3JkIHBfZmlsZXN6OwkJLyogU2VnbWVudCBzaXplIGluIGZpbGUgKi8KKyAgRWxmNjRfWHdvcmQgcF9tZW1zejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KKyAgRWxmNjRfWHdvcmQgcF9hbGlnbjsJCS8qIFNlZ21lbnQgYWxpZ25tZW50LCBmaWxlICYgbWVtb3J5ICovCit9IEVsZjY0X1BoZHI7CisKKy8qIHNoX3R5cGUgKi8KKyNkZWZpbmUgU0hUX05VTEwJMAorI2RlZmluZSBTSFRfUFJPR0JJVFMJMQorI2RlZmluZSBTSFRfU1lNVEFCCTIKKyNkZWZpbmUgU0hUX1NUUlRBQgkzCisjZGVmaW5lIFNIVF9SRUxBCTQKKyNkZWZpbmUgU0hUX0hBU0gJNQorI2RlZmluZSBTSFRfRFlOQU1JQwk2CisjZGVmaW5lIFNIVF9OT1RFCTcKKyNkZWZpbmUgU0hUX05PQklUUwk4CisjZGVmaW5lIFNIVF9SRUwJCTkKKyNkZWZpbmUgU0hUX1NITElCCTEwCisjZGVmaW5lIFNIVF9EWU5TWU0JMTEKKyNkZWZpbmUgU0hUX05VTQkJMTIKKyNkZWZpbmUgU0hUX0xPUFJPQwkweDcwMDAwMDAwCisjZGVmaW5lIFNIVF9ISVBST0MJMHg3ZmZmZmZmZgorI2RlZmluZSBTSFRfTE9VU0VSCTB4ODAwMDAwMDAKKyNkZWZpbmUgU0hUX0hJVVNFUgkweGZmZmZmZmZmCisKKy8qIHNoX2ZsYWdzICovCisjZGVmaW5lIFNIRl9XUklURQkweDEKKyNkZWZpbmUgU0hGX0FMTE9DCTB4MgorI2RlZmluZSBTSEZfRVhFQ0lOU1RSCTB4NAorI2RlZmluZSBTSEZfTUFTS1BST0MJMHhmMDAwMDAwMAorCisvKiBzcGVjaWFsIHNlY3Rpb24gaW5kZXhlcyAqLworI2RlZmluZSBTSE5fVU5ERUYJMAorI2RlZmluZSBTSE5fTE9SRVNFUlZFCTB4ZmYwMAorI2RlZmluZSBTSE5fTE9QUk9DCTB4ZmYwMAorI2RlZmluZSBTSE5fSElQUk9DCTB4ZmYxZgorI2RlZmluZSBTSE5fQUJTCQkweGZmZjEKKyNkZWZpbmUgU0hOX0NPTU1PTgkweGZmZjIKKyNkZWZpbmUgU0hOX0hJUkVTRVJWRQkweGZmZmYKKyAKK3R5cGVkZWYgc3RydWN0IGVsZjMyX3NoZHIgeworICBFbGYzMl9Xb3JkCXNoX25hbWU7CisgIEVsZjMyX1dvcmQJc2hfdHlwZTsKKyAgRWxmMzJfV29yZAlzaF9mbGFnczsKKyAgRWxmMzJfQWRkcglzaF9hZGRyOworICBFbGYzMl9PZmYJc2hfb2Zmc2V0OworICBFbGYzMl9Xb3JkCXNoX3NpemU7CisgIEVsZjMyX1dvcmQJc2hfbGluazsKKyAgRWxmMzJfV29yZAlzaF9pbmZvOworICBFbGYzMl9Xb3JkCXNoX2FkZHJhbGlnbjsKKyAgRWxmMzJfV29yZAlzaF9lbnRzaXplOworfSBFbGYzMl9TaGRyOworCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9zaGRyIHsKKyAgRWxmNjRfV29yZCBzaF9uYW1lOwkJLyogU2VjdGlvbiBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCisgIEVsZjY0X1dvcmQgc2hfdHlwZTsJCS8qIFR5cGUgb2Ygc2VjdGlvbiAqLworICBFbGY2NF9Yd29yZCBzaF9mbGFnczsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCisgIEVsZjY0X0FkZHIgc2hfYWRkcjsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLworICBFbGY2NF9PZmYgc2hfb2Zmc2V0OwkJLyogU2VjdGlvbiBmaWxlIG9mZnNldCAqLworICBFbGY2NF9Yd29yZCBzaF9zaXplOwkJLyogU2l6ZSBvZiBzZWN0aW9uIGluIGJ5dGVzICovCisgIEVsZjY0X1dvcmQgc2hfbGluazsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLworICBFbGY2NF9Xb3JkIHNoX2luZm87CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgRWxmNjRfWHdvcmQgc2hfYWRkcmFsaWduOwkvKiBTZWN0aW9uIGFsaWdubWVudCAqLworICBFbGY2NF9Yd29yZCBzaF9lbnRzaXplOwkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KK30gRWxmNjRfU2hkcjsKKworI2RlZmluZQlFSV9NQUcwCQkwCQkvKiBlX2lkZW50W10gaW5kZXhlcyAqLworI2RlZmluZQlFSV9NQUcxCQkxCisjZGVmaW5lCUVJX01BRzIJCTIKKyNkZWZpbmUJRUlfTUFHMwkJMworI2RlZmluZQlFSV9DTEFTUwk0CisjZGVmaW5lCUVJX0RBVEEJCTUKKyNkZWZpbmUJRUlfVkVSU0lPTgk2CisjZGVmaW5lCUVJX09TQUJJCTcKKyNkZWZpbmUJRUlfUEFECQk4CisKKyNkZWZpbmUJRUxGTUFHMAkJMHg3ZgkJLyogRUlfTUFHICovCisjZGVmaW5lCUVMRk1BRzEJCSdFJworI2RlZmluZQlFTEZNQUcyCQknTCcKKyNkZWZpbmUJRUxGTUFHMwkJJ0YnCisjZGVmaW5lCUVMRk1BRwkJIlwxNzdFTEYiCisjZGVmaW5lCVNFTEZNQUcJCTQKKworI2RlZmluZQlFTEZDTEFTU05PTkUJMAkJLyogRUlfQ0xBU1MgKi8KKyNkZWZpbmUJRUxGQ0xBU1MzMgkxCisjZGVmaW5lCUVMRkNMQVNTNjQJMgorI2RlZmluZQlFTEZDTEFTU05VTQkzCisKKyNkZWZpbmUgRUxGREFUQU5PTkUJMAkJLyogZV9pZGVudFtFSV9EQVRBXSAqLworI2RlZmluZSBFTEZEQVRBMkxTQgkxCisjZGVmaW5lIEVMRkRBVEEyTVNCCTIKKworI2RlZmluZSBFVl9OT05FCQkwCQkvKiBlX3ZlcnNpb24sIEVJX1ZFUlNJT04gKi8KKyNkZWZpbmUgRVZfQ1VSUkVOVAkxCisjZGVmaW5lIEVWX05VTQkJMgorCisjZGVmaW5lIEVMRk9TQUJJX05PTkUJMAorI2RlZmluZSBFTEZPU0FCSV9MSU5VWAkzCisKKyNpZm5kZWYgRUxGX09TQUJJCisjZGVmaW5lIEVMRl9PU0FCSSBFTEZPU0FCSV9OT05FCisjZW5kaWYKKworLyoKKyAqIE5vdGVzIHVzZWQgaW4gRVRfQ09SRS4gQXJjaGl0ZWN0dXJlcyBleHBvcnQgc29tZSBvZiB0aGUgYXJjaCByZWdpc3RlciBzZXRzCisgKiB1c2luZyB0aGUgY29ycmVzcG9uZGluZyBub3RlIHR5cGVzIHZpYSB0aGUgUFRSQUNFX0dFVFJFR1NFVCBhbmQKKyAqIFBUUkFDRV9TRVRSRUdTRVQgcmVxdWVzdHMuCisgKi8KKyNkZWZpbmUgTlRfUFJTVEFUVVMJMQorI2RlZmluZSBOVF9QUkZQUkVHCTIKKyNkZWZpbmUgTlRfUFJQU0lORk8JMworI2RlZmluZSBOVF9UQVNLU1RSVUNUCTQKKyNkZWZpbmUgTlRfQVVYVgkJNgorI2RlZmluZSBOVF9QUlhGUFJFRyAgICAgMHg0NmU2MmI3ZiAgICAgIC8qIGNvcGllZCBmcm9tIGdkYjUuMS9pbmNsdWRlL2VsZi9jb21tb24uaCAqLworI2RlZmluZSBOVF9QUENfVk1YCTB4MTAwCQkvKiBQb3dlclBDIEFsdGl2ZWMvVk1YIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVF9QUENfU1BFCTB4MTAxCQkvKiBQb3dlclBDIFNQRS9FVlIgcmVnaXN0ZXJzICovCisjZGVmaW5lIE5UX1BQQ19WU1gJMHgxMDIJCS8qIFBvd2VyUEMgVlNYIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVF8zODZfVExTCTB4MjAwCQkvKiBpMzg2IFRMUyBzbG90cyAoc3RydWN0IHVzZXJfZGVzYykgKi8KKyNkZWZpbmUgTlRfMzg2X0lPUEVSTQkweDIwMQkJLyogeDg2IGlvIHBlcm1pc3Npb24gYml0bWFwICgxPWRlbnkpICovCisjZGVmaW5lIE5UX1g4Nl9YU1RBVEUJMHgyMDIJCS8qIHg4NiBleHRlbmRlZCBzdGF0ZSB1c2luZyB4c2F2ZSAqLworI2RlZmluZSBOVF9TMzkwX0hJR0hfR1BSUwkweDMwMAkvKiBzMzkwIHVwcGVyIHJlZ2lzdGVyIGhhbHZlcyAqLworI2RlZmluZSBOVF9TMzkwX1RJTUVSCTB4MzAxCQkvKiBzMzkwIHRpbWVyIHJlZ2lzdGVyICovCisjZGVmaW5lIE5UX1MzOTBfVE9EQ01QCTB4MzAyCQkvKiBzMzkwIFRPRCBjbG9jayBjb21wYXJhdG9yIHJlZ2lzdGVyICovCisjZGVmaW5lIE5UX1MzOTBfVE9EUFJFRwkweDMwMwkJLyogczM5MCBUT0QgcHJvZ3JhbW1hYmxlIHJlZ2lzdGVyICovCisjZGVmaW5lIE5UX1MzOTBfQ1RSUwkweDMwNAkJLyogczM5MCBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVF9TMzkwX1BSRUZJWAkweDMwNQkJLyogczM5MCBwcmVmaXggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTlRfUzM5MF9MQVNUX0JSRUFLCTB4MzA2CS8qIHMzOTAgYnJlYWtpbmcgZXZlbnQgYWRkcmVzcyAqLworI2RlZmluZSBOVF9TMzkwX1NZU1RFTV9DQUxMCTB4MzA3CS8qIHMzOTAgc3lzdGVtIGNhbGwgcmVzdGFydCBkYXRhICovCisjZGVmaW5lIE5UX0FSTV9WRlAJMHg0MDAJCS8qIEFSTSBWRlAvTkVPTiByZWdpc3RlcnMgKi8KKworCisvKiBOb3RlIGhlYWRlciBpbiBhIFBUX05PVEUgc2VjdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfbm90ZSB7CisgIEVsZjMyX1dvcmQJbl9uYW1lc3o7CS8qIE5hbWUgc2l6ZSAqLworICBFbGYzMl9Xb3JkCW5fZGVzY3N6OwkvKiBDb250ZW50IHNpemUgKi8KKyAgRWxmMzJfV29yZAluX3R5cGU7CQkvKiBDb250ZW50IHR5cGUgKi8KK30gRWxmMzJfTmhkcjsKKworLyogTm90ZSBoZWFkZXIgaW4gYSBQVF9OT1RFIHNlY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IGVsZjY0X25vdGUgeworICBFbGY2NF9Xb3JkIG5fbmFtZXN6OwkvKiBOYW1lIHNpemUgKi8KKyAgRWxmNjRfV29yZCBuX2Rlc2NzejsJLyogQ29udGVudCBzaXplICovCisgIEVsZjY0X1dvcmQgbl90eXBlOwkvKiBDb250ZW50IHR5cGUgKi8KK30gRWxmNjRfTmhkcjsKKworI2VuZGlmIC8qIF9MSU5VWF9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lbGZjb3JlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZmNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQ3ODRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lbGZjb3JlLmgKQEAgLTAsMCArMSw5NiBAQAorI2lmbmRlZiBfTElOVVhfRUxGQ09SRV9ICisjZGVmaW5lIF9MSU5VWF9FTEZDT1JFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKK3N0cnVjdCBlbGZfc2lnaW5mbworeworCWludAlzaV9zaWdubzsJCQkvKiBzaWduYWwgbnVtYmVyICovCisJaW50CXNpX2NvZGU7CQkJLyogZXh0cmEgY29kZSAqLworCWludAlzaV9lcnJubzsJCQkvKiBlcnJubyAqLworfTsKKworCit0eXBlZGVmIGVsZl9ncmVnX3QgZ3JlZ190OwordHlwZWRlZiBlbGZfZ3JlZ3NldF90IGdyZWdzZXRfdDsKK3R5cGVkZWYgZWxmX2ZwcmVnc2V0X3QgZnByZWdzZXRfdDsKK3R5cGVkZWYgZWxmX2ZweHJlZ3NldF90IGZweHJlZ3NldF90OworI2RlZmluZSBOR1JFRyBFTEZfTkdSRUcKKworLyoKKyAqIERlZmluaXRpb25zIHRvIGdlbmVyYXRlIEludGVsIFNWUjQtbGlrZSBjb3JlIGZpbGVzLgorICogVGhlc2UgbW9zdGx5IGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIFNWUjQgdHlwZXMgd2l0aCAiZWxmXyIKKyAqIHRhY2tlZCBvbiB0aGUgZnJvbnQgdG8gcHJldmVudCBjbGFzaGVzIHdpdGggbGludXggZGVmaW5pdGlvbnMsCisgKiBhbmQgdGhlIHR5cGVkZWYgZm9ybXMgaGF2ZSBiZWVuIGF2b2lkZWQuICBUaGlzIGlzIG1vc3RseSBsaWtlCisgKiB0aGUgU1ZSNCBzdHJ1Y3R1cmUsIGJ1dCBtb3JlIExpbnV4eSwgd2l0aCB0aGluZ3MgdGhhdCBMaW51eCBkb2VzCisgKiBub3Qgc3VwcG9ydCBhbmQgd2hpY2ggZ2RiIGRvZXNuJ3QgcmVhbGx5IHVzZSBleGNsdWRlZC4KKyAqIEZpZWxkcyBwcmVzZW50IGJ1dCBub3QgdXNlZCBhcmUgbWFya2VkIHdpdGggIlhYWCIuCisgKi8KK3N0cnVjdCBlbGZfcHJzdGF0dXMKK3sKKyNpZiAwCisJbG9uZwlwcl9mbGFnczsJLyogWFhYIFByb2Nlc3MgZmxhZ3MgKi8KKwlzaG9ydAlwcl93aHk7CQkvKiBYWFggUmVhc29uIGZvciBwcm9jZXNzIGhhbHQgKi8KKwlzaG9ydAlwcl93aGF0OwkvKiBYWFggTW9yZSBkZXRhaWxlZCByZWFzb24gKi8KKyNlbmRpZgorCXN0cnVjdCBlbGZfc2lnaW5mbyBwcl9pbmZvOwkvKiBJbmZvIGFzc29jaWF0ZWQgd2l0aCBzaWduYWwgKi8KKwlzaG9ydAlwcl9jdXJzaWc7CQkvKiBDdXJyZW50IHNpZ25hbCAqLworCXVuc2lnbmVkIGxvbmcgcHJfc2lncGVuZDsJLyogU2V0IG9mIHBlbmRpbmcgc2lnbmFscyAqLworCXVuc2lnbmVkIGxvbmcgcHJfc2lnaG9sZDsJLyogU2V0IG9mIGhlbGQgc2lnbmFscyAqLworI2lmIDAKKwlzdHJ1Y3Qgc2lnYWx0c3RhY2sgcHJfYWx0c3RhY2s7CS8qIEFsdGVybmF0ZSBzdGFjayBpbmZvICovCisJc3RydWN0IHNpZ2FjdGlvbiBwcl9hY3Rpb247CS8qIFNpZ25hbCBhY3Rpb24gZm9yIGN1cnJlbnQgc2lnICovCisjZW5kaWYKKwlwaWRfdAlwcl9waWQ7CisJcGlkX3QJcHJfcHBpZDsKKwlwaWRfdAlwcl9wZ3JwOworCXBpZF90CXByX3NpZDsKKwlzdHJ1Y3QgdGltZXZhbCBwcl91dGltZTsJLyogVXNlciB0aW1lICovCisJc3RydWN0IHRpbWV2YWwgcHJfc3RpbWU7CS8qIFN5c3RlbSB0aW1lICovCisJc3RydWN0IHRpbWV2YWwgcHJfY3V0aW1lOwkvKiBDdW11bGF0aXZlIHVzZXIgdGltZSAqLworCXN0cnVjdCB0aW1ldmFsIHByX2NzdGltZTsJLyogQ3VtdWxhdGl2ZSBzeXN0ZW0gdGltZSAqLworI2lmIDAKKwlsb25nCXByX2luc3RyOwkJLyogQ3VycmVudCBpbnN0cnVjdGlvbiAqLworI2VuZGlmCisJZWxmX2dyZWdzZXRfdCBwcl9yZWc7CS8qIEdQIHJlZ2lzdGVycyAqLworI2lmZGVmIENPTkZJR19CSU5GTVRfRUxGX0ZEUElDCisJLyogV2hlbiB1c2luZyBGRFBJQywgdGhlIGxvYWRtYXAgYWRkcmVzc2VzIG5lZWQgdG8gYmUgY29tbXVuaWNhdGVkCisJICogdG8gR0RCIGluIG9yZGVyIGZvciBHREIgdG8gZG8gdGhlIG5lY2Vzc2FyeSByZWxvY2F0aW9ucy4gIFRoZQorCSAqIGZpZWxkcyAoYmVsb3cpIHVzZWQgdG8gY29tbXVuaWNhdGUgdGhpcyBpbmZvcm1hdGlvbiBhcmUgcGxhY2VkCisJICogaW1tZWRpYXRlbHkgYWZ0ZXIgYGBwcl9yZWcnJywgc28gdGhhdCB0aGUgbG9hZG1hcCBhZGRyZXNzZXMgbWF5CisJICogYmUgdmlld2VkIGFzIHBhcnQgb2YgdGhlIHJlZ2lzdGVyIHNldCBpZiBzbyBkZXNpcmVkLgorCSAqLworCXVuc2lnbmVkIGxvbmcgcHJfZXhlY19mZHBpY19sb2FkbWFwOworCXVuc2lnbmVkIGxvbmcgcHJfaW50ZXJwX2ZkcGljX2xvYWRtYXA7CisjZW5kaWYKKwlpbnQgcHJfZnB2YWxpZDsJCS8qIFRydWUgaWYgbWF0aCBjby1wcm9jZXNzb3IgYmVpbmcgdXNlZC4gICovCit9OworCisjZGVmaW5lIEVMRl9QUkFSR1NaCSg4MCkJLyogTnVtYmVyIG9mIGNoYXJzIGZvciBhcmdzICovCisKK3N0cnVjdCBlbGZfcHJwc2luZm8KK3sKKwljaGFyCXByX3N0YXRlOwkvKiBudW1lcmljIHByb2Nlc3Mgc3RhdGUgKi8KKwljaGFyCXByX3NuYW1lOwkvKiBjaGFyIGZvciBwcl9zdGF0ZSAqLworCWNoYXIJcHJfem9tYjsJLyogem9tYmllICovCisJY2hhcglwcl9uaWNlOwkvKiBuaWNlIHZhbCAqLworCXVuc2lnbmVkIGxvbmcgcHJfZmxhZzsJLyogZmxhZ3MgKi8KKwlfX2tlcm5lbF91aWRfdAlwcl91aWQ7CisJX19rZXJuZWxfZ2lkX3QJcHJfZ2lkOworCXBpZF90CXByX3BpZCwgcHJfcHBpZCwgcHJfcGdycCwgcHJfc2lkOworCS8qIExvdHMgbWlzc2luZyAqLworCWNoYXIJcHJfZm5hbWVbMTZdOwkvKiBmaWxlbmFtZSBvZiBleGVjdXRhYmxlICovCisJY2hhcglwcl9wc2FyZ3NbRUxGX1BSQVJHU1pdOwkvKiBpbml0aWFsIHBhcnQgb2YgYXJnIGxpc3QgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGVsZl9wcnN0YXR1cyBwcnN0YXR1c190OwordHlwZWRlZiBzdHJ1Y3QgZWxmX3BycHNpbmZvIHBycHNpbmZvX3Q7CisjZGVmaW5lIFBSQVJHU1ogRUxGX1BSQVJHU1ogCisKKworI2VuZGlmIC8qIF9MSU5VWF9FTEZDT1JFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXJybm8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg1ZmEzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lcnJuby5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfTElOVVhfRVJSTk9fSAorI2RlZmluZSBfTElOVVhfRVJSTk9fSAorCisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VycnF1ZXVlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VycnF1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiMGFkYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXJycXVldWUuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9MSU5VWF9FUlJRVUVVRV9ICisjZGVmaW5lIF9MSU5VWF9FUlJRVUVVRV9IIDEKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBzb2NrX2V4dGVuZGVkX2VyciB7CisJX191MzIJZWVfZXJybm87CQorCV9fdTgJZWVfb3JpZ2luOworCV9fdTgJZWVfdHlwZTsKKwlfX3U4CWVlX2NvZGU7CisJX191OAllZV9wYWQ7CisJX191MzIgICBlZV9pbmZvOworCV9fdTMyICAgZWVfZGF0YTsKK307CisKKyNkZWZpbmUgU09fRUVfT1JJR0lOX05PTkUJMAorI2RlZmluZSBTT19FRV9PUklHSU5fTE9DQUwJMQorI2RlZmluZSBTT19FRV9PUklHSU5fSUNNUAkyCisjZGVmaW5lIFNPX0VFX09SSUdJTl9JQ01QNgkzCisjZGVmaW5lIFNPX0VFX09SSUdJTl9USU1FU1RBTVBJTkcgNAorCisjZGVmaW5lIFNPX0VFX09GRkVOREVSKGVlKQkoKHN0cnVjdCBzb2NrYWRkciopKChlZSkrMSkpCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXRodG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjAzN2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaApAQCAtMCwwICsxLDk0MCBAQAorLyoKKyAqIGV0aHRvb2wuaDogRGVmaW5lcyBmb3IgTGludXggZXRodG9vbC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IDIwMDEgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDEgU3VuIE1pY3Jvc3lzdGVtcyAodGhvY2tpbkBzdW4uY29tKQorICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDIgSW50ZWwgKGVsaS5rdXBlcm1hbm5AaW50ZWwuY29tLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocmlzdG9waGVyLmxlZWNoQGludGVsLmNvbSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY290dC5mZWxkbWFuQGludGVsLmNvbSkKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgU3VuIE1pY3Jvc3lzdGVtcyAyMDA4CisgKi8KKworI2lmbmRlZiBfTElOVVhfRVRIVE9PTF9ICisjZGVmaW5lIF9MSU5VWF9FVEhUT09MX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKworLyogVGhpcyBzaG91bGQgd29yayBmb3IgYm90aCAzMiBhbmQgNjQgYml0IHVzZXJsYW5kLiAqLworc3RydWN0IGV0aHRvb2xfY21kIHsKKwlfX3UzMgljbWQ7CisJX191MzIJc3VwcG9ydGVkOwkvKiBGZWF0dXJlcyB0aGlzIGludGVyZmFjZSBzdXBwb3J0cyAqLworCV9fdTMyCWFkdmVydGlzaW5nOwkvKiBGZWF0dXJlcyB0aGlzIGludGVyZmFjZSBhZHZlcnRpc2VzICovCisJX191MTYJc3BlZWQ7CSAgICAgICAgLyogVGhlIGZvcmNlZCBzcGVlZCAobG93ZXIgYml0cykgaW4KKwkJCQkgKiBNYnBzLiBQbGVhc2UgdXNlCisJCQkJICogZXRodG9vbF9jbWRfc3BlZWQoKS9fc2V0KCkgdG8KKwkJCQkgKiBhY2Nlc3MgaXQgKi8KKwlfX3U4CWR1cGxleDsJCS8qIER1cGxleCwgaGFsZiBvciBmdWxsICovCisJX191OAlwb3J0OwkJLyogV2hpY2ggY29ubmVjdG9yIHBvcnQgKi8KKwlfX3U4CXBoeV9hZGRyZXNzOworCV9fdTgJdHJhbnNjZWl2ZXI7CS8qIFdoaWNoIHRyYW5zY2VpdmVyIHRvIHVzZSAqLworCV9fdTgJYXV0b25lZzsJLyogRW5hYmxlIG9yIGRpc2FibGUgYXV0b25lZ290aWF0aW9uICovCisJX191OAltZGlvX3N1cHBvcnQ7CisJX191MzIJbWF4dHhwa3Q7CS8qIFR4IHBrdHMgYmVmb3JlIGdlbmVyYXRpbmcgdHggaW50ICovCisJX191MzIJbWF4cnhwa3Q7CS8qIFJ4IHBrdHMgYmVmb3JlIGdlbmVyYXRpbmcgcnggaW50ICovCisJX191MTYJc3BlZWRfaGk7ICAgICAgIC8qIFRoZSBmb3JjZWQgc3BlZWQgKHVwcGVyCisJCQkJICogYml0cykgaW4gTWJwcy4gUGxlYXNlIHVzZQorCQkJCSAqIGV0aHRvb2xfY21kX3NwZWVkKCkvX3NldCgpIHRvCisJCQkJICogYWNjZXNzIGl0ICovCisJX191OAlldGhfdHBfbWRpeDsKKwlfX3U4CXJlc2VydmVkMjsKKwlfX3UzMglscF9hZHZlcnRpc2luZzsJLyogRmVhdHVyZXMgdGhlIGxpbmsgcGFydG5lciBhZHZlcnRpc2VzICovCisJX191MzIJcmVzZXJ2ZWRbMl07Cit9OworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGV0aHRvb2xfY21kX3NwZWVkX3NldChzdHJ1Y3QgZXRodG9vbF9jbWQgKmVwLAorCQkJCQkgX191MzIgc3BlZWQpCit7CisKKwllcC0+c3BlZWQgPSAoX191MTYpc3BlZWQ7CisJZXAtPnNwZWVkX2hpID0gKF9fdTE2KShzcGVlZCA+PiAxNik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIGV0aHRvb2xfY21kX3NwZWVkKGNvbnN0IHN0cnVjdCBldGh0b29sX2NtZCAqZXApCit7CisJcmV0dXJuIChlcC0+c3BlZWRfaGkgPDwgMTYpIHwgZXAtPnNwZWVkOworfQorCisjZGVmaW5lIEVUSFRPT0xfRldWRVJTX0xFTgkzMgorI2RlZmluZSBFVEhUT09MX0JVU0lORk9fTEVOCTMyCisvKiB0aGVzZSBzdHJpbmdzIGFyZSBzZXQgdG8gd2hhdGV2ZXIgdGhlIGRyaXZlciBhdXRob3IgZGVjaWRlcy4uLiAqLworc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyB7CisJX191MzIJY21kOworCWNoYXIJZHJpdmVyWzMyXTsJLyogZHJpdmVyIHNob3J0IG5hbWUsICJ0dWxpcCIsICJlZXBybzEwMCIgKi8KKwljaGFyCXZlcnNpb25bMzJdOwkvKiBkcml2ZXIgdmVyc2lvbiBzdHJpbmcgKi8KKwljaGFyCWZ3X3ZlcnNpb25bRVRIVE9PTF9GV1ZFUlNfTEVOXTsJLyogZmlybXdhcmUgdmVyc2lvbiBzdHJpbmcgKi8KKwljaGFyCWJ1c19pbmZvW0VUSFRPT0xfQlVTSU5GT19MRU5dOwkvKiBCdXMgaW5mbyBmb3IgdGhpcyBJRi4gKi8KKwkJCQkvKiBGb3IgUENJIGRldmljZXMsIHVzZSBwY2lfbmFtZShwY2lfZGV2KS4gKi8KKwljaGFyCXJlc2VydmVkMVszMl07CisJY2hhcglyZXNlcnZlZDJbMTJdOworCQkJCS8qCisJCQkJICogU29tZSBzdHJ1Y3QgbWVtYmVycyBiZWxvdyBhcmUgZmlsbGVkIGluCisJCQkJICogdXNpbmcgb3BzLT5nZXRfc3NldF9jb3VudCgpLiAgT2J0YWluaW5nCisJCQkJICogdGhpcyBpbmZvIGZyb20gZXRodG9vbF9kcnZpbmZvIGlzIG5vdworCQkJCSAqIGRlcHJlY2F0ZWQ7IFVzZSBFVEhUT09MX0dTU0VUX0lORk8KKwkJCQkgKiBpbnN0ZWFkLgorCQkJCSAqLworCV9fdTMyCW5fcHJpdl9mbGFnczsJLyogbnVtYmVyIG9mIGZsYWdzIHZhbGlkIGluIEVUSFRPT0xfR1BGTEFHUyAqLworCV9fdTMyCW5fc3RhdHM7CS8qIG51bWJlciBvZiB1NjQncyBmcm9tIEVUSFRPT0xfR1NUQVRTICovCisJX191MzIJdGVzdGluZm9fbGVuOworCV9fdTMyCWVlZHVtcF9sZW47CS8qIFNpemUgb2YgZGF0YSBmcm9tIEVUSFRPT0xfR0VFUFJPTSAoYnl0ZXMpICovCisJX191MzIJcmVnZHVtcF9sZW47CS8qIFNpemUgb2YgZGF0YSBmcm9tIEVUSFRPT0xfR1JFR1MgKGJ5dGVzKSAqLworfTsKKworI2RlZmluZSBTT1BBU1NfTUFYCTYKKy8qIHdha2Utb24tbGFuIHNldHRpbmdzICovCitzdHJ1Y3QgZXRodG9vbF93b2xpbmZvIHsKKwlfX3UzMgljbWQ7CisJX191MzIJc3VwcG9ydGVkOworCV9fdTMyCXdvbG9wdHM7CisJX191OAlzb3Bhc3NbU09QQVNTX01BWF07IC8qIFNlY3VyZU9uKHRtKSBwYXNzd29yZCAqLworfTsKKworLyogZm9yIHBhc3Npbmcgc2luZ2xlIHZhbHVlcyAqLworc3RydWN0IGV0aHRvb2xfdmFsdWUgeworCV9fdTMyCWNtZDsKKwlfX3UzMglkYXRhOworfTsKKworLyogZm9yIHBhc3NpbmcgYmlnIGNodW5rcyBvZiBkYXRhICovCitzdHJ1Y3QgZXRodG9vbF9yZWdzIHsKKwlfX3UzMgljbWQ7CisJX191MzIJdmVyc2lvbjsgLyogZHJpdmVyLXNwZWNpZmljLCBpbmRpY2F0ZXMgZGlmZmVyZW50IGNoaXBzL3JldnMgKi8KKwlfX3UzMglsZW47IC8qIGJ5dGVzICovCisJX191OAlkYXRhWzBdOworfTsKKworLyogZm9yIHBhc3NpbmcgRUVQUk9NIGNodW5rcyAqLworc3RydWN0IGV0aHRvb2xfZWVwcm9tIHsKKwlfX3UzMgljbWQ7CisJX191MzIJbWFnaWM7CisJX191MzIJb2Zmc2V0OyAvKiBpbiBieXRlcyAqLworCV9fdTMyCWxlbjsgLyogaW4gYnl0ZXMgKi8KKwlfX3U4CWRhdGFbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlIC0gY29hbGVzY2luZyBwYXJhbWV0ZXJzIGZvciBJUlFzIGFuZCBzdGF0cyB1cGRhdGVzCisgKiBAY21kOiBFVEhUT09MX3tHLFN9Q09BTEVTQ0UKKyAqIEByeF9jb2FsZXNjZV91c2VjczogSG93IG1hbnkgdXNlY3MgdG8gZGVsYXkgYW4gUlggaW50ZXJydXB0IGFmdGVyCisgKglhIHBhY2tldCBhcnJpdmVzLgorICogQHJ4X21heF9jb2FsZXNjZWRfZnJhbWVzOiBNYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIHRvIHJlY2VpdmUKKyAqCWJlZm9yZSBhbiBSWCBpbnRlcnJ1cHQuCisgKiBAcnhfY29hbGVzY2VfdXNlY3NfaXJxOiBTYW1lIGFzIEByeF9jb2FsZXNjZV91c2VjcywgZXhjZXB0IHRoYXQKKyAqCXRoaXMgdmFsdWUgYXBwbGllcyB3aGlsZSBhbiBJUlEgaXMgYmVpbmcgc2VydmljZWQgYnkgdGhlIGhvc3QuCisgKiBAcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxOiBTYW1lIGFzIEByeF9tYXhfY29hbGVzY2VkX2ZyYW1lcywKKyAqCWV4Y2VwdCB0aGF0IHRoaXMgdmFsdWUgYXBwbGllcyB3aGlsZSBhbiBJUlEgaXMgYmVpbmcgc2VydmljZWQKKyAqCWJ5IHRoZSBob3N0LgorICogQHR4X2NvYWxlc2NlX3VzZWNzOiBIb3cgbWFueSB1c2VjcyB0byBkZWxheSBhIFRYIGludGVycnVwdCBhZnRlcgorICoJYSBwYWNrZXQgaXMgc2VudC4KKyAqIEB0eF9tYXhfY29hbGVzY2VkX2ZyYW1lczogTWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyB0byBiZSBzZW50CisgKgliZWZvcmUgYSBUWCBpbnRlcnJ1cHQuCisgKiBAdHhfY29hbGVzY2VfdXNlY3NfaXJxOiBTYW1lIGFzIEB0eF9jb2FsZXNjZV91c2VjcywgZXhjZXB0IHRoYXQKKyAqCXRoaXMgdmFsdWUgYXBwbGllcyB3aGlsZSBhbiBJUlEgaXMgYmVpbmcgc2VydmljZWQgYnkgdGhlIGhvc3QuCisgKiBAdHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxOiBTYW1lIGFzIEB0eF9tYXhfY29hbGVzY2VkX2ZyYW1lcywKKyAqCWV4Y2VwdCB0aGF0IHRoaXMgdmFsdWUgYXBwbGllcyB3aGlsZSBhbiBJUlEgaXMgYmVpbmcgc2VydmljZWQKKyAqCWJ5IHRoZSBob3N0LgorICogQHN0YXRzX2Jsb2NrX2NvYWxlc2NlX3VzZWNzOiBIb3cgbWFueSB1c2VjcyB0byBkZWxheSBpbi1tZW1vcnkKKyAqCXN0YXRpc3RpY3MgYmxvY2sgdXBkYXRlcy4gIFNvbWUgZHJpdmVycyBkbyBub3QgaGF2ZSBhbgorICoJaW4tbWVtb3J5IHN0YXRpc3RpYyBibG9jaywgYW5kIGluIHN1Y2ggY2FzZXMgdGhpcyB2YWx1ZSBpcworICoJaWdub3JlZC4gIFRoaXMgdmFsdWUgbXVzdCBub3QgYmUgemVyby4KKyAqIEB1c2VfYWRhcHRpdmVfcnhfY29hbGVzY2U6IEVuYWJsZSBhZGFwdGl2ZSBSWCBjb2FsZXNjaW5nLgorICogQHVzZV9hZGFwdGl2ZV90eF9jb2FsZXNjZTogRW5hYmxlIGFkYXB0aXZlIFRYIGNvYWxlc2NpbmcuCisgKiBAcGt0X3JhdGVfbG93OiBUaHJlc2hvbGQgZm9yIGxvdyBwYWNrZXQgcmF0ZSAocGFja2V0cyBwZXIgc2Vjb25kKS4KKyAqIEByeF9jb2FsZXNjZV91c2Vjc19sb3c6IEhvdyBtYW55IHVzZWNzIHRvIGRlbGF5IGFuIFJYIGludGVycnVwdCBhZnRlcgorICoJYSBwYWNrZXQgYXJyaXZlcywgd2hlbiB0aGUgcGFja2V0IHJhdGUgaXMgYmVsb3cgQHBrdF9yYXRlX2xvdy4KKyAqIEByeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19sb3c6IE1heGltdW0gbnVtYmVyIG9mIHBhY2tldHMgdG8gYmUgcmVjZWl2ZWQKKyAqCWJlZm9yZSBhbiBSWCBpbnRlcnJ1cHQsIHdoZW4gdGhlIHBhY2tldCByYXRlIGlzIGJlbG93IEBwa3RfcmF0ZV9sb3cuCisgKiBAdHhfY29hbGVzY2VfdXNlY3NfbG93OiBIb3cgbWFueSB1c2VjcyB0byBkZWxheSBhIFRYIGludGVycnVwdCBhZnRlcgorICoJYSBwYWNrZXQgaXMgc2VudCwgd2hlbiB0aGUgcGFja2V0IHJhdGUgaXMgYmVsb3cgQHBrdF9yYXRlX2xvdy4KKyAqIEB0eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19sb3c6IE1heGltdW0gbnV1bWJlciBvZiBwYWNrZXRzIHRvIGJlIHNlbnQgYmVmb3JlCisgKglhIFRYIGludGVycnVwdCwgd2hlbiB0aGUgcGFja2V0IHJhdGUgaXMgYmVsb3cgQHBrdF9yYXRlX2xvdy4KKyAqIEBwa3RfcmF0ZV9oaWdoOiBUaHJlc2hvbGQgZm9yIGhpZ2ggcGFja2V0IHJhdGUgKHBhY2tldHMgcGVyIHNlY29uZCkuCisgKiBAcnhfY29hbGVzY2VfdXNlY3NfaGlnaDogSG93IG1hbnkgdXNlY3MgdG8gZGVsYXkgYW4gUlggaW50ZXJydXB0IGFmdGVyCisgKglhIHBhY2tldCBhcnJpdmVzLCB3aGVuIHRoZSBwYWNrZXQgcmF0ZSBpcyBhYm92ZSBAcGt0X3JhdGVfaGlnaC4KKyAqIEByeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19oaWdoOiBNYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIHRvIGJlIHJlY2VpdmVkCisgKgliZWZvcmUgYW4gUlggaW50ZXJydXB0LCB3aGVuIHRoZSBwYWNrZXQgcmF0ZSBpcyBhYm92ZSBAcGt0X3JhdGVfaGlnaC4KKyAqIEB0eF9jb2FsZXNjZV91c2Vjc19oaWdoOiBIb3cgbWFueSB1c2VjcyB0byBkZWxheSBhIFRYIGludGVycnVwdCBhZnRlcgorICoJYSBwYWNrZXQgaXMgc2VudCwgd2hlbiB0aGUgcGFja2V0IHJhdGUgaXMgYWJvdmUgQHBrdF9yYXRlX2hpZ2guCisgKiBAdHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaGlnaDogTWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyB0byBiZSBzZW50IGJlZm9yZQorICoJYSBUWCBpbnRlcnJ1cHQsIHdoZW4gdGhlIHBhY2tldCByYXRlIGlzIGFib3ZlIEBwa3RfcmF0ZV9oaWdoLgorICogQHJhdGVfc2FtcGxlX2ludGVydmFsOiBIb3cgb2Z0ZW4gdG8gZG8gYWRhcHRpdmUgY29hbGVzY2luZyBwYWNrZXQgcmF0ZQorICoJc2FtcGxpbmcsIG1lYXN1cmVkIGluIHNlY29uZHMuICBNdXN0IG5vdCBiZSB6ZXJvLgorICoKKyAqIEVhY2ggcGFpciBvZiAodXNlY3MsIG1heF9mcmFtZXMpIGZpZWxkcyBzcGVjaWZpZXMgdGhpcyBleGl0CisgKiBjb25kaXRpb24gZm9yIGludGVycnVwdCBjb2FsZXNjaW5nOgorICoJKHVzZWNzID4gMCAmJiB0aW1lX3NpbmNlX2ZpcnN0X2NvbXBsZXRpb24gPj0gdXNlY3MpIHx8CisgKgkobWF4X2ZyYW1lcyA+IDAgJiYgY29tcGxldGVkX2ZyYW1lcyA+PSBtYXhfZnJhbWVzKQorICogSXQgaXMgaWxsZWdhbCB0byBzZXQgYm90aCB1c2VjcyBhbmQgbWF4X2ZyYW1lcyB0byB6ZXJvIGFzIHRoaXMKKyAqIHdvdWxkIGNhdXNlIGludGVycnVwdHMgdG8gbmV2ZXIgYmUgZ2VuZXJhdGVkLiAgVG8gZGlzYWJsZQorICogY29hbGVzY2luZywgc2V0IHVzZWNzID0gMCBhbmQgbWF4X2ZyYW1lcyA9IDEuCisgKgorICogU29tZSBpbXBsZW1lbnRhdGlvbnMgaWdub3JlIHRoZSB2YWx1ZSBvZiBtYXhfZnJhbWVzIGFuZCB1c2UgdGhlCisgKiBjb25kaXRpb246CisgKgl0aW1lX3NpbmNlX2ZpcnN0X2NvbXBsZXRpb24gPj0gdXNlY3MKKyAqIFRoaXMgaXMgZGVwcmVjYXRlZC4gIERyaXZlcnMgZm9yIGhhcmR3YXJlIHRoYXQgZG9lcyBub3Qgc3VwcG9ydAorICogY291bnRpbmcgY29tcGxldGlvbnMgc2hvdWxkIHZhbGlkYXRlIHRoYXQgbWF4X2ZyYW1lcyA9PSAhcnhfdXNlY3MuCisgKgorICogQWRhcHRpdmUgUlgvVFggY29hbGVzY2luZyBpcyBhbiBhbGdvcml0aG0gaW1wbGVtZW50ZWQgYnkgc29tZQorICogZHJpdmVycyB0byBpbXByb3ZlIGxhdGVuY3kgdW5kZXIgbG93IHBhY2tldCByYXRlcyBhbmQgaW1wcm92ZQorICogdGhyb3VnaHB1dCB1bmRlciBoaWdoIHBhY2tldCByYXRlcy4gIFNvbWUgZHJpdmVycyBvbmx5IGltcGxlbWVudAorICogb25lIG9mIFJYIG9yIFRYIGFkYXB0aXZlIGNvYWxlc2NpbmcuICBBbnl0aGluZyBub3QgaW1wbGVtZW50ZWQgYnkKKyAqIHRoZSBkcml2ZXIgY2F1c2VzIHRoZXNlIHZhbHVlcyB0byBiZSBzaWxlbnRseSBpZ25vcmVkLgorICoKKyAqIFdoZW4gdGhlIHBhY2tldCByYXRlIGlzIGJlbG93IEBwa3RfcmF0ZV9oaWdoIGJ1dCBhYm92ZQorICogQHBrdF9yYXRlX2xvdyAoYm90aCBtZWFzdXJlZCBpbiBwYWNrZXRzIHBlciBzZWNvbmQpIHRoZQorICogbm9ybWFsIHtyeCx0eH1fKiBjb2FsZXNjaW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQuCisgKi8KK3N0cnVjdCBldGh0b29sX2NvYWxlc2NlIHsKKwlfX3UzMgljbWQ7CisJX191MzIJcnhfY29hbGVzY2VfdXNlY3M7CisJX191MzIJcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXM7CisJX191MzIJcnhfY29hbGVzY2VfdXNlY3NfaXJxOworCV9fdTMyCXJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycTsKKwlfX3UzMgl0eF9jb2FsZXNjZV91c2VjczsKKwlfX3UzMgl0eF9tYXhfY29hbGVzY2VkX2ZyYW1lczsKKwlfX3UzMgl0eF9jb2FsZXNjZV91c2Vjc19pcnE7CisJX191MzIJdHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxOworCV9fdTMyCXN0YXRzX2Jsb2NrX2NvYWxlc2NlX3VzZWNzOworCV9fdTMyCXVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZTsKKwlfX3UzMgl1c2VfYWRhcHRpdmVfdHhfY29hbGVzY2U7CisJX191MzIJcGt0X3JhdGVfbG93OworCV9fdTMyCXJ4X2NvYWxlc2NlX3VzZWNzX2xvdzsKKwlfX3UzMglyeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19sb3c7CisJX191MzIJdHhfY29hbGVzY2VfdXNlY3NfbG93OworCV9fdTMyCXR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2xvdzsKKwlfX3UzMglwa3RfcmF0ZV9oaWdoOworCV9fdTMyCXJ4X2NvYWxlc2NlX3VzZWNzX2hpZ2g7CisJX191MzIJcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaGlnaDsKKwlfX3UzMgl0eF9jb2FsZXNjZV91c2Vjc19oaWdoOworCV9fdTMyCXR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2hpZ2g7CisJX191MzIJcmF0ZV9zYW1wbGVfaW50ZXJ2YWw7Cit9OworCisvKiBmb3IgY29uZmlndXJpbmcgUlgvVFggcmluZyBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0geworCV9fdTMyCWNtZDsJLyogRVRIVE9PTF97RyxTfVJJTkdQQVJBTSAqLworCisJLyogUmVhZCBvbmx5IGF0dHJpYnV0ZXMuICBUaGVzZSBpbmRpY2F0ZSB0aGUgbWF4aW11bSBudW1iZXIKKwkgKiBvZiBwZW5kaW5nIFJYL1RYIHJpbmcgZW50cmllcyB0aGUgZHJpdmVyIHdpbGwgYWxsb3cgdGhlCisJICogdXNlciB0byBzZXQuCisJICovCisJX191MzIJcnhfbWF4X3BlbmRpbmc7CisJX191MzIJcnhfbWluaV9tYXhfcGVuZGluZzsKKwlfX3UzMglyeF9qdW1ib19tYXhfcGVuZGluZzsKKwlfX3UzMgl0eF9tYXhfcGVuZGluZzsKKworCS8qIFZhbHVlcyBjaGFuZ2VhYmxlIGJ5IHRoZSB1c2VyLiAgVGhlIHZhbGlkIHZhbHVlcyBhcmUKKwkgKiBpbiB0aGUgcmFuZ2UgMSB0byB0aGUgIipfbWF4X3BlbmRpbmciIGNvdW50ZXJwYXJ0IGFib3ZlLgorCSAqLworCV9fdTMyCXJ4X3BlbmRpbmc7CisJX191MzIJcnhfbWluaV9wZW5kaW5nOworCV9fdTMyCXJ4X2p1bWJvX3BlbmRpbmc7CisJX191MzIJdHhfcGVuZGluZzsKK307CisKKy8qKgorICogc3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgLSBjb25maWd1cmluZyBudW1iZXIgb2YgbmV0d29yayBjaGFubmVsCisgKiBAY21kOiBFVEhUT09MX3tHLFN9Q0hBTk5FTFMKKyAqIEBtYXhfcng6IFJlYWQgb25seS4gTWF4aW11bSBudW1iZXIgb2YgcmVjZWl2ZSBjaGFubmVsIHRoZSBkcml2ZXIgc3VwcG9ydC4KKyAqIEBtYXhfdHg6IFJlYWQgb25seS4gTWF4aW11bSBudW1iZXIgb2YgdHJhbnNtaXQgY2hhbm5lbCB0aGUgZHJpdmVyIHN1cHBvcnQuCisgKiBAbWF4X290aGVyOiBSZWFkIG9ubHkuIE1heGltdW0gbnVtYmVyIG9mIG90aGVyIGNoYW5uZWwgdGhlIGRyaXZlciBzdXBwb3J0LgorICogQG1heF9jb21iaW5lZDogUmVhZCBvbmx5LiBNYXhpbXVtIG51bWJlciBvZiBjb21iaW5lZCBjaGFubmVsIHRoZSBkcml2ZXIKKyAqCXN1cHBvcnQuIFNldCBvZiBxdWV1ZXMgUlgsIFRYIG9yIG90aGVyLgorICogQHJ4X2NvdW50OiBWYWxpZCB2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSAxIHRvIHRoZSBtYXhfcnguCisgKiBAdHhfY291bnQ6IFZhbGlkIHZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlIDEgdG8gdGhlIG1heF90eC4KKyAqIEBvdGhlcl9jb3VudDogVmFsaWQgdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2UgMSB0byB0aGUgbWF4X290aGVyLgorICogQGNvbWJpbmVkX2NvdW50OiBWYWxpZCB2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSAxIHRvIHRoZSBtYXhfY29tYmluZWQuCisgKgorICogVGhpcyBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgUlgsIFRYIGFuZCBvdGhlciBjaGFubmVscy4KKyAqLworCitzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyB7CisJX191MzIJY21kOworCV9fdTMyCW1heF9yeDsKKwlfX3UzMgltYXhfdHg7CisJX191MzIJbWF4X290aGVyOworCV9fdTMyCW1heF9jb21iaW5lZDsKKwlfX3UzMglyeF9jb3VudDsKKwlfX3UzMgl0eF9jb3VudDsKKwlfX3UzMglvdGhlcl9jb3VudDsKKwlfX3UzMgljb21iaW5lZF9jb3VudDsKK307CisKKy8qIGZvciBjb25maWd1cmluZyBsaW5rIGZsb3cgY29udHJvbCBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtIHsKKwlfX3UzMgljbWQ7CS8qIEVUSFRPT0xfe0csU31QQVVTRVBBUkFNICovCisKKwkvKiBJZiB0aGUgbGluayBpcyBiZWluZyBhdXRvLW5lZ290aWF0ZWQgKHZpYSBldGh0b29sX2NtZC5hdXRvbmVnCisJICogYmVpbmcgdHJ1ZSkgdGhlIHVzZXIgbWF5IHNldCAnYXV0b25lZycgaGVyZSBub24temVybyB0byBoYXZlIHRoZQorCSAqIHBhdXNlIHBhcmFtZXRlcnMgYmUgYXV0by1uZWdvdGlhdGVkIHRvby4gIEluIHN1Y2ggYSBjYXNlLCB0aGUKKwkgKiB7cngsdHh9X3BhdXNlIHZhbHVlcyBiZWxvdyBkZXRlcm1pbmUgd2hhdCBjYXBhYmlsaXRpZXMgYXJlCisJICogYWR2ZXJ0aXNlZC4KKwkgKgorCSAqIElmICdhdXRvbmVnJyBpcyB6ZXJvIG9yIHRoZSBsaW5rIGlzIG5vdCBiZWluZyBhdXRvLW5lZ290aWF0ZWQsCisJICogdGhlbiB7cngsdHh9X3BhdXNlIGZvcmNlIHRoZSBkcml2ZXIgdG8gdXNlL25vdC11c2UgcGF1c2UKKwkgKiBmbG93IGNvbnRyb2wuCisJICovCisJX191MzIJYXV0b25lZzsKKwlfX3UzMglyeF9wYXVzZTsKKwlfX3UzMgl0eF9wYXVzZTsKK307CisKKyNkZWZpbmUgRVRIX0dTVFJJTkdfTEVOCQkzMgorZW51bSBldGh0b29sX3N0cmluZ3NldCB7CisJRVRIX1NTX1RFU1QJCT0gMCwKKwlFVEhfU1NfU1RBVFMsCisJRVRIX1NTX1BSSVZfRkxBR1MsCisJRVRIX1NTX05UVVBMRV9GSUxURVJTLAkvKiBEbyBub3QgdXNlLCBHUlhOVFVQTEUgaXMgbm93IGRlcHJlY2F0ZWQgKi8KKwlFVEhfU1NfRkVBVFVSRVMsCit9OworCisvKiBmb3IgcGFzc2luZyBzdHJpbmcgc2V0cyBmb3IgZGF0YSB0YWdnaW5nICovCitzdHJ1Y3QgZXRodG9vbF9nc3RyaW5ncyB7CisJX191MzIJY21kOwkJLyogRVRIVE9PTF9HU1RSSU5HUyAqLworCV9fdTMyCXN0cmluZ19zZXQ7CS8qIHN0cmluZyBzZXQgaWQgZS5jLiBFVEhfU1NfVEVTVCwgZXRjKi8KKwlfX3UzMglsZW47CQkvKiBudW1iZXIgb2Ygc3RyaW5ncyBpbiB0aGUgc3RyaW5nIHNldCAqLworCV9fdTgJZGF0YVswXTsKK307CisKK3N0cnVjdCBldGh0b29sX3NzZXRfaW5mbyB7CisJX191MzIJY21kOwkJLyogRVRIVE9PTF9HU1NFVF9JTkZPICovCisJX191MzIJcmVzZXJ2ZWQ7CisJX191NjQJc3NldF9tYXNrOwkvKiBpbnB1dDogZWFjaCBiaXQgc2VsZWN0cyBhbiBzc2V0IHRvIHF1ZXJ5ICovCisJCQkJLyogb3V0cHV0OiBlYWNoIGJpdCBhIHJldHVybmVkIHNzZXQgKi8KKwlfX3UzMglkYXRhWzBdOwkvKiBFVEhfU1NfeHh4IGNvdW50LCBpbiBvcmRlciwgYmFzZWQgb24gYml0cworCQkJCSAgIGluIHNzZXRfbWFzay4gIE9uZSBiaXQgaW1wbGllcyBvbmUKKwkJCQkgICBfX3UzMiwgdHdvIGJpdHMgaW1wbGllcyB0d28KKwkJCQkgICBfX3UzMidzLCBldGMuICovCit9OworCisvKioKKyAqIGVudW0gZXRodG9vbF90ZXN0X2ZsYWdzIC0gZmxhZ3MgZGVmaW5pdGlvbiBvZiBldGh0b29sX3Rlc3QKKyAqIEBFVEhfVEVTVF9GTF9PRkZMSU5FOiBpZiBzZXQgcGVyZm9ybSBvbmxpbmUgYW5kIG9mZmxpbmUgdGVzdHMsIG90aGVyd2lzZQorICoJb25seSBvbmxpbmUgdGVzdHMuCisgKiBARVRIX1RFU1RfRkxfRkFJTEVEOiBEcml2ZXIgc2V0IHRoaXMgZmxhZyBpZiB0ZXN0IGZhaWxzLgorICogQEVUSF9URVNUX0ZMX0VYVEVSTkFMX0xCOiBBcHBsaWNhdGlvbiByZXF1ZXN0IHRvIHBlcmZvcm0gZXh0ZXJuYWwgbG9vcGJhY2sKKyAqCXRlc3QuCisgKiBARVRIX1RFU1RfRkxfRVhURVJOQUxfTEJfRE9ORTogRHJpdmVyIHBlcmZvcm1lZCB0aGUgZXh0ZXJuYWwgbG9vcGJhY2sgdGVzdAorICovCisKK2VudW0gZXRodG9vbF90ZXN0X2ZsYWdzIHsKKwlFVEhfVEVTVF9GTF9PRkZMSU5FCT0gKDEgPDwgMCksCisJRVRIX1RFU1RfRkxfRkFJTEVECT0gKDEgPDwgMSksCisJRVRIX1RFU1RfRkxfRVhURVJOQUxfTEIJPSAoMSA8PCAyKSwKKwlFVEhfVEVTVF9GTF9FWFRFUk5BTF9MQl9ET05FCT0gKDEgPDwgMyksCit9OworCisvKiBmb3IgcmVxdWVzdGluZyBOSUMgdGVzdCBhbmQgZ2V0dGluZyByZXN1bHRzKi8KK3N0cnVjdCBldGh0b29sX3Rlc3QgeworCV9fdTMyCWNtZDsJCS8qIEVUSFRPT0xfVEVTVCAqLworCV9fdTMyCWZsYWdzOwkJLyogRVRIX1RFU1RfRkxfeHh4ICovCisJX191MzIJcmVzZXJ2ZWQ7CisJX191MzIJbGVuOwkJLyogcmVzdWx0IGxlbmd0aCwgaW4gbnVtYmVyIG9mIHU2NCBlbGVtZW50cyAqLworCV9fdTY0CWRhdGFbMF07Cit9OworCisvKiBmb3IgZHVtcGluZyBOSUMtc3BlY2lmaWMgc3RhdGlzdGljcyAqLworc3RydWN0IGV0aHRvb2xfc3RhdHMgeworCV9fdTMyCWNtZDsJCS8qIEVUSFRPT0xfR1NUQVRTICovCisJX191MzIJbl9zdGF0czsJLyogbnVtYmVyIG9mIHU2NCdzIGJlaW5nIHJldHVybmVkICovCisJX191NjQJZGF0YVswXTsKK307CisKK3N0cnVjdCBldGh0b29sX3Blcm1fYWRkciB7CisJX191MzIJY21kOwkJLyogRVRIVE9PTF9HUEVSTUFERFIgKi8KKwlfX3UzMglzaXplOworCV9fdTgJZGF0YVswXTsKK307CisKKy8qIGJvb2xlYW4gZmxhZ3MgY29udHJvbGxpbmcgcGVyLWludGVyZmFjZSBiZWhhdmlvciBjaGFyYWN0ZXJpc3RpY3MuCisgKiBXaGVuIHJlYWRpbmcsIHRoZSBmbGFnIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhIGNlcnRhaW4gYmVoYXZpb3IKKyAqIGlzIGVuYWJsZWQvcHJlc2VudC4gIFdoZW4gd3JpdGluZywgdGhlIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIKKyAqIG9yIG5vdCB0aGUgZHJpdmVyIHNob3VsZCB0dXJuIG9uIChzZXQpIG9yIG9mZiAoY2xlYXIpIGEgYmVoYXZpb3IuCisgKgorICogU29tZSBiZWhhdmlvcnMgbWF5IHJlYWQtb25seSAodW5jb25kaXRpb25hbGx5IGFic2VudCBvciBwcmVzZW50KS4KKyAqIElmIHN1Y2ggaXMgdGhlIGNhc2UsIHJldHVybiBFSU5WQUwgaW4gdGhlIHNldC1mbGFncyBvcGVyYXRpb24gaWYgdGhlCisgKiBmbGFnIGRpZmZlcnMgZnJvbSB0aGUgcmVhZC1vbmx5IHZhbHVlLgorICovCitlbnVtIGV0aHRvb2xfZmxhZ3MgeworCUVUSF9GTEFHX1RYVkxBTgkJPSAoMSA8PCA3KSwJLyogVFggVkxBTiBvZmZsb2FkIGVuYWJsZWQgKi8KKwlFVEhfRkxBR19SWFZMQU4JCT0gKDEgPDwgOCksCS8qIFJYIFZMQU4gb2ZmbG9hZCBlbmFibGVkICovCisJRVRIX0ZMQUdfTFJPCQk9ICgxIDw8IDE1KSwJLyogTFJPIGlzIGVuYWJsZWQgKi8KKwlFVEhfRkxBR19OVFVQTEUJCT0gKDEgPDwgMjcpLAkvKiBOLXR1cGxlIGZpbHRlcnMgZW5hYmxlZCAqLworCUVUSF9GTEFHX1JYSEFTSAkJPSAoMSA8PCAyOCksCit9OworCisvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZXMgYXJlIGZvciBzdXBwb3J0aW5nIFJYIG5ldHdvcmsgZmxvdworICogY2xhc3NpZmljYXRpb24gYW5kIFJYIG4tdHVwbGUgY29uZmlndXJhdGlvbi4gTm90ZSwgYWxsIG11bHRpYnl0ZQorICogZmllbGRzLCBlLmcuLCBpcDRzcmMsIGlwNGRzdCwgcHNyYywgcGRzdCwgc3BpLCBldGMuIGFyZSBleHBlY3RlZCB0bworICogYmUgaW4gbmV0d29yayBieXRlIG9yZGVyLgorICovCisKKy8qKgorICogc3RydWN0IGV0aHRvb2xfdGNwaXA0X3NwZWMgLSBmbG93IHNwZWNpZmljYXRpb24gZm9yIFRDUC9JUHY0IGV0Yy4KKyAqIEBpcDRzcmM6IFNvdXJjZSBob3N0CisgKiBAaXA0ZHN0OiBEZXN0aW5hdGlvbiBob3N0CisgKiBAcHNyYzogU291cmNlIHBvcnQKKyAqIEBwZHN0OiBEZXN0aW5hdGlvbiBwb3J0CisgKiBAdG9zOiBUeXBlLW9mLXNlcnZpY2UKKyAqCisgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBUQ1AvSVB2NCwgVURQL0lQdjQgb3IgU0NUUC9JUHY0IGZsb3cuCisgKi8KK3N0cnVjdCBldGh0b29sX3RjcGlwNF9zcGVjIHsKKwlfX2JlMzIJaXA0c3JjOworCV9fYmUzMglpcDRkc3Q7CisJX19iZTE2CXBzcmM7CisJX19iZTE2CXBkc3Q7CisJX191OCAgICB0b3M7Cit9OworCisvKioKKyAqIHN0cnVjdCBldGh0b29sX2FoX2VzcGlwNF9zcGVjIC0gZmxvdyBzcGVjaWZpY2F0aW9uIGZvciBJUHNlYy9JUHY0CisgKiBAaXA0c3JjOiBTb3VyY2UgaG9zdAorICogQGlwNGRzdDogRGVzdGluYXRpb24gaG9zdAorICogQHNwaTogU2VjdXJpdHkgcGFyYW1ldGVycyBpbmRleAorICogQHRvczogVHlwZS1vZi1zZXJ2aWNlCisgKgorICogVGhpcyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIElQc2VjIHRyYW5zcG9ydCBvciB0dW5uZWwgb3ZlciBJUHY0LgorICovCitzdHJ1Y3QgZXRodG9vbF9haF9lc3BpcDRfc3BlYyB7CisJX19iZTMyCWlwNHNyYzsKKwlfX2JlMzIJaXA0ZHN0OworCV9fYmUzMglzcGk7CisJX191OCAgICB0b3M7Cit9OworCisjZGVmaW5lCUVUSF9SWF9ORkNfSVA0CTEKKworLyoqCisgKiBzdHJ1Y3QgZXRodG9vbF91c3JpcDRfc3BlYyAtIGdlbmVyYWwgZmxvdyBzcGVjaWZpY2F0aW9uIGZvciBJUHY0CisgKiBAaXA0c3JjOiBTb3VyY2UgaG9zdAorICogQGlwNGRzdDogRGVzdGluYXRpb24gaG9zdAorICogQGw0XzRfYnl0ZXM6IEZpcnN0IDQgYnl0ZXMgb2YgdHJhbnNwb3J0IChsYXllciA0KSBoZWFkZXIKKyAqIEB0b3M6IFR5cGUtb2Ytc2VydmljZQorICogQGlwX3ZlcjogVmFsdWUgbXVzdCBiZSAlRVRIX1JYX05GQ19JUDQ7IG1hc2sgbXVzdCBiZSAwCisgKiBAcHJvdG86IFRyYW5zcG9ydCBwcm90b2NvbCBudW1iZXI7IG1hc2sgbXVzdCBiZSAwCisgKi8KK3N0cnVjdCBldGh0b29sX3VzcmlwNF9zcGVjIHsKKwlfX2JlMzIJaXA0c3JjOworCV9fYmUzMglpcDRkc3Q7CisJX19iZTMyCWw0XzRfYnl0ZXM7CisJX191OCAgICB0b3M7CisJX191OCAgICBpcF92ZXI7CisJX191OCAgICBwcm90bzsKK307CisKK3VuaW9uIGV0aHRvb2xfZmxvd191bmlvbiB7CisJc3RydWN0IGV0aHRvb2xfdGNwaXA0X3NwZWMJCXRjcF9pcDRfc3BlYzsKKwlzdHJ1Y3QgZXRodG9vbF90Y3BpcDRfc3BlYwkJdWRwX2lwNF9zcGVjOworCXN0cnVjdCBldGh0b29sX3RjcGlwNF9zcGVjCQlzY3RwX2lwNF9zcGVjOworCXN0cnVjdCBldGh0b29sX2FoX2VzcGlwNF9zcGVjCQlhaF9pcDRfc3BlYzsKKwlzdHJ1Y3QgZXRodG9vbF9haF9lc3BpcDRfc3BlYwkJZXNwX2lwNF9zcGVjOworCXN0cnVjdCBldGh0b29sX3VzcmlwNF9zcGVjCQl1c3JfaXA0X3NwZWM7CisJc3RydWN0IGV0aGhkcgkJCQlldGhlcl9zcGVjOworCV9fdTgJCQkJCWhkYXRhWzYwXTsKK307CisKK3N0cnVjdCBldGh0b29sX2Zsb3dfZXh0IHsKKwlfX2JlMTYJdmxhbl9ldHlwZTsKKwlfX2JlMTYJdmxhbl90Y2k7CisJX19iZTMyCWRhdGFbMl07Cit9OworCisvKioKKyAqIHN0cnVjdCBldGh0b29sX3J4X2Zsb3dfc3BlYyAtIGNsYXNzaWZpY2F0aW9uIHJ1bGUgZm9yIFJYIGZsb3dzCisgKiBAZmxvd190eXBlOiBUeXBlIG9mIG1hdGNoIHRvIHBlcmZvcm0sIGUuZy4gJVRDUF9WNF9GTE9XCisgKiBAaF91OiBGbG93IGZpZWxkcyB0byBtYXRjaCAoZGVwZW5kZW50IG9uIEBmbG93X3R5cGUpCisgKiBAaF9leHQ6IEFkZGl0aW9uYWwgZmllbGRzIHRvIG1hdGNoCisgKiBAbV91OiBNYXNrcyBmb3IgZmxvdyBmaWVsZCBiaXRzIHRvIGJlIG1hdGNoZWQKKyAqIEBtX2V4dDogTWFza3MgZm9yIGFkZGl0aW9uYWwgZmllbGQgYml0cyB0byBiZSBtYXRjaGVkCisgKglOb3RlLCBhbGwgYWRkaXRpb25hbCBmaWVsZHMgbXVzdCBiZSBpZ25vcmVkIHVubGVzcyBAZmxvd190eXBlCisgKglpbmNsdWRlcyB0aGUgJUZMT1dfRVhUIGZsYWcuCisgKiBAcmluZ19jb29raWU6IFJYIHJpbmcvcXVldWUgaW5kZXggdG8gZGVsaXZlciB0bywgb3IgJVJYX0NMU19GTE9XX0RJU0MKKyAqCWlmIHBhY2tldHMgc2hvdWxkIGJlIGRpc2NhcmRlZAorICogQGxvY2F0aW9uOiBMb2NhdGlvbiBvZiBydWxlIGluIHRoZSB0YWJsZS4gIExvY2F0aW9ucyBtdXN0IGJlCisgKgludW1iZXJlZCBzdWNoIHRoYXQgYSBmbG93IG1hdGNoaW5nIG11bHRpcGxlIHJ1bGVzIHdpbGwgYmUKKyAqCWNsYXNzaWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBmaXJzdCAobG93ZXN0IG51bWJlcmVkKSBydWxlLgorICovCitzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgeworCV9fdTMyCQlmbG93X3R5cGU7CisJdW5pb24gZXRodG9vbF9mbG93X3VuaW9uIGhfdTsKKwlzdHJ1Y3QgZXRodG9vbF9mbG93X2V4dCBoX2V4dDsKKwl1bmlvbiBldGh0b29sX2Zsb3dfdW5pb24gbV91OworCXN0cnVjdCBldGh0b29sX2Zsb3dfZXh0IG1fZXh0OworCV9fdTY0CQlyaW5nX2Nvb2tpZTsKKwlfX3UzMgkJbG9jYXRpb247Cit9OworCisvKioKKyAqIHN0cnVjdCBldGh0b29sX3J4bmZjIC0gY29tbWFuZCB0byBnZXQgb3Igc2V0IFJYIGZsb3cgY2xhc3NpZmljYXRpb24gcnVsZXMKKyAqIEBjbWQ6IFNwZWNpZmljIGNvbW1hbmQgbnVtYmVyIC0gJUVUSFRPT0xfR1JYRkgsICVFVEhUT09MX1NSWEZILAorICoJJUVUSFRPT0xfR1JYUklOR1MsICVFVEhUT09MX0dSWENMU1JMQ05ULCAlRVRIVE9PTF9HUlhDTFNSVUxFLAorICoJJUVUSFRPT0xfR1JYQ0xTUkxBTEwsICVFVEhUT09MX1NSWENMU1JMREVMIG9yICVFVEhUT09MX1NSWENMU1JMSU5TCisgKiBAZmxvd190eXBlOiBUeXBlIG9mIGZsb3cgdG8gYmUgYWZmZWN0ZWQsIGUuZy4gJVRDUF9WNF9GTE9XCisgKiBAZGF0YTogQ29tbWFuZC1kZXBlbmRlbnQgdmFsdWUKKyAqIEBmczogRmxvdyBjbGFzc2lmaWNhdGlvbiBydWxlCisgKiBAcnVsZV9jbnQ6IE51bWJlciBvZiBydWxlcyB0byBiZSBhZmZlY3RlZAorICogQHJ1bGVfbG9jczogQXJyYXkgb2YgdXNlZCBydWxlIGxvY2F0aW9ucworICoKKyAqIEZvciAlRVRIVE9PTF9HUlhGSCBhbmQgJUVUSFRPT0xfU1JYRkgsIEBkYXRhIGlzIGEgYml0bWFzayBpbmRpY2F0aW5nCisgKiB0aGUgZmllbGRzIGluY2x1ZGVkIGluIHRoZSBmbG93IGhhc2gsIGUuZy4gJVJYSF9JUF9TUkMuICBUaGUgZm9sbG93aW5nCisgKiBzdHJ1Y3R1cmUgZmllbGRzIG11c3Qgbm90IGJlIHVzZWQuCisgKgorICogRm9yICVFVEhUT09MX0dSWFJJTkdTLCBAZGF0YSBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiBSWCByaW5ncy9xdWV1ZXMKKyAqIG9uIHJldHVybi4KKyAqCisgKiBGb3IgJUVUSFRPT0xfR1JYQ0xTUkxDTlQsIEBydWxlX2NudCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiBkZWZpbmVkCisgKiBydWxlcyBvbiByZXR1cm4uCisgKgorICogRm9yICVFVEhUT09MX0dSWENMU1JVTEUsIEBmcy5AbG9jYXRpb24gc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBhbgorICogZXhpc3RpbmcgcnVsZSBvbiBlbnRyeSBhbmQgQGZzIGNvbnRhaW5zIHRoZSBydWxlIG9uIHJldHVybi4KKyAqCisgKiBGb3IgJUVUSFRPT0xfR1JYQ0xTUkxBTEwsIEBydWxlX2NudCBzcGVjaWZpZXMgdGhlIGFycmF5IHNpemUgb2YgdGhlCisgKiB1c2VyIGJ1ZmZlciBmb3IgQHJ1bGVfbG9jcyBvbiBlbnRyeS4gIE9uIHJldHVybiwgQGRhdGEgaXMgdGhlIHNpemUKKyAqIG9mIHRoZSBydWxlIHRhYmxlLCBAcnVsZV9jbnQgaXMgdGhlIG51bWJlciBvZiBkZWZpbmVkIHJ1bGVzLCBhbmQKKyAqIEBydWxlX2xvY3MgY29udGFpbnMgdGhlIGxvY2F0aW9ucyBvZiB0aGUgZGVmaW5lZCBydWxlcy4gIERyaXZlcnMKKyAqIG11c3QgdXNlIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGdldF9yeG5mYygpIGluc3RlYWQgb2YgQHJ1bGVfbG9jcy4KKyAqCisgKiBGb3IgJUVUSFRPT0xfU1JYQ0xTUkxJTlMsIEBmcyBzcGVjaWZpZXMgdGhlIHJ1bGUgdG8gYWRkIG9yIHVwZGF0ZS4KKyAqIEBmcy5AbG9jYXRpb24gc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiB0byB1c2UgYW5kIG11c3Qgbm90IGJlIGlnbm9yZWQuCisgKgorICogRm9yICVFVEhUT09MX1NSWENMU1JMREVMLCBAZnMuQGxvY2F0aW9uIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgYW4KKyAqIGV4aXN0aW5nIHJ1bGUgb24gZW50cnkuCisgKi8KK3N0cnVjdCBldGh0b29sX3J4bmZjIHsKKwlfX3UzMgkJCQljbWQ7CisJX191MzIJCQkJZmxvd190eXBlOworCV9fdTY0CQkJCWRhdGE7CisJc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjCWZzOworCV9fdTMyCQkJCXJ1bGVfY250OworCV9fdTMyCQkJCXJ1bGVfbG9jc1swXTsKK307CisKKworLyoqCisgKiBzdHJ1Y3QgZXRodG9vbF9yeGZoX2luZGlyIC0gY29tbWFuZCB0byBnZXQgb3Igc2V0IFJYIGZsb3cgaGFzaCBpbmRpcmVjdGlvbgorICogQGNtZDogU3BlY2lmaWMgY29tbWFuZCBudW1iZXIgLSAlRVRIVE9PTF9HUlhGSElORElSIG9yICVFVEhUT09MX1NSWEZISU5ESVIKKyAqIEBzaXplOiBPbiBlbnRyeSwgdGhlIGFycmF5IHNpemUgb2YgdGhlIHVzZXIgYnVmZmVyLiAgT24gcmV0dXJuIGZyb20KKyAqCSVFVEhUT09MX0dSWEZISU5ESVIsIHRoZSBhcnJheSBzaXplIG9mIHRoZSBoYXJkd2FyZSBpbmRpcmVjdGlvbiB0YWJsZS4KKyAqIEByaW5nX2luZGV4OiBSWCByaW5nL3F1ZXVlIGluZGV4IGZvciBlYWNoIGhhc2ggdmFsdWUKKyAqLworc3RydWN0IGV0aHRvb2xfcnhmaF9pbmRpciB7CisJX191MzIJY21kOworCV9fdTMyCXNpemU7CisJX191MzIJcmluZ19pbmRleFswXTsKK307CisKKy8qKgorICogc3RydWN0IGV0aHRvb2xfcnhfbnR1cGxlX2Zsb3dfc3BlYyAtIHNwZWNpZmljYXRpb24gZm9yIFJYIGZsb3cgZmlsdGVyCisgKiBAZmxvd190eXBlOiBUeXBlIG9mIG1hdGNoIHRvIHBlcmZvcm0sIGUuZy4gJVRDUF9WNF9GTE9XCisgKiBAaF91OiBGbG93IGZpZWxkIHZhbHVlcyB0byBtYXRjaCAoZGVwZW5kZW50IG9uIEBmbG93X3R5cGUpCisgKiBAbV91OiBNYXNrcyBmb3IgZmxvdyBmaWVsZCB2YWx1ZSBiaXRzIHRvIGJlIGlnbm9yZWQKKyAqIEB2bGFuX3RhZzogVkxBTiB0YWcgdG8gbWF0Y2gKKyAqIEB2bGFuX3RhZ19tYXNrOiBNYXNrIGZvciBWTEFOIHRhZyBiaXRzIHRvIGJlIGlnbm9yZWQKKyAqIEBkYXRhOiBEcml2ZXItZGVwZW5kZW50IGRhdGEgdG8gbWF0Y2gKKyAqIEBkYXRhX21hc2s6IE1hc2sgZm9yIGRyaXZlci1kZXBlbmRlbnQgZGF0YSBiaXRzIHRvIGJlIGlnbm9yZWQKKyAqIEBhY3Rpb246IFJYIHJpbmcvcXVldWUgaW5kZXggdG8gZGVsaXZlciB0byAobm9uLW5lZ2F0aXZlKSBvciBvdGhlciBhY3Rpb24KKyAqCShuZWdhdGl2ZSwgZS5nLiAlRVRIVE9PTF9SWE5UVVBMRV9BQ1RJT05fRFJPUCkKKyAqCisgKiBGb3IgZmxvdyB0eXBlcyAlVENQX1Y0X0ZMT1csICVVRFBfVjRfRkxPVyBhbmQgJVNDVFBfVjRfRkxPVywgd2hlcmUKKyAqIGEgZmllbGQgdmFsdWUgYW5kIG1hc2sgYXJlIGJvdGggemVybyB0aGlzIGlzIHRyZWF0ZWQgYXMgaWYgYWxsIG1hc2sKKyAqIGJpdHMgYXJlIHNldCBpLmUuIHRoZSBmaWVsZCBpcyBpZ25vcmVkLgorICovCitzdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGVfZmxvd19zcGVjIHsKKwlfX3UzMgkJIGZsb3dfdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCBldGh0b29sX3RjcGlwNF9zcGVjCQl0Y3BfaXA0X3NwZWM7CisJCXN0cnVjdCBldGh0b29sX3RjcGlwNF9zcGVjCQl1ZHBfaXA0X3NwZWM7CisJCXN0cnVjdCBldGh0b29sX3RjcGlwNF9zcGVjCQlzY3RwX2lwNF9zcGVjOworCQlzdHJ1Y3QgZXRodG9vbF9haF9lc3BpcDRfc3BlYwkJYWhfaXA0X3NwZWM7CisJCXN0cnVjdCBldGh0b29sX2FoX2VzcGlwNF9zcGVjCQllc3BfaXA0X3NwZWM7CisJCXN0cnVjdCBldGh0b29sX3VzcmlwNF9zcGVjCQl1c3JfaXA0X3NwZWM7CisJCXN0cnVjdCBldGhoZHIJCQkJZXRoZXJfc3BlYzsKKwkJX191OAkJCQkJaGRhdGFbNzJdOworCX0gaF91LCBtX3U7CisKKwlfX3UxNgkgICAgICAgIHZsYW5fdGFnOworCV9fdTE2CSAgICAgICAgdmxhbl90YWdfbWFzazsKKwlfX3U2NAkJZGF0YTsKKwlfX3U2NAkJZGF0YV9tYXNrOworCisJX19zMzIJCWFjdGlvbjsKKyNkZWZpbmUgRVRIVE9PTF9SWE5UVVBMRV9BQ1RJT05fRFJPUAkoLTEpCS8qIGRyb3AgcGFja2V0ICovCisjZGVmaW5lIEVUSFRPT0xfUlhOVFVQTEVfQUNUSU9OX0NMRUFSCSgtMikJLyogY2xlYXIgZmlsdGVyICovCit9OworCisvKioKKyAqIHN0cnVjdCBldGh0b29sX3J4X250dXBsZSAtIGNvbW1hbmQgdG8gc2V0IG9yIGNsZWFyIFJYIGZsb3cgZmlsdGVyCisgKiBAY21kOiBDb21tYW5kIG51bWJlciAtICVFVEhUT09MX1NSWE5UVVBMRQorICogQGZzOiBGbG93IGZpbHRlciBzcGVjaWZpY2F0aW9uCisgKi8KK3N0cnVjdCBldGh0b29sX3J4X250dXBsZSB7CisJX191MzIJCQkJCWNtZDsKKwlzdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGVfZmxvd19zcGVjCWZzOworfTsKKworI2RlZmluZSBFVEhUT09MX0ZMQVNIX01BWF9GSUxFTkFNRQkxMjgKK2VudW0gZXRodG9vbF9mbGFzaF9vcF90eXBlIHsKKwlFVEhUT09MX0ZMQVNIX0FMTF9SRUdJT05TCT0gMCwKK307CisKKy8qIGZvciBwYXNzaW5nIGZpcm13YXJlIGZsYXNoaW5nIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworc3RydWN0IGV0aHRvb2xfZmxhc2ggeworCV9fdTMyCWNtZDsKKwlfX3UzMglyZWdpb247CisJY2hhcglkYXRhW0VUSFRPT0xfRkxBU0hfTUFYX0ZJTEVOQU1FXTsKK307CisKKy8qKgorICogc3RydWN0IGV0aHRvb2xfZHVtcCAtIHVzZWQgZm9yIHJldHJpZXZpbmcsIHNldHRpbmcgZGV2aWNlIGR1bXAKKyAqIEBjbWQ6IENvbW1hbmQgbnVtYmVyIC0gJUVUSFRPT0xfR0VUX0RVTVBfRkxBRywgJUVUSFRPT0xfR0VUX0RVTVBfREFUQSwgb3IKKyAqIAklRVRIVE9PTF9TRVRfRFVNUAorICogQHZlcnNpb246IEZXIHZlcnNpb24gb2YgdGhlIGR1bXAsIGZpbGxlZCBpbiBieSBkcml2ZXIKKyAqIEBmbGFnOiBkcml2ZXIgZGVwZW5kZW50IGZsYWcgZm9yIGR1bXAgc2V0dGluZywgZmlsbGVkIGluIGJ5IGRyaXZlciBkdXJpbmcKKyAqIAkgIGdldCBhbmQgZmlsbGVkIGluIGJ5IGV0aHRvb2wgZm9yIHNldCBvcGVyYXRpb24KKyAqIEBsZW46IGxlbmd0aCBvZiBkdW1wIGRhdGEsIHVzZWQgYXMgdGhlIGxlbmd0aCBvZiB0aGUgdXNlciBidWZmZXIgb24gZW50cnkgdG8KKyAqIAkgJUVUSFRPT0xfR0VUX0RVTVBfREFUQSBhbmQgdGhpcyBpcyByZXR1cm5lZCBhcyBkdW1wIGxlbmd0aCBieSBkcml2ZXIKKyAqIAkgZm9yICVFVEhUT09MX0dFVF9EVU1QX0ZMQUcgY29tbWFuZAorICogQGRhdGE6IGRhdGEgY29sbGVjdGVkIGZvciBnZXQgZHVtcCBkYXRhIG9wZXJhdGlvbgorICovCitzdHJ1Y3QgZXRodG9vbF9kdW1wIHsKKwlfX3UzMgljbWQ7CisJX191MzIJdmVyc2lvbjsKKwlfX3UzMglmbGFnOworCV9fdTMyCWxlbjsKKwlfX3U4CWRhdGFbMF07Cit9OworCisvKiBmb3IgcmV0dXJuaW5nIGFuZCBjaGFuZ2luZyBmZWF0dXJlIHNldHMgKi8KKworLyoqCisgKiBzdHJ1Y3QgZXRodG9vbF9nZXRfZmVhdHVyZXNfYmxvY2sgLSBibG9jayB3aXRoIHN0YXRlIG9mIDMyIGZlYXR1cmVzCisgKiBAYXZhaWxhYmxlOiBtYXNrIG9mIGNoYW5nZWFibGUgZmVhdHVyZXMKKyAqIEByZXF1ZXN0ZWQ6IG1hc2sgb2YgZmVhdHVyZXMgcmVxdWVzdGVkIHRvIGJlIGVuYWJsZWQgaWYgcG9zc2libGUKKyAqIEBhY3RpdmU6IG1hc2sgb2YgY3VycmVudGx5IGVuYWJsZWQgZmVhdHVyZXMKKyAqIEBuZXZlcl9jaGFuZ2VkOiBtYXNrIG9mIGZlYXR1cmVzIG5vdCBjaGFuZ2VhYmxlIGZvciBhbnkgZGV2aWNlCisgKi8KK3N0cnVjdCBldGh0b29sX2dldF9mZWF0dXJlc19ibG9jayB7CisJX191MzIJYXZhaWxhYmxlOworCV9fdTMyCXJlcXVlc3RlZDsKKwlfX3UzMglhY3RpdmU7CisJX191MzIJbmV2ZXJfY2hhbmdlZDsKK307CisKKy8qKgorICogc3RydWN0IGV0aHRvb2xfZ2ZlYXR1cmVzIC0gY29tbWFuZCB0byBnZXQgc3RhdGUgb2YgZGV2aWNlJ3MgZmVhdHVyZXMKKyAqIEBjbWQ6IGNvbW1hbmQgbnVtYmVyID0gJUVUSFRPT0xfR0ZFQVRVUkVTCisgKiBAc2l6ZTogaW46IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZmVhdHVyZXNbXSBhcnJheTsKKyAqICAgICAgIG91dDogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGZlYXR1cmVzW10gbmVlZGVkIHRvIGhvbGQgYWxsIGZlYXR1cmVzCisgKiBAZmVhdHVyZXM6IHN0YXRlIG9mIGZlYXR1cmVzCisgKi8KK3N0cnVjdCBldGh0b29sX2dmZWF0dXJlcyB7CisJX191MzIJY21kOworCV9fdTMyCXNpemU7CisJc3RydWN0IGV0aHRvb2xfZ2V0X2ZlYXR1cmVzX2Jsb2NrIGZlYXR1cmVzWzBdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZXRodG9vbF9zZXRfZmVhdHVyZXNfYmxvY2sgLSBibG9jayB3aXRoIHJlcXVlc3QgZm9yIDMyIGZlYXR1cmVzCisgKiBAdmFsaWQ6IG1hc2sgb2YgZmVhdHVyZXMgdG8gYmUgY2hhbmdlZAorICogQHJlcXVlc3RlZDogdmFsdWVzIG9mIGZlYXR1cmVzIHRvIGJlIGNoYW5nZWQKKyAqLworc3RydWN0IGV0aHRvb2xfc2V0X2ZlYXR1cmVzX2Jsb2NrIHsKKwlfX3UzMgl2YWxpZDsKKwlfX3UzMglyZXF1ZXN0ZWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBldGh0b29sX3NmZWF0dXJlcyAtIGNvbW1hbmQgdG8gcmVxdWVzdCBjaGFuZ2UgaW4gZGV2aWNlJ3MgZmVhdHVyZXMKKyAqIEBjbWQ6IGNvbW1hbmQgbnVtYmVyID0gJUVUSFRPT0xfU0ZFQVRVUkVTCisgKiBAc2l6ZTogYXJyYXkgc2l6ZSBvZiB0aGUgZmVhdHVyZXNbXSBhcnJheQorICogQGZlYXR1cmVzOiBmZWF0dXJlIGNoYW5nZSBtYXNrcworICovCitzdHJ1Y3QgZXRodG9vbF9zZmVhdHVyZXMgeworCV9fdTMyCWNtZDsKKwlfX3UzMglzaXplOworCXN0cnVjdCBldGh0b29sX3NldF9mZWF0dXJlc19ibG9jayBmZWF0dXJlc1swXTsKK307CisKKy8qCisgKiAlRVRIVE9PTF9TRkVBVFVSRVMgY2hhbmdlcyBmZWF0dXJlcyBwcmVzZW50IGluIGZlYXR1cmVzW10udmFsaWQgdG8gdGhlCisgKiB2YWx1ZXMgb2YgY29ycmVzcG9uZGluZyBiaXRzIGluIGZlYXR1cmVzW10ucmVxdWVzdGVkLiBCaXRzIGluIC5yZXF1ZXN0ZWQKKyAqIG5vdCBzZXQgaW4gLnZhbGlkIG9yIG5vdCBjaGFuZ2VhYmxlIGFyZSBpZ25vcmVkLgorICoKKyAqIFJldHVybnMgJUVJTlZBTCB3aGVuIC52YWxpZCBjb250YWlucyB1bmRlZmluZWQgb3IgbmV2ZXItY2hhbmdlYWJsZSBiaXRzCisgKiBvciBzaXplIGlzIG5vdCBlcXVhbCB0byByZXF1aXJlZCBudW1iZXIgb2YgZmVhdHVyZXMgd29yZHMgKDMyLWJpdCBibG9ja3MpLgorICogUmV0dXJucyA+PSAwIGlmIHJlcXVlc3Qgd2FzIGNvbXBsZXRlZDsgYml0cyBzZXQgaW4gdGhlIHZhbHVlIG1lYW46CisgKiAgICVFVEhUT09MX0ZfVU5TVVBQT1JURUQgLSB0aGVyZSB3ZXJlIGJpdHMgc2V0IGluIC52YWxpZCB0aGF0IGFyZSBub3QKKyAqCWNoYW5nZWFibGUgKG5vdCBwcmVzZW50IGluICVFVEhUT09MX0dGRUFUVVJFUycgZmVhdHVyZXNbXS5hdmFpbGFibGUpCisgKgl0aG9zZSBiaXRzIHdlcmUgaWdub3JlZC4KKyAqICAgJUVUSFRPT0xfRl9XSVNIIC0gc29tZSBvciBhbGwgY2hhbmdlcyByZXF1ZXN0ZWQgd2VyZSByZWNvcmRlZCBidXQgdGhlCisgKiAgICAgIHJlc3VsdGluZyBzdGF0ZSBvZiBiaXRzIG1hc2tlZCBieSAudmFsaWQgaXMgbm90IGVxdWFsIHRvIC5yZXF1ZXN0ZWQuCisgKiAgICAgIFByb2JhYmx5IHRoZXJlIGFyZSBvdGhlciBkZXZpY2Utc3BlY2lmaWMgY29uc3RyYWludHMgb24gc29tZSBmZWF0dXJlcworICogICAgICBpbiB0aGUgc2V0LiBXaGVuICVFVEhUT09MX0ZfVU5TVVBQT1JURUQgaXMgc2V0LCAudmFsaWQgaXMgY29uc2lkZXJlZAorICogICAgICBoZXJlIGFzIHRob3VnaCBpZ25vcmVkIGJpdHMgd2VyZSBjbGVhcmVkLgorICogICAlRVRIVE9PTF9GX0NPTVBBVCAtIHNvbWUgb3IgYWxsIGNoYW5nZXMgcmVxdWVzdGVkIHdlcmUgbWFkZSBieSBjYWxsaW5nCisgKiAgICAgIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zLiBSZXF1ZXN0ZWQgb2ZmbG9hZCBzdGF0ZSBjYW5ub3QgYmUgcHJvcGVybHkKKyAqICAgICAgbWFuYWdlZCBieSBrZXJuZWwuCisgKgorICogTWVhbmluZyBvZiBiaXRzIGluIHRoZSBtYXNrcyBhcmUgb2J0YWluZWQgYnkgJUVUSFRPT0xfR1NTRVRfSU5GTyAobnVtYmVyIG9mCisgKiBiaXRzIGluIHRoZSBhcnJheXMgLSBhbHdheXMgbXVsdGlwbGUgb2YgMzIpIGFuZCAlRVRIVE9PTF9HU1RSSU5HUyBjb21tYW5kcworICogZm9yIEVUSF9TU19GRUFUVVJFUyBzdHJpbmcgc2V0LiBGaXJzdCBlbnRyeSBpbiB0aGUgdGFibGUgY29ycmVzcG9uZHMgdG8gbGVhc3QKKyAqIHNpZ25pZmljYW50IGJpdCBpbiBmZWF0dXJlc1swXSBmaWVsZHMuIEVtcHR5IHN0cmluZ3MgbWFyayB1bmRlZmluZWQgZmVhdHVyZXMuCisgKi8KK2VudW0gZXRodG9vbF9zZmVhdHVyZXNfcmV0dmFsX2JpdHMgeworCUVUSFRPT0xfRl9VTlNVUFBPUlRFRF9fQklULAorCUVUSFRPT0xfRl9XSVNIX19CSVQsCisJRVRIVE9PTF9GX0NPTVBBVF9fQklULAorfTsKKworI2RlZmluZSBFVEhUT09MX0ZfVU5TVVBQT1JURUQgICAoMSA8PCBFVEhUT09MX0ZfVU5TVVBQT1JURURfX0JJVCkKKyNkZWZpbmUgRVRIVE9PTF9GX1dJU0ggICAgICAgICAgKDEgPDwgRVRIVE9PTF9GX1dJU0hfX0JJVCkKKyNkZWZpbmUgRVRIVE9PTF9GX0NPTVBBVCAgICAgICAgKDEgPDwgRVRIVE9PTF9GX0NPTVBBVF9fQklUKQorCisKKy8qIENNRHMgY3VycmVudGx5IHN1cHBvcnRlZCAqLworI2RlZmluZSBFVEhUT09MX0dTRVQJCTB4MDAwMDAwMDEgLyogR2V0IHNldHRpbmdzLiAqLworI2RlZmluZSBFVEhUT09MX1NTRVQJCTB4MDAwMDAwMDIgLyogU2V0IHNldHRpbmdzLiAqLworI2RlZmluZSBFVEhUT09MX0dEUlZJTkZPCTB4MDAwMDAwMDMgLyogR2V0IGRyaXZlciBpbmZvLiAqLworI2RlZmluZSBFVEhUT09MX0dSRUdTCQkweDAwMDAwMDA0IC8qIEdldCBOSUMgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBFVEhUT09MX0dXT0wJCTB4MDAwMDAwMDUgLyogR2V0IHdha2Utb24tbGFuIG9wdGlvbnMuICovCisjZGVmaW5lIEVUSFRPT0xfU1dPTAkJMHgwMDAwMDAwNiAvKiBTZXQgd2FrZS1vbi1sYW4gb3B0aW9ucy4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HTVNHTFZMCQkweDAwMDAwMDA3IC8qIEdldCBkcml2ZXIgbWVzc2FnZSBsZXZlbCAqLworI2RlZmluZSBFVEhUT09MX1NNU0dMVkwJCTB4MDAwMDAwMDggLyogU2V0IGRyaXZlciBtc2cgbGV2ZWwuICovCisjZGVmaW5lIEVUSFRPT0xfTldBWV9SU1QJMHgwMDAwMDAwOSAvKiBSZXN0YXJ0IGF1dG9uZWdvdGlhdGlvbi4gKi8KKy8qIEdldCBsaW5rIHN0YXR1cyBmb3IgaG9zdCwgaS5lLiB3aGV0aGVyIHRoZSBpbnRlcmZhY2UgKmFuZCogdGhlCisgKiBwaHlzaWNhbCBwb3J0IChpZiB0aGVyZSBpcyBvbmUpIGFyZSB1cCAoZXRodG9vbF92YWx1ZSkuICovCisjZGVmaW5lIEVUSFRPT0xfR0xJTksJCTB4MDAwMDAwMGEKKyNkZWZpbmUgRVRIVE9PTF9HRUVQUk9NCQkweDAwMDAwMDBiIC8qIEdldCBFRVBST00gZGF0YSAqLworI2RlZmluZSBFVEhUT09MX1NFRVBST00JCTB4MDAwMDAwMGMgLyogU2V0IEVFUFJPTSBkYXRhLiAqLworI2RlZmluZSBFVEhUT09MX0dDT0FMRVNDRQkweDAwMDAwMDBlIC8qIEdldCBjb2FsZXNjZSBjb25maWcgKi8KKyNkZWZpbmUgRVRIVE9PTF9TQ09BTEVTQ0UJMHgwMDAwMDAwZiAvKiBTZXQgY29hbGVzY2UgY29uZmlnLiAqLworI2RlZmluZSBFVEhUT09MX0dSSU5HUEFSQU0JMHgwMDAwMDAxMCAvKiBHZXQgcmluZyBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEVUSFRPT0xfU1JJTkdQQVJBTQkweDAwMDAwMDExIC8qIFNldCByaW5nIHBhcmFtZXRlcnMuICovCisjZGVmaW5lIEVUSFRPT0xfR1BBVVNFUEFSQU0JMHgwMDAwMDAxMiAvKiBHZXQgcGF1c2UgcGFyYW1ldGVycyAqLworI2RlZmluZSBFVEhUT09MX1NQQVVTRVBBUkFNCTB4MDAwMDAwMTMgLyogU2V0IHBhdXNlIHBhcmFtZXRlcnMuICovCisjZGVmaW5lIEVUSFRPT0xfR1JYQ1NVTQkJMHgwMDAwMDAxNCAvKiBHZXQgUlggaHcgY3N1bSBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfU1JYQ1NVTQkJMHgwMDAwMDAxNSAvKiBTZXQgUlggaHcgY3N1bSBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfR1RYQ1NVTQkJMHgwMDAwMDAxNiAvKiBHZXQgVFggaHcgY3N1bSBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfU1RYQ1NVTQkJMHgwMDAwMDAxNyAvKiBTZXQgVFggaHcgY3N1bSBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfR1NHCQkweDAwMDAwMDE4IC8qIEdldCBzY2F0dGVyLWdhdGhlciBlbmFibGUKKwkJCQkJICAgICogKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfU1NHCQkweDAwMDAwMDE5IC8qIFNldCBzY2F0dGVyLWdhdGhlciBlbmFibGUKKwkJCQkJICAgICogKGV0aHRvb2xfdmFsdWUpLiAqLworI2RlZmluZSBFVEhUT09MX1RFU1QJCTB4MDAwMDAwMWEgLyogZXhlY3V0ZSBOSUMgc2VsZi10ZXN0LiAqLworI2RlZmluZSBFVEhUT09MX0dTVFJJTkdTCTB4MDAwMDAwMWIgLyogZ2V0IHNwZWNpZmllZCBzdHJpbmcgc2V0ICovCisjZGVmaW5lIEVUSFRPT0xfUEhZU19JRAkJMHgwMDAwMDAxYyAvKiBpZGVudGlmeSB0aGUgTklDICovCisjZGVmaW5lIEVUSFRPT0xfR1NUQVRTCQkweDAwMDAwMDFkIC8qIGdldCBOSUMtc3BlY2lmaWMgc3RhdGlzdGljcyAqLworI2RlZmluZSBFVEhUT09MX0dUU08JCTB4MDAwMDAwMWUgLyogR2V0IFRTTyBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfU1RTTwkJMHgwMDAwMDAxZiAvKiBTZXQgVFNPIGVuYWJsZSAoZXRodG9vbF92YWx1ZSkgKi8KKyNkZWZpbmUgRVRIVE9PTF9HUEVSTUFERFIJMHgwMDAwMDAyMCAvKiBHZXQgcGVybWFuZW50IGhhcmR3YXJlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRVRIVE9PTF9HVUZPCQkweDAwMDAwMDIxIC8qIEdldCBVRk8gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX1NVRk8JCTB4MDAwMDAwMjIgLyogU2V0IFVGTyBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfR0dTTwkJMHgwMDAwMDAyMyAvKiBHZXQgR1NPIGVuYWJsZSAoZXRodG9vbF92YWx1ZSkgKi8KKyNkZWZpbmUgRVRIVE9PTF9TR1NPCQkweDAwMDAwMDI0IC8qIFNldCBHU08gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX0dGTEFHUwkJMHgwMDAwMDAyNSAvKiBHZXQgZmxhZ3MgYml0bWFwKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfU0ZMQUdTCQkweDAwMDAwMDI2IC8qIFNldCBmbGFncyBiaXRtYXAoZXRodG9vbF92YWx1ZSkgKi8KKyNkZWZpbmUgRVRIVE9PTF9HUEZMQUdTCQkweDAwMDAwMDI3IC8qIEdldCBkcml2ZXItcHJpdmF0ZSBmbGFncyBiaXRtYXAgKi8KKyNkZWZpbmUgRVRIVE9PTF9TUEZMQUdTCQkweDAwMDAwMDI4IC8qIFNldCBkcml2ZXItcHJpdmF0ZSBmbGFncyBiaXRtYXAgKi8KKworI2RlZmluZSBFVEhUT09MX0dSWEZICQkweDAwMDAwMDI5IC8qIEdldCBSWCBmbG93IGhhc2ggY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBFVEhUT09MX1NSWEZICQkweDAwMDAwMDJhIC8qIFNldCBSWCBmbG93IGhhc2ggY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBFVEhUT09MX0dHUk8JCTB4MDAwMDAwMmIgLyogR2V0IEdSTyBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfU0dSTwkJMHgwMDAwMDAyYyAvKiBTZXQgR1JPIGVuYWJsZSAoZXRodG9vbF92YWx1ZSkgKi8KKyNkZWZpbmUgRVRIVE9PTF9HUlhSSU5HUwkweDAwMDAwMDJkIC8qIEdldCBSWCByaW5ncyBhdmFpbGFibGUgZm9yIExCICovCisjZGVmaW5lIEVUSFRPT0xfR1JYQ0xTUkxDTlQJMHgwMDAwMDAyZSAvKiBHZXQgUlggY2xhc3MgcnVsZSBjb3VudCAqLworI2RlZmluZSBFVEhUT09MX0dSWENMU1JVTEUJMHgwMDAwMDAyZiAvKiBHZXQgUlggY2xhc3NpZmljYXRpb24gcnVsZSAqLworI2RlZmluZSBFVEhUT09MX0dSWENMU1JMQUxMCTB4MDAwMDAwMzAgLyogR2V0IGFsbCBSWCBjbGFzc2lmaWNhdGlvbiBydWxlICovCisjZGVmaW5lIEVUSFRPT0xfU1JYQ0xTUkxERUwJMHgwMDAwMDAzMSAvKiBEZWxldGUgUlggY2xhc3NpZmljYXRpb24gcnVsZSAqLworI2RlZmluZSBFVEhUT09MX1NSWENMU1JMSU5TCTB4MDAwMDAwMzIgLyogSW5zZXJ0IFJYIGNsYXNzaWZpY2F0aW9uIHJ1bGUgKi8KKyNkZWZpbmUgRVRIVE9PTF9GTEFTSERFVgkweDAwMDAwMDMzIC8qIEZsYXNoIGZpcm13YXJlIHRvIGRldmljZSAqLworI2RlZmluZSBFVEhUT09MX1JFU0VUCQkweDAwMDAwMDM0IC8qIFJlc2V0IGhhcmR3YXJlICovCisjZGVmaW5lIEVUSFRPT0xfU1JYTlRVUExFCTB4MDAwMDAwMzUgLyogQWRkIGFuIG4tdHVwbGUgZmlsdGVyIHRvIGRldmljZSAqLworI2RlZmluZSBFVEhUT09MX0dSWE5UVVBMRQkweDAwMDAwMDM2IC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgRVRIVE9PTF9HU1NFVF9JTkZPCTB4MDAwMDAwMzcgLyogR2V0IHN0cmluZyBzZXQgaW5mbyAqLworI2RlZmluZSBFVEhUT09MX0dSWEZISU5ESVIJMHgwMDAwMDAzOCAvKiBHZXQgUlggZmxvdyBoYXNoIGluZGlyJ24gdGFibGUgKi8KKyNkZWZpbmUgRVRIVE9PTF9TUlhGSElORElSCTB4MDAwMDAwMzkgLyogU2V0IFJYIGZsb3cgaGFzaCBpbmRpciduIHRhYmxlICovCisKKyNkZWZpbmUgRVRIVE9PTF9HRkVBVFVSRVMJMHgwMDAwMDAzYSAvKiBHZXQgZGV2aWNlIG9mZmxvYWQgc2V0dGluZ3MgKi8KKyNkZWZpbmUgRVRIVE9PTF9TRkVBVFVSRVMJMHgwMDAwMDAzYiAvKiBDaGFuZ2UgZGV2aWNlIG9mZmxvYWQgc2V0dGluZ3MgKi8KKyNkZWZpbmUgRVRIVE9PTF9HQ0hBTk5FTFMJMHgwMDAwMDAzYyAvKiBHZXQgbm8gb2YgY2hhbm5lbHMgKi8KKyNkZWZpbmUgRVRIVE9PTF9TQ0hBTk5FTFMJMHgwMDAwMDAzZCAvKiBTZXQgbm8gb2YgY2hhbm5lbHMgKi8KKyNkZWZpbmUgRVRIVE9PTF9TRVRfRFVNUAkweDAwMDAwMDNlIC8qIFNldCBkdW1wIHNldHRpbmdzICovCisjZGVmaW5lIEVUSFRPT0xfR0VUX0RVTVBfRkxBRwkweDAwMDAwMDNmIC8qIEdldCBkdW1wIHNldHRpbmdzICovCisjZGVmaW5lIEVUSFRPT0xfR0VUX0RVTVBfREFUQQkweDAwMDAwMDQwIC8qIEdldCBkdW1wIGRhdGEgKi8KKworLyogY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGNvZGUgKi8KKyNkZWZpbmUgU1BBUkNfRVRIX0dTRVQJCUVUSFRPT0xfR1NFVAorI2RlZmluZSBTUEFSQ19FVEhfU1NFVAkJRVRIVE9PTF9TU0VUCisKKy8qIEluZGljYXRlcyB3aGF0IGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZgkJKDEgPDwgMCkKKyNkZWZpbmUgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbAkJKDEgPDwgMSkKKyNkZWZpbmUgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYJCSgxIDw8IDIpCisjZGVmaW5lIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsCQkoMSA8PCAzKQorI2RlZmluZSBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYJKDEgPDwgNCkKKyNkZWZpbmUgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsCSgxIDw8IDUpCisjZGVmaW5lIFNVUFBPUlRFRF9BdXRvbmVnCQkoMSA8PCA2KQorI2RlZmluZSBTVVBQT1JURURfVFAJCQkoMSA8PCA3KQorI2RlZmluZSBTVVBQT1JURURfQVVJCQkJKDEgPDwgOCkKKyNkZWZpbmUgU1VQUE9SVEVEX01JSQkJCSgxIDw8IDkpCisjZGVmaW5lIFNVUFBPUlRFRF9GSUJSRQkJCSgxIDw8IDEwKQorI2RlZmluZSBTVVBQT1JURURfQk5DCQkJKDEgPDwgMTEpCisjZGVmaW5lIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwJKDEgPDwgMTIpCisjZGVmaW5lIFNVUFBPUlRFRF9QYXVzZQkJCSgxIDw8IDEzKQorI2RlZmluZSBTVVBQT1JURURfQXN5bV9QYXVzZQkJKDEgPDwgMTQpCisjZGVmaW5lIFNVUFBPUlRFRF8yNTAwYmFzZVhfRnVsbAkoMSA8PCAxNSkKKyNkZWZpbmUgU1VQUE9SVEVEX0JhY2twbGFuZQkJKDEgPDwgMTYpCisjZGVmaW5lIFNVUFBPUlRFRF8xMDAwYmFzZUtYX0Z1bGwJKDEgPDwgMTcpCisjZGVmaW5lIFNVUFBPUlRFRF8xMDAwMGJhc2VLWDRfRnVsbAkoMSA8PCAxOCkKKyNkZWZpbmUgU1VQUE9SVEVEXzEwMDAwYmFzZUtSX0Z1bGwJKDEgPDwgMTkpCisjZGVmaW5lIFNVUFBPUlRFRF8xMDAwMGJhc2VSX0ZFQwkoMSA8PCAyMCkKKyNkZWZpbmUgU1VQUE9SVEVEXzIwMDAwYmFzZU1MRDJfRnVsbAkoMSA8PCAyMSkKKyNkZWZpbmUgU1VQUE9SVEVEXzIwMDAwYmFzZUtSMl9GdWxsCSgxIDw8IDIyKQorCisvKiBJbmRpY2F0ZXMgd2hhdCBmZWF0dXJlcyBhcmUgYWR2ZXJ0aXNlZCBieSB0aGUgaW50ZXJmYWNlLiAqLworI2RlZmluZSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZgkJKDEgPDwgMCkKKyNkZWZpbmUgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwJCSgxIDw8IDEpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZgkoMSA8PCAyKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwJKDEgPDwgMykKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZgkoMSA8PCA0KQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsCSgxIDw8IDUpCisjZGVmaW5lIEFEVkVSVElTRURfQXV0b25lZwkJKDEgPDwgNikKKyNkZWZpbmUgQURWRVJUSVNFRF9UUAkJCSgxIDw8IDcpCisjZGVmaW5lIEFEVkVSVElTRURfQVVJCQkJKDEgPDwgOCkKKyNkZWZpbmUgQURWRVJUSVNFRF9NSUkJCQkoMSA8PCA5KQorI2RlZmluZSBBRFZFUlRJU0VEX0ZJQlJFCQkoMSA8PCAxMCkKKyNkZWZpbmUgQURWRVJUSVNFRF9CTkMJCQkoMSA8PCAxMSkKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDAwMGJhc2VUX0Z1bGwJKDEgPDwgMTIpCisjZGVmaW5lIEFEVkVSVElTRURfUGF1c2UJCSgxIDw8IDEzKQorI2RlZmluZSBBRFZFUlRJU0VEX0FzeW1fUGF1c2UJCSgxIDw8IDE0KQorI2RlZmluZSBBRFZFUlRJU0VEXzI1MDBiYXNlWF9GdWxsCSgxIDw8IDE1KQorI2RlZmluZSBBRFZFUlRJU0VEX0JhY2twbGFuZQkJKDEgPDwgMTYpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwMGJhc2VLWF9GdWxsCSgxIDw8IDE3KQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMDAwYmFzZUtYNF9GdWxsCSgxIDw8IDE4KQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMDAwYmFzZUtSX0Z1bGwJKDEgPDwgMTkpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwMDBiYXNlUl9GRUMJKDEgPDwgMjApCisjZGVmaW5lIEFEVkVSVElTRURfMjAwMDBiYXNlTUxEMl9GdWxsCSgxIDw8IDIxKQorI2RlZmluZSBBRFZFUlRJU0VEXzIwMDAwYmFzZUtSMl9GdWxsCSgxIDw8IDIyKQorCisvKiBUaGUgZm9sbG93aW5nIGFyZSBhbGwgaW52b2x2ZWQgaW4gZm9yY2luZyBhIHBhcnRpY3VsYXIgbGluaworICogbW9kZSBmb3IgdGhlIGRldmljZSBmb3Igc2V0dGluZyB0aGluZ3MuICBXaGVuIGdldHRpbmcgdGhlCisgKiBkZXZpY2VzIHNldHRpbmdzLCB0aGVzZSBpbmRpY2F0ZSB0aGUgY3VycmVudCBtb2RlIGFuZCB3aGV0aGVyCisgKiBpdCB3YXMgZm9yY2VkIHVwIGludG8gdGhpcyBtb2RlIG9yIGF1dG9uZWdvdGlhdGVkLgorICovCisKKy8qIFRoZSBmb3JjZWQgc3BlZWQsIDEwTWIsIDEwME1iLCBnaWdhYml0LCAyLjVHYiwgMTBHYkUuICovCisjZGVmaW5lIFNQRUVEXzEwCQkxMAorI2RlZmluZSBTUEVFRF8xMDAJCTEwMAorI2RlZmluZSBTUEVFRF8xMDAwCQkxMDAwCisjZGVmaW5lIFNQRUVEXzI1MDAJCTI1MDAKKyNkZWZpbmUgU1BFRURfMTAwMDAJCTEwMDAwCisjZGVmaW5lIFNQRUVEX1VOS05PV04JCS0xCisKKy8qIER1cGxleCwgaGFsZiBvciBmdWxsLiAqLworI2RlZmluZSBEVVBMRVhfSEFMRgkJMHgwMAorI2RlZmluZSBEVVBMRVhfRlVMTAkJMHgwMQorI2RlZmluZSBEVVBMRVhfVU5LTk9XTgkJMHhmZgorCisvKiBXaGljaCBjb25uZWN0b3IgcG9ydC4gKi8KKyNkZWZpbmUgUE9SVF9UUAkJCTB4MDAKKyNkZWZpbmUgUE9SVF9BVUkJCTB4MDEKKyNkZWZpbmUgUE9SVF9NSUkJCTB4MDIKKyNkZWZpbmUgUE9SVF9GSUJSRQkJMHgwMworI2RlZmluZSBQT1JUX0JOQwkJMHgwNAorI2RlZmluZSBQT1JUX0RBCQkJMHgwNQorI2RlZmluZSBQT1JUX05PTkUJCTB4ZWYKKyNkZWZpbmUgUE9SVF9PVEhFUgkJMHhmZgorCisvKiBXaGljaCB0cmFuc2NlaXZlciB0byB1c2UuICovCisjZGVmaW5lIFhDVlJfSU5URVJOQUwJCTB4MDAKKyNkZWZpbmUgWENWUl9FWFRFUk5BTAkJMHgwMQorI2RlZmluZSBYQ1ZSX0RVTU1ZMQkJMHgwMgorI2RlZmluZSBYQ1ZSX0RVTU1ZMgkJMHgwMworI2RlZmluZSBYQ1ZSX0RVTU1ZMwkJMHgwNAorCisvKiBFbmFibGUgb3IgZGlzYWJsZSBhdXRvbmVnb3RpYXRpb24uICBJZiB0aGlzIGlzIHNldCB0byBlbmFibGUsCisgKiB0aGUgZm9yY2VkIGxpbmsgbW9kZXMgYWJvdmUgYXJlIGNvbXBsZXRlbHkgaWdub3JlZC4KKyAqLworI2RlZmluZSBBVVRPTkVHX0RJU0FCTEUJCTB4MDAKKyNkZWZpbmUgQVVUT05FR19FTkFCTEUJCTB4MDEKKworLyogTW9kZSBNREkgb3IgTURJLVggKi8KKyNkZWZpbmUgRVRIX1RQX01ESV9JTlZBTElECTB4MDAKKyNkZWZpbmUgRVRIX1RQX01ESQkJMHgwMQorI2RlZmluZSBFVEhfVFBfTURJX1gJCTB4MDIKKworLyogV2FrZS1Pbi1MYW4gb3B0aW9ucy4gKi8KKyNkZWZpbmUgV0FLRV9QSFkJCSgxIDw8IDApCisjZGVmaW5lIFdBS0VfVUNBU1QJCSgxIDw8IDEpCisjZGVmaW5lIFdBS0VfTUNBU1QJCSgxIDw8IDIpCisjZGVmaW5lIFdBS0VfQkNBU1QJCSgxIDw8IDMpCisjZGVmaW5lIFdBS0VfQVJQCQkoMSA8PCA0KQorI2RlZmluZSBXQUtFX01BR0lDCQkoMSA8PCA1KQorI2RlZmluZSBXQUtFX01BR0lDU0VDVVJFCSgxIDw8IDYpIC8qIG9ubHkgbWVhbmluZ2Z1bCBpZiBXQUtFX01BR0lDICovCisKKy8qIEwyLUw0IG5ldHdvcmsgdHJhZmZpYyBmbG93IHR5cGVzICovCisjZGVmaW5lCVRDUF9WNF9GTE9XCTB4MDEJLyogaGFzaCBvciBzcGVjICh0Y3BfaXA0X3NwZWMpICovCisjZGVmaW5lCVVEUF9WNF9GTE9XCTB4MDIJLyogaGFzaCBvciBzcGVjICh1ZHBfaXA0X3NwZWMpICovCisjZGVmaW5lCVNDVFBfVjRfRkxPVwkweDAzCS8qIGhhc2ggb3Igc3BlYyAoc2N0cF9pcDRfc3BlYykgKi8KKyNkZWZpbmUJQUhfRVNQX1Y0X0ZMT1cJMHgwNAkvKiBoYXNoIG9ubHkgKi8KKyNkZWZpbmUJVENQX1Y2X0ZMT1cJMHgwNQkvKiBoYXNoIG9ubHkgKi8KKyNkZWZpbmUJVURQX1Y2X0ZMT1cJMHgwNgkvKiBoYXNoIG9ubHkgKi8KKyNkZWZpbmUJU0NUUF9WNl9GTE9XCTB4MDcJLyogaGFzaCBvbmx5ICovCisjZGVmaW5lCUFIX0VTUF9WNl9GTE9XCTB4MDgJLyogaGFzaCBvbmx5ICovCisjZGVmaW5lCUFIX1Y0X0ZMT1cJMHgwOQkvKiBoYXNoIG9yIHNwZWMgKGFoX2lwNF9zcGVjKSAqLworI2RlZmluZQlFU1BfVjRfRkxPVwkweDBhCS8qIGhhc2ggb3Igc3BlYyAoZXNwX2lwNF9zcGVjKSAqLworI2RlZmluZQlBSF9WNl9GTE9XCTB4MGIJLyogaGFzaCBvbmx5ICovCisjZGVmaW5lCUVTUF9WNl9GTE9XCTB4MGMJLyogaGFzaCBvbmx5ICovCisjZGVmaW5lCUlQX1VTRVJfRkxPVwkweDBkCS8qIHNwZWMgb25seSAodXNyX2lwNF9zcGVjKSAqLworI2RlZmluZQlJUFY0X0ZMT1cJMHgxMAkvKiBoYXNoIG9ubHkgKi8KKyNkZWZpbmUJSVBWNl9GTE9XCTB4MTEJLyogaGFzaCBvbmx5ICovCisjZGVmaW5lCUVUSEVSX0ZMT1cJMHgxMgkvKiBzcGVjIG9ubHkgKGV0aGVyX3NwZWMpICovCisvKiBGbGFnIHRvIGVuYWJsZSBhZGRpdGlvbmFsIGZpZWxkcyBpbiBzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKi8KKyNkZWZpbmUJRkxPV19FWFQJMHg4MDAwMDAwMAorCisvKiBMMy1MNCBuZXR3b3JrIHRyYWZmaWMgZmxvdyBoYXNoIG9wdGlvbnMgKi8KKyNkZWZpbmUJUlhIX0wyREEJKDEgPDwgMSkKKyNkZWZpbmUJUlhIX1ZMQU4JKDEgPDwgMikKKyNkZWZpbmUJUlhIX0wzX1BST1RPCSgxIDw8IDMpCisjZGVmaW5lCVJYSF9JUF9TUkMJKDEgPDwgNCkKKyNkZWZpbmUJUlhIX0lQX0RTVAkoMSA8PCA1KQorI2RlZmluZQlSWEhfTDRfQl8wXzEJKDEgPDwgNikgLyogc3JjIHBvcnQgaW4gY2FzZSBvZiBUQ1AvVURQL1NDVFAgKi8KKyNkZWZpbmUJUlhIX0w0X0JfMl8zCSgxIDw8IDcpIC8qIGRzdCBwb3J0IGluIGNhc2Ugb2YgVENQL1VEUC9TQ1RQICovCisjZGVmaW5lCVJYSF9ESVNDQVJECSgxIDw8IDMxKQorCisjZGVmaW5lCVJYX0NMU19GTE9XX0RJU0MJMHhmZmZmZmZmZmZmZmZmZmZmVUxMCisKKy8qIFJlc2V0IGZsYWdzICovCisvKiBUaGUgcmVzZXQoKSBvcGVyYXRpb24gbXVzdCBjbGVhciB0aGUgZmxhZ3MgZm9yIHRoZSBjb21wb25lbnRzIHdoaWNoCisgKiB3ZXJlIGFjdHVhbGx5IHJlc2V0LiAgT24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBmbGFncyBpbmRpY2F0ZSB0aGUKKyAqIGNvbXBvbmVudHMgd2hpY2ggd2VyZSBub3QgcmVzZXQsIGVpdGhlciBiZWNhdXNlIHRoZXkgZG8gbm90IGV4aXN0CisgKiBpbiB0aGUgaGFyZHdhcmUgb3IgYmVjYXVzZSB0aGV5IGNhbm5vdCBiZSByZXNldCBpbmRlcGVuZGVudGx5LiAgVGhlCisgKiBkcml2ZXIgbXVzdCBuZXZlciByZXNldCBhbnkgY29tcG9uZW50cyB0aGF0IHdlcmUgbm90IHJlcXVlc3RlZC4KKyAqLworZW51bSBldGh0b29sX3Jlc2V0X2ZsYWdzIHsKKwkvKiBUaGVzZSBmbGFncyByZXByZXNlbnQgY29tcG9uZW50cyBkZWRpY2F0ZWQgdG8gdGhlIGludGVyZmFjZQorCSAqIHRoZSBjb21tYW5kIGlzIGFkZHJlc3NlZCB0by4gIFNoaWZ0IGFueSBmbGFnIGxlZnQgYnkKKwkgKiBFVEhfUkVTRVRfU0hBUkVEX1NISUZUIHRvIHJlc2V0IGEgc2hhcmVkIGNvbXBvbmVudCBvZiB0aGUKKwkgKiBzYW1lIHR5cGUuCisJICovCisJRVRIX1JFU0VUX01HTVQJCT0gMSA8PCAwLAkvKiBNYW5hZ2VtZW50IHByb2Nlc3NvciAqLworCUVUSF9SRVNFVF9JUlEJCT0gMSA8PCAxLAkvKiBJbnRlcnJ1cHQgcmVxdWVzdGVyICovCisJRVRIX1JFU0VUX0RNQQkJPSAxIDw8IDIsCS8qIERNQSBlbmdpbmUgKi8KKwlFVEhfUkVTRVRfRklMVEVSCT0gMSA8PCAzLAkvKiBGaWx0ZXJpbmcvZmxvdyBkaXJlY3Rpb24gKi8KKwlFVEhfUkVTRVRfT0ZGTE9BRAk9IDEgPDwgNCwJLyogUHJvdG9jb2wgb2ZmbG9hZCAqLworCUVUSF9SRVNFVF9NQUMJCT0gMSA8PCA1LAkvKiBNZWRpYSBhY2Nlc3MgY29udHJvbGxlciAqLworCUVUSF9SRVNFVF9QSFkJCT0gMSA8PCA2LAkvKiBUcmFuc2NlaXZlci9QSFkgKi8KKwlFVEhfUkVTRVRfUkFNCQk9IDEgPDwgNywJLyogUkFNIHNoYXJlZCBiZXR3ZWVuCisJCQkJCQkgKiBtdWx0aXBsZSBjb21wb25lbnRzICovCisKKwlFVEhfUkVTRVRfREVESUNBVEVECT0gMHgwMDAwZmZmZiwJLyogQWxsIGNvbXBvbmVudHMgZGVkaWNhdGVkIHRvCisJCQkJCQkgKiB0aGlzIGludGVyZmFjZSAqLworCUVUSF9SRVNFVF9BTEwJCT0gMHhmZmZmZmZmZiwJLyogQWxsIGNvbXBvbmVudHMgdXNlZCBieSB0aGlzCisJCQkJCQkgKiBpbnRlcmZhY2UsIGV2ZW4gaWYgc2hhcmVkICovCit9OworI2RlZmluZSBFVEhfUkVTRVRfU0hBUkVEX1NISUZUCTE2CisKKyNlbmRpZiAvKiBfTElOVVhfRVRIVE9PTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2V2ZW50cG9sbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ldmVudHBvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzhhMDJmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ldmVudHBvbGwuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogIGluY2x1ZGUvbGludXgvZXZlbnRwb2xsLmggKCBFZmZpY2llbnQgZXZlbnQgcG9sbGluZyBpbXBsZW1lbnRhdGlvbiApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLC4uLiwyMDA2CSBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX0VWRU5UUE9MTF9ICisjZGVmaW5lIF9MSU5VWF9FVkVOVFBPTExfSAorCisvKiBGb3IgT19DTE9FWEVDICovCisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBGbGFncyBmb3IgZXBvbGxfY3JlYXRlMS4gICovCisjZGVmaW5lIEVQT0xMX0NMT0VYRUMgT19DTE9FWEVDCisKKy8qIFZhbGlkIG9wY29kZXMgdG8gaXNzdWUgdG8gc3lzX2Vwb2xsX2N0bCgpICovCisjZGVmaW5lIEVQT0xMX0NUTF9BREQgMQorI2RlZmluZSBFUE9MTF9DVExfREVMIDIKKyNkZWZpbmUgRVBPTExfQ1RMX01PRCAzCisKKy8qIFNldCB0aGUgT25lIFNob3QgYmVoYXZpb3VyIGZvciB0aGUgdGFyZ2V0IGZpbGUgZGVzY3JpcHRvciAqLworI2RlZmluZSBFUE9MTE9ORVNIT1QgKDEgPDwgMzApCisKKy8qIFNldCB0aGUgRWRnZSBUcmlnZ2VyZWQgYmVoYXZpb3VyIGZvciB0aGUgdGFyZ2V0IGZpbGUgZGVzY3JpcHRvciAqLworI2RlZmluZSBFUE9MTEVUICgxIDw8IDMxKQorCisvKiAKKyAqIE9uIHg4Ni02NCBtYWtlIHRoZSA2NGJpdCBzdHJ1Y3R1cmUgaGF2ZSB0aGUgc2FtZSBhbGlnbm1lbnQgYXMgdGhlCisgKiAzMmJpdCBzdHJ1Y3R1cmUuIFRoaXMgbWFrZXMgMzJiaXQgZW11bGF0aW9uIGVhc2llci4KKyAqCisgKiBVTUwveDg2XzY0IG5lZWRzIHRoZSBzYW1lIHBhY2tpbmcgYXMgeDg2XzY0CisgKi8KKyNpZmRlZiBfX3g4Nl82NF9fCisjZGVmaW5lIEVQT0xMX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2Vsc2UKKyNkZWZpbmUgRVBPTExfUEFDS0VECisjZW5kaWYKKworc3RydWN0IGVwb2xsX2V2ZW50IHsKKwlfX3UzMiBldmVudHM7CisJX191NjQgZGF0YTsKK30gRVBPTExfUEFDS0VEOworCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9MSU5VWF9FVkVOVFBPTExfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjI4ODIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaApAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9pbmNsdWRlL2xpbnV4L21pbml4X2ZzLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKyNpZm5kZWYgX0xJTlVYX0VYVDJfRlNfSAorI2RlZmluZSBfTElOVVhfRVhUMl9GU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworLyoKKyAqIFRoZSBzZWNvbmQgZXh0ZW5kZWQgZmlsZXN5c3RlbSBjb25zdGFudHMvc3RydWN0dXJlcworICovCisKKy8qCisgKiBEZWZpbmUgRVhUMkZTX0RFQlVHIHRvIHByb2R1Y2UgZGVidWcgbWVzc2FnZXMKKyAqLworI3VuZGVmIEVYVDJGU19ERUJVRworCisvKgorICogRGVmaW5lIEVYVDJfUkVTRVJWQVRJT04gdG8gcmVzZXJ2ZSBkYXRhIGJsb2NrcyBmb3IgZXhwYW5kaW5nIGZpbGVzCisgKi8KKyNkZWZpbmUgRVhUMl9ERUZBVUxUX1JFU0VSVkVfQkxPQ0tTICAgICA4CisvKm1heCB3aW5kb3cgc2l6ZTogMTAyNChkaXJlY3QgYmxvY2tzKSArIDMoW3QsZF1pbmRpcmVjdCBibG9ja3MpICovCisjZGVmaW5lIEVYVDJfTUFYX1JFU0VSVkVfQkxPQ0tTICAgICAgICAgMTAyNworI2RlZmluZSBFWFQyX1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQgMAorLyoKKyAqIFRoZSBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0gdmVyc2lvbgorICovCisjZGVmaW5lIEVYVDJGU19EQVRFCQkiOTUvMDgvMDkiCisjZGVmaW5lIEVYVDJGU19WRVJTSU9OCQkiMC41YiIKKworLyoKKyAqIERlYnVnIGNvZGUKKyAqLworI2lmZGVmIEVYVDJGU19ERUJVRworIwlkZWZpbmUgZXh0Ml9kZWJ1ZyhmLCBhLi4uKQl7IFwKKwkJCQkJcHJpbnRrICgiRVhUMi1mcyBERUJVRyAoJXMsICVkKTogJXM6IiwgXAorCQkJCQkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7IFwKKwkJCQkgIAlwcmludGsgKGYsICMjIGEpOyBcCisJCQkJCX0KKyNlbHNlCisjCWRlZmluZSBleHQyX2RlYnVnKGYsIGEuLi4pCS8qKi8KKyNlbmRpZgorCisvKgorICogU3BlY2lhbCBpbm9kZSBudW1iZXJzCisgKi8KKyNkZWZpbmUJRVhUMl9CQURfSU5PCQkgMQkvKiBCYWQgYmxvY2tzIGlub2RlICovCisjZGVmaW5lIEVYVDJfUk9PVF9JTk8JCSAyCS8qIFJvb3QgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9CT09UX0xPQURFUl9JTk8JIDUJLyogQm9vdCBsb2FkZXIgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9VTkRFTF9ESVJfSU5PCSA2CS8qIFVuZGVsZXRlIGRpcmVjdG9yeSBpbm9kZSAqLworCisvKiBGaXJzdCBub24tcmVzZXJ2ZWQgaW5vZGUgZm9yIG9sZCBleHQyIGZpbGVzeXN0ZW1zICovCisjZGVmaW5lIEVYVDJfR09PRF9PTERfRklSU1RfSU5PCTExCisKKy8qIEFzc3VtZSB0aGF0IHVzZXIgbW9kZSBwcm9ncmFtcyBhcmUgcGFzc2luZyBpbiBhbiBleHQyZnMgc3VwZXJibG9jaywgbm90CisgKiBhIGtlcm5lbCBzdHJ1Y3Qgc3VwZXJfYmxvY2suICBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gY2FsbCB0aGUgZmVhdHVyZS10ZXN0CisgKiBtYWNyb3MgZnJvbSB1c2VyIGxhbmQuICovCisjZGVmaW5lIEVYVDJfU0Ioc2IpCShzYikKKworLyoKKyAqIE1heGltYWwgY291bnQgb2YgbGlua3MgdG8gYSBmaWxlCisgKi8KKyNkZWZpbmUgRVhUMl9MSU5LX01BWAkJMzIwMDAKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBzZXZlcmFsIGJsb2NrIHNpemVzCisgKi8KKyNkZWZpbmUgRVhUMl9NSU5fQkxPQ0tfU0laRQkJMTAyNAorI2RlZmluZQlFWFQyX01BWF9CTE9DS19TSVpFCQk0MDk2CisjZGVmaW5lIEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFCQkgIDEwCisjIGRlZmluZSBFWFQyX0JMT0NLX1NJWkUocykJCShFWFQyX01JTl9CTE9DS19TSVpFIDw8IChzKS0+c19sb2dfYmxvY2tfc2l6ZSkKKyNkZWZpbmUJRVhUMl9BRERSX1BFUl9CTE9DSyhzKQkJKEVYVDJfQkxPQ0tfU0laRShzKSAvIHNpemVvZiAoX191MzIpKQorIyBkZWZpbmUgRVhUMl9CTE9DS19TSVpFX0JJVFMocykJKChzKS0+c19sb2dfYmxvY2tfc2l6ZSArIDEwKQorI2RlZmluZSBFWFQyX0lOT0RFX1NJWkUocykJKCgocyktPnNfcmV2X2xldmVsID09IEVYVDJfR09PRF9PTERfUkVWKSA/IFwKKwkJCQkgRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFIDogXAorCQkJCSAocyktPnNfaW5vZGVfc2l6ZSkKKyNkZWZpbmUgRVhUMl9GSVJTVF9JTk8ocykJKCgocyktPnNfcmV2X2xldmVsID09IEVYVDJfR09PRF9PTERfUkVWKSA/IFwKKwkJCQkgRVhUMl9HT09EX09MRF9GSVJTVF9JTk8gOiBcCisJCQkJIChzKS0+c19maXJzdF9pbm8pCisKKy8qCisgKiBNYWNyby1pbnN0cnVjdGlvbnMgdXNlZCB0byBtYW5hZ2UgZnJhZ21lbnRzCisgKi8KKyNkZWZpbmUgRVhUMl9NSU5fRlJBR19TSVpFCQkxMDI0CisjZGVmaW5lCUVYVDJfTUFYX0ZSQUdfU0laRQkJNDA5NgorI2RlZmluZSBFWFQyX01JTl9GUkFHX0xPR19TSVpFCQkgIDEwCisjIGRlZmluZSBFWFQyX0ZSQUdfU0laRShzKQkJKEVYVDJfTUlOX0ZSQUdfU0laRSA8PCAocyktPnNfbG9nX2ZyYWdfc2l6ZSkKKyMgZGVmaW5lIEVYVDJfRlJBR1NfUEVSX0JMT0NLKHMpCShFWFQyX0JMT0NLX1NJWkUocykgLyBFWFQyX0ZSQUdfU0laRShzKSkKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhIGJsb2NrcyBncm91cCBkZXNjcmlwdG9yCisgKi8KK3N0cnVjdCBleHQyX2dyb3VwX2Rlc2MKK3sKKwlfX2xlMzIJYmdfYmxvY2tfYml0bWFwOwkJLyogQmxvY2tzIGJpdG1hcCBibG9jayAqLworCV9fbGUzMgliZ19pbm9kZV9iaXRtYXA7CQkvKiBJbm9kZXMgYml0bWFwIGJsb2NrICovCisJX19sZTMyCWJnX2lub2RlX3RhYmxlOwkJLyogSW5vZGVzIHRhYmxlIGJsb2NrICovCisJX19sZTE2CWJnX2ZyZWVfYmxvY2tzX2NvdW50OwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCV9fbGUxNgliZ19mcmVlX2lub2Rlc19jb3VudDsJLyogRnJlZSBpbm9kZXMgY291bnQgKi8KKwlfX2xlMTYJYmdfdXNlZF9kaXJzX2NvdW50OwkvKiBEaXJlY3RvcmllcyBjb3VudCAqLworCV9fbGUxNgliZ19wYWQ7CisJX19sZTMyCWJnX3Jlc2VydmVkWzNdOworfTsKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBncm91cCBkZXNjcmlwdG9ycworICovCisjIGRlZmluZSBFWFQyX0JMT0NLU19QRVJfR1JPVVAocykJKChzKS0+c19ibG9ja3NfcGVyX2dyb3VwKQorIyBkZWZpbmUgRVhUMl9ERVNDX1BFUl9CTE9DSyhzKQkJKEVYVDJfQkxPQ0tfU0laRShzKSAvIHNpemVvZiAoc3RydWN0IGV4dDJfZ3JvdXBfZGVzYykpCisjIGRlZmluZSBFWFQyX0lOT0RFU19QRVJfR1JPVVAocykJKChzKS0+c19pbm9kZXNfcGVyX2dyb3VwKQorCisvKgorICogQ29uc3RhbnRzIHJlbGF0aXZlIHRvIHRoZSBkYXRhIGJsb2NrcworICovCisjZGVmaW5lCUVYVDJfTkRJUl9CTE9DS1MJCTEyCisjZGVmaW5lCUVYVDJfSU5EX0JMT0NLCQkJRVhUMl9ORElSX0JMT0NLUworI2RlZmluZQlFWFQyX0RJTkRfQkxPQ0sJCQkoRVhUMl9JTkRfQkxPQ0sgKyAxKQorI2RlZmluZQlFWFQyX1RJTkRfQkxPQ0sJCQkoRVhUMl9ESU5EX0JMT0NLICsgMSkKKyNkZWZpbmUJRVhUMl9OX0JMT0NLUwkJCShFWFQyX1RJTkRfQkxPQ0sgKyAxKQorCisvKgorICogSW5vZGUgZmxhZ3MgKEdFVEZMQUdTL1NFVEZMQUdTKQorICovCisjZGVmaW5lCUVYVDJfU0VDUk1fRkwJCQlGU19TRUNSTV9GTAkvKiBTZWN1cmUgZGVsZXRpb24gKi8KKyNkZWZpbmUJRVhUMl9VTlJNX0ZMCQkJRlNfVU5STV9GTAkvKiBVbmRlbGV0ZSAqLworI2RlZmluZQlFWFQyX0NPTVBSX0ZMCQkJRlNfQ09NUFJfRkwJLyogQ29tcHJlc3MgZmlsZSAqLworI2RlZmluZSBFWFQyX1NZTkNfRkwJCQlGU19TWU5DX0ZMCS8qIFN5bmNocm9ub3VzIHVwZGF0ZXMgKi8KKyNkZWZpbmUgRVhUMl9JTU1VVEFCTEVfRkwJCUZTX0lNTVVUQUJMRV9GTAkvKiBJbW11dGFibGUgZmlsZSAqLworI2RlZmluZSBFWFQyX0FQUEVORF9GTAkJCUZTX0FQUEVORF9GTAkvKiB3cml0ZXMgdG8gZmlsZSBtYXkgb25seSBhcHBlbmQgKi8KKyNkZWZpbmUgRVhUMl9OT0RVTVBfRkwJCQlGU19OT0RVTVBfRkwJLyogZG8gbm90IGR1bXAgZmlsZSAqLworI2RlZmluZSBFWFQyX05PQVRJTUVfRkwJCQlGU19OT0FUSU1FX0ZMCS8qIGRvIG5vdCB1cGRhdGUgYXRpbWUgKi8KKy8qIFJlc2VydmVkIGZvciBjb21wcmVzc2lvbiB1c2FnZS4uLiAqLworI2RlZmluZSBFWFQyX0RJUlRZX0ZMCQkJRlNfRElSVFlfRkwKKyNkZWZpbmUgRVhUMl9DT01QUkJMS19GTAkJRlNfQ09NUFJCTEtfRkwJLyogT25lIG9yIG1vcmUgY29tcHJlc3NlZCBjbHVzdGVycyAqLworI2RlZmluZSBFWFQyX05PQ09NUF9GTAkJCUZTX05PQ09NUF9GTAkvKiBEb24ndCBjb21wcmVzcyAqLworI2RlZmluZSBFWFQyX0VDT01QUl9GTAkJCUZTX0VDT01QUl9GTAkvKiBDb21wcmVzc2lvbiBlcnJvciAqLworLyogRW5kIGNvbXByZXNzaW9uIGZsYWdzIC0tLSBtYXliZSBub3QgYWxsIHVzZWQgKi8JCisjZGVmaW5lIEVYVDJfQlRSRUVfRkwJCQlGU19CVFJFRV9GTAkvKiBidHJlZSBmb3JtYXQgZGlyICovCisjZGVmaW5lIEVYVDJfSU5ERVhfRkwJCQlGU19JTkRFWF9GTAkvKiBoYXNoLWluZGV4ZWQgZGlyZWN0b3J5ICovCisjZGVmaW5lIEVYVDJfSU1BR0lDX0ZMCQkJRlNfSU1BR0lDX0ZMCS8qIEFGUyBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgRVhUMl9KT1VSTkFMX0RBVEFfRkwJCUZTX0pPVVJOQUxfREFUQV9GTCAvKiBSZXNlcnZlZCBmb3IgZXh0MyAqLworI2RlZmluZSBFWFQyX05PVEFJTF9GTAkJCUZTX05PVEFJTF9GTAkvKiBmaWxlIHRhaWwgc2hvdWxkIG5vdCBiZSBtZXJnZWQgKi8KKyNkZWZpbmUgRVhUMl9ESVJTWU5DX0ZMCQkJRlNfRElSU1lOQ19GTAkvKiBkaXJzeW5jIGJlaGF2aW91ciAoZGlyZWN0b3JpZXMgb25seSkgKi8KKyNkZWZpbmUgRVhUMl9UT1BESVJfRkwJCQlGU19UT1BESVJfRkwJLyogVG9wIG9mIGRpcmVjdG9yeSBoaWVyYXJjaGllcyovCisjZGVmaW5lIEVYVDJfUkVTRVJWRURfRkwJCUZTX1JFU0VSVkVEX0ZMCS8qIHJlc2VydmVkIGZvciBleHQyIGxpYiAqLworCisjZGVmaW5lIEVYVDJfRkxfVVNFUl9WSVNJQkxFCQlGU19GTF9VU0VSX1ZJU0lCTEUJLyogVXNlciB2aXNpYmxlIGZsYWdzICovCisjZGVmaW5lIEVYVDJfRkxfVVNFUl9NT0RJRklBQkxFCQlGU19GTF9VU0VSX01PRElGSUFCTEUJLyogVXNlciBtb2RpZmlhYmxlIGZsYWdzICovCisKKy8qIEZsYWdzIHRoYXQgc2hvdWxkIGJlIGluaGVyaXRlZCBieSBuZXcgaW5vZGVzIGZyb20gdGhlaXIgcGFyZW50LiAqLworI2RlZmluZSBFWFQyX0ZMX0lOSEVSSVRFRCAoRVhUMl9TRUNSTV9GTCB8IEVYVDJfVU5STV9GTCB8IEVYVDJfQ09NUFJfRkwgfFwKKwkJCSAgIEVYVDJfU1lOQ19GTCB8IEVYVDJfTk9EVU1QX0ZMIHxcCisJCQkgICBFWFQyX05PQVRJTUVfRkwgfCBFWFQyX0NPTVBSQkxLX0ZMIHxcCisJCQkgICBFWFQyX05PQ09NUF9GTCB8IEVYVDJfSk9VUk5BTF9EQVRBX0ZMIHxcCisJCQkgICBFWFQyX05PVEFJTF9GTCB8IEVYVDJfRElSU1lOQ19GTCkKKworLyogRmxhZ3MgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIHJlZ3VsYXIgZmlsZXMgKGFsbCBidXQgZGlyLXNwZWNpZmljIG9uZXMpLiAqLworI2RlZmluZSBFWFQyX1JFR19GTE1BU0sgKH4oRVhUMl9ESVJTWU5DX0ZMIHwgRVhUMl9UT1BESVJfRkwpKQorCisvKiBGbGFncyB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3Igbm9uLWRpcmVjdG9yaWVzL3JlZ3VsYXIgZmlsZXMuICovCisjZGVmaW5lIEVYVDJfT1RIRVJfRkxNQVNLIChFWFQyX05PRFVNUF9GTCB8IEVYVDJfTk9BVElNRV9GTCkKKworLyogTWFzayBvdXQgZmxhZ3MgdGhhdCBhcmUgaW5hcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIHR5cGUgb2YgaW5vZGUuICovCitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBleHQyX21hc2tfZmxhZ3ModW1vZGVfdCBtb2RlLCBfX3UzMiBmbGFncykKK3sKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcmV0dXJuIGZsYWdzOworCWVsc2UgaWYgKFNfSVNSRUcobW9kZSkpCisJCXJldHVybiBmbGFncyAmIEVYVDJfUkVHX0ZMTUFTSzsKKwllbHNlCisJCXJldHVybiBmbGFncyAmIEVYVDJfT1RIRVJfRkxNQVNLOworfQorCisvKgorICogaW9jdGwgY29tbWFuZHMKKyAqLworI2RlZmluZQlFWFQyX0lPQ19HRVRGTEFHUwkJRlNfSU9DX0dFVEZMQUdTCisjZGVmaW5lCUVYVDJfSU9DX1NFVEZMQUdTCQlGU19JT0NfU0VURkxBR1MKKyNkZWZpbmUJRVhUMl9JT0NfR0VUVkVSU0lPTgkJRlNfSU9DX0dFVFZFUlNJT04KKyNkZWZpbmUJRVhUMl9JT0NfU0VUVkVSU0lPTgkJRlNfSU9DX1NFVFZFUlNJT04KKyNkZWZpbmUJRVhUMl9JT0NfR0VUUlNWU1oJCV9JT1IoJ2YnLCA1LCBsb25nKQorI2RlZmluZQlFWFQyX0lPQ19TRVRSU1ZTWgkJX0lPVygnZicsIDYsIGxvbmcpCisKKy8qCisgKiBpb2N0bCBjb21tYW5kcyBpbiAzMiBiaXQgZW11bGF0aW9uCisgKi8KKyNkZWZpbmUgRVhUMl9JT0MzMl9HRVRGTEFHUwkJRlNfSU9DMzJfR0VURkxBR1MKKyNkZWZpbmUgRVhUMl9JT0MzMl9TRVRGTEFHUwkJRlNfSU9DMzJfU0VURkxBR1MKKyNkZWZpbmUgRVhUMl9JT0MzMl9HRVRWRVJTSU9OCQlGU19JT0MzMl9HRVRWRVJTSU9OCisjZGVmaW5lIEVYVDJfSU9DMzJfU0VUVkVSU0lPTgkJRlNfSU9DMzJfU0VUVkVSU0lPTgorCisvKgorICogU3RydWN0dXJlIG9mIGFuIGlub2RlIG9uIHRoZSBkaXNrCisgKi8KK3N0cnVjdCBleHQyX2lub2RlIHsKKwlfX2xlMTYJaV9tb2RlOwkJLyogRmlsZSBtb2RlICovCisJX19sZTE2CWlfdWlkOwkJLyogTG93IDE2IGJpdHMgb2YgT3duZXIgVWlkICovCisJX19sZTMyCWlfc2l6ZTsJCS8qIFNpemUgaW4gYnl0ZXMgKi8KKwlfX2xlMzIJaV9hdGltZTsJLyogQWNjZXNzIHRpbWUgKi8KKwlfX2xlMzIJaV9jdGltZTsJLyogQ3JlYXRpb24gdGltZSAqLworCV9fbGUzMglpX210aW1lOwkvKiBNb2RpZmljYXRpb24gdGltZSAqLworCV9fbGUzMglpX2R0aW1lOwkvKiBEZWxldGlvbiBUaW1lICovCisJX19sZTE2CWlfZ2lkOwkJLyogTG93IDE2IGJpdHMgb2YgR3JvdXAgSWQgKi8KKwlfX2xlMTYJaV9saW5rc19jb3VudDsJLyogTGlua3MgY291bnQgKi8KKwlfX2xlMzIJaV9ibG9ja3M7CS8qIEJsb2NrcyBjb3VudCAqLworCV9fbGUzMglpX2ZsYWdzOwkvKiBGaWxlIGZsYWdzICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19sZTMyICBsX2lfcmVzZXJ2ZWQxOworCQl9IGxpbnV4MTsKKwkJc3RydWN0IHsKKwkJCV9fbGUzMiAgaF9pX3RyYW5zbGF0b3I7CisJCX0gaHVyZDE7CisJCXN0cnVjdCB7CisJCQlfX2xlMzIgIG1faV9yZXNlcnZlZDE7CisJCX0gbWFzaXgxOworCX0gb3NkMTsJCQkJLyogT1MgZGVwZW5kZW50IDEgKi8KKwlfX2xlMzIJaV9ibG9ja1tFWFQyX05fQkxPQ0tTXTsvKiBQb2ludGVycyB0byBibG9ja3MgKi8KKwlfX2xlMzIJaV9nZW5lcmF0aW9uOwkvKiBGaWxlIHZlcnNpb24gKGZvciBORlMpICovCisJX19sZTMyCWlfZmlsZV9hY2w7CS8qIEZpbGUgQUNMICovCisJX19sZTMyCWlfZGlyX2FjbDsJLyogRGlyZWN0b3J5IEFDTCAqLworCV9fbGUzMglpX2ZhZGRyOwkvKiBGcmFnbWVudCBhZGRyZXNzICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191OAlsX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQlfX3U4CWxfaV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJX191MTYJaV9wYWQxOworCQkJX19sZTE2CWxfaV91aWRfaGlnaDsJLyogdGhlc2UgMiBmaWVsZHMgICAgKi8KKwkJCV9fbGUxNglsX2lfZ2lkX2hpZ2g7CS8qIHdlcmUgcmVzZXJ2ZWQyWzBdICovCisJCQlfX3UzMglsX2lfcmVzZXJ2ZWQyOworCQl9IGxpbnV4MjsKKwkJc3RydWN0IHsKKwkJCV9fdTgJaF9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJX191OAloX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCV9fbGUxNgloX2lfbW9kZV9oaWdoOworCQkJX19sZTE2CWhfaV91aWRfaGlnaDsKKwkJCV9fbGUxNgloX2lfZ2lkX2hpZ2g7CisJCQlfX2xlMzIJaF9pX2F1dGhvcjsKKwkJfSBodXJkMjsKKwkJc3RydWN0IHsKKwkJCV9fdTgJbV9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJX191OAltX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCV9fdTE2CW1fcGFkMTsKKwkJCV9fdTMyCW1faV9yZXNlcnZlZDJbMl07CisJCX0gbWFzaXgyOworCX0gb3NkMjsJCQkJLyogT1MgZGVwZW5kZW50IDIgKi8KK307CisKKyNkZWZpbmUgaV9zaXplX2hpZ2gJaV9kaXJfYWNsCisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IGRlZmluZWQoX19saW51eF9fKQorI2RlZmluZSBpX3Jlc2VydmVkMQlvc2QxLmxpbnV4MS5sX2lfcmVzZXJ2ZWQxCisjZGVmaW5lIGlfZnJhZwkJb3NkMi5saW51eDIubF9pX2ZyYWcKKyNkZWZpbmUgaV9mc2l6ZQkJb3NkMi5saW51eDIubF9pX2ZzaXplCisjZGVmaW5lIGlfdWlkX2xvdwlpX3VpZAorI2RlZmluZSBpX2dpZF9sb3cJaV9naWQKKyNkZWZpbmUgaV91aWRfaGlnaAlvc2QyLmxpbnV4Mi5sX2lfdWlkX2hpZ2gKKyNkZWZpbmUgaV9naWRfaGlnaAlvc2QyLmxpbnV4Mi5sX2lfZ2lkX2hpZ2gKKyNkZWZpbmUgaV9yZXNlcnZlZDIJb3NkMi5saW51eDIubF9pX3Jlc2VydmVkMgorI2VuZGlmCisKKyNpZmRlZglfX2h1cmRfXworI2RlZmluZSBpX3RyYW5zbGF0b3IJb3NkMS5odXJkMS5oX2lfdHJhbnNsYXRvcgorI2RlZmluZSBpX2ZyYWcJCW9zZDIuaHVyZDIuaF9pX2ZyYWcKKyNkZWZpbmUgaV9mc2l6ZQkJb3NkMi5odXJkMi5oX2lfZnNpemUKKyNkZWZpbmUgaV91aWRfaGlnaAlvc2QyLmh1cmQyLmhfaV91aWRfaGlnaAorI2RlZmluZSBpX2dpZF9oaWdoCW9zZDIuaHVyZDIuaF9pX2dpZF9oaWdoCisjZGVmaW5lIGlfYXV0aG9yCW9zZDIuaHVyZDIuaF9pX2F1dGhvcgorI2VuZGlmCisKKyNpZmRlZglfX21hc2l4X18KKyNkZWZpbmUgaV9yZXNlcnZlZDEJb3NkMS5tYXNpeDEubV9pX3Jlc2VydmVkMQorI2RlZmluZSBpX2ZyYWcJCW9zZDIubWFzaXgyLm1faV9mcmFnCisjZGVmaW5lIGlfZnNpemUJCW9zZDIubWFzaXgyLm1faV9mc2l6ZQorI2RlZmluZSBpX3Jlc2VydmVkMglvc2QyLm1hc2l4Mi5tX2lfcmVzZXJ2ZWQyCisjZW5kaWYKKworLyoKKyAqIEZpbGUgc3lzdGVtIHN0YXRlcworICovCisjZGVmaW5lCUVYVDJfVkFMSURfRlMJCQkweDAwMDEJLyogVW5tb3VudGVkIGNsZWFubHkgKi8KKyNkZWZpbmUJRVhUMl9FUlJPUl9GUwkJCTB4MDAwMgkvKiBFcnJvcnMgZGV0ZWN0ZWQgKi8KKworLyoKKyAqIE1vdW50IGZsYWdzCisgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9DSEVDSwkJMHgwMDAwMDEgIC8qIERvIG1vdW50LXRpbWUgY2hlY2tzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfT0xEQUxMT0MJCTB4MDAwMDAyICAvKiBEb24ndCB1c2UgdGhlIG5ldyBPcmxvdiBhbGxvY2F0b3IgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9HUlBJRAkJMHgwMDAwMDQgIC8qIENyZWF0ZSBmaWxlcyB3aXRoIGRpcmVjdG9yeSdzIGdyb3VwICovCisjZGVmaW5lIEVYVDJfTU9VTlRfREVCVUcJCTB4MDAwMDA4ICAvKiBTb21lIGRlYnVnZ2luZyBtZXNzYWdlcyAqLworI2RlZmluZSBFWFQyX01PVU5UX0VSUk9SU19DT05UCQkweDAwMDAxMCAgLyogQ29udGludWUgb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfRVJST1JTX1JPCQkweDAwMDAyMCAgLyogUmVtb3VudCBmcyBybyBvbiBlcnJvcnMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9FUlJPUlNfUEFOSUMJCTB4MDAwMDQwICAvKiBQYW5pYyBvbiBlcnJvcnMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9NSU5JWF9ERgkJMHgwMDAwODAgIC8qIE1pbWljcyB0aGUgTWluaXggc3RhdGZzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfTk9CSAkJCTB4MDAwMTAwICAvKiBObyBidWZmZXJfaGVhZHMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9OT19VSUQzMgkJMHgwMDAyMDAgIC8qIERpc2FibGUgMzItYml0IFVJRHMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9YQVRUUl9VU0VSCQkweDAwNDAwMCAgLyogRXh0ZW5kZWQgdXNlciBhdHRyaWJ1dGVzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfUE9TSVhfQUNMCQkweDAwODAwMCAgLyogUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9YSVAJCQkweDAxMDAwMCAgLyogRXhlY3V0ZSBpbiBwbGFjZSAqLworI2RlZmluZSBFWFQyX01PVU5UX1VTUlFVT1RBCQkweDAyMDAwMCAgLyogdXNlciBxdW90YSAqLworI2RlZmluZSBFWFQyX01PVU5UX0dSUFFVT1RBCQkweDA0MDAwMCAgLyogZ3JvdXAgcXVvdGEgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9SRVNFUlZBVElPTgkJMHgwODAwMDAgIC8qIFByZWFsbG9jYXRpb24gKi8KKworCisjZGVmaW5lIGNsZWFyX29wdChvLCBvcHQpCQlvICY9IH5FWFQyX01PVU5UXyMjb3B0CisjZGVmaW5lIHNldF9vcHQobywgb3B0KQkJCW8gfD0gRVhUMl9NT1VOVF8jI29wdAorI2RlZmluZSB0ZXN0X29wdChzYiwgb3B0KQkJKEVYVDJfU0Ioc2IpLT5zX21vdW50X29wdCAmIFwKKwkJCQkJIEVYVDJfTU9VTlRfIyNvcHQpCisvKgorICogTWF4aW1hbCBtb3VudCBjb3VudHMgYmV0d2VlbiB0d28gZmlsZXN5c3RlbSBjaGVja3MKKyAqLworI2RlZmluZSBFWFQyX0RGTF9NQVhfTU5UX0NPVU5UCQkyMAkvKiBBbGxvdyAyMCBtb3VudHMgKi8KKyNkZWZpbmUgRVhUMl9ERkxfQ0hFQ0tJTlRFUlZBTAkJMAkvKiBEb24ndCB1c2UgaW50ZXJ2YWwgY2hlY2sgKi8KKworLyoKKyAqIEJlaGF2aW91ciB3aGVuIGRldGVjdGluZyBlcnJvcnMKKyAqLworI2RlZmluZSBFWFQyX0VSUk9SU19DT05USU5VRQkJMQkvKiBDb250aW51ZSBleGVjdXRpb24gKi8KKyNkZWZpbmUgRVhUMl9FUlJPUlNfUk8JCQkyCS8qIFJlbW91bnQgZnMgcmVhZC1vbmx5ICovCisjZGVmaW5lIEVYVDJfRVJST1JTX1BBTklDCQkzCS8qIFBhbmljICovCisjZGVmaW5lIEVYVDJfRVJST1JTX0RFRkFVTFQJCUVYVDJfRVJST1JTX0NPTlRJTlVFCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgdGhlIHN1cGVyIGJsb2NrCisgKi8KK3N0cnVjdCBleHQyX3N1cGVyX2Jsb2NrIHsKKwlfX2xlMzIJc19pbm9kZXNfY291bnQ7CQkvKiBJbm9kZXMgY291bnQgKi8KKwlfX2xlMzIJc19ibG9ja3NfY291bnQ7CQkvKiBCbG9ja3MgY291bnQgKi8KKwlfX2xlMzIJc19yX2Jsb2Nrc19jb3VudDsJLyogUmVzZXJ2ZWQgYmxvY2tzIGNvdW50ICovCisJX19sZTMyCXNfZnJlZV9ibG9ja3NfY291bnQ7CS8qIEZyZWUgYmxvY2tzIGNvdW50ICovCisJX19sZTMyCXNfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisJX19sZTMyCXNfZmlyc3RfZGF0YV9ibG9jazsJLyogRmlyc3QgRGF0YSBCbG9jayAqLworCV9fbGUzMglzX2xvZ19ibG9ja19zaXplOwkvKiBCbG9jayBzaXplICovCisJX19sZTMyCXNfbG9nX2ZyYWdfc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCV9fbGUzMglzX2Jsb2Nrc19wZXJfZ3JvdXA7CS8qICMgQmxvY2tzIHBlciBncm91cCAqLworCV9fbGUzMglzX2ZyYWdzX3Blcl9ncm91cDsJLyogIyBGcmFnbWVudHMgcGVyIGdyb3VwICovCisJX19sZTMyCXNfaW5vZGVzX3Blcl9ncm91cDsJLyogIyBJbm9kZXMgcGVyIGdyb3VwICovCisJX19sZTMyCXNfbXRpbWU7CQkvKiBNb3VudCB0aW1lICovCisJX19sZTMyCXNfd3RpbWU7CQkvKiBXcml0ZSB0aW1lICovCisJX19sZTE2CXNfbW50X2NvdW50OwkJLyogTW91bnQgY291bnQgKi8KKwlfX2xlMTYJc19tYXhfbW50X2NvdW50OwkvKiBNYXhpbWFsIG1vdW50IGNvdW50ICovCisJX19sZTE2CXNfbWFnaWM7CQkvKiBNYWdpYyBzaWduYXR1cmUgKi8KKwlfX2xlMTYJc19zdGF0ZTsJCS8qIEZpbGUgc3lzdGVtIHN0YXRlICovCisJX19sZTE2CXNfZXJyb3JzOwkJLyogQmVoYXZpb3VyIHdoZW4gZGV0ZWN0aW5nIGVycm9ycyAqLworCV9fbGUxNglzX21pbm9yX3Jldl9sZXZlbDsgCS8qIG1pbm9yIHJldmlzaW9uIGxldmVsICovCisJX19sZTMyCXNfbGFzdGNoZWNrOwkJLyogdGltZSBvZiBsYXN0IGNoZWNrICovCisJX19sZTMyCXNfY2hlY2tpbnRlcnZhbDsJLyogbWF4LiB0aW1lIGJldHdlZW4gY2hlY2tzICovCisJX19sZTMyCXNfY3JlYXRvcl9vczsJCS8qIE9TICovCisJX19sZTMyCXNfcmV2X2xldmVsOwkJLyogUmV2aXNpb24gbGV2ZWwgKi8KKwlfX2xlMTYJc19kZWZfcmVzdWlkOwkJLyogRGVmYXVsdCB1aWQgZm9yIHJlc2VydmVkIGJsb2NrcyAqLworCV9fbGUxNglzX2RlZl9yZXNnaWQ7CQkvKiBEZWZhdWx0IGdpZCBmb3IgcmVzZXJ2ZWQgYmxvY2tzICovCisJLyoKKwkgKiBUaGVzZSBmaWVsZHMgYXJlIGZvciBFWFQyX0RZTkFNSUNfUkVWIHN1cGVyYmxvY2tzIG9ubHkuCisJICoKKwkgKiBOb3RlOiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjb21wYXRpYmxlIGZlYXR1cmUgc2V0IGFuZAorCSAqIHRoZSBpbmNvbXBhdGlibGUgZmVhdHVyZSBzZXQgaXMgdGhhdCBpZiB0aGVyZSBpcyBhIGJpdCBzZXQKKwkgKiBpbiB0aGUgaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0IHRoYXQgdGhlIGtlcm5lbCBkb2Vzbid0CisJICoga25vdyBhYm91dCwgaXQgc2hvdWxkIHJlZnVzZSB0byBtb3VudCB0aGUgZmlsZXN5c3RlbS4KKwkgKiAKKwkgKiBlMmZzY2sncyByZXF1aXJlbWVudHMgYXJlIG1vcmUgc3RyaWN0OyBpZiBpdCBkb2Vzbid0IGtub3cKKwkgKiBhYm91dCBhIGZlYXR1cmUgaW4gZWl0aGVyIHRoZSBjb21wYXRpYmxlIG9yIGluY29tcGF0aWJsZQorCSAqIGZlYXR1cmUgc2V0LCBpdCBtdXN0IGFib3J0IGFuZCBub3QgdHJ5IHRvIG1lZGRsZSB3aXRoCisJICogdGhpbmdzIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZC4uLgorCSAqLworCV9fbGUzMglzX2ZpcnN0X2lubzsgCQkvKiBGaXJzdCBub24tcmVzZXJ2ZWQgaW5vZGUgKi8KKwlfX2xlMTYgICBzX2lub2RlX3NpemU7IAkJLyogc2l6ZSBvZiBpbm9kZSBzdHJ1Y3R1cmUgKi8KKwlfX2xlMTYJc19ibG9ja19ncm91cF9ucjsgCS8qIGJsb2NrIGdyb3VwICMgb2YgdGhpcyBzdXBlcmJsb2NrICovCisJX19sZTMyCXNfZmVhdHVyZV9jb21wYXQ7IAkvKiBjb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJX19sZTMyCXNfZmVhdHVyZV9pbmNvbXBhdDsgCS8qIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fbGUzMglzX2ZlYXR1cmVfcm9fY29tcGF0OyAJLyogcmVhZG9ubHktY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fdTgJc191dWlkWzE2XTsJCS8qIDEyOC1iaXQgdXVpZCBmb3Igdm9sdW1lICovCisJY2hhcglzX3ZvbHVtZV9uYW1lWzE2XTsgCS8qIHZvbHVtZSBuYW1lICovCisJY2hhcglzX2xhc3RfbW91bnRlZFs2NF07IAkvKiBkaXJlY3Rvcnkgd2hlcmUgbGFzdCBtb3VudGVkICovCisJX19sZTMyCXNfYWxnb3JpdGhtX3VzYWdlX2JpdG1hcDsgLyogRm9yIGNvbXByZXNzaW9uICovCisJLyoKKwkgKiBQZXJmb3JtYW5jZSBoaW50cy4gIERpcmVjdG9yeSBwcmVhbGxvY2F0aW9uIHNob3VsZCBvbmx5CisJICogaGFwcGVuIGlmIHRoZSBFWFQyX0NPTVBBVF9QUkVBTExPQyBmbGFnIGlzIG9uLgorCSAqLworCV9fdTgJc19wcmVhbGxvY19ibG9ja3M7CS8qIE5yIG9mIGJsb2NrcyB0byB0cnkgdG8gcHJlYWxsb2NhdGUqLworCV9fdTgJc19wcmVhbGxvY19kaXJfYmxvY2tzOwkvKiBOciB0byBwcmVhbGxvY2F0ZSBmb3IgZGlycyAqLworCV9fdTE2CXNfcGFkZGluZzE7CisJLyoKKwkgKiBKb3VybmFsaW5nIHN1cHBvcnQgdmFsaWQgaWYgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCBzZXQuCisJICovCisJX191OAlzX2pvdXJuYWxfdXVpZFsxNl07CS8qIHV1aWQgb2Ygam91cm5hbCBzdXBlcmJsb2NrICovCisJX191MzIJc19qb3VybmFsX2ludW07CQkvKiBpbm9kZSBudW1iZXIgb2Ygam91cm5hbCBmaWxlICovCisJX191MzIJc19qb3VybmFsX2RldjsJCS8qIGRldmljZSBudW1iZXIgb2Ygam91cm5hbCBmaWxlICovCisJX191MzIJc19sYXN0X29ycGhhbjsJCS8qIHN0YXJ0IG9mIGxpc3Qgb2YgaW5vZGVzIHRvIGRlbGV0ZSAqLworCV9fdTMyCXNfaGFzaF9zZWVkWzRdOwkJLyogSFRSRUUgaGFzaCBzZWVkICovCisJX191OAlzX2RlZl9oYXNoX3ZlcnNpb247CS8qIERlZmF1bHQgaGFzaCB2ZXJzaW9uIHRvIHVzZSAqLworCV9fdTgJc19yZXNlcnZlZF9jaGFyX3BhZDsKKwlfX3UxNglzX3Jlc2VydmVkX3dvcmRfcGFkOworCV9fbGUzMglzX2RlZmF1bHRfbW91bnRfb3B0czsKKyAJX19sZTMyCXNfZmlyc3RfbWV0YV9iZzsgCS8qIEZpcnN0IG1ldGFibG9jayBibG9jayBncm91cCAqLworCV9fdTMyCXNfcmVzZXJ2ZWRbMTkwXTsJLyogUGFkZGluZyB0byB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworfTsKKworLyoKKyAqIENvZGVzIGZvciBvcGVyYXRpbmcgc3lzdGVtcworICovCisjZGVmaW5lIEVYVDJfT1NfTElOVVgJCTAKKyNkZWZpbmUgRVhUMl9PU19IVVJECQkxCisjZGVmaW5lIEVYVDJfT1NfTUFTSVgJCTIKKyNkZWZpbmUgRVhUMl9PU19GUkVFQlNECQkzCisjZGVmaW5lIEVYVDJfT1NfTElURVMJCTQKKworLyoKKyAqIFJldmlzaW9uIGxldmVscworICovCisjZGVmaW5lIEVYVDJfR09PRF9PTERfUkVWCTAJLyogVGhlIGdvb2Qgb2xkIChvcmlnaW5hbCkgZm9ybWF0ICovCisjZGVmaW5lIEVYVDJfRFlOQU1JQ19SRVYJMSAJLyogVjIgZm9ybWF0IHcvIGR5bmFtaWMgaW5vZGUgc2l6ZXMgKi8KKworI2RlZmluZSBFWFQyX0NVUlJFTlRfUkVWCUVYVDJfR09PRF9PTERfUkVWCisjZGVmaW5lIEVYVDJfTUFYX1NVUFBfUkVWCUVYVDJfRFlOQU1JQ19SRVYKKworI2RlZmluZSBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUgMTI4CisKKy8qCisgKiBGZWF0dXJlIHNldCBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgRVhUMl9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJKCBFWFQyX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCAmIGNwdV90b19sZTMyKG1hc2spICkKKyNkZWZpbmUgRVhUMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJKCBFWFQyX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX3JvX2NvbXBhdCAmIGNwdV90b19sZTMyKG1hc2spICkKKyNkZWZpbmUgRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwkoIEVYVDJfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSApCisjZGVmaW5lIEVYVDJfU0VUX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCUVYVDJfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfY29tcGF0IHw9IGNwdV90b19sZTMyKG1hc2spCisjZGVmaW5lIEVYVDJfU0VUX1JPX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCUVYVDJfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfcm9fY29tcGF0IHw9IGNwdV90b19sZTMyKG1hc2spCisjZGVmaW5lIEVYVDJfU0VUX0lOQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJRVhUMl9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9pbmNvbXBhdCB8PSBjcHVfdG9fbGUzMihtYXNrKQorI2RlZmluZSBFWFQyX0NMRUFSX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCUVYVDJfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfY29tcGF0ICY9IH5jcHVfdG9fbGUzMihtYXNrKQorI2RlZmluZSBFWFQyX0NMRUFSX1JPX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCUVYVDJfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICY9IH5jcHVfdG9fbGUzMihtYXNrKQorI2RlZmluZSBFWFQyX0NMRUFSX0lOQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJRVhUMl9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9pbmNvbXBhdCAmPSB+Y3B1X3RvX2xlMzIobWFzaykKKworI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9QUkVBTExPQwkweDAwMDEKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9JTUFHSUNfSU5PREVTCTB4MDAwMgorI2RlZmluZSBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMCQkweDAwMDQKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUgkJMHgwMDA4CisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfUkVTSVpFX0lOTwkJMHgwMDEwCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYCQkweDAwMjAKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9BTlkJCQkweGZmZmZmZmZmCisKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIJMHgwMDAxCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRQkweDAwMDIKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9CVFJFRV9ESVIJMHgwMDA0CisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfQU5ZCQkweGZmZmZmZmZmCisKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0NPTVBSRVNTSU9OCTB4MDAwMQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUJCTB4MDAwMgorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUgkJMHgwMDA0CisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVgkweDAwMDgKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcJCTB4MDAxMAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfQU5ZCQkweGZmZmZmZmZmCisKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9TVVBQCUVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX1NVUFAJKEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRXwgXAorCQkJCQkgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1VQUAkoRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVJ8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRXwgXAorCQkJCQkgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9CVFJFRV9ESVIpCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfVU5TVVBQT1JURUQJfkVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1VQUAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfVU5TVVBQT1JURUQJfkVYVDJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCisKKy8qCisgKiBEZWZhdWx0IHZhbHVlcyBmb3IgdXNlciBhbmQvb3IgZ3JvdXAgdXNpbmcgcmVzZXJ2ZWQgYmxvY2tzCisgKi8KKyNkZWZpbmUJRVhUMl9ERUZfUkVTVUlECQkwCisjZGVmaW5lCUVYVDJfREVGX1JFU0dJRAkJMAorCisvKgorICogRGVmYXVsdCBtb3VudCBvcHRpb25zCisgKi8KKyNkZWZpbmUgRVhUMl9ERUZNX0RFQlVHCQkweDAwMDEKKyNkZWZpbmUgRVhUMl9ERUZNX0JTREdST1VQUwkweDAwMDIKKyNkZWZpbmUgRVhUMl9ERUZNX1hBVFRSX1VTRVIJMHgwMDA0CisjZGVmaW5lIEVYVDJfREVGTV9BQ0wJCTB4MDAwOAorI2RlZmluZSBFWFQyX0RFRk1fVUlEMTYJCTB4MDAxMAorICAgIC8qIE5vdCB1c2VkIGJ5IGV4dDIsIGJ1dCByZXNlcnZlZCBmb3IgdXNlIGJ5IGV4dDMgKi8KKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFCQkweDAwNjAgCisjZGVmaW5lIEVYVDNfREVGTV9KTU9ERV9EQVRBCTB4MDAyMAorI2RlZmluZSBFWFQzX0RFRk1fSk1PREVfT1JERVJFRAkweDAwNDAKKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFX1dCQUNLCTB4MDA2MAorCisvKgorICogU3RydWN0dXJlIG9mIGEgZGlyZWN0b3J5IGVudHJ5CisgKi8KKyNkZWZpbmUgRVhUMl9OQU1FX0xFTiAyNTUKKworc3RydWN0IGV4dDJfZGlyX2VudHJ5IHsKKwlfX2xlMzIJaW5vZGU7CQkJLyogSW5vZGUgbnVtYmVyICovCisJX19sZTE2CXJlY19sZW47CQkvKiBEaXJlY3RvcnkgZW50cnkgbGVuZ3RoICovCisJX19sZTE2CW5hbWVfbGVuOwkJLyogTmFtZSBsZW5ndGggKi8KKwljaGFyCW5hbWVbRVhUMl9OQU1FX0xFTl07CS8qIEZpbGUgbmFtZSAqLworfTsKKworLyoKKyAqIFRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5LiAgU2luY2UgRVhUMiBzdHJ1Y3R1cmVzIGFyZQorICogc3RvcmVkIGluIGludGVsIGJ5dGUgb3JkZXIsIGFuZCB0aGUgbmFtZV9sZW4gZmllbGQgY291bGQgbmV2ZXIgYmUKKyAqIGJpZ2dlciB0aGFuIDI1NSBjaGFycywgaXQncyBzYWZlIHRvIHJlY2xhaW0gdGhlIGV4dHJhIGJ5dGUgZm9yIHRoZQorICogZmlsZV90eXBlIGZpZWxkLgorICovCitzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiB7CisJX19sZTMyCWlub2RlOwkJCS8qIElub2RlIG51bWJlciAqLworCV9fbGUxNglyZWNfbGVuOwkJLyogRGlyZWN0b3J5IGVudHJ5IGxlbmd0aCAqLworCV9fdTgJbmFtZV9sZW47CQkvKiBOYW1lIGxlbmd0aCAqLworCV9fdTgJZmlsZV90eXBlOworCWNoYXIJbmFtZVtFWFQyX05BTUVfTEVOXTsJLyogRmlsZSBuYW1lICovCit9OworCisvKgorICogRXh0MiBkaXJlY3RvcnkgZmlsZSB0eXBlcy4gIE9ubHkgdGhlIGxvdyAzIGJpdHMgYXJlIHVzZWQuICBUaGUKKyAqIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBub3cuCisgKi8KK2VudW0geworCUVYVDJfRlRfVU5LTk9XTgkJPSAwLAorCUVYVDJfRlRfUkVHX0ZJTEUJPSAxLAorCUVYVDJfRlRfRElSCQk9IDIsCisJRVhUMl9GVF9DSFJERVYJCT0gMywKKwlFWFQyX0ZUX0JMS0RFVgkJPSA0LAorCUVYVDJfRlRfRklGTwkJPSA1LAorCUVYVDJfRlRfU09DSwkJPSA2LAorCUVYVDJfRlRfU1lNTElOSwkJPSA3LAorCUVYVDJfRlRfTUFYCit9OworCisvKgorICogRVhUMl9ESVJfUEFEIGRlZmluZXMgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIGJvdW5kYXJpZXMKKyAqCisgKiBOT1RFOiBJdCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNAorICovCisjZGVmaW5lIEVYVDJfRElSX1BBRAkJIAk0CisjZGVmaW5lIEVYVDJfRElSX1JPVU5EIAkJCShFWFQyX0RJUl9QQUQgLSAxKQorI2RlZmluZSBFWFQyX0RJUl9SRUNfTEVOKG5hbWVfbGVuKQkoKChuYW1lX2xlbikgKyA4ICsgRVhUMl9ESVJfUk9VTkQpICYgXAorCQkJCQkgfkVYVDJfRElSX1JPVU5EKQorI2RlZmluZSBFWFQyX01BWF9SRUNfTEVOCQkoKDE8PDE2KS0xKQorCisjZW5kaWYJLyogX0xJTlVYX0VYVDJfRlNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mYWR2aXNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZhZHZpc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGU3NDcxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mYWR2aXNlLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBGQURWSVNFX0hfSU5DTFVERUQKKyNkZWZpbmUgRkFEVklTRV9IX0lOQ0xVREVECisKKyNkZWZpbmUgUE9TSVhfRkFEVl9OT1JNQUwJMCAvKiBObyBmdXJ0aGVyIHNwZWNpYWwgdHJlYXRtZW50LiAgKi8KKyNkZWZpbmUgUE9TSVhfRkFEVl9SQU5ET00JMSAvKiBFeHBlY3QgcmFuZG9tIHBhZ2UgcmVmZXJlbmNlcy4gICovCisjZGVmaW5lIFBPU0lYX0ZBRFZfU0VRVUVOVElBTAkyIC8qIEV4cGVjdCBzZXF1ZW50aWFsIHBhZ2UgcmVmZXJlbmNlcy4gICovCisjZGVmaW5lIFBPU0lYX0ZBRFZfV0lMTE5FRUQJMyAvKiBXaWxsIG5lZWQgdGhlc2UgcGFnZXMuICAqLworCisvKgorICogVGhlIGFkdmlzZSB2YWx1ZXMgZm9yIFBPU0lYX0ZBRFZfRE9OVE5FRUQgYW5kIFBPU0lYX0FEVl9OT1JFVVNFCisgKiBmb3IgczM5MC02NCBkaWZmZXIgZnJvbSB0aGUgdmFsdWVzIGZvciB0aGUgcmVzdCBvZiB0aGUgd29ybGQuCisgKi8KKyNpZiBkZWZpbmVkKF9fczM5MHhfXykKKyNkZWZpbmUgUE9TSVhfRkFEVl9ET05UTkVFRAk2IC8qIERvbid0IG5lZWQgdGhlc2UgcGFnZXMuICAqLworI2RlZmluZSBQT1NJWF9GQURWX05PUkVVU0UJNyAvKiBEYXRhIHdpbGwgYmUgYWNjZXNzZWQgb25jZS4gICovCisjZWxzZQorI2RlZmluZSBQT1NJWF9GQURWX0RPTlRORUVECTQgLyogRG9uJ3QgbmVlZCB0aGVzZSBwYWdlcy4gICovCisjZGVmaW5lIFBPU0lYX0ZBRFZfTk9SRVVTRQk1IC8qIERhdGEgd2lsbCBiZSBhY2Nlc3NlZCBvbmNlLiAgKi8KKyNlbmRpZgorCisjZW5kaWYJLyogRkFEVklTRV9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZhbGxvYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWJiNGI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mYWxsb2MuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX0ZBTExPQ19IXworI2RlZmluZSBfRkFMTE9DX0hfCisKKyNkZWZpbmUgRkFMTE9DX0ZMX0tFRVBfU0laRQkweDAxIC8qIGRlZmF1bHQgaXMgZXh0ZW5kIHNpemUgKi8KKyNkZWZpbmUgRkFMTE9DX0ZMX1BVTkNIX0hPTEUJMHgwMiAvKiBkZS1hbGxvY2F0ZXMgcmFuZ2UgKi8KKworCisjZW5kaWYgLyogX0ZBTExPQ19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mYW5vdGlmeS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mYW5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ODBlNWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Zhbm90aWZ5LmgKQEAgLTAsMCArMSwxMTYgQEAKKyNpZm5kZWYgX0xJTlVYX0ZBTk9USUZZX0gKKyNkZWZpbmUgX0xJTlVYX0ZBTk9USUZZX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIHRoZSBmb2xsb3dpbmcgZXZlbnRzIHRoYXQgdXNlci1zcGFjZSBjYW4gcmVnaXN0ZXIgZm9yICovCisjZGVmaW5lIEZBTl9BQ0NFU1MJCTB4MDAwMDAwMDEJLyogRmlsZSB3YXMgYWNjZXNzZWQgKi8KKyNkZWZpbmUgRkFOX01PRElGWQkJMHgwMDAwMDAwMgkvKiBGaWxlIHdhcyBtb2RpZmllZCAqLworI2RlZmluZSBGQU5fQ0xPU0VfV1JJVEUJCTB4MDAwMDAwMDgJLyogV3JpdHRhYmxlIGZpbGUgY2xvc2VkICovCisjZGVmaW5lIEZBTl9DTE9TRV9OT1dSSVRFCTB4MDAwMDAwMTAJLyogVW53cml0dGFibGUgZmlsZSBjbG9zZWQgKi8KKyNkZWZpbmUgRkFOX09QRU4JCTB4MDAwMDAwMjAJLyogRmlsZSB3YXMgb3BlbmVkICovCisKKyNkZWZpbmUgRkFOX1FfT1ZFUkZMT1cJCTB4MDAwMDQwMDAJLyogRXZlbnQgcXVldWVkIG92ZXJmbG93ZWQgKi8KKworI2RlZmluZSBGQU5fT1BFTl9QRVJNCQkweDAwMDEwMDAwCS8qIEZpbGUgb3BlbiBpbiBwZXJtIGNoZWNrICovCisjZGVmaW5lIEZBTl9BQ0NFU1NfUEVSTQkJMHgwMDAyMDAwMAkvKiBGaWxlIGFjY2Vzc2VkIGluIHBlcm0gY2hlY2sgKi8KKworI2RlZmluZSBGQU5fT05ESVIJCTB4NDAwMDAwMDAJLyogZXZlbnQgb2NjdXJyZWQgYWdhaW5zdCBkaXIgKi8KKworI2RlZmluZSBGQU5fRVZFTlRfT05fQ0hJTEQJMHgwODAwMDAwMAkvKiBpbnRlcmVzdGVkIGluIGNoaWxkIGV2ZW50cyAqLworCisvKiBoZWxwZXIgZXZlbnRzICovCisjZGVmaW5lIEZBTl9DTE9TRQkJKEZBTl9DTE9TRV9XUklURSB8IEZBTl9DTE9TRV9OT1dSSVRFKSAvKiBjbG9zZSAqLworCisvKiBmbGFncyB1c2VkIGZvciBmYW5vdGlmeV9pbml0KCkgKi8KKyNkZWZpbmUgRkFOX0NMT0VYRUMJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRkFOX05PTkJMT0NLCQkweDAwMDAwMDAyCisKKy8qIFRoZXNlIGFyZSBOT1QgYml0d2lzZSBmbGFncy4gIEJvdGggYml0cyBhcmUgdXNlZCB0b2d0aGVyLiAgKi8KKyNkZWZpbmUgRkFOX0NMQVNTX05PVElGCQkweDAwMDAwMDAwCisjZGVmaW5lIEZBTl9DTEFTU19DT05URU5UCTB4MDAwMDAwMDQKKyNkZWZpbmUgRkFOX0NMQVNTX1BSRV9DT05URU5UCTB4MDAwMDAwMDgKKyNkZWZpbmUgRkFOX0FMTF9DTEFTU19CSVRTCShGQU5fQ0xBU1NfTk9USUYgfCBGQU5fQ0xBU1NfQ09OVEVOVCB8IFwKKwkJCQkgRkFOX0NMQVNTX1BSRV9DT05URU5UKQorCisjZGVmaW5lIEZBTl9VTkxJTUlURURfUVVFVUUJMHgwMDAwMDAxMAorI2RlZmluZSBGQU5fVU5MSU1JVEVEX01BUktTCTB4MDAwMDAwMjAKKworI2RlZmluZSBGQU5fQUxMX0lOSVRfRkxBR1MJKEZBTl9DTE9FWEVDIHwgRkFOX05PTkJMT0NLIHwgXAorCQkJCSBGQU5fQUxMX0NMQVNTX0JJVFMgfCBGQU5fVU5MSU1JVEVEX1FVRVVFIHxcCisJCQkJIEZBTl9VTkxJTUlURURfTUFSS1MpCisKKy8qIGZsYWdzIHVzZWQgZm9yIGZhbm90aWZ5X21vZGlmeV9tYXJrKCkgKi8KKyNkZWZpbmUgRkFOX01BUktfQURECQkweDAwMDAwMDAxCisjZGVmaW5lIEZBTl9NQVJLX1JFTU9WRQkJMHgwMDAwMDAwMgorI2RlZmluZSBGQU5fTUFSS19ET05UX0ZPTExPVwkweDAwMDAwMDA0CisjZGVmaW5lIEZBTl9NQVJLX09OTFlESVIJMHgwMDAwMDAwOAorI2RlZmluZSBGQU5fTUFSS19NT1VOVAkJMHgwMDAwMDAxMAorI2RlZmluZSBGQU5fTUFSS19JR05PUkVEX01BU0sJMHgwMDAwMDAyMAorI2RlZmluZSBGQU5fTUFSS19JR05PUkVEX1NVUlZfTU9ESUZZCTB4MDAwMDAwNDAKKyNkZWZpbmUgRkFOX01BUktfRkxVU0gJCTB4MDAwMDAwODAKKworI2RlZmluZSBGQU5fQUxMX01BUktfRkxBR1MJKEZBTl9NQVJLX0FERCB8XAorCQkJCSBGQU5fTUFSS19SRU1PVkUgfFwKKwkJCQkgRkFOX01BUktfRE9OVF9GT0xMT1cgfFwKKwkJCQkgRkFOX01BUktfT05MWURJUiB8XAorCQkJCSBGQU5fTUFSS19NT1VOVCB8XAorCQkJCSBGQU5fTUFSS19JR05PUkVEX01BU0sgfFwKKwkJCQkgRkFOX01BUktfSUdOT1JFRF9TVVJWX01PRElGWSB8XAorCQkJCSBGQU5fTUFSS19GTFVTSCkKKworLyoKKyAqIEFsbCBvZiB0aGUgZXZlbnRzIC0gd2UgYnVpbGQgdGhlIGxpc3QgYnkgaGFuZCBzbyB0aGF0IHdlIGNhbiBhZGQgZmxhZ3MgaW4KKyAqIHRoZSBmdXR1cmUgYW5kIG5vdCBicmVhayBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgQXBwcyB3aWxsIGdldCBvbmx5IHRoZQorICogZXZlbnRzIHRoYXQgdGhleSBvcmlnaW5hbGx5IHdhbnRlZC4gIEJlIHN1cmUgdG8gYWRkIG5ldyBldmVudHMgaGVyZSEKKyAqLworI2RlZmluZSBGQU5fQUxMX0VWRU5UUyAoRkFOX0FDQ0VTUyB8XAorCQkJRkFOX01PRElGWSB8XAorCQkJRkFOX0NMT1NFIHxcCisJCQlGQU5fT1BFTikKKworLyoKKyAqIEFsbCBldmVudHMgd2hpY2ggcmVxdWlyZSBhIHBlcm1pc3Npb24gcmVzcG9uc2UgZnJvbSB1c2Vyc3BhY2UKKyAqLworI2RlZmluZSBGQU5fQUxMX1BFUk1fRVZFTlRTIChGQU5fT1BFTl9QRVJNIHxcCisJCQkgICAgIEZBTl9BQ0NFU1NfUEVSTSkKKworI2RlZmluZSBGQU5fQUxMX09VVEdPSU5HX0VWRU5UUwkoRkFOX0FMTF9FVkVOVFMgfFwKKwkJCQkgRkFOX0FMTF9QRVJNX0VWRU5UUyB8XAorCQkJCSBGQU5fUV9PVkVSRkxPVykKKworI2RlZmluZSBGQU5PVElGWV9NRVRBREFUQV9WRVJTSU9OCTMKKworc3RydWN0IGZhbm90aWZ5X2V2ZW50X21ldGFkYXRhIHsKKwlfX3UzMiBldmVudF9sZW47CisJX191OCB2ZXJzOworCV9fdTggcmVzZXJ2ZWQ7CisJX191MTYgbWV0YWRhdGFfbGVuOworCV9fYWxpZ25lZF91NjQgbWFzazsKKwlfX3MzMiBmZDsKKwlfX3MzMiBwaWQ7Cit9OworCitzdHJ1Y3QgZmFub3RpZnlfcmVzcG9uc2UgeworCV9fczMyIGZkOworCV9fdTMyIHJlc3BvbnNlOworfTsKKworLyogTGVnaXQgdXNlcnNwYWNlIHJlc3BvbnNlcyB0byBhIF9QRVJNIGV2ZW50ICovCisjZGVmaW5lIEZBTl9BTExPVwkweDAxCisjZGVmaW5lIEZBTl9ERU5ZCTB4MDIKKy8qIE5vIGZkIHNldCBpbiBldmVudCAqLworI2RlZmluZSBGQU5fTk9GRAktMQorCisvKiBIZWxwZXIgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBmYW5vdGlmeV9ldmVudF9tZXRhZGF0YSBidWZmZXJzICovCisjZGVmaW5lIEZBTl9FVkVOVF9NRVRBREFUQV9MRU4gKHNpemVvZihzdHJ1Y3QgZmFub3RpZnlfZXZlbnRfbWV0YWRhdGEpKQorCisjZGVmaW5lIEZBTl9FVkVOVF9ORVhUKG1ldGEsIGxlbikgKChsZW4pIC09IChtZXRhKS0+ZXZlbnRfbGVuLCBcCisJCQkJICAgKHN0cnVjdCBmYW5vdGlmeV9ldmVudF9tZXRhZGF0YSopKCgoY2hhciAqKShtZXRhKSkgKyBcCisJCQkJICAgKG1ldGEpLT5ldmVudF9sZW4pKQorCisjZGVmaW5lIEZBTl9FVkVOVF9PSyhtZXRhLCBsZW4pCSgobG9uZykobGVuKSA+PSAobG9uZylGQU5fRVZFTlRfTUVUQURBVEFfTEVOICYmIFwKKwkJCQkobG9uZykobWV0YSktPmV2ZW50X2xlbiA+PSAobG9uZylGQU5fRVZFTlRfTUVUQURBVEFfTEVOICYmIFwKKwkJCQkobG9uZykobWV0YSktPmV2ZW50X2xlbiA8PSAobG9uZykobGVuKSkKKworI2VuZGlmIC8qIF9MSU5VWF9GQU5PVElGWV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZiLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxNzdiNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmIuaApAQCAtMCwwICsxLDM5NCBAQAorI2lmbmRlZiBfTElOVVhfRkJfSAorI2RlZmluZSBfTElOVVhfRkJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworLyogRGVmaW5pdGlvbnMgb2YgZnJhbWUgYnVmZmVycwkJCQkJCSovCisKKyNkZWZpbmUgRkJfTUFYCQkJMzIJLyogc3VmZmljaWVudCBmb3Igbm93ICovCisKKy8qIGlvY3RscworICAgMHg0NiBpcyAnRicJCQkJCQkJCSovCisjZGVmaW5lIEZCSU9HRVRfVlNDUkVFTklORk8JMHg0NjAwCisjZGVmaW5lIEZCSU9QVVRfVlNDUkVFTklORk8JMHg0NjAxCisjZGVmaW5lIEZCSU9HRVRfRlNDUkVFTklORk8JMHg0NjAyCisjZGVmaW5lIEZCSU9HRVRDTUFQCQkweDQ2MDQKKyNkZWZpbmUgRkJJT1BVVENNQVAJCTB4NDYwNQorI2RlZmluZSBGQklPUEFOX0RJU1BMQVkJCTB4NDYwNgorI2RlZmluZSBGQklPX0NVUlNPUiAgICAgICAgICAgIF9JT1dSKCdGJywgMHgwOCwgc3RydWN0IGZiX2N1cnNvcikKKy8qIDB4NDYwNy0weDQ2MEIgYXJlIGRlZmluZWQgYmVsb3cgKi8KKy8qICNkZWZpbmUgRkJJT0dFVF9NT05JVE9SU1BFQwkweDQ2MEMgKi8KKy8qICNkZWZpbmUgRkJJT1BVVF9NT05JVE9SU1BFQwkweDQ2MEQgKi8KKy8qICNkZWZpbmUgRkJJT1NXSVRDSF9NT05JQklUCTB4NDYwRSAqLworI2RlZmluZSBGQklPR0VUX0NPTjJGQk1BUAkweDQ2MEYKKyNkZWZpbmUgRkJJT1BVVF9DT04yRkJNQVAJMHg0NjEwCisjZGVmaW5lIEZCSU9CTEFOSwkJMHg0NjExCQkvKiBhcmc6IDAgb3IgdmVzYSBsZXZlbCArIDEgKi8KKyNkZWZpbmUgRkJJT0dFVF9WQkxBTksJCV9JT1IoJ0YnLCAweDEyLCBzdHJ1Y3QgZmJfdmJsYW5rKQorI2RlZmluZSBGQklPX0FMTE9DICAgICAgICAgICAgICAweDQ2MTMKKyNkZWZpbmUgRkJJT19GUkVFICAgICAgICAgICAgICAgMHg0NjE0CisjZGVmaW5lIEZCSU9HRVRfR0xZUEggICAgICAgICAgIDB4NDYxNQorI2RlZmluZSBGQklPR0VUX0hXQ0lORk8gICAgICAgICAweDQ2MTYKKyNkZWZpbmUgRkJJT1BVVF9NT0RFSU5GTyAgICAgICAgMHg0NjE3CisjZGVmaW5lIEZCSU9HRVRfRElTUElORk8gICAgICAgIDB4NDYxOAorI2RlZmluZSBGQklPX1dBSVRGT1JWU1lOQwlfSU9XKCdGJywgMHgyMCwgX191MzIpCisKKyNkZWZpbmUgRkJfVFlQRV9QQUNLRURfUElYRUxTCQkwCS8qIFBhY2tlZCBQaXhlbHMJKi8KKyNkZWZpbmUgRkJfVFlQRV9QTEFORVMJCQkxCS8qIE5vbiBpbnRlcmxlYXZlZCBwbGFuZXMgKi8KKyNkZWZpbmUgRkJfVFlQRV9JTlRFUkxFQVZFRF9QTEFORVMJMgkvKiBJbnRlcmxlYXZlZCBwbGFuZXMJKi8KKyNkZWZpbmUgRkJfVFlQRV9URVhUCQkJMwkvKiBUZXh0L2F0dHJpYnV0ZXMJKi8KKyNkZWZpbmUgRkJfVFlQRV9WR0FfUExBTkVTCQk0CS8qIEVHQS9WR0EgcGxhbmVzCSovCisKKyNkZWZpbmUgRkJfQVVYX1RFWFRfTURBCQkwCS8qIE1vbm9jaHJvbWUgdGV4dCAqLworI2RlZmluZSBGQl9BVVhfVEVYVF9DR0EJCTEJLyogQ0dBL0VHQS9WR0EgQ29sb3IgdGV4dCAqLworI2RlZmluZSBGQl9BVVhfVEVYVF9TM19NTUlPCTIJLyogUzMgTU1JTyBmYXN0dGV4dCAqLworI2RlZmluZSBGQl9BVVhfVEVYVF9NR0FfU1RFUDE2CTMJLyogTUdBIE1pbGxlbml1bSBJOiB0ZXh0LCBhdHRyLCAxNCByZXNlcnZlZCBieXRlcyAqLworI2RlZmluZSBGQl9BVVhfVEVYVF9NR0FfU1RFUDgJNAkvKiBvdGhlciBNR0FzOiAgICAgIHRleHQsIGF0dHIsICA2IHJlc2VydmVkIGJ5dGVzICovCisjZGVmaW5lIEZCX0FVWF9URVhUX1NWR0FfR1JPVVAJOAkvKiA4LTE1OiBTVkdBIHRpbGVibGl0IGNvbXBhdGlibGUgbW9kZXMgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfU1ZHQV9NQVNLCTcJLyogbG93ZXIgdGhyZWUgYml0cyBzYXlzIHN0ZXAgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfU1ZHQV9TVEVQMgk4CS8qIFNWR0EgdGV4dCBtb2RlOiAgdGV4dCwgYXR0ciAqLworI2RlZmluZSBGQl9BVVhfVEVYVF9TVkdBX1NURVA0CTkJLyogU1ZHQSB0ZXh0IG1vZGU6ICB0ZXh0LCBhdHRyLCAgMiByZXNlcnZlZCBieXRlcyAqLworI2RlZmluZSBGQl9BVVhfVEVYVF9TVkdBX1NURVA4CTEwCS8qIFNWR0EgdGV4dCBtb2RlOiAgdGV4dCwgYXR0ciwgIDYgcmVzZXJ2ZWQgYnl0ZXMgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfU1ZHQV9TVEVQMTYJMTEJLyogU1ZHQSB0ZXh0IG1vZGU6ICB0ZXh0LCBhdHRyLCAxNCByZXNlcnZlZCBieXRlcyAqLworI2RlZmluZSBGQl9BVVhfVEVYVF9TVkdBX0xBU1QJMTUJLyogcmVzZXJ2ZWQgdXAgdG8gMTUgKi8KKworI2RlZmluZSBGQl9BVVhfVkdBX1BMQU5FU19WR0E0CQkwCS8qIDE2IGNvbG9yIHBsYW5lcyAoRUdBL1ZHQSkgKi8KKyNkZWZpbmUgRkJfQVVYX1ZHQV9QTEFORVNfQ0ZCNAkJMQkvKiBDRkI0IGluIHBsYW5lcyAoVkdBKSAqLworI2RlZmluZSBGQl9BVVhfVkdBX1BMQU5FU19DRkI4CQkyCS8qIENGQjggaW4gcGxhbmVzIChWR0EpICovCisKKyNkZWZpbmUgRkJfVklTVUFMX01PTk8wMQkJMAkvKiBNb25vY2hyLiAxPUJsYWNrIDA9V2hpdGUgKi8KKyNkZWZpbmUgRkJfVklTVUFMX01PTk8xMAkJMQkvKiBNb25vY2hyLiAxPVdoaXRlIDA9QmxhY2sgKi8KKyNkZWZpbmUgRkJfVklTVUFMX1RSVUVDT0xPUgkJMgkvKiBUcnVlIGNvbG9yCSovCisjZGVmaW5lIEZCX1ZJU1VBTF9QU0VVRE9DT0xPUgkJMwkvKiBQc2V1ZG8gY29sb3IgKGxpa2UgYXRhcmkpICovCisjZGVmaW5lIEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUgkJNAkvKiBEaXJlY3QgY29sb3IgKi8KKyNkZWZpbmUgRkJfVklTVUFMX1NUQVRJQ19QU0VVRE9DT0xPUgk1CS8qIFBzZXVkbyBjb2xvciByZWFkb25seSAqLworCisjZGVmaW5lIEZCX0FDQ0VMX05PTkUJCTAJLyogbm8gaGFyZHdhcmUgYWNjZWxlcmF0b3IJKi8KKyNkZWZpbmUgRkJfQUNDRUxfQVRBUklCTElUVAkxCS8qIEF0YXJpIEJsaXR0ZXIJCSovCisjZGVmaW5lIEZCX0FDQ0VMX0FNSUdBQkxJVFQJMgkvKiBBbWlnYSBCbGl0dGVyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1MzX1RSSU82NAkzCS8qIEN5YmVydmlzaW9uNjQgKFMzIFRyaW82NCkgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTkNSXzc3QzMyQkxUCTQJLyogUmV0aW5hWjMgKE5DUiA3N0MzMkJMVCkgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9TM19WSVJHRQk1CS8qIEN5YmVydmlzaW9uNjQvM0QgKFMzIFZpUkdFKQkqLworI2RlZmluZSBGQl9BQ0NFTF9BVElfTUFDSDY0R1gJNgkvKiBBVEkgTWFjaCA2NEdYIGZhbWlseQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfREVDX1RHQQk3CS8qIERFQyAyMTAzMCBUR0EJCSovCisjZGVmaW5lIEZCX0FDQ0VMX0FUSV9NQUNINjRDVAk4CS8qIEFUSSBNYWNoIDY0Q1QgZmFtaWx5CQkqLworI2RlZmluZSBGQl9BQ0NFTF9BVElfTUFDSDY0VlQJOQkvKiBBVEkgTWFjaCA2NENUIGZhbWlseSBWVCBjbGFzcyAqLworI2RlZmluZSBGQl9BQ0NFTF9BVElfTUFDSDY0R1QJMTAJLyogQVRJIE1hY2ggNjRDVCBmYW1pbHkgR1QgY2xhc3MgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU1VOX0NSRUFUT1IJMTEJLyogU3VuIENyZWF0b3IvQ3JlYXRvcjNECSovCisjZGVmaW5lIEZCX0FDQ0VMX1NVTl9DR1NJWAkxMgkvKiBTdW4gY2c2CQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfU1VOX0xFTwkxMwkvKiBTdW4gbGVvL3p4CQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfSU1TX1RXSU5UVVJCTwkxNAkvKiBJTVMgVHdpbiBUdXJibwkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfM0RMQUJTX1BFUk1FRElBMiAxNQkvKiAzRGxhYnMgUGVybWVkaWEgMgkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfTUFUUk9YX01HQTIwNjRXIDE2CS8qIE1hdHJveCBNR0EyMDY0VyAoTWlsbGVuaXVtKQkqLworI2RlZmluZSBGQl9BQ0NFTF9NQVRST1hfTUdBMTA2NFNHIDE3CS8qIE1hdHJveCBNR0ExMDY0U0cgKE15c3RpcXVlKQkqLworI2RlZmluZSBGQl9BQ0NFTF9NQVRST1hfTUdBMjE2NFcgMTgJLyogTWF0cm94IE1HQTIxNjRXIChNaWxsZW5pdW0gSUkpICovCisjZGVmaW5lIEZCX0FDQ0VMX01BVFJPWF9NR0EyMTY0V19BR1AgMTkJLyogTWF0cm94IE1HQTIxNjRXIChNaWxsZW5pdW0gSUkpICovCisjZGVmaW5lIEZCX0FDQ0VMX01BVFJPWF9NR0FHMTAwCTIwCS8qIE1hdHJveCBHMTAwIChQcm9kdWN0aXZhIEcxMDApICovCisjZGVmaW5lIEZCX0FDQ0VMX01BVFJPWF9NR0FHMjAwCTIxCS8qIE1hdHJveCBHMjAwIChNeXN0LCBNaWxsLCAuLi4pICovCisjZGVmaW5lIEZCX0FDQ0VMX1NVTl9DRzE0CTIyCS8qIFN1biBjZ2ZvdXJ0ZWVuCQkgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU1VOX0JXVFdPCTIzCS8qIFN1biBid3R3bwkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX1NVTl9DR1RIUkVFCTI0CS8qIFN1biBjZ3RocmVlCQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfU1VOX1RDWAkyNQkvKiBTdW4gdGN4CQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfTUFUUk9YX01HQUc0MDAJMjYJLyogTWF0cm94IEc0MDAJCQkqLworI2RlZmluZSBGQl9BQ0NFTF9OVjMJCTI3CS8qIG5WaWRpYSBSSVZBIDEyOCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTlY0CQkyOAkvKiBuVmlkaWEgUklWQSBUTlQJCSovCisjZGVmaW5lIEZCX0FDQ0VMX05WNQkJMjkJLyogblZpZGlhIFJJVkEgVE5UMgkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfQ1RfNjU1NXgJMzAJLyogQyZUIDY1NTV4CQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfM0RGWF9CQU5TSEVFCTMxCS8qIDNEZnggQmFuc2hlZQkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX0FUSV9SQUdFMTI4CTMyCS8qIEFUSSBSYWdlMTI4IGZhbWlseQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfSUdTX0NZQkVSMjAwMAkzMwkvKiBDeWJlclBybyAyMDAwCQkqLworI2RlZmluZSBGQl9BQ0NFTF9JR1NfQ1lCRVIyMDEwCTM0CS8qIEN5YmVyUHJvIDIwMTAJCSovCisjZGVmaW5lIEZCX0FDQ0VMX0lHU19DWUJFUjUwMDAJMzUJLyogQ3liZXJQcm8gNTAwMAkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfU0lTX0dMQU1PVVIgICAgMzYJLyogU2lTIDMwMC82MzAvNTQwICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF8zRExBQlNfUEVSTUVESUEzIDM3CS8qIDNEbGFicyBQZXJtZWRpYSAzCQkqLworI2RlZmluZSBGQl9BQ0NFTF9BVElfUkFERU9OCTM4CS8qIEFUSSBSYWRlb24gZmFtaWx5CQkqLworI2RlZmluZSBGQl9BQ0NFTF9JODEwICAgICAgICAgICAzOSAgICAgIC8qIEludGVsIDgxMC84MTUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU0lTX0dMQU1PVVJfMiAgNDAJLyogU2lTIDMxNSwgNjUwLCA3NDAJCSovCisjZGVmaW5lIEZCX0FDQ0VMX1NJU19YQUJSRSAgICAgIDQxCS8qIFNpUyAzMzAgKCJYYWJyZSIpCQkqLworI2RlZmluZSBGQl9BQ0NFTF9JODMwICAgICAgICAgICA0MiAgICAgIC8qIEludGVsIDgzME0vODQ1Ry84NXgvODY1RyAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTlZfMTAgICAgICAgICAgNDMgICAgICAvKiBuVmlkaWEgQXJjaCAxMCAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05WXzIwICAgICAgICAgIDQ0ICAgICAgLyogblZpZGlhIEFyY2ggMjAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9OVl8zMCAgICAgICAgICA0NSAgICAgIC8qIG5WaWRpYSBBcmNoIDMwICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTlZfNDAgICAgICAgICAgNDYgICAgICAvKiBuVmlkaWEgQXJjaCA0MCAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1hHSV9WT0xBUklfVgk0NwkvKiBYR0kgVm9sYXJpIFYzWFQsIFY1LCBWOCAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1hHSV9WT0xBUklfWgk0OAkvKiBYR0kgVm9sYXJpIFo3ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX09NQVAxNjEwCTQ5CS8qIFRJIE9NQVAxNnh4ICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfVFJJREVOVF9UR1VJCTUwCS8qIFRyaWRlbnQgVEdVSQkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX1RSSURFTlRfM0RJTUFHRSA1MQkvKiBUcmlkZW50IDNESW1hZ2UJCSovCisjZGVmaW5lIEZCX0FDQ0VMX1RSSURFTlRfQkxBREUzRCA1MgkvKiBUcmlkZW50IEJsYWRlM0QJCSovCisjZGVmaW5lIEZCX0FDQ0VMX1RSSURFTlRfQkxBREVYUCA1MwkvKiBUcmlkZW50IEJsYWRlWFAJCSovCisjZGVmaW5lIEZCX0FDQ0VMX0NJUlJVU19BTFBJTkUgICA1MwkvKiBDaXJydXMgTG9naWMgNTQzeC81NDR4LzU0ODAJKi8KKyNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMDcwIDkwCS8qIE5lb01hZ2ljIE5NMjA3MCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMDkwIDkxCS8qIE5lb01hZ2ljIE5NMjA5MCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMDkzIDkyCS8qIE5lb01hZ2ljIE5NMjA5MyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMDk3IDkzCS8qIE5lb01hZ2ljIE5NMjA5NyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMTYwIDk0CS8qIE5lb01hZ2ljIE5NMjE2MCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMjAwIDk1CS8qIE5lb01hZ2ljIE5NMjIwMCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMjMwIDk2CS8qIE5lb01hZ2ljIE5NMjIzMCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMzYwIDk3CS8qIE5lb01hZ2ljIE5NMjM2MCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMzgwIDk4CS8qIE5lb01hZ2ljIE5NMjM4MCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfUFhBM1hYCQkgOTkJLyogUFhBM3h4CQkJKi8KKworI2RlZmluZSBGQl9BQ0NFTF9TQVZBR0U0ICAgICAgICAweDgwCS8qIFMzIFNhdmFnZTQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU0FWQUdFM0QgICAgICAgMHg4MQkvKiBTMyBTYXZhZ2UzRCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1NBVkFHRTNEX01WICAgIDB4ODIJLyogUzMgU2F2YWdlM0QtTVYgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9TQVZBR0UyMDAwICAgICAweDgzCS8qIFMzIFNhdmFnZTIwMDAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU0FWQUdFX01YX01WICAgMHg4NAkvKiBTMyBTYXZhZ2UvTVgtTVYgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1NBVkFHRV9NWCAgICAgIDB4ODUJLyogUzMgU2F2YWdlL01YICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9TQVZBR0VfSVhfTVYgICAweDg2CS8qIFMzIFNhdmFnZS9JWC1NViAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU0FWQUdFX0lYICAgICAgMHg4NwkvKiBTMyBTYXZhZ2UvSVggICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1BST1NBVkFHRV9QTSAgIDB4ODgJLyogUzMgUHJvU2F2YWdlIFBNMTMzICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9QUk9TQVZBR0VfS00gICAweDg5CS8qIFMzIFByb1NhdmFnZSBLTTEzMyAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfUzNUV0lTVEVSX1AgICAgMHg4YQkvKiBTMyBUd2lzdGVyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1MzVFdJU1RFUl9LICAgIDB4OGIJLyogUzMgVHdpc3RlcksgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9TVVBFUlNBVkFHRSAgICAweDhjICAgIC8qIFMzIFN1cGVyc2F2YWdlICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfUFJPU0FWQUdFX0REUiAgMHg4ZAkvKiBTMyBQcm9TYXZhZ2UgRERSICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1BST1NBVkFHRV9ERFJLIDB4OGUJLyogUzMgUHJvU2F2YWdlIEREUi1LICAgICAgICAgICAqLworCisjZGVmaW5lIEZCX0FDQ0VMX1BVVjNfVU5JR0ZYCTB4YTAJLyogUEtVbml0eS12MyBVbmlnZngJCSovCisKK3N0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyB7CisJY2hhciBpZFsxNl07CQkJLyogaWRlbnRpZmljYXRpb24gc3RyaW5nIGVnICJUVCBCdWlsdGluIiAqLworCXVuc2lnbmVkIGxvbmcgc21lbV9zdGFydDsJLyogU3RhcnQgb2YgZnJhbWUgYnVmZmVyIG1lbSAqLworCQkJCQkvKiAocGh5c2ljYWwgYWRkcmVzcykgKi8KKwlfX3UzMiBzbWVtX2xlbjsJCQkvKiBMZW5ndGggb2YgZnJhbWUgYnVmZmVyIG1lbSAqLworCV9fdTMyIHR5cGU7CQkJLyogc2VlIEZCX1RZUEVfKgkJKi8KKwlfX3UzMiB0eXBlX2F1eDsJCQkvKiBJbnRlcmxlYXZlIGZvciBpbnRlcmxlYXZlZCBQbGFuZXMgKi8KKwlfX3UzMiB2aXN1YWw7CQkJLyogc2VlIEZCX1ZJU1VBTF8qCQkqLyAKKwlfX3UxNiB4cGFuc3RlcDsJCQkvKiB6ZXJvIGlmIG5vIGhhcmR3YXJlIHBhbm5pbmcgICovCisJX191MTYgeXBhbnN0ZXA7CQkJLyogemVybyBpZiBubyBoYXJkd2FyZSBwYW5uaW5nICAqLworCV9fdTE2IHl3cmFwc3RlcDsJCS8qIHplcm8gaWYgbm8gaGFyZHdhcmUgeXdyYXAgICAgKi8KKwlfX3UzMiBsaW5lX2xlbmd0aDsJCS8qIGxlbmd0aCBvZiBhIGxpbmUgaW4gYnl0ZXMgICAgKi8KKwl1bnNpZ25lZCBsb25nIG1taW9fc3RhcnQ7CS8qIFN0YXJ0IG9mIE1lbW9yeSBNYXBwZWQgSS9PICAgKi8KKwkJCQkJLyogKHBoeXNpY2FsIGFkZHJlc3MpICovCisJX191MzIgbW1pb19sZW47CQkJLyogTGVuZ3RoIG9mIE1lbW9yeSBNYXBwZWQgSS9PICAqLworCV9fdTMyIGFjY2VsOwkJCS8qIEluZGljYXRlIHRvIGRyaXZlciB3aGljaAkqLworCQkJCQkvKiAgc3BlY2lmaWMgY2hpcC9jYXJkIHdlIGhhdmUJKi8KKwlfX3UxNiByZXNlcnZlZFszXTsJCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgY29tcGF0aWJpbGl0eSAqLworfTsKKworLyogSW50ZXJwcmV0YXRpb24gb2Ygb2Zmc2V0IGZvciBjb2xvciBmaWVsZHM6IEFsbCBvZmZzZXRzIGFyZSBmcm9tIHRoZSByaWdodCwKKyAqIGluc2lkZSBhICJwaXhlbCIgdmFsdWUsIHdoaWNoIGlzIGV4YWN0bHkgJ2JpdHNfcGVyX3BpeGVsJyB3aWRlIChtZWFuczogeW91CisgKiBjYW4gdXNlIHRoZSBvZmZzZXQgYXMgcmlnaHQgYXJndW1lbnQgdG8gPDwpLiBBIHBpeGVsIGFmdGVyd2FyZHMgaXMgYSBiaXQKKyAqIHN0cmVhbSBhbmQgaXMgd3JpdHRlbiB0byB2aWRlbyBtZW1vcnkgYXMgdGhhdCB1bm1vZGlmaWVkLgorICoKKyAqIEZvciBwc2V1ZG9jb2xvcjogb2Zmc2V0IGFuZCBsZW5ndGggc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBhbGwgY29sb3IKKyAqIGNvbXBvbmVudHMuIE9mZnNldCBzcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQKKyAqIG9mIHRoZSBwYWxsZXR0ZSBpbmRleCBpbiBhIHBpeGVsIHZhbHVlLiBMZW5ndGggaW5kaWNhdGVzIHRoZSBudW1iZXIKKyAqIG9mIGF2YWlsYWJsZSBwYWxldHRlIGVudHJpZXMgKGkuZS4gIyBvZiBlbnRyaWVzID0gMSA8PCBsZW5ndGgpLgorICovCitzdHJ1Y3QgZmJfYml0ZmllbGQgeworCV9fdTMyIG9mZnNldDsJCQkvKiBiZWdpbm5pbmcgb2YgYml0ZmllbGQJKi8KKwlfX3UzMiBsZW5ndGg7CQkJLyogbGVuZ3RoIG9mIGJpdGZpZWxkCQkqLworCV9fdTMyIG1zYl9yaWdodDsJCS8qICE9IDAgOiBNb3N0IHNpZ25pZmljYW50IGJpdCBpcyAqLyAKKwkJCQkJLyogcmlnaHQgKi8gCit9OworCisjZGVmaW5lIEZCX05PTlNURF9IQU0JCTEJLyogSG9sZC1BbmQtTW9kaWZ5IChIQU0pICAgICAgICAqLworI2RlZmluZSBGQl9OT05TVERfUkVWX1BJWF9JTl9CCTIJLyogb3JkZXIgb2YgcGl4ZWxzIGluIGVhY2ggYnl0ZSBpcyByZXZlcnNlZCAqLworCisjZGVmaW5lIEZCX0FDVElWQVRFX05PVwkJMAkvKiBzZXQgdmFsdWVzIGltbWVkaWF0ZWx5IChvciB2YmwpKi8KKyNkZWZpbmUgRkJfQUNUSVZBVEVfTlhUT1BFTgkxCS8qIGFjdGl2YXRlIG9uIG5leHQgb3BlbgkqLworI2RlZmluZSBGQl9BQ1RJVkFURV9URVNUCTIJLyogZG9uJ3Qgc2V0LCByb3VuZCB1cCBpbXBvc3NpYmxlICovCisjZGVmaW5lIEZCX0FDVElWQVRFX01BU0sgICAgICAgMTUKKwkJCQkJLyogdmFsdWVzCQkJKi8KKyNkZWZpbmUgRkJfQUNUSVZBVEVfVkJMCSAgICAgICAxNgkvKiBhY3RpdmF0ZSB2YWx1ZXMgb24gbmV4dCB2YmwgICovCisjZGVmaW5lIEZCX0NIQU5HRV9DTUFQX1ZCTCAgICAgMzIJLyogY2hhbmdlIGNvbG9ybWFwIG9uIHZibAkqLworI2RlZmluZSBGQl9BQ1RJVkFURV9BTEwJICAgICAgIDY0CS8qIGNoYW5nZSBhbGwgVkNzIG9uIHRoaXMgZmIJKi8KKyNkZWZpbmUgRkJfQUNUSVZBVEVfRk9SQ0UgICAgIDEyOAkvKiBmb3JjZSBhcHBseSBldmVuIHdoZW4gbm8gY2hhbmdlKi8KKyNkZWZpbmUgRkJfQUNUSVZBVEVfSU5WX01PREUgIDI1NiAgICAgICAvKiBpbnZhbGlkYXRlIHZpZGVvbW9kZSAqLworCisjZGVmaW5lIEZCX0FDQ0VMRl9URVhUCQkxCS8qIChPQlNPTEVURSkgc2VlIGZiX2luZm8uZmxhZ3MgYW5kIHZjX21vZGUgKi8KKworI2RlZmluZSBGQl9TWU5DX0hPUl9ISUdIX0FDVAkxCS8qIGhvcml6b250YWwgc3luYyBoaWdoIGFjdGl2ZQkqLworI2RlZmluZSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QJMgkvKiB2ZXJ0aWNhbCBzeW5jIGhpZ2ggYWN0aXZlCSovCisjZGVmaW5lIEZCX1NZTkNfRVhUCQk0CS8qIGV4dGVybmFsIHN5bmMJCSovCisjZGVmaW5lIEZCX1NZTkNfQ09NUF9ISUdIX0FDVAk4CS8qIGNvbXBvc2l0ZSBzeW5jIGhpZ2ggYWN0aXZlICAgKi8KKyNkZWZpbmUgRkJfU1lOQ19CUk9BRENBU1QJMTYJLyogYnJvYWRjYXN0IHZpZGVvIHRpbWluZ3MgICAgICAqLworCQkJCQkvKiB2dG90YWwgPSAxNDRkLzI4OG4vNTc2aSA9PiBQQUwgICovCisJCQkJCS8qIHZ0b3RhbCA9IDEyMWQvMjQybi80ODRpID0+IE5UU0MgKi8KKyNkZWZpbmUgRkJfU1lOQ19PTl9HUkVFTgkzMgkvKiBzeW5jIG9uIGdyZWVuICovCisKKyNkZWZpbmUgRkJfVk1PREVfTk9OSU5URVJMQUNFRCAgMAkvKiBub24gaW50ZXJsYWNlZCAqLworI2RlZmluZSBGQl9WTU9ERV9JTlRFUkxBQ0VECTEJLyogaW50ZXJsYWNlZAkqLworI2RlZmluZSBGQl9WTU9ERV9ET1VCTEUJCTIJLyogZG91YmxlIHNjYW4gKi8KKyNkZWZpbmUgRkJfVk1PREVfT0REX0ZMRF9GSVJTVAk0CS8qIGludGVybGFjZWQ6IHRvcCBsaW5lIGZpcnN0ICovCisjZGVmaW5lIEZCX1ZNT0RFX01BU0sJCTI1NQorCisjZGVmaW5lIEZCX1ZNT0RFX1lXUkFQCQkyNTYJLyogeXdyYXAgaW5zdGVhZCBvZiBwYW5uaW5nICAgICAqLworI2RlZmluZSBGQl9WTU9ERV9TTU9PVEhfWFBBTgk1MTIJLyogc21vb3RoIHhwYW4gcG9zc2libGUgKGludGVybmFsbHkgdXNlZCkgKi8KKyNkZWZpbmUgRkJfVk1PREVfQ09OVVBEQVRFCTUxMgkvKiBkb24ndCB1cGRhdGUgeC95b2Zmc2V0CSovCisKKy8qCisgKiBEaXNwbGF5IHJvdGF0aW9uIHN1cHBvcnQKKyAqLworI2RlZmluZSBGQl9ST1RBVEVfVVIgICAgICAwCisjZGVmaW5lIEZCX1JPVEFURV9DVyAgICAgIDEKKyNkZWZpbmUgRkJfUk9UQVRFX1VEICAgICAgMgorI2RlZmluZSBGQl9ST1RBVEVfQ0NXICAgICAzCisKKyNkZWZpbmUgUElDT1MyS0haKGEpICgxMDAwMDAwMDAwVUwvKGEpKQorI2RlZmluZSBLSFoyUElDT1MoYSkgKDEwMDAwMDAwMDBVTC8oYSkpCisKK3N0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB7CisJX191MzIgeHJlczsJCQkvKiB2aXNpYmxlIHJlc29sdXRpb24JCSovCisJX191MzIgeXJlczsKKwlfX3UzMiB4cmVzX3ZpcnR1YWw7CQkvKiB2aXJ0dWFsIHJlc29sdXRpb24JCSovCisJX191MzIgeXJlc192aXJ0dWFsOworCV9fdTMyIHhvZmZzZXQ7CQkJLyogb2Zmc2V0IGZyb20gdmlydHVhbCB0byB2aXNpYmxlICovCisJX191MzIgeW9mZnNldDsJCQkvKiByZXNvbHV0aW9uCQkJKi8KKworCV9fdTMyIGJpdHNfcGVyX3BpeGVsOwkJLyogZ3Vlc3Mgd2hhdAkJCSovCisJX191MzIgZ3JheXNjYWxlOwkJLyogIT0gMCBHcmF5bGV2ZWxzIGluc3RlYWQgb2YgY29sb3JzICovCisKKwlzdHJ1Y3QgZmJfYml0ZmllbGQgcmVkOwkJLyogYml0ZmllbGQgaW4gZmIgbWVtIGlmIHRydWUgY29sb3IsICovCisJc3RydWN0IGZiX2JpdGZpZWxkIGdyZWVuOwkvKiBlbHNlIG9ubHkgbGVuZ3RoIGlzIHNpZ25pZmljYW50ICovCisJc3RydWN0IGZiX2JpdGZpZWxkIGJsdWU7CisJc3RydWN0IGZiX2JpdGZpZWxkIHRyYW5zcDsJLyogdHJhbnNwYXJlbmN5CQkJKi8JCisKKwlfX3UzMiBub25zdGQ7CQkJLyogIT0gMCBOb24gc3RhbmRhcmQgcGl4ZWwgZm9ybWF0ICovCisKKwlfX3UzMiBhY3RpdmF0ZTsJCQkvKiBzZWUgRkJfQUNUSVZBVEVfKgkJKi8KKworCV9fdTMyIGhlaWdodDsJCQkvKiBoZWlnaHQgb2YgcGljdHVyZSBpbiBtbSAgICAqLworCV9fdTMyIHdpZHRoOwkJCS8qIHdpZHRoIG9mIHBpY3R1cmUgaW4gbW0gICAgICovCisKKwlfX3UzMiBhY2NlbF9mbGFnczsJCS8qIChPQlNPTEVURSkgc2VlIGZiX2luZm8uZmxhZ3MgKi8KKworCS8qIFRpbWluZzogQWxsIHZhbHVlcyBpbiBwaXhjbG9ja3MsIGV4Y2VwdCBwaXhjbG9jayAob2YgY291cnNlKSAqLworCV9fdTMyIHBpeGNsb2NrOwkJCS8qIHBpeGVsIGNsb2NrIGluIHBzIChwaWNvIHNlY29uZHMpICovCisJX191MzIgbGVmdF9tYXJnaW47CQkvKiB0aW1lIGZyb20gc3luYyB0byBwaWN0dXJlCSovCisJX191MzIgcmlnaHRfbWFyZ2luOwkJLyogdGltZSBmcm9tIHBpY3R1cmUgdG8gc3luYwkqLworCV9fdTMyIHVwcGVyX21hcmdpbjsJCS8qIHRpbWUgZnJvbSBzeW5jIHRvIHBpY3R1cmUJKi8KKwlfX3UzMiBsb3dlcl9tYXJnaW47CisJX191MzIgaHN5bmNfbGVuOwkJLyogbGVuZ3RoIG9mIGhvcml6b250YWwgc3luYwkqLworCV9fdTMyIHZzeW5jX2xlbjsJCS8qIGxlbmd0aCBvZiB2ZXJ0aWNhbCBzeW5jCSovCisJX191MzIgc3luYzsJCQkvKiBzZWUgRkJfU1lOQ18qCQkqLworCV9fdTMyIHZtb2RlOwkJCS8qIHNlZSBGQl9WTU9ERV8qCQkqLworCV9fdTMyIHJvdGF0ZTsJCQkvKiBhbmdsZSB3ZSByb3RhdGUgY291bnRlciBjbG9ja3dpc2UgKi8KKwlfX3UzMiByZXNlcnZlZFs1XTsJCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgY29tcGF0aWJpbGl0eSAqLworfTsKKworc3RydWN0IGZiX2NtYXAgeworCV9fdTMyIHN0YXJ0OwkJCS8qIEZpcnN0IGVudHJ5CSovCisJX191MzIgbGVuOwkJCS8qIE51bWJlciBvZiBlbnRyaWVzICovCisJX191MTYgKnJlZDsJCQkvKiBSZWQgdmFsdWVzCSovCisJX191MTYgKmdyZWVuOworCV9fdTE2ICpibHVlOworCV9fdTE2ICp0cmFuc3A7CQkJLyogdHJhbnNwYXJlbmN5LCBjYW4gYmUgTlVMTCAqLworfTsKKworc3RydWN0IGZiX2NvbjJmYm1hcCB7CisJX191MzIgY29uc29sZTsKKwlfX3UzMiBmcmFtZWJ1ZmZlcjsKK307CisKKy8qIFZFU0EgQmxhbmtpbmcgTGV2ZWxzICovCisjZGVmaW5lIFZFU0FfTk9fQkxBTktJTkcgICAgICAgIDAKKyNkZWZpbmUgVkVTQV9WU1lOQ19TVVNQRU5EICAgICAgMQorI2RlZmluZSBWRVNBX0hTWU5DX1NVU1BFTkQgICAgICAyCisjZGVmaW5lIFZFU0FfUE9XRVJET1dOICAgICAgICAgIDMKKworCitlbnVtIHsKKwkvKiBzY3JlZW46IHVuYmxhbmtlZCwgaHN5bmM6IG9uLCAgdnN5bmM6IG9uICovCisJRkJfQkxBTktfVU5CTEFOSyAgICAgICA9IFZFU0FfTk9fQkxBTktJTkcsCisKKwkvKiBzY3JlZW46IGJsYW5rZWQsICAgaHN5bmM6IG9uLCAgdnN5bmM6IG9uICovCisJRkJfQkxBTktfTk9STUFMICAgICAgICA9IFZFU0FfTk9fQkxBTktJTkcgKyAxLAorCisJLyogc2NyZWVuOiBibGFua2VkLCAgIGhzeW5jOiBvbiwgIHZzeW5jOiBvZmYgKi8KKwlGQl9CTEFOS19WU1lOQ19TVVNQRU5EID0gVkVTQV9WU1lOQ19TVVNQRU5EICsgMSwKKworCS8qIHNjcmVlbjogYmxhbmtlZCwgICBoc3luYzogb2ZmLCB2c3luYzogb24gKi8KKwlGQl9CTEFOS19IU1lOQ19TVVNQRU5EID0gVkVTQV9IU1lOQ19TVVNQRU5EICsgMSwKKworCS8qIHNjcmVlbjogYmxhbmtlZCwgICBoc3luYzogb2ZmLCB2c3luYzogb2ZmICovCisJRkJfQkxBTktfUE9XRVJET1dOICAgICA9IFZFU0FfUE9XRVJET1dOICsgMQorfTsKKworI2RlZmluZSBGQl9WQkxBTktfVkJMQU5LSU5HCTB4MDAxCS8qIGN1cnJlbnRseSBpbiBhIHZlcnRpY2FsIGJsYW5rICovCisjZGVmaW5lIEZCX1ZCTEFOS19IQkxBTktJTkcJMHgwMDIJLyogY3VycmVudGx5IGluIGEgaG9yaXpvbnRhbCBibGFuayAqLworI2RlZmluZSBGQl9WQkxBTktfSEFWRV9WQkxBTksJMHgwMDQJLyogdmVydGljYWwgYmxhbmtzIGNhbiBiZSBkZXRlY3RlZCAqLworI2RlZmluZSBGQl9WQkxBTktfSEFWRV9IQkxBTksJMHgwMDgJLyogaG9yaXpvbnRhbCBibGFua3MgY2FuIGJlIGRldGVjdGVkICovCisjZGVmaW5lIEZCX1ZCTEFOS19IQVZFX0NPVU5UCTB4MDEwCS8qIGdsb2JhbCByZXRyYWNlIGNvdW50ZXIgaXMgYXZhaWxhYmxlICovCisjZGVmaW5lIEZCX1ZCTEFOS19IQVZFX1ZDT1VOVAkweDAyMAkvKiB0aGUgdmNvdW50IGZpZWxkIGlzIHZhbGlkICovCisjZGVmaW5lIEZCX1ZCTEFOS19IQVZFX0hDT1VOVAkweDA0MAkvKiB0aGUgaGNvdW50IGZpZWxkIGlzIHZhbGlkICovCisjZGVmaW5lIEZCX1ZCTEFOS19WU1lOQ0lORwkweDA4MAkvKiBjdXJyZW50bHkgaW4gYSB2c3luYyAqLworI2RlZmluZSBGQl9WQkxBTktfSEFWRV9WU1lOQwkweDEwMAkvKiB2ZXJpY2FsIHN5bmNzIGNhbiBiZSBkZXRlY3RlZCAqLworCitzdHJ1Y3QgZmJfdmJsYW5rIHsKKwlfX3UzMiBmbGFnczsJCQkvKiBGQl9WQkxBTksgZmxhZ3MgKi8KKwlfX3UzMiBjb3VudDsJCQkvKiBjb3VudGVyIG9mIHJldHJhY2VzIHNpbmNlIGJvb3QgKi8KKwlfX3UzMiB2Y291bnQ7CQkJLyogY3VycmVudCBzY2FubGluZSBwb3NpdGlvbiAqLworCV9fdTMyIGhjb3VudDsJCQkvKiBjdXJyZW50IHNjYW5kb3QgcG9zaXRpb24gKi8KKwlfX3UzMiByZXNlcnZlZFs0XTsJCS8qIHJlc2VydmVkIGZvciBmdXR1cmUgY29tcGF0aWJpbGl0eSAqLworfTsKKworLyogSW50ZXJuYWwgSFcgYWNjZWwgKi8KKyNkZWZpbmUgUk9QX0NPUFkgMAorI2RlZmluZSBST1BfWE9SICAxCisKK3N0cnVjdCBmYl9jb3B5YXJlYSB7CisJX191MzIgZHg7CisJX191MzIgZHk7CisJX191MzIgd2lkdGg7CisJX191MzIgaGVpZ2h0OworCV9fdTMyIHN4OworCV9fdTMyIHN5OworfTsKKworc3RydWN0IGZiX2ZpbGxyZWN0IHsKKwlfX3UzMiBkeDsJLyogc2NyZWVuLXJlbGF0aXZlICovCisJX191MzIgZHk7CisJX191MzIgd2lkdGg7CisJX191MzIgaGVpZ2h0OworCV9fdTMyIGNvbG9yOworCV9fdTMyIHJvcDsKK307CisKK3N0cnVjdCBmYl9pbWFnZSB7CisJX191MzIgZHg7CQkvKiBXaGVyZSB0byBwbGFjZSBpbWFnZSAqLworCV9fdTMyIGR5OworCV9fdTMyIHdpZHRoOwkJLyogU2l6ZSBvZiBpbWFnZSAqLworCV9fdTMyIGhlaWdodDsKKwlfX3UzMiBmZ19jb2xvcjsJCS8qIE9ubHkgdXNlZCB3aGVuIGEgbW9ubyBiaXRtYXAgKi8KKwlfX3UzMiBiZ19jb2xvcjsKKwlfX3U4ICBkZXB0aDsJCS8qIERlcHRoIG9mIHRoZSBpbWFnZSAqLworCWNvbnN0IGNoYXIgKmRhdGE7CS8qIFBvaW50ZXIgdG8gaW1hZ2UgZGF0YSAqLworCXN0cnVjdCBmYl9jbWFwIGNtYXA7CS8qIGNvbG9yIG1hcCBpbmZvICovCit9OworCisvKgorICogaGFyZHdhcmUgY3Vyc29yIGNvbnRyb2wKKyAqLworCisjZGVmaW5lIEZCX0NVUl9TRVRJTUFHRSAweDAxCisjZGVmaW5lIEZCX0NVUl9TRVRQT1MgICAweDAyCisjZGVmaW5lIEZCX0NVUl9TRVRIT1QgICAweDA0CisjZGVmaW5lIEZCX0NVUl9TRVRDTUFQICAweDA4CisjZGVmaW5lIEZCX0NVUl9TRVRTSEFQRSAweDEwCisjZGVmaW5lIEZCX0NVUl9TRVRTSVpFCTB4MjAKKyNkZWZpbmUgRkJfQ1VSX1NFVEFMTCAgIDB4RkYKKworc3RydWN0IGZiY3VycG9zIHsKKwlfX3UxNiB4LCB5OworfTsKKworc3RydWN0IGZiX2N1cnNvciB7CisJX191MTYgc2V0OwkJLyogd2hhdCB0byBzZXQgKi8KKwlfX3UxNiBlbmFibGU7CQkvKiBjdXJzb3Igb24vb2ZmICovCisJX191MTYgcm9wOwkJLyogYml0b3Agb3BlcmF0aW9uICovCisJY29uc3QgY2hhciAqbWFzazsJLyogY3Vyc29yIG1hc2sgYml0cyAqLworCXN0cnVjdCBmYmN1cnBvcyBob3Q7CS8qIGN1cnNvciBob3Qgc3BvdCAqLworCXN0cnVjdCBmYl9pbWFnZQlpbWFnZTsJLyogQ3Vyc29yIGltYWdlICovCit9OworCisjaWZkZWYgQ09ORklHX0ZCX0JBQ0tMSUdIVAorLyogU2V0dGluZ3MgZm9yIHRoZSBnZW5lcmljIGJhY2tsaWdodCBjb2RlICovCisjZGVmaW5lIEZCX0JBQ0tMSUdIVF9MRVZFTFMJMTI4CisjZGVmaW5lIEZCX0JBQ0tMSUdIVF9NQVgJMHhGRgorI2VuZGlmCisKKworI2VuZGlmIC8qIF9MSU5VWF9GQl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZjbnRsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1NDQ4NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmNudGwuaApAQCAtMCwwICsxLDUyIEBACisjaWZuZGVmIF9MSU5VWF9GQ05UTF9ICisjZGVmaW5lIF9MSU5VWF9GQ05UTF9ICisKKyNpbmNsdWRlIDxhc20vZmNudGwuaD4KKworI2RlZmluZSBGX1NFVExFQVNFCShGX0xJTlVYX1NQRUNJRklDX0JBU0UgKyAwKQorI2RlZmluZSBGX0dFVExFQVNFCShGX0xJTlVYX1NQRUNJRklDX0JBU0UgKyAxKQorCisvKgorICogQ2FuY2VsIGEgYmxvY2tpbmcgcG9zaXggbG9jazsgaW50ZXJuYWwgdXNlIG9ubHkgdW50aWwgd2UgZXhwb3NlIGFuCisgKiBhc3luY2hyb25vdXMgbG9jayBhcGkgdG8gdXNlcnNwYWNlOgorICovCisjZGVmaW5lIEZfQ0FOQ0VMTEsJKEZfTElOVVhfU1BFQ0lGSUNfQkFTRSArIDUpCisKKy8qIENyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciB3aXRoIEZEX0NMT0VYRUMgc2V0LiAqLworI2RlZmluZSBGX0RVUEZEX0NMT0VYRUMJKEZfTElOVVhfU1BFQ0lGSUNfQkFTRSArIDYpCisKKy8qCisgKiBSZXF1ZXN0IG5vZmljYXRpb25zIG9uIGEgZGlyZWN0b3J5LgorICogU2VlIGJlbG93IGZvciBldmVudHMgdGhhdCBtYXkgYmUgbm90aWZpZWQuCisgKi8KKyNkZWZpbmUgRl9OT1RJRlkJKEZfTElOVVhfU1BFQ0lGSUNfQkFTRSsyKQorCisvKgorICogU2V0IGFuZCBnZXQgb2YgcGlwZSBwYWdlIHNpemUgYXJyYXkKKyAqLworI2RlZmluZSBGX1NFVFBJUEVfU1oJKEZfTElOVVhfU1BFQ0lGSUNfQkFTRSArIDcpCisjZGVmaW5lIEZfR0VUUElQRV9TWgkoRl9MSU5VWF9TUEVDSUZJQ19CQVNFICsgOCkKKworLyoKKyAqIFR5cGVzIG9mIGRpcmVjdG9yeSBub3RpZmljYXRpb25zIHRoYXQgbWF5IGJlIHJlcXVlc3RlZC4KKyAqLworI2RlZmluZSBETl9BQ0NFU1MJMHgwMDAwMDAwMQkvKiBGaWxlIGFjY2Vzc2VkICovCisjZGVmaW5lIEROX01PRElGWQkweDAwMDAwMDAyCS8qIEZpbGUgbW9kaWZpZWQgKi8KKyNkZWZpbmUgRE5fQ1JFQVRFCTB4MDAwMDAwMDQJLyogRmlsZSBjcmVhdGVkICovCisjZGVmaW5lIEROX0RFTEVURQkweDAwMDAwMDA4CS8qIEZpbGUgcmVtb3ZlZCAqLworI2RlZmluZSBETl9SRU5BTUUJMHgwMDAwMDAxMAkvKiBGaWxlIHJlbmFtZWQgKi8KKyNkZWZpbmUgRE5fQVRUUklCCTB4MDAwMDAwMjAJLyogRmlsZSBjaGFuZ2VkIGF0dGlidXRlcyAqLworI2RlZmluZSBETl9NVUxUSVNIT1QJMHg4MDAwMDAwMAkvKiBEb24ndCByZW1vdmUgbm90aWZpZXIgKi8KKworI2RlZmluZSBBVF9GRENXRAkJLTEwMCAgICAvKiBTcGVjaWFsIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuYXQgc2hvdWxkIHVzZSB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmcgZGlyZWN0b3J5LiAqLworI2RlZmluZSBBVF9TWU1MSU5LX05PRk9MTE9XCTB4MTAwICAgLyogRG8gbm90IGZvbGxvdyBzeW1ib2xpYyBsaW5rcy4gICovCisjZGVmaW5lIEFUX1JFTU9WRURJUgkJMHgyMDAgICAvKiBSZW1vdmUgZGlyZWN0b3J5IGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpbmtpbmcgZmlsZS4gICovCisjZGVmaW5lIEFUX1NZTUxJTktfRk9MTE9XCTB4NDAwICAgLyogRm9sbG93IHN5bWJvbGljIGxpbmtzLiAgKi8KKyNkZWZpbmUgQVRfTk9fQVVUT01PVU5UCQkweDgwMAkvKiBTdXBwcmVzcyB0ZXJtaW5hbCBhdXRvbW91bnQgdHJhdmVyc2FsICovCisjZGVmaW5lIEFUX0VNUFRZX1BBVEgJCTB4MTAwMAkvKiBBbGxvdyBlbXB0eSByZWxhdGl2ZSBwYXRobmFtZSAqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYTFhNTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZkLmgKQEAgLTAsMCArMSwzODIgQEAKKyNpZm5kZWYgX0xJTlVYX0ZEX0gKKyNkZWZpbmUgX0xJTlVYX0ZEX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKworLyogTmV3IGZpbGUgbGF5b3V0OiBOb3cgdGhlIGlvY3RsIGRlZmluaXRpb25zIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUKKyAqIGRlZmluaXRpb25zIG9mIHRoZSBzdHJ1Y3R1cmVzIHRoYXQgdGhleSB1c2UgKi8KKworLyoKKyAqIEdlb21ldHJ5CisgKi8KK3N0cnVjdCBmbG9wcHlfc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQJc2l6ZSwJCS8qIG5yIG9mIHNlY3RvcnMgdG90YWwgKi8KKwkJCXNlY3QsCQkvKiBzZWN0b3JzIHBlciB0cmFjayAqLworCQkJaGVhZCwJCS8qIG5yIG9mIGhlYWRzICovCisJCQl0cmFjaywJCS8qIG5yIG9mIHRyYWNrcyAqLworCQkJc3RyZXRjaDsJLyogYml0IDAgIT0wIG1lYW5zIGRvdWJsZSB0cmFjayBzdGVwcyAqLworCQkJCQkvKiBiaXQgMSAhPSAwIG1lYW5zIHN3YXAgc2lkZXMgKi8KKwkJCQkJLyogYml0cyAyLi45IGdpdmUgdGhlIGZpcnN0IHNlY3RvciAqLworCQkJCQkvKiAgbnVtYmVyICh0aGUgTFNCIGlzIGZsaXBwZWQpICovCisjZGVmaW5lIEZEX1NUUkVUQ0ggMQorI2RlZmluZSBGRF9TV0FQU0lERVMgMgorI2RlZmluZSBGRF9aRVJPQkFTRUQgNAorI2RlZmluZSBGRF9TRUNUQkFTRU1BU0sgMHgzRkMKKyNkZWZpbmUgRkRfTUtTRUNUQkFTRShzKSAoKChzKSBeIDEpIDw8IDIpCisjZGVmaW5lIEZEX1NFQ1RCQVNFKGZsb3BweSkgKCgoKGZsb3BweSktPnN0cmV0Y2ggJiBGRF9TRUNUQkFTRU1BU0spID4+IDIpIF4gMSkKKworCXVuc2lnbmVkIGNoYXIJZ2FwLAkJLyogZ2FwMSBzaXplICovCisKKwkJCXJhdGUsCQkvKiBkYXRhIHJhdGUuIHw9IDB4NDAgZm9yIHBlcnBlbmRpY3VsYXIgKi8KKyNkZWZpbmUgRkRfMk0gMHg0CisjZGVmaW5lIEZEX1NJWkVDT0RFTUFTSyAweDM4CisjZGVmaW5lIEZEX1NJWkVDT0RFKGZsb3BweSkgKCgoKChmbG9wcHkpLT5yYXRlJkZEX1NJWkVDT0RFTUFTSyk+PiAzKSsgMikgJTgpCisjZGVmaW5lIEZEX1NFQ1RTSVpFKGZsb3BweSkgKCAoZmxvcHB5KS0+cmF0ZSAmIEZEXzJNID8gXAorCQkJICAgICA1MTIgOiAxMjggPDwgRkRfU0laRUNPREUoZmxvcHB5KSApCisjZGVmaW5lIEZEX1BFUlAgMHg0MAorCisJCQlzcGVjMSwJCS8qIHN0ZXBwaW5nIHJhdGUsIGhlYWQgdW5sb2FkIHRpbWUgKi8KKwkJCWZtdF9nYXA7CS8qIGdhcDIgc2l6ZSAqLworCWNvbnN0IGNoYXIJKiBuYW1lOyAvKiB1c2VkIG9ubHkgZm9yIHByZWRlZmluZWQgZm9ybWF0cyAqLworfTsKKworCisvKiBjb21tYW5kcyBuZWVkaW5nIHdyaXRlIGFjY2VzcyBoYXZlIDB4NDAgc2V0ICovCisvKiBjb21tYW5kcyBuZWVkaW5nIHN1cGVyIHVzZXIgYWNjZXNzIGhhdmUgMHg4MCBzZXQgKi8KKworI2RlZmluZSBGRENMUlBSTSBfSU8oMiwgMHg0MSkKKy8qIGNsZWFyIHVzZXItZGVmaW5lZCBwYXJhbWV0ZXJzICovCisKKyNkZWZpbmUgRkRTRVRQUk0gX0lPVygyLCAweDQyLCBzdHJ1Y3QgZmxvcHB5X3N0cnVjdCkgCisjZGVmaW5lIEZEU0VUTUVESUFQUk0gRkRTRVRQUk0KKy8qIHNldCB1c2VyLWRlZmluZWQgcGFyYW1ldGVycyBmb3IgY3VycmVudCBtZWRpYSAqLworCisjZGVmaW5lIEZEREVGUFJNIF9JT1coMiwgMHg0Mywgc3RydWN0IGZsb3BweV9zdHJ1Y3QpIAorI2RlZmluZSBGREdFVFBSTSBfSU9SKDIsIDB4MDQsIHN0cnVjdCBmbG9wcHlfc3RydWN0KQorI2RlZmluZSBGRERFRk1FRElBUFJNIEZEREVGUFJNCisjZGVmaW5lIEZER0VUTUVESUFQUk0gRkRHRVRQUk0KKy8qIHNldC9nZXQgZGlzayBwYXJhbWV0ZXJzICovCisKKworI2RlZmluZQlGRE1TR09OICBfSU8oMiwweDQ1KQorI2RlZmluZQlGRE1TR09GRiBfSU8oMiwweDQ2KQorLyogaXNzdWUvZG9uJ3QgaXNzdWUga2VybmVsIG1lc3NhZ2VzIG9uIG1lZGlhIHR5cGUgY2hhbmdlICovCisKKworLyogCisgKiBGb3JtYXR0aW5nIChvYnNvbGV0ZSkKKyAqLworI2RlZmluZSBGRF9GSUxMX0JZVEUgMHhGNiAvKiBmb3JtYXQgZmlsbCBieXRlLiAqLworCitzdHJ1Y3QgZm9ybWF0X2Rlc2NyIHsKKwl1bnNpZ25lZCBpbnQgZGV2aWNlLGhlYWQsdHJhY2s7Cit9OworCisjZGVmaW5lIEZERk1UQkVHIF9JTygyLDB4NDcpCisvKiBiZWdpbiBmb3JtYXR0aW5nIGEgZGlzayAqLworI2RlZmluZQlGREZNVFRSSyBfSU9XKDIsMHg0OCwgc3RydWN0IGZvcm1hdF9kZXNjcikKKy8qIGZvcm1hdCB0aGUgc3BlY2lmaWVkIHRyYWNrICovCisjZGVmaW5lIEZERk1URU5EIF9JTygyLDB4NDkpCisvKiBlbmQgZm9ybWF0dGluZyBhIGRpc2sgKi8KKworCisvKgorICogRXJyb3IgdGhyZXNob2xkcworICovCitzdHJ1Y3QgZmxvcHB5X21heF9lcnJvcnMgeworCXVuc2lnbmVkIGludAorCSAgYWJvcnQsICAgICAgLyogbnVtYmVyIG9mIGVycm9ycyB0byBiZSByZWFjaGVkIGJlZm9yZSBhYm9ydGluZyAqLworCSAgcmVhZF90cmFjaywgLyogbWF4aW1hbCBudW1iZXIgb2YgZXJyb3JzIHBlcm1pdHRlZCB0byByZWFkIGFuCisJCSAgICAgICAqIGVudGlyZSB0cmFjayBhdCBvbmNlICovCisJICByZXNldCwgICAgICAvKiBtYXhpbWFsIG51bWJlciBvZiBlcnJvcnMgYmVmb3JlIGEgcmVzZXQgaXMgdHJpZWQgKi8KKwkgIHJlY2FsLCAgICAgIC8qIG1heGltYWwgbnVtYmVyIG9mIGVycm9ycyBiZWZvcmUgYSByZWNhbGlicmF0ZSBpcworCQkgICAgICAgKiB0cmllZCAqLworCisJICAvKgorCSAgICogVGhyZXNob2xkIGZvciByZXBvcnRpbmcgRkRDIGVycm9ycyB0byB0aGUgY29uc29sZS4KKwkgICAqIFNldHRpbmcgdGhpcyB0byB6ZXJvIG1heSBmbG9vZCB5b3VyIHNjcmVlbiB3aGVuIHVzaW5nCisJICAgKiB1bHRyYSBjaGVhcCBmbG9wcGllcyA7LSkKKwkgICAqLworCSAgcmVwb3J0aW5nOworCit9OworCisjZGVmaW5lIEZEU0VURU1TR1RSRVNICV9JTygyLDB4NGEpCisvKiBzZXQgZmRjIGVycm9yIHJlcG9ydGluZyB0aHJlc2hvbGQgKi8KKworI2RlZmluZSBGREZMVVNIICBfSU8oMiwweDRiKQorLyogZmx1c2ggYnVmZmVycyBmb3IgbWVkaWE7IGVpdGhlciBmb3IgdmVyaWZ5aW5nIG1lZGlhLCBvciBmb3IKKyAqIGhhbmRsaW5nIGEgbWVkaWEgY2hhbmdlIHdpdGhvdXQgY2xvc2luZyB0aGUgZmlsZSBkZXNjcmlwdG9yICovCisKKyNkZWZpbmUgRkRTRVRNQVhFUlJTIF9JT1coMiwgMHg0Yywgc3RydWN0IGZsb3BweV9tYXhfZXJyb3JzKQorI2RlZmluZSBGREdFVE1BWEVSUlMgX0lPUigyLCAweDBlLCBzdHJ1Y3QgZmxvcHB5X21heF9lcnJvcnMpCisvKiBzZXQvZ2V0IGFib3J0aW9uIGFuZCByZWFkX3RyYWNrIHRocmVzaG9sZC4gU2VlIGFsc28gZmxvcHB5X2RyaXZlX3BhcmFtcworICogc3RydWN0dXJlICovCisKKwordHlwZWRlZiBjaGFyIGZsb3BweV9kcml2ZV9uYW1lWzE2XTsKKyNkZWZpbmUgRkRHRVREUlZUWVAgX0lPUigyLCAweDBmLCBmbG9wcHlfZHJpdmVfbmFtZSkKKy8qIGdldCBkcml2ZSB0eXBlOiA1IDEvNCBvciAzIDEvMiAqLworCisKKy8qCisgKiBEcml2ZSBwYXJhbWV0ZXJzICh1c2VyIG1vZGlmaWFibGUpCisgKi8KK3N0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zIHsKKwlzaWduZWQgY2hhciBjbW9zOwkJLyogQ01PUyB0eXBlICovCisJCisJLyogU3BlYzIgaXMgKEhMRDw8MSB8IE5EKSwgd2hlcmUgSExEIGlzIGhlYWQgbG9hZCB0aW1lICgxPTJtcywgMj00IG1zIAorCSAqIGV0YykgYW5kIE5EIGlzIHNldCBtZWFucyBubyBETUEuIEhhcmRjb2RlZCB0byA2IChITEQ9Nm1zLCB1c2UgRE1BKS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIG1heF9kdHI7CQkvKiBTdGVwIHJhdGUsIHVzZWMgKi8KKwl1bnNpZ25lZCBsb25nIGhsdDsgICAgIAkJLyogSGVhZCBsb2FkL3NldHRsZSB0aW1lLCBtc2VjICovCisJdW5zaWduZWQgbG9uZyBodXQ7ICAgICAJCS8qIEhlYWQgdW5sb2FkIHRpbWUgKHJlbW5hbnQgb2YgCisJCQkJCSAqIDgiIGRyaXZlcykgKi8KKwl1bnNpZ25lZCBsb25nIHNydDsgICAgIAkJLyogU3RlcCByYXRlLCB1c2VjICovCisKKwl1bnNpZ25lZCBsb25nIHNwaW51cDsJCS8qIHRpbWUgbmVlZGVkIGZvciBzcGludXAgKGV4cHJlc3NlZAorCQkJCQkgKiBpbiBqaWZmaWVzKSAqLworCXVuc2lnbmVkIGxvbmcgc3BpbmRvd247CQkvKiB0aW1lb3V0IG5lZWRlZCBmb3Igc3BpbmRvd24gKi8KKwl1bnNpZ25lZCBjaGFyIHNwaW5kb3duX29mZnNldDsJLyogZGVjaWRlcyBpbiB3aGljaCBwb3NpdGlvbiB0aGUgZGlzaworCQkJCQkgKiB3aWxsIHN0b3AgKi8KKwl1bnNpZ25lZCBjaGFyIHNlbGVjdF9kZWxheTsJLyogZGVsYXkgdG8gd2FpdCBhZnRlciBzZWxlY3QgKi8KKwl1bnNpZ25lZCBjaGFyIHJwczsJCS8qIHJvdGF0aW9ucyBwZXIgc2Vjb25kICovCisJdW5zaWduZWQgY2hhciB0cmFja3M7CQkvKiBtYXhpbXVtIG51bWJlciBvZiB0cmFja3MgKi8KKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CQkvKiB0aW1lb3V0IGZvciBpbnRlcnJ1cHQgcmVxdWVzdHMgKi8KKwkKKwl1bnNpZ25lZCBjaGFyIGludGVybGVhdmVfc2VjdDsJLyogaWYgdGhlcmUgYXJlIG1vcmUgc2VjdG9ycywgdXNlIAorCQkJCQkgKiBpbnRlcmxlYXZlICovCisJCisJc3RydWN0IGZsb3BweV9tYXhfZXJyb3JzIG1heF9lcnJvcnM7CisJCisJY2hhciBmbGFnczsJCQkvKiB2YXJpb3VzIGZsYWdzLCBpbmNsdWRpbmcgZnRkX21zZyAqLworLyoKKyAqIEFubm91bmNlIHN1Y2Nlc3NmdWwgbWVkaWEgdHlwZSBkZXRlY3Rpb24gYW5kIG1lZGlhIGluZm9ybWF0aW9uIGxvc3MgYWZ0ZXIKKyAqIGRpc2sgY2hhbmdlcy4KKyAqIEFsc28gdXNlZCB0byBlbmFibGUvZGlzYWJsZSBwcmludGluZyBvZiBvdmVycnVuIHdhcm5pbmdzLgorICovCisKKyNkZWZpbmUgRlREX01TRyAweDEwCisjZGVmaW5lIEZEX0JST0tFTl9EQ0wgMHgyMAorI2RlZmluZSBGRF9ERUJVRyAweDAyCisjZGVmaW5lIEZEX1NJTEVOVF9EQ0xfQ0xFQVIgMHg0CisjZGVmaW5lIEZEX0lOVkVSVEVEX0RDTCAweDgwIC8qIG11c3QgYmUgMHg4MCwgYmVjYXVzZSBvZiBoYXJkd2FyZSAKKwkJCQljb25zaWRlcmF0aW9ucyAqLworCisJY2hhciByZWFkX3RyYWNrOwkJLyogdXNlIHJlYWR0cmFjayBkdXJpbmcgcHJvYmluZz8gKi8KKworLyoKKyAqIEF1dG8tZGV0ZWN0aW9uLiBFYWNoIGRyaXZlIHR5cGUgaGFzIGVpZ2h0IGZvcm1hdHMgd2hpY2ggYXJlCisgKiB1c2VkIGluIHN1Y2Nlc3Npb24gdG8gdHJ5IHRvIHJlYWQgdGhlIGRpc2suIElmIHRoZSBGREMgY2Fubm90IGxvY2sgb250bworICogdGhlIGRpc2ssIHRoZSBuZXh0IGZvcm1hdCBpcyB0cmllZC4gVGhpcyB1c2VzIHRoZSB2YXJpYWJsZSAncHJvYmluZycuCisgKi8KKwlzaG9ydCBhdXRvZGV0ZWN0WzhdOwkJLyogYXV0b2RldGVjdGVkIGZvcm1hdHMgKi8KKwkKKwlpbnQgY2hlY2tmcmVxOyAvKiBob3cgb2Z0ZW4gc2hvdWxkIHRoZSBkcml2ZSBiZSBjaGVja2VkIGZvciBkaXNrIAorCQkJKiBjaGFuZ2VzICovCisJaW50IG5hdGl2ZV9mb3JtYXQ7IC8qIG5hdGl2ZSBmb3JtYXQgb2YgdGhpcyBkcml2ZSAqLworfTsKKworZW51bSB7CisJRkRfTkVFRF9UV0FERExFX0JJVCwJLyogbW9yZSBtYWdpYyAqLworCUZEX1ZFUklGWV9CSVQsCQkvKiBpbnF1aXJlIGZvciB3cml0ZSBwcm90ZWN0aW9uICovCisJRkRfRElTS19ORVdDSEFOR0VfQklULAkvKiBjaGFuZ2UgZGV0ZWN0ZWQsIGFuZCBubyBhY3Rpb24gdW5kZXJ0YWtlbiB5ZXQKKwkJCQkgKiB0byBjbGVhciBtZWRpYSBjaGFuZ2Ugc3RhdHVzICovCisJRkRfVU5VU0VEX0JJVCwKKwlGRF9ESVNLX0NIQU5HRURfQklULAkvKiBkaXNrIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgbGFzdCBpL28gKi8KKwlGRF9ESVNLX1dSSVRBQkxFX0JJVAkvKiBkaXNrIGlzIHdyaXRhYmxlICovCit9OworCisjZGVmaW5lIEZEU0VURFJWUFJNIF9JT1coMiwgMHg5MCwgc3RydWN0IGZsb3BweV9kcml2ZV9wYXJhbXMpCisjZGVmaW5lIEZER0VURFJWUFJNIF9JT1IoMiwgMHgxMSwgc3RydWN0IGZsb3BweV9kcml2ZV9wYXJhbXMpCisvKiBzZXQvZ2V0IGRyaXZlIHBhcmFtZXRlcnMgKi8KKworCisvKgorICogQ3VycmVudCBkcml2ZSBzdGF0ZSAobm90IGRpcmVjdGx5IG1vZGlmaWFibGUgYnkgdXNlciwgcmVhZG9ubHkpCisgKi8KK3N0cnVjdCBmbG9wcHlfZHJpdmVfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworLyogdmFsdWVzIGZvciB0aGVzZSBmbGFncyAqLworI2RlZmluZSBGRF9ORUVEX1RXQURETEUgKDEgPDwgRkRfTkVFRF9UV0FERExFX0JJVCkKKyNkZWZpbmUgRkRfVkVSSUZZICgxIDw8IEZEX1ZFUklGWV9CSVQpCisjZGVmaW5lIEZEX0RJU0tfTkVXQ0hBTkdFICgxIDw8IEZEX0RJU0tfTkVXQ0hBTkdFX0JJVCkKKyNkZWZpbmUgRkRfRElTS19DSEFOR0VEICgxIDw8IEZEX0RJU0tfQ0hBTkdFRF9CSVQpCisjZGVmaW5lIEZEX0RJU0tfV1JJVEFCTEUgKDEgPDwgRkRfRElTS19XUklUQUJMRV9CSVQpCisKKwl1bnNpZ25lZCBsb25nIHNwaW51cF9kYXRlOworCXVuc2lnbmVkIGxvbmcgc2VsZWN0X2RhdGU7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9yZWFkX2RhdGU7CisJc2hvcnQgcHJvYmVkX2Zvcm1hdDsKKwlzaG9ydCB0cmFjazsgLyogY3VycmVudCB0cmFjayAqLworCXNob3J0IG1heGJsb2NrOyAvKiBpZCBvZiBoaWdoZXN0IGJsb2NrIHJlYWQgKi8KKwlzaG9ydCBtYXh0cmFjazsgLyogaWQgb2YgaGlnaGVzdCBoYWxmIHRyYWNrIHJlYWQgKi8KKwlpbnQgZ2VuZXJhdGlvbjsgLyogaG93IG1hbnkgZGlza2NoYW5nZXM/ICovCisKKy8qCisgKiAoVXNlci1wcm92aWRlZCkgbWVkaWEgaW5mb3JtYXRpb24gaXMgX25vdF8gZGlzY2FyZGVkIGFmdGVyIGEgbWVkaWEgY2hhbmdlCisgKiBpZiB0aGUgY29ycmVzcG9uZGluZyBrZWVwX2RhdGEgZmxhZyBpcyBub24temVyby4gUG9zaXRpdmUgdmFsdWVzIGFyZQorICogZGVjcmVtZW50ZWQgYWZ0ZXIgZWFjaCBwcm9iZS4KKyAqLworCWludCBrZWVwX2RhdGE7CisJCisJLyogUHJldmVudCAiYWxpYXNlZCIgYWNjZXNzZXMuICovCisJaW50IGZkX3JlZjsKKwlpbnQgZmRfZGV2aWNlOworCXVuc2lnbmVkIGxvbmcgbGFzdF9jaGVja2VkOyAvKiB3aGVuIHdhcyB0aGUgZHJpdmUgbGFzdCBjaGVja2VkIGZvciBhIGRpc2sgCisJCQkgICAqIGNoYW5nZT8gKi8KKwkKKwljaGFyICpkbWFidWY7CisJaW50IGJ1ZmJsb2NrczsKK307CisKKyNkZWZpbmUgRkRHRVREUlZTVEFUIF9JT1IoMiwgMHgxMiwgc3RydWN0IGZsb3BweV9kcml2ZV9zdHJ1Y3QpCisjZGVmaW5lIEZEUE9MTERSVlNUQVQgX0lPUigyLCAweDEzLCBzdHJ1Y3QgZmxvcHB5X2RyaXZlX3N0cnVjdCkKKy8qIGdldCBkcml2ZSBzdGF0ZTogR0VUIHJldHVybnMgdGhlIGNhY2hlZCBzdGF0ZSwgUE9MTCBwb2xscyBmb3IgbmV3IHN0YXRlICovCisKKworLyoKKyAqIHJlc2V0IEZEQworICovCitlbnVtIHJlc2V0X21vZGUgeworCUZEX1JFU0VUX0lGX05FRURFRCwJLyogcmVzZXQgb25seSBpZiB0aGUgcmVzZXQgZmxhZ3MgaXMgc2V0ICovCisJRkRfUkVTRVRfSUZfUkFXQ01ELAkvKiBvYnNvbGV0ZSAqLworCUZEX1JFU0VUX0FMV0FZUwkJLyogcmVzZXQgYWx3YXlzICovCit9OworI2RlZmluZSBGRFJFU0VUIF9JTygyLCAweDU0KQorCisKKy8qCisgKiBGREMgc3RhdGUKKyAqLworc3RydWN0IGZsb3BweV9mZGNfc3RhdGUgewkKKwlpbnQgc3BlYzE7CQkvKiBzcGVjMSB2YWx1ZSBsYXN0IHVzZWQgKi8KKwlpbnQgc3BlYzI7CQkvKiBzcGVjMiB2YWx1ZSBsYXN0IHVzZWQgKi8KKwlpbnQgZHRyOworCXVuc2lnbmVkIGNoYXIgdmVyc2lvbjsJLyogRkRDIHZlcnNpb24gY29kZSAqLworCXVuc2lnbmVkIGNoYXIgZG9yOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsJLyogaW8gYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCByYXdjbWQ6MjsKKwl1bnNpZ25lZCBpbnQgcmVzZXQ6MTsKKwl1bnNpZ25lZCBpbnQgbmVlZF9jb25maWd1cmU6MTsKKwl1bnNpZ25lZCBpbnQgcGVycF9tb2RlOjI7CisJdW5zaWduZWQgaW50IGhhc19maWZvOjE7CisJdW5zaWduZWQgaW50IGRyaXZlcl92ZXJzaW9uOwkvKiB2ZXJzaW9uIGNvZGUgZm9yIGZsb3BweSBkcml2ZXIgKi8KKyNkZWZpbmUgRkRfRFJJVkVSX1ZFUlNJT04gMHgxMDAKKy8qIHVzZXIgcHJvZ3JhbXMgdXNpbmcgdGhlIGZsb3BweSBBUEkgc2hvdWxkIHVzZSBmbG9wcHlfZmRjX3N0YXRlIHRvCisgKiBnZXQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBmbG9wcHkgZHJpdmVyIHRoYXQgdGhleSBhcmUgcnVubmluZworICogb24uIElmIHRoaXMgdmVyc2lvbiBudW1iZXIgaXMgYmlnZ2VyIHRoYW4gdGhlIG9uZSBjb21waWxlZCBpbnRvIHRoZQorICogdXNlciBwcm9ncmFtICh0aGUgRkRfRFJJVkVSX1ZFUlNJT04gZGVmaW5lKSwgaXQgc2hvdWxkIGJlIHByZXBhcmVkCisgKiB0byBiaWdnZXIgc3RydWN0dXJlcworICovCisKKwl1bnNpZ25lZCBjaGFyIHRyYWNrWzRdOworCS8qIFBvc2l0aW9uIG9mIHRoZSBoZWFkcyBvZiB0aGUgNCB1bml0cyBhdHRhY2hlZCB0byB0aGlzIEZEQywKKwkgKiBhcyBzdG9yZWQgb24gdGhlIEZEQy4gSW4gdGhlIGZ1dHVyZSwgdGhlIHBvc2l0aW9uIGFzIHN0b3JlZAorCSAqIG9uIHRoZSBGREMgbWlnaHQgbm90IGFncmVlIHdpdGggdGhlIGFjdHVhbCBwaHlzaWNhbAorCSAqIHBvc2l0aW9uIG9mIHRoZXNlIGRyaXZlIGhlYWRzLiBCeSBhbGxvd2luZyBzdWNoCisJICogZGlzYWdyZWVtZW50LCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIHJlc2V0IHRoZSBGREMgd2l0aG91dAorCSAqIGluY3VycmluZyB0aGUgZXhwZW5zaXZlIGNvc3Qgb2YgcmVwb3NpdGlvbmluZyBhbGwgaGVhZHMuCisJICogUmlnaHQgbm93LCB0aGVzZSBwb3NpdGlvbnMgYXJlIGhhcmQgd2lyZWQgdG8gMC4gKi8KKworfTsKKworI2RlZmluZSBGREdFVEZEQ1NUQVQgX0lPUigyLCAweDE1LCBzdHJ1Y3QgZmxvcHB5X2ZkY19zdGF0ZSkKKworCisvKgorICogQXN5bmNocm9ub3VzIFdyaXRlIGVycm9yIHRyYWNraW5nCisgKi8KK3N0cnVjdCBmbG9wcHlfd3JpdGVfZXJyb3JzIHsKKwkvKiBXcml0ZSBlcnJvciBsb2dnaW5nLgorCSAqCisJICogVGhlc2UgZmllbGRzIGNhbiBiZSBjbGVhcmVkIHdpdGggdGhlIEZEV0VSUk9SQ0xSIGlvY3RsLgorCSAqIE9ubHkgd3JpdGVzIHRoYXQgd2VyZSBhdHRlbXB0ZWQgYnV0IGZhaWxlZCBkdWUgdG8gYSBwaHlzaWNhbCBtZWRpYQorCSAqIGVycm9yIGFyZSBsb2dnZWQuICB3cml0ZSgyKSBjYWxscyB0aGF0IGZhaWwgYW5kIHJldHVybiBhbiBlcnJvciBjb2RlCisJICogdG8gdGhlIHVzZXIgcHJvY2VzcyBhcmUgbm90IGNvdW50ZWQuCisJICovCisKKwl1bnNpZ25lZCBpbnQgd3JpdGVfZXJyb3JzOyAgLyogbnVtYmVyIG9mIHBoeXNpY2FsIHdyaXRlIGVycm9ycyAKKwkJCQkgICAgICogZW5jb3VudGVyZWQgKi8KKwkKKwkvKiBwb3NpdGlvbiBvZiBmaXJzdCBhbmQgbGFzdCB3cml0ZSBlcnJvcnMgKi8KKwl1bnNpZ25lZCBsb25nIGZpcnN0X2Vycm9yX3NlY3RvcjsKKwlpbnQgICAgICAgICAgIGZpcnN0X2Vycm9yX2dlbmVyYXRpb247CisJdW5zaWduZWQgbG9uZyBsYXN0X2Vycm9yX3NlY3RvcjsKKwlpbnQgICAgICAgICAgIGxhc3RfZXJyb3JfZ2VuZXJhdGlvbjsKKwkKKwl1bnNpZ25lZCBpbnQgYmFkbmVzczsgLyogaGlnaGVzdCByZXRyeSBjb3VudCBmb3IgYSByZWFkIG9yIHdyaXRlIAorCQkJICAgICAgICogb3BlcmF0aW9uICovCit9OworCisjZGVmaW5lIEZEV0VSUk9SQ0xSICBfSU8oMiwgMHg1NikKKy8qIGNsZWFyIHdyaXRlIGVycm9yIGFuZCBiYWRuZXNzIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEZEV0VSUk9SR0VUICBfSU9SKDIsIDB4MTcsIHN0cnVjdCBmbG9wcHlfd3JpdGVfZXJyb3JzKQorLyogZ2V0IHdyaXRlIGVycm9yIGFuZCBiYWRuZXNzIGluZm9ybWF0aW9uICovCisKKworLyoKKyAqIFJhdyBjb21tYW5kcworICovCisvKiBuZXcgaW50ZXJmYWNlIGZsYWc6IG5vdyB3ZSBjYW4gZG8gdGhlbSBpbiBiYXRjaGVzICovCisjZGVmaW5lIEZESEFWRUJBVENIRURSQVdDTUQKKworc3RydWN0IGZsb3BweV9yYXdfY21kIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisjZGVmaW5lIEZEX1JBV19SRUFEIDEKKyNkZWZpbmUgRkRfUkFXX1dSSVRFIDIKKyNkZWZpbmUgRkRfUkFXX05PX01PVE9SIDQKKyNkZWZpbmUgRkRfUkFXX0RJU0tfQ0hBTkdFIDQgLyogb3V0OiBkaXNrIGNoYW5nZSBmbGFnIHdhcyBzZXQgKi8KKyNkZWZpbmUgRkRfUkFXX0lOVFIgOCAgICAvKiB3YWl0IGZvciBhbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRkRfUkFXX1NQSU4gMHgxMCAvKiBzcGluIHVwIHRoZSBkaXNrIGZvciB0aGlzIGNvbW1hbmQgKi8KKyNkZWZpbmUgRkRfUkFXX05PX01PVE9SX0FGVEVSIDB4MjAgLyogc3dpdGNoIHRoZSBtb3RvciBvZmYgYWZ0ZXIgY29tbWFuZCAKKwkJCQkgICAgKiBjb21wbGV0aW9uICovCisjZGVmaW5lIEZEX1JBV19ORUVEX0RJU0sgMHg0MCAgLyogdGhpcyBjb21tYW5kIG5lZWRzIGEgZGlzayB0byBiZSBwcmVzZW50ICovCisjZGVmaW5lIEZEX1JBV19ORUVEX1NFRUsgMHg4MCAgLyogdGhpcyBjb21tYW5kIHVzZXMgYW4gaW1wbGllZCBzZWVrIChzb2Z0KSAqLworCisvKiBtb3JlICJpbiIgZmxhZ3MgKi8KKyNkZWZpbmUgRkRfUkFXX01PUkUgMHgxMDAgIC8qIG1vcmUgcmVjb3JkcyBmb2xsb3cgKi8KKyNkZWZpbmUgRkRfUkFXX1NUT1BfSUZfRkFJTFVSRSAweDIwMCAvKiBzdG9wIGlmIHdlIGVuY291bnRlciBhIGZhaWx1cmUgKi8KKyNkZWZpbmUgRkRfUkFXX1NUT1BfSUZfU1VDQ0VTUyAweDQwMCAvKiBzdG9wIGlmIGNvbW1hbmQgc3VjY2Vzc2Z1bCAqLworI2RlZmluZSBGRF9SQVdfU09GVEZBSUxVUkUgMHg4MDAgLyogY29uc2lkZXIgdGhlIHJldHVybiB2YWx1ZSBmb3IgZmFpbHVyZQorCQkJCSAgKiBkZXRlY3Rpb24gdG9vICovCisKKy8qIG1vcmUgIm91dCIgZmxhZ3MgKi8KKyNkZWZpbmUgRkRfUkFXX0ZBSUxVUkUgMHgxMDAwMCAvKiBjb21tYW5kIHNlbnQgdG8gZmRjLCBmZGMgcmV0dXJuZWQgZXJyb3IgKi8KKyNkZWZpbmUgRkRfUkFXX0hBUkRGQUlMVVJFIDB4MjAwMDAgLyogZmRjIGhhZCB0byBiZSByZXNldCwgb3IgdGltZWQgb3V0ICovCisKKwl2b2lkICpkYXRhOworCWNoYXIgKmtlcm5lbF9kYXRhOyAvKiBsb2NhdGlvbiBvZiBkYXRhIGJ1ZmZlciBpbiB0aGUga2VybmVsICovCisJc3RydWN0IGZsb3BweV9yYXdfY21kICpuZXh0OyAvKiB1c2VkIGZvciBjaGFpbmluZyBvZiByYXcgY21kJ3MgCisJCQkJICAgICAgKiB3aXRoaW4gdGhlIGtlcm5lbCAqLworCWxvbmcgbGVuZ3RoOyAvKiBpbjogbGVuZ3RoIG9mIGRtYSB0cmFuc2Zlci4gb3V0OiByZW1haW5pbmcgYnl0ZXMgKi8KKwlsb25nIHBoeXNfbGVuZ3RoOyAvKiBwaHlzaWNhbCBsZW5ndGgsIGlmIGRpZmZlcmVudCBmcm9tIGRtYSBsZW5ndGggKi8KKwlpbnQgYnVmZmVyX2xlbmd0aDsgLyogbGVuZ3RoIG9mIGFsbG9jYXRlZCBidWZmZXIgKi8KKworCXVuc2lnbmVkIGNoYXIgcmF0ZTsKKwl1bnNpZ25lZCBjaGFyIGNtZF9jb3VudDsKKwl1bnNpZ25lZCBjaGFyIGNtZFsxNl07CisJdW5zaWduZWQgY2hhciByZXBseV9jb3VudDsKKwl1bnNpZ25lZCBjaGFyIHJlcGx5WzE2XTsKKwlpbnQgdHJhY2s7CisJaW50IHJlc3VsdGNvZGU7CisKKwlpbnQgcmVzZXJ2ZWQxOworCWludCByZXNlcnZlZDI7Cit9OworCisjZGVmaW5lIEZEUkFXQ01EIF9JTygyLCAweDU4KQorLyogc2VuZCBhIHJhdyBjb21tYW5kIHRvIHRoZSBmZGMuIFN0cnVjdHVyZSBzaXplIG5vdCBpbmNsdWRlZCwgYmVjYXVzZSBvZgorICogYmF0Y2hlcyAqLworCisjZGVmaW5lIEZEVFdBRERMRSBfSU8oMiwgMHg1OSkKKy8qIGZsaWNrZXIgbW90b3Itb24gYml0IGJlZm9yZSByZWFkaW5nIGEgc2VjdG9yLiBFeHBlcmltZW50YWwgKi8KKworCisjZGVmaW5lIEZERUpFQ1QgX0lPKDIsIDB4NWEpCisvKiBlamVjdCB0aGUgZGlzayAqLworCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZkcmVnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZkcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFjZTY0MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmRyZWcuaApAQCAtMCwwICsxLDEzNyBAQAorI2lmbmRlZiBfTElOVVhfRkRSRUdfSAorI2RlZmluZSBfTElOVVhfRkRSRUdfSAorLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGRlZmluZXMgZm9yIHRoZSBmbG9wcHkgZGlzayBjb250cm9sbGVyLgorICogVmFyaW91cyBzb3VyY2VzLiBNb3N0bHkgIklCTSBNaWNyb2NvbXB1dGVyczogQSBQcm9ncmFtbWVycworICogSGFuZGJvb2siLCBTYW5jaGVzIGFuZCBDYW50b24uCisgKi8KKworI2lmZGVmIEZEUEFUQ0hFUworI2RlZmluZSBGRF9JT1BPUlQgZmRjX3N0YXRlW2ZkY10uYWRkcmVzcworI2Vsc2UKKy8qIEl0IHdvdWxkIGJlIGEgbG90IHNhbmVyIGp1c3QgdG8gZm9yY2UgZmRjX3N0YXRlW2ZkY10uYWRkcmVzcyB0byBhbHdheXMKKyAgIGJlIHNldCAhIEZJWE1FICovCisjZGVmaW5lIEZEX0lPUE9SVCAweDNmMAorI2VuZGlmCisKKy8qIEZkIGNvbnRyb2xsZXIgcmVncy4gUyZDLCBhYm91dCBwYWdlIDM0MCAqLworI2RlZmluZSBGRF9TVEFUVVMJKDQgKyBGRF9JT1BPUlQgKQorI2RlZmluZSBGRF9EQVRBCQkoNSArIEZEX0lPUE9SVCApCisKKy8qIERpZ2l0YWwgT3V0cHV0IFJlZ2lzdGVyICovCisjZGVmaW5lIEZEX0RPUgkJKDIgKyBGRF9JT1BPUlQgKQorCisvKiBEaWdpdGFsIElucHV0IFJlZ2lzdGVyIChyZWFkKSAqLworI2RlZmluZSBGRF9ESVIJCSg3ICsgRkRfSU9QT1JUICkKKworLyogRGlza2V0dGUgQ29udHJvbCBSZWdpc3RlciAod3JpdGUpKi8KKyNkZWZpbmUgRkRfRENSCQkoNyArIEZEX0lPUE9SVCApCisKKy8qIEJpdHMgb2YgbWFpbiBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1RBVFVTX0JVU1lNQVNLCTB4MEYJCS8qIGRyaXZlIGJ1c3kgbWFzayAqLworI2RlZmluZSBTVEFUVVNfQlVTWQkweDEwCQkvKiBGREMgYnVzeSAqLworI2RlZmluZSBTVEFUVVNfRE1BCTB4MjAJCS8qIDAtIERNQSBtb2RlICovCisjZGVmaW5lIFNUQVRVU19ESVIJMHg0MAkJLyogMC0gY3B1LT5mZGMgKi8KKyNkZWZpbmUgU1RBVFVTX1JFQURZCTB4ODAJCS8qIERhdGEgcmVnIHJlYWR5ICovCisKKy8qIEJpdHMgb2YgRkRfU1QwICovCisjZGVmaW5lIFNUMF9EUwkJMHgwMwkJLyogZHJpdmUgc2VsZWN0IG1hc2sgKi8KKyNkZWZpbmUgU1QwX0hBCQkweDA0CQkvKiBIZWFkIChBZGRyZXNzKSAqLworI2RlZmluZSBTVDBfTlIJCTB4MDgJCS8qIE5vdCBSZWFkeSAqLworI2RlZmluZSBTVDBfRUNFCQkweDEwCQkvKiBFcXVpcG1lbnQgY2hlY2sgZXJyb3IgKi8KKyNkZWZpbmUgU1QwX1NFCQkweDIwCQkvKiBTZWVrIGVuZCAqLworI2RlZmluZSBTVDBfSU5UUgkweEMwCQkvKiBJbnRlcnJ1cHQgY29kZSBtYXNrICovCisKKy8qIEJpdHMgb2YgRkRfU1QxICovCisjZGVmaW5lIFNUMV9NQU0JCTB4MDEJCS8qIE1pc3NpbmcgQWRkcmVzcyBNYXJrICovCisjZGVmaW5lIFNUMV9XUAkJMHgwMgkJLyogV3JpdGUgUHJvdGVjdCAqLworI2RlZmluZSBTVDFfTkQJCTB4MDQJCS8qIE5vIERhdGEgLSB1bnJlYWRhYmxlICovCisjZGVmaW5lIFNUMV9PUgkJMHgxMAkJLyogT3ZlclJ1biAqLworI2RlZmluZSBTVDFfQ1JDCQkweDIwCQkvKiBDUkMgZXJyb3IgaW4gZGF0YSBvciBhZGRyICovCisjZGVmaW5lIFNUMV9FT0MJCTB4ODAJCS8qIEVuZCBPZiBDeWxpbmRlciAqLworCisvKiBCaXRzIG9mIEZEX1NUMiAqLworI2RlZmluZSBTVDJfTUFNCQkweDAxCQkvKiBNaXNzaW5nIEFkZHJlc3MgTWFyayAoYWdhaW4pICovCisjZGVmaW5lIFNUMl9CQwkJMHgwMgkJLyogQmFkIEN5bGluZGVyICovCisjZGVmaW5lIFNUMl9TTlMJCTB4MDQJCS8qIFNjYW4gTm90IFNhdGlzZmllZCAqLworI2RlZmluZSBTVDJfU0VICQkweDA4CQkvKiBTY2FuIEVxdWFsIEhpdCAqLworI2RlZmluZSBTVDJfV0MJCTB4MTAJCS8qIFdyb25nIEN5bGluZGVyICovCisjZGVmaW5lIFNUMl9DUkMJCTB4MjAJCS8qIENSQyBlcnJvciBpbiBkYXRhIGZpZWxkICovCisjZGVmaW5lIFNUMl9DTQkJMHg0MAkJLyogQ29udHJvbCBNYXJrID0gZGVsZXRlZCAqLworCisvKiBCaXRzIG9mIEZEX1NUMyAqLworI2RlZmluZSBTVDNfSEEJCTB4MDQJCS8qIEhlYWQgKEFkZHJlc3MpICovCisjZGVmaW5lIFNUM19EUwkJMHgwOAkJLyogZHJpdmUgaXMgZG91YmxlLXNpZGVkICovCisjZGVmaW5lIFNUM19UWgkJMHgxMAkJLyogVHJhY2sgWmVybyBzaWduYWwgKDE9dHJhY2sgMCkgKi8KKyNkZWZpbmUgU1QzX1JZCQkweDIwCQkvKiBkcml2ZSBpcyByZWFkeSAqLworI2RlZmluZSBTVDNfV1AJCTB4NDAJCS8qIFdyaXRlIFByb3RlY3QgKi8KKyNkZWZpbmUgU1QzX0ZUCQkweDgwCQkvKiBEcml2ZSBGYXVsdCAqLworCisvKiBWYWx1ZXMgZm9yIEZEX0NPTU1BTkQgKi8KKyNkZWZpbmUgRkRfUkVDQUxJQlJBVEUJCTB4MDcJLyogbW92ZSB0byB0cmFjayAwICovCisjZGVmaW5lIEZEX1NFRUsJCQkweDBGCS8qIHNlZWsgdHJhY2sgKi8KKyNkZWZpbmUgRkRfUkVBRAkJCTB4RTYJLyogcmVhZCB3aXRoIE1ULCBNRk0sIFNLaXAgZGVsZXRlZCAqLworI2RlZmluZSBGRF9XUklURQkJMHhDNQkvKiB3cml0ZSB3aXRoIE1ULCBNRk0gKi8KKyNkZWZpbmUgRkRfU0VOU0VJCQkweDA4CS8qIFNlbnNlIEludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgRkRfU1BFQ0lGWQkJMHgwMwkvKiBzcGVjaWZ5IEhVVCBldGMgKi8KKyNkZWZpbmUgRkRfRk9STUFUCQkweDRECS8qIGZvcm1hdCBvbmUgdHJhY2sgKi8KKyNkZWZpbmUgRkRfVkVSU0lPTgkJMHgxMAkvKiBnZXQgdmVyc2lvbiBjb2RlICovCisjZGVmaW5lIEZEX0NPTkZJR1VSRQkJMHgxMwkvKiBjb25maWd1cmUgRklGTyBvcGVyYXRpb24gKi8KKyNkZWZpbmUgRkRfUEVSUEVORElDVUxBUgkweDEyCS8qIHBlcnBlbmRpY3VsYXIgci93IG1vZGUgKi8KKyNkZWZpbmUgRkRfR0VUU1RBVFVTCQkweDA0CS8qIHJlYWQgU1QzICovCisjZGVmaW5lIEZEX0RVTVBSRUdTCQkweDBFCS8qIGR1bXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBmZGMgcmVncyAqLworI2RlZmluZSBGRF9SRUFESUQJCTB4RUEJLyogcHJpbnRzIHRoZSBoZWFkZXIgb2YgYSBzZWN0b3IgKi8KKyNkZWZpbmUgRkRfVU5MT0NLCQkweDE0CS8qIEZpZm8gY29uZmlnIHVubG9jayAqLworI2RlZmluZSBGRF9MT0NLCQkJMHg5NAkvKiBGaWZvIGNvbmZpZyBsb2NrICovCisjZGVmaW5lIEZEX1JTRUVLX09VVAkJMHg4ZgkvKiBzZWVrIG91dCAoaS5lLiB0byBsb3dlciB0cmFja3MpICovCisjZGVmaW5lIEZEX1JTRUVLX0lOCQkweGNmCS8qIHNlZWsgaW4gKGkuZS4gdG8gaGlnaGVyIHRyYWNrcykgKi8KKworLyogdGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgbmV3IGluIHRoZSA4MjA3OC4gVGhleSBhcmUgbm90IHVzZWQgaW4gdGhlCisgKiBmbG9wcHkgZHJpdmVyLCBleGNlcHQgdGhlIGZpcnN0IHRocmVlLiBUaGVzZSBjb21tYW5kcyBtYXkgYmUgdXNlZnVsIGZvciBhcHBzCisgKiB3aGljaCB1c2UgdGhlIEZEUkFXQ01EIGludGVyZmFjZS4gRm9yIGRvYywgZ2V0IHRoZSA4MjA3OCBzcGVjIHNoZWV0cyBhdAorICogaHR0cDovL3d3dy5pbnRlbC5jb20vZGVzaWduL2FyY2hpdmVzL3BlcmlwaHJsL2RvY3MvMjkwNDY4MDMuaHRtICovCisKKyNkZWZpbmUgRkRfUEFSVElECQkweDE4CS8qIHBhcnQgaWQgKCJleHRlbmRlZCIgdmVyc2lvbiBjbWQpICovCisjZGVmaW5lIEZEX1NBVkUJCQkweDJlCS8qIHNhdmUgZmRjIHJlZ3MgZm9yIGxhdGVyIHJlc3RvcmUgKi8KKyNkZWZpbmUgRkRfRFJJVkVTUEVDCQkweDhlCS8qIGRyaXZlIHNwZWNpZmljYXRpb246IEFjY2VzcyB0byB0aGUKKwkJCQkJICogMiBNYnBzIGRhdGEgdHJhbnNmZXIgcmF0ZSBmb3IgdGFwZQorCQkJCQkgKiBkcml2ZXMgKi8KKworI2RlZmluZSBGRF9SRVNUT1JFCQkweDRlICAgIC8qIGxhdGVyIHJlc3RvcmUgKi8KKyNkZWZpbmUgRkRfUE9XRVJET1dOCQkweDI3CS8qIGNvbmZpZ3VyZSBGREMncyBwb3dlcnNhdmUgZmVhdHVyZXMgKi8KKyNkZWZpbmUgRkRfRk9STUFUX05fV1JJVEUJMHhlZiAgICAvKiBmb3JtYXQgYW5kIHdyaXRlIGluIG9uZSBnby4gKi8KKyNkZWZpbmUgRkRfT1BUSU9OCQkweDMzCS8qIElTTyBmb3JtYXQgKHdoaWNoIGlzIGEgY2xlYW4gd2F5IHRvCisJCQkJCSAqIHBhY2sgbW9yZSBzZWN0b3JzIG9uIGEgdHJhY2spICovCisKKy8qIERNQSBjb21tYW5kcyAqLworI2RlZmluZSBETUFfUkVBRAkweDQ2CisjZGVmaW5lIERNQV9XUklURQkweDRBCisKKy8qIEZEQyB2ZXJzaW9uIHJldHVybiB0eXBlcyAqLworI2RlZmluZSBGRENfTk9ORQkweDAwCisjZGVmaW5lIEZEQ19VTktOT1dOCTB4MTAJLyogRE8gTk9UIFVTRSBUSElTIFRZUEUgRVhDRVBUIElGIElERU5USUZJQ0FUSU9OCisJCQkJICAgRkFJTFMgRUFSTFkgKi8KKyNkZWZpbmUgRkRDXzgyNzJBCTB4MjAJLyogSW50ZWwgODI3MmEsIE5FQyA3NjUgKi8KKyNkZWZpbmUgRkRDXzc2NUVECTB4MzAJLyogTm9uLUludGVsIDFNQi1jb21wYXRpYmxlIEZEQywgY2FuJ3QgZGV0ZWN0ICovCisjZGVmaW5lIEZEQ184MjA3MgkweDQwCS8qIEludGVsIDgyMDcyOyA4MjcyYSArIEZJRk8gKyBEVU1QUkVHUyAqLworI2RlZmluZSBGRENfODIwNzJBCTB4NDUJLyogODIwNzJBIChvbiBTcGFyY3MpICovCisjZGVmaW5lIEZEQ184MjA3N19PUklHCTB4NTEJLyogT3JpZ2luYWwgdmVyc2lvbiBvZiA4MjA3N0FBLCBzYW5zIExPQ0sgKi8KKyNkZWZpbmUgRkRDXzgyMDc3CTB4NTIJLyogODIwNzdBQS0xICovCisjZGVmaW5lIEZEQ184MjA3OF9VTktOCTB4NWYJLyogVW5rbm93biA4MjA3OCB2YXJpYW50ICovCisjZGVmaW5lIEZEQ184MjA3OAkweDYwCS8qIDQ0cGluIDgyMDc4IG9yIDY0cGluIDgyMDc4U0wgKi8KKyNkZWZpbmUgRkRDXzgyMDc4XzEJMHg2MQkvKiA4MjA3OC0xICgyTWJwcyBmZGMpICovCisjZGVmaW5lIEZEQ19TODIwNzhCCTB4NjIJLyogUzgyMDc4QiAoZmlyc3Qgc2VlbiBvbiBBZGFwdGVjIEFWQS0yODI1IFZMQgorCQkJCSAqIFNDU0kvRUlERS9GbG9wcHkgY29udHJvbGxlcikgKi8KKyNkZWZpbmUgRkRDXzg3MzA2CTB4NjMJLyogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQyA4NzMwNiAqLworCisvKgorICogQmV3YXJlOiB0aGUgZmRjIHR5cGUgbGlzdCBpcyByb3VnaGx5IHNvcnRlZCBieSBpbmNyZWFzaW5nIGZlYXR1cmVzLgorICogUHJlc2VuY2Ugb2YgZmVhdHVyZXMgaXMgdGVzdGVkIGJ5IGNvbXBhcmluZyB0aGUgRkRDIHZlcnNpb24gaWQgd2l0aCB0aGUKKyAqICJvbGRlc3QiIHZlcnNpb24gdGhhdCBoYXMgdGhlIG5lZWRlZCBmZWF0dXJlLgorICogSWYgZHVyaW5nIEZEQyBkZXRlY3Rpb24sIGFuIG9ic2N1cmUgdGVzdCBmYWlscyBsYXRlIGluIHRoZSBzZXF1ZW5jZSwgZG9uJ3QKKyAqIGFzc2lnbiBGRENfVU5LTk9XTi4gRWxzZSB0aGUgRkRDIHdpbGwgYmUgdHJlYXRlZCBhcyBhIGR1bWIgODI3MmEsIG9yIHdvcnNlLgorICogVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgaWYgdGhlIHRlc3RzIGFyZSB1bm5lZWRlZC4KKyAqLworCisjZGVmaW5lIEZEX1JFU0VUX0RFTEFZIDIwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmliX3J1bGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpYl9ydWxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZGE2NWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpYl9ydWxlcy5oCkBAIC0wLDAgKzEsNzIgQEAKKyNpZm5kZWYgX19MSU5VWF9GSUJfUlVMRVNfSAorI2RlZmluZSBfX0xJTlVYX0ZJQl9SVUxFU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorCisvKiBydWxlIGlzIHBlcm1hbmVudCwgYW5kIGNhbm5vdCBiZSBkZWxldGVkICovCisjZGVmaW5lIEZJQl9SVUxFX1BFUk1BTkVOVAkweDAwMDAwMDAxCisjZGVmaW5lIEZJQl9SVUxFX0lOVkVSVAkJMHgwMDAwMDAwMgorI2RlZmluZSBGSUJfUlVMRV9VTlJFU09MVkVECTB4MDAwMDAwMDQKKyNkZWZpbmUgRklCX1JVTEVfSUlGX0RFVEFDSEVECTB4MDAwMDAwMDgKKyNkZWZpbmUgRklCX1JVTEVfREVWX0RFVEFDSEVECUZJQl9SVUxFX0lJRl9ERVRBQ0hFRAorI2RlZmluZSBGSUJfUlVMRV9PSUZfREVUQUNIRUQJMHgwMDAwMDAxMAorCisvKiB0cnkgdG8gZmluZCBzb3VyY2UgYWRkcmVzcyBpbiByb3V0aW5nIGxvb2t1cHMgKi8KKyNkZWZpbmUgRklCX1JVTEVfRklORF9TQUREUgkweDAwMDEwMDAwCisKK3N0cnVjdCBmaWJfcnVsZV9oZHIgeworCV9fdTgJCWZhbWlseTsKKwlfX3U4CQlkc3RfbGVuOworCV9fdTgJCXNyY19sZW47CisJX191OAkJdG9zOworCisJX191OAkJdGFibGU7CisJX191OAkJcmVzMTsJLyogcmVzZXJ2ZWQgKi8KKwlfX3U4CQlyZXMyOwkvKiByZXNlcnZlZCAqLworCV9fdTgJCWFjdGlvbjsKKworCV9fdTMyCQlmbGFnczsKK307CisKK2VudW0geworCUZSQV9VTlNQRUMsCisJRlJBX0RTVCwJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCUZSQV9TUkMsCS8qIHNvdXJjZSBhZGRyZXNzICovCisJRlJBX0lJRk5BTUUsCS8qIGludGVyZmFjZSBuYW1lICovCisjZGVmaW5lIEZSQV9JRk5BTUUJRlJBX0lJRk5BTUUKKwlGUkFfR09UTywJLyogdGFyZ2V0IHRvIGp1bXAgdG8gKEZSX0FDVF9HT1RPKSAqLworCUZSQV9VTlVTRUQyLAorCUZSQV9QUklPUklUWSwJLyogcHJpb3JpdHkvcHJlZmVyZW5jZSAqLworCUZSQV9VTlVTRUQzLAorCUZSQV9VTlVTRUQ0LAorCUZSQV9VTlVTRUQ1LAorCUZSQV9GV01BUkssCS8qIG1hcmsgKi8KKwlGUkFfRkxPVywJLyogZmxvdy9jbGFzcyBpZCAqLworCUZSQV9VTlVTRUQ2LAorCUZSQV9VTlVTRUQ3LAorCUZSQV9VTlVTRUQ4LAorCUZSQV9UQUJMRSwJLyogRXh0ZW5kZWQgdGFibGUgaWQgKi8KKwlGUkFfRldNQVNLLAkvKiBtYXNrIGZvciBuZXRmaWx0ZXIgbWFyayAqLworCUZSQV9PSUZOQU1FLAorCV9fRlJBX01BWAorfTsKKworI2RlZmluZSBGUkFfTUFYIChfX0ZSQV9NQVggLSAxKQorCitlbnVtIHsKKwlGUl9BQ1RfVU5TUEVDLAorCUZSX0FDVF9UT19UQkwsCQkvKiBQYXNzIHRvIGZpeGVkIHRhYmxlICovCisJRlJfQUNUX0dPVE8sCQkvKiBKdW1wIHRvIGFub3RoZXIgcnVsZSAqLworCUZSX0FDVF9OT1AsCQkvKiBObyBvcGVyYXRpb24gKi8KKwlGUl9BQ1RfUkVTMywKKwlGUl9BQ1RfUkVTNCwKKwlGUl9BQ1RfQkxBQ0tIT0xFLAkvKiBEcm9wIHdpdGhvdXQgbm90aWZpY2F0aW9uICovCisJRlJfQUNUX1VOUkVBQ0hBQkxFLAkvKiBEcm9wIHdpdGggRU5FVFVOUkVBQ0ggKi8KKwlGUl9BQ1RfUFJPSElCSVQsCS8qIERyb3Agd2l0aCBFQUNDRVMgKi8KKwlfX0ZSX0FDVF9NQVgsCit9OworCisjZGVmaW5lIEZSX0FDVF9NQVggKF9fRlJfQUNUX01BWCAtIDEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9maWVtYXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmllbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzMDc0NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmllbWFwLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIEZTX0lPQ19GSUVNQVAgaW9jdGwgaW5mcmFzdHJ1Y3R1cmUuCisgKgorICogU29tZSBwb3J0aW9ucyBjb3B5cmlnaHQgKEMpIDIwMDcgQ2x1c3RlciBGaWxlIFN5c3RlbXMsIEluYworICoKKyAqIEF1dGhvcnM6IE1hcmsgRmFzaGVoIDxtZmFzaGVoQHN1c2UuY29tPgorICogICAgICAgICAgS2FscGFrIFNoYWggPGthbHBhay5zaGFoQHN1bi5jb20+CisgKiAgICAgICAgICBBbmRyZWFzIERpbGdlciA8YWRpbGdlckBzdW4uY29tPgorICovCisKKyNpZm5kZWYgX0xJTlVYX0ZJRU1BUF9ICisjZGVmaW5lIF9MSU5VWF9GSUVNQVBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGZpZW1hcF9leHRlbnQgeworCV9fdTY0IGZlX2xvZ2ljYWw7ICAvKiBsb2dpY2FsIG9mZnNldCBpbiBieXRlcyBmb3IgdGhlIHN0YXJ0IG9mCisJCQkgICAgKiB0aGUgZXh0ZW50IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSAqLworCV9fdTY0IGZlX3BoeXNpY2FsOyAvKiBwaHlzaWNhbCBvZmZzZXQgaW4gYnl0ZXMgZm9yIHRoZSBzdGFydAorCQkJICAgICogb2YgdGhlIGV4dGVudCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRpc2sgKi8KKwlfX3U2NCBmZV9sZW5ndGg7ICAgLyogbGVuZ3RoIGluIGJ5dGVzIGZvciB0aGlzIGV4dGVudCAqLworCV9fdTY0IGZlX3Jlc2VydmVkNjRbMl07CisJX191MzIgZmVfZmxhZ3M7ICAgIC8qIEZJRU1BUF9FWFRFTlRfKiBmbGFncyBmb3IgdGhpcyBleHRlbnQgKi8KKwlfX3UzMiBmZV9yZXNlcnZlZFszXTsKK307CisKK3N0cnVjdCBmaWVtYXAgeworCV9fdTY0IGZtX3N0YXJ0OwkJLyogbG9naWNhbCBvZmZzZXQgKGluY2x1c2l2ZSkgYXQKKwkJCQkgKiB3aGljaCB0byBzdGFydCBtYXBwaW5nIChpbikgKi8KKwlfX3U2NCBmbV9sZW5ndGg7CS8qIGxvZ2ljYWwgbGVuZ3RoIG9mIG1hcHBpbmcgd2hpY2gKKwkJCQkgKiB1c2Vyc3BhY2Ugd2FudHMgKGluKSAqLworCV9fdTMyIGZtX2ZsYWdzOwkJLyogRklFTUFQX0ZMQUdfKiBmbGFncyBmb3IgcmVxdWVzdCAoaW4vb3V0KSAqLworCV9fdTMyIGZtX21hcHBlZF9leHRlbnRzOy8qIG51bWJlciBvZiBleHRlbnRzIHRoYXQgd2VyZSBtYXBwZWQgKG91dCkgKi8KKwlfX3UzMiBmbV9leHRlbnRfY291bnQ7ICAvKiBzaXplIG9mIGZtX2V4dGVudHMgYXJyYXkgKGluKSAqLworCV9fdTMyIGZtX3Jlc2VydmVkOworCXN0cnVjdCBmaWVtYXBfZXh0ZW50IGZtX2V4dGVudHNbMF07IC8qIGFycmF5IG9mIG1hcHBlZCBleHRlbnRzIChvdXQpICovCit9OworCisjZGVmaW5lIEZJRU1BUF9NQVhfT0ZGU0VUCSh+MFVMTCkKKworI2RlZmluZSBGSUVNQVBfRkxBR19TWU5DCTB4MDAwMDAwMDEgLyogc3luYyBmaWxlIGRhdGEgYmVmb3JlIG1hcCAqLworI2RlZmluZSBGSUVNQVBfRkxBR19YQVRUUgkweDAwMDAwMDAyIC8qIG1hcCBleHRlbmRlZCBhdHRyaWJ1dGUgdHJlZSAqLworCisjZGVmaW5lIEZJRU1BUF9GTEFHU19DT01QQVQJKEZJRU1BUF9GTEFHX1NZTkMgfCBGSUVNQVBfRkxBR19YQVRUUikKKworI2RlZmluZSBGSUVNQVBfRVhURU5UX0xBU1QJCTB4MDAwMDAwMDEgLyogTGFzdCBleHRlbnQgaW4gZmlsZS4gKi8KKyNkZWZpbmUgRklFTUFQX0VYVEVOVF9VTktOT1dOCQkweDAwMDAwMDAyIC8qIERhdGEgbG9jYXRpb24gdW5rbm93bi4gKi8KKyNkZWZpbmUgRklFTUFQX0VYVEVOVF9ERUxBTExPQwkJMHgwMDAwMDAwNCAvKiBMb2NhdGlvbiBzdGlsbCBwZW5kaW5nLgorCQkJCQkJICAgICogU2V0cyBFWFRFTlRfVU5LTk9XTi4gKi8KKyNkZWZpbmUgRklFTUFQX0VYVEVOVF9FTkNPREVECQkweDAwMDAwMDA4IC8qIERhdGEgY2FuIG5vdCBiZSByZWFkCisJCQkJCQkgICAgKiB3aGlsZSBmcyBpcyB1bm1vdW50ZWQgKi8KKyNkZWZpbmUgRklFTUFQX0VYVEVOVF9EQVRBX0VOQ1JZUFRFRAkweDAwMDAwMDgwIC8qIERhdGEgaXMgZW5jcnlwdGVkIGJ5IGZzLgorCQkJCQkJICAgICogU2V0cyBFWFRFTlRfTk9fQllQQVNTLiAqLworI2RlZmluZSBGSUVNQVBfRVhURU5UX05PVF9BTElHTkVECTB4MDAwMDAxMDAgLyogRXh0ZW50IG9mZnNldHMgbWF5IG5vdCBiZQorCQkJCQkJICAgICogYmxvY2sgYWxpZ25lZC4gKi8KKyNkZWZpbmUgRklFTUFQX0VYVEVOVF9EQVRBX0lOTElORQkweDAwMDAwMjAwIC8qIERhdGEgbWl4ZWQgd2l0aCBtZXRhZGF0YS4KKwkJCQkJCSAgICAqIFNldHMgRVhURU5UX05PVF9BTElHTkVELiovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfREFUQV9UQUlMCQkweDAwMDAwNDAwIC8qIE11bHRpcGxlIGZpbGVzIGluIGJsb2NrLgorCQkJCQkJICAgICogU2V0cyBFWFRFTlRfTk9UX0FMSUdORUQuKi8KKyNkZWZpbmUgRklFTUFQX0VYVEVOVF9VTldSSVRURU4JCTB4MDAwMDA4MDAgLyogU3BhY2UgYWxsb2NhdGVkLCBidXQKKwkJCQkJCSAgICAqIG5vIGRhdGEgKGkuZS4gemVybykuICovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfTUVSR0VECQkweDAwMDAxMDAwIC8qIEZpbGUgZG9lcyBub3QgbmF0aXZlbHkKKwkJCQkJCSAgICAqIHN1cHBvcnQgZXh0ZW50cy4gUmVzdWx0CisJCQkJCQkgICAgKiBtZXJnZWQgZm9yIGVmZmljaWVuY3kuICovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfU0hBUkVECQkweDAwMDAyMDAwIC8qIFNwYWNlIHNoYXJlZCB3aXRoIG90aGVyCisJCQkJCQkgICAgKiBmaWxlcy4gKi8KKworI2VuZGlmIC8qIF9MSU5VWF9GSUVNQVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9maWx0ZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5ZTAyNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmlsdGVyLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBMaW51eCBTb2NrZXQgRmlsdGVyIERhdGEgU3RydWN0dXJlcworICovCisKKyNpZm5kZWYgX19MSU5VWF9GSUxURVJfSF9fCisjZGVmaW5lIF9fTElOVVhfRklMVEVSX0hfXworCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKy8qCisgKiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIGZpbHRlciBjb2RlIGFyY2hpdGVjdHVyZS4KKyAqLworI2RlZmluZSBCUEZfTUFKT1JfVkVSU0lPTiAxCisjZGVmaW5lIEJQRl9NSU5PUl9WRVJTSU9OIDEKKworLyoKKyAqCVRyeSBhbmQga2VlcCB0aGVzZSB2YWx1ZXMgYW5kIHN0cnVjdHVyZXMgc2ltaWxhciB0byBCU0QsIGVzcGVjaWFsbHkKKyAqCXRoZSBCUEYgY29kZSBkZWZpbml0aW9ucyB3aGljaCBuZWVkIHRvIG1hdGNoIHNvIHlvdSBjYW4gc2hhcmUgZmlsdGVycworICovCisgCitzdHJ1Y3Qgc29ja19maWx0ZXIgewkvKiBGaWx0ZXIgYmxvY2sgKi8KKwlfX3UxNgljb2RlOyAgIC8qIEFjdHVhbCBmaWx0ZXIgY29kZSAqLworCV9fdTgJanQ7CS8qIEp1bXAgdHJ1ZSAqLworCV9fdTgJamY7CS8qIEp1bXAgZmFsc2UgKi8KKwlfX3UzMglrOyAgICAgIC8qIEdlbmVyaWMgbXVsdGl1c2UgZmllbGQgKi8KK307CisKK3N0cnVjdCBzb2NrX2Zwcm9nIHsJLyogUmVxdWlyZWQgZm9yIFNPX0FUVEFDSF9GSUxURVIuICovCisJdW5zaWduZWQgc2hvcnQJCWxlbjsJLyogTnVtYmVyIG9mIGZpbHRlciBibG9ja3MgKi8KKwlzdHJ1Y3Qgc29ja19maWx0ZXIgKmZpbHRlcjsKK307CisKKy8qCisgKiBJbnN0cnVjdGlvbiBjbGFzc2VzCisgKi8KKworI2RlZmluZSBCUEZfQ0xBU1MoY29kZSkgKChjb2RlKSAmIDB4MDcpCisjZGVmaW5lICAgICAgICAgQlBGX0xEICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgICAgICBCUEZfTERYICAgICAgICAgMHgwMQorI2RlZmluZSAgICAgICAgIEJQRl9TVCAgICAgICAgICAweDAyCisjZGVmaW5lICAgICAgICAgQlBGX1NUWCAgICAgICAgIDB4MDMKKyNkZWZpbmUgICAgICAgICBCUEZfQUxVICAgICAgICAgMHgwNAorI2RlZmluZSAgICAgICAgIEJQRl9KTVAgICAgICAgICAweDA1CisjZGVmaW5lICAgICAgICAgQlBGX1JFVCAgICAgICAgIDB4MDYKKyNkZWZpbmUgICAgICAgICBCUEZfTUlTQyAgICAgICAgMHgwNworCisvKiBsZC9sZHggZmllbGRzICovCisjZGVmaW5lIEJQRl9TSVpFKGNvZGUpICAoKGNvZGUpICYgMHgxOCkKKyNkZWZpbmUgICAgICAgICBCUEZfVyAgICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgICAgIEJQRl9IICAgICAgICAgICAweDA4CisjZGVmaW5lICAgICAgICAgQlBGX0IgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQlBGX01PREUoY29kZSkgICgoY29kZSkgJiAweGUwKQorI2RlZmluZSAgICAgICAgIEJQRl9JTU0gICAgICAgICAweDAwCisjZGVmaW5lICAgICAgICAgQlBGX0FCUyAgICAgICAgIDB4MjAKKyNkZWZpbmUgICAgICAgICBCUEZfSU5EICAgICAgICAgMHg0MAorI2RlZmluZSAgICAgICAgIEJQRl9NRU0gICAgICAgICAweDYwCisjZGVmaW5lICAgICAgICAgQlBGX0xFTiAgICAgICAgIDB4ODAKKyNkZWZpbmUgICAgICAgICBCUEZfTVNIICAgICAgICAgMHhhMAorCisvKiBhbHUvam1wIGZpZWxkcyAqLworI2RlZmluZSBCUEZfT1AoY29kZSkgICAgKChjb2RlKSAmIDB4ZjApCisjZGVmaW5lICAgICAgICAgQlBGX0FERCAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgICAgICBCUEZfU1VCICAgICAgICAgMHgxMAorI2RlZmluZSAgICAgICAgIEJQRl9NVUwgICAgICAgICAweDIwCisjZGVmaW5lICAgICAgICAgQlBGX0RJViAgICAgICAgIDB4MzAKKyNkZWZpbmUgICAgICAgICBCUEZfT1IgICAgICAgICAgMHg0MAorI2RlZmluZSAgICAgICAgIEJQRl9BTkQgICAgICAgICAweDUwCisjZGVmaW5lICAgICAgICAgQlBGX0xTSCAgICAgICAgIDB4NjAKKyNkZWZpbmUgICAgICAgICBCUEZfUlNIICAgICAgICAgMHg3MAorI2RlZmluZSAgICAgICAgIEJQRl9ORUcgICAgICAgICAweDgwCisjZGVmaW5lICAgICAgICAgQlBGX0pBICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgICAgICBCUEZfSkVRICAgICAgICAgMHgxMAorI2RlZmluZSAgICAgICAgIEJQRl9KR1QgICAgICAgICAweDIwCisjZGVmaW5lICAgICAgICAgQlBGX0pHRSAgICAgICAgIDB4MzAKKyNkZWZpbmUgICAgICAgICBCUEZfSlNFVCAgICAgICAgMHg0MAorI2RlZmluZSBCUEZfU1JDKGNvZGUpICAgKChjb2RlKSAmIDB4MDgpCisjZGVmaW5lICAgICAgICAgQlBGX0sgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgICAgICBCUEZfWCAgICAgICAgICAgMHgwOAorCisvKiByZXQgLSBCUEZfSyBhbmQgQlBGX1ggYWxzbyBhcHBseSAqLworI2RlZmluZSBCUEZfUlZBTChjb2RlKSAgKChjb2RlKSAmIDB4MTgpCisjZGVmaW5lICAgICAgICAgQlBGX0EgICAgICAgICAgIDB4MTAKKworLyogbWlzYyAqLworI2RlZmluZSBCUEZfTUlTQ09QKGNvZGUpICgoY29kZSkgJiAweGY4KQorI2RlZmluZSAgICAgICAgIEJQRl9UQVggICAgICAgICAweDAwCisjZGVmaW5lICAgICAgICAgQlBGX1RYQSAgICAgICAgIDB4ODAKKworI2lmbmRlZiBCUEZfTUFYSU5TTlMKKyNkZWZpbmUgQlBGX01BWElOU05TIDQwOTYKKyNlbmRpZgorCisvKgorICogTWFjcm9zIGZvciBmaWx0ZXIgYmxvY2sgYXJyYXkgaW5pdGlhbGl6ZXJzLgorICovCisjaWZuZGVmIEJQRl9TVE1UCisjZGVmaW5lIEJQRl9TVE1UKGNvZGUsIGspIHsgKHVuc2lnbmVkIHNob3J0KShjb2RlKSwgMCwgMCwgayB9CisjZW5kaWYKKyNpZm5kZWYgQlBGX0pVTVAKKyNkZWZpbmUgQlBGX0pVTVAoY29kZSwgaywganQsIGpmKSB7ICh1bnNpZ25lZCBzaG9ydCkoY29kZSksIGp0LCBqZiwgayB9CisjZW5kaWYKKworLyoKKyAqIE51bWJlciBvZiBzY3JhdGNoIG1lbW9yeSB3b3JkcyBmb3I6IEJQRl9TVCBhbmQgQlBGX1NUWAorICovCisjZGVmaW5lIEJQRl9NRU1XT1JEUyAxNgorCisvKiBSQVRJT05BTEUuIE5lZ2F0aXZlIG9mZnNldHMgYXJlIGludmFsaWQgaW4gQlBGLgorICAgV2UgdXNlIHRoZW0gdG8gcmVmZXJlbmNlIGFuY2lsbGFyeSBkYXRhLgorICAgVW5saWtlIGludHJvZHVjdGlvbiBuZXcgaW5zdHJ1Y3Rpb25zLCBpdCBkb2VzIG5vdCBicmVhaworICAgZXhpc3RpbmcgY29tcGlsZXJzL29wdGltaXplcnMuCisgKi8KKyNkZWZpbmUgU0tGX0FEX09GRiAgICAoLTB4MTAwMCkKKyNkZWZpbmUgU0tGX0FEX1BST1RPQ09MIDAKKyNkZWZpbmUgU0tGX0FEX1BLVFRZUEUgCTQKKyNkZWZpbmUgU0tGX0FEX0lGSU5ERVggCTgKKyNkZWZpbmUgU0tGX0FEX05MQVRUUgkxMgorI2RlZmluZSBTS0ZfQURfTkxBVFRSX05FU1QJMTYKKyNkZWZpbmUgU0tGX0FEX01BUksgCTIwCisjZGVmaW5lIFNLRl9BRF9RVUVVRQkyNAorI2RlZmluZSBTS0ZfQURfSEFUWVBFCTI4CisjZGVmaW5lIFNLRl9BRF9SWEhBU0gJMzIKKyNkZWZpbmUgU0tGX0FEX0NQVQkzNgorI2RlZmluZSBTS0ZfQURfTUFYCTQwCisjZGVmaW5lIFNLRl9ORVRfT0ZGICAgKC0weDEwMDAwMCkKKyNkZWZpbmUgU0tGX0xMX09GRiAgICAoLTB4MjAwMDAwKQorCisKKyNlbmRpZiAvKiBfX0xJTlVYX0ZJTFRFUl9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmlyZXdpcmUtY2Rldi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9maXJld2lyZS1jZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3ZGJmYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmlyZXdpcmUtY2Rldi5oCkBAIC0wLDAgKzEsMTAxMCBAQAorLyoKKyAqIENoYXIgZGV2aWNlIGludGVyZmFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyAgS3Jpc3RpYW4gSG9lZ3NiZXJnIDxrcmhAYml0cGxhbmV0Lm5ldD4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfTElOVVhfRklSRVdJUkVfQ0RFVl9ICisjZGVmaW5lIF9MSU5VWF9GSVJFV0lSRV9DREVWX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJld2lyZS1jb25zdGFudHMuaD4KKworLyogYXZhaWxhYmxlIHNpbmNlIGtlcm5lbCB2ZXJzaW9uIDIuNi4yMiAqLworI2RlZmluZSBGV19DREVWX0VWRU5UX0JVU19SRVNFVAkJCQkweDAwCisjZGVmaW5lIEZXX0NERVZfRVZFTlRfUkVTUE9OU0UJCQkJMHgwMQorI2RlZmluZSBGV19DREVWX0VWRU5UX1JFUVVFU1QJCQkJMHgwMgorI2RlZmluZSBGV19DREVWX0VWRU5UX0lTT19JTlRFUlJVUFQJCQkweDAzCisKKy8qIGF2YWlsYWJsZSBzaW5jZSBrZXJuZWwgdmVyc2lvbiAyLjYuMzAgKi8KKyNkZWZpbmUgRldfQ0RFVl9FVkVOVF9JU09fUkVTT1VSQ0VfQUxMT0NBVEVECQkweDA0CisjZGVmaW5lIEZXX0NERVZfRVZFTlRfSVNPX1JFU09VUkNFX0RFQUxMT0NBVEVECQkweDA1CisKKy8qIGF2YWlsYWJsZSBzaW5jZSBrZXJuZWwgdmVyc2lvbiAyLjYuMzYgKi8KKyNkZWZpbmUgRldfQ0RFVl9FVkVOVF9SRVFVRVNUMgkJCQkweDA2CisjZGVmaW5lIEZXX0NERVZfRVZFTlRfUEhZX1BBQ0tFVF9TRU5UCQkJMHgwNworI2RlZmluZSBGV19DREVWX0VWRU5UX1BIWV9QQUNLRVRfUkVDRUlWRUQJCTB4MDgKKyNkZWZpbmUgRldfQ0RFVl9FVkVOVF9JU09fSU5URVJSVVBUX01VTFRJQ0hBTk5FTAkweDA5CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfZXZlbnRfY29tbW9uIC0gQ29tbW9uIHBhcnQgb2YgYWxsIGZ3X2NkZXZfZXZlbnRfIHR5cGVzCisgKiBAY2xvc3VyZToJRm9yIGFyYml0cmFyeSB1c2UgYnkgdXNlcnNwYWNlCisgKiBAdHlwZToJRGlzY3JpbWluYXRlcyB0aGUgZndfY2Rldl9ldmVudF8gdHlwZXMKKyAqCisgKiBUaGlzIHN0cnVjdCBtYXkgYmUgdXNlZCB0byBhY2Nlc3MgZ2VuZXJpYyBtZW1iZXJzIG9mIGFsbCBmd19jZGV2X2V2ZW50XworICogdHlwZXMgcmVnYXJkbGVzcyBvZiB0aGUgc3BlY2lmaWMgdHlwZS4KKyAqCisgKiBEYXRhIHBhc3NlZCBpbiB0aGUgQGNsb3N1cmUgZmllbGQgZm9yIGEgcmVxdWVzdCB3aWxsIGJlIHJldHVybmVkIGluIHRoZQorICogY29ycmVzcG9uZGluZyBldmVudC4gIEl0IGlzIGJpZyBlbm91Z2ggdG8gaG9sZCBhIHBvaW50ZXIgb24gYWxsIHBsYXRmb3Jtcy4KKyAqIFRoZSBpb2N0bCB1c2VkIHRvIHNldCBAY2xvc3VyZSBkZXBlbmRzIG9uIHRoZSBAdHlwZSBvZiBldmVudC4KKyAqLworc3RydWN0IGZ3X2NkZXZfZXZlbnRfY29tbW9uIHsKKwlfX3U2NCBjbG9zdXJlOworCV9fdTMyIHR5cGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2V2ZW50X2J1c19yZXNldCAtIFNlbnQgd2hlbiBhIGJ1cyByZXNldCBvY2N1cnJlZAorICogQGNsb3N1cmU6CVNlZSAmZndfY2Rldl9ldmVudF9jb21tb247IHNldCBieSAlRldfQ0RFVl9JT0NfR0VUX0lORk8gaW9jdGwKKyAqIEB0eXBlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOyBhbHdheXMgJUZXX0NERVZfRVZFTlRfQlVTX1JFU0VUCisgKiBAbm9kZV9pZDogICAgICAgTmV3IG5vZGUgSUQgb2YgdGhpcyBub2RlCisgKiBAbG9jYWxfbm9kZV9pZDogTm9kZSBJRCBvZiB0aGUgbG9jYWwgbm9kZSwgaS5lLiBvZiB0aGUgY29udHJvbGxlcgorICogQGJtX25vZGVfaWQ6ICAgIE5vZGUgSUQgb2YgdGhlIGJ1cyBtYW5hZ2VyCisgKiBAaXJtX25vZGVfaWQ6ICAgTm9kZSBJRCBvZiB0aGUgaXNvIHJlc291cmNlIG1hbmFnZXIKKyAqIEByb290X25vZGVfaWQ6ICBOb2RlIElEIG9mIHRoZSByb290IG5vZGUKKyAqIEBnZW5lcmF0aW9uOiAgICBOZXcgYnVzIGdlbmVyYXRpb24KKyAqCisgKiBUaGlzIGV2ZW50IGlzIHNlbnQgd2hlbiB0aGUgYnVzIHRoZSBkZXZpY2UgYmVsb25ncyB0byBnb2VzIHRocm91Z2ggYSBidXMKKyAqIHJlc2V0LiAgSXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldyBidXMgY29uZmlndXJhdGlvbiwgc3VjaCBhcworICogbmV3IG5vZGUgSUQgZm9yIHRoaXMgZGV2aWNlLCBuZXcgcm9vdCBJRCwgYW5kIG90aGVycy4KKyAqCisgKiBJZiBAYm1fbm9kZV9pZCBpcyAweGZmZmYgcmlnaHQgYWZ0ZXIgYnVzIHJlc2V0IGl0IGNhbiBiZSByZXJlYWQgYnkgYW4KKyAqICVGV19DREVWX0lPQ19HRVRfSU5GTyBpb2N0bCBhZnRlciBidXMgbWFuYWdlciBzZWxlY3Rpb24gd2FzIGZpbmlzaGVkLgorICogS2VybmVscyB3aXRoIEFCSSB2ZXJzaW9uIDwgNCBkbyBub3Qgc2V0IEBibV9ub2RlX2lkLgorICovCitzdHJ1Y3QgZndfY2Rldl9ldmVudF9idXNfcmVzZXQgeworCV9fdTY0IGNsb3N1cmU7CisJX191MzIgdHlwZTsKKwlfX3UzMiBub2RlX2lkOworCV9fdTMyIGxvY2FsX25vZGVfaWQ7CisJX191MzIgYm1fbm9kZV9pZDsKKwlfX3UzMiBpcm1fbm9kZV9pZDsKKwlfX3UzMiByb290X25vZGVfaWQ7CisJX191MzIgZ2VuZXJhdGlvbjsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfZXZlbnRfcmVzcG9uc2UgLSBTZW50IHdoZW4gYSByZXNwb25zZSBwYWNrZXQgd2FzIHJlY2VpdmVkCisgKiBAY2xvc3VyZToJU2VlICZmd19jZGV2X2V2ZW50X2NvbW1vbjsgc2V0IGJ5ICVGV19DREVWX0lPQ19TRU5EX1JFUVVFU1QKKyAqCQlvciAlRldfQ0RFVl9JT0NfU0VORF9CUk9BRENBU1RfUkVRVUVTVAorICoJCW9yICVGV19DREVWX0lPQ19TRU5EX1NUUkVBTV9QQUNLRVQgaW9jdGwKKyAqIEB0eXBlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOyBhbHdheXMgJUZXX0NERVZfRVZFTlRfUkVTUE9OU0UKKyAqIEByY29kZToJUmVzcG9uc2UgY29kZSByZXR1cm5lZCBieSB0aGUgcmVtb3RlIG5vZGUKKyAqIEBsZW5ndGg6CURhdGEgbGVuZ3RoLCBpLmUuIHRoZSByZXNwb25zZSdzIHBheWxvYWQgc2l6ZSBpbiBieXRlcworICogQGRhdGE6CVBheWxvYWQgZGF0YSwgaWYgYW55CisgKgorICogVGhpcyBldmVudCBpcyBzZW50IHdoZW4gdGhlIHN0YWNrIHJlY2VpdmVzIGEgcmVzcG9uc2UgdG8gYW4gb3V0Z29pbmcgcmVxdWVzdAorICogc2VudCBieSAlRldfQ0RFVl9JT0NfU0VORF9SRVFVRVNUIGlvY3RsLiAgVGhlIHBheWxvYWQgZGF0YSBmb3IgcmVzcG9uc2VzCisgKiBjYXJyeWluZyBkYXRhIChyZWFkIGFuZCBsb2NrIHJlc3BvbnNlcykgZm9sbG93cyBpbW1lZGlhdGVseSBhbmQgY2FuIGJlCisgKiBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBAZGF0YSBmaWVsZC4KKyAqCisgKiBUaGUgZXZlbnQgaXMgYWxzbyBnZW5lcmF0ZWQgYWZ0ZXIgY29uY2x1c2lvbnMgb2YgdHJhbnNhY3Rpb25zIHRoYXQgZG8gbm90CisgKiBpbnZvbHZlIHJlc3BvbnNlIHBhY2tldHMuICBUaGlzIGluY2x1ZGVzIHVuaWZpZWQgd3JpdGUgdHJhbnNhY3Rpb25zLAorICogYnJvYWRjYXN0IHdyaXRlIHRyYW5zYWN0aW9ucywgYW5kIHRyYW5zbWlzc2lvbiBvZiBhc3luY2hyb25vdXMgc3RyZWFtCisgKiBwYWNrZXRzLiAgQHJjb2RlIGluZGljYXRlcyBzdWNjZXNzIG9yIGZhaWx1cmUgb2Ygc3VjaCB0cmFuc21pc3Npb25zLgorICovCitzdHJ1Y3QgZndfY2Rldl9ldmVudF9yZXNwb25zZSB7CisJX191NjQgY2xvc3VyZTsKKwlfX3UzMiB0eXBlOworCV9fdTMyIHJjb2RlOworCV9fdTMyIGxlbmd0aDsKKwlfX3UzMiBkYXRhWzBdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9ldmVudF9yZXF1ZXN0IC0gT2xkIHZlcnNpb24gb2YgJmZ3X2NkZXZfZXZlbnRfcmVxdWVzdDIKKyAqIEB0eXBlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOyBhbHdheXMgJUZXX0NERVZfRVZFTlRfUkVRVUVTVAorICoKKyAqIFRoaXMgZXZlbnQgaXMgc2VudCBpbnN0ZWFkIG9mICZmd19jZGV2X2V2ZW50X3JlcXVlc3QyIGlmIHRoZSBrZXJuZWwgb3IKKyAqIHRoZSBjbGllbnQgaW1wbGVtZW50cyBBQkkgdmVyc2lvbiA8PSAzLiAgJmZ3X2NkZXZfZXZlbnRfcmVxdWVzdCBsYWNrcworICogZXNzZW50aWFsIGluZm9ybWF0aW9uOyB1c2UgJmZ3X2NkZXZfZXZlbnRfcmVxdWVzdDIgaW5zdGVhZC4KKyAqLworc3RydWN0IGZ3X2NkZXZfZXZlbnRfcmVxdWVzdCB7CisJX191NjQgY2xvc3VyZTsKKwlfX3UzMiB0eXBlOworCV9fdTMyIHRjb2RlOworCV9fdTY0IG9mZnNldDsKKwlfX3UzMiBoYW5kbGU7CisJX191MzIgbGVuZ3RoOworCV9fdTMyIGRhdGFbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2V2ZW50X3JlcXVlc3QyIC0gU2VudCBvbiBpbmNvbWluZyByZXF1ZXN0IHRvIGFuIGFkZHJlc3MgcmVnaW9uCisgKiBAY2xvc3VyZToJU2VlICZmd19jZGV2X2V2ZW50X2NvbW1vbjsgc2V0IGJ5ICVGV19DREVWX0lPQ19BTExPQ0FURSBpb2N0bAorICogQHR5cGU6CVNlZSAmZndfY2Rldl9ldmVudF9jb21tb247IGFsd2F5cyAlRldfQ0RFVl9FVkVOVF9SRVFVRVNUMgorICogQHRjb2RlOglUcmFuc2FjdGlvbiBjb2RlIG9mIHRoZSBpbmNvbWluZyByZXF1ZXN0CisgKiBAb2Zmc2V0OglUaGUgb2Zmc2V0IGludG8gdGhlIDQ4LWJpdCBwZXItbm9kZSBhZGRyZXNzIHNwYWNlCisgKiBAc291cmNlX25vZGVfaWQ6IFNlbmRlciBub2RlIElECisgKiBAZGVzdGluYXRpb25fbm9kZV9pZDogRGVzdGluYXRpb24gbm9kZSBJRAorICogQGNhcmQ6CVRoZSBpbmRleCBvZiB0aGUgY2FyZCBmcm9tIHdoaWNoIHRoZSByZXF1ZXN0IGNhbWUKKyAqIEBnZW5lcmF0aW9uOglCdXMgZ2VuZXJhdGlvbiBpbiB3aGljaCB0aGUgcmVxdWVzdCBpcyB2YWxpZAorICogQGhhbmRsZToJUmVmZXJlbmNlIHRvIHRoZSBrZXJuZWwtc2lkZSBwZW5kaW5nIHJlcXVlc3QKKyAqIEBsZW5ndGg6CURhdGEgbGVuZ3RoLCBpLmUuIHRoZSByZXF1ZXN0J3MgcGF5bG9hZCBzaXplIGluIGJ5dGVzCisgKiBAZGF0YToJSW5jb21pbmcgZGF0YSwgaWYgYW55CisgKgorICogVGhpcyBldmVudCBpcyBzZW50IHdoZW4gdGhlIHN0YWNrIHJlY2VpdmVzIGFuIGluY29taW5nIHJlcXVlc3QgdG8gYW4gYWRkcmVzcworICogcmVnaW9uIHJlZ2lzdGVyZWQgdXNpbmcgdGhlICVGV19DREVWX0lPQ19BTExPQ0FURSBpb2N0bC4gIFRoZSByZXF1ZXN0IGlzCisgKiBndWFyYW50ZWVkIHRvIGJlIGNvbXBsZXRlbHkgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgcmVnaW9uLiAgVXNlcnNwYWNlIGlzCisgKiByZXNwb25zaWJsZSBmb3Igc2VuZGluZyB0aGUgcmVzcG9uc2UgYnkgJUZXX0NERVZfSU9DX1NFTkRfUkVTUE9OU0UgaW9jdGwsCisgKiB1c2luZyB0aGUgc2FtZSBAaGFuZGxlLgorICoKKyAqIFRoZSBwYXlsb2FkIGRhdGEgZm9yIHJlcXVlc3RzIGNhcnJ5aW5nIGRhdGEgKHdyaXRlIGFuZCBsb2NrIHJlcXVlc3RzKQorICogZm9sbG93cyBpbW1lZGlhdGVseSBhbmQgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIEBkYXRhIGZpZWxkLgorICoKKyAqIFVubGlrZSAmZndfY2Rldl9ldmVudF9yZXF1ZXN0LCBAdGNvZGUgb2YgbG9jayByZXF1ZXN0cyBpcyBvbmUgb2YgdGhlCisgKiBmaXJld2lyZS1jb3JlIHNwZWNpZmljICVUQ09ERV9MT0NLX01BU0tfU1dBUC4uLiVUQ09ERV9MT0NLX1ZFTkRPUl9ERVBFTkRFTlQsCisgKiBpLmUuIGVuY29kZXMgdGhlIGV4dGVuZGVkIHRyYW5zYWN0aW9uIGNvZGUuCisgKgorICogQGNhcmQgbWF5IGRpZmZlciBmcm9tICZmd19jZGV2X2dldF9pbmZvLmNhcmQgYmVjYXVzZSByZXF1ZXN0cyBhcmUgcmVjZWl2ZWQKKyAqIGZyb20gYWxsIGNhcmRzIG9mIHRoZSBMaW51eCBob3N0LiAgQHNvdXJjZV9ub2RlX2lkLCBAZGVzdGluYXRpb25fbm9kZV9pZCwgYW5kCisgKiBAZ2VuZXJhdGlvbiBwZXJ0YWluIHRvIHRoYXQgY2FyZC4gIERlc3RpbmF0aW9uIG5vZGUgSUQgYW5kIGJ1cyBnZW5lcmF0aW9uIG1heQorICogdGhlcmVmb3JlIGRpZmZlciBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBvZiB0aGUgbGFzdAorICogJmZ3X2NkZXZfZXZlbnRfYnVzX3Jlc2V0LgorICoKKyAqIEBkZXN0aW5hdGlvbl9ub2RlX2lkIG1heSBhbHNvIGRpZmZlciBmcm9tIHRoZSBjdXJyZW50IG5vZGUgSUQgYmVjYXVzZSBvZiBhCisgKiBub24tbG9jYWwgYnVzIElEIHBhcnQgb3IgaW4gY2FzZSBvZiBhIGJyb2FkY2FzdCB3cml0ZSByZXF1ZXN0LiAgTm90ZSwgYQorICogY2xpZW50IG11c3QgY2FsbCBhbiAlRldfQ0RFVl9JT0NfU0VORF9SRVNQT05TRSBpb2N0bCBldmVuIGluIGNhc2Ugb2YgYQorICogYnJvYWRjYXN0IHdyaXRlIHJlcXVlc3Q7IHRoZSBrZXJuZWwgd2lsbCB0aGVuIHJlbGVhc2UgdGhlIGtlcm5lbC1zaWRlIHBlbmRpbmcKKyAqIHJlcXVlc3QgYnV0IHdpbGwgbm90IGFjdHVhbGx5IHNlbmQgYSByZXNwb25zZSBwYWNrZXQuCisgKgorICogSW4gY2FzZSBvZiBhIHdyaXRlIHJlcXVlc3QgdG8gRkNQX1JFUVVFU1Qgb3IgRkNQX1JFU1BPTlNFLCB0aGUga2VybmVsIGFscmVhZHkKKyAqIHNlbnQgYSB3cml0ZSByZXNwb25zZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgcmVxdWVzdCB3YXMgcmVjZWl2ZWQ7IGluIHRoaXMKKyAqIGNhc2UgdGhlIGNsaWVudCBtdXN0IHN0aWxsIGNhbGwgYW4gJUZXX0NERVZfSU9DX1NFTkRfUkVTUE9OU0UgaW9jdGwgdG8KKyAqIHJlbGVhc2UgdGhlIGtlcm5lbC1zaWRlIHBlbmRpbmcgcmVxdWVzdCwgdGhvdWdoIGFub3RoZXIgcmVzcG9uc2Ugd29uJ3QgYmUKKyAqIHNlbnQuCisgKgorICogSWYgdGhlIGNsaWVudCBzdWJzZXF1ZW50bHkgbmVlZHMgdG8gaW5pdGlhdGUgcmVxdWVzdHMgdG8gdGhlIHNlbmRlciBub2RlIG9mCisgKiBhbiAmZndfY2Rldl9ldmVudF9yZXF1ZXN0MiwgaXQgbmVlZHMgdG8gdXNlIGEgZGV2aWNlIGZpbGUgd2l0aCBtYXRjaGluZworICogY2FyZCBpbmRleCwgbm9kZSBJRCwgYW5kIGdlbmVyYXRpb24gZm9yIG91dGJvdW5kIHJlcXVlc3RzLgorICovCitzdHJ1Y3QgZndfY2Rldl9ldmVudF9yZXF1ZXN0MiB7CisJX191NjQgY2xvc3VyZTsKKwlfX3UzMiB0eXBlOworCV9fdTMyIHRjb2RlOworCV9fdTY0IG9mZnNldDsKKwlfX3UzMiBzb3VyY2Vfbm9kZV9pZDsKKwlfX3UzMiBkZXN0aW5hdGlvbl9ub2RlX2lkOworCV9fdTMyIGNhcmQ7CisJX191MzIgZ2VuZXJhdGlvbjsKKwlfX3UzMiBoYW5kbGU7CisJX191MzIgbGVuZ3RoOworCV9fdTMyIGRhdGFbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2V2ZW50X2lzb19pbnRlcnJ1cHQgLSBTZW50IHdoZW4gYW4gaXNvIHBhY2tldCB3YXMgY29tcGxldGVkCisgKiBAY2xvc3VyZToJU2VlICZmd19jZGV2X2V2ZW50X2NvbW1vbjsKKyAqCQlzZXQgYnkgJUZXX0NERVZfQ1JFQVRFX0lTT19DT05URVhUIGlvY3RsCisgKiBAdHlwZToJU2VlICZmd19jZGV2X2V2ZW50X2NvbW1vbjsgYWx3YXlzICVGV19DREVWX0VWRU5UX0lTT19JTlRFUlJVUFQKKyAqIEBjeWNsZToJQ3ljbGUgY291bnRlciBvZiB0aGUgaW50ZXJydXB0IHBhY2tldAorICogQGhlYWRlcl9sZW5ndGg6IFRvdGFsIGxlbmd0aCBvZiBmb2xsb3dpbmcgaGVhZGVycywgaW4gYnl0ZXMKKyAqIEBoZWFkZXI6CVN0cmlwcGVkIGhlYWRlcnMsIGlmIGFueQorICoKKyAqIFRoaXMgZXZlbnQgaXMgc2VudCB3aGVuIHRoZSBjb250cm9sbGVyIGhhcyBjb21wbGV0ZWQgYW4gJmZ3X2NkZXZfaXNvX3BhY2tldAorICogd2l0aCB0aGUgJUZXX0NERVZfSVNPX0lOVEVSUlVQVCBiaXQgc2V0LgorICoKKyAqIElzb2Nocm9ub3VzIHRyYW5zbWl0IGV2ZW50cyAoY29udGV4dCB0eXBlICVGV19DREVWX0lTT19DT05URVhUX1RSQU5TTUlUKToKKyAqCisgKiBJbiB2ZXJzaW9uIDMgYW5kIHNvbWUgaW1wbGVtZW50YXRpb25zIG9mIHZlcnNpb24gMiBvZiB0aGUgQUJJLCAmaGVhZGVyX2xlbmd0aAorICogaXMgYSBtdWx0aXBsZSBvZiA0IGFuZCAmaGVhZGVyIGNvbnRhaW5zIHRpbWVzdGFtcHMgb2YgYWxsIHBhY2tldHMgdXAgdW50aWwKKyAqIHRoZSBpbnRlcnJ1cHQgcGFja2V0LiAgVGhlIGZvcm1hdCBvZiB0aGUgdGltZXN0YW1wcyBpcyBhcyBkZXNjcmliZWQgYmVsb3cgZm9yCisgKiBpc29jaHJvbm91cyByZWNlcHRpb24uICBJbiB2ZXJzaW9uIDEgb2YgdGhlIEFCSSwgJmhlYWRlcl9sZW5ndGggd2FzIDAuCisgKgorICogSXNvY2hyb25vdXMgcmVjZWl2ZSBldmVudHMgKGNvbnRleHQgdHlwZSAlRldfQ0RFVl9JU09fQ09OVEVYVF9SRUNFSVZFKToKKyAqCisgKiBUaGUgaGVhZGVycyBzdHJpcHBlZCBvZiBhbGwgcGFja2V0cyB1cCB1bnRpbCBhbmQgaW5jbHVkaW5nIHRoZSBpbnRlcnJ1cHQKKyAqIHBhY2tldCBhcmUgcmV0dXJuZWQgaW4gdGhlIEBoZWFkZXIgZmllbGQuICBUaGUgYW1vdW50IG9mIGhlYWRlciBkYXRhIHBlcgorICogcGFja2V0IGlzIGFzIHNwZWNpZmllZCBhdCBpc28gY29udGV4dCBjcmVhdGlvbiBieQorICogJmZ3X2NkZXZfY3JlYXRlX2lzb19jb250ZXh0LmhlYWRlcl9zaXplLgorICoKKyAqIEhlbmNlLCBfaW50ZXJydXB0LmhlYWRlcl9sZW5ndGggLyBfY29udGV4dC5oZWFkZXJfc2l6ZSBpcyB0aGUgbnVtYmVyIG9mCisgKiBwYWNrZXRzIHJlY2VpdmVkIGluIHRoaXMgaW50ZXJydXB0IGV2ZW50LiAgVGhlIGNsaWVudCBjYW4gbm93IGl0ZXJhdGUKKyAqIHRocm91Z2ggdGhlIG1tYXAoKSdlZCBETUEgYnVmZmVyIGFjY29yZGluZyB0byB0aGlzIG51bWJlciBvZiBwYWNrZXRzIGFuZAorICogdG8gdGhlIGJ1ZmZlciBzaXplcyBhcyB0aGUgY2xpZW50IHNwZWNpZmllZCBpbiAmZndfY2Rldl9xdWV1ZV9pc28uCisgKgorICogU2luY2UgdmVyc2lvbiAyIG9mIHRoaXMgQUJJLCB0aGUgcG9ydGlvbiBmb3IgZWFjaCBwYWNrZXQgaW4gX2ludGVycnVwdC5oZWFkZXIKKyAqIGNvbnNpc3RzIG9mIHRoZSAxMzk0IGlzb2Nocm9ub3VzIHBhY2tldCBoZWFkZXIsIGZvbGxvd2VkIGJ5IGEgdGltZXN0YW1wCisgKiBxdWFkbGV0IGlmICZmd19jZGV2X2NyZWF0ZV9pc29fY29udGV4dC5oZWFkZXJfc2l6ZSA+IDQsIGZvbGxvd2VkIGJ5IHF1YWRsZXRzCisgKiBmcm9tIHRoZSBwYWNrZXQgcGF5bG9hZCBpZiAmZndfY2Rldl9jcmVhdGVfaXNvX2NvbnRleHQuaGVhZGVyX3NpemUgPiA4LgorICoKKyAqIEZvcm1hdCBvZiAxMzk0IGlzbyBwYWNrZXQgaGVhZGVyOiAgMTYgYml0cyBkYXRhX2xlbmd0aCwgMiBiaXRzIHRhZywgNiBiaXRzCisgKiBjaGFubmVsLCA0IGJpdHMgdGNvZGUsIDQgYml0cyBzeSwgaW4gYmlnIGVuZGlhbiBieXRlIG9yZGVyLgorICogZGF0YV9sZW5ndGggaXMgdGhlIGFjdHVhbCByZWNlaXZlZCBzaXplIG9mIHRoZSBwYWNrZXQgd2l0aG91dCB0aGUgZm91cgorICogMTM5NCBpc28gcGFja2V0IGhlYWRlciBieXRlcy4KKyAqCisgKiBGb3JtYXQgb2YgdGltZXN0YW1wOiAgMTYgYml0cyBpbnZhbGlkLCAzIGJpdHMgY3ljbGVTZWNvbmRzLCAxMyBiaXRzCisgKiBjeWNsZUNvdW50LCBpbiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIuCisgKgorICogSW4gdmVyc2lvbiAxIG9mIHRoZSBBQkksIG5vIHRpbWVzdGFtcCBxdWFkbGV0IHdhcyBpbnNlcnRlZDsgaW5zdGVhZCwgcGF5bG9hZAorICogZGF0YSBmb2xsb3dlZCBkaXJlY3RseSBhZnRlciB0aGUgMTM5NCBpcyBoZWFkZXIgaWYgaGVhZGVyX3NpemUgPiA0LgorICogQmVoYXZpb3VyIG9mIHZlci4gMSBvZiB0aGlzIEFCSSBpcyBubyBsb25nZXIgYXZhaWxhYmxlIHNpbmNlIEFCSSB2ZXIuIDIuCisgKi8KK3N0cnVjdCBmd19jZGV2X2V2ZW50X2lzb19pbnRlcnJ1cHQgeworCV9fdTY0IGNsb3N1cmU7CisJX191MzIgdHlwZTsKKwlfX3UzMiBjeWNsZTsKKwlfX3UzMiBoZWFkZXJfbGVuZ3RoOworCV9fdTMyIGhlYWRlclswXTsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfZXZlbnRfaXNvX2ludGVycnVwdF9tYyAtIEFuIGlzbyBidWZmZXIgY2h1bmsgd2FzIGNvbXBsZXRlZAorICogQGNsb3N1cmU6CVNlZSAmZndfY2Rldl9ldmVudF9jb21tb247CisgKgkJc2V0IGJ5ICVGV19DREVWX0NSRUFURV9JU09fQ09OVEVYVCBpb2N0bAorICogQHR5cGU6CSVGV19DREVWX0VWRU5UX0lTT19JTlRFUlJVUFRfTVVMVElDSEFOTkVMCisgKiBAY29tcGxldGVkOglPZmZzZXQgaW50byB0aGUgcmVjZWl2ZSBidWZmZXI7IGRhdGEgYmVmb3JlIHRoaXMgb2Zmc2V0IGlzIHZhbGlkCisgKgorICogVGhpcyBldmVudCBpcyBzZW50IGluIG11bHRpY2hhbm5lbCBjb250ZXh0cyAoY29udGV4dCB0eXBlCisgKiAlRldfQ0RFVl9JU09fQ09OVEVYVF9SRUNFSVZFX01VTFRJQ0hBTk5FTCkgZm9yICZmd19jZGV2X2lzb19wYWNrZXQgYnVmZmVyCisgKiBjaHVua3MgdGhhdCBoYXZlIHRoZSAlRldfQ0RFVl9JU09fSU5URVJSVVBUIGJpdCBzZXQuICBXaGV0aGVyIHRoaXMgaGFwcGVucworICogd2hlbiBhIHBhY2tldCBpcyBjb21wbGV0ZWQgYW5kL29yIHdoZW4gYSBidWZmZXIgY2h1bmsgaXMgY29tcGxldGVkIGRlcGVuZHMKKyAqIG9uIHRoZSBoYXJkd2FyZSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBUaGUgYnVmZmVyIGlzIGNvbnRpbnVvdXNseSBmaWxsZWQgd2l0aCB0aGUgZm9sbG93aW5nIGRhdGEsIHBlciBwYWNrZXQ6CisgKiAgLSB0aGUgMTM5NCBpc28gcGFja2V0IGhlYWRlciBhcyBkZXNjcmliZWQgYXQgJmZ3X2NkZXZfZXZlbnRfaXNvX2ludGVycnVwdCwKKyAqICAgIGJ1dCBpbiBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIsCisgKiAgLSBwYWNrZXQgcGF5bG9hZCAoYXMgbWFueSBieXRlcyBhcyBzcGVjaWZpZWQgaW4gdGhlIGRhdGFfbGVuZ3RoIGZpZWxkIG9mCisgKiAgICB0aGUgMTM5NCBpc28gcGFja2V0IGhlYWRlcikgaW4gYmlnIGVuZGlhbiBieXRlIG9yZGVyLAorICogIC0gMC4uLjMgcGFkZGluZyBieXRlcyBhcyBuZWVkZWQgdG8gYWxpZ24gdGhlIGZvbGxvd2luZyB0cmFpbGVyIHF1YWRsZXQsCisgKiAgLSB0cmFpbGVyIHF1YWRsZXQsIGNvbnRhaW5pbmcgdGhlIHJlY2VwdGlvbiB0aW1lc3RhbXAgYXMgZGVzY3JpYmVkIGF0CisgKiAgICAmZndfY2Rldl9ldmVudF9pc29faW50ZXJydXB0LCBidXQgaW4gbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyLgorICoKKyAqIEhlbmNlIHRoZSBwZXItcGFja2V0IHNpemUgaXMgZGF0YV9sZW5ndGggKHJvdW5kZWQgdXAgdG8gYSBtdWx0aXBsZSBvZiA0KSArIDguCisgKiBXaGVuIHByb2Nlc3NpbmcgdGhlIGRhdGEsIHN0b3AgYmVmb3JlIGEgcGFja2V0IHRoYXQgd291bGQgY3Jvc3MgdGhlCisgKiBAY29tcGxldGVkIG9mZnNldC4KKyAqCisgKiBBIHBhY2tldCBuZWFyIHRoZSBlbmQgb2YgYSBidWZmZXIgY2h1bmsgd2lsbCB0eXBpY2FsbHkgc3BpbGwgb3ZlciBpbnRvIHRoZQorICogbmV4dCBxdWV1ZWQgYnVmZmVyIGNodW5rLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjbGllbnQgdG8gY2hlY2sKKyAqIGZvciB0aGlzIGNvbmRpdGlvbiwgYXNzZW1ibGUgYSBicm9rZW4tdXAgcGFja2V0IGZyb20gaXRzIHBhcnRzLCBhbmQgbm90IHRvCisgKiByZS1xdWV1ZSBhbnkgYnVmZmVyIGNodW5rcyBpbiB3aGljaCBhcyB5ZXQgdW5yZWFkIHBhY2tldCBwYXJ0cyByZXNpZGUuCisgKi8KK3N0cnVjdCBmd19jZGV2X2V2ZW50X2lzb19pbnRlcnJ1cHRfbWMgeworCV9fdTY0IGNsb3N1cmU7CisJX191MzIgdHlwZTsKKwlfX3UzMiBjb21wbGV0ZWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2V2ZW50X2lzb19yZXNvdXJjZSAtIElzbyByZXNvdXJjZXMgd2VyZSBhbGxvY2F0ZWQgb3IgZnJlZWQKKyAqIEBjbG9zdXJlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOworICoJCXNldCBieSAlRldfQ0RFVl9JT0NfKERFKUFMTE9DQVRFX0lTT19SRVNPVVJDRShfT05DRSkgaW9jdGwKKyAqIEB0eXBlOgklRldfQ0RFVl9FVkVOVF9JU09fUkVTT1VSQ0VfQUxMT0NBVEVEIG9yCisgKgkJJUZXX0NERVZfRVZFTlRfSVNPX1JFU09VUkNFX0RFQUxMT0NBVEVECisgKiBAaGFuZGxlOglSZWZlcmVuY2UgYnkgd2hpY2ggYW4gYWxsb2NhdGVkIHJlc291cmNlIGNhbiBiZSBkZWFsbG9jYXRlZAorICogQGNoYW5uZWw6CUlzb2Nocm9ub3VzIGNoYW5uZWwgd2hpY2ggd2FzIChkZSlhbGxvY2F0ZWQsIGlmIGFueQorICogQGJhbmR3aWR0aDoJQmFuZHdpZHRoIGFsbG9jYXRpb24gdW5pdHMgd2hpY2ggd2VyZSAoZGUpYWxsb2NhdGVkLCBpZiBhbnkKKyAqCisgKiBBbiAlRldfQ0RFVl9FVkVOVF9JU09fUkVTT1VSQ0VfQUxMT0NBVEVEIGV2ZW50IGlzIHNlbnQgYWZ0ZXIgYW4gaXNvY2hyb25vdXMKKyAqIHJlc291cmNlIHdhcyBhbGxvY2F0ZWQgYXQgdGhlIElSTS4gIFRoZSBjbGllbnQgaGFzIHRvIGNoZWNrIEBjaGFubmVsIGFuZAorICogQGJhbmR3aWR0aCBmb3Igd2hldGhlciB0aGUgYWxsb2NhdGlvbiBhY3R1YWxseSBzdWNjZWVkZWQuCisgKgorICogQW4gJUZXX0NERVZfRVZFTlRfSVNPX1JFU09VUkNFX0RFQUxMT0NBVEVEIGV2ZW50IGlzIHNlbnQgYWZ0ZXIgYW4gaXNvY2hyb25vdXMKKyAqIHJlc291cmNlIHdhcyBkZWFsbG9jYXRlZCBhdCB0aGUgSVJNLiAgSXQgaXMgYWxzbyBzZW50IHdoZW4gYXV0b21hdGljCisgKiByZWFsbG9jYXRpb24gYWZ0ZXIgYSBidXMgcmVzZXQgZmFpbGVkLgorICoKKyAqIEBjaGFubmVsIGlzIDwwIGlmIG5vIGNoYW5uZWwgd2FzIChkZSlhbGxvY2F0ZWQgb3IgaWYgcmVhbGxvY2F0aW9uIGZhaWxlZC4KKyAqIEBiYW5kd2lkdGggaXMgMCBpZiBubyBiYW5kd2lkdGggd2FzIChkZSlhbGxvY2F0ZWQgb3IgaWYgcmVhbGxvY2F0aW9uIGZhaWxlZC4KKyAqLworc3RydWN0IGZ3X2NkZXZfZXZlbnRfaXNvX3Jlc291cmNlIHsKKwlfX3U2NCBjbG9zdXJlOworCV9fdTMyIHR5cGU7CisJX191MzIgaGFuZGxlOworCV9fczMyIGNoYW5uZWw7CisJX19zMzIgYmFuZHdpZHRoOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9ldmVudF9waHlfcGFja2V0IC0gQSBQSFkgcGFja2V0IHdhcyB0cmFuc21pdHRlZCBvciByZWNlaXZlZAorICogQGNsb3N1cmU6CVNlZSAmZndfY2Rldl9ldmVudF9jb21tb247IHNldCBieSAlRldfQ0RFVl9JT0NfU0VORF9QSFlfUEFDS0VUCisgKgkJb3IgJUZXX0NERVZfSU9DX1JFQ0VJVkVfUEhZX1BBQ0tFVFMgaW9jdGwKKyAqIEB0eXBlOgklRldfQ0RFVl9FVkVOVF9QSFlfUEFDS0VUX1NFTlQgb3IgJS4uLl9SRUNFSVZFRAorICogQHJjb2RlOgklUkNPREVfLi4uLCBpbmRpY2F0ZXMgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRyYW5zbWlzc2lvbgorICogQGxlbmd0aDoJRGF0YSBsZW5ndGggaW4gYnl0ZXMKKyAqIEBkYXRhOglJbmNvbWluZyBkYXRhCisgKgorICogSWYgQHR5cGUgaXMgJUZXX0NERVZfRVZFTlRfUEhZX1BBQ0tFVF9TRU5ULCBAbGVuZ3RoIGlzIDAgYW5kIEBkYXRhIGVtcHR5LAorICogZXhjZXB0IGluIGNhc2Ugb2YgYSBwaW5nIHBhY2tldDogIFRoZW4sIEBsZW5ndGggaXMgNCwgYW5kIEBkYXRhWzBdIGlzIHRoZQorICogcGluZyB0aW1lIGluIDQ5LjE1Mk1IeiBjbG9ja3MgaWYgQHJjb2RlIGlzICVSQ09ERV9DT01QTEVURS4KKyAqCisgKiBJZiBAdHlwZSBpcyAlRldfQ0RFVl9FVkVOVF9QSFlfUEFDS0VUX1JFQ0VJVkVELCBAbGVuZ3RoIGlzIDggYW5kIEBkYXRhCisgKiBjb25zaXN0cyBvZiB0aGUgdHdvIFBIWSBwYWNrZXQgcXVhZGxldHMsIGluIGhvc3QgYnl0ZSBvcmRlci4KKyAqLworc3RydWN0IGZ3X2NkZXZfZXZlbnRfcGh5X3BhY2tldCB7CisJX191NjQgY2xvc3VyZTsKKwlfX3UzMiB0eXBlOworCV9fdTMyIHJjb2RlOworCV9fdTMyIGxlbmd0aDsKKwlfX3UzMiBkYXRhWzBdOworfTsKKworLyoqCisgKiB1bmlvbiBmd19jZGV2X2V2ZW50IC0gQ29udmVuaWVuY2UgdW5pb24gb2YgZndfY2Rldl9ldmVudF8gdHlwZXMKKyAqIEBjb21tb246CQlWYWxpZCBmb3IgYWxsIHR5cGVzCisgKiBAYnVzX3Jlc2V0OgkJVmFsaWQgaWYgQGNvbW1vbi50eXBlID09ICVGV19DREVWX0VWRU5UX0JVU19SRVNFVAorICogQHJlc3BvbnNlOgkJVmFsaWQgaWYgQGNvbW1vbi50eXBlID09ICVGV19DREVWX0VWRU5UX1JFU1BPTlNFCisgKiBAcmVxdWVzdDoJCVZhbGlkIGlmIEBjb21tb24udHlwZSA9PSAlRldfQ0RFVl9FVkVOVF9SRVFVRVNUCisgKiBAcmVxdWVzdDI6CQlWYWxpZCBpZiBAY29tbW9uLnR5cGUgPT0gJUZXX0NERVZfRVZFTlRfUkVRVUVTVDIKKyAqIEBpc29faW50ZXJydXB0OglWYWxpZCBpZiBAY29tbW9uLnR5cGUgPT0gJUZXX0NERVZfRVZFTlRfSVNPX0lOVEVSUlVQVAorICogQGlzb19pbnRlcnJ1cHRfbWM6CVZhbGlkIGlmIEBjb21tb24udHlwZSA9PQorICoJCQkJJUZXX0NERVZfRVZFTlRfSVNPX0lOVEVSUlVQVF9NVUxUSUNIQU5ORUwKKyAqIEBpc29fcmVzb3VyY2U6CVZhbGlkIGlmIEBjb21tb24udHlwZSA9PQorICoJCQkJJUZXX0NERVZfRVZFTlRfSVNPX1JFU09VUkNFX0FMTE9DQVRFRCBvcgorICoJCQkJJUZXX0NERVZfRVZFTlRfSVNPX1JFU09VUkNFX0RFQUxMT0NBVEVECisgKiBAcGh5X3BhY2tldDoJCVZhbGlkIGlmIEBjb21tb24udHlwZSA9PQorICoJCQkJJUZXX0NERVZfRVZFTlRfUEhZX1BBQ0tFVF9TRU5UIG9yCisgKgkJCQklRldfQ0RFVl9FVkVOVF9QSFlfUEFDS0VUX1JFQ0VJVkVECisgKgorICogQ29udmVuaWVuY2UgdW5pb24gZm9yIHVzZXJzcGFjZSB1c2UuICBFdmVudHMgY291bGQgYmUgcmVhZCgyKSBpbnRvIGFuCisgKiBhcHByb3ByaWF0ZWx5IGFsaWduZWQgY2hhciBidWZmZXIgYW5kIHRoZW4gY2FzdCB0byB0aGlzIHVuaW9uIGZvciBmdXJ0aGVyCisgKiBwcm9jZXNzaW5nLiAgTm90ZSB0aGF0IGZvciBhIHJlcXVlc3QsIHJlc3BvbnNlIG9yIGlzb19pbnRlcnJ1cHQgZXZlbnQsCisgKiB0aGUgZGF0YVtdIG9yIGhlYWRlcltdIG1heSBtYWtlIHRoZSBzaXplIG9mIHRoZSBmdWxsIGV2ZW50IGxhcmdlciB0aGFuCisgKiBzaXplb2YodW5pb24gZndfY2Rldl9ldmVudCkuICBBbHNvIG5vdGUgdGhhdCBpZiB5b3UgYXR0ZW1wdCB0byByZWFkKDIpCisgKiBhbiBldmVudCBpbnRvIGEgYnVmZmVyIHRoYXQgaXMgbm90IGxhcmdlIGVub3VnaCBmb3IgaXQsIHRoZSBkYXRhIHRoYXQgZG9lcworICogbm90IGZpdCB3aWxsIGJlIGRpc2NhcmRlZCBzbyB0aGF0IHRoZSBuZXh0IHJlYWQoMikgd2lsbCByZXR1cm4gYSBuZXcgZXZlbnQuCisgKi8KK3VuaW9uIGZ3X2NkZXZfZXZlbnQgeworCXN0cnVjdCBmd19jZGV2X2V2ZW50X2NvbW1vbgkJY29tbW9uOworCXN0cnVjdCBmd19jZGV2X2V2ZW50X2J1c19yZXNldAkJYnVzX3Jlc2V0OworCXN0cnVjdCBmd19jZGV2X2V2ZW50X3Jlc3BvbnNlCQlyZXNwb25zZTsKKwlzdHJ1Y3QgZndfY2Rldl9ldmVudF9yZXF1ZXN0CQlyZXF1ZXN0OworCXN0cnVjdCBmd19jZGV2X2V2ZW50X3JlcXVlc3QyCQlyZXF1ZXN0MjsJCS8qIGFkZGVkIGluIDIuNi4zNiAqLworCXN0cnVjdCBmd19jZGV2X2V2ZW50X2lzb19pbnRlcnJ1cHQJaXNvX2ludGVycnVwdDsKKwlzdHJ1Y3QgZndfY2Rldl9ldmVudF9pc29faW50ZXJydXB0X21jCWlzb19pbnRlcnJ1cHRfbWM7CS8qIGFkZGVkIGluIDIuNi4zNiAqLworCXN0cnVjdCBmd19jZGV2X2V2ZW50X2lzb19yZXNvdXJjZQlpc29fcmVzb3VyY2U7CQkvKiBhZGRlZCBpbiAyLjYuMzAgKi8KKwlzdHJ1Y3QgZndfY2Rldl9ldmVudF9waHlfcGFja2V0CQlwaHlfcGFja2V0OwkJLyogYWRkZWQgaW4gMi42LjM2ICovCit9OworCisvKiBhdmFpbGFibGUgc2luY2Uga2VybmVsIHZlcnNpb24gMi42LjIyICovCisjZGVmaW5lIEZXX0NERVZfSU9DX0dFVF9JTkZPICAgICAgICAgICBfSU9XUignIycsIDB4MDAsIHN0cnVjdCBmd19jZGV2X2dldF9pbmZvKQorI2RlZmluZSBGV19DREVWX0lPQ19TRU5EX1JFUVVFU1QgICAgICAgIF9JT1coJyMnLCAweDAxLCBzdHJ1Y3QgZndfY2Rldl9zZW5kX3JlcXVlc3QpCisjZGVmaW5lIEZXX0NERVZfSU9DX0FMTE9DQVRFICAgICAgICAgICBfSU9XUignIycsIDB4MDIsIHN0cnVjdCBmd19jZGV2X2FsbG9jYXRlKQorI2RlZmluZSBGV19DREVWX0lPQ19ERUFMTE9DQVRFICAgICAgICAgIF9JT1coJyMnLCAweDAzLCBzdHJ1Y3QgZndfY2Rldl9kZWFsbG9jYXRlKQorI2RlZmluZSBGV19DREVWX0lPQ19TRU5EX1JFU1BPTlNFICAgICAgIF9JT1coJyMnLCAweDA0LCBzdHJ1Y3QgZndfY2Rldl9zZW5kX3Jlc3BvbnNlKQorI2RlZmluZSBGV19DREVWX0lPQ19JTklUSUFURV9CVVNfUkVTRVQgIF9JT1coJyMnLCAweDA1LCBzdHJ1Y3QgZndfY2Rldl9pbml0aWF0ZV9idXNfcmVzZXQpCisjZGVmaW5lIEZXX0NERVZfSU9DX0FERF9ERVNDUklQVE9SICAgICBfSU9XUignIycsIDB4MDYsIHN0cnVjdCBmd19jZGV2X2FkZF9kZXNjcmlwdG9yKQorI2RlZmluZSBGV19DREVWX0lPQ19SRU1PVkVfREVTQ1JJUFRPUiAgIF9JT1coJyMnLCAweDA3LCBzdHJ1Y3QgZndfY2Rldl9yZW1vdmVfZGVzY3JpcHRvcikKKyNkZWZpbmUgRldfQ0RFVl9JT0NfQ1JFQVRFX0lTT19DT05URVhUIF9JT1dSKCcjJywgMHgwOCwgc3RydWN0IGZ3X2NkZXZfY3JlYXRlX2lzb19jb250ZXh0KQorI2RlZmluZSBGV19DREVWX0lPQ19RVUVVRV9JU08gICAgICAgICAgX0lPV1IoJyMnLCAweDA5LCBzdHJ1Y3QgZndfY2Rldl9xdWV1ZV9pc28pCisjZGVmaW5lIEZXX0NERVZfSU9DX1NUQVJUX0lTTyAgICAgICAgICAgX0lPVygnIycsIDB4MGEsIHN0cnVjdCBmd19jZGV2X3N0YXJ0X2lzbykKKyNkZWZpbmUgRldfQ0RFVl9JT0NfU1RPUF9JU08gICAgICAgICAgICBfSU9XKCcjJywgMHgwYiwgc3RydWN0IGZ3X2NkZXZfc3RvcF9pc28pCisKKy8qIGF2YWlsYWJsZSBzaW5jZSBrZXJuZWwgdmVyc2lvbiAyLjYuMjQgKi8KKyNkZWZpbmUgRldfQ0RFVl9JT0NfR0VUX0NZQ0xFX1RJTUVSICAgICBfSU9SKCcjJywgMHgwYywgc3RydWN0IGZ3X2NkZXZfZ2V0X2N5Y2xlX3RpbWVyKQorCisvKiBhdmFpbGFibGUgc2luY2Uga2VybmVsIHZlcnNpb24gMi42LjMwICovCisjZGVmaW5lIEZXX0NERVZfSU9DX0FMTE9DQVRFX0lTT19SRVNPVVJDRSAgICAgICBfSU9XUignIycsIDB4MGQsIHN0cnVjdCBmd19jZGV2X2FsbG9jYXRlX2lzb19yZXNvdXJjZSkKKyNkZWZpbmUgRldfQ0RFVl9JT0NfREVBTExPQ0FURV9JU09fUkVTT1VSQ0UgICAgICBfSU9XKCcjJywgMHgwZSwgc3RydWN0IGZ3X2NkZXZfZGVhbGxvY2F0ZSkKKyNkZWZpbmUgRldfQ0RFVl9JT0NfQUxMT0NBVEVfSVNPX1JFU09VUkNFX09OQ0UgICBfSU9XKCcjJywgMHgwZiwgc3RydWN0IGZ3X2NkZXZfYWxsb2NhdGVfaXNvX3Jlc291cmNlKQorI2RlZmluZSBGV19DREVWX0lPQ19ERUFMTE9DQVRFX0lTT19SRVNPVVJDRV9PTkNFIF9JT1coJyMnLCAweDEwLCBzdHJ1Y3QgZndfY2Rldl9hbGxvY2F0ZV9pc29fcmVzb3VyY2UpCisjZGVmaW5lIEZXX0NERVZfSU9DX0dFVF9TUEVFRCAgICAgICAgICAgICAgICAgICAgIF9JTygnIycsIDB4MTEpIC8qIHJldHVybnMgc3BlZWQgY29kZSAqLworI2RlZmluZSBGV19DREVWX0lPQ19TRU5EX0JST0FEQ0FTVF9SRVFVRVNUICAgICAgIF9JT1coJyMnLCAweDEyLCBzdHJ1Y3QgZndfY2Rldl9zZW5kX3JlcXVlc3QpCisjZGVmaW5lIEZXX0NERVZfSU9DX1NFTkRfU1RSRUFNX1BBQ0tFVCAgICAgICAgICAgX0lPVygnIycsIDB4MTMsIHN0cnVjdCBmd19jZGV2X3NlbmRfc3RyZWFtX3BhY2tldCkKKworLyogYXZhaWxhYmxlIHNpbmNlIGtlcm5lbCB2ZXJzaW9uIDIuNi4zNCAqLworI2RlZmluZSBGV19DREVWX0lPQ19HRVRfQ1lDTEVfVElNRVIyICAgX0lPV1IoJyMnLCAweDE0LCBzdHJ1Y3QgZndfY2Rldl9nZXRfY3ljbGVfdGltZXIyKQorCisvKiBhdmFpbGFibGUgc2luY2Uga2VybmVsIHZlcnNpb24gMi42LjM2ICovCisjZGVmaW5lIEZXX0NERVZfSU9DX1NFTkRfUEhZX1BBQ0tFVCAgICBfSU9XUignIycsIDB4MTUsIHN0cnVjdCBmd19jZGV2X3NlbmRfcGh5X3BhY2tldCkKKyNkZWZpbmUgRldfQ0RFVl9JT0NfUkVDRUlWRV9QSFlfUEFDS0VUUyBfSU9XKCcjJywgMHgxNiwgc3RydWN0IGZ3X2NkZXZfcmVjZWl2ZV9waHlfcGFja2V0cykKKyNkZWZpbmUgRldfQ0RFVl9JT0NfU0VUX0lTT19DSEFOTkVMUyAgICBfSU9XKCcjJywgMHgxNywgc3RydWN0IGZ3X2NkZXZfc2V0X2lzb19jaGFubmVscykKKworLyoKKyAqIEFCSSB2ZXJzaW9uIGhpc3RvcnkKKyAqICAxICAoMi42LjIyKSAgLSBpbml0aWFsIHZlcnNpb24KKyAqICAgICAoMi42LjI0KSAgLSBhZGRlZCAlRldfQ0RFVl9JT0NfR0VUX0NZQ0xFX1RJTUVSCisgKiAgMiAgKDIuNi4zMCkgIC0gY2hhbmdlZCAmZndfY2Rldl9ldmVudF9pc29faW50ZXJydXB0LmhlYWRlciBpZgorICogICAgICAgICAgICAgICAgICZmd19jZGV2X2NyZWF0ZV9pc29fY29udGV4dC5oZWFkZXJfc2l6ZSBpcyA4IG9yIG1vcmUKKyAqICAgICAgICAgICAgICAgLSBhZGRlZCAlRldfQ0RFVl9JT0NfKl9JU09fUkVTT1VSQ0UqLAorICogICAgICAgICAgICAgICAgICVGV19DREVWX0lPQ19HRVRfU1BFRUQsICVGV19DREVWX0lPQ19TRU5EX0JST0FEQ0FTVF9SRVFVRVNULAorICogICAgICAgICAgICAgICAgICVGV19DREVWX0lPQ19TRU5EX1NUUkVBTV9QQUNLRVQKKyAqICAgICAoMi42LjMyKSAgLSBhZGRlZCB0aW1lIHN0YW1wIHRvIHhtaXQgJmZ3X2NkZXZfZXZlbnRfaXNvX2ludGVycnVwdAorICogICAgICgyLjYuMzMpICAtIElSIGhhcyBhbHdheXMgcGFja2V0LXBlci1idWZmZXIgc2VtYW50aWNzIG5vdywgbm90IG9uZSBvZgorICogICAgICAgICAgICAgICAgIGR1YWwtYnVmZmVyIG9yIHBhY2tldC1wZXItYnVmZmVyIGRlcGVuZGluZyBvbiBoYXJkd2FyZQorICogICAgICAgICAgICAgICAtIHNoYXJlZCB1c2UgYW5kIGF1dG8tcmVzcG9uc2UgZm9yIEZDUCByZWdpc3RlcnMKKyAqICAzICAoMi42LjM0KSAgLSBtYWRlICZmd19jZGV2X2dldF9jeWNsZV90aW1lciByZWxpYWJsZQorICogICAgICAgICAgICAgICAtIGFkZGVkICVGV19DREVWX0lPQ19HRVRfQ1lDTEVfVElNRVIyCisgKiAgNCAgKDIuNi4zNikgIC0gYWRkZWQgJUZXX0NERVZfRVZFTlRfUkVRVUVTVDIsICVGV19DREVWX0VWRU5UX1BIWV9QQUNLRVRfKiwKKyAqICAgICAgICAgICAgICAgICBhbmQgJmZ3X2NkZXZfYWxsb2NhdGUucmVnaW9uX2VuZAorICogICAgICAgICAgICAgICAtIGltcGxlbWVudGVkICZmd19jZGV2X2V2ZW50X2J1c19yZXNldC5ibV9ub2RlX2lkCisgKiAgICAgICAgICAgICAgIC0gYWRkZWQgJUZXX0NERVZfSU9DX1NFTkRfUEhZX1BBQ0tFVCwgX1JFQ0VJVkVfUEhZX1BBQ0tFVFMKKyAqICAgICAgICAgICAgICAgLSBhZGRlZCAlRldfQ0RFVl9FVkVOVF9JU09fSU5URVJSVVBUX01VTFRJQ0hBTk5FTCwKKyAqICAgICAgICAgICAgICAgICAlRldfQ0RFVl9JU09fQ09OVEVYVF9SRUNFSVZFX01VTFRJQ0hBTk5FTCwgYW5kCisgKiAgICAgICAgICAgICAgICAgJUZXX0NERVZfSU9DX1NFVF9JU09fQ0hBTk5FTFMKKyAqLworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2dldF9pbmZvIC0gR2VuZXJhbCBwdXJwb3NlIGluZm9ybWF0aW9uIGlvY3RsCisgKiBAdmVyc2lvbjoJVGhlIHZlcnNpb24gZmllbGQgaXMganVzdCBhIHJ1bm5pbmcgc2VyaWFsIG51bWJlci4gIEJvdGggYW4KKyAqCQlpbnB1dCBwYXJhbWV0ZXIgKEFCSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoZSBjbGllbnQpIGFuZAorICoJCW91dHB1dCBwYXJhbWV0ZXIgKEFCSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoZSBrZXJuZWwpLgorICoJCUEgY2xpZW50IHNoYWxsIGZpbGwgaW4gdGhlIEFCSSBAdmVyc2lvbiBmb3Igd2hpY2ggdGhlIGNsaWVudAorICoJCXdhcyBpbXBsZW1lbnRlZC4gIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBmb3J3YXJkIGNvbXBhdGliaWxpdHkuCisgKiBAcm9tX2xlbmd0aDoJSWYgQHJvbSBpcyBub24temVybywgdXAgdG8gQHJvbV9sZW5ndGggYnl0ZXMgb2YgQ29uZmlndXJhdGlvbgorICoJCVJPTSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoYXQgdXNlciBzcGFjZSBhZGRyZXNzLiAgSW4gZWl0aGVyCisgKgkJY2FzZSwgQHJvbV9sZW5ndGggaXMgdXBkYXRlZCB3aXRoIHRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZQorICoJCUNvbmZpZ3VyYXRpb24gUk9NLgorICogQHJvbToJSWYgbm9uLXplcm8sIGFkZHJlc3Mgb2YgYSBidWZmZXIgdG8gYmUgZmlsbGVkIGJ5IGEgY29weSBvZiB0aGUKKyAqCQlkZXZpY2UncyBDb25maWd1cmF0aW9uIFJPTQorICogQGJ1c19yZXNldDoJSWYgbm9uLXplcm8sIGFkZHJlc3Mgb2YgYSBidWZmZXIgdG8gYmUgZmlsbGVkIGJ5IGEKKyAqCQkmc3RydWN0IGZ3X2NkZXZfZXZlbnRfYnVzX3Jlc2V0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUKKyAqCQlvZiB0aGUgYnVzLiAgVGhpcyBkb2VzIG5vdCBjYXVzZSBhIGJ1cyByZXNldCB0byBoYXBwZW4uCisgKiBAYnVzX3Jlc2V0X2Nsb3N1cmU6IFZhbHVlIG9mICZjbG9zdXJlIGluIHRoaXMgYW5kIHN1YnNlcXVlbnQgYnVzIHJlc2V0IGV2ZW50cworICogQGNhcmQ6CVRoZSBpbmRleCBvZiB0aGUgY2FyZCB0aGlzIGRldmljZSBiZWxvbmdzIHRvCisgKgorICogVGhlICVGV19DREVWX0lPQ19HRVRfSU5GTyBpb2N0bCBpcyB1c3VhbGx5IHRoZSB2ZXJ5IGZpcnN0IG9uZSB3aGljaCBhIGNsaWVudAorICogcGVyZm9ybXMgcmlnaHQgYWZ0ZXIgaXQgb3BlbmVkIGEgL2Rldi9mdyogZmlsZS4KKyAqCisgKiBBcyBhIHNpZGUgZWZmZWN0LCByZWNlcHRpb24gb2YgJUZXX0NERVZfRVZFTlRfQlVTX1JFU0VUIGV2ZW50cyB0byBiZSByZWFkKDIpCisgKiBpcyBzdGFydGVkIGJ5IHRoaXMgaW9jdGwuCisgKi8KK3N0cnVjdCBmd19jZGV2X2dldF9pbmZvIHsKKwlfX3UzMiB2ZXJzaW9uOworCV9fdTMyIHJvbV9sZW5ndGg7CisJX191NjQgcm9tOworCV9fdTY0IGJ1c19yZXNldDsKKwlfX3U2NCBidXNfcmVzZXRfY2xvc3VyZTsKKwlfX3UzMiBjYXJkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9zZW5kX3JlcXVlc3QgLSBTZW5kIGFuIGFzeW5jaHJvbm91cyByZXF1ZXN0IHBhY2tldAorICogQHRjb2RlOglUcmFuc2FjdGlvbiBjb2RlIG9mIHRoZSByZXF1ZXN0CisgKiBAbGVuZ3RoOglMZW5ndGggb2Ygb3V0Z29pbmcgcGF5bG9hZCwgaW4gYnl0ZXMKKyAqIEBvZmZzZXQ6CTQ4LWJpdCBvZmZzZXQgYXQgZGVzdGluYXRpb24gbm9kZQorICogQGNsb3N1cmU6CVBhc3NlZCBiYWNrIHRvIHVzZXJzcGFjZSBpbiB0aGUgcmVzcG9uc2UgZXZlbnQKKyAqIEBkYXRhOglVc2Vyc3BhY2UgcG9pbnRlciB0byBwYXlsb2FkCisgKiBAZ2VuZXJhdGlvbjoJVGhlIGJ1cyBnZW5lcmF0aW9uIHdoZXJlIHBhY2tldCBpcyB2YWxpZAorICoKKyAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBkZXZpY2UuICBUaGlzIGlvY3RsIGltcGxlbWVudHMgYWxsIG91dGdvaW5nIHJlcXVlc3RzLgorICogQm90aCBxdWFkbGV0IGFuZCBibG9jayByZXF1ZXN0IHNwZWNpZnkgdGhlIHBheWxvYWQgYXMgYSBwb2ludGVyIHRvIHRoZSBkYXRhCisgKiBpbiB0aGUgQGRhdGEgZmllbGQuICBPbmNlIHRoZSB0cmFuc2FjdGlvbiBjb21wbGV0ZXMsIHRoZSBrZXJuZWwgd3JpdGVzIGFuCisgKiAmZndfY2Rldl9ldmVudF9yZXNwb25zZSBldmVudCBiYWNrLiAgVGhlIEBjbG9zdXJlIGZpZWxkIGlzIHBhc3NlZCBiYWNrIHRvCisgKiB1c2VyIHNwYWNlIGluIHRoZSByZXNwb25zZSBldmVudC4KKyAqLworc3RydWN0IGZ3X2NkZXZfc2VuZF9yZXF1ZXN0IHsKKwlfX3UzMiB0Y29kZTsKKwlfX3UzMiBsZW5ndGg7CisJX191NjQgb2Zmc2V0OworCV9fdTY0IGNsb3N1cmU7CisJX191NjQgZGF0YTsKKwlfX3UzMiBnZW5lcmF0aW9uOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9zZW5kX3Jlc3BvbnNlIC0gU2VuZCBhbiBhc3luY2hyb25vdXMgcmVzcG9uc2UgcGFja2V0CisgKiBAcmNvZGU6CVJlc3BvbnNlIGNvZGUgYXMgZGV0ZXJtaW5lZCBieSB0aGUgdXNlcnNwYWNlIGhhbmRsZXIKKyAqIEBsZW5ndGg6CUxlbmd0aCBvZiBvdXRnb2luZyBwYXlsb2FkLCBpbiBieXRlcworICogQGRhdGE6CVVzZXJzcGFjZSBwb2ludGVyIHRvIHBheWxvYWQKKyAqIEBoYW5kbGU6CVRoZSBoYW5kbGUgZnJvbSB0aGUgJmZ3X2NkZXZfZXZlbnRfcmVxdWVzdAorICoKKyAqIFNlbmQgYSByZXNwb25zZSB0byBhbiBpbmNvbWluZyByZXF1ZXN0LiAgQnkgc2V0dGluZyB1cCBhbiBhZGRyZXNzIHJhbmdlIHVzaW5nCisgKiB0aGUgJUZXX0NERVZfSU9DX0FMTE9DQVRFIGlvY3RsLCB1c2Vyc3BhY2UgY2FuIGxpc3RlbiBmb3IgaW5jb21pbmcgcmVxdWVzdHMuICBBbgorICogaW5jb21pbmcgcmVxdWVzdCB3aWxsIGdlbmVyYXRlIGFuICVGV19DREVWX0VWRU5UX1JFUVVFU1QsIGFuZCB1c2Vyc3BhY2UgbXVzdAorICogc2VuZCBhIHJlcGx5IHVzaW5nIHRoaXMgaW9jdGwuICBUaGUgZXZlbnQgaGFzIGEgaGFuZGxlIHRvIHRoZSBrZXJuZWwtc2lkZQorICogcGVuZGluZyB0cmFuc2FjdGlvbiwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGlzIGlvY3RsLgorICovCitzdHJ1Y3QgZndfY2Rldl9zZW5kX3Jlc3BvbnNlIHsKKwlfX3UzMiByY29kZTsKKwlfX3UzMiBsZW5ndGg7CisJX191NjQgZGF0YTsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2FsbG9jYXRlIC0gQWxsb2NhdGUgYSBDU1IgaW4gYW4gYWRkcmVzcyByYW5nZQorICogQG9mZnNldDoJU3RhcnQgb2Zmc2V0IG9mIHRoZSBhZGRyZXNzIHJhbmdlCisgKiBAY2xvc3VyZToJVG8gYmUgcGFzc2VkIGJhY2sgdG8gdXNlcnNwYWNlIGluIHJlcXVlc3QgZXZlbnRzCisgKiBAbGVuZ3RoOglMZW5ndGggb2YgdGhlIENTUiwgaW4gYnl0ZXMKKyAqIEBoYW5kbGU6CUhhbmRsZSB0byB0aGUgYWxsb2NhdGlvbiwgd3JpdHRlbiBieSB0aGUga2VybmVsCisgKiBAcmVnaW9uX2VuZDoJRmlyc3QgYWRkcmVzcyBhYm92ZSB0aGUgYWRkcmVzcyByYW5nZSAoYWRkZWQgaW4gQUJJIHY0LCAyLjYuMzYpCisgKgorICogQWxsb2NhdGUgYW4gYWRkcmVzcyByYW5nZSBpbiB0aGUgNDgtYml0IGFkZHJlc3Mgc3BhY2Ugb24gdGhlIGxvY2FsIG5vZGUKKyAqICh0aGUgY29udHJvbGxlcikuICBUaGlzIGFsbG93cyB1c2Vyc3BhY2UgdG8gbGlzdGVuIGZvciByZXF1ZXN0cyB3aXRoIGFuCisgKiBvZmZzZXQgd2l0aGluIHRoYXQgYWRkcmVzcyByYW5nZS4gIEV2ZXJ5IHRpbWUgd2hlbiB0aGUga2VybmVsIHJlY2VpdmVzIGEKKyAqIHJlcXVlc3Qgd2l0aGluIHRoZSByYW5nZSwgYW4gJmZ3X2NkZXZfZXZlbnRfcmVxdWVzdDIgZXZlbnQgd2lsbCBiZSBlbWl0dGVkLgorICogKElmIHRoZSBrZXJuZWwgb3IgdGhlIGNsaWVudCBpbXBsZW1lbnRzIEFCSSB2ZXJzaW9uIDw9IDMsIGFuCisgKiAmZndfY2Rldl9ldmVudF9yZXF1ZXN0IHdpbGwgYmUgZ2VuZXJhdGVkIGluc3RlYWQuKQorICoKKyAqIFRoZSBAY2xvc3VyZSBmaWVsZCBpcyBwYXNzZWQgYmFjayB0byB1c2Vyc3BhY2UgaW4gdGhlc2UgcmVxdWVzdCBldmVudHMuCisgKiBUaGUgQGhhbmRsZSBmaWVsZCBpcyBhbiBvdXQgcGFyYW1ldGVyLCByZXR1cm5pbmcgYSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZAorICogcmFuZ2UgdG8gYmUgdXNlZCBmb3IgbGF0ZXIgZGVhbGxvY2F0aW9uIG9mIHRoZSByYW5nZS4KKyAqCisgKiBUaGUgYWRkcmVzcyByYW5nZSBpcyBhbGxvY2F0ZWQgb24gYWxsIGxvY2FsIG5vZGVzLiAgVGhlIGFkZHJlc3MgYWxsb2NhdGlvbgorICogaXMgZXhjbHVzaXZlIGV4Y2VwdCBmb3IgdGhlIEZDUCBjb21tYW5kIGFuZCByZXNwb25zZSByZWdpc3RlcnMuICBJZiBhbgorICogZXhjbHVzaXZlIGFkZHJlc3MgcmVnaW9uIGlzIGFscmVhZHkgaW4gdXNlLCB0aGUgaW9jdGwgZmFpbHMgd2l0aCBlcnJubyBzZXQKKyAqIHRvICVFQlVTWS4KKyAqCisgKiBJZiBrZXJuZWwgYW5kIGNsaWVudCBpbXBsZW1lbnQgQUJJIHZlcnNpb24gPj0gNCwgdGhlIGtlcm5lbCBsb29rcyB1cCBhIGZyZWUKKyAqIHNwb3Qgb2Ygc2l6ZSBAbGVuZ3RoIGluc2lkZSBbQG9mZnNldC4uQHJlZ2lvbl9lbmQpIGFuZCwgaWYgZm91bmQsIHdyaXRlcworICogdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5ldyBDU1IgYmFjayBpbiBAb2Zmc2V0LiAgSS5lLiBAb2Zmc2V0IGlzIGFuCisgKiBpbiBhbmQgb3V0IHBhcmFtZXRlci4gIElmIHRoaXMgYXV0b21hdGljIHBsYWNlbWVudCBvZiBhIENTUiBpbiBhIGJpZ2dlcgorICogYWRkcmVzcyByYW5nZSBpcyBub3QgZGVzaXJlZCwgdGhlIGNsaWVudCBzaW1wbHkgbmVlZHMgdG8gc2V0IEByZWdpb25fZW5kCisgKiA9IEBvZmZzZXQgKyBAbGVuZ3RoLgorICoKKyAqIElmIHRoZSBrZXJuZWwgb3IgdGhlIGNsaWVudCBpbXBsZW1lbnRzIEFCSSB2ZXJzaW9uIDw9IDMsIEByZWdpb25fZW5kIGlzCisgKiBpZ25vcmVkIGFuZCBlZmZlY3RpdmVseSBhc3N1bWVkIHRvIGJlIEBvZmZzZXQgKyBAbGVuZ3RoLgorICoKKyAqIEByZWdpb25fZW5kIGlzIG9ubHkgcHJlc2VudCBpbiBhIGtlcm5lbCBoZWFkZXIgPj0gMi42LjM2LiAgSWYgbmVjZXNzYXJ5LAorICogdGhpcyBjYW4gZm9yIGV4YW1wbGUgYmUgdGVzdGVkIGJ5ICNpZmRlZiBGV19DREVWX0VWRU5UX1JFUVVFU1QyLgorICovCitzdHJ1Y3QgZndfY2Rldl9hbGxvY2F0ZSB7CisJX191NjQgb2Zmc2V0OworCV9fdTY0IGNsb3N1cmU7CisJX191MzIgbGVuZ3RoOworCV9fdTMyIGhhbmRsZTsKKwlfX3U2NCByZWdpb25fZW5kOwkvKiBhdmFpbGFibGUgc2luY2Uga2VybmVsIHZlcnNpb24gMi42LjM2ICovCit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2RlYWxsb2NhdGUgLSBGcmVlIGEgQ1NSIGFkZHJlc3MgcmFuZ2Ugb3IgaXNvY2hyb25vdXMgcmVzb3VyY2UKKyAqIEBoYW5kbGU6CUhhbmRsZSB0byB0aGUgYWRkcmVzcyByYW5nZSBvciBpc28gcmVzb3VyY2UsIGFzIHJldHVybmVkIGJ5IHRoZQorICoJCWtlcm5lbCB3aGVuIHRoZSByYW5nZSBvciByZXNvdXJjZSB3YXMgYWxsb2NhdGVkCisgKi8KK3N0cnVjdCBmd19jZGV2X2RlYWxsb2NhdGUgeworCV9fdTMyIGhhbmRsZTsKK307CisKKyNkZWZpbmUgRldfQ0RFVl9MT05HX1JFU0VUCTAKKyNkZWZpbmUgRldfQ0RFVl9TSE9SVF9SRVNFVAkxCisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfaW5pdGlhdGVfYnVzX3Jlc2V0IC0gSW5pdGlhdGUgYSBidXMgcmVzZXQKKyAqIEB0eXBlOgklRldfQ0RFVl9TSE9SVF9SRVNFVCBvciAlRldfQ0RFVl9MT05HX1JFU0VUCisgKgorICogSW5pdGlhdGUgYSBidXMgcmVzZXQgZm9yIHRoZSBidXMgdGhpcyBkZXZpY2UgaXMgb24uICBUaGUgYnVzIHJlc2V0IGNhbiBiZQorICogZWl0aGVyIHRoZSBvcmlnaW5hbCAobG9uZykgYnVzIHJlc2V0IG9yIHRoZSBhcmJpdHJhdGVkIChzaG9ydCkgYnVzIHJlc2V0CisgKiBpbnRyb2R1Y2VkIGluIDEzOTRhLTIwMDAuCisgKgorICogVGhlIGlvY3RsIHJldHVybnMgaW1tZWRpYXRlbHkuICBBIHN1YnNlcXVlbnQgJmZ3X2NkZXZfZXZlbnRfYnVzX3Jlc2V0CisgKiBpbmRpY2F0ZXMgd2hlbiB0aGUgcmVzZXQgYWN0dWFsbHkgaGFwcGVuZWQuICBTaW5jZSBBQkkgdjQsIHRoaXMgbWF5IGJlCisgKiBjb25zaWRlcmFibHkgbGF0ZXIgdGhhbiB0aGUgaW9jdGwgYmVjYXVzZSB0aGUga2VybmVsIGVuc3VyZXMgYSBncmFjZSBwZXJpb2QKKyAqIGJldHdlZW4gc3Vic2VxdWVudCBidXMgcmVzZXRzIGFzIHBlciBJRUVFIDEzOTQgYnVzIG1hbmFnZW1lbnQgc3BlY2lmaWNhdGlvbi4KKyAqLworc3RydWN0IGZ3X2NkZXZfaW5pdGlhdGVfYnVzX3Jlc2V0IHsKKwlfX3UzMiB0eXBlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9hZGRfZGVzY3JpcHRvciAtIEFkZCBjb250ZW50cyB0byB0aGUgbG9jYWwgbm9kZSdzIGNvbmZpZyBST00KKyAqIEBpbW1lZGlhdGU6CUlmIG5vbi16ZXJvLCBpbW1lZGlhdGUga2V5IHRvIGluc2VydCBiZWZvcmUgcG9pbnRlcgorICogQGtleToJVXBwZXIgOCBiaXRzIG9mIHJvb3QgZGlyZWN0b3J5IHBvaW50ZXIKKyAqIEBkYXRhOglVc2Vyc3BhY2UgcG9pbnRlciB0byBjb250ZW50cyBvZiBkZXNjcmlwdG9yIGJsb2NrCisgKiBAbGVuZ3RoOglMZW5ndGggb2YgZGVzY3JpcHRvciBibG9jayBkYXRhLCBpbiBxdWFkbGV0cworICogQGhhbmRsZToJSGFuZGxlIHRvIHRoZSBkZXNjcmlwdG9yLCB3cml0dGVuIGJ5IHRoZSBrZXJuZWwKKyAqCisgKiBBZGQgYSBkZXNjcmlwdG9yIGJsb2NrIGFuZCBvcHRpb25hbGx5IGEgcHJlY2VkaW5nIGltbWVkaWF0ZSBrZXkgdG8gdGhlIGxvY2FsCisgKiBub2RlJ3MgQ29uZmlndXJhdGlvbiBST00uCisgKgorICogVGhlIEBrZXkgZmllbGQgc3BlY2lmaWVzIHRoZSB1cHBlciA4IGJpdHMgb2YgdGhlIGRlc2NyaXB0b3Igcm9vdCBkaXJlY3RvcnkKKyAqIHBvaW50ZXIgYW5kIHRoZSBAZGF0YSBhbmQgQGxlbmd0aCBmaWVsZHMgc3BlY2lmeSB0aGUgY29udGVudHMuIFRoZSBAa2V5CisgKiBzaG91bGQgYmUgb2YgdGhlIGZvcm0gMHhYWDAwMDAwMC4gVGhlIG9mZnNldCBwYXJ0IG9mIHRoZSByb290IGRpcmVjdG9yeSBlbnRyeQorICogd2lsbCBiZSBmaWxsZWQgaW4gYnkgdGhlIGtlcm5lbC4KKyAqCisgKiBJZiBub3QgMCwgdGhlIEBpbW1lZGlhdGUgZmllbGQgc3BlY2lmaWVzIGFuIGltbWVkaWF0ZSBrZXkgd2hpY2ggd2lsbCBiZQorICogaW5zZXJ0ZWQgYmVmb3JlIHRoZSByb290IGRpcmVjdG9yeSBwb2ludGVyLgorICoKKyAqIEBpbW1lZGlhdGUsIEBrZXksIGFuZCBAZGF0YSBhcnJheSBlbGVtZW50cyBhcmUgQ1BVLWVuZGlhbiBxdWFkbGV0cy4KKyAqCisgKiBJZiBzdWNjZXNzZnVsLCB0aGUga2VybmVsIGFkZHMgdGhlIGRlc2NyaXB0b3IgYW5kIHdyaXRlcyBiYWNrIGEgQGhhbmRsZSB0bworICogdGhlIGtlcm5lbC1zaWRlIG9iamVjdCB0byBiZSB1c2VkIGZvciBsYXRlciByZW1vdmFsIG9mIHRoZSBkZXNjcmlwdG9yIGJsb2NrCisgKiBhbmQgaW1tZWRpYXRlIGtleS4gIFRoZSBrZXJuZWwgd2lsbCBhbHNvIGdlbmVyYXRlIGEgYnVzIHJlc2V0IHRvIHNpZ25hbCB0aGUKKyAqIGNoYW5nZSBvZiB0aGUgQ29uZmlndXJhdGlvbiBST00gdG8gb3RoZXIgbm9kZXMuCisgKgorICogVGhpcyBpb2N0bCBhZmZlY3RzIHRoZSBDb25maWd1cmF0aW9uIFJPTXMgb2YgYWxsIGxvY2FsIG5vZGVzLgorICogVGhlIGlvY3RsIG9ubHkgc3VjY2VlZHMgb24gZGV2aWNlIGZpbGVzIHdoaWNoIHJlcHJlc2VudCBhIGxvY2FsIG5vZGUuCisgKi8KK3N0cnVjdCBmd19jZGV2X2FkZF9kZXNjcmlwdG9yIHsKKwlfX3UzMiBpbW1lZGlhdGU7CisJX191MzIga2V5OworCV9fdTY0IGRhdGE7CisJX191MzIgbGVuZ3RoOworCV9fdTMyIGhhbmRsZTsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfcmVtb3ZlX2Rlc2NyaXB0b3IgLSBSZW1vdmUgY29udGVudHMgZnJvbSB0aGUgQ29uZmlndXJhdGlvbiBST00KKyAqIEBoYW5kbGU6CUhhbmRsZSB0byB0aGUgZGVzY3JpcHRvciwgYXMgcmV0dXJuZWQgYnkgdGhlIGtlcm5lbCB3aGVuIHRoZQorICoJCWRlc2NyaXB0b3Igd2FzIGFkZGVkCisgKgorICogUmVtb3ZlIGEgZGVzY3JpcHRvciBibG9jayBhbmQgYWNjb21wYW55aW5nIGltbWVkaWF0ZSBrZXkgZnJvbSB0aGUgbG9jYWwKKyAqIG5vZGVzJyBDb25maWd1cmF0aW9uIFJPTXMuICBUaGUga2VybmVsIHdpbGwgYWxzbyBnZW5lcmF0ZSBhIGJ1cyByZXNldCB0bworICogc2lnbmFsIHRoZSBjaGFuZ2Ugb2YgdGhlIENvbmZpZ3VyYXRpb24gUk9NIHRvIG90aGVyIG5vZGVzLgorICovCitzdHJ1Y3QgZndfY2Rldl9yZW1vdmVfZGVzY3JpcHRvciB7CisJX191MzIgaGFuZGxlOworfTsKKworI2RlZmluZSBGV19DREVWX0lTT19DT05URVhUX1RSQU5TTUlUCQkJMAorI2RlZmluZSBGV19DREVWX0lTT19DT05URVhUX1JFQ0VJVkUJCQkxCisjZGVmaW5lIEZXX0NERVZfSVNPX0NPTlRFWFRfUkVDRUlWRV9NVUxUSUNIQU5ORUwJMiAvKiBhZGRlZCBpbiAyLjYuMzYgKi8KKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9jcmVhdGVfaXNvX2NvbnRleHQgLSBDcmVhdGUgYSBjb250ZXh0IGZvciBpc29jaHJvbm91cyBJL08KKyAqIEB0eXBlOgklRldfQ0RFVl9JU09fQ09OVEVYVF9UUkFOU01JVCBvciAlRldfQ0RFVl9JU09fQ09OVEVYVF9SRUNFSVZFIG9yCisgKgkJJUZXX0NERVZfSVNPX0NPTlRFWFRfUkVDRUlWRV9NVUxUSUNIQU5ORUwKKyAqIEBoZWFkZXJfc2l6ZTogSGVhZGVyIHNpemUgdG8gc3RyaXAgaW4gc2luZ2xlLWNoYW5uZWwgcmVjZXB0aW9uCisgKiBAY2hhbm5lbDoJQ2hhbm5lbCB0byBiaW5kIHRvIGluIHNpbmdsZS1jaGFubmVsIHJlY2VwdGlvbiBvciB0cmFuc21pc3Npb24KKyAqIEBzcGVlZDoJVHJhbnNtaXNzaW9uIHNwZWVkCisgKiBAY2xvc3VyZToJVG8gYmUgcmV0dXJuZWQgaW4gJmZ3X2NkZXZfZXZlbnRfaXNvX2ludGVycnVwdCBvcgorICoJCSZmd19jZGV2X2V2ZW50X2lzb19pbnRlcnJ1cHRfbXVsdGljaGFubmVsCisgKiBAaGFuZGxlOglIYW5kbGUgdG8gY29udGV4dCwgd3JpdHRlbiBiYWNrIGJ5IGtlcm5lbAorICoKKyAqIFByaW9yIHRvIHNlbmRpbmcgb3IgcmVjZWl2aW5nIGlzb2Nocm9ub3VzIEkvTywgYSBjb250ZXh0IG11c3QgYmUgY3JlYXRlZC4KKyAqIFRoZSBjb250ZXh0IHJlY29yZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zbWl0IG9yIHJlY2VpdmUgY29uZmlndXJhdGlvbgorICogYW5kIHR5cGljYWxseSBtYXBzIHRvIGFuIHVuZGVybHlpbmcgaGFyZHdhcmUgcmVzb3VyY2UuICBBIGNvbnRleHQgaXMgc2V0IHVwCisgKiBmb3IgZWl0aGVyIHNlbmRpbmcgb3IgcmVjZWl2aW5nLiAgSXQgaXMgYm91bmQgdG8gYSBzcGVjaWZpYyBpc29jaHJvbm91cworICogQGNoYW5uZWwuCisgKgorICogSW4gY2FzZSBvZiBtdWx0aWNoYW5uZWwgcmVjZXB0aW9uLCBAaGVhZGVyX3NpemUgYW5kIEBjaGFubmVsIGFyZSBpZ25vcmVkCisgKiBhbmQgdGhlIGNoYW5uZWxzIGFyZSBzZWxlY3RlZCBieSAlRldfQ0RFVl9JT0NfU0VUX0lTT19DSEFOTkVMUy4KKyAqCisgKiBGb3IgJUZXX0NERVZfSVNPX0NPTlRFWFRfUkVDRUlWRSBjb250ZXh0cywgQGhlYWRlcl9zaXplIG11c3QgYmUgYXQgbGVhc3QgNAorICogYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAgSXQgaXMgaWdub3JlZCBpbiBvdGhlciBjb250ZXh0IHR5cGVzLgorICoKKyAqIEBzcGVlZCBpcyBpZ25vcmVkIGluIHJlY2VpdmUgY29udGV4dCB0eXBlcy4KKyAqCisgKiBJZiBhIGNvbnRleHQgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCB0aGUga2VybmVsIHdyaXRlcyBiYWNrIGEgaGFuZGxlIHRvIHRoZQorICogY29udGV4dCwgd2hpY2ggbXVzdCBiZSBwYXNzZWQgaW4gZm9yIHN1YnNlcXVlbnQgb3BlcmF0aW9ucyBvbiB0aGF0IGNvbnRleHQuCisgKgorICogTGltaXRhdGlvbnM6CisgKiBObyBtb3JlIHRoYW4gb25lIGlzbyBjb250ZXh0IGNhbiBiZSBjcmVhdGVkIHBlciBmZC4KKyAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY29udGV4dHMgdGhhdCBhbGwgdXNlcnNwYWNlIGFuZCBrZXJuZWxzcGFjZSBkcml2ZXJzIGNhbgorICogY3JlYXRlIG9uIGEgY2FyZCBhdCBhIHRpbWUgaXMgYSBoYXJkd2FyZSBsaW1pdCwgdHlwaWNhbGx5IDQgb3IgOCBjb250ZXh0cyBwZXIKKyAqIGRpcmVjdGlvbiwgYW5kIG9mIHRoZW0gYXQgbW9zdCBvbmUgbXVsdGljaGFubmVsIHJlY2VpdmUgY29udGV4dC4KKyAqLworc3RydWN0IGZ3X2NkZXZfY3JlYXRlX2lzb19jb250ZXh0IHsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGhlYWRlcl9zaXplOworCV9fdTMyIGNoYW5uZWw7CisJX191MzIgc3BlZWQ7CisJX191NjQgY2xvc3VyZTsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X3NldF9pc29fY2hhbm5lbHMgLSBTZWxlY3QgY2hhbm5lbHMgaW4gbXVsdGljaGFubmVsIHJlY2VwdGlvbgorICogQGNoYW5uZWxzOglCaXRtYXNrIG9mIGNoYW5uZWxzIHRvIGxpc3RlbiB0bworICogQGhhbmRsZToJSGFuZGxlIG9mIHRoZSBtdXRpY2hhbm5lbCByZWNlaXZlIGNvbnRleHQKKyAqCisgKiBAY2hhbm5lbHMgaXMgdGhlIGJpdHdpc2Ugb3Igb2YgMVVMTCA8PCBuIGZvciBlYWNoIGNoYW5uZWwgbiB0byBsaXN0ZW4gdG8uCisgKgorICogVGhlIGlvY3RsIGZhaWxzIHdpdGggZXJybm8gJUVCVVNZIGlmIHRoZXJlIGlzIGFscmVhZHkgYW5vdGhlciByZWNlaXZlIGNvbnRleHQKKyAqIG9uIGEgY2hhbm5lbCBpbiBAY2hhbm5lbHMuICBJbiB0aGF0IGNhc2UsIHRoZSBiaXRtYXNrIG9mIGFsbCB1bm9jY3VwaWVkCisgKiBjaGFubmVscyBpcyByZXR1cm5lZCBpbiBAY2hhbm5lbHMuCisgKi8KK3N0cnVjdCBmd19jZGV2X3NldF9pc29fY2hhbm5lbHMgeworCV9fdTY0IGNoYW5uZWxzOworCV9fdTMyIGhhbmRsZTsKK307CisKKyNkZWZpbmUgRldfQ0RFVl9JU09fUEFZTE9BRF9MRU5HVEgodikJKHYpCisjZGVmaW5lIEZXX0NERVZfSVNPX0lOVEVSUlVQVAkJKDEgPDwgMTYpCisjZGVmaW5lIEZXX0NERVZfSVNPX1NLSVAJCSgxIDw8IDE3KQorI2RlZmluZSBGV19DREVWX0lTT19TWU5DCQkoMSA8PCAxNykKKyNkZWZpbmUgRldfQ0RFVl9JU09fVEFHKHYpCQkoKHYpIDw8IDE4KQorI2RlZmluZSBGV19DREVWX0lTT19TWSh2KQkJKCh2KSA8PCAyMCkKKyNkZWZpbmUgRldfQ0RFVl9JU09fSEVBREVSX0xFTkdUSCh2KQkoKHYpIDw8IDI0KQorCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2lzb19wYWNrZXQgLSBJc29jaHJvbm91cyBwYWNrZXQKKyAqIEBjb250cm9sOglDb250YWlucyB0aGUgaGVhZGVyIGxlbmd0aCAoOCB1cHBlcm1vc3QgYml0cyksCisgKgkJdGhlIHN5IGZpZWxkICg0IGJpdHMpLCB0aGUgdGFnIGZpZWxkICgyIGJpdHMpLCBhIHN5bmMgZmxhZworICoJCW9yIGEgc2tpcCBmbGFnICgxIGJpdCksIGFuIGludGVycnVwdCBmbGFnICgxIGJpdCksIGFuZCB0aGUKKyAqCQlwYXlsb2FkIGxlbmd0aCAoMTYgbG93ZXJtb3N0IGJpdHMpCisgKiBAaGVhZGVyOglIZWFkZXIgYW5kIHBheWxvYWQgaW4gY2FzZSBvZiBhIHRyYW5zbWl0IGNvbnRleHQuCisgKgorICogJnN0cnVjdCBmd19jZGV2X2lzb19wYWNrZXQgaXMgdXNlZCB0byBkZXNjcmliZSBpc29jaHJvbm91cyBwYWNrZXQgcXVldWVzLgorICogVXNlIHRoZSBGV19DREVWX0lTT18gbWFjcm9zIHRvIGZpbGwgaW4gQGNvbnRyb2wuCisgKiBUaGUgQGhlYWRlciBhcnJheSBpcyBlbXB0eSBpbiBjYXNlIG9mIHJlY2VpdmUgY29udGV4dHMuCisgKgorICogQ29udGV4dCB0eXBlICVGV19DREVWX0lTT19DT05URVhUX1RSQU5TTUlUOgorICoKKyAqIEBjb250cm9sLkhFQURFUl9MRU5HVEggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuICBJdCBzcGVjaWZpZXMgdGhlIG51bWJlcnMgb2YKKyAqIGJ5dGVzIGluIEBoZWFkZXIgdGhhdCB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgcGFja2V0J3MgcGF5bG9hZC4gIFRoZXNlIGJ5dGVzCisgKiBhcmUgY29waWVkIGludG8gdGhlIGtlcm5lbCBhbmQgd2lsbCBub3QgYmUgYWNjZXNzZWQgYWZ0ZXIgdGhlIGlvY3RsIGhhcworICogcmV0dXJuZWQuCisgKgorICogVGhlIEBjb250cm9sLlNZIGFuZCBUQUcgZmllbGRzIGFyZSBjb3BpZWQgdG8gdGhlIGlzbyBwYWNrZXQgaGVhZGVyLiAgVGhlc2UKKyAqIGZpZWxkcyBhcmUgc3BlY2lmaWVkIGJ5IElFRUUgMTM5NGEgYW5kIElFQyA2MTg4My0xLgorICoKKyAqIFRoZSBAY29udHJvbC5TS0lQIGZsYWcgc3BlY2lmaWVzIHRoYXQgbm8gcGFja2V0IGlzIHRvIGJlIHNlbnQgaW4gYSBmcmFtZS4KKyAqIFdoZW4gdXNpbmcgdGhpcywgYWxsIG90aGVyIGZpZWxkcyBleGNlcHQgQGNvbnRyb2wuSU5URVJSVVBUIG11c3QgYmUgemVyby4KKyAqCisgKiBXaGVuIGEgcGFja2V0IHdpdGggdGhlIEBjb250cm9sLklOVEVSUlVQVCBmbGFnIHNldCBoYXMgYmVlbiBjb21wbGV0ZWQsIGFuCisgKiAmZndfY2Rldl9ldmVudF9pc29faW50ZXJydXB0IGV2ZW50IHdpbGwgYmUgc2VudC4KKyAqCisgKiBDb250ZXh0IHR5cGUgJUZXX0NERVZfSVNPX0NPTlRFWFRfUkVDRUlWRToKKyAqCisgKiBAY29udHJvbC5IRUFERVJfTEVOR1RIIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29udGV4dCdzIGhlYWRlcl9zaXplLgorICogSWYgdGhlIEhFQURFUl9MRU5HVEggaXMgbGFyZ2VyIHRoYW4gdGhlIGNvbnRleHQncyBoZWFkZXJfc2l6ZSwgbXVsdGlwbGUKKyAqIHBhY2tldHMgYXJlIHF1ZXVlZCBmb3IgdGhpcyBlbnRyeS4KKyAqCisgKiBUaGUgQGNvbnRyb2wuU1kgYW5kIFRBRyBmaWVsZHMgYXJlIGlnbm9yZWQuCisgKgorICogSWYgdGhlIEBjb250cm9sLlNZTkMgZmxhZyBpcyBzZXQsIHRoZSBjb250ZXh0IGRyb3BzIGFsbCBwYWNrZXRzIHVudGlsIGEKKyAqIHBhY2tldCB3aXRoIGEgc3kgZmllbGQgaXMgcmVjZWl2ZWQgd2hpY2ggbWF0Y2hlcyAmZndfY2Rldl9zdGFydF9pc28uc3luYy4KKyAqCisgKiBAY29udHJvbC5QQVlMT0FEX0xFTkdUSCBkZWZpbmVzIGhvdyBtYW55IHBheWxvYWQgYnl0ZXMgY2FuIGJlIHJlY2VpdmVkIGZvcgorICogb25lIHBhY2tldCAoaW4gYWRkaXRpb24gdG8gcGF5bG9hZCBxdWFkbGV0cyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGFzIGhlYWRlcnMKKyAqIGFuZCBhcmUgc3RyaXBwZWQgYW5kIHJldHVybmVkIGluIHRoZSAmZndfY2Rldl9ldmVudF9pc29faW50ZXJydXB0IHN0cnVjdHVyZSkuCisgKiBJZiBtb3JlIGJ5dGVzIGFyZSByZWNlaXZlZCwgdGhlIGFkZGl0aW9uYWwgYnl0ZXMgYXJlIGRyb3BwZWQuICBJZiBsZXNzIGJ5dGVzCisgKiBhcmUgcmVjZWl2ZWQsIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhpcyBwYXJ0IG9mIHRoZSBwYXlsb2FkIGJ1ZmZlciB3aWxsIG5vdAorICogYmUgd3JpdHRlbiB0bywgbm90IGV2ZW4gYnkgdGhlIG5leHQgcGFja2V0LiAgSS5lLiwgcGFja2V0cyByZWNlaXZlZCBpbgorICogY29uc2VjdXRpdmUgZnJhbWVzIHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGNvbnNlY3V0aXZlIGluIG1lbW9yeS4gIElmIGFuCisgKiBlbnRyeSBoYXMgcXVldWVkIG11bHRpcGxlIHBhY2tldHMsIHRoZSBQQVlMT0FEX0xFTkdUSCBpcyBkaXZpZGVkIGVxdWFsbHkKKyAqIGFtb25nIHRoZW0uCisgKgorICogV2hlbiBhIHBhY2tldCB3aXRoIHRoZSBAY29udHJvbC5JTlRFUlJVUFQgZmxhZyBzZXQgaGFzIGJlZW4gY29tcGxldGVkLCBhbgorICogJmZ3X2NkZXZfZXZlbnRfaXNvX2ludGVycnVwdCBldmVudCB3aWxsIGJlIHNlbnQuICBBbiBlbnRyeSB0aGF0IGhhcyBxdWV1ZWQKKyAqIG11bHRpcGxlIHJlY2VpdmUgcGFja2V0cyBpcyBjb21wbGV0ZWQgd2hlbiBpdHMgbGFzdCBwYWNrZXQgaXMgY29tcGxldGVkLgorICoKKyAqIENvbnRleHQgdHlwZSAlRldfQ0RFVl9JU09fQ09OVEVYVF9SRUNFSVZFX01VTFRJQ0hBTk5FTDoKKyAqCisgKiBIZXJlLCAmZndfY2Rldl9pc29fcGFja2V0IHdvdWxkIGJlIG1vcmUgYXB0bHkgbmFtZWQgX2lzb19idWZmZXJfY2h1bmsgc2luY2UKKyAqIGl0IHNwZWNpZmllcyBhIGNodW5rIG9mIHRoZSBtbWFwKCknZWQgYnVmZmVyLCB3aGlsZSB0aGUgbnVtYmVyIGFuZCBhbGlnbm1lbnQKKyAqIG9mIHBhY2tldHMgdG8gYmUgcGxhY2VkIGludG8gdGhlIGJ1ZmZlciBjaHVuayBpcyBub3Qga25vd24gYmVmb3JlaGFuZC4KKyAqCisgKiBAY29udHJvbC5QQVlMT0FEX0xFTkdUSCBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGNodW5rIGFuZCBzcGVjaWZpZXMgcm9vbQorICogZm9yIGhlYWRlciwgcGF5bG9hZCwgcGFkZGluZywgYW5kIHRyYWlsZXIgYnl0ZXMgb2Ygb25lIG9yIG1vcmUgcGFja2V0cy4KKyAqIEl0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LgorICoKKyAqIEBjb250cm9sLkhFQURFUl9MRU5HVEgsIFRBRyBhbmQgU1kgYXJlIGlnbm9yZWQuICBTWU5DIGlzIHRyZWF0ZWQgYXMgZGVzY3JpYmVkCisgKiBmb3Igc2luZ2xlLWNoYW5uZWwgcmVjZXB0aW9uLgorICoKKyAqIFdoZW4gYSBidWZmZXIgY2h1bmsgd2l0aCB0aGUgQGNvbnRyb2wuSU5URVJSVVBUIGZsYWcgc2V0IGhhcyBiZWVuIGZpbGxlZAorICogZW50aXJlbHksIGFuICZmd19jZGV2X2V2ZW50X2lzb19pbnRlcnJ1cHRfbWMgZXZlbnQgd2lsbCBiZSBzZW50LgorICovCitzdHJ1Y3QgZndfY2Rldl9pc29fcGFja2V0IHsKKwlfX3UzMiBjb250cm9sOworCV9fdTMyIGhlYWRlclswXTsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfcXVldWVfaXNvIC0gUXVldWUgaXNvY2hyb25vdXMgcGFja2V0cyBmb3IgSS9PCisgKiBAcGFja2V0czoJVXNlcnNwYWNlIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgJmZ3X2NkZXZfaXNvX3BhY2tldAorICogQGRhdGE6CVBvaW50ZXIgaW50byBtbWFwKCknZWQgcGF5bG9hZCBidWZmZXIKKyAqIEBzaXplOglTaXplIG9mIHRoZSBAcGFja2V0cyBhcnJheSwgaW4gYnl0ZXMKKyAqIEBoYW5kbGU6CUlzb2Nocm9ub3VzIGNvbnRleHQgaGFuZGxlCisgKgorICogUXVldWUgYSBudW1iZXIgb2YgaXNvY2hyb25vdXMgcGFja2V0cyBmb3IgcmVjZXB0aW9uIG9yIHRyYW5zbWlzc2lvbi4KKyAqIFRoaXMgaW9jdGwgdGFrZXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mICZmd19jZGV2X2lzb19wYWNrZXQgc3RydWN0cywKKyAqIHdoaWNoIGRlc2NyaWJlIGhvdyB0byB0cmFuc21pdCBmcm9tIG9yIHJlY2VpdmUgaW50byBhIGNvbnRpZ3VvdXMgcmVnaW9uCisgKiBvZiBhIG1tYXAoKSdlZCBwYXlsb2FkIGJ1ZmZlci4gIEFzIHBhcnQgb2YgdHJhbnNtaXQgcGFja2V0IGRlc2NyaXB0b3JzLAorICogYSBzZXJpZXMgb2YgaGVhZGVycyBjYW4gYmUgc3VwcGxpZWQsIHdoaWNoIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZQorICogcGF5bG9hZCBkdXJpbmcgRE1BLgorICoKKyAqIFRoZSBrZXJuZWwgbWF5IG9yIG1heSBub3QgcXVldWUgYWxsIHBhY2tldHMsIGJ1dCB3aWxsIHdyaXRlIGJhY2sgdXBkYXRlZAorICogdmFsdWVzIG9mIHRoZSBAcGFja2V0cywgQGRhdGEgYW5kIEBzaXplIGZpZWxkcywgc28gdGhlIGlvY3RsIGNhbiBiZQorICogcmVzdWJtaXR0ZWQgZWFzaWx5LgorICoKKyAqIEluIGNhc2Ugb2YgYSBtdWx0aWNoYW5uZWwgcmVjZWl2ZSBjb250ZXh0LCBAZGF0YSBtdXN0IGJlIHF1YWRsZXQtYWxpZ25lZAorICogcmVsYXRpdmUgdG8gdGhlIGJ1ZmZlciBzdGFydC4KKyAqLworc3RydWN0IGZ3X2NkZXZfcXVldWVfaXNvIHsKKwlfX3U2NCBwYWNrZXRzOworCV9fdTY0IGRhdGE7CisJX191MzIgc2l6ZTsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisjZGVmaW5lIEZXX0NERVZfSVNPX0NPTlRFWFRfTUFUQ0hfVEFHMAkJIDEKKyNkZWZpbmUgRldfQ0RFVl9JU09fQ09OVEVYVF9NQVRDSF9UQUcxCQkgMgorI2RlZmluZSBGV19DREVWX0lTT19DT05URVhUX01BVENIX1RBRzIJCSA0CisjZGVmaW5lIEZXX0NERVZfSVNPX0NPTlRFWFRfTUFUQ0hfVEFHMwkJIDgKKyNkZWZpbmUgRldfQ0RFVl9JU09fQ09OVEVYVF9NQVRDSF9BTExfVEFHUwkxNQorCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X3N0YXJ0X2lzbyAtIFN0YXJ0IGFuIGlzb2Nocm9ub3VzIHRyYW5zbWlzc2lvbiBvciByZWNlcHRpb24KKyAqIEBjeWNsZToJQ3ljbGUgaW4gd2hpY2ggdG8gc3RhcnQgSS9PLiAgSWYgQGN5Y2xlIGlzIGdyZWF0ZXIgdGhhbiBvcgorICoJCWVxdWFsIHRvIDAsIHRoZSBJL08gd2lsbCBzdGFydCBvbiB0aGF0IGN5Y2xlLgorICogQHN5bmM6CURldGVybWluZXMgdGhlIHZhbHVlIHRvIHdhaXQgZm9yIGZvciByZWNlaXZlIHBhY2tldHMgdGhhdCBoYXZlCisgKgkJdGhlICVGV19DREVWX0lTT19TWU5DIGJpdCBzZXQKKyAqIEB0YWdzOglUYWcgZmlsdGVyIGJpdCBtYXNrLiAgT25seSB2YWxpZCBmb3IgaXNvY2hyb25vdXMgcmVjZXB0aW9uLgorICoJCURldGVybWluZXMgdGhlIHRhZyB2YWx1ZXMgZm9yIHdoaWNoIHBhY2tldHMgd2lsbCBiZSBhY2NlcHRlZC4KKyAqCQlVc2UgRldfQ0RFVl9JU09fQ09OVEVYVF9NQVRDSF8gbWFjcm9zIHRvIHNldCBAdGFncy4KKyAqIEBoYW5kbGU6CUlzb2Nocm9ub3VzIGNvbnRleHQgaGFuZGxlIHdpdGhpbiB3aGljaCB0byB0cmFuc21pdCBvciByZWNlaXZlCisgKi8KK3N0cnVjdCBmd19jZGV2X3N0YXJ0X2lzbyB7CisJX19zMzIgY3ljbGU7CisJX191MzIgc3luYzsKKwlfX3UzMiB0YWdzOworCV9fdTMyIGhhbmRsZTsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfc3RvcF9pc28gLSBTdG9wIGFuIGlzb2Nocm9ub3VzIHRyYW5zbWlzc2lvbiBvciByZWNlcHRpb24KKyAqIEBoYW5kbGU6CUhhbmRsZSBvZiBpc29jaHJvbm91cyBjb250ZXh0IHRvIHN0b3AKKyAqLworc3RydWN0IGZ3X2NkZXZfc3RvcF9pc28geworCV9fdTMyIGhhbmRsZTsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfZ2V0X2N5Y2xlX3RpbWVyIC0gcmVhZCBjeWNsZSB0aW1lciByZWdpc3RlcgorICogQGxvY2FsX3RpbWU6ICAgc3lzdGVtIHRpbWUsIGluIG1pY3Jvc2Vjb25kcyBzaW5jZSB0aGUgRXBvY2gKKyAqIEBjeWNsZV90aW1lcjogIEN5Y2xlIFRpbWUgcmVnaXN0ZXIgY29udGVudHMKKyAqCisgKiBTYW1lIGFzICVGV19DREVWX0lPQ19HRVRfQ1lDTEVfVElNRVIyLCBidXQgZml4ZWQgdG8gdXNlICVDTE9DS19SRUFMVElNRQorICogYW5kIG9ubHkgd2l0aCBtaWNyb3NlY29uZHMgcmVzb2x1dGlvbi4KKyAqCisgKiBJbiB2ZXJzaW9uIDEgYW5kIDIgb2YgdGhlIEFCSSwgdGhpcyBpb2N0bCByZXR1cm5lZCB1bnJlbGlhYmxlIChub24tCisgKiBtb25vdG9uaWMpIEBjeWNsZV90aW1lciB2YWx1ZXMgb24gY2VydGFpbiBjb250cm9sbGVycy4KKyAqLworc3RydWN0IGZ3X2NkZXZfZ2V0X2N5Y2xlX3RpbWVyIHsKKwlfX3U2NCBsb2NhbF90aW1lOworCV9fdTMyIGN5Y2xlX3RpbWVyOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9nZXRfY3ljbGVfdGltZXIyIC0gcmVhZCBjeWNsZSB0aW1lciByZWdpc3RlcgorICogQHR2X3NlYzogICAgICAgc3lzdGVtIHRpbWUsIHNlY29uZHMKKyAqIEB0dl9uc2VjOiAgICAgIHN5c3RlbSB0aW1lLCBzdWItc2Vjb25kcyBwYXJ0IGluIG5hbm9zZWNvbmRzCisgKiBAY2xrX2lkOiAgICAgICBpbnB1dCBwYXJhbWV0ZXIsIGNsb2NrIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBzeXN0ZW0gdGltZQorICogQGN5Y2xlX3RpbWVyOiAgQ3ljbGUgVGltZSByZWdpc3RlciBjb250ZW50cworICoKKyAqIFRoZSAlRldfQ0RFVl9JT0NfR0VUX0NZQ0xFX1RJTUVSMiBpb2N0bCByZWFkcyB0aGUgaXNvY2hyb25vdXMgY3ljbGUgdGltZXIKKyAqIGFuZCBhbHNvIHRoZSBzeXN0ZW0gY2xvY2suICBUaGlzIGFsbG93cyB0byBjb3JyZWxhdGUgcmVjZXB0aW9uIHRpbWUgb2YKKyAqIGlzb2Nocm9ub3VzIHBhY2tldHMgd2l0aCBzeXN0ZW0gdGltZS4KKyAqCisgKiBAY2xrX2lkIGxldHMgeW91IGNob29zZSBhIGNsb2NrIGxpa2Ugd2l0aCBQT1NJWCcgY2xvY2tfZ2V0dGltZSBmdW5jdGlvbi4KKyAqIFN1cHBvcnRlZCBAY2xrX2lkIHZhbHVlcyBhcmUgUE9TSVgnICVDTE9DS19SRUFMVElNRSBhbmQgJUNMT0NLX01PTk9UT05JQworICogYW5kIExpbnV4JyAlQ0xPQ0tfTU9OT1RPTklDX1JBVy4KKyAqCisgKiBAY3ljbGVfdGltZXIgY29uc2lzdHMgb2YgNyBiaXRzIGN5Y2xlU2Vjb25kcywgMTMgYml0cyBjeWNsZUNvdW50LCBhbmQKKyAqIDEyIGJpdHMgY3ljbGVPZmZzZXQsIGluIGhvc3QgYnl0ZSBvcmRlci4gIENmLiB0aGUgQ3ljbGUgVGltZSByZWdpc3RlcgorICogcGVyIElFRUUgMTM5NCBvciBJc29jaHJvbm91cyBDeWNsZSBUaW1lciByZWdpc3RlciBwZXIgT0hDSS0xMzk0LgorICovCitzdHJ1Y3QgZndfY2Rldl9nZXRfY3ljbGVfdGltZXIyIHsKKwlfX3M2NCB0dl9zZWM7CisJX19zMzIgdHZfbnNlYzsKKwlfX3MzMiBjbGtfaWQ7CisJX191MzIgY3ljbGVfdGltZXI7Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2FsbG9jYXRlX2lzb19yZXNvdXJjZSAtIChEZSlhbGxvY2F0ZSBhIGNoYW5uZWwgb3IgYmFuZHdpZHRoCisgKiBAY2xvc3VyZToJUGFzc2VkIGJhY2sgdG8gdXNlcnNwYWNlIGluIGNvcnJlc3BvbmRpbmcgaXNvIHJlc291cmNlIGV2ZW50cworICogQGNoYW5uZWxzOglJc29jaHJvbm91cyBjaGFubmVscyBvZiB3aGljaCBvbmUgaXMgdG8gYmUgKGRlKWFsbG9jYXRlZAorICogQGJhbmR3aWR0aDoJSXNvY2hyb25vdXMgYmFuZHdpZHRoIHVuaXRzIHRvIGJlIChkZSlhbGxvY2F0ZWQKKyAqIEBoYW5kbGU6CUhhbmRsZSB0byB0aGUgYWxsb2NhdGlvbiwgd3JpdHRlbiBieSB0aGUga2VybmVsIChvbmx5IHZhbGlkIGluCisgKgkJY2FzZSBvZiAlRldfQ0RFVl9JT0NfQUxMT0NBVEVfSVNPX1JFU09VUkNFIGlvY3RscykKKyAqCisgKiBUaGUgJUZXX0NERVZfSU9DX0FMTE9DQVRFX0lTT19SRVNPVVJDRSBpb2N0bCBpbml0aWF0ZXMgYWxsb2NhdGlvbiBvZiBhbgorICogaXNvY2hyb25vdXMgY2hhbm5lbCBhbmQvb3Igb2YgaXNvY2hyb25vdXMgYmFuZHdpZHRoIGF0IHRoZSBpc29jaHJvbm91cworICogcmVzb3VyY2UgbWFuYWdlciAoSVJNKS4gIE9ubHkgb25lIG9mIHRoZSBjaGFubmVscyBzcGVjaWZpZWQgaW4gQGNoYW5uZWxzIGlzCisgKiBhbGxvY2F0ZWQuICBBbiAlRldfQ0RFVl9FVkVOVF9JU09fUkVTT1VSQ0VfQUxMT0NBVEVEIGlzIHNlbnQgYWZ0ZXIKKyAqIGNvbW11bmljYXRpb24gd2l0aCB0aGUgSVJNLCBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBpbiB0aGUgZXZlbnQgZGF0YS4KKyAqIFRoZSBrZXJuZWwgd2lsbCBhdXRvbWF0aWNhbGx5IHJlYWxsb2NhdGUgdGhlIHJlc291cmNlcyBhZnRlciBidXMgcmVzZXRzLgorICogU2hvdWxkIGEgcmVhbGxvY2F0aW9uIGZhaWwsIGFuICVGV19DREVWX0VWRU5UX0lTT19SRVNPVVJDRV9ERUFMTE9DQVRFRCBldmVudAorICogd2lsbCBiZSBzZW50LiAgVGhlIGtlcm5lbCB3aWxsIGFsc28gYXV0b21hdGljYWxseSBkZWFsbG9jYXRlIHRoZSByZXNvdXJjZXMKKyAqIHdoZW4gdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBjbG9zZWQuCisgKgorICogVGhlICVGV19DREVWX0lPQ19ERUFMTE9DQVRFX0lTT19SRVNPVVJDRSBpb2N0bCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZQorICogZGVhbGxvY2F0aW9uIG9mIHJlc291cmNlcyB3aGljaCB3ZXJlIGFsbG9jYXRlZCBhcyBkZXNjcmliZWQgYWJvdmUuCisgKiBBbiAlRldfQ0RFVl9FVkVOVF9JU09fUkVTT1VSQ0VfREVBTExPQ0FURUQgZXZlbnQgY29uY2x1ZGVzIHRoaXMgb3BlcmF0aW9uLgorICoKKyAqIFRoZSAlRldfQ0RFVl9JT0NfQUxMT0NBVEVfSVNPX1JFU09VUkNFX09OQ0UgaW9jdGwgaXMgYSB2YXJpYW50IG9mIGFsbG9jYXRpb24KKyAqIHdpdGhvdXQgYXV0b21hdGljIHJlLSBvciBkZWFsbG9jYXRpb24uCisgKiBBbiAlRldfQ0RFVl9FVkVOVF9JU09fUkVTT1VSQ0VfQUxMT0NBVEVEIGV2ZW50IGNvbmNsdWRlcyB0aGlzIG9wZXJhdGlvbiwKKyAqIGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlIGluIGl0cyBkYXRhLgorICoKKyAqIFRoZSAlRldfQ0RFVl9JT0NfREVBTExPQ0FURV9JU09fUkVTT1VSQ0VfT05DRSBpb2N0bCB3b3JrcyBsaWtlCisgKiAlRldfQ0RFVl9JT0NfQUxMT0NBVEVfSVNPX1JFU09VUkNFX09OQ0UgZXhjZXB0IHRoYXQgcmVzb3VyY2VzIGFyZSBmcmVlZAorICogaW5zdGVhZCBvZiBhbGxvY2F0ZWQuCisgKiBBbiAlRldfQ0RFVl9FVkVOVF9JU09fUkVTT1VSQ0VfREVBTExPQ0FURUQgZXZlbnQgY29uY2x1ZGVzIHRoaXMgb3BlcmF0aW9uLgorICoKKyAqIFRvIHN1bW1hcml6ZSwgJUZXX0NERVZfSU9DX0FMTE9DQVRFX0lTT19SRVNPVVJDRSBhbGxvY2F0ZXMgaXNvIHJlc291cmNlcworICogZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgZmQgb3IgQGhhbmRsZS4KKyAqIEluIGNvbnRyYXN0LCAlRldfQ0RFVl9JT0NfQUxMT0NBVEVfSVNPX1JFU09VUkNFX09OQ0UgYWxsb2NhdGVzIGlzbyByZXNvdXJjZXMKKyAqIGZvciB0aGUgZHVyYXRpb24gb2YgYSBidXMgZ2VuZXJhdGlvbi4KKyAqCisgKiBAY2hhbm5lbHMgaXMgYSBob3N0LWVuZGlhbiBiaXRmaWVsZCB3aXRoIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQKKyAqIHJlcHJlc2VudGluZyBjaGFubmVsIDAgYW5kIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCByZXByZXNlbnRpbmcgY2hhbm5lbCA2MzoKKyAqIDFVTEwgPDwgYyBmb3IgZWFjaCBjaGFubmVsIGMgdGhhdCBpcyBhIGNhbmRpZGF0ZSBmb3IgKGRlKWFsbG9jYXRpb24uCisgKgorICogQGJhbmR3aWR0aCBpcyBleHByZXNzZWQgaW4gYmFuZHdpZHRoIGFsbG9jYXRpb24gdW5pdHMsIGkuZS4gdGhlIHRpbWUgdG8gc2VuZAorICogb25lIHF1YWRsZXQgb2YgZGF0YSAocGF5bG9hZCBvciBoZWFkZXIgZGF0YSkgYXQgc3BlZWQgUzE2MDAuCisgKi8KK3N0cnVjdCBmd19jZGV2X2FsbG9jYXRlX2lzb19yZXNvdXJjZSB7CisJX191NjQgY2xvc3VyZTsKKwlfX3U2NCBjaGFubmVsczsKKwlfX3UzMiBiYW5kd2lkdGg7CisJX191MzIgaGFuZGxlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9zZW5kX3N0cmVhbV9wYWNrZXQgLSBzZW5kIGFuIGFzeW5jaHJvbm91cyBzdHJlYW0gcGFja2V0CisgKiBAbGVuZ3RoOglMZW5ndGggb2Ygb3V0Z29pbmcgcGF5bG9hZCwgaW4gYnl0ZXMKKyAqIEB0YWc6CURhdGEgZm9ybWF0IHRhZworICogQGNoYW5uZWw6CUlzb2Nocm9ub3VzIGNoYW5uZWwgdG8gdHJhbnNtaXQgdG8KKyAqIEBzeToJCVN5bmNocm9uaXphdGlvbiBjb2RlCisgKiBAY2xvc3VyZToJUGFzc2VkIGJhY2sgdG8gdXNlcnNwYWNlIGluIHRoZSByZXNwb25zZSBldmVudAorICogQGRhdGE6CVVzZXJzcGFjZSBwb2ludGVyIHRvIHBheWxvYWQKKyAqIEBnZW5lcmF0aW9uOglUaGUgYnVzIGdlbmVyYXRpb24gd2hlcmUgcGFja2V0IGlzIHZhbGlkCisgKiBAc3BlZWQ6CVNwZWVkIHRvIHRyYW5zbWl0IGF0CisgKgorICogVGhlICVGV19DREVWX0lPQ19TRU5EX1NUUkVBTV9QQUNLRVQgaW9jdGwgc2VuZHMgYW4gYXN5bmNocm9ub3VzIHN0cmVhbSBwYWNrZXQKKyAqIHRvIGV2ZXJ5IGRldmljZSB3aGljaCBpcyBsaXN0ZW5pbmcgdG8gdGhlIHNwZWNpZmllZCBjaGFubmVsLiAgVGhlIGtlcm5lbAorICogd3JpdGVzIGFuICZmd19jZGV2X2V2ZW50X3Jlc3BvbnNlIGV2ZW50IHdoaWNoIGluZGljYXRlcyBzdWNjZXNzIG9yIGZhaWx1cmUgb2YKKyAqIHRoZSB0cmFuc21pc3Npb24uCisgKi8KK3N0cnVjdCBmd19jZGV2X3NlbmRfc3RyZWFtX3BhY2tldCB7CisJX191MzIgbGVuZ3RoOworCV9fdTMyIHRhZzsKKwlfX3UzMiBjaGFubmVsOworCV9fdTMyIHN5OworCV9fdTY0IGNsb3N1cmU7CisJX191NjQgZGF0YTsKKwlfX3UzMiBnZW5lcmF0aW9uOworCV9fdTMyIHNwZWVkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9zZW5kX3BoeV9wYWNrZXQgLSBzZW5kIGEgUEhZIHBhY2tldAorICogQGNsb3N1cmU6CVBhc3NlZCBiYWNrIHRvIHVzZXJzcGFjZSBpbiB0aGUgUEhZLXBhY2tldC1zZW50IGV2ZW50CisgKiBAZGF0YToJRmlyc3QgYW5kIHNlY29uZCBxdWFkbGV0IG9mIHRoZSBQSFkgcGFja2V0CisgKiBAZ2VuZXJhdGlvbjoJVGhlIGJ1cyBnZW5lcmF0aW9uIHdoZXJlIHBhY2tldCBpcyB2YWxpZAorICoKKyAqIFRoZSAlRldfQ0RFVl9JT0NfU0VORF9QSFlfUEFDS0VUIGlvY3RsIHNlbmRzIGEgUEhZIHBhY2tldCB0byBhbGwgbm9kZXMKKyAqIG9uIHRoZSBzYW1lIGNhcmQgYXMgdGhpcyBkZXZpY2UuICBBZnRlciB0cmFuc21pc3Npb24sIGFuCisgKiAlRldfQ0RFVl9FVkVOVF9QSFlfUEFDS0VUX1NFTlQgZXZlbnQgaXMgZ2VuZXJhdGVkLgorICoKKyAqIFRoZSBwYXlsb2FkIEBkYXRhW10gc2hhbGwgYmUgc3BlY2lmaWVkIGluIGhvc3QgYnl0ZSBvcmRlci4gIFVzdWFsbHksCisgKiBAZGF0YVsxXSBuZWVkcyB0byBiZSB0aGUgYml0d2lzZSBpbnZlcnNlIG9mIEBkYXRhWzBdLiAgVmVyc2FQSFkgcGFja2V0cworICogYXJlIGFuIGV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUuCisgKgorICogVGhlIGlvY3RsIGlzIG9ubHkgcGVybWl0dGVkIG9uIGRldmljZSBmaWxlcyB3aGljaCByZXByZXNlbnQgYSBsb2NhbCBub2RlLgorICovCitzdHJ1Y3QgZndfY2Rldl9zZW5kX3BoeV9wYWNrZXQgeworCV9fdTY0IGNsb3N1cmU7CisJX191MzIgZGF0YVsyXTsKKwlfX3UzMiBnZW5lcmF0aW9uOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9yZWNlaXZlX3BoeV9wYWNrZXRzIC0gc3RhcnQgcmVjZXB0aW9uIG9mIFBIWSBwYWNrZXRzCisgKiBAY2xvc3VyZTogUGFzc2VkIGJhY2sgdG8gdXNlcnNwYWNlIGluIHBoeSBwYWNrZXQgZXZlbnRzCisgKgorICogVGhpcyBpb2N0bCBhY3RpdmF0ZXMgaXNzdWluZyBvZiAlRldfQ0RFVl9FVkVOVF9QSFlfUEFDS0VUX1JFQ0VJVkVEIGR1ZSB0bworICogaW5jb21pbmcgUEhZIHBhY2tldHMgZnJvbSBhbnkgbm9kZSBvbiB0aGUgc2FtZSBidXMgYXMgdGhlIGRldmljZS4KKyAqCisgKiBUaGUgaW9jdGwgaXMgb25seSBwZXJtaXR0ZWQgb24gZGV2aWNlIGZpbGVzIHdoaWNoIHJlcHJlc2VudCBhIGxvY2FsIG5vZGUuCisgKi8KK3N0cnVjdCBmd19jZGV2X3JlY2VpdmVfcGh5X3BhY2tldHMgeworCV9fdTY0IGNsb3N1cmU7Cit9OworCisjZGVmaW5lIEZXX0NERVZfVkVSU0lPTiAzIC8qIE1lYW5pbmdsZXNzIGxlZ2FjeSBtYWNybzsgZG9uJ3QgdXNlIGl0LiAqLworCisjZW5kaWYgLyogX0xJTlVYX0ZJUkVXSVJFX0NERVZfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9maXJld2lyZS1jb25zdGFudHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmlyZXdpcmUtY29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI0YmI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmlyZXdpcmUtY29uc3RhbnRzLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIElFRUUgMTM5NCBjb25zdGFudHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgIEtyaXN0aWFuIEhvZWdzYmVyZyA8a3JoQGJpdHBsYW5ldC5uZXQ+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0ZJUkVXSVJFX0NPTlNUQU5UU19ICisjZGVmaW5lIF9MSU5VWF9GSVJFV0lSRV9DT05TVEFOVFNfSAorCisjZGVmaW5lIFRDT0RFX1dSSVRFX1FVQURMRVRfUkVRVUVTVAkweDAKKyNkZWZpbmUgVENPREVfV1JJVEVfQkxPQ0tfUkVRVUVTVAkweDEKKyNkZWZpbmUgVENPREVfV1JJVEVfUkVTUE9OU0UJCTB4MgorI2RlZmluZSBUQ09ERV9SRUFEX1FVQURMRVRfUkVRVUVTVAkweDQKKyNkZWZpbmUgVENPREVfUkVBRF9CTE9DS19SRVFVRVNUCTB4NQorI2RlZmluZSBUQ09ERV9SRUFEX1FVQURMRVRfUkVTUE9OU0UJMHg2CisjZGVmaW5lIFRDT0RFX1JFQURfQkxPQ0tfUkVTUE9OU0UJMHg3CisjZGVmaW5lIFRDT0RFX0NZQ0xFX1NUQVJUCQkweDgKKyNkZWZpbmUgVENPREVfTE9DS19SRVFVRVNUCQkweDkKKyNkZWZpbmUgVENPREVfU1RSRUFNX0RBVEEJCTB4YQorI2RlZmluZSBUQ09ERV9MT0NLX1JFU1BPTlNFCQkweGIKKworI2RlZmluZSBFWFRDT0RFX01BU0tfU1dBUAkJMHgxCisjZGVmaW5lIEVYVENPREVfQ09NUEFSRV9TV0FQCQkweDIKKyNkZWZpbmUgRVhUQ09ERV9GRVRDSF9BREQJCTB4MworI2RlZmluZSBFWFRDT0RFX0xJVFRMRV9BREQJCTB4NAorI2RlZmluZSBFWFRDT0RFX0JPVU5ERURfQURECQkweDUKKyNkZWZpbmUgRVhUQ09ERV9XUkFQX0FERAkJMHg2CisjZGVmaW5lIEVYVENPREVfVkVORE9SX0RFUEVOREVOVAkweDcKKworLyogTGludXggZmlyZXdpcmUtY29yZSAoSnVqdSkgc3BlY2lmaWMgdGNvZGVzICovCisjZGVmaW5lIFRDT0RFX0xPQ0tfTUFTS19TV0FQCQkoMHgxMCB8IEVYVENPREVfTUFTS19TV0FQKQorI2RlZmluZSBUQ09ERV9MT0NLX0NPTVBBUkVfU1dBUAkJKDB4MTAgfCBFWFRDT0RFX0NPTVBBUkVfU1dBUCkKKyNkZWZpbmUgVENPREVfTE9DS19GRVRDSF9BREQJCSgweDEwIHwgRVhUQ09ERV9GRVRDSF9BREQpCisjZGVmaW5lIFRDT0RFX0xPQ0tfTElUVExFX0FERAkJKDB4MTAgfCBFWFRDT0RFX0xJVFRMRV9BREQpCisjZGVmaW5lIFRDT0RFX0xPQ0tfQk9VTkRFRF9BREQJCSgweDEwIHwgRVhUQ09ERV9CT1VOREVEX0FERCkKKyNkZWZpbmUgVENPREVfTE9DS19XUkFQX0FERAkJKDB4MTAgfCBFWFRDT0RFX1dSQVBfQUREKQorI2RlZmluZSBUQ09ERV9MT0NLX1ZFTkRPUl9ERVBFTkRFTlQJKDB4MTAgfCBFWFRDT0RFX1ZFTkRPUl9ERVBFTkRFTlQpCisKKyNkZWZpbmUgUkNPREVfQ09NUExFVEUJCQkweDAKKyNkZWZpbmUgUkNPREVfQ09ORkxJQ1RfRVJST1IJCTB4NAorI2RlZmluZSBSQ09ERV9EQVRBX0VSUk9SCQkweDUKKyNkZWZpbmUgUkNPREVfVFlQRV9FUlJPUgkJMHg2CisjZGVmaW5lIFJDT0RFX0FERFJFU1NfRVJST1IJCTB4NworCisvKiBMaW51eCBmaXJld2lyZS1jb3JlIChKdWp1KSBzcGVjaWZpYyByY29kZXMgKi8KKyNkZWZpbmUgUkNPREVfU0VORF9FUlJPUgkJMHgxMAorI2RlZmluZSBSQ09ERV9DQU5DRUxMRUQJCQkweDExCisjZGVmaW5lIFJDT0RFX0JVU1kJCQkweDEyCisjZGVmaW5lIFJDT0RFX0dFTkVSQVRJT04JCTB4MTMKKyNkZWZpbmUgUkNPREVfTk9fQUNLCQkJMHgxNAorCisjZGVmaW5lIFNDT0RFXzEwMAkJCTB4MAorI2RlZmluZSBTQ09ERV8yMDAJCQkweDEKKyNkZWZpbmUgU0NPREVfNDAwCQkJMHgyCisjZGVmaW5lIFNDT0RFXzgwMAkJCTB4MworI2RlZmluZSBTQ09ERV8xNjAwCQkJMHg0CisjZGVmaW5lIFNDT0RFXzMyMDAJCQkweDUKKyNkZWZpbmUgU0NPREVfQkVUQQkJCTB4MworCisjZGVmaW5lIEFDS19DT01QTEVURQkJCTB4MQorI2RlZmluZSBBQ0tfUEVORElORwkJCTB4MgorI2RlZmluZSBBQ0tfQlVTWV9YCQkJMHg0CisjZGVmaW5lIEFDS19CVVNZX0EJCQkweDUKKyNkZWZpbmUgQUNLX0JVU1lfQgkJCTB4NgorI2RlZmluZSBBQ0tfREFUQV9FUlJPUgkJCTB4ZAorI2RlZmluZSBBQ0tfVFlQRV9FUlJPUgkJCTB4ZQorCisjZGVmaW5lIFJFVFJZXzEJCQkJMHgwMAorI2RlZmluZSBSRVRSWV9YCQkJCTB4MDEKKyNkZWZpbmUgUkVUUllfQQkJCQkweDAyCisjZGVmaW5lIFJFVFJZX0IJCQkJMHgwMworCisjZW5kaWYgLyogX0xJTlVYX0ZJUkVXSVJFX0NPTlNUQU5UU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZsYXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmxhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTFiYzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZsYXQuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgIERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkbUBzbmFwZ2Vhci5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTggICAgICAgS2VubmV0aCBBbGJhbm93c2tpIDxramFoZHNAa2phaGRzLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgU2lsdmVyIEhhbW1lciBHcm91cCwgTHRkLgorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgZGVmaW5pdGlvbnMgYW5kIHN0cnVjdHVyZXMgbmVlZGVkIHRvCisgKiBzdXBwb3J0IHVDbGludXggZmxhdC1mb3JtYXQgZXhlY3V0YWJsZXMuCisgKi8KKworI2lmbmRlZiBfTElOVVhfRkxBVF9ICisjZGVmaW5lIF9MSU5VWF9GTEFUX0gKKworCisjZGVmaW5lCUZMQVRfVkVSU0lPTgkJCTB4MDAwMDAwMDRMCisKKyNpZmRlZiBDT05GSUdfQklORk1UX1NIQVJFRF9GTEFUCisjZGVmaW5lCU1BWF9TSEFSRURfTElCUwkJCSg0KQorI2Vsc2UKKyNkZWZpbmUJTUFYX1NIQVJFRF9MSUJTCQkJKDEpCisjZW5kaWYKKworLyoKKyAqIFRvIG1ha2UgZXZlcnl0aGluZyBlYXNpZXIgdG8gcG9ydCBhbmQgbWFuYWdlIGNyb3NzIHBsYXRmb3JtCisgKiBkZXZlbG9wbWVudCwgIGFsbCBmaWVsZHMgYXJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqLworCitzdHJ1Y3QgZmxhdF9oZHIgeworCWNoYXIgbWFnaWNbNF07CisJdW5zaWduZWQgbG9uZyByZXY7ICAgICAgICAgIC8qIHZlcnNpb24gKGFzIGFib3ZlKSAqLworCXVuc2lnbmVkIGxvbmcgZW50cnk7ICAgICAgICAvKiBPZmZzZXQgb2YgZmlyc3QgZXhlY3V0YWJsZSBpbnN0cnVjdGlvbgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRleHQgc2VnbWVudCBmcm9tIGJlZ2lubmluZyBvZiBmaWxlICovCisJdW5zaWduZWQgbG9uZyBkYXRhX3N0YXJ0OyAgIC8qIE9mZnNldCBvZiBkYXRhIHNlZ21lbnQgZnJvbSBiZWdpbm5pbmcgb2YKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSAqLworCXVuc2lnbmVkIGxvbmcgZGF0YV9lbmQ7ICAgICAvKiBPZmZzZXQgb2YgZW5kIG9mIGRhdGEgc2VnbWVudAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGJlZ2lubmluZyBvZiBmaWxlICovCisJdW5zaWduZWQgbG9uZyBic3NfZW5kOyAgICAgIC8qIE9mZnNldCBvZiBlbmQgb2YgYnNzIHNlZ21lbnQgZnJvbSBiZWdpbm5pbmcKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgZmlsZSAqLworCisJLyogKEl0IGlzIGFzc3VtZWQgdGhhdCBkYXRhX2VuZCB0aHJvdWdoIGJzc19lbmQgZm9ybXMgdGhlIGJzcyBzZWdtZW50LikgKi8KKworCXVuc2lnbmVkIGxvbmcgc3RhY2tfc2l6ZTsgICAvKiBTaXplIG9mIHN0YWNrLCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgcmVsb2Nfc3RhcnQ7ICAvKiBPZmZzZXQgb2YgcmVsb2NhdGlvbiByZWNvcmRzIGZyb20KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5uaW5nIG9mIGZpbGUgKi8KKwl1bnNpZ25lZCBsb25nIHJlbG9jX2NvdW50OyAgLyogTnVtYmVyIG9mIHJlbG9jYXRpb24gcmVjb3JkcyAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7ICAgICAgIAorCXVuc2lnbmVkIGxvbmcgYnVpbGRfZGF0ZTsgICAvKiBXaGVuIHRoZSBwcm9ncmFtL2xpYnJhcnkgd2FzIGJ1aWx0ICovCisJdW5zaWduZWQgbG9uZyBmaWxsZXJbNV07ICAgIC8qIFJlc2VydmVyZWQsIHNldCB0byB6ZXJvICovCit9OworCisjZGVmaW5lIEZMQVRfRkxBR19SQU0gICAgMHgwMDAxIC8qIGxvYWQgcHJvZ3JhbSBlbnRpcmVseSBpbnRvIFJBTSAqLworI2RlZmluZSBGTEFUX0ZMQUdfR09UUElDIDB4MDAwMiAvKiBwcm9ncmFtIGlzIFBJQyB3aXRoIEdPVCAqLworI2RlZmluZSBGTEFUX0ZMQUdfR1pJUCAgIDB4MDAwNCAvKiBhbGwgYnV0IHRoZSBoZWFkZXIgaXMgY29tcHJlc3NlZCAqLworI2RlZmluZSBGTEFUX0ZMQUdfR1pEQVRBIDB4MDAwOCAvKiBvbmx5IGRhdGEvcmVsb2NzIGFyZSBjb21wcmVzc2VkIChmb3IgWElQKSAqLworI2RlZmluZSBGTEFUX0ZMQUdfS1RSQUNFIDB4MDAxMCAvKiBvdXRwdXQgdXNlZnVsIGtlcm5lbCB0cmFjZSBmb3IgZGVidWdnaW5nICovCisKKworCisjZW5kaWYgLyogX0xJTlVYX0ZMQVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYTI1YWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTAsMCArMSwzNzcgQEAKKyNpZm5kZWYgX0xJTlVYX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX0ZTX0gKKworLyoKKyAqIFRoaXMgZmlsZSBoYXMgZGVmaW5pdGlvbnMgZm9yIHNvbWUgaW1wb3J0YW50IGZpbGUgdGFibGUKKyAqIHN0cnVjdHVyZXMgZXRjLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa190eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBJdCdzIHNpbGx5IHRvIGhhdmUgTlJfT1BFTiBiaWdnZXIgdGhhbiBOUl9GSUxFLCBidXQgeW91IGNhbiBjaGFuZ2UKKyAqIHRoZSBmaWxlIGxpbWl0IGF0IHJ1bnRpbWUgYW5kIG9ubHkgcm9vdCBjYW4gaW5jcmVhc2UgdGhlIHBlci1wcm9jZXNzCisgKiBucl9maWxlIHJsaW1pdCwgc28gaXQncyBzYWZlIHRvIHNldCB1cCBhIHJpZGljdWxvdXNseSBoaWdoIGFic29sdXRlCisgKiB1cHBlciBsaW1pdCBvbiBmaWxlcy1wZXItcHJvY2Vzcy4KKyAqCisgKiBTb21lIHByb2dyYW1zIChub3RhYmx5IHRob3NlIHVzaW5nIHNlbGVjdCgpKSBtYXkgaGF2ZSB0byBiZSAKKyAqIHJlY29tcGlsZWQgdG8gdGFrZSBmdWxsIGFkdmFudGFnZSBvZiB0aGUgbmV3IGxpbWl0cy4uICAKKyAqLworCisvKiBGaXhlZCBjb25zdGFudHMgZmlyc3Q6ICovCisjdW5kZWYgTlJfT1BFTgorI2RlZmluZSBJTlJfT1BFTl9DVVIgMTAyNAkvKiBJbml0aWFsIHNldHRpbmcgZm9yIG5maWxlIHJsaW1pdHMgKi8KKyNkZWZpbmUgSU5SX09QRU5fTUFYIDQwOTYJLyogSGFyZCBsaW1pdCBmb3IgbmZpbGUgcmxpbWl0cyAqLworCisjZGVmaW5lIEJMT0NLX1NJWkVfQklUUyAxMAorI2RlZmluZSBCTE9DS19TSVpFICgxPDxCTE9DS19TSVpFX0JJVFMpCisKKyNkZWZpbmUgU0VFS19TRVQJMAkvKiBzZWVrIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZiBmaWxlICovCisjZGVmaW5lIFNFRUtfQ1VSCTEJLyogc2VlayByZWxhdGl2ZSB0byBjdXJyZW50IGZpbGUgcG9zaXRpb24gKi8KKyNkZWZpbmUgU0VFS19FTkQJMgkvKiBzZWVrIHJlbGF0aXZlIHRvIGVuZCBvZiBmaWxlICovCisjZGVmaW5lIFNFRUtfREFUQQkzCS8qIHNlZWsgdG8gdGhlIG5leHQgZGF0YSAqLworI2RlZmluZSBTRUVLX0hPTEUJNAkvKiBzZWVrIHRvIHRoZSBuZXh0IGhvbGUgKi8KKyNkZWZpbmUgU0VFS19NQVgJU0VFS19IT0xFCisKK3N0cnVjdCBmc3RyaW1fcmFuZ2UgeworCV9fdTY0IHN0YXJ0OworCV9fdTY0IGxlbjsKKwlfX3U2NCBtaW5sZW47Cit9OworCisvKiBBbmQgZHluYW1pY2FsbHktdHVuYWJsZSBsaW1pdHMgYW5kIGRlZmF1bHRzOiAqLworc3RydWN0IGZpbGVzX3N0YXRfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG5yX2ZpbGVzOwkJLyogcmVhZCBvbmx5ICovCisJdW5zaWduZWQgbG9uZyBucl9mcmVlX2ZpbGVzOwkvKiByZWFkIG9ubHkgKi8KKwl1bnNpZ25lZCBsb25nIG1heF9maWxlczsJCS8qIHR1bmFibGUgKi8KK307CisKK3N0cnVjdCBpbm9kZXNfc3RhdF90IHsKKwlpbnQgbnJfaW5vZGVzOworCWludCBucl91bnVzZWQ7CisJaW50IGR1bW15WzVdOwkJLyogcGFkZGluZyBmb3Igc3lzY3RsIEFCSSBjb21wYXRpYmlsaXR5ICovCit9OworCisKKyNkZWZpbmUgTlJfRklMRSAgODE5MgkvKiB0aGlzIGNhbiB3ZWxsIGJlIGxhcmdlciBvbiBhIGxhcmdlciBzeXN0ZW0gKi8KKworI2RlZmluZSBNQVlfRVhFQwkJMHgwMDAwMDAwMQorI2RlZmluZSBNQVlfV1JJVEUJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUFZX1JFQUQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUFZX0FQUEVORAkJMHgwMDAwMDAwOAorI2RlZmluZSBNQVlfQUNDRVNTCQkweDAwMDAwMDEwCisjZGVmaW5lIE1BWV9PUEVOCQkweDAwMDAwMDIwCisjZGVmaW5lIE1BWV9DSERJUgkJMHgwMDAwMDA0MAorLyogY2FsbGVkIGZyb20gUkNVIG1vZGUsIGRvbid0IGJsb2NrICovCisjZGVmaW5lIE1BWV9OT1RfQkxPQ0sJCTB4MDAwMDAwODAKKworLyoKKyAqIGZsYWdzIGluIGZpbGUuZl9tb2RlLiAgTm90ZSB0aGF0IEZNT0RFX1JFQUQgYW5kIEZNT0RFX1dSSVRFIG11c3QgY29ycmVzcG9uZAorICogdG8gT19XUk9OTFkgYW5kIE9fUkRXUiB2aWEgdGhlIHN0cmFuZ2UgdHJpY2sgaW4gX19kZW50cnlfb3BlbigpCisgKi8KKworLyogZmlsZSBpcyBvcGVuIGZvciByZWFkaW5nICovCisjZGVmaW5lIEZNT0RFX1JFQUQJCSgoZm1vZGVfdCkweDEpCisvKiBmaWxlIGlzIG9wZW4gZm9yIHdyaXRpbmcgKi8KKyNkZWZpbmUgRk1PREVfV1JJVEUJCSgoZm1vZGVfdCkweDIpCisvKiBmaWxlIGlzIHNlZWthYmxlICovCisjZGVmaW5lIEZNT0RFX0xTRUVLCQkoKGZtb2RlX3QpMHg0KQorLyogZmlsZSBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgcHJlYWQgKi8KKyNkZWZpbmUgRk1PREVfUFJFQUQJCSgoZm1vZGVfdCkweDgpCisvKiBmaWxlIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyBwd3JpdGUgKi8KKyNkZWZpbmUgRk1PREVfUFdSSVRFCQkoKGZtb2RlX3QpMHgxMCkKKy8qIEZpbGUgaXMgb3BlbmVkIGZvciBleGVjdXRpb24gd2l0aCBzeXNfZXhlY3ZlIC8gc3lzX3VzZWxpYiAqLworI2RlZmluZSBGTU9ERV9FWEVDCQkoKGZtb2RlX3QpMHgyMCkKKy8qIEZpbGUgaXMgb3BlbmVkIHdpdGggT19OREVMQVkgKG9ubHkgc2V0IGZvciBibG9jayBkZXZpY2VzKSAqLworI2RlZmluZSBGTU9ERV9OREVMQVkJCSgoZm1vZGVfdCkweDQwKQorLyogRmlsZSBpcyBvcGVuZWQgd2l0aCBPX0VYQ0wgKG9ubHkgc2V0IGZvciBibG9jayBkZXZpY2VzKSAqLworI2RlZmluZSBGTU9ERV9FWENMCQkoKGZtb2RlX3QpMHg4MCkKKy8qIEZpbGUgaXMgb3BlbmVkIHVzaW5nIG9wZW4oLi4sIDMsIC4uKSBhbmQgaXMgd3JpdGVhYmxlIG9ubHkgZm9yIGlvY3RscworICAgKHNwZWNpYWx5IGhhY2sgZm9yIGZsb3BweS5jKSAqLworI2RlZmluZSBGTU9ERV9XUklURV9JT0NUTAkoKGZtb2RlX3QpMHgxMDApCisKKy8qCisgKiBEb24ndCB1cGRhdGUgY3RpbWUgYW5kIG10aW1lLgorICoKKyAqIEN1cnJlbnRseSBhIHNwZWNpYWwgaGFjayBmb3IgdGhlIFhGUyBvcGVuX2J5X2hhbmRsZSBpb2N0bCwgYnV0IHdlJ2xsCisgKiBob3BlZnVsbHkgZ3JhZHVhdGUgaXQgdG8gYSBwcm9wZXIgT19DTVRJTUUgZmxhZyBzdXBwb3J0ZWQgYnkgb3BlbigyKSBzb29uLgorICovCisjZGVmaW5lIEZNT0RFX05PQ01USU1FCQkoKGZtb2RlX3QpMHg4MDApCisKKy8qIEV4cGVjdCByYW5kb20gYWNjZXNzIHBhdHRlcm4gKi8KKyNkZWZpbmUgRk1PREVfUkFORE9NCQkoKGZtb2RlX3QpMHgxMDAwKQorCisvKiBGaWxlIGlzIGh1Z2UgKGVnLiAvZGV2L2ttZW0pOiB0cmVhdCBsb2ZmX3QgYXMgdW5zaWduZWQgKi8KKyNkZWZpbmUgRk1PREVfVU5TSUdORURfT0ZGU0VUCSgoZm1vZGVfdCkweDIwMDApCisKKy8qIEZpbGUgaXMgb3BlbmVkIHdpdGggT19QQVRIOyBhbG1vc3Qgbm90aGluZyBjYW4gYmUgZG9uZSB3aXRoIGl0ICovCisjZGVmaW5lIEZNT0RFX1BBVEgJCSgoZm1vZGVfdCkweDQwMDApCisKKy8qIEZpbGUgd2FzIG9wZW5lZCBieSBmYW5vdGlmeSBhbmQgc2hvdWxkbid0IGdlbmVyYXRlIGZhbm90aWZ5IGV2ZW50cyAqLworI2RlZmluZSBGTU9ERV9OT05PVElGWQkJKChmbW9kZV90KTB4MTAwMDAwMCkKKworLyoKKyAqIFRoZSBiZWxvdyBhcmUgdGhlIHZhcmlvdXMgcmVhZCBhbmQgd3JpdGUgdHlwZXMgdGhhdCB3ZSBzdXBwb3J0LiBTb21lIG9mCisgKiB0aGVtIGluY2x1ZGUgYmVoYXZpb3JhbCBtb2RpZmllcnMgdGhhdCBzZW5kIGluZm9ybWF0aW9uIGRvd24gdG8gdGhlCisgKiBibG9jayBsYXllciBhbmQgSU8gc2NoZWR1bGVyLiBUZXJtaW5vbG9neToKKyAqCisgKglUaGUgYmxvY2sgbGF5ZXIgdXNlcyBkZXZpY2UgcGx1Z2dpbmcgdG8gZGVmZXIgSU8gYSBsaXR0bGUgYml0LCBpbgorICoJdGhlIGhvcGUgdGhhdCB3ZSB3aWxsIHNlZSBtb3JlIElPIHZlcnkgc2hvcnRseS4gVGhpcyBpbmNyZWFzZXMKKyAqCWNvYWxlc2Npbmcgb2YgYWRqYWNlbnQgSU8gYW5kIHRodXMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIElPcyB3ZQorICoJaGF2ZSB0byBzZW5kIHRvIHRoZSBkZXZpY2UuIEl0IGFsc28gYWxsb3dzIGZvciBiZXR0ZXIgcXVldWluZywKKyAqCWlmIHRoZSBJTyBpc24ndCBtZXJnZWFibGUuIElmIHRoZSBjYWxsZXIgaXMgZ29pbmcgdG8gYmUgd2FpdGluZworICoJZm9yIHRoZSBJTywgdGhlbiBoZSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBkZXZpY2UgaXMgdW5wbHVnZ2VkIHNvCisgKgl0aGF0IHRoZSBJTyBpcyBkaXNwYXRjaGVkIHRvIHRoZSBkcml2ZXIuCisgKgorICoJQWxsIElPIGlzIGhhbmRsZWQgYXN5bmMgaW4gTGludXguIFRoaXMgaXMgZmluZSBmb3IgYmFja2dyb3VuZAorICoJd3JpdGVzLCBidXQgZm9yIHJlYWRzIG9yIHdyaXRlcyB0aGF0IHNvbWVvbmUgd2FpdHMgZm9yIGNvbXBsZXRpb24KKyAqCW9uLCB3ZSB3YW50IHRvIG5vdGlmeSB0aGUgYmxvY2sgbGF5ZXIgYW5kIElPIHNjaGVkdWxlciBzbyB0aGF0IHRoZXkKKyAqCWtub3cgYWJvdXQgaXQuIFRoYXQgYWxsb3dzIHRoZW0gdG8gbWFrZSBiZXR0ZXIgc2NoZWR1bGluZworICoJZGVjaXNpb25zLiBTbyB3aGVuIHRoZSBiZWxvdyByZWZlcmVuY2VzICdzeW5jJyBhbmQgJ2FzeW5jJywgaXQKKyAqCWlzIHJlZmVyZW5jaW5nIHRoaXMgcHJpb3JpdHkgaGludC4KKyAqCisgKiBXaXRoIHRoYXQgaW4gbWluZCwgdGhlIGF2YWlsYWJsZSB0eXBlcyBhcmU6CisgKgorICogUkVBRAkJCUEgbm9ybWFsIHJlYWQgb3BlcmF0aW9uLiBEZXZpY2Ugd2lsbCBiZSBwbHVnZ2VkLgorICogUkVBRF9TWU5DCQlBIHN5bmNocm9ub3VzIHJlYWQuIERldmljZSBpcyBub3QgcGx1Z2dlZCwgY2FsbGVyIGNhbgorICoJCQlpbW1lZGlhdGVseSB3YWl0IG9uIHRoaXMgcmVhZCB3aXRob3V0IGNhcmluZyBhYm91dAorICoJCQl1bnBsdWdnaW5nLgorICogUkVBREEJCVVzZWQgZm9yIHJlYWQtYWhlYWQgb3BlcmF0aW9ucy4gTG93ZXIgcHJpb3JpdHksIGFuZCB0aGUKKyAqCQkJYmxvY2sgbGF5ZXIgY291bGQgKGluIHRoZW9yeSkgY2hvb3NlIHRvIGlnbm9yZSB0aGlzCisgKgkJCXJlcXVlc3QgaWYgaXQgcnVucyBpbnRvIHJlc291cmNlIHByb2JsZW1zLgorICogV1JJVEUJCUEgbm9ybWFsIGFzeW5jIHdyaXRlLiBEZXZpY2Ugd2lsbCBiZSBwbHVnZ2VkLgorICogV1JJVEVfU1lOQwkJU3luY2hyb25vdXMgd3JpdGUuIElkZW50aWNhbCB0byBXUklURSwgYnV0IHBhc3NlcyBkb3duCisgKgkJCXRoZSBoaW50IHRoYXQgc29tZW9uZSB3aWxsIGJlIHdhaXRpbmcgb24gdGhpcyBJTworICoJCQlzaG9ydGx5LiBUaGUgd3JpdGUgZXF1aXZhbGVudCBvZiBSRUFEX1NZTkMuCisgKiBXUklURV9PRElSRUNUCVNwZWNpYWwgY2FzZSB3cml0ZSBmb3IgT19ESVJFQ1Qgb25seS4KKyAqIFdSSVRFX0ZMVVNICQlMaWtlIFdSSVRFX1NZTkMgYnV0IHdpdGggcHJlY2VkaW5nIGNhY2hlIGZsdXNoLgorICogV1JJVEVfRlVBCQlMaWtlIFdSSVRFX1NZTkMgYnV0IGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSBvbgorICoJCQlub24tdm9sYXRpbGUgbWVkaWEgb24gY29tcGxldGlvbi4KKyAqIFdSSVRFX0ZMVVNIX0ZVQQlDb21iaW5hdGlvbiBvZiBXUklURV9GTFVTSCBhbmQgRlVBLiBUaGUgSU8gaXMgcHJlY2VkZWQKKyAqCQkJYnkgYSBjYWNoZSBmbHVzaCBhbmQgZGF0YSBpcyBndWFyYW50ZWVkIHRvIGJlIG9uCisgKgkJCW5vbi12b2xhdGlsZSBtZWRpYSBvbiBjb21wbGV0aW9uLgorICoKKyAqLworI2RlZmluZSBSV19NQVNLCQkJUkVRX1dSSVRFCisjZGVmaW5lIFJXQV9NQVNLCQlSRVFfUkFIRUFECisKKyNkZWZpbmUgUkVBRAkJCTAKKyNkZWZpbmUgV1JJVEUJCQlSV19NQVNLCisjZGVmaW5lIFJFQURBCQkJUldBX01BU0sKKworI2RlZmluZSBSRUFEX1NZTkMJCShSRUFEIHwgUkVRX1NZTkMpCisjZGVmaW5lIFdSSVRFX1NZTkMJCShXUklURSB8IFJFUV9TWU5DIHwgUkVRX05PSURMRSkKKyNkZWZpbmUgV1JJVEVfT0RJUkVDVAkJKFdSSVRFIHwgUkVRX1NZTkMpCisjZGVmaW5lIFdSSVRFX0ZMVVNICQkoV1JJVEUgfCBSRVFfU1lOQyB8IFJFUV9OT0lETEUgfCBSRVFfRkxVU0gpCisjZGVmaW5lIFdSSVRFX0ZVQQkJKFdSSVRFIHwgUkVRX1NZTkMgfCBSRVFfTk9JRExFIHwgUkVRX0ZVQSkKKyNkZWZpbmUgV1JJVEVfRkxVU0hfRlVBCQkoV1JJVEUgfCBSRVFfU1lOQyB8IFJFUV9OT0lETEUgfCBSRVFfRkxVU0ggfCBSRVFfRlVBKQorCisjZGVmaW5lIFNFTF9JTgkJMQorI2RlZmluZSBTRUxfT1VUCQkyCisjZGVmaW5lIFNFTF9FWAkJNAorCisvKiBwdWJsaWMgZmxhZ3MgZm9yIGZpbGVfc3lzdGVtX3R5cGUgKi8KKyNkZWZpbmUgRlNfUkVRVUlSRVNfREVWIDEgCisjZGVmaW5lIEZTX0JJTkFSWV9NT1VOVERBVEEgMgorI2RlZmluZSBGU19IQVNfU1VCVFlQRSA0CisjZGVmaW5lIEZTX1JFVkFMX0RPVAkxNjM4NAkvKiBDaGVjayB0aGUgcGF0aHMgIi4iLCAiLi4iIGZvciBzdGFsZW5lc3MgKi8KKyNkZWZpbmUgRlNfUkVOQU1FX0RPRVNfRF9NT1ZFCTMyNzY4CS8qIEZTIHdpbGwgaGFuZGxlIGRfbW92ZSgpCisJCQkJCSAqIGR1cmluZyByZW5hbWUoKSBpbnRlcm5hbGx5LgorCQkJCQkgKi8KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZnMtaW5kZXBlbmRlbnQgbW91bnQtZmxhZ3M6IHVwIHRvIDMyIGZsYWdzIGFyZSBzdXBwb3J0ZWQKKyAqLworI2RlZmluZSBNU19SRE9OTFkJIDEJLyogTW91bnQgcmVhZC1vbmx5ICovCisjZGVmaW5lIE1TX05PU1VJRAkgMgkvKiBJZ25vcmUgc3VpZCBhbmQgc2dpZCBiaXRzICovCisjZGVmaW5lIE1TX05PREVWCSA0CS8qIERpc2FsbG93IGFjY2VzcyB0byBkZXZpY2Ugc3BlY2lhbCBmaWxlcyAqLworI2RlZmluZSBNU19OT0VYRUMJIDgJLyogRGlzYWxsb3cgcHJvZ3JhbSBleGVjdXRpb24gKi8KKyNkZWZpbmUgTVNfU1lOQ0hST05PVVMJMTYJLyogV3JpdGVzIGFyZSBzeW5jZWQgYXQgb25jZSAqLworI2RlZmluZSBNU19SRU1PVU5UCTMyCS8qIEFsdGVyIGZsYWdzIG9mIGEgbW91bnRlZCBGUyAqLworI2RlZmluZSBNU19NQU5ETE9DSwk2NAkvKiBBbGxvdyBtYW5kYXRvcnkgbG9ja3Mgb24gYW4gRlMgKi8KKyNkZWZpbmUgTVNfRElSU1lOQwkxMjgJLyogRGlyZWN0b3J5IG1vZGlmaWNhdGlvbnMgYXJlIHN5bmNocm9ub3VzICovCisjZGVmaW5lIE1TX05PQVRJTUUJMTAyNAkvKiBEbyBub3QgdXBkYXRlIGFjY2VzcyB0aW1lcy4gKi8KKyNkZWZpbmUgTVNfTk9ESVJBVElNRQkyMDQ4CS8qIERvIG5vdCB1cGRhdGUgZGlyZWN0b3J5IGFjY2VzcyB0aW1lcyAqLworI2RlZmluZSBNU19CSU5ECQk0MDk2CisjZGVmaW5lIE1TX01PVkUJCTgxOTIKKyNkZWZpbmUgTVNfUkVDCQkxNjM4NAorI2RlZmluZSBNU19WRVJCT1NFCTMyNzY4CS8qIFdhciBpcyBwZWFjZS4gVmVyYm9zaXR5IGlzIHNpbGVuY2UuCisJCQkJICAgTVNfVkVSQk9TRSBpcyBkZXByZWNhdGVkLiAqLworI2RlZmluZSBNU19TSUxFTlQJMzI3NjgKKyNkZWZpbmUgTVNfUE9TSVhBQ0wJKDE8PDE2KQkvKiBWRlMgZG9lcyBub3QgYXBwbHkgdGhlIHVtYXNrICovCisjZGVmaW5lIE1TX1VOQklOREFCTEUJKDE8PDE3KQkvKiBjaGFuZ2UgdG8gdW5iaW5kYWJsZSAqLworI2RlZmluZSBNU19QUklWQVRFCSgxPDwxOCkJLyogY2hhbmdlIHRvIHByaXZhdGUgKi8KKyNkZWZpbmUgTVNfU0xBVkUJKDE8PDE5KQkvKiBjaGFuZ2UgdG8gc2xhdmUgKi8KKyNkZWZpbmUgTVNfU0hBUkVECSgxPDwyMCkJLyogY2hhbmdlIHRvIHNoYXJlZCAqLworI2RlZmluZSBNU19SRUxBVElNRQkoMTw8MjEpCS8qIFVwZGF0ZSBhdGltZSByZWxhdGl2ZSB0byBtdGltZS9jdGltZS4gKi8KKyNkZWZpbmUgTVNfS0VSTk1PVU5UCSgxPDwyMikgLyogdGhpcyBpcyBhIGtlcm5fbW91bnQgY2FsbCAqLworI2RlZmluZSBNU19JX1ZFUlNJT04JKDE8PDIzKSAvKiBVcGRhdGUgaW5vZGUgSV92ZXJzaW9uIGZpZWxkICovCisjZGVmaW5lIE1TX1NUUklDVEFUSU1FCSgxPDwyNCkgLyogQWx3YXlzIHBlcmZvcm0gYXRpbWUgdXBkYXRlcyAqLworI2RlZmluZSBNU19OT1NFQwkoMTw8MjgpCisjZGVmaW5lIE1TX0JPUk4JCSgxPDwyOSkKKyNkZWZpbmUgTVNfQUNUSVZFCSgxPDwzMCkKKyNkZWZpbmUgTVNfTk9VU0VSCSgxPDwzMSkKKworLyoKKyAqIFN1cGVyYmxvY2sgZmxhZ3MgdGhhdCBjYW4gYmUgYWx0ZXJlZCBieSBNU19SRU1PVU5UCisgKi8KKyNkZWZpbmUgTVNfUk1UX01BU0sJKE1TX1JET05MWXxNU19TWU5DSFJPTk9VU3xNU19NQU5ETE9DS3xNU19JX1ZFUlNJT04pCisKKy8qCisgKiBPbGQgbWFnaWMgbW91bnQgZmxhZyBhbmQgbWFzaworICovCisjZGVmaW5lIE1TX01HQ19WQUwgMHhDMEVEMDAwMAorI2RlZmluZSBNU19NR0NfTVNLIDB4ZmZmZjAwMDAKKworLyogSW5vZGUgZmxhZ3MgLSB0aGV5IGhhdmUgbm90aGluZyB0byBzdXBlcmJsb2NrIGZsYWdzIG5vdyAqLworCisjZGVmaW5lIFNfU1lOQwkJMQkvKiBXcml0ZXMgYXJlIHN5bmNlZCBhdCBvbmNlICovCisjZGVmaW5lIFNfTk9BVElNRQkyCS8qIERvIG5vdCB1cGRhdGUgYWNjZXNzIHRpbWVzICovCisjZGVmaW5lIFNfQVBQRU5ECTQJLyogQXBwZW5kLW9ubHkgZmlsZSAqLworI2RlZmluZSBTX0lNTVVUQUJMRQk4CS8qIEltbXV0YWJsZSBmaWxlICovCisjZGVmaW5lIFNfREVBRAkJMTYJLyogcmVtb3ZlZCwgYnV0IHN0aWxsIG9wZW4gZGlyZWN0b3J5ICovCisjZGVmaW5lIFNfTk9RVU9UQQkzMgkvKiBJbm9kZSBpcyBub3QgY291bnRlZCB0byBxdW90YSAqLworI2RlZmluZSBTX0RJUlNZTkMJNjQJLyogRGlyZWN0b3J5IG1vZGlmaWNhdGlvbnMgYXJlIHN5bmNocm9ub3VzICovCisjZGVmaW5lIFNfTk9DTVRJTUUJMTI4CS8qIERvIG5vdCB1cGRhdGUgZmlsZSBjL210aW1lICovCisjZGVmaW5lIFNfU1dBUEZJTEUJMjU2CS8qIERvIG5vdCB0cnVuY2F0ZTogc3dhcG9uIGdvdCBpdHMgYm1hcHMgKi8KKyNkZWZpbmUgU19QUklWQVRFCTUxMgkvKiBJbm9kZSBpcyBmcy1pbnRlcm5hbCAqLworI2RlZmluZSBTX0lNQQkJMTAyNAkvKiBJbm9kZSBoYXMgYW4gYXNzb2NpYXRlZCBJTUEgc3RydWN0ICovCisjZGVmaW5lIFNfQVVUT01PVU5UCTIwNDgJLyogQXV0b21vdW50L3JlZmVycmFsIHF1YXNpLWRpcmVjdG9yeSAqLworI2RlZmluZSBTX05PU0VDCQk0MDk2CS8qIG5vIHN1aWQgb3IgeGF0dHIgc2VjdXJpdHkgYXR0cmlidXRlcyAqLworCisvKgorICogTm90ZSB0aGF0IG5vc3VpZCBldGMgZmxhZ3MgYXJlIGlub2RlLXNwZWNpZmljOiBzZXR0aW5nIHNvbWUgZmlsZS1zeXN0ZW0KKyAqIGZsYWdzIGp1c3QgbWVhbnMgYWxsIHRoZSBpbm9kZXMgaW5oZXJpdCB0aG9zZSBmbGFncyBieSBkZWZhdWx0LiBJdCBtaWdodCBiZQorICogcG9zc2libGUgdG8gb3ZlcnJpZGUgaXQgc2VsZWN0aXZlbHkgaWYgeW91IHJlYWxseSB3YW50ZWQgdG8gd2l0aCBzb21lCisgKiBpb2N0bCgpIHRoYXQgaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4KKyAqCisgKiBFeGNlcHRpb246IE1TX1JET05MWSBpcyBhbHdheXMgYXBwbGllZCB0byB0aGUgZW50aXJlIGZpbGUgc3lzdGVtLgorICoKKyAqIFVuZm9ydHVuYXRlbHksIGl0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSBhIGZpbGVzeXN0ZW1zIGZsYWdzIHdpdGggaXQgbW91bnRlZAorICogd2l0aCBmaWxlcyBpbiB1c2UuICBUaGlzIG1lYW5zIHRoYXQgYWxsIG9mIHRoZSBpbm9kZXMgd2lsbCBub3QgaGF2ZSB0aGVpcgorICogaV9mbGFncyB1cGRhdGVkLiAgSGVuY2UsIGlfZmxhZ3Mgbm8gbG9uZ2VyIGluaGVyaXQgdGhlIHN1cGVyYmxvY2sgbW91bnQKKyAqIGZsYWdzLCBzbyB0aGVzZSBoYXZlIHRvIGJlIGNoZWNrZWQgc2VwYXJhdGVseS4gLS0gcm1rQGFybS51ay5saW51eC5vcmcKKyAqLworI2RlZmluZSBfX0lTX0ZMRyhpbm9kZSxmbGcpICgoaW5vZGUpLT5pX3NiLT5zX2ZsYWdzICYgKGZsZykpCisKKyNkZWZpbmUgSVNfUkRPTkxZKGlub2RlKSAoKGlub2RlKS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkKKyNkZWZpbmUgSVNfU1lOQyhpbm9kZSkJCShfX0lTX0ZMRyhpbm9kZSwgTVNfU1lOQ0hST05PVVMpIHx8IFwKKwkJCQkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX1NZTkMpKQorI2RlZmluZSBJU19ESVJTWU5DKGlub2RlKQkoX19JU19GTEcoaW5vZGUsIE1TX1NZTkNIUk9OT1VTfE1TX0RJUlNZTkMpIHx8IFwKKwkJCQkJKChpbm9kZSktPmlfZmxhZ3MgJiAoU19TWU5DfFNfRElSU1lOQykpKQorI2RlZmluZSBJU19NQU5ETE9DSyhpbm9kZSkJX19JU19GTEcoaW5vZGUsIE1TX01BTkRMT0NLKQorI2RlZmluZSBJU19OT0FUSU1FKGlub2RlKSAgIF9fSVNfRkxHKGlub2RlLCBNU19SRE9OTFl8TVNfTk9BVElNRSkKKyNkZWZpbmUgSVNfSV9WRVJTSU9OKGlub2RlKSAgIF9fSVNfRkxHKGlub2RlLCBNU19JX1ZFUlNJT04pCisKKyNkZWZpbmUgSVNfTk9RVU9UQShpbm9kZSkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX05PUVVPVEEpCisjZGVmaW5lIElTX0FQUEVORChpbm9kZSkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX0FQUEVORCkKKyNkZWZpbmUgSVNfSU1NVVRBQkxFKGlub2RlKQkoKGlub2RlKS0+aV9mbGFncyAmIFNfSU1NVVRBQkxFKQorI2RlZmluZSBJU19QT1NJWEFDTChpbm9kZSkJX19JU19GTEcoaW5vZGUsIE1TX1BPU0lYQUNMKQorCisjZGVmaW5lIElTX0RFQURESVIoaW5vZGUpCSgoaW5vZGUpLT5pX2ZsYWdzICYgU19ERUFEKQorI2RlZmluZSBJU19OT0NNVElNRShpbm9kZSkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX05PQ01USU1FKQorI2RlZmluZSBJU19TV0FQRklMRShpbm9kZSkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX1NXQVBGSUxFKQorI2RlZmluZSBJU19QUklWQVRFKGlub2RlKQkoKGlub2RlKS0+aV9mbGFncyAmIFNfUFJJVkFURSkKKyNkZWZpbmUgSVNfSU1BKGlub2RlKQkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX0lNQSkKKyNkZWZpbmUgSVNfQVVUT01PVU5UKGlub2RlKQkoKGlub2RlKS0+aV9mbGFncyAmIFNfQVVUT01PVU5UKQorI2RlZmluZSBJU19OT1NFQyhpbm9kZSkJCSgoaW5vZGUpLT5pX2ZsYWdzICYgU19OT1NFQykKKworLyogdGhlIHJlYWQtb25seSBzdHVmZiBkb2Vzbid0IHJlYWxseSBiZWxvbmcgaGVyZSwgYnV0IGFueSBvdGhlciBwbGFjZSBpcworICAgcHJvYmFibHkgYXMgYmFkIGFuZCBJIGRvbid0IHdhbnQgdG8gY3JlYXRlIHlldCBhbm90aGVyIGluY2x1ZGUgZmlsZS4gKi8KKworI2RlZmluZSBCTEtST1NFVCAgIF9JTygweDEyLDkzKQkvKiBzZXQgZGV2aWNlIHJlYWQtb25seSAoMCA9IHJlYWQtd3JpdGUpICovCisjZGVmaW5lIEJMS1JPR0VUICAgX0lPKDB4MTIsOTQpCS8qIGdldCByZWFkLW9ubHkgc3RhdHVzICgwID0gcmVhZF93cml0ZSkgKi8KKyNkZWZpbmUgQkxLUlJQQVJUICBfSU8oMHgxMiw5NSkJLyogcmUtcmVhZCBwYXJ0aXRpb24gdGFibGUgKi8KKyNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiw5NikJLyogcmV0dXJuIGRldmljZSBzaXplIC81MTIgKGxvbmcgKmFyZykgKi8KKyNkZWZpbmUgQkxLRkxTQlVGICBfSU8oMHgxMiw5NykJLyogZmx1c2ggYnVmZmVyIGNhY2hlICovCisjZGVmaW5lIEJMS1JBU0VUICAgX0lPKDB4MTIsOTgpCS8qIHNldCByZWFkIGFoZWFkIGZvciBibG9jayBkZXZpY2UgKi8KKyNkZWZpbmUgQkxLUkFHRVQgICBfSU8oMHgxMiw5OSkJLyogZ2V0IGN1cnJlbnQgcmVhZCBhaGVhZCBzZXR0aW5nICovCisjZGVmaW5lIEJMS0ZSQVNFVCAgX0lPKDB4MTIsMTAwKS8qIHNldCBmaWxlc3lzdGVtIChtbS9maWxlbWFwLmMpIHJlYWQtYWhlYWQgKi8KKyNkZWZpbmUgQkxLRlJBR0VUICBfSU8oMHgxMiwxMDEpLyogZ2V0IGZpbGVzeXN0ZW0gKG1tL2ZpbGVtYXAuYykgcmVhZC1haGVhZCAqLworI2RlZmluZSBCTEtTRUNUU0VUIF9JTygweDEyLDEwMikvKiBzZXQgbWF4IHNlY3RvcnMgcGVyIHJlcXVlc3QgKGxsX3J3X2Jsay5jKSAqLworI2RlZmluZSBCTEtTRUNUR0VUIF9JTygweDEyLDEwMykvKiBnZXQgbWF4IHNlY3RvcnMgcGVyIHJlcXVlc3QgKGxsX3J3X2Jsay5jKSAqLworI2RlZmluZSBCTEtTU1pHRVQgIF9JTygweDEyLDEwNCkvKiBnZXQgYmxvY2sgZGV2aWNlIHNlY3RvciBzaXplICovCisjaWYgMAorI2RlZmluZSBCTEtQRyAgICAgIF9JTygweDEyLDEwNSkvKiBTZWUgYmxrcGcuaCAqLworCisvKiBTb21lIHBlb3BsZSBhcmUgbW9yb25zLiAgRG8gbm90IHVzZSBzaXplb2YhICovCisKKyNkZWZpbmUgQkxLRUxWR0VUICBfSU9SKDB4MTIsMTA2LHNpemVfdCkvKiBlbGV2YXRvciBnZXQgKi8KKyNkZWZpbmUgQkxLRUxWU0VUICBfSU9XKDB4MTIsMTA3LHNpemVfdCkvKiBlbGV2YXRvciBzZXQgKi8KKy8qIFRoaXMgd2FzIGhlcmUganVzdCB0byBzaG93IHRoYXQgdGhlIG51bWJlciBpcyB0YWtlbiAtCisgICBwcm9iYWJseSBhbGwgdGhlc2UgX0lPKDB4MTIsKikgaW9jdGxzIHNob3VsZCBiZSBtb3ZlZCB0byBibGtwZy5oLiAqLworI2VuZGlmCisvKiBBIGp1bXAgaGVyZTogMTA4LTExMSBoYXZlIGJlZW4gdXNlZCBmb3IgdmFyaW91cyBwcml2YXRlIHB1cnBvc2VzLiAqLworI2RlZmluZSBCTEtCU1pHRVQgIF9JT1IoMHgxMiwxMTIsc2l6ZV90KQorI2RlZmluZSBCTEtCU1pTRVQgIF9JT1coMHgxMiwxMTMsc2l6ZV90KQorI2RlZmluZSBCTEtHRVRTSVpFNjQgX0lPUigweDEyLDExNCxzaXplX3QpCS8qIHJldHVybiBkZXZpY2Ugc2l6ZSBpbiBieXRlcyAodTY0ICphcmcpICovCisjZGVmaW5lIEJMS1RSQUNFU0VUVVAgX0lPV1IoMHgxMiwxMTUsc3RydWN0IGJsa191c2VyX3RyYWNlX3NldHVwKQorI2RlZmluZSBCTEtUUkFDRVNUQVJUIF9JTygweDEyLDExNikKKyNkZWZpbmUgQkxLVFJBQ0VTVE9QIF9JTygweDEyLDExNykKKyNkZWZpbmUgQkxLVFJBQ0VURUFSRE9XTiBfSU8oMHgxMiwxMTgpCisjZGVmaW5lIEJMS0RJU0NBUkQgX0lPKDB4MTIsMTE5KQorI2RlZmluZSBCTEtJT01JTiBfSU8oMHgxMiwxMjApCisjZGVmaW5lIEJMS0lPT1BUIF9JTygweDEyLDEyMSkKKyNkZWZpbmUgQkxLQUxJR05PRkYgX0lPKDB4MTIsMTIyKQorI2RlZmluZSBCTEtQQlNaR0VUIF9JTygweDEyLDEyMykKKyNkZWZpbmUgQkxLRElTQ0FSRFpFUk9FUyBfSU8oMHgxMiwxMjQpCisjZGVmaW5lIEJMS1NFQ0RJU0NBUkQgX0lPKDB4MTIsMTI1KQorCisjZGVmaW5lIEJNQVBfSU9DVEwgMQkJLyogb2Jzb2xldGUgLSBrZXB0IGZvciBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIEZJQk1BUAkgICBfSU8oMHgwMCwxKQkvKiBibWFwIGFjY2VzcyAqLworI2RlZmluZSBGSUdFVEJTWiAgIF9JTygweDAwLDIpCS8qIGdldCB0aGUgYmxvY2sgc2l6ZSB1c2VkIGZvciBibWFwICovCisjZGVmaW5lIEZJRlJFRVpFCV9JT1dSKCdYJywgMTE5LCBpbnQpCS8qIEZyZWV6ZSAqLworI2RlZmluZSBGSVRIQVcJCV9JT1dSKCdYJywgMTIwLCBpbnQpCS8qIFRoYXcgKi8KKyNkZWZpbmUgRklUUklNCQlfSU9XUignWCcsIDEyMSwgc3RydWN0IGZzdHJpbV9yYW5nZSkJLyogVHJpbSAqLworCisjZGVmaW5lCUZTX0lPQ19HRVRGTEFHUwkJCV9JT1IoJ2YnLCAxLCBsb25nKQorI2RlZmluZQlGU19JT0NfU0VURkxBR1MJCQlfSU9XKCdmJywgMiwgbG9uZykKKyNkZWZpbmUJRlNfSU9DX0dFVFZFUlNJT04JCV9JT1IoJ3YnLCAxLCBsb25nKQorI2RlZmluZQlGU19JT0NfU0VUVkVSU0lPTgkJX0lPVygndicsIDIsIGxvbmcpCisjZGVmaW5lIEZTX0lPQ19GSUVNQVAJCQlfSU9XUignZicsIDExLCBzdHJ1Y3QgZmllbWFwKQorI2RlZmluZSBGU19JT0MzMl9HRVRGTEFHUwkJX0lPUignZicsIDEsIGludCkKKyNkZWZpbmUgRlNfSU9DMzJfU0VURkxBR1MJCV9JT1coJ2YnLCAyLCBpbnQpCisjZGVmaW5lIEZTX0lPQzMyX0dFVFZFUlNJT04JCV9JT1IoJ3YnLCAxLCBpbnQpCisjZGVmaW5lIEZTX0lPQzMyX1NFVFZFUlNJT04JCV9JT1coJ3YnLCAyLCBpbnQpCisKKy8qCisgKiBJbm9kZSBmbGFncyAoRlNfSU9DX0dFVEZMQUdTIC8gRlNfSU9DX1NFVEZMQUdTKQorICovCisjZGVmaW5lCUZTX1NFQ1JNX0ZMCQkJMHgwMDAwMDAwMSAvKiBTZWN1cmUgZGVsZXRpb24gKi8KKyNkZWZpbmUJRlNfVU5STV9GTAkJCTB4MDAwMDAwMDIgLyogVW5kZWxldGUgKi8KKyNkZWZpbmUJRlNfQ09NUFJfRkwJCQkweDAwMDAwMDA0IC8qIENvbXByZXNzIGZpbGUgKi8KKyNkZWZpbmUgRlNfU1lOQ19GTAkJCTB4MDAwMDAwMDggLyogU3luY2hyb25vdXMgdXBkYXRlcyAqLworI2RlZmluZSBGU19JTU1VVEFCTEVfRkwJCQkweDAwMDAwMDEwIC8qIEltbXV0YWJsZSBmaWxlICovCisjZGVmaW5lIEZTX0FQUEVORF9GTAkJCTB4MDAwMDAwMjAgLyogd3JpdGVzIHRvIGZpbGUgbWF5IG9ubHkgYXBwZW5kICovCisjZGVmaW5lIEZTX05PRFVNUF9GTAkJCTB4MDAwMDAwNDAgLyogZG8gbm90IGR1bXAgZmlsZSAqLworI2RlZmluZSBGU19OT0FUSU1FX0ZMCQkJMHgwMDAwMDA4MCAvKiBkbyBub3QgdXBkYXRlIGF0aW1lICovCisvKiBSZXNlcnZlZCBmb3IgY29tcHJlc3Npb24gdXNhZ2UuLi4gKi8KKyNkZWZpbmUgRlNfRElSVFlfRkwJCQkweDAwMDAwMTAwCisjZGVmaW5lIEZTX0NPTVBSQkxLX0ZMCQkJMHgwMDAwMDIwMCAvKiBPbmUgb3IgbW9yZSBjb21wcmVzc2VkIGNsdXN0ZXJzICovCisjZGVmaW5lIEZTX05PQ09NUF9GTAkJCTB4MDAwMDA0MDAgLyogRG9uJ3QgY29tcHJlc3MgKi8KKyNkZWZpbmUgRlNfRUNPTVBSX0ZMCQkJMHgwMDAwMDgwMCAvKiBDb21wcmVzc2lvbiBlcnJvciAqLworLyogRW5kIGNvbXByZXNzaW9uIGZsYWdzIC0tLSBtYXliZSBub3QgYWxsIHVzZWQgKi8KKyNkZWZpbmUgRlNfQlRSRUVfRkwJCQkweDAwMDAxMDAwIC8qIGJ0cmVlIGZvcm1hdCBkaXIgKi8KKyNkZWZpbmUgRlNfSU5ERVhfRkwJCQkweDAwMDAxMDAwIC8qIGhhc2gtaW5kZXhlZCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgRlNfSU1BR0lDX0ZMCQkJMHgwMDAwMjAwMCAvKiBBRlMgZGlyZWN0b3J5ICovCisjZGVmaW5lIEZTX0pPVVJOQUxfREFUQV9GTAkJMHgwMDAwNDAwMCAvKiBSZXNlcnZlZCBmb3IgZXh0MyAqLworI2RlZmluZSBGU19OT1RBSUxfRkwJCQkweDAwMDA4MDAwIC8qIGZpbGUgdGFpbCBzaG91bGQgbm90IGJlIG1lcmdlZCAqLworI2RlZmluZSBGU19ESVJTWU5DX0ZMCQkJMHgwMDAxMDAwMCAvKiBkaXJzeW5jIGJlaGF2aW91ciAoZGlyZWN0b3JpZXMgb25seSkgKi8KKyNkZWZpbmUgRlNfVE9QRElSX0ZMCQkJMHgwMDAyMDAwMCAvKiBUb3Agb2YgZGlyZWN0b3J5IGhpZXJhcmNoaWVzKi8KKyNkZWZpbmUgRlNfRVhURU5UX0ZMCQkJMHgwMDA4MDAwMCAvKiBFeHRlbnRzICovCisjZGVmaW5lIEZTX0RJUkVDVElPX0ZMCQkJMHgwMDEwMDAwMCAvKiBVc2UgZGlyZWN0IGkvbyAqLworI2RlZmluZSBGU19OT0NPV19GTAkJCTB4MDA4MDAwMDAgLyogRG8gbm90IGNvdyBmaWxlICovCisjZGVmaW5lIEZTX1JFU0VSVkVEX0ZMCQkJMHg4MDAwMDAwMCAvKiByZXNlcnZlZCBmb3IgZXh0MiBsaWIgKi8KKworI2RlZmluZSBGU19GTF9VU0VSX1ZJU0lCTEUJCTB4MDAwM0RGRkYgLyogVXNlciB2aXNpYmxlIGZsYWdzICovCisjZGVmaW5lIEZTX0ZMX1VTRVJfTU9ESUZJQUJMRQkJMHgwMDAzODBGRiAvKiBVc2VyIG1vZGlmaWFibGUgZmxhZ3MgKi8KKworCisjZGVmaW5lIFNZTkNfRklMRV9SQU5HRV9XQUlUX0JFRk9SRQkxCisjZGVmaW5lIFNZTkNfRklMRV9SQU5HRV9XUklURQkJMgorI2RlZmluZSBTWU5DX0ZJTEVfUkFOR0VfV0FJVF9BRlRFUgk0CisKKyNlbmRpZiAvKiBfTElOVVhfRlNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mc2xfaHlwZXJ2aXNvci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mc2xfaHlwZXJ2aXNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjODIxNTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZzbF9oeXBlcnZpc29yLmgKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBGcmVlc2NhbGUgaHlwZXJ2aXNvciBpb2N0bCBhbmQga2VybmVsIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBBdXRob3I6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciAiYXMgaXMiIGFuZCBhbnkKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKyAqIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUKKyAqIGRpc2NsYWltZWQuIEluIG5vIGV2ZW50IHNoYWxsIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGJlIGxpYWJsZSBmb3IgYW55CisgKiBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworICogKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworICogbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQgYW5kCisgKiBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwgb3IgdG9ydAorICogKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMKKyAqIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorICoKKyAqIFRoaXMgZmlsZSBpcyB1c2VkIGJ5IHRoZSBGcmVlc2NhbGUgaHlwZXJ2aXNvciBtYW5hZ2VtZW50IGRyaXZlci4gIEl0IGNhbgorICogYWxzbyBiZSBpbmNsdWRlZCBieSBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGRyaXZlcgorICogdmlhIHRoZSBpb2N0bCBpbnRlcmZhY2UuCisgKi8KKworI2lmbmRlZiBGU0xfSFlQRVJWSVNPUl9ICisjZGVmaW5lIEZTTF9IWVBFUlZJU09SX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qKgorICogc3RydWN0IGZzbF9odl9pb2N0bF9yZXN0YXJ0IC0gcmVzdGFydCBhIHBhcnRpdGlvbgorICogQHJldDogcmV0dXJuIGVycm9yIGNvZGUgZnJvbSB0aGUgaHlwZXJ2aXNvcgorICogQHBhcnRpdGlvbjogdGhlIElEIG9mIHRoZSBwYXJ0aXRpb24gdG8gcmVzdGFydCwgb3IgLTEgZm9yIHRoZQorICogICAgICAgICAgICAgY2FsbGluZyBwYXJ0aXRpb24KKyAqCisgKiBVc2VkIGJ5IEZTTF9IVl9JT0NUTF9QQVJUSVRJT05fUkVTVEFSVAorICovCitzdHJ1Y3QgZnNsX2h2X2lvY3RsX3Jlc3RhcnQgeworCV9fdTMyIHJldDsKKwlfX3UzMiBwYXJ0aXRpb247Cit9OworCisvKioKKyAqIHN0cnVjdCBmc2xfaHZfaW9jdGxfc3RhdHVzIC0gZ2V0IGEgcGFydGl0aW9uJ3Mgc3RhdHVzCisgKiBAcmV0OiByZXR1cm4gZXJyb3IgY29kZSBmcm9tIHRoZSBoeXBlcnZpc29yCisgKiBAcGFydGl0aW9uOiB0aGUgSUQgb2YgdGhlIHBhcnRpdGlvbiB0byBxdWVyeSwgb3IgLTEgZm9yIHRoZQorICogICAgICAgICAgICAgY2FsbGluZyBwYXJ0aXRpb24KKyAqIEBzdGF0dXM6IFRoZSByZXR1cm5lZCBzdGF0dXMgb2YgdGhlIHBhcnRpdGlvbgorICoKKyAqIFVzZWQgYnkgRlNMX0hWX0lPQ1RMX1BBUlRJVElPTl9HRVRfU1RBVFVTCisgKgorICogVmFsdWVzIG9mICdzdGF0dXMnOgorICogICAgMCA9IFN0b3BwZWQKKyAqICAgIDEgPSBSdW5uaW5nCisgKiAgICAyID0gU3RhcnRpbmcKKyAqICAgIDMgPSBTdG9wcGluZworICovCitzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0YXR1cyB7CisJX191MzIgcmV0OworCV9fdTMyIHBhcnRpdGlvbjsKKwlfX3UzMiBzdGF0dXM7Cit9OworCisvKioKKyAqIHN0cnVjdCBmc2xfaHZfaW9jdGxfc3RhcnQgLSBzdGFydCBhIHBhcnRpdGlvbgorICogQHJldDogcmV0dXJuIGVycm9yIGNvZGUgZnJvbSB0aGUgaHlwZXJ2aXNvcgorICogQHBhcnRpdGlvbjogdGhlIElEIG9mIHRoZSBwYXJ0aXRpb24gdG8gY29udHJvbAorICogQGVudHJ5X3BvaW50OiBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgZ3Vlc3QgSU1BIHRvIHN0YXJ0IGV4ZWN1dGlvbgorICogQGxvYWQ6IElmIG5vbi16ZXJvLCByZWxvYWQgdGhlIHBhcnRpdGlvbidzIGltYWdlcyBiZWZvcmUgc3RhcnRpbmcKKyAqCisgKiBVc2VkIGJ5IEZTTF9IVl9JT0NUTF9QQVJUSVRJT05fU1RBUlQKKyAqLworc3RydWN0IGZzbF9odl9pb2N0bF9zdGFydCB7CisJX191MzIgcmV0OworCV9fdTMyIHBhcnRpdGlvbjsKKwlfX3UzMiBlbnRyeV9wb2ludDsKKwlfX3UzMiBsb2FkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0b3AgLSBzdG9wIGEgcGFydGl0aW9uCisgKiBAcmV0OiByZXR1cm4gZXJyb3IgY29kZSBmcm9tIHRoZSBoeXBlcnZpc29yCisgKiBAcGFydGl0aW9uOiB0aGUgSUQgb2YgdGhlIHBhcnRpdGlvbiB0byBzdG9wLCBvciAtMSBmb3IgdGhlIGNhbGxpbmcKKyAqICAgICAgICAgICAgIHBhcnRpdGlvbgorICoKKyAqIFVzZWQgYnkgRlNMX0hWX0lPQ1RMX1BBUlRJVElPTl9TVE9QCisgKi8KK3N0cnVjdCBmc2xfaHZfaW9jdGxfc3RvcCB7CisJX191MzIgcmV0OworCV9fdTMyIHBhcnRpdGlvbjsKK307CisKKy8qKgorICogc3RydWN0IGZzbF9odl9pb2N0bF9tZW1jcHkgLSBjb3B5IG1lbW9yeSBiZXR3ZWVuIHBhcnRpdGlvbnMKKyAqIEByZXQ6IHJldHVybiBlcnJvciBjb2RlIGZyb20gdGhlIGh5cGVydmlzb3IKKyAqIEBzb3VyY2U6IHRoZSBwYXJ0aXRpb24gSUQgb2YgdGhlIHNvdXJjZSBwYXJ0aXRpb24sIG9yIC0xIGZvciB0aGlzCisgKiAgICAgICAgICBwYXJ0aXRpb24KKyAqIEB0YXJnZXQ6IHRoZSBwYXJ0aXRpb24gSUQgb2YgdGhlIHRhcmdldCBwYXJ0aXRpb24sIG9yIC0xIGZvciB0aGlzCisgKiAgICAgICAgICBwYXJ0aXRpb24KKyAqIEByZXNlcnZlZDogcmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIDAKKyAqIEBsb2NhbF9hZGRyOiB1c2VyLXNwYWNlIHZpcnR1YWwgYWRkcmVzcyBvZiBhIGJ1ZmZlciBpbiB0aGUgbG9jYWwKKyAqICAgICAgICAgICAgICBwYXJ0aXRpb24KKyAqIEByZW1vdGVfYWRkcjogZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGJ1ZmZlciBpbiB0aGUKKyAqICAgICAgICAgICByZW1vdGUgcGFydGl0aW9uCisgKiBAY291bnQ6IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weS4gIEJvdGggdGhlIGxvY2FsIGFuZCByZW1vdGUKKyAqICAgICAgICAgYnVmZmVycyBtdXN0IGJlIGF0IGxlYXN0ICdjb3VudCcgYnl0ZXMgbG9uZworICoKKyAqIFVzZWQgYnkgRlNMX0hWX0lPQ1RMX01FTUNQWQorICoKKyAqIFRoZSAnbG9jYWwnIHBhcnRpdGlvbiBpcyB0aGUgcGFydGl0aW9uIHRoYXQgY2FsbHMgdGhpcyBpb2N0bC4gIFRoZQorICogJ3JlbW90ZScgcGFydGl0aW9uIGlzIGEgZGlmZmVyZW50IHBhcnRpdGlvbi4gIFRoZSBkYXRhIGlzIGNvcGllZCBmcm9tCisgKiB0aGUgJ3NvdXJjZScgcGFyaXRpdGlvbicgdG8gdGhlICd0YXJnZXQnIHBhcnRpdGlvbi4KKyAqCisgKiBUaGUgYnVmZmVyIGluIHRoZSByZW1vdGUgcGFydGl0aW9uIG11c3QgYmUgZ3Vlc3QgcGh5c2ljYWxseQorICogY29udGlndW91cy4KKyAqCisgKiBUaGlzIGlvY3RsIGRvZXMgbm90IHN1cHBvcnQgY29weWluZyBtZW1vcnkgYmV0d2VlbiB0d28gcmVtb3RlCisgKiBwYXJ0aXRpb25zIG9yIHdpdGhpbiB0aGUgc2FtZSBwYXJ0aXRpb24sIHNvIGVpdGhlciAnc291cmNlJyBvcgorICogJ3RhcmdldCcgKGJ1dCBub3QgYm90aCkgbXVzdCBiZSAtMS4gIEluIG90aGVyIHdvcmRzLCBlaXRoZXIKKyAqCisgKiAgICAgIHNvdXJjZSA9PSBsb2NhbCBhbmQgdGFyZ2V0ID09IHJlbW90ZQorICogb3IKKyAqICAgICAgc291cmNlID09IHJlbW90ZSBhbmQgdGFyZ2V0ID09IGxvY2FsCisgKi8KK3N0cnVjdCBmc2xfaHZfaW9jdGxfbWVtY3B5IHsKKwlfX3UzMiByZXQ7CisJX191MzIgc291cmNlOworCV9fdTMyIHRhcmdldDsKKwlfX3UzMiByZXNlcnZlZDsJLyogcGFkZGluZyB0byBlbnN1cmUgbG9jYWxfdmFkZHIgaXMgYWxpZ25lZCAqLworCV9fdTY0IGxvY2FsX3ZhZGRyOworCV9fdTY0IHJlbW90ZV9wYWRkcjsKKwlfX3U2NCBjb3VudDsKK307CisKKy8qKgorICogc3RydWN0IGZzbF9odl9pb2N0bF9kb29yYmVsbCAtIHJpbmcgYSBkb29yYmVsbAorICogQHJldDogcmV0dXJuIGVycm9yIGNvZGUgZnJvbSB0aGUgaHlwZXJ2aXNvcgorICogQGRvb3JiZWxsOiB0aGUgaGFuZGxlIG9mIHRoZSBkb29yYmVsbCB0byByaW5nIGRvb3JiZWxsCisgKgorICogVXNlZCBieSBGU0xfSFZfSU9DVExfRE9PUkJFTEwKKyAqLworc3RydWN0IGZzbF9odl9pb2N0bF9kb29yYmVsbCB7CisJX191MzIgcmV0OworCV9fdTMyIGRvb3JiZWxsOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX2h2X2lvY3RsX3Byb3AgLSBnZXQvc2V0IGEgZGV2aWNlIHRyZWUgcHJvcGVydHkKKyAqIEByZXQ6IHJldHVybiBlcnJvciBjb2RlIGZyb20gdGhlIGh5cGVydmlzb3IKKyAqIEBoYW5kbGU6IGhhbmRsZSBvZiBwYXJ0aXRpb24gd2hvc2UgdHJlZSB0byBhY2Nlc3MKKyAqIEBwYXRoOiB2aXJ0dWFsIGFkZHJlc3Mgb2YgcGF0aCBuYW1lIG9mIG5vZGUgdG8gYWNjZXNzCisgKiBAcHJvcG5hbWU6IHZpcnR1YWwgYWRkcmVzcyBvZiBuYW1lIG9mIHByb3BlcnR5IHRvIGFjY2VzcworICogQHByb3B2YWw6IHZpcnR1YWwgYWRkcmVzcyBvZiBwcm9wZXJ0eSBkYXRhIGJ1ZmZlcgorICogQHByb3BsZW46IFNpemUgb2YgcHJvcGVydHkgZGF0YSBidWZmZXIKKyAqIEByZXNlcnZlZDogcmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIDAKKyAqCisgKiBVc2VkIGJ5IEZTTF9IVl9JT0NUTF9ET09SQkVMTAorICovCitzdHJ1Y3QgZnNsX2h2X2lvY3RsX3Byb3AgeworCV9fdTMyIHJldDsKKwlfX3UzMiBoYW5kbGU7CisJX191NjQgcGF0aDsKKwlfX3U2NCBwcm9wbmFtZTsKKwlfX3U2NCBwcm9wdmFsOworCV9fdTMyIHByb3BsZW47CisJX191MzIgcmVzZXJ2ZWQ7CS8qIHBhZGRpbmcgdG8gZW5zdXJlIHN0cnVjdHVyZSBpcyBhbGlnbmVkICovCit9OworCisvKiBUaGUgaW9jdGwgdHlwZSwgZG9jdW1lbnRlZCBpbiBpb2N0bC1udW1iZXIudHh0ICovCisjZGVmaW5lIEZTTF9IVl9JT0NUTF9UWVBFCTB4QUYKKworLyogUmVzdGFydCBhbm90aGVyIHBhcnRpdGlvbiAqLworI2RlZmluZSBGU0xfSFZfSU9DVExfUEFSVElUSU9OX1JFU1RBUlQgXAorCV9JT1dSKEZTTF9IVl9JT0NUTF9UWVBFLCAxLCBzdHJ1Y3QgZnNsX2h2X2lvY3RsX3Jlc3RhcnQpCisKKy8qIEdldCBhIHBhcnRpdGlvbidzIHN0YXR1cyAqLworI2RlZmluZSBGU0xfSFZfSU9DVExfUEFSVElUSU9OX0dFVF9TVEFUVVMgXAorCV9JT1dSKEZTTF9IVl9JT0NUTF9UWVBFLCAyLCBzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0YXR1cykKKworLyogQm9vdCBhbm90aGVyIHBhcnRpdGlvbiAqLworI2RlZmluZSBGU0xfSFZfSU9DVExfUEFSVElUSU9OX1NUQVJUIFwKKwlfSU9XUihGU0xfSFZfSU9DVExfVFlQRSwgMywgc3RydWN0IGZzbF9odl9pb2N0bF9zdGFydCkKKworLyogU3RvcCB0aGlzIG9yIGFub3RoZXIgcGFydGl0aW9uICovCisjZGVmaW5lIEZTTF9IVl9JT0NUTF9QQVJUSVRJT05fU1RPUCBcCisJX0lPV1IoRlNMX0hWX0lPQ1RMX1RZUEUsIDQsIHN0cnVjdCBmc2xfaHZfaW9jdGxfc3RvcCkKKworLyogQ29weSBkYXRhIGZyb20gb25lIHBhcnRpdGlvbiB0byBhbm90aGVyICovCisjZGVmaW5lIEZTTF9IVl9JT0NUTF9NRU1DUFkgXAorCV9JT1dSKEZTTF9IVl9JT0NUTF9UWVBFLCA1LCBzdHJ1Y3QgZnNsX2h2X2lvY3RsX21lbWNweSkKKworLyogUmluZyBhIGRvb3JiZWxsICovCisjZGVmaW5lIEZTTF9IVl9JT0NUTF9ET09SQkVMTCBcCisJX0lPV1IoRlNMX0hWX0lPQ1RMX1RZUEUsIDYsIHN0cnVjdCBmc2xfaHZfaW9jdGxfZG9vcmJlbGwpCisKKy8qIEdldCBhIHByb3BlcnR5IGZyb20gYW5vdGhlciBndWVzdCdzIGRldmljZSB0cmVlICovCisjZGVmaW5lIEZTTF9IVl9JT0NUTF9HRVRQUk9QIFwKKwlfSU9XUihGU0xfSFZfSU9DVExfVFlQRSwgNywgc3RydWN0IGZzbF9odl9pb2N0bF9wcm9wKQorCisvKiBTZXQgYSBwcm9wZXJ0eSBpbiBhbm90aGVyIGd1ZXN0J3MgZGV2aWNlIHRyZWUgKi8KKyNkZWZpbmUgRlNMX0hWX0lPQ1RMX1NFVFBST1AgXAorCV9JT1dSKEZTTF9IVl9JT0NUTF9UWVBFLCA4LCBzdHJ1Y3QgZnNsX2h2X2lvY3RsX3Byb3ApCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Z1c2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZnVzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NGNmZjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Z1c2UuaApAQCAtMCwwICsxLDYzNCBAQAorLyoKKyAgICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQorICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisKKyAgICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KKyAgICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KKyovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUga2VybmVsIGludGVyZmFjZSBvZiBGVVNFCisgKgorICogUHJvdG9jb2wgY2hhbmdlbG9nOgorICoKKyAqIDcuOToKKyAqICAtIG5ldyBmdXNlX2dldGF0dHJfaW4gaW5wdXQgYXJndW1lbnQgb2YgR0VUQVRUUgorICogIC0gYWRkIGxrX2ZsYWdzIGluIGZ1c2VfbGtfaW4KKyAqICAtIGFkZCBsb2NrX293bmVyIGZpZWxkIHRvIGZ1c2Vfc2V0YXR0cl9pbiwgZnVzZV9yZWFkX2luIGFuZCBmdXNlX3dyaXRlX2luCisgKiAgLSBhZGQgYmxrc2l6ZSBmaWVsZCB0byBmdXNlX2F0dHIKKyAqICAtIGFkZCBmaWxlIGZsYWdzIGZpZWxkIHRvIGZ1c2VfcmVhZF9pbiBhbmQgZnVzZV93cml0ZV9pbgorICoKKyAqIDcuMTAKKyAqICAtIGFkZCBub25zZWVrYWJsZSBvcGVuIGZsYWcKKyAqCisgKiA3LjExCisgKiAgLSBhZGQgSU9DVEwgbWVzc2FnZQorICogIC0gYWRkIHVuc29saWNpdGVkIG5vdGlmaWNhdGlvbiBzdXBwb3J0CisgKiAgLSBhZGQgUE9MTCBtZXNzYWdlIGFuZCBOT1RJRllfUE9MTCBub3RpZmljYXRpb24KKyAqCisgKiA3LjEyCisgKiAgLSBhZGQgdW1hc2sgZmxhZyB0byBpbnB1dCBhcmd1bWVudCBvZiBvcGVuLCBta25vZCBhbmQgbWtkaXIKKyAqICAtIGFkZCBub3RpZmljYXRpb24gbWVzc2FnZXMgZm9yIGludmFsaWRhdGlvbiBvZiBpbm9kZXMgYW5kCisgKiAgICBkaXJlY3RvcnkgZW50cmllcworICoKKyAqIDcuMTMKKyAqICAtIG1ha2UgbWF4IG51bWJlciBvZiBiYWNrZ3JvdW5kIHJlcXVlc3RzIGFuZCBjb25nZXN0aW9uIHRocmVzaG9sZAorICogICAgdHVuYWJsZXMKKyAqCisgKiA3LjE0CisgKiAgLSBhZGQgc3BsaWNlIHN1cHBvcnQgdG8gZnVzZSBkZXZpY2UKKyAqCisgKiA3LjE1CisgKiAgLSBhZGQgc3RvcmUgbm90aWZ5CisgKiAgLSBhZGQgcmV0cmlldmUgbm90aWZ5CisgKgorICogNy4xNgorICogIC0gYWRkIEJBVENIX0ZPUkdFVCByZXF1ZXN0CisgKiAgLSBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRCBzaGFsbCBub3cgcmV0dXJuIHdpdGggYXJyYXkgb2YgJ3N0cnVjdAorICogICAgZnVzZV9pb2N0bF9pb3ZlYycgaW5zdGVhZCBvZiBhbWJpZ3VvdXMgJ3N0cnVjdCBpb3ZlYycKKyAqICAtIGFkZCBGVVNFX0lPQ1RMXzMyQklUIGZsYWcKKyAqCisgKiA3LjE3CisgKiAgLSBhZGQgRlVTRV9GTE9DS19MT0NLUyBhbmQgRlVTRV9SRUxFQVNFX0ZMT0NLX1VOTE9DSworICovCisKKyNpZm5kZWYgX0xJTlVYX0ZVU0VfSAorI2RlZmluZSBfTElOVVhfRlVTRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogVmVyc2lvbiBuZWdvdGlhdGlvbjoKKyAqCisgKiBCb3RoIHRoZSBrZXJuZWwgYW5kIHVzZXJzcGFjZSBzZW5kIHRoZSB2ZXJzaW9uIHRoZXkgc3VwcG9ydCBpbiB0aGUKKyAqIElOSVQgcmVxdWVzdCBhbmQgcmVwbHkgcmVzcGVjdGl2ZWx5LgorICoKKyAqIElmIHRoZSBtYWpvciB2ZXJzaW9ucyBtYXRjaCB0aGVuIGJvdGggc2hhbGwgdXNlIHRoZSBzbWFsbGVzdAorICogb2YgdGhlIHR3byBtaW5vciB2ZXJzaW9ucyBmb3IgY29tbXVuaWNhdGlvbi4KKyAqCisgKiBJZiB0aGUga2VybmVsIHN1cHBvcnRzIGEgbGFyZ2VyIG1ham9yIHZlcnNpb24sIHRoZW4gdXNlcnNwYWNlIHNoYWxsCisgKiByZXBseSB3aXRoIHRoZSBtYWpvciB2ZXJzaW9uIGl0IHN1cHBvcnRzLCBpZ25vcmUgdGhlIHJlc3Qgb2YgdGhlCisgKiBJTklUIG1lc3NhZ2UgYW5kIGV4cGVjdCBhIG5ldyBJTklUIG1lc3NhZ2UgZnJvbSB0aGUga2VybmVsIHdpdGggYQorICogbWF0Y2hpbmcgbWFqb3IgdmVyc2lvbi4KKyAqCisgKiBJZiB0aGUgbGlicmFyeSBzdXBwb3J0cyBhIGxhcmdlciBtYWpvciB2ZXJzaW9uLCB0aGVuIGl0IHNoYWxsIGZhbGwKKyAqIGJhY2sgdG8gdGhlIG1ham9yIHByb3RvY29sIHZlcnNpb24gc2VudCBieSB0aGUga2VybmVsIGZvcgorICogY29tbXVuaWNhdGlvbiBhbmQgcmVwbHkgd2l0aCB0aGF0IG1ham9yIHZlcnNpb24gKGFuZCBhbiBhcmJpdHJhcnkKKyAqIHN1cHBvcnRlZCBtaW5vciB2ZXJzaW9uKS4KKyAqLworCisvKiogVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRlVTRV9LRVJORUxfVkVSU0lPTiA3CisKKy8qKiBNaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLworI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDE3CisKKy8qKiBUaGUgbm9kZSBJRCBvZiB0aGUgcm9vdCBpbm9kZSAqLworI2RlZmluZSBGVVNFX1JPT1RfSUQgMQorCisvKiBNYWtlIHN1cmUgYWxsIHN0cnVjdHVyZXMgYXJlIHBhZGRlZCB0byA2NGJpdCBib3VuZGFyeSwgc28gMzJiaXQKKyAgIHVzZXJzcGFjZSB3b3JrcyB1bmRlciA2NGJpdCBrZXJuZWxzICovCisKK3N0cnVjdCBmdXNlX2F0dHIgeworCV9fdTY0CWlubzsKKwlfX3U2NAlzaXplOworCV9fdTY0CWJsb2NrczsKKwlfX3U2NAlhdGltZTsKKwlfX3U2NAltdGltZTsKKwlfX3U2NAljdGltZTsKKwlfX3UzMglhdGltZW5zZWM7CisJX191MzIJbXRpbWVuc2VjOworCV9fdTMyCWN0aW1lbnNlYzsKKwlfX3UzMgltb2RlOworCV9fdTMyCW5saW5rOworCV9fdTMyCXVpZDsKKwlfX3UzMglnaWQ7CisJX191MzIJcmRldjsKKwlfX3UzMglibGtzaXplOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9rc3RhdGZzIHsKKwlfX3U2NAlibG9ja3M7CisJX191NjQJYmZyZWU7CisJX191NjQJYmF2YWlsOworCV9fdTY0CWZpbGVzOworCV9fdTY0CWZmcmVlOworCV9fdTMyCWJzaXplOworCV9fdTMyCW5hbWVsZW47CisJX191MzIJZnJzaXplOworCV9fdTMyCXBhZGRpbmc7CisJX191MzIJc3BhcmVbNl07Cit9OworCitzdHJ1Y3QgZnVzZV9maWxlX2xvY2sgeworCV9fdTY0CXN0YXJ0OworCV9fdTY0CWVuZDsKKwlfX3UzMgl0eXBlOworCV9fdTMyCXBpZDsgLyogdGdpZCAqLworfTsKKworLyoqCisgKiBCaXRtYXNrcyBmb3IgZnVzZV9zZXRhdHRyX2luLnZhbGlkCisgKi8KKyNkZWZpbmUgRkFUVFJfTU9ERQkoMSA8PCAwKQorI2RlZmluZSBGQVRUUl9VSUQJKDEgPDwgMSkKKyNkZWZpbmUgRkFUVFJfR0lECSgxIDw8IDIpCisjZGVmaW5lIEZBVFRSX1NJWkUJKDEgPDwgMykKKyNkZWZpbmUgRkFUVFJfQVRJTUUJKDEgPDwgNCkKKyNkZWZpbmUgRkFUVFJfTVRJTUUJKDEgPDwgNSkKKyNkZWZpbmUgRkFUVFJfRkgJKDEgPDwgNikKKyNkZWZpbmUgRkFUVFJfQVRJTUVfTk9XCSgxIDw8IDcpCisjZGVmaW5lIEZBVFRSX01USU1FX05PVwkoMSA8PCA4KQorI2RlZmluZSBGQVRUUl9MT0NLT1dORVIJKDEgPDwgOSkKKworLyoqCisgKiBGbGFncyByZXR1cm5lZCBieSB0aGUgT1BFTiByZXF1ZXN0CisgKgorICogRk9QRU5fRElSRUNUX0lPOiBieXBhc3MgcGFnZSBjYWNoZSBmb3IgdGhpcyBvcGVuIGZpbGUKKyAqIEZPUEVOX0tFRVBfQ0FDSEU6IGRvbid0IGludmFsaWRhdGUgdGhlIGRhdGEgY2FjaGUgb24gb3BlbgorICogRk9QRU5fTk9OU0VFS0FCTEU6IHRoZSBmaWxlIGlzIG5vdCBzZWVrYWJsZQorICovCisjZGVmaW5lIEZPUEVOX0RJUkVDVF9JTwkJKDEgPDwgMCkKKyNkZWZpbmUgRk9QRU5fS0VFUF9DQUNIRQkoMSA8PCAxKQorI2RlZmluZSBGT1BFTl9OT05TRUVLQUJMRQkoMSA8PCAyKQorCisvKioKKyAqIElOSVQgcmVxdWVzdC9yZXBseSBmbGFncworICoKKyAqIEZVU0VfUE9TSVhfTE9DS1M6IHJlbW90ZSBsb2NraW5nIGZvciBQT1NJWCBmaWxlIGxvY2tzCisgKiBGVVNFX0VYUE9SVF9TVVBQT1JUOiBmaWxlc3lzdGVtIGhhbmRsZXMgbG9va3VwcyBvZiAiLiIgYW5kICIuLiIKKyAqIEZVU0VfRE9OVF9NQVNLOiBkb24ndCBhcHBseSB1bWFzayB0byBmaWxlIG1vZGUgb24gY3JlYXRlIG9wZXJhdGlvbnMKKyAqIEZVU0VfRkxPQ0tfTE9DS1M6IHJlbW90ZSBsb2NraW5nIGZvciBCU0Qgc3R5bGUgZmlsZSBsb2NrcworICovCisjZGVmaW5lIEZVU0VfQVNZTkNfUkVBRAkJKDEgPDwgMCkKKyNkZWZpbmUgRlVTRV9QT1NJWF9MT0NLUwkoMSA8PCAxKQorI2RlZmluZSBGVVNFX0ZJTEVfT1BTCQkoMSA8PCAyKQorI2RlZmluZSBGVVNFX0FUT01JQ19PX1RSVU5DCSgxIDw8IDMpCisjZGVmaW5lIEZVU0VfRVhQT1JUX1NVUFBPUlQJKDEgPDwgNCkKKyNkZWZpbmUgRlVTRV9CSUdfV1JJVEVTCQkoMSA8PCA1KQorI2RlZmluZSBGVVNFX0RPTlRfTUFTSwkJKDEgPDwgNikKKyNkZWZpbmUgRlVTRV9GTE9DS19MT0NLUwkoMSA8PCAxMCkKKworLyoqCisgKiBDVVNFIElOSVQgcmVxdWVzdC9yZXBseSBmbGFncworICoKKyAqIENVU0VfVU5SRVNUUklDVEVEX0lPQ1RMOiAgdXNlIHVucmVzdHJpY3RlZCBpb2N0bAorICovCisjZGVmaW5lIENVU0VfVU5SRVNUUklDVEVEX0lPQ1RMCSgxIDw8IDApCisKKy8qKgorICogUmVsZWFzZSBmbGFncworICovCisjZGVmaW5lIEZVU0VfUkVMRUFTRV9GTFVTSAkoMSA8PCAwKQorI2RlZmluZSBGVVNFX1JFTEVBU0VfRkxPQ0tfVU5MT0NLCSgxIDw8IDEpCisKKy8qKgorICogR2V0YXR0ciBmbGFncworICovCisjZGVmaW5lIEZVU0VfR0VUQVRUUl9GSAkJKDEgPDwgMCkKKworLyoqCisgKiBMb2NrIGZsYWdzCisgKi8KKyNkZWZpbmUgRlVTRV9MS19GTE9DSwkJKDEgPDwgMCkKKworLyoqCisgKiBXUklURSBmbGFncworICoKKyAqIEZVU0VfV1JJVEVfQ0FDSEU6IGRlbGF5ZWQgd3JpdGUgZnJvbSBwYWdlIGNhY2hlLCBmaWxlIGhhbmRsZSBpcyBndWVzc2VkCisgKiBGVVNFX1dSSVRFX0xPQ0tPV05FUjogbG9ja19vd25lciBmaWVsZCBpcyB2YWxpZAorICovCisjZGVmaW5lIEZVU0VfV1JJVEVfQ0FDSEUJKDEgPDwgMCkKKyNkZWZpbmUgRlVTRV9XUklURV9MT0NLT1dORVIJKDEgPDwgMSkKKworLyoqCisgKiBSZWFkIGZsYWdzCisgKi8KKyNkZWZpbmUgRlVTRV9SRUFEX0xPQ0tPV05FUgkoMSA8PCAxKQorCisvKioKKyAqIElvY3RsIGZsYWdzCisgKgorICogRlVTRV9JT0NUTF9DT01QQVQ6IDMyYml0IGNvbXBhdCBpb2N0bCBvbiA2NGJpdCBtYWNoaW5lCisgKiBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRDogbm90IHJlc3RyaWN0ZWQgdG8gd2VsbC1mb3JtZWQgaW9jdGxzLCByZXRyeSBhbGxvd2VkCisgKiBGVVNFX0lPQ1RMX1JFVFJZOiByZXRyeSB3aXRoIG5ldyBpb3ZlY3MKKyAqIEZVU0VfSU9DVExfMzJCSVQ6IDMyYml0IGlvY3RsCisgKgorICogRlVTRV9JT0NUTF9NQVhfSU9WOiBtYXhpbXVtIG9mIGluX2lvdmVjcyArIG91dF9pb3ZlY3MKKyAqLworI2RlZmluZSBGVVNFX0lPQ1RMX0NPTVBBVAkoMSA8PCAwKQorI2RlZmluZSBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRAkoMSA8PCAxKQorI2RlZmluZSBGVVNFX0lPQ1RMX1JFVFJZCSgxIDw8IDIpCisjZGVmaW5lIEZVU0VfSU9DVExfMzJCSVQJKDEgPDwgMykKKworI2RlZmluZSBGVVNFX0lPQ1RMX01BWF9JT1YJMjU2CisKKy8qKgorICogUG9sbCBmbGFncworICoKKyAqIEZVU0VfUE9MTF9TQ0hFRFVMRV9OT1RJRlk6IHJlcXVlc3QgcG9sbCBub3RpZnkKKyAqLworI2RlZmluZSBGVVNFX1BPTExfU0NIRURVTEVfTk9USUZZICgxIDw8IDApCisKK2VudW0gZnVzZV9vcGNvZGUgeworCUZVU0VfTE9PS1VQCSAgID0gMSwKKwlGVVNFX0ZPUkdFVAkgICA9IDIsICAvKiBubyByZXBseSAqLworCUZVU0VfR0VUQVRUUgkgICA9IDMsCisJRlVTRV9TRVRBVFRSCSAgID0gNCwKKwlGVVNFX1JFQURMSU5LCSAgID0gNSwKKwlGVVNFX1NZTUxJTksJICAgPSA2LAorCUZVU0VfTUtOT0QJICAgPSA4LAorCUZVU0VfTUtESVIJICAgPSA5LAorCUZVU0VfVU5MSU5LCSAgID0gMTAsCisJRlVTRV9STURJUgkgICA9IDExLAorCUZVU0VfUkVOQU1FCSAgID0gMTIsCisJRlVTRV9MSU5LCSAgID0gMTMsCisJRlVTRV9PUEVOCSAgID0gMTQsCisJRlVTRV9SRUFECSAgID0gMTUsCisJRlVTRV9XUklURQkgICA9IDE2LAorCUZVU0VfU1RBVEZTCSAgID0gMTcsCisJRlVTRV9SRUxFQVNFICAgICAgID0gMTgsCisJRlVTRV9GU1lOQyAgICAgICAgID0gMjAsCisJRlVTRV9TRVRYQVRUUiAgICAgID0gMjEsCisJRlVTRV9HRVRYQVRUUiAgICAgID0gMjIsCisJRlVTRV9MSVNUWEFUVFIgICAgID0gMjMsCisJRlVTRV9SRU1PVkVYQVRUUiAgID0gMjQsCisJRlVTRV9GTFVTSCAgICAgICAgID0gMjUsCisJRlVTRV9JTklUICAgICAgICAgID0gMjYsCisJRlVTRV9PUEVORElSICAgICAgID0gMjcsCisJRlVTRV9SRUFERElSICAgICAgID0gMjgsCisJRlVTRV9SRUxFQVNFRElSICAgID0gMjksCisJRlVTRV9GU1lOQ0RJUiAgICAgID0gMzAsCisJRlVTRV9HRVRMSyAgICAgICAgID0gMzEsCisJRlVTRV9TRVRMSyAgICAgICAgID0gMzIsCisJRlVTRV9TRVRMS1cgICAgICAgID0gMzMsCisJRlVTRV9BQ0NFU1MgICAgICAgID0gMzQsCisJRlVTRV9DUkVBVEUgICAgICAgID0gMzUsCisJRlVTRV9JTlRFUlJVUFQgICAgID0gMzYsCisJRlVTRV9CTUFQICAgICAgICAgID0gMzcsCisJRlVTRV9ERVNUUk9ZICAgICAgID0gMzgsCisJRlVTRV9JT0NUTCAgICAgICAgID0gMzksCisJRlVTRV9QT0xMICAgICAgICAgID0gNDAsCisJRlVTRV9OT1RJRllfUkVQTFkgID0gNDEsCisJRlVTRV9CQVRDSF9GT1JHRVQgID0gNDIsCisKKwkvKiBDVVNFIHNwZWNpZmljIG9wZXJhdGlvbnMgKi8KKwlDVVNFX0lOSVQgICAgICAgICAgPSA0MDk2LAorfTsKKworZW51bSBmdXNlX25vdGlmeV9jb2RlIHsKKwlGVVNFX05PVElGWV9QT0xMICAgPSAxLAorCUZVU0VfTk9USUZZX0lOVkFMX0lOT0RFID0gMiwKKwlGVVNFX05PVElGWV9JTlZBTF9FTlRSWSA9IDMsCisJRlVTRV9OT1RJRllfU1RPUkUgPSA0LAorCUZVU0VfTk9USUZZX1JFVFJJRVZFID0gNSwKKwlGVVNFX05PVElGWV9DT0RFX01BWCwKK307CisKKy8qIFRoZSByZWFkIGJ1ZmZlciBpcyByZXF1aXJlZCB0byBiZSBhdCBsZWFzdCA4aywgYnV0IG1heSBiZSBtdWNoIGxhcmdlciAqLworI2RlZmluZSBGVVNFX01JTl9SRUFEX0JVRkZFUiA4MTkyCisKKyNkZWZpbmUgRlVTRV9DT01QQVRfRU5UUllfT1VUX1NJWkUgMTIwCisKK3N0cnVjdCBmdXNlX2VudHJ5X291dCB7CisJX191NjQJbm9kZWlkOwkJLyogSW5vZGUgSUQgKi8KKwlfX3U2NAlnZW5lcmF0aW9uOwkvKiBJbm9kZSBnZW5lcmF0aW9uOiBub2RlaWQ6Z2VuIG11c3QKKwkJCQkgICBiZSB1bmlxdWUgZm9yIHRoZSBmcydzIGxpZmV0aW1lICovCisJX191NjQJZW50cnlfdmFsaWQ7CS8qIENhY2hlIHRpbWVvdXQgZm9yIHRoZSBuYW1lICovCisJX191NjQJYXR0cl92YWxpZDsJLyogQ2FjaGUgdGltZW91dCBmb3IgdGhlIGF0dHJpYnV0ZXMgKi8KKwlfX3UzMgllbnRyeV92YWxpZF9uc2VjOworCV9fdTMyCWF0dHJfdmFsaWRfbnNlYzsKKwlzdHJ1Y3QgZnVzZV9hdHRyIGF0dHI7Cit9OworCitzdHJ1Y3QgZnVzZV9mb3JnZXRfaW4geworCV9fdTY0CW5sb29rdXA7Cit9OworCitzdHJ1Y3QgZnVzZV9mb3JnZXRfb25lIHsKKwlfX3U2NAlub2RlaWQ7CisJX191NjQJbmxvb2t1cDsKK307CisKK3N0cnVjdCBmdXNlX2JhdGNoX2ZvcmdldF9pbiB7CisJX191MzIJY291bnQ7CisJX191MzIJZHVtbXk7Cit9OworCitzdHJ1Y3QgZnVzZV9nZXRhdHRyX2luIHsKKwlfX3UzMglnZXRhdHRyX2ZsYWdzOworCV9fdTMyCWR1bW15OworCV9fdTY0CWZoOworfTsKKworI2RlZmluZSBGVVNFX0NPTVBBVF9BVFRSX09VVF9TSVpFIDk2CisKK3N0cnVjdCBmdXNlX2F0dHJfb3V0IHsKKwlfX3U2NAlhdHRyX3ZhbGlkOwkvKiBDYWNoZSB0aW1lb3V0IGZvciB0aGUgYXR0cmlidXRlcyAqLworCV9fdTMyCWF0dHJfdmFsaWRfbnNlYzsKKwlfX3UzMglkdW1teTsKKwlzdHJ1Y3QgZnVzZV9hdHRyIGF0dHI7Cit9OworCisjZGVmaW5lIEZVU0VfQ09NUEFUX01LTk9EX0lOX1NJWkUgOAorCitzdHJ1Y3QgZnVzZV9ta25vZF9pbiB7CisJX191MzIJbW9kZTsKKwlfX3UzMglyZGV2OworCV9fdTMyCXVtYXNrOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9ta2Rpcl9pbiB7CisJX191MzIJbW9kZTsKKwlfX3UzMgl1bWFzazsKK307CisKK3N0cnVjdCBmdXNlX3JlbmFtZV9pbiB7CisJX191NjQJbmV3ZGlyOworfTsKKworc3RydWN0IGZ1c2VfbGlua19pbiB7CisJX191NjQJb2xkbm9kZWlkOworfTsKKworc3RydWN0IGZ1c2Vfc2V0YXR0cl9pbiB7CisJX191MzIJdmFsaWQ7CisJX191MzIJcGFkZGluZzsKKwlfX3U2NAlmaDsKKwlfX3U2NAlzaXplOworCV9fdTY0CWxvY2tfb3duZXI7CisJX191NjQJYXRpbWU7CisJX191NjQJbXRpbWU7CisJX191NjQJdW51c2VkMjsKKwlfX3UzMglhdGltZW5zZWM7CisJX191MzIJbXRpbWVuc2VjOworCV9fdTMyCXVudXNlZDM7CisJX191MzIJbW9kZTsKKwlfX3UzMgl1bnVzZWQ0OworCV9fdTMyCXVpZDsKKwlfX3UzMglnaWQ7CisJX191MzIJdW51c2VkNTsKK307CisKK3N0cnVjdCBmdXNlX29wZW5faW4geworCV9fdTMyCWZsYWdzOworCV9fdTMyCXVudXNlZDsKK307CisKK3N0cnVjdCBmdXNlX2NyZWF0ZV9pbiB7CisJX191MzIJZmxhZ3M7CisJX191MzIJbW9kZTsKKwlfX3UzMgl1bWFzazsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfb3Blbl9vdXQgeworCV9fdTY0CWZoOworCV9fdTMyCW9wZW5fZmxhZ3M7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX3JlbGVhc2VfaW4geworCV9fdTY0CWZoOworCV9fdTMyCWZsYWdzOworCV9fdTMyCXJlbGVhc2VfZmxhZ3M7CisJX191NjQJbG9ja19vd25lcjsKK307CisKK3N0cnVjdCBmdXNlX2ZsdXNoX2luIHsKKwlfX3U2NAlmaDsKKwlfX3UzMgl1bnVzZWQ7CisJX191MzIJcGFkZGluZzsKKwlfX3U2NAlsb2NrX293bmVyOworfTsKKworc3RydWN0IGZ1c2VfcmVhZF9pbiB7CisJX191NjQJZmg7CisJX191NjQJb2Zmc2V0OworCV9fdTMyCXNpemU7CisJX191MzIJcmVhZF9mbGFnczsKKwlfX3U2NAlsb2NrX293bmVyOworCV9fdTMyCWZsYWdzOworCV9fdTMyCXBhZGRpbmc7Cit9OworCisjZGVmaW5lIEZVU0VfQ09NUEFUX1dSSVRFX0lOX1NJWkUgMjQKKworc3RydWN0IGZ1c2Vfd3JpdGVfaW4geworCV9fdTY0CWZoOworCV9fdTY0CW9mZnNldDsKKwlfX3UzMglzaXplOworCV9fdTMyCXdyaXRlX2ZsYWdzOworCV9fdTY0CWxvY2tfb3duZXI7CisJX191MzIJZmxhZ3M7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX3dyaXRlX291dCB7CisJX191MzIJc2l6ZTsKKwlfX3UzMglwYWRkaW5nOworfTsKKworI2RlZmluZSBGVVNFX0NPTVBBVF9TVEFURlNfU0laRSA0OAorCitzdHJ1Y3QgZnVzZV9zdGF0ZnNfb3V0IHsKKwlzdHJ1Y3QgZnVzZV9rc3RhdGZzIHN0OworfTsKKworc3RydWN0IGZ1c2VfZnN5bmNfaW4geworCV9fdTY0CWZoOworCV9fdTMyCWZzeW5jX2ZsYWdzOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9zZXR4YXR0cl9pbiB7CisJX191MzIJc2l6ZTsKKwlfX3UzMglmbGFnczsKK307CisKK3N0cnVjdCBmdXNlX2dldHhhdHRyX2luIHsKKwlfX3UzMglzaXplOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9nZXR4YXR0cl9vdXQgeworCV9fdTMyCXNpemU7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX2xrX2luIHsKKwlfX3U2NAlmaDsKKwlfX3U2NAlvd25lcjsKKwlzdHJ1Y3QgZnVzZV9maWxlX2xvY2sgbGs7CisJX191MzIJbGtfZmxhZ3M7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX2xrX291dCB7CisJc3RydWN0IGZ1c2VfZmlsZV9sb2NrIGxrOworfTsKKworc3RydWN0IGZ1c2VfYWNjZXNzX2luIHsKKwlfX3UzMgltYXNrOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9pbml0X2luIHsKKwlfX3UzMgltYWpvcjsKKwlfX3UzMgltaW5vcjsKKwlfX3UzMgltYXhfcmVhZGFoZWFkOworCV9fdTMyCWZsYWdzOworfTsKKworc3RydWN0IGZ1c2VfaW5pdF9vdXQgeworCV9fdTMyCW1ham9yOworCV9fdTMyCW1pbm9yOworCV9fdTMyCW1heF9yZWFkYWhlYWQ7CisJX191MzIJZmxhZ3M7CisJX191MTYgICBtYXhfYmFja2dyb3VuZDsKKwlfX3UxNiAgIGNvbmdlc3Rpb25fdGhyZXNob2xkOworCV9fdTMyCW1heF93cml0ZTsKK307CisKKyNkZWZpbmUgQ1VTRV9JTklUX0lORk9fTUFYIDQwOTYKKworc3RydWN0IGN1c2VfaW5pdF9pbiB7CisJX191MzIJbWFqb3I7CisJX191MzIJbWlub3I7CisJX191MzIJdW51c2VkOworCV9fdTMyCWZsYWdzOworfTsKKworc3RydWN0IGN1c2VfaW5pdF9vdXQgeworCV9fdTMyCW1ham9yOworCV9fdTMyCW1pbm9yOworCV9fdTMyCXVudXNlZDsKKwlfX3UzMglmbGFnczsKKwlfX3UzMgltYXhfcmVhZDsKKwlfX3UzMgltYXhfd3JpdGU7CisJX191MzIJZGV2X21ham9yOwkJLyogY2hhcmRldiBtYWpvciAqLworCV9fdTMyCWRldl9taW5vcjsJCS8qIGNoYXJkZXYgbWlub3IgKi8KKwlfX3UzMglzcGFyZVsxMF07Cit9OworCitzdHJ1Y3QgZnVzZV9pbnRlcnJ1cHRfaW4geworCV9fdTY0CXVuaXF1ZTsKK307CisKK3N0cnVjdCBmdXNlX2JtYXBfaW4geworCV9fdTY0CWJsb2NrOworCV9fdTMyCWJsb2Nrc2l6ZTsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2VfYm1hcF9vdXQgeworCV9fdTY0CWJsb2NrOworfTsKKworc3RydWN0IGZ1c2VfaW9jdGxfaW4geworCV9fdTY0CWZoOworCV9fdTMyCWZsYWdzOworCV9fdTMyCWNtZDsKKwlfX3U2NAlhcmc7CisJX191MzIJaW5fc2l6ZTsKKwlfX3UzMglvdXRfc2l6ZTsKK307CisKK3N0cnVjdCBmdXNlX2lvY3RsX2lvdmVjIHsKKwlfX3U2NAliYXNlOworCV9fdTY0CWxlbjsKK307CisKK3N0cnVjdCBmdXNlX2lvY3RsX291dCB7CisJX19zMzIJcmVzdWx0OworCV9fdTMyCWZsYWdzOworCV9fdTMyCWluX2lvdnM7CisJX191MzIJb3V0X2lvdnM7Cit9OworCitzdHJ1Y3QgZnVzZV9wb2xsX2luIHsKKwlfX3U2NAlmaDsKKwlfX3U2NAlraDsKKwlfX3UzMglmbGFnczsKKwlfX3UzMiAgIHBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9wb2xsX291dCB7CisJX191MzIJcmV2ZW50czsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwX291dCB7CisJX191NjQJa2g7Cit9OworCitzdHJ1Y3QgZnVzZV9pbl9oZWFkZXIgeworCV9fdTMyCWxlbjsKKwlfX3UzMglvcGNvZGU7CisJX191NjQJdW5pcXVlOworCV9fdTY0CW5vZGVpZDsKKwlfX3UzMgl1aWQ7CisJX191MzIJZ2lkOworCV9fdTMyCXBpZDsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfb3V0X2hlYWRlciB7CisJX191MzIJbGVuOworCV9fczMyCWVycm9yOworCV9fdTY0CXVuaXF1ZTsKK307CisKK3N0cnVjdCBmdXNlX2RpcmVudCB7CisJX191NjQJaW5vOworCV9fdTY0CW9mZjsKKwlfX3UzMgluYW1lbGVuOworCV9fdTMyCXR5cGU7CisJY2hhciBuYW1lWzBdOworfTsKKworI2RlZmluZSBGVVNFX05BTUVfT0ZGU0VUIG9mZnNldG9mKHN0cnVjdCBmdXNlX2RpcmVudCwgbmFtZSkKKyNkZWZpbmUgRlVTRV9ESVJFTlRfQUxJR04oeCkgKCgoeCkgKyBzaXplb2YoX191NjQpIC0gMSkgJiB+KHNpemVvZihfX3U2NCkgLSAxKSkKKyNkZWZpbmUgRlVTRV9ESVJFTlRfU0laRShkKSBcCisJRlVTRV9ESVJFTlRfQUxJR04oRlVTRV9OQU1FX09GRlNFVCArIChkKS0+bmFtZWxlbikKKworc3RydWN0IGZ1c2Vfbm90aWZ5X2ludmFsX2lub2RlX291dCB7CisJX191NjQJaW5vOworCV9fczY0CW9mZjsKKwlfX3M2NAlsZW47Cit9OworCitzdHJ1Y3QgZnVzZV9ub3RpZnlfaW52YWxfZW50cnlfb3V0IHsKKwlfX3U2NAlwYXJlbnQ7CisJX191MzIJbmFtZWxlbjsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfbm90aWZ5X3N0b3JlX291dCB7CisJX191NjQJbm9kZWlkOworCV9fdTY0CW9mZnNldDsKKwlfX3UzMglzaXplOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9ub3RpZnlfcmV0cmlldmVfb3V0IHsKKwlfX3U2NAlub3RpZnlfdW5pcXVlOworCV9fdTY0CW5vZGVpZDsKKwlfX3U2NAlvZmZzZXQ7CisJX191MzIJc2l6ZTsKKwlfX3UzMglwYWRkaW5nOworfTsKKworLyogTWF0Y2hlcyB0aGUgc2l6ZSBvZiBmdXNlX3dyaXRlX2luICovCitzdHJ1Y3QgZnVzZV9ub3RpZnlfcmV0cmlldmVfaW4geworCV9fdTY0CWR1bW15MTsKKwlfX3U2NAlvZmZzZXQ7CisJX191MzIJc2l6ZTsKKwlfX3UzMglkdW1teTI7CisJX191NjQJZHVtbXkzOworCV9fdTY0CWR1bW15NDsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfRlVTRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Z1dGV4LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxMWU5ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZnV0ZXguaApAQCAtMCwwICsxLDE1MiBAQAorI2lmbmRlZiBfTElOVVhfRlVURVhfSAorI2RlZmluZSBfTElOVVhfRlVURVhfSAorCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBTZWNvbmQgYXJndW1lbnQgdG8gZnV0ZXggc3lzY2FsbCAqLworCisKKyNkZWZpbmUgRlVURVhfV0FJVAkJMAorI2RlZmluZSBGVVRFWF9XQUtFCQkxCisjZGVmaW5lIEZVVEVYX0ZECQkyCisjZGVmaW5lIEZVVEVYX1JFUVVFVUUJCTMKKyNkZWZpbmUgRlVURVhfQ01QX1JFUVVFVUUJNAorI2RlZmluZSBGVVRFWF9XQUtFX09QCQk1CisjZGVmaW5lIEZVVEVYX0xPQ0tfUEkJCTYKKyNkZWZpbmUgRlVURVhfVU5MT0NLX1BJCQk3CisjZGVmaW5lIEZVVEVYX1RSWUxPQ0tfUEkJOAorI2RlZmluZSBGVVRFWF9XQUlUX0JJVFNFVAk5CisjZGVmaW5lIEZVVEVYX1dBS0VfQklUU0VUCTEwCisjZGVmaW5lIEZVVEVYX1dBSVRfUkVRVUVVRV9QSQkxMQorI2RlZmluZSBGVVRFWF9DTVBfUkVRVUVVRV9QSQkxMgorCisjZGVmaW5lIEZVVEVYX1BSSVZBVEVfRkxBRwkxMjgKKyNkZWZpbmUgRlVURVhfQ0xPQ0tfUkVBTFRJTUUJMjU2CisjZGVmaW5lIEZVVEVYX0NNRF9NQVNLCQl+KEZVVEVYX1BSSVZBVEVfRkxBRyB8IEZVVEVYX0NMT0NLX1JFQUxUSU1FKQorCisjZGVmaW5lIEZVVEVYX1dBSVRfUFJJVkFURQkoRlVURVhfV0FJVCB8IEZVVEVYX1BSSVZBVEVfRkxBRykKKyNkZWZpbmUgRlVURVhfV0FLRV9QUklWQVRFCShGVVRFWF9XQUtFIHwgRlVURVhfUFJJVkFURV9GTEFHKQorI2RlZmluZSBGVVRFWF9SRVFVRVVFX1BSSVZBVEUJKEZVVEVYX1JFUVVFVUUgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCisjZGVmaW5lIEZVVEVYX0NNUF9SRVFVRVVFX1BSSVZBVEUgKEZVVEVYX0NNUF9SRVFVRVVFIHwgRlVURVhfUFJJVkFURV9GTEFHKQorI2RlZmluZSBGVVRFWF9XQUtFX09QX1BSSVZBVEUJKEZVVEVYX1dBS0VfT1AgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCisjZGVmaW5lIEZVVEVYX0xPQ0tfUElfUFJJVkFURQkoRlVURVhfTE9DS19QSSB8IEZVVEVYX1BSSVZBVEVfRkxBRykKKyNkZWZpbmUgRlVURVhfVU5MT0NLX1BJX1BSSVZBVEUJKEZVVEVYX1VOTE9DS19QSSB8IEZVVEVYX1BSSVZBVEVfRkxBRykKKyNkZWZpbmUgRlVURVhfVFJZTE9DS19QSV9QUklWQVRFIChGVVRFWF9UUllMT0NLX1BJIHwgRlVURVhfUFJJVkFURV9GTEFHKQorI2RlZmluZSBGVVRFWF9XQUlUX0JJVFNFVF9QUklWQVRFCShGVVRFWF9XQUlUX0JJVFNFVCB8IEZVVEVYX1BSSVZBVEVfRkxBRykKKyNkZWZpbmUgRlVURVhfV0FLRV9CSVRTRVRfUFJJVkFURQkoRlVURVhfV0FLRV9CSVRTRVQgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCisjZGVmaW5lIEZVVEVYX1dBSVRfUkVRVUVVRV9QSV9QUklWQVRFCShGVVRFWF9XQUlUX1JFUVVFVUVfUEkgfCBcCisJCQkJCSBGVVRFWF9QUklWQVRFX0ZMQUcpCisjZGVmaW5lIEZVVEVYX0NNUF9SRVFVRVVFX1BJX1BSSVZBVEUJKEZVVEVYX0NNUF9SRVFVRVVFX1BJIHwgXAorCQkJCQkgRlVURVhfUFJJVkFURV9GTEFHKQorCisvKgorICogU3VwcG9ydCBmb3Igcm9idXN0IGZ1dGV4ZXM6IHRoZSBrZXJuZWwgY2xlYW5zIHVwIGhlbGQgZnV0ZXhlcyBhdAorICogdGhyZWFkIGV4aXQgdGltZS4KKyAqLworCisvKgorICogUGVyLWxvY2sgbGlzdCBlbnRyeSAtIGVtYmVkZGVkIGluIHVzZXItc3BhY2UgbG9ja3MsIHNvbWV3aGVyZSBjbG9zZQorICogdG8gdGhlIGZ1dGV4IGZpZWxkLiAoTm90ZTogdXNlci1zcGFjZSB1c2VzIGEgZG91YmxlLWxpbmtlZCBsaXN0IHRvCisgKiBhY2hpZXZlIE8oMSkgbGlzdCBhZGQgYW5kIHJlbW92ZSwgYnV0IHRoZSBrZXJuZWwgb25seSBuZWVkcyB0byBrbm93CisgKiBhYm91dCB0aGUgZm9yd2FyZCBsaW5rKQorICoKKyAqIE5PVEU6IHRoaXMgc3RydWN0dXJlIGlzIHBhcnQgb2YgdGhlIHN5c2NhbGwgQUJJLCBhbmQgbXVzdCBub3QgYmUKKyAqIGNoYW5nZWQuCisgKi8KK3N0cnVjdCByb2J1c3RfbGlzdCB7CisJc3RydWN0IHJvYnVzdF9saXN0ICpuZXh0OworfTsKKworLyoKKyAqIFBlci10aHJlYWQgbGlzdCBoZWFkOgorICoKKyAqIE5PVEU6IHRoaXMgc3RydWN0dXJlIGlzIHBhcnQgb2YgdGhlIHN5c2NhbGwgQUJJLCBhbmQgbXVzdCBvbmx5IGJlCisgKiBjaGFuZ2VkIGlmIHRoZSBjaGFuZ2UgaXMgZmlyc3QgY29tbXVuaWNhdGVkIHdpdGggdGhlIGdsaWJjIGZvbGtzLgorICogKFdoZW4gYW4gaW5jb21wYXRpYmxlIGNoYW5nZSBpcyBkb25lLCB3ZSdsbCBpbmNyZWFzZSB0aGUgc3RydWN0dXJlCisgKiAgc2l6ZSwgd2hpY2ggZ2xpYmMgd2lsbCBkZXRlY3QpCisgKi8KK3N0cnVjdCByb2J1c3RfbGlzdF9oZWFkIHsKKwkvKgorCSAqIFRoZSBoZWFkIG9mIHRoZSBsaXN0LiBQb2ludHMgYmFjayB0byBpdHNlbGYgaWYgZW1wdHk6CisJICovCisJc3RydWN0IHJvYnVzdF9saXN0IGxpc3Q7CisKKwkvKgorCSAqIFRoaXMgcmVsYXRpdmUgb2Zmc2V0IGlzIHNldCBieSB1c2VyLXNwYWNlLCBpdCBnaXZlcyB0aGUga2VybmVsCisJICogdGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSBmdXRleCBmaWVsZCB0byBleGFtaW5lLiBUaGlzIHdheQorCSAqIHdlIGtlZXAgdXNlcnNwYWNlIGZsZXhpYmxlLCB0byBmcmVlbHkgc2hhcGUgaXRzIGRhdGEtc3RydWN0dXJlLAorCSAqIHdpdGhvdXQgaGFyZGNvZGluZyBhbnkgcGFydGljdWxhciBvZmZzZXQgaW50byB0aGUga2VybmVsOgorCSAqLworCWxvbmcgZnV0ZXhfb2Zmc2V0OworCisJLyoKKwkgKiBUaGUgZGVhdGggb2YgdGhlIHRocmVhZCBtYXkgcmFjZSB3aXRoIHVzZXJzcGFjZSBzZXR0aW5nCisJICogdXAgYSBsb2NrJ3MgbGlua3MuIFNvIHRvIGhhbmRsZSB0aGlzIHJhY2UsIHVzZXJzcGFjZSBmaXJzdAorCSAqIHNldHMgdGhpcyBmaWVsZCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgdG8tYmUtdGFrZW4gbG9jaywKKwkgKiB0aGVuIGRvZXMgdGhlIGxvY2sgYWNxdWlyZSwgYW5kIHRoZW4gYWRkcyBpdHNlbGYgdG8gdGhlCisJICogbGlzdCwgYW5kIHRoZW4gY2xlYXJzIHRoaXMgZmllbGQuIEhlbmNlIHRoZSBrZXJuZWwgd2lsbAorCSAqIGFsd2F5cyBoYXZlIGZ1bGwga25vd2xlZGdlIG9mIGFsbCBsb2NrcyB0aGF0IHRoZSB0aHJlYWQKKwkgKiBfbWlnaHRfIGhhdmUgdGFrZW4uIFdlIGNoZWNrIHRoZSBvd25lciBUSUQgaW4gYW55IGNhc2UsCisJICogc28gb25seSB0cnVseSBvd25lZCBsb2NrcyB3aWxsIGJlIGhhbmRsZWQuCisJICovCisJc3RydWN0IHJvYnVzdF9saXN0ICpsaXN0X29wX3BlbmRpbmc7Cit9OworCisvKgorICogQXJlIHRoZXJlIGFueSB3YWl0ZXJzIGZvciB0aGlzIHJvYnVzdCBmdXRleDoKKyAqLworI2RlZmluZSBGVVRFWF9XQUlURVJTCQkweDgwMDAwMDAwCisKKy8qCisgKiBUaGUga2VybmVsIHNpZ25hbHMgdmlhIHRoaXMgYml0IHRoYXQgYSB0aHJlYWQgaG9sZGluZyBhIGZ1dGV4CisgKiBoYXMgZXhpdGVkIHdpdGhvdXQgdW5sb2NraW5nIHRoZSBmdXRleC4gVGhlIGtlcm5lbCBhbHNvIGRvZXMKKyAqIGEgRlVURVhfV0FLRSBvbiBzdWNoIGZ1dGV4ZXMsIGFmdGVyIHNldHRpbmcgdGhlIGJpdCwgdG8gd2FrZQorICogdXAgYW55IHBvc3NpYmxlIHdhaXRlcnM6CisgKi8KKyNkZWZpbmUgRlVURVhfT1dORVJfRElFRAkweDQwMDAwMDAwCisKKy8qCisgKiBUaGUgcmVzdCBvZiB0aGUgcm9idXN0LWZ1dGV4IGZpZWxkIGlzIGZvciB0aGUgVElEOgorICovCisjZGVmaW5lIEZVVEVYX1RJRF9NQVNLCQkweDNmZmZmZmZmCisKKy8qCisgKiBUaGlzIGxpbWl0IHByb3RlY3RzIGFnYWluc3QgYSBkZWxpYmVyYXRlbHkgY2lyY3VsYXIgbGlzdC4KKyAqIChOb3Qgd29ydGggaW50cm9kdWNpbmcgYW4gcmxpbWl0IGZvciBpdCkKKyAqLworI2RlZmluZSBST0JVU1RfTElTVF9MSU1JVAkyMDQ4CisKKy8qCisgKiBiaXRzZXQgd2l0aCBhbGwgYml0cyBzZXQgZm9yIHRoZSBGVVRFWF94eHhfQklUU0VUIE9QcyB0byByZXF1ZXN0IGEKKyAqIG1hdGNoIG9mIGFueSBiaXQuCisgKi8KKyNkZWZpbmUgRlVURVhfQklUU0VUX01BVENIX0FOWQkweGZmZmZmZmZmCisKKworI2RlZmluZSBGVVRFWF9PUF9TRVQJCTAJLyogKihpbnQgKilVQUREUjIgPSBPUEFSRzsgKi8KKyNkZWZpbmUgRlVURVhfT1BfQURECQkxCS8qICooaW50ICopVUFERFIyICs9IE9QQVJHOyAqLworI2RlZmluZSBGVVRFWF9PUF9PUgkJMgkvKiAqKGludCAqKVVBRERSMiB8PSBPUEFSRzsgKi8KKyNkZWZpbmUgRlVURVhfT1BfQU5ETgkJMwkvKiAqKGludCAqKVVBRERSMiAmPSB+T1BBUkc7ICovCisjZGVmaW5lIEZVVEVYX09QX1hPUgkJNAkvKiAqKGludCAqKVVBRERSMiBePSBPUEFSRzsgKi8KKworI2RlZmluZSBGVVRFWF9PUF9PUEFSR19TSElGVAk4CS8qIFVzZSAoMSA8PCBPUEFSRykgaW5zdGVhZCBvZiBPUEFSRy4gICovCisKKyNkZWZpbmUgRlVURVhfT1BfQ01QX0VRCQkwCS8qIGlmIChvbGR2YWwgPT0gQ01QQVJHKSB3YWtlICovCisjZGVmaW5lIEZVVEVYX09QX0NNUF9ORQkJMQkvKiBpZiAob2xkdmFsICE9IENNUEFSRykgd2FrZSAqLworI2RlZmluZSBGVVRFWF9PUF9DTVBfTFQJCTIJLyogaWYgKG9sZHZhbCA8IENNUEFSRykgd2FrZSAqLworI2RlZmluZSBGVVRFWF9PUF9DTVBfTEUJCTMJLyogaWYgKG9sZHZhbCA8PSBDTVBBUkcpIHdha2UgKi8KKyNkZWZpbmUgRlVURVhfT1BfQ01QX0dUCQk0CS8qIGlmIChvbGR2YWwgPiBDTVBBUkcpIHdha2UgKi8KKyNkZWZpbmUgRlVURVhfT1BfQ01QX0dFCQk1CS8qIGlmIChvbGR2YWwgPj0gQ01QQVJHKSB3YWtlICovCisKKy8qIEZVVEVYX1dBS0VfT1Agd2lsbCBwZXJmb3JtIGF0b21pY2FsbHkKKyAgIGludCBvbGR2YWwgPSAqKGludCAqKVVBRERSMjsKKyAgICooaW50ICopVUFERFIyID0gb2xkdmFsIE9QIE9QQVJHOworICAgaWYgKG9sZHZhbCBDTVAgQ01QQVJHKQorICAgICB3YWtlIFVBRERSMjsgICovCisKKyNkZWZpbmUgRlVURVhfT1Aob3AsIG9wYXJnLCBjbXAsIGNtcGFyZykgXAorICAoKChvcCAmIDB4ZikgPDwgMjgpIHwgKChjbXAgJiAweGYpIDw8IDI0KQkJXAorICAgfCAoKG9wYXJnICYgMHhmZmYpIDw8IDEyKSB8IChjbXBhcmcgJiAweGZmZikpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nYW1lcG9ydC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nYW1lcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzNjNGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dhbWVwb3J0LmgKQEAgLTAsMCArMSwyOCBAQAorI2lmbmRlZiBfR0FNRVBPUlRfSAorI2RlZmluZSBfR0FNRVBPUlRfSAorCisvKgorICogIENvcHlyaWdodCAoYykgMTk5OS0yMDAyIFZvanRlY2ggUGF2bGlrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisKKyNkZWZpbmUgR0FNRVBPUlRfTU9ERV9ESVNBQkxFRAkJMAorI2RlZmluZSBHQU1FUE9SVF9NT0RFX1JBVwkJMQorI2RlZmluZSBHQU1FUE9SVF9NT0RFX0NPT0tFRAkJMgorCisjZGVmaW5lIEdBTUVQT1JUX0lEX1ZFTkRPUl9BTkFMT0cJMHgwMDAxCisjZGVmaW5lIEdBTUVQT1JUX0lEX1ZFTkRPUl9NQURDQVRaCTB4MDAwMgorI2RlZmluZSBHQU1FUE9SVF9JRF9WRU5ET1JfTE9HSVRFQ0gJMHgwMDAzCisjZGVmaW5lIEdBTUVQT1JUX0lEX1ZFTkRPUl9DUkVBVElWRQkweDAwMDQKKyNkZWZpbmUgR0FNRVBPUlRfSURfVkVORE9SX0dFTklVUwkweDAwMDUKKyNkZWZpbmUgR0FNRVBPUlRfSURfVkVORE9SX0lOVEVSQUNUCTB4MDAwNgorI2RlZmluZSBHQU1FUE9SVF9JRF9WRU5ET1JfTUlDUk9TT0ZUCTB4MDAwNworI2RlZmluZSBHQU1FUE9SVF9JRF9WRU5ET1JfVEhSVVNUTUFTVEVSCTB4MDAwOAorI2RlZmluZSBHQU1FUE9SVF9JRF9WRU5ET1JfR1JBVklTCTB4MDAwOQorI2RlZmluZSBHQU1FUE9SVF9JRF9WRU5ET1JfR1VJTExFTU9UCTB4MDAwYQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2VuX3N0YXRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dlbl9zdGF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MmM4YTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dlbl9zdGF0cy5oCkBAIC0wLDAgKzEsNjcgQEAKKyNpZm5kZWYgX19MSU5VWF9HRU5fU1RBVFNfSAorI2RlZmluZSBfX0xJTlVYX0dFTl9TVEFUU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwlUQ0FfU1RBVFNfVU5TUEVDLAorCVRDQV9TVEFUU19CQVNJQywKKwlUQ0FfU1RBVFNfUkFURV9FU1QsCisJVENBX1NUQVRTX1FVRVVFLAorCVRDQV9TVEFUU19BUFAsCisJX19UQ0FfU1RBVFNfTUFYLAorfTsKKyNkZWZpbmUgVENBX1NUQVRTX01BWCAoX19UQ0FfU1RBVFNfTUFYIC0gMSkKKworLyoqCisgKiBzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpYyAtIGJ5dGUvcGFja2V0IHRocm91Z2hwdXQgc3RhdGlzdGljcworICogQGJ5dGVzOiBudW1iZXIgb2Ygc2VlbiBieXRlcworICogQHBhY2tldHM6IG51bWJlciBvZiBzZWVuIHBhY2tldHMKKyAqLworc3RydWN0IGduZXRfc3RhdHNfYmFzaWMgeworCV9fdTY0CWJ5dGVzOworCV9fdTMyCXBhY2tldHM7Cit9Oworc3RydWN0IGduZXRfc3RhdHNfYmFzaWNfcGFja2VkIHsKKwlfX3U2NAlieXRlczsKKwlfX3UzMglwYWNrZXRzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogc3RydWN0IGduZXRfc3RhdHNfcmF0ZV9lc3QgLSByYXRlIGVzdGltYXRvcgorICogQGJwczogY3VycmVudCBieXRlIHJhdGUKKyAqIEBwcHM6IGN1cnJlbnQgcGFja2V0IHJhdGUKKyAqLworc3RydWN0IGduZXRfc3RhdHNfcmF0ZV9lc3QgeworCV9fdTMyCWJwczsKKwlfX3UzMglwcHM7Cit9OworCisvKioKKyAqIHN0cnVjdCBnbmV0X3N0YXRzX3F1ZXVlIC0gcXVldWluZyBzdGF0aXN0aWNzCisgKiBAcWxlbjogcXVldWUgbGVuZ3RoCisgKiBAYmFja2xvZzogYmFja2xvZyBzaXplIG9mIHF1ZXVlCisgKiBAZHJvcHM6IG51bWJlciBvZiBkcm9wcGVkIHBhY2tldHMKKyAqIEByZXF1ZXVlczogbnVtYmVyIG9mIHJlcXVldWVzCisgKiBAb3ZlcmxpbWl0czogbnVtYmVyIG9mIGVucXVldWVzIG92ZXIgdGhlIGxpbWl0CisgKi8KK3N0cnVjdCBnbmV0X3N0YXRzX3F1ZXVlIHsKKwlfX3UzMglxbGVuOworCV9fdTMyCWJhY2tsb2c7CisJX191MzIJZHJvcHM7CisJX191MzIJcmVxdWV1ZXM7CisJX191MzIJb3ZlcmxpbWl0czsKK307CisKKy8qKgorICogc3RydWN0IGduZXRfZXN0aW1hdG9yIC0gcmF0ZSBlc3RpbWF0b3IgY29uZmlndXJhdGlvbgorICogQGludGVydmFsOiBzYW1wbGluZyBwZXJpb2QKKyAqIEBld21hX2xvZzogdGhlIGxvZyBvZiBtZWFzdXJlbWVudCB3aW5kb3cgd2VpZ2h0CisgKi8KK3N0cnVjdCBnbmV0X2VzdGltYXRvciB7CisJc2lnbmVkIGNoYXIJaW50ZXJ2YWw7CisJdW5zaWduZWQgY2hhcglld21hX2xvZzsKK307CisKKworI2VuZGlmIC8qIF9fTElOVVhfR0VOX1NUQVRTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2VuZXJpY19zZXJpYWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2VuZXJpY19zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjU5NmI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nZW5lcmljX3NlcmlhbC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiAgZ2VuZXJpY19zZXJpYWwuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTggUi5FLldvbGZmQEJpdFdpemFyZC5ubAorICoKKyAqICB3cml0dGVuIGZvciB0aGUgU1ggc2VyaWFsIGRyaXZlci4KKyAqICAgICBDb250YWlucyB0aGUgY29kZSB0aGF0IHNob3VsZCBiZSBzaGFyZWQgb3ZlciBhbGwgdGhlIHNlcmlhbCBkcml2ZXJzLgorICoKKyAqICBWZXJzaW9uIDAuMSAtLSBEZWNlbWJlciwgMTk5OC4KKyAqLworCisjaWZuZGVmIEdFTkVSSUNfU0VSSUFMX0gKKyNkZWZpbmUgR0VORVJJQ19TRVJJQUxfSAorCisKKy8qIEZsYWdzICovCisvKiBXYXJuaW5nOiBzZXJpYWwuaCBkZWZpbmVzIHNvbWUgQVNZTkNfIGZsYWdzLCB0aGV5IHNheSB0aGV5IGFyZSAib25seSIKKyAgIHVzZWQgaW4gc2VyaWFsLmMsIGJ1dCB0aGV5IGFyZSBhbHNvIHVzZWQgaW4gYWxsIG90aGVyIHNlcmlhbCBkcml2ZXJzLiAKKyAgIE1ha2Ugc3VyZSB0aGV5IGRvbid0IGNsYXNoIHdpdGggdGhlc2UgaGVyZS4uLiAqLworI2RlZmluZSBHU19UWF9JTlRFTiAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgR1NfUlhfSU5URU4gICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEdTX0FDVElWRSAgICAgICAgMHgwMDIwMDAwMAorCisKKworI2RlZmluZSBHU19UWVBFX05PUk1BTCAgIDEKKworI2RlZmluZSBHU19ERUJVR19GTFVTSCAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR1NfREVCVUdfQlRSICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdTX0RFQlVHX1RFUk1JT1MgMHgwMDAwMDAwNAorI2RlZmluZSBHU19ERUJVR19TVFVGRiAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgR1NfREVCVUdfQ0xPU0UgICAweDAwMDAwMDEwCisjZGVmaW5lIEdTX0RFQlVHX0ZMT1cgICAgMHgwMDAwMDAyMAorI2RlZmluZSBHU19ERUJVR19XUklURSAgIDB4MDAwMDAwNDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dlbmV0bGluay5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nZW5ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWNlN2JiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nZW5ldGxpbmsuaApAQCAtMCwwICsxLDg0IEBACisjaWZuZGVmIF9fTElOVVhfR0VORVJJQ19ORVRMSU5LX0gKKyNkZWZpbmUgX19MSU5VWF9HRU5FUklDX05FVExJTktfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNkZWZpbmUgR0VOTF9OQU1TSVoJMTYJLyogbGVuZ3RoIG9mIGZhbWlseSBuYW1lICovCisKKyNkZWZpbmUgR0VOTF9NSU5fSUQJTkxNU0dfTUlOX1RZUEUKKyNkZWZpbmUgR0VOTF9NQVhfSUQJMTAyMworCitzdHJ1Y3QgZ2VubG1zZ2hkciB7CisJX191OAljbWQ7CisJX191OAl2ZXJzaW9uOworCV9fdTE2CXJlc2VydmVkOworfTsKKworI2RlZmluZSBHRU5MX0hEUkxFTglOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGdlbmxtc2doZHIpKQorCisjZGVmaW5lIEdFTkxfQURNSU5fUEVSTQkJMHgwMQorI2RlZmluZSBHRU5MX0NNRF9DQVBfRE8JCTB4MDIKKyNkZWZpbmUgR0VOTF9DTURfQ0FQX0RVTVAJMHgwNAorI2RlZmluZSBHRU5MX0NNRF9DQVBfSEFTUE9MCTB4MDgKKworLyoKKyAqIExpc3Qgb2YgcmVzZXJ2ZWQgc3RhdGljIGdlbmVyaWMgbmV0bGluayBpZGVudGlmaWVyczoKKyAqLworI2RlZmluZSBHRU5MX0lEX0dFTkVSQVRFCTAKKyNkZWZpbmUgR0VOTF9JRF9DVFJMCQlOTE1TR19NSU5fVFlQRQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbnRyb2xsZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZW51bSB7CisJQ1RSTF9DTURfVU5TUEVDLAorCUNUUkxfQ01EX05FV0ZBTUlMWSwKKwlDVFJMX0NNRF9ERUxGQU1JTFksCisJQ1RSTF9DTURfR0VURkFNSUxZLAorCUNUUkxfQ01EX05FV09QUywKKwlDVFJMX0NNRF9ERUxPUFMsCisJQ1RSTF9DTURfR0VUT1BTLAorCUNUUkxfQ01EX05FV01DQVNUX0dSUCwKKwlDVFJMX0NNRF9ERUxNQ0FTVF9HUlAsCisJQ1RSTF9DTURfR0VUTUNBU1RfR1JQLCAvKiB1bnVzZWQgKi8KKwlfX0NUUkxfQ01EX01BWCwKK307CisKKyNkZWZpbmUgQ1RSTF9DTURfTUFYIChfX0NUUkxfQ01EX01BWCAtIDEpCisKK2VudW0geworCUNUUkxfQVRUUl9VTlNQRUMsCisJQ1RSTF9BVFRSX0ZBTUlMWV9JRCwKKwlDVFJMX0FUVFJfRkFNSUxZX05BTUUsCisJQ1RSTF9BVFRSX1ZFUlNJT04sCisJQ1RSTF9BVFRSX0hEUlNJWkUsCisJQ1RSTF9BVFRSX01BWEFUVFIsCisJQ1RSTF9BVFRSX09QUywKKwlDVFJMX0FUVFJfTUNBU1RfR1JPVVBTLAorCV9fQ1RSTF9BVFRSX01BWCwKK307CisKKyNkZWZpbmUgQ1RSTF9BVFRSX01BWCAoX19DVFJMX0FUVFJfTUFYIC0gMSkKKworZW51bSB7CisJQ1RSTF9BVFRSX09QX1VOU1BFQywKKwlDVFJMX0FUVFJfT1BfSUQsCisJQ1RSTF9BVFRSX09QX0ZMQUdTLAorCV9fQ1RSTF9BVFRSX09QX01BWCwKK307CisKKyNkZWZpbmUgQ1RSTF9BVFRSX09QX01BWCAoX19DVFJMX0FUVFJfT1BfTUFYIC0gMSkKKworZW51bSB7CisJQ1RSTF9BVFRSX01DQVNUX0dSUF9VTlNQRUMsCisJQ1RSTF9BVFRSX01DQVNUX0dSUF9OQU1FLAorCUNUUkxfQVRUUl9NQ0FTVF9HUlBfSUQsCisJX19DVFJMX0FUVFJfTUNBU1RfR1JQX01BWCwKK307CisKKyNkZWZpbmUgQ1RSTF9BVFRSX01DQVNUX0dSUF9NQVggKF9fQ1RSTF9BVFRSX01DQVNUX0dSUF9NQVggLSAxKQorCisKKyNlbmRpZgkvKiBfX0xJTlVYX0dFTkVSSUNfTkVUTElOS19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dmczJfb25kaXNrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dmczJfb25kaXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzOTZkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2ZzMl9vbmRpc2suaApAQCAtMCwwICsxLDQ0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiAgMTk5Ny0yMDAzIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKi8KKworI2lmbmRlZiBfX0dGUzJfT05ESVNLX0RPVF9IX18KKyNkZWZpbmUgX19HRlMyX09ORElTS19ET1RfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEdGUzJfTUFHSUMJCTB4MDExNjE5NzAKKyNkZWZpbmUgR0ZTMl9CQVNJQ19CTE9DSwk1MTIKKyNkZWZpbmUgR0ZTMl9CQVNJQ19CTE9DS19TSElGVAk5CisKKy8qIExvY2sgbnVtYmVycyBvZiB0aGUgTE1fVFlQRV9OT05ESVNLIHR5cGUgKi8KKworI2RlZmluZSBHRlMyX01PVU5UX0xPQ0sJCTAKKyNkZWZpbmUgR0ZTMl9MSVZFX0xPQ0sJCTEKKyNkZWZpbmUgR0ZTMl9UUkFOU19MT0NLCQkyCisjZGVmaW5lIEdGUzJfUkVOQU1FX0xPQ0sJMworCisvKiBGb3JtYXQgbnVtYmVycyBmb3IgdmFyaW91cyBtZXRhZGF0YSB0eXBlcyAqLworCisjZGVmaW5lIEdGUzJfRk9STUFUX05PTkUJMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9TQgkJMTAwCisjZGVmaW5lIEdGUzJfRk9STUFUX1JHCQkyMDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfUkIJCTMwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9ESQkJNDAwCisjZGVmaW5lIEdGUzJfRk9STUFUX0lOCQk1MDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfTEYJCTYwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9KRAkJNzAwCisjZGVmaW5lIEdGUzJfRk9STUFUX0xICQk4MDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfTEQJCTkwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9MQgkJMTAwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9FQQkJMTYwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9FRAkJMTcwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9RQwkJMTQwMAorLyogVGhlc2UgYXJlIGZvcm1hdCBudW1iZXJzIGZvciBlbnRpdGllcyBjb250YWluZWQgaW4gZmlsZXMgKi8KKyNkZWZpbmUgR0ZTMl9GT1JNQVRfUkkJCTExMDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfREUJCTEyMDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfUVUJCTE1MDAKKy8qIFRoZXNlIGFyZSBwYXJ0IG9mIHRoZSBzdXBlcmJsb2NrICovCisjZGVmaW5lIEdGUzJfRk9STUFUX0ZTCQkxODAxCisjZGVmaW5lIEdGUzJfRk9STUFUX01VTFRJCTE5MDAKKworLyoKKyAqIEFuIG9uLWRpc2sgaW5vZGUgbnVtYmVyCisgKi8KKworc3RydWN0IGdmczJfaW51bSB7CisJX19iZTY0IG5vX2Zvcm1hbF9pbm87CisJX19iZTY0IG5vX2FkZHI7Cit9OworCisvKgorICogR2VuZXJpYyBtZXRhZGF0YSBoZWFkIHN0cnVjdHVyZQorICogRXZlcnkgaW5wbGFjZSBidWZmZXIgbG9nZ2VkIGluIHRoZSBqb3VybmFsIG11c3Qgc3RhcnQgd2l0aCB0aGlzLgorICovCisKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9OT05FCTAKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9TQgkxCisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfUkcJMgorI2RlZmluZSBHRlMyX01FVEFUWVBFX1JCCTMKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9ESQk0CisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfSU4JNQorI2RlZmluZSBHRlMyX01FVEFUWVBFX0xGCTYKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9KRAk3CisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfTEgJOAorI2RlZmluZSBHRlMyX01FVEFUWVBFX0xECTkKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9MQgkxMgorI2RlZmluZSBHRlMyX01FVEFUWVBFX0VBCTEwCisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfRUQJMTEKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9RQwkxNAorCitzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciB7CisJX19iZTMyIG1oX21hZ2ljOworCV9fYmUzMiBtaF90eXBlOworCV9fYmU2NCBfX3BhZDA7CQkvKiBXYXMgZ2VuZXJhdGlvbiBudW1iZXIgaW4gZ2ZzMSAqLworCV9fYmUzMiBtaF9mb3JtYXQ7CisJLyogVGhpcyB1bmlvbiBpcyB0byBrZWVwIHVzZXJzcGFjZSBoYXBweSAqLworCXVuaW9uIHsKKwkJX19iZTMyIG1oX2ppZDsJCS8qIFdhcyBpbmNhcm5hdGlvbiBudW1iZXIgaW4gZ2ZzMSAqLworCQlfX2JlMzIgX19wYWQxOworCX07Cit9OworCisvKgorICogc3VwZXItYmxvY2sgc3RydWN0dXJlCisgKgorICogSXQncyBwcm9iYWJseSBnb29kIGlmIFNJWkVPRl9TQiA8PSBHRlMyX0JBU0lDX0JMT0NLICg1MTIgYnl0ZXMpCisgKgorICogT3JkZXIgaXMgaW1wb3J0YW50LCBuZWVkIHRvIGJlIGFibGUgdG8gcmVhZCBvbGQgc3VwZXJibG9ja3MgdG8gZG8gb24tZGlzaworICogdmVyc2lvbiB1cGdyYWRlcy4KKyAqLworCisvKiBBZGRyZXNzIG9mIHN1cGVyYmxvY2sgaW4gR0ZTMiBiYXNpYyBibG9ja3MgKi8KKyNkZWZpbmUgR0ZTMl9TQl9BRERSCQkxMjgKKworLyogVGhlIGxvY2sgbnVtYmVyIGZvciB0aGUgc3VwZXJibG9jayAobXVzdCBiZSB6ZXJvKSAqLworI2RlZmluZSBHRlMyX1NCX0xPQ0sJCTAKKworLyogUmVxdWlyZW1lbnQ6ICBHRlMyX0xPQ0tOQU1FX0xFTiAlIDggPT0gMAorICAgSW5jbHVkZXM6IHRoZSBmZW5jaW5nIHplcm8gYXQgdGhlIGVuZCAqLworI2RlZmluZSBHRlMyX0xPQ0tOQU1FX0xFTgk2NAorCitzdHJ1Y3QgZ2ZzMl9zYiB7CisJc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgc2JfaGVhZGVyOworCisJX19iZTMyIHNiX2ZzX2Zvcm1hdDsKKwlfX2JlMzIgc2JfbXVsdGlob3N0X2Zvcm1hdDsKKwlfX3UzMiAgX19wYWQwOwkvKiBXYXMgc3VwZXJibG9jayBmbGFncyBpbiBnZnMxICovCisKKwlfX2JlMzIgc2JfYnNpemU7CisJX19iZTMyIHNiX2JzaXplX3NoaWZ0OworCV9fdTMyIF9fcGFkMTsJLyogV2FzIGpvdXJuYWwgc2VnbWVudCBzaXplIGluIGdmczEgKi8KKworCXN0cnVjdCBnZnMyX2ludW0gc2JfbWFzdGVyX2RpcjsgLyogV2FzIGppbmRleCBkaW5vZGUgaW4gZ2ZzMSAqLworCXN0cnVjdCBnZnMyX2ludW0gX19wYWQyOyAvKiBXYXMgcmluZGV4IGRpbm9kZSBpbiBnZnMxICovCisJc3RydWN0IGdmczJfaW51bSBzYl9yb290X2RpcjsKKworCWNoYXIgc2JfbG9ja3Byb3RvW0dGUzJfTE9DS05BTUVfTEVOXTsKKwljaGFyIHNiX2xvY2t0YWJsZVtHRlMyX0xPQ0tOQU1FX0xFTl07CisKKwlzdHJ1Y3QgZ2ZzMl9pbnVtIF9fcGFkMzsgLyogV2FzIHF1b3RhIGlub2RlIGluIGdmczEgKi8KKwlzdHJ1Y3QgZ2ZzMl9pbnVtIF9fcGFkNDsgLyogV2FzIGxpY2VuY2UgaW5vZGUgaW4gZ2ZzMSAqLworI2RlZmluZSBHRlMyX0hBU19VVUlEIDEKKwlfX3U4IHNiX3V1aWRbMTZdOyAvKiBUaGUgVVVJRCwgbWF5YmUgMCBmb3IgYmFja3dhcmRzIGNvbXBhdCAqLworfTsKKworLyoKKyAqIHJlc291cmNlIGluZGV4IHN0cnVjdHVyZQorICovCisKK3N0cnVjdCBnZnMyX3JpbmRleCB7CisJX19iZTY0IHJpX2FkZHI7CS8qIGdycCBibG9jayBkaXNrIGFkZHJlc3MgKi8KKwlfX2JlMzIgcmlfbGVuZ3RoOwkvKiBsZW5ndGggb2YgcmdycCBoZWFkZXIgaW4gZnMgYmxvY2tzICovCisJX191MzIgX19wYWQ7CisKKwlfX2JlNjQgcmlfZGF0YTA7CS8qIGZpcnN0IGRhdGEgbG9jYXRpb24gKi8KKwlfX2JlMzIgcmlfZGF0YTsJLyogbnVtIG9mIGRhdGEgYmxvY2tzIGluIHJncnAgKi8KKworCV9fYmUzMiByaV9iaXRieXRlczsJLyogbnVtYmVyIG9mIGJ5dGVzIGluIGRhdGEgYml0bWFwcyAqLworCisJX191OCByaV9yZXNlcnZlZFs2NF07Cit9OworCisvKgorICogcmVzb3VyY2UgZ3JvdXAgaGVhZGVyIHN0cnVjdHVyZQorICovCisKKy8qIE51bWJlciBvZiBibG9ja3MgcGVyIGJ5dGUgaW4gcmdycCAqLworI2RlZmluZSBHRlMyX05CQlkJCTQKKyNkZWZpbmUgR0ZTMl9CSVRfU0laRQkJMgorI2RlZmluZSBHRlMyX0JJVF9NQVNLCQkweDAwMDAwMDAzCisKKyNkZWZpbmUgR0ZTMl9CTEtTVF9GUkVFCQkwCisjZGVmaW5lIEdGUzJfQkxLU1RfVVNFRAkJMQorI2RlZmluZSBHRlMyX0JMS1NUX1VOTElOS0VECTIKKyNkZWZpbmUgR0ZTMl9CTEtTVF9ESU5PREUJMworCisjZGVmaW5lIEdGUzJfUkdGX0pPVVJOQUwJMHgwMDAwMDAwMQorI2RlZmluZSBHRlMyX1JHRl9NRVRBT05MWQkweDAwMDAwMDAyCisjZGVmaW5lIEdGUzJfUkdGX0RBVEFPTkxZCTB4MDAwMDAwMDQKKyNkZWZpbmUgR0ZTMl9SR0ZfTk9BTExPQwkweDAwMDAwMDA4CisKK3N0cnVjdCBnZnMyX3JncnAgeworCXN0cnVjdCBnZnMyX21ldGFfaGVhZGVyIHJnX2hlYWRlcjsKKworCV9fYmUzMiByZ19mbGFnczsKKwlfX2JlMzIgcmdfZnJlZTsKKwlfX2JlMzIgcmdfZGlub2RlczsKKwlfX2JlMzIgX19wYWQ7CisJX19iZTY0IHJnX2lnZW5lcmF0aW9uOworCisJX191OCByZ19yZXNlcnZlZFs4MF07IC8qIFNldmVyYWwgZmllbGRzIGZyb20gZ2ZzMSBub3cgcmVzZXJ2ZWQgKi8KK307CisKKy8qCisgKiBxdW90YSBzdHJ1Y3R1cmUKKyAqLworCitzdHJ1Y3QgZ2ZzMl9xdW90YSB7CisJX19iZTY0IHF1X2xpbWl0OworCV9fYmU2NCBxdV93YXJuOworCV9fYmU2NCBxdV92YWx1ZTsKKwlfX3U4IHF1X3Jlc2VydmVkWzY0XTsKK307CisKKy8qCisgKiBkaW5vZGUgc3RydWN0dXJlCisgKi8KKworI2RlZmluZSBHRlMyX01BWF9NRVRBX0hFSUdIVAkxMAorI2RlZmluZSBHRlMyX0RJUl9NQVhfREVQVEgJMTcKKworI2RlZmluZSBEVDJJRihkdCkgKCgoZHQpIDw8IDEyKSAmIFNfSUZNVCkKKyNkZWZpbmUgSUYyRFQoc2lmKSAoKChzaWYpICYgU19JRk1UKSA+PiAxMikKKworZW51bSB7CisJZ2ZzMmZsX0pkYXRhCQk9IDAsCisJZ2ZzMmZsX0V4SGFzaAkJPSAxLAorCWdmczJmbF9VbnVzZWQJCT0gMiwKKwlnZnMyZmxfRWFJbmRpcmVjdAk9IDMsCisJZ2ZzMmZsX0RpcmVjdGlvCQk9IDQsCisJZ2ZzMmZsX0ltbXV0YWJsZQk9IDUsCisJZ2ZzMmZsX0FwcGVuZE9ubHkJPSA2LAorCWdmczJmbF9Ob0F0aW1lCQk9IDcsCisJZ2ZzMmZsX1N5bmMJCT0gOCwKKwlnZnMyZmxfU3lzdGVtCQk9IDksCisJZ2ZzMmZsX1RydW5jSW5Qcm9nCT0gMjksCisJZ2ZzMmZsX0luaGVyaXREaXJlY3Rpbwk9IDMwLAorCWdmczJmbF9Jbmhlcml0SmRhdGEJPSAzMSwKK307CisKKy8qIERpbm9kZSBmbGFncyAqLworI2RlZmluZSBHRlMyX0RJRl9KREFUQQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgR0ZTMl9ESUZfRVhIQVNICQkJMHgwMDAwMDAwMgorI2RlZmluZSBHRlMyX0RJRl9VTlVTRUQJCQkweDAwMDAwMDA0ICAvKiBvbmx5IGluIGdmczEgKi8KKyNkZWZpbmUgR0ZTMl9ESUZfRUFfSU5ESVJFQ1QJCTB4MDAwMDAwMDgKKyNkZWZpbmUgR0ZTMl9ESUZfRElSRUNUSU8JCTB4MDAwMDAwMTAKKyNkZWZpbmUgR0ZTMl9ESUZfSU1NVVRBQkxFCQkweDAwMDAwMDIwCisjZGVmaW5lIEdGUzJfRElGX0FQUEVORE9OTFkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgR0ZTMl9ESUZfTk9BVElNRQkJMHgwMDAwMDA4MAorI2RlZmluZSBHRlMyX0RJRl9TWU5DCQkJMHgwMDAwMDEwMAorI2RlZmluZSBHRlMyX0RJRl9TWVNURU0JCQkweDAwMDAwMjAwIC8qIE5ldyBpbiBnZnMyICovCisjZGVmaW5lIEdGUzJfRElGX1RSVU5DX0lOX1BST0cJCTB4MjAwMDAwMDAgLyogTmV3IGluIGdmczIgKi8KKyNkZWZpbmUgR0ZTMl9ESUZfSU5IRVJJVF9ESVJFQ1RJTwkweDQwMDAwMDAwCisjZGVmaW5lIEdGUzJfRElGX0lOSEVSSVRfSkRBVEEJCTB4ODAwMDAwMDAKKworc3RydWN0IGdmczJfZGlub2RlIHsKKwlzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciBkaV9oZWFkZXI7CisKKwlzdHJ1Y3QgZ2ZzMl9pbnVtIGRpX251bTsKKworCV9fYmUzMiBkaV9tb2RlOwkvKiBtb2RlIG9mIGZpbGUgKi8KKwlfX2JlMzIgZGlfdWlkOwkvKiBvd25lcidzIHVzZXIgaWQgKi8KKwlfX2JlMzIgZGlfZ2lkOwkvKiBvd25lcidzIGdyb3VwIGlkICovCisJX19iZTMyIGRpX25saW5rOwkvKiBudW1iZXIgb2YgbGlua3MgdG8gdGhpcyBmaWxlICovCisJX19iZTY0IGRpX3NpemU7CS8qIG51bWJlciBvZiBieXRlcyBpbiBmaWxlICovCisJX19iZTY0IGRpX2Jsb2NrczsJLyogbnVtYmVyIG9mIGJsb2NrcyBpbiBmaWxlICovCisJX19iZTY0IGRpX2F0aW1lOwkvKiB0aW1lIGxhc3QgYWNjZXNzZWQgKi8KKwlfX2JlNjQgZGlfbXRpbWU7CS8qIHRpbWUgbGFzdCBtb2RpZmllZCAqLworCV9fYmU2NCBkaV9jdGltZTsJLyogdGltZSBsYXN0IGNoYW5nZWQgKi8KKwlfX2JlMzIgZGlfbWFqb3I7CS8qIGRldmljZSBtYWpvciBudW1iZXIgKi8KKwlfX2JlMzIgZGlfbWlub3I7CS8qIGRldmljZSBtaW5vciBudW1iZXIgKi8KKworCS8qIFRoaXMgc2VjdGlvbiB2YXJpZXMgZnJvbSBnZnMxLiBQYWRkaW5nIGFkZGVkIHRvIGFsaWduIHdpdGgKKyAgICAgICAgICogcmVtYWluZGVyIG9mIGRpbm9kZQorCSAqLworCV9fYmU2NCBkaV9nb2FsX21ldGE7CS8qIHJncnAgdG8gYWxsb2MgZnJvbSBuZXh0ICovCisJX19iZTY0IGRpX2dvYWxfZGF0YTsJLyogZGF0YSBibG9jayBnb2FsICovCisJX19iZTY0IGRpX2dlbmVyYXRpb247CS8qIGdlbmVyYXRpb24gbnVtYmVyIGZvciBORlMgKi8KKworCV9fYmUzMiBkaV9mbGFnczsJLyogR0ZTMl9ESUZfLi4uICovCisJX19iZTMyIGRpX3BheWxvYWRfZm9ybWF0OyAgLyogR0ZTMl9GT1JNQVRfLi4uICovCisJX191MTYgX19wYWQxOwkvKiBXYXMgZGl0eXBlIGluIGdmczEgKi8KKwlfX2JlMTYgZGlfaGVpZ2h0OwkvKiBoZWlnaHQgb2YgbWV0YWRhdGEgKi8KKwlfX3UzMiBfX3BhZDI7CS8qIFVudXNlZCBpbmNhcm5hdGlvbiBudW1iZXIgZnJvbSBnZnMxICovCisKKwkvKiBUaGVzZSBvbmx5IGFwcGx5IHRvIGRpcmVjdG9yaWVzICAqLworCV9fdTE2IF9fcGFkMzsJLyogUGFkZGluZyAqLworCV9fYmUxNiBkaV9kZXB0aDsJLyogTnVtYmVyIG9mIGJpdHMgaW4gdGhlIHRhYmxlICovCisJX19iZTMyIGRpX2VudHJpZXM7CS8qIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZGlyZWN0b3J5ICovCisKKwlzdHJ1Y3QgZ2ZzMl9pbnVtIF9fcGFkNDsgLyogVW51c2VkIGV2ZW4gaW4gY3VycmVudCBnZnMxICovCisKKwlfX2JlNjQgZGlfZWF0dHI7CS8qIGV4dGVuZGVkIGF0dHJpYnV0ZSBibG9jayBudW1iZXIgKi8KKwlfX2JlMzIgZGlfYXRpbWVfbnNlYzsgICAvKiBuc2VjIHBvcnRpb24gb2YgYXRpbWUgKi8KKwlfX2JlMzIgZGlfbXRpbWVfbnNlYzsgICAvKiBuc2VjIHBvcnRpb24gb2YgbXRpbWUgKi8KKwlfX2JlMzIgZGlfY3RpbWVfbnNlYzsgICAvKiBuc2VjIHBvcnRpb24gb2YgY3RpbWUgKi8KKworCV9fdTggZGlfcmVzZXJ2ZWRbNDRdOworfTsKKworLyoKKyAqIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgLSBtYW55IG9mIHRoZXNlIHBlciBkaXJlY3RvcnkgZmlsZQorICovCisKKyNkZWZpbmUgR0ZTMl9GTkFNRVNJWkUJCTI1NQorI2RlZmluZSBHRlMyX0RJUkVOVF9TSVpFKG5hbWVfbGVuKSAoKHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaXJlbnQpICsgKG5hbWVfbGVuKSArIDcpICYgfjcpCisKK3N0cnVjdCBnZnMyX2RpcmVudCB7CisJc3RydWN0IGdmczJfaW51bSBkZV9pbnVtOworCV9fYmUzMiBkZV9oYXNoOworCV9fYmUxNiBkZV9yZWNfbGVuOworCV9fYmUxNiBkZV9uYW1lX2xlbjsKKwlfX2JlMTYgZGVfdHlwZTsKKwlfX3U4IF9fcGFkWzE0XTsKK307CisKKy8qCisgKiBIZWFkZXIgb2YgbGVhZiBkaXJlY3Rvcnkgbm9kZXMKKyAqLworCitzdHJ1Y3QgZ2ZzMl9sZWFmIHsKKwlzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciBsZl9oZWFkZXI7CisKKwlfX2JlMTYgbGZfZGVwdGg7CQkvKiBEZXB0aCBvZiBsZWFmICovCisJX19iZTE2IGxmX2VudHJpZXM7CQkvKiBOdW1iZXIgb2YgZGlyZW50cyBpbiBsZWFmICovCisJX19iZTMyIGxmX2RpcmVudF9mb3JtYXQ7CS8qIEZvcm1hdCBvZiB0aGUgZGlyZW50cyAqLworCV9fYmU2NCBsZl9uZXh0OwkJCS8qIE5leHQgbGVhZiwgaWYgb3ZlcmZsb3cgKi8KKworCV9fdTggbGZfcmVzZXJ2ZWRbNjRdOworfTsKKworLyoKKyAqIEV4dGVuZGVkIGF0dHJpYnV0ZSBoZWFkZXIgZm9ybWF0CisgKgorICogVGhpcyB3b3JrcyBpbiBhIHNpbWlsYXIgd2F5IHRvIGRpcmVudHMuIFRoZXJlIGlzIGEgZml4ZWQgc2l6ZSBoZWFkZXIKKyAqIGZvbGxvd2VkIGJ5IGEgdmFyaWFibGUgbGVuZ3RoIHNlY3Rpb24gbWFkZSB1cCBvZiB0aGUgbmFtZSBhbmQgdGhlCisgKiBhc3NvY2lhdGVkIGRhdGEuIEluIHRoZSBjYXNlIG9mIGEgInN0dWZmZWQiIGVudHJ5LCB0aGUgdmFsdWUgaXMKKyAqIF9faW5saW5lX18gZGlyZWN0bHkgYWZ0ZXIgdGhlIG5hbWUsIHRoZSBlYV9udW1fcHRycyBlbnRyeSB3aWxsIGJlCisgKiB6ZXJvIGluIHRoYXQgY2FzZS4gRm9yIG5vbi0ic3R1ZmZlZCIgZW50cmllcywgdGhlcmUgd2lsbCBiZQorICogYSBzZXQgb2YgcG9pbnRlcnMgKGFsaWduZWQgdG8gOCBieXRlIGJvdW5kYXJ5KSB0byB0aGUgYmxvY2socykKKyAqIGNvbnRhaW5pbmcgdGhlIHZhbHVlLgorICoKKyAqIFRoZSBibG9ja3MgY29udGFpbmluZyB0aGUgdmFsdWVzIGFuZCB0aGUgYmxvY2tzIGNvbnRhaW5pbmcgdGhlCisgKiBleHRlbmRlZCBhdHRyaWJ1dGUgaGVhZGVycyB0aGVtc2VsdmVzIGFsbCBzdGFydCB3aXRoIHRoZSBjb21tb24KKyAqIG1ldGFkYXRhIGhlYWRlci4gRWFjaCBpbm9kZSwgaWYgaXQgaGFzIGV4dGVuZGVkIGF0dHJpYnV0ZXMsIHdpbGwKKyAqIGhhdmUgZWl0aGVyIGEgc2luZ2xlIGJsb2NrIGNvbnRhaW5pbmcgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBoZWFkZXJzCisgKiBvciBhIHNpbmdsZSBpbmRpcmVjdCBibG9jayBwb2ludGluZyB0byBibG9ja3MgY29udGFpbmluZyB0aGUKKyAqIGV4dGVuZGVkIGF0dHJpYnVyZSBoZWFkZXJzLgorICoKKyAqIFRoZSBtYXhpbWltIHNpemUgb2YgdGhlIGRhdGEgcGFydCBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgaXMgNjRrCisgKiBzbyB0aGUgbnVtYmVyIG9mIGJsb2NrcyByZXF1aXJlZCBkZXBlbmRzIHVwb24gYmxvY2sgc2l6ZS4gU2luY2UgdGhlCisgKiBibG9jayBzaXplIGFsc28gZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHBvaW50ZXJzIGluIGFuIGluZGlyZWN0CisgKiBibG9jaywgaXRzIGEgZmFpcmx5IGNvbXBsaWNhdGVkIGNhbGN1bGF0aW9uIHRvIHdvcmsgb3V0IHRoZSBtYXhpbXVtCisgKiBudW1iZXIgb2YgYmxvY2tzIHRoYXQgYW4gaW5vZGUgbWF5IGhhdmUgcmVsYXRpbmcgdG8gZXh0ZW5kZWQgYXR0cmlidXRlcy4KKyAqCisgKi8KKworI2RlZmluZSBHRlMyX0VBX01BWF9OQU1FX0xFTgkyNTUKKyNkZWZpbmUgR0ZTMl9FQV9NQVhfREFUQV9MRU4JNjU1MzYKKworI2RlZmluZSBHRlMyX0VBVFlQRV9VTlVTRUQJMAorI2RlZmluZSBHRlMyX0VBVFlQRV9VU1IJCTEKKyNkZWZpbmUgR0ZTMl9FQVRZUEVfU1lTCQkyCisjZGVmaW5lIEdGUzJfRUFUWVBFX1NFQ1VSSVRZCTMKKworI2RlZmluZSBHRlMyX0VBVFlQRV9MQVNUCTMKKyNkZWZpbmUgR0ZTMl9FQVRZUEVfVkFMSUQoeCkJKCh4KSA8PSBHRlMyX0VBVFlQRV9MQVNUKQorCisjZGVmaW5lIEdGUzJfRUFGTEFHX0xBU1QJMHgwMQkvKiBsYXN0IGVhIGluIGJsb2NrICovCisKK3N0cnVjdCBnZnMyX2VhX2hlYWRlciB7CisJX19iZTMyIGVhX3JlY19sZW47CisJX19iZTMyIGVhX2RhdGFfbGVuOworCV9fdTggZWFfbmFtZV9sZW47CS8qIG5vIE5VTEwgcG9pbnRlciBhZnRlciB0aGUgc3RyaW5nICovCisJX191OCBlYV90eXBlOwkJLyogR0ZTMl9FQVRZUEVfLi4uICovCisJX191OCBlYV9mbGFnczsJCS8qIEdGUzJfRUFGTEFHXy4uLiAqLworCV9fdTggZWFfbnVtX3B0cnM7CisJX191MzIgX19wYWQ7Cit9OworCisvKgorICogTG9nIGhlYWRlciBzdHJ1Y3R1cmUKKyAqLworCisjZGVmaW5lIEdGUzJfTE9HX0hFQURfVU5NT1VOVAkweDAwMDAwMDAxCS8qIGxvZyBpcyBjbGVhbiAqLworCitzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyIHsKKwlzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciBsaF9oZWFkZXI7CisKKwlfX2JlNjQgbGhfc2VxdWVuY2U7CS8qIFNlcXVlbmNlIG51bWJlciBvZiB0aGlzIHRyYW5zYWN0aW9uICovCisJX19iZTMyIGxoX2ZsYWdzOwkvKiBHRlMyX0xPR19IRUFEXy4uLiAqLworCV9fYmUzMiBsaF90YWlsOwkJLyogQmxvY2sgbnVtYmVyIG9mIGxvZyB0YWlsICovCisJX19iZTMyIGxoX2Jsa25vOworCV9fYmUzMiBsaF9oYXNoOworfTsKKworLyoKKyAqIExvZyB0eXBlIGRlc2NyaXB0b3IKKyAqLworCisjZGVmaW5lIEdGUzJfTE9HX0RFU0NfTUVUQURBVEEJMzAwCisvKiBsZF9kYXRhMSBpcyB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIGJsb2NrcyBpbiB0aGUgZGVzY3JpcHRvci4KKyAgIGxkX2RhdGEyIGlzIHVudXNlZC4gKi8KKworI2RlZmluZSBHRlMyX0xPR19ERVNDX1JFVk9LRQkzMDEKKy8qIGxkX2RhdGExIGlzIHRoZSBudW1iZXIgb2YgcmV2b2tlIGJsb2NrcyBpbiB0aGUgZGVzY3JpcHRvci4KKyAgIGxkX2RhdGEyIGlzIHVudXNlZC4gKi8KKworI2RlZmluZSBHRlMyX0xPR19ERVNDX0pEQVRBCTMwMgorLyogbGRfZGF0YTEgaXMgdGhlIG51bWJlciBvZiBkYXRhIGJsb2NrcyBpbiB0aGUgZGVzY3JpcHRvci4KKyAgIGxkX2RhdGEyIGlzIHVudXNlZC4gKi8KKworc3RydWN0IGdmczJfbG9nX2Rlc2NyaXB0b3IgeworCXN0cnVjdCBnZnMyX21ldGFfaGVhZGVyIGxkX2hlYWRlcjsKKworCV9fYmUzMiBsZF90eXBlOwkJLyogR0ZTMl9MT0dfREVTQ18uLi4gKi8KKwlfX2JlMzIgbGRfbGVuZ3RoOwkvKiBOdW1iZXIgb2YgYnVmZmVycyBpbiB0aGlzIGNodW5rICovCisJX19iZTMyIGxkX2RhdGExOwkvKiBkZXNjcmlwdG9yLXNwZWNpZmljIGZpZWxkICovCisJX19iZTMyIGxkX2RhdGEyOwkvKiBkZXNjcmlwdG9yLXNwZWNpZmljIGZpZWxkICovCisKKwlfX3U4IGxkX3Jlc2VydmVkWzMyXTsKK307CisKKy8qCisgKiBJbnVtIFJhbmdlCisgKiBEZXNjcmliZSBhIHJhbmdlIG9mIGZvcm1hbCBpbm9kZSBudW1iZXJzIGFsbG9jYXRlZCB0bworICogb25lIG1hY2hpbmUgdG8gYXNzaWduIHRvIGlub2Rlcy4KKyAqLworCisjZGVmaW5lIEdGUzJfSU5VTV9RVUFOVFVNCTEwNDg1NzYKKworc3RydWN0IGdmczJfaW51bV9yYW5nZSB7CisJX19iZTY0IGlyX3N0YXJ0OworCV9fYmU2NCBpcl9sZW5ndGg7Cit9OworCisvKgorICogU3RhdGZzIGNoYW5nZQorICogRGVzY3JpYmVzIGFuIGNoYW5nZSB0byB0aGUgcG9vbCBvZiBmcmVlIGFuZCBhbGxvY2F0ZWQKKyAqIGJsb2Nrcy4KKyAqLworCitzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlIHsKKwlfX2JlNjQgc2NfdG90YWw7CisJX19iZTY0IHNjX2ZyZWU7CisJX19iZTY0IHNjX2Rpbm9kZXM7Cit9OworCisvKgorICogUXVvdGEgY2hhbmdlCisgKiBEZXNjcmliZXMgYW4gYWxsb2NhdGlvbiBjaGFuZ2UgZm9yIGEgcGFydGljdWxhcgorICogdXNlciBvciBncm91cC4KKyAqLworCisjZGVmaW5lIEdGUzJfUUNGX1VTRVIJCTB4MDAwMDAwMDEKKworc3RydWN0IGdmczJfcXVvdGFfY2hhbmdlIHsKKwlfX2JlNjQgcWNfY2hhbmdlOworCV9fYmUzMiBxY19mbGFnczsJLyogR0ZTMl9RQ0ZfLi4uICovCisJX19iZTMyIHFjX2lkOworfTsKKworc3RydWN0IGdmczJfcXVvdGFfbHZiIHsKKyAgICAgICAgX19iZTMyIHFiX21hZ2ljOworICAgICAgICBfX3UzMiBfX3BhZDsKKyAgICAgICAgX19iZTY0IHFiX2xpbWl0OyAgICAgIC8qIEhhcmQgbGltaXQgb2YgIyBibG9ja3MgdG8gYWxsb2MgKi8KKyAgICAgICAgX19iZTY0IHFiX3dhcm47ICAgICAgIC8qIFdhcm4gdXNlciB3aGVuIGFsbG9jIGlzIGFib3ZlIHRoaXMgIyAqLworICAgICAgICBfX2JlNjQgcWJfdmFsdWU7ICAgICAgIC8qIEN1cnJlbnQgIyBibG9ja3MgYWxsb2NhdGVkICovCit9OworCisjZW5kaWYgLyogX19HRlMyX09ORElTS19ET1RfSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dpZ2FzZXRfZGV2LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dpZ2FzZXRfZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4YmE4MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2lnYXNldF9kZXYuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogaW50ZXJmYWNlIHRvIHVzZXIgc3BhY2UgZm9yIHRoZSBnaWdhc2V0IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBieSBIYW5zam9lcmcgTGlwcCA8aGpsaXBwQHdlYi5kZT4KKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIEdJR0FTRVRfSU5URVJGQUNFX0gKKyNkZWZpbmUgR0lHQVNFVF9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworLyogVGhlIG1hZ2ljIElPQ1RMIHZhbHVlIGZvciB0aGlzIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgR0lHQVNFVF9JT0NUTCAweDQ3CisKKy8qIGVuYWJsZS9kaXNhYmxlIGRldmljZSBjb250cm9sIHZpYSBjaGFyYWN0ZXIgZGV2aWNlIChsb2NrIG91dCBJU0ROIHN1YnN5cykgKi8KKyNkZWZpbmUgR0lHQVNFVF9SRURJUiAgICBfSU9XUihHSUdBU0VUX0lPQ1RMLCAwLCBpbnQpCisKKy8qIGVuYWJsZSBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gbW9kZSAoTTEweCBvbmx5KSAqLworI2RlZmluZSBHSUdBU0VUX0NPTkZJRyAgIF9JT1dSKEdJR0FTRVRfSU9DVEwsIDEsIGludCkKKworLyogc2V0IGJyZWFrIGNoYXJhY3RlcnMgKE0xMDUgb25seSkgKi8KKyNkZWZpbmUgR0lHQVNFVF9CUktDSEFSUyBfSU9XKEdJR0FTRVRfSU9DVEwsIDIsIHVuc2lnbmVkIGNoYXJbNl0pCisKKy8qIGdldCB2ZXJzaW9uIGluZm9ybWF0aW9uIHNlbGVjdGVkIGJ5IGFyZ1swXSAqLworI2RlZmluZSBHSUdBU0VUX1ZFUlNJT04gIF9JT1dSKEdJR0FTRVRfSU9DVEwsIDMsIHVuc2lnbmVkWzRdKQorLyogdmFsdWVzIGZvciBHSUdBU0VUX1ZFUlNJT04gYXJnWzBdICovCisjZGVmaW5lIEdJR1ZFUl9EUklWRVIgMAkJLyogZ2V0IGRyaXZlciB2ZXJzaW9uICovCisjZGVmaW5lIEdJR1ZFUl9DT01QQVQgMQkJLyogZ2V0IGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHZlcnNpb24gKi8KKyNkZWZpbmUgR0lHVkVSX0ZXQkFTRSAyCQkvKiBnZXQgYmFzZSBzdGF0aW9uIGZpcm13YXJlIHZlcnNpb24gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hkbGMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGRsYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZTQ4NGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hkbGMuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogR2VuZXJpYyBIRExDIHN1cHBvcnQgcm91dGluZXMgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19IRExDX0gKKyNkZWZpbmUgX19IRExDX0gKKworCisjZGVmaW5lIEhETENfTUFYX01UVSAxNTAwCS8qIEV0aGVybmV0IDE1MDAgYnl0ZXMgKi8KKyNpZiAwCisjZGVmaW5lIEhETENfTUFYX01SVSAoSERMQ19NQVhfTVRVICsgMTAgKyAxNCArIDQpIC8qIGZvciBFVEgrVkxBTiBvdmVyIEZSICovCisjZWxzZQorI2RlZmluZSBIRExDX01BWF9NUlUgMTYwMCAvKiBhcyByZXF1aXJlZCBmb3IgRlIgbmV0d29yayAqLworI2VuZGlmCisKKworI2VuZGlmIC8qIF9fSERMQ19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hkbGMvaW9jdGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGRsYy9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Mzk3MjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hkbGMvaW9jdGwuaApAQCAtMCwwICsxLDgxIEBACisjaWZuZGVmIF9fSERMQ19JT0NUTF9IX18KKyNkZWZpbmUgX19IRExDX0lPQ1RMX0hfXworCisKKyNkZWZpbmUgR0VORVJJQ19IRExDX1ZFUlNJT04gNAkvKiBGb3Igc3luY2hyb25pemF0aW9uIHdpdGggc2V0aGRsYyB1dGlsaXR5ICovCisKKyNkZWZpbmUgQ0xPQ0tfREVGQVVMVCAgIDAJLyogRGVmYXVsdCBzZXR0aW5nICovCisjZGVmaW5lIENMT0NLX0VYVAkxCS8qIEV4dGVybmFsIFRYIGFuZCBSWCBjbG9jayAtIERURSAqLworI2RlZmluZSBDTE9DS19JTlQJMgkvKiBJbnRlcm5hbCBUWCBhbmQgUlggY2xvY2sgLSBEQ0UgKi8KKyNkZWZpbmUgQ0xPQ0tfVFhJTlQJMwkvKiBJbnRlcm5hbCBUWCBhbmQgZXh0ZXJuYWwgUlggY2xvY2sgKi8KKyNkZWZpbmUgQ0xPQ0tfVFhGUk9NUlgJNAkvKiBUWCBjbG9jayBkZXJpdmVkIGZyb20gZXh0ZXJuYWwgUlggY2xvY2sgKi8KKworCisjZGVmaW5lIEVOQ09ESU5HX0RFRkFVTFQJMCAvKiBEZWZhdWx0IHNldHRpbmcgKi8KKyNkZWZpbmUgRU5DT0RJTkdfTlJaCQkxCisjZGVmaW5lIEVOQ09ESU5HX05SWkkJCTIKKyNkZWZpbmUgRU5DT0RJTkdfRk1fTUFSSwkzCisjZGVmaW5lIEVOQ09ESU5HX0ZNX1NQQUNFCTQKKyNkZWZpbmUgRU5DT0RJTkdfTUFOQ0hFU1RFUgk1CisKKworI2RlZmluZSBQQVJJVFlfREVGQVVMVAkJMCAvKiBEZWZhdWx0IHNldHRpbmcgKi8KKyNkZWZpbmUgUEFSSVRZX05PTkUJCTEgLyogTm8gcGFyaXR5ICovCisjZGVmaW5lIFBBUklUWV9DUkMxNl9QUjAJMiAvKiBDUkMxNiwgaW5pdGlhbCB2YWx1ZSAweDAwMDAgKi8KKyNkZWZpbmUgUEFSSVRZX0NSQzE2X1BSMQkzIC8qIENSQzE2LCBpbml0aWFsIHZhbHVlIDB4RkZGRiAqLworI2RlZmluZSBQQVJJVFlfQ1JDMTZfUFIwX0NDSVRUCTQgLyogQ1JDMTYsIGluaXRpYWwgMHgwMDAwLCBJVFUtVCB2ZXJzaW9uICovCisjZGVmaW5lIFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQJNSAvKiBDUkMxNiwgaW5pdGlhbCAweEZGRkYsIElUVS1UIHZlcnNpb24gKi8KKyNkZWZpbmUgUEFSSVRZX0NSQzMyX1BSMF9DQ0lUVAk2IC8qIENSQzMyLCBpbml0aWFsIHZhbHVlIDB4MDAwMDAwMDAgKi8KKyNkZWZpbmUgUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVAk3IC8qIENSQzMyLCBpbml0aWFsIHZhbHVlIDB4RkZGRkZGRkYgKi8KKworI2RlZmluZSBMTUlfREVGQVVMVAkJMCAvKiBEZWZhdWx0IHNldHRpbmcgKi8KKyNkZWZpbmUgTE1JX05PTkUJCTEgLyogTm8gTE1JLCBhbGwgUFZDcyBhcmUgc3RhdGljICovCisjZGVmaW5lIExNSV9BTlNJCQkyIC8qIEFOU0kgQW5uZXggRCAqLworI2RlZmluZSBMTUlfQ0NJVFQJCTMgLyogSVRVLVQgQW5uZXggQSAqLworI2RlZmluZSBMTUlfQ0lTQ08JCTQgLyogVGhlICJvcmlnaW5hbCIgTE1JLCBha2EgR2FuZyBvZiBGb3VyICovCisKK3R5cGVkZWYgc3RydWN0IHsgCisJdW5zaWduZWQgaW50IGNsb2NrX3JhdGU7IC8qIGJpdHMgcGVyIHNlY29uZCAqLworCXVuc2lnbmVkIGludCBjbG9ja190eXBlOyAvKiBpbnRlcm5hbCwgZXh0ZXJuYWwsIFRYLWludGVybmFsIGV0Yy4gKi8KKwl1bnNpZ25lZCBzaG9ydCBsb29wYmFjazsKK30gc3luY19zZXJpYWxfc2V0dGluZ3M7ICAgICAgICAgIC8qIFYuMzUsIFYuMjQsIFguMjEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAKKwl1bnNpZ25lZCBpbnQgY2xvY2tfcmF0ZTsgLyogYml0cyBwZXIgc2Vjb25kICovCisJdW5zaWduZWQgaW50IGNsb2NrX3R5cGU7IC8qIGludGVybmFsLCBleHRlcm5hbCwgVFgtaW50ZXJuYWwgZXRjLiAqLworCXVuc2lnbmVkIHNob3J0IGxvb3BiYWNrOworCXVuc2lnbmVkIGludCBzbG90X21hcDsKK30gdGUxX3NldHRpbmdzOyAgICAgICAgICAgICAgICAgIC8qIFQxLCBFMSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgZW5jb2Rpbmc7CisJdW5zaWduZWQgc2hvcnQgcGFyaXR5OworfSByYXdfaGRsY19wcm90bzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCB0MzkxOworCXVuc2lnbmVkIGludCB0MzkyOworCXVuc2lnbmVkIGludCBuMzkxOworCXVuc2lnbmVkIGludCBuMzkyOworCXVuc2lnbmVkIGludCBuMzkzOworCXVuc2lnbmVkIHNob3J0IGxtaTsKKwl1bnNpZ25lZCBzaG9ydCBkY2U7IC8qIDEgZm9yIERDRSAobmV0d29yayBzaWRlKSBvcGVyYXRpb24gKi8KK30gZnJfcHJvdG87CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgZGxjaTsKK30gZnJfcHJvdG9fcHZjOyAgICAgICAgICAvKiBmb3IgY3JlYXRpbmcvZGVsZXRpbmcgRlIgUFZDcyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGRsY2k7CisJY2hhciBtYXN0ZXJbSUZOQU1TSVpdOwkvKiBOYW1lIG9mIG1hc3RlciBGUkFEIGRldmljZSAqLworfWZyX3Byb3RvX3B2Y19pbmZvOwkJLyogZm9yIHJldHVybmluZyBQVkMgaW5mb3JtYXRpb24gb25seSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IGludGVydmFsOworICAgIHVuc2lnbmVkIGludCB0aW1lb3V0OworfSBjaXNjb19wcm90bzsKKworLyogUFBQIGRvZXNuJ3QgbmVlZCBhbnkgaW5mbyBub3cgLSBzdXBwbHkgbGVuZ3RoID0gMCB0byBpb2N0bCAqLworCisjZW5kaWYgLyogX19IRExDX0lPQ1RMX0hfXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZGxjZHJ2LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hkbGNkcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjJkOTY1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZGxjZHJ2LmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBoZGxjZHJ2LmggIC0tIEhETEMgcGFja2V0IHJhZGlvIG5ldHdvcmsgZHJpdmVyLgorICogVGhlIExpbnV4IHNvdW5kY2FyZCBkcml2ZXIgZm9yIDEyMDAgYmF1ZCBhbmQgOTYwMCBiYXVkIHBhY2tldCByYWRpbworICogKEMpIDE5OTYtMTk5OCBieSBUaG9tYXMgU2FpbGVyLCBIQjlKTlgvQUU0V0EKKyAqLworCisjaWZuZGVmIF9IRExDRFJWX0gKKyNkZWZpbmUgX0hETENEUlZfSAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIHN0cnVjdHMgZm9yIHRoZSBJT0NUTCBjb21tYW5kcworICovCisKK3N0cnVjdCBoZGxjZHJ2X3BhcmFtcyB7CisJaW50IGlvYmFzZTsKKwlpbnQgaXJxOworCWludCBkbWE7CisJaW50IGRtYTI7CisJaW50IHNlcmlvYmFzZTsKKwlpbnQgcGFyaW9iYXNlOworCWludCBtaWRpaW9iYXNlOworfTsJCisKK3N0cnVjdCBoZGxjZHJ2X2NoYW5uZWxfcGFyYW1zIHsKKwlpbnQgdHhfZGVsYXk7ICAvKiB0aGUgdHJhbnNtaXR0ZXIga2V5dXAgZGVsYXkgaW4gMTBtcyB1bml0cyAqLworCWludCB0eF90YWlsOyAgIC8qIHRoZSB0cmFuc21pdHRlciBrZXlvZmYgZGVsYXkgaW4gMTBtcyB1bml0cyAqLworCWludCBzbG90dGltZTsgIC8qIHRoZSBzbG90dGltZSBpbiAxMG1zOyB1c3VhbGx5IDEwID0gMTAwbXMgKi8KKwlpbnQgcHBlcnNpc3Q7ICAvKiB0aGUgcC1wZXJzaXN0ZW5jZSAwLi4yNTUgKi8KKwlpbnQgZnVsbGR1cDsgICAvKiBzb21lIGRyaXZlciBkbyBub3Qgc3VwcG9ydCBmdWxsIGR1cGxleCwgc2V0dGluZyAqLworCSAgICAgICAgICAgICAgIC8qIHRoaXMganVzdCBtYWtlcyB0aGVtIHNlbmQgZXZlbiBpZiBEQ0QgaXMgb24gKi8KK307CQorCitzdHJ1Y3QgaGRsY2Rydl9vbGRfY2hhbm5lbF9zdGF0ZSB7CisgIAlpbnQgcHR0OworICAJaW50IGRjZDsKKyAgCWludCBwdHRfa2V5ZWQ7Cit9OworCitzdHJ1Y3QgaGRsY2Rydl9jaGFubmVsX3N0YXRlIHsKKyAJaW50IHB0dDsKKyAJaW50IGRjZDsKKyAJaW50IHB0dF9rZXllZDsKKyAJdW5zaWduZWQgbG9uZyB0eF9wYWNrZXRzOworIAl1bnNpZ25lZCBsb25nIHR4X2Vycm9yczsKKyAJdW5zaWduZWQgbG9uZyByeF9wYWNrZXRzOworIAl1bnNpZ25lZCBsb25nIHJ4X2Vycm9yczsKK307CisKK3N0cnVjdCBoZGxjZHJ2X2lvY3RsIHsKKwlpbnQgY21kOworCXVuaW9uIHsKKwkJc3RydWN0IGhkbGNkcnZfcGFyYW1zIG1wOworCQlzdHJ1Y3QgaGRsY2Rydl9jaGFubmVsX3BhcmFtcyBjcDsKKwkJc3RydWN0IGhkbGNkcnZfY2hhbm5lbF9zdGF0ZSBjczsKKwkJc3RydWN0IGhkbGNkcnZfb2xkX2NoYW5uZWxfc3RhdGUgb2NzOworCQl1bnNpZ25lZCBpbnQgY2FsaWJyYXRlOworCQl1bnNpZ25lZCBjaGFyIGJpdHM7CisJCWNoYXIgbW9kZW5hbWVbMTI4XTsKKwkJY2hhciBkcml2ZXJuYW1lWzMyXTsKKwl9IGRhdGE7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogaW9jdGwgdmFsdWVzCisgKi8KKyNkZWZpbmUgSERMQ0RSVkNUTF9HRVRNT0RFTVBBUiAgICAgICAwCisjZGVmaW5lIEhETENEUlZDVExfU0VUTU9ERU1QQVIgICAgICAgMQorI2RlZmluZSBIRExDRFJWQ1RMX01PREVNUEFSTUFTSyAgICAgIDIgIC8qIG5vdCBoYW5kbGVkIGJ5IGhkbGNkcnYgKi8KKyNkZWZpbmUgSERMQ0RSVkNUTF9HRVRDSEFOTkVMUEFSICAgIDEwCisjZGVmaW5lIEhETENEUlZDVExfU0VUQ0hBTk5FTFBBUiAgICAxMQorI2RlZmluZSBIRExDRFJWQ1RMX09MREdFVFNUQVQgICAgICAgMjAKKyNkZWZpbmUgSERMQ0RSVkNUTF9DQUxJQlJBVEUgICAgICAgIDIxCisjZGVmaW5lIEhETENEUlZDVExfR0VUU1RBVCAgICAgICAgICAyMgorCisvKgorICogdGhlc2UgYXJlIG1haW5seSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCisgKi8KKyNkZWZpbmUgSERMQ0RSVkNUTF9HRVRTQU1QTEVTICAgICAgIDMwCisjZGVmaW5lIEhETENEUlZDVExfR0VUQklUUyAgICAgICAgICAzMQorCisvKgorICogbm90IGhhbmRsZWQgYnkgaGRsY2RydiwgYnV0IGJ5IGl0cyBkZXBlbmRpbmcgZHJpdmVycworICovCisjZGVmaW5lIEhETENEUlZDVExfR0VUTU9ERSAgICAgICAgICA0MAorI2RlZmluZSBIRExDRFJWQ1RMX1NFVE1PREUgICAgICAgICAgNDEKKyNkZWZpbmUgSERMQ0RSVkNUTF9NT0RFTElTVCAgICAgICAgIDQyCisjZGVmaW5lIEhETENEUlZDVExfRFJJVkVSTkFNRSAgICAgICA0MworCisvKgorICogbWFzayBvZiBuZWVkZWQgbW9kZW0gcGFyYW1ldGVycywgcmV0dXJuZWQgYnkgSERMQ0RSVkNUTF9NT0RFTVBBUk1BU0sKKyAqLworI2RlZmluZSBIRExDRFJWX1BBUk1BU0tfSU9CQVNFICAgICAgKDE8PDApCisjZGVmaW5lIEhETENEUlZfUEFSTUFTS19JUlEgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgSERMQ0RSVl9QQVJNQVNLX0RNQSAgICAgICAgICgxPDwyKQorI2RlZmluZSBIRExDRFJWX1BBUk1BU0tfRE1BMiAgICAgICAgKDE8PDMpCisjZGVmaW5lIEhETENEUlZfUEFSTUFTS19TRVJJT0JBU0UgICAoMTw8NCkKKyNkZWZpbmUgSERMQ0RSVl9QQVJNQVNLX1BBUklPQkFTRSAgICgxPDw1KQorI2RlZmluZSBIRExDRFJWX1BBUk1BU0tfTUlESUlPQkFTRSAgKDE8PDYpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2VuZGlmIC8qIF9IRExDRFJWX0ggKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGRyZWcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGRyZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzQxNzNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZHJlZy5oCkBAIC0wLDAgKzEsNjQyIEBACisjaWZuZGVmIF9MSU5VWF9IRFJFR19ICisjZGVmaW5lIF9MSU5VWF9IRFJFR19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogQ29tbWFuZCBIZWFkZXIgc2l6ZXMgZm9yIElPQ1RMIGNvbW1hbmRzCisgKi8KKworI2RlZmluZSBIRElPX0RSSVZFX0NNRF9IRFJfU0laRQkJKDQgKiBzaXplb2YoX191OCkpCisjZGVmaW5lIEhESU9fRFJJVkVfSE9CX0hEUl9TSVpFCQkoOCAqIHNpemVvZihfX3U4KSkKKyNkZWZpbmUgSERJT19EUklWRV9UQVNLX0hEUl9TSVpFCSg4ICogc2l6ZW9mKF9fdTgpKQorCisjZGVmaW5lIElERV9EUklWRV9UQVNLX05PX0RBVEEJCTAKKyNkZWZpbmUgSURFX0RSSVZFX1RBU0tfSU5WQUxJRAkJLTEKKyNkZWZpbmUgSURFX0RSSVZFX1RBU0tfU0VUX1hGRVIJCTEKKyNkZWZpbmUgSURFX0RSSVZFX1RBU0tfSU4JCTIKKyNkZWZpbmUgSURFX0RSSVZFX1RBU0tfT1VUCQkzCisjZGVmaW5lIElERV9EUklWRV9UQVNLX1JBV19XUklURQk0CisKKy8qCisgKiBEZWZpbmUgc3RhbmRhcmQgdGFza2ZpbGUgaW4vb3V0IHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgSURFX1RBU0tGSUxFX1NURF9JTl9GTEFHUwkweEZFCisjZGVmaW5lIElERV9IT0JfU1REX0lOX0ZMQUdTCQkweDNDCisjZGVmaW5lIElERV9UQVNLRklMRV9TVERfT1VUX0ZMQUdTCTB4RkUKKyNkZWZpbmUgSURFX0hPQl9TVERfT1VUX0ZMQUdTCQkweDNDCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB0YXNrX2lvcmVnX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc2F0YV9pb3JlZ190OworCit0eXBlZGVmIHVuaW9uIGlkZV9yZWdfdmFsaWRfcyB7CisJdW5zaWduZWQgYWxsCQkJCTogMTY7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgZGF0YQkJCTogMTsKKwkJdW5zaWduZWQgZXJyb3JfZmVhdHVyZQkJOiAxOworCQl1bnNpZ25lZCBzZWN0b3IJCQk6IDE7CisJCXVuc2lnbmVkIG5zZWN0b3IJCTogMTsKKwkJdW5zaWduZWQgbGN5bAkJCTogMTsKKwkJdW5zaWduZWQgaGN5bAkJCTogMTsKKwkJdW5zaWduZWQgc2VsZWN0CQkJOiAxOworCQl1bnNpZ25lZCBzdGF0dXNfY29tbWFuZAkJOiAxOworCisJCXVuc2lnbmVkIGRhdGFfaG9iCQk6IDE7CisJCXVuc2lnbmVkIGVycm9yX2ZlYXR1cmVfaG9iCTogMTsKKwkJdW5zaWduZWQgc2VjdG9yX2hvYgkJOiAxOworCQl1bnNpZ25lZCBuc2VjdG9yX2hvYgkJOiAxOworCQl1bnNpZ25lZCBsY3lsX2hvYgkJOiAxOworCQl1bnNpZ25lZCBoY3lsX2hvYgkJOiAxOworCQl1bnNpZ25lZCBzZWxlY3RfaG9iCQk6IDE7CisJCXVuc2lnbmVkIGNvbnRyb2xfaG9iCQk6IDE7CisJfSBiOworfSBpZGVfcmVnX3ZhbGlkX3Q7CisKK3R5cGVkZWYgc3RydWN0IGlkZV90YXNrX3JlcXVlc3RfcyB7CisJX191OAkJaW9fcG9ydHNbOF07CisJX191OAkJaG9iX3BvcnRzWzhdOyAvKiBieXRlcyA2IGFuZCA3IGFyZSB1bnVzZWQgKi8KKwlpZGVfcmVnX3ZhbGlkX3QJb3V0X2ZsYWdzOworCWlkZV9yZWdfdmFsaWRfdAlpbl9mbGFnczsKKwlpbnQJCWRhdGFfcGhhc2U7CisJaW50CQlyZXFfY21kOworCXVuc2lnbmVkIGxvbmcJb3V0X3NpemU7CisJdW5zaWduZWQgbG9uZwlpbl9zaXplOworfSBpZGVfdGFza19yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGlkZV9pb2N0bF9yZXF1ZXN0X3MgeworCWlkZV90YXNrX3JlcXVlc3RfdAkqdGFza19yZXF1ZXN0OworCXVuc2lnbmVkIGNoYXIJCSpvdXRfYnVmZmVyOworCXVuc2lnbmVkIGNoYXIJCSppbl9idWZmZXI7Cit9IGlkZV9pb2N0bF9yZXF1ZXN0X3Q7CisKK3N0cnVjdCBoZF9kcml2ZV9jbWRfaGRyIHsKKwlfX3U4IGNvbW1hbmQ7CisJX191OCBzZWN0b3JfbnVtYmVyOworCV9fdTggZmVhdHVyZTsKKwlfX3U4IHNlY3Rvcl9jb3VudDsKK307CisKK3R5cGVkZWYgc3RydWN0IGhkX2RyaXZlX3Rhc2tfaGRyIHsKKwlfX3U4IGRhdGE7CisJX191OCBmZWF0dXJlOworCV9fdTggc2VjdG9yX2NvdW50OworCV9fdTggc2VjdG9yX251bWJlcjsKKwlfX3U4IGxvd19jeWxpbmRlcjsKKwlfX3U4IGhpZ2hfY3lsaW5kZXI7CisJX191OCBkZXZpY2VfaGVhZDsKKwlfX3U4IGNvbW1hbmQ7Cit9IHRhc2tfc3RydWN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGhkX2RyaXZlX2hvYl9oZHIgeworCV9fdTggZGF0YTsKKwlfX3U4IGZlYXR1cmU7CisJX191OCBzZWN0b3JfY291bnQ7CisJX191OCBzZWN0b3JfbnVtYmVyOworCV9fdTggbG93X2N5bGluZGVyOworCV9fdTggaGlnaF9jeWxpbmRlcjsKKwlfX3U4IGRldmljZV9oZWFkOworCV9fdTggY29udHJvbDsKK30gaG9iX3N0cnVjdF90OworCisjZGVmaW5lIFRBU0tGSUxFX05PX0RBVEEJCTB4MDAwMAorCisjZGVmaW5lIFRBU0tGSUxFX0lOCQkJMHgwMDAxCisjZGVmaW5lIFRBU0tGSUxFX01VTFRJX0lOCQkweDAwMDIKKworI2RlZmluZSBUQVNLRklMRV9PVVQJCQkweDAwMDQKKyNkZWZpbmUgVEFTS0ZJTEVfTVVMVElfT1VUCQkweDAwMDgKKyNkZWZpbmUgVEFTS0ZJTEVfSU5fT1VUCQkJMHgwMDEwCisKKyNkZWZpbmUgVEFTS0ZJTEVfSU5fRE1BCQkJMHgwMDIwCisjZGVmaW5lIFRBU0tGSUxFX09VVF9ETUEJCTB4MDA0MAorI2RlZmluZSBUQVNLRklMRV9JTl9ETUFRCQkweDAwODAKKyNkZWZpbmUgVEFTS0ZJTEVfT1VUX0RNQVEJCTB4MDEwMAorCisjZGVmaW5lIFRBU0tGSUxFX1BfSU4JCQkweDAyMDAKKyNkZWZpbmUgVEFTS0ZJTEVfUF9PVVQJCQkweDA0MDAKKyNkZWZpbmUgVEFTS0ZJTEVfUF9JTl9ETUEJCTB4MDgwMAorI2RlZmluZSBUQVNLRklMRV9QX09VVF9ETUEJCTB4MTAwMAorI2RlZmluZSBUQVNLRklMRV9QX0lOX0RNQVEJCTB4MjAwMAorI2RlZmluZSBUQVNLRklMRV9QX09VVF9ETUFRCQkweDQwMDAKKyNkZWZpbmUgVEFTS0ZJTEVfNDgJCQkweDgwMDAKKyNkZWZpbmUgVEFTS0ZJTEVfSU5WQUxJRAkJMHg3ZmZmCisKKy8qIEFUQS9BVEFQSSBDb21tYW5kcyBwcmUgVDEzIFNwZWMgKi8KKyNkZWZpbmUgV0lOX05PUAkJCQkweDAwCisvKgorICoJMHgwMS0+MHgwMiBSZXNlcnZlZAorICovCisjZGVmaW5lIENGQV9SRVFfRVhUX0VSUk9SX0NPREUJCTB4MDMgLyogQ0ZBIFJlcXVlc3QgRXh0ZW5kZWQgRXJyb3IgQ29kZSAqLworLyoKKyAqCTB4MDQtPjB4MDcgUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBXSU5fU1JTVAkJCTB4MDggLyogQVRBUEkgc29mdCByZXNldCBjb21tYW5kICovCisjZGVmaW5lIFdJTl9ERVZJQ0VfUkVTRVQJCTB4MDgKKy8qCisgKgkweDA5LT4weDBGIFJlc2VydmVkCisgKi8KKyNkZWZpbmUgV0lOX1JFQ0FMCQkJMHgxMAorI2RlZmluZSBXSU5fUkVTVE9SRQkJCVdJTl9SRUNBTAorLyoKKyAqCTB4MTAtPjB4MUYgUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBXSU5fUkVBRAkJCTB4MjAgLyogMjgtQml0ICovCisjZGVmaW5lIFdJTl9SRUFEX09OQ0UJCQkweDIxIC8qIDI4LUJpdCB3aXRob3V0IHJldHJpZXMgKi8KKyNkZWZpbmUgV0lOX1JFQURfTE9ORwkJCTB4MjIgLyogMjgtQml0ICovCisjZGVmaW5lIFdJTl9SRUFEX0xPTkdfT05DRQkJMHgyMyAvKiAyOC1CaXQgd2l0aG91dCByZXRyaWVzICovCisjZGVmaW5lIFdJTl9SRUFEX0VYVAkJCTB4MjQgLyogNDgtQml0ICovCisjZGVmaW5lIFdJTl9SRUFERE1BX0VYVAkJCTB4MjUgLyogNDgtQml0ICovCisjZGVmaW5lIFdJTl9SRUFERE1BX1FVRVVFRF9FWFQJCTB4MjYgLyogNDgtQml0ICovCisjZGVmaW5lIFdJTl9SRUFEX05BVElWRV9NQVhfRVhUCQkweDI3IC8qIDQ4LUJpdCAqLworLyoKKyAqCTB4MjgKKyAqLworI2RlZmluZSBXSU5fTVVMVFJFQURfRVhUCQkweDI5IC8qIDQ4LUJpdCAqLworLyoKKyAqCTB4MkEtPjB4MkYgUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBXSU5fV1JJVEUJCQkweDMwIC8qIDI4LUJpdCAqLworI2RlZmluZSBXSU5fV1JJVEVfT05DRQkJCTB4MzEgLyogMjgtQml0IHdpdGhvdXQgcmV0cmllcyAqLworI2RlZmluZSBXSU5fV1JJVEVfTE9ORwkJCTB4MzIgLyogMjgtQml0ICovCisjZGVmaW5lIFdJTl9XUklURV9MT05HX09OQ0UJCTB4MzMgLyogMjgtQml0IHdpdGhvdXQgcmV0cmllcyAqLworI2RlZmluZSBXSU5fV1JJVEVfRVhUCQkJMHgzNCAvKiA0OC1CaXQgKi8KKyNkZWZpbmUgV0lOX1dSSVRFRE1BX0VYVAkJMHgzNSAvKiA0OC1CaXQgKi8KKyNkZWZpbmUgV0lOX1dSSVRFRE1BX1FVRVVFRF9FWFQJCTB4MzYgLyogNDgtQml0ICovCisjZGVmaW5lIFdJTl9TRVRfTUFYX0VYVAkJCTB4MzcgLyogNDgtQml0ICovCisjZGVmaW5lIENGQV9XUklURV9TRUNUX1dPX0VSQVNFCQkweDM4IC8qIENGQSBXcml0ZSBTZWN0b3JzIHdpdGhvdXQgZXJhc2UgKi8KKyNkZWZpbmUgV0lOX01VTFRXUklURV9FWFQJCTB4MzkgLyogNDgtQml0ICovCisvKgorICoJMHgzQS0+MHgzQiBSZXNlcnZlZAorICovCisjZGVmaW5lIFdJTl9XUklURV9WRVJJRlkJCTB4M0MgLyogMjgtQml0ICovCisvKgorICoJMHgzRC0+MHgzRiBSZXNlcnZlZAorICovCisjZGVmaW5lIFdJTl9WRVJJRlkJCQkweDQwIC8qIDI4LUJpdCAtIFJlYWQgVmVyaWZ5IFNlY3RvcnMgKi8KKyNkZWZpbmUgV0lOX1ZFUklGWV9PTkNFCQkJMHg0MSAvKiAyOC1CaXQgLSB3aXRob3V0IHJldHJpZXMgKi8KKyNkZWZpbmUgV0lOX1ZFUklGWV9FWFQJCQkweDQyIC8qIDQ4LUJpdCAqLworLyoKKyAqCTB4NDMtPjB4NEYgUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBXSU5fRk9STUFUCQkJMHg1MAorLyoKKyAqCTB4NTEtPjB4NUYgUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBXSU5fSU5JVAkJCTB4NjAKKy8qCisgKgkweDYxLT4weDVGIFJlc2VydmVkCisgKi8KKyNkZWZpbmUgV0lOX1NFRUsJCQkweDcwIC8qIDB4NzAtMHg3RiBSZXNlcnZlZCAqLworCisjZGVmaW5lIENGQV9UUkFOU0xBVEVfU0VDVE9SCQkweDg3IC8qIENGQSBUcmFuc2xhdGUgU2VjdG9yICovCisjZGVmaW5lIFdJTl9ESUFHTk9TRQkJCTB4OTAKKyNkZWZpbmUgV0lOX1NQRUNJRlkJCQkweDkxIC8qIHNldCBkcml2ZSBnZW9tZXRyeSB0cmFuc2xhdGlvbiAqLworI2RlZmluZSBXSU5fRE9XTkxPQURfTUlDUk9DT0RFCQkweDkyCisjZGVmaW5lIFdJTl9TVEFOREJZTk9XMgkJCTB4OTQKKyNkZWZpbmUgV0lOX1NUQU5EQlkyCQkJMHg5NgorI2RlZmluZSBXSU5fU0VUSURMRTIJCQkweDk3CisjZGVmaW5lIFdJTl9DSEVDS1BPV0VSTU9ERTIJCTB4OTgKKyNkZWZpbmUgV0lOX1NMRUVQTk9XMgkJCTB4OTkKKy8qCisgKgkweDlBIFZFTkRPUgorICovCisjZGVmaW5lIFdJTl9QQUNLRVRDTUQJCQkweEEwIC8qIFNlbmQgYSBwYWNrZXQgY29tbWFuZC4gKi8KKyNkZWZpbmUgV0lOX1BJREVOVElGWQkJCTB4QTEgLyogaWRlbnRpZnkgQVRBUEkgZGV2aWNlCSovCisjZGVmaW5lIFdJTl9RVUVVRURfU0VSVklDRQkJMHhBMgorI2RlZmluZSBXSU5fU01BUlQJCQkweEIwIC8qIHNlbGYtbW9uaXRvcmluZyBhbmQgcmVwb3J0aW5nICovCisjZGVmaW5lIENGQV9FUkFTRV9TRUNUT1JTCQkweEMwCisjZGVmaW5lIFdJTl9NVUxUUkVBRAkJCTB4QzQgLyogcmVhZCBzZWN0b3JzIHVzaW5nIG11bHRpcGxlIG1vZGUqLworI2RlZmluZSBXSU5fTVVMVFdSSVRFCQkJMHhDNSAvKiB3cml0ZSBzZWN0b3JzIHVzaW5nIG11bHRpcGxlIG1vZGUgKi8KKyNkZWZpbmUgV0lOX1NFVE1VTFQJCQkweEM2IC8qIGVuYWJsZS9kaXNhYmxlIG11bHRpcGxlIG1vZGUgKi8KKyNkZWZpbmUgV0lOX1JFQURETUFfUVVFVUVECQkweEM3IC8qIHJlYWQgc2VjdG9ycyB1c2luZyBRdWV1ZWQgRE1BIHRyYW5zZmVycyAqLworI2RlZmluZSBXSU5fUkVBRERNQQkJCTB4QzggLyogcmVhZCBzZWN0b3JzIHVzaW5nIERNQSB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgV0lOX1JFQURETUFfT05DRQkJMHhDOSAvKiAyOC1CaXQgLSB3aXRob3V0IHJldHJpZXMgKi8KKyNkZWZpbmUgV0lOX1dSSVRFRE1BCQkJMHhDQSAvKiB3cml0ZSBzZWN0b3JzIHVzaW5nIERNQSB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgV0lOX1dSSVRFRE1BX09OQ0UJCTB4Q0IgLyogMjgtQml0IC0gd2l0aG91dCByZXRyaWVzICovCisjZGVmaW5lIFdJTl9XUklURURNQV9RVUVVRUQJCTB4Q0MgLyogd3JpdGUgc2VjdG9ycyB1c2luZyBRdWV1ZWQgRE1BIHRyYW5zZmVycyAqLworI2RlZmluZSBDRkFfV1JJVEVfTVVMVElfV09fRVJBU0UJMHhDRCAvKiBDRkEgV3JpdGUgbXVsdGlwbGUgd2l0aG91dCBlcmFzZSAqLworI2RlZmluZSBXSU5fR0VUTUVESUFTVEFUVVMJCTB4REEKKyNkZWZpbmUgV0lOX0FDS01FRElBQ0hBTkdFCQkweERCIC8qIEFUQS0xLCBBVEEtMiB2ZW5kb3IgKi8KKyNkZWZpbmUgV0lOX1BPU1RCT09UCQkJMHhEQworI2RlZmluZSBXSU5fUFJFQk9PVCAJCQkweERECisjZGVmaW5lIFdJTl9ET09STE9DSwkJCTB4REUgLyogbG9jayBkb29yIG9uIHJlbW92YWJsZSBkcml2ZXMgKi8KKyNkZWZpbmUgV0lOX0RPT1JVTkxPQ0sJCQkweERGIC8qIHVubG9jayBkb29yIG9uIHJlbW92YWJsZSBkcml2ZXMgKi8KKyNkZWZpbmUgV0lOX1NUQU5EQllOT1cxCQkJMHhFMAorI2RlZmluZSBXSU5fSURMRUlNTUVESUFURQkJMHhFMSAvKiBmb3JjZSBkcml2ZSB0byBiZWNvbWUgInJlYWR5IiAqLworI2RlZmluZSBXSU5fU1RBTkRCWQkJCTB4RTIgLyogU2V0IGRldmljZSBpbiBTdGFuZGJ5IE1vZGUgKi8KKyNkZWZpbmUgV0lOX1NFVElETEUxCQkJMHhFMworI2RlZmluZSBXSU5fUkVBRF9CVUZGRVIJCQkweEU0IC8qIGZvcmNlIHJlYWQgb25seSAxIHNlY3RvciAqLworI2RlZmluZSBXSU5fQ0hFQ0tQT1dFUk1PREUxCQkweEU1CisjZGVmaW5lIFdJTl9TTEVFUE5PVzEJCQkweEU2CisjZGVmaW5lIFdJTl9GTFVTSF9DQUNIRQkJCTB4RTcKKyNkZWZpbmUgV0lOX1dSSVRFX0JVRkZFUgkJMHhFOCAvKiBmb3JjZSB3cml0ZSBvbmx5IDEgc2VjdG9yICovCisjZGVmaW5lIFdJTl9XUklURV9TQU1FCQkJMHhFOSAvKiByZWFkIGF0YS0yIHRvIHVzZSAqLworCS8qIFNFVF9GRUFUVVJFUyAweDIyIG9yIDB4REQgKi8KKyNkZWZpbmUgV0lOX0ZMVVNIX0NBQ0hFX0VYVAkJMHhFQSAvKiA0OC1CaXQgKi8KKyNkZWZpbmUgV0lOX0lERU5USUZZCQkJMHhFQyAvKiBhc2sgZHJpdmUgdG8gaWRlbnRpZnkgaXRzZWxmCSovCisjZGVmaW5lIFdJTl9NRURJQUVKRUNUCQkJMHhFRAorI2RlZmluZSBXSU5fSURFTlRJRllfRE1BCQkweEVFIC8qIHNhbWUgYXMgV0lOX0lERU5USUZZLCBidXQgRE1BICovCisjZGVmaW5lIFdJTl9TRVRGRUFUVVJFUwkJCTB4RUYgLyogc2V0IHNwZWNpYWwgZHJpdmUgZmVhdHVyZXMgKi8KKyNkZWZpbmUgRVhBQllURV9FTkFCTEVfTkVTVAkJMHhGMAorI2RlZmluZSBXSU5fU0VDVVJJVFlfU0VUX1BBU1MJCTB4RjEKKyNkZWZpbmUgV0lOX1NFQ1VSSVRZX1VOTE9DSwkJMHhGMgorI2RlZmluZSBXSU5fU0VDVVJJVFlfRVJBU0VfUFJFUEFSRQkweEYzCisjZGVmaW5lIFdJTl9TRUNVUklUWV9FUkFTRV9VTklUCQkweEY0CisjZGVmaW5lIFdJTl9TRUNVUklUWV9GUkVFWkVfTE9DSwkweEY1CisjZGVmaW5lIFdJTl9TRUNVUklUWV9ESVNBQkxFCQkweEY2CisjZGVmaW5lIFdJTl9SRUFEX05BVElWRV9NQVgJCTB4RjggLyogcmV0dXJuIHRoZSBuYXRpdmUgbWF4aW11bSBhZGRyZXNzICovCisjZGVmaW5lIFdJTl9TRVRfTUFYCQkJMHhGOQorI2RlZmluZSBESVNBQkxFX1NFQUdBVEUJCQkweEZCCisKKy8qIFdJTl9TTUFSVCBzdWItY29tbWFuZHMgKi8KKworI2RlZmluZSBTTUFSVF9SRUFEX1ZBTFVFUwkJMHhEMAorI2RlZmluZSBTTUFSVF9SRUFEX1RIUkVTSE9MRFMJCTB4RDEKKyNkZWZpbmUgU01BUlRfQVVUT1NBVkUJCQkweEQyCisjZGVmaW5lIFNNQVJUX1NBVkUJCQkweEQzCisjZGVmaW5lIFNNQVJUX0lNTUVESUFURV9PRkZMSU5FCQkweEQ0CisjZGVmaW5lIFNNQVJUX1JFQURfTE9HX1NFQ1RPUgkJMHhENQorI2RlZmluZSBTTUFSVF9XUklURV9MT0dfU0VDVE9SCQkweEQ2CisjZGVmaW5lIFNNQVJUX1dSSVRFX1RIUkVTSE9MRFMJCTB4RDcKKyNkZWZpbmUgU01BUlRfRU5BQkxFCQkJMHhEOAorI2RlZmluZSBTTUFSVF9ESVNBQkxFCQkJMHhEOQorI2RlZmluZSBTTUFSVF9TVEFUVVMJCQkweERBCisjZGVmaW5lIFNNQVJUX0FVVE9fT0ZGTElORQkJMHhEQgorCisvKiBQYXNzd29yZCB1c2VkIGluIFRGNCAmIFRGNSBleGVjdXRpbmcgU01BUlQgY29tbWFuZHMgKi8KKworI2RlZmluZSBTTUFSVF9MQ1lMX1BBU1MJCQkweDRGCisjZGVmaW5lIFNNQVJUX0hDWUxfUEFTUwkJCTB4QzIKKworLyogV0lOX1NFVEZFQVRVUkVTIHN1Yi1jb21tYW5kcyAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl84QklUCTB4MDEJLyogRW5hYmxlIDgtQml0IFRyYW5zZmVycyAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9XQ0FDSEUJMHgwMgkvKiBFbmFibGUgd3JpdGUgY2FjaGUgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTX0RFRkVDVAkweDA0CS8qIERpc2FibGUgRGVmZWN0IE1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fQVBNCTB4MDUJLyogRW5hYmxlIGFkdmFuY2VkIHBvd2VyIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fU0FNRV9SCTB4MjIJLyogZm9yIGEgcmVnaW9uIEFUQS0xICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0RJU19NU04JMHgzMQkvKiBEaXNhYmxlIE1lZGlhIFN0YXR1cyBOb3RpZmljYXRpb24gKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTX1JFVFJZCTB4MzMJLyogRGlzYWJsZSBSZXRyeSAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9BQU0JMHg0MgkvKiBFbmFibGUgQXV0b21hdGljIEFjb3VzdGljIE1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfUldfTE9ORwkweDQ0CS8qIFNldCBMZW5ndGggb2YgVlMgYnl0ZXMgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfU0VUX0NBQ0hFCTB4NTQJLyogU2V0IENhY2hlIHNlZ21lbnRzIHRvIFNDIFJlZy4gVmFsICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0RJU19STEEJMHg1NQkvKiBEaXNhYmxlIHJlYWQgbG9vay1haGVhZCBmZWF0dXJlICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0VOX1JJCTB4NUQJLyogRW5hYmxlIHJlbGVhc2UgaW50ZXJydXB0ICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0VOX1NJCTB4NUUJLyogRW5hYmxlIFNFUlZJQ0UgaW50ZXJydXB0ICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0RJU19SUE9ECTB4NjYJLyogRGlzYWJsZSByZXZlcnRpbmcgdG8gcG93ZXIgb24gZGVmYXVsdHMgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTX0VDQwkweDc3CS8qIERpc2FibGUgRUNDIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTXzhCSVQJMHg4MQkvKiBEaXNhYmxlIDgtQml0IFRyYW5zZmVycyAqLworI2RlZmluZSBTRVRGRUFUVVJFU19ESVNfV0NBQ0hFCTB4ODIJLyogRGlzYWJsZSB3cml0ZSBjYWNoZSAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9ERUZFQ1QJMHg4NAkvKiBFbmFibGUgRGVmZWN0IE1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTX0FQTQkweDg1CS8qIERpc2FibGUgYWR2YW5jZWQgcG93ZXIgbWFuYWdlbWVudCAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9FQ0MJMHg4OAkvKiBFbmFibGUgRUNDIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fTVNOCTB4OTUJLyogRW5hYmxlIE1lZGlhIFN0YXR1cyBOb3RpZmljYXRpb24gKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fUkVUUlkJMHg5OQkvKiBFbmFibGUgUmV0cnkgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fUkxBCTB4QUEJLyogRW5hYmxlIHJlYWQgbG9vay1haGVhZCBmZWF0dXJlICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX1BSRUZFVENICTB4QUIJLyogU2V0cyBkcml2ZSBwcmVmZXRjaCB2YWx1ZSAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9SRVNUCTB4QUMJLyogQVRBLTEgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfNEJfUldfTE9ORwkweEJCCS8qIFNldCBMZW5ndGggb2YgNCBieXRlcyAqLworI2RlZmluZSBTRVRGRUFUVVJFU19ESVNfQUFNCTB4QzIJLyogRGlzYWJsZSBBdXRvbWF0aWMgQWNvdXN0aWMgTWFuYWdlbWVudCAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9SUE9ECTB4Q0MJLyogRW5hYmxlIHJldmVydGluZyB0byBwb3dlciBvbiBkZWZhdWx0cyAqLworI2RlZmluZSBTRVRGRUFUVVJFU19ESVNfUkkJMHhERAkvKiBEaXNhYmxlIHJlbGVhc2UgaW50ZXJydXB0IEFUQVBJICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0VOX1NBTUVfTQkweERECS8qIGZvciBhIGVudGlyZSBkZXZpY2UgQVRBLTEgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTX1NJCTB4REUJLyogRGlzYWJsZSBTRVJWSUNFIGludGVycnVwdCBBVEFQSSAqLworCisvKiBXSU5fU0VDVVJJVFkgc3ViLWNvbW1hbmRzICovCisKKyNkZWZpbmUgU0VDVVJJVFlfU0VUX1BBU1NXT1JECQkweEJBCisjZGVmaW5lIFNFQ1VSSVRZX1VOTE9DSwkJCTB4QkIKKyNkZWZpbmUgU0VDVVJJVFlfRVJBU0VfUFJFUEFSRQkJMHhCQworI2RlZmluZSBTRUNVUklUWV9FUkFTRV9VTklUCQkweEJECisjZGVmaW5lIFNFQ1VSSVRZX0ZSRUVaRV9MT0NLCQkweEJFCisjZGVmaW5lIFNFQ1VSSVRZX0RJU0FCTEVfUEFTU1dPUkQJMHhCRgorCitzdHJ1Y3QgaGRfZ2VvbWV0cnkgeworICAgICAgdW5zaWduZWQgY2hhciBoZWFkczsKKyAgICAgIHVuc2lnbmVkIGNoYXIgc2VjdG9yczsKKyAgICAgIHVuc2lnbmVkIHNob3J0IGN5bGluZGVyczsKKyAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQ7Cit9OworCisvKiBoZC9pZGUgY3RsJ3MgdGhhdCBwYXNzIChhcmcpIHB0cnMgdG8gdXNlciBzcGFjZSBhcmUgbnVtYmVyZWQgMHgwMzBuLzB4MDMxbiAqLworI2RlZmluZSBIRElPX0dFVEdFTwkJMHgwMzAxCS8qIGdldCBkZXZpY2UgZ2VvbWV0cnkgKi8KKyNkZWZpbmUgSERJT19HRVRfVU5NQVNLSU5UUgkweDAzMDIJLyogZ2V0IGN1cnJlbnQgdW5tYXNrIHNldHRpbmcgKi8KKyNkZWZpbmUgSERJT19HRVRfTVVMVENPVU5UCTB4MDMwNAkvKiBnZXQgY3VycmVudCBJREUgYmxvY2ttb2RlIHNldHRpbmcgKi8KKyNkZWZpbmUgSERJT19HRVRfUURNQQkJMHgwMzA1CS8qIGdldCB1c2UtcWRtYSBmbGFnICovCisKKyNkZWZpbmUgSERJT19TRVRfWEZFUgkJMHgwMzA2ICAvKiBzZXQgdHJhbnNmZXIgcmF0ZSB2aWEgcHJvYyAqLworCisjZGVmaW5lIEhESU9fT0JTT0xFVEVfSURFTlRJVFkJMHgwMzA3CS8qIE9CU09MRVRFLCBETyBOT1QgVVNFOiByZXR1cm5zIDE0MiBieXRlcyAqLworI2RlZmluZSBIRElPX0dFVF9LRUVQU0VUVElOR1MJMHgwMzA4CS8qIGdldCBrZWVwLXNldHRpbmdzLW9uLXJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgSERJT19HRVRfMzJCSVQJCTB4MDMwOQkvKiBnZXQgY3VycmVudCBpb18zMmJpdCBzZXR0aW5nICovCisjZGVmaW5lIEhESU9fR0VUX05PV0VSUgkJMHgwMzBhCS8qIGdldCBpZ25vcmUtd3JpdGUtZXJyb3IgZmxhZyAqLworI2RlZmluZSBIRElPX0dFVF9ETUEJCTB4MDMwYgkvKiBnZXQgdXNlLWRtYSBmbGFnICovCisjZGVmaW5lIEhESU9fR0VUX05JQ0UJCTB4MDMwYwkvKiBnZXQgbmljZSBmbGFncyAqLworI2RlZmluZSBIRElPX0dFVF9JREVOVElUWQkweDAzMGQJLyogZ2V0IElERSBpZGVudGlmaWNhdGlvbiBpbmZvICovCisjZGVmaW5lIEhESU9fR0VUX1dDQUNIRQkJMHgwMzBlCS8qIGdldCB3cml0ZSBjYWNoZSBtb2RlIG9ufG9mZiAqLworI2RlZmluZSBIRElPX0dFVF9BQ09VU1RJQwkweDAzMGYJLyogZ2V0IGFjb3VzdGljIHZhbHVlICovCisjZGVmaW5lCUhESU9fR0VUX0FERFJFU1MJMHgwMzEwCS8qICovCisKKyNkZWZpbmUgSERJT19HRVRfQlVTU1RBVEUJMHgwMzFhCS8qIGdldCB0aGUgYnVzIHN0YXRlIG9mIHRoZSBod2lmICovCisjZGVmaW5lIEhESU9fVFJJU1RBVEVfSFdJRgkweDAzMWIJLyogZXhlY3V0ZSBhIGNoYW5uZWwgdHJpc3RhdGUgKi8KKyNkZWZpbmUgSERJT19EUklWRV9SRVNFVAkweDAzMWMJLyogZXhlY3V0ZSBhIGRldmljZSByZXNldCAqLworI2RlZmluZSBIRElPX0RSSVZFX1RBU0tGSUxFCTB4MDMxZAkvKiBleGVjdXRlIHJhdyB0YXNrZmlsZSAqLworI2RlZmluZSBIRElPX0RSSVZFX1RBU0sJCTB4MDMxZQkvKiBleGVjdXRlIHRhc2sgYW5kIHNwZWNpYWwgZHJpdmUgY29tbWFuZCAqLworI2RlZmluZSBIRElPX0RSSVZFX0NNRAkJMHgwMzFmCS8qIGV4ZWN1dGUgYSBzcGVjaWFsIGRyaXZlIGNvbW1hbmQgKi8KKyNkZWZpbmUgSERJT19EUklWRV9DTURfQUVCCUhESU9fRFJJVkVfVEFTSworCisvKiBoZC9pZGUgY3RsJ3MgdGhhdCBwYXNzIChhcmcpIG5vbi1wdHIgdmFsdWVzIGFyZSBudW1iZXJlZCAweDAzMm4vMHgwMzNuICovCisjZGVmaW5lIEhESU9fU0VUX01VTFRDT1VOVAkweDAzMjEJLyogY2hhbmdlIElERSBibG9ja21vZGUgKi8KKyNkZWZpbmUgSERJT19TRVRfVU5NQVNLSU5UUgkweDAzMjIJLyogcGVybWl0IG90aGVyIGlycXMgZHVyaW5nIEkvTyAqLworI2RlZmluZSBIRElPX1NFVF9LRUVQU0VUVElOR1MJMHgwMzIzCS8qIGtlZXAgaW9jdGwgc2V0dGluZ3Mgb24gcmVzZXQgKi8KKyNkZWZpbmUgSERJT19TRVRfMzJCSVQJCTB4MDMyNAkvKiBjaGFuZ2UgaW9fMzJiaXQgZmxhZ3MgKi8KKyNkZWZpbmUgSERJT19TRVRfTk9XRVJSCQkweDAzMjUJLyogY2hhbmdlIGlnbm9yZS13cml0ZS1lcnJvciBmbGFnICovCisjZGVmaW5lIEhESU9fU0VUX0RNQQkJMHgwMzI2CS8qIGNoYW5nZSB1c2UtZG1hIGZsYWcgKi8KKyNkZWZpbmUgSERJT19TRVRfUElPX01PREUJMHgwMzI3CS8qIHJlY29uZmlnIGludGVyZmFjZSB0byBuZXcgc3BlZWQgKi8KKyNkZWZpbmUgSERJT19TQ0FOX0hXSUYJCTB4MDMyOAkvKiByZWdpc3RlciBhbmQgKHJlKXNjYW4gaW50ZXJmYWNlICovCisjZGVmaW5lIEhESU9fVU5SRUdJU1RFUl9IV0lGCTB4MDMyYSAgLyogdW5yZWdpc3RlciBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgSERJT19TRVRfTklDRQkJMHgwMzI5CS8qIHNldCBuaWNlIGZsYWdzICovCisjZGVmaW5lIEhESU9fU0VUX1dDQUNIRQkJMHgwMzJiCS8qIGNoYW5nZSB3cml0ZSBjYWNoZSBlbmFibGUtZGlzYWJsZSAqLworI2RlZmluZSBIRElPX1NFVF9BQ09VU1RJQwkweDAzMmMJLyogY2hhbmdlIGFjb3VzdGljIGJlaGF2aW9yICovCisjZGVmaW5lIEhESU9fU0VUX0JVU1NUQVRFCTB4MDMyZAkvKiBzZXQgdGhlIGJ1cyBzdGF0ZSBvZiB0aGUgaHdpZiAqLworI2RlZmluZSBIRElPX1NFVF9RRE1BCQkweDAzMmUJLyogY2hhbmdlIHVzZS1xZG1hIGZsYWcgKi8KKyNkZWZpbmUgSERJT19TRVRfQUREUkVTUwkweDAzMmYJLyogY2hhbmdlIGxiYSBhZGRyZXNzaW5nIG1vZGVzICovCisKKy8qIGJ1cyBzdGF0ZXMgKi8KK2VudW0geworCUJVU1NUQVRFX09GRiA9IDAsCisJQlVTU1RBVEVfT04sCisJQlVTU1RBVEVfVFJJU1RBVEUKK307CisKKy8qIGhkL2lkZSBjdGwncyB0aGF0IHBhc3MgKGFyZykgcHRycyB0byB1c2VyIHNwYWNlIGFyZSBudW1iZXJlZCAweDAzM24vMHgwMzNuICovCisvKiAweDMzMCBpcyByZXNlcnZlZCAtIHVzZWQgdG8gYmUgSERJT19HRVRHRU9fQklHICovCisvKiAweDMzMSBpcyByZXNlcnZlZCAtIHVzZWQgdG8gYmUgSERJT19HRVRHRU9fQklHX1JBVyAqLworLyogMHgzMzggaXMgcmVzZXJ2ZWQgLSB1c2VkIHRvIGJlIEhESU9fU0VUX0lERV9TQ1NJICovCisvKiAweDMzOSBpcyByZXNlcnZlZCAtIHVzZWQgdG8gYmUgSERJT19TRVRfU0NTSV9JREUgKi8KKworI2RlZmluZSBfX05FV19IRF9EUklWRV9JRAorCisvKgorICogU3RydWN0dXJlIHJldHVybmVkIGJ5IEhESU9fR0VUX0lERU5USVRZLCBhcyBwZXIgQU5TSSBOQ0lUUyBBVEE2IHJldi4xYiBzcGVjLgorICoKKyAqIElmIHlvdSBjaGFuZ2Ugc29tZXRoaW5nIGhlcmUsIHBsZWFzZSByZW1lbWJlciB0byB1cGRhdGUgZml4X2RyaXZlaWQoKSBpbgorICogaWRlL3Byb2JlLmMuCisgKi8KK3N0cnVjdCBoZF9kcml2ZWlkIHsKKwl1bnNpZ25lZCBzaG9ydAljb25maWc7CQkvKiBsb3RzIG9mIG9ic29sZXRlIGJpdCBmbGFncyAqLworCXVuc2lnbmVkIHNob3J0CWN5bHM7CQkvKiBPYnNvbGV0ZSwgInBoeXNpY2FsIiBjeWxzICovCisJdW5zaWduZWQgc2hvcnQJcmVzZXJ2ZWQyOwkvKiByZXNlcnZlZCAod29yZCAyKSAqLworCXVuc2lnbmVkIHNob3J0CWhlYWRzOwkJLyogT2Jzb2xldGUsICJwaHlzaWNhbCIgaGVhZHMgKi8KKwl1bnNpZ25lZCBzaG9ydAl0cmFja19ieXRlczsJLyogdW5mb3JtYXR0ZWQgYnl0ZXMgcGVyIHRyYWNrICovCisJdW5zaWduZWQgc2hvcnQJc2VjdG9yX2J5dGVzOwkvKiB1bmZvcm1hdHRlZCBieXRlcyBwZXIgc2VjdG9yICovCisJdW5zaWduZWQgc2hvcnQJc2VjdG9yczsJLyogT2Jzb2xldGUsICJwaHlzaWNhbCIgc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwl1bnNpZ25lZCBzaG9ydAl2ZW5kb3IwOwkvKiB2ZW5kb3IgdW5pcXVlICovCisJdW5zaWduZWQgc2hvcnQJdmVuZG9yMTsJLyogdmVuZG9yIHVuaXF1ZSAqLworCXVuc2lnbmVkIHNob3J0CXZlbmRvcjI7CS8qIFJldGlyZWQgdmVuZG9yIHVuaXF1ZSAqLworCXVuc2lnbmVkIGNoYXIJc2VyaWFsX25vWzIwXTsJLyogMCA9IG5vdF9zcGVjaWZpZWQgKi8KKwl1bnNpZ25lZCBzaG9ydAlidWZfdHlwZTsJLyogUmV0aXJlZCAqLworCXVuc2lnbmVkIHNob3J0CWJ1Zl9zaXplOwkvKiBSZXRpcmVkLCA1MTIgYnl0ZSBpbmNyZW1lbnRzCisJCQkJCSAqIDAgPSBub3Rfc3BlY2lmaWVkCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0CWVjY19ieXRlczsJLyogZm9yIHIvdyBsb25nIGNtZHM7IDAgPSBub3Rfc3BlY2lmaWVkICovCisJdW5zaWduZWQgY2hhcglmd19yZXZbOF07CS8qIDAgPSBub3Rfc3BlY2lmaWVkICovCisJdW5zaWduZWQgY2hhcgltb2RlbFs0MF07CS8qIDAgPSBub3Rfc3BlY2lmaWVkICovCisJdW5zaWduZWQgY2hhcgltYXhfbXVsdHNlY3Q7CS8qIDA9bm90X2ltcGxlbWVudGVkICovCisJdW5zaWduZWQgY2hhcgl2ZW5kb3IzOwkvKiB2ZW5kb3IgdW5pcXVlICovCisJdW5zaWduZWQgc2hvcnQJZHdvcmRfaW87CS8qIDA9bm90X2ltcGxlbWVudGVkOyAxPWltcGxlbWVudGVkICovCisJdW5zaWduZWQgY2hhcgl2ZW5kb3I0OwkvKiB2ZW5kb3IgdW5pcXVlICovCisJdW5zaWduZWQgY2hhcgljYXBhYmlsaXR5OwkvKiAodXBwZXIgYnl0ZSBvZiB3b3JkIDQ5KQorCQkJCQkgKiAgMzoJSU9SRFlzdXAKKwkJCQkJICogIDI6CUlPUkRZc3cKKwkJCQkJICogIDE6CUxCQQorCQkJCQkgKiAgMDoJRE1BCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0CXJlc2VydmVkNTA7CS8qIHJlc2VydmVkICh3b3JkIDUwKSAqLworCXVuc2lnbmVkIGNoYXIJdmVuZG9yNTsJLyogT2Jzb2xldGUsIHZlbmRvciB1bmlxdWUgKi8KKwl1bnNpZ25lZCBjaGFyCXRQSU87CQkvKiBPYnNvbGV0ZSwgMD1zbG93LCAxPW1lZGl1bSwgMj1mYXN0ICovCisJdW5zaWduZWQgY2hhcgl2ZW5kb3I2OwkvKiBPYnNvbGV0ZSwgdmVuZG9yIHVuaXF1ZSAqLworCXVuc2lnbmVkIGNoYXIJdERNQTsJCS8qIE9ic29sZXRlLCAwPXNsb3csIDE9bWVkaXVtLCAyPWZhc3QgKi8KKwl1bnNpZ25lZCBzaG9ydAlmaWVsZF92YWxpZDsJLyogKHdvcmQgNTMpCisJCQkJCSAqICAyOgl1bHRyYV9vawl3b3JkICA4OAorCQkJCQkgKiAgMToJZWlkZV9vawkJd29yZHMgNjQtNzAKKwkJCQkJICogIDA6CWN1cl9vawkJd29yZHMgNTQtNTgKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQJY3VyX2N5bHM7CS8qIE9ic29sZXRlLCBsb2dpY2FsIGN5bGluZGVycyAqLworCXVuc2lnbmVkIHNob3J0CWN1cl9oZWFkczsJLyogT2Jzb2xldGUsIGwgaGVhZHMgKi8KKwl1bnNpZ25lZCBzaG9ydAljdXJfc2VjdG9yczsJLyogT2Jzb2xldGUsIGwgc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwl1bnNpZ25lZCBzaG9ydAljdXJfY2FwYWNpdHkwOwkvKiBPYnNvbGV0ZSwgbCB0b3RhbCBzZWN0b3JzIG9uIGRyaXZlICovCisJdW5zaWduZWQgc2hvcnQJY3VyX2NhcGFjaXR5MTsJLyogT2Jzb2xldGUsICgyIHdvcmRzLCBtaXNhbGlnbmVkIGludCkgICAgICovCisJdW5zaWduZWQgY2hhcgltdWx0c2VjdDsJLyogY3VycmVudCBtdWx0aXBsZSBzZWN0b3IgY291bnQgKi8KKwl1bnNpZ25lZCBjaGFyCW11bHRzZWN0X3ZhbGlkOwkvKiB3aGVuIChiaXQwPT0xKSBtdWx0c2VjdCBpcyBvayAqLworCXVuc2lnbmVkIGludAlsYmFfY2FwYWNpdHk7CS8qIE9ic29sZXRlLCB0b3RhbCBudW1iZXIgb2Ygc2VjdG9ycyAqLworCXVuc2lnbmVkIHNob3J0CWRtYV8xd29yZDsJLyogT2Jzb2xldGUsIHNpbmdsZS13b3JkIGRtYSBpbmZvICovCisJdW5zaWduZWQgc2hvcnQJZG1hX213b3JkOwkvKiBtdWx0aXBsZS13b3JkIGRtYSBpbmZvICovCisJdW5zaWduZWQgc2hvcnQgIGVpZGVfcGlvX21vZGVzOyAvKiBiaXRzIDA6bW9kZTMgMTptb2RlNCAqLworCXVuc2lnbmVkIHNob3J0ICBlaWRlX2RtYV9taW47CS8qIG1pbiBtd29yZCBkbWEgY3ljbGUgdGltZSAobnMpICovCisJdW5zaWduZWQgc2hvcnQgIGVpZGVfZG1hX3RpbWU7CS8qIHJlY29tbWVuZGVkIG13b3JkIGRtYSBjeWNsZSB0aW1lIChucykgKi8KKwl1bnNpZ25lZCBzaG9ydCAgZWlkZV9waW87ICAgICAgIC8qIG1pbiBjeWNsZSB0aW1lIChucyksIG5vIElPUkRZICAqLworCXVuc2lnbmVkIHNob3J0ICBlaWRlX3Bpb19pb3JkeTsgLyogbWluIGN5Y2xlIHRpbWUgKG5zKSwgd2l0aCBJT1JEWSAqLworCXVuc2lnbmVkIHNob3J0CXdvcmRzNjlfNzBbMl07CS8qIHJlc2VydmVkIHdvcmRzIDY5LTcwCisJCQkJCSAqIGZ1dHVyZSBjb21tYW5kIG92ZXJsYXAgYW5kIHF1ZXVpbmcKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQJd29yZHM3MV83NFs0XTsJLyogcmVzZXJ2ZWQgd29yZHMgNzEtNzQKKwkJCQkJICogZm9yIElERU5USUZZIFBBQ0tFVCBERVZJQ0UgY29tbWFuZAorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCAgcXVldWVfZGVwdGg7CS8qICh3b3JkIDc1KQorCQkJCQkgKiAxNTo1CXJlc2VydmVkCisJCQkJCSAqICA0OjAJTWF4aW11bSBxdWV1ZSBkZXB0aCAtMQorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCAgd29yZHM3Nl83OVs0XTsJLyogcmVzZXJ2ZWQgd29yZHMgNzYtNzkgKi8KKwl1bnNpZ25lZCBzaG9ydCAgbWFqb3JfcmV2X251bTsJLyogKHdvcmQgODApICovCisJdW5zaWduZWQgc2hvcnQgIG1pbm9yX3Jldl9udW07CS8qICh3b3JkIDgxKSAqLworCXVuc2lnbmVkIHNob3J0ICBjb21tYW5kX3NldF8xOwkvKiAod29yZCA4Mikgc3VwcG9ydGVkCisJCQkJCSAqIDE1OglPYnNvbGV0ZQorCQkJCQkgKiAxNDoJTk9QIGNvbW1hbmQKKwkJCQkJICogMTM6CVJFQURfQlVGRkVSCisJCQkJCSAqIDEyOglXUklURV9CVUZGRVIKKwkJCQkJICogMTE6CU9ic29sZXRlCisJCQkJCSAqIDEwOglIb3N0IFByb3RlY3RlZCBBcmVhCisJCQkJCSAqICA5OglERVZJQ0UgUmVzZXQKKwkJCQkJICogIDg6CVNFUlZJQ0UgSW50ZXJydXB0CisJCQkJCSAqICA3OglSZWxlYXNlIEludGVycnVwdAorCQkJCQkgKiAgNjoJbG9vay1haGVhZAorCQkJCQkgKiAgNToJd3JpdGUgY2FjaGUKKwkJCQkJICogIDQ6CVBBQ0tFVCBDb21tYW5kCisJCQkJCSAqICAzOglQb3dlciBNYW5hZ2VtZW50IEZlYXR1cmUgU2V0CisJCQkJCSAqICAyOglSZW1vdmFibGUgRmVhdHVyZSBTZXQKKwkJCQkJICogIDE6CVNlY3VyaXR5IEZlYXR1cmUgU2V0CisJCQkJCSAqICAwOglTTUFSVCBGZWF0dXJlIFNldAorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCAgY29tbWFuZF9zZXRfMjsJLyogKHdvcmQgODMpCisJCQkJCSAqIDE1OglTaGFsbCBiZSBaRVJPCisJCQkJCSAqIDE0OglTaGFsbCBiZSBPTkUKKwkJCQkJICogMTM6CUZMVVNIIENBQ0hFIEVYVAorCQkJCQkgKiAxMjoJRkxVU0ggQ0FDSEUKKwkJCQkJICogMTE6CURldmljZSBDb25maWd1cmF0aW9uIE92ZXJsYXkKKwkJCQkJICogMTA6CTQ4LWJpdCBBZGRyZXNzIEZlYXR1cmUgU2V0CisJCQkJCSAqICA5OglBdXRvbWF0aWMgQWNvdXN0aWMgTWFuYWdlbWVudAorCQkJCQkgKiAgODoJU0VUIE1BWCBzZWN1cml0eQorCQkJCQkgKiAgNzoJcmVzZXJ2ZWQgMTQwN0RUIFBBUlRJRVMKKwkJCQkJICogIDY6CVNldEYgc3ViLWNvbW1hbmQgUG93ZXItVXAKKwkJCQkJICogIDU6CVBvd2VyLVVwIGluIFN0YW5kYnkgRmVhdHVyZSBTZXQKKwkJCQkJICogIDQ6CVJlbW92YWJsZSBNZWRpYSBOb3RpZmljYXRpb24KKwkJCQkJICogIDM6CUFQTSBGZWF0dXJlIFNldAorCQkJCQkgKiAgMjoJQ0ZBIEZlYXR1cmUgU2V0CisJCQkJCSAqICAxOglSRUFEL1dSSVRFIERNQSBRVUVVRUQKKwkJCQkJICogIDA6CURvd25sb2FkIE1pY3JvQ29kZQorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCAgY2Zzc2U7CQkvKiAod29yZCA4NCkKKwkJCQkJICogY21kIHNldC1mZWF0dXJlIHN1cHBvcnRlZCBleHRlbnNpb25zCisJCQkJCSAqIDE1OglTaGFsbCBiZSBaRVJPCisJCQkJCSAqIDE0OglTaGFsbCBiZSBPTkUKKwkJCQkJICogMTM6NglyZXNlcnZlZAorCQkJCQkgKiAgNToJR2VuZXJhbCBQdXJwb3NlIExvZ2dpbmcKKwkJCQkJICogIDQ6CVN0cmVhbWluZyBGZWF0dXJlIFNldAorCQkJCQkgKiAgMzoJTWVkaWEgQ2FyZCBQYXNzIFRocm91Z2gKKwkJCQkJICogIDI6CU1lZGlhIFNlcmlhbCBOdW1iZXIgVmFsaWQKKwkJCQkJICogIDE6CVNNQVJUIHNlbHQtdGVzdCBzdXBwb3J0ZWQKKwkJCQkJICogIDA6CVNNQVJUIGVycm9yIGxvZ2dpbmcKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQgIGNmc19lbmFibGVfMTsJLyogKHdvcmQgODUpCisJCQkJCSAqIGNvbW1hbmQgc2V0LWZlYXR1cmUgZW5hYmxlZAorCQkJCQkgKiAxNToJT2Jzb2xldGUKKwkJCQkJICogMTQ6CU5PUCBjb21tYW5kCisJCQkJCSAqIDEzOglSRUFEX0JVRkZFUgorCQkJCQkgKiAxMjoJV1JJVEVfQlVGRkVSCisJCQkJCSAqIDExOglPYnNvbGV0ZQorCQkJCQkgKiAxMDoJSG9zdCBQcm90ZWN0ZWQgQXJlYQorCQkJCQkgKiAgOToJREVWSUNFIFJlc2V0CisJCQkJCSAqICA4OglTRVJWSUNFIEludGVycnVwdAorCQkJCQkgKiAgNzoJUmVsZWFzZSBJbnRlcnJ1cHQKKwkJCQkJICogIDY6CWxvb2stYWhlYWQKKwkJCQkJICogIDU6CXdyaXRlIGNhY2hlCisJCQkJCSAqICA0OglQQUNLRVQgQ29tbWFuZAorCQkJCQkgKiAgMzoJUG93ZXIgTWFuYWdlbWVudCBGZWF0dXJlIFNldAorCQkJCQkgKiAgMjoJUmVtb3ZhYmxlIEZlYXR1cmUgU2V0CisJCQkJCSAqICAxOglTZWN1cml0eSBGZWF0dXJlIFNldAorCQkJCQkgKiAgMDoJU01BUlQgRmVhdHVyZSBTZXQKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQgIGNmc19lbmFibGVfMjsJLyogKHdvcmQgODYpCisJCQkJCSAqIGNvbW1hbmQgc2V0LWZlYXR1cmUgZW5hYmxlZAorCQkJCQkgKiAxNToJU2hhbGwgYmUgWkVSTworCQkJCQkgKiAxNDoJU2hhbGwgYmUgT05FCisJCQkJCSAqIDEzOglGTFVTSCBDQUNIRSBFWFQKKwkJCQkJICogMTI6CUZMVVNIIENBQ0hFCisJCQkJCSAqIDExOglEZXZpY2UgQ29uZmlndXJhdGlvbiBPdmVybGF5CisJCQkJCSAqIDEwOgk0OC1iaXQgQWRkcmVzcyBGZWF0dXJlIFNldAorCQkJCQkgKiAgOToJQXV0b21hdGljIEFjb3VzdGljIE1hbmFnZW1lbnQKKwkJCQkJICogIDg6CVNFVCBNQVggc2VjdXJpdHkKKwkJCQkJICogIDc6CXJlc2VydmVkIDE0MDdEVCBQQVJUSUVTCisJCQkJCSAqICA2OglTZXRGIHN1Yi1jb21tYW5kIFBvd2VyLVVwCisJCQkJCSAqICA1OglQb3dlci1VcCBpbiBTdGFuZGJ5IEZlYXR1cmUgU2V0CisJCQkJCSAqICA0OglSZW1vdmFibGUgTWVkaWEgTm90aWZpY2F0aW9uCisJCQkJCSAqICAzOglBUE0gRmVhdHVyZSBTZXQKKwkJCQkJICogIDI6CUNGQSBGZWF0dXJlIFNldAorCQkJCQkgKiAgMToJUkVBRC9XUklURSBETUEgUVVFVUVECisJCQkJCSAqICAwOglEb3dubG9hZCBNaWNyb0NvZGUKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQgIGNzZl9kZWZhdWx0OwkvKiAod29yZCA4NykKKwkJCQkJICogY29tbWFuZCBzZXQtZmVhdHVyZSBkZWZhdWx0CisJCQkJCSAqIDE1OglTaGFsbCBiZSBaRVJPCisJCQkJCSAqIDE0OglTaGFsbCBiZSBPTkUKKwkJCQkJICogMTM6NglyZXNlcnZlZAorCQkJCQkgKiAgNToJR2VuZXJhbCBQdXJwb3NlIExvZ2dpbmcgZW5hYmxlZAorCQkJCQkgKiAgNDoJVmFsaWQgQ09ORklHVVJFIFNUUkVBTSBleGVjdXRlZAorCQkJCQkgKiAgMzoJTWVkaWEgQ2FyZCBQYXNzIFRocm91Z2ggZW5hYmxlZAorCQkJCQkgKiAgMjoJTWVkaWEgU2VyaWFsIE51bWJlciBWYWxpZAorCQkJCQkgKiAgMToJU01BUlQgc2VsdC10ZXN0IHN1cHBvcnRlZAorCQkJCQkgKiAgMDoJU01BUlQgZXJyb3IgbG9nZ2luZworCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCAgZG1hX3VsdHJhOwkvKiAod29yZCA4OCkgKi8KKwl1bnNpZ25lZCBzaG9ydAl0cnNldWM7CQkvKiB0aW1lIHJlcXVpcmVkIGZvciBzZWN1cml0eSBlcmFzZSAqLworCXVuc2lnbmVkIHNob3J0CXRyc0V1YzsJCS8qIHRpbWUgcmVxdWlyZWQgZm9yIGVuaGFuY2VkIGVyYXNlICovCisJdW5zaWduZWQgc2hvcnQJQ3VyQVBNdmFsdWVzOwkvKiBjdXJyZW50IEFQTSB2YWx1ZXMgKi8KKwl1bnNpZ25lZCBzaG9ydAltcHJjOwkJLyogbWFzdGVyIHBhc3N3b3JkIHJldmlzaW9uIGNvZGUgKi8KKwl1bnNpZ25lZCBzaG9ydAlod19jb25maWc7CS8qIGhhcmR3YXJlIGNvbmZpZyAod29yZCA5MykKKwkJCQkJICogMTU6CVNoYWxsIGJlIFpFUk8KKwkJCQkJICogMTQ6CVNoYWxsIGJlIE9ORQorCQkJCQkgKiAxMzoKKwkJCQkJICogMTI6CisJCQkJCSAqIDExOgorCQkJCQkgKiAxMDoKKwkJCQkJICogIDk6CisJCQkJCSAqICA4OgorCQkJCQkgKiAgNzoKKwkJCQkJICogIDY6CisJCQkJCSAqICA1OgorCQkJCQkgKiAgNDoKKwkJCQkJICogIDM6CisJCQkJCSAqICAyOgorCQkJCQkgKiAgMToKKwkJCQkJICogIDA6CVNoYWxsIGJlIE9ORQorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydAlhY291c3RpYzsJLyogKHdvcmQgOTQpCisJCQkJCSAqIDE1OjgJVmVuZG9yJ3MgcmVjb21tZW5kZWQgdmFsdWUKKwkJCQkJICogIDc6MAljdXJyZW50IHZhbHVlCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0CW1zcnFzOwkJLyogbWluIHN0cmVhbSByZXF1ZXN0IHNpemUgKi8KKwl1bnNpZ25lZCBzaG9ydAlzeGZlcnQ7CQkvKiBzdHJlYW0gdHJhbnNmZXIgdGltZSAqLworCXVuc2lnbmVkIHNob3J0CXNhbDsJCS8qIHN0cmVhbSBhY2Nlc3MgbGF0ZW5jeSAqLworCXVuc2lnbmVkIGludAlzcGc7CQkvKiBzdHJlYW0gcGVyZm9ybWFuY2UgZ3JhbnVsYXJpdHkgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgbGJhX2NhcGFjaXR5XzI7LyogNDgtYml0IHRvdGFsIG51bWJlciBvZiBzZWN0b3JzICovCisJdW5zaWduZWQgc2hvcnQJd29yZHMxMDRfMTI1WzIyXTsvKiByZXNlcnZlZCB3b3JkcyAxMDQtMTI1ICovCisJdW5zaWduZWQgc2hvcnQJbGFzdF9sdW47CS8qICh3b3JkIDEyNikgKi8KKwl1bnNpZ25lZCBzaG9ydAl3b3JkMTI3OwkvKiAod29yZCAxMjcpIEZlYXR1cmUgU2V0CisJCQkJCSAqIFJlbW92YWJsZSBNZWRpYSBOb3RpZmljYXRpb24KKwkJCQkJICogMTU6MglyZXNlcnZlZAorCQkJCQkgKiAgMTowCTAwID0gbm90IHN1cHBvcnRlZAorCQkJCQkgKgkwMSA9IHN1cHBvcnRlZAorCQkJCQkgKgkxMCA9IHJlc2VydmVkCisJCQkJCSAqCTExID0gcmVzZXJ2ZWQKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQJZGxmOwkJLyogKHdvcmQgMTI4KQorCQkJCQkgKiBkZXZpY2UgbG9jayBmdW5jdGlvbgorCQkJCQkgKiAxNTo5CXJlc2VydmVkCisJCQkJCSAqICA4CXNlY3VyaXR5IGxldmVsIDE6bWF4IDA6aGlnaAorCQkJCQkgKiAgNzo2CXJlc2VydmVkCisJCQkJCSAqICA1CWVuaGFuY2VkIGVyYXNlCisJCQkJCSAqICA0CWV4cGlyZQorCQkJCQkgKiAgMwlmcm96ZW4KKwkJCQkJICogIDIJbG9ja2VkCisJCQkJCSAqICAxCWVuL2Rpc2FibGVkCisJCQkJCSAqICAwCWNhcGFiaWxpdHkKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQgIGNzZm87CQkvKiAgKHdvcmQgMTI5KQorCQkJCQkgKiBjdXJyZW50IHNldCBmZWF0dXJlcyBvcHRpb25zCisJCQkJCSAqIDE1OjQJcmVzZXJ2ZWQKKwkJCQkJICogIDM6CWF1dG8gcmVhc3NpZ24KKwkJCQkJICogIDI6CXJldmVydGluZworCQkJCQkgKiAgMToJcmVhZC1sb29rLWFoZWFkCisJCQkJCSAqICAwOgl3cml0ZSBjYWNoZQorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydAl3b3JkczEzMF8xNTVbMjZdOy8qIHJlc2VydmVkIHZlbmRvciB3b3JkcyAxMzAtMTU1ICovCisJdW5zaWduZWQgc2hvcnQJd29yZDE1NjsJLyogcmVzZXJ2ZWQgdmVuZG9yIHdvcmQgMTU2ICovCisJdW5zaWduZWQgc2hvcnQJd29yZHMxNTdfMTU5WzNdOy8qIHJlc2VydmVkIHZlbmRvciB3b3JkcyAxNTctMTU5ICovCisJdW5zaWduZWQgc2hvcnQJY2ZhX3Bvd2VyOwkvKiAod29yZCAxNjApIENGQSBQb3dlciBNb2RlCisJCQkJCSAqIDE1IHdvcmQgMTYwIHN1cHBvcnRlZAorCQkJCQkgKiAxNCByZXNlcnZlZAorCQkJCQkgKiAxMworCQkJCQkgKiAxMgorCQkJCQkgKiAxMTowCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0CXdvcmRzMTYxXzE3NVsxNV07LyogUmVzZXJ2ZWQgZm9yIENGQSAqLworCXVuc2lnbmVkIHNob3J0CXdvcmRzMTc2XzIwNVszMF07LyogQ3VycmVudCBNZWRpYSBTZXJpYWwgTnVtYmVyICovCisJdW5zaWduZWQgc2hvcnQJd29yZHMyMDZfMjU0WzQ5XTsvKiByZXNlcnZlZCB3b3JkcyAyMDYtMjU0ICovCisJdW5zaWduZWQgc2hvcnQJaW50ZWdyaXR5X3dvcmQ7CS8qICh3b3JkIDI1NSkKKwkJCQkJICogMTU6OCBDaGVja3N1bQorCQkJCQkgKiAgNzowIFNpZ25hdHVyZQorCQkJCQkgKi8KK307CisKKy8qCisgKiBJREUgIm5pY2UiIGZsYWdzLiBUaGVzZSBhcmUgdXNlZCBvbiBhIHBlciBkcml2ZSBiYXNpcyB0byBkZXRlcm1pbmUKKyAqIHdoZW4gdG8gYmUgbmljZSBhbmQgZ2l2ZSBtb3JlIGJhbmR3aWR0aCB0byB0aGUgb3RoZXIgZGV2aWNlcyB3aGljaAorICogc2hhcmUgdGhlIHNhbWUgSURFIGJ1cy4KKyAqLworI2RlZmluZSBJREVfTklDRV9EU0NfT1ZFUkxBUAkoMCkJLyogcGVyIHRoZSBEU0Mgb3ZlcmxhcCBwcm90b2NvbCAqLworI2RlZmluZSBJREVfTklDRV9BVEFQSV9PVkVSTEFQCSgxKQkvKiBub3Qgc3VwcG9ydGVkIHlldCAqLworI2RlZmluZSBJREVfTklDRV8xCQkoMykJLyogd2hlbiBwcm9iYWJseSB3b24ndCBhZmZlY3QgdXMgbXVjaCAqLworI2RlZmluZSBJREVfTklDRV8wCQkoMikJLyogd2hlbiBzdXJlIHRoYXQgaXQgd29uJ3QgYWZmZWN0IHVzICovCisjZGVmaW5lIElERV9OSUNFXzIJCSg0KQkvKiB3aGVuIHdlIGtub3cgaXQncyBvbiBvdXIgZXhwZW5zZSAqLworCisjZW5kaWYJLyogX0xJTlVYX0hEUkVHX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGlkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMmNlZmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hpZC5oCkBAIC0wLDAgKzEsNjcgQEAKKyNpZm5kZWYgX19ISURfSAorI2RlZmluZSBfX0hJRF9ICisKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVm9qdGVjaCBQYXZsaWsKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIFNob3VsZCB5b3UgbmVlZCB0byBjb250YWN0IG1lLCB0aGUgYXV0aG9yLCB5b3UgY2FuIGRvIHNvIGVpdGhlciBieQorICogZS1tYWlsIC0gbWFpbCB5b3VyIG1lc3NhZ2UgdG8gPHZvanRlY2hAdWN3LmN6Piwgb3IgYnkgcGFwZXIgbWFpbDoKKyAqIFZvanRlY2ggUGF2bGlrLCBTaW11bmtvdmEgMTU5NCwgUHJhZ3VlIDgsIDE4MiAwMCBDemVjaCBSZXB1YmxpYworICovCisKKy8qCisgKiBVU0IgSElEIChIdW1hbiBJbnRlcmZhY2UgRGV2aWNlKSBpbnRlcmZhY2UgY2xhc3MgY29kZQorICovCisKKyNkZWZpbmUgVVNCX0lOVEVSRkFDRV9DTEFTU19ISUQJCTMKKworLyoKKyAqIFVTQiBISUQgaW50ZXJmYWNlIHN1YmNsYXNzIGFuZCBwcm90b2NvbCBjb2RlcworICovCisKKyNkZWZpbmUgVVNCX0lOVEVSRkFDRV9TVUJDTEFTU19CT09UCTEKKyNkZWZpbmUgVVNCX0lOVEVSRkFDRV9QUk9UT0NPTF9LRVlCT0FSRAkxCisjZGVmaW5lIFVTQl9JTlRFUkZBQ0VfUFJPVE9DT0xfTU9VU0UJMgorCisvKgorICogSElEIGNsYXNzIHJlcXVlc3RzCisgKi8KKworI2RlZmluZSBISURfUkVRX0dFVF9SRVBPUlQJCTB4MDEKKyNkZWZpbmUgSElEX1JFUV9HRVRfSURMRQkJMHgwMgorI2RlZmluZSBISURfUkVRX0dFVF9QUk9UT0NPTAkJMHgwMworI2RlZmluZSBISURfUkVRX1NFVF9SRVBPUlQJCTB4MDkKKyNkZWZpbmUgSElEX1JFUV9TRVRfSURMRQkJMHgwQQorI2RlZmluZSBISURfUkVRX1NFVF9QUk9UT0NPTAkJMHgwQgorCisvKgorICogSElEIGNsYXNzIGRlc2NyaXB0b3IgdHlwZXMKKyAqLworCisjZGVmaW5lIEhJRF9EVF9ISUQJCQkoVVNCX1RZUEVfQ0xBU1MgfCAweDAxKQorI2RlZmluZSBISURfRFRfUkVQT1JUCQkJKFVTQl9UWVBFX0NMQVNTIHwgMHgwMikKKyNkZWZpbmUgSElEX0RUX1BIWVNJQ0FMCQkJKFVTQl9UWVBFX0NMQVNTIHwgMHgwMykKKworI2RlZmluZSBISURfTUFYX0RFU0NSSVBUT1JfU0laRQkJNDA5NgorCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hpZGRldi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oaWRkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGIzNmMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oaWRkZXYuaApAQCAtMCwwICsxLDIxMiBAQAorI2lmbmRlZiBfSElEREVWX0gKKyNkZWZpbmUgX0hJRERFVl9ICisKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgVm9qdGVjaCBQYXZsaWsKKyAqCisgKiAgU3BvbnNvcmVkIGJ5IFN1U0UKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqIAorICogU2hvdWxkIHlvdSBuZWVkIHRvIGNvbnRhY3QgbWUsIHRoZSBhdXRob3IsIHlvdSBjYW4gZG8gc28gZWl0aGVyIGJ5CisgKiBlLW1haWwgLSBtYWlsIHlvdXIgbWVzc2FnZSB0byA8dm9qdGVjaEBzdXNlLmN6Piwgb3IgYnkgcGFwZXIgbWFpbDoKKyAqIFZvanRlY2ggUGF2bGlrLCBVY2l0ZWxza2EgMTU3NiwgUHJhZ3VlIDgsIDE4MiAwMCBDemVjaCBSZXB1YmxpYworICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogVGhlIGV2ZW50IHN0cnVjdHVyZSBpdHNlbGYKKyAqLworCitzdHJ1Y3QgaGlkZGV2X2V2ZW50IHsKKwl1bnNpZ25lZCBoaWQ7CisJc2lnbmVkIGludCB2YWx1ZTsKK307CisKK3N0cnVjdCBoaWRkZXZfZGV2aW5mbyB7CisJX191MzIgYnVzdHlwZTsKKwlfX3UzMiBidXNudW07CisJX191MzIgZGV2bnVtOworCV9fdTMyIGlmbnVtOworCV9fczE2IHZlbmRvcjsKKwlfX3MxNiBwcm9kdWN0OworCV9fczE2IHZlcnNpb247CisJX191MzIgbnVtX2FwcGxpY2F0aW9uczsKK307CisKK3N0cnVjdCBoaWRkZXZfY29sbGVjdGlvbl9pbmZvIHsKKwlfX3UzMiBpbmRleDsKKwlfX3UzMiB0eXBlOworCV9fdTMyIHVzYWdlOworCV9fdTMyIGxldmVsOworfTsKKworI2RlZmluZSBISURfU1RSSU5HX1NJWkUgMjU2CitzdHJ1Y3QgaGlkZGV2X3N0cmluZ19kZXNjcmlwdG9yIHsKKwlfX3MzMiBpbmRleDsKKwljaGFyIHZhbHVlW0hJRF9TVFJJTkdfU0laRV07Cit9OworCitzdHJ1Y3QgaGlkZGV2X3JlcG9ydF9pbmZvIHsKKwlfX3UzMiByZXBvcnRfdHlwZTsKKwlfX3UzMiByZXBvcnRfaWQ7CisJX191MzIgbnVtX2ZpZWxkczsKK307CisKKy8qIFRvIGRvIGEgR1VTQUdFL1NVU0FHRSwgZmlsbCBpbiBhdCBsZWFzdCB1c2FnZV9jb2RlLCAgcmVwb3J0X3R5cGUgYW5kIAorICogcmVwb3J0X2lkLiAgU2V0IHJlcG9ydF9pZCB0byBSRVBPUlRfSURfVU5LTk9XTiBpZiB0aGUgcmVzdCBvZiB0aGUgZmllbGRzIAorICogYXJlIHVua25vd24uICBPdGhlcndpc2UgdXNlIGEgdXNhZ2VfcmVmIHN0cnVjdCBmaWxsZWQgaW4gZnJvbSBhIHByZXZpb3VzIAorICogc3VjY2Vzc2Z1bCBHVVNBR0UgY2FsbCB0byBzYXZlIHRpbWUuICBUbyBhY3R1YWxseSBzZW5kIGEgdmFsdWUgdG8gdGhlCisgKiBkZXZpY2UsIHBlcmZvcm0gYSBTVVNBR0UgZmlyc3QsIGZvbGxvd2VkIGJ5IGEgU1JFUE9SVC4gIEFuIElOSVRSRVBPUlQgb3IgYQorICogR1JFUE9SVCBpc24ndCBuZWNlc3NhcnkgZm9yIGEgR1VTQUdFIHRvIHJldHVybiB2YWxpZCBkYXRhLgorICovCisjZGVmaW5lIEhJRF9SRVBPUlRfSURfVU5LTk9XTiAweGZmZmZmZmZmCisjZGVmaW5lIEhJRF9SRVBPUlRfSURfRklSU1QgICAweDAwMDAwMTAwCisjZGVmaW5lIEhJRF9SRVBPUlRfSURfTkVYVCAgICAweDAwMDAwMjAwCisjZGVmaW5lIEhJRF9SRVBPUlRfSURfTUFTSyAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhJRF9SRVBPUlRfSURfTUFYICAgICAweDAwMDAwMGZmCisKKyNkZWZpbmUgSElEX1JFUE9SVF9UWVBFX0lOUFVUCTEKKyNkZWZpbmUgSElEX1JFUE9SVF9UWVBFX09VVFBVVAkyCisjZGVmaW5lIEhJRF9SRVBPUlRfVFlQRV9GRUFUVVJFCTMKKyNkZWZpbmUgSElEX1JFUE9SVF9UWVBFX01JTiAgICAgMQorI2RlZmluZSBISURfUkVQT1JUX1RZUEVfTUFYICAgICAzCisKK3N0cnVjdCBoaWRkZXZfZmllbGRfaW5mbyB7CisJX191MzIgcmVwb3J0X3R5cGU7CisJX191MzIgcmVwb3J0X2lkOworCV9fdTMyIGZpZWxkX2luZGV4OworCV9fdTMyIG1heHVzYWdlOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHBoeXNpY2FsOwkJLyogcGh5c2ljYWwgdXNhZ2UgZm9yIHRoaXMgZmllbGQgKi8KKwlfX3UzMiBsb2dpY2FsOwkJLyogbG9naWNhbCB1c2FnZSBmb3IgdGhpcyBmaWVsZCAqLworCV9fdTMyIGFwcGxpY2F0aW9uOwkJLyogYXBwbGljYXRpb24gdXNhZ2UgZm9yIHRoaXMgZmllbGQgKi8KKwlfX3MzMiBsb2dpY2FsX21pbmltdW07CisJX19zMzIgbG9naWNhbF9tYXhpbXVtOworCV9fczMyIHBoeXNpY2FsX21pbmltdW07CisJX19zMzIgcGh5c2ljYWxfbWF4aW11bTsKKwlfX3UzMiB1bml0X2V4cG9uZW50OworCV9fdTMyIHVuaXQ7Cit9OworCisvKiBGaWxsIGluIHJlcG9ydF90eXBlLCByZXBvcnRfaWQgYW5kIGZpZWxkX2luZGV4IHRvIGdldCB0aGUgaW5mb3JtYXRpb24gb24gYQorICogZmllbGQuCisgKi8KKyNkZWZpbmUgSElEX0ZJRUxEX0NPTlNUQU5UCQkweDAwMQorI2RlZmluZSBISURfRklFTERfVkFSSUFCTEUJCTB4MDAyCisjZGVmaW5lIEhJRF9GSUVMRF9SRUxBVElWRQkJMHgwMDQKKyNkZWZpbmUgSElEX0ZJRUxEX1dSQVAJCQkweDAwOAkKKyNkZWZpbmUgSElEX0ZJRUxEX05PTkxJTkVBUgkJMHgwMTAKKyNkZWZpbmUgSElEX0ZJRUxEX05PX1BSRUZFUlJFRAkJMHgwMjAKKyNkZWZpbmUgSElEX0ZJRUxEX05VTExfU1RBVEUJCTB4MDQwCisjZGVmaW5lIEhJRF9GSUVMRF9WT0xBVElMRQkJMHgwODAKKyNkZWZpbmUgSElEX0ZJRUxEX0JVRkZFUkVEX0JZVEUJCTB4MTAwCisKK3N0cnVjdCBoaWRkZXZfdXNhZ2VfcmVmIHsKKwlfX3UzMiByZXBvcnRfdHlwZTsKKwlfX3UzMiByZXBvcnRfaWQ7CisJX191MzIgZmllbGRfaW5kZXg7CisJX191MzIgdXNhZ2VfaW5kZXg7CisJX191MzIgdXNhZ2VfY29kZTsKKwlfX3MzMiB2YWx1ZTsKK307CisKKy8qIGhpZGRldl91c2FnZV9yZWZfbXVsdGkgaXMgdXNlZCBmb3Igc2VuZGluZyBtdWx0aXBsZSBieXRlcyB0byBhIGNvbnRyb2wuCisgKiBJdCByZWFsbHkgbWFuaWZlc3RzIGl0c2VsZiBhcyBzZXR0aW5nIHRoZSB2YWx1ZSBvZiBjb25zZWN1dGl2ZSB1c2FnZXMgKi8KKyNkZWZpbmUgSElEX01BWF9NVUxUSV9VU0FHRVMgMTAyNAorc3RydWN0IGhpZGRldl91c2FnZV9yZWZfbXVsdGkgeworCXN0cnVjdCBoaWRkZXZfdXNhZ2VfcmVmIHVyZWY7CisJX191MzIgbnVtX3ZhbHVlczsKKwlfX3MzMiB2YWx1ZXNbSElEX01BWF9NVUxUSV9VU0FHRVNdOworfTsKKworLyogRklFTERfSU5ERVhfTk9ORSBpcyByZXR1cm5lZCBpbiByZWFkKCkgZGF0YSBmcm9tIHRoZSBrZXJuZWwgd2hlbiBmbGFncworICogaXMgc2V0IHRvIChISURERVZfRkxBR19VUkVGIHwgSElEREVWX0ZMQUdfUkVQT1JUKSBhbmQgYSBuZXcgcmVwb3J0IGhhcworICogYmVlbiBzZW50IGJ5IHRoZSBkZXZpY2UgCisgKi8KKyNkZWZpbmUgSElEX0ZJRUxEX0lOREVYX05PTkUgMHhmZmZmZmZmZgorCisvKgorICogUHJvdG9jb2wgdmVyc2lvbi4KKyAqLworCisjZGVmaW5lIEhJRF9WRVJTSU9OCQkweDAxMDAwNAorCisvKgorICogSU9DVExzICgweDAwIC0gMHg3ZikKKyAqLworCisjZGVmaW5lIEhJRElPQ0dWRVJTSU9OCQlfSU9SKCdIJywgMHgwMSwgaW50KQorI2RlZmluZSBISURJT0NBUFBMSUNBVElPTglfSU8oJ0gnLCAweDAyKQorI2RlZmluZSBISURJT0NHREVWSU5GTwkJX0lPUignSCcsIDB4MDMsIHN0cnVjdCBoaWRkZXZfZGV2aW5mbykKKyNkZWZpbmUgSElESU9DR1NUUklORwkJX0lPUignSCcsIDB4MDQsIHN0cnVjdCBoaWRkZXZfc3RyaW5nX2Rlc2NyaXB0b3IpCisjZGVmaW5lIEhJRElPQ0lOSVRSRVBPUlQJX0lPKCdIJywgMHgwNSkKKyNkZWZpbmUgSElESU9DR05BTUUobGVuKQlfSU9DKF9JT0NfUkVBRCwgJ0gnLCAweDA2LCBsZW4pCisjZGVmaW5lIEhJRElPQ0dSRVBPUlQJCV9JT1coJ0gnLCAweDA3LCBzdHJ1Y3QgaGlkZGV2X3JlcG9ydF9pbmZvKQorI2RlZmluZSBISURJT0NTUkVQT1JUCQlfSU9XKCdIJywgMHgwOCwgc3RydWN0IGhpZGRldl9yZXBvcnRfaW5mbykKKyNkZWZpbmUgSElESU9DR1JFUE9SVElORk8JX0lPV1IoJ0gnLCAweDA5LCBzdHJ1Y3QgaGlkZGV2X3JlcG9ydF9pbmZvKQorI2RlZmluZSBISURJT0NHRklFTERJTkZPCV9JT1dSKCdIJywgMHgwQSwgc3RydWN0IGhpZGRldl9maWVsZF9pbmZvKQorI2RlZmluZSBISURJT0NHVVNBR0UJCV9JT1dSKCdIJywgMHgwQiwgc3RydWN0IGhpZGRldl91c2FnZV9yZWYpCisjZGVmaW5lIEhJRElPQ1NVU0FHRQkJX0lPVygnSCcsIDB4MEMsIHN0cnVjdCBoaWRkZXZfdXNhZ2VfcmVmKQorI2RlZmluZSBISURJT0NHVUNPREUJCV9JT1dSKCdIJywgMHgwRCwgc3RydWN0IGhpZGRldl91c2FnZV9yZWYpCisjZGVmaW5lIEhJRElPQ0dGTEFHCQlfSU9SKCdIJywgMHgwRSwgaW50KQorI2RlZmluZSBISURJT0NTRkxBRwkJX0lPVygnSCcsIDB4MEYsIGludCkKKyNkZWZpbmUgSElESU9DR0NPTExFQ1RJT05JTkRFWAlfSU9XKCdIJywgMHgxMCwgc3RydWN0IGhpZGRldl91c2FnZV9yZWYpCisjZGVmaW5lIEhJRElPQ0dDT0xMRUNUSU9OSU5GTwlfSU9XUignSCcsIDB4MTEsIHN0cnVjdCBoaWRkZXZfY29sbGVjdGlvbl9pbmZvKQorI2RlZmluZSBISURJT0NHUEhZUyhsZW4pCV9JT0MoX0lPQ19SRUFELCAnSCcsIDB4MTIsIGxlbikKKworLyogRm9yIHdyaXRpbmcvcmVhZGluZyB0byBtdWx0aXBsZS9jb25zZWN1dGl2ZSB1c2FnZXMgKi8KKyNkZWZpbmUgSElESU9DR1VTQUdFUwkJX0lPV1IoJ0gnLCAweDEzLCBzdHJ1Y3QgaGlkZGV2X3VzYWdlX3JlZl9tdWx0aSkKKyNkZWZpbmUgSElESU9DU1VTQUdFUwkJX0lPVygnSCcsIDB4MTQsIHN0cnVjdCBoaWRkZXZfdXNhZ2VfcmVmX211bHRpKQorCisvKiAKKyAqIEZsYWdzIHRvIGJlIHVzZWQgaW4gSElESU9DU0ZMQUcKKyAqLworI2RlZmluZSBISURERVZfRkxBR19VUkVGCTB4MQorI2RlZmluZSBISURERVZfRkxBR19SRVBPUlQJMHgyCisjZGVmaW5lIEhJRERFVl9GTEFHUwkJMHgzCisKKy8qIFRvIHRyYXZlcnNlIHRoZSBpbnB1dCByZXBvcnQgZGVzY3JpcHRvciBpbmZvIGZvciBhIEhJRCBkZXZpY2UsIHBlcmZvcm0gdGhlIAorICogZm9sbG93aW5nOgorICoKKyAqIHJpbmZvLnJlcG9ydF90eXBlID0gSElEX1JFUE9SVF9UWVBFX0lOUFVUOworICogcmluZm8ucmVwb3J0X2lkID0gSElEX1JFUE9SVF9JRF9GSVJTVDsKKyAqIHJldCA9IGlvY3RsKGZkLCBISURJT0NHUkVQT1JUSU5GTywgJnJpbmZvKTsKKyAqCisgKiB3aGlsZSAocmV0ID49IDApIHsKKyAqIAlmb3IgKGkgPSAwOyBpIDwgcmluZm8ubnVtX2ZpZWxkczsgaSsrKSB7CisgKiAJCWZpbmZvLnJlcG9ydF90eXBlID0gcmluZm8ucmVwb3J0X3R5cGU7CisgKiAJCWZpbmZvLnJlcG9ydF9pZCA9IHJpbmZvLnJlcG9ydF9pZDsKKyAqIAkJZmluZm8uZmllbGRfaW5kZXggPSBpOworICogCQlpb2N0bChmZCwgSElESU9DR0ZJRUxESU5GTywgJmZpbmZvKTsKKyAqIAkJZm9yIChqID0gMDsgaiA8IGZpbmZvLm1heHVzYWdlOyBqKyspIHsKKyAqIAkJCXVyZWYucmVwb3J0X3R5cGUgPSByaW5mby5yZXBvcnRfdHlwZTsKKyAqIAkJCXVyZWYucmVwb3J0X2lkID0gcmluZm8ucmVwb3J0X2lkOworICogCQkJdXJlZi5maWVsZF9pbmRleCA9IGk7CisgKiAJCQl1cmVmLnVzYWdlX2luZGV4ID0gajsKKyAqIAkJCWlvY3RsKGZkLCBISURJT0NHVUNPREUsICZ1cmVmKTsKKyAqIAkJCWlvY3RsKGZkLCBISURJT0NHVVNBR0UsICZ1cmVmKTsKKyAqIAkJfQorICogCX0KKyAqIAlyaW5mby5yZXBvcnRfaWQgfD0gSElEX1JFUE9SVF9JRF9ORVhUOworICogCXJldCA9IGlvY3RsKGZkLCBISURJT0NHUkVQT1JUSU5GTywgJnJpbmZvKTsKKyAqIH0KKyAqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oaWRyYXcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGlkcmF3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxNmIxMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGlkcmF3LmgKQEAgLTAsMCArMSw1MCBAQAorI2lmbmRlZiBfSElEUkFXX0gKKyNkZWZpbmUgX0hJRFJBV19ICisKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IEppcmkgS29zaW5hCisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBoaWRyYXdfcmVwb3J0X2Rlc2NyaXB0b3IgeworCV9fdTMyIHNpemU7CisJX191OCB2YWx1ZVtISURfTUFYX0RFU0NSSVBUT1JfU0laRV07Cit9OworCitzdHJ1Y3QgaGlkcmF3X2RldmluZm8geworCV9fdTMyIGJ1c3R5cGU7CisJX19zMTYgdmVuZG9yOworCV9fczE2IHByb2R1Y3Q7Cit9OworCisvKiBpb2N0bCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgSElESU9DR1JERVNDU0laRQlfSU9SKCdIJywgMHgwMSwgaW50KQorI2RlZmluZSBISURJT0NHUkRFU0MJCV9JT1IoJ0gnLCAweDAyLCBzdHJ1Y3QgaGlkcmF3X3JlcG9ydF9kZXNjcmlwdG9yKQorI2RlZmluZSBISURJT0NHUkFXSU5GTwkJX0lPUignSCcsIDB4MDMsIHN0cnVjdCBoaWRyYXdfZGV2aW5mbykKKyNkZWZpbmUgSElESU9DR1JBV05BTUUobGVuKSAgICAgX0lPQyhfSU9DX1JFQUQsICdIJywgMHgwNCwgbGVuKQorI2RlZmluZSBISURJT0NHUkFXUEhZUyhsZW4pICAgICBfSU9DKF9JT0NfUkVBRCwgJ0gnLCAweDA1LCBsZW4pCisvKiBUaGUgZmlyc3QgYnl0ZSBvZiBTRkVBVFVSRSBhbmQgR0ZFQVRVUkUgaXMgdGhlIHJlcG9ydCBudW1iZXIgKi8KKyNkZWZpbmUgSElESU9DU0ZFQVRVUkUobGVuKSAgICBfSU9DKF9JT0NfV1JJVEV8X0lPQ19SRUFELCAnSCcsIDB4MDYsIGxlbikKKyNkZWZpbmUgSElESU9DR0ZFQVRVUkUobGVuKSAgICBfSU9DKF9JT0NfV1JJVEV8X0lPQ19SRUFELCAnSCcsIDB4MDcsIGxlbikKKworI2RlZmluZSBISURSQVdfRklSU1RfTUlOT1IgMAorI2RlZmluZSBISURSQVdfTUFYX0RFVklDRVMgNjQKKy8qIG51bWJlciBvZiByZXBvcnRzIHRvIGJ1ZmZlciAqLworI2RlZmluZSBISURSQVdfQlVGRkVSX1NJWkUgNjQKKworCisvKiBrZXJuZWwtb25seSBBUEkgZGVjbGFyYXRpb25zICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ocGV0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hwZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzJiOGZkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ocGV0LmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZglfX0hQRVRfXworI2RlZmluZQlfX0hQRVRfXyAxCisKKworCisKK3N0cnVjdCBocGV0X2luZm8geworCXVuc2lnbmVkIGxvbmcgaGlfaXJlcWZyZXE7CS8qIEh6ICovCisJdW5zaWduZWQgbG9uZyBoaV9mbGFnczsJLyogaW5mb3JtYXRpb24gKi8KKwl1bnNpZ25lZCBzaG9ydCBoaV9ocGV0OworCXVuc2lnbmVkIHNob3J0IGhpX3RpbWVyOworfTsKKworI2RlZmluZSBIUEVUX0lORk9fUEVSSU9ESUMJMHgwMDEwCS8qIHBlcmlvZGljLWNhcGFibGUgY29tcGFyYXRvciAqLworCisjZGVmaW5lCUhQRVRfSUVfT04JX0lPKCdoJywgMHgwMSkJLyogaW50ZXJydXB0IG9uICovCisjZGVmaW5lCUhQRVRfSUVfT0ZGCV9JTygnaCcsIDB4MDIpCS8qIGludGVycnVwdCBvZmYgKi8KKyNkZWZpbmUJSFBFVF9JTkZPCV9JT1IoJ2gnLCAweDAzLCBzdHJ1Y3QgaHBldF9pbmZvKQorI2RlZmluZQlIUEVUX0VQSQlfSU8oJ2gnLCAweDA0KQkvKiBlbmFibGUgcGVyaW9kaWMgKi8KKyNkZWZpbmUJSFBFVF9EUEkJX0lPKCdoJywgMHgwNSkJLyogZGlzYWJsZSBwZXJpb2RpYyAqLworI2RlZmluZQlIUEVUX0lSUUZSRVEJX0lPVygnaCcsIDB4NiwgdW5zaWduZWQgbG9uZykJLyogSVJRRlJFUSB1c2VjICovCisKKyNkZWZpbmUgTUFYX0hQRVRfVEJTCTgJCS8qIG1heGltdW0gaHBldCB0aW1lciBibG9ja3MgKi8KKworI2VuZGlmCQkJCS8qICFfX0hQRVRfXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oeXNkbl9pZi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oeXNkbl9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMjM2YWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2h5c2RuX2lmLmgKQEAgLTAsMCArMSwzMyBAQAorLyogJElkOiBoeXNkbl9pZi5oLHYgMS4xLjguMyAyMDAxLzA5LzIzIDIyOjI1OjA1IGthaSBFeHAgJAorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgSFlTRE4gY2FyZHMKKyAqIGlvY3RsIGRlZmluaXRpb25zIHNoYXJlZCBieSBoeW5ldG1nciBhbmQgZHJpdmVyLgorICoKKyAqIEF1dGhvciAgICBXZXJuZXIgQ29ybmVsaXVzICh3ZXJuZXJAdGl0cm8uZGUpIGZvciBIeXBlcmNvcGUgR21iSAorICogQ29weXJpZ2h0IDE5OTkgYnkgV2VybmVyIENvcm5lbGl1cyAod2VybmVyQHRpdHJvLmRlKQorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICovCisKKy8qKioqKioqKioqKioqKioqLworLyogZXJyb3IgdmFsdWVzICovCisvKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRVJSX05PTkUgICAgICAgICAgICAgMCAvKiBubyBlcnJvciBvY2N1cnJlZCAqLworI2RlZmluZSBFUlJfQUxSRUFEWV9CT09UICAxMDAwIC8qIHdlIGFyZSBhbHJlYWR5IGJvb3RpbmcgKi8KKyNkZWZpbmUgRVBPRl9CQURfTUFHSUMgICAgMTAwMSAvKiBiYWQgbWFnaWMgaW4gUE9GIGhlYWRlciAqLworI2RlZmluZSBFUlJfQk9BUkRfRFBSQU0gICAxMDAyIC8qIGJvYXJkIERQUkFNIGZhaWxlZCAqLworI2RlZmluZSBFUE9GX0lOVEVSTkFMICAgICAxMDAzIC8qIGludGVybmFsIFBPRiBoYW5kbGVyIGVycm9yICovCisjZGVmaW5lIEVQT0ZfQkFEX0lNR19TSVpFIDEwMDQgLyogUE9GIGJvb3QgaW1hZ2Ugc2l6ZSBpbnZhbGlkICovCisjZGVmaW5lIEVSUl9CT09USU1HX0ZBSUwgIDEwMDUgLyogMS4gc3RhZ2UgYm9vdCBpbWFnZSBkaWQgbm90IHN0YXJ0ICovCisjZGVmaW5lIEVSUl9CT09UU0VRX0ZBSUwgIDEwMDYgLyogMi4gc3RhZ2UgYm9vdCBzZXEgaGFuZHNoYWtlIHRpbWVvdXQgKi8KKyNkZWZpbmUgRVJSX1BPRl9USU1FT1VUICAgMTAwNyAvKiB0aW1lb3V0IHdhaXRpbmcgZm9yIGNhcmQgcG9mIHJlYWR5ICovCisjZGVmaW5lIEVSUl9OT1RfQk9PVEVEICAgIDEwMDggLyogb3BlcmF0aW9uIG9ubHkgYWxsb3dlZCB3aGVuIGJvb3RlZCAqLworI2RlZmluZSBFUlJfQ09ORl9MT05HICAgICAxMDA5IC8qIGNvbmYgbGluZSBpcyB0b28gbG9uZyAqLyAKKyNkZWZpbmUgRVJSX0lOVl9DSEFOICAgICAgMTAxMCAvKiBpbnZhbGlkIGNoYW5uZWwgbnVtYmVyICovIAorI2RlZmluZSBFUlJfQVNZTkNfVElNRSAgICAxMDExIC8qIHRpbWVvdXQgc2VuZGluZyBhc3luYyBkYXRhICovIAorCisKKworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2kyYy1kZXYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaTJjLWRldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MWQ0NzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2kyYy1kZXYuaApAQCAtMCwwICsxLDcxIEBACisvKgorICAgIGkyYy1kZXYuaCAtIGkyYy1idXMgZHJpdmVyLCBjaGFyIGRldmljZSBpbnRlcmZhY2UKKworICAgIENvcHlyaWdodCAoQykgMTk5NS05NyBTaW1vbiBHLiBWb2dsCisgICAgQ29weXJpZ2h0IChDKSAxOTk4LTk5IEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2lmbmRlZiBfTElOVVhfSTJDX0RFVl9ICisjZGVmaW5lIF9MSU5VWF9JMkNfREVWX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKworLyogL2Rldi9pMmMtWCBpb2N0bCBjb21tYW5kcy4gIFRoZSBpb2N0bCdzIHBhcmFtZXRlciBpcyBhbHdheXMgYW4KKyAqIHVuc2lnbmVkIGxvbmcsIGV4Y2VwdCBmb3I6CisgKgktIEkyQ19GVU5DUywgdGFrZXMgcG9pbnRlciB0byBhbiB1bnNpZ25lZCBsb25nCisgKgktIEkyQ19SRFdSLCB0YWtlcyBwb2ludGVyIHRvIHN0cnVjdCBpMmNfcmR3cl9pb2N0bF9kYXRhCisgKgktIEkyQ19TTUJVUywgdGFrZXMgcG9pbnRlciB0byBzdHJ1Y3QgaTJjX3NtYnVzX2lvY3RsX2RhdGEKKyAqLworI2RlZmluZSBJMkNfUkVUUklFUwkweDA3MDEJLyogbnVtYmVyIG9mIHRpbWVzIGEgZGV2aWNlIGFkZHJlc3Mgc2hvdWxkCisJCQkJICAgYmUgcG9sbGVkIHdoZW4gbm90IGFja25vd2xlZGdpbmcgKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVQJMHgwNzAyCS8qIHNldCB0aW1lb3V0IGluIHVuaXRzIG9mIDEwIG1zICovCisKKy8qIE5PVEU6IFNsYXZlIGFkZHJlc3MgaXMgNyBvciAxMCBiaXRzLCBidXQgMTAtYml0IGFkZHJlc3NlcworICogYXJlIE5PVCBzdXBwb3J0ZWQhIChkdWUgdG8gY29kZSBicm9rZW5uZXNzKQorICovCisjZGVmaW5lIEkyQ19TTEFWRQkweDA3MDMJLyogVXNlIHRoaXMgc2xhdmUgYWRkcmVzcyAqLworI2RlZmluZSBJMkNfU0xBVkVfRk9SQ0UJMHgwNzA2CS8qIFVzZSB0aGlzIHNsYXZlIGFkZHJlc3MsIGV2ZW4gaWYgaXQKKwkJCQkgICBpcyBhbHJlYWR5IGluIHVzZSBieSBhIGRyaXZlciEgKi8KKyNkZWZpbmUgSTJDX1RFTkJJVAkweDA3MDQJLyogMCBmb3IgNyBiaXQgYWRkcnMsICE9IDAgZm9yIDEwIGJpdCAqLworCisjZGVmaW5lIEkyQ19GVU5DUwkweDA3MDUJLyogR2V0IHRoZSBhZGFwdGVyIGZ1bmN0aW9uYWxpdHkgbWFzayAqLworCisjZGVmaW5lIEkyQ19SRFdSCTB4MDcwNwkvKiBDb21iaW5lZCBSL1cgdHJhbnNmZXIgKG9uZSBTVE9QIG9ubHkpICovCisKKyNkZWZpbmUgSTJDX1BFQwkJMHgwNzA4CS8qICE9IDAgdG8gdXNlIFBFQyB3aXRoIFNNQnVzICovCisjZGVmaW5lIEkyQ19TTUJVUwkweDA3MjAJLyogU01CdXMgdHJhbnNmZXIgKi8KKworCisvKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgYXMgdXNlZCBpbiB0aGUgSTJDX1NNQlVTIGlvY3RsIGNhbGwgKi8KK3N0cnVjdCBpMmNfc21idXNfaW9jdGxfZGF0YSB7CisJX191OCByZWFkX3dyaXRlOworCV9fdTggY29tbWFuZDsKKwlfX3UzMiBzaXplOworCXVuaW9uIGkyY19zbWJ1c19kYXRhICpkYXRhOworfTsKKworLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIGFzIHVzZWQgaW4gdGhlIEkyQ19SRFdSIGlvY3RsIGNhbGwgKi8KK3N0cnVjdCBpMmNfcmR3cl9pb2N0bF9kYXRhIHsKKwlzdHJ1Y3QgaTJjX21zZyAqbXNnczsJLyogcG9pbnRlcnMgdG8gaTJjX21zZ3MgKi8KKwlfX3UzMiBubXNnczsJCQkvKiBudW1iZXIgb2YgaTJjX21zZ3MgKi8KK307CisKKyNkZWZpbmUgIEkyQ19SRFJXX0lPQ1RMX01BWF9NU0dTCTQyCisKKworI2VuZGlmIC8qIF9MSU5VWF9JMkNfREVWX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaTJjLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2kyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjA0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2kyYy5oCkBAIC0wLDAgKzEsMTQ4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgkJCQkJCQkJCSAgICAgKi8KKy8qIGkyYy5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBpMmMtYnVzIGludGVyZmFjZQkJCSAgICAgKi8KKy8qCQkJCQkJCQkJICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBTaW1vbiBHLiBWb2dsCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4JCSAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogV2l0aCBzb21lIGNoYW5nZXMgZnJvbSBLecO2c3RpIE3DpGxra2kgPGttYWxra2lAY2MuaHV0LmZpPiBhbmQKKyAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gKi8KKworI2lmbmRlZiBfTElOVVhfSTJDX0gKKyNkZWZpbmUgX0xJTlVYX0kyQ19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKioKKyAqIHN0cnVjdCBpMmNfbXNnIC0gYW4gSTJDIHRyYW5zYWN0aW9uIHNlZ21lbnQgYmVnaW5uaW5nIHdpdGggU1RBUlQKKyAqIEBhZGRyOiBTbGF2ZSBhZGRyZXNzLCBlaXRoZXIgc2V2ZW4gb3IgdGVuIGJpdHMuICBXaGVuIHRoaXMgaXMgYSB0ZW4KKyAqCWJpdCBhZGRyZXNzLCBJMkNfTV9URU4gbXVzdCBiZSBzZXQgaW4gQGZsYWdzIGFuZCB0aGUgYWRhcHRlcgorICoJbXVzdCBzdXBwb3J0IEkyQ19GVU5DXzEwQklUX0FERFIuCisgKiBAZmxhZ3M6IEkyQ19NX1JEIGlzIGhhbmRsZWQgYnkgYWxsIGFkYXB0ZXJzLiAgTm8gb3RoZXIgZmxhZ3MgbWF5IGJlCisgKglwcm92aWRlZCB1bmxlc3MgdGhlIGFkYXB0ZXIgZXhwb3J0ZWQgdGhlIHJlbGV2YW50IEkyQ19GVU5DXyoKKyAqCWZsYWdzIHRocm91Z2ggaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoKS4KKyAqIEBsZW46IE51bWJlciBvZiBkYXRhIGJ5dGVzIGluIEBidWYgYmVpbmcgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gdGhlCisgKglJMkMgc2xhdmUgYWRkcmVzcy4gIEZvciByZWFkIHRyYW5zYWN0aW9ucyB3aGVyZSBJMkNfTV9SRUNWX0xFTgorICoJaXMgc2V0LCB0aGUgY2FsbGVyIGd1YXJhbnRlZXMgdGhhdCB0aGlzIGJ1ZmZlciBjYW4gaG9sZCB1cCB0bworICoJMzIgYnl0ZXMgaW4gYWRkaXRpb24gdG8gdGhlIGluaXRpYWwgbGVuZ3RoIGJ5dGUgc2VudCBieSB0aGUKKyAqCXNsYXZlIChwbHVzLCBpZiB1c2VkLCB0aGUgU01CdXMgUEVDKTsgYW5kIHRoaXMgdmFsdWUgd2lsbCBiZQorICoJaW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBibG9jayBkYXRhIGJ5dGVzIHJlY2VpdmVkLgorICogQGJ1ZjogVGhlIGJ1ZmZlciBpbnRvIHdoaWNoIGRhdGEgaXMgcmVhZCwgb3IgZnJvbSB3aGljaCBpdCdzIHdyaXR0ZW4uCisgKgorICogQW4gaTJjX21zZyBpcyB0aGUgbG93IGxldmVsIHJlcHJlc2VudGF0aW9uIG9mIG9uZSBzZWdtZW50IG9mIGFuIEkyQworICogdHJhbnNhY3Rpb24uICBJdCBpcyB2aXNpYmxlIHRvIGRyaXZlcnMgaW4gdGhlIEBpMmNfdHJhbnNmZXIoKSBwcm9jZWR1cmUsCisgKiB0byB1c2Vyc3BhY2UgZnJvbSBpMmMtZGV2LCBhbmQgdG8gSTJDIGFkYXB0ZXIgZHJpdmVycyB0aHJvdWdoIHRoZQorICogQGkyY19hZGFwdGVyLkBtYXN0ZXJfeGZlcigpIG1ldGhvZC4KKyAqCisgKiBFeGNlcHQgd2hlbiBJMkMgInByb3RvY29sIG1hbmdsaW5nIiBpcyB1c2VkLCBhbGwgSTJDIGFkYXB0ZXJzIGltcGxlbWVudAorICogdGhlIHN0YW5kYXJkIHJ1bGVzIGZvciBJMkMgdHJhbnNhY3Rpb25zLiAgRWFjaCB0cmFuc2FjdGlvbiBiZWdpbnMgd2l0aCBhCisgKiBTVEFSVC4gIFRoYXQgaXMgZm9sbG93ZWQgYnkgdGhlIHNsYXZlIGFkZHJlc3MsIGFuZCBhIGJpdCBlbmNvZGluZyByZWFkCisgKiB2ZXJzdXMgd3JpdGUuICBUaGVuIGZvbGxvdyBhbGwgdGhlIGRhdGEgYnl0ZXMsIHBvc3NpYmx5IGluY2x1ZGluZyBhIGJ5dGUKKyAqIHdpdGggU01CdXMgUEVDLiAgVGhlIHRyYW5zZmVyIHRlcm1pbmF0ZXMgd2l0aCBhIE5BSywgb3Igd2hlbiBhbGwgdGhvc2UKKyAqIGJ5dGVzIGhhdmUgYmVlbiB0cmFuc2ZlcnJlZCBhbmQgQUNLZWQuICBJZiB0aGlzIGlzIHRoZSBsYXN0IG1lc3NhZ2UgaW4gYQorICogZ3JvdXAsIGl0IGlzIGZvbGxvd2VkIGJ5IGEgU1RPUC4gIE90aGVyd2lzZSBpdCBpcyBmb2xsb3dlZCBieSB0aGUgbmV4dAorICogQGkyY19tc2cgdHJhbnNhY3Rpb24gc2VnbWVudCwgYmVnaW5uaW5nIHdpdGggYSAocmVwZWF0ZWQpIFNUQVJULgorICoKKyAqIEFsdGVybmF0aXZlbHksIHdoZW4gdGhlIGFkYXB0ZXIgc3VwcG9ydHMgSTJDX0ZVTkNfUFJPVE9DT0xfTUFOR0xJTkcgdGhlbgorICogcGFzc2luZyBjZXJ0YWluIEBmbGFncyBtYXkgaGF2ZSBjaGFuZ2VkIHRob3NlIHN0YW5kYXJkIHByb3RvY29sIGJlaGF2aW9ycy4KKyAqIFRob3NlIGZsYWdzIGFyZSBvbmx5IGZvciB1c2Ugd2l0aCBicm9rZW4vbm9uY29uZm9ybWluZyBzbGF2ZXMsIGFuZCB3aXRoCisgKiBhZGFwdGVycyB3aGljaCBhcmUga25vd24gdG8gc3VwcG9ydCB0aGUgc3BlY2lmaWMgbWFuZ2xpbmcgb3B0aW9ucyB0aGV5CisgKiBuZWVkIChvbmUgb3IgbW9yZSBvZiBJR05PUkVfTkFLLCBOT19SRF9BQ0ssIE5PU1RBUlQsIGFuZCBSRVZfRElSX0FERFIpLgorICovCitzdHJ1Y3QgaTJjX21zZyB7CisJX191MTYgYWRkcjsJLyogc2xhdmUgYWRkcmVzcwkJCSovCisJX191MTYgZmxhZ3M7CisjZGVmaW5lIEkyQ19NX1RFTgkJMHgwMDEwCS8qIHRoaXMgaXMgYSB0ZW4gYml0IGNoaXAgYWRkcmVzcyAqLworI2RlZmluZSBJMkNfTV9SRAkJMHgwMDAxCS8qIHJlYWQgZGF0YSwgZnJvbSBzbGF2ZSB0byBtYXN0ZXIgKi8KKyNkZWZpbmUgSTJDX01fTk9TVEFSVAkJMHg0MDAwCS8qIGlmIEkyQ19GVU5DX1BST1RPQ09MX01BTkdMSU5HICovCisjZGVmaW5lIEkyQ19NX1JFVl9ESVJfQUREUgkweDIwMDAJLyogaWYgSTJDX0ZVTkNfUFJPVE9DT0xfTUFOR0xJTkcgKi8KKyNkZWZpbmUgSTJDX01fSUdOT1JFX05BSwkweDEwMDAJLyogaWYgSTJDX0ZVTkNfUFJPVE9DT0xfTUFOR0xJTkcgKi8KKyNkZWZpbmUgSTJDX01fTk9fUkRfQUNLCQkweDA4MDAJLyogaWYgSTJDX0ZVTkNfUFJPVE9DT0xfTUFOR0xJTkcgKi8KKyNkZWZpbmUgSTJDX01fUkVDVl9MRU4JCTB4MDQwMAkvKiBsZW5ndGggd2lsbCBiZSBmaXJzdCByZWNlaXZlZCBieXRlICovCisJX191MTYgbGVuOwkJLyogbXNnIGxlbmd0aAkJCQkqLworCV9fdTggKmJ1ZjsJCS8qIHBvaW50ZXIgdG8gbXNnIGRhdGEJCQkqLworfTsKKworLyogVG8gZGV0ZXJtaW5lIHdoYXQgZnVuY3Rpb25hbGl0eSBpcyBwcmVzZW50ICovCisKKyNkZWZpbmUgSTJDX0ZVTkNfSTJDCQkJMHgwMDAwMDAwMQorI2RlZmluZSBJMkNfRlVOQ18xMEJJVF9BRERSCQkweDAwMDAwMDAyCisjZGVmaW5lIEkyQ19GVU5DX1BST1RPQ09MX01BTkdMSU5HCTB4MDAwMDAwMDQgLyogSTJDX01fTk9TVEFSVCBldGMuICovCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1BFQwkJMHgwMDAwMDAwOAorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19CTE9DS19QUk9DX0NBTEwJMHgwMDAwODAwMCAvKiBTTUJ1cyAyLjAgKi8KKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUVVJQ0sJCTB4MDAwMTAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFCTB4MDAwMjAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURQkweDAwMDQwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBCTB4MDAwODAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBCTB4MDAxMDAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9XT1JEX0RBVEEJMHgwMDIwMDAwMAorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9XT1JEX0RBVEEJMHgwMDQwMDAwMAorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19QUk9DX0NBTEwJMHgwMDgwMDAwMAorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19SRUFEX0JMT0NLX0RBVEEJMHgwMTAwMDAwMAorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9CTE9DS19EQVRBIDB4MDIwMDAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0sJMHgwNDAwMDAwMCAvKiBJMkMtbGlrZSBibG9jayB4ZmVyICAqLworI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9JMkNfQkxPQ0sJMHgwODAwMDAwMCAvKiB3LyAxLWJ5dGUgcmVnLiBhZGRyLiAqLworCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX0JZVEUJCShJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEUgfCBcCisJCQkJCSBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFKQorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEJKEkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBIHwgXAorCQkJCQkgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBKQorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEJKEkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBIHwgXAorCQkJCQkgSTJDX0ZVTkNfU01CVVNfV1JJVEVfV09SRF9EQVRBKQorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBCShJMkNfRlVOQ19TTUJVU19SRUFEX0JMT0NLX0RBVEEgfCBcCisJCQkJCSBJMkNfRlVOQ19TTUJVU19XUklURV9CTE9DS19EQVRBKQorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19JMkNfQkxPQ0sJKEkyQ19GVU5DX1NNQlVTX1JFQURfSTJDX0JMT0NLIHwgXAorCQkJCQkgSTJDX0ZVTkNfU01CVVNfV1JJVEVfSTJDX0JMT0NLKQorCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX0VNVUwJCShJMkNfRlVOQ19TTUJVU19RVUlDSyB8IFwKKwkJCQkJIEkyQ19GVU5DX1NNQlVTX0JZVEUgfCBcCisJCQkJCSBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBcCisJCQkJCSBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfCBcCisJCQkJCSBJMkNfRlVOQ19TTUJVU19QUk9DX0NBTEwgfCBcCisJCQkJCSBJMkNfRlVOQ19TTUJVU19XUklURV9CTE9DS19EQVRBIHwgXAorCQkJCQkgSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLIHwgXAorCQkJCQkgSTJDX0ZVTkNfU01CVVNfUEVDKQorCisvKgorICogRGF0YSBmb3IgU01CdXMgTWVzc2FnZXMKKyAqLworI2RlZmluZSBJMkNfU01CVVNfQkxPQ0tfTUFYCTMyCS8qIEFzIHNwZWNpZmllZCBpbiBTTUJ1cyBzdGFuZGFyZCAqLwordW5pb24gaTJjX3NtYnVzX2RhdGEgeworCV9fdTggYnl0ZTsKKwlfX3UxNiB3b3JkOworCV9fdTggYmxvY2tbSTJDX1NNQlVTX0JMT0NLX01BWCArIDJdOyAvKiBibG9ja1swXSBpcyB1c2VkIGZvciBsZW5ndGggKi8KKwkJCSAgICAgICAvKiBhbmQgb25lIG1vcmUgZm9yIHVzZXItc3BhY2UgY29tcGF0aWJpbGl0eSAqLworfTsKKworLyogaTJjX3NtYnVzX3hmZXIgcmVhZCBvciB3cml0ZSBtYXJrZXJzICovCisjZGVmaW5lIEkyQ19TTUJVU19SRUFECTEKKyNkZWZpbmUgSTJDX1NNQlVTX1dSSVRFCTAKKworLyogU01CdXMgdHJhbnNhY3Rpb24gdHlwZXMgKHNpemUgcGFyYW1ldGVyIGluIHRoZSBhYm92ZSBmdW5jdGlvbnMpCisgICBOb3RlOiB0aGVzZSBubyBsb25nZXIgY29ycmVzcG9uZCB0byB0aGUgKGFyYml0cmFyeSkgUElJWDQgaW50ZXJuYWwgY29kZXMhICovCisjZGVmaW5lIEkyQ19TTUJVU19RVUlDSwkJICAgIDAKKyNkZWZpbmUgSTJDX1NNQlVTX0JZVEUJCSAgICAxCisjZGVmaW5lIEkyQ19TTUJVU19CWVRFX0RBVEEJICAgIDIKKyNkZWZpbmUgSTJDX1NNQlVTX1dPUkRfREFUQQkgICAgMworI2RlZmluZSBJMkNfU01CVVNfUFJPQ19DQUxMCSAgICA0CisjZGVmaW5lIEkyQ19TTUJVU19CTE9DS19EQVRBCSAgICA1CisjZGVmaW5lIEkyQ19TTUJVU19JMkNfQkxPQ0tfQlJPS0VOICA2CisjZGVmaW5lIEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTEwgICA3CQkvKiBTTUJ1cyAyLjAgKi8KKyNkZWZpbmUgSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBICAgIDgKKworI2VuZGlmIC8qIF9MSU5VWF9JMkNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pMm8tZGV2LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2kyby1kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzU4MGI2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pMm8tZGV2LmgKQEAgLTAsMCArMSw0MjEgQEAKKy8qCisgKiBJMk8gdXNlciBzcGFjZSBhY2Nlc3NpYmxlIHN0cnVjdHVyZXMvQVBJcworICoKKyAqIChjKSBDb3B5cmlnaHQgMTk5OSwgMjAwMCBSZWQgSGF0IFNvZnR3YXJlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgSTJPIEFQSXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIGJvdGgKKyAqIHRoZSBrZXJuZWwgYW5kIHVzZXIgbGV2ZWwgYXBwbGljYXRpb25zLiAgS2VybmVsIHNwZWNpZmljIHN0cnVjdHVyZXMKKyAqIGFyZSBkZWZpbmVkIGluIGkyb19vc20uIE9TTXMgc2hvdWxkIGluY2x1ZGUgX29ubHlfIGkyb19vc20uaCB3aGljaAorICogYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGlzIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX0kyT19ERVZfSAorI2RlZmluZSBfSTJPX0RFVl9ICisKKy8qIEhvdyBtYW55IGNvbnRyb2xsZXJzIGFyZSB3ZSBhbGxvd2luZyAqLworI2RlZmluZSBNQVhfSTJPX0NPTlRST0xMRVJTCTMyCisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBJMk8gQ29udHJvbCBJT0NUTHMgYW5kIHN0cnVjdHVyZXMKKyAqLworI2RlZmluZSBJMk9fTUFHSUNfTlVNQkVSCSdpJworI2RlZmluZSBJMk9HRVRJT1BTCQlfSU9SKEkyT19NQUdJQ19OVU1CRVIsMCxfX3U4W01BWF9JMk9fQ09OVFJPTExFUlNdKQorI2RlZmluZSBJMk9IUlRHRVQJCV9JT1dSKEkyT19NQUdJQ19OVU1CRVIsMSxzdHJ1Y3QgaTJvX2NtZF9ocnRsY3QpCisjZGVmaW5lIEkyT0xDVEdFVAkJX0lPV1IoSTJPX01BR0lDX05VTUJFUiwyLHN0cnVjdCBpMm9fY21kX2hydGxjdCkKKyNkZWZpbmUgSTJPUEFSTVNFVAkJX0lPV1IoSTJPX01BR0lDX05VTUJFUiwzLHN0cnVjdCBpMm9fY21kX3BzZXRnZXQpCisjZGVmaW5lIEkyT1BBUk1HRVQJCV9JT1dSKEkyT19NQUdJQ19OVU1CRVIsNCxzdHJ1Y3QgaTJvX2NtZF9wc2V0Z2V0KQorI2RlZmluZSBJMk9TV0RMIAkJX0lPV1IoSTJPX01BR0lDX05VTUJFUiw1LHN0cnVjdCBpMm9fc3dfeGZlcikKKyNkZWZpbmUgSTJPU1dVTCAJCV9JT1dSKEkyT19NQUdJQ19OVU1CRVIsNixzdHJ1Y3QgaTJvX3N3X3hmZXIpCisjZGVmaW5lIEkyT1NXREVMCQlfSU9XUihJMk9fTUFHSUNfTlVNQkVSLDcsc3RydWN0IGkyb19zd194ZmVyKQorI2RlZmluZSBJMk9WQUxJREFURQkJX0lPUihJMk9fTUFHSUNfTlVNQkVSLDgsX191MzIpCisjZGVmaW5lIEkyT0hUTUwgCQlfSU9XUihJMk9fTUFHSUNfTlVNQkVSLDksc3RydWN0IGkyb19odG1sKQorI2RlZmluZSBJMk9FVlRSRUcJCV9JT1coSTJPX01BR0lDX05VTUJFUiwxMCxzdHJ1Y3QgaTJvX2V2dF9pZCkKKyNkZWZpbmUgSTJPRVZUR0VUCQlfSU9SKEkyT19NQUdJQ19OVU1CRVIsMTEsc3RydWN0IGkyb19ldnRfaW5mbykKKyNkZWZpbmUgSTJPUEFTU1RIUlUJCV9JT1IoSTJPX01BR0lDX05VTUJFUiwxMixzdHJ1Y3QgaTJvX2NtZF9wYXNzdGhydSkKKyNkZWZpbmUgSTJPUEFTU1RIUlUzMgkJX0lPUihJMk9fTUFHSUNfTlVNQkVSLDEyLHN0cnVjdCBpMm9fY21kX3Bhc3N0aHJ1MzIpCisKK3N0cnVjdCBpMm9fY21kX3Bhc3N0aHJ1MzIgeworCXVuc2lnbmVkIGludCBpb3A7CS8qIElPUCB1bml0IG51bWJlciAqLworCV9fdTMyIG1zZzsJCS8qIG1lc3NhZ2UgKi8KK307CisKK3N0cnVjdCBpMm9fY21kX3Bhc3N0aHJ1IHsKKwl1bnNpZ25lZCBpbnQgaW9wOwkvKiBJT1AgdW5pdCBudW1iZXIgKi8KKwl2b2lkICptc2c7CS8qIG1lc3NhZ2UgKi8KK307CisKK3N0cnVjdCBpMm9fY21kX2hydGxjdCB7CisJdW5zaWduZWQgaW50IGlvcDsJLyogSU9QIHVuaXQgbnVtYmVyICovCisJdm9pZCAqcmVzYnVmOwkvKiBCdWZmZXIgZm9yIHJlc3VsdCAqLworCXVuc2lnbmVkIGludCAqcmVzbGVuOwkvKiBCdWZmZXIgbGVuZ3RoIGluIGJ5dGVzICovCit9OworCitzdHJ1Y3QgaTJvX2NtZF9wc2V0Z2V0IHsKKwl1bnNpZ25lZCBpbnQgaW9wOwkvKiBJT1AgdW5pdCBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgdGlkOwkvKiBUYXJnZXQgZGV2aWNlIFRJRCAqLworCXZvaWQgKm9wYnVmOwkvKiBPcGVyYXRpb24gTGlzdCBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgb3BsZW47CS8qIE9wZXJhdGlvbiBMaXN0IGJ1ZmZlciBsZW5ndGggaW4gYnl0ZXMgKi8KKwl2b2lkICpyZXNidWY7CS8qIFJlc3VsdCBMaXN0IGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCAqcmVzbGVuOwkvKiBSZXN1bHQgTGlzdCBidWZmZXIgbGVuZ3RoIGluIGJ5dGVzICovCit9OworCitzdHJ1Y3QgaTJvX3N3X3hmZXIgeworCXVuc2lnbmVkIGludCBpb3A7CS8qIElPUCB1bml0IG51bWJlciAqLworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CS8qIEZsYWdzIGZpZWxkICovCisJdW5zaWduZWQgY2hhciBzd190eXBlOwkvKiBTb2Z0d2FyZSB0eXBlICovCisJdW5zaWduZWQgaW50IHN3X2lkOwkvKiBTb2Z0d2FyZSBJRCAqLworCXZvaWQgKmJ1ZjsJLyogUG9pbnRlciB0byBzb2Z0d2FyZSBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgKnN3bGVuOwkvKiBMZW5ndGggb2Ygc29mdHdhcmUgZGF0YSAqLworCXVuc2lnbmVkIGludCAqbWF4ZnJhZzsJLyogTWF4aW11bSBmcmFnbWVudCBjb3VudCAqLworCXVuc2lnbmVkIGludCAqY3VyZnJhZzsJLyogQ3VycmVudCBmcmFnbWVudCBjb3VudCAqLworfTsKKworc3RydWN0IGkyb19odG1sIHsKKwl1bnNpZ25lZCBpbnQgaW9wOwkvKiBJT1AgdW5pdCBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgdGlkOwkvKiBUYXJnZXQgZGV2aWNlIElEICovCisJdW5zaWduZWQgaW50IHBhZ2U7CS8qIEhUTUwgcGFnZSAqLworCXZvaWQgKnJlc2J1ZjsJLyogQnVmZmVyIGZvciByZXBseSBIVE1MIHBhZ2UgKi8KKwl1bnNpZ25lZCBpbnQgKnJlc2xlbjsJLyogTGVuZ3RoIGluIGJ5dGVzIG9mIHJlcGx5IGJ1ZmZlciAqLworCXZvaWQgKnFidWY7CS8qIFBvaW50ZXIgdG8gSFRUUCBxdWVyeSBzdHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQgcWxlbjsJLyogTGVuZ3RoIGluIGJ5dGVzIG9mIHF1ZXJ5IHN0cmluZyBidWZmZXIgKi8KK307CisKKyNkZWZpbmUgSTJPX0VWVF9RX0xFTiAzMgorCitzdHJ1Y3QgaTJvX2V2dF9pZCB7CisJdW5zaWduZWQgaW50IGlvcDsKKwl1bnNpZ25lZCBpbnQgdGlkOworCXVuc2lnbmVkIGludCBldnRfbWFzazsKK307CisKKy8qIEV2ZW50IGRhdGEgc2l6ZSA9IGZyYW1lIHNpemUgLSBtZXNzYWdlIGhlYWRlciArIGV2dCBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgSTJPX0VWVF9EQVRBX1NJWkUgODgKKworc3RydWN0IGkyb19ldnRfaW5mbyB7CisJc3RydWN0IGkyb19ldnRfaWQgaWQ7CisJdW5zaWduZWQgY2hhciBldnRfZGF0YVtJMk9fRVZUX0RBVEFfU0laRV07CisJdW5zaWduZWQgaW50IGRhdGFfc2l6ZTsKK307CisKK3N0cnVjdCBpMm9fZXZ0X2dldCB7CisJc3RydWN0IGkyb19ldnRfaW5mbyBpbmZvOworCWludCBwZW5kaW5nOworCWludCBsb3N0OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgaTJvX3NnX2lvX2hkciB7CisJdW5zaWduZWQgaW50IGZsYWdzOwkvKiBzZWUgSTJPX0RQVF9TR19JT19GTEFHUyAqLworfSBpMm9fc2dfaW9faGRyX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSFJUIHJlbGF0ZWQgY29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEkyT19CVVNfTE9DQUwJMAorI2RlZmluZSBJMk9fQlVTX0lTQQkxCisjZGVmaW5lIEkyT19CVVNfRUlTQQkyCisjZGVmaW5lIEkyT19CVVNfTUNBCTMKKyNkZWZpbmUgSTJPX0JVU19QQ0kJNAorI2RlZmluZSBJMk9fQlVTX1BDTUNJQQk1CisjZGVmaW5lIEkyT19CVVNfTlVCVVMJNgorI2RlZmluZSBJMk9fQlVTX0NBUkRCVVMgNworI2RlZmluZSBJMk9fQlVTX1VOS05PV04gMHg4MAorCit0eXBlZGVmIHN0cnVjdCBfaTJvX3BjaV9idXMgeworCV9fdTggUGNpRnVuY3Rpb25OdW1iZXI7CisJX191OCBQY2lEZXZpY2VOdW1iZXI7CisJX191OCBQY2lCdXNOdW1iZXI7CisJX191OCByZXNlcnZlZDsKKwlfX3UxNiBQY2lWZW5kb3JJRDsKKwlfX3UxNiBQY2lEZXZpY2VJRDsKK30gaTJvX3BjaV9idXM7CisKK3R5cGVkZWYgc3RydWN0IF9pMm9fbG9jYWxfYnVzIHsKKwlfX3UxNiBMYkJhc2VJT1BvcnQ7CisJX191MTYgcmVzZXJ2ZWQ7CisJX191MzIgTGJCYXNlTWVtb3J5QWRkcmVzczsKK30gaTJvX2xvY2FsX2J1czsKKwordHlwZWRlZiBzdHJ1Y3QgX2kyb19pc2FfYnVzIHsKKwlfX3UxNiBJc2FCYXNlSU9Qb3J0OworCV9fdTggQ1NOOworCV9fdTggcmVzZXJ2ZWQ7CisJX191MzIgSXNhQmFzZU1lbW9yeUFkZHJlc3M7Cit9IGkyb19pc2FfYnVzOworCit0eXBlZGVmIHN0cnVjdCBfaTJvX2Vpc2FfYnVzX2luZm8geworCV9fdTE2IEVpc2FCYXNlSU9Qb3J0OworCV9fdTggcmVzZXJ2ZWQ7CisJX191OCBFaXNhU2xvdE51bWJlcjsKKwlfX3UzMiBFaXNhQmFzZU1lbW9yeUFkZHJlc3M7Cit9IGkyb19laXNhX2J1czsKKwordHlwZWRlZiBzdHJ1Y3QgX2kyb19tY2FfYnVzIHsKKwlfX3UxNiBNY2FCYXNlSU9Qb3J0OworCV9fdTggcmVzZXJ2ZWQ7CisJX191OCBNY2FTbG90TnVtYmVyOworCV9fdTMyIE1jYUJhc2VNZW1vcnlBZGRyZXNzOworfSBpMm9fbWNhX2J1czsKKwordHlwZWRlZiBzdHJ1Y3QgX2kyb19vdGhlcl9idXMgeworCV9fdTE2IEJhc2VJT1BvcnQ7CisJX191MTYgcmVzZXJ2ZWQ7CisJX191MzIgQmFzZU1lbW9yeUFkZHJlc3M7Cit9IGkyb19vdGhlcl9idXM7CisKK3R5cGVkZWYgc3RydWN0IF9pMm9faHJ0X2VudHJ5IHsKKwlfX3UzMiBhZGFwdGVyX2lkOworCV9fdTMyIHBhcmVudF90aWQ6MTI7CisJX191MzIgc3RhdGU6NDsKKwlfX3UzMiBidXNfbnVtOjg7CisJX191MzIgYnVzX3R5cGU6ODsKKwl1bmlvbiB7CisJCWkyb19wY2lfYnVzIHBjaV9idXM7CisJCWkyb19sb2NhbF9idXMgbG9jYWxfYnVzOworCQlpMm9faXNhX2J1cyBpc2FfYnVzOworCQlpMm9fZWlzYV9idXMgZWlzYV9idXM7CisJCWkyb19tY2FfYnVzIG1jYV9idXM7CisJCWkyb19vdGhlcl9idXMgb3RoZXJfYnVzOworCX0gYnVzOworfSBpMm9faHJ0X2VudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfaTJvX2hydCB7CisJX191MTYgbnVtX2VudHJpZXM7CisJX191OCBlbnRyeV9sZW47CisJX191OCBocnRfdmVyc2lvbjsKKwlfX3UzMiBjaGFuZ2VfaW5kOworCWkyb19ocnRfZW50cnkgaHJ0X2VudHJ5WzFdOworfSBpMm9faHJ0OworCit0eXBlZGVmIHN0cnVjdCBfaTJvX2xjdF9lbnRyeSB7CisJX191MzIgZW50cnlfc2l6ZToxNjsKKwlfX3UzMiB0aWQ6MTI7CisJX191MzIgcmVzZXJ2ZWQ6NDsKKwlfX3UzMiBjaGFuZ2VfaW5kOworCV9fdTMyIGRldmljZV9mbGFnczsKKwlfX3UzMiBjbGFzc19pZDoxMjsKKwlfX3UzMiB2ZXJzaW9uOjQ7CisJX191MzIgdmVuZG9yX2lkOjE2OworCV9fdTMyIHN1Yl9jbGFzczsKKwlfX3UzMiB1c2VyX3RpZDoxMjsKKwlfX3UzMiBwYXJlbnRfdGlkOjEyOworCV9fdTMyIGJpb3NfaW5mbzo4OworCV9fdTggaWRlbnRpdHlfdGFnWzhdOworCV9fdTMyIGV2ZW50X2NhcGFiaWxpdGllczsKK30gaTJvX2xjdF9lbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgX2kyb19sY3QgeworCV9fdTMyIHRhYmxlX3NpemU6MTY7CisJX191MzIgYm9vdF90aWQ6MTI7CisJX191MzIgbGN0X3Zlcjo0OworCV9fdTMyIGlvcF9mbGFnczsKKwlfX3UzMiBjaGFuZ2VfaW5kOworCWkyb19sY3RfZW50cnkgbGN0X2VudHJ5WzFdOworfSBpMm9fbGN0OworCit0eXBlZGVmIHN0cnVjdCBfaTJvX3N0YXR1c19ibG9jayB7CisJX191MTYgb3JnX2lkOworCV9fdTE2IHJlc2VydmVkOworCV9fdTE2IGlvcF9pZDoxMjsKKwlfX3UxNiByZXNlcnZlZDE6NDsKKwlfX3UxNiBob3N0X3VuaXRfaWQ7CisJX191MTYgc2VnbWVudF9udW1iZXI6MTI7CisJX191MTYgaTJvX3ZlcnNpb246NDsKKwlfX3U4IGlvcF9zdGF0ZTsKKwlfX3U4IG1zZ190eXBlOworCV9fdTE2IGluYm91bmRfZnJhbWVfc2l6ZTsKKwlfX3U4IGluaXRfY29kZTsKKwlfX3U4IHJlc2VydmVkMjsKKwlfX3UzMiBtYXhfaW5ib3VuZF9mcmFtZXM7CisJX191MzIgY3VyX2luYm91bmRfZnJhbWVzOworCV9fdTMyIG1heF9vdXRib3VuZF9mcmFtZXM7CisJY2hhciBwcm9kdWN0X2lkWzI0XTsKKwlfX3UzMiBleHBlY3RlZF9sY3Rfc2l6ZTsKKwlfX3UzMiBpb3BfY2FwYWJpbGl0aWVzOworCV9fdTMyIGRlc2lyZWRfbWVtX3NpemU7CisJX191MzIgY3VycmVudF9tZW1fc2l6ZTsKKwlfX3UzMiBjdXJyZW50X21lbV9iYXNlOworCV9fdTMyIGRlc2lyZWRfaW9fc2l6ZTsKKwlfX3UzMiBjdXJyZW50X2lvX3NpemU7CisJX191MzIgY3VycmVudF9pb19iYXNlOworCV9fdTMyIHJlc2VydmVkMzoyNDsKKwlfX3UzMiBjbWRfc3RhdHVzOjg7Cit9IGkyb19zdGF0dXNfYmxvY2s7CisKKy8qIEV2ZW50IGluZGljYXRvciBtYXNrIGZsYWdzICovCisjZGVmaW5lIEkyT19FVlRfSU5EX1NUQVRFX0NIQU5HRQkJMHg4MDAwMDAwMAorI2RlZmluZSBJMk9fRVZUX0lORF9HRU5FUkFMX1dBUk5JTkcJCTB4NDAwMDAwMDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfQ09ORklHVVJBVElPTl9GTEFHCQkweDIwMDAwMDAwCisjZGVmaW5lIEkyT19FVlRfSU5EX0xPQ0tfUkVMRUFTRQkJMHgxMDAwMDAwMAorI2RlZmluZSBJMk9fRVZUX0lORF9DQVBBQklMSVRZX0NIQU5HRQkJMHgwODAwMDAwMAorI2RlZmluZSBJMk9fRVZUX0lORF9ERVZJQ0VfUkVTRVQJCTB4MDQwMDAwMDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfRVZUX01BU0tfTU9ESUZJRUQJCTB4MDIwMDAwMDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfRklFTERfTU9ESUZJRUQJCTB4MDEwMDAwMDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfVkVORE9SX0VWVAkJCTB4MDA4MDAwMDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfREVWSUNFX1NUQVRFCQkweDAwNDAwMDAwCisKKy8qIEV4ZWN1dGl2ZSBldmVudCBpbmRpY2l0b3JzICovCisjZGVmaW5lIEkyT19FVlRfSU5EX0VYRUNfUkVTT1VSQ0VfTElNSVRTCTB4MDAwMDAwMDEKKyNkZWZpbmUgSTJPX0VWVF9JTkRfRVhFQ19DT05ORUNUSU9OX0ZBSUwJMHgwMDAwMDAwMgorI2RlZmluZSBJMk9fRVZUX0lORF9FWEVDX0FEQVBURVJfRkFVTFQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgSTJPX0VWVF9JTkRfRVhFQ19QT1dFUl9GQUlMCQkweDAwMDAwMDA4CisjZGVmaW5lIEkyT19FVlRfSU5EX0VYRUNfUkVTRVRfUEVORElORwkJMHgwMDAwMDAxMAorI2RlZmluZSBJMk9fRVZUX0lORF9FWEVDX1JFU0VUX0lNTUlORU5UIAkweDAwMDAwMDIwCisjZGVmaW5lIEkyT19FVlRfSU5EX0VYRUNfSFdfRkFJTAkJMHgwMDAwMDA0MAorI2RlZmluZSBJMk9fRVZUX0lORF9FWEVDX1hDVF9DSEFOR0UJCTB4MDAwMDAwODAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfRVhFQ19ORVdfTENUX0VOVFJZCQkweDAwMDAwMTAwCisjZGVmaW5lIEkyT19FVlRfSU5EX0VYRUNfTU9ESUZJRURfTENUCQkweDAwMDAwMjAwCisjZGVmaW5lIEkyT19FVlRfSU5EX0VYRUNfRERNX0FWQUlMQUJJTElUWQkweDAwMDAwNDAwCisKKy8qIFJhbmRvbSBCbG9jayBTdG9yYWdlIEV2ZW50IEluZGljYXRvcnMgKi8KKyNkZWZpbmUgSTJPX0VWVF9JTkRfQlNBX1ZPTFVNRV9MT0FECQkweDAwMDAwMDAxCisjZGVmaW5lIEkyT19FVlRfSU5EX0JTQV9WT0xVTUVfVU5MT0FECQkweDAwMDAwMDAyCisjZGVmaW5lIEkyT19FVlRfSU5EX0JTQV9WT0xVTUVfVU5MT0FEX1JFUQkweDAwMDAwMDA0CisjZGVmaW5lIEkyT19FVlRfSU5EX0JTQV9DQVBBQ0lUWV9DSEFOR0UgCTB4MDAwMDAwMDgKKyNkZWZpbmUgSTJPX0VWVF9JTkRfQlNBX1NDU0lfU01BUlQJCTB4MDAwMDAwMTAKKworLyogRXZlbnQgZGF0YSBmb3IgZ2VuZXJpYyBldmVudHMgKi8KKyNkZWZpbmUgSTJPX0VWVF9TVEFURV9DSEFOR0VfTk9STUFMCQkweDAwCisjZGVmaW5lIEkyT19FVlRfU1RBVEVfQ0hBTkdFX1NVU1BFTkRFRAkJMHgwMQorI2RlZmluZSBJMk9fRVZUX1NUQVRFX0NIQU5HRV9SRVNUQVJUCQkweDAyCisjZGVmaW5lIEkyT19FVlRfU1RBVEVfQ0hBTkdFX05BX1JFQ09WRVIgCTB4MDMKKyNkZWZpbmUgSTJPX0VWVF9TVEFURV9DSEFOR0VfTkFfTk9fUkVDT1ZFUgkweDA0CisjZGVmaW5lIEkyT19FVlRfU1RBVEVfQ0hBTkdFX1FVSUVTQ0VfUkVRVUVTVAkweDA1CisjZGVmaW5lIEkyT19FVlRfU1RBVEVfQ0hBTkdFX0ZBSUxFRAkJMHgxMAorI2RlZmluZSBJMk9fRVZUX1NUQVRFX0NIQU5HRV9GQVVMVEVECQkweDExCisKKyNkZWZpbmUgSTJPX0VWVF9HRU5fV0FSTklOR19OT1JNQUwJCTB4MDAKKyNkZWZpbmUgSTJPX0VWVF9HRU5fV0FSTklOR19FUlJPUl9USFJFU0hPTEQJMHgwMQorI2RlZmluZSBJMk9fRVZUX0dFTl9XQVJOSU5HX01FRElBX0ZBVUxUIAkweDAyCisKKyNkZWZpbmUgSTJPX0VWVF9DQVBBQklMSVRZX09USEVSCQkweDAxCisjZGVmaW5lIEkyT19FVlRfQ0FQQUJJTElUWV9DSEFOR0VECQkweDAyCisKKyNkZWZpbmUgSTJPX0VWVF9TRU5TT1JfU1RBVEVfQ0hBTkdFRAkJMHgwMQorCisvKgorICoJSTJPIGNsYXNzZXMgLyBzdWJjbGFzc2VzCisgKi8KKworLyogIENsYXNzIElEIGFuZCBDb2RlIEFzc2lnbm1lbnRzCisgKiAgKExDVC5DbGFzc0lELlZlcnNpb24gZmllbGQpCisgKi8KKyNkZWZpbmUgSTJPX0NMQVNTX1ZFUlNJT05fMTAJCQkweDAwCisjZGVmaW5lIEkyT19DTEFTU19WRVJTSU9OXzExCQkJMHgwMQorCisvKiAgQ2xhc3MgY29kZSBuYW1lcworICogIChmcm9tIHYxLjUgVGFibGUgNi0xIENsYXNzIENvZGUgQXNzaWdubWVudHMuKQorICovCisKKyNkZWZpbmUgSTJPX0NMQVNTX0VYRUNVVElWRQkJCTB4MDAwCisjZGVmaW5lIEkyT19DTEFTU19ERE0JCQkJMHgwMDEKKyNkZWZpbmUgSTJPX0NMQVNTX1JBTkRPTV9CTE9DS19TVE9SQUdFCQkweDAxMAorI2RlZmluZSBJMk9fQ0xBU1NfU0VRVUVOVElBTF9TVE9SQUdFCQkweDAxMQorI2RlZmluZSBJMk9fQ0xBU1NfTEFOCQkJCTB4MDIwCisjZGVmaW5lIEkyT19DTEFTU19XQU4JCQkJMHgwMzAKKyNkZWZpbmUgSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUE9SVAkJMHgwNDAKKyNkZWZpbmUgSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUEVSSVBIRVJBTAkweDA0MQorI2RlZmluZSBJMk9fQ0xBU1NfU0NTSV9QRVJJUEhFUkFMCQkweDA1MQorI2RlZmluZSBJMk9fQ0xBU1NfQVRFX1BPUlQJCQkweDA2MAorI2RlZmluZSBJMk9fQ0xBU1NfQVRFX1BFUklQSEVSQUwJCTB4MDYxCisjZGVmaW5lIEkyT19DTEFTU19GTE9QUFlfQ09OVFJPTExFUgkJMHgwNzAKKyNkZWZpbmUgSTJPX0NMQVNTX0ZMT1BQWV9ERVZJQ0UgCQkweDA3MQorI2RlZmluZSBJMk9fQ0xBU1NfQlVTX0FEQVBURVIJCQkweDA4MAorI2RlZmluZSBJMk9fQ0xBU1NfUEVFUl9UUkFOU1BPUlRfQUdFTlQJCTB4MDkwCisjZGVmaW5lIEkyT19DTEFTU19QRUVSX1RSQU5TUE9SVAkJMHgwOTEKKyNkZWZpbmUJSTJPX0NMQVNTX0VORAkJCQkweGZmZgorCisvKgorICogIFJlc3Qgb2YgMHgwOTIgLSAweDA5ZiByZXNlcnZlZCBmb3IgcGVlci10by1wZWVyIGNsYXNzZXMKKyAqLworCisjZGVmaW5lIEkyT19DTEFTU19NQVRDSF9BTllDTEFTUwkJMHhmZmZmZmZmZgorCisvKgorICogIFN1YmNsYXNzZXMKKyAqLworCisjZGVmaW5lIEkyT19TVUJDTEFTU19pOTYwCQkJMHgwMDEKKyNkZWZpbmUgSTJPX1NVQkNMQVNTX0hETQkJCTB4MDIwCisjZGVmaW5lIEkyT19TVUJDTEFTU19JU00JCQkweDAyMQorCisvKiBPcGVyYXRpb24gZnVuY3Rpb25zICovCisKKyNkZWZpbmUgSTJPX1BBUkFNU19GSUVMRF9HRVQJCQkweDAwMDEKKyNkZWZpbmUgSTJPX1BBUkFNU19MSVNUX0dFVAkJCTB4MDAwMgorI2RlZmluZSBJMk9fUEFSQU1TX01PUkVfR0VUCQkJMHgwMDAzCisjZGVmaW5lIEkyT19QQVJBTVNfU0laRV9HRVQJCQkweDAwMDQKKyNkZWZpbmUgSTJPX1BBUkFNU19UQUJMRV9HRVQJCQkweDAwMDUKKyNkZWZpbmUgSTJPX1BBUkFNU19GSUVMRF9TRVQJCQkweDAwMDYKKyNkZWZpbmUgSTJPX1BBUkFNU19MSVNUX1NFVAkJCTB4MDAwNworI2RlZmluZSBJMk9fUEFSQU1TX1JPV19BREQJCQkweDAwMDgKKyNkZWZpbmUgSTJPX1BBUkFNU19ST1dfREVMRVRFCQkJMHgwMDA5CisjZGVmaW5lIEkyT19QQVJBTVNfVEFCTEVfQ0xFQVIJCQkweDAwMEEKKworLyoKKyAqIEkyTyBzZXJpYWwgbnVtYmVyIGNvbnZlbnRpb25zIC8gZm9ybWF0cworICogKGNpcmNhIHYxLjUpCisgKi8KKworI2RlZmluZSBJMk9fU05GT1JNQVRfVU5LTk9XTgkJCTAKKyNkZWZpbmUgSTJPX1NORk9STUFUX0JJTkFSWQkJCTEKKyNkZWZpbmUgSTJPX1NORk9STUFUX0FTQ0lJCQkJMgorI2RlZmluZSBJMk9fU05GT1JNQVRfVU5JQ09ERQkJCTMKKyNkZWZpbmUgSTJPX1NORk9STUFUX0xBTjQ4X01BQwkJCTQKKyNkZWZpbmUgSTJPX1NORk9STUFUX1dBTgkJCTUKKworLyoKKyAqIFBsdXMgbmV3IGluIHYyLjAgKFllbGxvd3N0b25lIHBkZiBkb2MpCisgKi8KKworI2RlZmluZSBJMk9fU05GT1JNQVRfTEFONjRfTUFDCQkJNgorI2RlZmluZSBJMk9fU05GT1JNQVRfRERNCQkJNworI2RlZmluZSBJMk9fU05GT1JNQVRfSUVFRV9SRUc2NCAJCTgKKyNkZWZpbmUgSTJPX1NORk9STUFUX0lFRUVfUkVHMTI4CQk5CisjZGVmaW5lIEkyT19TTkZPUk1BVF9VTktOT1dOMgkJCTB4ZmYKKworLyoKKyAqCUkyTyBHZXQgU3RhdHVzIFN0YXRlIHZhbHVlcworICovCisKKyNkZWZpbmUgQURBUFRFUl9TVEFURV9JTklUSUFMSVpJTkcJCTB4MDEKKyNkZWZpbmUgQURBUFRFUl9TVEFURV9SRVNFVAkJCTB4MDIKKyNkZWZpbmUgQURBUFRFUl9TVEFURV9IT0xECQkJMHgwNAorI2RlZmluZSBBREFQVEVSX1NUQVRFX1JFQURZCQkJMHgwNQorI2RlZmluZSBBREFQVEVSX1NUQVRFX09QRVJBVElPTkFMCQkweDA4CisjZGVmaW5lIEFEQVBURVJfU1RBVEVfRkFJTEVECQkJMHgxMAorI2RlZmluZSBBREFQVEVSX1NUQVRFX0ZBVUxURUQJCQkweDExCisKKy8qCisgKglTb2Z0d2FyZSBtb2R1bGUgdHlwZXMKKyAqLworI2RlZmluZSBJMk9fU09GVFdBUkVfTU9EVUxFX0lSVE9TCQkweDExCisjZGVmaW5lIEkyT19TT0ZUV0FSRV9NT0RVTEVfSU9QX1BSSVZBVEUJCTB4MjIKKyNkZWZpbmUgSTJPX1NPRlRXQVJFX01PRFVMRV9JT1BfQ09ORklHCQkweDIzCisKKy8qCisgKglWZW5kb3JzCisgKi8KKyNkZWZpbmUgSTJPX1ZFTkRPUl9EUFQJCQkJMHgwMDFiCisKKy8qCisgKiBEUFQgLyBBZGFwdGVjIHNwZWNpZmljIHZhbHVlcyBmb3IgaTJvX3NnX2lvX2hkciBmbGFncy4KKyAqLworI2RlZmluZSBJMk9fRFBUX1NHX0ZMQUdfSU5URVJQUkVUCQkweDAwMDEwMDAwCisjZGVmaW5lIEkyT19EUFRfU0dfRkxBR19QSFlTSUNBTAkJMHgwMDAyMDAwMAorCisjZGVmaW5lIEkyT19EUFRfRkxBU0hfRlJBR19TSVpFCQkJMHgxMDAwMAorI2RlZmluZSBJMk9fRFBUX0ZMQVNIX1JFQUQJCQkweDAxMDEKKyNkZWZpbmUgSTJPX0RQVF9GTEFTSF9XUklURQkJCTB4MDEwMgorCisjZW5kaWYJCQkJLyogX0kyT19ERVZfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pOGsuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaThrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0NWJhNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaThrLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIGk4ay5oIC0tIExpbnV4IGRyaXZlciBmb3IgYWNjZXNzaW5nIHRoZSBTTU0gQklPUyBvbiBEZWxsIGxhcHRvcHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1hc3NpbW8gRGFsIFpvdHRvIDxkekBkZWJpYW4ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9JOEtfSAorI2RlZmluZSBfTElOVVhfSThLX0gKKworI2RlZmluZSBJOEtfUFJPQwkJIi9wcm9jL2k4ayIKKyNkZWZpbmUgSThLX1BST0NfRk1UCQkiMS4wIgorCisjZGVmaW5lIEk4S19CSU9TX1ZFUlNJT04JX0lPUiAoJ2knLCAweDgwLCBpbnQpCS8qIGJyb2tlbjogbWVhbnQgNCBieXRlcyAqLworI2RlZmluZSBJOEtfTUFDSElORV9JRAkJX0lPUiAoJ2knLCAweDgxLCBpbnQpCS8qIGJyb2tlbjogbWVhbnQgMTYgYnl0ZXMgKi8KKyNkZWZpbmUgSThLX1BPV0VSX1NUQVRVUwlfSU9SICgnaScsIDB4ODIsIHNpemVfdCkKKyNkZWZpbmUgSThLX0ZOX1NUQVRVUwkJX0lPUiAoJ2knLCAweDgzLCBzaXplX3QpCisjZGVmaW5lIEk4S19HRVRfVEVNUAkJX0lPUiAoJ2knLCAweDg0LCBzaXplX3QpCisjZGVmaW5lIEk4S19HRVRfU1BFRUQJCV9JT1dSKCdpJywgMHg4NSwgc2l6ZV90KQorI2RlZmluZSBJOEtfR0VUX0ZBTgkJX0lPV1IoJ2knLCAweDg2LCBzaXplX3QpCisjZGVmaW5lIEk4S19TRVRfRkFOCQlfSU9XUignaScsIDB4ODcsIHNpemVfdCkKKworI2RlZmluZSBJOEtfRkFOX0xFRlQJCTEKKyNkZWZpbmUgSThLX0ZBTl9SSUdIVAkJMAorI2RlZmluZSBJOEtfRkFOX09GRgkJMAorI2RlZmluZSBJOEtfRkFOX0xPVwkJMQorI2RlZmluZSBJOEtfRkFOX0hJR0gJCTIKKyNkZWZpbmUgSThLX0ZBTl9NQVgJCUk4S19GQU5fSElHSAorCisjZGVmaW5lIEk4S19WT0xfVVAJCTEKKyNkZWZpbmUgSThLX1ZPTF9ET1dOCQkyCisjZGVmaW5lIEk4S19WT0xfTVVURQkJNAorCisjZGVmaW5lIEk4S19BQwkJCTEKKyNkZWZpbmUgSThLX0JBVFRFUlkJCTAKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ljbXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWNtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZWRhYjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ljbXAuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCURlZmluaXRpb25zIGZvciB0aGUgSUNNUCBwcm90b2NvbC4KKyAqCisgKiBWZXJzaW9uOglAKCMpaWNtcC5oCTEuMC4zCTA0LzI4LzkzCisgKgorICogQXV0aG9yOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfSUNNUF9ICisjZGVmaW5lCV9MSU5VWF9JQ01QX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgSUNNUF9FQ0hPUkVQTFkJCTAJLyogRWNobyBSZXBseQkJCSovCisjZGVmaW5lIElDTVBfREVTVF9VTlJFQUNICTMJLyogRGVzdGluYXRpb24gVW5yZWFjaGFibGUJKi8KKyNkZWZpbmUgSUNNUF9TT1VSQ0VfUVVFTkNICTQJLyogU291cmNlIFF1ZW5jaAkJKi8KKyNkZWZpbmUgSUNNUF9SRURJUkVDVAkJNQkvKiBSZWRpcmVjdCAoY2hhbmdlIHJvdXRlKQkqLworI2RlZmluZSBJQ01QX0VDSE8JCTgJLyogRWNobyBSZXF1ZXN0CQkJKi8KKyNkZWZpbmUgSUNNUF9USU1FX0VYQ0VFREVECTExCS8qIFRpbWUgRXhjZWVkZWQJCSovCisjZGVmaW5lIElDTVBfUEFSQU1FVEVSUFJPQgkxMgkvKiBQYXJhbWV0ZXIgUHJvYmxlbQkJKi8KKyNkZWZpbmUgSUNNUF9USU1FU1RBTVAJCTEzCS8qIFRpbWVzdGFtcCBSZXF1ZXN0CQkqLworI2RlZmluZSBJQ01QX1RJTUVTVEFNUFJFUExZCTE0CS8qIFRpbWVzdGFtcCBSZXBseQkJKi8KKyNkZWZpbmUgSUNNUF9JTkZPX1JFUVVFU1QJMTUJLyogSW5mb3JtYXRpb24gUmVxdWVzdAkJKi8KKyNkZWZpbmUgSUNNUF9JTkZPX1JFUExZCQkxNgkvKiBJbmZvcm1hdGlvbiBSZXBseQkJKi8KKyNkZWZpbmUgSUNNUF9BRERSRVNTCQkxNwkvKiBBZGRyZXNzIE1hc2sgUmVxdWVzdAkJKi8KKyNkZWZpbmUgSUNNUF9BRERSRVNTUkVQTFkJMTgJLyogQWRkcmVzcyBNYXNrIFJlcGx5CQkqLworI2RlZmluZSBOUl9JQ01QX1RZUEVTCQkxOAorCisKKy8qIENvZGVzIGZvciBVTlJFQUNILiAqLworI2RlZmluZSBJQ01QX05FVF9VTlJFQUNICTAJLyogTmV0d29yayBVbnJlYWNoYWJsZQkJKi8KKyNkZWZpbmUgSUNNUF9IT1NUX1VOUkVBQ0gJMQkvKiBIb3N0IFVucmVhY2hhYmxlCQkqLworI2RlZmluZSBJQ01QX1BST1RfVU5SRUFDSAkyCS8qIFByb3RvY29sIFVucmVhY2hhYmxlCQkqLworI2RlZmluZSBJQ01QX1BPUlRfVU5SRUFDSAkzCS8qIFBvcnQgVW5yZWFjaGFibGUJCSovCisjZGVmaW5lIElDTVBfRlJBR19ORUVERUQJNAkvKiBGcmFnbWVudGF0aW9uIE5lZWRlZC9ERiBzZXQJKi8KKyNkZWZpbmUgSUNNUF9TUl9GQUlMRUQJCTUJLyogU291cmNlIFJvdXRlIGZhaWxlZAkJKi8KKyNkZWZpbmUgSUNNUF9ORVRfVU5LTk9XTgk2CisjZGVmaW5lIElDTVBfSE9TVF9VTktOT1dOCTcKKyNkZWZpbmUgSUNNUF9IT1NUX0lTT0xBVEVECTgKKyNkZWZpbmUgSUNNUF9ORVRfQU5PCQk5CisjZGVmaW5lIElDTVBfSE9TVF9BTk8JCTEwCisjZGVmaW5lIElDTVBfTkVUX1VOUl9UT1MJMTEKKyNkZWZpbmUgSUNNUF9IT1NUX1VOUl9UT1MJMTIKKyNkZWZpbmUgSUNNUF9QS1RfRklMVEVSRUQJMTMJLyogUGFja2V0IGZpbHRlcmVkICovCisjZGVmaW5lIElDTVBfUFJFQ19WSU9MQVRJT04JMTQJLyogUHJlY2VkZW5jZSB2aW9sYXRpb24gKi8KKyNkZWZpbmUgSUNNUF9QUkVDX0NVVE9GRgkxNQkvKiBQcmVjZWRlbmNlIGN1dCBvZmYgKi8KKyNkZWZpbmUgTlJfSUNNUF9VTlJFQUNICQkxNQkvKiBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgaW1tZWRpYXRlIHZhbHVlICovCisKKy8qIENvZGVzIGZvciBSRURJUkVDVC4gKi8KKyNkZWZpbmUgSUNNUF9SRURJUl9ORVQJCTAJLyogUmVkaXJlY3QgTmV0CQkJKi8KKyNkZWZpbmUgSUNNUF9SRURJUl9IT1NUCQkxCS8qIFJlZGlyZWN0IEhvc3QJCSovCisjZGVmaW5lIElDTVBfUkVESVJfTkVUVE9TCTIJLyogUmVkaXJlY3QgTmV0IGZvciBUT1MJCSovCisjZGVmaW5lIElDTVBfUkVESVJfSE9TVFRPUwkzCS8qIFJlZGlyZWN0IEhvc3QgZm9yIFRPUwkqLworCisvKiBDb2RlcyBmb3IgVElNRV9FWENFRURFRC4gKi8KKyNkZWZpbmUgSUNNUF9FWENfVFRMCQkwCS8qIFRUTCBjb3VudCBleGNlZWRlZAkJKi8KKyNkZWZpbmUgSUNNUF9FWENfRlJBR1RJTUUJMQkvKiBGcmFnbWVudCBSZWFzcyB0aW1lIGV4Y2VlZGVkCSovCisKKworc3RydWN0IGljbXBoZHIgeworICBfX3U4CQl0eXBlOworICBfX3U4CQljb2RlOworICBfX3N1bTE2CWNoZWNrc3VtOworICB1bmlvbiB7CisJc3RydWN0IHsKKwkJX19iZTE2CWlkOworCQlfX2JlMTYJc2VxdWVuY2U7CisJfSBlY2hvOworCV9fYmUzMglnYXRld2F5OworCXN0cnVjdCB7CisJCV9fYmUxNglfX3VudXNlZDsKKwkJX19iZTE2CW10dTsKKwl9IGZyYWc7CisgIH0gdW47Cit9OworCisKKy8qCisgKgljb25zdGFudHMgZm9yIChzZXR8Z2V0KXNvY2tvcHQKKyAqLworCisjZGVmaW5lIElDTVBfRklMVEVSCQkJMQorCitzdHJ1Y3QgaWNtcF9maWx0ZXIgeworCV9fdTMyCQlkYXRhOworfTsKKworCisjZW5kaWYJLyogX0xJTlVYX0lDTVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pY21wdjYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWNtcHY2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5M2RmYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWNtcHY2LmgKQEAgLTAsMCArMSwxNjQgQEAKKyNpZm5kZWYgX0xJTlVYX0lDTVBWNl9ICisjZGVmaW5lIF9MSU5VWF9JQ01QVjZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKK3N0cnVjdCBpY21wNmhkciB7CisKKwlfX3U4CQlpY21wNl90eXBlOworCV9fdTgJCWljbXA2X2NvZGU7CisJX19zdW0xNgkJaWNtcDZfY2tzdW07CisKKworCXVuaW9uIHsKKwkJX19iZTMyCQkJdW5fZGF0YTMyWzFdOworCQlfX2JlMTYJCQl1bl9kYXRhMTZbMl07CisJCV9fdTgJCQl1bl9kYXRhOFs0XTsKKworCQlzdHJ1Y3QgaWNtcHY2X2VjaG8geworCQkJX19iZTE2CQlpZGVudGlmaWVyOworCQkJX19iZTE2CQlzZXF1ZW5jZTsKKwkJfSB1X2VjaG87CisKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaWNtcHY2X25kX2FkdnQgeworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorICAgICAgICAgICAgICAgICAgICAgICAgX191MzIJCXJlc2VydmVkOjUsCisgICAgICAgICAgICAgICAgICAgICAgICAJCW92ZXJyaWRlOjEsCisgICAgICAgICAgICAgICAgICAgICAgICAJCXNvbGljaXRlZDoxLAorICAgICAgICAgICAgICAgICAgICAgICAgCQlyb3V0ZXI6MSwKKwkJCQkJcmVzZXJ2ZWQyOjI0OworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisgICAgICAgICAgICAgICAgICAgICAgICBfX3UzMgkJcm91dGVyOjEsCisJCQkJCXNvbGljaXRlZDoxLAorICAgICAgICAgICAgICAgICAgICAgICAgCQlvdmVycmlkZToxLAorICAgICAgICAgICAgICAgICAgICAgICAgCQlyZXNlcnZlZDoyOTsKKyNlbHNlCisjZXJyb3IJIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYJCQkJCQkKKyAgICAgICAgICAgICAgICB9IHVfbmRfYWR2dDsKKworICAgICAgICAgICAgICAgIHN0cnVjdCBpY21wdjZfbmRfcmEgeworCQkJX191OAkJaG9wX2xpbWl0OworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCQkJX191OAkJcmVzZXJ2ZWQ6MywKKwkJCQkJcm91dGVyX3ByZWY6MiwKKwkJCQkJaG9tZV9hZ2VudDoxLAorCQkJCQlvdGhlcjoxLAorCQkJCQltYW5hZ2VkOjE7CisKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCQkJX191OAkJbWFuYWdlZDoxLAorCQkJCQlvdGhlcjoxLAorCQkJCQlob21lX2FnZW50OjEsCisJCQkJCXJvdXRlcl9wcmVmOjIsCisJCQkJCXJlc2VydmVkOjM7CisjZWxzZQorI2Vycm9yCSJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisJCQlfX2JlMTYJCXJ0X2xpZmV0aW1lOworICAgICAgICAgICAgICAgIH0gdV9uZF9yYTsKKworCX0gaWNtcDZfZGF0YXVuOworCisjZGVmaW5lIGljbXA2X2lkZW50aWZpZXIJaWNtcDZfZGF0YXVuLnVfZWNoby5pZGVudGlmaWVyCisjZGVmaW5lIGljbXA2X3NlcXVlbmNlCQlpY21wNl9kYXRhdW4udV9lY2hvLnNlcXVlbmNlCisjZGVmaW5lIGljbXA2X3BvaW50ZXIJCWljbXA2X2RhdGF1bi51bl9kYXRhMzJbMF0KKyNkZWZpbmUgaWNtcDZfbXR1CQlpY21wNl9kYXRhdW4udW5fZGF0YTMyWzBdCisjZGVmaW5lIGljbXA2X3VudXNlZAkJaWNtcDZfZGF0YXVuLnVuX2RhdGEzMlswXQorI2RlZmluZSBpY21wNl9tYXhkZWxheQkJaWNtcDZfZGF0YXVuLnVuX2RhdGExNlswXQorI2RlZmluZSBpY21wNl9yb3V0ZXIJCWljbXA2X2RhdGF1bi51X25kX2FkdnQucm91dGVyCisjZGVmaW5lIGljbXA2X3NvbGljaXRlZAkJaWNtcDZfZGF0YXVuLnVfbmRfYWR2dC5zb2xpY2l0ZWQKKyNkZWZpbmUgaWNtcDZfb3ZlcnJpZGUJCWljbXA2X2RhdGF1bi51X25kX2FkdnQub3ZlcnJpZGUKKyNkZWZpbmUgaWNtcDZfbmRpc2NyZXNlcnZlZAlpY21wNl9kYXRhdW4udV9uZF9hZHZ0LnJlc2VydmVkCisjZGVmaW5lIGljbXA2X2hvcF9saW1pdAkJaWNtcDZfZGF0YXVuLnVfbmRfcmEuaG9wX2xpbWl0CisjZGVmaW5lIGljbXA2X2FkZHJjb25mX21hbmFnZWQJaWNtcDZfZGF0YXVuLnVfbmRfcmEubWFuYWdlZAorI2RlZmluZSBpY21wNl9hZGRyY29uZl9vdGhlcglpY21wNl9kYXRhdW4udV9uZF9yYS5vdGhlcgorI2RlZmluZSBpY21wNl9ydF9saWZldGltZQlpY21wNl9kYXRhdW4udV9uZF9yYS5ydF9saWZldGltZQorI2RlZmluZSBpY21wNl9yb3V0ZXJfcHJlZglpY21wNl9kYXRhdW4udV9uZF9yYS5yb3V0ZXJfcHJlZgorfTsKKworCisjZGVmaW5lIElDTVBWNl9ST1VURVJfUFJFRl9MT1cJCTB4MworI2RlZmluZSBJQ01QVjZfUk9VVEVSX1BSRUZfTUVESVVNCTB4MAorI2RlZmluZSBJQ01QVjZfUk9VVEVSX1BSRUZfSElHSAkJMHgxCisjZGVmaW5lIElDTVBWNl9ST1VURVJfUFJFRl9JTlZBTElECTB4MgorCisjZGVmaW5lIElDTVBWNl9ERVNUX1VOUkVBQ0gJCTEKKyNkZWZpbmUgSUNNUFY2X1BLVF9UT09CSUcJCTIKKyNkZWZpbmUgSUNNUFY2X1RJTUVfRVhDRUVECQkzCisjZGVmaW5lIElDTVBWNl9QQVJBTVBST0IJCTQKKworI2RlZmluZSBJQ01QVjZfSU5GT01TR19NQVNLCQkweDgwCisKKyNkZWZpbmUgSUNNUFY2X0VDSE9fUkVRVUVTVAkJMTI4CisjZGVmaW5lIElDTVBWNl9FQ0hPX1JFUExZCQkxMjkKKyNkZWZpbmUgSUNNUFY2X01HTV9RVUVSWQkJMTMwCisjZGVmaW5lIElDTVBWNl9NR01fUkVQT1JUICAgICAgIAkxMzEKKyNkZWZpbmUgSUNNUFY2X01HTV9SRURVQ1RJT04gICAgCTEzMgorCisjZGVmaW5lIElDTVBWNl9OSV9RVUVSWQkJCTEzOQorI2RlZmluZSBJQ01QVjZfTklfUkVQTFkJCQkxNDAKKworI2RlZmluZSBJQ01QVjZfTUxEMl9SRVBPUlQJCTE0MworCisjZGVmaW5lIElDTVBWNl9ESEFBRF9SRVFVRVNUCQkxNDQKKyNkZWZpbmUgSUNNUFY2X0RIQUFEX1JFUExZCQkxNDUKKyNkZWZpbmUgSUNNUFY2X01PQklMRV9QUkVGSVhfU09MCTE0NgorI2RlZmluZSBJQ01QVjZfTU9CSUxFX1BSRUZJWF9BRFYJMTQ3CisKKy8qCisgKglDb2RlcyBmb3IgRGVzdGluYXRpb24gVW5yZWFjaGFibGUKKyAqLworI2RlZmluZSBJQ01QVjZfTk9ST1VURQkJCTAKKyNkZWZpbmUgSUNNUFY2X0FETV9QUk9ISUJJVEVECQkxCisjZGVmaW5lIElDTVBWNl9OT1RfTkVJR0hCT1VSCQkyCisjZGVmaW5lIElDTVBWNl9BRERSX1VOUkVBQ0gJCTMKKyNkZWZpbmUgSUNNUFY2X1BPUlRfVU5SRUFDSAkJNAorCisvKgorICoJQ29kZXMgZm9yIFRpbWUgRXhjZWVkZWQKKyAqLworI2RlZmluZSBJQ01QVjZfRVhDX0hPUExJTUlUCQkwCisjZGVmaW5lIElDTVBWNl9FWENfRlJBR1RJTUUJCTEKKworLyoKKyAqCUNvZGVzIGZvciBQYXJhbWV0ZXIgUHJvYmxlbQorICovCisjZGVmaW5lIElDTVBWNl9IRFJfRklFTEQJCTAKKyNkZWZpbmUgSUNNUFY2X1VOS19ORVhUSERSCQkxCisjZGVmaW5lIElDTVBWNl9VTktfT1BUSU9OCQkyCisKKy8qCisgKgljb25zdGFudHMgZm9yIChzZXR8Z2V0KXNvY2tvcHQKKyAqLworCisjZGVmaW5lIElDTVBWNl9GSUxURVIJCQkxCisKKy8qCisgKglJQ01QVjYgZmlsdGVyCisgKi8KKworI2RlZmluZSBJQ01QVjZfRklMVEVSX0JMT0NLCQkxCisjZGVmaW5lIElDTVBWNl9GSUxURVJfUEFTUwkJMgorI2RlZmluZSBJQ01QVjZfRklMVEVSX0JMT0NLT1RIRVJTCTMKKyNkZWZpbmUgSUNNUFY2X0ZJTFRFUl9QQVNTT05MWQkJNAorCitzdHJ1Y3QgaWNtcDZfZmlsdGVyIHsKKwlfX3UzMgkJZGF0YVs4XTsKK307CisKKy8qCisgKglEZWZpbml0aW9ucyBmb3IgTUxEdjIKKyAqLworI2RlZmluZSBNTEQyX01PREVfSVNfSU5DTFVERQkxCisjZGVmaW5lIE1MRDJfTU9ERV9JU19FWENMVURFCTIKKyNkZWZpbmUgTUxEMl9DSEFOR0VfVE9fSU5DTFVERQkzCisjZGVmaW5lIE1MRDJfQ0hBTkdFX1RPX0VYQ0xVREUJNAorI2RlZmluZSBNTEQyX0FMTE9XX05FV19TT1VSQ0VTCTUKKyNkZWZpbmUgTUxEMl9CTE9DS19PTERfU09VUkNFUwk2CisKKyNkZWZpbmUgTUxEMl9BTExfTUNSX0lOSVQgeyB7IHsgMHhmZiwweDAyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMHgxNiB9IH0gfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYzFkZGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmLmgKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgSU5FVCBpbnRlcmZhY2UgbW9kdWxlLgorICoKKyAqIFZlcnNpb246CUAoIylpZi5oCTEuMC4yCTA0LzE4LzkzCisgKgorICogQXV0aG9yczoJT3JpZ2luYWwgdGFrZW4gZnJvbSBCZXJrZWxleSBVTklYIDQuMywgKGMpIFVDQiAxOTgyLTE5ODgKKyAqCQlSb3NzIEJpcm8KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfSUZfSAorI2RlZmluZSBfTElOVVhfSUZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JCS8qIGZvciAiX19rZXJuZWxfY2FkZHJfdCIgZXQgYWwJKi8KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4JCS8qIGZvciAic3RydWN0IHNvY2thZGRyIiBldCBhbAkqLworCQkvKiBmb3IgIl9fdXNlciIgZXQgYWwgICAgICAgICAgICovCisKKyNkZWZpbmUJSUZOQU1TSVoJMTYKKyNkZWZpbmUJSUZBTElBU1oJMjU2CisjaW5jbHVkZSA8bGludXgvaGRsYy9pb2N0bC5oPgorCisvKiBTdGFuZGFyZCBpbnRlcmZhY2UgZmxhZ3MgKG5ldGRldmljZS0+ZmxhZ3MpLiAqLworI2RlZmluZQlJRkZfVVAJCTB4MQkJLyogaW50ZXJmYWNlIGlzIHVwCQkqLworI2RlZmluZQlJRkZfQlJPQURDQVNUCTB4MgkJLyogYnJvYWRjYXN0IGFkZHJlc3MgdmFsaWQJKi8KKyNkZWZpbmUJSUZGX0RFQlVHCTB4NAkJLyogdHVybiBvbiBkZWJ1Z2dpbmcJCSovCisjZGVmaW5lCUlGRl9MT09QQkFDSwkweDgJCS8qIGlzIGEgbG9vcGJhY2sgbmV0CQkqLworI2RlZmluZQlJRkZfUE9JTlRPUE9JTlQJMHgxMAkJLyogaW50ZXJmYWNlIGlzIGhhcyBwLXAgbGluawkqLworI2RlZmluZQlJRkZfTk9UUkFJTEVSUwkweDIwCQkvKiBhdm9pZCB1c2Ugb2YgdHJhaWxlcnMJKi8KKyNkZWZpbmUJSUZGX1JVTk5JTkcJMHg0MAkJLyogaW50ZXJmYWNlIFJGQzI4NjMgT1BFUl9VUAkqLworI2RlZmluZQlJRkZfTk9BUlAJMHg4MAkJLyogbm8gQVJQIHByb3RvY29sCQkqLworI2RlZmluZQlJRkZfUFJPTUlTQwkweDEwMAkJLyogcmVjZWl2ZSBhbGwgcGFja2V0cwkJKi8KKyNkZWZpbmUJSUZGX0FMTE1VTFRJCTB4MjAwCQkvKiByZWNlaXZlIGFsbCBtdWx0aWNhc3QgcGFja2V0cyovCisKKyNkZWZpbmUgSUZGX01BU1RFUgkweDQwMAkJLyogbWFzdGVyIG9mIGEgbG9hZCBiYWxhbmNlciAJKi8KKyNkZWZpbmUgSUZGX1NMQVZFCTB4ODAwCQkvKiBzbGF2ZSBvZiBhIGxvYWQgYmFsYW5jZXIJKi8KKworI2RlZmluZSBJRkZfTVVMVElDQVNUCTB4MTAwMAkJLyogU3VwcG9ydHMgbXVsdGljYXN0CQkqLworCisjZGVmaW5lIElGRl9QT1JUU0VMCTB4MjAwMCAgICAgICAgICAvKiBjYW4gc2V0IG1lZGlhIHR5cGUJCSovCisjZGVmaW5lIElGRl9BVVRPTUVESUEJMHg0MDAwCQkvKiBhdXRvIG1lZGlhIHNlbGVjdCBhY3RpdmUJKi8KKyNkZWZpbmUgSUZGX0RZTkFNSUMJMHg4MDAwCQkvKiBkaWFsdXAgZGV2aWNlIHdpdGggY2hhbmdpbmcgYWRkcmVzc2VzKi8KKworI2RlZmluZSBJRkZfTE9XRVJfVVAJMHgxMDAwMAkJLyogZHJpdmVyIHNpZ25hbHMgTDEgdXAJCSovCisjZGVmaW5lIElGRl9ET1JNQU5UCTB4MjAwMDAJCS8qIGRyaXZlciBzaWduYWxzIGRvcm1hbnQJKi8KKworI2RlZmluZSBJRkZfRUNITwkweDQwMDAwCQkvKiBlY2hvIHNlbnQgcGFja2V0cwkJKi8KKworI2RlZmluZSBJRkZfVk9MQVRJTEUJKElGRl9MT09QQkFDS3xJRkZfUE9JTlRPUE9JTlR8SUZGX0JST0FEQ0FTVHxJRkZfRUNIT3xcCisJCUlGRl9NQVNURVJ8SUZGX1NMQVZFfElGRl9SVU5OSU5HfElGRl9MT1dFUl9VUHxJRkZfRE9STUFOVCkKKworLyogUHJpdmF0ZSAoZnJvbSB1c2VyKSBpbnRlcmZhY2UgZmxhZ3MgKG5ldGRldmljZS0+cHJpdl9mbGFncykuICovCisjZGVmaW5lIElGRl84MDJfMVFfVkxBTiAweDEgICAgICAgICAgICAgLyogODAyLjFRIFZMQU4gZGV2aWNlLiAgICAgICAgICAqLworI2RlZmluZSBJRkZfRUJSSURHRQkweDIJCS8qIEV0aGVybmV0IGJyaWRnaW5nIGRldmljZS4JKi8KKyNkZWZpbmUgSUZGX1NMQVZFX0lOQUNUSVZFCTB4NAkvKiBib25kaW5nIHNsYXZlIG5vdCB0aGUgY3Vyci4gYWN0aXZlICovCisjZGVmaW5lIElGRl9NQVNURVJfODAyM0FECTB4OAkvKiBib25kaW5nIG1hc3RlciwgODAyLjNhZC4gCSovCisjZGVmaW5lIElGRl9NQVNURVJfQUxCCTB4MTAJCS8qIGJvbmRpbmcgbWFzdGVyLCBiYWxhbmNlLWFsYi4JKi8KKyNkZWZpbmUgSUZGX0JPTkRJTkcJMHgyMAkJLyogYm9uZGluZyBtYXN0ZXIgb3Igc2xhdmUJKi8KKyNkZWZpbmUgSUZGX1NMQVZFX05FRURBUlAgMHg0MAkJLyogbmVlZCBBUlBzIGZvciB2YWxpZGF0aW9uCSovCisjZGVmaW5lIElGRl9JU0FUQVAJMHg4MAkJLyogSVNBVEFQIGludGVyZmFjZSAoUkZDNDIxNCkJKi8KKyNkZWZpbmUgSUZGX01BU1RFUl9BUlBNT04gMHgxMDAJCS8qIGJvbmRpbmcgbWFzdGVyLCBBUlAgbW9uIGluIHVzZSAqLworI2RlZmluZSBJRkZfV0FOX0hETEMJMHgyMDAJCS8qIFdBTiBIRExDIGRldmljZQkJKi8KKyNkZWZpbmUgSUZGX1hNSVRfRFNUX1JFTEVBU0UgMHg0MDAJLyogZGV2X2hhcmRfc3RhcnRfeG1pdCgpIGlzIGFsbG93ZWQgdG8KKwkJCQkJICogcmVsZWFzZSBza2ItPmRzdAorCQkJCQkgKi8KKyNkZWZpbmUgSUZGX0RPTlRfQlJJREdFIDB4ODAwCQkvKiBkaXNhbGxvdyBicmlkZ2luZyB0aGlzIGV0aGVyIGRldiAqLworI2RlZmluZSBJRkZfRElTQUJMRV9ORVRQT0xMCTB4MTAwMAkvKiBkaXNhYmxlIG5ldHBvbGwgYXQgcnVuLXRpbWUgKi8KKyNkZWZpbmUgSUZGX01BQ1ZMQU5fUE9SVAkweDIwMDAJLyogZGV2aWNlIHVzZWQgYXMgbWFjdmxhbiBwb3J0ICovCisjZGVmaW5lIElGRl9CUklER0VfUE9SVAkweDQwMDAJCS8qIGRldmljZSB1c2VkIGFzIGJyaWRnZSBwb3J0ICovCisjZGVmaW5lIElGRl9PVlNfREFUQVBBVEgJMHg4MDAwCS8qIGRldmljZSB1c2VkIGFzIE9wZW4gdlN3aXRjaAorCQkJCQkgKiBkYXRhcGF0aCBwb3J0ICovCisjZGVmaW5lIElGRl9UWF9TS0JfU0hBUklORwkweDEwMDAwCS8qIFRoZSBpbnRlcmZhY2Ugc3VwcG9ydHMgc2hhcmluZworCQkJCQkgKiBza2JzIG9uIHRyYW5zbWl0ICovCisjZGVmaW5lIElGRl9VTklDQVNUX0ZMVAkweDIwMDAwCQkvKiBTdXBwb3J0cyB1bmljYXN0IGZpbHRlcmluZwkqLworCisjZGVmaW5lIElGX0dFVF9JRkFDRQkweDAwMDEJCS8qIGZvciBxdWVyeWluZyBvbmx5ICovCisjZGVmaW5lIElGX0dFVF9QUk9UTwkweDAwMDIKKworLyogRm9yIGRlZmluaXRpb25zIHNlZSBoZGxjLmggKi8KKyNkZWZpbmUgSUZfSUZBQ0VfVjM1CTB4MTAwMAkJLyogVi4zNSBzZXJpYWwgaW50ZXJmYWNlCSovCisjZGVmaW5lIElGX0lGQUNFX1YyNAkweDEwMDEJCS8qIFYuMjQgc2VyaWFsIGludGVyZmFjZQkqLworI2RlZmluZSBJRl9JRkFDRV9YMjEJMHgxMDAyCQkvKiBYLjIxIHNlcmlhbCBpbnRlcmZhY2UJKi8KKyNkZWZpbmUgSUZfSUZBQ0VfVDEJMHgxMDAzCQkvKiBUMSB0ZWxjbyBzZXJpYWwgaW50ZXJmYWNlCSovCisjZGVmaW5lIElGX0lGQUNFX0UxCTB4MTAwNAkJLyogRTEgdGVsY28gc2VyaWFsIGludGVyZmFjZQkqLworI2RlZmluZSBJRl9JRkFDRV9TWU5DX1NFUklBTCAweDEwMDUJLyogY2FuJ3QgYmUgc2V0IGJ5IHNvZnR3YXJlCSovCisjZGVmaW5lIElGX0lGQUNFX1gyMUQgICAweDEwMDYgICAgICAgICAgLyogWC4yMSBEdWFsIENsb2NraW5nIChGYXJTaXRlKSAqLworCisvKiBGb3IgZGVmaW5pdGlvbnMgc2VlIGhkbGMuaCAqLworI2RlZmluZSBJRl9QUk9UT19IRExDCTB4MjAwMAkJLyogcmF3IEhETEMgcHJvdG9jb2wJCSovCisjZGVmaW5lIElGX1BST1RPX1BQUAkweDIwMDEJCS8qIFBQUCBwcm90b2NvbAkJCSovCisjZGVmaW5lIElGX1BST1RPX0NJU0NPCTB4MjAwMgkJLyogQ2lzY28gSERMQyBwcm90b2NvbAkJKi8KKyNkZWZpbmUgSUZfUFJPVE9fRlIJMHgyMDAzCQkvKiBGcmFtZSBSZWxheSBwcm90b2NvbAkJKi8KKyNkZWZpbmUgSUZfUFJPVE9fRlJfQUREX1BWQyAweDIwMDQJLyogICAgQ3JlYXRlIEZSIFBWQwkJKi8KKyNkZWZpbmUgSUZfUFJPVE9fRlJfREVMX1BWQyAweDIwMDUJLyogICAgRGVsZXRlIEZSIFBWQwkJKi8KKyNkZWZpbmUgSUZfUFJPVE9fWDI1CTB4MjAwNgkJLyogWC4yNQkJCQkqLworI2RlZmluZSBJRl9QUk9UT19IRExDX0VUSCAweDIwMDcJLyogcmF3IEhETEMsIEV0aGVybmV0IGVtdWxhdGlvbgkqLworI2RlZmluZSBJRl9QUk9UT19GUl9BRERfRVRIX1BWQyAweDIwMDgJLyogIENyZWF0ZSBGUiBFdGhlcm5ldC1icmlkZ2VkIFBWQyAqLworI2RlZmluZSBJRl9QUk9UT19GUl9ERUxfRVRIX1BWQyAweDIwMDkJLyogIERlbGV0ZSBGUiBFdGhlcm5ldC1icmlkZ2VkIFBWQyAqLworI2RlZmluZSBJRl9QUk9UT19GUl9QVkMJMHgyMDBBCQkvKiBmb3IgcmVhZGluZyBQVkMgc3RhdHVzCSovCisjZGVmaW5lIElGX1BST1RPX0ZSX0VUSF9QVkMgMHgyMDBCCisjZGVmaW5lIElGX1BST1RPX1JBVyAgICAweDIwMEMgICAgICAgICAgLyogUkFXIFNvY2tldCAgICAgICAgICAgICAgICAgICAqLworCisvKiBSRkMgMjg2MyBvcGVyYXRpb25hbCBzdGF0dXMgKi8KK2VudW0geworCUlGX09QRVJfVU5LTk9XTiwKKwlJRl9PUEVSX05PVFBSRVNFTlQsCisJSUZfT1BFUl9ET1dOLAorCUlGX09QRVJfTE9XRVJMQVlFUkRPV04sCisJSUZfT1BFUl9URVNUSU5HLAorCUlGX09QRVJfRE9STUFOVCwKKwlJRl9PUEVSX1VQLAorfTsKKworLyogbGluayBtb2RlcyAqLworZW51bSB7CisJSUZfTElOS19NT0RFX0RFRkFVTFQsCisJSUZfTElOS19NT0RFX0RPUk1BTlQsCS8qIGxpbWl0IHVwd2FyZCB0cmFuc2l0aW9uIHRvIGRvcm1hbnQgKi8KK307CisKKy8qCisgKglEZXZpY2UgbWFwcGluZyBzdHJ1Y3R1cmUuIEknZCBqdXN0IGdvbmUgb2ZmIGFuZCBkZXNpZ25lZCBhIAorICoJYmVhdXRpZnVsIHNjaGVtZSB1c2luZyBvbmx5IGxvYWRhYmxlIG1vZHVsZXMgd2l0aCBhcmd1bWVudHMKKyAqCWZvciBkcml2ZXIgb3B0aW9ucyBhbmQgYWxvbmcgY29tZSB0aGUgUENNQ0lBIHBlb3BsZSA4KQorICoKKyAqCUFoIHdlbGwuIFRoZSBnZXQoKSBzaWRlIG9mIHRoaXMgaXMgZ29vZCBmb3IgV0RTRVRVUCwgYW5kIGl0J2xsCisgKgliZSBoYW5keSBmb3IgZGVidWdnaW5nIHRoaW5ncy4gVGhlIHNldCBzaWRlIGlzIGZpbmUgZm9yIG5vdyBhbmQKKyAqCWJlaW5nIHZlcnkgc21hbGwgbWlnaHQgYmUgd29ydGgga2VlcGluZyBmb3IgY2xlYW4gY29uZmlndXJhdGlvbi4KKyAqLworCitzdHJ1Y3QgaWZtYXAgeworCXVuc2lnbmVkIGxvbmcgbWVtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgbWVtX2VuZDsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlX2FkZHI7IAorCXVuc2lnbmVkIGNoYXIgaXJxOworCXVuc2lnbmVkIGNoYXIgZG1hOworCXVuc2lnbmVkIGNoYXIgcG9ydDsKKwkvKiAzIGJ5dGVzIHNwYXJlICovCit9OworCitzdHJ1Y3QgaWZfc2V0dGluZ3MgeworCXVuc2lnbmVkIGludCB0eXBlOwkvKiBUeXBlIG9mIHBoeXNpY2FsIGRldmljZSBvciBwcm90b2NvbCAqLworCXVuc2lnbmVkIGludCBzaXplOwkvKiBTaXplIG9mIHRoZSBkYXRhIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyICovCisJdW5pb24geworCQkvKiB7YXRtL2V0aC9kc2x9X3NldHRpbmdzIGFueW9uZSA/ICovCisJCXJhd19oZGxjX3Byb3RvCQkqcmF3X2hkbGM7CisJCWNpc2NvX3Byb3RvCQkqY2lzY287CisJCWZyX3Byb3RvCQkqZnI7CisJCWZyX3Byb3RvX3B2YwkJKmZyX3B2YzsKKwkJZnJfcHJvdG9fcHZjX2luZm8JKmZyX3B2Y19pbmZvOworCisJCS8qIGludGVyZmFjZSBzZXR0aW5ncyAqLworCQlzeW5jX3NlcmlhbF9zZXR0aW5ncwkqc3luYzsKKwkJdGUxX3NldHRpbmdzCQkqdGUxOworCX0gaWZzX2lmc3U7Cit9OworCisvKgorICogSW50ZXJmYWNlIHJlcXVlc3Qgc3RydWN0dXJlIHVzZWQgZm9yIHNvY2tldAorICogaW9jdGwncy4gIEFsbCBpbnRlcmZhY2UgaW9jdGwncyBtdXN0IGhhdmUgcGFyYW1ldGVyCisgKiBkZWZpbml0aW9ucyB3aGljaCBiZWdpbiB3aXRoIGlmcl9uYW1lLiAgVGhlCisgKiByZW1haW5kZXIgbWF5IGJlIGludGVyZmFjZSBzcGVjaWZpYy4KKyAqLworCitzdHJ1Y3QgaWZyZXEgeworI2RlZmluZSBJRkhXQUREUkxFTgk2CisJdW5pb24KKwl7CisJCWNoYXIJaWZybl9uYW1lW0lGTkFNU0laXTsJCS8qIGlmIG5hbWUsIGUuZy4gImVuMCIgKi8KKwl9IGlmcl9pZnJuOworCQorCXVuaW9uIHsKKwkJc3RydWN0CXNvY2thZGRyIGlmcnVfYWRkcjsKKwkJc3RydWN0CXNvY2thZGRyIGlmcnVfZHN0YWRkcjsKKwkJc3RydWN0CXNvY2thZGRyIGlmcnVfYnJvYWRhZGRyOworCQlzdHJ1Y3QJc29ja2FkZHIgaWZydV9uZXRtYXNrOworCQlzdHJ1Y3QgIHNvY2thZGRyIGlmcnVfaHdhZGRyOworCQlzaG9ydAlpZnJ1X2ZsYWdzOworCQlpbnQJaWZydV9pdmFsdWU7CisJCWludAlpZnJ1X210dTsKKwkJc3RydWN0ICBpZm1hcCBpZnJ1X21hcDsKKwkJY2hhcglpZnJ1X3NsYXZlW0lGTkFNU0laXTsJLyogSnVzdCBmaXRzIHRoZSBzaXplICovCisJCWNoYXIJaWZydV9uZXduYW1lW0lGTkFNU0laXTsKKwkJdm9pZCAqCWlmcnVfZGF0YTsKKwkJc3RydWN0CWlmX3NldHRpbmdzIGlmcnVfc2V0dGluZ3M7CisJfSBpZnJfaWZydTsKK307CisKKyNkZWZpbmUgaWZyX25hbWUJaWZyX2lmcm4uaWZybl9uYW1lCS8qIGludGVyZmFjZSBuYW1lIAkqLworI2RlZmluZSBpZnJfaHdhZGRyCWlmcl9pZnJ1LmlmcnVfaHdhZGRyCS8qIE1BQyBhZGRyZXNzIAkJKi8KKyNkZWZpbmUJaWZyX2FkZHIJaWZyX2lmcnUuaWZydV9hZGRyCS8qIGFkZHJlc3MJCSovCisjZGVmaW5lCWlmcl9kc3RhZGRyCWlmcl9pZnJ1LmlmcnVfZHN0YWRkcgkvKiBvdGhlciBlbmQgb2YgcC1wIGxuawkqLworI2RlZmluZQlpZnJfYnJvYWRhZGRyCWlmcl9pZnJ1LmlmcnVfYnJvYWRhZGRyCS8qIGJyb2FkY2FzdCBhZGRyZXNzCSovCisjZGVmaW5lCWlmcl9uZXRtYXNrCWlmcl9pZnJ1LmlmcnVfbmV0bWFzawkvKiBpbnRlcmZhY2UgbmV0IG1hc2sJKi8KKyNkZWZpbmUJaWZyX2ZsYWdzCWlmcl9pZnJ1LmlmcnVfZmxhZ3MJLyogZmxhZ3MJCSovCisjZGVmaW5lCWlmcl9tZXRyaWMJaWZyX2lmcnUuaWZydV9pdmFsdWUJLyogbWV0cmljCQkqLworI2RlZmluZQlpZnJfbXR1CQlpZnJfaWZydS5pZnJ1X210dQkvKiBtdHUJCQkqLworI2RlZmluZSBpZnJfbWFwCQlpZnJfaWZydS5pZnJ1X21hcAkvKiBkZXZpY2UgbWFwCQkqLworI2RlZmluZSBpZnJfc2xhdmUJaWZyX2lmcnUuaWZydV9zbGF2ZQkvKiBzbGF2ZSBkZXZpY2UJCSovCisjZGVmaW5lCWlmcl9kYXRhCWlmcl9pZnJ1LmlmcnVfZGF0YQkvKiBmb3IgdXNlIGJ5IGludGVyZmFjZQkqLworI2RlZmluZSBpZnJfaWZpbmRleAlpZnJfaWZydS5pZnJ1X2l2YWx1ZQkvKiBpbnRlcmZhY2UgaW5kZXgJKi8KKyNkZWZpbmUgaWZyX2JhbmR3aWR0aAlpZnJfaWZydS5pZnJ1X2l2YWx1ZSAgICAvKiBsaW5rIGJhbmR3aWR0aAkqLworI2RlZmluZSBpZnJfcWxlbglpZnJfaWZydS5pZnJ1X2l2YWx1ZQkvKiBRdWV1ZSBsZW5ndGggCSovCisjZGVmaW5lIGlmcl9uZXduYW1lCWlmcl9pZnJ1LmlmcnVfbmV3bmFtZQkvKiBOZXcgbmFtZQkJKi8KKyNkZWZpbmUgaWZyX3NldHRpbmdzCWlmcl9pZnJ1LmlmcnVfc2V0dGluZ3MJLyogRGV2aWNlL3Byb3RvIHNldHRpbmdzKi8KKworLyoKKyAqIFN0cnVjdHVyZSB1c2VkIGluIFNJT0NHSUZDT05GIHJlcXVlc3QuCisgKiBVc2VkIHRvIHJldHJpZXZlIGludGVyZmFjZSBjb25maWd1cmF0aW9uCisgKiBmb3IgbWFjaGluZSAodXNlZnVsIGZvciBwcm9ncmFtcyB3aGljaAorICogbXVzdCBrbm93IGFsbCBuZXR3b3JrcyBhY2Nlc3NpYmxlKS4KKyAqLworCitzdHJ1Y3QgaWZjb25mICB7CisJaW50CWlmY19sZW47CQkJLyogc2l6ZSBvZiBidWZmZXIJKi8KKwl1bmlvbiB7CisJCWNoYXIgKmlmY3VfYnVmOworCQlzdHJ1Y3QgaWZyZXEgKmlmY3VfcmVxOworCX0gaWZjX2lmY3U7Cit9OworI2RlZmluZQlpZmNfYnVmCWlmY19pZmN1LmlmY3VfYnVmCQkvKiBidWZmZXIgYWRkcmVzcwkqLworI2RlZmluZQlpZmNfcmVxCWlmY19pZmN1LmlmY3VfcmVxCQkvKiBhcnJheSBvZiBzdHJ1Y3R1cmVzCSovCisKKyNlbmRpZiAvKiBfTElOVVhfSUZfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9hZGRyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FkZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGIzOWY0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9hZGRyLmgKQEAgLTAsMCArMSw1OSBAQAorI2lmbmRlZiBfX0xJTlVYX0lGX0FERFJfSAorI2RlZmluZSBfX0xJTlVYX0lGX0FERFJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKK3N0cnVjdCBpZmFkZHJtc2cgeworCV9fdTgJCWlmYV9mYW1pbHk7CisJX191OAkJaWZhX3ByZWZpeGxlbjsJLyogVGhlIHByZWZpeCBsZW5ndGgJCSovCisJX191OAkJaWZhX2ZsYWdzOwkvKiBGbGFncwkJCSovCisJX191OAkJaWZhX3Njb3BlOwkvKiBBZGRyZXNzIHNjb3BlCQkqLworCV9fdTMyCQlpZmFfaW5kZXg7CS8qIExpbmsgaW5kZXgJCQkqLworfTsKKworLyoKKyAqIEltcG9ydGFudCBjb21tZW50OgorICogSUZBX0FERFJFU1MgaXMgcHJlZml4IGFkZHJlc3MsIHJhdGhlciB0aGFuIGxvY2FsIGludGVyZmFjZSBhZGRyZXNzLgorICogSXQgbWFrZXMgbm8gZGlmZmVyZW5jZSBmb3Igbm9ybWFsbHkgY29uZmlndXJlZCBicm9hZGNhc3QgaW50ZXJmYWNlcywKKyAqIGJ1dCBmb3IgcG9pbnQtdG8tcG9pbnQgSUZBX0FERFJFU1MgaXMgREVTVElOQVRJT04gYWRkcmVzcywKKyAqIGxvY2FsIGFkZHJlc3MgaXMgc3VwcGxpZWQgaW4gSUZBX0xPQ0FMIGF0dHJpYnV0ZS4KKyAqLworZW51bSB7CisJSUZBX1VOU1BFQywKKwlJRkFfQUREUkVTUywKKwlJRkFfTE9DQUwsCisJSUZBX0xBQkVMLAorCUlGQV9CUk9BRENBU1QsCisJSUZBX0FOWUNBU1QsCisJSUZBX0NBQ0hFSU5GTywKKwlJRkFfTVVMVElDQVNULAorCV9fSUZBX01BWCwKK307CisKKyNkZWZpbmUgSUZBX01BWCAoX19JRkFfTUFYIC0gMSkKKworLyogaWZhX2ZsYWdzICovCisjZGVmaW5lIElGQV9GX1NFQ09OREFSWQkJMHgwMQorI2RlZmluZSBJRkFfRl9URU1QT1JBUlkJCUlGQV9GX1NFQ09OREFSWQorCisjZGVmaW5lCUlGQV9GX05PREFECQkweDAyCisjZGVmaW5lIElGQV9GX09QVElNSVNUSUMJMHgwNAorI2RlZmluZSBJRkFfRl9EQURGQUlMRUQJCTB4MDgKKyNkZWZpbmUJSUZBX0ZfSE9NRUFERFJFU1MJMHgxMAorI2RlZmluZSBJRkFfRl9ERVBSRUNBVEVECTB4MjAKKyNkZWZpbmUgSUZBX0ZfVEVOVEFUSVZFCQkweDQwCisjZGVmaW5lIElGQV9GX1BFUk1BTkVOVAkJMHg4MAorCitzdHJ1Y3QgaWZhX2NhY2hlaW5mbyB7CisJX191MzIJaWZhX3ByZWZlcmVkOworCV9fdTMyCWlmYV92YWxpZDsKKwlfX3UzMgljc3RhbXA7IC8qIGNyZWF0ZWQgdGltZXN0YW1wLCBodW5kcmVkdGhzIG9mIHNlY29uZHMgKi8KKwlfX3UzMgl0c3RhbXA7IC8qIHVwZGF0ZWQgdGltZXN0YW1wLCBodW5kcmVkdGhzIG9mIHNlY29uZHMgKi8KK307CisKKy8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1c2Vyc3BhY2UgKi8KKyNkZWZpbmUgSUZBX1JUQShyKSAgKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocikpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpKSkpCisjZGVmaW5lIElGQV9QQVlMT0FEKG4pIE5MTVNHX1BBWUxPQUQobixzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9hZGRybGFiZWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYWRkcmxhYmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1ODBjMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYWRkcmxhYmVsLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIGlmX2FkZHJsYWJlbC5oIC0gbmV0bGluayBpbnRlcmZhY2UgZm9yIGFkZHJlc3MgbGFiZWxzCisgKgorICogQ29weXJpZ2h0IChDKTIwMDcgVVNBR0kvV0lERSBQcm9qZWN0LCAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBBdXRob3JzOgorICoJWU9TSElGVUpJIEhpZGVha2kgQCBVU0FHSS9XSURFIDx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfSUZfQUREUkxBQkVMX0gKKyNkZWZpbmUgX19MSU5VWF9JRl9BRERSTEFCRUxfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGlmYWRkcmxibG1zZyB7CisJX191OAkJaWZhbF9mYW1pbHk7CQkvKiBBZGRyZXNzIGZhbWlseSAqLworCV9fdTgJCV9faWZhbF9yZXNlcnZlZDsJLyogUmVzZXJ2ZWQgKi8KKwlfX3U4CQlpZmFsX3ByZWZpeGxlbjsJCS8qIFByZWZpeCBsZW5ndGggKi8KKwlfX3U4CQlpZmFsX2ZsYWdzOwkJLyogRmxhZ3MgKi8KKwlfX3UzMgkJaWZhbF9pbmRleDsJCS8qIExpbmsgaW5kZXggKi8KKwlfX3UzMgkJaWZhbF9zZXE7CQkvKiBzZXF1ZW5jZSBudW1iZXIgKi8KK307CisKK2VudW0geworCUlGQUxfQUREUkVTUyA9IDEsCisJSUZBTF9MQUJFTCA9IDIsCisJX19JRkFMX01BWAorfTsKKworI2RlZmluZSBJRkFMX01BWAkoX19JRkFMX01BWCAtIDEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9hbGcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYWxnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5YWNjZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYWxnLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIGlmX2FsZzogVXNlci1zcGFjZSBhbGdvcml0aG0gaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9JRl9BTEdfSAorI2RlZmluZSBfTElOVVhfSUZfQUxHX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBzb2NrYWRkcl9hbGcgeworCV9fdTE2CXNhbGdfZmFtaWx5OworCV9fdTgJc2FsZ190eXBlWzE0XTsKKwlfX3UzMglzYWxnX2ZlYXQ7CisJX191MzIJc2FsZ19tYXNrOworCV9fdTgJc2FsZ19uYW1lWzY0XTsKK307CisKK3N0cnVjdCBhZl9hbGdfaXYgeworCV9fdTMyCWl2bGVuOworCV9fdTgJaXZbMF07Cit9OworCisvKiBTb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBBTEdfU0VUX0tFWQkJCTEKKyNkZWZpbmUgQUxHX1NFVF9JVgkJCTIKKyNkZWZpbmUgQUxHX1NFVF9PUAkJCTMKKworLyogT3BlcmF0aW9ucyAqLworI2RlZmluZSBBTEdfT1BfREVDUllQVAkJCTAKKyNkZWZpbmUgQUxHX09QX0VOQ1JZUFQJCQkxCisKKyNlbmRpZgkvKiBfTElOVVhfSUZfQUxHX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYXJjbmV0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FyY25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZTM0YmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FyY25ldC5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogSU5FVCAgICAgICAgIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICogICAgICAgICAgICAgIG9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICogICAgICAgICAgICAgIGludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqICAgICAgICAgICAgICBHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBBUkNuZXQgaW50ZXJmYWNlLgorICoKKyAqIEF1dGhvcnM6ICAgICBEYXZpZCBXb29kaG91c2UgYW5kIEF2ZXJ5IFBlbm5hcnVuCisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfSUZfQVJDTkVUX0gKKyNkZWZpbmUgX0xJTlVYX0lGX0FSQ05FVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisKKworLyoKKyAqICAgIFRoZXNlIGFyZSB0aGUgZGVmaW5lZCBBUkNuZXQgUHJvdG9jb2wgSUQncy4KKyAqLworCisvKiBDQVAgbW9kZSAqLworLyogTm8gbWFjcm8gYnV0IHVzZXMgMS04ICovCisKKy8qIFJGQzEyMDEgUHJvdG9jb2wgSUQncyAqLworI2RlZmluZSBBUkNfUF9JUAkJMjEyCS8qIDB4RDQgKi8KKyNkZWZpbmUgQVJDX1BfSVBWNgkJMTk2CS8qIDB4QzQ6IFJGQzI0OTcgKi8KKyNkZWZpbmUgQVJDX1BfQVJQCQkyMTMJLyogMHhENSAqLworI2RlZmluZSBBUkNfUF9SQVJQCQkyMTQJLyogMHhENiAqLworI2RlZmluZSBBUkNfUF9JUFgJCTI1MAkvKiAweEZBICovCisjZGVmaW5lIEFSQ19QX05PVkVMTF9FQwkJMjM2CS8qIDB4RUMgKi8KKworLyogT2xkIFJGQzEwNTEgUHJvdG9jb2wgSUQncyAqLworI2RlZmluZSBBUkNfUF9JUF9SRkMxMDUxCTI0MAkvKiAweEYwICovCisjZGVmaW5lIEFSQ19QX0FSUF9SRkMxMDUxCTI0MQkvKiAweEYxICovCisKKy8qIE1TIExhbk1hbi9XZldnICJORElTIiBlbmNhcHN1bGF0aW9uICovCisjZGVmaW5lIEFSQ19QX0VUSEVSCQkyMzIJLyogMHhFOCAqLworCisvKiBVbnN1cHBvcnRlZC9pbmRpcmVjdGx5IHN1cHBvcnRlZCBwcm90b2NvbHMgKi8KKyNkZWZpbmUgQVJDX1BfREFUQVBPSU5UX0JPT1QJMAkvKiB2ZXJ5IG9sZCBEYXRhcG9pbnQgZXF1aXBtZW50ICovCisjZGVmaW5lIEFSQ19QX0RBVEFQT0lOVF9NT1VOVAkxCisjZGVmaW5lIEFSQ19QX1BPV0VSTEFOX0JFQUNPTgk4CS8qIFByb2JhYmx5IEFUQS1OZXRiaW9zIHJlbGF0ZWQgKi8KKyNkZWZpbmUgQVJDX1BfUE9XRVJMQU5fQkVBQ09OMgkyNDMJLyogMHhGMyAqLworI2RlZmluZSBBUkNfUF9MQU5TT0ZUCQkyNTEJLyogMHhGQiAtIHdoYXQgaXMgdGhpcz8gKi8KKyNkZWZpbmUgQVJDX1BfQVRBTEsJCTB4REQKKworLyogSGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggKi8KKyNkZWZpbmUgQVJDTkVUX0FMRU4JMQorCisvKgorICogVGhlIFJGQzEyMDEtc3BlY2lmaWMgY29tcG9uZW50cyBvZiBhbiBhcmNuZXQgcGFja2V0IGhlYWRlci4KKyAqLworc3RydWN0IGFyY19yZmMxMjAxIHsKKyAgICBfX3U4ICBwcm90bzsJCS8qIHByb3RvY29sIElEIGZpZWxkIC0gdmFyaWVzCQkqLworICAgIF9fdTggIHNwbGl0X2ZsYWc7CS8qIGZvciB1c2Ugd2l0aCBzcGxpdCBwYWNrZXRzCQkqLworICAgIF9fYmUxNiAgIHNlcXVlbmNlOwkJLyogc2VxdWVuY2UgbnVtYmVyCQkJKi8KKyAgICBfX3U4ICBwYXlsb2FkWzBdOwkvKiBzcGFjZSByZW1haW5pbmcgaW4gcGFja2V0ICg1MDQgYnl0ZXMpKi8KK307CisjZGVmaW5lIFJGQzEyMDFfSERSX1NJWkUgNAorCisKKy8qCisgKiBUaGUgUkZDMTA1MS1zcGVjaWZpYyBjb21wb25lbnRzLgorICovCitzdHJ1Y3QgYXJjX3JmYzEwNTEgeworICAgIF9fdTggcHJvdG87CQkvKiBBUkNfUF9SRkMxMDUxX0FSUC9SRkMxMDUxX0lQCSovCisgICAgX191OCBwYXlsb2FkWzBdOwkJLyogNTA3IGJ5dGVzCQkJKi8KK307CisjZGVmaW5lIFJGQzEwNTFfSERSX1NJWkUgMQorCisKKy8qCisgKiBUaGUgZXRoZXJuZXQtZW5jYXAtc3BlY2lmaWMgY29tcG9uZW50cy4gIFdlIGhhdmUgYSByZWFsIGV0aGVybmV0IGhlYWRlcgorICogYW5kIHNvbWUgZGF0YS4KKyAqLworc3RydWN0IGFyY19ldGhfZW5jYXAgeworICAgIF9fdTggcHJvdG87CQkvKiBBbHdheXMgQVJDX1BfRVRIRVIJCQkqLworICAgIHN0cnVjdCBldGhoZHIgZXRoOwkJLyogc3RhbmRhcmQgZXRoZXJuZXQgaGVhZGVyICh5dWNrISkJKi8KKyAgICBfX3U4IHBheWxvYWRbMF07CQkvKiA0OTMgYnl0ZXMJCQkJKi8KK307CisjZGVmaW5lIEVUSF9FTkNBUF9IRFJfU0laRSAxNAorCisKK3N0cnVjdCBhcmNfY2FwIHsKKwlfX3U4IHByb3RvOworCV9fdTggY29va2llW3NpemVvZihpbnQpXTsgICAvKiBBY3R1YWxseSBOT1Qgc2VudCBvdmVyIHRoZSBuZXR3b3JrICovCisJdW5pb24geworCQlfX3U4IGFjazsKKwkJX191OCByYXdbMF07CQkvKiA1MDcgYnl0ZXMgKi8KKwl9IG1lczsKK307CisKKy8qCisgKiBUaGUgZGF0YSBuZWVkZWQgYnkgdGhlIGFjdHVhbCBhcmNuZXQgaGFyZHdhcmUuCisgKgorICogTm93LCBpbiB0aGUgcmVhbCBhcmNuZXQgaGFyZHdhcmUsIHRoZSB0aGlyZCBhbmQgZm91cnRoIGJ5dGVzIGFyZSB0aGUKKyAqICdvZmZzZXQnIHNwZWNpZmljYXRpb24gaW5zdGVhZCBvZiB0aGUgbGVuZ3RoLCBhbmQgdGhlIHNvZnQgZGF0YSBpcyBhdAorICogdGhlIF9lbmRfIG9mIHRoZSA1MTItYnl0ZSBidWZmZXIuICBXZSBoaWRlIHRoaXMgY29tcGxleGl0eSBpbnNpZGUgdGhlCisgKiBkcml2ZXIuCisgKi8KK3N0cnVjdCBhcmNfaGFyZHdhcmUgeworICAgIF9fdTggIHNvdXJjZSwJCS8qIHNvdXJjZSBBUkNuZXQgLSBmaWxsZWQgaW4gYXV0b21hZ2ljYWxseSAqLworICAgICAgICAgICAgIGRlc3QsCQkvKiBkZXN0aW5hdGlvbiBBUkNuZXQgLSAwIGZvciBicm9hZGNhc3QgICAgKi8KKyAgICAJICAgICBvZmZzZXRbMl07CQkvKiBvZmZzZXQgYnl0ZXMgKHNvbWUgd2VpcmQgc2VtYW50aWNzKSAgICAgKi8KK307CisjZGVmaW5lIEFSQ19IRFJfU0laRSA0CisKKy8qCisgKiBUaGlzIGlzIGFuIEFSQ25ldCBmcmFtZSBoZWFkZXIsIGFzIHNlZW4gYnkgdGhlIGtlcm5lbCAoYW5kIHVzZXJzcGFjZSwKKyAqIHdoZW4geW91IGRvIGEgcmF3IHBhY2tldCBjYXB0dXJlKS4KKyAqLworc3RydWN0IGFyY2hkciB7CisgICAgLyogaGFyZHdhcmUgcmVxdWlyZW1lbnRzICovCisgICAgc3RydWN0IGFyY19oYXJkd2FyZSBoYXJkOworICAgICAKKyAgICAvKiBhcmNuZXQgZW5jYXBzdWxhdGlvbi1zcGVjaWZpYyBiaXRzICovCisgICAgdW5pb24geworCXN0cnVjdCBhcmNfcmZjMTIwMSAgIHJmYzEyMDE7CisJc3RydWN0IGFyY19yZmMxMDUxICAgcmZjMTA1MTsKKwlzdHJ1Y3QgYXJjX2V0aF9lbmNhcCBldGhfZW5jYXA7CisJc3RydWN0IGFyY19jYXAgICAgICAgY2FwOworCV9fdTggcmF3WzBdOwkJLyogNTA4IGJ5dGVzCQkJCSovCisgICAgfSBzb2Z0OworfTsKKworI2VuZGlmCQkJCS8qIF9MSU5VWF9JRl9BUkNORVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9hcnAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYXJwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5ZmM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYXJwLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgQVJQIChSRkMgODI2KSBwcm90b2NvbC4KKyAqCisgKiBWZXJzaW9uOglAKCMpaWZfYXJwLmgJMS4wLjEJMDQvMTYvOTMKKyAqCisgKiBBdXRob3JzOglPcmlnaW5hbCB0YWtlbiBmcm9tIEJlcmtlbGV5IFVOSVggNC4zLCAoYykgVUNCIDE5ODYtMTk4OAorICoJCVBvcnRpb25zIHRha2VuIGZyb20gdGhlIEtBOVEvTk9TICh2Mi4wMG0gUEEwR1JJKSBzb3VyY2UuCisgKgkJUm9zcyBCaXJvCisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJRmxvcmlhbiBMYSBSb2NoZSwKKyAqCQlKb25hdGhhbiBMYXllcyA8bGF5ZXNAbG9yYW4uY29tPgorICoJCUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiBBUlBIUkRfSFdYMjUKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfSUZfQVJQX0gKKyNkZWZpbmUgX0xJTlVYX0lGX0FSUF9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworLyogQVJQIHByb3RvY29sIEhBUkRXQVJFIGlkZW50aWZpZXJzLiAqLworI2RlZmluZSBBUlBIUkRfTkVUUk9NCTAJCS8qIGZyb20gS0E5UTogTkVUL1JPTSBwc2V1ZG8JKi8KKyNkZWZpbmUgQVJQSFJEX0VUSEVSIAkxCQkvKiBFdGhlcm5ldCAxME1icHMJCSovCisjZGVmaW5lCUFSUEhSRF9FRVRIRVIJMgkJLyogRXhwZXJpbWVudGFsIEV0aGVybmV0CSovCisjZGVmaW5lCUFSUEhSRF9BWDI1CTMJCS8qIEFYLjI1IExldmVsIDIJCSovCisjZGVmaW5lCUFSUEhSRF9QUk9ORVQJNAkJLyogUFJPbmV0IHRva2VuIHJpbmcJCSovCisjZGVmaW5lCUFSUEhSRF9DSEFPUwk1CQkvKiBDaGFvc25ldAkJCSovCisjZGVmaW5lCUFSUEhSRF9JRUVFODAyCTYJCS8qIElFRUUgODAyLjIgRXRoZXJuZXQvVFIvVEIJKi8KKyNkZWZpbmUJQVJQSFJEX0FSQ05FVAk3CQkvKiBBUkNuZXQJCQkqLworI2RlZmluZQlBUlBIUkRfQVBQTEVUTEsJOAkJLyogQVBQTEV0YWxrCQkJKi8KKyNkZWZpbmUgQVJQSFJEX0RMQ0kJMTUJCS8qIEZyYW1lIFJlbGF5IERMQ0kJCSovCisjZGVmaW5lIEFSUEhSRF9BVE0JMTkJCS8qIEFUTSAJCQkJKi8KKyNkZWZpbmUgQVJQSFJEX01FVFJJQ09NCTIzCQkvKiBNZXRyaWNvbSBTVFJJUCAobmV3IElBTkEgaWQpCSovCisjZGVmaW5lCUFSUEhSRF9JRUVFMTM5NAkyNAkJLyogSUVFRSAxMzk0IElQdjQgLSBSRkMgMjczNAkqLworI2RlZmluZSBBUlBIUkRfRVVJNjQJMjcJCS8qIEVVSS02NCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQVJQSFJEX0lORklOSUJBTkQgMzIJCS8qIEluZmluaUJhbmQJCQkqLworCisvKiBEdW1teSB0eXBlcyBmb3Igbm9uIEFSUCBoYXJkd2FyZSAqLworI2RlZmluZSBBUlBIUkRfU0xJUAkyNTYKKyNkZWZpbmUgQVJQSFJEX0NTTElQCTI1NworI2RlZmluZSBBUlBIUkRfU0xJUDYJMjU4CisjZGVmaW5lIEFSUEhSRF9DU0xJUDYJMjU5CisjZGVmaW5lIEFSUEhSRF9SU1JWRAkyNjAJCS8qIE5vdGlvbmFsIEtJU1MgdHlwZSAJCSovCisjZGVmaW5lIEFSUEhSRF9BREFQVAkyNjQKKyNkZWZpbmUgQVJQSFJEX1JPU0UJMjcwCisjZGVmaW5lIEFSUEhSRF9YMjUJMjcxCQkvKiBDQ0lUVCBYLjI1CQkJKi8KKyNkZWZpbmUgQVJQSFJEX0hXWDI1CTI3MgkJLyogQm9hcmRzIHdpdGggWC4yNSBpbiBmaXJtd2FyZQkqLworI2RlZmluZSBBUlBIUkRfQ0FOCTI4MAkJLyogQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgICAgICAqLworI2RlZmluZSBBUlBIUkRfUFBQCTUxMgorI2RlZmluZSBBUlBIUkRfQ0lTQ08JNTEzCQkvKiBDaXNjbyBIRExDCSAJCSovCisjZGVmaW5lIEFSUEhSRF9IRExDCUFSUEhSRF9DSVNDTworI2RlZmluZSBBUlBIUkRfTEFQQgk1MTYJCS8qIExBUEIJCQkJKi8KKyNkZWZpbmUgQVJQSFJEX0REQ01QICAgIDUxNwkJLyogRGlnaXRhbCdzIEREQ01QIHByb3RvY29sICAgICAqLworI2RlZmluZSBBUlBIUkRfUkFXSERMQwk1MTgJCS8qIFJhdyBIRExDCQkJKi8KKworI2RlZmluZSBBUlBIUkRfVFVOTkVMCTc2OAkJLyogSVBJUCB0dW5uZWwJCQkqLworI2RlZmluZSBBUlBIUkRfVFVOTkVMNgk3NjkJCS8qIElQNklQNiB0dW5uZWwgICAgICAgCQkqLworI2RlZmluZSBBUlBIUkRfRlJBRAk3NzAgICAgICAgICAgICAgLyogRnJhbWUgUmVsYXkgQWNjZXNzIERldmljZSAgICAqLworI2RlZmluZSBBUlBIUkRfU0tJUAk3NzEJCS8qIFNLSVAgdmlmCQkJKi8KKyNkZWZpbmUgQVJQSFJEX0xPT1BCQUNLCTc3MgkJLyogTG9vcGJhY2sgZGV2aWNlCQkqLworI2RlZmluZSBBUlBIUkRfTE9DQUxUTEsgNzczCQkvKiBMb2NhbHRhbGsgZGV2aWNlCQkqLworI2RlZmluZSBBUlBIUkRfRkRESQk3NzQJCS8qIEZpYmVyIERpc3RyaWJ1dGVkIERhdGEgSW50ZXJmYWNlICovCisjZGVmaW5lIEFSUEhSRF9CSUYgICAgICA3NzUgICAgICAgICAgICAgLyogQVAxMDAwIEJJRiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBUlBIUkRfU0lUCTc3NgkJLyogc2l0MCBkZXZpY2UgLSBJUHY2LWluLUlQdjQJKi8KKyNkZWZpbmUgQVJQSFJEX0lQRERQCTc3NwkJLyogSVAgb3ZlciBERFAgdHVubmVsbGVyCSovCisjZGVmaW5lIEFSUEhSRF9JUEdSRQk3NzgJCS8qIEdSRSBvdmVyIElQCQkJKi8KKyNkZWZpbmUgQVJQSFJEX1BJTVJFRwk3NzkJCS8qIFBJTVNNIHJlZ2lzdGVyIGludGVyZmFjZQkqLworI2RlZmluZSBBUlBIUkRfSElQUEkJNzgwCQkvKiBIaWdoIFBlcmZvcm1hbmNlIFBhcmFsbGVsIEludGVyZmFjZSAqLworI2RlZmluZSBBUlBIUkRfQVNICTc4MQkJLyogTmV4dXMgNjRNYnBzIEFzaAkJKi8KKyNkZWZpbmUgQVJQSFJEX0VDT05FVAk3ODIJCS8qIEFjb3JuIEVjb25ldAkJCSovCisjZGVmaW5lIEFSUEhSRF9JUkRBIAk3ODMJCS8qIExpbnV4LUlyREEJCQkqLworLyogQVJQIHdvcmtzIGRpZmZlcmVudGx5IG9uIGRpZmZlcmVudCBGQyBtZWRpYSAuLiBzbyAgKi8KKyNkZWZpbmUgQVJQSFJEX0ZDUFAJNzg0CQkvKiBQb2ludCB0byBwb2ludCBmaWJyZWNoYW5uZWwJKi8KKyNkZWZpbmUgQVJQSFJEX0ZDQUwJNzg1CQkvKiBGaWJyZWNoYW5uZWwgYXJiaXRyYXRlZCBsb29wICovCisjZGVmaW5lIEFSUEhSRF9GQ1BMCTc4NgkJLyogRmlicmVjaGFubmVsIHB1YmxpYyBsb29wCSovCisjZGVmaW5lIEFSUEhSRF9GQ0ZBQlJJQwk3ODcJCS8qIEZpYnJlY2hhbm5lbCBmYWJyaWMJCSovCisJLyogNzg3LT43OTkgcmVzZXJ2ZWQgZm9yIGZpYnJlY2hhbm5lbCBtZWRpYSB0eXBlcyAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMl9UUiA4MDAJCS8qIE1hZ2ljIHR5cGUgaWRlbnQgZm9yIFRSCSovCisjZGVmaW5lIEFSUEhSRF9JRUVFODAyMTEgODAxCQkvKiBJRUVFIDgwMi4xMQkJCSovCisjZGVmaW5lIEFSUEhSRF9JRUVFODAyMTFfUFJJU00gODAyCS8qIElFRUUgODAyLjExICsgUHJpc20yIGhlYWRlciAgKi8KKyNkZWZpbmUgQVJQSFJEX0lFRUU4MDIxMV9SQURJT1RBUCA4MDMJLyogSUVFRSA4MDIuMTEgKyByYWRpb3RhcCBoZWFkZXIgKi8KKyNkZWZpbmUgQVJQSFJEX0lFRUU4MDIxNTQJICA4MDQKKworI2RlZmluZSBBUlBIUkRfUEhPTkVUCTgyMAkJLyogUGhvTmV0IG1lZGlhIHR5cGUJCSovCisjZGVmaW5lIEFSUEhSRF9QSE9ORVRfUElQRSA4MjEJCS8qIFBob05ldCBwaXBlIGhlYWRlcgkJKi8KKyNkZWZpbmUgQVJQSFJEX0NBSUYJODIyCQkvKiBDQUlGIG1lZGlhIHR5cGUJCSovCisKKyNkZWZpbmUgQVJQSFJEX1ZPSUQJICAweEZGRkYJLyogVm9pZCB0eXBlLCBub3RoaW5nIGlzIGtub3duICovCisjZGVmaW5lIEFSUEhSRF9OT05FCSAgMHhGRkZFCS8qIHplcm8gaGVhZGVyIGxlbmd0aCAqLworCisvKiBBUlAgcHJvdG9jb2wgb3Bjb2Rlcy4gKi8KKyNkZWZpbmUJQVJQT1BfUkVRVUVTVAkxCQkvKiBBUlAgcmVxdWVzdAkJCSovCisjZGVmaW5lCUFSUE9QX1JFUExZCTIJCS8qIEFSUCByZXBseQkJCSovCisjZGVmaW5lCUFSUE9QX1JSRVFVRVNUCTMJCS8qIFJBUlAgcmVxdWVzdAkJCSovCisjZGVmaW5lCUFSUE9QX1JSRVBMWQk0CQkvKiBSQVJQIHJlcGx5CQkJKi8KKyNkZWZpbmUJQVJQT1BfSW5SRVFVRVNUCTgJCS8qIEluQVJQIHJlcXVlc3QJCSovCisjZGVmaW5lCUFSUE9QX0luUkVQTFkJOQkJLyogSW5BUlAgcmVwbHkJCQkqLworI2RlZmluZQlBUlBPUF9OQUsJMTAJCS8qIChBVE0pQVJQIE5BSwkJCSovCisKKworLyogQVJQIGlvY3RsIHJlcXVlc3QuICovCitzdHJ1Y3QgYXJwcmVxIHsKKyAgc3RydWN0IHNvY2thZGRyCWFycF9wYTsJCS8qIHByb3RvY29sIGFkZHJlc3MJCSovCisgIHN0cnVjdCBzb2NrYWRkcglhcnBfaGE7CQkvKiBoYXJkd2FyZSBhZGRyZXNzCQkqLworICBpbnQJCQlhcnBfZmxhZ3M7CS8qIGZsYWdzCQkJKi8KKyAgc3RydWN0IHNvY2thZGRyICAgICAgIGFycF9uZXRtYXNrOyAgICAvKiBuZXRtYXNrIChvbmx5IGZvciBwcm94eSBhcnBzKSAqLworICBjaGFyCQkJYXJwX2RldlsxNl07Cit9OworCitzdHJ1Y3QgYXJwcmVxX29sZCB7CisgIHN0cnVjdCBzb2NrYWRkcglhcnBfcGE7CQkvKiBwcm90b2NvbCBhZGRyZXNzCQkqLworICBzdHJ1Y3Qgc29ja2FkZHIJYXJwX2hhOwkJLyogaGFyZHdhcmUgYWRkcmVzcwkJKi8KKyAgaW50CQkJYXJwX2ZsYWdzOwkvKiBmbGFncwkJCSovCisgIHN0cnVjdCBzb2NrYWRkciAgICAgICBhcnBfbmV0bWFzazsgICAgLyogbmV0bWFzayAob25seSBmb3IgcHJveHkgYXJwcykgKi8KK307CisKKy8qIEFSUCBGbGFnIHZhbHVlcy4gKi8KKyNkZWZpbmUgQVRGX0NPTQkJMHgwMgkJLyogY29tcGxldGVkIGVudHJ5IChoYSB2YWxpZCkJKi8KKyNkZWZpbmUJQVRGX1BFUk0JMHgwNAkJLyogcGVybWFuZW50IGVudHJ5CQkqLworI2RlZmluZQlBVEZfUFVCTAkweDA4CQkvKiBwdWJsaXNoIGVudHJ5CQkqLworI2RlZmluZQlBVEZfVVNFVFJBSUxFUlMJMHgxMAkJLyogaGFzIHJlcXVlc3RlZCB0cmFpbGVycwkqLworI2RlZmluZSBBVEZfTkVUTUFTSyAgICAgMHgyMCAgICAgICAgICAgIC8qIHdhbnQgdG8gdXNlIGEgbmV0bWFzayAob25seQorCQkJCQkgICBmb3IgcHJveHkgZW50cmllcykgKi8KKyNkZWZpbmUgQVRGX0RPTlRQVUIJMHg0MAkJLyogZG9uJ3QgYW5zd2VyIHRoaXMgYWRkcmVzc2VzCSovCisKKy8qCisgKglUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGV0aGVybmV0IGFycCBoZWFkZXIuCisgKi8KKworc3RydWN0IGFycGhkciB7CisJX19iZTE2CQlhcl9ocmQ7CQkvKiBmb3JtYXQgb2YgaGFyZHdhcmUgYWRkcmVzcwkqLworCV9fYmUxNgkJYXJfcHJvOwkJLyogZm9ybWF0IG9mIHByb3RvY29sIGFkZHJlc3MJKi8KKwl1bnNpZ25lZCBjaGFyCWFyX2hsbjsJCS8qIGxlbmd0aCBvZiBoYXJkd2FyZSBhZGRyZXNzCSovCisJdW5zaWduZWQgY2hhcglhcl9wbG47CQkvKiBsZW5ndGggb2YgcHJvdG9jb2wgYWRkcmVzcwkqLworCV9fYmUxNgkJYXJfb3A7CQkvKiBBUlAgb3Bjb2RlIChjb21tYW5kKQkJKi8KKworI2lmIDAKKwkgLyoKKwkgICoJIEV0aGVybmV0IGxvb2tzIGxpa2UgdGhpcyA6IFRoaXMgYml0IGlzIHZhcmlhYmxlIHNpemVkIGhvd2V2ZXIuLi4KKwkgICovCisJdW5zaWduZWQgY2hhcgkJYXJfc2hhW0VUSF9BTEVOXTsJLyogc2VuZGVyIGhhcmR3YXJlIGFkZHJlc3MJKi8KKwl1bnNpZ25lZCBjaGFyCQlhcl9zaXBbNF07CQkvKiBzZW5kZXIgSVAgYWRkcmVzcwkJKi8KKwl1bnNpZ25lZCBjaGFyCQlhcl90aGFbRVRIX0FMRU5dOwkvKiB0YXJnZXQgaGFyZHdhcmUgYWRkcmVzcwkqLworCXVuc2lnbmVkIGNoYXIJCWFyX3RpcFs0XTsJCS8qIHRhcmdldCBJUCBhZGRyZXNzCQkqLworI2VuZGlmCisKK307CisKKworI2VuZGlmCS8qIF9MSU5VWF9JRl9BUlBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9ib25kaW5nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2JvbmRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdlZGRhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9ib25kaW5nLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBCb25kIHNldmVyYWwgZXRoZXJuZXQgaW50ZXJmYWNlcyBpbnRvIGEgQ2lzY28sIHJ1bm5pbmcgJ0V0aGVyY2hhbm5lbCcuCisgKgorICoKKyAqIFBvcnRpb25zIGFyZSAoYykgQ29weXJpZ2h0IDE5OTUgU2ltb24gIkd1cnUgQWxlcGgtTnVsbCIgSmFuZXMKKyAqIE5DTTogTmV0d29yayBhbmQgQ29tbXVuaWNhdGlvbnMgTWFuYWdlbWVudCwgSW5jLgorICoKKyAqIEJVVCwgSSdtIHRoZSBvbmUgd2hvIG1vZGlmaWVkIGl0IGZvciBldGhlcm5ldCwgc286CisgKiAoYykgQ29weXJpZ2h0IDE5OTksIFRob21hcyBEYXZpcywgdGFkYXZpc0BsYmwuZ292CisgKgorICoJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICoJb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogMjAwMy8wMy8xOCAtIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKgktIEFkZGVkIHN1cHBvcnQgZm9yIGdldHRpbmcgc2xhdmUncyBzcGVlZCBhbmQgZHVwbGV4IHZpYSBldGh0b29sLgorICoJICBOZWVkZWQgZm9yIDgwMi4zYWQgYW5kIG90aGVyIGZ1dHVyZSBtb2Rlcy4KKyAqCisgKiAyMDAzLzAzLzE4IC0gVHNpcHB5IE1lbmRlbHNvbiA8dHNpcHB5Lm1lbmRlbHNvbiBhdCBpbnRlbCBkb3QgY29tPiBhbmQKKyAqCQlTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gRW5hYmxlIHN1cHBvcnQgb2YgbW9kZXMgdGhhdCBuZWVkIHRvIHVzZSB0aGUgdW5pcXVlIG1hYyBhZGRyZXNzIG9mCisgKgkgIGVhY2ggc2xhdmUuCisgKgorICogMjAwMy8wMy8xOCAtIFRzaXBweSBNZW5kZWxzb24gPHRzaXBweS5tZW5kZWxzb24gYXQgaW50ZWwgZG90IGNvbT4gYW5kCisgKgkJQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gTW92ZWQgZHJpdmVyJ3MgcHJpdmF0ZSBkYXRhIHR5cGVzIHRvIGJvbmRpbmcuaAorICoKKyAqIDIwMDMvMDMvMTggLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPiwKKyAqCQlUc2lwcHkgTWVuZGVsc29uIDx0c2lwcHkubWVuZGVsc29uIGF0IGludGVsIGRvdCBjb20+IGFuZAorICoJCVNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBBZGRlZCBzdXBwb3J0IGZvciBJRUVFIDgwMi4zYWQgRHluYW1pYyBsaW5rIGFnZ3JlZ2F0aW9uIG1vZGUuCisgKgorICogMjAwMy8wNS8wMSAtIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKgktIEFkZGVkIEFCSSB2ZXJzaW9uIGNvbnRyb2wgdG8gcmVzdG9yZSBjb21wYXRpYmlsaXR5IGJldHdlZW4KKyAqCSAgbmV3L29sZCBpZmVuc2xhdmUgYW5kIG5ldy9vbGQgYm9uZGluZy4KKyAqCisgKiAyMDAzLzEyLzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIENvZGUgY2xlYW51cCBhbmQgc3R5bGUgY2hhbmdlcworICoKKyAqIDIwMDUvMDUvMDUgLSBKYXNvbiBHYWJsZXIgPGp5Z2FibGVyIGF0IGxibCBkb3QgZ292PgorICogICAgICAtIGFkZGVkIGRlZmluaXRpb25zIGZvciB2YXJpb3VzIFhPUiBoYXNoaW5nIHBvbGljaWVzCisgKi8KKworI2lmbmRlZiBfTElOVVhfSUZfQk9ORElOR19ICisjZGVmaW5lIF9MSU5VWF9JRl9CT05ESU5HX0gKKworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCisvKiB1c2VybGFuZCAtIGtlcm5lbCBBQkkgdmVyc2lvbiAoMjAwMy8wNS8wOCkgKi8KKyNkZWZpbmUgQk9ORF9BQklfVkVSU0lPTiAyCisKKy8qCisgKiBXZSBjYW4gcmVtb3ZlIHRoZXNlIGlvY3RsIGRlZmluaXRpb25zIGluIDIuNS4gIFBlb3BsZSBzaG91bGQgdXNlIHRoZQorICogU0lPQyoqKiB2ZXJzaW9ucyBvZiB0aGVtIGluc3RlYWQKKyAqLworI2RlZmluZSBCT05EX0VOU0xBVkVfT0xECQkoU0lPQ0RFVlBSSVZBVEUpCisjZGVmaW5lIEJPTkRfUkVMRUFTRV9PTEQJCShTSU9DREVWUFJJVkFURSArIDEpCisjZGVmaW5lIEJPTkRfU0VUSFdBRERSX09MRAkJKFNJT0NERVZQUklWQVRFICsgMikKKyNkZWZpbmUgQk9ORF9TTEFWRV9JTkZPX1FVRVJZX09MRAkoU0lPQ0RFVlBSSVZBVEUgKyAxMSkKKyNkZWZpbmUgQk9ORF9JTkZPX1FVRVJZX09MRAkJKFNJT0NERVZQUklWQVRFICsgMTIpCisjZGVmaW5lIEJPTkRfQ0hBTkdFX0FDVElWRV9PTEQJCShTSU9DREVWUFJJVkFURSArIDEzKQorCisjZGVmaW5lIEJPTkRfQ0hFQ0tfTUlJX1NUQVRVUwkoU0lPQ0dNSUlQSFkpCisKKyNkZWZpbmUgQk9ORF9NT0RFX1JPVU5EUk9CSU4JMAorI2RlZmluZSBCT05EX01PREVfQUNUSVZFQkFDS1VQCTEKKyNkZWZpbmUgQk9ORF9NT0RFX1hPUgkJMgorI2RlZmluZSBCT05EX01PREVfQlJPQURDQVNUCTMKKyNkZWZpbmUgQk9ORF9NT0RFXzgwMjNBRCAgICAgICAgNAorI2RlZmluZSBCT05EX01PREVfVExCICAgICAgICAgICA1CisjZGVmaW5lIEJPTkRfTU9ERV9BTEIJCTYgLyogVExCICsgUkxCIChyZWNlaXZlIGxvYWQgYmFsYW5jaW5nKSAqLworCisvKiBlYWNoIHNsYXZlJ3MgbGluayBoYXMgNCBzdGF0ZXMgKi8KKyNkZWZpbmUgQk9ORF9MSU5LX1VQICAgIDAgICAgICAgICAgIC8qIGxpbmsgaXMgdXAgYW5kIHJ1bm5pbmcgKi8KKyNkZWZpbmUgQk9ORF9MSU5LX0ZBSUwgIDEgICAgICAgICAgIC8qIGxpbmsgaGFzIGp1c3QgZ29uZSBkb3duICovCisjZGVmaW5lIEJPTkRfTElOS19ET1dOICAyICAgICAgICAgICAvKiBsaW5rIGhhcyBiZWVuIGRvd24gZm9yIHRvbyBsb25nIHRpbWUgKi8KKyNkZWZpbmUgQk9ORF9MSU5LX0JBQ0sgIDMgICAgICAgICAgIC8qIGxpbmsgaXMgZ29pbmcgYmFjayAqLworCisvKiBlYWNoIHNsYXZlIGhhcyBzZXZlcmFsIHN0YXRlcyAqLworI2RlZmluZSBCT05EX1NUQVRFX0FDVElWRSAgICAgICAwICAgLyogbGluayBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgQk9ORF9TVEFURV9CQUNLVVAgICAgICAgMSAgIC8qIGxpbmsgaXMgYmFja3VwICovCisKKyNkZWZpbmUgQk9ORF9ERUZBVUxUX01BWF9CT05EUyAgMSAgIC8qIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgZGV2aWNlcyB0byBzdXBwb3J0ICovCisKKyNkZWZpbmUgQk9ORF9ERUZBVUxUX1RYX1FVRVVFUyAxNiAgIC8qIERlZmF1bHQgbnVtYmVyIG9mIHR4IHF1ZXVlcyBwZXIgZGV2aWNlICovCisKKyNkZWZpbmUgQk9ORF9ERUZBVUxUX1JFU0VORF9JR01QCTEgLyogRGVmYXVsdCBudW1iZXIgb2YgSUdNUCBtZW1iZXJzaGlwIHJlcG9ydHMgKi8KKworLyogaGFzaGluZyB0eXBlcyAqLworI2RlZmluZSBCT05EX1hNSVRfUE9MSUNZX0xBWUVSMgkJMCAvKiBsYXllciAyIChNQUMgb25seSksIGRlZmF1bHQgKi8KKyNkZWZpbmUgQk9ORF9YTUlUX1BPTElDWV9MQVlFUjM0CTEgLyogbGF5ZXIgMys0IChJUCBeIChUQ1AgfHwgVURQKSkgKi8KKyNkZWZpbmUgQk9ORF9YTUlUX1BPTElDWV9MQVlFUjIzCTIgLyogbGF5ZXIgMiszIChJUCBeIE1BQykgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaWZib25kIHsKKwlfX3MzMiBib25kX21vZGU7CisJX19zMzIgbnVtX3NsYXZlczsKKwlfX3MzMiBtaWltb247Cit9IGlmYm9uZDsKKwordHlwZWRlZiBzdHJ1Y3QgaWZzbGF2ZSB7CisJX19zMzIgc2xhdmVfaWQ7IC8qIFVzZWQgYXMgYW4gSU4gcGFyYW0gdG8gdGhlIEJPTkRfU0xBVkVfSU5GT19RVUVSWSBpb2N0bCAqLworCWNoYXIgc2xhdmVfbmFtZVtJRk5BTVNJWl07CisJX19zOCBsaW5rOworCV9fczggc3RhdGU7CisJX191MzIgIGxpbmtfZmFpbHVyZV9jb3VudDsKK30gaWZzbGF2ZTsKKworc3RydWN0IGFkX2luZm8geworCV9fdTE2IGFnZ3JlZ2F0b3JfaWQ7CisJX191MTYgcG9ydHM7CisJX191MTYgYWN0b3Jfa2V5OworCV9fdTE2IHBhcnRuZXJfa2V5OworCV9fdTggcGFydG5lcl9zeXN0ZW1bRVRIX0FMRU5dOworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9JRl9CT05ESU5HX0ggKi8KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKKyAqICBrZXB0LW5ldy12ZXJzaW9uczogNQorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTkxMWI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqCUxpbnV4IGV0aGVybmV0IGJyaWRnZQorICoKKyAqCUF1dGhvcnM6CisgKglMZW5uZXJ0IEJ1eXRlbmhlawkJPGJ1eXRlbmhAZ251Lm9yZz4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX0JSSURHRV9ICisjZGVmaW5lIF9MSU5VWF9JRl9CUklER0VfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBTWVNGU19CUklER0VfQVRUUgkiYnJpZGdlIgorI2RlZmluZSBTWVNGU19CUklER0VfRkRCCSJicmZvcndhcmQiCisjZGVmaW5lIFNZU0ZTX0JSSURHRV9QT1JUX1NVQkRJUiAiYnJpZiIKKyNkZWZpbmUgU1lTRlNfQlJJREdFX1BPUlRfQVRUUgkiYnJwb3J0IgorI2RlZmluZSBTWVNGU19CUklER0VfUE9SVF9MSU5LCSJicmlkZ2UiCisKKyNkZWZpbmUgQlJDVExfVkVSU0lPTiAxCisKKyNkZWZpbmUgQlJDVExfR0VUX1ZFUlNJT04gMAorI2RlZmluZSBCUkNUTF9HRVRfQlJJREdFUyAxCisjZGVmaW5lIEJSQ1RMX0FERF9CUklER0UgMgorI2RlZmluZSBCUkNUTF9ERUxfQlJJREdFIDMKKyNkZWZpbmUgQlJDVExfQUREX0lGIDQKKyNkZWZpbmUgQlJDVExfREVMX0lGIDUKKyNkZWZpbmUgQlJDVExfR0VUX0JSSURHRV9JTkZPIDYKKyNkZWZpbmUgQlJDVExfR0VUX1BPUlRfTElTVCA3CisjZGVmaW5lIEJSQ1RMX1NFVF9CUklER0VfRk9SV0FSRF9ERUxBWSA4CisjZGVmaW5lIEJSQ1RMX1NFVF9CUklER0VfSEVMTE9fVElNRSA5CisjZGVmaW5lIEJSQ1RMX1NFVF9CUklER0VfTUFYX0FHRSAxMAorI2RlZmluZSBCUkNUTF9TRVRfQUdFSU5HX1RJTUUgMTEKKyNkZWZpbmUgQlJDVExfU0VUX0dDX0lOVEVSVkFMIDEyCisjZGVmaW5lIEJSQ1RMX0dFVF9QT1JUX0lORk8gMTMKKyNkZWZpbmUgQlJDVExfU0VUX0JSSURHRV9TVFBfU1RBVEUgMTQKKyNkZWZpbmUgQlJDVExfU0VUX0JSSURHRV9QUklPUklUWSAxNQorI2RlZmluZSBCUkNUTF9TRVRfUE9SVF9QUklPUklUWSAxNgorI2RlZmluZSBCUkNUTF9TRVRfUEFUSF9DT1NUIDE3CisjZGVmaW5lIEJSQ1RMX0dFVF9GREJfRU5UUklFUyAxOAorCisjZGVmaW5lIEJSX1NUQVRFX0RJU0FCTEVEIDAKKyNkZWZpbmUgQlJfU1RBVEVfTElTVEVOSU5HIDEKKyNkZWZpbmUgQlJfU1RBVEVfTEVBUk5JTkcgMgorI2RlZmluZSBCUl9TVEFURV9GT1JXQVJESU5HIDMKKyNkZWZpbmUgQlJfU1RBVEVfQkxPQ0tJTkcgNAorCitzdHJ1Y3QgX19icmlkZ2VfaW5mbyB7CisJX191NjQgZGVzaWduYXRlZF9yb290OworCV9fdTY0IGJyaWRnZV9pZDsKKwlfX3UzMiByb290X3BhdGhfY29zdDsKKwlfX3UzMiBtYXhfYWdlOworCV9fdTMyIGhlbGxvX3RpbWU7CisJX191MzIgZm9yd2FyZF9kZWxheTsKKwlfX3UzMiBicmlkZ2VfbWF4X2FnZTsKKwlfX3UzMiBicmlkZ2VfaGVsbG9fdGltZTsKKwlfX3UzMiBicmlkZ2VfZm9yd2FyZF9kZWxheTsKKwlfX3U4IHRvcG9sb2d5X2NoYW5nZTsKKwlfX3U4IHRvcG9sb2d5X2NoYW5nZV9kZXRlY3RlZDsKKwlfX3U4IHJvb3RfcG9ydDsKKwlfX3U4IHN0cF9lbmFibGVkOworCV9fdTMyIGFnZWluZ190aW1lOworCV9fdTMyIGdjX2ludGVydmFsOworCV9fdTMyIGhlbGxvX3RpbWVyX3ZhbHVlOworCV9fdTMyIHRjbl90aW1lcl92YWx1ZTsKKwlfX3UzMiB0b3BvbG9neV9jaGFuZ2VfdGltZXJfdmFsdWU7CisJX191MzIgZ2NfdGltZXJfdmFsdWU7Cit9OworCitzdHJ1Y3QgX19wb3J0X2luZm8geworCV9fdTY0IGRlc2lnbmF0ZWRfcm9vdDsKKwlfX3U2NCBkZXNpZ25hdGVkX2JyaWRnZTsKKwlfX3UxNiBwb3J0X2lkOworCV9fdTE2IGRlc2lnbmF0ZWRfcG9ydDsKKwlfX3UzMiBwYXRoX2Nvc3Q7CisJX191MzIgZGVzaWduYXRlZF9jb3N0OworCV9fdTggc3RhdGU7CisJX191OCB0b3BfY2hhbmdlX2FjazsKKwlfX3U4IGNvbmZpZ19wZW5kaW5nOworCV9fdTggdW51c2VkMDsKKwlfX3UzMiBtZXNzYWdlX2FnZV90aW1lcl92YWx1ZTsKKwlfX3UzMiBmb3J3YXJkX2RlbGF5X3RpbWVyX3ZhbHVlOworCV9fdTMyIGhvbGRfdGltZXJfdmFsdWU7Cit9OworCitzdHJ1Y3QgX19mZGJfZW50cnkgeworCV9fdTggbWFjX2FkZHJbNl07CisJX191OCBwb3J0X25vOworCV9fdTggaXNfbG9jYWw7CisJX191MzIgYWdlaW5nX3RpbWVyX3ZhbHVlOworCV9fdTggcG9ydF9oaTsKKwlfX3U4IHBhZDA7CisJX191MTYgdW51c2VkOworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfY2FibGVtb2RlbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9jYWJsZW1vZGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhMTAwNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfY2FibGVtb2RlbS5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX0xJTlVYX0NBQkxFTU9ERU1fSF8KKyNkZWZpbmUgX0xJTlVYX0NBQkxFTU9ERU1fSF8KKy8qCisgKgkJQXV0aG9yOiBGcmFuY28gVmVudHVyaSA8ZnZlbnR1cmlAbWVkaWFvbmUubmV0PgorICoJCUNvcHlyaWdodCAxOTk4IEZyYW5jbyBWZW50dXJpCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorICoJCWFuZC9vciAgbW9kaWZ5IGl0IHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbAorICoJCVB1YmxpYyAgTGljZW5zZSBhcyAgcHVibGlzaGVkICBieSAgdGhlICBGcmVlICBTb2Z0d2FyZQorICoJCUZvdW5kYXRpb247ICBlaXRoZXIgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgIChhdAorICoJCXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKiBzb21lIHVzZWZ1bCBkZWZpbmVzIGZvciBzYjEwMDAuYyBlIGNtY29uZmlnLmMgLSBmdiAqLworI2RlZmluZSBTSU9DR0NNU1RBVFMJCVNJT0NERVZQUklWQVRFKzAJLyogZ2V0IGNhYmxlIG1vZGVtIHN0YXRzICovCisjZGVmaW5lIFNJT0NHQ01GSVJNV0FSRQkJU0lPQ0RFVlBSSVZBVEUrMQkvKiBnZXQgY20gZmlybXdhcmUgdmVyc2lvbiAqLworI2RlZmluZSBTSU9DR0NNRlJFUVVFTkNZCVNJT0NERVZQUklWQVRFKzIJLyogZ2V0IGNhYmxlIG1vZGVtIGZyZXF1ZW5jeSAqLworI2RlZmluZSBTSU9DU0NNRlJFUVVFTkNZCVNJT0NERVZQUklWQVRFKzMJLyogc2V0IGNhYmxlIG1vZGVtIGZyZXF1ZW5jeSAqLworI2RlZmluZSBTSU9DR0NNUElEUwkJCVNJT0NERVZQUklWQVRFKzQJLyogZ2V0IGNhYmxlIG1vZGVtIFBJRHMgKi8KKyNkZWZpbmUgU0lPQ1NDTVBJRFMJCQlTSU9DREVWUFJJVkFURSs1CS8qIHNldCBjYWJsZSBtb2RlbSBQSURzICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9lYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9lYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwN2VkZTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2VjLmgKQEAgLTAsMCArMSwzNCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIEVjb25ldCBzb2NrZXRzLiAqLworCisjaWZuZGVmIF9fTElOVVhfSUZfRUMKKyNkZWZpbmUgX19MSU5VWF9JRl9FQworCisvKiBVc2VyIHZpc2libGUgc3R1ZmYuIEdsaWJjIHByb3ZpZGVzIGl0cyBvd24gYnV0IGxpYmM1IGZvbGsgd2lsbCB1c2UgdGhlc2UgKi8KKworc3RydWN0IGVjX2FkZHIgeworICB1bnNpZ25lZCBjaGFyIHN0YXRpb247CQkvKiBTdGF0aW9uIG51bWJlci4gICovCisgIHVuc2lnbmVkIGNoYXIgbmV0OwkJCS8qIE5ldHdvcmsgbnVtYmVyLiAgKi8KK307CisKK3N0cnVjdCBzb2NrYWRkcl9lYyB7CisgIHVuc2lnbmVkIHNob3J0IHNlY19mYW1pbHk7CisgIHVuc2lnbmVkIGNoYXIgcG9ydDsJCQkvKiBQb3J0IG51bWJlci4gICovCisgIHVuc2lnbmVkIGNoYXIgY2I7CQkJLyogQ29udHJvbC9mbGFnIGJ5dGUuICAqLworICB1bnNpZ25lZCBjaGFyIHR5cGU7CQkJLyogVHlwZSBvZiBtZXNzYWdlLiAgKi8KKyAgc3RydWN0IGVjX2FkZHIgYWRkcjsKKyAgdW5zaWduZWQgbG9uZyBjb29raWU7Cit9OworCisjZGVmaW5lIEVDVFlQRV9QQUNLRVRfUkVDRUlWRUQJCTAJLyogUGFja2V0IHJlY2VpdmVkICovCisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9TVEFUVVMJCTB4MTAJLyogVHJhbnNtaXQgY29tcGxldGVkLCAKKwkJCQkJCSAgIGxvdyBuaWJibGUgaG9sZHMgc3RhdHVzICovCisKKyNkZWZpbmUgRUNUWVBFX1RSQU5TTUlUX09LCQkxCisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9OT1RfTElTVEVOSU5HCTIKKyNkZWZpbmUgRUNUWVBFX1RSQU5TTUlUX05FVF9FUlJPUgkzCisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9OT19DTE9DSwk0CisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9MSU5FX0pBTU1FRAk1CisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9OT1RfUFJFU0VOVAk2CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2VxbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9lcWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGI5NGVjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9lcWwuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogRXF1YWxpemVyIExvYWQtYmFsYW5jZXIgZm9yIHNlcmlhbCBuZXR3b3JrIGludGVyZmFjZXMuCisgKgorICogKGMpIENvcHlyaWdodCAxOTk1IFNpbW9uICJHdXJ1IEFsZXBoLU51bGwiIEphbmVzCisgKiBOQ006IE5ldHdvcmsgYW5kIENvbW11bmljYXRpb25zIE1hbmFnZW1lbnQsIEluYy4KKyAqCisgKgorICoJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICoJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqIAorICogVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBzaW1vbkBuY20uY29tLCBvciBDL08KKyAqICAgIE5DTQorICogICAgQXR0bjogU2ltb24gSmFuZXMKKyAqICAgIDY4MDMgV2hpdHRpZXIgQXZlCisgKiAgICBNY0xlYW4gVkEgMjIxMDEKKyAqICAgIFBob25lOiAxLTcwMy04NDctMDA0MCBleHQgMTAzCisgKi8KKworI2lmbmRlZiBfTElOVVhfSUZfRVFMX0gKKyNkZWZpbmUgX0xJTlVYX0lGX0VRTF9ICisKKyNkZWZpbmUgRVFMX0RFRkFVTFRfU0xBVkVfUFJJT1JJVFkgMjg4MDAKKyNkZWZpbmUgRVFMX0RFRkFVTFRfTUFYX1NMQVZFUyAgICAgNAorI2RlZmluZSBFUUxfREVGQVVMVF9NVFUgICAgICAgICAgICA1NzYKKyNkZWZpbmUgRVFMX0RFRkFVTFRfUkVTQ0hFRF9JVkFMICAgMTAwCisKKyNkZWZpbmUgRVFMX0VOU0xBVkUgICAgIChTSU9DREVWUFJJVkFURSkKKyNkZWZpbmUgRVFMX0VNQU5DSVBBVEUgIChTSU9DREVWUFJJVkFURSArIDEpCisKKyNkZWZpbmUgRVFMX0dFVFNMQVZFQ0ZHIChTSU9DREVWUFJJVkFURSArIDIpCisjZGVmaW5lIEVRTF9TRVRTTEFWRUNGRyAoU0lPQ0RFVlBSSVZBVEUgKyAzKQorCisjZGVmaW5lIEVRTF9HRVRNQVNUUkNGRyAoU0lPQ0RFVlBSSVZBVEUgKyA0KQorI2RlZmluZSBFUUxfU0VUTUFTVFJDRkcgKFNJT0NERVZQUklWQVRFICsgNSkKKworCit0eXBlZGVmIHN0cnVjdCBtYXN0ZXJfY29uZmlnIHsKKwljaGFyCW1hc3Rlcl9uYW1lWzE2XTsKKwlpbnQJbWF4X3NsYXZlczsKKwlpbnQJbWluX3NsYXZlczsKK30gbWFzdGVyX2NvbmZpZ190OworCit0eXBlZGVmIHN0cnVjdCBzbGF2ZV9jb25maWcgeworCWNoYXIJc2xhdmVfbmFtZVsxNl07CisJbG9uZwlwcmlvcml0eTsKK30gc2xhdmVfY29uZmlnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNsYXZpbmdfcmVxdWVzdCB7CisJY2hhcglzbGF2ZV9uYW1lWzE2XTsKKwlsb25nCXByaW9yaXR5OworfSBzbGF2aW5nX3JlcXVlc3RfdDsKKworCisjZW5kaWYgLyogX0xJTlVYX0VRTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwMTViZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBFdGhlcm5ldCBJRUVFIDgwMi4zIGludGVyZmFjZS4KKyAqCisgKiBWZXJzaW9uOglAKCMpaWZfZXRoZXIuaAkxLjAuMWEJMDIvMDgvOTQKKyAqCisgKiBBdXRob3I6CUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCURvbmFsZCBCZWNrZXIsIDxiZWNrZXJAc3VwZXIub3JnPgorICoJCUFsYW4gQ294LCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgorICoJCVN0ZXZlIFdoaXRlaG91c2UsIDxndzdycm1AZWVzaGFjazMuc3dhbi5hYy51az4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9JRl9FVEhFUl9ICisjZGVmaW5lIF9MSU5VWF9JRl9FVEhFUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICoJSUVFRSA4MDIuMyBFdGhlcm5ldCBtYWdpYyBjb25zdGFudHMuICBUaGUgZnJhbWUgc2l6ZXMgb21pdCB0aGUgcHJlYW1ibGUKKyAqCWFuZCBGQ1MvQ1JDIChmcmFtZSBjaGVjayBzZXF1ZW5jZSkuCisgKi8KKworI2RlZmluZSBFVEhfQUxFTgk2CQkvKiBPY3RldHMgaW4gb25lIGV0aGVybmV0IGFkZHIJICovCisjZGVmaW5lIEVUSF9ITEVOCTE0CQkvKiBUb3RhbCBvY3RldHMgaW4gaGVhZGVyLgkgKi8KKyNkZWZpbmUgRVRIX1pMRU4JNjAJCS8qIE1pbi4gb2N0ZXRzIGluIGZyYW1lIHNhbnMgRkNTICovCisjZGVmaW5lIEVUSF9EQVRBX0xFTgkxNTAwCQkvKiBNYXguIG9jdGV0cyBpbiBwYXlsb2FkCSAqLworI2RlZmluZSBFVEhfRlJBTUVfTEVOCTE1MTQJCS8qIE1heC4gb2N0ZXRzIGluIGZyYW1lIHNhbnMgRkNTICovCisjZGVmaW5lIEVUSF9GQ1NfTEVOCTQJCS8qIE9jdGV0cyBpbiB0aGUgRkNTCQkgKi8KKworLyoKKyAqCVRoZXNlIGFyZSB0aGUgZGVmaW5lZCBFdGhlcm5ldCBQcm90b2NvbCBJRCdzLgorICovCisKKyNkZWZpbmUgRVRIX1BfTE9PUAkweDAwNjAJCS8qIEV0aGVybmV0IExvb3BiYWNrIHBhY2tldAkqLworI2RlZmluZSBFVEhfUF9QVVAJMHgwMjAwCQkvKiBYZXJveCBQVVAgcGFja2V0CQkqLworI2RlZmluZSBFVEhfUF9QVVBBVAkweDAyMDEJCS8qIFhlcm94IFBVUCBBZGRyIFRyYW5zIHBhY2tldAkqLworI2RlZmluZSBFVEhfUF9JUAkweDA4MDAJCS8qIEludGVybmV0IFByb3RvY29sIHBhY2tldAkqLworI2RlZmluZSBFVEhfUF9YMjUJMHgwODA1CQkvKiBDQ0lUVCBYLjI1CQkJKi8KKyNkZWZpbmUgRVRIX1BfQVJQCTB4MDgwNgkJLyogQWRkcmVzcyBSZXNvbHV0aW9uIHBhY2tldAkqLworI2RlZmluZQlFVEhfUF9CUFEJMHgwOEZGCQkvKiBHOEJQUSBBWC4yNSBFdGhlcm5ldCBQYWNrZXQJWyBOT1QgQU4gT0ZGSUNJQUxMWSBSRUdJU1RFUkVEIElEIF0gKi8KKyNkZWZpbmUgRVRIX1BfSUVFRVBVUAkweDBhMDAJCS8qIFhlcm94IElFRUU4MDIuMyBQVVAgcGFja2V0ICovCisjZGVmaW5lIEVUSF9QX0lFRUVQVVBBVAkweDBhMDEJCS8qIFhlcm94IElFRUU4MDIuMyBQVVAgQWRkciBUcmFucyBwYWNrZXQgKi8KKyNkZWZpbmUgRVRIX1BfREVDICAgICAgIDB4NjAwMCAgICAgICAgICAvKiBERUMgQXNzaWduZWQgcHJvdG8gICAgICAgICAgICovCisjZGVmaW5lIEVUSF9QX0ROQV9ETCAgICAweDYwMDEgICAgICAgICAgLyogREVDIEROQSBEdW1wL0xvYWQgICAgICAgICAgICAqLworI2RlZmluZSBFVEhfUF9ETkFfUkMgICAgMHg2MDAyICAgICAgICAgIC8qIERFQyBETkEgUmVtb3RlIENvbnNvbGUgICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfRE5BX1JUICAgIDB4NjAwMyAgICAgICAgICAvKiBERUMgRE5BIFJvdXRpbmcgICAgICAgICAgICAgICovCisjZGVmaW5lIEVUSF9QX0xBVCAgICAgICAweDYwMDQgICAgICAgICAgLyogREVDIExBVCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFVEhfUF9ESUFHICAgICAgMHg2MDA1ICAgICAgICAgIC8qIERFQyBEaWFnbm9zdGljcyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfQ1VTVCAgICAgIDB4NjAwNiAgICAgICAgICAvKiBERUMgQ3VzdG9tZXIgdXNlICAgICAgICAgICAgICovCisjZGVmaW5lIEVUSF9QX1NDQSAgICAgICAweDYwMDcgICAgICAgICAgLyogREVDIFN5c3RlbXMgQ29tbXMgQXJjaCAgICAgICAqLworI2RlZmluZSBFVEhfUF9URUIJMHg2NTU4CQkvKiBUcmFucyBFdGhlciBCcmlkZ2luZwkJKi8KKyNkZWZpbmUgRVRIX1BfUkFSUCAgICAgIDB4ODAzNQkJLyogUmV2ZXJzZSBBZGRyIFJlcyBwYWNrZXQJKi8KKyNkZWZpbmUgRVRIX1BfQVRBTEsJMHg4MDlCCQkvKiBBcHBsZXRhbGsgRERQCQkqLworI2RlZmluZSBFVEhfUF9BQVJQCTB4ODBGMwkJLyogQXBwbGV0YWxrIEFBUlAJCSovCisjZGVmaW5lIEVUSF9QXzgwMjFRCTB4ODEwMCAgICAgICAgICAvKiA4MDIuMVEgVkxBTiBFeHRlbmRlZCBIZWFkZXIgICovCisjZGVmaW5lIEVUSF9QX0lQWAkweDgxMzcJCS8qIElQWCBvdmVyIERJWAkJCSovCisjZGVmaW5lIEVUSF9QX0lQVjYJMHg4NkRECQkvKiBJUHY2IG92ZXIgYmx1ZWJvb2sJCSovCisjZGVmaW5lIEVUSF9QX1BBVVNFCTB4ODgwOAkJLyogSUVFRSBQYXVzZSBmcmFtZXMuIFNlZSA4MDIuMyAzMUIgKi8KKyNkZWZpbmUgRVRIX1BfU0xPVwkweDg4MDkJCS8qIFNsb3cgUHJvdG9jb2wuIFNlZSA4MDIuM2FkIDQzQiAqLworI2RlZmluZSBFVEhfUF9XQ0NQCTB4ODgzRQkJLyogV2ViLWNhY2hlIGNvb3JkaW5hdGlvbiBwcm90b2NvbAorCQkJCQkgKiBkZWZpbmVkIGluIGRyYWZ0LXdpbHNvbi13cmVjLXdjY3AtdjItMDAudHh0ICovCisjZGVmaW5lIEVUSF9QX1BQUF9ESVNDCTB4ODg2MwkJLyogUFBQb0UgZGlzY292ZXJ5IG1lc3NhZ2VzICAgICAqLworI2RlZmluZSBFVEhfUF9QUFBfU0VTCTB4ODg2NAkJLyogUFBQb0Ugc2Vzc2lvbiBtZXNzYWdlcwkqLworI2RlZmluZSBFVEhfUF9NUExTX1VDCTB4ODg0NwkJLyogTVBMUyBVbmljYXN0IHRyYWZmaWMJCSovCisjZGVmaW5lIEVUSF9QX01QTFNfTUMJMHg4ODQ4CQkvKiBNUExTIE11bHRpY2FzdCB0cmFmZmljCSovCisjZGVmaW5lIEVUSF9QX0FUTU1QT0EJMHg4ODRjCQkvKiBNdWx0aVByb3RvY29sIE92ZXIgQVRNCSovCisjZGVmaW5lIEVUSF9QX0xJTktfQ1RMCTB4ODg2YwkJLyogSFBOQSwgd2xhbiBsaW5rIGxvY2FsIHR1bm5lbCAqLworI2RlZmluZSBFVEhfUF9BVE1GQVRFCTB4ODg4NAkJLyogRnJhbWUtYmFzZWQgQVRNIFRyYW5zcG9ydAorCQkJCQkgKiBvdmVyIEV0aGVybmV0CisJCQkJCSAqLworI2RlZmluZSBFVEhfUF9QQUUJMHg4ODhFCQkvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLworI2RlZmluZSBFVEhfUF9BT0UJMHg4OEEyCQkvKiBBVEEgb3ZlciBFdGhlcm5ldAkJKi8KKyNkZWZpbmUgRVRIX1BfODAyMUFECTB4ODhBOCAgICAgICAgICAvKiA4MDIuMWFkIFNlcnZpY2UgVkxBTgkJKi8KKyNkZWZpbmUgRVRIX1BfVElQQwkweDg4Q0EJCS8qIFRJUEMgCQkJKi8KKyNkZWZpbmUgRVRIX1BfODAyMUFICTB4ODhFNyAgICAgICAgICAvKiA4MDIuMWFoIEJhY2tib25lIFNlcnZpY2UgVGFnICovCisjZGVmaW5lIEVUSF9QXzE1ODgJMHg4OEY3CQkvKiBJRUVFIDE1ODggVGltZXN5bmMgKi8KKyNkZWZpbmUgRVRIX1BfRkNPRQkweDg5MDYJCS8qIEZpYnJlIENoYW5uZWwgb3ZlciBFdGhlcm5ldCAgKi8KKyNkZWZpbmUgRVRIX1BfVERMUwkweDg5MEQgICAgICAgICAgLyogVERMUyAqLworI2RlZmluZSBFVEhfUF9GSVAJMHg4OTE0CQkvKiBGQ29FIEluaXRpYWxpemF0aW9uIFByb3RvY29sICovCisjZGVmaW5lIEVUSF9QX1FJTlExCTB4OTEwMAkJLyogZGVwcmVjYXRlZCBRaW5RIFZMQU4gWyBOT1QgQU4gT0ZGSUNJQUxMWSBSRUdJU1RFUkVEIElEIF0gKi8KKyNkZWZpbmUgRVRIX1BfUUlOUTIJMHg5MjAwCQkvKiBkZXByZWNhdGVkIFFpblEgVkxBTiBbIE5PVCBBTiBPRkZJQ0lBTExZIFJFR0lTVEVSRUQgSUQgXSAqLworI2RlZmluZSBFVEhfUF9RSU5RMwkweDkzMDAJCS8qIGRlcHJlY2F0ZWQgUWluUSBWTEFOIFsgTk9UIEFOIE9GRklDSUFMTFkgUkVHSVNURVJFRCBJRCBdICovCisjZGVmaW5lIEVUSF9QX0VEU0EJMHhEQURBCQkvKiBFdGhlcnR5cGUgRFNBIFsgTk9UIEFOIE9GRklDSUFMTFkgUkVHSVNURVJFRCBJRCBdICovCisjZGVmaW5lIEVUSF9QX0FGX0lVQ1YgICAweEZCRkIJCS8qIElCTSBhZl9pdWN2IFsgTk9UIEFOIE9GRklDSUFMTFkgUkVHSVNURVJFRCBJRCBdICovCisKKy8qCisgKglOb24gRElYIHR5cGVzLiBXb24ndCBjbGFzaCBmb3IgMTUwMCB0eXBlcy4KKyAqLworCisjZGVmaW5lIEVUSF9QXzgwMl8zCTB4MDAwMQkJLyogRHVtbXkgdHlwZSBmb3IgODAyLjMgZnJhbWVzICAqLworI2RlZmluZSBFVEhfUF9BWDI1CTB4MDAwMgkJLyogRHVtbXkgcHJvdG9jb2wgaWQgZm9yIEFYLjI1ICAqLworI2RlZmluZSBFVEhfUF9BTEwJMHgwMDAzCQkvKiBFdmVyeSBwYWNrZXQgKGJlIGNhcmVmdWwhISEpICovCisjZGVmaW5lIEVUSF9QXzgwMl8yCTB4MDAwNAkJLyogODAyLjIgZnJhbWVzIAkJKi8KKyNkZWZpbmUgRVRIX1BfU05BUAkweDAwMDUJCS8qIEludGVybmFsIG9ubHkJCSovCisjZGVmaW5lIEVUSF9QX0REQ01QICAgICAweDAwMDYgICAgICAgICAgLyogREVDIEREQ01QOiBJbnRlcm5hbCBvbmx5ICAgICAqLworI2RlZmluZSBFVEhfUF9XQU5fUFBQICAgMHgwMDA3ICAgICAgICAgIC8qIER1bW15IHR5cGUgZm9yIFdBTiBQUFAgZnJhbWVzKi8KKyNkZWZpbmUgRVRIX1BfUFBQX01QICAgIDB4MDAwOCAgICAgICAgICAvKiBEdW1teSB0eXBlIGZvciBQUFAgTVAgZnJhbWVzICovCisjZGVmaW5lIEVUSF9QX0xPQ0FMVEFMSyAweDAwMDkJCS8qIExvY2FsdGFsayBwc2V1ZG8gdHlwZSAJKi8KKyNkZWZpbmUgRVRIX1BfQ0FOCTB4MDAwQwkJLyogQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgICAgICAqLworI2RlZmluZSBFVEhfUF9QUFBUQUxLCTB4MDAxMAkJLyogRHVtbXkgdHlwZSBmb3IgQXRhbGsgb3ZlciBQUFAqLworI2RlZmluZSBFVEhfUF9UUl84MDJfMgkweDAwMTEJCS8qIDgwMi4yIGZyYW1lcyAJCSovCisjZGVmaW5lIEVUSF9QX01PQklURVgJMHgwMDE1CQkvKiBNb2JpdGV4IChrYXpAY2FmZS5uZXQpCSovCisjZGVmaW5lIEVUSF9QX0NPTlRST0wJMHgwMDE2CQkvKiBDYXJkIHNwZWNpZmljIGNvbnRyb2wgZnJhbWVzICovCisjZGVmaW5lIEVUSF9QX0lSREEJMHgwMDE3CQkvKiBMaW51eC1JckRBCQkJKi8KKyNkZWZpbmUgRVRIX1BfRUNPTkVUCTB4MDAxOAkJLyogQWNvcm4gRWNvbmV0CQkJKi8KKyNkZWZpbmUgRVRIX1BfSERMQwkweDAwMTkJCS8qIEhETEMgZnJhbWVzCQkJKi8KKyNkZWZpbmUgRVRIX1BfQVJDTkVUCTB4MDAxQQkJLyogMUEgZm9yIEFyY05ldCA6LSkgICAgICAgICAgICAqLworI2RlZmluZSBFVEhfUF9EU0EJMHgwMDFCCQkvKiBEaXN0cmlidXRlZCBTd2l0Y2ggQXJjaC4JKi8KKyNkZWZpbmUgRVRIX1BfVFJBSUxFUgkweDAwMUMJCS8qIFRyYWlsZXIgc3dpdGNoIHRhZ2dpbmcJKi8KKyNkZWZpbmUgRVRIX1BfUEhPTkVUCTB4MDBGNQkJLyogTm9raWEgUGhvbmV0IGZyYW1lcyAgICAgICAgICAqLworI2RlZmluZSBFVEhfUF9JRUVFODAyMTU0IDB4MDBGNgkJLyogSUVFRTgwMi4xNS40IGZyYW1lCQkqLworI2RlZmluZSBFVEhfUF9DQUlGCTB4MDBGNwkJLyogU1QtRXJpY3Nzb24gQ0FJRiBwcm90b2NvbAkqLworCisvKgorICoJVGhpcyBpcyBhbiBFdGhlcm5ldCBmcmFtZSBoZWFkZXIuCisgKi8KKworc3RydWN0IGV0aGhkciB7CisJdW5zaWduZWQgY2hhcgloX2Rlc3RbRVRIX0FMRU5dOwkvKiBkZXN0aW5hdGlvbiBldGggYWRkcgkqLworCXVuc2lnbmVkIGNoYXIJaF9zb3VyY2VbRVRIX0FMRU5dOwkvKiBzb3VyY2UgZXRoZXIgYWRkcgkqLworCV9fYmUxNgkJaF9wcm90bzsJCS8qIHBhY2tldCB0eXBlIElEIGZpZWxkCSovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKyNlbmRpZgkvKiBfTElOVVhfSUZfRVRIRVJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9mYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9mYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDdmMWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2ZjLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIEZpYnJlIENoYW5uZWwuCisgKgorICogVmVyc2lvbjoJQCgjKWlmX2ZjLmgJMC4wCTExLzIwLzk4CisgKgorICogQXV0aG9yOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQlEb25hbGQgQmVja2VyLCA8YmVja2VyQHN1cGVyLm9yZz4KKyAqICAgIFBldGVyIERlIFNjaHJpanZlciwgPHN0dWQxMUBjYzQua3VsZXV2ZW4uYWMuYmU+CisgKgkgIFZpbmVldCBBYnJhaGFtLCA8dm1hQGlvbC51bmguZWR1PgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9MSU5VWF9JRl9GQ19ICisjZGVmaW5lIF9MSU5VWF9JRl9GQ19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEZDX0FMRU4JNgkJLyogT2N0ZXRzIGluIG9uZSBldGhlcm5ldCBhZGRyCSAqLworI2RlZmluZSBGQ19ITEVOICAgKHNpemVvZihzdHJ1Y3QgZmNoX2hkcikrc2l6ZW9mKHN0cnVjdCBmY2xsYykpCisjZGVmaW5lIEZDX0lEX0xFTiAzCQkvKiBPY3RldHMgaW4gYSBGaWJyZSBDaGFubmVsIEFkZHJlc3MgKi8KKworLyogTExDIGFuZCBTTkFQIGNvbnN0YW50cyAqLworI2RlZmluZSBFWFRFTkRFRF9TQVAgMHhBQQorI2RlZmluZSBVSV9DTUQgICAgICAgMHgwMworCisvKiBUaGlzIGlzIE5PVCB0aGUgRmlicmUgQ2hhbm5lbCBmcmFtZSBoZWFkZXIuIFRoZSBGQyBmcmFtZSBoZWFkZXIgaXMKKyAqICBjb25zdHJ1Y3RlZCBpbiB0aGUgZHJpdmVyIGFzIHRoZSBUYWNoeW9uIG5lZWRzIGNlcnRhaW4gZmllbGRzIGluCisgKiAgY2VydGFpbnMgcG9zaXRpb25zLiBTbywgaXQgY2FuJ3QgYmUgZ2VuZXJhbGl6ZWQgaGVyZS4qLworCitzdHJ1Y3QgZmNoX2hkciB7CisJX191OCAgZGFkZHJbRkNfQUxFTl07CQkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJX191OCAgc2FkZHJbRkNfQUxFTl07CQkvKiBzb3VyY2UgYWRkcmVzcyAqLworfTsKKworLyogVGhpcyBpcyBhIEZpYnJlIENoYW5uZWwgTExDIHN0cnVjdHVyZSAqLworc3RydWN0IGZjbGxjIHsKKwlfX3U4ICBkc2FwOwkJCS8qIGRlc3RpbmF0aW9uIFNBUCAqLworCV9fdTggIHNzYXA7CQkJLyogc291cmNlIFNBUCAqLworCV9fdTggIGxsYzsJCQkvKiBMTEMgY29udHJvbCBmaWVsZCAqLworCV9fdTggIHByb3RpZFszXTsJCS8qIHByb3RvY29sIGlkICovCisJX19iZTE2IGV0aGVydHlwZTsJCS8qIGV0aGVyIHR5cGUgZmllbGQgKi8KK307CisKKyNlbmRpZgkvKiBfTElOVVhfSUZfRkNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9mZGRpLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2ZkZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI4NDQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9mZGRpLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBBTlNJIEZEREkgaW50ZXJmYWNlLgorICoKKyAqIFZlcnNpb246CUAoIylpZl9mZGRpLmgJMS4wLjIJU2VwIDI5IDIwMDQKKyAqCisgKiBBdXRob3I6CUxhd3JlbmNlIFYuIFN0ZWZhbmksIDxzdGVmYW5pQGxrZy5kZWMuY29tPgorICoKKyAqCQlpZl9mZGRpLmggaXMgYmFzZWQgb24gcHJldmlvdXMgaWZfZXRoZXIuaCBhbmQgaWZfdHIuaCB3b3JrIGJ5CisgKgkJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCQlEb25hbGQgQmVja2VyLCA8YmVja2VyQHN1cGVyLm9yZz4KKyAqCQkJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CisgKgkJCVN0ZXZlIFdoaXRlaG91c2UsIDxndzdycm1AZWVzaGFjazMuc3dhbi5hYy51az4KKyAqCQkJUGV0ZXIgRGUgU2NocmlqdmVyLCA8c3R1ZDExQGNjNC5rdWxldXZlbi5hYy5iZT4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfSUZfRkRESV9ICisjZGVmaW5lIF9MSU5VWF9JRl9GRERJX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiAgRGVmaW5lIG1heCBhbmQgbWluIGxlZ2FsIHNpemVzLiAgVGhlIGZyYW1lIHNpemVzIGRvIG5vdCBpbmNsdWRlCisgKiAgNCBieXRlIEZDUy9DUkMgKGZyYW1lIGNoZWNrIHNlcXVlbmNlKS4KKyAqLworI2RlZmluZSBGRERJX0tfQUxFTgkJCTYJCS8qIE9jdGV0cyBpbiBvbmUgRkRESSBhZGRyZXNzICovCisjZGVmaW5lIEZERElfS184MDIyX0hMRU4JMTYJCS8qIFRvdGFsIG9jdGV0cyBpbiA4MDIuMiBoZWFkZXIgKi8KKyNkZWZpbmUgRkRESV9LX1NOQVBfSExFTgkyMQkJLyogVG90YWwgb2N0ZXRzIGluIDgwMi4yIFNOQVAgaGVhZGVyICovCisjZGVmaW5lIEZERElfS184MDIyX1pMRU4JMTYJCS8qIE1pbiBvY3RldHMgaW4gODAyLjIgZnJhbWUgc2FucyBGQ1MgKi8KKyNkZWZpbmUgRkRESV9LX1NOQVBfWkxFTgkyMQkJLyogTWluIG9jdGV0cyBpbiA4MDIuMiBTTkFQIGZyYW1lIHNhbnMgRkNTICovCisjZGVmaW5lIEZERElfS184MDIyX0RMRU4JNDQ3NQkvKiBNYXggb2N0ZXRzIGluIDgwMi4yIHBheWxvYWQgKi8KKyNkZWZpbmUgRkRESV9LX1NOQVBfRExFTgk0NDcwCS8qIE1heCBvY3RldHMgaW4gODAyLjIgU05BUCBwYXlsb2FkICovCisjZGVmaW5lIEZERElfS19MTENfWkxFTgkJMTMJCS8qIE1pbiBvY3RldHMgaW4gTExDIGZyYW1lIHNhbnMgRkNTICovCisjZGVmaW5lIEZERElfS19MTENfTEVOCQk0NDkxCS8qIE1heCBvY3RldHMgaW4gTExDIGZyYW1lIHNhbnMgRkNTICovCisKKy8qIERlZmluZSBGRERJIEZyYW1lIENvbnRyb2wgKEZDKSBCeXRlIHZhbHVlcyAqLworI2RlZmluZSBGRERJX0ZDX0tfVk9JRAkJCQkJMHgwMAkKKyNkZWZpbmUgRkRESV9GQ19LX05PTl9SRVNUUklDVEVEX1RPS0VOCTB4ODAJCisjZGVmaW5lIEZERElfRkNfS19SRVNUUklDVEVEX1RPS0VOCQkweEMwCQorI2RlZmluZSBGRERJX0ZDX0tfU01UX01JTgkJCQkweDQxCisjZGVmaW5lIEZERElfRkNfS19TTVRfTUFYCQkgICAJCTB4NEYKKyNkZWZpbmUgRkRESV9GQ19LX01BQ19NSU4JCQkJMHhDMQorI2RlZmluZSBGRERJX0ZDX0tfTUFDX01BWAkJICAJCTB4Q0YJCisjZGVmaW5lIEZERElfRkNfS19BU1lOQ19MTENfTUlOCQkJMHg1MAorI2RlZmluZSBGRERJX0ZDX0tfQVNZTkNfTExDX0RFRgkJCTB4NTQKKyNkZWZpbmUgRkRESV9GQ19LX0FTWU5DX0xMQ19NQVgJCQkweDVGCisjZGVmaW5lIEZERElfRkNfS19TWU5DX0xMQ19NSU4JCQkweEQwCisjZGVmaW5lIEZERElfRkNfS19TWU5DX0xMQ19NQVgJCQkweEQ3CisjZGVmaW5lIEZERElfRkNfS19JTVBMRU1FTlRPUl9NSU4JCTB4NjAKKyNkZWZpbmUgRkRESV9GQ19LX0lNUExFTUVOVE9SX01BWCAgCQkweDZGCisjZGVmaW5lIEZERElfRkNfS19SRVNFUlZFRF9NSU4JCQkweDcwCisjZGVmaW5lIEZERElfRkNfS19SRVNFUlZFRF9NQVgJCQkweDdGCisKKy8qIERlZmluZSBMTEMgYW5kIFNOQVAgY29uc3RhbnRzICovCisjZGVmaW5lIEZERElfRVhURU5ERURfU0FQCTB4QUEKKyNkZWZpbmUgRkRESV9VSV9DTUQJCQkweDAzCisKKy8qIERlZmluZSA4MDIuMiBUeXBlIDEgaGVhZGVyICovCitzdHJ1Y3QgZmRkaV84MDIyXzFfaGRyIHsKKwlfX3U4CWRzYXA7CQkJCQkvKiBkZXN0aW5hdGlvbiBzZXJ2aWNlIGFjY2VzcyBwb2ludCAqLworCV9fdTgJc3NhcDsJCQkJCS8qIHNvdXJjZSBzZXJ2aWNlIGFjY2VzcyBwb2ludCAqLworCV9fdTgJY3RybDsJCQkJCS8qIGNvbnRyb2wgYnl0ZSAjMSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRGVmaW5lIDgwMi4yIFR5cGUgMiBoZWFkZXIgKi8KK3N0cnVjdCBmZGRpXzgwMjJfMl9oZHIgeworCV9fdTgJZHNhcDsJCQkJCS8qIGRlc3RpbmF0aW9uIHNlcnZpY2UgYWNjZXNzIHBvaW50ICovCisJX191OAlzc2FwOwkJCQkJLyogc291cmNlIHNlcnZpY2UgYWNjZXNzIHBvaW50ICovCisJX191OAljdHJsXzE7CQkJCQkvKiBjb250cm9sIGJ5dGUgIzEgKi8KKwlfX3U4CWN0cmxfMjsJCQkJCS8qIGNvbnRyb2wgYnl0ZSAjMiAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRGVmaW5lIDgwMi4yIFNOQVAgaGVhZGVyICovCisjZGVmaW5lIEZERElfS19PVUlfTEVOCTMKK3N0cnVjdCBmZGRpX3NuYXBfaGRyIHsKKwlfX3U4CWRzYXA7CQkJCQkvKiBhbHdheXMgMHhBQSAqLworCV9fdTgJc3NhcDsJCQkJCS8qIGFsd2F5cyAweEFBICovCisJX191OAljdHJsOwkJCQkJLyogYWx3YXlzIDB4MDMgKi8KKwlfX3U4CW91aVtGRERJX0tfT1VJX0xFTl07CS8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLworCV9fYmUxNglldGhlcnR5cGU7CQkJCS8qIHBhY2tldCB0eXBlIElEIGZpZWxkICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBEZWZpbmUgRkRESSBMTEMgZnJhbWUgaGVhZGVyICovCitzdHJ1Y3QgZmRkaWhkciB7CisJX191OAlmYzsJCQkJCQkvKiBmcmFtZSBjb250cm9sICovCisJX191OAlkYWRkcltGRERJX0tfQUxFTl07CQkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJX191OAlzYWRkcltGRERJX0tfQUxFTl07CQkvKiBzb3VyY2UgYWRkcmVzcyAqLworCXVuaW9uCisJCXsKKwkJc3RydWN0IGZkZGlfODAyMl8xX2hkcgkJbGxjXzgwMjJfMTsKKwkJc3RydWN0IGZkZGlfODAyMl8yX2hkcgkJbGxjXzgwMjJfMjsKKwkJc3RydWN0IGZkZGlfc25hcF9oZHIJCWxsY19zbmFwOworCQl9IGhkcjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworI2VuZGlmCS8qIF9MSU5VWF9JRl9GRERJX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZnJhZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9mcmFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwOTlkYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZnJhZC5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogRExDSS9GUkFECURlZmluaXRpb25zIGZvciBGcmFtZSBSZWxheSBBY2Nlc3MgRGV2aWNlcy4gIERMQ0kgZGV2aWNlcyBhcmUKKyAqCQljcmVhdGVkIGZvciBlYWNoIERMQ0kgYXNzb2NpYXRlZCB3aXRoIGEgRlJBRC4gIFRoZSBGUkFEIGRyaXZlcgorICoJCWlzIG5vdCB0cnVseSBhIG5ldHdvcmsgZGV2aWNlLCBidXQgdGhlIGxvd2VyIGxldmVsIGRldmljZQorICoJCWhhbmRsZXIuICBUaGlzIGFsbG93cyBvdGhlciBGUkFEIG1hbnVmYWN0dXJlcnMgdG8gdXNlIHRoZSBETENJCisgKgkJY29kZSwgaW5jbHVkaW5nIGl0cyBSRkMxNDkwIGVuY2Fwc3VsYXRpb24gYWxvbmdzaWRlIHRoZSBjdXJyZW50CisgKgkJaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTYW5nb21hIGNhcmRzLgorICoKKyAqIFZlcnNpb246CUAoIylpZl9pZnJhZC5oCTAuMTUJMzEgTWFyIDk2CisgKgorICogQXV0aG9yOglNaWtlIE1jTGFnYW4gPG1pa2UubWNsYWdhbkBsaW51eC5vcmc+CisgKgorICogQ2hhbmdlczoKKyAqCQkwLjE1CU1pa2UgTWNMYWdhbgljaGFuZ2VkIHN0cnVjdHVyZSBkZWZzIChwYWNrZWQpCisgKgkJCQkJcmUtYXJyYW5nZWQgZmxhZ3MKKyAqCQkJCQlhZGRlZCBETENJX1JFVCB2YXJzCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfRlJBRF9IXworI2RlZmluZSBfRlJBRF9IXworCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKworLyogU3RydWN0dXJlcyBhbmQgY29uc3RhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRExDSSBkZXZpY2UgZHJpdmVyICovCisKK3N0cnVjdCBkbGNpX2FkZAoreworICAgY2hhciAgZGV2bmFtZVtJRk5BTVNJWl07CisgICBzaG9ydCBkbGNpOworfTsKKworI2RlZmluZSBETENJX0dFVF9DT05GCShTSU9DREVWUFJJVkFURSArIDIpCisjZGVmaW5lIERMQ0lfU0VUX0NPTkYJKFNJT0NERVZQUklWQVRFICsgMykKKworLyogCisgKiBUaGVzZSBhcmUgcmVsYXRlZCB0byB0aGUgU2FuZ29tYSBTRExBIGFuZCBzaG91bGQgcmVtYWluIGluIG9yZGVyLiAKKyAqIENvZGUgd2l0aGluIHRoZSBTRExBIG1vZHVsZSBpcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWNzIG9mIHRoaXMgCisgKiBzdHJ1Y3R1cmUuICBDaGFuZ2UgYXQgeW91ciBvd24gcGVyaWwuCisgKi8KK3N0cnVjdCBkbGNpX2NvbmYgeworICAgc2hvcnQgZmxhZ3M7CisgICBzaG9ydCBDSVJfZndkOworICAgc2hvcnQgQmNfZndkOworICAgc2hvcnQgQmVfZndkOworICAgc2hvcnQgQ0lSX2J3ZDsKKyAgIHNob3J0IEJjX2J3ZDsKKyAgIHNob3J0IEJlX2J3ZDsgCisKKy8qIHRoZXNlIGFyZSBwYXJ0IG9mIHRoZSBzdGF0dXMgcmVhZCAqLworICAgc2hvcnQgVGNfZndkOworICAgc2hvcnQgVGNfYndkOworICAgc2hvcnQgVGZfbWF4OworICAgc2hvcnQgVGJfbWF4OworCisvKiBhZGQgYW55IG5ldyBmaWVsZHMgaGVyZSBhYm92ZSBpcyBhIG1pcnJvciBvZiBzZGxhX2RsY2lfY29uZiAqLworfTsKKworI2RlZmluZSBETENJX0dFVF9TTEFWRQkoU0lPQ0RFVlBSSVZBVEUgKyA0KQorCisvKiBjb25maWd1cmF0aW9uIGZsYWdzIGZvciBETENJICovCisjZGVmaW5lIERMQ0lfSUdOT1JFX0NJUl9PVVQJMHgwMDAxCisjZGVmaW5lIERMQ0lfQUNDT1VOVF9DSVJfSU4JMHgwMDAyCisjZGVmaW5lIERMQ0lfQlVGRkVSX0lGCQkweDAwMDgKKworI2RlZmluZSBETENJX1ZBTElEX0ZMQUdTCTB4MDAwQgorCisvKiBkZWZpbmVzIGZvciB0aGUgYWN0dWFsIEZyYW1lIFJlbGF5IGhhcmR3YXJlICovCisjZGVmaW5lIEZSQURfR0VUX0NPTkYJKFNJT0NERVZQUklWQVRFKQorI2RlZmluZSBGUkFEX1NFVF9DT05GCShTSU9DREVWUFJJVkFURSArIDEpCisKKyNkZWZpbmUgRlJBRF9MQVNUX0lPQ1RMCUZSQURfU0VUX0NPTkYKKworLyoKKyAqIEJhc2VkIG9uIHRoZSBzZXR1cCBmb3IgdGhlIFNhbmdvbWEgU0RMQS4gIElmIGNoYW5nZXMgYXJlIAorICogbmVjZXNzYXJ5IHRvIHRoaXMgc3RydWN0dXJlLCBhIHJvdXRpbmUgd2lsbCBuZWVkIHRvIGJlIAorICogYWRkZWQgdG8gdGhhdCBtb2R1bGUgdG8gY29weSBmaWVsZHMuCisgKi8KK3N0cnVjdCBmcmFkX2NvbmYgCit7CisgICBzaG9ydCBzdGF0aW9uOworICAgc2hvcnQgZmxhZ3M7CisgICBzaG9ydCBrYmF1ZDsKKyAgIHNob3J0IGNsb2NraW5nOworICAgc2hvcnQgbXR1OworICAgc2hvcnQgVDM5MTsKKyAgIHNob3J0IFQzOTI7CisgICBzaG9ydCBOMzkxOworICAgc2hvcnQgTjM5MjsKKyAgIHNob3J0IE4zOTM7CisgICBzaG9ydCBDSVJfZndkOworICAgc2hvcnQgQmNfZndkOworICAgc2hvcnQgQmVfZndkOworICAgc2hvcnQgQ0lSX2J3ZDsKKyAgIHNob3J0IEJjX2J3ZDsKKyAgIHNob3J0IEJlX2J3ZDsKKworLyogQWRkIG5ldyBmaWVsZHMgaGVyZSwgYWJvdmUgaXMgYSBtaXJyb3Igb2YgdGhlIHNkbGFfY29uZiAqLworCit9OworCisjZGVmaW5lIEZSQURfU1RBVElPTl9DUEUJMHgwMDAwCisjZGVmaW5lIEZSQURfU1RBVElPTl9OT0RFCTB4MDAwMQorCisjZGVmaW5lIEZSQURfVFhfSUdOT1JFX0NJUgkweDAwMDEKKyNkZWZpbmUgRlJBRF9SWF9BQ0NPVU5UX0NJUgkweDAwMDIKKyNkZWZpbmUgRlJBRF9EUk9QX0FCT1JURUQJMHgwMDA0CisjZGVmaW5lIEZSQURfQlVGRkVSSUYJCTB4MDAwOAorI2RlZmluZSBGUkFEX1NUQVRTCQkweDAwMTAKKyNkZWZpbmUgRlJBRF9NQ0kJCTB4MDEwMAorI2RlZmluZSBGUkFEX0FVVE9ETENJCQkweDgwMDAKKyNkZWZpbmUgRlJBRF9WQUxJRF9GTEFHUwkweDgxMUYKKworI2RlZmluZSBGUkFEX0NMT0NLX0lOVAkJMHgwMDAxCisjZGVmaW5lIEZSQURfQ0xPQ0tfRVhUCQkweDAwMDAKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfaGlwcGkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfaGlwcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGMwNDlmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9oaXBwaS5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCUdsb2JhbCBkZWZpbml0aW9ucyBmb3IgdGhlIEhJUFBJIGludGVyZmFjZS4KKyAqCisgKiBWZXJzaW9uOglAKCMpaWZfaGlwcGkuaAkxLjAuMAkwNS8yNi85NworICoKKyAqIEF1dGhvcjoJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJRG9uYWxkIEJlY2tlciwgPGJlY2tlckBzdXBlci5vcmc+CisgKgkJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CisgKgkJU3RldmUgV2hpdGVob3VzZSwgPGd3N3JybUBlZXNoYWNrMy5zd2FuLmFjLnVrPgorICoJCUplcyBTb3JlbnNlbiwgPEplcy5Tb3JlbnNlbkBjZXJuLmNoPgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisgCisjaWZuZGVmIF9MSU5VWF9JRl9ISVBQSV9ICisjZGVmaW5lIF9MSU5VWF9JRl9ISVBQSV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyoKKyAqCUhJUFBJIG1hZ2ljIGNvbnN0YW50cy4KKyAqLworCisjZGVmaW5lIEhJUFBJX0FMRU4JNgkJLyogQnl0ZXMgaW4gb25lIEhJUFBJIGh3LWFkZHIJICAgKi8KKyNkZWZpbmUgSElQUElfSExFTglzaXplb2Yoc3RydWN0IGhpcHBpX2hkcikKKyNkZWZpbmUgSElQUElfWkxFTgkwCQkvKiBNaW4uIGJ5dGVzIGluIGZyYW1lIHdpdGhvdXQgRkNTICovCisjZGVmaW5lIEhJUFBJX0RBVEFfTEVOCTY1MjgwCQkvKiBNYXguIGJ5dGVzIGluIHBheWxvYWQJICAgKi8KKyNkZWZpbmUgSElQUElfRlJBTUVfTEVOCShISVBQSV9EQVRBX0xFTiArIEhJUFBJX0hMRU4pCisJCQkJCS8qIE1heC4gYnl0ZXMgaW4gZnJhbWUgd2l0aG91dCBGQ1MgKi8KKworLyoKKyAqIERlZmluZSBMTEMgYW5kIFNOQVAgY29uc3RhbnRzLgorICovCisjZGVmaW5lIEhJUFBJX0VYVEVOREVEX1NBUAkweEFBCisjZGVmaW5lIEhJUFBJX1VJX0NNRAkJMHgwMworCisKKy8qCisgKglEbyB3ZSBuZWVkIHRvIGxpc3Qgc29tZSBzb3J0IG9mIElEJ3MgaGVyZT8KKyAqLworCisvKgorICoJSElQUEkgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGRhdGEuIAorICovCisgCitzdHJ1Y3QgaGlwbmV0X3N0YXRpc3RpY3MgeworCWludAlyeF9wYWNrZXRzOwkJLyogdG90YWwgcGFja2V0cyByZWNlaXZlZAkqLworCWludAl0eF9wYWNrZXRzOwkJLyogdG90YWwgcGFja2V0cyB0cmFuc21pdHRlZAkqLworCWludAlyeF9lcnJvcnM7CQkvKiBiYWQgcGFja2V0cyByZWNlaXZlZAkJKi8KKwlpbnQJdHhfZXJyb3JzOwkJLyogcGFja2V0IHRyYW5zbWl0IHByb2JsZW1zCSovCisJaW50CXJ4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzCSovCisJaW50CXR4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBhdmFpbGFibGUgaW4gbGludXgJKi8KKworCS8qIGRldGFpbGVkIHJ4X2Vycm9yczogKi8KKwlpbnQJcnhfbGVuZ3RoX2Vycm9yczsKKwlpbnQJcnhfb3Zlcl9lcnJvcnM7CQkvKiByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cJKi8KKwlpbnQJcnhfY3JjX2Vycm9yczsJCS8qIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IJKi8KKwlpbnQJcnhfZnJhbWVfZXJyb3JzOwkvKiByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisJaW50CXJ4X2ZpZm9fZXJyb3JzOwkJLyogcmVjdidyIGZpZm8gb3ZlcnJ1bgkJKi8KKwlpbnQJcnhfbWlzc2VkX2Vycm9yczsJLyogcmVjZWl2ZXIgbWlzc2VkIHBhY2tldAkqLworCisJLyogZGV0YWlsZWQgdHhfZXJyb3JzICovCisJaW50CXR4X2Fib3J0ZWRfZXJyb3JzOworCWludAl0eF9jYXJyaWVyX2Vycm9yczsKKwlpbnQJdHhfZmlmb19lcnJvcnM7CisJaW50CXR4X2hlYXJ0YmVhdF9lcnJvcnM7CisJaW50CXR4X3dpbmRvd19lcnJvcnM7Cit9OworCisKK3N0cnVjdCBoaXBwaV9mcF9oZHIgeworI2lmIDAKKwlfX3U4CQl1bHA7CQkJCS8qIG11c3QgY29udGFpbiA0ICovCisjaWYgZGVmaW5lZCAoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJCWQxX2RhdGFfcHJlc2VudDoxOwkJLyogbXVzdCBiZSAxICovCisJX191OAkJc3RhcnRfZDJfYnVyc3RfYm91bmRhcnk6MTsJLyogbXVzdCBiZSB6ZXJvICovCisJX191OAkJcmVzZXJ2ZWQ6NjsJCQkvKiBtdXN0IGJlIHplcm8gKi8KKyNpZiAwCisJX191MTYJCXJlc2VydmVkMTo1OworCV9fdTE2CQlkMV9hcmVhX3NpemU6ODsJCQkvKiBtdXN0IGJlIDMgKi8KKwlfX3UxNgkJZDJfb2Zmc2V0OjM7CQkJLyogbXVzdCBiZSB6ZXJvICovCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJCXJlc2VydmVkOjY7CQkJLyogbXVzdCBiZSB6ZXJvICovCisJX191OAkgCXN0YXJ0X2QyX2J1cnN0X2JvdW5kYXJ5OjE7CS8qIG11c3QgYmUgemVybyAqLworCV9fdTgJCWQxX2RhdGFfcHJlc2VudDoxOwkJLyogbXVzdCBiZSAxICovCisjaWYgMAorCV9fdTE2CQlkMl9vZmZzZXQ6MzsJCQkvKiBtdXN0IGJlIHplcm8gKi8KKwlfX3UxNgkJZDFfYXJlYV9zaXplOjg7CQkJLyogbXVzdCBiZSAzICovCisJX191MTYJCXJlc2VydmVkMTo1OwkJCS8qIG11c3QgYmUgemVybyAqLworI2VuZGlmCisjZWxzZQorI2Vycm9yCSJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisjZWxzZQorCV9fYmUzMgkJZml4ZWQ7CisjZW5kaWYKKwlfX2JlMzIJCWQyX3NpemU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaGlwcGlfbGVfaGRyIHsKKyNpZiBkZWZpbmVkIChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OAkJZmM6MzsKKwlfX3U4CQlkb3VibGVfd2lkZToxOworCV9fdTgJCW1lc3NhZ2VfdHlwZTo0OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OAkJbWVzc2FnZV90eXBlOjQ7CisJX191OAkJZG91YmxlX3dpZGU6MTsKKwlfX3U4CQlmYzozOworI2VuZGlmCisJX191OAkJZGVzdF9zd2l0Y2hfYWRkclszXTsKKyNpZiBkZWZpbmVkIChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OAkJZGVzdF9hZGRyX3R5cGU6NCwKKwkJCXNyY19hZGRyX3R5cGU6NDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJCXNyY19hZGRyX3R5cGU6NCwKKwkJCWRlc3RfYWRkcl90eXBlOjQ7CisjZW5kaWYKKwlfX3U4CQlzcmNfc3dpdGNoX2FkZHJbM107CisJX191MTYJCXJlc2VydmVkOworCV9fdTgJCWRhZGRyW0hJUFBJX0FMRU5dOworCV9fdTE2CQlsb2NhbGx5X2FkbWluaXN0ZXJlZDsKKwlfX3U4CQlzYWRkcltISVBQSV9BTEVOXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgSElQUElfT1VJX0xFTgkzCisvKgorICogTG9va3MgbGlrZSB0aGUgZHNhcCBhbmQgc3NhcCBmaWVsZHMgaGF2ZSBiZWVuIHN3YXBwZWQgYnkgbWlzdGFrZSBpbgorICogUkZDIDIwNjcgIklQIG92ZXIgSElQUEkiLgorICovCitzdHJ1Y3QgaGlwcGlfc25hcF9oZHIgeworCV9fdTgJZHNhcDsJCQkvKiBhbHdheXMgMHhBQSAqLworCV9fdTgJc3NhcDsJCQkvKiBhbHdheXMgMHhBQSAqLworCV9fdTgJY3RybDsJCQkvKiBhbHdheXMgMHgwMyAqLworCV9fdTgJb3VpW0hJUFBJX09VSV9MRU5dOwkvKiBvcmdhbml6YXRpb25hbCB1bml2ZXJzYWwgaWQgKHplcm8pKi8KKwlfX2JlMTYJZXRoZXJ0eXBlOwkJLyogcGFja2V0IHR5cGUgSUQgZmllbGQgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBoaXBwaV9oZHIgeworCXN0cnVjdCBoaXBwaV9mcF9oZHIJZnA7CisJc3RydWN0IGhpcHBpX2xlX2hkcglsZTsKKwlzdHJ1Y3QgaGlwcGlfc25hcF9oZHIJc25hcDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNlbmRpZgkvKiBfTElOVVhfSUZfSElQUElfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9pbmZpbmliYW5kLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2luZmluaWJhbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDk1ODQ3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9pbmZpbmliYW5kLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGF0CisgKiA8aHR0cDovL3d3dy5mc2Yub3JnL2NvcHlsZWZ0L2dwbC5odG1sPiwgb3IgdGhlIE9wZW5JQi5vcmcgQlNECisgKiBsaWNlbnNlLCBhdmFpbGFibGUgaW4gdGhlIExJQ0VOU0UuVFhUIGZpbGUgYWNjb21wYW55aW5nIHRoaXMKKyAqIHNvZnR3YXJlLiAgVGhlc2UgZGV0YWlscyBhcmUgYWxzbyBhdmFpbGFibGUgYXQKKyAqIDxodHRwOi8vd3d3Lm9wZW5mYWJyaWNzLm9yZy9zb2Z0d2FyZV9saWNlbnNlLmh0bT4uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogJElkJAorICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX0lORklOSUJBTkRfSAorI2RlZmluZSBfTElOVVhfSUZfSU5GSU5JQkFORF9ICisKKyNkZWZpbmUgSU5GSU5JQkFORF9BTEVOCQkyMAkvKiBPY3RldHMgaW4gSVBvSUIgSFcgYWRkcgkqLworCisjZW5kaWYgLyogX0xJTlVYX0lGX0lORklOSUJBTkRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9saW5rLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2xpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2JjMDRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKQEAgLTAsMCArMSwzNzkgQEAKKyNpZm5kZWYgX0xJTlVYX0lGX0xJTktfSAorI2RlZmluZSBfTElOVVhfSUZfTElOS19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworLyogVGhpcyBzdHJ1Y3Qgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKi8KK3N0cnVjdCBydG5sX2xpbmtfc3RhdHMgeworCV9fdTMyCXJ4X3BhY2tldHM7CQkvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkCSovCisJX191MzIJdHhfcGFja2V0czsJCS8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQJKi8KKwlfX3UzMglyeF9ieXRlczsJCS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkIAkqLworCV9fdTMyCXR4X2J5dGVzOwkJLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQJKi8KKwlfX3UzMglyeF9lcnJvcnM7CQkvKiBiYWQgcGFja2V0cyByZWNlaXZlZAkJKi8KKwlfX3UzMgl0eF9lcnJvcnM7CQkvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMJKi8KKwlfX3UzMglyeF9kcm9wcGVkOwkJLyogbm8gc3BhY2UgaW4gbGludXggYnVmZmVycwkqLworCV9fdTMyCXR4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBhdmFpbGFibGUgaW4gbGludXgJKi8KKwlfX3UzMgltdWx0aWNhc3Q7CQkvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAkqLworCV9fdTMyCWNvbGxpc2lvbnM7CisKKwkvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisJX191MzIJcnhfbGVuZ3RoX2Vycm9yczsKKwlfX3UzMglyeF9vdmVyX2Vycm9yczsJCS8qIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdwkqLworCV9fdTMyCXJ4X2NyY19lcnJvcnM7CQkvKiByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yCSovCisJX191MzIJcnhfZnJhbWVfZXJyb3JzOwkvKiByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisJX191MzIJcnhfZmlmb19lcnJvcnM7CQkvKiByZWN2J3IgZmlmbyBvdmVycnVuCQkqLworCV9fdTMyCXJ4X21pc3NlZF9lcnJvcnM7CS8qIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQJKi8KKworCS8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworCV9fdTMyCXR4X2Fib3J0ZWRfZXJyb3JzOworCV9fdTMyCXR4X2NhcnJpZXJfZXJyb3JzOworCV9fdTMyCXR4X2ZpZm9fZXJyb3JzOworCV9fdTMyCXR4X2hlYXJ0YmVhdF9lcnJvcnM7CisJX191MzIJdHhfd2luZG93X2Vycm9yczsKKworCS8qIGZvciBjc2xpcCBldGMgKi8KKwlfX3UzMglyeF9jb21wcmVzc2VkOworCV9fdTMyCXR4X2NvbXByZXNzZWQ7Cit9OworCisvKiBUaGUgbWFpbiBkZXZpY2Ugc3RhdGlzdGljcyBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCB7CisJX191NjQJcnhfcGFja2V0czsJCS8qIHRvdGFsIHBhY2tldHMgcmVjZWl2ZWQJKi8KKwlfX3U2NAl0eF9wYWNrZXRzOwkJLyogdG90YWwgcGFja2V0cyB0cmFuc21pdHRlZAkqLworCV9fdTY0CXJ4X2J5dGVzOwkJLyogdG90YWwgYnl0ZXMgcmVjZWl2ZWQgCSovCisJX191NjQJdHhfYnl0ZXM7CQkvKiB0b3RhbCBieXRlcyB0cmFuc21pdHRlZAkqLworCV9fdTY0CXJ4X2Vycm9yczsJCS8qIGJhZCBwYWNrZXRzIHJlY2VpdmVkCQkqLworCV9fdTY0CXR4X2Vycm9yczsJCS8qIHBhY2tldCB0cmFuc21pdCBwcm9ibGVtcwkqLworCV9fdTY0CXJ4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzCSovCisJX191NjQJdHhfZHJvcHBlZDsJCS8qIG5vIHNwYWNlIGF2YWlsYWJsZSBpbiBsaW51eAkqLworCV9fdTY0CW11bHRpY2FzdDsJCS8qIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkCSovCisJX191NjQJY29sbGlzaW9uczsKKworCS8qIGRldGFpbGVkIHJ4X2Vycm9yczogKi8KKwlfX3U2NAlyeF9sZW5ndGhfZXJyb3JzOworCV9fdTY0CXJ4X292ZXJfZXJyb3JzOwkJLyogcmVjZWl2ZXIgcmluZyBidWZmIG92ZXJmbG93CSovCisJX191NjQJcnhfY3JjX2Vycm9yczsJCS8qIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IJKi8KKwlfX3U2NAlyeF9mcmFtZV9lcnJvcnM7CS8qIHJlY3YnZCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IgKi8KKwlfX3U2NAlyeF9maWZvX2Vycm9yczsJCS8qIHJlY3YnciBmaWZvIG92ZXJydW4JCSovCisJX191NjQJcnhfbWlzc2VkX2Vycm9yczsJLyogcmVjZWl2ZXIgbWlzc2VkIHBhY2tldAkqLworCisJLyogZGV0YWlsZWQgdHhfZXJyb3JzICovCisJX191NjQJdHhfYWJvcnRlZF9lcnJvcnM7CisJX191NjQJdHhfY2Fycmllcl9lcnJvcnM7CisJX191NjQJdHhfZmlmb19lcnJvcnM7CisJX191NjQJdHhfaGVhcnRiZWF0X2Vycm9yczsKKwlfX3U2NAl0eF93aW5kb3dfZXJyb3JzOworCisJLyogZm9yIGNzbGlwIGV0YyAqLworCV9fdTY0CXJ4X2NvbXByZXNzZWQ7CisJX191NjQJdHhfY29tcHJlc3NlZDsKK307CisKKy8qIFRoZSBzdHJ1Y3Qgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBzdHJ1Y3QgaWZtYXAgKi8KK3N0cnVjdCBydG5sX2xpbmtfaWZtYXAgeworCV9fdTY0CW1lbV9zdGFydDsKKwlfX3U2NAltZW1fZW5kOworCV9fdTY0CWJhc2VfYWRkcjsKKwlfX3UxNglpcnE7CisJX191OAlkbWE7CisJX191OAlwb3J0OworfTsKKworLyoKKyAqIElGTEFfQUZfU1BFQworICogICBDb250YWlucyBuZXN0ZWQgYXR0cmlidXRlcyBmb3IgYWRkcmVzcyBmYW1pbHkgc3BlY2lmaWMgYXR0cmlidXRlcy4KKyAqICAgRWFjaCBhZGRyZXNzIGZhbWlseSBtYXkgY3JlYXRlIGEgYXR0cmlidXRlIHdpdGggdGhlIGFkZHJlc3MgZmFtaWx5CisgKiAgIG51bWJlciBhcyB0eXBlIGFuZCBjcmVhdGUgaXRzIG93biBhdHRyaWJ1dGUgc3RydWN0dXJlIGluIGl0LgorICoKKyAqICAgRXhhbXBsZToKKyAqICAgW0lGTEFfQUZfU1BFQ10gPSB7CisgKiAgICAgICBbQUZfSU5FVF0gPSB7CisgKiAgICAgICAgICAgW0lGTEFfSU5FVF9DT05GXSA9IC4uLiwKKyAqICAgICAgIH0sCisgKiAgICAgICBbQUZfSU5FVDZdID0geworICogICAgICAgICAgIFtJRkxBX0lORVQ2X0ZMQUdTXSA9IC4uLiwKKyAqICAgICAgICAgICBbSUZMQV9JTkVUNl9DT05GXSA9IC4uLiwKKyAqICAgICAgIH0KKyAqICAgfQorICovCisKK2VudW0geworCUlGTEFfVU5TUEVDLAorCUlGTEFfQUREUkVTUywKKwlJRkxBX0JST0FEQ0FTVCwKKwlJRkxBX0lGTkFNRSwKKwlJRkxBX01UVSwKKwlJRkxBX0xJTkssCisJSUZMQV9RRElTQywKKwlJRkxBX1NUQVRTLAorCUlGTEFfQ09TVCwKKyNkZWZpbmUgSUZMQV9DT1NUIElGTEFfQ09TVAorCUlGTEFfUFJJT1JJVFksCisjZGVmaW5lIElGTEFfUFJJT1JJVFkgSUZMQV9QUklPUklUWQorCUlGTEFfTUFTVEVSLAorI2RlZmluZSBJRkxBX01BU1RFUiBJRkxBX01BU1RFUgorCUlGTEFfV0lSRUxFU1MsCQkvKiBXaXJlbGVzcyBFeHRlbnNpb24gZXZlbnQgLSBzZWUgd2lyZWxlc3MuaCAqLworI2RlZmluZSBJRkxBX1dJUkVMRVNTIElGTEFfV0lSRUxFU1MKKwlJRkxBX1BST1RJTkZPLAkJLyogUHJvdG9jb2wgc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGEgbGluayAqLworI2RlZmluZSBJRkxBX1BST1RJTkZPIElGTEFfUFJPVElORk8KKwlJRkxBX1RYUUxFTiwKKyNkZWZpbmUgSUZMQV9UWFFMRU4gSUZMQV9UWFFMRU4KKwlJRkxBX01BUCwKKyNkZWZpbmUgSUZMQV9NQVAgSUZMQV9NQVAKKwlJRkxBX1dFSUdIVCwKKyNkZWZpbmUgSUZMQV9XRUlHSFQgSUZMQV9XRUlHSFQKKwlJRkxBX09QRVJTVEFURSwKKwlJRkxBX0xJTktNT0RFLAorCUlGTEFfTElOS0lORk8sCisjZGVmaW5lIElGTEFfTElOS0lORk8gSUZMQV9MSU5LSU5GTworCUlGTEFfTkVUX05TX1BJRCwKKwlJRkxBX0lGQUxJQVMsCisJSUZMQV9OVU1fVkYsCQkvKiBOdW1iZXIgb2YgVkZzIGlmIGRldmljZSBpcyBTUi1JT1YgUEYgKi8KKwlJRkxBX1ZGSU5GT19MSVNULAorCUlGTEFfU1RBVFM2NCwKKwlJRkxBX1ZGX1BPUlRTLAorCUlGTEFfUE9SVF9TRUxGLAorCUlGTEFfQUZfU1BFQywKKwlJRkxBX0dST1VQLAkJLyogR3JvdXAgdGhlIGRldmljZSBiZWxvbmdzIHRvICovCisJSUZMQV9ORVRfTlNfRkQsCisJX19JRkxBX01BWAorfTsKKworCisjZGVmaW5lIElGTEFfTUFYIChfX0lGTEFfTUFYIC0gMSkKKworLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHVzZXJzcGFjZSAqLworI2RlZmluZSBJRkxBX1JUQShyKSAgKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocikpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKSkpCisjZGVmaW5lIElGTEFfUEFZTE9BRChuKSBOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKQorCitlbnVtIHsKKwlJRkxBX0lORVRfVU5TUEVDLAorCUlGTEFfSU5FVF9DT05GLAorCV9fSUZMQV9JTkVUX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9JTkVUX01BWCAoX19JRkxBX0lORVRfTUFYIC0gMSkKKworLyogaWZpX2ZsYWdzLgorCisgICBJRkZfKiBmbGFncy4KKworICAgVGhlIG9ubHkgY2hhbmdlIGlzOgorICAgSUZGX0xPT1BCQUNLLCBJRkZfQlJPQURDQVNUIGFuZCBJRkZfUE9JTlRPUE9JTlQgYXJlCisgICBtb3JlIG5vdCBjaGFuZ2VhYmxlIGJ5IHVzZXIuIFRoZXkgZGVzY3JpYmUgbGluayBtZWRpYQorICAgY2hhcmFjdGVyaXN0aWNzIGFuZCBzZXQgYnkgZGV2aWNlIGRyaXZlci4KKworICAgQ29tbWVudHM6CisgICAtIENvbWJpbmF0aW9uIElGRl9CUk9BRENBU1R8SUZGX1BPSU5UT1BPSU5UIGlzIGludmFsaWQKKyAgIC0gSWYgbmVpdGhlciBvZiB0aGVzZSB0aHJlZSBmbGFncyBhcmUgc2V0OworICAgICB0aGUgaW50ZXJmYWNlIGlzIE5CTUEuCisKKyAgIC0gSUZGX01VTFRJQ0FTVCBkb2VzIG5vdCBtZWFuIGFueXRoaW5nIHNwZWNpYWw6CisgICBtdWx0aWNhc3RzIGNhbiBiZSB1c2VkIG9uIGFsbCBub3QtTkJNQSBsaW5rcy4KKyAgIElGRl9NVUxUSUNBU1QgbWVhbnMgdGhhdCB0aGlzIG1lZGlhIHVzZXMgc3BlY2lhbCBlbmNhcHN1bGF0aW9uCisgICBmb3IgbXVsdGljYXN0IGZyYW1lcy4gQXBwYXJlbnRseSwgYWxsIElGRl9QT0lOVE9QT0lOVCBhbmQKKyAgIElGRl9CUk9BRENBU1QgZGV2aWNlcyBhcmUgYWJsZSB0byB1c2UgbXVsdGljYXN0cyB0b28uCisgKi8KKworLyogSUZMQV9MSU5LLgorICAgRm9yIHVzdWFsIGRldmljZXMgaXQgaXMgZXF1YWwgaWZpX2luZGV4LgorICAgSWYgaXQgaXMgYSAidmlydHVhbCBpbnRlcmZhY2UiIChmLmUuIHR1bm5lbCksIGlmaV9saW5rCisgICBjYW4gcG9pbnQgdG8gcmVhbCBwaHlzaWNhbCBpbnRlcmZhY2UgKGYuZS4gZm9yIGJhbmR3aWR0aCBjYWxjdWxhdGlvbnMpLAorICAgb3IgbWF5YmUgMCwgd2hhdCBtZWFucywgdGhhdCByZWFsIG1lZGlhIGlzIHVua25vd24gKHVzdWFsCisgICBmb3IgSVBJUCB0dW5uZWxzLCB3aGVuIHJvdXRlIHRvIGVuZHBvaW50IGlzIGFsbG93ZWQgdG8gY2hhbmdlKQorICovCisKKy8qIFN1YnR5cGUgYXR0cmlidXRlcyBmb3IgSUZMQV9QUk9USU5GTyAqLworZW51bSB7CisJSUZMQV9JTkVUNl9VTlNQRUMsCisJSUZMQV9JTkVUNl9GTEFHUywJLyogbGluayBmbGFncwkJCSovCisJSUZMQV9JTkVUNl9DT05GLAkvKiBzeXNjdGwgcGFyYW1ldGVycwkJKi8KKwlJRkxBX0lORVQ2X1NUQVRTLAkvKiBzdGF0aXN0aWNzCQkJKi8KKwlJRkxBX0lORVQ2X01DQVNULAkvKiBNQyB0aGluZ3MuIFdoYXQgb2YgdGhlbT8JKi8KKwlJRkxBX0lORVQ2X0NBQ0hFSU5GTywJLyogdGltZSB2YWx1ZXMgYW5kIG1heCByZWFzbSBzaXplICovCisJSUZMQV9JTkVUNl9JQ01QNlNUQVRTLAkvKiBzdGF0aXN0aWNzIChpY21wdjYpCQkqLworCV9fSUZMQV9JTkVUNl9NQVgKK307CisKKyNkZWZpbmUgSUZMQV9JTkVUNl9NQVgJKF9fSUZMQV9JTkVUNl9NQVggLSAxKQorCitzdHJ1Y3QgaWZsYV9jYWNoZWluZm8geworCV9fdTMyCW1heF9yZWFzbV9sZW47CisJX191MzIJdHN0YW1wOwkJLyogaXB2NkludGVyZmFjZVRhYmxlIHVwZGF0ZWQgdGltZXN0YW1wICovCisJX191MzIJcmVhY2hhYmxlX3RpbWU7CisJX191MzIJcmV0cmFuc190aW1lOworfTsKKworZW51bSB7CisJSUZMQV9JTkZPX1VOU1BFQywKKwlJRkxBX0lORk9fS0lORCwKKwlJRkxBX0lORk9fREFUQSwKKwlJRkxBX0lORk9fWFNUQVRTLAorCV9fSUZMQV9JTkZPX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9JTkZPX01BWAkoX19JRkxBX0lORk9fTUFYIC0gMSkKKworLyogVkxBTiBzZWN0aW9uICovCisKK2VudW0geworCUlGTEFfVkxBTl9VTlNQRUMsCisJSUZMQV9WTEFOX0lELAorCUlGTEFfVkxBTl9GTEFHUywKKwlJRkxBX1ZMQU5fRUdSRVNTX1FPUywKKwlJRkxBX1ZMQU5fSU5HUkVTU19RT1MsCisJX19JRkxBX1ZMQU5fTUFYLAorfTsKKworI2RlZmluZSBJRkxBX1ZMQU5fTUFYCShfX0lGTEFfVkxBTl9NQVggLSAxKQorCitzdHJ1Y3QgaWZsYV92bGFuX2ZsYWdzIHsKKwlfX3UzMglmbGFnczsKKwlfX3UzMgltYXNrOworfTsKKworZW51bSB7CisJSUZMQV9WTEFOX1FPU19VTlNQRUMsCisJSUZMQV9WTEFOX1FPU19NQVBQSU5HLAorCV9fSUZMQV9WTEFOX1FPU19NQVgKK307CisKKyNkZWZpbmUgSUZMQV9WTEFOX1FPU19NQVgJKF9fSUZMQV9WTEFOX1FPU19NQVggLSAxKQorCitzdHJ1Y3QgaWZsYV92bGFuX3Fvc19tYXBwaW5nIHsKKwlfX3UzMiBmcm9tOworCV9fdTMyIHRvOworfTsKKworLyogTUFDVkxBTiBzZWN0aW9uICovCitlbnVtIHsKKwlJRkxBX01BQ1ZMQU5fVU5TUEVDLAorCUlGTEFfTUFDVkxBTl9NT0RFLAorCV9fSUZMQV9NQUNWTEFOX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9NQUNWTEFOX01BWCAoX19JRkxBX01BQ1ZMQU5fTUFYIC0gMSkKKworZW51bSBtYWN2bGFuX21vZGUgeworCU1BQ1ZMQU5fTU9ERV9QUklWQVRFID0gMSwgLyogZG9uJ3QgdGFsayB0byBvdGhlciBtYWN2bGFucyAqLworCU1BQ1ZMQU5fTU9ERV9WRVBBICAgID0gMiwgLyogdGFsayB0byBvdGhlciBwb3J0cyB0aHJvdWdoIGV4dCBicmlkZ2UgKi8KKwlNQUNWTEFOX01PREVfQlJJREdFICA9IDQsIC8qIHRhbGsgdG8gYnJpZGdlIHBvcnRzIGRpcmVjdGx5ICovCisJTUFDVkxBTl9NT0RFX1BBU1NUSFJVID0gOCwvKiB0YWtlIG92ZXIgdGhlIHVuZGVybHlpbmcgZGV2aWNlICovCit9OworCisvKiBTUi1JT1YgdmlydHVhbCBmdW5jdGlvbiBtYW5hZ2VtZW50IHNlY3Rpb24gKi8KKworZW51bSB7CisJSUZMQV9WRl9JTkZPX1VOU1BFQywKKwlJRkxBX1ZGX0lORk8sCisJX19JRkxBX1ZGX0lORk9fTUFYLAorfTsKKworI2RlZmluZSBJRkxBX1ZGX0lORk9fTUFYIChfX0lGTEFfVkZfSU5GT19NQVggLSAxKQorCitlbnVtIHsKKwlJRkxBX1ZGX1VOU1BFQywKKwlJRkxBX1ZGX01BQywJCS8qIEhhcmR3YXJlIHF1ZXVlIHNwZWNpZmljIGF0dHJpYnV0ZXMgKi8KKwlJRkxBX1ZGX1ZMQU4sCisJSUZMQV9WRl9UWF9SQVRFLAkvKiBUWCBCYW5kd2lkdGggQWxsb2NhdGlvbiAqLworCUlGTEFfVkZfU1BPT0ZDSEssCS8qIFNwb29mIENoZWNraW5nIG9uL29mZiBzd2l0Y2ggKi8KKwlfX0lGTEFfVkZfTUFYLAorfTsKKworI2RlZmluZSBJRkxBX1ZGX01BWCAoX19JRkxBX1ZGX01BWCAtIDEpCisKK3N0cnVjdCBpZmxhX3ZmX21hYyB7CisJX191MzIgdmY7CisJX191OCBtYWNbMzJdOyAvKiBNQVhfQUREUl9MRU4gKi8KK307CisKK3N0cnVjdCBpZmxhX3ZmX3ZsYW4geworCV9fdTMyIHZmOworCV9fdTMyIHZsYW47IC8qIDAgLSA0MDk1LCAwIGRpc2FibGVzIFZMQU4gZmlsdGVyICovCisJX191MzIgcW9zOworfTsKKworc3RydWN0IGlmbGFfdmZfdHhfcmF0ZSB7CisJX191MzIgdmY7CisJX191MzIgcmF0ZTsgLyogTWF4IFRYIGJhbmR3aWR0aCBpbiBNYnBzLCAwIGRpc2FibGVzIHRocm90dGxpbmcgKi8KK307CisKK3N0cnVjdCBpZmxhX3ZmX3Nwb29mY2hrIHsKKwlfX3UzMiB2ZjsKKwlfX3UzMiBzZXR0aW5nOworfTsKKworLyogVkYgcG9ydHMgbWFuYWdlbWVudCBzZWN0aW9uCisgKgorICoJTmVzdGVkIGxheW91dCBvZiBzZXQvZ2V0IG1zZyBpczoKKyAqCisgKgkJW0lGTEFfTlVNX1ZGXQorICoJCVtJRkxBX1ZGX1BPUlRTXQorICoJCQlbSUZMQV9WRl9QT1JUXQorICoJCQkJW0lGTEFfUE9SVF8qXSwgLi4uCisgKgkJCVtJRkxBX1ZGX1BPUlRdCisgKgkJCQlbSUZMQV9QT1JUXypdLCAuLi4KKyAqCQkJLi4uCisgKgkJW0lGTEFfUE9SVF9TRUxGXQorICoJCQlbSUZMQV9QT1JUXypdLCAuLi4KKyAqLworCitlbnVtIHsKKwlJRkxBX1ZGX1BPUlRfVU5TUEVDLAorCUlGTEFfVkZfUE9SVCwJCQkvKiBuZXN0ICovCisJX19JRkxBX1ZGX1BPUlRfTUFYLAorfTsKKworI2RlZmluZSBJRkxBX1ZGX1BPUlRfTUFYIChfX0lGTEFfVkZfUE9SVF9NQVggLSAxKQorCitlbnVtIHsKKwlJRkxBX1BPUlRfVU5TUEVDLAorCUlGTEFfUE9SVF9WRiwJCQkvKiBfX3UzMiAqLworCUlGTEFfUE9SVF9QUk9GSUxFLAkJLyogc3RyaW5nICovCisJSUZMQV9QT1JUX1ZTSV9UWVBFLAkJLyogODAyLjFRYmcgKHByZS0pc3RhbmRhcmQgVkRQICovCisJSUZMQV9QT1JUX0lOU1RBTkNFX1VVSUQsCS8qIGJpbmFyeSBVVUlEICovCisJSUZMQV9QT1JUX0hPU1RfVVVJRCwJCS8qIGJpbmFyeSBVVUlEICovCisJSUZMQV9QT1JUX1JFUVVFU1QsCQkvKiBfX3U4ICovCisJSUZMQV9QT1JUX1JFU1BPTlNFLAkJLyogX191MTYsIG91dHB1dCBvbmx5ICovCisJX19JRkxBX1BPUlRfTUFYLAorfTsKKworI2RlZmluZSBJRkxBX1BPUlRfTUFYIChfX0lGTEFfUE9SVF9NQVggLSAxKQorCisjZGVmaW5lIFBPUlRfUFJPRklMRV9NQVgJNDAKKyNkZWZpbmUgUE9SVF9VVUlEX01BWAkJMTYKKyNkZWZpbmUgUE9SVF9TRUxGX1ZGCQktMQorCitlbnVtIHsKKwlQT1JUX1JFUVVFU1RfUFJFQVNTT0NJQVRFID0gMCwKKwlQT1JUX1JFUVVFU1RfUFJFQVNTT0NJQVRFX1JSLAorCVBPUlRfUkVRVUVTVF9BU1NPQ0lBVEUsCisJUE9SVF9SRVFVRVNUX0RJU0FTU09DSUFURSwKK307CisKK2VudW0geworCVBPUlRfVkRQX1JFU1BPTlNFX1NVQ0NFU1MgPSAwLAorCVBPUlRfVkRQX1JFU1BPTlNFX0lOVkFMSURfRk9STUFULAorCVBPUlRfVkRQX1JFU1BPTlNFX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMsCisJUE9SVF9WRFBfUkVTUE9OU0VfVU5VU0VEX1ZUSUQsCisJUE9SVF9WRFBfUkVTUE9OU0VfVlRJRF9WSU9MQVRJT04sCisJUE9SVF9WRFBfUkVTUE9OU0VfVlRJRF9WRVJTSU9OX1ZJT0FMVElPTiwKKwlQT1JUX1ZEUF9SRVNQT05TRV9PVVRfT0ZfU1lOQywKKwkvKiAweDA4LTB4RkYgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBWRFAgdXNlICovCisJUE9SVF9QUk9GSUxFX1JFU1BPTlNFX1NVQ0NFU1MgPSAweDEwMCwKKwlQT1JUX1BST0ZJTEVfUkVTUE9OU0VfSU5QUk9HUkVTUywKKwlQT1JUX1BST0ZJTEVfUkVTUE9OU0VfSU5WQUxJRCwKKwlQT1JUX1BST0ZJTEVfUkVTUE9OU0VfQkFEU1RBVEUsCisJUE9SVF9QUk9GSUxFX1JFU1BPTlNFX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMsCisJUE9SVF9QUk9GSUxFX1JFU1BPTlNFX0VSUk9SLAorfTsKKworc3RydWN0IGlmbGFfcG9ydF92c2kgeworCV9fdTggdnNpX21ncl9pZDsKKwlfX3U4IHZzaV90eXBlX2lkWzNdOworCV9fdTggdnNpX3R5cGVfdmVyc2lvbjsKKwlfX3U4IHBhZFszXTsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfSUZfTElOS19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2x0YWxrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2x0YWxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjM2UzMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfbHRhbGsuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX19MSU5VWF9MVEFMS19ICisjZGVmaW5lIF9fTElOVVhfTFRBTEtfSAorCisjZGVmaW5lIExUQUxLX0hMRU4JCTEKKyNkZWZpbmUgTFRBTEtfTVRVCQk2MDAKKyNkZWZpbmUgTFRBTEtfQUxFTgkJMQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3OTkyOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmgKQEAgLTAsMCArMSwyNzIgQEAKKyNpZm5kZWYgX19MSU5VWF9JRl9QQUNLRVRfSAorI2RlZmluZSBfX0xJTlVYX0lGX1BBQ0tFVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3Qgc29ja2FkZHJfcGt0IHsKKwl1bnNpZ25lZCBzaG9ydCBzcGt0X2ZhbWlseTsKKwl1bnNpZ25lZCBjaGFyIHNwa3RfZGV2aWNlWzE0XTsKKwlfX2JlMTYgc3BrdF9wcm90b2NvbDsKK307CisKK3N0cnVjdCBzb2NrYWRkcl9sbCB7CisJdW5zaWduZWQgc2hvcnQJc2xsX2ZhbWlseTsKKwlfX2JlMTYJCXNsbF9wcm90b2NvbDsKKwlpbnQJCXNsbF9pZmluZGV4OworCXVuc2lnbmVkIHNob3J0CXNsbF9oYXR5cGU7CisJdW5zaWduZWQgY2hhcglzbGxfcGt0dHlwZTsKKwl1bnNpZ25lZCBjaGFyCXNsbF9oYWxlbjsKKwl1bnNpZ25lZCBjaGFyCXNsbF9hZGRyWzhdOworfTsKKworLyogUGFja2V0IHR5cGVzICovCisKKyNkZWZpbmUgUEFDS0VUX0hPU1QJCTAJCS8qIFRvIHVzCQkqLworI2RlZmluZSBQQUNLRVRfQlJPQURDQVNUCTEJCS8qIFRvIGFsbAkJKi8KKyNkZWZpbmUgUEFDS0VUX01VTFRJQ0FTVAkyCQkvKiBUbyBncm91cAkJKi8KKyNkZWZpbmUgUEFDS0VUX09USEVSSE9TVAkzCQkvKiBUbyBzb21lb25lIGVsc2UgCSovCisjZGVmaW5lIFBBQ0tFVF9PVVRHT0lORwkJNAkJLyogT3V0Z29pbmcgb2YgYW55IHR5cGUgKi8KKy8qIFRoZXNlIG9uZXMgYXJlIGludmlzaWJsZSBieSB1c2VyIGxldmVsICovCisjZGVmaW5lIFBBQ0tFVF9MT09QQkFDSwkJNQkJLyogTUMvQlJEIGZyYW1lIGxvb3BlZCBiYWNrICovCisjZGVmaW5lIFBBQ0tFVF9GQVNUUk9VVEUJNgkJLyogRmFzdHJvdXRlZCBmcmFtZQkqLworCisvKiBQYWNrZXQgc29ja2V0IG9wdGlvbnMgKi8KKworI2RlZmluZSBQQUNLRVRfQUREX01FTUJFUlNISVAJCTEKKyNkZWZpbmUgUEFDS0VUX0RST1BfTUVNQkVSU0hJUAkJMgorI2RlZmluZSBQQUNLRVRfUkVDVl9PVVRQVVQJCTMKKy8qIFZhbHVlIDQgaXMgc3RpbGwgdXNlZCBieSBvYnNvbGV0ZSB0dXJiby1wYWNrZXQuICovCisjZGVmaW5lIFBBQ0tFVF9SWF9SSU5HCQkJNQorI2RlZmluZSBQQUNLRVRfU1RBVElTVElDUwkJNgorI2RlZmluZSBQQUNLRVRfQ09QWV9USFJFU0gJCTcKKyNkZWZpbmUgUEFDS0VUX0FVWERBVEEJCQk4CisjZGVmaW5lIFBBQ0tFVF9PUklHREVWCQkJOQorI2RlZmluZSBQQUNLRVRfVkVSU0lPTgkJCTEwCisjZGVmaW5lIFBBQ0tFVF9IRFJMRU4JCQkxMQorI2RlZmluZSBQQUNLRVRfUkVTRVJWRQkJCTEyCisjZGVmaW5lIFBBQ0tFVF9UWF9SSU5HCQkJMTMKKyNkZWZpbmUgUEFDS0VUX0xPU1MJCQkxNAorI2RlZmluZSBQQUNLRVRfVk5FVF9IRFIJCQkxNQorI2RlZmluZSBQQUNLRVRfVFhfVElNRVNUQU1QCQkxNgorI2RlZmluZSBQQUNLRVRfVElNRVNUQU1QCQkxNworI2RlZmluZSBQQUNLRVRfRkFOT1VUCQkJMTgKKworI2RlZmluZSBQQUNLRVRfRkFOT1VUX0hBU0gJCTAKKyNkZWZpbmUgUEFDS0VUX0ZBTk9VVF9MQgkJMQorI2RlZmluZSBQQUNLRVRfRkFOT1VUX0NQVQkJMgorI2RlZmluZSBQQUNLRVRfRkFOT1VUX0ZMQUdfREVGUkFHCTB4ODAwMAorCitzdHJ1Y3QgdHBhY2tldF9zdGF0cyB7CisJdW5zaWduZWQgaW50CXRwX3BhY2tldHM7CisJdW5zaWduZWQgaW50CXRwX2Ryb3BzOworfTsKKworc3RydWN0IHRwYWNrZXRfc3RhdHNfdjMgeworCXVuc2lnbmVkIGludAl0cF9wYWNrZXRzOworCXVuc2lnbmVkIGludAl0cF9kcm9wczsKKwl1bnNpZ25lZCBpbnQJdHBfZnJlZXplX3FfY250OworfTsKKwordW5pb24gdHBhY2tldF9zdGF0c191IHsKKwlzdHJ1Y3QgdHBhY2tldF9zdGF0cyBzdGF0czE7CisJc3RydWN0IHRwYWNrZXRfc3RhdHNfdjMgc3RhdHMzOworfTsKKworc3RydWN0IHRwYWNrZXRfYXV4ZGF0YSB7CisJX191MzIJCXRwX3N0YXR1czsKKwlfX3UzMgkJdHBfbGVuOworCV9fdTMyCQl0cF9zbmFwbGVuOworCV9fdTE2CQl0cF9tYWM7CisJX191MTYJCXRwX25ldDsKKwlfX3UxNgkJdHBfdmxhbl90Y2k7CisJX191MTYJCXRwX3BhZGRpbmc7Cit9OworCisvKiBSeCByaW5nIC0gaGVhZGVyIHN0YXR1cyAqLworI2RlZmluZSBUUF9TVEFUVVNfS0VSTkVMCTB4MAorI2RlZmluZSBUUF9TVEFUVVNfVVNFUgkJMHgxCisjZGVmaW5lIFRQX1NUQVRVU19DT1BZCQkweDIKKyNkZWZpbmUgVFBfU1RBVFVTX0xPU0lORwkweDQKKyNkZWZpbmUgVFBfU1RBVFVTX0NTVU1OT1RSRUFEWQkweDgKKyNkZWZpbmUgVFBfU1RBVFVTX1ZMQU5fVkFMSUQgICAweDEwIC8qIGF1eGRhdGEgaGFzIHZhbGlkIHRwX3ZsYW5fdGNpICovCisjZGVmaW5lIFRQX1NUQVRVU19CTEtfVE1PCTB4MjAKKworLyogVHggcmluZyAtIGhlYWRlciBzdGF0dXMgKi8KKyNkZWZpbmUgVFBfU1RBVFVTX0FWQUlMQUJMRQkweDAKKyNkZWZpbmUgVFBfU1RBVFVTX1NFTkRfUkVRVUVTVAkweDEKKyNkZWZpbmUgVFBfU1RBVFVTX1NFTkRJTkcJMHgyCisjZGVmaW5lIFRQX1NUQVRVU19XUk9OR19GT1JNQVQJMHg0CisKKy8qIFJ4IHJpbmcgLSBmZWF0dXJlIHJlcXVlc3QgYml0cyAqLworI2RlZmluZSBUUF9GVF9SRVFfRklMTF9SWEhBU0gJMHgxCisKK3N0cnVjdCB0cGFja2V0X2hkciB7CisJdW5zaWduZWQgbG9uZwl0cF9zdGF0dXM7CisJdW5zaWduZWQgaW50CXRwX2xlbjsKKwl1bnNpZ25lZCBpbnQJdHBfc25hcGxlbjsKKwl1bnNpZ25lZCBzaG9ydAl0cF9tYWM7CisJdW5zaWduZWQgc2hvcnQJdHBfbmV0OworCXVuc2lnbmVkIGludAl0cF9zZWM7CisJdW5zaWduZWQgaW50CXRwX3VzZWM7Cit9OworCisjZGVmaW5lIFRQQUNLRVRfQUxJR05NRU5UCTE2CisjZGVmaW5lIFRQQUNLRVRfQUxJR04oeCkJKCgoeCkrVFBBQ0tFVF9BTElHTk1FTlQtMSkmfihUUEFDS0VUX0FMSUdOTUVOVC0xKSkKKyNkZWZpbmUgVFBBQ0tFVF9IRFJMRU4JCShUUEFDS0VUX0FMSUdOKHNpemVvZihzdHJ1Y3QgdHBhY2tldF9oZHIpKSArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbGwpKQorCitzdHJ1Y3QgdHBhY2tldDJfaGRyIHsKKwlfX3UzMgkJdHBfc3RhdHVzOworCV9fdTMyCQl0cF9sZW47CisJX191MzIJCXRwX3NuYXBsZW47CisJX191MTYJCXRwX21hYzsKKwlfX3UxNgkJdHBfbmV0OworCV9fdTMyCQl0cF9zZWM7CisJX191MzIJCXRwX25zZWM7CisJX191MTYJCXRwX3ZsYW5fdGNpOworCV9fdTE2CQl0cF9wYWRkaW5nOworfTsKKworc3RydWN0IHRwYWNrZXRfaGRyX3ZhcmlhbnQxIHsKKwlfX3UzMgl0cF9yeGhhc2g7CisJX191MzIJdHBfdmxhbl90Y2k7Cit9OworCitzdHJ1Y3QgdHBhY2tldDNfaGRyIHsKKwlfX3UzMgkJdHBfbmV4dF9vZmZzZXQ7CisJX191MzIJCXRwX3NlYzsKKwlfX3UzMgkJdHBfbnNlYzsKKwlfX3UzMgkJdHBfc25hcGxlbjsKKwlfX3UzMgkJdHBfbGVuOworCV9fdTMyCQl0cF9zdGF0dXM7CisJX191MTYJCXRwX21hYzsKKwlfX3UxNgkJdHBfbmV0OworCS8qIHBrdF9oZHIgdmFyaWFudHMgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB0cGFja2V0X2hkcl92YXJpYW50MSBodjE7CisJfTsKK307CisKK3N0cnVjdCB0cGFja2V0X2JkX3RzIHsKKwl1bnNpZ25lZCBpbnQgdHNfc2VjOworCXVuaW9uIHsKKwkJdW5zaWduZWQgaW50IHRzX3VzZWM7CisJCXVuc2lnbmVkIGludCB0c19uc2VjOworCX07Cit9OworCitzdHJ1Y3QgdHBhY2tldF9oZHJfdjEgeworCV9fdTMyCWJsb2NrX3N0YXR1czsKKwlfX3UzMgludW1fcGt0czsKKwlfX3UzMglvZmZzZXRfdG9fZmlyc3RfcGt0OworCisJLyogTnVtYmVyIG9mIHZhbGlkIGJ5dGVzIChpbmNsdWRpbmcgcGFkZGluZykKKwkgKiBibGtfbGVuIDw9IHRwX2Jsb2NrX3NpemUKKwkgKi8KKwlfX3UzMglibGtfbGVuOworCisJLyoKKwkgKiBRdWl0ZSBhIGZldyB1c2VzIG9mIHNlcXVlbmNlIG51bWJlcjoKKwkgKiAxLiBNYWtlIHN1cmUgY2FjaGUgZmx1c2ggZXRjIHdvcmtlZC4KKwkgKiAgICBXZWxsLCBvbmUgY2FuIGFyZ3VlIC0gd2h5IG5vdCB1c2UgdGhlIGluY3JlYXNpbmcgdHMgYmVsb3c/CisJICogICAgQnV0IGxvb2sgYXQgMi4gYmVsb3cgZmlyc3QuCisJICogMi4gV2hlbiB5b3UgcGFzcyBhcm91bmQgYmxvY2tzIHRvIG90aGVyIHVzZXIgc3BhY2UgZGVjb2RlcnMsCisJICogICAgeW91IGNhbiBzZWUgd2hpY2ggYmxrW3NdIGlzW2FyZV0gb3V0c3RhbmRpbmcgZXRjLgorCSAqIDMuIFZhbGlkYXRlIGtlcm5lbCBjb2RlLgorCSAqLworCV9fYWxpZ25lZF91NjQJc2VxX251bTsKKworCS8qCisJICogdHNfbGFzdF9wa3Q6CisJICoKKwkgKiBDYXNlIDEuCUJsb2NrIGhhcyAnTicoTiA+PTEpIHBhY2tldHMgYW5kIFRNTydkKHRpbWVkIG91dCkKKwkgKgkJdHNfbGFzdF9wa3QgPT0gJ3RpbWUtc3RhbXAgb2YgbGFzdCBwYWNrZXQnIGFuZCBOT1QgdGhlCisJICoJCXRpbWUgd2hlbiB0aGUgdGltZXIgZmlyZWQgYW5kIHRoZSBibG9jayB3YXMgY2xvc2VkLgorCSAqCQlCeSBwcm92aWRpbmcgdGhlIHRzIG9mIHRoZSBsYXN0IHBhY2tldCB3ZSBjYW4gYWJzb2x1dGVseQorCSAqCQlndWFyYW50ZWUgdGhhdCB0aW1lLXN0YW1wIHdpc2UsIHRoZSBmaXJzdCBwYWNrZXQgaW4gdGhlCisJICoJCW5leHQgYmxvY2sgd2lsbCBuZXZlciBwcmVjZWRlIHRoZSBsYXN0IHBhY2tldCBvZiB0aGUKKwkgKgkJcHJldmlvdXMgYmxvY2suCisJICogQ2FzZSAyLglCbG9jayBoYXMgemVybyBwYWNrZXRzIGFuZCBUTU8nZAorCSAqCQl0c19sYXN0X3BrdCA9IHRpbWUgd2hlbiB0aGUgdGltZXIgZmlyZWQgYW5kIHRoZSBibG9jaworCSAqCQl3YXMgY2xvc2VkLgorCSAqIENhc2UgMy4JQmxvY2sgaGFzICdOJyBwYWNrZXRzIGFuZCBOTyBUTU8uCisJICoJCXRzX2xhc3RfcGt0ID0gdGltZS1zdGFtcCBvZiB0aGUgbGFzdCBwa3QgaW4gdGhlIGJsb2NrLgorCSAqCisJICogdHNfZmlyc3RfcGt0OgorCSAqCQlJcyBhbHdheXMgdGhlIHRpbWUtc3RhbXAgd2hlbiB0aGUgYmxvY2sgd2FzIG9wZW5lZC4KKwkgKgkJQ2FzZSBhKQlaRVJPIHBhY2tldHMKKwkgKgkJCU5vIHBhY2tldHMgdG8gZGVhbCB3aXRoIGJ1dCBhdGxlYXN0IHlvdSBrbm93IHRoZQorCSAqCQkJdGltZS1pbnRlcnZhbCBvZiB0aGlzIGJsb2NrLgorCSAqCQlDYXNlIGIpIE5vbi16ZXJvIHBhY2tldHMKKwkgKgkJCVVzZSB0aGUgdHMgb2YgdGhlIGZpcnN0IHBhY2tldCBpbiB0aGUgYmxvY2suCisJICoKKwkgKi8KKwlzdHJ1Y3QgdHBhY2tldF9iZF90cwl0c19maXJzdF9wa3QsIHRzX2xhc3RfcGt0OworfTsKKwordW5pb24gdHBhY2tldF9iZF9oZWFkZXJfdSB7CisJc3RydWN0IHRwYWNrZXRfaGRyX3YxIGJoMTsKK307CisKK3N0cnVjdCB0cGFja2V0X2Jsb2NrX2Rlc2MgeworCV9fdTMyIHZlcnNpb247CisJX191MzIgb2Zmc2V0X3RvX3ByaXY7CisJdW5pb24gdHBhY2tldF9iZF9oZWFkZXJfdSBoZHI7Cit9OworCisjZGVmaW5lIFRQQUNLRVQyX0hEUkxFTgkJKFRQQUNLRVRfQUxJR04oc2l6ZW9mKHN0cnVjdCB0cGFja2V0Ml9oZHIpKSArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbGwpKQorI2RlZmluZSBUUEFDS0VUM19IRFJMRU4JCShUUEFDS0VUX0FMSUdOKHNpemVvZihzdHJ1Y3QgdHBhY2tldDNfaGRyKSkgKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKSkKKworZW51bSB0cGFja2V0X3ZlcnNpb25zIHsKKwlUUEFDS0VUX1YxLAorCVRQQUNLRVRfVjIsCisJVFBBQ0tFVF9WMworfTsKKworLyoKKyAgIEZyYW1lIHN0cnVjdHVyZToKKworICAgLSBTdGFydC4gRnJhbWUgbXVzdCBiZSBhbGlnbmVkIHRvIFRQQUNLRVRfQUxJR05NRU5UPTE2CisgICAtIHN0cnVjdCB0cGFja2V0X2hkcgorICAgLSBwYWQgdG8gVFBBQ0tFVF9BTElHTk1FTlQ9MTYKKyAgIC0gc3RydWN0IHNvY2thZGRyX2xsCisgICAtIEdhcCwgY2hvc2VuIHNvIHRoYXQgcGFja2V0IGRhdGEgKFN0YXJ0K3RwX25ldCkgYWxpZ25lcyB0byBUUEFDS0VUX0FMSUdOTUVOVD0xNgorICAgLSBTdGFydCt0cF9tYWM6IFsgT3B0aW9uYWwgTUFDIGhlYWRlciBdCisgICAtIFN0YXJ0K3RwX25ldDogUGFja2V0IGRhdGEsIGFsaWduZWQgdG8gVFBBQ0tFVF9BTElHTk1FTlQ9MTYuCisgICAtIFBhZCB0byBhbGlnbiB0byBUUEFDS0VUX0FMSUdOTUVOVD0xNgorICovCisKK3N0cnVjdCB0cGFja2V0X3JlcSB7CisJdW5zaWduZWQgaW50CXRwX2Jsb2NrX3NpemU7CS8qIE1pbmltYWwgc2l6ZSBvZiBjb250aWd1b3VzIGJsb2NrICovCisJdW5zaWduZWQgaW50CXRwX2Jsb2NrX25yOwkvKiBOdW1iZXIgb2YgYmxvY2tzICovCisJdW5zaWduZWQgaW50CXRwX2ZyYW1lX3NpemU7CS8qIFNpemUgb2YgZnJhbWUgKi8KKwl1bnNpZ25lZCBpbnQJdHBfZnJhbWVfbnI7CS8qIFRvdGFsIG51bWJlciBvZiBmcmFtZXMgKi8KK307CisKK3N0cnVjdCB0cGFja2V0X3JlcTMgeworCXVuc2lnbmVkIGludAl0cF9ibG9ja19zaXplOwkvKiBNaW5pbWFsIHNpemUgb2YgY29udGlndW91cyBibG9jayAqLworCXVuc2lnbmVkIGludAl0cF9ibG9ja19ucjsJLyogTnVtYmVyIG9mIGJsb2NrcyAqLworCXVuc2lnbmVkIGludAl0cF9mcmFtZV9zaXplOwkvKiBTaXplIG9mIGZyYW1lICovCisJdW5zaWduZWQgaW50CXRwX2ZyYW1lX25yOwkvKiBUb3RhbCBudW1iZXIgb2YgZnJhbWVzICovCisJdW5zaWduZWQgaW50CXRwX3JldGlyZV9ibGtfdG92OyAvKiB0aW1lb3V0IGluIG1zZWNzICovCisJdW5zaWduZWQgaW50CXRwX3NpemVvZl9wcml2OyAvKiBvZmZzZXQgdG8gcHJpdmF0ZSBkYXRhIGFyZWEgKi8KKwl1bnNpZ25lZCBpbnQJdHBfZmVhdHVyZV9yZXFfd29yZDsKK307CisKK3VuaW9uIHRwYWNrZXRfcmVxX3UgeworCXN0cnVjdCB0cGFja2V0X3JlcQlyZXE7CisJc3RydWN0IHRwYWNrZXRfcmVxMwlyZXEzOworfTsKKworc3RydWN0IHBhY2tldF9tcmVxIHsKKwlpbnQJCW1yX2lmaW5kZXg7CisJdW5zaWduZWQgc2hvcnQJbXJfdHlwZTsKKwl1bnNpZ25lZCBzaG9ydAltcl9hbGVuOworCXVuc2lnbmVkIGNoYXIJbXJfYWRkcmVzc1s4XTsKK307CisKKyNkZWZpbmUgUEFDS0VUX01SX01VTFRJQ0FTVAkwCisjZGVmaW5lIFBBQ0tFVF9NUl9QUk9NSVNDCTEKKyNkZWZpbmUgUEFDS0VUX01SX0FMTE1VTFRJCTIKKyNkZWZpbmUgUEFDS0VUX01SX1VOSUNBU1QJMworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcGhvbmV0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3Bob25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjBkNGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3Bob25ldC5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBGaWxlOiBpZl9waG9uZXQuaAorICoKKyAqIFBob25ldCBpbnRlcmZhY2Uga2VybmVsIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisjaWZuZGVmIExJTlVYX0lGX1BIT05FVF9ICisjZGVmaW5lIExJTlVYX0lGX1BIT05FVF9ICisKKyNkZWZpbmUgUEhPTkVUX01JTl9NVFUJCTYJLyogcG5fbGVuZ3RoID0gMCAqLworI2RlZmluZSBQSE9ORVRfTUFYX01UVQkJNjU1NDEJLyogcG5fbGVuZ3RoID0gMHhmZmZmICovCisjZGVmaW5lIFBIT05FVF9ERVZfTVRVCQlQSE9ORVRfTUFYX01UVQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wbGlwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BsaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjk4YzdlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wbGlwLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqCU5FVDMJUExJUCB0dW5pbmcgZmFjaWxpdGllcyBmb3IgdGhlIG5ldyBOaWliZSBQTElQLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisgCisjaWZuZGVmIF9MSU5VWF9JRl9QTElQX0gKKyNkZWZpbmUgX0xJTlVYX0lGX1BMSVBfSAorCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjZGVmaW5lCVNJT0NERVZQTElQCVNJT0NERVZQUklWQVRFCisKK3N0cnVjdCBwbGlwY29uZiB7CisJdW5zaWduZWQgc2hvcnQgcGNtZDsKKwl1bnNpZ25lZCBsb25nICBuaWJibGU7CisJdW5zaWduZWQgbG9uZyAgdHJpZ2dlcjsKK307CisKKyNkZWZpbmUgUExJUF9HRVRfVElNRU9VVAkweDEKKyNkZWZpbmUgUExJUF9TRVRfVElNRU9VVAkweDIKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BwcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjg4ZjI2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wcHAuaApAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIGlmX3BwcC5oIC0gUG9pbnQtdG8tUG9pbnQgUHJvdG9jb2wgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQorICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKKyAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKKyAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKKyAqIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiAgVGhlIG5hbWUgb2YgdGhlCisgKiBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICovCisKKy8qCisgKiAgPT1GSUxFVkVSU0lPTiAyMDA1MDgxMj09CisgKgorICogIE5PVEUgVE8gTUFJTlRBSU5FUlM6CisgKiAgICAgSWYgeW91IG1vZGlmeSB0aGlzIGZpbGUgYXQgYWxsLCBwbGVhc2Ugc2V0IHRoZSBhYm92ZSBkYXRlLgorICogICAgIGlmX3BwcC5oIGlzIHNoaXBwZWQgd2l0aCBhIFBQUCBkaXN0cmlidXRpb24gYXMgd2VsbCBhcyB3aXRoIHRoZSBrZXJuZWw7CisgKiAgICAgaWYgZXZlcnlvbmUgaW5jcmVhc2VzIHRoZSBGSUxFVkVSU0lPTiBudW1iZXIgYWJvdmUsIHRoZW4gc2NyaXB0cworICogICAgIGNhbiBkbyB0aGUgcmlnaHQgdGhpbmcgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGluc3RhbGwgYSBuZXcgaWZfcHBwLmgKKyAqICAgICBmaWxlLiAgRG9uJ3QgY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhhdCBsaW5lIG90aGVyd2lzZSwgc28gdGhlCisgKiAgICAgaW5zdGFsbGF0aW9uIHNjcmlwdCBjYW4gcmVjb2duaXplIGl0LgorICovCisKKyNpZm5kZWYgX0lGX1BQUF9IXworI2RlZmluZSBfSUZfUFBQX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKy8qCisgKiBQYWNrZXQgc2l6ZXMKKyAqLworCisjZGVmaW5lCVBQUF9NVFUJCTE1MDAJLyogRGVmYXVsdCBNVFUgKHNpemUgb2YgSW5mbyBmaWVsZCkgKi8KKyNkZWZpbmUgUFBQX01BWE1SVQk2NTAwMAkvKiBMYXJnZXN0IE1SVSB3ZSBhbGxvdyAqLworI2RlZmluZSBQUk9UT19JUFgJMHgwMDJiCS8qIHByb3RvY29sIG51bWJlcnMgKi8KKyNkZWZpbmUgUFJPVE9fRE5BX1JUICAgIDB4MDAyNyAgLyogRE5BIFJvdXRpbmcgKi8KKworCisvKgorICogQml0IGRlZmluaXRpb25zIGZvciBmbGFncy4KKyAqLworCisjZGVmaW5lIFNDX0NPTVBfUFJPVAkweDAwMDAwMDAxCS8qIHByb3RvY29sIGNvbXByZXNzaW9uIChvdXRwdXQpICovCisjZGVmaW5lIFNDX0NPTVBfQUMJMHgwMDAwMDAwMgkvKiBoZWFkZXIgY29tcHJlc3Npb24gKG91dHB1dCkgKi8KKyNkZWZpbmUJU0NfQ09NUF9UQ1AJMHgwMDAwMDAwNAkvKiBUQ1AgKFZKKSBjb21wcmVzc2lvbiAob3V0cHV0KSAqLworI2RlZmluZSBTQ19OT19UQ1BfQ0NJRAkweDAwMDAwMDA4CS8qIGRpc2FibGUgVkogY29ubmVjdGlvbi1pZCBjb21wLiAqLworI2RlZmluZSBTQ19SRUpfQ09NUF9BQwkweDAwMDAwMDEwCS8qIHJlamVjdCBhZHJzL2N0cmwgY29tcC4gb24gaW5wdXQgKi8KKyNkZWZpbmUgU0NfUkVKX0NPTVBfVENQCTB4MDAwMDAwMjAJLyogcmVqZWN0IFRDUCAoVkopIGNvbXAuIG9uIGlucHV0ICovCisjZGVmaW5lIFNDX0NDUF9PUEVOCTB4MDAwMDAwNDAJLyogTG9vayBhdCBDQ1AgcGFja2V0cyAqLworI2RlZmluZSBTQ19DQ1BfVVAJMHgwMDAwMDA4MAkvKiBNYXkgc2VuZC9yZWN2IGNvbXByZXNzZWQgcGFja2V0cyAqLworI2RlZmluZSBTQ19FTkFCTEVfSVAJMHgwMDAwMDEwMAkvKiBJUCBwYWNrZXRzIG1heSBiZSBleGNoYW5nZWQgKi8KKyNkZWZpbmUgU0NfTE9PUF9UUkFGRklDCTB4MDAwMDAyMDAJLyogc2VuZCB0cmFmZmljIHRvIHBwcGQgKi8KKyNkZWZpbmUgU0NfTVVMVElMSU5LCTB4MDAwMDA0MDAJLyogZG8gbXVsdGlsaW5rIGVuY2Fwc3VsYXRpb24gKi8KKyNkZWZpbmUgU0NfTVBfU0hPUlRTRVEJMHgwMDAwMDgwMAkvKiB1c2Ugc2hvcnQgTVAgc2VxdWVuY2UgbnVtYmVycyAqLworI2RlZmluZSBTQ19DT01QX1JVTgkweDAwMDAxMDAwCS8qIGNvbXByZXNzb3IgaGFzIGJlZW4gaW5pdGVkICovCisjZGVmaW5lIFNDX0RFQ09NUF9SVU4JMHgwMDAwMjAwMAkvKiBkZWNvbXByZXNzb3IgaGFzIGJlZW4gaW5pdGVkICovCisjZGVmaW5lIFNDX01QX1hTSE9SVFNFUQkweDAwMDA0MDAwCS8qIHRyYW5zbWl0IHNob3J0IE1QIHNlcSBudW1iZXJzICovCisjZGVmaW5lIFNDX0RFQlVHCTB4MDAwMTAwMDAJLyogZW5hYmxlIGRlYnVnIG1lc3NhZ2VzICovCisjZGVmaW5lIFNDX0xPR19JTlBLVAkweDAwMDIwMDAwCS8qIGxvZyBjb250ZW50cyBvZiBnb29kIHBrdHMgcmVjdmQgKi8KKyNkZWZpbmUgU0NfTE9HX09VVFBLVAkweDAwMDQwMDAwCS8qIGxvZyBjb250ZW50cyBvZiBwa3RzIHNlbnQgKi8KKyNkZWZpbmUgU0NfTE9HX1JBV0lOCTB4MDAwODAwMDAJLyogbG9nIGFsbCBjaGFycyByZWNlaXZlZCAqLworI2RlZmluZSBTQ19MT0dfRkxVU0gJMHgwMDEwMDAwMAkvKiBsb2cgYWxsIGNoYXJzIGZsdXNoZWQgKi8KKyNkZWZpbmUJU0NfU1lOQwkJMHgwMDIwMDAwMAkvKiBzeW5jaHJvbm91cyBzZXJpYWwgbW9kZSAqLworI2RlZmluZQlTQ19NVVNUX0NPTVAgICAgMHgwMDQwMDAwMAkvKiBubyB1bmNvbXByZXNzZWQgcGFja2V0cyBtYXkgYmUgc2VudCBvciByZWNlaXZlZCAqLworI2RlZmluZQlTQ19NQVNLCQkweDBmNjAwZmZmCS8qIGJpdHMgdGhhdCB1c2VyIGNhbiBjaGFuZ2UgKi8KKworLyogc3RhdGUgYml0cyAqLworI2RlZmluZSBTQ19YTUlUX0JVU1kJMHgxMDAwMDAwMAkvKiAodXNlZCBieSBpc2RuX3BwcD8pICovCisjZGVmaW5lIFNDX1JDVl9PRERQCTB4MDgwMDAwMDAJLyogaGF2ZSByY3ZkIGNoYXIgd2l0aCBvZGQgcGFyaXR5ICovCisjZGVmaW5lIFNDX1JDVl9FVk5QCTB4MDQwMDAwMDAJLyogaGF2ZSByY3ZkIGNoYXIgd2l0aCBldmVuIHBhcml0eSAqLworI2RlZmluZSBTQ19SQ1ZfQjdfMQkweDAyMDAwMDAwCS8qIGhhdmUgcmN2ZCBjaGFyIHdpdGggYml0IDcgPSAxICovCisjZGVmaW5lIFNDX1JDVl9CN18wCTB4MDEwMDAwMDAJLyogaGF2ZSByY3ZkIGNoYXIgd2l0aCBiaXQgNyA9IDAgKi8KKyNkZWZpbmUgU0NfRENfRkVSUk9SCTB4MDA4MDAwMDAJLyogZmF0YWwgZGVjb21wIGVycm9yIGRldGVjdGVkICovCisjZGVmaW5lIFNDX0RDX0VSUk9SCTB4MDA0MDAwMDAJLyogbm9uLWZhdGFsIGRlY29tcCBlcnJvciBkZXRlY3RlZCAqLworCisvKgorICogSW9jdGwgZGVmaW5pdGlvbnMuCisgKi8KKworc3RydWN0IG5waW9jdGwgeworCWludAkJcHJvdG9jb2w7CS8qIFBQUCBwcm90b2NvbCwgZS5nLiBQUFBfSVAgKi8KKwllbnVtIE5QbW9kZQltb2RlOworfTsKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYSBDQ1AgY29uZmlndXJhdGlvbiBvcHRpb24sIGZvciBQUFBJT0NTQ09NUFJFU1MgKi8KK3N0cnVjdCBwcHBfb3B0aW9uX2RhdGEgeworCV9fdTgJKnB0cjsKKwlfX3UzMglsZW5ndGg7CisJaW50CXRyYW5zbWl0OworfTsKKworc3RydWN0IGlmcHBwc3RhdHNyZXEgeworCXN0cnVjdCBpZnJlcQkgYjsKKwlzdHJ1Y3QgcHBwX3N0YXRzIHN0YXRzOwkJCS8qIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiAqLworfTsKKworc3RydWN0IGlmcHBwY3N0YXRzcmVxIHsKKwlzdHJ1Y3QgaWZyZXEJICAgICAgYjsKKwlzdHJ1Y3QgcHBwX2NvbXBfc3RhdHMgc3RhdHM7Cit9OworCisvKiBGb3IgUFBQSU9DR0wyVFBTVEFUUyAqLworc3RydWN0IHBwcG9sMnRwX2lvY19zdGF0cyB7CisJX191MTYJCXR1bm5lbF9pZDsJLyogcmVkdW5kYW50ICovCisJX191MTYJCXNlc3Npb25faWQ7CS8qIGlmIHplcm8sIGdldCB0dW5uZWwgc3RhdHMgKi8KKwlfX3UzMgkJdXNpbmdfaXBzZWM6MTsJLyogdmFsaWQgb25seSBmb3Igc2Vzc2lvbl9pZCA9PSAwICovCisJX19hbGlnbmVkX3U2NAl0eF9wYWNrZXRzOworCV9fYWxpZ25lZF91NjQJdHhfYnl0ZXM7CisJX19hbGlnbmVkX3U2NAl0eF9lcnJvcnM7CisJX19hbGlnbmVkX3U2NAlyeF9wYWNrZXRzOworCV9fYWxpZ25lZF91NjQJcnhfYnl0ZXM7CisJX19hbGlnbmVkX3U2NAlyeF9zZXFfZGlzY2FyZHM7CisJX19hbGlnbmVkX3U2NAlyeF9vb3NfcGFja2V0czsKKwlfX2FsaWduZWRfdTY0CXJ4X2Vycm9yczsKK307CisKKyNkZWZpbmUgaWZyX19uYW1lICAgICAgIGIuaWZyX2lmcm4uaWZybl9uYW1lCisjZGVmaW5lIHN0YXRzX3B0ciAgICAgICBiLmlmcl9pZnJ1LmlmcnVfZGF0YQorCisvKgorICogSW9jdGwgZGVmaW5pdGlvbnMuCisgKi8KKworI2RlZmluZQlQUFBJT0NHRkxBR1MJX0lPUigndCcsIDkwLCBpbnQpCS8qIGdldCBjb25maWd1cmF0aW9uIGZsYWdzICovCisjZGVmaW5lCVBQUElPQ1NGTEFHUwlfSU9XKCd0JywgODksIGludCkJLyogc2V0IGNvbmZpZ3VyYXRpb24gZmxhZ3MgKi8KKyNkZWZpbmUJUFBQSU9DR0FTWU5DTUFQCV9JT1IoJ3QnLCA4OCwgaW50KQkvKiBnZXQgYXN5bmMgbWFwICovCisjZGVmaW5lCVBQUElPQ1NBU1lOQ01BUAlfSU9XKCd0JywgODcsIGludCkJLyogc2V0IGFzeW5jIG1hcCAqLworI2RlZmluZQlQUFBJT0NHVU5JVAlfSU9SKCd0JywgODYsIGludCkJLyogZ2V0IHBwcCB1bml0IG51bWJlciAqLworI2RlZmluZQlQUFBJT0NHUkFTWU5DTUFQIF9JT1IoJ3QnLCA4NSwgaW50KQkvKiBnZXQgcmVjZWl2ZSBhc3luYyBtYXAgKi8KKyNkZWZpbmUJUFBQSU9DU1JBU1lOQ01BUCBfSU9XKCd0JywgODQsIGludCkJLyogc2V0IHJlY2VpdmUgYXN5bmMgbWFwICovCisjZGVmaW5lCVBQUElPQ0dNUlUJX0lPUigndCcsIDgzLCBpbnQpCS8qIGdldCBtYXggcmVjZWl2ZSB1bml0ICovCisjZGVmaW5lCVBQUElPQ1NNUlUJX0lPVygndCcsIDgyLCBpbnQpCS8qIHNldCBtYXggcmVjZWl2ZSB1bml0ICovCisjZGVmaW5lCVBQUElPQ1NNQVhDSUQJX0lPVygndCcsIDgxLCBpbnQpCS8qIHNldCBWSiBtYXggc2xvdCBJRCAqLworI2RlZmluZSBQUFBJT0NHWEFTWU5DTUFQIF9JT1IoJ3QnLCA4MCwgZXh0X2FjY20pIC8qIGdldCBleHRlbmRlZCBBQ0NNICovCisjZGVmaW5lIFBQUElPQ1NYQVNZTkNNQVAgX0lPVygndCcsIDc5LCBleHRfYWNjbSkgLyogc2V0IGV4dGVuZGVkIEFDQ00gKi8KKyNkZWZpbmUgUFBQSU9DWEZFUlVOSVQJX0lPKCd0JywgNzgpCQkvKiB0cmFuc2ZlciBQUFAgdW5pdCAqLworI2RlZmluZSBQUFBJT0NTQ09NUFJFU1MJX0lPVygndCcsIDc3LCBzdHJ1Y3QgcHBwX29wdGlvbl9kYXRhKQorI2RlZmluZSBQUFBJT0NHTlBNT0RFCV9JT1dSKCd0JywgNzYsIHN0cnVjdCBucGlvY3RsKSAvKiBnZXQgTlAgbW9kZSAqLworI2RlZmluZSBQUFBJT0NTTlBNT0RFCV9JT1coJ3QnLCA3NSwgc3RydWN0IG5waW9jdGwpICAvKiBzZXQgTlAgbW9kZSAqLworI2RlZmluZSBQUFBJT0NTUEFTUwlfSU9XKCd0JywgNzEsIHN0cnVjdCBzb2NrX2Zwcm9nKSAvKiBzZXQgcGFzcyBmaWx0ZXIgKi8KKyNkZWZpbmUgUFBQSU9DU0FDVElWRQlfSU9XKCd0JywgNzAsIHN0cnVjdCBzb2NrX2Zwcm9nKSAvKiBzZXQgYWN0aXZlIGZpbHQgKi8KKyNkZWZpbmUgUFBQSU9DR0RFQlVHCV9JT1IoJ3QnLCA2NSwgaW50KQkvKiBSZWFkIGRlYnVnIGxldmVsICovCisjZGVmaW5lIFBQUElPQ1NERUJVRwlfSU9XKCd0JywgNjQsIGludCkJLyogU2V0IGRlYnVnIGxldmVsICovCisjZGVmaW5lIFBQUElPQ0dJRExFCV9JT1IoJ3QnLCA2Mywgc3RydWN0IHBwcF9pZGxlKSAvKiBnZXQgaWRsZSB0aW1lICovCisjZGVmaW5lIFBQUElPQ05FV1VOSVQJX0lPV1IoJ3QnLCA2MiwgaW50KQkvKiBjcmVhdGUgbmV3IHBwcCB1bml0ICovCisjZGVmaW5lIFBQUElPQ0FUVEFDSAlfSU9XKCd0JywgNjEsIGludCkJLyogYXR0YWNoIHRvIHBwcCB1bml0ICovCisjZGVmaW5lIFBQUElPQ0RFVEFDSAlfSU9XKCd0JywgNjAsIGludCkJLyogZGV0YWNoIGZyb20gcHBwIHVuaXQvY2hhbiAqLworI2RlZmluZSBQUFBJT0NTTVJSVQlfSU9XKCd0JywgNTksIGludCkJLyogc2V0IG11bHRpbGluayBNUlUgKi8KKyNkZWZpbmUgUFBQSU9DQ09OTkVDVAlfSU9XKCd0JywgNTgsIGludCkJLyogY29ubmVjdCBjaGFubmVsIHRvIHVuaXQgKi8KKyNkZWZpbmUgUFBQSU9DRElTQ09OTglfSU8oJ3QnLCA1NykJCS8qIGRpc2Nvbm5lY3QgY2hhbm5lbCAqLworI2RlZmluZSBQUFBJT0NBVFRDSEFOCV9JT1coJ3QnLCA1NiwgaW50KQkvKiBhdHRhY2ggdG8gcHBwIGNoYW5uZWwgKi8KKyNkZWZpbmUgUFBQSU9DR0NIQU4JX0lPUigndCcsIDU1LCBpbnQpCS8qIGdldCBwcHAgY2hhbm5lbCBudW1iZXIgKi8KKyNkZWZpbmUgUFBQSU9DR0wyVFBTVEFUUyBfSU9SKCd0JywgNTQsIHN0cnVjdCBwcHBvbDJ0cF9pb2Nfc3RhdHMpCisKKyNkZWZpbmUgU0lPQ0dQUFBTVEFUUyAgIChTSU9DREVWUFJJVkFURSArIDApCisjZGVmaW5lIFNJT0NHUFBQVkVSICAgICAoU0lPQ0RFVlBSSVZBVEUgKyAxKQkvKiBORVZFUiBjaGFuZ2UgdGhpcyEhICovCisjZGVmaW5lIFNJT0NHUFBQQ1NUQVRTICAoU0lPQ0RFVlBSSVZBVEUgKyAyKQorCisjaWYgIWRlZmluZWQoaWZyX210dSkKKyNkZWZpbmUgaWZyX210dQlpZnJfaWZydS5pZnJ1X21ldHJpYworI2VuZGlmCisKKyNlbmRpZiAvKiBfSUZfUFBQX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BwcG9sMnRwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BwcG9sMnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmYjlmMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcHBwb2wydHAuaApAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaW51eCBQUFAgb3ZlciBMMlRQIChQUFBvTDJUUCkgU29ja2V0IEltcGxlbWVudGF0aW9uIChSRkMgMjY2MSkKKyAqCisgKiBUaGlzIGZpbGUgc3VwcGxpZXMgZGVmaW5pdGlvbnMgcmVxdWlyZWQgYnkgdGhlIFBQUCBvdmVyIEwyVFAgZHJpdmVyCisgKiAobDJ0cF9wcHAuYykuICBBbGwgdmVyc2lvbiBpbmZvcm1hdGlvbiB3cnQgdGhpcyBmaWxlIGlzIGxvY2F0ZWQgaW4gbDJ0cF9wcHAuYworICoKKyAqIExpY2Vuc2U6CisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0lGX1BQUE9MMlRQX0gKKyNkZWZpbmUgX19MSU5VWF9JRl9QUFBPTDJUUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIGNvbm5lY3QoKSB0aGUgc29ja2V0IHRvIGEgcGFydGljdWxhciB0dW5uZWwgVURQCisgKiBzb2NrZXQuCisgKi8KK3N0cnVjdCBwcHBvbDJ0cF9hZGRyIHsKKwlfX2tlcm5lbF9waWRfdAlwaWQ7CQkvKiBwaWQgdGhhdCBvd25zIHRoZSBmZC4KKwkJCQkJICogMCA9PiBjdXJyZW50ICovCisJaW50CWZkOwkJCS8qIEZEIG9mIFVEUCBzb2NrZXQgdG8gdXNlICovCisKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsJLyogSVAgYWRkcmVzcyBhbmQgcG9ydCB0byBzZW5kIHRvICovCisKKwlfX3UxNiBzX3R1bm5lbCwgc19zZXNzaW9uOwkvKiBGb3IgbWF0Y2hpbmcgaW5jb21pbmcgcGFja2V0cyAqLworCV9fdTE2IGRfdHVubmVsLCBkX3Nlc3Npb247CS8qIEZvciBzZW5kaW5nIG91dGdvaW5nIHBhY2tldHMgKi8KK307CisKKy8qIFRoZSBMMlRQdjMgcHJvdG9jb2wgY2hhbmdlcyB0dW5uZWwgYW5kIHNlc3Npb24gaWRzIGZyb20gMTYgdG8gMzIKKyAqIGJpdHMuIFNvIHdlIG5lZWQgYSBkaWZmZXJlbnQgc29ja2FkZHIgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgcHBwb2wydHB2M19hZGRyIHsKKwlfX2tlcm5lbF9waWRfdAlwaWQ7CQkvKiBwaWQgdGhhdCBvd25zIHRoZSBmZC4KKwkJCQkJICogMCA9PiBjdXJyZW50ICovCisJaW50CWZkOwkJCS8qIEZEIG9mIFVEUCBvciBJUCBzb2NrZXQgdG8gdXNlICovCisKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsJLyogSVAgYWRkcmVzcyBhbmQgcG9ydCB0byBzZW5kIHRvICovCisKKwlfX3UzMiBzX3R1bm5lbCwgc19zZXNzaW9uOwkvKiBGb3IgbWF0Y2hpbmcgaW5jb21pbmcgcGFja2V0cyAqLworCV9fdTMyIGRfdHVubmVsLCBkX3Nlc3Npb247CS8qIEZvciBzZW5kaW5nIG91dGdvaW5nIHBhY2tldHMgKi8KK307CisKKy8qIFNvY2tldCBvcHRpb25zOgorICogREVCVUcJLSBiaXRtYXNrIG9mIGRlYnVnIG1lc3NhZ2UgY2F0ZWdvcmllcworICogU0VORFNFUQktIDAgPT4gZG9uJ3Qgc2VuZCBwYWNrZXRzIHdpdGggc2VxdWVuY2UgbnVtYmVycworICoJCSAgMSA9PiBzZW5kIHBhY2tldHMgd2l0aCBzZXF1ZW5jZSBudW1iZXJzCisgKiBSRUNWU0VRCS0gMCA9PiByZWNlaXZlIHBhY2tldCBzZXF1ZW5jZSBudW1iZXJzIGFyZSBvcHRpb25hbAorICoJCSAgMSA9PiBkcm9wIHJlY2VpdmUgcGFja2V0cyB3aXRob3V0IHNlcXVlbmNlIG51bWJlcnMKKyAqIExOU01PREUJLSAwID0+IGFjdCBhcyBMQUMuCisgKgkJICAxID0+IGFjdCBhcyBMTlMuCisgKiBSRU9SREVSVE8JLSByZW9yZGVyIHRpbWVvdXQgKGluIG1pbGxpc2VjcykuIElmIDAsIGRvbid0IHRyeSB0byByZW9yZGVyLgorICovCitlbnVtIHsKKwlQUFBPTDJUUF9TT19ERUJVRwk9IDEsCisJUFBQT0wyVFBfU09fUkVDVlNFUQk9IDIsCisJUFBQT0wyVFBfU09fU0VORFNFUQk9IDMsCisJUFBQT0wyVFBfU09fTE5TTU9ERQk9IDQsCisJUFBQT0wyVFBfU09fUkVPUkRFUlRPCT0gNSwKK307CisKKy8qIERlYnVnIG1lc3NhZ2UgY2F0ZWdvcmllcyBmb3IgdGhlIERFQlVHIHNvY2tldCBvcHRpb24gKi8KK2VudW0geworCVBQUE9MMlRQX01TR19ERUJVRwk9ICgxIDw8IDApLAkvKiB2ZXJib3NlIGRlYnVnIChpZgorCQkJCQkJICogY29tcGlsZWQgaW4pICovCisJUFBQT0wyVFBfTVNHX0NPTlRST0wJPSAoMSA8PCAxKSwJLyogdXNlcnNwYWNlIC0ga2VybmVsCisJCQkJCQkgKiBpbnRlcmZhY2UgKi8KKwlQUFBPTDJUUF9NU0dfU0VRCT0gKDEgPDwgMiksCS8qIHNlcXVlbmNlIG51bWJlcnMgKi8KKwlQUFBPTDJUUF9NU0dfREFUQQk9ICgxIDw8IDMpLAkvKiBkYXRhIHBhY2tldHMgKi8KK307CisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcHBwb3guaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcHBwb3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGNjMjliCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wcHBveC5oCkBAIC0wLDAgKzEsMTQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaW51eCBQUFAgb3ZlciBYIC0gR2VuZXJpYyBQUFAgdHJhbnNwb3J0IGxheWVyIHNvY2tldHMKKyAqIExpbnV4IFBQUCBvdmVyIEV0aGVybmV0IChQUFBvRSkgU29ja2V0IEltcGxlbWVudGF0aW9uIChSRkMgMjUxNikgCisgKgorICogVGhpcyBmaWxlIHN1cHBsaWVzIGRlZmluaXRpb25zIHJlcXVpcmVkIGJ5IHRoZSBQUFAgb3ZlciBFdGhlcm5ldCBkcml2ZXIKKyAqIChwcHBveC5jKS4gIEFsbCB2ZXJzaW9uIGluZm9ybWF0aW9uIHdydCB0aGlzIGZpbGUgaXMgbG9jYXRlZCBpbiBwcHBveC5jCisgKgorICogTGljZW5zZToKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfSUZfUFBQT1hfSAorI2RlZmluZSBfX0xJTlVYX0lGX1BQUE9YX0gKKworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BwcG9sMnRwLmg+CisKKy8qIEZvciB1c2VyLXNwYWNlIHByb2dyYW1zIHRvIHBpY2sgdXAgdGhlc2UgZGVmaW5pdGlvbnMKKyAqIHdoaWNoIHRoZXkgd291bGRuJ3QgZ2V0IG90aGVyd2lzZSB3aXRob3V0IGRlZmluaW5nIF9fS0VSTkVMX18KKyAqLworI2lmbmRlZiBBRl9QUFBPWAorI2RlZmluZSBBRl9QUFBPWAkyNAorI2RlZmluZSBQRl9QUFBPWAlBRl9QUFBPWAorI2VuZGlmIC8qICEoQUZfUFBQT1gpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBQUFBvRSBhZGRyZXNzaW5nIGRlZmluaXRpb24gCisgKi8gCit0eXBlZGVmIF9fYmUxNiBzaWRfdDsKK3N0cnVjdCBwcHBvZV9hZGRyIHsKKwlzaWRfdCAgICAgICAgIHNpZDsgICAgICAgICAgICAgICAgICAgIC8qIFNlc3Npb24gaWRlbnRpZmllciAqLworCXVuc2lnbmVkIGNoYXIgcmVtb3RlW0VUSF9BTEVOXTsgICAgICAgLyogUmVtb3RlIGFkZHJlc3MgKi8KKwljaGFyICAgICAgICAgIGRldltJRk5BTVNJWl07ICAgICAgICAgIC8qIExvY2FsIGRldmljZSB0byB1c2UgKi8KK307IAorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIFBQVFAgYWRkcmVzc2luZyBkZWZpbml0aW9uCisgKi8KK3N0cnVjdCBwcHRwX2FkZHIgeworCV9fYmUxNgkJY2FsbF9pZDsKKwlzdHJ1Y3QgaW5fYWRkcglzaW5fYWRkcjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb3RvY29scyBzdXBwb3J0ZWQgYnkgQUZfUFBQT1gKKyAqLworI2RlZmluZSBQWF9QUk9UT19PRSAgICAwIC8qIEN1cnJlbnRseSBqdXN0IFBQUG9FICovCisjZGVmaW5lIFBYX1BST1RPX09MMlRQIDEgLyogTm93IEwyVFAgYWxzbyAqLworI2RlZmluZSBQWF9QUk9UT19QUFRQICAyCisjZGVmaW5lIFBYX01BWF9QUk9UTyAgIDMKKworc3RydWN0IHNvY2thZGRyX3BwcG94IHsKKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCBzYV9mYW1pbHk7ICAgICAgIC8qIGFkZHJlc3MgZmFtaWx5LCBBRl9QUFBPWCAqLworCXVuc2lnbmVkIGludCAgICBzYV9wcm90b2NvbDsgICAgICAgICAgLyogcHJvdG9jb2wgaWRlbnRpZmllciAqLworCXVuaW9uIHsKKwkJc3RydWN0IHBwcG9lX2FkZHIgIHBwcG9lOworCQlzdHJ1Y3QgcHB0cF9hZGRyICAgcHB0cDsKKwl9IHNhX2FkZHI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBUaGUgdXNlIG9mIHRoZSBhYm92ZSB1bmlvbiBpc24ndCB2aWFibGUgYmVjYXVzZSB0aGUgc2l6ZSBvZiB0aGlzCisgKiBzdHJ1Y3QgbXVzdCBzdGF5IGZpeGVkIG92ZXIgdGltZSAtLSBhcHBsaWNhdGlvbnMgdXNlIHNpemVvZihzdHJ1Y3QKKyAqIHNvY2thZGRyX3BwcG94KSB0byBmaWxsIGl0LiBXZSB1c2UgYSBwcm90b2NvbCBzcGVjaWZpYyBzb2NrYWRkcgorICogdHlwZSBpbnN0ZWFkLgorICovCitzdHJ1Y3Qgc29ja2FkZHJfcHBwb2wydHAgeworCV9fa2VybmVsX3NhX2ZhbWlseV90IHNhX2ZhbWlseTsgLyogYWRkcmVzcyBmYW1pbHksIEFGX1BQUE9YICovCisJdW5zaWduZWQgaW50ICAgIHNhX3Byb3RvY29sOyAgICAvKiBwcm90b2NvbCBpZGVudGlmaWVyICovCisJc3RydWN0IHBwcG9sMnRwX2FkZHIgcHBwb2wydHA7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBUaGUgTDJUUHYzIHByb3RvY29sIGNoYW5nZXMgdHVubmVsIGFuZCBzZXNzaW9uIGlkcyBmcm9tIDE2IHRvIDMyCisgKiBiaXRzLiBTbyB3ZSBuZWVkIGEgZGlmZmVyZW50IHNvY2thZGRyIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHNvY2thZGRyX3BwcG9sMnRwdjMgeworCV9fa2VybmVsX3NhX2ZhbWlseV90IHNhX2ZhbWlseTsgLyogYWRkcmVzcyBmYW1pbHksIEFGX1BQUE9YICovCisJdW5zaWduZWQgaW50ICAgIHNhX3Byb3RvY29sOyAgICAvKiBwcm90b2NvbCBpZGVudGlmaWVyICovCisJc3RydWN0IHBwcG9sMnRwdjNfYWRkciBwcHBvbDJ0cDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBpb2N0bCBpbnRlcmZhY2UgZm9yIGRlZmluaW5nIGZvcndhcmRpbmcgb2YgY29ubmVjdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUFBQT0VJT0NTRldECV9JT1coMHhCMSAsMCwgc2l6ZV90KQorI2RlZmluZSBQUFBPRUlPQ0RGV0QJX0lPKDB4QjEgLDEpCisvKiNkZWZpbmUgUFBQT0VJT0NHRldECV9JT1dSKDB4QjEsMiwgc2l6ZV90KSovCisKKy8qIENvZGVzIHRvIGlkZW50aWZ5IG1lc3NhZ2UgdHlwZXMgKi8KKyNkZWZpbmUgUEFESV9DT0RFCTB4MDkKKyNkZWZpbmUgUEFET19DT0RFCTB4MDcKKyNkZWZpbmUgUEFEUl9DT0RFCTB4MTkKKyNkZWZpbmUgUEFEU19DT0RFCTB4NjUKKyNkZWZpbmUgUEFEVF9DT0RFCTB4YTcKK3N0cnVjdCBwcHBvZV90YWcgeworCV9fYmUxNiB0YWdfdHlwZTsKKwlfX2JlMTYgdGFnX2xlbjsKKwljaGFyIHRhZ19kYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFRhZyBpZGVudGlmaWVycyAqLworI2RlZmluZSBQVFRfRU9MCQlfX2NwdV90b19iZTE2KDB4MDAwMCkKKyNkZWZpbmUgUFRUX1NSVl9OQU1FCV9fY3B1X3RvX2JlMTYoMHgwMTAxKQorI2RlZmluZSBQVFRfQUNfTkFNRQlfX2NwdV90b19iZTE2KDB4MDEwMikKKyNkZWZpbmUgUFRUX0hPU1RfVU5JUQlfX2NwdV90b19iZTE2KDB4MDEwMykKKyNkZWZpbmUgUFRUX0FDX0NPT0tJRQlfX2NwdV90b19iZTE2KDB4MDEwNCkKKyNkZWZpbmUgUFRUX1ZFTkRPUiAJX19jcHVfdG9fYmUxNigweDAxMDUpCisjZGVmaW5lIFBUVF9SRUxBWV9TSUQJX19jcHVfdG9fYmUxNigweDAxMTApCisjZGVmaW5lIFBUVF9TUlZfRVJSICAgICBfX2NwdV90b19iZTE2KDB4MDIwMSkKKyNkZWZpbmUgUFRUX1NZU19FUlIgIAlfX2NwdV90b19iZTE2KDB4MDIwMikKKyNkZWZpbmUgUFRUX0dFTl9FUlIgIAlfX2NwdV90b19iZTE2KDB4MDIwMykKKworc3RydWN0IHBwcG9lX2hkciB7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCB2ZXIgOiA0OworCV9fdTggdHlwZSA6IDQ7CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHR5cGUgOiA0OworCV9fdTggdmVyIDogNDsKKyNlbHNlCisjZXJyb3IJIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKwlfX3U4IGNvZGU7CisJX19iZTE2IHNpZDsKKwlfX2JlMTYgbGVuZ3RoOworCXN0cnVjdCBwcHBvZV90YWcgdGFnWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogTGVuZ3RoIG9mIGVudGlyZSBQUFBvRSArIFBQUCBoZWFkZXIgKi8KKyNkZWZpbmUgUFBQT0VfU0VTX0hMRU4JOAorCisKKyNlbmRpZiAvKiAhKF9fTElOVVhfSUZfUFBQT1hfSCkgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfc2xpcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9zbGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViNGUzYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfc2xpcC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKglTd2Fuc2VhIFVuaXZlcnNpdHkgQ29tcHV0ZXIgU29jaWV0eQlORVQzCisgKgkKKyAqCVRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgY29uc3RhbnRzIG9mIHNwZWNpYWwgdXNlIHdpdGggdGhlIFNMSVAvQ1NMSVAvCisgKglLSVNTIFROQyBkcml2ZXIuCisgKi8KKyAKKyNpZm5kZWYgX19MSU5VWF9TTElQX0gKKyNkZWZpbmUgX19MSU5VWF9TTElQX0gKKworI2RlZmluZQkJU0xfTU9ERV9TTElQCQkwCisjZGVmaW5lCQlTTF9NT0RFX0NTTElQCQkxCisjZGVmaW5lIAlTTF9NT0RFX0tJU1MJCTQKKworI2RlZmluZQkJU0xfT1BUX1NJWEJJVAkJMgorI2RlZmluZQkJU0xfT1BUX0FEQVBUSVZFCQk4CisKKy8qCisgKglWU1YgPSBpb2N0bCBmb3Iga2VlcGFsaXZlICYgb3V0ZmlsbCBpbiBTTElQIGRyaXZlciAKKyAqLworIAorI2RlZmluZSBTSU9DU0tFRVBBTElWRQkoU0lPQ0RFVlBSSVZBVEUpCQkvKiBTZXQga2VlcGFsaXZlIHRpbWVvdXQgaW4gc2VjICovCisjZGVmaW5lIFNJT0NHS0VFUEFMSVZFCShTSU9DREVWUFJJVkFURSsxKQkJLyogR2V0IGtlZXBhbGl2ZSB0aW1lb3V0ICovCisjZGVmaW5lIFNJT0NTT1VURklMTAkoU0lPQ0RFVlBSSVZBVEUrMikJCS8qIFNldCBvdXRmaWxsIHRpbWVvdXQgKi8KKyNkZWZpbmUJU0lPQ0dPVVRGSUxMCShTSU9DREVWUFJJVkFURSszKQkJLyogR2V0IG91dGZpbGwgdGltZW91dCAqLworI2RlZmluZSBTSU9DU0xFQVNFCShTSU9DREVWUFJJVkFURSs0KQkJLyogU2V0ICJsZWFzZWQiIGxpbmUgdHlwZSAqLworI2RlZmluZQlTSU9DR0xFQVNFCShTSU9DREVWUFJJVkFURSs1KQkJLyogR2V0IGxpbmUgdHlwZSAqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9zdHJpcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9zdHJpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjZhNjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3N0cmlwLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIGlmX3N0cmlwLmggLS0KKyAqCisgKiAgICAgIERlZmluaXRpb25zIGZvciB0aGUgU1RSSVAgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IDE5OTYgVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIFRoZSBMZWxhbmQgU3RhbmZvcmQKKyAqIEp1bmlvciBVbml2ZXJzaXR5LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKKyAqIGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuICBTdGFuZm9yZCBVbml2ZXJzaXR5CisgKiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMKKyAqIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAorICogZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKyNpZm5kZWYgX19MSU5VWF9TVFJJUF9ICisjZGVmaW5lIF9fTElOVVhfU1RSSVBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIF9fdTggY1s2XTsKK30gTWV0cmljb21BZGRyZXNzOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfdHIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTRiYzk1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl90ci5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgVG9rZW4tUmluZyBJRUVFIDgwMi41IGludGVyZmFjZS4KKyAqCisgKiBWZXJzaW9uOglAKCMpaWZfdHIuaAkwLjAJMDcvMTEvOTQKKyAqCisgKiBBdXRob3I6CUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCURvbmFsZCBCZWNrZXIsIDxiZWNrZXJAc3VwZXIub3JnPgorICoJCVBldGVyIERlIFNjaHJpanZlciwgPHN0dWQxMUBjYzQua3VsZXV2ZW4uYWMuYmU+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX0lGX1RSX0gKKyNkZWZpbmUgX0xJTlVYX0lGX1RSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkvKiBGb3IgX19iZTE2ICovCisKKy8qIElFRUUgODAyLjUgVG9rZW4tUmluZyBtYWdpYyBjb25zdGFudHMuICBUaGUgZnJhbWUgc2l6ZXMgb21pdCB0aGUgcHJlYW1ibGUKKyAgIGFuZCBGQ1MvQ1JDIChmcmFtZSBjaGVjayBzZXF1ZW5jZSkuICovCisjZGVmaW5lIFRSX0FMRU4JCTYJCS8qIE9jdGV0cyBpbiBvbmUgdG9rZW4tcmluZyBhZGRyICovCisjZGVmaW5lIFRSX0hMRU4gCShzaXplb2Yoc3RydWN0IHRyaF9oZHIpK3NpemVvZihzdHJ1Y3QgdHJsbGMpKQorI2RlZmluZSBBQwkJMHgxMAorI2RlZmluZSBMTENfRlJBTUUgCTB4NDAKKworLyogTExDIGFuZCBTTkFQIGNvbnN0YW50cyAqLworI2RlZmluZSBFWFRFTkRFRF9TQVAgCTB4QUEKKyNkZWZpbmUgVUlfQ01EICAgICAgIAkweDAzCisKKy8qIFRoaXMgaXMgYW4gVG9rZW4tUmluZyBmcmFtZSBoZWFkZXIuICovCitzdHJ1Y3QgdHJoX2hkciB7CisJX191OCAgYWM7CQkJLyogYWNjZXNzIGNvbnRyb2wgZmllbGQgKi8KKwlfX3U4ICBmYzsJCQkvKiBmcmFtZSBjb250cm9sIGZpZWxkICovCisJX191OCAgZGFkZHJbVFJfQUxFTl07CQkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJX191OCAgc2FkZHJbVFJfQUxFTl07CQkvKiBzb3VyY2UgYWRkcmVzcyAqLworCV9fYmUxNiByY2Y7CQkJLyogcm91dGUgY29udHJvbCBmaWVsZCAqLworCV9fYmUxNiByc2VnWzhdOwkJCS8qIHJvdXRpbmcgcmVnaXN0ZXJzICovCit9OworCisKKy8qIFRoaXMgaXMgYW4gVG9rZW4tUmluZyBMTEMgc3RydWN0dXJlICovCitzdHJ1Y3QgdHJsbGMgeworCV9fdTggIGRzYXA7CQkJLyogZGVzdGluYXRpb24gU0FQICovCisJX191OCAgc3NhcDsJCQkvKiBzb3VyY2UgU0FQICovCisJX191OCAgbGxjOwkJCS8qIExMQyBjb250cm9sIGZpZWxkICovCisJX191OCAgcHJvdGlkWzNdOwkJLyogcHJvdG9jb2wgaWQgKi8KKwlfX2JlMTYgZXRoZXJ0eXBlOwkJLyogZXRoZXIgdHlwZSBmaWVsZCAqLworfTsKKworLyogVG9rZW4tUmluZyBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gZGF0YS4gKi8KK3N0cnVjdCB0cl9zdGF0aXN0aWNzIHsKKwl1bnNpZ25lZCBsb25nIHJ4X3BhY2tldHM7ICAgICAgIC8qIHRvdGFsIHBhY2tldHMgcmVjZWl2ZWQJKi8KKwl1bnNpZ25lZCBsb25nIHR4X3BhY2tldHM7CS8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQJKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2J5dGVzOwkJLyogdG90YWwgYnl0ZXMgcmVjZWl2ZWQgICAJKi8KKwl1bnNpZ25lZCBsb25nIHR4X2J5dGVzOwkJLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQJKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2Vycm9yczsJLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQJCSovCisJdW5zaWduZWQgbG9uZyB0eF9lcnJvcnM7CS8qIHBhY2tldCB0cmFuc21pdCBwcm9ibGVtcwkqLworCXVuc2lnbmVkIGxvbmcgcnhfZHJvcHBlZDsJLyogbm8gc3BhY2UgaW4gbGludXggYnVmZmVycwkqLworCXVuc2lnbmVkIGxvbmcgdHhfZHJvcHBlZDsJLyogbm8gc3BhY2UgYXZhaWxhYmxlIGluIGxpbnV4CSovCisJdW5zaWduZWQgbG9uZyBtdWx0aWNhc3Q7CS8qIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkCSovCisJdW5zaWduZWQgbG9uZyB0cmFuc21pdF9jb2xsaXNpb247CisKKwkvKiBkZXRhaWxlZCBUb2tlbi1SaW5nIGVycm9ycy4gU2VlIElCTSBUb2tlbi1SaW5nIE5ldHdvcmsKKwkgICBBcmNoaXRlY3R1cmUgZm9yIG1vcmUgaW5mbyAqLworCisJdW5zaWduZWQgbG9uZyBsaW5lX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nIGludGVybmFsX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nIGJ1cnN0X2Vycm9yczsKKwl1bnNpZ25lZCBsb25nIEFfQ19lcnJvcnM7CisJdW5zaWduZWQgbG9uZyBhYm9ydF9kZWxpbWl0ZXJzOworCXVuc2lnbmVkIGxvbmcgbG9zdF9mcmFtZXM7CisJdW5zaWduZWQgbG9uZyByZWN2X2Nvbmdlc3RfY291bnQ7CisJdW5zaWduZWQgbG9uZyBmcmFtZV9jb3BpZWRfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcgZnJlcXVlbmN5X2Vycm9yczsKKwl1bnNpZ25lZCBsb25nIHRva2VuX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nIGR1bW15MTsKK307CisKKy8qIHNvdXJjZSByb3V0aW5nIHN0dWZmICovCisjZGVmaW5lIFRSX1JJSSAJCQkweDgwCisjZGVmaW5lIFRSX1JDRl9ESVJfQklUIAkJMHg4MAorI2RlZmluZSBUUl9SQ0ZfTEVOX01BU0sgCTB4MWYwMAorI2RlZmluZSBUUl9SQ0ZfQlJPQURDQVNUIAkweDgwMDAJLyogYWxsLXJvdXRlcyBicm9hZGNhc3QgKi8KKyNkZWZpbmUgVFJfUkNGX0xJTUlURURfQlJPQURDQVNUIDB4QzAwMAkvKiBzaW5nbGUtcm91dGUgYnJvYWRjYXN0ICovCisjZGVmaW5lIFRSX1JDRl9GUkFNRTJLIAkJMHgyMAorI2RlZmluZSBUUl9SQ0ZfQlJPQURDQVNUX01BU0sgCTB4QzAwMAorI2RlZmluZSBUUl9NQVhSSUZMRU4gCQkxOAorCisjZW5kaWYJLyogX0xJTlVYX0lGX1RSX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfdHVuLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3R1bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTRjMWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3R1bi5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiAgVW5pdmVyc2FsIFRVTi9UQVAgZGV2aWNlIGRyaXZlci4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBNYXhpbSBLcmFzbnlhbnNreSA8bWF4X21rQHlhaG9vLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19JRl9UVU5fSAorI2RlZmluZSBfX0lGX1RVTl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisKKy8qIFJlYWQgcXVldWUgc2l6ZSAqLworI2RlZmluZSBUVU5fUkVBRFFfU0laRQk1MDAKKworLyogVFVOIGRldmljZSBmbGFncyAqLworI2RlZmluZSBUVU5fVFVOX0RFViAJMHgwMDAxCQorI2RlZmluZSBUVU5fVEFQX0RFVgkweDAwMDIKKyNkZWZpbmUgVFVOX1RZUEVfTUFTSyAgIDB4MDAwZgorCisjZGVmaW5lIFRVTl9GQVNZTkMJMHgwMDEwCisjZGVmaW5lIFRVTl9OT0NIRUNLU1VNCTB4MDAyMAorI2RlZmluZSBUVU5fTk9fUEkJMHgwMDQwCisjZGVmaW5lIFRVTl9PTkVfUVVFVUUJMHgwMDgwCisjZGVmaW5lIFRVTl9QRVJTSVNUIAkweDAxMDAJCisjZGVmaW5lIFRVTl9WTkVUX0hEUiAJMHgwMjAwCisKKy8qIElvY3RsIGRlZmluZXMgKi8KKyNkZWZpbmUgVFVOU0VUTk9DU1VNICBfSU9XKCdUJywgMjAwLCBpbnQpIAorI2RlZmluZSBUVU5TRVRERUJVRyAgIF9JT1coJ1QnLCAyMDEsIGludCkgCisjZGVmaW5lIFRVTlNFVElGRiAgICAgX0lPVygnVCcsIDIwMiwgaW50KSAKKyNkZWZpbmUgVFVOU0VUUEVSU0lTVCBfSU9XKCdUJywgMjAzLCBpbnQpIAorI2RlZmluZSBUVU5TRVRPV05FUiAgIF9JT1coJ1QnLCAyMDQsIGludCkKKyNkZWZpbmUgVFVOU0VUTElOSyAgICBfSU9XKCdUJywgMjA1LCBpbnQpCisjZGVmaW5lIFRVTlNFVEdST1VQICAgX0lPVygnVCcsIDIwNiwgaW50KQorI2RlZmluZSBUVU5HRVRGRUFUVVJFUyBfSU9SKCdUJywgMjA3LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFRVTlNFVE9GRkxPQUQgIF9JT1coJ1QnLCAyMDgsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVFVOU0VUVFhGSUxURVIgX0lPVygnVCcsIDIwOSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBUVU5HRVRJRkYgICAgICBfSU9SKCdUJywgMjEwLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFRVTkdFVFNOREJVRiAgIF9JT1IoJ1QnLCAyMTEsIGludCkKKyNkZWZpbmUgVFVOU0VUU05EQlVGICAgX0lPVygnVCcsIDIxMiwgaW50KQorI2RlZmluZSBUVU5BVFRBQ0hGSUxURVIgX0lPVygnVCcsIDIxMywgc3RydWN0IHNvY2tfZnByb2cpCisjZGVmaW5lIFRVTkRFVEFDSEZJTFRFUiBfSU9XKCdUJywgMjE0LCBzdHJ1Y3Qgc29ja19mcHJvZykKKyNkZWZpbmUgVFVOR0VUVk5FVEhEUlNaIF9JT1IoJ1QnLCAyMTUsIGludCkKKyNkZWZpbmUgVFVOU0VUVk5FVEhEUlNaIF9JT1coJ1QnLCAyMTYsIGludCkKKworLyogVFVOU0VUSUZGIGlmciBmbGFncyAqLworI2RlZmluZSBJRkZfVFVOCQkweDAwMDEKKyNkZWZpbmUgSUZGX1RBUAkJMHgwMDAyCisjZGVmaW5lIElGRl9OT19QSQkweDEwMDAKKyNkZWZpbmUgSUZGX09ORV9RVUVVRQkweDIwMDAKKyNkZWZpbmUgSUZGX1ZORVRfSERSCTB4NDAwMAorI2RlZmluZSBJRkZfVFVOX0VYQ0wJMHg4MDAwCisKKy8qIEZlYXR1cmVzIGZvciBHU08gKFRVTlNFVE9GRkxPQUQpLiAqLworI2RlZmluZSBUVU5fRl9DU1VNCTB4MDEJLyogWW91IGNhbiBoYW5kIG1lIHVuY2hlY2tzdW1tZWQgcGFja2V0cy4gKi8KKyNkZWZpbmUgVFVOX0ZfVFNPNAkweDAyCS8qIEkgY2FuIGhhbmRsZSBUU08gZm9yIElQdjQgcGFja2V0cyAqLworI2RlZmluZSBUVU5fRl9UU082CTB4MDQJLyogSSBjYW4gaGFuZGxlIFRTTyBmb3IgSVB2NiBwYWNrZXRzICovCisjZGVmaW5lIFRVTl9GX1RTT19FQ04JMHgwOAkvKiBJIGNhbiBoYW5kbGUgVFNPIHdpdGggRUNOIGJpdHMuICovCisjZGVmaW5lIFRVTl9GX1VGTwkweDEwCS8qIEkgY2FuIGhhbmRsZSBVRk8gcGFja2V0cyAqLworCisvKiBQcm90b2NvbCBpbmZvIHByZXBlbmRlZCB0byB0aGUgcGFja2V0cyAod2hlbiBJRkZfTk9fUEkgaXMgbm90IHNldCkgKi8KKyNkZWZpbmUgVFVOX1BLVF9TVFJJUAkweDAwMDEKK3N0cnVjdCB0dW5fcGkgeworCV9fdTE2ICBmbGFnczsKKwlfX2JlMTYgcHJvdG87Cit9OworCisvKgorICogRmlsdGVyIHNwZWMgKHVzZWQgZm9yIFNFVFhYRklMVEVSIGlvY3RscykKKyAqIFRoaXMgc3R1ZmYgaXMgYXBwbGljYWJsZSBvbmx5IHRvIHRoZSBUQVAgKEV0aGVybmV0KSBkZXZpY2VzLgorICogSWYgdGhlIGNvdW50IGlzIHplcm8gdGhlIGZpbHRlciBpcyBkaXNhYmxlZCBhbmQgdGhlIGRyaXZlciBhY2NlcHRzCisgKiBhbGwgcGFja2V0cyAocHJvbWlzYyBtb2RlKS4KKyAqIElmIHRoZSBmaWx0ZXIgaXMgZW5hYmxlZCBpbiBvcmRlciB0byBhY2NlcHQgYnJvYWRjYXN0IHBhY2tldHMKKyAqIGJyb2FkY2FzdCBhZGRyIG11c3QgYmUgZXhwbGljaXRseSBpbmNsdWRlZCBpbiB0aGUgYWRkciBsaXN0LgorICovCisjZGVmaW5lIFRVTl9GTFRfQUxMTVVMVEkgMHgwMDAxIC8qIEFjY2VwdCBhbGwgbXVsdGljYXN0IHBhY2tldHMgKi8KK3N0cnVjdCB0dW5fZmlsdGVyIHsKKwlfX3UxNiAgZmxhZ3M7IC8qIFRVTl9GTFRfIGZsYWdzIHNlZSBhYm92ZSAqLworCV9fdTE2ICBjb3VudDsgLyogTnVtYmVyIG9mIGFkZHJlc3NlcyAqLworCV9fdTggICBhZGRyWzBdW0VUSF9BTEVOXTsKK307CisKKyNlbmRpZiAvKiBfX0lGX1RVTl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3R1bm5lbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl90dW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzgxOWI4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl90dW5uZWwuaApAQCAtMCwwICsxLDc5IEBACisjaWZuZGVmIF9JRl9UVU5ORUxfSF8KKyNkZWZpbmUgX0lGX1RVTk5FTF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKworI2RlZmluZSBTSU9DR0VUVFVOTkVMICAgKFNJT0NERVZQUklWQVRFICsgMCkKKyNkZWZpbmUgU0lPQ0FERFRVTk5FTCAgIChTSU9DREVWUFJJVkFURSArIDEpCisjZGVmaW5lIFNJT0NERUxUVU5ORUwgICAoU0lPQ0RFVlBSSVZBVEUgKyAyKQorI2RlZmluZSBTSU9DQ0hHVFVOTkVMICAgKFNJT0NERVZQUklWQVRFICsgMykKKyNkZWZpbmUgU0lPQ0dFVFBSTCAgICAgIChTSU9DREVWUFJJVkFURSArIDQpCisjZGVmaW5lIFNJT0NBRERQUkwgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA1KQorI2RlZmluZSBTSU9DREVMUFJMICAgICAgKFNJT0NERVZQUklWQVRFICsgNikKKyNkZWZpbmUgU0lPQ0NIR1BSTCAgICAgIChTSU9DREVWUFJJVkFURSArIDcpCisjZGVmaW5lIFNJT0NHRVQ2UkQgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA4KQorI2RlZmluZSBTSU9DQURENlJEICAgICAgKFNJT0NERVZQUklWQVRFICsgOSkKKyNkZWZpbmUgU0lPQ0RFTDZSRCAgICAgIChTSU9DREVWUFJJVkFURSArIDEwKQorI2RlZmluZSBTSU9DQ0hHNlJEICAgICAgKFNJT0NERVZQUklWQVRFICsgMTEpCisKKyNkZWZpbmUgR1JFX0NTVU0JX19jcHVfdG9fYmUxNigweDgwMDApCisjZGVmaW5lIEdSRV9ST1VUSU5HCV9fY3B1X3RvX2JlMTYoMHg0MDAwKQorI2RlZmluZSBHUkVfS0VZCQlfX2NwdV90b19iZTE2KDB4MjAwMCkKKyNkZWZpbmUgR1JFX1NFUQkJX19jcHVfdG9fYmUxNigweDEwMDApCisjZGVmaW5lIEdSRV9TVFJJQ1QJX19jcHVfdG9fYmUxNigweDA4MDApCisjZGVmaW5lIEdSRV9SRUMJCV9fY3B1X3RvX2JlMTYoMHgwNzAwKQorI2RlZmluZSBHUkVfRkxBR1MJX19jcHVfdG9fYmUxNigweDAwRjgpCisjZGVmaW5lIEdSRV9WRVJTSU9OCV9fY3B1X3RvX2JlMTYoMHgwMDA3KQorCitzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0geworCWNoYXIJCQluYW1lW0lGTkFNU0laXTsKKwlpbnQJCQlsaW5rOworCV9fYmUxNgkJCWlfZmxhZ3M7CisJX19iZTE2CQkJb19mbGFnczsKKwlfX2JlMzIJCQlpX2tleTsKKwlfX2JlMzIJCQlvX2tleTsKKwlzdHJ1Y3QgaXBoZHIJCWlwaDsKK307CisKKy8qIFNJVC1tb2RlIGlfZmxhZ3MgKi8KKyNkZWZpbmUJU0lUX0lTQVRBUAkweDAwMDEKKworc3RydWN0IGlwX3R1bm5lbF9wcmwgeworCV9fYmUzMgkJCWFkZHI7CisJX191MTYJCQlmbGFnczsKKwlfX3UxNgkJCV9fcmVzZXJ2ZWQ7CisJX191MzIJCQlkYXRhbGVuOworCV9fdTMyCQkJX19yZXNlcnZlZDI7CisJLyogZGF0YSBmb2xsb3dzICovCit9OworCisvKiBQUkwgZmxhZ3MgKi8KKyNkZWZpbmUJUFJMX0RFRkFVTFQJCTB4MDAwMQorCitzdHJ1Y3QgaXBfdHVubmVsXzZyZCB7CisJc3RydWN0IGluNl9hZGRyCQlwcmVmaXg7CisJX19iZTMyCQkJcmVsYXlfcHJlZml4OworCV9fdTE2CQkJcHJlZml4bGVuOworCV9fdTE2CQkJcmVsYXlfcHJlZml4bGVuOworfTsKKworZW51bSB7CisJSUZMQV9HUkVfVU5TUEVDLAorCUlGTEFfR1JFX0xJTkssCisJSUZMQV9HUkVfSUZMQUdTLAorCUlGTEFfR1JFX09GTEFHUywKKwlJRkxBX0dSRV9JS0VZLAorCUlGTEFfR1JFX09LRVksCisJSUZMQV9HUkVfTE9DQUwsCisJSUZMQV9HUkVfUkVNT1RFLAorCUlGTEFfR1JFX1RUTCwKKwlJRkxBX0dSRV9UT1MsCisJSUZMQV9HUkVfUE1UVURJU0MsCisJX19JRkxBX0dSRV9NQVgsCit9OworCisjZGVmaW5lIElGTEFfR1JFX01BWAkoX19JRkxBX0dSRV9NQVggLSAxKQorCisjZW5kaWYgLyogX0lGX1RVTk5FTF9IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl92bGFuLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjliMzU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIFZMQU4JCUFuIGltcGxlbWVudGF0aW9uIG9mIDgwMi4xUSBWTEFOIHRhZ2dpbmcuCisgKgorICogQXV0aG9yczoJQmVuIEdyZWVhciA8Z3JlZWFyYkBjYW5kZWxhdGVjaC5jb20+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX1ZMQU5fSF8KKyNkZWZpbmUgX0xJTlVYX0lGX1ZMQU5fSF8KKworCisvKiBWTEFOIElPQ1RMcyBhcmUgZm91bmQgaW4gc29ja2lvcy5oICovCisKKy8qIFBhc3NlZCBpbiB2bGFuX2lvY3RsX2FyZ3Mgc3RydWN0dXJlIHRvIGRldGVybWluZSBiZWhhdmlvdXIuICovCitlbnVtIHZsYW5faW9jdGxfY21kcyB7CisJQUREX1ZMQU5fQ01ELAorCURFTF9WTEFOX0NNRCwKKwlTRVRfVkxBTl9JTkdSRVNTX1BSSU9SSVRZX0NNRCwKKwlTRVRfVkxBTl9FR1JFU1NfUFJJT1JJVFlfQ01ELAorCUdFVF9WTEFOX0lOR1JFU1NfUFJJT1JJVFlfQ01ELAorCUdFVF9WTEFOX0VHUkVTU19QUklPUklUWV9DTUQsCisJU0VUX1ZMQU5fTkFNRV9UWVBFX0NNRCwKKwlTRVRfVkxBTl9GTEFHX0NNRCwKKwlHRVRfVkxBTl9SRUFMREVWX05BTUVfQ01ELCAvKiBJZiB0aGlzIHdvcmtzLCB5b3Uga25vdyBpdCdzIGEgVkxBTiBkZXZpY2UsIGJ0dyAqLworCUdFVF9WTEFOX1ZJRF9DTUQgLyogR2V0IHRoZSBWSUQgb2YgdGhpcyBWTEFOIChzcGVjaWZpZWQgYnkgbmFtZSkgKi8KK307CisKK2VudW0gdmxhbl9mbGFncyB7CisJVkxBTl9GTEFHX1JFT1JERVJfSERSCT0gMHgxLAorCVZMQU5fRkxBR19HVlJQCQk9IDB4MiwKKwlWTEFOX0ZMQUdfTE9PU0VfQklORElORwk9IDB4NCwKK307CisKK2VudW0gdmxhbl9uYW1lX3R5cGVzIHsKKwlWTEFOX05BTUVfVFlQRV9QTFVTX1ZJRCwgLyogTmFtZSB3aWxsIGxvb2sgbGlrZTogIHZsYW4wMDA1ICovCisJVkxBTl9OQU1FX1RZUEVfUkFXX1BMVVNfVklELCAvKiBuYW1lIHdpbGwgbG9vayBsaWtlOiAgZXRoMS4wMDA1ICovCisJVkxBTl9OQU1FX1RZUEVfUExVU19WSURfTk9fUEFELCAvKiBOYW1lIHdpbGwgbG9vayBsaWtlOiAgdmxhbjUgKi8KKwlWTEFOX05BTUVfVFlQRV9SQVdfUExVU19WSURfTk9fUEFELCAvKiBOYW1lIHdpbGwgbG9vayBsaWtlOiAgZXRoMC41ICovCisJVkxBTl9OQU1FX1RZUEVfSElHSEVTVAorfTsKKworc3RydWN0IHZsYW5faW9jdGxfYXJncyB7CisJaW50IGNtZDsgLyogU2hvdWxkIGJlIG9uZSBvZiB0aGUgdmxhbl9pb2N0bF9jbWRzIGVudW0gYWJvdmUuICovCisJY2hhciBkZXZpY2UxWzI0XTsKKworICAgICAgICB1bmlvbiB7CisJCWNoYXIgZGV2aWNlMlsyNF07CisJCWludCBWSUQ7CisJCXVuc2lnbmVkIGludCBza2JfcHJpb3JpdHk7CisJCXVuc2lnbmVkIGludCBuYW1lX3R5cGU7CisJCXVuc2lnbmVkIGludCBiaW5kX3R5cGU7CisJCXVuc2lnbmVkIGludCBmbGFnOyAvKiBNYXRjaGVzIHZsYW5fZGV2X2luZm8gZmxhZ3MgKi8KKyAgICAgICAgfSB1OworCisJc2hvcnQgdmxhbl9xb3M7ICAgCit9OworCisjZW5kaWYgLyogIShfTElOVVhfSUZfVkxBTl9IXykgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfeDI1LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3gyNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Nzc2NWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3gyNS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiAgTGludXggWC4yNSBwYWNrZXQgdG8gZGV2aWNlIGludGVyZmFjZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfSUZfWDI1X0gKKyNkZWZpbmUgX0lGX1gyNV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcveDI1LWlmYWNlLnR4dCAqLworI2RlZmluZSBYMjVfSUZBQ0VfREFUQQkJMHgwMAorI2RlZmluZSBYMjVfSUZBQ0VfQ09OTkVDVAkweDAxCisjZGVmaW5lIFgyNV9JRkFDRV9ESVNDT05ORUNUCTB4MDIKKyNkZWZpbmUgWDI1X0lGQUNFX1BBUkFNUwkweDAzCisKKyNlbmRpZiAvKiBfSUZfWDI1X0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWdtcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZ21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyYmE4NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWdtcC5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICoJTGludXggTkVUMzoJSW50ZXJuZXQgR3JvdXAgTWFuYWdlbWVudCBQcm90b2NvbCAgW0lHTVBdCisgKgorICoJQXV0aG9yczoKKyAqCQlBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgorICoKKyAqCUV4dGVuZGVkIHRvIHRhbGsgdGhlIEJTRCBleHRlbmRlZCBJR01QIHByb3RvY29sIG9mIG1yb3V0ZWQgMy42CisgKgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfSUdNUF9ICisjZGVmaW5lIF9MSU5VWF9JR01QX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKgorICoJSUdNUCBwcm90b2NvbCBzdHJ1Y3R1cmVzCisgKi8KKworLyoKKyAqCUhlYWRlciBpbiBvbiBjYWJsZSBmb3JtYXQKKyAqLworCitzdHJ1Y3QgaWdtcGhkciB7CisJX191OCB0eXBlOworCV9fdTggY29kZTsJCS8qIEZvciBuZXdlciBJR01QICovCisJX19zdW0xNiBjc3VtOworCV9fYmUzMiBncm91cDsKK307CisKKy8qIFYzIGdyb3VwIHJlY29yZCB0eXBlcyBbZ3JlY190eXBlXSAqLworI2RlZmluZSBJR01QVjNfTU9ERV9JU19JTkNMVURFCQkxCisjZGVmaW5lIElHTVBWM19NT0RFX0lTX0VYQ0xVREUJCTIKKyNkZWZpbmUgSUdNUFYzX0NIQU5HRV9UT19JTkNMVURFCTMKKyNkZWZpbmUgSUdNUFYzX0NIQU5HRV9UT19FWENMVURFCTQKKyNkZWZpbmUgSUdNUFYzX0FMTE9XX05FV19TT1VSQ0VTCTUKKyNkZWZpbmUgSUdNUFYzX0JMT0NLX09MRF9TT1VSQ0VTCTYKKworc3RydWN0IGlnbXB2M19ncmVjIHsKKwlfX3U4CWdyZWNfdHlwZTsKKwlfX3U4CWdyZWNfYXV4d29yZHM7CisJX19iZTE2CWdyZWNfbnNyY3M7CisJX19iZTMyCWdyZWNfbWNhOworCV9fYmUzMglncmVjX3NyY1swXTsKK307CisKK3N0cnVjdCBpZ21wdjNfcmVwb3J0IHsKKwlfX3U4IHR5cGU7CisJX191OCByZXN2MTsKKwlfX2JlMTYgY3N1bTsKKwlfX2JlMTYgcmVzdjI7CisJX19iZTE2IG5ncmVjOworCXN0cnVjdCBpZ21wdjNfZ3JlYyBncmVjWzBdOworfTsKKworc3RydWN0IGlnbXB2M19xdWVyeSB7CisJX191OCB0eXBlOworCV9fdTggY29kZTsKKwlfX2JlMTYgY3N1bTsKKwlfX2JlMzIgZ3JvdXA7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCBxcnY6MywKKwkgICAgIHN1cHByZXNzOjEsCisJICAgICByZXN2OjQ7CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHJlc3Y6NCwKKwkgICAgIHN1cHByZXNzOjEsCisJICAgICBxcnY6MzsKKyNlbHNlCisjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKwlfX3U4IHFxaWM7CisJX19iZTE2IG5zcmNzOworCV9fYmUzMiBzcmNzWzBdOworfTsKKworI2RlZmluZSBJR01QX0hPU1RfTUVNQkVSU0hJUF9RVUVSWQkweDExCS8qIEZyb20gUkZDMTExMiAqLworI2RlZmluZSBJR01QX0hPU1RfTUVNQkVSU0hJUF9SRVBPUlQJMHgxMgkvKiBEaXR0byAqLworI2RlZmluZSBJR01QX0RWTVJQCQkJMHgxMwkvKiBEVk1SUCByb3V0aW5nICovCisjZGVmaW5lIElHTVBfUElNCQkJMHgxNAkvKiBQSU0gcm91dGluZyAqLworI2RlZmluZSBJR01QX1RSQUNFCQkJMHgxNQorI2RlZmluZSBJR01QVjJfSE9TVF9NRU1CRVJTSElQX1JFUE9SVAkweDE2CS8qIFYyIHZlcnNpb24gb2YgMHgxMiAqLworI2RlZmluZSBJR01QX0hPU1RfTEVBVkVfTUVTU0FHRSAJMHgxNworI2RlZmluZSBJR01QVjNfSE9TVF9NRU1CRVJTSElQX1JFUE9SVAkweDIyCS8qIFYzIHZlcnNpb24gb2YgMHgxMiAqLworCisjZGVmaW5lIElHTVBfTVRSQUNFX1JFU1AJCTB4MWUKKyNkZWZpbmUgSUdNUF9NVFJBQ0UJCQkweDFmCisKKworLyoKKyAqCVVzZSB0aGUgQlNEIG5hbWVzIGZvciB0aGVzZSBmb3IgY29tcGF0aWJpbGl0eQorICovCisKKyNkZWZpbmUgSUdNUF9ERUxBWUlOR19NRU1CRVIJCTB4MDEKKyNkZWZpbmUgSUdNUF9JRExFX01FTUJFUgkJMHgwMgorI2RlZmluZSBJR01QX0xBWllfTUVNQkVSCQkweDAzCisjZGVmaW5lIElHTVBfU0xFRVBJTkdfTUVNQkVSCQkweDA0CisjZGVmaW5lIElHTVBfQVdBS0VOSU5HX01FTUJFUgkJMHgwNQorCisjZGVmaW5lIElHTVBfTUlOTEVOCQkJOAorCisjZGVmaW5lIElHTVBfTUFYX0hPU1RfUkVQT1JUX0RFTEFZCTEwCS8qIG1heCBkZWxheSBmb3IgcmVzcG9uc2UgdG8gKi8KKwkJCQkJCS8qIHF1ZXJ5IChpbiBzZWNvbmRzKQkqLworCisjZGVmaW5lIElHTVBfVElNRVJfU0NBTEUJCTEwCS8qIGRlbm90ZXMgdGhhdCB0aGUgaWdtcGhkci0+dGltZXIgZmllbGQgKi8KKwkJCQkJCS8qIHNwZWNpZmllcyB0aW1lIGluIDEwdGggb2Ygc2Vjb25kcwkgKi8KKworI2RlZmluZSBJR01QX0FHRV9USFJFU0hPTEQJCTQwMAkvKiBJZiB0aGlzIGhvc3QgZG9uJ3QgaGVhciBhbnkgSUdNUCBWMQkqLworCQkJCQkJLyogbWVzc2FnZSBpbiB0aGlzIHBlcmlvZCBvZiB0aW1lLAkqLworCQkJCQkJLyogcmV2ZXJ0IHRvIElHTVAgdjIgcm91dGVyLgkJKi8KKworI2RlZmluZSBJR01QX0FMTF9IT1NUUwkJaHRvbmwoMHhFMDAwMDAwMUwpCisjZGVmaW5lIElHTVBfQUxMX1JPVVRFUiAJaHRvbmwoMHhFMDAwMDAwMkwpCisjZGVmaW5lIElHTVBWM19BTExfTUNSCSAJaHRvbmwoMHhFMDAwMDAxNkwpCisjZGVmaW5lIElHTVBfTE9DQUxfR1JPVVAJaHRvbmwoMHhFMDAwMDAwMEwpCisjZGVmaW5lIElHTVBfTE9DQUxfR1JPVVBfTUFTSwlodG9ubCgweEZGRkZGRjAwTCkKKworLyoKKyAqIHN0cnVjdCBmb3Iga2VlcGluZyB0aGUgbXVsdGljYXN0IGxpc3QgaW4KKyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWFlZmQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbi5oCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCURlZmluaXRpb25zIG9mIHRoZSBJbnRlcm5ldCBQcm90b2NvbC4KKyAqCisgKiBWZXJzaW9uOglAKCMpaW4uaAkxLjAuMQkwNC8yMS85MworICoKKyAqIEF1dGhvcnM6CU9yaWdpbmFsIHRha2VuIGZyb20gdGhlIEdOVSBQcm9qZWN0IDxuZXRpbmV0L2luLmg+IGZpbGUuCisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX0lOX0gKKyNkZWZpbmUgX0xJTlVYX0lOX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisKKy8qIFN0YW5kYXJkIHdlbGwtZGVmaW5lZCBJUCBwcm90b2NvbHMuICAqLworZW51bSB7CisgIElQUFJPVE9fSVAgPSAwLAkJLyogRHVtbXkgcHJvdG9jb2wgZm9yIFRDUAkJKi8KKyAgSVBQUk9UT19JQ01QID0gMSwJCS8qIEludGVybmV0IENvbnRyb2wgTWVzc2FnZSBQcm90b2NvbAkqLworICBJUFBST1RPX0lHTVAgPSAyLAkJLyogSW50ZXJuZXQgR3JvdXAgTWFuYWdlbWVudCBQcm90b2NvbAkqLworICBJUFBST1RPX0lQSVAgPSA0LAkJLyogSVBJUCB0dW5uZWxzIChvbGRlciBLQTlRIHR1bm5lbHMgdXNlIDk0KSAqLworICBJUFBST1RPX1RDUCA9IDYsCQkvKiBUcmFuc21pc3Npb24gQ29udHJvbCBQcm90b2NvbAkqLworICBJUFBST1RPX0VHUCA9IDgsCQkvKiBFeHRlcmlvciBHYXRld2F5IFByb3RvY29sCQkqLworICBJUFBST1RPX1BVUCA9IDEyLAkJLyogUFVQIHByb3RvY29sCQkJCSovCisgIElQUFJPVE9fVURQID0gMTcsCQkvKiBVc2VyIERhdGFncmFtIFByb3RvY29sCQkqLworICBJUFBST1RPX0lEUCA9IDIyLAkJLyogWE5TIElEUCBwcm90b2NvbAkJCSovCisgIElQUFJPVE9fRENDUCA9IDMzLAkJLyogRGF0YWdyYW0gQ29uZ2VzdGlvbiBDb250cm9sIFByb3RvY29sICovCisgIElQUFJPVE9fUlNWUCA9IDQ2LAkJLyogUlNWUCBwcm90b2NvbAkJCSovCisgIElQUFJPVE9fR1JFID0gNDcsCQkvKiBDaXNjbyBHUkUgdHVubmVscyAocmZjIDE3MDEsMTcwMikJKi8KKworICBJUFBST1RPX0lQVjYJID0gNDEsCQkvKiBJUHY2LWluLUlQdjQgdHVubmVsbGluZwkJKi8KKworICBJUFBST1RPX0VTUCA9IDUwLCAgICAgICAgICAgIC8qIEVuY2Fwc3VsYXRpb24gU2VjdXJpdHkgUGF5bG9hZCBwcm90b2NvbCAqLworICBJUFBST1RPX0FIID0gNTEsICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIEhlYWRlciBwcm90b2NvbCAgICAgICAqLworICBJUFBST1RPX0JFRVRQSCA9IDk0LAkgICAgICAgLyogSVAgb3B0aW9uIHBzZXVkbyBoZWFkZXIgZm9yIEJFRVQgKi8KKyAgSVBQUk9UT19QSU0gICAgPSAxMDMsCQkvKiBQcm90b2NvbCBJbmRlcGVuZGVudCBNdWx0aWNhc3QJKi8KKworICBJUFBST1RPX0NPTVAgICA9IDEwOCwgICAgICAgICAgICAgICAgLyogQ29tcHJlc3Npb24gSGVhZGVyIHByb3RvY29sICovCisgIElQUFJPVE9fU0NUUCAgID0gMTMyLAkJLyogU3RyZWFtIENvbnRyb2wgVHJhbnNwb3J0IFByb3RvY29sCSovCisgIElQUFJPVE9fVURQTElURSA9IDEzNiwJLyogVURQLUxpdGUgKFJGQyAzODI4KQkJCSovCisKKyAgSVBQUk9UT19SQVcJID0gMjU1LAkJLyogUmF3IElQIHBhY2tldHMJCQkqLworICBJUFBST1RPX01BWAorfTsKKworCisvKiBJbnRlcm5ldCBhZGRyZXNzLiAqLworc3RydWN0IGluX2FkZHIgeworCV9fYmUzMglzX2FkZHI7Cit9OworCisjZGVmaW5lIElQX1RPUwkJMQorI2RlZmluZSBJUF9UVEwJCTIKKyNkZWZpbmUgSVBfSERSSU5DTAkzCisjZGVmaW5lIElQX09QVElPTlMJNAorI2RlZmluZSBJUF9ST1VURVJfQUxFUlQJNQorI2RlZmluZSBJUF9SRUNWT1BUUwk2CisjZGVmaW5lIElQX1JFVE9QVFMJNworI2RlZmluZSBJUF9QS1RJTkZPCTgKKyNkZWZpbmUgSVBfUEtUT1BUSU9OUwk5CisjZGVmaW5lIElQX01UVV9ESVNDT1ZFUgkxMAorI2RlZmluZSBJUF9SRUNWRVJSCTExCisjZGVmaW5lIElQX1JFQ1ZUVEwJMTIKKyNkZWZpbmUJSVBfUkVDVlRPUwkxMworI2RlZmluZSBJUF9NVFUJCTE0CisjZGVmaW5lIElQX0ZSRUVCSU5ECTE1CisjZGVmaW5lIElQX0lQU0VDX1BPTElDWQkxNgorI2RlZmluZSBJUF9YRlJNX1BPTElDWQkxNworI2RlZmluZSBJUF9QQVNTU0VDCTE4CisjZGVmaW5lIElQX1RSQU5TUEFSRU5UCTE5CisKKy8qIEJTRCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIElQX1JFQ1ZSRVRPUFRTCUlQX1JFVE9QVFMKKworLyogVFByb3h5IG9yaWdpbmFsIGFkZHJlc3NlcyAqLworI2RlZmluZSBJUF9PUklHRFNUQUREUiAgICAgICAyMAorI2RlZmluZSBJUF9SRUNWT1JJR0RTVEFERFIgICBJUF9PUklHRFNUQUREUgorCisjZGVmaW5lIElQX01JTlRUTCAgICAgICAyMQorI2RlZmluZSBJUF9OT0RFRlJBRyAgICAgMjIKKworLyogSVBfTVRVX0RJU0NPVkVSIHZhbHVlcyAqLworI2RlZmluZSBJUF9QTVRVRElTQ19ET05UCQkwCS8qIE5ldmVyIHNlbmQgREYgZnJhbWVzICovCisjZGVmaW5lIElQX1BNVFVESVNDX1dBTlQJCTEJLyogVXNlIHBlciByb3V0ZSBoaW50cwkqLworI2RlZmluZSBJUF9QTVRVRElTQ19ETwkJCTIJLyogQWx3YXlzIERGCQkqLworI2RlZmluZSBJUF9QTVRVRElTQ19QUk9CRQkJMyAgICAgICAvKiBJZ25vcmUgZHN0IHBtdHUgICAgICAqLworCisjZGVmaW5lIElQX01VTFRJQ0FTVF9JRgkJCTMyCisjZGVmaW5lIElQX01VTFRJQ0FTVF9UVEwgCQkzMworI2RlZmluZSBJUF9NVUxUSUNBU1RfTE9PUCAJCTM0CisjZGVmaW5lIElQX0FERF9NRU1CRVJTSElQCQkzNQorI2RlZmluZSBJUF9EUk9QX01FTUJFUlNISVAJCTM2CisjZGVmaW5lIElQX1VOQkxPQ0tfU09VUkNFCQkzNworI2RlZmluZSBJUF9CTE9DS19TT1VSQ0UJCQkzOAorI2RlZmluZSBJUF9BRERfU09VUkNFX01FTUJFUlNISVAJMzkKKyNkZWZpbmUgSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUAk0MAorI2RlZmluZSBJUF9NU0ZJTFRFUgkJCTQxCisjZGVmaW5lIE1DQVNUX0pPSU5fR1JPVVAJCTQyCisjZGVmaW5lIE1DQVNUX0JMT0NLX1NPVVJDRQkJNDMKKyNkZWZpbmUgTUNBU1RfVU5CTE9DS19TT1VSQ0UJCTQ0CisjZGVmaW5lIE1DQVNUX0xFQVZFX0dST1VQCQk0NQorI2RlZmluZSBNQ0FTVF9KT0lOX1NPVVJDRV9HUk9VUAkJNDYKKyNkZWZpbmUgTUNBU1RfTEVBVkVfU09VUkNFX0dST1VQCTQ3CisjZGVmaW5lIE1DQVNUX01TRklMVEVSCQkJNDgKKyNkZWZpbmUgSVBfTVVMVElDQVNUX0FMTAkJNDkKKworI2RlZmluZSBNQ0FTVF9FWENMVURFCTAKKyNkZWZpbmUgTUNBU1RfSU5DTFVERQkxCisKKy8qIFRoZXNlIG5lZWQgdG8gYXBwZWFyIHNvbWV3aGVyZSBhcm91bmQgaGVyZSAqLworI2RlZmluZSBJUF9ERUZBVUxUX01VTFRJQ0FTVF9UVEwgICAgICAgIDEKKyNkZWZpbmUgSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCAgICAgICAxCisKKy8qIFJlcXVlc3Qgc3RydWN0IGZvciBtdWx0aWNhc3Qgc29ja2V0IG9wcyAqLworCitzdHJ1Y3QgaXBfbXJlcSAgeworCXN0cnVjdCBpbl9hZGRyIGltcl9tdWx0aWFkZHI7CS8qIElQIG11bHRpY2FzdCBhZGRyZXNzIG9mIGdyb3VwICovCisJc3RydWN0IGluX2FkZHIgaW1yX2ludGVyZmFjZTsJLyogbG9jYWwgSVAgYWRkcmVzcyBvZiBpbnRlcmZhY2UgKi8KK307CisKK3N0cnVjdCBpcF9tcmVxbiB7CisJc3RydWN0IGluX2FkZHIJaW1yX211bHRpYWRkcjsJCS8qIElQIG11bHRpY2FzdCBhZGRyZXNzIG9mIGdyb3VwICovCisJc3RydWN0IGluX2FkZHIJaW1yX2FkZHJlc3M7CQkvKiBsb2NhbCBJUCBhZGRyZXNzIG9mIGludGVyZmFjZSAqLworCWludAkJaW1yX2lmaW5kZXg7CQkvKiBJbnRlcmZhY2UgaW5kZXggKi8KK307CisKK3N0cnVjdCBpcF9tcmVxX3NvdXJjZSB7CisJX19iZTMyCQlpbXJfbXVsdGlhZGRyOworCV9fYmUzMgkJaW1yX2ludGVyZmFjZTsKKwlfX2JlMzIJCWltcl9zb3VyY2VhZGRyOworfTsKKworc3RydWN0IGlwX21zZmlsdGVyIHsKKwlfX2JlMzIJCWltc2ZfbXVsdGlhZGRyOworCV9fYmUzMgkJaW1zZl9pbnRlcmZhY2U7CisJX191MzIJCWltc2ZfZm1vZGU7CisJX191MzIJCWltc2ZfbnVtc3JjOworCV9fYmUzMgkJaW1zZl9zbGlzdFsxXTsKK307CisKKyNkZWZpbmUgSVBfTVNGSUxURVJfU0laRShudW1zcmMpIFwKKwkoc2l6ZW9mKHN0cnVjdCBpcF9tc2ZpbHRlcikgLSBzaXplb2YoX191MzIpIFwKKwkrIChudW1zcmMpICogc2l6ZW9mKF9fdTMyKSkKKworc3RydWN0IGdyb3VwX3JlcSB7CisJX191MzIJCQkJIGdyX2ludGVyZmFjZTsJLyogaW50ZXJmYWNlIGluZGV4ICovCisJc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UgZ3JfZ3JvdXA7CS8qIGdyb3VwIGFkZHJlc3MgKi8KK307CisKK3N0cnVjdCBncm91cF9zb3VyY2VfcmVxIHsKKwlfX3UzMgkJCQkgZ3NyX2ludGVyZmFjZTsJLyogaW50ZXJmYWNlIGluZGV4ICovCisJc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UgZ3NyX2dyb3VwOwkvKiBncm91cCBhZGRyZXNzICovCisJc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UgZ3NyX3NvdXJjZTsJLyogc291cmNlIGFkZHJlc3MgKi8KK307CisKK3N0cnVjdCBncm91cF9maWx0ZXIgeworCV9fdTMyCQkJCSBnZl9pbnRlcmZhY2U7CS8qIGludGVyZmFjZSBpbmRleCAqLworCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIGdmX2dyb3VwOwkvKiBtdWx0aWNhc3QgYWRkcmVzcyAqLworCV9fdTMyCQkJCSBnZl9mbW9kZTsJLyogZmlsdGVyIG1vZGUgKi8KKwlfX3UzMgkJCQkgZ2ZfbnVtc3JjOwkvKiBudW1iZXIgb2Ygc291cmNlcyAqLworCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIGdmX3NsaXN0WzFdOwkvKiBpbnRlcmZhY2UgaW5kZXggKi8KK307CisKKyNkZWZpbmUgR1JPVVBfRklMVEVSX1NJWkUobnVtc3JjKSBcCisJKHNpemVvZihzdHJ1Y3QgZ3JvdXBfZmlsdGVyKSAtIHNpemVvZihzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSkgXAorCSsgKG51bXNyYykgKiBzaXplb2Yoc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UpKQorCitzdHJ1Y3QgaW5fcGt0aW5mbyB7CisJaW50CQlpcGlfaWZpbmRleDsKKwlzdHJ1Y3QgaW5fYWRkcglpcGlfc3BlY19kc3Q7CisJc3RydWN0IGluX2FkZHIJaXBpX2FkZHI7Cit9OworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBJbnRlcm5ldCAoSVApIHNvY2tldCBhZGRyZXNzLiAqLworI2RlZmluZSBfX1NPQ0tfU0laRV9fCTE2CQkvKiBzaXplb2Yoc3RydWN0IHNvY2thZGRyKQkqLworc3RydWN0IHNvY2thZGRyX2luIHsKKyAgX19rZXJuZWxfc2FfZmFtaWx5X3QJc2luX2ZhbWlseTsJLyogQWRkcmVzcyBmYW1pbHkJCSovCisgIF9fYmUxNgkJc2luX3BvcnQ7CS8qIFBvcnQgbnVtYmVyCQkJKi8KKyAgc3RydWN0IGluX2FkZHIJc2luX2FkZHI7CS8qIEludGVybmV0IGFkZHJlc3MJCSovCisKKyAgLyogUGFkIHRvIHNpemUgb2YgYHN0cnVjdCBzb2NrYWRkcicuICovCisgIHVuc2lnbmVkIGNoYXIJCV9fcGFkW19fU09DS19TSVpFX18gLSBzaXplb2Yoc2hvcnQgaW50KSAtCisJCQlzaXplb2YodW5zaWduZWQgc2hvcnQgaW50KSAtIHNpemVvZihzdHJ1Y3QgaW5fYWRkcildOworfTsKKyNkZWZpbmUgc2luX3plcm8JX19wYWQJCS8qIGZvciBCU0QgVU5JWCBjb21wLiAtRnZLCSovCisKKworLyoKKyAqIERlZmluaXRpb25zIG9mIHRoZSBiaXRzIGluIGFuIEludGVybmV0IGFkZHJlc3MgaW50ZWdlci4KKyAqIE9uIHN1Ym5ldHMsIGhvc3QgYW5kIG5ldHdvcmsgcGFydHMgYXJlIGZvdW5kIGFjY29yZGluZworICogdG8gdGhlIHN1Ym5ldCBtYXNrLCBub3QgdGhlc2UgbWFza3MuCisgKi8KKyNkZWZpbmUJSU5fQ0xBU1NBKGEpCQkoKCgobG9uZyBpbnQpIChhKSkgJiAweDgwMDAwMDAwKSA9PSAwKQorI2RlZmluZQlJTl9DTEFTU0FfTkVUCQkweGZmMDAwMDAwCisjZGVmaW5lCUlOX0NMQVNTQV9OU0hJRlQJMjQKKyNkZWZpbmUJSU5fQ0xBU1NBX0hPU1QJCSgweGZmZmZmZmZmICYgfklOX0NMQVNTQV9ORVQpCisjZGVmaW5lCUlOX0NMQVNTQV9NQVgJCTEyOAorCisjZGVmaW5lCUlOX0NMQVNTQihhKQkJKCgoKGxvbmcgaW50KSAoYSkpICYgMHhjMDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkKKyNkZWZpbmUJSU5fQ0xBU1NCX05FVAkJMHhmZmZmMDAwMAorI2RlZmluZQlJTl9DTEFTU0JfTlNISUZUCTE2CisjZGVmaW5lCUlOX0NMQVNTQl9IT1NUCQkoMHhmZmZmZmZmZiAmIH5JTl9DTEFTU0JfTkVUKQorI2RlZmluZQlJTl9DTEFTU0JfTUFYCQk2NTUzNgorCisjZGVmaW5lCUlOX0NMQVNTQyhhKQkJKCgoKGxvbmcgaW50KSAoYSkpICYgMHhlMDAwMDAwMCkgPT0gMHhjMDAwMDAwMCkKKyNkZWZpbmUJSU5fQ0xBU1NDX05FVAkJMHhmZmZmZmYwMAorI2RlZmluZQlJTl9DTEFTU0NfTlNISUZUCTgKKyNkZWZpbmUJSU5fQ0xBU1NDX0hPU1QJCSgweGZmZmZmZmZmICYgfklOX0NMQVNTQ19ORVQpCisKKyNkZWZpbmUJSU5fQ0xBU1NEKGEpCQkoKCgobG9uZyBpbnQpIChhKSkgJiAweGYwMDAwMDAwKSA9PSAweGUwMDAwMDAwKQorI2RlZmluZQlJTl9NVUxUSUNBU1QoYSkJCUlOX0NMQVNTRChhKQorI2RlZmluZSBJTl9NVUxUSUNBU1RfTkVUCTB4RjAwMDAwMDAKKworI2RlZmluZQlJTl9FWFBFUklNRU5UQUwoYSkJKCgoKGxvbmcgaW50KSAoYSkpICYgMHhmMDAwMDAwMCkgPT0gMHhmMDAwMDAwMCkKKyNkZWZpbmUJSU5fQkFEQ0xBU1MoYSkJCUlOX0VYUEVSSU1FTlRBTCgoYSkpCisKKy8qIEFkZHJlc3MgdG8gYWNjZXB0IGFueSBpbmNvbWluZyBtZXNzYWdlcy4gKi8KKyNkZWZpbmUJSU5BRERSX0FOWQkJKCh1bnNpZ25lZCBsb25nIGludCkgMHgwMDAwMDAwMCkKKworLyogQWRkcmVzcyB0byBzZW5kIHRvIGFsbCBob3N0cy4gKi8KKyNkZWZpbmUJSU5BRERSX0JST0FEQ0FTVAkoKHVuc2lnbmVkIGxvbmcgaW50KSAweGZmZmZmZmZmKQorCisvKiBBZGRyZXNzIGluZGljYXRpbmcgYW4gZXJyb3IgcmV0dXJuLiAqLworI2RlZmluZQlJTkFERFJfTk9ORQkJKCh1bnNpZ25lZCBsb25nIGludCkgMHhmZmZmZmZmZikKKworLyogTmV0d29yayBudW1iZXIgZm9yIGxvY2FsIGhvc3QgbG9vcGJhY2suICovCisjZGVmaW5lCUlOX0xPT1BCQUNLTkVUCQkxMjcKKworLyogQWRkcmVzcyB0byBsb29wYmFjayBpbiBzb2Z0d2FyZSB0byBsb2NhbCBob3N0LiAgKi8KKyNkZWZpbmUJSU5BRERSX0xPT1BCQUNLCQkweDdmMDAwMDAxCS8qIDEyNy4wLjAuMSAgICovCisjZGVmaW5lCUlOX0xPT1BCQUNLKGEpCQkoKCgobG9uZyBpbnQpIChhKSkgJiAweGZmMDAwMDAwKSA9PSAweDdmMDAwMDAwKQorCisvKiBEZWZpbmVzIGZvciBNdWx0aWNhc3QgSU5BRERSICovCisjZGVmaW5lIElOQUREUl9VTlNQRUNfR1JPVVAgICAJMHhlMDAwMDAwMFUJLyogMjI0LjAuMC4wICAgKi8KKyNkZWZpbmUgSU5BRERSX0FMTEhPU1RTX0dST1VQIAkweGUwMDAwMDAxVQkvKiAyMjQuMC4wLjEgICAqLworI2RlZmluZSBJTkFERFJfQUxMUlRSU19HUk9VUCAgICAweGUwMDAwMDAyVQkvKiAyMjQuMC4wLjIgKi8KKyNkZWZpbmUgSU5BRERSX01BWF9MT0NBTF9HUk9VUCAgMHhlMDAwMDBmZlUJLyogMjI0LjAuMC4yNTUgKi8KKworCisvKiA8YXNtL2J5dGVvcmRlci5oPiBjb250YWlucyB0aGUgaHRvbmwgdHlwZSBzdHVmZi4uICovCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPiAKKworCisjZW5kaWYJLyogX0xJTlVYX0lOX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaW42LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YjIyMmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luNi5oCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICoJVHlwZXMgYW5kIGRlZmluaXRpb25zIGZvciBBRl9JTkVUNiAKKyAqCUxpbnV4IElORVQ2IGltcGxlbWVudGF0aW9uIAorICoKKyAqCUF1dGhvcnM6CisgKglQZWRybyBSb3F1ZQkJPHJvcXVlQGRpLmZjLnVsLnB0PgkKKyAqCisgKglTb3VyY2VzOgorICoJSVB2NiBQcm9ncmFtIEludGVyZmFjZXMgZm9yIEJTRCBTeXN0ZW1zCisgKiAgICAgIDxkcmFmdC1pZXRmLWlwbmd3Zy1ic2QtYXBpLTA1LnR4dD4KKyAqCisgKglBZHZhbmNlZCBTb2NrZXRzIEFQSSBmb3IgSVB2NgorICoJPGRyYWZ0LXN0ZXZlbnMtYWR2YW5jZWQtYXBpLTAwLnR4dD4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lONl9ICisjZGVmaW5lIF9MSU5VWF9JTjZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqCUlQdjYgYWRkcmVzcyBzdHJ1Y3R1cmUKKyAqLworCitzdHJ1Y3QgaW42X2FkZHIgeworCXVuaW9uIHsKKwkJX191OAkJdTZfYWRkcjhbMTZdOworCQlfX2JlMTYJCXU2X2FkZHIxNls4XTsKKwkJX19iZTMyCQl1Nl9hZGRyMzJbNF07CisJfSBpbjZfdTsKKyNkZWZpbmUgczZfYWRkcgkJCWluNl91LnU2X2FkZHI4CisjZGVmaW5lIHM2X2FkZHIxNgkJaW42X3UudTZfYWRkcjE2CisjZGVmaW5lIHM2X2FkZHIzMgkJaW42X3UudTZfYWRkcjMyCit9OworCisvKiBJUHY2IFdpbGRjYXJkIEFkZHJlc3MgKDo6KSBhbmQgTG9vcGJhY2sgQWRkcmVzcyAoOjoxKSBkZWZpbmVkIGluIFJGQzI1NTMKKyAqIE5PVEU6IEJlIGF3YXJlIHRoZSBJTjZBRERSXyogY29uc3RhbnRzIGFuZCBpbjZhZGRyXyogZXh0ZXJuYWxzIGFyZSBkZWZpbmVkCisgKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIsIG5vdCBpbiBob3N0IGJ5dGUgb3JkZXIgYXMgYXJlIHRoZSBJUHY0IGVxdWl2YWxlbnRzCisgKi8KKworc3RydWN0IHNvY2thZGRyX2luNiB7CisJdW5zaWduZWQgc2hvcnQgaW50CXNpbjZfZmFtaWx5OyAgICAvKiBBRl9JTkVUNiAqLworCV9fYmUxNgkJCXNpbjZfcG9ydDsgICAgICAvKiBUcmFuc3BvcnQgbGF5ZXIgcG9ydCAjICovCisJX19iZTMyCQkJc2luNl9mbG93aW5mbzsgIC8qIElQdjYgZmxvdyBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBpbjZfYWRkcgkJc2luNl9hZGRyOyAgICAgIC8qIElQdjYgYWRkcmVzcyAqLworCV9fdTMyCQkJc2luNl9zY29wZV9pZDsgIC8qIHNjb3BlIGlkIChuZXcgaW4gUkZDMjU1MykgKi8KK307CisKK3N0cnVjdCBpcHY2X21yZXEgeworCS8qIElQdjYgbXVsdGljYXN0IGFkZHJlc3Mgb2YgZ3JvdXAgKi8KKwlzdHJ1Y3QgaW42X2FkZHIgaXB2Nm1yX211bHRpYWRkcjsKKworCS8qIGxvY2FsIElQdjYgYWRkcmVzcyBvZiBpbnRlcmZhY2UgKi8KKwlpbnQJCWlwdjZtcl9pZmluZGV4OworfTsKKworI2RlZmluZSBpcHY2bXJfYWNhZGRyCWlwdjZtcl9tdWx0aWFkZHIKKworc3RydWN0IGluNl9mbG93bGFiZWxfcmVxIHsKKwlzdHJ1Y3QgaW42X2FkZHIJZmxyX2RzdDsKKwlfX2JlMzIJZmxyX2xhYmVsOworCV9fdTgJZmxyX2FjdGlvbjsKKwlfX3U4CWZscl9zaGFyZTsKKwlfX3UxNglmbHJfZmxhZ3M7CisJX191MTYgCWZscl9leHBpcmVzOworCV9fdTE2CWZscl9saW5nZXI7CisJX191MzIJX19mbHJfcGFkOworCS8qIE9wdGlvbnMgaW4gZm9ybWF0IG9mIElQVjZfUEtUT1BUSU9OUyAqLworfTsKKworI2RlZmluZSBJUFY2X0ZMX0FfR0VUCTAKKyNkZWZpbmUgSVBWNl9GTF9BX1BVVAkxCisjZGVmaW5lIElQVjZfRkxfQV9SRU5FVwkyCisKKyNkZWZpbmUgSVBWNl9GTF9GX0NSRUFURQkxCisjZGVmaW5lIElQVjZfRkxfRl9FWENMCQkyCisKKyNkZWZpbmUgSVBWNl9GTF9TX05PTkUJCTAKKyNkZWZpbmUgSVBWNl9GTF9TX0VYQ0wJCTEKKyNkZWZpbmUgSVBWNl9GTF9TX1BST0NFU1MJMgorI2RlZmluZSBJUFY2X0ZMX1NfVVNFUgkJMworI2RlZmluZSBJUFY2X0ZMX1NfQU5ZCQkyNTUKKworCisvKgorICoJQml0bWFzayBjb25zdGFudCBkZWNsYXJhdGlvbnMgdG8gaGVscCBhcHBsaWNhdGlvbnMgc2VsZWN0IG91dCB0aGUgCisgKglmbG93IGxhYmVsIGFuZCBwcmlvcml0eSBmaWVsZHMuCisgKgorICoJTm90ZSB0aGF0IHRoaXMgYXJlIGluIGhvc3QgYnl0ZSBvcmRlciB3aGlsZSB0aGUgZmxvd2luZm8gZmllbGQgb2YKKyAqCXNvY2thZGRyX2luNiBpcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKi8KKworI2RlZmluZSBJUFY2X0ZMT1dJTkZPX0ZMT1dMQUJFTAkJMHgwMDBmZmZmZgorI2RlZmluZSBJUFY2X0ZMT1dJTkZPX1BSSU9SSVRZCQkweDBmZjAwMDAwCisKKy8qIFRoZXNlIGRlZmluaXRpb25zIGFyZSBvYnNvbGV0ZSAqLworI2RlZmluZSBJUFY2X1BSSU9SSVRZX1VOQ0hBUkFDVEVSSVpFRAkweDAwMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV9GSUxMRVIJCTB4MDEwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZX1VOQVRURU5ERUQJMHgwMjAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfUkVTRVJWRUQxCQkweDAzMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV9CVUxLCQkweDA0MDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV9SRVNFUlZFRDIJCTB4MDUwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZX0lOVEVSQUNUSVZFCTB4MDYwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZX0NPTlRST0wJCTB4MDcwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZXzgJCQkweDA4MDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV85CQkJMHgwOTAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfMTAJCTB4MGEwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZXzExCQkweDBiMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV8xMgkJMHgwYzAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfMTMJCTB4MGQwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZXzE0CQkweDBlMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV8xNQkJMHgwZjAwCisKKy8qCisgKglJUFY2IGV4dGVuc2lvbiBoZWFkZXJzCisgKi8KKyNkZWZpbmUgSVBQUk9UT19IT1BPUFRTCQkwCS8qIElQdjYgaG9wLWJ5LWhvcCBvcHRpb25zCSovCisjZGVmaW5lIElQUFJPVE9fUk9VVElORwkJNDMJLyogSVB2NiByb3V0aW5nIGhlYWRlcgkJKi8KKyNkZWZpbmUgSVBQUk9UT19GUkFHTUVOVAk0NAkvKiBJUHY2IGZyYWdtZW50YXRpb24gaGVhZGVyCSovCisjZGVmaW5lIElQUFJPVE9fSUNNUFY2CQk1OAkvKiBJQ01QdjYJCQkqLworI2RlZmluZSBJUFBST1RPX05PTkUJCTU5CS8qIElQdjYgbm8gbmV4dCBoZWFkZXIJCSovCisjZGVmaW5lIElQUFJPVE9fRFNUT1BUUwkJNjAJLyogSVB2NiBkZXN0aW5hdGlvbiBvcHRpb25zCSovCisjZGVmaW5lIElQUFJPVE9fTUgJCTEzNQkvKiBJUHY2IG1vYmlsaXR5IGhlYWRlcgkJKi8KKworLyoKKyAqCUlQdjYgVExWIG9wdGlvbnMuCisgKi8KKyNkZWZpbmUgSVBWNl9UTFZfUEFEMAkJMAorI2RlZmluZSBJUFY2X1RMVl9QQUROCQkxCisjZGVmaW5lIElQVjZfVExWX1JPVVRFUkFMRVJUCTUKKyNkZWZpbmUgSVBWNl9UTFZfSlVNQk8JCTE5NAorI2RlZmluZSBJUFY2X1RMVl9IQU8JCTIwMQkvKiBob21lIGFkZHJlc3Mgb3B0aW9uICovCisKKy8qCisgKglJUFY2IHNvY2tldCBvcHRpb25zCisgKi8KKworI2RlZmluZSBJUFY2X0FERFJGT1JNCQkxCisjZGVmaW5lIElQVjZfMjI5MlBLVElORk8JMgorI2RlZmluZSBJUFY2XzIyOTJIT1BPUFRTCTMKKyNkZWZpbmUgSVBWNl8yMjkyRFNUT1BUUwk0CisjZGVmaW5lIElQVjZfMjI5MlJUSERSCQk1CisjZGVmaW5lIElQVjZfMjI5MlBLVE9QVElPTlMJNgorI2RlZmluZSBJUFY2X0NIRUNLU1VNCQk3CisjZGVmaW5lIElQVjZfMjI5MkhPUExJTUlUCTgKKyNkZWZpbmUgSVBWNl9ORVhUSE9QCQk5CisjZGVmaW5lIElQVjZfQVVUSEhEUgkJMTAJLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgSVBWNl9GTE9XSU5GTwkJMTEKKworI2RlZmluZSBJUFY2X1VOSUNBU1RfSE9QUwkxNgorI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9JRgkxNworI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9IT1BTCTE4CisjZGVmaW5lIElQVjZfTVVMVElDQVNUX0xPT1AJMTkKKyNkZWZpbmUgSVBWNl9BRERfTUVNQkVSU0hJUAkyMAorI2RlZmluZSBJUFY2X0RST1BfTUVNQkVSU0hJUAkyMQorI2RlZmluZSBJUFY2X1JPVVRFUl9BTEVSVAkyMgorI2RlZmluZSBJUFY2X01UVV9ESVNDT1ZFUgkyMworI2RlZmluZSBJUFY2X01UVQkJMjQKKyNkZWZpbmUgSVBWNl9SRUNWRVJSCQkyNQorI2RlZmluZSBJUFY2X1Y2T05MWQkJMjYKKyNkZWZpbmUgSVBWNl9KT0lOX0FOWUNBU1QJMjcKKyNkZWZpbmUgSVBWNl9MRUFWRV9BTllDQVNUCTI4CisKKy8qIElQVjZfTVRVX0RJU0NPVkVSIHZhbHVlcyAqLworI2RlZmluZSBJUFY2X1BNVFVESVNDX0RPTlQJCTAKKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19XQU5UCQkxCisjZGVmaW5lIElQVjZfUE1UVURJU0NfRE8JCTIKKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19QUk9CRQkJMworCisvKiBGbG93bGFiZWwgKi8KKyNkZWZpbmUgSVBWNl9GTE9XTEFCRUxfTUdSCTMyCisjZGVmaW5lIElQVjZfRkxPV0lORk9fU0VORAkzMworCisjZGVmaW5lIElQVjZfSVBTRUNfUE9MSUNZCTM0CisjZGVmaW5lIElQVjZfWEZSTV9QT0xJQ1kJMzUKKworLyoKKyAqIE11bHRpY2FzdDoKKyAqIEZvbGxvd2luZyBzb2NrZXQgb3B0aW9ucyBhcmUgc2hhcmVkIGJldHdlZW4gSVB2NCBhbmQgSVB2Ni4KKyAqCisgKiBNQ0FTVF9KT0lOX0dST1VQCQk0MgorICogTUNBU1RfQkxPQ0tfU09VUkNFCQk0MworICogTUNBU1RfVU5CTE9DS19TT1VSQ0UJCTQ0CisgKiBNQ0FTVF9MRUFWRV9HUk9VUAkJNDUKKyAqIE1DQVNUX0pPSU5fU09VUkNFX0dST1VQCTQ2CisgKiBNQ0FTVF9MRUFWRV9TT1VSQ0VfR1JPVVAJNDcKKyAqIE1DQVNUX01TRklMVEVSCQk0OAorICovCisKKy8qCisgKiBBZHZhbmNlZCBBUEkgKFJGQzM1NDIpICgxKQorICoKKyAqIE5vdGU6IElQVjZfUkVDVlJUSERSRFNUT1BUUyBkb2VzIG5vdCBleGlzdC4gc2VlIG5ldC9pcHY2L2RhdGFncmFtLmMuCisgKi8KKworI2RlZmluZSBJUFY2X1JFQ1ZQS1RJTkZPCTQ5CisjZGVmaW5lIElQVjZfUEtUSU5GTwkJNTAKKyNkZWZpbmUgSVBWNl9SRUNWSE9QTElNSVQJNTEKKyNkZWZpbmUgSVBWNl9IT1BMSU1JVAkJNTIKKyNkZWZpbmUgSVBWNl9SRUNWSE9QT1BUUwk1MworI2RlZmluZSBJUFY2X0hPUE9QVFMJCTU0CisjZGVmaW5lIElQVjZfUlRIRFJEU1RPUFRTCTU1CisjZGVmaW5lIElQVjZfUkVDVlJUSERSCQk1NgorI2RlZmluZSBJUFY2X1JUSERSCQk1NworI2RlZmluZSBJUFY2X1JFQ1ZEU1RPUFRTCTU4CisjZGVmaW5lIElQVjZfRFNUT1BUUwkJNTkKKyNkZWZpbmUgSVBWNl9SRUNWUEFUSE1UVQk2MAorI2RlZmluZSBJUFY2X1BBVEhNVFUJCTYxCisjZGVmaW5lIElQVjZfRE9OVEZSQUcJCTYyCisjaWYgMAkvKiBub3QgeWV0ICovCisjZGVmaW5lIElQVjZfVVNFX01JTl9NVFUJNjMKKyNlbmRpZgorCisvKgorICogTmV0ZmlsdGVyICgxKQorICoKKyAqIEZvbGxvd2luZyBzb2NrZXQgb3B0aW9ucyBhcmUgdXNlZCBpbiBpcDZfdGFibGVzOworICogc2VlIGluY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oLgorICoKKyAqIElQNlRfU09fU0VUX1JFUExBQ0UgLyBJUDZUX1NPX0dFVF9JTkZPCQk2NAorICogSVA2VF9TT19TRVRfQUREX0NPVU5URVJTIC8gSVA2VF9TT19HRVRfRU5UUklFUwk2NQorICovCisKKy8qCisgKiBBZHZhbmNlZCBBUEkgKFJGQzM1NDIpICgyKQorICovCisjZGVmaW5lIElQVjZfUkVDVlRDTEFTUwkJNjYKKyNkZWZpbmUgSVBWNl9UQ0xBU1MJCTY3CisKKy8qCisgKiBOZXRmaWx0ZXIgKDIpCisgKgorICogRm9sbG93aW5nIHNvY2tldCBvcHRpb25zIGFyZSB1c2VkIGluIGlwNl90YWJsZXM7CisgKiBzZWUgaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmguCisgKgorICogSVA2VF9TT19HRVRfUkVWSVNJT05fTUFUQ0gJNjgKKyAqIElQNlRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAk2OQorICovCisKKy8qIFJGQzUwMTQ6IFNvdXJjZSBhZGRyZXNzIHNlbGVjdGlvbiAqLworI2RlZmluZSBJUFY2X0FERFJfUFJFRkVSRU5DRVMJNzIKKworI2RlZmluZSBJUFY2X1BSRUZFUl9TUkNfVE1QCQkweDAwMDEKKyNkZWZpbmUgSVBWNl9QUkVGRVJfU1JDX1BVQkxJQwkJMHgwMDAyCisjZGVmaW5lIElQVjZfUFJFRkVSX1NSQ19QVUJUTVBfREVGQVVMVAkweDAxMDAKKyNkZWZpbmUgSVBWNl9QUkVGRVJfU1JDX0NPQQkJMHgwMDA0CisjZGVmaW5lIElQVjZfUFJFRkVSX1NSQ19IT01FCQkweDA0MDAKKyNkZWZpbmUgSVBWNl9QUkVGRVJfU1JDX0NHQQkJMHgwMDA4CisjZGVmaW5lIElQVjZfUFJFRkVSX1NSQ19OT05DR0EJCTB4MDgwMAorCisvKiBSRkM1MDgyOiBHZW5lcmFsaXplZCBUdGwgU2VjdXJpdHkgTWVjaGFuaXNtICovCisjZGVmaW5lIElQVjZfTUlOSE9QQ09VTlQJCTczCisKKyNkZWZpbmUgSVBWNl9PUklHRFNUQUREUiAgICAgICAgNzQKKyNkZWZpbmUgSVBWNl9SRUNWT1JJR0RTVEFERFIgICAgSVBWNl9PUklHRFNUQUREUgorI2RlZmluZSBJUFY2X1RSQU5TUEFSRU5UICAgICAgICA3NQorCisvKgorICogTXVsdGljYXN0IFJvdXRpbmc6CisgKiBzZWUgaW5jbHVkZS9saW51eC9tcm91dGU2LmguCisgKgorICogTVJUNl9JTklUCQkJMjAwCisgKiBNUlQ2X0RPTkUJCQkyMDEKKyAqIE1SVDZfQUREX01JRgkJCTIwMgorICogTVJUNl9ERUxfTUlGCQkJMjAzCisgKiBNUlQ2X0FERF9NRkMJCQkyMDQKKyAqIE1SVDZfREVMX01GQwkJCTIwNQorICogTVJUNl9WRVJTSU9OCQkJMjA2CisgKiBNUlQ2X0FTU0VSVAkJCTIwNworICogTVJUNl9QSU0JCQkyMDgKKyAqIChyZXNlcnZlZCkJCQkyMDkKKyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luX3JvdXRlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luX3JvdXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2MWI4YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaW5fcm91dGUuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIF9MSU5VWF9JTl9ST1VURV9ICisjZGVmaW5lIF9MSU5VWF9JTl9ST1VURV9ICisKKy8qIElQdjQgcm91dGluZyBjYWNoZSBmbGFncyAqLworCisjZGVmaW5lIFJUQ0ZfREVBRAlSVE5IX0ZfREVBRAorI2RlZmluZSBSVENGX09OTElOSwlSVE5IX0ZfT05MSU5LCisKKy8qIE9ic29sZXRlIGZsYWcuIEFib3V0IHRvIGJlIGRlbGV0ZWQgKi8KKyNkZWZpbmUgUlRDRl9OT1BNVFVESVNDIFJUTV9GX05PUE1UVURJU0MKKworI2RlZmluZSBSVENGX05PVElGWQkweDAwMDEwMDAwCisjZGVmaW5lIFJUQ0ZfRElSRUNURFNUCTB4MDAwMjAwMDAgLyogdW51c2VkICovCisjZGVmaW5lIFJUQ0ZfUkVESVJFQ1RFRAkweDAwMDQwMDAwCisjZGVmaW5lIFJUQ0ZfVFBST1hZCTB4MDAwODAwMDAgLyogdW51c2VkICovCisKKyNkZWZpbmUgUlRDRl9GQVNUCTB4MDAyMDAwMDAgLyogdW51c2VkICovCisjZGVmaW5lIFJUQ0ZfTUFTUQkweDAwNDAwMDAwIC8qIHVudXNlZCAqLworI2RlZmluZSBSVENGX1NOQVQJMHgwMDgwMDAwMCAvKiB1bnVzZWQgKi8KKyNkZWZpbmUgUlRDRl9ET1JFRElSRUNUIDB4MDEwMDAwMDAKKyNkZWZpbmUgUlRDRl9ESVJFQ1RTUkMJMHgwNDAwMDAwMAorI2RlZmluZSBSVENGX0ROQVQJMHgwODAwMDAwMAorI2RlZmluZSBSVENGX0JST0FEQ0FTVAkweDEwMDAwMDAwCisjZGVmaW5lIFJUQ0ZfTVVMVElDQVNUCTB4MjAwMDAwMDAKKyNkZWZpbmUgUlRDRl9SRUpFQ1QJMHg0MDAwMDAwMCAvKiB1bnVzZWQgKi8KKyNkZWZpbmUgUlRDRl9MT0NBTAkweDgwMDAwMDAwCisKKyNkZWZpbmUgUlRDRl9OQVQJKFJUQ0ZfRE5BVHxSVENGX1NOQVQpCisKKyNkZWZpbmUgUlRfVE9TKHRvcykJKCh0b3MpJklQVE9TX1RPU19NQVNLKQorCisjZW5kaWYgLyogX0xJTlVYX0lOX1JPVVRFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaW5ldF9kaWFnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luZXRfZGlhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNmYxZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luZXRfZGlhZy5oCkBAIC0wLDAgKzEsMTI2IEBACisjaWZuZGVmIF9JTkVUX0RJQUdfSF8KKyNkZWZpbmUgX0lORVRfRElBR19IXyAxCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBKdXN0IHNvbWUgcmFuZG9tIG51bWJlciAqLworI2RlZmluZSBUQ1BESUFHX0dFVFNPQ0sgMTgKKyNkZWZpbmUgRENDUERJQUdfR0VUU09DSyAxOQorCisjZGVmaW5lIElORVRfRElBR19HRVRTT0NLX01BWCAyNAorCisvKiBTb2NrZXQgaWRlbnRpdHkgKi8KK3N0cnVjdCBpbmV0X2RpYWdfc29ja2lkIHsKKwlfX2JlMTYJaWRpYWdfc3BvcnQ7CisJX19iZTE2CWlkaWFnX2Rwb3J0OworCV9fYmUzMglpZGlhZ19zcmNbNF07CisJX19iZTMyCWlkaWFnX2RzdFs0XTsKKwlfX3UzMglpZGlhZ19pZjsKKwlfX3UzMglpZGlhZ19jb29raWVbMl07CisjZGVmaW5lIElORVRfRElBR19OT0NPT0tJRSAofjBVKQorfTsKKworLyogUmVxdWVzdCBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IGluZXRfZGlhZ19yZXEgeworCV9fdTgJaWRpYWdfZmFtaWx5OwkJLyogRmFtaWx5IG9mIGFkZHJlc3Nlcy4gKi8KKwlfX3U4CWlkaWFnX3NyY19sZW47CisJX191OAlpZGlhZ19kc3RfbGVuOworCV9fdTgJaWRpYWdfZXh0OwkJLyogUXVlcnkgZXh0ZW5kZWQgaW5mb3JtYXRpb24gKi8KKworCXN0cnVjdCBpbmV0X2RpYWdfc29ja2lkIGlkOworCisJX191MzIJaWRpYWdfc3RhdGVzOwkJLyogU3RhdGVzIHRvIGR1bXAgKi8KKwlfX3UzMglpZGlhZ19kYnM7CQkvKiBUYWJsZXMgdG8gZHVtcCAoTkkpICovCit9OworCitlbnVtIHsKKwlJTkVUX0RJQUdfUkVRX05PTkUsCisJSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSwKK307CisKKyNkZWZpbmUgSU5FVF9ESUFHX1JFUV9NQVggSU5FVF9ESUFHX1JFUV9CWVRFQ09ERQorCisvKiBCeXRlY29kZSBpcyBzZXF1ZW5jZSBvZiA0IGJ5dGUgY29tbWFuZHMgZm9sbG93ZWQgYnkgdmFyaWFibGUgYXJndW1lbnRzLgorICogQWxsIHRoZSBjb21tYW5kcyBpZGVudGlmaWVkIGJ5ICJjb2RlIiBhcmUgY29uZGl0aW9uYWwganVtcHMgZm9yd2FyZDoKKyAqIHRvIG9mZnNldCBjYysieWVzIiBvciB0byBvZmZzZXQgY2MrIm5vIi4gInllcyIgaXMgc3VwcG9zZWQgdG8gYmUKKyAqIGxlbmd0aCBvZiB0aGUgY29tbWFuZCBhbmQgaXRzIGFyZ3VtZW50cy4KKyAqLworIAorc3RydWN0IGluZXRfZGlhZ19iY19vcCB7CisJdW5zaWduZWQgY2hhcgljb2RlOworCXVuc2lnbmVkIGNoYXIJeWVzOworCXVuc2lnbmVkIHNob3J0CW5vOworfTsKKworZW51bSB7CisJSU5FVF9ESUFHX0JDX05PUCwKKwlJTkVUX0RJQUdfQkNfSk1QLAorCUlORVRfRElBR19CQ19TX0dFLAorCUlORVRfRElBR19CQ19TX0xFLAorCUlORVRfRElBR19CQ19EX0dFLAorCUlORVRfRElBR19CQ19EX0xFLAorCUlORVRfRElBR19CQ19BVVRPLAorCUlORVRfRElBR19CQ19TX0NPTkQsCisJSU5FVF9ESUFHX0JDX0RfQ09ORCwKK307CisKK3N0cnVjdCBpbmV0X2RpYWdfaG9zdGNvbmQgeworCV9fdTgJZmFtaWx5OworCV9fdTgJcHJlZml4X2xlbjsKKwlpbnQJcG9ydDsKKwlfX2JlMzIJYWRkclswXTsKK307CisKKy8qIEJhc2UgaW5mbyBzdHJ1Y3R1cmUuIEl0IGNvbnRhaW5zIHNvY2tldCBpZGVudGl0eSAoYWRkcnMvcG9ydHMvY29va2llKQorICogYW5kLCBhbGFzLCB0aGUgaW5mb3JtYXRpb24gc2hvd24gYnkgbmV0c3RhdC4gKi8KK3N0cnVjdCBpbmV0X2RpYWdfbXNnIHsKKwlfX3U4CWlkaWFnX2ZhbWlseTsKKwlfX3U4CWlkaWFnX3N0YXRlOworCV9fdTgJaWRpYWdfdGltZXI7CisJX191OAlpZGlhZ19yZXRyYW5zOworCisJc3RydWN0IGluZXRfZGlhZ19zb2NraWQgaWQ7CisKKwlfX3UzMglpZGlhZ19leHBpcmVzOworCV9fdTMyCWlkaWFnX3JxdWV1ZTsKKwlfX3UzMglpZGlhZ193cXVldWU7CisJX191MzIJaWRpYWdfdWlkOworCV9fdTMyCWlkaWFnX2lub2RlOworfTsKKworLyogRXh0ZW5zaW9ucyAqLworCitlbnVtIHsKKwlJTkVUX0RJQUdfTk9ORSwKKwlJTkVUX0RJQUdfTUVNSU5GTywKKwlJTkVUX0RJQUdfSU5GTywKKwlJTkVUX0RJQUdfVkVHQVNJTkZPLAorCUlORVRfRElBR19DT05HLAorCUlORVRfRElBR19UT1MsCisJSU5FVF9ESUFHX1RDTEFTUywKK307CisKKyNkZWZpbmUgSU5FVF9ESUFHX01BWCBJTkVUX0RJQUdfVENMQVNTCisKKworLyogSU5FVF9ESUFHX01FTSAqLworCitzdHJ1Y3QgaW5ldF9kaWFnX21lbWluZm8geworCV9fdTMyCWlkaWFnX3JtZW07CisJX191MzIJaWRpYWdfd21lbTsKKwlfX3UzMglpZGlhZ19mbWVtOworCV9fdTMyCWlkaWFnX3RtZW07Cit9OworCisvKiBJTkVUX0RJQUdfVkVHQVNJTkZPICovCisKK3N0cnVjdCB0Y3B2ZWdhc19pbmZvIHsKKwlfX3UzMgl0Y3B2X2VuYWJsZWQ7CisJX191MzIJdGNwdl9ydHRjbnQ7CisJX191MzIJdGNwdl9ydHQ7CisJX191MzIJdGNwdl9taW5ydHQ7Cit9OworCisKKyNlbmRpZiAvKiBfSU5FVF9ESUFHX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lub3RpZnkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwM2JmYTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lub3RpZnkuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogSW5vZGUgYmFzZWQgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbiBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSm9obiBNY0N1dGNoYW4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9JTk9USUZZX0gKKyNkZWZpbmUgX0xJTlVYX0lOT1RJRllfSAorCisvKiBGb3IgT19DTE9FWEVDIGFuZCBPX05PTkJMT0NLICovCisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogc3RydWN0IGlub3RpZnlfZXZlbnQgLSBzdHJ1Y3R1cmUgcmVhZCBmcm9tIHRoZSBpbm90aWZ5IGRldmljZSBmb3IgZWFjaCBldmVudAorICoKKyAqIFdoZW4geW91IGFyZSB3YXRjaGluZyBhIGRpcmVjdG9yeSwgeW91IHdpbGwgcmVjZWl2ZSB0aGUgZmlsZW5hbWUgZm9yIGV2ZW50cworICogc3VjaCBhcyBJTl9DUkVBVEUsIElOX0RFTEVURSwgSU5fT1BFTiwgSU5fQ0xPU0UsIC4uLiwgcmVsYXRpdmUgdG8gdGhlIHdkLgorICovCitzdHJ1Y3QgaW5vdGlmeV9ldmVudCB7CisJX19zMzIJCXdkOwkJLyogd2F0Y2ggZGVzY3JpcHRvciAqLworCV9fdTMyCQltYXNrOwkJLyogd2F0Y2ggbWFzayAqLworCV9fdTMyCQljb29raWU7CQkvKiBjb29raWUgdG8gc3luY2hyb25pemUgdHdvIGV2ZW50cyAqLworCV9fdTMyCQlsZW47CQkvKiBsZW5ndGggKGluY2x1ZGluZyBudWxscykgb2YgbmFtZSAqLworCWNoYXIJCW5hbWVbMF07CS8qIHN0dWIgZm9yIHBvc3NpYmxlIG5hbWUgKi8KK307CisKKy8qIHRoZSBmb2xsb3dpbmcgYXJlIGxlZ2FsLCBpbXBsZW1lbnRlZCBldmVudHMgdGhhdCB1c2VyLXNwYWNlIGNhbiB3YXRjaCBmb3IgKi8KKyNkZWZpbmUgSU5fQUNDRVNTCQkweDAwMDAwMDAxCS8qIEZpbGUgd2FzIGFjY2Vzc2VkICovCisjZGVmaW5lIElOX01PRElGWQkJMHgwMDAwMDAwMgkvKiBGaWxlIHdhcyBtb2RpZmllZCAqLworI2RlZmluZSBJTl9BVFRSSUIJCTB4MDAwMDAwMDQJLyogTWV0YWRhdGEgY2hhbmdlZCAqLworI2RlZmluZSBJTl9DTE9TRV9XUklURQkJMHgwMDAwMDAwOAkvKiBXcml0dGFibGUgZmlsZSB3YXMgY2xvc2VkICovCisjZGVmaW5lIElOX0NMT1NFX05PV1JJVEUJMHgwMDAwMDAxMAkvKiBVbndyaXR0YWJsZSBmaWxlIGNsb3NlZCAqLworI2RlZmluZSBJTl9PUEVOCQkJMHgwMDAwMDAyMAkvKiBGaWxlIHdhcyBvcGVuZWQgKi8KKyNkZWZpbmUgSU5fTU9WRURfRlJPTQkJMHgwMDAwMDA0MAkvKiBGaWxlIHdhcyBtb3ZlZCBmcm9tIFggKi8KKyNkZWZpbmUgSU5fTU9WRURfVE8JCTB4MDAwMDAwODAJLyogRmlsZSB3YXMgbW92ZWQgdG8gWSAqLworI2RlZmluZSBJTl9DUkVBVEUJCTB4MDAwMDAxMDAJLyogU3ViZmlsZSB3YXMgY3JlYXRlZCAqLworI2RlZmluZSBJTl9ERUxFVEUJCTB4MDAwMDAyMDAJLyogU3ViZmlsZSB3YXMgZGVsZXRlZCAqLworI2RlZmluZSBJTl9ERUxFVEVfU0VMRgkJMHgwMDAwMDQwMAkvKiBTZWxmIHdhcyBkZWxldGVkICovCisjZGVmaW5lIElOX01PVkVfU0VMRgkJMHgwMDAwMDgwMAkvKiBTZWxmIHdhcyBtb3ZlZCAqLworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBsZWdhbCBldmVudHMuICB0aGV5IGFyZSBzZW50IGFzIG5lZWRlZCB0byBhbnkgd2F0Y2ggKi8KKyNkZWZpbmUgSU5fVU5NT1VOVAkJMHgwMDAwMjAwMAkvKiBCYWNraW5nIGZzIHdhcyB1bm1vdW50ZWQgKi8KKyNkZWZpbmUgSU5fUV9PVkVSRkxPVwkJMHgwMDAwNDAwMAkvKiBFdmVudCBxdWV1ZWQgb3ZlcmZsb3dlZCAqLworI2RlZmluZSBJTl9JR05PUkVECQkweDAwMDA4MDAwCS8qIEZpbGUgd2FzIGlnbm9yZWQgKi8KKworLyogaGVscGVyIGV2ZW50cyAqLworI2RlZmluZSBJTl9DTE9TRQkJKElOX0NMT1NFX1dSSVRFIHwgSU5fQ0xPU0VfTk9XUklURSkgLyogY2xvc2UgKi8KKyNkZWZpbmUgSU5fTU9WRQkJCShJTl9NT1ZFRF9GUk9NIHwgSU5fTU9WRURfVE8pIC8qIG1vdmVzICovCisKKy8qIHNwZWNpYWwgZmxhZ3MgKi8KKyNkZWZpbmUgSU5fT05MWURJUgkJMHgwMTAwMDAwMAkvKiBvbmx5IHdhdGNoIHRoZSBwYXRoIGlmIGl0IGlzIGEgZGlyZWN0b3J5ICovCisjZGVmaW5lIElOX0RPTlRfRk9MTE9XCQkweDAyMDAwMDAwCS8qIGRvbid0IGZvbGxvdyBhIHN5bSBsaW5rICovCisjZGVmaW5lIElOX0VYQ0xfVU5MSU5LCQkweDA0MDAwMDAwCS8qIGV4Y2x1ZGUgZXZlbnRzIG9uIHVubGlua2VkIG9iamVjdHMgKi8KKyNkZWZpbmUgSU5fTUFTS19BREQJCTB4MjAwMDAwMDAJLyogYWRkIHRvIHRoZSBtYXNrIG9mIGFuIGFscmVhZHkgZXhpc3Rpbmcgd2F0Y2ggKi8KKyNkZWZpbmUgSU5fSVNESVIJCTB4NDAwMDAwMDAJLyogZXZlbnQgb2NjdXJyZWQgYWdhaW5zdCBkaXIgKi8KKyNkZWZpbmUgSU5fT05FU0hPVAkJMHg4MDAwMDAwMAkvKiBvbmx5IHNlbmQgZXZlbnQgb25jZSAqLworCisvKgorICogQWxsIG9mIHRoZSBldmVudHMgLSB3ZSBidWlsZCB0aGUgbGlzdCBieSBoYW5kIHNvIHRoYXQgd2UgY2FuIGFkZCBmbGFncyBpbgorICogdGhlIGZ1dHVyZSBhbmQgbm90IGJyZWFrIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBBcHBzIHdpbGwgZ2V0IG9ubHkgdGhlCisgKiBldmVudHMgdGhhdCB0aGV5IG9yaWdpbmFsbHkgd2FudGVkLiAgQmUgc3VyZSB0byBhZGQgbmV3IGV2ZW50cyBoZXJlIQorICovCisjZGVmaW5lIElOX0FMTF9FVkVOVFMJKElOX0FDQ0VTUyB8IElOX01PRElGWSB8IElOX0FUVFJJQiB8IElOX0NMT1NFX1dSSVRFIHwgXAorCQkJIElOX0NMT1NFX05PV1JJVEUgfCBJTl9PUEVOIHwgSU5fTU9WRURfRlJPTSB8IFwKKwkJCSBJTl9NT1ZFRF9UTyB8IElOX0RFTEVURSB8IElOX0NSRUFURSB8IElOX0RFTEVURV9TRUxGIHwgXAorCQkJIElOX01PVkVfU0VMRikKKworLyogRmxhZ3MgZm9yIHN5c19pbm90aWZ5X2luaXQxLiAgKi8KKyNkZWZpbmUgSU5fQ0xPRVhFQyBPX0NMT0VYRUMKKyNkZWZpbmUgSU5fTk9OQkxPQ0sgT19OT05CTE9DSworCisKKyNlbmRpZgkvKiBfTElOVVhfSU5PVElGWV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lucHV0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lucHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyM2I2MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaW5wdXQuaApAQCAtMCwwICsxLDExMjAgQEAKKyNpZm5kZWYgX0lOUFVUX0gKKyNkZWZpbmUgX0lOUFVUX0gKKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAyIFZvanRlY2ggUGF2bGlrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogVGhlIGV2ZW50IHN0cnVjdHVyZSBpdHNlbGYKKyAqLworCitzdHJ1Y3QgaW5wdXRfZXZlbnQgeworCXN0cnVjdCB0aW1ldmFsIHRpbWU7CisJX191MTYgdHlwZTsKKwlfX3UxNiBjb2RlOworCV9fczMyIHZhbHVlOworfTsKKworLyoKKyAqIFByb3RvY29sIHZlcnNpb24uCisgKi8KKworI2RlZmluZSBFVl9WRVJTSU9OCQkweDAxMDAwMQorCisvKgorICogSU9DVExzICgweDAwIC0gMHg3ZikKKyAqLworCitzdHJ1Y3QgaW5wdXRfaWQgeworCV9fdTE2IGJ1c3R5cGU7CisJX191MTYgdmVuZG9yOworCV9fdTE2IHByb2R1Y3Q7CisJX191MTYgdmVyc2lvbjsKK307CisKKy8qKgorICogc3RydWN0IGlucHV0X2Fic2luZm8gLSB1c2VkIGJ5IEVWSU9DR0FCUy9FVklPQ1NBQlMgaW9jdGxzCisgKiBAdmFsdWU6IGxhdGVzdCByZXBvcnRlZCB2YWx1ZSBmb3IgdGhlIGF4aXMuCisgKiBAbWluaW11bTogc3BlY2lmaWVzIG1pbmltdW0gdmFsdWUgZm9yIHRoZSBheGlzLgorICogQG1heGltdW06IHNwZWNpZmllcyBtYXhpbXVtIHZhbHVlIGZvciB0aGUgYXhpcy4KKyAqIEBmdXp6OiBzcGVjaWZpZXMgZnV6eiB2YWx1ZSB0aGF0IGlzIHVzZWQgdG8gZmlsdGVyIG5vaXNlIGZyb20KKyAqCXRoZSBldmVudCBzdHJlYW0uCisgKiBAZmxhdDogdmFsdWVzIHRoYXQgYXJlIHdpdGhpbiB0aGlzIHZhbHVlIHdpbGwgYmUgZGlzY2FyZGVkIGJ5CisgKglqb3lkZXYgaW50ZXJmYWNlIGFuZCByZXBvcnRlZCBhcyAwIGluc3RlYWQuCisgKiBAcmVzb2x1dGlvbjogc3BlY2lmaWVzIHJlc29sdXRpb24gZm9yIHRoZSB2YWx1ZXMgcmVwb3J0ZWQgZm9yCisgKgl0aGUgYXhpcy4KKyAqCisgKiBOb3RlIHRoYXQgaW5wdXQgY29yZSBkb2VzIG5vdCBjbGFtcCByZXBvcnRlZCB2YWx1ZXMgdG8gdGhlCisgKiBbbWluaW11bSwgbWF4aW11bV0gbGltaXRzLCBzdWNoIHRhc2sgaXMgbGVmdCB0byB1c2Vyc3BhY2UuCisgKgorICogUmVzb2x1dGlvbiBmb3IgbWFpbiBheGVzIChBQlNfWCwgQUJTX1ksIEFCU19aKSBpcyByZXBvcnRlZCBpbgorICogdW5pdHMgcGVyIG1pbGxpbWV0ZXIgKHVuaXRzL21tKSwgcmVzb2x1dGlvbiBmb3Igcm90YXRpb25hbCBheGVzCisgKiAoQUJTX1JYLCBBQlNfUlksIEFCU19SWikgaXMgcmVwb3J0ZWQgaW4gdW5pdHMgcGVyIHJhZGlhbi4KKyAqLworc3RydWN0IGlucHV0X2Fic2luZm8geworCV9fczMyIHZhbHVlOworCV9fczMyIG1pbmltdW07CisJX19zMzIgbWF4aW11bTsKKwlfX3MzMiBmdXp6OworCV9fczMyIGZsYXQ7CisJX19zMzIgcmVzb2x1dGlvbjsKK307CisKKy8qKgorICogc3RydWN0IGlucHV0X2tleW1hcF9lbnRyeSAtIHVzZWQgYnkgRVZJT0NHS0VZQ09ERS9FVklPQ1NLRVlDT0RFIGlvY3RscworICogQHNjYW5jb2RlOiBzY2FuY29kZSByZXByZXNlbnRlZCBpbiBtYWNoaW5lLWVuZGlhbiBmb3JtLgorICogQGxlbjogbGVuZ3RoIG9mIHRoZSBzY2FuY29kZSB0aGF0IHJlc2lkZXMgaW4gQHNjYW5jb2RlIGJ1ZmZlci4KKyAqIEBpbmRleDogaW5kZXggaW4gdGhlIGtleW1hcCwgbWF5IGJlIHVzZWQgaW5zdGVhZCBvZiBzY2FuY29kZQorICogQGZsYWdzOiBhbGxvd3MgdG8gc3BlY2lmeSBob3cga2VybmVsIHNob3VsZCBoYW5kbGUgdGhlIHJlcXVlc3QuIEZvcgorICoJZXhhbXBsZSwgc2V0dGluZyBJTlBVVF9LRVlNQVBfQllfSU5ERVggZmxhZyBpbmRpY2F0ZXMgdGhhdCBrZXJuZWwKKyAqCXNob3VsZCBwZXJmb3JtIGxvb2t1cCBpbiBrZXltYXAgYnkgQGluZGV4IGluc3RlYWQgb2YgQHNjYW5jb2RlCisgKiBAa2V5Y29kZToga2V5IGNvZGUgYXNzaWduZWQgdG8gdGhpcyBzY2FuY29kZQorICoKKyAqIFRoZSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRyaWV2ZSBhbmQgbW9kaWZ5IGtleW1hcCBkYXRhLiBVc2VycyBoYXZlCisgKiBvcHRpb24gb2YgcGVyZm9ybWluZyBsb29rdXAgZWl0aGVyIGJ5IEBzY2FuY29kZSBpdHNlbGYgb3IgYnkgQGluZGV4CisgKiBpbiBrZXltYXAgZW50cnkuIEVWSU9DR0tFWUNPREUgd2lsbCBhbHNvIHJldHVybiBzY2FuY29kZSBvciBpbmRleAorICogKGRlcGVuZGluZyBvbiB3aGljaCBlbGVtZW50IHdhcyB1c2VkIHRvIHBlcmZvcm0gbG9va3VwKS4KKyAqLworc3RydWN0IGlucHV0X2tleW1hcF9lbnRyeSB7CisjZGVmaW5lIElOUFVUX0tFWU1BUF9CWV9JTkRFWAkoMSA8PCAwKQorCV9fdTggIGZsYWdzOworCV9fdTggIGxlbjsKKwlfX3UxNiBpbmRleDsKKwlfX3UzMiBrZXljb2RlOworCV9fdTggIHNjYW5jb2RlWzMyXTsKK307CisKKyNkZWZpbmUgRVZJT0NHVkVSU0lPTgkJX0lPUignRScsIDB4MDEsIGludCkJCQkvKiBnZXQgZHJpdmVyIHZlcnNpb24gKi8KKyNkZWZpbmUgRVZJT0NHSUQJCV9JT1IoJ0UnLCAweDAyLCBzdHJ1Y3QgaW5wdXRfaWQpCS8qIGdldCBkZXZpY2UgSUQgKi8KKyNkZWZpbmUgRVZJT0NHUkVQCQlfSU9SKCdFJywgMHgwMywgdW5zaWduZWQgaW50WzJdKQkvKiBnZXQgcmVwZWF0IHNldHRpbmdzICovCisjZGVmaW5lIEVWSU9DU1JFUAkJX0lPVygnRScsIDB4MDMsIHVuc2lnbmVkIGludFsyXSkJLyogc2V0IHJlcGVhdCBzZXR0aW5ncyAqLworCisjZGVmaW5lIEVWSU9DR0tFWUNPREUJCV9JT1IoJ0UnLCAweDA0LCB1bnNpZ25lZCBpbnRbMl0pICAgICAgICAvKiBnZXQga2V5Y29kZSAqLworI2RlZmluZSBFVklPQ0dLRVlDT0RFX1YyCV9JT1IoJ0UnLCAweDA0LCBzdHJ1Y3QgaW5wdXRfa2V5bWFwX2VudHJ5KQorI2RlZmluZSBFVklPQ1NLRVlDT0RFCQlfSU9XKCdFJywgMHgwNCwgdW5zaWduZWQgaW50WzJdKSAgICAgICAgLyogc2V0IGtleWNvZGUgKi8KKyNkZWZpbmUgRVZJT0NTS0VZQ09ERV9WMglfSU9XKCdFJywgMHgwNCwgc3RydWN0IGlucHV0X2tleW1hcF9lbnRyeSkKKworI2RlZmluZSBFVklPQ0dOQU1FKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MDYsIGxlbikJCS8qIGdldCBkZXZpY2UgbmFtZSAqLworI2RlZmluZSBFVklPQ0dQSFlTKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MDcsIGxlbikJCS8qIGdldCBwaHlzaWNhbCBsb2NhdGlvbiAqLworI2RlZmluZSBFVklPQ0dVTklRKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MDgsIGxlbikJCS8qIGdldCB1bmlxdWUgaWRlbnRpZmllciAqLworI2RlZmluZSBFVklPQ0dQUk9QKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MDksIGxlbikJCS8qIGdldCBkZXZpY2UgcHJvcGVydGllcyAqLworCisjZGVmaW5lIEVWSU9DR0tFWShsZW4pCQlfSU9DKF9JT0NfUkVBRCwgJ0UnLCAweDE4LCBsZW4pCQkvKiBnZXQgZ2xvYmFsIGtleSBzdGF0ZSAqLworI2RlZmluZSBFVklPQ0dMRUQobGVuKQkJX0lPQyhfSU9DX1JFQUQsICdFJywgMHgxOSwgbGVuKQkJLyogZ2V0IGFsbCBMRURzICovCisjZGVmaW5lIEVWSU9DR1NORChsZW4pCQlfSU9DKF9JT0NfUkVBRCwgJ0UnLCAweDFhLCBsZW4pCQkvKiBnZXQgYWxsIHNvdW5kcyBzdGF0dXMgKi8KKyNkZWZpbmUgRVZJT0NHU1cobGVuKQkJX0lPQyhfSU9DX1JFQUQsICdFJywgMHgxYiwgbGVuKQkJLyogZ2V0IGFsbCBzd2l0Y2ggc3RhdGVzICovCisKKyNkZWZpbmUgRVZJT0NHQklUKGV2LGxlbikJX0lPQyhfSU9DX1JFQUQsICdFJywgMHgyMCArIChldiksIGxlbikJLyogZ2V0IGV2ZW50IGJpdHMgKi8KKyNkZWZpbmUgRVZJT0NHQUJTKGFicykJCV9JT1IoJ0UnLCAweDQwICsgKGFicyksIHN0cnVjdCBpbnB1dF9hYnNpbmZvKQkvKiBnZXQgYWJzIHZhbHVlL2xpbWl0cyAqLworI2RlZmluZSBFVklPQ1NBQlMoYWJzKQkJX0lPVygnRScsIDB4YzAgKyAoYWJzKSwgc3RydWN0IGlucHV0X2Fic2luZm8pCS8qIHNldCBhYnMgdmFsdWUvbGltaXRzICovCisKKyNkZWZpbmUgRVZJT0NTRkYJCV9JT0MoX0lPQ19XUklURSwgJ0UnLCAweDgwLCBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdCkpCS8qIHNlbmQgYSBmb3JjZSBlZmZlY3QgdG8gYSBmb3JjZSBmZWVkYmFjayBkZXZpY2UgKi8KKyNkZWZpbmUgRVZJT0NSTUZGCQlfSU9XKCdFJywgMHg4MSwgaW50KQkJCS8qIEVyYXNlIGEgZm9yY2UgZWZmZWN0ICovCisjZGVmaW5lIEVWSU9DR0VGRkVDVFMJCV9JT1IoJ0UnLCAweDg0LCBpbnQpCQkJLyogUmVwb3J0IG51bWJlciBvZiBlZmZlY3RzIHBsYXlhYmxlIGF0IHRoZSBzYW1lIHRpbWUgKi8KKworI2RlZmluZSBFVklPQ0dSQUIJCV9JT1coJ0UnLCAweDkwLCBpbnQpCQkJLyogR3JhYi9SZWxlYXNlIGRldmljZSAqLworCisvKgorICogRGV2aWNlIHByb3BlcnRpZXMgYW5kIHF1aXJrcworICovCisKKyNkZWZpbmUgSU5QVVRfUFJPUF9QT0lOVEVSCQkweDAwCS8qIG5lZWRzIGEgcG9pbnRlciAqLworI2RlZmluZSBJTlBVVF9QUk9QX0RJUkVDVAkJMHgwMQkvKiBkaXJlY3QgaW5wdXQgZGV2aWNlcyAqLworI2RlZmluZSBJTlBVVF9QUk9QX0JVVFRPTlBBRAkJMHgwMgkvKiBoYXMgYnV0dG9uKHMpIHVuZGVyIHBhZCAqLworI2RlZmluZSBJTlBVVF9QUk9QX1NFTUlfTVQJCTB4MDMJLyogdG91Y2ggcmVjdGFuZ2xlIG9ubHkgKi8KKworI2RlZmluZSBJTlBVVF9QUk9QX01BWAkJCTB4MWYKKyNkZWZpbmUgSU5QVVRfUFJPUF9DTlQJCQkoSU5QVVRfUFJPUF9NQVggKyAxKQorCisvKgorICogRXZlbnQgdHlwZXMKKyAqLworCisjZGVmaW5lIEVWX1NZTgkJCTB4MDAKKyNkZWZpbmUgRVZfS0VZCQkJMHgwMQorI2RlZmluZSBFVl9SRUwJCQkweDAyCisjZGVmaW5lIEVWX0FCUwkJCTB4MDMKKyNkZWZpbmUgRVZfTVNDCQkJMHgwNAorI2RlZmluZSBFVl9TVwkJCTB4MDUKKyNkZWZpbmUgRVZfTEVECQkJMHgxMQorI2RlZmluZSBFVl9TTkQJCQkweDEyCisjZGVmaW5lIEVWX1JFUAkJCTB4MTQKKyNkZWZpbmUgRVZfRkYJCQkweDE1CisjZGVmaW5lIEVWX1BXUgkJCTB4MTYKKyNkZWZpbmUgRVZfRkZfU1RBVFVTCQkweDE3CisjZGVmaW5lIEVWX01BWAkJCTB4MWYKKyNkZWZpbmUgRVZfQ05UCQkJKEVWX01BWCsxKQorCisvKgorICogU3luY2hyb25pemF0aW9uIGV2ZW50cy4KKyAqLworCisjZGVmaW5lIFNZTl9SRVBPUlQJCTAKKyNkZWZpbmUgU1lOX0NPTkZJRwkJMQorI2RlZmluZSBTWU5fTVRfUkVQT1JUCQkyCisjZGVmaW5lIFNZTl9EUk9QUEVECQkzCisKKy8qCisgKiBLZXlzIGFuZCBidXR0b25zCisgKgorICogTW9zdCBvZiB0aGUga2V5cy9idXR0b25zIGFyZSBtb2RlbGVkIGFmdGVyIFVTQiBIVVQgMS4xMgorICogKHNlZSBodHRwOi8vd3d3LnVzYi5vcmcvZGV2ZWxvcGVycy9oaWRwYWdlKS4KKyAqIEFiYnJldmlhdGlvbnMgaW4gdGhlIGNvbW1lbnRzOgorICogQUMgLSBBcHBsaWNhdGlvbiBDb250cm9sCisgKiBBTCAtIEFwcGxpY2F0aW9uIExhdW5jaCBCdXR0b24KKyAqIFNDIC0gU3lzdGVtIENvbnRyb2wKKyAqLworCisjZGVmaW5lIEtFWV9SRVNFUlZFRAkJMAorI2RlZmluZSBLRVlfRVNDCQkJMQorI2RlZmluZSBLRVlfMQkJCTIKKyNkZWZpbmUgS0VZXzIJCQkzCisjZGVmaW5lIEtFWV8zCQkJNAorI2RlZmluZSBLRVlfNAkJCTUKKyNkZWZpbmUgS0VZXzUJCQk2CisjZGVmaW5lIEtFWV82CQkJNworI2RlZmluZSBLRVlfNwkJCTgKKyNkZWZpbmUgS0VZXzgJCQk5CisjZGVmaW5lIEtFWV85CQkJMTAKKyNkZWZpbmUgS0VZXzAJCQkxMQorI2RlZmluZSBLRVlfTUlOVVMJCTEyCisjZGVmaW5lIEtFWV9FUVVBTAkJMTMKKyNkZWZpbmUgS0VZX0JBQ0tTUEFDRQkJMTQKKyNkZWZpbmUgS0VZX1RBQgkJCTE1CisjZGVmaW5lIEtFWV9RCQkJMTYKKyNkZWZpbmUgS0VZX1cJCQkxNworI2RlZmluZSBLRVlfRQkJCTE4CisjZGVmaW5lIEtFWV9SCQkJMTkKKyNkZWZpbmUgS0VZX1QJCQkyMAorI2RlZmluZSBLRVlfWQkJCTIxCisjZGVmaW5lIEtFWV9VCQkJMjIKKyNkZWZpbmUgS0VZX0kJCQkyMworI2RlZmluZSBLRVlfTwkJCTI0CisjZGVmaW5lIEtFWV9QCQkJMjUKKyNkZWZpbmUgS0VZX0xFRlRCUkFDRQkJMjYKKyNkZWZpbmUgS0VZX1JJR0hUQlJBQ0UJCTI3CisjZGVmaW5lIEtFWV9FTlRFUgkJMjgKKyNkZWZpbmUgS0VZX0xFRlRDVFJMCQkyOQorI2RlZmluZSBLRVlfQQkJCTMwCisjZGVmaW5lIEtFWV9TCQkJMzEKKyNkZWZpbmUgS0VZX0QJCQkzMgorI2RlZmluZSBLRVlfRgkJCTMzCisjZGVmaW5lIEtFWV9HCQkJMzQKKyNkZWZpbmUgS0VZX0gJCQkzNQorI2RlZmluZSBLRVlfSgkJCTM2CisjZGVmaW5lIEtFWV9LCQkJMzcKKyNkZWZpbmUgS0VZX0wJCQkzOAorI2RlZmluZSBLRVlfU0VNSUNPTE9OCQkzOQorI2RlZmluZSBLRVlfQVBPU1RST1BIRQkJNDAKKyNkZWZpbmUgS0VZX0dSQVZFCQk0MQorI2RlZmluZSBLRVlfTEVGVFNISUZUCQk0MgorI2RlZmluZSBLRVlfQkFDS1NMQVNICQk0MworI2RlZmluZSBLRVlfWgkJCTQ0CisjZGVmaW5lIEtFWV9YCQkJNDUKKyNkZWZpbmUgS0VZX0MJCQk0NgorI2RlZmluZSBLRVlfVgkJCTQ3CisjZGVmaW5lIEtFWV9CCQkJNDgKKyNkZWZpbmUgS0VZX04JCQk0OQorI2RlZmluZSBLRVlfTQkJCTUwCisjZGVmaW5lIEtFWV9DT01NQQkJNTEKKyNkZWZpbmUgS0VZX0RPVAkJCTUyCisjZGVmaW5lIEtFWV9TTEFTSAkJNTMKKyNkZWZpbmUgS0VZX1JJR0hUU0hJRlQJCTU0CisjZGVmaW5lIEtFWV9LUEFTVEVSSVNLCQk1NQorI2RlZmluZSBLRVlfTEVGVEFMVAkJNTYKKyNkZWZpbmUgS0VZX1NQQUNFCQk1NworI2RlZmluZSBLRVlfQ0FQU0xPQ0sJCTU4CisjZGVmaW5lIEtFWV9GMQkJCTU5CisjZGVmaW5lIEtFWV9GMgkJCTYwCisjZGVmaW5lIEtFWV9GMwkJCTYxCisjZGVmaW5lIEtFWV9GNAkJCTYyCisjZGVmaW5lIEtFWV9GNQkJCTYzCisjZGVmaW5lIEtFWV9GNgkJCTY0CisjZGVmaW5lIEtFWV9GNwkJCTY1CisjZGVmaW5lIEtFWV9GOAkJCTY2CisjZGVmaW5lIEtFWV9GOQkJCTY3CisjZGVmaW5lIEtFWV9GMTAJCQk2OAorI2RlZmluZSBLRVlfTlVNTE9DSwkJNjkKKyNkZWZpbmUgS0VZX1NDUk9MTExPQ0sJCTcwCisjZGVmaW5lIEtFWV9LUDcJCQk3MQorI2RlZmluZSBLRVlfS1A4CQkJNzIKKyNkZWZpbmUgS0VZX0tQOQkJCTczCisjZGVmaW5lIEtFWV9LUE1JTlVTCQk3NAorI2RlZmluZSBLRVlfS1A0CQkJNzUKKyNkZWZpbmUgS0VZX0tQNQkJCTc2CisjZGVmaW5lIEtFWV9LUDYJCQk3NworI2RlZmluZSBLRVlfS1BQTFVTCQk3OAorI2RlZmluZSBLRVlfS1AxCQkJNzkKKyNkZWZpbmUgS0VZX0tQMgkJCTgwCisjZGVmaW5lIEtFWV9LUDMJCQk4MQorI2RlZmluZSBLRVlfS1AwCQkJODIKKyNkZWZpbmUgS0VZX0tQRE9UCQk4MworCisjZGVmaW5lIEtFWV9aRU5LQUtVSEFOS0FLVQk4NQorI2RlZmluZSBLRVlfMTAyTkQJCTg2CisjZGVmaW5lIEtFWV9GMTEJCQk4NworI2RlZmluZSBLRVlfRjEyCQkJODgKKyNkZWZpbmUgS0VZX1JPCQkJODkKKyNkZWZpbmUgS0VZX0tBVEFLQU5BCQk5MAorI2RlZmluZSBLRVlfSElSQUdBTkEJCTkxCisjZGVmaW5lIEtFWV9IRU5LQU4JCTkyCisjZGVmaW5lIEtFWV9LQVRBS0FOQUhJUkFHQU5BCTkzCisjZGVmaW5lIEtFWV9NVUhFTktBTgkJOTQKKyNkZWZpbmUgS0VZX0tQSlBDT01NQQkJOTUKKyNkZWZpbmUgS0VZX0tQRU5URVIJCTk2CisjZGVmaW5lIEtFWV9SSUdIVENUUkwJCTk3CisjZGVmaW5lIEtFWV9LUFNMQVNICQk5OAorI2RlZmluZSBLRVlfU1lTUlEJCTk5CisjZGVmaW5lIEtFWV9SSUdIVEFMVAkJMTAwCisjZGVmaW5lIEtFWV9MSU5FRkVFRAkJMTAxCisjZGVmaW5lIEtFWV9IT01FCQkxMDIKKyNkZWZpbmUgS0VZX1VQCQkJMTAzCisjZGVmaW5lIEtFWV9QQUdFVVAJCTEwNAorI2RlZmluZSBLRVlfTEVGVAkJMTA1CisjZGVmaW5lIEtFWV9SSUdIVAkJMTA2CisjZGVmaW5lIEtFWV9FTkQJCQkxMDcKKyNkZWZpbmUgS0VZX0RPV04JCTEwOAorI2RlZmluZSBLRVlfUEFHRURPV04JCTEwOQorI2RlZmluZSBLRVlfSU5TRVJUCQkxMTAKKyNkZWZpbmUgS0VZX0RFTEVURQkJMTExCisjZGVmaW5lIEtFWV9NQUNSTwkJMTEyCisjZGVmaW5lIEtFWV9NVVRFCQkxMTMKKyNkZWZpbmUgS0VZX1ZPTFVNRURPV04JCTExNAorI2RlZmluZSBLRVlfVk9MVU1FVVAJCTExNQorI2RlZmluZSBLRVlfUE9XRVIJCTExNgkvKiBTQyBTeXN0ZW0gUG93ZXIgRG93biAqLworI2RlZmluZSBLRVlfS1BFUVVBTAkJMTE3CisjZGVmaW5lIEtFWV9LUFBMVVNNSU5VUwkJMTE4CisjZGVmaW5lIEtFWV9QQVVTRQkJMTE5CisjZGVmaW5lIEtFWV9TQ0FMRQkJMTIwCS8qIEFMIENvbXBpeiBTY2FsZSAoRXhwb3NlKSAqLworCisjZGVmaW5lIEtFWV9LUENPTU1BCQkxMjEKKyNkZWZpbmUgS0VZX0hBTkdFVUwJCTEyMgorI2RlZmluZSBLRVlfSEFOR1VFTAkJS0VZX0hBTkdFVUwKKyNkZWZpbmUgS0VZX0hBTkpBCQkxMjMKKyNkZWZpbmUgS0VZX1lFTgkJCTEyNAorI2RlZmluZSBLRVlfTEVGVE1FVEEJCTEyNQorI2RlZmluZSBLRVlfUklHSFRNRVRBCQkxMjYKKyNkZWZpbmUgS0VZX0NPTVBPU0UJCTEyNworCisjZGVmaW5lIEtFWV9TVE9QCQkxMjgJLyogQUMgU3RvcCAqLworI2RlZmluZSBLRVlfQUdBSU4JCTEyOQorI2RlZmluZSBLRVlfUFJPUFMJCTEzMAkvKiBBQyBQcm9wZXJ0aWVzICovCisjZGVmaW5lIEtFWV9VTkRPCQkxMzEJLyogQUMgVW5kbyAqLworI2RlZmluZSBLRVlfRlJPTlQJCTEzMgorI2RlZmluZSBLRVlfQ09QWQkJMTMzCS8qIEFDIENvcHkgKi8KKyNkZWZpbmUgS0VZX09QRU4JCTEzNAkvKiBBQyBPcGVuICovCisjZGVmaW5lIEtFWV9QQVNURQkJMTM1CS8qIEFDIFBhc3RlICovCisjZGVmaW5lIEtFWV9GSU5ECQkxMzYJLyogQUMgU2VhcmNoICovCisjZGVmaW5lIEtFWV9DVVQJCQkxMzcJLyogQUMgQ3V0ICovCisjZGVmaW5lIEtFWV9IRUxQCQkxMzgJLyogQUwgSW50ZWdyYXRlZCBIZWxwIENlbnRlciAqLworI2RlZmluZSBLRVlfTUVOVQkJMTM5CS8qIE1lbnUgKHNob3cgbWVudSkgKi8KKyNkZWZpbmUgS0VZX0NBTEMJCTE0MAkvKiBBTCBDYWxjdWxhdG9yICovCisjZGVmaW5lIEtFWV9TRVRVUAkJMTQxCisjZGVmaW5lIEtFWV9TTEVFUAkJMTQyCS8qIFNDIFN5c3RlbSBTbGVlcCAqLworI2RlZmluZSBLRVlfV0FLRVVQCQkxNDMJLyogU3lzdGVtIFdha2UgVXAgKi8KKyNkZWZpbmUgS0VZX0ZJTEUJCTE0NAkvKiBBTCBMb2NhbCBNYWNoaW5lIEJyb3dzZXIgKi8KKyNkZWZpbmUgS0VZX1NFTkRGSUxFCQkxNDUKKyNkZWZpbmUgS0VZX0RFTEVURUZJTEUJCTE0NgorI2RlZmluZSBLRVlfWEZFUgkJMTQ3CisjZGVmaW5lIEtFWV9QUk9HMQkJMTQ4CisjZGVmaW5lIEtFWV9QUk9HMgkJMTQ5CisjZGVmaW5lIEtFWV9XV1cJCQkxNTAJLyogQUwgSW50ZXJuZXQgQnJvd3NlciAqLworI2RlZmluZSBLRVlfTVNET1MJCTE1MQorI2RlZmluZSBLRVlfQ09GRkVFCQkxNTIJLyogQUwgVGVybWluYWwgTG9jay9TY3JlZW5zYXZlciAqLworI2RlZmluZSBLRVlfU0NSRUVOTE9DSwkJS0VZX0NPRkZFRQorI2RlZmluZSBLRVlfRElSRUNUSU9OCQkxNTMKKyNkZWZpbmUgS0VZX0NZQ0xFV0lORE9XUwkxNTQKKyNkZWZpbmUgS0VZX01BSUwJCTE1NQorI2RlZmluZSBLRVlfQk9PS01BUktTCQkxNTYJLyogQUMgQm9va21hcmtzICovCisjZGVmaW5lIEtFWV9DT01QVVRFUgkJMTU3CisjZGVmaW5lIEtFWV9CQUNLCQkxNTgJLyogQUMgQmFjayAqLworI2RlZmluZSBLRVlfRk9SV0FSRAkJMTU5CS8qIEFDIEZvcndhcmQgKi8KKyNkZWZpbmUgS0VZX0NMT1NFQ0QJCTE2MAorI2RlZmluZSBLRVlfRUpFQ1RDRAkJMTYxCisjZGVmaW5lIEtFWV9FSkVDVENMT1NFQ0QJMTYyCisjZGVmaW5lIEtFWV9ORVhUU09ORwkJMTYzCisjZGVmaW5lIEtFWV9QTEFZUEFVU0UJCTE2NAorI2RlZmluZSBLRVlfUFJFVklPVVNTT05HCTE2NQorI2RlZmluZSBLRVlfU1RPUENECQkxNjYKKyNkZWZpbmUgS0VZX1JFQ09SRAkJMTY3CisjZGVmaW5lIEtFWV9SRVdJTkQJCTE2OAorI2RlZmluZSBLRVlfUEhPTkUJCTE2OQkvKiBNZWRpYSBTZWxlY3QgVGVsZXBob25lICovCisjZGVmaW5lIEtFWV9JU08JCQkxNzAKKyNkZWZpbmUgS0VZX0NPTkZJRwkJMTcxCS8qIEFMIENvbnN1bWVyIENvbnRyb2wgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBLRVlfSE9NRVBBR0UJCTE3MgkvKiBBQyBIb21lICovCisjZGVmaW5lIEtFWV9SRUZSRVNICQkxNzMJLyogQUMgUmVmcmVzaCAqLworI2RlZmluZSBLRVlfRVhJVAkJMTc0CS8qIEFDIEV4aXQgKi8KKyNkZWZpbmUgS0VZX01PVkUJCTE3NQorI2RlZmluZSBLRVlfRURJVAkJMTc2CisjZGVmaW5lIEtFWV9TQ1JPTExVUAkJMTc3CisjZGVmaW5lIEtFWV9TQ1JPTExET1dOCQkxNzgKKyNkZWZpbmUgS0VZX0tQTEVGVFBBUkVOCQkxNzkKKyNkZWZpbmUgS0VZX0tQUklHSFRQQVJFTgkxODAKKyNkZWZpbmUgS0VZX05FVwkJCTE4MQkvKiBBQyBOZXcgKi8KKyNkZWZpbmUgS0VZX1JFRE8JCTE4MgkvKiBBQyBSZWRvL1JlcGVhdCAqLworCisjZGVmaW5lIEtFWV9GMTMJCQkxODMKKyNkZWZpbmUgS0VZX0YxNAkJCTE4NAorI2RlZmluZSBLRVlfRjE1CQkJMTg1CisjZGVmaW5lIEtFWV9GMTYJCQkxODYKKyNkZWZpbmUgS0VZX0YxNwkJCTE4NworI2RlZmluZSBLRVlfRjE4CQkJMTg4CisjZGVmaW5lIEtFWV9GMTkJCQkxODkKKyNkZWZpbmUgS0VZX0YyMAkJCTE5MAorI2RlZmluZSBLRVlfRjIxCQkJMTkxCisjZGVmaW5lIEtFWV9GMjIJCQkxOTIKKyNkZWZpbmUgS0VZX0YyMwkJCTE5MworI2RlZmluZSBLRVlfRjI0CQkJMTk0CisKKyNkZWZpbmUgS0VZX1BMQVlDRAkJMjAwCisjZGVmaW5lIEtFWV9QQVVTRUNECQkyMDEKKyNkZWZpbmUgS0VZX1BST0czCQkyMDIKKyNkZWZpbmUgS0VZX1BST0c0CQkyMDMKKyNkZWZpbmUgS0VZX0RBU0hCT0FSRAkJMjA0CS8qIEFMIERhc2hib2FyZCAqLworI2RlZmluZSBLRVlfU1VTUEVORAkJMjA1CisjZGVmaW5lIEtFWV9DTE9TRQkJMjA2CS8qIEFDIENsb3NlICovCisjZGVmaW5lIEtFWV9QTEFZCQkyMDcKKyNkZWZpbmUgS0VZX0ZBU1RGT1JXQVJECQkyMDgKKyNkZWZpbmUgS0VZX0JBU1NCT09TVAkJMjA5CisjZGVmaW5lIEtFWV9QUklOVAkJMjEwCS8qIEFDIFByaW50ICovCisjZGVmaW5lIEtFWV9IUAkJCTIxMQorI2RlZmluZSBLRVlfQ0FNRVJBCQkyMTIKKyNkZWZpbmUgS0VZX1NPVU5ECQkyMTMKKyNkZWZpbmUgS0VZX1FVRVNUSU9OCQkyMTQKKyNkZWZpbmUgS0VZX0VNQUlMCQkyMTUKKyNkZWZpbmUgS0VZX0NIQVQJCTIxNgorI2RlZmluZSBLRVlfU0VBUkNICQkyMTcKKyNkZWZpbmUgS0VZX0NPTk5FQ1QJCTIxOAorI2RlZmluZSBLRVlfRklOQU5DRQkJMjE5CS8qIEFMIENoZWNrYm9vay9GaW5hbmNlICovCisjZGVmaW5lIEtFWV9TUE9SVAkJMjIwCisjZGVmaW5lIEtFWV9TSE9QCQkyMjEKKyNkZWZpbmUgS0VZX0FMVEVSQVNFCQkyMjIKKyNkZWZpbmUgS0VZX0NBTkNFTAkJMjIzCS8qIEFDIENhbmNlbCAqLworI2RlZmluZSBLRVlfQlJJR0hUTkVTU0RPV04JMjI0CisjZGVmaW5lIEtFWV9CUklHSFRORVNTVVAJMjI1CisjZGVmaW5lIEtFWV9NRURJQQkJMjI2CisKKyNkZWZpbmUgS0VZX1NXSVRDSFZJREVPTU9ERQkyMjcJLyogQ3ljbGUgYmV0d2VlbiBhdmFpbGFibGUgdmlkZW8KKwkJCQkJICAgb3V0cHV0cyAoTW9uaXRvci9MQ0QvVFYtb3V0L2V0YykgKi8KKyNkZWZpbmUgS0VZX0tCRElMTFVNVE9HR0xFCTIyOAorI2RlZmluZSBLRVlfS0JESUxMVU1ET1dOCTIyOQorI2RlZmluZSBLRVlfS0JESUxMVU1VUAkJMjMwCisKKyNkZWZpbmUgS0VZX1NFTkQJCTIzMQkvKiBBQyBTZW5kICovCisjZGVmaW5lIEtFWV9SRVBMWQkJMjMyCS8qIEFDIFJlcGx5ICovCisjZGVmaW5lIEtFWV9GT1JXQVJETUFJTAkJMjMzCS8qIEFDIEZvcndhcmQgTXNnICovCisjZGVmaW5lIEtFWV9TQVZFCQkyMzQJLyogQUMgU2F2ZSAqLworI2RlZmluZSBLRVlfRE9DVU1FTlRTCQkyMzUKKworI2RlZmluZSBLRVlfQkFUVEVSWQkJMjM2CisKKyNkZWZpbmUgS0VZX0JMVUVUT09USAkJMjM3CisjZGVmaW5lIEtFWV9XTEFOCQkyMzgKKyNkZWZpbmUgS0VZX1VXQgkJCTIzOQorCisjZGVmaW5lIEtFWV9VTktOT1dOCQkyNDAKKworI2RlZmluZSBLRVlfVklERU9fTkVYVAkJMjQxCS8qIGRyaXZlIG5leHQgdmlkZW8gc291cmNlICovCisjZGVmaW5lIEtFWV9WSURFT19QUkVWCQkyNDIJLyogZHJpdmUgcHJldmlvdXMgdmlkZW8gc291cmNlICovCisjZGVmaW5lIEtFWV9CUklHSFRORVNTX0NZQ0xFCTI0MwkvKiBicmlnaHRuZXNzIHVwLCBhZnRlciBtYXggaXMgbWluICovCisjZGVmaW5lIEtFWV9CUklHSFRORVNTX1pFUk8JMjQ0CS8qIGJyaWdodG5lc3Mgb2ZmLCB1c2UgYW1iaWVudCAqLworI2RlZmluZSBLRVlfRElTUExBWV9PRkYJCTI0NQkvKiBkaXNwbGF5IGRldmljZSB0byBvZmYgc3RhdGUgKi8KKworI2RlZmluZSBLRVlfV0lNQVgJCTI0NgorI2RlZmluZSBLRVlfUkZLSUxMCQkyNDcJLyogS2V5IHRoYXQgY29udHJvbHMgYWxsIHJhZGlvcyAqLworCisjZGVmaW5lIEtFWV9NSUNNVVRFCQkyNDgJLyogTXV0ZSAvIHVubXV0ZSB0aGUgbWljcm9waG9uZSAqLworCisvKiBDb2RlIDI1NSBpcyByZXNlcnZlZCBmb3Igc3BlY2lhbCBuZWVkcyBvZiBBVCBrZXlib2FyZCBkcml2ZXIgKi8KKworI2RlZmluZSBCVE5fTUlTQwkJMHgxMDAKKyNkZWZpbmUgQlROXzAJCQkweDEwMAorI2RlZmluZSBCVE5fMQkJCTB4MTAxCisjZGVmaW5lIEJUTl8yCQkJMHgxMDIKKyNkZWZpbmUgQlROXzMJCQkweDEwMworI2RlZmluZSBCVE5fNAkJCTB4MTA0CisjZGVmaW5lIEJUTl81CQkJMHgxMDUKKyNkZWZpbmUgQlROXzYJCQkweDEwNgorI2RlZmluZSBCVE5fNwkJCTB4MTA3CisjZGVmaW5lIEJUTl84CQkJMHgxMDgKKyNkZWZpbmUgQlROXzkJCQkweDEwOQorCisjZGVmaW5lIEJUTl9NT1VTRQkJMHgxMTAKKyNkZWZpbmUgQlROX0xFRlQJCTB4MTEwCisjZGVmaW5lIEJUTl9SSUdIVAkJMHgxMTEKKyNkZWZpbmUgQlROX01JRERMRQkJMHgxMTIKKyNkZWZpbmUgQlROX1NJREUJCTB4MTEzCisjZGVmaW5lIEJUTl9FWFRSQQkJMHgxMTQKKyNkZWZpbmUgQlROX0ZPUldBUkQJCTB4MTE1CisjZGVmaW5lIEJUTl9CQUNLCQkweDExNgorI2RlZmluZSBCVE5fVEFTSwkJMHgxMTcKKworI2RlZmluZSBCVE5fSk9ZU1RJQ0sJCTB4MTIwCisjZGVmaW5lIEJUTl9UUklHR0VSCQkweDEyMAorI2RlZmluZSBCVE5fVEhVTUIJCTB4MTIxCisjZGVmaW5lIEJUTl9USFVNQjIJCTB4MTIyCisjZGVmaW5lIEJUTl9UT1AJCQkweDEyMworI2RlZmluZSBCVE5fVE9QMgkJMHgxMjQKKyNkZWZpbmUgQlROX1BJTktJRQkJMHgxMjUKKyNkZWZpbmUgQlROX0JBU0UJCTB4MTI2CisjZGVmaW5lIEJUTl9CQVNFMgkJMHgxMjcKKyNkZWZpbmUgQlROX0JBU0UzCQkweDEyOAorI2RlZmluZSBCVE5fQkFTRTQJCTB4MTI5CisjZGVmaW5lIEJUTl9CQVNFNQkJMHgxMmEKKyNkZWZpbmUgQlROX0JBU0U2CQkweDEyYgorI2RlZmluZSBCVE5fREVBRAkJMHgxMmYKKworI2RlZmluZSBCVE5fR0FNRVBBRAkJMHgxMzAKKyNkZWZpbmUgQlROX0EJCQkweDEzMAorI2RlZmluZSBCVE5fQgkJCTB4MTMxCisjZGVmaW5lIEJUTl9DCQkJMHgxMzIKKyNkZWZpbmUgQlROX1gJCQkweDEzMworI2RlZmluZSBCVE5fWQkJCTB4MTM0CisjZGVmaW5lIEJUTl9aCQkJMHgxMzUKKyNkZWZpbmUgQlROX1RMCQkJMHgxMzYKKyNkZWZpbmUgQlROX1RSCQkJMHgxMzcKKyNkZWZpbmUgQlROX1RMMgkJCTB4MTM4CisjZGVmaW5lIEJUTl9UUjIJCQkweDEzOQorI2RlZmluZSBCVE5fU0VMRUNUCQkweDEzYQorI2RlZmluZSBCVE5fU1RBUlQJCTB4MTNiCisjZGVmaW5lIEJUTl9NT0RFCQkweDEzYworI2RlZmluZSBCVE5fVEhVTUJMCQkweDEzZAorI2RlZmluZSBCVE5fVEhVTUJSCQkweDEzZQorCisjZGVmaW5lIEJUTl9ESUdJCQkweDE0MAorI2RlZmluZSBCVE5fVE9PTF9QRU4JCTB4MTQwCisjZGVmaW5lIEJUTl9UT09MX1JVQkJFUgkJMHgxNDEKKyNkZWZpbmUgQlROX1RPT0xfQlJVU0gJCTB4MTQyCisjZGVmaW5lIEJUTl9UT09MX1BFTkNJTAkJMHgxNDMKKyNkZWZpbmUgQlROX1RPT0xfQUlSQlJVU0gJMHgxNDQKKyNkZWZpbmUgQlROX1RPT0xfRklOR0VSCQkweDE0NQorI2RlZmluZSBCVE5fVE9PTF9NT1VTRQkJMHgxNDYKKyNkZWZpbmUgQlROX1RPT0xfTEVOUwkJMHgxNDcKKyNkZWZpbmUgQlROX1RPT0xfUVVJTlRUQVAJMHgxNDgJLyogRml2ZSBmaW5nZXJzIG9uIHRyYWNrcGFkICovCisjZGVmaW5lIEJUTl9UT1VDSAkJMHgxNGEKKyNkZWZpbmUgQlROX1NUWUxVUwkJMHgxNGIKKyNkZWZpbmUgQlROX1NUWUxVUzIJCTB4MTRjCisjZGVmaW5lIEJUTl9UT09MX0RPVUJMRVRBUAkweDE0ZAorI2RlZmluZSBCVE5fVE9PTF9UUklQTEVUQVAJMHgxNGUKKyNkZWZpbmUgQlROX1RPT0xfUVVBRFRBUAkweDE0ZgkvKiBGb3VyIGZpbmdlcnMgb24gdHJhY2twYWQgKi8KKworI2RlZmluZSBCVE5fV0hFRUwJCTB4MTUwCisjZGVmaW5lIEJUTl9HRUFSX0RPV04JCTB4MTUwCisjZGVmaW5lIEJUTl9HRUFSX1VQCQkweDE1MQorCisjZGVmaW5lIEtFWV9PSwkJCTB4MTYwCisjZGVmaW5lIEtFWV9TRUxFQ1QJCTB4MTYxCisjZGVmaW5lIEtFWV9HT1RPCQkweDE2MgorI2RlZmluZSBLRVlfQ0xFQVIJCTB4MTYzCisjZGVmaW5lIEtFWV9QT1dFUjIJCTB4MTY0CisjZGVmaW5lIEtFWV9PUFRJT04JCTB4MTY1CisjZGVmaW5lIEtFWV9JTkZPCQkweDE2NgkvKiBBTCBPRU0gRmVhdHVyZXMvVGlwcy9UdXRvcmlhbCAqLworI2RlZmluZSBLRVlfVElNRQkJMHgxNjcKKyNkZWZpbmUgS0VZX1ZFTkRPUgkJMHgxNjgKKyNkZWZpbmUgS0VZX0FSQ0hJVkUJCTB4MTY5CisjZGVmaW5lIEtFWV9QUk9HUkFNCQkweDE2YQkvKiBNZWRpYSBTZWxlY3QgUHJvZ3JhbSBHdWlkZSAqLworI2RlZmluZSBLRVlfQ0hBTk5FTAkJMHgxNmIKKyNkZWZpbmUgS0VZX0ZBVk9SSVRFUwkJMHgxNmMKKyNkZWZpbmUgS0VZX0VQRwkJCTB4MTZkCisjZGVmaW5lIEtFWV9QVlIJCQkweDE2ZQkvKiBNZWRpYSBTZWxlY3QgSG9tZSAqLworI2RlZmluZSBLRVlfTUhQCQkJMHgxNmYKKyNkZWZpbmUgS0VZX0xBTkdVQUdFCQkweDE3MAorI2RlZmluZSBLRVlfVElUTEUJCTB4MTcxCisjZGVmaW5lIEtFWV9TVUJUSVRMRQkJMHgxNzIKKyNkZWZpbmUgS0VZX0FOR0xFCQkweDE3MworI2RlZmluZSBLRVlfWk9PTQkJMHgxNzQKKyNkZWZpbmUgS0VZX01PREUJCTB4MTc1CisjZGVmaW5lIEtFWV9LRVlCT0FSRAkJMHgxNzYKKyNkZWZpbmUgS0VZX1NDUkVFTgkJMHgxNzcKKyNkZWZpbmUgS0VZX1BDCQkJMHgxNzgJLyogTWVkaWEgU2VsZWN0IENvbXB1dGVyICovCisjZGVmaW5lIEtFWV9UVgkJCTB4MTc5CS8qIE1lZGlhIFNlbGVjdCBUViAqLworI2RlZmluZSBLRVlfVFYyCQkJMHgxN2EJLyogTWVkaWEgU2VsZWN0IENhYmxlICovCisjZGVmaW5lIEtFWV9WQ1IJCQkweDE3YgkvKiBNZWRpYSBTZWxlY3QgVkNSICovCisjZGVmaW5lIEtFWV9WQ1IyCQkweDE3YwkvKiBWQ1IgUGx1cyAqLworI2RlZmluZSBLRVlfU0FUCQkJMHgxN2QJLyogTWVkaWEgU2VsZWN0IFNhdGVsbGl0ZSAqLworI2RlZmluZSBLRVlfU0FUMgkJMHgxN2UKKyNkZWZpbmUgS0VZX0NECQkJMHgxN2YJLyogTWVkaWEgU2VsZWN0IENEICovCisjZGVmaW5lIEtFWV9UQVBFCQkweDE4MAkvKiBNZWRpYSBTZWxlY3QgVGFwZSAqLworI2RlZmluZSBLRVlfUkFESU8JCTB4MTgxCisjZGVmaW5lIEtFWV9UVU5FUgkJMHgxODIJLyogTWVkaWEgU2VsZWN0IFR1bmVyICovCisjZGVmaW5lIEtFWV9QTEFZRVIJCTB4MTgzCisjZGVmaW5lIEtFWV9URVhUCQkweDE4NAorI2RlZmluZSBLRVlfRFZECQkJMHgxODUJLyogTWVkaWEgU2VsZWN0IERWRCAqLworI2RlZmluZSBLRVlfQVVYCQkJMHgxODYKKyNkZWZpbmUgS0VZX01QMwkJCTB4MTg3CisjZGVmaW5lIEtFWV9BVURJTwkJMHgxODgJLyogQUwgQXVkaW8gQnJvd3NlciAqLworI2RlZmluZSBLRVlfVklERU8JCTB4MTg5CS8qIEFMIE1vdmllIEJyb3dzZXIgKi8KKyNkZWZpbmUgS0VZX0RJUkVDVE9SWQkJMHgxOGEKKyNkZWZpbmUgS0VZX0xJU1QJCTB4MThiCisjZGVmaW5lIEtFWV9NRU1PCQkweDE4YwkvKiBNZWRpYSBTZWxlY3QgTWVzc2FnZXMgKi8KKyNkZWZpbmUgS0VZX0NBTEVOREFSCQkweDE4ZAorI2RlZmluZSBLRVlfUkVECQkJMHgxOGUKKyNkZWZpbmUgS0VZX0dSRUVOCQkweDE4ZgorI2RlZmluZSBLRVlfWUVMTE9XCQkweDE5MAorI2RlZmluZSBLRVlfQkxVRQkJMHgxOTEKKyNkZWZpbmUgS0VZX0NIQU5ORUxVUAkJMHgxOTIJLyogQ2hhbm5lbCBJbmNyZW1lbnQgKi8KKyNkZWZpbmUgS0VZX0NIQU5ORUxET1dOCQkweDE5MwkvKiBDaGFubmVsIERlY3JlbWVudCAqLworI2RlZmluZSBLRVlfRklSU1QJCTB4MTk0CisjZGVmaW5lIEtFWV9MQVNUCQkweDE5NQkvKiBSZWNhbGwgTGFzdCAqLworI2RlZmluZSBLRVlfQUIJCQkweDE5NgorI2RlZmluZSBLRVlfTkVYVAkJMHgxOTcKKyNkZWZpbmUgS0VZX1JFU1RBUlQJCTB4MTk4CisjZGVmaW5lIEtFWV9TTE9XCQkweDE5OQorI2RlZmluZSBLRVlfU0hVRkZMRQkJMHgxOWEKKyNkZWZpbmUgS0VZX0JSRUFLCQkweDE5YgorI2RlZmluZSBLRVlfUFJFVklPVVMJCTB4MTljCisjZGVmaW5lIEtFWV9ESUdJVFMJCTB4MTlkCisjZGVmaW5lIEtFWV9URUVOCQkweDE5ZQorI2RlZmluZSBLRVlfVFdFTgkJMHgxOWYKKyNkZWZpbmUgS0VZX1ZJREVPUEhPTkUJCTB4MWEwCS8qIE1lZGlhIFNlbGVjdCBWaWRlbyBQaG9uZSAqLworI2RlZmluZSBLRVlfR0FNRVMJCTB4MWExCS8qIE1lZGlhIFNlbGVjdCBHYW1lcyAqLworI2RlZmluZSBLRVlfWk9PTUlOCQkweDFhMgkvKiBBQyBab29tIEluICovCisjZGVmaW5lIEtFWV9aT09NT1VUCQkweDFhMwkvKiBBQyBab29tIE91dCAqLworI2RlZmluZSBLRVlfWk9PTVJFU0VUCQkweDFhNAkvKiBBQyBab29tICovCisjZGVmaW5lIEtFWV9XT1JEUFJPQ0VTU09SCTB4MWE1CS8qIEFMIFdvcmQgUHJvY2Vzc29yICovCisjZGVmaW5lIEtFWV9FRElUT1IJCTB4MWE2CS8qIEFMIFRleHQgRWRpdG9yICovCisjZGVmaW5lIEtFWV9TUFJFQURTSEVFVAkJMHgxYTcJLyogQUwgU3ByZWFkc2hlZXQgKi8KKyNkZWZpbmUgS0VZX0dSQVBISUNTRURJVE9SCTB4MWE4CS8qIEFMIEdyYXBoaWNzIEVkaXRvciAqLworI2RlZmluZSBLRVlfUFJFU0VOVEFUSU9OCTB4MWE5CS8qIEFMIFByZXNlbnRhdGlvbiBBcHAgKi8KKyNkZWZpbmUgS0VZX0RBVEFCQVNFCQkweDFhYQkvKiBBTCBEYXRhYmFzZSBBcHAgKi8KKyNkZWZpbmUgS0VZX05FV1MJCTB4MWFiCS8qIEFMIE5ld3NyZWFkZXIgKi8KKyNkZWZpbmUgS0VZX1ZPSUNFTUFJTAkJMHgxYWMJLyogQUwgVm9pY2VtYWlsICovCisjZGVmaW5lIEtFWV9BRERSRVNTQk9PSwkJMHgxYWQJLyogQUwgQ29udGFjdHMvQWRkcmVzcyBCb29rICovCisjZGVmaW5lIEtFWV9NRVNTRU5HRVIJCTB4MWFlCS8qIEFMIEluc3RhbnQgTWVzc2FnaW5nICovCisjZGVmaW5lIEtFWV9ESVNQTEFZVE9HR0xFCTB4MWFmCS8qIFR1cm4gZGlzcGxheSAoTENEKSBvbiBhbmQgb2ZmICovCisjZGVmaW5lIEtFWV9TUEVMTENIRUNLCQkweDFiMCAgIC8qIEFMIFNwZWxsIENoZWNrICovCisjZGVmaW5lIEtFWV9MT0dPRkYJCTB4MWIxICAgLyogQUwgTG9nb2ZmICovCisKKyNkZWZpbmUgS0VZX0RPTExBUgkJMHgxYjIKKyNkZWZpbmUgS0VZX0VVUk8JCTB4MWIzCisKKyNkZWZpbmUgS0VZX0ZSQU1FQkFDSwkJMHgxYjQJLyogQ29uc3VtZXIgLSB0cmFuc3BvcnQgY29udHJvbHMgKi8KKyNkZWZpbmUgS0VZX0ZSQU1FRk9SV0FSRAkweDFiNQorI2RlZmluZSBLRVlfQ09OVEVYVF9NRU5VCTB4MWI2CS8qIEdlbkRlc2MgLSBzeXN0ZW0gY29udGV4dCBtZW51ICovCisjZGVmaW5lIEtFWV9NRURJQV9SRVBFQVQJMHgxYjcJLyogQ29uc3VtZXIgLSB0cmFuc3BvcnQgY29udHJvbCAqLworI2RlZmluZSBLRVlfMTBDSEFOTkVMU1VQCTB4MWI4CS8qIDEwIGNoYW5uZWxzIHVwICgxMCspICovCisjZGVmaW5lIEtFWV8xMENIQU5ORUxTRE9XTgkweDFiOQkvKiAxMCBjaGFubmVscyBkb3duICgxMC0pICovCisjZGVmaW5lIEtFWV9JTUFHRVMJCTB4MWJhCS8qIEFMIEltYWdlIEJyb3dzZXIgKi8KKworI2RlZmluZSBLRVlfREVMX0VPTAkJMHgxYzAKKyNkZWZpbmUgS0VZX0RFTF9FT1MJCTB4MWMxCisjZGVmaW5lIEtFWV9JTlNfTElORQkJMHgxYzIKKyNkZWZpbmUgS0VZX0RFTF9MSU5FCQkweDFjMworCisjZGVmaW5lIEtFWV9GTgkJCTB4MWQwCisjZGVmaW5lIEtFWV9GTl9FU0MJCTB4MWQxCisjZGVmaW5lIEtFWV9GTl9GMQkJMHgxZDIKKyNkZWZpbmUgS0VZX0ZOX0YyCQkweDFkMworI2RlZmluZSBLRVlfRk5fRjMJCTB4MWQ0CisjZGVmaW5lIEtFWV9GTl9GNAkJMHgxZDUKKyNkZWZpbmUgS0VZX0ZOX0Y1CQkweDFkNgorI2RlZmluZSBLRVlfRk5fRjYJCTB4MWQ3CisjZGVmaW5lIEtFWV9GTl9GNwkJMHgxZDgKKyNkZWZpbmUgS0VZX0ZOX0Y4CQkweDFkOQorI2RlZmluZSBLRVlfRk5fRjkJCTB4MWRhCisjZGVmaW5lIEtFWV9GTl9GMTAJCTB4MWRiCisjZGVmaW5lIEtFWV9GTl9GMTEJCTB4MWRjCisjZGVmaW5lIEtFWV9GTl9GMTIJCTB4MWRkCisjZGVmaW5lIEtFWV9GTl8xCQkweDFkZQorI2RlZmluZSBLRVlfRk5fMgkJMHgxZGYKKyNkZWZpbmUgS0VZX0ZOX0QJCTB4MWUwCisjZGVmaW5lIEtFWV9GTl9FCQkweDFlMQorI2RlZmluZSBLRVlfRk5fRgkJMHgxZTIKKyNkZWZpbmUgS0VZX0ZOX1MJCTB4MWUzCisjZGVmaW5lIEtFWV9GTl9CCQkweDFlNAorCisjZGVmaW5lIEtFWV9CUkxfRE9UMQkJMHgxZjEKKyNkZWZpbmUgS0VZX0JSTF9ET1QyCQkweDFmMgorI2RlZmluZSBLRVlfQlJMX0RPVDMJCTB4MWYzCisjZGVmaW5lIEtFWV9CUkxfRE9UNAkJMHgxZjQKKyNkZWZpbmUgS0VZX0JSTF9ET1Q1CQkweDFmNQorI2RlZmluZSBLRVlfQlJMX0RPVDYJCTB4MWY2CisjZGVmaW5lIEtFWV9CUkxfRE9UNwkJMHgxZjcKKyNkZWZpbmUgS0VZX0JSTF9ET1Q4CQkweDFmOAorI2RlZmluZSBLRVlfQlJMX0RPVDkJCTB4MWY5CisjZGVmaW5lIEtFWV9CUkxfRE9UMTAJCTB4MWZhCisKKyNkZWZpbmUgS0VZX05VTUVSSUNfMAkJMHgyMDAJLyogdXNlZCBieSBwaG9uZXMsIHJlbW90ZSBjb250cm9scywgKi8KKyNkZWZpbmUgS0VZX05VTUVSSUNfMQkJMHgyMDEJLyogYW5kIG90aGVyIGtleXBhZHMgKi8KKyNkZWZpbmUgS0VZX05VTUVSSUNfMgkJMHgyMDIKKyNkZWZpbmUgS0VZX05VTUVSSUNfMwkJMHgyMDMKKyNkZWZpbmUgS0VZX05VTUVSSUNfNAkJMHgyMDQKKyNkZWZpbmUgS0VZX05VTUVSSUNfNQkJMHgyMDUKKyNkZWZpbmUgS0VZX05VTUVSSUNfNgkJMHgyMDYKKyNkZWZpbmUgS0VZX05VTUVSSUNfNwkJMHgyMDcKKyNkZWZpbmUgS0VZX05VTUVSSUNfOAkJMHgyMDgKKyNkZWZpbmUgS0VZX05VTUVSSUNfOQkJMHgyMDkKKyNkZWZpbmUgS0VZX05VTUVSSUNfU1RBUgkweDIwYQorI2RlZmluZSBLRVlfTlVNRVJJQ19QT1VORAkweDIwYgorCisjZGVmaW5lIEtFWV9DQU1FUkFfRk9DVVMJMHgyMTAKKyNkZWZpbmUgS0VZX1dQU19CVVRUT04JCTB4MjExCS8qIFdpRmkgUHJvdGVjdGVkIFNldHVwIGtleSAqLworCisjZGVmaW5lIEtFWV9UT1VDSFBBRF9UT0dHTEUJMHgyMTIJLyogUmVxdWVzdCBzd2l0Y2ggdG91Y2hwYWQgb24gb3Igb2ZmICovCisjZGVmaW5lIEtFWV9UT1VDSFBBRF9PTgkJMHgyMTMKKyNkZWZpbmUgS0VZX1RPVUNIUEFEX09GRgkweDIxNAorCisjZGVmaW5lIEtFWV9DQU1FUkFfWk9PTUlOCTB4MjE1CisjZGVmaW5lIEtFWV9DQU1FUkFfWk9PTU9VVAkweDIxNgorI2RlZmluZSBLRVlfQ0FNRVJBX1VQCQkweDIxNworI2RlZmluZSBLRVlfQ0FNRVJBX0RPV04JCTB4MjE4CisjZGVmaW5lIEtFWV9DQU1FUkFfTEVGVAkJMHgyMTkKKyNkZWZpbmUgS0VZX0NBTUVSQV9SSUdIVAkweDIxYQorCisjZGVmaW5lIEJUTl9UUklHR0VSX0hBUFBZCQkweDJjMAorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTEJCTB4MmMwCisjZGVmaW5lIEJUTl9UUklHR0VSX0hBUFBZMgkJMHgyYzEKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkzCQkweDJjMgorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTQJCTB4MmMzCisjZGVmaW5lIEJUTl9UUklHR0VSX0hBUFBZNQkJMHgyYzQKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFk2CQkweDJjNQorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTcJCTB4MmM2CisjZGVmaW5lIEJUTl9UUklHR0VSX0hBUFBZOAkJMHgyYzcKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFk5CQkweDJjOAorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTEwCQkweDJjOQorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTExCQkweDJjYQorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTEyCQkweDJjYgorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTEzCQkweDJjYworI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTE0CQkweDJjZAorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTE1CQkweDJjZQorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTE2CQkweDJjZgorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTE3CQkweDJkMAorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTE4CQkweDJkMQorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTE5CQkweDJkMgorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTIwCQkweDJkMworI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTIxCQkweDJkNAorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTIyCQkweDJkNQorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTIzCQkweDJkNgorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTI0CQkweDJkNworI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTI1CQkweDJkOAorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTI2CQkweDJkOQorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTI3CQkweDJkYQorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTI4CQkweDJkYgorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTI5CQkweDJkYworI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTMwCQkweDJkZAorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTMxCQkweDJkZQorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTMyCQkweDJkZgorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTMzCQkweDJlMAorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTM0CQkweDJlMQorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTM1CQkweDJlMgorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTM2CQkweDJlMworI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTM3CQkweDJlNAorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTM4CQkweDJlNQorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTM5CQkweDJlNgorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTQwCQkweDJlNworCisvKiBXZSBhdm9pZCBsb3cgY29tbW9uIGtleXMgaW4gbW9kdWxlIGFsaWFzZXMgc28gdGhleSBkb24ndCBnZXQgaHVnZS4gKi8KKyNkZWZpbmUgS0VZX01JTl9JTlRFUkVTVElORwlLRVlfTVVURQorI2RlZmluZSBLRVlfTUFYCQkJMHgyZmYKKyNkZWZpbmUgS0VZX0NOVAkJCShLRVlfTUFYKzEpCisKKy8qCisgKiBSZWxhdGl2ZSBheGVzCisgKi8KKworI2RlZmluZSBSRUxfWAkJCTB4MDAKKyNkZWZpbmUgUkVMX1kJCQkweDAxCisjZGVmaW5lIFJFTF9aCQkJMHgwMgorI2RlZmluZSBSRUxfUlgJCQkweDAzCisjZGVmaW5lIFJFTF9SWQkJCTB4MDQKKyNkZWZpbmUgUkVMX1JaCQkJMHgwNQorI2RlZmluZSBSRUxfSFdIRUVMCQkweDA2CisjZGVmaW5lIFJFTF9ESUFMCQkweDA3CisjZGVmaW5lIFJFTF9XSEVFTAkJMHgwOAorI2RlZmluZSBSRUxfTUlTQwkJMHgwOQorI2RlZmluZSBSRUxfTUFYCQkJMHgwZgorI2RlZmluZSBSRUxfQ05UCQkJKFJFTF9NQVgrMSkKKworLyoKKyAqIEFic29sdXRlIGF4ZXMKKyAqLworCisjZGVmaW5lIEFCU19YCQkJMHgwMAorI2RlZmluZSBBQlNfWQkJCTB4MDEKKyNkZWZpbmUgQUJTX1oJCQkweDAyCisjZGVmaW5lIEFCU19SWAkJCTB4MDMKKyNkZWZpbmUgQUJTX1JZCQkJMHgwNAorI2RlZmluZSBBQlNfUloJCQkweDA1CisjZGVmaW5lIEFCU19USFJPVFRMRQkJMHgwNgorI2RlZmluZSBBQlNfUlVEREVSCQkweDA3CisjZGVmaW5lIEFCU19XSEVFTAkJMHgwOAorI2RlZmluZSBBQlNfR0FTCQkJMHgwOQorI2RlZmluZSBBQlNfQlJBS0UJCTB4MGEKKyNkZWZpbmUgQUJTX0hBVDBYCQkweDEwCisjZGVmaW5lIEFCU19IQVQwWQkJMHgxMQorI2RlZmluZSBBQlNfSEFUMVgJCTB4MTIKKyNkZWZpbmUgQUJTX0hBVDFZCQkweDEzCisjZGVmaW5lIEFCU19IQVQyWAkJMHgxNAorI2RlZmluZSBBQlNfSEFUMlkJCTB4MTUKKyNkZWZpbmUgQUJTX0hBVDNYCQkweDE2CisjZGVmaW5lIEFCU19IQVQzWQkJMHgxNworI2RlZmluZSBBQlNfUFJFU1NVUkUJCTB4MTgKKyNkZWZpbmUgQUJTX0RJU1RBTkNFCQkweDE5CisjZGVmaW5lIEFCU19USUxUX1gJCTB4MWEKKyNkZWZpbmUgQUJTX1RJTFRfWQkJMHgxYgorI2RlZmluZSBBQlNfVE9PTF9XSURUSAkJMHgxYworCisjZGVmaW5lIEFCU19WT0xVTUUJCTB4MjAKKworI2RlZmluZSBBQlNfTUlTQwkJMHgyOAorCisjZGVmaW5lIEFCU19NVF9TTE9UCQkweDJmCS8qIE1UIHNsb3QgYmVpbmcgbW9kaWZpZWQgKi8KKyNkZWZpbmUgQUJTX01UX1RPVUNIX01BSk9SCTB4MzAJLyogTWFqb3IgYXhpcyBvZiB0b3VjaGluZyBlbGxpcHNlICovCisjZGVmaW5lIEFCU19NVF9UT1VDSF9NSU5PUgkweDMxCS8qIE1pbm9yIGF4aXMgKG9taXQgaWYgY2lyY3VsYXIpICovCisjZGVmaW5lIEFCU19NVF9XSURUSF9NQUpPUgkweDMyCS8qIE1ham9yIGF4aXMgb2YgYXBwcm9hY2hpbmcgZWxsaXBzZSAqLworI2RlZmluZSBBQlNfTVRfV0lEVEhfTUlOT1IJMHgzMwkvKiBNaW5vciBheGlzIChvbWl0IGlmIGNpcmN1bGFyKSAqLworI2RlZmluZSBBQlNfTVRfT1JJRU5UQVRJT04JMHgzNAkvKiBFbGxpcHNlIG9yaWVudGF0aW9uICovCisjZGVmaW5lIEFCU19NVF9QT1NJVElPTl9YCTB4MzUJLyogQ2VudGVyIFggZWxsaXBzZSBwb3NpdGlvbiAqLworI2RlZmluZSBBQlNfTVRfUE9TSVRJT05fWQkweDM2CS8qIENlbnRlciBZIGVsbGlwc2UgcG9zaXRpb24gKi8KKyNkZWZpbmUgQUJTX01UX1RPT0xfVFlQRQkweDM3CS8qIFR5cGUgb2YgdG91Y2hpbmcgZGV2aWNlICovCisjZGVmaW5lIEFCU19NVF9CTE9CX0lECQkweDM4CS8qIEdyb3VwIGEgc2V0IG9mIHBhY2tldHMgYXMgYSBibG9iICovCisjZGVmaW5lIEFCU19NVF9UUkFDS0lOR19JRAkweDM5CS8qIFVuaXF1ZSBJRCBvZiBpbml0aWF0ZWQgY29udGFjdCAqLworI2RlZmluZSBBQlNfTVRfUFJFU1NVUkUJCTB4M2EJLyogUHJlc3N1cmUgb24gY29udGFjdCBhcmVhICovCisjZGVmaW5lIEFCU19NVF9ESVNUQU5DRQkJMHgzYgkvKiBDb250YWN0IGhvdmVyIGRpc3RhbmNlICovCisKKworI2RlZmluZSBBQlNfTUFYCQkJMHgzZgorI2RlZmluZSBBQlNfQ05UCQkJKEFCU19NQVgrMSkKKworLyoKKyAqIFN3aXRjaCBldmVudHMKKyAqLworCisjZGVmaW5lIFNXX0xJRAkJCTB4MDAgIC8qIHNldCA9IGxpZCBzaHV0ICovCisjZGVmaW5lIFNXX1RBQkxFVF9NT0RFCQkweDAxICAvKiBzZXQgPSB0YWJsZXQgbW9kZSAqLworI2RlZmluZSBTV19IRUFEUEhPTkVfSU5TRVJUCTB4MDIgIC8qIHNldCA9IGluc2VydGVkICovCisjZGVmaW5lIFNXX1JGS0lMTF9BTEwJCTB4MDMgIC8qIHJma2lsbCBtYXN0ZXIgc3dpdGNoLCB0eXBlICJhbnkiCisJCQkJCSBzZXQgPSByYWRpbyBlbmFibGVkICovCisjZGVmaW5lIFNXX1JBRElPCQlTV19SRktJTExfQUxMCS8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgU1dfTUlDUk9QSE9ORV9JTlNFUlQJMHgwNCAgLyogc2V0ID0gaW5zZXJ0ZWQgKi8KKyNkZWZpbmUgU1dfRE9DSwkJCTB4MDUgIC8qIHNldCA9IHBsdWdnZWQgaW50byBkb2NrICovCisjZGVmaW5lIFNXX0xJTkVPVVRfSU5TRVJUCTB4MDYgIC8qIHNldCA9IGluc2VydGVkICovCisjZGVmaW5lIFNXX0pBQ0tfUEhZU0lDQUxfSU5TRVJUIDB4MDcgIC8qIHNldCA9IG1lY2hhbmljYWwgc3dpdGNoIHNldCAqLworI2RlZmluZSBTV19WSURFT09VVF9JTlNFUlQJMHgwOCAgLyogc2V0ID0gaW5zZXJ0ZWQgKi8KKyNkZWZpbmUgU1dfQ0FNRVJBX0xFTlNfQ09WRVIJMHgwOSAgLyogc2V0ID0gbGVucyBjb3ZlcmVkICovCisjZGVmaW5lIFNXX0tFWVBBRF9TTElERQkJMHgwYSAgLyogc2V0ID0ga2V5cGFkIHNsaWRlIG91dCAqLworI2RlZmluZSBTV19GUk9OVF9QUk9YSU1JVFkJMHgwYiAgLyogc2V0ID0gZnJvbnQgcHJveGltaXR5IHNlbnNvciBhY3RpdmUgKi8KKyNkZWZpbmUgU1dfUk9UQVRFX0xPQ0sJCTB4MGMgIC8qIHNldCA9IHJvdGF0ZSBsb2NrZWQvZGlzYWJsZWQgKi8KKyNkZWZpbmUgU1dfTElORUlOX0lOU0VSVAkweDBkICAvKiBzZXQgPSBpbnNlcnRlZCAqLworI2RlZmluZSBTV19NQVgJCQkweDBmCisjZGVmaW5lIFNXX0NOVAkJCShTV19NQVgrMSkKKworLyoKKyAqIE1pc2MgZXZlbnRzCisgKi8KKworI2RlZmluZSBNU0NfU0VSSUFMCQkweDAwCisjZGVmaW5lIE1TQ19QVUxTRUxFRAkJMHgwMQorI2RlZmluZSBNU0NfR0VTVFVSRQkJMHgwMgorI2RlZmluZSBNU0NfUkFXCQkJMHgwMworI2RlZmluZSBNU0NfU0NBTgkJMHgwNAorI2RlZmluZSBNU0NfTUFYCQkJMHgwNworI2RlZmluZSBNU0NfQ05UCQkJKE1TQ19NQVgrMSkKKworLyoKKyAqIExFRHMKKyAqLworCisjZGVmaW5lIExFRF9OVU1MCQkweDAwCisjZGVmaW5lIExFRF9DQVBTTAkJMHgwMQorI2RlZmluZSBMRURfU0NST0xMTAkJMHgwMgorI2RlZmluZSBMRURfQ09NUE9TRQkJMHgwMworI2RlZmluZSBMRURfS0FOQQkJMHgwNAorI2RlZmluZSBMRURfU0xFRVAJCTB4MDUKKyNkZWZpbmUgTEVEX1NVU1BFTkQJCTB4MDYKKyNkZWZpbmUgTEVEX01VVEUJCTB4MDcKKyNkZWZpbmUgTEVEX01JU0MJCTB4MDgKKyNkZWZpbmUgTEVEX01BSUwJCTB4MDkKKyNkZWZpbmUgTEVEX0NIQVJHSU5HCQkweDBhCisjZGVmaW5lIExFRF9NQVgJCQkweDBmCisjZGVmaW5lIExFRF9DTlQJCQkoTEVEX01BWCsxKQorCisvKgorICogQXV0b3JlcGVhdCB2YWx1ZXMKKyAqLworCisjZGVmaW5lIFJFUF9ERUxBWQkJMHgwMAorI2RlZmluZSBSRVBfUEVSSU9ECQkweDAxCisjZGVmaW5lIFJFUF9NQVgJCQkweDAxCisjZGVmaW5lIFJFUF9DTlQJCQkoUkVQX01BWCsxKQorCisvKgorICogU291bmRzCisgKi8KKworI2RlZmluZSBTTkRfQ0xJQ0sJCTB4MDAKKyNkZWZpbmUgU05EX0JFTEwJCTB4MDEKKyNkZWZpbmUgU05EX1RPTkUJCTB4MDIKKyNkZWZpbmUgU05EX01BWAkJCTB4MDcKKyNkZWZpbmUgU05EX0NOVAkJCShTTkRfTUFYKzEpCisKKy8qCisgKiBJRHMuCisgKi8KKworI2RlZmluZSBJRF9CVVMJCQkwCisjZGVmaW5lIElEX1ZFTkRPUgkJMQorI2RlZmluZSBJRF9QUk9EVUNUCQkyCisjZGVmaW5lIElEX1ZFUlNJT04JCTMKKworI2RlZmluZSBCVVNfUENJCQkJMHgwMQorI2RlZmluZSBCVVNfSVNBUE5QCQkweDAyCisjZGVmaW5lIEJVU19VU0IJCQkweDAzCisjZGVmaW5lIEJVU19ISUwJCQkweDA0CisjZGVmaW5lIEJVU19CTFVFVE9PVEgJCTB4MDUKKyNkZWZpbmUgQlVTX1ZJUlRVQUwJCTB4MDYKKworI2RlZmluZSBCVVNfSVNBCQkJMHgxMAorI2RlZmluZSBCVVNfSTgwNDIJCTB4MTEKKyNkZWZpbmUgQlVTX1hUS0JECQkweDEyCisjZGVmaW5lIEJVU19SUzIzMgkJMHgxMworI2RlZmluZSBCVVNfR0FNRVBPUlQJCTB4MTQKKyNkZWZpbmUgQlVTX1BBUlBPUlQJCTB4MTUKKyNkZWZpbmUgQlVTX0FNSUdBCQkweDE2CisjZGVmaW5lIEJVU19BREIJCQkweDE3CisjZGVmaW5lIEJVU19JMkMJCQkweDE4CisjZGVmaW5lIEJVU19IT1NUCQkweDE5CisjZGVmaW5lIEJVU19HU0MJCQkweDFBCisjZGVmaW5lIEJVU19BVEFSSQkJMHgxQgorI2RlZmluZSBCVVNfU1BJCQkJMHgxQworCisvKgorICogTVRfVE9PTCB0eXBlcworICovCisjZGVmaW5lIE1UX1RPT0xfRklOR0VSCQkwCisjZGVmaW5lIE1UX1RPT0xfUEVOCQkxCisjZGVmaW5lIE1UX1RPT0xfTUFYCQkxCisKKy8qCisgKiBWYWx1ZXMgZGVzY3JpYmluZyB0aGUgc3RhdHVzIG9mIGEgZm9yY2UtZmVlZGJhY2sgZWZmZWN0CisgKi8KKyNkZWZpbmUgRkZfU1RBVFVTX1NUT1BQRUQJMHgwMAorI2RlZmluZSBGRl9TVEFUVVNfUExBWUlORwkweDAxCisjZGVmaW5lIEZGX1NUQVRVU19NQVgJCTB4MDEKKworLyoKKyAqIFN0cnVjdHVyZXMgdXNlZCBpbiBpb2N0bHMgdG8gdXBsb2FkIGVmZmVjdHMgdG8gYSBkZXZpY2UKKyAqIFRoZXkgYXJlIHBpZWNlcyBvZiBhIGJpZ2dlciBzdHJ1Y3R1cmUgKGNhbGxlZCBmZl9lZmZlY3QpCisgKi8KKworLyoKKyAqIEFsbCBkdXJhdGlvbiB2YWx1ZXMgYXJlIGV4cHJlc3NlZCBpbiBtcy4gVmFsdWVzIGFib3ZlIDMyNzY3IG1zICgweDdmZmYpCisgKiBzaG91bGQgbm90IGJlIHVzZWQgYW5kIGhhdmUgdW5zcGVjaWZpZWQgcmVzdWx0cy4KKyAqLworCisvKioKKyAqIHN0cnVjdCBmZl9yZXBsYXkgLSBkZWZpbmVzIHNjaGVkdWxpbmcgb2YgdGhlIGZvcmNlLWZlZWRiYWNrIGVmZmVjdAorICogQGxlbmd0aDogZHVyYXRpb24gb2YgdGhlIGVmZmVjdAorICogQGRlbGF5OiBkZWxheSBiZWZvcmUgZWZmZWN0IHNob3VsZCBzdGFydCBwbGF5aW5nCisgKi8KK3N0cnVjdCBmZl9yZXBsYXkgeworCV9fdTE2IGxlbmd0aDsKKwlfX3UxNiBkZWxheTsKK307CisKKy8qKgorICogc3RydWN0IGZmX3RyaWdnZXIgLSBkZWZpbmVzIHdoYXQgdHJpZ2dlcnMgdGhlIGZvcmNlLWZlZWRiYWNrIGVmZmVjdAorICogQGJ1dHRvbjogbnVtYmVyIG9mIHRoZSBidXR0b24gdHJpZ2dlcmluZyB0aGUgZWZmZWN0CisgKiBAaW50ZXJ2YWw6IGNvbnRyb2xzIGhvdyBzb29uIHRoZSBlZmZlY3QgY2FuIGJlIHJlLXRyaWdnZXJlZAorICovCitzdHJ1Y3QgZmZfdHJpZ2dlciB7CisJX191MTYgYnV0dG9uOworCV9fdTE2IGludGVydmFsOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZmZfZW52ZWxvcGUgLSBnZW5lcmljIGZvcmNlLWZlZWRiYWNrIGVmZmVjdCBlbnZlbG9wZQorICogQGF0dGFja19sZW5ndGg6IGR1cmF0aW9uIG9mIHRoZSBhdHRhY2sgKG1zKQorICogQGF0dGFja19sZXZlbDogbGV2ZWwgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXR0YWNrCisgKiBAZmFkZV9sZW5ndGg6IGR1cmF0aW9uIG9mIGZhZGUgKG1zKQorICogQGZhZGVfbGV2ZWw6IGxldmVsIGF0IHRoZSBlbmQgb2YgZmFkZQorICoKKyAqIFRoZSBAYXR0YWNrX2xldmVsIGFuZCBAZmFkZV9sZXZlbCBhcmUgYWJzb2x1dGUgdmFsdWVzOyB3aGVuIGFwcGx5aW5nCisgKiBlbnZlbG9wZSBmb3JjZS1mZWVkYmFjayBjb3JlIHdpbGwgY29udmVydCB0byBwb3NpdGl2ZS9uZWdhdGl2ZQorICogdmFsdWUgYmFzZWQgb24gcG9sYXJpdHkgb2YgdGhlIGRlZmF1bHQgbGV2ZWwgb2YgdGhlIGVmZmVjdC4KKyAqIFZhbGlkIHJhbmdlIGZvciB0aGUgYXR0YWNrIGFuZCBmYWRlIGxldmVscyBpcyAweDAwMDAgLSAweDdmZmYKKyAqLworc3RydWN0IGZmX2VudmVsb3BlIHsKKwlfX3UxNiBhdHRhY2tfbGVuZ3RoOworCV9fdTE2IGF0dGFja19sZXZlbDsKKwlfX3UxNiBmYWRlX2xlbmd0aDsKKwlfX3UxNiBmYWRlX2xldmVsOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZmZfY29uc3RhbnRfZWZmZWN0IC0gZGVmaW5lcyBwYXJhbWV0ZXJzIG9mIGEgY29uc3RhbnQgZm9yY2UtZmVlZGJhY2sgZWZmZWN0CisgKiBAbGV2ZWw6IHN0cmVuZ3RoIG9mIHRoZSBlZmZlY3Q7IG1heSBiZSBuZWdhdGl2ZQorICogQGVudmVsb3BlOiBlbnZlbG9wZSBkYXRhCisgKi8KK3N0cnVjdCBmZl9jb25zdGFudF9lZmZlY3QgeworCV9fczE2IGxldmVsOworCXN0cnVjdCBmZl9lbnZlbG9wZSBlbnZlbG9wZTsKK307CisKKy8qKgorICogc3RydWN0IGZmX3JhbXBfZWZmZWN0IC0gZGVmaW5lcyBwYXJhbWV0ZXJzIG9mIGEgcmFtcCBmb3JjZS1mZWVkYmFjayBlZmZlY3QKKyAqIEBzdGFydF9sZXZlbDogYmVnaW5uaW5nIHN0cmVuZ3RoIG9mIHRoZSBlZmZlY3Q7IG1heSBiZSBuZWdhdGl2ZQorICogQGVuZF9sZXZlbDogZmluYWwgc3RyZW5ndGggb2YgdGhlIGVmZmVjdDsgbWF5IGJlIG5lZ2F0aXZlCisgKiBAZW52ZWxvcGU6IGVudmVsb3BlIGRhdGEKKyAqLworc3RydWN0IGZmX3JhbXBfZWZmZWN0IHsKKwlfX3MxNiBzdGFydF9sZXZlbDsKKwlfX3MxNiBlbmRfbGV2ZWw7CisJc3RydWN0IGZmX2VudmVsb3BlIGVudmVsb3BlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZmZfY29uZGl0aW9uX2VmZmVjdCAtIGRlZmluZXMgYSBzcHJpbmcgb3IgZnJpY3Rpb24gZm9yY2UtZmVlZGJhY2sgZWZmZWN0CisgKiBAcmlnaHRfc2F0dXJhdGlvbjogbWF4aW11bSBsZXZlbCB3aGVuIGpveXN0aWNrIG1vdmVkIGFsbCB3YXkgdG8gdGhlIHJpZ2h0CisgKiBAbGVmdF9zYXR1cmF0aW9uOiBzYW1lIGZvciB0aGUgbGVmdCBzaWRlCisgKiBAcmlnaHRfY29lZmY6IGNvbnRyb2xzIGhvdyBmYXN0IHRoZSBmb3JjZSBncm93cyB3aGVuIHRoZSBqb3lzdGljayBtb3ZlcworICoJdG8gdGhlIHJpZ2h0CisgKiBAbGVmdF9jb2VmZjogc2FtZSBmb3IgdGhlIGxlZnQgc2lkZQorICogQGRlYWRiYW5kOiBzaXplIG9mIHRoZSBkZWFkIHpvbmUsIHdoZXJlIG5vIGZvcmNlIGlzIHByb2R1Y2VkCisgKiBAY2VudGVyOiBwb3NpdGlvbiBvZiB0aGUgZGVhZCB6b25lCisgKi8KK3N0cnVjdCBmZl9jb25kaXRpb25fZWZmZWN0IHsKKwlfX3UxNiByaWdodF9zYXR1cmF0aW9uOworCV9fdTE2IGxlZnRfc2F0dXJhdGlvbjsKKworCV9fczE2IHJpZ2h0X2NvZWZmOworCV9fczE2IGxlZnRfY29lZmY7CisKKwlfX3UxNiBkZWFkYmFuZDsKKwlfX3MxNiBjZW50ZXI7Cit9OworCisvKioKKyAqIHN0cnVjdCBmZl9wZXJpb2RpY19lZmZlY3QgLSBkZWZpbmVzIHBhcmFtZXRlcnMgb2YgYSBwZXJpb2RpYyBmb3JjZS1mZWVkYmFjayBlZmZlY3QKKyAqIEB3YXZlZm9ybToga2luZCBvZiB0aGUgZWZmZWN0ICh3YXZlKQorICogQHBlcmlvZDogcGVyaW9kIG9mIHRoZSB3YXZlIChtcykKKyAqIEBtYWduaXR1ZGU6IHBlYWsgdmFsdWUKKyAqIEBvZmZzZXQ6IG1lYW4gdmFsdWUgb2YgdGhlIHdhdmUgKHJvdWdobHkpCisgKiBAcGhhc2U6ICdob3Jpem9udGFsJyBzaGlmdAorICogQGVudmVsb3BlOiBlbnZlbG9wZSBkYXRhCisgKiBAY3VzdG9tX2xlbjogbnVtYmVyIG9mIHNhbXBsZXMgKEZGX0NVU1RPTSBvbmx5KQorICogQGN1c3RvbV9kYXRhOiBidWZmZXIgb2Ygc2FtcGxlcyAoRkZfQ1VTVE9NIG9ubHkpCisgKgorICogS25vd24gd2F2ZWZvcm1zIC0gRkZfU1FVQVJFLCBGRl9UUklBTkdMRSwgRkZfU0lORSwgRkZfU0FXX1VQLAorICogRkZfU0FXX0RPV04sIEZGX0NVU1RPTS4gVGhlIGV4YWN0IHN5bnRheCBGRl9DVVNUT00gaXMgdW5kZWZpbmVkCisgKiBmb3IgdGhlIHRpbWUgYmVpbmcgYXMgbm8gZHJpdmVyIHN1cHBvcnRzIGl0IHlldC4KKyAqCisgKiBOb3RlOiB0aGUgZGF0YSBwb2ludGVkIGJ5IGN1c3RvbV9kYXRhIGlzIGNvcGllZCBieSB0aGUgZHJpdmVyLgorICogWW91IGNhbiB0aGVyZWZvcmUgZGlzcG9zZSBvZiB0aGUgbWVtb3J5IGFmdGVyIHRoZSB1cGxvYWQvdXBkYXRlLgorICovCitzdHJ1Y3QgZmZfcGVyaW9kaWNfZWZmZWN0IHsKKwlfX3UxNiB3YXZlZm9ybTsKKwlfX3UxNiBwZXJpb2Q7CisJX19zMTYgbWFnbml0dWRlOworCV9fczE2IG9mZnNldDsKKwlfX3UxNiBwaGFzZTsKKworCXN0cnVjdCBmZl9lbnZlbG9wZSBlbnZlbG9wZTsKKworCV9fdTMyIGN1c3RvbV9sZW47CisJX19zMTYgKmN1c3RvbV9kYXRhOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZmZfcnVtYmxlX2VmZmVjdCAtIGRlZmluZXMgcGFyYW1ldGVycyBvZiBhIHBlcmlvZGljIGZvcmNlLWZlZWRiYWNrIGVmZmVjdAorICogQHN0cm9uZ19tYWduaXR1ZGU6IG1hZ25pdHVkZSBvZiB0aGUgaGVhdnkgbW90b3IKKyAqIEB3ZWFrX21hZ25pdHVkZTogbWFnbml0dWRlIG9mIHRoZSBsaWdodCBvbmUKKyAqCisgKiBTb21lIHJ1bWJsZSBwYWRzIGhhdmUgdHdvIG1vdG9ycyBvZiBkaWZmZXJlbnQgd2VpZ2h0LiBTdHJvbmdfbWFnbml0dWRlCisgKiByZXByZXNlbnRzIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZpYnJhdGlvbiBnZW5lcmF0ZWQgYnkgdGhlIGhlYXZ5IG9uZS4KKyAqLworc3RydWN0IGZmX3J1bWJsZV9lZmZlY3QgeworCV9fdTE2IHN0cm9uZ19tYWduaXR1ZGU7CisJX191MTYgd2Vha19tYWduaXR1ZGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBmZl9lZmZlY3QgLSBkZWZpbmVzIGZvcmNlIGZlZWRiYWNrIGVmZmVjdAorICogQHR5cGU6IHR5cGUgb2YgdGhlIGVmZmVjdCAoRkZfQ09OU1RBTlQsIEZGX1BFUklPRElDLCBGRl9SQU1QLCBGRl9TUFJJTkcsCisgKglGRl9GUklDVElPTiwgRkZfREFNUEVSLCBGRl9SVU1CTEUsIEZGX0lORVJUSUEsIG9yIEZGX0NVU1RPTSkKKyAqIEBpZDogYW4gdW5pcXVlIGlkIGFzc2lnbmVkIHRvIGFuIGVmZmVjdAorICogQGRpcmVjdGlvbjogZGlyZWN0aW9uIG9mIHRoZSBlZmZlY3QKKyAqIEB0cmlnZ2VyOiB0cmlnZ2VyIGNvbmRpdGlvbnMgKHN0cnVjdCBmZl90cmlnZ2VyKQorICogQHJlcGxheTogc2NoZWR1bGluZyBvZiB0aGUgZWZmZWN0IChzdHJ1Y3QgZmZfcmVwbGF5KQorICogQHU6IGVmZmVjdC1zcGVjaWZpYyBzdHJ1Y3R1cmUgKG9uZSBvZiBmZl9jb25zdGFudF9lZmZlY3QsIGZmX3JhbXBfZWZmZWN0LAorICoJZmZfcGVyaW9kaWNfZWZmZWN0LCBmZl9jb25kaXRpb25fZWZmZWN0LCBmZl9ydW1ibGVfZWZmZWN0KSBmdXJ0aGVyCisgKglkZWZpbmluZyBlZmZlY3QgcGFyYW1ldGVycworICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHNlbnQgdGhyb3VnaCBpb2N0bCBmcm9tIHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgZHJpdmVyLgorICogVG8gY3JlYXRlIGEgbmV3IGVmZmVjdCBhcHBsaWNhdGlvbiBzaG91bGQgc2V0IGl0cyBAaWQgdG8gLTE7IHRoZSBrZXJuZWwKKyAqIHdpbGwgcmV0dXJuIGFzc2lnbmVkIEBpZCB3aGljaCBjYW4gbGF0ZXIgYmUgdXNlZCB0byB1cGRhdGUgb3IgZGVsZXRlCisgKiB0aGlzIGVmZmVjdC4KKyAqCisgKiBEaXJlY3Rpb24gb2YgdGhlIGVmZmVjdCBpcyBlbmNvZGVkIGFzIGZvbGxvd3M6CisgKgkwIGRlZyAtPiAweDAwMDAgKGRvd24pCisgKgk5MCBkZWcgLT4gMHg0MDAwIChsZWZ0KQorICoJMTgwIGRlZyAtPiAweDgwMDAgKHVwKQorICoJMjcwIGRlZyAtPiAweEMwMDAgKHJpZ2h0KQorICovCitzdHJ1Y3QgZmZfZWZmZWN0IHsKKwlfX3UxNiB0eXBlOworCV9fczE2IGlkOworCV9fdTE2IGRpcmVjdGlvbjsKKwlzdHJ1Y3QgZmZfdHJpZ2dlciB0cmlnZ2VyOworCXN0cnVjdCBmZl9yZXBsYXkgcmVwbGF5OworCisJdW5pb24geworCQlzdHJ1Y3QgZmZfY29uc3RhbnRfZWZmZWN0IGNvbnN0YW50OworCQlzdHJ1Y3QgZmZfcmFtcF9lZmZlY3QgcmFtcDsKKwkJc3RydWN0IGZmX3BlcmlvZGljX2VmZmVjdCBwZXJpb2RpYzsKKwkJc3RydWN0IGZmX2NvbmRpdGlvbl9lZmZlY3QgY29uZGl0aW9uWzJdOyAvKiBPbmUgZm9yIGVhY2ggYXhpcyAqLworCQlzdHJ1Y3QgZmZfcnVtYmxlX2VmZmVjdCBydW1ibGU7CisJfSB1OworfTsKKworLyoKKyAqIEZvcmNlIGZlZWRiYWNrIGVmZmVjdCB0eXBlcworICovCisKKyNkZWZpbmUgRkZfUlVNQkxFCTB4NTAKKyNkZWZpbmUgRkZfUEVSSU9ESUMJMHg1MQorI2RlZmluZSBGRl9DT05TVEFOVAkweDUyCisjZGVmaW5lIEZGX1NQUklORwkweDUzCisjZGVmaW5lIEZGX0ZSSUNUSU9OCTB4NTQKKyNkZWZpbmUgRkZfREFNUEVSCTB4NTUKKyNkZWZpbmUgRkZfSU5FUlRJQQkweDU2CisjZGVmaW5lIEZGX1JBTVAJCTB4NTcKKworI2RlZmluZSBGRl9FRkZFQ1RfTUlOCUZGX1JVTUJMRQorI2RlZmluZSBGRl9FRkZFQ1RfTUFYCUZGX1JBTVAKKworLyoKKyAqIEZvcmNlIGZlZWRiYWNrIHBlcmlvZGljIGVmZmVjdCB0eXBlcworICovCisKKyNkZWZpbmUgRkZfU1FVQVJFCTB4NTgKKyNkZWZpbmUgRkZfVFJJQU5HTEUJMHg1OQorI2RlZmluZSBGRl9TSU5FCQkweDVhCisjZGVmaW5lIEZGX1NBV19VUAkweDViCisjZGVmaW5lIEZGX1NBV19ET1dOCTB4NWMKKyNkZWZpbmUgRkZfQ1VTVE9NCTB4NWQKKworI2RlZmluZSBGRl9XQVZFRk9STV9NSU4JRkZfU1FVQVJFCisjZGVmaW5lIEZGX1dBVkVGT1JNX01BWAlGRl9DVVNUT00KKworLyoKKyAqIFNldCBmZiBkZXZpY2UgcHJvcGVydGllcworICovCisKKyNkZWZpbmUgRkZfR0FJTgkJMHg2MAorI2RlZmluZSBGRl9BVVRPQ0VOVEVSCTB4NjEKKworI2RlZmluZSBGRl9NQVgJCTB4N2YKKyNkZWZpbmUgRkZfQ05UCQkoRkZfTUFYKzEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pb2N0bC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOTFlYjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lvY3RsLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9MSU5VWF9JT0NUTF9ICisjZGVmaW5lIF9MSU5VWF9JT0NUTF9ICisKKyNpbmNsdWRlIDxhc20vaW9jdGwuaD4KKworI2VuZGlmIC8qIF9MSU5VWF9JT0NUTF9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmY0NzJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCURlZmluaXRpb25zIGZvciB0aGUgSVAgcHJvdG9jb2wuCisgKgorICogVmVyc2lvbjoJQCgjKWlwLmgJMS4wLjIJMDQvMjgvOTMKKyAqCisgKiBBdXRob3JzOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfSVBfSAorI2RlZmluZSBfTElOVVhfSVBfSAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjZGVmaW5lIElQVE9TX1RPU19NQVNLCQkweDFFCisjZGVmaW5lIElQVE9TX1RPUyh0b3MpCQkoKHRvcykmSVBUT1NfVE9TX01BU0spCisjZGVmaW5lCUlQVE9TX0xPV0RFTEFZCQkweDEwCisjZGVmaW5lCUlQVE9TX1RIUk9VR0hQVVQJMHgwOAorI2RlZmluZQlJUFRPU19SRUxJQUJJTElUWQkweDA0CisjZGVmaW5lCUlQVE9TX01JTkNPU1QJCTB4MDIKKworI2RlZmluZSBJUFRPU19QUkVDX01BU0sJCTB4RTAKKyNkZWZpbmUgSVBUT1NfUFJFQyh0b3MpCQkoKHRvcykmSVBUT1NfUFJFQ19NQVNLKQorI2RlZmluZSBJUFRPU19QUkVDX05FVENPTlRST0wgICAgICAgICAgIDB4ZTAKKyNkZWZpbmUgSVBUT1NfUFJFQ19JTlRFUk5FVENPTlRST0wgICAgICAweGMwCisjZGVmaW5lIElQVE9TX1BSRUNfQ1JJVElDX0VDUCAgICAgICAgICAgMHhhMAorI2RlZmluZSBJUFRPU19QUkVDX0ZMQVNIT1ZFUlJJREUgICAgICAgIDB4ODAKKyNkZWZpbmUgSVBUT1NfUFJFQ19GTEFTSCAgICAgICAgICAgICAgICAweDYwCisjZGVmaW5lIElQVE9TX1BSRUNfSU1NRURJQVRFICAgICAgICAgICAgMHg0MAorI2RlZmluZSBJUFRPU19QUkVDX1BSSU9SSVRZICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSVBUT1NfUFJFQ19ST1VUSU5FICAgICAgICAgICAgICAweDAwCisKKworLyogSVAgb3B0aW9ucyAqLworI2RlZmluZSBJUE9QVF9DT1BZCQkweDgwCisjZGVmaW5lIElQT1BUX0NMQVNTX01BU0sJMHg2MAorI2RlZmluZSBJUE9QVF9OVU1CRVJfTUFTSwkweDFmCisKKyNkZWZpbmUJSVBPUFRfQ09QSUVEKG8pCQkoKG8pJklQT1BUX0NPUFkpCisjZGVmaW5lCUlQT1BUX0NMQVNTKG8pCQkoKG8pJklQT1BUX0NMQVNTX01BU0spCisjZGVmaW5lCUlQT1BUX05VTUJFUihvKQkJKChvKSZJUE9QVF9OVU1CRVJfTUFTSykKKworI2RlZmluZQlJUE9QVF9DT05UUk9MCQkweDAwCisjZGVmaW5lCUlQT1BUX1JFU0VSVkVEMQkJMHgyMAorI2RlZmluZQlJUE9QVF9NRUFTVVJFTUVOVAkweDQwCisjZGVmaW5lCUlQT1BUX1JFU0VSVkVEMgkJMHg2MAorCisjZGVmaW5lIElQT1BUX0VORAkoMCB8SVBPUFRfQ09OVFJPTCkKKyNkZWZpbmUgSVBPUFRfTk9PUAkoMSB8SVBPUFRfQ09OVFJPTCkKKyNkZWZpbmUgSVBPUFRfU0VDCSgyIHxJUE9QVF9DT05UUk9MfElQT1BUX0NPUFkpCisjZGVmaW5lIElQT1BUX0xTUlIJKDMgfElQT1BUX0NPTlRST0x8SVBPUFRfQ09QWSkKKyNkZWZpbmUgSVBPUFRfVElNRVNUQU1QCSg0IHxJUE9QVF9NRUFTVVJFTUVOVCkKKyNkZWZpbmUgSVBPUFRfQ0lQU08JKDYgfElQT1BUX0NPTlRST0x8SVBPUFRfQ09QWSkKKyNkZWZpbmUgSVBPUFRfUlIJKDcgfElQT1BUX0NPTlRST0wpCisjZGVmaW5lIElQT1BUX1NJRAkoOCB8SVBPUFRfQ09OVFJPTHxJUE9QVF9DT1BZKQorI2RlZmluZSBJUE9QVF9TU1JSCSg5IHxJUE9QVF9DT05UUk9MfElQT1BUX0NPUFkpCisjZGVmaW5lIElQT1BUX1JBCSgyMHxJUE9QVF9DT05UUk9MfElQT1BUX0NPUFkpCisKKyNkZWZpbmUgSVBWRVJTSU9OCTQKKyNkZWZpbmUgTUFYVFRMCQkyNTUKKyNkZWZpbmUgSVBERUZUVEwJNjQKKworI2RlZmluZSBJUE9QVF9PUFRWQUwgMAorI2RlZmluZSBJUE9QVF9PTEVOICAgMQorI2RlZmluZSBJUE9QVF9PRkZTRVQgMgorI2RlZmluZSBJUE9QVF9NSU5PRkYgNAorI2RlZmluZSBNQVhfSVBPUFRMRU4gNDAKKyNkZWZpbmUgSVBPUFRfTk9QIElQT1BUX05PT1AKKyNkZWZpbmUgSVBPUFRfRU9MIElQT1BUX0VORAorI2RlZmluZSBJUE9QVF9UUyAgSVBPUFRfVElNRVNUQU1QCisKKyNkZWZpbmUJSVBPUFRfVFNfVFNPTkxZCQkwCQkvKiB0aW1lc3RhbXBzIG9ubHkgKi8KKyNkZWZpbmUJSVBPUFRfVFNfVFNBTkRBRERSCTEJCS8qIHRpbWVzdGFtcHMgYW5kIGFkZHJlc3NlcyAqLworI2RlZmluZQlJUE9QVF9UU19QUkVTUEVDCTMJCS8qIHNwZWNpZmllZCBtb2R1bGVzIG9ubHkgKi8KKworI2RlZmluZSBJUFY0X0JFRVRfUEhNQVhMRU4gOAorCitzdHJ1Y3QgaXBoZHIgeworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJaWhsOjQsCisJCXZlcnNpb246NDsKKyNlbGlmIGRlZmluZWQgKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4CXZlcnNpb246NCwKKyAgCQlpaGw6NDsKKyNlbHNlCisjZXJyb3IJIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKwlfX3U4CXRvczsKKwlfX2JlMTYJdG90X2xlbjsKKwlfX2JlMTYJaWQ7CisJX19iZTE2CWZyYWdfb2ZmOworCV9fdTgJdHRsOworCV9fdTgJcHJvdG9jb2w7CisJX19zdW0xNgljaGVjazsKKwlfX2JlMzIJc2FkZHI7CisJX19iZTMyCWRhZGRyOworCS8qVGhlIG9wdGlvbnMgc3RhcnQgaGVyZS4gKi8KK307CisKKworc3RydWN0IGlwX2F1dGhfaGRyIHsKKwlfX3U4ICBuZXh0aGRyOworCV9fdTggIGhkcmxlbjsJCS8qIFRoaXMgb25lIGlzIG1lYXN1cmVkIGluIDMyIGJpdCB1bml0cyEgKi8KKwlfX2JlMTYgcmVzZXJ2ZWQ7CisJX19iZTMyIHNwaTsKKwlfX2JlMzIgc2VxX25vOwkJLyogU2VxdWVuY2UgbnVtYmVyICovCisJX191OCAgYXV0aF9kYXRhWzBdOwkvKiBWYXJpYWJsZSBsZW4gYnV0ID49NC4gTWluZCB0aGUgNjQgYml0IGFsaWdubWVudCEgKi8KK307CisKK3N0cnVjdCBpcF9lc3BfaGRyIHsKKwlfX2JlMzIgc3BpOworCV9fYmUzMiBzZXFfbm87CQkvKiBTZXF1ZW5jZSBudW1iZXIgKi8KKwlfX3U4ICBlbmNfZGF0YVswXTsJLyogVmFyaWFibGUgbGVuIGJ1dCA+PTguIE1pbmQgdGhlIDY0IGJpdCBhbGlnbm1lbnQhICovCit9OworCitzdHJ1Y3QgaXBfY29tcF9oZHIgeworCV9fdTggbmV4dGhkcjsKKwlfX3U4IGZsYWdzOworCV9fYmUxNiBjcGk7Cit9OworCitzdHJ1Y3QgaXBfYmVldF9waGRyIHsKKwlfX3U4IG5leHRoZHI7CisJX191OCBoZHJsZW47CisJX191OCBwYWRsZW47CisJX191OCByZXNlcnZlZDsKK307CisKKyNlbmRpZgkvKiBfTElOVVhfSVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcDZfdHVubmVsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwNl90dW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjIyYjAzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcDZfdHVubmVsLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBfSVA2X1RVTk5FTF9ICisjZGVmaW5lIF9JUDZfVFVOTkVMX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgSVBWNl9UTFZfVE5MX0VOQ0FQX0xJTUlUIDQKKyNkZWZpbmUgSVBWNl9ERUZBVUxUX1ROTF9FTkNBUF9MSU1JVCA0CisKKy8qIGRvbid0IGFkZCBlbmNhcHN1bGF0aW9uIGxpbWl0IGlmIG9uZSBpc24ndCBwcmVzZW50IGluIGlubmVyIHBhY2tldCAqLworI2RlZmluZSBJUDZfVE5MX0ZfSUdOX0VOQ0FQX0xJTUlUIDB4MQorLyogY29weSB0aGUgdHJhZmZpYyBjbGFzcyBmaWVsZCBmcm9tIHRoZSBpbm5lciBwYWNrZXQgKi8KKyNkZWZpbmUgSVA2X1ROTF9GX1VTRV9PUklHX1RDTEFTUyAweDIKKy8qIGNvcHkgdGhlIGZsb3dsYWJlbCBmcm9tIHRoZSBpbm5lciBwYWNrZXQgKi8KKyNkZWZpbmUgSVA2X1ROTF9GX1VTRV9PUklHX0ZMT1dMQUJFTCAweDQKKy8qIGJlaW5nIHVzZWQgZm9yIE1vYmlsZSBJUHY2ICovCisjZGVmaW5lIElQNl9UTkxfRl9NSVA2X0RFViAweDgKKy8qIGNvcHkgRFNDUCBmcm9tIHRoZSBvdXRlciBwYWNrZXQgKi8KKyNkZWZpbmUgSVA2X1ROTF9GX1JDVl9EU0NQX0NPUFkgMHgxMAorLyogY29weSBmd21hcmsgZnJvbSBpbm5lciBwYWNrZXQgKi8KKyNkZWZpbmUgSVA2X1ROTF9GX1VTRV9PUklHX0ZXTUFSSyAweDIwCisKK3N0cnVjdCBpcDZfdG5sX3Bhcm0geworCWNoYXIgbmFtZVtJRk5BTVNJWl07CS8qIG5hbWUgb2YgdHVubmVsIGRldmljZSAqLworCWludCBsaW5rOwkJLyogaWZpbmRleCBvZiB1bmRlcmx5aW5nIEwyIGludGVyZmFjZSAqLworCV9fdTggcHJvdG87CQkvKiB0dW5uZWwgcHJvdG9jb2wgKi8KKwlfX3U4IGVuY2FwX2xpbWl0OwkvKiBlbmNhcHN1bGF0aW9uIGxpbWl0IGZvciB0dW5uZWwgKi8KKwlfX3U4IGhvcF9saW1pdDsJCS8qIGhvcCBsaW1pdCBmb3IgdHVubmVsICovCisJX19iZTMyIGZsb3dpbmZvOwkvKiB0cmFmZmljIGNsYXNzIGFuZCBmbG93bGFiZWwgZm9yIHR1bm5lbCAqLworCV9fdTMyIGZsYWdzOwkJLyogdHVubmVsIGZsYWdzICovCisJc3RydWN0IGluNl9hZGRyIGxhZGRyOwkvKiBsb2NhbCB0dW5uZWwgZW5kLXBvaW50IGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaW42X2FkZHIgcmFkZHI7CS8qIHJlbW90ZSB0dW5uZWwgZW5kLXBvaW50IGFkZHJlc3MgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcF92cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcF92cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZWIzODMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwX3ZzLmgKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiAgICAgIElQIFZpcnR1YWwgU2VydmVyCisgKiAgICAgIGRhdGEgc3RydWN0dXJlIGFuZCBmdW5jdGlvbmFsaXR5IGRlZmluaXRpb25zCisgKi8KKworI2lmbmRlZiBfSVBfVlNfSAorI2RlZmluZSBfSVBfVlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JLyogRm9yIF9fYmVYWCB0eXBlcyBpbiB1c2VybGFuZCAqLworCisjZGVmaW5lIElQX1ZTX1ZFUlNJT05fQ09ERQkweDAxMDIwMQorI2RlZmluZSBOVkVSU0lPTih2ZXJzaW9uKQkJCVwKKwkodmVyc2lvbiA+PiAxNikgJiAweEZGLAkJCVwKKwkodmVyc2lvbiA+PiA4KSAmIDB4RkYsCQkJXAorCXZlcnNpb24gJiAweEZGCisKKy8qCisgKiAgICAgIFZpcnR1YWwgU2VydmljZSBGbGFncworICovCisjZGVmaW5lIElQX1ZTX1NWQ19GX1BFUlNJU1RFTlQJMHgwMDAxCQkvKiBwZXJzaXN0ZW50IHBvcnQgKi8KKyNkZWZpbmUgSVBfVlNfU1ZDX0ZfSEFTSEVECTB4MDAwMgkJLyogaGFzaGVkIGVudHJ5ICovCisjZGVmaW5lIElQX1ZTX1NWQ19GX09ORVBBQ0tFVAkweDAwMDQJCS8qIG9uZS1wYWNrZXQgc2NoZWR1bGluZyAqLworCisvKgorICogICAgICBEZXN0aW5hdGlvbiBTZXJ2ZXIgRmxhZ3MKKyAqLworI2RlZmluZSBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFCTB4MDAwMQkJLyogc2VydmVyIGlzIGF2YWlsYWJsZSAqLworI2RlZmluZSBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQJMHgwMDAyCQkvKiBzZXJ2ZXIgaXMgb3ZlcmxvYWRlZCAqLworCisvKgorICogICAgICBJUFZTIHN5bmMgZGFlbW9uIHN0YXRlcworICovCisjZGVmaW5lIElQX1ZTX1NUQVRFX05PTkUJMHgwMDAwCQkvKiBkYWVtb24gaXMgc3RvcHBlZCAqLworI2RlZmluZSBJUF9WU19TVEFURV9NQVNURVIJMHgwMDAxCQkvKiBzdGFydGVkIGFzIG1hc3RlciAqLworI2RlZmluZSBJUF9WU19TVEFURV9CQUNLVVAJMHgwMDAyCQkvKiBzdGFydGVkIGFzIGJhY2t1cCAqLworCisvKgorICogICAgICBJUFZTIHNvY2tldCBvcHRpb25zCisgKi8KKyNkZWZpbmUgSVBfVlNfQkFTRV9DVEwJCSg2NCsxMDI0KzY0KQkJLyogYmFzZSAqLworCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9OT05FCUlQX1ZTX0JBU0VfQ1RMCQkvKiBqdXN0IHBlZWsgKi8KKyNkZWZpbmUgSVBfVlNfU09fU0VUX0lOU0VSVAkoSVBfVlNfQkFTRV9DVEwrMSkKKyNkZWZpbmUgSVBfVlNfU09fU0VUX0FERAkoSVBfVlNfQkFTRV9DVEwrMikKKyNkZWZpbmUgSVBfVlNfU09fU0VUX0VESVQJKElQX1ZTX0JBU0VfQ1RMKzMpCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9ERUwJKElQX1ZTX0JBU0VfQ1RMKzQpCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9GTFVTSAkoSVBfVlNfQkFTRV9DVEwrNSkKKyNkZWZpbmUgSVBfVlNfU09fU0VUX0xJU1QJKElQX1ZTX0JBU0VfQ1RMKzYpCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9BRERERVNUCShJUF9WU19CQVNFX0NUTCs3KQorI2RlZmluZSBJUF9WU19TT19TRVRfREVMREVTVAkoSVBfVlNfQkFTRV9DVEwrOCkKKyNkZWZpbmUgSVBfVlNfU09fU0VUX0VESVRERVNUCShJUF9WU19CQVNFX0NUTCs5KQorI2RlZmluZSBJUF9WU19TT19TRVRfVElNRU9VVAkoSVBfVlNfQkFTRV9DVEwrMTApCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9TVEFSVERBRU1PTiAoSVBfVlNfQkFTRV9DVEwrMTEpCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9TVE9QREFFTU9OIChJUF9WU19CQVNFX0NUTCsxMikKKyNkZWZpbmUgSVBfVlNfU09fU0VUX1JFU1RPUkUgICAgKElQX1ZTX0JBU0VfQ1RMKzEzKQorI2RlZmluZSBJUF9WU19TT19TRVRfU0FWRSAgICAgICAoSVBfVlNfQkFTRV9DVEwrMTQpCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9aRVJPCShJUF9WU19CQVNFX0NUTCsxNSkKKyNkZWZpbmUgSVBfVlNfU09fU0VUX01BWAlJUF9WU19TT19TRVRfWkVSTworCisjZGVmaW5lIElQX1ZTX1NPX0dFVF9WRVJTSU9OCUlQX1ZTX0JBU0VfQ1RMCisjZGVmaW5lIElQX1ZTX1NPX0dFVF9JTkZPCShJUF9WU19CQVNFX0NUTCsxKQorI2RlZmluZSBJUF9WU19TT19HRVRfU0VSVklDRVMJKElQX1ZTX0JBU0VfQ1RMKzIpCisjZGVmaW5lIElQX1ZTX1NPX0dFVF9TRVJWSUNFCShJUF9WU19CQVNFX0NUTCszKQorI2RlZmluZSBJUF9WU19TT19HRVRfREVTVFMJKElQX1ZTX0JBU0VfQ1RMKzQpCisjZGVmaW5lIElQX1ZTX1NPX0dFVF9ERVNUCShJUF9WU19CQVNFX0NUTCs1KQkvKiBub3QgdXNlZCBub3cgKi8KKyNkZWZpbmUgSVBfVlNfU09fR0VUX1RJTUVPVVQJKElQX1ZTX0JBU0VfQ1RMKzYpCisjZGVmaW5lIElQX1ZTX1NPX0dFVF9EQUVNT04JKElQX1ZTX0JBU0VfQ1RMKzcpCisjZGVmaW5lIElQX1ZTX1NPX0dFVF9NQVgJSVBfVlNfU09fR0VUX0RBRU1PTgorCisKKy8qCisgKiAgICAgIElQVlMgQ29ubmVjdGlvbiBGbGFncworICogICAgICBPbmx5IGZsYWdzIDAuLjE1IGFyZSBzZW50IHRvIGJhY2t1cCBzZXJ2ZXIKKyAqLworI2RlZmluZSBJUF9WU19DT05OX0ZfRldEX01BU0sJMHgwMDA3CQkvKiBtYXNrIGZvciB0aGUgZndkIG1ldGhvZHMgKi8KKyNkZWZpbmUgSVBfVlNfQ09OTl9GX01BU1EJMHgwMDAwCQkvKiBtYXNxdWVyYWRpbmcvTkFUICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9MT0NBTE5PREUJMHgwMDAxCQkvKiBsb2NhbCBub2RlICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9UVU5ORUwJMHgwMDAyCQkvKiB0dW5uZWxpbmcgKi8KKyNkZWZpbmUgSVBfVlNfQ09OTl9GX0RST1VURQkweDAwMDMJCS8qIGRpcmVjdCByb3V0aW5nICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9CWVBBU1MJMHgwMDA0CQkvKiBjYWNoZSBieXBhc3MgKi8KKyNkZWZpbmUgSVBfVlNfQ09OTl9GX1NZTkMJMHgwMDIwCQkvKiBlbnRyeSBjcmVhdGVkIGJ5IHN5bmMgKi8KKyNkZWZpbmUgSVBfVlNfQ09OTl9GX0hBU0hFRAkweDAwNDAJCS8qIGhhc2hlZCBlbnRyeSAqLworI2RlZmluZSBJUF9WU19DT05OX0ZfTk9PVVRQVVQJMHgwMDgwCQkvKiBubyBvdXRwdXQgcGFja2V0cyAqLworI2RlZmluZSBJUF9WU19DT05OX0ZfSU5BQ1RJVkUJMHgwMTAwCQkvKiBub3QgZXN0YWJsaXNoZWQgKi8KKyNkZWZpbmUgSVBfVlNfQ09OTl9GX09VVF9TRVEJMHgwMjAwCQkvKiBtdXN0IGRvIG91dHB1dCBzZXEgYWRqdXN0ICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9JTl9TRVEJMHgwNDAwCQkvKiBtdXN0IGRvIGlucHV0IHNlcSBhZGp1c3QgKi8KKyNkZWZpbmUgSVBfVlNfQ09OTl9GX1NFUV9NQVNLCTB4MDYwMAkJLyogaW4vb3V0IHNlcXVlbmNlIG1hc2sgKi8KKyNkZWZpbmUgSVBfVlNfQ09OTl9GX05PX0NQT1JUCTB4MDgwMAkJLyogbm8gY2xpZW50IHBvcnQgc2V0IHlldCAqLworI2RlZmluZSBJUF9WU19DT05OX0ZfVEVNUExBVEUJMHgxMDAwCQkvKiB0ZW1wbGF0ZSwgbm90IGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUgSVBfVlNfQ09OTl9GX09ORV9QQUNLRVQJMHgyMDAwCQkvKiBmb3J3YXJkIG9ubHkgb25lIHBhY2tldCAqLworCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9CQUNLVVBfTUFTSyAoSVBfVlNfQ09OTl9GX0ZXRF9NQVNLIHwgXAorCQkJCSAgSVBfVlNfQ09OTl9GX05PT1VUUFVUIHwgXAorCQkJCSAgSVBfVlNfQ09OTl9GX0lOQUNUSVZFIHwgXAorCQkJCSAgSVBfVlNfQ09OTl9GX1NFUV9NQVNLIHwgXAorCQkJCSAgSVBfVlNfQ09OTl9GX05PX0NQT1JUIHwgXAorCQkJCSAgSVBfVlNfQ09OTl9GX1RFTVBMQVRFIFwKKwkJCQkgKQorCisvKiBGbGFncyB0aGF0IGFyZSBub3Qgc2VudCB0byBiYWNrdXAgc2VydmVyIHN0YXJ0IGZyb20gYml0IDE2ICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9ORkNUCSgxIDw8IDE2KQkvKiB1c2UgbmV0ZmlsdGVyIGNvbm50cmFjayAqLworCisvKiBDb25uZWN0aW9uIGZsYWdzIGZyb20gZGVzdGluYXRpb24gdGhhdCBjYW4gYmUgY2hhbmdlZCBieSB1c2VyIHNwYWNlICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9ERVNUX01BU0sgKElQX1ZTX0NPTk5fRl9GV0RfTUFTSyB8IFwKKwkJCQlJUF9WU19DT05OX0ZfT05FX1BBQ0tFVCB8IFwKKwkJCQlJUF9WU19DT05OX0ZfTkZDVCB8IFwKKwkJCQkwKQorCisjZGVmaW5lIElQX1ZTX1NDSEVETkFNRV9NQVhMRU4JMTYKKyNkZWZpbmUgSVBfVlNfUEVOQU1FX01BWExFTgkxNgorI2RlZmluZSBJUF9WU19JRk5BTUVfTUFYTEVOCTE2CisKKyNkZWZpbmUgSVBfVlNfUEVEQVRBX01BWExFTiAgICAgMjU1CisKKy8qCisgKglUaGUgc3RydWN0IGlwX3ZzX3NlcnZpY2VfdXNlciBhbmQgc3RydWN0IGlwX3ZzX2Rlc3RfdXNlciBhcmUKKyAqCXVzZWQgdG8gc2V0IElQVlMgcnVsZXMgdGhyb3VnaCBzZXRzb2Nrb3B0LgorICovCitzdHJ1Y3QgaXBfdnNfc2VydmljZV91c2VyIHsKKwkvKiB2aXJ0dWFsIHNlcnZpY2UgYWRkcmVzc2VzICovCisJX191MTYJCXByb3RvY29sOworCV9fYmUzMgkJCWFkZHI7CQkvKiB2aXJ0dWFsIGlwIGFkZHJlc3MgKi8KKwlfX2JlMTYJCQlwb3J0OworCV9fdTMyCQlmd21hcms7CQkvKiBmaXJ3YWxsIG1hcmsgb2Ygc2VydmljZSAqLworCisJLyogdmlydHVhbCBzZXJ2aWNlIG9wdGlvbnMgKi8KKwljaGFyCQkJc2NoZWRfbmFtZVtJUF9WU19TQ0hFRE5BTUVfTUFYTEVOXTsKKwl1bnNpZ25lZAkJZmxhZ3M7CQkvKiB2aXJ0dWFsIHNlcnZpY2UgZmxhZ3MgKi8KKwl1bnNpZ25lZAkJdGltZW91dDsJLyogcGVyc2lzdGVudCB0aW1lb3V0IGluIHNlYyAqLworCV9fYmUzMgkJCW5ldG1hc2s7CS8qIHBlcnNpc3RlbnQgbmV0bWFzayAqLworfTsKKworCitzdHJ1Y3QgaXBfdnNfZGVzdF91c2VyIHsKKwkvKiBkZXN0aW5hdGlvbiBzZXJ2ZXIgYWRkcmVzcyAqLworCV9fYmUzMgkJCWFkZHI7CisJX19iZTE2CQkJcG9ydDsKKworCS8qIHJlYWwgc2VydmVyIG9wdGlvbnMgKi8KKwl1bnNpZ25lZAkJY29ubl9mbGFnczsJLyogY29ubmVjdGlvbiBmbGFncyAqLworCWludAkJCXdlaWdodDsJCS8qIGRlc3RpbmF0aW9uIHdlaWdodCAqLworCisJLyogdGhyZXNob2xkcyBmb3IgYWN0aXZlIGNvbm5lY3Rpb25zICovCisJX191MzIJCXVfdGhyZXNob2xkOwkvKiB1cHBlciB0aHJlc2hvbGQgKi8KKwlfX3UzMgkJbF90aHJlc2hvbGQ7CS8qIGxvd2VyIHRocmVzaG9sZCAqLworfTsKKworCisvKgorICoJSVBWUyBzdGF0aXN0aWNzIG9iamVjdCAoZm9yIHVzZXIgc3BhY2UpCisgKi8KK3N0cnVjdCBpcF92c19zdGF0c191c2VyIHsKKwlfX3UzMiAgICAgICAgICAgICAgICAgICBjb25uczsgICAgICAgICAgLyogY29ubmVjdGlvbnMgc2NoZWR1bGVkICovCisJX191MzIgICAgICAgICAgICAgICAgICAgaW5wa3RzOyAgICAgICAgIC8qIGluY29taW5nIHBhY2tldHMgKi8KKwlfX3UzMiAgICAgICAgICAgICAgICAgICBvdXRwa3RzOyAgICAgICAgLyogb3V0Z29pbmcgcGFja2V0cyAqLworCV9fdTY0ICAgICAgICAgICAgICAgICAgIGluYnl0ZXM7ICAgICAgICAvKiBpbmNvbWluZyBieXRlcyAqLworCV9fdTY0ICAgICAgICAgICAgICAgICAgIG91dGJ5dGVzOyAgICAgICAvKiBvdXRnb2luZyBieXRlcyAqLworCisJX191MzIJCQljcHM7CQkvKiBjdXJyZW50IGNvbm5lY3Rpb24gcmF0ZSAqLworCV9fdTMyCQkJaW5wcHM7CQkvKiBjdXJyZW50IGluIHBhY2tldCByYXRlICovCisJX191MzIJCQlvdXRwcHM7CQkvKiBjdXJyZW50IG91dCBwYWNrZXQgcmF0ZSAqLworCV9fdTMyCQkJaW5icHM7CQkvKiBjdXJyZW50IGluIGJ5dGUgcmF0ZSAqLworCV9fdTMyCQkJb3V0YnBzOwkJLyogY3VycmVudCBvdXQgYnl0ZSByYXRlICovCit9OworCisKKy8qIFRoZSBhcmd1bWVudCB0byBJUF9WU19TT19HRVRfSU5GTyAqLworc3RydWN0IGlwX3ZzX2dldGluZm8geworCS8qIHZlcnNpb24gbnVtYmVyICovCisJdW5zaWduZWQgaW50CQl2ZXJzaW9uOworCisJLyogc2l6ZSBvZiBjb25uZWN0aW9uIGhhc2ggdGFibGUgKi8KKwl1bnNpZ25lZCBpbnQJCXNpemU7CisKKwkvKiBudW1iZXIgb2YgdmlydHVhbCBzZXJ2aWNlcyAqLworCXVuc2lnbmVkIGludAkJbnVtX3NlcnZpY2VzOworfTsKKworCisvKiBUaGUgYXJndW1lbnQgdG8gSVBfVlNfU09fR0VUX1NFUlZJQ0UgKi8KK3N0cnVjdCBpcF92c19zZXJ2aWNlX2VudHJ5IHsKKwkvKiB3aGljaCBzZXJ2aWNlOiB1c2VyIGZpbGxzIGluIHRoZXNlICovCisJX191MTYJCXByb3RvY29sOworCV9fYmUzMgkJCWFkZHI7CQkvKiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlfX2JlMTYJCQlwb3J0OworCV9fdTMyCQlmd21hcms7CQkvKiBmaXJ3YWxsIG1hcmsgb2Ygc2VydmljZSAqLworCisJLyogc2VydmljZSBvcHRpb25zICovCisJY2hhcgkJCXNjaGVkX25hbWVbSVBfVlNfU0NIRUROQU1FX01BWExFTl07CisJdW5zaWduZWQJCWZsYWdzOyAgICAgICAgICAvKiB2aXJ0dWFsIHNlcnZpY2UgZmxhZ3MgKi8KKwl1bnNpZ25lZAkJdGltZW91dDsJLyogcGVyc2lzdGVudCB0aW1lb3V0ICovCisJX19iZTMyCQkJbmV0bWFzazsJLyogcGVyc2lzdGVudCBuZXRtYXNrICovCisKKwkvKiBudW1iZXIgb2YgcmVhbCBzZXJ2ZXJzICovCisJdW5zaWduZWQgaW50CQludW1fZGVzdHM7CisKKwkvKiBzdGF0aXN0aWNzICovCisJc3RydWN0IGlwX3ZzX3N0YXRzX3VzZXIgc3RhdHM7Cit9OworCisKK3N0cnVjdCBpcF92c19kZXN0X2VudHJ5IHsKKwlfX2JlMzIJCQlhZGRyOwkJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCV9fYmUxNgkJCXBvcnQ7CisJdW5zaWduZWQJCWNvbm5fZmxhZ3M7CS8qIGNvbm5lY3Rpb24gZmxhZ3MgKi8KKwlpbnQJCQl3ZWlnaHQ7CQkvKiBkZXN0aW5hdGlvbiB3ZWlnaHQgKi8KKworCV9fdTMyCQl1X3RocmVzaG9sZDsJLyogdXBwZXIgdGhyZXNob2xkICovCisJX191MzIJCWxfdGhyZXNob2xkOwkvKiBsb3dlciB0aHJlc2hvbGQgKi8KKworCV9fdTMyCQlhY3RpdmVjb25uczsJLyogYWN0aXZlIGNvbm5lY3Rpb25zICovCisJX191MzIJCWluYWN0Y29ubnM7CS8qIGluYWN0aXZlIGNvbm5lY3Rpb25zICovCisJX191MzIJCXBlcnNpc3Rjb25uczsJLyogcGVyc2lzdGVudCBjb25uZWN0aW9ucyAqLworCisJLyogc3RhdGlzdGljcyAqLworCXN0cnVjdCBpcF92c19zdGF0c191c2VyIHN0YXRzOworfTsKKworCisvKiBUaGUgYXJndW1lbnQgdG8gSVBfVlNfU09fR0VUX0RFU1RTICovCitzdHJ1Y3QgaXBfdnNfZ2V0X2Rlc3RzIHsKKwkvKiB3aGljaCBzZXJ2aWNlOiB1c2VyIGZpbGxzIGluIHRoZXNlICovCisJX191MTYJCXByb3RvY29sOworCV9fYmUzMgkJCWFkZHI7CQkvKiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlfX2JlMTYJCQlwb3J0OworCV9fdTMyCQlmd21hcms7CQkvKiBmaXJ3YWxsIG1hcmsgb2Ygc2VydmljZSAqLworCisJLyogbnVtYmVyIG9mIHJlYWwgc2VydmVycyAqLworCXVuc2lnbmVkIGludAkJbnVtX2Rlc3RzOworCisJLyogdGhlIHJlYWwgc2VydmVycyAqLworCXN0cnVjdCBpcF92c19kZXN0X2VudHJ5CWVudHJ5dGFibGVbMF07Cit9OworCisKKy8qIFRoZSBhcmd1bWVudCB0byBJUF9WU19TT19HRVRfU0VSVklDRVMgKi8KK3N0cnVjdCBpcF92c19nZXRfc2VydmljZXMgeworCS8qIG51bWJlciBvZiB2aXJ0dWFsIHNlcnZpY2VzICovCisJdW5zaWduZWQgaW50CQludW1fc2VydmljZXM7CisKKwkvKiBzZXJ2aWNlIHRhYmxlICovCisJc3RydWN0IGlwX3ZzX3NlcnZpY2VfZW50cnkgZW50cnl0YWJsZVswXTsKK307CisKKworLyogVGhlIGFyZ3VtZW50IHRvIElQX1ZTX1NPX0dFVF9USU1FT1VUICovCitzdHJ1Y3QgaXBfdnNfdGltZW91dF91c2VyIHsKKwlpbnQJCQl0Y3BfdGltZW91dDsKKwlpbnQJCQl0Y3BfZmluX3RpbWVvdXQ7CisJaW50CQkJdWRwX3RpbWVvdXQ7Cit9OworCisKKy8qIFRoZSBhcmd1bWVudCB0byBJUF9WU19TT19HRVRfREFFTU9OICovCitzdHJ1Y3QgaXBfdnNfZGFlbW9uX3VzZXIgeworCS8qIHN5bmMgZGFlbW9uIHN0YXRlIChtYXN0ZXIvYmFja3VwKSAqLworCWludAkJCXN0YXRlOworCisJLyogbXVsdGljYXN0IGludGVyZmFjZSBuYW1lICovCisJY2hhcgkJCW1jYXN0X2lmbltJUF9WU19JRk5BTUVfTUFYTEVOXTsKKworCS8qIFN5bmNJRCB3ZSBiZWxvbmcgdG8gKi8KKwlpbnQJCQlzeW5jaWQ7Cit9OworCisvKgorICoKKyAqIElQVlMgR2VuZXJpYyBOZXRsaW5rIGludGVyZmFjZSBkZWZpbml0aW9ucworICoKKyAqLworCisvKiBHZW5lcmljIE5ldGxpbmsgZmFtaWx5IGluZm8gKi8KKworI2RlZmluZSBJUFZTX0dFTkxfTkFNRQkJIklQVlMiCisjZGVmaW5lIElQVlNfR0VOTF9WRVJTSU9OCTB4MQorCitzdHJ1Y3QgaXBfdnNfZmxhZ3MgeworCV9fYmUzMiBmbGFnczsKKwlfX2JlMzIgbWFzazsKK307CisKKy8qIEdlbmVyaWMgTmV0bGluayBjb21tYW5kIGF0dHJpYnV0ZXMgKi8KK2VudW0geworCUlQVlNfQ01EX1VOU1BFQyA9IDAsCisKKwlJUFZTX0NNRF9ORVdfU0VSVklDRSwJCS8qIGFkZCBzZXJ2aWNlICovCisJSVBWU19DTURfU0VUX1NFUlZJQ0UsCQkvKiBtb2RpZnkgc2VydmljZSAqLworCUlQVlNfQ01EX0RFTF9TRVJWSUNFLAkJLyogZGVsZXRlIHNlcnZpY2UgKi8KKwlJUFZTX0NNRF9HRVRfU0VSVklDRSwJCS8qIGdldCBzZXJ2aWNlIGluZm8gKi8KKworCUlQVlNfQ01EX05FV19ERVNULAkJLyogYWRkIGRlc3RpbmF0aW9uICovCisJSVBWU19DTURfU0VUX0RFU1QsCQkvKiBtb2RpZnkgZGVzdGluYXRpb24gKi8KKwlJUFZTX0NNRF9ERUxfREVTVCwJCS8qIGRlbGV0ZSBkZXN0aW5hdGlvbiAqLworCUlQVlNfQ01EX0dFVF9ERVNULAkJLyogZ2V0IGRlc3RpbmF0aW9uIGluZm8gKi8KKworCUlQVlNfQ01EX05FV19EQUVNT04sCQkvKiBzdGFydCBzeW5jIGRhZW1vbiAqLworCUlQVlNfQ01EX0RFTF9EQUVNT04sCQkvKiBzdG9wIHN5bmMgZGFlbW9uICovCisJSVBWU19DTURfR0VUX0RBRU1PTiwJCS8qIGdldCBzeW5jIGRhZW1vbiBzdGF0dXMgKi8KKworCUlQVlNfQ01EX1NFVF9DT05GSUcsCQkvKiBzZXQgY29uZmlnIHNldHRpbmdzICovCisJSVBWU19DTURfR0VUX0NPTkZJRywJCS8qIGdldCBjb25maWcgc2V0dGluZ3MgKi8KKworCUlQVlNfQ01EX1NFVF9JTkZPLAkJLyogb25seSB1c2VkIGluIEdFVF9JTkZPIHJlcGx5ICovCisJSVBWU19DTURfR0VUX0lORk8sCQkvKiBnZXQgZ2VuZXJhbCBJUFZTIGluZm8gKi8KKworCUlQVlNfQ01EX1pFUk8sCQkJLyogemVybyBhbGwgY291bnRlcnMgYW5kIHN0YXRzICovCisJSVBWU19DTURfRkxVU0gsCQkJLyogZmx1c2ggc2VydmljZXMgYW5kIGRlc3RzICovCisKKwlfX0lQVlNfQ01EX01BWCwKK307CisKKyNkZWZpbmUgSVBWU19DTURfTUFYIChfX0lQVlNfQ01EX01BWCAtIDEpCisKKy8qIEF0dHJpYnV0ZXMgdXNlZCBpbiB0aGUgZmlyc3QgbGV2ZWwgb2YgY29tbWFuZHMgKi8KK2VudW0geworCUlQVlNfQ01EX0FUVFJfVU5TUEVDID0gMCwKKwlJUFZTX0NNRF9BVFRSX1NFUlZJQ0UsCQkvKiBuZXN0ZWQgc2VydmljZSBhdHRyaWJ1dGUgKi8KKwlJUFZTX0NNRF9BVFRSX0RFU1QsCQkvKiBuZXN0ZWQgZGVzdGluYXRpb24gYXR0cmlidXRlICovCisJSVBWU19DTURfQVRUUl9EQUVNT04sCQkvKiBuZXN0ZWQgc3luYyBkYWVtb24gYXR0cmlidXRlICovCisJSVBWU19DTURfQVRUUl9USU1FT1VUX1RDUCwJLyogVENQIGNvbm5lY3Rpb24gdGltZW91dCAqLworCUlQVlNfQ01EX0FUVFJfVElNRU9VVF9UQ1BfRklOLAkvKiBUQ1AgRklOIHdhaXQgdGltZW91dCAqLworCUlQVlNfQ01EX0FUVFJfVElNRU9VVF9VRFAsCS8qIFVEUCB0aW1lb3V0ICovCisJX19JUFZTX0NNRF9BVFRSX01BWCwKK307CisKKyNkZWZpbmUgSVBWU19DTURfQVRUUl9NQVggKF9fSVBWU19TVkNfQVRUUl9NQVggLSAxKQorCisvKgorICogQXR0cmlidXRlcyB1c2VkIHRvIGRlc2NyaWJlIGEgc2VydmljZQorICoKKyAqIFVzZWQgaW5zaWRlIG5lc3RlZCBhdHRyaWJ1dGUgSVBWU19DTURfQVRUUl9TRVJWSUNFCisgKi8KK2VudW0geworCUlQVlNfU1ZDX0FUVFJfVU5TUEVDID0gMCwKKwlJUFZTX1NWQ19BVFRSX0FGLAkJLyogYWRkcmVzcyBmYW1pbHkgKi8KKwlJUFZTX1NWQ19BVFRSX1BST1RPQ09MLAkJLyogdmlydHVhbCBzZXJ2aWNlIHByb3RvY29sICovCisJSVBWU19TVkNfQVRUUl9BRERSLAkJLyogdmlydHVhbCBzZXJ2aWNlIGFkZHJlc3MgKi8KKwlJUFZTX1NWQ19BVFRSX1BPUlQsCQkvKiB2aXJ0dWFsIHNlcnZpY2UgcG9ydCAqLworCUlQVlNfU1ZDX0FUVFJfRldNQVJLLAkJLyogZmlyZXdhbGwgbWFyayBvZiBzZXJ2aWNlICovCisKKwlJUFZTX1NWQ19BVFRSX1NDSEVEX05BTUUsCS8qIG5hbWUgb2Ygc2NoZWR1bGVyICovCisJSVBWU19TVkNfQVRUUl9GTEFHUywJCS8qIHZpcnR1YWwgc2VydmljZSBmbGFncyAqLworCUlQVlNfU1ZDX0FUVFJfVElNRU9VVCwJCS8qIHBlcnNpc3RlbnQgdGltZW91dCAqLworCUlQVlNfU1ZDX0FUVFJfTkVUTUFTSywJCS8qIHBlcnNpc3RlbnQgbmV0bWFzayAqLworCisJSVBWU19TVkNfQVRUUl9TVEFUUywJCS8qIG5lc3RlZCBhdHRyaWJ1dGUgZm9yIHNlcnZpY2Ugc3RhdHMgKi8KKworCUlQVlNfU1ZDX0FUVFJfUEVfTkFNRSwJCS8qIG5hbWUgb2YgY3QgcmV0cmlldmVyICovCisKKwlfX0lQVlNfU1ZDX0FUVFJfTUFYLAorfTsKKworI2RlZmluZSBJUFZTX1NWQ19BVFRSX01BWCAoX19JUFZTX1NWQ19BVFRSX01BWCAtIDEpCisKKy8qCisgKiBBdHRyaWJ1dGVzIHVzZWQgdG8gZGVzY3JpYmUgYSBkZXN0aW5hdGlvbiAocmVhbCBzZXJ2ZXIpCisgKgorICogVXNlZCBpbnNpZGUgbmVzdGVkIGF0dHJpYnV0ZSBJUFZTX0NNRF9BVFRSX0RFU1QKKyAqLworZW51bSB7CisJSVBWU19ERVNUX0FUVFJfVU5TUEVDID0gMCwKKwlJUFZTX0RFU1RfQVRUUl9BRERSLAkJLyogcmVhbCBzZXJ2ZXIgYWRkcmVzcyAqLworCUlQVlNfREVTVF9BVFRSX1BPUlQsCQkvKiByZWFsIHNlcnZlciBwb3J0ICovCisKKwlJUFZTX0RFU1RfQVRUUl9GV0RfTUVUSE9ELAkvKiBmb3J3YXJkaW5nIG1ldGhvZCAqLworCUlQVlNfREVTVF9BVFRSX1dFSUdIVCwJCS8qIGRlc3RpbmF0aW9uIHdlaWdodCAqLworCisJSVBWU19ERVNUX0FUVFJfVV9USFJFU0gsCS8qIHVwcGVyIHRocmVzaG9sZCAqLworCUlQVlNfREVTVF9BVFRSX0xfVEhSRVNILAkvKiBsb3dlciB0aHJlc2hvbGQgKi8KKworCUlQVlNfREVTVF9BVFRSX0FDVElWRV9DT05OUywJLyogYWN0aXZlIGNvbm5lY3Rpb25zICovCisJSVBWU19ERVNUX0FUVFJfSU5BQ1RfQ09OTlMsCS8qIGluYWN0aXZlIGNvbm5lY3Rpb25zICovCisJSVBWU19ERVNUX0FUVFJfUEVSU0lTVF9DT05OUywJLyogcGVyc2lzdGVudCBjb25uZWN0aW9ucyAqLworCisJSVBWU19ERVNUX0FUVFJfU1RBVFMsCQkvKiBuZXN0ZWQgYXR0cmlidXRlIGZvciBkZXN0IHN0YXRzICovCisJX19JUFZTX0RFU1RfQVRUUl9NQVgsCit9OworCisjZGVmaW5lIElQVlNfREVTVF9BVFRSX01BWCAoX19JUFZTX0RFU1RfQVRUUl9NQVggLSAxKQorCisvKgorICogQXR0cmlidXRlcyBkZXNjcmliaW5nIGEgc3luYyBkYWVtb24KKyAqCisgKiBVc2VkIGluc2lkZSBuZXN0ZWQgYXR0cmlidXRlIElQVlNfQ01EX0FUVFJfREFFTU9OCisgKi8KK2VudW0geworCUlQVlNfREFFTU9OX0FUVFJfVU5TUEVDID0gMCwKKwlJUFZTX0RBRU1PTl9BVFRSX1NUQVRFLAkJLyogc3luYyBkYWVtb24gc3RhdGUgKG1hc3Rlci9iYWNrdXApICovCisJSVBWU19EQUVNT05fQVRUUl9NQ0FTVF9JRk4sCS8qIG11bHRpY2FzdCBpbnRlcmZhY2UgbmFtZSAqLworCUlQVlNfREFFTU9OX0FUVFJfU1lOQ19JRCwJLyogU3luY0lEIHdlIGJlbG9uZyB0byAqLworCV9fSVBWU19EQUVNT05fQVRUUl9NQVgsCit9OworCisjZGVmaW5lIElQVlNfREFFTU9OX0FUVFJfTUFYIChfX0lQVlNfREFFTU9OX0FUVFJfTUFYIC0gMSkKKworLyoKKyAqIEF0dHJpYnV0ZXMgdXNlZCB0byBkZXNjcmliZSBzZXJ2aWNlIG9yIGRlc3RpbmF0aW9uIGVudHJ5IHN0YXRpc3RpY3MKKyAqCisgKiBVc2VkIGluc2lkZSBuZXN0ZWQgYXR0cmlidXRlcyBJUFZTX1NWQ19BVFRSX1NUQVRTIGFuZCBJUFZTX0RFU1RfQVRUUl9TVEFUUworICovCitlbnVtIHsKKwlJUFZTX1NUQVRTX0FUVFJfVU5TUEVDID0gMCwKKwlJUFZTX1NUQVRTX0FUVFJfQ09OTlMsCQkvKiBjb25uZWN0aW9ucyBzY2hlZHVsZWQgKi8KKwlJUFZTX1NUQVRTX0FUVFJfSU5QS1RTLAkJLyogaW5jb21pbmcgcGFja2V0cyAqLworCUlQVlNfU1RBVFNfQVRUUl9PVVRQS1RTLAkvKiBvdXRnb2luZyBwYWNrZXRzICovCisJSVBWU19TVEFUU19BVFRSX0lOQllURVMsCS8qIGluY29taW5nIGJ5dGVzICovCisJSVBWU19TVEFUU19BVFRSX09VVEJZVEVTLAkvKiBvdXRnb2luZyBieXRlcyAqLworCisJSVBWU19TVEFUU19BVFRSX0NQUywJCS8qIGN1cnJlbnQgY29ubmVjdGlvbiByYXRlICovCisJSVBWU19TVEFUU19BVFRSX0lOUFBTLAkJLyogY3VycmVudCBpbiBwYWNrZXQgcmF0ZSAqLworCUlQVlNfU1RBVFNfQVRUUl9PVVRQUFMsCQkvKiBjdXJyZW50IG91dCBwYWNrZXQgcmF0ZSAqLworCUlQVlNfU1RBVFNfQVRUUl9JTkJQUywJCS8qIGN1cnJlbnQgaW4gYnl0ZSByYXRlICovCisJSVBWU19TVEFUU19BVFRSX09VVEJQUywJCS8qIGN1cnJlbnQgb3V0IGJ5dGUgcmF0ZSAqLworCV9fSVBWU19TVEFUU19BVFRSX01BWCwKK307CisKKyNkZWZpbmUgSVBWU19TVEFUU19BVFRSX01BWCAoX19JUFZTX1NUQVRTX0FUVFJfTUFYIC0gMSkKKworLyogQXR0cmlidXRlcyB1c2VkIGluIHJlc3BvbnNlIHRvIElQVlNfQ01EX0dFVF9JTkZPIGNvbW1hbmQgKi8KK2VudW0geworCUlQVlNfSU5GT19BVFRSX1VOU1BFQyA9IDAsCisJSVBWU19JTkZPX0FUVFJfVkVSU0lPTiwJCS8qIElQVlMgdmVyc2lvbiBudW1iZXIgKi8KKwlJUFZTX0lORk9fQVRUUl9DT05OX1RBQl9TSVpFLAkvKiBzaXplIG9mIGNvbm5lY3Rpb24gaGFzaCB0YWJsZSAqLworCV9fSVBWU19JTkZPX0FUVFJfTUFYLAorfTsKKworI2RlZmluZSBJUFZTX0lORk9fQVRUUl9NQVggKF9fSVBWU19JTkZPX0FUVFJfTUFYIC0gMSkKKworI2VuZGlmCS8qIF9JUF9WU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGE1M2ExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcGMuaApAQCAtMCwwICsxLDgxIEBACisjaWZuZGVmIF9MSU5VWF9JUENfSAorI2RlZmluZSBfTElOVVhfSVBDX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgSVBDX1BSSVZBVEUgKChfX2tlcm5lbF9rZXlfdCkgMCkgIAorCisvKiBPYnNvbGV0ZSwgdXNlZCBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbmQgbGliYzUgY29tcGlsZXMgKi8KK3N0cnVjdCBpcGNfcGVybQoreworCV9fa2VybmVsX2tleV90CWtleTsKKwlfX2tlcm5lbF91aWRfdAl1aWQ7CisJX19rZXJuZWxfZ2lkX3QJZ2lkOworCV9fa2VybmVsX3VpZF90CWN1aWQ7CisJX19rZXJuZWxfZ2lkX3QJY2dpZDsKKwlfX2tlcm5lbF9tb2RlX3QJbW9kZTsgCisJdW5zaWduZWQgc2hvcnQJc2VxOworfTsKKworLyogSW5jbHVkZSB0aGUgZGVmaW5pdGlvbiBvZiBpcGM2NF9wZXJtICovCisjaW5jbHVkZSA8YXNtL2lwY2J1Zi5oPgorCisvKiByZXNvdXJjZSBnZXQgcmVxdWVzdCBmbGFncyAqLworI2RlZmluZSBJUENfQ1JFQVQgIDAwMDAxMDAwICAgLyogY3JlYXRlIGlmIGtleSBpcyBub25leGlzdGVudCAqLworI2RlZmluZSBJUENfRVhDTCAgIDAwMDAyMDAwICAgLyogZmFpbCBpZiBrZXkgZXhpc3RzICovCisjZGVmaW5lIElQQ19OT1dBSVQgMDAwMDQwMDAgICAvKiByZXR1cm4gZXJyb3Igb24gd2FpdCAqLworCisvKiB0aGVzZSBmaWVsZHMgYXJlIHVzZWQgYnkgdGhlIERJUEMgcGFja2FnZSBzbyB0aGUga2VybmVsIGFzIHN0YW5kYXJkCisgICBzaG91bGQgYXZvaWQgdXNpbmcgdGhlbSBpZiBwb3NzaWJsZSAqLworICAgCisjZGVmaW5lIElQQ19ESVBDIDAwMDEwMDAwICAvKiBtYWtlIGl0IGRpc3RyaWJ1dGVkICovCisjZGVmaW5lIElQQ19PV04gIDAwMDIwMDAwICAvKiB0aGlzIG1hY2hpbmUgaXMgdGhlIERJUEMgb3duZXIgKi8KKworLyogCisgKiBDb250cm9sIGNvbW1hbmRzIHVzZWQgd2l0aCBzZW1jdGwsIG1zZ2N0bCBhbmQgc2htY3RsIAorICogc2VlIGFsc28gc3BlY2lmaWMgY29tbWFuZHMgaW4gc2VtLmgsIG1zZy5oIGFuZCBzaG0uaAorICovCisjZGVmaW5lIElQQ19STUlEIDAgICAgIC8qIHJlbW92ZSByZXNvdXJjZSAqLworI2RlZmluZSBJUENfU0VUICAxICAgICAvKiBzZXQgaXBjX3Blcm0gb3B0aW9ucyAqLworI2RlZmluZSBJUENfU1RBVCAyICAgICAvKiBnZXQgaXBjX3Blcm0gb3B0aW9ucyAqLworI2RlZmluZSBJUENfSU5GTyAzICAgICAvKiBzZWUgaXBjcyAqLworCisvKgorICogVmVyc2lvbiBmbGFncyBmb3Igc2VtY3RsLCBtc2djdGwsIGFuZCBzaG1jdGwgY29tbWFuZHMKKyAqIFRoZXNlIGFyZSBwYXNzZWQgYXMgYml0ZmxhZ3Mgb3ItZWQgd2l0aCB0aGUgYWN0dWFsIGNvbW1hbmQKKyAqLworI2RlZmluZSBJUENfT0xEIDAJLyogT2xkIHZlcnNpb24gKG5vIDMyLWJpdCBVSUQgc3VwcG9ydCBvbiBtYW55CisJCQkgICBhcmNoaXRlY3R1cmVzKSAqLworI2RlZmluZSBJUENfNjQgIDB4MDEwMCAgLyogTmV3IHZlcnNpb24gKHN1cHBvcnQgMzItYml0IFVJRHMsIGJpZ2dlcgorCQkJICAgbWVzc2FnZSBzaXplcywgZXRjLiAqLworCisvKgorICogVGhlc2UgYXJlIHVzZWQgdG8gd3JhcCBzeXN0ZW0gY2FsbHMuCisgKgorICogU2VlIGFyY2hpdGVjdHVyZSBjb2RlIGZvciB1Z2x5IGRldGFpbHMuLgorICovCitzdHJ1Y3QgaXBjX2tsdWRnZSB7CisJc3RydWN0IG1zZ2J1ZiAqbXNncDsKKwlsb25nIG1zZ3R5cDsKK307CisKKyNkZWZpbmUgU0VNT1AJCSAxCisjZGVmaW5lIFNFTUdFVAkJIDIKKyNkZWZpbmUgU0VNQ1RMCQkgMworI2RlZmluZSBTRU1USU1FRE9QCSA0CisjZGVmaW5lIE1TR1NORAkJMTEKKyNkZWZpbmUgTVNHUkNWCQkxMgorI2RlZmluZSBNU0dHRVQJCTEzCisjZGVmaW5lIE1TR0NUTAkJMTQKKyNkZWZpbmUgU0hNQVQJCTIxCisjZGVmaW5lIFNITURUCQkyMgorI2RlZmluZSBTSE1HRVQJCTIzCisjZGVmaW5lIFNITUNUTAkJMjQKKworLyogVXNlZCBieSB0aGUgRElQQyBwYWNrYWdlLCB0cnkgYW5kIGF2b2lkIHJldXNpbmcgaXQgKi8KKyNkZWZpbmUgRElQQyAgICAgICAgICAgIDI1CisKKyNkZWZpbmUgSVBDQ0FMTCh2ZXJzaW9uLG9wKQkoKHZlcnNpb24pPDwxNiB8IChvcCkpCisKKworI2VuZGlmIC8qIF9MSU5VWF9JUENfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcG1pLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWZlNWU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcG1pLmgKQEAgLTAsMCArMSw0NTYgQEAKKy8qCisgKiBpcG1pLmgKKyAqCisgKiBNb250YVZpc3RhIElQTUkgaW50ZXJmYWNlCisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIENvcmV5IE1pbnlhcmQgPG1pbnlhcmRAbXZpc3RhLmNvbT4KKyAqICAgICAgICAgc291cmNlQG12aXN0YS5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICogIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAqICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiAgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfSVBNSV9ICisjZGVmaW5lIF9fTElOVVhfSVBNSV9ICisKKyNpbmNsdWRlIDxsaW51eC9pcG1pX21zZ2RlZnMuaD4KKworCisvKgorICogVGhpcyBmaWxlIGRlc2NyaWJlcyBhbiBpbnRlcmZhY2UgdG8gYW4gSVBNSSBkcml2ZXIuICBZb3UgaGF2ZSB0bworICogaGF2ZSBhIGZhaXJseSBnb29kIHVuZGVyc3RhbmRpbmcgb2YgSVBNSSB0byB1c2UgdGhpcywgc28gZ28gcmVhZAorICogdGhlIHNwZWNzIGZpcnN0IGJlZm9yZSBhY3R1YWxseSB0cnlpbmcgdG8gZG8gYW55dGhpbmcuCisgKgorICogV2l0aCB0aGF0IHNhaWQsIHRoaXMgZHJpdmVyIHByb3ZpZGVzIGEgbXVsdGktdXNlciBpbnRlcmZhY2UgdG8gdGhlCisgKiBJUE1JIGRyaXZlciwgYW5kIGl0IGFsbG93cyBtdWx0aXBsZSBJUE1JIHBoeXNpY2FsIGludGVyZmFjZXMgYmVsb3cKKyAqIHRoZSBkcml2ZXIuICBUaGUgcGh5c2ljYWwgaW50ZXJmYWNlcyBiaW5kIGFzIGEgbG93ZXIgbGF5ZXIgb24gdGhlCisgKiBkcml2ZXIuICBUaGV5IGFwcGVhciBhcyBpbnRlcmZhY2VzIHRvIHRoZSBhcHBsaWNhdGlvbiB1c2luZyB0aGlzCisgKiBpbnRlcmZhY2UuCisgKgorICogTXVsdGktdXNlciBtZWFucyB0aGF0IG11bHRpcGxlIGFwcGxpY2F0aW9ucyBtYXkgdXNlIHRoZSBkcml2ZXIsCisgKiBzZW5kIGNvbW1hbmRzLCByZWNlaXZlIHJlc3BvbnNlcywgZXRjLiAgVGhlIGRyaXZlciBrZWVwcyB0cmFjayBvZgorICogY29tbWFuZHMgdGhlIHVzZXIgc2VuZHMgYW5kIHRyYWNrcyB0aGUgcmVzcG9uc2VzLiAgVGhlIHJlc3BvbnNlcworICogd2lsbCBnbyBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHNlbmQgdGhlIGNvbW1hbmQuICBJZiB0aGUKKyAqIHJlc3BvbnNlIGRvZXNuJ3QgY29tZSBiYWNrIGluIHRpbWUsIHRoZSBkcml2ZXIgd2lsbCByZXR1cm4gYQorICogdGltZW91dCBlcnJvciByZXNwb25zZSB0byB0aGUgYXBwbGljYXRpb24uICBBc3luY2hyb25vdXMgZXZlbnRzCisgKiBmcm9tIHRoZSBCTUMgZXZlbnQgcXVldWUgd2lsbCBnbyB0byBhbGwgdXNlcnMgYm91bmQgdG8gdGhlIGRyaXZlci4KKyAqIFRoZSBpbmNvbWluZyBldmVudCBxdWV1ZSBpbiB0aGUgQk1DIHdpbGwgYXV0b21hdGljYWxseSBiZSBmbHVzaGVkCisgKiBpZiBpdCBiZWNvbWVzIGZ1bGwgYW5kIGl0IGlzIHF1ZXJpZWQgb25jZSBhIHNlY29uZCB0byBzZWUgaWYKKyAqIGFueXRoaW5nIGlzIGluIGl0LiAgSW5jb21pbmcgY29tbWFuZHMgdG8gdGhlIGRyaXZlciB3aWxsIGdldAorICogZGVsaXZlcmVkIGFzIGNvbW1hbmRzLgorICoKKyAqIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHR3byBtYWluIGludGVyZmFjZXM6IG9uZSBmb3IgaW4ta2VybmVsCisgKiBhcHBsaWNhdGlvbnMgYW5kIGFub3RoZXIgZm9yIHVzZXJsYW5kIGFwcGxpY2F0aW9ucy4gIFRoZQorICogY2FwYWJpbGl0aWVzIGFyZSBiYXNpY2FsbHkgdGhlIHNhbWUgZm9yIGJvdGggaW50ZXJmYWNlLCBhbHRob3VnaAorICogdGhlIGludGVyZmFjZXMgYXJlIHNvbWV3aGF0IGRpZmZlcmVudC4gIFRoZSBzdHVmZiBpbiB0aGUKKyAqICNpZmRlZiBfX0tFUk5FTF9fIGJlbG93IGlzIHRoZSBpbi1rZXJuZWwgaW50ZXJmYWNlLiAgVGhlIHVzZXJsYW5kCisgKiBpbnRlcmZhY2UgaXMgZGVmaW5lZCBsYXRlciBpbiB0aGUgZmlsZS4gICovCisKKworCisvKgorICogVGhpcyBpcyBhbiBvdmVybGF5IGZvciBhbGwgdGhlIGFkZHJlc3MgdHlwZXMsIHNvIGl0J3MgZWFzeSB0bworICogZGV0ZXJtaW5lIHRoZSBhY3R1YWwgYWRkcmVzcyB0eXBlLiAgVGhpcyBpcyBraW5kIG9mIGxpa2UgYWRkcmVzc2VzCisgKiB3b3JrIGZvciBzb2NrZXRzLgorICovCisjZGVmaW5lIElQTUlfTUFYX0FERFJfU0laRSAzMgorc3RydWN0IGlwbWlfYWRkciB7CisJIC8qIFRyeSB0byB0YWtlIHRoZXNlIGZyb20gdGhlICJDaGFubmVsIE1lZGl1bSBUeXBlIiB0YWJsZQorCSAgICBpbiBzZWN0aW9uIDYuNSBvZiB0aGUgSVBNSSAxLjUgbWFudWFsLiAqLworCWludCAgIGFkZHJfdHlwZTsKKwlzaG9ydCBjaGFubmVsOworCWNoYXIgIGRhdGFbSVBNSV9NQVhfQUREUl9TSVpFXTsKK307CisKKy8qCisgKiBXaGVuIHRoZSBhZGRyZXNzIGlzIG5vdCB1c2VkLCB0aGUgdHlwZSB3aWxsIGJlIHNldCB0byB0aGlzIHZhbHVlLgorICogVGhlIGNoYW5uZWwgaXMgdGhlIEJNQydzIGNoYW5uZWwgbnVtYmVyIGZvciB0aGUgY2hhbm5lbCAodXN1YWxseQorICogMCksIG9yIElQTUNfQk1DX0NIQU5ORUwgaWYgY29tbXVuaWNhdGluZyBkaXJlY3RseSB3aXRoIHRoZSBCTUMuCisgKi8KKyNkZWZpbmUgSVBNSV9TWVNURU1fSU5URVJGQUNFX0FERFJfVFlQRQkweDBjCitzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgeworCWludCAgICAgICAgICAgYWRkcl90eXBlOworCXNob3J0ICAgICAgICAgY2hhbm5lbDsKKwl1bnNpZ25lZCBjaGFyIGx1bjsKK307CisKKy8qIEFuIElQTUIgQWRkcmVzcy4gKi8KKyNkZWZpbmUgSVBNSV9JUE1CX0FERFJfVFlQRQkJMHgwMQorLyogVXNlZCBmb3IgYnJvYWRjYXN0IGdldCBkZXZpY2UgaWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gMTcuOSBvZiB0aGUKKyAgIElQTUkgMS41IG1hbnVhbC4gKi8KKyNkZWZpbmUgSVBNSV9JUE1CX0JST0FEQ0FTVF9BRERSX1RZUEUJMHg0MQorc3RydWN0IGlwbWlfaXBtYl9hZGRyIHsKKwlpbnQgICAgICAgICAgIGFkZHJfdHlwZTsKKwlzaG9ydCAgICAgICAgIGNoYW5uZWw7CisJdW5zaWduZWQgY2hhciBzbGF2ZV9hZGRyOworCXVuc2lnbmVkIGNoYXIgbHVuOworfTsKKworLyoKKyAqIEEgTEFOIEFkZHJlc3MuICBUaGlzIGlzIGFuIGFkZHJlc3MgdG8vZnJvbSBhIExBTiBpbnRlcmZhY2UgYnJpZGdlZAorICogYnkgdGhlIEJNQywgbm90IGFuIGFkZHJlc3MgYWN0dWFsbHkgb3V0IG9uIHRoZSBMQU4uCisgKgorICogQSBjb25zY2lvdXMgZGVjaXNpb24gd2FzIG1hZGUgaGVyZSB0byBkZXZpYXRlIHNsaWdodGx5IGZyb20gdGhlIElQTUkKKyAqIHNwZWMuICBXZSBkbyBub3QgdXNlIHJxU1dJRCBhbmQgcnNTV0lEIGxpa2UgaXQgc2hvd3MgaW4gdGhlCisgKiBtZXNzYWdlLiAgSW5zdGVhZCwgd2UgdXNlIHJlbW90ZV9TV0lEIGFuZCBsb2NhbF9TV0lELiAgVGhpcyBtZWFucworICogdGhhdCBhbnkgbWVzc2FnZSAoYSByZXF1ZXN0IG9yIHJlc3BvbnNlKSBmcm9tIGFub3RoZXIgZGV2aWNlIHdpbGwKKyAqIGFsd2F5cyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgYWRkcmVzcy4gIElmIHlvdSBkaWRuJ3QgZG8gdGhpcywKKyAqIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgZnJvbSB0aGUgc2FtZSBkZXZpY2Ugd291bGQgaGF2ZSBkaWZmZXJlbnQKKyAqIGFkZHJlc3NlcywgYW5kIHRoYXQncyBub3QgdG9vIGNvb2wuCisgKgorICogSW4gdGhpcyBhZGRyZXNzLCB0aGUgcmVtb3RlX1NXSUQgaXMgYWx3YXlzIHRoZSBTV0lEIHRoZSByZW1vdGUKKyAqIG1lc3NhZ2UgY2FtZSBmcm9tLCBvciB0aGUgU1dJRCB3ZSBhcmUgc2VuZGluZyB0aGUgbWVzc2FnZSB0by4KKyAqIGxvY2FsX1NXSUQgaXMgYWx3YXlzIG91ciBTV0lELiAgTm90ZSB0aGF0IGhhdmluZyBvdXIgU1dJRCBpbiB0aGUKKyAqIG1lc3NhZ2UgaXMgYSBsaXR0bGUgd2VpcmQsIGJ1dCB0aGlzIGlzIHJlcXVpcmVkLgorICovCisjZGVmaW5lIElQTUlfTEFOX0FERFJfVFlQRQkJMHgwNAorc3RydWN0IGlwbWlfbGFuX2FkZHIgeworCWludCAgICAgICAgICAgYWRkcl90eXBlOworCXNob3J0ICAgICAgICAgY2hhbm5lbDsKKwl1bnNpZ25lZCBjaGFyIHByaXZpbGVnZTsKKwl1bnNpZ25lZCBjaGFyIHNlc3Npb25faGFuZGxlOworCXVuc2lnbmVkIGNoYXIgcmVtb3RlX1NXSUQ7CisJdW5zaWduZWQgY2hhciBsb2NhbF9TV0lEOworCXVuc2lnbmVkIGNoYXIgbHVuOworfTsKKworCisvKgorICogQ2hhbm5lbCBmb3IgdGFsa2luZyBkaXJlY3RseSB3aXRoIHRoZSBCTUMuICBXaGVuIHVzaW5nIHRoaXMKKyAqIGNoYW5uZWwsIFRoaXMgaXMgZm9yIHRoZSBzeXN0ZW0gaW50ZXJmYWNlIGFkZHJlc3MgdHlwZSBvbmx5LiAgRklYTUUKKyAqIC0gaXMgdGhpcyByaWdodCwgb3Igc2hvdWxkIHdlIHVzZSAtMT8KKyAqLworI2RlZmluZSBJUE1JX0JNQ19DSEFOTkVMICAweGYKKyNkZWZpbmUgSVBNSV9OVU1fQ0hBTk5FTFMgMHgxMAorCisvKgorICogVXNlZCB0byBzaWduaWZ5IGFuICJhbGwgY2hhbm5lbCIgYml0bWFzay4gIFRoaXMgaXMgbW9yZSB0aGFuIHRoZQorICogYWN0dWFsIG51bWJlciBvZiBjaGFubmVscyBiZWNhdXNlIHRoaXMgaXMgdXNlZCBpbiB1c2VybGFuZCBhbmQKKyAqIHdpbGwgY292ZXIgdXMgaWYgdGhlIG51bWJlciBvZiBjaGFubmVscyBpcyBleHRlbmRlZC4KKyAqLworI2RlZmluZSBJUE1JX0NIQU5fQUxMICAgICAofjApCisKKworLyoKKyAqIEEgcmF3IElQTUkgbWVzc2FnZSB3aXRob3V0IGFueSBhZGRyZXNzaW5nLiAgVGhpcyBjb3ZlcnMgYm90aAorICogY29tbWFuZHMgYW5kIHJlc3BvbnNlcy4gIFRoZSBjb21wbGV0aW9uIGNvZGUgaXMgYWx3YXlzIHRoZSBmaXJzdAorICogYnl0ZSBvZiBkYXRhIGluIHRoZSByZXNwb25zZSAoYXMgdGhlIHNwZWMgc2hvd3MgdGhlIG1lc3NhZ2VzIGxhaWQKKyAqIG91dCkuCisgKi8KK3N0cnVjdCBpcG1pX21zZyB7CisJdW5zaWduZWQgY2hhciAgbmV0Zm47CisJdW5zaWduZWQgY2hhciAgY21kOworCXVuc2lnbmVkIHNob3J0IGRhdGFfbGVuOworCXVuc2lnbmVkIGNoYXIgICpkYXRhOworfTsKKworc3RydWN0IGtlcm5lbF9pcG1pX21zZyB7CisJdW5zaWduZWQgY2hhciAgbmV0Zm47CisJdW5zaWduZWQgY2hhciAgY21kOworCXVuc2lnbmVkIHNob3J0IGRhdGFfbGVuOworCXVuc2lnbmVkIGNoYXIgICpkYXRhOworfTsKKworLyoKKyAqIFZhcmlvdXMgZGVmaW5lcyB0aGF0IGFyZSB1c2VmdWwgZm9yIElQTUkgYXBwbGljYXRpb25zLgorICovCisjZGVmaW5lIElQTUlfSU5WQUxJRF9DTURfQ09NUExFVElPTl9DT0RFCTB4QzEKKyNkZWZpbmUgSVBNSV9USU1FT1VUX0NPTVBMRVRJT05fQ09ERQkJMHhDMworI2RlZmluZSBJUE1JX1VOS05PV05fRVJSX0NPTVBMRVRJT05fQ09ERQkweGZmCisKKworLyoKKyAqIFJlY2VpdmUgdHlwZXMgZm9yIG1lc3NhZ2VzIGNvbWluZyBmcm9tIHRoZSByZWNlaXZlIGludGVyZmFjZS4gIFRoaXMKKyAqIGlzIHVzZWQgZm9yIHRoZSByZWNlaXZlIGluLWtlcm5lbCBpbnRlcmZhY2UgYW5kIGluIHRoZSByZWNlaXZlCisgKiBJT0NUTC4KKyAqCisgKiBUaGUgIklQTUlfUkVTUE9OU0VfUkVTUE5PU0VfVFlQRSIgaXMgYSBsaXR0bGUgc3RyYW5nZSBzb3VuZGluZywgYnV0CisgKiBpdCBhbGxvd3MgeW91IHRvIGdldCB0aGUgbWVzc2FnZSByZXN1bHRzIHdoZW4geW91IHNlbmQgYSByZXNwb25zZQorICogbWVzc2FnZS4KKyAqLworI2RlZmluZSBJUE1JX1JFU1BPTlNFX1JFQ1ZfVFlQRQkJMSAvKiBBIHJlc3BvbnNlIHRvIGEgY29tbWFuZCAqLworI2RlZmluZSBJUE1JX0FTWU5DX0VWRU5UX1JFQ1ZfVFlQRQkyIC8qIFNvbWV0aGluZyBmcm9tIHRoZSBldmVudCBxdWV1ZSAqLworI2RlZmluZSBJUE1JX0NNRF9SRUNWX1RZUEUJCTMgLyogQSBjb21tYW5kIGZyb20gc29tZXdoZXJlIGVsc2UgKi8KKyNkZWZpbmUgSVBNSV9SRVNQT05TRV9SRVNQT05TRV9UWVBFCTQgLyogVGhlIHJlc3BvbnNlIGZvcgorCQkJCQkgICAgICBhIHNlbnQgcmVzcG9uc2UsIGdpdmluZyBhbnkKKwkJCQkJICAgICAgZXJyb3Igc3RhdHVzIGZvciBzZW5kaW5nIHRoZQorCQkJCQkgICAgICByZXNwb25zZS4gIFdoZW4geW91IHNlbmQgYQorCQkJCQkgICAgICByZXNwb25zZSBtZXNzYWdlLCB0aGlzIHdpbGwKKwkJCQkJICAgICAgYmUgcmV0dXJuZWQuICovCisjZGVmaW5lIElQTUlfT0VNX1JFQ1ZfVFlQRQkJNSAvKiBUaGUgcmVzcG9uc2UgZm9yIE9FTSBDaGFubmVscyAqLworCisvKiBOb3RlIHRoYXQgYXN5bmMgZXZlbnRzIGFuZCByZWNlaXZlZCBjb21tYW5kcyBkbyBub3QgaGF2ZSBhIGNvbXBsZXRpb24KKyAgIGNvZGUgYXMgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGluY29taW5nIGRhdGEsIHVubGlrZSBhIHJlc3BvbnNlLiAqLworCisKKy8qCisgKiBNb2RlcyBmb3IgaXBtaV9zZXRfbWFpbnRfbW9kZSgpIGFuZCB0aGUgdXNlcmxhbmQgSU9DVEwuICBUaGUgQVVUTworICogc2V0dGluZyBpcyB0aGUgZGVmYXVsdCBhbmQgbWVhbnMgaXQgd2lsbCBiZSBzZXQgb24gY2VydGFpbgorICogY29tbWFuZHMuICBIYXJkIHNldHRpbmcgaXQgb24gYW5kIG9mZiB3aWxsIG92ZXJyaWRlIGF1dG9tYXRpYworICogb3BlcmF0aW9uLgorICovCisjZGVmaW5lIElQTUlfTUFJTlRFTkFOQ0VfTU9ERV9BVVRPCTAKKyNkZWZpbmUgSVBNSV9NQUlOVEVOQU5DRV9NT0RFX09GRgkxCisjZGVmaW5lIElQTUlfTUFJTlRFTkFOQ0VfTU9ERV9PTgkyCisKKworCisvKgorICogVGhlIHVzZXJsYW5kIGludGVyZmFjZQorICovCisKKy8qCisgKiBUaGUgdXNlcmxhbmQgaW50ZXJmYWNlIGZvciB0aGUgSVBNSSBkcml2ZXIgaXMgYSBzdGFuZGFyZCBjaGFyYWN0ZXIKKyAqIGRldmljZSwgd2l0aCBlYWNoIGluc3RhbmNlIG9mIGFuIGludGVyZmFjZSByZWdpc3RlcmVkIGFzIGEgbWlub3IKKyAqIG51bWJlciB1bmRlciB0aGUgbWFqb3IgY2hhcmFjdGVyIGRldmljZS4KKyAqCisgKiBUaGUgcmVhZCBhbmQgd3JpdGUgY2FsbHMgZG8gbm90IHdvcmssIHRvIGdldCBtZXNzYWdlcyBpbiBhbmQgb3V0CisgKiByZXF1aXJlcyBpb2N0bCBjYWxscyBiZWNhdXNlIG9mIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBkYXRhLiAgc2VsZWN0CisgKiBhbmQgcG9sbCBkbyB3b3JrLCBzbyB5b3UgY2FuIHdhaXQgZm9yIGlucHV0IHVzaW5nIHRoZSBmaWxlCisgKiBkZXNjcmlwdG9yLCB5b3UganVzdCBjYW4gdXNlIHJlYWQgdG8gZ2V0IGl0LgorICoKKyAqIEluIGdlbmVyYWwsIHlvdSBzZW5kIGEgY29tbWFuZCBkb3duIHRvIHRoZSBpbnRlcmZhY2UgYW5kIHJlY2VpdmUKKyAqIHJlc3BvbnNlcyBiYWNrLiAgWW91IGNhbiB1c2UgdGhlIG1zZ2lkIHZhbHVlIHRvIGNvcnJlbGF0ZSBjb21tYW5kcworICogYW5kIHJlc3BvbnNlcywgdGhlIGRyaXZlciB3aWxsIHRha2UgY2FyZSBvZiBmaWd1cmluZyBvdXQgd2hpY2gKKyAqIGluY29taW5nIG1lc3NhZ2VzIGFyZSBmb3Igd2hpY2ggY29tbWFuZCBhbmQgZmluZCB0aGUgcHJvcGVyIG1zZ2lkCisgKiB2YWx1ZSB0byByZXBvcnQuICBZb3Ugd2lsbCBvbmx5IHJlY2VpdmUgcmVwb25zZXMgZm9yIGNvbW1hbmRzIHlvdQorICogc2VuZC4gIEFzeW5jaHJvbm91cyBldmVudHMsIGhvd2V2ZXIsIGdvIHRvIGFsbCBvcGVuIHVzZXJzLCBzbyB5b3UKKyAqIG11c3QgYmUgcmVhZHkgdG8gaGFuZGxlIHRoZXNlIChvciBpZ25vcmUgdGhlbSBpZiB5b3UgZG9uJ3QgY2FyZSkuCisgKgorICogVGhlIGFkZHJlc3MgdHlwZSBkZXBlbmRzIHVwb24gdGhlIGNoYW5uZWwgdHlwZS4gIFdoZW4gdGFsa2luZworICogZGlyZWN0bHkgdG8gdGhlIEJNQyAoSVBNQ19CTUNfQ0hBTk5FTCksIHRoZSBhZGRyZXNzIGlzIGlnbm9yZWQKKyAqIChJUE1JX1VOVVNFRF9BRERSX1RZUEUpLiAgV2hlbiB0YWxraW5nIHRvIGFuIElQTUIgY2hhbm5lbCwgeW91IG11c3QKKyAqIHN1cHBseSBhIHZhbGlkIElQTUIgYWRkcmVzcyB3aXRoIHRoZSBhZGRyX3R5cGUgc2V0IHByb3Blcmx5LgorICoKKyAqIFdoZW4gdGFsa2luZyB0byBub3JtYWwgY2hhbm5lbHMsIHRoZSBkcml2ZXIgdGFrZXMgY2FyZSBvZiB0aGUKKyAqIGRldGFpbHMgb2YgZm9ybWF0dGluZyBhbmQgc2VuZGluZyBtZXNzYWdlcyBvbiB0aGF0IGNoYW5uZWwuICBZb3UgZG8KKyAqIG5vdCwgZm9yIGluc3RhbmNlLCBoYXZlIHRvIGZvcm1hdCBhIHNlbmQgY29tbWFuZCwgeW91IGp1c3Qgc2VuZAorICogd2hhdGV2ZXIgY29tbWFuZCB5b3Ugd2FudCB0byB0aGUgY2hhbm5lbCwgdGhlIGRyaXZlciB3aWxsIGNyZWF0ZQorICogdGhlIHNlbmQgY29tbWFuZCwgYXV0b21hdGljYWxseSBpc3N1ZSByZWNlaXZlIGNvbW1hbmQgYW5kIGdldCBldmVuCisgKiBjb21tYW5kcywgYW5kIHBhc3MgdGhvc2UgdXAgdG8gdGhlIHByb3BlciB1c2VyLgorICovCisKKworLyogVGhlIG1hZ2ljIElPQ1RMIHZhbHVlIGZvciB0aGlzIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgSVBNSV9JT0NfTUFHSUMgJ2knCisKKworLyogTWVzc2FnZXMgc2VudCB0byB0aGUgaW50ZXJmYWNlIGFyZSB0aGlzIGZvcm1hdC4gKi8KK3N0cnVjdCBpcG1pX3JlcSB7CisJdW5zaWduZWQgY2hhciAqYWRkcjsgLyogQWRkcmVzcyB0byBzZW5kIHRoZSBtZXNzYWdlIHRvLiAqLworCXVuc2lnbmVkIGludCAgYWRkcl9sZW47CisKKwlsb25nICAgIG1zZ2lkOyAvKiBUaGUgc2VxdWVuY2UgbnVtYmVyIGZvciB0aGUgbWVzc2FnZS4gIFRoaXMKKwkJCSAgZXhhY3QgdmFsdWUgd2lsbCBiZSByZXBvcnRlZCBiYWNrIGluIHRoZQorCQkJICByZXNwb25zZSB0byB0aGlzIHJlcXVlc3QgaWYgaXQgaXMgYSBjb21tYW5kLgorCQkJICBJZiBpdCBpcyBhIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmUgdXNlZCBhcworCQkJICB0aGUgc2VxdWVuY2UgdmFsdWUgZm9yIHRoZSByZXNwb25zZS4gICovCisKKwlzdHJ1Y3QgaXBtaV9tc2cgbXNnOworfTsKKy8qCisgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgaW50ZXJmYWNlcy4gIGVycm9yIHZhbHVlcyBhcmU6CisgKiAgIC0gRUZBVUxUIC0gYW4gYWRkcmVzcyBzdXBwbGllZCB3YXMgaW52YWxpZC4KKyAqICAgLSBFSU5WQUwgLSBUaGUgYWRkcmVzcyBzdXBwbGllZCB3YXMgbm90IHZhbGlkLCBvciB0aGUgY29tbWFuZAorICogICAgICAgICAgICAgIHdhcyBub3QgYWxsb3dlZC4KKyAqICAgLSBFTVNHU0laRSAtIFRoZSBtZXNzYWdlIHRvIHdhcyB0b28gbGFyZ2UuCisgKiAgIC0gRU5PTUVNIC0gQnVmZmVycyBjb3VsZCBub3QgYmUgYWxsb2NhdGVkIGZvciB0aGUgY29tbWFuZC4KKyAqLworI2RlZmluZSBJUE1JQ1RMX1NFTkRfQ09NTUFORAkJX0lPUihJUE1JX0lPQ19NQUdJQywgMTMsCVwKKwkJCQkJICAgICBzdHJ1Y3QgaXBtaV9yZXEpCisKKy8qIE1lc3NhZ2VzIHNlbnQgdG8gdGhlIGludGVyZmFjZSB3aXRoIHRpbWluZyBwYXJhbWV0ZXJzIGFyZSB0aGlzCisgICBmb3JtYXQuICovCitzdHJ1Y3QgaXBtaV9yZXFfc2V0dGltZSB7CisJc3RydWN0IGlwbWlfcmVxIHJlcTsKKworCS8qIFNlZSBpcG1pX3JlcXVlc3Rfc2V0dGltZSgpIGFib3ZlIGZvciBkZXRhaWxzIG9uIHRoZXNlCisJICAgdmFsdWVzLiAqLworCWludCAgICAgICAgICByZXRyaWVzOworCXVuc2lnbmVkIGludCByZXRyeV90aW1lX21zOworfTsKKy8qCisgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgaW50ZXJmYWNlcyB3aXRoIHRpbWluZyBwYXJhbWV0ZXJzLiAgZXJyb3IgdmFsdWVzCisgKiBhcmU6CisgKiAgIC0gRUZBVUxUIC0gYW4gYWRkcmVzcyBzdXBwbGllZCB3YXMgaW52YWxpZC4KKyAqICAgLSBFSU5WQUwgLSBUaGUgYWRkcmVzcyBzdXBwbGllZCB3YXMgbm90IHZhbGlkLCBvciB0aGUgY29tbWFuZAorICogICAgICAgICAgICAgIHdhcyBub3QgYWxsb3dlZC4KKyAqICAgLSBFTVNHU0laRSAtIFRoZSBtZXNzYWdlIHRvIHdhcyB0b28gbGFyZ2UuCisgKiAgIC0gRU5PTUVNIC0gQnVmZmVycyBjb3VsZCBub3QgYmUgYWxsb2NhdGVkIGZvciB0aGUgY29tbWFuZC4KKyAqLworI2RlZmluZSBJUE1JQ1RMX1NFTkRfQ09NTUFORF9TRVRUSU1FCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDIxLAlcCisJCQkJCSAgICAgc3RydWN0IGlwbWlfcmVxX3NldHRpbWUpCisKKy8qIE1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIGludGVyZmFjZSBhcmUgdGhpcyBmb3JtYXQuICovCitzdHJ1Y3QgaXBtaV9yZWN2IHsKKwlpbnQgICAgIHJlY3ZfdHlwZTsgLyogSXMgdGhpcyBhIGNvbW1hbmQsIHJlc3BvbnNlIG9yIGFuCisJCQkgICAgICBhc3luY3Jvbm91cyBldmVudC4gKi8KKworCXVuc2lnbmVkIGNoYXIgKmFkZHI7ICAgIC8qIEFkZHJlc3MgdGhlIG1lc3NhZ2Ugd2FzIGZyb20gaXMgcHV0CisJCQkJICAgaGVyZS4gIFRoZSBjYWxsZXIgbXVzdCBzdXBwbHkgdGhlCisJCQkJICAgbWVtb3J5LiAqLworCXVuc2lnbmVkIGludCAgYWRkcl9sZW47IC8qIFRoZSBzaXplIG9mIHRoZSBhZGRyZXNzIGJ1ZmZlci4KKwkJCQkgICBUaGUgY2FsbGVyIHN1cHBsaWVzIHRoZSBmdWxsIGJ1ZmZlcgorCQkJCSAgIGxlbmd0aCwgdGhpcyB2YWx1ZSBpcyB1cGRhdGVkIHRvCisJCQkJICAgdGhlIGFjdHVhbCBtZXNzYWdlIGxlbmd0aCB3aGVuIHRoZQorCQkJCSAgIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuICovCisKKwlsb25nICAgIG1zZ2lkOyAvKiBUaGUgc2VxdWVuY2UgbnVtYmVyIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdAorCQkJICBpZiB0aGlzIGlzIGEgcmVzcG9uc2UuICBJZiB0aGlzIGlzIGEgY29tbWFuZCwKKwkJCSAgdGhpcyB3aWxsIGJlIHRoZSBzZXF1ZW5jZSBudW1iZXIgZnJvbSB0aGUKKwkJCSAgY29tbWFuZC4gKi8KKworCXN0cnVjdCBpcG1pX21zZyBtc2c7IC8qIFRoZSBkYXRhIGZpZWxkIG11c3QgcG9pbnQgdG8gYSBidWZmZXIuCisJCQkJVGhlIGRhdGFfc2l6ZSBmaWVsZCBtdXN0IGJlIHNldCB0byB0aGUKKwkJCQlzaXplIG9mIHRoZSBtZXNzYWdlIGJ1ZmZlci4gIFRoZQorCQkJCWNhbGxlciBzdXBwbGllcyB0aGUgZnVsbCBidWZmZXIKKwkJCQlsZW5ndGgsIHRoaXMgdmFsdWUgaXMgdXBkYXRlZCB0byB0aGUKKwkJCQlhY3R1YWwgbWVzc2FnZSBsZW5ndGggd2hlbiB0aGUgbWVzc2FnZQorCQkJCWlzIHJlY2VpdmVkLiAqLworfTsKKworLyoKKyAqIFJlY2VpdmUgYSBtZXNzYWdlLiAgZXJyb3IgdmFsdWVzOgorICogIC0gRUFHQUlOIC0gbm8gbWVzc2FnZXMgaW4gdGhlIHF1ZXVlLgorICogIC0gRUZBVUxUIC0gYW4gYWRkcmVzcyBzdXBwbGllZCB3YXMgaW52YWxpZC4KKyAqICAtIEVJTlZBTCAtIFRoZSBhZGRyZXNzIHN1cHBsaWVkIHdhcyBub3QgdmFsaWQuCisgKiAgLSBFTVNHU0laRSAtIFRoZSBtZXNzYWdlIHRvIHdhcyB0b28gbGFyZ2UgdG8gZml0IGludG8gdGhlIG1lc3NhZ2UgYnVmZmVyLAorICogICAgICAgICAgICAgICB0aGUgbWVzc2FnZSB3aWxsIGJlIGxlZnQgaW4gdGhlIGJ1ZmZlci4gKi8KKyNkZWZpbmUgSVBNSUNUTF9SRUNFSVZFX01TRwkJX0lPV1IoSVBNSV9JT0NfTUFHSUMsIDEyLAlcCisJCQkJCSAgICAgIHN0cnVjdCBpcG1pX3JlY3YpCisKKy8qCisgKiBMaWtlIFJFQ0VJVkVfTVNHLCBidXQgaWYgdGhlIG1lc3NhZ2Ugd29uJ3QgZml0IGluIHRoZSBidWZmZXIsIGl0CisgKiB3aWxsIHRydW5jYXRlIHRoZSBjb250ZW50cyBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlIGRhdGEgaW4gdGhlCisgKiBidWZmZXIuCisgKi8KKyNkZWZpbmUgSVBNSUNUTF9SRUNFSVZFX01TR19UUlVOQwlfSU9XUihJUE1JX0lPQ19NQUdJQywgMTEsCVwKKwkJCQkJICAgICAgc3RydWN0IGlwbWlfcmVjdikKKworLyogUmVnaXN0ZXIgdG8gZ2V0IGNvbW1hbmRzIGZyb20gb3RoZXIgZW50aXRpZXMgb24gdGhpcyBpbnRlcmZhY2UuICovCitzdHJ1Y3QgaXBtaV9jbWRzcGVjIHsKKwl1bnNpZ25lZCBjaGFyIG5ldGZuOworCXVuc2lnbmVkIGNoYXIgY21kOworfTsKKworLyoKKyAqIFJlZ2lzdGVyIHRvIHJlY2VpdmUgYSBzcGVjaWZpYyBjb21tYW5kLiAgZXJyb3IgdmFsdWVzOgorICogICAtIEVGQVVMVCAtIGFuIGFkZHJlc3Mgc3VwcGxpZWQgd2FzIGludmFsaWQuCisgKiAgIC0gRUJVU1kgLSBUaGUgbmV0Zm4vY21kIHN1cHBsaWVkIHdhcyBhbHJlYWR5IGluIHVzZS4KKyAqICAgLSBFTk9NRU0gLSBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZW50cnkuCisgKi8KKyNkZWZpbmUgSVBNSUNUTF9SRUdJU1RFUl9GT1JfQ01ECV9JT1IoSVBNSV9JT0NfTUFHSUMsIDE0LAlcCisJCQkJCSAgICAgc3RydWN0IGlwbWlfY21kc3BlYykKKy8qCisgKiBVbnJlZ2lzdGVyIGEgcmVnc2l0ZXJlZCBjb21tYW5kLiAgZXJyb3IgdmFsdWVzOgorICogIC0gRUZBVUxUIC0gYW4gYWRkcmVzcyBzdXBwbGllZCB3YXMgaW52YWxpZC4KKyAqICAtIEVOT0VOVCAtIFRoZSBuZXRmbi9jbWQgd2FzIG5vdCBmb3VuZCByZWdpc3RlcmVkIGZvciB0aGlzIHVzZXIuCisgKi8KKyNkZWZpbmUgSVBNSUNUTF9VTlJFR0lTVEVSX0ZPUl9DTUQJX0lPUihJUE1JX0lPQ19NQUdJQywgMTUsCVwKKwkJCQkJICAgICBzdHJ1Y3QgaXBtaV9jbWRzcGVjKQorCisvKgorICogUmVnaXN0ZXIgdG8gZ2V0IGNvbW1hbmRzIGZyb20gb3RoZXIgZW50aXRpZXMgb24gc3BlY2lmaWMgY2hhbm5lbHMuCisgKiBUaGlzIHdheSwgeW91IGNhbiBvbmx5IGxpc3RlbiBvbiBzcGVjaWZpYyBjaGFubmVscywgb3IgaGF2ZSBtZXNzYWdlcworICogZnJvbSBzb21lIGNoYW5uZWxzIGdvIHRvIG9uZSBwbGFjZSBhbmQgb3RoZXIgY2hhbm5lbHMgdG8gc29tZXBsYWNlCisgKiBlbHNlLiAgVGhlIGNoYW5zIGZpZWxkIGlzIGEgYml0bWFzaywgKDEgPDwgY2hhbm5lbCkgZm9yIGVhY2ggY2hhbm5lbC4KKyAqIEl0IG1heSBiZSBJUE1JX0NIQU5fQUxMIGZvciBhbGwgY2hhbm5lbHMuCisgKi8KK3N0cnVjdCBpcG1pX2NtZHNwZWNfY2hhbnMgeworCXVuc2lnbmVkIGludCBuZXRmbjsKKwl1bnNpZ25lZCBpbnQgY21kOworCXVuc2lnbmVkIGludCBjaGFuczsKK307CisKKy8qCisgKiBSZWdpc3RlciB0byByZWNlaXZlIGEgc3BlY2lmaWMgY29tbWFuZCBvbiBzcGVjaWZpYyBjaGFubmVscy4gIGVycm9yIHZhbHVlczoKKyAqICAgLSBFRkFVTFQgLSBhbiBhZGRyZXNzIHN1cHBsaWVkIHdhcyBpbnZhbGlkLgorICogICAtIEVCVVNZIC0gT25lIG9mIHRoZSBuZXRmbi9jbWQvY2hhbnMgc3VwcGxpZWQgd2FzIGFscmVhZHkgaW4gdXNlLgorICogICAtIEVOT01FTSAtIGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBlbnRyeS4KKyAqLworI2RlZmluZSBJUE1JQ1RMX1JFR0lTVEVSX0ZPUl9DTURfQ0hBTlMJX0lPUihJUE1JX0lPQ19NQUdJQywgMjgsCVwKKwkJCQkJICAgICBzdHJ1Y3QgaXBtaV9jbWRzcGVjX2NoYW5zKQorLyoKKyAqIFVucmVnaXN0ZXIgc29tZSBuZXRmbi9jbWQvY2hhbnMuICBlcnJvciB2YWx1ZXM6CisgKiAgLSBFRkFVTFQgLSBhbiBhZGRyZXNzIHN1cHBsaWVkIHdhcyBpbnZhbGlkLgorICogIC0gRU5PRU5UIC0gTm9uZSBvZiB0aGUgbmV0Zm4vY21kL2NoYW5zIHdlcmUgZm91bmQgcmVnaXN0ZXJlZCBmb3IgdGhpcyB1c2VyLgorICovCisjZGVmaW5lIElQTUlDVExfVU5SRUdJU1RFUl9GT1JfQ01EX0NIQU5TIF9JT1IoSVBNSV9JT0NfTUFHSUMsIDI5LAlcCisJCQkJCSAgICAgc3RydWN0IGlwbWlfY21kc3BlY19jaGFucykKKworLyoKKyAqIFNldCB3aGV0aGVyIHRoaXMgaW50ZXJmYWNlIHJlY2VpdmVzIGV2ZW50cy4gIE5vdGUgdGhhdCB0aGUgZmlyc3QKKyAqIHVzZXIgcmVnaXN0ZXJlZCBmb3IgZXZlbnRzIHdpbGwgZ2V0IGFsbCBwZW5kaW5nIGV2ZW50cyBmb3IgdGhlCisgKiBpbnRlcmZhY2UuICBlcnJvciB2YWx1ZXM6CisgKiAgLSBFRkFVTFQgLSBhbiBhZGRyZXNzIHN1cHBsaWVkIHdhcyBpbnZhbGlkLgorICovCisjZGVmaW5lIElQTUlDVExfU0VUX0dFVFNfRVZFTlRTX0NNRAlfSU9SKElQTUlfSU9DX01BR0lDLCAxNiwgaW50KQorCisvKgorICogU2V0IGFuZCBnZXQgdGhlIHNsYXZlIGFkZHJlc3MgYW5kIExVTiB0aGF0IHdlIHdpbGwgdXNlIGZvciBvdXIKKyAqIHNvdXJjZSBtZXNzYWdlcy4gIE5vdGUgdGhhdCB0aGlzIGFmZmVjdHMgdGhlIGludGVyZmFjZSwgbm90IGp1c3QKKyAqIHRoaXMgdXNlciwgc28gaXQgd2lsbCBhZmZlY3QgYWxsIHVzZXJzIG9mIHRoaXMgaW50ZXJmYWNlLiAgVGhpcyBpcworICogc28gc29tZSBpbml0aWFsaXphdGlvbiBjb2RlIGNhbiBjb21lIGluIGFuZCBkbyB0aGUgT0VNLXNwZWNpZmljCisgKiB0aGluZ3MgaXQgdGFrZXMgdG8gZGV0ZXJtaW5lIHlvdXIgYWRkcmVzcyAoaWYgbm90IHRoZSBCTUMpIGFuZCBzZXQKKyAqIGl0IGZvciBldmVyeW9uZSBlbHNlLiAgWW91IHNob3VsZCBwcm9iYWJseSBsZWF2ZSB0aGUgTFVOIGFsb25lLgorICovCitzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCB7CisJdW5zaWduZWQgc2hvcnQgY2hhbm5lbDsKKwl1bnNpZ25lZCBjaGFyICB2YWx1ZTsKK307CisjZGVmaW5lIElQTUlDVExfU0VUX01ZX0NIQU5ORUxfQUREUkVTU19DTUQgXAorCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDI0LCBzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCkKKyNkZWZpbmUgSVBNSUNUTF9HRVRfTVlfQ0hBTk5FTF9BRERSRVNTX0NNRCBcCisJX0lPUihJUE1JX0lPQ19NQUdJQywgMjUsIHN0cnVjdCBpcG1pX2NoYW5uZWxfbHVuX2FkZHJlc3Nfc2V0KQorI2RlZmluZSBJUE1JQ1RMX1NFVF9NWV9DSEFOTkVMX0xVTl9DTUQgXAorCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDI2LCBzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCkKKyNkZWZpbmUgSVBNSUNUTF9HRVRfTVlfQ0hBTk5FTF9MVU5fQ01EIFwKKwlfSU9SKElQTUlfSU9DX01BR0lDLCAyNywgc3RydWN0IGlwbWlfY2hhbm5lbF9sdW5fYWRkcmVzc19zZXQpCisvKiBMZWdhY3kgaW50ZXJmYWNlcywgdGhlc2Ugb25seSBzZXQgSVBNQiAwLiAqLworI2RlZmluZSBJUE1JQ1RMX1NFVF9NWV9BRERSRVNTX0NNRAlfSU9SKElQTUlfSU9DX01BR0lDLCAxNywgdW5zaWduZWQgaW50KQorI2RlZmluZSBJUE1JQ1RMX0dFVF9NWV9BRERSRVNTX0NNRAlfSU9SKElQTUlfSU9DX01BR0lDLCAxOCwgdW5zaWduZWQgaW50KQorI2RlZmluZSBJUE1JQ1RMX1NFVF9NWV9MVU5fQ01ECQlfSU9SKElQTUlfSU9DX01BR0lDLCAxOSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBJUE1JQ1RMX0dFVF9NWV9MVU5fQ01ECQlfSU9SKElQTUlfSU9DX01BR0lDLCAyMCwgdW5zaWduZWQgaW50KQorCisvKgorICogR2V0L3NldCB0aGUgZGVmYXVsdCB0aW1pbmcgdmFsdWVzIGZvciBhbiBpbnRlcmZhY2UuICBZb3Ugc2hvdWxkbid0CisgKiBnZW5lcmFsbHkgbWVzcyB3aXRoIHRoZXNlLgorICovCitzdHJ1Y3QgaXBtaV90aW1pbmdfcGFybXMgeworCWludCAgICAgICAgICByZXRyaWVzOworCXVuc2lnbmVkIGludCByZXRyeV90aW1lX21zOworfTsKKyNkZWZpbmUgSVBNSUNUTF9TRVRfVElNSU5HX1BBUk1TX0NNRAlfSU9SKElQTUlfSU9DX01BR0lDLCAyMiwgXAorCQkJCQkgICAgIHN0cnVjdCBpcG1pX3RpbWluZ19wYXJtcykKKyNkZWZpbmUgSVBNSUNUTF9HRVRfVElNSU5HX1BBUk1TX0NNRAlfSU9SKElQTUlfSU9DX01BR0lDLCAyMywgXAorCQkJCQkgICAgIHN0cnVjdCBpcG1pX3RpbWluZ19wYXJtcykKKworLyoKKyAqIFNldCB0aGUgbWFpbnRlbmFuY2UgbW9kZS4gIFNlZSBpcG1pX3NldF9tYWludGVuYW5jZV9tb2RlKCkgYWJvdmUKKyAqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhpcyBkb2VzLgorICovCisjZGVmaW5lIElQTUlDVExfR0VUX01BSU5URU5BTkNFX01PREVfQ01ECV9JT1IoSVBNSV9JT0NfTUFHSUMsIDMwLCBpbnQpCisjZGVmaW5lIElQTUlDVExfU0VUX01BSU5URU5BTkNFX01PREVfQ01ECV9JT1coSVBNSV9JT0NfTUFHSUMsIDMxLCBpbnQpCisKKyNlbmRpZiAvKiBfX0xJTlVYX0lQTUlfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcG1pX21zZ2RlZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBtaV9tc2dkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5N2U2ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBtaV9tc2dkZWZzLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBpcG1pX3NtaS5oCisgKgorICogTW9udGFWaXN0YSBJUE1JIHN5c3RlbSBtYW5hZ2VtZW50IGludGVyZmFjZQorICoKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICBDb3JleSBNaW55YXJkIDxtaW55YXJkQG12aXN0YS5jb20+CisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0lQTUlfTVNHREVGU19ICisjZGVmaW5lIF9fTElOVVhfSVBNSV9NU0dERUZTX0gKKworLyogVmFyaW91cyBkZWZpbml0aW9ucyBmb3IgSVBNSSBtZXNzYWdlcyB1c2VkIGJ5IGFsbW9zdCBldmVyeXRoaW5nIGluCisgICB0aGUgSVBNSSBzdGFjay4gKi8KKworLyogTmV0Rk5zIGFuZCBjb21tYW5kcyB1c2VkIGluc2lkZSB0aGUgSVBNSSBzdGFjay4gKi8KKworI2RlZmluZSBJUE1JX05FVEZOX1NFTlNPUl9FVkVOVF9SRVFVRVNUCQkweDA0CisjZGVmaW5lIElQTUlfTkVURk5fU0VOU09SX0VWRU5UX1JFU1BPTlNFCTB4MDUKKyNkZWZpbmUgSVBNSV9HRVRfRVZFTlRfUkVDRUlWRVJfQ01ECTB4MDEKKworI2RlZmluZSBJUE1JX05FVEZOX0FQUF9SRVFVRVNUCQkJMHgwNgorI2RlZmluZSBJUE1JX05FVEZOX0FQUF9SRVNQT05TRQkJCTB4MDcKKyNkZWZpbmUgSVBNSV9HRVRfREVWSUNFX0lEX0NNRAkJMHgwMQorI2RlZmluZSBJUE1JX0NPTERfUkVTRVRfQ01ECQkweDAyCisjZGVmaW5lIElQTUlfV0FSTV9SRVNFVF9DTUQJCTB4MDMKKyNkZWZpbmUgSVBNSV9DTEVBUl9NU0dfRkxBR1NfQ01ECTB4MzAKKyNkZWZpbmUgSVBNSV9HRVRfREVWSUNFX0dVSURfQ01ECTB4MDgKKyNkZWZpbmUgSVBNSV9HRVRfTVNHX0ZMQUdTX0NNRAkJMHgzMQorI2RlZmluZSBJUE1JX1NFTkRfTVNHX0NNRAkJMHgzNAorI2RlZmluZSBJUE1JX0dFVF9NU0dfQ01ECQkweDMzCisjZGVmaW5lIElQTUlfU0VUX0JNQ19HTE9CQUxfRU5BQkxFU19DTUQJMHgyZQorI2RlZmluZSBJUE1JX0dFVF9CTUNfR0xPQkFMX0VOQUJMRVNfQ01ECTB4MmYKKyNkZWZpbmUgSVBNSV9SRUFEX0VWRU5UX01TR19CVUZGRVJfQ01ECTB4MzUKKyNkZWZpbmUgSVBNSV9HRVRfQ0hBTk5FTF9JTkZPX0NNRAkweDQyCisKKy8qIEJpdCBmb3IgQk1DIGdsb2JhbCBlbmFibGVzLiAqLworI2RlZmluZSBJUE1JX0JNQ19SQ1ZfTVNHX0lOVFIgICAgIDB4MDEKKyNkZWZpbmUgSVBNSV9CTUNfRVZUX01TR19JTlRSICAgICAweDAyCisjZGVmaW5lIElQTUlfQk1DX0VWVF9NU0dfQlVGRiAgICAgMHgwNAorI2RlZmluZSBJUE1JX0JNQ19TWVNfTE9HICAgICAgICAgIDB4MDgKKworI2RlZmluZSBJUE1JX05FVEZOX1NUT1JBR0VfUkVRVUVTVAkJMHgwYQorI2RlZmluZSBJUE1JX05FVEZOX1NUT1JBR0VfUkVTUE9OU0UJCTB4MGIKKyNkZWZpbmUgSVBNSV9BRERfU0VMX0VOVFJZX0NNRAkJMHg0NAorCisjZGVmaW5lIElQTUlfTkVURk5fRklSTVdBUkVfUkVRVUVTVAkJMHgwOAorI2RlZmluZSBJUE1JX05FVEZOX0ZJUk1XQVJFX1JFU1BPTlNFCQkweDA5CisKKy8qIFRoZSBkZWZhdWx0IHNsYXZlIGFkZHJlc3MgKi8KKyNkZWZpbmUgSVBNSV9CTUNfU0xBVkVfQUREUgkweDIwCisKKy8qIFRoZSBCVCBpbnRlcmZhY2Ugb24gaGlnaC1lbmQgSFAgc3lzdGVtcyBzdXBwb3J0cyB1cCB0byAyNTUgYnl0ZXMgaW4KKyAqIG9uZSB0cmFuc2Zlci4gIEl0cyAidmlydHVhbCIgQk1DIHN1cHBvcnRzIHNvbWUgY29tbWFuZHMgdGhhdCBhcmUgbG9uZ2VyCisgKiB0aGFuIDEyOCBieXRlcy4gIFVzZSB0aGUgZnVsbCAyNTYsIHBsdXMgTmV0Rm4vTFVOLCBDbWQsIGNDb2RlLCBwbHVzCisgKiBzb21lIG92ZXJoZWFkOyBpdCdzIG5vdCB3b3J0aCB0aGUgZWZmb3J0IHRvIGR5bmFtaWNhbGx5IHNpemUgdGhpcyBiYXNlZAorICogb24gdGhlIHJlc3VsdHMgb2YgdGhlICJHZXQgQlQgQ2FwYWJpbGl0aWVzIiBjb21tYW5kLiAqLworI2RlZmluZSBJUE1JX01BWF9NU0dfTEVOR1RICTI3MgkvKiBtdWx0aXBsZSBvZiAxNiAqLworCisjZGVmaW5lIElQTUlfQ0NfTk9fRVJST1IJCTB4MDAKKyNkZWZpbmUgSVBNSV9OT0RFX0JVU1lfRVJSCQkweGMwCisjZGVmaW5lIElQTUlfSU5WQUxJRF9DT01NQU5EX0VSUgkweGMxCisjZGVmaW5lIElQTUlfVElNRU9VVF9FUlIJCTB4YzMKKyNkZWZpbmUgSVBNSV9FUlJfTVNHX1RSVU5DQVRFRAkJMHhjNgorI2RlZmluZSBJUE1JX1JFUV9MRU5fSU5WQUxJRF9FUlIJMHhjNworI2RlZmluZSBJUE1JX1JFUV9MRU5fRVhDRUVERURfRVJSCTB4YzgKKyNkZWZpbmUgSVBNSV9OT1RfSU5fTVlfU1RBVEVfRVJSCTB4ZDUJLyogSVBNSSAyLjAgKi8KKyNkZWZpbmUgSVBNSV9MT1NUX0FSQklUUkFUSU9OX0VSUgkweDgxCisjZGVmaW5lIElQTUlfQlVTX0VSUgkJCTB4ODIKKyNkZWZpbmUgSVBNSV9OQUtfT05fV1JJVEVfRVJSCQkweDgzCisjZGVmaW5lIElQTUlfRVJSX1VOU1BFQ0lGSUVECQkweGZmCisKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX1BST1RPQ09MX0lQTUIJMQorI2RlZmluZSBJUE1JX0NIQU5ORUxfUFJPVE9DT0xfSUNNQgkyCisjZGVmaW5lIElQTUlfQ0hBTk5FTF9QUk9UT0NPTF9TTUJVUwk0CisjZGVmaW5lIElQTUlfQ0hBTk5FTF9QUk9UT0NPTF9LQ1MJNQorI2RlZmluZSBJUE1JX0NIQU5ORUxfUFJPVE9DT0xfU01JQwk2CisjZGVmaW5lIElQTUlfQ0hBTk5FTF9QUk9UT0NPTF9CVDEwCTcKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX1BST1RPQ09MX0JUMTUJOAorI2RlZmluZSBJUE1JX0NIQU5ORUxfUFJPVE9DT0xfVE1PREUJOQorCisjZGVmaW5lIElQTUlfQ0hBTk5FTF9NRURJVU1fSVBNQgkxCisjZGVmaW5lIElQTUlfQ0hBTk5FTF9NRURJVU1fSUNNQjEwCTIKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV9JQ01CMDkJMworI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNXzgwMjNMQU4JNAorI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNX0FTWU5DCTUKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV9PVEhFUl9MQU4JNgorI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNX1BDSV9TTUJVUwk3CisjZGVmaW5lIElQTUlfQ0hBTk5FTF9NRURJVU1fU01CVVMxCTgKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV9TTUJVUzIJOQorI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNX1VTQjEJMTAKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV9VU0IyCTExCisjZGVmaW5lIElQTUlfQ0hBTk5FTF9NRURJVU1fU1lTSU5URgkxMgorI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNX09FTV9NSU4JMHg2MAorI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNX09FTV9NQVgJMHg3ZgorCisjZW5kaWYgLyogX19MSU5VWF9JUE1JX01TR0RFRlNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcHNlYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcHNlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxN2E2MzAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwc2VjLmgKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBfTElOVVhfSVBTRUNfSAorI2RlZmluZSBfTElOVVhfSVBTRUNfSAorCisvKiBUaGUgZGVmaW5pdGlvbnMsIHJlcXVpcmVkIHRvIHRhbGsgdG8gS0FNRSByYWNvb24gSUtFLiAqLworCisjaW5jbHVkZSA8bGludXgvcGZrZXl2Mi5oPgorCisjZGVmaW5lIElQU0VDX1BPUlRfQU5ZCQkwCisjZGVmaW5lIElQU0VDX1VMUFJPVE9fQU5ZCTI1NQorI2RlZmluZSBJUFNFQ19QUk9UT19BTlkJCTI1NQorCitlbnVtIHsKKwlJUFNFQ19NT0RFX0FOWQkJPSAwLAkvKiBXZSBkbyBub3Qgc3VwcG9ydCB0aGlzIGZvciBTQSAqLworCUlQU0VDX01PREVfVFJBTlNQT1JUCT0gMSwKKwlJUFNFQ19NT0RFX1RVTk5FTAk9IDIsCisJSVBTRUNfTU9ERV9CRUVUICAgICAgICAgPSAzCit9OworCitlbnVtIHsKKwlJUFNFQ19ESVJfQU5ZCQk9IDAsCisJSVBTRUNfRElSX0lOQk9VTkQJPSAxLAorCUlQU0VDX0RJUl9PVVRCT1VORAk9IDIsCisJSVBTRUNfRElSX0ZXRAkJPSAzLAkvKiBJdCBpcyBvdXIgb3duICovCisJSVBTRUNfRElSX01BWAkJPSA0LAorCUlQU0VDX0RJUl9JTlZBTElECT0gNQorfTsKKworZW51bSB7CisJSVBTRUNfUE9MSUNZX0RJU0NBUkQJPSAwLAorCUlQU0VDX1BPTElDWV9OT05FCT0gMSwKKwlJUFNFQ19QT0xJQ1lfSVBTRUMJPSAyLAorCUlQU0VDX1BPTElDWV9FTlRSVVNUCT0gMywKKwlJUFNFQ19QT0xJQ1lfQllQQVNTCT0gNAorfTsKKworZW51bSB7CisJSVBTRUNfTEVWRUxfREVGQVVMVAk9IDAsCisJSVBTRUNfTEVWRUxfVVNFCQk9IDEsCisJSVBTRUNfTEVWRUxfUkVRVUlSRQk9IDIsCisJSVBTRUNfTEVWRUxfVU5JUVVFCT0gMworfTsKKworI2RlZmluZSBJUFNFQ19NQU5VQUxfUkVRSURfTUFYCTB4M2ZmZgorCisjZGVmaW5lIElQU0VDX1JFUExBWVdTSVpFICAzMgorCisjZW5kaWYJLyogX0xJTlVYX0lQU0VDX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXB2Ni5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcHY2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4NDJjZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXB2Ni5oCkBAIC0wLDAgKzEsMTY0IEBACisjaWZuZGVmIF9JUFY2X0gKKyNkZWZpbmUgX0lQVjZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qIFRoZSBsYXRlc3QgZHJhZnRzIGRlY2xhcmVkIGluY3JlYXNlIGluIG1pbmltYWwgbXR1IHVwIHRvIDEyODAuICovCisKKyNkZWZpbmUgSVBWNl9NSU5fTVRVCTEyODAKKworLyoKKyAqCUFkdmFuY2VkIEFQSQorICoJc291cmNlIGludGVyZmFjZS9hZGRyZXNzIHNlbGVjdGlvbiwgc291cmNlIHJvdXRpbmcsIGV0Yy4uLgorICoJKnVuZGVyIGNvbnN0cnVjdGlvbioKKyAqLworCisKK3N0cnVjdCBpbjZfcGt0aW5mbyB7CisJc3RydWN0IGluNl9hZGRyCWlwaTZfYWRkcjsKKwlpbnQJCWlwaTZfaWZpbmRleDsKK307CisKK3N0cnVjdCBpcDZfbXR1aW5mbyB7CisJc3RydWN0IHNvY2thZGRyX2luNglpcDZtX2FkZHI7CisJX191MzIJCQlpcDZtX210dTsKK307CisKK3N0cnVjdCBpbjZfaWZyZXEgeworCXN0cnVjdCBpbjZfYWRkcglpZnI2X2FkZHI7CisJX191MzIJCWlmcjZfcHJlZml4bGVuOworCWludAkJaWZyNl9pZmluZGV4OyAKK307CisKKyNkZWZpbmUgSVBWNl9TUkNSVF9TVFJJQ1QJMHgwMQkvKiBEZXByZWNhdGVkOyB3aWxsIGJlIHJlbW92ZWQgKi8KKyNkZWZpbmUgSVBWNl9TUkNSVF9UWVBFXzAJMAkvKiBEZXByZWNhdGVkOyB3aWxsIGJlIHJlbW92ZWQgKi8KKyNkZWZpbmUgSVBWNl9TUkNSVF9UWVBFXzIJMgkvKiBJUHY2IHR5cGUgMiBSb3V0aW5nIEhlYWRlcgkqLworCisvKgorICoJcm91dGluZyBoZWFkZXIKKyAqLworc3RydWN0IGlwdjZfcnRfaGRyIHsKKwlfX3U4CQluZXh0aGRyOworCV9fdTgJCWhkcmxlbjsKKwlfX3U4CQl0eXBlOworCV9fdTgJCXNlZ21lbnRzX2xlZnQ7CisKKwkvKgorCSAqCXR5cGUgc3BlY2lmaWMgZGF0YQorCSAqCXZhcmlhYmxlIGxlbmd0aCBmaWVsZAorCSAqLworfTsKKworCitzdHJ1Y3QgaXB2Nl9vcHRfaGRyIHsKKwlfX3U4IAkJbmV4dGhkcjsKKwlfX3U4IAkJaGRybGVuOworCS8qIAorCSAqIFRMViBlbmNvZGVkIG9wdGlvbiBkYXRhIGZvbGxvd3MuCisJICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwkvKiByZXF1aXJlZCBmb3Igc29tZSBhcmNocyAqLworCisjZGVmaW5lIGlwdjZfZGVzdG9wdF9oZHIgaXB2Nl9vcHRfaGRyCisjZGVmaW5lIGlwdjZfaG9wb3B0X2hkciAgaXB2Nl9vcHRfaGRyCisKKworLyoKKyAqCXJvdXRpbmcgaGVhZGVyIHR5cGUgMCAodXNlZCBpbiBjbXNnaGRyIHN0cnVjdCkKKyAqLworCitzdHJ1Y3QgcnQwX2hkciB7CisJc3RydWN0IGlwdjZfcnRfaGRyCXJ0X2hkcjsKKwlfX3UzMgkJCXJlc2VydmVkOworCXN0cnVjdCBpbjZfYWRkcgkJYWRkclswXTsKKworI2RlZmluZSBydDBfdHlwZQkJcnRfaGRyLnR5cGUKK307CisKKy8qCisgKglyb3V0aW5nIGhlYWRlciB0eXBlIDIKKyAqLworCitzdHJ1Y3QgcnQyX2hkciB7CisJc3RydWN0IGlwdjZfcnRfaGRyCXJ0X2hkcjsKKwlfX3UzMgkJCXJlc2VydmVkOworCXN0cnVjdCBpbjZfYWRkcgkJYWRkcjsKKworI2RlZmluZSBydDJfdHlwZQkJcnRfaGRyLnR5cGUKK307CisKKy8qCisgKglob21lIGFkZHJlc3Mgb3B0aW9uIGluIGRlc3RpbmF0aW9uIG9wdGlvbnMgaGVhZGVyCisgKi8KKworc3RydWN0IGlwdjZfZGVzdG9wdF9oYW8geworCV9fdTgJCQl0eXBlOworCV9fdTgJCQlsZW5ndGg7CisJc3RydWN0IGluNl9hZGRyCQlhZGRyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqCUlQdjYgZml4ZWQgaGVhZGVyCisgKgorICoJQkVXQVJFLCBpdCBpcyBpbmNvcnJlY3QuIFRoZSBmaXJzdCA0IGJpdHMgb2YgZmxvd19sYmwKKyAqCWFyZSBnbHVlZCB0byBwcmlvcml0eSBub3csIGZvcm1pbmcgImNsYXNzIi4KKyAqLworCitzdHJ1Y3QgaXB2NmhkciB7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OAkJCXByaW9yaXR5OjQsCisJCQkJdmVyc2lvbjo0OworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OAkJCXZlcnNpb246NCwKKwkJCQlwcmlvcml0eTo0OworI2Vsc2UKKyNlcnJvcgkiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorCV9fdTgJCQlmbG93X2xibFszXTsKKworCV9fYmUxNgkJCXBheWxvYWRfbGVuOworCV9fdTgJCQluZXh0aGRyOworCV9fdTgJCQlob3BfbGltaXQ7CisKKwlzdHJ1Y3QJaW42X2FkZHIJc2FkZHI7CisJc3RydWN0CWluNl9hZGRyCWRhZGRyOworfTsKKworCisvKiBpbmRleCB2YWx1ZXMgZm9yIHRoZSB2YXJpYWJsZXMgaW4gaXB2Nl9kZXZjb25mICovCitlbnVtIHsKKwlERVZDT05GX0ZPUldBUkRJTkcgPSAwLAorCURFVkNPTkZfSE9QTElNSVQsCisJREVWQ09ORl9NVFU2LAorCURFVkNPTkZfQUNDRVBUX1JBLAorCURFVkNPTkZfQUNDRVBUX1JFRElSRUNUUywKKwlERVZDT05GX0FVVE9DT05GLAorCURFVkNPTkZfREFEX1RSQU5TTUlUUywKKwlERVZDT05GX1JUUl9TT0xJQ0lUUywKKwlERVZDT05GX1JUUl9TT0xJQ0lUX0lOVEVSVkFMLAorCURFVkNPTkZfUlRSX1NPTElDSVRfREVMQVksCisJREVWQ09ORl9VU0VfVEVNUEFERFIsCisJREVWQ09ORl9URU1QX1ZBTElEX0xGVCwKKwlERVZDT05GX1RFTVBfUFJFRkVSRURfTEZULAorCURFVkNPTkZfUkVHRU5fTUFYX1JFVFJZLAorCURFVkNPTkZfTUFYX0RFU1lOQ19GQUNUT1IsCisJREVWQ09ORl9NQVhfQUREUkVTU0VTLAorCURFVkNPTkZfRk9SQ0VfTUxEX1ZFUlNJT04sCisJREVWQ09ORl9BQ0NFUFRfUkFfREVGUlRSLAorCURFVkNPTkZfQUNDRVBUX1JBX1BJTkZPLAorCURFVkNPTkZfQUNDRVBUX1JBX1JUUl9QUkVGLAorCURFVkNPTkZfUlRSX1BST0JFX0lOVEVSVkFMLAorCURFVkNPTkZfQUNDRVBUX1JBX1JUX0lORk9fTUFYX1BMRU4sCisJREVWQ09ORl9QUk9YWV9ORFAsCisJREVWQ09ORl9PUFRJTUlTVElDX0RBRCwKKwlERVZDT05GX0FDQ0VQVF9TT1VSQ0VfUk9VVEUsCisJREVWQ09ORl9NQ19GT1JXQVJESU5HLAorCURFVkNPTkZfRElTQUJMRV9JUFY2LAorCURFVkNPTkZfQUNDRVBUX0RBRCwKKwlERVZDT05GX0ZPUkNFX1RMTEFPLAorCURFVkNPTkZfTUFYCit9OworCisKKyNlbmRpZiAvKiBfSVBWNl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwdjZfcm91dGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXB2Nl9yb3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YTZkMWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwdjZfcm91dGUuaApAQCAtMCwwICsxLDU4IEBACisvKgorICoJTGludXggSU5FVDYgaW1wbGVtZW50YXRpb24gCisgKgorICoJQXV0aG9yczoKKyAqCVBlZHJvIFJvcXVlCQk8cm9xdWVAZGkuZmMudWwucHQ+CQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfSVBWNl9ST1VURV9ICisjZGVmaW5lIF9MSU5VWF9JUFY2X1JPVVRFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgUlRGX0RFRkFVTFQJMHgwMDAxMDAwMAkvKiBkZWZhdWx0IC0gbGVhcm5lZCB2aWEgTkQJKi8KKyNkZWZpbmUgUlRGX0FMTE9OTElOSwkweDAwMDIwMDAwCS8qIChkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQpCisJCQkJCSAgIGZhbGxiYWNrLCBubyByb3V0ZXJzIG9uIGxpbmsgKi8KKyNkZWZpbmUgUlRGX0FERFJDT05GCTB4MDAwNDAwMDAJLyogYWRkcmNvbmYgcm91dGUgLSBSQQkJKi8KKyNkZWZpbmUgUlRGX1BSRUZJWF9SVAkweDAwMDgwMDAwCS8qIEEgcHJlZml4IG9ubHkgcm91dGUgLSBSQQkqLworI2RlZmluZSBSVEZfQU5ZQ0FTVAkweDAwMTAwMDAwCS8qIEFueWNhc3QJCQkqLworCisjZGVmaW5lIFJURl9OT05FWFRIT1AJMHgwMDIwMDAwMAkvKiByb3V0ZSB3aXRoIG5vIG5leHRob3AJKi8KKyNkZWZpbmUgUlRGX0VYUElSRVMJMHgwMDQwMDAwMAorCisjZGVmaW5lIFJURl9ST1VURUlORk8JMHgwMDgwMDAwMAkvKiByb3V0ZSBpbmZvcm1hdGlvbiAtIFJBCSovCisKKyNkZWZpbmUgUlRGX0NBQ0hFCTB4MDEwMDAwMDAJLyogY2FjaGUgZW50cnkJCQkqLworI2RlZmluZSBSVEZfRkxPVwkweDAyMDAwMDAwCS8qIGZsb3cgc2lnbmlmaWNhbnQgcm91dGUJKi8KKyNkZWZpbmUgUlRGX1BPTElDWQkweDA0MDAwMDAwCS8qIHBvbGljeSByb3V0ZQkJCSovCisKKyNkZWZpbmUgUlRGX1BSRUYocHJlZikJKChwcmVmKSA8PCAyNykKKyNkZWZpbmUgUlRGX1BSRUZfTUFTSwkweDE4MDAwMDAwCisKKyNkZWZpbmUgUlRGX0xPQ0FMCTB4ODAwMDAwMDAKKworCitzdHJ1Y3QgaW42X3J0bXNnIHsKKwlzdHJ1Y3QgaW42X2FkZHIJCXJ0bXNnX2RzdDsKKwlzdHJ1Y3QgaW42X2FkZHIJCXJ0bXNnX3NyYzsKKwlzdHJ1Y3QgaW42X2FkZHIJCXJ0bXNnX2dhdGV3YXk7CisJX191MzIJCQlydG1zZ190eXBlOworCV9fdTE2CQkJcnRtc2dfZHN0X2xlbjsKKwlfX3UxNgkJCXJ0bXNnX3NyY19sZW47CisJX191MzIJCQlydG1zZ19tZXRyaWM7CisJdW5zaWduZWQgbG9uZwkJcnRtc2dfaW5mbzsKKyAgICAgICAgX191MzIJCQlydG1zZ19mbGFnczsKKwlpbnQJCQlydG1zZ19pZmluZGV4OworfTsKKworI2RlZmluZSBSVE1TR19ORVdERVZJQ0UJCTB4MTEKKyNkZWZpbmUgUlRNU0dfREVMREVWSUNFCQkweDEyCisjZGVmaW5lIFJUTVNHX05FV1JPVVRFCQkweDIxCisjZGVmaW5lIFJUTVNHX0RFTFJPVVRFCQkweDIyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcHguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXB4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0ODAxNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXB4LmgKQEAgLTAsMCArMSw3NSBAQAorI2lmbmRlZiBfSVBYX0hfCisjZGVmaW5lIF9JUFhfSF8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNkZWZpbmUgSVBYX05PREVfTEVOCTYKKyNkZWZpbmUgSVBYX01UVQkJNTc2CisKK3N0cnVjdCBzb2NrYWRkcl9pcHggeworCV9fa2VybmVsX3NhX2ZhbWlseV90IHNpcHhfZmFtaWx5OworCV9fYmUxNgkJc2lweF9wb3J0OworCV9fYmUzMgkJc2lweF9uZXR3b3JrOworCXVuc2lnbmVkIGNoYXIgCXNpcHhfbm9kZVtJUFhfTk9ERV9MRU5dOworCV9fdTgJCXNpcHhfdHlwZTsKKwl1bnNpZ25lZCBjaGFyCXNpcHhfemVybzsJLyogMTYgYnl0ZSBmaWxsICovCit9OworCisvKgorICogU28gd2UgY2FuIGZpdCB0aGUgZXh0cmEgaW5mbyBmb3IgU0lPQ1NJRkFERFIgaW50byB0aGUgYWRkcmVzcyBuaWNlbHkKKyAqLworI2RlZmluZSBzaXB4X3NwZWNpYWwJc2lweF9wb3J0CisjZGVmaW5lIHNpcHhfYWN0aW9uCXNpcHhfemVybworI2RlZmluZSBJUFhfRExUSVRGCTAKKyNkZWZpbmUgSVBYX0NSVElURgkxCisKK3N0cnVjdCBpcHhfcm91dGVfZGVmaW5pdGlvbiB7CisJX19iZTMyICAgICAgICBpcHhfbmV0d29yazsKKwlfX2JlMzIgICAgICAgIGlweF9yb3V0ZXJfbmV0d29yazsKKwl1bnNpZ25lZCBjaGFyIGlweF9yb3V0ZXJfbm9kZVtJUFhfTk9ERV9MRU5dOworfTsKKworc3RydWN0IGlweF9pbnRlcmZhY2VfZGVmaW5pdGlvbiB7CisJX19iZTMyICAgICAgICBpcHhfbmV0d29yazsKKwl1bnNpZ25lZCBjaGFyIGlweF9kZXZpY2VbMTZdOworCXVuc2lnbmVkIGNoYXIgaXB4X2RsaW5rX3R5cGU7CisjZGVmaW5lIElQWF9GUkFNRV9OT05FCQkwCisjZGVmaW5lIElQWF9GUkFNRV9TTkFQCQkxCisjZGVmaW5lIElQWF9GUkFNRV84MDIyCQkyCisjZGVmaW5lIElQWF9GUkFNRV9FVEhFUklJCTMKKyNkZWZpbmUgSVBYX0ZSQU1FXzgwMjMJCTQKKyNkZWZpbmUgSVBYX0ZSQU1FX1RSXzgwMjIgICAgICAgNSAvKiBvYnNvbGV0ZSAqLworCXVuc2lnbmVkIGNoYXIgaXB4X3NwZWNpYWw7CisjZGVmaW5lIElQWF9TUEVDSUFMX05PTkUJMAorI2RlZmluZSBJUFhfUFJJTUFSWQkJMQorI2RlZmluZSBJUFhfSU5URVJOQUwJCTIKKwl1bnNpZ25lZCBjaGFyIGlweF9ub2RlW0lQWF9OT0RFX0xFTl07Cit9OworCQorc3RydWN0IGlweF9jb25maWdfZGF0YSB7CisJdW5zaWduZWQgY2hhcglpcHhjZmdfYXV0b19zZWxlY3RfcHJpbWFyeTsKKwl1bnNpZ25lZCBjaGFyCWlweGNmZ19hdXRvX2NyZWF0ZV9pbnRlcmZhY2VzOworfTsKKworLyoKKyAqIE9MRCBSb3V0ZSBEZWZpbml0aW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICovCisKK3N0cnVjdCBpcHhfcm91dGVfZGVmIHsKKwlfX2JlMzIJCWlweF9uZXR3b3JrOworCV9fYmUzMgkJaXB4X3JvdXRlcl9uZXR3b3JrOworI2RlZmluZSBJUFhfUk9VVEVfTk9fUk9VVEVSCTAKKwl1bnNpZ25lZCBjaGFyCWlweF9yb3V0ZXJfbm9kZVtJUFhfTk9ERV9MRU5dOworCXVuc2lnbmVkIGNoYXIJaXB4X2RldmljZVsxNl07CisJdW5zaWduZWQgc2hvcnQJaXB4X2ZsYWdzOworI2RlZmluZSBJUFhfUlRfU05BUAkJOAorI2RlZmluZSBJUFhfUlRfODAyMgkJNAorI2RlZmluZSBJUFhfUlRfQkxVRUJPT0sJCTIKKyNkZWZpbmUgSVBYX1JUX1JPVVRFRAkJMQorfTsKKworI2RlZmluZSBTSU9DQUlQWElURkNSVAkJKFNJT0NQUk9UT1BSSVZBVEUpCisjZGVmaW5lIFNJT0NBSVBYUFJJU0xUCQkoU0lPQ1BST1RPUFJJVkFURSArIDEpCisjZGVmaW5lIFNJT0NJUFhDRkdEQVRBCQkoU0lPQ1BST1RPUFJJVkFURSArIDIpCisjZGVmaW5lIFNJT0NJUFhOQ1BDT05OCQkoU0lPQ1BST1RPUFJJVkFURSArIDMpCisjZW5kaWYgLyogX0lQWF9IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcmRhLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lyZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDE0YzMyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcmRhLmgKQEAgLTAsMCArMSwyNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJkYS5oCisgKiBWZXJzaW9uOiAgICAgICAKKyAqIERlc2NyaXB0aW9uOiAgIAorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgTW9uIE1hciAgOCAxNDowNjoxMiAxOTk5CisgKiBNb2RpZmllZCBhdDogICBTYXQgRGVjIDI1IDE2OjA2OjQyIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21zw7ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgS0VSTkVMX0lSREFfSAorI2RlZmluZSBLRVJORUxfSVJEQV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCisvKiBOb3RlIHRoYXQgdGhpcyBmaWxlIGlzIHNoYXJlZCB3aXRoIHVzZXIgc3BhY2UuICovCisKKy8qIEhpbnQgYml0IHBvc2l0aW9ucyBmb3IgZmlyc3QgaGludCBieXRlICovCisjZGVmaW5lIEhJTlRfUE5QICAgICAgICAgMHgwMQorI2RlZmluZSBISU5UX1BEQSAgICAgICAgIDB4MDIKKyNkZWZpbmUgSElOVF9DT01QVVRFUiAgICAweDA0CisjZGVmaW5lIEhJTlRfUFJJTlRFUiAgICAgMHgwOAorI2RlZmluZSBISU5UX01PREVNICAgICAgIDB4MTAKKyNkZWZpbmUgSElOVF9GQVggICAgICAgICAweDIwCisjZGVmaW5lIEhJTlRfTEFOICAgICAgICAgMHg0MAorI2RlZmluZSBISU5UX0VYVEVOU0lPTiAgIDB4ODAKKworLyogSGludCBiaXQgcG9zaXRpb25zIGZvciBzZWNvbmQgaGludCBieXRlIChmaXJzdCBleHRlbnNpb24gYnl0ZSkgKi8KKyNkZWZpbmUgSElOVF9URUxFUEhPTlkgICAweDAxCisjZGVmaW5lIEhJTlRfRklMRV9TRVJWRVIgMHgwMgorI2RlZmluZSBISU5UX0NPTU0gICAgICAgIDB4MDQKKyNkZWZpbmUgSElOVF9NRVNTQUdFICAgICAweDA4CisjZGVmaW5lIEhJTlRfSFRUUCAgICAgICAgMHgxMAorI2RlZmluZSBISU5UX09CRVggICAgICAgIDB4MjAKKworLyogSXJMTVAgY2hhcmFjdGVyIGNvZGUgdmFsdWVzICovCisjZGVmaW5lIENTX0FTQ0lJICAgICAgICAgMHgwMAorI2RlZmluZQlDU19JU09fODg1OV8xICAgIDB4MDEKKyNkZWZpbmUJQ1NfSVNPXzg4NTlfMiAgICAweDAyCisjZGVmaW5lCUNTX0lTT184ODU5XzMgICAgMHgwMworI2RlZmluZQlDU19JU09fODg1OV80ICAgIDB4MDQKKyNkZWZpbmUJQ1NfSVNPXzg4NTlfNSAgICAweDA1CisjZGVmaW5lCUNTX0lTT184ODU5XzYgICAgMHgwNgorI2RlZmluZQlDU19JU09fODg1OV83ICAgIDB4MDcKKyNkZWZpbmUJQ1NfSVNPXzg4NTlfOCAgICAweDA4CisjZGVmaW5lCUNTX0lTT184ODU5XzkgICAgMHgwOQorI2RlZmluZSBDU19VTklDT0RFICAgICAgIDB4ZmYKKworLyogVGhlc2UgYXJlIHRoZSBjdXJyZW50bHkga25vd24gZG9uZ2xlcyAqLwordHlwZWRlZiBlbnVtIHsKKwlJUkRBX1RFS1JBTV9ET05HTEUgICAgICAgPSAwLAorCUlSREFfRVNJX0RPTkdMRSAgICAgICAgICA9IDEsCisJSVJEQV9BQ1RJU1lTX0RPTkdMRSAgICAgID0gMiwKKwlJUkRBX0FDVElTWVNfUExVU19ET05HTEUgPSAzLAorCUlSREFfR0lSQklMX0RPTkdMRSAgICAgICA9IDQsCisJSVJEQV9MSVRFTElOS19ET05HTEUgICAgID0gNSwKKwlJUkRBX0FJUlBPUlRfRE9OR0xFICAgICAgPSA2LAorCUlSREFfT0xEX0JFTEtJTl9ET05HTEUgICA9IDcsCisJSVJEQV9FUDcyMTFfSVIgICAgICAgICAgID0gOCwKKwlJUkRBX01DUDIxMjBfRE9OR0xFICAgICAgPSA5LAorCUlSREFfQUNUMjAwTF9ET05HTEUgICAgICA9IDEwLAorCUlSREFfTUE2MDBfRE9OR0xFICAgICAgICA9IDExLAorCUlSREFfVE9JTTMyMzJfRE9OR0xFICAgICA9IDEyLAorCUlSREFfRVA3MjExX0RPTkdMRSAgICAgICA9IDEzLAorfSBJUkRBX0RPTkdMRTsKKworLyogUHJvdG9jb2wgdHlwZXMgdG8gYmUgdXNlZCBmb3IgU09DS19ER1JBTSAqLworZW51bSB7CisJSVJEQVBST1RPX1VOSVREQVRBID0gMCwKKwlJUkRBUFJPVE9fVUxUUkEgICAgPSAxLAorCUlSREFQUk9UT19NQVgKK307CisKKyNkZWZpbmUgU09MX0lSTE1QICAgICAgMjY2IC8qIFNhbWUgYXMgU09MX0lSREEgZm9yIG5vdyAqLworI2RlZmluZSBTT0xfSVJUVFAgICAgICAyNjYgLyogU2FtZSBhcyBTT0xfSVJEQSBmb3Igbm93ICovCisKKyNkZWZpbmUgSVJMTVBfRU5VTURFVklDRVMgICAgICAgIDEJLyogUmV0dXJuIGRpc2NvdmVyeSBsb2cgKi8KKyNkZWZpbmUgSVJMTVBfSUFTX1NFVCAgICAgICAgICAgIDIJLyogU2V0IGFuIGF0dHJpYnV0ZSBpbiBsb2NhbCBJQVMgKi8KKyNkZWZpbmUgSVJMTVBfSUFTX1FVRVJZICAgICAgICAgIDMJLyogUXVlcnkgcmVtb3RlIElBUyBmb3IgYXR0cmlidXRlICovCisjZGVmaW5lIElSTE1QX0hJTlRTX1NFVCAgICAgICAgICA0CS8qIFNldCBoaW50IGJpdHMgYWR2ZXJ0aXNlZCAqLworI2RlZmluZSBJUkxNUF9RT1NfU0VUICAgICAgICAgICAgNQorI2RlZmluZSBJUkxNUF9RT1NfR0VUICAgICAgICAgICAgNgorI2RlZmluZSBJUkxNUF9NQVhfU0RVX1NJWkUgICAgICAgNworI2RlZmluZSBJUkxNUF9JQVNfR0VUICAgICAgICAgICAgOAkvKiBHZXQgYW4gYXR0cmlidXRlIGZyb20gbG9jYWwgSUFTICovCisjZGVmaW5lIElSTE1QX0lBU19ERUwJCSA5CS8qIFJlbW92ZSBhdHRyaWJ1dGUgZnJvbSBsb2NhbCBJQVMgKi8KKyNkZWZpbmUgSVJMTVBfSElOVF9NQVNLX1NFVAkxMAkvKiBTZXQgZGlzY292ZXJ5IGZpbHRlciAqLworI2RlZmluZSBJUkxNUF9XQUlUREVWSUNFCTExCS8qIFdhaXQgZm9yIGEgbmV3IGRpc2NvdmVyeSAqLworCisjZGVmaW5lIElSVFRQX01BWF9TRFVfU0laRSBJUkxNUF9NQVhfU0RVX1NJWkUgLyogQ29tcGF0aWJpbGl0eSAqLworCisjZGVmaW5lIElBU19NQVhfU1RSSU5HICAgICAgICAgMjU2CS8qIFNlZSBJckxNUCAxLjEsIDQuMy4zLjIgKi8KKyNkZWZpbmUgSUFTX01BWF9PQ1RFVF9TVFJJTkcgIDEwMjQJLyogU2VlIElyTE1QIDEuMSwgNC4zLjMuMiAqLworI2RlZmluZSBJQVNfTUFYX0NMQVNTTkFNRSAgICAgICA2MAkvKiBTZWUgSXJMTVAgMS4xLCA0LjMuMSAqLworI2RlZmluZSBJQVNfTUFYX0FUVFJJQk5BTUUgICAgICA2MAkvKiBTZWUgSXJMTVAgMS4xLCA0LjMuMy4xICovCisjZGVmaW5lIElBU19NQVhfQVRUUklCTlVNQkVSICAgMjU2CS8qIFNlZSBJckxNUCAxLjEsIDQuMy4zLjEgKi8KKy8qIEZvciB1c2VyIHNwYWNlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgLSBtYXkgYmUgZml4ZWQgaW4ga2VybmVsIDIuNS5YCisgKiBOb3RlIDogbmVlZCA2MCsxICgnXDAnKSwgbWFrZSBpdCA2NCBmb3IgYWxpZ25lbWVudCAtIEplYW4gSUkgKi8KKyNkZWZpbmUgSUFTX0VYUE9SVF9DTEFTU05BTUUgICAgICAgNjQKKyNkZWZpbmUgSUFTX0VYUE9SVF9BVFRSSUJOQU1FICAgICAyNTYKKworLyogQXR0cmlidXRlIHR5cGUgbmVlZGVkIGZvciBzdHJ1Y3QgaXJkYV9pYXNfc2V0ICovCisjZGVmaW5lIElBU19NSVNTSU5HIDAKKyNkZWZpbmUgSUFTX0lOVEVHRVIgMQorI2RlZmluZSBJQVNfT0NUX1NFUSAyCisjZGVmaW5lIElBU19TVFJJTkcgIDMKKworI2RlZmluZSBMU0FQX0FOWSAgICAgICAgICAgICAgMHhmZgorCitzdHJ1Y3Qgc29ja2FkZHJfaXJkYSB7CisJX19rZXJuZWxfc2FfZmFtaWx5X3Qgc2lyX2ZhbWlseTsgLyogQUZfSVJEQSAqLworCV9fdTggICAgICAgIHNpcl9sc2FwX3NlbDsgLyogTFNBUCBzZWxlY3RvciAqLworCV9fdTMyICAgICAgIHNpcl9hZGRyOyAgICAgLyogRGV2aWNlIGFkZHJlc3MgKi8KKwljaGFyICAgICAgICBzaXJfbmFtZVsyNV07IC8qIFVzdWFsbHkgPHNlcnZpY2U+OklyREE6VGlueVRQICovCit9OworCitzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyB7CisJX191MzIgICAgICAgc2FkZHI7ICAgIC8qIEFkZHJlc3Mgb2YgbG9jYWwgaW50ZXJmYWNlICovCisJX191MzIgICAgICAgZGFkZHI7ICAgIC8qIEFkZHJlc3Mgb2YgcmVtb3RlIGRldmljZSAqLworCWNoYXIgICAgICAgIGluZm9bMjJdOyAvKiBEZXNjcmlwdGlvbiAqLworCV9fdTggICAgICAgIGNoYXJzZXQ7ICAvKiBDaGFyc2V0IHVzZWQgZm9yIGRlc2NyaXB0aW9uICovCisJX191OCAgICAgICAgaGludHNbMl07IC8qIEhpbnQgYml0cyAqLworfTsKKworc3RydWN0IGlyZGFfZGV2aWNlX2xpc3QgeworICAgICAgIF9fdTMyIGxlbjsKKyAgICAgICBzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyBkZXZbMV07Cit9OworCitzdHJ1Y3QgaXJkYV9pYXNfc2V0IHsKKwljaGFyIGlyZGFfY2xhc3NfbmFtZVtJQVNfRVhQT1JUX0NMQVNTTkFNRV07CisJY2hhciBpcmRhX2F0dHJpYl9uYW1lW0lBU19FWFBPUlRfQVRUUklCTkFNRV07CisJdW5zaWduZWQgaW50IGlyZGFfYXR0cmliX3R5cGU7CisJdW5pb24geworCQl1bnNpZ25lZCBpbnQgaXJkYV9hdHRyaWJfaW50OworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgc2hvcnQgbGVuOworCQkJX191OCBvY3RldF9zZXFbSUFTX01BWF9PQ1RFVF9TVFJJTkddOworCQl9IGlyZGFfYXR0cmliX29jdGV0X3NlcTsKKwkJc3RydWN0IHsKKwkJCV9fdTggbGVuOworCQkJX191OCBjaGFyc2V0OworCQkJX191OCBzdHJpbmdbSUFTX01BWF9TVFJJTkddOworCQl9IGlyZGFfYXR0cmliX3N0cmluZzsKKwl9IGF0dHJpYnV0ZTsKKwlfX3UzMiAgICAgICBkYWRkcjsgICAgLyogQWRkcmVzcyBvZiBkZXZpY2UgKGZvciBzb21lIHF1ZXJpZXMgb25seSkgKi8KK307CisKKy8qIFNvbWUgcHJpdmF0ZSBJT0NUTCdzIChtYXggMTYpICovCisjZGVmaW5lIFNJT0NTRE9OR0xFICAgIChTSU9DREVWUFJJVkFURSArIDApCisjZGVmaW5lIFNJT0NHRE9OR0xFICAgIChTSU9DREVWUFJJVkFURSArIDEpCisjZGVmaW5lIFNJT0NTQkFORFdJRFRIIChTSU9DREVWUFJJVkFURSArIDIpCisjZGVmaW5lIFNJT0NTTUVESUFCVVNZIChTSU9DREVWUFJJVkFURSArIDMpCisjZGVmaW5lIFNJT0NHTUVESUFCVVNZIChTSU9DREVWUFJJVkFURSArIDQpCisjZGVmaW5lIFNJT0NHUkVDRUlWSU5HIChTSU9DREVWUFJJVkFURSArIDUpCisjZGVmaW5lIFNJT0NTTU9ERSAgICAgIChTSU9DREVWUFJJVkFURSArIDYpCisjZGVmaW5lIFNJT0NHTU9ERSAgICAgIChTSU9DREVWUFJJVkFURSArIDcpCisjZGVmaW5lIFNJT0NTRFRSUlRTICAgIChTSU9DREVWUFJJVkFURSArIDgpCisjZGVmaW5lIFNJT0NHUU9TICAgICAgIChTSU9DREVWUFJJVkFURSArIDkpCisKKy8qIE5vIHJlYXNvbiB0byBpbmNsdWRlIDxsaW51eC9pZi5oPiBqdXN0IGJlY2F1c2Ugb2YgdGhpcyBvbmUgOy0pICovCisjZGVmaW5lIElSTkFNU0laIDE2IAorCisvKiBJckRBIHF1YWxpdHkgb2Ygc2VydmljZSBpbmZvcm1hdGlvbiAobXVzdCBub3QgZXhjZWVkIDE2IGJ5dGVzKSAqLworc3RydWN0IGlmX2lyZGFfcW9zIHsKKwl1bnNpZ25lZCBsb25nICBiYXVkcmF0ZTsKKwl1bnNpZ25lZCBzaG9ydCBkYXRhX3NpemU7CisJdW5zaWduZWQgc2hvcnQgd2luZG93X3NpemU7CisJdW5zaWduZWQgc2hvcnQgbWluX3R1cm5fdGltZTsKKwl1bnNpZ25lZCBzaG9ydCBtYXhfdHVybl90aW1lOworCXVuc2lnbmVkIGNoYXIgIGFkZF9ib2ZzOworCXVuc2lnbmVkIGNoYXIgIGxpbmtfZGlzYzsKK307CisKKy8qIEZvciBzZXR0aW5nIFJUUyBhbmQgRFRSIGxpbmVzIG9mIGEgZG9uZ2xlICovCitzdHJ1Y3QgaWZfaXJkYV9saW5lIHsKKwlfX3U4IGR0cjsKKwlfX3U4IHJ0czsKK307CisKKy8qIElyREEgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gKGRhdGEgcGFydCBtdXN0IG5vdCBleGNlZWQgMTYgYnl0ZXMpICovCitzdHJ1Y3QgaWZfaXJkYV9yZXEgeworCXVuaW9uIHsKKwkJY2hhciBpZnJuX25hbWVbSVJOQU1TSVpdOyAgLyogaWYgbmFtZSwgZS5nLiAiaXJkYTAiICovCisJfSBpZnJfaWZybjsKKwkKKwkvKiBEYXRhIHBhcnQgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBpZl9pcmRhX2xpbmUgaWZydV9saW5lOworCQlzdHJ1Y3QgaWZfaXJkYV9xb3MgIGlmcnVfcW9zOworCQl1bnNpZ25lZCBzaG9ydCAgICAgIGlmcnVfZmxhZ3M7CisJCXVuc2lnbmVkIGludCAgICAgICAgaWZydV9yZWNlaXZpbmc7CisJCXVuc2lnbmVkIGludCAgICAgICAgaWZydV9tb2RlOworCQl1bnNpZ25lZCBpbnQgICAgICAgIGlmcnVfZG9uZ2xlOworCX0gaWZyX2lmcnU7Cit9OworCisjZGVmaW5lIGlmcl9iYXVkcmF0ZSAgaWZyX2lmcnUuaWZydV9xb3MuYmF1ZHJhdGUKKyNkZWZpbmUgaWZyX3JlY2VpdmluZyBpZnJfaWZydS5pZnJ1X3JlY2VpdmluZyAKKyNkZWZpbmUgaWZyX2RvbmdsZSAgICBpZnJfaWZydS5pZnJ1X2RvbmdsZQorI2RlZmluZSBpZnJfbW9kZSAgICAgIGlmcl9pZnJ1LmlmcnVfbW9kZQorI2RlZmluZSBpZnJfZHRyICAgICAgIGlmcl9pZnJ1LmlmcnVfbGluZS5kdHIKKyNkZWZpbmUgaWZyX3J0cyAgICAgICBpZnJfaWZydS5pZnJ1X2xpbmUucnRzCisKKworLyogSXJEQSBuZXRsaW5rIGRlZmluaXRpb25zICovCisjZGVmaW5lIElSREFfTkxfTkFNRSAiaXJkYSIKKyNkZWZpbmUgSVJEQV9OTF9WRVJTSU9OIDEKKworZW51bSBpcmRhX25sX2NvbW1hbmRzIHsKKwlJUkRBX05MX0NNRF9VTlNQRUMsCisJSVJEQV9OTF9DTURfU0VUX01PREUsCisJSVJEQV9OTF9DTURfR0VUX01PREUsCisKKwlfX0lSREFfTkxfQ01EX0FGVEVSX0xBU1QKK307CisjZGVmaW5lIElSREFfTkxfQ01EX01BWCAoX19JUkRBX05MX0NNRF9BRlRFUl9MQVNUIC0gMSkKKworZW51bSBubDgwMjExX2F0dHJzIHsKKwlJUkRBX05MX0FUVFJfVU5TUEVDLAorCUlSREFfTkxfQVRUUl9JRk5BTUUsCisJSVJEQV9OTF9BVFRSX01PREUsCisKKwlfX0lSREFfTkxfQVRUUl9BRlRFUl9MQVNUCit9OworI2RlZmluZSBJUkRBX05MX0FUVFJfTUFYIChfX0lSREFfTkxfQVRUUl9BRlRFUl9MQVNUIC0gMSkKKworLyogSXJEQSBtb2RlcyAqLworI2RlZmluZSBJUkRBX01PREVfUFJJTUFSWSAgIDB4MQorI2RlZmluZSBJUkRBX01PREVfU0VDT05EQVJZIDB4MgorI2RlZmluZSBJUkRBX01PREVfTU9OSVRPUiAgIDB4NAorCisjZW5kaWYgLyogS0VSTkVMX0lSREFfSCAqLworCisKKworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lycW5yLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lycW5yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmYjYzYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXJxbnIuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX0xJTlVYX0lSUU5SX0gKKyNkZWZpbmUgX0xJTlVYX0lSUU5SX0gKKworLyoKKyAqIEdlbmVyaWMgaXJxX2Rlc2MgaXRlcmF0b3JzOgorICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDcyYjBjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qICRJZDogaXNkbi5oLHYgMS4xMjUuMi4zIDIwMDQvMDIvMTAgMDE6MDc6MTQga2VpbCBFeHAgJAorICoKKyAqIE1haW4gaGVhZGVyIGZvciB0aGUgTGludXggSVNETiBzdWJzeXN0ZW0gKGxpbmtsZXZlbCkuCisgKgorICogQ29weXJpZ2h0IDE5OTQsOTUsOTYgYnkgRnJpdHogRWxmZXJ0IChmcml0ekBpc2RuNGxpbnV4LmRlKQorICogQ29weXJpZ2h0IDE5OTUsOTYgICAgYnkgVGhpbmtpbmcgT2JqZWN0cyBTb2Z0d2FyZSBHbWJIIFd1ZXJ6YnVyZworICogQ29weXJpZ2h0IDE5OTUsOTYgICAgYnkgTWljaGFlbCBIaXBwIChNaWNoYWVsLkhpcHBAc3R1ZGVudC51bmktdHVlYmluZ2VuLmRlKQorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqLworCisjaWZuZGVmIF9fSVNETl9IX18KKyNkZWZpbmUgX19JU0ROX0hfXworCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBJU0ROX01BWF9EUklWRVJTICAgIDMyCisjZGVmaW5lIElTRE5fTUFYX0NIQU5ORUxTICAgNjQKKworLyogTmV3IGlvY3RsLWNvZGVzICovCisjZGVmaW5lIElJT0NORVRBSUYgIF9JTygnSScsMSkKKyNkZWZpbmUgSUlPQ05FVERJRiAgX0lPKCdJJywyKQorI2RlZmluZSBJSU9DTkVUU0NGICBfSU8oJ0knLDMpCisjZGVmaW5lIElJT0NORVRHQ0YgIF9JTygnSScsNCkKKyNkZWZpbmUgSUlPQ05FVEFOTSAgX0lPKCdJJyw1KQorI2RlZmluZSBJSU9DTkVURE5NICBfSU8oJ0knLDYpCisjZGVmaW5lIElJT0NORVRHTk0gIF9JTygnSScsNykKKyNkZWZpbmUgSUlPQ0dFVFNFVCAgX0lPKCdJJyw4KSAvKiBubyBsb25nZXIgc3VwcG9ydGVkICovCisjZGVmaW5lIElJT0NTRVRTRVQgIF9JTygnSScsOSkgLyogbm8gbG9uZ2VyIHN1cHBvcnRlZCAqLworI2RlZmluZSBJSU9DU0VUVkVSICBfSU8oJ0knLDEwKQorI2RlZmluZSBJSU9DTkVUSFVQICBfSU8oJ0knLDExKQorI2RlZmluZSBJSU9DU0VUR1NUICBfSU8oJ0knLDEyKQorI2RlZmluZSBJSU9DU0VUQlJKICBfSU8oJ0knLDEzKQorI2RlZmluZSBJSU9DU0lHUFJGICBfSU8oJ0knLDE0KQorI2RlZmluZSBJSU9DR0VUUFJGICBfSU8oJ0knLDE1KQorI2RlZmluZSBJSU9DU0VUUFJGICBfSU8oJ0knLDE2KQorI2RlZmluZSBJSU9DR0VUTUFQICBfSU8oJ0knLDE3KQorI2RlZmluZSBJSU9DU0VUTUFQICBfSU8oJ0knLDE4KQorI2RlZmluZSBJSU9DTkVUQVNMICBfSU8oJ0knLDE5KQorI2RlZmluZSBJSU9DTkVURElMICBfSU8oJ0knLDIwKQorI2RlZmluZSBJSU9DR0VUQ1BTICBfSU8oJ0knLDIxKQorI2RlZmluZSBJSU9DR0VURFZSICBfSU8oJ0knLDIyKQorI2RlZmluZSBJSU9DTkVUTENSICBfSU8oJ0knLDIzKSAvKiBkd2FiYyBpb2N0bCBmb3IgTENSIGZyb20gaXNkbmxvZyAqLworI2RlZmluZSBJSU9DTkVURFdSU0VUICBfSU8oJ0knLDI0KSAvKiBkd2FiYyBpb2N0bCB0byByZXNldCBhYmMtdmFsdWVzIHRvIGRlZmF1bHQgb24gYSBuZXQtaW50ZXJmYWNlICovCisKKyNkZWZpbmUgSUlPQ05FVEFMTiAgX0lPKCdJJywzMikKKyNkZWZpbmUgSUlPQ05FVERMTiAgX0lPKCdJJywzMykKKworI2RlZmluZSBJSU9DTkVUR1BOICBfSU8oJ0knLDM0KQorCisjZGVmaW5lIElJT0NEQkdWQVIgIF9JTygnSScsMTI3KQorCisjZGVmaW5lIElJT0NEUlZDVEwgIF9JTygnSScsMTI4KQorCisvKiBjaXNjbyBoZGxjayBkZXZpY2UgcHJpdmF0ZSBpb2N0bHMgKi8KKyNkZWZpbmUgU0lPQ0dLRUVQUEVSSU9ECShTSU9DREVWUFJJVkFURSArIDApCisjZGVmaW5lIFNJT0NTS0VFUFBFUklPRAkoU0lPQ0RFVlBSSVZBVEUgKyAxKQorI2RlZmluZSBTSU9DR0RFQlNFUklOVAkoU0lPQ0RFVlBSSVZBVEUgKyAyKQorI2RlZmluZSBTSU9DU0RFQlNFUklOVAkoU0lPQ0RFVlBSSVZBVEUgKyAzKQorCisvKiBQYWNrZXQgZW5jYXBzdWxhdGlvbnMgZm9yIG5ldC1pbnRlcmZhY2VzICovCisjZGVmaW5lIElTRE5fTkVUX0VOQ0FQX0VUSEVSICAgICAgMAorI2RlZmluZSBJU0ROX05FVF9FTkNBUF9SQVdJUCAgICAgIDEKKyNkZWZpbmUgSVNETl9ORVRfRU5DQVBfSVBUWVAgICAgICAyCisjZGVmaW5lIElTRE5fTkVUX0VOQ0FQX0NJU0NPSERMQyAgMyAvKiBXaXRob3V0IFNMQVJQIGFuZCBrZWVwYWxpdmUgKi8KKyNkZWZpbmUgSVNETl9ORVRfRU5DQVBfU1lOQ1BQUCAgICA0CisjZGVmaW5lIElTRE5fTkVUX0VOQ0FQX1VJSERMQyAgICAgNQorI2RlZmluZSBJU0ROX05FVF9FTkNBUF9DSVNDT0hETENLIDYgLyogV2l0aCBTTEFSUCBhbmQga2VlcGFsaXZlICAgICovCisjZGVmaW5lIElTRE5fTkVUX0VOQ0FQX1gyNUlGQUNFICAgNyAvKiBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcveDI1LWlmYWNlLnR4dCAqLworI2RlZmluZSBJU0ROX05FVF9FTkNBUF9NQVhfRU5DQVAgIElTRE5fTkVUX0VOQ0FQX1gyNUlGQUNFCisKKy8qIEZhY2lsaXR5IHdoaWNoIGN1cnJlbnRseSB1c2VzIGFuIElTRE4tY2hhbm5lbCAqLworI2RlZmluZSBJU0ROX1VTQUdFX05PTkUgICAgICAgMAorI2RlZmluZSBJU0ROX1VTQUdFX1JBVyAgICAgICAgMQorI2RlZmluZSBJU0ROX1VTQUdFX01PREVNICAgICAgMgorI2RlZmluZSBJU0ROX1VTQUdFX05FVCAgICAgICAgMworI2RlZmluZSBJU0ROX1VTQUdFX1ZPSUNFICAgICAgNAorI2RlZmluZSBJU0ROX1VTQUdFX0ZBWCAgICAgICAgNQorI2RlZmluZSBJU0ROX1VTQUdFX01BU0sgICAgICAgNyAvKiBNYXNrIHRvIGdldCBwbGFpbiB1c2FnZSAqLworI2RlZmluZSBJU0ROX1VTQUdFX0RJU0FCTEVEICAzMiAvKiBUaGlzIGJpdCBpcyBzZXQsIGlmIGNoYW5uZWwgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgSVNETl9VU0FHRV9FWENMVVNJVkUgNjQgLyogVGhpcyBiaXQgaXMgc2V0LCBpZiBjaGFubmVsIGlzIGV4Y2x1c2l2ZSAqLworI2RlZmluZSBJU0ROX1VTQUdFX09VVEdPSU5HIDEyOCAvKiBUaGlzIGJpdCBpcyBzZXQsIGlmIGNoYW5uZWwgaXMgb3V0Z29pbmcgICovCisKKyNkZWZpbmUgSVNETl9NT0RFTV9OVU1SRUcgICAgMjQgICAgICAgIC8qIE51bWJlciBvZiBNb2RlbS1SZWdpc3RlcnMgICAgICAgICovCisjZGVmaW5lIElTRE5fTE1TTkxFTiAgICAgICAgIDI1NSAvKiBMZW5ndGggb2YgdHR5J3MgTGlzdGVuLU1TTiBzdHJpbmcgKi8KKyNkZWZpbmUgSVNETl9DTVNHTEVOCSAgICAgNTAJIC8qIExlbmd0aCBvZiBDT05ORUNULU1lc3NhZ2UgdG8gYWRkIGZvciBNb2RlbSAqLworCisjZGVmaW5lIElTRE5fTVNOTEVOICAgICAgICAgIDMyCisjZGVmaW5lIE5FVF9EViAweDA2ICAvKiBEYXRhIHZlcnNpb24gZm9yIGlzZG5fbmV0X2lvY3RsX2NmZyAgICovCisjZGVmaW5lIFRUWV9EViAweDA2ICAvKiBEYXRhIHZlcnNpb24gZm9yIGlwcm9mZCBldGMuICAgICAgICAgICovCisKKyNkZWZpbmUgSU5GX0RWIDB4MDEgIC8qIERhdGEgdmVyc2lvbiBmb3IgL2Rldi9pc2RuaW5mbyAgICAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyIGRydmlkWzI1XTsKKyAgdW5zaWduZWQgbG9uZyBhcmc7Cit9IGlzZG5faW9jdGxfc3RydWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgbmFtZVsxMF07CisgIGNoYXIgcGhvbmVbSVNETl9NU05MRU5dOworICBpbnQgIG91dGdvaW5nOworfSBpc2RuX25ldF9pb2N0bF9waG9uZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyIG5hbWVbMTBdOyAgICAgLyogTmFtZSBvZiBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAqLworICBjaGFyIG1hc3RlclsxMF07ICAgLyogTmFtZSBvZiBNYXN0ZXIgZm9yIEJ1bmRsaW5nICAgICAgICAgICAqLworICBjaGFyIHNsYXZlWzEwXTsgICAgLyogTmFtZSBvZiBTbGF2ZSBmb3IgQnVuZGxpbmcgICAgICAgICAgICAqLworICBjaGFyIGVhelsyNTZdOyAgICAgLyogRUFaL01TTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBjaGFyIGRydmlkWzI1XTsgICAgLyogRHJpdmVySWQgZm9yIEJpbmRpbmdzICAgICAgICAgICAgICAgICAqLworICBpbnQgIG9uaHRpbWU7ICAgICAgLyogSGFuZ3VwLVRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGNoYXJnZTsgICAgICAgLyogQ2hhcmdlLVVuaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGwyX3Byb3RvOyAgICAgLyogTGF5ZXItMiBwcm90b2NvbCAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGwzX3Byb3RvOyAgICAgLyogTGF5ZXItMyBwcm90b2NvbCAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIHBfZW5jYXA7ICAgICAgLyogRW5jYXBzdWxhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGV4Y2x1c2l2ZTsgICAgLyogQ2hhbm5lbCwgaWYgYm91bmQgZXhjbHVzaXZlICAgICAgICAgICAqLworICBpbnQgIGRpYWxtYXg7ICAgICAgLyogRGlhbCBSZXRyeS1Db3VudGVyICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIHNsYXZlZGVsYXk7ICAgLyogRGVsYXkgdW50aWwgc2xhdmUgc3RhcnRzIHVwICAgICAgICAgICAqLworICBpbnQgIGNiZGVsYXk7ICAgICAgLyogRGVsYXkgYmVmb3JlIENhbGxiYWNrICAgICAgICAgICAgICAgICAqLworICBpbnQgIGNoYXJnZWh1cDsgICAgLyogRmxhZzogQ2hhcmdlLUhhbmd1cCAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGlodXA7ICAgICAgICAgLyogRmxhZzogSGFuZ3VwLVRpbWVvdXQgb24gaW5jb21pbmcgbGluZSAqLworICBpbnQgIHNlY3VyZTsgICAgICAgLyogRmxhZzogU2VjdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGNhbGxiYWNrOyAgICAgLyogRmxhZzogQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGNiaHVwOyAgICAgICAgLyogRmxhZzogUmVqZWN0IENhbGwgYmVmb3JlIENhbGxiYWNrICAgICAqLworICBpbnQgIHBwcGJpbmQ7ICAgICAgLyogaXBwcCBkZXZpY2UgZm9yIGJpbmRpbmdzICAgICAgICAgICAgICAqLworICBpbnQgIGNoYXJnZWludDsgICAgLyogVXNlIGZpeGVkIGNoYXJnZSBpbnRlcnZhbCBsZW5ndGggICAgICAqLworICBpbnQgIHRyaWdnZXJjcHM7ICAgLyogQm9nb0NQUyBuZWVkZWQgZm9yIHRyaWdnZXJpbmcgc2xhdmUgICAqLworICBpbnQgIGRpYWx0aW1lb3V0OyAgLyogRGlhbC1UaW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGRpYWx3YWl0OyAgICAgLyogVGltZSB0byB3YWl0IGFmdGVyIGZhaWxlZCBkaWFsICAgICAgICAqLworICBpbnQgIGRpYWxtb2RlOyAgICAgLyogRmxhZzogb2ZmIC8gb24gLyBhdXRvICAgICAgICAgICAgICAgICAqLworfSBpc2RuX25ldF9pb2N0bF9jZmc7CisKKyNkZWZpbmUgSVNETl9ORVRfRElBTE1PREVfTUFTSyAgMHhDMCAgICAvKiBiaXRzIGZvciBzdGF0dXMgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNETl9ORVRfRE1fT0ZGCSAgICAgICAgMHgwMCAgICAvKiB0aGlzIGludGVyZmFjZSBpcyBzdG9wcGVkICAgICAgKi8KKyNkZWZpbmUgSVNETl9ORVRfRE1fTUFOVUFMCTB4NDAgICAgLyogdGhpcyBpbnRlcmZhY2UgaXMgb24gKG1hbnVhbCkgICovCisjZGVmaW5lIElTRE5fTkVUX0RNX0FVVE8JMHg4MCAgICAvKiB0aGlzIGludGVyZmFjZSBpcyBhdXRvZGlhbCAgICAgKi8KKyNkZWZpbmUgSVNETl9ORVRfRElBTE1PREUoeCkgKCgmKHgpKS0+ZmxhZ3MgJiBJU0ROX05FVF9ESUFMTU9ERV9NQVNLKQorCisKKyNlbmRpZiAvKiBfX0lTRE5fSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG4vY2FwaWNtZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuL2NhcGljbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTg2MzVmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuL2NhcGljbWQuaApAQCAtMCwwICsxLDExNSBAQAorLyogJElkOiBjYXBpY21kLmgsdiAxLjIuNi4yIDIwMDEvMDkvMjMgMjI6MjQ6MzMga2FpIEV4cCAkCisgKiAKKyAqIENBUEkgMi4wIEludGVyZmFjZSBmb3IgTGludXgKKyAqIAorICogQ29weXJpZ2h0IDE5OTcgYnkgQ2Fyc3RlbiBQYWV0aCA8Y2FsbGVAY2FsbGUuZGU+CisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICovCisKKyNpZm5kZWYgX19DQVBJQ01EX0hfXworI2RlZmluZSBfX0NBUElDTURfSF9fCisKKyNkZWZpbmUgQ0FQSV9NU0dfQkFTRUxFTgkJOAorI2RlZmluZSBDQVBJX0RBVEFfQjNfUkVRX0xFTgkJKENBUElfTVNHX0JBU0VMRU4rNCs0KzIrMisyKQorI2RlZmluZSBDQVBJX0RBVEFfQjNfUkVTUF9MRU4JCShDQVBJX01TR19CQVNFTEVOKzQrMikKKworLyotLS0tLSBDQVBJIGNvbW1hbmRzIC0tLS0tKi8KKyNkZWZpbmUgQ0FQSV9BTEVSVAkJICAgIDB4MDEKKyNkZWZpbmUgQ0FQSV9DT05ORUNUCQkgICAgMHgwMgorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQUNUSVZFCSAgICAweDAzCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19BQ1RJVkUJICAgIDB4ODMKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0IzIAkgICAgMHg4MgorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQjNfVDkwX0FDVElWRSAgMHg4OAorI2RlZmluZSBDQVBJX0RBVEFfQjMJCSAgICAweDg2CisjZGVmaW5lIENBUElfRElTQ09OTkVDVF9CMwkgICAgMHg4NAorI2RlZmluZSBDQVBJX0RJU0NPTk5FQ1QgCSAgICAweDA0CisjZGVmaW5lIENBUElfRkFDSUxJVFkJCSAgICAweDgwCisjZGVmaW5lIENBUElfSU5GTwkJICAgIDB4MDgKKyNkZWZpbmUgQ0FQSV9MSVNURU4JCSAgICAweDA1CisjZGVmaW5lIENBUElfTUFOVUZBQ1RVUkVSCSAgICAweGZmCisjZGVmaW5lIENBUElfUkVTRVRfQjMJCSAgICAweDg3CisjZGVmaW5lIENBUElfU0VMRUNUX0JfUFJPVE9DT0wJICAgIDB4NDEKKworLyotLS0tLSBDQVBJIHN1YmNvbW1hbmRzIC0tLS0tKi8KKworI2RlZmluZSBDQVBJX1JFUSAgICAweDgwCisjZGVmaW5lIENBUElfQ09ORiAgIDB4ODEKKyNkZWZpbmUgQ0FQSV9JTkQgICAgMHg4MgorI2RlZmluZSBDQVBJX1JFU1AgICAweDgzCisKKy8qLS0tLS0gQ0FQSSBjb21iaW5lZCBjb21tYW5kcyAtLS0tLSovCisKKyNkZWZpbmUgQ0FQSUNNRChjbWQsc3ViY21kKQkoKChjbWQpPDw4KXwoc3ViY21kKSkKKworI2RlZmluZSBDQVBJX0RJU0NPTk5FQ1RfUkVRCQlDQVBJQ01EKENBUElfRElTQ09OTkVDVCxDQVBJX1JFUSkKKyNkZWZpbmUgQ0FQSV9ESVNDT05ORUNUX0NPTkYJCUNBUElDTUQoQ0FQSV9ESVNDT05ORUNULENBUElfQ09ORikKKyNkZWZpbmUgQ0FQSV9ESVNDT05ORUNUX0lORAkJQ0FQSUNNRChDQVBJX0RJU0NPTk5FQ1QsQ0FQSV9JTkQpCisjZGVmaW5lIENBUElfRElTQ09OTkVDVF9SRVNQCQlDQVBJQ01EKENBUElfRElTQ09OTkVDVCxDQVBJX1JFU1ApCisKKyNkZWZpbmUgQ0FQSV9BTEVSVF9SRVEJCQlDQVBJQ01EKENBUElfQUxFUlQsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfQUxFUlRfQ09ORgkJCUNBUElDTUQoQ0FQSV9BTEVSVCxDQVBJX0NPTkYpCisKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX1JFUQkJQ0FQSUNNRChDQVBJX0NPTk5FQ1QsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfQ09OTkVDVF9DT05GCQlDQVBJQ01EKENBUElfQ09OTkVDVCxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfQ09OTkVDVF9JTkQJCUNBUElDTUQoQ0FQSV9DT05ORUNULENBUElfSU5EKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfUkVTUAkJQ0FQSUNNRChDQVBJX0NPTk5FQ1QsQ0FQSV9SRVNQKQorCisjZGVmaW5lIENBUElfQ09OTkVDVF9BQ1RJVkVfUkVRCQlDQVBJQ01EKENBUElfQ09OTkVDVF9BQ1RJVkUsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfQ09OTkVDVF9BQ1RJVkVfQ09ORglDQVBJQ01EKENBUElfQ09OTkVDVF9BQ1RJVkUsQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQUNUSVZFX0lORAkJQ0FQSUNNRChDQVBJX0NPTk5FQ1RfQUNUSVZFLENBUElfSU5EKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQUNUSVZFX1JFU1AJQ0FQSUNNRChDQVBJX0NPTk5FQ1RfQUNUSVZFLENBUElfUkVTUCkKKworI2RlZmluZSBDQVBJX1NFTEVDVF9CX1BST1RPQ09MX1JFUQlDQVBJQ01EKENBUElfU0VMRUNUX0JfUFJPVE9DT0wsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfU0VMRUNUX0JfUFJPVE9DT0xfQ09ORglDQVBJQ01EKENBUElfU0VMRUNUX0JfUFJPVE9DT0wsQ0FQSV9DT05GKQorCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19BQ1RJVkVfUkVRCUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzX0FDVElWRSxDQVBJX1JFUSkKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0IzX0FDVElWRV9DT05GCUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzX0FDVElWRSxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19BQ1RJVkVfSU5ECUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzX0FDVElWRSxDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0IzX0FDVElWRV9SRVNQCUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzX0FDVElWRSxDQVBJX1JFU1ApCisKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0IzX1JFUQkJQ0FQSUNNRChDQVBJX0NPTk5FQ1RfQjMsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19DT05GCQlDQVBJQ01EKENBUElfQ09OTkVDVF9CMyxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19JTkQJCUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzLENBUElfSU5EKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQjNfUkVTUAkJQ0FQSUNNRChDQVBJX0NPTk5FQ1RfQjMsQ0FQSV9SRVNQKQorCisKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0IzX1Q5MF9BQ1RJVkVfSU5ECUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzX1Q5MF9BQ1RJVkUsQ0FQSV9JTkQpCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19UOTBfQUNUSVZFX1JFU1AJQ0FQSUNNRChDQVBJX0NPTk5FQ1RfQjNfVDkwX0FDVElWRSxDQVBJX1JFU1ApCisKKyNkZWZpbmUgQ0FQSV9EQVRBX0IzX1JFUQkJQ0FQSUNNRChDQVBJX0RBVEFfQjMsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfREFUQV9CM19DT05GCQlDQVBJQ01EKENBUElfREFUQV9CMyxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfREFUQV9CM19JTkQJCUNBUElDTUQoQ0FQSV9EQVRBX0IzLENBUElfSU5EKQorI2RlZmluZSBDQVBJX0RBVEFfQjNfUkVTUAkJQ0FQSUNNRChDQVBJX0RBVEFfQjMsQ0FQSV9SRVNQKQorCisjZGVmaW5lIENBUElfRElTQ09OTkVDVF9CM19SRVEJCUNBUElDTUQoQ0FQSV9ESVNDT05ORUNUX0IzLENBUElfUkVRKQorI2RlZmluZSBDQVBJX0RJU0NPTk5FQ1RfQjNfQ09ORgkJQ0FQSUNNRChDQVBJX0RJU0NPTk5FQ1RfQjMsQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX0RJU0NPTk5FQ1RfQjNfSU5ECQlDQVBJQ01EKENBUElfRElTQ09OTkVDVF9CMyxDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9ESVNDT05ORUNUX0IzX1JFU1AJCUNBUElDTUQoQ0FQSV9ESVNDT05ORUNUX0IzLENBUElfUkVTUCkKKworI2RlZmluZSBDQVBJX1JFU0VUX0IzX1JFUQkJQ0FQSUNNRChDQVBJX1JFU0VUX0IzLENBUElfUkVRKQorI2RlZmluZSBDQVBJX1JFU0VUX0IzX0NPTkYJCUNBUElDTUQoQ0FQSV9SRVNFVF9CMyxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfUkVTRVRfQjNfSU5ECQlDQVBJQ01EKENBUElfUkVTRVRfQjMsQ0FQSV9JTkQpCisjZGVmaW5lIENBUElfUkVTRVRfQjNfUkVTUAkJQ0FQSUNNRChDQVBJX1JFU0VUX0IzLENBUElfUkVTUCkKKworI2RlZmluZSBDQVBJX0xJU1RFTl9SRVEJCQlDQVBJQ01EKENBUElfTElTVEVOLENBUElfUkVRKQorI2RlZmluZSBDQVBJX0xJU1RFTl9DT05GCQlDQVBJQ01EKENBUElfTElTVEVOLENBUElfQ09ORikKKworI2RlZmluZSBDQVBJX01BTlVGQUNUVVJFUl9SRVEJCUNBUElDTUQoQ0FQSV9NQU5VRkFDVFVSRVIsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfTUFOVUZBQ1RVUkVSX0NPTkYJCUNBUElDTUQoQ0FQSV9NQU5VRkFDVFVSRVIsQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX01BTlVGQUNUVVJFUl9JTkQJCUNBUElDTUQoQ0FQSV9NQU5VRkFDVFVSRVIsQ0FQSV9JTkQpCisjZGVmaW5lIENBUElfTUFOVUZBQ1RVUkVSX1JFU1AJCUNBUElDTUQoQ0FQSV9NQU5VRkFDVFVSRVIsQ0FQSV9SRVNQKQorCisjZGVmaW5lIENBUElfRkFDSUxJVFlfUkVRCQlDQVBJQ01EKENBUElfRkFDSUxJVFksQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfRkFDSUxJVFlfQ09ORgkJQ0FQSUNNRChDQVBJX0ZBQ0lMSVRZLENBUElfQ09ORikKKyNkZWZpbmUgQ0FQSV9GQUNJTElUWV9JTkQJCUNBUElDTUQoQ0FQSV9GQUNJTElUWSxDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9GQUNJTElUWV9SRVNQCQlDQVBJQ01EKENBUElfRkFDSUxJVFksQ0FQSV9SRVNQKQorCisjZGVmaW5lIENBUElfSU5GT19SRVEJCQlDQVBJQ01EKENBUElfSU5GTyxDQVBJX1JFUSkKKyNkZWZpbmUgQ0FQSV9JTkZPX0NPTkYJCQlDQVBJQ01EKENBUElfSU5GTyxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfSU5GT19JTkQJCQlDQVBJQ01EKENBUElfSU5GTyxDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9JTkZPX1JFU1AJCQlDQVBJQ01EKENBUElfSU5GTyxDQVBJX1JFU1ApCisKKyNlbmRpZgkJCQkvKiBfX0NBUElDTURfSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG5fZGl2ZXJ0aWYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbl9kaXZlcnRpZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmY3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG5fZGl2ZXJ0aWYuaApAQCAtMCwwICsxLDI2IEBACisvKiAkSWQ6IGlzZG5fZGl2ZXJ0aWYuaCx2IDEuNC42LjEgMjAwMS8wOS8yMyAyMjoyNTowNSBrYWkgRXhwICQKKyAqCisgKiBIZWFkZXIgZm9yIHRoZSBkaXZlcnNpb24gc3VwcGxlbWVudGFyeSBpbnRlcmZhY2UgZm9yIGk0bC4KKyAqCisgKiBBdXRob3IgICAgV2VybmVyIENvcm5lbGl1cyAod2VybmVyQHRpdHJvLmRlKQorICogQ29weXJpZ2h0IGJ5IFdlcm5lciBDb3JuZWxpdXMgKHdlcm5lckB0aXRyby5kZSkKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG1hZ2ljIHZhbHVlIGlzIGFsc28gdXNlZCB0byBjb250cm9sIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRElWRVJUX0lGX01BR0lDIDB4MjU4NzM0MDEKKyNkZWZpbmUgRElWRVJUX0NNRF9SRUcgIDB4MDAgIC8qIHJlZ2lzdGVyIGNvbW1hbmQgKi8KKyNkZWZpbmUgRElWRVJUX0NNRF9SRUwgIDB4MDEgIC8qIHJlbGVhc2UgY29tbWFuZCAqLworI2RlZmluZSBESVZFUlRfTk9fRVJSICAgMHgwMCAgLyogcmV0dXJuIHZhbHVlIG5vIGVycm9yICovCisjZGVmaW5lIERJVkVSVF9DTURfRVJSICAweDAxICAvKiBpbnZhbGlkIGNtZCAqLworI2RlZmluZSBESVZFUlRfVkVSX0VSUiAgMHgwMiAgLyogbWFnaWMvdmVyc2lvbiBpbnZhbGlkICovCisjZGVmaW5lIERJVkVSVF9SRUdfRVJSICAweDAzICAvKiBtb2R1bGUgYWxyZWFkeSByZWdpc3RlcmVkICovCisjZGVmaW5lIERJVkVSVF9SRUxfRVJSICAweDA0ICAvKiBtb2R1bGUgbm90IHJlZ2lzdGVyZWQgKi8KKyNkZWZpbmUgRElWRVJUX1JFR19OQU1FIGlzZG5fcmVnaXN0ZXJfZGl2ZXJ0CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbl9wcHAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbl9wcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWJiMDE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuX3BwcC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIExpbnV4IElTRE4gc3Vic3lzdGVtLCBzeW5jIFBQUCwgaW50ZXJmYWNlIHRvIGlwcHBkCisgKgorICogQ29weXJpZ2h0IDE5OTQtMTk5OSAgYnkgRnJpdHogRWxmZXJ0IChmcml0ekBpc2RuNGxpbnV4LmRlKQorICogQ29weXJpZ2h0IDE5OTUsOTYgICAgVGhpbmtpbmcgT2JqZWN0cyBTb2Z0d2FyZSBHbWJIIFd1ZXJ6YnVyZworICogQ29weXJpZ2h0IDE5OTUsOTYgICAgYnkgTWljaGFlbCBIaXBwIChNaWNoYWVsLkhpcHBAc3R1ZGVudC51bmktdHVlYmluZ2VuLmRlKQorICogQ29weXJpZ2h0IDIwMDAtMjAwMiAgYnkgS2FpIEdlcm1hc2NoZXdza2kgKGthaUBnZXJtYXNjaGV3c2tpLm5hbWUpCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfSVNETl9QUFBfSAorI2RlZmluZSBfTElOVVhfSVNETl9QUFBfSAorCisjZGVmaW5lIENBTExUWVBFX0lOQ09NSU5HIDB4MQorI2RlZmluZSBDQUxMVFlQRV9PVVRHT0lORyAweDIKKyNkZWZpbmUgQ0FMTFRZUEVfQ0FMTEJBQ0sgMHg0CisKKyNkZWZpbmUgSVBQUF9WRVJTSU9OICAgICIyLjIuMCIKKworc3RydWN0IHBwcGNhbGxpbmZvCit7CisgIGludCBjYWxsdHlwZTsKKyAgdW5zaWduZWQgY2hhciBsb2NhbF9udW1bNjRdOworICB1bnNpZ25lZCBjaGFyIHJlbW90ZV9udW1bNjRdOworICBpbnQgY2hhcmdlX3VuaXRzOworfTsKKworI2RlZmluZSBQUFBJT0NHQ0FMTElORk8gX0lPV1IoJ3QnLDEyOCxzdHJ1Y3QgcHBwY2FsbGluZm8pCisjZGVmaW5lIFBQUElPQ0JVTkRMRSAgIF9JT1coJ3QnLDEyOSxpbnQpCisjZGVmaW5lIFBQUElPQ0dNUEZMQUdTIF9JT1IoJ3QnLDEzMCxpbnQpCisjZGVmaW5lIFBQUElPQ1NNUEZMQUdTIF9JT1coJ3QnLDEzMSxpbnQpCisjZGVmaW5lIFBQUElPQ1NNUE1UVSAgIF9JT1coJ3QnLDEzMixpbnQpCisjZGVmaW5lIFBQUElPQ1NNUE1SVSAgIF9JT1coJ3QnLDEzMyxpbnQpCisjZGVmaW5lIFBQUElPQ0dDT01QUkVTU09SUyBfSU9SKCd0JywxMzQsdW5zaWduZWQgbG9uZyBbOF0pCisjZGVmaW5lIFBQUElPQ1NDT01QUkVTU09SIF9JT1coJ3QnLDEzNSxpbnQpCisjZGVmaW5lIFBQUElPQ0dJRk5BTUUgICAgICBfSU9SKCd0JywxMzYsIGNoYXIgW0lGTkFNU0laXSApCisKKworI2RlZmluZSBTQ19NUF9QUk9UICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgU0NfUkVKX01QX1BST1QgICAweDAwMDAwNDAwCisjZGVmaW5lIFNDX09VVF9TSE9SVF9TRVEgMHgwMDAwMDgwMAorI2RlZmluZSBTQ19JTl9TSE9SVF9TRVEgIDB4MDAwMDQwMDAKKworI2RlZmluZSBTQ19ERUNPTVBfT04JCTB4MDEKKyNkZWZpbmUgU0NfQ09NUF9PTgkJMHgwMgorI2RlZmluZSBTQ19ERUNPTVBfRElTQ0FSRAkweDA0CisjZGVmaW5lIFNDX0NPTVBfRElTQ0FSRAkJMHgwOAorI2RlZmluZSBTQ19MSU5LX0RFQ09NUF9PTgkweDEwCisjZGVmaW5lIFNDX0xJTktfQ09NUF9PTgkJMHgyMAorI2RlZmluZSBTQ19MSU5LX0RFQ09NUF9ESVNDQVJECTB4NDAKKyNkZWZpbmUgU0NfTElOS19DT01QX0RJU0NBUkQJMHg4MAorCisjZGVmaW5lIElTRE5fUFBQX0NPTVBfTUFYX09QVElPTlMgMTYKKworI2RlZmluZSBJUFBQX0NPTVBfRkxBR19YTUlUIDB4MQorI2RlZmluZSBJUFBQX0NPTVBfRkxBR19MSU5LIDB4MgorCitzdHJ1Y3QgaXNkbl9wcHBfY29tcF9kYXRhIHsKKyAgaW50IG51bTsKKyAgdW5zaWduZWQgY2hhciBvcHRpb25zW0lTRE5fUFBQX0NPTVBfTUFYX09QVElPTlNdOworICBpbnQgb3B0bGVuOworICBpbnQgZmxhZ3M7Cit9OworCisjZW5kaWYgLyogX0xJTlVYX0lTRE5fUFBQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbmlmLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG5pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjFiMGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG5pZi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qICRJZDogaXNkbmlmLmgsdiAxLjQzLjIuMiAyMDA0LzAxLzEyIDIzOjA4OjM1IGtlaWwgRXhwICQKKyAqCisgKiBMaW51eCBJU0ROIHN1YnN5c3RlbQorICogRGVmaW5pdGlvbiBvZiB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIHN1YnN5c3RlbSBhbmQgaXRzIGxvdy1sZXZlbCBkcml2ZXJzLgorICoKKyAqIENvcHlyaWdodCAxOTk0LDk1LDk2IGJ5IEZyaXR6IEVsZmVydCAoZnJpdHpAaXNkbjRsaW51eC5kZSkKKyAqIENvcHlyaWdodCAxOTk1LDk2ICAgIFRoaW5raW5nIE9iamVjdHMgU29mdHdhcmUgR21iSCBXdWVyemJ1cmcKKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0lTRE5JRl9IX18KKyNkZWZpbmUgX19JU0ROSUZfSF9fCisKKworLyoKKyAqIFZhbHVlcyBmb3IgZ2VuZXJhbCBwcm90b2NvbC1zZWxlY3Rpb24KKyAqLworI2RlZmluZSBJU0ROX1BUWVBFX1VOS05PV04gICAwICAgLyogUHJvdG9jb2wgdW5kZWZpbmVkICAgKi8KKyNkZWZpbmUgSVNETl9QVFlQRV8xVFI2ICAgICAgMSAgIC8qIGdlcm1hbiAxVFI2LXByb3RvY29sICovCisjZGVmaW5lIElTRE5fUFRZUEVfRVVSTyAgICAgIDIgICAvKiBFRFNTMS1wcm90b2NvbCAgICAgICAqLworI2RlZmluZSBJU0ROX1BUWVBFX0xFQVNFRCAgICAzICAgLyogZm9yIGxlYXNlZCBsaW5lcyAgICAgKi8KKyNkZWZpbmUgSVNETl9QVFlQRV9OSTEgICAgICAgNCAgIC8qIFVTIE5JLTEgcHJvdG9jb2wgICAgICovCisjZGVmaW5lIElTRE5fUFRZUEVfTUFYICAgICAgIDcgICAvKiBNYXguIDggUHJvdG9jb2xzICAgICAqLworCisvKgorICogVmFsdWVzIGZvciBMYXllci0yLXByb3RvY29sLXNlbGVjdGlvbgorICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfWDc1SSAgIDAgICAvKiBYNzUvTEFQQiB3aXRoIEktRnJhbWVzICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9YNzVVSSAgMSAgIC8qIFg3NS9MQVBCIHdpdGggVUktRnJhbWVzICAgICAgICAgICAqLworI2RlZmluZSBJU0ROX1BST1RPX0wyX1g3NUJVSSAyICAgLyogWDc1L0xBUEIgd2l0aCBVSS1GcmFtZXMgICAgICAgICAgICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfSERMQyAgIDMgICAvKiBIRExDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9UUkFOUyAgNCAgIC8qIFRyYW5zcGFyZW50IChWb2ljZSkgICAgICAgICAgICAgICAqLworI2RlZmluZSBJU0ROX1BST1RPX0wyX1gyNURURSA1ICAgLyogWDI1L0xBUEIgRFRFIG1vZGUgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfWDI1RENFIDYgICAvKiBYMjUvTEFQQiBEQ0UgbW9kZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9WMTEwOTYgNyAgIC8qIFYuMTEwIGJpdHJhdGUgYWRhcHRpb24gOTYwMCBCYXVkICAqLworI2RlZmluZSBJU0ROX1BST1RPX0wyX1YxMTAxOSA4ICAgLyogVi4xMTAgYml0cmF0ZSBhZGFwdGlvbiAxOTIwMCBCYXVkICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfVjExMDM4IDkgICAvKiBWLjExMCBiaXRyYXRlIGFkYXB0aW9uIDM4NDAwIEJhdWQgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9NT0RFTSAgMTAgIC8qIEFuYWxvZyBNb2RlbSBvbiBCb2FyZCAqLworI2RlZmluZSBJU0ROX1BST1RPX0wyX0ZBWCAgICAxMSAgLyogRmF4IEdyb3VwIDIvMyAgICAgICAgICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfSERMQ181NksgMTIgICAvKiBIRExDIDU2ayAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9NQVggICAgMTUgIC8qIE1heC4gMTYgUHJvdG9jb2xzICAgICAgICAgICAgICAgICAqLworCisvKgorICogVmFsdWVzIGZvciBMYXllci0zLXByb3RvY29sLXNlbGVjdGlvbgorICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDNfVFJBTlMJMAkvKiBUcmFuc3BhcmVudCAqLworI2RlZmluZSBJU0ROX1BST1RPX0wzX1RSQU5TRFNQCTEJLyogVHJhbnNwYXJlbnQgd2l0aCBEU1AgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MM19GQ0xBU1MyCTIJLyogRmF4IEdyb3VwIDIvMyBDTEFTUyAyICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDNfRkNMQVNTMQkzCS8qIEZheCBHcm91cCAyLzMgQ0xBU1MgMSAqLworI2RlZmluZSBJU0ROX1BST1RPX0wzX01BWAk3CS8qIE1heC4gOCBQcm90b2NvbHMgKi8KKworCisjZW5kaWYgLyogX19JU0ROSUZfSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzb19mcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc29fZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njg4YWM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc29fZnMuaApAQCAtMCwwICsxLDE2NSBAQAorI2lmbmRlZiBfSVNPRlNfRlNfSAorI2RlZmluZSBfSVNPRlNfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisvKgorICogVGhlIGlzb2ZzIGZpbGVzeXN0ZW0gY29uc3RhbnRzL3N0cnVjdHVyZXMKKyAqLworCisvKiBUaGlzIHBhcnQgYm9ycm93ZWQgZnJvbSB0aGUgYnNkMzg2IGlzb2ZzICovCisjZGVmaW5lIElTT0RDTChmcm9tLCB0bykgKHRvIC0gZnJvbSArIDEpCisKK3N0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgeworCWNoYXIgdHlwZVtJU09EQ0woMSwxKV07IC8qIDcxMSAqLworCWNoYXIgaWRbSVNPRENMKDIsNildOworCWNoYXIgdmVyc2lvbltJU09EQ0woNyw3KV07CisJY2hhciBkYXRhW0lTT0RDTCg4LDIwNDgpXTsKK307CisKKy8qIHZvbHVtZSBkZXNjcmlwdG9yIHR5cGVzICovCisjZGVmaW5lIElTT19WRF9QUklNQVJZIDEKKyNkZWZpbmUgSVNPX1ZEX1NVUFBMRU1FTlRBUlkgMgorI2RlZmluZSBJU09fVkRfRU5EIDI1NQorCisjZGVmaW5lIElTT19TVEFOREFSRF9JRCAiQ0QwMDEiCisKK3N0cnVjdCBpc29fcHJpbWFyeV9kZXNjcmlwdG9yIHsKKwljaGFyIHR5cGUJCQlbSVNPRENMICggIDEsICAgMSldOyAvKiA3MTEgKi8KKwljaGFyIGlkCQkJCVtJU09EQ0wgKCAgMiwgICA2KV07CisJY2hhciB2ZXJzaW9uCQkJW0lTT0RDTCAoICA3LCAgIDcpXTsgLyogNzExICovCisJY2hhciB1bnVzZWQxCQkJW0lTT0RDTCAoICA4LCAgIDgpXTsKKwljaGFyIHN5c3RlbV9pZAkJCVtJU09EQ0wgKCAgOSwgIDQwKV07IC8qIGFjaGFycyAqLworCWNoYXIgdm9sdW1lX2lkCQkJW0lTT0RDTCAoIDQxLCAgNzIpXTsgLyogZGNoYXJzICovCisJY2hhciB1bnVzZWQyCQkJW0lTT0RDTCAoIDczLCAgODApXTsKKwljaGFyIHZvbHVtZV9zcGFjZV9zaXplCQlbSVNPRENMICggODEsICA4OCldOyAvKiA3MzMgKi8KKwljaGFyIHVudXNlZDMJCQlbSVNPRENMICggODksIDEyMCldOworCWNoYXIgdm9sdW1lX3NldF9zaXplCQlbSVNPRENMICgxMjEsIDEyNCldOyAvKiA3MjMgKi8KKwljaGFyIHZvbHVtZV9zZXF1ZW5jZV9udW1iZXIJW0lTT0RDTCAoMTI1LCAxMjgpXTsgLyogNzIzICovCisJY2hhciBsb2dpY2FsX2Jsb2NrX3NpemUJCVtJU09EQ0wgKDEyOSwgMTMyKV07IC8qIDcyMyAqLworCWNoYXIgcGF0aF90YWJsZV9zaXplCQlbSVNPRENMICgxMzMsIDE0MCldOyAvKiA3MzMgKi8KKwljaGFyIHR5cGVfbF9wYXRoX3RhYmxlCQlbSVNPRENMICgxNDEsIDE0NCldOyAvKiA3MzEgKi8KKwljaGFyIG9wdF90eXBlX2xfcGF0aF90YWJsZQlbSVNPRENMICgxNDUsIDE0OCldOyAvKiA3MzEgKi8KKwljaGFyIHR5cGVfbV9wYXRoX3RhYmxlCQlbSVNPRENMICgxNDksIDE1MildOyAvKiA3MzIgKi8KKwljaGFyIG9wdF90eXBlX21fcGF0aF90YWJsZQlbSVNPRENMICgxNTMsIDE1NildOyAvKiA3MzIgKi8KKwljaGFyIHJvb3RfZGlyZWN0b3J5X3JlY29yZAlbSVNPRENMICgxNTcsIDE5MCldOyAvKiA5LjEgKi8KKwljaGFyIHZvbHVtZV9zZXRfaWQJCVtJU09EQ0wgKDE5MSwgMzE4KV07IC8qIGRjaGFycyAqLworCWNoYXIgcHVibGlzaGVyX2lkCQlbSVNPRENMICgzMTksIDQ0NildOyAvKiBhY2hhcnMgKi8KKwljaGFyIHByZXBhcmVyX2lkCQlbSVNPRENMICg0NDcsIDU3NCldOyAvKiBhY2hhcnMgKi8KKwljaGFyIGFwcGxpY2F0aW9uX2lkCQlbSVNPRENMICg1NzUsIDcwMildOyAvKiBhY2hhcnMgKi8KKwljaGFyIGNvcHlyaWdodF9maWxlX2lkCQlbSVNPRENMICg3MDMsIDczOSldOyAvKiA3LjUgZGNoYXJzICovCisJY2hhciBhYnN0cmFjdF9maWxlX2lkCQlbSVNPRENMICg3NDAsIDc3NildOyAvKiA3LjUgZGNoYXJzICovCisJY2hhciBiaWJsaW9ncmFwaGljX2ZpbGVfaWQJW0lTT0RDTCAoNzc3LCA4MTMpXTsgLyogNy41IGRjaGFycyAqLworCWNoYXIgY3JlYXRpb25fZGF0ZQkJW0lTT0RDTCAoODE0LCA4MzApXTsgLyogOC40LjI2LjEgKi8KKwljaGFyIG1vZGlmaWNhdGlvbl9kYXRlCQlbSVNPRENMICg4MzEsIDg0NyldOyAvKiA4LjQuMjYuMSAqLworCWNoYXIgZXhwaXJhdGlvbl9kYXRlCQlbSVNPRENMICg4NDgsIDg2NCldOyAvKiA4LjQuMjYuMSAqLworCWNoYXIgZWZmZWN0aXZlX2RhdGUJCVtJU09EQ0wgKDg2NSwgODgxKV07IC8qIDguNC4yNi4xICovCisJY2hhciBmaWxlX3N0cnVjdHVyZV92ZXJzaW9uCVtJU09EQ0wgKDg4MiwgODgyKV07IC8qIDcxMSAqLworCWNoYXIgdW51c2VkNAkJCVtJU09EQ0wgKDg4MywgODgzKV07CisJY2hhciBhcHBsaWNhdGlvbl9kYXRhCQlbSVNPRENMICg4ODQsIDEzOTUpXTsKKwljaGFyIHVudXNlZDUJCQlbSVNPRENMICgxMzk2LCAyMDQ4KV07Cit9OworCisvKiBBbG1vc3QgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkgZGVzY3JpcHRvciBidXQgdHdvIGZpZWxkcyBhcmUgc3BlY2lmaWVkICovCitzdHJ1Y3QgaXNvX3N1cHBsZW1lbnRhcnlfZGVzY3JpcHRvciB7CisJY2hhciB0eXBlCQkJW0lTT0RDTCAoICAxLCAgIDEpXTsgLyogNzExICovCisJY2hhciBpZAkJCQlbSVNPRENMICggIDIsICAgNildOworCWNoYXIgdmVyc2lvbgkJCVtJU09EQ0wgKCAgNywgICA3KV07IC8qIDcxMSAqLworCWNoYXIgZmxhZ3MJCQlbSVNPRENMICggIDgsICAgOCldOyAvKiA4NTMgKi8KKwljaGFyIHN5c3RlbV9pZAkJCVtJU09EQ0wgKCAgOSwgIDQwKV07IC8qIGFjaGFycyAqLworCWNoYXIgdm9sdW1lX2lkCQkJW0lTT0RDTCAoIDQxLCAgNzIpXTsgLyogZGNoYXJzICovCisJY2hhciB1bnVzZWQyCQkJW0lTT0RDTCAoIDczLCAgODApXTsKKwljaGFyIHZvbHVtZV9zcGFjZV9zaXplCQlbSVNPRENMICggODEsICA4OCldOyAvKiA3MzMgKi8KKwljaGFyIGVzY2FwZQkJCVtJU09EQ0wgKCA4OSwgMTIwKV07IC8qIDg1NiAqLworCWNoYXIgdm9sdW1lX3NldF9zaXplCQlbSVNPRENMICgxMjEsIDEyNCldOyAvKiA3MjMgKi8KKwljaGFyIHZvbHVtZV9zZXF1ZW5jZV9udW1iZXIJW0lTT0RDTCAoMTI1LCAxMjgpXTsgLyogNzIzICovCisJY2hhciBsb2dpY2FsX2Jsb2NrX3NpemUJCVtJU09EQ0wgKDEyOSwgMTMyKV07IC8qIDcyMyAqLworCWNoYXIgcGF0aF90YWJsZV9zaXplCQlbSVNPRENMICgxMzMsIDE0MCldOyAvKiA3MzMgKi8KKwljaGFyIHR5cGVfbF9wYXRoX3RhYmxlCQlbSVNPRENMICgxNDEsIDE0NCldOyAvKiA3MzEgKi8KKwljaGFyIG9wdF90eXBlX2xfcGF0aF90YWJsZQlbSVNPRENMICgxNDUsIDE0OCldOyAvKiA3MzEgKi8KKwljaGFyIHR5cGVfbV9wYXRoX3RhYmxlCQlbSVNPRENMICgxNDksIDE1MildOyAvKiA3MzIgKi8KKwljaGFyIG9wdF90eXBlX21fcGF0aF90YWJsZQlbSVNPRENMICgxNTMsIDE1NildOyAvKiA3MzIgKi8KKwljaGFyIHJvb3RfZGlyZWN0b3J5X3JlY29yZAlbSVNPRENMICgxNTcsIDE5MCldOyAvKiA5LjEgKi8KKwljaGFyIHZvbHVtZV9zZXRfaWQJCVtJU09EQ0wgKDE5MSwgMzE4KV07IC8qIGRjaGFycyAqLworCWNoYXIgcHVibGlzaGVyX2lkCQlbSVNPRENMICgzMTksIDQ0NildOyAvKiBhY2hhcnMgKi8KKwljaGFyIHByZXBhcmVyX2lkCQlbSVNPRENMICg0NDcsIDU3NCldOyAvKiBhY2hhcnMgKi8KKwljaGFyIGFwcGxpY2F0aW9uX2lkCQlbSVNPRENMICg1NzUsIDcwMildOyAvKiBhY2hhcnMgKi8KKwljaGFyIGNvcHlyaWdodF9maWxlX2lkCQlbSVNPRENMICg3MDMsIDczOSldOyAvKiA3LjUgZGNoYXJzICovCisJY2hhciBhYnN0cmFjdF9maWxlX2lkCQlbSVNPRENMICg3NDAsIDc3NildOyAvKiA3LjUgZGNoYXJzICovCisJY2hhciBiaWJsaW9ncmFwaGljX2ZpbGVfaWQJW0lTT0RDTCAoNzc3LCA4MTMpXTsgLyogNy41IGRjaGFycyAqLworCWNoYXIgY3JlYXRpb25fZGF0ZQkJW0lTT0RDTCAoODE0LCA4MzApXTsgLyogOC40LjI2LjEgKi8KKwljaGFyIG1vZGlmaWNhdGlvbl9kYXRlCQlbSVNPRENMICg4MzEsIDg0NyldOyAvKiA4LjQuMjYuMSAqLworCWNoYXIgZXhwaXJhdGlvbl9kYXRlCQlbSVNPRENMICg4NDgsIDg2NCldOyAvKiA4LjQuMjYuMSAqLworCWNoYXIgZWZmZWN0aXZlX2RhdGUJCVtJU09EQ0wgKDg2NSwgODgxKV07IC8qIDguNC4yNi4xICovCisJY2hhciBmaWxlX3N0cnVjdHVyZV92ZXJzaW9uCVtJU09EQ0wgKDg4MiwgODgyKV07IC8qIDcxMSAqLworCWNoYXIgdW51c2VkNAkJCVtJU09EQ0wgKDg4MywgODgzKV07CisJY2hhciBhcHBsaWNhdGlvbl9kYXRhCQlbSVNPRENMICg4ODQsIDEzOTUpXTsKKwljaGFyIHVudXNlZDUJCQlbSVNPRENMICgxMzk2LCAyMDQ4KV07Cit9OworCisKKyNkZWZpbmUgSFNfU1RBTkRBUkRfSUQgIkNEUk9NIgorCitzdHJ1Y3QgIGhzX3ZvbHVtZV9kZXNjcmlwdG9yIHsKKwljaGFyIGZvbwkJCVtJU09EQ0wgKCAgMSwgICA4KV07IC8qIDczMyAqLworCWNoYXIgdHlwZQkJCVtJU09EQ0wgKCAgOSwgICA5KV07IC8qIDcxMSAqLworCWNoYXIgaWQJCQkJW0lTT0RDTCAoIDEwLCAgMTQpXTsKKwljaGFyIHZlcnNpb24JCQlbSVNPRENMICggMTUsICAxNSldOyAvKiA3MTEgKi8KKwljaGFyIGRhdGFbSVNPRENMKDE2LDIwNDgpXTsKK307CisKKworc3RydWN0IGhzX3ByaW1hcnlfZGVzY3JpcHRvciB7CisJY2hhciBmb28JCQlbSVNPRENMICggIDEsICAgOCldOyAvKiA3MzMgKi8KKwljaGFyIHR5cGUJCQlbSVNPRENMICggIDksICAgOSldOyAvKiA3MTEgKi8KKwljaGFyIGlkCQkJCVtJU09EQ0wgKCAxMCwgIDE0KV07CisJY2hhciB2ZXJzaW9uCQkJW0lTT0RDTCAoIDE1LCAgMTUpXTsgLyogNzExICovCisJY2hhciB1bnVzZWQxCQkJW0lTT0RDTCAoIDE2LCAgMTYpXTsgLyogNzExICovCisJY2hhciBzeXN0ZW1faWQJCQlbSVNPRENMICggMTcsICA0OCldOyAvKiBhY2hhcnMgKi8KKwljaGFyIHZvbHVtZV9pZAkJCVtJU09EQ0wgKCA0OSwgIDgwKV07IC8qIGRjaGFycyAqLworCWNoYXIgdW51c2VkMgkJCVtJU09EQ0wgKCA4MSwgIDg4KV07IC8qIDczMyAqLworCWNoYXIgdm9sdW1lX3NwYWNlX3NpemUJCVtJU09EQ0wgKCA4OSwgIDk2KV07IC8qIDczMyAqLworCWNoYXIgdW51c2VkMwkJCVtJU09EQ0wgKCA5NywgMTI4KV07IC8qIDczMyAqLworCWNoYXIgdm9sdW1lX3NldF9zaXplCQlbSVNPRENMICgxMjksIDEzMildOyAvKiA3MjMgKi8KKwljaGFyIHZvbHVtZV9zZXF1ZW5jZV9udW1iZXIJW0lTT0RDTCAoMTMzLCAxMzYpXTsgLyogNzIzICovCisJY2hhciBsb2dpY2FsX2Jsb2NrX3NpemUJCVtJU09EQ0wgKDEzNywgMTQwKV07IC8qIDcyMyAqLworCWNoYXIgcGF0aF90YWJsZV9zaXplCQlbSVNPRENMICgxNDEsIDE0OCldOyAvKiA3MzMgKi8KKwljaGFyIHR5cGVfbF9wYXRoX3RhYmxlCQlbSVNPRENMICgxNDksIDE1MildOyAvKiA3MzEgKi8KKwljaGFyIHVudXNlZDQJCQlbSVNPRENMICgxNTMsIDE4MCldOyAvKiA3MzMgKi8KKwljaGFyIHJvb3RfZGlyZWN0b3J5X3JlY29yZAlbSVNPRENMICgxODEsIDIxNCldOyAvKiA5LjEgKi8KK307CisKKy8qIFdlIHVzZSB0aGlzIHRvIGhlbHAgdXMgbG9vayB1cCB0aGUgcGFyZW50IGlub2RlIG51bWJlcnMuICovCisKK3N0cnVjdCBpc29fcGF0aF90YWJsZXsKKwl1bnNpZ25lZCBjaGFyICBuYW1lX2xlblsyXTsJLyogNzIxICovCisJY2hhciBleHRlbnRbNF07CQkvKiA3MzEgKi8KKwljaGFyICBwYXJlbnRbMl07CS8qIDcyMSAqLworCWNoYXIgbmFtZVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIGhpZ2ggc2llcnJhIGlzIGlkZW50aWNhbCB0byBpc28sIGV4Y2VwdCB0aGF0IHRoZSBkYXRlIGlzIG9ubHkgNiBieXRlcywgYW5kCisgICB0aGVyZSBpcyBhbiBleHRyYSByZXNlcnZlZCBieXRlIGFmdGVyIHRoZSBmbGFncyAqLworCitzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgeworCWNoYXIgbGVuZ3RoCQkJW0lTT0RDTCAoMSwgMSldOyAvKiA3MTEgKi8KKwljaGFyIGV4dF9hdHRyX2xlbmd0aAkJW0lTT0RDTCAoMiwgMildOyAvKiA3MTEgKi8KKwljaGFyIGV4dGVudAkJCVtJU09EQ0wgKDMsIDEwKV07IC8qIDczMyAqLworCWNoYXIgc2l6ZQkJCVtJU09EQ0wgKDExLCAxOCldOyAvKiA3MzMgKi8KKwljaGFyIGRhdGUJCQlbSVNPRENMICgxOSwgMjUpXTsgLyogNyBieSA3MTEgKi8KKwljaGFyIGZsYWdzCQkJW0lTT0RDTCAoMjYsIDI2KV07CisJY2hhciBmaWxlX3VuaXRfc2l6ZQkJW0lTT0RDTCAoMjcsIDI3KV07IC8qIDcxMSAqLworCWNoYXIgaW50ZXJsZWF2ZQkJCVtJU09EQ0wgKDI4LCAyOCldOyAvKiA3MTEgKi8KKwljaGFyIHZvbHVtZV9zZXF1ZW5jZV9udW1iZXIJW0lTT0RDTCAoMjksIDMyKV07IC8qIDcyMyAqLworCXVuc2lnbmVkIGNoYXIgbmFtZV9sZW4JCVtJU09EQ0wgKDMzLCAzMyldOyAvKiA3MTEgKi8KKwljaGFyIG5hbWUJCQlbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIElTT0ZTX0JMT0NLX0JJVFMgMTEKKyNkZWZpbmUgSVNPRlNfQkxPQ0tfU0laRSAyMDQ4CisKKyNkZWZpbmUgSVNPRlNfQlVGRkVSX1NJWkUoSU5PREUpICgoSU5PREUpLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKKyNkZWZpbmUgSVNPRlNfQlVGRkVSX0JJVFMoSU5PREUpICgoSU5PREUpLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKQorCisjZW5kaWYgLyogX0lTT0ZTX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXZ0di5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pdnR2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzY2U4NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXZ0di5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgICAgUHVibGljIGl2dHYgQVBJIGhlYWRlcgorICAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0ICBLZXZpbiBUaGF5ZXIgPG51ZmFuX3dmayBhdCB5YWhvby5jb20+CisgICAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19MSU5VWF9JVlRWX0hfXworI2RlZmluZSBfX0xJTlVYX0lWVFZfSF9fCisKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKy8qIGl2dHYga25vd3Mgc2V2ZXJhbCBkaXN0aW5jdCBvdXRwdXQgbW9kZXM6IE1QRUcgc3RyZWFtaW5nLAorICAgWVVWIHN0cmVhbWluZywgWVVWIHVwZGF0ZXMgdGhyb3VnaCB1c2VyIERNQSBhbmQgdGhlIHBhc3N0aHJvdWdoCisgICBtb2RlLgorCisgICBJbiBvcmRlciB0byBjbGVhcmx5IHRlbGwgdGhlIGRyaXZlciB0aGF0IHdlIGFyZSBpbiB1c2VyIERNQQorICAgWVVWIG1vZGUgeW91IG5lZWQgdG8gY2FsbCBJVlRWX0lPQ19ETUFfRlJBTUUgd2l0aCB5X3NvdXJjZSA9PSBOVUxMCisgICBmaXJzdCAoYWx0aHJvdWdoIGlmIHlvdSBkb24ndCB0aGVuIHRoZSBmaXJzdCB0aW1lCisgICBETUFfRlJBTUUgaXMgY2FsbGVkIHRoZSBtb2RlIHN3aXRjaCBpcyBkb25lIGF1dG9tYXRpY2FsbHkpLgorCisgICBXaGVuIHlvdSBjbG9zZSB0aGUgZmlsZSBoYW5kbGUgdGhlIHVzZXIgRE1BIG1vZGUgaXMgZXhpdGVkIGFnYWluLgorCisgICBXaGlsZSBpbiBvbmUgbW9kZSwgeW91IGNhbm5vdCB1c2UgYW5vdGhlciBtb2RlIChFQlVTWSBpcyByZXR1cm5lZCkuCisKKyAgIEFsbCB0aGlzIG1lYW5zIHRoYXQgaWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSBZVVYgaW50ZXJsYWNpbmcKKyAgIGZvciB0aGUgdXNlciBETUEgWVVWIG1vZGUgeW91IGZpcnN0IG5lZWQgdG8gZG8gY2FsbCBJVlRWX0lPQ19ETUFfRlJBTUUKKyAgIHdpdGggeV9zb3VyY2UgPT0gTlVMTCBiZWZvcmUgeW91IGNhbiBzZXQgdGhlIGNvcnJlY3QgZm9ybWF0IHVzaW5nCisgICBWSURJT0NfU19GTVQuCisKKyAgIEV2ZW50dWFsbHkgYWxsIHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggYSBwcm9wZXIgVjRMMiBBUEksCisgICBidXQgZm9yIG5vdyB3ZSBoYXZlIHRvIGRvIGl0IHRoaXMgd2F5LiAqLworCitzdHJ1Y3QgaXZ0dl9kbWFfZnJhbWUgeworCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlOyAvKiBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAqLworCV9fdTMyIHBpeGVsZm9ybWF0OwkgLyogMCA9PSBzYW1lIGFzIGRlc3RpbmF0aW9uICovCisJdm9pZCAqeV9zb3VyY2U7ICAgLyogaWYgTlVMTCBhbmQgdHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwKKwkJCQkgICAgdGhlbiBqdXN0IHN3aXRjaCB0byB1c2VyIERNQSBZVVYgb3V0cHV0IG1vZGUgKi8KKwl2b2lkICp1dl9zb3VyY2U7ICAvKiBVbnVzZWQgZm9yIFJHQiBwaXhlbGZvcm1hdHMgKi8KKwlzdHJ1Y3QgdjRsMl9yZWN0IHNyYzsKKwlzdHJ1Y3QgdjRsMl9yZWN0IGRzdDsKKwlfX3UzMiBzcmNfd2lkdGg7CisJX191MzIgc3JjX2hlaWdodDsKK307CisKKyNkZWZpbmUgSVZUVl9JT0NfRE1BX0ZSQU1FICBfSU9XICgnVicsIEJBU0VfVklESU9DX1BSSVZBVEUrMCwgc3RydWN0IGl2dHZfZG1hX2ZyYW1lKQorCisvKiBEZXByZWNhdGVkIGRlZmluZXM6IGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSBkZWZpbmVzIGZyb20gdmlkZW9kZXYyLmggKi8KKyNkZWZpbmUgSVZUVl9TTElDRURfVFlQRV9URUxFVEVYVF9CICAgICBWNEwyX01QRUdfVkJJX0lWVFZfVEVMRVRFWFRfQgorI2RlZmluZSBJVlRWX1NMSUNFRF9UWVBFX0NBUFRJT05fNTI1ICAgIFY0TDJfTVBFR19WQklfSVZUVl9DQVBUSU9OXzUyNQorI2RlZmluZSBJVlRWX1NMSUNFRF9UWVBFX1dTU182MjUgICAgICAgIFY0TDJfTVBFR19WQklfSVZUVl9XU1NfNjI1CisjZGVmaW5lIElWVFZfU0xJQ0VEX1RZUEVfVlBTICAgICAgICAgICAgVjRMMl9NUEVHX1ZCSV9JVlRWX1ZQUworCisjZW5kaWYgLyogX0xJTlVYX0lWVFZfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pdnR2ZmIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXZ0dmZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlYWY0ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXZ0dmZiLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAgICBPbiBTY3JlZW4gRGlzcGxheSBjeDIzNDE1IEZyYW1lYnVmZmVyIGRyaXZlcgorCisgICAgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3ICBJYW4gQXJtc3Ryb25nIDxpYW5AaWFybXN0LmRlbW9uLmNvLnVrPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19MSU5VWF9JVlRWRkJfSF9fCisjZGVmaW5lIF9fTElOVVhfSVZUVkZCX0hfXworCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBGcmFtZWJ1ZmZlciBleHRlcm5hbCBBUEkgKi8KKworc3RydWN0IGl2dHZmYl9kbWFfZnJhbWUgeworCXZvaWQgKnNvdXJjZTsKKwl1bnNpZ25lZCBsb25nIGRlc3Rfb2Zmc2V0OworCWludCBjb3VudDsKK307CisKKyNkZWZpbmUgSVZUVkZCX0lPQ19ETUFfRlJBTUUgCV9JT1coJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFKzAsIHN0cnVjdCBpdnR2ZmJfZG1hX2ZyYW1lKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXhqdXNlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9peGp1c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4MjlmOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXhqdXNlci5oCkBAIC0wLDAgKzEsNzIwIEBACisjaWZuZGVmIF9fTElOVVhfSVhKVVNFUl9ICisjZGVmaW5lIF9fTElOVVhfSVhKVVNFUl9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICBpeGp1c2VyLmgKKyAqCisgKiBEZXZpY2UgRHJpdmVyIGZvciBRdWlja25ldCBUZWNobm9sb2dpZXMsIEluYy4ncyBUZWxlcGhvbnkgY2FyZHMKKyAqIGluY2x1ZGluZyB0aGUgSW50ZXJuZXQgUGhvbmVKQUNLLCBJbnRlcm5ldCBQaG9uZUpBQ0sgTGl0ZSwKKyAqIEludGVybmV0IFBob25lSkFDSyBQQ0ksIEludGVybmV0IExpbmVKQUNLLCBJbnRlcm5ldCBQaG9uZUNBUkQgYW5kCisgKiBTbWFydENBQkxFCisgKgorICogICAgKGMpIENvcHlyaWdodCAxOTk5LTIwMDEgIFF1aWNrbmV0IFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yOiAgICAgICAgICBFZCBPa2Vyc29uLCA8ZW9rZXJzb25AcXVpY2tuZXQubmV0PgorICogICAgCisgKiBDb250cmlidXRvcnM6ICAgIEdyZWcgSGVybGVpbiwgPGdoZXJsZWluQHF1aWNrbmV0Lm5ldD4KKyAqICAgICAgICAgICAgICAgICAgRGF2aWQgVy4gRXJoYXJ0LCA8ZGVyaGFydEBxdWlja25ldC5uZXQ+CisgKiAgICAgICAgICAgICAgICAgIEpvaG4gU2VsbGVycywgPGpzZWxsZXJzQHF1aWNrbmV0Lm5ldD4KKyAqICAgICAgICAgICAgICAgICAgTWlrZSBQcmVzdG9uLCA8bXByZXN0b25AcXVpY2tuZXQubmV0PgorICoKKyAqIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGhhcmR3YXJlIHJlbGF0ZWQgdG8gdGhpcyBkcml2ZXIgY2FuIGJlIGZvdW5kCisgKiBhdCBvdXIgd2Vic2l0ZTogICAgaHR0cDovL3d3dy5xdWlja25ldC5uZXQKKyAqCisgKiBGaXhlczoKKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBRVUlDS05FVCBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFIFRPIEFOWSBQQVJUWSBGT1IKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTiwgRVZFTiBJRiBRVUlDS05FVAorICogVEVDSE5PTE9HSUVTLCBJTkMuSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogUVVJQ0tORVQgVEVDSE5PTE9HSUVTLCBJTkMuIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMKKyAqIE9OIEFOICJBUyBJUyIgQkFTSVMsIEFORCBRVUlDS05FVCBURUNITk9MT0dJRVMsIElOQy4gSEFTIE5PIE9CTElHQVRJT04gCisgKiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLCBTVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsIE9SIE1PRElGSUNBVElPTlMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvdGVsZXBob255Lmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBJT0NUTCdzIHVzZWQgZm9yIHRoZSBRdWlja25ldCBUZWxlcGhvbnkgQ2FyZHMKKyoKKyogSWYgeW91IHVzZSB0aGUgSVhKQ1RMX1RFU1RSQU0gY29tbWFuZCwgdGhlIGNhcmQgbXVzdCBiZSBwb3dlciBjeWNsZWQgdG8KKyogcmVzZXQgdGhlIFNSQU0gdmFsdWVzIGJlZm9yZSBmdXJ0aGVyIHVzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJWEpDVExfRFNQX1JFU0VUIAkJX0lPICAoJ3EnLCAweEMwKQorCisjZGVmaW5lIElYSkNUTF9SSU5HICAgICAgICAgICAgICAgICAgICAgUEhPTkVfUklORworI2RlZmluZSBJWEpDVExfSE9PS1NUQVRFICAgICAgICAgICAgICAgIFBIT05FX0hPT0tTVEFURQorI2RlZmluZSBJWEpDVExfTUFYUklOR1MJCQlQSE9ORV9NQVhSSU5HUworI2RlZmluZSBJWEpDVExfUklOR19DQURFTkNFCQlQSE9ORV9SSU5HX0NBREVOQ0UKKyNkZWZpbmUgSVhKQ1RMX1JJTkdfU1RBUlQJCVBIT05FX1JJTkdfU1RBUlQKKyNkZWZpbmUgSVhKQ1RMX1JJTkdfU1RPUAkJUEhPTkVfUklOR19TVE9QCisKKyNkZWZpbmUgSVhKQ1RMX0NBUkRUWVBFCQkJX0lPUiAoJ3EnLCAweEMxLCBpbnQpCisjZGVmaW5lIElYSkNUTF9TRVJJQUwJCQlfSU9SICgncScsIDB4QzIsIGludCkKKyNkZWZpbmUgSVhKQ1RMX0RTUF9UWVBFICAgICAgICAgICAgICAgICBfSU9SICgncScsIDB4QzMsIGludCkKKyNkZWZpbmUgSVhKQ1RMX0RTUF9WRVJTSU9OICAgICAgICAgICAgICBfSU9SICgncScsIDB4QzQsIGludCkKKyNkZWZpbmUgSVhKQ1RMX1ZFUlNJT04gICAgICAgICAgICAgIAlfSU9SICgncScsIDB4REEsIGNoYXIgKikKKyNkZWZpbmUgSVhKQ1RMX0RTUF9JRExFCQkJX0lPICAoJ3EnLCAweEM1KQorI2RlZmluZSBJWEpDVExfVEVTVFJBTQkJCV9JTyAgKCdxJywgMHhDNikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGlzIGdyb3VwIG9mIElPQ1RMcyBkZWFsIHdpdGggdGhlIHJlY29yZCBzZXR0aW5ncyBvZiB0aGUgRFNQCisqCisqIFRoZSBJWEpDVExfUkVDX0RFUFRIIGNvbW1hbmQgc2V0cyB0aGUgaW50ZXJuYWwgYnVmZmVyIGRlcHRoIG9mIHRoZSBEU1AuCisqIFNldHRpbmcgYSBsb3dlciBkZXB0aCByZWR1Y2VzIGxhdGVuY3ksIGJ1dCBpbmNyZWFzZXMgdGhlIGRlbWFuZCBvZiB0aGUKKyogYXBwbGljYXRpb24gdG8gc2VydmljZSB0aGUgZHJpdmVyIHdpdGhvdXQgZnJhbWUgbG9zcy4gIFRoZSBEU1AgaGFzIDQ4MAorKiBieXRlcyBvZiBwaHlzaWNhbCBidWZmZXIgbWVtb3J5IGZvciB0aGUgcmVjb3JkIGNoYW5uZWwgc28gdGhlIHRydWUKKyogbWF4aW11bSBsaW1pdCBpcyBkZXRlcm1pbmVkIGJ5IGhvdyBtYW55IGZyYW1lcyB3aWxsIGZpdCBpbiB0aGUgYnVmZmVyLgorKgorKiAxIHVuY29tcHJlc3NlZCAoNDgwIGJ5dGUpIDE2LWJpdCBsaW5lYXIgZnJhbWUuCisqIDIgdW5jb21wcmVzc2VkICgyNDAgYnl0ZSkgOC1iaXQgQS1sYXcvbXUtbGF3IGZyYW1lcy4KKyogMTUgVHJ1ZVNwZWVjaCA4LjUgZnJhbWVzLgorKiAyMCBUcnVlU3BlZWNoIDYuMyw1LjMsNC44IG9yIDQuMSBmcmFtZXMuCisqCisqIFRoZSBkZWZhdWx0IGluIHRoZSBkcml2ZXIgaXMgY3VycmVudGx5IHNldCB0byAyIGZyYW1lcy4KKyoKKyogVGhlIElYSkNUTF9SRUNfVk9MVU1FIGFuZCBJWEpDVExfUExBWV9WT0xVTUUgY29tbWFuZHMgYm90aCB1c2UgYSBROAorKiBudW1iZXIgYXMgYSBwYXJhbWV0ZXIsIDB4MTAwIHNjYWxlcyB0aGUgc2lnbmFsIGJ5IDEuMCwgMHgyMDAgc2NhbGVzIHRoZQorKiBzaWduYWwgYnkgMi4wLCAweDgwIHNjYWxlcyB0aGUgc2lnbmFsIGJ5IDAuNS4gIE5vIHByb3RlY3Rpb24gaXMgZ2l2ZW4KKyogYWdhaW5zdCBvdmVyLXNjYWxpbmcsIGlmIHRoZSBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgdGltZXMgdGhlIGlucHV0CisqIHNpZ25hbCBleGNlZWRzIDE2IGJpdHMsIG92ZXJmbG93IGRpc3RvcnRpb24gd2lsbCBvY2N1ci4gIFRoZSBkZWZhdWx0CisqIHNldHRpbmcgaXMgMHgxMDAgKDEuMCkuCisqCisqIFRoZSBJWEpDVExfUkVDX0xFVkVMIHJldHVybnMgdGhlIGF2ZXJhZ2Ugc2lnbmFsIGxldmVsIChub3Qgci5tLnMuKSBvbgorKiB0aGUgbW9zdCByZWNlbnRseSByZWNvcmRlZCBmcmFtZSBhcyBhIDE2IGJpdCB2YWx1ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJWEpDVExfUkVDX0NPREVDICAgICAgICAgICAgICAgIFBIT05FX1JFQ19DT0RFQworI2RlZmluZSBJWEpDVExfUkVDX1NUQVJUICAgICAgICAgICAgICAgIFBIT05FX1JFQ19TVEFSVAorI2RlZmluZSBJWEpDVExfUkVDX1NUT1AgICAgICAgICAgICAgICAgIFBIT05FX1JFQ19TVE9QCisjZGVmaW5lIElYSkNUTF9SRUNfREVQVEgJCVBIT05FX1JFQ19ERVBUSAorI2RlZmluZSBJWEpDVExfRlJBTUUJCQlQSE9ORV9GUkFNRQorI2RlZmluZSBJWEpDVExfUkVDX1ZPTFVNRQkJUEhPTkVfUkVDX1ZPTFVNRQorI2RlZmluZSBJWEpDVExfUkVDX0xFVkVMCQlQSE9ORV9SRUNfTEVWRUwKKwordHlwZWRlZiBlbnVtIHsKKwlmMzAwXzY0MCA9IDQsIGYzMDBfNTAwLCBmMTEwMCwgZjM1MCwgZjQwMCwgZjQ4MCwgZjQ0MCwgZjYyMCwgZjIwXzUwLAorCWYxMzNfMjAwLCBmMzAwLCBmMzAwXzQyMCwgZjMzMCwgZjMwMF80MjUsIGYzMzBfNDQwLCBmMzQwLCBmMzUwXzQwMCwKKwlmMzUwXzQ0MCwgZjM1MF80NTAsIGYzNjAsIGYzODBfNDIwLCBmMzkyLCBmNDAwXzQyNSwgZjQwMF80NDAsIGY0MDBfNDUwLAorCWY0MjAsIGY0MjUsIGY0MjVfNDUwLCBmNDI1XzQ3NSwgZjQzNSwgZjQ0MF80NTAsIGY0NDBfNDgwLCBmNDQ1LCBmNDUwLAorCWY0NTIsIGY0NzUsIGY0ODBfNjIwLCBmNDk0LCBmNTAwLCBmNTIwLCBmNTIzLCBmNTI1LCBmNTQwXzY2MCwgZjU4NywKKwlmNTkwLCBmNjAwLCBmNjYwLCBmNzAwLCBmNzQwLCBmNzUwLCBmNzUwXzE0NTAsIGY3NzAsIGY4MDAsIGY4MTYsIGY4NTAsCisJZjg1N18xNjQ1LCBmOTAwLCBmOTAwXzEzMDAsIGY5MzVfMTIxNSwgZjk0MV8xNDc3LCBmOTQyLCBmOTUwLCBmOTUwXzE0MDAsCisJZjk3NSwgZjEwMDAsIGYxMDIwLCBmMTA1MCwgZjExMDBfMTc1MCwgZjExNDAsIGYxMjAwLCBmMTIwOSwgZjEzMzAsIGYxMzM2LAorCWxmMTM2NiwgZjEzODAsIGYxNDAwLCBmMTQ3NywgZjE2MDAsIGYxNjMzXzE2MzgsIGYxODAwLCBmMTg2MAorfSBJWEpfRklMVEVSX0ZSRVE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgZmlsdGVyOworCUlYSl9GSUxURVJfRlJFUSBmcmVxOworCWNoYXIgZW5hYmxlOworfSBJWEpfRklMVEVSOworCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciBlbmFibGU7CisJY2hhciBlbl9maWx0ZXI7CisJdW5zaWduZWQgaW50IGZpbHRlcjsKKwl1bnNpZ25lZCBpbnQgb24xOworCXVuc2lnbmVkIGludCBvZmYxOworCXVuc2lnbmVkIGludCBvbjI7CisJdW5zaWduZWQgaW50IG9mZjI7CisJdW5zaWduZWQgaW50IG9uMzsKKwl1bnNpZ25lZCBpbnQgb2ZmMzsKK30gSVhKX0ZJTFRFUl9DQURFTkNFOworCisjZGVmaW5lIElYSkNUTF9TRVRfRklMVEVSCQlfSU9XICgncScsIDB4QzcsIElYSl9GSUxURVIgKikKKyNkZWZpbmUgSVhKQ1RMX1NFVF9GSUxURVJfUkFXCQlfSU9XICgncScsIDB4REQsIElYSl9GSUxURVJfUkFXICopCisjZGVmaW5lIElYSkNUTF9HRVRfRklMVEVSX0hJU1QJCV9JT1cgKCdxJywgMHhDOCwgaW50KQorI2RlZmluZSBJWEpDVExfRklMVEVSX0NBREVOQ0UJCV9JT1cgKCdxJywgMHhENiwgSVhKX0ZJTFRFUl9DQURFTkNFICopCisjZGVmaW5lIElYSkNUTF9QTEFZX0NJRAkJCV9JTyAgKCdxJywgMHhENykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogVGhpcyBJT0NUTCBhbGxvd3MgeW91IHRvIHJlYXNzaWduIHZhbHVlcyBpbiB0aGUgdG9uZSBpbmRleCB0YWJsZS4gIFRoZQorKiB0b25lIHRhYmxlIGhhcyAzMiBlbnRyaWVzICgwIC0gMzEpLCBidXQgdGhlIGRyaXZlciBvbmx5IGFsbG93cyBlbnRyaWVzCisqIDEzIC0gMjcgdG8gYmUgbW9kaWZpZWQsIGVudHJ5IDAgaXMgcmVzZXJ2ZWQgZm9yIHNpbGVuY2UgYW5kIDEgLSAxMiBhcmUKKyogdGhlIHN0YW5kYXJkIERUTUYgZGlnaXRzIGFuZCAyOCAtIDMxIGFyZSB0aGUgRFRNRiB0b25lcyBmb3IgQSwgQiwgQyAmIEQuCisqIFRoZSBwb3NpdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGZvciBDYWxsIFByb2dyZXNzIFRvbmVzIGFyZSBhcyBmb2xsb3dzOgorKiAgICBEaWFsIFRvbmUgICAtIDI1CisqICAgIFJpbmcgQmFjayAgIC0gMjYKKyogICAgQnVzeSBTaWduYWwgLSAyNworKgorKiBUaGUgZnJlcSB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQgYXM6CisqIGZyZXEgPSBjb3MoMiAqIFBJICogZnJlcXVlbmN5IC8gODAwMCkKKyoKKyogVGhlIG1vc3QgY29tbW9ubHkgbmVlZGVkIHZhbHVlcyBhcmUgYWxyZWFkeSBjYWxjdWxhdGVkIGFuZCBsaXN0ZWQgaW4gdGhlCisqIGVudW0gSVhKX1RPTkVfRlJFUS4gIEVhY2ggdG9uZSBpbmRleCBjYW4gaGF2ZSB0d28gZnJlcXVlbmNpZXMgd2l0aAorKiBkaWZmZXJlbnQgZ2FpbnMsIGlmIHlvdSBhcmUgb25seSB1c2luZyBhIHNpbmdsZSBmcmVxdWVuY3kgc2V0IHRoZSB1bnVzZWQKKyogb25lIHRvIDAuCisqCisqIFRoZSBnYWluIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMTUgaW5kaWNhdGluZyArNmRCIHRvIC0yNGRCIGluIDJkQgorKiBpbmNyZW1lbnRzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGVudW0geworCWh6MjAgPSAweDdmZmEsCisJaHo1MCA9IDB4N2ZlNSwKKwloejEzMyA9IDB4N2Y0YywKKwloejIwMCA9IDB4N2U2YiwKKwloejI2MSA9IDB4N2Q1MCwJCS8qIC42MyBDMSAgKi8KKwloejI3NyA9IDB4N2NmYSwJCS8qIC4xOCBDUzEgKi8KKwloejI5MyA9IDB4N2M5ZiwJCS8qIC42NiBEMSAgKi8KKwloejMwMCA9IDB4N2M3NSwKKwloejMxMSA9IDB4N2MzMiwJCS8qIC4xMyBEUzEgKi8KKwloejMyOSA9IDB4N2JiZiwJCS8qIC42MyBFMSAgKi8KKwloejMzMCA9IDB4N2JiOCwKKwloejM0MCA9IDB4N2I3NSwKKwloejM0OSA9IDB4N2IzNywJCS8qIC4yMyBGMSAgKi8KKwloejM1MCA9IDB4N2IzMCwKKwloejM2MCA9IDB4N2FlOSwKKwloejM2OSA9IDB4N2FhOCwJCS8qIC45OSBGUzEgKi8KKwloejM4MCA9IDB4N2E1NiwKKwloejM5MiA9IDB4NzlmYSwJCS8qIC4wMCBHMSAgKi8KKwloejQwMCA9IDB4NzliYiwKKwloejQxNSA9IDB4Nzk0MSwJCS8qIC4zMCBHUzEgKi8KKwloejQyMCA9IDB4NzkxOCwKKwloejQyNSA9IDB4NzhlZSwKKwloejQzNSA9IDB4Nzg5OSwKKwloejQ0MCA9IDB4Nzg2ZCwJCS8qIC4wMCBBMSAgKi8KKwloejQ0NSA9IDB4Nzg0MiwKKwloejQ1MCA9IDB4NzgxNSwKKwloejQ1MiA9IDB4NzgwMywKKwloejQ2NiA9IDB4Nzc4NCwJCS8qIC4xNiBBUzEgKi8KKwloejQ3NSA9IDB4NzczMSwKKwloejQ4MCA9IDB4NzcwMSwKKwloejQ5MyA9IDB4NzY4NSwJCS8qIC44OCBCMSAgKi8KKwloejQ5NCA9IDB4NzY3YiwKKwloejUwMCA9IDB4NzY0MCwKKwloejUyMCA9IDB4NzU3OCwKKwloejUyMyA9IDB4NzU1OSwJCS8qIC4yNSBDMiAgKi8KKwloejUyNSA9IDB4NzU0NCwKKwloejU0MCA9IDB4NzRhNywKKwloejU1NCA9IDB4NzQxMSwJCS8qIC4zNyBDUzIgKi8KKwloejU4NyA9IDB4NzJhMSwJCS8qIC4zMyBEMiAgKi8KKwloejU5MCA9IDB4NzI3ZiwKKwloejYwMCA9IDB4NzIwYiwKKwloejYyMCA9IDB4NzExZSwKKwloejYyMiA9IDB4NzEwNiwJCS8qIC4yNSBEUzIgKi8KKwloejY1OSA9IDB4NmYzYiwJCS8qIC4yNiBFMiAgKi8KKwloejY2MCA9IDB4NmYyZSwKKwloejY5OCA9IDB4NmQzZCwJCS8qIC40NiBGMiAgKi8KKwloejcwMCA9IDB4NmQyMiwKKwloejczOSA9IDB4NmIwOSwJCS8qIC45OSBGUzIgKi8KKwloejc0MCA9IDB4NmFmYSwKKwloejc1MCA9IDB4NmE2YywKKwloejc3MCA9IDB4Njk0YiwKKwloejc4MyA9IDB4Njg4YiwJCS8qIC45OSBHMiAgKi8KKwloejgwMCA9IDB4Njc4ZCwKKwloejgxNiA9IDB4NjY5OCwKKwloejgzMCA9IDB4NjViZiwJCS8qIC42MSBHUzIgKi8KKwloejg1MCA9IDB4NjQ4NCwKKwloejg1NyA9IDB4NjQxNCwKKwloejg4MCA9IDB4NjI5ZiwJCS8qIC4wMCBBMiAgKi8KKwloejkwMCA9IDB4NjE1NCwKKwloejkzMiA9IDB4NWYzNSwJCS8qIC4zMyBBUzIgKi8KKwloejkzNSA9IDB4NWYwMSwKKwloejk0MSA9IDB4NWU5YSwKKwloejk0MiA9IDB4NWU4OCwKKwloejk1MCA9IDB4NWRmZCwKKwloejk3NSA9IDB4NWM0NCwKKwloejEwMDAgPSAweDVhODEsCisJaHoxMDIwID0gMHg1OTEyLAorCWh6MTA1MCA9IDB4NTZlMiwKKwloejExMDAgPSAweDUzMjAsCisJaHoxMTQwID0gMHg1MDA3LAorCWh6MTIwMCA9IDB4NGIzYiwKKwloejEyMDkgPSAweDRhODAsCisJaHoxMjE1ID0gMHg0YTAyLAorCWh6MTI1MCA9IDB4NDcxYywKKwloejEzMDAgPSAweDQyZTAsCisJaHoxMzMwID0gMHg0MDQ5LAorCWh6MTMzNiA9IDB4M2ZjNCwKKwloejEzNjYgPSAweDNkMjIsCisJaHoxMzgwID0gMHgzYmU0LAorCWh6MTQwMCA9IDB4M2ExYiwKKwloejE0NTAgPSAweDM1OTYsCisJaHoxNDc3ID0gMHgzMzFjLAorCWh6MTUwMCA9IDB4MzBmYiwKKwloejE2MDAgPSAweDI3OGQsCisJaHoxNjMzID0gMHgyNDYyLAorCWh6MTYzOCA9IDB4MjNlNywKKwloejE2NDUgPSAweDIzM2EsCisJaHoxNzUwID0gMHgxOGY4LAorCWh6MTgwMCA9IDB4MTQwNSwKKwloejE4NjAgPSAweGUwYiwKKwloejIxMDAgPSAweGY1ZjYsCisJaHoyMTMwID0gMHhmMmY1LAorCWh6MjQ1MCA9IDB4ZDNiMywKKwloejI3NTAgPSAweGI4ZTQKK30gSVhKX0ZSRVE7CisKK3R5cGVkZWYgZW51bSB7CisJQzEgPSBoejI2MSwKKwlDUzEgPSBoejI3NywKKwlEMSA9IGh6MjkzLAorCURTMSA9IGh6MzExLAorCUUxID0gaHozMjksCisJRjEgPSBoejM0OSwKKwlGUzEgPSBoejM2OSwKKwlHMSA9IGh6MzkyLAorCUdTMSA9IGh6NDE1LAorCUExID0gaHo0NDAsCisJQVMxID0gaHo0NjYsCisJQjEgPSBoejQ5MywKKwlDMiA9IGh6NTIzLAorCUNTMiA9IGh6NTU0LAorCUQyID0gaHo1ODcsCisJRFMyID0gaHo2MjIsCisJRTIgPSBoejY1OSwKKwlGMiA9IGh6Njk4LAorCUZTMiA9IGh6NzM5LAorCUcyID0gaHo3ODMsCisJR1MyID0gaHo4MzAsCisJQTIgPSBoejg4MCwKKwlBUzIgPSBoejkzMiwKK30gSVhKX05PVEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdG9uZV9pbmRleDsKKwlpbnQgZnJlcTA7CisJaW50IGdhaW4wOworCWludCBmcmVxMTsKKwlpbnQgZ2FpbjE7Cit9IElYSl9UT05FOworCisjZGVmaW5lIElYSkNUTF9JTklUX1RPTkUJCV9JT1cgKCdxJywgMHhDOSwgSVhKX1RPTkUgKikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGUgSVhKQ1RMX1RPTkVfQ0FERU5DRSBpb2N0bCBkZWZpbmVzIHRvbmUgc2VxdWVuY2VzIHVzZWQgZm9yIHZhcmlvdXMKKyogQ2FsbCBQcm9ncmVzcyBUb25lcyAoQ1BUKS4gIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHNldHRpbmcgdXAgYW4gYXJyYXkgb2YKKyogSVhKX0NBREVOQ0VfRUxFTUVOVCBzdHJ1Y3R1cmVzIHRoYXQgc2VxdWVudGlhbGx5IGRlZmluZSB0aGUgc3RhdGVzIG9mCisqIHRoZSB0b25lIHNlcXVlbmNlLiAgVGhlIHRvbmVfb25fdGltZSBhbmQgdG9uZV9vZmYgdGltZSBhcmUgaW4KKyogMjUwIG1pY3Jvc2Vjb25kIGludGVydmFscy4gIEEgcG9pbnRlciB0byB0aGlzIGFycmF5IGlzIHBhc3NlZCB0byB0aGUKKyogZHJpdmVyIGFzIHRoZSBjZSBlbGVtZW50IG9mIGFuIElYSl9DQURFTkNFIHN0cnVjdHVyZS4gIFRoZSBlbGVtZW50c191c2VkCisqIG11c3QgYmUgc2V0IHRvIHRoZSBudW1iZXIgb2YgSVhKX0NBREVOQ0VfRUxFTUVOVFMgaW4gdGhlIGFycmF5LiAgVGhlCisqIHRlcm1pbmF0aW9uIHZhcmlhYmxlIGRlZmluZXMgd2hhdCB0byBkbyBhdCB0aGUgZW5kIG9mIGEgY2FkZW5jZSwgdGhlCisqIG9wdGlvbnMgYXJlIHRvIHBsYXkgdGhlIGNhZGVuY2Ugb25jZSBhbmQgc3RvcCwgdG8gcmVwZWF0IHRoZSBsYXN0CisqIGVsZW1lbnQgb2YgdGhlIGNhZGVuY2UgaW5kZWZpbml0ZWx5LCBvciB0byByZXBlYXQgdGhlIGVudGlyZSBjYWRlbmNlCisqIGluZGVmaW5pdGVseS4gIFRoZSBjZSB2YXJpYWJsZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIElYSl9UT05FCisqIHN0cnVjdHVyZXMuICBJZiB0aGUgZnJlcTAgdmFyaWFibGUgaXMgbm9uLXplcm8sIHRoZSB0b25lIHRhYmxlIGNvbnRlbnRzCisqIGZvciB0aGUgdG9uZV9pbmRleCBhcmUgdXBkYXRlZCB0byB0aGUgZnJlcXVlbmNpZXMgYW5kIGdhaW5zIGRlZmluZWQuICBJdAorKiBzaG91bGQgYmUgbm90ZWQgdGhhdCBEVE1GIHRvbmVzIGNhbm5vdCBiZSByZWFzc2lnbmVkLCBzbyBpZiBEVE1GIHRvbmUKKyogdGFibGUgaW5kZXhlcyBhcmUgdXNlZCBpbiBhIGNhZGVuY2UgdGhlIGZyZXF1ZW5jeSBhbmQgZ2FpbiB2YXJpYWJsZXMgd2lsbAorKiBiZSBpZ25vcmVkLgorKgorKiBJZiB0aGUgYXJyYXkgZWxlbWVudHMgY29udGFpbiBmcmVxdWVuY3kgcGFyYW1ldGVycyB0aGUgZHJpdmVyIHdpbGwKKyogaW5pdGlhbGl6ZSB0aGUgbmVlZGVkIHRvbmUgdGFibGUgZWxlbWVudHMgYW5kIGJlZ2luIHBsYXlpbmcgdGhlIHRvbmUsCisqIHRoZXJlIGlzIG5vIHByZXNldCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjYWRlbmNlLiAgSWYKKyogdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmcmVxdWVuY3kgdXNlZCBpbiB0aGUgY2FkZW5jZSwgc2VxdWVudGlhbCBlbGVtZW50cworKiBvZiBkaWZmZXJlbnQgZnJlcXVlbmNpZXMgTVVTVCB1c2UgZGlmZmVyZW50IHRvbmUgdGFibGUgaW5kZXhlcy4gIE9ubHkgb25lCisqIGNhZGVuY2UgY2FuIGJlIHBsYXllZCBhdCBhIHRpbWUuICBJdCBpcyBwb3NzaWJsZSB0byBidWlsZCBjb21wbGV4CisqIGNhZGVuY2VzIHdpdGggbXVsdGlwbGUgZnJlcXVlbmNpZXMgdXNpbmcgMiB0b25lIHRhYmxlIGluZGV4ZXMgYnkKKyogYWx0ZXJuYXRpbmcgYmV0d2VlbiB0aGVtLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGluZGV4OworCWludCB0b25lX29uX3RpbWU7CisJaW50IHRvbmVfb2ZmX3RpbWU7CisJaW50IGZyZXEwOworCWludCBnYWluMDsKKwlpbnQgZnJlcTE7CisJaW50IGdhaW4xOworfSBJWEpfQ0FERU5DRV9FTEVNRU5UOworCit0eXBlZGVmIGVudW0geworCVBMQVlfT05DRSwKKwlSRVBFQVRfTEFTVF9FTEVNRU5ULAorCVJFUEVBVF9BTEwKK30gSVhKX0NBREVOQ0VfVEVSTTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBlbGVtZW50c191c2VkOworCUlYSl9DQURFTkNFX1RFUk0gdGVybWluYXRpb247CisJSVhKX0NBREVOQ0VfRUxFTUVOVCAqY2U7Cit9IElYSl9DQURFTkNFOworCisjZGVmaW5lIElYSkNUTF9UT05FX0NBREVOQ0UJCV9JT1cgKCdxJywgMHhDQSwgSVhKX0NBREVOQ0UgKikKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogVGhpcyBncm91cCBvZiBJT0NUTHMgZGVhbCB3aXRoIHRoZSBwbGF5YmFjayBzZXR0aW5ncyBvZiB0aGUgRFNQCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVhKQ1RMX1BMQVlfQ09ERUMgICAgICAgICAgICAgICBQSE9ORV9QTEFZX0NPREVDCisjZGVmaW5lIElYSkNUTF9QTEFZX1NUQVJUICAgICAgICAgICAgICAgUEhPTkVfUExBWV9TVEFSVAorI2RlZmluZSBJWEpDVExfUExBWV9TVE9QICAgICAgICAgICAgICAgIFBIT05FX1BMQVlfU1RPUAorI2RlZmluZSBJWEpDVExfUExBWV9ERVBUSAkJUEhPTkVfUExBWV9ERVBUSAorI2RlZmluZSBJWEpDVExfUExBWV9WT0xVTUUJCVBIT05FX1BMQVlfVk9MVU1FCisjZGVmaW5lIElYSkNUTF9QTEFZX0xFVkVMCQlQSE9ORV9QTEFZX0xFVkVMCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogVGhpcyBncm91cCBvZiBJT0NUTHMgZGVhbCB3aXRoIHRoZSBBY291c3RpYyBFY2hvIENhbmNlbGxhdGlvbiBzZXR0aW5ncworKiBvZiB0aGUgRFNQCisqCisqIElzc3VpbmcgdGhlIElYSkNUTF9BRUNfU1RBUlQgY29tbWFuZCB3aXRoIGEgdmFsdWUgb2YgQUVDX09GRiBoYXMgdGhlCisqIHNhbWUgZWZmZWN0IGFzIElYSkNUTF9BRUNfU1RPUC4gIFRoaXMgaXMgdG8gc2ltcGxpZnkgc2xpZGVyIGJhcgorKiBjb250cm9scy4gIElYSkNUTF9BRUNfR0VUX0xFVkVMIHJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZyBvZiB0aGUgQUVDLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJWEpDVExfQUVDX1NUQVJUCQlfSU9XICgncScsIDB4Q0IsIGludCkKKyNkZWZpbmUgSVhKQ1RMX0FFQ19TVE9QCQkJX0lPICAoJ3EnLCAweENDKQorI2RlZmluZSBJWEpDVExfQUVDX0dFVF9MRVZFTAkJX0lPICAoJ3EnLCAweENEKQorCisjZGVmaW5lIEFFQ19PRkYgICAwCisjZGVmaW5lIEFFQ19MT1cgICAxCisjZGVmaW5lIEFFQ19NRUQgICAyCisjZGVmaW5lIEFFQ19ISUdIICAzCisjZGVmaW5lIEFFQ19BVVRPICA0CisjZGVmaW5lIEFFQ19BR0MgICA1CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIENhbGwgUHJvZ3Jlc3MgVG9uZXMsIERUTUYsIGV0Yy4KKyogSVhKQ1RMX0RUTUZfT09CIGRldGVybWluZXMgaWYgRFRNRiBzaWduYWxpbmcgaXMgc2VudCBhcyBPdXQtT2YtQmFuZAorKiBvbmx5LiAgSWYgeW91IHBhc3MgYSAxLCBEVE1GIGlzIHN1cHByZXNzZWQgZnJvbSB0aGUgYXVkaW8gc3RyZWFtLgorKiBUb25lIG9uIGFuZCBvZmYgdGltZXMgYXJlIGluIDI1MCBtaWNyb3NlY29uZCBpbnRlcnZhbHMgc28KKyogaW9jdGwoaXhqMSwgSVhKQ1RMX1NFVF9UT05FX09OX1RJTUUsIDM2MCk7CisqIHdpbGwgc2V0IHRoZSB0b25lIG9uIHRpbWUgb2YgYm9hcmQgaXhqMSB0byAzNjAgKiAyNTB1cyA9IDkwbXMKKyogdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRvbmUgb24gYW5kIG9mZiB0aW1lcyBpcyA4NDAgb3IgMjEwbXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJWEpDVExfRFRNRl9SRUFEWQkJUEhPTkVfRFRNRl9SRUFEWQorI2RlZmluZSBJWEpDVExfR0VUX0RUTUYgICAgICAgICAgICAgICAgIFBIT05FX0dFVF9EVE1GCisjZGVmaW5lIElYSkNUTF9HRVRfRFRNRl9BU0NJSSAgICAgICAgICAgUEhPTkVfR0VUX0RUTUZfQVNDSUkKKyNkZWZpbmUgSVhKQ1RMX0RUTUZfT09CCQkJUEhPTkVfRFRNRl9PT0IKKyNkZWZpbmUgSVhKQ1RMX0VYQ0VQVElPTgkJUEhPTkVfRVhDRVBUSU9OCisjZGVmaW5lIElYSkNUTF9QTEFZX1RPTkUJCVBIT05FX1BMQVlfVE9ORQorI2RlZmluZSBJWEpDVExfU0VUX1RPTkVfT05fVElNRQkJUEhPTkVfU0VUX1RPTkVfT05fVElNRQorI2RlZmluZSBJWEpDVExfU0VUX1RPTkVfT0ZGX1RJTUUJUEhPTkVfU0VUX1RPTkVfT0ZGX1RJTUUKKyNkZWZpbmUgSVhKQ1RMX0dFVF9UT05FX09OX1RJTUUJCVBIT05FX0dFVF9UT05FX09OX1RJTUUKKyNkZWZpbmUgSVhKQ1RMX0dFVF9UT05FX09GRl9USU1FCVBIT05FX0dFVF9UT05FX09GRl9USU1FCisjZGVmaW5lIElYSkNUTF9HRVRfVE9ORV9TVEFURQkJUEhPTkVfR0VUX1RPTkVfU1RBVEUKKyNkZWZpbmUgSVhKQ1RMX0JVU1kJCQlQSE9ORV9CVVNZCisjZGVmaW5lIElYSkNUTF9SSU5HQkFDSwkJCVBIT05FX1JJTkdCQUNLCisjZGVmaW5lIElYSkNUTF9ESUFMVE9ORQkJCVBIT05FX0RJQUxUT05FCisjZGVmaW5lIElYSkNUTF9DUFRfU1RPUAkJCVBIT05FX0NQVF9TVE9QCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTGluZUpBQ0sgc3BlY2lmaWMgSU9DVExzCisqCisqIFRoZSBsc2IgNCBiaXRzIG9mIHRoZSBMRUQgYXJndW1lbnQgcmVwcmVzZW50IHRoZSBzdGF0ZSBvZiBlYWNoIG9mIHRoZSA0CisqIExFRCdzIG9uIHRoZSBMaW5lSkFDSworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElYSkNUTF9TRVRfTEVECQkJX0lPVyAoJ3EnLCAweENFLCBpbnQpCisjZGVmaW5lIElYSkNUTF9NSVhFUgkJCV9JT1cgKCdxJywgMHhDRiwgaW50KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIAorKiBUaGUgbWFzdGVyIHZvbHVtZSBjb250cm9scyB1c2UgYXR0ZW51YXRpb24gd2l0aCAzMiBsZXZlbHMgZnJvbSAwIHRvIC02MmRCCisqIHdpdGggc3RlcHMgb2YgMmRCIGVhY2gsIHRoZSBkZWZpbmVzIHNob3VsZCBiZSBPUidlZCB0b2dldGhlciB0aGVuIHNlbnQKKyogYXMgdGhlIHBhcmFtZXRlciB0byB0aGUgbWl4ZXIgY29tbWFuZCB0byBjaGFuZ2UgdGhlIG1peGVyIHNldHRpbmdzLgorKiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTUlYRVJfTUFTVEVSX0wJCTB4MDAwMAorI2RlZmluZSBNSVhFUl9NQVNURVJfUgkJMHgwMTAwCisjZGVmaW5lIEFUVDAwREIJCQkweDAwCisjZGVmaW5lIEFUVDAyREIJCQkweDAxCisjZGVmaW5lIEFUVDA0REIJCQkweDAyCisjZGVmaW5lIEFUVDA2REIJCQkweDAzCisjZGVmaW5lIEFUVDA4REIJCQkweDA0CisjZGVmaW5lIEFUVDEwREIJCQkweDA1CisjZGVmaW5lIEFUVDEyREIJCQkweDA2CisjZGVmaW5lIEFUVDE0REIJCQkweDA3CisjZGVmaW5lIEFUVDE2REIJCQkweDA4CisjZGVmaW5lIEFUVDE4REIJCQkweDA5CisjZGVmaW5lIEFUVDIwREIJCQkweDBBCisjZGVmaW5lIEFUVDIyREIJCQkweDBCCisjZGVmaW5lIEFUVDI0REIJCQkweDBDCisjZGVmaW5lIEFUVDI2REIJCQkweDBECisjZGVmaW5lIEFUVDI4REIJCQkweDBFCisjZGVmaW5lIEFUVDMwREIJCQkweDBGCisjZGVmaW5lIEFUVDMyREIJCQkweDEwCisjZGVmaW5lIEFUVDM0REIJCQkweDExCisjZGVmaW5lIEFUVDM2REIJCQkweDEyCisjZGVmaW5lIEFUVDM4REIJCQkweDEzCisjZGVmaW5lIEFUVDQwREIJCQkweDE0CisjZGVmaW5lIEFUVDQyREIJCQkweDE1CisjZGVmaW5lIEFUVDQ0REIJCQkweDE2CisjZGVmaW5lIEFUVDQ2REIJCQkweDE3CisjZGVmaW5lIEFUVDQ4REIJCQkweDE4CisjZGVmaW5lIEFUVDUwREIJCQkweDE5CisjZGVmaW5lIEFUVDUyREIJCQkweDFBCisjZGVmaW5lIEFUVDU0REIJCQkweDFCCisjZGVmaW5lIEFUVDU2REIJCQkweDFDCisjZGVmaW5lIEFUVDU4REIJCQkweDFECisjZGVmaW5lIEFUVDYwREIJCQkweDFFCisjZGVmaW5lIEFUVDYyREIJCQkweDFGCisjZGVmaW5lIE1BU1RFUl9NVVRFCQkweDgwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCisqIFRoZSBpbnB1dCB2b2x1bWUgY29udHJvbHMgdXNlIGdhaW4gd2l0aCAzMiBsZXZlbHMgZnJvbSArMTJkQiB0byAtNTBkQgorKiB3aXRoIHN0ZXBzIG9mIDJkQiBlYWNoLCB0aGUgZGVmaW5lcyBzaG91bGQgYmUgT1InZWQgdG9nZXRoZXIgdGhlbiBzZW50CisqIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlIG1peGVyIGNvbW1hbmQgdG8gY2hhbmdlIHRoZSBtaXhlciBzZXR0aW5ncy4KKyogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1JWEVSX1BPUlRfQ0RfTAkJMHgwNjAwCisjZGVmaW5lIE1JWEVSX1BPUlRfQ0RfUgkJMHgwNzAwCisjZGVmaW5lIE1JWEVSX1BPUlRfTElORV9JTl9MCTB4MDgwMAorI2RlZmluZSBNSVhFUl9QT1JUX0xJTkVfSU5fUgkweDA5MDAKKyNkZWZpbmUgTUlYRVJfUE9SVF9QT1RTX1JFQwkweDBDMDAKKyNkZWZpbmUgTUlYRVJfUE9SVF9NSUMJCTB4MEUwMAorCisjZGVmaW5lIEdBSU4xMkRCCQkweDAwCisjZGVmaW5lIEdBSU4xMERCCQkweDAxCisjZGVmaW5lIEdBSU4wOERCCQkweDAyCisjZGVmaW5lIEdBSU4wNkRCCQkweDAzCisjZGVmaW5lIEdBSU4wNERCCQkweDA0CisjZGVmaW5lIEdBSU4wMkRCCQkweDA1CisjZGVmaW5lIEdBSU4wMERCCQkweDA2CisjZGVmaW5lIEdBSU5fMDJEQgkJMHgwNworI2RlZmluZSBHQUlOXzA0REIJCTB4MDgKKyNkZWZpbmUgR0FJTl8wNkRCCQkweDA5CisjZGVmaW5lIEdBSU5fMDhEQgkJMHgwQQorI2RlZmluZSBHQUlOXzEwREIJCTB4MEIKKyNkZWZpbmUgR0FJTl8xMkRCCQkweDBDCisjZGVmaW5lIEdBSU5fMTREQgkJMHgwRAorI2RlZmluZSBHQUlOXzE2REIJCTB4MEUKKyNkZWZpbmUgR0FJTl8xOERCCQkweDBGCisjZGVmaW5lIEdBSU5fMjBEQgkJMHgxMAorI2RlZmluZSBHQUlOXzIyREIJCTB4MTEKKyNkZWZpbmUgR0FJTl8yNERCCQkweDEyCisjZGVmaW5lIEdBSU5fMjZEQgkJMHgxMworI2RlZmluZSBHQUlOXzI4REIJCTB4MTQKKyNkZWZpbmUgR0FJTl8zMERCCQkweDE1CisjZGVmaW5lIEdBSU5fMzJEQgkJMHgxNgorI2RlZmluZSBHQUlOXzM0REIJCTB4MTcKKyNkZWZpbmUgR0FJTl8zNkRCCQkweDE4CisjZGVmaW5lIEdBSU5fMzhEQgkJMHgxOQorI2RlZmluZSBHQUlOXzQwREIJCTB4MUEKKyNkZWZpbmUgR0FJTl80MkRCCQkweDFCCisjZGVmaW5lIEdBSU5fNDREQgkJMHgxQworI2RlZmluZSBHQUlOXzQ2REIJCTB4MUQKKyNkZWZpbmUgR0FJTl80OERCCQkweDFFCisjZGVmaW5lIEdBSU5fNTBEQgkJMHgxRgorI2RlZmluZSBJTlBVVF9NVVRFCQkweDgwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCisqIFRoZSBQT1RTIHZvbHVtZSBjb250cm9sIHVzZSBhdHRlbnVhdGlvbiB3aXRoIDggbGV2ZWxzIGZyb20gMGRCIHRvIC0yOGRCCisqIHdpdGggc3RlcHMgb2YgNGRCIGVhY2gsIHRoZSBkZWZpbmVzIHNob3VsZCBiZSBPUidlZCB0b2dldGhlciB0aGVuIHNlbnQKKyogYXMgdGhlIHBhcmFtZXRlciB0byB0aGUgbWl4ZXIgY29tbWFuZCB0byBjaGFuZ2UgdGhlIG1peGVyIHNldHRpbmdzLgorKiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTUlYRVJfUE9SVF9QT1RTX1BMQVkJMHgwRjAwCisKKyNkZWZpbmUgUE9UU19BVFRfMDBEQgkJMHgwMAorI2RlZmluZSBQT1RTX0FUVF8wNERCCQkweDAxCisjZGVmaW5lIFBPVFNfQVRUXzA4REIJCTB4MDIKKyNkZWZpbmUgUE9UU19BVFRfMTJEQgkJMHgwMworI2RlZmluZSBQT1RTX0FUVF8xNkRCCQkweDA0CisjZGVmaW5lIFBPVFNfQVRUXzIwREIJCTB4MDUKKyNkZWZpbmUgUE9UU19BVFRfMjREQgkJMHgwNgorI2RlZmluZSBQT1RTX0FUVF8yOERCCQkweDA3CisjZGVmaW5lIFBPVFNfTVVURQkJMHg4MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIAorKiBUaGUgREFBIGNvbnRyb2xzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIFBTVE4gcG9ydC4gIFRoZSBkcml2ZXIgbG9hZHMgdGhlCisqIFVTIGNvZWZmaWNpZW50cyBieSBkZWZhdWx0LCBzbyBpZiB5b3UgbGl2ZSBpbiBhIGRpZmZlcmVudCBjb3VudHJ5IHlvdQorKiBuZWVkIHRvIGxvYWQgdGhlIHNldCBmb3IgeW91ciBjb3VudHJpZXMgcGhvbmUgc3lzdGVtLgorKiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSVhKQ1RMX0RBQV9DT0VGRl9TRVQJCV9JT1cgKCdxJywgMHhEMCwgaW50KQorCisjZGVmaW5lIERBQV9VUyAJCTEJLypQSVRBIDhrSHogKi8KKyNkZWZpbmUgREFBX1VLIAkJMgkvKklTQVIzNCA4a0h6ICovCisjZGVmaW5lIERBQV9GUkFOQ0UgCTMJLyogKi8KKyNkZWZpbmUgREFBX0dFUk1BTlkJNAorI2RlZmluZSBEQUFfQVVTVFJBTElBCTUKKyNkZWZpbmUgREFBX0pBUEFOCTYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogVXNlIElYSkNUTF9QT1JUIHRvIHNldCBvciBxdWVyeSB0aGUgcG9ydCB0aGUgY2FyZCBpcyBzZXQgdG8uICBJZiB0aGUKKyogYXJndW1lbnQgaXMgc2V0IHRvIFBPUlRfUVVFUlksIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGlvY3RsIHdpbGwKKyogaW5kaWNhdGUgd2hpY2ggcG9ydCBpcyBjdXJyZW50bHkgaW4gdXNlLCBvdGhlcndpc2UgaXQgd2lsbCBjaGFuZ2UgdGhlCisqIHBvcnQuCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJWEpDVExfUE9SVAkJCV9JT1cgKCdxJywgMHhEMSwgaW50KQorCisjZGVmaW5lIFBPUlRfUVVFUlkJMAorI2RlZmluZSBQT1JUX1BPVFMJMQorI2RlZmluZSBQT1JUX1BTVE4JMgorI2RlZmluZSBQT1JUX1NQRUFLRVIJMworI2RlZmluZSBQT1JUX0hBTkRTRVQJNAorCisjZGVmaW5lIElYSkNUTF9QU1ROX1NFVF9TVEFURQkJUEhPTkVfUFNUTl9TRVRfU1RBVEUKKyNkZWZpbmUgSVhKQ1RMX1BTVE5fR0VUX1NUQVRFCQlQSE9ORV9QU1ROX0dFVF9TVEFURQorCisjZGVmaW5lIFBTVE5fT05fSE9PSwkwCisjZGVmaW5lIFBTVE5fUklOR0lORwkxCisjZGVmaW5lIFBTVE5fT0ZGX0hPT0sJMgorI2RlZmluZSBQU1ROX1BVTFNFX0RJQUwJMworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIAorKiBUaGUgREFBIEFuYWxvZyBHQUlOIHNldHMgMiBwYXJhbWV0ZXJzIGF0IG9uZSB0aW1lLCB0aGUgcmVjZWl2ZSBnYWluIChBR1JSKSwgCisqIGFuZCB0aGUgdHJhbnNtaXQgZ2FpbiAoQUdYKS4gIE9SIHRvZ2V0aGVyIHRoZSBjb21wb25lbnRzIGFuZCBwYXNzIHRoZW0KKyogYXMgdGhlIHBhcmFtZXRlciB0byBJWEpDVExfREFBX0FHQUlOLiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyBib3RoIGF0IDBkQi4KKyogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElYSkNUTF9EQUFfQUdBSU4JCV9JT1cgKCdxJywgMHhEMiwgaW50KQorCisjZGVmaW5lIEFHUlIwMERCCTB4MDAJLyogQW5hbG9nIGdhaW4gaW4gcmVjZWl2ZSBkaXJlY3Rpb24gMGRCICovCisjZGVmaW5lIEFHUlIzXzVEQgkweDEwCS8qIEFuYWxvZyBnYWluIGluIHJlY2VpdmUgZGlyZWN0aW9uIDMuNWRCICovCisjZGVmaW5lIEFHUlIwNkRCCTB4MzAJLyogQW5hbG9nIGdhaW4gaW4gcmVjZWl2ZSBkaXJlY3Rpb24gNmRCICovCisKKyNkZWZpbmUgQUdYMDBEQgkJMHgwMAkvKiBBbmFsb2cgZ2FpbiBpbiB0cmFuc21pdCBkaXJlY3Rpb24gMGRCICovCisjZGVmaW5lIEFHWF82REIJCTB4MDQJLyogQW5hbG9nIGdhaW4gaW4gdHJhbnNtaXQgZGlyZWN0aW9uIC02ZEIgKi8KKyNkZWZpbmUgQUdYM181REIJMHgwOAkvKiBBbmFsb2cgZ2FpbiBpbiB0cmFuc21pdCBkaXJlY3Rpb24gMy41ZEIgKi8KKyNkZWZpbmUgQUdYXzJfNUIJMHgwQwkvKiBBbmFsb2cgZ2FpbiBpbiB0cmFuc21pdCBkaXJlY3Rpb24gLTIuNWRCICovCisKKyNkZWZpbmUgSVhKQ1RMX1BTVE5fTElORVRFU1QJCV9JTyAgKCdxJywgMHhEMykKKworI2RlZmluZSBJWEpDVExfQ0lECQkJX0lPUiAoJ3EnLCAweEQ0LCBQSE9ORV9DSUQgKikKKyNkZWZpbmUgSVhKQ1RMX1ZNV0kJCQlfSU9SICgncScsIDB4RDgsIGludCkKKyNkZWZpbmUgSVhKQ1RMX0NJRENXCQkJX0lPVyAoJ3EnLCAweEQ5LCBQSE9ORV9DSUQgKikKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCisqIFRoZSB3aW5rIGR1cmF0aW9uIGlzIHR1bmFibGUgd2l0aCB0aGlzIGlvY3RsLiAgVGhlIGRlZmF1bHQgd2luayBkdXJhdGlvbiAgCisqIGlzIDMyMG1zLiAgWW91IGRvIG5vdCBuZWVkIHRvIHVzZSB0aGlzIGlvY3RsIGlmIHlvdSBkbyBub3QgcmVxdWlyZSBhCisqIGRpZmZlcmVudCB3aW5rIGR1cmF0aW9uLgorKiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSVhKQ1RMX1dJTktfRFVSQVRJT04JCVBIT05FX1dJTktfRFVSQVRJT04KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogVGhpcyBpb2N0bCB3aWxsIGNvbm5lY3QgdGhlIFBPVFMgcG9ydCB0byB0aGUgUFNUTiBwb3J0IG9uIHRoZSBMaW5lSkFDSworKiBJbiBvcmRlciBmb3IgdGhpcyB0byB3b3JrIHByb3Blcmx5IHRoZSBwb3J0IHNlbGVjdGlvbiBzaG91bGQgYmUgc2V0IHRvCisqIHRoZSBQU1ROIHBvcnQgd2l0aCBJWEpDVExfUE9SVCBwcmlvciB0byBjYWxsaW5nIHRoaXMgaW9jdGwuICBUaGlzIHdpbGwKKyogZW5hYmxlIGNvbmZlcmVuY2UgY2FsbHMgYmV0d2VlbiBQU1ROIGNhbGxlcnMgYW5kIG5ldHdvcmsgY2FsbGVycy4KKyogUGFzc2luZyBhIDEgdG8gdGhpcyBpb2N0bCBlbmFibGVzIHRoZSBQT1RTPC0+UFNUTiBjb25uZWN0aW9uIHdoaWxlCisqIHBhc3NpbmcgYSAwIHR1cm5zIGl0IGJhY2sgb2ZmLgorKiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSVhKQ1RMX1BPVFNfUFNUTgkJX0lPVyAoJ3EnLCAweEQ1LCBpbnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogSU9DVExzIGFkZGVkIGJ5IHJlcXVlc3QuCisqCisqIElYSkNUTF9IWiBzZXRzIHRoZSB2YWx1ZSB5b3VyIExpbnV4IGtlcm5lbCB1c2VzIGZvciBIWiBhcyBkZWZpbmVkIGluCisqICAgICAgICAgICAvdXNyL2luY2x1ZGUvYXNtL3BhcmFtLmgsIHRoaXMgZGV0ZXJtaW5lcyB0aGUgZnVuZGFtZW50YWwKKyogICAgICAgICAgIGZyZXF1ZW5jeSBvZiB0aGUgY2xvY2sgdGlja3Mgb24geW91ciBMaW51eCBzeXN0ZW0uICBUaGUga2VybmVsCisqICAgICAgICAgICBtdXN0IGJlIHJlYnVpbHQgaWYgeW91IGNoYW5nZSB0aGlzIHZhbHVlLCBhbHNvIGFsbCBtb2R1bGVzIHlvdQorKiAgICAgICAgICAgdXNlIChleGNlcHQgdGhpcyBvbmUpIG11c3QgYmUgcmVjb21waWxlZC4gIFRoZSBkZWZhdWx0IHZhbHVlCisqICAgICAgICAgICBpcyAxMDAsIGFuZCB5b3Ugb25seSBuZWVkIHRvIHVzZSB0aGlzIElPQ1RMIGlmIHlvdSB1c2Ugc29tZQorKiAgICAgICAgICAgb3RoZXIgdmFsdWUuCisqCisqCisqIElYSkNUTF9SQVRFIHNldHMgdGhlIG51bWJlciBvZiB0aW1lcyBwZXIgc2Vjb25kIHRoYXQgdGhlIGRyaXZlciBwb2xscworKiAgICAgICAgICAgICB0aGUgRFNQLiAgVGhpcyB2YWx1ZSBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gSFouICBCeQorKiAgICAgICAgICAgICBpbmNyZWFzaW5nIGJvdGggb2YgdGhlc2UgdmFsdWVzLCB5b3UgbWF5IGJlIGFibGUgdG8gcmVkdWNlCisqICAgICAgICAgICAgIGxhdGVuY3kgYmVjYXVzZSB0aGUgbWF4IGhhbmcgdGltZSB0aGF0IGNhbiBleGlzdCBiZXR3ZWVuIHRoZQorKiAgICAgICAgICAgICBkcml2ZXIgYW5kIHRoZSBEU1Agd2lsbCBiZSByZWR1Y2VkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElYSkNUTF9IWiAgICAgICAgICAgICAgICAgICAgICAgX0lPVyAoJ3EnLCAweEUwLCBpbnQpCisjZGVmaW5lIElYSkNUTF9SQVRFICAgICAgICAgICAgICAgICAgICAgX0lPVyAoJ3EnLCAweEUxLCBpbnQpCisjZGVmaW5lIElYSkNUTF9GUkFNRVNfUkVBRAkJX0lPUiAoJ3EnLCAweEUyLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBJWEpDVExfRlJBTUVTX1dSSVRURU4JCV9JT1IgKCdxJywgMHhFMywgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgSVhKQ1RMX1JFQURfV0FJVAkJX0lPUiAoJ3EnLCAweEU0LCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBJWEpDVExfV1JJVEVfV0FJVAkJX0lPUiAoJ3EnLCAweEU1LCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBJWEpDVExfRFJZQlVGRkVSX1JFQUQJCV9JT1IgKCdxJywgMHhFNiwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgSVhKQ1RMX0RSWUJVRkZFUl9DTEVBUgkJX0lPICAoJ3EnLCAweEU3KQorI2RlZmluZSBJWEpDVExfRFRNRl9QUkVTQ0FMRQkJX0lPVyAoJ3EnLCAweEU4LCBpbnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogVGhpcyBpb2N0bCBhbGxvd3MgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8gY29udHJvbCB3aGF0IGV2ZW50cyB0aGUgZHJpdmVyCisqIHdpbGwgc2VuZCBzaWduYWxzIGZvciwgYW5kIHdoYXQgc2lnbmFscyBpdCB3aWxsIHNlbmQgZm9yIHdoaWNoIGV2ZW50LgorKiBCeSBkZWZhdWx0LCBpZiBzaWduYWxpbmcgaXMgZW5hYmxlZCwgYWxsIGV2ZW50cyB3aWxsIHNlbmQgU0lHSU8gd2hlbgorKiB0aGV5IG9jY3VyLiAgVG8gZGlzYWJsZSBzaWduYWxzIGZvciBhbiBldmVudCBzZXQgdGhlIHNpZ25hbCB0byAwLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKwlTSUdfRFRNRl9SRUFEWSwKKwlTSUdfSE9PS1NUQVRFLAorCVNJR19GTEFTSCwKKwlTSUdfUFNUTl9SSU5HLAorCVNJR19DQUxMRVJfSUQsCisJU0lHX1BTVE5fV0lOSywKKwlTSUdfRjAsIFNJR19GMSwgU0lHX0YyLCBTSUdfRjMsCisJU0lHX0ZDMCwgU0lHX0ZDMSwgU0lHX0ZDMiwgU0lHX0ZDMywKKwlTSUdfUkVBRF9SRUFEWSA9IDMzLAorCVNJR19XUklURV9SRUFEWSA9IDM0Cit9IElYSl9TSUdFVkVOVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBldmVudDsKKwlpbnQgc2lnbmFsOworfSBJWEpfU0lHREVGOworCisjZGVmaW5lIElYSkNUTF9TSUdDVEwJCQlfSU9XICgncScsIDB4RTksIElYSl9TSUdERUYgKikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGVzZSBpb2N0bHMgYWxsb3cgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8gY2hhbmdlIHRoZSBnYWluIGluIHRoZSAKKyogU21hcnQgQ2FibGUgb2YgdGhlIEludGVybmV0IFBob25lIENhcmQuICBTZW5kaW5nIC0xIGFzIGEgdmFsdWUgd2lsbCBjYXVzZQorKiByZXR1cm4gdmFsdWUgdG8gYmUgdGhlIGN1cnJlbnQgc2V0dGluZy4gIFZhbGlkIHZhbHVlcyB0byBzZXQgYXJlIDB4MDAgLSAweDFGCisqCisqIDExMTExID0gKzEyIGRCCisqIDEwMTExID0gICAwIGRCCisqIDAwMDAwID0gLTM0LjUgZEIKKyoKKyogSVhKQ1RMX1NDX1JYRyBzZXRzIHRoZSBSZWNlaXZlIGdhaW4KKyogSVhKQ1RMX1NDX1RYRyBzZXRzIHRoZSBUcmFuc21pdCBnYWluCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElYSkNUTF9TQ19SWEcJCQlfSU9XICgncScsIDB4RUEsIGludCkKKyNkZWZpbmUgSVhKQ1RMX1NDX1RYRwkJCV9JT1cgKCdxJywgMHhFQiwgaW50KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoZSBpbnRlcmNvbSBJT0NUTCdzIHNob3J0IHRoZSBvdXRwdXQgZnJvbSBvbmUgY2FyZCB0byB0aGUgaW5wdXQgb2YgdGhlCisqIG90aGVyIGFuZCB2aWNlIHZlcnNhIChhY3R1YWxseSBkb25lIGluIHRoZSBEU1AgcmVhZCBmdW5jdGlvbikuICBJdCBpcyBvbmx5CisqIG5lY2Vzc2FyeSB0byBleGVjdXRlIHRoZSBJT0NUTCBvbiBvbmUgY2FyZCwgYnV0IGl0IGlzIG5lY2Vzc2FyeSB0byBoYXZlCisqIGJvdGggZGV2aWNlcyBvcGVuIHRvIGJlIGFibGUgdG8gZGV0ZWN0IGhvb2sgc3dpdGNoIGNoYW5nZXMuICBUaGUgcmVjb3JkCisqIGNvZGVjIGFuZCByYXRlIG9mIGVhY2ggY2FyZCBtdXN0IG1hdGNoIHRoZSBwbGF5YmFjayBjb2RlYyBhbmQgcmF0ZSBvZgorKiB0aGUgb3RoZXIgY2FyZCBmb3IgdGhpcyB0byB3b3JrIHByb3Blcmx5LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElYSkNUTF9JTlRFUkNPTV9TVEFSVCAJCV9JT1cgKCdxJywgMHhGRCwgaW50KQorI2RlZmluZSBJWEpDVExfSU5URVJDT01fU1RPUCAgCQlfSU9XICgncScsIDB4RkUsIGludCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG5ldyBzdHJ1Y3R1cmUgZm9yIGFjY2Vzc2luZyByYXcgZmlsdGVyIGluZm9ybWF0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBmaWx0ZXI7CisJY2hhciBlbmFibGU7CisJdW5zaWduZWQgaW50IGNvZWZmWzE5XTsKK30gSVhKX0ZJTFRFUl9SQVc7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9qZmZzMi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9qZmZzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOGI3MTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2pmZnMyLmgKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCDCqSAyMDAxLTIwMDcgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDQtMjAxMCBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGUKKyAqIGpmZnMyIGRpcmVjdG9yeS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfSkZGUzJfSF9fCisjZGVmaW5lIF9fTElOVVhfSkZGUzJfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisKKy8qIFlvdSBtdXN0IGluY2x1ZGUgc29tZXRoaW5nIHdoaWNoIGRlZmluZXMgdGhlIEM5OSB1aW50WFhfdCB0eXBlcy4gCisgICBXZSBkb24ndCBkbyBpdCBmcm9tIGhlcmUgYmVjYXVzZSB0aGlzIGZpbGUgaXMgdXNlZCBpbiB0b28gbWFueQorICAgZGlmZmVyZW50IGVudmlyb25tZW50cy4gKi8KKworLyogVmFsdWVzIHdlIG1heSBleHBlY3QgdG8gZmluZCBpbiB0aGUgJ21hZ2ljJyBmaWVsZCAqLworI2RlZmluZSBKRkZTMl9PTERfTUFHSUNfQklUTUFTSyAweDE5ODQKKyNkZWZpbmUgSkZGUzJfTUFHSUNfQklUTUFTSyAweDE5ODUKKyNkZWZpbmUgS1NBTVRJQl9DSUdBTV8yU0ZGSiAweDg1MTkgLyogRm9yIGRldGVjdGluZyB3cm9uZy1lbmRpYW4gZnMgKi8KKyNkZWZpbmUgSkZGUzJfRU1QVFlfQklUTUFTSyAweGZmZmYKKyNkZWZpbmUgSkZGUzJfRElSVFlfQklUTUFTSyAweDAwMDAKKworLyogU3VtbWFyeSBub2RlIE1BR0lDIG1hcmtlciAqLworI2RlZmluZSBKRkZTMl9TVU1fTUFHSUMJMHgwMjg1MTg4NQorCisvKiBXZSBvbmx5IGFsbG93IGEgc2luZ2xlIGNoYXIgZm9yIGxlbmd0aCwgYW5kIDB4RkYgaXMgZW1wdHkgZmxhc2ggc28KKyAgIHdlIGRvbid0IHdhbnQgaXQgY29uZnVzZWQgd2l0aCBhIHJlYWwgbGVuZ3RoLiBIZW5jZSBtYXggMjU0LgorKi8KKyNkZWZpbmUgSkZGUzJfTUFYX05BTUVfTEVOIDI1NAorCisvKiBIb3cgc21hbGwgY2FuIHdlIHNlbnNpYmx5IHdyaXRlIG5vZGVzPyAqLworI2RlZmluZSBKRkZTMl9NSU5fREFUQV9MRU4gMTI4CisKKyNkZWZpbmUgSkZGUzJfQ09NUFJfTk9ORQkweDAwCisjZGVmaW5lIEpGRlMyX0NPTVBSX1pFUk8JMHgwMQorI2RlZmluZSBKRkZTMl9DT01QUl9SVElNRQkweDAyCisjZGVmaW5lIEpGRlMyX0NPTVBSX1JVQklOTUlQUwkweDAzCisjZGVmaW5lIEpGRlMyX0NPTVBSX0NPUFkJMHgwNAorI2RlZmluZSBKRkZTMl9DT01QUl9EWU5SVUJJTgkweDA1CisjZGVmaW5lIEpGRlMyX0NPTVBSX1pMSUIJMHgwNgorI2RlZmluZSBKRkZTMl9DT01QUl9MWk8JCTB4MDcKKy8qIENvbXBhdGliaWxpdHkgZmxhZ3MuICovCisjZGVmaW5lIEpGRlMyX0NPTVBBVF9NQVNLIDB4YzAwMCAgICAgIC8qIFdoYXQgZG8gdG8gaWYgYW4gdW5rbm93biBub2RldHlwZSBpcyBmb3VuZCAqLworI2RlZmluZSBKRkZTMl9OT0RFX0FDQ1VSQVRFIDB4MjAwMAorLyogSU5DT01QQVQ6IEZhaWwgdG8gbW91bnQgdGhlIGZpbGVzeXN0ZW0gKi8KKyNkZWZpbmUgSkZGUzJfRkVBVFVSRV9JTkNPTVBBVCAweGMwMDAKKy8qIFJPQ09NUEFUOiBNb3VudCByZWFkLW9ubHkgKi8KKyNkZWZpbmUgSkZGUzJfRkVBVFVSRV9ST0NPTVBBVCAweDgwMDAKKy8qIFJXQ09NUEFUX0NPUFk6IE1vdW50IHJlYWQvd3JpdGUsIGFuZCBjb3B5IHRoZSBub2RlIHdoZW4gaXQncyBHQydkICovCisjZGVmaW5lIEpGRlMyX0ZFQVRVUkVfUldDT01QQVRfQ09QWSAweDQwMDAKKy8qIFJXQ09NUEFUX0RFTEVURTogTW91bnQgcmVhZC93cml0ZSwgYW5kIGRlbGV0ZSB0aGUgbm9kZSB3aGVuIGl0J3MgR0MnZCAqLworI2RlZmluZSBKRkZTMl9GRUFUVVJFX1JXQ09NUEFUX0RFTEVURSAweDAwMDAKKworI2RlZmluZSBKRkZTMl9OT0RFVFlQRV9ESVJFTlQgKEpGRlMyX0ZFQVRVUkVfSU5DT01QQVQgfCBKRkZTMl9OT0RFX0FDQ1VSQVRFIHwgMSkKKyNkZWZpbmUgSkZGUzJfTk9ERVRZUEVfSU5PREUgKEpGRlMyX0ZFQVRVUkVfSU5DT01QQVQgfCBKRkZTMl9OT0RFX0FDQ1VSQVRFIHwgMikKKyNkZWZpbmUgSkZGUzJfTk9ERVRZUEVfQ0xFQU5NQVJLRVIgKEpGRlMyX0ZFQVRVUkVfUldDT01QQVRfREVMRVRFIHwgSkZGUzJfTk9ERV9BQ0NVUkFURSB8IDMpCisjZGVmaW5lIEpGRlMyX05PREVUWVBFX1BBRERJTkcgKEpGRlMyX0ZFQVRVUkVfUldDT01QQVRfREVMRVRFIHwgSkZGUzJfTk9ERV9BQ0NVUkFURSB8IDQpCisKKyNkZWZpbmUgSkZGUzJfTk9ERVRZUEVfU1VNTUFSWSAoSkZGUzJfRkVBVFVSRV9SV0NPTVBBVF9ERUxFVEUgfCBKRkZTMl9OT0RFX0FDQ1VSQVRFIHwgNikKKworI2RlZmluZSBKRkZTMl9OT0RFVFlQRV9YQVRUUiAoSkZGUzJfRkVBVFVSRV9JTkNPTVBBVCB8IEpGRlMyX05PREVfQUNDVVJBVEUgfCA4KQorI2RlZmluZSBKRkZTMl9OT0RFVFlQRV9YUkVGIChKRkZTMl9GRUFUVVJFX0lOQ09NUEFUIHwgSkZGUzJfTk9ERV9BQ0NVUkFURSB8IDkpCisKKy8qIFhBVFRSIFJlbGF0ZWQgKi8KKyNkZWZpbmUgSkZGUzJfWFBSRUZJWF9VU0VSCQkxCS8qIGZvciAidXNlci4iICovCisjZGVmaW5lIEpGRlMyX1hQUkVGSVhfU0VDVVJJVFkJCTIJLyogZm9yICJzZWN1cml0eS4iICovCisjZGVmaW5lIEpGRlMyX1hQUkVGSVhfQUNMX0FDQ0VTUwkzCS8qIGZvciAic3lzdGVtLnBvc2l4X2FjbF9hY2Nlc3MiICovCisjZGVmaW5lIEpGRlMyX1hQUkVGSVhfQUNMX0RFRkFVTFQJNAkvKiBmb3IgInN5c3RlbS5wb3NpeF9hY2xfZGVmYXVsdCIgKi8KKyNkZWZpbmUgSkZGUzJfWFBSRUZJWF9UUlVTVEVECQk1CS8qIGZvciAidHJ1c3RlZC4qIiAqLworCisjZGVmaW5lIEpGRlMyX0FDTF9WRVJTSU9OCQkweDAwMDEKKworLy8gTWF5YmUgbGF0ZXIuLi4KKy8vI2RlZmluZSBKRkZTMl9OT0RFVFlQRV9DSEVDS1BPSU5UIChKRkZTMl9GRUFUVVJFX1JXQ09NUEFUX0RFTEVURSB8IEpGRlMyX05PREVfQUNDVVJBVEUgfCAzKQorLy8jZGVmaW5lIEpGRlMyX05PREVUWVBFX09QVElPTlMgKEpGRlMyX0ZFQVRVUkVfUldDT01QQVRfQ09QWSB8IEpGRlMyX05PREVfQUNDVVJBVEUgfCA0KQorCisKKyNkZWZpbmUgSkZGUzJfSU5PX0ZMQUdfUFJFUkVBRAkgIDEJLyogRG8gcmVhZF9pbm9kZSgpIGZvciB0aGlzIG9uZSBhdAorCQkJCQkgICBtb3VudCB0aW1lLCBkb24ndCB3YWl0IGZvciBpdCB0bworCQkJCQkgICBoYXBwZW4gbGF0ZXIgKi8KKyNkZWZpbmUgSkZGUzJfSU5PX0ZMQUdfVVNFUkNPTVBSICAyCS8qIFVzZXIgaGFzIHJlcXVlc3RlZCBhIHNwZWNpZmljCisJCQkJCSAgIGNvbXByZXNzaW9uIHR5cGUgKi8KKworCisvKiBUaGVzZSBjYW4gZ28gb25jZSB3ZSd2ZSBtYWRlIHN1cmUgd2UndmUgY2F1Z2h0IGFsbCB1c2VzIHdpdGhvdXQKKyAgIGJ5dGVzd2FwcGluZyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJX191MzIgdjMyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBqaW50MzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fdTMyIG07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGptb2RlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX3UxNiB2MTY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGppbnQxNl90OworCitzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlCit7CisJLyogQWxsIHN0YXJ0IGxpa2UgdGhpcyAqLworCWppbnQxNl90IG1hZ2ljOworCWppbnQxNl90IG5vZGV0eXBlOworCWppbnQzMl90IHRvdGxlbjsgLyogU28gd2UgY2FuIHNraXAgb3ZlciBub2RlcyB3ZSBkb24ndCBncm9rICovCisJamludDMyX3QgaGRyX2NyYzsKK307CisKK3N0cnVjdCBqZmZzMl9yYXdfZGlyZW50Cit7CisJamludDE2X3QgbWFnaWM7CisJamludDE2X3Qgbm9kZXR5cGU7CS8qID09IEpGRlMyX05PREVUWVBFX0RJUkVOVCAqLworCWppbnQzMl90IHRvdGxlbjsKKwlqaW50MzJfdCBoZHJfY3JjOworCWppbnQzMl90IHBpbm87CisJamludDMyX3QgdmVyc2lvbjsKKwlqaW50MzJfdCBpbm87IC8qID09IHplcm8gZm9yIHVubGluayAqLworCWppbnQzMl90IG1jdGltZTsKKwlfX3U4IG5zaXplOworCV9fdTggdHlwZTsKKwlfX3U4IHVudXNlZFsyXTsKKwlqaW50MzJfdCBub2RlX2NyYzsKKwlqaW50MzJfdCBuYW1lX2NyYzsKKwlfX3U4IG5hbWVbMF07Cit9OworCisvKiBUaGUgSkZGUzIgcmF3IGlub2RlIHN0cnVjdHVyZTogVXNlZCBmb3Igc3RvcmFnZSBvbiBwaHlzaWNhbCBtZWRpYS4gICovCisvKiBUaGUgdWlkLCBnaWQsIGF0aW1lLCBtdGltZSBhbmQgY3RpbWUgbWVtYmVycyBjb3VsZCBiZSBsb25nZXIsIGJ1dAorICAgYXJlIGxlZnQgbGlrZSB0aGlzIGZvciBzcGFjZSBlZmZpY2llbmN5LiBJZiBhbmQgd2hlbiBwZW9wbGUgZGVjaWRlCisgICB0aGV5IHJlYWxseSBuZWVkIHRoZW0gZXh0ZW5kZWQsIGl0J3Mgc2ltcGxlIGVub3VnaCB0byBhZGQgc3VwcG9ydCBmb3IKKyAgIGEgbmV3IHR5cGUgb2YgcmF3IG5vZGUuCisqLworc3RydWN0IGpmZnMyX3Jhd19pbm9kZQoreworCWppbnQxNl90IG1hZ2ljOyAgICAgIC8qIEEgY29uc3RhbnQgbWFnaWMgbnVtYmVyLiAgKi8KKwlqaW50MTZfdCBub2RldHlwZTsgICAvKiA9PSBKRkZTMl9OT0RFVFlQRV9JTk9ERSAqLworCWppbnQzMl90IHRvdGxlbjsgICAgIC8qIFRvdGFsIGxlbmd0aCBvZiB0aGlzIG5vZGUgKGluYyBkYXRhLCBldGMuKSAqLworCWppbnQzMl90IGhkcl9jcmM7CisJamludDMyX3QgaW5vOyAgICAgICAgLyogSW5vZGUgbnVtYmVyLiAgKi8KKwlqaW50MzJfdCB2ZXJzaW9uOyAgICAvKiBWZXJzaW9uIG51bWJlci4gICovCisJam1vZGVfdCBtb2RlOyAgICAgICAvKiBUaGUgZmlsZSdzIHR5cGUgb3IgbW9kZS4gICovCisJamludDE2X3QgdWlkOyAgICAgICAgLyogVGhlIGZpbGUncyBvd25lci4gICovCisJamludDE2X3QgZ2lkOyAgICAgICAgLyogVGhlIGZpbGUncyBncm91cC4gICovCisJamludDMyX3QgaXNpemU7ICAgICAgLyogVG90YWwgcmVzdWx0YW50IHNpemUgb2YgdGhpcyBpbm9kZSAodXNlZCBmb3IgdHJ1bmNhdGlvbnMpICAqLworCWppbnQzMl90IGF0aW1lOyAgICAgIC8qIExhc3QgYWNjZXNzIHRpbWUuICAqLworCWppbnQzMl90IG10aW1lOyAgICAgIC8qIExhc3QgbW9kaWZpY2F0aW9uIHRpbWUuICAqLworCWppbnQzMl90IGN0aW1lOyAgICAgIC8qIENoYW5nZSB0aW1lLiAgKi8KKwlqaW50MzJfdCBvZmZzZXQ7ICAgICAvKiBXaGVyZSB0byBiZWdpbiB0byB3cml0ZS4gICovCisJamludDMyX3QgY3NpemU7ICAgICAgLyogKENvbXByZXNzZWQpIGRhdGEgc2l6ZSAqLworCWppbnQzMl90IGRzaXplOwkgICAgIC8qIFNpemUgb2YgdGhlIG5vZGUncyBkYXRhLiAoYWZ0ZXIgZGVjb21wcmVzc2lvbikgKi8KKwlfX3U4IGNvbXByOyAgICAgICAvKiBDb21wcmVzc2lvbiBhbGdvcml0aG0gdXNlZCAqLworCV9fdTggdXNlcmNvbXByOyAgIC8qIENvbXByZXNzaW9uIGFsZ29yaXRobSByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIgKi8KKwlqaW50MTZfdCBmbGFnczsJICAgICAvKiBTZWUgSkZGUzJfSU5PX0ZMQUdfKiAqLworCWppbnQzMl90IGRhdGFfY3JjOyAgIC8qIENSQyBmb3IgdGhlIChjb21wcmVzc2VkKSBkYXRhLiAgKi8KKwlqaW50MzJfdCBub2RlX2NyYzsgICAvKiBDUkMgZm9yIHRoZSByYXcgaW5vZGUgKGV4Y2x1ZGluZyBkYXRhKSAgKi8KKwlfX3U4IGRhdGFbMF07Cit9OworCitzdHJ1Y3QgamZmczJfcmF3X3hhdHRyIHsKKwlqaW50MTZfdCBtYWdpYzsKKwlqaW50MTZfdCBub2RldHlwZTsJLyogPSBKRkZTMl9OT0RFVFlQRV9YQVRUUiAqLworCWppbnQzMl90IHRvdGxlbjsKKwlqaW50MzJfdCBoZHJfY3JjOworCWppbnQzMl90IHhpZDsJCS8qIFhBVFRSIGlkZW50aWZpZXIgbnVtYmVyICovCisJamludDMyX3QgdmVyc2lvbjsKKwlfX3U4IHhwcmVmaXg7CisJX191OCBuYW1lX2xlbjsKKwlqaW50MTZfdCB2YWx1ZV9sZW47CisJamludDMyX3QgZGF0YV9jcmM7CisJamludDMyX3Qgbm9kZV9jcmM7CisJX191OCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGpmZnMyX3Jhd194cmVmCit7CisJamludDE2X3QgbWFnaWM7CisJamludDE2X3Qgbm9kZXR5cGU7CS8qID0gSkZGUzJfTk9ERVRZUEVfWFJFRiAqLworCWppbnQzMl90IHRvdGxlbjsKKwlqaW50MzJfdCBoZHJfY3JjOworCWppbnQzMl90IGlubzsJCS8qIGlub2RlIG51bWJlciAqLworCWppbnQzMl90IHhpZDsJCS8qIFhBVFRSIGlkZW50aWZpZXIgbnVtYmVyICovCisJamludDMyX3QgeHNlcW5vOwkvKiB4cmVmIHNlcXVlbnRpYWwgbnVtYmVyICovCisJamludDMyX3Qgbm9kZV9jcmM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgamZmczJfcmF3X3N1bW1hcnkKK3sKKwlqaW50MTZfdCBtYWdpYzsKKwlqaW50MTZfdCBub2RldHlwZTsgCS8qID0gSkZGUzJfTk9ERVRZUEVfU1VNTUFSWSAqLworCWppbnQzMl90IHRvdGxlbjsKKwlqaW50MzJfdCBoZHJfY3JjOworCWppbnQzMl90IHN1bV9udW07CS8qIG51bWJlciBvZiBzdW0gZW50cmllcyovCisJamludDMyX3QgY2xuX21rcjsJLyogY2xlYW4gbWFya2VyIHNpemUsIDAgPSBubyBjbGVhbm1hcmtlciAqLworCWppbnQzMl90IHBhZGRlZDsJLyogc3VtIG9mIHRoZSBzaXplIG9mIHBhZGRpbmcgbm9kZXMgKi8KKwlqaW50MzJfdCBzdW1fY3JjOwkvKiBzdW1tYXJ5IGluZm9ybWF0aW9uIGNyYyAqLworCWppbnQzMl90IG5vZGVfY3JjOyAJLyogbm9kZSBjcmMgKi8KKwlqaW50MzJfdCBzdW1bMF07IAkvKiBpbm9kZSBzdW1tYXJ5IGluZm8gKi8KK307CisKK3VuaW9uIGpmZnMyX25vZGVfdW5pb24KK3sKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlIGk7CisJc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgZDsKKwlzdHJ1Y3QgamZmczJfcmF3X3hhdHRyIHg7CisJc3RydWN0IGpmZnMyX3Jhd194cmVmIHI7CisJc3RydWN0IGpmZnMyX3Jhd19zdW1tYXJ5IHM7CisJc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSB1OworfTsKKworLyogRGF0YSBwYXlsb2FkIGZvciBkZXZpY2Ugbm9kZXMuICovCit1bmlvbiBqZmZzMl9kZXZpY2Vfbm9kZSB7CisJamludDE2X3Qgb2xkX2lkOworCWppbnQzMl90IG5ld19pZDsKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX0pGRlMyX0hfXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9qb3lzdGljay5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9qb3lzdGljay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzY2MWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2pveXN0aWNrLmgKQEAgLTAsMCArMSwxMzYgQEAKKyNpZm5kZWYgX0xJTlVYX0pPWVNUSUNLX0gKKyNkZWZpbmUgX0xJTlVYX0pPWVNUSUNLX0gKKworLyoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCBWb2p0ZWNoIFBhdmxpaworICoKKyAqICBTcG9uc29yZWQgYnkgU3VTRQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICogCisgKiBTaG91bGQgeW91IG5lZWQgdG8gY29udGFjdCBtZSwgdGhlIGF1dGhvciwgeW91IGNhbiBkbyBzbyBlaXRoZXIgYnkKKyAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDx2b2p0ZWNoQHN1c2UuY3o+LCBvciBieSBwYXBlciBtYWlsOgorICogVm9qdGVjaCBQYXZsaWssIFVjaXRlbHNrYSAxNTc2LCBQcmFndWUgOCwgMTgyIDAwIEN6ZWNoIFJlcHVibGljCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworLyoKKyAqIFZlcnNpb24KKyAqLworCisjZGVmaW5lIEpTX1ZFUlNJT04JCTB4MDIwMTAwCisKKy8qCisgKiBUeXBlcyBhbmQgY29uc3RhbnRzIGZvciByZWFkaW5nIGZyb20gL2Rldi9qcworICovCisKKyNkZWZpbmUgSlNfRVZFTlRfQlVUVE9OCQkweDAxCS8qIGJ1dHRvbiBwcmVzc2VkL3JlbGVhc2VkICovCisjZGVmaW5lIEpTX0VWRU5UX0FYSVMJCTB4MDIJLyogam95c3RpY2sgbW92ZWQgKi8KKyNkZWZpbmUgSlNfRVZFTlRfSU5JVAkJMHg4MAkvKiBpbml0aWFsIHN0YXRlIG9mIGRldmljZSAqLworCitzdHJ1Y3QganNfZXZlbnQgeworCV9fdTMyIHRpbWU7CS8qIGV2ZW50IHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgKi8KKwlfX3MxNiB2YWx1ZTsJLyogdmFsdWUgKi8KKwlfX3U4IHR5cGU7CS8qIGV2ZW50IHR5cGUgKi8KKwlfX3U4IG51bWJlcjsJLyogYXhpcy9idXR0b24gbnVtYmVyICovCit9OworCisvKgorICogSU9DVEwgY29tbWFuZHMgZm9yIGpveXN0aWNrIGRyaXZlcgorICovCisKKyNkZWZpbmUgSlNJT0NHVkVSU0lPTgkJX0lPUignaicsIDB4MDEsIF9fdTMyKQkJCQkvKiBnZXQgZHJpdmVyIHZlcnNpb24gKi8KKworI2RlZmluZSBKU0lPQ0dBWEVTCQlfSU9SKCdqJywgMHgxMSwgX191OCkJCQkJLyogZ2V0IG51bWJlciBvZiBheGVzICovCisjZGVmaW5lIEpTSU9DR0JVVFRPTlMJCV9JT1IoJ2onLCAweDEyLCBfX3U4KQkJCQkvKiBnZXQgbnVtYmVyIG9mIGJ1dHRvbnMgKi8KKyNkZWZpbmUgSlNJT0NHTkFNRShsZW4pCQlfSU9DKF9JT0NfUkVBRCwgJ2onLCAweDEzLCBsZW4pCQkJLyogZ2V0IGlkZW50aWZpZXIgc3RyaW5nICovCisKKyNkZWZpbmUgSlNJT0NTQ09SUgkJX0lPVygnaicsIDB4MjEsIHN0cnVjdCBqc19jb3JyKQkJCS8qIHNldCBjb3JyZWN0aW9uIHZhbHVlcyAqLworI2RlZmluZSBKU0lPQ0dDT1JSCQlfSU9SKCdqJywgMHgyMiwgc3RydWN0IGpzX2NvcnIpCQkJLyogZ2V0IGNvcnJlY3Rpb24gdmFsdWVzICovCisKKyNkZWZpbmUgSlNJT0NTQVhNQVAJCV9JT1coJ2onLCAweDMxLCBfX3U4W0FCU19DTlRdKQkJCS8qIHNldCBheGlzIG1hcHBpbmcgKi8KKyNkZWZpbmUgSlNJT0NHQVhNQVAJCV9JT1IoJ2onLCAweDMyLCBfX3U4W0FCU19DTlRdKQkJCS8qIGdldCBheGlzIG1hcHBpbmcgKi8KKyNkZWZpbmUgSlNJT0NTQlROTUFQCQlfSU9XKCdqJywgMHgzMywgX191MTZbS0VZX01BWCAtIEJUTl9NSVNDICsgMV0pCS8qIHNldCBidXR0b24gbWFwcGluZyAqLworI2RlZmluZSBKU0lPQ0dCVE5NQVAJCV9JT1IoJ2onLCAweDM0LCBfX3UxNltLRVlfTUFYIC0gQlROX01JU0MgKyAxXSkJLyogZ2V0IGJ1dHRvbiBtYXBwaW5nICovCisKKy8qCisgKiBUeXBlcyBhbmQgY29uc3RhbnRzIGZvciBnZXQvc2V0IGNvcnJlY3Rpb24KKyAqLworCisjZGVmaW5lIEpTX0NPUlJfTk9ORQkJMHgwMAkvKiByZXR1cm5zIHJhdyB2YWx1ZXMgKi8KKyNkZWZpbmUgSlNfQ09SUl9CUk9LRU4JCTB4MDEJLyogYnJva2VuIGxpbmUgKi8KKworc3RydWN0IGpzX2NvcnIgeworCV9fczMyIGNvZWZbOF07CisJX19zMTYgcHJlYzsKKwlfX3UxNiB0eXBlOworfTsKKworLyoKKyAqIHYwLnggY29tcGF0aWJpbGl0eSBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgSlNfUkVUVVJOCQlzaXplb2Yoc3RydWN0IEpTX0RBVEFfVFlQRSkKKyNkZWZpbmUgSlNfVFJVRQkJCTEKKyNkZWZpbmUgSlNfRkFMU0UJCTAKKyNkZWZpbmUgSlNfWF8wCQkJMHgwMQorI2RlZmluZSBKU19ZXzAJCQkweDAyCisjZGVmaW5lIEpTX1hfMQkJCTB4MDQKKyNkZWZpbmUgSlNfWV8xCQkJMHgwOAorI2RlZmluZSBKU19NQVgJCQkyCisKKyNkZWZpbmUgSlNfREVGX1RJTUVPVVQJCTB4MTMwMAorI2RlZmluZSBKU19ERUZfQ09SUgkJMAorI2RlZmluZSBKU19ERUZfVElNRUxJTUlUCTEwTAorCisjZGVmaW5lIEpTX1NFVF9DQUwJCTEKKyNkZWZpbmUgSlNfR0VUX0NBTAkJMgorI2RlZmluZSBKU19TRVRfVElNRU9VVAkJMworI2RlZmluZSBKU19HRVRfVElNRU9VVAkJNAorI2RlZmluZSBKU19TRVRfVElNRUxJTUlUCTUKKyNkZWZpbmUgSlNfR0VUX1RJTUVMSU1JVAk2CisjZGVmaW5lIEpTX0dFVF9BTEwJCTcKKyNkZWZpbmUgSlNfU0VUX0FMTAkJOAorCitzdHJ1Y3QgSlNfREFUQV9UWVBFIHsKKwlfX3MzMiBidXR0b25zOworCV9fczMyIHg7CisJX19zMzIgeTsKK307CisKK3N0cnVjdCBKU19EQVRBX1NBVkVfVFlQRV8zMiB7CisJX19zMzIgSlNfVElNRU9VVDsKKwlfX3MzMiBCVVNZOworCV9fczMyIEpTX0VYUElSRVRJTUU7CisJX19zMzIgSlNfVElNRUxJTUlUOworCXN0cnVjdCBKU19EQVRBX1RZUEUgSlNfU0FWRTsKKwlzdHJ1Y3QgSlNfREFUQV9UWVBFIEpTX0NPUlI7Cit9OworCitzdHJ1Y3QgSlNfREFUQV9TQVZFX1RZUEVfNjQgeworCV9fczMyIEpTX1RJTUVPVVQ7CisJX19zMzIgQlVTWTsKKwlfX3M2NCBKU19FWFBJUkVUSU1FOworCV9fczY0IEpTX1RJTUVMSU1JVDsKKwlzdHJ1Y3QgSlNfREFUQV9UWVBFIEpTX1NBVkU7CisJc3RydWN0IEpTX0RBVEFfVFlQRSBKU19DT1JSOworfTsKKworCisjZW5kaWYgLyogX0xJTlVYX0pPWVNUSUNLX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWIzY2U5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rZC5oCkBAIC0wLDAgKzEsMTg0IEBACisjaWZuZGVmIF9MSU5VWF9LRF9ICisjZGVmaW5lIF9MSU5VWF9LRF9ICisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisvKiAweDRCIGlzICdLJywgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggdGVybWlvcyBhbmQgdnQgKi8KKworI2RlZmluZSBHSU9fRk9OVAkweDRCNjAJLyogZ2V0cyBmb250IGluIGV4cGFuZGVkIGZvcm0gKi8KKyNkZWZpbmUgUElPX0ZPTlQJMHg0QjYxCS8qIHVzZSBmb250IGluIGV4cGFuZGVkIGZvcm0gKi8KKworI2RlZmluZSBHSU9fRk9OVFgJMHg0QjZCCS8qIGdldCBmb250IHVzaW5nIHN0cnVjdCBjb25zb2xlZm9udGRlc2MgKi8KKyNkZWZpbmUgUElPX0ZPTlRYCTB4NEI2QwkvKiBzZXQgZm9udCB1c2luZyBzdHJ1Y3QgY29uc29sZWZvbnRkZXNjICovCitzdHJ1Y3QgY29uc29sZWZvbnRkZXNjIHsKKwl1bnNpZ25lZCBzaG9ydCBjaGFyY291bnQ7CS8qIGNoYXJhY3RlcnMgaW4gZm9udCAoMjU2IG9yIDUxMikgKi8KKwl1bnNpZ25lZCBzaG9ydCBjaGFyaGVpZ2h0OwkvKiBzY2FuIGxpbmVzIHBlciBjaGFyYWN0ZXIgKDEtMzIpICovCisJY2hhciAqY2hhcmRhdGE7CQkvKiBmb250IGRhdGEgaW4gZXhwYW5kZWQgZm9ybSAqLworfTsKKworI2RlZmluZSBQSU9fRk9OVFJFU0VUICAgMHg0QjZECS8qIHJlc2V0IHRvIGRlZmF1bHQgZm9udCAqLworCisjZGVmaW5lIEdJT19DTUFQCTB4NEI3MAkvKiBnZXRzIGNvbG91ciBwYWxldHRlIG9uIFZHQSsgKi8KKyNkZWZpbmUgUElPX0NNQVAJMHg0QjcxCS8qIHNldHMgY29sb3VyIHBhbGV0dGUgb24gVkdBKyAqLworCisjZGVmaW5lIEtJT0NTT1VORAkweDRCMkYJLyogc3RhcnQgc291bmQgZ2VuZXJhdGlvbiAoMCBmb3Igb2ZmKSAqLworI2RlZmluZSBLRE1LVE9ORQkweDRCMzAJLyogZ2VuZXJhdGUgdG9uZSAqLworCisjZGVmaW5lIEtER0VUTEVECTB4NEIzMQkvKiByZXR1cm4gY3VycmVudCBsZWQgc3RhdGUgKi8KKyNkZWZpbmUgS0RTRVRMRUQJMHg0QjMyCS8qIHNldCBsZWQgc3RhdGUgW2xpZ2h0cywgbm90IGZsYWdzXSAqLworI2RlZmluZSAJTEVEX1NDUgkJMHgwMQkvKiBzY3JvbGwgbG9jayBsZWQgKi8KKyNkZWZpbmUgCUxFRF9OVU0JCTB4MDIJLyogbnVtIGxvY2sgbGVkICovCisjZGVmaW5lIAlMRURfQ0FQCQkweDA0CS8qIGNhcHMgbG9jayBsZWQgKi8KKworI2RlZmluZSBLREdLQlRZUEUJMHg0QjMzCS8qIGdldCBrZXlib2FyZCB0eXBlICovCisjZGVmaW5lIAlLQl84NAkJMHgwMQorI2RlZmluZSAJS0JfMTAxCQkweDAyIAkvKiB0aGlzIGlzIHdoYXQgd2UgYWx3YXlzIGFuc3dlciAqLworI2RlZmluZSAJS0JfT1RIRVIJMHgwMworCisjZGVmaW5lIEtEQURESU8JCTB4NEIzNAkvKiBhZGQgaS9vIHBvcnQgYXMgdmFsaWQgKi8KKyNkZWZpbmUgS0RERUxJTwkJMHg0QjM1CS8qIGRlbCBpL28gcG9ydCBhcyB2YWxpZCAqLworI2RlZmluZSBLREVOQUJJTwkweDRCMzYJLyogZW5hYmxlIGkvbyB0byB2aWRlbyBib2FyZCAqLworI2RlZmluZSBLRERJU0FCSU8JMHg0QjM3CS8qIGRpc2FibGUgaS9vIHRvIHZpZGVvIGJvYXJkICovCisKKyNkZWZpbmUgS0RTRVRNT0RFCTB4NEIzQQkvKiBzZXQgdGV4dC9ncmFwaGljcyBtb2RlICovCisjZGVmaW5lCQlLRF9URVhUCQkweDAwCisjZGVmaW5lCQlLRF9HUkFQSElDUwkweDAxCisjZGVmaW5lCQlLRF9URVhUMAkweDAyCS8qIG9ic29sZXRlICovCisjZGVmaW5lCQlLRF9URVhUMQkweDAzCS8qIG9ic29sZXRlICovCisjZGVmaW5lCQlLRF9UUkFOU1BBUkVOVAkweDA0CisjZGVmaW5lIEtER0VUTU9ERQkweDRCM0IJLyogZ2V0IGN1cnJlbnQgbW9kZSAqLworCisjZGVmaW5lIEtETUFQRElTUAkweDRCM0MJLyogbWFwIGRpc3BsYXkgaW50byBhZGRyZXNzIHNwYWNlICovCisjZGVmaW5lIEtEVU5NQVBESVNQCTB4NEIzRAkvKiB1bm1hcCBkaXNwbGF5IGZyb20gYWRkcmVzcyBzcGFjZSAqLworCit0eXBlZGVmIGNoYXIgc2Nybm1hcF90OworI2RlZmluZQkJRV9UQUJTWgkJMjU2CisjZGVmaW5lIEdJT19TQ1JOTUFQCTB4NEI0MAkvKiBnZXQgc2NyZWVuIG1hcHBpbmcgZnJvbSBrZXJuZWwgKi8KKyNkZWZpbmUgUElPX1NDUk5NQVAJMHg0QjQxCS8qIHB1dCBzY3JlZW4gbWFwcGluZyB0YWJsZSBpbiBrZXJuZWwgKi8KKyNkZWZpbmUgR0lPX1VOSVNDUk5NQVAgIDB4NEI2OQkvKiBnZXQgZnVsbCBVbmljb2RlIHNjcmVlbiBtYXBwaW5nICovCisjZGVmaW5lIFBJT19VTklTQ1JOTUFQICAweDRCNkEgIC8qIHNldCBmdWxsIFVuaWNvZGUgc2NyZWVuIG1hcHBpbmcgKi8KKworI2RlZmluZSBHSU9fVU5JTUFQCTB4NEI2NgkvKiBnZXQgdW5pY29kZS10by1mb250IG1hcHBpbmcgZnJvbSBrZXJuZWwgKi8KK3N0cnVjdCB1bmlwYWlyIHsKKwl1bnNpZ25lZCBzaG9ydCB1bmljb2RlOworCXVuc2lnbmVkIHNob3J0IGZvbnRwb3M7Cit9Oworc3RydWN0IHVuaW1hcGRlc2MgeworCXVuc2lnbmVkIHNob3J0IGVudHJ5X2N0OworCXN0cnVjdCB1bmlwYWlyICplbnRyaWVzOworfTsKKyNkZWZpbmUgUElPX1VOSU1BUAkweDRCNjcJLyogcHV0IHVuaWNvZGUtdG8tZm9udCBtYXBwaW5nIGluIGtlcm5lbCAqLworI2RlZmluZSBQSU9fVU5JTUFQQ0xSCTB4NEI2OAkvKiBjbGVhciB0YWJsZSwgcG9zc2libHkgYWR2aXNlIGhhc2ggYWxnb3JpdGhtICovCitzdHJ1Y3QgdW5pbWFwaW5pdCB7CisJdW5zaWduZWQgc2hvcnQgYWR2aXNlZF9oYXNoc2l6ZTsgIC8qIDAgaWYgbm8gb3BpbmlvbiAqLworCXVuc2lnbmVkIHNob3J0IGFkdmlzZWRfaGFzaHN0ZXA7ICAvKiAwIGlmIG5vIG9waW5pb24gKi8KKwl1bnNpZ25lZCBzaG9ydCBhZHZpc2VkX2hhc2hsZXZlbDsgLyogMCBpZiBubyBvcGluaW9uICovCit9OworCisjZGVmaW5lIFVOSV9ESVJFQ1RfQkFTRSAweEYwMDAJLyogc3RhcnQgb2YgRGlyZWN0IEZvbnQgUmVnaW9uICovCisjZGVmaW5lIFVOSV9ESVJFQ1RfTUFTSyAweDAxRkYJLyogRGlyZWN0IEZvbnQgUmVnaW9uIGJpdG1hc2sgKi8KKworI2RlZmluZQkJS19SQVcJCTB4MDAKKyNkZWZpbmUJCUtfWExBVEUJCTB4MDEKKyNkZWZpbmUJCUtfTUVESVVNUkFXCTB4MDIKKyNkZWZpbmUJCUtfVU5JQ09ERQkweDAzCisjZGVmaW5lCQlLX09GRgkJMHgwNAorI2RlZmluZSBLREdLQk1PREUJMHg0QjQ0CS8qIGdldHMgY3VycmVudCBrZXlib2FyZCBtb2RlICovCisjZGVmaW5lIEtEU0tCTU9ERQkweDRCNDUJLyogc2V0cyBjdXJyZW50IGtleWJvYXJkIG1vZGUgKi8KKworI2RlZmluZQkJS19NRVRBQklUCTB4MDMKKyNkZWZpbmUJCUtfRVNDUFJFRklYCTB4MDQKKyNkZWZpbmUgS0RHS0JNRVRBCTB4NEI2MgkvKiBnZXRzIG1ldGEga2V5IGhhbmRsaW5nIG1vZGUgKi8KKyNkZWZpbmUgS0RTS0JNRVRBCTB4NEI2MwkvKiBzZXRzIG1ldGEga2V5IGhhbmRsaW5nIG1vZGUgKi8KKworI2RlZmluZQkJS19TQ1JPTExMT0NLCTB4MDEKKyNkZWZpbmUJCUtfTlVNTE9DSwkweDAyCisjZGVmaW5lCQlLX0NBUFNMT0NLCTB4MDQKKyNkZWZpbmUJS0RHS0JMRUQJMHg0QjY0CS8qIGdldCBsZWQgZmxhZ3MgKG5vdCBsaWdodHMpICovCisjZGVmaW5lCUtEU0tCTEVECTB4NEI2NQkvKiBzZXQgbGVkIGZsYWdzIChub3QgbGlnaHRzKSAqLworCitzdHJ1Y3Qga2JlbnRyeSB7CisJdW5zaWduZWQgY2hhciBrYl90YWJsZTsKKwl1bnNpZ25lZCBjaGFyIGtiX2luZGV4OworCXVuc2lnbmVkIHNob3J0IGtiX3ZhbHVlOworfTsKKyNkZWZpbmUJCUtfTk9STVRBQgkweDAwCisjZGVmaW5lCQlLX1NISUZUVEFCCTB4MDEKKyNkZWZpbmUJCUtfQUxUVEFCCTB4MDIKKyNkZWZpbmUJCUtfQUxUU0hJRlRUQUIJMHgwMworCisjZGVmaW5lIEtER0tCRU5UCTB4NEI0NgkvKiBnZXRzIG9uZSBlbnRyeSBpbiB0cmFuc2xhdGlvbiB0YWJsZSAqLworI2RlZmluZSBLRFNLQkVOVAkweDRCNDcJLyogc2V0cyBvbmUgZW50cnkgaW4gdHJhbnNsYXRpb24gdGFibGUgKi8KKworc3RydWN0IGtic2VudHJ5IHsKKwl1bnNpZ25lZCBjaGFyIGtiX2Z1bmM7CisJdW5zaWduZWQgY2hhciBrYl9zdHJpbmdbNTEyXTsKK307CisjZGVmaW5lIEtER0tCU0VOVAkweDRCNDgJLyogZ2V0cyBvbmUgZnVuY3Rpb24ga2V5IHN0cmluZyBlbnRyeSAqLworI2RlZmluZSBLRFNLQlNFTlQJMHg0QjQ5CS8qIHNldHMgb25lIGZ1bmN0aW9uIGtleSBzdHJpbmcgZW50cnkgKi8KKworc3RydWN0IGtiZGlhY3IgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGRpYWNyLCBiYXNlLCByZXN1bHQ7Cit9Oworc3RydWN0IGtiZGlhY3JzIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGtiX2NudDsgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gZm9sbG93aW5nIGFycmF5ICovCisJc3RydWN0IGtiZGlhY3Iga2JkaWFjclsyNTZdOyAgICAvKiBNQVhfRElBQ1IgZnJvbSBrZXlib2FyZC5oICovCit9OworI2RlZmluZSBLREdLQkRJQUNSICAgICAgMHg0QjRBICAvKiByZWFkIGtlcm5lbCBhY2NlbnQgdGFibGUgKi8KKyNkZWZpbmUgS0RTS0JESUFDUiAgICAgIDB4NEI0QiAgLyogd3JpdGUga2VybmVsIGFjY2VudCB0YWJsZSAqLworCitzdHJ1Y3Qga2JkaWFjcnVjIHsKKwl1bnNpZ25lZCBpbnQgZGlhY3IsIGJhc2UsIHJlc3VsdDsKK307CitzdHJ1Y3Qga2JkaWFjcnN1YyB7CisgICAgICAgIHVuc2lnbmVkIGludCBrYl9jbnQ7ICAgIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIGZvbGxvd2luZyBhcnJheSAqLworCXN0cnVjdCBrYmRpYWNydWMga2JkaWFjcnVjWzI1Nl07ICAgIC8qIE1BWF9ESUFDUiBmcm9tIGtleWJvYXJkLmggKi8KK307CisjZGVmaW5lIEtER0tCRElBQ1JVQyAgICAweDRCRkEgIC8qIHJlYWQga2VybmVsIGFjY2VudCB0YWJsZSAtIFVDUyAqLworI2RlZmluZSBLRFNLQkRJQUNSVUMgICAgMHg0QkZCICAvKiB3cml0ZSBrZXJuZWwgYWNjZW50IHRhYmxlIC0gVUNTICovCisKK3N0cnVjdCBrYmtleWNvZGUgeworCXVuc2lnbmVkIGludCBzY2FuY29kZSwga2V5Y29kZTsKK307CisjZGVmaW5lIEtER0VUS0VZQ09ERQkweDRCNEMJLyogcmVhZCBrZXJuZWwga2V5Y29kZSB0YWJsZSBlbnRyeSAqLworI2RlZmluZSBLRFNFVEtFWUNPREUJMHg0QjRECS8qIHdyaXRlIGtlcm5lbCBrZXljb2RlIHRhYmxlIGVudHJ5ICovCisKKyNkZWZpbmUgS0RTSUdBQ0NFUFQJMHg0QjRFCS8qIGFjY2VwdCBrYmQgZ2VuZXJhdGVkIHNpZ25hbHMgKi8KKworc3RydWN0IGtiZF9yZXBlYXQgeworCWludCBkZWxheTsJLyogaW4gbXNlYzsgPD0gMDogZG9uJ3QgY2hhbmdlICovCisJaW50IHBlcmlvZDsJLyogaW4gbXNlYzsgPD0gMDogZG9uJ3QgY2hhbmdlICovCisJCQkvKiBlYXJsaWVyIHRoaXMgZmllbGQgd2FzIG1pc25hbWVkICJyYXRlIiAqLworfTsKKworI2RlZmluZSBLREtCRFJFUCAgICAgICAgMHg0QjUyICAvKiBzZXQga2V5Ym9hcmQgZGVsYXkvcmVwZWF0IHJhdGU7CisJCQkJICogYWN0dWFsbHkgdXNlZCB2YWx1ZXMgYXJlIHJldHVybmVkICovCisKKyNkZWZpbmUgS0RGT05UT1AJMHg0QjcyCS8qIGZvbnQgb3BlcmF0aW9ucyAqLworCitzdHJ1Y3QgY29uc29sZV9mb250X29wIHsKKwl1bnNpZ25lZCBpbnQgb3A7CS8qIG9wZXJhdGlvbiBjb2RlIEtEX0ZPTlRfT1BfKiAqLworCXVuc2lnbmVkIGludCBmbGFnczsJLyogS0RfRk9OVF9GTEFHXyogKi8KKwl1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodDsJLyogZm9udCBzaXplICovCisJdW5zaWduZWQgaW50IGNoYXJjb3VudDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOwkvKiBmb250IGRhdGEgd2l0aCBoZWlnaHQgZml4ZWQgdG8gMzIgKi8KK307CisKK3N0cnVjdCBjb25zb2xlX2ZvbnQgeworCXVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OwkvKiBmb250IHNpemUgKi8KKwl1bnNpZ25lZCBpbnQgY2hhcmNvdW50OworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CS8qIGZvbnQgZGF0YSB3aXRoIGhlaWdodCBmaXhlZCB0byAzMiAqLworfTsKKworI2RlZmluZSBLRF9GT05UX09QX1NFVAkJMAkvKiBTZXQgZm9udCAqLworI2RlZmluZSBLRF9GT05UX09QX0dFVAkJMQkvKiBHZXQgZm9udCAqLworI2RlZmluZSBLRF9GT05UX09QX1NFVF9ERUZBVUxUCTIJLyogU2V0IGZvbnQgdG8gZGVmYXVsdCwgZGF0YSBwb2ludHMgdG8gbmFtZSAvIE5VTEwgKi8KKyNkZWZpbmUgS0RfRk9OVF9PUF9DT1BZCQkzCS8qIENvcHkgZnJvbSBhbm90aGVyIGNvbnNvbGUgKi8KKworI2RlZmluZSBLRF9GT05UX0ZMQUdfRE9OVF9SRUNBTEMgCTEJLyogRG9uJ3QgcmVjYWxjdWxhdGUgaHcgY2hhcmNlbGwgc2l6ZSBbY29tcGF0XSAqLworCisvKiBub3RlOiAweDRCMDAtMHg0QjRFIGFsbCBoYXZlIGhhZCBhIHZhbHVlIGF0IHNvbWUgdGltZTsKKyAgIGRvbid0IHJldXNlIGZvciB0aGUgdGltZSBiZWluZyAqLworLyogbm90ZTogMHg0QjYwLTB4NEI2RCwgMHg0QjcwLTB4NEI3MiB1c2VkIGFib3ZlICovCisKKyNlbmRpZiAvKiBfTElOVVhfS0RfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rZGV2X3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2Rldl90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1NTUxZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2Rldl90LmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfTElOVVhfS0RFVl9UX0gKKyNkZWZpbmUgX0xJTlVYX0tERVZfVF9ICisKKy8qCitTb21lIHByb2dyYW1zIHdhbnQgdGhlaXIgZGVmaW5pdGlvbnMgb2YgTUFKT1IgYW5kIE1JTk9SIGFuZCBNS0RFVgorZnJvbSB0aGUga2VybmVsIHNvdXJjZXMuIFRoZXNlIG11c3QgYmUgdGhlIGV4dGVybmFsbHkgdmlzaWJsZSBvbmVzLgorKi8KKyNkZWZpbmUgTUFKT1IoZGV2KQkoKGRldik+PjgpCisjZGVmaW5lIE1JTk9SKGRldikJKChkZXYpICYgMHhmZikKKyNkZWZpbmUgTUtERVYobWEsbWkpCSgobWEpPDw4IHwgKG1pKSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2VybmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRjNTlmNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTAsMCArMSwyOSBAQAorI2lmbmRlZiBfTElOVVhfS0VSTkVMX0gKKyNkZWZpbmUgX0xJTlVYX0tFUk5FTF9ICisKKy8qCisgKiAna2VybmVsLmgnIGNvbnRhaW5zIHNvbWUgb2Z0ZW4tdXNlZCBmdW5jdGlvbiBwcm90b3R5cGVzIGV0YworICovCisjZGVmaW5lIF9fQUxJR05fS0VSTkVMKHgsIGEpCQlfX0FMSUdOX0tFUk5FTF9NQVNLKHgsICh0eXBlb2YoeCkpKGEpIC0gMSkKKyNkZWZpbmUgX19BTElHTl9LRVJORUxfTUFTSyh4LCBtYXNrKQkoKCh4KSArIChtYXNrKSkgJiB+KG1hc2spKQorCisKKyNkZWZpbmUgU0lfTE9BRF9TSElGVAkxNgorc3RydWN0IHN5c2luZm8geworCWxvbmcgdXB0aW1lOwkJCS8qIFNlY29uZHMgc2luY2UgYm9vdCAqLworCXVuc2lnbmVkIGxvbmcgbG9hZHNbM107CQkvKiAxLCA1LCBhbmQgMTUgbWludXRlIGxvYWQgYXZlcmFnZXMgKi8KKwl1bnNpZ25lZCBsb25nIHRvdGFscmFtOwkJLyogVG90YWwgdXNhYmxlIG1haW4gbWVtb3J5IHNpemUgKi8KKwl1bnNpZ25lZCBsb25nIGZyZWVyYW07CQkvKiBBdmFpbGFibGUgbWVtb3J5IHNpemUgKi8KKwl1bnNpZ25lZCBsb25nIHNoYXJlZHJhbTsJLyogQW1vdW50IG9mIHNoYXJlZCBtZW1vcnkgKi8KKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnJhbTsJLyogTWVtb3J5IHVzZWQgYnkgYnVmZmVycyAqLworCXVuc2lnbmVkIGxvbmcgdG90YWxzd2FwOwkvKiBUb3RhbCBzd2FwIHNwYWNlIHNpemUgKi8KKwl1bnNpZ25lZCBsb25nIGZyZWVzd2FwOwkJLyogc3dhcCBzcGFjZSBzdGlsbCBhdmFpbGFibGUgKi8KKwl1bnNpZ25lZCBzaG9ydCBwcm9jczsJCS8qIE51bWJlciBvZiBjdXJyZW50IHByb2Nlc3NlcyAqLworCXVuc2lnbmVkIHNob3J0IHBhZDsJCS8qIGV4cGxpY2l0IHBhZGRpbmcgZm9yIG02OGsgKi8KKwl1bnNpZ25lZCBsb25nIHRvdGFsaGlnaDsJLyogVG90YWwgaGlnaCBtZW1vcnkgc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcgZnJlZWhpZ2g7CQkvKiBBdmFpbGFibGUgaGlnaCBtZW1vcnkgc2l6ZSAqLworCXVuc2lnbmVkIGludCBtZW1fdW5pdDsJCS8qIE1lbW9yeSB1bml0IHNpemUgaW4gYnl0ZXMgKi8KKwljaGFyIF9mWzIwLTIqc2l6ZW9mKGxvbmcpLXNpemVvZihpbnQpXTsJLyogUGFkZGluZzogbGliYzUgdXNlcyB0aGlzLi4gKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rZXJuZWxjYXBpLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tlcm5lbGNhcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmY2YjQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rZXJuZWxjYXBpLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqICRJZDoga2VybmVsY2FwaS5oLHYgMS44LjYuMiAyMDAxLzAyLzA3IDExOjMxOjMxIGthaSBFeHAgJAorICogCisgKiBLZXJuZWwgQ0FQSSAyLjAgSW50ZXJmYWNlIGZvciBMaW51eAorICogCisgKiAoYykgQ29weXJpZ2h0IDE5OTcgYnkgQ2Fyc3RlbiBQYWV0aCAoY2FsbGVAY2FsbGUuaW4tYmVybGluLmRlKQorICogCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTENBUElfSF9fCisjZGVmaW5lIF9fS0VSTkVMQ0FQSV9IX18KKworI2RlZmluZSBDQVBJX01BWEFQUEwJMjQwCS8qIG1heGltdW0gbnVtYmVyIG9mIGFwcGxpY2F0aW9ucyAgKi8KKyNkZWZpbmUgQ0FQSV9NQVhDT05UUgkzMgkvKiBtYXhpbXVtIG51bWJlciBvZiBjb250cm9sbGVyICAgICovCisjZGVmaW5lIENBUElfTUFYREFUQVdJTkRPVwk4CisKKwordHlwZWRlZiBzdHJ1Y3Qga2NhcGlfZmxhZ2RlZiB7CisJaW50IGNvbnRyOworCWludCBmbGFnOworfSBrY2FwaV9mbGFnZGVmOworCit0eXBlZGVmIHN0cnVjdCBrY2FwaV9jYXJkZGVmIHsKKwljaGFyCQlkcml2ZXJbMzJdOworCXVuc2lnbmVkIGludAlwb3J0OworCXVuc2lnbmVkCWlycTsKKwl1bnNpZ25lZCBpbnQJbWVtYmFzZTsKKwlpbnQJCWNhcmRucjsKK30ga2NhcGlfY2FyZGRlZjsKKworLyogbmV3IGlvY3RscyA+PSAxMCAqLworI2RlZmluZSBLQ0FQSV9DTURfVFJBQ0UJCTEwCisjZGVmaW5lIEtDQVBJX0NNRF9BRERDQVJECTExCS8qIE9CU09MRVRFICovCisKKy8qIAorICogZmxhZyA+IDIgPT4gdHJhY2UgYWxzbyBkYXRhCisgKiBmbGFnICYgMSA9PiBzaG93IHRyYWNlCisgKi8KKyNkZWZpbmUgS0NBUElfVFJBQ0VfT0ZGCQkJMAorI2RlZmluZSBLQ0FQSV9UUkFDRV9TSE9SVF9OT19EQVRBCTEKKyNkZWZpbmUgS0NBUElfVFJBQ0VfRlVMTF9OT19EQVRBCTIKKyNkZWZpbmUgS0NBUElfVFJBQ0VfU0hPUlQJCTMKKyNkZWZpbmUgS0NBUElfVFJBQ0VfRlVMTAkJNAorCisKKworI2VuZGlmCQkJCS8qIF9fS0VSTkVMQ0FQSV9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2V5Ym9hcmQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2V5Ym9hcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2YzMTZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rZXlib2FyZC5oCkBAIC0wLDAgKzEsNDQzIEBACisjaWZuZGVmIF9fTElOVVhfS0VZQk9BUkRfSAorI2RlZmluZSBfX0xJTlVYX0tFWUJPQVJEX0gKKworI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2RlZmluZSBLR19TSElGVAkwCisjZGVmaW5lIEtHX0NUUkwJCTIKKyNkZWZpbmUgS0dfQUxUCQkzCisjZGVmaW5lIEtHX0FMVEdSCTEKKyNkZWZpbmUgS0dfU0hJRlRMCTQKKyNkZWZpbmUgS0dfS0FOQVNISUZUCTQKKyNkZWZpbmUgS0dfU0hJRlRSCTUKKyNkZWZpbmUgS0dfQ1RSTEwJNgorI2RlZmluZSBLR19DVFJMUgk3CisjZGVmaW5lIEtHX0NBUFNTSElGVAk4CisKKyNkZWZpbmUgTlJfU0hJRlQJOQorCisjZGVmaW5lIE5SX0tFWVMJCTI1NgorI2RlZmluZSBNQVhfTlJfS0VZTUFQUwkyNTYKKy8qIFRoaXMgbWVhbnMgMTI4S2IgaWYgYWxsIGtleW1hcHMgYXJlIGFsbG9jYXRlZC4gT25seSB0aGUgc3VwZXJ1c2VyCisJbWF5IGluY3JlYXNlIHRoZSBudW1iZXIgb2Yga2V5bWFwcyBiZXlvbmQgTUFYX05SX09GX1VTRVJfS0VZTUFQUy4gKi8KKyNkZWZpbmUgTUFYX05SX09GX1VTRVJfS0VZTUFQUyAyNTYgCS8qIHNob3VsZCBiZSBhdCBsZWFzdCA3ICovCisKKworI2RlZmluZSBNQVhfTlJfRlVOQwkyNTYJLyogbWF4IG5yIG9mIHN0cmluZ3MgYXNzaWduZWQgdG8ga2V5cyAqLworCisjZGVmaW5lIEtUX0xBVElOCTAJLyogd2UgZGVwZW5kIG9uIHRoaXMgYmVpbmcgemVybyAqLworI2RlZmluZSBLVF9MRVRURVIJMTEJLyogc3ltYm9sIHRoYXQgY2FuIGJlIGFjdGVkIHVwb24gYnkgQ2Fwc0xvY2sgKi8KKyNkZWZpbmUgS1RfRk4JCTEKKyNkZWZpbmUgS1RfU1BFQwkJMgorI2RlZmluZSBLVF9QQUQJCTMKKyNkZWZpbmUgS1RfREVBRAkJNAorI2RlZmluZSBLVF9DT05TCQk1CisjZGVmaW5lIEtUX0NVUgkJNgorI2RlZmluZSBLVF9TSElGVAk3CisjZGVmaW5lIEtUX01FVEEJCTgKKyNkZWZpbmUgS1RfQVNDSUkJOQorI2RlZmluZSBLVF9MT0NLCQkxMAorI2RlZmluZSBLVF9TTE9DSwkxMgorI2RlZmluZSBLVF9ERUFEMgkxMworI2RlZmluZSBLVF9CUkwJCTE0CisKKyNkZWZpbmUgSyh0LHYpCQkoKCh0KTw8OCl8KHYpKQorI2RlZmluZSBLVFlQKHgpCQkoKHgpID4+IDgpCisjZGVmaW5lIEtWQUwoeCkJCSgoeCkgJiAweGZmKQorCisjZGVmaW5lIEtfRjEJCUsoS1RfRk4sMCkKKyNkZWZpbmUgS19GMgkJSyhLVF9GTiwxKQorI2RlZmluZSBLX0YzCQlLKEtUX0ZOLDIpCisjZGVmaW5lIEtfRjQJCUsoS1RfRk4sMykKKyNkZWZpbmUgS19GNQkJSyhLVF9GTiw0KQorI2RlZmluZSBLX0Y2CQlLKEtUX0ZOLDUpCisjZGVmaW5lIEtfRjcJCUsoS1RfRk4sNikKKyNkZWZpbmUgS19GOAkJSyhLVF9GTiw3KQorI2RlZmluZSBLX0Y5CQlLKEtUX0ZOLDgpCisjZGVmaW5lIEtfRjEwCQlLKEtUX0ZOLDkpCisjZGVmaW5lIEtfRjExCQlLKEtUX0ZOLDEwKQorI2RlZmluZSBLX0YxMgkJSyhLVF9GTiwxMSkKKyNkZWZpbmUgS19GMTMJCUsoS1RfRk4sMTIpCisjZGVmaW5lIEtfRjE0CQlLKEtUX0ZOLDEzKQorI2RlZmluZSBLX0YxNQkJSyhLVF9GTiwxNCkKKyNkZWZpbmUgS19GMTYJCUsoS1RfRk4sMTUpCisjZGVmaW5lIEtfRjE3CQlLKEtUX0ZOLDE2KQorI2RlZmluZSBLX0YxOAkJSyhLVF9GTiwxNykKKyNkZWZpbmUgS19GMTkJCUsoS1RfRk4sMTgpCisjZGVmaW5lIEtfRjIwCQlLKEtUX0ZOLDE5KQorI2RlZmluZSBLX0ZJTkQJCUsoS1RfRk4sMjApCisjZGVmaW5lIEtfSU5TRVJUCUsoS1RfRk4sMjEpCisjZGVmaW5lIEtfUkVNT1ZFCUsoS1RfRk4sMjIpCisjZGVmaW5lIEtfU0VMRUNUCUsoS1RfRk4sMjMpCisjZGVmaW5lIEtfUEdVUAkJSyhLVF9GTiwyNCkgLyogUEdVUCBpcyBhIHN5bm9ueW0gZm9yIFBSSU9SICovCisjZGVmaW5lIEtfUEdETgkJSyhLVF9GTiwyNSkgLyogUEdETiBpcyBhIHN5bm9ueW0gZm9yIE5FWFQgKi8KKyNkZWZpbmUgS19NQUNSTwkgCUsoS1RfRk4sMjYpCisjZGVmaW5lIEtfSEVMUAkJSyhLVF9GTiwyNykKKyNkZWZpbmUgS19ETwkJSyhLVF9GTiwyOCkKKyNkZWZpbmUgS19QQVVTRQkgCUsoS1RfRk4sMjkpCisjZGVmaW5lIEtfRjIxCQlLKEtUX0ZOLDMwKQorI2RlZmluZSBLX0YyMgkJSyhLVF9GTiwzMSkKKyNkZWZpbmUgS19GMjMJCUsoS1RfRk4sMzIpCisjZGVmaW5lIEtfRjI0CQlLKEtUX0ZOLDMzKQorI2RlZmluZSBLX0YyNQkJSyhLVF9GTiwzNCkKKyNkZWZpbmUgS19GMjYJCUsoS1RfRk4sMzUpCisjZGVmaW5lIEtfRjI3CQlLKEtUX0ZOLDM2KQorI2RlZmluZSBLX0YyOAkJSyhLVF9GTiwzNykKKyNkZWZpbmUgS19GMjkJCUsoS1RfRk4sMzgpCisjZGVmaW5lIEtfRjMwCQlLKEtUX0ZOLDM5KQorI2RlZmluZSBLX0YzMQkJSyhLVF9GTiw0MCkKKyNkZWZpbmUgS19GMzIJCUsoS1RfRk4sNDEpCisjZGVmaW5lIEtfRjMzCQlLKEtUX0ZOLDQyKQorI2RlZmluZSBLX0YzNAkJSyhLVF9GTiw0MykKKyNkZWZpbmUgS19GMzUJCUsoS1RfRk4sNDQpCisjZGVmaW5lIEtfRjM2CQlLKEtUX0ZOLDQ1KQorI2RlZmluZSBLX0YzNwkJSyhLVF9GTiw0NikKKyNkZWZpbmUgS19GMzgJCUsoS1RfRk4sNDcpCisjZGVmaW5lIEtfRjM5CQlLKEtUX0ZOLDQ4KQorI2RlZmluZSBLX0Y0MAkJSyhLVF9GTiw0OSkKKyNkZWZpbmUgS19GNDEJCUsoS1RfRk4sNTApCisjZGVmaW5lIEtfRjQyCQlLKEtUX0ZOLDUxKQorI2RlZmluZSBLX0Y0MwkJSyhLVF9GTiw1MikKKyNkZWZpbmUgS19GNDQJCUsoS1RfRk4sNTMpCisjZGVmaW5lIEtfRjQ1CQlLKEtUX0ZOLDU0KQorI2RlZmluZSBLX0Y0NgkJSyhLVF9GTiw1NSkKKyNkZWZpbmUgS19GNDcJCUsoS1RfRk4sNTYpCisjZGVmaW5lIEtfRjQ4CQlLKEtUX0ZOLDU3KQorI2RlZmluZSBLX0Y0OQkJSyhLVF9GTiw1OCkKKyNkZWZpbmUgS19GNTAJCUsoS1RfRk4sNTkpCisjZGVmaW5lIEtfRjUxCQlLKEtUX0ZOLDYwKQorI2RlZmluZSBLX0Y1MgkJSyhLVF9GTiw2MSkKKyNkZWZpbmUgS19GNTMJCUsoS1RfRk4sNjIpCisjZGVmaW5lIEtfRjU0CQlLKEtUX0ZOLDYzKQorI2RlZmluZSBLX0Y1NQkJSyhLVF9GTiw2NCkKKyNkZWZpbmUgS19GNTYJCUsoS1RfRk4sNjUpCisjZGVmaW5lIEtfRjU3CQlLKEtUX0ZOLDY2KQorI2RlZmluZSBLX0Y1OAkJSyhLVF9GTiw2NykKKyNkZWZpbmUgS19GNTkJCUsoS1RfRk4sNjgpCisjZGVmaW5lIEtfRjYwCQlLKEtUX0ZOLDY5KQorI2RlZmluZSBLX0Y2MQkJSyhLVF9GTiw3MCkKKyNkZWZpbmUgS19GNjIJCUsoS1RfRk4sNzEpCisjZGVmaW5lIEtfRjYzCQlLKEtUX0ZOLDcyKQorI2RlZmluZSBLX0Y2NAkJSyhLVF9GTiw3MykKKyNkZWZpbmUgS19GNjUJCUsoS1RfRk4sNzQpCisjZGVmaW5lIEtfRjY2CQlLKEtUX0ZOLDc1KQorI2RlZmluZSBLX0Y2NwkJSyhLVF9GTiw3NikKKyNkZWZpbmUgS19GNjgJCUsoS1RfRk4sNzcpCisjZGVmaW5lIEtfRjY5CQlLKEtUX0ZOLDc4KQorI2RlZmluZSBLX0Y3MAkJSyhLVF9GTiw3OSkKKyNkZWZpbmUgS19GNzEJCUsoS1RfRk4sODApCisjZGVmaW5lIEtfRjcyCQlLKEtUX0ZOLDgxKQorI2RlZmluZSBLX0Y3MwkJSyhLVF9GTiw4MikKKyNkZWZpbmUgS19GNzQJCUsoS1RfRk4sODMpCisjZGVmaW5lIEtfRjc1CQlLKEtUX0ZOLDg0KQorI2RlZmluZSBLX0Y3NgkJSyhLVF9GTiw4NSkKKyNkZWZpbmUgS19GNzcJCUsoS1RfRk4sODYpCisjZGVmaW5lIEtfRjc4CQlLKEtUX0ZOLDg3KQorI2RlZmluZSBLX0Y3OQkJSyhLVF9GTiw4OCkKKyNkZWZpbmUgS19GODAJCUsoS1RfRk4sODkpCisjZGVmaW5lIEtfRjgxCQlLKEtUX0ZOLDkwKQorI2RlZmluZSBLX0Y4MgkJSyhLVF9GTiw5MSkKKyNkZWZpbmUgS19GODMJCUsoS1RfRk4sOTIpCisjZGVmaW5lIEtfRjg0CQlLKEtUX0ZOLDkzKQorI2RlZmluZSBLX0Y4NQkJSyhLVF9GTiw5NCkKKyNkZWZpbmUgS19GODYJCUsoS1RfRk4sOTUpCisjZGVmaW5lIEtfRjg3CQlLKEtUX0ZOLDk2KQorI2RlZmluZSBLX0Y4OAkJSyhLVF9GTiw5NykKKyNkZWZpbmUgS19GODkJCUsoS1RfRk4sOTgpCisjZGVmaW5lIEtfRjkwCQlLKEtUX0ZOLDk5KQorI2RlZmluZSBLX0Y5MQkJSyhLVF9GTiwxMDApCisjZGVmaW5lIEtfRjkyCQlLKEtUX0ZOLDEwMSkKKyNkZWZpbmUgS19GOTMJCUsoS1RfRk4sMTAyKQorI2RlZmluZSBLX0Y5NAkJSyhLVF9GTiwxMDMpCisjZGVmaW5lIEtfRjk1CQlLKEtUX0ZOLDEwNCkKKyNkZWZpbmUgS19GOTYJCUsoS1RfRk4sMTA1KQorI2RlZmluZSBLX0Y5NwkJSyhLVF9GTiwxMDYpCisjZGVmaW5lIEtfRjk4CQlLKEtUX0ZOLDEwNykKKyNkZWZpbmUgS19GOTkJCUsoS1RfRk4sMTA4KQorI2RlZmluZSBLX0YxMDAJCUsoS1RfRk4sMTA5KQorI2RlZmluZSBLX0YxMDEJCUsoS1RfRk4sMTEwKQorI2RlZmluZSBLX0YxMDIJCUsoS1RfRk4sMTExKQorI2RlZmluZSBLX0YxMDMJCUsoS1RfRk4sMTEyKQorI2RlZmluZSBLX0YxMDQJCUsoS1RfRk4sMTEzKQorI2RlZmluZSBLX0YxMDUJCUsoS1RfRk4sMTE0KQorI2RlZmluZSBLX0YxMDYJCUsoS1RfRk4sMTE1KQorI2RlZmluZSBLX0YxMDcJCUsoS1RfRk4sMTE2KQorI2RlZmluZSBLX0YxMDgJCUsoS1RfRk4sMTE3KQorI2RlZmluZSBLX0YxMDkJCUsoS1RfRk4sMTE4KQorI2RlZmluZSBLX0YxMTAJCUsoS1RfRk4sMTE5KQorI2RlZmluZSBLX0YxMTEJCUsoS1RfRk4sMTIwKQorI2RlZmluZSBLX0YxMTIJCUsoS1RfRk4sMTIxKQorI2RlZmluZSBLX0YxMTMJCUsoS1RfRk4sMTIyKQorI2RlZmluZSBLX0YxMTQJCUsoS1RfRk4sMTIzKQorI2RlZmluZSBLX0YxMTUJCUsoS1RfRk4sMTI0KQorI2RlZmluZSBLX0YxMTYJCUsoS1RfRk4sMTI1KQorI2RlZmluZSBLX0YxMTcJCUsoS1RfRk4sMTI2KQorI2RlZmluZSBLX0YxMTgJCUsoS1RfRk4sMTI3KQorI2RlZmluZSBLX0YxMTkJCUsoS1RfRk4sMTI4KQorI2RlZmluZSBLX0YxMjAJCUsoS1RfRk4sMTI5KQorI2RlZmluZSBLX0YxMjEJCUsoS1RfRk4sMTMwKQorI2RlZmluZSBLX0YxMjIJCUsoS1RfRk4sMTMxKQorI2RlZmluZSBLX0YxMjMJCUsoS1RfRk4sMTMyKQorI2RlZmluZSBLX0YxMjQJCUsoS1RfRk4sMTMzKQorI2RlZmluZSBLX0YxMjUJCUsoS1RfRk4sMTM0KQorI2RlZmluZSBLX0YxMjYJCUsoS1RfRk4sMTM1KQorI2RlZmluZSBLX0YxMjcJCUsoS1RfRk4sMTM2KQorI2RlZmluZSBLX0YxMjgJCUsoS1RfRk4sMTM3KQorI2RlZmluZSBLX0YxMjkJCUsoS1RfRk4sMTM4KQorI2RlZmluZSBLX0YxMzAJCUsoS1RfRk4sMTM5KQorI2RlZmluZSBLX0YxMzEJCUsoS1RfRk4sMTQwKQorI2RlZmluZSBLX0YxMzIJCUsoS1RfRk4sMTQxKQorI2RlZmluZSBLX0YxMzMJCUsoS1RfRk4sMTQyKQorI2RlZmluZSBLX0YxMzQJCUsoS1RfRk4sMTQzKQorI2RlZmluZSBLX0YxMzUJCUsoS1RfRk4sMTQ0KQorI2RlZmluZSBLX0YxMzYJCUsoS1RfRk4sMTQ1KQorI2RlZmluZSBLX0YxMzcJCUsoS1RfRk4sMTQ2KQorI2RlZmluZSBLX0YxMzgJCUsoS1RfRk4sMTQ3KQorI2RlZmluZSBLX0YxMzkJCUsoS1RfRk4sMTQ4KQorI2RlZmluZSBLX0YxNDAJCUsoS1RfRk4sMTQ5KQorI2RlZmluZSBLX0YxNDEJCUsoS1RfRk4sMTUwKQorI2RlZmluZSBLX0YxNDIJCUsoS1RfRk4sMTUxKQorI2RlZmluZSBLX0YxNDMJCUsoS1RfRk4sMTUyKQorI2RlZmluZSBLX0YxNDQJCUsoS1RfRk4sMTUzKQorI2RlZmluZSBLX0YxNDUJCUsoS1RfRk4sMTU0KQorI2RlZmluZSBLX0YxNDYJCUsoS1RfRk4sMTU1KQorI2RlZmluZSBLX0YxNDcJCUsoS1RfRk4sMTU2KQorI2RlZmluZSBLX0YxNDgJCUsoS1RfRk4sMTU3KQorI2RlZmluZSBLX0YxNDkJCUsoS1RfRk4sMTU4KQorI2RlZmluZSBLX0YxNTAJCUsoS1RfRk4sMTU5KQorI2RlZmluZSBLX0YxNTEJCUsoS1RfRk4sMTYwKQorI2RlZmluZSBLX0YxNTIJCUsoS1RfRk4sMTYxKQorI2RlZmluZSBLX0YxNTMJCUsoS1RfRk4sMTYyKQorI2RlZmluZSBLX0YxNTQJCUsoS1RfRk4sMTYzKQorI2RlZmluZSBLX0YxNTUJCUsoS1RfRk4sMTY0KQorI2RlZmluZSBLX0YxNTYJCUsoS1RfRk4sMTY1KQorI2RlZmluZSBLX0YxNTcJCUsoS1RfRk4sMTY2KQorI2RlZmluZSBLX0YxNTgJCUsoS1RfRk4sMTY3KQorI2RlZmluZSBLX0YxNTkJCUsoS1RfRk4sMTY4KQorI2RlZmluZSBLX0YxNjAJCUsoS1RfRk4sMTY5KQorI2RlZmluZSBLX0YxNjEJCUsoS1RfRk4sMTcwKQorI2RlZmluZSBLX0YxNjIJCUsoS1RfRk4sMTcxKQorI2RlZmluZSBLX0YxNjMJCUsoS1RfRk4sMTcyKQorI2RlZmluZSBLX0YxNjQJCUsoS1RfRk4sMTczKQorI2RlZmluZSBLX0YxNjUJCUsoS1RfRk4sMTc0KQorI2RlZmluZSBLX0YxNjYJCUsoS1RfRk4sMTc1KQorI2RlZmluZSBLX0YxNjcJCUsoS1RfRk4sMTc2KQorI2RlZmluZSBLX0YxNjgJCUsoS1RfRk4sMTc3KQorI2RlZmluZSBLX0YxNjkJCUsoS1RfRk4sMTc4KQorI2RlZmluZSBLX0YxNzAJCUsoS1RfRk4sMTc5KQorI2RlZmluZSBLX0YxNzEJCUsoS1RfRk4sMTgwKQorI2RlZmluZSBLX0YxNzIJCUsoS1RfRk4sMTgxKQorI2RlZmluZSBLX0YxNzMJCUsoS1RfRk4sMTgyKQorI2RlZmluZSBLX0YxNzQJCUsoS1RfRk4sMTgzKQorI2RlZmluZSBLX0YxNzUJCUsoS1RfRk4sMTg0KQorI2RlZmluZSBLX0YxNzYJCUsoS1RfRk4sMTg1KQorI2RlZmluZSBLX0YxNzcJCUsoS1RfRk4sMTg2KQorI2RlZmluZSBLX0YxNzgJCUsoS1RfRk4sMTg3KQorI2RlZmluZSBLX0YxNzkJCUsoS1RfRk4sMTg4KQorI2RlZmluZSBLX0YxODAJCUsoS1RfRk4sMTg5KQorI2RlZmluZSBLX0YxODEJCUsoS1RfRk4sMTkwKQorI2RlZmluZSBLX0YxODIJCUsoS1RfRk4sMTkxKQorI2RlZmluZSBLX0YxODMJCUsoS1RfRk4sMTkyKQorI2RlZmluZSBLX0YxODQJCUsoS1RfRk4sMTkzKQorI2RlZmluZSBLX0YxODUJCUsoS1RfRk4sMTk0KQorI2RlZmluZSBLX0YxODYJCUsoS1RfRk4sMTk1KQorI2RlZmluZSBLX0YxODcJCUsoS1RfRk4sMTk2KQorI2RlZmluZSBLX0YxODgJCUsoS1RfRk4sMTk3KQorI2RlZmluZSBLX0YxODkJCUsoS1RfRk4sMTk4KQorI2RlZmluZSBLX0YxOTAJCUsoS1RfRk4sMTk5KQorI2RlZmluZSBLX0YxOTEJCUsoS1RfRk4sMjAwKQorI2RlZmluZSBLX0YxOTIJCUsoS1RfRk4sMjAxKQorI2RlZmluZSBLX0YxOTMJCUsoS1RfRk4sMjAyKQorI2RlZmluZSBLX0YxOTQJCUsoS1RfRk4sMjAzKQorI2RlZmluZSBLX0YxOTUJCUsoS1RfRk4sMjA0KQorI2RlZmluZSBLX0YxOTYJCUsoS1RfRk4sMjA1KQorI2RlZmluZSBLX0YxOTcJCUsoS1RfRk4sMjA2KQorI2RlZmluZSBLX0YxOTgJCUsoS1RfRk4sMjA3KQorI2RlZmluZSBLX0YxOTkJCUsoS1RfRk4sMjA4KQorI2RlZmluZSBLX0YyMDAJCUsoS1RfRk4sMjA5KQorI2RlZmluZSBLX0YyMDEJCUsoS1RfRk4sMjEwKQorI2RlZmluZSBLX0YyMDIJCUsoS1RfRk4sMjExKQorI2RlZmluZSBLX0YyMDMJCUsoS1RfRk4sMjEyKQorI2RlZmluZSBLX0YyMDQJCUsoS1RfRk4sMjEzKQorI2RlZmluZSBLX0YyMDUJCUsoS1RfRk4sMjE0KQorI2RlZmluZSBLX0YyMDYJCUsoS1RfRk4sMjE1KQorI2RlZmluZSBLX0YyMDcJCUsoS1RfRk4sMjE2KQorI2RlZmluZSBLX0YyMDgJCUsoS1RfRk4sMjE3KQorI2RlZmluZSBLX0YyMDkJCUsoS1RfRk4sMjE4KQorI2RlZmluZSBLX0YyMTAJCUsoS1RfRk4sMjE5KQorI2RlZmluZSBLX0YyMTEJCUsoS1RfRk4sMjIwKQorI2RlZmluZSBLX0YyMTIJCUsoS1RfRk4sMjIxKQorI2RlZmluZSBLX0YyMTMJCUsoS1RfRk4sMjIyKQorI2RlZmluZSBLX0YyMTQJCUsoS1RfRk4sMjIzKQorI2RlZmluZSBLX0YyMTUJCUsoS1RfRk4sMjI0KQorI2RlZmluZSBLX0YyMTYJCUsoS1RfRk4sMjI1KQorI2RlZmluZSBLX0YyMTcJCUsoS1RfRk4sMjI2KQorI2RlZmluZSBLX0YyMTgJCUsoS1RfRk4sMjI3KQorI2RlZmluZSBLX0YyMTkJCUsoS1RfRk4sMjI4KQorI2RlZmluZSBLX0YyMjAJCUsoS1RfRk4sMjI5KQorI2RlZmluZSBLX0YyMjEJCUsoS1RfRk4sMjMwKQorI2RlZmluZSBLX0YyMjIJCUsoS1RfRk4sMjMxKQorI2RlZmluZSBLX0YyMjMJCUsoS1RfRk4sMjMyKQorI2RlZmluZSBLX0YyMjQJCUsoS1RfRk4sMjMzKQorI2RlZmluZSBLX0YyMjUJCUsoS1RfRk4sMjM0KQorI2RlZmluZSBLX0YyMjYJCUsoS1RfRk4sMjM1KQorI2RlZmluZSBLX0YyMjcJCUsoS1RfRk4sMjM2KQorI2RlZmluZSBLX0YyMjgJCUsoS1RfRk4sMjM3KQorI2RlZmluZSBLX0YyMjkJCUsoS1RfRk4sMjM4KQorI2RlZmluZSBLX0YyMzAJCUsoS1RfRk4sMjM5KQorI2RlZmluZSBLX0YyMzEJCUsoS1RfRk4sMjQwKQorI2RlZmluZSBLX0YyMzIJCUsoS1RfRk4sMjQxKQorI2RlZmluZSBLX0YyMzMJCUsoS1RfRk4sMjQyKQorI2RlZmluZSBLX0YyMzQJCUsoS1RfRk4sMjQzKQorI2RlZmluZSBLX0YyMzUJCUsoS1RfRk4sMjQ0KQorI2RlZmluZSBLX0YyMzYJCUsoS1RfRk4sMjQ1KQorI2RlZmluZSBLX0YyMzcJCUsoS1RfRk4sMjQ2KQorI2RlZmluZSBLX0YyMzgJCUsoS1RfRk4sMjQ3KQorI2RlZmluZSBLX0YyMzkJCUsoS1RfRk4sMjQ4KQorI2RlZmluZSBLX0YyNDAJCUsoS1RfRk4sMjQ5KQorI2RlZmluZSBLX0YyNDEJCUsoS1RfRk4sMjUwKQorI2RlZmluZSBLX0YyNDIJCUsoS1RfRk4sMjUxKQorI2RlZmluZSBLX0YyNDMJCUsoS1RfRk4sMjUyKQorI2RlZmluZSBLX0YyNDQJCUsoS1RfRk4sMjUzKQorI2RlZmluZSBLX0YyNDUJCUsoS1RfRk4sMjU0KQorI2RlZmluZSBLX1VORE8JCUsoS1RfRk4sMjU1KQorCisKKyNkZWZpbmUgS19IT0xFCQlLKEtUX1NQRUMsMCkKKyNkZWZpbmUgS19FTlRFUgkJSyhLVF9TUEVDLDEpCisjZGVmaW5lIEtfU0hfUkVHUwlLKEtUX1NQRUMsMikKKyNkZWZpbmUgS19TSF9NRU0JSyhLVF9TUEVDLDMpCisjZGVmaW5lIEtfU0hfU1RBVAlLKEtUX1NQRUMsNCkKKyNkZWZpbmUgS19CUkVBSwkJSyhLVF9TUEVDLDUpCisjZGVmaW5lIEtfQ09OUwkJSyhLVF9TUEVDLDYpCisjZGVmaW5lIEtfQ0FQUwkJSyhLVF9TUEVDLDcpCisjZGVmaW5lIEtfTlVNCQlLKEtUX1NQRUMsOCkKKyNkZWZpbmUgS19IT0xECQlLKEtUX1NQRUMsOSkKKyNkZWZpbmUgS19TQ1JPTExGT1JXCUsoS1RfU1BFQywxMCkKKyNkZWZpbmUgS19TQ1JPTExCQUNLCUsoS1RfU1BFQywxMSkKKyNkZWZpbmUgS19CT09UCQlLKEtUX1NQRUMsMTIpCisjZGVmaW5lIEtfQ0FQU09OCUsoS1RfU1BFQywxMykKKyNkZWZpbmUgS19DT01QT1NFCUsoS1RfU1BFQywxNCkKKyNkZWZpbmUgS19TQUsJCUsoS1RfU1BFQywxNSkKKyNkZWZpbmUgS19ERUNSQ09OU09MRQlLKEtUX1NQRUMsMTYpCisjZGVmaW5lIEtfSU5DUkNPTlNPTEUJSyhLVF9TUEVDLDE3KQorI2RlZmluZSBLX1NQQVdOQ09OU09MRQlLKEtUX1NQRUMsMTgpCisjZGVmaW5lIEtfQkFSRU5VTUxPQ0sJSyhLVF9TUEVDLDE5KQorCisjZGVmaW5lIEtfQUxMT0NBVEVECUsoS1RfU1BFQywxMjYpIC8qIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBrZXltYXAgKi8KKyNkZWZpbmUgS19OT1NVQ0hNQVAJSyhLVF9TUEVDLDEyNykgLyogcmV0dXJuZWQgYnkgS0RHS0JFTlQgKi8KKworI2RlZmluZSBLX1AwCQlLKEtUX1BBRCwwKQorI2RlZmluZSBLX1AxCQlLKEtUX1BBRCwxKQorI2RlZmluZSBLX1AyCQlLKEtUX1BBRCwyKQorI2RlZmluZSBLX1AzCQlLKEtUX1BBRCwzKQorI2RlZmluZSBLX1A0CQlLKEtUX1BBRCw0KQorI2RlZmluZSBLX1A1CQlLKEtUX1BBRCw1KQorI2RlZmluZSBLX1A2CQlLKEtUX1BBRCw2KQorI2RlZmluZSBLX1A3CQlLKEtUX1BBRCw3KQorI2RlZmluZSBLX1A4CQlLKEtUX1BBRCw4KQorI2RlZmluZSBLX1A5CQlLKEtUX1BBRCw5KQorI2RlZmluZSBLX1BQTFVTCQlLKEtUX1BBRCwxMCkJLyoga2V5LXBhZCBwbHVzICovCisjZGVmaW5lIEtfUE1JTlVTCUsoS1RfUEFELDExKQkvKiBrZXktcGFkIG1pbnVzICovCisjZGVmaW5lIEtfUFNUQVIJCUsoS1RfUEFELDEyKQkvKiBrZXktcGFkIGFzdGVyaXNrIChzdGFyKSAqLworI2RlZmluZSBLX1BTTEFTSAlLKEtUX1BBRCwxMykJLyoga2V5LXBhZCBzbGFzaCAqLworI2RlZmluZSBLX1BFTlRFUglLKEtUX1BBRCwxNCkJLyoga2V5LXBhZCBlbnRlciAqLworI2RlZmluZSBLX1BDT01NQQlLKEtUX1BBRCwxNSkJLyoga2V5LXBhZCBjb21tYToga2x1ZGdlLi4uICovCisjZGVmaW5lIEtfUERPVAkJSyhLVF9QQUQsMTYpCS8qIGtleS1wYWQgZG90IChwZXJpb2QpOiBrbHVkZ2UuLi4gKi8KKyNkZWZpbmUgS19QUExVU01JTlVTCUsoS1RfUEFELDE3KQkvKiBrZXktcGFkIHBsdXMvbWludXMgKi8KKyNkZWZpbmUgS19QUEFSRU5MCUsoS1RfUEFELDE4KQkvKiBrZXktcGFkIGxlZnQgcGFyZW50aGVzaXMgKi8KKyNkZWZpbmUgS19QUEFSRU5SCUsoS1RfUEFELDE5KQkvKiBrZXktcGFkIHJpZ2h0IHBhcmVudGhlc2lzICovCisKKyNkZWZpbmUgTlJfUEFECQkyMAorCisjZGVmaW5lIEtfREdSQVZFCUsoS1RfREVBRCwwKQorI2RlZmluZSBLX0RBQ1VURQlLKEtUX0RFQUQsMSkKKyNkZWZpbmUgS19EQ0lSQ00JSyhLVF9ERUFELDIpCisjZGVmaW5lIEtfRFRJTERFCUsoS1RfREVBRCwzKQorI2RlZmluZSBLX0RESUVSRQlLKEtUX0RFQUQsNCkKKyNkZWZpbmUgS19EQ0VESUwJSyhLVF9ERUFELDUpCisKKyNkZWZpbmUgTlJfREVBRAkJNgorCisjZGVmaW5lIEtfRE9XTgkJSyhLVF9DVVIsMCkKKyNkZWZpbmUgS19MRUZUCQlLKEtUX0NVUiwxKQorI2RlZmluZSBLX1JJR0hUCQlLKEtUX0NVUiwyKQorI2RlZmluZSBLX1VQCQlLKEtUX0NVUiwzKQorCisjZGVmaW5lIEtfU0hJRlQJCUsoS1RfU0hJRlQsS0dfU0hJRlQpCisjZGVmaW5lIEtfQ1RSTAkJSyhLVF9TSElGVCxLR19DVFJMKQorI2RlZmluZSBLX0FMVAkJSyhLVF9TSElGVCxLR19BTFQpCisjZGVmaW5lIEtfQUxUR1IJCUsoS1RfU0hJRlQsS0dfQUxUR1IpCisjZGVmaW5lIEtfU0hJRlRMCUsoS1RfU0hJRlQsS0dfU0hJRlRMKQorI2RlZmluZSBLX1NISUZUUglLKEtUX1NISUZULEtHX1NISUZUUikKKyNkZWZpbmUgS19DVFJMTAkgCUsoS1RfU0hJRlQsS0dfQ1RSTEwpCisjZGVmaW5lIEtfQ1RSTFIJIAlLKEtUX1NISUZULEtHX0NUUkxSKQorI2RlZmluZSBLX0NBUFNTSElGVAlLKEtUX1NISUZULEtHX0NBUFNTSElGVCkKKworI2RlZmluZSBLX0FTQzAJCUsoS1RfQVNDSUksMCkKKyNkZWZpbmUgS19BU0MxCQlLKEtUX0FTQ0lJLDEpCisjZGVmaW5lIEtfQVNDMgkJSyhLVF9BU0NJSSwyKQorI2RlZmluZSBLX0FTQzMJCUsoS1RfQVNDSUksMykKKyNkZWZpbmUgS19BU0M0CQlLKEtUX0FTQ0lJLDQpCisjZGVmaW5lIEtfQVNDNQkJSyhLVF9BU0NJSSw1KQorI2RlZmluZSBLX0FTQzYJCUsoS1RfQVNDSUksNikKKyNkZWZpbmUgS19BU0M3CQlLKEtUX0FTQ0lJLDcpCisjZGVmaW5lIEtfQVNDOAkJSyhLVF9BU0NJSSw4KQorI2RlZmluZSBLX0FTQzkJCUsoS1RfQVNDSUksOSkKKyNkZWZpbmUgS19IRVgwCQlLKEtUX0FTQ0lJLDEwKQorI2RlZmluZSBLX0hFWDEJCUsoS1RfQVNDSUksMTEpCisjZGVmaW5lIEtfSEVYMgkJSyhLVF9BU0NJSSwxMikKKyNkZWZpbmUgS19IRVgzCQlLKEtUX0FTQ0lJLDEzKQorI2RlZmluZSBLX0hFWDQJCUsoS1RfQVNDSUksMTQpCisjZGVmaW5lIEtfSEVYNQkJSyhLVF9BU0NJSSwxNSkKKyNkZWZpbmUgS19IRVg2CQlLKEtUX0FTQ0lJLDE2KQorI2RlZmluZSBLX0hFWDcJCUsoS1RfQVNDSUksMTcpCisjZGVmaW5lIEtfSEVYOAkJSyhLVF9BU0NJSSwxOCkKKyNkZWZpbmUgS19IRVg5CQlLKEtUX0FTQ0lJLDE5KQorI2RlZmluZSBLX0hFWGEJCUsoS1RfQVNDSUksMjApCisjZGVmaW5lIEtfSEVYYgkJSyhLVF9BU0NJSSwyMSkKKyNkZWZpbmUgS19IRVhjCQlLKEtUX0FTQ0lJLDIyKQorI2RlZmluZSBLX0hFWGQJCUsoS1RfQVNDSUksMjMpCisjZGVmaW5lIEtfSEVYZQkJSyhLVF9BU0NJSSwyNCkKKyNkZWZpbmUgS19IRVhmCQlLKEtUX0FTQ0lJLDI1KQorCisjZGVmaW5lIE5SX0FTQ0lJCTI2CisKKyNkZWZpbmUgS19TSElGVExPQ0sJSyhLVF9MT0NLLEtHX1NISUZUKQorI2RlZmluZSBLX0NUUkxMT0NLCUsoS1RfTE9DSyxLR19DVFJMKQorI2RlZmluZSBLX0FMVExPQ0sJSyhLVF9MT0NLLEtHX0FMVCkKKyNkZWZpbmUgS19BTFRHUkxPQ0sJSyhLVF9MT0NLLEtHX0FMVEdSKQorI2RlZmluZSBLX1NISUZUTExPQ0sJSyhLVF9MT0NLLEtHX1NISUZUTCkKKyNkZWZpbmUgS19TSElGVFJMT0NLCUsoS1RfTE9DSyxLR19TSElGVFIpCisjZGVmaW5lIEtfQ1RSTExMT0NLCUsoS1RfTE9DSyxLR19DVFJMTCkKKyNkZWZpbmUgS19DVFJMUkxPQ0sJSyhLVF9MT0NLLEtHX0NUUkxSKQorI2RlZmluZSBLX0NBUFNTSElGVExPQ0sJSyhLVF9MT0NLLEtHX0NBUFNTSElGVCkKKworI2RlZmluZSBLX1NISUZUX1NMT0NLCUsoS1RfU0xPQ0ssS0dfU0hJRlQpCisjZGVmaW5lIEtfQ1RSTF9TTE9DSwlLKEtUX1NMT0NLLEtHX0NUUkwpCisjZGVmaW5lIEtfQUxUX1NMT0NLCUsoS1RfU0xPQ0ssS0dfQUxUKQorI2RlZmluZSBLX0FMVEdSX1NMT0NLCUsoS1RfU0xPQ0ssS0dfQUxUR1IpCisjZGVmaW5lIEtfU0hJRlRMX1NMT0NLCUsoS1RfU0xPQ0ssS0dfU0hJRlRMKQorI2RlZmluZSBLX1NISUZUUl9TTE9DSwlLKEtUX1NMT0NLLEtHX1NISUZUUikKKyNkZWZpbmUgS19DVFJMTF9TTE9DSwlLKEtUX1NMT0NLLEtHX0NUUkxMKQorI2RlZmluZSBLX0NUUkxSX1NMT0NLCUsoS1RfU0xPQ0ssS0dfQ1RSTFIpCisjZGVmaW5lIEtfQ0FQU1NISUZUX1NMT0NLCUsoS1RfU0xPQ0ssS0dfQ0FQU1NISUZUKQorCisjZGVmaW5lIE5SX0xPQ0sJCTkKKworI2RlZmluZSBLX0JSTF9CTEFOSyAgICAgSyhLVF9CUkwsIDApCisjZGVmaW5lIEtfQlJMX0RPVDEgICAgICBLKEtUX0JSTCwgMSkKKyNkZWZpbmUgS19CUkxfRE9UMiAgICAgIEsoS1RfQlJMLCAyKQorI2RlZmluZSBLX0JSTF9ET1QzICAgICAgSyhLVF9CUkwsIDMpCisjZGVmaW5lIEtfQlJMX0RPVDQgICAgICBLKEtUX0JSTCwgNCkKKyNkZWZpbmUgS19CUkxfRE9UNSAgICAgIEsoS1RfQlJMLCA1KQorI2RlZmluZSBLX0JSTF9ET1Q2ICAgICAgSyhLVF9CUkwsIDYpCisjZGVmaW5lIEtfQlJMX0RPVDcgICAgICBLKEtUX0JSTCwgNykKKyNkZWZpbmUgS19CUkxfRE9UOCAgICAgIEsoS1RfQlJMLCA4KQorI2RlZmluZSBLX0JSTF9ET1Q5ICAgICAgSyhLVF9CUkwsIDkpCisjZGVmaW5lIEtfQlJMX0RPVDEwICAgICBLKEtUX0JSTCwgMTApCisKKyNkZWZpbmUgTlJfQlJMCQkxMQorCisjZGVmaW5lIE1BWF9ESUFDUgkyNTYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rZXljdGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2V5Y3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwYjg2NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2V5Y3RsLmgKQEAgLTAsMCArMSw1OSBAQAorLyoga2V5Y3RsLmg6IGtleWN0bCBjb21tYW5kIElEcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9LRVlDVExfSAorI2RlZmluZSBfTElOVVhfS0VZQ1RMX0gKKworLyogc3BlY2lhbCBwcm9jZXNzIGtleXJpbmcgc2hvcnRjdXQgSURzICovCisjZGVmaW5lIEtFWV9TUEVDX1RIUkVBRF9LRVlSSU5HCQktMQkvKiAtIGtleSBJRCBmb3IgdGhyZWFkLXNwZWNpZmljIGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZX1NQRUNfUFJPQ0VTU19LRVlSSU5HCS0yCS8qIC0ga2V5IElEIGZvciBwcm9jZXNzLXNwZWNpZmljIGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HCS0zCS8qIC0ga2V5IElEIGZvciBzZXNzaW9uLXNwZWNpZmljIGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZX1NQRUNfVVNFUl9LRVlSSU5HCQktNAkvKiAtIGtleSBJRCBmb3IgVUlELXNwZWNpZmljIGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZX1NQRUNfVVNFUl9TRVNTSU9OX0tFWVJJTkcJLTUJLyogLSBrZXkgSUQgZm9yIFVJRC1zZXNzaW9uIGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZX1NQRUNfR1JPVVBfS0VZUklORwkJLTYJLyogLSBrZXkgSUQgZm9yIEdJRC1zcGVjaWZpYyBrZXlyaW5nICovCisjZGVmaW5lIEtFWV9TUEVDX1JFUUtFWV9BVVRIX0tFWQktNwkvKiAtIGtleSBJRCBmb3IgYXNzdW1lZCByZXF1ZXN0X2tleSBhdXRoIGtleSAqLworI2RlZmluZSBLRVlfU1BFQ19SRVFVRVNUT1JfS0VZUklORwktOAkvKiAtIGtleSBJRCBmb3IgcmVxdWVzdF9rZXkoKSBkZXN0IGtleXJpbmcgKi8KKworLyogcmVxdWVzdC1rZXkgZGVmYXVsdCBrZXlyaW5ncyAqLworI2RlZmluZSBLRVlfUkVRS0VZX0RFRkxfTk9fQ0hBTkdFCQktMQorI2RlZmluZSBLRVlfUkVRS0VZX0RFRkxfREVGQVVMVAkJCTAKKyNkZWZpbmUgS0VZX1JFUUtFWV9ERUZMX1RIUkVBRF9LRVlSSU5HCQkxCisjZGVmaW5lIEtFWV9SRVFLRVlfREVGTF9QUk9DRVNTX0tFWVJJTkcJCTIKKyNkZWZpbmUgS0VZX1JFUUtFWV9ERUZMX1NFU1NJT05fS0VZUklORwkJMworI2RlZmluZSBLRVlfUkVRS0VZX0RFRkxfVVNFUl9LRVlSSU5HCQk0CisjZGVmaW5lIEtFWV9SRVFLRVlfREVGTF9VU0VSX1NFU1NJT05fS0VZUklORwk1CisjZGVmaW5lIEtFWV9SRVFLRVlfREVGTF9HUk9VUF9LRVlSSU5HCQk2CisjZGVmaW5lIEtFWV9SRVFLRVlfREVGTF9SRVFVRVNUT1JfS0VZUklORwk3CisKKy8qIGtleWN0bCBjb21tYW5kcyAqLworI2RlZmluZSBLRVlDVExfR0VUX0tFWVJJTkdfSUQJCTAJLyogYXNrIGZvciBhIGtleXJpbmcncyBJRCAqLworI2RlZmluZSBLRVlDVExfSk9JTl9TRVNTSU9OX0tFWVJJTkcJMQkvKiBqb2luIG9yIHN0YXJ0IG5hbWVkIHNlc3Npb24ga2V5cmluZyAqLworI2RlZmluZSBLRVlDVExfVVBEQVRFCQkJMgkvKiB1cGRhdGUgYSBrZXkgKi8KKyNkZWZpbmUgS0VZQ1RMX1JFVk9LRQkJCTMJLyogcmV2b2tlIGEga2V5ICovCisjZGVmaW5lIEtFWUNUTF9DSE9XTgkJCTQJLyogc2V0IG93bmVyc2hpcCBvZiBhIGtleSAqLworI2RlZmluZSBLRVlDVExfU0VUUEVSTQkJCTUJLyogc2V0IHBlcm1zIG9uIGEga2V5ICovCisjZGVmaW5lIEtFWUNUTF9ERVNDUklCRQkJCTYJLyogZGVzY3JpYmUgYSBrZXkgKi8KKyNkZWZpbmUgS0VZQ1RMX0NMRUFSCQkJNwkvKiBjbGVhciBjb250ZW50cyBvZiBhIGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZQ1RMX0xJTksJCQk4CS8qIGxpbmsgYSBrZXkgaW50byBhIGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZQ1RMX1VOTElOSwkJCTkJLyogdW5saW5rIGEga2V5IGZyb20gYSBrZXlyaW5nICovCisjZGVmaW5lIEtFWUNUTF9TRUFSQ0gJCQkxMAkvKiBzZWFyY2ggZm9yIGEga2V5IGluIGEga2V5cmluZyAqLworI2RlZmluZSBLRVlDVExfUkVBRAkJCTExCS8qIHJlYWQgYSBrZXkgb3Iga2V5cmluZydzIGNvbnRlbnRzICovCisjZGVmaW5lIEtFWUNUTF9JTlNUQU5USUFURQkJMTIJLyogaW5zdGFudGlhdGUgYSBwYXJ0aWFsbHkgY29uc3RydWN0ZWQga2V5ICovCisjZGVmaW5lIEtFWUNUTF9ORUdBVEUJCQkxMwkvKiBuZWdhdGUgYSBwYXJ0aWFsbHkgY29uc3RydWN0ZWQga2V5ICovCisjZGVmaW5lIEtFWUNUTF9TRVRfUkVRS0VZX0tFWVJJTkcJMTQJLyogc2V0IGRlZmF1bHQgcmVxdWVzdC1rZXkga2V5cmluZyAqLworI2RlZmluZSBLRVlDVExfU0VUX1RJTUVPVVQJCTE1CS8qIHNldCBrZXkgdGltZW91dCAqLworI2RlZmluZSBLRVlDVExfQVNTVU1FX0FVVEhPUklUWQkJMTYJLyogYXNzdW1lIHJlcXVlc3Rfa2V5KCkgYXV0aG9yaXNhdGlvbiAqLworI2RlZmluZSBLRVlDVExfR0VUX1NFQ1VSSVRZCQkxNwkvKiBnZXQga2V5IHNlY3VyaXR5IGxhYmVsICovCisjZGVmaW5lIEtFWUNUTF9TRVNTSU9OX1RPX1BBUkVOVAkxOAkvKiBhcHBseSBzZXNzaW9uIGtleXJpbmcgdG8gcGFyZW50IHByb2Nlc3MgKi8KKyNkZWZpbmUgS0VZQ1RMX1JFSkVDVAkJCTE5CS8qIHJlamVjdCBhIHBhcnRpYWxseSBjb25zdHJ1Y3RlZCBrZXkgKi8KKyNkZWZpbmUgS0VZQ1RMX0lOU1RBTlRJQVRFX0lPVgkJMjAJLyogaW5zdGFudGlhdGUgYSBwYXJ0aWFsbHkgY29uc3RydWN0ZWQga2V5ICovCisKKyNlbmRpZiAvKiAgX0xJTlVYX0tFWUNUTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2t2bS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rdm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzZhZDlhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rdm0uaApAQCAtMCwwICsxLDgxNSBAQAorI2lmbmRlZiBfX0xJTlVYX0tWTV9ICisjZGVmaW5lIF9fTElOVVhfS1ZNX0gKKworLyoKKyAqIFVzZXJzcGFjZSBpbnRlcmZhY2UgZm9yIC9kZXYva3ZtIC0ga2VybmVsIGJhc2VkIHZpcnR1YWwgbWFjaGluZQorICoKKyAqIE5vdGU6IHlvdSBtdXN0IHVwZGF0ZSBLVk1fQVBJX1ZFUlNJT04gaWYgeW91IGNoYW5nZSB0aGlzIGludGVyZmFjZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8YXNtL2t2bS5oPgorCisjZGVmaW5lIEtWTV9BUElfVkVSU0lPTiAxMgorCisvKiAqKiogRGVwcmVjYXRlZCBpbnRlcmZhY2VzICoqKiAqLworCisjZGVmaW5lIEtWTV9UUkNfU0hJRlQgICAgICAgICAgIDE2CisKKyNkZWZpbmUgS1ZNX1RSQ19FTlRSWUVYSVQgICAgICAgKDEgPDwgS1ZNX1RSQ19TSElGVCkKKyNkZWZpbmUgS1ZNX1RSQ19IQU5ETEVSICAgICAgICAgKDEgPDwgKEtWTV9UUkNfU0hJRlQgKyAxKSkKKworI2RlZmluZSBLVk1fVFJDX1ZNRU5UUlkgICAgICAgICAoS1ZNX1RSQ19FTlRSWUVYSVQgKyAweDAxKQorI2RlZmluZSBLVk1fVFJDX1ZNRVhJVCAgICAgICAgICAoS1ZNX1RSQ19FTlRSWUVYSVQgKyAweDAyKQorI2RlZmluZSBLVk1fVFJDX1BBR0VfRkFVTFQgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwMSkKKworI2RlZmluZSBLVk1fVFJDX0hFQURfU0laRSAgICAgICAxMgorI2RlZmluZSBLVk1fVFJDX0NZQ0xFX1NJWkUgICAgICA4CisjZGVmaW5lIEtWTV9UUkNfRVhUUkFfTUFYICAgICAgIDcKKworI2RlZmluZSBLVk1fVFJDX0lOSl9WSVJRICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MDIpCisjZGVmaW5lIEtWTV9UUkNfUkVERUxJVkVSX0VWVCAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwMykKKyNkZWZpbmUgS1ZNX1RSQ19QRU5EX0lOVFIgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDA0KQorI2RlZmluZSBLVk1fVFJDX0lPX1JFQUQgICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MDUpCisjZGVmaW5lIEtWTV9UUkNfSU9fV1JJVEUgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwNikKKyNkZWZpbmUgS1ZNX1RSQ19DUl9SRUFEICAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDA3KQorI2RlZmluZSBLVk1fVFJDX0NSX1dSSVRFICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MDgpCisjZGVmaW5lIEtWTV9UUkNfRFJfUkVBRCAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwOSkKKyNkZWZpbmUgS1ZNX1RSQ19EUl9XUklURSAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDBBKQorI2RlZmluZSBLVk1fVFJDX01TUl9SRUFEICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MEIpCisjZGVmaW5lIEtWTV9UUkNfTVNSX1dSSVRFICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwQykKKyNkZWZpbmUgS1ZNX1RSQ19DUFVJRCAgICAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDBEKQorI2RlZmluZSBLVk1fVFJDX0lOVFIgICAgICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MEUpCisjZGVmaW5lIEtWTV9UUkNfTk1JICAgICAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwRikKKyNkZWZpbmUgS1ZNX1RSQ19WTU1DQUxMICAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDEwKQorI2RlZmluZSBLVk1fVFJDX0hMVCAgICAgICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MTEpCisjZGVmaW5lIEtWTV9UUkNfQ0xUUyAgICAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgxMikKKyNkZWZpbmUgS1ZNX1RSQ19MTVNXICAgICAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDEzKQorI2RlZmluZSBLVk1fVFJDX0FQSUNfQUNDRVNTICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MTQpCisjZGVmaW5lIEtWTV9UUkNfVERQX0ZBVUxUICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgxNSkKKyNkZWZpbmUgS1ZNX1RSQ19HVExCX1dSSVRFICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDE2KQorI2RlZmluZSBLVk1fVFJDX1NUTEJfV1JJVEUgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MTcpCisjZGVmaW5lIEtWTV9UUkNfU1RMQl9JTlZBTCAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgxOCkKKyNkZWZpbmUgS1ZNX1RSQ19QUENfSU5TVFIgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDE5KQorCitzdHJ1Y3Qga3ZtX3VzZXJfdHJhY2Vfc2V0dXAgeworCV9fdTMyIGJ1Zl9zaXplOworCV9fdTMyIGJ1Zl9ucjsKK307CisKKyNkZWZpbmUgX19LVk1fREVQUkVDQVRFRF9NQUlOX1dfMHgwNiBcCisJX0lPVyhLVk1JTywgMHgwNiwgc3RydWN0IGt2bV91c2VyX3RyYWNlX3NldHVwKQorI2RlZmluZSBfX0tWTV9ERVBSRUNBVEVEX01BSU5fMHgwNyBfSU8oS1ZNSU8sIDB4MDcpCisjZGVmaW5lIF9fS1ZNX0RFUFJFQ0FURURfTUFJTl8weDA4IF9JTyhLVk1JTywgMHgwOCkKKworI2RlZmluZSBfX0tWTV9ERVBSRUNBVEVEX1ZNX1JfMHg3MCBfSU9SKEtWTUlPLCAweDcwLCBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2lycSkKKworc3RydWN0IGt2bV9icmVha3BvaW50IHsKKwlfX3UzMiBlbmFibGVkOworCV9fdTMyIHBhZGRpbmc7CisJX191NjQgYWRkcmVzczsKK307CisKK3N0cnVjdCBrdm1fZGVidWdfZ3Vlc3QgeworCV9fdTMyIGVuYWJsZWQ7CisJX191MzIgcGFkOworCXN0cnVjdCBrdm1fYnJlYWtwb2ludCBicmVha3BvaW50c1s0XTsKKwlfX3UzMiBzaW5nbGVzdGVwOworfTsKKworI2RlZmluZSBfX0tWTV9ERVBSRUNBVEVEX1ZDUFVfV18weDg3IF9JT1coS1ZNSU8sIDB4ODcsIHN0cnVjdCBrdm1fZGVidWdfZ3Vlc3QpCisKKy8qICoqKiBFbmQgb2YgZGVwcmVjYXRlZCBpbnRlcmZhY2VzICoqKiAqLworCisKKy8qIGZvciBLVk1fQ1JFQVRFX01FTU9SWV9SRUdJT04gKi8KK3N0cnVjdCBrdm1fbWVtb3J5X3JlZ2lvbiB7CisJX191MzIgc2xvdDsKKwlfX3UzMiBmbGFnczsKKwlfX3U2NCBndWVzdF9waHlzX2FkZHI7CisJX191NjQgbWVtb3J5X3NpemU7IC8qIGJ5dGVzICovCit9OworCisvKiBmb3IgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04gKi8KK3N0cnVjdCBrdm1fdXNlcnNwYWNlX21lbW9yeV9yZWdpb24geworCV9fdTMyIHNsb3Q7CisJX191MzIgZmxhZ3M7CisJX191NjQgZ3Vlc3RfcGh5c19hZGRyOworCV9fdTY0IG1lbW9yeV9zaXplOyAvKiBieXRlcyAqLworCV9fdTY0IHVzZXJzcGFjZV9hZGRyOyAvKiBzdGFydCBvZiB0aGUgdXNlcnNwYWNlIGFsbG9jYXRlZCBtZW1vcnkgKi8KK307CisKKy8qIGZvciBrdm1fbWVtb3J5X3JlZ2lvbjo6ZmxhZ3MgKi8KKyNkZWZpbmUgS1ZNX01FTV9MT0dfRElSVFlfUEFHRVMgIDFVTAorI2RlZmluZSBLVk1fTUVNU0xPVF9JTlZBTElEICAgICAgKDFVTCA8PCAxKQorCisvKiBmb3IgS1ZNX0lSUV9MSU5FICovCitzdHJ1Y3Qga3ZtX2lycV9sZXZlbCB7CisJLyoKKwkgKiBBQ1BJIGdzaSBub3Rpb24gb2YgaXJxLgorCSAqIEZvciBJQS02NCAoQVBJQyBtb2RlbCkgSU9BUElDMDogaXJxIDAtMjM7IElPQVBJQzE6IGlycSAyNC00Ny4uCisJICogRm9yIFg4NiAoc3RhbmRhcmQgQVQgbW9kZSkgUElDMC8xOiBpcnEgMC0xNS4gSU9BUElDMDogMC0yMy4uCisJICovCisJdW5pb24geworCQlfX3UzMiBpcnE7CisJCV9fczMyIHN0YXR1czsKKwl9OworCV9fdTMyIGxldmVsOworfTsKKworCitzdHJ1Y3Qga3ZtX2lycWNoaXAgeworCV9fdTMyIGNoaXBfaWQ7CisJX191MzIgcGFkOworICAgICAgICB1bmlvbiB7CisJCWNoYXIgZHVtbXlbNTEyXTsgIC8qIHJlc2VydmluZyBzcGFjZSAqLworI2lmZGVmIF9fS1ZNX0hBVkVfUElUCisJCXN0cnVjdCBrdm1fcGljX3N0YXRlIHBpYzsKKyNlbmRpZgorI2lmZGVmIF9fS1ZNX0hBVkVfSU9BUElDCisJCXN0cnVjdCBrdm1faW9hcGljX3N0YXRlIGlvYXBpYzsKKyNlbmRpZgorCX0gY2hpcDsKK307CisKKy8qIGZvciBLVk1fQ1JFQVRFX1BJVDIgKi8KK3N0cnVjdCBrdm1fcGl0X2NvbmZpZyB7CisJX191MzIgZmxhZ3M7CisJX191MzIgcGFkWzE1XTsKK307CisKKyNkZWZpbmUgS1ZNX1BJVF9TUEVBS0VSX0RVTU1ZICAgICAxCisKKyNkZWZpbmUgS1ZNX0VYSVRfVU5LTk9XTiAgICAgICAgICAwCisjZGVmaW5lIEtWTV9FWElUX0VYQ0VQVElPTiAgICAgICAgMQorI2RlZmluZSBLVk1fRVhJVF9JTyAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgS1ZNX0VYSVRfSFlQRVJDQUxMICAgICAgICAzCisjZGVmaW5lIEtWTV9FWElUX0RFQlVHICAgICAgICAgICAgNAorI2RlZmluZSBLVk1fRVhJVF9ITFQgICAgICAgICAgICAgIDUKKyNkZWZpbmUgS1ZNX0VYSVRfTU1JTyAgICAgICAgICAgICA2CisjZGVmaW5lIEtWTV9FWElUX0lSUV9XSU5ET1dfT1BFTiAgNworI2RlZmluZSBLVk1fRVhJVF9TSFVURE9XTiAgICAgICAgIDgKKyNkZWZpbmUgS1ZNX0VYSVRfRkFJTF9FTlRSWSAgICAgICA5CisjZGVmaW5lIEtWTV9FWElUX0lOVFIgICAgICAgICAgICAgMTAKKyNkZWZpbmUgS1ZNX0VYSVRfU0VUX1RQUiAgICAgICAgICAxMQorI2RlZmluZSBLVk1fRVhJVF9UUFJfQUNDRVNTICAgICAgIDEyCisjZGVmaW5lIEtWTV9FWElUX1MzOTBfU0lFSUMgICAgICAgMTMKKyNkZWZpbmUgS1ZNX0VYSVRfUzM5MF9SRVNFVCAgICAgICAxNAorI2RlZmluZSBLVk1fRVhJVF9EQ1IgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEtWTV9FWElUX05NSSAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgS1ZNX0VYSVRfSU5URVJOQUxfRVJST1IgICAxNworI2RlZmluZSBLVk1fRVhJVF9PU0kgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEtWTV9FWElUX1BBUFJfSENBTEwJICAxOQorCisvKiBGb3IgS1ZNX0VYSVRfSU5URVJOQUxfRVJST1IgKi8KKyNkZWZpbmUgS1ZNX0lOVEVSTkFMX0VSUk9SX0VNVUxBVElPTiAxCisjZGVmaW5lIEtWTV9JTlRFUk5BTF9FUlJPUl9TSU1VTF9FWCAyCisKKy8qIGZvciBLVk1fUlVOLCByZXR1cm5lZCBieSBtbWFwKHZjcHVfZmQsIG9mZnNldD0wKSAqLworc3RydWN0IGt2bV9ydW4geworCS8qIGluICovCisJX191OCByZXF1ZXN0X2ludGVycnVwdF93aW5kb3c7CisJX191OCBwYWRkaW5nMVs3XTsKKworCS8qIG91dCAqLworCV9fdTMyIGV4aXRfcmVhc29uOworCV9fdTggcmVhZHlfZm9yX2ludGVycnVwdF9pbmplY3Rpb247CisJX191OCBpZl9mbGFnOworCV9fdTggcGFkZGluZzJbMl07CisKKwkvKiBpbiAocHJlX2t2bV9ydW4pLCBvdXQgKHBvc3Rfa3ZtX3J1bikgKi8KKwlfX3U2NCBjcjg7CisJX191NjQgYXBpY19iYXNlOworCisjaWZkZWYgX19LVk1fUzM5MAorCS8qIHRoZSBwcm9jZXNzb3Igc3RhdHVzIHdvcmQgZm9yIHMzOTAgKi8KKwlfX3U2NCBwc3dfbWFzazsgLyogcHN3IHVwcGVyIGhhbGYgKi8KKwlfX3U2NCBwc3dfYWRkcjsgLyogcHN3IGxvd2VyIGhhbGYgKi8KKyNlbmRpZgorCXVuaW9uIHsKKwkJLyogS1ZNX0VYSVRfVU5LTk9XTiAqLworCQlzdHJ1Y3QgeworCQkJX191NjQgaGFyZHdhcmVfZXhpdF9yZWFzb247CisJCX0gaHc7CisJCS8qIEtWTV9FWElUX0ZBSUxfRU5UUlkgKi8KKwkJc3RydWN0IHsKKwkJCV9fdTY0IGhhcmR3YXJlX2VudHJ5X2ZhaWx1cmVfcmVhc29uOworCQl9IGZhaWxfZW50cnk7CisJCS8qIEtWTV9FWElUX0VYQ0VQVElPTiAqLworCQlzdHJ1Y3QgeworCQkJX191MzIgZXhjZXB0aW9uOworCQkJX191MzIgZXJyb3JfY29kZTsKKwkJfSBleDsKKwkJLyogS1ZNX0VYSVRfSU8gKi8KKwkJc3RydWN0IHsKKyNkZWZpbmUgS1ZNX0VYSVRfSU9fSU4gIDAKKyNkZWZpbmUgS1ZNX0VYSVRfSU9fT1VUIDEKKwkJCV9fdTggZGlyZWN0aW9uOworCQkJX191OCBzaXplOyAvKiBieXRlcyAqLworCQkJX191MTYgcG9ydDsKKwkJCV9fdTMyIGNvdW50OworCQkJX191NjQgZGF0YV9vZmZzZXQ7IC8qIHJlbGF0aXZlIHRvIGt2bV9ydW4gc3RhcnQgKi8KKwkJfSBpbzsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBrdm1fZGVidWdfZXhpdF9hcmNoIGFyY2g7CisJCX0gZGVidWc7CisJCS8qIEtWTV9FWElUX01NSU8gKi8KKwkJc3RydWN0IHsKKwkJCV9fdTY0IHBoeXNfYWRkcjsKKwkJCV9fdTggIGRhdGFbOF07CisJCQlfX3UzMiBsZW47CisJCQlfX3U4ICBpc193cml0ZTsKKwkJfSBtbWlvOworCQkvKiBLVk1fRVhJVF9IWVBFUkNBTEwgKi8KKwkJc3RydWN0IHsKKwkJCV9fdTY0IG5yOworCQkJX191NjQgYXJnc1s2XTsKKwkJCV9fdTY0IHJldDsKKwkJCV9fdTMyIGxvbmdtb2RlOworCQkJX191MzIgcGFkOworCQl9IGh5cGVyY2FsbDsKKwkJLyogS1ZNX0VYSVRfVFBSX0FDQ0VTUyAqLworCQlzdHJ1Y3QgeworCQkJX191NjQgcmlwOworCQkJX191MzIgaXNfd3JpdGU7CisJCQlfX3UzMiBwYWQ7CisJCX0gdHByX2FjY2VzczsKKwkJLyogS1ZNX0VYSVRfUzM5MF9TSUVJQyAqLworCQlzdHJ1Y3QgeworCQkJX191OCBpY3B0Y29kZTsKKwkJCV9fdTE2IGlwYTsKKwkJCV9fdTMyIGlwYjsKKwkJfSBzMzkwX3NpZWljOworCQkvKiBLVk1fRVhJVF9TMzkwX1JFU0VUICovCisjZGVmaW5lIEtWTV9TMzkwX1JFU0VUX1BPUiAgICAgICAxCisjZGVmaW5lIEtWTV9TMzkwX1JFU0VUX0NMRUFSICAgICAyCisjZGVmaW5lIEtWTV9TMzkwX1JFU0VUX1NVQlNZU1RFTSA0CisjZGVmaW5lIEtWTV9TMzkwX1JFU0VUX0NQVV9JTklUICA4CisjZGVmaW5lIEtWTV9TMzkwX1JFU0VUX0lQTCAgICAgICAxNgorCQlfX3U2NCBzMzkwX3Jlc2V0X2ZsYWdzOworCQkvKiBLVk1fRVhJVF9EQ1IgKi8KKwkJc3RydWN0IHsKKwkJCV9fdTMyIGRjcm47CisJCQlfX3UzMiBkYXRhOworCQkJX191OCAgaXNfd3JpdGU7CisJCX0gZGNyOworCQlzdHJ1Y3QgeworCQkJX191MzIgc3ViZXJyb3I7CisJCQkvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX0lOVEVSTkFMX0VSUk9SX0RBVEE6ICovCisJCQlfX3UzMiBuZGF0YTsKKwkJCV9fdTY0IGRhdGFbMTZdOworCQl9IGludGVybmFsOworCQkvKiBLVk1fRVhJVF9PU0kgKi8KKwkJc3RydWN0IHsKKwkJCV9fdTY0IGdwcnNbMzJdOworCQl9IG9zaTsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IG5yOworCQkJX191NjQgcmV0OworCQkJX191NjQgYXJnc1s5XTsKKwkJfSBwYXByX2hjYWxsOworCQkvKiBGaXggdGhlIHNpemUgb2YgdGhlIHVuaW9uLiAqLworCQljaGFyIHBhZGRpbmdbMjU2XTsKKwl9OworfTsKKworLyogZm9yIEtWTV9SRUdJU1RFUl9DT0FMRVNDRURfTU1JTyAvIEtWTV9VTlJFR0lTVEVSX0NPQUxFU0NFRF9NTUlPICovCisKK3N0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fem9uZSB7CisJX191NjQgYWRkcjsKKwlfX3UzMiBzaXplOworCV9fdTMyIHBhZDsKK307CisKK3N0cnVjdCBrdm1fY29hbGVzY2VkX21taW8geworCV9fdTY0IHBoeXNfYWRkcjsKKwlfX3UzMiBsZW47CisJX191MzIgcGFkOworCV9fdTggIGRhdGFbOF07Cit9OworCitzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX3JpbmcgeworCV9fdTMyIGZpcnN0LCBsYXN0OworCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW8gY29hbGVzY2VkX21taW9bMF07Cit9OworCisjZGVmaW5lIEtWTV9DT0FMRVNDRURfTU1JT19NQVggXAorCSgoUEFHRV9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fcmluZykpIC8gXAorCSBzaXplb2Yoc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pbykpCisKKy8qIGZvciBLVk1fVFJBTlNMQVRFICovCitzdHJ1Y3Qga3ZtX3RyYW5zbGF0aW9uIHsKKwkvKiBpbiAqLworCV9fdTY0IGxpbmVhcl9hZGRyZXNzOworCisJLyogb3V0ICovCisJX191NjQgcGh5c2ljYWxfYWRkcmVzczsKKwlfX3U4ICB2YWxpZDsKKwlfX3U4ICB3cml0ZWFibGU7CisJX191OCAgdXNlcm1vZGU7CisJX191OCAgcGFkWzVdOworfTsKKworLyogZm9yIEtWTV9JTlRFUlJVUFQgKi8KK3N0cnVjdCBrdm1faW50ZXJydXB0IHsKKwkvKiBpbiAqLworCV9fdTMyIGlycTsKK307CisKKy8qIGZvciBLVk1fR0VUX0RJUlRZX0xPRyAqLworc3RydWN0IGt2bV9kaXJ0eV9sb2cgeworCV9fdTMyIHNsb3Q7CisJX191MzIgcGFkZGluZzE7CisJdW5pb24geworCQl2b2lkICpkaXJ0eV9iaXRtYXA7IC8qIG9uZSBiaXQgcGVyIHBhZ2UgKi8KKwkJX191NjQgcGFkZGluZzI7CisJfTsKK307CisKKy8qIGZvciBLVk1fU0VUX1NJR05BTF9NQVNLICovCitzdHJ1Y3Qga3ZtX3NpZ25hbF9tYXNrIHsKKwlfX3UzMiBsZW47CisJX191OCAgc2lnc2V0WzBdOworfTsKKworLyogZm9yIEtWTV9UUFJfQUNDRVNTX1JFUE9SVElORyAqLworc3RydWN0IGt2bV90cHJfYWNjZXNzX2N0bCB7CisJX191MzIgZW5hYmxlZDsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiByZXNlcnZlZFs4XTsKK307CisKKy8qIGZvciBLVk1fU0VUX1ZBUElDX0FERFIgKi8KK3N0cnVjdCBrdm1fdmFwaWNfYWRkciB7CisJX191NjQgdmFwaWNfYWRkcjsKK307CisKKy8qIGZvciBLVk1fU0VUX01QU1RBVEUgKi8KKworI2RlZmluZSBLVk1fTVBfU1RBVEVfUlVOTkFCTEUgICAgICAgICAgMAorI2RlZmluZSBLVk1fTVBfU1RBVEVfVU5JTklUSUFMSVpFRCAgICAgMQorI2RlZmluZSBLVk1fTVBfU1RBVEVfSU5JVF9SRUNFSVZFRCAgICAgMgorI2RlZmluZSBLVk1fTVBfU1RBVEVfSEFMVEVEICAgICAgICAgICAgMworI2RlZmluZSBLVk1fTVBfU1RBVEVfU0lQSV9SRUNFSVZFRCAgICAgNAorCitzdHJ1Y3Qga3ZtX21wX3N0YXRlIHsKKwlfX3UzMiBtcF9zdGF0ZTsKK307CisKK3N0cnVjdCBrdm1fczM5MF9wc3cgeworCV9fdTY0IG1hc2s7CisJX191NjQgYWRkcjsKK307CisKKy8qIHZhbGlkIHZhbHVlcyBmb3IgdHlwZSBpbiBrdm1fczM5MF9pbnRlcnJ1cHQgKi8KKyNkZWZpbmUgS1ZNX1MzOTBfU0lHUF9TVE9QCQkweGZmZmUwMDAwdQorI2RlZmluZSBLVk1fUzM5MF9QUk9HUkFNX0lOVAkJMHhmZmZlMDAwMXUKKyNkZWZpbmUgS1ZNX1MzOTBfU0lHUF9TRVRfUFJFRklYCTB4ZmZmZTAwMDJ1CisjZGVmaW5lIEtWTV9TMzkwX1JFU1RBUlQJCTB4ZmZmZTAwMDN1CisjZGVmaW5lIEtWTV9TMzkwX0lOVF9WSVJUSU8JCTB4ZmZmZjI2MDN1CisjZGVmaW5lIEtWTV9TMzkwX0lOVF9TRVJWSUNFCQkweGZmZmYyNDAxdQorI2RlZmluZSBLVk1fUzM5MF9JTlRfRU1FUkdFTkNZCQkweGZmZmYxMjAxdQorI2RlZmluZSBLVk1fUzM5MF9JTlRfRVhURVJOQUxfQ0FMTAkweGZmZmYxMjAydQorCitzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0IHsKKwlfX3UzMiB0eXBlOworCV9fdTMyIHBhcm07CisJX191NjQgcGFybTY0OworfTsKKworLyogZm9yIEtWTV9TRVRfR1VFU1RfREVCVUcgKi8KKworI2RlZmluZSBLVk1fR1VFU1REQkdfRU5BQkxFCQkweDAwMDAwMDAxCisjZGVmaW5lIEtWTV9HVUVTVERCR19TSU5HTEVTVEVQCQkweDAwMDAwMDAyCisKK3N0cnVjdCBrdm1fZ3Vlc3RfZGVidWcgeworCV9fdTMyIGNvbnRyb2w7CisJX191MzIgcGFkOworCXN0cnVjdCBrdm1fZ3Vlc3RfZGVidWdfYXJjaCBhcmNoOworfTsKKworZW51bSB7CisJa3ZtX2lvZXZlbnRmZF9mbGFnX25yX2RhdGFtYXRjaCwKKwlrdm1faW9ldmVudGZkX2ZsYWdfbnJfcGlvLAorCWt2bV9pb2V2ZW50ZmRfZmxhZ19ucl9kZWFzc2lnbiwKKwlrdm1faW9ldmVudGZkX2ZsYWdfbnJfbWF4LAorfTsKKworI2RlZmluZSBLVk1fSU9FVkVOVEZEX0ZMQUdfREFUQU1BVENIICgxIDw8IGt2bV9pb2V2ZW50ZmRfZmxhZ19ucl9kYXRhbWF0Y2gpCisjZGVmaW5lIEtWTV9JT0VWRU5URkRfRkxBR19QSU8gICAgICAgKDEgPDwga3ZtX2lvZXZlbnRmZF9mbGFnX25yX3BpbykKKyNkZWZpbmUgS1ZNX0lPRVZFTlRGRF9GTEFHX0RFQVNTSUdOICAoMSA8PCBrdm1faW9ldmVudGZkX2ZsYWdfbnJfZGVhc3NpZ24pCisKKyNkZWZpbmUgS1ZNX0lPRVZFTlRGRF9WQUxJRF9GTEFHX01BU0sgICgoMSA8PCBrdm1faW9ldmVudGZkX2ZsYWdfbnJfbWF4KSAtIDEpCisKK3N0cnVjdCBrdm1faW9ldmVudGZkIHsKKwlfX3U2NCBkYXRhbWF0Y2g7CisJX191NjQgYWRkcjsgICAgICAgIC8qIGxlZ2FsIHBpby9tbWlvIGFkZHJlc3MgKi8KKwlfX3UzMiBsZW47ICAgICAgICAgLyogMSwgMiwgNCwgb3IgOCBieXRlcyAgICAqLworCV9fczMyIGZkOworCV9fdTMyIGZsYWdzOworCV9fdTggIHBhZFszNl07Cit9OworCisvKiBmb3IgS1ZNX0VOQUJMRV9DQVAgKi8KK3N0cnVjdCBrdm1fZW5hYmxlX2NhcCB7CisJLyogaW4gKi8KKwlfX3UzMiBjYXA7CisJX191MzIgZmxhZ3M7CisJX191NjQgYXJnc1s0XTsKKwlfX3U4ICBwYWRbNjRdOworfTsKKworLyogZm9yIEtWTV9QUENfR0VUX1BWSU5GTyAqLworc3RydWN0IGt2bV9wcGNfcHZpbmZvIHsKKwkvKiBvdXQgKi8KKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBoY2FsbFs0XTsKKwlfX3U4ICBwYWRbMTA4XTsKK307CisKKyNkZWZpbmUgS1ZNSU8gMHhBRQorCisvKgorICogaW9jdGxzIGZvciAvZGV2L2t2bSBmZHM6CisgKi8KKyNkZWZpbmUgS1ZNX0dFVF9BUElfVkVSU0lPTiAgICAgICBfSU8oS1ZNSU8sICAgMHgwMCkKKyNkZWZpbmUgS1ZNX0NSRUFURV9WTSAgICAgICAgICAgICBfSU8oS1ZNSU8sICAgMHgwMSkgLyogcmV0dXJucyBhIFZNIGZkICovCisjZGVmaW5lIEtWTV9HRVRfTVNSX0lOREVYX0xJU1QgICAgX0lPV1IoS1ZNSU8sIDB4MDIsIHN0cnVjdCBrdm1fbXNyX2xpc3QpCisKKyNkZWZpbmUgS1ZNX1MzOTBfRU5BQkxFX1NJRSAgICAgICBfSU8oS1ZNSU8sICAgMHgwNikKKy8qCisgKiBDaGVjayBpZiBhIGt2bSBleHRlbnNpb24gaXMgYXZhaWxhYmxlLiAgQXJndW1lbnQgaXMgZXh0ZW5zaW9uIG51bWJlciwKKyAqIHJldHVybiBpcyAxICh5ZXMpIG9yIDAgKG5vLCBzb3JyeSkuCisgKi8KKyNkZWZpbmUgS1ZNX0NIRUNLX0VYVEVOU0lPTiAgICAgICBfSU8oS1ZNSU8sICAgMHgwMykKKy8qCisgKiBHZXQgc2l6ZSBmb3IgbW1hcCh2Y3B1X2ZkKQorICovCisjZGVmaW5lIEtWTV9HRVRfVkNQVV9NTUFQX1NJWkUgICAgX0lPKEtWTUlPLCAgIDB4MDQpIC8qIGluIGJ5dGVzICovCisjZGVmaW5lIEtWTV9HRVRfU1VQUE9SVEVEX0NQVUlEICAgX0lPV1IoS1ZNSU8sIDB4MDUsIHN0cnVjdCBrdm1fY3B1aWQyKQorI2RlZmluZSBLVk1fVFJBQ0VfRU5BQkxFICAgICAgICAgIF9fS1ZNX0RFUFJFQ0FURURfTUFJTl9XXzB4MDYKKyNkZWZpbmUgS1ZNX1RSQUNFX1BBVVNFICAgICAgICAgICBfX0tWTV9ERVBSRUNBVEVEX01BSU5fMHgwNworI2RlZmluZSBLVk1fVFJBQ0VfRElTQUJMRSAgICAgICAgIF9fS1ZNX0RFUFJFQ0FURURfTUFJTl8weDA4CisKKy8qCisgKiBFeHRlbnNpb24gY2FwYWJpbGl0eSBsaXN0LgorICovCisjZGVmaW5lIEtWTV9DQVBfSVJRQ0hJUAkgIDAKKyNkZWZpbmUgS1ZNX0NBUF9ITFQJICAxCisjZGVmaW5lIEtWTV9DQVBfTU1VX1NIQURPV19DQUNIRV9DT05UUk9MIDIKKyNkZWZpbmUgS1ZNX0NBUF9VU0VSX01FTU9SWSAzCisjZGVmaW5lIEtWTV9DQVBfU0VUX1RTU19BRERSIDQKKyNkZWZpbmUgS1ZNX0NBUF9WQVBJQyA2CisjZGVmaW5lIEtWTV9DQVBfRVhUX0NQVUlEIDcKKyNkZWZpbmUgS1ZNX0NBUF9DTE9DS1NPVVJDRSA4CisjZGVmaW5lIEtWTV9DQVBfTlJfVkNQVVMgOSAgICAgICAvKiByZXR1cm5zIHJlY29tbWVuZGVkIG1heCB2Y3B1cyBwZXIgdm0gKi8KKyNkZWZpbmUgS1ZNX0NBUF9OUl9NRU1TTE9UUyAxMCAgIC8qIHJldHVybnMgbWF4IG1lbW9yeSBzbG90cyBwZXIgdm0gKi8KKyNkZWZpbmUgS1ZNX0NBUF9QSVQgMTEKKyNkZWZpbmUgS1ZNX0NBUF9OT1BfSU9fREVMQVkgMTIKKyNkZWZpbmUgS1ZNX0NBUF9QVl9NTVUgMTMKKyNkZWZpbmUgS1ZNX0NBUF9NUF9TVEFURSAxNAorI2RlZmluZSBLVk1fQ0FQX0NPQUxFU0NFRF9NTUlPIDE1CisjZGVmaW5lIEtWTV9DQVBfU1lOQ19NTVUgMTYgIC8qIENoYW5nZXMgdG8gaG9zdCBtbWFwIGFyZSByZWZsZWN0ZWQgaW4gZ3Vlc3QgKi8KKyNpZmRlZiBfX0tWTV9IQVZFX0RFVklDRV9BU1NJR05NRU5UCisjZGVmaW5lIEtWTV9DQVBfREVWSUNFX0FTU0lHTk1FTlQgMTcKKyNlbmRpZgorI2RlZmluZSBLVk1fQ0FQX0lPTU1VIDE4CisjaWZkZWYgX19LVk1fSEFWRV9NU0kKKyNkZWZpbmUgS1ZNX0NBUF9ERVZJQ0VfTVNJIDIwCisjZW5kaWYKKy8qIEJ1ZyBpbiBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTiBmaXhlZDogKi8KKyNkZWZpbmUgS1ZNX0NBUF9ERVNUUk9ZX01FTU9SWV9SRUdJT05fV09SS1MgMjEKKyNpZmRlZiBfX0tWTV9IQVZFX1VTRVJfTk1JCisjZGVmaW5lIEtWTV9DQVBfVVNFUl9OTUkgMjIKKyNlbmRpZgorI2lmZGVmIF9fS1ZNX0hBVkVfR1VFU1RfREVCVUcKKyNkZWZpbmUgS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcgMjMKKyNlbmRpZgorI2lmZGVmIF9fS1ZNX0hBVkVfUElUCisjZGVmaW5lIEtWTV9DQVBfUkVJTkpFQ1RfQ09OVFJPTCAyNAorI2VuZGlmCisjaWZkZWYgX19LVk1fSEFWRV9JT0FQSUMKKyNkZWZpbmUgS1ZNX0NBUF9JUlFfUk9VVElORyAyNQorI2VuZGlmCisjZGVmaW5lIEtWTV9DQVBfSVJRX0lOSkVDVF9TVEFUVVMgMjYKKyNpZmRlZiBfX0tWTV9IQVZFX0RFVklDRV9BU1NJR05NRU5UCisjZGVmaW5lIEtWTV9DQVBfREVWSUNFX0RFQVNTSUdOTUVOVCAyNworI2VuZGlmCisjaWZkZWYgX19LVk1fSEFWRV9NU0lYCisjZGVmaW5lIEtWTV9DQVBfREVWSUNFX01TSVggMjgKKyNlbmRpZgorI2RlZmluZSBLVk1fQ0FQX0FTU0lHTl9ERVZfSVJRIDI5CisvKiBBbm90aGVyIGJ1ZyBpbiBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTiBmaXhlZDogKi8KKyNkZWZpbmUgS1ZNX0NBUF9KT0lOX01FTU9SWV9SRUdJT05TX1dPUktTIDMwCisjaWZkZWYgX19LVk1fSEFWRV9NQ0UKKyNkZWZpbmUgS1ZNX0NBUF9NQ0UgMzEKKyNlbmRpZgorI2RlZmluZSBLVk1fQ0FQX0lSUUZEIDMyCisjaWZkZWYgX19LVk1fSEFWRV9QSVQKKyNkZWZpbmUgS1ZNX0NBUF9QSVQyIDMzCisjZW5kaWYKKyNkZWZpbmUgS1ZNX0NBUF9TRVRfQk9PVF9DUFVfSUQgMzQKKyNpZmRlZiBfX0tWTV9IQVZFX1BJVF9TVEFURTIKKyNkZWZpbmUgS1ZNX0NBUF9QSVRfU1RBVEUyIDM1CisjZW5kaWYKKyNkZWZpbmUgS1ZNX0NBUF9JT0VWRU5URkQgMzYKKyNkZWZpbmUgS1ZNX0NBUF9TRVRfSURFTlRJVFlfTUFQX0FERFIgMzcKKyNpZmRlZiBfX0tWTV9IQVZFX1hFTl9IVk0KKyNkZWZpbmUgS1ZNX0NBUF9YRU5fSFZNIDM4CisjZW5kaWYKKyNkZWZpbmUgS1ZNX0NBUF9BREpVU1RfQ0xPQ0sgMzkKKyNkZWZpbmUgS1ZNX0NBUF9JTlRFUk5BTF9FUlJPUl9EQVRBIDQwCisjaWZkZWYgX19LVk1fSEFWRV9WQ1BVX0VWRU5UUworI2RlZmluZSBLVk1fQ0FQX1ZDUFVfRVZFTlRTIDQxCisjZW5kaWYKKyNkZWZpbmUgS1ZNX0NBUF9TMzkwX1BTVyA0MgorI2RlZmluZSBLVk1fQ0FQX1BQQ19TRUdTVEFURSA0MworI2RlZmluZSBLVk1fQ0FQX0hZUEVSViA0NAorI2RlZmluZSBLVk1fQ0FQX0hZUEVSVl9WQVBJQyA0NQorI2RlZmluZSBLVk1fQ0FQX0hZUEVSVl9TUElOIDQ2CisjZGVmaW5lIEtWTV9DQVBfUENJX1NFR01FTlQgNDcKKyNkZWZpbmUgS1ZNX0NBUF9QUENfUEFJUkVEX1NJTkdMRVMgNDgKKyNkZWZpbmUgS1ZNX0NBUF9JTlRSX1NIQURPVyA0OQorI2lmZGVmIF9fS1ZNX0hBVkVfREVCVUdSRUdTCisjZGVmaW5lIEtWTV9DQVBfREVCVUdSRUdTIDUwCisjZW5kaWYKKyNkZWZpbmUgS1ZNX0NBUF9YODZfUk9CVVNUX1NJTkdMRVNURVAgNTEKKyNkZWZpbmUgS1ZNX0NBUF9QUENfT1NJIDUyCisjZGVmaW5lIEtWTV9DQVBfUFBDX1VOU0VUX0lSUSA1MworI2RlZmluZSBLVk1fQ0FQX0VOQUJMRV9DQVAgNTQKKyNpZmRlZiBfX0tWTV9IQVZFX1hTQVZFCisjZGVmaW5lIEtWTV9DQVBfWFNBVkUgNTUKKyNlbmRpZgorI2lmZGVmIF9fS1ZNX0hBVkVfWENSUworI2RlZmluZSBLVk1fQ0FQX1hDUlMgNTYKKyNlbmRpZgorI2RlZmluZSBLVk1fQ0FQX1BQQ19HRVRfUFZJTkZPIDU3CisjZGVmaW5lIEtWTV9DQVBfUFBDX0lSUV9MRVZFTCA1OAorI2RlZmluZSBLVk1fQ0FQX0FTWU5DX1BGIDU5CisjZGVmaW5lIEtWTV9DQVBfVFNDX0NPTlRST0wgNjAKKyNkZWZpbmUgS1ZNX0NBUF9HRVRfVFNDX0tIWiA2MQorI2RlZmluZSBLVk1fQ0FQX1BQQ19CT09LRV9TUkVHUyA2MgorI2RlZmluZSBLVk1fQ0FQX1NQQVBSX1RDRSA2MworI2RlZmluZSBLVk1fQ0FQX1BQQ19TTVQgNjQKKyNkZWZpbmUgS1ZNX0NBUF9QUENfUk1BCTY1CisjZGVmaW5lIEtWTV9DQVBfTUFYX1ZDUFVTIDY2ICAgICAgIC8qIHJldHVybnMgbWF4IHZjcHVzIHBlciB2bSAqLworI2RlZmluZSBLVk1fQ0FQX1BQQ19QQVBSIDY4CisjZGVmaW5lIEtWTV9DQVBfUzM5MF9HTUFQIDcxCisjZGVmaW5lIEtWTV9DQVBfVFNDX0RFQURMSU5FX1RJTUVSIDcyCisKKyNpZmRlZiBLVk1fQ0FQX0lSUV9ST1VUSU5HCisKK3N0cnVjdCBrdm1faXJxX3JvdXRpbmdfaXJxY2hpcCB7CisJX191MzIgaXJxY2hpcDsKKwlfX3UzMiBwaW47Cit9OworCitzdHJ1Y3Qga3ZtX2lycV9yb3V0aW5nX21zaSB7CisJX191MzIgYWRkcmVzc19sbzsKKwlfX3UzMiBhZGRyZXNzX2hpOworCV9fdTMyIGRhdGE7CisJX191MzIgcGFkOworfTsKKworLyogZ3NpIHJvdXRpbmcgZW50cnkgdHlwZXMgKi8KKyNkZWZpbmUgS1ZNX0lSUV9ST1VUSU5HX0lSUUNISVAgMQorI2RlZmluZSBLVk1fSVJRX1JPVVRJTkdfTVNJIDIKKworc3RydWN0IGt2bV9pcnFfcm91dGluZ19lbnRyeSB7CisJX191MzIgZ3NpOworCV9fdTMyIHR5cGU7CisJX191MzIgZmxhZ3M7CisJX191MzIgcGFkOworCXVuaW9uIHsKKwkJc3RydWN0IGt2bV9pcnFfcm91dGluZ19pcnFjaGlwIGlycWNoaXA7CisJCXN0cnVjdCBrdm1faXJxX3JvdXRpbmdfbXNpIG1zaTsKKwkJX191MzIgcGFkWzhdOworCX0gdTsKK307CisKK3N0cnVjdCBrdm1faXJxX3JvdXRpbmcgeworCV9fdTMyIG5yOworCV9fdTMyIGZsYWdzOworCXN0cnVjdCBrdm1faXJxX3JvdXRpbmdfZW50cnkgZW50cmllc1swXTsKK307CisKKyNlbmRpZgorCisjaWZkZWYgS1ZNX0NBUF9NQ0UKKy8qIHg4NiBNQ0UgKi8KK3N0cnVjdCBrdm1feDg2X21jZSB7CisJX191NjQgc3RhdHVzOworCV9fdTY0IGFkZHI7CisJX191NjQgbWlzYzsKKwlfX3U2NCBtY2dfc3RhdHVzOworCV9fdTggYmFuazsKKwlfX3U4IHBhZDFbN107CisJX191NjQgcGFkMlszXTsKK307CisjZW5kaWYKKworI2lmZGVmIEtWTV9DQVBfWEVOX0hWTQorc3RydWN0IGt2bV94ZW5faHZtX2NvbmZpZyB7CisJX191MzIgZmxhZ3M7CisJX191MzIgbXNyOworCV9fdTY0IGJsb2JfYWRkcl8zMjsKKwlfX3U2NCBibG9iX2FkZHJfNjQ7CisJX191OCBibG9iX3NpemVfMzI7CisJX191OCBibG9iX3NpemVfNjQ7CisJX191OCBwYWQyWzMwXTsKK307CisjZW5kaWYKKworI2RlZmluZSBLVk1fSVJRRkRfRkxBR19ERUFTU0lHTiAoMSA8PCAwKQorCitzdHJ1Y3Qga3ZtX2lycWZkIHsKKwlfX3UzMiBmZDsKKwlfX3UzMiBnc2k7CisJX191MzIgZmxhZ3M7CisJX191OCAgcGFkWzIwXTsKK307CisKK3N0cnVjdCBrdm1fY2xvY2tfZGF0YSB7CisJX191NjQgY2xvY2s7CisJX191MzIgZmxhZ3M7CisJX191MzIgcGFkWzldOworfTsKKworLyoKKyAqIGlvY3RscyBmb3IgVk0gZmRzCisgKi8KKyNkZWZpbmUgS1ZNX1NFVF9NRU1PUllfUkVHSU9OICAgICBfSU9XKEtWTUlPLCAgMHg0MCwgc3RydWN0IGt2bV9tZW1vcnlfcmVnaW9uKQorLyoKKyAqIEtWTV9DUkVBVEVfVkNQVSByZWNlaXZlcyBhcyBhIHBhcmFtZXRlciB0aGUgdmNwdSBzbG90LCBhbmQgcmV0dXJucworICogYSB2Y3B1IGZkLgorICovCisjZGVmaW5lIEtWTV9DUkVBVEVfVkNQVSAgICAgICAgICAgX0lPKEtWTUlPLCAgIDB4NDEpCisjZGVmaW5lIEtWTV9HRVRfRElSVFlfTE9HICAgICAgICAgX0lPVyhLVk1JTywgIDB4NDIsIHN0cnVjdCBrdm1fZGlydHlfbG9nKQorLyogS1ZNX1NFVF9NRU1PUllfQUxJQVMgaXMgb2Jzb2xldGU6ICovCisjZGVmaW5lIEtWTV9TRVRfTUVNT1JZX0FMSUFTICAgICAgX0lPVyhLVk1JTywgIDB4NDMsIHN0cnVjdCBrdm1fbWVtb3J5X2FsaWFzKQorI2RlZmluZSBLVk1fU0VUX05SX01NVV9QQUdFUyAgICAgIF9JTyhLVk1JTywgICAweDQ0KQorI2RlZmluZSBLVk1fR0VUX05SX01NVV9QQUdFUyAgICAgIF9JTyhLVk1JTywgICAweDQ1KQorI2RlZmluZSBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTiBfSU9XKEtWTUlPLCAweDQ2LCBcCisJCQkJCXN0cnVjdCBrdm1fdXNlcnNwYWNlX21lbW9yeV9yZWdpb24pCisjZGVmaW5lIEtWTV9TRVRfVFNTX0FERFIgICAgICAgICAgX0lPKEtWTUlPLCAgIDB4NDcpCisjZGVmaW5lIEtWTV9TRVRfSURFTlRJVFlfTUFQX0FERFIgX0lPVyhLVk1JTywgIDB4NDgsIF9fdTY0KQorLyogRGV2aWNlIG1vZGVsIElPQyAqLworI2RlZmluZSBLVk1fQ1JFQVRFX0lSUUNISVAgICAgICAgIF9JTyhLVk1JTywgICAweDYwKQorI2RlZmluZSBLVk1fSVJRX0xJTkUgICAgICAgICAgICAgIF9JT1coS1ZNSU8sICAweDYxLCBzdHJ1Y3Qga3ZtX2lycV9sZXZlbCkKKyNkZWZpbmUgS1ZNX0dFVF9JUlFDSElQICAgICAgICAgICBfSU9XUihLVk1JTywgMHg2Miwgc3RydWN0IGt2bV9pcnFjaGlwKQorI2RlZmluZSBLVk1fU0VUX0lSUUNISVAgICAgICAgICAgIF9JT1IoS1ZNSU8sICAweDYzLCBzdHJ1Y3Qga3ZtX2lycWNoaXApCisjZGVmaW5lIEtWTV9DUkVBVEVfUElUICAgICAgICAgICAgX0lPKEtWTUlPLCAgIDB4NjQpCisjZGVmaW5lIEtWTV9HRVRfUElUICAgICAgICAgICAgICAgX0lPV1IoS1ZNSU8sIDB4NjUsIHN0cnVjdCBrdm1fcGl0X3N0YXRlKQorI2RlZmluZSBLVk1fU0VUX1BJVCAgICAgICAgICAgICAgIF9JT1IoS1ZNSU8sICAweDY2LCBzdHJ1Y3Qga3ZtX3BpdF9zdGF0ZSkKKyNkZWZpbmUgS1ZNX0lSUV9MSU5FX1NUQVRVUyAgICAgICBfSU9XUihLVk1JTywgMHg2Nywgc3RydWN0IGt2bV9pcnFfbGV2ZWwpCisjZGVmaW5lIEtWTV9SRUdJU1RFUl9DT0FMRVNDRURfTU1JTyBcCisJCQlfSU9XKEtWTUlPLCAgMHg2Nywgc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb196b25lKQorI2RlZmluZSBLVk1fVU5SRUdJU1RFUl9DT0FMRVNDRURfTU1JTyBcCisJCQlfSU9XKEtWTUlPLCAgMHg2OCwgc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb196b25lKQorI2RlZmluZSBLVk1fQVNTSUdOX1BDSV9ERVZJQ0UgICAgIF9JT1IoS1ZNSU8sICAweDY5LCBcCisJCQkJICAgICAgIHN0cnVjdCBrdm1fYXNzaWduZWRfcGNpX2RldikKKyNkZWZpbmUgS1ZNX1NFVF9HU0lfUk9VVElORyAgICAgICBfSU9XKEtWTUlPLCAgMHg2YSwgc3RydWN0IGt2bV9pcnFfcm91dGluZykKKy8qIGRlcHJlY2F0ZWQsIHJlcGxhY2VkIGJ5IEtWTV9BU1NJR05fREVWX0lSUSAqLworI2RlZmluZSBLVk1fQVNTSUdOX0lSUSAgICAgICAgICAgIF9fS1ZNX0RFUFJFQ0FURURfVk1fUl8weDcwCisjZGVmaW5lIEtWTV9BU1NJR05fREVWX0lSUSAgICAgICAgX0lPVyhLVk1JTywgIDB4NzAsIHN0cnVjdCBrdm1fYXNzaWduZWRfaXJxKQorI2RlZmluZSBLVk1fUkVJTkpFQ1RfQ09OVFJPTCAgICAgIF9JTyhLVk1JTywgICAweDcxKQorI2RlZmluZSBLVk1fREVBU1NJR05fUENJX0RFVklDRSAgIF9JT1coS1ZNSU8sICAweDcyLCBcCisJCQkJICAgICAgIHN0cnVjdCBrdm1fYXNzaWduZWRfcGNpX2RldikKKyNkZWZpbmUgS1ZNX0FTU0lHTl9TRVRfTVNJWF9OUiAgICBfSU9XKEtWTUlPLCAgMHg3MywgXAorCQkJCSAgICAgICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX21zaXhfbnIpCisjZGVmaW5lIEtWTV9BU1NJR05fU0VUX01TSVhfRU5UUlkgX0lPVyhLVk1JTywgIDB4NzQsIFwKKwkJCQkgICAgICAgc3RydWN0IGt2bV9hc3NpZ25lZF9tc2l4X2VudHJ5KQorI2RlZmluZSBLVk1fREVBU1NJR05fREVWX0lSUSAgICAgIF9JT1coS1ZNSU8sICAweDc1LCBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2lycSkKKyNkZWZpbmUgS1ZNX0lSUUZEICAgICAgICAgICAgICAgICBfSU9XKEtWTUlPLCAgMHg3Niwgc3RydWN0IGt2bV9pcnFmZCkKKyNkZWZpbmUgS1ZNX0NSRUFURV9QSVQyCQkgIF9JT1coS1ZNSU8sICAweDc3LCBzdHJ1Y3Qga3ZtX3BpdF9jb25maWcpCisjZGVmaW5lIEtWTV9TRVRfQk9PVF9DUFVfSUQgICAgICAgX0lPKEtWTUlPLCAgIDB4NzgpCisjZGVmaW5lIEtWTV9JT0VWRU5URkQgICAgICAgICAgICAgX0lPVyhLVk1JTywgIDB4NzksIHN0cnVjdCBrdm1faW9ldmVudGZkKQorI2RlZmluZSBLVk1fWEVOX0hWTV9DT05GSUcgICAgICAgIF9JT1coS1ZNSU8sICAweDdhLCBzdHJ1Y3Qga3ZtX3hlbl9odm1fY29uZmlnKQorI2RlZmluZSBLVk1fU0VUX0NMT0NLICAgICAgICAgICAgIF9JT1coS1ZNSU8sICAweDdiLCBzdHJ1Y3Qga3ZtX2Nsb2NrX2RhdGEpCisjZGVmaW5lIEtWTV9HRVRfQ0xPQ0sgICAgICAgICAgICAgX0lPUihLVk1JTywgIDB4N2MsIHN0cnVjdCBrdm1fY2xvY2tfZGF0YSkKKy8qIEF2YWlsYWJsZSB3aXRoIEtWTV9DQVBfUElUX1NUQVRFMiAqLworI2RlZmluZSBLVk1fR0VUX1BJVDIgICAgICAgICAgICAgIF9JT1IoS1ZNSU8sICAweDlmLCBzdHJ1Y3Qga3ZtX3BpdF9zdGF0ZTIpCisjZGVmaW5lIEtWTV9TRVRfUElUMiAgICAgICAgICAgICAgX0lPVyhLVk1JTywgIDB4YTAsIHN0cnVjdCBrdm1fcGl0X3N0YXRlMikKKy8qIEF2YWlsYWJsZSB3aXRoIEtWTV9DQVBfUFBDX0dFVF9QVklORk8gKi8KKyNkZWZpbmUgS1ZNX1BQQ19HRVRfUFZJTkZPCSAgX0lPVyhLVk1JTywgIDB4YTEsIHN0cnVjdCBrdm1fcHBjX3B2aW5mbykKKy8qIEF2YWlsYWJsZSB3aXRoIEtWTV9DQVBfVFNDX0NPTlRST0wgKi8KKyNkZWZpbmUgS1ZNX1NFVF9UU0NfS0haICAgICAgICAgICBfSU8oS1ZNSU8sICAweGEyKQorI2RlZmluZSBLVk1fR0VUX1RTQ19LSFogICAgICAgICAgIF9JTyhLVk1JTywgIDB4YTMpCisKKy8qCisgKiBpb2N0bHMgZm9yIHZjcHUgZmRzCisgKi8KKyNkZWZpbmUgS1ZNX1JVTiAgICAgICAgICAgICAgICAgICBfSU8oS1ZNSU8sICAgMHg4MCkKKyNkZWZpbmUgS1ZNX0dFVF9SRUdTICAgICAgICAgICAgICBfSU9SKEtWTUlPLCAgMHg4MSwgc3RydWN0IGt2bV9yZWdzKQorI2RlZmluZSBLVk1fU0VUX1JFR1MgICAgICAgICAgICAgIF9JT1coS1ZNSU8sICAweDgyLCBzdHJ1Y3Qga3ZtX3JlZ3MpCisjZGVmaW5lIEtWTV9HRVRfU1JFR1MgICAgICAgICAgICAgX0lPUihLVk1JTywgIDB4ODMsIHN0cnVjdCBrdm1fc3JlZ3MpCisjZGVmaW5lIEtWTV9TRVRfU1JFR1MgICAgICAgICAgICAgX0lPVyhLVk1JTywgIDB4ODQsIHN0cnVjdCBrdm1fc3JlZ3MpCisjZGVmaW5lIEtWTV9UUkFOU0xBVEUgICAgICAgICAgICAgX0lPV1IoS1ZNSU8sIDB4ODUsIHN0cnVjdCBrdm1fdHJhbnNsYXRpb24pCisjZGVmaW5lIEtWTV9JTlRFUlJVUFQgICAgICAgICAgICAgX0lPVyhLVk1JTywgIDB4ODYsIHN0cnVjdCBrdm1faW50ZXJydXB0KQorLyogS1ZNX0RFQlVHX0dVRVNUIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQsIHVzZSBLVk1fU0VUX0dVRVNUX0RFQlVHIGluc3RlYWQgKi8KKyNkZWZpbmUgS1ZNX0RFQlVHX0dVRVNUICAgICAgICAgICBfX0tWTV9ERVBSRUNBVEVEX1ZDUFVfV18weDg3CisjZGVmaW5lIEtWTV9HRVRfTVNSUyAgICAgICAgICAgICAgX0lPV1IoS1ZNSU8sIDB4ODgsIHN0cnVjdCBrdm1fbXNycykKKyNkZWZpbmUgS1ZNX1NFVF9NU1JTICAgICAgICAgICAgICBfSU9XKEtWTUlPLCAgMHg4OSwgc3RydWN0IGt2bV9tc3JzKQorI2RlZmluZSBLVk1fU0VUX0NQVUlEICAgICAgICAgICAgIF9JT1coS1ZNSU8sICAweDhhLCBzdHJ1Y3Qga3ZtX2NwdWlkKQorI2RlZmluZSBLVk1fU0VUX1NJR05BTF9NQVNLICAgICAgIF9JT1coS1ZNSU8sICAweDhiLCBzdHJ1Y3Qga3ZtX3NpZ25hbF9tYXNrKQorI2RlZmluZSBLVk1fR0VUX0ZQVSAgICAgICAgICAgICAgIF9JT1IoS1ZNSU8sICAweDhjLCBzdHJ1Y3Qga3ZtX2ZwdSkKKyNkZWZpbmUgS1ZNX1NFVF9GUFUgICAgICAgICAgICAgICBfSU9XKEtWTUlPLCAgMHg4ZCwgc3RydWN0IGt2bV9mcHUpCisjZGVmaW5lIEtWTV9HRVRfTEFQSUMgICAgICAgICAgICAgX0lPUihLVk1JTywgIDB4OGUsIHN0cnVjdCBrdm1fbGFwaWNfc3RhdGUpCisjZGVmaW5lIEtWTV9TRVRfTEFQSUMgICAgICAgICAgICAgX0lPVyhLVk1JTywgIDB4OGYsIHN0cnVjdCBrdm1fbGFwaWNfc3RhdGUpCisjZGVmaW5lIEtWTV9TRVRfQ1BVSUQyICAgICAgICAgICAgX0lPVyhLVk1JTywgIDB4OTAsIHN0cnVjdCBrdm1fY3B1aWQyKQorI2RlZmluZSBLVk1fR0VUX0NQVUlEMiAgICAgICAgICAgIF9JT1dSKEtWTUlPLCAweDkxLCBzdHJ1Y3Qga3ZtX2NwdWlkMikKKy8qIEF2YWlsYWJsZSB3aXRoIEtWTV9DQVBfVkFQSUMgKi8KKyNkZWZpbmUgS1ZNX1RQUl9BQ0NFU1NfUkVQT1JUSU5HICBfSU9XUihLVk1JTywgMHg5Miwgc3RydWN0IGt2bV90cHJfYWNjZXNzX2N0bCkKKy8qIEF2YWlsYWJsZSB3aXRoIEtWTV9DQVBfVkFQSUMgKi8KKyNkZWZpbmUgS1ZNX1NFVF9WQVBJQ19BRERSICAgICAgICBfSU9XKEtWTUlPLCAgMHg5Mywgc3RydWN0IGt2bV92YXBpY19hZGRyKQorLyogdmFsaWQgZm9yIHZpcnR1YWwgbWFjaGluZSAoZm9yIGZsb2F0aW5nIGludGVycnVwdClfYW5kXyB2Y3B1ICovCisjZGVmaW5lIEtWTV9TMzkwX0lOVEVSUlVQVCAgICAgICAgX0lPVyhLVk1JTywgIDB4OTQsIHN0cnVjdCBrdm1fczM5MF9pbnRlcnJ1cHQpCisvKiBzdG9yZSBzdGF0dXMgZm9yIHMzOTAgKi8KKyNkZWZpbmUgS1ZNX1MzOTBfU1RPUkVfU1RBVFVTX05PQUREUiAgICAoLTF1bCkKKyNkZWZpbmUgS1ZNX1MzOTBfU1RPUkVfU1RBVFVTX1BSRUZJWEVEICAoLTJ1bCkKKyNkZWZpbmUgS1ZNX1MzOTBfU1RPUkVfU1RBVFVTCSAgX0lPVyhLVk1JTywgIDB4OTUsIHVuc2lnbmVkIGxvbmcpCisvKiBpbml0aWFsIGlwbCBwc3cgZm9yIHMzOTAgKi8KKyNkZWZpbmUgS1ZNX1MzOTBfU0VUX0lOSVRJQUxfUFNXICBfSU9XKEtWTUlPLCAgMHg5Niwgc3RydWN0IGt2bV9zMzkwX3BzdykKKy8qIGluaXRpYWwgcmVzZXQgZm9yIHMzOTAgKi8KKyNkZWZpbmUgS1ZNX1MzOTBfSU5JVElBTF9SRVNFVCAgICBfSU8oS1ZNSU8sICAgMHg5NykKKyNkZWZpbmUgS1ZNX0dFVF9NUF9TVEFURSAgICAgICAgICBfSU9SKEtWTUlPLCAgMHg5OCwgc3RydWN0IGt2bV9tcF9zdGF0ZSkKKyNkZWZpbmUgS1ZNX1NFVF9NUF9TVEFURSAgICAgICAgICBfSU9XKEtWTUlPLCAgMHg5OSwgc3RydWN0IGt2bV9tcF9zdGF0ZSkKKy8qIEF2YWlsYWJsZSB3aXRoIEtWTV9DQVBfTk1JICovCisjZGVmaW5lIEtWTV9OTUkgICAgICAgICAgICAgICAgICAgX0lPKEtWTUlPLCAgIDB4OWEpCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX1NFVF9HVUVTVF9ERUJVRyAqLworI2RlZmluZSBLVk1fU0VUX0dVRVNUX0RFQlVHICAgICAgIF9JT1coS1ZNSU8sICAweDliLCBzdHJ1Y3Qga3ZtX2d1ZXN0X2RlYnVnKQorLyogTUNFIGZvciB4ODYgKi8KKyNkZWZpbmUgS1ZNX1g4Nl9TRVRVUF9NQ0UgICAgICAgICBfSU9XKEtWTUlPLCAgMHg5YywgX191NjQpCisjZGVmaW5lIEtWTV9YODZfR0VUX01DRV9DQVBfU1VQUE9SVEVEIF9JT1IoS1ZNSU8sICAweDlkLCBfX3U2NCkKKyNkZWZpbmUgS1ZNX1g4Nl9TRVRfTUNFICAgICAgICAgICBfSU9XKEtWTUlPLCAgMHg5ZSwgc3RydWN0IGt2bV94ODZfbWNlKQorLyogSUE2NCBzdGFjayBhY2Nlc3MgKi8KKyNkZWZpbmUgS1ZNX0lBNjRfVkNQVV9HRVRfU1RBQ0sgICBfSU9SKEtWTUlPLCAgMHg5YSwgdm9pZCAqKQorI2RlZmluZSBLVk1fSUE2NF9WQ1BVX1NFVF9TVEFDSyAgIF9JT1coS1ZNSU8sICAweDliLCB2b2lkICopCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX1ZDUFVfRVZFTlRTICovCisjZGVmaW5lIEtWTV9HRVRfVkNQVV9FVkVOVFMgICAgICAgX0lPUihLVk1JTywgIDB4OWYsIHN0cnVjdCBrdm1fdmNwdV9ldmVudHMpCisjZGVmaW5lIEtWTV9TRVRfVkNQVV9FVkVOVFMgICAgICAgX0lPVyhLVk1JTywgIDB4YTAsIHN0cnVjdCBrdm1fdmNwdV9ldmVudHMpCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX0RFQlVHUkVHUyAqLworI2RlZmluZSBLVk1fR0VUX0RFQlVHUkVHUyAgICAgICAgIF9JT1IoS1ZNSU8sICAweGExLCBzdHJ1Y3Qga3ZtX2RlYnVncmVncykKKyNkZWZpbmUgS1ZNX1NFVF9ERUJVR1JFR1MgICAgICAgICBfSU9XKEtWTUlPLCAgMHhhMiwgc3RydWN0IGt2bV9kZWJ1Z3JlZ3MpCisjZGVmaW5lIEtWTV9FTkFCTEVfQ0FQICAgICAgICAgICAgX0lPVyhLVk1JTywgIDB4YTMsIHN0cnVjdCBrdm1fZW5hYmxlX2NhcCkKKy8qIEF2YWlsYWJsZSB3aXRoIEtWTV9DQVBfWFNBVkUgKi8KKyNkZWZpbmUgS1ZNX0dFVF9YU0FWRQkJICBfSU9SKEtWTUlPLCAgMHhhNCwgc3RydWN0IGt2bV94c2F2ZSkKKyNkZWZpbmUgS1ZNX1NFVF9YU0FWRQkJICBfSU9XKEtWTUlPLCAgMHhhNSwgc3RydWN0IGt2bV94c2F2ZSkKKy8qIEF2YWlsYWJsZSB3aXRoIEtWTV9DQVBfWENSUyAqLworI2RlZmluZSBLVk1fR0VUX1hDUlMJCSAgX0lPUihLVk1JTywgIDB4YTYsIHN0cnVjdCBrdm1feGNycykKKyNkZWZpbmUgS1ZNX1NFVF9YQ1JTCQkgIF9JT1coS1ZNSU8sICAweGE3LCBzdHJ1Y3Qga3ZtX3hjcnMpCisjZGVmaW5lIEtWTV9DUkVBVEVfU1BBUFJfVENFCSAgX0lPVyhLVk1JTywgIDB4YTgsIHN0cnVjdCBrdm1fY3JlYXRlX3NwYXByX3RjZSkKKy8qIEF2YWlsYWJsZSB3aXRoIEtWTV9DQVBfUk1BICovCisjZGVmaW5lIEtWTV9BTExPQ0FURV9STUEJICBfSU9SKEtWTUlPLCAgMHhhOSwgc3RydWN0IGt2bV9hbGxvY2F0ZV9ybWEpCisKKyNkZWZpbmUgS1ZNX0RFVl9BU1NJR05fRU5BQkxFX0lPTU1VCSgxIDw8IDApCisKK3N0cnVjdCBrdm1fYXNzaWduZWRfcGNpX2RldiB7CisJX191MzIgYXNzaWduZWRfZGV2X2lkOworCV9fdTMyIGJ1c25yOworCV9fdTMyIGRldmZuOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHNlZ25yOworCXVuaW9uIHsKKwkJX191MzIgcmVzZXJ2ZWRbMTFdOworCX07Cit9OworCisjZGVmaW5lIEtWTV9ERVZfSVJRX0hPU1RfSU5UWCAgICAoMSA8PCAwKQorI2RlZmluZSBLVk1fREVWX0lSUV9IT1NUX01TSSAgICAgKDEgPDwgMSkKKyNkZWZpbmUgS1ZNX0RFVl9JUlFfSE9TVF9NU0lYICAgICgxIDw8IDIpCisKKyNkZWZpbmUgS1ZNX0RFVl9JUlFfR1VFU1RfSU5UWCAgICgxIDw8IDgpCisjZGVmaW5lIEtWTV9ERVZfSVJRX0dVRVNUX01TSSAgICAoMSA8PCA5KQorI2RlZmluZSBLVk1fREVWX0lSUV9HVUVTVF9NU0lYICAgKDEgPDwgMTApCisKKyNkZWZpbmUgS1ZNX0RFVl9JUlFfSE9TVF9NQVNLCSAweDAwZmYKKyNkZWZpbmUgS1ZNX0RFVl9JUlFfR1VFU1RfTUFTSyAgIDB4ZmYwMAorCitzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2lycSB7CisJX191MzIgYXNzaWduZWRfZGV2X2lkOworCV9fdTMyIGhvc3RfaXJxOyAvKiBpZ25vcmVkIChsZWdhY3kgZmllbGQpICovCisJX191MzIgZ3Vlc3RfaXJxOworCV9fdTMyIGZsYWdzOworCXVuaW9uIHsKKwkJX191MzIgcmVzZXJ2ZWRbMTJdOworCX07Cit9OworCitzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX21zaXhfbnIgeworCV9fdTMyIGFzc2lnbmVkX2Rldl9pZDsKKwlfX3UxNiBlbnRyeV9ucjsKKwlfX3UxNiBwYWRkaW5nOworfTsKKworI2RlZmluZSBLVk1fTUFYX01TSVhfUEVSX0RFVgkJMjU2CitzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX21zaXhfZW50cnkgeworCV9fdTMyIGFzc2lnbmVkX2Rldl9pZDsKKwlfX3UzMiBnc2k7CisJX191MTYgZW50cnk7IC8qIFRoZSBpbmRleCBvZiBlbnRyeSBpbiB0aGUgTVNJLVggdGFibGUgKi8KKwlfX3UxNiBwYWRkaW5nWzNdOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfS1ZNX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva3ZtX3BhcmEuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva3ZtX3BhcmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzE1ZTI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rdm1fcGFyYS5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgX19MSU5VWF9LVk1fUEFSQV9ICisjZGVmaW5lIF9fTElOVVhfS1ZNX1BBUkFfSAorCisvKgorICogVGhpcyBoZWFkZXIgZmlsZSBwcm92aWRlcyBhIG1ldGhvZCBmb3IgbWFraW5nIGEgaHlwZXJjYWxsIHRvIHRoZSBob3N0CisgKiBBcmNoaXRlY3R1cmVzIHNob3VsZCBkZWZpbmU6CisgKiAtIGt2bV9oeXBlcmNhbGwwLCBrdm1faHlwZXJjYWxsMS4uLgorICogLSBrdm1fYXJjaF9wYXJhX2ZlYXR1cmVzCisgKiAtIGt2bV9wYXJhX2F2YWlsYWJsZQorICovCisKKy8qIFJldHVybiB2YWx1ZXMgZm9yIGh5cGVyY2FsbHMgKi8KKyNkZWZpbmUgS1ZNX0VOT1NZUwkJMTAwMAorI2RlZmluZSBLVk1fRUZBVUxUCQlFRkFVTFQKKyNkZWZpbmUgS1ZNX0UyQklHCQlFMkJJRworI2RlZmluZSBLVk1fRVBFUk0JCUVQRVJNCisKKyNkZWZpbmUgS1ZNX0hDX1ZBUElDX1BPTExfSVJRCQkxCisjZGVmaW5lIEtWTV9IQ19NTVVfT1AJCQkyCisjZGVmaW5lIEtWTV9IQ19GRUFUVVJFUwkJCTMKKyNkZWZpbmUgS1ZNX0hDX1BQQ19NQVBfTUFHSUNfUEFHRQk0CisKKy8qCisgKiBoeXBlcmNhbGxzIHVzZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMKKyAqLworI2luY2x1ZGUgPGFzbS9rdm1fcGFyYS5oPgorCisjZW5kaWYgLyogX19MSU5VWF9LVk1fUEFSQV9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbDJ0cC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9sMnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhNzRkZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbDJ0cC5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogTDJUUC1vdmVyLUlQIHNvY2tldCBmb3IgTDJUUHYzLgorICoKKyAqIEF1dGhvcjogSmFtZXMgQ2hhcG1hbiA8amNoYXBtYW5Aa2F0YWxpeC5jb20+CisgKi8KKworI2lmbmRlZiBfTElOVVhfTDJUUF9IXworI2RlZmluZSBfTElOVVhfTDJUUF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNkZWZpbmUgSVBQUk9UT19MMlRQCQkxMTUKKworLyoqCisgKiBzdHJ1Y3Qgc29ja2FkZHJfbDJ0cGlwIC0gdGhlIHNvY2thZGRyIHN0cnVjdHVyZSBmb3IgTDJUUC1vdmVyLUlQIHNvY2tldHMKKyAqIEBsMnRwX2ZhbWlseTogIGFkZHJlc3MgZmFtaWx5IG51bWJlciBBRl9MMlRQSVAuCisgKiBAbDJ0cF9hZGRyOiAgICBwcm90b2NvbCBzcGVjaWZpYyBhZGRyZXNzIGluZm9ybWF0aW9uCisgKiBAbDJ0cF9jb25uX2lkOiBjb25uZWN0aW9uIGlkIG9mIHR1bm5lbAorICovCisjZGVmaW5lIF9fU09DS19TSVpFX18JMTYJCS8qIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpCSovCitzdHJ1Y3Qgc29ja2FkZHJfbDJ0cGlwIHsKKwkvKiBUaGUgZmlyc3QgZmllbGRzIG11c3QgbWF0Y2ggc3RydWN0IHNvY2thZGRyX2luICovCisJX19rZXJuZWxfc2FfZmFtaWx5X3QgbDJ0cF9mYW1pbHk7IC8qIEFGX0lORVQgKi8KKwlfX2JlMTYJCWwydHBfdW51c2VkOwkvKiBJTkVUIHBvcnQgbnVtYmVyICh1bnVzZWQpICovCisJc3RydWN0IGluX2FkZHIJbDJ0cF9hZGRyOwkvKiBJbnRlcm5ldCBhZGRyZXNzICovCisKKwlfX3UzMgkJbDJ0cF9jb25uX2lkOwkvKiBDb25uZWN0aW9uIElEIG9mIHR1bm5lbCAqLworCisJLyogUGFkIHRvIHNpemUgb2YgYHN0cnVjdCBzb2NrYWRkcicuICovCisJdW5zaWduZWQgY2hhcglfX3BhZFtzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAtCisJCQkgICAgICBzaXplb2YoX19rZXJuZWxfc2FfZmFtaWx5X3QpIC0KKwkJCSAgICAgIHNpemVvZihfX2JlMTYpIC0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSAtCisJCQkgICAgICBzaXplb2YoX191MzIpXTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5FVExJTktfR0VORVJJQyBuZXRsaW5rIGZhbWlseS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvbW1hbmRzLgorICogVmFsaWQgVExWcyBvZiBlYWNoIGNvbW1hbmQgYXJlOi0KKyAqIFRVTk5FTF9DUkVBVEUJLSBDT05OX0lELCBwd190eXBlLCBuZXRucywgaWZuYW1lLCBpcGluZm8sIHVkcGluZm8sIHVkcGNzdW0sIHZsYW5pZAorICogVFVOTkVMX0RFTEVURQktIENPTk5fSUQKKyAqIFRVTk5FTF9NT0RJRlkJLSBDT05OX0lELCB1ZHBjc3VtCisgKiBUVU5ORUxfR0VUU1RBVFMJLSBDT05OX0lELCAoc3RhdHMpCisgKiBUVU5ORUxfR0VUCQktIENPTk5fSUQsICguLi4pCisgKiBTRVNTSU9OX0NSRUFURQktIFNFU1NJT05fSUQsIFBXX1RZUEUsIG9mZnNldCwgZGF0YV9zZXEsIGNvb2tpZSwgcGVlcl9jb29raWUsIG9mZnNldCwgbDJzcGVjCisgKiBTRVNTSU9OX0RFTEVURQktIFNFU1NJT05fSUQKKyAqIFNFU1NJT05fTU9ESUZZCS0gU0VTU0lPTl9JRCwgZGF0YV9zZXEKKyAqIFNFU1NJT05fR0VUCQktIFNFU1NJT05fSUQsICguLi4pCisgKiBTRVNTSU9OX0dFVFNUQVRTCS0gU0VTU0lPTl9JRCwgKHN0YXRzKQorICoKKyAqLworZW51bSB7CisJTDJUUF9DTURfTk9PUCwKKwlMMlRQX0NNRF9UVU5ORUxfQ1JFQVRFLAorCUwyVFBfQ01EX1RVTk5FTF9ERUxFVEUsCisJTDJUUF9DTURfVFVOTkVMX01PRElGWSwKKwlMMlRQX0NNRF9UVU5ORUxfR0VULAorCUwyVFBfQ01EX1NFU1NJT05fQ1JFQVRFLAorCUwyVFBfQ01EX1NFU1NJT05fREVMRVRFLAorCUwyVFBfQ01EX1NFU1NJT05fTU9ESUZZLAorCUwyVFBfQ01EX1NFU1NJT05fR0VULAorCV9fTDJUUF9DTURfTUFYLAorfTsKKworI2RlZmluZSBMMlRQX0NNRF9NQVgJCQkoX19MMlRQX0NNRF9NQVggLSAxKQorCisvKgorICogQVRUUiB0eXBlcyBkZWZpbmVkIGZvciBMMlRQCisgKi8KK2VudW0geworCUwyVFBfQVRUUl9OT05FLAkJCS8qIG5vIGRhdGEgKi8KKwlMMlRQX0FUVFJfUFdfVFlQRSwJCS8qIHUxNiwgZW51bSBsMnRwX3B3dHlwZSAqLworCUwyVFBfQVRUUl9FTkNBUF9UWVBFLAkJLyogdTE2LCBlbnVtIGwydHBfZW5jYXBfdHlwZSAqLworCUwyVFBfQVRUUl9PRkZTRVQsCQkvKiB1MTYgKi8KKwlMMlRQX0FUVFJfREFUQV9TRVEsCQkvKiB1MTYgKi8KKwlMMlRQX0FUVFJfTDJTUEVDX1RZUEUsCQkvKiB1OCwgZW51bSBsMnRwX2wyc3BlY190eXBlICovCisJTDJUUF9BVFRSX0wyU1BFQ19MRU4sCQkvKiB1OCwgZW51bSBsMnRwX2wyc3BlY190eXBlICovCisJTDJUUF9BVFRSX1BST1RPX1ZFUlNJT04sCS8qIHU4ICovCisJTDJUUF9BVFRSX0lGTkFNRSwJCS8qIHN0cmluZyAqLworCUwyVFBfQVRUUl9DT05OX0lELAkJLyogdTMyICovCisJTDJUUF9BVFRSX1BFRVJfQ09OTl9JRCwJCS8qIHUzMiAqLworCUwyVFBfQVRUUl9TRVNTSU9OX0lELAkJLyogdTMyICovCisJTDJUUF9BVFRSX1BFRVJfU0VTU0lPTl9JRCwJLyogdTMyICovCisJTDJUUF9BVFRSX1VEUF9DU1VNLAkJLyogdTggKi8KKwlMMlRQX0FUVFJfVkxBTl9JRCwJCS8qIHUxNiAqLworCUwyVFBfQVRUUl9DT09LSUUsCQkvKiAwLCA0IG9yIDggYnl0ZXMgKi8KKwlMMlRQX0FUVFJfUEVFUl9DT09LSUUsCQkvKiAwLCA0IG9yIDggYnl0ZXMgKi8KKwlMMlRQX0FUVFJfREVCVUcsCQkvKiB1MzIgKi8KKwlMMlRQX0FUVFJfUkVDVl9TRVEsCQkvKiB1OCAqLworCUwyVFBfQVRUUl9TRU5EX1NFUSwJCS8qIHU4ICovCisJTDJUUF9BVFRSX0xOU19NT0RFLAkJLyogdTggKi8KKwlMMlRQX0FUVFJfVVNJTkdfSVBTRUMsCQkvKiB1OCAqLworCUwyVFBfQVRUUl9SRUNWX1RJTUVPVVQsCQkvKiBtc2VjICovCisJTDJUUF9BVFRSX0ZELAkJCS8qIGludCAqLworCUwyVFBfQVRUUl9JUF9TQUREUiwJCS8qIHUzMiAqLworCUwyVFBfQVRUUl9JUF9EQUREUiwJCS8qIHUzMiAqLworCUwyVFBfQVRUUl9VRFBfU1BPUlQsCQkvKiB1MTYgKi8KKwlMMlRQX0FUVFJfVURQX0RQT1JULAkJLyogdTE2ICovCisJTDJUUF9BVFRSX01UVSwJCQkvKiB1MTYgKi8KKwlMMlRQX0FUVFJfTVJVLAkJCS8qIHUxNiAqLworCUwyVFBfQVRUUl9TVEFUUywJCS8qIG5lc3RlZCAqLworCV9fTDJUUF9BVFRSX01BWCwKK307CisKKyNkZWZpbmUgTDJUUF9BVFRSX01BWAkJCShfX0wyVFBfQVRUUl9NQVggLSAxKQorCisvKiBOZXN0ZWQgaW4gTDJUUF9BVFRSX1NUQVRTICovCitlbnVtIHsKKwlMMlRQX0FUVFJfU1RBVFNfTk9ORSwJCS8qIG5vIGRhdGEgKi8KKwlMMlRQX0FUVFJfVFhfUEFDS0VUUywJCS8qIHU2NCAqLworCUwyVFBfQVRUUl9UWF9CWVRFUywJCS8qIHU2NCAqLworCUwyVFBfQVRUUl9UWF9FUlJPUlMsCQkvKiB1NjQgKi8KKwlMMlRQX0FUVFJfUlhfUEFDS0VUUywJCS8qIHU2NCAqLworCUwyVFBfQVRUUl9SWF9CWVRFUywJCS8qIHU2NCAqLworCUwyVFBfQVRUUl9SWF9TRVFfRElTQ0FSRFMsCS8qIHU2NCAqLworCUwyVFBfQVRUUl9SWF9PT1NfUEFDS0VUUywJLyogdTY0ICovCisJTDJUUF9BVFRSX1JYX0VSUk9SUywJCS8qIHU2NCAqLworCV9fTDJUUF9BVFRSX1NUQVRTX01BWCwKK307CisKKyNkZWZpbmUgTDJUUF9BVFRSX1NUQVRTX01BWAkJKF9fTDJUUF9BVFRSX1NUQVRTX01BWCAtIDEpCisKK2VudW0gbDJ0cF9wd3R5cGUgeworCUwyVFBfUFdUWVBFX05PTkUgPSAweDAwMDAsCisJTDJUUF9QV1RZUEVfRVRIX1ZMQU4gPSAweDAwMDQsCisJTDJUUF9QV1RZUEVfRVRIID0gMHgwMDA1LAorCUwyVFBfUFdUWVBFX1BQUCA9IDB4MDAwNywKKwlMMlRQX1BXVFlQRV9QUFBfQUMgPSAweDAwMDgsCisJTDJUUF9QV1RZUEVfSVAgPSAweDAwMGIsCisJX19MMlRQX1BXVFlQRV9NQVgKK307CisKK2VudW0gbDJ0cF9sMnNwZWNfdHlwZSB7CisJTDJUUF9MMlNQRUNUWVBFX05PTkUsCisJTDJUUF9MMlNQRUNUWVBFX0RFRkFVTFQsCit9OworCitlbnVtIGwydHBfZW5jYXBfdHlwZSB7CisJTDJUUF9FTkNBUFRZUEVfVURQLAorCUwyVFBfRU5DQVBUWVBFX0lQLAorfTsKKworZW51bSBsMnRwX3NlcW1vZGUgeworCUwyVFBfU0VRX05PTkUgPSAwLAorCUwyVFBfU0VRX0lQID0gMSwKKwlMMlRQX1NFUV9BTEwgPSAyLAorfTsKKworLyoKKyAqIE5FVExJTktfR0VORVJJQyByZWxhdGVkIGluZm8KKyAqLworI2RlZmluZSBMMlRQX0dFTkxfTkFNRQkJImwydHAiCisjZGVmaW5lIEwyVFBfR0VOTF9WRVJTSU9OCTB4MQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbGltaXRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMGY5NDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX0xJTlVYX0xJTUlUU19ICisjZGVmaW5lIF9MSU5VWF9MSU1JVFNfSAorCisjZGVmaW5lIE5SX09QRU4JICAgICAgICAxMDI0CisKKyNkZWZpbmUgTkdST1VQU19NQVggICAgNjU1MzYJLyogc3VwcGxlbWVudGFsIGdyb3VwIElEcyBhcmUgYXZhaWxhYmxlICovCisjZGVmaW5lIEFSR19NQVggICAgICAgMTMxMDcyCS8qICMgYnl0ZXMgb2YgYXJncyArIGVudmlyb24gZm9yIGV4ZWMoKSAqLworI2RlZmluZSBMSU5LX01BWCAgICAgICAgIDEyNwkvKiAjIGxpbmtzIGEgZmlsZSBtYXkgaGF2ZSAqLworI2RlZmluZSBNQVhfQ0FOT04gICAgICAgIDI1NQkvKiBzaXplIG9mIHRoZSBjYW5vbmljYWwgaW5wdXQgcXVldWUgKi8KKyNkZWZpbmUgTUFYX0lOUFVUICAgICAgICAyNTUJLyogc2l6ZSBvZiB0aGUgdHlwZS1haGVhZCBidWZmZXIgKi8KKyNkZWZpbmUgTkFNRV9NQVggICAgICAgICAyNTUJLyogIyBjaGFycyBpbiBhIGZpbGUgbmFtZSAqLworI2RlZmluZSBQQVRIX01BWCAgICAgICAgNDA5NgkvKiAjIGNoYXJzIGluIGEgcGF0aCBuYW1lIGluY2x1ZGluZyBudWwgKi8KKyNkZWZpbmUgUElQRV9CVUYgICAgICAgIDQwOTYJLyogIyBieXRlcyBpbiBhdG9taWMgd3JpdGUgdG8gYSBwaXBlICovCisjZGVmaW5lIFhBVFRSX05BTUVfTUFYICAgMjU1CS8qICMgY2hhcnMgaW4gYW4gZXh0ZW5kZWQgYXR0cmlidXRlIG5hbWUgKi8KKyNkZWZpbmUgWEFUVFJfU0laRV9NQVggNjU1MzYJLyogc2l6ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgdmFsdWUgKDY0aykgKi8KKyNkZWZpbmUgWEFUVFJfTElTVF9NQVggNjU1MzYJLyogc2l6ZSBvZiBleHRlbmRlZCBhdHRyaWJ1dGUgbmFtZWxpc3QgKDY0aykgKi8KKworI2RlZmluZSBSVFNJR19NQVgJICAzMgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbGxjLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xsYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YTYzZmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xsYy5oCkBAIC0wLDAgKzEsODQgQEAKKyNpZm5kZWYgX19MSU5VWF9MTENfSAorI2RlZmluZSBfX0xJTlVYX0xMQ19ICisvKgorICogSUVFRSA4MDIuMiBVc2VyIEludGVyZmFjZSBTQVBzIGZvciBMaW51eCwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBpbmRpY2F0b3JzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBieSBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBjYW4gYmUgcmVkaXN0cmlidXRlZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSBvciBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuCisgKgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKworI2RlZmluZSBfX0xMQ19TT0NLX1NJWkVfXyAxNgkvKiBzaXplb2Yoc29ja2FkZHJfbGxjKSwgd29yZCBhbGlnbi4gKi8KK3N0cnVjdCBzb2NrYWRkcl9sbGMgeworCV9fa2VybmVsX3NhX2ZhbWlseV90IHNsbGNfZmFtaWx5OyAvKiBBRl9MTEMgKi8KKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCBzbGxjX2FycGhyZDsgLyogQVJQSFJEX0VUSEVSICovCisJdW5zaWduZWQgY2hhciAgIHNsbGNfdGVzdDsKKwl1bnNpZ25lZCBjaGFyICAgc2xsY194aWQ7CisJdW5zaWduZWQgY2hhcglzbGxjX3VhOwkvKiBVQSBkYXRhLCBvbmx5IGZvciBTT0NLX1NUUkVBTS4gKi8KKwl1bnNpZ25lZCBjaGFyICAgc2xsY19zYXA7CisJdW5zaWduZWQgY2hhciAgIHNsbGNfbWFjW0lGSFdBRERSTEVOXTsKKwl1bnNpZ25lZCBjaGFyICAgX19wYWRbX19MTENfU09DS19TSVpFX18gLQorCQkJICAgICAgc2l6ZW9mKF9fa2VybmVsX3NhX2ZhbWlseV90KSAqIDIgLQorCQkJICAgICAgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICogNCAtIElGSFdBRERSTEVOXTsKK307CisKKy8qIHNvY2tvcHQgZGVmaW5pdGlvbnMuICovCitlbnVtIGxsY19zb2Nrb3B0cyB7CisJTExDX09QVF9VTktOT1dOID0gMCwKKwlMTENfT1BUX1JFVFJZLAkJLyogbWF4IHJldHJhbnMgYXR0ZW1wdHMuICovCisJTExDX09QVF9TSVpFLAkJLyogbWF4IFBEVSBzaXplIChvY3RldHMpLiAqLworCUxMQ19PUFRfQUNLX1RNUl9FWFAsCS8qIGFjayBleHBpcmUgdGltZSAoc2VjcykuICovCisJTExDX09QVF9QX1RNUl9FWFAsCS8qIHBmIGN5Y2xlIGV4cGlyZSB0aW1lIChzZWNzKS4gKi8KKwlMTENfT1BUX1JFSl9UTVJfRVhQLAkvKiByZWogc2VudCBleHBpcmUgdGltZSAoc2VjcykuICovCisJTExDX09QVF9CVVNZX1RNUl9FWFAsCS8qIGJ1c3kgc3RhdGUgZXhwaXJlIHRpbWUgKHNlY3MpLiAqLworCUxMQ19PUFRfVFhfV0lOLAkJLyogdHggd2luZG93IHNpemUuICovCisJTExDX09QVF9SWF9XSU4sCQkvKiByeCB3aW5kb3cgc2l6ZS4gKi8KKwlMTENfT1BUX1BLVElORk8sCS8qIGFuY2lsbGFyeSBwYWNrZXQgaW5mb3JtYXRpb24uICovCisJTExDX09QVF9NQVgKK307CisKKyNkZWZpbmUgTExDX09QVF9NQVhfUkVUUlkJIDEwMAorI2RlZmluZSBMTENfT1BUX01BWF9TSVpFCTQxOTYKKyNkZWZpbmUgTExDX09QVF9NQVhfV0lOCQkgMTI3CisjZGVmaW5lIExMQ19PUFRfTUFYX0FDS19UTVJfRVhQCSAgNjAKKyNkZWZpbmUgTExDX09QVF9NQVhfUF9UTVJfRVhQCSAgNjAKKyNkZWZpbmUgTExDX09QVF9NQVhfUkVKX1RNUl9FWFAJICA2MAorI2RlZmluZSBMTENfT1BUX01BWF9CVVNZX1RNUl9FWFAgIDYwCisKKy8qIExMQyBTQVAgdHlwZXMuICovCisjZGVmaW5lIExMQ19TQVBfTlVMTAkweDAwCQkvKiBOVUxMIFNBUC4gCQkJKi8KKyNkZWZpbmUgTExDX1NBUF9MTEMJMHgwMgkJLyogTExDIFN1YmxheWVyIE1hbmFnZW1lbnQuIAkqLworI2RlZmluZSBMTENfU0FQX1NOQQkweDA0CQkvKiBTTkEgUGF0aCBDb250cm9sLiAJCSovCisjZGVmaW5lIExMQ19TQVBfUE5NCTB4MEUJCS8qIFByb3dheSBOZXR3b3JrIE1hbmFnZW1lbnQuCSovCQorI2RlZmluZSBMTENfU0FQX0lQCTB4MDYJCS8qIFRDUC9JUC4gCQkJKi8KKyNkZWZpbmUgTExDX1NBUF9CU1BBTgkweDQyCQkvKiBCcmlkZ2UgU3Bhbm5pbmcgVHJlZSBQcm90bwkqLworI2RlZmluZSBMTENfU0FQX01NUwkweDRFCQkvKiBNYW51ZmFjdHVyaW5nIE1lc3NhZ2UgU3J2LgkqLworI2RlZmluZSBMTENfU0FQXzgyMDgJMHg3RQkJLyogSVNPIDgyMDgJCQkqLworI2RlZmluZSBMTENfU0FQXzNDT00JMHg4MAkJLyogM0NPTS4gCQkJKi8KKyNkZWZpbmUgTExDX1NBUF9QUk8JMHg4RQkJLyogUHJvd2F5IEFjdGl2ZSBTdGF0aW9uIExpc3QJKi8KKyNkZWZpbmUgTExDX1NBUF9TTkFQCTB4QUEJCS8qIFNOQVAuIAkJCSovCisjZGVmaW5lIExMQ19TQVBfQkFOWUFOCTB4QkMJCS8qIEJhbnlhbi4gCQkJKi8KKyNkZWZpbmUgTExDX1NBUF9JUFgJMHhFMAkJLyogSVBYL1NQWC4gCQkJKi8KKyNkZWZpbmUgTExDX1NBUF9ORVRCRVVJCTB4RjAJCS8qIE5ldEJFVUkuIAkJCSovCisjZGVmaW5lIExMQ19TQVBfTEFOTUdSCTB4RjQJCS8qIExhbk1hbmFnZXIuIAkJCSovCisjZGVmaW5lIExMQ19TQVBfSU1QTAkweEY4CQkvKiBJTVBMCQkJCSovCisjZGVmaW5lIExMQ19TQVBfRElTQwkweEZDCQkvKiBEaXNjb3ZlcnkJCQkqLworI2RlZmluZSBMTENfU0FQX09TSQkweEZFCQkvKiBPU0kgTmV0d29yayBMYXllcnMuIAkJKi8KKyNkZWZpbmUgTExDX1NBUF9MQVIJMHhEQwkJLyogTEFOIEFkZHJlc3MgUmVzb2x1dGlvbiAJKi8KKyNkZWZpbmUgTExDX1NBUF9STQkweEQ0CQkvKiBSZXNvdXJjZSBNYW5hZ2VtZW50IAkJKi8KKyNkZWZpbmUgTExDX1NBUF9HTE9CQUwJMHhGRgkJLyogR2xvYmFsIFNBUC4gCQkJKi8KKworc3RydWN0IGxsY19wa3RpbmZvIHsKKwlpbnQgbHBpX2lmaW5kZXg7CisJdW5zaWduZWQgY2hhciBscGlfc2FwOworCXVuc2lnbmVkIGNoYXIgbHBpX21hY1tJRkhXQUREUkxFTl07Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9MTENfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9sb29wLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzg3ZTkxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9sb29wLmgKQEAgLTAsMCArMSw5NCBAQAorI2lmbmRlZiBfTElOVVhfTE9PUF9ICisjZGVmaW5lIF9MSU5VWF9MT09QX0gKKworLyoKKyAqIGluY2x1ZGUvbGludXgvbG9vcC5oCisgKgorICogV3JpdHRlbiBieSBUaGVvZG9yZSBUcydvLCAzLzI5LzkzLgorICoKKyAqIENvcHlyaWdodCAxOTkzIGJ5IFRoZW9kb3JlIFRzJ28uICBSZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUgaXMKKyAqIHBlcm1pdHRlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT19OQU1FX1NJWkUJNjQKKyNkZWZpbmUgTE9fS0VZX1NJWkUJMzIKKworCisvKgorICogTG9vcCBmbGFncworICovCitlbnVtIHsKKwlMT19GTEFHU19SRUFEX09OTFkJPSAxLAorCUxPX0ZMQUdTX0FVVE9DTEVBUgk9IDQsCisJTE9fRkxBR1NfUEFSVFNDQU4JPSA4LAorfTsKKworI2luY2x1ZGUgPGFzbS9wb3NpeF90eXBlcy5oPgkvKiBmb3IgX19rZXJuZWxfb2xkX2Rldl90ICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JLyogZm9yIF9fdTY0ICovCisKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHZlcnNpb24gKi8KK3N0cnVjdCBsb29wX2luZm8geworCWludAkJICAgbG9fbnVtYmVyOwkJLyogaW9jdGwgci9vICovCisJX19rZXJuZWxfb2xkX2Rldl90IGxvX2RldmljZTsgCQkvKiBpb2N0bCByL28gKi8KKwl1bnNpZ25lZCBsb25nCSAgIGxvX2lub2RlOyAJCS8qIGlvY3RsIHIvbyAqLworCV9fa2VybmVsX29sZF9kZXZfdCBsb19yZGV2aWNlOyAJCS8qIGlvY3RsIHIvbyAqLworCWludAkJICAgbG9fb2Zmc2V0OworCWludAkJICAgbG9fZW5jcnlwdF90eXBlOworCWludAkJICAgbG9fZW5jcnlwdF9rZXlfc2l6ZTsgCS8qIGlvY3RsIHcvbyAqLworCWludAkJICAgbG9fZmxhZ3M7CQkJLyogaW9jdGwgci9vICovCisJY2hhcgkJICAgbG9fbmFtZVtMT19OQU1FX1NJWkVdOworCXVuc2lnbmVkIGNoYXIJICAgbG9fZW5jcnlwdF9rZXlbTE9fS0VZX1NJWkVdOyAvKiBpb2N0bCB3L28gKi8KKwl1bnNpZ25lZCBsb25nCSAgIGxvX2luaXRbMl07CisJY2hhcgkJICAgcmVzZXJ2ZWRbNF07Cit9OworCitzdHJ1Y3QgbG9vcF9pbmZvNjQgeworCV9fdTY0CQkgICBsb19kZXZpY2U7CQkJLyogaW9jdGwgci9vICovCisJX191NjQJCSAgIGxvX2lub2RlOwkJCS8qIGlvY3RsIHIvbyAqLworCV9fdTY0CQkgICBsb19yZGV2aWNlOwkJCS8qIGlvY3RsIHIvbyAqLworCV9fdTY0CQkgICBsb19vZmZzZXQ7CisJX191NjQJCSAgIGxvX3NpemVsaW1pdDsvKiBieXRlcywgMCA9PSBtYXggYXZhaWxhYmxlICovCisJX191MzIJCSAgIGxvX251bWJlcjsJCQkvKiBpb2N0bCByL28gKi8KKwlfX3UzMgkJICAgbG9fZW5jcnlwdF90eXBlOworCV9fdTMyCQkgICBsb19lbmNyeXB0X2tleV9zaXplOwkJLyogaW9jdGwgdy9vICovCisJX191MzIJCSAgIGxvX2ZsYWdzOwkJCS8qIGlvY3RsIHIvbyAqLworCV9fdTgJCSAgIGxvX2ZpbGVfbmFtZVtMT19OQU1FX1NJWkVdOworCV9fdTgJCSAgIGxvX2NyeXB0X25hbWVbTE9fTkFNRV9TSVpFXTsKKwlfX3U4CQkgICBsb19lbmNyeXB0X2tleVtMT19LRVlfU0laRV07IC8qIGlvY3RsIHcvbyAqLworCV9fdTY0CQkgICBsb19pbml0WzJdOworfTsKKworLyoKKyAqIExvb3AgZmlsdGVyIHR5cGVzCisgKi8KKworI2RlZmluZSBMT19DUllQVF9OT05FCQkwCisjZGVmaW5lIExPX0NSWVBUX1hPUgkJMQorI2RlZmluZSBMT19DUllQVF9ERVMJCTIKKyNkZWZpbmUgTE9fQ1JZUFRfRklTSDIJCTMgICAgLyogVHdvZmlzaCBlbmNyeXB0aW9uICovCisjZGVmaW5lIExPX0NSWVBUX0JMT1cJCTQKKyNkZWZpbmUgTE9fQ1JZUFRfQ0FTVDEyOAk1CisjZGVmaW5lIExPX0NSWVBUX0lERUEJCTYKKyNkZWZpbmUgTE9fQ1JZUFRfRFVNTVkJCTkKKyNkZWZpbmUgTE9fQ1JZUFRfU0tJUEpBQ0sJMTAKKyNkZWZpbmUgTE9fQ1JZUFRfQ1JZUFRPQVBJCTE4CisjZGVmaW5lIE1BWF9MT19DUllQVAkJMjAKKworLyoKKyAqIElPQ1RMIGNvbW1hbmRzIC0tLSB3ZSB3aWxsIGNvbW1hbmRlZXIgMHg0QyAoJ0wnKQorICovCisKKyNkZWZpbmUgTE9PUF9TRVRfRkQJCTB4NEMwMAorI2RlZmluZSBMT09QX0NMUl9GRAkJMHg0QzAxCisjZGVmaW5lIExPT1BfU0VUX1NUQVRVUwkJMHg0QzAyCisjZGVmaW5lIExPT1BfR0VUX1NUQVRVUwkJMHg0QzAzCisjZGVmaW5lIExPT1BfU0VUX1NUQVRVUzY0CTB4NEMwNAorI2RlZmluZSBMT09QX0dFVF9TVEFUVVM2NAkweDRDMDUKKyNkZWZpbmUgTE9PUF9DSEFOR0VfRkQJCTB4NEMwNgorI2RlZmluZSBMT09QX1NFVF9DQVBBQ0lUWQkweDRDMDcKKworLyogL2Rldi9sb29wLWNvbnRyb2wgaW50ZXJmYWNlICovCisjZGVmaW5lIExPT1BfQ1RMX0FERAkJMHg0QzgwCisjZGVmaW5lIExPT1BfQ1RMX1JFTU9WRQkJMHg0QzgxCisjZGVmaW5lIExPT1BfQ1RMX0dFVF9GUkVFCTB4NEM4MgorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliMWE2ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbHAuaApAQCAtMCwwICsxLDEwMCBAQAorI2lmbmRlZiBfTElOVVhfTFBfSAorI2RlZmluZSBfTElOVVhfTFBfSAorCisvKgorICogdXNyL2luY2x1ZGUvbGludXgvbHAuaCBjLjE5OTEtMTk5MiBKYW1lcyBXaWVnYW5kCisgKiBtYW55IG1vZGlmaWNhdGlvbnMgY29weXJpZ2h0IChDKSAxOTkyIE1pY2hhZWwgSy4gSm9obnNvbgorICogSW50ZXJydXB0IHN1cHBvcnQgYWRkZWQgMTk5MyBOaWdlbCBHYW1ibGUKKyAqIFJlbW92ZWQgODI1NSBzdGF0dXMgZGVmaW5lcyBmcm9tIGluc2lkZSBfX0tFUk5FTF9fIE1hcmNlbG8gVG9zYXR0aSAKKyAqLworCisvKgorICogUGVyIFBPU0lYIGd1aWRlbGluZXMsIHRoaXMgbW9kdWxlIHJlc2VydmVzIHRoZSBMUCBhbmQgbHAgcHJlZml4ZXMKKyAqIFRoZXNlIGFyZSB0aGUgbHBfdGFibGVbbWlub3JdLmZsYWdzIGZsYWdzLi4uCisgKi8KKyNkZWZpbmUgTFBfRVhJU1QgMHgwMDAxCisjZGVmaW5lIExQX1NFTEVDIDB4MDAwMgorI2RlZmluZSBMUF9CVVNZCSAweDAwMDQKKyNkZWZpbmUgTFBfQlVTWV9CSVRfUE9TIDIKKyNkZWZpbmUgTFBfT0ZGTAkgMHgwMDA4CisjZGVmaW5lIExQX05PUEEgIDB4MDAxMAorI2RlZmluZSBMUF9FUlIgICAweDAwMjAKKyNkZWZpbmUgTFBfQUJPUlQgMHgwMDQwCisjZGVmaW5lIExQX0NBUkVGVUwgMHgwMDgwIC8qIG9ic29sZXRlZCAtYXJjYSAqLworI2RlZmluZSBMUF9BQk9SVE9QRU4gMHgwMTAwCisKKyNkZWZpbmUgTFBfVFJVU1RfSVJRXyAgMHgwMjAwIC8qIG9ic29sZXRlICovCisjZGVmaW5lIExQX05PX1JFVkVSU0UgIDB4MDQwMCAvKiBObyByZXZlcnNlIG1vZGUgYXZhaWxhYmxlLiAqLworI2RlZmluZSBMUF9EQVRBX0FWQUlMICAweDA4MDAgLyogRGF0YSBpcyBhdmFpbGFibGUuICovCisKKy8qIAorICogYml0IGRlZmluZXMgZm9yIDgyNTUgc3RhdHVzIHBvcnQKKyAqIGJhc2UgKyAxCisgKiBhY2Nlc3NlZCB3aXRoIExQX1MobWlub3IpLCB3aGljaCBnZXRzIHRoZSBieXRlLi4uCisgKi8KKyNkZWZpbmUgTFBfUEJVU1kJMHg4MCAgLyogaW52ZXJ0ZWQgaW5wdXQsIGFjdGl2ZSBoaWdoICovCisjZGVmaW5lIExQX1BBQ0sJCTB4NDAgIC8qIHVuY2hhbmdlZCBpbnB1dCwgYWN0aXZlIGxvdyAqLworI2RlZmluZSBMUF9QT1VUUEEJMHgyMCAgLyogdW5jaGFuZ2VkIGlucHV0LCBhY3RpdmUgaGlnaCAqLworI2RlZmluZSBMUF9QU0VMRUNECTB4MTAgIC8qIHVuY2hhbmdlZCBpbnB1dCwgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgTFBfUEVSUk9SUAkweDA4ICAvKiB1bmNoYW5nZWQgaW5wdXQsIGFjdGl2ZSBsb3cgKi8KKworLyogdGltZW91dCBmb3IgZWFjaCBjaGFyYWN0ZXIuICBUaGlzIGlzIHJlbGF0aXZlIHRvIGJ1cyBjeWNsZXMgLS0gaXQKKyAqIGlzIHRoZSBjb3VudCBpbiBhIGJ1c3kgbG9vcC4gIFRISVMgSVMgVEhFIFZBTFVFIFRPIENIQU5HRSBpZiB5b3UKKyAqIGhhdmUgZXh0cmVtZWx5IHNsb3cgcHJpbnRpbmcsIG9yIGlmIHRoZSBtYWNoaW5lIHNlZW1zIHRvIHNsb3cgZG93bgorICogYSBsb3Qgd2hlbiB5b3UgcHJpbnQuICBJZiB5b3UgaGF2ZSBzbG93IHByaW50aW5nLCBpbmNyZWFzZSB0aGlzCisgKiBudW1iZXIgYW5kIHJlY29tcGlsZSwgYW5kIGlmIHlvdXIgc3lzdGVtIGdldHMgYm9nZ2VkIGRvd24sIGRlY3JlYXNlCisgKiB0aGlzIG51bWJlci4gIFRoaXMgY2FuIGJlIGNoYW5nZWQgd2l0aCB0aGUgdHVuZWxwKDgpIGNvbW1hbmQgYXMgd2VsbC4KKyAqLworCisjZGVmaW5lIExQX0lOSVRfQ0hBUiAxMDAwCisKKy8qIFRoZSBwYXJhbGxlbCBwb3J0IHNwZWNzIGFwcGFyZW50bHkgc2F5IHRoYXQgdGhlcmUgbmVlZHMgdG8gYmUKKyAqIGEgLjV1c2VjIHdhaXQgYmVmb3JlIGFuZCBhZnRlciB0aGUgc3Ryb2JlLgorICovCisKKyNkZWZpbmUgTFBfSU5JVF9XQUlUIDEKKworLyogVGhpcyBpcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgZHJpdmVyIHdhaXRzIGZvciB0aGUgcHJpbnRlciB0bworICogY2F0Y2ggdXAgd2hlbiB0aGUgcHJpbnRlcidzIGJ1ZmZlciBhcHBlYXJzIHRvIGJlIGZpbGxlZC4gIElmIHlvdQorICogd2FudCB0byB0dW5lIHRoaXMgYW5kIGhhdmUgYSBmYXN0IHByaW50ZXIgKGkuZS4gSFBJSUlQKSwgZGVjcmVhc2UKKyAqIHRoaXMgbnVtYmVyLCBhbmQgaWYgeW91IGhhdmUgYSBzbG93IHByaW50ZXIsIGluY3JlYXNlIHRoaXMgbnVtYmVyLgorICogVGhpcyBpcyBpbiBodW5kcmVkdGhzIG9mIGEgc2Vjb25kLCB0aGUgZGVmYXVsdCAyIGJlaW5nIC4wNSBzZWNvbmQuCisgKiBPciB1c2UgdGhlIHR1bmVscCg4KSBjb21tYW5kLCB3aGljaCBpcyBlc3BlY2lhbGx5IG5pY2UgaWYgeW91IHdhbnQKKyAqIGNoYW5nZSBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIGNoYXJhY3RlciBhbmQgZ3JhcGhpY3MgcHJpbnRpbmcsIHdoaWNoCisgKiBhcmUgd2lsZGx5IGRpZmZlcmVudC4uLgorICovCisKKyNkZWZpbmUgTFBfSU5JVF9USU1FIDIKKworLyogSU9DVEwgbnVtYmVycyAqLworI2RlZmluZSBMUENIQVIgICAweDA2MDEgIC8qIGNvcnJlc3BvbmRzIHRvIExQX0lOSVRfQ0hBUiAqLworI2RlZmluZSBMUFRJTUUgICAweDA2MDIgIC8qIGNvcnJlc3BvbmRzIHRvIExQX0lOSVRfVElNRSAqLworI2RlZmluZSBMUEFCT1JUICAweDA2MDQgIC8qIGNhbGwgd2l0aCBUUlVFIGFyZyB0byBhYm9ydCBvbiBlcnJvciwKKwkJCSAgICBGQUxTRSB0byByZXRyeS4gIERlZmF1bHQgaXMgcmV0cnkuICAqLworI2RlZmluZSBMUFNFVElSUSAweDA2MDUgIC8qIGNhbGwgd2l0aCBuZXcgSVJRIG51bWJlciwKKwkJCSAgICBvciAwIGZvciBwb2xsaW5nIChubyBJUlEpICovCisjZGVmaW5lIExQR0VUSVJRIDB4MDYwNiAgLyogZ2V0IHRoZSBjdXJyZW50IElSUSBudW1iZXIgKi8KKyNkZWZpbmUgTFBXQUlUICAgMHgwNjA4ICAvKiBjb3JyZXNwb25kcyB0byBMUF9JTklUX1dBSVQgKi8KKy8qIE5PVEU6IExQQ0FSRUZVTCBpcyBvYnNvbGV0ZWQgYW5kIGl0JyBzIGFsd2F5cyB0aGUgZGVmYXVsdCByaWdodCBub3cgLWFyY2EgKi8KKyNkZWZpbmUgTFBDQVJFRlVMICAgMHgwNjA5ICAvKiBjYWxsIHdpdGggVFJVRSBhcmcgdG8gcmVxdWlyZSBvdXQtb2YtcGFwZXIsIG9mZi0KKwkJCSAgICBsaW5lLCBhbmQgZXJyb3IgaW5kaWNhdG9ycyBnb29kIG9uIGFsbCB3cml0ZXMsCisJCQkgICAgRkFMU0UgdG8gaWdub3JlIHRoZW0uICBEZWZhdWx0IGlzIGlnbm9yZS4gKi8KKyNkZWZpbmUgTFBBQk9SVE9QRU4gMHgwNjBhICAvKiBjYWxsIHdpdGggVFJVRSBhcmcgdG8gYWJvcnQgb3BlbigpIG9uIGVycm9yLAorCQkJICAgIEZBTFNFIHRvIGlnbm9yZSBlcnJvci4gIERlZmF1bHQgaXMgaWdub3JlLiAgKi8KKyNkZWZpbmUgTFBHRVRTVEFUVVMgMHgwNjBiICAvKiByZXR1cm4gTFBfUyhtaW5vcikgKi8KKyNkZWZpbmUgTFBSRVNFVCAgICAgMHgwNjBjICAvKiByZXNldCBwcmludGVyICovCisjaWZkZWYgTFBfU1RBVFMKKyNkZWZpbmUgTFBHRVRTVEFUUyAgMHgwNjBkICAvKiBnZXQgc3RhdGlzdGljcyAoc3RydWN0IGxwX3N0YXRzKSAqLworI2VuZGlmCisjZGVmaW5lIExQR0VURkxBR1MgIDB4MDYwZSAgLyogZ2V0IHN0YXR1cyBmbGFncyAqLworI2RlZmluZSBMUFNFVFRJTUVPVVQgMHgwNjBmIC8qIHNldCBwYXJwb3J0IHRpbWVvdXQgKi8KKworLyogdGltZW91dCBmb3IgcHJpbnRrJ2luZyBhIHRpbWVvdXQsIGluIGppZmZpZXMgKDEwMHRocyBvZiBhIHNlY29uZCkuCisgICBUaGlzIGlzIGFsc28gdXNlZCBmb3IgcmUtY2hlY2tpbmcgZXJyb3IgY29uZGl0aW9ucyBpZiBMUF9BQk9SVCBpcworICAgbm90IHNldC4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuICovCisKKyNkZWZpbmUgTFBfVElNRU9VVF9JTlRFUlJVUFQJKDYwICogSFopCisjZGVmaW5lIExQX1RJTUVPVVRfUE9MTEVECSgxMCAqIEhaKQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tYWdpYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tYWdpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNGJlYWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKQEAgLTAsMCArMSw2NSBAQAorI2lmbmRlZiBfX0xJTlVYX01BR0lDX0hfXworI2RlZmluZSBfX0xJTlVYX01BR0lDX0hfXworCisjZGVmaW5lIEFERlNfU1VQRVJfTUFHSUMJMHhhZGY1CisjZGVmaW5lIEFGRlNfU1VQRVJfTUFHSUMJMHhhZGZmCisjZGVmaW5lIEFGU19TVVBFUl9NQUdJQyAgICAgICAgICAgICAgICAweDUzNDY0MTRGCisjZGVmaW5lIEFVVE9GU19TVVBFUl9NQUdJQwkweDAxODcKKyNkZWZpbmUgQ09EQV9TVVBFUl9NQUdJQwkweDczNzU3MjQ1CisjZGVmaW5lIENSQU1GU19NQUdJQwkJMHgyOGNkM2Q0NQkvKiBzb21lIHJhbmRvbSBudW1iZXIgKi8KKyNkZWZpbmUgQ1JBTUZTX01BR0lDX1dFTkQJMHg0NTNkY2QyOAkvKiBtYWdpYyBudW1iZXIgd2l0aCB0aGUgd3JvbmcgZW5kaWFuZXNzICovCisjZGVmaW5lIERFQlVHRlNfTUFHSUMgICAgICAgICAgMHg2NDYyNjcyMAorI2RlZmluZSBTWVNGU19NQUdJQwkJMHg2MjY1NjU3MgorI2RlZmluZSBTRUNVUklUWUZTX01BR0lDCTB4NzM2MzY2NzMKKyNkZWZpbmUgU0VMSU5VWF9NQUdJQwkJMHhmOTdjZmY4YworI2RlZmluZSBSQU1GU19NQUdJQwkJMHg4NTg0NThmNgkvKiBzb21lIHJhbmRvbSBudW1iZXIgKi8KKyNkZWZpbmUgVE1QRlNfTUFHSUMJCTB4MDEwMjE5OTQKKyNkZWZpbmUgSFVHRVRMQkZTX01BR0lDIAkweDk1ODQ1OGY2CS8qIHNvbWUgcmFuZG9tIG51bWJlciAqLworI2RlZmluZSBTUVVBU0hGU19NQUdJQwkJMHg3MzcxNzM2OAorI2RlZmluZSBFQ1JZUFRGU19TVVBFUl9NQUdJQwkweGYxNWYKKyNkZWZpbmUgRUZTX1NVUEVSX01BR0lDCQkweDQxNEE1MworI2RlZmluZSBFWFQyX1NVUEVSX01BR0lDCTB4RUY1MworI2RlZmluZSBFWFQzX1NVUEVSX01BR0lDCTB4RUY1MworI2RlZmluZSBYRU5GU19TVVBFUl9NQUdJQwkweGFiYmExOTc0CisjZGVmaW5lIEVYVDRfU1VQRVJfTUFHSUMJMHhFRjUzCisjZGVmaW5lIEJUUkZTX1NVUEVSX01BR0lDCTB4OTEyMzY4M0UKKyNkZWZpbmUgTklMRlNfU1VQRVJfTUFHSUMJMHgzNDM0CisjZGVmaW5lIEhQRlNfU1VQRVJfTUFHSUMJMHhmOTk1ZTg0OQorI2RlZmluZSBJU09GU19TVVBFUl9NQUdJQwkweDk2NjAKKyNkZWZpbmUgSkZGUzJfU1VQRVJfTUFHSUMJMHg3MmI2CisjZGVmaW5lIEFOT05fSU5PREVfRlNfTUFHSUMJMHgwOTA0MTkzNAorI2RlZmluZSBQU1RPUkVGU19NQUdJQwkJMHg2MTY1Njc2QworCisjZGVmaW5lIE1JTklYX1NVUEVSX01BR0lDCTB4MTM3RgkJLyogbWluaXggdjEgZnMsIDE0IGNoYXIgbmFtZXMgKi8KKyNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMyCTB4MTM4RgkJLyogbWluaXggdjEgZnMsIDMwIGNoYXIgbmFtZXMgKi8KKyNkZWZpbmUgTUlOSVgyX1NVUEVSX01BR0lDCTB4MjQ2OAkJLyogbWluaXggdjIgZnMsIDE0IGNoYXIgbmFtZXMgKi8KKyNkZWZpbmUgTUlOSVgyX1NVUEVSX01BR0lDMgkweDI0NzgJCS8qIG1pbml4IHYyIGZzLCAzMCBjaGFyIG5hbWVzICovCisjZGVmaW5lIE1JTklYM19TVVBFUl9NQUdJQwkweDRkNWEJCS8qIG1pbml4IHYzIGZzLCA2MCBjaGFyIG5hbWVzICovCisKKyNkZWZpbmUgTVNET1NfU1VQRVJfTUFHSUMJMHg0ZDQ0CQkvKiBNRCAqLworI2RlZmluZSBOQ1BfU1VQRVJfTUFHSUMJCTB4NTY0YwkJLyogR3Vlc3MsIHdoYXQgMHg1NjRjIGlzIDotKSAqLworI2RlZmluZSBORlNfU1VQRVJfTUFHSUMJCTB4Njk2OQorI2RlZmluZSBPUEVOUFJPTV9TVVBFUl9NQUdJQwkweDlmYTEKKyNkZWZpbmUgUFJPQ19TVVBFUl9NQUdJQwkweDlmYTAKKyNkZWZpbmUgUU5YNF9TVVBFUl9NQUdJQwkweDAwMmYJCS8qIHFueDQgZnMgZGV0ZWN0aW9uICovCisKKyNkZWZpbmUgUkVJU0VSRlNfU1VQRVJfTUFHSUMJMHg1MjY1NDk3MwkvKiB1c2VkIGJ5IGdjYyAqLworCQkJCQkvKiB1c2VkIGJ5IGZpbGUgc3lzdGVtIHV0aWxpdGllcyB0aGF0CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rIGF0IHRoZSBzdXBlcmJsb2NrLCBldGMuICAqLworI2RlZmluZSBSRUlTRVJGU19TVVBFUl9NQUdJQ19TVFJJTkcJIlJlSXNFckZzIgorI2RlZmluZSBSRUlTRVIyRlNfU1VQRVJfTUFHSUNfU1RSSU5HCSJSZUlzRXIyRnMiCisjZGVmaW5lIFJFSVNFUjJGU19KUl9TVVBFUl9NQUdJQ19TVFJJTkcJIlJlSXNFcjNGcyIKKworI2RlZmluZSBTTUJfU1VQRVJfTUFHSUMJCTB4NTE3QgorI2RlZmluZSBVU0JERVZJQ0VfU1VQRVJfTUFHSUMJMHg5ZmEyCisjZGVmaW5lIENHUk9VUF9TVVBFUl9NQUdJQwkweDI3ZTBlYgorCisjZGVmaW5lIEZVVEVYRlNfU1VQRVJfTUFHSUMJMHhCQUQxREVBCisKKyNkZWZpbmUgU1RBQ0tfRU5EX01BR0lDCQkweDU3QUM2RTlECisKKyNkZWZpbmUgREVWUFRTX1NVUEVSX01BR0lDCTB4MWNkMQorI2RlZmluZSBTT0NLRlNfTUFHSUMJCTB4NTM0RjQzNEIKKyNkZWZpbmUgVjlGU19NQUdJQwkJMHgwMTAyMTk5NworCisjZW5kaWYgLyogX19MSU5VWF9NQUdJQ19IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWFqb3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWFqb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YThjYTk4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tYWpvci5oCkBAIC0wLDAgKzEsMTc3IEBACisjaWZuZGVmIF9MSU5VWF9NQUpPUl9ICisjZGVmaW5lIF9MSU5VWF9NQUpPUl9ICisKKy8qCisgKiBUaGlzIGZpbGUgaGFzIGRlZmluaXRpb25zIGZvciBtYWpvciBkZXZpY2UgbnVtYmVycy4KKyAqIEZvciB0aGUgZGV2aWNlIG51bWJlciBhc3NpZ25tZW50cywgc2VlIERvY3VtZW50YXRpb24vZGV2aWNlcy50eHQuCisgKi8KKworI2RlZmluZSBVTk5BTUVEX01BSk9SCQkwCisjZGVmaW5lIE1FTV9NQUpPUgkJMQorI2RlZmluZSBSQU1ESVNLX01BSk9SCQkxCisjZGVmaW5lIEZMT1BQWV9NQUpPUgkJMgorI2RlZmluZSBQVFlfTUFTVEVSX01BSk9SCTIKKyNkZWZpbmUgSURFMF9NQUpPUgkJMworI2RlZmluZSBIRF9NQUpPUgkJSURFMF9NQUpPUgorI2RlZmluZSBQVFlfU0xBVkVfTUFKT1IJCTMKKyNkZWZpbmUgVFRZX01BSk9SCQk0CisjZGVmaW5lIFRUWUFVWF9NQUpPUgkJNQorI2RlZmluZSBMUF9NQUpPUgkJNgorI2RlZmluZSBWQ1NfTUFKT1IJCTcKKyNkZWZpbmUgTE9PUF9NQUpPUgkJNworI2RlZmluZSBTQ1NJX0RJU0swX01BSk9SCTgKKyNkZWZpbmUgU0NTSV9UQVBFX01BSk9SCQk5CisjZGVmaW5lIE1EX01BSk9SCQk5CisjZGVmaW5lIE1JU0NfTUFKT1IJCTEwCisjZGVmaW5lIFNDU0lfQ0RST01fTUFKT1IJMTEKKyNkZWZpbmUgTVVYX01BSk9SCQkxMQkvKiBQQS1SSVNDIG9ubHkgKi8KKyNkZWZpbmUgWFRfRElTS19NQUpPUgkJMTMKKyNkZWZpbmUgSU5QVVRfTUFKT1IJCTEzCisjZGVmaW5lIFNPVU5EX01BSk9SCQkxNAorI2RlZmluZSBDRFUzMUFfQ0RST01fTUFKT1IJMTUKKyNkZWZpbmUgSk9ZU1RJQ0tfTUFKT1IJCTE1CisjZGVmaW5lIEdPTERTVEFSX0NEUk9NX01BSk9SCTE2CisjZGVmaW5lIE9QVElDU19DRFJPTV9NQUpPUgkxNworI2RlZmluZSBTQU5ZT19DRFJPTV9NQUpPUgkxOAorI2RlZmluZSBDWUNMQURFU19NQUpPUgkJMTkKKyNkZWZpbmUgQ1lDTEFERVNBVVhfTUFKT1IJMjAKKyNkZWZpbmUgTUlUU1VNSV9YX0NEUk9NX01BSk9SCTIwCisjZGVmaW5lIE1GTV9BQ09STl9NQUpPUgkJMjEJLyogQVJNIExpbnV4IC9kZXYvbWZtICovCisjZGVmaW5lIFNDU0lfR0VORVJJQ19NQUpPUgkyMQorI2RlZmluZSBJREUxX01BSk9SCQkyMgorI2RlZmluZSBESUdJQ1VfTUFKT1IJCTIyCisjZGVmaW5lIERJR0lfTUFKT1IJCTIzCisjZGVmaW5lIE1JVFNVTUlfQ0RST01fTUFKT1IJMjMKKyNkZWZpbmUgQ0RVNTM1X0NEUk9NX01BSk9SCTI0CisjZGVmaW5lIFNUTF9TRVJJQUxNQUpPUgkJMjQKKyNkZWZpbmUgTUFUU1VTSElUQV9DRFJPTV9NQUpPUgkyNQorI2RlZmluZSBTVExfQ0FMTE9VVE1BSk9SCTI1CisjZGVmaW5lIE1BVFNVU0hJVEFfQ0RST00yX01BSk9SCTI2CisjZGVmaW5lIFFJQzExN19UQVBFX01BSk9SCTI3CisjZGVmaW5lIE1BVFNVU0hJVEFfQ0RST00zX01BSk9SCTI3CisjZGVmaW5lIE1BVFNVU0hJVEFfQ0RST000X01BSk9SCTI4CisjZGVmaW5lIFNUTF9TSU9NRU1NQUpPUgkJMjgKKyNkZWZpbmUgQUNTSV9NQUpPUgkJMjgKKyNkZWZpbmUgQVpURUNIX0NEUk9NX01BSk9SCTI5CisjZGVmaW5lIEZCX01BSk9SCQkyOSAgIC8qIC9kZXYvZmIqIGZyYW1lYnVmZmVycyAqLworI2RlZmluZSBDTTIwNl9DRFJPTV9NQUpPUgkzMgorI2RlZmluZSBJREUyX01BSk9SCQkzMworI2RlZmluZSBJREUzX01BSk9SCQkzNAorI2RlZmluZSBaODUzMF9NQUpPUgkJMzQKKyNkZWZpbmUgWFBSQU1fTUFKT1IJCTM1ICAgLyogRXhwYW5kZWQgc3RvcmFnZSBvbiBTLzM5MDogInNsb3cgcmFtIiovCisjZGVmaW5lIE5FVExJTktfTUFKT1IJCTM2CisjZGVmaW5lIFBTMkVTRElfTUFKT1IJCTM2CisjZGVmaW5lIElERVRBUEVfTUFKT1IJCTM3CisjZGVmaW5lIFoyUkFNX01BSk9SCQkzNworI2RlZmluZSBBUEJMT0NLX01BSk9SCQkzOCAgIC8qIEFQMTAwMCBCbG9jayBkZXZpY2UgKi8KKyNkZWZpbmUgRERWX01BSk9SCQkzOSAgIC8qIEFQMTAwMCBERFYgYmxvY2sgZGV2aWNlICovCisjZGVmaW5lIE5CRF9NQUpPUgkJNDMgICAvKiBOZXR3b3JrIGJsb2NrIGRldmljZQkqLworI2RlZmluZSBSSVNDT004X05PUk1BTF9NQUpPUgk0OAorI2RlZmluZSBEQUM5NjBfTUFKT1IJCTQ4ICAgLyogNDguLjU1ICovCisjZGVmaW5lIFJJU0NPTThfQ0FMTE9VVF9NQUpPUgk0OQorI2RlZmluZSBNS0lTU19NQUpPUgkJNTUKKyNkZWZpbmUgRFNQNTZLX01BSk9SCQk1NSAgIC8qIERTUDU2MDAxIHByb2Nlc3NvciBkZXZpY2UgKi8KKworI2RlZmluZSBJREU0X01BSk9SCQk1NgorI2RlZmluZSBJREU1X01BSk9SCQk1NworCisjZGVmaW5lIFNDU0lfRElTSzFfTUFKT1IJNjUKKyNkZWZpbmUgU0NTSV9ESVNLMl9NQUpPUgk2NgorI2RlZmluZSBTQ1NJX0RJU0szX01BSk9SCTY3CisjZGVmaW5lIFNDU0lfRElTSzRfTUFKT1IJNjgKKyNkZWZpbmUgU0NTSV9ESVNLNV9NQUpPUgk2OQorI2RlZmluZSBTQ1NJX0RJU0s2X01BSk9SCTcwCisjZGVmaW5lIFNDU0lfRElTSzdfTUFKT1IJNzEKKworI2RlZmluZSBDT01QQVFfU01BUlQyX01BSk9SCTcyCisjZGVmaW5lIENPTVBBUV9TTUFSVDJfTUFKT1IxCTczCisjZGVmaW5lIENPTVBBUV9TTUFSVDJfTUFKT1IyCTc0CisjZGVmaW5lIENPTVBBUV9TTUFSVDJfTUFKT1IzCTc1CisjZGVmaW5lIENPTVBBUV9TTUFSVDJfTUFKT1I0CTc2CisjZGVmaW5lIENPTVBBUV9TTUFSVDJfTUFKT1I1CTc3CisjZGVmaW5lIENPTVBBUV9TTUFSVDJfTUFKT1I2CTc4CisjZGVmaW5lIENPTVBBUV9TTUFSVDJfTUFKT1I3CTc5CisKKyNkZWZpbmUgU1BFQ0lBTElYX05PUk1BTF9NQUpPUgk3NQorI2RlZmluZSBTUEVDSUFMSVhfQ0FMTE9VVF9NQUpPUgk3NgorCisjZGVmaW5lIEFVUk9SQV9NQUpPUgkJNzkKKworI2RlZmluZSBJMk9fTUFKT1IJCTgwCS8qIDgwLT44NyAqLworCisjZGVmaW5lIFNITUlRX01BSk9SCQk4NSAgIC8qIExpbnV4L21pcHMsIFNHSSAvZGV2L3NobWlxICovCisjZGVmaW5lIFNDU0lfQ0hBTkdFUl9NQUpPUiAgICAgIDg2CisKKyNkZWZpbmUgSURFNl9NQUpPUgkJODgKKyNkZWZpbmUgSURFN19NQUpPUgkJODkKKyNkZWZpbmUgSURFOF9NQUpPUgkJOTAKKyNkZWZpbmUgSURFOV9NQUpPUgkJOTEKKworI2RlZmluZSBEQVNEX01BSk9SCQk5NAorCisjZGVmaW5lIE1ESVNLX01BSk9SCQk5NQorCisjZGVmaW5lIFVCRF9NQUpPUgkJOTgKKworI2RlZmluZSBQUF9NQUpPUgkJOTkKKyNkZWZpbmUgSlNGRF9NQUpPUgkJOTkKKworI2RlZmluZSBQSE9ORV9NQUpPUgkJMTAwCisKKyNkZWZpbmUgQ09NUEFRX0NJU1NfTUFKT1IJMTA0CisjZGVmaW5lIENPTVBBUV9DSVNTX01BSk9SMQkxMDUKKyNkZWZpbmUgQ09NUEFRX0NJU1NfTUFKT1IyICAgICAgMTA2CisjZGVmaW5lIENPTVBBUV9DSVNTX01BSk9SMyAgICAgIDEwNworI2RlZmluZSBDT01QQVFfQ0lTU19NQUpPUjQgICAgICAxMDgKKyNkZWZpbmUgQ09NUEFRX0NJU1NfTUFKT1I1ICAgICAgMTA5CisjZGVmaW5lIENPTVBBUV9DSVNTX01BSk9SNiAgICAgIDExMAorI2RlZmluZSBDT01QQVFfQ0lTU19NQUpPUjcgICAgICAxMTEKKworI2RlZmluZSBWSU9EQVNEX01BSk9SCQkxMTIKKyNkZWZpbmUgVklPQ0RfTUFKT1IJCTExMworCisjZGVmaW5lIEFUQVJBSURfTUFKT1IJCTExNAorCisjZGVmaW5lIFNDU0lfRElTSzhfTUFKT1IJMTI4CisjZGVmaW5lIFNDU0lfRElTSzlfTUFKT1IJMTI5CisjZGVmaW5lIFNDU0lfRElTSzEwX01BSk9SCTEzMAorI2RlZmluZSBTQ1NJX0RJU0sxMV9NQUpPUgkxMzEKKyNkZWZpbmUgU0NTSV9ESVNLMTJfTUFKT1IJMTMyCisjZGVmaW5lIFNDU0lfRElTSzEzX01BSk9SCTEzMworI2RlZmluZSBTQ1NJX0RJU0sxNF9NQUpPUgkxMzQKKyNkZWZpbmUgU0NTSV9ESVNLMTVfTUFKT1IJMTM1CisKKyNkZWZpbmUgVU5JWDk4X1BUWV9NQVNURVJfTUFKT1IJMTI4CisjZGVmaW5lIFVOSVg5OF9QVFlfTUFKT1JfQ09VTlQJOAorI2RlZmluZSBVTklYOThfUFRZX1NMQVZFX01BSk9SCShVTklYOThfUFRZX01BU1RFUl9NQUpPUitVTklYOThfUFRZX01BSk9SX0NPVU5UKQorCisjZGVmaW5lIERSQkRfTUFKT1IJCTE0NworI2RlZmluZSBSVEZfTUFKT1IJCTE1MAorI2RlZmluZSBSQVdfTUFKT1IJCTE2MgorCisjZGVmaW5lIFVTQl9BQ01fTUFKT1IJCTE2NgorI2RlZmluZSBVU0JfQUNNX0FVWF9NQUpPUgkxNjcKKyNkZWZpbmUgVVNCX0NIQVJfTUFKT1IJCTE4MAorCisjZGVmaW5lIE1NQ19CTE9DS19NQUpPUgkJMTc5CisKKyNkZWZpbmUgVlhWTV9NQUpPUgkJMTk5CS8qIFZFUklUQVMgdm9sdW1lIGkvbyBkcml2ZXIgICAgKi8KKyNkZWZpbmUgVlhTUEVDX01BSk9SCQkyMDAJLyogVkVSSVRBUyB2b2x1bWUgY29uZmlnIGRyaXZlciAqLworI2RlZmluZSBWWERNUF9NQUpPUgkJMjAxCS8qIFZFUklUQVMgdm9sdW1lIG11bHRpcGF0aCBkcml2ZXIgKi8KKworI2RlZmluZSBYRU5WQkRfTUFKT1IJCTIwMgkvKiBYZW4gdmlydHVhbCBibG9jayBkZXZpY2UgKi8KKworI2RlZmluZSBNU1JfTUFKT1IJCTIwMgorI2RlZmluZSBDUFVJRF9NQUpPUgkJMjAzCisKKyNkZWZpbmUgT1NTVF9NQUpPUgkJMjA2CS8qIE9uU3RyZWFtLVNDeDAgU0NTSSB0YXBlICovCisKKyNkZWZpbmUgSUJNX1RUWTMyNzBfTUFKT1IJMjI3CisjZGVmaW5lIElCTV9GUzMyNzBfTUFKT1IJMjI4CisKKyNkZWZpbmUgVklPVEFQRV9NQUpPUgkJMjMwCisKKyNkZWZpbmUgQkxPQ0tfRVhUX01BSk9SCQkyNTkKKyNkZWZpbmUgU0NTSV9PU0RfTUFKT1IJCTI2MAkvKiBvcGVuLW9zZCdzIE9TRCBzY3NpIGRldmljZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWFwX3RvXzdzZWdtZW50LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21hcF90b183c2VnbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDYyYTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21hcF90b183c2VnbWVudC5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEhlbmsgVmVyZ29uZXQgPEhlbmsuVmVyZ29uZXRAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBNQVBfVE9fN1NFR01FTlRfSAorI2RlZmluZSBNQVBfVE9fN1NFR01FTlRfSAorCisvKiBUaGlzIGZpbGUgcHJvdmlkZXMgdHJhbnNsYXRpb24gcHJpbWl0aXZlcyBhbmQgdGFibGVzIGZvciB0aGUgY29udmVyc2lvbgorICogb2YgKEFTQ0lJKSBjaGFyYWN0ZXJzIHRvIGEgNy1zZWdtZW50cyBub3RhdGlvbi4KKyAqCisgKiBUaGUgNyBzZWdtZW50J3Mgd2lraXBlZGlhIG5vdGF0aW9uIGJlbG93IGlzIHVzZWQgYXMgc3RhbmRhcmQuCisgKiBTZWU6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2V2ZW5fc2VnbWVudF9kaXNwbGF5CisgKgorICogTm90YXRpb246CSstYS0rCisgKgkJZiAgIGIKKyAqCQkrLWctKworICoJCWUgICBjCisgKgkJKy1kLSsKKyAqCisgKiBVc2FnZToKKyAqCisgKiAgIFJlZ2lzdGVyIGEgbWFwIHZhcmlhYmxlLCBhbmQgZmlsbCBpdCB3aXRoIGEgY2hhcmFjdGVyIHNldDoKKyAqCXN0YXRpYyBTRUc3X0RFRkFVTFRfTUFQKG1hcF9zZWc3KTsKKyAqCisgKgorICogICBUaGVuIHVzZSBmb3IgY29udmVyc2lvbjoKKyAqCXNlZzcgPSBtYXBfdG9fc2VnNygmbWFwX3NlZzcsIHNvbWVfY2hhcik7CisgKgkuLi4KKyAqCisgKiBJbiBkZXZpY2UgZHJpdmVycyBpdCBpcyByZWNvbW1lbmRlZCwgaWYgcmVxdWlyZWQsIHRvIG1ha2UgdGhlIGNoYXIgbWFwCisgKiBhY2Nlc3NpYmxlIHZpYSB0aGUgc3lzZnMgaW50ZXJmYWNlIHVzaW5nIHRoZSBmb2xsb3dpbmcgc2NoZW1lOgorICoKKyAqIHN0YXRpYyBzc2l6ZV90IHNob3dfbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSB7CisgKgltZW1jcHkoYnVmLCAmbWFwX3NlZzcsIHNpemVvZihtYXBfc2VnNykpOworICoJcmV0dXJuIHNpemVvZihtYXBfc2VnNyk7CisgKiB9CisgKiBzdGF0aWMgc3NpemVfdCBzdG9yZV9tYXAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjbnQpIHsKKyAqCWlmKGNudCAhPSBzaXplb2YobWFwX3NlZzcpKQorICoJCXJldHVybiAtRUlOVkFMOworICoJbWVtY3B5KCZtYXBfc2VnNywgYnVmLCBjbnQpOworICoJcmV0dXJuIGNudDsKKyAqIH0KKyAqIHN0YXRpYyBERVZJQ0VfQVRUUihtYXBfc2VnNywgUEVSTVNfUlcsIHNob3dfbWFwLCBzdG9yZV9tYXApOworICoKKyAqIEhpc3Rvcnk6CisgKiAyMDA1LTA1LTMxCVJGQyBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisKKyNkZWZpbmUgQklUX1NFRzdfQQkJMAorI2RlZmluZSBCSVRfU0VHN19CCQkxCisjZGVmaW5lIEJJVF9TRUc3X0MJCTIKKyNkZWZpbmUgQklUX1NFRzdfRAkJMworI2RlZmluZSBCSVRfU0VHN19FCQk0CisjZGVmaW5lIEJJVF9TRUc3X0YJCTUKKyNkZWZpbmUgQklUX1NFRzdfRwkJNgorI2RlZmluZSBCSVRfU0VHN19SRVNFUlZFRAk3CisKK3N0cnVjdCBzZWc3X2NvbnZlcnNpb25fbWFwIHsKKwl1bnNpZ25lZCBjaGFyCXRhYmxlWzEyOF07Cit9OworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbWFwX3RvX3NlZzcoc3RydWN0IHNlZzdfY29udmVyc2lvbl9tYXAgKm1hcCwgaW50IGMpCit7CisJcmV0dXJuIGMgPj0gMCAmJiBjIDwgc2l6ZW9mKG1hcC0+dGFibGUpID8gbWFwLT50YWJsZVtjXSA6IC1FSU5WQUw7Cit9CisKKyNkZWZpbmUgU0VHN19DT05WRVJTSU9OX01BUChfbmFtZSwgX21hcCkJXAorCXN0cnVjdCBzZWc3X2NvbnZlcnNpb25fbWFwIF9uYW1lID0geyAudGFibGUgPSB7IF9tYXAgfSB9CisKKy8qCisgKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYSBmYWNpbGl0eSB0aGF0IGFsbG93cyB1c2VyIHNwYWNlIHRvIHJlZGVmaW5lCisgKiBjdXN0b20gY2hhcmFjdGVyIHNldHMgZm9yIExDRCBkZXZpY2VzLiBQbGVhc2UgdXNlIGEgc3lzZnMgaW50ZXJmYWNlCisgKiBhcyBkZXNjcmliZWQgYWJvdmUuCisgKi8KKyNkZWZpbmUgTUFQX1RPX1NFRzdfU1lTRlNfRklMRQkibWFwX3NlZzciCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBU0NJSSBjb252ZXJzaW9uIHRhYmxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIF9TRUc3KGwsYSxiLGMsZCxlLGYsZykJXAorICAgICAgKAlhPDxCSVRfU0VHN19BIHwJYjw8QklUX1NFRzdfQiB8CWM8PEJJVF9TRUc3X0MgfAlkPDxCSVRfU0VHN19EIHwJXAorCWU8PEJJVF9TRUc3X0UgfAlmPDxCSVRfU0VHN19GIHwJZzw8QklUX1NFRzdfRyApCisKKyNkZWZpbmUgX01BUF8wXzMyX0FTQ0lJX1NFRzdfTk9OX1BSSU5UQUJMRQlcCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisKKyNkZWZpbmUgX01BUF8zM180N19BU0NJSV9TRUc3X1NZTUJPTAkJXAorIF9TRUc3KCchJywwLDAsMCwwLDEsMSwwKSwgX1NFRzcoJyInLDAsMSwwLDAsMCwxLDApLCBfU0VHNygnIycsMCwxLDEsMCwxLDEsMCksXAorIF9TRUc3KCckJywxLDAsMSwxLDAsMSwxKSwgX1NFRzcoJyUnLDAsMCwxLDAsMCwxLDApLCBfU0VHNygnJicsMSwwLDEsMSwxLDEsMSksXAorIF9TRUc3KCdcJycsMCwwLDAsMCwwLDEsMCksX1NFRzcoJygnLDEsMCwwLDEsMSwxLDApLCBfU0VHNygnKScsMSwxLDEsMSwwLDAsMCksXAorIF9TRUc3KCcqJywwLDEsMSwwLDEsMSwxKSwgX1NFRzcoJysnLDAsMSwxLDAsMCwwLDEpLCBfU0VHNygnLCcsMCwwLDAsMCwxLDAsMCksXAorIF9TRUc3KCctJywwLDAsMCwwLDAsMCwxKSwgX1NFRzcoJy4nLDAsMCwwLDAsMSwwLDApLCBfU0VHNygnLycsMCwxLDAsMCwxLDAsMSksCisKKyNkZWZpbmUgX01BUF80OF81N19BU0NJSV9TRUc3X05VTUVSSUMJCVwKKyBfU0VHNygnMCcsMSwxLDEsMSwxLDEsMCksIF9TRUc3KCcxJywwLDEsMSwwLDAsMCwwKSwgX1NFRzcoJzInLDEsMSwwLDEsMSwwLDEpLFwKKyBfU0VHNygnMycsMSwxLDEsMSwwLDAsMSksIF9TRUc3KCc0JywwLDEsMSwwLDAsMSwxKSwgX1NFRzcoJzUnLDEsMCwxLDEsMCwxLDEpLFwKKyBfU0VHNygnNicsMSwwLDEsMSwxLDEsMSksIF9TRUc3KCc3JywxLDEsMSwwLDAsMCwwKSwgX1NFRzcoJzgnLDEsMSwxLDEsMSwxLDEpLFwKKyBfU0VHNygnOScsMSwxLDEsMSwwLDEsMSksCisKKyNkZWZpbmUgX01BUF81OF82NF9BU0NJSV9TRUc3X1NZTUJPTAkJXAorIF9TRUc3KCc6JywwLDAsMCwxLDAsMCwxKSwgX1NFRzcoJzsnLDAsMCwwLDEsMCwwLDEpLCBfU0VHNygnPCcsMSwwLDAsMCwwLDEsMSksXAorIF9TRUc3KCc9JywwLDAsMCwxLDAsMCwxKSwgX1NFRzcoJz4nLDEsMSwwLDAsMCwwLDEpLCBfU0VHNygnPycsMSwxLDEsMCwwLDEsMCksXAorIF9TRUc3KCdAJywxLDEsMCwxLDEsMSwxKSwKKworI2RlZmluZSBfTUFQXzY1XzkwX0FTQ0lJX1NFRzdfQUxQSEFfVVBQUglcCisgX1NFRzcoJ0EnLDEsMSwxLDAsMSwxLDEpLCBfU0VHNygnQicsMSwxLDEsMSwxLDEsMSksIF9TRUc3KCdDJywxLDAsMCwxLDEsMSwwKSxcCisgX1NFRzcoJ0QnLDEsMSwxLDEsMSwxLDApLCBfU0VHNygnRScsMSwwLDAsMSwxLDEsMSksIF9TRUc3KCdGJywxLDAsMCwwLDEsMSwxKSxcCisgX1NFRzcoJ0cnLDEsMSwxLDEsMCwxLDEpLCBfU0VHNygnSCcsMCwxLDEsMCwxLDEsMSksIF9TRUc3KCdJJywwLDEsMSwwLDAsMCwwKSxcCisgX1NFRzcoJ0onLDAsMSwxLDEsMCwwLDApLCBfU0VHNygnSycsMCwxLDEsMCwxLDEsMSksIF9TRUc3KCdMJywwLDAsMCwxLDEsMSwwKSxcCisgX1NFRzcoJ00nLDEsMSwxLDAsMSwxLDApLCBfU0VHNygnTicsMSwxLDEsMCwxLDEsMCksIF9TRUc3KCdPJywxLDEsMSwxLDEsMSwwKSxcCisgX1NFRzcoJ1AnLDEsMSwwLDAsMSwxLDEpLCBfU0VHNygnUScsMSwxLDEsMSwxLDEsMCksIF9TRUc3KCdSJywxLDEsMSwwLDEsMSwxKSxcCisgX1NFRzcoJ1MnLDEsMCwxLDEsMCwxLDEpLCBfU0VHNygnVCcsMCwwLDAsMSwxLDEsMSksIF9TRUc3KCdVJywwLDEsMSwxLDEsMSwwKSxcCisgX1NFRzcoJ1YnLDAsMSwxLDEsMSwxLDApLCBfU0VHNygnVycsMCwxLDEsMSwxLDEsMSksIF9TRUc3KCdYJywwLDEsMSwwLDEsMSwxKSxcCisgX1NFRzcoJ1knLDAsMSwxLDAsMCwxLDEpLCBfU0VHNygnWicsMSwxLDAsMSwxLDAsMSksCisKKyNkZWZpbmUgX01BUF85MV85Nl9BU0NJSV9TRUc3X1NZTUJPTAkJXAorIF9TRUc3KCdbJywxLDAsMCwxLDEsMSwwKSwgX1NFRzcoJ1xcJywwLDAsMSwwLDAsMSwxKSxfU0VHNygnXScsMSwxLDEsMSwwLDAsMCksXAorIF9TRUc3KCdeJywxLDEsMCwwLDAsMSwwKSwgX1NFRzcoJ18nLDAsMCwwLDEsMCwwLDApLCBfU0VHNygnYCcsMCwxLDAsMCwwLDAsMCksCisKKyNkZWZpbmUgX01BUF85N18xMjJfQVNDSUlfU0VHN19BTFBIQV9MT1dFUglcCisgX1NFRzcoJ0EnLDEsMSwxLDAsMSwxLDEpLCBfU0VHNygnYicsMCwwLDEsMSwxLDEsMSksIF9TRUc3KCdjJywwLDAsMCwxLDEsMCwxKSxcCisgX1NFRzcoJ2QnLDAsMSwxLDEsMSwwLDEpLCBfU0VHNygnRScsMSwwLDAsMSwxLDEsMSksIF9TRUc3KCdGJywxLDAsMCwwLDEsMSwxKSxcCisgX1NFRzcoJ0cnLDEsMSwxLDEsMCwxLDEpLCBfU0VHNygnaCcsMCwwLDEsMCwxLDEsMSksIF9TRUc3KCdpJywwLDAsMSwwLDAsMCwwKSxcCisgX1NFRzcoJ2onLDAsMCwxLDEsMCwwLDApLCBfU0VHNygnaycsMCwwLDEsMCwxLDEsMSksIF9TRUc3KCdMJywwLDAsMCwxLDEsMSwwKSxcCisgX1NFRzcoJ00nLDEsMSwxLDAsMSwxLDApLCBfU0VHNygnbicsMCwwLDEsMCwxLDAsMSksIF9TRUc3KCdvJywwLDAsMSwxLDEsMCwxKSxcCisgX1NFRzcoJ1AnLDEsMSwwLDAsMSwxLDEpLCBfU0VHNygncScsMSwxLDEsMCwwLDEsMSksIF9TRUc3KCdyJywwLDAsMCwwLDEsMCwxKSxcCisgX1NFRzcoJ1MnLDEsMCwxLDEsMCwxLDEpLCBfU0VHNygnVCcsMCwwLDAsMSwxLDEsMSksIF9TRUc3KCd1JywwLDAsMSwxLDEsMCwwKSxcCisgX1NFRzcoJ3YnLDAsMCwxLDEsMSwwLDApLCBfU0VHNygnVycsMCwxLDEsMSwxLDEsMSksIF9TRUc3KCdYJywwLDEsMSwwLDEsMSwxKSxcCisgX1NFRzcoJ3knLDAsMSwxLDEsMCwxLDEpLCBfU0VHNygnWicsMSwxLDAsMSwxLDAsMSksCisKKyNkZWZpbmUgX01BUF8xMjNfMTI2X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisgX1NFRzcoJ3snLDEsMCwwLDEsMSwxLDApLCBfU0VHNygnfCcsMCwwLDAsMCwxLDEsMCksIF9TRUc3KCd9JywxLDEsMSwxLDAsMCwwKSxcCisgX1NFRzcoJ34nLDEsMCwwLDAsMCwwLDApLAorCisvKiBNYXBzICovCisKKy8qIFRoaXMgc2V0IHRyaWVzIHRvIG1hcCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgdmlzaWJsZSBjaGFyYWN0ZXJpc3RpY3MKKyAqIG9mIHRoZSBBU0NJSSBzeW1ib2wsIGxvd2VyY2FzZSBhbmQgdXBwZXJjYXNlIGxldHRlcnMgbWF5IGRpZmZlciBpbgorICogcHJlc2VudGF0aW9uIG9uIHRoZSBkaXNwbGF5LgorICovCisjZGVmaW5lIE1BUF9BU0NJSTdTRUdfQUxQSEFOVU0JCQlcCisJX01BUF8wXzMyX0FTQ0lJX1NFRzdfTk9OX1BSSU5UQUJMRQlcCisJX01BUF8zM180N19BU0NJSV9TRUc3X1NZTUJPTAkJXAorCV9NQVBfNDhfNTdfQVNDSUlfU0VHN19OVU1FUklDCQlcCisJX01BUF81OF82NF9BU0NJSV9TRUc3X1NZTUJPTAkJXAorCV9NQVBfNjVfOTBfQVNDSUlfU0VHN19BTFBIQV9VUFBSCVwKKwlfTUFQXzkxXzk2X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisJX01BUF85N18xMjJfQVNDSUlfU0VHN19BTFBIQV9MT1dFUglcCisJX01BUF8xMjNfMTI2X0FTQ0lJX1NFRzdfU1lNQk9MCisKKy8qIFRoaXMgc2V0IHRyaWVzIHRvIG1hcCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgc3ltYm9saWMgY2hhcmFjdGVyaXN0aWNzCisgKiBvZiB0aGUgQVNDSUkgY2hhcmFjdGVyIGZvciBtYXhpbXVtIGRpc2NyaW1pbmF0aW9uLgorICogRm9yIG5vdyB0aGlzIG1lYW5zIGFsbCBhbHBoYSBjaGFycyBhcmUgaW4gbG93ZXIgY2FzZSByZXByZXNlbnRhdGlvbnMuCisgKiAoVGhpcyBmb3IgZXhhbXBsZSBmYWNpbGl0YXRlcyB0aGUgdXNlIG9mIGhleCBudW1iZXJzIHdpdGggdXBwZXJjYXNlIGlucHV0LikKKyAqLworI2RlZmluZSBNQVBfQVNDSUk3U0VHX0FMUEhBTlVNX0xDCQkJXAorCV9NQVBfMF8zMl9BU0NJSV9TRUc3X05PTl9QUklOVEFCTEUJXAorCV9NQVBfMzNfNDdfQVNDSUlfU0VHN19TWU1CT0wJCVwKKwlfTUFQXzQ4XzU3X0FTQ0lJX1NFRzdfTlVNRVJJQwkJXAorCV9NQVBfNThfNjRfQVNDSUlfU0VHN19TWU1CT0wJCVwKKwlfTUFQXzk3XzEyMl9BU0NJSV9TRUc3X0FMUEhBX0xPV0VSCVwKKwlfTUFQXzkxXzk2X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisJX01BUF85N18xMjJfQVNDSUlfU0VHN19BTFBIQV9MT1dFUglcCisJX01BUF8xMjNfMTI2X0FTQ0lJX1NFRzdfU1lNQk9MCisKKyNkZWZpbmUgU0VHN19ERUZBVUxUX01BUChfbmFtZSkJCVwKKwlTRUc3X0NPTlZFUlNJT05fTUFQKF9uYW1lLE1BUF9BU0NJSTdTRUdfQUxQSEFOVU0pCisKKyNlbmRpZgkvKiBNQVBfVE9fN1NFR01FTlRfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21hdHJveGZiLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21hdHJveGZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyMmE4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWF0cm94ZmIuaApAQCAtMCwwICsxLDQyIEBACisjaWZuZGVmIF9fTElOVVhfTUFUUk9YRkJfSF9fCisjZGVmaW5lIF9fTElOVVhfTUFUUk9YRkJfSF9fCisKKyNpbmNsdWRlIDxhc20vaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKK3N0cnVjdCBtYXRyb3hpb2Nfb3V0cHV0X21vZGUgeworCV9fdTMyCW91dHB1dDsJCS8qIHdoaWNoIG91dHB1dCAqLworI2RlZmluZSBNQVRST1hGQl9PVVRQVVRfUFJJTUFSWQkJMHgwMDAwCisjZGVmaW5lIE1BVFJPWEZCX09VVFBVVF9TRUNPTkRBUlkJMHgwMDAxCisjZGVmaW5lIE1BVFJPWEZCX09VVFBVVF9ERlAJCTB4MDAwMgorCV9fdTMyCW1vZGU7CQkvKiB3aGljaCBtb2RlICovCisjZGVmaW5lIE1BVFJPWEZCX09VVFBVVF9NT0RFX1BBTAkweDAwMDEKKyNkZWZpbmUgTUFUUk9YRkJfT1VUUFVUX01PREVfTlRTQwkweDAwMDIKKyNkZWZpbmUgTUFUUk9YRkJfT1VUUFVUX01PREVfTU9OSVRPUgkweDAwODAKK307CisjZGVmaW5lIE1BVFJPWEZCX1NFVF9PVVRQVVRfTU9ERQlfSU9XKCduJywweEZBLHNpemVfdCkKKyNkZWZpbmUgTUFUUk9YRkJfR0VUX09VVFBVVF9NT0RFCV9JT1dSKCduJywweEZBLHNpemVfdCkKKworLyogYml0ZmllbGQgKi8KKyNkZWZpbmUgTUFUUk9YRkJfT1VUUFVUX0NPTk5fUFJJTUFSWQkoMSA8PCBNQVRST1hGQl9PVVRQVVRfUFJJTUFSWSkKKyNkZWZpbmUgTUFUUk9YRkJfT1VUUFVUX0NPTk5fU0VDT05EQVJZCSgxIDw8IE1BVFJPWEZCX09VVFBVVF9TRUNPTkRBUlkpCisjZGVmaW5lIE1BVFJPWEZCX09VVFBVVF9DT05OX0RGUAkoMSA8PCBNQVRST1hGQl9PVVRQVVRfREZQKQorLyogY29ubmVjdCB0aGVzZSBvdXRwdXRzIHRvIHRoaXMgZnJhbWVidWZmZXIgKi8KKyNkZWZpbmUgTUFUUk9YRkJfU0VUX09VVFBVVF9DT05ORUNUSU9OCV9JT1coJ24nLDB4Rjgsc2l6ZV90KQorLyogd2hpY2ggb3V0cHV0cyBhcmUgY29ubmVjdGVkIHRvIHRoaXMgZnJhbWVidWZmZXIgKi8KKyNkZWZpbmUgTUFUUk9YRkJfR0VUX09VVFBVVF9DT05ORUNUSU9OCV9JT1IoJ24nLDB4Rjgsc2l6ZV90KQorLyogd2hpY2ggb3V0cHV0cyBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIGZyYW1lYnVmZmVyICovCisjZGVmaW5lIE1BVFJPWEZCX0dFVF9BVkFJTEFCTEVfT1VUUFVUUwlfSU9SKCduJywweEY5LHNpemVfdCkKKy8qIHdoaWNoIG91dHB1dHMgZXhpc3Qgb24gdGhpcyBmcmFtZWJ1ZmZlciAqLworI2RlZmluZSBNQVRST1hGQl9HRVRfQUxMX09VVFBVVFMJX0lPUignbicsMHhGQixzaXplX3QpCisKK2VudW0gbWF0cm94ZmJfY3RybF9pZCB7CisgIE1BVFJPWEZCX0NJRF9URVNUT1VUCSA9IFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSwKKyAgTUFUUk9YRkJfQ0lEX0RFRkxJQ0tFUiwKKyAgTUFUUk9YRkJfQ0lEX0xBU1QKK307CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21lZGlhLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21lZGlhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwZTdjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWVkaWEuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIE11bHRpbWVkaWEgZGV2aWNlIEFQSQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIENvbnRhY3RzOiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+CisgKgkgICAgIFNha2FyaSBBaWx1cyA8c2FrYXJpLmFpbHVzQGlraS5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01FRElBX0gKKyNkZWZpbmUgX19MSU5VWF9NRURJQV9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjZGVmaW5lIE1FRElBX0FQSV9WRVJTSU9OCUtFUk5FTF9WRVJTSU9OKDAsIDEsIDApCisKK3N0cnVjdCBtZWRpYV9kZXZpY2VfaW5mbyB7CisJY2hhciBkcml2ZXJbMTZdOworCWNoYXIgbW9kZWxbMzJdOworCWNoYXIgc2VyaWFsWzQwXTsKKwljaGFyIGJ1c19pbmZvWzMyXTsKKwlfX3UzMiBtZWRpYV92ZXJzaW9uOworCV9fdTMyIGh3X3JldmlzaW9uOworCV9fdTMyIGRyaXZlcl92ZXJzaW9uOworCV9fdTMyIHJlc2VydmVkWzMxXTsKK307CisKKyNkZWZpbmUgTUVESUFfRU5UX0lEX0ZMQUdfTkVYVAkJKDEgPDwgMzEpCisKKyNkZWZpbmUgTUVESUFfRU5UX1RZUEVfU0hJRlQJCTE2CisjZGVmaW5lIE1FRElBX0VOVF9UWVBFX01BU0sJCTB4MDBmZjAwMDAKKyNkZWZpbmUgTUVESUFfRU5UX1NVQlRZUEVfTUFTSwkJMHgwMDAwZmZmZgorCisjZGVmaW5lIE1FRElBX0VOVF9UX0RFVk5PREUJCSgxIDw8IE1FRElBX0VOVF9UWVBFX1NISUZUKQorI2RlZmluZSBNRURJQV9FTlRfVF9ERVZOT0RFX1Y0TAkJKE1FRElBX0VOVF9UX0RFVk5PREUgKyAxKQorI2RlZmluZSBNRURJQV9FTlRfVF9ERVZOT0RFX0ZCCQkoTUVESUFfRU5UX1RfREVWTk9ERSArIDIpCisjZGVmaW5lIE1FRElBX0VOVF9UX0RFVk5PREVfQUxTQQkoTUVESUFfRU5UX1RfREVWTk9ERSArIDMpCisjZGVmaW5lIE1FRElBX0VOVF9UX0RFVk5PREVfRFZCCQkoTUVESUFfRU5UX1RfREVWTk9ERSArIDQpCisKKyNkZWZpbmUgTUVESUFfRU5UX1RfVjRMMl9TVUJERVYJCSgyIDw8IE1FRElBX0VOVF9UWVBFX1NISUZUKQorI2RlZmluZSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVl9TRU5TT1IJKE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWICsgMSkKKyNkZWZpbmUgTUVESUFfRU5UX1RfVjRMMl9TVUJERVZfRkxBU0gJKE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWICsgMikKKyNkZWZpbmUgTUVESUFfRU5UX1RfVjRMMl9TVUJERVZfTEVOUwkoTUVESUFfRU5UX1RfVjRMMl9TVUJERVYgKyAzKQorCisjZGVmaW5lIE1FRElBX0VOVF9GTF9ERUZBVUxUCQkoMSA8PCAwKQorCitzdHJ1Y3QgbWVkaWFfZW50aXR5X2Rlc2MgeworCV9fdTMyIGlkOworCWNoYXIgbmFtZVszMl07CisJX191MzIgdHlwZTsKKwlfX3UzMiByZXZpc2lvbjsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBncm91cF9pZDsKKwlfX3UxNiBwYWRzOworCV9fdTE2IGxpbmtzOworCisJX191MzIgcmVzZXJ2ZWRbNF07CisKKwl1bmlvbiB7CisJCS8qIE5vZGUgc3BlY2lmaWNhdGlvbnMgKi8KKwkJc3RydWN0IHsKKwkJCV9fdTMyIG1ham9yOworCQkJX191MzIgbWlub3I7CisJCX0gdjRsOworCQlzdHJ1Y3QgeworCQkJX191MzIgbWFqb3I7CisJCQlfX3UzMiBtaW5vcjsKKwkJfSBmYjsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIGNhcmQ7CisJCQlfX3UzMiBkZXZpY2U7CisJCQlfX3UzMiBzdWJkZXZpY2U7CisJCX0gYWxzYTsKKwkJaW50IGR2YjsKKworCQkvKiBTdWItZGV2aWNlIHNwZWNpZmljYXRpb25zICovCisJCS8qIE5vdGhpbmcgbmVlZGVkIHlldCAqLworCQlfX3U4IHJhd1sxODRdOworCX07Cit9OworCisjZGVmaW5lIE1FRElBX1BBRF9GTF9TSU5LCQkoMSA8PCAwKQorI2RlZmluZSBNRURJQV9QQURfRkxfU09VUkNFCQkoMSA8PCAxKQorCitzdHJ1Y3QgbWVkaWFfcGFkX2Rlc2MgeworCV9fdTMyIGVudGl0eTsJCS8qIGVudGl0eSBJRCAqLworCV9fdTE2IGluZGV4OwkJLyogcGFkIGluZGV4ICovCisJX191MzIgZmxhZ3M7CQkvKiBwYWQgZmxhZ3MgKi8KKwlfX3UzMiByZXNlcnZlZFsyXTsKK307CisKKyNkZWZpbmUgTUVESUFfTE5LX0ZMX0VOQUJMRUQJCSgxIDw8IDApCisjZGVmaW5lIE1FRElBX0xOS19GTF9JTU1VVEFCTEUJCSgxIDw8IDEpCisjZGVmaW5lIE1FRElBX0xOS19GTF9EWU5BTUlDCQkoMSA8PCAyKQorCitzdHJ1Y3QgbWVkaWFfbGlua19kZXNjIHsKKwlzdHJ1Y3QgbWVkaWFfcGFkX2Rlc2Mgc291cmNlOworCXN0cnVjdCBtZWRpYV9wYWRfZGVzYyBzaW5rOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHJlc2VydmVkWzJdOworfTsKKworc3RydWN0IG1lZGlhX2xpbmtzX2VudW0geworCV9fdTMyIGVudGl0eTsKKwkvKiBTaG91bGQgaGF2ZSBlbm91Z2ggcm9vbSBmb3IgcGFkcyBlbGVtZW50cyAqLworCXN0cnVjdCBtZWRpYV9wYWRfZGVzYyAqcGFkczsKKwkvKiBTaG91bGQgaGF2ZSBlbm91Z2ggcm9vbSBmb3IgbGlua3MgZWxlbWVudHMgKi8KKwlzdHJ1Y3QgbWVkaWFfbGlua19kZXNjICpsaW5rczsKKwlfX3UzMiByZXNlcnZlZFs0XTsKK307CisKKyNkZWZpbmUgTUVESUFfSU9DX0RFVklDRV9JTkZPCQlfSU9XUignfCcsIDB4MDAsIHN0cnVjdCBtZWRpYV9kZXZpY2VfaW5mbykKKyNkZWZpbmUgTUVESUFfSU9DX0VOVU1fRU5USVRJRVMJCV9JT1dSKCd8JywgMHgwMSwgc3RydWN0IG1lZGlhX2VudGl0eV9kZXNjKQorI2RlZmluZSBNRURJQV9JT0NfRU5VTV9MSU5LUwkJX0lPV1IoJ3wnLCAweDAyLCBzdHJ1Y3QgbWVkaWFfbGlua3NfZW51bSkKKyNkZWZpbmUgTUVESUFfSU9DX1NFVFVQX0xJTksJCV9JT1dSKCd8JywgMHgwMywgc3RydWN0IG1lZGlhX2xpbmtfZGVzYykKKworI2VuZGlmIC8qIF9fTElOVVhfTUVESUFfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzNzU3YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKQEAgLTAsMCArMSw2NCBAQAorI2lmbmRlZiBfTElOVVhfTUVNUE9MSUNZX0gKKyNkZWZpbmUgX0xJTlVYX01FTVBPTElDWV9IIDEKKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKy8qCisgKiBOVU1BIG1lbW9yeSBwb2xpY2llcyBmb3IgTGludXguCisgKiBDb3B5cmlnaHQgMjAwMywyMDA0IEFuZGkgS2xlZW4gU3VTRSBMYWJzCisgKi8KKworLyoKKyAqIEJvdGggdGhlIE1QT0xfKiBtZW1wb2xpY3kgbW9kZSBhbmQgdGhlIE1QT0xfRl8qIG9wdGlvbmFsIG1vZGUgZmxhZ3MgYXJlCisgKiBwYXNzZWQgYnkgdGhlIHVzZXIgdG8gZWl0aGVyIHNldF9tZW1wb2xpY3koKSBvciBtYmluZCgpIGluIGFuICdpbnQnIGFjdHVhbC4KKyAqIFRoZSBNUE9MX01PREVfRkxBR1MgbWFjcm8gZGV0ZXJtaW5lcyB0aGUgbGVnYWwgc2V0IG9mIG9wdGlvbmFsIG1vZGUgZmxhZ3MuCisgKi8KKworLyogUG9saWNpZXMgKi8KK2VudW0geworCU1QT0xfREVGQVVMVCwKKwlNUE9MX1BSRUZFUlJFRCwKKwlNUE9MX0JJTkQsCisJTVBPTF9JTlRFUkxFQVZFLAorCU1QT0xfTUFYLAkvKiBhbHdheXMgbGFzdCBtZW1iZXIgb2YgZW51bSAqLworfTsKKworZW51bSBtcG9sX3JlYmluZF9zdGVwIHsKKwlNUE9MX1JFQklORF9PTkNFLAkvKiBkbyByZWJpbmQgd29yayBhdCBvbmNlKG5vdCBieSB0d28gc3RlcCkgKi8KKwlNUE9MX1JFQklORF9TVEVQMSwJLyogZmlyc3Qgc3RlcChzZXQgYWxsIHRoZSBuZXdseSBub2RlcykgKi8KKwlNUE9MX1JFQklORF9TVEVQMiwJLyogc2Vjb25kIHN0ZXAoY2xlYW4gYWxsIHRoZSBkaXNhbGxvd2VkIG5vZGVzKSovCisJTVBPTF9SRUJJTkRfTlNURVAsCit9OworCisvKiBGbGFncyBmb3Igc2V0X21lbXBvbGljeSAqLworI2RlZmluZSBNUE9MX0ZfU1RBVElDX05PREVTCSgxIDw8IDE1KQorI2RlZmluZSBNUE9MX0ZfUkVMQVRJVkVfTk9ERVMJKDEgPDwgMTQpCisKKy8qCisgKiBNUE9MX01PREVfRkxBR1MgaXMgdGhlIHVuaW9uIG9mIGFsbCBwb3NzaWJsZSBvcHRpb25hbCBtb2RlIGZsYWdzIHBhc3NlZCB0bworICogZWl0aGVyIHNldF9tZW1wb2xpY3koKSBvciBtYmluZCgpLgorICovCisjZGVmaW5lIE1QT0xfTU9ERV9GTEFHUwkoTVBPTF9GX1NUQVRJQ19OT0RFUyB8IE1QT0xfRl9SRUxBVElWRV9OT0RFUykKKworLyogRmxhZ3MgZm9yIGdldF9tZW1wb2xpY3kgKi8KKyNkZWZpbmUgTVBPTF9GX05PREUJKDE8PDApCS8qIHJldHVybiBuZXh0IElMIG1vZGUgaW5zdGVhZCBvZiBub2RlIG1hc2sgKi8KKyNkZWZpbmUgTVBPTF9GX0FERFIJKDE8PDEpCS8qIGxvb2sgdXAgdm1hIHVzaW5nIGFkZHJlc3MgKi8KKyNkZWZpbmUgTVBPTF9GX01FTVNfQUxMT1dFRCAoMTw8MikgLyogcmV0dXJuIGFsbG93ZWQgbWVtb3JpZXMgKi8KKworLyogRmxhZ3MgZm9yIG1iaW5kICovCisjZGVmaW5lIE1QT0xfTUZfU1RSSUNUCSgxPDwwKQkvKiBWZXJpZnkgZXhpc3RpbmcgcGFnZXMgaW4gdGhlIG1hcHBpbmcgKi8KKyNkZWZpbmUgTVBPTF9NRl9NT1ZFCSgxPDwxKQkvKiBNb3ZlIHBhZ2VzIG93bmVkIGJ5IHRoaXMgcHJvY2VzcyB0byBjb25mb3JtIHRvIG1hcHBpbmcgKi8KKyNkZWZpbmUgTVBPTF9NRl9NT1ZFX0FMTCAoMTw8MikJLyogTW92ZSBldmVyeSBwYWdlIHRvIGNvbmZvcm0gdG8gbWFwcGluZyAqLworI2RlZmluZSBNUE9MX01GX0lOVEVSTkFMICgxPDwzKQkvKiBJbnRlcm5hbCBmbGFncyBzdGFydCBoZXJlICovCisKKy8qCisgKiBJbnRlcm5hbCBmbGFncyB0aGF0IHNoYXJlIHRoZSBzdHJ1Y3QgbWVtcG9saWN5IGZsYWdzIHdvcmQgd2l0aAorICogIm1vZGUgZmxhZ3MiLiAgVGhlc2UgZmxhZ3MgYXJlIGFsbG9jYXRlZCBmcm9tIGJpdCAwIHVwLCBhcyB0aGV5CisgKiBhcmUgbmV2ZXIgT1InZWQgaW50byB0aGUgbW9kZSBpbiBtZW1wb2xpY3kgQVBJIGFyZ3VtZW50cy4KKyAqLworI2RlZmluZSBNUE9MX0ZfU0hBUkVEICAoMSA8PCAwKQkvKiBpZGVudGlmeSBzaGFyZWQgcG9saWNpZXMgKi8KKyNkZWZpbmUgTVBPTF9GX0xPQ0FMICAgKDEgPDwgMSkJLyogcHJlZmVycmVkIGxvY2FsIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgTVBPTF9GX1JFQklORElORyAoMSA8PCAyKQkvKiBpZGVudGlmeSBwb2xpY2llcyBpbiByZWJpbmRpbmcgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWV5ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tZXllLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkNDk5NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWV5ZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBNb3Rpb24gRXllIHZpZGVvNGxpbnV4IGRyaXZlciBmb3IgU29ueSBWYWlvIFBpY3R1cmVCb29rCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBBbGPDtHZlIDx3d3cuYWxjb3ZlLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgQW5kcmV3IFRyaWRnZWxsIDx0cmlkZ2VAdmFsaW51eC5jb20+CisgKgorICogRWFybGllciB3b3JrIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgUGF1bCBgUnVzdHknIFJ1c3NlbGwgYW5kIFBhdWwgTWFja2VycmFzLgorICoKKyAqIFNvbWUgcGFydHMgYm9ycm93ZWQgZnJvbSB2YXJpb3VzIHZpZGVvNGxpbnV4IGRyaXZlcnMsIGVzcGVjaWFsbHkKKyAqIGJ0dHYtZHJpdmVyLmMgYW5kIHpvcmFuLmMsIHNlZSBvcmlnaW5hbCBmaWxlcyBmb3IgY3JlZGl0cy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRVlFX0hfCisjZGVmaW5lIF9NRVlFX0hfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUHJpdmF0ZSBBUEkgZm9yIGhhbmRsaW5nIG1qcGVnIGNhcHR1cmUgLyBwbGF5YmFjay4gICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IG1leWVfcGFyYW1zIHsKKwl1bnNpZ25lZCBjaGFyIHN1YnNhbXBsZTsKKwl1bnNpZ25lZCBjaGFyIHF1YWxpdHk7CisJdW5zaWduZWQgY2hhciBzaGFycG5lc3M7CisJdW5zaWduZWQgY2hhciBhZ2M7CisJdW5zaWduZWQgY2hhciBwaWN0dXJlOworCXVuc2lnbmVkIGNoYXIgZnJhbWVyYXRlOworfTsKKworLyogcXVlcnkgdGhlIGV4dGVuZGVkIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgTUVZRUlPQ19HX1BBUkFNUwlfSU9SICgndicsIEJBU0VfVklESU9DX1BSSVZBVEUrMCwgc3RydWN0IG1leWVfcGFyYW1zKQorLyogc2V0IHRoZSBleHRlbmRlZCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1FWUVJT0NfU19QQVJBTVMJX0lPVyAoJ3YnLCBCQVNFX1ZJRElPQ19QUklWQVRFKzEsIHN0cnVjdCBtZXllX3BhcmFtcykKKy8qIHF1ZXVlIGEgYnVmZmVyIGZvciBtanBlZyBjYXB0dXJlICovCisjZGVmaW5lIE1FWUVJT0NfUUJVRl9DQVBUCV9JT1cgKCd2JywgQkFTRV9WSURJT0NfUFJJVkFURSsyLCBpbnQpCisvKiBzeW5jIGEgcHJldmlvdXNseSBxdWV1ZWQgbWpwZWcgYnVmZmVyICovCisjZGVmaW5lIE1FWUVJT0NfU1lOQwkJX0lPV1IoJ3YnLCBCQVNFX1ZJRElPQ19QUklWQVRFKzMsIGludCkKKy8qIGdldCBhIHN0aWxsIHVuY29tcHJlc3NlZCBzbmFwc2hvdCAqLworI2RlZmluZSBNRVlFSU9DX1NUSUxMQ0FQVAlfSU8gICgndicsIEJBU0VfVklESU9DX1BSSVZBVEUrNCkKKy8qIGdldCBhIGpwZWcgY29tcHJlc3NlZCBzbmFwc2hvdCAqLworI2RlZmluZSBNRVlFSU9DX1NUSUxMSkNBUFQJX0lPUiAoJ3YnLCBCQVNFX1ZJRElPQ19QUklWQVRFKzUsIGludCkKKworLyogVjRMMiBwcml2YXRlIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ0lEX0FHQwkJVjRMMl9DSURfUFJJVkFURV9CQVNFCisjZGVmaW5lIFY0TDJfQ0lEX01FWUVfU0hBUlBORVNTCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxKQorI2RlZmluZSBWNEwyX0NJRF9QSUNUVVJFCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyKQorI2RlZmluZSBWNEwyX0NJRF9KUEVHUVVBTAkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMykKKyNkZWZpbmUgVjRMMl9DSURfRlJBTUVSQVRFCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA0KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWlpLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21paS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjU1M2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21paS5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogbGludXgvbWlpLmg6IGRlZmluaXRpb25zIGZvciBNSUktY29tcGF0aWJsZSB0cmFuc2NlaXZlcnMKKyAqIE9yaWdpbmFsbHkgZHJpdmVycy9uZXQvc3VuaG1lLmguCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5LCAyMDAxIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUlJX0hfXworI2RlZmluZSBfX0xJTlVYX01JSV9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEdlbmVyaWMgTUlJIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgTUlJX0JNQ1IJCTB4MDAJLyogQmFzaWMgbW9kZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CTVNSCQkweDAxCS8qIEJhc2ljIG1vZGUgc3RhdHVzIHJlZ2lzdGVyICAqLworI2RlZmluZSBNSUlfUEhZU0lEMQkJMHgwMgkvKiBQSFlTIElEIDEgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1BIWVNJRDIJCTB4MDMJLyogUEhZUyBJRCAyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9BRFZFUlRJU0UJCTB4MDQJLyogQWR2ZXJ0aXNlbWVudCBjb250cm9sIHJlZyAgICovCisjZGVmaW5lIE1JSV9MUEEJCQkweDA1CS8qIExpbmsgcGFydG5lciBhYmlsaXR5IHJlZyAgICAqLworI2RlZmluZSBNSUlfRVhQQU5TSU9OCQkweDA2CS8qIEV4cGFuc2lvbiByZWdpc3RlciAgICAgICAgICAqLworI2RlZmluZSBNSUlfQ1RSTDEwMDAJCTB4MDkJLyogMTAwMEJBU0UtVCBjb250cm9sICAgICAgICAgICovCisjZGVmaW5lIE1JSV9TVEFUMTAwMAkJMHgwYQkvKiAxMDAwQkFTRS1UIHN0YXR1cyAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0VTVEFUVVMJCTB4MGYJLyogRXh0ZW5kZWQgU3RhdHVzICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9EQ09VTlRFUgkJMHgxMgkvKiBEaXNjb25uZWN0IGNvdW50ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0ZDU0NPVU5URVIJCTB4MTMJLyogRmFsc2UgY2FycmllciBjb3VudGVyICAgICAgICovCisjZGVmaW5lIE1JSV9OV0FZVEVTVAkJMHgxNAkvKiBOLXdheSBhdXRvLW5lZyB0ZXN0IHJlZyAgICAgKi8KKyNkZWZpbmUgTUlJX1JFUlJDT1VOVEVSCQkweDE1CS8qIFJlY2VpdmUgZXJyb3IgY291bnRlciAgICAgICAqLworI2RlZmluZSBNSUlfU1JFVklTSU9OCQkweDE2CS8qIFNpbGljb24gcmV2aXNpb24gICAgICAgICAgICAqLworI2RlZmluZSBNSUlfUkVTVjEJCTB4MTcJLyogUmVzZXJ2ZWQuLi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9MQlJFUlJPUgkJMHgxOAkvKiBMcGJhY2ssIHJ4LCBieXBhc3MgZXJyb3IgICAgKi8KKyNkZWZpbmUgTUlJX1BIWUFERFIJCTB4MTkJLyogUEhZIGFkZHJlc3MgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9SRVNWMgkJMHgxYQkvKiBSZXNlcnZlZC4uLiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1RQSVNUQVRVUwkJMHgxYgkvKiBUUEkgc3RhdHVzIGZvciAxMG1icHMgICAgICAgKi8KKyNkZWZpbmUgTUlJX05DT05GSUcJCTB4MWMJLyogTmV0d29yayBpbnRlcmZhY2UgY29uZmlnICAgICovCisKKy8qIEJhc2ljIG1vZGUgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQk1DUl9SRVNWCQkweDAwM2YJLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQ1JfU1BFRUQxMDAwCQkweDAwNDAJLyogTVNCIG9mIFNwZWVkICgxMDAwKSAgICAgICAgICovCisjZGVmaW5lIEJNQ1JfQ1RTVAkJMHgwMDgwCS8qIENvbGxpc2lvbiB0ZXN0ICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX0ZVTExEUExYCQkweDAxMDAJLyogRnVsbCBkdXBsZXggICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQ1JfQU5SRVNUQVJUCQkweDAyMDAJLyogQXV0byBuZWdvdGlhdGlvbiByZXN0YXJ0ICAgICovCisjZGVmaW5lIEJNQ1JfSVNPTEFURQkJMHgwNDAwCS8qIElzb2xhdGUgZGF0YSBwYXRocyBmcm9tIE1JSSAqLworI2RlZmluZSBCTUNSX1BET1dOCQkweDA4MDAJLyogRW5hYmxlIGxvdyBwb3dlciBzdGF0ZSAgICAgICovCisjZGVmaW5lIEJNQ1JfQU5FTkFCTEUJCTB4MTAwMAkvKiBFbmFibGUgYXV0byBuZWdvdGlhdGlvbiAgICAgKi8KKyNkZWZpbmUgQk1DUl9TUEVFRDEwMAkJMHgyMDAwCS8qIFNlbGVjdCAxMDBNYnBzICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX0xPT1BCQUNLCQkweDQwMDAJLyogVFhEIGxvb3BiYWNrIGJpdHMgICAgICAgICAgICovCisjZGVmaW5lIEJNQ1JfUkVTRVQJCTB4ODAwMAkvKiBSZXNldCB0byBkZWZhdWx0IHN0YXRlICAgICAgKi8KKworLyogQmFzaWMgbW9kZSBzdGF0dXMgcmVnaXN0ZXIuICovCisjZGVmaW5lIEJNU1JfRVJDQVAJCTB4MDAwMQkvKiBFeHQtcmVnIGNhcGFiaWxpdHkgICAgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9KQ0QJCTB4MDAwMgkvKiBKYWJiZXIgZGV0ZWN0ZWQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9MU1RBVFVTCQkweDAwMDQJLyogTGluayBzdGF0dXMgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNU1JfQU5FR0NBUEFCTEUJMHgwMDA4CS8qIEFibGUgdG8gZG8gYXV0by1uZWdvdGlhdGlvbiAqLworI2RlZmluZSBCTVNSX1JGQVVMVAkJMHgwMDEwCS8qIFJlbW90ZSBmYXVsdCBkZXRlY3RlZCAgICAgICAqLworI2RlZmluZSBCTVNSX0FORUdDT01QTEVURQkweDAwMjAJLyogQXV0by1uZWdvdGlhdGlvbiBjb21wbGV0ZSAgICovCisjZGVmaW5lIEJNU1JfUkVTVgkJMHgwMGMwCS8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0VTVEFURU4JCTB4MDEwMAkvKiBFeHRlbmRlZCBTdGF0dXMgaW4gUjE1ICAgICAgKi8KKyNkZWZpbmUgQk1TUl8xMDBIQUxGMgkJMHgwMjAwCS8qIENhbiBkbyAxMDBCQVNFLVQyIEhEWCAgICAgICAqLworI2RlZmluZSBCTVNSXzEwMEZVTEwyCQkweDA0MDAJLyogQ2FuIGRvIDEwMEJBU0UtVDIgRkRYICAgICAgICovCisjZGVmaW5lIEJNU1JfMTBIQUxGCQkweDA4MDAJLyogQ2FuIGRvIDEwbWJwcywgaGFsZi1kdXBsZXggICovCisjZGVmaW5lIEJNU1JfMTBGVUxMCQkweDEwMDAJLyogQ2FuIGRvIDEwbWJwcywgZnVsbC1kdXBsZXggICovCisjZGVmaW5lIEJNU1JfMTAwSEFMRgkJMHgyMDAwCS8qIENhbiBkbyAxMDBtYnBzLCBoYWxmLWR1cGxleCAqLworI2RlZmluZSBCTVNSXzEwMEZVTEwJCTB4NDAwMAkvKiBDYW4gZG8gMTAwbWJwcywgZnVsbC1kdXBsZXggKi8KKyNkZWZpbmUgQk1TUl8xMDBCQVNFNAkJMHg4MDAwCS8qIENhbiBkbyAxMDBtYnBzLCA0ayBwYWNrZXRzICAqLworCisvKiBBZHZlcnRpc2VtZW50IGNvbnRyb2wgcmVnaXN0ZXIuICovCisjZGVmaW5lIEFEVkVSVElTRV9TTENUCQkweDAwMWYJLyogU2VsZWN0b3IgYml0cyAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEVkVSVElTRV9DU01BCQkweDAwMDEJLyogT25seSBzZWxlY3RvciBzdXBwb3J0ZWQgICAgICovCisjZGVmaW5lIEFEVkVSVElTRV8xMEhBTEYJMHgwMDIwCS8qIFRyeSBmb3IgMTBtYnBzIGhhbGYtZHVwbGV4ICAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwMFhGVUxMCTB4MDAyMAkvKiBUcnkgZm9yIDEwMDBCQVNFLVggZnVsbC1kdXBsZXggKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwRlVMTAkweDAwNDAJLyogVHJ5IGZvciAxMG1icHMgZnVsbC1kdXBsZXggICovCisjZGVmaW5lIEFEVkVSVElTRV8xMDAwWEhBTEYJMHgwMDQwCS8qIFRyeSBmb3IgMTAwMEJBU0UtWCBoYWxmLWR1cGxleCAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwSEFMRgkweDAwODAJLyogVHJ5IGZvciAxMDBtYnBzIGhhbGYtZHVwbGV4ICovCisjZGVmaW5lIEFEVkVSVElTRV8xMDAwWFBBVVNFCTB4MDA4MAkvKiBUcnkgZm9yIDEwMDBCQVNFLVggcGF1c2UgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMEZVTEwJMHgwMTAwCS8qIFRyeSBmb3IgMTAwbWJwcyBmdWxsLWR1cGxleCAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwMFhQU0VfQVNZTQkweDAxMDAJLyogVHJ5IGZvciAxMDAwQkFTRS1YIGFzeW0gcGF1c2UgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMEJBU0U0CTB4MDIwMAkvKiBUcnkgZm9yIDEwMG1icHMgNGsgcGFja2V0cyAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX1BBVVNFX0NBUAkweDA0MDAJLyogVHJ5IGZvciBwYXVzZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEVkVSVElTRV9QQVVTRV9BU1lNCTB4MDgwMAkvKiBUcnkgZm9yIGFzeW1ldHJpYyBwYXVzZSAgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX1JFU1YJCTB4MTAwMAkvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX1JGQVVMVAkweDIwMDAJLyogU2F5IHdlIGNhbiBkZXRlY3QgZmF1bHRzICAgICovCisjZGVmaW5lIEFEVkVSVElTRV9MUEFDSwkJMHg0MDAwCS8qIEFjayBsaW5rIHBhcnRuZXJzIHJlc3BvbnNlICAqLworI2RlZmluZSBBRFZFUlRJU0VfTlBBR0UJCTB4ODAwMAkvKiBOZXh0IHBhZ2UgYml0ICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBBRFZFUlRJU0VfRlVMTAkJKEFEVkVSVElTRV8xMDBGVUxMIHwgQURWRVJUSVNFXzEwRlVMTCB8IFwKKwkJCQkgIEFEVkVSVElTRV9DU01BKQorI2RlZmluZSBBRFZFUlRJU0VfQUxMCQkoQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV8xMEZVTEwgfCBcCisJCQkJICBBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMKQorCisvKiBMaW5rIHBhcnRuZXIgYWJpbGl0eSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTFBBX1NMQ1QJCTB4MDAxZgkvKiBTYW1lIGFzIGFkdmVydGlzZSBzZWxlY3RvciAgKi8KKyNkZWZpbmUgTFBBXzEwSEFMRgkJMHgwMDIwCS8qIENhbiBkbyAxMG1icHMgaGFsZi1kdXBsZXggICAqLworI2RlZmluZSBMUEFfMTAwMFhGVUxMCQkweDAwMjAJLyogQ2FuIGRvIDEwMDBCQVNFLVggZnVsbC1kdXBsZXggKi8KKyNkZWZpbmUgTFBBXzEwRlVMTAkJMHgwMDQwCS8qIENhbiBkbyAxMG1icHMgZnVsbC1kdXBsZXggICAqLworI2RlZmluZSBMUEFfMTAwMFhIQUxGCQkweDAwNDAJLyogQ2FuIGRvIDEwMDBCQVNFLVggaGFsZi1kdXBsZXggKi8KKyNkZWZpbmUgTFBBXzEwMEhBTEYJCTB4MDA4MAkvKiBDYW4gZG8gMTAwbWJwcyBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgTFBBXzEwMDBYUEFVU0UJCTB4MDA4MAkvKiBDYW4gZG8gMTAwMEJBU0UtWCBwYXVzZSAgICAgKi8KKyNkZWZpbmUgTFBBXzEwMEZVTEwJCTB4MDEwMAkvKiBDYW4gZG8gMTAwbWJwcyBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgTFBBXzEwMDBYUEFVU0VfQVNZTQkweDAxMDAJLyogQ2FuIGRvIDEwMDBCQVNFLVggcGF1c2UgYXN5bSovCisjZGVmaW5lIExQQV8xMDBCQVNFNAkJMHgwMjAwCS8qIENhbiBkbyAxMDBtYnBzIDRrIHBhY2tldHMgICAqLworI2RlZmluZSBMUEFfUEFVU0VfQ0FQCQkweDA0MDAJLyogQ2FuIHBhdXNlICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExQQV9QQVVTRV9BU1lNCQkweDA4MDAJLyogQ2FuIHBhdXNlIGFzeW1ldHJpY2FsbHkgICAgICovCisjZGVmaW5lIExQQV9SRVNWCQkweDEwMDAJLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExQQV9SRkFVTFQJCTB4MjAwMAkvKiBMaW5rIHBhcnRuZXIgZmF1bHRlZCAgICAgICAgKi8KKyNkZWZpbmUgTFBBX0xQQUNLCQkweDQwMDAJLyogTGluayBwYXJ0bmVyIGFja2VkIHVzICAgICAgICovCisjZGVmaW5lIExQQV9OUEFHRQkJMHg4MDAwCS8qIE5leHQgcGFnZSBiaXQgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIExQQV9EVVBMRVgJCShMUEFfMTBGVUxMIHwgTFBBXzEwMEZVTEwpCisjZGVmaW5lIExQQV8xMDAJCQkoTFBBXzEwMEZVTEwgfCBMUEFfMTAwSEFMRiB8IExQQV8xMDBCQVNFNCkKKworLyogRXhwYW5zaW9uIHJlZ2lzdGVyIGZvciBhdXRvLW5lZ290aWF0aW9uLiAqLworI2RlZmluZSBFWFBBTlNJT05fTldBWQkJMHgwMDAxCS8qIENhbiBkbyBOLXdheSBhdXRvLW5lZ28gICAgICAqLworI2RlZmluZSBFWFBBTlNJT05fTENXUAkJMHgwMDAyCS8qIEdvdCBuZXcgUlggcGFnZSBjb2RlIHdvcmQgICAqLworI2RlZmluZSBFWFBBTlNJT05fRU5BQkxFTlBBR0UJMHgwMDA0CS8qIFRoaXMgZW5hYmxlcyBucGFnZSB3b3JkcyAgICAqLworI2RlZmluZSBFWFBBTlNJT05fTlBDQVBBQkxFCTB4MDAwOAkvKiBMaW5rIHBhcnRuZXIgc3VwcG9ydHMgbnBhZ2UgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX01GQVVMVFMJMHgwMDEwCS8qIE11bHRpcGxlIGZhdWx0cyBkZXRlY3RlZCAgICAqLworI2RlZmluZSBFWFBBTlNJT05fUkVTVgkJMHhmZmUwCS8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIEVTVEFUVVNfMTAwMF9URlVMTAkweDIwMDAJLyogQ2FuIGRvIDEwMDBCVCBGdWxsICAgICAgICAgICovCisjZGVmaW5lIEVTVEFUVVNfMTAwMF9USEFMRgkweDEwMDAJLyogQ2FuIGRvIDEwMDBCVCBIYWxmICAgICAgICAgICovCisKKy8qIE4td2F5IHRlc3QgcmVnaXN0ZXIuICovCisjZGVmaW5lIE5XQVlURVNUX1JFU1YxCQkweDAwZmYJLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5XQVlURVNUX0xPT1BCQUNLCTB4MDEwMAkvKiBFbmFibGUgbG9vcGJhY2sgZm9yIE4td2F5ICAgKi8KKyNkZWZpbmUgTldBWVRFU1RfUkVTVjIJCTB4ZmUwMAkvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKworLyogMTAwMEJBU0UtVCBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEVkVSVElTRV8xMDAwRlVMTAkweDAyMDAgIC8qIEFkdmVydGlzZSAxMDAwQkFTRS1UIGZ1bGwgZHVwbGV4ICovCisjZGVmaW5lIEFEVkVSVElTRV8xMDAwSEFMRgkweDAxMDAgIC8qIEFkdmVydGlzZSAxMDAwQkFTRS1UIGhhbGYgZHVwbGV4ICovCisjZGVmaW5lIENUTDEwMDBfQVNfTUFTVEVSCTB4MDgwMAorI2RlZmluZSBDVEwxMDAwX0VOQUJMRV9NQVNURVIJMHgxMDAwCisKKy8qIDEwMDBCQVNFLVQgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIExQQV8xMDAwTE9DQUxSWE9LCTB4MjAwMAkvKiBMaW5rIHBhcnRuZXIgbG9jYWwgcmVjZWl2ZXIgc3RhdHVzICovCisjZGVmaW5lIExQQV8xMDAwUkVNUlhPSwkJMHgxMDAwCS8qIExpbmsgcGFydG5lciByZW1vdGUgcmVjZWl2ZXIgc3RhdHVzICovCisjZGVmaW5lIExQQV8xMDAwRlVMTAkJMHgwODAwCS8qIExpbmsgcGFydG5lciAxMDAwQkFTRS1UIGZ1bGwgZHVwbGV4ICovCisjZGVmaW5lIExQQV8xMDAwSEFMRgkJMHgwNDAwCS8qIExpbmsgcGFydG5lciAxMDAwQkFTRS1UIGhhbGYgZHVwbGV4ICovCisKKy8qIEZsb3cgY29udHJvbCBmbGFncyAqLworI2RlZmluZSBGTE9XX0NUUkxfVFgJCTB4MDEKKyNkZWZpbmUgRkxPV19DVFJMX1JYCQkweDAyCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgaW4gYWxsIFNJT0N4TUlJeHh4IGlvY3RsIGNhbGxzICovCitzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgeworCV9fdTE2CQlwaHlfaWQ7CisJX191MTYJCXJlZ19udW07CisJX191MTYJCXZhbF9pbjsKKwlfX3UxNgkJdmFsX291dDsKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX01JSV9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWluaXhfZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWluaXhfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2ZlMDllCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9taW5peF9mcy5oCkBAIC0wLDAgKzEsMTA2IEBACisjaWZuZGVmIF9MSU5VWF9NSU5JWF9GU19ICisjZGVmaW5lIF9MSU5VWF9NSU5JWF9GU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisKKy8qCisgKiBUaGUgbWluaXggZmlsZXN5c3RlbSBjb25zdGFudHMvc3RydWN0dXJlcworICovCisKKy8qCisgKiBUaGFua3MgdG8gS2VlcyBKIEJvdCBmb3Igc2VuZGluZyBtZSB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIG5ldworICogbWluaXggZmlsZXN5c3RlbSAoYWthIFYyKSB3aXRoIGJpZ2dlciBpbm9kZXMgYW5kIDMyLWJpdCBibG9jaworICogcG9pbnRlcnMuCisgKi8KKworI2RlZmluZSBNSU5JWF9ST09UX0lOTyAxCisKKy8qIE5vdCB0aGUgc2FtZSBhcyB0aGUgYm9ndXMgTElOS19NQVggaW4gPGxpbnV4L2xpbWl0cy5oPi4gT2ggd2VsbC4gKi8KKyNkZWZpbmUgTUlOSVhfTElOS19NQVgJMjUwCisjZGVmaW5lIE1JTklYMl9MSU5LX01BWAk2NTUzMAorCisjZGVmaW5lIE1JTklYX0lfTUFQX1NMT1RTCTgKKyNkZWZpbmUgTUlOSVhfWl9NQVBfU0xPVFMJNjQKKyNkZWZpbmUgTUlOSVhfVkFMSURfRlMJCTB4MDAwMQkJLyogQ2xlYW4gZnMuICovCisjZGVmaW5lIE1JTklYX0VSUk9SX0ZTCQkweDAwMDIJCS8qIGZzIGhhcyBlcnJvcnMuICovCisKKyNkZWZpbmUgTUlOSVhfSU5PREVTX1BFUl9CTE9DSyAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peF9pbm9kZSkpKQorCisvKgorICogVGhpcyBpcyB0aGUgb3JpZ2luYWwgbWluaXggaW5vZGUgbGF5b3V0IG9uIGRpc2suCisgKiBOb3RlIHRoZSA4LWJpdCBnaWQgYW5kIGF0aW1lIGFuZCBjdGltZS4KKyAqLworc3RydWN0IG1pbml4X2lub2RlIHsKKwlfX3UxNiBpX21vZGU7CisJX191MTYgaV91aWQ7CisJX191MzIgaV9zaXplOworCV9fdTMyIGlfdGltZTsKKwlfX3U4ICBpX2dpZDsKKwlfX3U4ICBpX25saW5rczsKKwlfX3UxNiBpX3pvbmVbOV07Cit9OworCisvKgorICogVGhlIG5ldyBtaW5peCBpbm9kZSBoYXMgYWxsIHRoZSB0aW1lIGVudHJpZXMsIGFzIHdlbGwgYXMKKyAqIGxvbmcgYmxvY2sgbnVtYmVycyBhbmQgYSB0aGlyZCBpbmRpcmVjdCBibG9jayAoNysxKzErMQorICogaW5zdGVhZCBvZiA3KzErMSkuIEFsc28sIHNvbWUgcHJldmlvdXNseSA4LWJpdCB2YWx1ZXMgYXJlCisgKiBub3cgMTYtYml0LiBUaGUgaW5vZGUgaXMgbm93IDY0IGJ5dGVzIGluc3RlYWQgb2YgMzIuCisgKi8KK3N0cnVjdCBtaW5peDJfaW5vZGUgeworCV9fdTE2IGlfbW9kZTsKKwlfX3UxNiBpX25saW5rczsKKwlfX3UxNiBpX3VpZDsKKwlfX3UxNiBpX2dpZDsKKwlfX3UzMiBpX3NpemU7CisJX191MzIgaV9hdGltZTsKKwlfX3UzMiBpX210aW1lOworCV9fdTMyIGlfY3RpbWU7CisJX191MzIgaV96b25lWzEwXTsKK307CisKKy8qCisgKiBtaW5peCBzdXBlci1ibG9jayBkYXRhIG9uIGRpc2sKKyAqLworc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrIHsKKwlfX3UxNiBzX25pbm9kZXM7CisJX191MTYgc19uem9uZXM7CisJX191MTYgc19pbWFwX2Jsb2NrczsKKwlfX3UxNiBzX3ptYXBfYmxvY2tzOworCV9fdTE2IHNfZmlyc3RkYXRhem9uZTsKKwlfX3UxNiBzX2xvZ196b25lX3NpemU7CisJX191MzIgc19tYXhfc2l6ZTsKKwlfX3UxNiBzX21hZ2ljOworCV9fdTE2IHNfc3RhdGU7CisJX191MzIgc196b25lczsKK307CisKKy8qCisgKiBWMyBtaW5peCBzdXBlci1ibG9jayBkYXRhIG9uIGRpc2sKKyAqLworc3RydWN0IG1pbml4M19zdXBlcl9ibG9jayB7CisJX191MzIgc19uaW5vZGVzOworCV9fdTE2IHNfcGFkMDsKKwlfX3UxNiBzX2ltYXBfYmxvY2tzOworCV9fdTE2IHNfem1hcF9ibG9ja3M7CisJX191MTYgc19maXJzdGRhdGF6b25lOworCV9fdTE2IHNfbG9nX3pvbmVfc2l6ZTsKKwlfX3UxNiBzX3BhZDE7CisJX191MzIgc19tYXhfc2l6ZTsKKwlfX3UzMiBzX3pvbmVzOworCV9fdTE2IHNfbWFnaWM7CisJX191MTYgc19wYWQyOworCV9fdTE2IHNfYmxvY2tzaXplOworCV9fdTggIHNfZGlza192ZXJzaW9uOworfTsKKworc3RydWN0IG1pbml4X2Rpcl9lbnRyeSB7CisJX191MTYgaW5vZGU7CisJY2hhciBuYW1lWzBdOworfTsKKworc3RydWN0IG1pbml4M19kaXJfZW50cnkgeworCV9fdTMyIGlub2RlOworCWNoYXIgbmFtZVswXTsKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbW1hbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZiMzAwNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbW1hbi5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX0xJTlVYX01NQU5fSAorI2RlZmluZSBfTElOVVhfTU1BTl9ICisKKyNpbmNsdWRlIDxhc20vbW1hbi5oPgorCisjZGVmaW5lIE1SRU1BUF9NQVlNT1ZFCTEKKyNkZWZpbmUgTVJFTUFQX0ZJWEVECTIKKworI2RlZmluZSBPVkVSQ09NTUlUX0dVRVNTCQkwCisjZGVmaW5lIE9WRVJDT01NSVRfQUxXQVlTCQkxCisjZGVmaW5lIE9WRVJDT01NSVRfTkVWRVIJCTIKKworI2VuZGlmIC8qIF9MSU5VWF9NTUFOX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbW1jL2lvY3RsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21tYy9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYTViYzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21tYy9pb2N0bC5oCkBAIC0wLDAgKzEsNTQgQEAKKyNpZm5kZWYgTElOVVhfTU1DX0lPQ1RMX0gKKyNkZWZpbmUgTElOVVhfTU1DX0lPQ1RMX0gKK3N0cnVjdCBtbWNfaW9jX2NtZCB7CisJLyogSW1wbGllcyBkaXJlY3Rpb24gb2YgZGF0YS4gIHRydWUgPSB3cml0ZSwgZmFsc2UgPSByZWFkICovCisJaW50IHdyaXRlX2ZsYWc7CisKKwkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBjb21tYW5kLiAgdHJ1ZSA9IHByZWNlZGUgd2l0aCBDTUQ1NSAqLworCWludCBpc19hY21kOworCisJX191MzIgb3Bjb2RlOworCV9fdTMyIGFyZzsKKwlfX3UzMiByZXNwb25zZVs0XTsgIC8qIENNRCByZXNwb25zZSAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgYmxrc3o7CisJdW5zaWduZWQgaW50IGJsb2NrczsKKworCS8qCisJICogU2xlZXAgYXQgbGVhc3QgcG9zdHNsZWVwX21pbl91cyB1c2Vjb25kcywgYW5kIGF0IG1vc3QKKwkgKiBwb3N0c2xlZXBfbWF4X3VzIHVzZWNvbmRzICphZnRlciogaXNzdWluZyBjb21tYW5kLiAgTmVlZGVkIGZvcgorCSAqIHNvbWUgcmVhZCBjb21tYW5kcyBmb3Igd2hpY2ggY2FyZHMgaGF2ZSBubyBvdGhlciB3YXkgb2YgaW5kaWNhdGluZworCSAqIHRoZXkncmUgcmVhZHkgZm9yIHRoZSBuZXh0IGNvbW1hbmQgKGkuZS4gdGhlcmUgaXMgbm8gZXF1aXZhbGVudCBvZgorCSAqIGEgImJ1c3kiIGluZGljYXRvciBmb3IgcmVhZCBvcGVyYXRpb25zKS4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgcG9zdHNsZWVwX21pbl91czsKKwl1bnNpZ25lZCBpbnQgcG9zdHNsZWVwX21heF91czsKKworCS8qCisJICogT3ZlcnJpZGUgZHJpdmVyLWNvbXB1dGVkIHRpbWVvdXRzLiAgTm90ZSB0aGUgZGlmZmVyZW5jZSBpbiB1bml0cyEKKwkgKi8KKwl1bnNpZ25lZCBpbnQgZGF0YV90aW1lb3V0X25zOworCXVuc2lnbmVkIGludCBjbWRfdGltZW91dF9tczsKKworCS8qCisJICogRm9yIDY0LWJpdCBtYWNoaW5lcywgdGhlIG5leHQgbWVtYmVyLCBgYF9fdTY0IGRhdGFfcHRyYGAsIHdhbnRzIHRvCisJICogYmUgOC1ieXRlIGFsaWduZWQuICBNYWtlIHN1cmUgdGhpcyBzdHJ1Y3QgaXMgdGhlIHNhbWUgc2l6ZSB3aGVuCisJICogYnVpbHQgZm9yIDMyLWJpdC4KKwkgKi8KKwlfX3UzMiBfX3BhZDsKKworCS8qIERBVCBidWZmZXIgKi8KKwlfX3U2NCBkYXRhX3B0cjsKK307CisjZGVmaW5lIG1tY19pb2NfY21kX3NldF9kYXRhKGljLCBwdHIpIGljLmRhdGFfcHRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKSBwdHIKKworI2RlZmluZSBNTUNfSU9DX0NNRCBfSU9XUihNTUNfQkxPQ0tfTUFKT1IsIDAsIHN0cnVjdCBtbWNfaW9jX2NtZCkKKworLyoKKyAqIFNpbmNlIHRoaXMgaW9jdGwgaXMgb25seSBtZWFudCB0byBlbmhhbmNlIChhbmQgbm90IHJlcGxhY2UpIG5vcm1hbCBhY2Nlc3MKKyAqIHRvIHRoZSBtbWMgYnVzIGRldmljZSwgYW4gdXBwZXIgZGF0YSB0cmFuc2ZlciBsaW1pdCBvZiBNTUNfSU9DX01BWF9CWVRFUworICogaXMgZW5mb3JjZWQgcGVyIGlvY3RsIGNhbGwuICBGb3IgbGFyZ2VyIGRhdGEgdHJhbnNmZXJzLCB1c2UgdGhlIG5vcm1hbAorICogYmxvY2sgZGV2aWNlIG9wZXJhdGlvbnMuCisgKi8KKyNkZWZpbmUgTU1DX0lPQ19NQVhfQllURVMgICg1MTJMICogMjU2KQorI2VuZGlmIC8qIExJTlVYX01NQ19JT0NUTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21tdGltZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbW10aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NGNhYmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21tdGltZXIuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogSW50ZWwgTXVsdGltZWRpYSBUaW1lciBkZXZpY2UgaW50ZXJmYWNlCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgc2hvdWxkIGRlZmluZSBhbiBpbnRlcmZhY2UgY29tcGF0aWJsZSB3aXRoIHRoZSBJQS1QQyBNdWx0aW1lZGlhCisgKiBUaW1lcnMgRHJhZnQgU3BlY2lmaWNhdGlvbiAocmV2LiAwLjk3KSBmcm9tIEludGVsLiAgTm90ZSB0aGF0IHNvbWUKKyAqIGhhcmR3YXJlIG1heSBub3QgYmUgYWJsZSB0byBzYWZlbHkgZXhwb3J0IGl0cyByZWdpc3RlcnMgdG8gdXNlcnNwYWNlLAorICogc28gdGhlIGlvY3RsIGludGVyZmFjZSBzaG91bGQgc3VwcG9ydCBhbGwgbmVjZXNzYXJ5IGZ1bmN0aW9uYWxpdHkuCisgKgorICogMTEvMDEvMDEgLSBqYmFybmVzIC0gaW5pdGlhbCByZXZpc2lvbgorICogOS8xMC8wNCAtIENocmlzdG9waCBMYW1ldGVyIC0gcmVtb3ZlIGludGVycnVwdCBzdXBwb3J0CisgKiA5LzE3LzA0IC0gamJhcm5lcyAtIHJlbW92ZSB0ZXN0IHByb2dyYW0sIG1vdmUgc29tZSAjZGVmaW5lcyB0byB0aGUgZHJpdmVyCisgKi8KKworI2lmbmRlZiBfTElOVVhfTU1USU1FUl9ICisjZGVmaW5lIF9MSU5VWF9NTVRJTUVSX0gKKworLyoKKyAqIEJyZWFrZG93biBvZiB0aGUgaW9jdGwncyBhdmFpbGFibGUuICBBbiAnb3B0aW9uYWwnIG5leHQgdG8gdGhlIGNvbW1hbmQKKyAqIGluZGljYXRlcyB0aGF0IHN1cHBvcnRpbmcgdGhpcyBjb21tYW5kIGlzIG9wdGlvbmFsLCB3aGlsZSAncmVxdWlyZWQnCisgKiBjb21tYW5kcyBtdXN0IGJlIGltcGxlbWVudGVkIGlmIGNvbmZvcm1hbmNlIGlzIGRlc2lyZWQuCisgKgorICogTU1USU1FUl9HRVRPRkZTRVQgLSBvcHRpb25hbAorICogICBTaG91bGQgcmV0dXJuIHRoZSBvZmZzZXQgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgcGFnZSB3aGVyZSB0aGUKKyAqICAgcmVnaXN0ZXJzIGFyZSBtYXBwZWQpIGZvciB0aGUgY291bnRlciBpbiBxdWVzdGlvbi4KKyAqCisgKiBNTVRJTUVSX0dFVFJFUyAtIHJlcXVpcmVkCisgKiAgIFRoZSByZXNvbHV0aW9uIG9mIHRoZSBjbG9jayBpbiBmZW10byAoMTBeLTE1KSBzZWNvbmRzCisgKgorICogTU1USU1FUl9HRVRGUkVRIC0gcmVxdWlyZWQKKyAqICAgRnJlcXVlbmN5IG9mIHRoZSBjbG9jayBpbiBIegorICoKKyAqIE1NVElNRVJfR0VUQklUUyAtIHJlcXVpcmVkCisgKiAgIE51bWJlciBvZiBiaXRzIGluIHRoZSBjbG9jaydzIGNvdW50ZXIKKyAqCisgKiBNTVRJTUVSX01NQVBBVkFJTCAtIHJlcXVpcmVkCisgKiAgIFJldHVybnMgbm9uemVybyBpZiB0aGUgcmVnaXN0ZXJzIGNhbiBiZSBtbWFwJ2QgaW50byB1c2Vyc3BhY2UsIDAgb3RoZXJ3aXNlCisgKgorICogTU1USU1FUl9HRVRDT1VOVEVSIC0gcmVxdWlyZWQKKyAqICAgR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgY291bnRlcgorICovCisjZGVmaW5lIE1NVElNRVJfSU9DVExfQkFTRSAnbScKKworI2RlZmluZSBNTVRJTUVSX0dFVE9GRlNFVCBfSU8oTU1USU1FUl9JT0NUTF9CQVNFLCAwKQorI2RlZmluZSBNTVRJTUVSX0dFVFJFUyBfSU9SKE1NVElNRVJfSU9DVExfQkFTRSwgMSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgTU1USU1FUl9HRVRGUkVRIF9JT1IoTU1USU1FUl9JT0NUTF9CQVNFLCAyLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBNTVRJTUVSX0dFVEJJVFMgX0lPKE1NVElNRVJfSU9DVExfQkFTRSwgNCkKKyNkZWZpbmUgTU1USU1FUl9NTUFQQVZBSUwgX0lPKE1NVElNRVJfSU9DVExfQkFTRSwgNikKKyNkZWZpbmUgTU1USU1FUl9HRVRDT1VOVEVSIF9JT1IoTU1USU1FUl9JT0NUTF9CQVNFLCA5LCB1bnNpZ25lZCBsb25nKQorCisjZW5kaWYgLyogX0xJTlVYX01NVElNRVJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tcXVldWUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXF1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1YTc5NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXF1ZXVlLmgKQEAgLTAsMCArMSw1MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAzIEtyenlzenRvZiBCZW5lZHljemFrICYgTWljaGFsIFdyb25za2kKKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgSXQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0xJTlVYX01RVUVVRV9ICisjZGVmaW5lIF9MSU5VWF9NUVVFVUVfSAorCisjZGVmaW5lIE1RX1BSSU9fTUFYIAkzMjc2OAorLyogcGVyLXVpZCBsaW1pdCBvZiBrZXJuZWwgbWVtb3J5IHVzZWQgYnkgbXF1ZXVlLCBpbiBieXRlcyAqLworI2RlZmluZSBNUV9CWVRFU19NQVgJODE5MjAwCisKK3N0cnVjdCBtcV9hdHRyIHsKKwlsb25nCW1xX2ZsYWdzOwkvKiBtZXNzYWdlIHF1ZXVlIGZsYWdzCQkJKi8KKwlsb25nCW1xX21heG1zZzsJLyogbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMJCSovCisJbG9uZwltcV9tc2dzaXplOwkvKiBtYXhpbXVtIG1lc3NhZ2Ugc2l6ZQkJCSovCisJbG9uZwltcV9jdXJtc2dzOwkvKiBudW1iZXIgb2YgbWVzc2FnZXMgY3VycmVudGx5IHF1ZXVlZAkqLworCWxvbmcJX19yZXNlcnZlZFs0XTsJLyogaWdub3JlZCBmb3IgaW5wdXQsIHplcm9lZCBmb3Igb3V0cHV0ICovCit9OworCisvKgorICogU0lHRVZfVEhSRUFEIGltcGxlbWVudGF0aW9uOgorICogU0lHRVZfVEhSRUFEIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdXNlciBzcGFjZS4gSWYgU0lHRVZfVEhSRUFEIGlzIHBhc3NlZAorICogdG8gbXFfbm90aWZ5LCB0aGVuCisgKiAtIHNpZ2V2X3NpZ25vIG11c3QgYmUgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBBRl9ORVRMSU5LIHNvY2tldC4gSXQncyBub3QKKyAqICAgbmVjZXNzYXJ5IHRoYXQgdGhlIHNvY2tldCBpcyBib3VuZC4KKyAqIC0gc2lnZXZfdmFsdWUuc2l2YWxfcHRyIG11c3QgcG9pbnQgdG8gYSBjb29raWUgdGhhdCBpcyBOT1RJRllfQ09PS0lFX0xFTgorICogICBieXRlcyBsb25nLgorICogSWYgdGhlIG5vdGlmaWNhdGlvbiBpcyB0cmlnZ2VyZWQsIHRoZW4gdGhlIGNvb2tpZSBpcyBzZW50IHRvIHRoZSBuZXRsaW5rCisgKiBzb2NrZXQuIFRoZSBsYXN0IGJ5dGUgb2YgdGhlIGNvb2tpZSBpcyByZXBsYWNlZCB3aXRoIHRoZSBOT1RJRllfPz8gY29kZXM6CisgKiBOT1RJRllfV09LRU5VUCBpZiB0aGUgbm90aWZpY2F0aW9uIGdvdCB0cmlnZ2VyZWQsIE5PVElGWV9SRU1PVkVEIGlmIGl0IHdhcworICogcmVtb3ZlZCwgZWl0aGVyIGR1ZSB0byBhIGNsb3NlKCkgb24gdGhlIG1lc3NhZ2UgcXVldWUgZmQgb3IgZHVlIHRvIGEKKyAqIG1xX25vdGlmeSgpIHRoYXQgcmVtb3ZlZCB0aGUgbm90aWZpY2F0aW9uLgorICovCisjZGVmaW5lIE5PVElGWV9OT05FCTAKKyNkZWZpbmUgTk9USUZZX1dPS0VOVVAJMQorI2RlZmluZSBOT1RJRllfUkVNT1ZFRAkyCisKKyNkZWZpbmUgTk9USUZZX0NPT0tJRV9MRU4JMzIKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21yb3V0ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tcm91dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmI0MTI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tcm91dGUuaApAQCAtMCwwICsxLDE0MyBAQAorI2lmbmRlZiBfX0xJTlVYX01ST1VURV9ICisjZGVmaW5lIF9fTElOVVhfTVJPVVRFX0gKKworI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICoJQmFzZWQgb24gdGhlIE1ST1VUSU5HIDMuNSBkZWZpbmVzIHByaW1hcmlseSB0byBrZWVwCisgKglzb3VyY2UgY29tcGF0aWJpbGl0eSB3aXRoIEJTRC4KKyAqCisgKglTZWUgdGhlIG1yb3V0ZWQgY29kZSBmb3IgdGhlIG9yaWdpbmFsIGhpc3RvcnkuCisgKgorICogICAgICBQcm90b2NvbCBJbmRlcGVuZGVudCBNdWx0aWNhc3QgKFBJTSkgZGF0YSBzdHJ1Y3R1cmVzIGluY2x1ZGVkCisgKiAgICAgIENhcmxvcyBQaWNvdG8gKGNhcEBkaS5mYy51bC5wdCkKKyAqCisgKi8KKworI2RlZmluZSBNUlRfQkFTRQkyMDAKKyNkZWZpbmUgTVJUX0lOSVQJKE1SVF9CQVNFKQkvKiBBY3RpdmF0ZSB0aGUga2VybmVsIG1yb3V0ZSBjb2RlIAkqLworI2RlZmluZSBNUlRfRE9ORQkoTVJUX0JBU0UrMSkJLyogU2h1dGRvd24gdGhlIGtlcm5lbCBtcm91dGUJCSovCisjZGVmaW5lIE1SVF9BRERfVklGCShNUlRfQkFTRSsyKQkvKiBBZGQgYSB2aXJ0dWFsIGludGVyZmFjZQkJKi8KKyNkZWZpbmUgTVJUX0RFTF9WSUYJKE1SVF9CQVNFKzMpCS8qIERlbGV0ZSBhIHZpcnR1YWwgaW50ZXJmYWNlCQkqLworI2RlZmluZSBNUlRfQUREX01GQwkoTVJUX0JBU0UrNCkJLyogQWRkIGEgbXVsdGljYXN0IGZvcndhcmRpbmcgZW50cnkJKi8KKyNkZWZpbmUgTVJUX0RFTF9NRkMJKE1SVF9CQVNFKzUpCS8qIERlbGV0ZSBhIG11bHRpY2FzdCBmb3J3YXJkaW5nIGVudHJ5CSovCisjZGVmaW5lIE1SVF9WRVJTSU9OCShNUlRfQkFTRSs2KQkvKiBHZXQgdGhlIGtlcm5lbCBtdWx0aWNhc3QgdmVyc2lvbgkqLworI2RlZmluZSBNUlRfQVNTRVJUCShNUlRfQkFTRSs3KQkvKiBBY3RpdmF0ZSBQSU0gYXNzZXJ0IG1vZGUJCSovCisjZGVmaW5lIE1SVF9QSU0JCShNUlRfQkFTRSs4KQkvKiBlbmFibGUgUElNIGNvZGUJCQkqLworI2RlZmluZSBNUlRfVEFCTEUJKE1SVF9CQVNFKzkpCS8qIFNwZWNpZnkgbXJvdXRlIHRhYmxlIElECQkqLworCisjZGVmaW5lIFNJT0NHRVRWSUZDTlQJU0lPQ1BST1RPUFJJVkFURQkvKiBJUCBwcm90b2NvbCBwcml2YXRlcyAqLworI2RlZmluZSBTSU9DR0VUU0dDTlQJKFNJT0NQUk9UT1BSSVZBVEUrMSkKKyNkZWZpbmUgU0lPQ0dFVFJQRgkoU0lPQ1BST1RPUFJJVkFURSsyKQorCisjZGVmaW5lIE1BWFZJRlMJCTMyCQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHZpZmJpdG1hcF90OwkvKiBVc2VyIG1vZGUgY29kZSBkZXBlbmRzIG9uIHRoaXMgbG90ICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHZpZmlfdDsKKyNkZWZpbmUgQUxMX1ZJRlMJKCh2aWZpX3QpKC0xKSkKKworLyoKKyAqCVNhbWUgaWRlYSBhcyBzZWxlY3QKKyAqLworIAorI2RlZmluZSBWSUZNX1NFVChuLG0pCSgobSl8PSgxPDwobikpKQorI2RlZmluZSBWSUZNX0NMUihuLG0pCSgobSkmPX4oMTw8KG4pKSkKKyNkZWZpbmUgVklGTV9JU1NFVChuLG0pCSgobSkmKDE8PChuKSkpCisjZGVmaW5lIFZJRk1fQ0xSQUxMKG0pCSgobSk9MCkKKyNkZWZpbmUgVklGTV9DT1BZKG1mcm9tLG10bykJKChtdG8pPShtZnJvbSkpCisjZGVmaW5lIFZJRk1fU0FNRShtMSxtMikJKChtMSk9PShtMikpCisKKy8qCisgKglQYXNzZWQgYnkgbXJvdXRlZCBmb3IgYW4gTVJUX0FERF9WSUYgLSBhZ2FpbiB3ZSB1c2UgdGhlCisgKgltcm91dGVkIDMuNiBzdHJ1Y3R1cmVzIGZvciBjb21wYXRpYmlsaXR5CisgKi8KKyAKK3N0cnVjdCB2aWZjdGwgeworCXZpZmlfdAl2aWZjX3ZpZmk7CQkvKiBJbmRleCBvZiBWSUYgKi8KKwl1bnNpZ25lZCBjaGFyIHZpZmNfZmxhZ3M7CS8qIFZJRkZfIGZsYWdzICovCisJdW5zaWduZWQgY2hhciB2aWZjX3RocmVzaG9sZDsJLyogdHRsIGxpbWl0ICovCisJdW5zaWduZWQgaW50IHZpZmNfcmF0ZV9saW1pdDsJLyogUmF0ZSBsaW1pdGVyIHZhbHVlcyAoTkkpICovCisJdW5pb24geworCQlzdHJ1Y3QgaW5fYWRkciB2aWZjX2xjbF9hZGRyOyAgICAgLyogTG9jYWwgaW50ZXJmYWNlIGFkZHJlc3MgKi8KKwkJaW50ICAgICAgICAgICAgdmlmY19sY2xfaWZpbmRleDsgIC8qIExvY2FsIGludGVyZmFjZSBpbmRleCAgICovCisJfTsKKwlzdHJ1Y3QgaW5fYWRkciB2aWZjX3JtdF9hZGRyOwkvKiBJUElQIHR1bm5lbCBhZGRyICovCit9OworCisjZGVmaW5lIFZJRkZfVFVOTkVMCQkweDEJLyogSVBJUCB0dW5uZWwgKi8KKyNkZWZpbmUgVklGRl9TUkNSVAkJMHgyCS8qIE5JICovCisjZGVmaW5lIFZJRkZfUkVHSVNURVIJCTB4NAkvKiByZWdpc3RlciB2aWYJKi8KKyNkZWZpbmUgVklGRl9VU0VfSUZJTkRFWAkweDgJLyogdXNlIHZpZmNfbGNsX2lmaW5kZXggaW5zdGVhZCBvZgorCQkJCQkgICB2aWZjX2xjbF9hZGRyIHRvIGZpbmQgYW4gaW50ZXJmYWNlICovCisKKy8qCisgKglDYWNoZSBtYW5pcHVsYXRpb24gc3RydWN0dXJlcyBmb3IgbXJvdXRlZCBhbmQgUElNZAorICovCisgCitzdHJ1Y3QgbWZjY3RsIHsKKwlzdHJ1Y3QgaW5fYWRkciBtZmNjX29yaWdpbjsJCS8qIE9yaWdpbiBvZiBtY2FzdAkqLworCXN0cnVjdCBpbl9hZGRyIG1mY2NfbWNhc3RncnA7CQkvKiBHcm91cCBpbiBxdWVzdGlvbgkqLworCXZpZmlfdAltZmNjX3BhcmVudDsJCQkvKiBXaGVyZSBpdCBhcnJpdmVkCSovCisJdW5zaWduZWQgY2hhciBtZmNjX3R0bHNbTUFYVklGU107CS8qIFdoZXJlIGl0IGlzIGdvaW5nCSovCisJdW5zaWduZWQgaW50IG1mY2NfcGt0X2NudDsJCS8qIHBrdCBjb3VudCBmb3Igc3JjLWdycCAqLworCXVuc2lnbmVkIGludCBtZmNjX2J5dGVfY250OworCXVuc2lnbmVkIGludCBtZmNjX3dyb25nX2lmOworCWludAkgICAgIG1mY2NfZXhwaXJlOworfTsKKworLyogCisgKglHcm91cCBjb3VudCByZXRyaWV2YWwgZm9yIG1yb3V0ZWQKKyAqLworIAorc3RydWN0IHNpb2Nfc2dfcmVxIHsKKwlzdHJ1Y3QgaW5fYWRkciBzcmM7CisJc3RydWN0IGluX2FkZHIgZ3JwOworCXVuc2lnbmVkIGxvbmcgcGt0Y250OworCXVuc2lnbmVkIGxvbmcgYnl0ZWNudDsKKwl1bnNpZ25lZCBsb25nIHdyb25nX2lmOworfTsKKworLyoKKyAqCVRvIGdldCB2aWYgcGFja2V0IGNvdW50cworICovCisKK3N0cnVjdCBzaW9jX3ZpZl9yZXEgeworCXZpZmlfdAl2aWZpOwkJLyogV2hpY2ggaWZhY2UgKi8KKwl1bnNpZ25lZCBsb25nIGljb3VudDsJLyogSW4gcGFja2V0cyAqLworCXVuc2lnbmVkIGxvbmcgb2NvdW50OwkvKiBPdXQgcGFja2V0cyAqLworCXVuc2lnbmVkIGxvbmcgaWJ5dGVzOwkvKiBJbiBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgb2J5dGVzOwkvKiBPdXQgYnl0ZXMgKi8KK307CisKKy8qCisgKglUaGlzIGlzIHRoZSBmb3JtYXQgdGhlIG1yb3V0ZSBkYWVtb24gZXhwZWN0cyB0byBzZWUgSUdNUCBjb250cm9sCisgKglkYXRhLiBNYWdpY2FsbHkgaGFwcGVucyB0byBiZSBsaWtlIGFuIElQIHBhY2tldCBhcyBwZXIgdGhlIG9yaWdpbmFsCisgKi8KKyAKK3N0cnVjdCBpZ21wbXNnIHsKKwlfX3UzMiB1bnVzZWQxLHVudXNlZDI7CisJdW5zaWduZWQgY2hhciBpbV9tc2d0eXBlOwkJLyogV2hhdCBpcyB0aGlzICovCisJdW5zaWduZWQgY2hhciBpbV9tYno7CQkJLyogTXVzdCBiZSB6ZXJvICovCisJdW5zaWduZWQgY2hhciBpbV92aWY7CQkJLyogSW50ZXJmYWNlICh0aGlzIG91Z2h0IHRvIGJlIGEgdmlmaV90ISkgKi8KKwl1bnNpZ25lZCBjaGFyIHVudXNlZDM7CisJc3RydWN0IGluX2FkZHIgaW1fc3JjLGltX2RzdDsKK307CisKKy8qCisgKglUaGF0J3MgYWxsIHVzZXJtb2RlIGZvbGtzCisgKi8KKworCisKKyNkZWZpbmUgTUZDX0FTU0VSVF9USFJFU0ggKDMqSFopCQkvKiBNYXhpbWFsIGZyZXEuIG9mIGFzc2VydHMgKi8KKworLyoKKyAqCVBzZXVkbyBtZXNzYWdlcyB1c2VkIGJ5IG1yb3V0ZWQKKyAqLworCisjZGVmaW5lIElHTVBNU0dfTk9DQUNIRQkJMQkJLyogS2VybiBjYWNoZSBmaWxsIHJlcXVlc3QgdG8gbXJvdXRlZCAqLworI2RlZmluZSBJR01QTVNHX1dST05HVklGCTIJCS8qIEZvciBQSU0gYXNzZXJ0IHByb2Nlc3NpbmcgKHVudXNlZCkgKi8KKyNkZWZpbmUgSUdNUE1TR19XSE9MRVBLVAkzCQkvKiBGb3IgUElNIFJlZ2lzdGVyIHByb2Nlc3NpbmcgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXJvdXRlNi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tcm91dGU2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5MTVhNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXJvdXRlNi5oCkBAIC0wLDAgKzEsMTM1IEBACisjaWZuZGVmIF9fTElOVVhfTVJPVVRFNl9ICisjZGVmaW5lIF9fTElOVVhfTVJPVVRFNl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKworLyoKKyAqCUJhc2VkIG9uIHRoZSBNUk9VVElORyAzLjUgZGVmaW5lcyBwcmltYXJpbHkgdG8ga2VlcAorICoJc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCBCU0QuCisgKgorICoJU2VlIHRoZSBwaW02c2QgY29kZSBmb3IgdGhlIG9yaWdpbmFsIGhpc3RvcnkuCisgKgorICogICAgICBQcm90b2NvbCBJbmRlcGVuZGVudCBNdWx0aWNhc3QgKFBJTSkgZGF0YSBzdHJ1Y3R1cmVzIGluY2x1ZGVkCisgKiAgICAgIENhcmxvcyBQaWNvdG8gKGNhcEBkaS5mYy51bC5wdCkKKyAqCisgKi8KKworI2RlZmluZSBNUlQ2X0JBU0UJMjAwCisjZGVmaW5lIE1SVDZfSU5JVAkoTVJUNl9CQVNFKQkvKiBBY3RpdmF0ZSB0aGUga2VybmVsIG1yb3V0ZSBjb2RlIAkqLworI2RlZmluZSBNUlQ2X0RPTkUJKE1SVDZfQkFTRSsxKQkvKiBTaHV0ZG93biB0aGUga2VybmVsIG1yb3V0ZQkJKi8KKyNkZWZpbmUgTVJUNl9BRERfTUlGCShNUlQ2X0JBU0UrMikJLyogQWRkIGEgdmlydHVhbCBpbnRlcmZhY2UJCSovCisjZGVmaW5lIE1SVDZfREVMX01JRgkoTVJUNl9CQVNFKzMpCS8qIERlbGV0ZSBhIHZpcnR1YWwgaW50ZXJmYWNlCQkqLworI2RlZmluZSBNUlQ2X0FERF9NRkMJKE1SVDZfQkFTRSs0KQkvKiBBZGQgYSBtdWx0aWNhc3QgZm9yd2FyZGluZyBlbnRyeQkqLworI2RlZmluZSBNUlQ2X0RFTF9NRkMJKE1SVDZfQkFTRSs1KQkvKiBEZWxldGUgYSBtdWx0aWNhc3QgZm9yd2FyZGluZyBlbnRyeQkqLworI2RlZmluZSBNUlQ2X1ZFUlNJT04JKE1SVDZfQkFTRSs2KQkvKiBHZXQgdGhlIGtlcm5lbCBtdWx0aWNhc3QgdmVyc2lvbgkqLworI2RlZmluZSBNUlQ2X0FTU0VSVAkoTVJUNl9CQVNFKzcpCS8qIEFjdGl2YXRlIFBJTSBhc3NlcnQgbW9kZQkJKi8KKyNkZWZpbmUgTVJUNl9QSU0JKE1SVDZfQkFTRSs4KQkvKiBlbmFibGUgUElNIGNvZGUJCQkqLworI2RlZmluZSBNUlQ2X1RBQkxFCShNUlQ2X0JBU0UrOSkJLyogU3BlY2lmeSBtcm91dGUgdGFibGUgSUQJCSovCisKKyNkZWZpbmUgU0lPQ0dFVE1JRkNOVF9JTjYJU0lPQ1BST1RPUFJJVkFURQkvKiBJUCBwcm90b2NvbCBwcml2YXRlcyAqLworI2RlZmluZSBTSU9DR0VUU0dDTlRfSU42CShTSU9DUFJPVE9QUklWQVRFKzEpCisjZGVmaW5lIFNJT0NHRVRSUEYJKFNJT0NQUk9UT1BSSVZBVEUrMikKKworI2RlZmluZSBNQVhNSUZTCQkzMgordHlwZWRlZiB1bnNpZ25lZCBsb25nIG1pZmJpdG1hcF90OwkvKiBVc2VyIG1vZGUgY29kZSBkZXBlbmRzIG9uIHRoaXMgbG90ICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IG1pZmlfdDsKKyNkZWZpbmUgQUxMX01JRlMJKChtaWZpX3QpKC0xKSkKKworI2lmbmRlZiBJRl9TRVRTSVpFCisjZGVmaW5lIElGX1NFVFNJWkUJMjU2CisjZW5kaWYKKwordHlwZWRlZglfX3UzMgkJaWZfbWFzazsKKyNkZWZpbmUgTklGQklUUyAoc2l6ZW9mKGlmX21hc2spICogOCkgICAgICAgIC8qIGJpdHMgcGVyIG1hc2sgKi8KKworI2lmICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKERJVl9ST1VORF9VUCkKKyNkZWZpbmUJRElWX1JPVU5EX1VQKHgseSkJKCgoeCkgKyAoKHkpIC0gMSkpIC8gKHkpKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGlmX3NldCB7CisJaWZfbWFzayBpZnNfYml0c1tESVZfUk9VTkRfVVAoSUZfU0VUU0laRSwgTklGQklUUyldOworfSBpZl9zZXQ7CisKKyNkZWZpbmUgSUZfU0VUKG4sIHApICAgICgocCktPmlmc19iaXRzWyhuKS9OSUZCSVRTXSB8PSAoMSA8PCAoKG4pICUgTklGQklUUykpKQorI2RlZmluZSBJRl9DTFIobiwgcCkgICAgKChwKS0+aWZzX2JpdHNbKG4pL05JRkJJVFNdICY9IH4oMSA8PCAoKG4pICUgTklGQklUUykpKQorI2RlZmluZSBJRl9JU1NFVChuLCBwKSAgKChwKS0+aWZzX2JpdHNbKG4pL05JRkJJVFNdICYgKDEgPDwgKChuKSAlIE5JRkJJVFMpKSkKKyNkZWZpbmUgSUZfQ09QWShmLCB0KSAgIGJjb3B5KGYsIHQsIHNpemVvZigqKGYpKSkKKyNkZWZpbmUgSUZfWkVSTyhwKSAgICAgIGJ6ZXJvKHAsIHNpemVvZigqKHApKSkKKworLyoKKyAqCVBhc3NlZCBieSBtcm91dGVkIGZvciBhbiBNUlRfQUREX01JRiAtIGFnYWluIHdlIHVzZSB0aGUKKyAqCW1yb3V0ZWQgMy42IHN0cnVjdHVyZXMgZm9yIGNvbXBhdGliaWxpdHkKKyAqLworCitzdHJ1Y3QgbWlmNmN0bCB7CisJbWlmaV90CW1pZjZjX21pZmk7CQkvKiBJbmRleCBvZiBNSUYgKi8KKwl1bnNpZ25lZCBjaGFyIG1pZjZjX2ZsYWdzOwkvKiBNSUZGXyBmbGFncyAqLworCXVuc2lnbmVkIGNoYXIgdmlmY190aHJlc2hvbGQ7CS8qIHR0bCBsaW1pdCAqLworCV9fdTE2CSBtaWY2Y19waWZpOwkJLyogdGhlIGluZGV4IG9mIHRoZSBwaHlzaWNhbCBJRiAqLworCXVuc2lnbmVkIGludCB2aWZjX3JhdGVfbGltaXQ7CS8qIFJhdGUgbGltaXRlciB2YWx1ZXMgKE5JKSAqLworfTsKKworI2RlZmluZSBNSUZGX1JFR0lTVEVSCTB4MQkvKiByZWdpc3RlciB2aWYJKi8KKworLyoKKyAqCUNhY2hlIG1hbmlwdWxhdGlvbiBzdHJ1Y3R1cmVzIGZvciBtcm91dGVkIGFuZCBQSU1kCisgKi8KKworc3RydWN0IG1mNmNjdGwgeworCXN0cnVjdCBzb2NrYWRkcl9pbjYgbWY2Y2Nfb3JpZ2luOwkJLyogT3JpZ2luIG9mIG1jYXN0CSovCisJc3RydWN0IHNvY2thZGRyX2luNiBtZjZjY19tY2FzdGdycDsJCS8qIEdyb3VwIGluIHF1ZXN0aW9uCSovCisJbWlmaV90CW1mNmNjX3BhcmVudDsJCQkvKiBXaGVyZSBpdCBhcnJpdmVkCSovCisJc3RydWN0IGlmX3NldCBtZjZjY19pZnNldDsJCS8qIFdoZXJlIGl0IGlzIGdvaW5nICovCit9OworCisvKgorICoJR3JvdXAgY291bnQgcmV0cmlldmFsIGZvciBwaW02c2QKKyAqLworCitzdHJ1Y3Qgc2lvY19zZ19yZXE2IHsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNyYzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IGdycDsKKwl1bnNpZ25lZCBsb25nIHBrdGNudDsKKwl1bnNpZ25lZCBsb25nIGJ5dGVjbnQ7CisJdW5zaWduZWQgbG9uZyB3cm9uZ19pZjsKK307CisKKy8qCisgKglUbyBnZXQgdmlmIHBhY2tldCBjb3VudHMKKyAqLworCitzdHJ1Y3Qgc2lvY19taWZfcmVxNiB7CisJbWlmaV90CW1pZmk7CQkvKiBXaGljaCBpZmFjZSAqLworCXVuc2lnbmVkIGxvbmcgaWNvdW50OwkvKiBJbiBwYWNrZXRzICovCisJdW5zaWduZWQgbG9uZyBvY291bnQ7CS8qIE91dCBwYWNrZXRzICovCisJdW5zaWduZWQgbG9uZyBpYnl0ZXM7CS8qIEluIGJ5dGVzICovCisJdW5zaWduZWQgbG9uZyBvYnl0ZXM7CS8qIE91dCBieXRlcyAqLworfTsKKworLyoKKyAqCVRoYXQncyBhbGwgdXNlcm1vZGUgZm9sa3MKKyAqLworCisKKworLyoKKyAqIFN0cnVjdHVyZSB1c2VkIHRvIGNvbW11bmljYXRlIGZyb20ga2VybmVsIHRvIG11bHRpY2FzdCByb3V0ZXIuCisgKiBXZSdsbCBvdmVybGF5IHRoZSBzdHJ1Y3R1cmUgb250byBhbiBNTEQgaGVhZGVyIChub3QgYW4gSVB2NiBoZWRlciBsaWtlIGlnbXBtc2d7fQorICogdXNlZCBmb3IgSVB2NCBpbXBsZW1lbnRhdGlvbikuIFRoaXMgaXMgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSB3aWxsIGJlIHBhc3NlZCB2aWEgYW4KKyAqIElQdjYgcmF3IHNvY2tldCwgb24gd2hpY2ggYW4gYXBwbGljYXRpb24gd2lsbCBvbmx5IHJlY2VpdmVyIHRoZSBwYXlsb2FkIGkuZSB0aGUgZGF0YSBhZnRlcgorICogdGhlIElQdjYgaGVhZGVyIGFuZCBhbGwgdGhlIGV4dGVuc2lvbiBoZWFkZXJzLiAoU2VlIHNlY3Rpb24gMyBvZiBSRkMgMzU0MikKKyAqLworCitzdHJ1Y3QgbXJ0Nm1zZyB7CisjZGVmaW5lIE1SVDZNU0dfTk9DQUNIRQkJMQorI2RlZmluZSBNUlQ2TVNHX1dST05HTUlGCTIKKyNkZWZpbmUgTVJUNk1TR19XSE9MRVBLVAkzCQkvKiB1c2VkIGZvciB1c2UgbGV2ZWwgZW5jYXAgKi8KKwlfX3U4CQlpbTZfbWJ6OwkJLyogbXVzdCBiZSB6ZXJvCQkgICAqLworCV9fdTgJCWltNl9tc2d0eXBlOwkJLyogd2hhdCB0eXBlIG9mIG1lc3NhZ2UgICAgKi8KKwlfX3UxNgkJaW02X21pZjsJCS8qIG1pZiByZWMnZCBvbgkJICAgKi8KKwlfX3UzMgkJaW02X3BhZDsJCS8qIHBhZGRpbmcgZm9yIDY0IGJpdCBhcmNoICovCisJc3RydWN0IGluNl9hZGRyCWltNl9zcmMsIGltNl9kc3Q7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDY1ODQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tc2Rvc19mcy5oCkBAIC0wLDAgKzEsMTY2IEBACisjaWZuZGVmIF9MSU5VWF9NU0RPU19GU19ICisjZGVmaW5lIF9MSU5VWF9NU0RPU19GU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKgorICogVGhlIE1TLURPUyBmaWxlc3lzdGVtIGNvbnN0YW50cy9zdHJ1Y3R1cmVzCisgKi8KKworI2RlZmluZSBTRUNUT1JfU0laRQk1MTIJCS8qIHNlY3RvciBzaXplIChieXRlcykgKi8KKyNkZWZpbmUgU0VDVE9SX0JJVFMJOQkJLyogbG9nMihTRUNUT1JfU0laRSkgKi8KKyNkZWZpbmUgTVNET1NfRFBCCShNU0RPU19EUFMpCS8qIGRpciBlbnRyaWVzIHBlciBibG9jayAqLworI2RlZmluZSBNU0RPU19EUEJfQklUUwk0CQkvKiBsb2cyKE1TRE9TX0RQQikgKi8KKyNkZWZpbmUgTVNET1NfRFBTCShTRUNUT1JfU0laRSAvIHNpemVvZihzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5KSkKKyNkZWZpbmUgTVNET1NfRFBTX0JJVFMJNAkJLyogbG9nMihNU0RPU19EUFMpICovCisjZGVmaW5lIE1TRE9TX0xPTkdOQU1FCTI1NgkJLyogbWF4aW11bSBuYW1lIGxlbmd0aCAqLworI2RlZmluZSBDRl9MRV9XKHYpCWxlMTZfdG9fY3B1KHYpCisjZGVmaW5lIENGX0xFX0wodikJbGUzMl90b19jcHUodikKKyNkZWZpbmUgQ1RfTEVfVyh2KQljcHVfdG9fbGUxNih2KQorI2RlZmluZSBDVF9MRV9MKHYpCWNwdV90b19sZTMyKHYpCisKKworI2RlZmluZSBNU0RPU19ST09UX0lOTwkxCS8qID09IE1JTklYX1JPT1RfSU5PICovCisjZGVmaW5lIE1TRE9TX0RJUl9CSVRTCTUJLyogbG9nMihzaXplb2Yoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSkpICovCisKKy8qIGRpcmVjdG9yeSBsaW1pdCAqLworI2RlZmluZSBGQVRfTUFYX0RJUl9FTlRSSUVTCSg2NTUzNikKKyNkZWZpbmUgRkFUX01BWF9ESVJfU0laRQkoRkFUX01BWF9ESVJfRU5UUklFUyA8PCBNU0RPU19ESVJfQklUUykKKworI2RlZmluZSBBVFRSX05PTkUJMAkvKiBubyBhdHRyaWJ1dGUgYml0cyAqLworI2RlZmluZSBBVFRSX1JPCQkxCS8qIHJlYWQtb25seSAqLworI2RlZmluZSBBVFRSX0hJRERFTgkyCS8qIGhpZGRlbiAqLworI2RlZmluZSBBVFRSX1NZUwk0CS8qIHN5c3RlbSAqLworI2RlZmluZSBBVFRSX1ZPTFVNRQk4CS8qIHZvbHVtZSBsYWJlbCAqLworI2RlZmluZSBBVFRSX0RJUgkxNgkvKiBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgQVRUUl9BUkNICTMyCS8qIGFyY2hpdmVkICovCisKKy8qIGF0dHJpYnV0ZSBiaXRzIHRoYXQgYXJlIGNvcGllZCAiYXMgaXMiICovCisjZGVmaW5lIEFUVFJfVU5VU0VECShBVFRSX1ZPTFVNRSB8IEFUVFJfQVJDSCB8IEFUVFJfU1lTIHwgQVRUUl9ISURERU4pCisvKiBiaXRzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIFdpbmRvd3MgOTUvV2luZG93cyBOVCBleHRlbmRlZCBGQVQgKi8KKyNkZWZpbmUgQVRUUl9FWFQJKEFUVFJfUk8gfCBBVFRSX0hJRERFTiB8IEFUVFJfU1lTIHwgQVRUUl9WT0xVTUUpCisKKyNkZWZpbmUgQ0FTRV9MT1dFUl9CQVNFCTgJLyogYmFzZSBpcyBsb3dlciBjYXNlICovCisjZGVmaW5lIENBU0VfTE9XRVJfRVhUCTE2CS8qIGV4dGVuc2lvbiBpcyBsb3dlciBjYXNlICovCisKKyNkZWZpbmUgREVMRVRFRF9GTEFHCTB4ZTUJLyogbWFya3MgZmlsZSBhcyBkZWxldGVkIHdoZW4gaW4gbmFtZVswXSAqLworI2RlZmluZSBJU19GUkVFKG4pCSghKihuKSB8fCAqKG4pID09IERFTEVURURfRkxBRykKKworI2RlZmluZSBGQVRfTEZOX0xFTgkyNTUJLyogbWF4aW11bSBsb25nIG5hbWUgbGVuZ3RoICovCisjZGVmaW5lIE1TRE9TX05BTUUJMTEJLyogbWF4aW11bSBuYW1lIGxlbmd0aCAqLworI2RlZmluZSBNU0RPU19TTE9UUwkyMQkvKiBtYXggIyBvZiBzbG90cyBmb3Igc2hvcnQgYW5kIGxvbmcgbmFtZXMgKi8KKyNkZWZpbmUgTVNET1NfRE9UCSIuICAgICAgICAgICIJLyogIi4iLCBwYWRkZWQgdG8gTVNET1NfTkFNRSBjaGFycyAqLworI2RlZmluZSBNU0RPU19ET1RET1QJIi4uICAgICAgICAgIgkvKiAiLi4iLCBwYWRkZWQgdG8gTVNET1NfTkFNRSBjaGFycyAqLworCisjZGVmaW5lIEZBVF9GSVJTVF9FTlQocywgeCkJKChNU0RPU19TQihzKS0+ZmF0X2JpdHMgPT0gMzIgPyAweDBGRkZGRjAwIDogXAorCU1TRE9TX1NCKHMpLT5mYXRfYml0cyA9PSAxNiA/IDB4RkYwMCA6IDB4RjAwKSB8ICh4KSkKKworLyogc3RhcnQgb2YgZGF0YSBjbHVzdGVyJ3MgZW50cnkgKG51bWJlciBvZiByZXNlcnZlZCBjbHVzdGVycykgKi8KKyNkZWZpbmUgRkFUX1NUQVJUX0VOVAkyCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIGNsdXN0ZXJzICovCisjZGVmaW5lIE1BWF9GQVQxMgkweEZGNAorI2RlZmluZSBNQVhfRkFUMTYJMHhGRkY0CisjZGVmaW5lIE1BWF9GQVQzMgkweDBGRkZGRkY2CisjZGVmaW5lIE1BWF9GQVQocykJKE1TRE9TX1NCKHMpLT5mYXRfYml0cyA9PSAzMiA/IE1BWF9GQVQzMiA6IFwKKwlNU0RPU19TQihzKS0+ZmF0X2JpdHMgPT0gMTYgPyBNQVhfRkFUMTYgOiBNQVhfRkFUMTIpCisKKy8qIGJhZCBjbHVzdGVyIG1hcmsgKi8KKyNkZWZpbmUgQkFEX0ZBVDEyCTB4RkY3CisjZGVmaW5lIEJBRF9GQVQxNgkweEZGRjcKKyNkZWZpbmUgQkFEX0ZBVDMyCTB4MEZGRkZGRjcKKworLyogc3RhbmRhcmQgRU9GICovCisjZGVmaW5lIEVPRl9GQVQxMgkweEZGRgorI2RlZmluZSBFT0ZfRkFUMTYJMHhGRkZGCisjZGVmaW5lIEVPRl9GQVQzMgkweDBGRkZGRkZGCisKKyNkZWZpbmUgRkFUX0VOVF9GUkVFCSgwKQorI2RlZmluZSBGQVRfRU5UX0JBRAkoQkFEX0ZBVDMyKQorI2RlZmluZSBGQVRfRU5UX0VPRgkoRU9GX0ZBVDMyKQorCisjZGVmaW5lIEZBVF9GU0lORk9fU0lHMQkweDQxNjE1MjUyCisjZGVmaW5lIEZBVF9GU0lORk9fU0lHMgkweDYxNDE3MjcyCisjZGVmaW5lIElTX0ZTSU5GTyh4KQkobGUzMl90b19jcHUoKHgpLT5zaWduYXR1cmUxKSA9PSBGQVRfRlNJTkZPX1NJRzEgXAorCQkJICYmIGxlMzJfdG9fY3B1KCh4KS0+c2lnbmF0dXJlMikgPT0gRkFUX0ZTSU5GT19TSUcyKQorCitzdHJ1Y3QgX19mYXRfZGlyZW50IHsKKwlsb25nCQlkX2lubzsKKwlfX2tlcm5lbF9vZmZfdAlkX29mZjsKKwl1bnNpZ25lZCBzaG9ydAlkX3JlY2xlbjsKKwljaGFyCQlkX25hbWVbMjU2XTsgLyogV2UgbXVzdCBub3QgaW5jbHVkZSBsaW1pdHMuaCEgKi8KK307CisKKy8qCisgKiBpb2N0bCBjb21tYW5kcworICovCisjZGVmaW5lIFZGQVRfSU9DVExfUkVBRERJUl9CT1RICQlfSU9SKCdyJywgMSwgc3RydWN0IF9fZmF0X2RpcmVudFsyXSkKKyNkZWZpbmUgVkZBVF9JT0NUTF9SRUFERElSX1NIT1JUCV9JT1IoJ3InLCAyLCBzdHJ1Y3QgX19mYXRfZGlyZW50WzJdKQorLyogPGxpbnV4L3ZpZGVvdGV4dC5oPiBoYXMgdXNlZCAweDcyICgncicpIGluIGNvbGxpc2lvbiwgc28gc2tpcCBhIGZldyAqLworI2RlZmluZSBGQVRfSU9DVExfR0VUX0FUVFJJQlVURVMJX0lPUigncicsIDB4MTAsIF9fdTMyKQorI2RlZmluZSBGQVRfSU9DVExfU0VUX0FUVFJJQlVURVMJX0lPVygncicsIDB4MTEsIF9fdTMyKQorCitzdHJ1Y3QgZmF0X2Jvb3Rfc2VjdG9yIHsKKwlfX3U4CWlnbm9yZWRbM107CS8qIEJvb3Qgc3RyYXAgc2hvcnQgb3IgbmVhciBqdW1wICovCisJX191OAlzeXN0ZW1faWRbOF07CS8qIE5hbWUgLSBjYW4gYmUgdXNlZCB0byBzcGVjaWFsIGNhc2UKKwkJCQkgICBwYXJ0aXRpb24gbWFuYWdlciB2b2x1bWVzICovCisJX191OAlzZWN0b3Jfc2l6ZVsyXTsJLyogYnl0ZXMgcGVyIGxvZ2ljYWwgc2VjdG9yICovCisJX191OAlzZWNfcGVyX2NsdXM7CS8qIHNlY3RvcnMvY2x1c3RlciAqLworCV9fbGUxNglyZXNlcnZlZDsJLyogcmVzZXJ2ZWQgc2VjdG9ycyAqLworCV9fdTgJZmF0czsJCS8qIG51bWJlciBvZiBGQVRzICovCisJX191OAlkaXJfZW50cmllc1syXTsJLyogcm9vdCBkaXJlY3RvcnkgZW50cmllcyAqLworCV9fdTgJc2VjdG9yc1syXTsJLyogbnVtYmVyIG9mIHNlY3RvcnMgKi8KKwlfX3U4CW1lZGlhOwkJLyogbWVkaWEgY29kZSAqLworCV9fbGUxNglmYXRfbGVuZ3RoOwkvKiBzZWN0b3JzL0ZBVCAqLworCV9fbGUxNglzZWNzX3RyYWNrOwkvKiBzZWN0b3JzIHBlciB0cmFjayAqLworCV9fbGUxNgloZWFkczsJCS8qIG51bWJlciBvZiBoZWFkcyAqLworCV9fbGUzMgloaWRkZW47CQkvKiBoaWRkZW4gc2VjdG9ycyAodW51c2VkKSAqLworCV9fbGUzMgl0b3RhbF9zZWN0OwkvKiBudW1iZXIgb2Ygc2VjdG9ycyAoaWYgc2VjdG9ycyA9PSAwKSAqLworCisJLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG9ubHkgdXNlZCBieSBGQVQzMiAqLworCV9fbGUzMglmYXQzMl9sZW5ndGg7CS8qIHNlY3RvcnMvRkFUICovCisJX19sZTE2CWZsYWdzOwkJLyogYml0IDg6IGZhdCBtaXJyb3JpbmcsIGxvdyA0OiBhY3RpdmUgZmF0ICovCisJX191OAl2ZXJzaW9uWzJdOwkvKiBtYWpvciwgbWlub3IgZmlsZXN5c3RlbSB2ZXJzaW9uICovCisJX19sZTMyCXJvb3RfY2x1c3RlcjsJLyogZmlyc3QgY2x1c3RlciBpbiByb290IGRpcmVjdG9yeSAqLworCV9fbGUxNglpbmZvX3NlY3RvcjsJLyogZmlsZXN5c3RlbSBpbmZvIHNlY3RvciAqLworCV9fbGUxNgliYWNrdXBfYm9vdDsJLyogYmFja3VwIGJvb3Qgc2VjdG9yICovCisJX19sZTE2CXJlc2VydmVkMls2XTsJLyogVW51c2VkICovCit9OworCitzdHJ1Y3QgZmF0X2Jvb3RfZnNpbmZvIHsKKwlfX2xlMzIgICBzaWduYXR1cmUxOwkvKiAweDQxNjE1MjUyTCAqLworCV9fbGUzMiAgIHJlc2VydmVkMVsxMjBdOwkvKiBOb3RoaW5nIGFzIGZhciBhcyBJIGNhbiB0ZWxsICovCisJX19sZTMyICAgc2lnbmF0dXJlMjsJLyogMHg2MTQxNzI3MkwgKi8KKwlfX2xlMzIgICBmcmVlX2NsdXN0ZXJzOwkvKiBGcmVlIGNsdXN0ZXIgY291bnQuICAtMSBpZiB1bmtub3duICovCisJX19sZTMyICAgbmV4dF9jbHVzdGVyOwkvKiBNb3N0IHJlY2VudGx5IGFsbG9jYXRlZCBjbHVzdGVyICovCisJX19sZTMyICAgcmVzZXJ2ZWQyWzRdOworfTsKKworc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSB7CisJX191OAluYW1lW01TRE9TX05BTUVdOy8qIG5hbWUgYW5kIGV4dGVuc2lvbiAqLworCV9fdTgJYXR0cjsJCS8qIGF0dHJpYnV0ZSBiaXRzICovCisJX191OCAgICBsY2FzZTsJCS8qIENhc2UgZm9yIGJhc2UgYW5kIGV4dGVuc2lvbiAqLworCV9fdTgJY3RpbWVfY3M7CS8qIENyZWF0aW9uIHRpbWUsIGNlbnRpc2Vjb25kcyAoMC0xOTkpICovCisJX19sZTE2CWN0aW1lOwkJLyogQ3JlYXRpb24gdGltZSAqLworCV9fbGUxNgljZGF0ZTsJCS8qIENyZWF0aW9uIGRhdGUgKi8KKwlfX2xlMTYJYWRhdGU7CQkvKiBMYXN0IGFjY2VzcyBkYXRlICovCisJX19sZTE2CXN0YXJ0aGk7CS8qIEhpZ2ggMTYgYml0cyBvZiBjbHVzdGVyIGluIEZBVDMyICovCisJX19sZTE2CXRpbWUsZGF0ZSxzdGFydDsvKiB0aW1lLCBkYXRlIGFuZCBmaXJzdCBjbHVzdGVyICovCisJX19sZTMyCXNpemU7CQkvKiBmaWxlIHNpemUgKGluIGJ5dGVzKSAqLworfTsKKworLyogVXAgdG8gMTMgY2hhcmFjdGVycyBvZiB0aGUgbmFtZSAqLworc3RydWN0IG1zZG9zX2Rpcl9zbG90IHsKKwlfX3U4ICAgIGlkOwkJLyogc2VxdWVuY2UgbnVtYmVyIGZvciBzbG90ICovCisJX191OCAgICBuYW1lMF80WzEwXTsJLyogZmlyc3QgNSBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KKwlfX3U4ICAgIGF0dHI7CQkvKiBhdHRyaWJ1dGUgYnl0ZSAqLworCV9fdTggICAgcmVzZXJ2ZWQ7CS8qIGFsd2F5cyAwICovCisJX191OCAgICBhbGlhc19jaGVja3N1bTsJLyogY2hlY2tzdW0gZm9yIDguMyBhbGlhcyAqLworCV9fdTggICAgbmFtZTVfMTBbMTJdOwkvKiA2IG1vcmUgY2hhcmFjdGVycyBpbiBuYW1lICovCisJX19sZTE2ICAgc3RhcnQ7CQkvKiBzdGFydGluZyBjbHVzdGVyIG51bWJlciwgMCBpbiBsb25nIHNsb3RzICovCisJX191OCAgICBuYW1lMTFfMTJbNF07CS8qIGxhc3QgMiBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KK307CisKKyNlbmRpZiAvKiAhX0xJTlVYX01TRE9TX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXNnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjhlMzAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21zZy5oCkBAIC0wLDAgKzEsNzUgQEAKKyNpZm5kZWYgX0xJTlVYX01TR19ICisjZGVmaW5lIF9MSU5VWF9NU0dfSAorCisjaW5jbHVkZSA8bGludXgvaXBjLmg+CisKKy8qIGlwY3MgY3RsIGNvbW1hbmRzICovCisjZGVmaW5lIE1TR19TVEFUIDExCisjZGVmaW5lIE1TR19JTkZPIDEyCisKKy8qIG1zZ3JjdiBvcHRpb25zICovCisjZGVmaW5lIE1TR19OT0VSUk9SICAgICAwMTAwMDAgIC8qIG5vIGVycm9yIGlmIG1lc3NhZ2UgaXMgdG9vIGJpZyAqLworI2RlZmluZSBNU0dfRVhDRVBUICAgICAgMDIwMDAwICAvKiByZWN2IGFueSBtc2cgZXhjZXB0IG9mIHNwZWNpZmllZCB0eXBlLiovCisKKy8qIE9ic29sZXRlLCB1c2VkIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBsaWJjNSBjb21waWxlcyAqLworc3RydWN0IG1zcWlkX2RzIHsKKwlzdHJ1Y3QgaXBjX3Blcm0gbXNnX3Blcm07CisJc3RydWN0IG1zZyAqbXNnX2ZpcnN0OwkJLyogZmlyc3QgbWVzc2FnZSBvbiBxdWV1ZSx1bnVzZWQgICovCisJc3RydWN0IG1zZyAqbXNnX2xhc3Q7CQkvKiBsYXN0IG1lc3NhZ2UgaW4gcXVldWUsdW51c2VkICovCisJX19rZXJuZWxfdGltZV90IG1zZ19zdGltZTsJLyogbGFzdCBtc2dzbmQgdGltZSAqLworCV9fa2VybmVsX3RpbWVfdCBtc2dfcnRpbWU7CS8qIGxhc3QgbXNncmN2IHRpbWUgKi8KKwlfX2tlcm5lbF90aW1lX3QgbXNnX2N0aW1lOwkvKiBsYXN0IGNoYW5nZSB0aW1lICovCisJdW5zaWduZWQgbG9uZyAgbXNnX2xjYnl0ZXM7CS8qIFJldXNlIGp1bmsgZmllbGRzIGZvciAzMiBiaXQgKi8KKwl1bnNpZ25lZCBsb25nICBtc2dfbHFieXRlczsJLyogZGl0dG8gKi8KKwl1bnNpZ25lZCBzaG9ydCBtc2dfY2J5dGVzOwkvKiBjdXJyZW50IG51bWJlciBvZiBieXRlcyBvbiBxdWV1ZSAqLworCXVuc2lnbmVkIHNob3J0IG1zZ19xbnVtOwkvKiBudW1iZXIgb2YgbWVzc2FnZXMgaW4gcXVldWUgKi8KKwl1bnNpZ25lZCBzaG9ydCBtc2dfcWJ5dGVzOwkvKiBtYXggbnVtYmVyIG9mIGJ5dGVzIG9uIHF1ZXVlICovCisJX19rZXJuZWxfaXBjX3BpZF90IG1zZ19sc3BpZDsJLyogcGlkIG9mIGxhc3QgbXNnc25kICovCisJX19rZXJuZWxfaXBjX3BpZF90IG1zZ19scnBpZDsJLyogbGFzdCByZWNlaXZlIHBpZCAqLworfTsKKworLyogSW5jbHVkZSB0aGUgZGVmaW5pdGlvbiBvZiBtc3FpZDY0X2RzICovCisjaW5jbHVkZSA8YXNtL21zZ2J1Zi5oPgorCisvKiBtZXNzYWdlIGJ1ZmZlciBmb3IgbXNnc25kIGFuZCBtc2dyY3YgY2FsbHMgKi8KK3N0cnVjdCBtc2didWYgeworCWxvbmcgbXR5cGU7ICAgICAgICAgLyogdHlwZSBvZiBtZXNzYWdlICovCisJY2hhciBtdGV4dFsxXTsgICAgICAvKiBtZXNzYWdlIHRleHQgKi8KK307CisKKy8qIGJ1ZmZlciBmb3IgbXNnY3RsIGNhbGxzIElQQ19JTkZPLCBNU0dfSU5GTyAqLworc3RydWN0IG1zZ2luZm8geworCWludCBtc2dwb29sOworCWludCBtc2dtYXA7IAorCWludCBtc2dtYXg7IAorCWludCBtc2dtbmI7IAorCWludCBtc2dtbmk7IAorCWludCBtc2dzc3o7IAorCWludCBtc2d0cWw7IAorCXVuc2lnbmVkIHNob3J0ICBtc2dzZWc7IAorfTsKKworLyoKKyAqIFNjYWxpbmcgZmFjdG9yIHRvIGNvbXB1dGUgbXNnbW5pOgorICogdGhlIG1lbW9yeSBkZWRpY2F0ZWQgdG8gbXNnIHF1ZXVlcyAobXNnbW5pICogbXNnbW5iKSBzaG91bGQgb2NjdXB5CisgKiBhdCBtb3N0IDEvTVNHX01FTV9TQ0FMRSBvZiB0aGUgbG93bWVtIChzZWUgdGhlIGZvcm11bGEgaW4gaXBjL21zZy5jKToKKyAqIHVwIHRvIDhNQiAgICAgICA6IG1zZ21uaSA9IDE2IChNU0dNTkkpCisgKiA0IEdCICAgICAgICAgICAgOiBtc2dtbmkgPSA4SworICogbW9yZSB0aGFuIDE2IEdCIDogbXNnbW5pID0gMzJLIChJUENNTkkpCisgKi8KKyNkZWZpbmUgTVNHX01FTV9TQ0FMRSAzMgorCisjZGVmaW5lIE1TR01OSSAgICAxNiAgIC8qIDw9IElQQ01OSSAqLyAgICAgLyogbWF4ICMgb2YgbXNnIHF1ZXVlIGlkZW50aWZpZXJzICovCisjZGVmaW5lIE1TR01BWCAgODE5MiAgIC8qIDw9IElOVF9NQVggKi8gICAvKiBtYXggc2l6ZSBvZiBtZXNzYWdlIChieXRlcykgKi8KKyNkZWZpbmUgTVNHTU5CIDE2Mzg0ICAgLyogPD0gSU5UX01BWCAqLyAgIC8qIGRlZmF1bHQgbWF4IHNpemUgb2YgYSBtZXNzYWdlIHF1ZXVlICovCisKKy8qIHVudXNlZCAqLworI2RlZmluZSBNU0dQT09MIChNU0dNTkkgKiBNU0dNTkIgLyAxMDI0KSAvKiBzaXplIGluIGtieXRlcyBvZiBtZXNzYWdlIHBvb2wgKi8KKyNkZWZpbmUgTVNHVFFMICBNU0dNTkIgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3lzdGVtIG1lc3NhZ2UgaGVhZGVycyAqLworI2RlZmluZSBNU0dNQVAgIE1TR01OQiAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIG1lc3NhZ2UgbWFwICovCisjZGVmaW5lIE1TR1NTWiAgMTYgICAgICAgICAgICAgICAgLyogbWVzc2FnZSBzZWdtZW50IHNpemUgKi8KKyNkZWZpbmUgX19NU0dTRUcgKChNU0dQT09MICogMTAyNCkgLyBNU0dTU1opIC8qIG1heCBuby4gb2Ygc2VnbWVudHMgKi8KKyNkZWZpbmUgTVNHU0VHIChfX01TR1NFRyA8PSAweGZmZmYgPyBfX01TR1NFRyA6IDB4ZmZmZikKKworCisjZW5kaWYgLyogX0xJTlVYX01TR19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L210aW8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmODI1NzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L210aW8uaApAQCAtMCwwICsxLDIwNyBAQAorLyogCisgKiBsaW51eC9tdGlvLmggaGVhZGVyIGZpbGUgZm9yIExpbnV4LiBXcml0dGVuIGJ5IEguIEJlcmdtYW4KKyAqCisgKiBNb2RpZmllZCBmb3Igc3BlY2lhbCBpb2N0bHMgcHJvdmlkZWQgYnkgemZ0YXBlIGluIFNlcHRlbWJlciAxOTk3CisgKiBieSBDLi1KLiBIZWluZS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9NVElPX0gKKyNkZWZpbmUgX0xJTlVYX01USU9fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisvKgorICogU3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIG1hZyB0YXBlIGlvIGNvbnRyb2wgY29tbWFuZHMKKyAqLworCisvKiBzdHJ1Y3R1cmUgZm9yIE1USU9DVE9QIC0gbWFnIHRhcGUgb3AgY29tbWFuZCAqLworc3RydWN0CW10b3AgeworCXNob3J0CW10X29wOwkJLyogb3BlcmF0aW9ucyBkZWZpbmVkIGJlbG93ICovCisJaW50CW10X2NvdW50OwkvKiBob3cgbWFueSBvZiB0aGVtICovCit9OworCisvKiBNYWduZXRpYyBUYXBlIG9wZXJhdGlvbnMgW05vdCBhbGwgb3BlcmF0aW9ucyBzdXBwb3J0ZWQgYnkgYWxsIGRyaXZlcnNdOiAqLworI2RlZmluZSBNVFJFU0VUIDAJLyogK3Jlc2V0IGRyaXZlIGluIGNhc2Ugb2YgcHJvYmxlbXMgKi8KKyNkZWZpbmUgTVRGU0YJMQkvKiBmb3J3YXJkIHNwYWNlIG92ZXIgRmlsZU1hcmssCisJCQkgKiBwb3NpdGlvbiBhdCBmaXJzdCByZWNvcmQgb2YgbmV4dCBmaWxlIAorCQkJICovCisjZGVmaW5lIE1UQlNGCTIJLyogYmFja3dhcmQgc3BhY2UgRmlsZU1hcmsgKHBvc2l0aW9uIGJlZm9yZSBGTSkgKi8KKyNkZWZpbmUgTVRGU1IJMwkvKiBmb3J3YXJkIHNwYWNlIHJlY29yZCAqLworI2RlZmluZSBNVEJTUgk0CS8qIGJhY2t3YXJkIHNwYWNlIHJlY29yZCAqLworI2RlZmluZSBNVFdFT0YJNQkvKiB3cml0ZSBhbiBlbmQtb2YtZmlsZSByZWNvcmQgKG1hcmspICovCisjZGVmaW5lIE1UUkVXCTYJLyogcmV3aW5kICovCisjZGVmaW5lIE1UT0ZGTAk3CS8qIHJld2luZCBhbmQgcHV0IHRoZSBkcml2ZSBvZmZsaW5lIChlamVjdD8pICovCisjZGVmaW5lIE1UTk9QCTgJLyogbm8gb3AsIHNldCBzdGF0dXMgb25seSAocmVhZCB3aXRoIE1USU9DR0VUKSAqLworI2RlZmluZSBNVFJFVEVOIDkJLyogcmV0ZW5zaW9uIHRhcGUgKi8KKyNkZWZpbmUgTVRCU0ZNCTEwCS8qICtiYWNrd2FyZCBzcGFjZSBGaWxlTWFyaywgcG9zaXRpb24gYXQgRk0gKi8KKyNkZWZpbmUgTVRGU0ZNICAxMQkvKiArZm9yd2FyZCBzcGFjZSBGaWxlTWFyaywgcG9zaXRpb24gYXQgRk0gKi8KKyNkZWZpbmUgTVRFT00JMTIJLyogZ290byBlbmQgb2YgcmVjb3JkZWQgbWVkaWEgKGZvciBhcHBlbmRpbmcgZmlsZXMpLgorCQkJICogTVRFT00gcG9zaXRpb25zIGFmdGVyIHRoZSBsYXN0IEZNLCByZWFkeSBmb3IKKwkJCSAqIGFwcGVuZGluZyBhbm90aGVyIGZpbGUuCisJCQkgKi8KKyNkZWZpbmUgTVRFUkFTRSAxMwkvKiBlcmFzZSB0YXBlIC0tIGJlIGNhcmVmdWwhICovCisKKyNkZWZpbmUgTVRSQVMxICAxNAkvKiBydW4gc2VsZiB0ZXN0IDEgKG5vbmRlc3RydWN0aXZlKSAqLworI2RlZmluZSBNVFJBUzIJMTUJLyogcnVuIHNlbGYgdGVzdCAyIChkZXN0cnVjdGl2ZSkgKi8KKyNkZWZpbmUgTVRSQVMzICAxNgkvKiByZXNlcnZlZCBmb3Igc2VsZiB0ZXN0IDMgKi8KKworI2RlZmluZSBNVFNFVEJMSyAyMAkvKiBzZXQgYmxvY2sgbGVuZ3RoIChTQ1NJKSAqLworI2RlZmluZSBNVFNFVERFTlNJVFkgMjEJLyogc2V0IHRhcGUgZGVuc2l0eSAoU0NTSSkgKi8KKyNkZWZpbmUgTVRTRUVLCTIyCS8qIHNlZWsgdG8gYmxvY2sgKFRhbmRiZXJnLCBldGMuKSAqLworI2RlZmluZSBNVFRFTEwJMjMJLyogdGVsbCBibG9jayAoVGFuZGJlcmcsIGV0Yy4pICovCisjZGVmaW5lIE1UU0VURFJWQlVGRkVSIDI0IC8qIHNldCB0aGUgZHJpdmUgYnVmZmVyaW5nIGFjY29yZGluZyB0byBTQ1NJLTIgKi8KKwkJCS8qIG9yZGluYXJ5IGJ1ZmZlcmVkIG9wZXJhdGlvbiB3aXRoIGNvZGUgMSAqLworI2RlZmluZSBNVEZTUwkyNQkvKiBzcGFjZSBmb3J3YXJkIG92ZXIgc2V0bWFya3MgKi8KKyNkZWZpbmUgTVRCU1MJMjYJLyogc3BhY2UgYmFja3dhcmQgb3ZlciBzZXRtYXJrcyAqLworI2RlZmluZSBNVFdTTQkyNwkvKiB3cml0ZSBzZXRtYXJrcyAqLworCisjZGVmaW5lIE1UTE9DSyAgMjgJLyogbG9jayB0aGUgZHJpdmUgZG9vciAqLworI2RlZmluZSBNVFVOTE9DSyAyOQkvKiB1bmxvY2sgdGhlIGRyaXZlIGRvb3IgKi8KKyNkZWZpbmUgTVRMT0FEICAzMAkvKiBleGVjdXRlIHRoZSBTQ1NJIGxvYWQgY29tbWFuZCAqLworI2RlZmluZSBNVFVOTE9BRCAzMQkvKiBleGVjdXRlIHRoZSBTQ1NJIHVubG9hZCBjb21tYW5kICovCisjZGVmaW5lIE1UQ09NUFJFU1NJT04gMzIvKiBjb250cm9sIGNvbXByZXNzaW9uIHdpdGggU0NTSSBtb2RlIHBhZ2UgMTUgKi8KKyNkZWZpbmUgTVRTRVRQQVJUIDMzCS8qIENoYW5nZSB0aGUgYWN0aXZlIHRhcGUgcGFydGl0aW9uICovCisjZGVmaW5lIE1UTUtQQVJUICAzNAkvKiBGb3JtYXQgdGhlIHRhcGUgd2l0aCBvbmUgb3IgdHdvIHBhcnRpdGlvbnMgKi8KKyNkZWZpbmUgTVRXRU9GSQkzNQkvKiB3cml0ZSBhbiBlbmQtb2YtZmlsZSByZWNvcmQgKG1hcmspIGluIGltbWVkaWF0ZSBtb2RlICovCisKKy8qIHN0cnVjdHVyZSBmb3IgTVRJT0NHRVQgLSBtYWcgdGFwZSBnZXQgc3RhdHVzIGNvbW1hbmQgKi8KKworc3RydWN0CW10Z2V0IHsKKwlsb25nCW10X3R5cGU7CS8qIHR5cGUgb2YgbWFndGFwZSBkZXZpY2UgKi8KKwlsb25nCW10X3Jlc2lkOwkvKiByZXNpZHVhbCBjb3VudDogKG5vdCBzdXJlKQorCQkJCSAqCW51bWJlciBvZiBieXRlcyBpZ25vcmVkLCBvcgorCQkJCSAqCW51bWJlciBvZiBmaWxlcyBub3Qgc2tpcHBlZCwgb3IKKwkJCQkgKgludW1iZXIgb2YgcmVjb3JkcyBub3Qgc2tpcHBlZC4KKwkJCQkgKi8KKwkvKiB0aGUgZm9sbG93aW5nIHJlZ2lzdGVycyBhcmUgZGV2aWNlIGRlcGVuZGVudCAqLworCWxvbmcJbXRfZHNyZWc7CS8qIHN0YXR1cyByZWdpc3RlciAqLworCWxvbmcJbXRfZ3N0YXQ7CS8qIGdlbmVyaWMgKGRldmljZSBpbmRlcGVuZGVudCkgc3RhdHVzICovCisJbG9uZwltdF9lcnJlZzsJLyogZXJyb3IgcmVnaXN0ZXIgKi8KKwkvKiBUaGUgbmV4dCB0d28gZmllbGRzIGFyZSBub3QgYWx3YXlzIHVzZWQgKi8KKwlfX2tlcm5lbF9kYWRkcl90IG10X2ZpbGVubzsJLyogbnVtYmVyIG9mIGN1cnJlbnQgZmlsZSBvbiB0YXBlICovCisJX19rZXJuZWxfZGFkZHJfdCBtdF9ibGtubzsJLyogY3VycmVudCBibG9jayBudW1iZXIgKi8KK307CisKKworCisvKgorICogQ29uc3RhbnRzIGZvciBtdF90eXBlLiBOb3QgYWxsIG9mIHRoZXNlIGFyZSBzdXBwb3J0ZWQsCisgKiBhbmQgdGhlc2UgYXJlIG5vdCBhbGwgb2YgdGhlIG9uZXMgdGhhdCBhcmUgc3VwcG9ydGVkLgorICovCisjZGVmaW5lIE1UX0lTVU5LTk9XTgkJMHgwMQorI2RlZmluZSBNVF9JU1FJQzAyCQkweDAyCS8qIEdlbmVyaWMgUUlDLTAyIHRhcGUgc3RyZWFtZXIgKi8KKyNkZWZpbmUgTVRfSVNXVDUxNTAJCTB4MDMJLyogV2FuZ3RlayA1MTUwRVEsIFFJQy0xNTAsIFFJQy0wMiAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVfNTk0NUwyCTB4MDQJLyogQXJjaGl2ZSA1OTQ1TC0yLCBRSUMtMjQsIFFJQy0wMj8gKi8KKyNkZWZpbmUgTVRfSVNDTVNKNTAwCQkweDA1CS8qIENNUyBKdW1ibyA1MDAgKFFJQy0wMj8pICovCisjZGVmaW5lIE1UX0lTVERDMzYxMAkJMHgwNgkvKiBUYW5kYmVyZyA2MzEwLCBRSUMtMjQgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFX1ZQNjBJCTB4MDcJLyogQXJjaGl2ZSBWUDYwaSwgUUlDLTAyICovCisjZGVmaW5lIE1UX0lTQVJDSElWRV8yMTUwTAkweDA4CS8qIEFyY2hpdmUgVmlwZXIgMjE1MEwgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFXzIwNjBMCTB4MDkJLyogQXJjaGl2ZSBWaXBlciAyMDYwTCAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVTQzQ5OQkweDBBCS8qIEFyY2hpdmUgU0MtNDk5IFFJQy0zNiBjb250cm9sbGVyICovCisjZGVmaW5lIE1UX0lTUUlDMDJfQUxMX0ZFQVRVUkVTCTB4MEYJLyogR2VuZXJpYyBRSUMtMDIgd2l0aCBhbGwgZmVhdHVyZXMgKi8KKyNkZWZpbmUgTVRfSVNXVDUwOTlFRU4yNAkweDExCS8qIFdhbmd0ZWsgNTA5OS1lZW4yNCwgNjBNQiwgUUlDLTI0ICovCisjZGVmaW5lIE1UX0lTVEVBQ19NVDJTVAkJMHgxMgkvKiBUZWFjIE1ULTJTVCAxNTVtYiBkcml2ZSwgVGVhYyBEQy0xIGNhcmQgKFdhbmd0ZWsgdHlwZSkgKi8KKyNkZWZpbmUgTVRfSVNFVkVSRVhfRlQ0MEEJMHgzMgkvKiBFdmVyZXggRlQ0MEEgKFFJQy00MCkgKi8KKyNkZWZpbmUgTVRfSVNERFMxCQkweDUxCS8qIEREUyBkZXZpY2Ugd2l0aG91dCBwYXJ0aXRpb25zICovCisjZGVmaW5lIE1UX0lTRERTMgkJMHg1MgkvKiBERFMgZGV2aWNlIHdpdGggcGFydGl0aW9ucyAqLworI2RlZmluZSBNVF9JU09OU1RSRUFNX1NDICAgICAgICAweDYxICAgLyogT25TdHJlYW0gU0NTSSB0YXBlIGRyaXZlcyAoU0MteDApCisJCQkJCSAgYW5kIFNDU0kgZW11bGF0ZWQgKERJLCBEUCwgVVNCKSAqLworI2RlZmluZSBNVF9JU1NDU0kxCQkweDcxCS8qIEdlbmVyaWMgQU5TSSBTQ1NJLTEgdGFwZSB1bml0ICovCisjZGVmaW5lIE1UX0lTU0NTSTIJCTB4NzIJLyogR2VuZXJpYyBBTlNJIFNDU0ktMiB0YXBlIHVuaXQgKi8KKworLyogUUlDLTQwLzgwLzMwMTAvMzAyMCBmdGFwZSBzdXBwb3J0ZWQgZHJpdmVzLgorICogMjBiaXQgdmVuZG9yIElEICsgMHg4MDAwMDAgKHNlZSBmdGFwZS12ZW5kb3JzLmgpCisgKi8KKyNkZWZpbmUgTVRfSVNGVEFQRV9VTktOT1dOCTB4ODAwMDAwIC8qIG9ic29sZXRlICovCisjZGVmaW5lIE1UX0lTRlRBUEVfRkxBRwkweDgwMDAwMAorCisKKy8qIHN0cnVjdHVyZSBmb3IgTVRJT0NQT1MgLSBtYWcgdGFwZSBnZXQgcG9zaXRpb24gY29tbWFuZCAqLworCitzdHJ1Y3QJbXRwb3MgeworCWxvbmcgCW10X2Jsa25vOwkvKiBjdXJyZW50IGJsb2NrIG51bWJlciAqLworfTsKKworCisvKiBtYWcgdGFwZSBpbyBjb250cm9sIGNvbW1hbmRzICovCisjZGVmaW5lCU1USU9DVE9QCV9JT1coJ20nLCAxLCBzdHJ1Y3QgbXRvcCkJLyogZG8gYSBtYWcgdGFwZSBvcCAqLworI2RlZmluZQlNVElPQ0dFVAlfSU9SKCdtJywgMiwgc3RydWN0IG10Z2V0KQkvKiBnZXQgdGFwZSBzdGF0dXMgKi8KKyNkZWZpbmUJTVRJT0NQT1MJX0lPUignbScsIDMsIHN0cnVjdCBtdHBvcykJLyogZ2V0IHRhcGUgcG9zaXRpb24gKi8KKworCisvKiBHZW5lcmljIE1hZyBUYXBlIChkZXZpY2UgaW5kZXBlbmRlbnQpIHN0YXR1cyBtYWNyb3MgZm9yIGV4YW1pbmluZworICogbXRfZ3N0YXQgLS0gSFAtVVggY29tcGF0aWJsZS4KKyAqIFRoZXJlIGlzIHJvb20gZm9yIG1vcmUgZ2VuZXJpYyBzdGF0dXMgYml0cyBoZXJlLCBidXQgSSBkb24ndAorICoga25vdyB3aGljaCBvZiB0aGVtIGFyZSByZXNlcnZlZC4gQXQgbGVhc3QgdGhyZWUgb3Igc28gc2hvdWxkCisgKiBiZSBhZGRlZCB0byBtYWtlIHRoaXMgcmVhbGx5IHVzZWZ1bC4KKyAqLworI2RlZmluZSBHTVRfRU9GKHgpICAgICAgICAgICAgICAoKHgpICYgMHg4MDAwMDAwMCkKKyNkZWZpbmUgR01UX0JPVCh4KSAgICAgICAgICAgICAgKCh4KSAmIDB4NDAwMDAwMDApCisjZGVmaW5lIEdNVF9FT1QoeCkgICAgICAgICAgICAgICgoeCkgJiAweDIwMDAwMDAwKQorI2RlZmluZSBHTVRfU00oeCkgICAgICAgICAgICAgICAoKHgpICYgMHgxMDAwMDAwMCkgIC8qIEREUyBzZXRtYXJrICovCisjZGVmaW5lIEdNVF9FT0QoeCkgICAgICAgICAgICAgICgoeCkgJiAweDA4MDAwMDAwKSAgLyogRERTIEVPRCAqLworI2RlZmluZSBHTVRfV1JfUFJPVCh4KSAgICAgICAgICAoKHgpICYgMHgwNDAwMDAwMCkKKy8qICNkZWZpbmUgR01UXyA/IAkJKCh4KSAmIDB4MDIwMDAwMDApICovCisjZGVmaW5lIEdNVF9PTkxJTkUoeCkgICAgICAgICAgICgoeCkgJiAweDAxMDAwMDAwKQorI2RlZmluZSBHTVRfRF82MjUwKHgpICAgICAgICAgICAoKHgpICYgMHgwMDgwMDAwMCkKKyNkZWZpbmUgR01UX0RfMTYwMCh4KSAgICAgICAgICAgKCh4KSAmIDB4MDA0MDAwMDApCisjZGVmaW5lIEdNVF9EXzgwMCh4KSAgICAgICAgICAgICgoeCkgJiAweDAwMjAwMDAwKQorLyogI2RlZmluZSBHTVRfID8gCQkoKHgpICYgMHgwMDEwMDAwMCkgKi8KKy8qICNkZWZpbmUgR01UXyA/IAkJKCh4KSAmIDB4MDAwODAwMDApICovCisjZGVmaW5lIEdNVF9EUl9PUEVOKHgpICAgICAgICAgICgoeCkgJiAweDAwMDQwMDAwKSAgLyogZG9vciBvcGVuIChubyB0YXBlKSAqLworLyogI2RlZmluZSBHTVRfID8gCQkoKHgpICYgMHgwMDAyMDAwMCkgKi8KKyNkZWZpbmUgR01UX0lNX1JFUF9FTih4KSAgICAgICAgKCh4KSAmIDB4MDAwMTAwMDApICAvKiBpbW1lZGlhdGUgcmVwb3J0IG1vZGUgKi8KKyNkZWZpbmUgR01UX0NMTih4KSAgICAgICAgICAgICAgKCh4KSAmIDB4MDAwMDgwMDApICAvKiBjbGVhbmluZyByZXF1ZXN0ZWQgKi8KKy8qIDE1IGdlbmVyaWMgc3RhdHVzIGJpdHMgdW51c2VkICovCisKKworLyogU0NTSS10YXBlIHNwZWNpZmljIGRlZmluaXRpb25zICovCisvKiBCaXRmaWVsZCBzaGlmdHMgaW4gdGhlIHN0YXR1cyAgKi8KKyNkZWZpbmUgTVRfU1RfQkxLU0laRV9TSElGVAkwCisjZGVmaW5lIE1UX1NUX0JMS1NJWkVfTUFTSwkweGZmZmZmZgorI2RlZmluZSBNVF9TVF9ERU5TSVRZX1NISUZUCTI0CisjZGVmaW5lIE1UX1NUX0RFTlNJVFlfTUFTSwkweGZmMDAwMDAwCisKKyNkZWZpbmUgTVRfU1RfU09GVEVSUl9TSElGVAkwCisjZGVmaW5lIE1UX1NUX1NPRlRFUlJfTUFTSwkweGZmZmYKKworLyogQml0ZmllbGRzIGZvciB0aGUgTVRTRVREUlZCVUZGRVIgaW9jdGwgKi8KKyNkZWZpbmUgTVRfU1RfT1BUSU9OUwkJMHhmMDAwMDAwMAorI2RlZmluZSBNVF9TVF9CT09MRUFOUwkJMHgxMDAwMDAwMAorI2RlZmluZSBNVF9TVF9TRVRCT09MRUFOUwkweDMwMDAwMDAwCisjZGVmaW5lIE1UX1NUX0NMRUFSQk9PTEVBTlMJMHg0MDAwMDAwMAorI2RlZmluZSBNVF9TVF9XUklURV9USFJFU0hPTEQJMHgyMDAwMDAwMAorI2RlZmluZSBNVF9TVF9ERUZfQkxLU0laRQkweDUwMDAwMDAwCisjZGVmaW5lIE1UX1NUX0RFRl9PUFRJT05TCTB4NjAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfVElNRU9VVFMJCTB4NzAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfU0VUX1RJTUVPVVQJKE1UX1NUX1RJTUVPVVRTIHwgMHgwMDAwMDApCisjZGVmaW5lIE1UX1NUX1NFVF9MT05HX1RJTUVPVVQJKE1UX1NUX1RJTUVPVVRTIHwgMHgxMDAwMDApCisjZGVmaW5lIE1UX1NUX1NFVF9DTE4JCTB4ODAwMDAwMDAKKworI2RlZmluZSBNVF9TVF9CVUZGRVJfV1JJVEVTCTB4MQorI2RlZmluZSBNVF9TVF9BU1lOQ19XUklURVMJMHgyCisjZGVmaW5lIE1UX1NUX1JFQURfQUhFQUQJMHg0CisjZGVmaW5lIE1UX1NUX0RFQlVHR0lORwkJMHg4CisjZGVmaW5lIE1UX1NUX1RXT19GTQkJMHgxMAorI2RlZmluZSBNVF9TVF9GQVNUX01URU9NCTB4MjAKKyNkZWZpbmUgTVRfU1RfQVVUT19MT0NLCQkweDQwCisjZGVmaW5lIE1UX1NUX0RFRl9XUklURVMJMHg4MAorI2RlZmluZSBNVF9TVF9DQU5fQlNSCQkweDEwMAorI2RlZmluZSBNVF9TVF9OT19CTEtMSU1TCTB4MjAwCisjZGVmaW5lIE1UX1NUX0NBTl9QQVJUSVRJT05TICAgIDB4NDAwCisjZGVmaW5lIE1UX1NUX1NDU0kyTE9HSUNBTCAgICAgIDB4ODAwCisjZGVmaW5lIE1UX1NUX1NZU1YgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBNVF9TVF9OT1dBSVQgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgTVRfU1RfU0lMSQkJMHg0MDAwCisKKy8qIFRoZSBtb2RlIHBhcmFtZXRlcnMgdG8gYmUgY29udHJvbGxlZC4gUGFyYW1ldGVyIGNob3NlbiB3aXRoIGJpdHMgMjAtMjggKi8KKyNkZWZpbmUgTVRfU1RfQ0xFQVJfREVGQVVMVAkweGZmZmZmCisjZGVmaW5lIE1UX1NUX0RFRl9ERU5TSVRZCShNVF9TVF9ERUZfT1BUSU9OUyB8IDB4MTAwMDAwKQorI2RlZmluZSBNVF9TVF9ERUZfQ09NUFJFU1NJT04JKE1UX1NUX0RFRl9PUFRJT05TIHwgMHgyMDAwMDApCisjZGVmaW5lIE1UX1NUX0RFRl9EUlZCVUZGRVIJKE1UX1NUX0RFRl9PUFRJT05TIHwgMHgzMDAwMDApCisKKy8qIFRoZSBvZmZzZXQgZm9yIHRoZSBhcmd1bWVudHMgZm9yIHRoZSBzcGVjaWFsIEhQIGNoYW5nZXIgbG9hZCBjb21tYW5kLiAqLworI2RlZmluZSBNVF9TVF9IUExPQURFUl9PRkZTRVQgMTAwMDAKKworI2VuZGlmIC8qIF9MSU5VWF9NVElPX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbl9yMzk2NC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uX3IzOTY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiNTQ1MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbl9yMzk2NC5oCkBAIC0wLDAgKzEsOTggQEAKKy8qIHIzOTY0IGxpbmVkaXNjaXBsaW5lIGZvciBsaW51eAorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgYnkKKyAqIFBoaWxpcHMgQXV0b21hdGlvbiBQcm9qZWN0cworICogS2Fzc2VsIChHZXJtYW55KQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogQXV0aG9yOgorICogTC4gSGFhZworICoKKyAqICRMb2c6IHIzOTY0LmgsdiAkCisgKiBSZXZpc2lvbiAxLjQgIDIwMDUvMTIvMjEgMTk6NTQ6MjQgIEt1cnQgSHV3aWcgPGt1cnQgaHV3aWcgZGU+CisgKiBGaXhlZCBIWiB1c2FnZSBvbiAyLjYga2VybmVscworICogUmVtb3ZlZCB1bm5lY2Vzc2FyeSBpbmNsdWRlCisgKgorICogUmV2aXNpb24gMS4zICAyMDAxLzAzLzE4IDEzOjAyOjI0ICBkd213MgorICogRml4IHRpbWVyIHVzYWdlLCB1c2Ugc3BpbmxvY2tzIHByb3Blcmx5LgorICoKKyAqIFJldmlzaW9uIDEuMiAgMjAwMS8wMy8xOCAxMjo1MzoxNSAgZHdtdzIKKyAqIE1lcmdlIGNoYW5nZXMgaW4gMi40LjIKKyAqCisgKiBSZXZpc2lvbiAxLjEuMS4xICAxOTk4LzEwLzEzIDE2OjQzOjE0ICBkd213MgorICogVGhpcydsbCBzY3JldyB0aGUgdmVyc2lvbiBjb250cm9sCisgKgorICogUmV2aXNpb24gMS42ICAxOTk4LzA5LzMwIDAwOjQwOjM4ICBkd213MgorICogVXBkYXRlZCB0byB1c2Uga2VybmVsJ3MgTl9SMzk2NCBpZiBhdmFpbGFibGUKKyAqCisgKiBSZXZpc2lvbiAxLjQgIDE5OTgvMDQvMDIgMjA6Mjk6NDQgIGxoYWFnCisgKiBzZWxlY3QsIGJsb2NraW5nLCAuLi4KKyAqCisgKiBSZXZpc2lvbiAxLjMgIDE5OTgvMDIvMTIgMTg6NTg6NDMgIHJvb3QKKyAqIGZpeGVkIHNvbWUgbWVtb3J5IGxlYWtzCisgKiBjYWxjdWxhdGlvbiBvZiBjaGVja3N1bSBjaGFyYWN0ZXJzCisgKgorICogUmV2aXNpb24gMS4yICAxOTk4LzAyLzA3IDEzOjAzOjE3ICByb290CisgKiBpb2N0bCByZWFkX3RlbGVncmFtCisgKgorICogUmV2aXNpb24gMS4xICAxOTk4LzAyLzA2IDE5OjE5OjQzICByb290CisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfTl9SMzk2NF9IX18KKyNkZWZpbmUgX19MSU5VWF9OX1IzOTY0X0hfXworCisvKiBsaW5lIGRpc2NpcGxpbmVzIGZvciByMzk2NCBwcm90b2NvbCAqLworCisKKy8qCisgKiBJb2N0bC1jb21tYW5kcworICovCisKKyNkZWZpbmUgUjM5NjRfRU5BQkxFX1NJR05BTFMgICAgICAweDUzMDEKKyNkZWZpbmUgUjM5NjRfU0VUUFJJT1JJVFkgICAgICAgICAweDUzMDIKKyNkZWZpbmUgUjM5NjRfVVNFX0JDQyAgICAgICAgICAgICAweDUzMDMKKyNkZWZpbmUgUjM5NjRfUkVBRF9URUxFR1JBTSAgICAgICAweDUzMDQKKworLyogT3B0aW9ucyBmb3IgUjM5NjRfU0VUUFJJT1JJVFkgKi8KKyNkZWZpbmUgUjM5NjRfTUFTVEVSICAgMAorI2RlZmluZSBSMzk2NF9TTEFWRSAgICAxCisKKy8qIE9wdGlvbnMgZm9yIFIzOTY0X0VOQUJMRV9TSUdOQUxTICovCisjZGVmaW5lIFIzOTY0X1NJR19BQ0sgICAweDAwMDEKKyNkZWZpbmUgUjM5NjRfU0lHX0RBVEEgIDB4MDAwMgorI2RlZmluZSBSMzk2NF9TSUdfQUxMICAgMHgwMDBmCisjZGVmaW5lIFIzOTY0X1NJR19OT05FICAweDAwMDAKKyNkZWZpbmUgUjM5NjRfVVNFX1NJR0lPIDB4MTAwMAorCisvKgorICogcjM5NjQgb3BlcmF0aW9uIHN0YXRlczoKKyAqLworCisvKiB0eXBlcyBmb3IgbXNnX2lkOiAqLworZW51bSB7UjM5NjRfTVNHX0FDSz0xLCBSMzk2NF9NU0dfREFUQSB9OworCisjZGVmaW5lIFIzOTY0X01BWF9NU0dfQ09VTlQgMzIKKworLyogZXJyb3IgY29kZXMgZm9yIGNsaWVudCBtZXNzYWdlcyAqLworI2RlZmluZSBSMzk2NF9PSyAwICAgICAgICAvKiBubyBlcnJvci4gKi8KKyNkZWZpbmUgUjM5NjRfVFhfRkFJTCAtMSAgLyogdHJhbnNtaXNzaW9uIGVycm9yLCBibG9jayBOT1Qgc2VudCAqLworI2RlZmluZSBSMzk2NF9PVkVSRkxPVyAtMiAvKiBtc2cgcXVldWUgb3ZlcmZsb3cgKi8KKworLyogdGhlIGNsaWVudCBnZXRzIHRoaXMgc3RydWN0IHdoZW4gY2FsbGluZyByZWFkKGZkLC4uLik6ICovCitzdHJ1Y3QgcjM5NjRfY2xpZW50X21lc3NhZ2UgeworCSAgaW50ICAgICBtc2dfaWQ7CisJICBpbnQgICAgIGFyZzsKKwkgIGludCAgICAgZXJyb3JfY29kZTsKK307CisKKyNkZWZpbmUgUjM5NjRfTVRVICAgICAgMjU2CisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmJkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25iZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZDI5ODkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25iZC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAxOTk5IENvcHlyaWdodCAoQykgUGF2ZWwgTWFjaGVrLCBwYXZlbEB1Y3cuY3ouIFRoaXMgY29kZSBpcyBHUEwuCisgKiAxOTk5LzExLzA0IENvcHlyaWdodCAoQykgMTk5OSBWTXdhcmUsIEluYy4gKFJlZ2lzICJIUFJlZyIgRHVjaGVzbmUpCisgKiAgICAgICAgICAgIE1hZGUgbmJkX2VuZF9yZXF1ZXN0KCkgdXNlIHRoZSBpb19yZXF1ZXN0X2xvY2sKKyAqIDIwMDEgQ29weXJpZ2h0IChDKSBTdGV2ZW4gV2hpdGVob3VzZQorICogICAgICAgICAgICBOZXcgbmJkX2VuZF9yZXF1ZXN0KCkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBuZXcgbGludXggYmxvY2sKKyAqICAgICAgICAgICAgbGF5ZXIgY29kZS4KKyAqIDIwMDMvMDYvMjQgTG91aXMgRC4gTGFuZ2hvbHR6IDxsZGxAYXJvcy5uZXQ+CisgKiAgICAgICAgICAgIFJlbW92ZWQgdW5uZWVkZWQgYmxrc2l6ZV9iaXRzIGZpZWxkIGZyb20gbmJkX2RldmljZSBzdHJ1Y3QuCisgKiAgICAgICAgICAgIENsZWFudXAgUEFSQU5PSUEgdXNhZ2UgJiBjb2RlLgorICogMjAwNC8wMi8xOSBQYXVsIENsZW1lbnRzCisgKiAgICAgICAgICAgIFJlbW92ZWQgUEFSQU5PSUEsIHBsdXMgdmFyaW91cyBjbGVhbnVwIGFuZCBjb21tZW50cworICovCisKKyNpZm5kZWYgTElOVVhfTkJEX0gKKyNkZWZpbmUgTElOVVhfTkJEX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgTkJEX1NFVF9TT0NLCV9JTyggMHhhYiwgMCApCisjZGVmaW5lIE5CRF9TRVRfQkxLU0laRQlfSU8oIDB4YWIsIDEgKQorI2RlZmluZSBOQkRfU0VUX1NJWkUJX0lPKCAweGFiLCAyICkKKyNkZWZpbmUgTkJEX0RPX0lUCV9JTyggMHhhYiwgMyApCisjZGVmaW5lIE5CRF9DTEVBUl9TT0NLCV9JTyggMHhhYiwgNCApCisjZGVmaW5lIE5CRF9DTEVBUl9RVUUJX0lPKCAweGFiLCA1ICkKKyNkZWZpbmUgTkJEX1BSSU5UX0RFQlVHCV9JTyggMHhhYiwgNiApCisjZGVmaW5lIE5CRF9TRVRfU0laRV9CTE9DS1MJX0lPKCAweGFiLCA3ICkKKyNkZWZpbmUgTkJEX0RJU0NPTk5FQ1QgIF9JTyggMHhhYiwgOCApCisjZGVmaW5lIE5CRF9TRVRfVElNRU9VVCBfSU8oIDB4YWIsIDkgKQorCitlbnVtIHsKKwlOQkRfQ01EX1JFQUQgPSAwLAorCU5CRF9DTURfV1JJVEUgPSAxLAorCU5CRF9DTURfRElTQyA9IDIKK307CisKKyNkZWZpbmUgbmJkX2NtZChyZXEpICgocmVxKS0+Y21kWzBdKQorCisvKiB1c2Vyc3BhY2UgZG9lc24ndCBuZWVkIHRoZSBuYmRfZGV2aWNlIHN0cnVjdHVyZSAqLworCisvKiBUaGVzZSBhcmUgc2VudCBvdmVyIHRoZSBuZXR3b3JrIGluIHRoZSByZXF1ZXN0L3JlcGx5IG1hZ2ljIGZpZWxkcyAqLworCisjZGVmaW5lIE5CRF9SRVFVRVNUX01BR0lDIDB4MjU2MDk1MTMKKyNkZWZpbmUgTkJEX1JFUExZX01BR0lDIDB4Njc0NDY2OTgKKy8qIERvICpub3QqIHVzZSBtYWdpY3M6IDB4MTI1NjA5NTMgMHg5Njc0NDY2OC4gKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIHBhY2tldCB1c2VkIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gY2xpZW50IGFuZAorICogc2VydmVyLiBBbGwgZGF0YSBhcmUgaW4gbmV0d29yayBieXRlIG9yZGVyLgorICovCitzdHJ1Y3QgbmJkX3JlcXVlc3QgeworCV9fYmUzMiBtYWdpYzsKKwlfX2JlMzIgdHlwZTsJLyogPT0gUkVBRCB8fCA9PSBXUklURSAJKi8KKwljaGFyIGhhbmRsZVs4XTsKKwlfX2JlNjQgZnJvbTsKKwlfX2JlMzIgbGVuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHJlcGx5IHBhY2tldCB0aGF0IG5iZC1zZXJ2ZXIgc2VuZHMgYmFjayB0byB0aGUgY2xpZW50IGFmdGVyCisgKiBpdCBoYXMgY29tcGxldGVkIGFuIEkvTyByZXF1ZXN0IChvciBhbiBlcnJvciBvY2N1cnMpLgorICovCitzdHJ1Y3QgbmJkX3JlcGx5IHsKKwlfX2JlMzIgbWFnaWM7CisJX19iZTMyIGVycm9yOwkJLyogMCA9IG9rLCBlbHNlIGVycm9yCSovCisJY2hhciBoYW5kbGVbOF07CQkvKiBoYW5kbGUgeW91IGdvdCBmcm9tIHJlcXVlc3QJKi8KK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmNwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25jcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODJhZDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25jcC5oCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogIG5jcC5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSBieSBWb2xrZXIgTGVuZGVja2UKKyAqICBNb2RpZmllZCBmb3Igc3BhcmMgYnkgSi5GLiBDaGFkaW1hCisgKiAgTW9kaWZpZWQgZm9yIF9fY29uc3RhbnRfbnRvaCBieSBGcmFuayBBLiBWb3JzdGVuYm9zY2gKKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfTkNQX0gKKyNkZWZpbmUgX0xJTlVYX05DUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIE5DUF9QVFlQRSAgICAgICAgICAgICAgICAoMHgxMSkKKyNkZWZpbmUgTkNQX1BPUlQgICAgICAgICAgICAgICAgICgweDA0NTEpCisKKyNkZWZpbmUgTkNQX0FMTE9DX1NMT1RfUkVRVUVTVCAgICgweDExMTEpCisjZGVmaW5lIE5DUF9SRVFVRVNUICAgICAgICAgICAgICAoMHgyMjIyKQorI2RlZmluZSBOQ1BfREVBTExPQ19TTE9UX1JFUVVFU1QgKDB4NTU1NSkKKworc3RydWN0IG5jcF9yZXF1ZXN0X2hlYWRlciB7CisJX191MTYgdHlwZTsKKwlfX3U4IHNlcXVlbmNlOworCV9fdTggY29ubl9sb3c7CisJX191OCB0YXNrOworCV9fdTggY29ubl9oaWdoOworCV9fdTggZnVuY3Rpb247CisJX191OCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBOQ1BfUkVQTFkgICAgICAgICAgICAgICAgKDB4MzMzMykKKyNkZWZpbmUgTkNQX1dBVENIRE9HCQkgKDB4M0UzRSkKKyNkZWZpbmUgTkNQX1BPU0lUSVZFX0FDSyAgICAgICAgICgweDk5OTkpCisKK3N0cnVjdCBuY3BfcmVwbHlfaGVhZGVyIHsKKwlfX3UxNiB0eXBlOworCV9fdTggc2VxdWVuY2U7CisJX191OCBjb25uX2xvdzsKKwlfX3U4IHRhc2s7CisJX191OCBjb25uX2hpZ2g7CisJX191OCBjb21wbGV0aW9uX2NvZGU7CisJX191OCBjb25uZWN0aW9uX3N0YXRlOworCV9fdTggZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgTkNQX1ZPTE5BTUVfTEVOICgxNikKKyNkZWZpbmUgTkNQX05VTUJFUl9PRl9WT0xVTUVTICgyNTYpCitzdHJ1Y3QgbmNwX3ZvbHVtZV9pbmZvIHsKKwlfX3UzMiB0b3RhbF9ibG9ja3M7CisJX191MzIgZnJlZV9ibG9ja3M7CisJX191MzIgcHVyZ2VhYmxlX2Jsb2NrczsKKwlfX3UzMiBub3RfeWV0X3B1cmdlYWJsZV9ibG9ja3M7CisJX191MzIgdG90YWxfZGlyX2VudHJpZXM7CisJX191MzIgYXZhaWxhYmxlX2Rpcl9lbnRyaWVzOworCV9fdTggc2VjdG9yc19wZXJfYmxvY2s7CisJY2hhciB2b2x1bWVfbmFtZVtOQ1BfVk9MTkFNRV9MRU4gKyAxXTsKK307CisKKyNkZWZpbmUgQVJfUkVBRCAgICAgIChjcHVfdG9fbGUxNigxKSkKKyNkZWZpbmUgQVJfV1JJVEUgICAgIChjcHVfdG9fbGUxNigyKSkKKyNkZWZpbmUgQVJfRVhDTFVTSVZFIChjcHVfdG9fbGUxNigweDIwKSkKKworI2RlZmluZSBOQ1BfRklMRV9JRF9MRU4gNgorCisvKiBEZWZpbmVzIGZvciBOYW1lIFNwYWNlcyAqLworI2RlZmluZSBOV19OU19ET1MgICAgIDAKKyNkZWZpbmUgTldfTlNfTUFDICAgICAxCisjZGVmaW5lIE5XX05TX05GUyAgICAgMgorI2RlZmluZSBOV19OU19GVEFNICAgIDMKKyNkZWZpbmUgTldfTlNfT1MyICAgICA0CisKKy8qICBEZWZpbmVzIGZvciBSZXR1cm5JbmZvcm1hdGlvbk1hc2sgKi8KKyNkZWZpbmUgUklNX05BTUUJICAgICAgKGNwdV90b19sZTMyKDEpKQorI2RlZmluZSBSSU1fU1BBQ0VfQUxMT0NBVEVEICAgKGNwdV90b19sZTMyKDIpKQorI2RlZmluZSBSSU1fQVRUUklCVVRFUwkgICAgICAoY3B1X3RvX2xlMzIoNCkpCisjZGVmaW5lIFJJTV9EQVRBX1NJWkUJICAgICAgKGNwdV90b19sZTMyKDgpKQorI2RlZmluZSBSSU1fVE9UQUxfU0laRQkgICAgICAoY3B1X3RvX2xlMzIoMHgxMCkpCisjZGVmaW5lIFJJTV9FWFRfQVRUUl9JTkZPICAgICAoY3B1X3RvX2xlMzIoMHgyMCkpCisjZGVmaW5lIFJJTV9BUkNISVZFCSAgICAgIChjcHVfdG9fbGUzMigweDQwKSkKKyNkZWZpbmUgUklNX01PRElGWQkgICAgICAoY3B1X3RvX2xlMzIoMHg4MCkpCisjZGVmaW5lIFJJTV9DUkVBVElPTgkgICAgICAoY3B1X3RvX2xlMzIoMHgxMDApKQorI2RlZmluZSBSSU1fT1dOSU5HX05BTUVTUEFDRSAgKGNwdV90b19sZTMyKDB4MjAwKSkKKyNkZWZpbmUgUklNX0RJUkVDVE9SWQkgICAgICAoY3B1X3RvX2xlMzIoMHg0MDApKQorI2RlZmluZSBSSU1fUklHSFRTCSAgICAgIChjcHVfdG9fbGUzMigweDgwMCkpCisjZGVmaW5lIFJJTV9BTEwgCSAgICAgIChjcHVfdG9fbGUzMigweEZGRikpCisjZGVmaW5lIFJJTV9DT01QUkVTU0VEX0lORk8gICAoY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCkpCisKKy8qIERlZmluZXMgZm9yIE5TSW5mb0JpdE1hc2sgKi8KKyNkZWZpbmUgTlNJQk1fTkZTX05BTUUJCTB4MDAwMQorI2RlZmluZSBOU0lCTV9ORlNfTU9ERQkJMHgwMDAyCisjZGVmaW5lIE5TSUJNX05GU19HSUQJCTB4MDAwNAorI2RlZmluZSBOU0lCTV9ORlNfTkxJTktTCTB4MDAwOAorI2RlZmluZSBOU0lCTV9ORlNfUkRFVgkJMHgwMDEwCisjZGVmaW5lIE5TSUJNX05GU19MSU5LCQkweDAwMjAKKyNkZWZpbmUgTlNJQk1fTkZTX0NSRUFURUQJMHgwMDQwCisjZGVmaW5lIE5TSUJNX05GU19VSUQJCTB4MDA4MAorI2RlZmluZSBOU0lCTV9ORlNfQUNTRkxBRwkweDAxMDAKKyNkZWZpbmUgTlNJQk1fTkZTX01ZRkxBRwkweDAyMDAKKworLyogb3Blbi9jcmVhdGUgbW9kZXMgKi8KKyNkZWZpbmUgT0NfTU9ERV9PUEVOCSAgMHgwMQorI2RlZmluZSBPQ19NT0RFX1RSVU5DQVRFICAweDAyCisjZGVmaW5lIE9DX01PREVfUkVQTEFDRSAgIDB4MDIKKyNkZWZpbmUgT0NfTU9ERV9DUkVBVEUJICAweDA4CisKKy8qIG9wZW4vY3JlYXRlIHJlc3VsdHMgKi8KKyNkZWZpbmUgT0NfQUNUSU9OX05PTkUJICAgMHgwMAorI2RlZmluZSBPQ19BQ1RJT05fT1BFTgkgICAweDAxCisjZGVmaW5lIE9DX0FDVElPTl9DUkVBVEUgICAweDAyCisjZGVmaW5lIE9DX0FDVElPTl9UUlVOQ0FURSAweDA0CisjZGVmaW5lIE9DX0FDVElPTl9SRVBMQUNFICAweDA0CisKKy8qIGFjY2VzcyByaWdodHMgYXR0cmlidXRlcyAqLworI2lmbmRlZiBBUl9SRUFEX09OTFkKKyNkZWZpbmUgQVJfUkVBRF9PTkxZCSAgIDB4MDAwMQorI2RlZmluZSBBUl9XUklURV9PTkxZCSAgIDB4MDAwMgorI2RlZmluZSBBUl9ERU5ZX1JFQUQJICAgMHgwMDA0CisjZGVmaW5lIEFSX0RFTllfV1JJVEUJICAgMHgwMDA4CisjZGVmaW5lIEFSX0NPTVBBVElCSUxJVFkgICAweDAwMTAKKyNkZWZpbmUgQVJfV1JJVEVfVEhST1VHSCAgIDB4MDA0MAorI2RlZmluZSBBUl9PUEVOX0NPTVBSRVNTRUQgMHgwMTAwCisjZW5kaWYKKworc3RydWN0IG53X25mc19pbmZvIHsKKwlfX3UzMiBtb2RlOworCV9fdTMyIHJkZXY7Cit9OworCitzdHJ1Y3QgbndfaW5mb19zdHJ1Y3QgeworCV9fdTMyIHNwYWNlQWxsb2M7CisJX19sZTMyIGF0dHJpYnV0ZXM7CisJX191MTYgZmxhZ3M7CisJX19sZTMyIGRhdGFTdHJlYW1TaXplOworCV9fbGUzMiB0b3RhbFN0cmVhbVNpemU7CisJX191MTYgbnVtYmVyT2ZTdHJlYW1zOworCV9fbGUxNiBjcmVhdGlvblRpbWU7CisJX19sZTE2IGNyZWF0aW9uRGF0ZTsKKwlfX3UzMiBjcmVhdG9ySUQ7CisJX19sZTE2IG1vZGlmeVRpbWU7CisJX19sZTE2IG1vZGlmeURhdGU7CisJX191MzIgbW9kaWZpZXJJRDsKKwlfX2xlMTYgbGFzdEFjY2Vzc0RhdGU7CisJX191MTYgYXJjaGl2ZVRpbWU7CisJX191MTYgYXJjaGl2ZURhdGU7CisJX191MzIgYXJjaGl2ZXJJRDsKKwlfX3UxNiBpbmhlcml0ZWRSaWdodHNNYXNrOworCV9fbGUzMiBkaXJFbnROdW07CisJX19sZTMyIERvc0Rpck51bTsKKwlfX3UzMiB2b2xOdW1iZXI7CisJX191MzIgRUFEYXRhU2l6ZTsKKwlfX3UzMiBFQUtleUNvdW50OworCV9fdTMyIEVBS2V5U2l6ZTsKKwlfX3UzMiBOU0NyZWF0b3I7CisJX191OCBuYW1lTGVuOworCV9fdTggZW50cnlOYW1lWzI1Nl07CisJLyogbGlibmNwIG1heSBkZXBlbmQgb24gdGhlcmUgYmVpbmcgbm90aGluZyBhZnRlciBlbnRyeU5hbWUgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIG1vZGlmeSBtYXNrIC0gdXNlIHdpdGggTU9ESUZZX0RPU19JTkZPIHN0cnVjdHVyZSAqLworI2RlZmluZSBETV9BVFRSSUJVVEVTCQkgIChjcHVfdG9fbGUzMigweDAyKSkKKyNkZWZpbmUgRE1fQ1JFQVRFX0RBVEUJCSAgKGNwdV90b19sZTMyKDB4MDQpKQorI2RlZmluZSBETV9DUkVBVEVfVElNRQkJICAoY3B1X3RvX2xlMzIoMHgwOCkpCisjZGVmaW5lIERNX0NSRUFUT1JfSUQJCSAgKGNwdV90b19sZTMyKDB4MTApKQorI2RlZmluZSBETV9BUkNISVZFX0RBVEUgCSAgKGNwdV90b19sZTMyKDB4MjApKQorI2RlZmluZSBETV9BUkNISVZFX1RJTUUgCSAgKGNwdV90b19sZTMyKDB4NDApKQorI2RlZmluZSBETV9BUkNISVZFUl9JRAkJICAoY3B1X3RvX2xlMzIoMHg4MCkpCisjZGVmaW5lIERNX01PRElGWV9EQVRFCQkgIChjcHVfdG9fbGUzMigweDAxMDApKQorI2RlZmluZSBETV9NT0RJRllfVElNRQkJICAoY3B1X3RvX2xlMzIoMHgwMjAwKSkKKyNkZWZpbmUgRE1fTU9ESUZJRVJfSUQJCSAgKGNwdV90b19sZTMyKDB4MDQwMCkpCisjZGVmaW5lIERNX0xBU1RfQUNDRVNTX0RBVEUJICAoY3B1X3RvX2xlMzIoMHgwODAwKSkKKyNkZWZpbmUgRE1fSU5IRVJJVEVEX1JJR0hUU19NQVNLICAoY3B1X3RvX2xlMzIoMHgxMDAwKSkKKyNkZWZpbmUgRE1fTUFYSU1VTV9TUEFDRQkgIChjcHVfdG9fbGUzMigweDIwMDApKQorCitzdHJ1Y3QgbndfbW9kaWZ5X2Rvc19pbmZvIHsKKwlfX2xlMzIgYXR0cmlidXRlczsKKwlfX2xlMTYgY3JlYXRpb25EYXRlOworCV9fbGUxNiBjcmVhdGlvblRpbWU7CisJX191MzIgY3JlYXRvcklEOworCV9fbGUxNiBtb2RpZnlEYXRlOworCV9fbGUxNiBtb2RpZnlUaW1lOworCV9fdTMyIG1vZGlmaWVySUQ7CisJX191MTYgYXJjaGl2ZURhdGU7CisJX191MTYgYXJjaGl2ZVRpbWU7CisJX191MzIgYXJjaGl2ZXJJRDsKKwlfX2xlMTYgbGFzdEFjY2Vzc0RhdGU7CisJX191MTYgaW5oZXJpdGFuY2VHcmFudE1hc2s7CisJX191MTYgaW5oZXJpdGFuY2VSZXZva2VNYXNrOworCV9fdTMyIG1heGltdW1TcGFjZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBud19zZWFyY2hfc2VxdWVuY2UgeworCV9fdTggdm9sTnVtYmVyOworCV9fdTMyIGRpckJhc2U7CisJX191MzIgc2VxdWVuY2U7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZW5kaWYJCQkJLyogX0xJTlVYX05DUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25jcF9mcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uY3BfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjg0NDY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uY3BfZnMuaApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqICBuY3BfZnMuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgVm9sa2VyIExlbmRlY2tlCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX05DUF9GU19ICisjZGVmaW5lIF9MSU5VWF9OQ1BfRlNfSAorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lweC5oPgorI2luY2x1ZGUgPGxpbnV4L25jcF9uby5oPgorCisvKgorICogaW9jdGwgY29tbWFuZHMKKyAqLworCitzdHJ1Y3QgbmNwX2lvY3RsX3JlcXVlc3QgeworCXVuc2lnbmVkIGludCBmdW5jdGlvbjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwljaGFyICpkYXRhOworfTsKKworc3RydWN0IG5jcF9mc19pbmZvIHsKKwlpbnQgdmVyc2lvbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaXB4IGFkZHI7CisJX19rZXJuZWxfdWlkX3QgbW91bnRlZF91aWQ7CisJaW50IGNvbm5lY3Rpb247CQkvKiBDb25uZWN0aW9uIG51bWJlciB0aGUgc2VydmVyIGFzc2lnbmVkIHVzICovCisJaW50IGJ1ZmZlcl9zaXplOwkvKiBUaGUgbmVnb3RpYXRlZCBidWZmZXIgc2l6ZSwgdG8gYmUKKwkJCQkgICB1c2VkIGZvciByZWFkL3dyaXRlIHJlcXVlc3RzISAqLworCisJaW50IHZvbHVtZV9udW1iZXI7CisJX19sZTMyIGRpcmVjdG9yeV9pZDsKK307CisKK3N0cnVjdCBuY3BfZnNfaW5mb192MiB7CisJaW50IHZlcnNpb247CisJdW5zaWduZWQgbG9uZyBtb3VudGVkX3VpZDsKKwl1bnNpZ25lZCBpbnQgY29ubmVjdGlvbjsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyX3NpemU7CisKKwl1bnNpZ25lZCBpbnQgdm9sdW1lX251bWJlcjsKKwlfX2xlMzIgZGlyZWN0b3J5X2lkOworCisJX191MzIgZHVtbXkxOworCV9fdTMyIGR1bW15MjsKKwlfX3UzMiBkdW1teTM7Cit9OworCitzdHJ1Y3QgbmNwX3NpZ25faW5pdAoreworCWNoYXIgc2lnbl9yb290WzhdOworCWNoYXIgc2lnbl9sYXN0WzE2XTsKK307CisKK3N0cnVjdCBuY3BfbG9ja19pb2N0bAoreworI2RlZmluZSBOQ1BfTE9DS19MT0cJMAorI2RlZmluZSBOQ1BfTE9DS19TSAkxCisjZGVmaW5lIE5DUF9MT0NLX0VYCTIKKyNkZWZpbmUgTkNQX0xPQ0tfQ0xFQVIJMjU2CisJaW50CQljbWQ7CisJaW50CQlvcmlnaW47CisJdW5zaWduZWQgaW50CW9mZnNldDsKKwl1bnNpZ25lZCBpbnQJbGVuZ3RoOworI2RlZmluZSBOQ1BfTE9DS19ERUZBVUxUX1RJTUVPVVQJMTgKKyNkZWZpbmUgTkNQX0xPQ0tfTUFYX1RJTUVPVVQJCTE4MAorCWludAkJdGltZW91dDsKK307CisKK3N0cnVjdCBuY3Bfc2V0cm9vdF9pb2N0bAoreworCWludAkJdm9sTnVtYmVyOworCWludAkJbmFtZXNwYWNlOworCV9fbGUzMgkJZGlyRW50TnVtOworfTsKKworc3RydWN0IG5jcF9vYmplY3RuYW1lX2lvY3RsCit7CisjZGVmaW5lIE5DUF9BVVRIX05PTkUJMHgwMAorI2RlZmluZSBOQ1BfQVVUSF9CSU5ECTB4MzEKKyNkZWZpbmUgTkNQX0FVVEhfTkRTCTB4MzIKKwlpbnQJCWF1dGhfdHlwZTsKKwlzaXplX3QJCW9iamVjdF9uYW1lX2xlbjsKKwl2b2lkICoJb2JqZWN0X25hbWU7CS8qIGEgdXNlcnNwYWNlIGRhdGEsIGluIG1vc3QgY2FzZXMgdXNlciBuYW1lICovCit9OworCitzdHJ1Y3QgbmNwX3ByaXZhdGVkYXRhX2lvY3RsCit7CisJc2l6ZV90CQlsZW47CisJdm9pZCAqCWRhdGE7CQkvKiB+MTAwMCBmb3IgTkRTICovCit9OworCisvKiBOTFMgY2hhcnNldHMgYnkgaW9jdGwgKi8KKyNkZWZpbmUgTkNQX0lPQ1NOQU1FX0xFTiAyMAorc3RydWN0IG5jcF9ubHNfaW9jdGwKK3sKKwl1bnNpZ25lZCBjaGFyIGNvZGVwYWdlW05DUF9JT0NTTkFNRV9MRU4rMV07CisJdW5zaWduZWQgY2hhciBpb2NoYXJzZXRbTkNQX0lPQ1NOQU1FX0xFTisxXTsKK307CisKKyNkZWZpbmUJTkNQX0lPQ19OQ1BSRVFVRVNUCQlfSU9SKCduJywgMSwgc3RydWN0IG5jcF9pb2N0bF9yZXF1ZXN0KQorI2RlZmluZQlOQ1BfSU9DX0dFVE1PVU5UVUlECQlfSU9XKCduJywgMiwgX19rZXJuZWxfb2xkX3VpZF90KQorI2RlZmluZSBOQ1BfSU9DX0dFVE1PVU5UVUlEMgkJX0lPVygnbicsIDIsIHVuc2lnbmVkIGxvbmcpCisKKyNkZWZpbmUgTkNQX0lPQ19DT05OX0xPR0dFRF9JTiAgICAgICAgICBfSU8oJ24nLCAzKQorCisjZGVmaW5lIE5DUF9HRVRfRlNfSU5GT19WRVJTSU9OICAgICgxKQorI2RlZmluZSBOQ1BfSU9DX0dFVF9GU19JTkZPICAgICAgICAgICAgIF9JT1dSKCduJywgNCwgc3RydWN0IG5jcF9mc19pbmZvKQorI2RlZmluZSBOQ1BfR0VUX0ZTX0lORk9fVkVSU0lPTl9WMiAoMikKKyNkZWZpbmUgTkNQX0lPQ19HRVRfRlNfSU5GT19WMgkJX0lPV1IoJ24nLCA0LCBzdHJ1Y3QgbmNwX2ZzX2luZm9fdjIpCisKKyNkZWZpbmUgTkNQX0lPQ19TSUdOX0lOSVQJCV9JT1IoJ24nLCA1LCBzdHJ1Y3QgbmNwX3NpZ25faW5pdCkKKyNkZWZpbmUgTkNQX0lPQ19TSUdOX1dBTlRFRAkJX0lPUignbicsIDYsIGludCkKKyNkZWZpbmUgTkNQX0lPQ19TRVRfU0lHTl9XQU5URUQJCV9JT1coJ24nLCA2LCBpbnQpCisKKyNkZWZpbmUgTkNQX0lPQ19MT0NLVU5MT0NLCQlfSU9SKCduJywgNywgc3RydWN0IG5jcF9sb2NrX2lvY3RsKQorCisjZGVmaW5lIE5DUF9JT0NfR0VUUk9PVAkJCV9JT1coJ24nLCA4LCBzdHJ1Y3QgbmNwX3NldHJvb3RfaW9jdGwpCisjZGVmaW5lIE5DUF9JT0NfU0VUUk9PVAkJCV9JT1IoJ24nLCA4LCBzdHJ1Y3QgbmNwX3NldHJvb3RfaW9jdGwpCisKKyNkZWZpbmUgTkNQX0lPQ19HRVRPQkpFQ1ROQU1FCQlfSU9XUignbicsIDksIHN0cnVjdCBuY3Bfb2JqZWN0bmFtZV9pb2N0bCkKKyNkZWZpbmUgTkNQX0lPQ19TRVRPQkpFQ1ROQU1FCQlfSU9SKCduJywgOSwgc3RydWN0IG5jcF9vYmplY3RuYW1lX2lvY3RsKQorI2RlZmluZSBOQ1BfSU9DX0dFVFBSSVZBVEVEQVRBCQlfSU9XUignbicsIDEwLCBzdHJ1Y3QgbmNwX3ByaXZhdGVkYXRhX2lvY3RsKQorI2RlZmluZSBOQ1BfSU9DX1NFVFBSSVZBVEVEQVRBCQlfSU9SKCduJywgMTAsIHN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGwpCisKKyNkZWZpbmUgTkNQX0lPQ19HRVRDSEFSU0VUUwkJX0lPV1IoJ24nLCAxMSwgc3RydWN0IG5jcF9ubHNfaW9jdGwpCisjZGVmaW5lIE5DUF9JT0NfU0VUQ0hBUlNFVFMJCV9JT1IoJ24nLCAxMSwgc3RydWN0IG5jcF9ubHNfaW9jdGwpCisKKyNkZWZpbmUgTkNQX0lPQ19HRVRERU5UUllUVEwJCV9JT1coJ24nLCAxMiwgX191MzIpCisjZGVmaW5lIE5DUF9JT0NfU0VUREVOVFJZVFRMCQlfSU9SKCduJywgMTIsIF9fdTMyKQorCisvKgorICogVGhlIHBhY2tldCBzaXplIHRvIGFsbG9jYXRlLiBPbmUgcGFnZSBzaG91bGQgYmUgZW5vdWdoLgorICovCisjZGVmaW5lIE5DUF9QQUNLRVRfU0laRSA0MDcwCisKKyNkZWZpbmUgTkNQX01BWFBBVEhMRU4gMjU1CisjZGVmaW5lIE5DUF9NQVhOQU1FTEVOIDE0CisKKyNlbmRpZgkJCQkvKiBfTElOVVhfTkNQX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmNwX21vdW50LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25jcF9tb3VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmY2JlYTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25jcF9tb3VudC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiAgbmNwX21vdW50LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IGJ5IFZvbGtlciBMZW5kZWNrZQorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OQ1BfTU9VTlRfSAorI2RlZmluZSBfTElOVVhfTkNQX01PVU5UX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmNwLmg+CisKKyNkZWZpbmUgTkNQX01PVU5UX1ZFUlNJT04gMwkvKiBCaW5hcnkgKi8KKworLyogVmFsdWVzIGZvciBmbGFncyAqLworI2RlZmluZSBOQ1BfTU9VTlRfU09GVAkJMHgwMDAxCisjZGVmaW5lIE5DUF9NT1VOVF9JTlRSCQkweDAwMDIKKyNkZWZpbmUgTkNQX01PVU5UX1NUUk9ORwkweDAwMDQJLyogZW5hYmxlIGRlbGV0ZS9yZW5hbWUgb2Ygci9vIGZpbGVzICovCisjZGVmaW5lIE5DUF9NT1VOVF9OT19PUzIJMHgwMDA4CS8qIGRvIG5vdCB1c2UgT1MvMiAoTE9ORykgbmFtZXNwYWNlICovCisjZGVmaW5lIE5DUF9NT1VOVF9OT19ORlMJMHgwMDEwCS8qIGRvIG5vdCB1c2UgTkZTIG5hbWVzcGFjZSAqLworI2RlZmluZSBOQ1BfTU9VTlRfRVhUUkFTCTB4MDAyMAorI2RlZmluZSBOQ1BfTU9VTlRfU1lNTElOS1MJMHgwMDQwCS8qIGVuYWJsZSBzeW1saW5rcyAqLworI2RlZmluZSBOQ1BfTU9VTlRfTkZTX0VYVFJBUwkweDAwODAJLyogRW5hYmxlIHVzZSBvZiBORlMgTlMgbWV0YS1pbmZvICovCisKK3N0cnVjdCBuY3BfbW91bnRfZGF0YSB7CisJaW50IHZlcnNpb247CisJdW5zaWduZWQgaW50IG5jcF9mZDsJLyogVGhlIHNvY2tldCB0byB0aGUgbmNwIHBvcnQgKi8KKwlfX2tlcm5lbF91aWRfdCBtb3VudGVkX3VpZDsJLyogV2hvIG1heSB1bW91bnQoKSB0aGlzIGZpbGVzeXN0ZW0/ICovCisJX19rZXJuZWxfcGlkX3Qgd2RvZ19waWQ7CQkvKiBXaG8gY2FyZXMgZm9yIG91ciB3YXRjaGRvZyBwYWNrZXRzPyAqLworCisJdW5zaWduZWQgY2hhciBtb3VudGVkX3ZvbFtOQ1BfVk9MTkFNRV9MRU4gKyAxXTsKKwl1bnNpZ25lZCBpbnQgdGltZV9vdXQ7CS8qIEhvdyBsb25nIHNob3VsZCBJIHdhaXQgYWZ0ZXIKKwkJCQkgICBzZW5kaW5nIGEgTkNQIHJlcXVlc3Q/ICovCisJdW5zaWduZWQgaW50IHJldHJ5X2NvdW50OwkvKiBBbmQgaG93IG9mdGVuIHNob3VsZCBJIHJldHJ5PyAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKworCV9fa2VybmVsX3VpZF90IHVpZDsKKwlfX2tlcm5lbF9naWRfdCBnaWQ7CisJX19rZXJuZWxfbW9kZV90IGZpbGVfbW9kZTsKKwlfX2tlcm5lbF9tb2RlX3QgZGlyX21vZGU7Cit9OworCisjZGVmaW5lIE5DUF9NT1VOVF9WRVJTSU9OX1Y0CSg0KQkvKiBCaW5hcnkgb3IgdGV4dCAqLworCitzdHJ1Y3QgbmNwX21vdW50X2RhdGFfdjQgeworCWludCB2ZXJzaW9uOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIE5DUF9NT1VOVF8qIGZsYWdzICovCisJLyogTUlQUyB1c2VzIGxvbmcgX19rZXJuZWxfdWlkX3QsIGJ1dC4uLiAqLworCS8qIHdlIG5lZXZlciBwYXNzIC0xLCBzbyBpdCBpcyBzYWZlICovCisJdW5zaWduZWQgbG9uZyBtb3VudGVkX3VpZDsJLyogV2hvIG1heSB1bW91bnQoKSB0aGlzIGZpbGVzeXN0ZW0/ICovCisJLyogTUlQUyB1c2VzIGxvbmcgX19rZXJuZWxfcGlkX3QgKi8KKwlsb25nIHdkb2dfcGlkOwkJLyogV2hvIGNhcmVzIGZvciBvdXIgd2F0Y2hkb2cgcGFja2V0cz8gKi8KKworCXVuc2lnbmVkIGludCBuY3BfZmQ7CS8qIFRoZSBzb2NrZXQgdG8gdGhlIG5jcCBwb3J0ICovCisJdW5zaWduZWQgaW50IHRpbWVfb3V0OwkvKiBIb3cgbG9uZyBzaG91bGQgSSB3YWl0IGFmdGVyCisJCQkJICAgc2VuZGluZyBhIE5DUCByZXF1ZXN0PyAqLworCXVuc2lnbmVkIGludCByZXRyeV9jb3VudDsJLyogQW5kIGhvdyBvZnRlbiBzaG91bGQgSSByZXRyeT8gKi8KKworCS8qIE1JUFMgdXNlcyBsb25nIF9fa2VybmVsX3VpZF90Li4uICovCisJLyogd2UgbmV2ZXIgcGFzcyAtMSwgc28gaXQgaXMgc2FmZSAqLworCXVuc2lnbmVkIGxvbmcgdWlkOworCXVuc2lnbmVkIGxvbmcgZ2lkOworCS8qIE1JUFMgdXNlcyB1bnNpZ25lZCBsb25nIF9fa2VybmVsX21vZGVfdCAqLworCXVuc2lnbmVkIGxvbmcgZmlsZV9tb2RlOworCXVuc2lnbmVkIGxvbmcgZGlyX21vZGU7Cit9OworCisjZGVmaW5lIE5DUF9NT1VOVF9WRVJTSU9OX1Y1CSg1KQkvKiBUZXh0IG9ubHkgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25jcF9uby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uY3Bfbm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGRhYTQ4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uY3Bfbm8uaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9OQ1BfTk8KKyNkZWZpbmUgX05DUF9OTworCisvKiB0aGVzZSBkZWZpbmUgdGhlIGF0dHJpYnV0ZSBieXRlIGFzIHNlZW4gYnkgTkNQICovCisjZGVmaW5lIGFST05MWQkJCShfX2NwdV90b19sZTMyKDEpKQorI2RlZmluZSBhSElEREVOCQkJKF9fY3B1X3RvX2xlMzIoMikpCisjZGVmaW5lIGFTWVNURU0JCQkoX19jcHVfdG9fbGUzMig0KSkKKyNkZWZpbmUgYUVYRUNVVEUJCShfX2NwdV90b19sZTMyKDgpKQorI2RlZmluZSBhRElSCQkJKF9fY3B1X3RvX2xlMzIoMHgxMCkpCisjZGVmaW5lIGFBUkNICQkJKF9fY3B1X3RvX2xlMzIoMHgyMCkpCisjZGVmaW5lIGFTSEFSRUQJCQkoX19jcHVfdG9fbGUzMigweDgwKSkKKyNkZWZpbmUgYURPTlRTVUJBTExPQ0FURQkoX19jcHVfdG9fbGUzMigxTDw8MTEpKQorI2RlZmluZSBhVFJBTlNBQ1RJT05BTAkJKF9fY3B1X3RvX2xlMzIoMUw8PDEyKSkKKyNkZWZpbmUgYVBVUkdFCQkJKF9fY3B1X3RvX2xlMzIoMUw8PDE2KSkKKyNkZWZpbmUgYVJFTkFNRUlOSElCSVQJCShfX2NwdV90b19sZTMyKDFMPDwxNykpCisjZGVmaW5lIGFERUxFVEVJTkhJQklUCQkoX19jcHVfdG9fbGUzMigxTDw8MTgpKQorI2RlZmluZSBhRE9OVENPTVBSRVNTCQkoX19jcHVfdG9fbGUzMigxTDw8MjcpKQorCisjZW5kaWYgLyogX05DUF9OTyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZWlnaGJvdXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmVpZ2hib3VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwMDNiNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmVpZ2hib3VyLmgKQEAgLTAsMCArMSwxNTUgQEAKKyNpZm5kZWYgX19MSU5VWF9ORUlHSEJPVVJfSAorI2RlZmluZSBfX0xJTlVYX05FSUdIQk9VUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworc3RydWN0IG5kbXNnIHsKKwlfX3U4CQluZG1fZmFtaWx5OworCV9fdTgJCW5kbV9wYWQxOworCV9fdTE2CQluZG1fcGFkMjsKKwlfX3MzMgkJbmRtX2lmaW5kZXg7CisJX191MTYJCW5kbV9zdGF0ZTsKKwlfX3U4CQluZG1fZmxhZ3M7CisJX191OAkJbmRtX3R5cGU7Cit9OworCitlbnVtIHsKKwlOREFfVU5TUEVDLAorCU5EQV9EU1QsCisJTkRBX0xMQUREUiwKKwlOREFfQ0FDSEVJTkZPLAorCU5EQV9QUk9CRVMsCisJX19OREFfTUFYCit9OworCisjZGVmaW5lIE5EQV9NQVggKF9fTkRBX01BWCAtIDEpCisKKy8qCisgKglOZWlnaGJvciBDYWNoZSBFbnRyeSBGbGFncworICovCisKKyNkZWZpbmUgTlRGX1VTRQkJMHgwMQorI2RlZmluZSBOVEZfUFJPWFkJMHgwOAkvKiA9PSBBVEZfUFVCTCAqLworI2RlZmluZSBOVEZfUk9VVEVSCTB4ODAKKworLyoKKyAqCU5laWdoYm9yIENhY2hlIEVudHJ5IFN0YXRlcy4KKyAqLworCisjZGVmaW5lIE5VRF9JTkNPTVBMRVRFCTB4MDEKKyNkZWZpbmUgTlVEX1JFQUNIQUJMRQkweDAyCisjZGVmaW5lIE5VRF9TVEFMRQkweDA0CisjZGVmaW5lIE5VRF9ERUxBWQkweDA4CisjZGVmaW5lIE5VRF9QUk9CRQkweDEwCisjZGVmaW5lIE5VRF9GQUlMRUQJMHgyMAorCisvKiBEdW1teSBzdGF0ZXMgKi8KKyNkZWZpbmUgTlVEX05PQVJQCTB4NDAKKyNkZWZpbmUgTlVEX1BFUk1BTkVOVAkweDgwCisjZGVmaW5lIE5VRF9OT05FCTB4MDAKKworLyogTlVEX05PQVJQICYgTlVEX1BFUk1BTkVOVCBhcmUgcHNldWRvc3RhdGVzLCB0aGV5IG5ldmVyIGNoYW5nZQorICAgYW5kIG1ha2Ugbm8gYWRkcmVzcyByZXNvbHV0aW9uIG9yIE5VRC4KKyAgIE5VRF9QRVJNQU5FTlQgaXMgYWxzbyBjYW5ub3QgYmUgZGVsZXRlZCBieSBnYXJiYWdlIGNvbGxlY3RvcnMuCisgKi8KKworc3RydWN0IG5kYV9jYWNoZWluZm8geworCV9fdTMyCQluZG1fY29uZmlybWVkOworCV9fdTMyCQluZG1fdXNlZDsKKwlfX3UzMgkJbmRtX3VwZGF0ZWQ7CisJX191MzIJCW5kbV9yZWZjbnQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlOZWlnaGJvdXIgdGFibGVzIHNwZWNpZmljIG1lc3NhZ2VzLgorICoKKyAqIFRvIHJldHJpZXZlIHRoZSBuZWlnaGJvdXIgdGFibGVzIHNlbmQgUlRNX0dFVE5FSUdIVEJMIHdpdGggdGhlCisgKiBOTE1fRl9EVU1QIGZsYWcgc2V0LiBFdmVyeSBuZWlnaGJvdXIgdGFibGUgY29uZmlndXJhdGlvbiBpcworICogc3ByZWFkIG92ZXIgbXVsdGlwbGUgbWVzc2FnZXMgdG8gYXZvaWQgcnVubmluZyBpbnRvIG1lc3NhZ2UKKyAqIHNpemUgbGltaXRzIG9uIHN5c3RlbXMgd2l0aCBtYW55IGludGVyZmFjZXMuIFRoZSBmaXJzdCBtZXNzYWdlCisgKiBpbiB0aGUgc2VxdWVuY2UgdHJhbnNwb3J0cyBhbGwgbm90IGRldmljZSBzcGVjaWZpYyBkYXRhIHN1Y2ggYXMKKyAqIHN0YXRpc3RpY3MsIGNvbmZpZ3VyYXRpb24sIGFuZCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIgc2V0LgorICogVGhpcyBtZXNzYWdlIGlzIGZvbGxvd2VkIGJ5IDAuLm4gbWVzc2FnZXMgY2FycnlpbmcgZGV2aWNlCisgKiBzcGVjaWZpYyBwYXJhbWV0ZXIgc2V0cy4KKyAqIEFsdGhvdWdoIHRoZSBvcmRlcmluZyBzaG91bGQgYmUgc3VmZmljaWVudCwgTkRUQV9OQU1FIGNhbiBiZQorICogdXNlZCB0byBpZGVudGlmeSBzZXF1ZW5jZXMuIFRoZSBpbml0aWFsIG1lc3NhZ2UgY2FuIGJlIGlkZW50aWZpZWQKKyAqIGJ5IGNoZWNraW5nIGZvciBORFRBX0NPTkZJRy4gVGhlIGRldmljZSBzcGVjaWZpYyBtZXNzYWdlcyBkbworICogbm90IGNvbnRhaW4gdGhpcyBUTFYgYnV0IGhhdmUgTkRUUEFfSUZJTkRFWCBzZXQgdG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIGludGVyZmFjZSBpbmRleC4KKyAqCisgKiBUbyBjaGFuZ2UgbmVpZ2hib3VyIHRhYmxlIGF0dHJpYnV0ZXMsIHNlbmQgUlRNX1NFVE5FSUdIVEJMCisgKiB3aXRoIE5EVEFfTkFNRSBzZXQuIENoYW5nZWFibGUgYXR0cmlidXRlIGluY2x1ZGUgTkRUQV9USFJFU0hbMS0zXSwKKyAqIE5EVEFfR0NfSU5URVJWQUwsIGFuZCBhbGwgVExWcyBpbiBORFRBX1BBUk1TIHVubGVzcyBtYXJrZWQKKyAqIG90aGVyd2lzZS4gRGV2aWNlIHNwZWNpZmljIHBhcmFtZXRlciBzZXRzIGNhbiBiZSBjaGFuZ2VkIGJ5CisgKiBzZXR0aW5nIE5EVFBBX0lGSU5ERVggdG8gdGhlIGludGVyZmFjZSBpbmRleCBvZiB0aGUgY29ycmVzcG9uZGluZworICogZGV2aWNlLgorICoqKiovCisKK3N0cnVjdCBuZHRfc3RhdHMgeworCV9fdTY0CQluZHRzX2FsbG9jczsKKwlfX3U2NAkJbmR0c19kZXN0cm95czsKKwlfX3U2NAkJbmR0c19oYXNoX2dyb3dzOworCV9fdTY0CQluZHRzX3Jlc19mYWlsZWQ7CisJX191NjQJCW5kdHNfbG9va3VwczsKKwlfX3U2NAkJbmR0c19oaXRzOworCV9fdTY0CQluZHRzX3Jjdl9wcm9iZXNfbWNhc3Q7CisJX191NjQJCW5kdHNfcmN2X3Byb2Jlc191Y2FzdDsKKwlfX3U2NAkJbmR0c19wZXJpb2RpY19nY19ydW5zOworCV9fdTY0CQluZHRzX2ZvcmNlZF9nY19ydW5zOworfTsKKworZW51bSB7CisJTkRUUEFfVU5TUEVDLAorCU5EVFBBX0lGSU5ERVgsCQkJLyogdTMyLCB1bmNoYW5nZWFibGUgKi8KKwlORFRQQV9SRUZDTlQsCQkJLyogdTMyLCByZWFkLW9ubHkgKi8KKwlORFRQQV9SRUFDSEFCTEVfVElNRSwJCS8qIHU2NCwgcmVhZC1vbmx5LCBtc2VjcyAqLworCU5EVFBBX0JBU0VfUkVBQ0hBQkxFX1RJTUUsCS8qIHU2NCwgbXNlY3MgKi8KKwlORFRQQV9SRVRSQU5TX1RJTUUsCQkvKiB1NjQsIG1zZWNzICovCisJTkRUUEFfR0NfU1RBTEVUSU1FLAkJLyogdTY0LCBtc2VjcyAqLworCU5EVFBBX0RFTEFZX1BST0JFX1RJTUUsCQkvKiB1NjQsIG1zZWNzICovCisJTkRUUEFfUVVFVUVfTEVOLAkJLyogdTMyICovCisJTkRUUEFfQVBQX1BST0JFUywJCS8qIHUzMiAqLworCU5EVFBBX1VDQVNUX1BST0JFUywJCS8qIHUzMiAqLworCU5EVFBBX01DQVNUX1BST0JFUywJCS8qIHUzMiAqLworCU5EVFBBX0FOWUNBU1RfREVMQVksCQkvKiB1NjQsIG1zZWNzICovCisJTkRUUEFfUFJPWFlfREVMQVksCQkvKiB1NjQsIG1zZWNzICovCisJTkRUUEFfUFJPWFlfUUxFTiwJCS8qIHUzMiAqLworCU5EVFBBX0xPQ0tUSU1FLAkJCS8qIHU2NCwgbXNlY3MgKi8KKwlfX05EVFBBX01BWAorfTsKKyNkZWZpbmUgTkRUUEFfTUFYIChfX05EVFBBX01BWCAtIDEpCisKK3N0cnVjdCBuZHRtc2cgeworCV9fdTgJCW5kdG1fZmFtaWx5OworCV9fdTgJCW5kdG1fcGFkMTsKKwlfX3UxNgkJbmR0bV9wYWQyOworfTsKKworc3RydWN0IG5kdF9jb25maWcgeworCV9fdTE2CQluZHRjX2tleV9sZW47CisJX191MTYJCW5kdGNfZW50cnlfc2l6ZTsKKwlfX3UzMgkJbmR0Y19lbnRyaWVzOworCV9fdTMyCQluZHRjX2xhc3RfZmx1c2g7CS8qIGRlbHRhIHRvIG5vdyBpbiBtc2VjcyAqLworCV9fdTMyCQluZHRjX2xhc3RfcmFuZDsJCS8qIGRlbHRhIHRvIG5vdyBpbiBtc2VjcyAqLworCV9fdTMyCQluZHRjX2hhc2hfcm5kOworCV9fdTMyCQluZHRjX2hhc2hfbWFzazsKKwlfX3UzMgkJbmR0Y19oYXNoX2NoYWluX2djOworCV9fdTMyCQluZHRjX3Byb3h5X3FsZW47Cit9OworCitlbnVtIHsKKwlORFRBX1VOU1BFQywKKwlORFRBX05BTUUsCQkJLyogY2hhciAqLCB1bmNoYW5nZWFibGUgKi8KKwlORFRBX1RIUkVTSDEsCQkJLyogdTMyICovCisJTkRUQV9USFJFU0gyLAkJCS8qIHUzMiAqLworCU5EVEFfVEhSRVNIMywJCQkvKiB1MzIgKi8KKwlORFRBX0NPTkZJRywJCQkvKiBzdHJ1Y3QgbmR0X2NvbmZpZywgcmVhZC1vbmx5ICovCisJTkRUQV9QQVJNUywJCQkvKiBuZXN0ZWQgVExWIE5EVFBBXyogKi8KKwlORFRBX1NUQVRTLAkJCS8qIHN0cnVjdCBuZHRfc3RhdHMsIHJlYWQtb25seSAqLworCU5EVEFfR0NfSU5URVJWQUwsCQkvKiB1NjQsIG1zZWNzICovCisJX19ORFRBX01BWAorfTsKKyNkZWZpbmUgTkRUQV9NQVggKF9fTkRUQV9NQVggLSAxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Nzc1NjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldC5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTT0NLRVQgbmV0d29yayBhY2Nlc3MgcHJvdG9jb2wuCisgKgkJVGhpcyBpcyB0aGUgbWFzdGVyIGhlYWRlciBmaWxlIGZvciB0aGUgTGludXggTkVUIGxheWVyLAorICoJCW9yLCBpbiBwbGFpbiBFbmdsaXNoOiB0aGUgbmV0d29ya2luZyBoYW5kbGluZyBwYXJ0IG9mIHRoZQorICoJCWtlcm5lbC4KKyAqCisgKiBWZXJzaW9uOglAKCMpbmV0LmgJMS4wLjMJMDUvMjUvOTMKKyAqCisgKiBBdXRob3JzOglPcmVzdCBaYm9yb3dza2ksIDxvYnpAS29kYWsuQ09NPgorICoJCVJvc3MgQmlybworICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9MSU5VWF9ORVRfSAorI2RlZmluZSBfTElOVVhfTkVUX0gKKworI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGFzbS9zb2NrZXQuaD4KKworI2RlZmluZSBOUFJPVE8JCUFGX01BWAorCisjZGVmaW5lIFNZU19TT0NLRVQJMQkJLyogc3lzX3NvY2tldCgyKQkJKi8KKyNkZWZpbmUgU1lTX0JJTkQJMgkJLyogc3lzX2JpbmQoMikJCQkqLworI2RlZmluZSBTWVNfQ09OTkVDVAkzCQkvKiBzeXNfY29ubmVjdCgyKQkJKi8KKyNkZWZpbmUgU1lTX0xJU1RFTgk0CQkvKiBzeXNfbGlzdGVuKDIpCQkqLworI2RlZmluZSBTWVNfQUNDRVBUCTUJCS8qIHN5c19hY2NlcHQoMikJCSovCisjZGVmaW5lIFNZU19HRVRTT0NLTkFNRQk2CQkvKiBzeXNfZ2V0c29ja25hbWUoMikJCSovCisjZGVmaW5lIFNZU19HRVRQRUVSTkFNRQk3CQkvKiBzeXNfZ2V0cGVlcm5hbWUoMikJCSovCisjZGVmaW5lIFNZU19TT0NLRVRQQUlSCTgJCS8qIHN5c19zb2NrZXRwYWlyKDIpCQkqLworI2RlZmluZSBTWVNfU0VORAk5CQkvKiBzeXNfc2VuZCgyKQkJCSovCisjZGVmaW5lIFNZU19SRUNWCTEwCQkvKiBzeXNfcmVjdigyKQkJCSovCisjZGVmaW5lIFNZU19TRU5EVE8JMTEJCS8qIHN5c19zZW5kdG8oMikJCSovCisjZGVmaW5lIFNZU19SRUNWRlJPTQkxMgkJLyogc3lzX3JlY3Zmcm9tKDIpCQkqLworI2RlZmluZSBTWVNfU0hVVERPV04JMTMJCS8qIHN5c19zaHV0ZG93bigyKQkJKi8KKyNkZWZpbmUgU1lTX1NFVFNPQ0tPUFQJMTQJCS8qIHN5c19zZXRzb2Nrb3B0KDIpCQkqLworI2RlZmluZSBTWVNfR0VUU09DS09QVAkxNQkJLyogc3lzX2dldHNvY2tvcHQoMikJCSovCisjZGVmaW5lIFNZU19TRU5ETVNHCTE2CQkvKiBzeXNfc2VuZG1zZygyKQkJKi8KKyNkZWZpbmUgU1lTX1JFQ1ZNU0cJMTcJCS8qIHN5c19yZWN2bXNnKDIpCQkqLworI2RlZmluZSBTWVNfQUNDRVBUNAkxOAkJLyogc3lzX2FjY2VwdDQoMikJCSovCisjZGVmaW5lIFNZU19SRUNWTU1TRwkxOQkJLyogc3lzX3JlY3ZtbXNnKDIpCQkqLworI2RlZmluZSBTWVNfU0VORE1NU0cJMjAJCS8qIHN5c19zZW5kbW1zZygyKQkJKi8KKwordHlwZWRlZiBlbnVtIHsKKwlTU19GUkVFID0gMCwJCQkvKiBub3QgYWxsb2NhdGVkCQkqLworCVNTX1VOQ09OTkVDVEVELAkJCS8qIHVuY29ubmVjdGVkIHRvIGFueSBzb2NrZXQJKi8KKwlTU19DT05ORUNUSU5HLAkJCS8qIGluIHByb2Nlc3Mgb2YgY29ubmVjdGluZwkqLworCVNTX0NPTk5FQ1RFRCwJCQkvKiBjb25uZWN0ZWQgdG8gc29ja2V0CQkqLworCVNTX0RJU0NPTk5FQ1RJTkcJCS8qIGluIHByb2Nlc3Mgb2YgZGlzY29ubmVjdGluZwkqLworfSBzb2NrZXRfc3RhdGU7CisKKyNkZWZpbmUgX19TT19BQ0NFUFRDT04JKDEgPDwgMTYpCS8qIHBlcmZvcm1lZCBhIGxpc3RlbgkJKi8KKworI2VuZGlmCS8qIF9MSU5VWF9ORVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRfZHJvcG1vbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRfZHJvcG1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNzM5NDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldF9kcm9wbW9uLmgKQEAgLTAsMCArMSw2NCBAQAorI2lmbmRlZiBfX05FVF9EUk9QTU9OX0gKKyNkZWZpbmUgX19ORVRfRFJPUE1PTl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworc3RydWN0IG5ldF9kbV9kcm9wX3BvaW50IHsKKwlfX3U4IHBjWzhdOworCV9fdTMyIGNvdW50OworfTsKKworI2RlZmluZSBpc19kcm9wX3BvaW50X2h3KHgpIGRvIHtcCisJaW50IF9fX19pLCBfX19fajtcCisJZm9yIChfX19faSA9IDA7IF9fX19pIDwgODsgaSBfX19faSsrKVwKKwkJX19fX2ogfD0geFtfX19faV07XAorCV9fX19qO1wKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTkVUX0RNX0NGR19WRVJTSU9OICAwCisjZGVmaW5lIE5FVF9ETV9DRkdfQUxFUlRfQ09VTlQgIDEKKyNkZWZpbmUgTkVUX0RNX0NGR19BTEVSVF9ERUxBWSAyCisjZGVmaW5lIE5FVF9ETV9DRkdfTUFYIDMKKworc3RydWN0IG5ldF9kbV9jb25maWdfZW50cnkgeworCV9fdTMyIHR5cGU7CisJX191NjQgZGF0YSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7Cit9OworCitzdHJ1Y3QgbmV0X2RtX2NvbmZpZ19tc2cgeworCV9fdTMyIGVudHJpZXM7CisJc3RydWN0IG5ldF9kbV9jb25maWdfZW50cnkgb3B0aW9uc1swXTsKK307CisKK3N0cnVjdCBuZXRfZG1fYWxlcnRfbXNnIHsKKwlfX3UzMiBlbnRyaWVzOworCXN0cnVjdCBuZXRfZG1fZHJvcF9wb2ludCBwb2ludHNbMF07Cit9OworCitzdHJ1Y3QgbmV0X2RtX3VzZXJfbXNnIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBuZXRfZG1fY29uZmlnX21zZyB1c2VyOworCQlzdHJ1Y3QgbmV0X2RtX2FsZXJ0X21zZyBhbGVydDsKKwl9IHU7Cit9OworCisKKy8qIFRoZXNlIGFyZSB0aGUgbmV0bGluayBtZXNzYWdlIHR5cGVzIGZvciB0aGlzIHByb3RvY29sICovCisKK2VudW0geworCU5FVF9ETV9DTURfVU5TUEVDID0gMCwKKwlORVRfRE1fQ01EX0FMRVJULAorCU5FVF9ETV9DTURfQ09ORklHLAorCU5FVF9ETV9DTURfU1RBUlQsCisJTkVUX0RNX0NNRF9TVE9QLAorCV9ORVRfRE1fQ01EX01BWCwKK307CisKKyNkZWZpbmUgTkVUX0RNX0NNRF9NQVggKF9ORVRfRE1fQ01EX01BWCAtIDEpCisKKy8qCisgKiBPdXIgZ3JvdXAgaWRlbnRpZmllcnMKKyAqLworI2RlZmluZSBORVRfRE1fR1JQX0FMRVJUIDEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRfdHN0YW1wLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldF90c3RhbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTVkZjEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRfdHN0YW1wLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBVc2Vyc3BhY2UgQVBJIGZvciBoYXJkd2FyZSB0aW1lIHN0YW1waW5nIG9mIG5ldHdvcmsgcGFja2V0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDA5IEludGVsIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFBhdHJpY2sgT2hseSA8cGF0cmljay5vaGx5QGludGVsLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfTkVUX1RJTUVTVEFNUElOR19ICisjZGVmaW5lIF9ORVRfVElNRVNUQU1QSU5HX0gKKworI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPiAgIC8qIGZvciBTT19USU1FU1RBTVBJTkcgKi8KKworLyogU09fVElNRVNUQU1QSU5HIGdldHMgYW4gaW50ZWdlciBiaXQgZmllbGQgY29tcHJpc2VkIG9mIHRoZXNlIHZhbHVlcyAqLworZW51bSB7CisJU09GX1RJTUVTVEFNUElOR19UWF9IQVJEV0FSRSA9ICgxPDwwKSwKKwlTT0ZfVElNRVNUQU1QSU5HX1RYX1NPRlRXQVJFID0gKDE8PDEpLAorCVNPRl9USU1FU1RBTVBJTkdfUlhfSEFSRFdBUkUgPSAoMTw8MiksCisJU09GX1RJTUVTVEFNUElOR19SWF9TT0ZUV0FSRSA9ICgxPDwzKSwKKwlTT0ZfVElNRVNUQU1QSU5HX1NPRlRXQVJFID0gKDE8PDQpLAorCVNPRl9USU1FU1RBTVBJTkdfU1lTX0hBUkRXQVJFID0gKDE8PDUpLAorCVNPRl9USU1FU1RBTVBJTkdfUkFXX0hBUkRXQVJFID0gKDE8PDYpLAorCVNPRl9USU1FU1RBTVBJTkdfTUFTSyA9CisJKFNPRl9USU1FU1RBTVBJTkdfUkFXX0hBUkRXQVJFIC0gMSkgfAorCVNPRl9USU1FU1RBTVBJTkdfUkFXX0hBUkRXQVJFCit9OworCisvKioKKyAqIHN0cnVjdCBod3RzdGFtcF9jb25maWcgLSAlU0lPQ1NIV1RTVEFNUCBwYXJhbWV0ZXIKKyAqCisgKiBAZmxhZ3M6CW5vIGZsYWdzIGRlZmluZWQgcmlnaHQgbm93LCBtdXN0IGJlIHplcm8KKyAqIEB0eF90eXBlOglvbmUgb2YgSFdUU1RBTVBfVFhfKgorICogQHJ4X3R5cGU6CW9uZSBvZiBvbmUgb2YgSFdUU1RBTVBfRklMVEVSXyoKKyAqCisgKiAlU0lPQ1NIV1RTVEFNUCBleHBlY3RzIGEgJnN0cnVjdCBpZnJlcSB3aXRoIGEgaWZyX2RhdGEgcG9pbnRlciB0bworICogdGhpcyBzdHJ1Y3R1cmUuIGRldl9pZnNpb2MoKSBpbiB0aGUga2VybmVsIHRha2VzIGNhcmUgb2YgdGhlCisgKiB0cmFuc2xhdGlvbiBiZXR3ZWVuIDMyIGJpdCB1c2Vyc3BhY2UgYW5kIDY0IGJpdCBrZXJuZWwuIFRoZQorICogc3RydWN0dXJlIGlzIGludGVudGlvbmFsbHkgY2hvc2VuIHNvIHRoYXQgaXQgaGFzIHRoZSBzYW1lIGxheW91dCBvbgorICogMzIgYW5kIDY0IGJpdCBzeXN0ZW1zLCBkb24ndCBicmVhayB0aGlzIQorICovCitzdHJ1Y3QgaHd0c3RhbXBfY29uZmlnIHsKKwlpbnQgZmxhZ3M7CisJaW50IHR4X3R5cGU7CisJaW50IHJ4X2ZpbHRlcjsKK307CisKKy8qIHBvc3NpYmxlIHZhbHVlcyBmb3IgaHd0c3RhbXBfY29uZmlnLT50eF90eXBlICovCitlbnVtIGh3dHN0YW1wX3R4X3R5cGVzIHsKKwkvKgorCSAqIE5vIG91dGdvaW5nIHBhY2tldCB3aWxsIG5lZWQgaGFyZHdhcmUgdGltZSBzdGFtcGluZzsKKwkgKiBzaG91bGQgYSBwYWNrZXQgYXJyaXZlIHdoaWNoIGFza3MgZm9yIGl0LCBubyBoYXJkd2FyZQorCSAqIHRpbWUgc3RhbXBpbmcgd2lsbCBiZSBkb25lLgorCSAqLworCUhXVFNUQU1QX1RYX09GRiwKKworCS8qCisJICogRW5hYmxlcyBoYXJkd2FyZSB0aW1lIHN0YW1waW5nIGZvciBvdXRnb2luZyBwYWNrZXRzOworCSAqIHRoZSBzZW5kZXIgb2YgdGhlIHBhY2tldCBkZWNpZGVzIHdoaWNoIGFyZSB0byBiZQorCSAqIHRpbWUgc3RhbXBlZCBieSBzZXR0aW5nICVTT0ZfVElNRVNUQU1QSU5HX1RYX1NPRlRXQVJFCisJICogYmVmb3JlIHNlbmRpbmcgdGhlIHBhY2tldC4KKwkgKi8KKwlIV1RTVEFNUF9UWF9PTiwKKworCS8qCisJICogRW5hYmxlcyB0aW1lIHN0YW1waW5nIGZvciBvdXRnb2luZyBwYWNrZXRzIGp1c3QgYXMKKwkgKiBIV1RTVEFNUF9UWF9PTiBkb2VzLCBidXQgYWxzbyBlbmFibGVzIHRpbWUgc3RhbXAgaW5zZXJ0aW9uCisJICogZGlyZWN0bHkgaW50byBTeW5jIHBhY2tldHMuIEluIHRoaXMgY2FzZSwgdHJhbnNtaXR0ZWQgU3luYworCSAqIHBhY2tldHMgd2lsbCBub3QgcmVjZWl2ZWQgYSB0aW1lIHN0YW1wIHZpYSB0aGUgc29ja2V0IGVycm9yCisJICogcXVldWUuCisJICovCisJSFdUU1RBTVBfVFhfT05FU1RFUF9TWU5DLAorfTsKKworLyogcG9zc2libGUgdmFsdWVzIGZvciBod3RzdGFtcF9jb25maWctPnJ4X2ZpbHRlciAqLworZW51bSBod3RzdGFtcF9yeF9maWx0ZXJzIHsKKwkvKiB0aW1lIHN0YW1wIG5vIGluY29taW5nIHBhY2tldCBhdCBhbGwgKi8KKwlIV1RTVEFNUF9GSUxURVJfTk9ORSwKKworCS8qIHRpbWUgc3RhbXAgYW55IGluY29taW5nIHBhY2tldCAqLworCUhXVFNUQU1QX0ZJTFRFUl9BTEwsCisKKwkvKiByZXR1cm4gdmFsdWU6IHRpbWUgc3RhbXAgYWxsIHBhY2tldHMgcmVxdWVzdGVkIHBsdXMgc29tZSBvdGhlcnMgKi8KKwlIV1RTVEFNUF9GSUxURVJfU09NRSwKKworCS8qIFBUUCB2MSwgVURQLCBhbnkga2luZCBvZiBldmVudCBwYWNrZXQgKi8KKwlIV1RTVEFNUF9GSUxURVJfUFRQX1YxX0w0X0VWRU5ULAorCS8qIFBUUCB2MSwgVURQLCBTeW5jIHBhY2tldCAqLworCUhXVFNUQU1QX0ZJTFRFUl9QVFBfVjFfTDRfU1lOQywKKwkvKiBQVFAgdjEsIFVEUCwgRGVsYXlfcmVxIHBhY2tldCAqLworCUhXVFNUQU1QX0ZJTFRFUl9QVFBfVjFfTDRfREVMQVlfUkVRLAorCS8qIFBUUCB2MiwgVURQLCBhbnkga2luZCBvZiBldmVudCBwYWNrZXQgKi8KKwlIV1RTVEFNUF9GSUxURVJfUFRQX1YyX0w0X0VWRU5ULAorCS8qIFBUUCB2MiwgVURQLCBTeW5jIHBhY2tldCAqLworCUhXVFNUQU1QX0ZJTFRFUl9QVFBfVjJfTDRfU1lOQywKKwkvKiBQVFAgdjIsIFVEUCwgRGVsYXlfcmVxIHBhY2tldCAqLworCUhXVFNUQU1QX0ZJTFRFUl9QVFBfVjJfTDRfREVMQVlfUkVRLAorCisJLyogODAyLkFTMSwgRXRoZXJuZXQsIGFueSBraW5kIG9mIGV2ZW50IHBhY2tldCAqLworCUhXVFNUQU1QX0ZJTFRFUl9QVFBfVjJfTDJfRVZFTlQsCisJLyogODAyLkFTMSwgRXRoZXJuZXQsIFN5bmMgcGFja2V0ICovCisJSFdUU1RBTVBfRklMVEVSX1BUUF9WMl9MMl9TWU5DLAorCS8qIDgwMi5BUzEsIEV0aGVybmV0LCBEZWxheV9yZXEgcGFja2V0ICovCisJSFdUU1RBTVBfRklMVEVSX1BUUF9WMl9MMl9ERUxBWV9SRVEsCisKKwkvKiBQVFAgdjIvODAyLkFTMSwgYW55IGxheWVyLCBhbnkga2luZCBvZiBldmVudCBwYWNrZXQgKi8KKwlIV1RTVEFNUF9GSUxURVJfUFRQX1YyX0VWRU5ULAorCS8qIFBUUCB2Mi84MDIuQVMxLCBhbnkgbGF5ZXIsIFN5bmMgcGFja2V0ICovCisJSFdUU1RBTVBfRklMVEVSX1BUUF9WMl9TWU5DLAorCS8qIFBUUCB2Mi84MDIuQVMxLCBhbnkgbGF5ZXIsIERlbGF5X3JlcSBwYWNrZXQgKi8KKwlIV1RTVEFNUF9GSUxURVJfUFRQX1YyX0RFTEFZX1JFUSwKK307CisKKyNlbmRpZiAvKiBfTkVUX1RJTUVTVEFNUElOR19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzEwZTAyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCURlZmluaXRpb25zIGZvciB0aGUgSW50ZXJmYWNlcyBoYW5kbGVyLgorICoKKyAqIFZlcnNpb246CUAoIylkZXYuaAkxLjAuMTAJMDgvMTIvOTMKKyAqCisgKiBBdXRob3JzOglSb3NzIEJpcm8KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQlDb3JleSBNaW55YXJkIDx3Zi1yY2ghbWlueWFyZEByZWxheS5FVS5uZXQ+CisgKgkJRG9uYWxkIEouIEJlY2tlciwgPGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdj4KKyAqCQlBbGFuIENveCwgPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KKyAqCQlCam9ybiBFa3dhbGwuIDxiajBybkBibG94LnNlPgorICogICAgICAgICAgICAgIFBla2thIFJpaWtvbmVuIDxwcmlpa29uZUBwb3NlaWRvbi5wc3B0LmZpPgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCQlNb3ZlZCB0byAvdXNyL2luY2x1ZGUvbGludXggZm9yIE5FVDMKKyAqLworI2lmbmRlZiBfTElOVVhfTkVUREVWSUNFX0gKKyNkZWZpbmUgX0xJTlVYX05FVERFVklDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfbGluay5oPgorCisKKyNkZWZpbmUgTUFYX0FERFJfTEVOCTMyCQkvKiBMYXJnZXN0IGhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoICovCisKKy8qIEluaXRpYWwgbmV0IGRldmljZSBncm91cC4gQWxsIGRldmljZXMgYmVsb25nIHRvIGdyb3VwIDAgYnkgZGVmYXVsdC4gKi8KKyNkZWZpbmUgSU5JVF9ORVRERVZfR1JPVVAJMAorCisKKworLyogTWVkaWEgc2VsZWN0aW9uIG9wdGlvbnMuICovCitlbnVtIHsKKyAgICAgICAgSUZfUE9SVF9VTktOT1dOID0gMCwKKyAgICAgICAgSUZfUE9SVF8xMEJBU0UyLAorICAgICAgICBJRl9QT1JUXzEwQkFTRVQsCisgICAgICAgIElGX1BPUlRfQVVJLAorICAgICAgICBJRl9QT1JUXzEwMEJBU0VULAorICAgICAgICBJRl9QT1JUXzEwMEJBU0VUWCwKKyAgICAgICAgSUZfUE9SVF8xMDBCQVNFRlgKK307CisKKworI2VuZGlmCS8qIF9MSU5VWF9ORVRERVZJQ0VfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3NzEzMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKQEAgLTAsMCArMSw2OSBAQAorI2lmbmRlZiBfX0xJTlVYX05FVEZJTFRFUl9ICisjZGVmaW5lIF9fTElOVVhfTkVURklMVEVSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworLyogUmVzcG9uc2VzIGZyb20gaG9vayBmdW5jdGlvbnMuICovCisjZGVmaW5lIE5GX0RST1AgMAorI2RlZmluZSBORl9BQ0NFUFQgMQorI2RlZmluZSBORl9TVE9MRU4gMgorI2RlZmluZSBORl9RVUVVRSAzCisjZGVmaW5lIE5GX1JFUEVBVCA0CisjZGVmaW5lIE5GX1NUT1AgNQorI2RlZmluZSBORl9NQVhfVkVSRElDVCBORl9TVE9QCisKKy8qIHdlIG92ZXJsb2FkIHRoZSBoaWdoZXIgYml0cyBmb3IgZW5jb2RpbmcgYXV4aWxpYXJ5IGRhdGEgc3VjaCBhcyB0aGUgcXVldWUKKyAqIG51bWJlciBvciBlcnJubyB2YWx1ZXMuIE5vdCBuaWNlLCBidXQgYmV0dGVyIHRoYW4gYWRkaXRpb25hbCBmdW5jdGlvbgorICogYXJndW1lbnRzLiAqLworI2RlZmluZSBORl9WRVJESUNUX01BU0sgMHgwMDAwMDBmZgorCisvKiBleHRyYSB2ZXJkaWN0IGZsYWdzIGhhdmUgbWFzayAweDAwMDBmZjAwICovCisjZGVmaW5lIE5GX1ZFUkRJQ1RfRkxBR19RVUVVRV9CWVBBU1MJMHgwMDAwODAwMAorCisvKiBxdWV1ZSBudW1iZXIgKE5GX1FVRVVFKSBvciBlcnJubyAoTkZfRFJPUCkgKi8KKyNkZWZpbmUgTkZfVkVSRElDVF9RTUFTSyAweGZmZmYwMDAwCisjZGVmaW5lIE5GX1ZFUkRJQ1RfUUJJVFMgMTYKKworI2RlZmluZSBORl9RVUVVRV9OUih4KSAoKCgoeCkgPDwgMTYpICYgTkZfVkVSRElDVF9RTUFTSykgfCBORl9RVUVVRSkKKworI2RlZmluZSBORl9EUk9QX0VSUih4KSAoKCgteCkgPDwgMTYpIHwgTkZfRFJPUCkKKworLyogb25seSBmb3IgdXNlcnNwYWNlIGNvbXBhdGliaWxpdHkgKi8KKy8qIEdlbmVyaWMgY2FjaGUgcmVzcG9uc2VzIGZyb20gaG9vayBmdW5jdGlvbnMuCisgICA8PSAweDIwMDAgaXMgdXNlZCBmb3IgcHJvdG9jb2wtZmxhZ3MuICovCisjZGVmaW5lIE5GQ19VTktOT1dOIDB4NDAwMAorI2RlZmluZSBORkNfQUxURVJFRCAweDgwMDAKKworLyogTkZfVkVSRElDVF9CSVRTIHNob3VsZCBiZSA4IG5vdywgYnV0IHVzZXJzcGFjZSBtaWdodCBicmVhayBpZiB0aGlzIGNoYW5nZXMgKi8KKyNkZWZpbmUgTkZfVkVSRElDVF9CSVRTIDE2CisKK2VudW0gbmZfaW5ldF9ob29rcyB7CisJTkZfSU5FVF9QUkVfUk9VVElORywKKwlORl9JTkVUX0xPQ0FMX0lOLAorCU5GX0lORVRfRk9SV0FSRCwKKwlORl9JTkVUX0xPQ0FMX09VVCwKKwlORl9JTkVUX1BPU1RfUk9VVElORywKKwlORl9JTkVUX05VTUhPT0tTCit9OworCitlbnVtIHsKKwlORlBST1RPX1VOU1BFQyA9ICAwLAorCU5GUFJPVE9fSVBWNCAgID0gIDIsCisJTkZQUk9UT19BUlAgICAgPSAgMywKKwlORlBST1RPX0JSSURHRSA9ICA3LAorCU5GUFJPVE9fSVBWNiAgID0gMTAsCisJTkZQUk9UT19ERUNORVQgPSAxMiwKKwlORlBST1RPX05VTVBST1RPLAorfTsKKwordW5pb24gbmZfaW5ldF9hZGRyIHsKKwlfX3UzMgkJYWxsWzRdOworCV9fYmUzMgkJaXA7CisJX19iZTMyCQlpcDZbNF07CisJc3RydWN0IGluX2FkZHIJaW47CisJc3RydWN0IGluNl9hZGRyCWluNjsKK307CisKKyNlbmRpZiAvKl9fTElOVVhfTkVURklMVEVSX0gqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWViMmQ2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0LmgKQEAgLTAsMCArMSwxNzIgQEAKKyNpZm5kZWYgX0lQX1NFVF9ICisjZGVmaW5lIF9JUF9TRVRfSAorCisvKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBKb2FraW0gQXhlbHNzb24gPGdvemVtQGxpbnV4Lm51PgorICogICAgICAgICAgICAgICAgICAgICAgICAgUGF0cmljayBTY2hhYWYgPGJvZkBib2YuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBNYXJ0aW4gSm9zZWZzc29uIDxnYW5kYWxmQHdsdWcud2VzdGJvLnNlPgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMTEgSm96c2VmIEthZGxlY3NpayA8a2FkbGVjQGJsYWNraG9sZS5rZmtpLmh1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworLyogVGhlIHByb3RvY29sIHZlcnNpb24gKi8KKyNkZWZpbmUgSVBTRVRfUFJPVE9DT0wJCTYKKworLyogVGhlIG1heCBsZW5ndGggb2Ygc3RyaW5ncyBpbmNsdWRpbmcgTlVMOiBzZXQgYW5kIHR5cGUgaWRlbnRpZmllcnMgKi8KKyNkZWZpbmUgSVBTRVRfTUFYTkFNRUxFTgkzMgorCisvKiBNZXNzYWdlIHR5cGVzIGFuZCBjb21tYW5kcyAqLworZW51bSBpcHNldF9jbWQgeworCUlQU0VUX0NNRF9OT05FLAorCUlQU0VUX0NNRF9QUk9UT0NPTCwJLyogMTogUmV0dXJuIHByb3RvY29sIHZlcnNpb24gKi8KKwlJUFNFVF9DTURfQ1JFQVRFLAkvKiAyOiBDcmVhdGUgYSBuZXcgKGVtcHR5KSBzZXQgKi8KKwlJUFNFVF9DTURfREVTVFJPWSwJLyogMzogRGVzdHJveSBhIChlbXB0eSkgc2V0ICovCisJSVBTRVRfQ01EX0ZMVVNILAkvKiA0OiBSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gYSBzZXQgKi8KKwlJUFNFVF9DTURfUkVOQU1FLAkvKiA1OiBSZW5hbWUgYSBzZXQgKi8KKwlJUFNFVF9DTURfU1dBUCwJCS8qIDY6IFN3YXAgdHdvIHNldHMgKi8KKwlJUFNFVF9DTURfTElTVCwJCS8qIDc6IExpc3Qgc2V0cyAqLworCUlQU0VUX0NNRF9TQVZFLAkJLyogODogU2F2ZSBzZXRzICovCisJSVBTRVRfQ01EX0FERCwJCS8qIDk6IEFkZCBhbiBlbGVtZW50IHRvIGEgc2V0ICovCisJSVBTRVRfQ01EX0RFTCwJCS8qIDEwOiBEZWxldGUgYW4gZWxlbWVudCBmcm9tIGEgc2V0ICovCisJSVBTRVRfQ01EX1RFU1QsCQkvKiAxMTogVGVzdCBhbiBlbGVtZW50IGluIGEgc2V0ICovCisJSVBTRVRfQ01EX0hFQURFUiwJLyogMTI6IEdldCBzZXQgaGVhZGVyIGRhdGEgb25seSAqLworCUlQU0VUX0NNRF9UWVBFLAkJLyogMTM6IEdldCBzZXQgdHlwZSAqLworCUlQU0VUX01TR19NQVgsCQkvKiBOZXRsaW5rIG1lc3NhZ2UgY29tbWFuZHMgKi8KKworCS8qIENvbW1hbmRzIGluIHVzZXJzcGFjZTogKi8KKwlJUFNFVF9DTURfUkVTVE9SRSA9IElQU0VUX01TR19NQVgsIC8qIDE0OiBFbnRlciByZXN0b3JlIG1vZGUgKi8KKwlJUFNFVF9DTURfSEVMUCwJCS8qIDE1OiBHZXQgaGVscCAqLworCUlQU0VUX0NNRF9WRVJTSU9OLAkvKiAxNjogR2V0IHByb2dyYW0gdmVyc2lvbiAqLworCUlQU0VUX0NNRF9RVUlULAkJLyogMTc6IFF1aXQgZnJvbSBpbnRlcmFjdGl2ZSBtb2RlICovCisKKwlJUFNFVF9DTURfTUFYLAorCisJSVBTRVRfQ01EX0NPTU1JVCA9IElQU0VUX0NNRF9NQVgsIC8qIDE4OiBDb21taXQgYnVmZmVyZWQgY29tbWFuZHMgKi8KK307CisKKy8qIEF0dHJpYnV0ZXMgYXQgY29tbWFuZCBsZXZlbCAqLworZW51bSB7CisJSVBTRVRfQVRUUl9VTlNQRUMsCisJSVBTRVRfQVRUUl9QUk9UT0NPTCwJLyogMTogUHJvdG9jb2wgdmVyc2lvbiAqLworCUlQU0VUX0FUVFJfU0VUTkFNRSwJLyogMjogTmFtZSBvZiB0aGUgc2V0ICovCisJSVBTRVRfQVRUUl9UWVBFTkFNRSwJLyogMzogVHlwZW5hbWUgKi8KKwlJUFNFVF9BVFRSX1NFVE5BTUUyID0gSVBTRVRfQVRUUl9UWVBFTkFNRSwgLyogU2V0bmFtZSBhdCByZW5hbWUvc3dhcCAqLworCUlQU0VUX0FUVFJfUkVWSVNJT04sCS8qIDQ6IFNldHR5cGUgcmV2aXNpb24gKi8KKwlJUFNFVF9BVFRSX0ZBTUlMWSwJLyogNTogU2V0dHlwZSBmYW1pbHkgKi8KKwlJUFNFVF9BVFRSX0ZMQUdTLAkvKiA2OiBGbGFncyBhdCBjb21tYW5kIGxldmVsICovCisJSVBTRVRfQVRUUl9EQVRBLAkvKiA3OiBOZXN0ZWQgYXR0cmlidXRlcyAqLworCUlQU0VUX0FUVFJfQURULAkJLyogODogTXVsdGlwbGUgZGF0YSBjb250YWluZXJzICovCisJSVBTRVRfQVRUUl9MSU5FTk8sCS8qIDk6IFJlc3RvcmUgbGluZW5vICovCisJSVBTRVRfQVRUUl9QUk9UT0NPTF9NSU4sIC8qIDEwOiBNaW5pbWFsIHN1cHBvcnRlZCB2ZXJzaW9uIG51bWJlciAqLworCUlQU0VUX0FUVFJfUkVWSVNJT05fTUlOCT0gSVBTRVRfQVRUUl9QUk9UT0NPTF9NSU4sIC8qIHR5cGUgcmV2IG1pbiAqLworCV9fSVBTRVRfQVRUUl9DTURfTUFYLAorfTsKKyNkZWZpbmUgSVBTRVRfQVRUUl9DTURfTUFYCShfX0lQU0VUX0FUVFJfQ01EX01BWCAtIDEpCisKKy8qIENBRFQgc3BlY2lmaWMgYXR0cmlidXRlcyAqLworZW51bSB7CisJSVBTRVRfQVRUUl9JUCA9IElQU0VUX0FUVFJfVU5TUEVDICsgMSwKKwlJUFNFVF9BVFRSX0lQX0ZST00gPSBJUFNFVF9BVFRSX0lQLAorCUlQU0VUX0FUVFJfSVBfVE8sCS8qIDIgKi8KKwlJUFNFVF9BVFRSX0NJRFIsCS8qIDMgKi8KKwlJUFNFVF9BVFRSX1BPUlQsCS8qIDQgKi8KKwlJUFNFVF9BVFRSX1BPUlRfRlJPTSA9IElQU0VUX0FUVFJfUE9SVCwKKwlJUFNFVF9BVFRSX1BPUlRfVE8sCS8qIDUgKi8KKwlJUFNFVF9BVFRSX1RJTUVPVVQsCS8qIDYgKi8KKwlJUFNFVF9BVFRSX1BST1RPLAkvKiA3ICovCisJSVBTRVRfQVRUUl9DQURUX0ZMQUdTLAkvKiA4ICovCisJSVBTRVRfQVRUUl9DQURUX0xJTkVOTyA9IElQU0VUX0FUVFJfTElORU5PLAkvKiA5ICovCisJLyogUmVzZXJ2ZSBlbXB0eSBzbG90cyAqLworCUlQU0VUX0FUVFJfQ0FEVF9NQVggPSAxNiwKKwkvKiBDcmVhdGUtb25seSBzcGVjaWZpYyBhdHRyaWJ1dGVzICovCisJSVBTRVRfQVRUUl9HQywKKwlJUFNFVF9BVFRSX0hBU0hTSVpFLAorCUlQU0VUX0FUVFJfTUFYRUxFTSwKKwlJUFNFVF9BVFRSX05FVE1BU0ssCisJSVBTRVRfQVRUUl9QUk9CRVMsCisJSVBTRVRfQVRUUl9SRVNJWkUsCisJSVBTRVRfQVRUUl9TSVpFLAorCS8qIEtlcm5lbC1vbmx5ICovCisJSVBTRVRfQVRUUl9FTEVNRU5UUywKKwlJUFNFVF9BVFRSX1JFRkVSRU5DRVMsCisJSVBTRVRfQVRUUl9NRU1TSVpFLAorCisJX19JUFNFVF9BVFRSX0NSRUFURV9NQVgsCit9OworI2RlZmluZSBJUFNFVF9BVFRSX0NSRUFURV9NQVgJKF9fSVBTRVRfQVRUUl9DUkVBVEVfTUFYIC0gMSkKKworLyogQURUIHNwZWNpZmljIGF0dHJpYnV0ZXMgKi8KK2VudW0geworCUlQU0VUX0FUVFJfRVRIRVIgPSBJUFNFVF9BVFRSX0NBRFRfTUFYICsgMSwKKwlJUFNFVF9BVFRSX05BTUUsCisJSVBTRVRfQVRUUl9OQU1FUkVGLAorCUlQU0VUX0FUVFJfSVAyLAorCUlQU0VUX0FUVFJfQ0lEUjIsCisJSVBTRVRfQVRUUl9JUDJfVE8sCisJSVBTRVRfQVRUUl9JRkFDRSwKKwlfX0lQU0VUX0FUVFJfQURUX01BWCwKK307CisjZGVmaW5lIElQU0VUX0FUVFJfQURUX01BWAkoX19JUFNFVF9BVFRSX0FEVF9NQVggLSAxKQorCisvKiBJUCBzcGVjaWZpYyBhdHRyaWJ1dGVzICovCitlbnVtIHsKKwlJUFNFVF9BVFRSX0lQQUREUl9JUFY0ID0gSVBTRVRfQVRUUl9VTlNQRUMgKyAxLAorCUlQU0VUX0FUVFJfSVBBRERSX0lQVjYsCisJX19JUFNFVF9BVFRSX0lQQUREUl9NQVgsCit9OworI2RlZmluZSBJUFNFVF9BVFRSX0lQQUREUl9NQVgJKF9fSVBTRVRfQVRUUl9JUEFERFJfTUFYIC0gMSkKKworLyogRXJyb3IgY29kZXMgKi8KK2VudW0gaXBzZXRfZXJybm8geworCUlQU0VUX0VSUl9QUklWQVRFID0gNDA5NiwKKwlJUFNFVF9FUlJfUFJPVE9DT0wsCisJSVBTRVRfRVJSX0ZJTkRfVFlQRSwKKwlJUFNFVF9FUlJfTUFYX1NFVFMsCisJSVBTRVRfRVJSX0JVU1ksCisJSVBTRVRfRVJSX0VYSVNUX1NFVE5BTUUyLAorCUlQU0VUX0VSUl9UWVBFX01JU01BVENILAorCUlQU0VUX0VSUl9FWElTVCwKKwlJUFNFVF9FUlJfSU5WQUxJRF9DSURSLAorCUlQU0VUX0VSUl9JTlZBTElEX05FVE1BU0ssCisJSVBTRVRfRVJSX0lOVkFMSURfRkFNSUxZLAorCUlQU0VUX0VSUl9USU1FT1VULAorCUlQU0VUX0VSUl9SRUZFUkVOQ0VELAorCUlQU0VUX0VSUl9JUEFERFJfSVBWNCwKKwlJUFNFVF9FUlJfSVBBRERSX0lQVjYsCisKKwkvKiBUeXBlIHNwZWNpZmljIGVycm9yIGNvZGVzICovCisJSVBTRVRfRVJSX1RZUEVfU1BFQ0lGSUMgPSA0MzUyLAorfTsKKworLyogRmxhZ3MgYXQgY29tbWFuZCBsZXZlbCAqLworZW51bSBpcHNldF9jbWRfZmxhZ3MgeworCUlQU0VUX0ZMQUdfQklUX0VYSVNUCT0gMCwKKwlJUFNFVF9GTEFHX0VYSVNUCT0gKDEgPDwgSVBTRVRfRkxBR19CSVRfRVhJU1QpLAorCUlQU0VUX0ZMQUdfQklUX0xJU1RfU0VUTkFNRSA9IDEsCisJSVBTRVRfRkxBR19MSVNUX1NFVE5BTUUJPSAoMSA8PCBJUFNFVF9GTEFHX0JJVF9MSVNUX1NFVE5BTUUpLAorCUlQU0VUX0ZMQUdfQklUX0xJU1RfSEVBREVSID0gMiwKKwlJUFNFVF9GTEFHX0xJU1RfSEVBREVSCT0gKDEgPDwgSVBTRVRfRkxBR19CSVRfTElTVF9IRUFERVIpLAorfTsKKworLyogRmxhZ3MgYXQgQ0FEVCBhdHRyaWJ1dGUgbGV2ZWwgKi8KK2VudW0gaXBzZXRfY2FkdF9mbGFncyB7CisJSVBTRVRfRkxBR19CSVRfQkVGT1JFCT0gMCwKKwlJUFNFVF9GTEFHX0JFRk9SRQk9ICgxIDw8IElQU0VUX0ZMQUdfQklUX0JFRk9SRSksCisJSVBTRVRfRkxBR19CSVRfUEhZU0RFVgk9IDEsCisJSVBTRVRfRkxBR19QSFlTREVWCT0gKDEgPDwgSVBTRVRfRkxBR19CSVRfUEhZU0RFViksCit9OworCisvKiBDb21tYW5kcyB3aXRoIHNldHR5cGUtc3BlY2lmaWMgYXR0cmlidXRlcyAqLworZW51bSBpcHNldF9hZHQgeworCUlQU0VUX0FERCwKKwlJUFNFVF9ERUwsCisJSVBTRVRfVEVTVCwKKwlJUFNFVF9BRFRfTUFYLAorCUlQU0VUX0NSRUFURSA9IElQU0VUX0FEVF9NQVgsCisJSVBTRVRfQ0FEVF9NQVgsCit9OworCisKKyNlbmRpZiAvKl9JUF9TRVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2JpdG1hcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2JpdG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MWEyOGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYml0bWFwLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfX0lQX1NFVF9CSVRNQVBfSAorI2RlZmluZSBfX0lQX1NFVF9CSVRNQVBfSAorCisvKiBCaXRtYXAgdHlwZSBzcGVjaWZpYyBlcnJvciBjb2RlcyAqLworZW51bSB7CisJLyogVGhlIGVsZW1lbnQgaXMgb3V0IG9mIHRoZSByYW5nZSBvZiB0aGUgc2V0ICovCisJSVBTRVRfRVJSX0JJVE1BUF9SQU5HRSA9IElQU0VUX0VSUl9UWVBFX1NQRUNJRklDLAorCS8qIFRoZSByYW5nZSBleGNlZWRzIHRoZSBzaXplIGxpbWl0IG9mIHRoZSBzZXQgdHlwZSAqLworCUlQU0VUX0VSUl9CSVRNQVBfUkFOR0VfU0laRSwKK307CisKKworI2VuZGlmIC8qIF9fSVBfU0VUX0JJVE1BUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGFjNmNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2guaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9fSVBfU0VUX0hBU0hfSAorI2RlZmluZSBfX0lQX1NFVF9IQVNIX0gKKworLyogSGFzaCB0eXBlIHNwZWNpZmljIGVycm9yIGNvZGVzICovCitlbnVtIHsKKwkvKiBIYXNoIGlzIGZ1bGwgKi8KKwlJUFNFVF9FUlJfSEFTSF9GVUxMID0gSVBTRVRfRVJSX1RZUEVfU1BFQ0lGSUMsCisJLyogTnVsbC12YWx1ZWQgZWxlbWVudCAqLworCUlQU0VUX0VSUl9IQVNIX0VMRU0sCisJLyogSW52YWxpZCBwcm90b2NvbCAqLworCUlQU0VUX0VSUl9JTlZBTElEX1BST1RPLAorCS8qIFByb3RvY29sIG1pc3NpbmcgYnV0IG11c3QgYmUgc3BlY2lmaWVkICovCisJSVBTRVRfRVJSX01JU1NJTkdfUFJPVE8sCisJLyogUmFuZ2Ugbm90IHN1cHBvcnRlZCAqLworCUlQU0VUX0VSUl9IQVNIX1JBTkdFX1VOU1VQUE9SVEVELAorCS8qIEludmFsaWQgcmFuZ2UgKi8KKwlJUFNFVF9FUlJfSEFTSF9SQU5HRSwKK307CisKKworI2VuZGlmIC8qIF9fSVBfU0VUX0hBU0hfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2xpc3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlNjE3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9saXN0LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfX0lQX1NFVF9MSVNUX0gKKyNkZWZpbmUgX19JUF9TRVRfTElTVF9ICisKKy8qIExpc3QgdHlwZSBzcGVjaWZpYyBlcnJvciBjb2RlcyAqLworZW51bSB7CisJLyogU2V0IG5hbWUgdG8gYmUgYWRkZWQvZGVsZXRlZC90ZXN0ZWQgZG9lcyBub3QgZXhpc3QuICovCisJSVBTRVRfRVJSX05BTUUgPSBJUFNFVF9FUlJfVFlQRV9TUEVDSUZJQywKKwkvKiBsaXN0OnNldCB0eXBlIGlzIG5vdCBwZXJtaXR0ZWQgdG8gYWRkICovCisJSVBTRVRfRVJSX0xPT1AsCisJLyogTWlzc2luZyByZWZlcmVuY2Ugc2V0ICovCisJSVBTRVRfRVJSX0JFRk9SRSwKKwkvKiBSZWZlcmVuY2Ugc2V0IGRvZXMgbm90IGV4aXN0ICovCisJSVBTRVRfRVJSX05BTUVSRUYsCisJLyogU2V0IGlzIGZ1bGwgKi8KKwlJUFNFVF9FUlJfTElTVF9GVUxMLAorCS8qIFJlZmVyZW5jZSBzZXQgaXMgbm90IGFkZGVkIHRvIHRoZSBzZXQgKi8KKwlJUFNFVF9FUlJfUkVGX0VYSVNULAorfTsKKworCisjZW5kaWYgLyogX19JUF9TRVRfTElTVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhYTUyZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaApAQCAtMCwwICsxLDExMyBAQAorI2lmbmRlZiBfTkZfQ09OTlRSQUNLX0NPTU1PTl9ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfQ09NTU9OX0gKKy8qIENvbm5lY3Rpb24gc3RhdGUgdHJhY2tpbmcgZm9yIG5ldGZpbHRlci4gIFRoaXMgaXMgc2VwYXJhdGVkIGZyb20sCisgICBidXQgcmVxdWlyZWQgYnksIHRoZSBOQVQgbGF5ZXI7IGl0IGNhbiBhbHNvIGJlIHVzZWQgYnkgYW4gaXB0YWJsZXMKKyAgIGV4dGVuc2lvbi4gKi8KK2VudW0gaXBfY29ubnRyYWNrX2luZm8geworCS8qIFBhcnQgb2YgYW4gZXN0YWJsaXNoZWQgY29ubmVjdGlvbiAoZWl0aGVyIGRpcmVjdGlvbikuICovCisJSVBfQ1RfRVNUQUJMSVNIRUQsCisKKwkvKiBMaWtlIE5FVywgYnV0IHJlbGF0ZWQgdG8gYW4gZXhpc3RpbmcgY29ubmVjdGlvbiwgb3IgSUNNUCBlcnJvcgorCSAgIChpbiBlaXRoZXIgZGlyZWN0aW9uKS4gKi8KKwlJUF9DVF9SRUxBVEVELAorCisJLyogU3RhcnRlZCBhIG5ldyBjb25uZWN0aW9uIHRvIHRyYWNrIChvbmx5CisgICAgICAgICAgIElQX0NUX0RJUl9PUklHSU5BTCk7IG1heSBiZSBhIHJldHJhbnNtaXNzaW9uLiAqLworCUlQX0NUX05FVywKKworCS8qID49IHRoaXMgaW5kaWNhdGVzIHJlcGx5IGRpcmVjdGlvbiAqLworCUlQX0NUX0lTX1JFUExZLAorCisJSVBfQ1RfRVNUQUJMSVNIRURfUkVQTFkgPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZLAorCUlQX0NUX1JFTEFURURfUkVQTFkgPSBJUF9DVF9SRUxBVEVEICsgSVBfQ1RfSVNfUkVQTFksCisJSVBfQ1RfTkVXX1JFUExZID0gSVBfQ1RfTkVXICsgSVBfQ1RfSVNfUkVQTFksCQorCS8qIE51bWJlciBvZiBkaXN0aW5jdCBJUF9DVCB0eXBlcyAobm8gTkVXIGluIHJlcGx5IGRpcm4pLiAqLworCUlQX0NUX05VTUJFUiA9IElQX0NUX0lTX1JFUExZICogMiAtIDEKK307CisKKy8qIEJpdHNldCByZXByZXNlbnRpbmcgc3RhdHVzIG9mIGNvbm5lY3Rpb24uICovCitlbnVtIGlwX2Nvbm50cmFja19zdGF0dXMgeworCS8qIEl0J3MgYW4gZXhwZWN0ZWQgY29ubmVjdGlvbjogYml0IDAgc2V0LiAgVGhpcyBiaXQgbmV2ZXIgY2hhbmdlZCAqLworCUlQU19FWFBFQ1RFRF9CSVQgPSAwLAorCUlQU19FWFBFQ1RFRCA9ICgxIDw8IElQU19FWFBFQ1RFRF9CSVQpLAorCisJLyogV2UndmUgc2VlbiBwYWNrZXRzIGJvdGggd2F5czogYml0IDEgc2V0LiAgQ2FuIGJlIHNldCwgbm90IHVuc2V0LiAqLworCUlQU19TRUVOX1JFUExZX0JJVCA9IDEsCisJSVBTX1NFRU5fUkVQTFkgPSAoMSA8PCBJUFNfU0VFTl9SRVBMWV9CSVQpLAorCisJLyogQ29ubnRyYWNrIHNob3VsZCBuZXZlciBiZSBlYXJseS1leHBpcmVkLiAqLworCUlQU19BU1NVUkVEX0JJVCA9IDIsCisJSVBTX0FTU1VSRUQgPSAoMSA8PCBJUFNfQVNTVVJFRF9CSVQpLAorCisJLyogQ29ubmVjdGlvbiBpcyBjb25maXJtZWQ6IG9yaWdpbmF0aW5nIHBhY2tldCBoYXMgbGVmdCBib3ggKi8KKwlJUFNfQ09ORklSTUVEX0JJVCA9IDMsCisJSVBTX0NPTkZJUk1FRCA9ICgxIDw8IElQU19DT05GSVJNRURfQklUKSwKKworCS8qIENvbm5lY3Rpb24gbmVlZHMgc3JjIG5hdCBpbiBvcmlnIGRpci4gIFRoaXMgYml0IG5ldmVyIGNoYW5nZWQuICovCisJSVBTX1NSQ19OQVRfQklUID0gNCwKKwlJUFNfU1JDX05BVCA9ICgxIDw8IElQU19TUkNfTkFUX0JJVCksCisKKwkvKiBDb25uZWN0aW9uIG5lZWRzIGRzdCBuYXQgaW4gb3JpZyBkaXIuICBUaGlzIGJpdCBuZXZlciBjaGFuZ2VkLiAqLworCUlQU19EU1RfTkFUX0JJVCA9IDUsCisJSVBTX0RTVF9OQVQgPSAoMSA8PCBJUFNfRFNUX05BVF9CSVQpLAorCisJLyogQm90aCB0b2dldGhlci4gKi8KKwlJUFNfTkFUX01BU0sgPSAoSVBTX0RTVF9OQVQgfCBJUFNfU1JDX05BVCksCisKKwkvKiBDb25uZWN0aW9uIG5lZWRzIFRDUCBzZXF1ZW5jZSBhZGp1c3RlZC4gKi8KKwlJUFNfU0VRX0FESlVTVF9CSVQgPSA2LAorCUlQU19TRVFfQURKVVNUID0gKDEgPDwgSVBTX1NFUV9BREpVU1RfQklUKSwKKworCS8qIE5BVCBpbml0aWFsaXphdGlvbiBiaXRzLiAqLworCUlQU19TUkNfTkFUX0RPTkVfQklUID0gNywKKwlJUFNfU1JDX05BVF9ET05FID0gKDEgPDwgSVBTX1NSQ19OQVRfRE9ORV9CSVQpLAorCisJSVBTX0RTVF9OQVRfRE9ORV9CSVQgPSA4LAorCUlQU19EU1RfTkFUX0RPTkUgPSAoMSA8PCBJUFNfRFNUX05BVF9ET05FX0JJVCksCisKKwkvKiBCb3RoIHRvZ2V0aGVyICovCisJSVBTX05BVF9ET05FX01BU0sgPSAoSVBTX0RTVF9OQVRfRE9ORSB8IElQU19TUkNfTkFUX0RPTkUpLAorCisJLyogQ29ubmVjdGlvbiBpcyBkeWluZyAocmVtb3ZlZCBmcm9tIGxpc3RzKSwgY2FuIG5vdCBiZSB1bnNldC4gKi8KKwlJUFNfRFlJTkdfQklUID0gOSwKKwlJUFNfRFlJTkcgPSAoMSA8PCBJUFNfRFlJTkdfQklUKSwKKworCS8qIENvbm5lY3Rpb24gaGFzIGZpeGVkIHRpbWVvdXQuICovCisJSVBTX0ZJWEVEX1RJTUVPVVRfQklUID0gMTAsCisJSVBTX0ZJWEVEX1RJTUVPVVQgPSAoMSA8PCBJUFNfRklYRURfVElNRU9VVF9CSVQpLAorCisJLyogQ29ubnRyYWNrIGlzIGEgdGVtcGxhdGUgKi8KKwlJUFNfVEVNUExBVEVfQklUID0gMTEsCisJSVBTX1RFTVBMQVRFID0gKDEgPDwgSVBTX1RFTVBMQVRFX0JJVCksCisKKwkvKiBDb25udHJhY2sgaXMgYSBmYWtlIHVudHJhY2tlZCBlbnRyeSAqLworCUlQU19VTlRSQUNLRURfQklUID0gMTIsCisJSVBTX1VOVFJBQ0tFRCA9ICgxIDw8IElQU19VTlRSQUNLRURfQklUKSwKK307CisKKy8qIENvbm5lY3Rpb24gdHJhY2tpbmcgZXZlbnQgdHlwZXMgKi8KK2VudW0gaXBfY29ubnRyYWNrX2V2ZW50cyB7CisJSVBDVF9ORVcsCQkvKiBuZXcgY29ubnRyYWNrICovCisJSVBDVF9SRUxBVEVELAkJLyogcmVsYXRlZCBjb25udHJhY2sgKi8KKwlJUENUX0RFU1RST1ksCQkvKiBkZXN0cm95ZWQgY29ubnRyYWNrICovCisJSVBDVF9SRVBMWSwJCS8qIGNvbm5lY3Rpb24gaGFzIHNlZW4gdHdvLXdheSB0cmFmZmljICovCisJSVBDVF9BU1NVUkVELAkJLyogY29ubmVjdGlvbiBzdGF0dXMgaGFzIGNoYW5nZWQgdG8gYXNzdXJlZCAqLworCUlQQ1RfUFJPVE9JTkZPLAkJLyogcHJvdG9jb2wgaW5mb3JtYXRpb24gaGFzIGNoYW5nZWQgKi8KKwlJUENUX0hFTFBFUiwJCS8qIG5ldyBoZWxwZXIgaGFzIGJlZW4gc2V0ICovCisJSVBDVF9NQVJLLAkJLyogbmV3IG1hcmsgaGFzIGJlZW4gc2V0ICovCisJSVBDVF9OQVRTRVFBREosCQkvKiBOQVQgaXMgZG9pbmcgc2VxdWVuY2UgYWRqdXN0bWVudCAqLworCUlQQ1RfU0VDTUFSSywJCS8qIG5ldyBzZWN1cml0eSBtYXJrIGhhcyBiZWVuIHNldCAqLworfTsKKworZW51bSBpcF9jb25udHJhY2tfZXhwZWN0X2V2ZW50cyB7CisJSVBFWFBfTkVXLAkJLyogbmV3IGV4cGVjdGF0aW9uICovCisJSVBFWFBfREVTVFJPWSwJCS8qIGRlc3Ryb3llZCBleHBlY3RhdGlvbiAqLworfTsKKworLyogZXhwZWN0YXRpb24gZmxhZ3MgKi8KKyNkZWZpbmUgTkZfQ1RfRVhQRUNUX1BFUk1BTkVOVAkJMHgxCisjZGVmaW5lIE5GX0NUX0VYUEVDVF9JTkFDVElWRQkJMHgyCisjZGVmaW5lIE5GX0NUX0VYUEVDVF9VU0VSU1BBQ0UJCTB4NAorCisKKyNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyMmZhYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9ORl9DT05OVFJBQ0tfRlRQX0gKKyNkZWZpbmUgX05GX0NPTk5UUkFDS19GVFBfSAorLyogRlRQIHRyYWNraW5nLiAqLworCisvKiBUaGlzIGVudW0gaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UgKi8KK2VudW0gbmZfY3RfZnRwX3R5cGUgeworCS8qIFBPUlQgY29tbWFuZCBmcm9tIGNsaWVudCAqLworCU5GX0NUX0ZUUF9QT1JULAorCS8qIFBBU1YgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgKi8KKwlORl9DVF9GVFBfUEFTViwKKwkvKiBFUFJUIGNvbW1hbmQgZnJvbSBjbGllbnQgKi8KKwlORl9DVF9GVFBfRVBSVCwKKwkvKiBFUFNWIHJlc3BvbnNlIGZyb20gc2VydmVyICovCisJTkZfQ1RfRlRQX0VQU1YsCit9OworCisKKyNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX0ZUUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2N0cC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NjdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWVlZmU2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NjdHAuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9ORl9DT05OVFJBQ0tfU0NUUF9ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfU0NUUF9ICisvKiBTQ1RQIHRyYWNraW5nLiAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZV9jb21tb24uaD4KKworZW51bSBzY3RwX2Nvbm50cmFjayB7CisJU0NUUF9DT05OVFJBQ0tfTk9ORSwKKwlTQ1RQX0NPTk5UUkFDS19DTE9TRUQsCisJU0NUUF9DT05OVFJBQ0tfQ09PS0lFX1dBSVQsCisJU0NUUF9DT05OVFJBQ0tfQ09PS0lFX0VDSE9FRCwKKwlTQ1RQX0NPTk5UUkFDS19FU1RBQkxJU0hFRCwKKwlTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9TRU5ULAorCVNDVFBfQ09OTlRSQUNLX1NIVVRET1dOX1JFQ0QsCisJU0NUUF9DT05OVFJBQ0tfU0hVVERPV05fQUNLX1NFTlQsCisJU0NUUF9DT05OVFJBQ0tfTUFYCit9OworCitzdHJ1Y3QgaXBfY3Rfc2N0cCB7CisJZW51bSBzY3RwX2Nvbm50cmFjayBzdGF0ZTsKKworCV9fYmUzMiB2dGFnW0lQX0NUX0RJUl9NQVhdOworfTsKKworI2VuZGlmIC8qIF9ORl9DT05OVFJBQ0tfU0NUUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGNwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5MWFiOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaApAQCAtMCwwICsxLDQ4IEBACisjaWZuZGVmIF9ORl9DT05OVFJBQ0tfVENQX0gKKyNkZWZpbmUgX05GX0NPTk5UUkFDS19UQ1BfSAorLyogVENQIHRyYWNraW5nLiAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogVGhpcyBpcyBleHBvc2VkIHRvIHVzZXJzcGFjZSAoY3RuZXRsaW5rKSAqLworZW51bSB0Y3BfY29ubnRyYWNrIHsKKwlUQ1BfQ09OTlRSQUNLX05PTkUsCisJVENQX0NPTk5UUkFDS19TWU5fU0VOVCwKKwlUQ1BfQ09OTlRSQUNLX1NZTl9SRUNWLAorCVRDUF9DT05OVFJBQ0tfRVNUQUJMSVNIRUQsCisJVENQX0NPTk5UUkFDS19GSU5fV0FJVCwKKwlUQ1BfQ09OTlRSQUNLX0NMT1NFX1dBSVQsCisJVENQX0NPTk5UUkFDS19MQVNUX0FDSywKKwlUQ1BfQ09OTlRSQUNLX1RJTUVfV0FJVCwKKwlUQ1BfQ09OTlRSQUNLX0NMT1NFLAorCVRDUF9DT05OVFJBQ0tfTElTVEVOLAkvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBUQ1BfQ09OTlRSQUNLX1NZTl9TRU5UMglUQ1BfQ09OTlRSQUNLX0xJU1RFTgorCVRDUF9DT05OVFJBQ0tfTUFYLAorCVRDUF9DT05OVFJBQ0tfSUdOT1JFCit9OworCisvKiBXaW5kb3cgc2NhbGluZyBpcyBhZHZlcnRpc2VkIGJ5IHRoZSBzZW5kZXIgKi8KKyNkZWZpbmUgSVBfQ1RfVENQX0ZMQUdfV0lORE9XX1NDQUxFCQkweDAxCisKKy8qIFNBQ0sgaXMgcGVybWl0dGVkIGJ5IHRoZSBzZW5kZXIgKi8KKyNkZWZpbmUgSVBfQ1RfVENQX0ZMQUdfU0FDS19QRVJNCQkweDAyCisKKy8qIFRoaXMgc2VuZGVyIHNlbnQgRklOIGZpcnN0ICovCisjZGVmaW5lIElQX0NUX1RDUF9GTEFHX0NMT1NFX0lOSVQJCTB4MDQKKworLyogQmUgbGliZXJhbCBpbiB3aW5kb3cgY2hlY2tpbmcgKi8KKyNkZWZpbmUgSVBfQ1RfVENQX0ZMQUdfQkVfTElCRVJBTAkJMHgwOAorCisvKiBIYXMgdW5hY2tub3dsZWRnZWQgZGF0YSAqLworI2RlZmluZSBJUF9DVF9UQ1BfRkxBR19EQVRBX1VOQUNLTk9XTEVER0VECTB4MTAKKworLyogVGhlIGZpZWxkIHRkX21heGFjayBoYXMgYmVlbiBzZXQgKi8KKyNkZWZpbmUgSVBfQ1RfVENQX0ZMQUdfTUFYQUNLX1NFVAkJMHgyMAorCitzdHJ1Y3QgbmZfY3RfdGNwX2ZsYWdzIHsKKwlfX3U4IGZsYWdzOworCV9fdTggbWFzazsKK307CisKKworI2VuZGlmIC8qIF9ORl9DT05OVFJBQ0tfVENQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZV9jb21tb24uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZV9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWEyMmIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX05GX0NPTk5UUkFDS19UVVBMRV9DT01NT05fSAorI2RlZmluZSBfTkZfQ09OTlRSQUNLX1RVUExFX0NPTU1PTl9ICisKK2VudW0gaXBfY29ubnRyYWNrX2RpciB7CisJSVBfQ1RfRElSX09SSUdJTkFMLAorCUlQX0NUX0RJUl9SRVBMWSwKKwlJUF9DVF9ESVJfTUFYCit9OworCisjZGVmaW5lIENUSU5GTzJESVIoY3RpbmZvKSAoKGN0aW5mbykgPj0gSVBfQ1RfSVNfUkVQTFkgPyBJUF9DVF9ESVJfUkVQTFkgOiBJUF9DVF9ESVJfT1JJR0lOQUwpCisKKyNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX1RVUExFX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTlmZDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9ORk5FVExJTktfSAorI2RlZmluZSBfTkZORVRMSU5LX0gKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29tcGF0Lmg+CisKK2VudW0gbmZuZXRsaW5rX2dyb3VwcyB7CisJTkZOTEdSUF9OT05FLAorI2RlZmluZSBORk5MR1JQX05PTkUJCQlORk5MR1JQX05PTkUKKwlORk5MR1JQX0NPTk5UUkFDS19ORVcsCisjZGVmaW5lIE5GTkxHUlBfQ09OTlRSQUNLX05FVwkJTkZOTEdSUF9DT05OVFJBQ0tfTkVXCisJTkZOTEdSUF9DT05OVFJBQ0tfVVBEQVRFLAorI2RlZmluZSBORk5MR1JQX0NPTk5UUkFDS19VUERBVEUJTkZOTEdSUF9DT05OVFJBQ0tfVVBEQVRFCisJTkZOTEdSUF9DT05OVFJBQ0tfREVTVFJPWSwKKyNkZWZpbmUgTkZOTEdSUF9DT05OVFJBQ0tfREVTVFJPWQlORk5MR1JQX0NPTk5UUkFDS19ERVNUUk9ZCisJTkZOTEdSUF9DT05OVFJBQ0tfRVhQX05FVywKKyNkZWZpbmUJTkZOTEdSUF9DT05OVFJBQ0tfRVhQX05FVwlORk5MR1JQX0NPTk5UUkFDS19FWFBfTkVXCisJTkZOTEdSUF9DT05OVFJBQ0tfRVhQX1VQREFURSwKKyNkZWZpbmUgTkZOTEdSUF9DT05OVFJBQ0tfRVhQX1VQREFURQlORk5MR1JQX0NPTk5UUkFDS19FWFBfVVBEQVRFCisJTkZOTEdSUF9DT05OVFJBQ0tfRVhQX0RFU1RST1ksCisjZGVmaW5lIE5GTkxHUlBfQ09OTlRSQUNLX0VYUF9ERVNUUk9ZCU5GTkxHUlBfQ09OTlRSQUNLX0VYUF9ERVNUUk9ZCisJX19ORk5MR1JQX01BWCwKK307CisjZGVmaW5lIE5GTkxHUlBfTUFYCShfX05GTkxHUlBfTUFYIC0gMSkKKworLyogR2VuZXJhbCBmb3JtIG9mIGFkZHJlc3MgZmFtaWx5IGRlcGVuZGVudCBtZXNzYWdlLgorICovCitzdHJ1Y3QgbmZnZW5tc2cgeworCV9fdTggIG5mZ2VuX2ZhbWlseTsJCS8qIEFGX3h4eCAqLworCV9fdTggIHZlcnNpb247CQkvKiBuZm5ldGxpbmsgdmVyc2lvbiAqLworCV9fYmUxNiAgICByZXNfaWQ7CQkvKiByZXNvdXJjZSBpZCAqLworfTsKKworI2RlZmluZSBORk5FVExJTktfVjAJMAorCisvKiBuZXRmaWx0ZXIgbmV0bGluayBtZXNzYWdlIHR5cGVzIGFyZSBzcGxpdCBpbiB0d28gcGllY2VzOgorICogOCBiaXQgc3Vic3lzdGVtLCA4Yml0IG9wZXJhdGlvbi4KKyAqLworCisjZGVmaW5lIE5GTkxfU1VCU1lTX0lEKHgpCSgoeCAmIDB4ZmYwMCkgPj4gOCkKKyNkZWZpbmUgTkZOTF9NU0dfVFlQRSh4KQkoeCAmIDB4MDBmZikKKworLyogTm8gZW51bSBoZXJlLCBvdGhlcndpc2UgX19zdHJpbmdpZnkoKSB0cmljayBvZiBNT0RVTEVfQUxJQVNfTkZOTF9TVUJTWVMoKQorICogd29uJ3Qgd29yayBhbnltb3JlICovCisjZGVmaW5lIE5GTkxfU1VCU1lTX05PTkUgCQkwCisjZGVmaW5lIE5GTkxfU1VCU1lTX0NUTkVUTElOSwkJMQorI2RlZmluZSBORk5MX1NVQlNZU19DVE5FVExJTktfRVhQCTIKKyNkZWZpbmUgTkZOTF9TVUJTWVNfUVVFVUUJCTMKKyNkZWZpbmUgTkZOTF9TVUJTWVNfVUxPRwkJNAorI2RlZmluZSBORk5MX1NVQlNZU19PU0YJCQk1CisjZGVmaW5lIE5GTkxfU1VCU1lTX0lQU0VUCQk2CisjZGVmaW5lIE5GTkxfU1VCU1lTX0NPVU5UCQk3CisKKyNlbmRpZgkvKiBfTkZORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb21wYXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGI5ZTU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2NvbXBhdC5oCkBAIC0wLDAgKzEsNjEgQEAKKyNpZm5kZWYgX05GTkVUTElOS19DT01QQVRfSAorI2RlZmluZSBfTkZORVRMSU5LX0NPTVBBVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBPbGQgbmZuZXRsaW5rIG1hY3JvcyBmb3IgdXNlcnNwYWNlICovCisKKy8qIG5mbmV0bGluayBncm91cHM6IFVwIHRvIDMyIG1heGltdW0gKi8KKyNkZWZpbmUgTkZfTkVUTElOS19DT05OVFJBQ0tfTkVXIAkJMHgwMDAwMDAwMQorI2RlZmluZSBORl9ORVRMSU5LX0NPTk5UUkFDS19VUERBVEUJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTkZfTkVUTElOS19DT05OVFJBQ0tfREVTVFJPWQkJMHgwMDAwMDAwNAorI2RlZmluZSBORl9ORVRMSU5LX0NPTk5UUkFDS19FWFBfTkVXCQkweDAwMDAwMDA4CisjZGVmaW5lIE5GX05FVExJTktfQ09OTlRSQUNLX0VYUF9VUERBVEUJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTkZfTkVUTElOS19DT05OVFJBQ0tfRVhQX0RFU1RST1kJMHgwMDAwMDAyMAorCisvKiBHZW5lcmljIHN0cnVjdHVyZSBmb3IgZW5jYXBzdWxhdGlvbiBvcHRpb25hbCBuZXRmaWx0ZXIgaW5mb3JtYXRpb24uCisgKiBJdCBpcyByZW1pbmlzY2VudCBvZiBzb2NrYWRkciwgYnV0IHdpdGggc2FfZmFtaWx5IHJlcGxhY2VkCisgKiB3aXRoIGF0dHJpYnV0ZSB0eXBlLgorICogISBUaGlzIHNob3VsZCBzb21lZGF5IGJlIHB1dCBzb21ld2hlcmUgZ2VuZXJpYyBhcyBub3cgcnRuZXRsaW5rIGFuZAorICogISBuZm5ldGxpbmsgdXNlIHRoZSBzYW1lIGF0dHJpYnV0ZXMgbWV0aG9kcy4gLSBKLiBTY2h1bGlzdC4KKyAqLworCitzdHJ1Y3QgbmZhdHRyIHsKKwlfX3UxNiBuZmFfbGVuOworCV9fdTE2IG5mYV90eXBlOwkvKiB3ZSB1c2UgMTUgYml0cyBmb3IgdGhlIHR5cGUsIGFuZCB0aGUgaGlnaGVzdAorCQkJCSAqIGJpdCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIG5lc3RlZCAqLworfTsKKworLyogRklYTUU6IEFwYXJ0IGZyb20gTkZOTF9ORkFfTkVTVEVEIHNoYW1lbGVzc2x5IGNvcHkgYW5kIHBhc3RlZCBmcm9tCisgKiBydG5ldGxpbmsuaCwgaXQncyB0aW1lIHRvIHB1dCB0aGlzIGluIGEgZ2VuZXJpYyBmaWxlICovCisKKyNkZWZpbmUgTkZOTF9ORkFfTkVTVAkweDgwMDAKKyNkZWZpbmUgTkZBX1RZUEUoYXR0cikgCSgoYXR0ciktPm5mYV90eXBlICYgMHg3ZmZmKQorCisjZGVmaW5lIE5GQV9BTElHTlRPICAgICA0CisjZGVmaW5lIE5GQV9BTElHTihsZW4pCSgoKGxlbikgKyBORkFfQUxJR05UTyAtIDEpICYgfihORkFfQUxJR05UTyAtIDEpKQorI2RlZmluZSBORkFfT0sobmZhLGxlbikJKChsZW4pID4gMCAmJiAobmZhKS0+bmZhX2xlbiA+PSBzaXplb2Yoc3RydWN0IG5mYXR0cikgXAorCSYmIChuZmEpLT5uZmFfbGVuIDw9IChsZW4pKQorI2RlZmluZSBORkFfTkVYVChuZmEsYXR0cmxlbikJKChhdHRybGVuKSAtPSBORkFfQUxJR04oKG5mYSktPm5mYV9sZW4pLCBcCisJKHN0cnVjdCBuZmF0dHIgKikoKChjaGFyICopKG5mYSkpICsgTkZBX0FMSUdOKChuZmEpLT5uZmFfbGVuKSkpCisjZGVmaW5lIE5GQV9MRU5HVEgobGVuKQkoTkZBX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmZhdHRyKSkgKyAobGVuKSkKKyNkZWZpbmUgTkZBX1NQQUNFKGxlbikJTkZBX0FMSUdOKE5GQV9MRU5HVEgobGVuKSkKKyNkZWZpbmUgTkZBX0RBVEEobmZhKSAgICgodm9pZCAqKSgoKGNoYXIgKikobmZhKSkgKyBORkFfTEVOR1RIKDApKSkKKyNkZWZpbmUgTkZBX1BBWUxPQUQobmZhKSAoKGludCkoKG5mYSktPm5mYV9sZW4pIC0gTkZBX0xFTkdUSCgwKSkKKyNkZWZpbmUgTkZBX05FU1Qoc2tiLCB0eXBlKSBcCisoewlzdHJ1Y3QgbmZhdHRyICpfX3N0YXJ0ID0gKHN0cnVjdCBuZmF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7IFwKKwlORkFfUFVUKHNrYiwgKE5GTkxfTkZBX05FU1QgfCB0eXBlKSwgMCwgTlVMTCk7IFwKKwlfX3N0YXJ0OyAgfSkKKyNkZWZpbmUgTkZBX05FU1RfRU5EKHNrYiwgc3RhcnQpIFwKKyh7ICAgICAgKHN0YXJ0KS0+bmZhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1bnNpZ25lZCBjaGFyICopKHN0YXJ0KTsgXAorICAgICAgICAoc2tiKS0+bGVuOyB9KQorI2RlZmluZSBORkFfTkVTVF9DQU5DRUwoc2tiLCBzdGFydCkgXAorKHsgICAgICBpZiAoc3RhcnQpIFwKKyAgICAgICAgICAgICAgICBza2JfdHJpbShza2IsICh1bnNpZ25lZCBjaGFyICopIChzdGFydCkgLSAoc2tiKS0+ZGF0YSk7IFwKKyAgICAgICAgLTE7IH0pCisKKyNkZWZpbmUgTkZNX05GQShuKSAgICAgICgoc3RydWN0IG5mYXR0ciAqKSgoKGNoYXIgKikobikpIFwKKyAgICAgICAgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSkpKQorI2RlZmluZSBORk1fUEFZTE9BRChuKSAgTkxNU0dfUEFZTE9BRChuLCBzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSkKKworI2VuZGlmIC8qIF9ORk5FVExJTktfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWJmMWFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2Nvbm50cmFjay5oCkBAIC0wLDAgKzEsMTkzIEBACisjaWZuZGVmIF9JUENPTk5UUkFDS19ORVRMSU5LX0gKKyNkZWZpbmUgX0lQQ09OTlRSQUNLX05FVExJTktfSAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaD4KKworZW51bSBjbnRsX21zZ190eXBlcyB7CisJSVBDVE5MX01TR19DVF9ORVcsCisJSVBDVE5MX01TR19DVF9HRVQsCisJSVBDVE5MX01TR19DVF9ERUxFVEUsCisJSVBDVE5MX01TR19DVF9HRVRfQ1RSWkVSTywKKworCUlQQ1ROTF9NU0dfTUFYCit9OworCitlbnVtIGN0bmxfZXhwX21zZ190eXBlcyB7CisJSVBDVE5MX01TR19FWFBfTkVXLAorCUlQQ1ROTF9NU0dfRVhQX0dFVCwKKwlJUENUTkxfTVNHX0VYUF9ERUxFVEUsCisKKwlJUENUTkxfTVNHX0VYUF9NQVgKK307CisKKworZW51bSBjdGF0dHJfdHlwZSB7CisJQ1RBX1VOU1BFQywKKwlDVEFfVFVQTEVfT1JJRywKKwlDVEFfVFVQTEVfUkVQTFksCisJQ1RBX1NUQVRVUywKKwlDVEFfUFJPVE9JTkZPLAorCUNUQV9IRUxQLAorCUNUQV9OQVRfU1JDLAorI2RlZmluZSBDVEFfTkFUCUNUQV9OQVRfU1JDCS8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisJQ1RBX1RJTUVPVVQsCisJQ1RBX01BUkssCisJQ1RBX0NPVU5URVJTX09SSUcsCisJQ1RBX0NPVU5URVJTX1JFUExZLAorCUNUQV9VU0UsCisJQ1RBX0lELAorCUNUQV9OQVRfRFNULAorCUNUQV9UVVBMRV9NQVNURVIsCisJQ1RBX05BVF9TRVFfQURKX09SSUcsCisJQ1RBX05BVF9TRVFfQURKX1JFUExZLAorCUNUQV9TRUNNQVJLLAkJLyogb2Jzb2xldGUgKi8KKwlDVEFfWk9ORSwKKwlDVEFfU0VDQ1RYLAorCUNUQV9USU1FU1RBTVAsCisJX19DVEFfTUFYCit9OworI2RlZmluZSBDVEFfTUFYIChfX0NUQV9NQVggLSAxKQorCitlbnVtIGN0YXR0cl90dXBsZSB7CisJQ1RBX1RVUExFX1VOU1BFQywKKwlDVEFfVFVQTEVfSVAsCisJQ1RBX1RVUExFX1BST1RPLAorCV9fQ1RBX1RVUExFX01BWAorfTsKKyNkZWZpbmUgQ1RBX1RVUExFX01BWCAoX19DVEFfVFVQTEVfTUFYIC0gMSkKKworZW51bSBjdGF0dHJfaXAgeworCUNUQV9JUF9VTlNQRUMsCisJQ1RBX0lQX1Y0X1NSQywKKwlDVEFfSVBfVjRfRFNULAorCUNUQV9JUF9WNl9TUkMsCisJQ1RBX0lQX1Y2X0RTVCwKKwlfX0NUQV9JUF9NQVgKK307CisjZGVmaW5lIENUQV9JUF9NQVggKF9fQ1RBX0lQX01BWCAtIDEpCisKK2VudW0gY3RhdHRyX2w0cHJvdG8geworCUNUQV9QUk9UT19VTlNQRUMsCisJQ1RBX1BST1RPX05VTSwKKwlDVEFfUFJPVE9fU1JDX1BPUlQsCisJQ1RBX1BST1RPX0RTVF9QT1JULAorCUNUQV9QUk9UT19JQ01QX0lELAorCUNUQV9QUk9UT19JQ01QX1RZUEUsCisJQ1RBX1BST1RPX0lDTVBfQ09ERSwKKwlDVEFfUFJPVE9fSUNNUFY2X0lELAorCUNUQV9QUk9UT19JQ01QVjZfVFlQRSwKKwlDVEFfUFJPVE9fSUNNUFY2X0NPREUsCisJX19DVEFfUFJPVE9fTUFYCit9OworI2RlZmluZSBDVEFfUFJPVE9fTUFYIChfX0NUQV9QUk9UT19NQVggLSAxKQorCitlbnVtIGN0YXR0cl9wcm90b2luZm8geworCUNUQV9QUk9UT0lORk9fVU5TUEVDLAorCUNUQV9QUk9UT0lORk9fVENQLAorCUNUQV9QUk9UT0lORk9fRENDUCwKKwlDVEFfUFJPVE9JTkZPX1NDVFAsCisJX19DVEFfUFJPVE9JTkZPX01BWAorfTsKKyNkZWZpbmUgQ1RBX1BST1RPSU5GT19NQVggKF9fQ1RBX1BST1RPSU5GT19NQVggLSAxKQorCitlbnVtIGN0YXR0cl9wcm90b2luZm9fdGNwIHsKKwlDVEFfUFJPVE9JTkZPX1RDUF9VTlNQRUMsCisJQ1RBX1BST1RPSU5GT19UQ1BfU1RBVEUsCisJQ1RBX1BST1RPSU5GT19UQ1BfV1NDQUxFX09SSUdJTkFMLAorCUNUQV9QUk9UT0lORk9fVENQX1dTQ0FMRV9SRVBMWSwKKwlDVEFfUFJPVE9JTkZPX1RDUF9GTEFHU19PUklHSU5BTCwKKwlDVEFfUFJPVE9JTkZPX1RDUF9GTEFHU19SRVBMWSwKKwlfX0NUQV9QUk9UT0lORk9fVENQX01BWAorfTsKKyNkZWZpbmUgQ1RBX1BST1RPSU5GT19UQ1BfTUFYIChfX0NUQV9QUk9UT0lORk9fVENQX01BWCAtIDEpCisKK2VudW0gY3RhdHRyX3Byb3RvaW5mb19kY2NwIHsKKwlDVEFfUFJPVE9JTkZPX0RDQ1BfVU5TUEVDLAorCUNUQV9QUk9UT0lORk9fRENDUF9TVEFURSwKKwlDVEFfUFJPVE9JTkZPX0RDQ1BfUk9MRSwKKwlDVEFfUFJPVE9JTkZPX0RDQ1BfSEFORFNIQUtFX1NFUSwKKwlfX0NUQV9QUk9UT0lORk9fRENDUF9NQVgsCit9OworI2RlZmluZSBDVEFfUFJPVE9JTkZPX0RDQ1BfTUFYIChfX0NUQV9QUk9UT0lORk9fRENDUF9NQVggLSAxKQorCitlbnVtIGN0YXR0cl9wcm90b2luZm9fc2N0cCB7CisJQ1RBX1BST1RPSU5GT19TQ1RQX1VOU1BFQywKKwlDVEFfUFJPVE9JTkZPX1NDVFBfU1RBVEUsCisJQ1RBX1BST1RPSU5GT19TQ1RQX1ZUQUdfT1JJR0lOQUwsCisJQ1RBX1BST1RPSU5GT19TQ1RQX1ZUQUdfUkVQTFksCisJX19DVEFfUFJPVE9JTkZPX1NDVFBfTUFYCit9OworI2RlZmluZSBDVEFfUFJPVE9JTkZPX1NDVFBfTUFYIChfX0NUQV9QUk9UT0lORk9fU0NUUF9NQVggLSAxKQorCitlbnVtIGN0YXR0cl9jb3VudGVycyB7CisJQ1RBX0NPVU5URVJTX1VOU1BFQywKKwlDVEFfQ09VTlRFUlNfUEFDS0VUUywJCS8qIDY0Yml0IGNvdW50ZXJzICovCisJQ1RBX0NPVU5URVJTX0JZVEVTLAkJLyogNjRiaXQgY291bnRlcnMgKi8KKwlDVEFfQ09VTlRFUlMzMl9QQUNLRVRTLAkJLyogb2xkIDMyYml0IGNvdW50ZXJzLCB1bnVzZWQgKi8KKwlDVEFfQ09VTlRFUlMzMl9CWVRFUywJCS8qIG9sZCAzMmJpdCBjb3VudGVycywgdW51c2VkICovCisJX19DVEFfQ09VTlRFUlNfTUFYCit9OworI2RlZmluZSBDVEFfQ09VTlRFUlNfTUFYIChfX0NUQV9DT1VOVEVSU19NQVggLSAxKQorCitlbnVtIGN0YXR0cl90c3RhbXAgeworCUNUQV9USU1FU1RBTVBfVU5TUEVDLAorCUNUQV9USU1FU1RBTVBfU1RBUlQsCisJQ1RBX1RJTUVTVEFNUF9TVE9QLAorCV9fQ1RBX1RJTUVTVEFNUF9NQVgKK307CisjZGVmaW5lIENUQV9USU1FU1RBTVBfTUFYIChfX0NUQV9USU1FU1RBTVBfTUFYIC0gMSkKKworZW51bSBjdGF0dHJfbmF0IHsKKwlDVEFfTkFUX1VOU1BFQywKKwlDVEFfTkFUX01JTklQLAorCUNUQV9OQVRfTUFYSVAsCisJQ1RBX05BVF9QUk9UTywKKwlfX0NUQV9OQVRfTUFYCit9OworI2RlZmluZSBDVEFfTkFUX01BWCAoX19DVEFfTkFUX01BWCAtIDEpCisKK2VudW0gY3RhdHRyX3Byb3RvbmF0IHsKKwlDVEFfUFJPVE9OQVRfVU5TUEVDLAorCUNUQV9QUk9UT05BVF9QT1JUX01JTiwKKwlDVEFfUFJPVE9OQVRfUE9SVF9NQVgsCisJX19DVEFfUFJPVE9OQVRfTUFYCit9OworI2RlZmluZSBDVEFfUFJPVE9OQVRfTUFYIChfX0NUQV9QUk9UT05BVF9NQVggLSAxKQorCitlbnVtIGN0YXR0cl9uYXRzZXEgeworCUNUQV9OQVRfU0VRX1VOU1BFQywKKwlDVEFfTkFUX1NFUV9DT1JSRUNUSU9OX1BPUywKKwlDVEFfTkFUX1NFUV9PRkZTRVRfQkVGT1JFLAorCUNUQV9OQVRfU0VRX09GRlNFVF9BRlRFUiwKKwlfX0NUQV9OQVRfU0VRX01BWAorfTsKKyNkZWZpbmUgQ1RBX05BVF9TRVFfTUFYIChfX0NUQV9OQVRfU0VRX01BWCAtIDEpCisKK2VudW0gY3RhdHRyX2V4cGVjdCB7CisJQ1RBX0VYUEVDVF9VTlNQRUMsCisJQ1RBX0VYUEVDVF9NQVNURVIsCisJQ1RBX0VYUEVDVF9UVVBMRSwKKwlDVEFfRVhQRUNUX01BU0ssCisJQ1RBX0VYUEVDVF9USU1FT1VULAorCUNUQV9FWFBFQ1RfSUQsCisJQ1RBX0VYUEVDVF9IRUxQX05BTUUsCisJQ1RBX0VYUEVDVF9aT05FLAorCUNUQV9FWFBFQ1RfRkxBR1MsCisJX19DVEFfRVhQRUNUX01BWAorfTsKKyNkZWZpbmUgQ1RBX0VYUEVDVF9NQVggKF9fQ1RBX0VYUEVDVF9NQVggLSAxKQorCitlbnVtIGN0YXR0cl9oZWxwIHsKKwlDVEFfSEVMUF9VTlNQRUMsCisJQ1RBX0hFTFBfTkFNRSwKKwlfX0NUQV9IRUxQX01BWAorfTsKKyNkZWZpbmUgQ1RBX0hFTFBfTUFYIChfX0NUQV9IRUxQX01BWCAtIDEpCisKK2VudW0gY3RhdHRyX3NlY2N0eCB7CisJQ1RBX1NFQ0NUWF9VTlNQRUMsCisJQ1RBX1NFQ0NUWF9OQU1FLAorCV9fQ1RBX1NFQ0NUWF9NQVgKK307CisjZGVmaW5lIENUQV9TRUNDVFhfTUFYIChfX0NUQV9TRUNDVFhfTUFYIC0gMSkKKworI2VuZGlmIC8qIF9JUENPTk5UUkFDS19ORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGMyYzk1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5oCkBAIC0wLDAgKzEsOTcgQEAKKyNpZm5kZWYgX05GTkVUTElOS19MT0dfSAorI2RlZmluZSBfTkZORVRMSU5LX0xPR19ICisKKy8qIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIG5ldGxpbmsgbWVzc2FnZXMgKGkuZS4gJ3Byb3RvY29sIHBhY2tldHMnKSwKKyAqIGFuZCBub3QgYW55IGtpbmQgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICBJdCBpcyBzaGFyZWQgYmV0d2VlbiBrZXJuZWwgYW5kCisgKiB1c2Vyc3BhY2UuICBEb24ndCBwdXQga2VybmVsIHNwZWNpZmljIHN0dWZmIGluIGhlcmUgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oPgorCitlbnVtIG5mdWxubF9tc2dfdHlwZXMgeworCU5GVUxOTF9NU0dfUEFDS0VULAkJLyogcGFja2V0IGZyb20ga2VybmVsIHRvIHVzZXJzcGFjZSAqLworCU5GVUxOTF9NU0dfQ09ORklHLAkJLyogY29ubmVjdCB0byBhIHBhcnRpY3VsYXIgcXVldWUgKi8KKworCU5GVUxOTF9NU0dfTUFYCit9OworCitzdHJ1Y3QgbmZ1bG5sX21zZ19wYWNrZXRfaGRyIHsKKwlfX2JlMTYJCWh3X3Byb3RvY29sOwkvKiBodyBwcm90b2NvbCAobmV0d29yayBvcmRlcikgKi8KKwlfX3U4CWhvb2s7CQkvKiBuZXRmaWx0ZXIgaG9vayAqLworCV9fdTgJX3BhZDsKK307CisKK3N0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF9odyB7CisJX19iZTE2CQlod19hZGRybGVuOworCV9fdTE2CV9wYWQ7CisJX191OAlod19hZGRyWzhdOworfTsKKworc3RydWN0IG5mdWxubF9tc2dfcGFja2V0X3RpbWVzdGFtcCB7CisJX19hbGlnbmVkX2JlNjQJc2VjOworCV9fYWxpZ25lZF9iZTY0CXVzZWM7Cit9OworCitlbnVtIG5mdWxubF9hdHRyX3R5cGUgeworCU5GVUxBX1VOU1BFQywKKwlORlVMQV9QQUNLRVRfSERSLAorCU5GVUxBX01BUkssCQkJLyogX191MzIgbmZtYXJrICovCisJTkZVTEFfVElNRVNUQU1QLAkJLyogbmZ1bG5sX21zZ19wYWNrZXRfdGltZXN0YW1wICovCisJTkZVTEFfSUZJTkRFWF9JTkRFViwJCS8qIF9fdTMyIGlmaW5kZXggKi8KKwlORlVMQV9JRklOREVYX09VVERFViwJCS8qIF9fdTMyIGlmaW5kZXggKi8KKwlORlVMQV9JRklOREVYX1BIWVNJTkRFViwJLyogX191MzIgaWZpbmRleCAqLworCU5GVUxBX0lGSU5ERVhfUEhZU09VVERFViwJLyogX191MzIgaWZpbmRleCAqLworCU5GVUxBX0hXQUREUiwJCQkvKiBuZnVsbmxfbXNnX3BhY2tldF9odyAqLworCU5GVUxBX1BBWUxPQUQsCQkJLyogb3BhcXVlIGRhdGEgcGF5bG9hZCAqLworCU5GVUxBX1BSRUZJWCwJCQkvKiBzdHJpbmcgcHJlZml4ICovCisJTkZVTEFfVUlELAkJCS8qIHVzZXIgaWQgb2Ygc29ja2V0ICovCisJTkZVTEFfU0VRLAkJCS8qIGluc3RhbmNlLWxvY2FsIHNlcXVlbmNlIG51bWJlciAqLworCU5GVUxBX1NFUV9HTE9CQUwsCQkvKiBnbG9iYWwgc2VxdWVuY2UgbnVtYmVyICovCisJTkZVTEFfR0lELAkJCS8qIGdyb3VwIGlkIG9mIHNvY2tldCAqLworCU5GVUxBX0hXVFlQRSwJCQkvKiBoYXJkd2FyZSB0eXBlICovCisJTkZVTEFfSFdIRUFERVIsCQkJLyogaGFyZHdhcmUgaGVhZGVyICovCisJTkZVTEFfSFdMRU4sCQkJLyogaGFyZHdhcmUgaGVhZGVyIGxlbmd0aCAqLworCisJX19ORlVMQV9NQVgKK307CisjZGVmaW5lIE5GVUxBX01BWCAoX19ORlVMQV9NQVggLSAxKQorCitlbnVtIG5mdWxubF9tc2dfY29uZmlnX2NtZHMgeworCU5GVUxOTF9DRkdfQ01EX05PTkUsCisJTkZVTE5MX0NGR19DTURfQklORCwKKwlORlVMTkxfQ0ZHX0NNRF9VTkJJTkQsCisJTkZVTE5MX0NGR19DTURfUEZfQklORCwKKwlORlVMTkxfQ0ZHX0NNRF9QRl9VTkJJTkQsCit9OworCitzdHJ1Y3QgbmZ1bG5sX21zZ19jb25maWdfY21kIHsKKwlfX3U4CWNvbW1hbmQ7CS8qIG5mdWxubF9tc2dfY29uZmlnX2NtZHMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbmZ1bG5sX21zZ19jb25maWdfbW9kZSB7CisJX19iZTMyCQljb3B5X3JhbmdlOworCV9fdTgJY29weV9tb2RlOworCV9fdTgJX3BhZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitlbnVtIG5mdWxubF9hdHRyX2NvbmZpZyB7CisJTkZVTEFfQ0ZHX1VOU1BFQywKKwlORlVMQV9DRkdfQ01ELAkJCS8qIG5mdWxubF9tc2dfY29uZmlnX2NtZCAqLworCU5GVUxBX0NGR19NT0RFLAkJCS8qIG5mdWxubF9tc2dfY29uZmlnX21vZGUgKi8KKwlORlVMQV9DRkdfTkxCVUZTSVosCQkvKiBfX3UzMiBidWZmZXIgc2l6ZSAqLworCU5GVUxBX0NGR19USU1FT1VULAkJLyogX191MzIgaW4gMS8xMDAgcyAqLworCU5GVUxBX0NGR19RVEhSRVNILAkJLyogX191MzIgKi8KKwlORlVMQV9DRkdfRkxBR1MsCQkvKiBfX3UxNiAqLworCV9fTkZVTEFfQ0ZHX01BWAorfTsKKyNkZWZpbmUgTkZVTEFfQ0ZHX01BWCAoX19ORlVMQV9DRkdfTUFYIC0xKQorCisjZGVmaW5lIE5GVUxOTF9DT1BZX05PTkUJMHgwMAorI2RlZmluZSBORlVMTkxfQ09QWV9NRVRBCTB4MDEKKyNkZWZpbmUgTkZVTE5MX0NPUFlfUEFDS0VUCTB4MDIKKy8qIDB4ZmYgaXMgcmVzZXJ2ZWQsIGRvbid0IHVzZSBpdCBmb3IgbmV3IGNvcHkgbW9kZXMuICovCisKKyNkZWZpbmUgTkZVTE5MX0NGR19GX1NFUQkweDAwMDEKKyNkZWZpbmUgTkZVTE5MX0NGR19GX1NFUV9HTE9CQUwJMHgwMDAyCisKKyNlbmRpZiAvKiBfTkZORVRMSU5LX0xPR19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YjMyZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuaApAQCAtMCwwICsxLDkxIEBACisjaWZuZGVmIF9ORk5FVExJTktfUVVFVUVfSAorI2RlZmluZSBfTkZORVRMSU5LX1FVRVVFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oPgorCitlbnVtIG5mcW5sX21zZ190eXBlcyB7CisJTkZRTkxfTVNHX1BBQ0tFVCwJCS8qIHBhY2tldCBmcm9tIGtlcm5lbCB0byB1c2Vyc3BhY2UgKi8KKwlORlFOTF9NU0dfVkVSRElDVCwJCS8qIHZlcmRpY3QgZnJvbSB1c2Vyc3BhY2UgdG8ga2VybmVsICovCisJTkZRTkxfTVNHX0NPTkZJRywJCS8qIGNvbm5lY3QgdG8gYSBwYXJ0aWN1bGFyIHF1ZXVlICovCisJTkZRTkxfTVNHX1ZFUkRJQ1RfQkFUQ0gsCS8qIGJhdGNodiBmcm9tIHVzZXJzcGFjZSB0byBrZXJuZWwgKi8KKworCU5GUU5MX01TR19NQVgKK307CisKK3N0cnVjdCBuZnFubF9tc2dfcGFja2V0X2hkciB7CisJX19iZTMyCQlwYWNrZXRfaWQ7CS8qIHVuaXF1ZSBJRCBvZiBwYWNrZXQgaW4gcXVldWUgKi8KKwlfX2JlMTYJCWh3X3Byb3RvY29sOwkvKiBodyBwcm90b2NvbCAobmV0d29yayBvcmRlcikgKi8KKwlfX3U4CWhvb2s7CQkvKiBuZXRmaWx0ZXIgaG9vayAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBuZnFubF9tc2dfcGFja2V0X2h3IHsKKwlfX2JlMTYJCWh3X2FkZHJsZW47CisJX191MTYJX3BhZDsKKwlfX3U4CWh3X2FkZHJbOF07Cit9OworCitzdHJ1Y3QgbmZxbmxfbXNnX3BhY2tldF90aW1lc3RhbXAgeworCV9fYWxpZ25lZF9iZTY0CXNlYzsKKwlfX2FsaWduZWRfYmU2NAl1c2VjOworfTsKKworZW51bSBuZnFubF9hdHRyX3R5cGUgeworCU5GUUFfVU5TUEVDLAorCU5GUUFfUEFDS0VUX0hEUiwKKwlORlFBX1ZFUkRJQ1RfSERSLAkJLyogbmZxbmxfbXNnX3ZlcmRpY3RfaHJkICovCisJTkZRQV9NQVJLLAkJCS8qIF9fdTMyIG5mbWFyayAqLworCU5GUUFfVElNRVNUQU1QLAkJCS8qIG5mcW5sX21zZ19wYWNrZXRfdGltZXN0YW1wICovCisJTkZRQV9JRklOREVYX0lOREVWLAkJLyogX191MzIgaWZpbmRleCAqLworCU5GUUFfSUZJTkRFWF9PVVRERVYsCQkvKiBfX3UzMiBpZmluZGV4ICovCisJTkZRQV9JRklOREVYX1BIWVNJTkRFViwJCS8qIF9fdTMyIGlmaW5kZXggKi8KKwlORlFBX0lGSU5ERVhfUEhZU09VVERFViwJLyogX191MzIgaWZpbmRleCAqLworCU5GUUFfSFdBRERSLAkJCS8qIG5mcW5sX21zZ19wYWNrZXRfaHcgKi8KKwlORlFBX1BBWUxPQUQsCQkJLyogb3BhcXVlIGRhdGEgcGF5bG9hZCAqLworCisJX19ORlFBX01BWAorfTsKKyNkZWZpbmUgTkZRQV9NQVggKF9fTkZRQV9NQVggLSAxKQorCitzdHJ1Y3QgbmZxbmxfbXNnX3ZlcmRpY3RfaGRyIHsKKwlfX2JlMzIgdmVyZGljdDsKKwlfX2JlMzIgaWQ7Cit9OworCisKK2VudW0gbmZxbmxfbXNnX2NvbmZpZ19jbWRzIHsKKwlORlFOTF9DRkdfQ01EX05PTkUsCisJTkZRTkxfQ0ZHX0NNRF9CSU5ELAorCU5GUU5MX0NGR19DTURfVU5CSU5ELAorCU5GUU5MX0NGR19DTURfUEZfQklORCwKKwlORlFOTF9DRkdfQ01EX1BGX1VOQklORCwKK307CisKK3N0cnVjdCBuZnFubF9tc2dfY29uZmlnX2NtZCB7CisJX191OAljb21tYW5kOwkvKiBuZnFubF9tc2dfY29uZmlnX2NtZHMgKi8KKwlfX3U4CV9wYWQ7CisJX19iZTE2CQlwZjsJCS8qIEFGX3h4eCBmb3IgUEZfW1VOXUJJTkQgKi8KK307CisKK2VudW0gbmZxbmxfY29uZmlnX21vZGUgeworCU5GUU5MX0NPUFlfTk9ORSwKKwlORlFOTF9DT1BZX01FVEEsCisJTkZRTkxfQ09QWV9QQUNLRVQsCit9OworCitzdHJ1Y3QgbmZxbmxfbXNnX2NvbmZpZ19wYXJhbXMgeworCV9fYmUzMgkJY29weV9yYW5nZTsKKwlfX3U4CWNvcHlfbW9kZTsJLyogZW51bSBuZnFubF9jb25maWdfbW9kZSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworZW51bSBuZnFubF9hdHRyX2NvbmZpZyB7CisJTkZRQV9DRkdfVU5TUEVDLAorCU5GUUFfQ0ZHX0NNRCwJCQkvKiBuZnFubF9tc2dfY29uZmlnX2NtZCAqLworCU5GUUFfQ0ZHX1BBUkFNUywJCS8qIG5mcW5sX21zZ19jb25maWdfcGFyYW1zICovCisJTkZRQV9DRkdfUVVFVUVfTUFYTEVOLAkJLyogX191MzIgKi8KKwlfX05GUUFfQ0ZHX01BWAorfTsKKyNkZWZpbmUgTkZRQV9DRkdfTUFYIChfX05GUUFfQ0ZHX01BWC0xKQorCisjZW5kaWYgLyogX05GTkVUTElOS19RVUVVRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTIwOTcwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaApAQCAtMCwwICsxLDE4NSBAQAorI2lmbmRlZiBfWF9UQUJMRVNfSAorI2RlZmluZSBfWF9UQUJMRVNfSAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgWFRfRlVOQ1RJT05fTUFYTkFNRUxFTiAzMAorI2RlZmluZSBYVF9FWFRFTlNJT05fTUFYTkFNRUxFTiAyOQorI2RlZmluZSBYVF9UQUJMRV9NQVhOQU1FTEVOIDMyCisKK3N0cnVjdCB4dF9lbnRyeV9tYXRjaCB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191MTYgbWF0Y2hfc2l6ZTsKKworCQkJLyogVXNlZCBieSB1c2Vyc3BhY2UgKi8KKwkJCWNoYXIgbmFtZVtYVF9FWFRFTlNJT05fTUFYTkFNRUxFTl07CisJCQlfX3U4IHJldmlzaW9uOworCQl9IHVzZXI7CisJCXN0cnVjdCB7CisJCQlfX3UxNiBtYXRjaF9zaXplOworCisJCQkvKiBVc2VkIGluc2lkZSB0aGUga2VybmVsICovCisJCQlzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoOworCQl9IGtlcm5lbDsKKworCQkvKiBUb3RhbCBsZW5ndGggKi8KKwkJX191MTYgbWF0Y2hfc2l6ZTsKKwl9IHU7CisKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMF07Cit9OworCitzdHJ1Y3QgeHRfZW50cnlfdGFyZ2V0IHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3UxNiB0YXJnZXRfc2l6ZTsKKworCQkJLyogVXNlZCBieSB1c2Vyc3BhY2UgKi8KKwkJCWNoYXIgbmFtZVtYVF9FWFRFTlNJT05fTUFYTkFNRUxFTl07CisJCQlfX3U4IHJldmlzaW9uOworCQl9IHVzZXI7CisJCXN0cnVjdCB7CisJCQlfX3UxNiB0YXJnZXRfc2l6ZTsKKworCQkJLyogVXNlZCBpbnNpZGUgdGhlIGtlcm5lbCAqLworCQkJc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0OworCQl9IGtlcm5lbDsKKworCQkvKiBUb3RhbCBsZW5ndGggKi8KKwkJX191MTYgdGFyZ2V0X3NpemU7CisJfSB1OworCisJdW5zaWduZWQgY2hhciBkYXRhWzBdOworfTsKKworI2RlZmluZSBYVF9UQVJHRVRfSU5JVChfX25hbWUsIF9fc2l6ZSkJCQkJCSAgICAgICBcCit7CQkJCQkJCQkJICAgICAgIFwKKwkudGFyZ2V0LnUudXNlciA9IHsJCQkJCQkgICAgICAgXAorCQkudGFyZ2V0X3NpemUJPSBYVF9BTElHTihfX3NpemUpLAkJCSAgICAgICBcCisJCS5uYW1lCQk9IF9fbmFtZSwJCQkJICAgICAgIFwKKwl9LAkJCQkJCQkJICAgICAgIFwKK30KKworc3RydWN0IHh0X3N0YW5kYXJkX3RhcmdldCB7CisJc3RydWN0IHh0X2VudHJ5X3RhcmdldCB0YXJnZXQ7CisJaW50IHZlcmRpY3Q7Cit9OworCitzdHJ1Y3QgeHRfZXJyb3JfdGFyZ2V0IHsKKwlzdHJ1Y3QgeHRfZW50cnlfdGFyZ2V0IHRhcmdldDsKKwljaGFyIGVycm9ybmFtZVtYVF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKK307CisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fR0VUX1JFVklTSU9OXyouICBSZXR1cm5zIGhpZ2hlc3QgcmV2aXNpb24KKyAqIGtlcm5lbCBzdXBwb3J0cywgaWYgPj0gcmV2aXNpb24uICovCitzdHJ1Y3QgeHRfZ2V0X3JldmlzaW9uIHsKKwljaGFyIG5hbWVbWFRfRVhURU5TSU9OX01BWE5BTUVMRU5dOworCV9fdTggcmV2aXNpb247Cit9OworCisvKiBDT05USU5VRSB2ZXJkaWN0IGZvciB0YXJnZXRzICovCisjZGVmaW5lIFhUX0NPTlRJTlVFIDB4RkZGRkZGRkYKKworLyogRm9yIHN0YW5kYXJkIHRhcmdldCAqLworI2RlZmluZSBYVF9SRVRVUk4gKC1ORl9SRVBFQVQgLSAxKQorCisvKiB0aGlzIGlzIGEgZHVtbXkgc3RydWN0dXJlIHRvIGZpbmQgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgZm9yIGEgc3RydWN0CisgKiBjb250YWluaW5nIGFsbCB0aGUgZnVuZGFtZW50YWwgZGF0YSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGlwdF9lbnRyeSwKKyAqIGlwNnRfZW50cnkgYW5kIGFycHRfZW50cnkuICBUaGlzIHN1Y2tzLCBhbmQgaXQgaXMgYSBoYWNrLiAgSXQgd2lsbCBiZSBteQorICogcGVyc29uYWwgcGxlYXN1cmUgdG8gcmVtb3ZlIGl0IC1IVworICovCitzdHJ1Y3QgX3h0X2FsaWduIHsKKwlfX3U4IHU4OworCV9fdTE2IHUxNjsKKwlfX3UzMiB1MzI7CisJX191NjQgdTY0OworfTsKKworI2RlZmluZSBYVF9BTElHTihzKSBfX0FMSUdOX0tFUk5FTCgocyksIF9fYWxpZ25vZl9fKHN0cnVjdCBfeHRfYWxpZ24pKQorCisvKiBTdGFuZGFyZCByZXR1cm4gdmVyZGljdCwgb3IgZG8ganVtcC4gKi8KKyNkZWZpbmUgWFRfU1RBTkRBUkRfVEFSR0VUICIiCisvKiBFcnJvciB2ZXJkaWN0LiAqLworI2RlZmluZSBYVF9FUlJPUl9UQVJHRVQgIkVSUk9SIgorCisjZGVmaW5lIFNFVF9DT1VOVEVSKGMsYixwKSBkbyB7IChjKS5iY250ID0gKGIpOyAoYykucGNudCA9IChwKTsgfSB3aGlsZSgwKQorI2RlZmluZSBBRERfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCArPSAoYik7IChjKS5wY250ICs9IChwKTsgfSB3aGlsZSgwKQorCitzdHJ1Y3QgeHRfY291bnRlcnMgeworCV9fdTY0IHBjbnQsIGJjbnQ7CQkJLyogUGFja2V0IGFuZCBieXRlIGNvdW50ZXJzICovCit9OworCisvKiBUaGUgYXJndW1lbnQgdG8gSVBUX1NPX0FERF9DT1VOVEVSUy4gKi8KK3N0cnVjdCB4dF9jb3VudGVyc19pbmZvIHsKKwkvKiBXaGljaCB0YWJsZS4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOworCisJLyogVGhlIGNvdW50ZXJzIChhY3R1YWxseSBgbnVtYmVyJyBvZiB0aGVzZSkuICovCisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzWzBdOworfTsKKworI2RlZmluZSBYVF9JTlZfUFJPVE8JCTB4NDAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBQUk9UTy4gKi8KKworLyogZm4gcmV0dXJucyAwIHRvIGNvbnRpbnVlIGl0ZXJhdGlvbiAqLworI2RlZmluZSBYVF9NQVRDSF9JVEVSQVRFKHR5cGUsIGUsIGZuLCBhcmdzLi4uKQkJCVwKKyh7CQkJCQkJCQlcCisJdW5zaWduZWQgaW50IF9faTsJCQkJCVwKKwlpbnQgX19yZXQgPSAwOwkJCQkJCVwKKwlzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKl9fbTsJCQkJXAorCQkJCQkJCQlcCisJZm9yIChfX2kgPSBzaXplb2YodHlwZSk7CQkJCVwKKwkgICAgIF9faSA8IChlKS0+dGFyZ2V0X29mZnNldDsJCQkJXAorCSAgICAgX19pICs9IF9fbS0+dS5tYXRjaF9zaXplKSB7CQkJXAorCQlfX20gPSAodm9pZCAqKWUgKyBfX2k7CQkJCVwKKwkJCQkJCQkJXAorCQlfX3JldCA9IGZuKF9fbSAsICMjIGFyZ3MpOwkJCVwKKwkJaWYgKF9fcmV0ICE9IDApCQkJCQlcCisJCQlicmVhazsJCQkJCVwKKwl9CQkJCQkJCVwKKwlfX3JldDsJCQkJCQkJXAorfSkKKworLyogZm4gcmV0dXJucyAwIHRvIGNvbnRpbnVlIGl0ZXJhdGlvbiAqLworI2RlZmluZSBYVF9FTlRSWV9JVEVSQVRFX0NPTlRJTlVFKHR5cGUsIGVudHJpZXMsIHNpemUsIG4sIGZuLCBhcmdzLi4uKSBcCisoewkJCQkJCQkJXAorCXVuc2lnbmVkIGludCBfX2ksIF9fbjsJCQkJCVwKKwlpbnQgX19yZXQgPSAwOwkJCQkJCVwKKwl0eXBlICpfX2VudHJ5OwkJCQkJCVwKKwkJCQkJCQkJXAorCWZvciAoX19pID0gMCwgX19uID0gMDsgX19pIDwgKHNpemUpOwkJCVwKKwkgICAgIF9faSArPSBfX2VudHJ5LT5uZXh0X29mZnNldCwgX19uKyspIHsgCQlcCisJCV9fZW50cnkgPSAodm9pZCAqKShlbnRyaWVzKSArIF9faTsJCVwKKwkJaWYgKF9fbiA8IG4pCQkJCQlcCisJCQljb250aW51ZTsJCQkJXAorCQkJCQkJCQlcCisJCV9fcmV0ID0gZm4oX19lbnRyeSAsICMjIGFyZ3MpOwkJCVwKKwkJaWYgKF9fcmV0ICE9IDApCQkJCQlcCisJCQlicmVhazsJCQkJCVwKKwl9CQkJCQkJCVwKKwlfX3JldDsJCQkJCQkJXAorfSkKKworLyogZm4gcmV0dXJucyAwIHRvIGNvbnRpbnVlIGl0ZXJhdGlvbiAqLworI2RlZmluZSBYVF9FTlRSWV9JVEVSQVRFKHR5cGUsIGVudHJpZXMsIHNpemUsIGZuLCBhcmdzLi4uKSBcCisJWFRfRU5UUllfSVRFUkFURV9DT05USU5VRSh0eXBlLCBlbnRyaWVzLCBzaXplLCAwLCBmbiwgYXJncykKKworCisvKiBwb3MgaXMgbm9ybWFsbHkgYSBzdHJ1Y3QgaXB0X2VudHJ5L2lwNnRfZW50cnkvZXRjLiAqLworI2RlZmluZSB4dF9lbnRyeV9mb3JlYWNoKHBvcywgZWhlYWQsIGVzaXplKSBcCisJZm9yICgocG9zKSA9ICh0eXBlb2YocG9zKSkoZWhlYWQpOyBcCisJICAgICAocG9zKSA8ICh0eXBlb2YocG9zKSkoKGNoYXIgKikoZWhlYWQpICsgKGVzaXplKSk7IFwKKwkgICAgIChwb3MpID0gKHR5cGVvZihwb3MpKSgoY2hhciAqKShwb3MpICsgKHBvcyktPm5leHRfb2Zmc2V0KSkKKworLyogY2FuIG9ubHkgYmUgeHRfZW50cnlfbWF0Y2gsIHNvIG5vIHVzZSBvZiB0eXBlb2YgaGVyZSAqLworI2RlZmluZSB4dF9lbWF0Y2hfZm9yZWFjaChwb3MsIGVudHJ5KSBcCisJZm9yICgocG9zKSA9IChzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKillbnRyeS0+ZWxlbXM7IFwKKwkgICAgIChwb3MpIDwgKHN0cnVjdCB4dF9lbnRyeV9tYXRjaCAqKSgoY2hhciAqKShlbnRyeSkgKyBcCisJICAgICAgICAgICAgIChlbnRyeSktPnRhcmdldF9vZmZzZXQpOyBcCisJICAgICAocG9zKSA9IChzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKikoKGNoYXIgKikocG9zKSArIFwKKwkgICAgICAgICAgICAgKHBvcyktPnUubWF0Y2hfc2l6ZSkpCisKKworI2VuZGlmIC8qIF9YX1RBQkxFU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9BVURJVC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQVVESVQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODc1MWQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQVVESVQuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogSGVhZGVyIGZpbGUgZm9yIGlwdGFibGVzIHh0X0FVRElUIHRhcmdldAorICoKKyAqIChDKSAyMDEwLTIwMTEgVGhvbWFzIEdyYWYgPHRncmFmQHJlZGhhdC5jb20+CisgKiAoQykgMjAxMC0yMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1hUX0FVRElUX1RBUkdFVF9ICisjZGVmaW5lIF9YVF9BVURJVF9UQVJHRVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB7CisJWFRfQVVESVRfVFlQRV9BQ0NFUFQgPSAwLAorCVhUX0FVRElUX1RZUEVfRFJPUCwKKwlYVF9BVURJVF9UWVBFX1JFSkVDVCwKKwlfX1hUX0FVRElUX1RZUEVfTUFYLAorfTsKKworI2RlZmluZSBYVF9BVURJVF9UWVBFX01BWCAoX19YVF9BVURJVF9UWVBFX01BWCAtIDEpCisKK3N0cnVjdCB4dF9hdWRpdF9pbmZvIHsKKwlfX3U4IHR5cGU7IC8qIFhUX0FVRElUX1RZUEVfKiAqLworfTsKKworI2VuZGlmIC8qIF9YVF9BVURJVF9UQVJHRVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ0hFQ0tTVU0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NIRUNLU1VNLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyZTQ2NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NIRUNLU1VNLmgKQEAgLTAsMCArMSwyMCBAQAorLyogSGVhZGVyIGZpbGUgZm9yIGlwdGFibGVzIGlwdF9DSEVDS1NVTSB0YXJnZXQKKyAqCisgKiAoQykgMjAwMiBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMTAgUmVkIEhhdCBJbmMKKyAqIEF1dGhvcjogTWljaGFlbCBTLiBUc2lya2luIDxtc3RAcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIEdOVSBHUEwgdjIsIDE5OTEKKyovCisjaWZuZGVmIF9YVF9DSEVDS1NVTV9UQVJHRVRfSAorI2RlZmluZSBfWFRfQ0hFQ0tTVU1fVEFSR0VUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgWFRfQ0hFQ0tTVU1fT1BfRklMTAkweDAxCS8qIGZpbGwgaW4gY2hlY2tzdW0gaW4gSVAgaGVhZGVyICovCisKK3N0cnVjdCB4dF9DSEVDS1NVTV9pbmZvIHsKKwlfX3U4IG9wZXJhdGlvbjsJLyogYml0c2V0IG9mIG9wZXJhdGlvbnMgKi8KK307CisKKyNlbmRpZiAvKiBfWFRfQ0hFQ0tTVU1fVEFSR0VUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DTEFTU0lGWS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTNiZjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DTEFTU0lGWS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX1hUX0NMQVNTSUZZX0gKKyNkZWZpbmUgX1hUX0NMQVNTSUZZX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB4dF9jbGFzc2lmeV90YXJnZXRfaW5mbyB7CisJX191MzIgcHJpb3JpdHk7Cit9OworCisjZW5kaWYgLypfWFRfQ0xBU1NJRllfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyZTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9YVF9DT05OTUFSS19IX3RhcmdldAorI2RlZmluZSBfWFRfQ09OTk1BUktfSF90YXJnZXQKKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jb25ubWFyay5oPgorCisjZW5kaWYgLypfWFRfQ09OTk1BUktfSF90YXJnZXQqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ09OTlNFQ01BUksuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NPTk5TRUNNQVJLLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk3M2ZmOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NPTk5TRUNNQVJLLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfWFRfQ09OTlNFQ01BUktfSF90YXJnZXQKKyNkZWZpbmUgX1hUX0NPTk5TRUNNQVJLX0hfdGFyZ2V0CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwlDT05OU0VDTUFSS19TQVZFID0gMSwKKwlDT05OU0VDTUFSS19SRVNUT1JFLAorfTsKKworc3RydWN0IHh0X2Nvbm5zZWNtYXJrX3RhcmdldF9pbmZvIHsKKwlfX3U4IG1vZGU7Cit9OworCisjZW5kaWYgLypfWFRfQ09OTlNFQ01BUktfSF90YXJnZXQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NULmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NmU3NjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DVC5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX1hUX0NUX0gKKyNkZWZpbmUgX1hUX0NUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgWFRfQ1RfTk9UUkFDSwkweDEKKworc3RydWN0IHh0X2N0X3RhcmdldF9pbmZvIHsKKwlfX3UxNiBmbGFnczsKKwlfX3UxNiB6b25lOworCV9fdTMyIGN0X2V2ZW50czsKKwlfX3UzMiBleHBfZXZlbnRzOworCWNoYXIgaGVscGVyWzE2XTsKKworCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCisJc3RydWN0IG5mX2Nvbm4JKmN0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKK307CisKKyNlbmRpZiAvKiBfWFRfQ1RfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfRFNDUC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfRFNDUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OGUwYjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9EU0NQLmgKQEAgLTAsMCArMSwyNiBAQAorLyogeF90YWJsZXMgbW9kdWxlIGZvciBzZXR0aW5nIHRoZSBJUHY0L0lQdjYgRFNDUCBmaWVsZAorICoKKyAqIChDKSAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBiYXNlZCBvbiBpcHRfRlRPUy5jIChDKSAyMDAwIGJ5IE1hdHRoZXcgRy4gTWFyc2ggPG1nbUBwYWt0cm9uaXguY29tPgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciBHTlUgR1BMIHYyLCAxOTkxCisgKgorICogU2VlIFJGQzI0NzQgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIERTQ1AgZmllbGQgd2l0aGluIHRoZSBJUCBIZWFkZXIuCisgKgorICogeHRfRFNDUC5oLHYgMS43IDIwMDIvMDMvMTQgMTI6MDM6MTMgbGFmb3JnZSBFeHAKKyovCisjaWZuZGVmIF9YVF9EU0NQX1RBUkdFVF9ICisjZGVmaW5lIF9YVF9EU0NQX1RBUkdFVF9ICisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2RzY3AuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiB0YXJnZXQgaW5mbyAqLworc3RydWN0IHh0X0RTQ1BfaW5mbyB7CisJX191OCBkc2NwOworfTsKKworc3RydWN0IHh0X3Rvc190YXJnZXRfaW5mbyB7CisJX191OCB0b3NfdmFsdWU7CisJX191OCB0b3NfbWFzazsKK307CisKKyNlbmRpZiAvKiBfWFRfRFNDUF9UQVJHRVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfSURMRVRJTUVSLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9JRExFVElNRVIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDhhZTkzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfSURMRVRJTUVSLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0lETEVUSU1FUi5oCisgKgorICogSGVhZGVyIGZpbGUgZm9yIFh0YWJsZXMgdGltZXIgdGFyZ2V0IG1vZHVsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMTAgTm9raWEgQ29ycG9yYXRpb24KKyAqIFdyaXR0ZW4gYnkgVGltbyBUZXJhcyA8ZXh0LXRpbW8udGVyYXNAbm9raWEuY29tPgorICoKKyAqIENvbnZlcnRlZCB0byB4X3RhYmxlcyBhbmQgZm9yd2FyZC1wb3J0ZWQgdG8gMi42LjM0CisgKiBieSBMdWNpYW5vIENvZWxobyA8bHVjaWFuby5jb2VsaG9Abm9raWEuY29tPgorICoKKyAqIENvbnRhY3Q6IEx1Y2lhbm8gQ29lbGhvIDxsdWNpYW5vLmNvZWxob0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX1hUX0lETEVUSU1FUl9ICisjZGVmaW5lIF9YVF9JRExFVElNRVJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBNQVhfSURMRVRJTUVSX0xBQkVMX1NJWkUgMjgKKworc3RydWN0IGlkbGV0aW1lcl90Z19pbmZvIHsKKwlfX3UzMiB0aW1lb3V0OworCisJY2hhciBsYWJlbFtNQVhfSURMRVRJTUVSX0xBQkVMX1NJWkVdOworCisJLyogZm9yIGtlcm5lbCBtb2R1bGUgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKwlzdHJ1Y3QgaWRsZXRpbWVyX3RnICp0aW1lciBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0xFRC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfTEVELmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1MDllNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0xFRC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX1hUX0xFRF9ICisjZGVmaW5lIF9YVF9MRURfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHh0X2xlZF9pbmZvIHsKKwljaGFyIGlkWzI3XTsgICAgICAgIC8qIFVuaXF1ZSBJRCBmb3IgdGhpcyB0cmlnZ2VyIGluIHRoZSBMRUQgY2xhc3MgKi8KKwlfX3U4IGFsd2F5c19ibGluazsgIC8qIEJsaW5rIGV2ZW4gaWYgdGhlIExFRCBpcyBhbHJlYWR5IG9uICovCisJX191MzIgZGVsYXk7ICAgICAgICAvKiBEZWxheSB1bnRpbCBMRUQgaXMgc3dpdGNoZWQgb2ZmIGFmdGVyIHRyaWdnZXIgKi8KKworCS8qIEtlcm5lbCBkYXRhIHVzZWQgaW4gdGhlIG1vZHVsZSAqLworCXZvaWQgKmludGVybmFsX2RhdGEgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworfTsKKworI2VuZGlmIC8qIF9YVF9MRURfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfTUFSSy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfTUFSSy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYzQ1NmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9NQVJLLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9YVF9NQVJLX0hfdGFyZ2V0CisjZGVmaW5lIF9YVF9NQVJLX0hfdGFyZ2V0CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbWFyay5oPgorCisjZW5kaWYgLypfWFRfTUFSS19IX3RhcmdldCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfTkZMT0cuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GTE9HLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiNTgzMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GTE9HLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfWFRfTkZMT0dfVEFSR0VUCisjZGVmaW5lIF9YVF9ORkxPR19UQVJHRVQKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgWFRfTkZMT0dfREVGQVVMVF9HUk9VUAkJMHgxCisjZGVmaW5lIFhUX05GTE9HX0RFRkFVTFRfVEhSRVNIT0xECTAKKworI2RlZmluZSBYVF9ORkxPR19NQVNLCQkJMHgwCisKK3N0cnVjdCB4dF9uZmxvZ19pbmZvIHsKKwlfX3UzMglsZW47CisJX191MTYJZ3JvdXA7CisJX191MTYJdGhyZXNob2xkOworCV9fdTE2CWZsYWdzOworCV9fdTE2CXBhZDsKKwljaGFyCQlwcmVmaXhbNjRdOworfTsKKworI2VuZGlmIC8qIF9YVF9ORkxPR19UQVJHRVQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWFmZGJiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfTkZRVUVVRS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIGlwdGFibGVzIG1vZHVsZSBmb3IgdXNpbmcgTkZRVUVVRSBtZWNoYW5pc20KKyAqCisgKiAoQykgMjAwNSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIEdOVSBHUEwgdjIsIDE5OTEKKyAqIAorKi8KKyNpZm5kZWYgX1hUX05GUV9UQVJHRVRfSAorI2RlZmluZSBfWFRfTkZRX1RBUkdFVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiB0YXJnZXQgaW5mbyAqLworc3RydWN0IHh0X05GUV9pbmZvIHsKKwlfX3UxNiBxdWV1ZW51bTsKK307CisKK3N0cnVjdCB4dF9ORlFfaW5mb192MSB7CisJX191MTYgcXVldWVudW07CisJX191MTYgcXVldWVzX3RvdGFsOworfTsKKworc3RydWN0IHh0X05GUV9pbmZvX3YyIHsKKwlfX3UxNiBxdWV1ZW51bTsKKwlfX3UxNiBxdWV1ZXNfdG90YWw7CisJX191MTYgYnlwYXNzOworfTsKKworI2VuZGlmIC8qIF9YVF9ORlFfVEFSR0VUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjA1ZTIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfUkFURUVTVC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX1hUX1JBVEVFU1RfVEFSR0VUX0gKKyNkZWZpbmUgX1hUX1JBVEVFU1RfVEFSR0VUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB4dF9yYXRlZXN0X3RhcmdldF9pbmZvIHsKKwljaGFyCQkJbmFtZVtJRk5BTVNJWl07CisJX19zOAkJCWludGVydmFsOworCV9fdTgJCWV3bWFfbG9nOworCisJLyogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWwgKi8KKwlzdHJ1Y3QgeHRfcmF0ZWVzdAkqZXN0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKK307CisKKyNlbmRpZiAvKiBfWFRfUkFURUVTVF9UQVJHRVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfU0VDTUFSSy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfU0VDTUFSSy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OTA5MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9TRUNNQVJLLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfWFRfU0VDTUFSS19IX3RhcmdldAorI2RlZmluZSBfWFRfU0VDTUFSS19IX3RhcmdldAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSB2YXJpb3VzIHNlY3VyaXR5IHN1YnN5c3RlbXMgKGJ1dCBub3QKKyAqIGF0IHRoZSBzYW1lIHRpbWUpLgorICoKKyAqICdtb2RlJyByZWZlcnMgdG8gdGhlIHNwZWNpZmljIHNlY3VyaXR5IHN1YnN5c3RlbSB3aGljaCB0aGUKKyAqIHBhY2tldHMgYXJlIGJlaW5nIG1hcmtlZCBmb3IuCisgKi8KKyNkZWZpbmUgU0VDTUFSS19NT0RFX1NFTAkweDAxCQkvKiBTRUxpbnV4ICovCisjZGVmaW5lIFNFQ01BUktfU0VDQ1RYX01BWAkyNTYKKworc3RydWN0IHh0X3NlY21hcmtfdGFyZ2V0X2luZm8geworCV9fdTggbW9kZTsKKwlfX3UzMiBzZWNpZDsKKwljaGFyIHNlY2N0eFtTRUNNQVJLX1NFQ0NUWF9NQVhdOworfTsKKworI2VuZGlmIC8qX1hUX1NFQ01BUktfSF90YXJnZXQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RDUE1TUy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfVENQTVNTLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2OTYwYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RDUE1TUy5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX1hUX1RDUE1TU19ICisjZGVmaW5lIF9YVF9UQ1BNU1NfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHh0X3RjcG1zc19pbmZvIHsKKwlfX3UxNiBtc3M7Cit9OworCisjZGVmaW5lIFhUX1RDUE1TU19DTEFNUF9QTVRVIDB4ZmZmZgorCisjZW5kaWYgLyogX1hUX1RDUE1TU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9UQ1BPUFRTVFJJUC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfVENQT1BUU1RSSVAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTU3MzE4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfVENQT1BUU1RSSVAuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9YVF9UQ1BPUFRTVFJJUF9ICisjZGVmaW5lIF9YVF9UQ1BPUFRTVFJJUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIHRjcG9wdHN0cmlwX3NldF9iaXQoYm1hcCwgaWR4KSBcCisJKGJtYXBbKGlkeCkgPj4gNV0gfD0gMVUgPDwgKGlkeCAmIDMxKSkKKyNkZWZpbmUgdGNwb3B0c3RyaXBfdGVzdF9iaXQoYm1hcCwgaWR4KSBcCisJKCgoMVUgPDwgKGlkeCAmIDMxKSkgJiBibWFwWyhpZHgpID4+IDVdKSAhPSAwKQorCitzdHJ1Y3QgeHRfdGNwb3B0c3RyaXBfdGFyZ2V0X2luZm8geworCV9fdTMyIHN0cmlwX2JtYXBbOF07Cit9OworCisjZW5kaWYgLyogX1hUX1RDUE9QVFNUUklQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RFRS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfVEVFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyMWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RFRS5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX1hUX1RFRV9UQVJHRVRfSAorI2RlZmluZSBfWFRfVEVFX1RBUkdFVF9ICisKK3N0cnVjdCB4dF90ZWVfdGdpbmZvIHsKKwl1bmlvbiBuZl9pbmV0X2FkZHIgZ3c7CisJY2hhciBvaWZbMTZdOworCisJLyogdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWwgKi8KKwlzdHJ1Y3QgeHRfdGVlX3ByaXYgKnByaXYgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworfTsKKworI2VuZGlmIC8qIF9YVF9URUVfVEFSR0VUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RQUk9YWS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfVFBST1hZLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyMDQzYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RQUk9YWS5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX1hUX1RQUk9YWV9ICisjZGVmaW5lIF9YVF9UUFJPWFlfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogVFBST1hZIHRhcmdldCBpcyBjYXBhYmxlIG9mIG1hcmtpbmcgdGhlIHBhY2tldCB0byBwZXJmb3JtCisgKiByZWRpcmVjdGlvbi4gV2UgY2FuIGdldCByaWQgb2YgdGhhdCB3aGVuZXZlciB3ZSBnZXQgc3VwcG9ydCBmb3IKKyAqIG11dGxpcGxlIHRhcmdldHMgaW4gdGhlIHNhbWUgcnVsZS4gKi8KK3N0cnVjdCB4dF90cHJveHlfdGFyZ2V0X2luZm8geworCV9fdTMyIG1hcmtfbWFzazsKKwlfX3UzMiBtYXJrX3ZhbHVlOworCV9fYmUzMiBsYWRkcjsKKwlfX2JlMTYgbHBvcnQ7Cit9OworCitzdHJ1Y3QgeHRfdHByb3h5X3RhcmdldF9pbmZvX3YxIHsKKwlfX3UzMiBtYXJrX21hc2s7CisJX191MzIgbWFya192YWx1ZTsKKwl1bmlvbiBuZl9pbmV0X2FkZHIgbGFkZHI7CisJX19iZTE2IGxwb3J0OworfTsKKworI2VuZGlmIC8qIF9YVF9UUFJPWFlfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfYWRkcnR5cGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2FkZHJ0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1NmJhYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2FkZHJ0eXBlLmgKQEAgLTAsMCArMSw0NCBAQAorI2lmbmRlZiBfWFRfQUREUlRZUEVfSAorI2RlZmluZSBfWFRfQUREUlRZUEVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB7CisJWFRfQUREUlRZUEVfSU5WRVJUX1NPVVJDRQk9IDB4MDAwMSwKKwlYVF9BRERSVFlQRV9JTlZFUlRfREVTVAkJPSAweDAwMDIsCisJWFRfQUREUlRZUEVfTElNSVRfSUZBQ0VfSU4JPSAweDAwMDQsCisJWFRfQUREUlRZUEVfTElNSVRfSUZBQ0VfT1VUCT0gMHgwMDA4LAorfTsKKworCisvKiBydG5fdHlwZSBlbnVtIHZhbHVlcyBmcm9tIHJ0bmV0bGluay5oLCBidXQgc2hpZnRlZCAqLworZW51bSB7CisJWFRfQUREUlRZUEVfVU5TUEVDID0gMSA8PCAwLAorCVhUX0FERFJUWVBFX1VOSUNBU1QgPSAxIDw8IDEsCS8qIDEgPDwgUlROX1VOSUNBU1QgKi8KKwlYVF9BRERSVFlQRV9MT0NBTCAgPSAxIDw8IDIsCS8qIDEgPDwgUlROX0xPQ0FMLCBldGMgKi8KKwlYVF9BRERSVFlQRV9CUk9BRENBU1QgPSAxIDw8IDMsCisJWFRfQUREUlRZUEVfQU5ZQ0FTVCA9IDEgPDwgNCwKKwlYVF9BRERSVFlQRV9NVUxUSUNBU1QgPSAxIDw8IDUsCisJWFRfQUREUlRZUEVfQkxBQ0tIT0xFID0gMSA8PCA2LAorCVhUX0FERFJUWVBFX1VOUkVBQ0hBQkxFID0gMSA8PCA3LAorCVhUX0FERFJUWVBFX1BST0hJQklUID0gMSA8PCA4LAorCVhUX0FERFJUWVBFX1RIUk9XID0gMSA8PCA5LAorCVhUX0FERFJUWVBFX05BVCA9IDEgPDwgMTAsCisJWFRfQUREUlRZUEVfWFJFU09MVkUgPSAxIDw8IDExLAorfTsKKworc3RydWN0IHh0X2FkZHJ0eXBlX2luZm9fdjEgeworCV9fdTE2CXNvdXJjZTsJCS8qIHNvdXJjZS10eXBlIG1hc2sgKi8KKwlfX3UxNglkZXN0OwkJLyogZGVzdC10eXBlIG1hc2sgKi8KKwlfX3UzMglmbGFnczsKK307CisKKy8qIHJldmlzaW9uIDAgKi8KK3N0cnVjdCB4dF9hZGRydHlwZV9pbmZvIHsKKwlfX3UxNglzb3VyY2U7CQkvKiBzb3VyY2UtdHlwZSBtYXNrICovCisJX191MTYJZGVzdDsJCS8qIGRlc3QtdHlwZSBtYXNrICovCisJX191MzIJaW52ZXJ0X3NvdXJjZTsKKwlfX3UzMglpbnZlcnRfZGVzdDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY2x1c3Rlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY2x1c3Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODgzYzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jbHVzdGVyLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfWFRfQ0xVU1RFUl9NQVRDSF9ICisjZGVmaW5lIF9YVF9DTFVTVEVSX01BVENIX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geHRfY2x1c3Rlcl9mbGFncyB7CisJWFRfQ0xVU1RFUl9GX0lOVgk9ICgxIDw8IDApCit9OworCitzdHJ1Y3QgeHRfY2x1c3Rlcl9tYXRjaF9pbmZvIHsKKwlfX3UzMiB0b3RhbF9ub2RlczsKKwlfX3UzMiBub2RlX21hc2s7CisJX191MzIgaGFzaF9zZWVkOworCV9fdTMyIGZsYWdzOworfTsKKworI2RlZmluZSBYVF9DTFVTVEVSX05PREVTX01BWAkzMgorCisjZW5kaWYgLyogX1hUX0NMVVNURVJfTUFUQ0hfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYTVlNzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb21tZW50LmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfWFRfQ09NTUVOVF9ICisjZGVmaW5lIF9YVF9DT01NRU5UX0gKKworI2RlZmluZSBYVF9NQVhfQ09NTUVOVF9MRU4gMjU2CisKK3N0cnVjdCB4dF9jb21tZW50X2luZm8geworCWNoYXIgY29tbWVudFtYVF9NQVhfQ09NTUVOVF9MRU5dOworfTsKKworI2VuZGlmIC8qIFhUX0NPTU1FTlRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25uYnl0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWQ2YzE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmgKQEAgLTAsMCArMSwyNiBAQAorI2lmbmRlZiBfWFRfQ09OTkJZVEVTX0gKKyNkZWZpbmUgX1hUX0NPTk5CWVRFU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHh0X2Nvbm5ieXRlc193aGF0IHsKKwlYVF9DT05OQllURVNfUEtUUywKKwlYVF9DT05OQllURVNfQllURVMsCisJWFRfQ09OTkJZVEVTX0FWR1BLVCwKK307CisKK2VudW0geHRfY29ubmJ5dGVzX2RpcmVjdGlvbiB7CisJWFRfQ09OTkJZVEVTX0RJUl9PUklHSU5BTCwKKwlYVF9DT05OQllURVNfRElSX1JFUExZLAorCVhUX0NPTk5CWVRFU19ESVJfQk9USCwKK307CisKK3N0cnVjdCB4dF9jb25uYnl0ZXNfaW5mbyB7CisJc3RydWN0IHsKKwkJX19hbGlnbmVkX3U2NCBmcm9tOwkvKiBjb3VudCB0byBiZSBtYXRjaGVkICovCisJCV9fYWxpZ25lZF91NjQgdG87CS8qIGNvdW50IHRvIGJlIG1hdGNoZWQgKi8KKwl9IGNvdW50OworCV9fdTggd2hhdDsJCS8qIGlwdF9jb25uYnl0ZXNfd2hhdCAqLworCV9fdTggZGlyZWN0aW9uOwkvKiBpcHRfY29ubmJ5dGVzX2RpcmVjdGlvbiAqLworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmxpbWl0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25ubGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGMxODI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmxpbWl0LmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBfWFRfQ09OTkxJTUlUX0gKKyNkZWZpbmUgX1hUX0NPTk5MSU1JVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorCitzdHJ1Y3QgeHRfY29ubmxpbWl0X2RhdGE7CisKK2VudW0geworCVhUX0NPTk5MSU1JVF9JTlZFUlQgPSAxIDw8IDAsCisJWFRfQ09OTkxJTUlUX0RBRERSICA9IDEgPDwgMSwKK307CisKK3N0cnVjdCB4dF9jb25ubGltaXRfaW5mbyB7CisJdW5pb24geworCQl1bmlvbiBuZl9pbmV0X2FkZHIgbWFzazsKKwkJdW5pb24geworCQkJX19iZTMyIHY0X21hc2s7CisJCQlfX2JlMzIgdjZfbWFza1s0XTsKKwkJfTsKKwl9OworCXVuc2lnbmVkIGludCBsaW1pdDsKKwl1bmlvbiB7CisJCS8qIHJldmlzaW9uIDAgKi8KKwkJdW5zaWduZWQgaW50IGludmVyc2U7CisKKwkJLyogcmV2aXNpb24gMSAqLworCQlfX3UzMiBmbGFnczsKKwl9OworCisJLyogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWwgKi8KKwlzdHJ1Y3QgeHRfY29ubmxpbWl0X2RhdGEgKmRhdGEgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworfTsKKworI2VuZGlmIC8qIF9YVF9DT05OTElNSVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjMTdhOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmgKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBfWFRfQ09OTk1BUktfSAorI2RlZmluZSBfWFRfQ09OTk1BUktfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDQgTUFSQSBTeXN0ZW1zIEFCIDxodHRwOi8vd3d3Lm1hcmFzeXN0ZW1zLmNvbT4KKyAqIGJ5IEhlbnJpayBOb3Jkc3Ryb20gPGhub0BtYXJhc3lzdGVtcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCitlbnVtIHsKKwlYVF9DT05OTUFSS19TRVQgPSAwLAorCVhUX0NPTk5NQVJLX1NBVkUsCisJWFRfQ09OTk1BUktfUkVTVE9SRQorfTsKKworc3RydWN0IHh0X2Nvbm5tYXJrX3RnaW5mbzEgeworCV9fdTMyIGN0bWFyaywgY3RtYXNrLCBuZm1hc2s7CisJX191OCBtb2RlOworfTsKKworc3RydWN0IHh0X2Nvbm5tYXJrX210aW5mbzEgeworCV9fdTMyIG1hcmssIG1hc2s7CisJX191OCBpbnZlcnQ7Cit9OworCisjZW5kaWYgLypfWFRfQ09OTk1BUktfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYzA0MWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaApAQCAtMCwwICsxLDc3IEBACisvKiBIZWFkZXIgZmlsZSBmb3Iga2VybmVsIG1vZHVsZSB0byBtYXRjaCBjb25uZWN0aW9uIHRyYWNraW5nIGluZm9ybWF0aW9uLgorICogR1BMIChDKSAyMDAxICBNYXJjIEJvdWNoZXIgKG1hcmNAbWJzaS5jYSkuCisgKi8KKworI2lmbmRlZiBfWFRfQ09OTlRSQUNLX0gKKyNkZWZpbmUgX1hUX0NPTk5UUkFDS19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGVfY29tbW9uLmg+CisKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pICgxIDw8ICgoY3RpbmZvKSVJUF9DVF9JU19SRVBMWSsxKSkKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQgKDEgPDwgMCkKKworI2RlZmluZSBYVF9DT05OVFJBQ0tfU1RBVEVfU05BVCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMSkpCisjZGVmaW5lIFhUX0NPTk5UUkFDS19TVEFURV9ETkFUICgxIDw8IChJUF9DVF9OVU1CRVIgKyAyKSkKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMykpCisKKy8qIGZsYWdzLCBpbnZmbGFnczogKi8KK2VudW0geworCVhUX0NPTk5UUkFDS19TVEFURSAgICAgICAgPSAxIDw8IDAsCisJWFRfQ09OTlRSQUNLX1BST1RPICAgICAgICA9IDEgPDwgMSwKKwlYVF9DT05OVFJBQ0tfT1JJR1NSQyAgICAgID0gMSA8PCAyLAorCVhUX0NPTk5UUkFDS19PUklHRFNUICAgICAgPSAxIDw8IDMsCisJWFRfQ09OTlRSQUNLX1JFUExTUkMgICAgICA9IDEgPDwgNCwKKwlYVF9DT05OVFJBQ0tfUkVQTERTVCAgICAgID0gMSA8PCA1LAorCVhUX0NPTk5UUkFDS19TVEFUVVMgICAgICAgPSAxIDw8IDYsCisJWFRfQ09OTlRSQUNLX0VYUElSRVMgICAgICA9IDEgPDwgNywKKwlYVF9DT05OVFJBQ0tfT1JJR1NSQ19QT1JUID0gMSA8PCA4LAorCVhUX0NPTk5UUkFDS19PUklHRFNUX1BPUlQgPSAxIDw8IDksCisJWFRfQ09OTlRSQUNLX1JFUExTUkNfUE9SVCA9IDEgPDwgMTAsCisJWFRfQ09OTlRSQUNLX1JFUExEU1RfUE9SVCA9IDEgPDwgMTEsCisJWFRfQ09OTlRSQUNLX0RJUkVDVElPTiAgICA9IDEgPDwgMTIsCit9OworCitzdHJ1Y3QgeHRfY29ubnRyYWNrX210aW5mbzEgeworCXVuaW9uIG5mX2luZXRfYWRkciBvcmlnc3JjX2FkZHIsIG9yaWdzcmNfbWFzazsKKwl1bmlvbiBuZl9pbmV0X2FkZHIgb3JpZ2RzdF9hZGRyLCBvcmlnZHN0X21hc2s7CisJdW5pb24gbmZfaW5ldF9hZGRyIHJlcGxzcmNfYWRkciwgcmVwbHNyY19tYXNrOworCXVuaW9uIG5mX2luZXRfYWRkciByZXBsZHN0X2FkZHIsIHJlcGxkc3RfbWFzazsKKwlfX3UzMiBleHBpcmVzX21pbiwgZXhwaXJlc19tYXg7CisJX191MTYgbDRwcm90bzsKKwlfX2JlMTYgb3JpZ3NyY19wb3J0LCBvcmlnZHN0X3BvcnQ7CisJX19iZTE2IHJlcGxzcmNfcG9ydCwgcmVwbGRzdF9wb3J0OworCV9fdTE2IG1hdGNoX2ZsYWdzLCBpbnZlcnRfZmxhZ3M7CisJX191OCBzdGF0ZV9tYXNrLCBzdGF0dXNfbWFzazsKK307CisKK3N0cnVjdCB4dF9jb25udHJhY2tfbXRpbmZvMiB7CisJdW5pb24gbmZfaW5ldF9hZGRyIG9yaWdzcmNfYWRkciwgb3JpZ3NyY19tYXNrOworCXVuaW9uIG5mX2luZXRfYWRkciBvcmlnZHN0X2FkZHIsIG9yaWdkc3RfbWFzazsKKwl1bmlvbiBuZl9pbmV0X2FkZHIgcmVwbHNyY19hZGRyLCByZXBsc3JjX21hc2s7CisJdW5pb24gbmZfaW5ldF9hZGRyIHJlcGxkc3RfYWRkciwgcmVwbGRzdF9tYXNrOworCV9fdTMyIGV4cGlyZXNfbWluLCBleHBpcmVzX21heDsKKwlfX3UxNiBsNHByb3RvOworCV9fYmUxNiBvcmlnc3JjX3BvcnQsIG9yaWdkc3RfcG9ydDsKKwlfX2JlMTYgcmVwbHNyY19wb3J0LCByZXBsZHN0X3BvcnQ7CisJX191MTYgbWF0Y2hfZmxhZ3MsIGludmVydF9mbGFnczsKKwlfX3UxNiBzdGF0ZV9tYXNrLCBzdGF0dXNfbWFzazsKK307CisKK3N0cnVjdCB4dF9jb25udHJhY2tfbXRpbmZvMyB7CisJdW5pb24gbmZfaW5ldF9hZGRyIG9yaWdzcmNfYWRkciwgb3JpZ3NyY19tYXNrOworCXVuaW9uIG5mX2luZXRfYWRkciBvcmlnZHN0X2FkZHIsIG9yaWdkc3RfbWFzazsKKwl1bmlvbiBuZl9pbmV0X2FkZHIgcmVwbHNyY19hZGRyLCByZXBsc3JjX21hc2s7CisJdW5pb24gbmZfaW5ldF9hZGRyIHJlcGxkc3RfYWRkciwgcmVwbGRzdF9tYXNrOworCV9fdTMyIGV4cGlyZXNfbWluLCBleHBpcmVzX21heDsKKwlfX3UxNiBsNHByb3RvOworCV9fdTE2IG9yaWdzcmNfcG9ydCwgb3JpZ2RzdF9wb3J0OworCV9fdTE2IHJlcGxzcmNfcG9ydCwgcmVwbGRzdF9wb3J0OworCV9fdTE2IG1hdGNoX2ZsYWdzLCBpbnZlcnRfZmxhZ3M7CisJX191MTYgc3RhdGVfbWFzaywgc3RhdHVzX21hc2s7CisJX191MTYgb3JpZ3NyY19wb3J0X2hpZ2gsIG9yaWdkc3RfcG9ydF9oaWdoOworCV9fdTE2IHJlcGxzcmNfcG9ydF9oaWdoLCByZXBsZHN0X3BvcnRfaGlnaDsKK307CisKKyNlbmRpZiAvKl9YVF9DT05OVFJBQ0tfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jcHUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2NwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzdmMTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jcHUuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9YVF9DUFVfSAorI2RlZmluZSBfWFRfQ1BVX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB4dF9jcHVfaW5mbyB7CisJX191MzIJY3B1OworCV9fdTMyCWludmVydDsKK307CisKKyNlbmRpZiAvKl9YVF9DUFVfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9kY2NwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9kY2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3OWUxYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2RjY3AuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9YVF9EQ0NQX0hfCisjZGVmaW5lIF9YVF9EQ0NQX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFhUX0RDQ1BfU1JDX1BPUlRTCSAgICAgICAgMHgwMQorI2RlZmluZSBYVF9EQ0NQX0RFU1RfUE9SVFMJICAgICAgICAweDAyCisjZGVmaW5lIFhUX0RDQ1BfVFlQRQkJCTB4MDQKKyNkZWZpbmUgWFRfRENDUF9PUFRJT04JCQkweDA4CisKKyNkZWZpbmUgWFRfRENDUF9WQUxJRF9GTEFHUwkJMHgwZgorCitzdHJ1Y3QgeHRfZGNjcF9pbmZvIHsKKwlfX3UxNiBkcHRzWzJdOyAgLyogTWluLCBNYXggKi8KKwlfX3UxNiBzcHRzWzJdOyAgLyogTWluLCBNYXggKi8KKworCV9fdTE2IGZsYWdzOworCV9fdTE2IGludmZsYWdzOworCisJX191MTYgdHlwZW1hc2s7CisJX191OCBvcHRpb247Cit9OworCisjZW5kaWYgLyogX1hUX0RDQ1BfSF8gKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZGV2Z3JvdXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Rldmdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhYmRlMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Rldmdyb3VwLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfWFRfREVWR1JPVVBfSAorI2RlZmluZSBfWFRfREVWR1JPVVBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB4dF9kZXZncm91cF9mbGFncyB7CisJWFRfREVWR1JPVVBfTUFUQ0hfU1JDCT0gMHgxLAorCVhUX0RFVkdST1VQX0lOVkVSVF9TUkMJPSAweDIsCisJWFRfREVWR1JPVVBfTUFUQ0hfRFNUCT0gMHg0LAorCVhUX0RFVkdST1VQX0lOVkVSVF9EU1QJPSAweDgsCit9OworCitzdHJ1Y3QgeHRfZGV2Z3JvdXBfaW5mbyB7CisJX191MzIJZmxhZ3M7CisJX191MzIJc3JjX2dyb3VwOworCV9fdTMyCXNyY19tYXNrOworCV9fdTMyCWRzdF9ncm91cDsKKwlfX3UzMglkc3RfbWFzazsKK307CisKKyNlbmRpZiAvKiBfWFRfREVWR1JPVVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZHNjcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZHNjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1Zjg5MzIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9kc2NwLmgKQEAgLTAsMCArMSwzMSBAQAorLyogeF90YWJsZXMgbW9kdWxlIGZvciBtYXRjaGluZyB0aGUgSVB2NC9JUHY2IERTQ1AgZmllbGQKKyAqCisgKiAoQykgMjAwMiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciBHTlUgR1BMIHYyLCAxOTkxCisgKgorICogU2VlIFJGQzI0NzQgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIERTQ1AgZmllbGQgd2l0aGluIHRoZSBJUCBIZWFkZXIuCisgKgorICogeHRfZHNjcC5oLHYgMS4zIDIwMDIvMDgvMDUgMTk6MDA6MjEgbGFmb3JnZSBFeHAKKyovCisjaWZuZGVmIF9YVF9EU0NQX0gKKyNkZWZpbmUgX1hUX0RTQ1BfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBYVF9EU0NQX01BU0sJMHhmYwkvKiAxMTExMTEwMCAqLworI2RlZmluZSBYVF9EU0NQX1NISUZUCTIKKyNkZWZpbmUgWFRfRFNDUF9NQVgJMHgzZgkvKiAwMDExMTExMSAqLworCisvKiBtYXRjaCBpbmZvICovCitzdHJ1Y3QgeHRfZHNjcF9pbmZvIHsKKwlfX3U4IGRzY3A7CisJX191OCBpbnZlcnQ7Cit9OworCitzdHJ1Y3QgeHRfdG9zX21hdGNoX2luZm8geworCV9fdTggdG9zX21hc2s7CisJX191OCB0b3NfdmFsdWU7CisJX191OCBpbnZlcnQ7Cit9OworCisjZW5kaWYgLyogX1hUX0RTQ1BfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZXNwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9lc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTY4ODI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZXNwLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfWFRfRVNQX0gKKyNkZWZpbmUgX1hUX0VTUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgeHRfZXNwIHsKKwlfX3UzMiBzcGlzWzJdOwkvKiBTZWN1cml0eSBQYXJhbWV0ZXIgSW5kZXggKi8KKwlfX3U4ICBpbnZmbGFnczsJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworLyogVmFsdWVzIGZvciAiaW52ZmxhZ3MiIGZpZWxkIGluIHN0cnVjdCB4dF9lc3AuICovCisjZGVmaW5lIFhUX0VTUF9JTlZfU1BJCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBzcGkuICovCisjZGVmaW5lIFhUX0VTUF9JTlZfTUFTSwkweDAxCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworI2VuZGlmIC8qX1hUX0VTUF9IKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5MjViNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5oCkBAIC0wLDAgKzEsNjggQEAKKyNpZm5kZWYgX1hUX0hBU0hMSU1JVF9ICisjZGVmaW5lIF9YVF9IQVNITElNSVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogdGltaW5ncyBhcmUgaW4gbWlsbGlzZWNvbmRzLiAqLworI2RlZmluZSBYVF9IQVNITElNSVRfU0NBTEUgMTAwMDAKKy8qIDEvMTAsMDAwIHNlYyBwZXJpb2QgPT4gbWF4IG9mIDEwLDAwMC9zZWMuICBNaW4gcmF0ZSBpcyB0aGVuIDQyOTQ5MAorICAgc2Vjb25kcywgb3Igb25lIGV2ZXJ5IDU5IGhvdXJzLiAqLworCisvKiBkZXRhaWxzIG9mIHRoaXMgc3RydWN0dXJlIGhpZGRlbiBieSB0aGUgaW1wbGVtZW50YXRpb24gKi8KK3N0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlOworCitlbnVtIHsKKwlYVF9IQVNITElNSVRfSEFTSF9ESVAgPSAxIDw8IDAsCisJWFRfSEFTSExJTUlUX0hBU0hfRFBUID0gMSA8PCAxLAorCVhUX0hBU0hMSU1JVF9IQVNIX1NJUCA9IDEgPDwgMiwKKwlYVF9IQVNITElNSVRfSEFTSF9TUFQgPSAxIDw8IDMsCisJWFRfSEFTSExJTUlUX0lOVkVSVCAgID0gMSA8PCA0LAorfTsKKworc3RydWN0IGhhc2hsaW1pdF9jZmcgeworCV9fdTMyIG1vZGU7CSAgLyogYml0bWFzayBvZiBYVF9IQVNITElNSVRfSEFTSF8qICovCisJX191MzIgYXZnOyAgICAvKiBBdmVyYWdlIHNlY3MgYmV0d2VlbiBwYWNrZXRzICogc2NhbGUgKi8KKwlfX3UzMiBidXJzdDsgIC8qIFBlcmlvZCBtdWx0aXBsaWVyIGZvciB1cHBlciBsaW1pdC4gKi8KKworCS8qIHVzZXIgc3BlY2lmaWVkICovCisJX191MzIgc2l6ZTsJCS8qIGhvdyBtYW55IGJ1Y2tldHMgKi8KKwlfX3UzMiBtYXg7CQkvKiBtYXggbnVtYmVyIG9mIGVudHJpZXMgKi8KKwlfX3UzMiBnY19pbnRlcnZhbDsJLyogZ2MgaW50ZXJ2YWwgKi8KKwlfX3UzMiBleHBpcmU7CS8qIHdoZW4gZG8gZW50cmllcyBleHBpcmU/ICovCit9OworCitzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8geworCWNoYXIgbmFtZSBbSUZOQU1TSVpdOwkJLyogbmFtZSAqLworCXN0cnVjdCBoYXNobGltaXRfY2ZnIGNmZzsKKworCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCisJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvOworCXVuaW9uIHsKKwkJdm9pZCAqcHRyOworCQlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKm1hc3RlcjsKKwl9IHU7Cit9OworCitzdHJ1Y3QgaGFzaGxpbWl0X2NmZzEgeworCV9fdTMyIG1vZGU7CSAgLyogYml0bWFzayBvZiBYVF9IQVNITElNSVRfSEFTSF8qICovCisJX191MzIgYXZnOyAgICAvKiBBdmVyYWdlIHNlY3MgYmV0d2VlbiBwYWNrZXRzICogc2NhbGUgKi8KKwlfX3UzMiBidXJzdDsgIC8qIFBlcmlvZCBtdWx0aXBsaWVyIGZvciB1cHBlciBsaW1pdC4gKi8KKworCS8qIHVzZXIgc3BlY2lmaWVkICovCisJX191MzIgc2l6ZTsJCS8qIGhvdyBtYW55IGJ1Y2tldHMgKi8KKwlfX3UzMiBtYXg7CQkvKiBtYXggbnVtYmVyIG9mIGVudHJpZXMgKi8KKwlfX3UzMiBnY19pbnRlcnZhbDsJLyogZ2MgaW50ZXJ2YWwgKi8KKwlfX3UzMiBleHBpcmU7CS8qIHdoZW4gZG8gZW50cmllcyBleHBpcmU/ICovCisKKwlfX3U4IHNyY21hc2ssIGRzdG1hc2s7Cit9OworCitzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgeworCWNoYXIgbmFtZVtJRk5BTVNJWl07CisJc3RydWN0IGhhc2hsaW1pdF9jZmcxIGNmZzsKKworCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCisJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKK307CisKKyNlbmRpZiAvKl9YVF9IQVNITElNSVRfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9oZWxwZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNDI3NjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9oZWxwZXIuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX1hUX0hFTFBFUl9ICisjZGVmaW5lIF9YVF9IRUxQRVJfSAorCitzdHJ1Y3QgeHRfaGVscGVyX2luZm8geworCWludCBpbnZlcnQ7CisJY2hhciBuYW1lWzMwXTsKK307CisjZW5kaWYgLyogX1hUX0hFTFBFUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9pcHJhbmdlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9pcHJhbmdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmZDdjZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2lwcmFuZ2UuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9MSU5VWF9ORVRGSUxURVJfWFRfSVBSQU5HRV9ICisjZGVmaW5lIF9MSU5VWF9ORVRGSUxURVJfWFRfSVBSQU5HRV9IIDEKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisKK2VudW0geworCUlQUkFOR0VfU1JDICAgICA9IDEgPDwgMCwJLyogbWF0Y2ggc291cmNlIElQIGFkZHJlc3MgKi8KKwlJUFJBTkdFX0RTVCAgICAgPSAxIDw8IDEsCS8qIG1hdGNoIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgKi8KKwlJUFJBTkdFX1NSQ19JTlYgPSAxIDw8IDQsCS8qIG5lZ2F0ZSB0aGUgY29uZGl0aW9uICovCisJSVBSQU5HRV9EU1RfSU5WID0gMSA8PCA1LAkvKiAtIi0gKi8KK307CisKK3N0cnVjdCB4dF9pcHJhbmdlX210aW5mbyB7CisJdW5pb24gbmZfaW5ldF9hZGRyIHNyY19taW4sIHNyY19tYXg7CisJdW5pb24gbmZfaW5ldF9hZGRyIGRzdF9taW4sIGRzdF9tYXg7CisJX191OCBmbGFnczsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfTkVURklMVEVSX1hUX0lQUkFOR0VfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaXB2cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaXB2cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZjM0YWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9pcHZzLmgKQEAgLTAsMCArMSwyOSBAQAorI2lmbmRlZiBfWFRfSVBWU19ICisjZGVmaW5lIF9YVF9JUFZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geworCVhUX0lQVlNfSVBWU19QUk9QRVJUWSA9CTEgPDwgMCwgLyogYWxsIG90aGVyIG9wdGlvbnMgaW1wbHkgdGhpcyBvbmUgKi8KKwlYVF9JUFZTX1BST1RPID0JCTEgPDwgMSwKKwlYVF9JUFZTX1ZBRERSID0JCTEgPDwgMiwKKwlYVF9JUFZTX1ZQT1JUID0JCTEgPDwgMywKKwlYVF9JUFZTX0RJUiA9CQkxIDw8IDQsCisJWFRfSVBWU19NRVRIT0QgPQkxIDw8IDUsCisJWFRfSVBWU19WUE9SVENUTCA9CTEgPDwgNiwKKwlYVF9JUFZTX01BU0sgPQkJKDEgPDwgNykgLSAxLAorCVhUX0lQVlNfT05DRV9NQVNLID0JWFRfSVBWU19NQVNLICYgflhUX0lQVlNfSVBWU19QUk9QRVJUWQorfTsKKworc3RydWN0IHh0X2lwdnNfbXRpbmZvIHsKKwl1bmlvbiBuZl9pbmV0X2FkZHIJdmFkZHIsIHZtYXNrOworCV9fYmUxNgkJCXZwb3J0OworCV9fdTgJCQlsNHByb3RvOworCV9fdTgJCQlmd2RfbWV0aG9kOworCV9fYmUxNgkJCXZwb3J0Y3RsOworCisJX191OAkJCWludmVydDsKKwlfX3U4CQkJYml0bWFzazsKK307CisKKyNlbmRpZiAvKiBfWFRfSVBWU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9sZW5ndGguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2xlbmd0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MmVkN2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9sZW5ndGguaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9YVF9MRU5HVEhfSAorI2RlZmluZSBfWFRfTEVOR1RIX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB4dF9sZW5ndGhfaW5mbyB7CisgICAgX191MTYJbWluLCBtYXg7CisgICAgX191OAlpbnZlcnQ7Cit9OworCisjZW5kaWYgLypfWFRfTEVOR1RIX0gqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGltaXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2xpbWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0N2ZjNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2xpbWl0LmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfWFRfUkFURV9ICisjZGVmaW5lIF9YVF9SQVRFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIHRpbWluZ3MgYXJlIGluIG1pbGxpc2Vjb25kcy4gKi8KKyNkZWZpbmUgWFRfTElNSVRfU0NBTEUgMTAwMDAKKworc3RydWN0IHh0X2xpbWl0X3ByaXY7CisKKy8qIDEvMTAsMDAwIHNlYyBwZXJpb2QgPT4gbWF4IG9mIDEwLDAwMC9zZWMuICBNaW4gcmF0ZSBpcyB0aGVuIDQyOTQ5MAorICAgc2Vjb25kcywgb3Igb25lIGV2ZXJ5IDU5IGhvdXJzLiAqLworc3RydWN0IHh0X3JhdGVpbmZvIHsKKwlfX3UzMiBhdmc7ICAgIC8qIEF2ZXJhZ2Ugc2VjcyBiZXR3ZWVuIHBhY2tldHMgKiBzY2FsZSAqLworCV9fdTMyIGJ1cnN0OyAgLyogUGVyaW9kIG11bHRpcGxpZXIgZm9yIHVwcGVyIGxpbWl0LiAqLworCisJLyogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWwgKi8KKwl1bnNpZ25lZCBsb25nIHByZXY7IC8qIG1vdmVkIHRvIHh0X2xpbWl0X3ByaXYgKi8KKwlfX3UzMiBjcmVkaXQ7IC8qIG1vdmVkIHRvIHh0X2xpbWl0X3ByaXYgKi8KKwlfX3UzMiBjcmVkaXRfY2FwLCBjb3N0OworCisJc3RydWN0IHh0X2xpbWl0X3ByaXYgKm1hc3RlcjsKK307CisjZW5kaWYgLypfWFRfUkFURV9IKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X21hYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5MmNkYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X21hYy5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfWFRfTUFDX0gKKyNkZWZpbmUgX1hUX01BQ19ICisKK3N0cnVjdCB4dF9tYWNfaW5mbyB7CisgICAgdW5zaWduZWQgY2hhciBzcmNhZGRyW0VUSF9BTEVOXTsKKyAgICBpbnQgaW52ZXJ0OworfTsKKyNlbmRpZiAvKl9YVF9NQUNfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYXJrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYXJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhZGM0MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X21hcmsuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9YVF9NQVJLX0gKKyNkZWZpbmUgX1hUX01BUktfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHh0X21hcmtfdGdpbmZvMiB7CisJX191MzIgbWFyaywgbWFzazsKK307CisKK3N0cnVjdCB4dF9tYXJrX210aW5mbzEgeworCV9fdTMyIG1hcmssIG1hc2s7CisJX191OCBpbnZlcnQ7Cit9OworCisjZW5kaWYgLypfWFRfTUFSS19IKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X211bHRpcG9ydC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbXVsdGlwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3ZTcyZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X211bHRpcG9ydC5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgX1hUX01VTFRJUE9SVF9ICisjZGVmaW5lIF9YVF9NVUxUSVBPUlRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB4dF9tdWx0aXBvcnRfZmxhZ3MgeworCVhUX01VTFRJUE9SVF9TT1VSQ0UsCisJWFRfTVVMVElQT1JUX0RFU1RJTkFUSU9OLAorCVhUX01VTFRJUE9SVF9FSVRIRVIKK307CisKKyNkZWZpbmUgWFRfTVVMVElfUE9SVFMJMTUKKworLyogTXVzdCBmaXQgaW5zaWRlIHVuaW9uIHh0X21hdGNoaW5mbzogMTYgYnl0ZXMgKi8KK3N0cnVjdCB4dF9tdWx0aXBvcnQgeworCV9fdTggZmxhZ3M7CQkJCS8qIFR5cGUgb2YgY29tcGFyaXNvbiAqLworCV9fdTggY291bnQ7CQkJCS8qIE51bWJlciBvZiBwb3J0cyAqLworCV9fdTE2IHBvcnRzW1hUX01VTFRJX1BPUlRTXTsJLyogUG9ydHMgKi8KK307CisKK3N0cnVjdCB4dF9tdWx0aXBvcnRfdjEgeworCV9fdTggZmxhZ3M7CQkJCS8qIFR5cGUgb2YgY29tcGFyaXNvbiAqLworCV9fdTggY291bnQ7CQkJCS8qIE51bWJlciBvZiBwb3J0cyAqLworCV9fdTE2IHBvcnRzW1hUX01VTFRJX1BPUlRTXTsJLyogUG9ydHMgKi8KKwlfX3U4IHBmbGFnc1tYVF9NVUxUSV9QT1JUU107CS8qIFBvcnQgZmxhZ3MgKi8KKwlfX3U4IGludmVydDsJCQkvKiBJbnZlcnQgZmxhZyAqLworfTsKKworI2VuZGlmIC8qX1hUX01VTFRJUE9SVF9IKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X29zZi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfb3NmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhZmE0OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X29zZi5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzKyBFdmdlbml5IFBvbHlha292IDxqb2hucG9sQDJrYS5teHQucnU+CisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfWFRfT1NGX0gKKyNkZWZpbmUgX1hUX09TRl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIE1BWEdFTlJFTEVOCQkzMgorCisjZGVmaW5lIFhUX09TRl9HRU5SRQkJKDE8PDApCisjZGVmaW5lCVhUX09TRl9UVEwJCSgxPDwxKQorI2RlZmluZSBYVF9PU0ZfTE9HCQkoMTw8MikKKyNkZWZpbmUgWFRfT1NGX0lOVkVSVAkJKDE8PDMpCisKKyNkZWZpbmUgWFRfT1NGX0xPR0xFVkVMX0FMTAkwCS8qIGxvZyBhbGwgbWF0Y2hlZCBmaW5nZXJwcmludHMgKi8KKyNkZWZpbmUgWFRfT1NGX0xPR0xFVkVMX0ZJUlNUCTEJLyogbG9nIG9ubHkgdGhlIGZpcnN0IG1hdGNlZCBmaW5nZXJwcmludCAqLworI2RlZmluZSBYVF9PU0ZfTE9HTEVWRUxfQUxMX0tOT1dOCTIgLyogZG8gbm90IGxvZyB1bmtub3duIHBhY2tldHMgKi8KKworI2RlZmluZSBYVF9PU0ZfVFRMX1RSVUUJCTAJLyogVHJ1ZSBpcCBhbmQgZmluZ2VycHJpbnQgVFRMIGNvbXBhcmlzb24gKi8KKyNkZWZpbmUgWFRfT1NGX1RUTF9MRVNTCQkxCS8qIENoZWNrIGlmIGlwIFRUTCBpcyBsZXNzIHRoYW4gZmluZ2VycHJpbnQgb25lICovCisjZGVmaW5lIFhUX09TRl9UVExfTk9DSEVDSwkyCS8qIERvIG5vdCBjb21wYXJlIGlwIGFuZCBmaW5nZXJwcmludCBUVEwgYXQgYWxsICovCisKK3N0cnVjdCB4dF9vc2ZfaW5mbyB7CisJY2hhcgkJCWdlbnJlW01BWEdFTlJFTEVOXTsKKwlfX3UzMgkJCWxlbjsKKwlfX3UzMgkJCWZsYWdzOworCV9fdTMyCQkJbG9nbGV2ZWw7CisJX191MzIJCQl0dGw7Cit9OworCisvKgorICogV2lsZGNhcmQgTVNTIChraW5kIG9mKS4KKyAqIEl0IGlzIHVzZWQgdG8gaW1wbGVtZW50IGEgc3RhdGUgbWFjaGluZSBmb3IgdGhlIGRpZmZlcmVudCB3aWxkY2FyZCB2YWx1ZXMKKyAqIG9mIHRoZSBNU1MgYW5kIHdpbmRvdyBzaXplcy4KKyAqLworc3RydWN0IHh0X29zZl93YyB7CisJX191MzIJCQl3YzsKKwlfX3UzMgkJCXZhbDsKK307CisKKy8qCisgKiBUaGlzIHN0cnVjdCByZXByZXNlbnRzIElBTkEgb3B0aW9ucworICogaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy90Y3AtcGFyYW1ldGVycworICovCitzdHJ1Y3QgeHRfb3NmX29wdCB7CisJX191MTYJCQlraW5kLCBsZW5ndGg7CisJc3RydWN0IHh0X29zZl93Ywl3YzsKK307CisKK3N0cnVjdCB4dF9vc2ZfdXNlcl9maW5nZXIgeworCXN0cnVjdCB4dF9vc2Zfd2MJd3NzOworCisJX191OAkJCXR0bCwgZGY7CisJX191MTYJCQlzcywgbXNzOworCV9fdTE2CQkJb3B0X251bTsKKworCWNoYXIJCQlnZW5yZVtNQVhHRU5SRUxFTl07CisJY2hhcgkJCXZlcnNpb25bTUFYR0VOUkVMRU5dOworCWNoYXIJCQlzdWJ0eXBlW01BWEdFTlJFTEVOXTsKKworCS8qIE1BWF9JUE9QVExFTiBpcyBtYXhpbXVtIGlmIGFsbCBvcHRpb25zIGFyZSBOT1BzIG9yIEVPTHMgKi8KKwlzdHJ1Y3QgeHRfb3NmX29wdAlvcHRbTUFYX0lQT1BUTEVOXTsKK307CisKK3N0cnVjdCB4dF9vc2Zfbmxtc2cgeworCXN0cnVjdCB4dF9vc2ZfdXNlcl9maW5nZXIJZjsKKwlzdHJ1Y3QgaXBoZHIJCWlwOworCXN0cnVjdCB0Y3BoZHIJCXRjcDsKK307CisKKy8qIERlZmluZXMgZm9yIElBTkEgb3B0aW9uIGtpbmRzICovCisKK2VudW0gaWFuYV9vcHRpb25zIHsKKwlPU0ZPUFRfRU9MID0gMCwJCS8qIEVuZCBvZiBvcHRpb25zICovCisJT1NGT1BUX05PUCwgCQkvKiBOT1AgKi8KKwlPU0ZPUFRfTVNTLCAJCS8qIE1heGltdW0gc2VnbWVudCBzaXplICovCisJT1NGT1BUX1dTTywgCQkvKiBXaW5kb3cgc2NhbGUgb3B0aW9uICovCisJT1NGT1BUX1NBQ0tQLAkJLyogU0FDSyBwZXJtaXR0ZWQgKi8KKwlPU0ZPUFRfU0FDSywJCS8qIFNBQ0sgKi8KKwlPU0ZPUFRfRUNITywKKwlPU0ZPUFRfRUNIT1JFUExZLAorCU9TRk9QVF9UUywJCS8qIFRpbWVzdGFtcCBvcHRpb24gKi8KKwlPU0ZPUFRfUE9DUCwJCS8qIFBhcnRpYWwgT3JkZXIgQ29ubmVjdGlvbiBQZXJtaXR0ZWQgKi8KKwlPU0ZPUFRfUE9TUCwJCS8qIFBhcnRpYWwgT3JkZXIgU2VydmljZSBQcm9maWxlICovCisKKwkvKiBPdGhlcnMgYXJlIG5vdCB1c2VkIGluIHRoZSBjdXJyZW50IE9TRiAqLworCU9TRk9QVF9FTVBUWSA9IDI1NSwKK307CisKKy8qCisgKiBJbml0aWFsIHdpbmRvdyBzaXplIG9wdGlvbiBzdGF0ZSBtYWNoaW5lOiBtdWx0aXBsZSBvZiBtc3MsIG10dSBvcgorICogcGxhaW4gbnVtZXJpYyB2YWx1ZS4gQ2FuIGFsc28gYmUgbWFkZSBhcyBwbGFpbiBudW1lcmljIHZhbHVlIHdoaWNoCisgKiBpcyBub3QgYSBtdWx0aXBsZSBvZiBzcGVjaWZpZWQgdmFsdWUuCisgKi8KK2VudW0geHRfb3NmX3dpbmRvd19zaXplX29wdGlvbnMgeworCU9TRl9XU1NfUExBSU4JPSAwLAorCU9TRl9XU1NfTVNTLAorCU9TRl9XU1NfTVRVLAorCU9TRl9XU1NfTU9EVUxPLAorCU9TRl9XU1NfTUFYLAorfTsKKworLyoKKyAqIEFkZC9yZW1vdmUgZmluZ2VycHJpbnQgZnJvbSB0aGUga2VybmVsLgorICovCitlbnVtIHh0X29zZl9tc2dfdHlwZXMgeworCU9TRl9NU0dfQURELAorCU9TRl9NU0dfUkVNT1ZFLAorCU9TRl9NU0dfTUFYLAorfTsKKworZW51bSB4dF9vc2ZfYXR0cl90eXBlIHsKKwlPU0ZfQVRUUl9VTlNQRUMsCisJT1NGX0FUVFJfRklOR0VSLAorCU9TRl9BVFRSX01BWCwKK307CisKKyNlbmRpZgkJCQkvKiBfWFRfT1NGX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X293bmVyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9vd25lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwODE3NjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9vd25lci5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX1hUX09XTkVSX01BVENIX0gKKyNkZWZpbmUgX1hUX09XTkVSX01BVENIX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geworCVhUX09XTkVSX1VJRCAgICA9IDEgPDwgMCwKKwlYVF9PV05FUl9HSUQgICAgPSAxIDw8IDEsCisJWFRfT1dORVJfU09DS0VUID0gMSA8PCAyLAorfTsKKworc3RydWN0IHh0X293bmVyX21hdGNoX2luZm8geworCV9fdTMyIHVpZF9taW4sIHVpZF9tYXg7CisJX191MzIgZ2lkX21pbiwgZ2lkX21heDsKKwlfX3U4IG1hdGNoLCBpbnZlcnQ7Cit9OworCisjZW5kaWYgLyogX1hUX09XTkVSX01BVENIX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDUzNjYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX1hUX1BIWVNERVZfSAorI2RlZmluZSBfWFRfUEhZU0RFVl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKyNkZWZpbmUgWFRfUEhZU0RFVl9PUF9JTgkJMHgwMQorI2RlZmluZSBYVF9QSFlTREVWX09QX09VVAkJMHgwMgorI2RlZmluZSBYVF9QSFlTREVWX09QX0JSSURHRUQJCTB4MDQKKyNkZWZpbmUgWFRfUEhZU0RFVl9PUF9JU0lOCQkweDA4CisjZGVmaW5lIFhUX1BIWVNERVZfT1BfSVNPVVQJCTB4MTAKKyNkZWZpbmUgWFRfUEhZU0RFVl9PUF9NQVNLCQkoMHgyMCAtIDEpCisKK3N0cnVjdCB4dF9waHlzZGV2X2luZm8geworCWNoYXIgcGh5c2luZGV2W0lGTkFNU0laXTsKKwljaGFyIGluX21hc2tbSUZOQU1TSVpdOworCWNoYXIgcGh5c291dGRldltJRk5BTVNJWl07CisJY2hhciBvdXRfbWFza1tJRk5BTVNJWl07CisJX191OCBpbnZlcnQ7CisJX191OCBiaXRtYXNrOworfTsKKworI2VuZGlmIC8qX1hUX1BIWVNERVZfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wa3R0eXBlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wa3R0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2NWNmNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3BrdHR5cGUuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX1hUX1BLVFRZUEVfSAorI2RlZmluZSBfWFRfUEtUVFlQRV9ICisKK3N0cnVjdCB4dF9wa3R0eXBlX2luZm8geworCWludAlwa3R0eXBlOworCWludAlpbnZlcnQ7Cit9OworI2VuZGlmIC8qX1hUX1BLVFRZUEVfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wb2xpY3kuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3BvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNDZlYWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wb2xpY3kuaApAQCAtMCwwICsxLDU4IEBACisjaWZuZGVmIF9YVF9QT0xJQ1lfSAorI2RlZmluZSBfWFRfUE9MSUNZX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgWFRfUE9MSUNZX01BWF9FTEVNCTQKKworZW51bSB4dF9wb2xpY3lfZmxhZ3MgeworCVhUX1BPTElDWV9NQVRDSF9JTgk9IDB4MSwKKwlYVF9QT0xJQ1lfTUFUQ0hfT1VUCT0gMHgyLAorCVhUX1BPTElDWV9NQVRDSF9OT05FCT0gMHg0LAorCVhUX1BPTElDWV9NQVRDSF9TVFJJQ1QJPSAweDgsCit9OworCitlbnVtIHh0X3BvbGljeV9tb2RlcyB7CisJWFRfUE9MSUNZX01PREVfVFJBTlNQT1JULAorCVhUX1BPTElDWV9NT0RFX1RVTk5FTAorfTsKKworc3RydWN0IHh0X3BvbGljeV9zcGVjIHsKKwlfX3U4CXNhZGRyOjEsCisJCQlkYWRkcjoxLAorCQkJcHJvdG86MSwKKwkJCW1vZGU6MSwKKwkJCXNwaToxLAorCQkJcmVxaWQ6MTsKK307CisKK3VuaW9uIHh0X3BvbGljeV9hZGRyIHsKKwlzdHJ1Y3QgaW5fYWRkcglhNDsKKwlzdHJ1Y3QgaW42X2FkZHIJYTY7Cit9OworCitzdHJ1Y3QgeHRfcG9saWN5X2VsZW0geworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuaW9uIHh0X3BvbGljeV9hZGRyIHNhZGRyOworCQkJdW5pb24geHRfcG9saWN5X2FkZHIgc21hc2s7CisJCQl1bmlvbiB4dF9wb2xpY3lfYWRkciBkYWRkcjsKKwkJCXVuaW9uIHh0X3BvbGljeV9hZGRyIGRtYXNrOworCQl9OworCX07CisJX19iZTMyCQkJc3BpOworCV9fdTMyCQlyZXFpZDsKKwlfX3U4CQlwcm90bzsKKwlfX3U4CQltb2RlOworCisJc3RydWN0IHh0X3BvbGljeV9zcGVjCW1hdGNoOworCXN0cnVjdCB4dF9wb2xpY3lfc3BlYwlpbnZlcnQ7Cit9OworCitzdHJ1Y3QgeHRfcG9saWN5X2luZm8geworCXN0cnVjdCB4dF9wb2xpY3lfZWxlbSBwb2xbWFRfUE9MSUNZX01BWF9FTEVNXTsKKwlfX3UxNiBmbGFnczsKKwlfX3UxNiBsZW47Cit9OworCisjZW5kaWYgLyogX1hUX1BPTElDWV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9xdW90YS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcXVvdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzE0NzIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcXVvdGEuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9YVF9RVU9UQV9ICisjZGVmaW5lIF9YVF9RVU9UQV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHh0X3F1b3RhX2ZsYWdzIHsKKwlYVF9RVU9UQV9JTlZFUlQJCT0gMHgxLAorfTsKKyNkZWZpbmUgWFRfUVVPVEFfTUFTSwkJMHgxCisKK3N0cnVjdCB4dF9xdW90YV9wcml2OworCitzdHJ1Y3QgeHRfcXVvdGFfaW5mbyB7CisJX191MzIgZmxhZ3M7CisJX191MzIgcGFkOworCV9fYWxpZ25lZF91NjQgcXVvdGE7CisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXN0cnVjdCB4dF9xdW90YV9wcml2CSptYXN0ZXI7Cit9OworCisjZW5kaWYgLyogX1hUX1FVT1RBX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JhdGVlc3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JhdGVlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDBhNjE5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcmF0ZWVzdC5oCkBAIC0wLDAgKzEsMzcgQEAKKyNpZm5kZWYgX1hUX1JBVEVFU1RfTUFUQ0hfSAorI2RlZmluZSBfWFRfUkFURUVTVF9NQVRDSF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHh0X3JhdGVlc3RfbWF0Y2hfZmxhZ3MgeworCVhUX1JBVEVFU1RfTUFUQ0hfSU5WRVJUCT0gMTw8MCwKKwlYVF9SQVRFRVNUX01BVENIX0FCUwk9IDE8PDEsCisJWFRfUkFURUVTVF9NQVRDSF9SRUwJPSAxPDwyLAorCVhUX1JBVEVFU1RfTUFUQ0hfREVMVEEJPSAxPDwzLAorCVhUX1JBVEVFU1RfTUFUQ0hfQlBTCT0gMTw8NCwKKwlYVF9SQVRFRVNUX01BVENIX1BQUwk9IDE8PDUsCit9OworCitlbnVtIHh0X3JhdGVlc3RfbWF0Y2hfbW9kZSB7CisJWFRfUkFURUVTVF9NQVRDSF9OT05FLAorCVhUX1JBVEVFU1RfTUFUQ0hfRVEsCisJWFRfUkFURUVTVF9NQVRDSF9MVCwKKwlYVF9SQVRFRVNUX01BVENIX0dULAorfTsKKworc3RydWN0IHh0X3JhdGVlc3RfbWF0Y2hfaW5mbyB7CisJY2hhcgkJCW5hbWUxW0lGTkFNU0laXTsKKwljaGFyCQkJbmFtZTJbSUZOQU1TSVpdOworCV9fdTE2CQlmbGFnczsKKwlfX3UxNgkJbW9kZTsKKwlfX3UzMgkJYnBzMTsKKwlfX3UzMgkJcHBzMTsKKwlfX3UzMgkJYnBzMjsKKwlfX3UzMgkJcHBzMjsKKworCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCisJc3RydWN0IHh0X3JhdGVlc3QJKmVzdDEgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCXN0cnVjdCB4dF9yYXRlZXN0CSplc3QyIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKK307CisKKyNlbmRpZiAvKiBfWFRfUkFURUVTVF9NQVRDSF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9yZWFsbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcmVhbG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGE4MmVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcmVhbG0uaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9YVF9SRUFMTV9ICisjZGVmaW5lIF9YVF9SRUFMTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgeHRfcmVhbG1faW5mbyB7CisJX191MzIgaWQ7CisJX191MzIgbWFzazsKKwlfX3U4IGludmVydDsKK307CisKKyNlbmRpZiAvKiBfWFRfUkVBTE1fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcmVjZW50LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9yZWNlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzMxOGUwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcmVjZW50LmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBfTElOVVhfTkVURklMVEVSX1hUX1JFQ0VOVF9ICisjZGVmaW5lIF9MSU5VWF9ORVRGSUxURVJfWFRfUkVDRU5UX0ggMQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB7CisJWFRfUkVDRU5UX0NIRUNLICAgID0gMSA8PCAwLAorCVhUX1JFQ0VOVF9TRVQgICAgICA9IDEgPDwgMSwKKwlYVF9SRUNFTlRfVVBEQVRFICAgPSAxIDw8IDIsCisJWFRfUkVDRU5UX1JFTU9WRSAgID0gMSA8PCAzLAorCVhUX1JFQ0VOVF9UVEwgICAgICA9IDEgPDwgNCwKKwlYVF9SRUNFTlRfUkVBUCAgICAgPSAxIDw8IDUsCisKKwlYVF9SRUNFTlRfU09VUkNFICAgPSAwLAorCVhUX1JFQ0VOVF9ERVNUICAgICA9IDEsCisKKwlYVF9SRUNFTlRfTkFNRV9MRU4gPSAyMDAsCit9OworCisvKiBPbmx5IGFsbG93ZWQgd2l0aCAtLXJjaGVjayBhbmQgLS11cGRhdGUgKi8KKyNkZWZpbmUgWFRfUkVDRU5UX01PRElGSUVSUyAoWFRfUkVDRU5UX1RUTHxYVF9SRUNFTlRfUkVBUCkKKworI2RlZmluZSBYVF9SRUNFTlRfVkFMSURfRkxBR1MgKFhUX1JFQ0VOVF9DSEVDS3xYVF9SRUNFTlRfU0VUfFhUX1JFQ0VOVF9VUERBVEV8XAorCQkJICAgICAgIFhUX1JFQ0VOVF9SRU1PVkV8WFRfUkVDRU5UX1RUTHxYVF9SRUNFTlRfUkVBUCkKKworc3RydWN0IHh0X3JlY2VudF9tdGluZm8geworCV9fdTMyIHNlY29uZHM7CisJX191MzIgaGl0X2NvdW50OworCV9fdTggY2hlY2tfc2V0OworCV9fdTggaW52ZXJ0OworCWNoYXIgbmFtZVtYVF9SRUNFTlRfTkFNRV9MRU5dOworCV9fdTggc2lkZTsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfTkVURklMVEVSX1hUX1JFQ0VOVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zY3RwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zY3RwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwMWU2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3NjdHAuaApAQCAtMCwwICsxLDkyIEBACisjaWZuZGVmIF9YVF9TQ1RQX0hfCisjZGVmaW5lIF9YVF9TQ1RQX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFhUX1NDVFBfU1JDX1BPUlRTCSAgICAgICAgMHgwMQorI2RlZmluZSBYVF9TQ1RQX0RFU1RfUE9SVFMJICAgICAgICAweDAyCisjZGVmaW5lIFhUX1NDVFBfQ0hVTktfVFlQRVMJCTB4MDQKKworI2RlZmluZSBYVF9TQ1RQX1ZBTElEX0ZMQUdTCQkweDA3CisKK3N0cnVjdCB4dF9zY3RwX2ZsYWdfaW5mbyB7CisJX191OCBjaHVua3R5cGU7CisJX191OCBmbGFnOworCV9fdTggZmxhZ19tYXNrOworfTsKKworI2RlZmluZSBYVF9OVU1fU0NUUF9GTEFHUwk0CisKK3N0cnVjdCB4dF9zY3RwX2luZm8geworCV9fdTE2IGRwdHNbMl07ICAvKiBNaW4sIE1heCAqLworCV9fdTE2IHNwdHNbMl07ICAvKiBNaW4sIE1heCAqLworCisJX191MzIgY2h1bmttYXBbMjU2IC8gc2l6ZW9mIChfX3UzMildOyAgLyogQml0IG1hc2sgb2YgY2h1bmtzIHRvIGJlIG1hdGNoZWQgYWNjb3JkaW5nIHRvIFJGQyAyOTYwICovCisKKyNkZWZpbmUgU0NUUF9DSFVOS19NQVRDSF9BTlkgICAweDAxICAvKiBNYXRjaCBpZiBhbnkgb2YgdGhlIGNodW5rIHR5cGVzIGFyZSBwcmVzZW50ICovCisjZGVmaW5lIFNDVFBfQ0hVTktfTUFUQ0hfQUxMICAgMHgwMiAgLyogTWF0Y2ggaWYgYWxsIG9mIHRoZSBjaHVuayB0eXBlcyBhcmUgcHJlc2VudCAqLworI2RlZmluZSBTQ1RQX0NIVU5LX01BVENIX09OTFkgIDB4MDQgIC8qIE1hdGNoIGlmIHRoZXNlIGFyZSB0aGUgb25seSBjaHVuayB0eXBlcyBwcmVzZW50ICovCisKKwlfX3UzMiBjaHVua19tYXRjaF90eXBlOworCXN0cnVjdCB4dF9zY3RwX2ZsYWdfaW5mbyBmbGFnX2luZm9bWFRfTlVNX1NDVFBfRkxBR1NdOworCWludCBmbGFnX2NvdW50OworCisJX191MzIgZmxhZ3M7CisJX191MzIgaW52ZmxhZ3M7Cit9OworCisjZGVmaW5lIGJ5dGVzKHR5cGUpIChzaXplb2YodHlwZSkgKiA4KQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfU0VUKGNodW5rbWFwLCB0eXBlKSAJCVwKKwlkbyB7IAkJCQkJCVwKKwkJKGNodW5rbWFwKVt0eXBlIC8gYnl0ZXMoX191MzIpXSB8PSAJXAorCQkJMSA8PCAodHlwZSAlIGJ5dGVzKF9fdTMyKSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfQ0xFQVIoY2h1bmttYXAsIHR5cGUpCQkgCVwKKwlkbyB7CQkJCQkJCVwKKwkJKGNodW5rbWFwKVt0eXBlIC8gYnl0ZXMoX191MzIpXSAmPSAJCVwKKwkJCX4oMSA8PCAodHlwZSAlIGJ5dGVzKF9fdTMyKSkpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX0lTX1NFVChjaHVua21hcCwgdHlwZSkgCQkJXAorKHsJCQkJCQkJCVwKKwkoKGNodW5rbWFwKVt0eXBlIC8gYnl0ZXMgKF9fdTMyKV0gJiAJCVwKKwkJKDEgPDwgKHR5cGUgJSBieXRlcyAoX191MzIpKSkpID8gMTogMDsJXAorfSkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX1JFU0VUKGNodW5rbWFwKSBcCisJbWVtc2V0KChjaHVua21hcCksIDAsIHNpemVvZihjaHVua21hcCkpCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9TRVRfQUxMKGNodW5rbWFwKSBcCisJbWVtc2V0KChjaHVua21hcCksIH4wVSwgc2l6ZW9mKGNodW5rbWFwKSkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX0NPUFkoZGVzdG1hcCwgc3JjbWFwKSBcCisJbWVtY3B5KChkZXN0bWFwKSwgKHNyY21hcCksIHNpemVvZihzcmNtYXApKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfSVNfQ0xFQVIoY2h1bmttYXApIFwKKwlfX3NjdHBfY2h1bmttYXBfaXNfY2xlYXIoKGNodW5rbWFwKSwgQVJSQVlfU0laRShjaHVua21hcCkpCitzdGF0aWMgX19pbmxpbmVfXyBib29sCitfX3NjdHBfY2h1bmttYXBfaXNfY2xlYXIoY29uc3QgX191MzIgKmNodW5rbWFwLCB1bnNpZ25lZCBpbnQgbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQorCQlpZiAoY2h1bmttYXBbaV0pCisJCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9JU19BTExfU0VUKGNodW5rbWFwKSBcCisJX19zY3RwX2NodW5rbWFwX2lzX2FsbF9zZXQoKGNodW5rbWFwKSwgQVJSQVlfU0laRShjaHVua21hcCkpCitzdGF0aWMgX19pbmxpbmVfXyBib29sCitfX3NjdHBfY2h1bmttYXBfaXNfYWxsX3NldChjb25zdCBfX3UzMiAqY2h1bmttYXAsIHVuc2lnbmVkIGludCBuKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpCisJCWlmIChjaHVua21hcFtpXSAhPSB+MFUpCisJCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZiAvKiBfWFRfU0NUUF9IXyAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zZXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNDA1YWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zZXQuaApAQCAtMCwwICsxLDY1IEBACisjaWZuZGVmIF9YVF9TRVRfSAorI2RlZmluZSBfWFRfU0VUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldC5oPgorCisvKiBSZXZpc2lvbiAwIGludGVyZmFjZTogYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIG5ldGZpbHRlci9pcHRhYmxlcyAqLworCisvKgorICogT3B0aW9uIGZsYWdzIGZvciBrZXJuZWwgb3BlcmF0aW9ucyAoeHRfc2V0X2luZm9fdjApCisgKi8KKyNkZWZpbmUgSVBTRVRfU1JDCQkweDAxCS8qIFNvdXJjZSBtYXRjaC9hZGQgKi8KKyNkZWZpbmUgSVBTRVRfRFNUCQkweDAyCS8qIERlc3RpbmF0aW9uIG1hdGNoL2FkZCAqLworI2RlZmluZSBJUFNFVF9NQVRDSF9JTlYJCTB4MDQJLyogSW52ZXJzZSBtYXRjaGluZyAqLworCitzdHJ1Y3QgeHRfc2V0X2luZm9fdjAgeworCWlwX3NldF9pZF90IGluZGV4OworCXVuaW9uIHsKKwkJX191MzIgZmxhZ3NbSVBTRVRfRElNX01BWCArIDFdOworCQlzdHJ1Y3QgeworCQkJX191MzIgX19mbGFnc1tJUFNFVF9ESU1fTUFYXTsKKwkJCV9fdTggZGltOworCQkJX191OCBmbGFnczsKKwkJfSBjb21wYXQ7CisJfSB1OworfTsKKworLyogbWF0Y2ggYW5kIHRhcmdldCBpbmZvcyAqLworc3RydWN0IHh0X3NldF9pbmZvX21hdGNoX3YwIHsKKwlzdHJ1Y3QgeHRfc2V0X2luZm9fdjAgbWF0Y2hfc2V0OworfTsKKworc3RydWN0IHh0X3NldF9pbmZvX3RhcmdldF92MCB7CisJc3RydWN0IHh0X3NldF9pbmZvX3YwIGFkZF9zZXQ7CisJc3RydWN0IHh0X3NldF9pbmZvX3YwIGRlbF9zZXQ7Cit9OworCisvKiBSZXZpc2lvbiAxICBtYXRjaCBhbmQgdGFyZ2V0ICovCisKK3N0cnVjdCB4dF9zZXRfaW5mbyB7CisJaXBfc2V0X2lkX3QgaW5kZXg7CisJX191OCBkaW07CisJX191OCBmbGFnczsKK307CisKKy8qIG1hdGNoIGFuZCB0YXJnZXQgaW5mb3MgKi8KK3N0cnVjdCB4dF9zZXRfaW5mb19tYXRjaF92MSB7CisJc3RydWN0IHh0X3NldF9pbmZvIG1hdGNoX3NldDsKK307CisKK3N0cnVjdCB4dF9zZXRfaW5mb190YXJnZXRfdjEgeworCXN0cnVjdCB4dF9zZXRfaW5mbyBhZGRfc2V0OworCXN0cnVjdCB4dF9zZXRfaW5mbyBkZWxfc2V0OworfTsKKworLyogUmV2aXNpb24gMiB0YXJnZXQgKi8KKworc3RydWN0IHh0X3NldF9pbmZvX3RhcmdldF92MiB7CisJc3RydWN0IHh0X3NldF9pbmZvIGFkZF9zZXQ7CisJc3RydWN0IHh0X3NldF9pbmZvIGRlbF9zZXQ7CisJdTMyIGZsYWdzOworCXUzMiB0aW1lb3V0OworfTsKKworI2VuZGlmIC8qX1hUX1NFVF9IKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3NvY2tldC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkNzIxNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3NvY2tldC5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX1hUX1NPQ0tFVF9ICisjZGVmaW5lIF9YVF9TT0NLRVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB7CisJWFRfU09DS0VUX1RSQU5TUEFSRU5UID0gMSA8PCAwLAorfTsKKworc3RydWN0IHh0X3NvY2tldF9tdGluZm8xIHsKKwlfX3U4IGZsYWdzOworfTsKKworI2VuZGlmIC8qIF9YVF9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc3RhdGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzMmRlOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfWFRfU1RBVEVfSAorI2RlZmluZSBfWFRfU1RBVEVfSAorCisjZGVmaW5lIFhUX1NUQVRFX0JJVChjdGluZm8pICgxIDw8ICgoY3RpbmZvKSVJUF9DVF9JU19SRVBMWSsxKSkKKyNkZWZpbmUgWFRfU1RBVEVfSU5WQUxJRCAoMSA8PCAwKQorCisjZGVmaW5lIFhUX1NUQVRFX1VOVFJBQ0tFRCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMSkpCisKK3N0cnVjdCB4dF9zdGF0ZV9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgc3RhdGVtYXNrOworfTsKKyNlbmRpZiAvKl9YVF9TVEFURV9IKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0YXRpc3RpYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc3RhdGlzdGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5ODNlZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0YXRpc3RpYy5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX1hUX1NUQVRJU1RJQ19ICisjZGVmaW5lIF9YVF9TVEFUSVNUSUNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB4dF9zdGF0aXN0aWNfbW9kZSB7CisJWFRfU1RBVElTVElDX01PREVfUkFORE9NLAorCVhUX1NUQVRJU1RJQ19NT0RFX05USCwKKwlfX1hUX1NUQVRJU1RJQ19NT0RFX01BWAorfTsKKyNkZWZpbmUgWFRfU1RBVElTVElDX01PREVfTUFYIChfX1hUX1NUQVRJU1RJQ19NT0RFX01BWCAtIDEpCisKK2VudW0geHRfc3RhdGlzdGljX2ZsYWdzIHsKKwlYVF9TVEFUSVNUSUNfSU5WRVJUCQk9IDB4MSwKK307CisjZGVmaW5lIFhUX1NUQVRJU1RJQ19NQVNLCQkweDEKKworc3RydWN0IHh0X3N0YXRpc3RpY19wcml2OworCitzdHJ1Y3QgeHRfc3RhdGlzdGljX2luZm8geworCV9fdTE2CQkJbW9kZTsKKwlfX3UxNgkJCWZsYWdzOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTMyCXByb2JhYmlsaXR5OworCQl9IHJhbmRvbTsKKwkJc3RydWN0IHsKKwkJCV9fdTMyCWV2ZXJ5OworCQkJX191MzIJcGFja2V0OworCQkJX191MzIJY291bnQ7IC8qIHVudXNlZCAqLworCQl9IG50aDsKKwl9IHU7CisJc3RydWN0IHh0X3N0YXRpc3RpY19wcml2ICptYXN0ZXIgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworfTsKKworI2VuZGlmIC8qIF9YVF9TVEFUSVNUSUNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc3RyaW5nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzUzNDdjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc3RyaW5nLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBfWFRfU1RSSU5HX0gKKyNkZWZpbmUgX1hUX1NUUklOR19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFhUX1NUUklOR19NQVhfUEFUVEVSTl9TSVpFIDEyOAorI2RlZmluZSBYVF9TVFJJTkdfTUFYX0FMR09fTkFNRV9TSVpFIDE2CisKK2VudW0geworCVhUX1NUUklOR19GTEFHX0lOVkVSVAkJPSAweDAxLAorCVhUX1NUUklOR19GTEFHX0lHTk9SRUNBU0UJPSAweDAyCit9OworCitzdHJ1Y3QgeHRfc3RyaW5nX2luZm8geworCV9fdTE2IGZyb21fb2Zmc2V0OworCV9fdTE2IHRvX29mZnNldDsKKwljaGFyCSAgYWxnb1tYVF9TVFJJTkdfTUFYX0FMR09fTkFNRV9TSVpFXTsKKwljaGFyIAkgIHBhdHRlcm5bWFRfU1RSSU5HX01BWF9QQVRURVJOX1NJWkVdOworCV9fdTggIHBhdGxlbjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U4ICBpbnZlcnQ7CisJCX0gdjA7CisKKwkJc3RydWN0IHsKKwkJCV9fdTggIGZsYWdzOworCQl9IHYxOworCX0gdTsKKworCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCisJc3RydWN0IHRzX2NvbmZpZyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkgKmNvbmZpZzsKK307CisKKyNlbmRpZiAvKl9YVF9TVFJJTkdfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF90Y3Btc3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcG1zcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYWM1NmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF90Y3Btc3MuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9YVF9UQ1BNU1NfTUFUQ0hfSAorI2RlZmluZSBfWFRfVENQTVNTX01BVENIX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB4dF90Y3Btc3NfbWF0Y2hfaW5mbyB7CisgICAgX191MTYgbXNzX21pbiwgbXNzX21heDsKKyAgICBfX3U4IGludmVydDsKK307CisKKyNlbmRpZiAvKl9YVF9UQ1BNU1NfTUFUQ0hfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF90Y3B1ZHAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YWE3YjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF90Y3B1ZHAuaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIF9YVF9UQ1BVRFBfSAorI2RlZmluZSBfWFRfVENQVURQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIFRDUCBtYXRjaGluZyBzdHVmZiAqLworc3RydWN0IHh0X3RjcCB7CisJX191MTYgc3B0c1syXTsJCQkvKiBTb3VyY2UgcG9ydCByYW5nZS4gKi8KKwlfX3UxNiBkcHRzWzJdOwkJCS8qIERlc3RpbmF0aW9uIHBvcnQgcmFuZ2UuICovCisJX191OCBvcHRpb247CQkJLyogVENQIE9wdGlvbiBpZmYgbm9uLXplcm8qLworCV9fdTggZmxnX21hc2s7CQkJLyogVENQIGZsYWdzIG1hc2sgYnl0ZSAqLworCV9fdTggZmxnX2NtcDsJCQkvKiBUQ1AgZmxhZ3MgY29tcGFyZSBieXRlICovCisJX191OCBpbnZmbGFnczsJCQkvKiBJbnZlcnNlIGZsYWdzICovCit9OworCisvKiBWYWx1ZXMgZm9yICJpbnYiIGZpZWxkIGluIHN0cnVjdCBpcHRfdGNwLiAqLworI2RlZmluZSBYVF9UQ1BfSU5WX1NSQ1BUCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBzb3VyY2UgcG9ydHMuICovCisjZGVmaW5lIFhUX1RDUF9JTlZfRFNUUFQJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGRlc3QgcG9ydHMuICovCisjZGVmaW5lIFhUX1RDUF9JTlZfRkxBR1MJMHgwNAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFRDUCBmbGFncy4gKi8KKyNkZWZpbmUgWFRfVENQX0lOVl9PUFRJT04JMHgwOAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIG9wdGlvbiB0ZXN0LiAqLworI2RlZmluZSBYVF9UQ1BfSU5WX01BU0sJCTB4MEYJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLworCisvKiBVRFAgbWF0Y2hpbmcgc3R1ZmYgKi8KK3N0cnVjdCB4dF91ZHAgeworCV9fdTE2IHNwdHNbMl07CQkJLyogU291cmNlIHBvcnQgcmFuZ2UuICovCisJX191MTYgZHB0c1syXTsJCQkvKiBEZXN0aW5hdGlvbiBwb3J0IHJhbmdlLiAqLworCV9fdTggaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworLyogVmFsdWVzIGZvciAiaW52ZmxhZ3MiIGZpZWxkIGluIHN0cnVjdCBpcHRfdWRwLiAqLworI2RlZmluZSBYVF9VRFBfSU5WX1NSQ1BUCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBzb3VyY2UgcG9ydHMuICovCisjZGVmaW5lIFhUX1VEUF9JTlZfRFNUUFQJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGRlc3QgcG9ydHMuICovCisjZGVmaW5lIFhUX1VEUF9JTlZfTUFTSwkweDAzCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RpbWUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzM3ZmFjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGltZS5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX1hUX1RJTUVfSAorI2RlZmluZSBfWFRfVElNRV9IIDEKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB4dF90aW1lX2luZm8geworCV9fdTMyIGRhdGVfc3RhcnQ7CisJX191MzIgZGF0ZV9zdG9wOworCV9fdTMyIGRheXRpbWVfc3RhcnQ7CisJX191MzIgZGF5dGltZV9zdG9wOworCV9fdTMyIG1vbnRoZGF5c19tYXRjaDsKKwlfX3U4IHdlZWtkYXlzX21hdGNoOworCV9fdTggZmxhZ3M7Cit9OworCitlbnVtIHsKKwkvKiBNYXRjaCBhZ2FpbnN0IGxvY2FsIHRpbWUgKGluc3RlYWQgb2YgVVRDKSAqLworCVhUX1RJTUVfTE9DQUxfVFogPSAxIDw8IDAsCisKKwkvKiBTaG9ydGN1dHMgKi8KKwlYVF9USU1FX0FMTF9NT05USERBWVMgPSAweEZGRkZGRkZFLAorCVhUX1RJTUVfQUxMX1dFRUtEQVlTICA9IDB4RkUsCisJWFRfVElNRV9NSU5fREFZVElNRSAgID0gMCwKKwlYVF9USU1FX01BWF9EQVlUSU1FICAgPSAyNCAqIDYwICogNjAgLSAxLAorfTsKKworI2VuZGlmIC8qIF9YVF9USU1FX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3UzMi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdTMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkMWJmZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3UzMi5oCkBAIC0wLDAgKzEsNDIgQEAKKyNpZm5kZWYgX1hUX1UzMl9ICisjZGVmaW5lIF9YVF9VMzJfSCAxCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHh0X3UzMl9vcHMgeworCVhUX1UzMl9BTkQsCisJWFRfVTMyX0xFRlRTSCwKKwlYVF9VMzJfUklHSFRTSCwKKwlYVF9VMzJfQVQsCit9OworCitzdHJ1Y3QgeHRfdTMyX2xvY2F0aW9uX2VsZW1lbnQgeworCV9fdTMyIG51bWJlcjsKKwlfX3U4IG5leHRvcDsKK307CisKK3N0cnVjdCB4dF91MzJfdmFsdWVfZWxlbWVudCB7CisJX191MzIgbWluOworCV9fdTMyIG1heDsKK307CisKKy8qCisgKiBBbnkgd2F5IHRvIGFsbG93IGZvciBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGVsZW1lbnRzPworICogRm9yIG5vdywgSSBzZXR0bGUgd2l0aCBhIGxpbWl0IG9mIDEwIGVhY2guCisgKi8KKyNkZWZpbmUgWFRfVTMyX01BWFNJWkUgMTAKKworc3RydWN0IHh0X3UzMl90ZXN0IHsKKwlzdHJ1Y3QgeHRfdTMyX2xvY2F0aW9uX2VsZW1lbnQgbG9jYXRpb25bWFRfVTMyX01BWFNJWkUrMV07CisJc3RydWN0IHh0X3UzMl92YWx1ZV9lbGVtZW50IHZhbHVlW1hUX1UzMl9NQVhTSVpFKzFdOworCV9fdTggbm51bXM7CisJX191OCBudmFsdWVzOworfTsKKworc3RydWN0IHh0X3UzMiB7CisJc3RydWN0IHh0X3UzMl90ZXN0IHRlc3RzW1hUX1UzMl9NQVhTSVpFKzFdOworCV9fdTggbnRlc3RzOworCV9fdTggaW52ZXJ0OworfTsKKworI2VuZGlmIC8qIF9YVF9VMzJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmJjNmRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfX0xJTlVYX0FSUF9ORVRGSUxURVJfSAorI2RlZmluZSBfX0xJTlVYX0FSUF9ORVRGSUxURVJfSAorCisvKiBBUlAtc3BlY2lmaWMgZGVmaW5lcyBmb3IgbmV0ZmlsdGVyLgorICogKEMpMjAwMiBSdXN0eSBSdXNzZWxsIElCTSAtLSBUaGlzIGNvZGUgaXMgR1BMLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKworLyogVGhlcmUgaXMgbm8gUEZfQVJQLiAqLworI2RlZmluZSBORl9BUlAJCTAKKworLyogQVJQIEhvb2tzICovCisjZGVmaW5lIE5GX0FSUF9JTgkwCisjZGVmaW5lIE5GX0FSUF9PVVQJMQorI2RlZmluZSBORl9BUlBfRk9SV0FSRAkyCisjZGVmaW5lIE5GX0FSUF9OVU1IT09LUwkzCisKKyNlbmRpZiAvKiBfX0xJTlVYX0FSUF9ORVRGSUxURVJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxZWM2NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiAJRm9ybWF0IG9mIGFuIEFSUCBmaXJld2FsbCBkZXNjcmlwdG9yCisgKgorICogCXNyYywgdGd0LCBzcmNfbWFzaywgdGd0X21hc2ssIGFycG9wLCBhcnBvcF9tYXNrIGFyZSBhbHdheXMgc3RvcmVkIGluCisgKgluZXR3b3JrIGJ5dGUgb3JkZXIuCisgKiAJZmxhZ3MgYXJlIHN0b3JlZCBpbiBob3N0IGJ5dGUgb3JkZXIgKG9mIGNvdXJzZSkuCisgKi8KKworI2lmbmRlZiBfQVJQVEFCTEVTX0gKKyNkZWZpbmUgX0FSUFRBQkxFU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2FycC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKKyNkZWZpbmUgQVJQVF9GVU5DVElPTl9NQVhOQU1FTEVOIFhUX0ZVTkNUSU9OX01BWE5BTUVMRU4KKyNkZWZpbmUgQVJQVF9UQUJMRV9NQVhOQU1FTEVOIFhUX1RBQkxFX01BWE5BTUVMRU4KKyNkZWZpbmUgYXJwdF9lbnRyeV90YXJnZXQgeHRfZW50cnlfdGFyZ2V0CisjZGVmaW5lIGFycHRfc3RhbmRhcmRfdGFyZ2V0IHh0X3N0YW5kYXJkX3RhcmdldAorI2RlZmluZSBhcnB0X2Vycm9yX3RhcmdldCB4dF9lcnJvcl90YXJnZXQKKyNkZWZpbmUgQVJQVF9DT05USU5VRSBYVF9DT05USU5VRQorI2RlZmluZSBBUlBUX1JFVFVSTiBYVF9SRVRVUk4KKyNkZWZpbmUgYXJwdF9jb3VudGVyc19pbmZvIHh0X2NvdW50ZXJzX2luZm8KKyNkZWZpbmUgYXJwdF9jb3VudGVycyB4dF9jb3VudGVycworI2RlZmluZSBBUlBUX1NUQU5EQVJEX1RBUkdFVCBYVF9TVEFOREFSRF9UQVJHRVQKKyNkZWZpbmUgQVJQVF9FUlJPUl9UQVJHRVQgWFRfRVJST1JfVEFSR0VUCisjZGVmaW5lIEFSUFRfRU5UUllfSVRFUkFURShlbnRyaWVzLCBzaXplLCBmbiwgYXJncy4uLikgXAorCVhUX0VOVFJZX0lURVJBVEUoc3RydWN0IGFycHRfZW50cnksIGVudHJpZXMsIHNpemUsIGZuLCAjIyBhcmdzKQorCisjZGVmaW5lIEFSUFRfREVWX0FERFJfTEVOX01BWCAxNgorCitzdHJ1Y3QgYXJwdF9kZXZhZGRyX2luZm8geworCWNoYXIgYWRkcltBUlBUX0RFVl9BRERSX0xFTl9NQVhdOworCWNoYXIgbWFza1tBUlBUX0RFVl9BRERSX0xFTl9NQVhdOworfTsKKworLyogWWVzLCBWaXJnaW5pYSwgeW91IGhhdmUgdG8gemVybyB0aGUgcGFkZGluZy4gKi8KK3N0cnVjdCBhcnB0X2FycCB7CisJLyogU291cmNlIGFuZCB0YXJnZXQgSVAgYWRkciAqLworCXN0cnVjdCBpbl9hZGRyIHNyYywgdGd0OworCS8qIE1hc2sgZm9yIHNyYyBhbmQgdGFyZ2V0IElQIGFkZHIgKi8KKwlzdHJ1Y3QgaW5fYWRkciBzbXNrLCB0bXNrOworCisJLyogRGV2aWNlIGh3IGFkZHJlc3MgbGVuZ3RoLCBzcmMrdGFyZ2V0IGRldmljZSBhZGRyZXNzZXMgKi8KKwlfX3U4IGFyaGxuLCBhcmhsbl9tYXNrOworCXN0cnVjdCBhcnB0X2RldmFkZHJfaW5mbyBzcmNfZGV2YWRkcjsKKwlzdHJ1Y3QgYXJwdF9kZXZhZGRyX2luZm8gdGd0X2RldmFkZHI7CisKKwkvKiBBUlAgb3BlcmF0aW9uIGNvZGUuICovCisJX19iZTE2IGFycG9wLCBhcnBvcF9tYXNrOworCisJLyogQVJQIGhhcmR3YXJlIGFkZHJlc3MgYW5kIHByb3RvY29sIGFkZHJlc3MgZm9ybWF0LiAqLworCV9fYmUxNiBhcmhyZCwgYXJocmRfbWFzazsKKwlfX2JlMTYgYXJwcm8sIGFycHJvX21hc2s7CisKKwkvKiBUaGUgcHJvdG9jb2wgYWRkcmVzcyBsZW5ndGggaXMgb25seSBhY2NlcHRlZCBpZiBpdCBpcyA0CisJICogc28gdGhlcmUgaXMgbm8gdXNlIGluIG9mZmVyaW5nIGEgd2F5IHRvIGRvIGZpbHRlcmluZyBvbiBpdC4KKwkgKi8KKworCWNoYXIgaW5pZmFjZVtJRk5BTVNJWl0sIG91dGlmYWNlW0lGTkFNU0laXTsKKwl1bnNpZ25lZCBjaGFyIGluaWZhY2VfbWFza1tJRk5BTVNJWl0sIG91dGlmYWNlX21hc2tbSUZOQU1TSVpdOworCisJLyogRmxhZ3Mgd29yZCAqLworCV9fdTggZmxhZ3M7CisJLyogSW52ZXJzZSBmbGFncyAqLworCV9fdTE2IGludmZsYWdzOworfTsKKworLyogVmFsdWVzIGZvciAiZmxhZyIgZmllbGQgaW4gc3RydWN0IGFycHRfaXAgKGdlbmVyYWwgYXJwIHN0cnVjdHVyZSkuCisgKiBObyBmbGFncyBkZWZpbmVkIHlldC4KKyAqLworI2RlZmluZSBBUlBUX0ZfTUFTSwkJMHgwMAkvKiBBbGwgcG9zc2libGUgZmxhZyBiaXRzIG1hc2suICovCisKKy8qIFZhbHVlcyBmb3IgImludiIgZmllbGQgaW4gc3RydWN0IGFycHRfYXJwLiAqLworI2RlZmluZSBBUlBUX0lOVl9WSUFfSU4JCTB4MDAwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIElOIElGQUNFLiAqLworI2RlZmluZSBBUlBUX0lOVl9WSUFfT1VUCTB4MDAwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIE9VVCBJRkFDRSAqLworI2RlZmluZSBBUlBUX0lOVl9TUkNJUAkJMHgwMDA0CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgU1JDIElQLiAqLworI2RlZmluZSBBUlBUX0lOVl9UR1RJUAkJMHgwMDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgVEdUIElQLiAqLworI2RlZmluZSBBUlBUX0lOVl9TUkNERVZBRERSCTB4MDAxMAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFNSQyBERVYgQUREUi4gKi8KKyNkZWZpbmUgQVJQVF9JTlZfVEdUREVWQUREUgkweDAwMjAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBUR1QgREVWIEFERFIuICovCisjZGVmaW5lIEFSUFRfSU5WX0FSUE9QCQkweDAwNDAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBBUlAgT1AuICovCisjZGVmaW5lIEFSUFRfSU5WX0FSUEhSRAkJMHgwMDgwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgQVJQIEhSRC4gKi8KKyNkZWZpbmUgQVJQVF9JTlZfQVJQUFJPCQkweDAxMDAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBBUlAgUFJPLiAqLworI2RlZmluZSBBUlBUX0lOVl9BUlBITE4JCTB4MDIwMAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIEFSUCBITE4uICovCisjZGVmaW5lIEFSUFRfSU5WX01BU0sJCTB4MDNGRgkvKiBBbGwgcG9zc2libGUgZmxhZyBiaXRzIG1hc2suICovCisKKy8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgZWFjaCBvZiB0aGUgZmlyZXdhbGwgcnVsZXMuICBDb25zaXN0cyBvZiAzCisgICBwYXJ0cyB3aGljaCBhcmUgMSkgZ2VuZXJhbCBBUlAgaGVhZGVyIHN0dWZmIDIpIG1hdGNoIHNwZWNpZmljCisgICBzdHVmZiAzKSB0aGUgdGFyZ2V0IHRvIHBlcmZvcm0gaWYgdGhlIHJ1bGUgbWF0Y2hlcyAqLworc3RydWN0IGFycHRfZW50cnkKK3sKKwlzdHJ1Y3QgYXJwdF9hcnAgYXJwOworCisJLyogU2l6ZSBvZiBhcnB0X2VudHJ5ICsgbWF0Y2hlcyAqLworCV9fdTE2IHRhcmdldF9vZmZzZXQ7CisJLyogU2l6ZSBvZiBhcnB0X2VudHJ5ICsgbWF0Y2hlcyArIHRhcmdldCAqLworCV9fdTE2IG5leHRfb2Zmc2V0OworCisJLyogQmFjayBwb2ludGVyICovCisJdW5zaWduZWQgaW50IGNvbWVmcm9tOworCisJLyogUGFja2V0IGFuZCBieXRlIGNvdW50ZXJzLiAqLworCXN0cnVjdCB4dF9jb3VudGVycyBjb3VudGVyczsKKworCS8qIFRoZSBtYXRjaGVzIChpZiBhbnkpLCB0aGVuIHRoZSB0YXJnZXQuICovCisJdW5zaWduZWQgY2hhciBlbGVtc1swXTsKK307CisKKy8qCisgKiBOZXcgSVAgZmlyZXdhbGwgb3B0aW9ucyBmb3IgW2dzXWV0c29ja29wdCBhdCB0aGUgUkFXIElQIGxldmVsLgorICogVW5saWtlIEJTRCBMaW51eCBpbmhlcml0cyBJUCBvcHRpb25zIHNvIHlvdSBkb24ndCBoYXZlIHRvIHVzZSBhIHJhdworICogc29ja2V0IGZvciB0aGlzLiBJbnN0ZWFkIHdlIGNoZWNrIHJpZ2h0cyBpbiB0aGUgY2FsbHMuCisgKgorICogQVRURU5USU9OOiBjaGVjayBsaW51eC9pbi5oIGJlZm9yZSBhZGRpbmcgbmV3IG51bWJlciBoZXJlLgorICovCisjZGVmaW5lIEFSUFRfQkFTRV9DVEwJCTk2CisKKyNkZWZpbmUgQVJQVF9TT19TRVRfUkVQTEFDRQkJKEFSUFRfQkFTRV9DVEwpCisjZGVmaW5lIEFSUFRfU09fU0VUX0FERF9DT1VOVEVSUwkoQVJQVF9CQVNFX0NUTCArIDEpCisjZGVmaW5lIEFSUFRfU09fU0VUX01BWAkJCUFSUFRfU09fU0VUX0FERF9DT1VOVEVSUworCisjZGVmaW5lIEFSUFRfU09fR0VUX0lORk8JCShBUlBUX0JBU0VfQ1RMKQorI2RlZmluZSBBUlBUX1NPX0dFVF9FTlRSSUVTCQkoQVJQVF9CQVNFX0NUTCArIDEpCisvKiAjZGVmaW5lIEFSUFRfU09fR0VUX1JFVklTSU9OX01BVENICShBUFJUX0JBU0VfQ1RMICsgMikgKi8KKyNkZWZpbmUgQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShBUlBUX0JBU0VfQ1RMICsgMykKKyNkZWZpbmUgQVJQVF9TT19HRVRfTUFYCQkJKEFSUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVCkKKworLyogVGhlIGFyZ3VtZW50IHRvIEFSUFRfU09fR0VUX0lORk8gKi8KK3N0cnVjdCBhcnB0X2dldGluZm8geworCS8qIFdoaWNoIHRhYmxlOiBjYWxsZXIgZmlsbHMgdGhpcyBpbi4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBLZXJuZWwgZmlsbHMgdGhlc2UgaW4uICovCisJLyogV2hpY2ggaG9vayBlbnRyeSBwb2ludHMgYXJlIHZhbGlkOiBiaXRtYXNrICovCisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCisJLyogSG9vayBlbnRyeSBwb2ludHM6IG9uZSBwZXIgbmV0ZmlsdGVyIGhvb2suICovCisJdW5zaWduZWQgaW50IGhvb2tfZW50cnlbTkZfQVJQX05VTUhPT0tTXTsKKworCS8qIFVuZGVyZmxvdyBwb2ludHMuICovCisJdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9BUlBfTlVNSE9PS1NdOworCisJLyogTnVtYmVyIG9mIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7CisKKwkvKiBTaXplIG9mIGVudHJpZXMuICovCisJdW5zaWduZWQgaW50IHNpemU7Cit9OworCisvKiBUaGUgYXJndW1lbnQgdG8gQVJQVF9TT19TRVRfUkVQTEFDRS4gKi8KK3N0cnVjdCBhcnB0X3JlcGxhY2UgeworCS8qIFdoaWNoIHRhYmxlLiAqLworCWNoYXIgbmFtZVtYVF9UQUJMRV9NQVhOQU1FTEVOXTsKKworCS8qIFdoaWNoIGhvb2sgZW50cnkgcG9pbnRzIGFyZSB2YWxpZDogYml0bWFzay4gIFlvdSBjYW4ndAorICAgICAgICAgICBjaGFuZ2UgdGhpcy4gKi8KKwl1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3M7CisKKwkvKiBOdW1iZXIgb2YgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBudW1fZW50cmllczsKKworCS8qIFRvdGFsIHNpemUgb2YgbmV3IGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCS8qIEhvb2sgZW50cnkgcG9pbnRzLiAqLworCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0FSUF9OVU1IT09LU107CisKKwkvKiBVbmRlcmZsb3cgcG9pbnRzLiAqLworCXVuc2lnbmVkIGludCB1bmRlcmZsb3dbTkZfQVJQX05VTUhPT0tTXTsKKworCS8qIEluZm9ybWF0aW9uIGFib3V0IG9sZCBlbnRyaWVzOiAqLworCS8qIE51bWJlciBvZiBjb3VudGVycyAobXVzdCBiZSBlcXVhbCB0byBjdXJyZW50IG51bWJlciBvZiBlbnRyaWVzKS4gKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOworCS8qIFRoZSBvbGQgZW50cmllcycgY291bnRlcnMuICovCisJc3RydWN0IHh0X2NvdW50ZXJzICpjb3VudGVyczsKKworCS8qIFRoZSBlbnRyaWVzIChoYW5nIG9mZiBlbmQ6IG5vdCByZWFsbHkgYW4gYXJyYXkpLiAqLworCXN0cnVjdCBhcnB0X2VudHJ5IGVudHJpZXNbMF07Cit9OworCisvKiBUaGUgYXJndW1lbnQgdG8gQVJQVF9TT19HRVRfRU5UUklFUy4gKi8KK3N0cnVjdCBhcnB0X2dldF9lbnRyaWVzIHsKKwkvKiBXaGljaCB0YWJsZTogdXNlciBmaWxscyB0aGlzIGluLiAqLworCWNoYXIgbmFtZVtYVF9UQUJMRV9NQVhOQU1FTEVOXTsKKworCS8qIFVzZXIgZmlsbHMgdGhpcyBpbjogdG90YWwgZW50cnkgc2l6ZS4gKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCS8qIFRoZSBlbnRyaWVzLiAqLworCXN0cnVjdCBhcnB0X2VudHJ5IGVudHJ5dGFibGVbMF07Cit9OworCisvKiBIZWxwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgeHRfZW50cnlfdGFyZ2V0ICphcnB0X2dldF90YXJnZXQoc3RydWN0IGFycHRfZW50cnkgKmUpCit7CisJcmV0dXJuICh2b2lkICopZSArIGUtPnRhcmdldF9vZmZzZXQ7Cit9CisKKy8qCisgKglNYWluIGZpcmV3YWxsIGNoYWlucyBkZWZpbml0aW9ucyBhbmQgZ2xvYmFsIHZhcidzIGRlZmluaXRpb25zLgorICovCisjZW5kaWYgLyogX0FSUFRBQkxFU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAvYXJwdF9tYW5nbGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnB0X21hbmdsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MGY1MDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAvYXJwdF9tYW5nbGUuaApAQCAtMCwwICsxLDI2IEBACisjaWZuZGVmIF9BUlBUX01BTkdMRV9ICisjZGVmaW5lIF9BUlBUX01BTkdMRV9ICisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmg+CisKKyNkZWZpbmUgQVJQVF9NQU5HTEVfQUREUl9MRU5fTUFYIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikKK3N0cnVjdCBhcnB0X21hbmdsZQoreworCWNoYXIgc3JjX2RldmFkZHJbQVJQVF9ERVZfQUREUl9MRU5fTUFYXTsKKwljaGFyIHRndF9kZXZhZGRyW0FSUFRfREVWX0FERFJfTEVOX01BWF07CisJdW5pb24geworCQlzdHJ1Y3QgaW5fYWRkciBzcmNfaXA7CisJfSB1X3M7CisJdW5pb24geworCQlzdHJ1Y3QgaW5fYWRkciB0Z3RfaXA7CisJfSB1X3Q7CisJdV9pbnQ4X3QgZmxhZ3M7CisJaW50IHRhcmdldDsKK307CisKKyNkZWZpbmUgQVJQVF9NQU5HTEVfU0RFViAweDAxCisjZGVmaW5lIEFSUFRfTUFOR0xFX1RERVYgMHgwMgorI2RlZmluZSBBUlBUX01BTkdMRV9TSVAgMHgwNAorI2RlZmluZSBBUlBUX01BTkdMRV9USVAgMHgwOAorI2RlZmluZSBBUlBUX01BTkdMRV9NQVNLIDB4MGYKKworI2VuZGlmIC8qIF9BUlBUX01BTkdMRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTRlY2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX05FVEZJTFRFUl9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX05FVEZJTFRFUl9ICisKKy8qIGJyaWRnZS1zcGVjaWZpYyBkZWZpbmVzIGZvciBuZXRmaWx0ZXIuIAorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wcHBveC5oPgorCisvKiBCcmlkZ2UgSG9va3MgKi8KKy8qIEFmdGVyIHByb21pc2MgZHJvcHMsIGNoZWNrc3VtIGNoZWNrcy4gKi8KKyNkZWZpbmUgTkZfQlJfUFJFX1JPVVRJTkcJMAorLyogSWYgdGhlIHBhY2tldCBpcyBkZXN0aW5lZCBmb3IgdGhpcyBib3guICovCisjZGVmaW5lIE5GX0JSX0xPQ0FMX0lOCQkxCisvKiBJZiB0aGUgcGFja2V0IGlzIGRlc3RpbmVkIGZvciBhbm90aGVyIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgTkZfQlJfRk9SV0FSRAkJMgorLyogUGFja2V0cyBjb21pbmcgZnJvbSBhIGxvY2FsIHByb2Nlc3MuICovCisjZGVmaW5lIE5GX0JSX0xPQ0FMX09VVAkJMworLyogUGFja2V0cyBhYm91dCB0byBoaXQgdGhlIHdpcmUuICovCisjZGVmaW5lIE5GX0JSX1BPU1RfUk9VVElORwk0CisvKiBOb3QgcmVhbGx5IGEgaG9vaywgYnV0IHVzZWQgZm9yIHRoZSBlYnRhYmxlcyBicm91dGUgdGFibGUgKi8KKyNkZWZpbmUgTkZfQlJfQlJPVVRJTkcJCTUKKyNkZWZpbmUgTkZfQlJfTlVNSE9PS1MJCTYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2ODdkNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfODAyXzMuaApAQCAtMCwwICsxLDYyIEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF84MDJfM19ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF84MDJfM19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEVCVF84MDJfM19TQVAgMHgwMQorI2RlZmluZSBFQlRfODAyXzNfVFlQRSAweDAyCisKKyNkZWZpbmUgRUJUXzgwMl8zX01BVENIICI4MDJfMyIKKworLyoKKyAqIElmIGZyYW1lIGhhcyBEU0FQL1NTQVAgdmFsdWUgMHhhYSB5b3UgbXVzdCBjaGVjayB0aGUgU05BUCB0eXBlCisgKiB0byBkaXNjb3ZlciB3aGF0IGtpbmQgb2YgcGFja2V0IHdlJ3JlIGNhcnJ5aW5nLiAKKyAqLworI2RlZmluZSBDSEVDS19UWVBFIDB4YWEKKworLyoKKyAqIENvbnRyb2wgZmllbGQgbWF5IGJlIG9uZSBvciB0d28gYnl0ZXMuICBJZiB0aGUgZmlyc3QgYnl0ZSBoYXMKKyAqIHRoZSB2YWx1ZSAweDAzIHRoZW4gdGhlIGVudGlyZSBsZW5ndGggaXMgb25lIGJ5dGUsIG90aGVyd2lzZSBpdCBpcyB0d28uCisgKiBPbmUgYnl0ZSBjb250cm9scyBhcmUgdXNlZCBpbiBVbm51bWJlcmVkIEluZm9ybWF0aW9uIGZyYW1lcy4KKyAqIFR3byBieXRlIGNvbnRyb2xzIGFyZSB1c2VkIGluIE51bWJlcmVkIEluZm9ybWF0aW9uIGZyYW1lcy4KKyAqLworI2RlZmluZSBJU19VSSAweDAzCisKKyNkZWZpbmUgRUJUXzgwMl8zX01BU0sgKEVCVF84MDJfM19TQVAgfCBFQlRfODAyXzNfVFlQRSB8IEVCVF84MDJfMykKKworLyogdWkgaGFzIG9uZSBieXRlIGN0cmwsIG5pIGhhcyB0d28gKi8KK3N0cnVjdCBoZHJfdWkgeworCV9fdTggZHNhcDsKKwlfX3U4IHNzYXA7CisJX191OCBjdHJsOworCV9fdTggb3JpZ1szXTsKKwlfX2JlMTYgdHlwZTsKK307CisKK3N0cnVjdCBoZHJfbmkgeworCV9fdTggZHNhcDsKKwlfX3U4IHNzYXA7CisJX19iZTE2IGN0cmw7CisJX191OCAgb3JpZ1szXTsKKwlfX2JlMTYgdHlwZTsKK307CisKK3N0cnVjdCBlYnRfODAyXzNfaGRyIHsKKwlfX3U4ICBkYWRkcls2XTsKKwlfX3U4ICBzYWRkcls2XTsKKwlfX2JlMTYgbGVuOworCXVuaW9uIHsKKwkJc3RydWN0IGhkcl91aSB1aTsKKwkJc3RydWN0IGhkcl9uaSBuaTsKKwl9IGxsYzsKK307CisKKworc3RydWN0IGVidF84MDJfM19pbmZvIHsKKwlfX3U4ICBzYXA7CisJX19iZTE2IHR5cGU7CisJX191OCAgYml0bWFzazsKKwlfX3U4ICBpbnZmbGFnczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hbW9uZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hbW9uZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNGUzYWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2Ftb25nLmgKQEAgLTAsMCArMSw2NCBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfQU1PTkdfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfQU1PTkdfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFQlRfQU1PTkdfRFNUIDB4MDEKKyNkZWZpbmUgRUJUX0FNT05HX1NSQyAweDAyCisKKy8qIEdyemVnb3J6IEJvcm93aWFrIDxncnplc0BnbnUudW5pdi5nZGEucGw+IDIwMDMKKyAqIAorICogV3JpdGUtb25jZS1yZWFkLW1hbnkgaGFzaCB0YWJsZSwgdXNlZCBmb3IgY2hlY2tpbmcgaWYgYSBnaXZlbgorICogTUFDIGFkZHJlc3MgYmVsb25ncyB0byBhIHNldCBvciBub3QgYW5kIHBvc3NpYmx5IGZvciBjaGVja2luZworICogaWYgaXQgaXMgcmVsYXRlZCB3aXRoIGEgZ2l2ZW4gSVB2NCBhZGRyZXNzLgorICoKKyAqIFRoZSBoYXNoIHZhbHVlIG9mIGFuIGFkZHJlc3MgaXMgaXRzIGxhc3QgYnl0ZS4KKyAqIAorICogSW4gcmVhbC13b3JsZCBldGhlcm5ldCBhZGRyZXNzZXMsIHZhbHVlcyBvZiB0aGUgbGFzdCBieXRlIGFyZQorICogZXZlbmx5IGRpc3RyaWJ1dGVkIGFuZCB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbnNpZGVyIG90aGVyIGJ5dGVzLgorICogSXQgd291bGQgb25seSBzbG93IHRoZSByb3V0aW5lcyBkb3duLgorICoKKyAqIEZvciBNQUMgYWRkcmVzcyBjb21wYXJpc29uIHNwZWVkdXAgcmVhc29ucywgd2UgaW50cm9kdWNlIGEgdHJpY2suCisgKiBNQUMgYWRkcmVzcyBpcyBtYXBwZWQgb250byBhbiBhcnJheSBvZiB0d28gMzItYml0IGludGVnZXJzLgorICogVGhpcyBwYWlyIG9mIGludGVnZXJzIGlzIGNvbXBhcmVkIHdpdGggTUFDIGFkZHJlc3NlcyBpbiB0aGUKKyAqIGhhc2ggdGFibGUsIHdoaWNoIGFyZSBzdG9yZWQgYWxzbyBpbiBmb3JtIG9mIHBhaXJzIG9mIGludGVnZXJzCisgKiAoaW4gYGNtcCcgYXJyYXkpLiBUaGlzIGlzIHF1aWNrIGFzIGl0IHJlcXVpcmVzIG9ubHkgdHdvIGVsZW1lbnRhcnkKKyAqIG51bWJlciBjb21wYXJpc29ucyBpbiB3b3JzdCBjYXNlLiBGdXJ0aGVyLCB3ZSB0YWtlIGFkdmFudGFnZSBvZgorICogZmFjdCB0aGF0IGVudHJvcHkgb2YgMyBsYXN0IGJ5dGVzIG9mIGFkZHJlc3MgaXMgbGFyZ2VyIHRoYW4gZW50cm9weQorICogb2YgMyBmaXJzdCBieXRlcy4gU28gZmlyc3Qgd2UgY29tcGFyZSA0IGxhc3QgYnl0ZXMgb2YgYWRkcmVzc2VzIGFuZAorICogaWYgdGhleSBhcmUgdGhlIHNhbWUgd2UgY29tcGFyZSAyIGZpcnN0LgorICoKKyAqIFllcywgaXQgaXMgYSBtZW1vcnkgb3ZlcmhlYWQsIGJ1dCBpbiAyMDAzIEFELCB3aG8gY2FyZXM/CisgKi8KKworc3RydWN0IGVidF9tYWNfd29ybWhhc2hfdHVwbGUgeworCV9fdTMyIGNtcFsyXTsKKwlfX2JlMzIgaXA7Cit9OworCitzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCB7CisJaW50IHRhYmxlWzI1N107CisJaW50IHBvb2xzaXplOworCXN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoX3R1cGxlIHBvb2xbMF07Cit9OworCisjZGVmaW5lIGVidF9tYWNfd29ybWhhc2hfc2l6ZSh4KSAoKHgpID8gc2l6ZW9mKHN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoKSBcCisJCSsgKHgpLT5wb29sc2l6ZSAqIHNpemVvZihzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaF90dXBsZSkgOiAwKQorCitzdHJ1Y3QgZWJ0X2Ftb25nX2luZm8geworCWludCB3aF9kc3Rfb2ZzOworCWludCB3aF9zcmNfb2ZzOworCWludCBiaXRtYXNrOworfTsKKworI2RlZmluZSBFQlRfQU1PTkdfRFNUX05FRyAweDEKKyNkZWZpbmUgRUJUX0FNT05HX1NSQ19ORUcgMHgyCisKKyNkZWZpbmUgZWJ0X2Ftb25nX3doX2RzdCh4KSAoKHgpLT53aF9kc3Rfb2ZzID8gXAorCShzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCopKChjaGFyKikoeCkgKyAoeCktPndoX2RzdF9vZnMpIDogTlVMTCkKKyNkZWZpbmUgZWJ0X2Ftb25nX3doX3NyYyh4KSAoKHgpLT53aF9zcmNfb2ZzID8gXAorCShzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCopKChjaGFyKikoeCkgKyAoeCktPndoX3NyY19vZnMpIDogTlVMTCkKKworI2RlZmluZSBFQlRfQU1PTkdfTUFUQ0ggImFtb25nIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYXJwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMmYzZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycC5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX0FSUF9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9BUlBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFQlRfQVJQX09QQ09ERSAweDAxCisjZGVmaW5lIEVCVF9BUlBfSFRZUEUgMHgwMgorI2RlZmluZSBFQlRfQVJQX1BUWVBFIDB4MDQKKyNkZWZpbmUgRUJUX0FSUF9TUkNfSVAgMHgwOAorI2RlZmluZSBFQlRfQVJQX0RTVF9JUCAweDEwCisjZGVmaW5lIEVCVF9BUlBfU1JDX01BQyAweDIwCisjZGVmaW5lIEVCVF9BUlBfRFNUX01BQyAweDQwCisjZGVmaW5lIEVCVF9BUlBfR1JBVCAweDgwCisjZGVmaW5lIEVCVF9BUlBfTUFTSyAoRUJUX0FSUF9PUENPREUgfCBFQlRfQVJQX0hUWVBFIHwgRUJUX0FSUF9QVFlQRSB8IFwKKyAgIEVCVF9BUlBfU1JDX0lQIHwgRUJUX0FSUF9EU1RfSVAgfCBFQlRfQVJQX1NSQ19NQUMgfCBFQlRfQVJQX0RTVF9NQUMgfCBcCisgICBFQlRfQVJQX0dSQVQpCisjZGVmaW5lIEVCVF9BUlBfTUFUQ0ggImFycCIKKworc3RydWN0IGVidF9hcnBfaW5mbworeworCV9fYmUxNiBodHlwZTsKKwlfX2JlMTYgcHR5cGU7CisJX19iZTE2IG9wY29kZTsKKwlfX2JlMzIgc2FkZHI7CisJX19iZTMyIHNtc2s7CisJX19iZTMyIGRhZGRyOworCV9fYmUzMiBkbXNrOworCXVuc2lnbmVkIGNoYXIgc21hZGRyW0VUSF9BTEVOXTsKKwl1bnNpZ25lZCBjaGFyIHNtbXNrW0VUSF9BTEVOXTsKKwl1bnNpZ25lZCBjaGFyIGRtYWRkcltFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBkbW1za1tFVEhfQUxFTl07CisJX191OCAgYml0bWFzazsKKwlfX3U4ICBpbnZmbGFnczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnByZXBseS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnByZXBseS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzc4OTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycHJlcGx5LmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfQVJQUkVQTFlfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfQVJQUkVQTFlfSAorCitzdHJ1Y3QgZWJ0X2FycHJlcGx5X2luZm8geworCXVuc2lnbmVkIGNoYXIgbWFjW0VUSF9BTEVOXTsKKwlpbnQgdGFyZ2V0OworfTsKKyNkZWZpbmUgRUJUX0FSUFJFUExZX1RBUkdFVCAiYXJwcmVwbHkiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YmJjNDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2lwLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqICBlYnRfaXAKKyAqCisgKglBdXRob3JzOgorICoJQmFydCBEZSBTY2h1eW1lciA8YmFydC5kZS5zY2h1eW1lckBwYW5kb3JhLmJlPgorICoKKyAqICBBcHJpbCwgMjAwMgorICoKKyAqICBDaGFuZ2VzOgorICogICAgYWRkZWQgaXAtc3BvcnQgYW5kIGlwLWRwb3J0CisgKiAgICBJbm5vbWluYXRlIFNlY3VyaXR5IFRlY2hub2xvZ2llcyBBRyA8bWhvcGZAaW5ub21pbmF0ZS5jb20+CisgKiAgICBTZXB0ZW1iZXIsIDIwMDIKKyAqLworCisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9JUF9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9JUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEVCVF9JUF9TT1VSQ0UgMHgwMQorI2RlZmluZSBFQlRfSVBfREVTVCAweDAyCisjZGVmaW5lIEVCVF9JUF9UT1MgMHgwNAorI2RlZmluZSBFQlRfSVBfUFJPVE8gMHgwOAorI2RlZmluZSBFQlRfSVBfU1BPUlQgMHgxMAorI2RlZmluZSBFQlRfSVBfRFBPUlQgMHgyMAorI2RlZmluZSBFQlRfSVBfTUFTSyAoRUJUX0lQX1NPVVJDRSB8IEVCVF9JUF9ERVNUIHwgRUJUX0lQX1RPUyB8IEVCVF9JUF9QUk9UTyB8XAorIEVCVF9JUF9TUE9SVCB8IEVCVF9JUF9EUE9SVCApCisjZGVmaW5lIEVCVF9JUF9NQVRDSCAiaXAiCisKKy8qIHRoZSBzYW1lIHZhbHVlcyBhcmUgdXNlZCBmb3IgdGhlIGludmZsYWdzICovCitzdHJ1Y3QgZWJ0X2lwX2luZm8geworCV9fYmUzMiBzYWRkcjsKKwlfX2JlMzIgZGFkZHI7CisJX19iZTMyIHNtc2s7CisJX19iZTMyIGRtc2s7CisJX191OCAgdG9zOworCV9fdTggIHByb3RvY29sOworCV9fdTggIGJpdG1hc2s7CisJX191OCAgaW52ZmxhZ3M7CisJX191MTYgc3BvcnRbMl07CisJX191MTYgZHBvcnRbMl07Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfaXA2LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2lwNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYjg4OTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2lwNi5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiAgZWJ0X2lwNgorICoKKyAqCUF1dGhvcnM6CisgKiBLdW8tTGFuZyBUc2VuZyA8a3VvLWxhbmcudHNlbmdAaW50ZWwuY29tPgorICogTWFub2hhciBDYXN0ZWxpbm8gPG1hbm9oYXIuci5jYXN0ZWxpbm9AaW50ZWwuY29tPgorICoKKyAqICBKYW4gMTEsIDIwMDgKKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfSVA2X0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX0lQNl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEVCVF9JUDZfU09VUkNFIDB4MDEKKyNkZWZpbmUgRUJUX0lQNl9ERVNUIDB4MDIKKyNkZWZpbmUgRUJUX0lQNl9UQ0xBU1MgMHgwNAorI2RlZmluZSBFQlRfSVA2X1BST1RPIDB4MDgKKyNkZWZpbmUgRUJUX0lQNl9TUE9SVCAweDEwCisjZGVmaW5lIEVCVF9JUDZfRFBPUlQgMHgyMAorI2RlZmluZSBFQlRfSVA2X0lDTVA2IDB4NDAKKworI2RlZmluZSBFQlRfSVA2X01BU0sgKEVCVF9JUDZfU09VUkNFIHwgRUJUX0lQNl9ERVNUIHwgRUJUX0lQNl9UQ0xBU1MgfFwKKwkJICAgICAgRUJUX0lQNl9QUk9UTyB8IEVCVF9JUDZfU1BPUlQgfCBFQlRfSVA2X0RQT1JUIHwgXAorCQkgICAgICBFQlRfSVA2X0lDTVA2KQorI2RlZmluZSBFQlRfSVA2X01BVENIICJpcDYiCisKKy8qIHRoZSBzYW1lIHZhbHVlcyBhcmUgdXNlZCBmb3IgdGhlIGludmZsYWdzICovCitzdHJ1Y3QgZWJ0X2lwNl9pbmZvIHsKKwlzdHJ1Y3QgaW42X2FkZHIgc2FkZHI7CisJc3RydWN0IGluNl9hZGRyIGRhZGRyOworCXN0cnVjdCBpbjZfYWRkciBzbXNrOworCXN0cnVjdCBpbjZfYWRkciBkbXNrOworCV9fdTggIHRjbGFzczsKKwlfX3U4ICBwcm90b2NvbDsKKwlfX3U4ICBiaXRtYXNrOworCV9fdTggIGludmZsYWdzOworCXVuaW9uIHsKKwkJX191MTYgc3BvcnRbMl07CisJCV9fdTggaWNtcHY2X3R5cGVbMl07CisJfTsKKwl1bmlvbiB7CisJCV9fdTE2IGRwb3J0WzJdOworCQlfX3U4IGljbXB2Nl9jb2RlWzJdOworCX07Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbGltaXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQ4MGIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9saW1pdC5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX0xJTUlUX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX0xJTUlUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRUJUX0xJTUlUX01BVENIICJsaW1pdCIKKworLyogdGltaW5ncyBhcmUgaW4gbWlsbGlzZWNvbmRzLiAqLworI2RlZmluZSBFQlRfTElNSVRfU0NBTEUgMTAwMDAKKworLyogMS8xMCwwMDAgc2VjIHBlcmlvZCA9PiBtYXggb2YgMTAsMDAwL3NlYy4gIE1pbiByYXRlIGlzIHRoZW4gNDI5NDkwCisgICBzZWNvbmRzLCBvciBvbmUgZXZlcnkgNTkgaG91cnMuICovCisKK3N0cnVjdCBlYnRfbGltaXRfaW5mbyB7CisJX191MzIgYXZnOyAgICAvKiBBdmVyYWdlIHNlY3MgYmV0d2VlbiBwYWNrZXRzICogc2NhbGUgKi8KKwlfX3UzMiBidXJzdDsgIC8qIFBlcmlvZCBtdWx0aXBsaWVyIGZvciB1cHBlciBsaW1pdC4gKi8KKworCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCisJdW5zaWduZWQgbG9uZyBwcmV2OworCV9fdTMyIGNyZWRpdDsKKwlfX3UzMiBjcmVkaXRfY2FwLCBjb3N0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xvZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTdmMWQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9sb2cuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9MT0dfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfTE9HX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRUJUX0xPR19JUCAweDAxIC8qIGlmIHRoZSBmcmFtZSBpcyBtYWRlIGJ5IGlwLCBsb2cgdGhlIGlwIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEVCVF9MT0dfQVJQIDB4MDIKKyNkZWZpbmUgRUJUX0xPR19ORkxPRyAweDA0CisjZGVmaW5lIEVCVF9MT0dfSVA2IDB4MDgKKyNkZWZpbmUgRUJUX0xPR19NQVNLIChFQlRfTE9HX0lQIHwgRUJUX0xPR19BUlAgfCBFQlRfTE9HX0lQNikKKyNkZWZpbmUgRUJUX0xPR19QUkVGSVhfU0laRSAzMAorI2RlZmluZSBFQlRfTE9HX1dBVENIRVIgImxvZyIKKworc3RydWN0IGVidF9sb2dfaW5mbyB7CisJX191OCBsb2dsZXZlbDsKKwlfX3U4IHByZWZpeFtFQlRfTE9HX1BSRUZJWF9TSVpFXTsKKwlfX3UzMiBiaXRtYXNrOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X21hcmtfbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9tYXJrX20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTBmOWU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9tYXJrX20uaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9NQVJLX01fSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfTUFSS19NX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRUJUX01BUktfQU5EIDB4MDEKKyNkZWZpbmUgRUJUX01BUktfT1IgMHgwMgorI2RlZmluZSBFQlRfTUFSS19NQVNLIChFQlRfTUFSS19BTkQgfCBFQlRfTUFSS19PUikKK3N0cnVjdCBlYnRfbWFya19tX2luZm8geworCXVuc2lnbmVkIGxvbmcgbWFyaywgbWFzazsKKwlfX3U4IGludmVydDsKKwlfX3U4IGJpdG1hc2s7Cit9OworI2RlZmluZSBFQlRfTUFSS19NQVRDSCAibWFya19tIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbWFya190LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X21hcmtfdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNWEyNjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X21hcmtfdC5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX01BUktfVF9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9NQVJLX1RfSAorCisvKiBUaGUgdGFyZ2V0IG1lbWJlciBpcyByZXVzZWQgZm9yIGFkZGluZyBuZXcgYWN0aW9ucywgdGhlCisgKiB2YWx1ZSBvZiB0aGUgcmVhbCB0YXJnZXQgaXMgLTEgdG8gLU5VTV9TVEFOREFSRF9UQVJHRVRTLgorICogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSA0IGxzYiAoMiB3b3VsZCBiZSBlbm91Z2gsCisgKiBidXQgbGV0J3MgcGxheSBpdCBzYWZlKSBhcmUga2VwdCB0byBkZXNpZ25hdGUgdGhpcyB0YXJnZXQuCisgKiBUaGUgcmVtYWluaW5nIGJpdHMgZGVzaWduYXRlIHRoZSBhY3Rpb24uIEJ5IG1ha2luZyB0aGUgc2V0CisgKiBhY3Rpb24gMHhmZmZmZmZmMCwgdGhlIHJlc3VsdCB3aWxsIGxvb2sgb2sgZm9yIG9sZGVyCisgKiB2ZXJzaW9ucy4gW1NlcHRlbWJlciAyMDA2XSAqLworI2RlZmluZSBNQVJLX1NFVF9WQUxVRSAoMHhmZmZmZmZmMCkKKyNkZWZpbmUgTUFSS19PUl9WQUxVRSAgKDB4ZmZmZmZmZTApCisjZGVmaW5lIE1BUktfQU5EX1ZBTFVFICgweGZmZmZmZmQwKQorI2RlZmluZSBNQVJLX1hPUl9WQUxVRSAoMHhmZmZmZmZjMCkKKworc3RydWN0IGVidF9tYXJrX3RfaW5mbyB7CisJdW5zaWduZWQgbG9uZyBtYXJrOworCS8qIEVCVF9BQ0NFUFQsIEVCVF9EUk9QLCBFQlRfQ09OVElOVUUgb3IgRUJUX1JFVFVSTiAqLworCWludCB0YXJnZXQ7Cit9OworI2RlZmluZSBFQlRfTUFSS19UQVJHRVQgIm1hcmsiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uYXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbmF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3NGUzYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbmF0LmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfTkFUX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX05BVF9ICisKKyNkZWZpbmUgTkFUX0FSUF9CSVQgICgweDAwMDAwMDEwKQorc3RydWN0IGVidF9uYXRfaW5mbyB7CisJdW5zaWduZWQgY2hhciBtYWNbRVRIX0FMRU5dOworCS8qIEVCVF9BQ0NFUFQsIEVCVF9EUk9QLCBFQlRfQ09OVElOVUUgb3IgRUJUX1JFVFVSTiAqLworCWludCB0YXJnZXQ7Cit9OworI2RlZmluZSBFQlRfU05BVF9UQVJHRVQgInNuYXQiCisjZGVmaW5lIEVCVF9ETkFUX1RBUkdFVCAiZG5hdCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X25mbG9nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X25mbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4MjlmYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbmZsb2cuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9ORkxPR19ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9ORkxPR19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEVCVF9ORkxPR19NQVNLIDB4MAorCisjZGVmaW5lIEVCVF9ORkxPR19QUkVGSVhfU0laRSA2NAorI2RlZmluZSBFQlRfTkZMT0dfV0FUQ0hFUiAibmZsb2ciCisKKyNkZWZpbmUgRUJUX05GTE9HX0RFRkFVTFRfR1JPVVAJCTB4MQorI2RlZmluZSBFQlRfTkZMT0dfREVGQVVMVF9USFJFU0hPTEQJMQorCitzdHJ1Y3QgZWJ0X25mbG9nX2luZm8geworCV9fdTMyIGxlbjsKKwlfX3UxNiBncm91cDsKKwlfX3UxNiB0aHJlc2hvbGQ7CisJX191MTYgZmxhZ3M7CisJX191MTYgcGFkOworCWNoYXIgcHJlZml4W0VCVF9ORkxPR19QUkVGSVhfU0laRV07Cit9OworCisjZW5kaWYJCQkJLyogX19MSU5VWF9CUklER0VfRUJUX05GTE9HX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfcGt0dHlwZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9wa3R0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0MWJhZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfcGt0dHlwZS5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX1BLVFRZUEVfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfUEtUVFlQRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgZWJ0X3BrdHR5cGVfaW5mbyB7CisJX191OCBwa3RfdHlwZTsKKwlfX3U4IGludmVydDsKK307CisjZGVmaW5lIEVCVF9QS1RUWVBFX01BVENIICJwa3R0eXBlIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfcmVkaXJlY3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfcmVkaXJlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDk2MjJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9yZWRpcmVjdC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX1JFRElSRUNUX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX1JFRElSRUNUX0gKKworc3RydWN0IGVidF9yZWRpcmVjdF9pbmZvIHsKKwkvKiBFQlRfQUNDRVBULCBFQlRfRFJPUCwgRUJUX0NPTlRJTlVFIG9yIEVCVF9SRVRVUk4gKi8KKwlpbnQgdGFyZ2V0OworfTsKKyNkZWZpbmUgRUJUX1JFRElSRUNUX1RBUkdFVCAicmVkaXJlY3QiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9zdHAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfc3RwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyNWI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfc3RwLmgKQEAgLTAsMCArMSw0NiBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfU1RQX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX1NUUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEVCVF9TVFBfVFlQRQkJMHgwMDAxCisKKyNkZWZpbmUgRUJUX1NUUF9GTEFHUwkJMHgwMDAyCisjZGVmaW5lIEVCVF9TVFBfUk9PVFBSSU8JMHgwMDA0CisjZGVmaW5lIEVCVF9TVFBfUk9PVEFERFIJMHgwMDA4CisjZGVmaW5lIEVCVF9TVFBfUk9PVENPU1QJMHgwMDEwCisjZGVmaW5lIEVCVF9TVFBfU0VOREVSUFJJTwkweDAwMjAKKyNkZWZpbmUgRUJUX1NUUF9TRU5ERVJBRERSCTB4MDA0MAorI2RlZmluZSBFQlRfU1RQX1BPUlQJCTB4MDA4MAorI2RlZmluZSBFQlRfU1RQX01TR0FHRQkJMHgwMTAwCisjZGVmaW5lIEVCVF9TVFBfTUFYQUdFCQkweDAyMDAKKyNkZWZpbmUgRUJUX1NUUF9IRUxMT1RJTUUJMHgwNDAwCisjZGVmaW5lIEVCVF9TVFBfRldERAkJMHgwODAwCisKKyNkZWZpbmUgRUJUX1NUUF9NQVNLCQkweDBmZmYKKyNkZWZpbmUgRUJUX1NUUF9DT05GSUdfTUFTSwkweDBmZmUKKworI2RlZmluZSBFQlRfU1RQX01BVENIICJzdHAiCisKK3N0cnVjdCBlYnRfc3RwX2NvbmZpZ19pbmZvIHsKKwlfX3U4IGZsYWdzOworCV9fdTE2IHJvb3RfcHJpb2wsIHJvb3RfcHJpb3U7CisJY2hhciByb290X2FkZHJbNl0sIHJvb3RfYWRkcm1za1s2XTsKKwlfX3UzMiByb290X2Nvc3RsLCByb290X2Nvc3R1OworCV9fdTE2IHNlbmRlcl9wcmlvbCwgc2VuZGVyX3ByaW91OworCWNoYXIgc2VuZGVyX2FkZHJbNl0sIHNlbmRlcl9hZGRybXNrWzZdOworCV9fdTE2IHBvcnRsLCBwb3J0dTsKKwlfX3UxNiBtc2dfYWdlbCwgbXNnX2FnZXU7CisJX191MTYgbWF4X2FnZWwsIG1heF9hZ2V1OworCV9fdTE2IGhlbGxvX3RpbWVsLCBoZWxsb190aW1ldTsKKwlfX3UxNiBmb3J3YXJkX2RlbGF5bCwgZm9yd2FyZF9kZWxheXU7Cit9OworCitzdHJ1Y3QgZWJ0X3N0cF9pbmZvIHsKKwlfX3U4IHR5cGU7CisJc3RydWN0IGVidF9zdHBfY29uZmlnX2luZm8gY29uZmlnOworCV9fdTE2IGJpdG1hc2s7CisJX191MTYgaW52ZmxhZ3M7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdWxvZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF91bG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhNmJlYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdWxvZy5oCkBAIC0wLDAgKzEsMzggQEAKKyNpZm5kZWYgX0VCVF9VTE9HX0gKKyNkZWZpbmUgX0VCVF9VTE9HX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRUJUX1VMT0dfREVGQVVMVF9OTEdST1VQIDAKKyNkZWZpbmUgRUJUX1VMT0dfREVGQVVMVF9RVEhSRVNIT0xEIDEKKyNkZWZpbmUgRUJUX1VMT0dfTUFYTkxHUk9VUFMgMzIgLyogaGFyZGNvZGVkIG5ldGxpbmsgbWF4ICovCisjZGVmaW5lIEVCVF9VTE9HX1BSRUZJWF9MRU4gMzIKKyNkZWZpbmUgRUJUX1VMT0dfTUFYX1FMRU4gNTAKKyNkZWZpbmUgRUJUX1VMT0dfV0FUQ0hFUiAidWxvZyIKKyNkZWZpbmUgRUJUX1VMT0dfVkVSU0lPTiAxCisKK3N0cnVjdCBlYnRfdWxvZ19pbmZvIHsKKwlfX3UzMiBubGdyb3VwOworCXVuc2lnbmVkIGludCBjcHJhbmdlOworCXVuc2lnbmVkIGludCBxdGhyZXNob2xkOworCWNoYXIgcHJlZml4W0VCVF9VTE9HX1BSRUZJWF9MRU5dOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZWJ0X3Vsb2dfcGFja2V0X21zZyB7CisJaW50IHZlcnNpb247CisJY2hhciBpbmRldltJRk5BTVNJWl07CisJY2hhciBvdXRkZXZbSUZOQU1TSVpdOworCWNoYXIgcGh5c2luZGV2W0lGTkFNU0laXTsKKwljaGFyIHBoeXNvdXRkZXZbSUZOQU1TSVpdOworCWNoYXIgcHJlZml4W0VCVF9VTE9HX1BSRUZJWF9MRU5dOworCXN0cnVjdCB0aW1ldmFsIHN0YW1wOworCXVuc2lnbmVkIGxvbmcgbWFyazsKKwl1bnNpZ25lZCBpbnQgaG9vazsKKwlzaXplX3QgZGF0YV9sZW47CisJLyogVGhlIGNvbXBsZXRlIHBhY2tldCwgaW5jbHVkaW5nIEV0aGVybmV0IGhlYWRlciBhbmQgcGVyaGFwcworCSAqIHRoZSBWTEFOIGhlYWRlciBpcyBhcHBlbmRlZCAqLworCXVuc2lnbmVkIGNoYXIgZGF0YVswXSBfX2F0dHJpYnV0ZV9fCisJICAgICAgICAgICAgICAgICAgICAgICgoYWxpZ25lZCAoX19hbGlnbm9mX18oc3RydWN0IGVidF91bG9nX2luZm8pKSkpOworfSBlYnRfdWxvZ19wYWNrZXRfbXNnX3Q7CisKKyNlbmRpZiAvKiBfRUJUX1VMT0dfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF92bGFuLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3ZsYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjdkMWQ1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF92bGFuLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfVkxBTl9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9WTEFOX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRUJUX1ZMQU5fSUQJMHgwMQorI2RlZmluZSBFQlRfVkxBTl9QUklPCTB4MDIKKyNkZWZpbmUgRUJUX1ZMQU5fRU5DQVAJMHgwNAorI2RlZmluZSBFQlRfVkxBTl9NQVNLIChFQlRfVkxBTl9JRCB8IEVCVF9WTEFOX1BSSU8gfCBFQlRfVkxBTl9FTkNBUCkKKyNkZWZpbmUgRUJUX1ZMQU5fTUFUQ0ggInZsYW4iCisKK3N0cnVjdCBlYnRfdmxhbl9pbmZvIHsKKwlfX3UxNiBpZDsJCS8qIFZMQU4gSUQgezEtNDA5NX0gKi8KKwlfX3U4IHByaW87CQkvKiBWTEFOIFVzZXIgUHJpb3JpdHkgezAtN30gKi8KKwlfX2JlMTYgZW5jYXA7CQkvKiBWTEFOIEVuY2Fwc3VsYXRlZCBmcmFtZSBjb2RlIHswLTY1NTM1fSAqLworCV9fdTggYml0bWFzazsJCS8qIEFyZ3MgYml0bWFzayBiaXQgMT0xIC0gSUQgYXJnLAorCQkJCSAgIGJpdCAyPTEgVXNlci1Qcmlvcml0eSBhcmcsIGJpdCAzPTEgZW5jYXAqLworCV9fdTggaW52ZmxhZ3M7CQkvKiBJbnZlcnNlIGJpdG1hc2sgIGJpdCAxPTEgLSBpbnZlcnNlZCBJRCBhcmcsIAorCQkJCSAgIGJpdCAyPTEgLSBpbnZlcnNlZCBQaXJvcml0eSBhcmcgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWE2NDQ0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmgKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiAgZWJ0YWJsZXMKKyAqCisgKglBdXRob3JzOgorICoJQmFydCBEZSBTY2h1eW1lcgkJPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogIGVidGFibGVzLmMsdiAyLjAsIEFwcmlsLCAyMDAyCisgKgorICogIFRoaXMgY29kZSBpcyBzdG9uZ2x5IGluc3BpcmVkIG9uIHRoZSBpcHRhYmxlcyBjb2RlIHdoaWNoIGlzCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5IFBhdWwgYFJ1c3R5JyBSdXNzZWxsICYgTWljaGFlbCBKLiBOZXVsaW5nCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FRkZfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FRkZfSAorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisKKyNkZWZpbmUgRUJUX1RBQkxFX01BWE5BTUVMRU4gMzIKKyNkZWZpbmUgRUJUX0NIQUlOX01BWE5BTUVMRU4gRUJUX1RBQkxFX01BWE5BTUVMRU4KKyNkZWZpbmUgRUJUX0ZVTkNUSU9OX01BWE5BTUVMRU4gRUJUX1RBQkxFX01BWE5BTUVMRU4KKworLyogdmVyZGljdHMgPjAgYXJlICJicmFuY2hlcyIgKi8KKyNkZWZpbmUgRUJUX0FDQ0VQVCAgIC0xCisjZGVmaW5lIEVCVF9EUk9QICAgICAtMgorI2RlZmluZSBFQlRfQ09OVElOVUUgLTMKKyNkZWZpbmUgRUJUX1JFVFVSTiAgIC00CisjZGVmaW5lIE5VTV9TVEFOREFSRF9UQVJHRVRTICAgNAorLyogZWJ0YWJsZXMgdGFyZ2V0IG1vZHVsZXMgc3RvcmUgdGhlIHZlcmRpY3QgaW5zaWRlIGFuIGludC4gV2UgY2FuCisgKiByZWNsYWltIGEgcGFydCBvZiB0aGlzIGludCBmb3IgYmFja3dhcmRzIGNvbXBhdGlibGUgZXh0ZW5zaW9ucy4KKyAqIFRoZSA0IGxzYiBhcmUgbW9yZSB0aGFuIGVub3VnaCB0byBzdG9yZSB0aGUgdmVyZGljdC4gKi8KKyNkZWZpbmUgRUJUX1ZFUkRJQ1RfQklUUyAweDAwMDAwMDBGCisKK3N0cnVjdCB4dF9tYXRjaDsKK3N0cnVjdCB4dF90YXJnZXQ7CisKK3N0cnVjdCBlYnRfY291bnRlciB7CisJdWludDY0X3QgcGNudDsKKwl1aW50NjRfdCBiY250OworfTsKKworc3RydWN0IGVidF9yZXBsYWNlIHsKKwljaGFyIG5hbWVbRUJUX1RBQkxFX01BWE5BTUVMRU5dOworCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKKwkvKiBuciBvZiBydWxlcyBpbiB0aGUgdGFibGUgKi8KKwl1bnNpZ25lZCBpbnQgbmVudHJpZXM7CisJLyogdG90YWwgc2l6ZSBvZiB0aGUgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBlbnRyaWVzX3NpemU7CisJLyogc3RhcnQgb2YgdGhlIGNoYWlucyAqLworCXN0cnVjdCBlYnRfZW50cmllcyAqaG9va19lbnRyeVtORl9CUl9OVU1IT09LU107CisJLyogbnIgb2YgY291bnRlcnMgdXNlcnNwYWNlIGV4cGVjdHMgYmFjayAqLworCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CisJLyogd2hlcmUgdGhlIGtlcm5lbCB3aWxsIHB1dCB0aGUgb2xkIGNvdW50ZXJzICovCisJc3RydWN0IGVidF9jb3VudGVyICpjb3VudGVyczsKKwljaGFyICplbnRyaWVzOworfTsKKworc3RydWN0IGVidF9yZXBsYWNlX2tlcm5lbCB7CisJY2hhciBuYW1lW0VCVF9UQUJMRV9NQVhOQU1FTEVOXTsKKwl1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3M7CisJLyogbnIgb2YgcnVsZXMgaW4gdGhlIHRhYmxlICovCisJdW5zaWduZWQgaW50IG5lbnRyaWVzOworCS8qIHRvdGFsIHNpemUgb2YgdGhlIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgZW50cmllc19zaXplOworCS8qIHN0YXJ0IG9mIHRoZSBjaGFpbnMgKi8KKwlzdHJ1Y3QgZWJ0X2VudHJpZXMgKmhvb2tfZW50cnlbTkZfQlJfTlVNSE9PS1NdOworCS8qIG5yIG9mIGNvdW50ZXJzIHVzZXJzcGFjZSBleHBlY3RzIGJhY2sgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOworCS8qIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBwdXQgdGhlIG9sZCBjb3VudGVycyAqLworCXN0cnVjdCBlYnRfY291bnRlciAqY291bnRlcnM7CisJY2hhciAqZW50cmllczsKK307CisKK3N0cnVjdCBlYnRfZW50cmllcyB7CisJLyogdGhpcyBmaWVsZCBpcyBhbHdheXMgc2V0IHRvIHplcm8KKwkgKiBTZWUgRUJUX0VOVFJZX09SX0VOVFJJRVMuCisJICogTXVzdCBiZSBzYW1lIHNpemUgYXMgZWJ0X2VudHJ5LmJpdG1hc2sgKi8KKwl1bnNpZ25lZCBpbnQgZGlzdGluZ3Vpc2hlcjsKKwkvKiB0aGUgY2hhaW4gbmFtZSAqLworCWNoYXIgbmFtZVtFQlRfQ0hBSU5fTUFYTkFNRUxFTl07CisJLyogY291bnRlciBvZmZzZXQgZm9yIHRoaXMgY2hhaW4gKi8KKwl1bnNpZ25lZCBpbnQgY291bnRlcl9vZmZzZXQ7CisJLyogb25lIHN0YW5kYXJkIChhY2NlcHQsIGRyb3AsIHJldHVybikgcGVyIGhvb2sgKi8KKwlpbnQgcG9saWN5OworCS8qIG5yLiBvZiBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IG5lbnRyaWVzOworCS8qIGVudHJ5IGxpc3QgKi8KKwljaGFyIGRhdGFbMF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKF9fYWxpZ25vZl9fKHN0cnVjdCBlYnRfcmVwbGFjZSkpKSk7Cit9OworCisvKiB1c2VkIGZvciB0aGUgYml0bWFzayBvZiBzdHJ1Y3QgZWJ0X2VudHJ5ICovCisKKy8qIFRoaXMgaXMgYSBoYWNrIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGJldHdlZW4gYW4gZWJ0X2VudHJ5IHN0cnVjdCBhbmQgYW4KKyAqIGVidF9lbnRyaWVzIHN0cnVjdCB3aGVuIHRyYXZlcnNpbmcgdGhlIGVudHJpZXMgZnJvbSBzdGFydCB0byBlbmQuCisgKiBVc2luZyB0aGlzIHNpbXBsaWZpZXMgdGhlIGNvZGUgYSBsb3QsIHdoaWxlIHN0aWxsIGJlaW5nIGFibGUgdG8gdXNlCisgKiBlYnRfZW50cmllcy4KKyAqIENvbnRyYXJ5LCBpcHRhYmxlcyBkb2Vzbid0IHVzZSBzb21ldGhpbmcgbGlrZSBlYnRfZW50cmllcyBhbmQgdGhlcmVmb3JlIHVzZXMKKyAqIGRpZmZlcmVudCB0ZWNobmlxdWVzIGZvciBuYW1pbmcgdGhlIHBvbGljeSBhbmQgc3VjaC4gU28sIGlwdGFibGVzIGRvZXNuJ3QKKyAqIG5lZWQgYSBoYWNrIGxpa2UgdGhpcy4KKyAqLworI2RlZmluZSBFQlRfRU5UUllfT1JfRU5UUklFUyAweDAxCisvKiB0aGVzZSBhcmUgdGhlIG5vcm1hbCBtYXNrcyAqLworI2RlZmluZSBFQlRfTk9QUk9UTyAweDAyCisjZGVmaW5lIEVCVF84MDJfMyAweDA0CisjZGVmaW5lIEVCVF9TT1VSQ0VNQUMgMHgwOAorI2RlZmluZSBFQlRfREVTVE1BQyAweDEwCisjZGVmaW5lIEVCVF9GX01BU0sgKEVCVF9OT1BST1RPIHwgRUJUXzgwMl8zIHwgRUJUX1NPVVJDRU1BQyB8IEVCVF9ERVNUTUFDIFwKKyAgIHwgRUJUX0VOVFJZX09SX0VOVFJJRVMpCisKKyNkZWZpbmUgRUJUX0lQUk9UTyAweDAxCisjZGVmaW5lIEVCVF9JSU4gMHgwMgorI2RlZmluZSBFQlRfSU9VVCAweDA0CisjZGVmaW5lIEVCVF9JU09VUkNFIDB4OAorI2RlZmluZSBFQlRfSURFU1QgMHgxMAorI2RlZmluZSBFQlRfSUxPR0lDQUxJTiAweDIwCisjZGVmaW5lIEVCVF9JTE9HSUNBTE9VVCAweDQwCisjZGVmaW5lIEVCVF9JTlZfTUFTSyAoRUJUX0lQUk9UTyB8IEVCVF9JSU4gfCBFQlRfSU9VVCB8IEVCVF9JTE9HSUNBTElOIFwKKyAgIHwgRUJUX0lMT0dJQ0FMT1VUIHwgRUJUX0lTT1VSQ0UgfCBFQlRfSURFU1QpCisKK3N0cnVjdCBlYnRfZW50cnlfbWF0Y2ggeworCXVuaW9uIHsKKwkJY2hhciBuYW1lW0VCVF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKKwkJc3RydWN0IHh0X21hdGNoICptYXRjaDsKKwl9IHU7CisJLyogc2l6ZSBvZiBkYXRhICovCisJdW5zaWduZWQgaW50IG1hdGNoX3NpemU7CisJdW5zaWduZWQgY2hhciBkYXRhWzBdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChfX2FsaWdub2ZfXyhzdHJ1Y3QgZWJ0X3JlcGxhY2UpKSkpOworfTsKKworc3RydWN0IGVidF9lbnRyeV93YXRjaGVyIHsKKwl1bmlvbiB7CisJCWNoYXIgbmFtZVtFQlRfRlVOQ1RJT05fTUFYTkFNRUxFTl07CisJCXN0cnVjdCB4dF90YXJnZXQgKndhdGNoZXI7CisJfSB1OworCS8qIHNpemUgb2YgZGF0YSAqLworCXVuc2lnbmVkIGludCB3YXRjaGVyX3NpemU7CisJdW5zaWduZWQgY2hhciBkYXRhWzBdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChfX2FsaWdub2ZfXyhzdHJ1Y3QgZWJ0X3JlcGxhY2UpKSkpOworfTsKKworc3RydWN0IGVidF9lbnRyeV90YXJnZXQgeworCXVuaW9uIHsKKwkJY2hhciBuYW1lW0VCVF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKKwkJc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0OworCX0gdTsKKwkvKiBzaXplIG9mIGRhdGEgKi8KKwl1bnNpZ25lZCBpbnQgdGFyZ2V0X3NpemU7CisJdW5zaWduZWQgY2hhciBkYXRhWzBdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChfX2FsaWdub2ZfXyhzdHJ1Y3QgZWJ0X3JlcGxhY2UpKSkpOworfTsKKworI2RlZmluZSBFQlRfU1RBTkRBUkRfVEFSR0VUICJzdGFuZGFyZCIKK3N0cnVjdCBlYnRfc3RhbmRhcmRfdGFyZ2V0IHsKKwlzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCB0YXJnZXQ7CisJaW50IHZlcmRpY3Q7Cit9OworCisvKiBvbmUgZW50cnkgKi8KK3N0cnVjdCBlYnRfZW50cnkgeworCS8qIHRoaXMgbmVlZHMgdG8gYmUgdGhlIGZpcnN0IGZpZWxkICovCisJdW5zaWduZWQgaW50IGJpdG1hc2s7CisJdW5zaWduZWQgaW50IGludmZsYWdzOworCV9fYmUxNiBldGhwcm90bzsKKwkvKiB0aGUgcGh5c2ljYWwgaW4tZGV2ICovCisJY2hhciBpbltJRk5BTVNJWl07CisJLyogdGhlIGxvZ2ljYWwgaW4tZGV2ICovCisJY2hhciBsb2dpY2FsX2luW0lGTkFNU0laXTsKKwkvKiB0aGUgcGh5c2ljYWwgb3V0LWRldiAqLworCWNoYXIgb3V0W0lGTkFNU0laXTsKKwkvKiB0aGUgbG9naWNhbCBvdXQtZGV2ICovCisJY2hhciBsb2dpY2FsX291dFtJRk5BTVNJWl07CisJdW5zaWduZWQgY2hhciBzb3VyY2VtYWNbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgc291cmNlbXNrW0VUSF9BTEVOXTsKKwl1bnNpZ25lZCBjaGFyIGRlc3RtYWNbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgZGVzdG1za1tFVEhfQUxFTl07CisJLyogc2l6ZW9mIGVidF9lbnRyeSArIG1hdGNoZXMgKi8KKwl1bnNpZ25lZCBpbnQgd2F0Y2hlcnNfb2Zmc2V0OworCS8qIHNpemVvZiBlYnRfZW50cnkgKyBtYXRjaGVzICsgd2F0Y2hlcnMgKi8KKwl1bnNpZ25lZCBpbnQgdGFyZ2V0X29mZnNldDsKKwkvKiBzaXplb2YgZWJ0X2VudHJ5ICsgbWF0Y2hlcyArIHdhdGNoZXJzICsgdGFyZ2V0ICovCisJdW5zaWduZWQgaW50IG5leHRfb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgZWxlbXNbMF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKF9fYWxpZ25vZl9fKHN0cnVjdCBlYnRfcmVwbGFjZSkpKSk7Cit9OworCisvKiB7ZyxzfWV0c29ja29wdCBudW1iZXJzICovCisjZGVmaW5lIEVCVF9CQVNFX0NUTCAgICAgICAgICAgIDEyOAorCisjZGVmaW5lIEVCVF9TT19TRVRfRU5UUklFUyAgICAgIChFQlRfQkFTRV9DVEwpCisjZGVmaW5lIEVCVF9TT19TRVRfQ09VTlRFUlMgICAgIChFQlRfU09fU0VUX0VOVFJJRVMrMSkKKyNkZWZpbmUgRUJUX1NPX1NFVF9NQVggICAgICAgICAgKEVCVF9TT19TRVRfQ09VTlRFUlMrMSkKKworI2RlZmluZSBFQlRfU09fR0VUX0lORk8gICAgICAgICAoRUJUX0JBU0VfQ1RMKQorI2RlZmluZSBFQlRfU09fR0VUX0VOVFJJRVMgICAgICAoRUJUX1NPX0dFVF9JTkZPKzEpCisjZGVmaW5lIEVCVF9TT19HRVRfSU5JVF9JTkZPICAgIChFQlRfU09fR0VUX0VOVFJJRVMrMSkKKyNkZWZpbmUgRUJUX1NPX0dFVF9JTklUX0VOVFJJRVMgKEVCVF9TT19HRVRfSU5JVF9JTkZPKzEpCisjZGVmaW5lIEVCVF9TT19HRVRfTUFYICAgICAgICAgIChFQlRfU09fR0VUX0lOSVRfRU5UUklFUysxKQorCisKKy8qIGJsYXRlbnRseSBzdG9sZW4gZnJvbSBpcF90YWJsZXMuaAorICogZm4gcmV0dXJucyAwIHRvIGNvbnRpbnVlIGl0ZXJhdGlvbiAqLworI2RlZmluZSBFQlRfTUFUQ0hfSVRFUkFURShlLCBmbiwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXVuc2lnbmVkIGludCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaW50IF9fcmV0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICpfX21hdGNoOyAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZm9yIChfX2kgPSBzaXplb2Yoc3RydWN0IGVidF9lbnRyeSk7ICAgICAgICAgICAgICAgIFwKKwkgICAgIF9faSA8IChlKS0+d2F0Y2hlcnNfb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgX19pICs9IF9fbWF0Y2gtPm1hdGNoX3NpemUgKyAgICAgICAgICAgICAgICAgICBcCisJICAgICBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV9tYXRjaCkpIHsgICAgICAgICAgICAgIFwKKwkJX19tYXRjaCA9ICh2b2lkICopKGUpICsgX19pOyAgICAgICAgICAgICAgICBcCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlfX3JldCA9IGZuKF9fbWF0Y2ggLCAjIyBhcmdzKTsgICAgICAgICAgICAgIFwKKwkJaWYgKF9fcmV0ICE9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoX19yZXQgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoX19pICE9IChlKS0+d2F0Y2hlcnNfb2Zmc2V0KSAgICAgICAgICAgIFwKKwkJCV9fcmV0ID0gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9fcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisjZGVmaW5lIEVCVF9XQVRDSEVSX0lURVJBVEUoZSwgZm4sIGFyZ3MuLi4pICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdW5zaWduZWQgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpbnQgX19yZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqX193YXRjaGVyOyAgICAgICAgICAgICAgICBcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlmb3IgKF9faSA9IGUtPndhdGNoZXJzX29mZnNldDsgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgX19pIDwgKGUpLT50YXJnZXRfb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICBfX2kgKz0gX193YXRjaGVyLT53YXRjaGVyX3NpemUgKyAgICAgICAgICAgICAgIFwKKwkgICAgIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIpKSB7ICAgICAgICAgICAgXAorCQlfX3dhdGNoZXIgPSAodm9pZCAqKShlKSArIF9faTsgICAgICAgICAgICAgIFwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCV9fcmV0ID0gZm4oX193YXRjaGVyICwgIyMgYXJncyk7ICAgICAgICAgICAgXAorCQlpZiAoX19yZXQgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChfX3JldCA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChfX2kgIT0gKGUpLT50YXJnZXRfb2Zmc2V0KSAgICAgICAgICAgICAgXAorCQkJX19yZXQgPSAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX19yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKyNkZWZpbmUgRUJUX0VOVFJZX0lURVJBVEUoZW50cmllcywgc2l6ZSwgZm4sIGFyZ3MuLi4pICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1bnNpZ25lZCBpbnQgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWludCBfX3JldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IGVidF9lbnRyeSAqX19lbnRyeTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWZvciAoX19pID0gMDsgX19pIDwgKHNpemUpOykgeyAgICAgICAgICAgICAgICAgICAgICBcCisJCV9fZW50cnkgPSAodm9pZCAqKShlbnRyaWVzKSArIF9faTsgICAgICAgICAgXAorCQlfX3JldCA9IGZuKF9fZW50cnkgLCAjIyBhcmdzKTsgICAgICAgICAgICAgIFwKKwkJaWYgKF9fcmV0ICE9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChfX2VudHJ5LT5iaXRtYXNrICE9IDApICAgICAgICAgICAgICAgICAgXAorCQkJX19pICs9IF9fZW50cnktPm5leHRfb2Zmc2V0OyAgICAgICAgXAorCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9faSArPSBzaXplb2Yoc3RydWN0IGVidF9lbnRyaWVzKTsgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChfX3JldCA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChfX2kgIT0gKHNpemUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX19yZXQgPSAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX19yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfZGVjbmV0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9kZWNuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWU4MGE5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfZGVjbmV0LmgKQEAgLTAsMCArMSw3NSBAQAorI2lmbmRlZiBfX0xJTlVYX0RFQ05FVF9ORVRGSUxURVJfSAorI2RlZmluZSBfX0xJTlVYX0RFQ05FVF9ORVRGSUxURVJfSAorCisvKiBERUNuZXQtc3BlY2lmaWMgZGVmaW5lcyBmb3IgbmV0ZmlsdGVyLiAKKyAqIFRoaXMgZmlsZSAoQykgU3RldmUgV2hpdGVob3VzZSAxOTk5IGRlcml2ZWQgZnJvbSB0aGUKKyAqIGlwdjQgbmV0ZmlsdGVyIGhlYWRlciBmaWxlIHdoaWNoIGlzCisgKiAoQykxOTk4IFJ1c3R5IFJ1c3NlbGwgLS0gVGhpcyBjb2RlIGlzIEdQTC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisKKy8qIG9ubHkgZm9yIHVzZXJzcGFjZSBjb21wYXRpYmlsaXR5ICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gLyogZm9yIElOVF9NSU4sIElOVF9NQVggKi8KKworLyogSVAgQ2FjaGUgYml0cy4gKi8KKy8qIFNyYyBJUCBhZGRyZXNzLiAqLworI2RlZmluZSBORkNfRE5fU1JDCQkweDAwMDEKKy8qIERlc3QgSVAgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTkZDX0ROX0RTVAkJMHgwMDAyCisvKiBJbnB1dCBkZXZpY2UuICovCisjZGVmaW5lIE5GQ19ETl9JRl9JTgkJMHgwMDA0CisvKiBPdXRwdXQgZGV2aWNlLiAqLworI2RlZmluZSBORkNfRE5fSUZfT1VUCQkweDAwMDgKKworLyogREVDbmV0IEhvb2tzICovCisvKiBBZnRlciBwcm9taXNjIGRyb3BzLCBjaGVja3N1bSBjaGVja3MuICovCisjZGVmaW5lIE5GX0ROX1BSRV9ST1VUSU5HCTAKKy8qIElmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgZm9yIHRoaXMgYm94LiAqLworI2RlZmluZSBORl9ETl9MT0NBTF9JTgkJMQorLyogSWYgdGhlIHBhY2tldCBpcyBkZXN0aW5lZCBmb3IgYW5vdGhlciBpbnRlcmZhY2UuICovCisjZGVmaW5lIE5GX0ROX0ZPUldBUkQJCTIKKy8qIFBhY2tldHMgY29taW5nIGZyb20gYSBsb2NhbCBwcm9jZXNzLiAqLworI2RlZmluZSBORl9ETl9MT0NBTF9PVVQJCTMKKy8qIFBhY2tldHMgYWJvdXQgdG8gaGl0IHRoZSB3aXJlLiAqLworI2RlZmluZSBORl9ETl9QT1NUX1JPVVRJTkcJNAorLyogSW5wdXQgSGVsbG8gUGFja2V0cyAqLworI2RlZmluZSBORl9ETl9IRUxMTwkJNQorLyogSW5wdXQgUm91dGluZyBQYWNrZXRzICovCisjZGVmaW5lIE5GX0ROX1JPVVRFCQk2CisjZGVmaW5lIE5GX0ROX05VTUhPT0tTCQk3CisKK2VudW0gbmZfZG5faG9va19wcmlvcml0aWVzIHsKKwlORl9ETl9QUklfRklSU1QgPSBJTlRfTUlOLAorCU5GX0ROX1BSSV9DT05OVFJBQ0sgPSAtMjAwLAorCU5GX0ROX1BSSV9NQU5HTEUgPSAtMTUwLAorCU5GX0ROX1BSSV9OQVRfRFNUID0gLTEwMCwKKwlORl9ETl9QUklfRklMVEVSID0gMCwKKwlORl9ETl9QUklfTkFUX1NSQyA9IDEwMCwKKwlORl9ETl9QUklfRE5SVE1TRyA9IDIwMCwKKwlORl9ETl9QUklfTEFTVCA9IElOVF9NQVgsCit9OworCitzdHJ1Y3QgbmZfZG5fcnRtc2cgeworCWludCBuZmRuX2lmaW5kZXg7Cit9OworCisjZGVmaW5lIE5GRE5fUlRNU0cocikgKCh1bnNpZ25lZCBjaGFyICopKHIpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZl9kbl9ydG1zZykpKQorCisvKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgdXNlcnNwYWNlICovCisjZGVmaW5lIEROUk1HX0wxX0dST1VQIDB4MDEKKyNkZWZpbmUgRE5STUdfTDJfR1JPVVAgMHgwMgorCitlbnVtIHsKKwlETlJOR19OTEdSUF9OT05FLAorI2RlZmluZSBETlJOR19OTEdSUF9OT05FCUROUk5HX05MR1JQX05PTkUKKwlETlJOR19OTEdSUF9MMSwKKyNkZWZpbmUgRE5STkdfTkxHUlBfTDEJCUROUk5HX05MR1JQX0wxCisJRE5STkdfTkxHUlBfTDIsCisjZGVmaW5lIEROUk5HX05MR1JQX0wyCQlETlJOR19OTEdSUF9MMgorCV9fRE5STkdfTkxHUlBfTUFYCit9OworI2RlZmluZSBETlJOR19OTEdSUF9NQVgJKF9fRE5STkdfTkxHUlBfTUFYIC0gMSkKKworI2VuZGlmIC8qX19MSU5VWF9ERUNORVRfTkVURklMVEVSX0gqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OTAzMDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0LmgKQEAgLTAsMCArMSw3OCBAQAorI2lmbmRlZiBfX0xJTlVYX0lQX05FVEZJTFRFUl9ICisjZGVmaW5lIF9fTElOVVhfSVBfTkVURklMVEVSX0gKKworLyogSVB2NC1zcGVjaWZpYyBkZWZpbmVzIGZvciBuZXRmaWx0ZXIuIAorICogKEMpMTk5OCBSdXN0eSBSdXNzZWxsIC0tIFRoaXMgY29kZSBpcyBHUEwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorCisvKiBvbmx5IGZvciB1c2Vyc3BhY2UgY29tcGF0aWJpbGl0eSAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+IC8qIGZvciBJTlRfTUlOLCBJTlRfTUFYICovCisKKy8qIElQIENhY2hlIGJpdHMuICovCisvKiBTcmMgSVAgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTkZDX0lQX1NSQwkJMHgwMDAxCisvKiBEZXN0IElQIGFkZHJlc3MuICovCisjZGVmaW5lIE5GQ19JUF9EU1QJCTB4MDAwMgorLyogSW5wdXQgZGV2aWNlLiAqLworI2RlZmluZSBORkNfSVBfSUZfSU4JCTB4MDAwNAorLyogT3V0cHV0IGRldmljZS4gKi8KKyNkZWZpbmUgTkZDX0lQX0lGX09VVAkJMHgwMDA4CisvKiBUT1MuICovCisjZGVmaW5lIE5GQ19JUF9UT1MJCTB4MDAxMAorLyogUHJvdG9jb2wuICovCisjZGVmaW5lIE5GQ19JUF9QUk9UTwkJMHgwMDIwCisvKiBJUCBvcHRpb25zLiAqLworI2RlZmluZSBORkNfSVBfT1BUSU9OUwkJMHgwMDQwCisvKiBGcmFnICYgZmxhZ3MuICovCisjZGVmaW5lIE5GQ19JUF9GUkFHCQkweDAwODAKKworLyogUGVyLXByb3RvY29sIGluZm9ybWF0aW9uOiBvbmx5IG1hdHRlcnMgaWYgcHJvdG8gbWF0Y2guICovCisvKiBUQ1AgZmxhZ3MuICovCisjZGVmaW5lIE5GQ19JUF9UQ1BGTEFHUwkJMHgwMTAwCisvKiBTb3VyY2UgcG9ydC4gKi8KKyNkZWZpbmUgTkZDX0lQX1NSQ19QVAkJMHgwMjAwCisvKiBEZXN0IHBvcnQuICovCisjZGVmaW5lIE5GQ19JUF9EU1RfUFQJCTB4MDQwMAorLyogU29tZXRoaW5nIGVsc2UgYWJvdXQgdGhlIHByb3RvICovCisjZGVmaW5lIE5GQ19JUF9QUk9UT19VTktOT1dOCTB4MjAwMAorCisvKiBJUCBIb29rcyAqLworLyogQWZ0ZXIgcHJvbWlzYyBkcm9wcywgY2hlY2tzdW0gY2hlY2tzLiAqLworI2RlZmluZSBORl9JUF9QUkVfUk9VVElORwkwCisvKiBJZiB0aGUgcGFja2V0IGlzIGRlc3RpbmVkIGZvciB0aGlzIGJveC4gKi8KKyNkZWZpbmUgTkZfSVBfTE9DQUxfSU4JCTEKKy8qIElmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgZm9yIGFub3RoZXIgaW50ZXJmYWNlLiAqLworI2RlZmluZSBORl9JUF9GT1JXQVJECQkyCisvKiBQYWNrZXRzIGNvbWluZyBmcm9tIGEgbG9jYWwgcHJvY2Vzcy4gKi8KKyNkZWZpbmUgTkZfSVBfTE9DQUxfT1VUCQkzCisvKiBQYWNrZXRzIGFib3V0IHRvIGhpdCB0aGUgd2lyZS4gKi8KKyNkZWZpbmUgTkZfSVBfUE9TVF9ST1VUSU5HCTQKKyNkZWZpbmUgTkZfSVBfTlVNSE9PS1MJCTUKKworZW51bSBuZl9pcF9ob29rX3ByaW9yaXRpZXMgeworCU5GX0lQX1BSSV9GSVJTVCA9IElOVF9NSU4sCisJTkZfSVBfUFJJX0NPTk5UUkFDS19ERUZSQUcgPSAtNDAwLAorCU5GX0lQX1BSSV9SQVcgPSAtMzAwLAorCU5GX0lQX1BSSV9TRUxJTlVYX0ZJUlNUID0gLTIyNSwKKwlORl9JUF9QUklfQ09OTlRSQUNLID0gLTIwMCwKKwlORl9JUF9QUklfTUFOR0xFID0gLTE1MCwKKwlORl9JUF9QUklfTkFUX0RTVCA9IC0xMDAsCisJTkZfSVBfUFJJX0ZJTFRFUiA9IDAsCisJTkZfSVBfUFJJX1NFQ1VSSVRZID0gNTAsCisJTkZfSVBfUFJJX05BVF9TUkMgPSAxMDAsCisJTkZfSVBfUFJJX1NFTElOVVhfTEFTVCA9IDIyNSwKKwlORl9JUF9QUklfQ09OTlRSQUNLX0NPTkZJUk0gPSBJTlRfTUFYLAorCU5GX0lQX1BSSV9MQVNUID0gSU5UX01BWCwKK307CisKKy8qIEFyZ3VtZW50cyBmb3Igc2V0c29ja29wdCBTT0xfSVA6ICovCisvKiAyLjAgZmlyZXdhbGxpbmcgd2VudCBmcm9tIDY0IHRocm91Z2ggNzEgKGFuZCArMjU2LCArNTEyLCBldGMpLiAqLworLyogMi4yIGZpcmV3YWxsaW5nICgrIG1hc3EpIHdlbnQgZnJvbSA2NCB0aHJvdWdoIDc2ICovCisvKiAyLjQgZmlyZXdhbGxpbmcgd2VudCA2NCB0aHJvdWdoIDY3LiAqLworI2RlZmluZSBTT19PUklHSU5BTF9EU1QgODAKKworCisjZW5kaWYgLypfX0xJTlVYX0lQX05FVEZJTFRFUl9IKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfcXVldWUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTIyOWIxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9xdWV1ZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBUaGlzIGlzIGEgbW9kdWxlIHdoaWNoIGlzIHVzZWQgZm9yIHF1ZXVlaW5nIElQdjQgcGFja2V0cyBhbmQKKyAqIGNvbW11bmljYXRpbmcgd2l0aCB1c2Vyc3BhY2UgdmlhIG5ldGxpbmsuCisgKgorICogKEMpIDIwMDAgSmFtZXMgTW9ycmlzLCB0aGlzIGNvZGUgaXMgR1BMLgorICovCisjaWZuZGVmIF9JUF9RVUVVRV9ICisjZGVmaW5lIF9JUF9RVUVVRV9ICisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKworLyogTWVzc2FnZXMgc2VudCBmcm9tIGtlcm5lbCAqLwordHlwZWRlZiBzdHJ1Y3QgaXBxX3BhY2tldF9tc2cgeworCXVuc2lnbmVkIGxvbmcgcGFja2V0X2lkOwkvKiBJRCBvZiBxdWV1ZWQgcGFja2V0ICovCisJdW5zaWduZWQgbG9uZyBtYXJrOwkJLyogTmV0ZmlsdGVyIG1hcmsgdmFsdWUgKi8KKwlsb25nIHRpbWVzdGFtcF9zZWM7CQkvKiBQYWNrZXQgYXJyaXZhbCB0aW1lIChzZWNvbmRzKSAqLworCWxvbmcgdGltZXN0YW1wX3VzZWM7CQkvKiBQYWNrZXQgYXJydmlhbCB0aW1lICgrdXNlY29uZHMpICovCisJdW5zaWduZWQgaW50IGhvb2s7CQkvKiBOZXRmaWx0ZXIgaG9vayB3ZSByb2RlIGluIG9uICovCisJY2hhciBpbmRldl9uYW1lW0lGTkFNU0laXTsJLyogTmFtZSBvZiBpbmNvbWluZyBpbnRlcmZhY2UgKi8KKwljaGFyIG91dGRldl9uYW1lW0lGTkFNU0laXTsJLyogTmFtZSBvZiBvdXRnb2luZyBpbnRlcmZhY2UgKi8KKwlfX2JlMTYgaHdfcHJvdG9jb2w7CQkvKiBIYXJkd2FyZSBwcm90b2NvbCAobmV0d29yayBvcmRlcikgKi8KKwl1bnNpZ25lZCBzaG9ydCBod190eXBlOwkJLyogSGFyZHdhcmUgdHlwZSAqLworCXVuc2lnbmVkIGNoYXIgaHdfYWRkcmxlbjsJLyogSGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggKi8KKwl1bnNpZ25lZCBjaGFyIGh3X2FkZHJbOF07CS8qIEhhcmR3YXJlIGFkZHJlc3MgKi8KKwlzaXplX3QgZGF0YV9sZW47CQkvKiBMZW5ndGggb2YgcGFja2V0IGRhdGEgKi8KKwl1bnNpZ25lZCBjaGFyIHBheWxvYWRbMF07CS8qIE9wdGlvbmFsIHBhY2tldCBkYXRhICovCit9IGlwcV9wYWNrZXRfbXNnX3Q7CisKKy8qIE1lc3NhZ2VzIHNlbnQgZnJvbSB1c2Vyc3BhY2UgKi8KK3R5cGVkZWYgc3RydWN0IGlwcV9tb2RlX21zZyB7CisJdW5zaWduZWQgY2hhciB2YWx1ZTsJCS8qIFJlcXVlc3RlZCBtb2RlICovCisJc2l6ZV90IHJhbmdlOwkJCS8qIE9wdGlvbmFsIHJhbmdlIG9mIHBhY2tldCByZXF1ZXN0ZWQgKi8KK30gaXBxX21vZGVfbXNnX3Q7CisKK3R5cGVkZWYgc3RydWN0IGlwcV92ZXJkaWN0X21zZyB7CisJdW5zaWduZWQgaW50IHZhbHVlOwkJLyogVmVyZGljdCB0byBoYW5kIHRvIG5ldGZpbHRlciAqLworCXVuc2lnbmVkIGxvbmcgaWQ7CQkvKiBQYWNrZXQgSUQgZm9yIHRoaXMgdmVyZGljdCAqLworCXNpemVfdCBkYXRhX2xlbjsJCS8qIExlbmd0aCBvZiByZXBsYWNlbWVudCBkYXRhICovCisJdW5zaWduZWQgY2hhciBwYXlsb2FkWzBdOwkvKiBPcHRpb25hbCByZXBsYWNlbWVudCBwYWNrZXQgKi8KK30gaXBxX3ZlcmRpY3RfbXNnX3Q7CisKK3R5cGVkZWYgc3RydWN0IGlwcV9wZWVyX21zZyB7CisJdW5pb24geworCQlpcHFfdmVyZGljdF9tc2dfdCB2ZXJkaWN0OworCQlpcHFfbW9kZV9tc2dfdCBtb2RlOworCX0gbXNnOworfSBpcHFfcGVlcl9tc2dfdDsKKworLyogUGFja2V0IGRlbGl2ZXJ5IG1vZGVzICovCitlbnVtIHsKKwlJUFFfQ09QWV9OT05FLAkJLyogSW5pdGlhbCBtb2RlLCBwYWNrZXRzIGFyZSBkcm9wcGVkICovCisJSVBRX0NPUFlfTUVUQSwJCS8qIENvcHkgbWV0YWRhdGEgKi8KKwlJUFFfQ09QWV9QQUNLRVQJCS8qIENvcHkgbWV0YWRhdGEgKyBwYWNrZXQgKHJhbmdlKSAqLworfTsKKyNkZWZpbmUgSVBRX0NPUFlfTUFYIElQUV9DT1BZX1BBQ0tFVAorCisvKiBUeXBlcyBvZiBtZXNzYWdlcyAqLworI2RlZmluZSBJUFFNX0JBU0UJMHgxMAkvKiBzdGFuZGFyZCBuZXRsaW5rIG1lc3NhZ2VzIGJlbG93IHRoaXMgKi8KKyNkZWZpbmUgSVBRTV9NT0RFCShJUFFNX0JBU0UgKyAxKQkJLyogTW9kZSByZXF1ZXN0IGZyb20gcGVlciAqLworI2RlZmluZSBJUFFNX1ZFUkRJQ1QJKElQUU1fQkFTRSArIDIpCQkvKiBWZXJkaWN0IGZyb20gcGVlciAqLyAKKyNkZWZpbmUgSVBRTV9QQUNLRVQJKElQUU1fQkFTRSArIDMpCQkvKiBQYWNrZXQgZnJvbSBrZXJuZWwgKi8KKyNkZWZpbmUgSVBRTV9NQVgJKElQUU1fQkFTRSArIDQpCisKKyNlbmRpZiAvKl9JUF9RVUVVRV9IKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NTQyYjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogMjUtSnVsLTE5OTggTWFqb3IgY2hhbmdlcyB0byBhbGxvdyBmb3IgaXAgY2hhaW4gdGFibGUKKyAqCisgKiAzLUphbi0yMDAwIE5hbWVkIHRhYmxlcyB0byBhbGxvdyBwYWNrZXQgc2VsZWN0aW9uIGZvciBkaWZmZXJlbnQgdXNlcy4KKyAqLworCisvKgorICogCUZvcm1hdCBvZiBhbiBJUCBmaXJld2FsbCBkZXNjcmlwdG9yCisgKgorICogCXNyYywgZHN0LCBzcmNfbWFzaywgZHN0X21hc2sgYXJlIGFsd2F5cyBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyLgorICogCWZsYWdzIGFyZSBzdG9yZWQgaW4gaG9zdCBieXRlIG9yZGVyIChvZiBjb3Vyc2UpLgorICogCVBvcnQgbnVtYmVycyBhcmUgc3RvcmVkIGluIEhPU1QgYnl0ZSBvcmRlci4KKyAqLworCisjaWZuZGVmIF9JUFRBQkxFU19ICisjZGVmaW5lIF9JUFRBQkxFU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorCisjZGVmaW5lIElQVF9GVU5DVElPTl9NQVhOQU1FTEVOIFhUX0ZVTkNUSU9OX01BWE5BTUVMRU4KKyNkZWZpbmUgSVBUX1RBQkxFX01BWE5BTUVMRU4gWFRfVEFCTEVfTUFYTkFNRUxFTgorI2RlZmluZSBpcHRfbWF0Y2ggeHRfbWF0Y2gKKyNkZWZpbmUgaXB0X3RhcmdldCB4dF90YXJnZXQKKyNkZWZpbmUgaXB0X3RhYmxlIHh0X3RhYmxlCisjZGVmaW5lIGlwdF9nZXRfcmV2aXNpb24geHRfZ2V0X3JldmlzaW9uCisjZGVmaW5lIGlwdF9lbnRyeV9tYXRjaCB4dF9lbnRyeV9tYXRjaAorI2RlZmluZSBpcHRfZW50cnlfdGFyZ2V0IHh0X2VudHJ5X3RhcmdldAorI2RlZmluZSBpcHRfc3RhbmRhcmRfdGFyZ2V0IHh0X3N0YW5kYXJkX3RhcmdldAorI2RlZmluZSBpcHRfZXJyb3JfdGFyZ2V0IHh0X2Vycm9yX3RhcmdldAorI2RlZmluZSBpcHRfY291bnRlcnMgeHRfY291bnRlcnMKKyNkZWZpbmUgSVBUX0NPTlRJTlVFIFhUX0NPTlRJTlVFCisjZGVmaW5lIElQVF9SRVRVUk4gWFRfUkVUVVJOCisKKy8qIFRoaXMgZ3JvdXAgaXMgb2xkZXIgdGhhbiBvbGQgKGlwdGFibGVzIDwgdjEuNC4wLXJjMX44OSkgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmg+CisjZGVmaW5lIGlwdF91ZHAgeHRfdWRwCisjZGVmaW5lIGlwdF90Y3AgeHRfdGNwCisjZGVmaW5lIElQVF9UQ1BfSU5WX1NSQ1BUCVhUX1RDUF9JTlZfU1JDUFQKKyNkZWZpbmUgSVBUX1RDUF9JTlZfRFNUUFQJWFRfVENQX0lOVl9EU1RQVAorI2RlZmluZSBJUFRfVENQX0lOVl9GTEFHUwlYVF9UQ1BfSU5WX0ZMQUdTCisjZGVmaW5lIElQVF9UQ1BfSU5WX09QVElPTglYVF9UQ1BfSU5WX09QVElPTgorI2RlZmluZSBJUFRfVENQX0lOVl9NQVNLCVhUX1RDUF9JTlZfTUFTSworI2RlZmluZSBJUFRfVURQX0lOVl9TUkNQVAlYVF9VRFBfSU5WX1NSQ1BUCisjZGVmaW5lIElQVF9VRFBfSU5WX0RTVFBUCVhUX1VEUF9JTlZfRFNUUFQKKyNkZWZpbmUgSVBUX1VEUF9JTlZfTUFTSwlYVF9VRFBfSU5WX01BU0sKKworLyogVGhlIGFyZ3VtZW50IHRvIElQVF9TT19BRERfQ09VTlRFUlMuICovCisjZGVmaW5lIGlwdF9jb3VudGVyc19pbmZvIHh0X2NvdW50ZXJzX2luZm8KKy8qIFN0YW5kYXJkIHJldHVybiB2ZXJkaWN0LCBvciBkbyBqdW1wLiAqLworI2RlZmluZSBJUFRfU1RBTkRBUkRfVEFSR0VUIFhUX1NUQU5EQVJEX1RBUkdFVAorLyogRXJyb3IgdmVyZGljdC4gKi8KKyNkZWZpbmUgSVBUX0VSUk9SX1RBUkdFVCBYVF9FUlJPUl9UQVJHRVQKKworLyogZm4gcmV0dXJucyAwIHRvIGNvbnRpbnVlIGl0ZXJhdGlvbiAqLworI2RlZmluZSBJUFRfTUFUQ0hfSVRFUkFURShlLCBmbiwgYXJncy4uLikgXAorCVhUX01BVENIX0lURVJBVEUoc3RydWN0IGlwdF9lbnRyeSwgZSwgZm4sICMjIGFyZ3MpCisKKy8qIGZuIHJldHVybnMgMCB0byBjb250aW51ZSBpdGVyYXRpb24gKi8KKyNkZWZpbmUgSVBUX0VOVFJZX0lURVJBVEUoZW50cmllcywgc2l6ZSwgZm4sIGFyZ3MuLi4pIFwKKwlYVF9FTlRSWV9JVEVSQVRFKHN0cnVjdCBpcHRfZW50cnksIGVudHJpZXMsIHNpemUsIGZuLCAjIyBhcmdzKQorCisvKiBZZXMsIFZpcmdpbmlhLCB5b3UgaGF2ZSB0byB6ZXJvIHRoZSBwYWRkaW5nLiAqLworc3RydWN0IGlwdF9pcCB7CisJLyogU291cmNlIGFuZCBkZXN0aW5hdGlvbiBJUCBhZGRyICovCisJc3RydWN0IGluX2FkZHIgc3JjLCBkc3Q7CisJLyogTWFzayBmb3Igc3JjIGFuZCBkZXN0IElQIGFkZHIgKi8KKwlzdHJ1Y3QgaW5fYWRkciBzbXNrLCBkbXNrOworCWNoYXIgaW5pZmFjZVtJRk5BTVNJWl0sIG91dGlmYWNlW0lGTkFNU0laXTsKKwl1bnNpZ25lZCBjaGFyIGluaWZhY2VfbWFza1tJRk5BTVNJWl0sIG91dGlmYWNlX21hc2tbSUZOQU1TSVpdOworCisJLyogUHJvdG9jb2wsIDAgPSBBTlkgKi8KKwlfX3UxNiBwcm90bzsKKworCS8qIEZsYWdzIHdvcmQgKi8KKwlfX3U4IGZsYWdzOworCS8qIEludmVyc2UgZmxhZ3MgKi8KKwlfX3U4IGludmZsYWdzOworfTsKKworLyogVmFsdWVzIGZvciAiZmxhZyIgZmllbGQgaW4gc3RydWN0IGlwdF9pcCAoZ2VuZXJhbCBpcCBzdHJ1Y3R1cmUpLiAqLworI2RlZmluZSBJUFRfRl9GUkFHCQkweDAxCS8qIFNldCBpZiBydWxlIGlzIGEgZnJhZ21lbnQgcnVsZSAqLworI2RlZmluZSBJUFRfRl9HT1RPCQkweDAyCS8qIFNldCBpZiBqdW1wIGlzIGEgZ290byAqLworI2RlZmluZSBJUFRfRl9NQVNLCQkweDAzCS8qIEFsbCBwb3NzaWJsZSBmbGFnIGJpdHMgbWFzay4gKi8KKworLyogVmFsdWVzIGZvciAiaW52IiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X2lwLiAqLworI2RlZmluZSBJUFRfSU5WX1ZJQV9JTgkJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIElOIElGQUNFLiAqLworI2RlZmluZSBJUFRfSU5WX1ZJQV9PVVQJCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBPVVQgSUZBQ0UgKi8KKyNkZWZpbmUgSVBUX0lOVl9UT1MJCTB4MDQJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBUT1MuICovCisjZGVmaW5lIElQVF9JTlZfU1JDSVAJCTB4MDgJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBTUkMgSVAuICovCisjZGVmaW5lIElQVF9JTlZfRFNUSVAJCTB4MTAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBEU1QgT1AuICovCisjZGVmaW5lIElQVF9JTlZfRlJBRwkJMHgyMAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIEZSQUcuICovCisjZGVmaW5lIElQVF9JTlZfUFJPVE8JCVhUX0lOVl9QUk9UTworI2RlZmluZSBJUFRfSU5WX01BU0sJCTB4N0YJLyogQWxsIHBvc3NpYmxlIGZsYWcgYml0cyBtYXNrLiAqLworCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGVhY2ggb2YgdGhlIGZpcmV3YWxsIHJ1bGVzLiAgQ29uc2lzdHMgb2YgMworICAgcGFydHMgd2hpY2ggYXJlIDEpIGdlbmVyYWwgSVAgaGVhZGVyIHN0dWZmIDIpIG1hdGNoIHNwZWNpZmljCisgICBzdHVmZiAzKSB0aGUgdGFyZ2V0IHRvIHBlcmZvcm0gaWYgdGhlIHJ1bGUgbWF0Y2hlcyAqLworc3RydWN0IGlwdF9lbnRyeSB7CisJc3RydWN0IGlwdF9pcCBpcDsKKworCS8qIE1hcmsgd2l0aCBmaWVsZHMgdGhhdCB3ZSBjYXJlIGFib3V0LiAqLworCXVuc2lnbmVkIGludCBuZmNhY2hlOworCisJLyogU2l6ZSBvZiBpcHRfZW50cnkgKyBtYXRjaGVzICovCisJX191MTYgdGFyZ2V0X29mZnNldDsKKwkvKiBTaXplIG9mIGlwdF9lbnRyeSArIG1hdGNoZXMgKyB0YXJnZXQgKi8KKwlfX3UxNiBuZXh0X29mZnNldDsKKworCS8qIEJhY2sgcG9pbnRlciAqLworCXVuc2lnbmVkIGludCBjb21lZnJvbTsKKworCS8qIFBhY2tldCBhbmQgYnl0ZSBjb3VudGVycy4gKi8KKwlzdHJ1Y3QgeHRfY291bnRlcnMgY291bnRlcnM7CisKKwkvKiBUaGUgbWF0Y2hlcyAoaWYgYW55KSwgdGhlbiB0aGUgdGFyZ2V0LiAqLworCXVuc2lnbmVkIGNoYXIgZWxlbXNbMF07Cit9OworCisvKgorICogTmV3IElQIGZpcmV3YWxsIG9wdGlvbnMgZm9yIFtnc11ldHNvY2tvcHQgYXQgdGhlIFJBVyBJUCBsZXZlbC4KKyAqIFVubGlrZSBCU0QgTGludXggaW5oZXJpdHMgSVAgb3B0aW9ucyBzbyB5b3UgZG9uJ3QgaGF2ZSB0byB1c2UgYSByYXcKKyAqIHNvY2tldCBmb3IgdGhpcy4gSW5zdGVhZCB3ZSBjaGVjayByaWdodHMgaW4gdGhlIGNhbGxzLgorICoKKyAqIEFUVEVOVElPTjogY2hlY2sgbGludXgvaW4uaCBiZWZvcmUgYWRkaW5nIG5ldyBudW1iZXIgaGVyZS4KKyAqLworI2RlZmluZSBJUFRfQkFTRV9DVEwJCTY0CisKKyNkZWZpbmUgSVBUX1NPX1NFVF9SRVBMQUNFCShJUFRfQkFTRV9DVEwpCisjZGVmaW5lIElQVF9TT19TRVRfQUREX0NPVU5URVJTCShJUFRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBJUFRfU09fU0VUX01BWAkJSVBUX1NPX1NFVF9BRERfQ09VTlRFUlMKKworI2RlZmluZSBJUFRfU09fR0VUX0lORk8JCQkoSVBUX0JBU0VfQ1RMKQorI2RlZmluZSBJUFRfU09fR0VUX0VOVFJJRVMJCShJUFRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBJUFRfU09fR0VUX1JFVklTSU9OX01BVENICShJUFRfQkFTRV9DVEwgKyAyKQorI2RlZmluZSBJUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAkoSVBUX0JBU0VfQ1RMICsgMykKKyNkZWZpbmUgSVBUX1NPX0dFVF9NQVgJCQlJUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAorCisvKiBJQ01QIG1hdGNoaW5nIHN0dWZmICovCitzdHJ1Y3QgaXB0X2ljbXAgeworCV9fdTggdHlwZTsJCQkJLyogdHlwZSB0byBtYXRjaCAqLworCV9fdTggY29kZVsyXTsJCQkJLyogcmFuZ2Ugb2YgY29kZSAqLworCV9fdTggaW52ZmxhZ3M7CQkJCS8qIEludmVyc2UgZmxhZ3MgKi8KK307CisKKy8qIFZhbHVlcyBmb3IgImludiIgZmllbGQgZm9yIHN0cnVjdCBpcHRfaWNtcC4gKi8KKyNkZWZpbmUgSVBUX0lDTVBfSU5WCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiB0eXBlL2NvZGUgdGVzdCAqLworCisvKiBUaGUgYXJndW1lbnQgdG8gSVBUX1NPX0dFVF9JTkZPICovCitzdHJ1Y3QgaXB0X2dldGluZm8geworCS8qIFdoaWNoIHRhYmxlOiBjYWxsZXIgZmlsbHMgdGhpcyBpbi4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBLZXJuZWwgZmlsbHMgdGhlc2UgaW4uICovCisJLyogV2hpY2ggaG9vayBlbnRyeSBwb2ludHMgYXJlIHZhbGlkOiBiaXRtYXNrICovCisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCisJLyogSG9vayBlbnRyeSBwb2ludHM6IG9uZSBwZXIgbmV0ZmlsdGVyIGhvb2suICovCisJdW5zaWduZWQgaW50IGhvb2tfZW50cnlbTkZfSU5FVF9OVU1IT09LU107CisKKwkvKiBVbmRlcmZsb3cgcG9pbnRzLiAqLworCXVuc2lnbmVkIGludCB1bmRlcmZsb3dbTkZfSU5FVF9OVU1IT09LU107CisKKwkvKiBOdW1iZXIgb2YgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBudW1fZW50cmllczsKKworCS8qIFNpemUgb2YgZW50cmllcy4gKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKK307CisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fU0VUX1JFUExBQ0UuICovCitzdHJ1Y3QgaXB0X3JlcGxhY2UgeworCS8qIFdoaWNoIHRhYmxlLiAqLworCWNoYXIgbmFtZVtYVF9UQUJMRV9NQVhOQU1FTEVOXTsKKworCS8qIFdoaWNoIGhvb2sgZW50cnkgcG9pbnRzIGFyZSB2YWxpZDogYml0bWFzay4gIFlvdSBjYW4ndAorICAgICAgICAgICBjaGFuZ2UgdGhpcy4gKi8KKwl1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3M7CisKKwkvKiBOdW1iZXIgb2YgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBudW1fZW50cmllczsKKworCS8qIFRvdGFsIHNpemUgb2YgbmV3IGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCS8qIEhvb2sgZW50cnkgcG9pbnRzLiAqLworCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0lORVRfTlVNSE9PS1NdOworCisJLyogVW5kZXJmbG93IHBvaW50cy4gKi8KKwl1bnNpZ25lZCBpbnQgdW5kZXJmbG93W05GX0lORVRfTlVNSE9PS1NdOworCisJLyogSW5mb3JtYXRpb24gYWJvdXQgb2xkIGVudHJpZXM6ICovCisJLyogTnVtYmVyIG9mIGNvdW50ZXJzIChtdXN0IGJlIGVxdWFsIHRvIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMpLiAqLworCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CisJLyogVGhlIG9sZCBlbnRyaWVzJyBjb3VudGVycy4gKi8KKwlzdHJ1Y3QgeHRfY291bnRlcnMgKmNvdW50ZXJzOworCisJLyogVGhlIGVudHJpZXMgKGhhbmcgb2ZmIGVuZDogbm90IHJlYWxseSBhbiBhcnJheSkuICovCisJc3RydWN0IGlwdF9lbnRyeSBlbnRyaWVzWzBdOworfTsKKworLyogVGhlIGFyZ3VtZW50IHRvIElQVF9TT19HRVRfRU5UUklFUy4gKi8KK3N0cnVjdCBpcHRfZ2V0X2VudHJpZXMgeworCS8qIFdoaWNoIHRhYmxlOiB1c2VyIGZpbGxzIHRoaXMgaW4uICovCisJY2hhciBuYW1lW1hUX1RBQkxFX01BWE5BTUVMRU5dOworCisJLyogVXNlciBmaWxscyB0aGlzIGluOiB0b3RhbCBlbnRyeSBzaXplLiAqLworCXVuc2lnbmVkIGludCBzaXplOworCisJLyogVGhlIGVudHJpZXMuICovCisJc3RydWN0IGlwdF9lbnRyeSBlbnRyeXRhYmxlWzBdOworfTsKKworLyogSGVscGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHh0X2VudHJ5X3RhcmdldCAqCitpcHRfZ2V0X3RhcmdldChzdHJ1Y3QgaXB0X2VudHJ5ICplKQoreworCXJldHVybiAodm9pZCAqKWUgKyBlLT50YXJnZXRfb2Zmc2V0OworfQorCisvKgorICoJTWFpbiBmaXJld2FsbCBjaGFpbnMgZGVmaW5pdGlvbnMgYW5kIGdsb2JhbCB2YXIncyBkZWZpbml0aW9ucy4KKyAqLworI2VuZGlmIC8qIF9JUFRBQkxFU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DTFVTVEVSSVAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NMVVNURVJJUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YTIwNGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DTFVTVEVSSVAuaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIF9JUFRfQ0xVU1RFUklQX0hfdGFyZ2V0CisjZGVmaW5lIF9JUFRfQ0xVU1RFUklQX0hfdGFyZ2V0CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIGNsdXN0ZXJpcF9oYXNobW9kZSB7CisgICAgQ0xVU1RFUklQX0hBU0hNT0RFX1NJUCA9IDAsCisgICAgQ0xVU1RFUklQX0hBU0hNT0RFX1NJUF9TUFQsCisgICAgQ0xVU1RFUklQX0hBU0hNT0RFX1NJUF9TUFRfRFBULAorfTsKKworI2RlZmluZSBDTFVTVEVSSVBfSEFTSE1PREVfTUFYIENMVVNURVJJUF9IQVNITU9ERV9TSVBfU1BUX0RQVAorCisjZGVmaW5lIENMVVNURVJJUF9NQVhfTk9ERVMgMTYKKworI2RlZmluZSBDTFVTVEVSSVBfRkxBR19ORVcgMHgwMDAwMDAwMQorCitzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZzsKKworc3RydWN0IGlwdF9jbHVzdGVyaXBfdGd0X2luZm8geworCisJX191MzIgZmxhZ3M7CisKKwkvKiBvbmx5IHJlbGV2YW50IGZvciBuZXcgb25lcyAqLworCV9fdTggY2x1c3Rlcm1hY1s2XTsKKwlfX3UxNiBudW1fdG90YWxfbm9kZXM7CisJX191MTYgbnVtX2xvY2FsX25vZGVzOworCV9fdTE2IGxvY2FsX25vZGVzW0NMVVNURVJJUF9NQVhfTk9ERVNdOworCV9fdTMyIGhhc2hfbW9kZTsKKwlfX3UzMiBoYXNoX2luaXR2YWw7CisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICpjb25maWc7Cit9OworCisjZW5kaWYgLypfSVBUX0NMVVNURVJJUF9IX3RhcmdldCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9FQ04uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0VDTi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODhkNTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9FQ04uaApAQCAtMCwwICsxLDMzIEBACisvKiBIZWFkZXIgZmlsZSBmb3IgaXB0YWJsZXMgaXB0X0VDTiB0YXJnZXQKKyAqCisgKiAoQykgMjAwMiBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgR05VIEdQTCB2MiwgMTk5MQorICogCisgKiBpcHRfRUNOLmgsdiAxLjMgMjAwMi8wNS8yOSAxMjoxNzo0MCBsYWZvcmdlIEV4cAorKi8KKyNpZm5kZWYgX0lQVF9FQ05fVEFSR0VUX0gKKyNkZWZpbmUgX0lQVF9FQ05fVEFSR0VUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X0RTQ1AuaD4KKworI2RlZmluZSBJUFRfRUNOX0lQX01BU0sJKH5YVF9EU0NQX01BU0spCisKKyNkZWZpbmUgSVBUX0VDTl9PUF9TRVRfSVAJMHgwMQkvKiBzZXQgRUNOIGJpdHMgb2YgSVB2NCBoZWFkZXIgKi8KKyNkZWZpbmUgSVBUX0VDTl9PUF9TRVRfRUNFCTB4MTAJLyogc2V0IEVDRSBiaXQgb2YgVENQIGhlYWRlciAqLworI2RlZmluZSBJUFRfRUNOX09QX1NFVF9DV1IJMHgyMAkvKiBzZXQgQ1dSIGJpdCBvZiBUQ1AgaGVhZGVyICovCisKKyNkZWZpbmUgSVBUX0VDTl9PUF9NQVNLCQkweGNlCisKK3N0cnVjdCBpcHRfRUNOX2luZm8geworCV9fdTggb3BlcmF0aW9uOwkvKiBiaXRzZXQgb2Ygb3BlcmF0aW9ucyAqLworCV9fdTggaXBfZWN0OwkvKiBFQ1QgY29kZXBvaW50IG9mIElQdjQgaGVhZGVyLCBwcmUtc2hpZnRlZCAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTggZWNlOjEsIGN3cjoxOyAvKiBUQ1AgRUNUIGJpdHMgKi8KKwkJfSB0Y3A7CisJfSBwcm90bzsKK307CisKKyNlbmRpZiAvKiBfSVBUX0VDTl9UQVJHRVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTE9HLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9MT0cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2RiYWRmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTE9HLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfSVBUX0xPR19ICisjZGVmaW5lIF9JUFRfTE9HX0gKKworLyogbWFrZSBzdXJlIG5vdCB0byBjaGFuZ2UgdGhpcyB3aXRob3V0IGNoYW5naW5nIG5ldGZpbHRlci5oOk5GX0xPR18qICghKSAqLworI2RlZmluZSBJUFRfTE9HX1RDUFNFUQkJMHgwMQkvKiBMb2cgVENQIHNlcXVlbmNlIG51bWJlcnMgKi8KKyNkZWZpbmUgSVBUX0xPR19UQ1BPUFQJCTB4MDIJLyogTG9nIFRDUCBvcHRpb25zICovCisjZGVmaW5lIElQVF9MT0dfSVBPUFQJCTB4MDQJLyogTG9nIElQIG9wdGlvbnMgKi8KKyNkZWZpbmUgSVBUX0xPR19VSUQJCTB4MDgJLyogTG9nIFVJRCBvd25pbmcgbG9jYWwgc29ja2V0ICovCisjZGVmaW5lIElQVF9MT0dfTkZMT0cJCTB4MTAJLyogVW5zdXBwb3J0ZWQsIGRvbid0IHJldXNlICovCisjZGVmaW5lIElQVF9MT0dfTUFDREVDT0RFCTB4MjAJLyogRGVjb2RlIE1BQyBoZWFkZXIgKi8KKyNkZWZpbmUgSVBUX0xPR19NQVNLCQkweDJmCisKK3N0cnVjdCBpcHRfbG9nX2luZm8geworCXVuc2lnbmVkIGNoYXIgbGV2ZWw7CisJdW5zaWduZWQgY2hhciBsb2dmbGFnczsKKwljaGFyIHByZWZpeFszMF07Cit9OworCisjZW5kaWYgLypfSVBUX0xPR19IKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1JFSkVDVC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfUkVKRUNULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5M2ExYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1JFSkVDVC5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX0lQVF9SRUpFQ1RfSAorI2RlZmluZSBfSVBUX1JFSkVDVF9ICisKK2VudW0gaXB0X3JlamVjdF93aXRoIHsKKwlJUFRfSUNNUF9ORVRfVU5SRUFDSEFCTEUsCisJSVBUX0lDTVBfSE9TVF9VTlJFQUNIQUJMRSwKKwlJUFRfSUNNUF9QUk9UX1VOUkVBQ0hBQkxFLAorCUlQVF9JQ01QX1BPUlRfVU5SRUFDSEFCTEUsCisJSVBUX0lDTVBfRUNIT1JFUExZLAorCUlQVF9JQ01QX05FVF9QUk9ISUJJVEVELAorCUlQVF9JQ01QX0hPU1RfUFJPSElCSVRFRCwKKwlJUFRfVENQX1JFU0VULAorCUlQVF9JQ01QX0FETUlOX1BST0hJQklURUQKK307CisKK3N0cnVjdCBpcHRfcmVqZWN0X2luZm8geworCWVudW0gaXB0X3JlamVjdF93aXRoIHdpdGg7ICAgICAgLyogcmVqZWN0IHR5cGUgKi8KK307CisKKyNlbmRpZiAvKl9JUFRfUkVKRUNUX0gqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfU0FNRS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfU0FNRS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViY2E3ODIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9TQU1FLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfSVBUX1NBTUVfSAorI2RlZmluZSBfSVBUX1NBTUVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBJUFRfU0FNRV9NQVhfUkFOR0UJMTAKKworI2RlZmluZSBJUFRfU0FNRV9OT0RTVAkJMHgwMQorCitzdHJ1Y3QgaXB0X3NhbWVfaW5mbyB7CisJdW5zaWduZWQgY2hhciBpbmZvOworCV9fdTMyIHJhbmdlc2l6ZTsKKwlfX3UzMiBpcG51bTsKKwlfX3UzMiAqaXBhcnJheTsKKworCS8qIGhhbmdzIG9mZiBlbmQuICovCisJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZVtJUFRfU0FNRV9NQVhfUkFOR0VdOworfTsKKworI2VuZGlmIC8qX0lQVF9TQU1FX0gqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVFRMLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9UVEwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmFjMTY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVFRMLmgKQEAgLTAsMCArMSwyMyBAQAorLyogVFRMIG1vZGlmaWNhdGlvbiBtb2R1bGUgZm9yIElQIHRhYmxlcworICogKEMpIDIwMDAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+ICovCisKKyNpZm5kZWYgX0lQVF9UVExfSAorI2RlZmluZSBfSVBUX1RUTF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwlJUFRfVFRMX1NFVCA9IDAsCisJSVBUX1RUTF9JTkMsCisJSVBUX1RUTF9ERUMKK307CisKKyNkZWZpbmUgSVBUX1RUTF9NQVhNT0RFCUlQVF9UVExfREVDCisKK3N0cnVjdCBpcHRfVFRMX2luZm8geworCV9fdTgJbW9kZTsKKwlfX3U4CXR0bDsKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9VTE9HLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9VTE9HLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3YWFkMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1VMT0cuaApAQCAtMCwwICsxLDQ5IEBACisvKiBIZWFkZXIgZmlsZSBmb3IgSVAgdGFibGVzIHVzZXJzcGFjZSBsb2dnaW5nLCBWZXJzaW9uIDEuOAorICoKKyAqIChDKSAyMDAwLTIwMDIgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIAorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHUEwgKi8KKworI2lmbmRlZiBfSVBUX1VMT0dfSAorI2RlZmluZSBfSVBUX1VMT0dfSAorCisjaWZuZGVmIE5FVExJTktfTkZMT0cKKyNkZWZpbmUgTkVUTElOS19ORkxPRyAJNQorI2VuZGlmCisKKyNkZWZpbmUgVUxPR19ERUZBVUxUX05MR1JPVVAJMQorI2RlZmluZSBVTE9HX0RFRkFVTFRfUVRIUkVTSE9MRAkxCisKKyNkZWZpbmUgVUxPR19NQUNfTEVOCTgwCisjZGVmaW5lIFVMT0dfUFJFRklYX0xFTgkzMgorCisjZGVmaW5lIFVMT0dfTUFYX1FMRU4JNTAKKy8qIFdoeSA1MD8gV2VsbC4uLiB0aGVyZSBpcyBhIGxpbWl0IGltcG9zZWQgYnkgdGhlIHNsYWIgY2FjaGUgMTMxMDAwCisgKiBieXRlcy4gU28gdGhlIG11bHRpcGFydCBuZXRsaW5rLW1lc3NhZ2UgaGFzIHRvIGJlIDwgMTMxMDAwIGJ5dGVzLgorICogQXNzdW1pbmcgYSBzdGFuZGFyZCBldGhlcm5ldC1tdHUgb2YgMTUwMCwgd2UgY291bGQgZGVmaW5lIHRoaXMgdXAKKyAqIHRvIDgwLi4uIGJ1dCBldmVuIDUwIHNlZW1zIHRvIGJlIGJpZyBlbm91Z2guICovCisKKy8qIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGVhY2ggcnVsZSB3aXRoIGEgVUxPRyB0YXJnZXQgKi8KK3N0cnVjdCBpcHRfdWxvZ19pbmZvIHsKKwl1bnNpZ25lZCBpbnQgbmxfZ3JvdXA7CisJc2l6ZV90IGNvcHlfcmFuZ2U7CisJc2l6ZV90IHF0aHJlc2hvbGQ7CisJY2hhciBwcmVmaXhbVUxPR19QUkVGSVhfTEVOXTsKK307CisKKy8qIEZvcm1hdCBvZiB0aGUgVUxPRyBwYWNrZXRzIHBhc3NlZCB0aHJvdWdoIG5ldGxpbmsgKi8KK3R5cGVkZWYgc3RydWN0IHVsb2dfcGFja2V0X21zZyB7CisJdW5zaWduZWQgbG9uZyBtYXJrOworCWxvbmcgdGltZXN0YW1wX3NlYzsKKwlsb25nIHRpbWVzdGFtcF91c2VjOworCXVuc2lnbmVkIGludCBob29rOworCWNoYXIgaW5kZXZfbmFtZVtJRk5BTVNJWl07CisJY2hhciBvdXRkZXZfbmFtZVtJRk5BTVNJWl07CisJc2l6ZV90IGRhdGFfbGVuOworCWNoYXIgcHJlZml4W1VMT0dfUFJFRklYX0xFTl07CisJdW5zaWduZWQgY2hhciBtYWNfbGVuOworCXVuc2lnbmVkIGNoYXIgbWFjW1VMT0dfTUFDX0xFTl07CisJdW5zaWduZWQgY2hhciBwYXlsb2FkWzBdOworfSB1bG9nX3BhY2tldF9tc2dfdDsKKworI2VuZGlmIC8qX0lQVF9VTE9HX0gqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfYWRkcnR5cGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2FkZHJ0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRhNDIyMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2FkZHJ0eXBlLmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBfSVBUX0FERFJUWVBFX0gKKyNkZWZpbmUgX0lQVF9BRERSVFlQRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwlJUFRfQUREUlRZUEVfSU5WRVJUX1NPVVJDRQk9IDB4MDAwMSwKKwlJUFRfQUREUlRZUEVfSU5WRVJUX0RFU1QJPSAweDAwMDIsCisJSVBUX0FERFJUWVBFX0xJTUlUX0lGQUNFX0lOCT0gMHgwMDA0LAorCUlQVF9BRERSVFlQRV9MSU1JVF9JRkFDRV9PVVQJPSAweDAwMDgsCit9OworCitzdHJ1Y3QgaXB0X2FkZHJ0eXBlX2luZm9fdjEgeworCV9fdTE2CXNvdXJjZTsJCS8qIHNvdXJjZS10eXBlIG1hc2sgKi8KKwlfX3UxNglkZXN0OwkJLyogZGVzdC10eXBlIG1hc2sgKi8KKwlfX3UzMglmbGFnczsKK307CisKKy8qIHJldmlzaW9uIDAgKi8KK3N0cnVjdCBpcHRfYWRkcnR5cGVfaW5mbyB7CisJX191MTYJc291cmNlOwkJLyogc291cmNlLXR5cGUgbWFzayAqLworCV9fdTE2CWRlc3Q7CQkvKiBkZXN0LXR5cGUgbWFzayAqLworCV9fdTMyCWludmVydF9zb3VyY2U7CisJX191MzIJaW52ZXJ0X2Rlc3Q7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2FoLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9haC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDJiYjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9haC5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX0lQVF9BSF9ICisjZGVmaW5lIF9JUFRfQUhfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGlwdF9haCB7CisJX191MzIgc3Bpc1syXTsJCQkvKiBTZWN1cml0eSBQYXJhbWV0ZXIgSW5kZXggKi8KKwlfX3U4ICBpbnZmbGFnczsJCQkvKiBJbnZlcnNlIGZsYWdzICovCit9OworCisKKworLyogVmFsdWVzIGZvciAiaW52ZmxhZ3MiIGZpZWxkIGluIHN0cnVjdCBpcHRfYWguICovCisjZGVmaW5lIElQVF9BSF9JTlZfU1BJCQkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygc3BpLiAqLworI2RlZmluZSBJUFRfQUhfSU5WX01BU0sJMHgwMQkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisKKyNlbmRpZiAvKl9JUFRfQUhfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9lY24uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Vjbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYmY5NWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9lY24uaApAQCAtMCwwICsxLDM1IEBACisvKiBpcHRhYmxlcyBtb2R1bGUgZm9yIG1hdGNoaW5nIHRoZSBFQ04gaGVhZGVyIGluIElQdjQgYW5kIFRDUCBoZWFkZXIKKyAqCisgKiAoQykgMjAwMiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgR05VIEdQTCB2MiwgMTk5MQorICogCisgKiBpcHRfZWNuLmgsdiAxLjQgMjAwMi8wOC8wNSAxOTozOTowMCBsYWZvcmdlIEV4cAorKi8KKyNpZm5kZWYgX0lQVF9FQ05fSAorI2RlZmluZSBfSVBUX0VDTl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9kc2NwLmg+CisKKyNkZWZpbmUgSVBUX0VDTl9JUF9NQVNLCSh+WFRfRFNDUF9NQVNLKQorCisjZGVmaW5lIElQVF9FQ05fT1BfTUFUQ0hfSVAJMHgwMQorI2RlZmluZSBJUFRfRUNOX09QX01BVENIX0VDRQkweDEwCisjZGVmaW5lIElQVF9FQ05fT1BfTUFUQ0hfQ1dSCTB4MjAKKworI2RlZmluZSBJUFRfRUNOX09QX01BVENIX01BU0sJMHhjZQorCisvKiBtYXRjaCBpbmZvICovCitzdHJ1Y3QgaXB0X2Vjbl9pbmZvIHsKKwlfX3U4IG9wZXJhdGlvbjsKKwlfX3U4IGludmVydDsKKwlfX3U4IGlwX2VjdDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U4IGVjdDsKKwkJfSB0Y3A7CisJfSBwcm90bzsKK307CisKKyNlbmRpZiAvKiBfSVBUX0VDTl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWFsbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcmVhbG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzk5NmVhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcmVhbG0uaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX0lQVF9SRUFMTV9ICisjZGVmaW5lIF9JUFRfUkVBTE1fSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmg+CisjZGVmaW5lIGlwdF9yZWFsbV9pbmZvIHh0X3JlYWxtX2luZm8KKworI2VuZGlmIC8qIF9JUFRfUkVBTE1fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfdHRsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90dGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2JlZTQ0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfdHRsLmgKQEAgLTAsMCArMSwyMyBAQAorLyogSVAgdGFibGVzIG1vZHVsZSBmb3IgbWF0Y2hpbmcgdGhlIHZhbHVlIG9mIHRoZSBUVEwKKyAqIChDKSAyMDAwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+ICovCisKKyNpZm5kZWYgX0lQVF9UVExfSAorI2RlZmluZSBfSVBUX1RUTF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwlJUFRfVFRMX0VRID0gMCwJCS8qIGVxdWFscyAqLworCUlQVF9UVExfTkUsCQkvKiBub3QgZXF1YWxzICovCisJSVBUX1RUTF9MVCwJCS8qIGxlc3MgdGhhbiAqLworCUlQVF9UVExfR1QsCQkvKiBncmVhdGVyIHRoYW4gKi8KK307CisKKworc3RydWN0IGlwdF90dGxfaW5mbyB7CisJX191OAltb2RlOworCV9fdTgJdHRsOworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvbmZfbmF0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L25mX25hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhODYxZDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L25mX25hdC5oCkBAIC0wLDAgKzEsNTggQEAKKyNpZm5kZWYgX0xJTlVYX05GX05BVF9ICisjZGVmaW5lIF9MSU5VWF9ORl9OQVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBJUF9OQVRfUkFOR0VfTUFQX0lQUyAxCisjZGVmaW5lIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQgMgorI2RlZmluZSBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NIDQKKyNkZWZpbmUgSVBfTkFUX1JBTkdFX1BFUlNJU1RFTlQgOAorCisvKiBUaGUgcHJvdG9jb2wtc3BlY2lmaWMgbWFuaXB1bGFibGUgcGFydHMgb2YgdGhlIHR1cGxlLiAqLwordW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byB7CisJLyogQWRkIG90aGVyIHByb3RvY29scyBoZXJlLiAqLworCV9fYmUxNiBhbGw7CisKKwlzdHJ1Y3QgeworCQlfX2JlMTYgcG9ydDsKKwl9IHRjcDsKKwlzdHJ1Y3QgeworCQlfX2JlMTYgcG9ydDsKKwl9IHVkcDsKKwlzdHJ1Y3QgeworCQlfX2JlMTYgaWQ7CisJfSBpY21wOworCXN0cnVjdCB7CisJCV9fYmUxNiBwb3J0OworCX0gZGNjcDsKKwlzdHJ1Y3QgeworCQlfX2JlMTYgcG9ydDsKKwl9IHNjdHA7CisJc3RydWN0IHsKKwkJX19iZTE2IGtleTsJLyogR1JFIGtleSBpcyAzMmJpdCwgUFB0UCBvbmx5IHVzZXMgMTZiaXQgKi8KKwl9IGdyZTsKK307CisKKy8qIFNpbmdsZSByYW5nZSBzcGVjaWZpY2F0aW9uLiAqLworc3RydWN0IG5mX25hdF9yYW5nZSB7CisJLyogU2V0IHRvIE9SIG9mIGZsYWdzIGFib3ZlLiAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKworCS8qIEluY2x1c2l2ZTogbmV0d29yayBvcmRlci4gKi8KKwlfX2JlMzIgbWluX2lwLCBtYXhfaXA7CisKKwkvKiBJbmNsdXNpdmU6IG5ldHdvcmsgb3JkZXIgKi8KKwl1bmlvbiBuZl9jb25udHJhY2tfbWFuX3Byb3RvIG1pbiwgbWF4OworfTsKKworLyogRm9yIGJhY2t3YXJkcyBjb21wYXQ6IGRvbid0IHVzZSBpbiBtb2Rlcm4gY29kZS4gKi8KK3N0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0IHsKKwl1bnNpZ25lZCBpbnQgcmFuZ2VzaXplOyAvKiBNdXN0IGJlIDEuICovCisKKwkvKiBoYW5ncyBvZmYgZW5kLiAqLworCXN0cnVjdCBuZl9uYXRfcmFuZ2UgcmFuZ2VbMV07Cit9OworCisjZGVmaW5lIG5mX25hdF9tdWx0aV9yYW5nZSBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZWJkYTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2LmgKQEAgLTAsMCArMSw3NiBAQAorI2lmbmRlZiBfX0xJTlVYX0lQNl9ORVRGSUxURVJfSAorI2RlZmluZSBfX0xJTlVYX0lQNl9ORVRGSUxURVJfSAorCisvKiBJUHY2LXNwZWNpZmljIGRlZmluZXMgZm9yIG5ldGZpbHRlci4gCisgKiAoQykxOTk4IFJ1c3R5IFJ1c3NlbGwgLS0gVGhpcyBjb2RlIGlzIEdQTC4KKyAqIChDKTE5OTkgRGF2aWQgSmVmZmVyeQorICogICB0aGlzIGhlYWRlciB3YXMgYmxhdGFudGx5IHJpcHBlZCBmcm9tIG5ldGZpbHRlcl9pcHY0LmggCisgKiAgIGl0J3MgYW1hemluZyB3aGF0IGFkZGluZyBhIGJ1bmNoIG9mIDZzIGNhbiBkbyA9OF4pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorCisvKiBvbmx5IGZvciB1c2Vyc3BhY2UgY29tcGF0aWJpbGl0eSAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+IC8qIGZvciBJTlRfTUlOLCBJTlRfTUFYICovCisKKy8qIElQIENhY2hlIGJpdHMuICovCisvKiBTcmMgSVAgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTkZDX0lQNl9TUkMgICAgICAgICAgICAgIDB4MDAwMQorLyogRGVzdCBJUCBhZGRyZXNzLiAqLworI2RlZmluZSBORkNfSVA2X0RTVCAgICAgICAgICAgICAgMHgwMDAyCisvKiBJbnB1dCBkZXZpY2UuICovCisjZGVmaW5lIE5GQ19JUDZfSUZfSU4gICAgICAgICAgICAweDAwMDQKKy8qIE91dHB1dCBkZXZpY2UuICovCisjZGVmaW5lIE5GQ19JUDZfSUZfT1VUICAgICAgICAgICAweDAwMDgKKy8qIFRPUy4gKi8KKyNkZWZpbmUgTkZDX0lQNl9UT1MgICAgICAgICAgICAgIDB4MDAxMAorLyogUHJvdG9jb2wuICovCisjZGVmaW5lIE5GQ19JUDZfUFJPVE8gICAgICAgICAgICAweDAwMjAKKy8qIElQIG9wdGlvbnMuICovCisjZGVmaW5lIE5GQ19JUDZfT1BUSU9OUyAgICAgICAgICAweDAwNDAKKy8qIEZyYWcgJiBmbGFncy4gKi8KKyNkZWZpbmUgTkZDX0lQNl9GUkFHICAgICAgICAgICAgIDB4MDA4MAorCisKKy8qIFBlci1wcm90b2NvbCBpbmZvcm1hdGlvbjogb25seSBtYXR0ZXJzIGlmIHByb3RvIG1hdGNoLiAqLworLyogVENQIGZsYWdzLiAqLworI2RlZmluZSBORkNfSVA2X1RDUEZMQUdTICAgICAgICAgMHgwMTAwCisvKiBTb3VyY2UgcG9ydC4gKi8KKyNkZWZpbmUgTkZDX0lQNl9TUkNfUFQgICAgICAgICAgIDB4MDIwMAorLyogRGVzdCBwb3J0LiAqLworI2RlZmluZSBORkNfSVA2X0RTVF9QVCAgICAgICAgICAgMHgwNDAwCisvKiBTb21ldGhpbmcgZWxzZSBhYm91dCB0aGUgcHJvdG8gKi8KKyNkZWZpbmUgTkZDX0lQNl9QUk9UT19VTktOT1dOICAgIDB4MjAwMAorCisvKiBJUDYgSG9va3MgKi8KKy8qIEFmdGVyIHByb21pc2MgZHJvcHMsIGNoZWNrc3VtIGNoZWNrcy4gKi8KKyNkZWZpbmUgTkZfSVA2X1BSRV9ST1VUSU5HCTAKKy8qIElmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgZm9yIHRoaXMgYm94LiAqLworI2RlZmluZSBORl9JUDZfTE9DQUxfSU4JCTEKKy8qIElmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgZm9yIGFub3RoZXIgaW50ZXJmYWNlLiAqLworI2RlZmluZSBORl9JUDZfRk9SV0FSRAkJMgorLyogUGFja2V0cyBjb21pbmcgZnJvbSBhIGxvY2FsIHByb2Nlc3MuICovCisjZGVmaW5lIE5GX0lQNl9MT0NBTF9PVVQJCTMKKy8qIFBhY2tldHMgYWJvdXQgdG8gaGl0IHRoZSB3aXJlLiAqLworI2RlZmluZSBORl9JUDZfUE9TVF9ST1VUSU5HCTQKKyNkZWZpbmUgTkZfSVA2X05VTUhPT0tTCQk1CisKKworZW51bSBuZl9pcDZfaG9va19wcmlvcml0aWVzIHsKKwlORl9JUDZfUFJJX0ZJUlNUID0gSU5UX01JTiwKKwlORl9JUDZfUFJJX0NPTk5UUkFDS19ERUZSQUcgPSAtNDAwLAorCU5GX0lQNl9QUklfUkFXID0gLTMwMCwKKwlORl9JUDZfUFJJX1NFTElOVVhfRklSU1QgPSAtMjI1LAorCU5GX0lQNl9QUklfQ09OTlRSQUNLID0gLTIwMCwKKwlORl9JUDZfUFJJX01BTkdMRSA9IC0xNTAsCisJTkZfSVA2X1BSSV9OQVRfRFNUID0gLTEwMCwKKwlORl9JUDZfUFJJX0ZJTFRFUiA9IDAsCisJTkZfSVA2X1BSSV9TRUNVUklUWSA9IDUwLAorCU5GX0lQNl9QUklfTkFUX1NSQyA9IDEwMCwKKwlORl9JUDZfUFJJX1NFTElOVVhfTEFTVCA9IDIyNSwKKwlORl9JUDZfUFJJX0xBU1QgPSBJTlRfTUFYLAorfTsKKworCisjZW5kaWYgLypfX0xJTlVYX0lQNl9ORVRGSUxURVJfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzJkZDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaApAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIDI1LUp1bC0xOTk4IE1ham9yIGNoYW5nZXMgdG8gYWxsb3cgZm9yIGlwIGNoYWluIHRhYmxlCisgKgorICogMy1KYW4tMjAwMCBOYW1lZCB0YWJsZXMgdG8gYWxsb3cgcGFja2V0IHNlbGVjdGlvbiBmb3IgZGlmZmVyZW50IHVzZXMuCisgKi8KKworLyoKKyAqIAlGb3JtYXQgb2YgYW4gSVA2IGZpcmV3YWxsIGRlc2NyaXB0b3IKKyAqCisgKiAJc3JjLCBkc3QsIHNyY19tYXNrLCBkc3RfbWFzayBhcmUgYWx3YXlzIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKiAJZmxhZ3MgYXJlIHN0b3JlZCBpbiBob3N0IGJ5dGUgb3JkZXIgKG9mIGNvdXJzZSkuCisgKiAJUG9ydCBudW1iZXJzIGFyZSBzdG9yZWQgaW4gSE9TVCBieXRlIG9yZGVyLgorICovCisKKyNpZm5kZWYgX0lQNl9UQUJMRVNfSAorI2RlZmluZSBfSVA2X1RBQkxFU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorCisjZGVmaW5lIElQNlRfRlVOQ1RJT05fTUFYTkFNRUxFTiBYVF9GVU5DVElPTl9NQVhOQU1FTEVOCisjZGVmaW5lIElQNlRfVEFCTEVfTUFYTkFNRUxFTiBYVF9UQUJMRV9NQVhOQU1FTEVOCisjZGVmaW5lIGlwNnRfbWF0Y2ggeHRfbWF0Y2gKKyNkZWZpbmUgaXA2dF90YXJnZXQgeHRfdGFyZ2V0CisjZGVmaW5lIGlwNnRfdGFibGUgeHRfdGFibGUKKyNkZWZpbmUgaXA2dF9nZXRfcmV2aXNpb24geHRfZ2V0X3JldmlzaW9uCisjZGVmaW5lIGlwNnRfZW50cnlfbWF0Y2ggeHRfZW50cnlfbWF0Y2gKKyNkZWZpbmUgaXA2dF9lbnRyeV90YXJnZXQgeHRfZW50cnlfdGFyZ2V0CisjZGVmaW5lIGlwNnRfc3RhbmRhcmRfdGFyZ2V0IHh0X3N0YW5kYXJkX3RhcmdldAorI2RlZmluZSBpcDZ0X2Vycm9yX3RhcmdldCB4dF9lcnJvcl90YXJnZXQKKyNkZWZpbmUgaXA2dF9jb3VudGVycyB4dF9jb3VudGVycworI2RlZmluZSBJUDZUX0NPTlRJTlVFIFhUX0NPTlRJTlVFCisjZGVmaW5lIElQNlRfUkVUVVJOIFhUX1JFVFVSTgorCisvKiBQcmUtaXB0YWJsZXMtMS40LjAgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmg+CisjZGVmaW5lIGlwNnRfdGNwIHh0X3RjcAorI2RlZmluZSBpcDZ0X3VkcCB4dF91ZHAKKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX1NSQ1BUCVhUX1RDUF9JTlZfU1JDUFQKKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX0RTVFBUCVhUX1RDUF9JTlZfRFNUUFQKKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX0ZMQUdTCVhUX1RDUF9JTlZfRkxBR1MKKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX09QVElPTglYVF9UQ1BfSU5WX09QVElPTgorI2RlZmluZSBJUDZUX1RDUF9JTlZfTUFTSwlYVF9UQ1BfSU5WX01BU0sKKyNkZWZpbmUgSVA2VF9VRFBfSU5WX1NSQ1BUCVhUX1VEUF9JTlZfU1JDUFQKKyNkZWZpbmUgSVA2VF9VRFBfSU5WX0RTVFBUCVhUX1VEUF9JTlZfRFNUUFQKKyNkZWZpbmUgSVA2VF9VRFBfSU5WX01BU0sJWFRfVURQX0lOVl9NQVNLCisKKyNkZWZpbmUgaXA2dF9jb3VudGVyc19pbmZvIHh0X2NvdW50ZXJzX2luZm8KKyNkZWZpbmUgSVA2VF9TVEFOREFSRF9UQVJHRVQgWFRfU1RBTkRBUkRfVEFSR0VUCisjZGVmaW5lIElQNlRfRVJST1JfVEFSR0VUIFhUX0VSUk9SX1RBUkdFVAorI2RlZmluZSBJUDZUX01BVENIX0lURVJBVEUoZSwgZm4sIGFyZ3MuLi4pIFwKKwlYVF9NQVRDSF9JVEVSQVRFKHN0cnVjdCBpcDZ0X2VudHJ5LCBlLCBmbiwgIyMgYXJncykKKyNkZWZpbmUgSVA2VF9FTlRSWV9JVEVSQVRFKGVudHJpZXMsIHNpemUsIGZuLCBhcmdzLi4uKSBcCisJWFRfRU5UUllfSVRFUkFURShzdHJ1Y3QgaXA2dF9lbnRyeSwgZW50cmllcywgc2l6ZSwgZm4sICMjIGFyZ3MpCisKKy8qIFllcywgVmlyZ2luaWEsIHlvdSBoYXZlIHRvIHplcm8gdGhlIHBhZGRpbmcuICovCitzdHJ1Y3QgaXA2dF9pcDYgeworCS8qIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gSVA2IGFkZHIgKi8KKwlzdHJ1Y3QgaW42X2FkZHIgc3JjLCBkc3Q7CQkKKwkvKiBNYXNrIGZvciBzcmMgYW5kIGRlc3QgSVA2IGFkZHIgKi8KKwlzdHJ1Y3QgaW42X2FkZHIgc21zaywgZG1zazsKKwljaGFyIGluaWZhY2VbSUZOQU1TSVpdLCBvdXRpZmFjZVtJRk5BTVNJWl07CisJdW5zaWduZWQgY2hhciBpbmlmYWNlX21hc2tbSUZOQU1TSVpdLCBvdXRpZmFjZV9tYXNrW0lGTkFNU0laXTsKKworCS8qIFVwcGVyIHByb3RvY29sIG51bWJlcgorCSAqIC0gVGhlIGFsbG93ZWQgdmFsdWUgaXMgMCAoYW55KSBvciBwcm90b2NvbCBudW1iZXIgb2YgbGFzdCBwYXJzYWJsZQorCSAqICAgaGVhZGVyLCB3aGljaCBpcyA1MCAoRVNQKSwgNTkgKE5vIE5leHQgSGVhZGVyKSwgMTM1IChNSCksIG9yCisJICogICB0aGUgbm9uIElQdjYgZXh0ZW5zaW9uIGhlYWRlcnMuCisJICogLSBUaGUgcHJvdG9jb2wgbnVtYmVycyBvZiBJUHY2IGV4dGVuc2lvbiBoZWFkZXJzIGV4Y2VwdCBvZiBFU1AgYW5kCisJICogICBNSCBkbyBub3QgbWF0Y2ggYW55IHBhY2tldHMuCisJICogLSBZb3UgYWxzbyBuZWVkIHRvIHNldCBJUDZUX0ZMQUdTX1BST1RPIHRvICJmbGFncyIgdG8gY2hlY2sgcHJvdG9jb2wuCisJICovCisJX191MTYgcHJvdG87CisJLyogVE9TIHRvIG1hdGNoIGlmZiBmbGFncyAmIElQNlRfRl9UT1MgKi8KKwlfX3U4IHRvczsKKworCS8qIEZsYWdzIHdvcmQgKi8KKwlfX3U4IGZsYWdzOworCS8qIEludmVyc2UgZmxhZ3MgKi8KKwlfX3U4IGludmZsYWdzOworfTsKKworLyogVmFsdWVzIGZvciAiZmxhZyIgZmllbGQgaW4gc3RydWN0IGlwNnRfaXA2IChnZW5lcmFsIGlwNiBzdHJ1Y3R1cmUpLiAqLworI2RlZmluZSBJUDZUX0ZfUFJPVE8JCTB4MDEJLyogU2V0IGlmIHJ1bGUgY2FyZXMgYWJvdXQgdXBwZXIgCisJCQkJCSAgIHByb3RvY29scyAqLworI2RlZmluZSBJUDZUX0ZfVE9TCQkweDAyCS8qIE1hdGNoIHRoZSBUT1MuICovCisjZGVmaW5lIElQNlRfRl9HT1RPCQkweDA0CS8qIFNldCBpZiBqdW1wIGlzIGEgZ290byAqLworI2RlZmluZSBJUDZUX0ZfTUFTSwkJMHgwNwkvKiBBbGwgcG9zc2libGUgZmxhZyBiaXRzIG1hc2suICovCisKKy8qIFZhbHVlcyBmb3IgImludiIgZmllbGQgaW4gc3RydWN0IGlwNnRfaXA2LiAqLworI2RlZmluZSBJUDZUX0lOVl9WSUFfSU4JCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBJTiBJRkFDRS4gKi8KKyNkZWZpbmUgSVA2VF9JTlZfVklBX09VVAkJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIE9VVCBJRkFDRSAqLworI2RlZmluZSBJUDZUX0lOVl9UT1MJCTB4MDQJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBUT1MuICovCisjZGVmaW5lIElQNlRfSU5WX1NSQ0lQCQkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgU1JDIElQLiAqLworI2RlZmluZSBJUDZUX0lOVl9EU1RJUAkJMHgxMAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIERTVCBPUC4gKi8KKyNkZWZpbmUgSVA2VF9JTlZfRlJBRwkJMHgyMAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIEZSQUcuICovCisjZGVmaW5lIElQNlRfSU5WX1BST1RPCQlYVF9JTlZfUFJPVE8KKyNkZWZpbmUgSVA2VF9JTlZfTUFTSwkJMHg3RgkvKiBBbGwgcG9zc2libGUgZmxhZyBiaXRzIG1hc2suICovCisKKy8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgZWFjaCBvZiB0aGUgZmlyZXdhbGwgcnVsZXMuICBDb25zaXN0cyBvZiAzCisgICBwYXJ0cyB3aGljaCBhcmUgMSkgZ2VuZXJhbCBJUCBoZWFkZXIgc3R1ZmYgMikgbWF0Y2ggc3BlY2lmaWMKKyAgIHN0dWZmIDMpIHRoZSB0YXJnZXQgdG8gcGVyZm9ybSBpZiB0aGUgcnVsZSBtYXRjaGVzICovCitzdHJ1Y3QgaXA2dF9lbnRyeSB7CisJc3RydWN0IGlwNnRfaXA2IGlwdjY7CisKKwkvKiBNYXJrIHdpdGggZmllbGRzIHRoYXQgd2UgY2FyZSBhYm91dC4gKi8KKwl1bnNpZ25lZCBpbnQgbmZjYWNoZTsKKworCS8qIFNpemUgb2YgaXB0X2VudHJ5ICsgbWF0Y2hlcyAqLworCV9fdTE2IHRhcmdldF9vZmZzZXQ7CisJLyogU2l6ZSBvZiBpcHRfZW50cnkgKyBtYXRjaGVzICsgdGFyZ2V0ICovCisJX191MTYgbmV4dF9vZmZzZXQ7CisKKwkvKiBCYWNrIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQgY29tZWZyb207CisKKwkvKiBQYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMuICovCisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzOworCisJLyogVGhlIG1hdGNoZXMgKGlmIGFueSksIHRoZW4gdGhlIHRhcmdldC4gKi8KKwl1bnNpZ25lZCBjaGFyIGVsZW1zWzBdOworfTsKKworLyogU3RhbmRhcmQgZW50cnkgKi8KK3N0cnVjdCBpcDZ0X3N0YW5kYXJkIHsKKwlzdHJ1Y3QgaXA2dF9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgeHRfc3RhbmRhcmRfdGFyZ2V0IHRhcmdldDsKK307CisKK3N0cnVjdCBpcDZ0X2Vycm9yIHsKKwlzdHJ1Y3QgaXA2dF9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgeHRfZXJyb3JfdGFyZ2V0IHRhcmdldDsKK307CisKKyNkZWZpbmUgSVA2VF9FTlRSWV9JTklUKF9fc2l6ZSkJCQkJCQkgICAgICAgXAorewkJCQkJCQkJCSAgICAgICBcCisJLnRhcmdldF9vZmZzZXQJPSBzaXplb2Yoc3RydWN0IGlwNnRfZW50cnkpLAkJCSAgICAgICBcCisJLm5leHRfb2Zmc2V0CT0gKF9fc2l6ZSksCQkJCQkgICAgICAgXAorfQorCisjZGVmaW5lIElQNlRfU1RBTkRBUkRfSU5JVChfX3ZlcmRpY3QpCQkJCQkgICAgICAgXAorewkJCQkJCQkJCSAgICAgICBcCisJLmVudHJ5CQk9IElQNlRfRU5UUllfSU5JVChzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpKSwgICAgICAgXAorCS50YXJnZXQJCT0gWFRfVEFSR0VUX0lOSVQoWFRfU1RBTkRBUkRfVEFSR0VULAkJICAgICAgIFwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgeHRfc3RhbmRhcmRfdGFyZ2V0KSksICAgXAorCS50YXJnZXQudmVyZGljdAk9IC0oX192ZXJkaWN0KSAtIDEsCQkJCSAgICAgICBcCit9CisKKyNkZWZpbmUgSVA2VF9FUlJPUl9JTklUCQkJCQkJCSAgICAgICBcCit7CQkJCQkJCQkJICAgICAgIFwKKwkuZW50cnkJCT0gSVA2VF9FTlRSWV9JTklUKHNpemVvZihzdHJ1Y3QgaXA2dF9lcnJvcikpLAkgICAgICAgXAorCS50YXJnZXQJCT0gWFRfVEFSR0VUX0lOSVQoWFRfRVJST1JfVEFSR0VULAkJICAgICAgIFwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgeHRfZXJyb3JfdGFyZ2V0KSksICAgICAgXAorCS50YXJnZXQuZXJyb3JuYW1lID0gIkVSUk9SIiwJCQkJCSAgICAgICBcCit9CisKKy8qCisgKiBOZXcgSVAgZmlyZXdhbGwgb3B0aW9ucyBmb3IgW2dzXWV0c29ja29wdCBhdCB0aGUgUkFXIElQIGxldmVsLgorICogVW5saWtlIEJTRCBMaW51eCBpbmhlcml0cyBJUCBvcHRpb25zIHNvIHlvdSBkb24ndCBoYXZlIHRvIHVzZQorICogYSByYXcgc29ja2V0IGZvciB0aGlzLiBJbnN0ZWFkIHdlIGNoZWNrIHJpZ2h0cyBpbiB0aGUgY2FsbHMuCisgKgorICogQVRURU5USU9OOiBjaGVjayBsaW51eC9pbjYuaCBiZWZvcmUgYWRkaW5nIG5ldyBudW1iZXIgaGVyZS4KKyAqLworI2RlZmluZSBJUDZUX0JBU0VfQ1RMCQkJNjQKKworI2RlZmluZSBJUDZUX1NPX1NFVF9SRVBMQUNFCQkoSVA2VF9CQVNFX0NUTCkKKyNkZWZpbmUgSVA2VF9TT19TRVRfQUREX0NPVU5URVJTCShJUDZUX0JBU0VfQ1RMICsgMSkKKyNkZWZpbmUgSVA2VF9TT19TRVRfTUFYCQkJSVA2VF9TT19TRVRfQUREX0NPVU5URVJTCisKKyNkZWZpbmUgSVA2VF9TT19HRVRfSU5GTwkJKElQNlRfQkFTRV9DVEwpCisjZGVmaW5lIElQNlRfU09fR0VUX0VOVFJJRVMJCShJUDZUX0JBU0VfQ1RMICsgMSkKKyNkZWZpbmUgSVA2VF9TT19HRVRfUkVWSVNJT05fTUFUQ0gJKElQNlRfQkFTRV9DVEwgKyA0KQorI2RlZmluZSBJUDZUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJKElQNlRfQkFTRV9DVEwgKyA1KQorI2RlZmluZSBJUDZUX1NPX0dFVF9NQVgJCQlJUDZUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQKKworLyogSUNNUCBtYXRjaGluZyBzdHVmZiAqLworc3RydWN0IGlwNnRfaWNtcCB7CisJX191OCB0eXBlOwkJCQkvKiB0eXBlIHRvIG1hdGNoICovCisJX191OCBjb2RlWzJdOwkJCQkvKiByYW5nZSBvZiBjb2RlICovCisJX191OCBpbnZmbGFnczsJCQkJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworLyogVmFsdWVzIGZvciAiaW52IiBmaWVsZCBmb3Igc3RydWN0IGlwdF9pY21wLiAqLworI2RlZmluZSBJUDZUX0lDTVBfSU5WCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiB0eXBlL2NvZGUgdGVzdCAqLworCisvKiBUaGUgYXJndW1lbnQgdG8gSVA2VF9TT19HRVRfSU5GTyAqLworc3RydWN0IGlwNnRfZ2V0aW5mbyB7CisJLyogV2hpY2ggdGFibGU6IGNhbGxlciBmaWxscyB0aGlzIGluLiAqLworCWNoYXIgbmFtZVtYVF9UQUJMRV9NQVhOQU1FTEVOXTsKKworCS8qIEtlcm5lbCBmaWxscyB0aGVzZSBpbi4gKi8KKwkvKiBXaGljaCBob29rIGVudHJ5IHBvaW50cyBhcmUgdmFsaWQ6IGJpdG1hc2sgKi8KKwl1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3M7CisKKwkvKiBIb29rIGVudHJ5IHBvaW50czogb25lIHBlciBuZXRmaWx0ZXIgaG9vay4gKi8KKwl1bnNpZ25lZCBpbnQgaG9va19lbnRyeVtORl9JTkVUX05VTUhPT0tTXTsKKworCS8qIFVuZGVyZmxvdyBwb2ludHMuICovCisJdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9JTkVUX05VTUhPT0tTXTsKKworCS8qIE51bWJlciBvZiBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOworCisJLyogU2l6ZSBvZiBlbnRyaWVzLiAqLworCXVuc2lnbmVkIGludCBzaXplOworfTsKKworLyogVGhlIGFyZ3VtZW50IHRvIElQNlRfU09fU0VUX1JFUExBQ0UuICovCitzdHJ1Y3QgaXA2dF9yZXBsYWNlIHsKKwkvKiBXaGljaCB0YWJsZS4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBXaGljaCBob29rIGVudHJ5IHBvaW50cyBhcmUgdmFsaWQ6IGJpdG1hc2suICBZb3UgY2FuJ3QKKyAgICAgICAgICAgY2hhbmdlIHRoaXMuICovCisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCisJLyogTnVtYmVyIG9mIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7CisKKwkvKiBUb3RhbCBzaXplIG9mIG5ldyBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IHNpemU7CisKKwkvKiBIb29rIGVudHJ5IHBvaW50cy4gKi8KKwl1bnNpZ25lZCBpbnQgaG9va19lbnRyeVtORl9JTkVUX05VTUhPT0tTXTsKKworCS8qIFVuZGVyZmxvdyBwb2ludHMuICovCisJdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9JTkVUX05VTUhPT0tTXTsKKworCS8qIEluZm9ybWF0aW9uIGFib3V0IG9sZCBlbnRyaWVzOiAqLworCS8qIE51bWJlciBvZiBjb3VudGVycyAobXVzdCBiZSBlcXVhbCB0byBjdXJyZW50IG51bWJlciBvZiBlbnRyaWVzKS4gKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOworCS8qIFRoZSBvbGQgZW50cmllcycgY291bnRlcnMuICovCisJc3RydWN0IHh0X2NvdW50ZXJzICpjb3VudGVyczsKKworCS8qIFRoZSBlbnRyaWVzIChoYW5nIG9mZiBlbmQ6IG5vdCByZWFsbHkgYW4gYXJyYXkpLiAqLworCXN0cnVjdCBpcDZ0X2VudHJ5IGVudHJpZXNbMF07Cit9OworCisvKiBUaGUgYXJndW1lbnQgdG8gSVA2VF9TT19HRVRfRU5UUklFUy4gKi8KK3N0cnVjdCBpcDZ0X2dldF9lbnRyaWVzIHsKKwkvKiBXaGljaCB0YWJsZTogdXNlciBmaWxscyB0aGlzIGluLiAqLworCWNoYXIgbmFtZVtYVF9UQUJMRV9NQVhOQU1FTEVOXTsKKworCS8qIFVzZXIgZmlsbHMgdGhpcyBpbjogdG90YWwgZW50cnkgc2l6ZS4gKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCS8qIFRoZSBlbnRyaWVzLiAqLworCXN0cnVjdCBpcDZ0X2VudHJ5IGVudHJ5dGFibGVbMF07Cit9OworCisvKiBIZWxwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgeHRfZW50cnlfdGFyZ2V0ICoKK2lwNnRfZ2V0X3RhcmdldChzdHJ1Y3QgaXA2dF9lbnRyeSAqZSkKK3sKKwlyZXR1cm4gKHZvaWQgKillICsgZS0+dGFyZ2V0X29mZnNldDsKK30KKworLyoKKyAqCU1haW4gZmlyZXdhbGwgY2hhaW5zIGRlZmluaXRpb25zIGFuZCBnbG9iYWwgdmFyJ3MgZGVmaW5pdGlvbnMuCisgKi8KKworI2VuZGlmIC8qIF9JUDZfVEFCTEVTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9ITC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X0hMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkOGVhZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9ITC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIEhvcCBMaW1pdCBtb2RpZmljYXRpb24gbW9kdWxlIGZvciBpcDZ0YWJsZXMKKyAqIE1hY2llaiBTb2x0eXNpYWsgPHNvbHRAZG5zLnRveGljZmlsbXMudHY+CisgKiBCYXNlZCBvbiBIVydzIFRUTCBtb2R1bGUgKi8KKworI2lmbmRlZiBfSVA2VF9ITF9ICisjZGVmaW5lIF9JUDZUX0hMX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geworCUlQNlRfSExfU0VUID0gMCwKKwlJUDZUX0hMX0lOQywKKwlJUDZUX0hMX0RFQworfTsKKworI2RlZmluZSBJUDZUX0hMX01BWE1PREUJSVA2VF9ITF9ERUMKKworc3RydWN0IGlwNnRfSExfaW5mbyB7CisJX191OAltb2RlOworCV9fdTgJaG9wX2xpbWl0OworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9MT0cuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9MT0cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQ1NTc5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X0xPRy5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0lQNlRfTE9HX0gKKyNkZWZpbmUgX0lQNlRfTE9HX0gKKworLyogbWFrZSBzdXJlIG5vdCB0byBjaGFuZ2UgdGhpcyB3aXRob3V0IGNoYW5naW5nIG5ldGZpbHRlci5oOk5GX0xPR18qICghKSAqLworI2RlZmluZSBJUDZUX0xPR19UQ1BTRVEJCTB4MDEJLyogTG9nIFRDUCBzZXF1ZW5jZSBudW1iZXJzICovCisjZGVmaW5lIElQNlRfTE9HX1RDUE9QVAkJMHgwMgkvKiBMb2cgVENQIG9wdGlvbnMgKi8KKyNkZWZpbmUgSVA2VF9MT0dfSVBPUFQJCTB4MDQJLyogTG9nIElQIG9wdGlvbnMgKi8KKyNkZWZpbmUgSVA2VF9MT0dfVUlECQkweDA4CS8qIExvZyBVSUQgb3duaW5nIGxvY2FsIHNvY2tldCAqLworI2RlZmluZSBJUDZUX0xPR19ORkxPRwkJMHgxMAkvKiBVbnN1cHBvcnRlZCwgZG9uJ3QgdXNlICovCisjZGVmaW5lIElQNlRfTE9HX01BQ0RFQ09ERQkweDIwCS8qIERlY29kZSBNQUMgaGVhZGVyICovCisjZGVmaW5lIElQNlRfTE9HX01BU0sJCTB4MmYKKworc3RydWN0IGlwNnRfbG9nX2luZm8geworCXVuc2lnbmVkIGNoYXIgbGV2ZWw7CisJdW5zaWduZWQgY2hhciBsb2dmbGFnczsKKwljaGFyIHByZWZpeFszMF07Cit9OworCisjZW5kaWYgLypfSVBUX0xPR19IKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9SRUpFQ1QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9SRUpFQ1QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDVlZDYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X1JFSkVDVC5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX0lQNlRfUkVKRUNUX0gKKyNkZWZpbmUgX0lQNlRfUkVKRUNUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0gaXA2dF9yZWplY3Rfd2l0aCB7CisJSVA2VF9JQ01QNl9OT19ST1VURSwKKwlJUDZUX0lDTVA2X0FETV9QUk9ISUJJVEVELAorCUlQNlRfSUNNUDZfTk9UX05FSUdIQk9VUiwKKwlJUDZUX0lDTVA2X0FERFJfVU5SRUFDSCwKKwlJUDZUX0lDTVA2X1BPUlRfVU5SRUFDSCwKKwlJUDZUX0lDTVA2X0VDSE9SRVBMWSwKKwlJUDZUX1RDUF9SRVNFVAorfTsKKworc3RydWN0IGlwNnRfcmVqZWN0X2luZm8geworCV9fdTMyCXdpdGg7CS8qIHJlamVjdCB0eXBlICovCit9OworCisjZW5kaWYgLypfSVA2VF9SRUpFQ1RfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfYWguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9haC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYTJiNjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfYWguaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9JUDZUX0FIX0gKKyNkZWZpbmUgX0lQNlRfQUhfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGlwNnRfYWggeworCV9fdTMyIHNwaXNbMl07CQkJLyogU2VjdXJpdHkgUGFyYW1ldGVyIEluZGV4ICovCisJX191MzIgaGRybGVuOwkJCS8qIEhlYWRlciBMZW5ndGggKi8KKwlfX3U4ICBoZHJyZXM7CQkJLyogVGVzdCBvZiB0aGUgUmVzZXJ2ZWQgRmlsZWQgKi8KKwlfX3U4ICBpbnZmbGFnczsJCQkvKiBJbnZlcnNlIGZsYWdzICovCit9OworCisjZGVmaW5lIElQNlRfQUhfU1BJIDB4MDEKKyNkZWZpbmUgSVA2VF9BSF9MRU4gMHgwMgorI2RlZmluZSBJUDZUX0FIX1JFUyAweDA0CisKKy8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXA2dF9haC4gKi8KKyNkZWZpbmUgSVA2VF9BSF9JTlZfU1BJCQkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygc3BpLiAqLworI2RlZmluZSBJUDZUX0FIX0lOVl9MRU4JCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBsZW5ndGguICovCisjZGVmaW5lIElQNlRfQUhfSU5WX01BU0sJMHgwMwkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisKKyNlbmRpZiAvKl9JUDZUX0FIX0gqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2ZyYWcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9mcmFnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3ZjYxYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9mcmFnLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfSVA2VF9GUkFHX0gKKyNkZWZpbmUgX0lQNlRfRlJBR19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgaXA2dF9mcmFnIHsKKwlfX3UzMiBpZHNbMl07CQkJLyogU2VjdXJpdHkgUGFyYW1ldGVyIEluZGV4ICovCisJX191MzIgaGRybGVuOwkJCS8qIEhlYWRlciBMZW5ndGggKi8KKwlfX3U4ICBmbGFnczsJCQkvKiAgKi8KKwlfX3U4ICBpbnZmbGFnczsJCQkvKiBJbnZlcnNlIGZsYWdzICovCit9OworCisjZGVmaW5lIElQNlRfRlJBR19JRFMgCQkweDAxCisjZGVmaW5lIElQNlRfRlJBR19MRU4gCQkweDAyCisjZGVmaW5lIElQNlRfRlJBR19SRVMgCQkweDA0CisjZGVmaW5lIElQNlRfRlJBR19GU1QgCQkweDA4CisjZGVmaW5lIElQNlRfRlJBR19NRiAgCQkweDEwCisjZGVmaW5lIElQNlRfRlJBR19OTUYgIAkJMHgyMAorCisvKiBWYWx1ZXMgZm9yICJpbnZmbGFncyIgZmllbGQgaW4gc3RydWN0IGlwNnRfZnJhZy4gKi8KKyNkZWZpbmUgSVA2VF9GUkFHX0lOVl9JRFMJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGlkcy4gKi8KKyNkZWZpbmUgSVA2VF9GUkFHX0lOVl9MRU4JMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGxlbmd0aC4gKi8KKyNkZWZpbmUgSVA2VF9GUkFHX0lOVl9NQVNLCTB4MDMJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLworCisjZW5kaWYgLypfSVA2VF9GUkFHX0gqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2hsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfaGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTc2ZGJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2hsLmgKQEAgLTAsMCArMSwyNCBAQAorLyogaXA2dGFibGVzIG1vZHVsZSBmb3IgbWF0Y2hpbmcgdGhlIEhvcCBMaW1pdCB2YWx1ZQorICogTWFjaWVqIFNvbHR5c2lhayA8c29sdEBkbnMudG94aWNmaWxtcy50dj4KKyAqIEJhc2VkIG9uIEhXJ3MgdHRsIG1vZHVsZSAqLworCisjaWZuZGVmIF9JUDZUX0hMX0gKKyNkZWZpbmUgX0lQNlRfSExfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB7CisJSVA2VF9ITF9FUSA9IDAsCQkvKiBlcXVhbHMgKi8KKwlJUDZUX0hMX05FLAkJLyogbm90IGVxdWFscyAqLworCUlQNlRfSExfTFQsCQkvKiBsZXNzIHRoYW4gKi8KKwlJUDZUX0hMX0dULAkJLyogZ3JlYXRlciB0aGFuICovCit9OworCisKK3N0cnVjdCBpcDZ0X2hsX2luZm8geworCV9fdTgJbW9kZTsKKwlfX3U4CWhvcF9saW1pdDsKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfaXB2NmhlYWRlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2lwdjZoZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmFlM2EyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2lwdjZoZWFkZXIuaApAQCAtMCwwICsxLDI4IEBACisvKiBpcHY2aGVhZGVyIG1hdGNoIC0gbWF0Y2hlcyBJUHY2IHBhY2tldHMgYmFzZWQKK29uIHdoZXRoZXIgdGhleSBjb250YWluIGNlcnRhaW4gaGVhZGVycyAqLworCisvKiBPcmlnaW5hbCBpZGVhOiBCcmFkIENoYXBtYW4gCisgKiBSZXdyaXR0ZW4gYnk6IEFuZHJhcyBLaXMtU3phYm8gPGtpc3phQHNjaC5ibWUuaHU+ICovCisKKworI2lmbmRlZiBfX0lQVjZIRUFERVJfSAorI2RlZmluZSBfX0lQVjZIRUFERVJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGlwNnRfaXB2NmhlYWRlcl9pbmZvIHsKKwlfX3U4IG1hdGNoZmxhZ3M7CisJX191OCBpbnZmbGFnczsKKwlfX3U4IG1vZGVmbGFnOworfTsKKworI2RlZmluZSBNQVNLX0hPUE9QVFMgICAgMTI4CisjZGVmaW5lIE1BU0tfRFNUT1BUUyAgICA2NAorI2RlZmluZSBNQVNLX1JPVVRJTkcgICAgMzIKKyNkZWZpbmUgTUFTS19GUkFHTUVOVCAgIDE2CisjZGVmaW5lIE1BU0tfQUggICAgICAgICA4CisjZGVmaW5lIE1BU0tfRVNQICAgICAgICA0CisjZGVmaW5lIE1BU0tfTk9ORSAgICAgICAyCisjZGVmaW5lIE1BU0tfUFJPVE8gICAgICAxCisKKyNlbmRpZiAvKiBfX0lQVjZIRUFERVJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21oLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzcyOWE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21oLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfSVA2VF9NSF9ICisjZGVmaW5lIF9JUDZUX01IX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIE1IIG1hdGNoaW5nIHN0dWZmICovCitzdHJ1Y3QgaXA2dF9taCB7CisJX191OCB0eXBlc1syXTsJLyogTUggdHlwZSByYW5nZSAqLworCV9fdTggaW52ZmxhZ3M7CS8qIEludmVyc2UgZmxhZ3MgKi8KK307CisKKy8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXA2dF9taC4gKi8KKyNkZWZpbmUgSVA2VF9NSF9JTlZfVFlQRQkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgdHlwZS4gKi8KKyNkZWZpbmUgSVA2VF9NSF9JTlZfTUFTSwkweDAxCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworI2VuZGlmIC8qX0lQNlRfTUhfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfb3B0cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X29wdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Q0MTlhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X29wdHMuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9JUDZUX09QVFNfSAorI2RlZmluZSBfSVA2VF9PUFRTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgSVA2VF9PUFRTX09QVFNOUiAxNgorCitzdHJ1Y3QgaXA2dF9vcHRzIHsKKwlfX3UzMiBoZHJsZW47CQkJLyogSGVhZGVyIExlbmd0aCAqLworCV9fdTggZmxhZ3M7CQkJCS8qICAqLworCV9fdTggaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworCV9fdTE2IG9wdHNbSVA2VF9PUFRTX09QVFNOUl07CS8qIG9wdHMgKi8KKwlfX3U4IG9wdHNucjsJCQkvKiBOciBvZiBPUHRzICovCit9OworCisjZGVmaW5lIElQNlRfT1BUU19MRU4gCQkweDAxCisjZGVmaW5lIElQNlRfT1BUU19PUFRTIAkJMHgwMgorI2RlZmluZSBJUDZUX09QVFNfTlNUUklDVAkweDA0CisKKy8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXA2dF9ydC4gKi8KKyNkZWZpbmUgSVA2VF9PUFRTX0lOVl9MRU4JMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGxlbmd0aC4gKi8KKyNkZWZpbmUgSVA2VF9PUFRTX0lOVl9NQVNLCTB4MDEJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLworCisjZW5kaWYgLypfSVA2VF9PUFRTX0gqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X3J0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA1YTVmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X3J0LmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBfSVA2VF9SVF9ICisjZGVmaW5lIF9JUDZUX1JUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisvKiNpbmNsdWRlIDxsaW51eC9pbjYuaD4qLworCisjZGVmaW5lIElQNlRfUlRfSE9QUyAxNgorCitzdHJ1Y3QgaXA2dF9ydCB7CisJX191MzIgcnRfdHlwZTsJCQkvKiBSb3V0aW5nIFR5cGUgKi8KKwlfX3UzMiBzZWdzbGVmdFsyXTsJCQkvKiBTZWdtZW50cyBMZWZ0ICovCisJX191MzIgaGRybGVuOwkJCS8qIEhlYWRlciBMZW5ndGggKi8KKwlfX3U4ICBmbGFnczsJCQkvKiAgKi8KKwlfX3U4ICBpbnZmbGFnczsJCQkvKiBJbnZlcnNlIGZsYWdzICovCisJc3RydWN0IGluNl9hZGRyIGFkZHJzW0lQNlRfUlRfSE9QU107CS8qIEhvcHMgKi8KKwlfX3U4IGFkZHJucjsJCQkvKiBOciBvZiBBZGRyZXNzZXMgKi8KK307CisKKyNkZWZpbmUgSVA2VF9SVF9UWVAgCQkweDAxCisjZGVmaW5lIElQNlRfUlRfU0dTIAkJMHgwMgorI2RlZmluZSBJUDZUX1JUX0xFTiAJCTB4MDQKKyNkZWZpbmUgSVA2VF9SVF9SRVMgCQkweDA4CisjZGVmaW5lIElQNlRfUlRfRlNUX01BU0sJMHgzMAorI2RlZmluZSBJUDZUX1JUX0ZTVCAJCTB4MTAKKyNkZWZpbmUgSVA2VF9SVF9GU1RfTlNUUklDVAkweDIwCisKKy8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXA2dF9ydC4gKi8KKyNkZWZpbmUgSVA2VF9SVF9JTlZfVFlQCQkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgdHlwZS4gKi8KKyNkZWZpbmUgSVA2VF9SVF9JTlZfU0dTCQkweDAyCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgU2VnbWVudHMuICovCisjZGVmaW5lIElQNlRfUlRfSU5WX0xFTgkJMHgwNAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGxlbmd0aC4gKi8KKyNkZWZpbmUgSVA2VF9SVF9JTlZfTUFTSwkweDA3CS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworI2VuZGlmIC8qX0lQNlRfUlRfSCovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0bGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjU3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaApAQCAtMCwwICsxLDE1MSBAQAorI2lmbmRlZiBfX0xJTlVYX05FVExJTktfSAorI2RlZmluZSBfX0xJTlVYX05FVExJTktfSAorCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+IC8qIGZvciBfX2tlcm5lbF9zYV9mYW1pbHlfdCAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgTkVUTElOS19ST1VURQkJMAkvKiBSb3V0aW5nL2RldmljZSBob29rCQkJCSovCisjZGVmaW5lIE5FVExJTktfVU5VU0VECQkxCS8qIFVudXNlZCBudW1iZXIJCQkJKi8KKyNkZWZpbmUgTkVUTElOS19VU0VSU09DSwkyCS8qIFJlc2VydmVkIGZvciB1c2VyIG1vZGUgc29ja2V0IHByb3RvY29scyAJKi8KKyNkZWZpbmUgTkVUTElOS19GSVJFV0FMTAkzCS8qIEZpcmV3YWxsaW5nIGhvb2sJCQkJKi8KKyNkZWZpbmUgTkVUTElOS19JTkVUX0RJQUcJNAkvKiBJTkVUIHNvY2tldCBtb25pdG9yaW5nCQkJKi8KKyNkZWZpbmUgTkVUTElOS19ORkxPRwkJNQkvKiBuZXRmaWx0ZXIvaXB0YWJsZXMgVUxPRyAqLworI2RlZmluZSBORVRMSU5LX1hGUk0JCTYJLyogaXBzZWMgKi8KKyNkZWZpbmUgTkVUTElOS19TRUxJTlVYCQk3CS8qIFNFTGludXggZXZlbnQgbm90aWZpY2F0aW9ucyAqLworI2RlZmluZSBORVRMSU5LX0lTQ1NJCQk4CS8qIE9wZW4taVNDU0kgKi8KKyNkZWZpbmUgTkVUTElOS19BVURJVAkJOQkvKiBhdWRpdGluZyAqLworI2RlZmluZSBORVRMSU5LX0ZJQl9MT09LVVAJMTAJCisjZGVmaW5lIE5FVExJTktfQ09OTkVDVE9SCTExCisjZGVmaW5lIE5FVExJTktfTkVURklMVEVSCTEyCS8qIG5ldGZpbHRlciBzdWJzeXN0ZW0gKi8KKyNkZWZpbmUgTkVUTElOS19JUDZfRlcJCTEzCisjZGVmaW5lIE5FVExJTktfRE5SVE1TRwkJMTQJLyogREVDbmV0IHJvdXRpbmcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTkVUTElOS19LT0JKRUNUX1VFVkVOVAkxNQkvKiBLZXJuZWwgbWVzc2FnZXMgdG8gdXNlcnNwYWNlICovCisjZGVmaW5lIE5FVExJTktfR0VORVJJQwkJMTYKKy8qIGxlYXZlIHJvb20gZm9yIE5FVExJTktfRE0gKERNIEV2ZW50cykgKi8KKyNkZWZpbmUgTkVUTElOS19TQ1NJVFJBTlNQT1JUCTE4CS8qIFNDU0kgVHJhbnNwb3J0cyAqLworI2RlZmluZSBORVRMSU5LX0VDUllQVEZTCTE5CisjZGVmaW5lIE5FVExJTktfUkRNQQkJMjAKKyNkZWZpbmUgTkVUTElOS19DUllQVE8JCTIxCS8qIENyeXB0byBsYXllciAqLworCisjZGVmaW5lIE1BWF9MSU5LUyAzMgkJCisKK3N0cnVjdCBzb2NrYWRkcl9ubCB7CisJX19rZXJuZWxfc2FfZmFtaWx5X3QJbmxfZmFtaWx5OwkvKiBBRl9ORVRMSU5LCSovCisJdW5zaWduZWQgc2hvcnQJbmxfcGFkOwkJLyogemVybwkJKi8KKwlfX3UzMgkJbmxfcGlkOwkJLyogcG9ydCBJRAkqLworICAgICAgIAlfX3UzMgkJbmxfZ3JvdXBzOwkvKiBtdWx0aWNhc3QgZ3JvdXBzIG1hc2sgKi8KK307CisKK3N0cnVjdCBubG1zZ2hkciB7CisJX191MzIJCW5sbXNnX2xlbjsJLyogTGVuZ3RoIG9mIG1lc3NhZ2UgaW5jbHVkaW5nIGhlYWRlciAqLworCV9fdTE2CQlubG1zZ190eXBlOwkvKiBNZXNzYWdlIGNvbnRlbnQgKi8KKwlfX3UxNgkJbmxtc2dfZmxhZ3M7CS8qIEFkZGl0aW9uYWwgZmxhZ3MgKi8KKwlfX3UzMgkJbmxtc2dfc2VxOwkvKiBTZXF1ZW5jZSBudW1iZXIgKi8KKwlfX3UzMgkJbmxtc2dfcGlkOwkvKiBTZW5kaW5nIHByb2Nlc3MgcG9ydCBJRCAqLworfTsKKworLyogRmxhZ3MgdmFsdWVzICovCisKKyNkZWZpbmUgTkxNX0ZfUkVRVUVTVAkJMQkvKiBJdCBpcyByZXF1ZXN0IG1lc3NhZ2UuIAkqLworI2RlZmluZSBOTE1fRl9NVUxUSQkJMgkvKiBNdWx0aXBhcnQgbWVzc2FnZSwgdGVybWluYXRlZCBieSBOTE1TR19ET05FICovCisjZGVmaW5lIE5MTV9GX0FDSwkJNAkvKiBSZXBseSB3aXRoIGFjaywgd2l0aCB6ZXJvIG9yIGVycm9yIGNvZGUgKi8KKyNkZWZpbmUgTkxNX0ZfRUNITwkJOAkvKiBFY2hvIHRoaXMgcmVxdWVzdCAJCSovCisjZGVmaW5lIE5MTV9GX0RVTVBfSU5UUgkJMTYJLyogRHVtcCB3YXMgaW5jb25zaXN0ZW50IGR1ZSB0byBzZXF1ZW5jZSBjaGFuZ2UgKi8KKworLyogTW9kaWZpZXJzIHRvIEdFVCByZXF1ZXN0ICovCisjZGVmaW5lIE5MTV9GX1JPT1QJMHgxMDAJLyogc3BlY2lmeSB0cmVlCXJvb3QJKi8KKyNkZWZpbmUgTkxNX0ZfTUFUQ0gJMHgyMDAJLyogcmV0dXJuIGFsbCBtYXRjaGluZwkqLworI2RlZmluZSBOTE1fRl9BVE9NSUMJMHg0MDAJLyogYXRvbWljIEdFVAkJKi8KKyNkZWZpbmUgTkxNX0ZfRFVNUAkoTkxNX0ZfUk9PVHxOTE1fRl9NQVRDSCkKKworLyogTW9kaWZpZXJzIHRvIE5FVyByZXF1ZXN0ICovCisjZGVmaW5lIE5MTV9GX1JFUExBQ0UJMHgxMDAJLyogT3ZlcnJpZGUgZXhpc3RpbmcJCSovCisjZGVmaW5lIE5MTV9GX0VYQ0wJMHgyMDAJLyogRG8gbm90IHRvdWNoLCBpZiBpdCBleGlzdHMJKi8KKyNkZWZpbmUgTkxNX0ZfQ1JFQVRFCTB4NDAwCS8qIENyZWF0ZSwgaWYgaXQgZG9lcyBub3QgZXhpc3QJKi8KKyNkZWZpbmUgTkxNX0ZfQVBQRU5ECTB4ODAwCS8qIEFkZCB0byBlbmQgb2YgbGlzdAkJKi8KKworLyoKKyAgIDQuNEJTRCBBREQJCU5MTV9GX0NSRUFURXxOTE1fRl9FWENMCisgICA0LjRCU0QgQ0hBTkdFCU5MTV9GX1JFUExBQ0UKKworICAgVHJ1ZSBDSEFOR0UJCU5MTV9GX0NSRUFURXxOTE1fRl9SRVBMQUNFCisgICBBcHBlbmQJCU5MTV9GX0NSRUFURQorICAgQ2hlY2sJCU5MTV9GX0VYQ0wKKyAqLworCisjZGVmaW5lIE5MTVNHX0FMSUdOVE8JNFUKKyNkZWZpbmUgTkxNU0dfQUxJR04obGVuKSAoICgobGVuKStOTE1TR19BTElHTlRPLTEpICYgfihOTE1TR19BTElHTlRPLTEpICkKKyNkZWZpbmUgTkxNU0dfSERSTEVOCSAoKGludCkgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBubG1zZ2hkcikpKQorI2RlZmluZSBOTE1TR19MRU5HVEgobGVuKSAoKGxlbikrTkxNU0dfQUxJR04oTkxNU0dfSERSTEVOKSkKKyNkZWZpbmUgTkxNU0dfU1BBQ0UobGVuKSBOTE1TR19BTElHTihOTE1TR19MRU5HVEgobGVuKSkKKyNkZWZpbmUgTkxNU0dfREFUQShubGgpICAoKHZvaWQqKSgoKGNoYXIqKW5saCkgKyBOTE1TR19MRU5HVEgoMCkpKQorI2RlZmluZSBOTE1TR19ORVhUKG5saCxsZW4pCSAoKGxlbikgLT0gTkxNU0dfQUxJR04oKG5saCktPm5sbXNnX2xlbiksIFwKKwkJCQkgIChzdHJ1Y3Qgbmxtc2doZHIqKSgoKGNoYXIqKShubGgpKSArIE5MTVNHX0FMSUdOKChubGgpLT5ubG1zZ19sZW4pKSkKKyNkZWZpbmUgTkxNU0dfT0sobmxoLGxlbikgKChsZW4pID49IChpbnQpc2l6ZW9mKHN0cnVjdCBubG1zZ2hkcikgJiYgXAorCQkJICAgKG5saCktPm5sbXNnX2xlbiA+PSBzaXplb2Yoc3RydWN0IG5sbXNnaGRyKSAmJiBcCisJCQkgICAobmxoKS0+bmxtc2dfbGVuIDw9IChsZW4pKQorI2RlZmluZSBOTE1TR19QQVlMT0FEKG5saCxsZW4pICgobmxoKS0+bmxtc2dfbGVuIC0gTkxNU0dfU1BBQ0UoKGxlbikpKQorCisjZGVmaW5lIE5MTVNHX05PT1AJCTB4MQkvKiBOb3RoaW5nLgkJKi8KKyNkZWZpbmUgTkxNU0dfRVJST1IJCTB4MgkvKiBFcnJvcgkJKi8KKyNkZWZpbmUgTkxNU0dfRE9ORQkJMHgzCS8qIEVuZCBvZiBhIGR1bXAJKi8KKyNkZWZpbmUgTkxNU0dfT1ZFUlJVTgkJMHg0CS8qIERhdGEgbG9zdAkJKi8KKworI2RlZmluZSBOTE1TR19NSU5fVFlQRQkJMHgxMAkvKiA8IDB4MTA6IHJlc2VydmVkIGNvbnRyb2wgbWVzc2FnZXMgKi8KKworc3RydWN0IG5sbXNnZXJyIHsKKwlpbnQJCWVycm9yOworCXN0cnVjdCBubG1zZ2hkciBtc2c7Cit9OworCisjZGVmaW5lIE5FVExJTktfQUREX01FTUJFUlNISVAJMQorI2RlZmluZSBORVRMSU5LX0RST1BfTUVNQkVSU0hJUAkyCisjZGVmaW5lIE5FVExJTktfUEtUSU5GTwkJMworI2RlZmluZSBORVRMSU5LX0JST0FEQ0FTVF9FUlJPUgk0CisjZGVmaW5lIE5FVExJTktfTk9fRU5PQlVGUwk1CisKK3N0cnVjdCBubF9wa3RpbmZvIHsKKwlfX3UzMglncm91cDsKK307CisKKyNkZWZpbmUgTkVUX01BSk9SIDM2CQkvKiBNYWpvciAzNiBpcyByZXNlcnZlZCBmb3IgbmV0d29ya2luZyAJCQkJCQkqLworCitlbnVtIHsKKwlORVRMSU5LX1VOQ09OTkVDVEVEID0gMCwKKwlORVRMSU5LX0NPTk5FQ1RFRCwKK307CisKKy8qCisgKiAgPC0tLS0tLS0gTkxBX0hEUkxFTiAtLS0tLS0+IDwtLSBOTEFfQUxJR04ocGF5bG9hZCktLT4KKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLSAtIC0rLSAtIC0gLSAtIC0gLSAtIC0gLSstIC0gLSsKKyAqIHwgICAgICAgIEhlYWRlciAgICAgICB8IFBhZCB8ICAgICBQYXlsb2FkICAgICAgIHwgUGFkIHwKKyAqIHwgICAoc3RydWN0IG5sYXR0cikgICB8IGluZyB8ICAgICAgICAgICAgICAgICAgIHwgaW5nIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLSAtIC0rLSAtIC0gLSAtIC0gLSAtIC0gLSstIC0gLSsKKyAqICA8LS0tLS0tLS0tLS0tLS0gbmxhdHRyLT5ubGFfbGVuIC0tLS0tLS0tLS0tLS0tPgorICovCisKK3N0cnVjdCBubGF0dHIgeworCV9fdTE2ICAgICAgICAgICBubGFfbGVuOworCV9fdTE2ICAgICAgICAgICBubGFfdHlwZTsKK307CisKKy8qCisgKiBubGFfdHlwZSAoMTYgYml0cykKKyAqICstLS0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8IE4gfCBPIHwgQXR0cmlidXRlIFR5cGUgICAgICAgICAgICAgICAgfAorICogKy0tLSstLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIE4gOj0gQ2FycmllcyBuZXN0ZWQgYXR0cmlidXRlcworICogTyA6PSBQYXlsb2FkIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKKyAqCisgKiBOb3RlOiBUaGUgTiBhbmQgTyBmbGFnIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCisgKi8KKyNkZWZpbmUgTkxBX0ZfTkVTVEVECQkoMSA8PCAxNSkKKyNkZWZpbmUgTkxBX0ZfTkVUX0JZVEVPUkRFUgkoMSA8PCAxNCkKKyNkZWZpbmUgTkxBX1RZUEVfTUFTSwkJfihOTEFfRl9ORVNURUQgfCBOTEFfRl9ORVRfQllURU9SREVSKQorCisjZGVmaW5lIE5MQV9BTElHTlRPCQk0CisjZGVmaW5lIE5MQV9BTElHTihsZW4pCQkoKChsZW4pICsgTkxBX0FMSUdOVE8gLSAxKSAmIH4oTkxBX0FMSUdOVE8gLSAxKSkKKyNkZWZpbmUgTkxBX0hEUkxFTgkJKChpbnQpIE5MQV9BTElHTihzaXplb2Yoc3RydWN0IG5sYXR0cikpKQorCisKKyNlbmRpZgkvKiBfX0xJTlVYX05FVExJTktfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRyb20uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0cm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3MzEzYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0cm9tLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIFRoZXNlIGFyZSB0aGUgcHVibGljIGVsZW1lbnRzIG9mIHRoZSBMaW51eCBrZXJuZWwgTkVUL1JPTSBpbXBsZW1lbnRhdGlvbi4KKyAqIEZvciBrZXJuZWwgQVguMjUgc2VlIHRoZSBmaWxlIGF4MjUuaC4gVGhpcyBmaWxlIHJlcXVpcmVzIGF4MjUuaCBmb3IgdGhlCisgKiBkZWZpbml0aW9uIG9mIHRoZSBheDI1X2FkZHJlc3Mgc3RydWN0dXJlLgorICovCisKKyNpZm5kZWYJTkVUUk9NX0tFUk5FTF9ICisjZGVmaW5lCU5FVFJPTV9LRVJORUxfSAorCisjaW5jbHVkZSA8bGludXgvYXgyNS5oPgorCisjZGVmaW5lIE5FVFJPTV9NVFUJMjM2CisKKyNkZWZpbmUgTkVUUk9NX1QxCTEKKyNkZWZpbmUgTkVUUk9NX1QyCTIKKyNkZWZpbmUgTkVUUk9NX04yCTMKKyNkZWZpbmUJTkVUUk9NX1Q0CTYKKyNkZWZpbmUJTkVUUk9NX0lETEUJNworCisjZGVmaW5lCVNJT0NOUkRFQ09CUwkJKFNJT0NQUk9UT1BSSVZBVEUrMikKKworc3RydWN0IG5yX3JvdXRlX3N0cnVjdCB7CisjZGVmaW5lCU5FVFJPTV9ORUlHSAkwCisjZGVmaW5lCU5FVFJPTV9OT0RFCTEKKwlpbnQJCXR5cGU7CisJYXgyNV9hZGRyZXNzCWNhbGxzaWduOworCWNoYXIJCWRldmljZVsxNl07CisJdW5zaWduZWQgaW50CXF1YWxpdHk7CisJY2hhcgkJbW5lbW9uaWNbN107CisJYXgyNV9hZGRyZXNzCW5laWdoYm91cjsKKwl1bnNpZ25lZCBpbnQJb2JzX2NvdW50OworCXVuc2lnbmVkIGludAluZGlnaXM7CisJYXgyNV9hZGRyZXNzCWRpZ2lwZWF0ZXJzW0FYMjVfTUFYX0RJR0lTXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwNWI0NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBORlMgcHJvdG9jb2wgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgY29uc3RhbnRzIG1vc3RseSBmb3IgVmVyc2lvbiAyIG9mIHRoZSBwcm90b2NvbCwKKyAqIGJ1dCBhbHNvIGhhcyBhIGNvdXBsZSBvZiBORlN2MyBiaXRzIGluIChub3RhYmx5IHRoZSBlcnJvciBjb2RlcykuCisgKi8KKyNpZm5kZWYgX0xJTlVYX05GU19ICisjZGVmaW5lIF9MSU5VWF9ORlNfSAorCisjZGVmaW5lIE5GU19QUk9HUkFNCTEwMDAwMworI2RlZmluZSBORlNfUE9SVAkyMDQ5CisjZGVmaW5lIE5GU19NQVhEQVRBCTgxOTIKKyNkZWZpbmUgTkZTX01BWFBBVEhMRU4JMTAyNAorI2RlZmluZSBORlNfTUFYTkFNTEVOCTI1NQorI2RlZmluZSBORlNfTUFYR1JPVVBTCTE2CisjZGVmaW5lIE5GU19GSFNJWkUJMzIKKyNkZWZpbmUgTkZTX0NPT0tJRVNJWkUJNAorI2RlZmluZSBORlNfRklGT19ERVYJKC0xKQorI2RlZmluZSBORlNNT0RFX0ZNVAkwMTcwMDAwCisjZGVmaW5lIE5GU01PREVfRElSCTAwNDAwMDAKKyNkZWZpbmUgTkZTTU9ERV9DSFIJMDAyMDAwMAorI2RlZmluZSBORlNNT0RFX0JMSwkwMDYwMDAwCisjZGVmaW5lIE5GU01PREVfUkVHCTAxMDAwMDAKKyNkZWZpbmUgTkZTTU9ERV9MTksJMDEyMDAwMAorI2RlZmluZSBORlNNT0RFX1NPQ0sJMDE0MDAwMAorI2RlZmluZSBORlNNT0RFX0ZJRk8JMDAxMDAwMAorCisjZGVmaW5lIE5GU19NTlRfUFJPR1JBTQkJMTAwMDA1CisjZGVmaW5lIE5GU19NTlRfVkVSU0lPTgkJMQorI2RlZmluZSBORlNfTU5UM19WRVJTSU9OCTMKKworI2RlZmluZSBORlNfUElQRV9ESVJOQU1FICIvbmZzIgorCisvKgorICogTkZTIHN0YXRzLiBUaGUgZ29vZCB0aGluZyB3aXRoIHRoZXNlIHZhbHVlcyBpcyB0aGF0IE5GU3YzIGVycm9ycyBhcmUKKyAqIGEgc3VwZXJzZXQgb2YgTkZTdjIgZXJyb3JzICh3aXRoIHRoZSBleGNlcHRpb24gb2YgTkZTRVJSX1dGTFVTSCB3aGljaAorICogbm8tb25lIHVzZXMgYW55d2F5KSwgc28gd2UgY2FuIGhhcHBpbHkgbWl4IGNvZGUgYXMgbG9uZyBhcyB3ZSBtYWtlIHN1cmUKKyAqIG5vIE5GU3YzIGVycm9ycyBhcmUgcmV0dXJuZWQgdG8gTkZTdjIgY2xpZW50cy4KKyAqIEVycm9yIGNvZGVzIHRoYXQgaGF2ZSBhIGAtLScgaW4gdGhlIHYyIGNvbHVtbiBhcmUgbm90IHBhcnQgb2YgdGhlCisgKiBzdGFuZGFyZCwgYnV0IHNlZW0gdG8gYmUgd2lkZWx5IHVzZWQgbmV2ZXJ0aGVsZXNzLgorICovCisgZW51bSBuZnNfc3RhdCB7CisJTkZTX09LID0gMCwJCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9QRVJNID0gMSwJCS8qIHYyIHYzIHY0ICovCisJTkZTRVJSX05PRU5UID0gMiwJCS8qIHYyIHYzIHY0ICovCisJTkZTRVJSX0lPID0gNSwJCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9OWElPID0gNiwJCS8qIHYyIHYzIHY0ICovCisJTkZTRVJSX0VBR0FJTiA9IDExLAkJLyogdjIgdjMgKi8KKwlORlNFUlJfQUNDRVMgPSAxMywJCS8qIHYyIHYzIHY0ICovCisJTkZTRVJSX0VYSVNUID0gMTcsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9YREVWID0gMTgsCQkvKiAgICB2MyB2NCAqLworCU5GU0VSUl9OT0RFViA9IDE5LAkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfTk9URElSID0gMjAsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9JU0RJUiA9IDIxLAkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfSU5WQUwgPSAyMiwJCS8qIHYyIHYzIHY0ICovCisJTkZTRVJSX0ZCSUcgPSAyNywJCS8qIHYyIHYzIHY0ICovCisJTkZTRVJSX05PU1BDID0gMjgsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9ST0ZTID0gMzAsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9NTElOSyA9IDMxLAkJLyogICAgdjMgdjQgKi8KKwlORlNFUlJfT1BOT1RTVVBQID0gNDUsCQkvKiB2MiB2MyAqLworCU5GU0VSUl9OQU1FVE9PTE9ORyA9IDYzLAkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9OT1RFTVBUWSA9IDY2LAkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfRFFVT1QgPSA2OSwJCS8qIHYyIHYzIHY0ICovCisJTkZTRVJSX1NUQUxFID0gNzAsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9SRU1PVEUgPSA3MSwJCS8qIHYyIHYzICovCisJTkZTRVJSX1dGTFVTSCA9IDk5LAkJLyogdjIgICAgKi8KKwlORlNFUlJfQkFESEFORExFID0gMTAwMDEsCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX05PVF9TWU5DID0gMTAwMDIsCS8qICAgIHYzICovCisJTkZTRVJSX0JBRF9DT09LSUUgPSAxMDAwMywJLyogICAgdjMgdjQgKi8KKwlORlNFUlJfTk9UU1VQUCA9IDEwMDA0LAkJLyogICAgdjMgdjQgKi8KKwlORlNFUlJfVE9PU01BTEwgPSAxMDAwNSwJLyogICAgdjMgdjQgKi8KKwlORlNFUlJfU0VSVkVSRkFVTFQgPSAxMDAwNiwJLyogICAgdjMgdjQgKi8KKwlORlNFUlJfQkFEVFlQRSA9IDEwMDA3LAkJLyogICAgdjMgdjQgKi8KKwlORlNFUlJfSlVLRUJPWCA9IDEwMDA4LAkJLyogICAgdjMgdjQgKi8KKwlORlNFUlJfU0FNRSA9IDEwMDA5LAkJLyogICAgICAgdjQgKi8KKwlORlNFUlJfREVOSUVEID0gMTAwMTAsCQkvKiAgICAgICB2NCAqLworCU5GU0VSUl9FWFBJUkVEID0gMTAwMTEsCQkvKiAgICAgICB2NCAqLworCU5GU0VSUl9MT0NLRUQgPSAxMDAxMiwJCS8qICAgICAgIHY0ICovCisJTkZTRVJSX0dSQUNFID0gMTAwMTMsCQkvKiAgICAgICB2NCAqLworCU5GU0VSUl9GSEVYUElSRUQgPSAxMDAxNCwJLyogICAgICAgdjQgKi8KKwlORlNFUlJfU0hBUkVfREVOSUVEID0gMTAwMTUsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX1dST05HU0VDID0gMTAwMTYsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX0NMSURfSU5VU0UgPSAxMDAxNywJLyogICAgICAgdjQgKi8KKwlORlNFUlJfUkVTT1VSQ0UgPSAxMDAxOCwJLyogICAgICAgdjQgKi8KKwlORlNFUlJfTU9WRUQgPSAxMDAxOSwJCS8qICAgICAgIHY0ICovCisJTkZTRVJSX05PRklMRUhBTkRMRSA9IDEwMDIwLAkvKiAgICAgICB2NCAqLworCU5GU0VSUl9NSU5PUl9WRVJTX01JU01BVENIID0gMTAwMjEsICAgLyogdjQgKi8KKwlORlNFUlJfU1RBTEVfQ0xJRU5USUQgPSAxMDAyMiwJLyogICAgICAgdjQgKi8KKwlORlNFUlJfU1RBTEVfU1RBVEVJRCA9IDEwMDIzLCAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX09MRF9TVEFURUlEID0gMTAwMjQsICAgICAvKiAgICAgICB2NCAqLworCU5GU0VSUl9CQURfU1RBVEVJRCA9IDEwMDI1LCAgICAgLyogICAgICAgdjQgKi8gIAorCU5GU0VSUl9CQURfU0VRSUQgPSAxMDAyNiwJLyogICAgICAgdjQgKi8KKwlORlNFUlJfTk9UX1NBTUUgPSAxMDAyNywJLyogICAgICAgdjQgKi8KKwlORlNFUlJfTE9DS19SQU5HRSA9IDEwMDI4LAkvKiAgICAgICB2NCAqLworCU5GU0VSUl9TWU1MSU5LID0gMTAwMjksCQkvKiAgICAgICB2NCAqLworCU5GU0VSUl9SRVNUT1JFRkggPSAxMDAzMCwJLyogICAgICAgdjQgKi8KKwlORlNFUlJfTEVBU0VfTU9WRUQgPSAxMDAzMSwJLyogICAgICAgdjQgKi8KKwlORlNFUlJfQVRUUk5PVFNVUFAgPSAxMDAzMiwJLyogICAgICAgdjQgKi8KKwlORlNFUlJfTk9fR1JBQ0UgPSAxMDAzMywJLyogICAgICAgdjQgKi8KKwlORlNFUlJfUkVDTEFJTV9CQUQgPSAxMDAzNCwJLyogICAgICAgdjQgKi8KKwlORlNFUlJfUkVDTEFJTV9DT05GTElDVCA9IDEwMDM1LC8qICAgICAgIHY0ICovCisJTkZTRVJSX0JBRF9YRFIgPSAxMDAzNiwJCS8qICAgICAgIHY0ICovCisJTkZTRVJSX0xPQ0tTX0hFTEQgPSAxMDAzNywJLyogICAgICAgdjQgKi8KKwlORlNFUlJfT1BFTk1PREUgPSAxMDAzOCwgICAgICAgLyogICAgICAgdjQgKi8KKwlORlNFUlJfQkFET1dORVIgPSAxMDAzOSwgICAgICAgLyogICAgICAgdjQgKi8KKwlORlNFUlJfQkFEQ0hBUiA9IDEwMDQwLCAgICAgICAgLyogICAgICAgdjQgKi8KKwlORlNFUlJfQkFETkFNRSA9IDEwMDQxLCAgICAgICAgLyogICAgICAgdjQgKi8KKwlORlNFUlJfQkFEX1JBTkdFID0gMTAwNDIsICAgICAgLyogICAgICAgdjQgKi8KKwlORlNFUlJfTE9DS19OT1RTVVBQID0gMTAwNDMsICAgLyogICAgICAgdjQgKi8KKwlORlNFUlJfT1BfSUxMRUdBTCA9IDEwMDQ0LCAgICAgLyogICAgICAgdjQgKi8KKwlORlNFUlJfREVBRExPQ0sgPSAxMDA0NSwgICAgICAgLyogICAgICAgdjQgKi8KKwlORlNFUlJfRklMRV9PUEVOID0gMTAwNDYsICAgICAgLyogICAgICAgdjQgKi8KKwlORlNFUlJfQURNSU5fUkVWT0tFRCA9IDEwMDQ3LCAgLyogICAgICAgdjQgKi8KKwlORlNFUlJfQ0JfUEFUSF9ET1dOID0gMTAwNDgsICAgLyogICAgICAgdjQgKi8KK307CisKKy8qIE5GU3YyIGZpbGUgdHlwZXMgLSBiZXdhcmUsIHRoZXNlIGFyZSBub3QgdGhlIHNhbWUgaW4gTkZTdjMgKi8KKworZW51bSBuZnNfZnR5cGUgeworCU5GTk9OID0gMCwKKwlORlJFRyA9IDEsCisJTkZESVIgPSAyLAorCU5GQkxLID0gMywKKwlORkNIUiA9IDQsCisJTkZMTksgPSA1LAorCU5GU09DSyA9IDYsCisJTkZCQUQgPSA3LAorCU5GRklGTyA9IDgKK307CisKKyNlbmRpZiAvKiBfTElOVVhfTkZTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzMi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlMjRiMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzMi5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBORlMgcHJvdG9jb2wgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgY29uc3RhbnRzIGZvciBWZXJzaW9uIDIgb2YgdGhlIHByb3RvY29sLgorICovCisjaWZuZGVmIF9MSU5VWF9ORlMyX0gKKyNkZWZpbmUgX0xJTlVYX05GUzJfSAorCisjZGVmaW5lIE5GUzJfUE9SVAkyMDQ5CisjZGVmaW5lIE5GUzJfTUFYREFUQQk4MTkyCisjZGVmaW5lIE5GUzJfTUFYUEFUSExFTgkxMDI0CisjZGVmaW5lIE5GUzJfTUFYTkFNTEVOCTI1NQorI2RlZmluZSBORlMyX01BWEdST1VQUwkxNgorI2RlZmluZSBORlMyX0ZIU0laRQkzMgorI2RlZmluZSBORlMyX0NPT0tJRVNJWkUJNAorI2RlZmluZSBORlMyX0ZJRk9fREVWCSgtMSkKKyNkZWZpbmUgTkZTMk1PREVfRk1UCTAxNzAwMDAKKyNkZWZpbmUgTkZTMk1PREVfRElSCTAwNDAwMDAKKyNkZWZpbmUgTkZTMk1PREVfQ0hSCTAwMjAwMDAKKyNkZWZpbmUgTkZTMk1PREVfQkxLCTAwNjAwMDAKKyNkZWZpbmUgTkZTMk1PREVfUkVHCTAxMDAwMDAKKyNkZWZpbmUgTkZTMk1PREVfTE5LCTAxMjAwMDAKKyNkZWZpbmUgTkZTMk1PREVfU09DSwkwMTQwMDAwCisjZGVmaW5lIE5GUzJNT0RFX0ZJRk8JMDAxMDAwMAorCisKKy8qIE5GU3YyIGZpbGUgdHlwZXMgLSBiZXdhcmUsIHRoZXNlIGFyZSBub3QgdGhlIHNhbWUgaW4gTkZTdjMgKi8KK2VudW0gbmZzMl9mdHlwZSB7CisJTkYyTk9OID0gMCwKKwlORjJSRUcgPSAxLAorCU5GMkRJUiA9IDIsCisJTkYyQkxLID0gMywKKwlORjJDSFIgPSA0LAorCU5GMkxOSyA9IDUsCisJTkYyU09DSyA9IDYsCisJTkYyQkFEID0gNywKKwlORjJGSUZPID0gOAorfTsKKworc3RydWN0IG5mczJfZmggeworCWNoYXIJCQlkYXRhW05GUzJfRkhTSVpFXTsKK307CisKKy8qCisgKiBQcm9jZWR1cmUgbnVtYmVycyBmb3IgTkZTdjIKKyAqLworI2RlZmluZSBORlMyX1ZFUlNJT04JCTIKKyNkZWZpbmUgTkZTUFJPQ19OVUxMCQkwCisjZGVmaW5lIE5GU1BST0NfR0VUQVRUUgkJMQorI2RlZmluZSBORlNQUk9DX1NFVEFUVFIJCTIKKyNkZWZpbmUgTkZTUFJPQ19ST09UCQkzCisjZGVmaW5lIE5GU1BST0NfTE9PS1VQCQk0CisjZGVmaW5lIE5GU1BST0NfUkVBRExJTksJNQorI2RlZmluZSBORlNQUk9DX1JFQUQJCTYKKyNkZWZpbmUgTkZTUFJPQ19XUklURUNBQ0hFCTcKKyNkZWZpbmUgTkZTUFJPQ19XUklURQkJOAorI2RlZmluZSBORlNQUk9DX0NSRUFURQkJOQorI2RlZmluZSBORlNQUk9DX1JFTU9WRQkJMTAKKyNkZWZpbmUgTkZTUFJPQ19SRU5BTUUJCTExCisjZGVmaW5lIE5GU1BST0NfTElOSwkJMTIKKyNkZWZpbmUgTkZTUFJPQ19TWU1MSU5LCQkxMworI2RlZmluZSBORlNQUk9DX01LRElSCQkxNAorI2RlZmluZSBORlNQUk9DX1JNRElSCQkxNQorI2RlZmluZSBORlNQUk9DX1JFQURESVIJCTE2CisjZGVmaW5lIE5GU1BST0NfU1RBVEZTCQkxNworCisjZW5kaWYgLyogX0xJTlVYX05GUzJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnMzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mczMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWNmZTQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnMzLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIE5GU3YzIHByb3RvY29sIGRlZmluaXRpb25zCisgKi8KKyNpZm5kZWYgX0xJTlVYX05GUzNfSAorI2RlZmluZSBfTElOVVhfTkZTM19ICisKKyNkZWZpbmUgTkZTM19QT1JUCQkyMDQ5CisjZGVmaW5lIE5GUzNfTUFYREFUQQkJMzI3NjgKKyNkZWZpbmUgTkZTM19NQVhQQVRITEVOCQlQQVRIX01BWAorI2RlZmluZSBORlMzX01BWE5BTUxFTgkJTkFNRV9NQVgKKyNkZWZpbmUgTkZTM19NQVhHUk9VUFMJCTE2CisjZGVmaW5lIE5GUzNfRkhTSVpFCQk2NAorI2RlZmluZSBORlMzX0NPT0tJRVNJWkUJCTQKKyNkZWZpbmUgTkZTM19DUkVBVEVWRVJGU0laRQk4CisjZGVmaW5lIE5GUzNfQ09PS0lFVkVSRlNJWkUJOAorI2RlZmluZSBORlMzX1dSSVRFVkVSRlNJWkUJOAorI2RlZmluZSBORlMzX0ZJRk9fREVWCQkoLTEpCisjZGVmaW5lIE5GUzNNT0RFX0ZNVAkJMDE3MDAwMAorI2RlZmluZSBORlMzTU9ERV9ESVIJCTAwNDAwMDAKKyNkZWZpbmUgTkZTM01PREVfQ0hSCQkwMDIwMDAwCisjZGVmaW5lIE5GUzNNT0RFX0JMSwkJMDA2MDAwMAorI2RlZmluZSBORlMzTU9ERV9SRUcJCTAxMDAwMDAKKyNkZWZpbmUgTkZTM01PREVfTE5LCQkwMTIwMDAwCisjZGVmaW5lIE5GUzNNT0RFX1NPQ0sJCTAxNDAwMDAKKyNkZWZpbmUgTkZTM01PREVfRklGTwkJMDAxMDAwMAorCisvKiBGbGFncyBmb3IgYWNjZXNzKCkgY2FsbCAqLworI2RlZmluZSBORlMzX0FDQ0VTU19SRUFECTB4MDAwMQorI2RlZmluZSBORlMzX0FDQ0VTU19MT09LVVAJMHgwMDAyCisjZGVmaW5lIE5GUzNfQUNDRVNTX01PRElGWQkweDAwMDQKKyNkZWZpbmUgTkZTM19BQ0NFU1NfRVhURU5ECTB4MDAwOAorI2RlZmluZSBORlMzX0FDQ0VTU19ERUxFVEUJMHgwMDEwCisjZGVmaW5lIE5GUzNfQUNDRVNTX0VYRUNVVEUJMHgwMDIwCisjZGVmaW5lIE5GUzNfQUNDRVNTX0ZVTEwJMHgwMDNmCisKKy8qIEZsYWdzIGZvciBjcmVhdGUgbW9kZSAqLworZW51bSBuZnMzX2NyZWF0ZW1vZGUgeworCU5GUzNfQ1JFQVRFX1VOQ0hFQ0tFRCA9IDAsCisJTkZTM19DUkVBVEVfR1VBUkRFRCA9IDEsCisJTkZTM19DUkVBVEVfRVhDTFVTSVZFID0gMgorfTsKKworLyogTkZTdjMgZmlsZSBzeXN0ZW0gcHJvcGVydGllcyAqLworI2RlZmluZSBORlMzX0ZTRl9MSU5LCQkweDAwMDEKKyNkZWZpbmUgTkZTM19GU0ZfU1lNTElOSwkweDAwMDIKKyNkZWZpbmUgTkZTM19GU0ZfSE9NT0dFTkVPVVMJMHgwMDA4CisjZGVmaW5lIE5GUzNfRlNGX0NBTlNFVFRJTUUJMHgwMDEwCisvKiBTb21lIHNob3J0aGFuZHMuIFNlZSBmcy9uZnNkL25mczNwcm9jLmMgKi8KKyNkZWZpbmUgTkZTM19GU0ZfREVGQVVMVAkweDAwMUIKKyNkZWZpbmUgTkZTM19GU0ZfQklMTFlCT1kJMHgwMDE4CisjZGVmaW5lIE5GUzNfRlNGX1JFQURPTkxZCTB4MDAwOAorCitlbnVtIG5mczNfZnR5cGUgeworCU5GM05PTiAgPSAwLAorCU5GM1JFRyAgPSAxLAorCU5GM0RJUiAgPSAyLAorCU5GM0JMSyAgPSAzLAorCU5GM0NIUiAgPSA0LAorCU5GM0xOSyAgPSA1LAorCU5GM1NPQ0sgPSA2LAorCU5GM0ZJRk8gPSA3LAkvKiBjaGFuZ2VkIGZyb20gTkZTdjIgKHdhcyA4KSAqLworCU5GM0JBRCAgPSA4Cit9OworCitzdHJ1Y3QgbmZzM19maCB7CisJdW5zaWduZWQgc2hvcnQgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICBkYXRhW05GUzNfRkhTSVpFXTsKK307CisKKyNkZWZpbmUgTkZTM19WRVJTSU9OCQkzCisjZGVmaW5lIE5GUzNQUk9DX05VTEwJCTAKKyNkZWZpbmUgTkZTM1BST0NfR0VUQVRUUgkxCisjZGVmaW5lIE5GUzNQUk9DX1NFVEFUVFIJMgorI2RlZmluZSBORlMzUFJPQ19MT09LVVAJCTMKKyNkZWZpbmUgTkZTM1BST0NfQUNDRVNTCQk0CisjZGVmaW5lIE5GUzNQUk9DX1JFQURMSU5LCTUKKyNkZWZpbmUgTkZTM1BST0NfUkVBRAkJNgorI2RlZmluZSBORlMzUFJPQ19XUklURQkJNworI2RlZmluZSBORlMzUFJPQ19DUkVBVEUJCTgKKyNkZWZpbmUgTkZTM1BST0NfTUtESVIJCTkKKyNkZWZpbmUgTkZTM1BST0NfU1lNTElOSwkxMAorI2RlZmluZSBORlMzUFJPQ19NS05PRAkJMTEKKyNkZWZpbmUgTkZTM1BST0NfUkVNT1ZFCQkxMgorI2RlZmluZSBORlMzUFJPQ19STURJUgkJMTMKKyNkZWZpbmUgTkZTM1BST0NfUkVOQU1FCQkxNAorI2RlZmluZSBORlMzUFJPQ19MSU5LCQkxNQorI2RlZmluZSBORlMzUFJPQ19SRUFERElSCTE2CisjZGVmaW5lIE5GUzNQUk9DX1JFQURESVJQTFVTCTE3CisjZGVmaW5lIE5GUzNQUk9DX0ZTU1RBVAkJMTgKKyNkZWZpbmUgTkZTM1BST0NfRlNJTkZPCQkxOQorI2RlZmluZSBORlMzUFJPQ19QQVRIQ09ORgkyMAorI2RlZmluZSBORlMzUFJPQ19DT01NSVQJCTIxCisKKyNkZWZpbmUgTkZTX01OVDNfVkVSU0lPTgkzCisgCisKKyNlbmRpZiAvKiBfTElOVVhfTkZTM19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mczQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZDhkYjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mczQuaApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqICBpbmNsdWRlL2xpbnV4L25mczQuaAorICoKKyAqICBORlN2NCBwcm90b2NvbCBkZWZpbml0aW9ucy4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEtlbmRyaWNrIFNtaXRoIDxrbXNtaXRoQHVtaWNoLmVkdT4KKyAqICBBbmR5IEFkYW1zb24gICA8YW5kcm9zQHVtaWNoLmVkdT4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9ORlM0X0gKKyNkZWZpbmUgX0xJTlVYX05GUzRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBORlM0X0JJVE1BUF9TSVpFCTIKKyNkZWZpbmUgTkZTNF9WRVJJRklFUl9TSVpFCTgKKyNkZWZpbmUgTkZTNF9TVEFURUlEX1NFUUlEX1NJWkUgNAorI2RlZmluZSBORlM0X1NUQVRFSURfT1RIRVJfU0laRSAxMgorI2RlZmluZSBORlM0X1NUQVRFSURfU0laRQkoTkZTNF9TVEFURUlEX1NFUUlEX1NJWkUgKyBORlM0X1NUQVRFSURfT1RIRVJfU0laRSkKKyNkZWZpbmUgTkZTNF9GSFNJWkUJCTEyOAorI2RlZmluZSBORlM0X01BWFBBVEhMRU4JCVBBVEhfTUFYCisjZGVmaW5lIE5GUzRfTUFYTkFNTEVOCQlOQU1FX01BWAorI2RlZmluZSBORlM0X09QQVFVRV9MSU1JVAkxMDI0CisjZGVmaW5lIE5GUzRfTUFYX1NFU1NJT05JRF9MRU4JMTYKKworI2RlZmluZSBORlM0X0FDQ0VTU19SRUFEICAgICAgICAweDAwMDEKKyNkZWZpbmUgTkZTNF9BQ0NFU1NfTE9PS1VQICAgICAgMHgwMDAyCisjZGVmaW5lIE5GUzRfQUNDRVNTX01PRElGWSAgICAgIDB4MDAwNAorI2RlZmluZSBORlM0X0FDQ0VTU19FWFRFTkQgICAgICAweDAwMDgKKyNkZWZpbmUgTkZTNF9BQ0NFU1NfREVMRVRFICAgICAgMHgwMDEwCisjZGVmaW5lIE5GUzRfQUNDRVNTX0VYRUNVVEUgICAgIDB4MDAyMAorCisjZGVmaW5lIE5GUzRfRkhfUEVSU0lTVEVOVAkJMHgwMDAwCisjZGVmaW5lIE5GUzRfRkhfTk9FWFBJUkVfV0lUSF9PUEVOCTB4MDAwMQorI2RlZmluZSBORlM0X0ZIX1ZPTEFUSUxFX0FOWQkJMHgwMDAyCisjZGVmaW5lIE5GUzRfRkhfVk9MX01JR1JBVElPTgkJMHgwMDA0CisjZGVmaW5lIE5GUzRfRkhfVk9MX1JFTkFNRQkJMHgwMDA4CisKKyNkZWZpbmUgTkZTNF9PUEVOX1JFU1VMVF9DT05GSVJNIDB4MDAwMgorI2RlZmluZSBORlM0X09QRU5fUkVTVUxUX0xPQ0tUWVBFX1BPU0lYIDB4MDAwNAorCisjZGVmaW5lIE5GUzRfU0hBUkVfQUNDRVNTX01BU0sJMHgwMDBGCisjZGVmaW5lIE5GUzRfU0hBUkVfQUNDRVNTX1JFQUQJMHgwMDAxCisjZGVmaW5lIE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFCTB4MDAwMgorI2RlZmluZSBORlM0X1NIQVJFX0FDQ0VTU19CT1RICTB4MDAwMworI2RlZmluZSBORlM0X1NIQVJFX0RFTllfUkVBRAkweDAwMDEKKyNkZWZpbmUgTkZTNF9TSEFSRV9ERU5ZX1dSSVRFCTB4MDAwMgorI2RlZmluZSBORlM0X1NIQVJFX0RFTllfQk9USAkweDAwMDMKKworLyogbmZzNDEgKi8KKyNkZWZpbmUgTkZTNF9TSEFSRV9XQU5UX01BU0sJCTB4RkYwMAorI2RlZmluZSBORlM0X1NIQVJFX1dBTlRfTk9fUFJFRkVSRU5DRQkweDAwMDAKKyNkZWZpbmUgTkZTNF9TSEFSRV9XQU5UX1JFQURfREVMRUcJMHgwMTAwCisjZGVmaW5lIE5GUzRfU0hBUkVfV0FOVF9XUklURV9ERUxFRwkweDAyMDAKKyNkZWZpbmUgTkZTNF9TSEFSRV9XQU5UX0FOWV9ERUxFRwkweDAzMDAKKyNkZWZpbmUgTkZTNF9TSEFSRV9XQU5UX05PX0RFTEVHCTB4MDQwMAorI2RlZmluZSBORlM0X1NIQVJFX1dBTlRfQ0FOQ0VMCQkweDA1MDAKKworI2RlZmluZSBORlM0X1NIQVJFX1dIRU5fTUFTSwkJMHhGMDAwMAorI2RlZmluZSBORlM0X1NIQVJFX1NJR05BTF9ERUxFR19XSEVOX1JFU1JDX0FWQUlMCTB4MTAwMDAKKyNkZWZpbmUgTkZTNF9TSEFSRV9QVVNIX0RFTEVHX1dIRU5fVU5DT05URU5ERUQJCTB4MjAwMDAKKworI2RlZmluZSBORlM0X0NERkM0X0ZPUkUJMHgxCisjZGVmaW5lIE5GUzRfQ0RGQzRfQkFDSyAweDIKKyNkZWZpbmUgTkZTNF9DREZDNF9CT1RIIDB4MworI2RlZmluZSBORlM0X0NERkM0X0ZPUkVfT1JfQk9USCAweDMKKyNkZWZpbmUgTkZTNF9DREZDNF9CQUNLX09SX0JPVEggMHg3CisKKyNkZWZpbmUgTkZTNF9TRVRfVE9fU0VSVkVSX1RJTUUJMAorI2RlZmluZSBORlM0X1NFVF9UT19DTElFTlRfVElNRQkxCisKKyNkZWZpbmUgTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUgMAorI2RlZmluZSBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFICAxCisjZGVmaW5lIE5GUzRfQUNFX1NZU1RFTV9BVURJVF9BQ0VfVFlQRSAgIDIKKyNkZWZpbmUgTkZTNF9BQ0VfU1lTVEVNX0FMQVJNX0FDRV9UWVBFICAgMworCisjZGVmaW5lIEFDTDRfU1VQUE9SVF9BTExPV19BQ0wgMHgwMQorI2RlZmluZSBBQ0w0X1NVUFBPUlRfREVOWV9BQ0wgIDB4MDIKKyNkZWZpbmUgQUNMNF9TVVBQT1JUX0FVRElUX0FDTCAweDA0CisjZGVmaW5lIEFDTDRfU1VQUE9SVF9BTEFSTV9BQ0wgMHgwOAorCisjZGVmaW5lIE5GUzRfQUNFX0ZJTEVfSU5IRVJJVF9BQ0UgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBORlM0X0FDRV9ESVJFQ1RPUllfSU5IRVJJVF9BQ0UgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTkZTNF9BQ0VfTk9fUFJPUEFHQVRFX0lOSEVSSVRfQUNFICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE5GUzRfQUNFX0lOSEVSSVRfT05MWV9BQ0UgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBORlM0X0FDRV9TVUNDRVNTRlVMX0FDQ0VTU19BQ0VfRkxBRyAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgTkZTNF9BQ0VfRkFJTEVEX0FDQ0VTU19BQ0VfRkxBRyAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIE5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVAgICAgICAgICAgICAgMHgwMDAwMDA0MAorCisjZGVmaW5lIE5GUzRfQUNFX1JFQURfREFUQSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBORlM0X0FDRV9MSVNUX0RJUkVDVE9SWSAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTkZTNF9BQ0VfV1JJVEVfREFUQSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE5GUzRfQUNFX0FERF9GSUxFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBORlM0X0FDRV9BUFBFTkRfREFUQSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTkZTNF9BQ0VfQUREX1NVQkRJUkVDVE9SWSAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE5GUzRfQUNFX1JFQURfTkFNRURfQVRUUlMgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBORlM0X0FDRV9XUklURV9OQU1FRF9BVFRSUyAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgTkZTNF9BQ0VfRVhFQ1VURSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIE5GUzRfQUNFX0RFTEVURV9DSElMRCAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBORlM0X0FDRV9SRUFEX0FUVFJJQlVURVMgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgTkZTNF9BQ0VfV1JJVEVfQVRUUklCVVRFUyAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIE5GUzRfQUNFX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBORlM0X0FDRV9SRUFEX0FDTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgTkZTNF9BQ0VfV1JJVEVfQUNMICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIE5GUzRfQUNFX1dSSVRFX09XTkVSICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBORlM0X0FDRV9TWU5DSFJPTklaRSAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgTkZTNF9BQ0VfR0VORVJJQ19SRUFEICAgICAgICAgICAgICAgICAweDAwMTIwMDgxCisjZGVmaW5lIE5GUzRfQUNFX0dFTkVSSUNfV1JJVEUgICAgICAgICAgICAgICAgMHgwMDE2MDEwNgorI2RlZmluZSBORlM0X0FDRV9HRU5FUklDX0VYRUNVVEUgICAgICAgICAgICAgIDB4MDAxMjAwQTAKKyNkZWZpbmUgTkZTNF9BQ0VfTUFTS19BTEwgICAgICAgICAgICAgICAgICAgICAweDAwMUYwMUZGCisKKyNkZWZpbmUgRVhDSEdJRDRfRkxBR19TVVBQX01PVkVEX1JFRkVSCQkweDAwMDAwMDAxCisjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfU1VQUF9NT1ZFRF9NSUdSCQkweDAwMDAwMDAyCisjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfQklORF9QUklOQ19TVEFURUlECTB4MDAwMDAxMDAKKworI2RlZmluZSBFWENIR0lENF9GTEFHX1VTRV9OT05fUE5GUwkJMHgwMDAxMDAwMAorI2RlZmluZSBFWENIR0lENF9GTEFHX1VTRV9QTkZTX01EUwkJMHgwMDAyMDAwMAorI2RlZmluZSBFWENIR0lENF9GTEFHX1VTRV9QTkZTX0RTCQkweDAwMDQwMDAwCisjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfTUFTS19QTkZTCQkJMHgwMDA3MDAwMAorCisjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfVVBEX0NPTkZJUk1FRF9SRUNfQQkweDQwMDAwMDAwCisjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfQ09ORklSTUVEX1IJCTB4ODAwMDAwMDAKKy8qCisgKiBTaW5jZSB0aGUgdmFsaWRpdHkgb2YgdGhlc2UgYml0cyBkZXBlbmRzIG9uIHdoZXRoZXIKKyAqIHRoZXkncmUgc2V0IGluIHRoZSBhcmd1bWVudCBvciByZXNwb25zZSwgaGF2ZSBzZXBhcmF0ZQorICogaW52YWxpZCBmbGFnIG1hc2tzIGZvciBhcmcgKF9BKSBhbmQgcmVzcCAoX1IpLgorICovCisjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfTUFTS19BCQkJMHg0MDA3MDEwMworI2RlZmluZSBFWENIR0lENF9GTEFHX01BU0tfUgkJCTB4ODAwNzAxMDMKKworI2RlZmluZSBTRVE0X1NUQVRVU19DQl9QQVRIX0RPV04JCTB4MDAwMDAwMDEKKyNkZWZpbmUgU0VRNF9TVEFUVVNfQ0JfR1NTX0NPTlRFWFRTX0VYUElSSU5HCTB4MDAwMDAwMDIKKyNkZWZpbmUgU0VRNF9TVEFUVVNfQ0JfR1NTX0NPTlRFWFRTX0VYUElSRUQJMHgwMDAwMDAwNAorI2RlZmluZSBTRVE0X1NUQVRVU19FWFBJUkVEX0FMTF9TVEFURV9SRVZPS0VECTB4MDAwMDAwMDgKKyNkZWZpbmUgU0VRNF9TVEFUVVNfRVhQSVJFRF9TT01FX1NUQVRFX1JFVk9LRUQJMHgwMDAwMDAxMAorI2RlZmluZSBTRVE0X1NUQVRVU19BRE1JTl9TVEFURV9SRVZPS0VECQkweDAwMDAwMDIwCisjZGVmaW5lIFNFUTRfU1RBVFVTX1JFQ0FMTEFCTEVfU1RBVEVfUkVWT0tFRAkweDAwMDAwMDQwCisjZGVmaW5lIFNFUTRfU1RBVFVTX0xFQVNFX01PVkVECQkJMHgwMDAwMDA4MAorI2RlZmluZSBTRVE0X1NUQVRVU19SRVNUQVJUX1JFQ0xBSU1fTkVFREVECTB4MDAwMDAxMDAKKyNkZWZpbmUgU0VRNF9TVEFUVVNfQ0JfUEFUSF9ET1dOX1NFU1NJT04JMHgwMDAwMDIwMAorI2RlZmluZSBTRVE0X1NUQVRVU19CQUNLQ0hBTk5FTF9GQVVMVAkJMHgwMDAwMDQwMAorCisjZGVmaW5lIE5GUzRfU0VDSU5GT19TVFlMRTRfQ1VSUkVOVF9GSAkwCisjZGVmaW5lIE5GUzRfU0VDSU5GT19TVFlMRTRfUEFSRU5UCTEKKworI2RlZmluZSBORlM0X01BWF9VSU5UNjQJKH4odTY0KTApCisKKy8qIEFuIE5GUzQgc2Vzc2lvbnMgc2VydmVyIG11c3Qgc3VwcG9ydCBhdCBsZWFzdCBORlM0X01BWF9PUFMgb3BlcmF0aW9ucy4KKyAqIElmIGEgY29tcG91bmQgcmVxdWlyZXMgbW9yZSBvcGVyYXRpb25zLCBhZGp1c3QgTkZTNF9NQVhfT1BTIGFjY29yZGluZ2x5LgorICovCisjZGVmaW5lIE5GUzRfTUFYX09QUyAgIDgKKworLyogT3VyIE5GUzQgY2xpZW50IGJhY2sgY2hhbm5lbCBzZXJ2ZXIgb25seSB3YW50cyB0aGUgY2Jfc2VxdWVuZSBhbmQgdGhlCisgKiBhY3R1YWwgb3BlcmF0aW9uIHBlciBjb21wb3VuZAorICovCisjZGVmaW5lIE5GUzRfTUFYX0JBQ0tfQ0hBTk5FTF9PUFMgMgorCitlbnVtIG5mczRfYWNsX3dob3R5cGUgeworCU5GUzRfQUNMX1dIT19OQU1FRCA9IDAsCisJTkZTNF9BQ0xfV0hPX09XTkVSLAorCU5GUzRfQUNMX1dIT19HUk9VUCwKKwlORlM0X0FDTF9XSE9fRVZFUllPTkUsCit9OworCisjZW5kaWYKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mczRfbW91bnQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzNF9tb3VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmYzMmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mczRfbW91bnQuaApAQCAtMCwwICsxLDcxIEBACisjaWZuZGVmIF9MSU5VWF9ORlM0X01PVU5UX0gKKyNkZWZpbmUgX0xJTlVYX05GUzRfTU9VTlRfSAorCisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvbmZzNF9tb3VudC5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMiAgVHJvbmQgTXlrbGVidXN0CisgKgorICogIHN0cnVjdHVyZSBwYXNzZWQgZnJvbSB1c2VyLXNwYWNlIHRvIGtlcm5lbC1zcGFjZSBkdXJpbmcgYW4gbmZzdjQgbW91bnQKKyAqLworCisvKgorICogV0FSTklORyEgIERvIG5vdCBkZWxldGUgb3IgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGVzZSBmaWVsZHMuICBJZgorICogYSBuZXcgZmllbGQgaXMgcmVxdWlyZWQgdGhlbiBhZGQgaXQgdG8gdGhlIGVuZC4gIFRoZSB2ZXJzaW9uIGZpZWxkCisgKiB0cmFja3Mgd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50LiAgVGhpcyB3aWxsIGVuc3VyZSBzb21lIG1lYXN1cmUgb2YKKyAqIG1vdW50LXRvLWtlcm5lbCB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuICBTb21lIG9mIHRoZXNlIGFyZW4ndCB1c2VkIHlldAorICogYnV0IGhlcmUgdGhleSBhcmUgYW55d2F5LgorICovCisjZGVmaW5lIE5GUzRfTU9VTlRfVkVSU0lPTgkxCisKK3N0cnVjdCBuZnNfc3RyaW5nIHsKKwl1bnNpZ25lZCBpbnQgbGVuOworCWNvbnN0IGNoYXIgKiBkYXRhOworfTsKKworc3RydWN0IG5mczRfbW91bnRfZGF0YSB7CisJaW50IHZlcnNpb247CQkJCS8qIDEgKi8KKwlpbnQgZmxhZ3M7CQkJCS8qIDEgKi8KKwlpbnQgcnNpemU7CQkJCS8qIDEgKi8KKwlpbnQgd3NpemU7CQkJCS8qIDEgKi8KKwlpbnQgdGltZW87CQkJCS8qIDEgKi8KKwlpbnQgcmV0cmFuczsJCQkJLyogMSAqLworCWludCBhY3JlZ21pbjsJCQkJLyogMSAqLworCWludCBhY3JlZ21heDsJCQkJLyogMSAqLworCWludCBhY2Rpcm1pbjsJCQkJLyogMSAqLworCWludCBhY2Rpcm1heDsJCQkJLyogMSAqLworCisJLyogc2VlIHRoZSBkZWZpbml0aW9uIG9mICdzdHJ1Y3QgY2xpZW50YWRkcjQnIGluIFJGQzMwMTAgKi8KKwlzdHJ1Y3QgbmZzX3N0cmluZyBjbGllbnRfYWRkcjsJCS8qIDEgKi8KKworCS8qIE1vdW50IHBhdGggKi8KKwlzdHJ1Y3QgbmZzX3N0cmluZyBtbnRfcGF0aDsJCS8qIDEgKi8KKworCS8qIFNlcnZlciBkZXRhaWxzICovCisJc3RydWN0IG5mc19zdHJpbmcgaG9zdG5hbWU7CQkvKiAxICovCisJLyogU2VydmVyIElQIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgaG9zdF9hZGRybGVuOwkJLyogMSAqLworCXN0cnVjdCBzb2NrYWRkciAqIGhvc3RfYWRkcjsJLyogMSAqLworCisJLyogVHJhbnNwb3J0IHByb3RvY29sIHRvIHVzZSAqLworCWludCBwcm90bzsJCQkJLyogMSAqLworCisJLyogUHNldWRvLWZsYXZvdXJzIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24uIFNlZSBSRkMyNjIzICovCisJaW50IGF1dGhfZmxhdm91cmxlbjsJCQkvKiAxICovCisJaW50ICphdXRoX2ZsYXZvdXJzOwkJLyogMSAqLworfTsKKworLyogYml0cyBpbiB0aGUgZmxhZ3MgZmllbGQgKi8KKy8qIE5vdGU6IHRoZSBmaWVsZHMgdGhhdCBjb3JyZXNwb25kIHRvIGV4aXN0aW5nIE5GU3YyL3YzIG1vdW50IG9wdGlvbnMKKyAqIAkgc2hvdWxkIG1pcnJvciB0aGUgdmFsdWVzIGZyb20gaW5jbHVkZS9saW51eC9uZnNfbW91bnQuaAorICovCisKKyNkZWZpbmUgTkZTNF9NT1VOVF9TT0ZUCQkweDAwMDEJLyogMSAqLworI2RlZmluZSBORlM0X01PVU5UX0lOVFIJCTB4MDAwMgkvKiAxICovCisjZGVmaW5lIE5GUzRfTU9VTlRfTk9DVE8JMHgwMDEwCS8qIDEgKi8KKyNkZWZpbmUgTkZTNF9NT1VOVF9OT0FDCQkweDAwMjAJLyogMSAqLworI2RlZmluZSBORlM0X01PVU5UX1NUUklDVExPQ0sJMHgxMDAwCS8qIDEgKi8KKyNkZWZpbmUgTkZTNF9NT1VOVF9VTlNIQVJFRAkweDgwMDAJLyogMSAqLworI2RlZmluZSBORlM0X01PVU5UX0ZMQUdNQVNLCTB4OTAzMworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzX2ZzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYmY1NjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc19mcy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9uZnNfZnMuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIFJpY2sgU2xhZGtleQorICoKKyAqICBPUy1zcGVjaWZpYyBuZnMgZmlsZXN5c3RlbSBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zCisgKi8KKworI2lmbmRlZiBfTElOVVhfTkZTX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX05GU19GU19ICisKKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisvKiBEZWZhdWx0IHRpbWVvdXQgdmFsdWVzICovCisjZGVmaW5lIE5GU19ERUZfVURQX1RJTUVPCSgxMSkKKyNkZWZpbmUgTkZTX0RFRl9VRFBfUkVUUkFOUwkoMykKKyNkZWZpbmUgTkZTX0RFRl9UQ1BfVElNRU8JKDYwMCkKKyNkZWZpbmUgTkZTX0RFRl9UQ1BfUkVUUkFOUwkoMikKKworI2RlZmluZSBORlNfTUFYX1VEUF9USU1FT1VUCSg2MCpIWikKKyNkZWZpbmUgTkZTX01BWF9UQ1BfVElNRU9VVAkoNjAwKkhaKQorCisjZGVmaW5lIE5GU19ERUZfQUNSRUdNSU4JKDMpCisjZGVmaW5lIE5GU19ERUZfQUNSRUdNQVgJKDYwKQorI2RlZmluZSBORlNfREVGX0FDRElSTUlOCSgzMCkKKyNkZWZpbmUgTkZTX0RFRl9BQ0RJUk1BWAkoNjApCisKKy8qCisgKiBXaGVuIGZsdXNoaW5nIGEgY2x1c3RlciBvZiBkaXJ0eSBwYWdlcywgdGhlcmUgY2FuIGJlIGRpZmZlcmVudAorICogc3RyYXRlZ2llczoKKyAqLworI2RlZmluZSBGTFVTSF9TWU5DCQkxCS8qIGZpbGUgYmVpbmcgc3luY2VkLCBvciBjb250ZW50aW9uICovCisjZGVmaW5lIEZMVVNIX1NUQUJMRQkJNAkvKiBjb21taXQgdG8gc3RhYmxlIHN0b3JhZ2UgKi8KKyNkZWZpbmUgRkxVU0hfTE9XUFJJCQk4CS8qIGxvdyBwcmlvcml0eSBiYWNrZ3JvdW5kIGZsdXNoICovCisjZGVmaW5lIEZMVVNIX0hJR0hQUkkJCTE2CS8qIGhpZ2ggcHJpb3JpdHkgbWVtb3J5IHJlY2xhaW0gZmx1c2ggKi8KKyNkZWZpbmUgRkxVU0hfQ09ORF9TVEFCTEUJMzIJLyogY29uZGl0aW9uYWwgc3RhYmxlIHdyaXRlIC0gb25seSBzdGFibGUKKwkJCQkJICogaWYgZXZlcnl0aGluZyBmaXRzIGluIG9uZSBSUEMgKi8KKworCisvKgorICogTkZTIGRlYnVnIGZsYWdzCisgKi8KKyNkZWZpbmUgTkZTREJHX1ZGUwkJMHgwMDAxCisjZGVmaW5lIE5GU0RCR19ESVJDQUNIRQkJMHgwMDAyCisjZGVmaW5lIE5GU0RCR19MT09LVVBDQUNIRQkweDAwMDQKKyNkZWZpbmUgTkZTREJHX1BBR0VDQUNIRQkweDAwMDgKKyNkZWZpbmUgTkZTREJHX1BST0MJCTB4MDAxMAorI2RlZmluZSBORlNEQkdfWERSCQkweDAwMjAKKyNkZWZpbmUgTkZTREJHX0ZJTEUJCTB4MDA0MAorI2RlZmluZSBORlNEQkdfUk9PVAkJMHgwMDgwCisjZGVmaW5lIE5GU0RCR19DQUxMQkFDSwkJMHgwMTAwCisjZGVmaW5lIE5GU0RCR19DTElFTlQJCTB4MDIwMAorI2RlZmluZSBORlNEQkdfTU9VTlQJCTB4MDQwMAorI2RlZmluZSBORlNEQkdfRlNDQUNIRQkJMHgwODAwCisjZGVmaW5lIE5GU0RCR19QTkZTCQkweDEwMDAKKyNkZWZpbmUgTkZTREJHX1BORlNfTEQJCTB4MjAwMAorI2RlZmluZSBORlNEQkdfQUxMCQkweEZGRkYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzX2lkbWFwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc19pZG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Zjg0M2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc19pZG1hcC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L25mc19pZG1hcC5oCisgKgorICogIFVJRCBhbmQgR0lEIHRvIG5hbWUgbWFwcGluZyBmb3IgY2xpZW50cy4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIE1hcml1cyBBYW1vZHQgRXJpa3NlbiA8bWFyaXVzQHVtaWNoLmVkdT4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqCisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIE5GU19JRE1BUF9ICisjZGVmaW5lIE5GU19JRE1BUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBYWFggZnJvbSBiaXRzL3V0bXAuaCAgKi8KKyNkZWZpbmUgSURNQVBfTkFNRVNaICAxMjgKKworI2RlZmluZSBJRE1BUF9UWVBFX1VTRVIgIDAKKyNkZWZpbmUgSURNQVBfVFlQRV9HUk9VUCAxCisKKyNkZWZpbmUgSURNQVBfQ09OVl9JRFRPTkFNRSAwCisjZGVmaW5lIElETUFQX0NPTlZfTkFNRVRPSUQgMQorCisjZGVmaW5lIElETUFQX1NUQVRVU19JTlZBTElETVNHIDB4MDEKKyNkZWZpbmUgSURNQVBfU1RBVFVTX0FHQUlOICAgICAgMHgwMgorI2RlZmluZSBJRE1BUF9TVEFUVVNfTE9PS1VQRkFJTCAweDA0CisjZGVmaW5lIElETUFQX1NUQVRVU19TVUNDRVNTICAgIDB4MDgKKworc3RydWN0IGlkbWFwX21zZyB7CisJX191OCAgaW1fdHlwZTsKKwlfX3U4ICBpbV9jb252OworCWNoYXIgIGltX25hbWVbSURNQVBfTkFNRVNaXTsKKwlfX3UzMiBpbV9pZDsKKwlfX3U4ICBpbV9zdGF0dXM7Cit9OworCisKKyNlbmRpZiAvKiBORlNfSURNQVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNfbW91bnQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzX21vdW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2YmRkZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzX21vdW50LmgKQEAgLTAsMCArMSw3NyBAQAorI2lmbmRlZiBfTElOVVhfTkZTX01PVU5UX0gKKyNkZWZpbmUgX0xJTlVYX05GU19NT1VOVF9ICisKKy8qCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9uZnNfbW91bnQuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIFJpY2sgU2xhZGtleQorICoKKyAqICBzdHJ1Y3R1cmUgcGFzc2VkIGZyb20gdXNlci1zcGFjZSB0byBrZXJuZWwtc3BhY2UgZHVyaW5nIGFuIG5mcyBtb3VudAorICovCisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMyLmg+CisjaW5jbHVkZSA8bGludXgvbmZzMy5oPgorCisvKgorICogV0FSTklORyEgIERvIG5vdCBkZWxldGUgb3IgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGVzZSBmaWVsZHMuICBJZgorICogYSBuZXcgZmllbGQgaXMgcmVxdWlyZWQgdGhlbiBhZGQgaXQgdG8gdGhlIGVuZC4gIFRoZSB2ZXJzaW9uIGZpZWxkCisgKiB0cmFja3Mgd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50LiAgVGhpcyB3aWxsIGVuc3VyZSBzb21lIG1lYXN1cmUgb2YKKyAqIG1vdW50LXRvLWtlcm5lbCB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuICBTb21lIG9mIHRoZXNlIGFyZW4ndCB1c2VkIHlldAorICogYnV0IGhlcmUgdGhleSBhcmUgYW55d2F5LgorICovCisjZGVmaW5lIE5GU19NT1VOVF9WRVJTSU9OCTYKKyNkZWZpbmUgTkZTX01BWF9DT05URVhUX0xFTgkyNTYKKworc3RydWN0IG5mc19tb3VudF9kYXRhIHsKKwlpbnQJCXZlcnNpb247CQkvKiAxICovCisJaW50CQlmZDsJCQkvKiAxICovCisJc3RydWN0IG5mczJfZmgJb2xkX3Jvb3Q7CQkvKiAxICovCisJaW50CQlmbGFnczsJCQkvKiAxICovCisJaW50CQlyc2l6ZTsJCQkvKiAxICovCisJaW50CQl3c2l6ZTsJCQkvKiAxICovCisJaW50CQl0aW1lbzsJCQkvKiAxICovCisJaW50CQlyZXRyYW5zOwkJLyogMSAqLworCWludAkJYWNyZWdtaW47CQkvKiAxICovCisJaW50CQlhY3JlZ21heDsJCS8qIDEgKi8KKwlpbnQJCWFjZGlybWluOwkJLyogMSAqLworCWludAkJYWNkaXJtYXg7CQkvKiAxICovCisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CQkvKiAxICovCisJY2hhcgkJaG9zdG5hbWVbTkZTX01BWE5BTUxFTiArIDFdOwkJLyogMSAqLworCWludAkJbmFtbGVuOwkJCS8qIDIgKi8KKwl1bnNpZ25lZCBpbnQJYnNpemU7CQkJLyogMyAqLworCXN0cnVjdCBuZnMzX2ZoCXJvb3Q7CQkJLyogNCAqLworCWludAkJcHNldWRvZmxhdm9yOwkJLyogNSAqLworCWNoYXIJCWNvbnRleHRbTkZTX01BWF9DT05URVhUX0xFTiArIDFdOwkvKiA2ICovCit9OworCisvKiBiaXRzIGluIHRoZSBmbGFncyBmaWVsZCB2aXNpYmxlIHRvIHVzZXIgc3BhY2UgKi8KKworI2RlZmluZSBORlNfTU9VTlRfU09GVAkJMHgwMDAxCS8qIDEgKi8KKyNkZWZpbmUgTkZTX01PVU5UX0lOVFIJCTB4MDAwMgkvKiAxICovIC8qIG5vdyB1bnVzZWQsIGJ1dCBBQkkgKi8KKyNkZWZpbmUgTkZTX01PVU5UX1NFQ1VSRQkweDAwMDQJLyogMSAqLworI2RlZmluZSBORlNfTU9VTlRfUE9TSVgJCTB4MDAwOAkvKiAxICovCisjZGVmaW5lIE5GU19NT1VOVF9OT0NUTwkJMHgwMDEwCS8qIDEgKi8KKyNkZWZpbmUgTkZTX01PVU5UX05PQUMJCTB4MDAyMAkvKiAxICovCisjZGVmaW5lIE5GU19NT1VOVF9UQ1AJCTB4MDA0MAkvKiAyICovCisjZGVmaW5lIE5GU19NT1VOVF9WRVIzCQkweDAwODAJLyogMyAqLworI2RlZmluZSBORlNfTU9VTlRfS0VSQkVST1MJMHgwMTAwCS8qIDMgKi8KKyNkZWZpbmUgTkZTX01PVU5UX05PTkxNCQkweDAyMDAJLyogMyAqLworI2RlZmluZSBORlNfTU9VTlRfQlJPS0VOX1NVSUQJMHgwNDAwCS8qIDQgKi8KKyNkZWZpbmUgTkZTX01PVU5UX05PQUNMCQkweDA4MDAJLyogNCAqLworI2RlZmluZSBORlNfTU9VTlRfU1RSSUNUTE9DSwkweDEwMDAJLyogcmVzZXJ2ZWQgZm9yIE5GU3Y0ICovCisjZGVmaW5lIE5GU19NT1VOVF9TRUNGTEFWT1VSCTB4MjAwMAkvKiA1ICovCisjZGVmaW5lIE5GU19NT1VOVF9OT1JESVJQTFVTCTB4NDAwMAkvKiA1ICovCisjZGVmaW5lIE5GU19NT1VOVF9VTlNIQVJFRAkweDgwMDAJLyogNSAqLworI2RlZmluZSBORlNfTU9VTlRfRkxBR01BU0sJMHhGRkZGCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGZvciBpbnRlcm5hbCB1c2Ugb25seSAqLworI2RlZmluZSBORlNfTU9VTlRfTE9PS1VQX0NBQ0hFX05PTkVHCTB4MTAwMDAKKyNkZWZpbmUgTkZTX01PVU5UX0xPT0tVUF9DQUNIRV9OT05FCTB4MjAwMDAKKyNkZWZpbmUgTkZTX01PVU5UX05PUkVTVlBPUlQJCTB4NDAwMDAKKyNkZWZpbmUgTkZTX01PVU5UX0xFR0FDWV9JTlRFUkZBQ0UJMHg4MDAwMAorCisjZGVmaW5lIE5GU19NT1VOVF9MT0NBTF9GTE9DSwkweDEwMDAwMAorI2RlZmluZSBORlNfTU9VTlRfTE9DQUxfRkNOVEwJMHgyMDAwMDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2FjbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNhY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjVlMTlmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNhY2wuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogRmlsZTogbGludXgvbmZzYWNsLmgKKyAqCisgKiAoQykgMjAwMyBBbmRyZWFzIEdydWVuYmFjaGVyIDxhZ3J1ZW5Ac3VzZS5kZT4KKyAqLworI2lmbmRlZiBfX0xJTlVYX05GU0FDTF9ICisjZGVmaW5lIF9fTElOVVhfTkZTQUNMX0gKKworI2RlZmluZSBORlNfQUNMX1BST0dSQU0JMTAwMjI3CisKKyNkZWZpbmUgQUNMUFJPQzJfR0VUQUNMCQkxCisjZGVmaW5lIEFDTFBST0MyX1NFVEFDTAkJMgorI2RlZmluZSBBQ0xQUk9DMl9HRVRBVFRSCTMKKyNkZWZpbmUgQUNMUFJPQzJfQUNDRVNTCQk0CisKKyNkZWZpbmUgQUNMUFJPQzNfR0VUQUNMCQkxCisjZGVmaW5lIEFDTFBST0MzX1NFVEFDTAkJMgorCisKKy8qIEZsYWdzIGZvciB0aGUgZ2V0YWNsL3NldGFjbCBtb2RlICovCisjZGVmaW5lIE5GU19BQ0wJCQkweDAwMDEKKyNkZWZpbmUgTkZTX0FDTENOVAkJMHgwMDAyCisjZGVmaW5lIE5GU19ERkFDTAkJMHgwMDA0CisjZGVmaW5lIE5GU19ERkFDTENOVAkJMHgwMDA4CisKKy8qIEZsYWcgZm9yIERlZmF1bHQgQUNMIGVudHJpZXMgKi8KKyNkZWZpbmUgTkZTX0FDTF9ERUZBVUxUCQkweDEwMDAKKworI2VuZGlmICAvKiBfX0xJTlVYX05GU0FDTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2QvZGVidWcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNThjMTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2QvZGVidWcuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogbGludXgvaW5jbHVkZS9saW51eC9uZnNkL2RlYnVnLmgKKyAqCisgKiBEZWJ1Z2dpbmctcmVsYXRlZCBzdHVmZiBmb3IgbmZzZAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaWZuZGVmIExJTlVYX05GU0RfREVCVUdfSAorI2RlZmluZSBMSU5VWF9ORlNEX0RFQlVHX0gKKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9kZWJ1Zy5oPgorCisvKgorICogRW5hYmxlIGRlYnVnZ2luZyBmb3IgbmZzZC4KKyAqIFJlcXVpcmVzIFJQQ19ERUJVRy4KKyAqLworI2lmZGVmIFJQQ19ERUJVRworIyBkZWZpbmUgTkZTRF9ERUJVRwkJMQorI2VuZGlmCisKKy8qCisgKiBrbmZzZCBkZWJ1ZyBmbGFncworICovCisjZGVmaW5lIE5GU0REQkdfU09DSwkJMHgwMDAxCisjZGVmaW5lIE5GU0REQkdfRkgJCTB4MDAwMgorI2RlZmluZSBORlNEREJHX0VYUE9SVAkJMHgwMDA0CisjZGVmaW5lIE5GU0REQkdfU1ZDCQkweDAwMDgKKyNkZWZpbmUgTkZTRERCR19QUk9DCQkweDAwMTAKKyNkZWZpbmUgTkZTRERCR19GSUxFT1AJCTB4MDAyMAorI2RlZmluZSBORlNEREJHX0FVVEgJCTB4MDA0MAorI2RlZmluZSBORlNEREJHX1JFUENBQ0hFCTB4MDA4MAorI2RlZmluZSBORlNEREJHX1hEUgkJMHgwMTAwCisjZGVmaW5lIE5GU0REQkdfTE9DS0QJCTB4MDIwMAorI2RlZmluZSBORlNEREJHX0FMTAkJMHg3RkZGCisjZGVmaW5lIE5GU0REQkdfTk9DSEFOR0UJMHhGRkZGCisKKworCisjZW5kaWYgLyogTElOVVhfTkZTRF9ERUJVR19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyMDE0MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oCisgKiAKKyAqIFB1YmxpYyBkZWNsYXJhdGlvbnMgZm9yIE5GUyBleHBvcnRzLiBUaGUgZGVmaW5pdGlvbnMgZm9yIHRoZQorICogc3lzY2FsbCBpbnRlcmZhY2UgYXJlIGluIG5mc2N0bC5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2lmbmRlZiBORlNEX0VYUE9SVF9ICisjZGVmaW5lIE5GU0RfRVhQT1JUX0gKKworIyBpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogSW1wb3J0YW50IGxpbWl0cyBmb3IgdGhlIGV4cG9ydHMgc3R1ZmYuCisgKi8KKyNkZWZpbmUgTkZTQ0xOVF9JRE1BWAkJMTAyNAorI2RlZmluZSBORlNDTE5UX0FERFJNQVgJCTE2CisjZGVmaW5lIE5GU0NMTlRfS0VZTUFYCQkzMgorCisvKgorICogRXhwb3J0IGZsYWdzLgorICovCisjZGVmaW5lIE5GU0VYUF9SRUFET05MWQkJMHgwMDAxCisjZGVmaW5lIE5GU0VYUF9JTlNFQ1VSRV9QT1JUCTB4MDAwMgorI2RlZmluZSBORlNFWFBfUk9PVFNRVUFTSAkweDAwMDQKKyNkZWZpbmUgTkZTRVhQX0FMTFNRVUFTSAkweDAwMDgKKyNkZWZpbmUgTkZTRVhQX0FTWU5DCQkweDAwMTAKKyNkZWZpbmUgTkZTRVhQX0dBVEhFUkVEX1dSSVRFUwkweDAwMjAKKy8qIDQwIDgwIDEwMCBjdXJyZW50bHkgdW51c2VkICovCisjZGVmaW5lIE5GU0VYUF9OT0hJREUJCTB4MDIwMAorI2RlZmluZSBORlNFWFBfTk9TVUJUUkVFQ0hFQ0sJMHgwNDAwCisjZGVmaW5lCU5GU0VYUF9OT0FVVEhOTE0JMHgwODAwCQkvKiBEb24ndCBhdXRoZW50aWNhdGUgTkxNIHJlcXVlc3RzIC0ganVzdCB0cnVzdCAqLworI2RlZmluZSBORlNFWFBfTVNORlMJCTB4MTAwMAkvKiBkbyBzaWxseSB0aGluZ3MgdGhhdCBNUyBjbGllbnRzIGV4cGVjdDsgbm8gbG9uZ2VyIHN1cHBvcnRlZCAqLworI2RlZmluZSBORlNFWFBfRlNJRAkJMHgyMDAwCisjZGVmaW5lCU5GU0VYUF9DUk9TU01PVU5UCTB4NDAwMAorI2RlZmluZQlORlNFWFBfTk9BQ0wJCTB4ODAwMAkvKiByZXNlcnZlZCBmb3IgcG9zc2libGUgQUNMIHJlbGF0ZWQgdXNlICovCisvKgorICogVGhlIE5GU0VYUF9WNFJPT1QgZmxhZyBjYXVzZXMgdGhlIGtlcm5lbCB0byBnaXZlIGFjY2VzcyBvbmx5IHRvIE5GU3Y0CisgKiBjbGllbnRzLCBhbmQgb25seSB0byB0aGUgc2luZ2xlIGRpcmVjdG9yeSB0aGF0IGlzIHRoZSByb290IG9mIHRoZQorICogZXhwb3J0OyBmdXJ0aGVyIGxvb2t1cCBhbmQgcmVhZGRpciBvcGVyYXRpb25zIGFyZSB0cmVhdGVkIGFzIGlmIGV2ZXJ5CisgKiBzdWJkaXJlY3Rvcnkgd2FzIGEgbW91bnRwb2ludCwgYW5kIGlnbm9yZWQgaWYgdGhleSBhcmUgbm90IHRoZW1zZWx2ZXMKKyAqIGV4cG9ydGVkLiAgVGhpcyBpcyB1c2VkIGJ5IG5mc2QgYW5kIG1vdW50ZCB0byBjb25zdHJ1Y3QgdGhlIE5GU3Y0CisgKiBwc2V1ZG9maWxlc3lzdGVtLCB3aGljaCBwcm92aWRlcyBhY2Nlc3Mgb25seSB0byBwYXRocyBsZWFkaW5nIHRvIGVhY2gKKyAqIGV4cG9ydGVkIGZpbGVzeXN0ZW0uCisgKi8KKyNkZWZpbmUJTkZTRVhQX1Y0Uk9PVAkJMHgxMDAwMAorLyogQWxsIGZsYWdzIHRoYXQgd2UgY2xhaW0gdG8gc3VwcG9ydC4gIChOb3RlIHdlIGRvbid0IHN1cHBvcnQgTk9BQ0wuKSAqLworI2RlZmluZSBORlNFWFBfQUxMRkxBR1MJCTB4MTdFM0YKKworLyogVGhlIGZsYWdzIHRoYXQgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHNlY3VyaXR5IGZsYXZvcjogKi8KKyNkZWZpbmUgTkZTRVhQX1NFQ0lORk9fRkxBR1MJKE5GU0VYUF9SRUFET05MWSB8IE5GU0VYUF9ST09UU1FVQVNIIFwKKwkJCQkJfCBORlNFWFBfQUxMU1FVQVNIIFwKKwkJCQkJfCBORlNFWFBfSU5TRUNVUkVfUE9SVCkKKworCisjZW5kaWYgLyogTkZTRF9FWFBPUlRfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZmguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjgwZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZmguaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oCisgKgorICogVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgbGF5b3V0IG9mIHRoZSBmaWxlIGhhbmRsZXMgYXMgcGFzc2VkCisgKiBvdmVyIHRoZSB3aXJlLgorICoKKyAqIEVhcmxpZXIgdmVyc2lvbnMgb2Yga25mc2QgdXNlZCB0byBzaWduIGZpbGUgaGFuZGxlcyB1c2luZyBrZXllZCBNRDUKKyAqIG9yIFNIQS4gSSd2ZSByZW1vdmVkIHRoaXMgY29kZSwgYmVjYXVzZSBpdCBkb2Vzbid0IGdpdmUgeW91IG1vcmUKKyAqIHNlY3VyaXR5IHRoYW4gYmxvY2tpbmcgZXh0ZXJuYWwgYWNjZXNzIHRvIHBvcnQgMjA0OSBvbiB5b3VyIGZpcmV3YWxsLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9ORlNEX0ZIX0gKKyNkZWZpbmUgX0xJTlVYX05GU0RfRkhfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMyLmg+CisjaW5jbHVkZSA8bGludXgvbmZzMy5oPgorI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KKworLyoKKyAqIFRoaXMgaXMgdGhlIG9sZCAiZGVudHJ5IHN0eWxlIiBMaW51eCBORlN2MiBmaWxlIGhhbmRsZS4KKyAqCisgKiBUaGUgeGlubyBhbmQgeGRldiBmaWVsZHMgYXJlIGN1cnJlbnRseSB1c2VkIHRvIHRyYW5zcG9ydCB0aGUKKyAqIGluby9kZXYgb2YgdGhlIGV4cG9ydGVkIGlub2RlLgorICovCitzdHJ1Y3QgbmZzX2ZoYmFzZV9vbGQgeworCV9fdTMyCQlmYl9kY29va2llOwkvKiBkZW50cnkgY29va2llIC0gYWx3YXlzIDB4ZmVlYmJhY2EgKi8KKwlfX3UzMgkJZmJfaW5vOwkJLyogb3VyIGlub2RlIG51bWJlciAqLworCV9fdTMyCQlmYl9kaXJpbm87CS8qIGRpciBpbm9kZSBudW1iZXIsIDAgZm9yIGRpcmVjdG9yaWVzICovCisJX191MzIJCWZiX2RldjsJCS8qIG91ciBkZXZpY2UgKi8KKwlfX3UzMgkJZmJfeGRldjsKKwlfX3UzMgkJZmJfeGlubzsKKwlfX3UzMgkJZmJfZ2VuZXJhdGlvbjsKK307CisKKy8qCisgKiBUaGlzIGlzIHRoZSBuZXcgZmxleGlibGUsIGV4dGVuc2libGUgc3R5bGUgTkZTdjIvdjMgZmlsZSBoYW5kbGUuCisgKiBieSBOZWlsIEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+IC0gTWFyY2ggMjAwMAorICoKKyAqIFRoZSBmaWxlIGhhbmRsZSBzdGFydHMgd2l0aCBhIHNlcXVlbmNlIG9mIGZvdXItYnl0ZSB3b3Jkcy4KKyAqIFRoZSBmaXJzdCB3b3JkIGNvbnRhaW5zIGEgdmVyc2lvbiBudW1iZXIgKDEpIGFuZCB0aHJlZSBkZXNjcmlwdG9yIGJ5dGVzCisgKiB0aGF0IHRlbGwgaG93IHRoZSByZW1haW5pbmcgMyB2YXJpYWJsZSBsZW5ndGggZmllbGRzIHNob3VsZCBiZSBoYW5kbGVkLgorICogVGhlc2UgdGhyZWUgYnl0ZXMgYXJlIGF1dGhfdHlwZSwgZnNpZF90eXBlIGFuZCBmaWxlaWRfdHlwZS4KKyAqCisgKiBBbGwgZm91ci1ieXRlIHZhbHVlcyBhcmUgaW4gaG9zdC1ieXRlLW9yZGVyLgorICoKKyAqIFRoZSBhdXRoX3R5cGUgZmllbGQgc3BlY2lmaWVzIGhvdyB0aGUgZmlsZWhhbmRsZSBjYW4gYmUgYXV0aGVudGljYXRlZAorICogVGhpcyBtaWdodCBhbGxvdyBhIGZpbGUgdG8gYmUgY29uZmlybWVkIHRvIGJlIGluIGEgd3JpdGFibGUgcGFydCBvZiBhCisgKiBmaWxldHJlZSB3aXRob3V0IGNoZWNraW5nIHRoZSBwYXRoIGZyb20gaXQgdXAgdG8gdGhlIHJvb3QuCisgKiBDdXJyZW50IHZhbHVlczoKKyAqICAgICAwICAtIE5vIGF1dGhlbnRpY2F0aW9uLiAgZmJfYXV0aCBpcyAwIGJ5dGVzIGxvbmcKKyAqIFBvc3NpYmxlIGZ1dHVyZSB2YWx1ZXM6CisgKiAgICAgMSAgLSA0IGJ5dGVzIHRha2VuIGZyb20gTUQ1IGhhc2ggb2YgdGhlIHJlbWFpbmVyIG9mIHRoZSBmaWxlIGhhbmRsZQorICogICAgICAgICAgcHJlZml4ZWQgYnkgYSBzZWNyZXQgYW5kIHdpdGggdGhlIGltcG9ydGFudCBleHBvcnQgZmxhZ3MuCisgKgorICogVGhlIGZzaWRfdHlwZSBpZGVudGlmaWVzIGhvdyB0aGUgZmlsZXN5c3RlbSAob3IgZXhwb3J0IHBvaW50KSBpcworICogICAgZW5jb2RlZC4KKyAqICBDdXJyZW50IHZhbHVlczoKKyAqICAgICAwICAtIDQgYnl0ZSBkZXZpY2UgaWQgKG1zLTItYnl0ZXMgbWFqb3IsIGxzLTItYnl0ZXMgbWlub3IpLCA0Ynl0ZSBpbm9kZSBudW1iZXIKKyAqICAgICAgICBOT1RFOiB3ZSBjYW5ub3QgdXNlIHRoZSBrZGV2X3QgZGV2aWNlIGlkIHZhbHVlLCBiZWNhdXNlIGtkZXZfdC5oCisgKiAgICAgICAgICAgICAgc2F5cyB3ZSBtdXN0bid0LiAgV2UgbXVzdCBicmVhayBpdCB1cCBhbmQgcmVhc3NlbWJsZS4KKyAqICAgICAxICAtIDQgYnl0ZSB1c2VyIHNwZWNpZmllZCBpZGVudGlmaWVyCisgKiAgICAgMiAgLSA0IGJ5dGUgbWFqb3IsIDQgYnl0ZSBtaW5vciwgNCBieXRlIGlub2RlIG51bWJlciAtIERFUFJFQ0FURUQKKyAqICAgICAzICAtIDQgYnl0ZSBkZXZpY2UgaWQsIGVuY29kZWQgZm9yIHVzZXItc3BhY2UsIDQgYnl0ZSBpbm9kZSBudW1iZXIKKyAqICAgICA0ICAtIDQgYnl0ZSBpbm9kZSBudW1iZXIgYW5kIDQgYnl0ZSB1dWlkCisgKiAgICAgNSAgLSA4IGJ5dGUgdXVpZAorICogICAgIDYgIC0gMTYgYnl0ZSB1dWlkCisgKiAgICAgNyAgLSA4IGJ5dGUgaW5vZGUgbnVtYmVyIGFuZCAxNiBieXRlIHV1aWQKKyAqCisgKiBUaGUgZmlsZWlkX3R5cGUgaWRlbnRpZmllZCBob3cgdGhlIGZpbGUgd2l0aGluIHRoZSBmaWxlc3lzdGVtIGlzIGVuY29kZWQuCisgKiBUaGlzIGlzICh3aWxsIGJlKSBwYXNzZWQgdG8sIGFuZCBzZXQgYnksIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gaWYgaXQgc3VwcG9ydHMKKyAqIGZpbGVoYW5kbGUgb3BlcmF0aW9ucy4gIFRoZSBmaWxlc3lzdGVtIG11c3Qgbm90IHVzZSB0aGUgdmFsdWUgJzAnIG9yICcweGZmJyBhbmQgbWF5CisgKiBvbmx5IHVzZSB0aGUgdmFsdWVzIDEgYW5kIDIgYXMgZGVmaW5lZCBiZWxvdzoKKyAqICBDdXJyZW50IHZhbHVlczoKKyAqICAgIDAgICAtIFRoZSByb290LCBvciBleHBvcnQgcG9pbnQsIG9mIHRoZSBmaWxlc3lzdGVtLiAgZmJfZmlsZWlkIGlzIDAgYnl0ZXMuCisgKiAgICAxICAgLSAzMmJpdCBpbm9kZSBudW1iZXIsIDMyIGJpdCBnZW5lcmF0aW9uIG51bWJlci4KKyAqICAgIDIgICAtIDMyYml0IGlub2RlIG51bWJlciwgMzIgYml0IGdlbmVyYXRpb24gbnVtYmVyLCAzMiBiaXQgcGFyZW50IGRpcmVjdG9yeSBpbm9kZSBudW1iZXIuCisgKgorICovCitzdHJ1Y3QgbmZzX2ZoYmFzZV9uZXcgeworCV9fdTgJCWZiX3ZlcnNpb247CS8qID09IDEsIGV2ZW4gPT4gbmZzX2ZoYmFzZV9vbGQgKi8KKwlfX3U4CQlmYl9hdXRoX3R5cGU7CisJX191OAkJZmJfZnNpZF90eXBlOworCV9fdTgJCWZiX2ZpbGVpZF90eXBlOworCV9fdTMyCQlmYl9hdXRoWzFdOworLyoJX191MzIJCWZiX2ZzaWRbMF07IGZsb2F0aW5nICovCisvKglfX3UzMgkJZmJfZmlsZWlkWzBdOyBmbG9hdGluZyAqLworfTsKKworc3RydWN0IGtuZnNkX2ZoIHsKKwl1bnNpZ25lZCBpbnQJZmhfc2l6ZTsJLyogc2lnbmlmaWNhbnQgZm9yIE5GU3YzLgorCQkJCQkgKiBQb2ludHMgdG8gdGhlIGN1cnJlbnQgc2l6ZSB3aGlsZSBidWlsZGluZworCQkJCQkgKiBhIG5ldyBmaWxlIGhhbmRsZQorCQkJCQkgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBuZnNfZmhiYXNlX29sZAlmaF9vbGQ7CisJCV9fdTMyCQkJZmhfcGFkW05GUzRfRkhTSVpFLzRdOworCQlzdHJ1Y3QgbmZzX2ZoYmFzZV9uZXcJZmhfbmV3OworCX0gZmhfYmFzZTsKK307CisKKyNkZWZpbmUgb2ZoX2Rjb29raWUJCWZoX2Jhc2UuZmhfb2xkLmZiX2Rjb29raWUKKyNkZWZpbmUgb2ZoX2lubwkJCWZoX2Jhc2UuZmhfb2xkLmZiX2lubworI2RlZmluZSBvZmhfZGlyaW5vCQlmaF9iYXNlLmZoX29sZC5mYl9kaXJpbm8KKyNkZWZpbmUgb2ZoX2RldgkJCWZoX2Jhc2UuZmhfb2xkLmZiX2RldgorI2RlZmluZSBvZmhfeGRldgkJZmhfYmFzZS5maF9vbGQuZmJfeGRldgorI2RlZmluZSBvZmhfeGlubwkJZmhfYmFzZS5maF9vbGQuZmJfeGlubworI2RlZmluZSBvZmhfZ2VuZXJhdGlvbgkJZmhfYmFzZS5maF9vbGQuZmJfZ2VuZXJhdGlvbgorCisjZGVmaW5lCWZoX3ZlcnNpb24JCWZoX2Jhc2UuZmhfbmV3LmZiX3ZlcnNpb24KKyNkZWZpbmUJZmhfZnNpZF90eXBlCQlmaF9iYXNlLmZoX25ldy5mYl9mc2lkX3R5cGUKKyNkZWZpbmUJZmhfYXV0aF90eXBlCQlmaF9iYXNlLmZoX25ldy5mYl9hdXRoX3R5cGUKKyNkZWZpbmUJZmhfZmlsZWlkX3R5cGUJCWZoX2Jhc2UuZmhfbmV3LmZiX2ZpbGVpZF90eXBlCisjZGVmaW5lCWZoX2F1dGgJCQlmaF9iYXNlLmZoX25ldy5mYl9hdXRoCisjZGVmaW5lCWZoX2ZzaWQJCQlmaF9iYXNlLmZoX25ldy5mYl9hdXRoCisKKworCisjZW5kaWYgLyogX0xJTlVYX05GU0RfRkhfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzAyNGU4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRzLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvbGludXgvbmZzZC9zdGF0cy5oCisgKgorICogU3RhdGlzdGljcyBmb3IgTkZTIHNlcnZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2lmbmRlZiBMSU5VWF9ORlNEX1NUQVRTX0gKKyNkZWZpbmUgTElOVVhfTkZTRF9TVEFUU19ICisKKyNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CisKKy8qIHRocmVhZCB1c2FnZSB3cmFwcyB2ZXJ5IG1pbGxpb24gc2Vjb25kcyAoYXBwcm94IG9uZSBmb3J0bmlnaHQpICovCisjZGVmaW5lCU5GU0RfVVNBR0VfV1JBUAkoSFoqMTAwMDAwMCkKKworI2VuZGlmIC8qIExJTlVYX05GU0RfU1RBVFNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ubDgwMjExLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25sODAyMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQ5YmY3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ubDgwMjExLmgKQEAgLTAsMCArMSwyNjUzIEBACisjaWZuZGVmIF9fTElOVVhfTkw4MDIxMV9ICisjZGVmaW5lIF9fTElOVVhfTkw4MDIxMV9ICisvKgorICogODAyLjExIG5ldGxpbmsgaW50ZXJmYWNlIHB1YmxpYyBoZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNi0yMDEwIEpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisgKiBDb3B5cmlnaHQgMjAwOCBNaWNoYWVsIFd1IDxmbGFtaW5naWNlQHNvdXJtaWxrLm5ldD4KKyAqIENvcHlyaWdodCAyMDA4IEx1aXMgQ2FybG9zIENvYm8gPGx1aXNjYUBjb3p5Yml0LmNvbT4KKyAqIENvcHlyaWdodCAyMDA4IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CisgKiBDb3B5cmlnaHQgMjAwOCwgMjAwOSBMdWlzIFIuIFJvZHJpZ3VleiA8bHJvZHJpZ3VlekBhdGhlcm9zLmNvbT4KKyAqIENvcHlyaWdodCAyMDA4IEpvdW5pIE1hbGluZW4gPGpvdW5pLm1hbGluZW5AYXRoZXJvcy5jb20+CisgKiBDb3B5cmlnaHQgMjAwOCBDb2xpbiBNY0NhYmUgPGNvbGluQGNvenliaXQuY29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoqCisgKiBET0M6IFN0YXRpb24gaGFuZGxpbmcKKyAqCisgKiBTdGF0aW9ucyBhcmUgYWRkZWQgcGVyIGludGVyZmFjZSwgYnV0IGEgc3BlY2lhbCBjYXNlIGV4aXN0cyB3aXRoIFZMQU4KKyAqIGludGVyZmFjZXMuIFdoZW4gYSBzdGF0aW9uIGlzIGJvdW5kIHRvIGFuIEFQIGludGVyZmFjZSwgaXQgbWF5IGJlIG1vdmVkCisgKiBpbnRvIGEgVkxBTiBpZGVudGlmaWVkIGJ5IGEgVkxBTiBpbnRlcmZhY2UgaW5kZXggKCVOTDgwMjExX0FUVFJfU1RBX1ZMQU4pLgorICogVGhlIHN0YXRpb24gaXMgc3RpbGwgYXNzdW1lZCB0byBiZWxvbmcgdG8gdGhlIEFQIGludGVyZmFjZSBpdCB3YXMgYWRkZWQKKyAqIHRvLgorICoKKyAqIFRPRE86IG5lZWQgbW9yZSBpbmZvPworICovCisKKy8qKgorICogRE9DOiBGcmFtZSB0cmFuc21pc3Npb24vcmVnaXN0cmF0aW9uIHN1cHBvcnQKKyAqCisgKiBGcmFtZSB0cmFuc21pc3Npb24gYW5kIHJlZ2lzdHJhdGlvbiBzdXBwb3J0IGV4aXN0cyB0byBhbGxvdyB1c2Vyc3BhY2UKKyAqIG1hbmFnZW1lbnQgZW50aXRpZXMgc3VjaCBhcyB3cGFfc3VwcGxpY2FudCByZWFjdCB0byBtYW5hZ2VtZW50IGZyYW1lcworICogdGhhdCBhcmUgbm90IGJlaW5nIGhhbmRsZWQgYnkgdGhlIGtlcm5lbC4gVGhpcyBpbmNsdWRlcywgZm9yIGV4YW1wbGUsCisgKiBjZXJ0YWluIGNsYXNzZXMgb2YgYWN0aW9uIGZyYW1lcyB0aGF0IGNhbm5vdCBiZSBoYW5kbGVkIGluIHRoZSBrZXJuZWwKKyAqIGZvciB2YXJpb3VzIHJlYXNvbnMuCisgKgorICogRnJhbWUgcmVnaXN0cmF0aW9uIGlzIGRvbmUgb24gYSBwZXItaW50ZXJmYWNlIGJhc2lzIGFuZCByZWdpc3RyYXRpb25zCisgKiBjYW5ub3QgYmUgcmVtb3ZlZCBvdGhlciB0aGFuIGJ5IGNsb3NpbmcgdGhlIHNvY2tldC4gSXQgaXMgcG9zc2libGUgdG8KKyAqIHNwZWNpZnkgYSByZWdpc3RyYXRpb24gZmlsdGVyIHRvIHJlZ2lzdGVyLCBmb3IgZXhhbXBsZSwgb25seSBmb3IgYQorICogY2VydGFpbiB0eXBlIG9mIGFjdGlvbiBmcmFtZS4gSW4gcGFydGljdWxhciB3aXRoIGFjdGlvbiBmcmFtZXMsIHRob3NlCisgKiB0aGF0IHVzZXJzcGFjZSByZWdpc3RlcnMgZm9yIHdpbGwgbm90IGJlIHJldHVybmVkIGFzIHVuaGFuZGxlZCBieSB0aGUKKyAqIGRyaXZlciwgc28gdGhhdCB0aGUgcmVnaXN0ZXJlZCBhcHBsaWNhdGlvbiBoYXMgdG8gdGFrZSByZXNwb25zaWJpbGl0eQorICogZm9yIGRvaW5nIHRoYXQuCisgKgorICogVGhlIHR5cGUgb2YgZnJhbWUgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBmb3IgaXMgYWxzbyBkZXBlbmRlbnQgb24gdGhlCisgKiBkcml2ZXIgYW5kIGludGVyZmFjZSB0eXBlLiBUaGUgZnJhbWUgdHlwZXMgYXJlIGFkdmVydGlzZWQgaW4gd2lwaHkKKyAqIGF0dHJpYnV0ZXMgc28gYXBwbGljYXRpb25zIGtub3cgd2hhdCB0byBleHBlY3QuCisgKgorICogTk9URTogV2hlbiBhbiBpbnRlcmZhY2UgY2hhbmdlcyB0eXBlIHdoaWxlIHJlZ2lzdHJhdGlvbnMgYXJlIGFjdGl2ZSwKKyAqICAgICAgIHRoZXNlIHJlZ2lzdHJhdGlvbnMgYXJlIGlnbm9yZWQgdW50aWwgdGhlIGludGVyZmFjZSB0eXBlIGlzCisgKiAgICAgICBjaGFuZ2VkIGFnYWluLiBUaGlzIG1lYW5zIHRoYXQgY2hhbmdpbmcgdGhlIGludGVyZmFjZSB0eXBlIGNhbgorICogICAgICAgbGVhZCB0byBhIHNpdHVhdGlvbiB0aGF0IGNvdWxkbid0IG90aGVyd2lzZSBiZSBwcm9kdWNlZCwgYnV0CisgKiAgICAgICBhbnkgc3VjaCByZWdpc3RyYXRpb25zIHdpbGwgYmUgZG9ybWFudCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5CisgKiAgICAgICB3aWxsIG5vdCBiZSBzZXJ2aWNlZCwgaS5lLiB0aGV5IHdpbGwgbm90IHJlY2VpdmUgYW55IGZyYW1lcy4KKyAqCisgKiBGcmFtZSB0cmFuc21pc3Npb24gYWxsb3dzIHVzZXJzcGFjZSB0byBzZW5kIGZvciBleGFtcGxlIHRoZSByZXF1aXJlZAorICogcmVzcG9uc2VzIHRvIGFjdGlvbiBmcmFtZXMuIEl0IGlzIHN1YmplY3QgdG8gc29tZSBzYW5pdHkgY2hlY2tpbmcsCisgKiBidXQgbWFueSBmcmFtZXMgY2FuIGJlIHRyYW5zbWl0dGVkLiBXaGVuIGEgZnJhbWUgd2FzIHRyYW5zbWl0dGVkLCBpdHMKKyAqIHN0YXR1cyBpcyBpbmRpY2F0ZWQgdG8gdGhlIHNlbmRpbmcgc29ja2V0LgorICoKKyAqIEZvciBtb3JlIHRlY2huaWNhbCBkZXRhaWxzLCBzZWUgdGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZCBkZXNjcmlwdGlvbnMKKyAqIGJlbG93LgorICovCisKKy8qKgorICogRE9DOiBWaXJ0dWFsIGludGVyZmFjZSAvIGNvbmN1cnJlbmN5IGNhcGFiaWxpdGllcworICoKKyAqIFNvbWUgZGV2aWNlcyBhcmUgYWJsZSB0byBvcGVyYXRlIHdpdGggdmlydHVhbCBNQUNzLCB0aGV5IGNhbiBoYXZlCisgKiBtb3JlIHRoYW4gb25lIHZpcnR1YWwgaW50ZXJmYWNlLiBUaGUgY2FwYWJpbGl0eSBoYW5kbGluZyBmb3IgdGhpcworICogaXMgYSBiaXQgY29tcGxleCB0aG91Z2gsIGFzIHRoZXJlIG1heSBiZSBhIG51bWJlciBvZiByZXN0cmljdGlvbnMKKyAqIG9uIHRoZSB0eXBlcyBvZiBjb25jdXJyZW5jeSB0aGF0IGFyZSBzdXBwb3J0ZWQuCisgKgorICogVG8gc3RhcnQgd2l0aCwgZWFjaCBkZXZpY2Ugc3VwcG9ydHMgdGhlIGludGVyZmFjZSB0eXBlcyBsaXN0ZWQgaW4KKyAqIHRoZSAlTkw4MDIxMV9BVFRSX1NVUFBPUlRFRF9JRlRZUEVTIGF0dHJpYnV0ZSwgYnV0IGJ5IGxpc3RpbmcgdGhlCisgKiB0eXBlcyB0aGVyZSBubyBjb25jdXJyZW5jeSBpcyBpbXBsaWVkLgorICoKKyAqIE9uY2UgY29uY3VycmVuY3kgaXMgZGVzaXJlZCwgbW9yZSBhdHRyaWJ1dGVzIG11c3QgYmUgb2JzZXJ2ZWQ6CisgKiBUbyBzdGFydCB3aXRoLCBzaW5jZSBzb21lIGludGVyZmFjZSB0eXBlcyBhcmUgcHVyZWx5IG1hbmFnZWQgaW4KKyAqIHNvZnR3YXJlLCBsaWtlIHRoZSBBUC1WTEFOIHR5cGUgaW4gbWFjODAyMTEgZm9yIGV4YW1wbGUsIHRoZXJlJ3MKKyAqIGFuIGFkZGl0aW9uYWwgbGlzdCBvZiB0aGVzZSwgdGhleSBjYW4gYmUgYWRkZWQgYXQgYW55IHRpbWUgYW5kCisgKiBhcmUgb25seSByZXN0cmljdGVkIGJ5IHNvbWUgc2VtYW50aWMgcmVzdHJpY3Rpb25zIChlLmcuIEFQLVZMQU4KKyAqIGNhbm5vdCBiZSBhZGRlZCB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBBUCBpbnRlcmZhY2UpLiBUaGlzIGxpc3QKKyAqIGlzIGV4cG9ydGVkIGluIHRoZSAlTkw4MDIxMV9BVFRSX1NPRlRXQVJFX0lGVFlQRVMgYXR0cmlidXRlLgorICoKKyAqIEZ1cnRoZXIsIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBjb21iaW5hdGlvbnMgaXMgZXhwb3J0ZWQuIFRoaXMgaXMKKyAqIGluIHRoZSAlTkw4MDIxMV9BVFRSX0lOVEVSRkFDRV9DT01CSU5BVElPTlMgYXR0cmlidXRlLiBCYXNpY2FsbHksCisgKiBpdCBleHBvcnRzIGEgbGlzdCBvZiAiZ3JvdXBzIiwgYW5kIGF0IGFueSBwb2ludCBpbiB0aW1lIHRoZQorICogaW50ZXJmYWNlcyB0aGF0IGFyZSBjdXJyZW50bHkgYWN0aXZlIG11c3QgZmFsbCBpbnRvIGFueSBvbmUgb2YKKyAqIHRoZSBhZHZlcnRpc2VkIGdyb3Vwcy4gV2l0aGluIGVhY2ggZ3JvdXAsIHRoZXJlIGFyZSByZXN0cmljdGlvbnMKKyAqIG9uIHRoZSBudW1iZXIgb2YgaW50ZXJmYWNlcyBvZiBkaWZmZXJlbnQgdHlwZXMgdGhhdCBhcmUgc3VwcG9ydGVkCisgKiBhbmQgYWxzbyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBjaGFubmVscywgYWxvbmcgd2l0aCBwb3RlbnRpYWxseQorICogc29tZSBvdGhlciByZXN0cmljdGlvbnMuIFNlZSAmZW51bSBubDgwMjExX2lmX2NvbWJpbmF0aW9uX2F0dHJzLgorICoKKyAqIEFsbCB0b2dldGhlciwgdGhlc2UgYXR0cmlidXRlcyBkZWZpbmUgdGhlIGNvbmN1cnJlbmN5IG9mIHZpcnR1YWwKKyAqIGludGVyZmFjZXMgdGhhdCBhIGdpdmVuIGRldmljZSBzdXBwb3J0cy4KKyAqLworCisvKioKKyAqIGVudW0gbmw4MDIxMV9jb21tYW5kcyAtIHN1cHBvcnRlZCBubDgwMjExIGNvbW1hbmRzCisgKgorICogQE5MODAyMTFfQ01EX1VOU1BFQzogdW5zcGVjaWZpZWQgY29tbWFuZCB0byBjYXRjaCBlcnJvcnMKKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX1dJUEhZOiByZXF1ZXN0IGluZm9ybWF0aW9uIGFib3V0IGEgd2lwaHkgb3IgZHVtcCByZXF1ZXN0CisgKgl0byBnZXQgYSBsaXN0IG9mIGFsbCBwcmVzZW50IHdpcGh5cy4KKyAqIEBOTDgwMjExX0NNRF9TRVRfV0lQSFk6IHNldCB3aXBoeSBwYXJhbWV0ZXJzLCBuZWVkcyAlTkw4MDIxMV9BVFRSX1dJUEhZIG9yCisgKgklTkw4MDIxMV9BVFRSX0lGSU5ERVg7IGNhbiBiZSB1c2VkIHRvIHNldCAlTkw4MDIxMV9BVFRSX1dJUEhZX05BTUUsCisgKgklTkw4MDIxMV9BVFRSX1dJUEhZX1RYUV9QQVJBTVMsICVOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSwKKyAqCSVOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFLCAlTkw4MDIxMV9BVFRSX1dJUEhZX1JFVFJZX1NIT1JULAorICoJJU5MODAyMTFfQVRUUl9XSVBIWV9SRVRSWV9MT05HLCAlTkw4MDIxMV9BVFRSX1dJUEhZX0ZSQUdfVEhSRVNIT0xELAorICoJYW5kL29yICVOTDgwMjExX0FUVFJfV0lQSFlfUlRTX1RIUkVTSE9MRC4KKyAqCUhvd2V2ZXIsIGZvciBzZXR0aW5nIHRoZSBjaGFubmVsLCBzZWUgJU5MODAyMTFfQ01EX1NFVF9DSEFOTkVMCisgKglpbnN0ZWFkLCB0aGUgc3VwcG9ydCBoZXJlIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkuCisgKiBATkw4MDIxMV9DTURfTkVXX1dJUEhZOiBOZXdseSBjcmVhdGVkIHdpcGh5LCByZXNwb25zZSB0byBnZXQgcmVxdWVzdAorICoJb3IgcmVuYW1lIG5vdGlmaWNhdGlvbi4gSGFzIGF0dHJpYnV0ZXMgJU5MODAyMTFfQVRUUl9XSVBIWSBhbmQKKyAqCSVOTDgwMjExX0FUVFJfV0lQSFlfTkFNRS4KKyAqIEBOTDgwMjExX0NNRF9ERUxfV0lQSFk6IFdpcGh5IGRlbGV0ZWQuIEhhcyBhdHRyaWJ1dGVzCisgKgklTkw4MDIxMV9BVFRSX1dJUEhZIGFuZCAlTkw4MDIxMV9BVFRSX1dJUEhZX05BTUUuCisgKgorICogQE5MODAyMTFfQ01EX0dFVF9JTlRFUkZBQ0U6IFJlcXVlc3QgYW4gaW50ZXJmYWNlJ3MgY29uZmlndXJhdGlvbjsKKyAqCWVpdGhlciBhIGR1bXAgcmVxdWVzdCBvbiBhICVOTDgwMjExX0FUVFJfV0lQSFkgb3IgYSBzcGVjaWZpYyBnZXQKKyAqCW9uIGFuICVOTDgwMjExX0FUVFJfSUZJTkRFWCBpcyBzdXBwb3J0ZWQuCisgKiBATkw4MDIxMV9DTURfU0VUX0lOVEVSRkFDRTogU2V0IHR5cGUgb2YgYSB2aXJ0dWFsIGludGVyZmFjZSwgcmVxdWlyZXMKKyAqCSVOTDgwMjExX0FUVFJfSUZJTkRFWCBhbmQgJU5MODAyMTFfQVRUUl9JRlRZUEUuCisgKiBATkw4MDIxMV9DTURfTkVXX0lOVEVSRkFDRTogTmV3bHkgY3JlYXRlZCB2aXJ0dWFsIGludGVyZmFjZSBvciByZXNwb25zZQorICoJdG8gJU5MODAyMTFfQ01EX0dFVF9JTlRFUkZBQ0UuIEhhcyAlTkw4MDIxMV9BVFRSX0lGSU5ERVgsCisgKgklTkw4MDIxMV9BVFRSX1dJUEhZIGFuZCAlTkw4MDIxMV9BVFRSX0lGVFlQRSBhdHRyaWJ1dGVzLiBDYW4gYWxzbworICoJYmUgc2VudCBmcm9tIHVzZXJzcGFjZSB0byByZXF1ZXN0IGNyZWF0aW9uIG9mIGEgbmV3IHZpcnR1YWwgaW50ZXJmYWNlLAorICoJdGhlbiByZXF1aXJlcyBhdHRyaWJ1dGVzICVOTDgwMjExX0FUVFJfV0lQSFksICVOTDgwMjExX0FUVFJfSUZUWVBFIGFuZAorICoJJU5MODAyMTFfQVRUUl9JRk5BTUUuCisgKiBATkw4MDIxMV9DTURfREVMX0lOVEVSRkFDRTogVmlydHVhbCBpbnRlcmZhY2Ugd2FzIGRlbGV0ZWQsIGhhcyBhdHRyaWJ1dGVzCisgKgklTkw4MDIxMV9BVFRSX0lGSU5ERVggYW5kICVOTDgwMjExX0FUVFJfV0lQSFkuIENhbiBhbHNvIGJlIHNlbnQgZnJvbQorICoJdXNlcnNwYWNlIHRvIHJlcXVlc3QgZGVsZXRpb24gb2YgYSB2aXJ0dWFsIGludGVyZmFjZSwgdGhlbiByZXF1aXJlcworICoJYXR0cmlidXRlICVOTDgwMjExX0FUVFJfSUZJTkRFWC4KKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX0tFWTogR2V0IHNlcXVlbmNlIGNvdW50ZXIgaW5mb3JtYXRpb24gZm9yIGEga2V5IHNwZWNpZmllZAorICoJYnkgJU5MODAyMTFfQVRUUl9LRVlfSURYIGFuZC9vciAlTkw4MDIxMV9BVFRSX01BQy4KKyAqIEBOTDgwMjExX0NNRF9TRVRfS0VZOiBTZXQga2V5IGF0dHJpYnV0ZXMgJU5MODAyMTFfQVRUUl9LRVlfREVGQVVMVCwKKyAqCSVOTDgwMjExX0FUVFJfS0VZX0RFRkFVTFRfTUdNVCwgb3IgJU5MODAyMTFfQVRUUl9LRVlfVEhSRVNIT0xELgorICogQE5MODAyMTFfQ01EX05FV19LRVk6IGFkZCBhIGtleSB3aXRoIGdpdmVuICVOTDgwMjExX0FUVFJfS0VZX0RBVEEsCisgKgklTkw4MDIxMV9BVFRSX0tFWV9JRFgsICVOTDgwMjExX0FUVFJfTUFDLCAlTkw4MDIxMV9BVFRSX0tFWV9DSVBIRVIsCisgKglhbmQgJU5MODAyMTFfQVRUUl9LRVlfU0VRIGF0dHJpYnV0ZXMuCisgKiBATkw4MDIxMV9DTURfREVMX0tFWTogZGVsZXRlIGEga2V5IGlkZW50aWZpZWQgYnkgJU5MODAyMTFfQVRUUl9LRVlfSURYCisgKglvciAlTkw4MDIxMV9BVFRSX01BQy4KKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX0JFQUNPTjogcmV0cmlldmUgYmVhY29uIGluZm9ybWF0aW9uIChyZXR1cm5lZCBpbiBhCisgKgklTkw4MDIyMl9DTURfTkVXX0JFQUNPTiBtZXNzYWdlKQorICogQE5MODAyMTFfQ01EX1NFVF9CRUFDT046IHNldCB0aGUgYmVhY29uIG9uIGFuIGFjY2VzcyBwb2ludCBpbnRlcmZhY2UKKyAqCXVzaW5nIHRoZSAlTkw4MDIxMV9BVFRSX0JFQUNPTl9JTlRFUlZBTCwgJU5MODAyMTFfQVRUUl9EVElNX1BFUklPRCwKKyAqCSVOTDgwMjExX0FUVFJfQkVBQ09OX0hFQUQgYW5kICVOTDgwMjExX0FUVFJfQkVBQ09OX1RBSUwgYXR0cmlidXRlcy4KKyAqCUZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBwcm92aWRlZCBmb3IgZHJpdmVycyB0aGF0IGdlbmVyYXRlIGZ1bGwgQmVhY29uCisgKglhbmQgUHJvYmUgUmVzcG9uc2UgZnJhbWVzIGludGVybmFsbHk6ICVOTDgwMjExX0FUVFJfU1NJRCwKKyAqCSVOTDgwMjExX0FUVFJfSElEREVOX1NTSUQsICVOTDgwMjExX0FUVFJfQ0lQSEVSU19QQUlSV0lTRSwKKyAqCSVOTDgwMjExX0FUVFJfQ0lQSEVSX0dST1VQLCAlTkw4MDIxMV9BVFRSX1dQQV9WRVJTSU9OUywKKyAqCSVOTDgwMjExX0FUVFJfQUtNX1NVSVRFUywgJU5MODAyMTFfQVRUUl9QUklWQUNZLAorICoJJU5MODAyMTFfQVRUUl9BVVRIX1RZUEUsICVOTDgwMjExX0FUVFJfSUUsICVOTDgwMjExX0FUVFJfSUVfUFJPQkVfUkVTUCwKKyAqCSVOTDgwMjExX0FUVFJfSUVfQVNTT0NfUkVTUC4KKyAqIEBOTDgwMjExX0NNRF9ORVdfQkVBQ09OOiBhZGQgYSBuZXcgYmVhY29uIHRvIGFuIGFjY2VzcyBwb2ludCBpbnRlcmZhY2UsCisgKglwYXJhbWV0ZXJzIGFyZSBsaWtlIGZvciAlTkw4MDIxMV9DTURfU0VUX0JFQUNPTi4KKyAqIEBOTDgwMjExX0NNRF9ERUxfQkVBQ09OOiByZW1vdmUgdGhlIGJlYWNvbiwgc3RvcCBzZW5kaW5nIGl0CisgKgorICogQE5MODAyMTFfQ01EX0dFVF9TVEFUSU9OOiBHZXQgc3RhdGlvbiBhdHRyaWJ1dGVzIGZvciBzdGF0aW9uIGlkZW50aWZpZWQgYnkKKyAqCSVOTDgwMjExX0FUVFJfTUFDIG9uIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllZCBieSAlTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKiBATkw4MDIxMV9DTURfU0VUX1NUQVRJT046IFNldCBzdGF0aW9uIGF0dHJpYnV0ZXMgZm9yIHN0YXRpb24gaWRlbnRpZmllZCBieQorICoJJU5MODAyMTFfQVRUUl9NQUMgb24gdGhlIGludGVyZmFjZSBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWC4KKyAqIEBOTDgwMjExX0NNRF9ORVdfU1RBVElPTjogQWRkIGEgc3RhdGlvbiB3aXRoIGdpdmVuIGF0dHJpYnV0ZXMgdG8gdGhlCisgKgl0aGUgaW50ZXJmYWNlIGlkZW50aWZpZWQgYnkgJU5MODAyMTFfQVRUUl9JRklOREVYLgorICogQE5MODAyMTFfQ01EX0RFTF9TVEFUSU9OOiBSZW1vdmUgYSBzdGF0aW9uIGlkZW50aWZpZWQgYnkgJU5MODAyMTFfQVRUUl9NQUMKKyAqCW9yLCBpZiBubyBNQUMgYWRkcmVzcyBnaXZlbiwgYWxsIHN0YXRpb25zLCBvbiB0aGUgaW50ZXJmYWNlIGlkZW50aWZpZWQKKyAqCWJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWC4KKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX01QQVRIOiBHZXQgbWVzaCBwYXRoIGF0dHJpYnV0ZXMgZm9yIG1lc2ggcGF0aCB0bworICogCWRlc3RpbmF0aW9uICVOTDgwMjExX0FUVFJfTUFDIG9uIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllZCBieQorICogCSVOTDgwMjExX0FUVFJfSUZJTkRFWC4KKyAqIEBOTDgwMjExX0NNRF9TRVRfTVBBVEg6ICBTZXQgbWVzaCBwYXRoIGF0dHJpYnV0ZXMgZm9yIG1lc2ggcGF0aCB0bworICogCWRlc3RpbmF0aW9uICVOTDgwMjExX0FUVFJfTUFDIG9uIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllZCBieQorICogCSVOTDgwMjExX0FUVFJfSUZJTkRFWC4KKyAqIEBOTDgwMjExX0NNRF9ORVdfTVBBVEg6IENyZWF0ZSBhIG5ldyBtZXNoIHBhdGggZm9yIHRoZSBkZXN0aW5hdGlvbiBnaXZlbiBieQorICoJJU5MODAyMTFfQVRUUl9NQUMgdmlhICVOTDgwMjExX0FUVFJfTVBBVEhfTkVYVF9IT1AuCisgKiBATkw4MDIxMV9DTURfREVMX01QQVRIOiBEZWxldGUgYSBtZXNoIHBhdGggdG8gdGhlIGRlc3RpbmF0aW9uIGdpdmVuIGJ5CisgKgklTkw4MDIxMV9BVFRSX01BQy4KKyAqIEBOTDgwMjExX0NNRF9ORVdfUEFUSDogQWRkIGEgbWVzaCBwYXRoIHdpdGggZ2l2ZW4gYXR0cmlidXRlcyB0byB0aGUKKyAqCXRoZSBpbnRlcmZhY2UgaWRlbnRpZmllZCBieSAlTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKiBATkw4MDIxMV9DTURfREVMX1BBVEg6IFJlbW92ZSBhIG1lc2ggcGF0aCBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfTUFDCisgKglvciwgaWYgbm8gTUFDIGFkZHJlc3MgZ2l2ZW4sIGFsbCBtZXNoIHBhdGhzLCBvbiB0aGUgaW50ZXJmYWNlIGlkZW50aWZpZWQKKyAqCWJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWC4KKyAqIEBOTDgwMjExX0NNRF9TRVRfQlNTOiBTZXQgQlNTIGF0dHJpYnV0ZXMgZm9yIEJTUyBpZGVudGlmaWVkIGJ5CisgKgklTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKgorICogQE5MODAyMTFfQ01EX0dFVF9SRUc6IGFzayB0aGUgd2lyZWxlc3MgY29yZSB0byBzZW5kIHVzIGl0cyBjdXJyZW50bHkgc2V0CisgKiAJcmVndWxhdG9yeSBkb21haW4uCisgKiBATkw4MDIxMV9DTURfU0VUX1JFRzogU2V0IGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uIENSREEgc2VuZHMgdGhpcyBjb21tYW5kCisgKglhZnRlciBiZWluZyBxdWVyaWVkIGJ5IHRoZSBrZXJuZWwuIENSREEgcmVwbGllcyBieSBzZW5kaW5nIGEgcmVndWxhdG9yeQorICoJZG9tYWluIHN0cnVjdHVyZSB3aGljaCBjb25zaXN0cyBvZiAlTkw4MDIxMV9BVFRSX1JFR19BTFBIQSBzZXQgdG8gb3VyCisgKgljdXJyZW50IGFscGhhMiBpZiBpdCBmb3VuZCBhIG1hdGNoLiBJdCBhbHNvIHByb3ZpZGVzCisgKiAJTkw4MDIxMV9BVFRSX1JFR19SVUxFX0ZMQUdTLCBhbmQgYSBzZXQgb2YgcmVndWxhdG9yeSBydWxlcy4gRWFjaAorICogCXJlZ3VsYXRvcnkgcnVsZSBpcyBhIG5lc3RlZCBzZXQgb2YgYXR0cmlidXRlcyAgZ2l2ZW4gYnkKKyAqIAklTkw4MDIxMV9BVFRSX1JFR19SVUxFX0ZSRVFfW1NUQVJUfEVORF0gYW5kCisgKiAJJU5MODAyMTFfQVRUUl9GUkVRX1JBTkdFX01BWF9CVyB3aXRoIGFuIGF0dGFjaGVkIHBvd2VyIHJ1bGUgZ2l2ZW4gYnkKKyAqIAklTkw4MDIxMV9BVFRSX1JFR19SVUxFX1BPV0VSX01BWF9BTlRfR0FJTiBhbmQKKyAqIAklTkw4MDIxMV9BVFRSX1JFR19SVUxFX1BPV0VSX01BWF9FSVJQLgorICogQE5MODAyMTFfQ01EX1JFUV9TRVRfUkVHOiBhc2sgdGhlIHdpcmVsZXNzIGNvcmUgdG8gc2V0IHRoZSByZWd1bGF0b3J5IGRvbWFpbgorICogCXRvIHRoZSBzcGVjaWZpZWQgSVNPL0lFQyAzMTY2LTEgYWxwaGEyIGNvdW50cnkgY29kZS4gVGhlIGNvcmUgd2lsbAorICogCXN0b3JlIHRoaXMgYXMgYSB2YWxpZCByZXF1ZXN0IGFuZCB0aGVuIHF1ZXJ5IHVzZXJzcGFjZSBmb3IgaXQuCisgKgorICogQE5MODAyMTFfQ01EX0dFVF9NRVNIX0NPTkZJRzogR2V0IG1lc2ggbmV0d29ya2luZyBwcm9wZXJ0aWVzIGZvciB0aGUKKyAqCWludGVyZmFjZSBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWAorICoKKyAqIEBOTDgwMjExX0NNRF9TRVRfTUVTSF9DT05GSUc6IFNldCBtZXNoIG5ldHdvcmtpbmcgcHJvcGVydGllcyBmb3IgdGhlCisgKiAgICAgIGludGVyZmFjZSBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWAorICoKKyAqIEBOTDgwMjExX0NNRF9TRVRfTUdNVF9FWFRSQV9JRTogU2V0IGV4dHJhIElFcyBmb3IgbWFuYWdlbWVudCBmcmFtZXMuIFRoZQorICoJaW50ZXJmYWNlIGlzIGlkZW50aWZpZWQgd2l0aCAlTkw4MDIxMV9BVFRSX0lGSU5ERVggYW5kIHRoZSBtYW5hZ2VtZW50CisgKglmcmFtZSBzdWJ0eXBlIHdpdGggJU5MODAyMTFfQVRUUl9NR01UX1NVQlRZUEUuIFRoZSBleHRyYSBJRSBkYXRhIHRvIGJlCisgKglhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgbWFuYWdlbWVudCBmcmFtZSBpcyBzcGVjaWZpZWQgd2l0aAorICoJJU5MODAyMTFfQVRUUl9JRS4gSWYgdGhlIGNvbW1hbmQgc3VjY2VlZHMsIHRoZSByZXF1ZXN0ZWQgZGF0YSB3aWxsIGJlCisgKglhZGRlZCB0byBhbGwgc3BlY2lmaWVkIG1hbmFnZW1lbnQgZnJhbWVzIGdlbmVyYXRlZCBieQorICoJa2VybmVsL2Zpcm13YXJlL2RyaXZlci4KKyAqCU5vdGU6IFRoaXMgY29tbWFuZCBoYXMgYmVlbiByZW1vdmVkIGFuZCBpdCBpcyBvbmx5IHJlc2VydmVkIGF0IHRoaXMKKyAqCXBvaW50IHRvIGF2b2lkIHJlLXVzaW5nIGV4aXN0aW5nIGNvbW1hbmQgbnVtYmVyLiBUaGUgZnVuY3Rpb25hbGl0eSB0aGlzCisgKgljb21tYW5kIHdhcyBwbGFubmVkIGZvciBoYXMgYmVlbiBwcm92aWRlZCB3aXRoIGNsZWFuZXIgZGVzaWduIHdpdGggdGhlCisgKglvcHRpb24gdG8gc3BlY2lmeSBhZGRpdGlvbmFsIElFcyBpbiBOTDgwMjExX0NNRF9UUklHR0VSX1NDQU4sCisgKglOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUsIE5MODAyMTFfQ01EX0FTU09DSUFURSwKKyAqCU5MODAyMTFfQ01EX0RFQVVUSEVOVElDQVRFLCBhbmQgTkw4MDIxMV9DTURfRElTQVNTT0NJQVRFLgorICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfU0NBTjogZ2V0IHNjYW4gcmVzdWx0cworICogQE5MODAyMTFfQ01EX1RSSUdHRVJfU0NBTjogdHJpZ2dlciBhIG5ldyBzY2FuIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMKKyAqCSVOTDgwMjExX0FUVFJfVFhfTk9fQ0NLX1JBVEUgaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0byBzZW5kIHRoZQorICoJcHJvYmUgcmVxdWVzdHMgYXQgQ0NLIHJhdGUgb3Igbm90LgorICogQE5MODAyMTFfQ01EX05FV19TQ0FOX1JFU1VMVFM6IHNjYW4gbm90aWZpY2F0aW9uIChhcyBhIHJlcGx5IHRvCisgKglOTDgwMjExX0NNRF9HRVRfU0NBTiBhbmQgb24gdGhlICJzY2FuIiBtdWx0aWNhc3QgZ3JvdXApCisgKiBATkw4MDIxMV9DTURfU0NBTl9BQk9SVEVEOiBzY2FuIHdhcyBhYm9ydGVkLCBmb3IgdW5zcGVjaWZpZWQgcmVhc29ucywKKyAqCXBhcnRpYWwgc2NhbiByZXN1bHRzIG1heSBiZSBhdmFpbGFibGUKKyAqCisgKiBATkw4MDIxMV9DTURfU1RBUlRfU0NIRURfU0NBTjogc3RhcnQgYSBzY2hlZHVsZWQgc2NhbiBhdCBjZXJ0YWluCisgKglpbnRlcnZhbHMsIGFzIHNwZWNpZmllZCBieSAlTkw4MDIxMV9BVFRSX1NDSEVEX1NDQU5fSU5URVJWQUwuCisgKglMaWtlIHdpdGggbm9ybWFsIHNjYW5zLCBpZiBTU0lEcyAoJU5MODAyMTFfQVRUUl9TQ0FOX1NTSURTKQorICoJYXJlIHBhc3NlZCwgdGhleSBhcmUgdXNlZCBpbiB0aGUgcHJvYmUgcmVxdWVzdHMuICBGb3IKKyAqCWJyb2FkY2FzdCwgYSBicm9hZGNhc3QgU1NJRCBtdXN0IGJlIHBhc3NlZCAoaWUuIGFuIGVtcHR5CisgKglzdHJpbmcpLiAgSWYgbm8gU1NJRCBpcyBwYXNzZWQsIG5vIHByb2JlIHJlcXVlc3RzIGFyZSBzZW50IGFuZAorICoJYSBwYXNzaXZlIHNjYW4gaXMgcGVyZm9ybWVkLiAgJU5MODAyMTFfQVRUUl9TQ0FOX0ZSRVFVRU5DSUVTLAorICoJaWYgcGFzc2VkLCBkZWZpbmUgd2hpY2ggY2hhbm5lbHMgc2hvdWxkIGJlIHNjYW5uZWQ7IGlmIG5vdAorICoJcGFzc2VkLCBhbGwgY2hhbm5lbHMgYWxsb3dlZCBmb3IgdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4KKyAqCWFyZSB1c2VkLiAgRXh0cmEgSUVzIGNhbiBhbHNvIGJlIHBhc3NlZCBmcm9tIHRoZSB1c2Vyc3BhY2UgYnkKKyAqCXVzaW5nIHRoZSAlTkw4MDIxMV9BVFRSX0lFIGF0dHJpYnV0ZS4KKyAqIEBOTDgwMjExX0NNRF9TVE9QX1NDSEVEX1NDQU46IHN0b3AgYSBzY2hlZHVsZWQgc2Nhbi4gIFJldHVybnMgLUVOT0VOVAorICoJaWYgc2NoZWR1bGVkIHNjYW4gaXMgbm90IHJ1bm5pbmcuCisgKiBATkw4MDIxMV9DTURfU0NIRURfU0NBTl9SRVNVTFRTOiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBhcmUgc2NoZWR1bGVkIHNjYW4KKyAqCXJlc3VsdHMgYXZhaWxhYmxlLgorICogQE5MODAyMTFfQ01EX1NDSEVEX1NDQU5fU1RPUFBFRDogaW5kaWNhdGVzIHRoYXQgdGhlIHNjaGVkdWxlZCBzY2FuIGhhcworICoJc3RvcHBlZC4gIFRoZSBkcml2ZXIgbWF5IGlzc3VlIHRoaXMgZXZlbnQgYXQgYW55IHRpbWUgZHVyaW5nIGEKKyAqCXNjaGVkdWxlZCBzY2FuLiAgT25lIHJlYXNvbiBmb3Igc3RvcHBpbmcgdGhlIHNjYW4gaXMgaWYgdGhlIGhhcmR3YXJlCisgKglkb2VzIG5vdCBzdXBwb3J0IHN0YXJ0aW5nIGFuIGFzc29jaWF0aW9uIG9yIGEgbm9ybWFsIHNjYW4gd2hpbGUgcnVubmluZworICoJYSBzY2hlZHVsZWQgc2Nhbi4gIFRoaXMgZXZlbnQgaXMgYWxzbyBzZW50IHdoZW4gdGhlCisgKgklTkw4MDIxMV9DTURfU1RPUF9TQ0hFRF9TQ0FOIGNvbW1hbmQgaXMgcmVjZWl2ZWQgb3Igd2hlbiB0aGUgaW50ZXJmYWNlCisgKglpcyBicm91Z2h0IGRvd24gd2hpbGUgYSBzY2hlZHVsZWQgc2NhbiB3YXMgcnVubmluZy4KKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX1NVUlZFWTogZ2V0IHN1cnZleSByZXN1bHMsIGUuZy4gY2hhbm5lbCBvY2N1cGF0aW9uCisgKiAgICAgIG9yIG5vaXNlIGxldmVsCisgKiBATkw4MDIxMV9DTURfTkVXX1NVUlZFWV9SRVNVTFRTOiBzdXJ2ZXkgZGF0YSBub3RpZmljYXRpb24gKGFzIGEgcmVwbHkgdG8KKyAqCU5MODAyMTFfQ01EX0dFVF9TVVJWRVkgYW5kIG9uIHRoZSAic2NhbiIgbXVsdGljYXN0IGdyb3VwKQorICoKKyAqIEBOTDgwMjExX0NNRF9SRUdfQ0hBTkdFOiBpbmRpY2F0ZXMgdG8gdXNlcnNwYWNlIHRoZSByZWd1bGF0b3J5IGRvbWFpbgorICogCWhhcyBiZWVuIGNoYW5nZWQgYW5kIHByb3ZpZGVzIGRldGFpbHMgb2YgdGhlIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIAl0aGF0IGNhdXNlZCB0aGUgY2hhbmdlIHN1Y2ggYXMgd2hvIGluaXRpYXRlZCB0aGUgcmVndWxhdG9yeSByZXF1ZXN0CisgKiAJKCVOTDgwMjExX0FUVFJfUkVHX0lOSVRJQVRPUiksIHRoZSB3aXBoeV9pZHgKKyAqIAkoJU5MODAyMTFfQVRUUl9SRUdfQUxQSEEyKSBvbiB3aGljaCB0aGUgcmVxdWVzdCB3YXMgbWFkZSBmcm9tIGlmCisgKiAJdGhlIGluaXRpYXRvciB3YXMgJU5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFIG9yCisgKiAJJU5MODAyMTFfUkVHRE9NX1NFVF9CWV9EUklWRVIsIHRoZSB0eXBlIG9mIHJlZ3VsYXRvcnkgZG9tYWluCisgKiAJc2V0ICglTkw4MDIxMV9BVFRSX1JFR19UWVBFKSwgaWYgdGhlIHR5cGUgb2YgcmVndWxhdG9yeSBkb21haW4gaXMKKyAqIAklTkw4MDIxMV9SRUdfVFlQRV9DT1VOVFJZIHRoZSBhbHBoYTIgdG8gd2hpY2ggd2UgaGF2ZSBtb3ZlZCBvbgorICogCXRvICglTkw4MDIxMV9BVFRSX1JFR19BTFBIQTIpLgorICogQE5MODAyMTFfQ01EX1JFR19CRUFDT05fSElOVDogaW5kaWNhdGVzIHRvIHVzZXJzcGFjZSB0aGF0IGFuIEFQIGJlYWNvbgorICogCWhhcyBiZWVuIGZvdW5kIHdoaWxlIHdvcmxkIHJvYW1pbmcgdGh1cyBlbmFibGluZyBhY3RpdmUgc2NhbiBvcgorICogCWFueSBtb2RlIG9mIG9wZXJhdGlvbiB0aGF0IGluaXRpYXRlcyBUWCAoYmVhY29ucykgb24gYSBjaGFubmVsCisgKiAJd2hlcmUgd2Ugd291bGQgbm90IGhhdmUgYmVlbiBhYmxlIHRvIGRvIGVpdGhlciBiZWZvcmUuIEFzIGFuIGV4YW1wbGUKKyAqIAlpZiB5b3UgYXJlIHdvcmxkIHJvYW1pbmcgKHJlZ3VsYXRvcnkgZG9tYWluIHNldCB0byB3b3JsZCBvciBpZiB5b3VyCisgKiAJZHJpdmVyIGlzIHVzaW5nIGEgY3VzdG9tIHdvcmxkIHJvYW1pbmcgcmVndWxhdG9yeSBkb21haW4pIGFuZCB3aGlsZQorICogCWRvaW5nIGEgcGFzc2l2ZSBzY2FuIG9uIHRoZSA1IEdIeiBiYW5kIHlvdSBmaW5kIGFuIEFQIHRoZXJlIChpZiBub3QKKyAqIAlvbiBhIERGUyBjaGFubmVsKSB5b3Ugd2lsbCBub3cgYmUgYWJsZSB0byBhY3RpdmVseSBzY2FuIGZvciB0aGF0IEFQCisgKiAJb3IgdXNlIEFQIG1vZGUgb24geW91ciBjYXJkIG9uIHRoYXQgc2FtZSBjaGFubmVsLiBOb3RlIHRoYXQgdGhpcyB3aWxsCisgKiAJbmV2ZXIgYmUgdXNlZCBmb3IgY2hhbm5lbHMgMS0xMSBvbiB0aGUgMiBHSHogYmFuZCBhcyB0aGV5IGFyZSBhbHdheXMKKyAqIAllbmFibGVkIHdvcmxkIHdpZGUuIFRoaXMgYmVhY29uIGhpbnQgaXMgb25seSBzZW50IGlmIHlvdXIgZGV2aWNlIGhhZAorICogCWVpdGhlciBkaXNhYmxlZCBhY3RpdmUgc2Nhbm5pbmcgb3IgYmVhY29uaW5nIG9uIGEgY2hhbm5lbC4gV2Ugc2VuZCB0bworICogCXVzZXJzcGFjZSB0aGUgd2lwaHkgb24gd2hpY2ggd2UgcmVtb3ZlZCBhIHJlc3RyaWN0aW9uIGZyb20KKyAqIAkoJU5MODAyMTFfQVRUUl9XSVBIWSkgYW5kIHRoZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgb2NjdXJyZWQKKyAqIAliZWZvcmUgKCVOTDgwMjExX0FUVFJfRlJFUV9CRUZPUkUpIGFuZCBhZnRlciAoJU5MODAyMTFfQVRUUl9GUkVRX0FGVEVSKQorICogCXRoZSBiZWFjb24gaGludCB3YXMgcHJvY2Vzc2VkLgorICoKKyAqIEBOTDgwMjExX0NNRF9BVVRIRU5USUNBVEU6IGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgYW5kIG5vdGlmaWNhdGlvbi4KKyAqCVRoaXMgY29tbWFuZCBpcyB1c2VkIGJvdGggYXMgYSBjb21tYW5kIChyZXF1ZXN0IHRvIGF1dGhlbnRpY2F0ZSkgYW5kCisgKglhcyBhbiBldmVudCBvbiB0aGUgIm1sbWUiIG11bHRpY2FzdCBncm91cCBpbmRpY2F0aW5nIGNvbXBsZXRpb24gb2YgdGhlCisgKglhdXRoZW50aWNhdGlvbiBwcm9jZXNzLgorICoJV2hlbiB1c2VkIGFzIGEgY29tbWFuZCwgJU5MODAyMTFfQVRUUl9JRklOREVYIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlCisgKglpbnRlcmZhY2UuICVOTDgwMjExX0FUVFJfTUFDIGlzIHVzZWQgdG8gc3BlY2lmeSBQZWVyU1RBQWRkcmVzcyAoYW5kCisgKglCU1NJRCBpbiBjYXNlIG9mIHN0YXRpb24gbW9kZSkuICVOTDgwMjExX0FUVFJfU1NJRCBpcyB1c2VkIHRvIHNwZWNpZnkKKyAqCXRoZSBTU0lEIChtYWlubHkgZm9yIGFzc29jaWF0aW9uLCBidXQgaXMgaW5jbHVkZWQgaW4gYXV0aGVudGljYXRpb24KKyAqCXJlcXVlc3QsIHRvbywgdG8gaGVscCBCU1Mgc2VsZWN0aW9uLiAlTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEgaXMgdXNlZAorICoJdG8gc3BlY2lmeSB0aGUgZnJlcXVlbmNlIG9mIHRoZSBjaGFubmVsIGluIE1Iei4gJU5MODAyMTFfQVRUUl9BVVRIX1RZUEUKKyAqCWlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgYXV0aGVudGljYXRpb24gdHlwZS4gJU5MODAyMTFfQVRUUl9JRSBpcyB1c2VkIHRvCisgKglkZWZpbmUgSUVzIChWZW5kb3JTcGVjaWZpY0luZm8sIGJ1dCBhbHNvIGluY2x1ZGluZyBSU04gSUUgYW5kIEZUIElFcykKKyAqCXRvIGJlIGFkZGVkIHRvIHRoZSBmcmFtZS4KKyAqCVdoZW4gdXNlZCBhcyBhbiBldmVudCwgdGhpcyByZXBvcnRzIHJlY2VwdGlvbiBvZiBhbiBBdXRoZW50aWNhdGlvbgorICoJZnJhbWUgaW4gc3RhdGlvbiBhbmQgSUJTUyBtb2RlcyB3aGVuIHRoZSBsb2NhbCBNTE1FIHByb2Nlc3NlZCB0aGUKKyAqCWZyYW1lLCBpLmUuLCBpdCB3YXMgZm9yIHRoZSBsb2NhbCBTVEEgYW5kIHdhcyByZWNlaXZlZCBpbiBjb3JyZWN0CisgKglzdGF0ZS4gVGhpcyBpcyBzaW1pbGFyIHRvIE1MTUUtQVVUSEVOVElDQVRFLmNvbmZpcm0gcHJpbWl0aXZlIGluIHRoZQorICoJTUxNRSBTQVAgaW50ZXJmYWNlIChrZXJuZWwgcHJvdmlkaW5nIE1MTUUsIHVzZXJzcGFjZSBTTUUpLiBUaGUKKyAqCWluY2x1ZGVkICVOTDgwMjExX0FUVFJfRlJBTUUgYXR0cmlidXRlIGNvbnRhaW5zIHRoZSBtYW5hZ2VtZW50IGZyYW1lCisgKgkoaW5jbHVkaW5nIGJvdGggdGhlIGhlYWRlciBhbmQgZnJhbWUgYm9keSwgYnV0IG5vdCBGQ1MpLiBUaGlzIGV2ZW50IGlzCisgKglhbHNvIHVzZWQgdG8gaW5kaWNhdGUgaWYgdGhlIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHQgdGltZWQgb3V0LiBJbiB0aGF0CisgKgljYXNlIHRoZSAlTkw4MDIxMV9BVFRSX0ZSQU1FIGF0dHJpYnV0ZSBpcyByZXBsYWNlZCB3aXRoIGEKKyAqCSVOTDgwMjExX0FUVFJfVElNRURfT1VUIGZsYWcgKGFuZCAlTkw4MDIxMV9BVFRSX01BQyB0byBpbmRpY2F0ZSB3aGljaAorICoJcGVuZGluZyBhdXRoZW50aWNhdGlvbiB0aW1lZCBvdXQpLgorICogQE5MODAyMTFfQ01EX0FTU09DSUFURTogYXNzb2NpYXRpb24gcmVxdWVzdCBhbmQgbm90aWZpY2F0aW9uOyBsaWtlCisgKglOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUgYnV0IGZvciBBc3NvY2lhdGlvbiBhbmQgUmVhc3NvY2lhdGlvbgorICoJKHNpbWlsYXIgdG8gTUxNRS1BU1NPQ0lBVEUucmVxdWVzdCwgTUxNRS1SRUFTU09DSUFURS5yZXF1ZXN0LAorICoJTUxNRS1BU1NPQ0lBVEUuY29uZmlybSBvciBNTE1FLVJFQVNTT0NJQVRFLmNvbmZpcm0gcHJpbWl0aXZlcykuCisgKiBATkw4MDIxMV9DTURfREVBVVRIRU5USUNBVEU6IGRlYXV0aGVudGljYXRpb24gcmVxdWVzdCBhbmQgbm90aWZpY2F0aW9uOyBsaWtlCisgKglOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUgYnV0IGZvciBEZWF1dGhlbnRpY2F0aW9uIGZyYW1lcyAoc2ltaWxhciB0bworICoJTUxNRS1ERUFVVEhFTlRJQ0FUSU9OLnJlcXVlc3QgYW5kIE1MTUUtREVBVVRIRU5USUNBVEUuaW5kaWNhdGlvbgorICoJcHJpbWl0aXZlcykuCisgKiBATkw4MDIxMV9DTURfRElTQVNTT0NJQVRFOiBkaXNhc3NvY2lhdGlvbiByZXF1ZXN0IGFuZCBub3RpZmljYXRpb247IGxpa2UKKyAqCU5MODAyMTFfQ01EX0FVVEhFTlRJQ0FURSBidXQgZm9yIERpc2Fzc29jaWF0aW9uIGZyYW1lcyAoc2ltaWxhciB0bworICoJTUxNRS1ESVNBU1NPQ0lBVEUucmVxdWVzdCBhbmQgTUxNRS1ESVNBU1NPQ0lBVEUuaW5kaWNhdGlvbiBwcmltaXRpdmVzKS4KKyAqCisgKiBATkw4MDIxMV9DTURfTUlDSEFFTF9NSUNfRkFJTFVSRTogbm90aWZpY2F0aW9uIG9mIGEgbG9jYWxseSBkZXRlY3RlZCBNaWNoYWVsCisgKglNSUMgKHBhcnQgb2YgVEtJUCkgZmFpbHVyZTsgc2VudCBvbiB0aGUgIm1sbWUiIG11bHRpY2FzdCBncm91cDsgdGhlCisgKglldmVudCBpbmNsdWRlcyAlTkw4MDIxMV9BVFRSX01BQyB0byBkZXNjcmliZSB0aGUgc291cmNlIE1BQyBhZGRyZXNzIG9mCisgKgl0aGUgZnJhbWUgd2l0aCBpbnZhbGlkIE1JQywgJU5MODAyMTFfQVRUUl9LRVlfVFlQRSB0byBzaG93IHRoZSBrZXkKKyAqCXR5cGUsICVOTDgwMjExX0FUVFJfS0VZX0lEWCB0byBpbmRpY2F0ZSB0aGUga2V5IGlkZW50aWZpZXIsIGFuZAorICoJJU5MODAyMTFfQVRUUl9LRVlfU0VRIHRvIGluZGljYXRlIHRoZSBUU0MgdmFsdWUgb2YgdGhlIGZyYW1lOyB0aGlzCisgKglldmVudCBtYXRjaGVzIHdpdGggTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uKCkgcHJpbWl0aXZlCisgKgorICogQE5MODAyMTFfQ01EX0pPSU5fSUJTUzogSm9pbiBhIG5ldyBJQlNTIC0tIGdpdmVuIGF0IGxlYXN0IGFuIFNTSUQgYW5kIGEKKyAqCUZSRVEgYXR0cmlidXRlIChmb3IgdGhlIGluaXRpYWwgZnJlcXVlbmN5IGlmIG5vIHBlZXIgY2FuIGJlIGZvdW5kKQorICoJYW5kIG9wdGlvbmFsbHkgYSBNQUMgKGFzIEJTU0lEKSBhbmQgRlJFUV9GSVhFRCBhdHRyaWJ1dGUgaWYgdGhvc2UKKyAqCXNob3VsZCBiZSBmaXhlZCByYXRoZXIgdGhhbiBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQuIENhbiBvbmx5IGJlCisgKglleGVjdXRlZCBvbiBhIG5ldHdvcmsgaW50ZXJmYWNlIHRoYXQgaXMgVVAsIGFuZCBmaXhlZCBCU1NJRC9GUkVRCisgKgltYXkgYmUgcmVqZWN0ZWQuIEFub3RoZXIgb3B0aW9uYWwgcGFyYW1ldGVyIGlzIHRoZSBiZWFjb24gaW50ZXJ2YWwsCisgKglnaXZlbiBpbiB0aGUgJU5MODAyMTFfQVRUUl9CRUFDT05fSU5URVJWQUwgYXR0cmlidXRlLCB3aGljaCBpZiBub3QKKyAqCWdpdmVuIGRlZmF1bHRzIHRvIDEwMCBUVSAoMTAyLjRtcykuCisgKiBATkw4MDIxMV9DTURfTEVBVkVfSUJTUzogTGVhdmUgdGhlIElCU1MgLS0gbm8gc3BlY2lhbCBhcmd1bWVudHMsIHRoZSBJQlNTIGlzCisgKglkZXRlcm1pbmVkIGJ5IHRoZSBuZXR3b3JrIGludGVyZmFjZS4KKyAqCisgKiBATkw4MDIxMV9DTURfVEVTVE1PREU6IHRlc3Rtb2RlIGNvbW1hbmQsIHRha2VzIGEgd2lwaHkgKG9yIGlmaW5kZXgpIGF0dHJpYnV0ZQorICoJdG8gaWRlbnRpZnkgdGhlIGRldmljZSwgYW5kIHRoZSBURVNUREFUQSBibG9iIGF0dHJpYnV0ZSB0byBwYXNzIHRocm91Z2gKKyAqCXRvIHRoZSBkcml2ZXIuCisgKgorICogQE5MODAyMTFfQ01EX0NPTk5FQ1Q6IGNvbm5lY3Rpb24gcmVxdWVzdCBhbmQgbm90aWZpY2F0aW9uOyB0aGlzIGNvbW1hbmQKKyAqCXJlcXVlc3RzIHRvIGNvbm5lY3QgdG8gYSBzcGVjaWZpZWQgbmV0d29yayBidXQgd2l0aG91dCBzZXBhcmF0aW5nCisgKglhdXRoIGFuZCBhc3NvYyBzdGVwcy4gRm9yIHRoaXMsIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIFNTSUQgaW4gYQorICoJJU5MODAyMTFfQVRUUl9TU0lEIGF0dHJpYnV0ZSwgYW5kIGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgdGhlIGFzc29jaWF0aW9uCisgKglJRXMgaW4gJU5MODAyMTFfQVRUUl9JRSwgJU5MODAyMTFfQVRUUl9BVVRIX1RZUEUsICVOTDgwMjExX0FUVFJfTUFDLAorICoJJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRLCAlTkw4MDIxMV9BVFRSX0NPTlRST0xfUE9SVCwKKyAqCSVOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUX0VUSEVSVFlQRSBhbmQKKyAqCSVOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUX05PX0VOQ1JZUFQuCisgKglJdCBpcyBhbHNvIHNlbnQgYXMgYW4gZXZlbnQsIHdpdGggdGhlIEJTU0lEIGFuZCByZXNwb25zZSBJRXMgd2hlbiB0aGUKKyAqCWNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgb3IgZmFpbGVkIHRvIGJlIGVzdGFibGlzaGVkLiBUaGlzIGNhbiBiZQorICoJZGV0ZXJtaW5lZCBieSB0aGUgU1RBVFVTX0NPREUgYXR0cmlidXRlLgorICogQE5MODAyMTFfQ01EX1JPQU06IHJlcXVlc3QgdGhhdCB0aGUgY2FyZCByb2FtIChjdXJyZW50bHkgbm90IGltcGxlbWVudGVkKSwKKyAqCXNlbnQgYXMgYW4gZXZlbnQgd2hlbiB0aGUgY2FyZC9kcml2ZXIgcm9hbWVkIGJ5IGl0c2VsZi4KKyAqIEBOTDgwMjExX0NNRF9ESVNDT05ORUNUOiBkcm9wIGEgZ2l2ZW4gY29ubmVjdGlvbjsgYWxzbyB1c2VkIHRvIG5vdGlmeQorICoJdXNlcnNwYWNlIHRoYXQgYSBjb25uZWN0aW9uIHdhcyBkcm9wcGVkIGJ5IHRoZSBBUCBvciBkdWUgdG8gb3RoZXIKKyAqCXJlYXNvbnMsIGZvciB0aGlzIHRoZSAlTkw4MDIxMV9BVFRSX0RJU0NPTk5FQ1RFRF9CWV9BUCBhbmQKKyAqCSVOTDgwMjExX0FUVFJfUkVBU09OX0NPREUgYXR0cmlidXRlcyBhcmUgdXNlZC4KKyAqCisgKiBATkw4MDIxMV9DTURfU0VUX1dJUEhZX05FVE5TOiBTZXQgYSB3aXBoeSdzIG5ldG5zLiBOb3RlIHRoYXQgYWxsIGRldmljZXMKKyAqCWFzc29jaWF0ZWQgd2l0aCB0aGlzIHdpcGh5IG11c3QgYmUgZG93biBhbmQgd2lsbCBmb2xsb3cuCisgKgorICogQE5MODAyMTFfQ01EX1JFTUFJTl9PTl9DSEFOTkVMOiBSZXF1ZXN0IHRvIHJlbWFpbiBhd2FrZSBvbiB0aGUgc3BlY2lmaWVkCisgKgljaGFubmVsIGZvciB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRvCisgKglvZmYtY2hhbm5lbCBvcGVyYXRpb25zIGxpa2UgdHJhbnNtaXQgYSBQdWJsaWMgQWN0aW9uIGZyYW1lIGFuZCB3YWl0IGZvcgorICoJYSByZXNwb25zZSB3aGlsZSBiZWluZyBhc3NvY2lhdGVkIHRvIGFuIEFQIG9uIGFub3RoZXIgY2hhbm5lbC4KKyAqCSVOTDgwMjExX0FUVFJfSUZJTkRFWCBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggaW50ZXJmYWNlIChhbmQgdGh1cworICoJcmFkaW8pIGlzIHVzZWQuICVOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCisgKglmcmVxdWVuY3kgZm9yIHRoZSBvcGVyYXRpb24gYW5kICVOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFIG1heSBiZQorICoJb3B0aW9uYWxseSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBjaGFubmVsIHBhcmFtZXRlcnMuCisgKgklTkw4MDIxMV9BVFRSX0RVUkFUSU9OIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCisgKgl0byByZW1haW4gb24gdGhlIGNoYW5uZWwuIFRoaXMgY29tbWFuZCBpcyBhbHNvIHVzZWQgYXMgYW4gZXZlbnQgdG8KKyAqCW5vdGlmeSB3aGVuIHRoZSByZXF1ZXN0ZWQgZHVyYXRpb24gc3RhcnRzIChpdCBtYXkgdGFrZSBhIHdoaWxlIGZvciB0aGUKKyAqCWRyaXZlciB0byBzY2hlZHVsZSB0aGlzIHRpbWUgZHVlIHRvIG90aGVyIGNvbmN1cnJlbnQgbmVlZHMgZm9yIHRoZQorICoJcmFkaW8pLgorICoJV2hlbiBjYWxsZWQsIHRoaXMgb3BlcmF0aW9uIHJldHVybnMgYSBjb29raWUgKCVOTDgwMjExX0FUVFJfQ09PS0lFKQorICoJdGhhdCB3aWxsIGJlIGluY2x1ZGVkIHdpdGggYW55IGV2ZW50cyBwZXJ0YWluaW5nIHRvIHRoaXMgcmVxdWVzdDsKKyAqCXRoZSBjb29raWUgaXMgYWxzbyB1c2VkIHRvIGNhbmNlbCB0aGUgcmVxdWVzdC4KKyAqIEBOTDgwMjExX0NNRF9DQU5DRUxfUkVNQUlOX09OX0NIQU5ORUw6IFRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBjYW5jZWwgYQorICoJcGVuZGluZyByZW1haW4tb24tY2hhbm5lbCBkdXJhdGlvbiBpZiB0aGUgZGVzaXJlZCBvcGVyYXRpb24gaGFzIGJlZW4KKyAqCWNvbXBsZXRlZCBwcmlvciB0byBleHBpcmF0aW9uIG9mIHRoZSBvcmlnaW5hbGx5IHJlcXVlc3RlZCBkdXJhdGlvbi4KKyAqCSVOTDgwMjExX0FUVFJfV0lQSFkgb3IgJU5MODAyMTFfQVRUUl9JRklOREVYIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUKKyAqCXJhZGlvLiBUaGUgJU5MODAyMTFfQVRUUl9DT09LSUUgYXR0cmlidXRlIG11c3QgYmUgZ2l2ZW4gYXMgd2VsbCB0bworICoJdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHJlcXVlc3QuCisgKglUaGlzIGNvbW1hbmQgaXMgYWxzbyB1c2VkIGFzIGFuIGV2ZW50IHRvIG5vdGlmeSB3aGVuIGEgcmVxdWVzdGVkCisgKglyZW1haW4tb24tY2hhbm5lbCBkdXJhdGlvbiBoYXMgZXhwaXJlZC4KKyAqCisgKiBATkw4MDIxMV9DTURfU0VUX1RYX0JJVFJBVEVfTUFTSzogU2V0IHRoZSBtYXNrIG9mIHJhdGVzIHRvIGJlIHVzZWQgaW4gVFgKKyAqCXJhdGUgc2VsZWN0aW9uLiAlTkw4MDIxMV9BVFRSX0lGSU5ERVggaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBpbnRlcmZhY2UKKyAqCWFuZCBATkw4MDIxMV9BVFRSX1RYX1JBVEVTIHRoZSBzZXQgb2YgYWxsb3dlZCByYXRlcy4KKyAqCisgKiBATkw4MDIxMV9DTURfUkVHSVNURVJfRlJBTUU6IFJlZ2lzdGVyIGZvciByZWNlaXZpbmcgY2VydGFpbiBtZ210IGZyYW1lcworICoJKHZpYSBATkw4MDIxMV9DTURfRlJBTUUpIGZvciBwcm9jZXNzaW5nIGluIHVzZXJzcGFjZS4gVGhpcyBjb21tYW5kCisgKglyZXF1aXJlcyBhbiBpbnRlcmZhY2UgaW5kZXgsIGEgZnJhbWUgdHlwZSBhdHRyaWJ1dGUgKG9wdGlvbmFsIGZvcgorICoJYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb25zLCBpZiBub3QgZ2l2ZW4gYXNzdW1lcyBhY3Rpb24gZnJhbWVzKQorICoJYW5kIGEgbWF0Y2ggYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGZldyBieXRlcyBvZiB0aGUgZnJhbWUKKyAqCXRoYXQgc2hvdWxkIG1hdGNoLCBlLmcuIGEgc2luZ2xlIGJ5dGUgZm9yIG9ubHkgYSBjYXRlZ29yeSBtYXRjaCBvcgorICoJZm91ciBieXRlcyBmb3IgdmVuZG9yIGZyYW1lcyBpbmNsdWRpbmcgdGhlIE9VSS4gVGhlIHJlZ2lzdHJhdGlvbgorICoJY2Fubm90IGJlIGRyb3BwZWQsIGJ1dCBpcyByZW1vdmVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgbmV0bGluaworICoJc29ja2V0IGlzIGNsb3NlZC4gTXVsdGlwbGUgcmVnaXN0cmF0aW9ucyBjYW4gYmUgbWFkZS4KKyAqIEBOTDgwMjExX0NNRF9SRUdJU1RFUl9BQ1RJT046IEFsaWFzIGZvciBATkw4MDIxMV9DTURfUkVHSVNURVJfRlJBTUUgZm9yCisgKgliYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgKiBATkw4MDIxMV9DTURfRlJBTUU6IE1hbmFnZW1lbnQgZnJhbWUgVFggcmVxdWVzdCBhbmQgUlggbm90aWZpY2F0aW9uLiBUaGlzCisgKgljb21tYW5kIGlzIHVzZWQgYm90aCBhcyBhIHJlcXVlc3QgdG8gdHJhbnNtaXQgYSBtYW5hZ2VtZW50IGZyYW1lIGFuZAorICoJYXMgYW4gZXZlbnQgaW5kaWNhdGluZyByZWNlcHRpb24gb2YgYSBmcmFtZSB0aGF0IHdhcyBub3QgcHJvY2Vzc2VkIGluCisgKglrZXJuZWwgY29kZSwgYnV0IGlzIGZvciB1cyAoaS5lLiwgd2hpY2ggbWF5IG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGluIGEKKyAqCXVzZXIgc3BhY2UgYXBwbGljYXRpb24pLiAlTkw4MDIxMV9BVFRSX0ZSQU1FIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUKKyAqCWZyYW1lIGNvbnRlbnRzIChpbmNsdWRpbmcgaGVhZGVyKS4gJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRIChhbmQKKyAqCW9wdGlvbmFsbHkgJU5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEUpIGlzIHVzZWQgdG8gaW5kaWNhdGUgb24KKyAqCXdoaWNoIGNoYW5uZWwgdGhlIGZyYW1lIGlzIHRvIGJlIHRyYW5zbWl0dGVkIG9yIHdhcyByZWNlaXZlZC4gSWYgdGhpcworICoJY2hhbm5lbCBpcyBub3QgdGhlIGN1cnJlbnQgY2hhbm5lbCAocmVtYWluLW9uLWNoYW5uZWwgb3IgdGhlCisgKglvcGVyYXRpb25hbCBjaGFubmVsKSB0aGUgZGV2aWNlIHdpbGwgc3dpdGNoIHRvIHRoZSBnaXZlbiBjaGFubmVsIGFuZAorICoJdHJhbnNtaXQgdGhlIGZyYW1lLCBvcHRpb25hbGx5IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZm9yIHRoZSB0aW1lCisgKglzcGVjaWZpZWQgdXNpbmcgJU5MODAyMTFfQVRUUl9EVVJBVElPTi4gV2hlbiBjYWxsZWQsIHRoaXMgb3BlcmF0aW9uCisgKglyZXR1cm5zIGEgY29va2llICglTkw4MDIxMV9BVFRSX0NPT0tJRSkgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIHdpdGggdGhlCisgKglUWCBzdGF0dXMgZXZlbnQgcGVydGFpbmluZyB0byB0aGUgVFggcmVxdWVzdC4KKyAqCSVOTDgwMjExX0FUVFJfVFhfTk9fQ0NLX1JBVEUgaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0byBzZW5kIHRoZQorICoJbWFuYWdlbWVudCBmcmFtZXMgYXQgQ0NLIHJhdGUgb3Igbm90IGluIDJHSHogYmFuZC4KKyAqIEBOTDgwMjExX0NNRF9GUkFNRV9XQUlUX0NBTkNFTDogV2hlbiBhbiBvZmYtY2hhbm5lbCBUWCB3YXMgcmVxdWVzdGVkLCB0aGlzCisgKgljb21tYW5kIG1heSBiZSB1c2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29va2llIHRvIGNhbmNlbCB0aGUgd2FpdAorICoJdGltZSBpZiBpdCBpcyBrbm93biB0aGF0IGl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkuCisgKiBATkw4MDIxMV9DTURfQUNUSU9OOiBBbGlhcyBmb3IgQE5MODAyMTFfQ01EX0ZSQU1FIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICogQE5MODAyMTFfQ01EX0ZSQU1FX1RYX1NUQVRVUzogUmVwb3J0IFRYIHN0YXR1cyBvZiBhIG1hbmFnZW1lbnQgZnJhbWUKKyAqCXRyYW5zbWl0dGVkIHdpdGggJU5MODAyMTFfQ01EX0ZSQU1FLiAlTkw4MDIxMV9BVFRSX0NPT0tJRSBpZGVudGlmaWVzCisgKgl0aGUgVFggY29tbWFuZCBhbmQgJU5MODAyMTFfQVRUUl9GUkFNRSBpbmNsdWRlcyB0aGUgY29udGVudHMgb2YgdGhlCisgKglmcmFtZS4gJU5MODAyMTFfQVRUUl9BQ0sgZmxhZyBpcyBpbmNsdWRlZCBpZiB0aGUgcmVjaXBpZW50IGFja25vd2xlZGdlZAorICoJdGhlIGZyYW1lLgorICogQE5MODAyMTFfQ01EX0FDVElPTl9UWF9TVEFUVVM6IEFsaWFzIGZvciBATkw4MDIxMV9DTURfRlJBTUVfVFhfU1RBVFVTIGZvcgorICoJYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAqIEBOTDgwMjExX0NNRF9TRVRfQ1FNOiBDb25uZWN0aW9uIHF1YWxpdHkgbW9uaXRvciBjb25maWd1cmF0aW9uLiBUaGlzIGNvbW1hbmQKKyAqCWlzIHVzZWQgdG8gY29uZmlndXJlIGNvbm5lY3Rpb24gcXVhbGl0eSBtb25pdG9yaW5nIG5vdGlmaWNhdGlvbiB0cmlnZ2VyCisgKglsZXZlbHMuCisgKiBATkw4MDIxMV9DTURfTk9USUZZX0NRTTogQ29ubmVjdGlvbiBxdWFsaXR5IG1vbml0b3Igbm90aWZpY2F0aW9uLiBUaGlzCisgKgljb21tYW5kIGlzIHVzZWQgYXMgYW4gZXZlbnQgdG8gaW5kaWNhdGUgdGhlIHRoYXQgYSB0cmlnZ2VyIGxldmVsIHdhcworICoJcmVhY2hlZC4KKyAqIEBOTDgwMjExX0NNRF9TRVRfQ0hBTk5FTDogU2V0IHRoZSBjaGFubmVsICh1c2luZyAlTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEKKyAqCWFuZCAlTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRSkgdGhlIGdpdmVuIGludGVyZmFjZSAoaWRlbnRpZmVkCisgKglieSAlTkw4MDIxMV9BVFRSX0lGSU5ERVgpIHNoYWxsIG9wZXJhdGUgb24uCisgKglJbiBjYXNlIG11bHRpcGxlIGNoYW5uZWxzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSwgdGhlIG1lY2hhbmlzbQorICoJd2l0aCB3aGljaCBpdCBzd2l0Y2hlcyBjaGFubmVscyBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorICoJV2hlbiBhIG1vbml0b3IgaW50ZXJmYWNlIGlzIGdpdmVuLCBpdCBjYW4gb25seSBzd2l0Y2ggY2hhbm5lbCB3aGlsZQorICoJbm8gb3RoZXIgaW50ZXJmYWNlcyBhcmUgb3BlcmF0aW5nIHRvIGF2b2lkIGRpc3R1cmJpbmcgdGhlIG9wZXJhdGlvbgorICoJb2YgYW55IG90aGVyIGludGVyZmFjZXMsIGFuZCBvdGhlciBpbnRlcmZhY2VzIHdpbGwgYWdhaW4gdGFrZQorICoJcHJlY2VkZW5jZSB3aGVuIHRoZXkgYXJlIHVzZWQuCisgKgorICogQE5MODAyMTFfQ01EX1NFVF9XRFNfUEVFUjogU2V0IHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgcGVlciBvbiBhIFdEUyBpbnRlcmZhY2UuCisgKgorICogQE5MODAyMTFfQ01EX0pPSU5fTUVTSDogSm9pbiBhIG1lc2guIFRoZSBtZXNoIElEIG11c3QgYmUgZ2l2ZW4sIGFuZCBpbml0aWFsCisgKgltZXNoIGNvbmZpZyBwYXJhbWV0ZXJzIG1heSBiZSBnaXZlbi4KKyAqIEBOTDgwMjExX0NNRF9MRUFWRV9NRVNIOiBMZWF2ZSB0aGUgbWVzaCBuZXR3b3JrIC0tIG5vIHNwZWNpYWwgYXJndW1lbnRzLCB0aGUKKyAqCW5ldHdvcmsgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisgKgorICogQE5MODAyMTFfQ01EX1VOUFJPVF9ERUFVVEhFTlRJQ0FURTogVW5wcm90ZWN0ZWQgZGVhdXRoZW50aWNhdGlvbiBmcmFtZQorICoJbm90aWZpY2F0aW9uLiBUaGlzIGV2ZW50IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhbiB1bnByb3RlY3RlZAorICoJZGVhdXRoZW50aWNhdGlvbiBmcmFtZSB3YXMgZHJvcHBlZCB3aGVuIE1GUCBpcyBpbiB1c2UuCisgKiBATkw4MDIxMV9DTURfVU5QUk9UX0RJU0FTU09DSUFURTogVW5wcm90ZWN0ZWQgZGlzYXNzb2NpYXRpb24gZnJhbWUKKyAqCW5vdGlmaWNhdGlvbi4gVGhpcyBldmVudCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYW4gdW5wcm90ZWN0ZWQKKyAqCWRpc2Fzc29jaWF0aW9uIGZyYW1lIHdhcyBkcm9wcGVkIHdoZW4gTUZQIGlzIGluIHVzZS4KKyAqCisgKiBATkw4MDIxMV9DTURfTkVXX1BFRVJfQ0FORElEQVRFOiBOb3RpZmljYXRpb24gb24gdGhlIHJlY2VwdGlvbiBvZiBhCisgKiAgICAgIGJlYWNvbiBvciBwcm9iZSByZXNwb25zZSBmcm9tIGEgY29tcGF0aWJsZSBtZXNoIHBlZXIuICBUaGlzIGlzIG9ubHkKKyAqICAgICAgc2VudCB3aGlsZSBubyBzdGF0aW9uIGluZm9ybWF0aW9uIChzdGFfaW5mbykgZXhpc3RzIGZvciB0aGUgbmV3IHBlZXIKKyAqICAgICAgY2FuZGlkYXRlIGFuZCB3aGVuIEBOTDgwMjExX01FU0hfU0VUVVBfVVNFUlNQQUNFX0FVVEggaXMgc2V0LiAgT24KKyAqICAgICAgcmVjZXB0aW9uIG9mIHRoaXMgbm90aWZpY2F0aW9uLCB1c2Vyc3BhY2UgbWF5IGRlY2lkZSB0byBjcmVhdGUgYSBuZXcKKyAqICAgICAgc3RhdGlvbiAoQE5MODAyMTFfQ01EX05FV19TVEFUSU9OKS4gIFRvIHN0b3AgdGhpcyBub3RpZmljYXRpb24gZnJvbQorICogICAgICByZW9jY3VycmluZywgdGhlIHVzZXJzcGFjZSBhdXRoZW50aWNhdGlvbiBkYWVtb24gbWF5IHdhbnQgdG8gY3JlYXRlIHRoZQorICogICAgICBuZXcgc3RhdGlvbiB3aXRoIHRoZSBBVVRIRU5USUNBVEVEIGZsYWcgdW5zZXQgYW5kIG1heWJlIGNoYW5nZSBpdCBsYXRlcgorICogICAgICBkZXBlbmRpbmcgb24gdGhlIGF1dGhlbnRpY2F0aW9uIHJlc3VsdC4KKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX1dPV0xBTjogZ2V0IFdha2Utb24tV2lyZWxlc3MtTEFOIChXb1dMQU4pIHNldHRpbmdzLgorICogQE5MODAyMTFfQ01EX1NFVF9XT1dMQU46IHNldCBXYWtlLW9uLVdpcmVsZXNzLUxBTiAoV29XTEFOKSBzZXR0aW5ncy4KKyAqCVNpbmNlIHdpcmVsZXNzIGlzIG1vcmUgY29tcGxleCB0aGFuIHdpcmVkIGV0aGVybmV0LCBpdCBzdXBwb3J0cworICoJdmFyaW91cyB0cmlnZ2Vycy4gVGhlc2UgdHJpZ2dlcnMgY2FuIGJlIGNvbmZpZ3VyZWQgdGhyb3VnaCB0aGlzCisgKgljb21tYW5kIHdpdGggdGhlICVOTDgwMjExX0FUVFJfV09XTEFOX1RSSUdHRVJTIGF0dHJpYnV0ZS4gRm9yCisgKgltb3JlIGJhY2tncm91bmQgaW5mb3JtYXRpb24sIHNlZQorICoJaHR0cDovL3dpcmVsZXNzLmtlcm5lbC5vcmcvZW4vdXNlcnMvRG9jdW1lbnRhdGlvbi9Xb1dMQU4uCisgKgorICogQE5MODAyMTFfQ01EX1NFVF9SRUtFWV9PRkZMT0FEOiBUaGlzIGNvbW1hbmQgaXMgdXNlZCBnaXZlIHRoZSBkcml2ZXIKKyAqCXRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHN1cHBvcnRpbmcgR1RLIHJla2V5IG9mZmxvYWQuIFRoaXMKKyAqCWZlYXR1cmUgaXMgdHlwaWNhbGx5IHVzZWQgZHVyaW5nIFdvV0xBTi4gVGhlIGNvbmZpZ3VyYXRpb24gZGF0YQorICoJaXMgY29udGFpbmVkIGluICVOTDgwMjExX0FUVFJfUkVLRVlfREFUQSAod2hpY2ggaXMgbmVzdGVkIGFuZAorICoJY29udGFpbnMgdGhlIGRhdGEgaW4gc3ViLWF0dHJpYnV0ZXMpLiBBZnRlciByZWtleWluZyBoYXBwZW5lZCwKKyAqCXRoaXMgY29tbWFuZCBtYXkgYWxzbyBiZSBzZW50IGJ5IHRoZSBkcml2ZXIgYXMgYW4gTUxNRSBldmVudCB0bworICoJaW5mb3JtIHVzZXJzcGFjZSBvZiB0aGUgbmV3IHJlcGxheSBjb3VudGVyLgorICoKKyAqIEBOTDgwMjExX0NNRF9QTUtTQV9DQU5ESURBVEU6IFRoaXMgaXMgdXNlZCBhcyBhbiBldmVudCB0byBpbmZvcm0gdXNlcnNwYWNlCisgKglvZiBQTUtTQSBjYWNoaW5nIGRhbmRpZGF0ZXMuCisgKgorICogQE5MODAyMTFfQ01EX1RETFNfT1BFUjogUGVyZm9ybSBhIGhpZ2gtbGV2ZWwgVERMUyBjb21tYW5kIChlLmcuIGxpbmsgc2V0dXApLgorICogQE5MODAyMTFfQ01EX1RETFNfTUdNVDogU2VuZCBhIFRETFMgbWFuYWdlbWVudCBmcmFtZS4KKyAqCisgKiBATkw4MDIxMV9DTURfTUFYOiBoaWdoZXN0IHVzZWQgY29tbWFuZCBudW1iZXIKKyAqIEBfX05MODAyMTFfQ01EX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfY29tbWFuZHMgeworLyogZG9uJ3QgY2hhbmdlIHRoZSBvcmRlciBvciBhZGQgYW55dGhpbmcgYmV0d2VlbiwgdGhpcyBpcyBBQkkhICovCisJTkw4MDIxMV9DTURfVU5TUEVDLAorCisJTkw4MDIxMV9DTURfR0VUX1dJUEhZLAkJLyogY2FuIGR1bXAgKi8KKwlOTDgwMjExX0NNRF9TRVRfV0lQSFksCisJTkw4MDIxMV9DTURfTkVXX1dJUEhZLAorCU5MODAyMTFfQ01EX0RFTF9XSVBIWSwKKworCU5MODAyMTFfQ01EX0dFVF9JTlRFUkZBQ0UsCS8qIGNhbiBkdW1wICovCisJTkw4MDIxMV9DTURfU0VUX0lOVEVSRkFDRSwKKwlOTDgwMjExX0NNRF9ORVdfSU5URVJGQUNFLAorCU5MODAyMTFfQ01EX0RFTF9JTlRFUkZBQ0UsCisKKwlOTDgwMjExX0NNRF9HRVRfS0VZLAorCU5MODAyMTFfQ01EX1NFVF9LRVksCisJTkw4MDIxMV9DTURfTkVXX0tFWSwKKwlOTDgwMjExX0NNRF9ERUxfS0VZLAorCisJTkw4MDIxMV9DTURfR0VUX0JFQUNPTiwKKwlOTDgwMjExX0NNRF9TRVRfQkVBQ09OLAorCU5MODAyMTFfQ01EX05FV19CRUFDT04sCisJTkw4MDIxMV9DTURfREVMX0JFQUNPTiwKKworCU5MODAyMTFfQ01EX0dFVF9TVEFUSU9OLAorCU5MODAyMTFfQ01EX1NFVF9TVEFUSU9OLAorCU5MODAyMTFfQ01EX05FV19TVEFUSU9OLAorCU5MODAyMTFfQ01EX0RFTF9TVEFUSU9OLAorCisJTkw4MDIxMV9DTURfR0VUX01QQVRILAorCU5MODAyMTFfQ01EX1NFVF9NUEFUSCwKKwlOTDgwMjExX0NNRF9ORVdfTVBBVEgsCisJTkw4MDIxMV9DTURfREVMX01QQVRILAorCisJTkw4MDIxMV9DTURfU0VUX0JTUywKKworCU5MODAyMTFfQ01EX1NFVF9SRUcsCisJTkw4MDIxMV9DTURfUkVRX1NFVF9SRUcsCisKKwlOTDgwMjExX0NNRF9HRVRfTUVTSF9DT05GSUcsCisJTkw4MDIxMV9DTURfU0VUX01FU0hfQ09ORklHLAorCisJTkw4MDIxMV9DTURfU0VUX01HTVRfRVhUUkFfSUUgLyogcmVzZXJ2ZWQ7IG5vdCB1c2VkICovLAorCisJTkw4MDIxMV9DTURfR0VUX1JFRywKKworCU5MODAyMTFfQ01EX0dFVF9TQ0FOLAorCU5MODAyMTFfQ01EX1RSSUdHRVJfU0NBTiwKKwlOTDgwMjExX0NNRF9ORVdfU0NBTl9SRVNVTFRTLAorCU5MODAyMTFfQ01EX1NDQU5fQUJPUlRFRCwKKworCU5MODAyMTFfQ01EX1JFR19DSEFOR0UsCisKKwlOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUsCisJTkw4MDIxMV9DTURfQVNTT0NJQVRFLAorCU5MODAyMTFfQ01EX0RFQVVUSEVOVElDQVRFLAorCU5MODAyMTFfQ01EX0RJU0FTU09DSUFURSwKKworCU5MODAyMTFfQ01EX01JQ0hBRUxfTUlDX0ZBSUxVUkUsCisKKwlOTDgwMjExX0NNRF9SRUdfQkVBQ09OX0hJTlQsCisKKwlOTDgwMjExX0NNRF9KT0lOX0lCU1MsCisJTkw4MDIxMV9DTURfTEVBVkVfSUJTUywKKworCU5MODAyMTFfQ01EX1RFU1RNT0RFLAorCisJTkw4MDIxMV9DTURfQ09OTkVDVCwKKwlOTDgwMjExX0NNRF9ST0FNLAorCU5MODAyMTFfQ01EX0RJU0NPTk5FQ1QsCisKKwlOTDgwMjExX0NNRF9TRVRfV0lQSFlfTkVUTlMsCisKKwlOTDgwMjExX0NNRF9HRVRfU1VSVkVZLAorCU5MODAyMTFfQ01EX05FV19TVVJWRVlfUkVTVUxUUywKKworCU5MODAyMTFfQ01EX1NFVF9QTUtTQSwKKwlOTDgwMjExX0NNRF9ERUxfUE1LU0EsCisJTkw4MDIxMV9DTURfRkxVU0hfUE1LU0EsCisKKwlOTDgwMjExX0NNRF9SRU1BSU5fT05fQ0hBTk5FTCwKKwlOTDgwMjExX0NNRF9DQU5DRUxfUkVNQUlOX09OX0NIQU5ORUwsCisKKwlOTDgwMjExX0NNRF9TRVRfVFhfQklUUkFURV9NQVNLLAorCisJTkw4MDIxMV9DTURfUkVHSVNURVJfRlJBTUUsCisJTkw4MDIxMV9DTURfUkVHSVNURVJfQUNUSU9OID0gTkw4MDIxMV9DTURfUkVHSVNURVJfRlJBTUUsCisJTkw4MDIxMV9DTURfRlJBTUUsCisJTkw4MDIxMV9DTURfQUNUSU9OID0gTkw4MDIxMV9DTURfRlJBTUUsCisJTkw4MDIxMV9DTURfRlJBTUVfVFhfU1RBVFVTLAorCU5MODAyMTFfQ01EX0FDVElPTl9UWF9TVEFUVVMgPSBOTDgwMjExX0NNRF9GUkFNRV9UWF9TVEFUVVMsCisKKwlOTDgwMjExX0NNRF9TRVRfUE9XRVJfU0FWRSwKKwlOTDgwMjExX0NNRF9HRVRfUE9XRVJfU0FWRSwKKworCU5MODAyMTFfQ01EX1NFVF9DUU0sCisJTkw4MDIxMV9DTURfTk9USUZZX0NRTSwKKworCU5MODAyMTFfQ01EX1NFVF9DSEFOTkVMLAorCU5MODAyMTFfQ01EX1NFVF9XRFNfUEVFUiwKKworCU5MODAyMTFfQ01EX0ZSQU1FX1dBSVRfQ0FOQ0VMLAorCisJTkw4MDIxMV9DTURfSk9JTl9NRVNILAorCU5MODAyMTFfQ01EX0xFQVZFX01FU0gsCisKKwlOTDgwMjExX0NNRF9VTlBST1RfREVBVVRIRU5USUNBVEUsCisJTkw4MDIxMV9DTURfVU5QUk9UX0RJU0FTU09DSUFURSwKKworCU5MODAyMTFfQ01EX05FV19QRUVSX0NBTkRJREFURSwKKworCU5MODAyMTFfQ01EX0dFVF9XT1dMQU4sCisJTkw4MDIxMV9DTURfU0VUX1dPV0xBTiwKKworCU5MODAyMTFfQ01EX1NUQVJUX1NDSEVEX1NDQU4sCisJTkw4MDIxMV9DTURfU1RPUF9TQ0hFRF9TQ0FOLAorCU5MODAyMTFfQ01EX1NDSEVEX1NDQU5fUkVTVUxUUywKKwlOTDgwMjExX0NNRF9TQ0hFRF9TQ0FOX1NUT1BQRUQsCisKKwlOTDgwMjExX0NNRF9TRVRfUkVLRVlfT0ZGTE9BRCwKKworCU5MODAyMTFfQ01EX1BNS1NBX0NBTkRJREFURSwKKworCU5MODAyMTFfQ01EX1RETFNfT1BFUiwKKwlOTDgwMjExX0NNRF9URExTX01HTVQsCisKKwkvKiBhZGQgbmV3IGNvbW1hbmRzIGFib3ZlIGhlcmUgKi8KKworCS8qIHVzZWQgdG8gZGVmaW5lIE5MODAyMTFfQ01EX01BWCBiZWxvdyAqLworCV9fTkw4MDIxMV9DTURfQUZURVJfTEFTVCwKKwlOTDgwMjExX0NNRF9NQVggPSBfX05MODAyMTFfQ01EX0FGVEVSX0xBU1QgLSAxCit9OworCisvKgorICogQWxsb3cgdXNlciBzcGFjZSBwcm9ncmFtcyB0byB1c2UgI2lmZGVmIG9uIG5ldyBjb21tYW5kcyBieSBkZWZpbmluZyB0aGVtCisgKiBoZXJlCisgKi8KKyNkZWZpbmUgTkw4MDIxMV9DTURfU0VUX0JTUyBOTDgwMjExX0NNRF9TRVRfQlNTCisjZGVmaW5lIE5MODAyMTFfQ01EX1NFVF9NR01UX0VYVFJBX0lFIE5MODAyMTFfQ01EX1NFVF9NR01UX0VYVFJBX0lFCisjZGVmaW5lIE5MODAyMTFfQ01EX1JFR19DSEFOR0UgTkw4MDIxMV9DTURfUkVHX0NIQU5HRQorI2RlZmluZSBOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUgTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFCisjZGVmaW5lIE5MODAyMTFfQ01EX0FTU09DSUFURSBOTDgwMjExX0NNRF9BU1NPQ0lBVEUKKyNkZWZpbmUgTkw4MDIxMV9DTURfREVBVVRIRU5USUNBVEUgTkw4MDIxMV9DTURfREVBVVRIRU5USUNBVEUKKyNkZWZpbmUgTkw4MDIxMV9DTURfRElTQVNTT0NJQVRFIE5MODAyMTFfQ01EX0RJU0FTU09DSUFURQorI2RlZmluZSBOTDgwMjExX0NNRF9SRUdfQkVBQ09OX0hJTlQgTkw4MDIxMV9DTURfUkVHX0JFQUNPTl9ISU5UCisKKy8qIHNvdXJjZS1sZXZlbCBBUEkgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBOTDgwMjExX0NNRF9HRVRfTUVTSF9QQVJBTVMgTkw4MDIxMV9DTURfR0VUX01FU0hfQ09ORklHCisjZGVmaW5lIE5MODAyMTFfQ01EX1NFVF9NRVNIX1BBUkFNUyBOTDgwMjExX0NNRF9TRVRfTUVTSF9DT05GSUcKKyNkZWZpbmUgTkw4MDIxMV9NRVNIX1NFVFVQX1ZFTkRPUl9QQVRIX1NFTF9JRSBOTDgwMjExX01FU0hfU0VUVVBfSUUKKworLyoqCisgKiBlbnVtIG5sODAyMTFfYXR0cnMgLSBubDgwMjExIG5ldGxpbmsgYXR0cmlidXRlcworICoKKyAqIEBOTDgwMjExX0FUVFJfVU5TUEVDOiB1bnNwZWNpZmllZCBhdHRyaWJ1dGUgdG8gY2F0Y2ggZXJyb3JzCisgKgorICogQE5MODAyMTFfQVRUUl9XSVBIWTogaW5kZXggb2Ygd2lwaHkgdG8gb3BlcmF0ZSBvbiwgY2YuCisgKgkvc3lzL2NsYXNzL2llZWU4MDIxMS88cGh5bmFtZT4vaW5kZXgKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfTkFNRTogd2lwaHkgbmFtZSAodXNlZCBmb3IgcmVuYW1pbmcpCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX1RYUV9QQVJBTVM6IGEgbmVzdGVkIGFycmF5IG9mIFRYIHF1ZXVlIHBhcmFtZXRlcnMKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfRlJFUTogZnJlcXVlbmN5IG9mIHRoZSBzZWxlY3RlZCBjaGFubmVsIGluIE1IegorICogQE5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEU6IGluY2x1ZGVkIHdpdGggTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEKKyAqCWlmIEhUMjAgb3IgSFQ0MCBhcmUgYWxsb3dlZCAoaS5lLiwgODAyLjExbiBkaXNhYmxlZCBpZiBub3QgaW5jbHVkZWQpOgorICoJTkw4MDIxMV9DSEFOX05PX0hUID0gSFQgbm90IGFsbG93ZWQgKGkuZS4sIHNhbWUgYXMgbm90IGluY2x1ZGluZworICoJCXRoaXMgYXR0cmlidXRlKQorICoJTkw4MDIxMV9DSEFOX0hUMjAgPSBIVDIwIG9ubHkKKyAqCU5MODAyMTFfQ0hBTl9IVDQwTUlOVVMgPSBzZWNvbmRhcnkgY2hhbm5lbCBpcyBiZWxvdyB0aGUgcHJpbWFyeSBjaGFubmVsCisgKglOTDgwMjExX0NIQU5fSFQ0MFBMVVMgPSBzZWNvbmRhcnkgY2hhbm5lbCBpcyBhYm92ZSB0aGUgcHJpbWFyeSBjaGFubmVsCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX1JFVFJZX1NIT1JUOiBUWCByZXRyeSBsaW1pdCBmb3IgZnJhbWVzIHdob3NlIGxlbmd0aCBpcworICoJbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBSVFMgdGhyZXNob2xkOyBhbGxvd2VkIHJhbmdlOiAxLi4yNTU7CisgKglkb3QxMVNob3J0UmV0cnlMaW1pdDsgdTgKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfTE9ORzogVFggcmV0cnkgbGltaXQgZm9yIGZyYW1lcyB3aG9zZSBsZW5ndGggaXMKKyAqCWdyZWF0ZXIgdGhhbiB0aGUgUlRTIHRocmVzaG9sZDsgYWxsb3dlZCByYW5nZTogMS4uMjU1OworICoJZG90MTFTaG9ydExvbmdMaW1pdDsgdTgKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfRlJBR19USFJFU0hPTEQ6IGZyYWdtZW50YXRpb24gdGhyZXNob2xkLCBpLmUuLCBtYXhpbXVtCisgKglsZW5ndGggaW4gb2N0ZXRzIGZvciBmcmFtZXM7IGFsbG93ZWQgcmFuZ2U6IDI1Ni4uODAwMCwgZGlzYWJsZQorICoJZnJhZ21lbnRhdGlvbiB3aXRoICh1MzIpLTE7IGRvdDExRnJhZ21lbnRhdGlvblRocmVzaG9sZDsgdTMyCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX1JUU19USFJFU0hPTEQ6IFJUUyB0aHJlc2hvbGQgKFRYIGZyYW1lcyB3aXRoIGxlbmd0aAorICoJbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gdGhpcyB1c2UgUlRTL0NUUyBoYW5kc2hha2UpOyBhbGxvd2VkIHJhbmdlOgorICoJMC4uNjU1MzYsIGRpc2FibGUgd2l0aCAodTMyKS0xOyBkb3QxMVJUU1RocmVzaG9sZDsgdTMyCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX0NPVkVSQUdFX0NMQVNTOiBDb3ZlcmFnZSBDbGFzcyBhcyBkZWZpbmVkIGJ5IElFRUUgODAyLjExCisgKglzZWN0aW9uIDcuMy4yLjk7IGRvdDExQ292ZXJhZ2VDbGFzczsgdTgKKyAqCisgKiBATkw4MDIxMV9BVFRSX0lGSU5ERVg6IG5ldHdvcmsgaW50ZXJmYWNlIGluZGV4IG9mIHRoZSBkZXZpY2UgdG8gb3BlcmF0ZSBvbgorICogQE5MODAyMTFfQVRUUl9JRk5BTUU6IG5ldHdvcmsgaW50ZXJmYWNlIG5hbWUKKyAqIEBOTDgwMjExX0FUVFJfSUZUWVBFOiB0eXBlIG9mIHZpcnR1YWwgaW50ZXJmYWNlLCBzZWUgJmVudW0gbmw4MDIxMV9pZnR5cGUKKyAqCisgKiBATkw4MDIxMV9BVFRSX01BQzogTUFDIGFkZHJlc3MgKHZhcmlvdXMgdXNlcykKKyAqCisgKiBATkw4MDIxMV9BVFRSX0tFWV9EQVRBOiAodGVtcG9yYWwpIGtleSBkYXRhOyBmb3IgVEtJUCB0aGlzIGNvbnNpc3RzIG9mCisgKgkxNiBieXRlcyBlbmNyeXB0aW9uIGtleSBmb2xsb3dlZCBieSA4IGJ5dGVzIGVhY2ggZm9yIFRYIGFuZCBSWCBNSUMKKyAqCWtleXMKKyAqIEBOTDgwMjExX0FUVFJfS0VZX0lEWDoga2V5IElEICh1OCwgMC0zKQorICogQE5MODAyMTFfQVRUUl9LRVlfQ0lQSEVSOiBrZXkgY2lwaGVyIHN1aXRlICh1MzIsIGFzIGRlZmluZWQgYnkgSUVFRSA4MDIuMTEKKyAqCXNlY3Rpb24gNy4zLjIuMjUuMSwgZS5nLiAweDAwMEZBQzA0KQorICogQE5MODAyMTFfQVRUUl9LRVlfU0VROiB0cmFuc21pdCBrZXkgc2VxdWVuY2UgbnVtYmVyIChJVi9QTikgZm9yIFRLSVAgYW5kCisgKglDQ01QIGtleXMsIGVhY2ggc2l4IGJ5dGVzIGluIGxpdHRsZSBlbmRpYW4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0JFQUNPTl9JTlRFUlZBTDogYmVhY29uIGludGVydmFsIGluIFRVCisgKiBATkw4MDIxMV9BVFRSX0RUSU1fUEVSSU9EOiBEVElNIHBlcmlvZCBmb3IgYmVhY29uaW5nCisgKiBATkw4MDIxMV9BVFRSX0JFQUNPTl9IRUFEOiBwb3J0aW9uIG9mIHRoZSBiZWFjb24gYmVmb3JlIHRoZSBUSU0gSUUKKyAqIEBOTDgwMjExX0FUVFJfQkVBQ09OX1RBSUw6IHBvcnRpb24gb2YgdGhlIGJlYWNvbiBhZnRlciB0aGUgVElNIElFCisgKgorICogQE5MODAyMTFfQVRUUl9TVEFfQUlEOiBBc3NvY2lhdGlvbiBJRCBmb3IgdGhlIHN0YXRpb24gKHUxNikKKyAqIEBOTDgwMjExX0FUVFJfU1RBX0ZMQUdTOiBmbGFncywgbmVzdGVkIGVsZW1lbnQgd2l0aCBOTEFfRkxBRyBhdHRyaWJ1dGVzIG9mCisgKgkmZW51bSBubDgwMjExX3N0YV9mbGFncyAoZGVwcmVjYXRlZCwgdXNlICVOTDgwMjExX0FUVFJfU1RBX0ZMQUdTMikKKyAqIEBOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTDogbGlzdGVuIGludGVydmFsIGFzIGRlZmluZWQgYnkKKyAqCUlFRUUgODAyLjExIDcuMy4xLjYgKHUxNikuCisgKiBATkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfUkFURVM6IHN1cHBvcnRlZCByYXRlcywgYXJyYXkgb2Ygc3VwcG9ydGVkCisgKglyYXRlcyBhcyBkZWZpbmVkIGJ5IElFRUUgODAyLjExIDcuMy4yLjIgYnV0IHdpdGhvdXQgdGhlIGxlbmd0aAorICoJcmVzdHJpY3Rpb24gKGF0IG1vc3QgJU5MODAyMTFfTUFYX1NVUFBfUkFURVMpLgorICogQE5MODAyMTFfQVRUUl9TVEFfVkxBTjogaW50ZXJmYWNlIGluZGV4IG9mIFZMQU4gaW50ZXJmYWNlIHRvIG1vdmUgc3RhdGlvbgorICoJdG8sIG9yIHRoZSBBUCBpbnRlcmZhY2UgdGhlIHN0YXRpb24gd2FzIG9yaWdpbmFsbHkgYWRkZWQgdG8gdG8uCisgKiBATkw4MDIxMV9BVFRSX1NUQV9JTkZPOiBpbmZvcm1hdGlvbiBhYm91dCBhIHN0YXRpb24sIHBhcnQgb2Ygc3RhdGlvbiBpbmZvCisgKglnaXZlbiBmb3IgJU5MODAyMTFfQ01EX0dFVF9TVEFUSU9OLCBuZXN0ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcKKyAqCWluZm8gYXMgcG9zc2libGUsIHNlZSAmZW51bSBubDgwMjExX3N0YV9pbmZvLgorICoKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfQkFORFM6IEluZm9ybWF0aW9uIGFib3V0IGFuIG9wZXJhdGluZyBiYW5kcywKKyAqCWNvbnNpc3Rpbmcgb2YgYSBuZXN0ZWQgYXJyYXkuCisgKgorICogQE5MODAyMTFfQVRUUl9NRVNIX0lEOiBtZXNoIGlkICgxLTMyIGJ5dGVzKS4KKyAqIEBOTDgwMjExX0FUVFJfU1RBX1BMSU5LX0FDVElPTjogYWN0aW9uIHRvIHBlcmZvcm0gb24gdGhlIG1lc2ggcGVlciBsaW5rLgorICogQE5MODAyMTFfQVRUUl9NUEFUSF9ORVhUX0hPUDogTUFDIGFkZHJlc3Mgb2YgdGhlIG5leHQgaG9wIGZvciBhIG1lc2ggcGF0aC4KKyAqIEBOTDgwMjExX0FUVFJfTVBBVEhfSU5GTzogaW5mb3JtYXRpb24gYWJvdXQgYSBtZXNoX3BhdGgsIHBhcnQgb2YgbWVzaCBwYXRoCisgKiAJaW5mbyBnaXZlbiBmb3IgJU5MODAyMTFfQ01EX0dFVF9NUEFUSCwgbmVzdGVkIGF0dHJpYnV0ZSBkZXNjcmliZWQgYXQKKyAqCSZlbnVtIG5sODAyMTFfbXBhdGhfaW5mby4KKyAqCisgKiBATkw4MDIxMV9BVFRSX01OVFJfRkxBR1M6IGZsYWdzLCBuZXN0ZWQgZWxlbWVudCB3aXRoIE5MQV9GTEFHIGF0dHJpYnV0ZXMgb2YKKyAqICAgICAgJmVudW0gbmw4MDIxMV9tbnRyX2ZsYWdzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfUkVHX0FMUEhBMjogYW4gSVNPLTMxNjYtYWxwaGEyIGNvdW50cnkgY29kZSBmb3Igd2hpY2ggdGhlCisgKiAJY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbiBzaG91bGQgYmUgc2V0IHRvIG9yIGlzIGFscmVhZHkgc2V0IHRvLgorICogCUZvciBleGFtcGxlLCAnQ1InLCBmb3IgQ29zdGEgUmljYS4gVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBieSB0aGUga2VybmVsCisgKiAJdG8gcXVlcnkgdGhlIENSREEgdG8gcmV0cmlldmUgb25lIHJlZ3VsYXRvcnkgZG9tYWluLiBUaGlzIGF0dHJpYnV0ZSBjYW4KKyAqIAlhbHNvIGJlIHVzZWQgYnkgdXNlcnNwYWNlIHRvIHF1ZXJ5IHRoZSBrZXJuZWwgZm9yIHRoZSBjdXJyZW50bHkgc2V0CisgKiAJcmVndWxhdG9yeSBkb21haW4uIFdlIGNob3NlIGFuIGFscGhhMiBhcyB0aGF0IGlzIGFsc28gdXNlZCBieSB0aGUKKyAqIAlJRUVFLTgwMi4xMWQgY291bnRyeSBpbmZvcm1hdGlvbiBlbGVtZW50IHRvIGlkZW50aWZ5IGEgY291bnRyeS4KKyAqIAlVc2VycyBjYW4gYWxzbyBzaW1wbHkgYXNrIHRoZSB3aXJlbGVzcyBjb3JlIHRvIHNldCByZWd1bGF0b3J5IGRvbWFpbgorICogCXRvIGEgc3BlY2lmaWMgYWxwaGEyLgorICogQE5MODAyMTFfQVRUUl9SRUdfUlVMRVM6IGEgbmVzdGVkIGFycmF5IG9mIHJlZ3VsYXRvcnkgZG9tYWluIHJlZ3VsYXRvcnkKKyAqCXJ1bGVzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfQlNTX0NUU19QUk9UOiB3aGV0aGVyIENUUyBwcm90ZWN0aW9uIGlzIGVuYWJsZWQgKHU4LCAwIG9yIDEpCisgKiBATkw4MDIxMV9BVFRSX0JTU19TSE9SVF9QUkVBTUJMRTogd2hldGhlciBzaG9ydCBwcmVhbWJsZSBpcyBlbmFibGVkCisgKgkodTgsIDAgb3IgMSkKKyAqIEBOTDgwMjExX0FUVFJfQlNTX1NIT1JUX1NMT1RfVElNRTogd2hldGhlciBzaG9ydCBzbG90IHRpbWUgZW5hYmxlZAorICoJKHU4LCAwIG9yIDEpCisgKiBATkw4MDIxMV9BVFRSX0JTU19CQVNJQ19SQVRFUzogYmFzaWMgcmF0ZXMsIGFycmF5IG9mIGJhc2ljCisgKglyYXRlcyBpbiBmb3JtYXQgZGVmaW5lZCBieSBJRUVFIDgwMi4xMSA3LjMuMi4yIGJ1dCB3aXRob3V0IHRoZSBsZW5ndGgKKyAqCXJlc3RyaWN0aW9uIChhdCBtb3N0ICVOTDgwMjExX01BWF9TVVBQX1JBVEVTKS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFk6IEhUIENhcGFiaWxpdHkgaW5mb3JtYXRpb24gZWxlbWVudCAoZnJvbQorICoJYXNzb2NpYXRpb24gcmVxdWVzdCB3aGVuIHVzZWQgd2l0aCBOTDgwMjExX0NNRF9ORVdfU1RBVElPTikKKyAqCisgKiBATkw4MDIxMV9BVFRSX1NVUFBPUlRFRF9JRlRZUEVTOiBuZXN0ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcgYWxsCisgKglzdXBwb3J0ZWQgaW50ZXJmYWNlIHR5cGVzLCBlYWNoIGEgZmxhZyBhdHRyaWJ1dGUgd2l0aCB0aGUgbnVtYmVyCisgKglvZiB0aGUgaW50ZXJmYWNlIG1vZGUuCisgKgorICogQE5MODAyMTFfQVRUUl9NR01UX1NVQlRZUEU6IE1hbmFnZW1lbnQgZnJhbWUgc3VidHlwZSBmb3IKKyAqCSVOTDgwMjExX0NNRF9TRVRfTUdNVF9FWFRSQV9JRS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0lFOiBJbmZvcm1hdGlvbiBlbGVtZW50KHMpIGRhdGEgKHVzZWQsIGUuZy4sIHdpdGgKKyAqCSVOTDgwMjExX0NNRF9TRVRfTUdNVF9FWFRSQV9JRSkuCisgKgorICogQE5MODAyMTFfQVRUUl9NQVhfTlVNX1NDQU5fU1NJRFM6IG51bWJlciBvZiBTU0lEcyB5b3UgY2FuIHNjYW4gd2l0aAorICoJYSBzaW5nbGUgc2NhbiByZXF1ZXN0LCBhIHdpcGh5IGF0dHJpYnV0ZS4KKyAqIEBOTDgwMjExX0FUVFJfTUFYX05VTV9TQ0hFRF9TQ0FOX1NTSURTOiBudW1iZXIgb2YgU1NJRHMgeW91IGNhbgorICoJc2NhbiB3aXRoIGEgc2luZ2xlIHNjaGVkdWxlZCBzY2FuIHJlcXVlc3QsIGEgd2lwaHkgYXR0cmlidXRlLgorICogQE5MODAyMTFfQVRUUl9NQVhfU0NBTl9JRV9MRU46IG1heGltdW0gbGVuZ3RoIG9mIGluZm9ybWF0aW9uIGVsZW1lbnRzCisgKgl0aGF0IGNhbiBiZSBhZGRlZCB0byBhIHNjYW4gcmVxdWVzdAorICogQE5MODAyMTFfQVRUUl9NQVhfU0NIRURfU0NBTl9JRV9MRU46IG1heGltdW0gbGVuZ3RoIG9mIGluZm9ybWF0aW9uCisgKgllbGVtZW50cyB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIHNjaGVkdWxlZCBzY2FuIHJlcXVlc3QKKyAqIEBOTDgwMjExX0FUVFJfTUFYX01BVENIX1NFVFM6IG1heGltdW0gbnVtYmVyIG9mIHNldHMgdGhhdCBjYW4gYmUKKyAqCXVzZWQgd2l0aCBATkw4MDIxMV9BVFRSX1NDSEVEX1NDQU5fTUFUQ0gsIGEgd2lwaHkgYXR0cmlidXRlLgorICoKKyAqIEBOTDgwMjExX0FUVFJfU0NBTl9GUkVRVUVOQ0lFUzogbmVzdGVkIGF0dHJpYnV0ZSB3aXRoIGZyZXF1ZW5jaWVzIChpbiBNSHopCisgKiBATkw4MDIxMV9BVFRSX1NDQU5fU1NJRFM6IG5lc3RlZCBhdHRyaWJ1dGUgd2l0aCBTU0lEcywgbGVhdmUgb3V0IGZvciBwYXNzaXZlCisgKglzY2FubmluZyBhbmQgaW5jbHVkZSBhIHplcm8tbGVuZ3RoIFNTSUQgKHdpbGRjYXJkKSBmb3Igd2lsZGNhcmQgc2NhbgorICogQE5MODAyMTFfQVRUUl9CU1M6IHNjYW4gcmVzdWx0IEJTUworICoKKyAqIEBOTDgwMjExX0FUVFJfUkVHX0lOSVRJQVRPUjogaW5kaWNhdGVzIHdobyByZXF1ZXN0ZWQgdGhlIHJlZ3VsYXRvcnkgZG9tYWluCisgKiAJY3VycmVudGx5IGluIGVmZmVjdC4gVGhpcyBjb3VsZCBiZSBhbnkgb2YgdGhlICVOTDgwMjExX1JFR0RPTV9TRVRfQllfKgorICogQE5MODAyMTFfQVRUUl9SRUdfVFlQRTogaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSByZWd1bGF0b3J5IGRvbWFpbiBjdXJyZW50bHkKKyAqIAlzZXQuIFRoaXMgY2FuIGJlIG9uZSBvZiB0aGUgbmw4MDIxMV9yZWdfdHlwZSAoJU5MODAyMTFfUkVHRE9NX1RZUEVfKikKKyAqCisgKiBATkw4MDIxMV9BVFRSX1NVUFBPUlRFRF9DT01NQU5EUzogd2lwaHkgYXR0cmlidXRlIHRoYXQgc3BlY2lmaWVzCisgKglhbiBhcnJheSBvZiBjb21tYW5kIG51bWJlcnMgKGkuZS4gYSBtYXBwaW5nIGluZGV4IHRvIGNvbW1hbmQgbnVtYmVyKQorICoJdGhhdCB0aGUgZHJpdmVyIGZvciB0aGUgZ2l2ZW4gd2lwaHkgc3VwcG9ydHMuCisgKgorICogQE5MODAyMTFfQVRUUl9GUkFNRTogZnJhbWUgZGF0YSAoYmluYXJ5IGF0dHJpYnV0ZSksIGluY2x1ZGluZyBmcmFtZSBoZWFkZXIKKyAqCWFuZCBib2R5LCBidXQgbm90IEZDUzsgdXNlZCwgZS5nLiwgd2l0aCBOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUgYW5kCisgKglOTDgwMjExX0NNRF9BU1NPQ0lBVEUgZXZlbnRzCisgKiBATkw4MDIxMV9BVFRSX1NTSUQ6IFNTSUQgKGJpbmFyeSBhdHRyaWJ1dGUsIDAuLjMyIG9jdGV0cykKKyAqIEBOTDgwMjExX0FUVFJfQVVUSF9UWVBFOiBBdXRoZW50aWNhdGlvblR5cGUsIHNlZSAmZW51bSBubDgwMjExX2F1dGhfdHlwZSwKKyAqCXJlcHJlc2VudGVkIGFzIGEgdTMyCisgKiBATkw4MDIxMV9BVFRSX1JFQVNPTl9DT0RFOiBSZWFzb25Db2RlIGZvciAlTkw4MDIxMV9DTURfREVBVVRIRU5USUNBVEUgYW5kCisgKgklTkw4MDIxMV9DTURfRElTQVNTT0NJQVRFLCB1MTYKKyAqCisgKiBATkw4MDIxMV9BVFRSX0tFWV9UWVBFOiBLZXkgVHlwZSwgc2VlICZlbnVtIG5sODAyMTFfa2V5X3R5cGUsIHJlcHJlc2VudGVkIGFzCisgKglhIHUzMgorICoKKyAqIEBOTDgwMjExX0FUVFJfRlJFUV9CRUZPUkU6IEEgY2hhbm5lbCB3aGljaCBoYXMgc3VmZmVyZWQgYSByZWd1bGF0b3J5IGNoYW5nZQorICogCWR1ZSB0byBjb25zaWRlcmF0aW9ucyBmcm9tIGEgYmVhY29uIGhpbnQuIFRoaXMgYXR0cmlidXRlIHJlZmxlY3RzCisgKiAJdGhlIHN0YXRlIG9mIHRoZSBjaGFubmVsIF9iZWZvcmVfIHRoZSBiZWFjb24gaGludCBwcm9jZXNzaW5nLiBUaGlzCisgKiAJYXR0cmlidXRlcyBjb25zaXN0cyBvZiBhIG5lc3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZworICogCU5MODAyMTFfRlJFUVVFTkNZX0FUVFJfKgorICogQE5MODAyMTFfQVRUUl9GUkVRX0FGVEVSOiBBIGNoYW5uZWwgd2hpY2ggaGFzIHN1ZmZlcmVkIGEgcmVndWxhdG9yeSBjaGFuZ2UKKyAqIAlkdWUgdG8gY29uc2lkZXJhdGlvbnMgZnJvbSBhIGJlYWNvbiBoaW50LiBUaGlzIGF0dHJpYnV0ZSByZWZsZWN0cworICogCXRoZSBzdGF0ZSBvZiB0aGUgY2hhbm5lbCBfYWZ0ZXJfIHRoZSBiZWFjb24gaGludCBwcm9jZXNzaW5nLiBUaGlzCisgKiAJYXR0cmlidXRlcyBjb25zaXN0cyBvZiBhIG5lc3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZworICogCU5MODAyMTFfRlJFUVVFTkNZX0FUVFJfKgorICoKKyAqIEBOTDgwMjExX0FUVFJfQ0lQSEVSX1NVSVRFUzogYSBzZXQgb2YgdTMyIHZhbHVlcyBpbmRpY2F0aW5nIHRoZSBzdXBwb3J0ZWQKKyAqCWNpcGhlciBzdWl0ZXMKKyAqCisgKiBATkw4MDIxMV9BVFRSX0ZSRVFfRklYRUQ6IGEgZmxhZyBpbmRpY2F0aW5nIHRoZSBJQlNTIHNob3VsZCBub3QgdHJ5IHRvIGxvb2sKKyAqCWZvciBvdGhlciBuZXR3b3JrcyBvbiBkaWZmZXJlbnQgY2hhbm5lbHMKKyAqCisgKiBATkw4MDIxMV9BVFRSX1RJTUVEX09VVDogYSBmbGFnIGluZGljYXRpbmcgdGhhbiBhbiBvcGVyYXRpb24gdGltZWQgb3V0OyB0aGlzCisgKglpcyB1c2VkLCBlLmcuLCB3aXRoICVOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUgZXZlbnQKKyAqCisgKiBATkw4MDIxMV9BVFRSX1VTRV9NRlA6IFdoZXRoZXIgbWFuYWdlbWVudCBmcmFtZSBwcm90ZWN0aW9uIChJRUVFIDgwMi4xMXcpIGlzCisgKgl1c2VkIGZvciB0aGUgYXNzb2NpYXRpb24gKCZlbnVtIG5sODAyMTFfbWZwLCByZXByZXNlbnRlZCBhcyBhIHUzMik7CisgKgl0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZAorICoJd2l0aCAlTkw4MDIxMV9DTURfQVNTT0NJQVRFIHJlcXVlc3QKKyAqCisgKiBATkw4MDIxMV9BVFRSX1NUQV9GTEFHUzI6IEF0dHJpYnV0ZSBjb250YWluaW5nIGEKKyAqCSZzdHJ1Y3Qgbmw4MDIxMV9zdGFfZmxhZ191cGRhdGUuCisgKgorICogQE5MODAyMTFfQVRUUl9DT05UUk9MX1BPUlQ6IEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdXNlciBzcGFjZSBjb250cm9scworICoJSUVFRSA4MDIuMVggcG9ydCwgaS5lLiwgc2V0cy9jbGVhcnMgJU5MODAyMTFfU1RBX0ZMQUdfQVVUSE9SSVpFRCwgaW4KKyAqCXN0YXRpb24gbW9kZS4gSWYgdGhlIGZsYWcgaXMgaW5jbHVkZWQgaW4gJU5MODAyMTFfQ01EX0FTU09DSUFURQorICoJcmVxdWVzdCwgdGhlIGRyaXZlciB3aWxsIGFzc3VtZSB0aGF0IHRoZSBwb3J0IGlzIHVuYXV0aG9yaXplZCB1bnRpbAorICoJYXV0aG9yaXplZCBieSB1c2VyIHNwYWNlLiBPdGhlcndpc2UsIHBvcnQgaXMgbWFya2VkIGF1dGhvcml6ZWQgYnkKKyAqCWRlZmF1bHQgaW4gc3RhdGlvbiBtb2RlLgorICogQE5MODAyMTFfQVRUUl9DT05UUk9MX1BPUlRfRVRIRVJUWVBFOiBBIDE2LWJpdCB2YWx1ZSBpbmRpY2F0aW5nIHRoZQorICoJZXRoZXJ0eXBlIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBrZXkgbmVnb3RpYXRpb24uIEl0IGNhbiBiZQorICoJc3BlY2lmaWVkIHdpdGggdGhlIGFzc29jaWF0ZSBhbmQgY29ubmVjdCBjb21tYW5kcy4gSWYgaXQgaXMgbm90CisgKglzcGVjaWZpZWQsIHRoZSB2YWx1ZSBkZWZhdWx0cyB0byAweDg4OEUgKFBBRSwgODAyLjFYKS4gVGhpcworICoJYXR0cmlidXRlIGlzIGFsc28gdXNlZCBhcyBhIGZsYWcgaW4gdGhlIHdpcGh5IGluZm9ybWF0aW9uIHRvCisgKglpbmRpY2F0ZSB0aGF0IHByb3RvY29scyBvdGhlciB0aGFuIFBBRSBhcmUgc3VwcG9ydGVkLgorICogQE5MODAyMTFfQVRUUl9DT05UUk9MX1BPUlRfTk9fRU5DUllQVDogV2hlbiBpbmNsdWRlZCBhbG9uZyB3aXRoCisgKgklTkw4MDIxMV9BVFRSX0NPTlRST0xfUE9SVF9FVEhFUlRZUEUsIGluZGljYXRlcyB0aGF0IHRoZSBjdXN0b20KKyAqCWV0aGVydHlwZSBmcmFtZXMgdXNlZCBmb3Iga2V5IG5lZ290aWF0aW9uIG11c3Qgbm90IGJlIGVuY3J5cHRlZC4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1RFU1REQVRBOiBUZXN0bW9kZSBkYXRhIGJsb2IsIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBkcml2ZXIuCisgKglXZSByZWNvbW1lbmQgdXNpbmcgbmVzdGVkLCBkcml2ZXItc3BlY2lmaWMgYXR0cmlidXRlcyB3aXRoaW4gdGhpcy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0RJU0NPTk5FQ1RFRF9CWV9BUDogQSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgRElTQ09OTkVDVAorICoJZXZlbnQgd2FzIGR1ZSB0byB0aGUgQVAgZGlzY29ubmVjdGluZyB0aGUgc3RhdGlvbiwgYW5kIG5vdCBkdWUgdG8KKyAqCWEgbG9jYWwgZGlzY29ubmVjdCByZXF1ZXN0LgorICogQE5MODAyMTFfQVRUUl9TVEFUVVNfQ09ERTogU3RhdHVzQ29kZSBmb3IgdGhlICVOTDgwMjExX0NNRF9DT05ORUNUCisgKglldmVudCAodTE2KQorICogQE5MODAyMTFfQVRUUl9QUklWQUNZOiBGbGFnIGF0dHJpYnV0ZSwgdXNlZCB3aXRoIGNvbm5lY3QoKSwgaW5kaWNhdGluZworICoJdGhhdCBwcm90ZWN0ZWQgQVBzIHNob3VsZCBiZSB1c2VkLiBUaGlzIGlzIGFsc28gdXNlZCB3aXRoIE5FV19CRUFDT04gdG8KKyAqCWluZGljYXRlIHRoYXQgdGhlIEJTUyBpcyB0byB1c2UgcHJvdGVjdGlvbi4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0NJUEhFUlNfUEFJUldJU0U6IFVzZWQgd2l0aCBDT05ORUNULCBBU1NPQ0lBVEUsIGFuZCBORVdfQkVBQ09OCisgKgl0byBpbmRpY2F0ZSB3aGljaCB1bmljYXN0IGtleSBjaXBoZXJzIHdpbGwgYmUgdXNlZCB3aXRoIHRoZSBjb25uZWN0aW9uCisgKgkoYW4gYXJyYXkgb2YgdTMyKS4KKyAqIEBOTDgwMjExX0FUVFJfQ0lQSEVSX0dST1VQOiBVc2VkIHdpdGggQ09OTkVDVCwgQVNTT0NJQVRFLCBhbmQgTkVXX0JFQUNPTiB0bworICoJaW5kaWNhdGUgd2hpY2ggZ3JvdXAga2V5IGNpcGhlciB3aWxsIGJlIHVzZWQgd2l0aCB0aGUgY29ubmVjdGlvbiAoYQorICoJdTMyKS4KKyAqIEBOTDgwMjExX0FUVFJfV1BBX1ZFUlNJT05TOiBVc2VkIHdpdGggQ09OTkVDVCwgQVNTT0NJQVRFLCBhbmQgTkVXX0JFQUNPTiB0bworICoJaW5kaWNhdGUgd2hpY2ggV1BBIHZlcnNpb24ocykgdGhlIEFQIHdlIHdhbnQgdG8gYXNzb2NpYXRlIHdpdGggaXMgdXNpbmcKKyAqCShhIHUzMiB3aXRoIGZsYWdzIGZyb20gJmVudW0gbmw4MDIxMV93cGFfdmVyc2lvbnMpLgorICogQE5MODAyMTFfQVRUUl9BS01fU1VJVEVTOiBVc2VkIHdpdGggQ09OTkVDVCwgQVNTT0NJQVRFLCBhbmQgTkVXX0JFQUNPTiB0bworICoJaW5kaWNhdGUgd2hpY2gga2V5IG1hbmFnZW1lbnQgYWxnb3JpdGhtKHMpIHRvIHVzZSAoYW4gYXJyYXkgb2YgdTMyKS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1JFUV9JRTogKFJlKWFzc29jaWF0aW9uIHJlcXVlc3QgaW5mb3JtYXRpb24gZWxlbWVudHMgYXMKKyAqCXNlbnQgb3V0IGJ5IHRoZSBjYXJkLCBmb3IgUk9BTSBhbmQgc3VjY2Vzc2Z1bCBDT05ORUNUIGV2ZW50cy4KKyAqIEBOTDgwMjExX0FUVFJfUkVTUF9JRTogKFJlKWFzc29jaWF0aW9uIHJlc3BvbnNlIGluZm9ybWF0aW9uIGVsZW1lbnRzIGFzCisgKglzZW50IGJ5IHBlZXIsIGZvciBST0FNIGFuZCBzdWNjZXNzZnVsIENPTk5FQ1QgZXZlbnRzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfUFJFVl9CU1NJRDogcHJldmlvdXMgQlNTSUQsIHRvIGJlIHVzZWQgYnkgaW4gQVNTT0NJQVRFCisgKgljb21tYW5kcyB0byBzcGVjaWZ5IHVzaW5nIGEgcmVhc3NvY2lhdGUgZnJhbWUKKyAqCisgKiBATkw4MDIxMV9BVFRSX0tFWToga2V5IGluZm9ybWF0aW9uIGluIGEgbmVzdGVkIGF0dHJpYnV0ZSB3aXRoCisgKgklTkw4MDIxMV9LRVlfKiBzdWItYXR0cmlidXRlcworICogQE5MODAyMTFfQVRUUl9LRVlTOiBhcnJheSBvZiBrZXlzIGZvciBzdGF0aWMgV0VQIGtleXMgZm9yIGNvbm5lY3QoKQorICoJYW5kIGpvaW5faWJzcygpLCBrZXkgaW5mb3JtYXRpb24gaXMgaW4gYSBuZXN0ZWQgYXR0cmlidXRlIGVhY2gKKyAqCXdpdGggJU5MODAyMTFfS0VZXyogc3ViLWF0dHJpYnV0ZXMKKyAqCisgKiBATkw4MDIxMV9BVFRSX1BJRDogUHJvY2VzcyBJRCBvZiBhIG5ldHdvcmsgbmFtZXNwYWNlLgorICoKKyAqIEBOTDgwMjExX0FUVFJfR0VORVJBVElPTjogVXNlZCB0byBpbmRpY2F0ZSBjb25zaXN0ZW50IHNuYXBzaG90cyBmb3IKKyAqCWR1bXBzLiBUaGlzIG51bWJlciBpbmNyZWFzZXMgd2hlbmV2ZXIgdGhlIG9iamVjdCBsaXN0IGJlaW5nCisgKglkdW1wZWQgY2hhbmdlcywgYW5kIGFzIHN1Y2ggdXNlcnNwYWNlIGNhbiB2ZXJpZnkgdGhhdCBpdCBoYXMKKyAqCW9idGFpbmVkIGEgY29tcGxldGUgYW5kIGNvbnNpc3RlbnQgc25hcHNob3QgYnkgdmVyaWZ5aW5nIHRoYXQKKyAqCWFsbCBkdW1wIG1lc3NhZ2VzIGNvbnRhaW4gdGhlIHNhbWUgZ2VuZXJhdGlvbiBudW1iZXIuIElmIGl0CisgKgljaGFuZ2VkIHRoZW4gdGhlIGxpc3QgY2hhbmdlZCBhbmQgdGhlIGR1bXAgc2hvdWxkIGJlIHJlcGVhdGVkCisgKgljb21wbGV0ZWx5IGZyb20gc2NyYXRjaC4KKyAqCisgKiBATkw4MDIxMV9BVFRSXzRBRERSOiBVc2UgNC1hZGRyZXNzIGZyYW1lcyBvbiBhIHZpcnR1YWwgaW50ZXJmYWNlCisgKgorICogQE5MODAyMTFfQVRUUl9TVVJWRVlfSU5GTzogc3VydmV5IGluZm9ybWF0aW9uIGFib3V0IGEgY2hhbm5lbCwgcGFydCBvZgorICogICAgICB0aGUgc3VydmV5IHJlc3BvbnNlIGZvciAlTkw4MDIxMV9DTURfR0VUX1NVUlZFWSwgbmVzdGVkIGF0dHJpYnV0ZQorICogICAgICBjb250YWluaW5nIGluZm8gYXMgcG9zc2libGUsIHNlZSAmZW51bSBzdXJ2ZXlfaW5mby4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1BNS0lEOiBQTUsgbWF0ZXJpYWwgZm9yIFBNS1NBIGNhY2hpbmcuCisgKiBATkw4MDIxMV9BVFRSX01BWF9OVU1fUE1LSURTOiBtYXhpbXVtIG51bWJlciBvZiBQTUtJRHMgYSBmaXJtd2FyZSBjYW4KKyAqCWNhY2hlLCBhIHdpcGh5IGF0dHJpYnV0ZS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0RVUkFUSU9OOiBEdXJhdGlvbiBvZiBhbiBvcGVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLCB1MzIuCisgKiBATkw4MDIxMV9BVFRSX01BWF9SRU1BSU5fT05fQ0hBTk5FTF9EVVJBVElPTjogRGV2aWNlIGF0dHJpYnV0ZSB0aGF0CisgKglzcGVjaWZpZXMgdGhlIG1heGltdW0gZHVyYXRpb24gdGhhdCBjYW4gYmUgcmVxdWVzdGVkIHdpdGggdGhlCisgKglyZW1haW4tb24tY2hhbm5lbCBvcGVyYXRpb24sIGluIG1pbGxpc2Vjb25kcywgdTMyLgorICoKKyAqIEBOTDgwMjExX0FUVFJfQ09PS0lFOiBHZW5lcmljIDY0LWJpdCBjb29raWUgdG8gaWRlbnRpZnkgb2JqZWN0cy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1RYX1JBVEVTOiBOZXN0ZWQgc2V0IG9mIGF0dHJpYnV0ZXMKKyAqCShlbnVtIG5sODAyMTFfdHhfcmF0ZV9hdHRyaWJ1dGVzKSBkZXNjcmliaW5nIFRYIHJhdGVzIHBlciBiYW5kLiBUaGUKKyAqCWVudW0gbmw4MDIxMV9iYW5kIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGluZGV4IChubGFfdHlwZSgpIG9mIHRoZSBuZXN0ZWQKKyAqCWRhdGEuIElmIGEgYmFuZCBpcyBub3QgaW5jbHVkZWQsIGl0IHdpbGwgYmUgY29uZmlndXJlZCB0byBhbGxvdyBhbGwKKyAqCXJhdGVzIGJhc2VkIG9uIG5lZ290aWF0ZWQgc3VwcG9ydGVkIHJhdGVzIGluZm9ybWF0aW9uLiBUaGlzIGF0dHJpYnV0ZQorICoJaXMgdXNlZCB3aXRoICVOTDgwMjExX0NNRF9TRVRfVFhfQklUUkFURV9NQVNLLgorICoKKyAqIEBOTDgwMjExX0FUVFJfRlJBTUVfTUFUQ0g6IEEgYmluYXJ5IGF0dHJpYnV0ZSB3aGljaCB0eXBpY2FsbHkgbXVzdCBjb250YWluCisgKglhdCBsZWFzdCBvbmUgYnl0ZSwgY3VycmVudGx5IHVzZWQgd2l0aCBATkw4MDIxMV9DTURfUkVHSVNURVJfRlJBTUUuCisgKiBATkw4MDIxMV9BVFRSX0ZSQU1FX1RZUEU6IEEgdTE2IGluZGljYXRpbmcgdGhlIGZyYW1lIHR5cGUvc3VidHlwZSBmb3IgdGhlCisgKglATkw4MDIxMV9DTURfUkVHSVNURVJfRlJBTUUgY29tbWFuZC4KKyAqIEBOTDgwMjExX0FUVFJfVFhfRlJBTUVfVFlQRVM6IHdpcGh5IGNhcGFiaWxpdHkgYXR0cmlidXRlLCB3aGljaCBpcyBhCisgKgluZXN0ZWQgYXR0cmlidXRlIG9mICVOTDgwMjExX0FUVFJfRlJBTUVfVFlQRSBhdHRyaWJ1dGVzLCBjb250YWluaW5nCisgKglpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBmcmFtZSB0eXBlcyBjYW4gYmUgdHJhbnNtaXR0ZWQgd2l0aAorICoJJU5MODAyMTFfQ01EX0ZSQU1FLgorICogQE5MODAyMTFfQVRUUl9SWF9GUkFNRV9UWVBFUzogd2lwaHkgY2FwYWJpbGl0eSBhdHRyaWJ1dGUsIHdoaWNoIGlzIGEKKyAqCW5lc3RlZCBhdHRyaWJ1dGUgb2YgJU5MODAyMTFfQVRUUl9GUkFNRV9UWVBFIGF0dHJpYnV0ZXMsIGNvbnRhaW5pbmcKKyAqCWluZm9ybWF0aW9uIGFib3V0IHdoaWNoIGZyYW1lIHR5cGVzIGNhbiBiZSByZWdpc3RlcmVkIGZvciBSWC4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0FDSzogRmxhZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGF0IHRoZSBmcmFtZSB3YXMKKyAqCWFja25vd2xlZGdlZCBieSB0aGUgcmVjaXBpZW50LgorICoKKyAqIEBOTDgwMjExX0FUVFJfQ1FNOiBjb25uZWN0aW9uIHF1YWxpdHkgbW9uaXRvciBjb25maWd1cmF0aW9uIGluIGEKKyAqCW5lc3RlZCBhdHRyaWJ1dGUgd2l0aCAlTkw4MDIxMV9BVFRSX0NRTV8qIHN1Yi1hdHRyaWJ1dGVzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfTE9DQUxfU1RBVEVfQ0hBTkdFOiBGbGFnIGF0dHJpYnV0ZSB0byBpbmRpY2F0ZSB0aGF0IGEgY29tbWFuZAorICoJaXMgcmVxdWVzdGluZyBhIGxvY2FsIGF1dGhlbnRpY2F0aW9uL2Fzc29jaWF0aW9uIHN0YXRlIGNoYW5nZSB3aXRob3V0CisgKglpbnZva2luZyBhY3R1YWwgbWFuYWdlbWVudCBmcmFtZSBleGNoYW5nZS4gVGhpcyBjYW4gYmUgdXNlZCB3aXRoCisgKglOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUsIE5MODAyMTFfQ01EX0RFQVVUSEVOVElDQVRFLAorICoJTkw4MDIxMV9DTURfRElTQVNTT0NJQVRFLgorICoKKyAqIEBOTDgwMjExX0FUVFJfQVBfSVNPTEFURTogKEFQIG1vZGUpIERvIG5vdCBmb3J3YXJkIHRyYWZmaWMgYmV0d2VlbiBzdGF0aW9ucworICoJY29ubmVjdGVkIHRvIHRoaXMgQlNTLgorICoKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfVFhfUE9XRVJfU0VUVElORzogVHJhbnNtaXQgcG93ZXIgc2V0dGluZyB0eXBlLiBTZWUKKyAqICAgICAgJmVudW0gbmw4MDIxMV90eF9wb3dlcl9zZXR0aW5nIGZvciBwb3NzaWJsZSB2YWx1ZXMuCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX1RYX1BPV0VSX0xFVkVMOiBUcmFuc21pdCBwb3dlciBsZXZlbCBpbiBzaWduZWQgbUJtIHVuaXRzLgorICogICAgICBUaGlzIGlzIHVzZWQgaW4gYXNzb2NpYXRpb24gd2l0aCBATkw4MDIxMV9BVFRSX1dJUEhZX1RYX1BPV0VSX1NFVFRJTkcKKyAqICAgICAgZm9yIG5vbi1hdXRvbWF0aWMgc2V0dGluZ3MuCisgKgorICogQE5MODAyMTFfQVRUUl9TVVBQT1JUX0lCU1NfUlNOOiBUaGUgZGV2aWNlIHN1cHBvcnRzIElCU1MgUlNOLCB3aGljaCBtb3N0bHkKKyAqCW1lYW5zIHN1cHBvcnQgZm9yIHBlci1zdGF0aW9uIEdUS3MuCisgKgorICogQE5MODAyMTFfQVRUUl9XSVBIWV9BTlRFTk5BX1RYOiBCaXRtYXAgb2YgYWxsb3dlZCBhbnRlbm5hcyBmb3IgdHJhbnNtaXR0aW5nLgorICoJVGhpcyBjYW4gYmUgdXNlZCB0byBtYXNrIG91dCBhbnRlbm5hcyB3aGljaCBhcmUgbm90IGF0dGFjaGVkIG9yIHNob3VsZAorICoJbm90IGJlIHVzZWQgZm9yIHRyYW5zbWl0dGluZy4gSWYgYW4gYW50ZW5uYSBpcyBub3Qgc2VsZWN0ZWQgaW4gdGhpcworICoJYml0bWFwIHRoZSBoYXJkd2FyZSBpcyBub3QgYWxsb3dlZCB0byB0cmFuc21pdCBvbiB0aGlzIGFudGVubmEuCisgKgorICoJRWFjaCBiaXQgcmVwcmVzZW50cyBvbmUgYW50ZW5uYSwgc3RhcnRpbmcgd2l0aCBhbnRlbm5hIDEgYXQgdGhlIGZpcnN0CisgKgliaXQuIERlcGVuZGluZyBvbiB3aGljaCBhbnRlbm5hcyBhcmUgc2VsZWN0ZWQgaW4gdGhlIGJpdG1hcCwgODAyLjExbgorICoJZHJpdmVycyBjYW4gZGVyaXZlIHdoaWNoIGNoYWlubWFza3MgdG8gdXNlIChpZiBhbGwgYW50ZW5uYXMgYmVsb25naW5nIHRvCisgKglhIHBhcnRpY3VsYXIgY2hhaW4gYXJlIGRpc2FibGVkIHRoaXMgY2hhaW4gc2hvdWxkIGJlIGRpc2FibGVkKSBhbmQgaWYKKyAqCWEgY2hhaW4gaGFzIGRpdmVyc2l0eSBhbnRlbm5hcyB3ZXRoZXIgZGl2ZXJzaXR5IHNob3VsZCBiZSB1c2VkIG9yIG5vdC4KKyAqCUhUIGNhcGFiaWxpdGllcyAoU1RCQywgVFggQmVhbWZvcm1pbmcsIEFudGVubmEgc2VsZWN0aW9uKSBjYW4gYmUKKyAqCWRlcml2ZWQgZnJvbSB0aGUgYXZhaWxhYmxlIGNoYWlucyBhZnRlciBhcHBseWluZyB0aGUgYW50ZW5uYSBtYXNrLgorICoJTm9uLTgwMi4xMW4gZHJpdmVycyBjYW4gZGVyaXZlIHdldGhlciB0byB1c2UgZGl2ZXJzaXR5IG9yIG5vdC4KKyAqCURyaXZlcnMgbWF5IHJlamVjdCBjb25maWd1cmF0aW9ucyBvciBSWC9UWCBtYXNrIGNvbWJpbmF0aW9ucyB0aGV5IGNhbm5vdAorICoJc3VwcG9ydCBieSByZXR1cm5pbmcgLUVJTlZBTC4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX0FOVEVOTkFfUlg6IEJpdG1hcCBvZiBhbGxvd2VkIGFudGVubmFzIGZvciByZWNlaXZpbmcuCisgKglUaGlzIGNhbiBiZSB1c2VkIHRvIG1hc2sgb3V0IGFudGVubmFzIHdoaWNoIGFyZSBub3QgYXR0YWNoZWQgb3Igc2hvdWxkCisgKglub3QgYmUgdXNlZCBmb3IgcmVjZWl2aW5nLiBJZiBhbiBhbnRlbm5hIGlzIG5vdCBzZWxlY3RlZCBpbiB0aGlzIGJpdG1hcAorICoJdGhlIGhhcmR3YXJlIHNob3VsZCBub3QgYmUgY29uZmlndXJlZCB0byByZWNlaXZlIG9uIHRoaXMgYW50ZW5uYS4KKyAqCUZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gc2VlIEBOTDgwMjExX0FUVFJfV0lQSFlfQU5URU5OQV9UWC4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX0FOVEVOTkFfQVZBSUxfVFg6IEJpdG1hcCBvZiBhbnRlbm5hcyB3aGljaCBhcmUgYXZhaWxhYmxlCisgKglmb3IgY29uZmlndXJhdGlvbiBhcyBUWCBhbnRlbm5hcyB2aWEgdGhlIGFib3ZlIHBhcmFtZXRlcnMuCisgKgorICogQE5MODAyMTFfQVRUUl9XSVBIWV9BTlRFTk5BX0FWQUlMX1JYOiBCaXRtYXAgb2YgYW50ZW5uYXMgd2hpY2ggYXJlIGF2YWlsYWJsZQorICoJZm9yIGNvbmZpZ3VyYXRpb24gYXMgUlggYW50ZW5uYXMgdmlhIHRoZSBhYm92ZSBwYXJhbWV0ZXJzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfTUNBU1RfUkFURTogTXVsdGljYXN0IHR4IHJhdGUgKGluIDEwMCBrYnBzKSBmb3IgSUJTUworICoKKyAqIEBOTDgwMjExX0FUVFJfT0ZGQ0hBTk5FTF9UWF9PSzogRm9yIG1hbmFnZW1lbnQgZnJhbWUgVFgsIHRoZSBmcmFtZSBtYXkgYmUKKyAqCXRyYW5zbWl0dGVkIG9uIGFub3RoZXIgY2hhbm5lbCB3aGVuIHRoZSBjaGFubmVsIGdpdmVuIGRvZXNuJ3QgbWF0Y2gKKyAqCXRoZSBjdXJyZW50IGNoYW5uZWwuIElmIHRoZSBjdXJyZW50IGNoYW5uZWwgZG9lc24ndCBtYXRjaCBhbmQgdGhpcworICoJZmxhZyBpc24ndCBzZXQsIHRoZSBmcmFtZSB3aWxsIGJlIHJlamVjdGVkLiBUaGlzIGlzIGFsc28gdXNlZCBhcyBhbgorICoJbmw4MDIxMSBjYXBhYmlsaXR5IGZsYWcuCisgKgorICogQE5MODAyMTFfQVRUUl9CU1NfSFRPUE1PREU6IEhUIG9wZXJhdGlvbiBtb2RlICh1MTYpCisgKgorICogQE5MODAyMTFfQVRUUl9LRVlfREVGQVVMVF9UWVBFUzogQSBuZXN0ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcgZmxhZ3MKKyAqCWF0dHJpYnV0ZXMsIHNwZWNpZnlpbmcgd2hhdCBhIGtleSBzaG91bGQgYmUgc2V0IGFzIGRlZmF1bHQgYXMuCisgKglTZWUgJmVudW0gbmw4MDIxMV9rZXlfZGVmYXVsdF90eXBlcy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX01FU0hfU0VUVVA6IE9wdGlvbmFsIG1lc2ggc2V0dXAgcGFyYW1ldGVycy4gIFRoZXNlIGNhbm5vdCBiZQorICoJY2hhbmdlZCBvbmNlIHRoZSBtZXNoIGlzIGFjdGl2ZS4KKyAqIEBOTDgwMjExX0FUVFJfTUVTSF9DT05GSUc6IE1lc2ggY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLCBhIG5lc3RlZCBhdHRyaWJ1dGUKKyAqCWNvbnRhaW5pbmcgYXR0cmlidXRlcyBmcm9tICZlbnVtIG5sODAyMTFfbWVzaGNvbmZfcGFyYW1zLgorICogQE5MODAyMTFfQVRUUl9TVVBQT1JUX01FU0hfQVVUSDogQ3VycmVudGx5LCB0aGlzIG1lYW5zIHRoZSB1bmRlcmx5aW5nIGRyaXZlcgorICoJYWxsb3dzIGF1dGggZnJhbWVzIGluIGEgbWVzaCB0byBiZSBwYXNzZWQgdG8gdXNlcnNwYWNlIGZvciBwcm9jZXNzaW5nIHZpYQorICoJdGhlIEBOTDgwMjExX01FU0hfU0VUVVBfVVNFUlNQQUNFX0FVVEggZmxhZy4KKyAqIEBOTDgwMjExX0FUVFJfU1RBX1BMSU5LX1NUQVRFOiBUaGUgc3RhdGUgb2YgYSBtZXNoIHBlZXIgbGluayBhcworICoJZGVmaW5lZCBpbiAmZW51bSBubDgwMjExX3BsaW5rX3N0YXRlLiBVc2VkIHdoZW4gdXNlcnNwYWNlIGlzCisgKglkcml2aW5nIHRoZSBwZWVyIGxpbmsgbWFuYWdlbWVudCBzdGF0ZSBtYWNoaW5lLgorICoJQE5MODAyMTFfTUVTSF9TRVRVUF9VU0VSU1BBQ0VfQU1QRSBtdXN0IGJlIGVuYWJsZWQuCisgKgorICogQE5MODAyMTFfQVRUUl9XT1dMQU5fVFJJR0dFUlNfU1VQUE9SVEVEOiBpbmRpY2F0ZXMsIGFzIHBhcnQgb2YgdGhlIHdpcGh5CisgKgljYXBhYmlsaXRpZXMsIHRoZSBzdXBwb3J0ZWQgV29XTEFOIHRyaWdnZXJzCisgKiBATkw4MDIxMV9BVFRSX1dPV0xBTl9UUklHR0VSUzogdXNlZCBieSAlTkw4MDIxMV9DTURfU0VUX1dPV0xBTiB0bworICoJaW5kaWNhdGUgd2hpY2ggV29XIHRyaWdnZXJzIHNob3VsZCBiZSBlbmFibGVkLiBUaGlzIGlzIGFsc28KKyAqCXVzZWQgYnkgJU5MODAyMTFfQ01EX0dFVF9XT1dMQU4gdG8gZ2V0IHRoZSBjdXJyZW50bHkgZW5hYmxlZCBXb1dMQU4KKyAqCXRyaWdnZXJzLgorCisgKiBATkw4MDIxMV9BVFRSX1NDSEVEX1NDQU5fSU5URVJWQUw6IEludGVydmFsIGJldHdlZW4gc2NoZWR1bGVkIHNjYW4KKyAqCWN5Y2xlcywgaW4gbXNlY3MuCisKKyAqIEBOTDgwMjExX0FUVFJfU0NIRURfU0NBTl9NQVRDSDogTmVzdGVkIGF0dHJpYnV0ZSB3aXRoIG9uZSBvciBtb3JlCisgKglzZXRzIG9mIGF0dHJpYnV0ZXMgdG8gbWF0Y2ggZHVyaW5nIHNjaGVkdWxlZCBzY2Fucy4gIE9ubHkgQlNTcworICoJdGhhdCBtYXRjaCBhbnkgb2YgdGhlIHNldHMgd2lsbCBiZSByZXBvcnRlZC4gIFRoZXNlIGFyZQorICoJcGFzcy10aHJ1IGZpbHRlciBydWxlcy4KKyAqCUZvciBhIG1hdGNoIHRvIHN1Y2NlZWQsIHRoZSBCU1MgbXVzdCBtYXRjaCBhbGwgYXR0cmlidXRlcyBvZiBhCisgKglzZXQuICBTaW5jZSBub3QgZXZlcnkgaGFyZHdhcmUgc3VwcG9ydHMgbWF0Y2hpbmcgYWxsIHR5cGVzIG9mCisgKglhdHRyaWJ1dGVzLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgcmVwb3J0ZWQgQlNTcyBhcmUKKyAqCWZ1bGx5IGNvbXBseWluZyB3aXRoIHRoZSBtYXRjaCBzZXRzIGFuZCB1c2Vyc3BhY2UgbmVlZHMgdG8gYmUKKyAqCWFibGUgdG8gaWdub3JlIHRoZW0gYnkgaXRzZWxmLgorICoJVGh1cywgdGhlIGltcGxlbWVudGF0aW9uIGlzIHNvbWV3aGF0IGhhcmR3YXJlLWRlcGVuZGVudCwgYnV0CisgKgl0aGlzIGlzIG9ubHkgYW4gb3B0aW1pemF0aW9uIGFuZCB0aGUgdXNlcnNwYWNlIGFwcGxpY2F0aW9uCisgKgluZWVkcyB0byBoYW5kbGUgYWxsIHRoZSBub24tZmlsdGVyZWQgcmVzdWx0cyBhbnl3YXkuCisgKglJZiB0aGUgbWF0Y2ggYXR0cmlidXRlcyBkb24ndCBtYWtlIHNlbnNlIHdoZW4gY29tYmluZWQgd2l0aAorICoJdGhlIHZhbHVlcyBwYXNzZWQgaW4gQE5MODAyMTFfQVRUUl9TQ0FOX1NTSURTIChlZy4gaWYgYW4gU1NJRAorICoJaXMgaW5jbHVkZWQgaW4gdGhlIHByb2JlIHJlcXVlc3QsIGJ1dCB0aGUgbWF0Y2ggYXR0cmlidXRlcworICoJd2lsbCBuZXZlciBsZXQgaXQgZ28gdGhyb3VnaCksIC1FSU5WQUwgbWF5IGJlIHJldHVybmVkLgorICoJSWYgb21taXRlZCwgbm8gZmlsdGVyaW5nIGlzIGRvbmUuCisgKgorICogQE5MODAyMTFfQVRUUl9JTlRFUkZBQ0VfQ09NQklOQVRJT05TOiBOZXN0ZWQgYXR0cmlidXRlIGxpc3RpbmcgdGhlIHN1cHBvcnRlZAorICoJaW50ZXJmYWNlIGNvbWJpbmF0aW9ucy4gSW4gZWFjaCBuZXN0ZWQgaXRlbSwgaXQgY29udGFpbnMgYXR0cmlidXRlcworICoJZGVmaW5lZCBpbiAmZW51bSBubDgwMjExX2lmX2NvbWJpbmF0aW9uX2F0dHJzLgorICogQE5MODAyMTFfQVRUUl9TT0ZUV0FSRV9JRlRZUEVTOiBOZXN0ZWQgYXR0cmlidXRlIChqdXN0IGxpa2UKKyAqCSVOTDgwMjExX0FUVFJfU1VQUE9SVEVEX0lGVFlQRVMpIGNvbnRhaW5pbmcgdGhlIGludGVyZmFjZSB0eXBlcyB0aGF0CisgKglhcmUgbWFuYWdlZCBpbiBzb2Z0d2FyZTogaW50ZXJmYWNlcyBvZiB0aGVzZSB0eXBlcyBhcmVuJ3Qgc3ViamVjdCB0bworICoJYW55IHJlc3RyaWN0aW9ucyBpbiB0aGVpciBudW1iZXIgb3IgY29tYmluYXRpb25zLgorICoKKyAqIEAlTkw4MDIxMV9BVFRSX1JFS0VZX0RBVEE6IG5lc3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgaW5mb3JtYXRpb24KKyAqCW5lY2Vzc2FyeSBmb3IgR1RLIHJla2V5aW5nIGluIHRoZSBkZXZpY2UsIHNlZSAmZW51bSBubDgwMjExX3Jla2V5X2RhdGEuCisgKgorICogQE5MODAyMTFfQVRUUl9TQ0FOX1NVUFBfUkFURVM6IHJhdGVzIHBlciB0byBiZSBhZHZlcnRpc2VkIGFzIHN1cHBvcnRlZCBpbiBzY2FuLAorICoJbmVzdGVkIGFycmF5IGF0dHJpYnV0ZSBjb250YWluaW5nIGFuIGVudHJ5IGZvciBlYWNoIGJhbmQsIHdpdGggdGhlIGVudHJ5CisgKgliZWluZyBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHJhdGVzIGFzIGRlZmluZWQgYnkgSUVFRSA4MDIuMTEgNy4zLjIuMiBidXQKKyAqCXdpdGhvdXQgdGhlIGxlbmd0aCByZXN0cmljdGlvbiAoYXQgbW9zdCAlTkw4MDIxMV9NQVhfU1VQUF9SQVRFUykuCisgKgorICogQE5MODAyMTFfQVRUUl9ISURERU5fU1NJRDogaW5kaWNhdGVzIHdoZXRoZXIgU1NJRCBpcyB0byBiZSBoaWRkZW4gZnJvbSBCZWFjb24KKyAqCWFuZCBQcm9iZSBSZXNwb25zZSAod2hlbiByZXNwb25zZSB0byB3aWxkY2FyZCBQcm9iZSBSZXF1ZXN0KTsgc2VlCisgKgkmZW51bSBubDgwMjExX2hpZGRlbl9zc2lkLCByZXByZXNlbnRlZCBhcyBhIHUzMgorICoKKyAqIEBOTDgwMjExX0FUVFJfSUVfUFJPQkVfUkVTUDogSW5mb3JtYXRpb24gZWxlbWVudChzKSBmb3IgUHJvYmUgUmVzcG9uc2UgZnJhbWUuCisgKglUaGlzIGlzIHVzZWQgd2l0aCAlTkw4MDIxMV9DTURfTkVXX0JFQUNPTiBhbmQgJU5MODAyMTFfQ01EX1NFVF9CRUFDT04gdG8KKyAqCXByb3ZpZGUgZXh0cmEgSUVzIChlLmcuLCBXUFMvUDJQIElFKSBpbnRvIFByb2JlIFJlc3BvbnNlIGZyYW1lcyB3aGVuIHRoZQorICoJZHJpdmVyIChvciBmaXJtd2FyZSkgcmVwbGllcyB0byBQcm9iZSBSZXF1ZXN0IGZyYW1lcy4KKyAqIEBOTDgwMjExX0FUVFJfSUVfQVNTT0NfUkVTUDogSW5mb3JtYXRpb24gZWxlbWVudChzKSBmb3IgKFJlKUFzc29jaWF0aW9uCisgKglSZXNwb25zZSBmcmFtZXMuIFRoaXMgaXMgdXNlZCB3aXRoICVOTDgwMjExX0NNRF9ORVdfQkVBQ09OIGFuZAorICoJJU5MODAyMTFfQ01EX1NFVF9CRUFDT04gdG8gcHJvdmlkZSBleHRyYSBJRXMgKGUuZy4sIFdQUy9QMlAgSUUpIGludG8KKyAqCShSZSlBc3NvY2lhdGlvbiBSZXNwb25zZSBmcmFtZXMgd2hlbiB0aGUgZHJpdmVyIChvciBmaXJtd2FyZSkgcmVwbGllcyB0bworICoJKFJlKUFzc29jaWF0aW9uIFJlcXVlc3QgZnJhbWVzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfU1RBX1dNRTogTmVzdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nIHRoZSB3bWUgY29uZmlndXJhdGlvbgorICoJb2YgdGhlIHN0YXRpb24sIHNlZSAmZW51bSBubDgwMjExX3N0YV93bWVfYXR0ci4KKyAqIEBOTDgwMjExX0FUVFJfU1VQUE9SVF9BUF9VQVBTRDogdGhlIGRldmljZSBzdXBwb3J0cyB1YXBzZCB3aGVuIHdvcmtpbmcKKyAqCWFzIEFQLgorICoKKyAqIEBOTDgwMjExX0FUVFJfUk9BTV9TVVBQT1JUOiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmlybXdhcmUgaXMgY2FwYWJsZSBvZgorICoJcm9hbWluZyB0byBhbm90aGVyIEFQIGluIHRoZSBzYW1lIEVTUyBpZiB0aGUgc2lnbmFsIGxldmVyIGlzIGxvdy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1BNS1NBX0NBTkRJREFURTogTmVzdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nIHRoZSBQTUtTQSBjYWNoaW5nCisgKgljYW5kaWRhdGUgaW5mb3JtYXRpb24sIHNlZSAmZW51bSBubDgwMjExX3Bta3NhX2NhbmRpZGF0ZV9hdHRyLgorICoKKyAqIEBOTDgwMjExX0FUVFJfVFhfTk9fQ0NLX1JBVEU6IEluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSBDQ0sgcmF0ZSBvciBub3QKKyAqCWZvciBtYW5hZ2VtZW50IGZyYW1lcyB0cmFuc21pc3Npb24uIEluIG9yZGVyIHRvIGF2b2lkIHAycCBwcm9iZS9hY3Rpb24KKyAqCWZyYW1lcyBhcmUgYmVpbmcgdHJhbnNtaXR0ZWQgYXQgQ0NLIHJhdGUgaW4gMkdIeiBiYW5kLCB0aGUgdXNlciBzcGFjZQorICoJYXBwbGljYXRpb25zIHVzZSB0aGlzIGF0dHJpYnV0ZS4KKyAqCVRoaXMgYXR0cmlidXRlIGlzIHVzZWQgd2l0aCAlTkw4MDIxMV9DTURfVFJJR0dFUl9TQ0FOIGFuZAorICoJJU5MODAyMTFfQ01EX0ZSQU1FIGNvbW1hbmRzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfVERMU19BQ1RJT046IExvdyBsZXZlbCBURExTIGFjdGlvbiBjb2RlIChlLmcuIGxpbmsgc2V0dXAKKyAqCXJlcXVlc3QsIGxpbmsgc2V0dXAgY29uZmlybSwgbGluayB0ZWFyZG93biwgZXRjLikuIFZhbHVlcyBhcmUKKyAqCWRlc2NyaWJlZCBpbiB0aGUgVERMUyAoODAyLjExeikgc3BlY2lmaWNhdGlvbi4KKyAqIEBOTDgwMjExX0FUVFJfVERMU19ESUFMT0dfVE9LRU46IE5vbi16ZXJvIHRva2VuIGZvciB1bmlxdWVseSBpZGVudGlmeWluZyBhCisgKglURExTIGNvbnZlcnNhdGlvbiBiZXR3ZWVuIHR3byBkZXZpY2VzLgorICogQE5MODAyMTFfQVRUUl9URExTX09QRVJBVElPTjogSGlnaCBsZXZlbCBURExTIG9wZXJhdGlvbjsgc2VlCisgKgkmZW51bSBubDgwMjExX3RkbHNfb3BlcmF0aW9uLCByZXByZXNlbnRlZCBhcyBhIHU4LgorICogQE5MODAyMTFfQVRUUl9URExTX1NVUFBPUlQ6IEEgZmxhZyBpbmRpY2F0aW5nIHRoZSBkZXZpY2UgY2FuIG9wZXJhdGUKKyAqCWFzIGEgVERMUyBwZWVyIHN0YS4KKyAqIEBOTDgwMjExX0FUVFJfVERMU19FWFRFUk5BTF9TRVRVUDogVGhlIFRETFMgZGlzY292ZXJ5L3NldHVwIGFuZCB0ZWFyZG93bgorICoJcHJvY2VkdXJlcyBzaG91bGQgYmUgcGVyZm9ybWVkIGJ5IHNlbmRpbmcgVERMUyBwYWNrZXRzIHZpYQorICoJJU5MODAyMTFfQ01EX1RETFNfTUdNVC4gT3RoZXJ3aXNlICVOTDgwMjExX0NNRF9URExTX09QRVIgc2hvdWxkIGJlCisgKgl1c2VkIGZvciBhc2tpbmcgdGhlIGRyaXZlciB0byBwZXJmb3JtIGEgVERMUyBvcGVyYXRpb24uCisgKgorICogQE5MODAyMTFfQVRUUl9NQVg6IGhpZ2hlc3QgYXR0cmlidXRlIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZAorICogQF9fTkw4MDIxMV9BVFRSX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfYXR0cnMgeworLyogZG9uJ3QgY2hhbmdlIHRoZSBvcmRlciBvciBhZGQgYW55dGhpbmcgYmV0d2VlbiwgdGhpcyBpcyBBQkkhICovCisJTkw4MDIxMV9BVFRSX1VOU1BFQywKKworCU5MODAyMTFfQVRUUl9XSVBIWSwKKwlOTDgwMjExX0FUVFJfV0lQSFlfTkFNRSwKKworCU5MODAyMTFfQVRUUl9JRklOREVYLAorCU5MODAyMTFfQVRUUl9JRk5BTUUsCisJTkw4MDIxMV9BVFRSX0lGVFlQRSwKKworCU5MODAyMTFfQVRUUl9NQUMsCisKKwlOTDgwMjExX0FUVFJfS0VZX0RBVEEsCisJTkw4MDIxMV9BVFRSX0tFWV9JRFgsCisJTkw4MDIxMV9BVFRSX0tFWV9DSVBIRVIsCisJTkw4MDIxMV9BVFRSX0tFWV9TRVEsCisJTkw4MDIxMV9BVFRSX0tFWV9ERUZBVUxULAorCisJTkw4MDIxMV9BVFRSX0JFQUNPTl9JTlRFUlZBTCwKKwlOTDgwMjExX0FUVFJfRFRJTV9QRVJJT0QsCisJTkw4MDIxMV9BVFRSX0JFQUNPTl9IRUFELAorCU5MODAyMTFfQVRUUl9CRUFDT05fVEFJTCwKKworCU5MODAyMTFfQVRUUl9TVEFfQUlELAorCU5MODAyMTFfQVRUUl9TVEFfRkxBR1MsCisJTkw4MDIxMV9BVFRSX1NUQV9MSVNURU5fSU5URVJWQUwsCisJTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfUkFURVMsCisJTkw4MDIxMV9BVFRSX1NUQV9WTEFOLAorCU5MODAyMTFfQVRUUl9TVEFfSU5GTywKKworCU5MODAyMTFfQVRUUl9XSVBIWV9CQU5EUywKKworCU5MODAyMTFfQVRUUl9NTlRSX0ZMQUdTLAorCisJTkw4MDIxMV9BVFRSX01FU0hfSUQsCisJTkw4MDIxMV9BVFRSX1NUQV9QTElOS19BQ1RJT04sCisJTkw4MDIxMV9BVFRSX01QQVRIX05FWFRfSE9QLAorCU5MODAyMTFfQVRUUl9NUEFUSF9JTkZPLAorCisJTkw4MDIxMV9BVFRSX0JTU19DVFNfUFJPVCwKKwlOTDgwMjExX0FUVFJfQlNTX1NIT1JUX1BSRUFNQkxFLAorCU5MODAyMTFfQVRUUl9CU1NfU0hPUlRfU0xPVF9USU1FLAorCisJTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFksCisKKwlOTDgwMjExX0FUVFJfU1VQUE9SVEVEX0lGVFlQRVMsCisKKwlOTDgwMjExX0FUVFJfUkVHX0FMUEhBMiwKKwlOTDgwMjExX0FUVFJfUkVHX1JVTEVTLAorCisJTkw4MDIxMV9BVFRSX01FU0hfQ09ORklHLAorCisJTkw4MDIxMV9BVFRSX0JTU19CQVNJQ19SQVRFUywKKworCU5MODAyMTFfQVRUUl9XSVBIWV9UWFFfUEFSQU1TLAorCU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRLAorCU5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEUsCisKKwlOTDgwMjExX0FUVFJfS0VZX0RFRkFVTFRfTUdNVCwKKworCU5MODAyMTFfQVRUUl9NR01UX1NVQlRZUEUsCisJTkw4MDIxMV9BVFRSX0lFLAorCisJTkw4MDIxMV9BVFRSX01BWF9OVU1fU0NBTl9TU0lEUywKKworCU5MODAyMTFfQVRUUl9TQ0FOX0ZSRVFVRU5DSUVTLAorCU5MODAyMTFfQVRUUl9TQ0FOX1NTSURTLAorCU5MODAyMTFfQVRUUl9HRU5FUkFUSU9OLCAvKiByZXBsYWNlcyBvbGQgU0NBTl9HRU5FUkFUSU9OICovCisJTkw4MDIxMV9BVFRSX0JTUywKKworCU5MODAyMTFfQVRUUl9SRUdfSU5JVElBVE9SLAorCU5MODAyMTFfQVRUUl9SRUdfVFlQRSwKKworCU5MODAyMTFfQVRUUl9TVVBQT1JURURfQ09NTUFORFMsCisKKwlOTDgwMjExX0FUVFJfRlJBTUUsCisJTkw4MDIxMV9BVFRSX1NTSUQsCisJTkw4MDIxMV9BVFRSX0FVVEhfVFlQRSwKKwlOTDgwMjExX0FUVFJfUkVBU09OX0NPREUsCisKKwlOTDgwMjExX0FUVFJfS0VZX1RZUEUsCisKKwlOTDgwMjExX0FUVFJfTUFYX1NDQU5fSUVfTEVOLAorCU5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVTLAorCisJTkw4MDIxMV9BVFRSX0ZSRVFfQkVGT1JFLAorCU5MODAyMTFfQVRUUl9GUkVRX0FGVEVSLAorCisJTkw4MDIxMV9BVFRSX0ZSRVFfRklYRUQsCisKKworCU5MODAyMTFfQVRUUl9XSVBIWV9SRVRSWV9TSE9SVCwKKwlOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfTE9ORywKKwlOTDgwMjExX0FUVFJfV0lQSFlfRlJBR19USFJFU0hPTEQsCisJTkw4MDIxMV9BVFRSX1dJUEhZX1JUU19USFJFU0hPTEQsCisKKwlOTDgwMjExX0FUVFJfVElNRURfT1VULAorCisJTkw4MDIxMV9BVFRSX1VTRV9NRlAsCisKKwlOTDgwMjExX0FUVFJfU1RBX0ZMQUdTMiwKKworCU5MODAyMTFfQVRUUl9DT05UUk9MX1BPUlQsCisKKwlOTDgwMjExX0FUVFJfVEVTVERBVEEsCisKKwlOTDgwMjExX0FUVFJfUFJJVkFDWSwKKworCU5MODAyMTFfQVRUUl9ESVNDT05ORUNURURfQllfQVAsCisJTkw4MDIxMV9BVFRSX1NUQVRVU19DT0RFLAorCisJTkw4MDIxMV9BVFRSX0NJUEhFUl9TVUlURVNfUEFJUldJU0UsCisJTkw4MDIxMV9BVFRSX0NJUEhFUl9TVUlURV9HUk9VUCwKKwlOTDgwMjExX0FUVFJfV1BBX1ZFUlNJT05TLAorCU5MODAyMTFfQVRUUl9BS01fU1VJVEVTLAorCisJTkw4MDIxMV9BVFRSX1JFUV9JRSwKKwlOTDgwMjExX0FUVFJfUkVTUF9JRSwKKworCU5MODAyMTFfQVRUUl9QUkVWX0JTU0lELAorCisJTkw4MDIxMV9BVFRSX0tFWSwKKwlOTDgwMjExX0FUVFJfS0VZUywKKworCU5MODAyMTFfQVRUUl9QSUQsCisKKwlOTDgwMjExX0FUVFJfNEFERFIsCisKKwlOTDgwMjExX0FUVFJfU1VSVkVZX0lORk8sCisKKwlOTDgwMjExX0FUVFJfUE1LSUQsCisJTkw4MDIxMV9BVFRSX01BWF9OVU1fUE1LSURTLAorCisJTkw4MDIxMV9BVFRSX0RVUkFUSU9OLAorCisJTkw4MDIxMV9BVFRSX0NPT0tJRSwKKworCU5MODAyMTFfQVRUUl9XSVBIWV9DT1ZFUkFHRV9DTEFTUywKKworCU5MODAyMTFfQVRUUl9UWF9SQVRFUywKKworCU5MODAyMTFfQVRUUl9GUkFNRV9NQVRDSCwKKworCU5MODAyMTFfQVRUUl9BQ0ssCisKKwlOTDgwMjExX0FUVFJfUFNfU1RBVEUsCisKKwlOTDgwMjExX0FUVFJfQ1FNLAorCisJTkw4MDIxMV9BVFRSX0xPQ0FMX1NUQVRFX0NIQU5HRSwKKworCU5MODAyMTFfQVRUUl9BUF9JU09MQVRFLAorCisJTkw4MDIxMV9BVFRSX1dJUEhZX1RYX1BPV0VSX1NFVFRJTkcsCisJTkw4MDIxMV9BVFRSX1dJUEhZX1RYX1BPV0VSX0xFVkVMLAorCisJTkw4MDIxMV9BVFRSX1RYX0ZSQU1FX1RZUEVTLAorCU5MODAyMTFfQVRUUl9SWF9GUkFNRV9UWVBFUywKKwlOTDgwMjExX0FUVFJfRlJBTUVfVFlQRSwKKworCU5MODAyMTFfQVRUUl9DT05UUk9MX1BPUlRfRVRIRVJUWVBFLAorCU5MODAyMTFfQVRUUl9DT05UUk9MX1BPUlRfTk9fRU5DUllQVCwKKworCU5MODAyMTFfQVRUUl9TVVBQT1JUX0lCU1NfUlNOLAorCisJTkw4MDIxMV9BVFRSX1dJUEhZX0FOVEVOTkFfVFgsCisJTkw4MDIxMV9BVFRSX1dJUEhZX0FOVEVOTkFfUlgsCisKKwlOTDgwMjExX0FUVFJfTUNBU1RfUkFURSwKKworCU5MODAyMTFfQVRUUl9PRkZDSEFOTkVMX1RYX09LLAorCisJTkw4MDIxMV9BVFRSX0JTU19IVF9PUE1PREUsCisKKwlOTDgwMjExX0FUVFJfS0VZX0RFRkFVTFRfVFlQRVMsCisKKwlOTDgwMjExX0FUVFJfTUFYX1JFTUFJTl9PTl9DSEFOTkVMX0RVUkFUSU9OLAorCisJTkw4MDIxMV9BVFRSX01FU0hfU0VUVVAsCisKKwlOTDgwMjExX0FUVFJfV0lQSFlfQU5URU5OQV9BVkFJTF9UWCwKKwlOTDgwMjExX0FUVFJfV0lQSFlfQU5URU5OQV9BVkFJTF9SWCwKKworCU5MODAyMTFfQVRUUl9TVVBQT1JUX01FU0hfQVVUSCwKKwlOTDgwMjExX0FUVFJfU1RBX1BMSU5LX1NUQVRFLAorCisJTkw4MDIxMV9BVFRSX1dPV0xBTl9UUklHR0VSUywKKwlOTDgwMjExX0FUVFJfV09XTEFOX1RSSUdHRVJTX1NVUFBPUlRFRCwKKworCU5MODAyMTFfQVRUUl9TQ0hFRF9TQ0FOX0lOVEVSVkFMLAorCisJTkw4MDIxMV9BVFRSX0lOVEVSRkFDRV9DT01CSU5BVElPTlMsCisJTkw4MDIxMV9BVFRSX1NPRlRXQVJFX0lGVFlQRVMsCisKKwlOTDgwMjExX0FUVFJfUkVLRVlfREFUQSwKKworCU5MODAyMTFfQVRUUl9NQVhfTlVNX1NDSEVEX1NDQU5fU1NJRFMsCisJTkw4MDIxMV9BVFRSX01BWF9TQ0hFRF9TQ0FOX0lFX0xFTiwKKworCU5MODAyMTFfQVRUUl9TQ0FOX1NVUFBfUkFURVMsCisKKwlOTDgwMjExX0FUVFJfSElEREVOX1NTSUQsCisKKwlOTDgwMjExX0FUVFJfSUVfUFJPQkVfUkVTUCwKKwlOTDgwMjExX0FUVFJfSUVfQVNTT0NfUkVTUCwKKworCU5MODAyMTFfQVRUUl9TVEFfV01FLAorCU5MODAyMTFfQVRUUl9TVVBQT1JUX0FQX1VBUFNELAorCisJTkw4MDIxMV9BVFRSX1JPQU1fU1VQUE9SVCwKKworCU5MODAyMTFfQVRUUl9TQ0hFRF9TQ0FOX01BVENILAorCU5MODAyMTFfQVRUUl9NQVhfTUFUQ0hfU0VUUywKKworCU5MODAyMTFfQVRUUl9QTUtTQV9DQU5ESURBVEUsCisKKwlOTDgwMjExX0FUVFJfVFhfTk9fQ0NLX1JBVEUsCisKKwlOTDgwMjExX0FUVFJfVERMU19BQ1RJT04sCisJTkw4MDIxMV9BVFRSX1RETFNfRElBTE9HX1RPS0VOLAorCU5MODAyMTFfQVRUUl9URExTX09QRVJBVElPTiwKKwlOTDgwMjExX0FUVFJfVERMU19TVVBQT1JULAorCU5MODAyMTFfQVRUUl9URExTX0VYVEVSTkFMX1NFVFVQLAorCisJLyogYWRkIGF0dHJpYnV0ZXMgaGVyZSwgdXBkYXRlIHRoZSBwb2xpY3kgaW4gbmw4MDIxMS5jICovCisKKwlfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNULAorCU5MODAyMTFfQVRUUl9NQVggPSBfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNUIC0gMQorfTsKKworLyogc291cmNlLWxldmVsIEFQSSBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIE5MODAyMTFfQVRUUl9TQ0FOX0dFTkVSQVRJT04gTkw4MDIxMV9BVFRSX0dFTkVSQVRJT04KKyNkZWZpbmUJTkw4MDIxMV9BVFRSX01FU0hfUEFSQU1TIE5MODAyMTFfQVRUUl9NRVNIX0NPTkZJRworCisvKgorICogQWxsb3cgdXNlciBzcGFjZSBwcm9ncmFtcyB0byB1c2UgI2lmZGVmIG9uIG5ldyBhdHRyaWJ1dGVzIGJ5IGRlZmluaW5nIHRoZW0KKyAqIGhlcmUKKyAqLworI2RlZmluZSBOTDgwMjExX0NNRF9DT05ORUNUIE5MODAyMTFfQ01EX0NPTk5FQ1QKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFkgTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFkKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX0JTU19CQVNJQ19SQVRFUyBOTDgwMjExX0FUVFJfQlNTX0JBU0lDX1JBVEVTCisjZGVmaW5lIE5MODAyMTFfQVRUUl9XSVBIWV9UWFFfUEFSQU1TIE5MODAyMTFfQVRUUl9XSVBIWV9UWFFfUEFSQU1TCisjZGVmaW5lIE5MODAyMTFfQVRUUl9XSVBIWV9GUkVRIE5MODAyMTFfQVRUUl9XSVBIWV9GUkVRCisjZGVmaW5lIE5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEUgTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRQorI2RlZmluZSBOTDgwMjExX0FUVFJfTUdNVF9TVUJUWVBFIE5MODAyMTFfQVRUUl9NR01UX1NVQlRZUEUKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX0lFIE5MODAyMTFfQVRUUl9JRQorI2RlZmluZSBOTDgwMjExX0FUVFJfUkVHX0lOSVRJQVRPUiBOTDgwMjExX0FUVFJfUkVHX0lOSVRJQVRPUgorI2RlZmluZSBOTDgwMjExX0FUVFJfUkVHX1RZUEUgTkw4MDIxMV9BVFRSX1JFR19UWVBFCisjZGVmaW5lIE5MODAyMTFfQVRUUl9GUkFNRSBOTDgwMjExX0FUVFJfRlJBTUUKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX1NTSUQgTkw4MDIxMV9BVFRSX1NTSUQKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX0FVVEhfVFlQRSBOTDgwMjExX0FUVFJfQVVUSF9UWVBFCisjZGVmaW5lIE5MODAyMTFfQVRUUl9SRUFTT05fQ09ERSBOTDgwMjExX0FUVFJfUkVBU09OX0NPREUKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX0NJUEhFUl9TVUlURVNfUEFJUldJU0UgTkw4MDIxMV9BVFRSX0NJUEhFUl9TVUlURVNfUEFJUldJU0UKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX0NJUEhFUl9TVUlURV9HUk9VUCBOTDgwMjExX0FUVFJfQ0lQSEVSX1NVSVRFX0dST1VQCisjZGVmaW5lIE5MODAyMTFfQVRUUl9XUEFfVkVSU0lPTlMgTkw4MDIxMV9BVFRSX1dQQV9WRVJTSU9OUworI2RlZmluZSBOTDgwMjExX0FUVFJfQUtNX1NVSVRFUyBOTDgwMjExX0FUVFJfQUtNX1NVSVRFUworI2RlZmluZSBOTDgwMjExX0FUVFJfS0VZIE5MODAyMTFfQVRUUl9LRVkKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX0tFWVMgTkw4MDIxMV9BVFRSX0tFWVMKKworI2RlZmluZSBOTDgwMjExX01BWF9TVVBQX1JBVEVTCQkJMzIKKyNkZWZpbmUgTkw4MDIxMV9NQVhfU1VQUF9SRUdfUlVMRVMJCTMyCisjZGVmaW5lIE5MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9FTkNSX0tFWQkwCisjZGVmaW5lIE5MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9UWF9NSUNfS0VZCTE2CisjZGVmaW5lIE5MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9SWF9NSUNfS0VZCTI0CisjZGVmaW5lIE5MODAyMTFfSFRfQ0FQQUJJTElUWV9MRU4JCTI2CisKKyNkZWZpbmUgTkw4MDIxMV9NQVhfTlJfQ0lQSEVSX1NVSVRFUwkJNQorI2RlZmluZSBOTDgwMjExX01BWF9OUl9BS01fU1VJVEVTCQkyCisKKy8qKgorICogZW51bSBubDgwMjExX2lmdHlwZSAtICh2aXJ0dWFsKSBpbnRlcmZhY2UgdHlwZXMKKyAqCisgKiBATkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ6IHVuc3BlY2lmaWVkIHR5cGUsIGRyaXZlciBkZWNpZGVzCisgKiBATkw4MDIxMV9JRlRZUEVfQURIT0M6IGluZGVwZW5kZW50IEJTUyBtZW1iZXIKKyAqIEBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOiBtYW5hZ2VkIEJTUyBtZW1iZXIKKyAqIEBOTDgwMjExX0lGVFlQRV9BUDogYWNjZXNzIHBvaW50CisgKiBATkw4MDIxMV9JRlRZUEVfQVBfVkxBTjogVkxBTiBpbnRlcmZhY2UgZm9yIGFjY2VzcyBwb2ludHM7IFZMQU4gaW50ZXJmYWNlcworICoJYXJlIGEgYml0IHNwZWNpYWwgaW4gdGhhdCB0aGV5IG11c3QgYWx3YXlzIGJlIHRpZWQgdG8gYSBwcmUtZXhpc3RpbmcKKyAqCUFQIHR5cGUgaW50ZXJmYWNlLgorICogQE5MODAyMTFfSUZUWVBFX1dEUzogd2lyZWxlc3MgZGlzdHJpYnV0aW9uIGludGVyZmFjZQorICogQE5MODAyMTFfSUZUWVBFX01PTklUT1I6IG1vbml0b3IgaW50ZXJmYWNlIHJlY2VpdmluZyBhbGwgZnJhbWVzCisgKiBATkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDogbWVzaCBwb2ludAorICogQE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6IFAyUCBjbGllbnQKKyAqIEBOTDgwMjExX0lGVFlQRV9QMlBfR086IFAyUCBncm91cCBvd25lcgorICogQE5MODAyMTFfSUZUWVBFX01BWDogaGlnaGVzdCBpbnRlcmZhY2UgdHlwZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKKyAqIEBOVU1fTkw4MDIxMV9JRlRZUEVTOiBudW1iZXIgb2YgZGVmaW5lZCBpbnRlcmZhY2UgdHlwZXMKKyAqCisgKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgd2l0aCB0aGUgJU5MODAyMTFfQVRUUl9JRlRZUEUKKyAqIHRvIHNldCB0aGUgdHlwZSBvZiBhbiBpbnRlcmZhY2UuCisgKgorICovCitlbnVtIG5sODAyMTFfaWZ0eXBlIHsKKwlOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRCwKKwlOTDgwMjExX0lGVFlQRV9BREhPQywKKwlOTDgwMjExX0lGVFlQRV9TVEFUSU9OLAorCU5MODAyMTFfSUZUWVBFX0FQLAorCU5MODAyMTFfSUZUWVBFX0FQX1ZMQU4sCisJTkw4MDIxMV9JRlRZUEVfV0RTLAorCU5MODAyMTFfSUZUWVBFX01PTklUT1IsCisJTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCwKKwlOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5ULAorCU5MODAyMTFfSUZUWVBFX1AyUF9HTywKKworCS8qIGtlZXAgbGFzdCAqLworCU5VTV9OTDgwMjExX0lGVFlQRVMsCisJTkw4MDIxMV9JRlRZUEVfTUFYID0gTlVNX05MODAyMTFfSUZUWVBFUyAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3N0YV9mbGFncyAtIHN0YXRpb24gZmxhZ3MKKyAqCisgKiBTdGF0aW9uIGZsYWdzLiBXaGVuIGEgc3RhdGlvbiBpcyBhZGRlZCB0byBhbiBBUCBpbnRlcmZhY2UsIGl0IGlzCisgKiBhc3N1bWVkIHRvIGJlIGFscmVhZHkgYXNzb2NpYXRlZCAoYW5kIGhlbmNlIGF1dGhlbnRpY2F0ZWQuKQorICoKKyAqIEBfX05MODAyMTFfU1RBX0ZMQUdfSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVEOiBzdGF0aW9uIGlzIGF1dGhvcml6ZWQgKDgwMi4xWCkKKyAqIEBOTDgwMjExX1NUQV9GTEFHX1NIT1JUX1BSRUFNQkxFOiBzdGF0aW9uIGlzIGNhcGFibGUgb2YgcmVjZWl2aW5nIGZyYW1lcworICoJd2l0aCBzaG9ydCBiYXJrZXIgcHJlYW1ibGUKKyAqIEBOTDgwMjExX1NUQV9GTEFHX1dNRTogc3RhdGlvbiBpcyBXTUUvUW9TIGNhcGFibGUKKyAqIEBOTDgwMjExX1NUQV9GTEFHX01GUDogc3RhdGlvbiB1c2VzIG1hbmFnZW1lbnQgZnJhbWUgcHJvdGVjdGlvbgorICogQE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRDogc3RhdGlvbiBpcyBhdXRoZW50aWNhdGVkCisgKiBATkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVI6IHN0YXRpb24gaXMgYSBURExTIHBlZXIKKyAqIEBOTDgwMjExX1NUQV9GTEFHX01BWDogaGlnaGVzdCBzdGF0aW9uIGZsYWcgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCisgKiBAX19OTDgwMjExX1NUQV9GTEFHX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfc3RhX2ZsYWdzIHsKKwlfX05MODAyMTFfU1RBX0ZMQUdfSU5WQUxJRCwKKwlOTDgwMjExX1NUQV9GTEFHX0FVVEhPUklaRUQsCisJTkw4MDIxMV9TVEFfRkxBR19TSE9SVF9QUkVBTUJMRSwKKwlOTDgwMjExX1NUQV9GTEFHX1dNRSwKKwlOTDgwMjExX1NUQV9GTEFHX01GUCwKKwlOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQsCisJTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfU1RBX0ZMQUdfQUZURVJfTEFTVCwKKwlOTDgwMjExX1NUQV9GTEFHX01BWCA9IF9fTkw4MDIxMV9TVEFfRkxBR19BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBzdHJ1Y3Qgbmw4MDIxMV9zdGFfZmxhZ191cGRhdGUgLSBzdGF0aW9uIGZsYWdzIG1hc2svc2V0CisgKiBAbWFzazogbWFzayBvZiBzdGF0aW9uIGZsYWdzIHRvIHNldAorICogQHNldDogd2hpY2ggdmFsdWVzIHRvIHNldCB0aGVtIHRvCisgKgorICogQm90aCBtYXNrIGFuZCBzZXQgY29udGFpbiBiaXRzIGFzIHBlciAmZW51bSBubDgwMjExX3N0YV9mbGFncy4KKyAqLworc3RydWN0IG5sODAyMTFfc3RhX2ZsYWdfdXBkYXRlIHsKKwlfX3UzMiBtYXNrOworCV9fdTMyIHNldDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qKgorICogZW51bSBubDgwMjExX3JhdGVfaW5mbyAtIGJpdHJhdGUgaW5mb3JtYXRpb24KKyAqCisgKiBUaGVzZSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHVzZWQgd2l0aCAlTkw4MDIxMV9TVEFfSU5GT19UWFJBVEUKKyAqIHdoZW4gZ2V0dGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYml0cmF0ZSBvZiBhIHN0YXRpb24uCisgKgorICogQF9fTkw4MDIxMV9SQVRFX0lORk9fSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9SQVRFX0lORk9fQklUUkFURTogdG90YWwgYml0cmF0ZSAodTE2LCAxMDBrYml0L3MpCisgKiBATkw4MDIxMV9SQVRFX0lORk9fTUNTOiBtY3MgaW5kZXggZm9yIDgwMi4xMW4gKHU4KQorICogQE5MODAyMTFfUkFURV9JTkZPXzQwX01IWl9XSURUSDogNDAgTWh6IGR1YWxjaGFubmVsIGJpdHJhdGUKKyAqIEBOTDgwMjExX1JBVEVfSU5GT19TSE9SVF9HSTogNDAwbnMgZ3VhcmQgaW50ZXJ2YWwKKyAqIEBOTDgwMjExX1JBVEVfSU5GT19NQVg6IGhpZ2hlc3QgcmF0ZV9pbmZvIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZAorICogQF9fTkw4MDIxMV9SQVRFX0lORk9fQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKi8KK2VudW0gbmw4MDIxMV9yYXRlX2luZm8geworCV9fTkw4MDIxMV9SQVRFX0lORk9fSU5WQUxJRCwKKwlOTDgwMjExX1JBVEVfSU5GT19CSVRSQVRFLAorCU5MODAyMTFfUkFURV9JTkZPX01DUywKKwlOTDgwMjExX1JBVEVfSU5GT180MF9NSFpfV0lEVEgsCisJTkw4MDIxMV9SQVRFX0lORk9fU0hPUlRfR0ksCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfUkFURV9JTkZPX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9SQVRFX0lORk9fTUFYID0gX19OTDgwMjExX1JBVEVfSU5GT19BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfc3RhX2Jzc19wYXJhbSAtIEJTUyBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgYnkgU1RBCisgKgorICogVGhlc2UgYXR0cmlidXRlIHR5cGVzIGFyZSB1c2VkIHdpdGggJU5MODAyMTFfU1RBX0lORk9fQlNTX1BBUkFNCisgKiB3aGVuIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJpdHJhdGUgb2YgYSBzdGF0aW9uLgorICoKKyAqIEBfX05MODAyMTFfU1RBX0JTU19QQVJBTV9JTlZBTElEOiBhdHRyaWJ1dGUgbnVtYmVyIDAgaXMgcmVzZXJ2ZWQKKyAqIEBOTDgwMjExX1NUQV9CU1NfUEFSQU1fQ1RTX1BST1Q6IHdoZXRoZXIgQ1RTIHByb3RlY3Rpb24gaXMgZW5hYmxlZCAoZmxhZykKKyAqIEBOTDgwMjExX1NUQV9CU1NfUEFSQU1fU0hPUlRfUFJFQU1CTEU6ICB3aGV0aGVyIHNob3J0IHByZWFtYmxlIGlzIGVuYWJsZWQKKyAqCShmbGFnKQorICogQE5MODAyMTFfU1RBX0JTU19QQVJBTV9TSE9SVF9TTE9UX1RJTUU6ICB3aGV0aGVyIHNob3J0IHNsb3QgdGltZSBpcyBlbmFibGVkCisgKgkoZmxhZykKKyAqIEBOTDgwMjExX1NUQV9CU1NfUEFSQU1fRFRJTV9QRVJJT0Q6IERUSU0gcGVyaW9kIGZvciBiZWFjb25pbmcgKHU4KQorICogQE5MODAyMTFfU1RBX0JTU19QQVJBTV9CRUFDT05fSU5URVJWQUw6IEJlYWNvbiBpbnRlcnZhbCAodTE2KQorICogQE5MODAyMTFfU1RBX0JTU19QQVJBTV9NQVg6IGhpZ2hlc3Qgc3RhX2Jzc19wYXJhbSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKKyAqIEBfX05MODAyMTFfU1RBX0JTU19QQVJBTV9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX3N0YV9ic3NfcGFyYW0geworCV9fTkw4MDIxMV9TVEFfQlNTX1BBUkFNX0lOVkFMSUQsCisJTkw4MDIxMV9TVEFfQlNTX1BBUkFNX0NUU19QUk9ULAorCU5MODAyMTFfU1RBX0JTU19QQVJBTV9TSE9SVF9QUkVBTUJMRSwKKwlOTDgwMjExX1NUQV9CU1NfUEFSQU1fU0hPUlRfU0xPVF9USU1FLAorCU5MODAyMTFfU1RBX0JTU19QQVJBTV9EVElNX1BFUklPRCwKKwlOTDgwMjExX1NUQV9CU1NfUEFSQU1fQkVBQ09OX0lOVEVSVkFMLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX1NUQV9CU1NfUEFSQU1fQUZURVJfTEFTVCwKKwlOTDgwMjExX1NUQV9CU1NfUEFSQU1fTUFYID0gX19OTDgwMjExX1NUQV9CU1NfUEFSQU1fQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3N0YV9pbmZvIC0gc3RhdGlvbiBpbmZvcm1hdGlvbgorICoKKyAqIFRoZXNlIGF0dHJpYnV0ZSB0eXBlcyBhcmUgdXNlZCB3aXRoICVOTDgwMjExX0FUVFJfU1RBX0lORk8KKyAqIHdoZW4gZ2V0dGluZyBpbmZvcm1hdGlvbiBhYm91dCBhIHN0YXRpb24uCisgKgorICogQF9fTkw4MDIxMV9TVEFfSU5GT19JTlZBTElEOiBhdHRyaWJ1dGUgbnVtYmVyIDAgaXMgcmVzZXJ2ZWQKKyAqIEBOTDgwMjExX1NUQV9JTkZPX0lOQUNUSVZFX1RJTUU6IHRpbWUgc2luY2UgbGFzdCBhY3Rpdml0eSAodTMyLCBtc2VjcykKKyAqIEBOTDgwMjExX1NUQV9JTkZPX1JYX0JZVEVTOiB0b3RhbCByZWNlaXZlZCBieXRlcyAodTMyLCBmcm9tIHRoaXMgc3RhdGlvbikKKyAqIEBOTDgwMjExX1NUQV9JTkZPX1RYX0JZVEVTOiB0b3RhbCB0cmFuc21pdHRlZCBieXRlcyAodTMyLCB0byB0aGlzIHN0YXRpb24pCisgKiBATkw4MDIxMV9TVEFfSU5GT19TSUdOQUw6IHNpZ25hbCBzdHJlbmd0aCBvZiBsYXN0IHJlY2VpdmVkIFBQRFUgKHU4LCBkQm0pCisgKiBATkw4MDIxMV9TVEFfSU5GT19UWF9CSVRSQVRFOiBjdXJyZW50IHVuaWNhc3QgdHggcmF0ZSwgbmVzdGVkIGF0dHJpYnV0ZQorICogCWNvbnRhaW5pbmcgaW5mbyBhcyBwb3NzaWJsZSwgc2VlICZlbnVtIG5sODAyMTFfcmF0ZV9pbmZvCisgKiBATkw4MDIxMV9TVEFfSU5GT19SWF9QQUNLRVRTOiB0b3RhbCByZWNlaXZlZCBwYWNrZXQgKHUzMiwgZnJvbSB0aGlzIHN0YXRpb24pCisgKiBATkw4MDIxMV9TVEFfSU5GT19UWF9QQUNLRVRTOiB0b3RhbCB0cmFuc21pdHRlZCBwYWNrZXRzICh1MzIsIHRvIHRoaXMKKyAqCXN0YXRpb24pCisgKiBATkw4MDIxMV9TVEFfSU5GT19UWF9SRVRSSUVTOiB0b3RhbCByZXRyaWVzICh1MzIsIHRvIHRoaXMgc3RhdGlvbikKKyAqIEBOTDgwMjExX1NUQV9JTkZPX1RYX0ZBSUxFRDogdG90YWwgZmFpbGVkIHBhY2tldHMgKHUzMiwgdG8gdGhpcyBzdGF0aW9uKQorICogQE5MODAyMTFfU1RBX0lORk9fU0lHTkFMX0FWRzogc2lnbmFsIHN0cmVuZ3RoIGF2ZXJhZ2UgKHU4LCBkQm0pCisgKiBATkw4MDIxMV9TVEFfSU5GT19MTElEOiB0aGUgc3RhdGlvbidzIG1lc2ggTExJRAorICogQE5MODAyMTFfU1RBX0lORk9fUExJRDogdGhlIHN0YXRpb24ncyBtZXNoIFBMSUQKKyAqIEBOTDgwMjExX1NUQV9JTkZPX1BMSU5LX1NUQVRFOiBwZWVyIGxpbmsgc3RhdGUgZm9yIHRoZSBzdGF0aW9uCisgKgkoc2VlICVlbnVtIG5sODAyMTFfcGxpbmtfc3RhdGUpCisgKiBATkw4MDIxMV9TVEFfSU5GT19SWF9CSVRSQVRFOiBsYXN0IHVuaWNhc3QgZGF0YSBmcmFtZSByeCByYXRlLCBuZXN0ZWQKKyAqCWF0dHJpYnV0ZSwgbGlrZSBOTDgwMjExX1NUQV9JTkZPX1RYX0JJVFJBVEUuCisgKiBATkw4MDIxMV9TVEFfSU5GT19CU1NfUEFSQU06IGN1cnJlbnQgc3RhdGlvbidzIHZpZXcgb2YgQlNTLCBuZXN0ZWQgYXR0cmlidXRlCisgKiAgICAgY29udGFpbmluZyBpbmZvIGFzIHBvc3NpYmxlLCBzZWUgJmVudW0gbmw4MDIxMV9zdGFfYnNzX3BhcmFtCisgKiBATkw4MDIxMV9TVEFfSU5GT19DT05ORUNURURfVElNRTogdGltZSBzaW5jZSB0aGUgc3RhdGlvbiBpcyBsYXN0IGNvbm5lY3RlZAorICogQE5MODAyMTFfU1RBX0lORk9fU1RBX0ZMQUdTOiBDb250YWlucyBhIHN0cnVjdCBubDgwMjExX3N0YV9mbGFnX3VwZGF0ZS4KKyAqIEBfX05MODAyMTFfU1RBX0lORk9fQUZURVJfTEFTVDogaW50ZXJuYWwKKyAqIEBOTDgwMjExX1NUQV9JTkZPX01BWDogaGlnaGVzdCBwb3NzaWJsZSBzdGF0aW9uIGluZm8gYXR0cmlidXRlCisgKi8KK2VudW0gbmw4MDIxMV9zdGFfaW5mbyB7CisJX19OTDgwMjExX1NUQV9JTkZPX0lOVkFMSUQsCisJTkw4MDIxMV9TVEFfSU5GT19JTkFDVElWRV9USU1FLAorCU5MODAyMTFfU1RBX0lORk9fUlhfQllURVMsCisJTkw4MDIxMV9TVEFfSU5GT19UWF9CWVRFUywKKwlOTDgwMjExX1NUQV9JTkZPX0xMSUQsCisJTkw4MDIxMV9TVEFfSU5GT19QTElELAorCU5MODAyMTFfU1RBX0lORk9fUExJTktfU1RBVEUsCisJTkw4MDIxMV9TVEFfSU5GT19TSUdOQUwsCisJTkw4MDIxMV9TVEFfSU5GT19UWF9CSVRSQVRFLAorCU5MODAyMTFfU1RBX0lORk9fUlhfUEFDS0VUUywKKwlOTDgwMjExX1NUQV9JTkZPX1RYX1BBQ0tFVFMsCisJTkw4MDIxMV9TVEFfSU5GT19UWF9SRVRSSUVTLAorCU5MODAyMTFfU1RBX0lORk9fVFhfRkFJTEVELAorCU5MODAyMTFfU1RBX0lORk9fU0lHTkFMX0FWRywKKwlOTDgwMjExX1NUQV9JTkZPX1JYX0JJVFJBVEUsCisJTkw4MDIxMV9TVEFfSU5GT19CU1NfUEFSQU0sCisJTkw4MDIxMV9TVEFfSU5GT19DT05ORUNURURfVElNRSwKKwlOTDgwMjExX1NUQV9JTkZPX1NUQV9GTEFHUywKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9TVEFfSU5GT19BRlRFUl9MQVNULAorCU5MODAyMTFfU1RBX0lORk9fTUFYID0gX19OTDgwMjExX1NUQV9JTkZPX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9tcGF0aF9mbGFncyAtIG5sODAyMTEgbWVzaCBwYXRoIGZsYWdzCisgKgorICogQE5MODAyMTFfTVBBVEhfRkxBR19BQ1RJVkU6IHRoZSBtZXNoIHBhdGggaXMgYWN0aXZlCisgKiBATkw4MDIxMV9NUEFUSF9GTEFHX1JFU09MVklORzogdGhlIG1lc2ggcGF0aCBkaXNjb3ZlcnkgcHJvY2VzcyBpcyBydW5uaW5nCisgKiBATkw4MDIxMV9NUEFUSF9GTEFHX1NOX1ZBTElEOiB0aGUgbWVzaCBwYXRoIGNvbnRhaW5zIGEgdmFsaWQgU04KKyAqIEBOTDgwMjExX01QQVRIX0ZMQUdfRklYRUQ6IHRoZSBtZXNoIHBhdGggaGFzIGJlZW4gbWFudWFsbHkgc2V0CisgKiBATkw4MDIxMV9NUEFUSF9GTEFHX1JFU09MVkVEOiB0aGUgbWVzaCBwYXRoIGRpc2NvdmVyeSBwcm9jZXNzIHN1Y2NlZWRlZAorICovCitlbnVtIG5sODAyMTFfbXBhdGhfZmxhZ3MgeworCU5MODAyMTFfTVBBVEhfRkxBR19BQ1RJVkUgPQkxPDwwLAorCU5MODAyMTFfTVBBVEhfRkxBR19SRVNPTFZJTkcgPQkxPDwxLAorCU5MODAyMTFfTVBBVEhfRkxBR19TTl9WQUxJRCA9CTE8PDIsCisJTkw4MDIxMV9NUEFUSF9GTEFHX0ZJWEVEID0JMTw8MywKKwlOTDgwMjExX01QQVRIX0ZMQUdfUkVTT0xWRUQgPQkxPDw0LAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfbXBhdGhfaW5mbyAtIG1lc2ggcGF0aCBpbmZvcm1hdGlvbgorICoKKyAqIFRoZXNlIGF0dHJpYnV0ZSB0eXBlcyBhcmUgdXNlZCB3aXRoICVOTDgwMjExX0FUVFJfTVBBVEhfSU5GTyB3aGVuIGdldHRpbmcKKyAqIGluZm9ybWF0aW9uIGFib3V0IGEgbWVzaCBwYXRoLgorICoKKyAqIEBfX05MODAyMTFfTVBBVEhfSU5GT19JTlZBTElEOiBhdHRyaWJ1dGUgbnVtYmVyIDAgaXMgcmVzZXJ2ZWQKKyAqIEBOTDgwMjExX01QQVRIX0lORk9fRlJBTUVfUUxFTjogbnVtYmVyIG9mIHF1ZXVlZCBmcmFtZXMgZm9yIHRoaXMgZGVzdGluYXRpb24KKyAqIEBOTDgwMjExX01QQVRIX0lORk9fU046IGRlc3RpbmF0aW9uIHNlcXVlbmNlIG51bWJlcgorICogQE5MODAyMTFfTVBBVEhfSU5GT19NRVRSSUM6IG1ldHJpYyAoY29zdCkgb2YgdGhpcyBtZXNoIHBhdGgKKyAqIEBOTDgwMjExX01QQVRIX0lORk9fRVhQVElNRTogZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgcGF0aCwgaW4gbXNlYyBmcm9tIG5vdworICogQE5MODAyMTFfTVBBVEhfSU5GT19GTEFHUzogbWVzaCBwYXRoIGZsYWdzLCBlbnVtZXJhdGVkIGluCisgKiAJJmVudW0gbmw4MDIxMV9tcGF0aF9mbGFnczsKKyAqIEBOTDgwMjExX01QQVRIX0lORk9fRElTQ09WRVJZX1RJTUVPVVQ6IHRvdGFsIHBhdGggZGlzY292ZXJ5IHRpbWVvdXQsIGluIG1zZWMKKyAqIEBOTDgwMjExX01QQVRIX0lORk9fRElTQ09WRVJZX1JFVFJJRVM6IG1lc2ggcGF0aCBkaXNjb3ZlcnkgcmV0cmllcworICogQE5MODAyMTFfTVBBVEhfSU5GT19NQVg6IGhpZ2hlc3QgbWVzaCBwYXRoIGluZm9ybWF0aW9uIGF0dHJpYnV0ZSBudW1iZXIKKyAqCWN1cnJlbnRseSBkZWZpbmQKKyAqIEBfX05MODAyMTFfTVBBVEhfSU5GT19BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX21wYXRoX2luZm8geworCV9fTkw4MDIxMV9NUEFUSF9JTkZPX0lOVkFMSUQsCisJTkw4MDIxMV9NUEFUSF9JTkZPX0ZSQU1FX1FMRU4sCisJTkw4MDIxMV9NUEFUSF9JTkZPX1NOLAorCU5MODAyMTFfTVBBVEhfSU5GT19NRVRSSUMsCisJTkw4MDIxMV9NUEFUSF9JTkZPX0VYUFRJTUUsCisJTkw4MDIxMV9NUEFUSF9JTkZPX0ZMQUdTLAorCU5MODAyMTFfTVBBVEhfSU5GT19ESVNDT1ZFUllfVElNRU9VVCwKKwlOTDgwMjExX01QQVRIX0lORk9fRElTQ09WRVJZX1JFVFJJRVMsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfTVBBVEhfSU5GT19BRlRFUl9MQVNULAorCU5MODAyMTFfTVBBVEhfSU5GT19NQVggPSBfX05MODAyMTFfTVBBVEhfSU5GT19BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfYmFuZF9hdHRyIC0gYmFuZCBhdHRyaWJ1dGVzCisgKiBAX19OTDgwMjExX0JBTkRfQVRUUl9JTlZBTElEOiBhdHRyaWJ1dGUgbnVtYmVyIDAgaXMgcmVzZXJ2ZWQKKyAqIEBOTDgwMjExX0JBTkRfQVRUUl9GUkVRUzogc3VwcG9ydGVkIGZyZXF1ZW5jaWVzIGluIHRoaXMgYmFuZCwKKyAqCWFuIGFycmF5IG9mIG5lc3RlZCBmcmVxdWVuY3kgYXR0cmlidXRlcworICogQE5MODAyMTFfQkFORF9BVFRSX1JBVEVTOiBzdXBwb3J0ZWQgYml0cmF0ZXMgaW4gdGhpcyBiYW5kLAorICoJYW4gYXJyYXkgb2YgbmVzdGVkIGJpdHJhdGUgYXR0cmlidXRlcworICogQE5MODAyMTFfQkFORF9BVFRSX0hUX01DU19TRVQ6IDE2LWJ5dGUgYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIE1DUyBzZXQgYXMKKyAqCWRlZmluZWQgaW4gODAyLjExbgorICogQE5MODAyMTFfQkFORF9BVFRSX0hUX0NBUEE6IEhUIGNhcGFiaWxpdGllcywgYXMgaW4gdGhlIEhUIGluZm9ybWF0aW9uIElFCisgKiBATkw4MDIxMV9CQU5EX0FUVFJfSFRfQU1QRFVfRkFDVE9SOiBBLU1QRFUgZmFjdG9yLCBhcyBpbiAxMW4KKyAqIEBOTDgwMjExX0JBTkRfQVRUUl9IVF9BTVBEVV9ERU5TSVRZOiBBLU1QRFUgZGVuc2l0eSwgYXMgaW4gMTFuCisgKiBATkw4MDIxMV9CQU5EX0FUVFJfTUFYOiBoaWdoZXN0IGJhbmQgYXR0cmlidXRlIGN1cnJlbnRseSBkZWZpbmVkCisgKiBAX19OTDgwMjExX0JBTkRfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX2JhbmRfYXR0ciB7CisJX19OTDgwMjExX0JBTkRfQVRUUl9JTlZBTElELAorCU5MODAyMTFfQkFORF9BVFRSX0ZSRVFTLAorCU5MODAyMTFfQkFORF9BVFRSX1JBVEVTLAorCisJTkw4MDIxMV9CQU5EX0FUVFJfSFRfTUNTX1NFVCwKKwlOTDgwMjExX0JBTkRfQVRUUl9IVF9DQVBBLAorCU5MODAyMTFfQkFORF9BVFRSX0hUX0FNUERVX0ZBQ1RPUiwKKwlOTDgwMjExX0JBTkRfQVRUUl9IVF9BTVBEVV9ERU5TSVRZLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX0JBTkRfQVRUUl9BRlRFUl9MQVNULAorCU5MODAyMTFfQkFORF9BVFRSX01BWCA9IF9fTkw4MDIxMV9CQU5EX0FUVFJfQUZURVJfTEFTVCAtIDEKK307CisKKyNkZWZpbmUgTkw4MDIxMV9CQU5EX0FUVFJfSFRfQ0FQQSBOTDgwMjExX0JBTkRfQVRUUl9IVF9DQVBBCisKKy8qKgorICogZW51bSBubDgwMjExX2ZyZXF1ZW5jeV9hdHRyIC0gZnJlcXVlbmN5IGF0dHJpYnV0ZXMKKyAqIEBfX05MODAyMTFfRlJFUVVFTkNZX0FUVFJfSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9GUkVROiBGcmVxdWVuY3kgaW4gTUh6CisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9ESVNBQkxFRDogQ2hhbm5lbCBpcyBkaXNhYmxlZCBpbiBjdXJyZW50CisgKglyZWd1bGF0b3J5IGRvbWFpbi4KKyAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX1BBU1NJVkVfU0NBTjogT25seSBwYXNzaXZlIHNjYW5uaW5nIGlzCisgKglwZXJtaXR0ZWQgb24gdGhpcyBjaGFubmVsIGluIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9OT19JQlNTOiBJQlNTIG5ldHdvcmtzIGFyZSBub3QgcGVybWl0dGVkCisgKglvbiB0aGlzIGNoYW5uZWwgaW4gY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbi4KKyAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX1JBREFSOiBSYWRhciBkZXRlY3Rpb24gaXMgbWFuZGF0b3J5CisgKglvbiB0aGlzIGNoYW5uZWwgaW4gY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbi4KKyAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX01BWF9UWF9QT1dFUjogTWF4aW11bSB0cmFuc21pc3Npb24gcG93ZXIgaW4gbUJtCisgKgkoMTAwICogZEJtKS4KKyAqIEBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX01BWDogaGlnaGVzdCBmcmVxdWVuY3kgYXR0cmlidXRlIG51bWJlcgorICoJY3VycmVudGx5IGRlZmluZWQKKyAqIEBfX05MODAyMTFfRlJFUVVFTkNZX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKi8KK2VudW0gbmw4MDIxMV9mcmVxdWVuY3lfYXR0ciB7CisJX19OTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0lOVkFMSUQsCisJTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9GUkVRLAorCU5MODAyMTFfRlJFUVVFTkNZX0FUVFJfRElTQUJMRUQsCisJTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9QQVNTSVZFX1NDQU4sCisJTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9OT19JQlNTLAorCU5MODAyMTFfRlJFUVVFTkNZX0FUVFJfUkFEQVIsCisJTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9NQVhfVFhfUE9XRVIsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfRlJFUVVFTkNZX0FUVFJfQUZURVJfTEFTVCwKKwlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX01BWCA9IF9fTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9BRlRFUl9MQVNUIC0gMQorfTsKKworI2RlZmluZSBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX01BWF9UWF9QT1dFUiBOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX01BWF9UWF9QT1dFUgorCisvKioKKyAqIGVudW0gbmw4MDIxMV9iaXRyYXRlX2F0dHIgLSBiaXRyYXRlIGF0dHJpYnV0ZXMKKyAqIEBfX05MODAyMTFfQklUUkFURV9BVFRSX0lOVkFMSUQ6IGF0dHJpYnV0ZSBudW1iZXIgMCBpcyByZXNlcnZlZAorICogQE5MODAyMTFfQklUUkFURV9BVFRSX1JBVEU6IEJpdHJhdGUgaW4gdW5pdHMgb2YgMTAwIGticHMKKyAqIEBOTDgwMjExX0JJVFJBVEVfQVRUUl8yR0haX1NIT1JUUFJFQU1CTEU6IFNob3J0IHByZWFtYmxlIHN1cHBvcnRlZAorICoJaW4gMi40IEdIeiBiYW5kLgorICogQE5MODAyMTFfQklUUkFURV9BVFRSX01BWDogaGlnaGVzdCBiaXRyYXRlIGF0dHJpYnV0ZSBudW1iZXIKKyAqCWN1cnJlbnRseSBkZWZpbmVkCisgKiBAX19OTDgwMjExX0JJVFJBVEVfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX2JpdHJhdGVfYXR0ciB7CisJX19OTDgwMjExX0JJVFJBVEVfQVRUUl9JTlZBTElELAorCU5MODAyMTFfQklUUkFURV9BVFRSX1JBVEUsCisJTkw4MDIxMV9CSVRSQVRFX0FUVFJfMkdIWl9TSE9SVFBSRUFNQkxFLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX0JJVFJBVEVfQVRUUl9BRlRFUl9MQVNULAorCU5MODAyMTFfQklUUkFURV9BVFRSX01BWCA9IF9fTkw4MDIxMV9CSVRSQVRFX0FUVFJfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2luaXRpYXRvciAtIEluZGljYXRlcyB0aGUgaW5pdGlhdG9yIG9mIGEgcmVnIGRvbWFpbiByZXF1ZXN0CisgKiBATkw4MDIxMV9SRUdET01fU0VUX0JZX0NPUkU6IENvcmUgcXVlcmllZCBDUkRBIGZvciBhIGR5bmFtaWMgd29ybGQKKyAqIAlyZWd1bGF0b3J5IGRvbWFpbi4KKyAqIEBOTDgwMjExX1JFR0RPTV9TRVRfQllfVVNFUjogVXNlciBhc2tlZCB0aGUgd2lyZWxlc3MgY29yZSB0byBzZXQgdGhlCisgKiAJcmVndWxhdG9yeSBkb21haW4uCisgKiBATkw4MDIxMV9SRUdET01fU0VUX0JZX0RSSVZFUjogYSB3aXJlbGVzcyBkcml2ZXJzIGhhcyBoaW50ZWQgdG8gdGhlCisgKiAJd2lyZWxlc3MgY29yZSBpdCB0aGlua3MgaXRzIGtub3dzIHRoZSByZWd1bGF0b3J5IGRvbWFpbiB3ZSBzaG91bGQgYmUgaW4uCisgKiBATkw4MDIxMV9SRUdET01fU0VUX0JZX0NPVU5UUllfSUU6IHRoZSB3aXJlbGVzcyBjb3JlIGhhcyByZWNlaXZlZCBhbgorICogCTgwMi4xMSBjb3VudHJ5IGluZm9ybWF0aW9uIGVsZW1lbnQgd2l0aCByZWd1bGF0b3J5IGluZm9ybWF0aW9uIGl0CisgKiAJdGhpbmtzIHdlIHNob3VsZCBjb25zaWRlci4gY2ZnODAyMTEgb25seSBwcm9jZXNzZXMgdGhlIGNvdW50cnkKKyAqCWNvZGUgZnJvbSB0aGUgSUUsIGFuZCByZWxpZXMgb24gdGhlIHJlZ3VsYXRvcnkgZG9tYWluIGluZm9ybWF0aW9uCisgKglzdHJ1Y3R1cmUgcGFzc2VkIGJ5IHVzZXJzcGFjZSAoQ1JEQSkgZnJvbSBvdXIgd2lyZWxlc3MtcmVnZGIuCisgKglJZiBhIGNoYW5uZWwgaXMgZW5hYmxlZCBidXQgdGhlIGNvdW50cnkgY29kZSBpbmRpY2F0ZXMgaXQgc2hvdWxkCisgKgliZSBkaXNhYmxlZCB3ZSBkaXNhYmxlIHRoZSBjaGFubmVsIGFuZCByZS1lbmFibGUgaXQgdXBvbiBkaXNhc3NvY2lhdGlvbi4KKyAqLworZW51bSBubDgwMjExX3JlZ19pbml0aWF0b3IgeworCU5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1JFLAorCU5MODAyMTFfUkVHRE9NX1NFVF9CWV9VU0VSLAorCU5MODAyMTFfUkVHRE9NX1NFVF9CWV9EUklWRVIsCisJTkw4MDIxMV9SRUdET01fU0VUX0JZX0NPVU5UUllfSUUsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9yZWdfdHlwZSAtIHNwZWNpZmllcyB0aGUgdHlwZSBvZiByZWd1bGF0b3J5IGRvbWFpbgorICogQE5MODAyMTFfUkVHRE9NX1RZUEVfQ09VTlRSWTogdGhlIHJlZ3VsYXRvcnkgZG9tYWluIHNldCBpcyBvbmUgdGhhdCBwZXJ0YWlucworICoJdG8gYSBzcGVjaWZpYyBjb3VudHJ5LiBXaGVuIHRoaXMgaXMgc2V0IHlvdSBjYW4gY291bnQgb24gdGhlCisgKglJU08gLyBJRUMgMzE2NiBhbHBoYTIgY291bnRyeSBjb2RlIGJlaW5nIHZhbGlkLgorICogQE5MODAyMTFfUkVHRE9NX1RZUEVfV09STEQ6IHRoZSByZWd1bGF0b3J5IHNldCBkb21haW4gaXMgdGhlIHdvcmxkIHJlZ3VsYXRvcnkKKyAqIAlkb21haW4uCisgKiBATkw4MDIxMV9SRUdET01fVFlQRV9DVVNUT01fV09STEQ6IHRoZSByZWd1bGF0b3J5IGRvbWFpbiBzZXQgaXMgYSBjdXN0b20KKyAqIAlkcml2ZXIgc3BlY2lmaWMgd29ybGQgcmVndWxhdG9yeSBkb21haW4uIFRoZXNlIGRvIG5vdCBhcHBseSBzeXN0ZW0td2lkZQorICogCWFuZCBhcmUgb25seSBhcHBsaWNhYmxlIHRvIHRoZSBpbmRpdmlkdWFsIGRldmljZXMgd2hpY2ggaGF2ZSByZXF1ZXN0ZWQKKyAqIAl0aGVtIHRvIGJlIGFwcGxpZWQuCisgKiBATkw4MDIxMV9SRUdET01fVFlQRV9JTlRFUlNFQ1RJT046IHRoZSByZWd1bGF0b3J5IGRvbWFpbiBzZXQgaXMgdGhlIHByb2R1Y3QKKyAqCW9mIGFuIGludGVyc2VjdGlvbiBiZXR3ZWVuIHR3byByZWd1bGF0b3J5IGRvbWFpbnMgLS0gdGhlIHByZXZpb3VzbHkKKyAqCXNldCByZWd1bGF0b3J5IGRvbWFpbiBvbiB0aGUgc3lzdGVtIGFuZCB0aGUgbGFzdCBhY2NlcHRlZCByZWd1bGF0b3J5CisgKglkb21haW4gcmVxdWVzdCB0byBiZSBwcm9jZXNzZWQuCisgKi8KK2VudW0gbmw4MDIxMV9yZWdfdHlwZSB7CisJTkw4MDIxMV9SRUdET01fVFlQRV9DT1VOVFJZLAorCU5MODAyMTFfUkVHRE9NX1RZUEVfV09STEQsCisJTkw4MDIxMV9SRUdET01fVFlQRV9DVVNUT01fV09STEQsCisJTkw4MDIxMV9SRUdET01fVFlQRV9JTlRFUlNFQ1RJT04sCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9yZWdfcnVsZV9hdHRyIC0gcmVndWxhdG9yeSBydWxlIGF0dHJpYnV0ZXMKKyAqIEBfX05MODAyMTFfUkVHX1JVTEVfQVRUUl9JTlZBTElEOiBhdHRyaWJ1dGUgbnVtYmVyIDAgaXMgcmVzZXJ2ZWQKKyAqIEBOTDgwMjExX0FUVFJfUkVHX1JVTEVfRkxBR1M6IGEgc2V0IG9mIGZsYWdzIHdoaWNoIHNwZWNpZnkgYWRkaXRpb25hbAorICogCWNvbnNpZGVyYXRpb25zIGZvciBhIGdpdmVuIGZyZXF1ZW5jeSByYW5nZS4gVGhlc2UgYXJlIHRoZQorICogCSZlbnVtIG5sODAyMTFfcmVnX3J1bGVfZmxhZ3MuCisgKiBATkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfU1RBUlQ6IHN0YXJ0aW5nIGZyZXF1ZW5jcnkgZm9yIHRoZSByZWd1bGF0b3J5CisgKiAJcnVsZSBpbiBLSHouIFRoaXMgaXMgbm90IGEgY2VudGVyIG9mIGZyZXF1ZW5jeSBidXQgYW4gYWN0dWFsIHJlZ3VsYXRvcnkKKyAqIAliYW5kIGVkZ2UuCisgKiBATkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfRU5EOiBlbmRpbmcgZnJlcXVlbmN5IGZvciB0aGUgcmVndWxhdG9yeSBydWxlCisgKiAJaW4gS0h6LiBUaGlzIGlzIG5vdCBhIGNlbnRlciBhIGZyZXF1ZW5jeSBidXQgYW4gYWN0dWFsIHJlZ3VsYXRvcnkKKyAqIAliYW5kIGVkZ2UuCisgKiBATkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfTUFYX0JXOiBtYXhpbXVtIGFsbG93ZWQgYmFuZHdpZHRoIGZvciB0aGlzCisgKiAJZnJlcXVlbmN5IHJhbmdlLCBpbiBLSHouCisgKiBATkw4MDIxMV9BVFRSX1BPV0VSX1JVTEVfTUFYX0FOVF9HQUlOOiB0aGUgbWF4aW11bSBhbGxvd2VkIGFudGVubmEgZ2FpbgorICogCWZvciBhIGdpdmVuIGZyZXF1ZW5jeSByYW5nZS4gVGhlIHZhbHVlIGlzIGluIG1CaSAoMTAwICogZEJpKS4KKyAqIAlJZiB5b3UgZG9uJ3QgaGF2ZSBvbmUgdGhlbiBkb24ndCBzZW5kIHRoaXMuCisgKiBATkw4MDIxMV9BVFRSX1BPV0VSX1JVTEVfTUFYX0VJUlA6IHRoZSBtYXhpbXVtIGFsbG93ZWQgRUlSUCBmb3IKKyAqIAlhIGdpdmVuIGZyZXF1ZW5jeSByYW5nZS4gVGhlIHZhbHVlIGlzIGluIG1CbSAoMTAwICogZEJtKS4KKyAqIEBOTDgwMjExX1JFR19SVUxFX0FUVFJfTUFYOiBoaWdoZXN0IHJlZ3VsYXRvcnkgcnVsZSBhdHRyaWJ1dGUgbnVtYmVyCisgKgljdXJyZW50bHkgZGVmaW5lZAorICogQF9fTkw4MDIxMV9SRUdfUlVMRV9BVFRSX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfcmVnX3J1bGVfYXR0ciB7CisJX19OTDgwMjExX1JFR19SVUxFX0FUVFJfSU5WQUxJRCwKKwlOTDgwMjExX0FUVFJfUkVHX1JVTEVfRkxBR1MsCisKKwlOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9TVEFSVCwKKwlOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9FTkQsCisJTkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfTUFYX0JXLAorCisJTkw4MDIxMV9BVFRSX1BPV0VSX1JVTEVfTUFYX0FOVF9HQUlOLAorCU5MODAyMTFfQVRUUl9QT1dFUl9SVUxFX01BWF9FSVJQLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX1JFR19SVUxFX0FUVFJfQUZURVJfTEFTVCwKKwlOTDgwMjExX1JFR19SVUxFX0FUVFJfTUFYID0gX19OTDgwMjExX1JFR19SVUxFX0FUVFJfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3NjaGVkX3NjYW5fbWF0Y2hfYXR0ciAtIHNjaGVkdWxlZCBzY2FuIG1hdGNoIGF0dHJpYnV0ZXMKKyAqIEBfX05MODAyMTFfU0NIRURfU0NBTl9NQVRDSF9BVFRSX0lOVkFMSUQ6IGF0dHJpYnV0ZSBudW1iZXIgMCBpcyByZXNlcnZlZAorICogQE5MODAyMTFfU0NIRURfU0NBTl9NQVRDSF9BVFRSX1NTSUQ6IFNTSUQgdG8gYmUgdXNlZCBmb3IgbWF0Y2hpbmcsCisgKiBvbmx5IHJlcG9ydCBCU1Mgd2l0aCBtYXRjaGluZyBTU0lELgorICogQE5MODAyMTFfU0NIRURfU0NBTl9NQVRDSF9BVFRSX01BWDogaGlnaGVzdCBzY2hlZHVsZWQgc2NhbiBmaWx0ZXIKKyAqCWF0dHJpYnV0ZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKKyAqIEBfX05MODAyMTFfU0NIRURfU0NBTl9NQVRDSF9BVFRSX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfc2NoZWRfc2Nhbl9tYXRjaF9hdHRyIHsKKwlfX05MODAyMTFfU0NIRURfU0NBTl9NQVRDSF9BVFRSX0lOVkFMSUQsCisKKwlOTDgwMjExX0FUVFJfU0NIRURfU0NBTl9NQVRDSF9TU0lELAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX1NDSEVEX1NDQU5fTUFUQ0hfQVRUUl9BRlRFUl9MQVNULAorCU5MODAyMTFfU0NIRURfU0NBTl9NQVRDSF9BVFRSX01BWCA9CisJCV9fTkw4MDIxMV9TQ0hFRF9TQ0FOX01BVENIX0FUVFJfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3JlZ19ydWxlX2ZsYWdzIC0gcmVndWxhdG9yeSBydWxlIGZsYWdzCisgKgorICogQE5MODAyMTFfUlJGX05PX09GRE06IE9GRE0gbW9kdWxhdGlvbiBub3QgYWxsb3dlZAorICogQE5MODAyMTFfUlJGX05PX0NDSzogQ0NLIG1vZHVsYXRpb24gbm90IGFsbG93ZWQKKyAqIEBOTDgwMjExX1JSRl9OT19JTkRPT1I6IGluZG9vciBvcGVyYXRpb24gbm90IGFsbG93ZWQKKyAqIEBOTDgwMjExX1JSRl9OT19PVVRET09SOiBvdXRkb29yIG9wZXJhdGlvbiBub3QgYWxsb3dlZAorICogQE5MODAyMTFfUlJGX0RGUzogREZTIHN1cHBvcnQgaXMgcmVxdWlyZWQgdG8gYmUgdXNlZAorICogQE5MODAyMTFfUlJGX1BUUF9PTkxZOiB0aGlzIGlzIG9ubHkgZm9yIFBvaW50IFRvIFBvaW50IGxpbmtzCisgKiBATkw4MDIxMV9SUkZfUFRNUF9PTkxZOiB0aGlzIGlzIG9ubHkgZm9yIFBvaW50IFRvIE11bHRpIFBvaW50IGxpbmtzCisgKiBATkw4MDIxMV9SUkZfUEFTU0lWRV9TQ0FOOiBwYXNzaXZlIHNjYW4gaXMgcmVxdWlyZWQKKyAqIEBOTDgwMjExX1JSRl9OT19JQlNTOiBubyBJQlNTIGlzIGFsbG93ZWQKKyAqLworZW51bSBubDgwMjExX3JlZ19ydWxlX2ZsYWdzIHsKKwlOTDgwMjExX1JSRl9OT19PRkRNCQk9IDE8PDAsCisJTkw4MDIxMV9SUkZfTk9fQ0NLCQk9IDE8PDEsCisJTkw4MDIxMV9SUkZfTk9fSU5ET09SCQk9IDE8PDIsCisJTkw4MDIxMV9SUkZfTk9fT1VURE9PUgkJPSAxPDwzLAorCU5MODAyMTFfUlJGX0RGUwkJCT0gMTw8NCwKKwlOTDgwMjExX1JSRl9QVFBfT05MWQkJPSAxPDw1LAorCU5MODAyMTFfUlJGX1BUTVBfT05MWQkJPSAxPDw2LAorCU5MODAyMTFfUlJGX1BBU1NJVkVfU0NBTgk9IDE8PDcsCisJTkw4MDIxMV9SUkZfTk9fSUJTUwkJPSAxPDw4LAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfc3VydmV5X2luZm8gLSBzdXJ2ZXkgaW5mb3JtYXRpb24KKyAqCisgKiBUaGVzZSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHVzZWQgd2l0aCAlTkw4MDIxMV9BVFRSX1NVUlZFWV9JTkZPCisgKiB3aGVuIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBzdXJ2ZXkuCisgKgorICogQF9fTkw4MDIxMV9TVVJWRVlfSU5GT19JTlZBTElEOiBhdHRyaWJ1dGUgbnVtYmVyIDAgaXMgcmVzZXJ2ZWQKKyAqIEBOTDgwMjExX1NVUlZFWV9JTkZPX0ZSRVFVRU5DWTogY2VudGVyIGZyZXF1ZW5jeSBvZiBjaGFubmVsCisgKiBATkw4MDIxMV9TVVJWRVlfSU5GT19OT0lTRTogbm9pc2UgbGV2ZWwgb2YgY2hhbm5lbCAodTgsIGRCbSkKKyAqIEBOTDgwMjExX1NVUlZFWV9JTkZPX0lOX1VTRTogY2hhbm5lbCBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZAorICogQE5MODAyMTFfU1VSVkVZX0lORk9fQ0hBTk5FTF9USU1FOiBhbW91bnQgb2YgdGltZSAoaW4gbXMpIHRoYXQgdGhlIHJhZGlvCisgKglzcGVudCBvbiB0aGlzIGNoYW5uZWwKKyAqIEBOTDgwMjExX1NVUlZFWV9JTkZPX0NIQU5ORUxfVElNRV9CVVNZOiBhbW91bnQgb2YgdGhlIHRpbWUgdGhlIHByaW1hcnkKKyAqCWNoYW5uZWwgd2FzIHNlbnNlZCBidXN5IChlaXRoZXIgZHVlIHRvIGFjdGl2aXR5IG9yIGVuZXJneSBkZXRlY3QpCisgKiBATkw4MDIxMV9TVVJWRVlfSU5GT19DSEFOTkVMX1RJTUVfRVhUX0JVU1k6IGFtb3VudCBvZiB0aW1lIHRoZSBleHRlbnNpb24KKyAqCWNoYW5uZWwgd2FzIHNlbnNlZCBidXN5CisgKiBATkw4MDIxMV9TVVJWRVlfSU5GT19DSEFOTkVMX1RJTUVfUlg6IGFtb3VudCBvZiB0aW1lIHRoZSByYWRpbyBzcGVudAorICoJcmVjZWl2aW5nIGRhdGEKKyAqIEBOTDgwMjExX1NVUlZFWV9JTkZPX0NIQU5ORUxfVElNRV9UWDogYW1vdW50IG9mIHRpbWUgdGhlIHJhZGlvIHNwZW50CisgKgl0cmFuc21pdHRpbmcgZGF0YQorICogQE5MODAyMTFfU1VSVkVZX0lORk9fTUFYOiBoaWdoZXN0IHN1cnZleSBpbmZvIGF0dHJpYnV0ZSBudW1iZXIKKyAqCWN1cnJlbnRseSBkZWZpbmVkCisgKiBAX19OTDgwMjExX1NVUlZFWV9JTkZPX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfc3VydmV5X2luZm8geworCV9fTkw4MDIxMV9TVVJWRVlfSU5GT19JTlZBTElELAorCU5MODAyMTFfU1VSVkVZX0lORk9fRlJFUVVFTkNZLAorCU5MODAyMTFfU1VSVkVZX0lORk9fTk9JU0UsCisJTkw4MDIxMV9TVVJWRVlfSU5GT19JTl9VU0UsCisJTkw4MDIxMV9TVVJWRVlfSU5GT19DSEFOTkVMX1RJTUUsCisJTkw4MDIxMV9TVVJWRVlfSU5GT19DSEFOTkVMX1RJTUVfQlVTWSwKKwlOTDgwMjExX1NVUlZFWV9JTkZPX0NIQU5ORUxfVElNRV9FWFRfQlVTWSwKKwlOTDgwMjExX1NVUlZFWV9JTkZPX0NIQU5ORUxfVElNRV9SWCwKKwlOTDgwMjExX1NVUlZFWV9JTkZPX0NIQU5ORUxfVElNRV9UWCwKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9TVVJWRVlfSU5GT19BRlRFUl9MQVNULAorCU5MODAyMTFfU1VSVkVZX0lORk9fTUFYID0gX19OTDgwMjExX1NVUlZFWV9JTkZPX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9tbnRyX2ZsYWdzIC0gbW9uaXRvciBjb25maWd1cmF0aW9uIGZsYWdzCisgKgorICogTW9uaXRvciBjb25maWd1cmF0aW9uIGZsYWdzLgorICoKKyAqIEBfX05MODAyMTFfTU5UUl9GTEFHX0lOVkFMSUQ6IHJlc2VydmVkCisgKgorICogQE5MODAyMTFfTU5UUl9GTEFHX0ZDU0ZBSUw6IHBhc3MgZnJhbWVzIHdpdGggYmFkIEZDUworICogQE5MODAyMTFfTU5UUl9GTEFHX1BMQ1BGQUlMOiBwYXNzIGZyYW1lcyB3aXRoIGJhZCBQTENQCisgKiBATkw4MDIxMV9NTlRSX0ZMQUdfQ09OVFJPTDogcGFzcyBjb250cm9sIGZyYW1lcworICogQE5MODAyMTFfTU5UUl9GTEFHX09USEVSX0JTUzogZGlzYWJsZSBCU1NJRCBmaWx0ZXJpbmcKKyAqIEBOTDgwMjExX01OVFJfRkxBR19DT09LX0ZSQU1FUzogcmVwb3J0IGZyYW1lcyBhZnRlciBwcm9jZXNzaW5nLgorICoJb3ZlcnJpZGVzIGFsbCBvdGhlciBmbGFncy4KKyAqCisgKiBAX19OTDgwMjExX01OVFJfRkxBR19BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqIEBOTDgwMjExX01OVFJfRkxBR19NQVg6IGhpZ2hlc3QgcG9zc2libGUgbW9uaXRvciBmbGFnCisgKi8KK2VudW0gbmw4MDIxMV9tbnRyX2ZsYWdzIHsKKwlfX05MODAyMTFfTU5UUl9GTEFHX0lOVkFMSUQsCisJTkw4MDIxMV9NTlRSX0ZMQUdfRkNTRkFJTCwKKwlOTDgwMjExX01OVFJfRkxBR19QTENQRkFJTCwKKwlOTDgwMjExX01OVFJfRkxBR19DT05UUk9MLAorCU5MODAyMTFfTU5UUl9GTEFHX09USEVSX0JTUywKKwlOTDgwMjExX01OVFJfRkxBR19DT09LX0ZSQU1FUywKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9NTlRSX0ZMQUdfQUZURVJfTEFTVCwKKwlOTDgwMjExX01OVFJfRkxBR19NQVggPSBfX05MODAyMTFfTU5UUl9GTEFHX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9tZXNoY29uZl9wYXJhbXMgLSBtZXNoIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICoKKyAqIE1lc2ggY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiBUaGVzZSBjYW4gYmUgY2hhbmdlZCB3aGlsZSB0aGUgbWVzaCBpcworICogYWN0aXZlLgorICoKKyAqIEBfX05MODAyMTFfTUVTSENPTkZfSU5WQUxJRDogaW50ZXJuYWwgdXNlCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfUkVUUllfVElNRU9VVDogc3BlY2lmaWVzIHRoZSBpbml0aWFsIHJldHJ5IHRpbWVvdXQgaW4KKyAqIG1pbGxpc2Vjb25kIHVuaXRzLCB1c2VkIGJ5IHRoZSBQZWVyIExpbmsgT3BlbiBtZXNzYWdlCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfQ09ORklSTV9USU1FT1VUOiBzcGVjaWZpZXMgdGhlIGluaXRpYWwgY29uZmlybSB0aW1lb3V0LCBpbgorICogbWlsbGlzZWNvbmQgdW5pdHMsIHVzZWQgYnkgdGhlIHBlZXIgbGluayBtYW5hZ2VtZW50IHRvIGNsb3NlIGEgcGVlciBsaW5rCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfSE9MRElOR19USU1FT1VUOiBzcGVjaWZpZXMgdGhlIGhvbGRpbmcgdGltZW91dCwgaW4KKyAqIG1pbGxpc2Vjb25kIHVuaXRzCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfTUFYX1BFRVJfTElOS1M6IG1heGltdW0gbnVtYmVyIG9mIHBlZXIgbGlua3MgYWxsb3dlZAorICogb24gdGhpcyBtZXNoIGludGVyZmFjZQorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX01BWF9SRVRSSUVTOiBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBlZXIgbGluaworICogb3BlbiByZXRyaWVzIHRoYXQgY2FuIGJlIHNlbnQgdG8gZXN0YWJsaXNoIGEgbmV3IHBlZXIgbGluayBpbnN0YW5jZSBpbiBhCisgKiBtZXNoCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfVFRMOiBzcGVjaWZpZXMgdGhlIHZhbHVlIG9mIFRUTCBmaWVsZCBzZXQgYXQgYSBzb3VyY2UgbWVzaAorICogcG9pbnQuCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfQVVUT19PUEVOX1BMSU5LUzogd2hldGhlciB3ZSBzaG91bGQgYXV0b21hdGljYWxseQorICogb3BlbiBwZWVyIGxpbmtzIHdoZW4gd2UgZGV0ZWN0IGNvbXBhdGlibGUgbWVzaCBwZWVycy4KKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9IV01QX01BWF9QUkVRX1JFVFJJRVM6IHRoZSBudW1iZXIgb2YgYWN0aW9uIGZyYW1lcworICogY29udGFpbmluZyBhIFBSRVEgdGhhdCBhbiBNUCBjYW4gc2VuZCB0byBhIHBhcnRpY3VsYXIgZGVzdGluYXRpb24gKHBhdGgKKyAqIHRhcmdldCkKKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9QQVRIX1JFRlJFU0hfVElNRTogaG93IGZyZXF1ZW50bHkgdG8gcmVmcmVzaCBtZXNoIHBhdGhzCisgKiAoaW4gbWlsbGlzZWNvbmRzKQorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX01JTl9ESVNDT1ZFUllfVElNRU9VVDogbWluaW11bSBsZW5ndGggb2YgdGltZSB0byB3YWl0CisgKiB1bnRpbCBnaXZpbmcgdXAgb24gYSBwYXRoIGRpc2NvdmVyeSAoaW4gbWlsbGlzZWNvbmRzKQorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0hXTVBfQUNUSVZFX1BBVEhfVElNRU9VVDogVGhlIHRpbWUgKGluIFRVcykgZm9yIHdoaWNoIG1lc2gKKyAqIHBvaW50cyByZWNlaXZpbmcgYSBQUkVRIHNoYWxsIGNvbnNpZGVyIHRoZSBmb3J3YXJkaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlCisgKiByb290IHRvIGJlIHZhbGlkLiAoVFUgPSB0aW1lIHVuaXQpCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfSFdNUF9QUkVRX01JTl9JTlRFUlZBTDogVGhlIG1pbmltdW0gaW50ZXJ2YWwgb2YgdGltZSAoaW4KKyAqIFRVcykgZHVyaW5nIHdoaWNoIGFuIE1QIGNhbiBzZW5kIG9ubHkgb25lIGFjdGlvbiBmcmFtZSBjb250YWluaW5nIGEgUFJFUQorICogcmVmZXJlbmNlIGVsZW1lbnQKKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9IV01QX05FVF9ESUFNX1RSVlNfVElNRTogVGhlIGludGVydmFsIG9mIHRpbWUgKGluIFRVcykKKyAqIHRoYXQgaXQgdGFrZXMgZm9yIGFuIEhXTVAgaW5mb3JtYXRpb24gZWxlbWVudCB0byBwcm9wYWdhdGUgYWNyb3NzIHRoZSBtZXNoCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfSFdNUF9ST09UTU9ERTogd2hldGhlciByb290IG1vZGUgaXMgZW5hYmxlZCBvciBub3QKKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9FTEVNRU5UX1RUTDogc3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiBUVEwgZmllbGQgc2V0IGF0IGEKKyAqIHNvdXJjZSBtZXNoIHBvaW50IGZvciBwYXRoIHNlbGVjdGlvbiBlbGVtZW50cy4KKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9IV01QX1JBTk5fSU5URVJWQUw6ICBUaGUgaW50ZXJ2YWwgb2YgdGltZSAoaW4gVFVzKSBiZXR3ZWVuCisgKiByb290IGFubm91bmNlbWVudHMgYXJlIHRyYW5zbWl0dGVkLgorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0dBVEVfQU5OT1VOQ0VNRU5UUzogQWR2ZXJ0aXNlIHRoYXQgdGhpcyBtZXNoIHN0YXRpb24gaGFzCisgKiBhY2Nlc3MgdG8gYSBicm9hZGVyIG5ldHdvcmsgYmV5b25kIHRoZSBNQlNTLiAgVGhpcyBpcyBkb25lIHZpYSBSb290CisgKiBBbm5vdW5jZW1lbnQgZnJhbWVzLgorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0FUVFJfTUFYOiBoaWdoZXN0IHBvc3NpYmxlIG1lc2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUKKyAqCisgKiBAX19OTDgwMjExX01FU0hDT05GX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKi8KK2VudW0gbmw4MDIxMV9tZXNoY29uZl9wYXJhbXMgeworCV9fTkw4MDIxMV9NRVNIQ09ORl9JTlZBTElELAorCU5MODAyMTFfTUVTSENPTkZfUkVUUllfVElNRU9VVCwKKwlOTDgwMjExX01FU0hDT05GX0NPTkZJUk1fVElNRU9VVCwKKwlOTDgwMjExX01FU0hDT05GX0hPTERJTkdfVElNRU9VVCwKKwlOTDgwMjExX01FU0hDT05GX01BWF9QRUVSX0xJTktTLAorCU5MODAyMTFfTUVTSENPTkZfTUFYX1JFVFJJRVMsCisJTkw4MDIxMV9NRVNIQ09ORl9UVEwsCisJTkw4MDIxMV9NRVNIQ09ORl9BVVRPX09QRU5fUExJTktTLAorCU5MODAyMTFfTUVTSENPTkZfSFdNUF9NQVhfUFJFUV9SRVRSSUVTLAorCU5MODAyMTFfTUVTSENPTkZfUEFUSF9SRUZSRVNIX1RJTUUsCisJTkw4MDIxMV9NRVNIQ09ORl9NSU5fRElTQ09WRVJZX1RJTUVPVVQsCisJTkw4MDIxMV9NRVNIQ09ORl9IV01QX0FDVElWRV9QQVRIX1RJTUVPVVQsCisJTkw4MDIxMV9NRVNIQ09ORl9IV01QX1BSRVFfTUlOX0lOVEVSVkFMLAorCU5MODAyMTFfTUVTSENPTkZfSFdNUF9ORVRfRElBTV9UUlZTX1RJTUUsCisJTkw4MDIxMV9NRVNIQ09ORl9IV01QX1JPT1RNT0RFLAorCU5MODAyMTFfTUVTSENPTkZfRUxFTUVOVF9UVEwsCisJTkw4MDIxMV9NRVNIQ09ORl9IV01QX1JBTk5fSU5URVJWQUwsCisJTkw4MDIxMV9NRVNIQ09ORl9HQVRFX0FOTk9VTkNFTUVOVFMsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfTUVTSENPTkZfQVRUUl9BRlRFUl9MQVNULAorCU5MODAyMTFfTUVTSENPTkZfQVRUUl9NQVggPSBfX05MODAyMTFfTUVTSENPTkZfQVRUUl9BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfbWVzaF9zZXR1cF9wYXJhbXMgLSBtZXNoIHNldHVwIHBhcmFtZXRlcnMKKyAqCisgKiBNZXNoIHNldHVwIHBhcmFtZXRlcnMuICBUaGVzZSBhcmUgdXNlZCB0byBzdGFydC9qb2luIGEgbWVzaCBhbmQgY2Fubm90IGJlCisgKiBjaGFuZ2VkIHdoaWxlIHRoZSBtZXNoIGlzIGFjdGl2ZS4KKyAqCisgKiBAX19OTDgwMjExX01FU0hfU0VUVVBfSU5WQUxJRDogSW50ZXJuYWwgdXNlCisgKgorICogQE5MODAyMTFfTUVTSF9TRVRVUF9FTkFCTEVfVkVORE9SX1BBVEhfU0VMOiBFbmFibGUgdGhpcyBvcHRpb24gdG8gdXNlIGEKKyAqIHZlbmRvciBzcGVjaWZpYyBwYXRoIHNlbGVjdGlvbiBhbGdvcml0aG0gb3IgZGlzYWJsZSBpdCB0byB1c2UgdGhlIGRlZmF1bHQKKyAqIEhXTVAuCisgKgorICogQE5MODAyMTFfTUVTSF9TRVRVUF9FTkFCTEVfVkVORE9SX01FVFJJQzogRW5hYmxlIHRoaXMgb3B0aW9uIHRvIHVzZSBhCisgKiB2ZW5kb3Igc3BlY2lmaWMgcGF0aCBtZXRyaWMgb3IgZGlzYWJsZSBpdCB0byB1c2UgdGhlIGRlZmF1bHQgQWlydGltZQorICogbWV0cmljLgorICoKKyAqIEBOTDgwMjExX01FU0hfU0VUVVBfSUU6IEluZm9ybWF0aW9uIGVsZW1lbnRzIGZvciB0aGlzIG1lc2gsIGZvciBpbnN0YW5jZSwgYQorICogcm9idXN0IHNlY3VyaXR5IG5ldHdvcmsgaWUsIG9yIGEgdmVuZG9yIHNwZWNpZmljIGluZm9ybWF0aW9uIGVsZW1lbnQgdGhhdAorICogdmVuZG9ycyB3aWxsIHVzZSB0byBpZGVudGlmeSB0aGUgcGF0aCBzZWxlY3Rpb24gbWV0aG9kcyBhbmQgbWV0cmljcyBpbiB1c2UuCisgKgorICogQE5MODAyMTFfTUVTSF9TRVRVUF9VU0VSU1BBQ0VfQVVUSDogRW5hYmxlIHRoaXMgb3B0aW9uIGlmIGFuIGF1dGhlbnRpY2F0aW9uCisgKiBkYWVtb24gd2lsbCBiZSBhdXRoZW50aWNhdGluZyBtZXNoIGNhbmRpZGF0ZXMuCisgKgorICogQE5MODAyMTFfTUVTSF9TRVRVUF9VU0VSU1BBQ0VfQU1QRTogRW5hYmxlIHRoaXMgb3B0aW9uIGlmIGFuIGF1dGhlbnRpY2F0aW9uCisgKiBkYWVtb24gd2lsbCBiZSBzZWN1cmluZyBwZWVyIGxpbmsgZnJhbWVzLiAgQU1QRSBpcyBhIHNlY3VyZWQgdmVyc2lvbiBvZiBNZXNoCisgKiBQZWVyaW5nIE1hbmFnZW1lbnQgKE1QTSkgYW5kIGlzIGltcGxlbWVudGVkIHdpdGggdGhlIGFzc2lzdGFuY2Ugb2YgYQorICogdXNlcnNwYWNlIGRhZW1vbi4gIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgdGhlIGtlcm5lbCB3aWxsIHNlbmQgcGVlcgorICogbWFuYWdlbWVudCBmcmFtZXMgdG8gYSB1c2Vyc3BhY2UgZGFlbW9uIHRoYXQgd2lsbCBpbXBsZW1lbnQgQU1QRQorICogZnVuY3Rpb25hbGl0eSAoc2VjdXJpdHkgY2FwYWJpbGl0aWVzIHNlbGVjdGlvbiwga2V5IGNvbmZpcm1hdGlvbiwgYW5kIGtleQorICogbWFuYWdlbWVudCkuICBXaGVuIHRoZSBmbGFnIGlzIHVuc2V0IChkZWZhdWx0KSwgdGhlIGtlcm5lbCBjYW4gYXV0b25vbW91c2x5CisgKiBjb21wbGV0ZSAodW5zZWN1cmVkKSBtZXNoIHBlZXJpbmcgd2l0aG91dCB0aGUgbmVlZCBvZiBhIHVzZXJzcGFjZSBkYWVtb24uCisgKgorICogQE5MODAyMTFfTUVTSF9TRVRVUF9BVFRSX01BWDogaGlnaGVzdCBwb3NzaWJsZSBtZXNoIHNldHVwIGF0dHJpYnV0ZSBudW1iZXIKKyAqIEBfX05MODAyMTFfTUVTSF9TRVRVUF9BVFRSX0FGVEVSX0xBU1Q6IEludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfbWVzaF9zZXR1cF9wYXJhbXMgeworCV9fTkw4MDIxMV9NRVNIX1NFVFVQX0lOVkFMSUQsCisJTkw4MDIxMV9NRVNIX1NFVFVQX0VOQUJMRV9WRU5ET1JfUEFUSF9TRUwsCisJTkw4MDIxMV9NRVNIX1NFVFVQX0VOQUJMRV9WRU5ET1JfTUVUUklDLAorCU5MODAyMTFfTUVTSF9TRVRVUF9JRSwKKwlOTDgwMjExX01FU0hfU0VUVVBfVVNFUlNQQUNFX0FVVEgsCisJTkw4MDIxMV9NRVNIX1NFVFVQX1VTRVJTUEFDRV9BTVBFLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX01FU0hfU0VUVVBfQVRUUl9BRlRFUl9MQVNULAorCU5MODAyMTFfTUVTSF9TRVRVUF9BVFRSX01BWCA9IF9fTkw4MDIxMV9NRVNIX1NFVFVQX0FUVFJfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3R4cV9hdHRyIC0gVFggcXVldWUgcGFyYW1ldGVyIGF0dHJpYnV0ZXMKKyAqIEBfX05MODAyMTFfVFhRX0FUVFJfSU5WQUxJRDogQXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9UWFFfQVRUUl9RVUVVRTogVFggcXVldWUgaWRlbnRpZmllciAoTkw4MDIxMV9UWFFfUV8qKQorICogQE5MODAyMTFfVFhRX0FUVFJfVFhPUDogTWF4aW11bSBidXJzdCB0aW1lIGluIHVuaXRzIG9mIDMyIHVzZWNzLCAwIG1lYW5pbmcKKyAqCWRpc2FibGVkCisgKiBATkw4MDIxMV9UWFFfQVRUUl9DV01JTjogTWluaW11bSBjb250ZW50aW9uIHdpbmRvdyBbYSB2YWx1ZSBvZiB0aGUgZm9ybQorICoJMl5uLTEgaW4gdGhlIHJhbmdlIDEuLjMyNzY3XQorICogQE5MODAyMTFfVFhRX0FUVFJfQ1dNQVg6IE1heGltdW0gY29udGVudGlvbiB3aW5kb3cgW2EgdmFsdWUgb2YgdGhlIGZvcm0KKyAqCTJebi0xIGluIHRoZSByYW5nZSAxLi4zMjc2N10KKyAqIEBOTDgwMjExX1RYUV9BVFRSX0FJRlM6IEFyYml0cmF0aW9uIGludGVyZnJhbWUgc3BhY2UgWzAuLjI1NV0KKyAqIEBfX05MODAyMTFfVFhRX0FUVFJfQUZURVJfTEFTVDogSW50ZXJuYWwKKyAqIEBOTDgwMjExX1RYUV9BVFRSX01BWDogTWF4aW11bSBUWFEgYXR0cmlidXRlIG51bWJlcgorICovCitlbnVtIG5sODAyMTFfdHhxX2F0dHIgeworCV9fTkw4MDIxMV9UWFFfQVRUUl9JTlZBTElELAorCU5MODAyMTFfVFhRX0FUVFJfUVVFVUUsCisJTkw4MDIxMV9UWFFfQVRUUl9UWE9QLAorCU5MODAyMTFfVFhRX0FUVFJfQ1dNSU4sCisJTkw4MDIxMV9UWFFfQVRUUl9DV01BWCwKKwlOTDgwMjExX1RYUV9BVFRSX0FJRlMsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfVFhRX0FUVFJfQUZURVJfTEFTVCwKKwlOTDgwMjExX1RYUV9BVFRSX01BWCA9IF9fTkw4MDIxMV9UWFFfQVRUUl9BRlRFUl9MQVNUIC0gMQorfTsKKworZW51bSBubDgwMjExX3R4cV9xIHsKKwlOTDgwMjExX1RYUV9RX1ZPLAorCU5MODAyMTFfVFhRX1FfVkksCisJTkw4MDIxMV9UWFFfUV9CRSwKKwlOTDgwMjExX1RYUV9RX0JLCit9OworCitlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIHsKKwlOTDgwMjExX0NIQU5fTk9fSFQsCisJTkw4MDIxMV9DSEFOX0hUMjAsCisJTkw4MDIxMV9DSEFOX0hUNDBNSU5VUywKKwlOTDgwMjExX0NIQU5fSFQ0MFBMVVMKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2JzcyAtIG5ldGxpbmsgYXR0cmlidXRlcyBmb3IgYSBCU1MKKyAqCisgKiBAX19OTDgwMjExX0JTU19JTlZBTElEOiBpbnZhbGlkCisgKiBATkw4MDIxMV9CU1NfQlNTSUQ6IEJTU0lEIG9mIHRoZSBCU1MgKDYgb2N0ZXRzKQorICogQE5MODAyMTFfQlNTX0ZSRVFVRU5DWTogZnJlcXVlbmN5IGluIE1IeiAodTMyKQorICogQE5MODAyMTFfQlNTX1RTRjogVFNGIG9mIHRoZSByZWNlaXZlZCBwcm9iZSByZXNwb25zZS9iZWFjb24gKHU2NCkKKyAqIEBOTDgwMjExX0JTU19CRUFDT05fSU5URVJWQUw6IGJlYWNvbiBpbnRlcnZhbCBvZiB0aGUgKEkpQlNTICh1MTYpCisgKiBATkw4MDIxMV9CU1NfQ0FQQUJJTElUWTogY2FwYWJpbGl0eSBmaWVsZCAoQ1BVIG9yZGVyLCB1MTYpCisgKiBATkw4MDIxMV9CU1NfSU5GT1JNQVRJT05fRUxFTUVOVFM6IGJpbmFyeSBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUKKyAqCXJhdyBpbmZvcm1hdGlvbiBlbGVtZW50cyBmcm9tIHRoZSBwcm9iZSByZXNwb25zZS9iZWFjb24gKGJpbik7CisgKglpZiB0aGUgJU5MODAyMTFfQlNTX0JFQUNPTl9JRVMgYXR0cmlidXRlIGlzIHByZXNlbnQsIHRoZSBJRXMgaGVyZSBhcmUKKyAqCWZyb20gYSBQcm9iZSBSZXNwb25zZSBmcmFtZTsgb3RoZXJ3aXNlIHRoZXkgYXJlIGZyb20gYSBCZWFjb24gZnJhbWUuCisgKglIb3dldmVyLCBpZiB0aGUgZHJpdmVyIGRvZXMgbm90IGluZGljYXRlIHRoZSBzb3VyY2Ugb2YgdGhlIElFcywgdGhlc2UKKyAqCUlFcyBtYXkgYmUgZnJvbSBlaXRoZXIgZnJhbWUgc3VidHlwZS4KKyAqIEBOTDgwMjExX0JTU19TSUdOQUxfTUJNOiBzaWduYWwgc3RyZW5ndGggb2YgcHJvYmUgcmVzcG9uc2UvYmVhY29uCisgKglpbiBtQm0gKDEwMCAqIGRCbSkgKHMzMikKKyAqIEBOTDgwMjExX0JTU19TSUdOQUxfVU5TUEVDOiBzaWduYWwgc3RyZW5ndGggb2YgdGhlIHByb2JlIHJlc3BvbnNlL2JlYWNvbgorICoJaW4gdW5zcGVjaWZpZWQgdW5pdHMsIHNjYWxlZCB0byAwLi4xMDAgKHU4KQorICogQE5MODAyMTFfQlNTX1NUQVRVUzogc3RhdHVzLCBpZiB0aGlzIEJTUyBpcyAidXNlZCIKKyAqIEBOTDgwMjExX0JTU19TRUVOX01TX0FHTzogYWdlIG9mIHRoaXMgQlNTIGVudHJ5IGluIG1zCisgKiBATkw4MDIxMV9CU1NfQkVBQ09OX0lFUzogYmluYXJ5IGF0dHJpYnV0ZSBjb250YWluaW5nIHRoZSByYXcgaW5mb3JtYXRpb24KKyAqCWVsZW1lbnRzIGZyb20gYSBCZWFjb24gZnJhbWUgKGJpbik7IG5vdCBwcmVzZW50IGlmIG5vIEJlYWNvbiBmcmFtZSBoYXMKKyAqCXlldCBiZWVuIHJlY2VpdmVkCisgKiBAX19OTDgwMjExX0JTU19BRlRFUl9MQVNUOiBpbnRlcm5hbAorICogQE5MODAyMTFfQlNTX01BWDogaGlnaGVzdCBCU1MgYXR0cmlidXRlCisgKi8KK2VudW0gbmw4MDIxMV9ic3MgeworCV9fTkw4MDIxMV9CU1NfSU5WQUxJRCwKKwlOTDgwMjExX0JTU19CU1NJRCwKKwlOTDgwMjExX0JTU19GUkVRVUVOQ1ksCisJTkw4MDIxMV9CU1NfVFNGLAorCU5MODAyMTFfQlNTX0JFQUNPTl9JTlRFUlZBTCwKKwlOTDgwMjExX0JTU19DQVBBQklMSVRZLAorCU5MODAyMTFfQlNTX0lORk9STUFUSU9OX0VMRU1FTlRTLAorCU5MODAyMTFfQlNTX1NJR05BTF9NQk0sCisJTkw4MDIxMV9CU1NfU0lHTkFMX1VOU1BFQywKKwlOTDgwMjExX0JTU19TVEFUVVMsCisJTkw4MDIxMV9CU1NfU0VFTl9NU19BR08sCisJTkw4MDIxMV9CU1NfQkVBQ09OX0lFUywKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9CU1NfQUZURVJfTEFTVCwKKwlOTDgwMjExX0JTU19NQVggPSBfX05MODAyMTFfQlNTX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9ic3Nfc3RhdHVzIC0gQlNTICJzdGF0dXMiCisgKiBATkw4MDIxMV9CU1NfU1RBVFVTX0FVVEhFTlRJQ0FURUQ6IEF1dGhlbnRpY2F0ZWQgd2l0aCB0aGlzIEJTUy4KKyAqIEBOTDgwMjExX0JTU19TVEFUVVNfQVNTT0NJQVRFRDogQXNzb2NpYXRlZCB3aXRoIHRoaXMgQlNTLgorICogQE5MODAyMTFfQlNTX1NUQVRVU19JQlNTX0pPSU5FRDogSm9pbmVkIHRvIHRoaXMgSUJTUy4KKyAqCisgKiBUaGUgQlNTIHN0YXR1cyBpcyBhIEJTUyBhdHRyaWJ1dGUgaW4gc2NhbiBkdW1wcywgd2hpY2gKKyAqIGluZGljYXRlcyB0aGUgc3RhdHVzIHRoZSBpbnRlcmZhY2UgaGFzIHdydC4gdGhpcyBCU1MuCisgKi8KK2VudW0gbmw4MDIxMV9ic3Nfc3RhdHVzIHsKKwlOTDgwMjExX0JTU19TVEFUVVNfQVVUSEVOVElDQVRFRCwKKwlOTDgwMjExX0JTU19TVEFUVVNfQVNTT0NJQVRFRCwKKwlOTDgwMjExX0JTU19TVEFUVVNfSUJTU19KT0lORUQsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9hdXRoX3R5cGUgLSBBdXRoZW50aWNhdGlvblR5cGUKKyAqCisgKiBATkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTTogT3BlbiBTeXN0ZW0gYXV0aGVudGljYXRpb24KKyAqIEBOTDgwMjExX0FVVEhUWVBFX1NIQVJFRF9LRVk6IFNoYXJlZCBLZXkgYXV0aGVudGljYXRpb24gKFdFUCBvbmx5KQorICogQE5MODAyMTFfQVVUSFRZUEVfRlQ6IEZhc3QgQlNTIFRyYW5zaXRpb24gKElFRUUgODAyLjExcikKKyAqIEBOTDgwMjExX0FVVEhUWVBFX05FVFdPUktfRUFQOiBOZXR3b3JrIEVBUCAoc29tZSBDaXNjbyBBUHMgYW5kIG1haW5seSBMRUFQKQorICogQF9fTkw4MDIxMV9BVVRIVFlQRV9OVU06IGludGVybmFsCisgKiBATkw4MDIxMV9BVVRIVFlQRV9NQVg6IG1heGltdW0gdmFsaWQgYXV0aCBhbGdvcml0aG0KKyAqIEBOTDgwMjExX0FVVEhUWVBFX0FVVE9NQVRJQzogZGV0ZXJtaW5lIGF1dG9tYXRpY2FsbHkgKGlmIG5lY2Vzc2FyeSBieQorICoJdHJ5aW5nIG11bHRpcGxlIHRpbWVzKTsgdGhpcyBpcyBpbnZhbGlkIGluIG5ldGxpbmsgLS0gbGVhdmUgb3V0CisgKgl0aGUgYXR0cmlidXRlIGZvciB0aGlzIG9uIENPTk5FQ1QgY29tbWFuZHMuCisgKi8KK2VudW0gbmw4MDIxMV9hdXRoX3R5cGUgeworCU5MODAyMTFfQVVUSFRZUEVfT1BFTl9TWVNURU0sCisJTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZLAorCU5MODAyMTFfQVVUSFRZUEVfRlQsCisJTkw4MDIxMV9BVVRIVFlQRV9ORVRXT1JLX0VBUCwKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9BVVRIVFlQRV9OVU0sCisJTkw4MDIxMV9BVVRIVFlQRV9NQVggPSBfX05MODAyMTFfQVVUSFRZUEVfTlVNIC0gMSwKKwlOTDgwMjExX0FVVEhUWVBFX0FVVE9NQVRJQworfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfa2V5X3R5cGUgLSBLZXkgVHlwZQorICogQE5MODAyMTFfS0VZVFlQRV9HUk9VUDogR3JvdXAgKGJyb2FkY2FzdC9tdWx0aWNhc3QpIGtleQorICogQE5MODAyMTFfS0VZVFlQRV9QQUlSV0lTRTogUGFpcndpc2UgKHVuaWNhc3QvaW5kaXZpZHVhbCkga2V5CisgKiBATkw4MDIxMV9LRVlUWVBFX1BFRVJLRVk6IFBlZXJLZXkgKERMUykKKyAqIEBOVU1fTkw4MDIxMV9LRVlUWVBFUzogbnVtYmVyIG9mIGRlZmluZWQga2V5IHR5cGVzCisgKi8KK2VudW0gbmw4MDIxMV9rZXlfdHlwZSB7CisJTkw4MDIxMV9LRVlUWVBFX0dST1VQLAorCU5MODAyMTFfS0VZVFlQRV9QQUlSV0lTRSwKKwlOTDgwMjExX0tFWVRZUEVfUEVFUktFWSwKKworCU5VTV9OTDgwMjExX0tFWVRZUEVTCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9tZnAgLSBNYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24gc3RhdGUKKyAqIEBOTDgwMjExX01GUF9OTzogTWFuYWdlbWVudCBmcmFtZSBwcm90ZWN0aW9uIG5vdCB1c2VkCisgKiBATkw4MDIxMV9NRlBfUkVRVUlSRUQ6IE1hbmFnZW1lbnQgZnJhbWUgcHJvdGVjdGlvbiByZXF1aXJlZAorICovCitlbnVtIG5sODAyMTFfbWZwIHsKKwlOTDgwMjExX01GUF9OTywKKwlOTDgwMjExX01GUF9SRVFVSVJFRCwKK307CisKK2VudW0gbmw4MDIxMV93cGFfdmVyc2lvbnMgeworCU5MODAyMTFfV1BBX1ZFUlNJT05fMSA9IDEgPDwgMCwKKwlOTDgwMjExX1dQQV9WRVJTSU9OXzIgPSAxIDw8IDEsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9rZXlfZGVmYXVsdF90eXBlcyAtIGtleSBkZWZhdWx0IHR5cGVzCisgKiBAX19OTDgwMjExX0tFWV9ERUZBVUxUX1RZUEVfSU5WQUxJRDogaW52YWxpZAorICogQE5MODAyMTFfS0VZX0RFRkFVTFRfVFlQRV9VTklDQVNUOiBrZXkgc2hvdWxkIGJlIHVzZWQgYXMgZGVmYXVsdAorICoJdW5pY2FzdCBrZXkKKyAqIEBOTDgwMjExX0tFWV9ERUZBVUxUX1RZUEVfTVVMVElDQVNUOiBrZXkgc2hvdWxkIGJlIHVzZWQgYXMgZGVmYXVsdAorICoJbXVsdGljYXN0IGtleQorICogQE5VTV9OTDgwMjExX0tFWV9ERUZBVUxUX1RZUEVTOiBudW1iZXIgb2YgZGVmYXVsdCB0eXBlcworICovCitlbnVtIG5sODAyMTFfa2V5X2RlZmF1bHRfdHlwZXMgeworCV9fTkw4MDIxMV9LRVlfREVGQVVMVF9UWVBFX0lOVkFMSUQsCisJTkw4MDIxMV9LRVlfREVGQVVMVF9UWVBFX1VOSUNBU1QsCisJTkw4MDIxMV9LRVlfREVGQVVMVF9UWVBFX01VTFRJQ0FTVCwKKworCU5VTV9OTDgwMjExX0tFWV9ERUZBVUxUX1RZUEVTCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9rZXlfYXR0cmlidXRlcyAtIGtleSBhdHRyaWJ1dGVzCisgKiBAX19OTDgwMjExX0tFWV9JTlZBTElEOiBpbnZhbGlkCisgKiBATkw4MDIxMV9LRVlfREFUQTogKHRlbXBvcmFsKSBrZXkgZGF0YTsgZm9yIFRLSVAgdGhpcyBjb25zaXN0cyBvZgorICoJMTYgYnl0ZXMgZW5jcnlwdGlvbiBrZXkgZm9sbG93ZWQgYnkgOCBieXRlcyBlYWNoIGZvciBUWCBhbmQgUlggTUlDCisgKglrZXlzCisgKiBATkw4MDIxMV9LRVlfSURYOiBrZXkgSUQgKHU4LCAwLTMpCisgKiBATkw4MDIxMV9LRVlfQ0lQSEVSOiBrZXkgY2lwaGVyIHN1aXRlICh1MzIsIGFzIGRlZmluZWQgYnkgSUVFRSA4MDIuMTEKKyAqCXNlY3Rpb24gNy4zLjIuMjUuMSwgZS5nLiAweDAwMEZBQzA0KQorICogQE5MODAyMTFfS0VZX1NFUTogdHJhbnNtaXQga2V5IHNlcXVlbmNlIG51bWJlciAoSVYvUE4pIGZvciBUS0lQIGFuZAorICoJQ0NNUCBrZXlzLCBlYWNoIHNpeCBieXRlcyBpbiBsaXR0bGUgZW5kaWFuCisgKiBATkw4MDIxMV9LRVlfREVGQVVMVDogZmxhZyBpbmRpY2F0aW5nIGRlZmF1bHQga2V5CisgKiBATkw4MDIxMV9LRVlfREVGQVVMVF9NR01UOiBmbGFnIGluZGljYXRpbmcgZGVmYXVsdCBtYW5hZ2VtZW50IGtleQorICogQE5MODAyMTFfS0VZX1RZUEU6IHRoZSBrZXkgdHlwZSBmcm9tIGVudW0gbmw4MDIxMV9rZXlfdHlwZSwgaWYgbm90CisgKglzcGVjaWZpZWQgdGhlIGRlZmF1bHQgZGVwZW5kcyBvbiB3aGV0aGVyIGEgTUFDIGFkZHJlc3Mgd2FzCisgKglnaXZlbiB3aXRoIHRoZSBjb21tYW5kIHVzaW5nIHRoZSBrZXkgb3Igbm90ICh1MzIpCisgKiBATkw4MDIxMV9LRVlfREVGQVVMVF9UWVBFUzogQSBuZXN0ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcgZmxhZ3MKKyAqCWF0dHJpYnV0ZXMsIHNwZWNpZnlpbmcgd2hhdCBhIGtleSBzaG91bGQgYmUgc2V0IGFzIGRlZmF1bHQgYXMuCisgKglTZWUgJmVudW0gbmw4MDIxMV9rZXlfZGVmYXVsdF90eXBlcy4KKyAqIEBfX05MODAyMTFfS0VZX0FGVEVSX0xBU1Q6IGludGVybmFsCisgKiBATkw4MDIxMV9LRVlfTUFYOiBoaWdoZXN0IGtleSBhdHRyaWJ1dGUKKyAqLworZW51bSBubDgwMjExX2tleV9hdHRyaWJ1dGVzIHsKKwlfX05MODAyMTFfS0VZX0lOVkFMSUQsCisJTkw4MDIxMV9LRVlfREFUQSwKKwlOTDgwMjExX0tFWV9JRFgsCisJTkw4MDIxMV9LRVlfQ0lQSEVSLAorCU5MODAyMTFfS0VZX1NFUSwKKwlOTDgwMjExX0tFWV9ERUZBVUxULAorCU5MODAyMTFfS0VZX0RFRkFVTFRfTUdNVCwKKwlOTDgwMjExX0tFWV9UWVBFLAorCU5MODAyMTFfS0VZX0RFRkFVTFRfVFlQRVMsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfS0VZX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9LRVlfTUFYID0gX19OTDgwMjExX0tFWV9BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfdHhfcmF0ZV9hdHRyaWJ1dGVzIC0gVFggcmF0ZSBzZXQgYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9UWFJBVEVfSU5WQUxJRDogaW52YWxpZAorICogQE5MODAyMTFfVFhSQVRFX0xFR0FDWTogTGVnYWN5IChub24tTUNTKSByYXRlcyBhbGxvd2VkIGZvciBUWCByYXRlIHNlbGVjdGlvbgorICoJaW4gYW4gYXJyYXkgb2YgcmF0ZXMgYXMgZGVmaW5lZCBpbiBJRUVFIDgwMi4xMSA3LjMuMi4yICh1OCB2YWx1ZXMgd2l0aAorICoJMSA9IDUwMCBrYnBzKSBidXQgd2l0aG91dCB0aGUgSUUgbGVuZ3RoIHJlc3RyaWN0aW9uIChhdCBtb3N0CisgKgklTkw4MDIxMV9NQVhfU1VQUF9SQVRFUyBpbiBhIHNpbmdsZSBhcnJheSkuCisgKiBAX19OTDgwMjExX1RYUkFURV9BRlRFUl9MQVNUOiBpbnRlcm5hbAorICogQE5MODAyMTFfVFhSQVRFX01BWDogaGlnaGVzdCBUWCByYXRlIGF0dHJpYnV0ZQorICovCitlbnVtIG5sODAyMTFfdHhfcmF0ZV9hdHRyaWJ1dGVzIHsKKwlfX05MODAyMTFfVFhSQVRFX0lOVkFMSUQsCisJTkw4MDIxMV9UWFJBVEVfTEVHQUNZLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX1RYUkFURV9BRlRFUl9MQVNULAorCU5MODAyMTFfVFhSQVRFX01BWCA9IF9fTkw4MDIxMV9UWFJBVEVfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2JhbmQgLSBGcmVxdWVuY3kgYmFuZAorICogQE5MODAyMTFfQkFORF8yR0haOiAyLjQgR0h6IElTTSBiYW5kCisgKiBATkw4MDIxMV9CQU5EXzVHSFo6IGFyb3VuZCA1IEdIeiBiYW5kICg0LjkgLSA1LjcgR0h6KQorICovCitlbnVtIG5sODAyMTFfYmFuZCB7CisJTkw4MDIxMV9CQU5EXzJHSFosCisJTkw4MDIxMV9CQU5EXzVHSFosCit9OworCitlbnVtIG5sODAyMTFfcHNfc3RhdGUgeworCU5MODAyMTFfUFNfRElTQUJMRUQsCisJTkw4MDIxMV9QU19FTkFCTEVELAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfYXR0cl9jcW0gLSBjb25uZWN0aW9uIHF1YWxpdHkgbW9uaXRvciBhdHRyaWJ1dGVzCisgKiBAX19OTDgwMjExX0FUVFJfQ1FNX0lOVkFMSUQ6IGludmFsaWQKKyAqIEBOTDgwMjExX0FUVFJfQ1FNX1JTU0lfVEhPTEQ6IFJTU0kgdGhyZXNob2xkIGluIGRCbS4gVGhpcyB2YWx1ZSBzcGVjaWZpZXMKKyAqCXRoZSB0aHJlc2hvbGQgZm9yIHRoZSBSU1NJIGxldmVsIGF0IHdoaWNoIGFuIGV2ZW50IHdpbGwgYmUgc2VudC4gWmVybworICoJdG8gZGlzYWJsZS4KKyAqIEBOTDgwMjExX0FUVFJfQ1FNX1JTU0lfSFlTVDogUlNTSSBoeXN0ZXJlc2lzIGluIGRCbS4gVGhpcyB2YWx1ZSBzcGVjaWZpZXMKKyAqCXRoZSBtaW5pbXVtIGFtb3VudCB0aGUgUlNTSSBsZXZlbCBtdXN0IGNoYW5nZSBhZnRlciBhbiBldmVudCBiZWZvcmUgYQorICoJbmV3IGV2ZW50IG1heSBiZSBpc3N1ZWQgKHRvIHJlZHVjZSBlZmZlY3RzIG9mIFJTU0kgb3NjaWxsYXRpb24pLgorICogQE5MODAyMTFfQVRUUl9DUU1fUlNTSV9USFJFU0hPTERfRVZFTlQ6IFJTU0kgdGhyZXNob2xkIGV2ZW50CisgKiBATkw4MDIxMV9BVFRSX0NRTV9QS1RfTE9TU19FVkVOVDogYSB1MzIgdmFsdWUgaW5kaWNhdGluZyB0aGF0IHRoaXMgbWFueQorICoJY29uc2VjdXRpdmUgcGFja2V0cyB3ZXJlIG5vdCBhY2tub3dsZWRnZWQgYnkgdGhlIHBlZXIKKyAqIEBfX05MODAyMTFfQVRUUl9DUU1fQUZURVJfTEFTVDogaW50ZXJuYWwKKyAqIEBOTDgwMjExX0FUVFJfQ1FNX01BWDogaGlnaGVzdCBrZXkgYXR0cmlidXRlCisgKi8KK2VudW0gbmw4MDIxMV9hdHRyX2NxbSB7CisJX19OTDgwMjExX0FUVFJfQ1FNX0lOVkFMSUQsCisJTkw4MDIxMV9BVFRSX0NRTV9SU1NJX1RIT0xELAorCU5MODAyMTFfQVRUUl9DUU1fUlNTSV9IWVNULAorCU5MODAyMTFfQVRUUl9DUU1fUlNTSV9USFJFU0hPTERfRVZFTlQsCisJTkw4MDIxMV9BVFRSX0NRTV9QS1RfTE9TU19FVkVOVCwKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9BVFRSX0NRTV9BRlRFUl9MQVNULAorCU5MODAyMTFfQVRUUl9DUU1fTUFYID0gX19OTDgwMjExX0FUVFJfQ1FNX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9jcW1fcnNzaV90aHJlc2hvbGRfZXZlbnQgLSBSU1NJIHRocmVzaG9sZCBldmVudAorICogQE5MODAyMTFfQ1FNX1JTU0lfVEhSRVNIT0xEX0VWRU5UX0xPVzogVGhlIFJTU0kgbGV2ZWwgaXMgbG93ZXIgdGhhbiB0aGUKKyAqICAgICAgY29uZmlndXJlZCB0aHJlc2hvbGQKKyAqIEBOTDgwMjExX0NRTV9SU1NJX1RIUkVTSE9MRF9FVkVOVF9ISUdIOiBUaGUgUlNTSSBpcyBoaWdoZXIgdGhhbiB0aGUKKyAqICAgICAgY29uZmlndXJlZCB0aHJlc2hvbGQKKyAqLworZW51bSBubDgwMjExX2NxbV9yc3NpX3RocmVzaG9sZF9ldmVudCB7CisJTkw4MDIxMV9DUU1fUlNTSV9USFJFU0hPTERfRVZFTlRfTE9XLAorCU5MODAyMTFfQ1FNX1JTU0lfVEhSRVNIT0xEX0VWRU5UX0hJR0gsCit9OworCisKKy8qKgorICogZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgLSBUWCBwb3dlciBhZGp1c3RtZW50CisgKiBATkw4MDIxMV9UWF9QT1dFUl9BVVRPTUFUSUM6IGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHRyYW5zbWl0IHBvd2VyCisgKiBATkw4MDIxMV9UWF9QT1dFUl9MSU1JVEVEOiBsaW1pdCBUWCBwb3dlciBieSB0aGUgbUJtIHBhcmFtZXRlcgorICogQE5MODAyMTFfVFhfUE9XRVJfRklYRUQ6IGZpeCBUWCBwb3dlciB0byB0aGUgbUJtIHBhcmFtZXRlcgorICovCitlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB7CisJTkw4MDIxMV9UWF9QT1dFUl9BVVRPTUFUSUMsCisJTkw4MDIxMV9UWF9QT1dFUl9MSU1JVEVELAorCU5MODAyMTFfVFhfUE9XRVJfRklYRUQsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV93b3dsYW5fcGFja2V0X3BhdHRlcm5fYXR0ciAtIFdvV0xBTiBwYWNrZXQgcGF0dGVybiBhdHRyaWJ1dGUKKyAqIEBfX05MODAyMTFfV09XTEFOX1BLVFBBVF9JTlZBTElEOiBpbnZhbGlkIG51bWJlciBmb3IgbmVzdGVkIGF0dHJpYnV0ZQorICogQE5MODAyMTFfV09XTEFOX1BLVFBBVF9QQVRURVJOOiB0aGUgcGF0dGVybiwgdmFsdWVzIHdoZXJlIHRoZSBtYXNrIGhhcworICoJYSB6ZXJvIGJpdCBhcmUgaWdub3JlZAorICogQE5MODAyMTFfV09XTEFOX1BLVFBBVF9NQVNLOiBwYXR0ZXJuIG1hc2ssIG11c3QgYmUgbG9uZyBlbm91Z2ggdG8gaGF2ZQorICoJYSBiaXQgZm9yIGVhY2ggYnl0ZSBpbiB0aGUgcGF0dGVybi4gVGhlIGxvd2VzdC1vcmRlciBiaXQgY29ycmVzcG9uZHMKKyAqCXRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBwYXR0ZXJuLCBidXQgdGhlIGJ5dGVzIG9mIHRoZSBwYXR0ZXJuIGFyZQorICoJaW4gYSBsaXR0bGUtZW5kaWFuLWxpa2UgZm9ybWF0LCBpLmUuIHRoZSA5dGggYnl0ZSBvZiB0aGUgcGF0dGVybgorICoJY29ycmVzcG9uZHMgdG8gdGhlIGxvd2VzdC1vcmRlciBiaXQgaW4gdGhlIHNlY29uZCBieXRlIG9mIHRoZSBtYXNrLgorICoJRm9yIGV4YW1wbGU6IFRoZSBtYXRjaCAwMDp4eDowMDowMDp4eDowMDowMDowMDowMDp4eDp4eDp4eCAod2hlcmUKKyAqCXh4IGluZGljYXRlcyAiZG9uJ3QgY2FyZSIpIHdvdWxkIGJlIHJlcHJlc2VudGVkIGJ5IGEgcGF0dGVybiBvZgorICoJdHdlbHZlIHplcm8gYnl0ZXMsIGFuZCBhIG1hc2sgb2YgIjB4ZWQsMHgwNyIuCisgKglOb3RlIHRoYXQgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgaXMgZG9uZSBhcyB0aG91Z2ggZnJhbWVzIHdlcmUgbm90CisgKgk4MDIuMTEgZnJhbWVzIGJ1dCA4MDIuMyBmcmFtZXMsIGkuZS4gdGhlIGZyYW1lIGlzIGZ1bGx5IHVucGFja2VkCisgKglmaXJzdCAoaW5jbHVkaW5nIFNOQVAgaGVhZGVyIHVucGFja2luZykgYW5kIHRoZW4gbWF0Y2hlZC4KKyAqIEBOVU1fTkw4MDIxMV9XT1dMQU5fUEtUUEFUOiBudW1iZXIgb2YgYXR0cmlidXRlcworICogQE1BWF9OTDgwMjExX1dPV0xBTl9QS1RQQVQ6IG1heCBhdHRyaWJ1dGUgbnVtYmVyCisgKi8KK2VudW0gbmw4MDIxMV93b3dsYW5fcGFja2V0X3BhdHRlcm5fYXR0ciB7CisJX19OTDgwMjExX1dPV0xBTl9QS1RQQVRfSU5WQUxJRCwKKwlOTDgwMjExX1dPV0xBTl9QS1RQQVRfTUFTSywKKwlOTDgwMjExX1dPV0xBTl9QS1RQQVRfUEFUVEVSTiwKKworCU5VTV9OTDgwMjExX1dPV0xBTl9QS1RQQVQsCisJTUFYX05MODAyMTFfV09XTEFOX1BLVFBBVCA9IE5VTV9OTDgwMjExX1dPV0xBTl9QS1RQQVQgLSAxLAorfTsKKworLyoqCisgKiBzdHJ1Y3Qgbmw4MDIxMV93b3dsYW5fcGF0dGVybl9zdXBwb3J0IC0gcGF0dGVybiBzdXBwb3J0IGluZm9ybWF0aW9uCisgKiBAbWF4X3BhdHRlcm5zOiBtYXhpbXVtIG51bWJlciBvZiBwYXR0ZXJucyBzdXBwb3J0ZWQKKyAqIEBtaW5fcGF0dGVybl9sZW46IG1pbmltdW0gbGVuZ3RoIG9mIGVhY2ggcGF0dGVybgorICogQG1heF9wYXR0ZXJuX2xlbjogbWF4aW11bSBsZW5ndGggb2YgZWFjaCBwYXR0ZXJuCisgKgorICogVGhpcyBzdHJ1Y3QgaXMgY2FycmllZCBpbiAlTkw4MDIxMV9XT1dMQU5fVFJJR19QS1RfUEFUVEVSTiB3aGVuCisgKiB0aGF0IGlzIHBhcnQgb2YgJU5MODAyMTFfQVRUUl9XT1dMQU5fVFJJR0dFUlNfU1VQUE9SVEVEIGluIHRoZQorICogY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiBnaXZlbiBieSB0aGUga2VybmVsIHRvIHVzZXJzcGFjZS4KKyAqLworc3RydWN0IG5sODAyMTFfd293bGFuX3BhdHRlcm5fc3VwcG9ydCB7CisJX191MzIgbWF4X3BhdHRlcm5zOworCV9fdTMyIG1pbl9wYXR0ZXJuX2xlbjsKKwlfX3UzMiBtYXhfcGF0dGVybl9sZW47Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKioKKyAqIGVudW0gbmw4MDIxMV93b3dsYW5fdHJpZ2dlcnMgLSBXb1dMQU4gdHJpZ2dlciBkZWZpbml0aW9ucworICogQF9fTkw4MDIxMV9XT1dMQU5fVFJJR19JTlZBTElEOiBpbnZhbGlkIG51bWJlciBmb3IgbmVzdGVkIGF0dHJpYnV0ZXMKKyAqIEBOTDgwMjExX1dPV0xBTl9UUklHX0FOWTogd2FrZSB1cCBvbiBhbnkgYWN0aXZpdHksIGRvIG5vdCByZWFsbHkgcHV0CisgKgl0aGUgY2hpcCBpbnRvIGEgc3BlY2lhbCBzdGF0ZSAtLSB3b3JrcyBiZXN0IHdpdGggY2hpcHMgdGhhdCBoYXZlCisgKglzdXBwb3J0IGZvciBsb3ctcG93ZXIgb3BlcmF0aW9uIGFscmVhZHkgKGZsYWcpCisgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19ESVNDT05ORUNUOiB3YWtlIHVwIG9uIGRpc2Nvbm5lY3QsIHRoZSB3YXkgZGlzY29ubmVjdAorICoJaXMgZGV0ZWN0ZWQgaXMgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgKGZsYWcpCisgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19NQUdJQ19QS1Q6IHdha2UgdXAgb24gbWFnaWMgcGFja2V0ICg2eCAweGZmLCBmb2xsb3dlZAorICoJYnkgMTYgcmVwZXRpdGlvbnMgb2YgTUFDIGFkZHIsIGFueXdoZXJlIGluIHBheWxvYWQpIChmbGFnKQorICogQE5MODAyMTFfV09XTEFOX1RSSUdfUEtUX1BBVFRFUk46IHdha2UgdXAgb24gdGhlIHNwZWNpZmllZCBwYWNrZXQgcGF0dGVybnMKKyAqCXdoaWNoIGFyZSBwYXNzZWQgaW4gYW4gYXJyYXkgb2YgbmVzdGVkIGF0dHJpYnV0ZXMsIGVhY2ggbmVzdGVkIGF0dHJpYnV0ZQorICoJZGVmaW5pbmcgYSB3aXRoIGF0dHJpYnV0ZXMgZnJvbSAmc3RydWN0IG5sODAyMTFfd293bGFuX3RyaWdfcGt0X3BhdHRlcm4uCisgKglFYWNoIHBhdHRlcm4gZGVmaW5lcyBhIHdha2V1cCBwYWNrZXQuIFRoZSBtYXRjaGluZyBpcyBkb25lIG9uIHRoZSBNU0RVLAorICoJaS5lLiBhcyB0aG91Z2ggdGhlIHBhY2tldCB3YXMgYW4gODAyLjMgcGFja2V0LCBzbyB0aGUgcGF0dGVybiBtYXRjaGluZworICoJaXMgZG9uZSBhZnRlciB0aGUgcGFja2V0IGlzIGNvbnZlcnRlZCB0byB0aGUgTVNEVS4KKyAqCisgKglJbiAlTkw4MDIxMV9BVFRSX1dPV0xBTl9UUklHR0VSU19TVVBQT1JURUQsIGl0IGlzIGEgYmluYXJ5IGF0dHJpYnV0ZQorICoJY2FycnlpbmcgYSAmc3RydWN0IG5sODAyMTFfd293bGFuX3BhdHRlcm5fc3VwcG9ydC4KKyAqIEBOTDgwMjExX1dPV0xBTl9UUklHX0dUS19SRUtFWV9TVVBQT1JURUQ6IE5vdCBhIHJlYWwgdHJpZ2dlciwgYW5kIGNhbm5vdCBiZQorICoJdXNlZCB3aGVuIHNldHRpbmcsIHVzZWQgb25seSB0byBpbmRpY2F0ZSB0aGF0IEdUSyByZWtleWluZyBpcyBzdXBwb3J0ZWQKKyAqCWJ5IHRoZSBkZXZpY2UgKGZsYWcpCisgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19HVEtfUkVLRVlfRkFJTFVSRTogd2FrZSB1cCBvbiBHVEsgcmVrZXkgZmFpbHVyZSAoaWYKKyAqCWRvbmUgYnkgdGhlIGRldmljZSkgKGZsYWcpCisgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19FQVBfSURFTlRfUkVRVUVTVDogd2FrZSB1cCBvbiBFQVAgSWRlbnRpdHkgUmVxdWVzdAorICoJcGFja2V0IChmbGFnKQorICogQE5MODAyMTFfV09XTEFOX1RSSUdfNFdBWV9IQU5EU0hBS0U6IHdha2UgdXAgb24gNC13YXkgaGFuZHNoYWtlIChmbGFnKQorICogQE5MODAyMTFfV09XTEFOX1RSSUdfUkZLSUxMX1JFTEVBU0U6IHdha2UgdXAgd2hlbiByZmtpbGwgaXMgcmVsZWFzZWQKKyAqCShvbiBkZXZpY2VzIHRoYXQgaGF2ZSByZmtpbGwgaW4gdGhlIGRldmljZSkgKGZsYWcpCisgKiBATlVNX05MODAyMTFfV09XTEFOX1RSSUc6IG51bWJlciBvZiB3YWtlIG9uIHdpcmVsZXNzIHRyaWdnZXJzCisgKiBATUFYX05MODAyMTFfV09XTEFOX1RSSUc6IGhpZ2hlc3Qgd293bGFuIHRyaWdnZXIgYXR0cmlidXRlIG51bWJlcgorICovCitlbnVtIG5sODAyMTFfd293bGFuX3RyaWdnZXJzIHsKKwlfX05MODAyMTFfV09XTEFOX1RSSUdfSU5WQUxJRCwKKwlOTDgwMjExX1dPV0xBTl9UUklHX0FOWSwKKwlOTDgwMjExX1dPV0xBTl9UUklHX0RJU0NPTk5FQ1QsCisJTkw4MDIxMV9XT1dMQU5fVFJJR19NQUdJQ19QS1QsCisJTkw4MDIxMV9XT1dMQU5fVFJJR19QS1RfUEFUVEVSTiwKKwlOTDgwMjExX1dPV0xBTl9UUklHX0dUS19SRUtFWV9TVVBQT1JURUQsCisJTkw4MDIxMV9XT1dMQU5fVFJJR19HVEtfUkVLRVlfRkFJTFVSRSwKKwlOTDgwMjExX1dPV0xBTl9UUklHX0VBUF9JREVOVF9SRVFVRVNULAorCU5MODAyMTFfV09XTEFOX1RSSUdfNFdBWV9IQU5EU0hBS0UsCisJTkw4MDIxMV9XT1dMQU5fVFJJR19SRktJTExfUkVMRUFTRSwKKworCS8qIGtlZXAgbGFzdCAqLworCU5VTV9OTDgwMjExX1dPV0xBTl9UUklHLAorCU1BWF9OTDgwMjExX1dPV0xBTl9UUklHID0gTlVNX05MODAyMTFfV09XTEFOX1RSSUcgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9pZmFjZV9saW1pdF9hdHRycyAtIGxpbWl0IGF0dHJpYnV0ZXMKKyAqIEBOTDgwMjExX0lGQUNFX0xJTUlUX1VOU1BFQzogKHJlc2VydmVkKQorICogQE5MODAyMTFfSUZBQ0VfTElNSVRfTUFYOiBtYXhpbXVtIG51bWJlciBvZiBpbnRlcmZhY2VzIHRoYXQKKyAqCWNhbiBiZSBjaG9zZW4gZnJvbSB0aGlzIHNldCBvZiBpbnRlcmZhY2UgdHlwZXMgKHUzMikKKyAqIEBOTDgwMjExX0lGQUNFX0xJTUlUX1RZUEVTOiBuZXN0ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcgYQorICoJZmxhZyBhdHRyaWJ1dGUgZm9yIGVhY2ggaW50ZXJmYWNlIHR5cGUgaW4gdGhpcyBzZXQKKyAqIEBOVU1fTkw4MDIxMV9JRkFDRV9MSU1JVDogbnVtYmVyIG9mIGF0dHJpYnV0ZXMKKyAqIEBNQVhfTkw4MDIxMV9JRkFDRV9MSU1JVDogaGlnaGVzdCBhdHRyaWJ1dGUgbnVtYmVyCisgKi8KK2VudW0gbmw4MDIxMV9pZmFjZV9saW1pdF9hdHRycyB7CisJTkw4MDIxMV9JRkFDRV9MSU1JVF9VTlNQRUMsCisJTkw4MDIxMV9JRkFDRV9MSU1JVF9NQVgsCisJTkw4MDIxMV9JRkFDRV9MSU1JVF9UWVBFUywKKworCS8qIGtlZXAgbGFzdCAqLworCU5VTV9OTDgwMjExX0lGQUNFX0xJTUlULAorCU1BWF9OTDgwMjExX0lGQUNFX0xJTUlUID0gTlVNX05MODAyMTFfSUZBQ0VfTElNSVQgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9pZl9jb21iaW5hdGlvbl9hdHRycyAtLSBpbnRlcmZhY2UgY29tYmluYXRpb24gYXR0cmlidXRlcworICoKKyAqIEBOTDgwMjExX0lGQUNFX0NPTUJfVU5TUEVDOiAocmVzZXJ2ZWQpCisgKiBATkw4MDIxMV9JRkFDRV9DT01CX0xJTUlUUzogTmVzdGVkIGF0dHJpYnV0ZXMgY29udGFpbmluZyB0aGUgbGltaXRzCisgKglmb3IgZ2l2ZW4gaW50ZXJmYWNlIHR5cGVzLCBzZWUgJmVudW0gbmw4MDIxMV9pZmFjZV9saW1pdF9hdHRycy4KKyAqIEBOTDgwMjExX0lGQUNFX0NPTUJfTUFYTlVNOiB1MzIgYXR0cmlidXRlIGdpdmluZyB0aGUgdG90YWwgbnVtYmVyIG9mCisgKglpbnRlcmZhY2VzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgaW4gdGhpcyBncm91cC4gVGhpcyBudW1iZXIgZG9lc24ndAorICoJYXBwbHkgdG8gaW50ZXJmYWNlcyBwdXJlbHkgbWFuYWdlZCBpbiBzb2Z0d2FyZSwgd2hpY2ggYXJlIGxpc3RlZAorICoJaW4gYSBzZXBhcmF0ZSBhdHRyaWJ1dGUgJU5MODAyMTFfQVRUUl9JTlRFUkZBQ0VTX1NPRlRXQVJFLgorICogQE5MODAyMTFfSUZBQ0VfQ09NQl9TVEFfQVBfQklfTUFUQ0g6IGZsYWcgYXR0cmlidXRlIHNwZWNpZnlpbmcgdGhhdAorICoJYmVhY29uIGludGVydmFscyB3aXRoaW4gdGhpcyBncm91cCBtdXN0IGJlIGFsbCB0aGUgc2FtZSBldmVuIGZvcgorICoJaW5mcmFzdHJ1Y3R1cmUgYW5kIEFQL0dPIGNvbWJpbmF0aW9ucywgaS5lLiB0aGUgR08ocykgbXVzdCBhZG9wdAorICoJdGhlIGluZnJhc3RydWN0dXJlIG5ldHdvcmsncyBiZWFjb24gaW50ZXJ2YWwuCisgKiBATkw4MDIxMV9JRkFDRV9DT01CX05VTV9DSEFOTkVMUzogdTMyIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIGhvdyBtYW55CisgKglkaWZmZXJlbnQgY2hhbm5lbHMgbWF5IGJlIHVzZWQgd2l0aGluIHRoaXMgZ3JvdXAuCisgKiBATlVNX05MODAyMTFfSUZBQ0VfQ09NQjogbnVtYmVyIG9mIGF0dHJpYnV0ZXMKKyAqIEBNQVhfTkw4MDIxMV9JRkFDRV9DT01COiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIKKyAqCisgKiBFeGFtcGxlczoKKyAqCWxpbWl0cyA9IFsgI3tTVEF9IDw9IDEsICN7QVB9IDw9IDEgXSwgbWF0Y2hpbmcgQkksIGNoYW5uZWxzID0gMSwgbWF4ID0gMgorICoJPT4gYWxsb3dzIGFuIEFQIGFuZCBhIFNUQSB0aGF0IG11c3QgbWF0Y2ggQklzCisgKgorICoJbnVtYmVycyA9IFsgI3tBUCwgUDJQLUdPfSA8PSA4IF0sIGNoYW5uZWxzID0gMSwgbWF4ID0gOAorICoJPT4gYWxsb3dzIDggb2YgQVAvR08KKyAqCisgKgludW1iZXJzID0gWyAje1NUQX0gPD0gMiBdLCBjaGFubmVscyA9IDIsIG1heCA9IDIKKyAqCT0+IGFsbG93cyB0d28gU1RBcyBvbiBkaWZmZXJlbnQgY2hhbm5lbHMKKyAqCisgKgludW1iZXJzID0gWyAje1NUQX0gPD0gMSwgI3tQMlAtY2xpZW50LFAyUC1HT30gPD0gMyBdLCBtYXggPSA0CisgKgk9PiBhbGxvd3MgYSBTVEEgcGx1cyB0aHJlZSBQMlAgaW50ZXJmYWNlcworICoKKyAqIFRoZSBsaXN0IG9mIHRoZXNlIGZvdXIgcG9zc2libGl0aWVzIGNvdWxkIGNvbXBsZXRlbHkgYmUgY29udGFpbmVkCisgKiB3aXRoaW4gdGhlICVOTDgwMjExX0FUVFJfSU5URVJGQUNFX0NPTUJJTkFUSU9OUyBhdHRyaWJ1dGUgdG8gaW5kaWNhdGUKKyAqIHRoYXQgYW55IG9mIHRoZXNlIGdyb3VwcyBtdXN0IG1hdGNoLgorICoKKyAqICJDb21iaW5hdGlvbnMiIG9mIGp1c3QgYSBzaW5nbGUgaW50ZXJmYWNlIHdpbGwgbm90IGJlIGxpc3RlZCBoZXJlLAorICogYSBzaW5nbGUgaW50ZXJmYWNlIG9mIGFueSB2YWxpZCBpbnRlcmZhY2UgdHlwZSBpcyBhc3N1bWVkIHRvIGFsd2F5cworICogYmUgcG9zc2libGUgYnkgaXRzZWxmLiBUaGlzIG1lYW5zIHRoYXQgaW1wbGljaXRseSwgZm9yIGVhY2ggdmFsaWQKKyAqIGludGVyZmFjZSB0eXBlLCB0aGUgZm9sbG93aW5nIGdyb3VwIGFsd2F5cyBleGlzdHM6CisgKgludW1iZXJzID0gWyAjezx0eXBlPn0gPD0gMSBdLCBjaGFubmVscyA9IDEsIG1heCA9IDEKKyAqLworZW51bSBubDgwMjExX2lmX2NvbWJpbmF0aW9uX2F0dHJzIHsKKwlOTDgwMjExX0lGQUNFX0NPTUJfVU5TUEVDLAorCU5MODAyMTFfSUZBQ0VfQ09NQl9MSU1JVFMsCisJTkw4MDIxMV9JRkFDRV9DT01CX01BWE5VTSwKKwlOTDgwMjExX0lGQUNFX0NPTUJfU1RBX0FQX0JJX01BVENILAorCU5MODAyMTFfSUZBQ0VfQ09NQl9OVU1fQ0hBTk5FTFMsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlOVU1fTkw4MDIxMV9JRkFDRV9DT01CLAorCU1BWF9OTDgwMjExX0lGQUNFX0NPTUIgPSBOVU1fTkw4MDIxMV9JRkFDRV9DT01CIC0gMQorfTsKKworCisvKioKKyAqIGVudW0gbmw4MDIxMV9wbGlua19zdGF0ZSAtIHN0YXRlIG9mIGEgbWVzaCBwZWVyIGxpbmsgZmluaXRlIHN0YXRlIG1hY2hpbmUKKyAqCisgKiBATkw4MDIxMV9QTElOS19MSVNURU46IGluaXRpYWwgc3RhdGUsIGNvbnNpZGVyZWQgdGhlIGltcGxpY2l0CisgKglzdGF0ZSBvZiBub24gZXhpc3RhbnQgbWVzaCBwZWVyIGxpbmtzCisgKiBATkw4MDIxMV9QTElOS19PUE5fU05UOiBtZXNoIHBsaW5rIG9wZW4gZnJhbWUgaGFzIGJlZW4gc2VudCB0bworICoJdGhpcyBtZXNoIHBlZXIKKyAqIEBOTDgwMjExX1BMSU5LX09QTl9SQ1ZEOiBtZXNoIHBsaW5rIG9wZW4gZnJhbWUgaGFzIGJlZW4gcmVjZWl2ZWQKKyAqCWZyb20gdGhpcyBtZXNoIHBlZXIKKyAqIEBOTDgwMjExX1BMSU5LX0NORl9SQ1ZEOiBtZXNoIHBsaW5rIGNvbmZpcm0gZnJhbWUgaGFzIGJlZW4KKyAqCXJlY2VpdmVkIGZyb20gdGhpcyBtZXNoIHBlZXIKKyAqIEBOTDgwMjExX1BMSU5LX0VTVEFCOiBtZXNoIHBlZXIgbGluayBpcyBlc3RhYmxpc2hlZAorICogQE5MODAyMTFfUExJTktfSE9MRElORzogbWVzaCBwZWVyIGxpbmsgaXMgYmVpbmcgY2xvc2VkIG9yIGNhbmNlbGxlZAorICogQE5MODAyMTFfUExJTktfQkxPQ0tFRDogYWxsIGZyYW1lcyB0cmFuc21pdHRlZCBmcm9tIHRoaXMgbWVzaAorICoJcGxpbmsgYXJlIGRpc2NhcmRlZAorICogQE5VTV9OTDgwMjExX1BMSU5LX1NUQVRFUzogbnVtYmVyIG9mIHBlZXIgbGluayBzdGF0ZXMKKyAqIEBNQVhfTkw4MDIxMV9QTElOS19TVEFURVM6IGhpZ2hlc3QgbnVtZXJpY2FsIHZhbHVlIG9mIHBsaW5rIHN0YXRlcworICovCitlbnVtIG5sODAyMTFfcGxpbmtfc3RhdGUgeworCU5MODAyMTFfUExJTktfTElTVEVOLAorCU5MODAyMTFfUExJTktfT1BOX1NOVCwKKwlOTDgwMjExX1BMSU5LX09QTl9SQ1ZELAorCU5MODAyMTFfUExJTktfQ05GX1JDVkQsCisJTkw4MDIxMV9QTElOS19FU1RBQiwKKwlOTDgwMjExX1BMSU5LX0hPTERJTkcsCisJTkw4MDIxMV9QTElOS19CTE9DS0VELAorCisJLyoga2VlcCBsYXN0ICovCisJTlVNX05MODAyMTFfUExJTktfU1RBVEVTLAorCU1BWF9OTDgwMjExX1BMSU5LX1NUQVRFUyA9IE5VTV9OTDgwMjExX1BMSU5LX1NUQVRFUyAtIDEKK307CisKKyNkZWZpbmUgTkw4MDIxMV9LQ0tfTEVOCQkJMTYKKyNkZWZpbmUgTkw4MDIxMV9LRUtfTEVOCQkJMTYKKyNkZWZpbmUgTkw4MDIxMV9SRVBMQVlfQ1RSX0xFTgkJOAorCisvKioKKyAqIGVudW0gbmw4MDIxMV9yZWtleV9kYXRhIC0gYXR0cmlidXRlcyBmb3IgR1RLIHJla2V5IG9mZmxvYWQKKyAqIEBfX05MODAyMTFfUkVLRVlfREFUQV9JTlZBTElEOiBpbnZhbGlkIG51bWJlciBmb3IgbmVzdGVkIGF0dHJpYnV0ZXMKKyAqIEBOTDgwMjExX1JFS0VZX0RBVEFfS0VLOiBrZXkgZW5jcnlwdGlvbiBrZXkgKGJpbmFyeSkKKyAqIEBOTDgwMjExX1JFS0VZX0RBVEFfS0NLOiBrZXkgY29uZmlybWF0aW9uIGtleSAoYmluYXJ5KQorICogQE5MODAyMTFfUkVLRVlfREFUQV9SRVBMQVlfQ1RSOiByZXBsYXkgY291bnRlciAoYmluYXJ5KQorICogQE5VTV9OTDgwMjExX1JFS0VZX0RBVEE6IG51bWJlciBvZiByZWtleSBhdHRyaWJ1dGVzIChpbnRlcm5hbCkKKyAqIEBNQVhfTkw4MDIxMV9SRUtFWV9EQVRBOiBoaWdoZXN0IHJla2V5IGF0dHJpYnV0ZSAoaW50ZXJuYWwpCisgKi8KK2VudW0gbmw4MDIxMV9yZWtleV9kYXRhIHsKKwlfX05MODAyMTFfUkVLRVlfREFUQV9JTlZBTElELAorCU5MODAyMTFfUkVLRVlfREFUQV9LRUssCisJTkw4MDIxMV9SRUtFWV9EQVRBX0tDSywKKwlOTDgwMjExX1JFS0VZX0RBVEFfUkVQTEFZX0NUUiwKKworCS8qIGtlZXAgbGFzdCAqLworCU5VTV9OTDgwMjExX1JFS0VZX0RBVEEsCisJTUFYX05MODAyMTFfUkVLRVlfREFUQSA9IE5VTV9OTDgwMjExX1JFS0VZX0RBVEEgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9oaWRkZW5fc3NpZCAtIHZhbHVlcyBmb3IgJU5MODAyMTFfQVRUUl9ISURERU5fU1NJRAorICogQE5MODAyMTFfSElEREVOX1NTSURfTk9UX0lOX1VTRTogZG8gbm90IGhpZGUgU1NJRCAoaS5lLiwgYnJvYWRjYXN0IGl0IGluCisgKglCZWFjb24gZnJhbWVzKQorICogQE5MODAyMTFfSElEREVOX1NTSURfWkVST19MRU46IGhpZGUgU1NJRCBieSB1c2luZyB6ZXJvLWxlbmd0aCBTU0lEIGVsZW1lbnQKKyAqCWluIEJlYWNvbiBmcmFtZXMKKyAqIEBOTDgwMjExX0hJRERFTl9TU0lEX1pFUk9fQ09OVEVOVFM6IGhpZGUgU1NJRCBieSB1c2luZyBjb3JyZWN0IGxlbmd0aCBvZiBTU0lECisgKgllbGVtZW50IGluIEJlYWNvbiBmcmFtZXMgYnV0IHplcm8gb3V0IGVhY2ggYnl0ZSBpbiB0aGUgU1NJRAorICovCitlbnVtIG5sODAyMTFfaGlkZGVuX3NzaWQgeworCU5MODAyMTFfSElEREVOX1NTSURfTk9UX0lOX1VTRSwKKwlOTDgwMjExX0hJRERFTl9TU0lEX1pFUk9fTEVOLAorCU5MODAyMTFfSElEREVOX1NTSURfWkVST19DT05URU5UUworfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfc3RhX3dtZV9hdHRyIC0gc3RhdGlvbiBXTUUgYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9TVEFfV01FX0lOVkFMSUQ6IGludmFsaWQgbnVtYmVyIGZvciBuZXN0ZWQgYXR0cmlidXRlCisgKiBATkw4MDIxMV9TVEFfV01FX1VBUFNEX1FVRVVFUzogYml0bWFwIG9mIHVhcHNkIHF1ZXVlcy4gdGhlIGZvcm1hdAorICoJaXMgdGhlIHNhbWUgYXMgdGhlIEFDIGJpdG1hcCBpbiB0aGUgUW9TIGluZm8gZmllbGQuCisgKiBATkw4MDIxMV9TVEFfV01FX01BWF9TUDogbWF4IHNlcnZpY2UgcGVyaW9kLiB0aGUgZm9ybWF0IGlzIHRoZSBzYW1lCisgKglhcyB0aGUgTUFYX1NQIGZpZWxkIGluIHRoZSBRb1MgaW5mbyBmaWVsZCAoYnV0IGFscmVhZHkgc2hpZnRlZCBkb3duKS4KKyAqIEBfX05MODAyMTFfU1RBX1dNRV9BRlRFUl9MQVNUOiBpbnRlcm5hbAorICogQE5MODAyMTFfU1RBX1dNRV9NQVg6IGhpZ2hlc3Qgc3RhdGlvbiBXTUUgYXR0cmlidXRlCisgKi8KK2VudW0gbmw4MDIxMV9zdGFfd21lX2F0dHIgeworCV9fTkw4MDIxMV9TVEFfV01FX0lOVkFMSUQsCisJTkw4MDIxMV9TVEFfV01FX1VBUFNEX1FVRVVFUywKKwlOTDgwMjExX1NUQV9XTUVfTUFYX1NQLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX1NUQV9XTUVfQUZURVJfTEFTVCwKKwlOTDgwMjExX1NUQV9XTUVfTUFYID0gX19OTDgwMjExX1NUQV9XTUVfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3Bta3NhX2NhbmRpZGF0ZV9hdHRyIC0gYXR0cmlidXRlcyBmb3IgUE1LU0EgY2FjaGluZyBjYW5kaWRhdGVzCisgKiBAX19OTDgwMjExX1BNS1NBX0NBTkRJREFURV9JTlZBTElEOiBpbnZhbGlkIG51bWJlciBmb3IgbmVzdGVkIGF0dHJpYnV0ZXMKKyAqIEBOTDgwMjExX1BNS1NBX0NBTkRJREFURV9JTkRFWDogY2FuZGlkYXRlIGluZGV4ICh1MzI7IHRoZSBzbWFsbGVyLCB0aGUgaGlnaGVyCisgKglwcmlvcml0eSkKKyAqIEBOTDgwMjExX1BNS1NBX0NBTkRJREFURV9CU1NJRDogY2FuZGlkYXRlIEJTU0lEICg2IG9jdGV0cykKKyAqIEBOTDgwMjExX1BNS1NBX0NBTkRJREFURV9QUkVBVVRIOiBSU04gcHJlLWF1dGhlbnRpY2F0aW9uIHN1cHBvcnRlZCAoZmxhZykKKyAqIEBOVU1fTkw4MDIxMV9QTUtTQV9DQU5ESURBVEU6IG51bWJlciBvZiBQTUtTQSBjYWNoaW5nIGNhbmRpZGF0ZSBhdHRyaWJ1dGVzCisgKgkoaW50ZXJuYWwpCisgKiBATUFYX05MODAyMTFfUE1LU0FfQ0FORElEQVRFOiBoaWdoZXN0IFBNS1NBIGNhY2hpbmcgY2FuZGlkYXRlIGF0dHJpYnV0ZQorICoJKGludGVybmFsKQorICovCitlbnVtIG5sODAyMTFfcG1rc2FfY2FuZGlkYXRlX2F0dHIgeworCV9fTkw4MDIxMV9QTUtTQV9DQU5ESURBVEVfSU5WQUxJRCwKKwlOTDgwMjExX1BNS1NBX0NBTkRJREFURV9JTkRFWCwKKwlOTDgwMjExX1BNS1NBX0NBTkRJREFURV9CU1NJRCwKKwlOTDgwMjExX1BNS1NBX0NBTkRJREFURV9QUkVBVVRILAorCisJLyoga2VlcCBsYXN0ICovCisJTlVNX05MODAyMTFfUE1LU0FfQ0FORElEQVRFLAorCU1BWF9OTDgwMjExX1BNS1NBX0NBTkRJREFURSA9IE5VTV9OTDgwMjExX1BNS1NBX0NBTkRJREFURSAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3RkbHNfb3BlcmF0aW9uIC0gdmFsdWVzIGZvciAlTkw4MDIxMV9BVFRSX1RETFNfT1BFUkFUSU9OCisgKiBATkw4MDIxMV9URExTX0RJU0NPVkVSWV9SRVE6IFNlbmQgYSBURExTIGRpc2NvdmVyeSByZXF1ZXN0CisgKiBATkw4MDIxMV9URExTX1NFVFVQOiBTZXR1cCBURExTIGxpbmsKKyAqIEBOTDgwMjExX1RETFNfVEVBUkRPV046IFRlYXJkb3duIGEgVERMUyBsaW5rIHdoaWNoIGlzIGFscmVhZHkgZXN0YWJsaXNoZWQKKyAqIEBOTDgwMjExX1RETFNfRU5BQkxFX0xJTks6IEVuYWJsZSBURExTIGxpbmsKKyAqIEBOTDgwMjExX1RETFNfRElTQUJMRV9MSU5LOiBEaXNhYmxlIFRETFMgbGluaworICovCitlbnVtIG5sODAyMTFfdGRsc19vcGVyYXRpb24geworCU5MODAyMTFfVERMU19ESVNDT1ZFUllfUkVRLAorCU5MODAyMTFfVERMU19TRVRVUCwKKwlOTDgwMjExX1RETFNfVEVBUkRPV04sCisJTkw4MDIxMV9URExTX0VOQUJMRV9MSU5LLAorCU5MODAyMTFfVERMU19ESVNBQkxFX0xJTkssCit9OworCisjZW5kaWYgLyogX19MSU5VWF9OTDgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbnVidXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbnVidXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGIwM2U0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9udWJ1cy5oCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICBudWJ1cy5oOiB2YXJpb3VzIGRlZmluaXRpb25zIGFuZCBwcm90b3R5cGVzIGZvciBOdUJ1cyBkcml2ZXJzIHRvIHVzZS4KKworICBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxhbiBDb3guCisKKyAgSGFja2VkIHRvIGRlYXRoIGJ5IEMuIFNjb3R0IEFuYW5pYW4gYW5kIERhdmlkIEh1Z2dpbnMtRGFpbmVzLgorICAKKyAgU29tZSBvZiB0aGUgY29uc3RhbnRzIGluIGhlcmUgYXJlIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcKKyAgTmV0QlNEL09wZW5CU0QgaGVhZGVyIGZpbGUsIGJ5IEFsbGVuIEJyaWdncy4gIFdlIGZpZ3VyZWQgb3V0IHRoZQorICByZXN0IG9mIHRoZW0gb24gb3VyIG93bi4gKi8KKworI2lmbmRlZiBMSU5VWF9OVUJVU19ICisjZGVmaW5lIExJTlVYX05VQlVTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0gbnVidXNfY2F0ZWdvcnkgeworCU5VQlVTX0NBVF9CT0FSRCAgICAgICAgICA9IDB4MDAwMSwKKwlOVUJVU19DQVRfRElTUExBWSAgICAgICAgPSAweDAwMDMsCisJTlVCVVNfQ0FUX05FVFdPUksgICAgICAgID0gMHgwMDA0LAorCU5VQlVTX0NBVF9DT01NVU5JQ0FUSU9OUyA9IDB4MDAwNiwKKwlOVUJVU19DQVRfRk9OVCAgICAgICAgICAgPSAweDAwMDksCisJTlVCVVNfQ0FUX0NQVSAgICAgICAgICAgID0gMHgwMDBBLAorCS8qIEZvciBsYWNrIG9mIGEgYmV0dGVyIG5hbWUgKi8KKwlOVUJVU19DQVRfRFVPRE9DSyAgICAgICAgPSAweDAwMjAKK307CisKK2VudW0gbnVidXNfdHlwZV9uZXR3b3JrIHsKKwlOVUJVU19UWVBFX0VUSEVSTkVUICAgICAgPSAweDAwMDEsCisJTlVCVVNfVFlQRV9SUzIzMiAgICAgICAgID0gMHgwMDAyCit9OworCitlbnVtIG51YnVzX3R5cGVfZGlzcGxheSB7CisJTlVCVVNfVFlQRV9WSURFTyAgICAgICAgID0gMHgwMDAxCit9OworCitlbnVtIG51YnVzX3R5cGVfY3B1IHsKKwlOVUJVU19UWVBFXzY4MDIwICAgICAgICAgPSAweDAwMDMsCisJTlVCVVNfVFlQRV82ODAzMCAgICAgICAgID0gMHgwMDA0LAorCU5VQlVTX1RZUEVfNjgwNDAgICAgICAgICA9IDB4MDAwNQorfTsKKworLyogS25vd24gPENhdCxUeXBlLFNXLEhXPiB0dXBsZXM6IChhY2NvcmRpbmcgdG8gVGF0dGxlVGVjaCBhbmQgU2xvdHMpCisgKiAgNjgwMzAgbW90aGVyYm9hcmRzOiA8MTAsNCwwLDI0PgorICogIDY4MDQwIG1vdGhlcmJvYXJkczogPDEwLDUsMCwyND4KKyAqICBEdW9Eb2NrIFBsdXM6IDwzMiwxLDEsMj4KKyAqCisgKiAgVG9ieSBGcmFtZSBCdWZmZXIgY2FyZDogPDMsMSwxLDE+CisgKiAgUkJWIGJ1aWx0LWluIHZpZGVvIChJSWNpKTogPDMsMSwxLDI0PgorICogIFZhbGt5cmllIGJ1aWx0LWluIHZpZGVvIChRNjMwKTogPDMsMSwxLDQ2PgorICogIE1hY2ludG9zaCBEaXNwbGF5IENhcmQ6IDwzLDEsMSwyNT4KKyAqICBTb25vcmEgYnVpbHQtaW4gdmlkZW8gKFA0NjApOiA8MywxLDEsMzQ+CisgKiAgSmV0IGZyYW1lYnVmZmVyIChEdW9Eb2NrIFBsdXMpOiA8MywxLDEsNDE+CisgKgorICogIFNPTklDIGNvbW0tc2xvdC9vbi1ib2FyZCBhbmQgRHVvRG9jayBFdGhlcm5ldDogPDQsMSwxLDI3Mj4KKyAqICBTT05JQyBMQy1QRFMgRXRoZXJuZXQgKERheW5hLCBidXQgbGlrZSBBcHBsZSAxNi1iaXQsIHNvcnQgb2YpOiA8NCwxLDEsMjcxPgorICogIEFwcGxlIFNPTklDIExDLVBEUyBFdGhlcm5ldCAoIkFwcGxlIEV0aGVybmV0IExDIFR3aXN0ZWQtUGFpciBDYXJkIik6IDw0LDEsMCwyODE+CisgKiAgU29uaWMgU3lzdGVtcyBFdGhlcm5ldCBBLVNlcmllcyBDYXJkOiA8NCwxLDI2OCwyNTY+CisgKiAgQXNhbnRlIE1hY0NvbiBOdUJ1cy1BOiA8NCwxLDI2MCwyNTY+IChhbHBoYS0xLjAsMS4xIHJldmlzaW9uKQorICogICBST00gb24gdGhlIGFib3ZlIGNhcmQ6IDwyLDEsMCwwPgorICogIENhYmxldHJvbiBldGhlcm5ldCBjYXJkOiA8NCwxLDEsMjY1PgorICogIEZhcmFsbG9uIGV0aGVybmV0IGNhcmQ6IDw0LDEsMjY4LDI1Nj4gKGlkZW50aWNhbCB0byBTb25pYyBTeXN0ZW1zIGNhcmQpCisgKiAgS2luZXRpY3MgRXRoZXJQb3J0IElJTjogPDQsMSwyNTksMjYyPgorICogIEFQSSBFbmdpbmVlcmluZyBFdGhlclJ1bl9MQ2EgUERTIGVuZXQgY2FyZDogPDQsMSwyODIsMjU2PgorICoKKyAqICBBZGQgeW91ciBkZXZpY2VzIHRvIHRoZSBsaXN0ISAgWW91IGNhbiBvYnRhaW4gdGhlICJTbG90cyIgdXRpbGl0eQorICogIGZyb20gQXBwbGUncyBGVFAgc2l0ZSBhdDoKKyAqICBmdHA6Ly9kZXYuYXBwbGUuY29tL2RldndvcmxkL1Rvb2xfQ2hlc3QvRGV2aWNlc18tX0hhcmR3YXJlL051QnVzX1Nsb3RfTWFuYWdlci8KKyAqCisgKiAgQWx0ZXJuYXRlbHksIFRhdHRsZVRlY2ggY2FuIGJlIGZvdW5kIGF0IGFueSBJbmZvLU1hYyBtaXJyb3Igc2l0ZS4gIAorICogIG9yIGZyb20gaXRzIGRpc3RyaWJ1dGlvbiBzaXRlOiBmdHA6Ly9mdHAuZGVjaXNta3IuY29tL2RtcworICovCisKKy8qIERyU1c6IFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHNvZnR3YXJlIGludGVyZmFjZSB0byBhIGJvYXJkLiAgVGhpcworICAgaXMgdXN1YWxseSB0aGUgb25lIHlvdSB3YW50IHRvIGxvb2sgYXQgd2hlbiB3cml0aW5nIGEgZHJpdmVyLiAgSXQncworICAgbm90IGFzIHVzZWZ1bCBhcyB5b3UgdGhpbmssIHRob3VnaCwgYmVjYXVzZSBhcyB3ZSBzaG91bGQga25vdyBieQorICAgbm93IChkdWgpLCAiQXBwbGUgQ29tcGF0aWJsZSIgY2FuIG1lYW4gYSBsb3Qgb2YgdGhpbmdzLi4uICovCisKKy8qIEFkZCBrbm93biBEclNXIHZhbHVlcyBoZXJlICovCitlbnVtIG51YnVzX2Ryc3cgeworCS8qIE5VQlVTX0NBVF9ESVNQTEFZICovCisJTlVCVVNfRFJTV19BUFBMRSAgICAgICAgPSAweDAwMDEsCisJTlVCVVNfRFJTV19BUFBMRV9ISVJFUyAgPSAweDAwMTMsIC8qIE1hY0lJIEhpUmVzIGNhcmQgZHJpdmVyICovCisJCisJLyogTlVCVVNfQ0FUX05FVFdPUksgKi8KKwlOVUJVU19EUlNXXzNDT00gICAgICAgICA9IDB4MDAwMCwKKwlOVUJVU19EUlNXX0NBQkxFVFJPTiAgICA9IDB4MDAwMSwKKwlOVUJVU19EUlNXX1NPTklDX0xDICAgICA9IDB4MDAwMSwKKwlOVUJVU19EUlNXX0tJTkVUSUNTICAgICA9IDB4MDEwMywKKwlOVUJVU19EUlNXX0FTQU5URSAgICAgICA9IDB4MDEwNCwKKwlOVUJVU19EUlNXX1RFQ0hXT1JLUyAgICA9IDB4MDEwOSwKKwlOVUJVU19EUlNXX0RBWU5BICAgICAgICA9IDB4MDEwYiwKKwlOVUJVU19EUlNXX0ZBUkFMTE9OICAgICA9IDB4MDEwYywKKwlOVUJVU19EUlNXX0FQUExFX1NOICAgICA9IDB4MDEwZiwKKwlOVUJVU19EUlNXX0RBWU5BMiAgICAgICA9IDB4MDExNSwKKwlOVUJVU19EUlNXX0ZPQ1VTICAgICAgICA9IDB4MDExYSwKKwlOVUJVU19EUlNXX0FTQU5URV9DUyAgICA9IDB4MDExZCwgLyogdXNlIGFzYW50ZSBTTUM5MTk0IGRyaXZlciAqLworCU5VQlVTX0RSU1dfREFZTkFfTEMgICAgID0gMHgwMTFlLAorCisJLyogTlVCVVNfQ0FUX0NQVSAqLworCU5VQlVTX0RSU1dfTk9ORSAgICAgICAgID0gMHgwMDAwLAorfTsKKworLyogRHJIVzogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGEgYm9hcmQgKG9yIGF0CisgICBsZWFzdCwgaXQgc2hvdWxkLi4uICBzb21lIHZpZGVvIGNhcmRzIGFyZSBrbm93biB0byBpbmNvcnJlY3RseQorICAgaWRlbnRpZnkgdGhlbXNlbHZlcyBhcyBUb2J5IGNhcmRzKSAqLworCisvKiBBZGQga25vd24gRHJIVyB2YWx1ZXMgaGVyZSAqLworZW51bSBudWJ1c19kcmh3IHsKKwkvKiBOVUJVU19DQVRfRElTUExBWSAqLworCU5VQlVTX0RSSFdfQVBQTEVfVEZCICAgICAgPSAweDAwMDEsIC8qIFRvYnkgZnJhbWUgYnVmZmVyIGNhcmQgKi8KKwlOVUJVU19EUkhXX0FQUExFX1dWQyAgICAgID0gMHgwMDA2LCAvKiBBcHBsZSBXb3Jrc3RhdGlvbiBWaWRlbyBDYXJkICovCisJTlVCVVNfRFJIV19TSUdNQV9DTFJNQVggICA9IDB4MDAwNywgLyogU2lnbWEgRGVzaWduIENvbG9yTWF4ICovCisJTlVCVVNfRFJIV19BUFBMRV9TRTMwICAgICA9IDB4MDAwOSwgLyogQXBwbGUgU0UvMzAgdmlkZW8gKi8KKwlOVUJVU19EUkhXX0FQUExFX0hSVkMgICAgID0gMHgwMDEzLCAvKiBNYWMgSUkgSGlnaC1SZXMgVmlkZW8gQ2FyZCAqLworCU5VQlVTX0RSSFdfQVBQTEVfUFZDICAgICAgPSAweDAwMTcsIC8qIE1hYyBJSSBQb3J0cmFpdCBWaWRlbyBDYXJkICovCisJTlVCVVNfRFJIV19BUFBMRV9SQlYxICAgICA9IDB4MDAxOCwgLyogSUljaSBSQlYgdmlkZW8gKi8KKwlOVUJVU19EUkhXX0FQUExFX01EQyAgICAgID0gMHgwMDE5LCAvKiBNYWNpbnRvc2ggRGlzcGxheSBDYXJkICovCisJTlVCVVNfRFJIV19BUFBMRV9TT05PUkEgICA9IDB4MDAyMiwgLyogU29ub3JhIGJ1aWx0LWluIHZpZGVvICovCisJTlVCVVNfRFJIV19BUFBMRV8yNEFDICAgICA9IDB4MDAyYiwgLyogTWFjIDI0QUMgVmlkZW8gQ2FyZCAqLworCU5VQlVTX0RSSFdfQVBQTEVfVkFMS1lSSUUgPSAweDAwMmUsCisJTlVCVVNfRFJIV19BUFBMRV9KRVQgICAgICA9IDB4MDAyOSwgLyogSmV0IGZyYW1lYnVmZmVyIChEdW9Eb2NrKSAqLworCU5VQlVTX0RSSFdfU01BQ19HRlggICAgICAgPSAweDAxMDUsIC8qIFN1cGVyTWFjIEdGWCAqLworCU5VQlVTX0RSSFdfUkFTVEVSX0NCMjY0ICAgPSAweDAxM0IsIC8qIFJhc3Rlck9wcyBDb2xvckJvYXJkIDI2NCAqLworCU5VQlVTX0RSSFdfTUlDUk9OX1hDRUVEICAgPSAweDAxNDYsIC8qIE1pY3JvbiBFeGNlZWQgY29sb3IgKi8KKwlOVUJVU19EUkhXX1JESVVTX0dTQyAgICAgID0gMHgwMTUzLCAvKiBSYWRpdXMgR1MvQyAqLworCU5VQlVTX0RSSFdfU01BQ19TUEVDOCAgICAgPSAweDAxN0IsIC8qIFN1cGVyTWFjIFNwZWN0cnVtLzggKi8KKwlOVUJVU19EUkhXX1NNQUNfU1BFQzI0ICAgID0gMHgwMTdDLCAvKiBTdXBlck1hYyBTcGVjdHJ1bS8yNCAqLworCU5VQlVTX0RSSFdfUkFTVEVSX0NCMzY0ICAgPSAweDAyNkYsIC8qIFJhc3Rlck9wcyBDb2xvckJvYXJkIDM2NCAqLworCU5VQlVTX0RSSFdfUkRJVVNfRENHWCAgICAgPSAweDAyN0MsIC8qIFJhZGl1cyBEaXJlY3RDb2xvci9HWCAqLworCU5VQlVTX0RSSFdfUkRJVVNfUEM4ICAgICAgPSAweDAyOTEsIC8qIFJhZGl1cyBQcmVjaXNpb25Db2xvciA4ICovCisJTlVCVVNfRFJIV19MQVBJU19QQ1M4ICAgICA9IDB4MDI5MiwgLyogTGFwaXMgUHJvQ29sb3JTZXJ2ZXIgOCAqLworCU5VQlVTX0RSSFdfUkFTVEVSXzI0WExJICAgPSAweDAyQTAsIC8qIFJhc3Rlck9wcyA4LzI0IFhMaSAqLworCU5VQlVTX0RSSFdfUkFTVEVSX1BCUEdUICAgPSAweDAyQTUsIC8qIFJhc3Rlck9wcyBQYWludEJvYXJkIFByaXNtIEdUICovCisJTlVCVVNfRFJIV19FTUFDSF9GU1ggICAgICA9IDB4MDJBRSwgLyogRS1NYWNoaW5lcyBGdXR1cmEgU1ggKi8KKwlOVUJVU19EUkhXX1JBU1RFUl8yNFhMVFYgID0gMHgwMkI3LCAvKiBSYXN0ZXJPcHMgMjRYTFRWICovCisJTlVCVVNfRFJIV19TTUFDX1RIVU5EMjQgICA9IDB4MDJDQiwgLyogU3VwZXJNYWMgVGh1bmRlci8yNCAqLworCU5VQlVTX0RSSFdfU01BQ19USFVORExHSFQgPSAweDAzRDksIC8qIFN1cGVyTWFjIFRodW5kZXJMaWdodCAqLworCU5VQlVTX0RSSFdfUkRJVVNfUEMyNFhQICAgPSAweDA0MDYsIC8qIFJhZGl1cyBQcmVjaXNpb25Db2xvciAyNFhwICovCisJTlVCVVNfRFJIV19SRElVU19QQzI0WCAgICA9IDB4MDQwQSwgLyogUmFkaXVzIFByZWNpc2lvbkNvbG9yIDI0WCAqLworCU5VQlVTX0RSSFdfUkRJVVNfUEM4WEogICAgPSAweDA0MEIsIC8qIFJhZGl1cyBQcmVjaXNpb25Db2xvciA4WEogKi8KKwkKKwkvKiBOVUJVU19DQVRfTkVUV09SSyAqLworCU5VQlVTX0RSSFdfSU5URVJMQU4gICAgICAgPSAweDAxMDAsCisJTlVCVVNfRFJIV19TTUM5MTk0ICAgICAgICA9IDB4MDEwMSwKKwlOVUJVU19EUkhXX0tJTkVUSUNTICAgICAgID0gMHgwMTA2LAorCU5VQlVTX0RSSFdfQ0FCTEVUUk9OICAgICAgPSAweDAxMDksCisJTlVCVVNfRFJIV19BU0FOVEVfTEMgICAgICA9IDB4MDEwZiwKKwlOVUJVU19EUkhXX1NPTklDICAgICAgICAgID0gMHgwMTEwLAorCU5VQlVTX0RSSFdfVEVDSFdPUktTICAgICAgPSAweDAxMTIsCisJTlVCVVNfRFJIV19BUFBMRV9TT05JQ19OQiA9IDB4MDExOCwKKwlOVUJVU19EUkhXX0FQUExFX1NPTklDX0xDID0gMHgwMTE5LAorCU5VQlVTX0RSSFdfRk9DVVMgICAgICAgICAgPSAweDAxMWMsCisJTlVCVVNfRFJIV19TT05ORVQgICAgICAgICA9IDB4MDExZCwKK307CisKKy8qIFJlc291cmNlIElEczogVGhlc2UgYXJlIHRoZSBpZGVudGlmaWVycyBmb3IgdGhlIHZhcmlvdXMgd2VpcmQgYW5kCisgICB3b25kZXJmdWwgdGlkYml0cyBvZiBpbmZvcm1hdGlvbiB0aGF0IG1heSBvciBtYXkgbm90IHJlc2lkZSBpbiB0aGUKKyAgIE51QnVzIFJPTSBkaXJlY3RvcnkuICovCitlbnVtIG51YnVzX3Jlc19pZCB7CisJTlVCVVNfUkVTSURfVFlQRSAgICAgICAgID0gMHgwMDAxLAorCU5VQlVTX1JFU0lEX05BTUUgICAgICAgICA9IDB4MDAwMiwKKwlOVUJVU19SRVNJRF9JQ09OICAgICAgICAgPSAweDAwMDMsCisJTlVCVVNfUkVTSURfRFJWUkRJUiAgICAgID0gMHgwMDA0LAorCU5VQlVTX1JFU0lEX0xPQURSRUMgICAgICA9IDB4MDAwNSwKKwlOVUJVU19SRVNJRF9CT09UUkVDICAgICAgPSAweDAwMDYsCisJTlVCVVNfUkVTSURfRkxBR1MgICAgICAgID0gMHgwMDA3LAorCU5VQlVTX1JFU0lEX0hXREVWSUQgICAgICA9IDB4MDAwOCwKKwlOVUJVU19SRVNJRF9NSU5PUl9CQVNFT1MgPSAweDAwMGEsCisJTlVCVVNfUkVTSURfTUlOT1JfTEVOR1RIID0gMHgwMDBiLAorCU5VQlVTX1JFU0lEX01BSk9SX0JBU0VPUyA9IDB4MDAwYywKKwlOVUJVU19SRVNJRF9NQUpPUl9MRU5HVEggPSAweDAwMGQsCisJTlVCVVNfUkVTSURfQ0lDTiAgICAgICAgID0gMHgwMDBmLAorCU5VQlVTX1JFU0lEX0lDTDggICAgICAgICA9IDB4MDAxMCwKKwlOVUJVU19SRVNJRF9JQ0w0ICAgICAgICAgPSAweDAwMTEsCit9OworCisvKiBDYXRlZ29yeS1zcGVjaWZpYyByZXNvdXJjZXMuICovCitlbnVtIG51YnVzX2JvYXJkX3Jlc19pZCB7CisJTlVCVVNfUkVTSURfQk9BUkRJRCAgICAgID0gMHgwMDIwLAorCU5VQlVTX1JFU0lEX1BSQU1JTklUREFUQSA9IDB4MDAyMSwKKwlOVUJVU19SRVNJRF9QUklNQVJZSU5JVCAgPSAweDAwMjIsCisJTlVCVVNfUkVTSURfVElNRU9VVENPTlNUID0gMHgwMDIzLAorCU5VQlVTX1JFU0lEX1ZFTkRPUklORk8gICA9IDB4MDAyNCwKKwlOVUJVU19SRVNJRF9CT0FSREZMQUdTICAgPSAweDAwMjUsCisJTlVCVVNfUkVTSURfU0VDT05ESU5JVCAgID0gMHgwMDI2LAorCisJLyogTm90IHN1cmUgd2h5IEFwcGxlIHB1dCB0aGVzZSBuZXh0IHR3byBpbiBoZXJlICovCisJTlVCVVNfUkVTSURfVklETkFNRVMgICAgID0gMHgwMDQxLAorCU5VQlVTX1JFU0lEX1ZJRE1PREVTICAgICA9IDB4MDA3ZQorfTsKKworLyogRmllbGRzIHdpdGhpbiB0aGUgdmVuZG9yIGluZm8gZGlyZWN0b3J5ICovCitlbnVtIG51YnVzX3ZlbmRvcl9yZXNfaWQgeworCU5VQlVTX1JFU0lEX1ZFTkRfSUQgICAgID0gMHgwMDAxLAorCU5VQlVTX1JFU0lEX1ZFTkRfU0VSSUFMID0gMHgwMDAyLAorCU5VQlVTX1JFU0lEX1ZFTkRfUkVWICAgID0gMHgwMDAzLAorCU5VQlVTX1JFU0lEX1ZFTkRfUEFSVCAgID0gMHgwMDA0LAorCU5VQlVTX1JFU0lEX1ZFTkRfREFURSAgID0gMHgwMDA1Cit9OworCitlbnVtIG51YnVzX25ldF9yZXNfaWQgeworCU5VQlVTX1JFU0lEX01BQ19BRERSRVNTICA9IDB4MDA4MAorfTsKKworZW51bSBudWJ1c19jcHVfcmVzX2lkIHsKKwlOVUJVU19SRVNJRF9NRU1JTkZPICAgICAgPSAweDAwODEsCisJTlVCVVNfUkVTSURfUk9NSU5GTyAgICAgID0gMHgwMDgyCit9OworCitlbnVtIG51YnVzX2Rpc3BsYXlfcmVzX2lkIHsKKwlOVUJVU19SRVNJRF9HQU1NQURJUiAgICA9IDB4MDA0MCwKKwlOVUJVU19SRVNJRF9GSVJTVE1PREUgICA9IDB4MDA4MCwKKwlOVUJVU19SRVNJRF9TRUNPTkRNT0RFICA9IDB4MDA4MSwKKwlOVUJVU19SRVNJRF9USElSRE1PREUgICA9IDB4MDA4MiwKKwlOVUJVU19SRVNJRF9GT1VSVEhNT0RFICA9IDB4MDA4MywKKwlOVUJVU19SRVNJRF9GSUZUSE1PREUgICA9IDB4MDA4NCwKKwlOVUJVU19SRVNJRF9TSVhUSE1PREUgICA9IDB4MDA4NQorfTsKKworc3RydWN0IG51YnVzX2RpcgoreworCXVuc2lnbmVkIGNoYXIgKmJhc2U7CisJdW5zaWduZWQgY2hhciAqcHRyOworCWludCBkb25lOworCWludCBtYXNrOworfTsKKworc3RydWN0IG51YnVzX2RpcmVudAoreworCXVuc2lnbmVkIGNoYXIgKmJhc2U7CisJdW5zaWduZWQgY2hhciB0eXBlOworCV9fdTMyIGRhdGE7CS8qIEFjdHVhbGx5IDI0Yml0cyB1c2VkICovCisJaW50IG1hc2s7Cit9OworCisKKy8qIFdlJ2QgbGlrZSB0byBnZXQgcmlkIG9mIHRoaXMgZXZlbnR1YWxseS4gIE9ubHkgZGF5bmFwb3J0LmMgdXNlcyBpdCBub3cuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkICpudWJ1c19zbG90X2FkZHIoaW50IHNsb3QpCit7CisJcmV0dXJuICh2b2lkICopKDB4RjAwMDAwMDB8KHNsb3Q8PDI0KSk7Cit9CisKKyNlbmRpZiAvKiBMSU5VWF9OVUJVU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L252cmFtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L252cmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJhYTEwZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbnZyYW0uaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9MSU5VWF9OVlJBTV9ICisjZGVmaW5lIF9MSU5VWF9OVlJBTV9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisvKiAvZGV2L252cmFtIGlvY3RscyAqLworI2RlZmluZSBOVlJBTV9JTklUCV9JTygncCcsIDB4NDApIC8qIGluaXRpYWxpemUgTlZSQU0gYW5kIHNldCBjaGVja3N1bSAqLworI2RlZmluZSBOVlJBTV9TRVRDS1MJX0lPKCdwJywgMHg0MSkgLyogcmVjYWxjdWxhdGUgY2hlY2tzdW0gKi8KKworLyogZm9yIGFsbCBjdXJyZW50IHN5c3RlbXMsIHRoaXMgaXMgd2hlcmUgTlZSQU0gc3RhcnRzICovCisjZGVmaW5lIE5WUkFNX0ZJUlNUX0JZVEUgICAgMTQKKy8qIGFsbCB0aGVzZSBmdW5jdGlvbnMgZXhwZWN0IGFuIE5WUkFNIG9mZnNldCwgbm90IGFuIGFic29sdXRlICovCisjZGVmaW5lIE5WUkFNX09GRlNFVCh4KSAgICgoeCktTlZSQU1fRklSU1RfQllURSkKKworCisjZW5kaWYgIC8qIF9MSU5VWF9OVlJBTV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L29tYXAzaXNwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L29tYXAzaXNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlOTEzNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvb21hcDNpc3AuaApAQCAtMCwwICsxLDY0NCBAQAorLyoKKyAqIG9tYXAzaXNwLmgKKyAqCisgKiBUSSBPTUFQMyBJU1AgLSBVc2VyLXNwYWNlIEFQSQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogQ29udGFjdHM6IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAaWRlYXNvbmJvYXJkLmNvbT4KKyAqCSAgICAgU2FrYXJpIEFpbHVzIDxzYWthcmkuYWlsdXNAaWtpLmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIE9NQVAzX0lTUF9VU0VSX0gKKyNkZWZpbmUgT01BUDNfSVNQX1VTRVJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIFByaXZhdGUgSU9DVExzCisgKgorICogVklESU9DX09NQVAzSVNQX0NDRENfQ0ZHOiBTZXQgQ0NEQyBjb25maWd1cmF0aW9uCisgKiBWSURJT0NfT01BUDNJU1BfUFJWX0NGRzogU2V0IHByZXZpZXcgZW5naW5lIGNvbmZpZ3VyYXRpb24KKyAqIFZJRElPQ19PTUFQM0lTUF9BRVdCX0NGRzogU2V0IEFFV0IgbW9kdWxlIGNvbmZpZ3VyYXRpb24KKyAqIFZJRElPQ19PTUFQM0lTUF9ISVNUX0NGRzogU2V0IGhpc3RvZ3JhbSBtb2R1bGUgY29uZmlndXJhdGlvbgorICogVklESU9DX09NQVAzSVNQX0FGX0NGRzogU2V0IGF1dG8tZm9jdXMgbW9kdWxlIGNvbmZpZ3VyYXRpb24KKyAqIFZJRElPQ19PTUFQM0lTUF9TVEFUX1JFUTogUmVhZCBzdGF0aXN0aWNzIChBRVdCL0FGL2hpc3RvZ3JhbSkgZGF0YQorICogVklESU9DX09NQVAzSVNQX1NUQVRfRU46IEVuYWJsZS9kaXNhYmxlIGEgc3RhdGlzdGljcyBtb2R1bGUKKyAqLworCisjZGVmaW5lIFZJRElPQ19PTUFQM0lTUF9DQ0RDX0NGRyBcCisJX0lPV1IoJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFICsgMSwgc3RydWN0IG9tYXAzaXNwX2NjZGNfdXBkYXRlX2NvbmZpZykKKyNkZWZpbmUgVklESU9DX09NQVAzSVNQX1BSVl9DRkcgXAorCV9JT1dSKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDIsIHN0cnVjdCBvbWFwM2lzcF9wcmV2X3VwZGF0ZV9jb25maWcpCisjZGVmaW5lIFZJRElPQ19PTUFQM0lTUF9BRVdCX0NGRyBcCisJX0lPV1IoJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFICsgMywgc3RydWN0IG9tYXAzaXNwX2gzYV9hZXdiX2NvbmZpZykKKyNkZWZpbmUgVklESU9DX09NQVAzSVNQX0hJU1RfQ0ZHIFwKKwlfSU9XUignVicsIEJBU0VfVklESU9DX1BSSVZBVEUgKyA0LCBzdHJ1Y3Qgb21hcDNpc3BfaGlzdF9jb25maWcpCisjZGVmaW5lIFZJRElPQ19PTUFQM0lTUF9BRl9DRkcgXAorCV9JT1dSKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDUsIHN0cnVjdCBvbWFwM2lzcF9oM2FfYWZfY29uZmlnKQorI2RlZmluZSBWSURJT0NfT01BUDNJU1BfU1RBVF9SRVEgXAorCV9JT1dSKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDYsIHN0cnVjdCBvbWFwM2lzcF9zdGF0X2RhdGEpCisjZGVmaW5lIFZJRElPQ19PTUFQM0lTUF9TVEFUX0VOIFwKKwlfSU9XUignVicsIEJBU0VfVklESU9DX1BSSVZBVEUgKyA3LCB1bnNpZ25lZCBsb25nKQorCisvKgorICogRXZlbnRzCisgKgorICogVjRMMl9FVkVOVF9PTUFQM0lTUF9BRVdCOiBBRVdCIHN0YXRpc3RpY3MgZGF0YSByZWFkeQorICogVjRMMl9FVkVOVF9PTUFQM0lTUF9BRjogQUYgc3RhdGlzdGljcyBkYXRhIHJlYWR5CisgKiBWNEwyX0VWRU5UX09NQVAzSVNQX0hJU1Q6IEhpc3RvZ3JhbSBzdGF0aXN0aWNzIGRhdGEgcmVhZHkKKyAqLworCisjZGVmaW5lIFY0TDJfRVZFTlRfT01BUDNJU1BfQ0xBU1MJKFY0TDJfRVZFTlRfUFJJVkFURV9TVEFSVCB8IDB4MTAwKQorI2RlZmluZSBWNEwyX0VWRU5UX09NQVAzSVNQX0FFV0IJKFY0TDJfRVZFTlRfT01BUDNJU1BfQ0xBU1MgfCAweDEpCisjZGVmaW5lIFY0TDJfRVZFTlRfT01BUDNJU1BfQUYJCShWNEwyX0VWRU5UX09NQVAzSVNQX0NMQVNTIHwgMHgyKQorI2RlZmluZSBWNEwyX0VWRU5UX09NQVAzSVNQX0hJU1QJKFY0TDJfRVZFTlRfT01BUDNJU1BfQ0xBU1MgfCAweDMpCisKK3N0cnVjdCBvbWFwM2lzcF9zdGF0X2V2ZW50X3N0YXR1cyB7CisJX191MzIgZnJhbWVfbnVtYmVyOworCV9fdTE2IGNvbmZpZ19jb3VudGVyOworCV9fdTggYnVmX2VycjsKK307CisKKy8qIEFFL0FXQiByZWxhdGVkIHN0cnVjdHVyZXMgYW5kIGZsYWdzKi8KKworLyogSDNBIFJhbmdlIENvbnN0YW50cyAqLworI2RlZmluZSBPTUFQM0lTUF9BRVdCX01BWF9TQVRVUkFUSU9OX0xJTQkxMDIzCisjZGVmaW5lIE9NQVAzSVNQX0FFV0JfTUlOX1dJTl9ICQkJMgorI2RlZmluZSBPTUFQM0lTUF9BRVdCX01BWF9XSU5fSAkJCTI1NgorI2RlZmluZSBPTUFQM0lTUF9BRVdCX01JTl9XSU5fVwkJCTYKKyNkZWZpbmUgT01BUDNJU1BfQUVXQl9NQVhfV0lOX1cJCQkyNTYKKyNkZWZpbmUgT01BUDNJU1BfQUVXQl9NSU5fV0lOVkMJCQkxCisjZGVmaW5lIE9NQVAzSVNQX0FFV0JfTUlOX1dJTkhDCQkJMQorI2RlZmluZSBPTUFQM0lTUF9BRVdCX01BWF9XSU5WQwkJCTEyOAorI2RlZmluZSBPTUFQM0lTUF9BRVdCX01BWF9XSU5IQwkJCTM2CisjZGVmaW5lIE9NQVAzSVNQX0FFV0JfTUFYX1dJTlNUQVJUCQk0MDk1CisjZGVmaW5lIE9NQVAzSVNQX0FFV0JfTUlOX1NVQl9JTkMJCTIKKyNkZWZpbmUgT01BUDNJU1BfQUVXQl9NQVhfU1VCX0lOQwkJMzIKKyNkZWZpbmUgT01BUDNJU1BfQUVXQl9NQVhfQlVGX1NJWkUJCTgzNjAwCisKKyNkZWZpbmUgT01BUDNJU1BfQUZfSUlSU0hfTUlOCQkJMAorI2RlZmluZSBPTUFQM0lTUF9BRl9JSVJTSF9NQVgJCQk0MDk1CisjZGVmaW5lIE9NQVAzSVNQX0FGX1BBWEVMX0hPUklaT05UQUxfQ09VTlRfTUlOCTEKKyNkZWZpbmUgT01BUDNJU1BfQUZfUEFYRUxfSE9SSVpPTlRBTF9DT1VOVF9NQVgJMzYKKyNkZWZpbmUgT01BUDNJU1BfQUZfUEFYRUxfVkVSVElDQUxfQ09VTlRfTUlOCTEKKyNkZWZpbmUgT01BUDNJU1BfQUZfUEFYRUxfVkVSVElDQUxfQ09VTlRfTUFYCTEyOAorI2RlZmluZSBPTUFQM0lTUF9BRl9QQVhFTF9JTkNSRU1FTlRfTUlOCQkyCisjZGVmaW5lIE9NQVAzSVNQX0FGX1BBWEVMX0lOQ1JFTUVOVF9NQVgJCTMyCisjZGVmaW5lIE9NQVAzSVNQX0FGX1BBWEVMX0hFSUdIVF9NSU4JCTIKKyNkZWZpbmUgT01BUDNJU1BfQUZfUEFYRUxfSEVJR0hUX01BWAkJMjU2CisjZGVmaW5lIE9NQVAzSVNQX0FGX1BBWEVMX1dJRFRIX01JTgkJMTYKKyNkZWZpbmUgT01BUDNJU1BfQUZfUEFYRUxfV0lEVEhfTUFYCQkyNTYKKyNkZWZpbmUgT01BUDNJU1BfQUZfUEFYRUxfSFpTVEFSVF9NSU4JCTEKKyNkZWZpbmUgT01BUDNJU1BfQUZfUEFYRUxfSFpTVEFSVF9NQVgJCTQwOTUKKyNkZWZpbmUgT01BUDNJU1BfQUZfUEFYRUxfVlRTVEFSVF9NSU4JCTAKKyNkZWZpbmUgT01BUDNJU1BfQUZfUEFYRUxfVlRTVEFSVF9NQVgJCTQwOTUKKyNkZWZpbmUgT01BUDNJU1BfQUZfVEhSRVNIT0xEX01BWAkJMjU1CisjZGVmaW5lIE9NQVAzSVNQX0FGX0NPRUZfTUFYCQkJNDA5NQorI2RlZmluZSBPTUFQM0lTUF9BRl9QQVhFTF9TSVpFCQkJNDgKKyNkZWZpbmUgT01BUDNJU1BfQUZfTUFYX0JVRl9TSVpFCQkyMjExODQKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3BfaDNhX2Fld2JfY29uZmlnIC0gQUUgQVdCIGNvbmZpZ3VyYXRpb24gcmVzZXQgdmFsdWVzCisgKiBzYXR1cmF0aW9uX2xpbWl0OiBTYXR1cmF0aW9uIGxpbWl0LgorICogQHdpbl9oZWlnaHQ6IFdpbmRvdyBIZWlnaHQuIFJhbmdlIDIgLSAyNTYsIGV2ZW4gdmFsdWVzIG9ubHkuCisgKiBAd2luX3dpZHRoOiBXaW5kb3cgV2lkdGguIFJhbmdlIDYgLSAyNTYsIGV2ZW4gdmFsdWVzIG9ubHkuCisgKiBAdmVyX3dpbl9jb3VudDogVmVydGljYWwgV2luZG93IENvdW50LiBSYW5nZSAxIC0gMTI4LgorICogQGhvcl93aW5fY291bnQ6IEhvcml6b250YWwgV2luZG93IENvdW50LiBSYW5nZSAxIC0gMzYuCisgKiBAdmVyX3dpbl9zdGFydDogVmVydGljYWwgV2luZG93IFN0YXJ0LiBSYW5nZSAwIC0gNDA5NS4KKyAqIEBob3Jfd2luX3N0YXJ0OiBIb3Jpem9udGFsIFdpbmRvdyBTdGFydC4gUmFuZ2UgMCAtIDQwOTUuCisgKiBAYmxrX3Zlcl93aW5fc3RhcnQ6IEJsYWNrIFZlcnRpY2FsIFdpbmRvd3MgU3RhcnQuIFJhbmdlIDAgLSA0MDk1LgorICogQGJsa193aW5faGVpZ2h0OiBCbGFjayBXaW5kb3cgSGVpZ2h0LiBSYW5nZSAyIC0gMjU2LCBldmVuIHZhbHVlcyBvbmx5LgorICogQHN1YnNhbXBsZV92ZXJfaW5jOiBTdWJzYW1wbGUgVmVydGljYWwgcG9pbnRzIGluY3JlbWVudCBSYW5nZSAyIC0gMzIsIGV2ZW4KKyAqICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIG9ubHkuCisgKiBAc3Vic2FtcGxlX2hvcl9pbmM6IFN1YnNhbXBsZSBIb3Jpem9udGFsIHBvaW50cyBpbmNyZW1lbnQgUmFuZ2UgMiAtIDMyLCBldmVuCisgKiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBvbmx5LgorICogQGFsYXdfZW5hYmxlOiBBRVcgQUxBVyBFTiBmbGFnLgorICovCitzdHJ1Y3Qgb21hcDNpc3BfaDNhX2Fld2JfY29uZmlnIHsKKwkvKgorCSAqIENvbW1vbiBmaWVsZHMuCisJICogVGhleSBzaG91bGQgYmUgdGhlIGZpcnN0IG9uZXMgYW5kIG11c3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW4KKwkgKiBpc3BzdGF0X2dlbmVyaWNfY29uZmlnIHN0cnVjdC4KKwkgKi8KKwlfX3UzMiBidWZfc2l6ZTsKKwlfX3UxNiBjb25maWdfY291bnRlcjsKKworCS8qIFByaXZhdGUgZmllbGRzICovCisJX191MTYgc2F0dXJhdGlvbl9saW1pdDsKKwlfX3UxNiB3aW5faGVpZ2h0OworCV9fdTE2IHdpbl93aWR0aDsKKwlfX3UxNiB2ZXJfd2luX2NvdW50OworCV9fdTE2IGhvcl93aW5fY291bnQ7CisJX191MTYgdmVyX3dpbl9zdGFydDsKKwlfX3UxNiBob3Jfd2luX3N0YXJ0OworCV9fdTE2IGJsa192ZXJfd2luX3N0YXJ0OworCV9fdTE2IGJsa193aW5faGVpZ2h0OworCV9fdTE2IHN1YnNhbXBsZV92ZXJfaW5jOworCV9fdTE2IHN1YnNhbXBsZV9ob3JfaW5jOworCV9fdTggYWxhd19lbmFibGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBvbWFwM2lzcF9zdGF0X2RhdGEgLSBTdGF0aXN0aWMgZGF0YSBzZW50IHRvIG9yIHJlY2VpdmVkIGZyb20gdXNlcgorICogQHRzOiBUaW1lc3RhbXAgb2YgcmV0dXJuZWQgZnJhbWVzdGF0cy4KKyAqIEBidWY6IFBvaW50ZXIgdG8gcGFzcyB0byB1c2VyLgorICogQGZyYW1lX251bWJlcjogRnJhbWUgbnVtYmVyIG9mIHJlcXVlc3RlZCBzdGF0cy4KKyAqIEBjdXJfZnJhbWU6IEN1cnJlbnQgZnJhbWUgbnVtYmVyIGJlaW5nIHByb2Nlc3NlZC4KKyAqIEBjb25maWdfY291bnRlcjogTnVtYmVyIG9mIHRoZSBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YS4KKyAqLworc3RydWN0IG9tYXAzaXNwX3N0YXRfZGF0YSB7CisJc3RydWN0IHRpbWV2YWwgdHM7CisJdm9pZCAqYnVmOworCV9fdTMyIGJ1Zl9zaXplOworCV9fdTE2IGZyYW1lX251bWJlcjsKKwlfX3UxNiBjdXJfZnJhbWU7CisJX191MTYgY29uZmlnX2NvdW50ZXI7Cit9OworCisKKy8qIEhpc3RvZ3JhbSByZWxhdGVkIHN0cnVjdHMgKi8KKworLyogRmxhZ3MgZm9yIG51bWJlciBvZiBiaW5zICovCisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfQklOU18zMgkJMAorI2RlZmluZSBPTUFQM0lTUF9ISVNUX0JJTlNfNjQJCTEKKyNkZWZpbmUgT01BUDNJU1BfSElTVF9CSU5TXzEyOAkJMgorI2RlZmluZSBPTUFQM0lTUF9ISVNUX0JJTlNfMjU2CQkzCisKKy8qIE51bWJlciBvZiBiaW5zICogNCBjb2xvcnMgKiA0LWJ5dGVzIHdvcmQgKi8KKyNkZWZpbmUgT01BUDNJU1BfSElTVF9NRU1fU0laRV9CSU5TKG4pCSgoMSA8PCAoKG4pKzUpKSo0KjQpCisKKyNkZWZpbmUgT01BUDNJU1BfSElTVF9NRU1fU0laRQkJMTAyNAorI2RlZmluZSBPTUFQM0lTUF9ISVNUX01JTl9SRUdJT05TCTEKKyNkZWZpbmUgT01BUDNJU1BfSElTVF9NQVhfUkVHSU9OUwk0CisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfTUFYX1dCX0dBSU4JMjU1CisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfTUlOX1dCX0dBSU4JMAorI2RlZmluZSBPTUFQM0lTUF9ISVNUX01BWF9CSVRfV0lEVEgJMTQKKyNkZWZpbmUgT01BUDNJU1BfSElTVF9NSU5fQklUX1dJRFRICTgKKyNkZWZpbmUgT01BUDNJU1BfSElTVF9NQVhfV0cJCTQKKyNkZWZpbmUgT01BUDNJU1BfSElTVF9NQVhfQlVGX1NJWkUJNDA5NgorCisvKiBTb3VyY2UgKi8KKyNkZWZpbmUgT01BUDNJU1BfSElTVF9TT1VSQ0VfQ0NEQwkwCisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfU09VUkNFX01FTQkxCisKKy8qIENGQSBwYXR0ZXJuICovCisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfQ0ZBX0JBWUVSCQkwCisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfQ0ZBX0ZPVkVPTlgzCTEKKworc3RydWN0IG9tYXAzaXNwX2hpc3RfcmVnaW9uIHsKKwlfX3UxNiBoX3N0YXJ0OworCV9fdTE2IGhfZW5kOworCV9fdTE2IHZfc3RhcnQ7CisJX191MTYgdl9lbmQ7Cit9OworCitzdHJ1Y3Qgb21hcDNpc3BfaGlzdF9jb25maWcgeworCS8qCisJICogQ29tbW9uIGZpZWxkcy4KKwkgKiBUaGV5IHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lcyBhbmQgbXVzdCBiZSBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbgorCSAqIGlzcHN0YXRfZ2VuZXJpY19jb25maWcgc3RydWN0LgorCSAqLworCV9fdTMyIGJ1Zl9zaXplOworCV9fdTE2IGNvbmZpZ19jb3VudGVyOworCisJX191OCBudW1fYWNjX2ZyYW1lczsJLyogTnVtIG9mIGltYWdlIGZyYW1lcyB0byBiZSBwcm9jZXNzZWQgYW5kCisJCQkJICAgYWNjdW11bGF0ZWQgZm9yIGVhY2ggaGlzdG9ncmFtIGZyYW1lICovCisJX191MTYgaGlzdF9iaW5zOwkvKiBudW1iZXIgb2YgYmluczogMzIsIDY0LCAxMjgsIG9yIDI1NiAqLworCV9fdTggY2ZhOwkJLyogQkFZRVIgb3IgRk9WRU9OIFgzICovCisJX191OCB3Z1tPTUFQM0lTUF9ISVNUX01BWF9XR107CS8qIFdoaXRlIEJhbGFuY2UgR2FpbiAqLworCV9fdTggbnVtX3JlZ2lvbnM7CS8qIG51bWJlciBvZiByZWdpb25zIHRvIGJlIGNvbmZpZ3VyZWQgKi8KKwlzdHJ1Y3Qgb21hcDNpc3BfaGlzdF9yZWdpb24gcmVnaW9uW09NQVAzSVNQX0hJU1RfTUFYX1JFR0lPTlNdOworfTsKKworLyogQXV0byBGb2N1cyByZWxhdGVkIHN0cnVjdHMgKi8KKworI2RlZmluZSBPTUFQM0lTUF9BRl9OVU1fQ09FRgkJMTEKKworZW51bSBvbWFwM2lzcF9oM2FfYWZfZnZtb2RlIHsKKwlPTUFQM0lTUF9BRl9NT0RFX1NVTU1FRCA9IDAsCisJT01BUDNJU1BfQUZfTU9ERV9QRUFLID0gMQorfTsKKworLyogUmVkLCBHcmVlbiwgYW5kIGJsdWUgcGl4ZWwgbG9jYXRpb24gaW4gdGhlIEFGIHdpbmRvd3MgKi8KK2VudW0gb21hcDNpc3BfaDNhX2FmX3JnYnBvcyB7CisJT01BUDNJU1BfQUZfR1JfR0JfQkFZRVIgPSAwLAkvKiBHUiBhbmQgR0IgYXMgQmF5ZXIgcGF0dGVybiAqLworCU9NQVAzSVNQX0FGX1JHX0dCX0JBWUVSID0gMSwJLyogUkcgYW5kIEdCIGFzIEJheWVyIHBhdHRlcm4gKi8KKwlPTUFQM0lTUF9BRl9HUl9CR19CQVlFUiA9IDIsCS8qIEdSIGFuZCBCRyBhcyBCYXllciBwYXR0ZXJuICovCisJT01BUDNJU1BfQUZfUkdfQkdfQkFZRVIgPSAzLAkvKiBSRyBhbmQgQkcgYXMgQmF5ZXIgcGF0dGVybiAqLworCU9NQVAzSVNQX0FGX0dHX1JCX0NVU1RPTSA9IDQsCS8qIEdHIGFuZCBSQiBhcyBjdXN0b20gcGF0dGVybiAqLworCU9NQVAzSVNQX0FGX1JCX0dHX0NVU1RPTSA9IDUJLyogUkIgYW5kIEdHIGFzIGN1c3RvbSBwYXR0ZXJuICovCit9OworCisvKiBDb250YWlucyB0aGUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBIb3Jpem9udGFsIE1lZGlhbiBGaWx0ZXIgKi8KK3N0cnVjdCBvbWFwM2lzcF9oM2FfYWZfaG1mIHsKKwlfX3U4IGVuYWJsZTsJLyogU3RhdHVzIG9mIEhvcml6b250YWwgTWVkaWFuIEZpbHRlciAqLworCV9fdTggdGhyZXNob2xkOwkvKiBUaHJlc2hvbGQgVmFsdWUgZm9yIEhvcml6b250YWwgTWVkaWFuIEZpbHRlciAqLworfTsKKworLyogQ29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgSUlSIEZpbHRlcnMgKi8KK3N0cnVjdCBvbWFwM2lzcF9oM2FfYWZfaWlyIHsKKwlfX3UxNiBoX3N0YXJ0OwkJCS8qIElJUiBob3Jpem9udGFsIHN0YXJ0ICovCisJX191MTYgY29lZmZfc2V0MFtPTUFQM0lTUF9BRl9OVU1fQ09FRl07CS8qIEZpbHRlciBjb2VmZmljaWVudCwgc2V0IDAgKi8KKwlfX3UxNiBjb2VmZl9zZXQxW09NQVAzSVNQX0FGX05VTV9DT0VGXTsJLyogRmlsdGVyIGNvZWZmaWNpZW50LCBzZXQgMSAqLworfTsKKworLyogQ29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgUGF4ZWxzIFN0cnVjdHVyZSBpbiBBRiBFbmdpbmUgKi8KK3N0cnVjdCBvbWFwM2lzcF9oM2FfYWZfcGF4ZWwgeworCV9fdTE2IGhfc3RhcnQ7CS8qIEhvcml6b250YWwgU3RhcnQgUG9zaXRpb24gKi8KKwlfX3UxNiB2X3N0YXJ0OwkvKiBWZXJ0aWNhbCBTdGFydCBQb3NpdGlvbiAqLworCV9fdTggd2lkdGg7CS8qIFdpZHRoIG9mIHRoZSBQYXhlbCAqLworCV9fdTggaGVpZ2h0OwkvKiBIZWlnaHQgb2YgdGhlIFBheGVsICovCisJX191OCBoX2NudDsJLyogSG9yaXpvbnRhbCBDb3VudCAqLworCV9fdTggdl9jbnQ7CS8qIHZlcnRpY2FsIENvdW50ICovCisJX191OCBsaW5lX2luYzsJLyogTGluZSBJbmNyZW1lbnQgKi8KK307CisKKy8qIENvbnRhaW5zIHRoZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBoYXJkd2FyZSBzZXQgdXAgb2YgQUYgRW5naW5lICovCitzdHJ1Y3Qgb21hcDNpc3BfaDNhX2FmX2NvbmZpZyB7CisJLyoKKwkgKiBDb21tb24gZmllbGRzLgorCSAqIFRoZXkgc2hvdWxkIGJlIHRoZSBmaXJzdCBvbmVzIGFuZCBtdXN0IGJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIGluCisJICogaXNwc3RhdF9nZW5lcmljX2NvbmZpZyBzdHJ1Y3QuCisJICovCisJX191MzIgYnVmX3NpemU7CisJX191MTYgY29uZmlnX2NvdW50ZXI7CisKKwlzdHJ1Y3Qgb21hcDNpc3BfaDNhX2FmX2htZiBobWY7CQkvKiBITUYgY29uZmlndXJhdGlvbnMgKi8KKwlzdHJ1Y3Qgb21hcDNpc3BfaDNhX2FmX2lpciBpaXI7CQkvKiBJSVIgZmlsdGVyIGNvbmZpZ3VyYXRpb25zICovCisJc3RydWN0IG9tYXAzaXNwX2gzYV9hZl9wYXhlbCBwYXhlbDsJLyogUGF4ZWwgcGFyYW1ldGVycyAqLworCWVudW0gb21hcDNpc3BfaDNhX2FmX3JnYnBvcyByZ2JfcG9zOwkvKiBSR0IgUG9zaXRpb25zICovCisJZW51bSBvbWFwM2lzcF9oM2FfYWZfZnZtb2RlIGZ2bW9kZTsJLyogQWNjdW11bGF0b3IgbW9kZSAqLworCV9fdTggYWxhd19lbmFibGU7CQkJLyogQUYgQUxBVyBzdGF0dXMgKi8KK307CisKKy8qIElTUCBDQ0RDIHN0cnVjdHMgKi8KKworLyogQWJzdHJhY3Rpb24gbGF5ZXIgQ0NEQyBjb25maWd1cmF0aW9ucyAqLworI2RlZmluZSBPTUFQM0lTUF9DQ0RDX0FMQVcJCSgxIDw8IDApCisjZGVmaW5lIE9NQVAzSVNQX0NDRENfTFBGCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQM0lTUF9DQ0RDX0JMQ0xBTVAJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVAzSVNQX0NDRENfQkNPTVAJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVAzSVNQX0NDRENfRlBDCQkoMSA8PCA0KQorI2RlZmluZSBPTUFQM0lTUF9DQ0RDX0NVTEwJCSgxIDw8IDUpCisjZGVmaW5lIE9NQVAzSVNQX0NDRENfQ09ORklHX0xTQwkoMSA8PCA3KQorI2RlZmluZSBPTUFQM0lTUF9DQ0RDX1RCTF9MU0MJCSgxIDw8IDgpCisKKyNkZWZpbmUgT01BUDNJU1BfUkdCX01BWAkJMworCisvKiBFbnVtZXJhdGlvbiBjb25zdGFudHMgZm9yIEFsYXcgaW5wdXQgd2lkdGggKi8KK2VudW0gb21hcDNpc3BfYWxhd19pcHdpZHRoIHsKKwlPTUFQM0lTUF9BTEFXX0JJVDEyXzMgPSAweDMsCisJT01BUDNJU1BfQUxBV19CSVQxMV8yID0gMHg0LAorCU9NQVAzSVNQX0FMQVdfQklUMTBfMSA9IDB4NSwKKwlPTUFQM0lTUF9BTEFXX0JJVDlfMCA9IDB4NgorfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3BfY2NkY19sc2NfY29uZmlnIC0gTFNDIGNvbmZpZ3VyYXRpb24KKyAqIEBvZmZzZXQ6IFRhYmxlIE9mZnNldCBvZiB0aGUgZ2FpbiB0YWJsZS4KKyAqIEBnYWluX21vZGVfbjogVmVydGljYWwgZGltZW5zaW9uIG9mIGEgcGF4ZWwgaW4gTFNDIGNvbmZpZ3VyYXRpb24uCisgKiBAZ2Fpbl9tb2RlX206IEhvcml6b250YWwgZGltZW5zaW9uIG9mIGEgcGF4ZWwgaW4gTFNDIGNvbmZpZ3VyYXRpb24uCisgKiBAZ2Fpbl9mb3JtYXQ6IEdhaW4gdGFibGUgZm9ybWF0LgorICogQGZtdHNwaDogU3RhcnQgcGl4ZWwgaG9yaXpvbnRhbCBmcm9tIHN0YXJ0IG9mIHRoZSBIUyBzeW5jIHB1bHNlLgorICogQGZtdGxuaDogTnVtYmVyIG9mIHBpeGVscyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiB0byB1c2UgZm9yIHRoZSBkYXRhCisgKiAgICAgICAgICByZWZvcm1hdHRlci4KKyAqIEBmbXRzbHY6IFN0YXJ0IGxpbmUgZnJvbSBzdGFydCBvZiBWUyBzeW5jIHB1bHNlIGZvciB0aGUgZGF0YSByZWZvcm1hdHRlci4KKyAqIEBmbXRsbnY6IE51bWJlciBvZiBsaW5lcyBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24gZm9yIHRoZSBkYXRhIHJlZm9ybWF0dGVyLgorICogQGluaXRpYWxfeDogWCBwb3NpdGlvbiwgaW4gcGl4ZWxzLCBvZiB0aGUgZmlyc3QgYWN0aXZlIHBpeGVsIGluIHJlZmVyZW5jZQorICogICAgICAgICAgICAgdG8gdGhlIGZpcnN0IGFjdGl2ZSBwYXhlbC4gTXVzdCBiZSBhbiBldmVuIG51bWJlci4KKyAqIEBpbml0aWFsX3k6IFkgcG9zaXRpb24sIGluIHBpeGVscywgb2YgdGhlIGZpcnN0IGFjdGl2ZSBwaXhlbCBpbiByZWZlcmVuY2UKKyAqICAgICAgICAgICAgIHRvIHRoZSBmaXJzdCBhY3RpdmUgcGF4ZWwuIE11c3QgYmUgYW4gZXZlbiBudW1iZXIuCisgKiBAc2l6ZTogU2l6ZSBvZiBMU0MgZ2FpbiB0YWJsZS4gRmlsbGVkIHdoZW4gbG9hZGVkIGZyb20gdXNlcnNwYWNlLgorICovCitzdHJ1Y3Qgb21hcDNpc3BfY2NkY19sc2NfY29uZmlnIHsKKwlfX3UxNiBvZmZzZXQ7CisJX191OCBnYWluX21vZGVfbjsKKwlfX3U4IGdhaW5fbW9kZV9tOworCV9fdTggZ2Fpbl9mb3JtYXQ7CisJX191MTYgZm10c3BoOworCV9fdTE2IGZtdGxuaDsKKwlfX3UxNiBmbXRzbHY7CisJX191MTYgZm10bG52OworCV9fdTggaW5pdGlhbF94OworCV9fdTggaW5pdGlhbF95OworCV9fdTMyIHNpemU7Cit9OworCisvKioKKyAqIHN0cnVjdCBvbWFwM2lzcF9jY2RjX2JjbGFtcCAtIE9wdGljYWwgJiBEaWdpdGFsIGJsYWNrIGNsYW1wIHN1YnRyYWN0CisgKiBAb2JnYWluOiBPcHRpY2FsIGJsYWNrIGF2ZXJhZ2UgZ2Fpbi4KKyAqIEBvYnN0cGl4ZWw6IFN0YXJ0IFBpeGVsIHcuci50LiBIUyBwdWxzZSBpbiBPcHRpY2FsIGJsYWNrIHNhbXBsZS4KKyAqIEBvYmxpbmVzOiBPcHRpY2FsIEJsYWNrIFNhbXBsZSBsaW5lcy4KKyAqIEBvYmxlbjogT3B0aWNhbCBCbGFjayBTYW1wbGUgTGVuZ3RoLgorICogQGRjc3VidmFsOiBEaWdpdGFsIEJsYWNrIENsYW1wIHN1YnRyYWN0IHZhbHVlLgorICovCitzdHJ1Y3Qgb21hcDNpc3BfY2NkY19iY2xhbXAgeworCV9fdTggb2JnYWluOworCV9fdTggb2JzdHBpeGVsOworCV9fdTggb2JsaW5lczsKKwlfX3U4IG9ibGVuOworCV9fdTE2IGRjc3VidmFsOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3BfY2NkY19mcGMgLSBGYXVsdHkgUGl4ZWxzIENvcnJlY3Rpb24KKyAqIEBmcG51bTogTnVtYmVyIG9mIGZhdWx0eSBwaXhlbHMgdG8gYmUgY29ycmVjdGVkIGluIHRoZSBmcmFtZS4KKyAqIEBmcGNhZGRyOiBNZW1vcnkgYWRkcmVzcyBvZiB0aGUgRlBDIFRhYmxlCisgKi8KK3N0cnVjdCBvbWFwM2lzcF9jY2RjX2ZwYyB7CisJX191MTYgZnBudW07CisJX191MzIgZnBjYWRkcjsKK307CisKKy8qKgorICogc3RydWN0IG9tYXAzaXNwX2NjZGNfYmxjb21wIC0gQmxhY2sgTGV2ZWwgQ29tcGVuc2F0aW9uIHBhcmFtZXRlcnMKKyAqIEBiX21nOiBCL01nIHBpeGVscy4gMidzIGNvbXBsZW1lbnQuIC0xMjggdG8gKzEyNy4KKyAqIEBnYl9nOiBHYi9HIHBpeGVscy4gMidzIGNvbXBsZW1lbnQuIC0xMjggdG8gKzEyNy4KKyAqIEBncl9jeTogR3IvQ3kgcGl4ZWxzLiAyJ3MgY29tcGxlbWVudC4gLTEyOCB0byArMTI3LgorICogQHJfeWU6IFIvWWUgcGl4ZWxzLiAyJ3MgY29tcGxlbWVudC4gLTEyOCB0byArMTI3LgorICovCitzdHJ1Y3Qgb21hcDNpc3BfY2NkY19ibGNvbXAgeworCV9fdTggYl9tZzsKKwlfX3U4IGdiX2c7CisJX191OCBncl9jeTsKKwlfX3U4IHJfeWU7Cit9OworCisvKioKKyAqIG9tYXAzaXNwX2NjZGNfY3VsbGluZyAtIEN1bGxpbmcgcGFyYW1ldGVycworICogQHZfcGF0dGVybjogVmVydGljYWwgY3VsbGluZyBwYXR0ZXJuLgorICogQGhfb2RkOiBIb3Jpem9udGFsIEN1bGxpbmcgcGF0dGVybiBmb3Igb2RkIGxpbmVzLgorICogQGhfZXZlbjogSG9yaXpvbnRhbCBDdWxsaW5nIHBhdHRlcm4gZm9yIGV2ZW4gbGluZXMuCisgKi8KK3N0cnVjdCBvbWFwM2lzcF9jY2RjX2N1bGxpbmcgeworCV9fdTggdl9wYXR0ZXJuOworCV9fdTE2IGhfb2RkOworCV9fdTE2IGhfZXZlbjsKK307CisKKy8qKgorICogb21hcDNpc3BfY2NkY191cGRhdGVfY29uZmlnIC0gQ0NEQyBjb25maWd1cmF0aW9uCisgKiBAdXBkYXRlOiBTcGVjaWZpZXMgd2hpY2ggQ0NEQyByZWdpc3RlcnMgc2hvdWxkIGJlIHVwZGF0ZWQuCisgKiBAZmxhZzogU3BlY2lmaWVzIHdoaWNoIENDREMgZnVuY3Rpb25zIHNob3VsZCBiZSBlbmFibGVkLgorICogQGFsYXdpcDogRW5hYmxlL0Rpc2FibGUgQS1MYXcgY29tcHJlc3Npb24uCisgKiBAYmNsYW1wOiBCbGFjayBjbGFtcCBjb250cm9sIHJlZ2lzdGVyLgorICogQGJsY29tcDogQmxhY2sgbGV2ZWwgY29tcGVuc2F0aW9uIHZhbHVlIGZvciBSR3JHYkIgUGl4ZWxzLiAyJ3MgY29tcGxlbWVudC4KKyAqIEBmcGM6IE51bWJlciBvZiBmYXVsdHkgcGl4ZWxzIGNvcnJlY3RlZCBpbiB0aGUgZnJhbWUsIGFkZHJlc3Mgb2YgRlBDIHRhYmxlLgorICogQGN1bGw6IEN1bGwgY29udHJvbCByZWdpc3Rlci4KKyAqIEBsc2M6IFBvaW50ZXIgdG8gTFNDIGdhaW4gdGFibGUuCisgKi8KK3N0cnVjdCBvbWFwM2lzcF9jY2RjX3VwZGF0ZV9jb25maWcgeworCV9fdTE2IHVwZGF0ZTsKKwlfX3UxNiBmbGFnOworCWVudW0gb21hcDNpc3BfYWxhd19pcHdpZHRoIGFsYXdpcDsKKwlzdHJ1Y3Qgb21hcDNpc3BfY2NkY19iY2xhbXAgKmJjbGFtcDsKKwlzdHJ1Y3Qgb21hcDNpc3BfY2NkY19ibGNvbXAgKmJsY29tcDsKKwlzdHJ1Y3Qgb21hcDNpc3BfY2NkY19mcGMgKmZwYzsKKwlzdHJ1Y3Qgb21hcDNpc3BfY2NkY19sc2NfY29uZmlnICpsc2NfY2ZnOworCXN0cnVjdCBvbWFwM2lzcF9jY2RjX2N1bGxpbmcgKmN1bGw7CisJX191OCAqbHNjOworfTsKKworLyogUHJldmlldyBjb25maWd1cmF0aW9ucyAqLworI2RlZmluZSBPTUFQM0lTUF9QUkVWX0xVTUFFTkgJCSgxIDw8IDApCisjZGVmaW5lIE9NQVAzSVNQX1BSRVZfSU5WQUxBVwkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9IUlpfTUVECQkoMSA8PCAyKQorI2RlZmluZSBPTUFQM0lTUF9QUkVWX0NGQQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9DSFJPTUFfU1VQUAkoMSA8PCA0KQorI2RlZmluZSBPTUFQM0lTUF9QUkVWX1dCCQkoMSA8PCA1KQorI2RlZmluZSBPTUFQM0lTUF9QUkVWX0JMS0FESgkJKDEgPDwgNikKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9SR0IyUkdCCQkoMSA8PCA3KQorI2RlZmluZSBPTUFQM0lTUF9QUkVWX0NPTE9SX0NPTlYJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9ZQ19MSU1JVAkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9ERUZFQ1RfQ09SCSgxIDw8IDEwKQorI2RlZmluZSBPTUFQM0lTUF9QUkVWX0dBTU1BQllQQVNTCSgxIDw8IDExKQorI2RlZmluZSBPTUFQM0lTUF9QUkVWX0RSS19GUk1fQ0FQVFVSRQkoMSA8PCAxMikKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9EUktfRlJNX1NVQlRSQUNUCSgxIDw8IDEzKQorI2RlZmluZSBPTUFQM0lTUF9QUkVWX0xFTlNfU0hBRElORwkoMSA8PCAxNCkKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9ORgkJKDEgPDwgMTUpCisjZGVmaW5lIE9NQVAzSVNQX1BSRVZfR0FNTUEJCSgxIDw8IDE2KQorCisjZGVmaW5lIE9NQVAzSVNQX1BSRVZfTkZfVEJMX1NJWkUJNjQKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9DRkFfVEJMX1NJWkUJNTc2CisjZGVmaW5lIE9NQVAzSVNQX1BSRVZfR0FNTUFfVEJMX1NJWkUJMTAyNAorI2RlZmluZSBPTUFQM0lTUF9QUkVWX1lFTkhfVEJMX1NJWkUJMTI4CisKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9ERVRFQ1RfQ09SUkVDVF9DSEFOTkVMUwk0CisKKy8qKgorICogc3RydWN0IG9tYXAzaXNwX3ByZXZfaG1lZCAtIEhvcml6b250YWwgTWVkaWFuIEZpbHRlcgorICogQG9kZGRpc3Q6IERpc3RhbmNlIGJldHdlZW4gY29uc2VjdXRpdmUgcGl4ZWxzIG9mIHNhbWUgY29sb3IgaW4gdGhlIG9kZCBsaW5lLgorICogQGV2ZW5kaXN0OiBEaXN0YW5jZSBiZXR3ZWVuIGNvbnNlY3V0aXZlIHBpeGVscyBvZiBzYW1lIGNvbG9yIGluIHRoZSBldmVuCisgKiAgICAgICAgICAgIGxpbmUuCisgKiBAdGhyZXM6IEhvcml6b250YWwgbWVkaWFuIGZpbHRlciB0aHJlc2hvbGQuCisgKi8KK3N0cnVjdCBvbWFwM2lzcF9wcmV2X2htZWQgeworCV9fdTggb2RkZGlzdDsKKwlfX3U4IGV2ZW5kaXN0OworCV9fdTggdGhyZXM7Cit9OworCisvKgorICogRW51bWVyYXRpb24gZm9yIENGQSBGb3JtYXRzIHN1cHBvcnRlZCBieSBwcmV2aWV3CisgKi8KK2VudW0gb21hcDNpc3BfY2ZhX2ZtdCB7CisJT01BUDNJU1BfQ0ZBRk1UX0JBWUVSLAorCU9NQVAzSVNQX0NGQUZNVF9TT05ZVkdBLAorCU9NQVAzSVNQX0NGQUZNVF9SR0JGT1ZFT04sCisJT01BUDNJU1BfQ0ZBRk1UX0ROU1BMLAorCU9NQVAzSVNQX0NGQUZNVF9IT05FWUNPTUIsCisJT01BUDNJU1BfQ0ZBRk1UX1JSR0dCQkZPVkVPTgorfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3BfcHJldl9jZmEgLSBDRkEgSW50ZXJwb2xhdGlvbgorICogQGZvcm1hdDogQ0ZBIEZvcm1hdCBFbnVtIHZhbHVlIHN1cHBvcnRlZCBieSBwcmV2aWV3LgorICogQGdyYWR0aHJzX3ZlcnQ6IENGQSBHcmFkaWVudCBUaHJlc2hvbGQgLSBWZXJ0aWNhbC4KKyAqIEBncmFkdGhyc19ob3J6OiBDRkEgR3JhZGllbnQgVGhyZXNob2xkIC0gSG9yaXpvbnRhbC4KKyAqIEB0YWJsZTogUG9pbnRlciB0byB0aGUgQ0ZBIHRhYmxlLgorICovCitzdHJ1Y3Qgb21hcDNpc3BfcHJldl9jZmEgeworCWVudW0gb21hcDNpc3BfY2ZhX2ZtdCBmb3JtYXQ7CisJX191OCBncmFkdGhyc192ZXJ0OworCV9fdTggZ3JhZHRocnNfaG9yejsKKwlfX3UzMiB0YWJsZVtPTUFQM0lTUF9QUkVWX0NGQV9UQkxfU0laRV07Cit9OworCisvKioKKyAqIHN0cnVjdCBvbWFwM2lzcF9wcmV2X2NzdXAgLSBDaHJvbWluYW5jZSBTdXBwcmVzc2lvbgorICogQGdhaW46IEdhaW4uCisgKiBAdGhyZXM6IFRocmVzaG9sZC4KKyAqIEBoeXBmX2VuOiBGbGFnIHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBIaWdoIFBhc3MgRmlsdGVyLgorICovCitzdHJ1Y3Qgb21hcDNpc3BfcHJldl9jc3VwIHsKKwlfX3U4IGdhaW47CisJX191OCB0aHJlczsKKwlfX3U4IGh5cGZfZW47Cit9OworCisvKioKKyAqIHN0cnVjdCBvbWFwM2lzcF9wcmV2X3diYWwgLSBXaGl0ZSBCYWxhbmNlCisgKiBAZGdhaW46IERpZ2l0YWwgZ2FpbiAoVTEwUTgpLgorICogQGNvZWYzOiBXaGl0ZSBiYWxhbmNlIGdhaW4gLSBDT0VGIDMgKFU4UTUpLgorICogQGNvZWYyOiBXaGl0ZSBiYWxhbmNlIGdhaW4gLSBDT0VGIDIgKFU4UTUpLgorICogQGNvZWYxOiBXaGl0ZSBiYWxhbmNlIGdhaW4gLSBDT0VGIDEgKFU4UTUpLgorICogQGNvZWYwOiBXaGl0ZSBiYWxhbmNlIGdhaW4gLSBDT0VGIDAgKFU4UTUpLgorICovCitzdHJ1Y3Qgb21hcDNpc3BfcHJldl93YmFsIHsKKwlfX3UxNiBkZ2FpbjsKKwlfX3U4IGNvZWYzOworCV9fdTggY29lZjI7CisJX191OCBjb2VmMTsKKwlfX3U4IGNvZWYwOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3BfcHJldl9ibGthZGogLSBCbGFjayBMZXZlbCBBZGp1c3RtZW50CisgKiBAcmVkOiBCbGFjayBsZXZlbCBvZmZzZXQgYWRqdXN0bWVudCBmb3IgUmVkIGluIDIncyBjb21wbGVtZW50IGZvcm1hdAorICogQGdyZWVuOiBCbGFjayBsZXZlbCBvZmZzZXQgYWRqdXN0bWVudCBmb3IgR3JlZW4gaW4gMidzIGNvbXBsZW1lbnQgZm9ybWF0CisgKiBAYmx1ZTogQmxhY2sgbGV2ZWwgb2Zmc2V0IGFkanVzdG1lbnQgZm9yIEJsdWUgaW4gMidzIGNvbXBsZW1lbnQgZm9ybWF0CisgKi8KK3N0cnVjdCBvbWFwM2lzcF9wcmV2X2Jsa2FkaiB7CisJLypCbGFjayBsZXZlbCBvZmZzZXQgYWRqdXN0bWVudCBmb3IgUmVkIGluIDIncyBjb21wbGVtZW50IGZvcm1hdCAqLworCV9fdTggcmVkOworCS8qQmxhY2sgbGV2ZWwgb2Zmc2V0IGFkanVzdG1lbnQgZm9yIEdyZWVuIGluIDIncyBjb21wbGVtZW50IGZvcm1hdCAqLworCV9fdTggZ3JlZW47CisJLyogQmxhY2sgbGV2ZWwgb2Zmc2V0IGFkanVzdG1lbnQgZm9yIEJsdWUgaW4gMidzIGNvbXBsZW1lbnQgZm9ybWF0ICovCisJX191OCBibHVlOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3BfcHJldl9yZ2J0b3JnYiAtIFJHQiB0byBSR0IgQmxlbmRpbmcKKyAqIEBtYXRyaXg6IEJsZW5kaW5nIHZhbHVlcyhTMTJROCBmb3JtYXQpCisgKiAgICAgICAgICAgICAgW1JSXSBbR1JdIFtCUl0KKyAqICAgICAgICAgICAgICBbUkddIFtHR10gW0JHXQorICogICAgICAgICAgICAgIFtSQl0gW0dCXSBbQkJdCisgKiBAb2Zmc2V0OiBCbGVuZGluZyBvZmZzZXQgdmFsdWUgZm9yIFIsRyxCIGluIDIncyBjb21wbGVtZW50IGludGVnZXIgZm9ybWF0LgorICovCitzdHJ1Y3Qgb21hcDNpc3BfcHJldl9yZ2J0b3JnYiB7CisJX191MTYgbWF0cml4W09NQVAzSVNQX1JHQl9NQVhdW09NQVAzSVNQX1JHQl9NQVhdOworCV9fdTE2IG9mZnNldFtPTUFQM0lTUF9SR0JfTUFYXTsKK307CisKKy8qKgorICogc3RydWN0IG9tYXAzaXNwX3ByZXZfY3NjIC0gQ29sb3IgU3BhY2UgQ29udmVyc2lvbiBmcm9tIFJHQi1ZQ2JZQ3IKKyAqIEBtYXRyaXg6IENvbG9yIHNwYWNlIGNvbnZlcnNpb24gY29lZmZpY2llbnRzKFMxMFE4KQorICogICAgICAgICAgICAgIFtDU0NSWV0gIFtDU0NHWV0gIFtDU0NCWV0KKyAqICAgICAgICAgICAgICBbQ1NDUkNCXSBbQ1NDR0NCXSBbQ1NDQkNCXQorICogICAgICAgICAgICAgIFtDU0NSQ1JdIFtDU0NHQ1JdIFtDU0NCQ1JdCisgKiBAb2Zmc2V0OiBDU0Mgb2Zmc2V0IHZhbHVlcyBmb3IgWSBvZmZzZXQsIENCIG9mZnNldCBhbmQgQ1Igb2Zmc2V0IHJlc3BlY3RpdmVseQorICovCitzdHJ1Y3Qgb21hcDNpc3BfcHJldl9jc2MgeworCV9fdTE2IG1hdHJpeFtPTUFQM0lTUF9SR0JfTUFYXVtPTUFQM0lTUF9SR0JfTUFYXTsKKwlfX3MxNiBvZmZzZXRbT01BUDNJU1BfUkdCX01BWF07Cit9OworCisvKioKKyAqIHN0cnVjdCBvbWFwM2lzcF9wcmV2X3ljbGltaXQgLSBZLCBDIFZhbHVlIExpbWl0CisgKiBAbWluQzogTWluaW11bSBDIHZhbHVlCisgKiBAbWF4QzogTWF4aW11bSBDIHZhbHVlCisgKiBAbWluWTogTWluaW11bSBZIHZhbHVlCisgKiBAbWF4WTogTWF4aW11bSBZIHZhbHVlCisgKi8KK3N0cnVjdCBvbWFwM2lzcF9wcmV2X3ljbGltaXQgeworCV9fdTggbWluQzsKKwlfX3U4IG1heEM7CisJX191OCBtaW5ZOworCV9fdTggbWF4WTsKK307CisKKy8qKgorICogc3RydWN0IG9tYXAzaXNwX3ByZXZfZGNvciAtIERlZmVjdCBjb3JyZWN0aW9uCisgKiBAY291cGxldF9tb2RlX2VuOiBGbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBjb3VwbGV0IGRjIENvcnJlY3Rpb24gaW4gTkYKKyAqIEBkZXRlY3RfY29ycmVjdDogVGhyZXNob2xkcyBmb3IgY29ycmVjdGlvbiBiaXQgMDoxMCBkZXRlY3QgMTY6MjUgY29ycmVjdAorICovCitzdHJ1Y3Qgb21hcDNpc3BfcHJldl9kY29yIHsKKwlfX3U4IGNvdXBsZXRfbW9kZV9lbjsKKwlfX3UzMiBkZXRlY3RfY29ycmVjdFtPTUFQM0lTUF9QUkVWX0RFVEVDVF9DT1JSRUNUX0NIQU5ORUxTXTsKK307CisKKy8qKgorICogc3RydWN0IG9tYXAzaXNwX3ByZXZfbmYgLSBOb2lzZSBGaWx0ZXIKKyAqIEBzcHJlYWQ6IFNwcmVhZCB2YWx1ZSB0byBiZSB1c2VkIGluIE5vaXNlIEZpbHRlcgorICogQHRhYmxlOiBQb2ludGVyIHRvIHRoZSBOb2lzZSBGaWx0ZXIgdGFibGUKKyAqLworc3RydWN0IG9tYXAzaXNwX3ByZXZfbmYgeworCV9fdTggc3ByZWFkOworCV9fdTMyIHRhYmxlW09NQVAzSVNQX1BSRVZfTkZfVEJMX1NJWkVdOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3BfcHJldl9ndGFibGVzIC0gR2FtbWEgY29ycmVjdGlvbiB0YWJsZXMKKyAqIEByZWQ6IEFycmF5IGZvciByZWQgZ2FtbWEgdGFibGUuCisgKiBAZ3JlZW46IEFycmF5IGZvciBncmVlbiBnYW1tYSB0YWJsZS4KKyAqIEBibHVlOiBBcnJheSBmb3IgYmx1ZSBnYW1tYSB0YWJsZS4KKyAqLworc3RydWN0IG9tYXAzaXNwX3ByZXZfZ3RhYmxlcyB7CisJX191MzIgcmVkW09NQVAzSVNQX1BSRVZfR0FNTUFfVEJMX1NJWkVdOworCV9fdTMyIGdyZWVuW09NQVAzSVNQX1BSRVZfR0FNTUFfVEJMX1NJWkVdOworCV9fdTMyIGJsdWVbT01BUDNJU1BfUFJFVl9HQU1NQV9UQkxfU0laRV07Cit9OworCisvKioKKyAqIHN0cnVjdCBvbWFwM2lzcF9wcmV2X2x1bWEgLSBMdW1hIGVuaGFuY2VtZW50CisgKiBAdGFibGU6IEFycmF5IGZvciBsdW1hIGVuaGFuY2VtZW50IHRhYmxlLgorICovCitzdHJ1Y3Qgb21hcDNpc3BfcHJldl9sdW1hIHsKKwlfX3UzMiB0YWJsZVtPTUFQM0lTUF9QUkVWX1lFTkhfVEJMX1NJWkVdOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3BfcHJldl91cGRhdGVfY29uZmlnIC0gUHJldmlldyBlbmdpbmUgY29uZmlndXJhdGlvbiAodXNlcikKKyAqIEB1cGRhdGU6IFNwZWNpZmllcyB3aGljaCBJU1AgUHJldmlldyByZWdpc3RlcnMgc2hvdWxkIGJlIHVwZGF0ZWQuCisgKiBAZmxhZzogU3BlY2lmaWVzIHdoaWNoIElTUCBQcmV2aWV3IGZ1bmN0aW9ucyBzaG91bGQgYmUgZW5hYmxlZC4KKyAqIEBzaGFkaW5nX3NoaWZ0OiAzYml0IHZhbHVlIG9mIHNoaWZ0IHVzZWQgaW4gc2hhZGluZyBjb21wZW5zYXRpb24uCisgKiBAbHVtYTogUG9pbnRlciB0byBsdW1hIGVuaGFuY2VtZW50IHN0cnVjdHVyZS4KKyAqIEBobWVkOiBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBvZGQgYW5kIGV2ZW4gZGlzdGFuY2UuCisgKiAgICAgICAgYmV0d2VlbiB0aGUgcGl4ZWxzIGluIHRoZSBpbWFnZSBhbG9uZyB3aXRoIHRoZSBmaWx0ZXIgdGhyZXNob2xkLgorICogQGNmYTogUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgQ0ZBIGludGVycG9sYXRpb24gdGFibGUsIENGQS4KKyAqICAgICAgIGZvcm1hdCBpbiB0aGUgaW1hZ2UsIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGdyYWRpZW50IHRocmVzaG9sZC4KKyAqIEBjc3VwOiBQb2ludGVyIHRvIFN0cnVjdHVyZSBmb3IgQ2hyb21pbmFuY2UgU3VwcHJlc3Npb24gY29lZmZpY2llbnRzLgorICogQHdiYWw6IFBvaW50ZXIgdG8gc3RydWN0dXJlIGZvciBXaGl0ZSBCYWxhbmNlLgorICogQGJsa2FkajogUG9pbnRlciB0byBzdHJ1Y3R1cmUgZm9yIEJsYWNrIEFkanVzdG1lbnQuCisgKiBAcmdiMnJnYjogUG9pbnRlciB0byBzdHJ1Y3R1cmUgZm9yIFJHQiB0byBSR0IgQmxlbmRpbmcuCisgKiBAY3NjOiBQb2ludGVyIHRvIHN0cnVjdHVyZSBmb3IgQ29sb3IgU3BhY2UgQ29udmVyc2lvbiBmcm9tIFJHQi1ZQ2JZQ3IuCisgKiBAeWNsaW1pdDogUG9pbnRlciB0byBzdHJ1Y3R1cmUgZm9yIFksIEMgVmFsdWUgTGltaXQuCisgKiBAZGNvcjogUG9pbnRlciB0byBzdHJ1Y3R1cmUgZm9yIGRlZmVjdCBjb3JyZWN0aW9uLgorICogQG5mOiBQb2ludGVyIHRvIHN0cnVjdHVyZSBmb3IgTm9pc2UgRmlsdGVyCisgKiBAZ2FtbWE6IFBvaW50ZXIgdG8gZ2FtbWEgc3RydWN0dXJlLgorICovCitzdHJ1Y3Qgb21hcDNpc3BfcHJldl91cGRhdGVfY29uZmlnIHsKKwlfX3UzMiB1cGRhdGU7CisJX191MzIgZmxhZzsKKwlfX3UzMiBzaGFkaW5nX3NoaWZ0OworCXN0cnVjdCBvbWFwM2lzcF9wcmV2X2x1bWEgKmx1bWE7CisJc3RydWN0IG9tYXAzaXNwX3ByZXZfaG1lZCAqaG1lZDsKKwlzdHJ1Y3Qgb21hcDNpc3BfcHJldl9jZmEgKmNmYTsKKwlzdHJ1Y3Qgb21hcDNpc3BfcHJldl9jc3VwICpjc3VwOworCXN0cnVjdCBvbWFwM2lzcF9wcmV2X3diYWwgKndiYWw7CisJc3RydWN0IG9tYXAzaXNwX3ByZXZfYmxrYWRqICpibGthZGo7CisJc3RydWN0IG9tYXAzaXNwX3ByZXZfcmdidG9yZ2IgKnJnYjJyZ2I7CisJc3RydWN0IG9tYXAzaXNwX3ByZXZfY3NjICpjc2M7CisJc3RydWN0IG9tYXAzaXNwX3ByZXZfeWNsaW1pdCAqeWNsaW1pdDsKKwlzdHJ1Y3Qgb21hcDNpc3BfcHJldl9kY29yICpkY29yOworCXN0cnVjdCBvbWFwM2lzcF9wcmV2X25mICpuZjsKKwlzdHJ1Y3Qgb21hcDNpc3BfcHJldl9ndGFibGVzICpnYW1tYTsKK307CisKKyNlbmRpZgkvKiBPTUFQM19JU1BfVVNFUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L29tYXBmYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9vbWFwZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzNkNTg5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9vbWFwZmIuaApAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIEZpbGU6IGluY2x1ZGUvbGludXgvb21hcGZiLmgKKyAqCisgKiBGcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIFRJIE9NQVAgYm9hcmRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfT01BUEZCX0hfXworI2RlZmluZSBfX0xJTlVYX09NQVBGQl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBJT0NUTCBjb21tYW5kcy4gKi8KKworI2RlZmluZSBPTUFQX0lPVyhudW0sIGR0eXBlKQlfSU9XKCdPJywgbnVtLCBkdHlwZSkKKyNkZWZpbmUgT01BUF9JT1IobnVtLCBkdHlwZSkJX0lPUignTycsIG51bSwgZHR5cGUpCisjZGVmaW5lIE9NQVBfSU9XUihudW0sIGR0eXBlKQlfSU9XUignTycsIG51bSwgZHR5cGUpCisjZGVmaW5lIE9NQVBfSU8obnVtKQkJX0lPKCdPJywgbnVtKQorCisjZGVmaW5lIE9NQVBGQl9NSVJST1IJCU9NQVBfSU9XKDMxLCBpbnQpCisjZGVmaW5lIE9NQVBGQl9TWU5DX0dGWAkJT01BUF9JTygzNykKKyNkZWZpbmUgT01BUEZCX1ZTWU5DCQlPTUFQX0lPKDM4KQorI2RlZmluZSBPTUFQRkJfU0VUX1VQREFURV9NT0RFCU9NQVBfSU9XKDQwLCBpbnQpCisjZGVmaW5lIE9NQVBGQl9HRVRfQ0FQUwkJT01BUF9JT1IoNDIsIHN0cnVjdCBvbWFwZmJfY2FwcykKKyNkZWZpbmUgT01BUEZCX0dFVF9VUERBVEVfTU9ERQlPTUFQX0lPVyg0MywgaW50KQorI2RlZmluZSBPTUFQRkJfTENEX1RFU1QJCU9NQVBfSU9XKDQ1LCBpbnQpCisjZGVmaW5lIE9NQVBGQl9DVFJMX1RFU1QJT01BUF9JT1coNDYsIGludCkKKyNkZWZpbmUgT01BUEZCX1VQREFURV9XSU5ET1dfT0xEIE9NQVBfSU9XKDQ3LCBzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3dfb2xkKQorI2RlZmluZSBPTUFQRkJfU0VUX0NPTE9SX0tFWQlPTUFQX0lPVyg1MCwgc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkpCisjZGVmaW5lIE9NQVBGQl9HRVRfQ09MT1JfS0VZCU9NQVBfSU9XKDUxLCBzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleSkKKyNkZWZpbmUgT01BUEZCX1NFVFVQX1BMQU5FCU9NQVBfSU9XKDUyLCBzdHJ1Y3Qgb21hcGZiX3BsYW5lX2luZm8pCisjZGVmaW5lIE9NQVBGQl9RVUVSWV9QTEFORQlPTUFQX0lPVyg1Mywgc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvKQorI2RlZmluZSBPTUFQRkJfVVBEQVRFX1dJTkRPVwlPTUFQX0lPVyg1NCwgc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93KQorI2RlZmluZSBPTUFQRkJfU0VUVVBfTUVNCU9NQVBfSU9XKDU1LCBzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvKQorI2RlZmluZSBPTUFQRkJfUVVFUllfTUVNCU9NQVBfSU9XKDU2LCBzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvKQorI2RlZmluZSBPTUFQRkJfV0FJVEZPUlZTWU5DCU9NQVBfSU8oNTcpCisjZGVmaW5lIE9NQVBGQl9NRU1PUllfUkVBRAlPTUFQX0lPUig1OCwgc3RydWN0IG9tYXBmYl9tZW1vcnlfcmVhZCkKKyNkZWZpbmUgT01BUEZCX0dFVF9PVkVSTEFZX0NPTE9STU9ERSBPTUFQX0lPUig1OSwgc3RydWN0IG9tYXBmYl9vdmxfY29sb3Jtb2RlKQorI2RlZmluZSBPTUFQRkJfV0FJVEZPUkdPCU9NQVBfSU8oNjApCisjZGVmaW5lIE9NQVBGQl9HRVRfVlJBTV9JTkZPCU9NQVBfSU9SKDYxLCBzdHJ1Y3Qgb21hcGZiX3ZyYW1faW5mbykKKyNkZWZpbmUgT01BUEZCX1NFVF9URUFSU1lOQwlPTUFQX0lPVyg2Miwgc3RydWN0IG9tYXBmYl90ZWFyc3luY19pbmZvKQorI2RlZmluZSBPTUFQRkJfR0VUX0RJU1BMQVlfSU5GTwlPTUFQX0lPUig2Mywgc3RydWN0IG9tYXBmYl9kaXNwbGF5X2luZm8pCisKKyNkZWZpbmUgT01BUEZCX0NBUFNfR0VORVJJQ19NQVNLCTB4MDAwMDBmZmYKKyNkZWZpbmUgT01BUEZCX0NBUFNfTENEQ19NQVNLCQkweDAwZmZmMDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1BBTkVMX01BU0sJCTB4ZmYwMDAwMDAKKworI2RlZmluZSBPTUFQRkJfQ0FQU19NQU5VQUxfVVBEQVRFCTB4MDAwMDEwMDAKKyNkZWZpbmUgT01BUEZCX0NBUFNfVEVBUlNZTkMJCTB4MDAwMDIwMDAKKyNkZWZpbmUgT01BUEZCX0NBUFNfUExBTkVfUkVMT0NBVEVfTUVNCTB4MDAwMDQwMDAKKyNkZWZpbmUgT01BUEZCX0NBUFNfUExBTkVfU0NBTEUJCTB4MDAwMDgwMDAKKyNkZWZpbmUgT01BUEZCX0NBUFNfV0lORE9XX1BJWEVMX0RPVUJMRQkweDAwMDEwMDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1dJTkRPV19TQ0FMRQkweDAwMDIwMDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1dJTkRPV19PVkVSTEFZCTB4MDAwNDAwMDAKKyNkZWZpbmUgT01BUEZCX0NBUFNfV0lORE9XX1JPVEFURQkweDAwMDgwMDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1NFVF9CQUNLTElHSFQJMHgwMTAwMDAwMAorCisvKiBWYWx1ZXMgZnJvbSBEU1AgbXVzdCBtYXAgdG8gbG93ZXIgMTYtYml0cyAqLworI2RlZmluZSBPTUFQRkJfRk9STUFUX01BU0sJCTB4MDBmZgorI2RlZmluZSBPTUFQRkJfRk9STUFUX0ZMQUdfRE9VQkxFCTB4MDEwMAorI2RlZmluZSBPTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkMJMHgwMjAwCisjZGVmaW5lIE9NQVBGQl9GT1JNQVRfRkxBR19GT1JDRV9WU1lOQwkweDA0MDAKKyNkZWZpbmUgT01BUEZCX0ZPUk1BVF9GTEFHX0VOQUJMRV9PVkVSTEFZCTB4MDgwMAorI2RlZmluZSBPTUFQRkJfRk9STUFUX0ZMQUdfRElTQUJMRV9PVkVSTEFZCTB4MTAwMAorCisjZGVmaW5lIE9NQVBGQl9NRU1UWVBFX1NEUkFNCQkwCisjZGVmaW5lIE9NQVBGQl9NRU1UWVBFX1NSQU0JCTEKKyNkZWZpbmUgT01BUEZCX01FTVRZUEVfTUFYCQkxCisKKyNkZWZpbmUgT01BUEZCX01FTV9JRFhfRU5BQkxFRAkweDgwCisjZGVmaW5lIE9NQVBGQl9NRU1fSURYX01BU0sJMHg3ZgorCitlbnVtIG9tYXBmYl9jb2xvcl9mb3JtYXQgeworCU9NQVBGQl9DT0xPUl9SR0I1NjUgPSAwLAorCU9NQVBGQl9DT0xPUl9ZVVY0MjIsCisJT01BUEZCX0NPTE9SX1lVVjQyMCwKKwlPTUFQRkJfQ09MT1JfQ0xVVF84QlBQLAorCU9NQVBGQl9DT0xPUl9DTFVUXzRCUFAsCisJT01BUEZCX0NPTE9SX0NMVVRfMkJQUCwKKwlPTUFQRkJfQ09MT1JfQ0xVVF8xQlBQLAorCU9NQVBGQl9DT0xPUl9SR0I0NDQsCisJT01BUEZCX0NPTE9SX1lVWTQyMiwKKworCU9NQVBGQl9DT0xPUl9BUkdCMTYsCisJT01BUEZCX0NPTE9SX1JHQjI0VSwJLyogUkdCMjQsIDMyLWJpdCBjb250YWluZXIgKi8KKwlPTUFQRkJfQ09MT1JfUkdCMjRQLAkvKiBSR0IyNCwgMjQtYml0IGNvbnRhaW5lciAqLworCU9NQVBGQl9DT0xPUl9BUkdCMzIsCisJT01BUEZCX0NPTE9SX1JHQkEzMiwKKwlPTUFQRkJfQ09MT1JfUkdCWDMyLAorfTsKKworc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93IHsKKwlfX3UzMiB4LCB5OworCV9fdTMyIHdpZHRoLCBoZWlnaHQ7CisJX191MzIgZm9ybWF0OworCV9fdTMyIG91dF94LCBvdXRfeTsKKwlfX3UzMiBvdXRfd2lkdGgsIG91dF9oZWlnaHQ7CisJX191MzIgcmVzZXJ2ZWRbOF07Cit9OworCitzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3dfb2xkIHsKKwlfX3UzMiB4LCB5OworCV9fdTMyIHdpZHRoLCBoZWlnaHQ7CisJX191MzIgZm9ybWF0OworfTsKKworZW51bSBvbWFwZmJfcGxhbmUgeworCU9NQVBGQl9QTEFORV9HRlggPSAwLAorCU9NQVBGQl9QTEFORV9WSUQxLAorCU9NQVBGQl9QTEFORV9WSUQyLAorfTsKKworZW51bSBvbWFwZmJfY2hhbm5lbF9vdXQgeworCU9NQVBGQl9DSEFOTkVMX09VVF9MQ0QgPSAwLAorCU9NQVBGQl9DSEFOTkVMX09VVF9ESUdJVCwKK307CisKK3N0cnVjdCBvbWFwZmJfcGxhbmVfaW5mbyB7CisJX191MzIgcG9zX3g7CisJX191MzIgcG9zX3k7CisJX191OCAgZW5hYmxlZDsKKwlfX3U4ICBjaGFubmVsX291dDsKKwlfX3U4ICBtaXJyb3I7CisJX191OCAgbWVtX2lkeDsKKwlfX3UzMiBvdXRfd2lkdGg7CisJX191MzIgb3V0X2hlaWdodDsKKwlfX3UzMiByZXNlcnZlZDJbMTJdOworfTsKKworc3RydWN0IG9tYXBmYl9tZW1faW5mbyB7CisJX191MzIgc2l6ZTsKKwlfX3U4ICB0eXBlOworCV9fdTggIHJlc2VydmVkWzNdOworfTsKKworc3RydWN0IG9tYXBmYl9jYXBzIHsKKwlfX3UzMiBjdHJsOworCV9fdTMyIHBsYW5lX2NvbG9yOworCV9fdTMyIHduZF9jb2xvcjsKK307CisKK2VudW0gb21hcGZiX2NvbG9yX2tleV90eXBlIHsKKwlPTUFQRkJfQ09MT1JfS0VZX0RJU0FCTEVEID0gMCwKKwlPTUFQRkJfQ09MT1JfS0VZX0dGWF9EU1QsCisJT01BUEZCX0NPTE9SX0tFWV9WSURfU1JDLAorfTsKKworc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkgeworCV9fdTggIGNoYW5uZWxfb3V0OworCV9fdTMyIGJhY2tncm91bmQ7CisJX191MzIgdHJhbnNfa2V5OworCV9fdTggIGtleV90eXBlOworfTsKKworZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgeworCU9NQVBGQl9VUERBVEVfRElTQUJMRUQgPSAwLAorCU9NQVBGQl9BVVRPX1VQREFURSwKKwlPTUFQRkJfTUFOVUFMX1VQREFURQorfTsKKworc3RydWN0IG9tYXBmYl9tZW1vcnlfcmVhZCB7CisJX191MTYgeDsKKwlfX3UxNiB5OworCV9fdTE2IHc7CisJX191MTYgaDsKKwlzaXplX3QgYnVmZmVyX3NpemU7CisJdm9pZCAqYnVmZmVyOworfTsKKworc3RydWN0IG9tYXBmYl9vdmxfY29sb3Jtb2RlIHsKKwlfX3U4IG92ZXJsYXlfaWR4OworCV9fdTggbW9kZV9pZHg7CisJX191MzIgYml0c19wZXJfcGl4ZWw7CisJX191MzIgbm9uc3RkOworCXN0cnVjdCBmYl9iaXRmaWVsZCByZWQ7CisJc3RydWN0IGZiX2JpdGZpZWxkIGdyZWVuOworCXN0cnVjdCBmYl9iaXRmaWVsZCBibHVlOworCXN0cnVjdCBmYl9iaXRmaWVsZCB0cmFuc3A7Cit9OworCitzdHJ1Y3Qgb21hcGZiX3ZyYW1faW5mbyB7CisJX191MzIgdG90YWw7CisJX191MzIgZnJlZTsKKwlfX3UzMiBsYXJnZXN0X2ZyZWVfYmxvY2s7CisJX191MzIgcmVzZXJ2ZWRbNV07Cit9OworCitzdHJ1Y3Qgb21hcGZiX3RlYXJzeW5jX2luZm8geworCV9fdTggZW5hYmxlZDsKKwlfX3U4IHJlc2VydmVkMVszXTsKKwlfX3UxNiBsaW5lOworCV9fdTE2IHJlc2VydmVkMjsKK307CisKK3N0cnVjdCBvbWFwZmJfZGlzcGxheV9pbmZvIHsKKwlfX3UxNiB4cmVzOworCV9fdTE2IHlyZXM7CisJX191MzIgd2lkdGg7CS8qIHBoeXMgd2lkdGggb2YgdGhlIGRpc3BsYXkgaW4gbWljcm9tZXRlcnMgKi8KKwlfX3UzMiBoZWlnaHQ7CS8qIHBoeXMgaGVpZ2h0IG9mIHRoZSBkaXNwbGF5IGluIG1pY3JvbWV0ZXJzICovCisJX191MzIgcmVzZXJ2ZWRbNV07Cit9OworCisKKyNlbmRpZiAvKiBfX09NQVBGQl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L29vbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9vb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTZkZGQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9vb20uaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9fSU5DTFVERV9MSU5VWF9PT01fSAorI2RlZmluZSBfX0lOQ0xVREVfTElOVVhfT09NX0gKKworLyoKKyAqIC9wcm9jLzxwaWQ+L29vbV9hZGogaXMgZGVwcmVjYXRlZCwgc2VlCisgKiBEb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQuCisgKgorICogL3Byb2MvPHBpZD4vb29tX2FkaiBzZXQgdG8gLTE3IHByb3RlY3RzIGZyb20gdGhlIG9vbS1raWxsZXIKKyAqLworI2RlZmluZSBPT01fRElTQUJMRSAoLTE3KQorLyogaW5jbHVzaXZlICovCisjZGVmaW5lIE9PTV9BREpVU1RfTUlOICgtMTYpCisjZGVmaW5lIE9PTV9BREpVU1RfTUFYIDE1CisKKy8qCisgKiAvcHJvYy88cGlkPi9vb21fc2NvcmVfYWRqIHNldCB0byBPT01fU0NPUkVfQURKX01JTiBkaXNhYmxlcyBvb20ga2lsbGluZyBmb3IKKyAqIHBpZC4KKyAqLworI2RlZmluZSBPT01fU0NPUkVfQURKX01JTgkoLTEwMDApCisjZGVmaW5lIE9PTV9TQ09SRV9BREpfTUFYCTEwMDAKKworI2VuZGlmIC8qIF9JTkNMVURFX0xJTlVYX09PTV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BhcmFtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyZTkyZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGFyYW0uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX0xJTlVYX1BBUkFNX0gKKyNkZWZpbmUgX0xJTlVYX1BBUkFNX0gKKworI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGFycG9ydC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wYXJwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkNDQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGFycG9ydC5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBBbnkgcGFydCBvZiB0aGlzIHByb2dyYW0gbWF5IGJlIHVzZWQgaW4gZG9jdW1lbnRzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlLCBWZXJzaW9uIDEuMSBvciBhbnkgbGF0ZXIgdmVyc2lvbgorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfUEFSUE9SVF9IXworI2RlZmluZSBfUEFSUE9SVF9IXworCisvKiBTdGFydCBvZmYgd2l0aCB1c2VyLXZpc2libGUgY29uc3RhbnRzICovCisKKy8qIE1heGltdW0gb2YgMTYgcG9ydHMgcGVyIG1hY2hpbmUgKi8KKyNkZWZpbmUgUEFSUE9SVF9NQVggIDE2CisKKy8qIE1hZ2ljIG51bWJlcnMgKi8KKyNkZWZpbmUgUEFSUE9SVF9JUlFfTk9ORSAgLTEKKyNkZWZpbmUgUEFSUE9SVF9ETUFfTk9ORSAgLTEKKyNkZWZpbmUgUEFSUE9SVF9JUlFfQVVUTyAgLTIKKyNkZWZpbmUgUEFSUE9SVF9ETUFfQVVUTyAgLTIKKyNkZWZpbmUgUEFSUE9SVF9ETUFfTk9GSUZPIC0zCisjZGVmaW5lIFBBUlBPUlRfRElTQUJMRSAgIC0yCisjZGVmaW5lIFBBUlBPUlRfSVJRX1BST0JFT05MWSAtMworI2RlZmluZSBQQVJQT1JUX0lPSElfQVVUTyAtMQorCisjZGVmaW5lIFBBUlBPUlRfQ09OVFJPTF9TVFJPQkUgICAgMHgxCisjZGVmaW5lIFBBUlBPUlRfQ09OVFJPTF9BVVRPRkQgICAgMHgyCisjZGVmaW5lIFBBUlBPUlRfQ09OVFJPTF9JTklUICAgICAgMHg0CisjZGVmaW5lIFBBUlBPUlRfQ09OVFJPTF9TRUxFQ1QgICAgMHg4CisKKyNkZWZpbmUgUEFSUE9SVF9TVEFUVVNfRVJST1IgICAgICAweDgKKyNkZWZpbmUgUEFSUE9SVF9TVEFUVVNfU0VMRUNUICAgICAweDEwCisjZGVmaW5lIFBBUlBPUlRfU1RBVFVTX1BBUEVST1VUICAgMHgyMAorI2RlZmluZSBQQVJQT1JUX1NUQVRVU19BQ0sgICAgICAgIDB4NDAKKyNkZWZpbmUgUEFSUE9SVF9TVEFUVVNfQlVTWSAgICAgICAweDgwCisKKy8qIFR5cGUgY2xhc3NlcyBmb3IgUGx1Zy1hbmQtUGxheSBwcm9iZS4gICovCit0eXBlZGVmIGVudW0geworCVBBUlBPUlRfQ0xBU1NfTEVHQUNZID0gMCwgICAgICAgLyogTm9uLUlFRUUxMjg0IGRldmljZSAqLworCVBBUlBPUlRfQ0xBU1NfUFJJTlRFUiwKKwlQQVJQT1JUX0NMQVNTX01PREVNLAorCVBBUlBPUlRfQ0xBU1NfTkVULAorCVBBUlBPUlRfQ0xBU1NfSERDLCAgICAgICAgICAgICAgLyogSGFyZCBkaXNrIGNvbnRyb2xsZXIgKi8KKwlQQVJQT1JUX0NMQVNTX1BDTUNJQSwKKwlQQVJQT1JUX0NMQVNTX01FRElBLCAgICAgICAgICAgIC8qIE11bHRpbWVkaWEgZGV2aWNlICovCisJUEFSUE9SVF9DTEFTU19GREMsICAgICAgICAgICAgICAvKiBGbG9wcHkgZGlzayBjb250cm9sbGVyICovCisJUEFSUE9SVF9DTEFTU19QT1JUUywKKwlQQVJQT1JUX0NMQVNTX1NDQU5ORVIsCisJUEFSUE9SVF9DTEFTU19ESUdDQU0sCisJUEFSUE9SVF9DTEFTU19PVEhFUiwgICAgICAgICAgICAvKiBBbnl0aGluZyBlbHNlICovCisJUEFSUE9SVF9DTEFTU19VTlNQRUMsICAgICAgICAgICAvKiBObyBDTFMgZmllbGQgaW4gSUQgKi8KKwlQQVJQT1JUX0NMQVNTX1NDU0lBREFQVEVSCit9IHBhcnBvcnRfZGV2aWNlX2NsYXNzOworCisvKiBUaGUgIm1vZGVzIiBlbnRyeSBpbiBwYXJwb3J0IGlzIGEgYml0IGZpZWxkIHJlcHJlc2VudGluZyB0aGUKKyAgIGNhcGFiaWxpdGllcyBvZiB0aGUgaGFyZHdhcmUuICovCisjZGVmaW5lIFBBUlBPUlRfTU9ERV9QQ1NQUAkoMTw8MCkgLyogSUJNIFBDIHJlZ2lzdGVycyBhdmFpbGFibGUuICovCisjZGVmaW5lIFBBUlBPUlRfTU9ERV9UUklTVEFURQkoMTw8MSkgLyogQ2FuIHRyaXN0YXRlLiAqLworI2RlZmluZSBQQVJQT1JUX01PREVfRVBQCSgxPDwyKSAvKiBIYXJkd2FyZSBFUFAuICovCisjZGVmaW5lIFBBUlBPUlRfTU9ERV9FQ1AJKDE8PDMpIC8qIEhhcmR3YXJlIEVDUC4gKi8KKyNkZWZpbmUgUEFSUE9SVF9NT0RFX0NPTVBBVAkoMTw8NCkgLyogSGFyZHdhcmUgJ3ByaW50ZXIgcHJvdG9jb2wnLiAqLworI2RlZmluZSBQQVJQT1JUX01PREVfRE1BCSgxPDw1KSAvKiBIYXJkd2FyZSBjYW4gRE1BLiAqLworI2RlZmluZSBQQVJQT1JUX01PREVfU0FGRUlOSU5UCSgxPDw2KSAvKiBTUFAgcmVnaXN0ZXJzIGFjY2Vzc2libGUgaW4gSVJRLiAqLworCisvKiBJRUVFMTI4NCBtb2RlczogCisgICBOaWJibGUgbW9kZSwgYnl0ZSBtb2RlLCBFQ1AsIEVDUFJMRSBhbmQgRVBQIGFyZSB0aGVpciBvd24KKyAgICdleHRlbnNpYmlsaXR5IHJlcXVlc3QnIHZhbHVlcy4gIE90aGVycyBhcmUgc3BlY2lhbC4KKyAgICdSZWFsJyBFQ1AgbW9kZXMgbXVzdCBoYXZlIHRoZSBJRUVFMTI4NF9NT0RFX0VDUCBiaXQgc2V0LiAgKi8KKyNkZWZpbmUgSUVFRTEyODRfTU9ERV9OSUJCTEUgICAgICAgICAgICAgMAorI2RlZmluZSBJRUVFMTI4NF9NT0RFX0JZVEUgICAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBJRUVFMTI4NF9NT0RFX0NPTVBBVCAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBJRUVFMTI4NF9NT0RFX0JFQ1AgICAgICAgICAgICAgICgxPDw5KSAvKiBCb3VuZGVkIEVDUCBtb2RlICovCisjZGVmaW5lIElFRUUxMjg0X01PREVfRUNQICAgICAgICAgICAgICAgKDE8PDQpCisjZGVmaW5lIElFRUUxMjg0X01PREVfRUNQUkxFICAgICAgICAgICAgKElFRUUxMjg0X01PREVfRUNQIHwgKDE8PDUpKQorI2RlZmluZSBJRUVFMTI4NF9NT0RFX0VDUFNXRSAgICAgICAgICAgICgxPDwxMCkgLyogU29mdHdhcmUtZW11bGF0ZWQgKi8KKyNkZWZpbmUgSUVFRTEyODRfTU9ERV9FUFAgICAgICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgSUVFRTEyODRfTU9ERV9FUFBTTCAgICAgICAgICAgICAoMTw8MTEpIC8qIEVQUCAxLjcgKi8KKyNkZWZpbmUgSUVFRTEyODRfTU9ERV9FUFBTV0UgICAgICAgICAgICAoMTw8MTIpIC8qIFNvZnR3YXJlLWVtdWxhdGVkICovCisjZGVmaW5lIElFRUUxMjg0X0RFVklDRUlEICAgICAgICAgICAgICAgKDE8PDIpICAvKiBUaGlzIGlzIGEgZmxhZyAqLworI2RlZmluZSBJRUVFMTI4NF9FWFRfTElOSyAgICAgICAgICAgICAgICgxPDwxNCkgLyogVGhpcyBmbGFnIGNhdXNlcyB0aGUKKwkJCQkJCSAqIGV4dGVuc2liaWxpdHkgbGluayB0bworCQkJCQkJICogYmUgcmVxdWVzdGVkLCB1c2luZworCQkJCQkJICogYml0cyAwLTYuICovCisKKy8qIEZvciB0aGUgYmVuZWZpdCBvZiBwYXJwb3J0X3JlYWQvd3JpdGUsIHlvdSBjYW4gdXNlIHRoZXNlIHdpdGgKKyAqIHBhcnBvcnRfbmVnb3RpYXRlIHRvIHVzZSBhZGRyZXNzIG9wZXJhdGlvbnMuICBUaGV5IGhhdmUgbm8gZWZmZWN0CisgKiBvdGhlciB0aGFuIHRvIG1ha2UgcGFycG9ydF9yZWFkL3dyaXRlIHVzZSBhZGRyZXNzIHRyYW5zZmVycy4gKi8KKyNkZWZpbmUgSUVFRTEyODRfQUREUgkJCSgxPDwxMykJLyogVGhpcyBpcyBhIGZsYWcgKi8KKyNkZWZpbmUgSUVFRTEyODRfREFUQQkJCSAwCS8qIFNvIGlzIHRoaXMgKi8KKworLyogRmxhZ3MgZm9yIGJsb2NrIHRyYW5zZmVyIG9wZXJhdGlvbnMuICovCisjZGVmaW5lIFBBUlBPUlRfRVBQX0ZBU1QJCSgxPDwwKSAvKiBVbnJlbGlhYmxlIGNvdW50cy4gKi8KKyNkZWZpbmUgUEFSUE9SVF9XOTEyODRQSUMJCSgxPDwxKSAvKiBoYXZlIGEgV2FycDkgdzkxMjg0cGljIGluIHRoZSBkZXZpY2UgKi8KKworLyogVGhlIHJlc3QgaXMgZm9yIHRoZSBrZXJuZWwgb25seSAqLworI2VuZGlmIC8qIF9QQVJQT1JUX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BhdGNoa2V5LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BhdGNoa2V5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4MTBkZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGF0Y2hrZXkuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogPGxpbnV4L3BhdGNoa2V5Lmg+IC0tIGRlZmluaXRpb24gb2YgX1BBVENIS0VZIG1hY3JvCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFN0dWFydCBCcmFkeQorICoKKyAqIFRoaXMgZXhpc3RzIGJlY2F1c2UgYXdlX3ZvaWNlLmggZGVmaW5lZCBpdHMgb3duIF9QQVRDSEtFWSBhbmQgaXQgd2Fzbid0CisgKiBjbGVhciB3aGV0aGVyIHJlbW92aW5nIHRoaXMgd291bGQgYnJlYWsgYW55dGhpbmcgaW4gdXNlcnNwYWNlLgorICoKKyAqIERvIG5vdCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gIFBsZWFzZSB1c2UgPHN5cy9zb3VuZGNhcmQuaD4gaW5zdGVhZC4KKyAqIEZvciBrZXJuZWwgY29kZSwgdXNlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9QQVRDSEtFWV9IX0lORElSRUNUCisjZXJyb3IgInBhdGNoa2V5LmggaW5jbHVkZWQgZGlyZWN0bHkiCisjZW5kaWYKKworI2lmbmRlZiBfTElOVVhfUEFUQ0hLRVlfSAorI2RlZmluZSBfTElOVVhfUEFUQ0hLRVlfSAorCisvKiBFbmRpYW4gbWFjcm9zLiAqLworIyAgaW5jbHVkZSA8ZW5kaWFuLmg+CisKKyNpZiAgIGRlZmluZWQoX19CWVRFX09SREVSKQorIyAgaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyAgICBkZWZpbmUgX1BBVENIS0VZKGlkKSAoMHhmZDAwfGlkKQorIyAgZWxpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICAgIGRlZmluZSBfUEFUQ0hLRVkoaWQpICgoaWQ8PDgpfDB4MDBmZCkKKyMgIGVsc2UKKyMgICAgZXJyb3IgImNvdWxkIG5vdCBkZXRlcm1pbmUgYnl0ZSBvcmRlciIKKyMgIGVuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU5VWF9QQVRDSEtFWV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BjaS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWJiNWM3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtMCwwICsxLDQxIEBACisvKgorICoJcGNpLmgKKyAqCisgKglQQ0kgZGVmaW5lcyBhbmQgZnVuY3Rpb24gcHJvdG90eXBlcworICoJQ29weXJpZ2h0IDE5OTQsIERyZXcgRWNraGFyZHQKKyAqCUNvcHlyaWdodCAxOTk3LS0xOTk5IE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6PgorICoKKyAqCUZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY29uc3VsdCB0aGUgZm9sbG93aW5nIG1hbnVhbHMgKGxvb2sgYXQKKyAqCWh0dHA6Ly93d3cucGNpc2lnLmNvbS8gZm9yIGhvdyB0byBnZXQgdGhlbSk6CisgKgorICoJUENJIEJJT1MgU3BlY2lmaWNhdGlvbgorICoJUENJIExvY2FsIEJ1cyBTcGVjaWZpY2F0aW9uCisgKglQQ0kgdG8gUENJIEJyaWRnZSBTcGVjaWZpY2F0aW9uCisgKglQQ0kgU3lzdGVtIERlc2lnbiBHdWlkZQorICovCisKKyNpZm5kZWYgTElOVVhfUENJX0gKKyNkZWZpbmUgTElOVVhfUENJX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaV9yZWdzLmg+CS8qIFRoZSBwY2kgcmVnaXN0ZXIgZGVmaW5lcyAqLworCisvKgorICogVGhlIFBDSSBpbnRlcmZhY2UgdHJlYXRzIG11bHRpLWZ1bmN0aW9uIGRldmljZXMgYXMgaW5kZXBlbmRlbnQKKyAqIGRldmljZXMuICBUaGUgc2xvdC9mdW5jdGlvbiBhZGRyZXNzIG9mIGVhY2ggZGV2aWNlIGlzIGVuY29kZWQKKyAqIGluIGEgc2luZ2xlIGJ5dGUgYXMgZm9sbG93czoKKyAqCisgKgk3OjMgPSBzbG90CisgKgkyOjAgPSBmdW5jdGlvbgorICovCisjZGVmaW5lIFBDSV9ERVZGTihzbG90LCBmdW5jKQkoKCgoc2xvdCkgJiAweDFmKSA8PCAzKSB8ICgoZnVuYykgJiAweDA3KSkKKyNkZWZpbmUgUENJX1NMT1QoZGV2Zm4pCQkoKChkZXZmbikgPj4gMykgJiAweDFmKQorI2RlZmluZSBQQ0lfRlVOQyhkZXZmbikJCSgoZGV2Zm4pICYgMHgwNykKKworLyogSW9jdGxzIGZvciAvcHJvYy9idXMvcGNpL1gvWSBub2Rlcy4gKi8KKyNkZWZpbmUgUENJSU9DX0JBU0UJCSgnUCcgPDwgMjQgfCAnQycgPDwgMTYgfCAnSScgPDwgOCkKKyNkZWZpbmUgUENJSU9DX0NPTlRST0xMRVIJKFBDSUlPQ19CQVNFIHwgMHgwMCkJLyogR2V0IGNvbnRyb2xsZXIgZm9yIFBDSSBkZXZpY2UuICovCisjZGVmaW5lIFBDSUlPQ19NTUFQX0lTX0lPCShQQ0lJT0NfQkFTRSB8IDB4MDEpCS8qIFNldCBtbWFwIHN0YXRlIHRvIEkvTyBzcGFjZS4gKi8KKyNkZWZpbmUgUENJSU9DX01NQVBfSVNfTUVNCShQQ0lJT0NfQkFTRSB8IDB4MDIpCS8qIFNldCBtbWFwIHN0YXRlIHRvIE1FTSBzcGFjZS4gKi8KKyNkZWZpbmUgUENJSU9DX1dSSVRFX0NPTUJJTkUJKFBDSUlPQ19CQVNFIHwgMHgwMykJLyogRW5hYmxlL2Rpc2FibGUgd3JpdGUtY29tYmluaW5nLiAqLworCisjZW5kaWYgLyogTElOVVhfUENJX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTFjNDEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCkBAIC0wLDAgKzEsNzM1IEBACisvKgorICoJcGNpX3JlZ3MuaAorICoKKyAqCVBDSSBzdGFuZGFyZCBkZWZpbmVzCisgKglDb3B5cmlnaHQgMTk5NCwgRHJldyBFY2toYXJkdAorICoJQ29weXJpZ2h0IDE5OTctLTE5OTkgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+CisgKgorICoJRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IHRoZSBmb2xsb3dpbmcgbWFudWFscyAobG9vayBhdAorICoJaHR0cDovL3d3dy5wY2lzaWcuY29tLyBmb3IgaG93IHRvIGdldCB0aGVtKToKKyAqCisgKglQQ0kgQklPUyBTcGVjaWZpY2F0aW9uCisgKglQQ0kgTG9jYWwgQnVzIFNwZWNpZmljYXRpb24KKyAqCVBDSSB0byBQQ0kgQnJpZGdlIFNwZWNpZmljYXRpb24KKyAqCVBDSSBTeXN0ZW0gRGVzaWduIEd1aWRlCisgKgorICogCUZvciBoeXBlcnRyYW5zcG9ydCBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgdGhlIGZvbGxvd2luZyBtYW51YWxzCisgKiAJZnJvbSBodHRwOi8vd3d3Lmh5cGVydHJhbnNwb3J0Lm9yZworICoKKyAqCVRoZSBIeXBlcnRyYW5zcG9ydCBJL08gTGluayBTcGVjaWZpY2F0aW9uCisgKi8KKworI2lmbmRlZiBMSU5VWF9QQ0lfUkVHU19ICisjZGVmaW5lIExJTlVYX1BDSV9SRUdTX0gKKworLyoKKyAqIFVuZGVyIFBDSSwgZWFjaCBkZXZpY2UgaGFzIDI1NiBieXRlcyBvZiBjb25maWd1cmF0aW9uIGFkZHJlc3Mgc3BhY2UsCisgKiBvZiB3aGljaCB0aGUgZmlyc3QgNjQgYnl0ZXMgYXJlIHN0YW5kYXJkaXplZCBhcyBmb2xsb3dzOgorICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSUQJCTB4MDAJLyogMTYgYml0cyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lECQkweDAyCS8qIDE2IGJpdHMgKi8KKyNkZWZpbmUgUENJX0NPTU1BTkQJCTB4MDQJLyogMTYgYml0cyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfSU8JCTB4MQkvKiBFbmFibGUgcmVzcG9uc2UgaW4gSS9PIHNwYWNlICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9NRU1PUlkJMHgyCS8qIEVuYWJsZSByZXNwb25zZSBpbiBNZW1vcnkgc3BhY2UgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX01BU1RFUgkweDQJLyogRW5hYmxlIGJ1cyBtYXN0ZXJpbmcgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1NQRUNJQUwJMHg4CS8qIEVuYWJsZSByZXNwb25zZSB0byBzcGVjaWFsIGN5Y2xlcyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfSU5WQUxJREFURQkweDEwCS8qIFVzZSBtZW1vcnkgd3JpdGUgYW5kIGludmFsaWRhdGUgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1ZHQV9QQUxFVFRFIDB4MjAJLyogRW5hYmxlIHBhbGV0dGUgc25vb3BpbmcgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1BBUklUWQkweDQwCS8qIEVuYWJsZSBwYXJpdHkgY2hlY2tpbmcgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1dBSVQgCTB4ODAJLyogRW5hYmxlIGFkZHJlc3MvZGF0YSBzdGVwcGluZyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfU0VSUgkweDEwMAkvKiBFbmFibGUgU0VSUiAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfRkFTVF9CQUNLCTB4MjAwCS8qIEVuYWJsZSBiYWNrLXRvLWJhY2sgd3JpdGVzICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUgMHg0MDAgLyogSU5UeCBFbXVsYXRpb24gRGlzYWJsZSAqLworCisjZGVmaW5lIFBDSV9TVEFUVVMJCTB4MDYJLyogMTYgYml0cyAqLworI2RlZmluZSAgUENJX1NUQVRVU19JTlRFUlJVUFQJMHgwOAkvKiBJbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0NBUF9MSVNUCTB4MTAJLyogU3VwcG9ydCBDYXBhYmlsaXR5IExpc3QgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfNjZNSFoJMHgyMAkvKiBTdXBwb3J0IDY2IE1oeiBQQ0kgMi4xIGJ1cyAqLworI2RlZmluZSAgUENJX1NUQVRVU19VREYJCTB4NDAJLyogU3VwcG9ydCBVc2VyIERlZmluYWJsZSBGZWF0dXJlcyBbb2Jzb2xldGVdICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0ZBU1RfQkFDSwkweDgwCS8qIEFjY2VwdCBmYXN0LWJhY2sgdG8gYmFjayAqLworI2RlZmluZSAgUENJX1NUQVRVU19QQVJJVFkJMHgxMDAJLyogRGV0ZWN0ZWQgcGFyaXR5IGVycm9yICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9NQVNLCTB4NjAwCS8qIERFVlNFTCB0aW1pbmcgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfREVWU0VMX0ZBU1QJCTB4MDAwCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9NRURJVU0JMHgyMDAKKyNkZWZpbmUgIFBDSV9TVEFUVVNfREVWU0VMX1NMT1cJCTB4NDAwCisjZGVmaW5lICBQQ0lfU1RBVFVTX1NJR19UQVJHRVRfQUJPUlQJMHg4MDAgLyogU2V0IG9uIHRhcmdldCBhYm9ydCAqLworI2RlZmluZSAgUENJX1NUQVRVU19SRUNfVEFSR0VUX0FCT1JUCTB4MTAwMCAvKiBNYXN0ZXIgYWNrIG9mICIgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUkVDX01BU1RFUl9BQk9SVAkweDIwMDAgLyogU2V0IG9uIG1hc3RlciBhYm9ydCAqLworI2RlZmluZSAgUENJX1NUQVRVU19TSUdfU1lTVEVNX0VSUk9SCTB4NDAwMCAvKiBTZXQgd2hlbiB3ZSBkcml2ZSBTRVJSICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWQkweDgwMDAgLyogU2V0IG9uIHBhcml0eSBlcnJvciAqLworCisjZGVmaW5lIFBDSV9DTEFTU19SRVZJU0lPTgkweDA4CS8qIEhpZ2ggMjQgYml0cyBhcmUgY2xhc3MsIGxvdyA4IHJldmlzaW9uICovCisjZGVmaW5lIFBDSV9SRVZJU0lPTl9JRAkJMHgwOAkvKiBSZXZpc2lvbiBJRCAqLworI2RlZmluZSBQQ0lfQ0xBU1NfUFJPRwkJMHgwOQkvKiBSZWcuIExldmVsIFByb2dyYW1taW5nIEludGVyZmFjZSAqLworI2RlZmluZSBQQ0lfQ0xBU1NfREVWSUNFCTB4MGEJLyogRGV2aWNlIGNsYXNzICovCisKKyNkZWZpbmUgUENJX0NBQ0hFX0xJTkVfU0laRQkweDBjCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfTEFURU5DWV9USU1FUgkweDBkCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfSEVBREVSX1RZUEUJCTB4MGUJLyogOCBiaXRzICovCisjZGVmaW5lICBQQ0lfSEVBREVSX1RZUEVfTk9STUFMCQkwCisjZGVmaW5lICBQQ0lfSEVBREVSX1RZUEVfQlJJREdFCQkxCisjZGVmaW5lICBQQ0lfSEVBREVSX1RZUEVfQ0FSREJVUwkyCisKKyNkZWZpbmUgUENJX0JJU1QJCTB4MGYJLyogOCBiaXRzICovCisjZGVmaW5lICBQQ0lfQklTVF9DT0RFX01BU0sJMHgwZgkvKiBSZXR1cm4gcmVzdWx0ICovCisjZGVmaW5lICBQQ0lfQklTVF9TVEFSVAkJMHg0MAkvKiAxIHRvIHN0YXJ0IEJJU1QsIDIgc2VjcyBvciBsZXNzICovCisjZGVmaW5lICBQQ0lfQklTVF9DQVBBQkxFCTB4ODAJLyogMSBpZiBCSVNUIGNhcGFibGUgKi8KKworLyoKKyAqIEJhc2UgYWRkcmVzc2VzIHNwZWNpZnkgbG9jYXRpb25zIGluIG1lbW9yeSBvciBJL08gc3BhY2UuCisgKiBEZWNvZGVkIHNpemUgY2FuIGJlIGRldGVybWluZWQgYnkgd3JpdGluZyBhIHZhbHVlIG9mCisgKiAweGZmZmZmZmZmIHRvIHRoZSByZWdpc3RlciwgYW5kIHJlYWRpbmcgaXQgYmFjay4gIE9ubHkKKyAqIDEgYml0cyBhcmUgZGVjb2RlZC4KKyAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzAJMHgxMAkvKiAzMiBiaXRzICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMQkweDE0CS8qIDMyIGJpdHMgW2h0eXBlIDAsMSBvbmx5XSAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzIJMHgxOAkvKiAzMiBiaXRzIFtodHlwZSAwIG9ubHldICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMwkweDFjCS8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU180CTB4MjAJLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzUJMHgyNAkvKiAzMiBiaXRzICovCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFCQkweDAxCS8qIDAgPSBtZW1vcnksIDEgPSBJL08gKi8KKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8JMHgwMQorI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkJMHgwMAorI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV9NQVNLCTB4MDYKKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMzIJMHgwMAkvKiAzMiBiaXQgYWRkcmVzcyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV8xTQkweDAyCS8qIEJlbG93IDFNIFtvYnNvbGV0ZV0gKi8KKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQJMHgwNAkvKiA2NCBiaXQgYWRkcmVzcyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fUFJFRkVUQ0gJMHgwOAkvKiBwcmVmZXRjaGFibGU/ICovCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLCSh+MHgwZlVMKQorI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19JT19NQVNLCSh+MHgwM1VMKQorLyogYml0IDEgaXMgcmVzZXJ2ZWQgaWYgYWRkcmVzc19zcGFjZSA9IDEgKi8KKworLyogSGVhZGVyIHR5cGUgMCAobm9ybWFsIGRldmljZXMpICovCisjZGVmaW5lIFBDSV9DQVJEQlVTX0NJUwkJMHgyOAorI2RlZmluZSBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRAkweDJjCisjZGVmaW5lIFBDSV9TVUJTWVNURU1fSUQJMHgyZQorI2RlZmluZSBQQ0lfUk9NX0FERFJFU1MJCTB4MzAJLyogQml0cyAzMS4uMTEgYXJlIGFkZHJlc3MsIDEwLi4xIHJlc2VydmVkICovCisjZGVmaW5lICBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFCTB4MDEKKyNkZWZpbmUgUENJX1JPTV9BRERSRVNTX01BU0sJKH4weDdmZlVMKQorCisjZGVmaW5lIFBDSV9DQVBBQklMSVRZX0xJU1QJMHgzNAkvKiBPZmZzZXQgb2YgZmlyc3QgY2FwYWJpbGl0eSBsaXN0IGVudHJ5ICovCisKKy8qIDB4MzUtMHgzYiBhcmUgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0lOVEVSUlVQVF9MSU5FCTB4M2MJLyogOCBiaXRzICovCisjZGVmaW5lIFBDSV9JTlRFUlJVUFRfUElOCTB4M2QJLyogOCBiaXRzICovCisjZGVmaW5lIFBDSV9NSU5fR05UCQkweDNlCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfTUFYX0xBVAkJMHgzZgkvKiA4IGJpdHMgKi8KKworLyogSGVhZGVyIHR5cGUgMSAoUENJLXRvLVBDSSBicmlkZ2VzKSAqLworI2RlZmluZSBQQ0lfUFJJTUFSWV9CVVMJCTB4MTgJLyogUHJpbWFyeSBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9TRUNPTkRBUllfQlVTCTB4MTkJLyogU2Vjb25kYXJ5IGJ1cyBudW1iZXIgKi8KKyNkZWZpbmUgUENJX1NVQk9SRElOQVRFX0JVUwkweDFhCS8qIEhpZ2hlc3QgYnVzIG51bWJlciBiZWhpbmQgdGhlIGJyaWRnZSAqLworI2RlZmluZSBQQ0lfU0VDX0xBVEVOQ1lfVElNRVIJMHgxYgkvKiBMYXRlbmN5IHRpbWVyIGZvciBzZWNvbmRhcnkgaW50ZXJmYWNlICovCisjZGVmaW5lIFBDSV9JT19CQVNFCQkweDFjCS8qIEkvTyByYW5nZSBiZWhpbmQgdGhlIGJyaWRnZSAqLworI2RlZmluZSBQQ0lfSU9fTElNSVQJCTB4MWQKKyNkZWZpbmUgIFBDSV9JT19SQU5HRV9UWVBFX01BU0sJMHgwZlVMCS8qIEkvTyBicmlkZ2luZyB0eXBlICovCisjZGVmaW5lICBQQ0lfSU9fUkFOR0VfVFlQRV8xNgkweDAwCisjZGVmaW5lICBQQ0lfSU9fUkFOR0VfVFlQRV8zMgkweDAxCisjZGVmaW5lICBQQ0lfSU9fUkFOR0VfTUFTSwkofjB4MGZVTCkKKyNkZWZpbmUgUENJX1NFQ19TVEFUVVMJCTB4MWUJLyogU2Vjb25kYXJ5IHN0YXR1cyByZWdpc3Rlciwgb25seSBiaXQgMTQgdXNlZCAqLworI2RlZmluZSBQQ0lfTUVNT1JZX0JBU0UJCTB4MjAJLyogTWVtb3J5IHJhbmdlIGJlaGluZCAqLworI2RlZmluZSBQQ0lfTUVNT1JZX0xJTUlUCTB4MjIKKyNkZWZpbmUgIFBDSV9NRU1PUllfUkFOR0VfVFlQRV9NQVNLIDB4MGZVTAorI2RlZmluZSAgUENJX01FTU9SWV9SQU5HRV9NQVNLCSh+MHgwZlVMKQorI2RlZmluZSBQQ0lfUFJFRl9NRU1PUllfQkFTRQkweDI0CS8qIFByZWZldGNoYWJsZSBtZW1vcnkgcmFuZ2UgYmVoaW5kICovCisjZGVmaW5lIFBDSV9QUkVGX01FTU9SWV9MSU1JVAkweDI2CisjZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFX01BU0sgMHgwZlVMCisjZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFXzMyCTB4MDAKKyNkZWZpbmUgIFBDSV9QUkVGX1JBTkdFX1RZUEVfNjQJMHgwMQorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfTUFTSwkofjB4MGZVTCkKKyNkZWZpbmUgUENJX1BSRUZfQkFTRV9VUFBFUjMyCTB4MjgJLyogVXBwZXIgaGFsZiBvZiBwcmVmZXRjaGFibGUgbWVtb3J5IHJhbmdlICovCisjZGVmaW5lIFBDSV9QUkVGX0xJTUlUX1VQUEVSMzIJMHgyYworI2RlZmluZSBQQ0lfSU9fQkFTRV9VUFBFUjE2CTB4MzAJLyogVXBwZXIgaGFsZiBvZiBJL08gYWRkcmVzc2VzICovCisjZGVmaW5lIFBDSV9JT19MSU1JVF9VUFBFUjE2CTB4MzIKKy8qIDB4MzQgc2FtZSBhcyBmb3IgaHR5cGUgMCAqLworLyogMHgzNS0weDNiIGlzIHJlc2VydmVkICovCisjZGVmaW5lIFBDSV9ST01fQUREUkVTUzEJMHgzOAkvKiBTYW1lIGFzIFBDSV9ST01fQUREUkVTUywgYnV0IGZvciBodHlwZSAxICovCisvKiAweDNjLTB4M2QgYXJlIHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KKyNkZWZpbmUgUENJX0JSSURHRV9DT05UUk9MCTB4M2UKKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1BBUklUWQkweDAxCS8qIEVuYWJsZSBwYXJpdHkgZGV0ZWN0aW9uIG9uIHNlY29uZGFyeSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1NFUlIJMHgwMgkvKiBUaGUgc2FtZSBmb3IgU0VSUiBmb3J3YXJkaW5nICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9JU0EJMHgwNAkvKiBFbmFibGUgSVNBIG1vZGUgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1ZHQQkweDA4CS8qIEZvcndhcmQgVkdBIGFkZHJlc3NlcyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfTUFTVEVSX0FCT1JUCTB4MjAgIC8qIFJlcG9ydCBtYXN0ZXIgYWJvcnRzICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9CVVNfUkVTRVQJMHg0MAkvKiBTZWNvbmRhcnkgYnVzIHJlc2V0ICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9GQVNUX0JBQ0sJMHg4MAkvKiBGYXN0IEJhY2syQmFjayBlbmFibGVkIG9uIHNlY29uZGFyeSBpbnRlcmZhY2UgKi8KKworLyogSGVhZGVyIHR5cGUgMiAoQ2FyZEJ1cyBicmlkZ2VzKSAqLworI2RlZmluZSBQQ0lfQ0JfQ0FQQUJJTElUWV9MSVNUCTB4MTQKKy8qIDB4MTUgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NCX1NFQ19TVEFUVVMJMHgxNgkvKiBTZWNvbmRhcnkgc3RhdHVzICovCisjZGVmaW5lIFBDSV9DQl9QUklNQVJZX0JVUwkweDE4CS8qIFBDSSBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9DQl9DQVJEX0JVUwkJMHgxOQkvKiBDYXJkQnVzIGJ1cyBudW1iZXIgKi8KKyNkZWZpbmUgUENJX0NCX1NVQk9SRElOQVRFX0JVUwkweDFhCS8qIFN1Ym9yZGluYXRlIGJ1cyBudW1iZXIgKi8KKyNkZWZpbmUgUENJX0NCX0xBVEVOQ1lfVElNRVIJMHgxYgkvKiBDYXJkQnVzIGxhdGVuY3kgdGltZXIgKi8KKyNkZWZpbmUgUENJX0NCX01FTU9SWV9CQVNFXzAJMHgxYworI2RlZmluZSBQQ0lfQ0JfTUVNT1JZX0xJTUlUXzAJMHgyMAorI2RlZmluZSBQQ0lfQ0JfTUVNT1JZX0JBU0VfMQkweDI0CisjZGVmaW5lIFBDSV9DQl9NRU1PUllfTElNSVRfMQkweDI4CisjZGVmaW5lIFBDSV9DQl9JT19CQVNFXzAJMHgyYworI2RlZmluZSBQQ0lfQ0JfSU9fQkFTRV8wX0hJCTB4MmUKKyNkZWZpbmUgUENJX0NCX0lPX0xJTUlUXzAJMHgzMAorI2RlZmluZSBQQ0lfQ0JfSU9fTElNSVRfMF9ISQkweDMyCisjZGVmaW5lIFBDSV9DQl9JT19CQVNFXzEJMHgzNAorI2RlZmluZSBQQ0lfQ0JfSU9fQkFTRV8xX0hJCTB4MzYKKyNkZWZpbmUgUENJX0NCX0lPX0xJTUlUXzEJMHgzOAorI2RlZmluZSBQQ0lfQ0JfSU9fTElNSVRfMV9ISQkweDNhCisjZGVmaW5lICBQQ0lfQ0JfSU9fUkFOR0VfTUFTSwkofjB4MDNVTCkKKy8qIDB4M2MtMHgzZCBhcmUgc2FtZSBhcyBmb3IgaHR5cGUgMCAqLworI2RlZmluZSBQQ0lfQ0JfQlJJREdFX0NPTlRST0wJMHgzZQorI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfUEFSSVRZCTB4MDEJLyogU2ltaWxhciB0byBzdGFuZGFyZCBicmlkZ2UgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfU0VSUgkJMHgwMgorI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfSVNBCQkweDA0CisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9WR0EJCTB4MDgKKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX01BU1RFUl9BQk9SVAkweDIwCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9DQl9SRVNFVAkweDQwCS8qIENhcmRCdXMgcmVzZXQgKi8KKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMXzE2QklUX0lOVAkweDgwCS8qIEVuYWJsZSBpbnRlcnJ1cHQgZm9yIDE2LWJpdCBjYXJkcyAqLworI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfUFJFRkVUQ0hfTUVNMCAweDEwMAkvKiBQcmVmZXRjaCBlbmFibGUgZm9yIGJvdGggbWVtb3J5IHJlZ2lvbnMgKi8KKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1BSRUZFVENIX01FTTEgMHgyMDAKKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1BPU1RfV1JJVEVTCTB4NDAwCisjZGVmaW5lIFBDSV9DQl9TVUJTWVNURU1fVkVORE9SX0lECTB4NDAKKyNkZWZpbmUgUENJX0NCX1NVQlNZU1RFTV9JRAkJMHg0MgorI2RlZmluZSBQQ0lfQ0JfTEVHQUNZX01PREVfQkFTRQkJMHg0NAkvKiAxNi1iaXQgUEMgQ2FyZCBsZWdhY3kgbW9kZSBiYXNlIGFkZHJlc3MgKEV4Q2EpICovCisvKiAweDQ4LTB4N2YgcmVzZXJ2ZWQgKi8KKworLyogQ2FwYWJpbGl0eSBsaXN0cyAqLworCisjZGVmaW5lIFBDSV9DQVBfTElTVF9JRAkJMAkvKiBDYXBhYmlsaXR5IElEICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1BNCQkweDAxCS8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfQUdQCQkweDAyCS8qIEFjY2VsZXJhdGVkIEdyYXBoaWNzIFBvcnQgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfVlBECQkweDAzCS8qIFZpdGFsIFByb2R1Y3QgRGF0YSAqLworI2RlZmluZSAgUENJX0NBUF9JRF9TTE9USUQJMHgwNAkvKiBTbG90IElkZW50aWZpY2F0aW9uICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX01TSQkJMHgwNQkvKiBNZXNzYWdlIFNpZ25hbGxlZCBJbnRlcnJ1cHRzICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX0NIU1dQCTB4MDYJLyogQ29tcGFjdFBDSSBIb3RTd2FwICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1BDSVgJMHgwNwkvKiBQQ0ktWCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9IVAkJMHgwOAkvKiBIeXBlclRyYW5zcG9ydCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9WTkRSCTB4MDkJLyogVmVuZG9yIHNwZWNpZmljICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX0RCRwkJMHgwQQkvKiBEZWJ1ZyBwb3J0ICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX0NDUkMJMHgwQgkvKiBDb21wYWN0UENJIENlbnRyYWwgUmVzb3VyY2UgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9TSFBDIAkweDBDCS8qIFBDSSBTdGFuZGFyZCBIb3QtUGx1ZyBDb250cm9sbGVyICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1NTVklECTB4MEQJLyogQnJpZGdlIHN1YnN5c3RlbSB2ZW5kb3IvZGV2aWNlIElEICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX0FHUDMJMHgwRQkvKiBBR1AgVGFyZ2V0IFBDSS1QQ0kgYnJpZGdlICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX0VYUCAJMHgxMAkvKiBQQ0kgRXhwcmVzcyAqLworI2RlZmluZSAgUENJX0NBUF9JRF9NU0lYCTB4MTEJLyogTVNJLVggKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfQUYJCTB4MTMJLyogUENJIEFkdmFuY2VkIEZlYXR1cmVzICovCisjZGVmaW5lIFBDSV9DQVBfTElTVF9ORVhUCTEJLyogTmV4dCBjYXBhYmlsaXR5IGluIHRoZSBsaXN0ICovCisjZGVmaW5lIFBDSV9DQVBfRkxBR1MJCTIJLyogQ2FwYWJpbGl0eSBkZWZpbmVkIGZsYWdzICgxNiBiaXRzKSAqLworI2RlZmluZSBQQ0lfQ0FQX1NJWkVPRgkJNAorCisvKiBQb3dlciBNYW5hZ2VtZW50IFJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9QTV9QTUMJCTIJLyogUE0gQ2FwYWJpbGl0aWVzIFJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1ZFUl9NQVNLCTB4MDAwNwkvKiBWZXJzaW9uICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9DTE9DSwkweDAwMDgJLyogUE1FIGNsb2NrIHJlcXVpcmVkICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1JFU0VSVkVEICAgIDB4MDAxMCAgLyogUmVzZXJ2ZWQgZmllbGQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfRFNJCQkweDAwMjAJLyogRGV2aWNlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX0FVWF9QT1dFUgkweDAxQzAJLyogQXV4aWxpYXJ5IHBvd2VyIHN1cHBvcnQgbWFzayAqLworI2RlZmluZSAgUENJX1BNX0NBUF9EMQkJMHgwMjAwCS8qIEQxIHBvd2VyIHN0YXRlIHN1cHBvcnQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfRDIJCTB4MDQwMAkvKiBEMiBwb3dlciBzdGF0ZSBzdXBwb3J0ICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRQkJMHgwODAwCS8qIFBNRSBwaW4gc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9NQVNLCTB4RjgwMAkvKiBQTUUgTWFzayBvZiBhbGwgc3VwcG9ydGVkIHN0YXRlcyAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDAJMHgwODAwCS8qIFBNRSMgZnJvbSBEMCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDEJMHgxMDAwCS8qIFBNRSMgZnJvbSBEMSAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDIJMHgyMDAwCS8qIFBNRSMgZnJvbSBEMiAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDMJMHg0MDAwCS8qIFBNRSMgZnJvbSBEMyAoaG90KSAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDNjb2xkCTB4ODAwMAkvKiBQTUUjIGZyb20gRDMgKGNvbGQpICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9TSElGVAkxMQkvKiBTdGFydCBvZiB0aGUgUE1FIE1hc2sgaW4gUE1DICovCisjZGVmaW5lIFBDSV9QTV9DVFJMCQk0CS8qIFBNIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfU1RBVEVfTUFTSwkweDAwMDMJLyogQ3VycmVudCBwb3dlciBzdGF0ZSAoRDAgdG8gRDMpICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9OT19TT0ZUX1JFU0VUCTB4MDAwOAkvKiBObyByZXNldCBmb3IgRDNob3QtPkQwICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9QTUVfRU5BQkxFCTB4MDEwMAkvKiBQTUUgcGluIGVuYWJsZSAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfREFUQV9TRUxfTUFTSwkweDFlMDAJLyogRGF0YSBzZWxlY3QgKD8/KSAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfREFUQV9TQ0FMRV9NQVNLCTB4NjAwMAkvKiBEYXRhIHNjYWxlICg/PykgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX1BNRV9TVEFUVVMJMHg4MDAwCS8qIFBNRSBwaW4gc3RhdHVzICovCisjZGVmaW5lIFBDSV9QTV9QUEJfRVhURU5TSU9OUwk2CS8qIFBQQiBzdXBwb3J0IGV4dGVuc2lvbnMgKD8/KSAqLworI2RlZmluZSAgUENJX1BNX1BQQl9CMl9CMwkweDQwCS8qIFN0b3AgY2xvY2sgd2hlbiBpbiBEM2hvdCAoPz8pICovCisjZGVmaW5lICBQQ0lfUE1fQlBDQ19FTkFCTEUJMHg4MAkvKiBCdXMgcG93ZXIvY2xvY2sgY29udHJvbCBlbmFibGUgKD8/KSAqLworI2RlZmluZSBQQ0lfUE1fREFUQV9SRUdJU1RFUgk3CS8qICg/PykgKi8KKyNkZWZpbmUgUENJX1BNX1NJWkVPRgkJOAorCisvKiBBR1AgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUENJX0FHUF9WRVJTSU9OCQkyCS8qIEJDRCB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBQQ0lfQUdQX1JGVQkJMwkvKiBSZXN0IG9mIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgUENJX0FHUF9TVEFUVVMJCTQJLyogU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SUV9NQVNLCTB4ZmYwMDAwMDAJLyogTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgLSAxICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19TQkEJMHgwMjAwCS8qIFNpZGViYW5kIGFkZHJlc3Npbmcgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU182NEJJVAkweDAwMjAJLyogNjQtYml0IGFkZHJlc3Npbmcgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19GVwkweDAwMTAJLyogRlcgdHJhbnNmZXJzIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUkFURTQJMHgwMDA0CS8qIDR4IHRyYW5zZmVyIHJhdGUgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SQVRFMgkweDAwMDIJLyogMnggdHJhbnNmZXIgcmF0ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JBVEUxCTB4MDAwMQkvKiAxeCB0cmFuc2ZlciByYXRlIHN1cHBvcnRlZCAqLworI2RlZmluZSBQQ0lfQUdQX0NPTU1BTkQJCTgJLyogQ29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JRX01BU0sgMHhmZjAwMDAwMCAgLyogTWFzdGVyOiBNYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1NCQQkweDAyMDAJLyogU2lkZWJhbmQgYWRkcmVzc2luZyBlbmFibGVkICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfQUdQCTB4MDEwMAkvKiBBbGxvdyBwcm9jZXNzaW5nIG9mIEFHUCB0cmFuc2FjdGlvbnMgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF82NEJJVAkweDAwMjAgCS8qIEFsbG93IHByb2Nlc3Npbmcgb2YgNjQtYml0IGFkZHJlc3NlcyAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX0ZXCTB4MDAxMCAJLyogRm9yY2UgRlcgdHJhbnNmZXJzICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTQJMHgwMDA0CS8qIFVzZSA0eCByYXRlICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTIJMHgwMDAyCS8qIFVzZSAyeCByYXRlICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTEJMHgwMDAxCS8qIFVzZSAxeCByYXRlICovCisjZGVmaW5lIFBDSV9BR1BfU0laRU9GCQkxMgorCisvKiBWaXRhbCBQcm9kdWN0IERhdGEgKi8KKworI2RlZmluZSBQQ0lfVlBEX0FERFIJCTIJLyogQWRkcmVzcyB0byBhY2Nlc3MgKDE1IGJpdHMhKSAqLworI2RlZmluZSAgUENJX1ZQRF9BRERSX01BU0sJMHg3ZmZmCS8qIEFkZHJlc3MgbWFzayAqLworI2RlZmluZSAgUENJX1ZQRF9BRERSX0YJCTB4ODAwMAkvKiBXcml0ZSAwLCAxIGluZGljYXRlcyBjb21wbGV0aW9uICovCisjZGVmaW5lIFBDSV9WUERfREFUQQkJNAkvKiAzMi1iaXRzIG9mIGRhdGEgcmV0dXJuZWQgaGVyZSAqLworCisvKiBTbG90IElkZW50aWZpY2F0aW9uICovCisKKyNkZWZpbmUgUENJX1NJRF9FU1IJCTIJLyogRXhwYW5zaW9uIFNsb3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9TSURfRVNSX05TTE9UUwkweDFmCS8qIE51bWJlciBvZiBleHBhbnNpb24gc2xvdHMgYXZhaWxhYmxlICovCisjZGVmaW5lICBQQ0lfU0lEX0VTUl9GSUMJMHgyMAkvKiBGaXJzdCBJbiBDaGFzc2lzIEZsYWcgKi8KKyNkZWZpbmUgUENJX1NJRF9DSEFTU0lTX05SCTMJLyogQ2hhc3NpcyBOdW1iZXIgKi8KKworLyogTWVzc2FnZSBTaWduYWxsZWQgSW50ZXJydXB0cyByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfTVNJX0ZMQUdTCQkyCS8qIFZhcmlvdXMgZmxhZ3MgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfNjRCSVQJMHg4MAkvKiA2NC1iaXQgYWRkcmVzc2VzIGFsbG93ZWQgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfUVNJWkUJMHg3MAkvKiBNZXNzYWdlIHF1ZXVlIHNpemUgY29uZmlndXJlZCAqLworI2RlZmluZSAgUENJX01TSV9GTEFHU19RTUFTSwkweDBlCS8qIE1heGltdW0gcXVldWUgc2l6ZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfRU5BQkxFCTB4MDEJLyogTVNJIGZlYXR1cmUgZW5hYmxlZCAqLworI2RlZmluZSAgUENJX01TSV9GTEFHU19NQVNLQklUCTB4MTAwCS8qIDY0LWJpdCBtYXNrIGJpdHMgYWxsb3dlZCAqLworI2RlZmluZSBQQ0lfTVNJX1JGVQkJMwkvKiBSZXN0IG9mIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgUENJX01TSV9BRERSRVNTX0xPCTQJLyogTG93ZXIgMzIgYml0cyAqLworI2RlZmluZSBQQ0lfTVNJX0FERFJFU1NfSEkJOAkvKiBVcHBlciAzMiBiaXRzIChpZiBQQ0lfTVNJX0ZMQUdTXzY0QklUIHNldCkgKi8KKyNkZWZpbmUgUENJX01TSV9EQVRBXzMyCQk4CS8qIDE2IGJpdHMgb2YgZGF0YSBmb3IgMzItYml0IGRldmljZXMgKi8KKyNkZWZpbmUgUENJX01TSV9NQVNLXzMyCQkxMgkvKiBNYXNrIGJpdHMgcmVnaXN0ZXIgZm9yIDMyLWJpdCBkZXZpY2VzICovCisjZGVmaW5lIFBDSV9NU0lfREFUQV82NAkJMTIJLyogMTYgYml0cyBvZiBkYXRhIGZvciA2NC1iaXQgZGV2aWNlcyAqLworI2RlZmluZSBQQ0lfTVNJX01BU0tfNjQJCTE2CS8qIE1hc2sgYml0cyByZWdpc3RlciBmb3IgNjQtYml0IGRldmljZXMgKi8KKworLyogTVNJLVggcmVnaXN0ZXJzICovCisjZGVmaW5lIFBDSV9NU0lYX0ZMQUdTCQkyCisjZGVmaW5lICBQQ0lfTVNJWF9GTEFHU19RU0laRQkweDdGRgorI2RlZmluZSAgUENJX01TSVhfRkxBR1NfRU5BQkxFCSgxIDw8IDE1KQorI2RlZmluZSAgUENJX01TSVhfRkxBR1NfTUFTS0FMTAkoMSA8PCAxNCkKKyNkZWZpbmUgUENJX01TSVhfVEFCTEUJCTQKKyNkZWZpbmUgUENJX01TSVhfUEJBCQk4CisjZGVmaW5lICBQQ0lfTVNJWF9GTEFHU19CSVJNQVNLCSg3IDw8IDApCisKKy8qIE1TSS1YIGVudHJ5J3MgZm9ybWF0ICovCisjZGVmaW5lIFBDSV9NU0lYX0VOVFJZX1NJWkUJCTE2CisjZGVmaW5lICBQQ0lfTVNJWF9FTlRSWV9MT1dFUl9BRERSCTAKKyNkZWZpbmUgIFBDSV9NU0lYX0VOVFJZX1VQUEVSX0FERFIJNAorI2RlZmluZSAgUENJX01TSVhfRU5UUllfREFUQQkJOAorI2RlZmluZSAgUENJX01TSVhfRU5UUllfVkVDVE9SX0NUUkwJMTIKKyNkZWZpbmUgICBQQ0lfTVNJWF9FTlRSWV9DVFJMX01BU0tCSVQJMQorCisvKiBDb21wYWN0UENJIEhvdHN3YXAgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBQQ0lfQ0hTV1BfQ1NSCQkyCS8qIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSAgUENJX0NIU1dQX0RIQQkJMHgwMQkvKiBEZXZpY2UgSGlkaW5nIEFybSAqLworI2RlZmluZSAgUENJX0NIU1dQX0VJTQkJMHgwMgkvKiBFTlVNIyBTaWduYWwgTWFzayAqLworI2RlZmluZSAgUENJX0NIU1dQX1BJRQkJMHgwNAkvKiBQZW5kaW5nIEluc2VydCBvciBFeHRyYWN0ICovCisjZGVmaW5lICBQQ0lfQ0hTV1BfTE9PCQkweDA4CS8qIExFRCBPbiAvIE9mZiAqLworI2RlZmluZSAgUENJX0NIU1dQX1BJCQkweDMwCS8qIFByb2dyYW1taW5nIEludGVyZmFjZSAqLworI2RlZmluZSAgUENJX0NIU1dQX0VYVAkJMHg0MAkvKiBFTlVNIyBzdGF0dXMgLSBleHRyYWN0aW9uICovCisjZGVmaW5lICBQQ0lfQ0hTV1BfSU5TCQkweDgwCS8qIEVOVU0jIHN0YXR1cyAtIGluc2VydGlvbiAqLworCisvKiBQQ0kgQWR2YW5jZWQgRmVhdHVyZSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfQUZfTEVOR1RICQkyCisjZGVmaW5lIFBDSV9BRl9DQVAJCTMKKyNkZWZpbmUgIFBDSV9BRl9DQVBfVFAJCTB4MDEKKyNkZWZpbmUgIFBDSV9BRl9DQVBfRkxSCQkweDAyCisjZGVmaW5lIFBDSV9BRl9DVFJMCQk0CisjZGVmaW5lICBQQ0lfQUZfQ1RSTF9GTFIJMHgwMQorI2RlZmluZSBQQ0lfQUZfU1RBVFVTCQk1CisjZGVmaW5lICBQQ0lfQUZfU1RBVFVTX1RQCTB4MDEKKworLyogUENJLVggcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUENJX1hfQ01ECQkyCS8qIE1vZGVzICYgRmVhdHVyZXMgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9EUEVSUl9FCTB4MDAwMQkvKiBEYXRhIFBhcml0eSBFcnJvciBSZWNvdmVyeSBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9FUk8JCTB4MDAwMgkvKiBFbmFibGUgUmVsYXhlZCBPcmRlcmluZyAqLworI2RlZmluZSAgUENJX1hfQ01EX1JFQURfNTEyCTB4MDAwMAkvKiA1MTIgYnl0ZSBtYXhpbXVtIHJlYWQgYnl0ZSBjb3VudCAqLworI2RlZmluZSAgUENJX1hfQ01EX1JFQURfMUsJMHgwMDA0CS8qIDFLYnl0ZSBtYXhpbXVtIHJlYWQgYnl0ZSBjb3VudCAqLworI2RlZmluZSAgUENJX1hfQ01EX1JFQURfMksJMHgwMDA4CS8qIDJLYnl0ZSBtYXhpbXVtIHJlYWQgYnl0ZSBjb3VudCAqLworI2RlZmluZSAgUENJX1hfQ01EX1JFQURfNEsJMHgwMDBjCS8qIDRLYnl0ZSBtYXhpbXVtIHJlYWQgYnl0ZSBjb3VudCAqLworI2RlZmluZSAgUENJX1hfQ01EX01BWF9SRUFECTB4MDAwYwkvKiBNYXggTWVtb3J5IFJlYWQgQnl0ZSBDb3VudCAqLworCQkJCS8qIE1heCAjIG9mIG91dHN0YW5kaW5nIHNwbGl0IHRyYW5zYWN0aW9ucyAqLworI2RlZmluZSAgUENJX1hfQ01EX1NQTElUXzEJMHgwMDAwCS8qIE1heCAxICovCisjZGVmaW5lICBQQ0lfWF9DTURfU1BMSVRfMgkweDAwMTAJLyogTWF4IDIgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9TUExJVF8zCTB4MDAyMAkvKiBNYXggMyAqLworI2RlZmluZSAgUENJX1hfQ01EX1NQTElUXzQJMHgwMDMwCS8qIE1heCA0ICovCisjZGVmaW5lICBQQ0lfWF9DTURfU1BMSVRfOAkweDAwNDAJLyogTWF4IDggKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9TUExJVF8xMgkweDAwNTAJLyogTWF4IDEyICovCisjZGVmaW5lICBQQ0lfWF9DTURfU1BMSVRfMTYJMHgwMDYwCS8qIE1heCAxNiAqLworI2RlZmluZSAgUENJX1hfQ01EX1NQTElUXzMyCTB4MDA3MAkvKiBNYXggMzIgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9NQVhfU1BMSVQJMHgwMDcwCS8qIE1heCBPdXRzdGFuZGluZyBTcGxpdCBUcmFuc2FjdGlvbnMgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9WRVJTSU9OKHgpIAkoKCh4KSA+PiAxMikgJiAzKSAvKiBWZXJzaW9uICovCisjZGVmaW5lIFBDSV9YX1NUQVRVUwkJNAkvKiBQQ0ktWCBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19ERVZGTgkweDAwMDAwMGZmCS8qIEEgY29weSBvZiBkZXZmbiAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX0JVUwkweDAwMDBmZjAwCS8qIEEgY29weSBvZiBidXMgbnIgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU182NEJJVAkweDAwMDEwMDAwCS8qIDY0LWJpdCBkZXZpY2UgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU18xMzNNSFoJMHgwMDAyMDAwMAkvKiAxMzMgTUh6IGNhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19TUExfRElTQwkweDAwMDQwMDAwCS8qIFNwbGl0IENvbXBsZXRpb24gRGlzY2FyZGVkICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfVU5YX1NQTAkweDAwMDgwMDAwCS8qIFVuZXhwZWN0ZWQgU3BsaXQgQ29tcGxldGlvbiAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX0NPTVBMRVgJMHgwMDEwMDAwMAkvKiBEZXZpY2UgQ29tcGxleGl0eSAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX01BWF9SRUFECTB4MDA2MDAwMDAJLyogRGVzaWduZWQgTWF4IE1lbW9yeSBSZWFkIENvdW50ICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfTUFYX1NQTElUCTB4MDM4MDAwMDAJLyogRGVzaWduZWQgTWF4IE91dHN0YW5kaW5nIFNwbGl0IFRyYW5zYWN0aW9ucyAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX01BWF9DVU0JMHgxYzAwMDAwMAkvKiBEZXNpZ25lZCBNYXggQ3VtdWxhdGl2ZSBSZWFkIFNpemUgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19TUExfRVJSCTB4MjAwMDAwMDAJLyogUmN2ZCBTcGxpdCBDb21wbGV0aW9uIEVycm9yIE1zZyAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTXzI2Nk1IWgkweDQwMDAwMDAwCS8qIDI2NiBNSHogY2FwYWJsZSAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTXzUzM01IWgkweDgwMDAwMDAwCS8qIDUzMyBNSHogY2FwYWJsZSAqLworCisvKiBQQ0kgQnJpZGdlIFN1YnN5c3RlbSBJRCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfU1NWSURfVkVORE9SX0lEICAgICA0CS8qIFBDSS1CcmlkZ2Ugc3Vic3lzdGVtIHZlbmRvciBpZCByZWdpc3RlciAqLworI2RlZmluZSBQQ0lfU1NWSURfREVWSUNFX0lEICAgICA2CS8qIFBDSS1CcmlkZ2Ugc3Vic3lzdGVtIGRldmljZSBpZCByZWdpc3RlciAqLworCisvKiBQQ0kgRXhwcmVzcyBjYXBhYmlsaXR5IHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9FWFBfRkxBR1MJCTIJLyogQ2FwYWJpbGl0aWVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9FWFBfRkxBR1NfVkVSUwkweDAwMGYJLyogQ2FwYWJpbGl0eSB2ZXJzaW9uICovCisjZGVmaW5lIFBDSV9FWFBfRkxBR1NfVFlQRQkweDAwZjAJLyogRGV2aWNlL1BvcnQgdHlwZSAqLworI2RlZmluZSAgUENJX0VYUF9UWVBFX0VORFBPSU5UCTB4MAkvKiBFeHByZXNzIEVuZHBvaW50ICovCisjZGVmaW5lICBQQ0lfRVhQX1RZUEVfTEVHX0VORAkweDEJLyogTGVnYWN5IEVuZHBvaW50ICovCisjZGVmaW5lICBQQ0lfRVhQX1RZUEVfUk9PVF9QT1JUIDB4NAkvKiBSb290IFBvcnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfVFlQRV9VUFNUUkVBTQkweDUJLyogVXBzdHJlYW0gUG9ydCAqLworI2RlZmluZSAgUENJX0VYUF9UWVBFX0RPV05TVFJFQU0gMHg2CS8qIERvd25zdHJlYW0gUG9ydCAqLworI2RlZmluZSAgUENJX0VYUF9UWVBFX1BDSV9CUklER0UgMHg3CS8qIFBDSS9QQ0ktWCBCcmlkZ2UgKi8KKyNkZWZpbmUgIFBDSV9FWFBfVFlQRV9SQ19FTkQJMHg5CS8qIFJvb3QgQ29tcGxleCBJbnRlZ3JhdGVkIEVuZHBvaW50ICovCisjZGVmaW5lICBQQ0lfRVhQX1RZUEVfUkNfRUMJMHhhCS8qIFJvb3QgQ29tcGxleCBFdmVudCBDb2xsZWN0b3IgKi8KKyNkZWZpbmUgUENJX0VYUF9GTEFHU19TTE9UCTB4MDEwMAkvKiBTbG90IGltcGxlbWVudGVkICovCisjZGVmaW5lIFBDSV9FWFBfRkxBR1NfSVJRCTB4M2UwMAkvKiBJbnRlcnJ1cHQgbWVzc2FnZSBudW1iZXIgKi8KKyNkZWZpbmUgUENJX0VYUF9ERVZDQVAJCTQJLyogRGV2aWNlIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUEFZTE9BRAkweDA3CS8qIE1heF9QYXlsb2FkX1NpemUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX1BIQU5UT00JMHgxOAkvKiBQaGFudG9tIGZ1bmN0aW9ucyAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfRVhUX1RBRwkweDIwCS8qIEV4dGVuZGVkIHRhZ3MgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0wwUwkweDFjMAkvKiBMMHMgQWNjZXB0YWJsZSBMYXRlbmN5ICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9MMQkweGUwMAkvKiBMMSBBY2NlcHRhYmxlIExhdGVuY3kgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0FUTl9CVVQJMHgxMDAwCS8qIEF0dGVudGlvbiBCdXR0b24gUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfQVROX0lORAkweDIwMDAJLyogQXR0ZW50aW9uIEluZGljYXRvciBQcmVzZW50ICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9QV1JfSU5ECTB4NDAwMAkvKiBQb3dlciBJbmRpY2F0b3IgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUkJFUgkweDgwMDAJLyogUm9sZS1CYXNlZCBFcnJvciBSZXBvcnRpbmcgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX1BXUl9WQUwJMHgzZmMwMDAwIC8qIFNsb3QgUG93ZXIgTGltaXQgVmFsdWUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX1BXUl9TQ0wJMHhjMDAwMDAwIC8qIFNsb3QgUG93ZXIgTGltaXQgU2NhbGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0ZMUiAgICAgMHgxMDAwMDAwMCAvKiBGdW5jdGlvbiBMZXZlbCBSZXNldCAqLworI2RlZmluZSBQQ0lfRVhQX0RFVkNUTAkJOAkvKiBEZXZpY2UgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfQ0VSRQkweDAwMDEJLyogQ29ycmVjdGFibGUgRXJyb3IgUmVwb3J0aW5nIEVuLiAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfTkZFUkUJMHgwMDAyCS8qIE5vbi1GYXRhbCBFcnJvciBSZXBvcnRpbmcgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9GRVJFCTB4MDAwNAkvKiBGYXRhbCBFcnJvciBSZXBvcnRpbmcgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9VUlJFCTB4MDAwOAkvKiBVbnN1cHBvcnRlZCBSZXF1ZXN0IFJlcG9ydGluZyBFbi4gKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX1JFTEFYX0VOIDB4MDAxMCAvKiBFbmFibGUgcmVsYXhlZCBvcmRlcmluZyAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfUEFZTE9BRAkweDAwZTAJLyogTWF4X1BheWxvYWRfU2l6ZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfRVhUX1RBRwkweDAxMDAJLyogRXh0ZW5kZWQgVGFnIEZpZWxkIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfUEhBTlRPTQkweDAyMDAJLyogUGhhbnRvbSBGdW5jdGlvbnMgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9BVVhfUE1FCTB4MDQwMAkvKiBBdXhpbGlhcnkgUG93ZXIgUE0gRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9OT1NOT09QX0VOIDB4MDgwMCAgLyogRW5hYmxlIE5vIFNub29wICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9SRUFEUlEJMHg3MDAwCS8qIE1heF9SZWFkX1JlcXVlc3RfU2l6ZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfQkNSX0ZMUiAweDgwMDAgIC8qIEJyaWRnZSBDb25maWd1cmF0aW9uIFJldHJ5IC8gRkxSICovCisjZGVmaW5lIFBDSV9FWFBfREVWU1RBCQkxMAkvKiBEZXZpY2UgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9DRUQJMHgwMQkvKiBDb3JyZWN0YWJsZSBFcnJvciBEZXRlY3RlZCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfTkZFRAkweDAyCS8qIE5vbi1GYXRhbCBFcnJvciBEZXRlY3RlZCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfRkVECTB4MDQJLyogRmF0YWwgRXJyb3IgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX1VSRAkweDA4CS8qIFVuc3VwcG9ydGVkIFJlcXVlc3QgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX0FVWFBECTB4MTAJLyogQVVYIFBvd2VyIERldGVjdGVkICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9UUlBORAkweDIwCS8qIFRyYW5zYWN0aW9ucyBQZW5kaW5nICovCisjZGVmaW5lIFBDSV9FWFBfTE5LQ0FQCQkxMgkvKiBMaW5rIENhcGFiaWxpdGllcyAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfU0xTCTB4MDAwMDAwMGYgLyogU3VwcG9ydGVkIExpbmsgU3BlZWRzICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9NTFcJMHgwMDAwMDNmMCAvKiBNYXhpbXVtIExpbmsgV2lkdGggKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0FTUE1TCTB4MDAwMDBjMDAgLyogQVNQTSBTdXBwb3J0ICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9MMFNFTAkweDAwMDA3MDAwIC8qIEwwcyBFeGl0IExhdGVuY3kgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0wxRUwJMHgwMDAzODAwMCAvKiBMMSBFeGl0IExhdGVuY3kgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0NMS1BNCTB4MDAwNDAwMDAgLyogTDEgQ2xvY2sgUG93ZXIgTWFuYWdlbWVudCAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfU0RFUkMJMHgwMDA4MDAwMCAvKiBTdXJwcmlzZSBEb3duIEVycm9yIFJlcG9ydGluZyBDYXBhYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9ETExMQVJDCTB4MDAxMDAwMDAgLyogRGF0YSBMaW5rIExheWVyIExpbmsgQWN0aXZlIFJlcG9ydGluZyBDYXBhYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9MQk5DCTB4MDAyMDAwMDAgLyogTGluayBCYW5kd2lkdGggTm90aWZpY2F0aW9uIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX1BOCTB4ZmYwMDAwMDAgLyogUG9ydCBOdW1iZXIgKi8KKyNkZWZpbmUgUENJX0VYUF9MTktDVEwJCTE2CS8qIExpbmsgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9MTktDVExfQVNQTUMJMHgwMDAzCS8qIEFTUE0gQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9MTktDVExfUkNCCTB4MDAwOAkvKiBSZWFkIENvbXBsZXRpb24gQm91bmRhcnkgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0xECTB4MDAxMAkvKiBMaW5rIERpc2FibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX1JMCTB4MDAyMAkvKiBSZXRyYWluIExpbmsgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0NDQwkweDAwNDAJLyogQ29tbW9uIENsb2NrIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0VTCTB4MDA4MAkvKiBFeHRlbmRlZCBTeW5jaCAqLworI2RlZmluZSAgUENJX0VYUF9MTktDVExfQ0xLUkVRX0VOIDB4MTAwCS8qIEVuYWJsZSBjbGtyZXEgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0hBV0QJMHgwMjAwCS8qIEhhcmR3YXJlIEF1dG9ub21vdXMgV2lkdGggRGlzYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9MTktDVExfTEJNSUUJMHgwNDAwCS8qIExpbmsgQmFuZHdpZHRoIE1hbmFnZW1lbnQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9MTktDVExfTEFCSUUJMHgwODAwCS8qIExuayBBdXRvbm9tb3VzIEJhbmR3aWR0aCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFBDSV9FWFBfTE5LU1RBCQkxOAkvKiBMaW5rIFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VYUF9MTktTVEFfQ0xTCTB4MDAwZgkvKiBDdXJyZW50IExpbmsgU3BlZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX0NMU18yXzVHQiAweDAxCS8qIEN1cnJlbnQgTGluayBTcGVlZCAyLjVHVC9zICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9DTFNfNV8wR0IgMHgwMgkvKiBDdXJyZW50IExpbmsgU3BlZWQgNS4wR1QvcyAqLworI2RlZmluZSAgUENJX0VYUF9MTktTVEFfTkxXCTB4MDNmMAkvKiBOb2dvdGlhdGVkIExpbmsgV2lkdGggKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX05MV19TSElGVCA0CS8qIHN0YXJ0IG9mIE5MVyBtYXNrIGluIGxpbmsgc3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9MVAkweDA4MDAJLyogTGluayBUcmFpbmluZyAqLworI2RlZmluZSAgUENJX0VYUF9MTktTVEFfU0xDCTB4MTAwMAkvKiBTbG90IENsb2NrIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX0RMTExBCTB4MjAwMAkvKiBEYXRhIExpbmsgTGF5ZXIgTGluayBBY3RpdmUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX0xCTVMJMHg0MDAwCS8qIExpbmsgQmFuZHdpZHRoIE1hbmFnZW1lbnQgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9MQUJTCTB4ODAwMAkvKiBMaW5rIEF1dG9ub21vdXMgQmFuZHdpZHRoIFN0YXR1cyAqLworI2RlZmluZSBQQ0lfRVhQX1NMVENBUAkJMjAJLyogU2xvdCBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX0FCUAkweDAwMDAwMDAxIC8qIEF0dGVudGlvbiBCdXR0b24gUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfUENQCTB4MDAwMDAwMDIgLyogUG93ZXIgQ29udHJvbGxlciBQcmVzZW50ICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9NUkxTUAkweDAwMDAwMDA0IC8qIE1STCBTZW5zb3IgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfQUlQCTB4MDAwMDAwMDggLyogQXR0ZW50aW9uIEluZGljYXRvciBQcmVzZW50ICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9QSVAJMHgwMDAwMDAxMCAvKiBQb3dlciBJbmRpY2F0b3IgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfSFBTCTB4MDAwMDAwMjAgLyogSG90LVBsdWcgU3VycHJpc2UgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX0hQQwkweDAwMDAwMDQwIC8qIEhvdC1QbHVnIENhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX1NQTFYJMHgwMDAwN2Y4MCAvKiBTbG90IFBvd2VyIExpbWl0IFZhbHVlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9TUExTCTB4MDAwMTgwMDAgLyogU2xvdCBQb3dlciBMaW1pdCBTY2FsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfRUlQCTB4MDAwMjAwMDAgLyogRWxlY3Ryb21lY2hhbmljYWwgSW50ZXJsb2NrIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX05DQ1MJMHgwMDA0MDAwMCAvKiBObyBDb21tYW5kIENvbXBsZXRlZCBTdXBwb3J0ICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9QU04JMHhmZmY4MDAwMCAvKiBQaHlzaWNhbCBTbG90IE51bWJlciAqLworI2RlZmluZSBQQ0lfRVhQX1NMVENUTAkJMjQJLyogU2xvdCBDb250cm9sICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9BQlBFCTB4MDAwMQkvKiBBdHRlbnRpb24gQnV0dG9uIFByZXNzZWQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9QRkRFCTB4MDAwMgkvKiBQb3dlciBGYXVsdCBEZXRlY3RlZCBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX01STFNDRQkweDAwMDQJLyogTVJMIFNlbnNvciBDaGFuZ2VkIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfUERDRQkweDAwMDgJLyogUHJlc2VuY2UgRGV0ZWN0IENoYW5nZWQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9DQ0lFCTB4MDAxMAkvKiBDb21tYW5kIENvbXBsZXRlZCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9IUElFCTB4MDAyMAkvKiBIb3QtUGx1ZyBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9BSUMJMHgwMGMwCS8qIEF0dGVudGlvbiBJbmRpY2F0b3IgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfUElDCTB4MDMwMAkvKiBQb3dlciBJbmRpY2F0b3IgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfUENDCTB4MDQwMAkvKiBQb3dlciBDb250cm9sbGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX0VJQwkweDA4MDAJLyogRWxlY3Ryb21lY2hhbmljYWwgSW50ZXJsb2NrIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX0RMTFNDRQkweDEwMDAJLyogRGF0YSBMaW5rIExheWVyIFN0YXRlIENoYW5nZWQgRW5hYmxlICovCisjZGVmaW5lIFBDSV9FWFBfU0xUU1RBCQkyNgkvKiBTbG90IFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VYUF9TTFRTVEFfQUJQCTB4MDAwMQkvKiBBdHRlbnRpb24gQnV0dG9uIFByZXNzZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX1BGRAkweDAwMDIJLyogUG93ZXIgRmF1bHQgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX01STFNDCTB4MDAwNAkvKiBNUkwgU2Vuc29yIENoYW5nZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX1BEQwkweDAwMDgJLyogUHJlc2VuY2UgRGV0ZWN0IENoYW5nZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX0NDCTB4MDAxMAkvKiBDb21tYW5kIENvbXBsZXRlZCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRTVEFfTVJMU1MJMHgwMDIwCS8qIE1STCBTZW5zb3IgU3RhdGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX1BEUwkweDAwNDAJLyogUHJlc2VuY2UgRGV0ZWN0IFN0YXRlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9FSVMJMHgwMDgwCS8qIEVsZWN0cm9tZWNoYW5pY2FsIEludGVybG9jayBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX0RMTFNDCTB4MDEwMAkvKiBEYXRhIExpbmsgTGF5ZXIgU3RhdGUgQ2hhbmdlZCAqLworI2RlZmluZSBQQ0lfRVhQX1JUQ1RMCQkyOAkvKiBSb290IENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfUlRDVExfU0VDRUUJMHgwMQkvKiBTeXN0ZW0gRXJyb3Igb24gQ29ycmVjdGFibGUgRXJyb3IgKi8KKyNkZWZpbmUgIFBDSV9FWFBfUlRDVExfU0VORkVFCTB4MDIJLyogU3lzdGVtIEVycm9yIG9uIE5vbi1GYXRhbCBFcnJvciAqLworI2RlZmluZSAgUENJX0VYUF9SVENUTF9TRUZFRQkweDA0CS8qIFN5c3RlbSBFcnJvciBvbiBGYXRhbCBFcnJvciAqLworI2RlZmluZSAgUENJX0VYUF9SVENUTF9QTUVJRQkweDA4CS8qIFBNRSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX0NSU1NWRQkweDEwCS8qIENSUyBTb2Z0d2FyZSBWaXNpYmlsaXR5IEVuYWJsZSAqLworI2RlZmluZSBQQ0lfRVhQX1JUQ0FQCQkzMAkvKiBSb290IENhcGFiaWxpdGllcyAqLworI2RlZmluZSBQQ0lfRVhQX1JUU1RBCQkzMgkvKiBSb290IFN0YXR1cyAqLworI2RlZmluZSBQQ0lfRVhQX1JUU1RBX1BNRQkweDEwMDAwIC8qIFBNRSBzdGF0dXMgKi8KKyNkZWZpbmUgUENJX0VYUF9SVFNUQV9QRU5ESU5HCTB4MjAwMDAgLyogUE1FIHBlbmRpbmcgKi8KKyNkZWZpbmUgUENJX0VYUF9ERVZDQVAyCQkzNgkvKiBEZXZpY2UgQ2FwYWJpbGl0aWVzIDIgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQMl9BUkkJMHgyMAkvKiBBbHRlcm5hdGl2ZSBSb3V0aW5nLUlEICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUDJfTFRSCTB4ODAwCS8qIExhdGVuY3kgdG9sZXJhbmNlIHJlcG9ydGluZyAqLworI2RlZmluZSAgUENJX0VYUF9PQkZGX01BU0sJMHhjMDAwMCAvKiBPQkZGIHN1cHBvcnQgbWVjaGFuaXNtICovCisjZGVmaW5lICBQQ0lfRVhQX09CRkZfTVNHCTB4NDAwMDAgLyogTmV3IG1lc3NhZ2Ugc2lnbmFsaW5nICovCisjZGVmaW5lICBQQ0lfRVhQX09CRkZfV0FLRQkweDgwMDAwIC8qIFJlLXVzZSBXQUtFIyBmb3IgT0JGRiAqLworI2RlZmluZSBQQ0lfRVhQX0RFVkNUTDIJCTQwCS8qIERldmljZSBDb250cm9sIDIgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMMl9BUkkJMHgyMAkvKiBBbHRlcm5hdGl2ZSBSb3V0aW5nLUlEICovCisjZGVmaW5lICBQQ0lfRVhQX0lET19SRVFfRU4JMHgxMDAJLyogSUQtYmFzZWQgb3JkZXJpbmcgcmVxdWVzdCBlbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfSURPX0NNUF9FTgkweDIwMAkvKiBJRC1iYXNlZCBvcmRlcmluZyBjb21wbGV0aW9uIGVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9MVFJfRU4JCTB4NDAwCS8qIExhdGVuY3kgdG9sZXJhbmNlIHJlcG9ydGluZyAqLworI2RlZmluZSAgUENJX0VYUF9PQkZGX01TR0FfRU4JMHgyMDAwCS8qIE9CRkYgZW5hYmxlIHdpdGggTWVzc2FnZSB0eXBlIEEgKi8KKyNkZWZpbmUgIFBDSV9FWFBfT0JGRl9NU0dCX0VOCTB4NDAwMAkvKiBPQkZGIGVuYWJsZSB3aXRoIE1lc3NhZ2UgdHlwZSBCICovCisjZGVmaW5lICBQQ0lfRVhQX09CRkZfV0FLRV9FTgkweDYwMDAJLyogT0JGRiB1c2luZyBXQUtFIyBzaWduYWxpbmcgKi8KKyNkZWZpbmUgUENJX0VYUF9MTktDVEwyCQk0OAkvKiBMaW5rIENvbnRyb2wgMiAqLworI2RlZmluZSBQQ0lfRVhQX1NMVENUTDIJCTU2CS8qIFNsb3QgQ29udHJvbCAyICovCisKKy8qIEV4dGVuZGVkIENhcGFiaWxpdGllcyAoUENJLVggMi4wIGFuZCBFeHByZXNzKSAqLworI2RlZmluZSBQQ0lfRVhUX0NBUF9JRChoZWFkZXIpCQkoaGVhZGVyICYgMHgwMDAwZmZmZikKKyNkZWZpbmUgUENJX0VYVF9DQVBfVkVSKGhlYWRlcikJCSgoaGVhZGVyID4+IDE2KSAmIDB4ZikKKyNkZWZpbmUgUENJX0VYVF9DQVBfTkVYVChoZWFkZXIpCSgoaGVhZGVyID4+IDIwKSAmIDB4ZmZjKQorCisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX0VSUgkxCisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX1ZDCTIKKyNkZWZpbmUgUENJX0VYVF9DQVBfSURfRFNOCTMKKyNkZWZpbmUgUENJX0VYVF9DQVBfSURfUFdSCTQKKyNkZWZpbmUgUENJX0VYVF9DQVBfSURfVk5EUgkxMQorI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9BQ1MJMTMKKyNkZWZpbmUgUENJX0VYVF9DQVBfSURfQVJJCTE0CisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX0FUUwkxNQorI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9TUklPVgkxNgorI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9MVFIJMjQKKworLyogQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nICovCisjZGVmaW5lIFBDSV9FUlJfVU5DT1JfU1RBVFVTCTQJLyogVW5jb3JyZWN0YWJsZSBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX1RSQUlOCTB4MDAwMDAwMDEJLyogVHJhaW5pbmcgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX0RMUAkweDAwMDAwMDEwCS8qIERhdGEgTGluayBQcm90b2NvbCAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfUE9JU09OX1RMUAkweDAwMDAxMDAwCS8qIFBvaXNvbmVkIFRMUCAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfRkNQCTB4MDAwMDIwMDAJLyogRmxvdyBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19DT01QX1RJTUUJMHgwMDAwNDAwMAkvKiBDb21wbGV0aW9uIFRpbWVvdXQgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX0NPTVBfQUJPUlQJMHgwMDAwODAwMAkvKiBDb21wbGV0ZXIgQWJvcnQgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX1VOWF9DT01QCTB4MDAwMTAwMDAJLyogVW5leHBlY3RlZCBDb21wbGV0aW9uICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19SWF9PVkVSCTB4MDAwMjAwMDAJLyogUmVjZWl2ZXIgT3ZlcmZsb3cgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX01BTEZfVExQCTB4MDAwNDAwMDAJLyogTWFsZm9ybWVkIFRMUCAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfRUNSQwkweDAwMDgwMDAwCS8qIEVDUkMgRXJyb3IgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19VTlNVUAkweDAwMTAwMDAwCS8qIFVuc3VwcG9ydGVkIFJlcXVlc3QgKi8KKyNkZWZpbmUgUENJX0VSUl9VTkNPUl9NQVNLCTgJLyogVW5jb3JyZWN0YWJsZSBFcnJvciBNYXNrICovCisJLyogU2FtZSBiaXRzIGFzIGFib3ZlICovCisjZGVmaW5lIFBDSV9FUlJfVU5DT1JfU0VWRVIJMTIJLyogVW5jb3JyZWN0YWJsZSBFcnJvciBTZXZlcml0eSAqLworCS8qIFNhbWUgYml0cyBhcyBhYm92ZSAqLworI2RlZmluZSBQQ0lfRVJSX0NPUl9TVEFUVVMJMTYJLyogQ29ycmVjdGFibGUgRXJyb3IgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVJSX0NPUl9SQ1ZSCTB4MDAwMDAwMDEJLyogUmVjZWl2ZXIgRXJyb3IgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVJSX0NPUl9CQURfVExQCTB4MDAwMDAwNDAJLyogQmFkIFRMUCBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ09SX0JBRF9ETExQCTB4MDAwMDAwODAJLyogQmFkIERMTFAgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVJSX0NPUl9SRVBfUk9MTAkweDAwMDAwMTAwCS8qIFJFUExBWV9OVU0gUm9sbG92ZXIgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ09SX1JFUF9USU1FUgkweDAwMDAxMDAwCS8qIFJlcGxheSBUaW1lciBUaW1lb3V0ICovCisjZGVmaW5lIFBDSV9FUlJfQ09SX01BU0sJMjAJLyogQ29ycmVjdGFibGUgRXJyb3IgTWFzayAqLworCS8qIFNhbWUgYml0cyBhcyBhYm92ZSAqLworI2RlZmluZSBQQ0lfRVJSX0NBUAkJMjQJLyogQWR2YW5jZWQgRXJyb3IgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lICBQQ0lfRVJSX0NBUF9GRVAoeCkJKCh4KSAmIDMxKQkvKiBGaXJzdCBFcnJvciBQb2ludGVyICovCisjZGVmaW5lICBQQ0lfRVJSX0NBUF9FQ1JDX0dFTkMJMHgwMDAwMDAyMAkvKiBFQ1JDIEdlbmVyYXRpb24gQ2FwYWJsZSAqLworI2RlZmluZSAgUENJX0VSUl9DQVBfRUNSQ19HRU5FCTB4MDAwMDAwNDAJLyogRUNSQyBHZW5lcmF0aW9uIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VSUl9DQVBfRUNSQ19DSEtDCTB4MDAwMDAwODAJLyogRUNSQyBDaGVjayBDYXBhYmxlICovCisjZGVmaW5lICBQQ0lfRVJSX0NBUF9FQ1JDX0NIS0UJMHgwMDAwMDEwMAkvKiBFQ1JDIENoZWNrIEVuYWJsZSAqLworI2RlZmluZSBQQ0lfRVJSX0hFQURFUl9MT0cJMjgJLyogSGVhZGVyIExvZyBSZWdpc3RlciAoMTYgYnl0ZXMpICovCisjZGVmaW5lIFBDSV9FUlJfUk9PVF9DT01NQU5ECTQ0CS8qIFJvb3QgRXJyb3IgQ29tbWFuZCAqLworLyogQ29ycmVjdGFibGUgRXJyIFJlcG9ydGluZyBFbmFibGUgKi8KKyNkZWZpbmUgUENJX0VSUl9ST09UX0NNRF9DT1JfRU4JCTB4MDAwMDAwMDEKKy8qIE5vbi1mYXRhbCBFcnIgUmVwb3J0aW5nIEVuYWJsZSAqLworI2RlZmluZSBQQ0lfRVJSX1JPT1RfQ01EX05PTkZBVEFMX0VOCTB4MDAwMDAwMDIKKy8qIEZhdGFsIEVyciBSZXBvcnRpbmcgRW5hYmxlICovCisjZGVmaW5lIFBDSV9FUlJfUk9PVF9DTURfRkFUQUxfRU4JMHgwMDAwMDAwNAorI2RlZmluZSBQQ0lfRVJSX1JPT1RfU1RBVFVTCTQ4CisjZGVmaW5lIFBDSV9FUlJfUk9PVF9DT1JfUkNWCQkweDAwMDAwMDAxCS8qIEVSUl9DT1IgUmVjZWl2ZWQgKi8KKy8qIE11bHRpIEVSUl9DT1IgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgUENJX0VSUl9ST09UX01VTFRJX0NPUl9SQ1YJMHgwMDAwMDAwMgorLyogRVJSX0ZBVEFML05PTkZBVEFMIFJlY2V2aWVkICovCisjZGVmaW5lIFBDSV9FUlJfUk9PVF9VTkNPUl9SQ1YJCTB4MDAwMDAwMDQKKy8qIE11bHRpIEVSUl9GQVRBTC9OT05GQVRBTCBSZWNldmllZCAqLworI2RlZmluZSBQQ0lfRVJSX1JPT1RfTVVMVElfVU5DT1JfUkNWCTB4MDAwMDAwMDgKKyNkZWZpbmUgUENJX0VSUl9ST09UX0ZJUlNUX0ZBVEFMCTB4MDAwMDAwMTAJLyogRmlyc3QgRmF0YWwgKi8KKyNkZWZpbmUgUENJX0VSUl9ST09UX05PTkZBVEFMX1JDVgkweDAwMDAwMDIwCS8qIE5vbi1GYXRhbCBSZWNlaXZlZCAqLworI2RlZmluZSBQQ0lfRVJSX1JPT1RfRkFUQUxfUkNWCQkweDAwMDAwMDQwCS8qIEZhdGFsIFJlY2VpdmVkICovCisjZGVmaW5lIFBDSV9FUlJfUk9PVF9FUlJfU1JDCTUyCS8qIEVycm9yIFNvdXJjZSBJZGVudGlmaWNhdGlvbiAqLworCisvKiBWaXJ0dWFsIENoYW5uZWwgKi8KKyNkZWZpbmUgUENJX1ZDX1BPUlRfUkVHMQk0CisjZGVmaW5lIFBDSV9WQ19QT1JUX1JFRzIJOAorI2RlZmluZSBQQ0lfVkNfUE9SVF9DVFJMCTEyCisjZGVmaW5lIFBDSV9WQ19QT1JUX1NUQVRVUwkxNAorI2RlZmluZSBQQ0lfVkNfUkVTX0NBUAkJMTYKKyNkZWZpbmUgUENJX1ZDX1JFU19DVFJMCQkyMAorI2RlZmluZSBQQ0lfVkNfUkVTX1NUQVRVUwkyNgorCisvKiBQb3dlciBCdWRnZXRpbmcgKi8KKyNkZWZpbmUgUENJX1BXUl9EU1IJCTQJLyogRGF0YSBTZWxlY3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1BXUl9EQVRBCQk4CS8qIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9QV1JfREFUQV9CQVNFKHgpCSgoeCkgJiAweGZmKQkgICAgLyogQmFzZSBQb3dlciAqLworI2RlZmluZSAgUENJX1BXUl9EQVRBX1NDQUxFKHgpCSgoKHgpID4+IDgpICYgMykgICAgLyogRGF0YSBTY2FsZSAqLworI2RlZmluZSAgUENJX1BXUl9EQVRBX1BNX1NVQih4KQkoKCh4KSA+PiAxMCkgJiA3KSAgIC8qIFBNIFN1YiBTdGF0ZSAqLworI2RlZmluZSAgUENJX1BXUl9EQVRBX1BNX1NUQVRFKHgpICgoKHgpID4+IDEzKSAmIDMpIC8qIFBNIFN0YXRlICovCisjZGVmaW5lICBQQ0lfUFdSX0RBVEFfVFlQRSh4KQkoKCh4KSA+PiAxNSkgJiA3KSAgIC8qIFR5cGUgKi8KKyNkZWZpbmUgIFBDSV9QV1JfREFUQV9SQUlMKHgpCSgoKHgpID4+IDE4KSAmIDcpICAgLyogUG93ZXIgUmFpbCAqLworI2RlZmluZSBQQ0lfUFdSX0NBUAkJMTIJLyogQ2FwYWJpbGl0eSAqLworI2RlZmluZSAgUENJX1BXUl9DQVBfQlVER0VUKHgpCSgoeCkgJiAxKQkvKiBJbmNsdWRlZCBpbiBzeXN0ZW0gYnVkZ2V0ICovCisKKy8qCisgKiBIeXBlcnRyYW5zcG9ydCBzdWIgY2FwYWJpbGl0eSB0eXBlcworICoKKyAqIFVuZm9ydHVuYXRlbHkgdGhlcmUgYXJlIGJvdGggMyBiaXQgYW5kIDUgYml0IGNhcGFiaWxpdHkgdHlwZXMgZGVmaW5lZAorICogaW4gdGhlIEhUIHNwZWMsIGNhdGVyaW5nIGZvciB0aGF0IGlzIGEgbGl0dGxlIG1lc3N5LiBZb3UgcHJvYmFibHkgZG9uJ3QKKyAqIHdhbnQgdG8gdXNlIHRoZXNlIGRpcmVjdGx5LCBqdXN0IHVzZSBwY2lfZmluZF9odF9jYXBhYmlsaXR5KCkgYW5kIGl0CisgKiB3aWxsIGRvIHRoZSByaWdodCB0aGluZyBmb3IgeW91LgorICovCisjZGVmaW5lIEhUXzNCSVRfQ0FQX01BU0sJMHhFMAorI2RlZmluZSBIVF9DQVBUWVBFX1NMQVZFCTB4MDAJLyogU2xhdmUvUHJpbWFyeSBsaW5rIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9IT1NUCQkweDIwCS8qIEhvc3QvU2Vjb25kYXJ5IGxpbmsgY29uZmlndXJhdGlvbiAqLworCisjZGVmaW5lIEhUXzVCSVRfQ0FQX01BU0sJMHhGOAorI2RlZmluZSBIVF9DQVBUWVBFX0lSUQkJMHg4MAkvKiBJUlEgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBIVF9DQVBUWVBFX1JFTUFQUElOR180MAkweEEwCS8qIDQwIGJpdCBhZGRyZXNzIHJlbWFwcGluZyAqLworI2RlZmluZSBIVF9DQVBUWVBFX1JFTUFQUElOR182NCAweEEyCS8qIDY0IGJpdCBhZGRyZXNzIHJlbWFwcGluZyAqLworI2RlZmluZSBIVF9DQVBUWVBFX1VOSVRJRF9DTFVNUAkweDkwCS8qIFVuaXQgSUQgY2x1bXBpbmcgKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9FWFRDT05GCTB4OTgJLyogRXh0ZW5kZWQgQ29uZmlndXJhdGlvbiBTcGFjZSBBY2Nlc3MgKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9NU0lfTUFQUElORwkweEE4CS8qIE1TSSBNYXBwaW5nIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgIEhUX01TSV9GTEFHUwkJMHgwMgkJLyogT2Zmc2V0IHRvIGZsYWdzICovCisjZGVmaW5lICBIVF9NU0lfRkxBR1NfRU5BQkxFCTB4MQkJLyogTWFwcGluZyBlbmFibGUgKi8KKyNkZWZpbmUgIEhUX01TSV9GTEFHU19GSVhFRAkweDIJCS8qIEZpeGVkIG1hcHBpbmcgb25seSAqLworI2RlZmluZSAgSFRfTVNJX0ZJWEVEX0FERFIJMHgwMDAwMDAwMEZFRTAwMDAwVUxMCS8qIEZpeGVkIGFkZHIgKi8KKyNkZWZpbmUgIEhUX01TSV9BRERSX0xPCQkweDA0CQkvKiBPZmZzZXQgdG8gbG93IGFkZHIgYml0cyAqLworI2RlZmluZSAgSFRfTVNJX0FERFJfTE9fTUFTSwkweEZGRjAwMDAwCS8qIExvdyBhZGRyZXNzIGJpdCBtYXNrICovCisjZGVmaW5lICBIVF9NU0lfQUREUl9ISQkJMHgwOAkJLyogT2Zmc2V0IHRvIGhpZ2ggYWRkciBiaXRzICovCisjZGVmaW5lIEhUX0NBUFRZUEVfRElSRUNUX1JPVVRFCTB4QjAJLyogRGlyZWN0IHJvdXRpbmcgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBIVF9DQVBUWVBFX1ZDU0VUCTB4QjgJLyogVmlydHVhbCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9FUlJPUl9SRVRSWQkweEMwCS8qIFJldHJ5IG9uIGVycm9yIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9HRU4zCQkweEQwCS8qIEdlbmVyYXRpb24gMyBoeXBlcnRyYW5zcG9ydCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEhUX0NBUFRZUEVfUE0JCTB4RTAJLyogSHlwZXJ0cmFuc3BvcnQgcG93ZXJtYW5hZ2VtZW50IGNvbmZpZ3VyYXRpb24gKi8KKworLyogQWx0ZXJuYXRpdmUgUm91dGluZy1JRCBJbnRlcnByZXRhdGlvbiAqLworI2RlZmluZSBQQ0lfQVJJX0NBUAkJMHgwNAkvKiBBUkkgQ2FwYWJpbGl0eSBSZWdpc3RlciAqLworI2RlZmluZSAgUENJX0FSSV9DQVBfTUZWQwkweDAwMDEJLyogTUZWQyBGdW5jdGlvbiBHcm91cHMgQ2FwYWJpbGl0eSAqLworI2RlZmluZSAgUENJX0FSSV9DQVBfQUNTCTB4MDAwMgkvKiBBQ1MgRnVuY3Rpb24gR3JvdXBzIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgIFBDSV9BUklfQ0FQX05GTih4KQkoKCh4KSA+PiA4KSAmIDB4ZmYpIC8qIE5leHQgRnVuY3Rpb24gTnVtYmVyICovCisjZGVmaW5lIFBDSV9BUklfQ1RSTAkJMHgwNgkvKiBBUkkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgUENJX0FSSV9DVFJMX01GVkMJMHgwMDAxCS8qIE1GVkMgRnVuY3Rpb24gR3JvdXBzIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0FSSV9DVFJMX0FDUwkweDAwMDIJLyogQUNTIEZ1bmN0aW9uIEdyb3VwcyBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9BUklfQ1RSTF9GRyh4KQkoKCh4KSA+PiA0KSAmIDcpIC8qIEZ1bmN0aW9uIEdyb3VwICovCisKKy8qIEFkZHJlc3MgVHJhbnNsYXRpb24gU2VydmljZSAqLworI2RlZmluZSBQQ0lfQVRTX0NBUAkJMHgwNAkvKiBBVFMgQ2FwYWJpbGl0eSBSZWdpc3RlciAqLworI2RlZmluZSAgUENJX0FUU19DQVBfUURFUCh4KQkoKHgpICYgMHgxZikJLyogSW52YWxpZGF0ZSBRdWV1ZSBEZXB0aCAqLworI2RlZmluZSAgUENJX0FUU19NQVhfUURFUAkzMgkvKiBNYXggSW52YWxpZGF0ZSBRdWV1ZSBEZXB0aCAqLworI2RlZmluZSBQQ0lfQVRTX0NUUkwJCTB4MDYJLyogQVRTIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9BVFNfQ1RSTF9FTkFCTEUJMHg4MDAwCS8qIEFUUyBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9BVFNfQ1RSTF9TVFUoeCkJKCh4KSAmIDB4MWYpCS8qIFNtYWxsZXN0IFRyYW5zbGF0aW9uIFVuaXQgKi8KKyNkZWZpbmUgIFBDSV9BVFNfTUlOX1NUVQkxMgkvKiBzaGlmdCBvZiBtaW5pbXVtIFNUVSBibG9jayAqLworCisvKiBQYWdlIFJlcXVlc3QgSW50ZXJmYWNlICovCisjZGVmaW5lIFBDSV9QUklfQ0FQCQkweDEzICAgIC8qIFBSSSBjYXBhYmlsaXR5IElEICovCisjZGVmaW5lIFBDSV9QUklfQ09OVFJPTF9PRkYJMHgwNAkvKiBPZmZzZXQgb2YgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBQQ0lfUFJJX1NUQVRVU19PRkYJMHgwNgkvKiBPZmZzZXQgb2Ygc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9QUklfRU5BQkxFCQkweDAwMDEJLyogRW5hYmxlIG1hc2sgKi8KKyNkZWZpbmUgUENJX1BSSV9SRVNFVAkJMHgwMDAyCS8qIFJlc2V0IGJpdCBtYXNrICovCisjZGVmaW5lIFBDSV9QUklfU1RBVFVTX1JGCTB4MDAwMSAgLyogUmVxdWVzdCBGYWlsdXJlICovCisjZGVmaW5lIFBDSV9QUklfU1RBVFVTX1VQUkdJCTB4MDAwMiAgLyogVW5leHBlY3RlZCBQUkcgaW5kZXggKi8KKyNkZWZpbmUgUENJX1BSSV9TVEFUVVNfU1RPUFBFRAkweDAxMDAgIC8qIFBSSSBTdG9wcGVkICovCisjZGVmaW5lIFBDSV9QUklfTUFYX1JFUV9PRkYJMHgwOAkvKiBDYXAgb2Zmc2V0IGZvciBtYXggcmVxcyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUENJX1BSSV9BTExPQ19SRVFfT0ZGCTB4MGMJLyogQ2FwIG9mZnNldCBmb3IgbWF4IHJlcXMgYWxsb3dlZCAqLworCisvKiBQQVNJRCBjYXBhYmlsaXR5ICovCisjZGVmaW5lIFBDSV9QQVNJRF9DQVAJCTB4MWIgICAgLyogUEFTSUQgY2FwYWJpbGl0eSBJRCAqLworI2RlZmluZSBQQ0lfUEFTSURfQ0FQX09GRgkweDA0ICAgIC8qIFBBU0lEIGZlYXR1cmUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1BBU0lEX0NPTlRST0xfT0ZGICAgMHgwNiAgICAvKiBQQVNJRCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9QQVNJRF9FTkFCTEUJMHgwMQkvKiBFbmFibGUvU3VwcG9ydGVkIGJpdCAqLworI2RlZmluZSBQQ0lfUEFTSURfRVhFQwkJMHgwMgkvKiBFeGVjIHBlcm1pc3Npb25zIEVuYWJsZS9TdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUENJX1BBU0lEX1BSSVYJCTB4MDQJLyogUHJpdmlsZWRnZSBNb2RlIEVuYWJsZS9TdXBwb3J0ICovCisKKy8qIFNpbmdsZSBSb290IEkvTyBWaXJ0dWFsaXphdGlvbiAqLworI2RlZmluZSBQQ0lfU1JJT1ZfQ0FQCQkweDA0CS8qIFNSLUlPViBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgIFBDSV9TUklPVl9DQVBfVkZNCTB4MDEJLyogVkYgTWlncmF0aW9uIENhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9TUklPVl9DQVBfSU5UUih4KQkoKHgpID4+IDIxKSAvKiBJbnRlcnJ1cHQgTWVzc2FnZSBOdW1iZXIgKi8KKyNkZWZpbmUgUENJX1NSSU9WX0NUUkwJCTB4MDgJLyogU1ItSU9WIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9TUklPVl9DVFJMX1ZGRQkweDAxCS8qIFZGIEVuYWJsZSAqLworI2RlZmluZSAgUENJX1NSSU9WX0NUUkxfVkZNCTB4MDIJLyogVkYgTWlncmF0aW9uIEVuYWJsZSAqLworI2RlZmluZSAgUENJX1NSSU9WX0NUUkxfSU5UUgkweDA0CS8qIFZGIE1pZ3JhdGlvbiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfU1JJT1ZfQ1RSTF9NU0UJMHgwOAkvKiBWRiBNZW1vcnkgU3BhY2UgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfU1JJT1ZfQ1RSTF9BUkkJMHgxMAkvKiBBUkkgQ2FwYWJsZSBIaWVyYXJjaHkgKi8KKyNkZWZpbmUgUENJX1NSSU9WX1NUQVRVUwkweDBhCS8qIFNSLUlPViBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9TUklPVl9TVEFUVVNfVkZNCTB4MDEJLyogVkYgTWlncmF0aW9uIFN0YXR1cyAqLworI2RlZmluZSBQQ0lfU1JJT1ZfSU5JVElBTF9WRgkweDBjCS8qIEluaXRpYWwgVkZzICovCisjZGVmaW5lIFBDSV9TUklPVl9UT1RBTF9WRgkweDBlCS8qIFRvdGFsIFZGcyAqLworI2RlZmluZSBQQ0lfU1JJT1ZfTlVNX1ZGCTB4MTAJLyogTnVtYmVyIG9mIFZGcyAqLworI2RlZmluZSBQQ0lfU1JJT1ZfRlVOQ19MSU5LCTB4MTIJLyogRnVuY3Rpb24gRGVwZW5kZW5jeSBMaW5rICovCisjZGVmaW5lIFBDSV9TUklPVl9WRl9PRkZTRVQJMHgxNAkvKiBGaXJzdCBWRiBPZmZzZXQgKi8KKyNkZWZpbmUgUENJX1NSSU9WX1ZGX1NUUklERQkweDE2CS8qIEZvbGxvd2luZyBWRiBTdHJpZGUgKi8KKyNkZWZpbmUgUENJX1NSSU9WX1ZGX0RJRAkweDFhCS8qIFZGIERldmljZSBJRCAqLworI2RlZmluZSBQQ0lfU1JJT1ZfU1VQX1BHU0laRQkweDFjCS8qIFN1cHBvcnRlZCBQYWdlIFNpemVzICovCisjZGVmaW5lIFBDSV9TUklPVl9TWVNfUEdTSVpFCTB4MjAJLyogU3lzdGVtIFBhZ2UgU2l6ZSAqLworI2RlZmluZSBQQ0lfU1JJT1ZfQkFSCQkweDI0CS8qIFZGIEJBUjAgKi8KKyNkZWZpbmUgIFBDSV9TUklPVl9OVU1fQkFSUwk2CS8qIE51bWJlciBvZiBWRiBCQVJzICovCisjZGVmaW5lIFBDSV9TUklPVl9WRk0JCTB4M2MJLyogVkYgTWlncmF0aW9uIFN0YXRlIEFycmF5IE9mZnNldCovCisjZGVmaW5lICBQQ0lfU1JJT1ZfVkZNX0JJUih4KQkoKHgpICYgNykJLyogU3RhdGUgQklSICovCisjZGVmaW5lICBQQ0lfU1JJT1ZfVkZNX09GRlNFVCh4KSAoKHgpICYgfjcpCS8qIFN0YXRlIE9mZnNldCAqLworI2RlZmluZSAgUENJX1NSSU9WX1ZGTV9VQQkweDAJLyogSW5hY3RpdmUuVW5hdmFpbGFibGUgKi8KKyNkZWZpbmUgIFBDSV9TUklPVl9WRk1fTUkJMHgxCS8qIERvcm1hbnQuTWlncmF0ZUluICovCisjZGVmaW5lICBQQ0lfU1JJT1ZfVkZNX01PCTB4MgkvKiBBY3RpdmUuTWlncmF0ZU91dCAqLworI2RlZmluZSAgUENJX1NSSU9WX1ZGTV9BVgkweDMJLyogQWN0aXZlLkF2YWlsYWJsZSAqLworCisjZGVmaW5lIFBDSV9MVFJfTUFYX1NOT09QX0xBVAkweDQKKyNkZWZpbmUgUENJX0xUUl9NQVhfTk9TTk9PUF9MQVQJMHg2CisjZGVmaW5lICBQQ0lfTFRSX1ZBTFVFX01BU0sJMHgwMDAwMDNmZgorI2RlZmluZSAgUENJX0xUUl9TQ0FMRV9NQVNLCTB4MDAwMDFjMDAKKyNkZWZpbmUgIFBDSV9MVFJfU0NBTEVfU0hJRlQJMTAKKworLyogQWNjZXNzIENvbnRyb2wgU2VydmljZSAqLworI2RlZmluZSBQQ0lfQUNTX0NBUAkJMHgwNAkvKiBBQ1MgQ2FwYWJpbGl0eSBSZWdpc3RlciAqLworI2RlZmluZSAgUENJX0FDU19TVgkJMHgwMQkvKiBTb3VyY2UgVmFsaWRhdGlvbiAqLworI2RlZmluZSAgUENJX0FDU19UQgkJMHgwMgkvKiBUcmFuc2xhdGlvbiBCbG9ja2luZyAqLworI2RlZmluZSAgUENJX0FDU19SUgkJMHgwNAkvKiBQMlAgUmVxdWVzdCBSZWRpcmVjdCAqLworI2RlZmluZSAgUENJX0FDU19DUgkJMHgwOAkvKiBQMlAgQ29tcGxldGlvbiBSZWRpcmVjdCAqLworI2RlZmluZSAgUENJX0FDU19VRgkJMHgxMAkvKiBVcHN0cmVhbSBGb3J3YXJkaW5nICovCisjZGVmaW5lICBQQ0lfQUNTX0VDCQkweDIwCS8qIFAyUCBFZ3Jlc3MgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0FDU19EVAkJMHg0MAkvKiBEaXJlY3QgVHJhbnNsYXRlZCBQMlAgKi8KKyNkZWZpbmUgUENJX0FDU19DVFJMCQkweDA2CS8qIEFDUyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9BQ1NfRUdSRVNTX0NUTF9WCTB4MDgJLyogQUNTIEVncmVzcyBDb250cm9sIFZlY3RvciAqLworCisjZW5kaWYgLyogTElOVVhfUENJX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODliNjViCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKQEAgLTAsMCArMSw0ODEgQEAKKy8qCisgKiBQZXJmb3JtYW5jZSBldmVudHM6CisgKgorICogICAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMDksIFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgorICogICAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSwgUmVkIEhhdCwgSW5jLiwgUGV0ZXIgWmlqbHN0cmEKKyAqCisgKiBEYXRhIHR5cGUgZGVmaW5pdGlvbnMsIGRlY2xhcmF0aW9ucywgcHJvdG90eXBlcy4KKyAqCisgKiAgICBTdGFydGVkIGJ5OiBUaG9tYXMgR2xlaXhuZXIgYW5kIEluZ28gTW9sbmFyCisgKgorICogRm9yIGxpY2VuY2luZyBkZXRhaWxzIHNlZSBrZXJuZWwtYmFzZS9DT1BZSU5HCisgKi8KKyNpZm5kZWYgX0xJTlVYX1BFUkZfRVZFTlRfSAorI2RlZmluZSBfTElOVVhfUEVSRl9FVkVOVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKgorICogVXNlci1zcGFjZSBBQkkgYml0czoKKyAqLworCisvKgorICogYXR0ci50eXBlCisgKi8KK2VudW0gcGVyZl90eXBlX2lkIHsKKwlQRVJGX1RZUEVfSEFSRFdBUkUJCQk9IDAsCisJUEVSRl9UWVBFX1NPRlRXQVJFCQkJPSAxLAorCVBFUkZfVFlQRV9UUkFDRVBPSU5UCQkJPSAyLAorCVBFUkZfVFlQRV9IV19DQUNIRQkJCT0gMywKKwlQRVJGX1RZUEVfUkFXCQkJCT0gNCwKKwlQRVJGX1RZUEVfQlJFQUtQT0lOVAkJCT0gNSwKKworCVBFUkZfVFlQRV9NQVgsCQkJCS8qIG5vbi1BQkkgKi8KK307CisKKy8qCisgKiBHZW5lcmFsaXplZCBwZXJmb3JtYW5jZSBldmVudCBldmVudF9pZCB0eXBlcywgdXNlZCBieSB0aGUKKyAqIGF0dHIuZXZlbnRfaWQgcGFyYW1ldGVyIG9mIHRoZSBzeXNfcGVyZl9ldmVudF9vcGVuKCkKKyAqIHN5c2NhbGw6CisgKi8KK2VudW0gcGVyZl9od19pZCB7CisJLyoKKwkgKiBDb21tb24gaGFyZHdhcmUgZXZlbnRzLCBnZW5lcmFsaXplZCBieSB0aGUga2VybmVsOgorCSAqLworCVBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUwkJPSAwLAorCVBFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TCQk9IDEsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTCQk9IDIsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVMJCT0gMywKKwlQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlMJPSA0LAorCVBFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFUwkJPSA1LAorCVBFUkZfQ09VTlRfSFdfQlVTX0NZQ0xFUwkJPSA2LAorCVBFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfRlJPTlRFTkQJPSA3LAorCVBFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfQkFDS0VORAk9IDgsCisKKwlQRVJGX0NPVU5UX0hXX01BWCwJCQkvKiBub24tQUJJICovCit9OworCisvKgorICogR2VuZXJhbGl6ZWQgaGFyZHdhcmUgY2FjaGUgZXZlbnRzOgorICoKKyAqICAgICAgIHsgTDEtRCwgTDEtSSwgTExDLCBJVExCLCBEVExCLCBCUFUsIE5PREUgfSB4CisgKiAgICAgICB7IHJlYWQsIHdyaXRlLCBwcmVmZXRjaCB9IHgKKyAqICAgICAgIHsgYWNjZXNzZXMsIG1pc3NlcyB9CisgKi8KK2VudW0gcGVyZl9od19jYWNoZV9pZCB7CisJUEVSRl9DT1VOVF9IV19DQUNIRV9MMUQJCQk9IDAsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9MMUkJCQk9IDEsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9MTAkJCT0gMiwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX0RUTEIJCT0gMywKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX0lUTEIJCT0gNCwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX0JQVQkJCT0gNSwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX05PREUJCT0gNiwKKworCVBFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYLAkJLyogbm9uLUFCSSAqLworfTsKKworZW51bSBwZXJmX2h3X2NhY2hlX29wX2lkIHsKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX1JFQUQJCT0gMCwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX1dSSVRFCQk9IDEsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9QUkVGRVRDSAkJPSAyLAorCisJUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVgsCQkvKiBub24tQUJJICovCit9OworCitlbnVtIHBlcmZfaHdfY2FjaGVfb3BfcmVzdWx0X2lkIHsKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9BQ0NFU1MJPSAwLAorCVBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01JU1MJCT0gMSwKKworCVBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWCwJCS8qIG5vbi1BQkkgKi8KK307CisKKy8qCisgKiBTcGVjaWFsICJzb2Z0d2FyZSIgZXZlbnRzIHByb3ZpZGVkIGJ5IHRoZSBrZXJuZWwsIGV2ZW4gaWYgdGhlIGhhcmR3YXJlCisgKiBkb2VzIG5vdCBzdXBwb3J0IHBlcmZvcm1hbmNlIGV2ZW50cy4gVGhlc2UgZXZlbnRzIG1lYXN1cmUgdmFyaW91cworICogcGh5c2ljYWwgYW5kIHN3IGV2ZW50cyBvZiB0aGUga2VybmVsIChhbmQgYWxsb3cgdGhlIHByb2ZpbGluZyBvZiB0aGVtIGFzCisgKiB3ZWxsKToKKyAqLworZW51bSBwZXJmX3N3X2lkcyB7CisJUEVSRl9DT1VOVF9TV19DUFVfQ0xPQ0sJCQk9IDAsCisJUEVSRl9DT1VOVF9TV19UQVNLX0NMT0NLCQk9IDEsCisJUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUwkJPSAyLAorCVBFUkZfQ09VTlRfU1dfQ09OVEVYVF9TV0lUQ0hFUwkJPSAzLAorCVBFUkZfQ09VTlRfU1dfQ1BVX01JR1JBVElPTlMJCT0gNCwKKwlQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01JTgkJPSA1LAorCVBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKCQk9IDYsCisJUEVSRl9DT1VOVF9TV19BTElHTk1FTlRfRkFVTFRTCQk9IDcsCisJUEVSRl9DT1VOVF9TV19FTVVMQVRJT05fRkFVTFRTCQk9IDgsCisKKwlQRVJGX0NPVU5UX1NXX01BWCwJCQkvKiBub24tQUJJICovCit9OworCisvKgorICogQml0cyB0aGF0IGNhbiBiZSBzZXQgaW4gYXR0ci5zYW1wbGVfdHlwZSB0byByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBpbiB0aGUgb3ZlcmZsb3cgcGFja2V0cy4KKyAqLworZW51bSBwZXJmX2V2ZW50X3NhbXBsZV9mb3JtYXQgeworCVBFUkZfU0FNUExFX0lQCQkJCT0gMVUgPDwgMCwKKwlQRVJGX1NBTVBMRV9USUQJCQkJPSAxVSA8PCAxLAorCVBFUkZfU0FNUExFX1RJTUUJCQk9IDFVIDw8IDIsCisJUEVSRl9TQU1QTEVfQUREUgkJCT0gMVUgPDwgMywKKwlQRVJGX1NBTVBMRV9SRUFECQkJPSAxVSA8PCA0LAorCVBFUkZfU0FNUExFX0NBTExDSEFJTgkJCT0gMVUgPDwgNSwKKwlQRVJGX1NBTVBMRV9JRAkJCQk9IDFVIDw8IDYsCisJUEVSRl9TQU1QTEVfQ1BVCQkJCT0gMVUgPDwgNywKKwlQRVJGX1NBTVBMRV9QRVJJT0QJCQk9IDFVIDw8IDgsCisJUEVSRl9TQU1QTEVfU1RSRUFNX0lECQkJPSAxVSA8PCA5LAorCVBFUkZfU0FNUExFX1JBVwkJCQk9IDFVIDw8IDEwLAorCisJUEVSRl9TQU1QTEVfTUFYID0gMVUgPDwgMTEsCQkvKiBub24tQUJJICovCit9OworCisvKgorICogVGhlIGZvcm1hdCBvZiB0aGUgZGF0YSByZXR1cm5lZCBieSByZWFkKCkgb24gYSBwZXJmIGV2ZW50IGZkLAorICogYXMgc3BlY2lmaWVkIGJ5IGF0dHIucmVhZF9mb3JtYXQ6CisgKgorICogc3RydWN0IHJlYWRfZm9ybWF0IHsKKyAqCXsgdTY0CQl2YWx1ZTsKKyAqCSAgeyB1NjQJCXRpbWVfZW5hYmxlZDsgfSAmJiBQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX0VOQUJMRUQKKyAqCSAgeyB1NjQJCXRpbWVfcnVubmluZzsgfSAmJiBQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX1JVTk5JTkcKKyAqCSAgeyB1NjQJCWlkOyAgICAgICAgICAgfSAmJiBQRVJGX0ZPUk1BVF9JRAorICoJfSAmJiAhUEVSRl9GT1JNQVRfR1JPVVAKKyAqCisgKgl7IHU2NAkJbnI7CisgKgkgIHsgdTY0CQl0aW1lX2VuYWJsZWQ7IH0gJiYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVECisgKgkgIHsgdTY0CQl0aW1lX3J1bm5pbmc7IH0gJiYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9SVU5OSU5HCisgKgkgIHsgdTY0CQl2YWx1ZTsKKyAqCSAgICB7IHU2NAlpZDsgICAgICAgICAgIH0gJiYgUEVSRl9GT1JNQVRfSUQKKyAqCSAgfQkJY250cltucl07CisgKgl9ICYmIFBFUkZfRk9STUFUX0dST1VQCisgKiB9OworICovCitlbnVtIHBlcmZfZXZlbnRfcmVhZF9mb3JtYXQgeworCVBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5BQkxFRAkJPSAxVSA8PCAwLAorCVBFUkZfRk9STUFUX1RPVEFMX1RJTUVfUlVOTklORwkJPSAxVSA8PCAxLAorCVBFUkZfRk9STUFUX0lECQkJCT0gMVUgPDwgMiwKKwlQRVJGX0ZPUk1BVF9HUk9VUAkJCT0gMVUgPDwgMywKKworCVBFUkZfRk9STUFUX01BWCA9IDFVIDw8IDQsCQkvKiBub24tQUJJICovCit9OworCisjZGVmaW5lIFBFUkZfQVRUUl9TSVpFX1ZFUjAJNjQJLyogc2l6ZW9mIGZpcnN0IHB1Ymxpc2hlZCBzdHJ1Y3QgKi8KKworLyoKKyAqIEhhcmR3YXJlIGV2ZW50X2lkIHRvIG1vbml0b3IgdmlhIGEgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyBldmVudDoKKyAqLworc3RydWN0IHBlcmZfZXZlbnRfYXR0ciB7CisKKwkvKgorCSAqIE1ham9yIHR5cGU6IGhhcmR3YXJlL3NvZnR3YXJlL3RyYWNlcG9pbnQvZXRjLgorCSAqLworCV9fdTMyCQkJdHlwZTsKKworCS8qCisJICogU2l6ZSBvZiB0aGUgYXR0ciBzdHJ1Y3R1cmUsIGZvciBmd2QvYndkIGNvbXBhdC4KKwkgKi8KKwlfX3UzMgkJCXNpemU7CisKKwkvKgorCSAqIFR5cGUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKwkgKi8KKwlfX3U2NAkJCWNvbmZpZzsKKworCXVuaW9uIHsKKwkJX191NjQJCXNhbXBsZV9wZXJpb2Q7CisJCV9fdTY0CQlzYW1wbGVfZnJlcTsKKwl9OworCisJX191NjQJCQlzYW1wbGVfdHlwZTsKKwlfX3U2NAkJCXJlYWRfZm9ybWF0OworCisJX191NjQJCQlkaXNhYmxlZCAgICAgICA6ICAxLCAvKiBvZmYgYnkgZGVmYXVsdCAgICAgICAgKi8KKwkJCQlpbmhlcml0CSAgICAgICA6ICAxLCAvKiBjaGlsZHJlbiBpbmhlcml0IGl0ICAgKi8KKwkJCQlwaW5uZWQJICAgICAgIDogIDEsIC8qIG11c3QgYWx3YXlzIGJlIG9uIFBNVSAqLworCQkJCWV4Y2x1c2l2ZSAgICAgIDogIDEsIC8qIG9ubHkgZ3JvdXAgb24gUE1VICAgICAqLworCQkJCWV4Y2x1ZGVfdXNlciAgIDogIDEsIC8qIGRvbid0IGNvdW50IHVzZXIgICAgICAqLworCQkJCWV4Y2x1ZGVfa2VybmVsIDogIDEsIC8qIGRpdHRvIGtlcm5lbCAgICAgICAgICAqLworCQkJCWV4Y2x1ZGVfaHYgICAgIDogIDEsIC8qIGRpdHRvIGh5cGVydmlzb3IgICAgICAqLworCQkJCWV4Y2x1ZGVfaWRsZSAgIDogIDEsIC8qIGRvbid0IGNvdW50IHdoZW4gaWRsZSAqLworCQkJCW1tYXAgICAgICAgICAgIDogIDEsIC8qIGluY2x1ZGUgbW1hcCBkYXRhICAgICAqLworCQkJCWNvbW0JICAgICAgIDogIDEsIC8qIGluY2x1ZGUgY29tbSBkYXRhICAgICAqLworCQkJCWZyZXEgICAgICAgICAgIDogIDEsIC8qIHVzZSBmcmVxLCBub3QgcGVyaW9kICAqLworCQkJCWluaGVyaXRfc3RhdCAgIDogIDEsIC8qIHBlciB0YXNrIGNvdW50cyAgICAgICAqLworCQkJCWVuYWJsZV9vbl9leGVjIDogIDEsIC8qIG5leHQgZXhlYyBlbmFibGVzICAgICAqLworCQkJCXRhc2sgICAgICAgICAgIDogIDEsIC8qIHRyYWNlIGZvcmsvZXhpdCAgICAgICAqLworCQkJCXdhdGVybWFyayAgICAgIDogIDEsIC8qIHdha2V1cF93YXRlcm1hcmsgICAgICAqLworCQkJCS8qCisJCQkJICogcHJlY2lzZV9pcDoKKwkJCQkgKgorCQkJCSAqICAwIC0gU0FNUExFX0lQIGNhbiBoYXZlIGFyYml0cmFyeSBza2lkCisJCQkJICogIDEgLSBTQU1QTEVfSVAgbXVzdCBoYXZlIGNvbnN0YW50IHNraWQKKwkJCQkgKiAgMiAtIFNBTVBMRV9JUCByZXF1ZXN0ZWQgdG8gaGF2ZSAwIHNraWQKKwkJCQkgKiAgMyAtIFNBTVBMRV9JUCBtdXN0IGhhdmUgMCBza2lkCisJCQkJICoKKwkJCQkgKiAgU2VlIGFsc28gUEVSRl9SRUNPUkRfTUlTQ19FWEFDVF9JUAorCQkJCSAqLworCQkJCXByZWNpc2VfaXAgICAgIDogIDIsIC8qIHNraWQgY29uc3RyYWludCAgICAgICAqLworCQkJCW1tYXBfZGF0YSAgICAgIDogIDEsIC8qIG5vbi1leGVjIG1tYXAgZGF0YSAgICAqLworCQkJCXNhbXBsZV9pZF9hbGwgIDogIDEsIC8qIHNhbXBsZV90eXBlIGFsbCBldmVudHMgKi8KKworCQkJCWV4Y2x1ZGVfaG9zdCAgIDogIDEsIC8qIGRvbid0IGNvdW50IGluIGhvc3QgICAqLworCQkJCWV4Y2x1ZGVfZ3Vlc3QgIDogIDEsIC8qIGRvbid0IGNvdW50IGluIGd1ZXN0ICAqLworCisJCQkJX19yZXNlcnZlZF8xICAgOiA0MzsKKworCXVuaW9uIHsKKwkJX191MzIJCXdha2V1cF9ldmVudHM7CSAgLyogd2FrZXVwIGV2ZXJ5IG4gZXZlbnRzICovCisJCV9fdTMyCQl3YWtldXBfd2F0ZXJtYXJrOyAvKiBieXRlcyBiZWZvcmUgd2FrZXVwICAgKi8KKwl9OworCisJX191MzIJCQlicF90eXBlOworCXVuaW9uIHsKKwkJX191NjQJCWJwX2FkZHI7CisJCV9fdTY0CQljb25maWcxOyAvKiBleHRlbnNpb24gb2YgY29uZmlnICovCisJfTsKKwl1bmlvbiB7CisJCV9fdTY0CQlicF9sZW47CisJCV9fdTY0CQljb25maWcyOyAvKiBleHRlbnNpb24gb2YgY29uZmlnMSAqLworCX07Cit9OworCisvKgorICogSW9jdGxzIHRoYXQgY2FuIGJlIGRvbmUgb24gYSBwZXJmIGV2ZW50IGZkOgorICovCisjZGVmaW5lIFBFUkZfRVZFTlRfSU9DX0VOQUJMRQkJX0lPICgnJCcsIDApCisjZGVmaW5lIFBFUkZfRVZFTlRfSU9DX0RJU0FCTEUJCV9JTyAoJyQnLCAxKQorI2RlZmluZSBQRVJGX0VWRU5UX0lPQ19SRUZSRVNICQlfSU8gKCckJywgMikKKyNkZWZpbmUgUEVSRl9FVkVOVF9JT0NfUkVTRVQJCV9JTyAoJyQnLCAzKQorI2RlZmluZSBQRVJGX0VWRU5UX0lPQ19QRVJJT0QJCV9JT1coJyQnLCA0LCBfX3U2NCkKKyNkZWZpbmUgUEVSRl9FVkVOVF9JT0NfU0VUX09VVFBVVAlfSU8gKCckJywgNSkKKyNkZWZpbmUgUEVSRl9FVkVOVF9JT0NfU0VUX0ZJTFRFUglfSU9XKCckJywgNiwgY2hhciAqKQorCitlbnVtIHBlcmZfZXZlbnRfaW9jX2ZsYWdzIHsKKwlQRVJGX0lPQ19GTEFHX0dST1VQCQk9IDFVIDw8IDAsCit9OworCisvKgorICogU3RydWN0dXJlIG9mIHRoZSBwYWdlIHRoYXQgY2FuIGJlIG1hcHBlZCB2aWEgbW1hcAorICovCitzdHJ1Y3QgcGVyZl9ldmVudF9tbWFwX3BhZ2UgeworCV9fdTMyCXZlcnNpb247CQkvKiB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIHN0cnVjdHVyZSAqLworCV9fdTMyCWNvbXBhdF92ZXJzaW9uOwkJLyogbG93ZXN0IHZlcnNpb24gdGhpcyBpcyBjb21wYXQgd2l0aCAqLworCisJLyoKKwkgKiBCaXRzIG5lZWRlZCB0byByZWFkIHRoZSBodyBldmVudHMgaW4gdXNlci1zcGFjZS4KKwkgKgorCSAqICAgdTMyIHNlcTsKKwkgKiAgIHM2NCBjb3VudDsKKwkgKgorCSAqICAgZG8geworCSAqICAgICBzZXEgPSBwYy0+bG9jazsKKwkgKgorCSAqICAgICBiYXJyaWVyKCkKKwkgKiAgICAgaWYgKHBjLT5pbmRleCkgeworCSAqICAgICAgIGNvdW50ID0gcG1jX3JlYWQocGMtPmluZGV4IC0gMSk7CisJICogICAgICAgY291bnQgKz0gcGMtPm9mZnNldDsKKwkgKiAgICAgfSBlbHNlCisJICogICAgICAgZ290byByZWd1bGFyX3JlYWQ7CisJICoKKwkgKiAgICAgYmFycmllcigpOworCSAqICAgfSB3aGlsZSAocGMtPmxvY2sgIT0gc2VxKTsKKwkgKgorCSAqIE5PVEU6IGZvciBvYnZpb3VzIHJlYXNvbiB0aGlzIG9ubHkgd29ya3Mgb24gc2VsZi1tb25pdG9yaW5nCisJICogICAgICAgcHJvY2Vzc2VzLgorCSAqLworCV9fdTMyCWxvY2s7CQkJLyogc2VxbG9jayBmb3Igc3luY2hyb25pemF0aW9uICovCisJX191MzIJaW5kZXg7CQkJLyogaGFyZHdhcmUgZXZlbnQgaWRlbnRpZmllciAqLworCV9fczY0CW9mZnNldDsJCQkvKiBhZGQgdG8gaGFyZHdhcmUgZXZlbnQgdmFsdWUgKi8KKwlfX3U2NAl0aW1lX2VuYWJsZWQ7CQkvKiB0aW1lIGV2ZW50IGFjdGl2ZSAqLworCV9fdTY0CXRpbWVfcnVubmluZzsJCS8qIHRpbWUgZXZlbnQgb24gY3B1ICovCisKKwkJLyoKKwkJICogSG9sZSBmb3IgZXh0ZW5zaW9uIG9mIHRoZSBzZWxmIG1vbml0b3IgY2FwYWJpbGl0aWVzCisJCSAqLworCisJX191NjQJX19yZXNlcnZlZFsxMjNdOwkvKiBhbGlnbiB0byAxayAqLworCisJLyoKKwkgKiBDb250cm9sIGRhdGEgZm9yIHRoZSBtbWFwKCkgZGF0YSBidWZmZXIuCisJICoKKwkgKiBVc2VyLXNwYWNlIHJlYWRpbmcgdGhlIEBkYXRhX2hlYWQgdmFsdWUgc2hvdWxkIGlzc3VlIGFuIHJtYigpLCBvbgorCSAqIFNNUCBjYXBhYmxlIHBsYXRmb3JtcywgYWZ0ZXIgcmVhZGluZyB0aGlzIHZhbHVlIC0tIHNlZQorCSAqIHBlcmZfZXZlbnRfd2FrZXVwKCkuCisJICoKKwkgKiBXaGVuIHRoZSBtYXBwaW5nIGlzIFBST1RfV1JJVEUgdGhlIEBkYXRhX3RhaWwgdmFsdWUgc2hvdWxkIGJlCisJICogd3JpdHRlbiBieSB1c2Vyc3BhY2UgdG8gcmVmbGVjdCB0aGUgbGFzdCByZWFkIGRhdGEuIEluIHRoaXMgY2FzZQorCSAqIHRoZSBrZXJuZWwgd2lsbCBub3Qgb3Zlci13cml0ZSB1bnJlYWQgZGF0YS4KKwkgKi8KKwlfX3U2NCAgIGRhdGFfaGVhZDsJCS8qIGhlYWQgaW4gdGhlIGRhdGEgc2VjdGlvbiAqLworCV9fdTY0CWRhdGFfdGFpbDsJCS8qIHVzZXItc3BhY2Ugd3JpdHRlbiB0YWlsICovCit9OworCisjZGVmaW5lIFBFUkZfUkVDT1JEX01JU0NfQ1BVTU9ERV9NQVNLCQkoNyA8PCAwKQorI2RlZmluZSBQRVJGX1JFQ09SRF9NSVNDX0NQVU1PREVfVU5LTk9XTgkoMCA8PCAwKQorI2RlZmluZSBQRVJGX1JFQ09SRF9NSVNDX0tFUk5FTAkJCSgxIDw8IDApCisjZGVmaW5lIFBFUkZfUkVDT1JEX01JU0NfVVNFUgkJCSgyIDw8IDApCisjZGVmaW5lIFBFUkZfUkVDT1JEX01JU0NfSFlQRVJWSVNPUgkJKDMgPDwgMCkKKyNkZWZpbmUgUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9LRVJORUwJCSg0IDw8IDApCisjZGVmaW5lIFBFUkZfUkVDT1JEX01JU0NfR1VFU1RfVVNFUgkJKDUgPDwgMCkKKworLyoKKyAqIEluZGljYXRlcyB0aGF0IHRoZSBjb250ZW50IG9mIFBFUkZfU0FNUExFX0lQIHBvaW50cyB0bworICogdGhlIGFjdHVhbCBpbnN0cnVjdGlvbiB0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQuIFNlZSBhbHNvCisgKiBwZXJmX2V2ZW50X2F0dHI6OnByZWNpc2VfaXAuCisgKi8KKyNkZWZpbmUgUEVSRl9SRUNPUkRfTUlTQ19FWEFDVF9JUAkJKDEgPDwgMTQpCisvKgorICogUmVzZXJ2ZSB0aGUgbGFzdCBiaXQgdG8gaW5kaWNhdGUgc29tZSBleHRlbmRlZCBtaXNjIGZpZWxkCisgKi8KKyNkZWZpbmUgUEVSRl9SRUNPUkRfTUlTQ19FWFRfUkVTRVJWRUQJCSgxIDw8IDE1KQorCitzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgeworCV9fdTMyCXR5cGU7CisJX191MTYJbWlzYzsKKwlfX3UxNglzaXplOworfTsKKworZW51bSBwZXJmX2V2ZW50X3R5cGUgeworCisJLyoKKwkgKiBJZiBwZXJmX2V2ZW50X2F0dHIuc2FtcGxlX2lkX2FsbCBpcyBzZXQgdGhlbiBhbGwgZXZlbnQgdHlwZXMgd2lsbAorCSAqIGhhdmUgdGhlIHNhbXBsZV90eXBlIHNlbGVjdGVkIGZpZWxkcyByZWxhdGVkIHRvIHdoZXJlL3doZW4KKwkgKiAoaWRlbnRpdHkpIGFuIGV2ZW50IHRvb2sgcGxhY2UgKFRJRCwgVElNRSwgSUQsIENQVSwgU1RSRUFNX0lEKQorCSAqIGRlc2NyaWJlZCBpbiBQRVJGX1JFQ09SRF9TQU1QTEUgYmVsb3csIGl0IHdpbGwgYmUgc3Rhc2hlZCBqdXN0IGFmdGVyCisJICogdGhlIHBlcmZfZXZlbnRfaGVhZGVyIGFuZCB0aGUgZmllbGRzIGFscmVhZHkgcHJlc2VudCBmb3IgdGhlIGV4aXN0aW5nCisJICogZmllbGRzLCBpLmUuIGF0IHRoZSBlbmQgb2YgdGhlIHBheWxvYWQuIFRoYXQgd2F5IGEgbmV3ZXIgcGVyZi5kYXRhCisJICogZmlsZSB3aWxsIGJlIHN1cHBvcnRlZCBieSBvbGRlciBwZXJmIHRvb2xzLCB3aXRoIHRoZXNlIG5ldyBvcHRpb25hbAorCSAqIGZpZWxkcyBiZWluZyBpZ25vcmVkLgorCSAqCisJICogVGhlIE1NQVAgZXZlbnRzIHJlY29yZCB0aGUgUFJPVF9FWEVDIG1hcHBpbmdzIHNvIHRoYXQgd2UgY2FuCisJICogY29ycmVsYXRlIHVzZXJzcGFjZSBJUHMgdG8gY29kZS4gVGhleSBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorCSAqCisJICogc3RydWN0IHsKKwkgKglzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOworCSAqCisJICoJdTMyCQkJCXBpZCwgdGlkOworCSAqCXU2NAkJCQlhZGRyOworCSAqCXU2NAkJCQlsZW47CisJICoJdTY0CQkJCXBnb2ZmOworCSAqCWNoYXIJCQkJZmlsZW5hbWVbXTsKKwkgKiB9OworCSAqLworCVBFUkZfUkVDT1JEX01NQVAJCQk9IDEsCisKKwkvKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgl1NjQJCQkJaWQ7CisJICoJdTY0CQkJCWxvc3Q7CisJICogfTsKKwkgKi8KKwlQRVJGX1JFQ09SRF9MT1NUCQkJPSAyLAorCisJLyoKKwkgKiBzdHJ1Y3QgeworCSAqCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisJICoKKwkgKgl1MzIJCQkJcGlkLCB0aWQ7CisJICoJY2hhcgkJCQljb21tW107CisJICogfTsKKwkgKi8KKwlQRVJGX1JFQ09SRF9DT01NCQkJPSAzLAorCisJLyoKKwkgKiBzdHJ1Y3QgeworCSAqCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisJICoJdTMyCQkJCXBpZCwgcHBpZDsKKwkgKgl1MzIJCQkJdGlkLCBwdGlkOworCSAqCXU2NAkJCQl0aW1lOworCSAqIH07CisJICovCisJUEVSRl9SRUNPUkRfRVhJVAkJCT0gNCwKKworCS8qCisJICogc3RydWN0IHsKKwkgKglzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOworCSAqCXU2NAkJCQl0aW1lOworCSAqCXU2NAkJCQlpZDsKKwkgKgl1NjQJCQkJc3RyZWFtX2lkOworCSAqIH07CisJICovCisJUEVSRl9SRUNPUkRfVEhST1RUTEUJCQk9IDUsCisJUEVSRl9SRUNPUkRfVU5USFJPVFRMRQkJCT0gNiwKKworCS8qCisJICogc3RydWN0IHsKKwkgKglzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOworCSAqCXUzMgkJCQlwaWQsIHBwaWQ7CisJICoJdTMyCQkJCXRpZCwgcHRpZDsKKwkgKgl1NjQJCQkJdGltZTsKKwkgKiB9OworCSAqLworCVBFUkZfUkVDT1JEX0ZPUksJCQk9IDcsCisKKwkvKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgl1MzIJCQkJcGlkLCB0aWQ7CisJICoKKwkgKglzdHJ1Y3QgcmVhZF9mb3JtYXQJCXZhbHVlczsKKwkgKiB9OworCSAqLworCVBFUkZfUkVDT1JEX1JFQUQJCQk9IDgsCisKKwkvKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgorCSAqCXsgdTY0CQkJaXA7CSAgfSAmJiBQRVJGX1NBTVBMRV9JUAorCSAqCXsgdTMyCQkJcGlkLCB0aWQ7IH0gJiYgUEVSRl9TQU1QTEVfVElECisJICoJeyB1NjQJCQl0aW1lOyAgICAgfSAmJiBQRVJGX1NBTVBMRV9USU1FCisJICoJeyB1NjQJCQlhZGRyOyAgICAgfSAmJiBQRVJGX1NBTVBMRV9BRERSCisJICoJeyB1NjQJCQlpZDsJICB9ICYmIFBFUkZfU0FNUExFX0lECisJICoJeyB1NjQJCQlzdHJlYW1faWQ7fSAmJiBQRVJGX1NBTVBMRV9TVFJFQU1fSUQKKwkgKgl7IHUzMgkJCWNwdSwgcmVzOyB9ICYmIFBFUkZfU0FNUExFX0NQVQorCSAqCXsgdTY0CQkJcGVyaW9kOyAgIH0gJiYgUEVSRl9TQU1QTEVfUEVSSU9ECisJICoKKwkgKgl7IHN0cnVjdCByZWFkX2Zvcm1hdAl2YWx1ZXM7CSAgfSAmJiBQRVJGX1NBTVBMRV9SRUFECisJICoKKwkgKgl7IHU2NAkJCW5yLAorCSAqCSAgdTY0CQkJaXBzW25yXTsgIH0gJiYgUEVSRl9TQU1QTEVfQ0FMTENIQUlOCisJICoKKwkgKgkjCisJICoJIyBUaGUgUkFXIHJlY29yZCBiZWxvdyBpcyBvcGFxdWUgZGF0YSB3cnQgdGhlIEFCSQorCSAqCSMKKwkgKgkjIFRoYXQgaXMsIHRoZSBBQkkgZG9lc24ndCBtYWtlIGFueSBwcm9taXNlcyB3cnQgdG8KKwkgKgkjIHRoZSBzdGFiaWxpdHkgb2YgaXRzIGNvbnRlbnQsIGl0IG1heSB2YXJ5IGRlcGVuZGluZworCSAqCSMgb24gZXZlbnQsIGhhcmR3YXJlLCBrZXJuZWwgdmVyc2lvbiBhbmQgcGhhc2Ugb2YKKwkgKgkjIHRoZSBtb29uLgorCSAqCSMKKwkgKgkjIEluIG90aGVyIHdvcmRzLCBQRVJGX1NBTVBMRV9SQVcgY29udGVudHMgYXJlIG5vdCBhbiBBQkkuCisJICoJIworCSAqCisJICoJeyB1MzIJCQlzaXplOworCSAqCSAgY2hhciAgICAgICAgICAgICAgICAgIGRhdGFbc2l6ZV07fSYmIFBFUkZfU0FNUExFX1JBVworCSAqIH07CisJICovCisJUEVSRl9SRUNPUkRfU0FNUExFCQkJPSA5LAorCisJUEVSRl9SRUNPUkRfTUFYLAkJCS8qIG5vbi1BQkkgKi8KK307CisKK2VudW0gcGVyZl9jYWxsY2hhaW5fY29udGV4dCB7CisJUEVSRl9DT05URVhUX0hWCQkJPSAoX191NjQpLTMyLAorCVBFUkZfQ09OVEVYVF9LRVJORUwJCT0gKF9fdTY0KS0xMjgsCisJUEVSRl9DT05URVhUX1VTRVIJCT0gKF9fdTY0KS01MTIsCisKKwlQRVJGX0NPTlRFWFRfR1VFU1QJCT0gKF9fdTY0KS0yMDQ4LAorCVBFUkZfQ09OVEVYVF9HVUVTVF9LRVJORUwJPSAoX191NjQpLTIxNzYsCisJUEVSRl9DT05URVhUX0dVRVNUX1VTRVIJCT0gKF9fdTY0KS0yNTYwLAorCisJUEVSRl9DT05URVhUX01BWAkJPSAoX191NjQpLTQwOTUsCit9OworCisjZGVmaW5lIFBFUkZfRkxBR19GRF9OT19HUk9VUAkJKDFVIDw8IDApCisjZGVmaW5lIFBFUkZfRkxBR19GRF9PVVRQVVQJCSgxVSA8PCAxKQorI2RlZmluZSBQRVJGX0ZMQUdfUElEX0NHUk9VUAkJKDFVIDw8IDIpIC8qIHBpZD1jZ3JvdXAgaWQsIHBlci1jcHUgbW9kZSBvbmx5ICovCisKKyNlbmRpZiAvKiBfTElOVVhfUEVSRl9FVkVOVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BlcnNvbmFsaXR5LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BlcnNvbmFsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3MTcwMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGVyc29uYWxpdHkuaApAQCAtMCwwICsxLDY5IEBACisjaWZuZGVmIF9MSU5VWF9QRVJTT05BTElUWV9ICisjZGVmaW5lIF9MSU5VWF9QRVJTT05BTElUWV9ICisKKworLyoKKyAqIEZsYWdzIGZvciBidWcgZW11bGF0aW9uLgorICoKKyAqIFRoZXNlIG9jY3VweSB0aGUgdG9wIHRocmVlIGJ5dGVzLgorICovCitlbnVtIHsKKwlVTkFNRTI2CT0gICAgICAgICAgICAgICAweDAwMjAwMDAsCisJQUREUl9OT19SQU5ET01JWkUgPSAJMHgwMDQwMDAwLAkvKiBkaXNhYmxlIHJhbmRvbWl6YXRpb24gb2YgVkEgc3BhY2UgKi8KKwlGRFBJQ19GVU5DUFRSUyA9CTB4MDA4MDAwMCwJLyogdXNlcnNwYWNlIGZ1bmN0aW9uIHB0cnMgcG9pbnQgdG8gZGVzY3JpcHRvcnMKKwkJCQkJCSAqIChzaWduYWwgaGFuZGxpbmcpCisJCQkJCQkgKi8KKwlNTUFQX1BBR0VfWkVSTyA9CTB4MDEwMDAwMCwKKwlBRERSX0NPTVBBVF9MQVlPVVQgPQkweDAyMDAwMDAsCisJUkVBRF9JTVBMSUVTX0VYRUMgPQkweDA0MDAwMDAsCisJQUREUl9MSU1JVF8zMkJJVCA9CTB4MDgwMDAwMCwKKwlTSE9SVF9JTk9ERSA9CQkweDEwMDAwMDAsCisJV0hPTEVfU0VDT05EUyA9CQkweDIwMDAwMDAsCisJU1RJQ0tZX1RJTUVPVVRTCT0JMHg0MDAwMDAwLAorCUFERFJfTElNSVRfM0dCID0gCTB4ODAwMDAwMCwKK307CisKKy8qCisgKiBTZWN1cml0eS1yZWxldmFudCBjb21wYXRpYmlsaXR5IGZsYWdzIHRoYXQgbXVzdCBiZQorICogY2xlYXJlZCB1cG9uIHNldHVpZCBvciBzZXRnaWQgZXhlYzoKKyAqLworI2RlZmluZSBQRVJfQ0xFQVJfT05fU0VUSUQgKFJFQURfSU1QTElFU19FWEVDICB8IFwKKwkJCSAgICBBRERSX05PX1JBTkRPTUlaRSAgfCBcCisJCQkgICAgQUREUl9DT01QQVRfTEFZT1VUIHwgXAorCQkJICAgIE1NQVBfUEFHRV9aRVJPKQorCisvKgorICogUGVyc29uYWxpdHkgdHlwZXMuCisgKgorICogVGhlc2UgZ28gaW4gdGhlIGxvdyBieXRlLiAgQXZvaWQgdXNpbmcgdGhlIHRvcCBiaXQsIGl0IHdpbGwKKyAqIGNvbmZsaWN0IHdpdGggZXJyb3IgcmV0dXJucy4KKyAqLworZW51bSB7CisJUEVSX0xJTlVYID0JCTB4MDAwMCwKKwlQRVJfTElOVVhfMzJCSVQgPQkweDAwMDAgfCBBRERSX0xJTUlUXzMyQklULAorCVBFUl9MSU5VWF9GRFBJQyA9CTB4MDAwMCB8IEZEUElDX0ZVTkNQVFJTLAorCVBFUl9TVlI0ID0JCTB4MDAwMSB8IFNUSUNLWV9USU1FT1VUUyB8IE1NQVBfUEFHRV9aRVJPLAorCVBFUl9TVlIzID0JCTB4MDAwMiB8IFNUSUNLWV9USU1FT1VUUyB8IFNIT1JUX0lOT0RFLAorCVBFUl9TQ09TVlIzID0JCTB4MDAwMyB8IFNUSUNLWV9USU1FT1VUUyB8CisJCQkJCSBXSE9MRV9TRUNPTkRTIHwgU0hPUlRfSU5PREUsCisJUEVSX09TUjUgPQkJMHgwMDAzIHwgU1RJQ0tZX1RJTUVPVVRTIHwgV0hPTEVfU0VDT05EUywKKwlQRVJfV1lTRVYzODYgPQkJMHgwMDA0IHwgU1RJQ0tZX1RJTUVPVVRTIHwgU0hPUlRfSU5PREUsCisJUEVSX0lTQ1I0ID0JCTB4MDAwNSB8IFNUSUNLWV9USU1FT1VUUywKKwlQRVJfQlNEID0JCTB4MDAwNiwKKwlQRVJfU1VOT1MgPQkJMHgwMDA2IHwgU1RJQ0tZX1RJTUVPVVRTLAorCVBFUl9YRU5JWCA9CQkweDAwMDcgfCBTVElDS1lfVElNRU9VVFMgfCBTSE9SVF9JTk9ERSwKKwlQRVJfTElOVVgzMiA9CQkweDAwMDgsCisJUEVSX0xJTlVYMzJfM0dCID0JMHgwMDA4IHwgQUREUl9MSU1JVF8zR0IsCisJUEVSX0lSSVgzMiA9CQkweDAwMDkgfCBTVElDS1lfVElNRU9VVFMsLyogSVJJWDUgMzItYml0ICovCisJUEVSX0lSSVhOMzIgPQkJMHgwMDBhIHwgU1RJQ0tZX1RJTUVPVVRTLC8qIElSSVg2IG5ldyAzMi1iaXQgKi8KKwlQRVJfSVJJWDY0ID0JCTB4MDAwYiB8IFNUSUNLWV9USU1FT1VUUywvKiBJUklYNiA2NC1iaXQgKi8KKwlQRVJfUklTQ09TID0JCTB4MDAwYywKKwlQRVJfU09MQVJJUyA9CQkweDAwMGQgfCBTVElDS1lfVElNRU9VVFMsCisJUEVSX1VXNyA9CQkweDAwMGUgfCBTVElDS1lfVElNRU9VVFMgfCBNTUFQX1BBR0VfWkVSTywKKwlQRVJfT1NGNCA9CQkweDAwMGYsCQkJIC8qIE9TRi8xIHY0ICovCisJUEVSX0hQVVggPQkJMHgwMDEwLAorCVBFUl9NQVNLID0JCTB4MDBmZiwKK307CisKKworI2VuZGlmIC8qIF9MSU5VWF9QRVJTT05BTElUWV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODBjODAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaApAQCAtMCwwICsxLDM3MCBAQAorLyogUEZfS0VZIHVzZXIgaW50ZXJmYWNlLCB0aGlzIGlzIGRlZmluZWQgYnkgcmZjMjM2NyBzbworICogZG8gbm90IG1ha2UgYXJiaXRyYXJ5IG1vZGlmaWNhdGlvbnMgb3IgZWxzZSB0aGlzIGhlYWRlcgorICogZmlsZSB3aWxsIG5vdCBiZSBjb21wbGlhbnQuCisgKi8KKworI2lmbmRlZiBfTElOVVhfUEZLRVkyX0gKKyNkZWZpbmUgX0xJTlVYX1BGS0VZMl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFBGX0tFWV9WMgkJMgorI2RlZmluZSBQRktFWVYyX1JFVklTSU9OCTE5OTgwNkwKKworc3RydWN0IHNhZGJfbXNnIHsKKwlfX3U4CQlzYWRiX21zZ192ZXJzaW9uOworCV9fdTgJCXNhZGJfbXNnX3R5cGU7CisJX191OAkJc2FkYl9tc2dfZXJybm87CisJX191OAkJc2FkYl9tc2dfc2F0eXBlOworCV9fdTE2CXNhZGJfbXNnX2xlbjsKKwlfX3UxNglzYWRiX21zZ19yZXNlcnZlZDsKKwlfX3UzMglzYWRiX21zZ19zZXE7CisJX191MzIJc2FkYl9tc2dfcGlkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9tc2cpID09IDE2ICovCisKK3N0cnVjdCBzYWRiX2V4dCB7CisJX191MTYJc2FkYl9leHRfbGVuOworCV9fdTE2CXNhZGJfZXh0X3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX2V4dCkgPT0gNCAqLworCitzdHJ1Y3Qgc2FkYl9zYSB7CisJX191MTYJc2FkYl9zYV9sZW47CisJX191MTYJc2FkYl9zYV9leHR0eXBlOworCV9fYmUzMgkJc2FkYl9zYV9zcGk7CisJX191OAkJc2FkYl9zYV9yZXBsYXk7CisJX191OAkJc2FkYl9zYV9zdGF0ZTsKKwlfX3U4CQlzYWRiX3NhX2F1dGg7CisJX191OAkJc2FkYl9zYV9lbmNyeXB0OworCV9fdTMyCXNhZGJfc2FfZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3NhKSA9PSAxNiAqLworCitzdHJ1Y3Qgc2FkYl9saWZldGltZSB7CisJX191MTYJc2FkYl9saWZldGltZV9sZW47CisJX191MTYJc2FkYl9saWZldGltZV9leHR0eXBlOworCV9fdTMyCXNhZGJfbGlmZXRpbWVfYWxsb2NhdGlvbnM7CisJX191NjQJc2FkYl9saWZldGltZV9ieXRlczsKKwlfX3U2NAlzYWRiX2xpZmV0aW1lX2FkZHRpbWU7CisJX191NjQJc2FkYl9saWZldGltZV91c2V0aW1lOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9saWZldGltZSkgPT0gMzIgKi8KKworc3RydWN0IHNhZGJfYWRkcmVzcyB7CisJX191MTYJc2FkYl9hZGRyZXNzX2xlbjsKKwlfX3UxNglzYWRiX2FkZHJlc3NfZXh0dHlwZTsKKwlfX3U4CQlzYWRiX2FkZHJlc3NfcHJvdG87CisJX191OAkJc2FkYl9hZGRyZXNzX3ByZWZpeGxlbjsKKwlfX3UxNglzYWRiX2FkZHJlc3NfcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX2FkZHJlc3MpID09IDggKi8KKworc3RydWN0IHNhZGJfa2V5IHsKKwlfX3UxNglzYWRiX2tleV9sZW47CisJX191MTYJc2FkYl9rZXlfZXh0dHlwZTsKKwlfX3UxNglzYWRiX2tleV9iaXRzOworCV9fdTE2CXNhZGJfa2V5X3Jlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9rZXkpID09IDggKi8KKworc3RydWN0IHNhZGJfaWRlbnQgeworCV9fdTE2CXNhZGJfaWRlbnRfbGVuOworCV9fdTE2CXNhZGJfaWRlbnRfZXh0dHlwZTsKKwlfX3UxNglzYWRiX2lkZW50X3R5cGU7CisJX191MTYJc2FkYl9pZGVudF9yZXNlcnZlZDsKKwlfX3U2NAlzYWRiX2lkZW50X2lkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9pZGVudCkgPT0gMTYgKi8KKworc3RydWN0IHNhZGJfc2VucyB7CisJX191MTYJc2FkYl9zZW5zX2xlbjsKKwlfX3UxNglzYWRiX3NlbnNfZXh0dHlwZTsKKwlfX3UzMglzYWRiX3NlbnNfZHBkOworCV9fdTgJCXNhZGJfc2Vuc19zZW5zX2xldmVsOworCV9fdTgJCXNhZGJfc2Vuc19zZW5zX2xlbjsKKwlfX3U4CQlzYWRiX3NlbnNfaW50ZWdfbGV2ZWw7CisJX191OAkJc2FkYl9zZW5zX2ludGVnX2xlbjsKKwlfX3UzMglzYWRiX3NlbnNfcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3NlbnMpID09IDE2ICovCisKKy8qIGZvbGxvd2VkIGJ5OgorCV9fdTY0CXNhZGJfc2Vuc19iaXRtYXBbc2Vuc19sZW5dOworCV9fdTY0CXNhZGJfaW50ZWdfYml0bWFwW2ludGVnX2xlbl07ICAqLworCitzdHJ1Y3Qgc2FkYl9wcm9wIHsKKwlfX3UxNglzYWRiX3Byb3BfbGVuOworCV9fdTE2CXNhZGJfcHJvcF9leHR0eXBlOworCV9fdTgJCXNhZGJfcHJvcF9yZXBsYXk7CisJX191OAkJc2FkYl9wcm9wX3Jlc2VydmVkWzNdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9wcm9wKSA9PSA4ICovCisKKy8qIGZvbGxvd2VkIGJ5OgorCXN0cnVjdCBzYWRiX2NvbWIgc2FkYl9jb21ic1soc2FkYl9wcm9wX2xlbiArCisJCXNpemVvZihfX3U2NCkgLSBzaXplb2Yoc3RydWN0IHNhZGJfcHJvcCkpIC8KKwkJc2l6ZW9mKHN0cnVjdCBzYWRiX2NvbWIpXTsgKi8KKworc3RydWN0IHNhZGJfY29tYiB7CisJX191OAkJc2FkYl9jb21iX2F1dGg7CisJX191OAkJc2FkYl9jb21iX2VuY3J5cHQ7CisJX191MTYJc2FkYl9jb21iX2ZsYWdzOworCV9fdTE2CXNhZGJfY29tYl9hdXRoX21pbmJpdHM7CisJX191MTYJc2FkYl9jb21iX2F1dGhfbWF4Yml0czsKKwlfX3UxNglzYWRiX2NvbWJfZW5jcnlwdF9taW5iaXRzOworCV9fdTE2CXNhZGJfY29tYl9lbmNyeXB0X21heGJpdHM7CisJX191MzIJc2FkYl9jb21iX3Jlc2VydmVkOworCV9fdTMyCXNhZGJfY29tYl9zb2Z0X2FsbG9jYXRpb25zOworCV9fdTMyCXNhZGJfY29tYl9oYXJkX2FsbG9jYXRpb25zOworCV9fdTY0CXNhZGJfY29tYl9zb2Z0X2J5dGVzOworCV9fdTY0CXNhZGJfY29tYl9oYXJkX2J5dGVzOworCV9fdTY0CXNhZGJfY29tYl9zb2Z0X2FkZHRpbWU7CisJX191NjQJc2FkYl9jb21iX2hhcmRfYWRkdGltZTsKKwlfX3U2NAlzYWRiX2NvbWJfc29mdF91c2V0aW1lOworCV9fdTY0CXNhZGJfY29tYl9oYXJkX3VzZXRpbWU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX2NvbWIpID09IDcyICovCisKK3N0cnVjdCBzYWRiX3N1cHBvcnRlZCB7CisJX191MTYJc2FkYl9zdXBwb3J0ZWRfbGVuOworCV9fdTE2CXNhZGJfc3VwcG9ydGVkX2V4dHR5cGU7CisJX191MzIJc2FkYl9zdXBwb3J0ZWRfcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3N1cHBvcnRlZCkgPT0gOCAqLworCisvKiBmb2xsb3dlZCBieToKKwlzdHJ1Y3Qgc2FkYl9hbGcgc2FkYl9hbGdzWyhzYWRiX3N1cHBvcnRlZF9sZW4gKworCQlzaXplb2YoX191NjQpIC0gc2l6ZW9mKHN0cnVjdCBzYWRiX3N1cHBvcnRlZCkpIC8KKwkJc2l6ZW9mKHN0cnVjdCBzYWRiX2FsZyldOyAqLworCitzdHJ1Y3Qgc2FkYl9hbGcgeworCV9fdTgJCXNhZGJfYWxnX2lkOworCV9fdTgJCXNhZGJfYWxnX2l2bGVuOworCV9fdTE2CXNhZGJfYWxnX21pbmJpdHM7CisJX191MTYJc2FkYl9hbGdfbWF4Yml0czsKKwlfX3UxNglzYWRiX2FsZ19yZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfYWxnKSA9PSA4ICovCisKK3N0cnVjdCBzYWRiX3NwaXJhbmdlIHsKKwlfX3UxNglzYWRiX3NwaXJhbmdlX2xlbjsKKwlfX3UxNglzYWRiX3NwaXJhbmdlX2V4dHR5cGU7CisJX191MzIJc2FkYl9zcGlyYW5nZV9taW47CisJX191MzIJc2FkYl9zcGlyYW5nZV9tYXg7CisJX191MzIJc2FkYl9zcGlyYW5nZV9yZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfc3BpcmFuZ2UpID09IDE2ICovCisKK3N0cnVjdCBzYWRiX3hfa21wcml2YXRlIHsKKwlfX3UxNglzYWRiX3hfa21wcml2YXRlX2xlbjsKKwlfX3UxNglzYWRiX3hfa21wcml2YXRlX2V4dHR5cGU7CisJX191MzIJc2FkYl94X2ttcHJpdmF0ZV9yZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfeF9rbXByaXZhdGUpID09IDggKi8KKworc3RydWN0IHNhZGJfeF9zYTIgeworCV9fdTE2CXNhZGJfeF9zYTJfbGVuOworCV9fdTE2CXNhZGJfeF9zYTJfZXh0dHlwZTsKKwlfX3U4CQlzYWRiX3hfc2EyX21vZGU7CisJX191OAkJc2FkYl94X3NhMl9yZXNlcnZlZDE7CisJX191MTYJc2FkYl94X3NhMl9yZXNlcnZlZDI7CisJX191MzIJc2FkYl94X3NhMl9zZXF1ZW5jZTsKKwlfX3UzMglzYWRiX3hfc2EyX3JlcWlkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl94X3NhMikgPT0gMTYgKi8KKworc3RydWN0IHNhZGJfeF9wb2xpY3kgeworCV9fdTE2CXNhZGJfeF9wb2xpY3lfbGVuOworCV9fdTE2CXNhZGJfeF9wb2xpY3lfZXh0dHlwZTsKKwlfX3UxNglzYWRiX3hfcG9saWN5X3R5cGU7CisJX191OAkJc2FkYl94X3BvbGljeV9kaXI7CisJX191OAkJc2FkYl94X3BvbGljeV9yZXNlcnZlZDsKKwlfX3UzMglzYWRiX3hfcG9saWN5X2lkOworCV9fdTMyCXNhZGJfeF9wb2xpY3lfcHJpb3JpdHk7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3hfcG9saWN5KSA9PSAxNiAqLworCitzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCB7CisJX191MTYJc2FkYl94X2lwc2VjcmVxdWVzdF9sZW47CisJX191MTYJc2FkYl94X2lwc2VjcmVxdWVzdF9wcm90bzsKKwlfX3U4CQlzYWRiX3hfaXBzZWNyZXF1ZXN0X21vZGU7CisJX191OAkJc2FkYl94X2lwc2VjcmVxdWVzdF9sZXZlbDsKKwlfX3UxNglzYWRiX3hfaXBzZWNyZXF1ZXN0X3Jlc2VydmVkMTsKKwlfX3UzMglzYWRiX3hfaXBzZWNyZXF1ZXN0X3JlcWlkOworCV9fdTMyCXNhZGJfeF9pcHNlY3JlcXVlc3RfcmVzZXJ2ZWQyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCkgPT0gMTYgKi8KKworLyogVGhpcyBkZWZpbmVzIHRoZSBUWVBFIG9mIE5hdCBUcmF2ZXJzYWwgaW4gdXNlLiAgQ3VycmVudGx5IG9ubHkgb25lCisgKiB0eXBlIG9mIE5BVC1UIGlzIHN1cHBvcnRlZCwgZHJhZnQtaWV0Zi1pcHNlYy11ZHAtZW5jYXBzLTA2CisgKi8KK3N0cnVjdCBzYWRiX3hfbmF0X3RfdHlwZSB7CisJX191MTYJc2FkYl94X25hdF90X3R5cGVfbGVuOworCV9fdTE2CXNhZGJfeF9uYXRfdF90eXBlX2V4dHR5cGU7CisJX191OAkJc2FkYl94X25hdF90X3R5cGVfdHlwZTsKKwlfX3U4CQlzYWRiX3hfbmF0X3RfdHlwZV9yZXNlcnZlZFszXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfeF9uYXRfdF90eXBlKSA9PSA4ICovCisKKy8qIFBhc3MgYSBOQVQgVHJhdmVyc2FsIHBvcnQgKFNvdXJjZSBvciBEZXN0IHBvcnQpICovCitzdHJ1Y3Qgc2FkYl94X25hdF90X3BvcnQgeworCV9fdTE2CXNhZGJfeF9uYXRfdF9wb3J0X2xlbjsKKwlfX3UxNglzYWRiX3hfbmF0X3RfcG9ydF9leHR0eXBlOworCV9fYmUxNgkJc2FkYl94X25hdF90X3BvcnRfcG9ydDsKKwlfX3UxNglzYWRiX3hfbmF0X3RfcG9ydF9yZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfeF9uYXRfdF9wb3J0KSA9PSA4ICovCisKKy8qIEdlbmVyaWMgTFNNIHNlY3VyaXR5IGNvbnRleHQgKi8KK3N0cnVjdCBzYWRiX3hfc2VjX2N0eCB7CisJX191MTYJc2FkYl94X3NlY19sZW47CisJX191MTYJc2FkYl94X3NlY19leHR0eXBlOworCV9fdTgJCXNhZGJfeF9jdHhfYWxnOyAgLyogTFNNczogZS5nLiwgc2VsaW51eCA9PSAxICovCisJX191OAkJc2FkYl94X2N0eF9kb2k7CisJX191MTYJc2FkYl94X2N0eF9sZW47Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3NlY19jdHgpID0gOCAqLworCisvKiBVc2VkIGJ5IE1JR1JBVEUgdG8gcGFzcyBhZGRyZXNzZXMgSUtFIHdpbGwgdXNlIHRvIHBlcmZvcm0KKyAqIG5lZ290aWF0aW9uIHdpdGggdGhlIHBlZXIgKi8KK3N0cnVjdCBzYWRiX3hfa21hZGRyZXNzIHsKKwlfX3UxNglzYWRiX3hfa21hZGRyZXNzX2xlbjsKKwlfX3UxNglzYWRiX3hfa21hZGRyZXNzX2V4dHR5cGU7CisJX191MzIJc2FkYl94X2ttYWRkcmVzc19yZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfeF9rbWFkZHJlc3MpID09IDggKi8KKworLyogTWVzc2FnZSB0eXBlcyAqLworI2RlZmluZSBTQURCX1JFU0VSVkVECQkwCisjZGVmaW5lIFNBREJfR0VUU1BJCQkxCisjZGVmaW5lIFNBREJfVVBEQVRFCQkyCisjZGVmaW5lIFNBREJfQURECQkzCisjZGVmaW5lIFNBREJfREVMRVRFCQk0CisjZGVmaW5lIFNBREJfR0VUCQk1CisjZGVmaW5lIFNBREJfQUNRVUlSRQkJNgorI2RlZmluZSBTQURCX1JFR0lTVEVSCQk3CisjZGVmaW5lIFNBREJfRVhQSVJFCQk4CisjZGVmaW5lIFNBREJfRkxVU0gJCTkKKyNkZWZpbmUgU0FEQl9EVU1QCQkxMAorI2RlZmluZSBTQURCX1hfUFJPTUlTQwkJMTEKKyNkZWZpbmUgU0FEQl9YX1BDSEFOR0UJCTEyCisjZGVmaW5lIFNBREJfWF9TUERVUERBVEUJMTMKKyNkZWZpbmUgU0FEQl9YX1NQREFERAkJMTQKKyNkZWZpbmUgU0FEQl9YX1NQRERFTEVURQkxNQorI2RlZmluZSBTQURCX1hfU1BER0VUCQkxNgorI2RlZmluZSBTQURCX1hfU1BEQUNRVUlSRQkxNworI2RlZmluZSBTQURCX1hfU1BERFVNUAkJMTgKKyNkZWZpbmUgU0FEQl9YX1NQREZMVVNICQkxOQorI2RlZmluZSBTQURCX1hfU1BEU0VUSURYCTIwCisjZGVmaW5lIFNBREJfWF9TUERFWFBJUkUJMjEKKyNkZWZpbmUgU0FEQl9YX1NQRERFTEVURTIJMjIKKyNkZWZpbmUgU0FEQl9YX05BVF9UX05FV19NQVBQSU5HCTIzCisjZGVmaW5lIFNBREJfWF9NSUdSQVRFCQkyNAorI2RlZmluZSBTQURCX01BWAkJMjQKKworLyogU2VjdXJpdHkgQXNzb2NpYXRpb24gZmxhZ3MgKi8KKyNkZWZpbmUgU0FEQl9TQUZMQUdTX1BGUwkxCisjZGVmaW5lIFNBREJfU0FGTEFHU19OT1BNVFVESVNDCTB4MjAwMDAwMDAKKyNkZWZpbmUgU0FEQl9TQUZMQUdTX0RFQ0FQX0RTQ1AJMHg0MDAwMDAwMAorI2RlZmluZSBTQURCX1NBRkxBR1NfTk9FQ04JMHg4MDAwMDAwMAorCisvKiBTZWN1cml0eSBBc3NvY2lhdGlvbiBzdGF0ZXMgKi8KKyNkZWZpbmUgU0FEQl9TQVNUQVRFX0xBUlZBTAkwCisjZGVmaW5lIFNBREJfU0FTVEFURV9NQVRVUkUJMQorI2RlZmluZSBTQURCX1NBU1RBVEVfRFlJTkcJMgorI2RlZmluZSBTQURCX1NBU1RBVEVfREVBRAkzCisjZGVmaW5lIFNBREJfU0FTVEFURV9NQVgJMworCisvKiBTZWN1cml0eSBBc3NvY2lhdGlvbiB0eXBlcyAqLworI2RlZmluZSBTQURCX1NBVFlQRV9VTlNQRUMJMAorI2RlZmluZSBTQURCX1NBVFlQRV9BSAkJMgorI2RlZmluZSBTQURCX1NBVFlQRV9FU1AJCTMKKyNkZWZpbmUgU0FEQl9TQVRZUEVfUlNWUAk1CisjZGVmaW5lIFNBREJfU0FUWVBFX09TUEZWMgk2CisjZGVmaW5lIFNBREJfU0FUWVBFX1JJUFYyCTcKKyNkZWZpbmUgU0FEQl9TQVRZUEVfTUlQCQk4CisjZGVmaW5lIFNBREJfWF9TQVRZUEVfSVBDT01QCTkKKyNkZWZpbmUgU0FEQl9TQVRZUEVfTUFYCQk5CisKKy8qIEF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobXMgKi8KKyNkZWZpbmUgU0FEQl9BQUxHX05PTkUJCQkwCisjZGVmaW5lIFNBREJfQUFMR19NRDVITUFDCQkyCisjZGVmaW5lIFNBREJfQUFMR19TSEExSE1BQwkJMworI2RlZmluZSBTQURCX1hfQUFMR19TSEEyXzI1NkhNQUMJNQorI2RlZmluZSBTQURCX1hfQUFMR19TSEEyXzM4NEhNQUMJNgorI2RlZmluZSBTQURCX1hfQUFMR19TSEEyXzUxMkhNQUMJNworI2RlZmluZSBTQURCX1hfQUFMR19SSVBFTUQxNjBITUFDCTgKKyNkZWZpbmUgU0FEQl9YX0FBTEdfQUVTX1hDQkNfTUFDCTkKKyNkZWZpbmUgU0FEQl9YX0FBTEdfTlVMTAkJMjUxCS8qIGthbWUgKi8KKyNkZWZpbmUgU0FEQl9BQUxHX01BWAkJCTI1MQorCisvKiBFbmNyeXB0aW9uIGFsZ29yaXRobXMgKi8KKyNkZWZpbmUgU0FEQl9FQUxHX05PTkUJCQkwCisjZGVmaW5lIFNBREJfRUFMR19ERVNDQkMJCTIKKyNkZWZpbmUgU0FEQl9FQUxHXzNERVNDQkMJCTMKKyNkZWZpbmUgU0FEQl9YX0VBTEdfQ0FTVENCQwkJNgorI2RlZmluZSBTQURCX1hfRUFMR19CTE9XRklTSENCQwkJNworI2RlZmluZSBTQURCX0VBTEdfTlVMTAkJCTExCisjZGVmaW5lIFNBREJfWF9FQUxHX0FFU0NCQwkJMTIKKyNkZWZpbmUgU0FEQl9YX0VBTEdfQUVTQ1RSCQkxMworI2RlZmluZSBTQURCX1hfRUFMR19BRVNfQ0NNX0lDVjgJMTQKKyNkZWZpbmUgU0FEQl9YX0VBTEdfQUVTX0NDTV9JQ1YxMgkxNQorI2RlZmluZSBTQURCX1hfRUFMR19BRVNfQ0NNX0lDVjE2CTE2CisjZGVmaW5lIFNBREJfWF9FQUxHX0FFU19HQ01fSUNWOAkxOAorI2RlZmluZSBTQURCX1hfRUFMR19BRVNfR0NNX0lDVjEyCTE5CisjZGVmaW5lIFNBREJfWF9FQUxHX0FFU19HQ01fSUNWMTYJMjAKKyNkZWZpbmUgU0FEQl9YX0VBTEdfQ0FNRUxMSUFDQkMJCTIyCisjZGVmaW5lIFNBREJfWF9FQUxHX05VTExfQUVTX0dNQUMJMjMKKyNkZWZpbmUgU0FEQl9FQUxHX01BWCAgICAgICAgICAgICAgICAgICAyNTMgLyogbGFzdCBFQUxHICovCisvKiBwcml2YXRlIGFsbG9jYXRpb25zIHNob3VsZCB1c2UgMjQ5LTI1NSAoUkZDMjQwNykgKi8KKyNkZWZpbmUgU0FEQl9YX0VBTEdfU0VSUEVOVENCQyAgMjUyICAgICAvKiBkcmFmdC1pZXRmLWlwc2VjLWNpcGgtYWVzLWNiYy0wMCAqLworI2RlZmluZSBTQURCX1hfRUFMR19UV09GSVNIQ0JDICAyNTMgICAgIC8qIGRyYWZ0LWlldGYtaXBzZWMtY2lwaC1hZXMtY2JjLTAwICovCisKKy8qIENvbXByZXNzaW9uIGFsZ29yaXRobXMgKi8KKyNkZWZpbmUgU0FEQl9YX0NBTEdfTk9ORQkJMAorI2RlZmluZSBTQURCX1hfQ0FMR19PVUkJCQkxCisjZGVmaW5lIFNBREJfWF9DQUxHX0RFRkxBVEUJCTIKKyNkZWZpbmUgU0FEQl9YX0NBTEdfTFpTCQkJMworI2RlZmluZSBTQURCX1hfQ0FMR19MWkpICQk0CisjZGVmaW5lIFNBREJfWF9DQUxHX01BWAkJCTQKKworLyogRXh0ZW5zaW9uIEhlYWRlciB2YWx1ZXMgKi8KKyNkZWZpbmUgU0FEQl9FWFRfUkVTRVJWRUQJCTAKKyNkZWZpbmUgU0FEQl9FWFRfU0EJCQkxCisjZGVmaW5lIFNBREJfRVhUX0xJRkVUSU1FX0NVUlJFTlQJMgorI2RlZmluZSBTQURCX0VYVF9MSUZFVElNRV9IQVJECQkzCisjZGVmaW5lIFNBREJfRVhUX0xJRkVUSU1FX1NPRlQJCTQKKyNkZWZpbmUgU0FEQl9FWFRfQUREUkVTU19TUkMJCTUKKyNkZWZpbmUgU0FEQl9FWFRfQUREUkVTU19EU1QJCTYKKyNkZWZpbmUgU0FEQl9FWFRfQUREUkVTU19QUk9YWQkJNworI2RlZmluZSBTQURCX0VYVF9LRVlfQVVUSAkJOAorI2RlZmluZSBTQURCX0VYVF9LRVlfRU5DUllQVAkJOQorI2RlZmluZSBTQURCX0VYVF9JREVOVElUWV9TUkMJCTEwCisjZGVmaW5lIFNBREJfRVhUX0lERU5USVRZX0RTVAkJMTEKKyNkZWZpbmUgU0FEQl9FWFRfU0VOU0lUSVZJVFkJCTEyCisjZGVmaW5lIFNBREJfRVhUX1BST1BPU0FMCQkxMworI2RlZmluZSBTQURCX0VYVF9TVVBQT1JURURfQVVUSAkJMTQKKyNkZWZpbmUgU0FEQl9FWFRfU1VQUE9SVEVEX0VOQ1JZUFQJMTUKKyNkZWZpbmUgU0FEQl9FWFRfU1BJUkFOR0UJCTE2CisjZGVmaW5lIFNBREJfWF9FWFRfS01QUklWQVRFCQkxNworI2RlZmluZSBTQURCX1hfRVhUX1BPTElDWQkJMTgKKyNkZWZpbmUgU0FEQl9YX0VYVF9TQTIJCQkxOQorLyogVGhlIG5leHQgZm91ciBlbnRyaWVzIGFyZSBmb3Igc2V0dGluZyB1cCBOQVQgVHJhdmVyc2FsICovCisjZGVmaW5lIFNBREJfWF9FWFRfTkFUX1RfVFlQRQkJMjAKKyNkZWZpbmUgU0FEQl9YX0VYVF9OQVRfVF9TUE9SVAkJMjEKKyNkZWZpbmUgU0FEQl9YX0VYVF9OQVRfVF9EUE9SVAkJMjIKKyNkZWZpbmUgU0FEQl9YX0VYVF9OQVRfVF9PQQkJMjMKKyNkZWZpbmUgU0FEQl9YX0VYVF9TRUNfQ1RYCQkyNAorLyogVXNlZCB3aXRoIE1JR1JBVEUgdG8gcGFzcyBAIHRvIElLRSBmb3IgbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgU0FEQl9YX0VYVF9LTUFERFJFU1MJCTI1CisjZGVmaW5lIFNBREJfRVhUX01BWAkJCTI1CisKKy8qIElkZW50aXR5IEV4dGVuc2lvbiB2YWx1ZXMgKi8KKyNkZWZpbmUgU0FEQl9JREVOVFRZUEVfUkVTRVJWRUQJMAorI2RlZmluZSBTQURCX0lERU5UVFlQRV9QUkVGSVgJMQorI2RlZmluZSBTQURCX0lERU5UVFlQRV9GUUROCTIKKyNkZWZpbmUgU0FEQl9JREVOVFRZUEVfVVNFUkZRRE4JMworI2RlZmluZSBTQURCX0lERU5UVFlQRV9NQVgJMworCisjZW5kaWYgLyogIShfTElOVVhfUEZLRVkyX0gpICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5OTRiYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGcuaApAQCAtMCwwICsxLDYzIEBACisvKiAJcGcuaCAoYykgMTk5OCAgR3JhbnQgUi4gR3VlbnRoZXIgPGdyYW50QHRvcnF1ZS5uZXQ+CisgCQkgICAgICAgVW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorCisKKwlwZy5oIGRlZmluZXMgdGhlIHVzZXIgaW50ZXJmYWNlIHRvIHRoZSBnZW5lcmljIEFUQVBJIHBhY2tldAorICAgICAgICBjb21tYW5kIGRyaXZlciBmb3IgcGFyYWxsZWwgcG9ydCBBVEFQSSBkZXZpY2VzIChwZykuIFRoZQorCWRyaXZlciBpcyBsb29zZWx5IG1vZGVsbGVkIGFmdGVyIHRoZSBnZW5lcmljIFNDU0kgZHJpdmVyLCBzZywKKwlhbHRob3VnaCB0aGUgYWN0dWFsIGludGVyZmFjZSBpcyBkaWZmZXJlbnQuCisKKwlUaGUgcGcgZHJpdmVyIHByb3ZpZGVzIGEgc2ltcGxlIGNoYXJhY3RlciBkZXZpY2UgaW50ZXJmYWNlIGZvcgorICAgICAgICBzZW5kaW5nIEFUQVBJIGNvbW1hbmRzIHRvIGEgZGV2aWNlLiAgV2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZQorCUFUQVBJIHJlc2V0IG9wZXJhdGlvbiwgYWxsIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBieSBhIHBhaXIKKyAgICAgICAgb2YgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucyB0byB0aGUgYXBwcm9wcmlhdGUgL2Rldi9wZ04gZGV2aWNlLgorCUEgd3JpdGUgb3BlcmF0aW9uIGRlbGl2ZXJzIGEgY29tbWFuZCBhbmQgYW55IG91dGJvdW5kIGRhdGEgaW4KKyAgICAgICAgYSBzaW5nbGUgYnVmZmVyLiAgTm9ybWFsbHksIHRoZSB3cml0ZSB3aWxsIHN1Y2NlZWQgdW5sZXNzIHRoZQorICAgICAgICBkZXZpY2UgaXMgb2ZmbGluZSBvciBtYWxmdW5jdGlvbmluZywgb3IgdGhlcmUgaXMgYWxyZWFkeSBhbm90aGVyCisJY29tbWFuZCBwZW5kaW5nLiAgSWYgdGhlIHdyaXRlIHN1Y2NlZWRzLCBpdCBzaG91bGQgYmUgZm9sbG93ZWQKKyAgICAgICAgaW1tZWRpYXRlbHkgYnkgYSByZWFkIG9wZXJhdGlvbiwgdG8gb2J0YWluIGFueSByZXR1cm5lZCBkYXRhIGFuZAorICAgICAgICBzdGF0dXMgaW5mb3JtYXRpb24uICBBIHJlYWQgd2lsbCBmYWlsIGlmIHRoZXJlIGlzIG5vIG9wZXJhdGlvbgorICAgICAgICBpbiBwcm9ncmVzcy4KKworCUFzIGEgc3BlY2lhbCBjYXNlLCB0aGUgZGV2aWNlIGNhbiBiZSByZXNldCB3aXRoIGEgd3JpdGUgb3BlcmF0aW9uLAorICAgICAgICBhbmQgaW4gdGhpcyBjYXNlLCBubyBmb2xsb3dpbmcgcmVhZCBpcyBleHBlY3RlZCwgb3IgcGVybWl0dGVkLgorCisJVGhlcmUgYXJlIG5vIGlvY3RsKCkgb3BlcmF0aW9ucy4gIEFueSBzaW5nbGUgb3BlcmF0aW9uCisJbWF5IHRyYW5zZmVyIGF0IG1vc3QgUEdfTUFYX0RBVEEgYnl0ZXMuICBOb3RlIHRoYXQgdGhlIGRyaXZlciBtdXN0CisgICAgICAgIGNvcHkgdGhlIGRhdGEgdGhyb3VnaCBhbiBpbnRlcm5hbCBidWZmZXIuICBJbiBrZWVwaW5nIHdpdGggYWxsCisJY3VycmVudCBBVEFQSSBkZXZpY2VzLCBjb21tYW5kIHBhY2tldHMgYXJlIGFzc3VtZWQgdG8gYmUgZXhhY3RseQorCTEyIGJ5dGVzIGluIGxlbmd0aC4KKworCVRvIHBlcm1pdCBmdXR1cmUgY2hhbmdlcyB0byB0aGlzIGludGVyZmFjZSwgdGhlIGhlYWRlcnMgaW4gdGhlCisJcmVhZCBhbmQgd3JpdGUgYnVmZmVycyBjb250YWluIGEgc2luZ2xlIGNoYXJhY3RlciAibWFnaWMiIGZsYWcuCisgICAgICAgIEN1cnJlbnRseSB0aGlzIGZsYWcgbXVzdCBiZSB0aGUgY2hhcmFjdGVyICJQIi4KKworKi8KKworI2RlZmluZSBQR19NQUdJQwknUCcKKyNkZWZpbmUgUEdfUkVTRVQJJ1onCisjZGVmaW5lIFBHX0NPTU1BTkQJJ0MnCisKKyNkZWZpbmUgUEdfTUFYX0RBVEEJMzI3NjgKKworc3RydWN0IHBnX3dyaXRlX2hkciB7CisKKwljaGFyCW1hZ2ljOwkJLyogPT0gUEdfTUFHSUMgKi8KKwljaGFyCWZ1bmM7CQkvKiBQR19SRVNFVCBvciBQR19DT01NQU5EICovCisJaW50ICAgICBkbGVuOwkJLyogbnVtYmVyIG9mIGJ5dGVzIGV4cGVjdGVkIHRvIHRyYW5zZmVyICovCisJaW50ICAgICB0aW1lb3V0OwkvKiBudW1iZXIgb2Ygc2Vjb25kcyBiZWZvcmUgdGltZW91dCAqLworCWNoYXIJcGFja2V0WzEyXTsJLyogcGFja2V0IGNvbW1hbmQgKi8KKworfTsKKworc3RydWN0IHBnX3JlYWRfaGRyIHsKKworCWNoYXIJbWFnaWM7CQkvKiA9PSBQR19NQUdJQyAqLworCWNoYXIJc2NzaTsJCS8qICJzY3NpIiBzdGF0dXMgPT0gc2Vuc2Uga2V5ICovCisJaW50CWRsZW47CQkvKiBzaXplIG9mIGRldmljZSB0cmFuc2ZlciByZXF1ZXN0ICovCisJaW50ICAgICBkdXJhdGlvbjsJLyogdGltZSBpbiBzZWNvbmRzIGNvbW1hbmQgdG9vayAqLworCWNoYXIgICAgcGFkWzEyXTsJLyogbm90IHVzZWQgKi8KKworfTsKKworLyogZW5kIG9mIHBnLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGhhbnRvbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9waGFudG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkZDY2NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGhhbnRvbS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgSmlyaSBTbGFieSA8amlyaXNsYWJ5QGdtYWlsLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fUEhBTlRPTV9ICisjZGVmaW5lIF9fUEhBTlRPTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBQSE5fKEcvUylFVF9SRUcgcGFyYW0gKi8KK3N0cnVjdCBwaG1fcmVnIHsKKwlfX3UzMiByZWc7CisJX191MzIgdmFsdWU7Cit9OworCisvKiBQSE5fKEcvUylFVF9SRUdTIHBhcmFtICovCitzdHJ1Y3QgcGhtX3JlZ3MgeworCV9fdTMyIGNvdW50OworCV9fdTMyIG1hc2s7CisJX191MzIgdmFsdWVzWzhdOworfTsKKworI2RlZmluZSBQSF9JT0NfTUFHSUMJCSdwJworI2RlZmluZSBQSE5fR0VUX1JFRwkJX0lPV1IoUEhfSU9DX01BR0lDLCAwLCBzdHJ1Y3QgcGhtX3JlZyAqKQorI2RlZmluZSBQSE5fU0VUX1JFRwkJX0lPVyhQSF9JT0NfTUFHSUMsIDEsIHN0cnVjdCBwaG1fcmVnICopCisjZGVmaW5lIFBITl9HRVRfUkVHUwkJX0lPV1IoUEhfSU9DX01BR0lDLCAyLCBzdHJ1Y3QgcGhtX3JlZ3MgKikKKyNkZWZpbmUgUEhOX1NFVF9SRUdTCQlfSU9XKFBIX0lPQ19NQUdJQywgMywgc3RydWN0IHBobV9yZWdzICopCisvKiB0aGlzIGlvY3RsIHRlbGxzIHRoZSBkcml2ZXIsIHRoYXQgdGhlIGNhbGxlciBpcyBub3QgT3BlbkhhcHRpY3MgYW5kIG1pZ2h0CisgKiB1c2UgaW1wcm92ZWQgcmVnaXN0ZXJzIHVwZGF0ZSAobm8gbW9yZSBwaGFudG9tIHN3aXRjaG9mZnMgd2hlbiB1c2luZworICogbGlicGhhbnRvbSkgKi8KKyNkZWZpbmUgUEhOX05PVF9PSAkJX0lPKFBIX0lPQ19NQUdJQywgNCkKKyNkZWZpbmUgUEhOX0dFVFJFRwkJX0lPV1IoUEhfSU9DX01BR0lDLCA1LCBzdHJ1Y3QgcGhtX3JlZykKKyNkZWZpbmUgUEhOX1NFVFJFRwkJX0lPVyhQSF9JT0NfTUFHSUMsIDYsIHN0cnVjdCBwaG1fcmVnKQorI2RlZmluZSBQSE5fR0VUUkVHUwkJX0lPV1IoUEhfSU9DX01BR0lDLCA3LCBzdHJ1Y3QgcGhtX3JlZ3MpCisjZGVmaW5lIFBITl9TRVRSRUdTCQlfSU9XKFBIX0lPQ19NQUdJQywgOCwgc3RydWN0IHBobV9yZWdzKQorCisjZGVmaW5lIFBITl9DT05UUk9MCQkweDYgICAgIC8qIGNvbnRyb2wgYnl0ZSBpbiBpYWRkciBzcGFjZSAqLworI2RlZmluZSBQSE5fQ1RMX0FNUAkJMHgxICAgICAvKiAgIHN3aXRjaCBhZnRlciB0b3JxdWVzIGNoYW5nZSAqLworI2RlZmluZSBQSE5fQ1RMX0JVVAkJMHgyICAgICAvKiAgIGlzIGJ1dHRvbiBzd2l0Y2hlZCAqLworI2RlZmluZSBQSE5fQ1RMX0lSUQkJMHgxMCAgICAvKiAgIGlzIGlycSBlbmFibGVkICovCisKKyNkZWZpbmUgUEhOX1pFUk9fRk9SQ0UJCTIwNDgJLyogemVybyB0b3JxdWUgb24gbW90b3IgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Bob25ldC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9waG9uZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNiMjBhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9waG9uZXQuaApAQCAtMCwwICsxLDE4MyBAQAorLyoqCisgKiBmaWxlIHBob25ldC5oCisgKgorICogUGhvbmV0IHNvY2tldHMga2VybmVsIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBMSU5VWF9QSE9ORVRfSAorI2RlZmluZSBMSU5VWF9QSE9ORVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKworLyogQXV0b21hdGljIHByb3RvY29sIHNlbGVjdGlvbiAqLworI2RlZmluZSBQTl9QUk9UT19UUkFOU1BPUlQJMAorLyogUGhvbmV0IGRhdGFncmFtIHNvY2tldCAqLworI2RlZmluZSBQTl9QUk9UT19QSE9ORVQJCTEKKy8qIFBob25ldCBwaXBlICovCisjZGVmaW5lIFBOX1BST1RPX1BJUEUJCTIKKyNkZWZpbmUgUEhPTkVUX05QUk9UTwkJMworCisvKiBTb2NrZXQgb3B0aW9ucyBmb3IgU09MX1BOUElQRSBsZXZlbCAqLworI2RlZmluZSBQTlBJUEVfRU5DQVAJCTEKKyNkZWZpbmUgUE5QSVBFX0lGSU5ERVgJCTIKKyNkZWZpbmUgUE5QSVBFX0hBTkRMRQkJMworCisjZGVmaW5lIFBOQUREUl9BTlkJCTAKKyNkZWZpbmUgUE5BRERSX0JST0FEQ0FTVAkweEZDCisjZGVmaW5lIFBOUE9SVF9SRVNPVVJDRV9ST1VUSU5HCTAKKworLyogVmFsdWVzIGZvciBQTlBJUEVfRU5DQVAgb3B0aW9uICovCisjZGVmaW5lIFBOUElQRV9FTkNBUF9OT05FCTAKKyNkZWZpbmUgUE5QSVBFX0VOQ0FQX0lQCQkxCisKKy8qIGlvY3RscyAqLworI2RlZmluZSBTSU9DUE5HRVRPQkpFQ1QJCShTSU9DUFJPVE9QUklWQVRFICsgMCkKKyNkZWZpbmUgU0lPQ1BOQUREUkVTT1VSQ0UJKFNJT0NQUk9UT1BSSVZBVEUgKyAxNCkKKyNkZWZpbmUgU0lPQ1BOREVMUkVTT1VSQ0UJKFNJT0NQUk9UT1BSSVZBVEUgKyAxNSkKKworLyogUGhvbmV0IHByb3RvY29sIGhlYWRlciAqLworc3RydWN0IHBob25ldGhkciB7CisJX191OAlwbl9yZGV2OworCV9fdTgJcG5fc2RldjsKKwlfX3U4CXBuX3JlczsKKwlfX2JlMTYJcG5fbGVuZ3RoOworCV9fdTgJcG5fcm9iajsKKwlfX3U4CXBuX3NvYmo7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBDb21tb24gUGhvbmV0IHBheWxvYWQgaGVhZGVyICovCitzdHJ1Y3QgcGhvbmV0bXNnIHsKKwlfX3U4CXBuX3RyYW5zX2lkOwkvKiB0cmFuc2FjdGlvbiBJRCAqLworCV9fdTgJcG5fbXNnX2lkOwkvKiBtZXNzYWdlIHR5cGUgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U4CXBuX3N1Ym1zZ19pZDsJLyogbWVzc2FnZSBzdWJ0eXBlICovCisJCQlfX3U4CXBuX2RhdGFbNV07CisJCX0gYmFzZTsKKwkJc3RydWN0IHsKKwkJCV9fdTE2CXBuX2VfcmVzX2lkOwkvKiBleHRlbmRlZCByZXNvdXJjZSBJRCAqLworCQkJX191OAlwbl9lX3N1Ym1zZ19pZDsJLyogbWVzc2FnZSBzdWJ0eXBlICovCisJCQlfX3U4CXBuX2VfZGF0YVszXTsKKwkJfSBleHQ7CisJfSBwbl9tc2dfdTsKK307CisjZGVmaW5lIFBOX0NPTU1PTl9NRVNTQUdFCTB4RjAKKyNkZWZpbmUgUE5fQ09NTUdSCQkweDEwCisjZGVmaW5lIFBOX1BSRUZJWAkJMHhFMCAvKiByZXNvdXJjZSBmb3IgZXh0ZW5kZWQgbWVzc2FnZXMgKi8KKyNkZWZpbmUgcG5fc3VibXNnX2lkCQlwbl9tc2dfdS5iYXNlLnBuX3N1Ym1zZ19pZAorI2RlZmluZSBwbl9lX3N1Ym1zZ19pZAkJcG5fbXNnX3UuZXh0LnBuX2Vfc3VibXNnX2lkCisjZGVmaW5lIHBuX2VfcmVzX2lkCQlwbl9tc2dfdS5leHQucG5fZV9yZXNfaWQKKyNkZWZpbmUgcG5fZGF0YQkJCXBuX21zZ191LmJhc2UucG5fZGF0YQorI2RlZmluZSBwbl9lX2RhdGEJCXBuX21zZ191LmV4dC5wbl9lX2RhdGEKKworLyogZGF0YSBmb3IgdW5yZWFjaGFibGUgZXJyb3JzICovCisjZGVmaW5lIFBOX0NPTU1fU0VSVklDRV9OT1RfSURFTlRJRklFRF9SRVNQCTB4MDEKKyNkZWZpbmUgUE5fQ09NTV9JU0FfRU5USVRZX05PVF9SRUFDSEFCTEVfUkVTUAkweDE0CisjZGVmaW5lIHBuX29yaWdfbXNnX2lkCQlwbl9kYXRhWzBdCisjZGVmaW5lIHBuX3N0YXR1cwkJcG5fZGF0YVsxXQorI2RlZmluZSBwbl9lX29yaWdfbXNnX2lkCXBuX2VfZGF0YVswXQorI2RlZmluZSBwbl9lX3N0YXR1cwkJcG5fZV9kYXRhWzFdCisKKy8qIFBob25ldCBzb2NrZXQgYWRkcmVzcyBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBzb2NrYWRkcl9wbiB7CisJX19rZXJuZWxfc2FfZmFtaWx5X3Qgc3BuX2ZhbWlseTsKKwlfX3U4IHNwbl9vYmo7CisJX191OCBzcG5fZGV2OworCV9fdTggc3BuX3Jlc291cmNlOworCV9fdTggc3BuX3plcm9bc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgLSBzaXplb2YoX19rZXJuZWxfc2FfZmFtaWx5X3QpIC0gM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBXZWxsIGtub3duIGFkZHJlc3MgKi8KKyNkZWZpbmUgUE5fREVWX1BDCTB4MTAKKworc3RhdGljIF9faW5saW5lX18gX191MTYgcG5fb2JqZWN0KF9fdTggYWRkciwgX191MTYgcG9ydCkKK3sKKwlyZXR1cm4gKGFkZHIgPDwgOCkgfCAocG9ydCAmIDB4M2ZmKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX191OCBwbl9vYmooX191MTYgaGFuZGxlKQoreworCXJldHVybiBoYW5kbGUgJiAweGZmOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3U4IHBuX2RldihfX3UxNiBoYW5kbGUpCit7CisJcmV0dXJuIGhhbmRsZSA+PiA4OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBwbl9wb3J0KF9fdTE2IGhhbmRsZSkKK3sKKwlyZXR1cm4gaGFuZGxlICYgMHgzZmY7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTggcG5fYWRkcihfX3UxNiBoYW5kbGUpCit7CisJcmV0dXJuIChoYW5kbGUgPj4gOCkgJiAweGZjOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHBuX3NvY2thZGRyX3NldF9hZGRyKHN0cnVjdCBzb2NrYWRkcl9wbiAqc3BuLCBfX3U4IGFkZHIpCit7CisJc3BuLT5zcG5fZGV2ICY9IDB4MDM7CisJc3BuLT5zcG5fZGV2IHw9IGFkZHIgJiAweGZjOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHBuX3NvY2thZGRyX3NldF9wb3J0KHN0cnVjdCBzb2NrYWRkcl9wbiAqc3BuLCBfX3UxNiBwb3J0KQoreworCXNwbi0+c3BuX2RldiAmPSAweGZjOworCXNwbi0+c3BuX2RldiB8PSAocG9ydCA+PiA4KSAmIDB4MDM7CisJc3BuLT5zcG5fb2JqID0gcG9ydCAmIDB4ZmY7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcG5fc29ja2FkZHJfc2V0X29iamVjdChzdHJ1Y3Qgc29ja2FkZHJfcG4gKnNwbiwKKwkJCQkJCV9fdTE2IGhhbmRsZSkKK3sKKwlzcG4tPnNwbl9kZXYgPSBwbl9kZXYoaGFuZGxlKTsKKwlzcG4tPnNwbl9vYmogPSBwbl9vYmooaGFuZGxlKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBwbl9zb2NrYWRkcl9zZXRfcmVzb3VyY2Uoc3RydWN0IHNvY2thZGRyX3BuICpzcG4sCisJCQkJCQlfX3U4IHJlc291cmNlKQoreworCXNwbi0+c3BuX3Jlc291cmNlID0gcmVzb3VyY2U7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTggcG5fc29ja2FkZHJfZ2V0X2FkZHIoY29uc3Qgc3RydWN0IHNvY2thZGRyX3BuICpzcG4pCit7CisJcmV0dXJuIHNwbi0+c3BuX2RldiAmIDB4ZmM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IHBuX3NvY2thZGRyX2dldF9wb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9wbiAqc3BuKQoreworCXJldHVybiAoKHNwbi0+c3BuX2RldiAmIDB4MDMpIDw8IDgpIHwgc3BuLT5zcG5fb2JqOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBwbl9zb2NrYWRkcl9nZXRfb2JqZWN0KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9wbiAqc3BuKQoreworCXJldHVybiBwbl9vYmplY3Qoc3BuLT5zcG5fZGV2LCBzcG4tPnNwbl9vYmopOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3U4IHBuX3NvY2thZGRyX2dldF9yZXNvdXJjZShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfcG4gKnNwbikKK3sKKwlyZXR1cm4gc3BuLT5zcG5fcmVzb3VyY2U7Cit9CisKKy8qIFBob25ldCBkZXZpY2UgaW9jdGwgcmVxdWVzdHMgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BrdF9jbHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGt0X2Nscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZmJkZTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BrdF9jbHMuaApAQCAtMCwwICsxLDQ2NyBAQAorI2lmbmRlZiBfX0xJTlVYX1BLVF9DTFNfSAorI2RlZmluZSBfX0xJTlVYX1BLVF9DTFNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKworLyogSSB0aGluayBpIGNvdWxkIGhhdmUgZG9uZSBiZXR0ZXIgbWFjcm9zIDsgZm9yIG5vdyB0aGlzIGlzIHN0b2xlbiBmcm9tCisgKiBzb21lIGFyY2gvbWlwcyBjb2RlIC0gamhzCisqLworI2RlZmluZSBfVENfTUFLRTMyKHgpICgoeCkpCisKKyNkZWZpbmUgX1RDX01BS0VNQVNLMShuKSAoX1RDX01BS0UzMigxKSA8PCBfVENfTUFLRTMyKG4pKQorI2RlZmluZSBfVENfTUFLRU1BU0sodixuKSAoX1RDX01BS0UzMigoX1RDX01BS0UzMigxKTw8KHYpKS0xKSA8PCBfVENfTUFLRTMyKG4pKQorI2RlZmluZSBfVENfTUFLRVZBTFVFKHYsbikgKF9UQ19NQUtFMzIodikgPDwgX1RDX01BS0UzMihuKSkKKyNkZWZpbmUgX1RDX0dFVFZBTFVFKHYsbixtKSAoKF9UQ19NQUtFMzIodikgJiBfVENfTUFLRTMyKG0pKSA+PiBfVENfTUFLRTMyKG4pKQorCisvKiB2ZXJkaWN0IGJpdCBicmVha2Rvd24gCisgKgorYml0IDA6IHdoZW4gc2V0IC0+IHRoaXMgcGFja2V0IGhhcyBiZWVuIG11bmdlZCBhbHJlYWR5CisKK2JpdCAxOiB3aGVuIHNldCAtPiBJdCBpcyBvayB0byBtdW5nZSB0aGlzIHBhY2tldAorCitiaXQgMiwzLDQsNTogUmVjbGFzc2lmeSBjb3VudGVyIC0gc29ydCBvZiByZXZlcnNlIFRUTCAtIGlmIGV4Y2VlZGVkCithc3N1bWUgbG9vcAorCitiaXQgNiw3OiBXaGVyZSB0aGlzIHBhY2tldCB3YXMgbGFzdCBzZWVuIAorMDogQWJvdmUgdGhlIHRyYW5zbWl0IGV4YW1wbGUgYXQgdGhlIHNvY2tldCBsZXZlbAorMTogb24gdGhlIEluZ3Jlc3MKKzI6IG9uIHRoZSBFZ3Jlc3MKKworYml0IDg6IHdoZW4gc2V0IC0tPiBSZXF1ZXN0IG5vdCB0byBjbGFzc2lmeSBvbiBpbmdyZXNzLiAKKworYml0cyA5LDEwLDExOiByZWRpcmVjdCBjb3VudGVyIC0gIHJlZGlyZWN0IFRUTC4gTG9vcCBhdm9pZGFuY2UKKworICoKKyAqICovCisKKyNkZWZpbmUgVENfTVVOR0VEICAgICAgICAgIF9UQ19NQUtFTUFTSzEoMCkKKyNkZWZpbmUgU0VUX1RDX01VTkdFRCh2KSAgICggVENfTVVOR0VEIHwgKHYgJiB+VENfTVVOR0VEKSkKKyNkZWZpbmUgQ0xSX1RDX01VTkdFRCh2KSAgICggdiAmIH5UQ19NVU5HRUQpCisKKyNkZWZpbmUgVENfT0syTVVOR0UgICAgICAgIF9UQ19NQUtFTUFTSzEoMSkKKyNkZWZpbmUgU0VUX1RDX09LMk1VTkdFKHYpICAgKCBUQ19PSzJNVU5HRSB8ICh2ICYgflRDX09LMk1VTkdFKSkKKyNkZWZpbmUgQ0xSX1RDX09LMk1VTkdFKHYpICAgKCB2ICYgflRDX09LMk1VTkdFKQorCisjZGVmaW5lIFNfVENfVkVSRCAgICAgICAgICBfVENfTUFLRTMyKDIpCisjZGVmaW5lIE1fVENfVkVSRCAgICAgICAgICBfVENfTUFLRU1BU0soNCxTX1RDX1ZFUkQpCisjZGVmaW5lIEdfVENfVkVSRCh4KSAgICAgICBfVENfR0VUVkFMVUUoeCxTX1RDX1ZFUkQsTV9UQ19WRVJEKQorI2RlZmluZSBWX1RDX1ZFUkQoeCkgICAgICAgX1RDX01BS0VWQUxVRSh4LFNfVENfVkVSRCkKKyNkZWZpbmUgU0VUX1RDX1ZFUkQodixuKSAgICgoVl9UQ19WRVJEKG4pKSB8ICh2ICYgfk1fVENfVkVSRCkpCisKKyNkZWZpbmUgU19UQ19GUk9NICAgICAgICAgIF9UQ19NQUtFMzIoNikKKyNkZWZpbmUgTV9UQ19GUk9NICAgICAgICAgIF9UQ19NQUtFTUFTSygyLFNfVENfRlJPTSkKKyNkZWZpbmUgR19UQ19GUk9NKHgpICAgICAgIF9UQ19HRVRWQUxVRSh4LFNfVENfRlJPTSxNX1RDX0ZST00pCisjZGVmaW5lIFZfVENfRlJPTSh4KSAgICAgICBfVENfTUFLRVZBTFVFKHgsU19UQ19GUk9NKQorI2RlZmluZSBTRVRfVENfRlJPTSh2LG4pICAgKChWX1RDX0ZST00obikpIHwgKHYgJiB+TV9UQ19GUk9NKSkKKyNkZWZpbmUgQVRfU1RBQ0sJMHgwCisjZGVmaW5lIEFUX0lOR1JFU1MJMHgxCisjZGVmaW5lIEFUX0VHUkVTUwkweDIKKworI2RlZmluZSBUQ19OQ0xTICAgICAgICAgIF9UQ19NQUtFTUFTSzEoOCkKKyNkZWZpbmUgU0VUX1RDX05DTFModikgICAoIFRDX05DTFMgfCAodiAmIH5UQ19OQ0xTKSkKKyNkZWZpbmUgQ0xSX1RDX05DTFModikgICAoIHYgJiB+VENfTkNMUykKKworI2RlZmluZSBTX1RDX1JUVEwgICAgICAgICAgX1RDX01BS0UzMig5KQorI2RlZmluZSBNX1RDX1JUVEwgICAgICAgICAgX1RDX01BS0VNQVNLKDMsU19UQ19SVFRMKQorI2RlZmluZSBHX1RDX1JUVEwoeCkgICAgICAgX1RDX0dFVFZBTFVFKHgsU19UQ19SVFRMLE1fVENfUlRUTCkKKyNkZWZpbmUgVl9UQ19SVFRMKHgpICAgICAgIF9UQ19NQUtFVkFMVUUoeCxTX1RDX1JUVEwpCisjZGVmaW5lIFNFVF9UQ19SVFRMKHYsbikgICAoKFZfVENfUlRUTChuKSkgfCAodiAmIH5NX1RDX1JUVEwpKQorCisjZGVmaW5lIFNfVENfQVQgICAgICAgICAgX1RDX01BS0UzMigxMikKKyNkZWZpbmUgTV9UQ19BVCAgICAgICAgICBfVENfTUFLRU1BU0soMixTX1RDX0FUKQorI2RlZmluZSBHX1RDX0FUKHgpICAgICAgIF9UQ19HRVRWQUxVRSh4LFNfVENfQVQsTV9UQ19BVCkKKyNkZWZpbmUgVl9UQ19BVCh4KSAgICAgICBfVENfTUFLRVZBTFVFKHgsU19UQ19BVCkKKyNkZWZpbmUgU0VUX1RDX0FUKHYsbikgICAoKFZfVENfQVQobikpIHwgKHYgJiB+TV9UQ19BVCkpCisKKy8qIEFjdGlvbiBhdHRyaWJ1dGVzICovCitlbnVtIHsKKwlUQ0FfQUNUX1VOU1BFQywKKwlUQ0FfQUNUX0tJTkQsCisJVENBX0FDVF9PUFRJT05TLAorCVRDQV9BQ1RfSU5ERVgsCisJVENBX0FDVF9TVEFUUywKKwlfX1RDQV9BQ1RfTUFYCit9OworCisjZGVmaW5lIFRDQV9BQ1RfTUFYIF9fVENBX0FDVF9NQVgKKyNkZWZpbmUgVENBX09MRF9DT01QQVQgKFRDQV9BQ1RfTUFYKzEpCisjZGVmaW5lIFRDQV9BQ1RfTUFYX1BSSU8gMzIKKyNkZWZpbmUgVENBX0FDVF9CSU5ECTEKKyNkZWZpbmUgVENBX0FDVF9OT0JJTkQJMAorI2RlZmluZSBUQ0FfQUNUX1VOQklORAkxCisjZGVmaW5lIFRDQV9BQ1RfTk9VTkJJTkQJMAorI2RlZmluZSBUQ0FfQUNUX1JFUExBQ0UJCTEKKyNkZWZpbmUgVENBX0FDVF9OT1JFUExBQ0UJMAorI2RlZmluZSBNQVhfUkVDX0xPT1AgNAorI2RlZmluZSBNQVhfUkVEX0xPT1AgNAorCisjZGVmaW5lIFRDX0FDVF9VTlNQRUMJKC0xKQorI2RlZmluZSBUQ19BQ1RfT0sJCTAKKyNkZWZpbmUgVENfQUNUX1JFQ0xBU1NJRlkJMQorI2RlZmluZSBUQ19BQ1RfU0hPVAkJMgorI2RlZmluZSBUQ19BQ1RfUElQRQkJMworI2RlZmluZSBUQ19BQ1RfU1RPTEVOCQk0CisjZGVmaW5lIFRDX0FDVF9RVUVVRUQJCTUKKyNkZWZpbmUgVENfQUNUX1JFUEVBVAkJNgorI2RlZmluZSBUQ19BQ1RfSlVNUAkJMHgxMDAwMDAwMAorCisvKiBBY3Rpb24gdHlwZSBpZGVudGlmaWVycyovCitlbnVtIHsKKwlUQ0FfSURfVU5TUEVDPTAsCisJVENBX0lEX1BPTElDRT0xLAorCS8qIG90aGVyIGFjdGlvbnMgZ28gaGVyZSAqLworCV9fVENBX0lEX01BWD0yNTUKK307CisKKyNkZWZpbmUgVENBX0lEX01BWCBfX1RDQV9JRF9NQVgKKworc3RydWN0IHRjX3BvbGljZSB7CisJX191MzIJCQlpbmRleDsKKwlpbnQJCQlhY3Rpb247CisjZGVmaW5lIFRDX1BPTElDRV9VTlNQRUMJVENfQUNUX1VOU1BFQworI2RlZmluZSBUQ19QT0xJQ0VfT0sJCVRDX0FDVF9PSworI2RlZmluZSBUQ19QT0xJQ0VfUkVDTEFTU0lGWQlUQ19BQ1RfUkVDTEFTU0lGWQorI2RlZmluZSBUQ19QT0xJQ0VfU0hPVAkJVENfQUNUX1NIT1QKKyNkZWZpbmUgVENfUE9MSUNFX1BJUEUJCVRDX0FDVF9QSVBFCisKKwlfX3UzMgkJCWxpbWl0OworCV9fdTMyCQkJYnVyc3Q7CisJX191MzIJCQltdHU7CisJc3RydWN0IHRjX3JhdGVzcGVjCXJhdGU7CisJc3RydWN0IHRjX3JhdGVzcGVjCXBlYWtyYXRlOworCWludCAJCQlyZWZjbnQ7CisJaW50IAkJCWJpbmRjbnQ7CisJX191MzIJCQljYXBhYjsKK307CisKK3N0cnVjdCB0Y2ZfdCB7CisJX191NjQgICBpbnN0YWxsOworCV9fdTY0ICAgbGFzdHVzZTsKKwlfX3U2NCAgIGV4cGlyZXM7Cit9OworCitzdHJ1Y3QgdGNfY250IHsKKwlpbnQgICAgICAgICAgICAgICAgICAgcmVmY250OyAKKwlpbnQgICAgICAgICAgICAgICAgICAgYmluZGNudDsKK307CisKKyNkZWZpbmUgdGNfZ2VuIFwKKwlfX3UzMiAgICAgICAgICAgICAgICAgaW5kZXg7IFwKKwlfX3UzMiAgICAgICAgICAgICAgICAgY2FwYWI7IFwKKwlpbnQgICAgICAgICAgICAgICAgICAgYWN0aW9uOyBcCisJaW50ICAgICAgICAgICAgICAgICAgIHJlZmNudDsgXAorCWludCAgICAgICAgICAgICAgICAgICBiaW5kY250CisKK2VudW0geworCVRDQV9QT0xJQ0VfVU5TUEVDLAorCVRDQV9QT0xJQ0VfVEJGLAorCVRDQV9QT0xJQ0VfUkFURSwKKwlUQ0FfUE9MSUNFX1BFQUtSQVRFLAorCVRDQV9QT0xJQ0VfQVZSQVRFLAorCVRDQV9QT0xJQ0VfUkVTVUxULAorCV9fVENBX1BPTElDRV9NQVgKKyNkZWZpbmUgVENBX1BPTElDRV9SRVNVTFQgVENBX1BPTElDRV9SRVNVTFQKK307CisKKyNkZWZpbmUgVENBX1BPTElDRV9NQVggKF9fVENBX1BPTElDRV9NQVggLSAxKQorCisvKiBVMzIgZmlsdGVycyAqLworCisjZGVmaW5lIFRDX1UzMl9IVElEKGgpICgoaCkmMHhGRkYwMDAwMCkKKyNkZWZpbmUgVENfVTMyX1VTRVJIVElEKGgpIChUQ19VMzJfSFRJRChoKT4+MjApCisjZGVmaW5lIFRDX1UzMl9IQVNIKGgpICgoKGgpPj4xMikmMHhGRikKKyNkZWZpbmUgVENfVTMyX05PREUoaCkgKChoKSYweEZGRikKKyNkZWZpbmUgVENfVTMyX0tFWShoKSAoKGgpJjB4RkZGRkYpCisjZGVmaW5lIFRDX1UzMl9VTlNQRUMJMAorI2RlZmluZSBUQ19VMzJfUk9PVAkoMHhGRkYwMDAwMCkKKworZW51bSB7CisJVENBX1UzMl9VTlNQRUMsCisJVENBX1UzMl9DTEFTU0lELAorCVRDQV9VMzJfSEFTSCwKKwlUQ0FfVTMyX0xJTkssCisJVENBX1UzMl9ESVZJU09SLAorCVRDQV9VMzJfU0VMLAorCVRDQV9VMzJfUE9MSUNFLAorCVRDQV9VMzJfQUNULCAgIAorCVRDQV9VMzJfSU5ERVYsCisJVENBX1UzMl9QQ05ULAorCVRDQV9VMzJfTUFSSywKKwlfX1RDQV9VMzJfTUFYCit9OworCisjZGVmaW5lIFRDQV9VMzJfTUFYIChfX1RDQV9VMzJfTUFYIC0gMSkKKworc3RydWN0IHRjX3UzMl9rZXkgeworCV9fYmUzMgkJbWFzazsKKwlfX2JlMzIJCXZhbDsKKwlpbnQJCW9mZjsKKwlpbnQJCW9mZm1hc2s7Cit9OworCitzdHJ1Y3QgdGNfdTMyX3NlbCB7CisJdW5zaWduZWQgY2hhcgkJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgkJb2Zmc2hpZnQ7CisJdW5zaWduZWQgY2hhcgkJbmtleXM7CisKKwlfX2JlMTYJCQlvZmZtYXNrOworCV9fdTE2CQkJb2ZmOworCXNob3J0CQkJb2Zmb2ZmOworCisJc2hvcnQJCQlob2ZmOworCV9fYmUzMgkJCWhtYXNrOworCXN0cnVjdCB0Y191MzJfa2V5CWtleXNbMF07Cit9OworCitzdHJ1Y3QgdGNfdTMyX21hcmsgeworCV9fdTMyCQl2YWw7CisJX191MzIJCW1hc2s7CisJX191MzIJCXN1Y2Nlc3M7Cit9OworCitzdHJ1Y3QgdGNfdTMyX3BjbnQgeworCV9fdTY0IHJjbnQ7CisJX191NjQgcmhpdDsKKwlfX3U2NCBrY250c1swXTsKK307CisKKy8qIEZsYWdzICovCisKKyNkZWZpbmUgVENfVTMyX1RFUk1JTkFMCQkxCisjZGVmaW5lIFRDX1UzMl9PRkZTRVQJCTIKKyNkZWZpbmUgVENfVTMyX1ZBUk9GRlNFVAk0CisjZGVmaW5lIFRDX1UzMl9FQVQJCTgKKworI2RlZmluZSBUQ19VMzJfTUFYREVQVEggOAorCisKKy8qIFJTVlAgZmlsdGVyICovCisKK2VudW0geworCVRDQV9SU1ZQX1VOU1BFQywKKwlUQ0FfUlNWUF9DTEFTU0lELAorCVRDQV9SU1ZQX0RTVCwKKwlUQ0FfUlNWUF9TUkMsCisJVENBX1JTVlBfUElORk8sCisJVENBX1JTVlBfUE9MSUNFLAorCVRDQV9SU1ZQX0FDVCwKKwlfX1RDQV9SU1ZQX01BWAorfTsKKworI2RlZmluZSBUQ0FfUlNWUF9NQVggKF9fVENBX1JTVlBfTUFYIC0gMSApCisKK3N0cnVjdCB0Y19yc3ZwX2dwaSB7CisJX191MzIJa2V5OworCV9fdTMyCW1hc2s7CisJaW50CW9mZnNldDsKK307CisKK3N0cnVjdCB0Y19yc3ZwX3BpbmZvIHsKKwlzdHJ1Y3QgdGNfcnN2cF9ncGkgZHBpOworCXN0cnVjdCB0Y19yc3ZwX2dwaSBzcGk7CisJX191OAlwcm90b2NvbDsKKwlfX3U4CXR1bm5lbGlkOworCV9fdTgJdHVubmVsaGRyOworCV9fdTgJcGFkOworfTsKKworLyogUk9VVEUgZmlsdGVyICovCisKK2VudW0geworCVRDQV9ST1VURTRfVU5TUEVDLAorCVRDQV9ST1VURTRfQ0xBU1NJRCwKKwlUQ0FfUk9VVEU0X1RPLAorCVRDQV9ST1VURTRfRlJPTSwKKwlUQ0FfUk9VVEU0X0lJRiwKKwlUQ0FfUk9VVEU0X1BPTElDRSwKKwlUQ0FfUk9VVEU0X0FDVCwKKwlfX1RDQV9ST1VURTRfTUFYCit9OworCisjZGVmaW5lIFRDQV9ST1VURTRfTUFYIChfX1RDQV9ST1VURTRfTUFYIC0gMSkKKworCisvKiBGVyBmaWx0ZXIgKi8KKworZW51bSB7CisJVENBX0ZXX1VOU1BFQywKKwlUQ0FfRldfQ0xBU1NJRCwKKwlUQ0FfRldfUE9MSUNFLAorCVRDQV9GV19JTkRFViwgLyogIHVzZWQgYnkgQ09ORklHX05FVF9DTFNfSU5EICovCisJVENBX0ZXX0FDVCwgLyogdXNlZCBieSBDT05GSUdfTkVUX0NMU19BQ1QgKi8KKwlUQ0FfRldfTUFTSywKKwlfX1RDQV9GV19NQVgKK307CisKKyNkZWZpbmUgVENBX0ZXX01BWCAoX19UQ0FfRldfTUFYIC0gMSkKKworLyogVEMgaW5kZXggZmlsdGVyICovCisKK2VudW0geworCVRDQV9UQ0lOREVYX1VOU1BFQywKKwlUQ0FfVENJTkRFWF9IQVNILAorCVRDQV9UQ0lOREVYX01BU0ssCisJVENBX1RDSU5ERVhfU0hJRlQsCisJVENBX1RDSU5ERVhfRkFMTF9USFJPVUdILAorCVRDQV9UQ0lOREVYX0NMQVNTSUQsCisJVENBX1RDSU5ERVhfUE9MSUNFLAorCVRDQV9UQ0lOREVYX0FDVCwKKwlfX1RDQV9UQ0lOREVYX01BWAorfTsKKworI2RlZmluZSBUQ0FfVENJTkRFWF9NQVggICAgIChfX1RDQV9UQ0lOREVYX01BWCAtIDEpCisKKy8qIEZsb3cgZmlsdGVyICovCisKK2VudW0geworCUZMT1dfS0VZX1NSQywKKwlGTE9XX0tFWV9EU1QsCisJRkxPV19LRVlfUFJPVE8sCisJRkxPV19LRVlfUFJPVE9fU1JDLAorCUZMT1dfS0VZX1BST1RPX0RTVCwKKwlGTE9XX0tFWV9JSUYsCisJRkxPV19LRVlfUFJJT1JJVFksCisJRkxPV19LRVlfTUFSSywKKwlGTE9XX0tFWV9ORkNULAorCUZMT1dfS0VZX05GQ1RfU1JDLAorCUZMT1dfS0VZX05GQ1RfRFNULAorCUZMT1dfS0VZX05GQ1RfUFJPVE9fU1JDLAorCUZMT1dfS0VZX05GQ1RfUFJPVE9fRFNULAorCUZMT1dfS0VZX1JUQ0xBU1NJRCwKKwlGTE9XX0tFWV9TS1VJRCwKKwlGTE9XX0tFWV9TS0dJRCwKKwlGTE9XX0tFWV9WTEFOX1RBRywKKwlGTE9XX0tFWV9SWEhBU0gsCisJX19GTE9XX0tFWV9NQVgsCit9OworCisjZGVmaW5lIEZMT1dfS0VZX01BWAkoX19GTE9XX0tFWV9NQVggLSAxKQorCitlbnVtIHsKKwlGTE9XX01PREVfTUFQLAorCUZMT1dfTU9ERV9IQVNILAorfTsKKworZW51bSB7CisJVENBX0ZMT1dfVU5TUEVDLAorCVRDQV9GTE9XX0tFWVMsCisJVENBX0ZMT1dfTU9ERSwKKwlUQ0FfRkxPV19CQVNFQ0xBU1MsCisJVENBX0ZMT1dfUlNISUZULAorCVRDQV9GTE9XX0FEREVORCwKKwlUQ0FfRkxPV19NQVNLLAorCVRDQV9GTE9XX1hPUiwKKwlUQ0FfRkxPV19ESVZJU09SLAorCVRDQV9GTE9XX0FDVCwKKwlUQ0FfRkxPV19QT0xJQ0UsCisJVENBX0ZMT1dfRU1BVENIRVMsCisJVENBX0ZMT1dfUEVSVFVSQiwKKwlfX1RDQV9GTE9XX01BWAorfTsKKworI2RlZmluZSBUQ0FfRkxPV19NQVgJKF9fVENBX0ZMT1dfTUFYIC0gMSkKKworLyogQmFzaWMgZmlsdGVyICovCisKK2VudW0geworCVRDQV9CQVNJQ19VTlNQRUMsCisJVENBX0JBU0lDX0NMQVNTSUQsCisJVENBX0JBU0lDX0VNQVRDSEVTLAorCVRDQV9CQVNJQ19BQ1QsCisJVENBX0JBU0lDX1BPTElDRSwKKwlfX1RDQV9CQVNJQ19NQVgKK307CisKKyNkZWZpbmUgVENBX0JBU0lDX01BWCAoX19UQ0FfQkFTSUNfTUFYIC0gMSkKKworCisvKiBDZ3JvdXAgY2xhc3NpZmllciAqLworCitlbnVtIHsKKwlUQ0FfQ0dST1VQX1VOU1BFQywKKwlUQ0FfQ0dST1VQX0FDVCwKKwlUQ0FfQ0dST1VQX1BPTElDRSwKKwlUQ0FfQ0dST1VQX0VNQVRDSEVTLAorCV9fVENBX0NHUk9VUF9NQVgsCit9OworCisjZGVmaW5lIFRDQV9DR1JPVVBfTUFYIChfX1RDQV9DR1JPVVBfTUFYIC0gMSkKKworLyogRXh0ZW5kZWQgTWF0Y2hlcyAqLworCitzdHJ1Y3QgdGNmX2VtYXRjaF90cmVlX2hkciB7CisJX191MTYJCW5tYXRjaGVzOworCV9fdTE2CQlwcm9naWQ7Cit9OworCitlbnVtIHsKKwlUQ0FfRU1BVENIX1RSRUVfVU5TUEVDLAorCVRDQV9FTUFUQ0hfVFJFRV9IRFIsCisJVENBX0VNQVRDSF9UUkVFX0xJU1QsCisJX19UQ0FfRU1BVENIX1RSRUVfTUFYCit9OworI2RlZmluZSBUQ0FfRU1BVENIX1RSRUVfTUFYIChfX1RDQV9FTUFUQ0hfVFJFRV9NQVggLSAxKQorCitzdHJ1Y3QgdGNmX2VtYXRjaF9oZHIgeworCV9fdTE2CQltYXRjaGlkOworCV9fdTE2CQlraW5kOworCV9fdTE2CQlmbGFnczsKKwlfX3UxNgkJcGFkOyAvKiBjdXJyZW50bHkgdW51c2VkICovCit9OworCisvKiAgMCAgICAgICAgICAgICAgICAgICAxCisgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSAKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstKy0rLS0tKworICogfCAgICAgICAgIFVudXNlZCAgICAgICAgfFN8SXwgUiB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLSstKy0tLSsKKyAqCisgKiBSKDIpIDo6PSByZWxhdGlvbiB0byBuZXh0IGVtYXRjaAorICogICAgICAgICAgd2hlcmU6IDAgMCBFTkQgKGxhc3QgZW1hdGNoKQorICogICAgICAgICAgICAgICAgIDAgMSBBTkQKKyAqICAgICAgICAgICAgICAgICAxIDAgT1IKKyAqICAgICAgICAgICAgICAgICAxIDEgVW51c2VkIChpbnZhbGlkKQorICogSSgxKSA6Oj0gaW52ZXJ0IHJlc3VsdAorICogUygxKSA6Oj0gc2ltcGxlIHBheWxvYWQKKyAqLworI2RlZmluZSBUQ0ZfRU1fUkVMX0VORAkwCisjZGVmaW5lIFRDRl9FTV9SRUxfQU5ECSgxPDwwKQorI2RlZmluZSBUQ0ZfRU1fUkVMX09SCSgxPDwxKQorI2RlZmluZSBUQ0ZfRU1fSU5WRVJUCSgxPDwyKQorI2RlZmluZSBUQ0ZfRU1fU0lNUExFCSgxPDwzKQorCisjZGVmaW5lIFRDRl9FTV9SRUxfTUFTSwkzCisjZGVmaW5lIFRDRl9FTV9SRUxfVkFMSUQodikgKCgodikgJiBUQ0ZfRU1fUkVMX01BU0spICE9IFRDRl9FTV9SRUxfTUFTSykKKworZW51bSB7CisJVENGX0xBWUVSX0xJTkssCisJVENGX0xBWUVSX05FVFdPUkssCisJVENGX0xBWUVSX1RSQU5TUE9SVCwKKwlfX1RDRl9MQVlFUl9NQVgKK307CisjZGVmaW5lIFRDRl9MQVlFUl9NQVggKF9fVENGX0xBWUVSX01BWCAtIDEpCisKKy8qIEVtYXRjaCB0eXBlIGFzc2lnbm1lbnRzCisgKiAgIDEuLjMyNzY3CQlSZXNlcnZlZCBmb3IgZW1hdGNoZXMgaW5zaWRlIGtlcm5lbCB0cmVlCisgKiAgIDMyNzY4Li42NTUzNQlGcmVlIHRvIHVzZSwgbm90IHJlbGlhYmxlCisgKi8KKyNkZWZpbmUJVENGX0VNX0NPTlRBSU5FUgkwCisjZGVmaW5lCVRDRl9FTV9DTVAJCTEKKyNkZWZpbmUJVENGX0VNX05CWVRFCQkyCisjZGVmaW5lCVRDRl9FTV9VMzIJCTMKKyNkZWZpbmUJVENGX0VNX01FVEEJCTQKKyNkZWZpbmUJVENGX0VNX1RFWFQJCTUKKyNkZWZpbmUgICAgICAgIFRDRl9FTV9WTEFOCQk2CisjZGVmaW5lCVRDRl9FTV9NQVgJCTYKKworZW51bSB7CisJVENGX0VNX1BST0dfVEMKK307CisKK2VudW0geworCVRDRl9FTV9PUE5EX0VRLAorCVRDRl9FTV9PUE5EX0dULAorCVRDRl9FTV9PUE5EX0xUCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGt0X3NjaGVkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BrdF9zY2hlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODFkNWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BrdF9zY2hlZC5oCkBAIC0wLDAgKzEsNjA2IEBACisjaWZuZGVmIF9fTElOVVhfUEtUX1NDSEVEX0gKKyNkZWZpbmUgX19MSU5VWF9QS1RfU0NIRURfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogTG9naWNhbCBwcmlvcml0eSBiYW5kcyBub3QgZGVwZW5kaW5nIG9uIHNwZWNpZmljIHBhY2tldCBzY2hlZHVsZXIuCisgICBFdmVyeSBzY2hlZHVsZXIgd2lsbCBtYXAgdGhlbSB0byByZWFsIHRyYWZmaWMgY2xhc3NlcywgaWYgaXQgaGFzCisgICBubyBtb3JlIHByZWNpc2UgbWVjaGFuaXNtIHRvIGNsYXNzaWZ5IHBhY2tldHMuCisKKyAgIFRoZXNlIG51bWJlcnMgaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmcsIHRob3VnaCB0aGVpciBjb2luY2lkZW5jZQorICAgd2l0aCBvYnNvbGV0ZSBJUHY2IHZhbHVlcyBpcyBub3Qgb2NjYXNpb25hbCA6LSkuIE5ldyBJUHY2IGRyYWZ0cworICAgcHJlZmVycmVkIGZ1bGwgYW5hcmNoeSBpbnNwaXJlZCBieSBkaWZmc2VydiBncm91cC4KKworICAgTm90ZTogVENfUFJJT19CRVNURUZGT1JUIGRvZXMgbm90IG1lYW4gdGhhdCBpdCBpcyB0aGUgbW9zdCB1bmhhcHB5CisgICBjbGFzcywgYWN0dWFsbHksIGFzIHJ1bGUgaXQgd2lsbCBiZSBoYW5kbGVkIHdpdGggbW9yZSBjYXJlIHRoYW4KKyAgIGZpbGxlciBvciBldmVuIGJ1bGsuCisgKi8KKworI2RlZmluZSBUQ19QUklPX0JFU1RFRkZPUlQJCTAKKyNkZWZpbmUgVENfUFJJT19GSUxMRVIJCQkxCisjZGVmaW5lIFRDX1BSSU9fQlVMSwkJCTIKKyNkZWZpbmUgVENfUFJJT19JTlRFUkFDVElWRV9CVUxLCTQKKyNkZWZpbmUgVENfUFJJT19JTlRFUkFDVElWRQkJNgorI2RlZmluZSBUQ19QUklPX0NPTlRST0wJCQk3CisKKyNkZWZpbmUgVENfUFJJT19NQVgJCQkxNQorCisvKiBHZW5lcmljIHF1ZXVlIHN0YXRpc3RpY3MsIGF2YWlsYWJsZSBmb3IgYWxsIHRoZSBlbGVtZW50cy4KKyAgIFBhcnRpY3VsYXIgc2NoZWR1bGVycyBtYXkgaGF2ZSBhbHNvIHRoZWlyIHByaXZhdGUgcmVjb3Jkcy4KKyAqLworCitzdHJ1Y3QgdGNfc3RhdHMgeworCV9fdTY0CWJ5dGVzOwkJCS8qIE51bWJlciBvZiBlbnF1ZXVlZCBieXRlcyAqLworCV9fdTMyCXBhY2tldHM7CQkvKiBOdW1iZXIgb2YgZW5xdWV1ZWQgcGFja2V0cwkqLworCV9fdTMyCWRyb3BzOwkJCS8qIFBhY2tldHMgZHJvcHBlZCBiZWNhdXNlIG9mIGxhY2sgb2YgcmVzb3VyY2VzICovCisJX191MzIJb3ZlcmxpbWl0czsJCS8qIE51bWJlciBvZiB0aHJvdHRsZSBldmVudHMgd2hlbiB0aGlzCisJCQkJCSAqIGZsb3cgZ29lcyBvdXQgb2YgYWxsb2NhdGVkIGJhbmR3aWR0aCAqLworCV9fdTMyCWJwczsJCQkvKiBDdXJyZW50IGZsb3cgYnl0ZSByYXRlICovCisJX191MzIJcHBzOwkJCS8qIEN1cnJlbnQgZmxvdyBwYWNrZXQgcmF0ZSAqLworCV9fdTMyCXFsZW47CisJX191MzIJYmFja2xvZzsKK307CisKK3N0cnVjdCB0Y19lc3RpbWF0b3IgeworCXNpZ25lZCBjaGFyCWludGVydmFsOworCXVuc2lnbmVkIGNoYXIJZXdtYV9sb2c7Cit9OworCisvKiAiSGFuZGxlcyIKKyAgIC0tLS0tLS0tLQorCisgICAgQWxsIHRoZSB0cmFmZmljIGNvbnRyb2wgb2JqZWN0cyBoYXZlIDMyYml0IGlkZW50aWZpZXJzLCBvciAiaGFuZGxlcyIuCisKKyAgICBUaGV5IGNhbiBiZSBjb25zaWRlcmVkIGFzIG9wYXF1ZSBudW1iZXJzIGZyb20gdXNlciBBUEkgdmlld3BvaW50LAorICAgIGJ1dCBhY3R1YWxseSB0aGV5IGFsd2F5cyBjb25zaXN0IG9mIHR3byBmaWVsZHM6IG1ham9yIGFuZAorICAgIG1pbm9yIG51bWJlcnMsIHdoaWNoIGFyZSBpbnRlcnByZXRlZCBieSBrZXJuZWwgc3BlY2lhbGx5LAorICAgIHRoYXQgbWF5IGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLCB0aG91Z2ggbm90IHJlY29tbWVuZGVkLgorCisgICAgRi5lLiBxZGlzYyBoYW5kbGVzIGFsd2F5cyBoYXZlIG1pbm9yIG51bWJlciBlcXVhbCB0byB6ZXJvLAorICAgIGNsYXNzZXMgKG9yIGZsb3dzKSBoYXZlIG1ham9yIGVxdWFsIHRvIHBhcmVudCBxZGlzYyBtYWpvciwgYW5kCisgICAgbWlub3IgdW5pcXVlbHkgaWRlbnRpZnlpbmcgY2xhc3MgaW5zaWRlIHFkaXNjLgorCisgICAgTWFjcm9zIHRvIG1hbmlwdWxhdGUgaGFuZGxlczoKKyAqLworCisjZGVmaW5lIFRDX0hfTUFKX01BU0sgKDB4RkZGRjAwMDBVKQorI2RlZmluZSBUQ19IX01JTl9NQVNLICgweDAwMDBGRkZGVSkKKyNkZWZpbmUgVENfSF9NQUooaCkgKChoKSZUQ19IX01BSl9NQVNLKQorI2RlZmluZSBUQ19IX01JTihoKSAoKGgpJlRDX0hfTUlOX01BU0spCisjZGVmaW5lIFRDX0hfTUFLRShtYWosbWluKSAoKChtYWopJlRDX0hfTUFKX01BU0spfCgobWluKSZUQ19IX01JTl9NQVNLKSkKKworI2RlZmluZSBUQ19IX1VOU1BFQwkoMFUpCisjZGVmaW5lIFRDX0hfUk9PVAkoMHhGRkZGRkZGRlUpCisjZGVmaW5lIFRDX0hfSU5HUkVTUyAgICAoMHhGRkZGRkZGMVUpCisKK3N0cnVjdCB0Y19yYXRlc3BlYyB7CisJdW5zaWduZWQgY2hhcgljZWxsX2xvZzsKKwl1bnNpZ25lZCBjaGFyCV9fcmVzZXJ2ZWQ7CisJdW5zaWduZWQgc2hvcnQJb3ZlcmhlYWQ7CisJc2hvcnQJCWNlbGxfYWxpZ247CisJdW5zaWduZWQgc2hvcnQJbXB1OworCV9fdTMyCQlyYXRlOworfTsKKworI2RlZmluZSBUQ19SVEFCX1NJWkUJMTAyNAorCitzdHJ1Y3QgdGNfc2l6ZXNwZWMgeworCXVuc2lnbmVkIGNoYXIJY2VsbF9sb2c7CisJdW5zaWduZWQgY2hhcglzaXplX2xvZzsKKwlzaG9ydAkJY2VsbF9hbGlnbjsKKwlpbnQJCW92ZXJoZWFkOworCXVuc2lnbmVkIGludAlsaW5rbGF5ZXI7CisJdW5zaWduZWQgaW50CW1wdTsKKwl1bnNpZ25lZCBpbnQJbXR1OworCXVuc2lnbmVkIGludAl0c2l6ZTsKK307CisKK2VudW0geworCVRDQV9TVEFCX1VOU1BFQywKKwlUQ0FfU1RBQl9CQVNFLAorCVRDQV9TVEFCX0RBVEEsCisJX19UQ0FfU1RBQl9NQVgKK307CisKKyNkZWZpbmUgVENBX1NUQUJfTUFYIChfX1RDQV9TVEFCX01BWCAtIDEpCisKKy8qIEZJRk8gc2VjdGlvbiAqLworCitzdHJ1Y3QgdGNfZmlmb19xb3B0IHsKKwlfX3UzMglsaW1pdDsJLyogUXVldWUgbGVuZ3RoOiBieXRlcyBmb3IgYmZpZm8sIHBhY2tldHMgZm9yIHBmaWZvICovCit9OworCisvKiBQUklPIHNlY3Rpb24gKi8KKworI2RlZmluZSBUQ1FfUFJJT19CQU5EUwkxNgorI2RlZmluZSBUQ1FfTUlOX1BSSU9fQkFORFMgMgorCitzdHJ1Y3QgdGNfcHJpb19xb3B0IHsKKwlpbnQJYmFuZHM7CQkJLyogTnVtYmVyIG9mIGJhbmRzICovCisJX191OAlwcmlvbWFwW1RDX1BSSU9fTUFYKzFdOwkvKiBNYXA6IGxvZ2ljYWwgcHJpb3JpdHkgLT4gUFJJTyBiYW5kICovCit9OworCisvKiBNVUxUSVEgc2VjdGlvbiAqLworCitzdHJ1Y3QgdGNfbXVsdGlxX3FvcHQgeworCV9fdTE2CWJhbmRzOwkJCS8qIE51bWJlciBvZiBiYW5kcyAqLworCV9fdTE2CW1heF9iYW5kczsJCS8qIE1heGltdW0gbnVtYmVyIG9mIHF1ZXVlcyAqLworfTsKKworLyogVEJGIHNlY3Rpb24gKi8KKworc3RydWN0IHRjX3RiZl9xb3B0IHsKKwlzdHJ1Y3QgdGNfcmF0ZXNwZWMgcmF0ZTsKKwlzdHJ1Y3QgdGNfcmF0ZXNwZWMgcGVha3JhdGU7CisJX191MzIJCWxpbWl0OworCV9fdTMyCQlidWZmZXI7CisJX191MzIJCW10dTsKK307CisKK2VudW0geworCVRDQV9UQkZfVU5TUEVDLAorCVRDQV9UQkZfUEFSTVMsCisJVENBX1RCRl9SVEFCLAorCVRDQV9UQkZfUFRBQiwKKwlfX1RDQV9UQkZfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfVEJGX01BWCAoX19UQ0FfVEJGX01BWCAtIDEpCisKKworLyogVEVRTCBzZWN0aW9uICovCisKKy8qIFRFUUwgZG9lcyBub3QgcmVxdWlyZSBhbnkgcGFyYW1ldGVycyAqLworCisvKiBTRlEgc2VjdGlvbiAqLworCitzdHJ1Y3QgdGNfc2ZxX3FvcHQgeworCXVuc2lnbmVkCXF1YW50dW07CS8qIEJ5dGVzIHBlciByb3VuZCBhbGxvY2F0ZWQgdG8gZmxvdyAqLworCWludAkJcGVydHVyYl9wZXJpb2Q7CS8qIFBlcmlvZCBvZiBoYXNoIHBlcnR1cmJhdGlvbiAqLworCV9fdTMyCQlsaW1pdDsJCS8qIE1heGltYWwgcGFja2V0cyBpbiBxdWV1ZSAqLworCXVuc2lnbmVkCWRpdmlzb3I7CS8qIEhhc2ggZGl2aXNvciAgKi8KKwl1bnNpZ25lZAlmbG93czsJCS8qIE1heGltYWwgbnVtYmVyIG9mIGZsb3dzICAqLworfTsKKworc3RydWN0IHRjX3NmcV94c3RhdHMgeworCV9fczMyCQlhbGxvdDsKK307CisKKy8qCisgKiAgTk9URTogbGltaXQsIGRpdmlzb3IgYW5kIGZsb3dzIGFyZSBoYXJkd2lyZWQgdG8gY29kZSBhdCB0aGUgbW9tZW50LgorICoKKyAqCWxpbWl0PWZsb3dzPTEyOCwgZGl2aXNvcj0xMDI0OworICoKKyAqCVRoZSBvbmx5IHJlYXNvbiBmb3IgdGhpcyBpcyBlZmZpY2llbmN5LCBpdCBpcyBwb3NzaWJsZQorICoJdG8gY2hhbmdlIHRoZXNlIHBhcmFtZXRlcnMgaW4gY29tcGlsZSB0aW1lLgorICovCisKKy8qIFJFRCBzZWN0aW9uICovCisKK2VudW0geworCVRDQV9SRURfVU5TUEVDLAorCVRDQV9SRURfUEFSTVMsCisJVENBX1JFRF9TVEFCLAorCV9fVENBX1JFRF9NQVgsCit9OworCisjZGVmaW5lIFRDQV9SRURfTUFYIChfX1RDQV9SRURfTUFYIC0gMSkKKworc3RydWN0IHRjX3JlZF9xb3B0IHsKKwlfX3UzMgkJbGltaXQ7CQkvKiBIQVJEIG1heGltYWwgcXVldWUgbGVuZ3RoIChieXRlcykJKi8KKwlfX3UzMgkJcXRoX21pbjsJLyogTWluIGF2ZXJhZ2UgbGVuZ3RoIHRocmVzaG9sZCAoYnl0ZXMpICovCisJX191MzIJCXF0aF9tYXg7CS8qIE1heCBhdmVyYWdlIGxlbmd0aCB0aHJlc2hvbGQgKGJ5dGVzKSAqLworCXVuc2lnbmVkIGNoYXIgICBXbG9nOwkJLyogbG9nKFcpCQkqLworCXVuc2lnbmVkIGNoYXIgICBQbG9nOwkJLyogbG9nKFBfbWF4LyhxdGhfbWF4LXF0aF9taW4pKQkqLworCXVuc2lnbmVkIGNoYXIgICBTY2VsbF9sb2c7CS8qIGNlbGwgc2l6ZSBmb3IgaWRsZSBkYW1waW5nICovCisJdW5zaWduZWQgY2hhcglmbGFnczsKKyNkZWZpbmUgVENfUkVEX0VDTgkxCisjZGVmaW5lIFRDX1JFRF9IQVJERFJPUAkyCit9OworCitzdHJ1Y3QgdGNfcmVkX3hzdGF0cyB7CisJX191MzIgICAgICAgICAgIGVhcmx5OyAgICAgICAgICAvKiBFYXJseSBkcm9wcyAqLworCV9fdTMyICAgICAgICAgICBwZHJvcDsgICAgICAgICAgLyogRHJvcHMgZHVlIHRvIHF1ZXVlIGxpbWl0cyAqLworCV9fdTMyICAgICAgICAgICBvdGhlcjsgICAgICAgICAgLyogRHJvcHMgZHVlIHRvIGRyb3AoKSBjYWxscyAqLworCV9fdTMyICAgICAgICAgICBtYXJrZWQ7ICAgICAgICAgLyogTWFya2VkIHBhY2tldHMgKi8KK307CisKKy8qIEdSRUQgc2VjdGlvbiAqLworCisjZGVmaW5lIE1BWF9EUHMgMTYKKworZW51bSB7CisgICAgICAgVENBX0dSRURfVU5TUEVDLAorICAgICAgIFRDQV9HUkVEX1BBUk1TLAorICAgICAgIFRDQV9HUkVEX1NUQUIsCisgICAgICAgVENBX0dSRURfRFBTLAorCSAgIF9fVENBX0dSRURfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfR1JFRF9NQVggKF9fVENBX0dSRURfTUFYIC0gMSkKKworc3RydWN0IHRjX2dyZWRfcW9wdCB7CisJX191MzIJCWxpbWl0OyAgICAgICAgLyogSEFSRCBtYXhpbWFsIHF1ZXVlIGxlbmd0aCAoYnl0ZXMpICAgICovCisJX191MzIJCXF0aF9taW47ICAgICAgLyogTWluIGF2ZXJhZ2UgbGVuZ3RoIHRocmVzaG9sZCAoYnl0ZXMpICovCisJX191MzIJCXF0aF9tYXg7ICAgICAgLyogTWF4IGF2ZXJhZ2UgbGVuZ3RoIHRocmVzaG9sZCAoYnl0ZXMpICovCisJX191MzIJCURQOyAgICAgICAgICAgLyogdXAgdG8gMl4zMiBEUHMgKi8KKwlfX3UzMgkJYmFja2xvZzsKKwlfX3UzMgkJcWF2ZTsKKwlfX3UzMgkJZm9yY2VkOworCV9fdTMyCQllYXJseTsKKwlfX3UzMgkJb3RoZXI7CisJX191MzIJCXBkcm9wOworCV9fdTgJCVdsb2c7ICAgICAgICAgLyogbG9nKFcpICAgICAgICAgICAgICAgKi8KKwlfX3U4CQlQbG9nOyAgICAgICAgIC8qIGxvZyhQX21heC8ocXRoX21heC1xdGhfbWluKSkgKi8KKwlfX3U4CQlTY2VsbF9sb2c7ICAgIC8qIGNlbGwgc2l6ZSBmb3IgaWRsZSBkYW1waW5nICovCisJX191OAkJcHJpbzsgICAgICAgICAvKiBwcmlvIG9mIHRoaXMgVlEgKi8KKwlfX3UzMgkJcGFja2V0czsKKwlfX3UzMgkJYnl0ZXNpbjsKK307CisKKy8qIGdyZWQgc2V0dXAgKi8KK3N0cnVjdCB0Y19ncmVkX3NvcHQgeworCV9fdTMyCQlEUHM7CisJX191MzIJCWRlZl9EUDsKKwlfX3U4CQlncmlvOworCV9fdTgJCWZsYWdzOworCV9fdTE2CQlwYWQxOworfTsKKworLyogQ0hPS2Ugc2VjdGlvbiAqLworCitlbnVtIHsKKwlUQ0FfQ0hPS0VfVU5TUEVDLAorCVRDQV9DSE9LRV9QQVJNUywKKwlUQ0FfQ0hPS0VfU1RBQiwKKwlfX1RDQV9DSE9LRV9NQVgsCit9OworCisjZGVmaW5lIFRDQV9DSE9LRV9NQVggKF9fVENBX0NIT0tFX01BWCAtIDEpCisKK3N0cnVjdCB0Y19jaG9rZV9xb3B0IHsKKwlfX3UzMgkJbGltaXQ7CQkvKiBIYXJkIHF1ZXVlIGxlbmd0aCAocGFja2V0cykJKi8KKwlfX3UzMgkJcXRoX21pbjsJLyogTWluIGF2ZXJhZ2UgdGhyZXNob2xkIChwYWNrZXRzKSAqLworCV9fdTMyCQlxdGhfbWF4OwkvKiBNYXggYXZlcmFnZSB0aHJlc2hvbGQgKHBhY2tldHMpICovCisJdW5zaWduZWQgY2hhciAgIFdsb2c7CQkvKiBsb2coVykJCSovCisJdW5zaWduZWQgY2hhciAgIFBsb2c7CQkvKiBsb2coUF9tYXgvKHF0aF9tYXgtcXRoX21pbikpCSovCisJdW5zaWduZWQgY2hhciAgIFNjZWxsX2xvZzsJLyogY2VsbCBzaXplIGZvciBpZGxlIGRhbXBpbmcgKi8KKwl1bnNpZ25lZCBjaGFyCWZsYWdzOwkJLyogc2VlIFJFRCBmbGFncyAqLworfTsKKworc3RydWN0IHRjX2Nob2tlX3hzdGF0cyB7CisJX191MzIJCWVhcmx5OyAgICAgICAgICAvKiBFYXJseSBkcm9wcyAqLworCV9fdTMyCQlwZHJvcDsgICAgICAgICAgLyogRHJvcHMgZHVlIHRvIHF1ZXVlIGxpbWl0cyAqLworCV9fdTMyCQlvdGhlcjsgICAgICAgICAgLyogRHJvcHMgZHVlIHRvIGRyb3AoKSBjYWxscyAqLworCV9fdTMyCQltYXJrZWQ7ICAgICAgICAgLyogTWFya2VkIHBhY2tldHMgKi8KKwlfX3UzMgkJbWF0Y2hlZDsJLyogRHJvcHMgZHVlIHRvIGZsb3cgbWF0Y2ggKi8KK307CisKKy8qIEhUQiBzZWN0aW9uICovCisjZGVmaW5lIFRDX0hUQl9OVU1QUklPCQk4CisjZGVmaW5lIFRDX0hUQl9NQVhERVBUSAkJOAorI2RlZmluZSBUQ19IVEJfUFJPVE9WRVIJCTMgLyogdGhlIHNhbWUgYXMgSFRCIGFuZCBUQydzIG1ham9yICovCisKK3N0cnVjdCB0Y19odGJfb3B0IHsKKwlzdHJ1Y3QgdGNfcmF0ZXNwZWMgCXJhdGU7CisJc3RydWN0IHRjX3JhdGVzcGVjIAljZWlsOworCV9fdTMyCWJ1ZmZlcjsKKwlfX3UzMgljYnVmZmVyOworCV9fdTMyCXF1YW50dW07CisJX191MzIJbGV2ZWw7CQkvKiBvdXQgb25seSAqLworCV9fdTMyCXByaW87Cit9Oworc3RydWN0IHRjX2h0Yl9nbG9iIHsKKwlfX3UzMiB2ZXJzaW9uOwkJLyogdG8gbWF0Y2ggSFRCL1RDICovCisgICAgCV9fdTMyIHJhdGUycXVhbnR1bTsJLyogYnBzLT5xdWFudHVtIGRpdmlzb3IgKi8KKyAgICAJX191MzIgZGVmY2xzOwkJLyogZGVmYXVsdCBjbGFzcyBudW1iZXIgKi8KKwlfX3UzMiBkZWJ1ZzsJCS8qIGRlYnVnIGZsYWdzICovCisKKwkvKiBzdGF0cyAqLworCV9fdTMyIGRpcmVjdF9wa3RzOyAvKiBjb3VudCBvZiBub24gc2hhcGVkIHBhY2tldHMgKi8KK307CitlbnVtIHsKKwlUQ0FfSFRCX1VOU1BFQywKKwlUQ0FfSFRCX1BBUk1TLAorCVRDQV9IVEJfSU5JVCwKKwlUQ0FfSFRCX0NUQUIsCisJVENBX0hUQl9SVEFCLAorCV9fVENBX0hUQl9NQVgsCit9OworCisjZGVmaW5lIFRDQV9IVEJfTUFYIChfX1RDQV9IVEJfTUFYIC0gMSkKKworc3RydWN0IHRjX2h0Yl94c3RhdHMgeworCV9fdTMyIGxlbmRzOworCV9fdTMyIGJvcnJvd3M7CisJX191MzIgZ2lhbnRzOwkvKiB0b28gYmlnIHBhY2tldHMgKHJhdGUgd2lsbCBub3QgYmUgYWNjdXJhdGUpICovCisJX191MzIgdG9rZW5zOworCV9fdTMyIGN0b2tlbnM7Cit9OworCisvKiBIRlNDIHNlY3Rpb24gKi8KKworc3RydWN0IHRjX2hmc2NfcW9wdCB7CisJX191MTYJZGVmY2xzOwkJLyogZGVmYXVsdCBjbGFzcyAqLworfTsKKworc3RydWN0IHRjX3NlcnZpY2VfY3VydmUgeworCV9fdTMyCW0xOwkJLyogc2xvcGUgb2YgdGhlIGZpcnN0IHNlZ21lbnQgaW4gYnBzICovCisJX191MzIJZDsJCS8qIHgtcHJvamVjdGlvbiBvZiB0aGUgZmlyc3Qgc2VnbWVudCBpbiB1cyAqLworCV9fdTMyCW0yOwkJLyogc2xvcGUgb2YgdGhlIHNlY29uZCBzZWdtZW50IGluIGJwcyAqLworfTsKKworc3RydWN0IHRjX2hmc2Nfc3RhdHMgeworCV9fdTY0CXdvcms7CQkvKiB0b3RhbCB3b3JrIGRvbmUgKi8KKwlfX3U2NAlydHdvcms7CQkvKiB3b3JrIGRvbmUgYnkgcmVhbC10aW1lIGNyaXRlcmlhICovCisJX191MzIJcGVyaW9kOwkJLyogY3VycmVudCBwZXJpb2QgKi8KKwlfX3UzMglsZXZlbDsJCS8qIGNsYXNzIGxldmVsIGluIGhpZXJhcmNoeSAqLworfTsKKworZW51bSB7CisJVENBX0hGU0NfVU5TUEVDLAorCVRDQV9IRlNDX1JTQywKKwlUQ0FfSEZTQ19GU0MsCisJVENBX0hGU0NfVVNDLAorCV9fVENBX0hGU0NfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfSEZTQ19NQVggKF9fVENBX0hGU0NfTUFYIC0gMSkKKworCisvKiBDQlEgc2VjdGlvbiAqLworCisjZGVmaW5lIFRDX0NCUV9NQVhQUklPCQk4CisjZGVmaW5lIFRDX0NCUV9NQVhMRVZFTAkJOAorI2RlZmluZSBUQ19DQlFfREVGX0VXTUEJCTUKKworc3RydWN0IHRjX2NicV9sc3NvcHQgeworCXVuc2lnbmVkIGNoYXIJY2hhbmdlOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisjZGVmaW5lIFRDRl9DQlFfTFNTX0JPVU5ERUQJMQorI2RlZmluZSBUQ0ZfQ0JRX0xTU19JU09MQVRFRAkyCisJdW5zaWduZWQgY2hhciAgCWV3bWFfbG9nOworCXVuc2lnbmVkIGNoYXIgIAlsZXZlbDsKKyNkZWZpbmUgVENGX0NCUV9MU1NfRkxBR1MJMQorI2RlZmluZSBUQ0ZfQ0JRX0xTU19FV01BCTIKKyNkZWZpbmUgVENGX0NCUV9MU1NfTUFYSURMRQk0CisjZGVmaW5lIFRDRl9DQlFfTFNTX01JTklETEUJOAorI2RlZmluZSBUQ0ZfQ0JRX0xTU19PRkZUSU1FCTB4MTAKKyNkZWZpbmUgVENGX0NCUV9MU1NfQVZQS1QJMHgyMAorCV9fdTMyCQltYXhpZGxlOworCV9fdTMyCQltaW5pZGxlOworCV9fdTMyCQlvZmZ0aW1lOworCV9fdTMyCQlhdnBrdDsKK307CisKK3N0cnVjdCB0Y19jYnFfd3Jyb3B0IHsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJcHJpb3JpdHk7CisJdW5zaWduZWQgY2hhcgljcHJpb3JpdHk7CisJdW5zaWduZWQgY2hhcglfX3Jlc2VydmVkOworCV9fdTMyCQlhbGxvdDsKKwlfX3UzMgkJd2VpZ2h0OworfTsKKworc3RydWN0IHRjX2NicV9vdmwgeworCXVuc2lnbmVkIGNoYXIJc3RyYXRlZ3k7CisjZGVmaW5lCVRDX0NCUV9PVkxfQ0xBU1NJQwkwCisjZGVmaW5lCVRDX0NCUV9PVkxfREVMQVkJMQorI2RlZmluZQlUQ19DQlFfT1ZMX0xPV1BSSU8JMgorI2RlZmluZQlUQ19DQlFfT1ZMX0RST1AJCTMKKyNkZWZpbmUJVENfQ0JRX09WTF9SQ0xBU1NJQwk0CisJdW5zaWduZWQgY2hhcglwcmlvcml0eTI7CisJX191MTYJCXBhZDsKKwlfX3UzMgkJcGVuYWx0eTsKK307CisKK3N0cnVjdCB0Y19jYnFfcG9saWNlIHsKKwl1bnNpZ25lZCBjaGFyCXBvbGljZTsKKwl1bnNpZ25lZCBjaGFyCV9fcmVzMTsKKwl1bnNpZ25lZCBzaG9ydAlfX3JlczI7Cit9OworCitzdHJ1Y3QgdGNfY2JxX2ZvcHQgeworCV9fdTMyCQlzcGxpdDsKKwlfX3UzMgkJZGVmbWFwOworCV9fdTMyCQlkZWZjaGFuZ2U7Cit9OworCitzdHJ1Y3QgdGNfY2JxX3hzdGF0cyB7CisJX191MzIJCWJvcnJvd3M7CisJX191MzIJCW92ZXJhY3Rpb25zOworCV9fczMyCQlhdmdpZGxlOworCV9fczMyCQl1bmRlcnRpbWU7Cit9OworCitlbnVtIHsKKwlUQ0FfQ0JRX1VOU1BFQywKKwlUQ0FfQ0JRX0xTU09QVCwKKwlUQ0FfQ0JRX1dSUk9QVCwKKwlUQ0FfQ0JRX0ZPUFQsCisJVENBX0NCUV9PVkxfU1RSQVRFR1ksCisJVENBX0NCUV9SQVRFLAorCVRDQV9DQlFfUlRBQiwKKwlUQ0FfQ0JRX1BPTElDRSwKKwlfX1RDQV9DQlFfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfQ0JRX01BWAkoX19UQ0FfQ0JRX01BWCAtIDEpCisKKy8qIGRzbWFyayBzZWN0aW9uICovCisKK2VudW0geworCVRDQV9EU01BUktfVU5TUEVDLAorCVRDQV9EU01BUktfSU5ESUNFUywKKwlUQ0FfRFNNQVJLX0RFRkFVTFRfSU5ERVgsCisJVENBX0RTTUFSS19TRVRfVENfSU5ERVgsCisJVENBX0RTTUFSS19NQVNLLAorCVRDQV9EU01BUktfVkFMVUUsCisJX19UQ0FfRFNNQVJLX01BWCwKK307CisKKyNkZWZpbmUgVENBX0RTTUFSS19NQVggKF9fVENBX0RTTUFSS19NQVggLSAxKQorCisvKiBBVE0gIHNlY3Rpb24gKi8KKworZW51bSB7CisJVENBX0FUTV9VTlNQRUMsCisJVENBX0FUTV9GRCwJCS8qIGZpbGUvc29ja2V0IGRlc2NyaXB0b3IgKi8KKwlUQ0FfQVRNX1BUUiwJCS8qIHBvaW50ZXIgdG8gZGVzY3JpcHRvciAtIGxhdGVyICovCisJVENBX0FUTV9IRFIsCQkvKiBMTCBoZWFkZXIgKi8KKwlUQ0FfQVRNX0VYQ0VTUywJCS8qIGV4Y2VzcyB0cmFmZmljIGNsYXNzICgwIGZvciBDTFApICAqLworCVRDQV9BVE1fQUREUiwJCS8qIFBWQyBhZGRyZXNzIChmb3Igb3V0cHV0IG9ubHkpICovCisJVENBX0FUTV9TVEFURSwJCS8qIFZDIHN0YXRlIChBVE1fVlNfKjsgZm9yIG91dHB1dCBvbmx5KSAqLworCV9fVENBX0FUTV9NQVgsCit9OworCisjZGVmaW5lIFRDQV9BVE1fTUFYCShfX1RDQV9BVE1fTUFYIC0gMSkKKworLyogTmV0d29yayBlbXVsYXRvciAqLworCitlbnVtIHsKKwlUQ0FfTkVURU1fVU5TUEVDLAorCVRDQV9ORVRFTV9DT1JSLAorCVRDQV9ORVRFTV9ERUxBWV9ESVNULAorCVRDQV9ORVRFTV9SRU9SREVSLAorCVRDQV9ORVRFTV9DT1JSVVBULAorCVRDQV9ORVRFTV9MT1NTLAorCV9fVENBX05FVEVNX01BWCwKK307CisKKyNkZWZpbmUgVENBX05FVEVNX01BWCAoX19UQ0FfTkVURU1fTUFYIC0gMSkKKworc3RydWN0IHRjX25ldGVtX3FvcHQgeworCV9fdTMyCWxhdGVuY3k7CS8qIGFkZGVkIGRlbGF5ICh1cykgKi8KKwlfX3UzMiAgIGxpbWl0OwkJLyogZmlmbyBsaW1pdCAocGFja2V0cykgKi8KKwlfX3UzMglsb3NzOwkJLyogcmFuZG9tIHBhY2tldCBsb3NzICgwPW5vbmUgfjA9MTAwJSkgKi8KKwlfX3UzMglnYXA7CQkvKiByZS1vcmRlcmluZyBnYXAgKDAgZm9yIG5vbmUpICovCisJX191MzIgICBkdXBsaWNhdGU7CS8qIHJhbmRvbSBwYWNrZXQgZHVwICAoMD1ub25lIH4wPTEwMCUpICovCisJX191MzIJaml0dGVyOwkJLyogcmFuZG9tIGppdHRlciBpbiBsYXRlbmN5ICh1cykgKi8KK307CisKK3N0cnVjdCB0Y19uZXRlbV9jb3JyIHsKKwlfX3UzMglkZWxheV9jb3JyOwkvKiBkZWxheSBjb3JyZWxhdGlvbiAqLworCV9fdTMyCWxvc3NfY29ycjsJLyogcGFja2V0IGxvc3MgY29ycmVsYXRpb24gKi8KKwlfX3UzMglkdXBfY29ycjsJLyogZHVwbGljYXRlIGNvcnJlbGF0aW9uICAqLworfTsKKworc3RydWN0IHRjX25ldGVtX3Jlb3JkZXIgeworCV9fdTMyCXByb2JhYmlsaXR5OworCV9fdTMyCWNvcnJlbGF0aW9uOworfTsKKworc3RydWN0IHRjX25ldGVtX2NvcnJ1cHQgeworCV9fdTMyCXByb2JhYmlsaXR5OworCV9fdTMyCWNvcnJlbGF0aW9uOworfTsKKworZW51bSB7CisJTkVURU1fTE9TU19VTlNQRUMsCisJTkVURU1fTE9TU19HSSwJCS8qIEdlbmVyYWwgSW50dWl0aXZlIC0gNCBzdGF0ZSBtb2RlbCAqLworCU5FVEVNX0xPU1NfR0UsCQkvKiBHaWxiZXJ0IEVsbGlvdCBtb2RlbHMgKi8KKwlfX05FVEVNX0xPU1NfTUFYCit9OworI2RlZmluZSBORVRFTV9MT1NTX01BWCAoX19ORVRFTV9MT1NTX01BWCAtIDEpCisKKy8qIFN0YXRlIHRyYW5zaXRpb24gcHJvYmFiaWxpdGllcyBmb3IgNCBzdGF0ZSBtb2RlbCAqLworc3RydWN0IHRjX25ldGVtX2dpbW9kZWwgeworCV9fdTMyCXAxMzsKKwlfX3UzMglwMzE7CisJX191MzIJcDMyOworCV9fdTMyCXAxNDsKKwlfX3UzMglwMjM7Cit9OworCisvKiBHaWxiZXJ0LUVsbGlvdCBtb2RlbHMgKi8KK3N0cnVjdCB0Y19uZXRlbV9nZW1vZGVsIHsKKwlfX3UzMiBwOworCV9fdTMyIHI7CisJX191MzIgaDsKKwlfX3UzMiBrMTsKK307CisKKyNkZWZpbmUgTkVURU1fRElTVF9TQ0FMRQk4MTkyCisjZGVmaW5lIE5FVEVNX0RJU1RfTUFYCQkxNjM4NAorCisvKiBEUlIgKi8KKworZW51bSB7CisJVENBX0RSUl9VTlNQRUMsCisJVENBX0RSUl9RVUFOVFVNLAorCV9fVENBX0RSUl9NQVgKK307CisKKyNkZWZpbmUgVENBX0RSUl9NQVgJKF9fVENBX0RSUl9NQVggLSAxKQorCitzdHJ1Y3QgdGNfZHJyX3N0YXRzIHsKKwlfX3UzMglkZWZpY2l0OworfTsKKworLyogTVFQUklPICovCisjZGVmaW5lIFRDX1FPUFRfQklUTUFTSyAxNQorI2RlZmluZSBUQ19RT1BUX01BWF9RVUVVRSAxNgorCitzdHJ1Y3QgdGNfbXFwcmlvX3FvcHQgeworCV9fdTgJbnVtX3RjOworCV9fdTgJcHJpb190Y19tYXBbVENfUU9QVF9CSVRNQVNLICsgMV07CisJX191OAlodzsKKwlfX3UxNgljb3VudFtUQ19RT1BUX01BWF9RVUVVRV07CisJX191MTYJb2Zmc2V0W1RDX1FPUFRfTUFYX1FVRVVFXTsKK307CisKKy8qIFNGQiAqLworCitlbnVtIHsKKwlUQ0FfU0ZCX1VOU1BFQywKKwlUQ0FfU0ZCX1BBUk1TLAorCV9fVENBX1NGQl9NQVgsCit9OworCisjZGVmaW5lIFRDQV9TRkJfTUFYIChfX1RDQV9TRkJfTUFYIC0gMSkKKworLyoKKyAqIE5vdGU6IGluY3JlbWVudCwgZGVjcmVtZW50IGFyZSBRMC4xNiBmaXhlZC1wb2ludCB2YWx1ZXMuCisgKi8KK3N0cnVjdCB0Y19zZmJfcW9wdCB7CisJX191MzIgcmVoYXNoX2ludGVydmFsOwkvKiBkZWxheSBiZXR3ZWVuIGhhc2ggbW92ZSwgaW4gbXMgKi8KKwlfX3UzMiB3YXJtdXBfdGltZTsJLyogZG91YmxlIGJ1ZmZlcmluZyB3YXJtdXAgdGltZSBpbiBtcyAod2FybXVwX3RpbWUgPCByZWhhc2hfaW50ZXJ2YWwpICovCisJX191MzIgbWF4OwkJLyogbWF4IGxlbiBvZiBxbGVuX21pbiAqLworCV9fdTMyIGJpbl9zaXplOwkJLyogbWF4aW11bSBxdWV1ZSBsZW5ndGggcGVyIGJpbiAqLworCV9fdTMyIGluY3JlbWVudDsJLyogcHJvYmFiaWxpdHkgaW5jcmVtZW50LCAoZDEgaW4gQmx1ZSkgKi8KKwlfX3UzMiBkZWNyZW1lbnQ7CS8qIHByb2JhYmlsaXR5IGRlY3JlbWVudCwgKGQyIGluIEJsdWUpICovCisJX191MzIgbGltaXQ7CQkvKiBtYXggU0ZCIHF1ZXVlIGxlbmd0aCAqLworCV9fdTMyIHBlbmFsdHlfcmF0ZTsJLyogaW5lbGFzdGljIGZsb3dzIGFyZSByYXRlIGxpbWl0ZWQgdG8gJ3JhdGUnIHBwcyAqLworCV9fdTMyIHBlbmFsdHlfYnVyc3Q7Cit9OworCitzdHJ1Y3QgdGNfc2ZiX3hzdGF0cyB7CisJX191MzIgZWFybHlkcm9wOworCV9fdTMyIHBlbmFsdHlkcm9wOworCV9fdTMyIGJ1Y2tldGRyb3A7CisJX191MzIgcXVldWVkcm9wOworCV9fdTMyIGNoaWxkZHJvcDsgLyogZHJvcHMgaW4gY2hpbGQgcWRpc2MgKi8KKwlfX3UzMiBtYXJrZWQ7CisJX191MzIgbWF4cWxlbjsKKwlfX3UzMiBtYXhwcm9iOworCV9fdTMyIGF2Z3Byb2I7Cit9OworCisjZGVmaW5lIFNGQl9NQVhfUFJPQiAweEZGRkYKKworLyogUUZRICovCitlbnVtIHsKKwlUQ0FfUUZRX1VOU1BFQywKKwlUQ0FfUUZRX1dFSUdIVCwKKwlUQ0FfUUZRX0xNQVgsCisJX19UQ0FfUUZRX01BWAorfTsKKworI2RlZmluZSBUQ0FfUUZRX01BWAkoX19UQ0FfUUZRX01BWCAtIDEpCisKK3N0cnVjdCB0Y19xZnFfc3RhdHMgeworCV9fdTMyIHdlaWdodDsKKwlfX3UzMiBsbWF4OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BrdGNkdmQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGt0Y2R2ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzFlYjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BrdGNkdmQuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUGV0ZXIgT3N0ZXJsdW5kIDxwZXRlcm8yQHRlbGlhLmNvbT4KKyAqCisgKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogUGFja2V0IHdyaXRpbmcgbGF5ZXIgZm9yIEFUQVBJIGFuZCBTQ1NJIENELVIsIENELVJXLCBEVkQtUiwgYW5kCisgKiBEVkQtUlcgZGV2aWNlcy4KKyAqCisgKi8KKyNpZm5kZWYgX19QS1RDRFZEX0gKKyNkZWZpbmUgX19QS1RDRFZEX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiAxIGZvciBub3JtYWwgZGVidWcgbWVzc2FnZXMsIDIgaXMgdmVyeSB2ZXJib3NlLiAwIHRvIHR1cm4gaXQgb2ZmLgorICovCisjZGVmaW5lIFBBQ0tFVF9ERUJVRwkJMQorCisjZGVmaW5lCU1BWF9XUklURVJTCQk4CisKKyNkZWZpbmUgUEtUX1JCX1BPT0xfU0laRQk1MTIKKworLyoKKyAqIEhvdyBsb25nIHdlIHNob3VsZCBob2xkIGEgbm9uLWZ1bGwgcGFja2V0IGJlZm9yZSBzdGFydGluZyBkYXRhIGdhdGhlcmluZy4KKyAqLworI2RlZmluZSBQQUNLRVRfV0FJVF9USU1FCShIWiAqIDUgLyAxMDAwKQorCisvKgorICogdXNlIGRyaXZlIHdyaXRlIGNhY2hpbmcgLS0gd2UgbmVlZCBkZWZlcnJlZCBlcnJvciBoYW5kbGluZyB0byBiZQorICogYWJsZSB0byBzdWNjZXNzZnVsbHkgcmVjb3ZlciB3aXRoIHRoaXMgb3B0aW9uIChkcml2ZSB3aWxsIHJldHVybiBnb29kCisgKiBzdGF0dXMgYXMgc29vbiBhcyB0aGUgY2RiIGlzIHZhbGlkYXRlZCkuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DRFJPTV9QS1RDRFZEX1dDQUNIRSkKKyNkZWZpbmUgVVNFX1dDQUNISU5HCQkxCisjZWxzZQorI2RlZmluZSBVU0VfV0NBQ0hJTkcJCTAKKyNlbmRpZgorCisvKgorICogTm8gdXNlci1zZXJ2aWNhYmxlIHBhcnRzIGJleW9uZCB0aGlzIHBvaW50IC0+CisgKi8KKworLyoKKyAqIGRldmljZSB0eXBlcworICovCisjZGVmaW5lIFBBQ0tFVF9DRFIJCTEKKyNkZWZpbmUJUEFDS0VUX0NEUlcJCTIKKyNkZWZpbmUgUEFDS0VUX0RWRFIJCTMKKyNkZWZpbmUgUEFDS0VUX0RWRFJXCQk0CisKKy8qCisgKiBmbGFncworICovCisjZGVmaW5lIFBBQ0tFVF9XUklUQUJMRQkJMQkvKiBwZCBpcyB3cml0YWJsZSAqLworI2RlZmluZSBQQUNLRVRfTldBX1ZBTElECTIJLyogbmV4dCB3cml0YWJsZSBhZGRyZXNzIHZhbGlkICovCisjZGVmaW5lIFBBQ0tFVF9MUkFfVkFMSUQJMwkvKiBsYXN0IHJlY29yZGVkIGFkZHJlc3MgdmFsaWQgKi8KKyNkZWZpbmUgUEFDS0VUX01FUkdFX1NFR1MJNAkvKiBwZXJmb3JtIHNlZ21lbnQgbWVyZ2luZyB0byBrZWVwICovCisJCQkJCS8qIHVuZGVybHlpbmcgY2Ryb20gZGV2aWNlIGhhcHB5ICovCisKKy8qCisgKiBEaXNjIHN0YXR1cyAtLSBmcm9tIFJFQURfRElTQ19JTkZPCisgKi8KKyNkZWZpbmUgUEFDS0VUX0RJU0NfRU1QVFkJMAorI2RlZmluZSBQQUNLRVRfRElTQ19JTkNPTVBMRVRFCTEKKyNkZWZpbmUgUEFDS0VUX0RJU0NfQ09NUExFVEUJMgorI2RlZmluZSBQQUNLRVRfRElTQ19PVEhFUgkzCisKKy8qCisgKiB3cml0ZSB0eXBlLCBhbmQgY29ycmVzcG9uZGluZyBkYXRhIGJsb2NrIHR5cGUKKyAqLworI2RlZmluZSBQQUNLRVRfTU9ERTEJCTEKKyNkZWZpbmUgUEFDS0VUX01PREUyCQkyCisjZGVmaW5lIFBBQ0tFVF9CTE9DS19NT0RFMQk4CisjZGVmaW5lIFBBQ0tFVF9CTE9DS19NT0RFMgkxMAorCisvKgorICogTGFzdCBzZXNzaW9uL2JvcmRlciBzdGF0dXMKKyAqLworI2RlZmluZSBQQUNLRVRfU0VTU0lPTl9FTVBUWQkJMAorI2RlZmluZSBQQUNLRVRfU0VTU0lPTl9JTkNPTVBMRVRFCTEKKyNkZWZpbmUgUEFDS0VUX1NFU1NJT05fUkVTRVJWRUQJCTIKKyNkZWZpbmUgUEFDS0VUX1NFU1NJT05fQ09NUExFVEUJCTMKKworI2RlZmluZSBQQUNLRVRfTUNOCQkJIjRhNjU2ZTczNDE3ODYyNmY2NTMyMzAzMDMwMDAwMCIKKworI3VuZGVmIFBBQ0tFVF9VU0VfTFMKKworI2RlZmluZSBQS1RfQ1RSTF9DTURfU0VUVVAJMAorI2RlZmluZSBQS1RfQ1RSTF9DTURfVEVBUkRPV04JMQorI2RlZmluZSBQS1RfQ1RSTF9DTURfU1RBVFVTCTIKKworc3RydWN0IHBrdF9jdHJsX2NvbW1hbmQgeworCV9fdTMyIGNvbW1hbmQ7CQkJCS8qIGluOiBTZXR1cCwgdGVhcmRvd24sIHN0YXR1cyAqLworCV9fdTMyIGRldl9pbmRleDsJCQkvKiBpbi9vdXQ6IERldmljZSBpbmRleCAqLworCV9fdTMyIGRldjsJCQkJLyogaW4vb3V0OiBEZXZpY2UgbnIgZm9yIGNkcncgZGV2aWNlICovCisJX191MzIgcGt0X2RldjsJCQkJLyogaW4vb3V0OiBEZXZpY2UgbnIgZm9yIHBhY2tldCBkZXZpY2UgKi8KKwlfX3UzMiBudW1fZGV2aWNlczsJCQkvKiBvdXQ6IExhcmdlc3QgZGV2aWNlIGluZGV4ICsgMSAqLworCV9fdTMyIHBhZGRpbmc7CQkJCS8qIE5vdCB1c2VkICovCit9OworCisvKgorICogcGFja2V0IGlvY3RscworICovCisjZGVmaW5lIFBBQ0tFVF9JT0NUTF9NQUdJQwkoJ1gnKQorI2RlZmluZSBQQUNLRVRfQ1RSTF9DTUQJCV9JT1dSKFBBQ0tFVF9JT0NUTF9NQUdJQywgMSwgc3RydWN0IHBrdF9jdHJsX2NvbW1hbmQpCisKKworI2VuZGlmIC8qIF9fUEtUQ0RWRF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BtdS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTc3Mzk5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wbXUuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciB0YWxraW5nIHRvIHRoZSBQTVUuICBUaGUgUE1VIGlzIGEgbWljcm9jb250cm9sbGVyCisgKiB3aGljaCBjb250cm9scyBiYXR0ZXJ5IGNoYXJnaW5nIGFuZCBzeXN0ZW0gcG93ZXIgb24gUG93ZXJCb29rIDM0MDAKKyAqIGFuZCAyNDAwIG1vZGVscyBhcyB3ZWxsIGFzIHRoZSBSVEMgYW5kIHZhcmlvdXMgb3RoZXIgdGhpbmdzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBQYXVsIE1hY2tlcnJhcy4KKyAqLworCisKKyNkZWZpbmUgUE1VX0RSSVZFUl9WRVJTSU9OCTIKKworLyoKKyAqIFBNVSBjb21tYW5kcworICovCisjZGVmaW5lIFBNVV9QT1dFUl9DVFJMMAkJMHgxMAkvKiBjb250cm9sIHBvd2VyIG9mIHNvbWUgZGV2aWNlcyAqLworI2RlZmluZSBQTVVfUE9XRVJfQ1RSTAkJMHgxMQkvKiBjb250cm9sIHBvd2VyIG9mIHNvbWUgZGV2aWNlcyAqLworI2RlZmluZSBQTVVfQURCX0NNRAkJMHgyMAkvKiBzZW5kIEFEQiBwYWNrZXQgKi8KKyNkZWZpbmUgUE1VX0FEQl9QT0xMX09GRgkweDIxCS8qIGRpc2FibGUgQURCIGF1dG8tcG9sbCAqLworI2RlZmluZSBQTVVfV1JJVEVfTlZSQU0JCTB4MzMJLyogd3JpdGUgbm9uLXZvbGF0aWxlIFJBTSAqLworI2RlZmluZSBQTVVfUkVBRF9OVlJBTQkJMHgzYgkvKiByZWFkIG5vbi12b2xhdGlsZSBSQU0gKi8KKyNkZWZpbmUgUE1VX1NFVF9SVEMJCTB4MzAJLyogc2V0IHJlYWwtdGltZSBjbG9jayAqLworI2RlZmluZSBQTVVfUkVBRF9SVEMJCTB4MzgJLyogcmVhZCByZWFsLXRpbWUgY2xvY2sgKi8KKyNkZWZpbmUgUE1VX1NFVF9WT0xCVVRUT04JMHg0MAkvKiBzZXQgdm9sdW1lIHVwL2Rvd24gcG9zaXRpb24gKi8KKyNkZWZpbmUgUE1VX0JBQ0tMSUdIVF9CUklHSFQJMHg0MQkvKiBzZXQgYmFja2xpZ2h0IGJyaWdodG5lc3MgKi8KKyNkZWZpbmUgUE1VX0dFVF9WT0xCVVRUT04JMHg0OAkvKiBnZXQgdm9sdW1lIHVwL2Rvd24gcG9zaXRpb24gKi8KKyNkZWZpbmUgUE1VX1BDRUpFQ1QJCTB4NGMJLyogZWplY3QgUEMtY2FyZCBmcm9tIHNsb3QgKi8KKyNkZWZpbmUgUE1VX0JBVFRFUllfU1RBVEUJMHg2YgkvKiByZXBvcnQgYmF0dGVyeSBzdGF0ZSBldGMuICovCisjZGVmaW5lIFBNVV9TTUFSVF9CQVRURVJZX1NUQVRFCTB4NmYJLyogcmVwb3J0IGJhdHRlcnkgc3RhdGUgKG5ldyB3YXkpICovCisjZGVmaW5lIFBNVV9TRVRfSU5UUl9NQVNLCTB4NzAJLyogc2V0IFBNVSBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSBQTVVfSU5UX0FDSwkJMHg3OAkvKiByZWFkIGludGVycnVwdCBiaXRzICovCisjZGVmaW5lIFBNVV9TSFVURE9XTgkJMHg3ZQkvKiB0dXJuIHBvd2VyIG9mZiAqLworI2RlZmluZSBQTVVfQ1BVX1NQRUVECQkweDdkCS8qIGNvbnRyb2wgQ1BVIHNwZWVkIG9uIHNvbWUgbW9kZWxzICovCisjZGVmaW5lIFBNVV9TTEVFUAkJMHg3ZgkvKiBwdXQgQ1BVIHRvIHNsZWVwICovCisjZGVmaW5lIFBNVV9QT1dFUl9FVkVOVFMJMHg4ZgkvKiBTZW5kIHBvd2VyLWV2ZW50IGNvbW1hbmRzIHRvIFBNVSAqLworI2RlZmluZSBQTVVfSTJDX0NNRAkJMHg5YQkvKiBJMkMgb3BlcmF0aW9ucyAqLworI2RlZmluZSBQTVVfUkVTRVQJCTB4ZDAJLyogcmVzZXQgQ1BVICovCisjZGVmaW5lIFBNVV9HRVRfQlJJR0hUQlVUVE9OCTB4ZDkJLyogcmVwb3J0IGJyaWdodG5lc3MgdXAvZG93biBwb3MgKi8KKyNkZWZpbmUgUE1VX0dFVF9DT1ZFUgkJMHhkYwkvKiByZXBvcnQgY292ZXIgb3Blbi9jbG9zZWQgKi8KKyNkZWZpbmUgUE1VX1NZU1RFTV9SRUFEWQkweGRmCS8qIHRlbGwgUE1VIHdlIGFyZSBhd2FrZSAqLworI2RlZmluZSBQTVVfR0VUX1ZFUlNJT04JCTB4ZWEJLyogcmVhZCB0aGUgUE1VIHZlcnNpb24gKi8KKworLyogQml0cyB0byB1c2Ugd2l0aCB0aGUgUE1VX1BPV0VSX0NUUkwwIGNvbW1hbmQgKi8KKyNkZWZpbmUgUE1VX1BPVzBfT04JCTB4ODAJLyogT1IgdGhpcyB0byBwb3dlciBPTiB0aGUgZGV2aWNlICovCisjZGVmaW5lIFBNVV9QT1cwX09GRgkJMHgwMAkvKiBsZWF2ZSBiaXQgNyB0byAwIHRvIHBvd2VyIGl0IE9GRiAqLworI2RlZmluZSBQTVVfUE9XMF9IQVJEX0RSSVZFCTB4MDQJLyogSGFyZCBkcml2ZSBwb3dlciAob24gd2FsbHN0cmVldC9sb21iYXJkID8pICovCisKKy8qIEJpdHMgdG8gdXNlIHdpdGggdGhlIFBNVV9QT1dFUl9DVFJMIGNvbW1hbmQgKi8KKyNkZWZpbmUgUE1VX1BPV19PTgkJMHg4MAkvKiBPUiB0aGlzIHRvIHBvd2VyIE9OIHRoZSBkZXZpY2UgKi8KKyNkZWZpbmUgUE1VX1BPV19PRkYJCTB4MDAJLyogbGVhdmUgYml0IDcgdG8gMCB0byBwb3dlciBpdCBPRkYgKi8KKyNkZWZpbmUgUE1VX1BPV19CQUNLTElHSFQJMHgwMQkvKiBiYWNrbGlnaHQgcG93ZXIgKi8KKyNkZWZpbmUgUE1VX1BPV19DSEFSR0VSCQkweDAyCS8qIGJhdHRlcnkgY2hhcmdlciBwb3dlciAqLworI2RlZmluZSBQTVVfUE9XX0lSTEVECQkweDA0CS8qIElSIGxlZCBwb3dlciAob24gd2FsbHN0cmVldCkgKi8KKyNkZWZpbmUgUE1VX1BPV19NRURJQUJBWQkweDA4CS8qIG1lZGlhIGJheSBwb3dlciAod2FsbHN0cmVldC9sb21iYXJkID8pICovCisKKy8qIEJpdHMgaW4gUE1VIGludGVycnVwdCBhbmQgaW50ZXJydXB0IG1hc2sgYnl0ZXMgKi8KKyNkZWZpbmUgUE1VX0lOVF9QQ0VKRUNUCQkweDA0CS8qIFBDLWNhcmQgZWplY3QgYnV0dG9ucyAqLworI2RlZmluZSBQTVVfSU5UX1NOREJSVAkJMHgwOAkvKiBzb3VuZC9icmlnaHRuZXNzIHVwL2Rvd24gYnV0dG9ucyAqLworI2RlZmluZSBQTVVfSU5UX0FEQgkJMHgxMAkvKiBBREIgYXV0b3BvbGwgb3IgcmVwbHkgZGF0YSAqLworI2RlZmluZSBQTVVfSU5UX0JBVFRFUlkJCTB4MjAJLyogQmF0dGVyeSBzdGF0ZSBjaGFuZ2UgKi8KKyNkZWZpbmUgUE1VX0lOVF9FTlZJUk9OTUVOVAkweDQwCS8qIEVudmlyb25tZW50IGludGVycnVwdHMgKi8KKyNkZWZpbmUgUE1VX0lOVF9USUNLCQkweDgwCS8qIDEtc2Vjb25kIHRpY2sgaW50ZXJydXB0ICovCisKKy8qIE90aGVyIGJpdHMgaW4gUE1VIGludGVycnVwdCB2YWxpZCB3aGVuIFBNVV9JTlRfQURCIGlzIHNldCAqLworI2RlZmluZSBQTVVfSU5UX0FEQl9BVVRPCTB4MDQJLyogQURCIGF1dG9wb2xsLCB3aGVuIFBNVV9JTlRfQURCICovCisjZGVmaW5lIFBNVV9JTlRfV0FJVElOR19DSEFSR0VSCTB4MDEJLyogPz8/ICovCisjZGVmaW5lIFBNVV9JTlRfQVVUT19TUlFfUE9MTAkweDAyCS8qID8/PyAqLworCisvKiBCaXRzIGluIHRoZSBlbnZpcm9uZW1lbnQgbWVzc2FnZSAoZWl0aGVyIG9idGFpbmVkIHZpYSBQTVVfR0VUX0NPVkVSLAorICogb3IgdmlhIFBNVV9JTlRfRU5WSVJPTk1FTlQgb24gY29yZTk5ICovCisjZGVmaW5lIFBNVV9FTlZfTElEX0NMT1NFRAkweDAxCS8qIFRoZSBsaWQgaXMgY2xvc2VkICovCisKKy8qIEkyQyByZWxhdGVkIGRlZmluaXRpb25zICovCisjZGVmaW5lIFBNVV9JMkNfTU9ERV9TSU1QTEUJMAorI2RlZmluZSBQTVVfSTJDX01PREVfU1REU1VCCTEKKyNkZWZpbmUgUE1VX0kyQ19NT0RFX0NPTUJJTkVECTIKKworI2RlZmluZSBQTVVfSTJDX0JVU19TVEFUVVMJMAorI2RlZmluZSBQTVVfSTJDX0JVU19TWVNDTEsJMQorI2RlZmluZSBQTVVfSTJDX0JVU19QT1dFUgkyCisKKyNkZWZpbmUgUE1VX0kyQ19TVEFUVVNfT0sJMAorI2RlZmluZSBQTVVfSTJDX1NUQVRVU19EQVRBUkVBRAkxCisjZGVmaW5lIFBNVV9JMkNfU1RBVFVTX0JVU1kJMHhmZQorCisKKy8qIEtpbmQgb2YgUE1VIChtb2RlbCkgKi8KK2VudW0geworCVBNVV9VTktOT1dOLAorCVBNVV9PSEFSRV9CQVNFRCwJLyogMjQwMCwgMzQwMCwgMzUwMCAob2xkIEczIHBvd2VyYm9vaykgKi8KKwlQTVVfSEVBVEhST1dfQkFTRUQsCS8qIFBvd2VyQm9vayBHMyBzZXJpZXMgKi8KKwlQTVVfUEFERElOR1RPTl9CQVNFRCwJLyogMTk5OSBQb3dlckJvb2sgRzMgKi8KKwlQTVVfS0VZTEFSR09fQkFTRUQsCS8qIENvcmU5OSBtb3RoZXJib2FyZCAoUE1VOTkpICovCisJUE1VXzY4S19WMSwJCS8qIDY4SyBQTVUsIHZlcnNpb24gMSAqLworCVBNVV82OEtfVjIsIAkJLyogNjhLIFBNVSwgdmVyc2lvbiAyICovCit9OworCisvKiBQTVUgUE1VX1BPV0VSX0VWRU5UUyBjb21tYW5kcyAqLworZW51bSB7CisJUE1VX1BXUl9HRVRfUE9XRVJVUF9FVkVOVFMJPSAweDAwLAorCVBNVV9QV1JfU0VUX1BPV0VSVVBfRVZFTlRTCT0gMHgwMSwKKwlQTVVfUFdSX0NMUl9QT1dFUlVQX0VWRU5UUwk9IDB4MDIsCisJUE1VX1BXUl9HRVRfV0FLRVVQX0VWRU5UUwk9IDB4MDMsCisJUE1VX1BXUl9TRVRfV0FLRVVQX0VWRU5UUwk9IDB4MDQsCisJUE1VX1BXUl9DTFJfV0FLRVVQX0VWRU5UUwk9IDB4MDUsCit9OworCisvKiBQb3dlciBldmVudHMgd2FrZXVwIGJpdHMgKi8KK2VudW0geworCVBNVV9QV1JfV0FLRVVQX0tFWQkJPSAweDAxLAkvKiBXYWtlIG9uIGtleSBwcmVzcyAqLworCVBNVV9QV1JfV0FLRVVQX0FDX0lOU0VSVAk9IDB4MDIsIC8qIFdha2Ugb24gQUMgYWRhcHRlciBwbHVnICovCisJUE1VX1BXUl9XQUtFVVBfQUNfQ0hBTkdFCT0gMHgwNCwKKwlQTVVfUFdSX1dBS0VVUF9MSURfT1BFTgkJPSAweDA4LAorCVBNVV9QV1JfV0FLRVVQX1JJTkcJCT0gMHgxMCwKK307CisJCisvKgorICogSW9jdGwgY29tbWFuZHMgZm9yIHRoZSAvZGV2L3BtdSBkZXZpY2UKKyAqLworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKy8qIG5vIHBhcmFtICovCisjZGVmaW5lIFBNVV9JT0NfU0xFRVAJCV9JTygnQicsIDApCisvKiBvdXQgcGFyYW06IHUzMioJYmFja2xpZ2h0IHZhbHVlOiAwIHRvIDE1ICovCisjZGVmaW5lIFBNVV9JT0NfR0VUX0JBQ0tMSUdIVAlfSU9SKCdCJywgMSwgc2l6ZV90KQorLyogaW4gcGFyYW06IHUzMgliYWNrbGlnaHQgdmFsdWU6IDAgdG8gMTUgKi8KKyNkZWZpbmUgUE1VX0lPQ19TRVRfQkFDS0xJR0hUCV9JT1coJ0InLCAyLCBzaXplX3QpCisvKiBvdXQgcGFyYW06IHUzMioJUE1VIG1vZGVsICovCisjZGVmaW5lIFBNVV9JT0NfR0VUX01PREVMCV9JT1IoJ0InLCAzLCBzaXplX3QpCisvKiBvdXQgcGFyYW06IHUzMioJaGFzX2FkYjogMCBvciAxICovCisjZGVmaW5lIFBNVV9JT0NfSEFTX0FEQgkJX0lPUignQicsIDQsIHNpemVfdCkgCisvKiBvdXQgcGFyYW06IHUzMioJY2FuX3NsZWVwOiAwIG9yIDEgKi8KKyNkZWZpbmUgUE1VX0lPQ19DQU5fU0xFRVAJX0lPUignQicsIDUsIHNpemVfdCkgCisvKiBubyBwYXJhbSwgYnV0IGhpc3RvcmljYWxseSB3YXMgX0lPUignQicsIDYsIDApLCBtZWFuaW5nIDQgYnl0ZXMgKi8KKyNkZWZpbmUgUE1VX0lPQ19HUkFCX0JBQ0tMSUdIVAlfSU9SKCdCJywgNiwgc2l6ZV90KSAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wb2xsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjFiMzA1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wb2xsLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9MSU5VWF9QT0xMX0gKKyNkZWZpbmUgX0xJTlVYX1BPTExfSAorCisjaW5jbHVkZSA8YXNtL3BvbGwuaD4KKworCisjZW5kaWYgLyogX0xJTlVYX1BPTExfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNGM5OGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Bvc2l4X3R5cGVzLmgKQEAgLTAsMCArMSw0OSBAQAorI2lmbmRlZiBfTElOVVhfUE9TSVhfVFlQRVNfSAorI2RlZmluZSBfTElOVVhfUE9TSVhfVFlQRVNfSAorCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisKKy8qCisgKiBUaGlzIGFsbG93cyBmb3IgMTAyNCBmaWxlIGRlc2NyaXB0b3JzOiBpZiBOUl9PUEVOIGlzIGV2ZXIgZ3Jvd24KKyAqIGJleW9uZCB0aGF0IHlvdSdsbCBoYXZlIHRvIGNoYW5nZSB0aGlzIHRvby4gQnV0IDEwMjQgZmQncyBzZWVtIHRvIGJlCisgKiBlbm91Z2ggZXZlbiBmb3Igc3VjaCAicmVhbCIgdW5pY2VzIGxpa2UgT1NGLzEsIHNvIGhvcGVmdWxseSB0aGlzIGlzCisgKiBvbmUgbGltaXQgdGhhdCBkb2Vzbid0IGhhdmUgdG8gYmUgY2hhbmdlZCBbYWdhaW5dLgorICoKKyAqIE5vdGUgdGhhdCBQT1NJWCB3YW50cyB0aGUgRkRfQ0xFQVIoZmQsZmRzZXRwKSBkZWZpbmVzIHRvIGJlIGluCisgKiA8c3lzL3RpbWUuaD4gKGFuZCB0aHVzIDxsaW51eC90aW1lLmg+KSAtIGJ1dCB0aGlzIGlzIGEgbW9yZSBsb2dpY2FsCisgKiBwbGFjZSBmb3IgdGhlbS4gU29sdmVkIGJ5IGhhdmluZyBkdW1teSBkZWZpbmVzIGluIDxzeXMvdGltZS5oPi4KKyAqLworCisvKgorICogVGhvc2UgbWFjcm9zIG1heSBoYXZlIGJlZW4gZGVmaW5lZCBpbiA8Z251L3R5cGVzLmg+LiBCdXQgd2UgYWx3YXlzCisgKiB1c2UgdGhlIG9uZXMgaGVyZS4gCisgKi8KKyN1bmRlZiBfX05GREJJVFMKKyNkZWZpbmUgX19ORkRCSVRTCSg4ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCisjdW5kZWYgX19GRF9TRVRTSVpFCisjZGVmaW5lIF9fRkRfU0VUU0laRQkxMDI0CisKKyN1bmRlZiBfX0ZEU0VUX0xPTkdTCisjZGVmaW5lIF9fRkRTRVRfTE9OR1MJKF9fRkRfU0VUU0laRS9fX05GREJJVFMpCisKKyN1bmRlZiBfX0ZERUxUCisjZGVmaW5lCV9fRkRFTFQoZCkJKChkKSAvIF9fTkZEQklUUykKKworI3VuZGVmIF9fRkRNQVNLCisjZGVmaW5lCV9fRkRNQVNLKGQpCSgxVUwgPDwgKChkKSAlIF9fTkZEQklUUykpCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGZkc19iaXRzIFtfX0ZEU0VUX0xPTkdTXTsKK30gX19rZXJuZWxfZmRfc2V0OworCisvKiBUeXBlIG9mIGEgc2lnbmFsIGhhbmRsZXIuICAqLwordHlwZWRlZiB2b2lkICgqX19rZXJuZWxfc2lnaGFuZGxlcl90KShpbnQpOworCisvKiBUeXBlIG9mIGEgU1lTViBJUEMga2V5LiAgKi8KK3R5cGVkZWYgaW50IF9fa2VybmVsX2tleV90OwordHlwZWRlZiBpbnQgX19rZXJuZWxfbXFkX3Q7CisKKyNpbmNsdWRlIDxhc20vcG9zaXhfdHlwZXMuaD4KKworI2VuZGlmIC8qIF9MSU5VWF9QT1NJWF9UWVBFU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BwZGV2LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BwZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxOGM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHBkZXYuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogbGludXgvaW5jbHVkZS9saW51eC9wcGRldi5oCisgKgorICogVXNlci1zcGFjZSBwYXJhbGxlbCBwb3J0IGRldmljZSBkcml2ZXIgKGhlYWRlciBmaWxlKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtOSBUaW0gV2F1Z2ggPHRpbUBjeWJlcmVsay5kZW1vbi5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEFkZGVkIFBQR0VUVElNRS9QUFNFVFRJTUUsIEZyZWQgQmFybmVzLCAxOTk5CisgKiBBZGRlZCBQUEdFVE1PREVTL1BQR0VUTU9ERS9QUEdFVFBIQVNFLCBGcmVkIEJhcm5lcyA8ZnJtYjJAdWtjLmFjLnVrPiwgMDMvMDEvMjAwMQorICovCisKKyNkZWZpbmUgUFBfSU9DVEwJJ3AnCisKKy8qIFNldCBtb2RlIGZvciByZWFkL3dyaXRlIChlLmcuIElFRUUxMjg0X01PREVfRVBQKSAqLworI2RlZmluZSBQUFNFVE1PREUJX0lPVyhQUF9JT0NUTCwgMHg4MCwgaW50KQorCisvKiBSZWFkIHN0YXR1cyAqLworI2RlZmluZSBQUFJTVEFUVVMJX0lPUihQUF9JT0NUTCwgMHg4MSwgdW5zaWduZWQgY2hhcikKKyNkZWZpbmUgUFBXU1RBVFVTCU9CU09MRVRFX19JT1coUFBfSU9DVEwsIDB4ODIsIHVuc2lnbmVkIGNoYXIpCisKKy8qIFJlYWQvd3JpdGUgY29udHJvbCAqLworI2RlZmluZSBQUFJDT05UUk9MCV9JT1IoUFBfSU9DVEwsIDB4ODMsIHVuc2lnbmVkIGNoYXIpCisjZGVmaW5lIFBQV0NPTlRST0wJX0lPVyhQUF9JT0NUTCwgMHg4NCwgdW5zaWduZWQgY2hhcikKKworc3RydWN0IHBwZGV2X2Zyb2Jfc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIG1hc2s7CisJdW5zaWduZWQgY2hhciB2YWw7Cit9OworI2RlZmluZSBQUEZDT05UUk9MICAgICAgX0lPVyhQUF9JT0NUTCwgMHg4ZSwgc3RydWN0IHBwZGV2X2Zyb2Jfc3RydWN0KQorCisvKiBSZWFkL3dyaXRlIGRhdGEgKi8KKyNkZWZpbmUgUFBSREFUQQkJX0lPUihQUF9JT0NUTCwgMHg4NSwgdW5zaWduZWQgY2hhcikKKyNkZWZpbmUgUFBXREFUQQkJX0lPVyhQUF9JT0NUTCwgMHg4NiwgdW5zaWduZWQgY2hhcikKKworLyogUmVhZC93cml0ZSBlY29udHJvbCAobm90IHVzZWQpICovCisjZGVmaW5lIFBQUkVDT05UUk9MCU9CU09MRVRFX19JT1IoUFBfSU9DVEwsIDB4ODcsIHVuc2lnbmVkIGNoYXIpCisjZGVmaW5lIFBQV0VDT05UUk9MCU9CU09MRVRFX19JT1coUFBfSU9DVEwsIDB4ODgsIHVuc2lnbmVkIGNoYXIpCisKKy8qIFJlYWQvd3JpdGUgRklGTyAobm90IHVzZWQpICovCisjZGVmaW5lIFBQUkZJRk8JCU9CU09MRVRFX19JT1IoUFBfSU9DVEwsIDB4ODksIHVuc2lnbmVkIGNoYXIpCisjZGVmaW5lIFBQV0ZJRk8JCU9CU09MRVRFX19JT1coUFBfSU9DVEwsIDB4OGEsIHVuc2lnbmVkIGNoYXIpCisKKy8qIENsYWltIHRoZSBwb3J0IHRvIHN0YXJ0IHVzaW5nIGl0ICovCisjZGVmaW5lIFBQQ0xBSU0JCV9JTyhQUF9JT0NUTCwgMHg4YikKKworLyogUmVsZWFzZSB0aGUgcG9ydCB3aGVuIHlvdSBhcmVuJ3QgdXNpbmcgaXQgKi8KKyNkZWZpbmUgUFBSRUxFQVNFCV9JTyhQUF9JT0NUTCwgMHg4YykKKworLyogWWllbGQgdGhlIHBvcnQgKHJlbGVhc2UgaXQgaWYgYW5vdGhlciBkcml2ZXIgaXMgd2FpdGluZywKKyAqIHRoZW4gcmVjbGFpbSkgKi8KKyNkZWZpbmUgUFBZSUVMRAkJX0lPKFBQX0lPQ1RMLCAweDhkKQorCisvKiBSZWdpc3RlciBkZXZpY2UgZXhjbHVzaXZlbHkgKG11c3QgYmUgYmVmb3JlIFBQQ0xBSU0pLiAqLworI2RlZmluZSBQUEVYQ0wJCV9JTyhQUF9JT0NUTCwgMHg4ZikKKworLyogRGF0YSBsaW5lIGRpcmVjdGlvbjogbm9uLXplcm8gZm9yIGlucHV0IG1vZGUuICovCisjZGVmaW5lIFBQREFUQURJUglfSU9XKFBQX0lPQ1RMLCAweDkwLCBpbnQpCisKKy8qIE5lZ290aWF0ZSBhIHBhcnRpY3VsYXIgSUVFRSAxMjg0IG1vZGUuICovCisjZGVmaW5lIFBQTkVHT1QJCV9JT1coUFBfSU9DVEwsIDB4OTEsIGludCkKKworLyogU2V0IGNvbnRyb2wgbGluZXMgd2hlbiBhbiBpbnRlcnJ1cHQgb2NjdXJzLiAqLworI2RlZmluZSBQUFdDVExPTklSUQlfSU9XKFBQX0lPQ1RMLCAweDkyLCB1bnNpZ25lZCBjaGFyKQorCisvKiBDbGVhciAoYW5kIHJldHVybikgaW50ZXJydXB0IGNvdW50LiAqLworI2RlZmluZSBQUENMUklSUQlfSU9SKFBQX0lPQ1RMLCAweDkzLCBpbnQpCisKKy8qIFNldCB0aGUgSUVFRSAxMjg0IHBoYXNlIHRoYXQgd2UncmUgaW4gKGUuZy4gSUVFRTEyODRfUEhfRldEX0lETEUpICovCisjZGVmaW5lIFBQU0VUUEhBU0UJX0lPVyhQUF9JT0NUTCwgMHg5NCwgaW50KQorCisvKiBTZXQgYW5kIGdldCBwb3J0IHRpbWVvdXQgKHN0cnVjdCB0aW1ldmFsJ3MpICovCisjZGVmaW5lIFBQR0VUVElNRQlfSU9SKFBQX0lPQ1RMLCAweDk1LCBzdHJ1Y3QgdGltZXZhbCkKKyNkZWZpbmUgUFBTRVRUSU1FCV9JT1coUFBfSU9DVEwsIDB4OTYsIHN0cnVjdCB0aW1ldmFsKQorCisvKiBHZXQgYXZhaWxhYmxlIG1vZGVzICh3aGF0IHRoZSBoYXJkd2FyZSBjYW4gZG8pICovCisjZGVmaW5lIFBQR0VUTU9ERVMJX0lPUihQUF9JT0NUTCwgMHg5NywgdW5zaWduZWQgaW50KQorCisvKiBHZXQgdGhlIGN1cnJlbnQgbW9kZSBhbmQgcGhhemUgKi8KKyNkZWZpbmUgUFBHRVRNT0RFCV9JT1IoUFBfSU9DVEwsIDB4OTgsIGludCkKKyNkZWZpbmUgUFBHRVRQSEFTRQlfSU9SKFBQX0lPQ1RMLCAweDk5LCBpbnQpCisKKy8qIGdldC9zZXQgZmxhZ3MgKi8KKyNkZWZpbmUgUFBHRVRGTEFHUwlfSU9SKFBQX0lPQ1RMLCAweDlhLCBpbnQpCisjZGVmaW5lIFBQU0VURkxBR1MJX0lPVyhQUF9JT0NUTCwgMHg5YiwgaW50KQorCisvKiBmbGFncyB2aXNpYmxlIHRvIHRoZSB3b3JsZCAqLworI2RlZmluZSBQUF9GQVNUV1JJVEUJKDE8PDIpCisjZGVmaW5lIFBQX0ZBU1RSRUFECSgxPDwzKQorI2RlZmluZSBQUF9XOTEyODRQSUMJKDE8PDQpCisKKy8qIG9ubHkgbWFza3MgdXNlci12aXNpYmxlIGZsYWdzICovCisjZGVmaW5lIFBQX0ZMQUdNQVNLCShQUF9GQVNUV1JJVEUgfCBQUF9GQVNUUkVBRCB8IFBQX1c5MTI4NFBJQykKKworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BwcC1jb21wLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BwcC1jb21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0OGQzOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHBwLWNvbXAuaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIHBwcC1jb21wLmggLSBEZWZpbml0aW9ucyBmb3IgZG9pbmcgUFBQIHBhY2tldCBjb21wcmVzc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgVGhlIEF1c3RyYWxpYW4gTmF0aW9uYWwgVW5pdmVyc2l0eS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSwgZXhwcmVzcyBvciBpbXBsaWVkLiBUaGUgQXVzdHJhbGlhbiBOYXRpb25hbCBVbml2ZXJzaXR5CisgKiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZS4KKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEJFIExJQUJMRSBUTyBBTlkKKyAqIFBBUlRZIEZPUiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sIEVWRU4gSUYKKyAqIFRIRSBBVVNUUkFMSUFOIE5BVElPTkFMIFVOSVZFUlNJVFkgSEFWRSBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMKKyAqIE9OIEFOICJBUyBJUyIgQkFTSVMsIEFORCBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEhBUyBOTworICogT0JMSUdBVElPTiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLCBTVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsCisgKiBPUiBNT0RJRklDQVRJT05TLgorICovCisKKy8qCisgKiAgPT1GSUxFVkVSU0lPTiA5ODAzMTk9PQorICoKKyAqICBOT1RFIFRPIE1BSU5UQUlORVJTOgorICogICAgIElmIHlvdSBtb2RpZnkgdGhpcyBmaWxlIGF0IGFsbCwgcGxlYXNlIHNldCB0aGUgYWJvdmUgZGF0ZS4KKyAqICAgICBwcHAtY29tcC5oIGlzIHNoaXBwZWQgd2l0aCBhIFBQUCBkaXN0cmlidXRpb24gYXMgd2VsbCBhcyB3aXRoIHRoZSBrZXJuZWw7CisgKiAgICAgaWYgZXZlcnlvbmUgaW5jcmVhc2VzIHRoZSBGSUxFVkVSU0lPTiBudW1iZXIgYWJvdmUsIHRoZW4gc2NyaXB0cworICogICAgIGNhbiBkbyB0aGUgcmlnaHQgdGhpbmcgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGluc3RhbGwgYSBuZXcgcHBwLWNvbXAuaAorICogICAgIGZpbGUuICBEb24ndCBjaGFuZ2UgdGhlIGZvcm1hdCBvZiB0aGF0IGxpbmUgb3RoZXJ3aXNlLCBzbyB0aGUKKyAqICAgICBpbnN0YWxsYXRpb24gc2NyaXB0IGNhbiByZWNvZ25pemUgaXQuCisgKi8KKworI2lmbmRlZiBfTkVUX1BQUF9DT01QX0gKKyNkZWZpbmUgX05FVF9QUFBfQ09NUF9ICisKK3N0cnVjdCBtb2R1bGU7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgY29udHJvbCB3aGV0aGVyIHdlIGluY2x1ZGUgY29kZSBmb3IKKyAqIHZhcmlvdXMgY29tcHJlc3Npb24gbWV0aG9kcy4KKyAqLworCisjaWZuZGVmIERPX0JTRF9DT01QUkVTUworI2RlZmluZSBET19CU0RfQ09NUFJFU1MJMQkvKiBieSBkZWZhdWx0LCBpbmNsdWRlIEJTRC1Db21wcmVzcyAqLworI2VuZGlmCisjaWZuZGVmIERPX0RFRkxBVEUKKyNkZWZpbmUgRE9fREVGTEFURQkxCS8qIGJ5IGRlZmF1bHQsIGluY2x1ZGUgRGVmbGF0ZSAqLworI2VuZGlmCisjZGVmaW5lIERPX1BSRURJQ1RPUl8xCTAKKyNkZWZpbmUgRE9fUFJFRElDVE9SXzIJMAorCisvKgorICogU3RydWN0dXJlIGdpdmluZyBtZXRob2RzIGZvciBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgorICovCisKK3N0cnVjdCBjb21wcmVzc29yIHsKKwlpbnQJY29tcHJlc3NfcHJvdG87CS8qIENDUCBjb21wcmVzc2lvbiBwcm90b2NvbCBudW1iZXIgKi8KKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGNvbXByZXNzb3IgKHRyYW5zbWl0IHNpZGUpICovCisJdm9pZAkqKCpjb21wX2FsbG9jKSAodW5zaWduZWQgY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4pOworCisJLyogRnJlZSBzcGFjZSB1c2VkIGJ5IGEgY29tcHJlc3NvciAqLworCXZvaWQJKCpjb21wX2ZyZWUpICh2b2lkICpzdGF0ZSk7CisKKwkvKiBJbml0aWFsaXplIGEgY29tcHJlc3NvciAqLworCWludAkoKmNvbXBfaW5pdCkgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICpvcHRpb25zLAorCQkJICAgICAgaW50IG9wdF9sZW4sIGludCB1bml0LCBpbnQgb3B0aGRyLCBpbnQgZGVidWcpOworCisJLyogUmVzZXQgYSBjb21wcmVzc29yICovCisJdm9pZAkoKmNvbXBfcmVzZXQpICh2b2lkICpzdGF0ZSk7CisKKwkvKiBDb21wcmVzcyBhIHBhY2tldCAqLworCWludCAgICAgKCpjb21wcmVzcykgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICpycHRyLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqb2J1ZiwgaW50IGlzaXplLCBpbnQgb3NpemUpOworCisJLyogUmV0dXJuIGNvbXByZXNzaW9uIHN0YXRpc3RpY3MgKi8KKwl2b2lkCSgqY29tcF9zdGF0KSAodm9pZCAqc3RhdGUsIHN0cnVjdCBjb21wc3RhdCAqc3RhdHMpOworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIGEgZGVjb21wcmVzc29yIChyZWNlaXZlIHNpZGUpICovCisJdm9pZAkqKCpkZWNvbXBfYWxsb2MpICh1bnNpZ25lZCBjaGFyICpvcHRpb25zLCBpbnQgb3B0X2xlbik7CisKKwkvKiBGcmVlIHNwYWNlIHVzZWQgYnkgYSBkZWNvbXByZXNzb3IgKi8KKwl2b2lkCSgqZGVjb21wX2ZyZWUpICh2b2lkICpzdGF0ZSk7CisKKwkvKiBJbml0aWFsaXplIGEgZGVjb21wcmVzc29yICovCisJaW50CSgqZGVjb21wX2luaXQpICh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqb3B0aW9ucywKKwkJCQlpbnQgb3B0X2xlbiwgaW50IHVuaXQsIGludCBvcHRoZHIsIGludCBtcnUsCisJCQkJaW50IGRlYnVnKTsKKworCS8qIFJlc2V0IGEgZGVjb21wcmVzc29yICovCisJdm9pZAkoKmRlY29tcF9yZXNldCkgKHZvaWQgKnN0YXRlKTsKKworCS8qIERlY29tcHJlc3MgYSBwYWNrZXQuICovCisJaW50CSgqZGVjb21wcmVzcykgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICppYnVmLCBpbnQgaXNpemUsCisJCQkJdW5zaWduZWQgY2hhciAqb2J1ZiwgaW50IG9zaXplKTsKKworCS8qIFVwZGF0ZSBzdGF0ZSBmb3IgYW4gaW5jb21wcmVzc2libGUgcGFja2V0IHJlY2VpdmVkICovCisJdm9pZAkoKmluY29tcCkgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICppYnVmLCBpbnQgaWNudCk7CisKKwkvKiBSZXR1cm4gZGVjb21wcmVzc2lvbiBzdGF0aXN0aWNzICovCisJdm9pZAkoKmRlY29tcF9zdGF0KSAodm9pZCAqc3RhdGUsIHN0cnVjdCBjb21wc3RhdCAqc3RhdHMpOworCisJLyogVXNlZCBpbiBsb2NraW5nIGNvbXByZXNzb3IgbW9kdWxlcyAqLworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCS8qIEV4dHJhIHNrYiBzcGFjZSBuZWVkZWQgYnkgdGhlIGNvbXByZXNzb3IgYWxnb3JpdGhtICovCisJdW5zaWduZWQgaW50IGNvbXBfZXh0cmE7Cit9OworCisvKgorICogVGhlIHJldHVybiB2YWx1ZSBmcm9tIGRlY29tcHJlc3Mgcm91dGluZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZQorICogZGVjb21wcmVzc2VkIHBhY2tldCBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgREVDT01QX0VSUk9SCisgKiBvciBERUNPTVBfRkFUQUxFUlJPUiBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqIAorICogV2UgbmVlZCB0byBtYWtlIHRoaXMgZGlzdGluY3Rpb24gc28gdGhhdCB3ZSBjYW4gZGlzYWJsZSBjZXJ0YWluCisgKiB1c2VmdWwgZnVuY3Rpb25hbGl0eSwgbmFtZWx5IHNlbmRpbmcgYSBDQ1AgcmVzZXQtcmVxdWVzdCBhcyBhIHJlc3VsdAorICogb2YgYW4gZXJyb3IgZGV0ZWN0ZWQgYWZ0ZXIgZGVjb21wcmVzc2lvbi4gIFRoaXMgaXMgdG8gYXZvaWQgaW5mcmluZ2luZworICogYSBwYXRlbnQgaGVsZCBieSBNb3Rvcm9sYS4KKyAqIERvbid0IHlvdSBqdXN0IGx1cnZlIHNvZnR3YXJlIHBhdGVudHMuCisgKi8KKworI2RlZmluZSBERUNPTVBfRVJST1IJCS0xCS8qIGVycm9yIGRldGVjdGVkIGJlZm9yZSBkZWNvbXAuICovCisjZGVmaW5lIERFQ09NUF9GQVRBTEVSUk9SCS0yCS8qIGVycm9yIGRldGVjdGVkIGFmdGVyIGRlY29tcC4gKi8KKworLyoKKyAqIENDUCBjb2Rlcy4KKyAqLworCisjZGVmaW5lIENDUF9DT05GUkVRCTEKKyNkZWZpbmUgQ0NQX0NPTkZBQ0sJMgorI2RlZmluZSBDQ1BfVEVSTVJFUQk1CisjZGVmaW5lIENDUF9URVJNQUNLCTYKKyNkZWZpbmUgQ0NQX1JFU0VUUkVRCTE0CisjZGVmaW5lIENDUF9SRVNFVEFDSwkxNQorCisvKgorICogTWF4ICMgYnl0ZXMgZm9yIGEgQ0NQIG9wdGlvbgorICovCisKKyNkZWZpbmUgQ0NQX01BWF9PUFRJT05fTEVOR1RICTMyCisKKy8qCisgKiBQYXJ0cyBvZiBhIENDUCBwYWNrZXQuCisgKi8KKworI2RlZmluZSBDQ1BfQ09ERShkcCkJCSgoZHApWzBdKQorI2RlZmluZSBDQ1BfSUQoZHApCQkoKGRwKVsxXSkKKyNkZWZpbmUgQ0NQX0xFTkdUSChkcCkJCSgoKGRwKVsyXSA8PCA4KSArIChkcClbM10pCisjZGVmaW5lIENDUF9IRFJMRU4JCTQKKworI2RlZmluZSBDQ1BfT1BUX0NPREUoZHApCSgoZHApWzBdKQorI2RlZmluZSBDQ1BfT1BUX0xFTkdUSChkcCkJKChkcClbMV0pCisjZGVmaW5lIENDUF9PUFRfTUlOTEVOCQkyCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgQlNELUNvbXByZXNzLgorICovCisKKyNkZWZpbmUgQ0lfQlNEX0NPTVBSRVNTCQkyMQkvKiBjb25maWcuIG9wdGlvbiBmb3IgQlNELUNvbXByZXNzICovCisjZGVmaW5lIENJTEVOX0JTRF9DT01QUkVTUwkzCS8qIGxlbmd0aCBvZiBjb25maWcuIG9wdGlvbiAqLworCisvKiBNYWNyb3MgZm9yIGhhbmRsaW5nIHRoZSAzcmQgYnl0ZSBvZiB0aGUgQlNELUNvbXByZXNzIGNvbmZpZyBvcHRpb24uICovCisjZGVmaW5lIEJTRF9OQklUUyh4KQkJKCh4KSAmIDB4MUYpCS8qIG51bWJlciBvZiBiaXRzIHJlcXVlc3RlZCAqLworI2RlZmluZSBCU0RfVkVSU0lPTih4KQkJKCh4KSA+PiA1KQkvKiB2ZXJzaW9uIG9mIG9wdGlvbiBmb3JtYXQgKi8KKyNkZWZpbmUgQlNEX0NVUlJFTlRfVkVSU0lPTgkxCQkvKiBjdXJyZW50IHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIEJTRF9NQUtFX09QVCh2LCBuKQkoKCh2KSA8PCA1KSB8IChuKSkKKworI2RlZmluZSBCU0RfTUlOX0JJVFMJCTkJLyogc21hbGxlc3QgY29kZSBzaXplIHN1cHBvcnRlZCAqLworI2RlZmluZSBCU0RfTUFYX0JJVFMJCTE1CS8qIGxhcmdlc3QgY29kZSBzaXplIHN1cHBvcnRlZCAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIERlZmxhdGUuCisgKi8KKworI2RlZmluZSBDSV9ERUZMQVRFCQkyNgkvKiBjb25maWcgb3B0aW9uIGZvciBEZWZsYXRlICovCisjZGVmaW5lIENJX0RFRkxBVEVfRFJBRlQJMjQJLyogdmFsdWUgdXNlZCBpbiBvcmlnaW5hbCBkcmFmdCBSRkMgKi8KKyNkZWZpbmUgQ0lMRU5fREVGTEFURQkJNAkvKiBsZW5ndGggb2YgaXRzIGNvbmZpZyBvcHRpb24gKi8KKworI2RlZmluZSBERUZMQVRFX01JTl9TSVpFCTkKKyNkZWZpbmUgREVGTEFURV9NQVhfU0laRQkxNQorI2RlZmluZSBERUZMQVRFX01FVEhPRF9WQUwJOAorI2RlZmluZSBERUZMQVRFX1NJWkUoeCkJCSgoKHgpID4+IDQpICsgOCkKKyNkZWZpbmUgREVGTEFURV9NRVRIT0QoeCkJKCh4KSAmIDB4MEYpCisjZGVmaW5lIERFRkxBVEVfTUFLRV9PUFQodykJKCgoKHcpIC0gOCkgPDwgNCkgKyBERUZMQVRFX01FVEhPRF9WQUwpCisjZGVmaW5lIERFRkxBVEVfQ0hLX1NFUVVFTkNFCTAKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBNUFBFLgorICovCisKKyNkZWZpbmUgQ0lfTVBQRSAgICAgICAgICAgICAgICAxOCAgICAgIC8qIGNvbmZpZyBvcHRpb24gZm9yIE1QUEUgKi8KKyNkZWZpbmUgQ0lMRU5fTVBQRSAgICAgICAgICAgICAgNiAgICAgIC8qIGxlbmd0aCBvZiBjb25maWcgb3B0aW9uICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3Igb3RoZXIsIGFzIHlldCB1bnN1cHBvcnRlZCwgY29tcHJlc3Npb24gbWV0aG9kcy4KKyAqLworCisjZGVmaW5lIENJX1BSRURJQ1RPUl8xCQkxCS8qIGNvbmZpZyBvcHRpb24gZm9yIFByZWRpY3Rvci0xICovCisjZGVmaW5lIENJTEVOX1BSRURJQ1RPUl8xCTIJLyogbGVuZ3RoIG9mIGl0cyBjb25maWcgb3B0aW9uICovCisjZGVmaW5lIENJX1BSRURJQ1RPUl8yCQkyCS8qIGNvbmZpZyBvcHRpb24gZm9yIFByZWRpY3Rvci0yICovCisjZGVmaW5lIENJTEVOX1BSRURJQ1RPUl8yCTIJLyogbGVuZ3RoIG9mIGl0cyBjb25maWcgb3B0aW9uICovCisKKworI2VuZGlmIC8qIF9ORVRfUFBQX0NPTVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wcHBfZGVmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wcHBfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTRlNWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BwcF9kZWZzLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBwcHBfZGVmcy5oIC0gUFBQIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBUaGUgQXVzdHJhbGlhbiBOYXRpb25hbCBVbml2ZXJzaXR5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5LCBleHByZXNzIG9yIGltcGxpZWQuIFRoZSBBdXN0cmFsaWFuIE5hdGlvbmFsIFVuaXZlcnNpdHkKKyAqIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlLgorICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVNUUkFMSUFOIE5BVElPTkFMIFVOSVZFUlNJVFkgQkUgTElBQkxFIFRPIEFOWQorICogUEFSVFkgRk9SIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTiwgRVZFTiBJRgorICogVEhFIEFVU1RSQUxJQU4gTkFUSU9OQUwgVU5JVkVSU0lUWSBIQVZFIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRIRSBBVVNUUkFMSUFOIE5BVElPTkFMIFVOSVZFUlNJVFkgU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorICogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIFNPRlRXQVJFIFBST1ZJREVEIEhFUkVVTkRFUiBJUworICogT04gQU4gIkFTIElTIiBCQVNJUywgQU5EIFRIRSBBVVNUUkFMSUFOIE5BVElPTkFMIFVOSVZFUlNJVFkgSEFTIE5PCisgKiBPQkxJR0FUSU9OIFRPIFBST1ZJREUgTUFJTlRFTkFOQ0UsIFNVUFBPUlQsIFVQREFURVMsIEVOSEFOQ0VNRU5UUywKKyAqIE9SIE1PRElGSUNBVElPTlMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiAgPT1GSUxFVkVSU0lPTiAyMDAwMDExND09CisgKgorICogIE5PVEUgVE8gTUFJTlRBSU5FUlM6CisgKiAgICAgSWYgeW91IG1vZGlmeSB0aGlzIGZpbGUgYXQgYWxsLCBwbGVhc2Ugc2V0IHRoZSBhYm92ZSBkYXRlLgorICogICAgIHBwcF9kZWZzLmggaXMgc2hpcHBlZCB3aXRoIGEgUFBQIGRpc3RyaWJ1dGlvbiBhcyB3ZWxsIGFzIHdpdGggdGhlIGtlcm5lbDsKKyAqICAgICBpZiBldmVyeW9uZSBpbmNyZWFzZXMgdGhlIEZJTEVWRVJTSU9OIG51bWJlciBhYm92ZSwgdGhlbiBzY3JpcHRzCisgKiAgICAgY2FuIGRvIHRoZSByaWdodCB0aGluZyB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gaW5zdGFsbCBhIG5ldyBwcHBfZGVmcy5oCisgKiAgICAgZmlsZS4gIERvbid0IGNoYW5nZSB0aGUgZm9ybWF0IG9mIHRoYXQgbGluZSBvdGhlcndpc2UsIHNvIHRoZQorICogICAgIGluc3RhbGxhdGlvbiBzY3JpcHQgY2FuIHJlY29nbml6ZSBpdC4KKyAqLworCisjaWZuZGVmIF9QUFBfREVGU19IXworI2RlZmluZSBfUFBQX0RFRlNfSF8KKworLyoKKyAqIFRoZSBiYXNpYyBQUFAgZnJhbWUuCisgKi8KKyNkZWZpbmUgUFBQX0hEUkxFTgk0CS8qIG9jdGV0cyBmb3Igc3RhbmRhcmQgcHBwIGhlYWRlciAqLworI2RlZmluZSBQUFBfRkNTTEVOCTIJLyogb2N0ZXRzIGZvciBGQ1MgKi8KKyNkZWZpbmUgUFBQX01SVQkJMTUwMAkvKiBkZWZhdWx0IE1SVSA9IG1heCBsZW5ndGggb2YgaW5mbyBmaWVsZCAqLworCisjZGVmaW5lIFBQUF9BRERSRVNTKHApCSgoKF9fdTggKikocCkpWzBdKQorI2RlZmluZSBQUFBfQ09OVFJPTChwKQkoKChfX3U4ICopKHApKVsxXSkKKyNkZWZpbmUgUFBQX1BST1RPQ09MKHApCSgoKChfX3U4ICopKHApKVsyXSA8PCA4KSArICgoX191OCAqKShwKSlbM10pCisKKy8qCisgKiBTaWduaWZpY2FudCBvY3RldCB2YWx1ZXMuCisgKi8KKyNkZWZpbmUJUFBQX0FMTFNUQVRJT05TCTB4ZmYJLyogQWxsLVN0YXRpb25zIGJyb2FkY2FzdCBhZGRyZXNzICovCisjZGVmaW5lCVBQUF9VSQkJMHgwMwkvKiBVbm51bWJlcmVkIEluZm9ybWF0aW9uICovCisjZGVmaW5lCVBQUF9GTEFHCTB4N2UJLyogRmxhZyBTZXF1ZW5jZSAqLworI2RlZmluZQlQUFBfRVNDQVBFCTB4N2QJLyogQXN5bmNocm9ub3VzIENvbnRyb2wgRXNjYXBlICovCisjZGVmaW5lCVBQUF9UUkFOUwkweDIwCS8qIEFzeW5jaHJvbm91cyB0cmFuc3BhcmVuY3kgbW9kaWZpZXIgKi8KKworLyoKKyAqIFByb3RvY29sIGZpZWxkIHZhbHVlcy4KKyAqLworI2RlZmluZSBQUFBfSVAJCTB4MjEJLyogSW50ZXJuZXQgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0FUCQkweDI5CS8qIEFwcGxlVGFsayBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfSVBYCQkweDJiCS8qIElQWCBwcm90b2NvbCAqLworI2RlZmluZQlQUFBfVkpDX0NPTVAJMHgyZAkvKiBWSiBjb21wcmVzc2VkIFRDUCAqLworI2RlZmluZQlQUFBfVkpDX1VOQ09NUAkweDJmCS8qIFZKIHVuY29tcHJlc3NlZCBUQ1AgKi8KKyNkZWZpbmUgUFBQX01QCQkweDNkCS8qIE11bHRpbGluayBwcm90b2NvbCAqLworI2RlZmluZSBQUFBfSVBWNgkweDU3CS8qIEludGVybmV0IFByb3RvY29sIFZlcnNpb24gNiAqLworI2RlZmluZSBQUFBfQ09NUEZSQUcJMHhmYgkvKiBmcmFnbWVudCBjb21wcmVzc2VkIGJlbG93IGJ1bmRsZSAqLworI2RlZmluZSBQUFBfQ09NUAkweGZkCS8qIGNvbXByZXNzZWQgcGFja2V0ICovCisjZGVmaW5lIFBQUF9NUExTX1VDCTB4MDI4MQkvKiBNdWx0aSBQcm90b2NvbCBMYWJlbCBTd2l0Y2hpbmcgLSBVbmljYXN0ICovCisjZGVmaW5lIFBQUF9NUExTX01DCTB4MDI4MwkvKiBNdWx0aSBQcm90b2NvbCBMYWJlbCBTd2l0Y2hpbmcgLSBNdWx0aWNhc3QgKi8KKyNkZWZpbmUgUFBQX0lQQ1AJMHg4MDIxCS8qIElQIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0FUQ1AJMHg4MDI5CS8qIEFwcGxlVGFsayBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9JUFhDUAkweDgwMmIJLyogSVBYIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0lQVjZDUAkweDgwNTcJLyogSVB2NiBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9DQ1BGUkFHCTB4ODBmYgkvKiBDQ1AgYXQgbGluayBsZXZlbCAoYmVsb3cgTVAgYnVuZGxlKSAqLworI2RlZmluZSBQUFBfQ0NQCQkweDgwZmQJLyogQ29tcHJlc3Npb24gQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfTVBMU0NQCTB4ODBmZAkvKiBNUExTIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0xDUAkJMHhjMDIxCS8qIExpbmsgQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfUEFQCQkweGMwMjMJLyogUGFzc3dvcmQgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0xRUgkJMHhjMDI1CS8qIExpbmsgUXVhbGl0eSBSZXBvcnQgcHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0NIQVAJMHhjMjIzCS8qIENyeXB0b2dyYXBoaWMgSGFuZHNoYWtlIEF1dGguIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9DQkNQCTB4YzAyOQkvKiBDYWxsYmFjayBDb250cm9sIFByb3RvY29sICovCisKKy8qCisgKiBWYWx1ZXMgZm9yIEZDUyBjYWxjdWxhdGlvbnMuCisgKi8KKworI2RlZmluZSBQUFBfSU5JVEZDUwkweGZmZmYJLyogSW5pdGlhbCBGQ1MgdmFsdWUgKi8KKyNkZWZpbmUgUFBQX0dPT0RGQ1MJMHhmMGI4CS8qIEdvb2QgZmluYWwgRkNTIHZhbHVlICovCisKKworLyoKKyAqIEV4dGVuZGVkIGFzeW5jbWFwIC0gYWxsb3dzIGFueSBjaGFyYWN0ZXIgdG8gYmUgZXNjYXBlZC4KKyAqLworCit0eXBlZGVmIF9fdTMyCQlleHRfYWNjbVs4XTsKKworLyoKKyAqIFdoYXQgdG8gZG8gd2l0aCBuZXR3b3JrIHByb3RvY29sIChOUCkgcGFja2V0cy4KKyAqLworZW51bSBOUG1vZGUgeworICAgIE5QTU9ERV9QQVNTLAkJLyogcGFzcyB0aGUgcGFja2V0IHRocm91Z2ggKi8KKyAgICBOUE1PREVfRFJPUCwJCS8qIHNpbGVudGx5IGRyb3AgdGhlIHBhY2tldCAqLworICAgIE5QTU9ERV9FUlJPUiwJCS8qIHJldHVybiBhbiBlcnJvciAqLworICAgIE5QTU9ERV9RVUVVRQkJLyogc2F2ZSBpdCB1cCBmb3IgbGF0ZXIuICovCit9OworCisvKgorICogU3RhdGlzdGljcyBmb3IgTFFSUCBhbmQgcHBwc3RhdHMKKyAqLworc3RydWN0IHBwcHN0YXQJeworICAgIF9fdTMyCXBwcF9kaXNjYXJkczsJLyogIyBmcmFtZXMgZGlzY2FyZGVkICovCisKKyAgICBfX3UzMglwcHBfaWJ5dGVzOwkvKiBieXRlcyByZWNlaXZlZCAqLworICAgIF9fdTMyCXBwcF9pb2N0ZWN0czsJLyogYnl0ZXMgcmVjZWl2ZWQgbm90IGluIGVycm9yICovCisgICAgX191MzIJcHBwX2lwYWNrZXRzOwkvKiBwYWNrZXRzIHJlY2VpdmVkICovCisgICAgX191MzIJcHBwX2llcnJvcnM7CS8qIHJlY2VpdmUgZXJyb3JzICovCisgICAgX191MzIJcHBwX2lscXJzOwkvKiAjIExRUiBmcmFtZXMgcmVjZWl2ZWQgKi8KKworICAgIF9fdTMyCXBwcF9vYnl0ZXM7CS8qIHJhdyBieXRlcyBzZW50ICovCisgICAgX191MzIJcHBwX29vY3RlY3RzOwkvKiBmcmFtZSBieXRlcyBzZW50ICovCisgICAgX191MzIJcHBwX29wYWNrZXRzOwkvKiBwYWNrZXRzIHNlbnQgKi8KKyAgICBfX3UzMglwcHBfb2Vycm9yczsJLyogdHJhbnNtaXQgZXJyb3JzICovIAorICAgIF9fdTMyCXBwcF9vbHFyczsJLyogIyBMUVIgZnJhbWVzIHNlbnQgKi8KK307CisKK3N0cnVjdCB2anN0YXQgeworICAgIF9fdTMyCXZqc19wYWNrZXRzOwkvKiBvdXRib3VuZCBwYWNrZXRzICovCisgICAgX191MzIJdmpzX2NvbXByZXNzZWQ7CS8qIG91dGJvdW5kIGNvbXByZXNzZWQgcGFja2V0cyAqLworICAgIF9fdTMyCXZqc19zZWFyY2hlczsJLyogc2VhcmNoZXMgZm9yIGNvbm5lY3Rpb24gc3RhdGUgKi8KKyAgICBfX3UzMgl2anNfbWlzc2VzOwkvKiB0aW1lcyBjb3VsZG4ndCBmaW5kIGNvbm4uIHN0YXRlICovCisgICAgX191MzIJdmpzX3VuY29tcHJlc3NlZGluOyAvKiBpbmJvdW5kIHVuY29tcHJlc3NlZCBwYWNrZXRzICovCisgICAgX191MzIJdmpzX2NvbXByZXNzZWRpbjsgICAvKiBpbmJvdW5kIGNvbXByZXNzZWQgcGFja2V0cyAqLworICAgIF9fdTMyCXZqc19lcnJvcmluOwkvKiBpbmJvdW5kIHVua25vd24gdHlwZSBwYWNrZXRzICovCisgICAgX191MzIJdmpzX3Rvc3NlZDsJLyogaW5ib3VuZCBwYWNrZXRzIHRvc3NlZCBiZWNhdXNlIG9mIGVycm9yICovCit9OworCitzdHJ1Y3QgY29tcHN0YXQgeworICAgIF9fdTMyCXVuY19ieXRlczsJLyogdG90YWwgdW5jb21wcmVzc2VkIGJ5dGVzICovCisgICAgX191MzIJdW5jX3BhY2tldHM7CS8qIHRvdGFsIHVuY29tcHJlc3NlZCBwYWNrZXRzICovCisgICAgX191MzIJY29tcF9ieXRlczsJLyogY29tcHJlc3NlZCBieXRlcyAqLworICAgIF9fdTMyCWNvbXBfcGFja2V0czsJLyogY29tcHJlc3NlZCBwYWNrZXRzICovCisgICAgX191MzIJaW5jX2J5dGVzOwkvKiBpbmNvbXByZXNzaWJsZSBieXRlcyAqLworICAgIF9fdTMyCWluY19wYWNrZXRzOwkvKiBpbmNvbXByZXNzaWJsZSBwYWNrZXRzICovCisKKyAgICAvKiB0aGUgY29tcHJlc3Npb24gcmF0aW8gaXMgZGVmaW5lZCBhcyBpbl9jb3VudCAvIGJ5dGVzX291dCAqLworICAgIF9fdTMyICAgICAgIGluX2NvdW50OwkvKiBCeXRlcyByZWNlaXZlZCAqLworICAgIF9fdTMyICAgICAgIGJ5dGVzX291dDsJLyogQnl0ZXMgdHJhbnNtaXR0ZWQgKi8KKworICAgIGRvdWJsZQlyYXRpbzsJCS8qIG5vdCBjb21wdXRlZCBpbiBrZXJuZWwuICovCit9OworCitzdHJ1Y3QgcHBwX3N0YXRzIHsKKyAgICBzdHJ1Y3QgcHBwc3RhdAlwOwkvKiBiYXNpYyBQUFAgc3RhdGlzdGljcyAqLworICAgIHN0cnVjdCB2anN0YXQJdmo7CS8qIFZKIGhlYWRlciBjb21wcmVzc2lvbiBzdGF0aXN0aWNzICovCit9OworCitzdHJ1Y3QgcHBwX2NvbXBfc3RhdHMgeworICAgIHN0cnVjdCBjb21wc3RhdAljOwkvKiBwYWNrZXQgY29tcHJlc3Npb24gc3RhdGlzdGljcyAqLworICAgIHN0cnVjdCBjb21wc3RhdAlkOwkvKiBwYWNrZXQgZGVjb21wcmVzc2lvbiBzdGF0aXN0aWNzICovCit9OworCisvKgorICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgcmVjb3JkcyB0aGUgdGltZSBpbiBzZWNvbmRzIHNpbmNlCisgKiB0aGUgbGFzdCBOUCBwYWNrZXQgd2FzIHNlbnQgb3IgcmVjZWl2ZWQuCisgKi8KK3N0cnVjdCBwcHBfaWRsZSB7CisgICAgX19rZXJuZWxfdGltZV90IHhtaXRfaWRsZTsJLyogdGltZSBzaW5jZSBsYXN0IE5QIHBhY2tldCBzZW50ICovCisgICAgX19rZXJuZWxfdGltZV90IHJlY3ZfaWRsZTsJLyogdGltZSBzaW5jZSBsYXN0IE5QIHBhY2tldCByZWNlaXZlZCAqLworfTsKKworI2VuZGlmIC8qIF9QUFBfREVGU19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wcHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliYjFkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHBzLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBQUFMgQVBJIGhlYWRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA5ICAgUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKworI2lmbmRlZiBfUFBTX0hfCisjZGVmaW5lIF9QUFNfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgUFBTX1ZFUlNJT04JCSI1LjMuNiIKKyNkZWZpbmUgUFBTX01BWF9TT1VSQ0VTCQkxNgkJLyogc2hvdWxkIGJlIGVub3VnaC4uLiAqLworCisvKiBJbXBsZW1lbnRhdGlvbiBub3RlOiB0aGUgbG9naWNhbCBzdGF0ZXMgYGBhc3NlcnQnJyBhbmQgYGBjbGVhcicnCisgKiBhcmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlIGNoaXAgcmVnaXN0ZXIsIGkuZS4gYGBhc3NlcnQnJworICogbWVhbnMgdGhlIGJpdCBpcyBzZXQuICAqLworCisvKgorICogMy4yIE5ldyBkYXRhIHN0cnVjdHVyZXMKKyAqLworCisjZGVmaW5lIFBQU19BUElfVkVSU18xCQkxCisjZGVmaW5lIFBQU19BUElfVkVSUwkJUFBTX0FQSV9WRVJTXzEJLyogd2UgdXNlIEFQSSB2ZXJzaW9uIDEgKi8KKyNkZWZpbmUgUFBTX01BWF9OQU1FX0xFTgkzMgorCisvKiAzMi1iaXQgdnMuIDY0LWJpdCBjb21wYXRpYmlsaXR5LgorICoKKyAqIDBuIGkzODYsIHRoZSBhbGlnbm1lbnQgb2YgYSB1aW50NjRfdCBpcyBvbmx5IDQgYnl0ZXMsIHdoaWxlIG9uIG1vc3Qgb3RoZXIKKyAqIGFyY2hpdGVjdHVyZXMgaXQncyA4IGJ5dGVzLiBPbiBpMzg2LCB0aGVyZSB3aWxsIGJlIG5vIHBhZGRpbmcgYmV0d2VlbiB0aGUKKyAqIHR3byBjb25zZWN1dGl2ZSAnc3RydWN0IHBwc19rdGltZScgbWVtYmVycyBvZiBzdHJ1Y3QgcHBzX2tpbmZvIGFuZCBzdHJ1Y3QKKyAqIHBwc19rcGFyYW1zLiBCdXQgb24gbW9zdCBwbGF0Zm9ybXMgdGhlcmUgd2lsbCBiZSBwYWRkaW5nIHRvIGVuc3VyZSBjb3JyZWN0CisgKiBhbGlnbm1lbnQuCisgKgorICogVGhlIHNpbXBsZSBmaXggaXMgcHJvYmFibHkgdG8gYWRkIGFuIGV4cGxpY2l0IHBhZGRpbmcuCisgKgkJCQkJIAkJW0RhdmlkIFdvb2Rob3VzZV0KKyAqLworc3RydWN0IHBwc19rdGltZSB7CisJX19zNjQgc2VjOworCV9fczMyIG5zZWM7CisJX191MzIgZmxhZ3M7Cit9OworI2RlZmluZSBQUFNfVElNRV9JTlZBTElECSgxPDwwKQkvKiB1c2VkIHRvIHNwZWNpZnkgdGltZW91dD09TlVMTCAqLworCitzdHJ1Y3QgcHBzX2tpbmZvIHsKKwlfX3UzMiBhc3NlcnRfc2VxdWVuY2U7CQkvKiBzZXEuIG51bS4gb2YgYXNzZXJ0IGV2ZW50ICovCisJX191MzIgY2xlYXJfc2VxdWVuY2U7IAkJLyogc2VxLiBudW0uIG9mIGNsZWFyIGV2ZW50ICovCisJc3RydWN0IHBwc19rdGltZSBhc3NlcnRfdHU7CS8qIHRpbWUgb2YgYXNzZXJ0IGV2ZW50ICovCisJc3RydWN0IHBwc19rdGltZSBjbGVhcl90dTsJLyogdGltZSBvZiBjbGVhciBldmVudCAqLworCWludCBjdXJyZW50X21vZGU7CQkvKiBjdXJyZW50IG1vZGUgYml0cyAqLworfTsKKworc3RydWN0IHBwc19rcGFyYW1zIHsKKwlpbnQgYXBpX3ZlcnNpb247CQkvKiBBUEkgdmVyc2lvbiAjICovCisJaW50IG1vZGU7CQkJLyogbW9kZSBiaXRzICovCisJc3RydWN0IHBwc19rdGltZSBhc3NlcnRfb2ZmX3R1OwkvKiBvZmZzZXQgY29tcGVuc2F0aW9uIGZvciBhc3NlcnQgKi8KKwlzdHJ1Y3QgcHBzX2t0aW1lIGNsZWFyX29mZl90dTsJLyogb2Zmc2V0IGNvbXBlbnNhdGlvbiBmb3IgY2xlYXIgKi8KK307CisKKy8qCisgKiAzLjMgTW9kZSBiaXQgZGVmaW5pdGlvbnMKKyAqLworCisvKiBEZXZpY2UvaW1wbGVtZW50YXRpb24gcGFyYW1ldGVycyAqLworI2RlZmluZSBQUFNfQ0FQVFVSRUFTU0VSVAkweDAxCS8qIGNhcHR1cmUgYXNzZXJ0IGV2ZW50cyAqLworI2RlZmluZSBQUFNfQ0FQVFVSRUNMRUFSCTB4MDIJLyogY2FwdHVyZSBjbGVhciBldmVudHMgKi8KKyNkZWZpbmUgUFBTX0NBUFRVUkVCT1RICQkweDAzCS8qIGNhcHR1cmUgYXNzZXJ0IGFuZCBjbGVhciBldmVudHMgKi8KKworI2RlZmluZSBQUFNfT0ZGU0VUQVNTRVJUCTB4MTAJLyogYXBwbHkgY29tcGVuc2F0aW9uIGZvciBhc3NlcnQgZXYuICovCisjZGVmaW5lIFBQU19PRkZTRVRDTEVBUgkJMHgyMAkvKiBhcHBseSBjb21wZW5zYXRpb24gZm9yIGNsZWFyIGV2LiAqLworCisjZGVmaW5lIFBQU19DQU5XQUlUCQkweDEwMAkvKiBjYW4gd2Ugd2FpdCBmb3IgYW4gZXZlbnQ/ICovCisjZGVmaW5lIFBQU19DQU5QT0xMCQkweDIwMAkvKiBiaXQgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKworLyogS2VybmVsIGFjdGlvbnMgKi8KKyNkZWZpbmUgUFBTX0VDSE9BU1NFUlQJCTB4NDAJLyogZmVlZCBiYWNrIGFzc2VydCBldmVudCB0byBvdXRwdXQgKi8KKyNkZWZpbmUgUFBTX0VDSE9DTEVBUgkJMHg4MAkvKiBmZWVkIGJhY2sgY2xlYXIgZXZlbnQgdG8gb3V0cHV0ICovCisKKy8qIFRpbWVzdGFtcCBmb3JtYXRzICovCisjZGVmaW5lIFBQU19UU0ZNVF9UU1BFQwkJMHgxMDAwCS8qIHNlbGVjdCB0aW1lc3BlYyBmb3JtYXQgKi8KKyNkZWZpbmUgUFBTX1RTRk1UX05UUEZQCQkweDIwMDAJLyogc2VsZWN0IE5UUCBmb3JtYXQgKi8KKworLyoKKyAqIDMuNC40IE5ldyBmdW5jdGlvbnM6IGRpc2NpcGxpbmluZyB0aGUga2VybmVsIHRpbWViYXNlCisgKi8KKworLyogS2VybmVsIGNvbnN1bWVycyAqLworI2RlZmluZSBQUFNfS0NfSEFSRFBQUwkJMAkvKiBoYXJkcHBzKCkgKG9yIGVxdWl2YWxlbnQpICovCisjZGVmaW5lIFBQU19LQ19IQVJEUFBTX1BMTAkxCS8qIGhhcmRwcHMoKSBjb25zdHJhaW5lZCB0bworCQkJCQkgICB1c2UgYSBwaGFzZS1sb2NrZWQgbG9vcCAqLworI2RlZmluZSBQUFNfS0NfSEFSRFBQU19GTEwJMgkvKiBoYXJkcHBzKCkgY29uc3RyYWluZWQgdG8KKwkJCQkJICAgdXNlIGEgZnJlcXVlbmN5LWxvY2tlZCBsb29wICovCisvKgorICogSGVyZSBiZWdpbnMgdGhlIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHBhcnQhCisgKi8KKworc3RydWN0IHBwc19mZGF0YSB7CisJc3RydWN0IHBwc19raW5mbyBpbmZvOworCXN0cnVjdCBwcHNfa3RpbWUgdGltZW91dDsKK307CisKK3N0cnVjdCBwcHNfYmluZF9hcmdzIHsKKwlpbnQgdHNmb3JtYXQ7CS8qIGZvcm1hdCBvZiB0aW1lIHN0YW1wcyAqLworCWludCBlZGdlOwkvKiBzZWxlY3RlZCBldmVudCB0eXBlICovCisJaW50IGNvbnN1bWVyOwkvKiBzZWxlY3RlZCBrZXJuZWwgY29uc3VtZXIgKi8KK307CisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIFBQU19HRVRQQVJBTVMJCV9JT1IoJ3AnLCAweGExLCBzdHJ1Y3QgcHBzX2twYXJhbXMgKikKKyNkZWZpbmUgUFBTX1NFVFBBUkFNUwkJX0lPVygncCcsIDB4YTIsIHN0cnVjdCBwcHNfa3BhcmFtcyAqKQorI2RlZmluZSBQUFNfR0VUQ0FQCQlfSU9SKCdwJywgMHhhMywgaW50ICopCisjZGVmaW5lIFBQU19GRVRDSAkJX0lPV1IoJ3AnLCAweGE0LCBzdHJ1Y3QgcHBzX2ZkYXRhICopCisjZGVmaW5lIFBQU19LQ19CSU5ECQlfSU9XKCdwJywgMHhhNSwgc3RydWN0IHBwc19iaW5kX2FyZ3MgKikKKworI2VuZGlmIC8qIF9QUFNfSF8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHJjdGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHJjdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTkzYzcxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wcmN0bC5oCkBAIC0wLDAgKzEsMTM5IEBACisjaWZuZGVmIF9MSU5VWF9QUkNUTF9ICisjZGVmaW5lIF9MSU5VWF9QUkNUTF9ICisKKy8qIFZhbHVlcyB0byBwYXNzIGFzIGZpcnN0IGFyZ3VtZW50IHRvIHByY3RsKCkgKi8KKworI2RlZmluZSBQUl9TRVRfUERFQVRIU0lHICAxICAvKiBTZWNvbmQgYXJnIGlzIGEgc2lnbmFsICovCisjZGVmaW5lIFBSX0dFVF9QREVBVEhTSUcgIDIgIC8qIFNlY29uZCBhcmcgaXMgYSBwdHIgdG8gcmV0dXJuIHRoZSBzaWduYWwgKi8KKworLyogR2V0L3NldCBjdXJyZW50LT5tbS0+ZHVtcGFibGUgKi8KKyNkZWZpbmUgUFJfR0VUX0RVTVBBQkxFICAgMworI2RlZmluZSBQUl9TRVRfRFVNUEFCTEUgICA0CisKKy8qIEdldC9zZXQgdW5hbGlnbmVkIGFjY2VzcyBjb250cm9sIGJpdHMgKGlmIG1lYW5pbmdmdWwpICovCisjZGVmaW5lIFBSX0dFVF9VTkFMSUdOCSAgNQorI2RlZmluZSBQUl9TRVRfVU5BTElHTgkgIDYKKyMgZGVmaW5lIFBSX1VOQUxJR05fTk9QUklOVAkxCS8qIHNpbGVudGx5IGZpeCB1cCB1bmFsaWduZWQgdXNlciBhY2Nlc3NlcyAqLworIyBkZWZpbmUgUFJfVU5BTElHTl9TSUdCVVMJMgkvKiBnZW5lcmF0ZSBTSUdCVVMgb24gdW5hbGlnbmVkIHVzZXIgYWNjZXNzICovCisKKy8qIEdldC9zZXQgd2hldGhlciBvciBub3QgdG8gZHJvcCBjYXBhYmlsaXRpZXMgb24gc2V0dWlkKCkgYXdheSBmcm9tCisgKiB1aWQgMCAoYXMgcGVyIHNlY3VyaXR5L2NvbW1vbmNhcC5jKSAqLworI2RlZmluZSBQUl9HRVRfS0VFUENBUFMgICA3CisjZGVmaW5lIFBSX1NFVF9LRUVQQ0FQUyAgIDgKKworLyogR2V0L3NldCBmbG9hdGluZy1wb2ludCBlbXVsYXRpb24gY29udHJvbCBiaXRzIChpZiBtZWFuaW5nZnVsKSAqLworI2RlZmluZSBQUl9HRVRfRlBFTVUgIDkKKyNkZWZpbmUgUFJfU0VUX0ZQRU1VIDEwCisjIGRlZmluZSBQUl9GUEVNVV9OT1BSSU5UCTEJLyogc2lsZW50bHkgZW11bGF0ZSBmcCBvcGVyYXRpb25zIGFjY2Vzc2VzICovCisjIGRlZmluZSBQUl9GUEVNVV9TSUdGUEUJMgkvKiBkb24ndCBlbXVsYXRlIGZwIG9wZXJhdGlvbnMsIHNlbmQgU0lHRlBFIGluc3RlYWQgKi8KKworLyogR2V0L3NldCBmbG9hdGluZy1wb2ludCBleGNlcHRpb24gbW9kZSAoaWYgbWVhbmluZ2Z1bCkgKi8KKyNkZWZpbmUgUFJfR0VUX0ZQRVhDCTExCisjZGVmaW5lIFBSX1NFVF9GUEVYQwkxMgorIyBkZWZpbmUgUFJfRlBfRVhDX1NXX0VOQUJMRQkweDgwCS8qIFVzZSBGUEVYQyBmb3IgRlAgZXhjZXB0aW9uIGVuYWJsZXMgKi8KKyMgZGVmaW5lIFBSX0ZQX0VYQ19ESVYJCTB4MDEwMDAwCS8qIGZsb2F0aW5nIHBvaW50IGRpdmlkZSBieSB6ZXJvICovCisjIGRlZmluZSBQUl9GUF9FWENfT1ZGCQkweDAyMDAwMAkvKiBmbG9hdGluZyBwb2ludCBvdmVyZmxvdyAqLworIyBkZWZpbmUgUFJfRlBfRVhDX1VORAkJMHgwNDAwMDAJLyogZmxvYXRpbmcgcG9pbnQgdW5kZXJmbG93ICovCisjIGRlZmluZSBQUl9GUF9FWENfUkVTCQkweDA4MDAwMAkvKiBmbG9hdGluZyBwb2ludCBpbmV4YWN0IHJlc3VsdCAqLworIyBkZWZpbmUgUFJfRlBfRVhDX0lOVgkJMHgxMDAwMDAJLyogZmxvYXRpbmcgcG9pbnQgaW52YWxpZCBvcGVyYXRpb24gKi8KKyMgZGVmaW5lIFBSX0ZQX0VYQ19ESVNBQkxFRAkwCS8qIEZQIGV4Y2VwdGlvbnMgZGlzYWJsZWQgKi8KKyMgZGVmaW5lIFBSX0ZQX0VYQ19OT05SRUNPVgkxCS8qIGFzeW5jIG5vbi1yZWNvdmVyYWJsZSBleGMuIG1vZGUgKi8KKyMgZGVmaW5lIFBSX0ZQX0VYQ19BU1lOQwkyCS8qIGFzeW5jIHJlY292ZXJhYmxlIGV4Y2VwdGlvbiBtb2RlICovCisjIGRlZmluZSBQUl9GUF9FWENfUFJFQ0lTRQkzCS8qIHByZWNpc2UgZXhjZXB0aW9uIG1vZGUgKi8KKworLyogR2V0L3NldCB3aGV0aGVyIHdlIHVzZSBzdGF0aXN0aWNhbCBwcm9jZXNzIHRpbWluZyBvciBhY2N1cmF0ZSB0aW1lc3RhbXAKKyAqIGJhc2VkIHByb2Nlc3MgdGltaW5nICovCisjZGVmaW5lIFBSX0dFVF9USU1JTkcgICAxMworI2RlZmluZSBQUl9TRVRfVElNSU5HICAgMTQKKyMgZGVmaW5lIFBSX1RJTUlOR19TVEFUSVNUSUNBTCAgMCAgICAgICAvKiBOb3JtYWwsIHRyYWRpdGlvbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljYWwgcHJvY2VzcyB0aW1pbmcgKi8KKyMgZGVmaW5lIFBSX1RJTUlOR19USU1FU1RBTVAgICAgMSAgICAgICAvKiBBY2N1cmF0ZSB0aW1lc3RhbXAgYmFzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgdGltaW5nICovCisKKyNkZWZpbmUgUFJfU0VUX05BTUUgICAgMTUJCS8qIFNldCBwcm9jZXNzIG5hbWUgKi8KKyNkZWZpbmUgUFJfR0VUX05BTUUgICAgMTYJCS8qIEdldCBwcm9jZXNzIG5hbWUgKi8KKworLyogR2V0L3NldCBwcm9jZXNzIGVuZGlhbiAqLworI2RlZmluZSBQUl9HRVRfRU5ESUFOCTE5CisjZGVmaW5lIFBSX1NFVF9FTkRJQU4JMjAKKyMgZGVmaW5lIFBSX0VORElBTl9CSUcJCTAKKyMgZGVmaW5lIFBSX0VORElBTl9MSVRUTEUJMQkvKiBUcnVlIGxpdHRsZSBlbmRpYW4gbW9kZSAqLworIyBkZWZpbmUgUFJfRU5ESUFOX1BQQ19MSVRUTEUJMgkvKiAiUG93ZXJQQyIgcHNldWRvIGxpdHRsZSBlbmRpYW4gKi8KKworLyogR2V0L3NldCBwcm9jZXNzIHNlY2NvbXAgbW9kZSAqLworI2RlZmluZSBQUl9HRVRfU0VDQ09NUAkyMQorI2RlZmluZSBQUl9TRVRfU0VDQ09NUAkyMgorCisvKiBHZXQvc2V0IHRoZSBjYXBhYmlsaXR5IGJvdW5kaW5nIHNldCAoYXMgcGVyIHNlY3VyaXR5L2NvbW1vbmNhcC5jKSAqLworI2RlZmluZSBQUl9DQVBCU0VUX1JFQUQgMjMKKyNkZWZpbmUgUFJfQ0FQQlNFVF9EUk9QIDI0CisKKy8qIEdldC9zZXQgdGhlIHByb2Nlc3MnIGFiaWxpdHkgdG8gdXNlIHRoZSB0aW1lc3RhbXAgY291bnRlciBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBQUl9HRVRfVFNDIDI1CisjZGVmaW5lIFBSX1NFVF9UU0MgMjYKKyMgZGVmaW5lIFBSX1RTQ19FTkFCTEUJCTEJLyogYWxsb3cgdGhlIHVzZSBvZiB0aGUgdGltZXN0YW1wIGNvdW50ZXIgKi8KKyMgZGVmaW5lIFBSX1RTQ19TSUdTRUdWCQkyCS8qIHRocm93IGEgU0lHU0VHViBpbnN0ZWFkIG9mIHJlYWRpbmcgdGhlIFRTQyAqLworCisvKiBHZXQvc2V0IHNlY3VyZWJpdHMgKGFzIHBlciBzZWN1cml0eS9jb21tb25jYXAuYykgKi8KKyNkZWZpbmUgUFJfR0VUX1NFQ1VSRUJJVFMgMjcKKyNkZWZpbmUgUFJfU0VUX1NFQ1VSRUJJVFMgMjgKKworLyoKKyAqIEdldC9zZXQgdGhlIHRpbWVyc2xhY2sgYXMgdXNlZCBieSBwb2xsL3NlbGVjdC9uYW5vc2xlZXAKKyAqIEEgdmFsdWUgb2YgMCBtZWFucyAidXNlIGRlZmF1bHQiCisgKi8KKyNkZWZpbmUgUFJfU0VUX1RJTUVSU0xBQ0sgMjkKKyNkZWZpbmUgUFJfR0VUX1RJTUVSU0xBQ0sgMzAKKworI2RlZmluZSBQUl9UQVNLX1BFUkZfRVZFTlRTX0RJU0FCTEUJCTMxCisjZGVmaW5lIFBSX1RBU0tfUEVSRl9FVkVOVFNfRU5BQkxFCQkzMgorCisvKgorICogU2V0IGVhcmx5L2xhdGUga2lsbCBtb2RlIGZvciBod3BvaXNvbiBtZW1vcnkgY29ycnVwdGlvbi4KKyAqIFRoaXMgaW5mbHVlbmNlcyB3aGVuIHRoZSBwcm9jZXNzIGdldHMga2lsbGVkIG9uIGEgbWVtb3J5IGNvcnJ1cHRpb24uCisgKi8KKyNkZWZpbmUgUFJfTUNFX0tJTEwJMzMKKyMgZGVmaW5lIFBSX01DRV9LSUxMX0NMRUFSICAgMAorIyBkZWZpbmUgUFJfTUNFX0tJTExfU0VUICAgICAxCisKKyMgZGVmaW5lIFBSX01DRV9LSUxMX0xBVEUgICAgMAorIyBkZWZpbmUgUFJfTUNFX0tJTExfRUFSTFkgICAxCisjIGRlZmluZSBQUl9NQ0VfS0lMTF9ERUZBVUxUIDIKKworI2RlZmluZSBQUl9NQ0VfS0lMTF9HRVQgMzQKKworLyoKKyAqIFR1bmUgdXAgcHJvY2VzcyBtZW1vcnkgbWFwIHNwZWNpZmljcy4KKyAqLworI2RlZmluZSBQUl9TRVRfTU0JCTM1CisjIGRlZmluZSBQUl9TRVRfTU1fU1RBUlRfQ09ERQkJMQorIyBkZWZpbmUgUFJfU0VUX01NX0VORF9DT0RFCQkyCisjIGRlZmluZSBQUl9TRVRfTU1fU1RBUlRfREFUQQkJMworIyBkZWZpbmUgUFJfU0VUX01NX0VORF9EQVRBCQk0CisjIGRlZmluZSBQUl9TRVRfTU1fU1RBUlRfU1RBQ0sJCTUKKyMgZGVmaW5lIFBSX1NFVF9NTV9TVEFSVF9CUksJCTYKKyMgZGVmaW5lIFBSX1NFVF9NTV9CUksJCQk3CisKKy8qCisgKiBTZXQgc3BlY2lmaWMgcGlkIHRoYXQgaXMgYWxsb3dlZCB0byBwdHJhY2UgdGhlIGN1cnJlbnQgdGFzay4KKyAqIEEgdmFsdWUgb2YgMCBtZWFuICJubyBwcm9jZXNzIi4KKyAqLworI2RlZmluZSBQUl9TRVRfUFRSQUNFUiAweDU5NjE2ZDYxCisjIGRlZmluZSBQUl9TRVRfUFRSQUNFUl9BTlkgKCh1bnNpZ25lZCBsb25nKS0xKQorCisvKgorICogSWYgbm9fbmV3X3ByaXZzIGlzIHNldCwgdGhlbiBvcGVyYXRpb25zIHRoYXQgZ3JhbnQgbmV3IHByaXZpbGVnZXMgKGkuZS4KKyAqIGV4ZWN2ZSkgd2lsbCBlaXRoZXIgZmFpbCBvciBub3QgZ3JhbnQgdGhlbS4gIFRoaXMgYWZmZWN0cyBzdWlkL3NnaWQsCisgKiBmaWxlIGNhcGFiaWxpdGllcywgYW5kIExTTXMuCisgKgorICogT3BlcmF0aW9ucyB0aGF0IG1lcmVseSBtYW5pcHVsYXRlIG9yIGRyb3AgZXhpc3RpbmcgcHJpdmlsZWdlcyAoc2V0cmVzdWlkLAorICogY2Fwc2V0LCBldGMuKSB3aWxsIHN0aWxsIHdvcmsuICBEcm9wIHRob3NlIHByaXZpbGVnZXMgaWYgeW91IHdhbnQgdGhlbSBnb25lLgorICoKKyAqIENoYW5naW5nIExTTSBzZWN1cml0eSBkb21haW4gaXMgY29uc2lkZXJlZCBhIG5ldyBwcml2aWxlZ2UuICBTbywgZm9yIGV4YW1wbGUsCisgKiBhc2tpbmcgc2VsaW51eCBmb3IgYSBzcGVjaWZpYyBuZXcgY29udGV4dCAoZS5nLiB3aXRoIHJ1bmNvbikgd2lsbCByZXN1bHQKKyAqIGluIGV4ZWN2ZSByZXR1cm5pbmcgLUVQRVJNLgorICovCisjZGVmaW5lIFBSX1NFVF9OT19ORVdfUFJJVlMgMzgKKyNkZWZpbmUgUFJfR0VUX05PX05FV19QUklWUyAzOQorCisjZW5kaWYgLyogX0xJTlVYX1BSQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHRwX2Nsb2NrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3B0cF9jbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTk4MWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3B0cF9jbG9jay5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBQVFAgMTU4OCBjbG9jayBzdXBwb3J0IC0gdXNlciBzcGFjZSBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgT01JQ1JPTiBlbGVjdHJvbmljcyBHbWJICisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9QVFBfQ0xPQ0tfSF8KKyNkZWZpbmUgX1BUUF9DTE9DS19IXworCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBQVFBfeHh4IGJpdHMsIGZvciB0aGUgZmxhZ3MgZmllbGQgd2l0aGluIHRoZSByZXF1ZXN0IHN0cnVjdHVyZXMuICovCisjZGVmaW5lIFBUUF9FTkFCTEVfRkVBVFVSRSAoMTw8MCkKKyNkZWZpbmUgUFRQX1JJU0lOR19FREdFICAgICgxPDwxKQorI2RlZmluZSBQVFBfRkFMTElOR19FREdFICAgKDE8PDIpCisKKy8qCisgKiBzdHJ1Y3QgcHRwX2Nsb2NrX3RpbWUgLSByZXByZXNlbnRzIGEgdGltZSB2YWx1ZQorICoKKyAqIFRoZSBzaWduIG9mIHRoZSBzZWNvbmRzIGZpZWxkIGFwcGxpZXMgdG8gdGhlIHdob2xlIHZhbHVlLiBUaGUKKyAqIG5hbm9zZWNvbmRzIGZpZWxkIGlzIGFsd2F5cyB1bnNpZ25lZC4gVGhlIHJlc2VydmVkIGZpZWxkIGlzCisgKiBpbmNsdWRlZCBmb3Igc3ViLW5hbm9zZWNvbmQgcmVzb2x1dGlvbiwgc2hvdWxkIHRoZSBkZW1hbmQgZm9yCisgKiB0aGlzIGV2ZXIgYXBwZWFyLgorICoKKyAqLworc3RydWN0IHB0cF9jbG9ja190aW1lIHsKKwlfX3M2NCBzZWM7ICAvKiBzZWNvbmRzICovCisJX191MzIgbnNlYzsgLyogbmFub3NlY29uZHMgKi8KKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBwdHBfY2xvY2tfY2FwcyB7CisJaW50IG1heF9hZGo7ICAgLyogTWF4aW11bSBmcmVxdWVuY3kgYWRqdXN0bWVudCBpbiBwYXJ0cyBwZXIgYmlsbG9uLiAqLworCWludCBuX2FsYXJtOyAgIC8qIE51bWJlciBvZiBwcm9ncmFtbWFibGUgYWxhcm1zLiAqLworCWludCBuX2V4dF90czsgIC8qIE51bWJlciBvZiBleHRlcm5hbCB0aW1lIHN0YW1wIGNoYW5uZWxzLiAqLworCWludCBuX3Blcl9vdXQ7IC8qIE51bWJlciBvZiBwcm9ncmFtbWFibGUgcGVyaW9kaWMgc2lnbmFscy4gKi8KKwlpbnQgcHBzOyAgICAgICAvKiBXaGV0aGVyIHRoZSBjbG9jayBzdXBwb3J0cyBhIFBQUyBjYWxsYmFjay4gKi8KKwlpbnQgcnN2WzE1XTsgICAvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gKi8KK307CisKK3N0cnVjdCBwdHBfZXh0dHNfcmVxdWVzdCB7CisJdW5zaWduZWQgaW50IGluZGV4OyAgLyogV2hpY2ggY2hhbm5lbCB0byBjb25maWd1cmUuICovCisJdW5zaWduZWQgaW50IGZsYWdzOyAgLyogQml0IGZpZWxkIGZvciBQVFBfeHh4IGZsYWdzLiAqLworCXVuc2lnbmVkIGludCByc3ZbMl07IC8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAqLworfTsKKworc3RydWN0IHB0cF9wZXJvdXRfcmVxdWVzdCB7CisJc3RydWN0IHB0cF9jbG9ja190aW1lIHN0YXJ0OyAgLyogQWJzb2x1dGUgc3RhcnQgdGltZS4gKi8KKwlzdHJ1Y3QgcHRwX2Nsb2NrX3RpbWUgcGVyaW9kOyAvKiBEZXNpcmVkIHBlcmlvZCwgemVybyBtZWFucyBkaXNhYmxlLiAqLworCXVuc2lnbmVkIGludCBpbmRleDsgICAgICAgICAgIC8qIFdoaWNoIGNoYW5uZWwgdG8gY29uZmlndXJlLiAqLworCXVuc2lnbmVkIGludCBmbGFnczsgICAgICAgICAgIC8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAqLworCXVuc2lnbmVkIGludCByc3ZbNF07ICAgICAgICAgIC8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAqLworfTsKKworI2RlZmluZSBQVFBfQ0xLX01BR0lDICc9JworCisjZGVmaW5lIFBUUF9DTE9DS19HRVRDQVBTICBfSU9SKFBUUF9DTEtfTUFHSUMsIDEsIHN0cnVjdCBwdHBfY2xvY2tfY2FwcykKKyNkZWZpbmUgUFRQX0VYVFRTX1JFUVVFU1QgIF9JT1coUFRQX0NMS19NQUdJQywgMiwgc3RydWN0IHB0cF9leHR0c19yZXF1ZXN0KQorI2RlZmluZSBQVFBfUEVST1VUX1JFUVVFU1QgX0lPVyhQVFBfQ0xLX01BR0lDLCAzLCBzdHJ1Y3QgcHRwX3Blcm91dF9yZXF1ZXN0KQorI2RlZmluZSBQVFBfRU5BQkxFX1BQUyAgICAgX0lPVyhQVFBfQ0xLX01BR0lDLCA0LCBpbnQpCisKK3N0cnVjdCBwdHBfZXh0dHNfZXZlbnQgeworCXN0cnVjdCBwdHBfY2xvY2tfdGltZSB0OyAvKiBUaW1lIGV2ZW50IG9jY3VyZWQuICovCisJdW5zaWduZWQgaW50IGluZGV4OyAgICAgIC8qIFdoaWNoIGNoYW5uZWwgcHJvZHVjZWQgdGhlIGV2ZW50LiAqLworCXVuc2lnbmVkIGludCBmbGFnczsgICAgICAvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gKi8KKwl1bnNpZ25lZCBpbnQgcnN2WzJdOyAgICAgLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHRyYWNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OTcyMzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCkBAIC0wLDAgKzEsODIgQEAKKyNpZm5kZWYgX0xJTlVYX1BUUkFDRV9ICisjZGVmaW5lIF9MSU5VWF9QVFJBQ0VfSAorLyogcHRyYWNlLmggKi8KKy8qIHN0cnVjdHMgYW5kIGRlZmluZXMgdG8gaGVscCB0aGUgdXNlciB1c2UgdGhlIHB0cmFjZSBzeXN0ZW0gY2FsbC4gKi8KKworLyogaGFzIHRoZSBkZWZpbmVzIHRvIGdldCBhdCB0aGUgcmVnaXN0ZXJzLiAqLworCisjZGVmaW5lIFBUUkFDRV9UUkFDRU1FCQkgICAwCisjZGVmaW5lIFBUUkFDRV9QRUVLVEVYVAkJICAgMQorI2RlZmluZSBQVFJBQ0VfUEVFS0RBVEEJCSAgIDIKKyNkZWZpbmUgUFRSQUNFX1BFRUtVU1IJCSAgIDMKKyNkZWZpbmUgUFRSQUNFX1BPS0VURVhUCQkgICA0CisjZGVmaW5lIFBUUkFDRV9QT0tFREFUQQkJICAgNQorI2RlZmluZSBQVFJBQ0VfUE9LRVVTUgkJICAgNgorI2RlZmluZSBQVFJBQ0VfQ09OVAkJICAgNworI2RlZmluZSBQVFJBQ0VfS0lMTAkJICAgOAorI2RlZmluZSBQVFJBQ0VfU0lOR0xFU1RFUAkgICA5CisKKyNkZWZpbmUgUFRSQUNFX0FUVEFDSAkJICAxNgorI2RlZmluZSBQVFJBQ0VfREVUQUNICQkgIDE3CisKKyNkZWZpbmUgUFRSQUNFX1NZU0NBTEwJCSAgMjQKKworLyogMHg0MjAwLTB4NDMwMCBhcmUgcmVzZXJ2ZWQgZm9yIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBhZGRpdGlvbnMuICAqLworI2RlZmluZSBQVFJBQ0VfU0VUT1BUSU9OUwkweDQyMDAKKyNkZWZpbmUgUFRSQUNFX0dFVEVWRU5UTVNHCTB4NDIwMQorI2RlZmluZSBQVFJBQ0VfR0VUU0lHSU5GTwkweDQyMDIKKyNkZWZpbmUgUFRSQUNFX1NFVFNJR0lORk8JMHg0MjAzCisKKy8qCisgKiBHZW5lcmljIHB0cmFjZSBpbnRlcmZhY2UgdGhhdCBleHBvcnRzIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgcmVnc2V0cworICogdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgTlRfKiB0eXBlcyAod2hpY2ggYXJlIGFsc28gdXNlZCBpbiB0aGUgY29yZSBkdW1wKS4KKyAqIFBsZWFzZSBub3RlIHRoYXQgdGhlIE5UX1BSU1RBVFVTIG5vdGUgdHlwZSBpbiBhIGNvcmUgZHVtcCBjb250YWlucyBhIGZ1bGwKKyAqICdzdHJ1Y3QgZWxmX3Byc3RhdHVzJy4gQnV0IHRoZSB1c2VyX3JlZ3NldCBmb3IgTlRfUFJTVEFUVVMgY29udGFpbnMganVzdCB0aGUKKyAqIGVsZl9ncmVnc2V0X3QgdGhhdCBpcyB0aGUgcHJfcmVnIGZpZWxkIG9mICdzdHJ1Y3QgZWxmX3Byc3RhdHVzJy4gRm9yIGFsbCB0aGUKKyAqIG90aGVyIHVzZXJfcmVnc2V0IGZsYXZvcnMsIHRoZSB1c2VyX3JlZ3NldCBsYXlvdXQgYW5kIHRoZSBFTEYgY29yZSBkdW1wIG5vdGUKKyAqIHBheWxvYWQgYXJlIGV4YWN0bHkgdGhlIHNhbWUgbGF5b3V0LgorICoKKyAqIFRoaXMgaW50ZXJmYWNlIHVzYWdlIGlzIGFzIGZvbGxvd3M6CisgKglzdHJ1Y3QgaW92ZWMgaW92ID0geyBidWYsIGxlbn07CisgKgorICoJcmV0ID0gcHRyYWNlKFBUUkFDRV9HRVRSRUdTRVQvUFRSQUNFX1NFVFJFR1NFVCwgcGlkLCBOVF9YWFhfVFlQRSwgJmlvdik7CisgKgorICogT24gdGhlIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiwgaW92LmxlbiB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlIGtlcm5lbCwKKyAqIHNwZWNpZnlpbmcgaG93IG11Y2ggdGhlIGtlcm5lbCBoYXMgd3JpdHRlbi9yZWFkIHRvL2Zyb20gdGhlIHVzZXIncyBpb3YuYnVmLgorICovCisjZGVmaW5lIFBUUkFDRV9HRVRSRUdTRVQJMHg0MjA0CisjZGVmaW5lIFBUUkFDRV9TRVRSRUdTRVQJMHg0MjA1CisKKyNkZWZpbmUgUFRSQUNFX1NFSVpFCQkweDQyMDYKKyNkZWZpbmUgUFRSQUNFX0lOVEVSUlVQVAkweDQyMDcKKyNkZWZpbmUgUFRSQUNFX0xJU1RFTgkJMHg0MjA4CisKKy8qIGZsYWdzIGluIEBkYXRhIGZvciBQVFJBQ0VfU0VJWkUgKi8KKyNkZWZpbmUgUFRSQUNFX1NFSVpFX0RFVkVMCTB4ODAwMDAwMDAgLyogdGVtcCBmbGFnIGZvciBkZXZlbG9wbWVudCAqLworCisvKiBvcHRpb25zIHNldCB1c2luZyBQVFJBQ0VfU0VUT1BUSU9OUyAqLworI2RlZmluZSBQVFJBQ0VfT19UUkFDRVNZU0dPT0QJMHgwMDAwMDAwMQorI2RlZmluZSBQVFJBQ0VfT19UUkFDRUZPUksJMHgwMDAwMDAwMgorI2RlZmluZSBQVFJBQ0VfT19UUkFDRVZGT1JLCTB4MDAwMDAwMDQKKyNkZWZpbmUgUFRSQUNFX09fVFJBQ0VDTE9ORQkweDAwMDAwMDA4CisjZGVmaW5lIFBUUkFDRV9PX1RSQUNFRVhFQwkweDAwMDAwMDEwCisjZGVmaW5lIFBUUkFDRV9PX1RSQUNFVkZPUktET05FCTB4MDAwMDAwMjAKKyNkZWZpbmUgUFRSQUNFX09fVFJBQ0VFWElUCTB4MDAwMDAwNDAKKyNkZWZpbmUgUFRSQUNFX09fVFJBQ0VTRUNDT01QCTB4MDAwMDAwODAKKworI2RlZmluZSBQVFJBQ0VfT19NQVNLCQkweDAwMDAwMGZmCisKKy8qIFdhaXQgZXh0ZW5kZWQgcmVzdWx0IGNvZGVzIGZvciB0aGUgYWJvdmUgdHJhY2Ugb3B0aW9ucy4gICovCisjZGVmaW5lIFBUUkFDRV9FVkVOVF9GT1JLCTEKKyNkZWZpbmUgUFRSQUNFX0VWRU5UX1ZGT1JLCTIKKyNkZWZpbmUgUFRSQUNFX0VWRU5UX0NMT05FCTMKKyNkZWZpbmUgUFRSQUNFX0VWRU5UX0VYRUMJNAorI2RlZmluZSBQVFJBQ0VfRVZFTlRfVkZPUktfRE9ORQk1CisjZGVmaW5lIFBUUkFDRV9FVkVOVF9FWElUCTYKKyNkZWZpbmUgUFRSQUNFX0VWRU5UX1NUT1AJNworI2RlZmluZSBQVFJBQ0VfRVZFTlRfU0VDQ09NUAk4CisKKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3FueDRfZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcW54NF9mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOWFlZTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3FueDRfZnMuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgOiBxbng0X2ZzLmgKKyAqICBBdXRob3IgICAgICAgICAgICAgICAgICAgICAgIDogUmljaGFyZCBGcm93aWpuCisgKiAgRnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICA6IHFueDQgZ2xvYmFsIGZpbGVzeXN0ZW0gZGVmaW5pdGlvbnMKKyAqICBIaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgIDogMjMtMDMtMTk5OCBjcmVhdGVkCisgKi8KKyNpZm5kZWYgX0xJTlVYX1FOWDRfRlNfSAorI2RlZmluZSBfTElOVVhfUU5YNF9GU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3FueHR5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworI2RlZmluZSBRTlg0X1JPT1RfSU5PIDEKKworI2RlZmluZSBRTlg0X01BWF9YVE5UU19QRVJfWEJMSwk2MAorLyogZm9yIGRpX3N0YXR1cyAqLworI2RlZmluZSBRTlg0X0ZJTEVfVVNFRCAgICAgICAgICAweDAxCisjZGVmaW5lIFFOWDRfRklMRV9NT0RJRklFRCAgICAgIDB4MDIKKyNkZWZpbmUgUU5YNF9GSUxFX0JVU1kgICAgICAgICAgMHgwNAorI2RlZmluZSBRTlg0X0ZJTEVfTElOSyAgICAgICAgICAweDA4CisjZGVmaW5lIFFOWDRfRklMRV9JTk9ERSAgICAgICAgIDB4MTAKKyNkZWZpbmUgUU5YNF9GSUxFX0ZTWVNDTEVBTiAgICAgMHgyMAorCisjZGVmaW5lIFFOWDRfSV9NQVBfU0xPVFMJOAorI2RlZmluZSBRTlg0X1pfTUFQX1NMT1RTCTY0CisjZGVmaW5lIFFOWDRfVkFMSURfRlMJCTB4MDAwMQkvKiBDbGVhbiBmcy4gKi8KKyNkZWZpbmUgUU5YNF9FUlJPUl9GUwkJMHgwMDAyCS8qIGZzIGhhcyBlcnJvcnMuICovCisjZGVmaW5lIFFOWDRfQkxPQ0tfU0laRSAgICAgICAgIDB4MjAwCS8qIGJsb2Nrc2l6ZSBvZiA1MTIgYnl0ZXMgKi8KKyNkZWZpbmUgUU5YNF9CTE9DS19TSVpFX0JJVFMgICAgOQkvKiBibG9ja3NpemUgc2hpZnQgKi8KKyNkZWZpbmUgUU5YNF9ESVJfRU5UUllfU0laRSAgICAgMHgwNDAJLyogZGlyIGVudHJ5IHNpemUgb2YgNjQgYnl0ZXMgKi8KKyNkZWZpbmUgUU5YNF9ESVJfRU5UUllfU0laRV9CSVRTIDYJLyogZGlyIGVudHJ5IHNpemUgc2hpZnQgKi8KKyNkZWZpbmUgUU5YNF9YQkxLX0VOVFJZX1NJWkUgICAgMHgyMDAJLyogeGJsayBlbnRyeSBzaXplICovCisjZGVmaW5lIFFOWDRfSU5PREVTX1BFUl9CTE9DSyAgIDB4MDgJLyogNTEyIC8gNjQgKi8KKworLyogZm9yIGZpbGVuYW1lcyAqLworI2RlZmluZSBRTlg0X1NIT1JUX05BTUVfTUFYCTE2CisjZGVmaW5lIFFOWDRfTkFNRV9NQVgJCTQ4CisKKy8qCisgKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBxbng0IGlub2RlIGxheW91dCBvbiBkaXNrLgorICovCitzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSB7CisJY2hhcgkJZGlfZm5hbWVbUU5YNF9TSE9SVF9OQU1FX01BWF07CisJcW54NF9vZmZfdAlkaV9zaXplOworCXFueDRfeHRudF90CWRpX2ZpcnN0X3h0bnQ7CisJX19sZTMyCQlkaV94YmxrOworCV9fbGUzMgkJZGlfZnRpbWU7CisJX19sZTMyCQlkaV9tdGltZTsKKwlfX2xlMzIJCWRpX2F0aW1lOworCV9fbGUzMgkJZGlfY3RpbWU7CisJcW54NF9ueHRudF90CWRpX251bV94dG50czsKKwlxbng0X21vZGVfdAlkaV9tb2RlOworCXFueDRfbXVpZF90CWRpX3VpZDsKKwlxbng0X21naWRfdAlkaV9naWQ7CisJcW54NF9ubGlua190CWRpX25saW5rOworCV9fdTgJCWRpX3plcm9bNF07CisJcW54NF9mdHlwZV90CWRpX3R5cGU7CisJX191OAkJZGlfc3RhdHVzOworfTsKKworc3RydWN0IHFueDRfbGlua19pbmZvIHsKKwljaGFyCQlkbF9mbmFtZVtRTlg0X05BTUVfTUFYXTsKKwlfX2xlMzIJCWRsX2lub2RlX2JsazsKKwlfX3U4CQlkbF9pbm9kZV9uZHg7CisJX191OAkJZGxfc3BhcmVbMTBdOworCV9fdTgJCWRsX3N0YXR1czsKK307CisKK3N0cnVjdCBxbng0X3hibGsgeworCV9fbGUzMgkJeGJsa19uZXh0X3hibGs7CisJX19sZTMyCQl4YmxrX3ByZXZfeGJsazsKKwlfX3U4CQl4YmxrX251bV94dG50czsKKwlfX3U4CQl4YmxrX3NwYXJlWzNdOworCV9fbGUzMgkJeGJsa19udW1fYmxvY2tzOworCXFueDRfeHRudF90CXhibGtfeHRudHNbUU5YNF9NQVhfWFROVFNfUEVSX1hCTEtdOworCWNoYXIJCXhibGtfc2lnbmF0dXJlWzhdOworCXFueDRfeHRudF90CXhibGtfZmlyc3RfeHRudDsKK307CisKK3N0cnVjdCBxbng0X3N1cGVyX2Jsb2NrIHsKKwlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSBSb290RGlyOworCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5IElub2RlOworCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5IEJvb3Q7CisJc3RydWN0IHFueDRfaW5vZGVfZW50cnkgQWx0Qm9vdDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9xbnh0eXBlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9xbnh0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYmJlNWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3FueHR5cGVzLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqICBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgIDogcW54dHlwZXMuaAorICogIEF1dGhvciAgICAgICAgICAgICAgICAgICAgICAgOiBSaWNoYXJkIEZyb3dpam4KKyAqICBGdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgIDogc3RhbmRhcmQgcW54IHR5cGVzCisgKiAgSGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICA6IDIyLTAzLTE5OTggY3JlYXRlZAorICoKKyAqLworCisjaWZuZGVmIF9RTlg0VFlQRVNfSAorI2RlZmluZSBfUU5YNFRZUEVTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3R5cGVkZWYgX19sZTE2IHFueDRfbnh0bnRfdDsKK3R5cGVkZWYgX191OCAgcW54NF9mdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTMyIHh0bnRfYmxrOworCV9fbGUzMiB4dG50X3NpemU7Cit9IHFueDRfeHRudF90OworCit0eXBlZGVmIF9fbGUxNiBxbng0X21vZGVfdDsKK3R5cGVkZWYgX19sZTE2IHFueDRfbXVpZF90OwordHlwZWRlZiBfX2xlMTYgcW54NF9tZ2lkX3Q7Cit0eXBlZGVmIF9fbGUzMiBxbng0X29mZl90OwordHlwZWRlZiBfX2xlMTYgcW54NF9ubGlua190OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcXVvdGEuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcXVvdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZkNjE0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9xdW90YS5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogUm9iZXJ0IEVseiBhdCBUaGUgVW5pdmVyc2l0eSBvZiBNZWxib3VybmUuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1FVT1RBXworI2RlZmluZSBfTElOVVhfUVVPVEFfCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgX19EUVVPVF9WRVJTSU9OX18JImRxdW90XzYuNS4yIgorCisjZGVmaW5lIE1BWFFVT1RBUyAyCisjZGVmaW5lIFVTUlFVT1RBICAwCQkvKiBlbGVtZW50IHVzZWQgZm9yIHVzZXIgcXVvdGFzICovCisjZGVmaW5lIEdSUFFVT1RBICAxCQkvKiBlbGVtZW50IHVzZWQgZm9yIGdyb3VwIHF1b3RhcyAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBkZWZhdWx0IG5hbWVzIG9mIHRoZSBxdW90YXMgZmlsZXMuCisgKi8KKyNkZWZpbmUgSU5JVFFGTkFNRVMgeyBcCisJInVzZXIiLCAgICAvKiBVU1JRVU9UQSAqLyBcCisJImdyb3VwIiwgICAvKiBHUlBRVU9UQSAqLyBcCisJInVuZGVmaW5lZCIsIFwKK307CisKKy8qCisgKiBDb21tYW5kIGRlZmluaXRpb25zIGZvciB0aGUgJ3F1b3RhY3RsJyBzeXN0ZW0gY2FsbC4KKyAqIFRoZSBjb21tYW5kcyBhcmUgYnJva2VuIGludG8gYSBtYWluIGNvbW1hbmQgZGVmaW5lZCBiZWxvdworICogYW5kIGEgc3ViY29tbWFuZCB0aGF0IGlzIHVzZWQgdG8gY29udmV5IHRoZSB0eXBlIG9mCisgKiBxdW90YSB0aGF0IGlzIGJlaW5nIG1hbmlwdWxhdGVkIChzZWUgYWJvdmUpLgorICovCisjZGVmaW5lIFNVQkNNRE1BU0sgIDB4MDBmZgorI2RlZmluZSBTVUJDTURTSElGVCA4CisjZGVmaW5lIFFDTUQoY21kLCB0eXBlKSAgKCgoY21kKSA8PCBTVUJDTURTSElGVCkgfCAoKHR5cGUpICYgU1VCQ01ETUFTSykpCisKKyNkZWZpbmUgUV9TWU5DICAgICAweDgwMDAwMQkvKiBzeW5jIGRpc2sgY29weSBvZiBhIGZpbGVzeXN0ZW1zIHF1b3RhcyAqLworI2RlZmluZSBRX1FVT1RBT04gIDB4ODAwMDAyCS8qIHR1cm4gcXVvdGFzIG9uICovCisjZGVmaW5lIFFfUVVPVEFPRkYgMHg4MDAwMDMJLyogdHVybiBxdW90YXMgb2ZmICovCisjZGVmaW5lIFFfR0VURk1UICAgMHg4MDAwMDQJLyogZ2V0IHF1b3RhIGZvcm1hdCB1c2VkIG9uIGdpdmVuIGZpbGVzeXN0ZW0gKi8KKyNkZWZpbmUgUV9HRVRJTkZPICAweDgwMDAwNQkvKiBnZXQgaW5mb3JtYXRpb24gYWJvdXQgcXVvdGEgZmlsZXMgKi8KKyNkZWZpbmUgUV9TRVRJTkZPICAweDgwMDAwNgkvKiBzZXQgaW5mb3JtYXRpb24gYWJvdXQgcXVvdGEgZmlsZXMgKi8KKyNkZWZpbmUgUV9HRVRRVU9UQSAweDgwMDAwNwkvKiBnZXQgdXNlciBxdW90YSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgUV9TRVRRVU9UQSAweDgwMDAwOAkvKiBzZXQgdXNlciBxdW90YSBzdHJ1Y3R1cmUgKi8KKworLyogUXVvdGEgZm9ybWF0IHR5cGUgSURzICovCisjZGVmaW5lCVFGTVRfVkZTX09MRCAxCisjZGVmaW5lCVFGTVRfVkZTX1YwIDIKKyNkZWZpbmUgUUZNVF9PQ0ZTMiAzCisjZGVmaW5lCVFGTVRfVkZTX1YxIDQKKworLyogU2l6ZSBvZiBibG9jayBpbiB3aGljaCBzcGFjZSBsaW1pdHMgYXJlIHBhc3NlZCB0aHJvdWdoIHRoZSBxdW90YQorICogaW50ZXJmYWNlICovCisjZGVmaW5lIFFJRl9EUUJMS1NJWkVfQklUUyAxMAorI2RlZmluZSBRSUZfRFFCTEtTSVpFICgxIDw8IFFJRl9EUUJMS1NJWkVfQklUUykKKworLyoKKyAqIFF1b3RhIHN0cnVjdHVyZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdXNlcnNwYWNlIHZpYSBxdW90YWN0bAorICogRm9sbG93aW5nIGZsYWdzIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIGFyZSB2YWxpZAorICovCitlbnVtIHsKKwlRSUZfQkxJTUlUU19CID0gMCwKKwlRSUZfU1BBQ0VfQiwKKwlRSUZfSUxJTUlUU19CLAorCVFJRl9JTk9ERVNfQiwKKwlRSUZfQlRJTUVfQiwKKwlRSUZfSVRJTUVfQiwKK307CisKKyNkZWZpbmUgUUlGX0JMSU1JVFMJKDEgPDwgUUlGX0JMSU1JVFNfQikKKyNkZWZpbmUgUUlGX1NQQUNFCSgxIDw8IFFJRl9TUEFDRV9CKQorI2RlZmluZSBRSUZfSUxJTUlUUwkoMSA8PCBRSUZfSUxJTUlUU19CKQorI2RlZmluZSBRSUZfSU5PREVTCSgxIDw8IFFJRl9JTk9ERVNfQikKKyNkZWZpbmUgUUlGX0JUSU1FCSgxIDw8IFFJRl9CVElNRV9CKQorI2RlZmluZSBRSUZfSVRJTUUJKDEgPDwgUUlGX0lUSU1FX0IpCisjZGVmaW5lIFFJRl9MSU1JVFMJKFFJRl9CTElNSVRTIHwgUUlGX0lMSU1JVFMpCisjZGVmaW5lIFFJRl9VU0FHRQkoUUlGX1NQQUNFIHwgUUlGX0lOT0RFUykKKyNkZWZpbmUgUUlGX1RJTUVTCShRSUZfQlRJTUUgfCBRSUZfSVRJTUUpCisjZGVmaW5lIFFJRl9BTEwJCShRSUZfTElNSVRTIHwgUUlGX1VTQUdFIHwgUUlGX1RJTUVTKQorCitzdHJ1Y3QgaWZfZHFibGsgeworCV9fdTY0IGRxYl9iaGFyZGxpbWl0OworCV9fdTY0IGRxYl9ic29mdGxpbWl0OworCV9fdTY0IGRxYl9jdXJzcGFjZTsKKwlfX3U2NCBkcWJfaWhhcmRsaW1pdDsKKwlfX3U2NCBkcWJfaXNvZnRsaW1pdDsKKwlfX3U2NCBkcWJfY3VyaW5vZGVzOworCV9fdTY0IGRxYl9idGltZTsKKwlfX3U2NCBkcWJfaXRpbWU7CisJX191MzIgZHFiX3ZhbGlkOworfTsKKworLyoKKyAqIFN0cnVjdHVyZSB1c2VkIGZvciBzZXR0aW5nIHF1b3RhIGluZm9ybWF0aW9uIGFib3V0IGZpbGUgdmlhIHF1b3RhY3RsCisgKiBGb2xsb3dpbmcgZmxhZ3MgYXJlIHVzZWQgdG8gc3BlY2lmeSB3aGljaCBmaWVsZHMgYXJlIHZhbGlkCisgKi8KKyNkZWZpbmUgSUlGX0JHUkFDRQkxCisjZGVmaW5lIElJRl9JR1JBQ0UJMgorI2RlZmluZSBJSUZfRkxBR1MJNAorI2RlZmluZSBJSUZfQUxMCQkoSUlGX0JHUkFDRSB8IElJRl9JR1JBQ0UgfCBJSUZfRkxBR1MpCisKK3N0cnVjdCBpZl9kcWluZm8geworCV9fdTY0IGRxaV9iZ3JhY2U7CisJX191NjQgZHFpX2lncmFjZTsKKwlfX3UzMiBkcWlfZmxhZ3M7CisJX191MzIgZHFpX3ZhbGlkOworfTsKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBxdW90YSBuZXRsaW5rIGludGVyZmFjZQorICovCisjZGVmaW5lIFFVT1RBX05MX05PV0FSTiAwCisjZGVmaW5lIFFVT1RBX05MX0lIQVJEV0FSTiAxCQkvKiBJbm9kZSBoYXJkbGltaXQgcmVhY2hlZCAqLworI2RlZmluZSBRVU9UQV9OTF9JU09GVExPTkdXQVJOIDIgCS8qIElub2RlIGdyYWNlIHRpbWUgZXhwaXJlZCAqLworI2RlZmluZSBRVU9UQV9OTF9JU09GVFdBUk4gMwkJLyogSW5vZGUgc29mdGxpbWl0IHJlYWNoZWQgKi8KKyNkZWZpbmUgUVVPVEFfTkxfQkhBUkRXQVJOIDQJCS8qIEJsb2NrIGhhcmRsaW1pdCByZWFjaGVkICovCisjZGVmaW5lIFFVT1RBX05MX0JTT0ZUTE9OR1dBUk4gNQkvKiBCbG9jayBncmFjZSB0aW1lIGV4cGlyZWQgKi8KKyNkZWZpbmUgUVVPVEFfTkxfQlNPRlRXQVJOIDYJCS8qIEJsb2NrIHNvZnRsaW1pdCByZWFjaGVkICovCisjZGVmaW5lIFFVT1RBX05MX0lIQVJEQkVMT1cgNwkJLyogVXNhZ2UgZ290IGJlbG93IGlub2RlIGhhcmRsaW1pdCAqLworI2RlZmluZSBRVU9UQV9OTF9JU09GVEJFTE9XIDgJCS8qIFVzYWdlIGdvdCBiZWxvdyBpbm9kZSBzb2Z0bGltaXQgKi8KKyNkZWZpbmUgUVVPVEFfTkxfQkhBUkRCRUxPVyA5CQkvKiBVc2FnZSBnb3QgYmVsb3cgYmxvY2sgaGFyZGxpbWl0ICovCisjZGVmaW5lIFFVT1RBX05MX0JTT0ZUQkVMT1cgMTAJCS8qIFVzYWdlIGdvdCBiZWxvdyBibG9jayBzb2Z0bGltaXQgKi8KKworZW51bSB7CisJUVVPVEFfTkxfQ19VTlNQRUMsCisJUVVPVEFfTkxfQ19XQVJOSU5HLAorCV9fUVVPVEFfTkxfQ19NQVgsCit9OworI2RlZmluZSBRVU9UQV9OTF9DX01BWCAoX19RVU9UQV9OTF9DX01BWCAtIDEpCisKK2VudW0geworCVFVT1RBX05MX0FfVU5TUEVDLAorCVFVT1RBX05MX0FfUVRZUEUsCisJUVVPVEFfTkxfQV9FWENFU1NfSUQsCisJUVVPVEFfTkxfQV9XQVJOSU5HLAorCVFVT1RBX05MX0FfREVWX01BSk9SLAorCVFVT1RBX05MX0FfREVWX01JTk9SLAorCVFVT1RBX05MX0FfQ0FVU0VEX0lELAorCV9fUVVPVEFfTkxfQV9NQVgsCit9OworI2RlZmluZSBRVU9UQV9OTF9BX01BWCAoX19RVU9UQV9OTF9BX01BWCAtIDEpCisKKworI2VuZGlmIC8qIF9RVU9UQV8gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFkZW9uZmIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFkZW9uZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzRiYmRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yYWRlb25mYi5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX19MSU5VWF9SQURFT05GQl9IX18KKyNkZWZpbmUgX19MSU5VWF9SQURFT05GQl9IX18KKworI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgQVRZX1JBREVPTl9MQ0RfT04JMHgwMDAwMDAwMQorI2RlZmluZSBBVFlfUkFERU9OX0NSVF9PTgkweDAwMDAwMDAyCisKKworI2RlZmluZSBGQklPX1JBREVPTl9HRVRfTUlSUk9SCV9JT1IoJ0AnLCAzLCBzaXplX3QpCisjZGVmaW5lIEZCSU9fUkFERU9OX1NFVF9NSVJST1IJX0lPVygnQCcsIDQsIHNpemVfdCkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFpZC9tZF9wLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYzZkMWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICAgbWRfcC5oIDogcGh5c2ljYWwgbGF5b3V0IG9mIExpbnV4IFJBSUQgZGV2aWNlcworICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni05OCBJbmdvIE1vbG5hciwgR2FkaSBPeG1hbgorCSAgCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgKGZvciBleGFtcGxlIC91c3Ivc3JjL2xpbnV4L0NPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gIAorKi8KKworI2lmbmRlZiBfTURfUF9ICisjZGVmaW5lIF9NRF9QX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBSQUlEIHN1cGVyYmxvY2suCisgKgorICogVGhlIFJBSUQgc3VwZXJibG9jayBtYWludGFpbnMgc29tZSBzdGF0aXN0aWNzIG9uIGVhY2ggUkFJRCBjb25maWd1cmF0aW9uLgorICogRWFjaCByZWFsIGRldmljZSBpbiB0aGUgUkFJRCBzZXQgY29udGFpbnMgaXQgbmVhciB0aGUgZW5kIG9mIHRoZSBkZXZpY2UuCisgKiBTb21lIG9mIHRoZSBpZGVhcyBhcmUgY29waWVkIGZyb20gdGhlIGV4dDJmcyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBXZSBjdXJyZW50bHkgdXNlIDQwOTYgYnl0ZXMgYXMgZm9sbG93czoKKyAqCisgKgl3b3JkIG9mZnNldAlmdW5jdGlvbgorICoKKyAqCSAgIDAgIC0gICAgMzEJQ29uc3RhbnQgZ2VuZXJpYyBSQUlEIGRldmljZSBpbmZvcm1hdGlvbi4KKyAqICAgICAgICAzMiAgLSAgICA2MyAgIEdlbmVyaWMgc3RhdGUgaW5mb3JtYXRpb24uCisgKgkgIDY0ICAtICAgMTI3CVBlcnNvbmFsaXR5IHNwZWNpZmljIGluZm9ybWF0aW9uLgorICoJIDEyOCAgLSAgIDUxMQkxMiAzMi13b3JkcyBkZXNjcmlwdG9ycyBvZiB0aGUgZGlza3MgaW4gdGhlIHJhaWQgc2V0LgorICoJIDUxMiAgLSAgIDkxMQlSZXNlcnZlZC4KKyAqCSA5MTIgIC0gIDEwMjMJRGlzayBzcGVjaWZpYyBkZXNjcmlwdG9yLgorICovCisKKy8qCisgKiBJZiB4IGlzIHRoZSByZWFsIGRldmljZSBzaXplIGluIGJ5dGVzLCB3ZSByZXR1cm4gYW4gYXBwYXJlbnQgc2l6ZSBvZjoKKyAqCisgKgl5ID0gKHggJiB+KE1EX1JFU0VSVkVEX0JZVEVTIC0gMSkpIC0gTURfUkVTRVJWRURfQllURVMKKyAqCisgKiBhbmQgcGxhY2UgdGhlIDRrQiBzdXBlcmJsb2NrIGF0IG9mZnNldCB5LgorICovCisjZGVmaW5lIE1EX1JFU0VSVkVEX0JZVEVTCQkoNjQgKiAxMDI0KQorI2RlZmluZSBNRF9SRVNFUlZFRF9TRUNUT1JTCQkoTURfUkVTRVJWRURfQllURVMgLyA1MTIpCisKKyNkZWZpbmUgTURfTkVXX1NJWkVfU0VDVE9SUyh4KQkJKCh4ICYgfihNRF9SRVNFUlZFRF9TRUNUT1JTIC0gMSkpIC0gTURfUkVTRVJWRURfU0VDVE9SUykKKworI2RlZmluZSBNRF9TQl9CWVRFUwkJCTQwOTYKKyNkZWZpbmUgTURfU0JfV09SRFMJCQkoTURfU0JfQllURVMgLyA0KQorI2RlZmluZSBNRF9TQl9TRUNUT1JTCQkJKE1EX1NCX0JZVEVTIC8gNTEyKQorCisvKgorICogVGhlIGZvbGxvd2luZyBhcmUgY291bnRlZCBpbiAzMi1iaXQgd29yZHMKKyAqLworI2RlZmluZQlNRF9TQl9HRU5FUklDX09GRlNFVAkJMAorI2RlZmluZSBNRF9TQl9QRVJTT05BTElUWV9PRkZTRVQJNjQKKyNkZWZpbmUgTURfU0JfRElTS1NfT0ZGU0VUCQkxMjgKKyNkZWZpbmUgTURfU0JfREVTQ1JJUFRPUl9PRkZTRVQJCTk5MgorCisjZGVmaW5lIE1EX1NCX0dFTkVSSUNfQ09OU1RBTlRfV09SRFMJMzIKKyNkZWZpbmUgTURfU0JfR0VORVJJQ19TVEFURV9XT1JEUwkzMgorI2RlZmluZSBNRF9TQl9HRU5FUklDX1dPUkRTCQkoTURfU0JfR0VORVJJQ19DT05TVEFOVF9XT1JEUyArIE1EX1NCX0dFTkVSSUNfU1RBVEVfV09SRFMpCisjZGVmaW5lIE1EX1NCX1BFUlNPTkFMSVRZX1dPUkRTCQk2NAorI2RlZmluZSBNRF9TQl9ERVNDUklQVE9SX1dPUkRTCQkzMgorI2RlZmluZSBNRF9TQl9ESVNLUwkJCTI3CisjZGVmaW5lIE1EX1NCX0RJU0tTX1dPUkRTCQkoTURfU0JfRElTS1MqTURfU0JfREVTQ1JJUFRPUl9XT1JEUykKKyNkZWZpbmUgTURfU0JfUkVTRVJWRURfV09SRFMJCSgxMDI0IC0gTURfU0JfR0VORVJJQ19XT1JEUyAtIE1EX1NCX1BFUlNPTkFMSVRZX1dPUkRTIC0gTURfU0JfRElTS1NfV09SRFMgLSBNRF9TQl9ERVNDUklQVE9SX1dPUkRTKQorI2RlZmluZSBNRF9TQl9FUVVBTF9XT1JEUwkJKE1EX1NCX0dFTkVSSUNfV09SRFMgKyBNRF9TQl9QRVJTT05BTElUWV9XT1JEUyArIE1EX1NCX0RJU0tTX1dPUkRTKQorCisvKgorICogRGV2aWNlICJvcGVyYXRpb25hbCIgc3RhdGUgYml0cworICovCisjZGVmaW5lIE1EX0RJU0tfRkFVTFRZCQkwIC8qIGRpc2sgaXMgZmF1bHR5IC8gb3BlcmF0aW9uYWwgKi8KKyNkZWZpbmUgTURfRElTS19BQ1RJVkUJCTEgLyogZGlzayBpcyBydW5uaW5nIG9yIHNwYXJlIGRpc2sgKi8KKyNkZWZpbmUgTURfRElTS19TWU5DCQkyIC8qIGRpc2sgaXMgaW4gc3luYyB3aXRoIHRoZSByYWlkIHNldCAqLworI2RlZmluZSBNRF9ESVNLX1JFTU9WRUQJCTMgLyogZGlzayBpcyBpbiBzeW5jIHdpdGggdGhlIHJhaWQgc2V0ICovCisKKyNkZWZpbmUJTURfRElTS19XUklURU1PU1RMWQk5IC8qIGRpc2sgaXMgIndyaXRlLW1vc3RseSIgaXMgUkFJRDEgY29uZmlnLgorCQkJCSAgICogcmVhZCByZXF1ZXN0cyB3aWxsIG9ubHkgYmUgc2VudCBoZXJlIGluCisJCQkJICAgKiBkaXJlIG5lZWQKKwkJCQkgICAqLworCit0eXBlZGVmIHN0cnVjdCBtZHBfZGV2aWNlX2Rlc2NyaXB0b3JfcyB7CisJX191MzIgbnVtYmVyOwkJLyogMCBEZXZpY2UgbnVtYmVyIGluIHRoZSBlbnRpcmUgc2V0CSAgICAgICovCisJX191MzIgbWFqb3I7CQkvKiAxIERldmljZSBtYWpvciBudW1iZXIJCSAgICAgICovCisJX191MzIgbWlub3I7CQkvKiAyIERldmljZSBtaW5vciBudW1iZXIJCSAgICAgICovCisJX191MzIgcmFpZF9kaXNrOwkvKiAzIFRoZSByb2xlIG9mIHRoZSBkZXZpY2UgaW4gdGhlIHJhaWQgc2V0ICAgKi8KKwlfX3UzMiBzdGF0ZTsJCS8qIDQgT3BlcmF0aW9uYWwgc3RhdGUJCQkgICAgICAqLworCV9fdTMyIHJlc2VydmVkW01EX1NCX0RFU0NSSVBUT1JfV09SRFMgLSA1XTsKK30gbWRwX2Rpc2tfdDsKKworI2RlZmluZSBNRF9TQl9NQUdJQwkJMHhhOTJiNGVmYworCisvKgorICogU3VwZXJibG9jayBzdGF0ZSBiaXRzCisgKi8KKyNkZWZpbmUgTURfU0JfQ0xFQU4JCTAKKyNkZWZpbmUgTURfU0JfRVJST1JTCQkxCisKKyNkZWZpbmUJTURfU0JfQklUTUFQX1BSRVNFTlQJOCAvKiBiaXRtYXAgbWF5IGJlIHByZXNlbnQgbmVhcmJ5ICovCisKKy8qCisgKiBOb3RlczoKKyAqIC0gaWYgYW4gYXJyYXkgaXMgYmVpbmcgcmVzaGFwZWQgKHJlc3RyaXBlZCkgaW4gb3JkZXIgdG8gY2hhbmdlIHRoZQorICogICB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBkZXZpY2VzIGluIHRoZSBhcnJheSwgJ3JhaWRfZGlza3MnIHdpbGwgYmUKKyAqICAgdGhlIGxhcmdlciBvZiB0aGUgb2xkIGFuZCBuZXcgbnVtYmVycy4gICdkZWx0YV9kaXNrcycgd2lsbAorICogICBiZSB0aGUgIm5ldyAtIG9sZCIuICBTbyBpZiArdmUsIHJhaWRfZGlza3MgaXMgdGhlIG5ldyB2YWx1ZSwgYW5kCisgKiAgICJyYWlkX2Rpc2tzLWRlbHRhX2Rpc2tzIiBpcyB0aGUgb2xkLiAgSWYgLXZlLCByYWlkX2Rpc2tzIGlzIHRoZQorICogICBvbGQgdmFsdWUgYW5kICJyYWlkX2Rpc2tzK2RlbHRhX2Rpc2tzIiBpcyB0aGUgbmV3IChzbWFsbGVyKSB2YWx1ZS4KKyAqLworCisKK3R5cGVkZWYgc3RydWN0IG1kcF9zdXBlcmJsb2NrX3MgeworCS8qCisJICogQ29uc3RhbnQgZ2VuZXJpYyBpbmZvcm1hdGlvbgorCSAqLworCV9fdTMyIG1kX21hZ2ljOwkJLyogIDAgTUQgaWRlbnRpZmllciAJCQkgICAgICAqLworCV9fdTMyIG1ham9yX3ZlcnNpb247CS8qICAxIG1ham9yIHZlcnNpb24gdG8gd2hpY2ggdGhlIHNldCBjb25mb3JtcyAqLworCV9fdTMyIG1pbm9yX3ZlcnNpb247CS8qICAyIG1pbm9yIHZlcnNpb24gLi4uCQkJICAgICAgKi8KKwlfX3UzMiBwYXRjaF92ZXJzaW9uOwkvKiAgMyBwYXRjaGxldmVsIHZlcnNpb24gLi4uCQkgICAgICAqLworCV9fdTMyIGd2YWxpZF93b3JkczsJLyogIDQgTnVtYmVyIG9mIHVzZWQgd29yZHMgaW4gdGhpcyBzZWN0aW9uICAgICovCisJX191MzIgc2V0X3V1aWQwOwkvKiAgNSBSYWlkIHNldCBpZGVudGlmaWVyCQkgICAgICAqLworCV9fdTMyIGN0aW1lOwkJLyogIDYgQ3JlYXRpb24gdGltZQkJCSAgICAgICovCisJX191MzIgbGV2ZWw7CQkvKiAgNyBSYWlkIHBlcnNvbmFsaXR5CQkJICAgICAgKi8KKwlfX3UzMiBzaXplOwkJLyogIDggQXBwYXJlbnQgc2l6ZSBvZiBlYWNoIGluZGl2aWR1YWwgZGlzayAgICovCisJX191MzIgbnJfZGlza3M7CQkvKiAgOSB0b3RhbCBkaXNrcyBpbiB0aGUgcmFpZCBzZXQJICAgICAgKi8KKwlfX3UzMiByYWlkX2Rpc2tzOwkvKiAxMCBkaXNrcyBpbiBhIGZ1bGx5IGZ1bmN0aW9uYWwgcmFpZCBzZXQgICAgKi8KKwlfX3UzMiBtZF9taW5vcjsJCS8qIDExIHByZWZlcnJlZCBNRCBtaW5vciBkZXZpY2UgbnVtYmVyCSAgICAgICovCisJX191MzIgbm90X3BlcnNpc3RlbnQ7CS8qIDEyIGRvZXMgaXQgaGF2ZSBhIHBlcnNpc3RlbnQgc3VwZXJibG9jayAgICAqLworCV9fdTMyIHNldF91dWlkMTsJLyogMTMgUmFpZCBzZXQgaWRlbnRpZmllciAjMgkJICAgICAgKi8KKwlfX3UzMiBzZXRfdXVpZDI7CS8qIDE0IFJhaWQgc2V0IGlkZW50aWZpZXIgIzMJCSAgICAgICovCisJX191MzIgc2V0X3V1aWQzOwkvKiAxNSBSYWlkIHNldCBpZGVudGlmaWVyICM0CQkgICAgICAqLworCV9fdTMyIGdzdGF0ZV9jcmVzZXJ2ZWRbTURfU0JfR0VORVJJQ19DT05TVEFOVF9XT1JEUyAtIDE2XTsKKworCS8qCisJICogR2VuZXJpYyBzdGF0ZSBpbmZvcm1hdGlvbgorCSAqLworCV9fdTMyIHV0aW1lOwkJLyogIDAgU3VwZXJibG9jayB1cGRhdGUgdGltZQkJICAgICAgKi8KKwlfX3UzMiBzdGF0ZTsJCS8qICAxIFN0YXRlIGJpdHMgKGNsZWFuLCAuLi4pCQkgICAgICAqLworCV9fdTMyIGFjdGl2ZV9kaXNrczsJLyogIDIgTnVtYmVyIG9mIGN1cnJlbnRseSBhY3RpdmUgZGlza3MJICAgICAgKi8KKwlfX3UzMiB3b3JraW5nX2Rpc2tzOwkvKiAgMyBOdW1iZXIgb2Ygd29ya2luZyBkaXNrcwkJICAgICAgKi8KKwlfX3UzMiBmYWlsZWRfZGlza3M7CS8qICA0IE51bWJlciBvZiBmYWlsZWQgZGlza3MJCSAgICAgICovCisJX191MzIgc3BhcmVfZGlza3M7CS8qICA1IE51bWJlciBvZiBzcGFyZSBkaXNrcwkJICAgICAgKi8KKwlfX3UzMiBzYl9jc3VtOwkJLyogIDYgY2hlY2tzdW0gb2YgdGhlIHdob2xlIHN1cGVyYmxvY2sgICAgICAgICovCisjaWZkZWYgX19CSUdfRU5ESUFOCisJX191MzIgZXZlbnRzX2hpOwkvKiAgNyBoaWdoLW9yZGVyIG9mIHN1cGVyYmxvY2sgdXBkYXRlIGNvdW50ICAgKi8KKwlfX3UzMiBldmVudHNfbG87CS8qICA4IGxvdy1vcmRlciBvZiBzdXBlcmJsb2NrIHVwZGF0ZSBjb3VudCAgICAqLworCV9fdTMyIGNwX2V2ZW50c19oaTsJLyogIDkgaGlnaC1vcmRlciBvZiBjaGVja3BvaW50IHVwZGF0ZSBjb3VudCAgICovCisJX191MzIgY3BfZXZlbnRzX2xvOwkvKiAxMCBsb3ctb3JkZXIgb2YgY2hlY2twb2ludCB1cGRhdGUgY291bnQgICAgKi8KKyNlbHNlCisJX191MzIgZXZlbnRzX2xvOwkvKiAgNyBsb3ctb3JkZXIgb2Ygc3VwZXJibG9jayB1cGRhdGUgY291bnQgICAgKi8KKwlfX3UzMiBldmVudHNfaGk7CS8qICA4IGhpZ2gtb3JkZXIgb2Ygc3VwZXJibG9jayB1cGRhdGUgY291bnQgICAqLworCV9fdTMyIGNwX2V2ZW50c19sbzsJLyogIDkgbG93LW9yZGVyIG9mIGNoZWNrcG9pbnQgdXBkYXRlIGNvdW50ICAgICovCisJX191MzIgY3BfZXZlbnRzX2hpOwkvKiAxMCBoaWdoLW9yZGVyIG9mIGNoZWNrcG9pbnQgdXBkYXRlIGNvdW50ICAgKi8KKyNlbmRpZgorCV9fdTMyIHJlY292ZXJ5X2NwOwkvKiAxMSByZWNvdmVyeSBjaGVja3BvaW50IHNlY3RvciBjb3VudAkgICAgICAqLworCS8qIFRoZXJlIGFyZSBvbmx5IHZhbGlkIGZvciBtaW5vcl92ZXJzaW9uID4gOTAgKi8KKwlfX3U2NCByZXNoYXBlX3Bvc2l0aW9uOwkvKiAxMiwxMyBuZXh0IGFkZHJlc3MgaW4gYXJyYXktc3BhY2UgZm9yIHJlc2hhcGUgKi8KKwlfX3UzMiBuZXdfbGV2ZWw7CS8qIDE0IG5ldyBsZXZlbCB3ZSBhcmUgcmVzaGFwaW5nIHRvCSAgICAgICovCisJX191MzIgZGVsdGFfZGlza3M7CS8qIDE1IGNoYW5nZSBpbiBudW1iZXIgb2YgcmFpZF9kaXNrcwkgICAgICAqLworCV9fdTMyIG5ld19sYXlvdXQ7CS8qIDE2IG5ldyBsYXlvdXQJCQkgICAgICAqLworCV9fdTMyIG5ld19jaHVuazsJLyogMTcgbmV3IGNodW5rIHNpemUgKGJ5dGVzKQkJICAgICAgKi8KKwlfX3UzMiBnc3RhdGVfc3Jlc2VydmVkW01EX1NCX0dFTkVSSUNfU1RBVEVfV09SRFMgLSAxOF07CisKKwkvKgorCSAqIFBlcnNvbmFsaXR5IGluZm9ybWF0aW9uCisJICovCisJX191MzIgbGF5b3V0OwkJLyogIDAgdGhlIGFycmF5J3MgcGh5c2ljYWwgbGF5b3V0CSAgICAgICovCisJX191MzIgY2h1bmtfc2l6ZTsJLyogIDEgY2h1bmsgc2l6ZSBpbiBieXRlcwkJICAgICAgKi8KKwlfX3UzMiByb290X3B2OwkJLyogIDIgTFYgcm9vdCBQViAqLworCV9fdTMyIHJvb3RfYmxvY2s7CS8qICAzIExWIHJvb3QgYmxvY2sgKi8KKwlfX3UzMiBwc3RhdGVfcmVzZXJ2ZWRbTURfU0JfUEVSU09OQUxJVFlfV09SRFMgLSA0XTsKKworCS8qCisJICogRGlza3MgaW5mb3JtYXRpb24KKwkgKi8KKwltZHBfZGlza190IGRpc2tzW01EX1NCX0RJU0tTXTsKKworCS8qCisJICogUmVzZXJ2ZWQKKwkgKi8KKwlfX3UzMiByZXNlcnZlZFtNRF9TQl9SRVNFUlZFRF9XT1JEU107CisKKwkvKgorCSAqIEFjdGl2ZSBkZXNjcmlwdG9yCisJICovCisJbWRwX2Rpc2tfdCB0aGlzX2Rpc2s7CisKK30gbWRwX3N1cGVyX3Q7CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTY0IG1kX2V2ZW50KG1kcF9zdXBlcl90ICpzYikgeworCV9fdTY0IGV2ID0gc2ItPmV2ZW50c19oaTsKKwlyZXR1cm4gKGV2PDwzMil8IHNiLT5ldmVudHNfbG87Cit9CisKKyNkZWZpbmUgTURfU1VQRVJCTE9DS18xX1RJTUVfU0VDX01BU0sgKCgxVUxMPDw0MCkgLSAxKQorCisvKgorICogVGhlIHZlcnNpb24tMSBzdXBlcmJsb2NrIDoKKyAqIEFsbCBudW1lcmljIGZpZWxkcyBhcmUgbGl0dGxlLWVuZGlhbi4KKyAqCisgKiB0b3RhbCBzaXplOiAyNTYgYnl0ZXMgcGx1cyAyIHBlciBkZXZpY2UuCisgKiAgMUsgYWxsb3dzIDM4NCBkZXZpY2VzLgorICovCitzdHJ1Y3QgbWRwX3N1cGVyYmxvY2tfMSB7CisJLyogY29uc3RhbnQgYXJyYXkgaW5mb3JtYXRpb24gLSAxMjggYnl0ZXMgKi8KKwlfX2xlMzIJbWFnaWM7CQkvKiBNRF9TQl9NQUdJQzogMHhhOTJiNGVmYyAtIGxpdHRsZSBlbmRpYW4gKi8KKwlfX2xlMzIJbWFqb3JfdmVyc2lvbjsJLyogMSAqLworCV9fbGUzMglmZWF0dXJlX21hcDsJLyogYml0IDAgc2V0IGlmICdiaXRtYXBfb2Zmc2V0JyBpcyBtZWFuaW5nZnVsICovCisJX19sZTMyCXBhZDA7CQkvKiBhbHdheXMgc2V0IHRvIDAgd2hlbiB3cml0aW5nICovCisKKwlfX3U4CXNldF91dWlkWzE2XTsJLyogdXNlci1zcGFjZSBnZW5lcmF0ZWQuICovCisJY2hhcglzZXRfbmFtZVszMl07CS8qIHNldCBhbmQgaW50ZXJwcmV0ZWQgYnkgdXNlci1zcGFjZSAqLworCisJX19sZTY0CWN0aW1lOwkJLyogbG8gNDAgYml0cyBhcmUgc2Vjb25kcywgdG9wIDI0IGFyZSBtaWNyb3NlY29uZHMgb3IgMCovCisJX19sZTMyCWxldmVsOwkJLyogLTQgKG11bHRpcGF0aCksIC0xIChsaW5lYXIpLCAwLDEsNCw1ICovCisJX19sZTMyCWxheW91dDsJCS8qIG9ubHkgZm9yIHJhaWQ1IGFuZCByYWlkMTAgY3VycmVudGx5ICovCisJX19sZTY0CXNpemU7CQkvKiB1c2VkIHNpemUgb2YgY29tcG9uZW50IGRldmljZXMsIGluIDUxMmJ5dGUgc2VjdG9ycyAqLworCisJX19sZTMyCWNodW5rc2l6ZTsJLyogaW4gNTEyYnl0ZSBzZWN0b3JzICovCisJX19sZTMyCXJhaWRfZGlza3M7CisJX19sZTMyCWJpdG1hcF9vZmZzZXQ7CS8qIHNlY3RvcnMgYWZ0ZXIgc3RhcnQgb2Ygc3VwZXJibG9jayB0aGF0IGJpdG1hcCBzdGFydHMKKwkJCQkgKiBOT1RFOiBzaWduZWQsIHNvIGJpdG1hcCBjYW4gYmUgYmVmb3JlIHN1cGVyYmxvY2sKKwkJCQkgKiBvbmx5IG1lYW5pbmdmdWwgb2YgZmVhdHVyZV9tYXBbMF0gaXMgc2V0LgorCQkJCSAqLworCisJLyogVGhlc2UgYXJlIG9ubHkgdmFsaWQgd2l0aCBmZWF0dXJlIGJpdCAnNCcgKi8KKwlfX2xlMzIJbmV3X2xldmVsOwkvKiBuZXcgbGV2ZWwgd2UgYXJlIHJlc2hhcGluZyB0bwkJKi8KKwlfX2xlNjQJcmVzaGFwZV9wb3NpdGlvbjsJLyogbmV4dCBhZGRyZXNzIGluIGFycmF5LXNwYWNlIGZvciByZXNoYXBlICovCisJX19sZTMyCWRlbHRhX2Rpc2tzOwkvKiBjaGFuZ2UgaW4gbnVtYmVyIG9mIHJhaWRfZGlza3MJCSovCisJX19sZTMyCW5ld19sYXlvdXQ7CS8qIG5ldyBsYXlvdXQJCQkJCSovCisJX19sZTMyCW5ld19jaHVuazsJLyogbmV3IGNodW5rIHNpemUgKDUxMmJ5dGUgc2VjdG9ycykJCSovCisJX191OAlwYWQxWzEyOC0xMjRdOwkvKiBzZXQgdG8gMCB3aGVuIHdyaXR0ZW4gKi8KKworCS8qIGNvbnN0YW50IHRoaXMtZGV2aWNlIGluZm9ybWF0aW9uIC0gNjQgYnl0ZXMgKi8KKwlfX2xlNjQJZGF0YV9vZmZzZXQ7CS8qIHNlY3RvciBzdGFydCBvZiBkYXRhLCBvZnRlbiAwICovCisJX19sZTY0CWRhdGFfc2l6ZTsJLyogc2VjdG9ycyBpbiB0aGlzIGRldmljZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBkYXRhICovCisJX19sZTY0CXN1cGVyX29mZnNldDsJLyogc2VjdG9yIHN0YXJ0IG9mIHRoaXMgc3VwZXJibG9jayAqLworCV9fbGU2NAlyZWNvdmVyeV9vZmZzZXQ7Lyogc2VjdG9ycyBiZWZvcmUgdGhpcyBvZmZzZXQgKGZyb20gZGF0YV9vZmZzZXQpIGhhdmUgYmVlbiByZWNvdmVyZWQgKi8KKwlfX2xlMzIJZGV2X251bWJlcjsJLyogcGVybWFuZW50IGlkZW50aWZpZXIgb2YgdGhpcyAgZGV2aWNlIC0gbm90IHJvbGUgaW4gcmFpZCAqLworCV9fbGUzMgljbnRfY29ycmVjdGVkX3JlYWQ7IC8qIG51bWJlciBvZiByZWFkIGVycm9ycyB0aGF0IHdlcmUgY29ycmVjdGVkIGJ5IHJlLXdyaXRpbmcgKi8KKwlfX3U4CWRldmljZV91dWlkWzE2XTsgLyogdXNlci1zcGFjZSBzZXRhYmxlLCBpZ25vcmVkIGJ5IGtlcm5lbCAqLworCV9fdTgJZGV2ZmxhZ3M7CS8qIHBlci1kZXZpY2UgZmxhZ3MuICBPbmx5IG9uZSBkZWZpbmVkLi4uKi8KKyNkZWZpbmUJV3JpdGVNb3N0bHkxCTEJLyogbWFzayBmb3Igd3JpdGVtb3N0bHkgZmxhZyBpbiBhYm92ZSAqLworCS8qIEJhZCBibG9jayBsb2cuICBJZiB0aGVyZSBhcmUgYW55IGJhZCBibG9ja3MgdGhlIGZlYXR1cmUgZmxhZyBpcyBzZXQuCisJICogSWYgb2Zmc2V0IGFuZCBzaXplIGFyZSBub24temVybywgdGhhdCBzcGFjZSBpcyByZXNlcnZlZCBhbmQgYXZhaWxhYmxlCisJICovCisJX191OAliYmxvZ19zaGlmdDsJLyogc2hpZnQgZnJvbSBzZWN0b3JzIHRvIGJsb2NrIHNpemUgKi8KKwlfX2xlMTYJYmJsb2dfc2l6ZTsJLyogbnVtYmVyIG9mIHNlY3RvcnMgcmVzZXJ2ZWQgZm9yIGxpc3QgKi8KKwlfX2xlMzIJYmJsb2dfb2Zmc2V0OwkvKiBzZWN0b3Igb2Zmc2V0IGZyb20gc3VwZXJibG9jayB0byBiYmxvZywKKwkJCQkgKiBzaWduZWQgLSBub3QgdW5zaWduZWQgKi8KKworCS8qIGFycmF5IHN0YXRlIGluZm9ybWF0aW9uIC0gNjQgYnl0ZXMgKi8KKwlfX2xlNjQJdXRpbWU7CQkvKiA0MCBiaXRzIHNlY29uZCwgMjQgYml0cyBtaWNyb3NlY29uZHMgKi8KKwlfX2xlNjQJZXZlbnRzOwkJLyogaW5jcmVtZW50ZWQgd2hlbiBzdXBlcmJsb2NrIHVwZGF0ZWQgKi8KKwlfX2xlNjQJcmVzeW5jX29mZnNldDsJLyogZGF0YSBiZWZvcmUgdGhpcyBvZmZzZXQgKGZyb20gZGF0YV9vZmZzZXQpIGtub3duIHRvIGJlIGluIHN5bmMgKi8KKwlfX2xlMzIJc2JfY3N1bTsJLyogY2hlY2tzdW0gdXAgdG8gZGV2c1ttYXhfZGV2XSAqLworCV9fbGUzMgltYXhfZGV2OwkvKiBzaXplIG9mIGRldnNbXSBhcnJheSB0byBjb25zaWRlciAqLworCV9fdTgJcGFkM1s2NC0zMl07CS8qIHNldCB0byAwIHdoZW4gd3JpdGluZyAqLworCisJLyogZGV2aWNlIHN0YXRlIGluZm9ybWF0aW9uLiBJbmRleGVkIGJ5IGRldl9udW1iZXIuCisJICogMiBieXRlcyBwZXIgZGV2aWNlCisJICogTm90ZSB0aGVyZSBhcmUgbm8gcGVyLWRldmljZSBzdGF0ZSBmbGFncy4gU3RhdGUgaW5mb3JtYXRpb24gaXMgcm9sbGVkCisJICogaW50byB0aGUgJ3JvbGVzJyB2YWx1ZS4gIElmIGEgZGV2aWNlIGlzIHNwYXJlIG9yIGZhdWx0eSwgdGhlbiBpdCBkb2Vzbid0CisJICogaGF2ZSBhIG1lYW5pbmdmdWwgcm9sZS4KKwkgKi8KKwlfX2xlMTYJZGV2X3JvbGVzWzBdOwkvKiByb2xlIGluIGFycmF5LCBvciAweGZmZmYgZm9yIGEgc3BhcmUsIG9yIDB4ZmZmZSBmb3IgZmF1bHR5ICovCit9OworCisvKiBmZWF0dXJlX21hcCBiaXRzICovCisjZGVmaW5lIE1EX0ZFQVRVUkVfQklUTUFQX09GRlNFVAkxCisjZGVmaW5lCU1EX0ZFQVRVUkVfUkVDT1ZFUllfT0ZGU0VUCTIgLyogcmVjb3Zlcnlfb2Zmc2V0IGlzIHByZXNlbnQgYW5kCisJCQkJCSAgICogbXVzdCBiZSBob25vdXJlZAorCQkJCQkgICAqLworI2RlZmluZQlNRF9GRUFUVVJFX1JFU0hBUEVfQUNUSVZFCTQKKyNkZWZpbmUJTURfRkVBVFVSRV9CQURfQkxPQ0tTCQk4IC8qIGJhZGJsb2NrIGxpc3QgaXMgbm90IGVtcHR5ICovCisKKyNkZWZpbmUJTURfRkVBVFVSRV9BTEwJCQkoMXwyfDR8OCkKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yYWlkL21kX3UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFpZC9tZF91LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4NWE3ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFpZC9tZF91LmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgICBtZF91LmggOiB1c2VyIDw9PiBrZXJuZWwgQVBJIGJldHdlZW4gTGludXggcmFpZHRvb2xzIGFuZCBSQUlEIGRyaXZlcnMKKyAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTggSW5nbyBNb2xuYXIKKwkgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIChmb3IgZXhhbXBsZSAvdXNyL3NyYy9saW51eC9DT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAKKyovCisKKyNpZm5kZWYgX01EX1VfSAorI2RlZmluZSBfTURfVV9ICisKKy8qCisgKiBEaWZmZXJlbnQgbWFqb3IgdmVyc2lvbnMgYXJlIG5vdCBjb21wYXRpYmxlLgorICogRGlmZmVyZW50IG1pbm9yIHZlcnNpb25zIGFyZSBvbmx5IGRvd253YXJkIGNvbXBhdGlibGUuCisgKiBEaWZmZXJlbnQgcGF0Y2hsZXZlbCB2ZXJzaW9ucyBhcmUgZG93bndhcmQgYW5kIHVwd2FyZCBjb21wYXRpYmxlLgorICovCisjZGVmaW5lIE1EX01BSk9SX1ZFUlNJT04gICAgICAgICAgICAgICAgMAorI2RlZmluZSBNRF9NSU5PUl9WRVJTSU9OICAgICAgICAgICAgICAgIDkwCisvKgorICogTURfUEFUQ0hMRVZFTF9WRVJTSU9OIGluZGljYXRlcyBrZXJuZWwgZnVuY3Rpb25hbGl0eS4KKyAqID49MSBtZWFucyBkaWZmZXJlbnQgc3VwZXJibG9jayBmb3JtYXRzIGFyZSBzZWxlY3RhYmxlIHVzaW5nIFNFVF9BUlJBWV9JTkZPCisgKiAgICAgYW5kIG1ham9yX3ZlcnNpb24vbWlub3JfdmVyc2lvbiBhY2NvcmRpbmdseQorICogPj0yIG1lYW5zIHRoYXQgSW50ZXJuYWwgYml0bWFwcyBhcmUgc3VwcG9ydGVkIGJ5IHNldHRpbmcgTURfU0JfQklUTUFQX1BSRVNFTlQKKyAqICAgICBpbiB0aGUgc3VwZXIgc3RhdHVzIGJ5dGUKKyAqID49MyBtZWFucyB0aGF0IGJpdG1hcCBzdXBlcmJsb2NrIHZlcnNpb24gNCBpcyBzdXBwb3J0ZWQsIHdoaWNoIHVzZXMKKyAqICAgICBsaXR0bGUtZW5kaW5nIHJlcHJlc2VudGF0aW9uIHJhdGhlciB0aGFuIGhvc3QtZW5kaWFuCisgKi8KKyNkZWZpbmUgTURfUEFUQ0hMRVZFTF9WRVJTSU9OICAgICAgICAgICAzCisKKy8qIGlvY3RscyAqLworCisvKiBzdGF0dXMgKi8KKyNkZWZpbmUgUkFJRF9WRVJTSU9OCQlfSU9SIChNRF9NQUpPUiwgMHgxMCwgbWR1X3ZlcnNpb25fdCkKKyNkZWZpbmUgR0VUX0FSUkFZX0lORk8JCV9JT1IgKE1EX01BSk9SLCAweDExLCBtZHVfYXJyYXlfaW5mb190KQorI2RlZmluZSBHRVRfRElTS19JTkZPCQlfSU9SIChNRF9NQUpPUiwgMHgxMiwgbWR1X2Rpc2tfaW5mb190KQorI2RlZmluZSBQUklOVF9SQUlEX0RFQlVHCV9JTyAoTURfTUFKT1IsIDB4MTMpCisjZGVmaW5lIFJBSURfQVVUT1JVTgkJX0lPIChNRF9NQUpPUiwgMHgxNCkKKyNkZWZpbmUgR0VUX0JJVE1BUF9GSUxFCQlfSU9SIChNRF9NQUpPUiwgMHgxNSwgbWR1X2JpdG1hcF9maWxlX3QpCisKKy8qIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQ0xFQVJfQVJSQVkJCV9JTyAoTURfTUFKT1IsIDB4MjApCisjZGVmaW5lIEFERF9ORVdfRElTSwkJX0lPVyAoTURfTUFKT1IsIDB4MjEsIG1kdV9kaXNrX2luZm9fdCkKKyNkZWZpbmUgSE9UX1JFTU9WRV9ESVNLCQlfSU8gKE1EX01BSk9SLCAweDIyKQorI2RlZmluZSBTRVRfQVJSQVlfSU5GTwkJX0lPVyAoTURfTUFKT1IsIDB4MjMsIG1kdV9hcnJheV9pbmZvX3QpCisjZGVmaW5lIFNFVF9ESVNLX0lORk8JCV9JTyAoTURfTUFKT1IsIDB4MjQpCisjZGVmaW5lIFdSSVRFX1JBSURfSU5GTwkJX0lPIChNRF9NQUpPUiwgMHgyNSkKKyNkZWZpbmUgVU5QUk9URUNUX0FSUkFZCQlfSU8gKE1EX01BSk9SLCAweDI2KQorI2RlZmluZSBQUk9URUNUX0FSUkFZCQlfSU8gKE1EX01BSk9SLCAweDI3KQorI2RlZmluZSBIT1RfQUREX0RJU0sJCV9JTyAoTURfTUFKT1IsIDB4MjgpCisjZGVmaW5lIFNFVF9ESVNLX0ZBVUxUWQkJX0lPIChNRF9NQUpPUiwgMHgyOSkKKyNkZWZpbmUgSE9UX0dFTkVSQVRFX0VSUk9SCV9JTyAoTURfTUFKT1IsIDB4MmEpCisjZGVmaW5lIFNFVF9CSVRNQVBfRklMRQkJX0lPVyAoTURfTUFKT1IsIDB4MmIsIGludCkKKworLyogdXNhZ2UgKi8KKyNkZWZpbmUgUlVOX0FSUkFZCQlfSU9XIChNRF9NQUpPUiwgMHgzMCwgbWR1X3BhcmFtX3QpCisvKiAgMHgzMSB3YXMgU1RBUlRfQVJSQVkgICovCisjZGVmaW5lIFNUT1BfQVJSQVkJCV9JTyAoTURfTUFKT1IsIDB4MzIpCisjZGVmaW5lIFNUT1BfQVJSQVlfUk8JCV9JTyAoTURfTUFKT1IsIDB4MzMpCisjZGVmaW5lIFJFU1RBUlRfQVJSQVlfUlcJX0lPIChNRF9NQUpPUiwgMHgzNCkKKworLyogNjMgcGFydGl0aW9ucyB3aXRoIHRoZSBhbHRlcm5hdGUgbWFqb3IgbnVtYmVyIChtZHApICovCisjZGVmaW5lIE1kcE1pbm9yU2hpZnQgNgorCit0eXBlZGVmIHN0cnVjdCBtZHVfdmVyc2lvbl9zIHsKKwlpbnQgbWFqb3I7CisJaW50IG1pbm9yOworCWludCBwYXRjaGxldmVsOworfSBtZHVfdmVyc2lvbl90OworCit0eXBlZGVmIHN0cnVjdCBtZHVfYXJyYXlfaW5mb19zIHsKKwkvKgorCSAqIEdlbmVyaWMgY29uc3RhbnQgaW5mb3JtYXRpb24KKwkgKi8KKwlpbnQgbWFqb3JfdmVyc2lvbjsKKwlpbnQgbWlub3JfdmVyc2lvbjsKKwlpbnQgcGF0Y2hfdmVyc2lvbjsKKwlpbnQgY3RpbWU7CisJaW50IGxldmVsOworCWludCBzaXplOworCWludCBucl9kaXNrczsKKwlpbnQgcmFpZF9kaXNrczsKKwlpbnQgbWRfbWlub3I7CisJaW50IG5vdF9wZXJzaXN0ZW50OworCisJLyoKKwkgKiBHZW5lcmljIHN0YXRlIGluZm9ybWF0aW9uCisJICovCisJaW50IHV0aW1lOwkJLyogIDAgU3VwZXJibG9jayB1cGRhdGUgdGltZQkJICAgICAgKi8KKwlpbnQgc3RhdGU7CQkvKiAgMSBTdGF0ZSBiaXRzIChjbGVhbiwgLi4uKQkJICAgICAgKi8KKwlpbnQgYWN0aXZlX2Rpc2tzOwkvKiAgMiBOdW1iZXIgb2YgY3VycmVudGx5IGFjdGl2ZSBkaXNrcwkgICAgICAqLworCWludCB3b3JraW5nX2Rpc2tzOwkvKiAgMyBOdW1iZXIgb2Ygd29ya2luZyBkaXNrcwkJICAgICAgKi8KKwlpbnQgZmFpbGVkX2Rpc2tzOwkvKiAgNCBOdW1iZXIgb2YgZmFpbGVkIGRpc2tzCQkgICAgICAqLworCWludCBzcGFyZV9kaXNrczsJLyogIDUgTnVtYmVyIG9mIHNwYXJlIGRpc2tzCQkgICAgICAqLworCisJLyoKKwkgKiBQZXJzb25hbGl0eSBpbmZvcm1hdGlvbgorCSAqLworCWludCBsYXlvdXQ7CQkvKiAgMCB0aGUgYXJyYXkncyBwaHlzaWNhbCBsYXlvdXQJICAgICAgKi8KKwlpbnQgY2h1bmtfc2l6ZTsJLyogIDEgY2h1bmsgc2l6ZSBpbiBieXRlcwkJICAgICAgKi8KKworfSBtZHVfYXJyYXlfaW5mb190OworCisvKiBub24tb2J2aW91cyB2YWx1ZXMgZm9yICdsZXZlbCcgKi8KKyNkZWZpbmUJTEVWRUxfTVVMVElQQVRICQkoLTQpCisjZGVmaW5lCUxFVkVMX0xJTkVBUgkJKC0xKQorI2RlZmluZQlMRVZFTF9GQVVMVFkJCSgtNSkKKworLyogd2UgbmVlZCBhIHZhbHVlIGZvciAnbm8gbGV2ZWwgc3BlY2lmaWVkJyBhbmQgMAorICogbWVhbnMgJ3JhaWQwJywgc28gd2UgbmVlZCBzb21ldGhpbmcgZWxzZS4gIFRoaXMgaXMKKyAqIGZvciBpbnRlcm5hbCB1c2Ugb25seQorICovCisjZGVmaW5lCUxFVkVMX05PTkUJCSgtMTAwMDAwMCkKKwordHlwZWRlZiBzdHJ1Y3QgbWR1X2Rpc2tfaW5mb19zIHsKKwkvKgorCSAqIGNvbmZpZ3VyYXRpb24vc3RhdHVzIG9mIG9uZSBwYXJ0aWN1bGFyIGRpc2sKKwkgKi8KKwlpbnQgbnVtYmVyOworCWludCBtYWpvcjsKKwlpbnQgbWlub3I7CisJaW50IHJhaWRfZGlzazsKKwlpbnQgc3RhdGU7CisKK30gbWR1X2Rpc2tfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBtZHVfc3RhcnRfaW5mb19zIHsKKwkvKgorCSAqIGNvbmZpZ3VyYXRpb24vc3RhdHVzIG9mIG9uZSBwYXJ0aWN1bGFyIGRpc2sKKwkgKi8KKwlpbnQgbWFqb3I7CisJaW50IG1pbm9yOworCWludCByYWlkX2Rpc2s7CisJaW50IHN0YXRlOworCit9IG1kdV9zdGFydF9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1kdV9iaXRtYXBfZmlsZV9zCit7CisJY2hhciBwYXRobmFtZVs0MDk2XTsKK30gbWR1X2JpdG1hcF9maWxlX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1kdV9wYXJhbV9zCit7CisJaW50CQkJcGVyc29uYWxpdHk7CS8qIDEsMiwzLDQgKi8KKwlpbnQJCQljaHVua19zaXplOwkvKiBpbiBieXRlcyAqLworCWludAkJCW1heF9mYXVsdDsJLyogdW51c2VkIGZvciBub3cgKi8KK30gbWR1X3BhcmFtX3Q7CisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yYW5kb20uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlNjQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFuZG9tLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvcmFuZG9tLmgKKyAqCisgKiBJbmNsdWRlIGZpbGUgZm9yIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9SQU5ET01fSAorI2RlZmluZSBfTElOVVhfUkFORE9NX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFuci5oPgorCisvKiBpb2N0bCgpJ3MgZm9yIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAqLworCisvKiBHZXQgdGhlIGVudHJvcHkgY291bnQuICovCisjZGVmaW5lIFJOREdFVEVOVENOVAlfSU9SKCAnUicsIDB4MDAsIGludCApCisKKy8qIEFkZCB0byAob3Igc3VidHJhY3QgZnJvbSkgdGhlIGVudHJvcHkgY291bnQuICAoU3VwZXJ1c2VyIG9ubHkuKSAqLworI2RlZmluZSBSTkRBRERUT0VOVENOVAlfSU9XKCAnUicsIDB4MDEsIGludCApCisKKy8qIEdldCB0aGUgY29udGVudHMgb2YgdGhlIGVudHJvcHkgcG9vbC4gIChTdXBlcnVzZXIgb25seS4pICovCisjZGVmaW5lIFJOREdFVFBPT0wJX0lPUiggJ1InLCAweDAyLCBpbnQgWzJdICkKKworLyogCisgKiBXcml0ZSBieXRlcyBpbnRvIHRoZSBlbnRyb3B5IHBvb2wgYW5kIGFkZCB0byB0aGUgZW50cm9weSBjb3VudC4KKyAqIChTdXBlcnVzZXIgb25seS4pCisgKi8KKyNkZWZpbmUgUk5EQURERU5UUk9QWQlfSU9XKCAnUicsIDB4MDMsIGludCBbMl0gKQorCisvKiBDbGVhciBlbnRyb3B5IGNvdW50IHRvIDAuICAoU3VwZXJ1c2VyIG9ubHkuKSAqLworI2RlZmluZSBSTkRaQVBFTlRDTlQJX0lPKCAnUicsIDB4MDQgKQorCisvKiBDbGVhciB0aGUgZW50cm9weSBwb29sIGFuZCBhc3NvY2lhdGVkIGNvdW50ZXJzLiAgKFN1cGVydXNlciBvbmx5LikgKi8KKyNkZWZpbmUgUk5EQ0xFQVJQT09MCV9JTyggJ1InLCAweDA2ICkKKworc3RydWN0IHJhbmRfcG9vbF9pbmZvIHsKKwlpbnQJZW50cm9weV9jb3VudDsKKwlpbnQJYnVmX3NpemU7CisJX191MzIJYnVmWzBdOworfTsKKworc3RydWN0IHJuZF9zdGF0ZSB7CisJX191MzIgczEsIHMyLCBzMzsKK307CisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAqLworCisKKyNlbmRpZiAvKiBfTElOVVhfUkFORE9NX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmF3LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Jhdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDU0M2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Jhdy5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX19MSU5VWF9SQVdfSAorI2RlZmluZSBfX0xJTlVYX1JBV19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFJBV19TRVRCSU5ECV9JTyggMHhhYywgMCApCisjZGVmaW5lIFJBV19HRVRCSU5ECV9JTyggMHhhYywgMSApCisKK3N0cnVjdCByYXdfY29uZmlnX3JlcXVlc3QgCit7CisJaW50CXJhd19taW5vcjsKKwlfX3U2NAlibG9ja19tYWpvcjsKKwlfX3U2NAlibG9ja19taW5vcjsKK307CisKKyNkZWZpbmUgTUFYX1JBV19NSU5PUlMgQ09ORklHX01BWF9SQVdfREVWUworCisjZW5kaWYgLyogX19MSU5VWF9SQVdfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5NTA5NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmRzLmgKQEAgLTAsMCArMSwyODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9SRFNfSAorI2RlZmluZSBfTElOVVhfUkRTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgUkRTX0lCX0FCSV9WRVJTSU9OCQkweDMwMQorCisvKgorICogc2V0c29ja29wdC9nZXRzb2Nrb3B0IGZvciBTT0xfUkRTCisgKi8KKyNkZWZpbmUgUkRTX0NBTkNFTF9TRU5UX1RPICAgICAgCTEKKyNkZWZpbmUgUkRTX0dFVF9NUgkJCTIKKyNkZWZpbmUgUkRTX0ZSRUVfTVIJCQkzCisvKiBkZXByZWNhdGVkOiBSRFNfQkFSUklFUiA0ICovCisjZGVmaW5lIFJEU19SRUNWRVJSCQkJNQorI2RlZmluZSBSRFNfQ09OR19NT05JVE9SCQk2CisjZGVmaW5lIFJEU19HRVRfTVJfRk9SX0RFU1QJCTcKKworLyoKKyAqIENvbnRyb2wgbWVzc2FnZSB0eXBlcyBmb3IgU09MX1JEUy4KKyAqCisgKiBDTVNHX1JETUFfQVJHUyAoc2VuZG1zZykKKyAqCVJlcXVlc3QgYSBSRE1BIHRyYW5zZmVyIHRvL2Zyb20gdGhlIHNwZWNpZmllZAorICoJbWVtb3J5IHJhbmdlcy4KKyAqCVRoZSBjbXNnX2RhdGEgaXMgYSBzdHJ1Y3QgcmRzX3JkbWFfYXJncy4KKyAqIFJEU19DTVNHX1JETUFfREVTVCAocmVjdm1zZywgc2VuZG1zZykKKyAqCUtlcm5lbCBpbmZvcm1zIGFwcGxpY2F0aW9uIGFib3V0IGludGVuZGVkCisgKglzb3VyY2UvZGVzdGluYXRpb24gb2YgYSBSRE1BIHRyYW5zZmVyCisgKiBSRFNfQ01TR19SRE1BX01BUCAoc2VuZG1zZykKKyAqCUFwcGxpY2F0aW9uIGFza3Mga2VybmVsIHRvIG1hcCB0aGUgZ2l2ZW4KKyAqCW1lbW9yeSByYW5nZSBpbnRvIGEgSUIgTVIsIGFuZCBzZW5kIHRoZQorICoJUl9LZXkgYWxvbmcgaW4gYW4gUkRTIGV4dGVuc2lvbiBoZWFkZXIuCisgKglUaGUgY21zZ19kYXRhIGlzIGEgc3RydWN0IHJkc19nZXRfbXJfYXJncywKKyAqCXRoZSBzYW1lIGFzIGZvciB0aGUgR0VUX01SIHNldHNvY2tvcHQuCisgKiBSRFNfQ01TR19SRE1BX1NUQVRVUyAocmVjdm1zZykKKyAqCVJldHVybnMgdGhlIHN0YXR1cyBvZiBhIGNvbXBsZXRlZCBSRE1BIG9wZXJhdGlvbi4KKyAqLworI2RlZmluZSBSRFNfQ01TR19SRE1BX0FSR1MJCTEKKyNkZWZpbmUgUkRTX0NNU0dfUkRNQV9ERVNUCQkyCisjZGVmaW5lIFJEU19DTVNHX1JETUFfTUFQCQkzCisjZGVmaW5lIFJEU19DTVNHX1JETUFfU1RBVFVTCQk0CisjZGVmaW5lIFJEU19DTVNHX0NPTkdfVVBEQVRFCQk1CisjZGVmaW5lIFJEU19DTVNHX0FUT01JQ19GQURECQk2CisjZGVmaW5lIFJEU19DTVNHX0FUT01JQ19DU1dQCQk3CisjZGVmaW5lIFJEU19DTVNHX01BU0tFRF9BVE9NSUNfRkFERAk4CisjZGVmaW5lIFJEU19DTVNHX01BU0tFRF9BVE9NSUNfQ1NXUAk5CisKKyNkZWZpbmUgUkRTX0lORk9fRklSU1QJCQkxMDAwMAorI2RlZmluZSBSRFNfSU5GT19DT1VOVEVSUwkJMTAwMDAKKyNkZWZpbmUgUkRTX0lORk9fQ09OTkVDVElPTlMJCTEwMDAxCisvKiAxMDAwMiBha2EgUkRTX0lORk9fRkxPV1MgaXMgZGVwcmVjYXRlZCAqLworI2RlZmluZSBSRFNfSU5GT19TRU5EX01FU1NBR0VTCQkxMDAwMworI2RlZmluZSBSRFNfSU5GT19SRVRSQU5TX01FU1NBR0VTICAgICAgIDEwMDA0CisjZGVmaW5lIFJEU19JTkZPX1JFQ1ZfTUVTU0FHRVMgICAgICAgICAgMTAwMDUKKyNkZWZpbmUgUkRTX0lORk9fU09DS0VUUyAgICAgICAgICAgICAgICAxMDAwNgorI2RlZmluZSBSRFNfSU5GT19UQ1BfU09DS0VUUyAgICAgICAgICAgIDEwMDA3CisjZGVmaW5lIFJEU19JTkZPX0lCX0NPTk5FQ1RJT05TCQkxMDAwOAorI2RlZmluZSBSRFNfSU5GT19DT05ORUNUSU9OX1NUQVRTCTEwMDA5CisjZGVmaW5lIFJEU19JTkZPX0lXQVJQX0NPTk5FQ1RJT05TCTEwMDEwCisjZGVmaW5lIFJEU19JTkZPX0xBU1QJCQkxMDAxMAorCitzdHJ1Y3QgcmRzX2luZm9fY291bnRlciB7CisJdWludDhfdAluYW1lWzMyXTsKKwl1aW50NjRfdAl2YWx1ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgUkRTX0lORk9fQ09OTkVDVElPTl9GTEFHX1NFTkRJTkcJMHgwMQorI2RlZmluZSBSRFNfSU5GT19DT05ORUNUSU9OX0ZMQUdfQ09OTkVDVElORwkweDAyCisjZGVmaW5lIFJEU19JTkZPX0NPTk5FQ1RJT05fRkxBR19DT05ORUNURUQJMHgwNAorCisjZGVmaW5lIFRSQU5TTkFNU0laCTE2CisKK3N0cnVjdCByZHNfaW5mb19jb25uZWN0aW9uIHsKKwl1aW50NjRfdAluZXh0X3R4X3NlcTsKKwl1aW50NjRfdAluZXh0X3J4X3NlcTsKKwlfX2JlMzIJCWxhZGRyOworCV9fYmUzMgkJZmFkZHI7CisJdWludDhfdAl0cmFuc3BvcnRbVFJBTlNOQU1TSVpdOwkJLyogbnVsbCB0ZXJtIGFzY2lpICovCisJdWludDhfdAlmbGFnczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgUkRTX0lORk9fTUVTU0FHRV9GTEFHX0FDSyAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUkRTX0lORk9fTUVTU0FHRV9GTEFHX0ZBU1RfQUNLICAgICAgICAgIDB4MDIKKworc3RydWN0IHJkc19pbmZvX21lc3NhZ2UgeworCXVpbnQ2NF90CXNlcTsKKwl1aW50MzJfdAlsZW47CisJX19iZTMyCQlsYWRkcjsKKwlfX2JlMzIJCWZhZGRyOworCV9fYmUxNgkJbHBvcnQ7CisJX19iZTE2CQlmcG9ydDsKKwl1aW50OF90CWZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJkc19pbmZvX3NvY2tldCB7CisJdWludDMyX3QJc25kYnVmOworCV9fYmUzMgkJYm91bmRfYWRkcjsKKwlfX2JlMzIJCWNvbm5lY3RlZF9hZGRyOworCV9fYmUxNgkJYm91bmRfcG9ydDsKKwlfX2JlMTYJCWNvbm5lY3RlZF9wb3J0OworCXVpbnQzMl90CXJjdmJ1ZjsKKwl1aW50NjRfdAlpbnVtOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJkc19pbmZvX3RjcF9zb2NrZXQgeworCV9fYmUzMiAgICAgICAgICBsb2NhbF9hZGRyOworCV9fYmUxNiAgICAgICAgICBsb2NhbF9wb3J0OworCV9fYmUzMiAgICAgICAgICBwZWVyX2FkZHI7CisJX19iZTE2ICAgICAgICAgIHBlZXJfcG9ydDsKKwl1aW50NjRfdCAgICAgICBoZHJfcmVtOworCXVpbnQ2NF90ICAgICAgIGRhdGFfcmVtOworCXVpbnQzMl90ICAgICAgIGxhc3Rfc2VudF9ueHQ7CisJdWludDMyX3QgICAgICAgbGFzdF9leHBlY3RlZF91bmE7CisJdWludDMyX3QgICAgICAgbGFzdF9zZWVuX3VuYTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgUkRTX0lCX0dJRF9MRU4JMTYKK3N0cnVjdCByZHNfaW5mb19yZG1hX2Nvbm5lY3Rpb24geworCV9fYmUzMgkJc3JjX2FkZHI7CisJX19iZTMyCQlkc3RfYWRkcjsKKwl1aW50OF90CQlzcmNfZ2lkW1JEU19JQl9HSURfTEVOXTsKKwl1aW50OF90CQlkc3RfZ2lkW1JEU19JQl9HSURfTEVOXTsKKworCXVpbnQzMl90CW1heF9zZW5kX3dyOworCXVpbnQzMl90CW1heF9yZWN2X3dyOworCXVpbnQzMl90CW1heF9zZW5kX3NnZTsKKwl1aW50MzJfdAlyZG1hX21yX21heDsKKwl1aW50MzJfdAlyZG1hX21yX3NpemU7Cit9OworCisvKgorICogQ29uZ2VzdGlvbiBtb25pdG9yaW5nLgorICogQ29uZ2VzdGlvbiBjb250cm9sIGluIFJEUyBoYXBwZW5zIGF0IHRoZSBob3N0IGNvbm5lY3Rpb24KKyAqIGxldmVsIGJ5IGV4Y2hhbmdpbmcgYSBiaXRtYXAgbWFya2luZyBjb25nZXN0ZWQgcG9ydHMuCisgKiBCeSBkZWZhdWx0LCBhIHByb2Nlc3Mgc2xlZXBpbmcgaW4gcG9sbCgpIGlzIGFsd2F5cyB3b2tlbgorICogdXAgd2hlbiB0aGUgY29uZ2VzdGlvbiBtYXAgaXMgdXBkYXRlZC4KKyAqIFdpdGggZXhwbGljaXQgbW9uaXRvcmluZywgYW4gYXBwbGljYXRpb24gY2FuIGhhdmUgbW9yZQorICogZmluZS1ncmFpbmVkIGNvbnRyb2wuCisgKiBUaGUgYXBwbGljYXRpb24gaW5zdGFsbHMgYSA2NGJpdCBtYXNrIHZhbHVlIGluIHRoZSBzb2NrZXQsCisgKiB3aGVyZSBlYWNoIGJpdCBjb3JyZXNwb25kcyB0byBhIGdyb3VwIG9mIHBvcnRzLgorICogV2hlbiBhIGNvbmdlc3Rpb24gdXBkYXRlIGFycml2ZXMsIFJEUyBjaGVja3MgdGhlIHNldCBvZgorICogcG9ydHMgdGhhdCBhcmUgbm93IHVuY29uZ2VzdGVkIGFnYWluc3QgdGhlIGxpc3QgYml0IG1hc2sKKyAqIGluc3RhbGxlZCBpbiB0aGUgc29ja2V0LCBhbmQgaWYgdGhleSBvdmVybGFwLCB3ZSBxdWV1ZSBhCisgKiBjb25nX25vdGlmaWNhdGlvbiBvbiB0aGUgc29ja2V0LgorICoKKyAqIFRvIGluc3RhbGwgdGhlIGNvbmdlc3Rpb24gbW9uaXRvciBiaXRtYXNrLCB1c2UgUkRTX0NPTkdfTU9OSVRPUgorICogd2l0aCB0aGUgNjRiaXQgbWFzay4KKyAqIENvbmdlc3Rpb24gdXBkYXRlcyBhcmUgcmVjZWl2ZWQgdmlhIFJEU19DTVNHX0NPTkdfVVBEQVRFCisgKiBjb250cm9sIG1lc3NhZ2VzLgorICoKKyAqIFRoZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIGJpdHMgYW5kIHBvcnRzIGlzCisgKgkxIDw8IChwb3J0bnVtICUgNjQpCisgKi8KKyNkZWZpbmUgUkRTX0NPTkdfTU9OSVRPUl9TSVpFCTY0CisjZGVmaW5lIFJEU19DT05HX01PTklUT1JfQklUKHBvcnQpICAoKCh1bnNpZ25lZCBpbnQpIHBvcnQpICUgUkRTX0NPTkdfTU9OSVRPUl9TSVpFKQorI2RlZmluZSBSRFNfQ09OR19NT05JVE9SX01BU0socG9ydCkgKDFVTEwgPDwgUkRTX0NPTkdfTU9OSVRPUl9CSVQocG9ydCkpCisKKy8qCisgKiBSRE1BIHJlbGF0ZWQgdHlwZXMKKyAqLworCisvKgorICogVGhpcyBlbmNhcHN1bGF0ZXMgYSByZW1vdGUgbWVtb3J5IGxvY2F0aW9uLgorICogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIGl0IGNvbnRhaW5zIHRoZSBSX0tleQorICogb2YgdGhlIHJlbW90ZSBtZW1vcnkgcmVnaW9uLCBhbmQgdGhlIG9mZnNldCBpbnRvIGl0CisgKiAoc28gdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dAorICogYWxpZ25tZW50KS4KKyAqLwordHlwZWRlZiB1aW50NjRfdAlyZHNfcmRtYV9jb29raWVfdDsKKworc3RydWN0IHJkc19pb3ZlYyB7CisJdWludDY0X3QJYWRkcjsKKwl1aW50NjRfdAlieXRlczsKK307CisKK3N0cnVjdCByZHNfZ2V0X21yX2FyZ3MgeworCXN0cnVjdCByZHNfaW92ZWMgdmVjOworCXVpbnQ2NF90CWNvb2tpZV9hZGRyOworCXVpbnQ2NF90CWZsYWdzOworfTsKKworc3RydWN0IHJkc19nZXRfbXJfZm9yX2Rlc3RfYXJncyB7CisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UJZGVzdF9hZGRyOworCXN0cnVjdCByZHNfaW92ZWMgCXZlYzsKKwl1aW50NjRfdAkJY29va2llX2FkZHI7CisJdWludDY0X3QJCWZsYWdzOworfTsKKworc3RydWN0IHJkc19mcmVlX21yX2FyZ3MgeworCXJkc19yZG1hX2Nvb2tpZV90IGNvb2tpZTsKKwl1aW50NjRfdAlmbGFnczsKK307CisKK3N0cnVjdCByZHNfcmRtYV9hcmdzIHsKKwlyZHNfcmRtYV9jb29raWVfdCBjb29raWU7CisJc3RydWN0IHJkc19pb3ZlYyByZW1vdGVfdmVjOworCXVpbnQ2NF90CWxvY2FsX3ZlY19hZGRyOworCXVpbnQ2NF90CW5yX2xvY2FsOworCXVpbnQ2NF90CWZsYWdzOworCXVpbnQ2NF90CXVzZXJfdG9rZW47Cit9OworCitzdHJ1Y3QgcmRzX2F0b21pY19hcmdzIHsKKwlyZHNfcmRtYV9jb29raWVfdCBjb29raWU7CisJdWludDY0X3QgCWxvY2FsX2FkZHI7CisJdWludDY0X3QgCXJlbW90ZV9hZGRyOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQ2NF90CWNvbXBhcmU7CisJCQl1aW50NjRfdAlzd2FwOworCQl9IGNzd3A7CisJCXN0cnVjdCB7CisJCQl1aW50NjRfdAlhZGQ7CisJCX0gZmFkZDsKKwkJc3RydWN0IHsKKwkJCXVpbnQ2NF90CWNvbXBhcmU7CisJCQl1aW50NjRfdAlzd2FwOworCQkJdWludDY0X3QJY29tcGFyZV9tYXNrOworCQkJdWludDY0X3QJc3dhcF9tYXNrOworCQl9IG1fY3N3cDsKKwkJc3RydWN0IHsKKwkJCXVpbnQ2NF90CWFkZDsKKwkJCXVpbnQ2NF90CW5vY2FycnlfbWFzazsKKwkJfSBtX2ZhZGQ7CisJfTsKKwl1aW50NjRfdAlmbGFnczsKKwl1aW50NjRfdAl1c2VyX3Rva2VuOworfTsKKworc3RydWN0IHJkc19yZG1hX25vdGlmeSB7CisJdWludDY0X3QJdXNlcl90b2tlbjsKKwlpbnQzMl90CQlzdGF0dXM7Cit9OworCisjZGVmaW5lIFJEU19SRE1BX1NVQ0NFU1MJMAorI2RlZmluZSBSRFNfUkRNQV9SRU1PVEVfRVJST1IJMQorI2RlZmluZSBSRFNfUkRNQV9DQU5DRUxFRAkyCisjZGVmaW5lIFJEU19SRE1BX0RST1BQRUQJMworI2RlZmluZSBSRFNfUkRNQV9PVEhFUl9FUlJPUgk0CisKKy8qCisgKiBDb21tb24gc2V0IG9mIGZsYWdzIGZvciBhbGwgUkRNQSByZWxhdGVkIHN0cnVjdHMKKyAqLworI2RlZmluZSBSRFNfUkRNQV9SRUFEV1JJVEUJMHgwMDAxCisjZGVmaW5lIFJEU19SRE1BX0ZFTkNFCQkweDAwMDIJLyogdXNlIEZFTkNFIGZvciBpbW1lZGlhdGUgc2VuZCAqLworI2RlZmluZSBSRFNfUkRNQV9JTlZBTElEQVRFCTB4MDAwNAkvKiBpbnZhbGlkYXRlIFJfS2V5IGFmdGVyIGZyZWVpbmcgTVIgKi8KKyNkZWZpbmUgUkRTX1JETUFfVVNFX09OQ0UJMHgwMDA4CS8qIGZyZWUgTVIgYWZ0ZXIgdXNlICovCisjZGVmaW5lIFJEU19SRE1BX0RPTlRXQUlUCTB4MDAxMAkvKiBEb24ndCB3YWl0IGluIFNFVF9CQVJSSUVSICovCisjZGVmaW5lIFJEU19SRE1BX05PVElGWV9NRQkweDAwMjAJLyogTm90aWZ5IHdoZW4gb3BlcmF0aW9uIGNvbXBsZXRlcyAqLworI2RlZmluZSBSRFNfUkRNQV9TSUxFTlQJCTB4MDA0MAkvKiBEbyBub3QgaW50ZXJydXB0IHJlbW90ZSAqLworCisjZW5kaWYgLyogSUJfUkRTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmVib290LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JlYm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzM2NzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JlYm9vdC5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgX0xJTlVYX1JFQk9PVF9ICisjZGVmaW5lIF9MSU5VWF9SRUJPT1RfSAorCisvKgorICogTWFnaWMgdmFsdWVzIHJlcXVpcmVkIHRvIHVzZSBfcmVib290KCkgc3lzdGVtIGNhbGwuCisgKi8KKworI2RlZmluZQlMSU5VWF9SRUJPT1RfTUFHSUMxCTB4ZmVlMWRlYWQKKyNkZWZpbmUJTElOVVhfUkVCT09UX01BR0lDMgk2NzIyNzQ3OTMKKyNkZWZpbmUJTElOVVhfUkVCT09UX01BR0lDMkEJODUwNzIyNzgKKyNkZWZpbmUJTElOVVhfUkVCT09UX01BR0lDMkIJMzY5MzY3NDQ4CisjZGVmaW5lCUxJTlVYX1JFQk9PVF9NQUdJQzJDCTUzNzk5MzIxNgorCisKKy8qCisgKiBDb21tYW5kcyBhY2NlcHRlZCBieSB0aGUgX3JlYm9vdCgpIHN5c3RlbSBjYWxsLgorICoKKyAqIFJFU1RBUlQgICAgIFJlc3RhcnQgc3lzdGVtIHVzaW5nIGRlZmF1bHQgY29tbWFuZCBhbmQgbW9kZS4KKyAqIEhBTFQgICAgICAgIFN0b3AgT1MgYW5kIGdpdmUgc3lzdGVtIGNvbnRyb2wgdG8gUk9NIG1vbml0b3IsIGlmIGFueS4KKyAqIENBRF9PTiAgICAgIEN0cmwtQWx0LURlbCBzZXF1ZW5jZSBjYXVzZXMgUkVTVEFSVCBjb21tYW5kLgorICogQ0FEX09GRiAgICAgQ3RybC1BbHQtRGVsIHNlcXVlbmNlIHNlbmRzIFNJR0lOVCB0byBpbml0IHRhc2suCisgKiBQT1dFUl9PRkYgICBTdG9wIE9TIGFuZCByZW1vdmUgYWxsIHBvd2VyIGZyb20gc3lzdGVtLCBpZiBwb3NzaWJsZS4KKyAqIFJFU1RBUlQyICAgIFJlc3RhcnQgc3lzdGVtIHVzaW5nIGdpdmVuIGNvbW1hbmQgc3RyaW5nLgorICogU1dfU1VTUEVORCAgU3VzcGVuZCBzeXN0ZW0gdXNpbmcgc29mdHdhcmUgc3VzcGVuZCBpZiBjb21waWxlZCBpbi4KKyAqIEtFWEVDICAgICAgIFJlc3RhcnQgc3lzdGVtIHVzaW5nIGEgcHJldmlvdXNseSBsb2FkZWQgTGludXgga2VybmVsCisgKi8KKworI2RlZmluZQlMSU5VWF9SRUJPT1RfQ01EX1JFU1RBUlQJMHgwMTIzNDU2NworI2RlZmluZQlMSU5VWF9SRUJPT1RfQ01EX0hBTFQJCTB4Q0RFRjAxMjMKKyNkZWZpbmUJTElOVVhfUkVCT09UX0NNRF9DQURfT04JCTB4ODlBQkNERUYKKyNkZWZpbmUJTElOVVhfUkVCT09UX0NNRF9DQURfT0ZGCTB4MDAwMDAwMDAKKyNkZWZpbmUJTElOVVhfUkVCT09UX0NNRF9QT1dFUl9PRkYJMHg0MzIxRkVEQworI2RlZmluZQlMSU5VWF9SRUJPT1RfQ01EX1JFU1RBUlQyCTB4QTFCMkMzRDQKKyNkZWZpbmUJTElOVVhfUkVCT09UX0NNRF9TV19TVVNQRU5ECTB4RDAwMEZDRTIKKyNkZWZpbmUJTElOVVhfUkVCT09UX0NNRF9LRVhFQwkJMHg0NTU4NDU0MworCisKKworI2VuZGlmIC8qIF9MSU5VWF9SRUJPT1RfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYTIyNTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEhhbnMgUmVpc2VyLCBzZWUgcmVpc2VyZnMvUkVBRE1FIGZvciBsaWNlbnNpbmcgYW5kIGNvcHlyaWdodCBkZXRhaWxzCisgKi8KKworCQkJCS8qIHRoaXMgZmlsZSBoYXMgYW4gYW1hemluZ2x5IHN0dXBpZAorCQkJCSAgIG5hbWUsIHl1cmEgcGxlYXNlIGZpeCBpdCB0byBiZQorCQkJCSAgIHJlaXNlcmZzLmgsIGFuZCBtZXJnZSBhbGwgdGhlIHJlc3QKKwkJCQkgICBvZiBvdXIgLmggZmlsZXMgdGhhdCBhcmUgaW4gdGhpcworCQkJCSAgIGRpcmVjdG9yeSBpbnRvIGl0LiAgKi8KKworI2lmbmRlZiBfTElOVVhfUkVJU0VSX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX1JFSVNFUl9GU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisKKworLyoKKyAqICBpbmNsdWRlL2xpbnV4L3JlaXNlcl9mcy5oCisgKgorICogIFJlaXNlciBGaWxlIFN5c3RlbSBjb25zdGFudHMgYW5kIHN0cnVjdHVyZXMKKyAqCisgKi8KKworLyogaW9jdGwncyBjb21tYW5kICovCisjZGVmaW5lIFJFSVNFUkZTX0lPQ19VTlBBQ0sJCV9JT1coMHhDRCwxLGxvbmcpCisvKiBkZWZpbmUgZm9sbG93aW5nIGZsYWdzIHRvIGJlIHRoZSBzYW1lIGFzIGluIGV4dDIsIHNvIHRoYXQgY2hhdHRyKDEpLAorICAgbHNhdHRyKDEpIHdpbGwgd29yayB3aXRoIHVzLiAqLworI2RlZmluZSBSRUlTRVJGU19JT0NfR0VURkxBR1MJCUZTX0lPQ19HRVRGTEFHUworI2RlZmluZSBSRUlTRVJGU19JT0NfU0VURkxBR1MJCUZTX0lPQ19TRVRGTEFHUworI2RlZmluZSBSRUlTRVJGU19JT0NfR0VUVkVSU0lPTgkJRlNfSU9DX0dFVFZFUlNJT04KKyNkZWZpbmUgUkVJU0VSRlNfSU9DX1NFVFZFUlNJT04JCUZTX0lPQ19TRVRWRVJTSU9OCisKKworI2VuZGlmCQkJCS8qIF9MSU5VWF9SRUlTRVJfRlNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZWlzZXJmc194YXR0ci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZWlzZXJmc194YXR0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZmZmMmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX3hhdHRyLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAgRmlsZTogbGludXgvcmVpc2VyZnNfeGF0dHIuaAorKi8KKworI2lmbmRlZiBfTElOVVhfUkVJU0VSRlNfWEFUVFJfSAorI2RlZmluZSBfTElOVVhfUkVJU0VSRlNfWEFUVFJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogTWFnaWMgdmFsdWUgaW4gaGVhZGVyICovCisjZGVmaW5lIFJFSVNFUkZTX1hBVFRSX01BR0lDIDB4NTI0NjU4NDEJLyogIlJGWEEiICovCisKK3N0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgeworCV9fbGUzMiBoX21hZ2ljOwkJLyogbWFnaWMgbnVtYmVyIGZvciBpZGVudGlmaWNhdGlvbiAqLworCV9fbGUzMiBoX2hhc2g7CQkvKiBoYXNoIG9mIHRoZSB2YWx1ZSAqLworfTsKKworc3RydWN0IHJlaXNlcmZzX3NlY3VyaXR5X2hhbmRsZSB7CisJY2hhciAqbmFtZTsKKwl2b2lkICp2YWx1ZTsKKwlzaXplX3QgbGVuZ3RoOworfTsKKworCisjZW5kaWYgIC8qICBfTElOVVhfUkVJU0VSRlNfWEFUVFJfSCAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmVzb3VyY2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTZlZjIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZXNvdXJjZS5oCkBAIC0wLDAgKzEsODAgQEAKKyNpZm5kZWYgX0xJTlVYX1JFU09VUkNFX0gKKyNkZWZpbmUgX0xJTlVYX1JFU09VUkNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogUmVzb3VyY2UgY29udHJvbC9hY2NvdW50aW5nIGhlYWRlciBmaWxlIGZvciBsaW51eAorICovCisKKy8qCisgKiBEZWZpbml0aW9uIG9mIHN0cnVjdCBydXNhZ2UgdGFrZW4gZnJvbSBCU0QgNC4zIFJlbm8KKyAqIAorICogV2UgZG9uJ3Qgc3VwcG9ydCBhbGwgb2YgdGhlc2UgeWV0LCBidXQgd2UgbWlnaHQgYXMgd2VsbCBoYXZlIHRoZW0uLi4uCisgKiBPdGhlcndpc2UsIGVhY2ggdGltZSB3ZSBhZGQgbmV3IGl0ZW1zLCBwcm9ncmFtcyB3aGljaCBkZXBlbmQgb24gdGhpcworICogc3RydWN0dXJlIHdpbGwgbG9zZS4gIFRoaXMgcmVkdWNlcyB0aGUgY2hhbmNlcyBvZiB0aGF0IGhhcHBlbmluZy4KKyAqLworI2RlZmluZQlSVVNBR0VfU0VMRgkwCisjZGVmaW5lCVJVU0FHRV9DSElMRFJFTgkoLTEpCisjZGVmaW5lIFJVU0FHRV9CT1RICSgtMikJCS8qIHN5c193YWl0NCgpIHVzZXMgdGhpcyAqLworI2RlZmluZQlSVVNBR0VfVEhSRUFECTEJCS8qIG9ubHkgdGhlIGNhbGxpbmcgdGhyZWFkICovCisKK3N0cnVjdAlydXNhZ2UgeworCXN0cnVjdCB0aW1ldmFsIHJ1X3V0aW1lOwkvKiB1c2VyIHRpbWUgdXNlZCAqLworCXN0cnVjdCB0aW1ldmFsIHJ1X3N0aW1lOwkvKiBzeXN0ZW0gdGltZSB1c2VkICovCisJbG9uZwlydV9tYXhyc3M7CQkvKiBtYXhpbXVtIHJlc2lkZW50IHNldCBzaXplICovCisJbG9uZwlydV9peHJzczsJCS8qIGludGVncmFsIHNoYXJlZCBtZW1vcnkgc2l6ZSAqLworCWxvbmcJcnVfaWRyc3M7CQkvKiBpbnRlZ3JhbCB1bnNoYXJlZCBkYXRhIHNpemUgKi8KKwlsb25nCXJ1X2lzcnNzOwkJLyogaW50ZWdyYWwgdW5zaGFyZWQgc3RhY2sgc2l6ZSAqLworCWxvbmcJcnVfbWluZmx0OwkJLyogcGFnZSByZWNsYWltcyAqLworCWxvbmcJcnVfbWFqZmx0OwkJLyogcGFnZSBmYXVsdHMgKi8KKwlsb25nCXJ1X25zd2FwOwkJLyogc3dhcHMgKi8KKwlsb25nCXJ1X2luYmxvY2s7CQkvKiBibG9jayBpbnB1dCBvcGVyYXRpb25zICovCisJbG9uZwlydV9vdWJsb2NrOwkJLyogYmxvY2sgb3V0cHV0IG9wZXJhdGlvbnMgKi8KKwlsb25nCXJ1X21zZ3NuZDsJCS8qIG1lc3NhZ2VzIHNlbnQgKi8KKwlsb25nCXJ1X21zZ3JjdjsJCS8qIG1lc3NhZ2VzIHJlY2VpdmVkICovCisJbG9uZwlydV9uc2lnbmFsczsJCS8qIHNpZ25hbHMgcmVjZWl2ZWQgKi8KKwlsb25nCXJ1X252Y3N3OwkJLyogdm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMgKi8KKwlsb25nCXJ1X25pdmNzdzsJCS8qIGludm9sdW50YXJ5ICIgKi8KK307CisKK3N0cnVjdCBybGltaXQgeworCXVuc2lnbmVkIGxvbmcJcmxpbV9jdXI7CisJdW5zaWduZWQgbG9uZwlybGltX21heDsKK307CisKKyNkZWZpbmUgUkxJTTY0X0lORklOSVRZCQkofjBVTEwpCisKK3N0cnVjdCBybGltaXQ2NCB7CisJX191NjQgcmxpbV9jdXI7CisJX191NjQgcmxpbV9tYXg7Cit9OworCisjZGVmaW5lCVBSSU9fTUlOCSgtMjApCisjZGVmaW5lCVBSSU9fTUFYCTIwCisKKyNkZWZpbmUJUFJJT19QUk9DRVNTCTAKKyNkZWZpbmUJUFJJT19QR1JQCTEKKyNkZWZpbmUJUFJJT19VU0VSCTIKKworLyoKKyAqIExpbWl0IHRoZSBzdGFjayBieSB0byBzb21lIHNhbmUgZGVmYXVsdDogcm9vdCBjYW4gYWx3YXlzCisgKiBpbmNyZWFzZSB0aGlzIGxpbWl0IGlmIG5lZWRlZC4uICA4TUIgc2VlbXMgcmVhc29uYWJsZS4KKyAqLworI2RlZmluZSBfU1RLX0xJTQkoOCoxMDI0KjEwMjQpCisKKy8qCisgKiBHUEcyIHdhbnRzIDY0a0Igb2YgbWxvY2tlZCBtZW1vcnksIHRvIG1ha2Ugc3VyZSBwYXNzIHBocmFzZXMKKyAqIGFuZCBvdGhlciBzZW5zaXRpdmUgaW5mb3JtYXRpb24gYXJlIG5ldmVyIHdyaXR0ZW4gdG8gZGlzay4KKyAqLworI2RlZmluZSBNTE9DS19MSU1JVAkoKFBBR0VfU0laRSA+IDY0KjEwMjQpID8gUEFHRV9TSVpFIDogNjQqMTAyNCkKKworLyoKKyAqIER1ZSB0byBiaW5hcnkgY29tcGF0aWJpbGl0eSwgdGhlIGFjdHVhbCByZXNvdXJjZSBudW1iZXJzCisgKiBtYXkgYmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgbGludXggdmVyc2lvbnMuLgorICovCisjaW5jbHVkZSA8YXNtL3Jlc291cmNlLmg+CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Jma2lsbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZmtpbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmIyYzY2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZmtpbGwuaApAQCAtMCwwICsxLDEwNyBAQAorI2lmbmRlZiBfX1JGS0lMTF9ICisjZGVmaW5lIF9fUkZLSUxMX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAtIDIwMDcgSXZvIHZhbiBEb29ybgorICogQ29weXJpZ2h0IChDKSAyMDA3IERtaXRyeSBUb3Jva2hvdgorICogQ29weXJpZ2h0IDIwMDkgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogZGVmaW5lIHVzZXJzcGFjZSB2aXNpYmxlIHN0YXRlcyAqLworI2RlZmluZSBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VECTAKKyNkZWZpbmUgUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRAkJMQorI2RlZmluZSBSRktJTExfU1RBVEVfSEFSRF9CTE9DS0VECTIKKworLyoqCisgKiBlbnVtIHJma2lsbF90eXBlIC0gdHlwZSBvZiByZmtpbGwgc3dpdGNoLgorICoKKyAqIEBSRktJTExfVFlQRV9BTEw6IHRvZ2dsZXMgYWxsIHN3aXRjaGVzIChyZXF1ZXN0cyBvbmx5IC0gbm90IGEgc3dpdGNoIHR5cGUpCisgKiBAUkZLSUxMX1RZUEVfV0xBTjogc3dpdGNoIGlzIG9uIGEgODAyLjExIHdpcmVsZXNzIG5ldHdvcmsgZGV2aWNlLgorICogQFJGS0lMTF9UWVBFX0JMVUVUT09USDogc3dpdGNoIGlzIG9uIGEgYmx1ZXRvb3RoIGRldmljZS4KKyAqIEBSRktJTExfVFlQRV9VV0I6IHN3aXRjaCBpcyBvbiBhIHVsdHJhIHdpZGViYW5kIGRldmljZS4KKyAqIEBSRktJTExfVFlQRV9XSU1BWDogc3dpdGNoIGlzIG9uIGEgV2lNQVggZGV2aWNlLgorICogQFJGS0lMTF9UWVBFX1dXQU46IHN3aXRjaCBpcyBvbiBhIHdpcmVsZXNzIFdBTiBkZXZpY2UuCisgKiBAUkZLSUxMX1RZUEVfR1BTOiBzd2l0Y2ggaXMgb24gYSBHUFMgZGV2aWNlLgorICogQFJGS0lMTF9UWVBFX0ZNOiBzd2l0Y2ggaXMgb24gYSBGTSByYWRpbyBkZXZpY2UuCisgKiBATlVNX1JGS0lMTF9UWVBFUzogbnVtYmVyIG9mIGRlZmluZWQgcmZraWxsIHR5cGVzCisgKi8KK2VudW0gcmZraWxsX3R5cGUgeworCVJGS0lMTF9UWVBFX0FMTCA9IDAsCisJUkZLSUxMX1RZUEVfV0xBTiwKKwlSRktJTExfVFlQRV9CTFVFVE9PVEgsCisJUkZLSUxMX1RZUEVfVVdCLAorCVJGS0lMTF9UWVBFX1dJTUFYLAorCVJGS0lMTF9UWVBFX1dXQU4sCisJUkZLSUxMX1RZUEVfR1BTLAorCVJGS0lMTF9UWVBFX0ZNLAorCU5VTV9SRktJTExfVFlQRVMsCit9OworCisvKioKKyAqIGVudW0gcmZraWxsX29wZXJhdGlvbiAtIG9wZXJhdGlvbiB0eXBlcworICogQFJGS0lMTF9PUF9BREQ6IGEgZGV2aWNlIHdhcyBhZGRlZAorICogQFJGS0lMTF9PUF9ERUw6IGEgZGV2aWNlIHdhcyByZW1vdmVkCisgKiBAUkZLSUxMX09QX0NIQU5HRTogYSBkZXZpY2UncyBzdGF0ZSBjaGFuZ2VkIC0tIHVzZXJzcGFjZSBjaGFuZ2VzIG9uZSBkZXZpY2UKKyAqIEBSRktJTExfT1BfQ0hBTkdFX0FMTDogdXNlcnNwYWNlIGNoYW5nZXMgYWxsIGRldmljZXMgKG9mIGEgdHlwZSwgb3IgYWxsKQorICovCitlbnVtIHJma2lsbF9vcGVyYXRpb24geworCVJGS0lMTF9PUF9BREQgPSAwLAorCVJGS0lMTF9PUF9ERUwsCisJUkZLSUxMX09QX0NIQU5HRSwKKwlSRktJTExfT1BfQ0hBTkdFX0FMTCwKK307CisKKy8qKgorICogc3RydWN0IHJma2lsbF9ldmVudCAtIGV2ZW50cyBmb3IgdXNlcnNwYWNlIG9uIC9kZXYvcmZraWxsCisgKiBAaWR4OiBpbmRleCBvZiBkZXYgcmZraWxsCisgKiBAdHlwZTogdHlwZSBvZiB0aGUgcmZraWxsIHN0cnVjdAorICogQG9wOiBvcGVyYXRpb24gY29kZQorICogQGhhcmQ6IGhhcmQgc3RhdGUgKDAvMSkKKyAqIEBzb2Z0OiBzb2Z0IHN0YXRlICgwLzEpCisgKgorICogU3RydWN0dXJlIHVzZWQgZm9yIHVzZXJzcGFjZSBjb21tdW5pY2F0aW9uIG9uIC9kZXYvcmZraWxsLAorICogdXNlZCBmb3IgZXZlbnRzIGZyb20gdGhlIGtlcm5lbCBhbmQgY29udHJvbCB0byB0aGUga2VybmVsLgorICovCitzdHJ1Y3QgcmZraWxsX2V2ZW50IHsKKwlfX3UzMiBpZHg7CisJX191OCAgdHlwZTsKKwlfX3U4ICBvcDsKKwlfX3U4ICBzb2Z0LCBoYXJkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIFdlIGFyZSBwbGFubmluZyB0byBiZSBiYWNrd2FyZCBhbmQgZm9yd2FyZCBjb21wYXRpYmxlIHdpdGggY2hhbmdlcworICogdG8gdGhlIGV2ZW50IHN0cnVjdCwgYnkgYWRkaW5nIG5ldywgb3B0aW9uYWwsIG1lbWJlcnMgYXQgdGhlIGVuZC4KKyAqIFdoZW4gcmVhZGluZyBhbiBldmVudCAod2hldGhlciB0aGUga2VybmVsIGZyb20gdXNlcnNwYWNlIG9yIHZpY2UKKyAqIHZlcnNhKSB3ZSBuZWVkIHRvIGFjY2VwdCBhbnl0aGluZyB0aGF0J3MgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlCisgKiB2ZXJzaW9uIDEgZXZlbnQgc2l6ZSwgYnV0IG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IG90aGVyIHNpemVzIGluCisgKiB0aGUgZnV0dXJlLgorICoKKyAqIE9uZSBleGNlcHRpb24gaXMgdGhlIGtlcm5lbCAtLSB3ZSBhbHJlYWR5IGhhdmUgdHdvIGV2ZW50IHNpemVzIGluCisgKiB0aGF0IHdlJ3ZlIG1hZGUgdGhlICdoYXJkJyBtZW1iZXIgb3B0aW9uYWwgc2luY2Ugb3VyIG9ubHkgb3B0aW9uCisgKiBpcyB0byBpZ25vcmUgaXQgYW55d2F5LgorICovCisjZGVmaW5lIFJGS0lMTF9FVkVOVF9TSVpFX1YxCTgKKworLyogaW9jdGwgZm9yIHR1cm5pbmcgb2ZmIHJma2lsbC1pbnB1dCAoaWYgcHJlc2VudCkgKi8KKyNkZWZpbmUgUkZLSUxMX0lPQ19NQUdJQwknUicKKyNkZWZpbmUgUkZLSUxMX0lPQ19OT0lOUFVUCTEKKyNkZWZpbmUgUkZLSUxMX0lPQ1RMX05PSU5QVVQJX0lPKFJGS0lMTF9JT0NfTUFHSUMsIFJGS0lMTF9JT0NfTk9JTlBVVCkKKworLyogYW5kIHRoYXQncyBhbGwgdXNlcnNwYWNlIGdldHMgKi8KKworI2VuZGlmIC8qIFJGS0lMTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JvbWZzX2ZzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JvbWZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1N2Y5MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcm9tZnNfZnMuaApAQCAtMCwwICsxLDU5IEBACisjaWZuZGVmIF9fTElOVVhfUk9NRlNfRlNfSAorI2RlZmluZSBfX0xJTlVYX1JPTUZTX0ZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworLyogVGhlIGJhc2ljIHN0cnVjdHVyZXMgb2YgdGhlIHJvbWZzIGZpbGVzeXN0ZW0gKi8KKworI2RlZmluZSBST01CU0laRSBCTE9DS19TSVpFCisjZGVmaW5lIFJPTUJTQklUUyBCTE9DS19TSVpFX0JJVFMKKyNkZWZpbmUgUk9NQk1BU0sgKFJPTUJTSVpFLTEpCisjZGVmaW5lIFJPTUZTX01BR0lDIDB4NzI3NQorCisjZGVmaW5lIFJPTUZTX01BWEZOIDEyOAorCisjZGVmaW5lIF9fbWt3KGgsbCkgKCgoaCkmMHgwMGZmKTw8IDh8KChsKSYweDAwZmYpKQorI2RlZmluZSBfX21rbChoLGwpICgoKGgpJjB4ZmZmZik8PDE2fCgobCkmMHhmZmZmKSkKKyNkZWZpbmUgX19tazQoYSxiLGMsZCkgY3B1X3RvX2JlMzIoX19ta2woX19ta3coYSxiKSxfX21rdyhjLGQpKSkKKyNkZWZpbmUgUk9NU0JfV09SRDAgX19tazQoJy0nLCdyJywnbycsJ20nKQorI2RlZmluZSBST01TQl9XT1JEMSBfX21rNCgnMScsJ2YnLCdzJywnLScpCisKKy8qIE9uLWRpc2sgInN1cGVyIGJsb2NrIiAqLworCitzdHJ1Y3Qgcm9tZnNfc3VwZXJfYmxvY2sgeworCV9fYmUzMiB3b3JkMDsKKwlfX2JlMzIgd29yZDE7CisJX19iZTMyIHNpemU7CisJX19iZTMyIGNoZWNrc3VtOworCWNoYXIgbmFtZVswXTsJCS8qIHZvbHVtZSBuYW1lICovCit9OworCisvKiBPbiBkaXNrIGlub2RlICovCisKK3N0cnVjdCByb21mc19pbm9kZSB7CisJX19iZTMyIG5leHQ7CQkvKiBsb3cgNCBiaXRzIHNlZSBST01GSF8gKi8KKwlfX2JlMzIgc3BlYzsKKwlfX2JlMzIgc2l6ZTsKKwlfX2JlMzIgY2hlY2tzdW07CisJY2hhciBuYW1lWzBdOworfTsKKworI2RlZmluZSBST01GSF9UWVBFIDcKKyNkZWZpbmUgUk9NRkhfSFJEIDAKKyNkZWZpbmUgUk9NRkhfRElSIDEKKyNkZWZpbmUgUk9NRkhfUkVHIDIKKyNkZWZpbmUgUk9NRkhfU1lNIDMKKyNkZWZpbmUgUk9NRkhfQkxLIDQKKyNkZWZpbmUgUk9NRkhfQ0hSIDUKKyNkZWZpbmUgUk9NRkhfU0NLIDYKKyNkZWZpbmUgUk9NRkhfRklGIDcKKyNkZWZpbmUgUk9NRkhfRVhFQyA4CisKKy8qIEFsaWdubWVudCAqLworCisjZGVmaW5lIFJPTUZIX1NJWkUgMTYKKyNkZWZpbmUgUk9NRkhfUEFEIChST01GSF9TSVpFLTEpCisjZGVmaW5lIFJPTUZIX01BU0sgKH5ST01GSF9QQUQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yb3NlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Jvc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmNmZTk1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yb3NlLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIFRoZXNlIGFyZSB0aGUgcHVibGljIGVsZW1lbnRzIG9mIHRoZSBMaW51eCBrZXJuZWwgUm9zZSBpbXBsZW1lbnRhdGlvbi4KKyAqIEZvciBrZXJuZWwgQVguMjUgc2VlIHRoZSBmaWxlIGF4MjUuaC4gVGhpcyBmaWxlIHJlcXVpcmVzIGF4MjUuaCBmb3IgdGhlCisgKiBkZWZpbml0aW9uIG9mIHRoZSBheDI1X2FkZHJlc3Mgc3RydWN0dXJlLgorICovCisKKyNpZm5kZWYJUk9TRV9LRVJORUxfSAorI2RlZmluZQlST1NFX0tFUk5FTF9ICisKKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9heDI1Lmg+CisKKyNkZWZpbmUgUk9TRV9NVFUJMjUxCisKKyNkZWZpbmUgUk9TRV9NQVhfRElHSVMgNgorCisjZGVmaW5lCVJPU0VfREVGRVIJMQorI2RlZmluZSBST1NFX1QxCQkyCisjZGVmaW5lCVJPU0VfVDIJCTMKKyNkZWZpbmUJUk9TRV9UMwkJNAorI2RlZmluZQlST1NFX0lETEUJNQorI2RlZmluZQlST1NFX1FCSVRJTkNMCTYKKyNkZWZpbmUJUk9TRV9IT0xEQkFDSwk3CisKKyNkZWZpbmUJU0lPQ1JTR0NBVVNFCQkoU0lPQ1BST1RPUFJJVkFURSswKQorI2RlZmluZQlTSU9DUlNTQ0FVU0UJCShTSU9DUFJPVE9QUklWQVRFKzEpCisjZGVmaW5lCVNJT0NSU0wyQ0FMTAkJKFNJT0NQUk9UT1BSSVZBVEUrMikKKyNkZWZpbmUJU0lPQ1JTU0wyQ0FMTAkJKFNJT0NQUk9UT1BSSVZBVEUrMikKKyNkZWZpbmUJU0lPQ1JTQUNDRVBUCQkoU0lPQ1BST1RPUFJJVkFURSszKQorI2RlZmluZQlTSU9DUlNDTFJSVAkJKFNJT0NQUk9UT1BSSVZBVEUrNCkKKyNkZWZpbmUJU0lPQ1JTR0wyQ0FMTAkJKFNJT0NQUk9UT1BSSVZBVEUrNSkKKyNkZWZpbmUJU0lPQ1JTR0ZBQ0lMSVRJRVMJKFNJT0NQUk9UT1BSSVZBVEUrNikKKworI2RlZmluZQlST1NFX0RURV9PUklHSU5BVEVECTB4MDAKKyNkZWZpbmUJUk9TRV9OVU1CRVJfQlVTWQkweDAxCisjZGVmaW5lCVJPU0VfSU5WQUxJRF9GQUNJTElUWQkweDAzCisjZGVmaW5lCVJPU0VfTkVUV09SS19DT05HRVNUSU9OCTB4MDUKKyNkZWZpbmUJUk9TRV9PVVRfT0ZfT1JERVIJMHgwOQorI2RlZmluZQlST1NFX0FDQ0VTU19CQVJSRUQJMHgwQgorI2RlZmluZQlST1NFX05PVF9PQlRBSU5BQkxFCTB4MEQKKyNkZWZpbmUJUk9TRV9SRU1PVEVfUFJPQ0VEVVJFCTB4MTEKKyNkZWZpbmUJUk9TRV9MT0NBTF9QUk9DRURVUkUJMHgxMworI2RlZmluZQlST1NFX1NISVBfQUJTRU5UCTB4MzkKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIJCXJvc2VfYWRkcls1XTsKK30gcm9zZV9hZGRyZXNzOworCitzdHJ1Y3Qgc29ja2FkZHJfcm9zZSB7CisJX19rZXJuZWxfc2FfZmFtaWx5X3Qgc3Jvc2VfZmFtaWx5OworCXJvc2VfYWRkcmVzcwlzcm9zZV9hZGRyOworCWF4MjVfYWRkcmVzcwlzcm9zZV9jYWxsOworCWludAkJc3Jvc2VfbmRpZ2lzOworCWF4MjVfYWRkcmVzcwlzcm9zZV9kaWdpOworfTsKKworc3RydWN0IGZ1bGxfc29ja2FkZHJfcm9zZSB7CisJX19rZXJuZWxfc2FfZmFtaWx5X3Qgc3Jvc2VfZmFtaWx5OworCXJvc2VfYWRkcmVzcwlzcm9zZV9hZGRyOworCWF4MjVfYWRkcmVzcwlzcm9zZV9jYWxsOworCXVuc2lnbmVkIGludAlzcm9zZV9uZGlnaXM7CisJYXgyNV9hZGRyZXNzCXNyb3NlX2RpZ2lzW1JPU0VfTUFYX0RJR0lTXTsKK307CisKK3N0cnVjdCByb3NlX3JvdXRlX3N0cnVjdCB7CisJcm9zZV9hZGRyZXNzCWFkZHJlc3M7CisJdW5zaWduZWQgc2hvcnQJbWFzazsKKwlheDI1X2FkZHJlc3MJbmVpZ2hib3VyOworCWNoYXIJCWRldmljZVsxNl07CisJdW5zaWduZWQgY2hhcgluZGlnaXM7CisJYXgyNV9hZGRyZXNzCWRpZ2lwZWF0ZXJzW0FYMjVfTUFYX0RJR0lTXTsKK307CisKK3N0cnVjdCByb3NlX2NhdXNlX3N0cnVjdCB7CisJdW5zaWduZWQgY2hhcgljYXVzZTsKKwl1bnNpZ25lZCBjaGFyCWRpYWdub3N0aWM7Cit9OworCitzdHJ1Y3Qgcm9zZV9mYWNpbGl0aWVzX3N0cnVjdCB7CisJcm9zZV9hZGRyZXNzCXNvdXJjZV9hZGRyLCAgIGRlc3RfYWRkcjsKKwlheDI1X2FkZHJlc3MJc291cmNlX2NhbGwsICAgZGVzdF9jYWxsOworCXVuc2lnbmVkIGNoYXIJc291cmNlX25kaWdpcywgZGVzdF9uZGlnaXM7CisJYXgyNV9hZGRyZXNzCXNvdXJjZV9kaWdpc1tST1NFX01BWF9ESUdJU107CisJYXgyNV9hZGRyZXNzCWRlc3RfZGlnaXNbUk9TRV9NQVhfRElHSVNdOworCXVuc2lnbmVkIGludAlyYW5kOworCXJvc2VfYWRkcmVzcwlmYWlsX2FkZHI7CisJYXgyNV9hZGRyZXNzCWZhaWxfY2FsbDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yb3V0ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yb3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYWJmNTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JvdXRlLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBJUCByb3V0ZXIgaW50ZXJmYWNlLgorICoKKyAqIFZlcnNpb246CUAoIylyb3V0ZS5oCTEuMC4zCTA1LzI3LzkzCisgKgorICogQXV0aG9yczoJT3JpZ2luYWwgdGFrZW4gZnJvbSBCZXJrZWxleSBVTklYIDQuMywgKGMpIFVDQiAxOTg2LTE5ODgKKyAqCQlmb3IgdGhlIHB1cnBvc2VzIG9mIGNvbXBhdGliaWxpdHkgb25seS4KKyAqCisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgorICogQ2hhbmdlczoKKyAqICAgICAgICAgICAgICBNaWtlIE1jTGFnYW4gICAgOiAgICAgICBSb3V0aW5nIGJ5IHNvdXJjZQorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9MSU5VWF9ST1VURV9ICisjZGVmaW5lIF9MSU5VWF9ST1VURV9ICisKKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorCisKKy8qIFRoaXMgc3RydWN0dXJlIGdldHMgcGFzc2VkIGJ5IHRoZSBTSU9DQUREUlQgYW5kIFNJT0NERUxSVCBjYWxscy4gKi8KK3N0cnVjdCBydGVudHJ5IHsKKwl1bnNpZ25lZCBsb25nCXJ0X3BhZDE7CisJc3RydWN0IHNvY2thZGRyCXJ0X2RzdDsJCS8qIHRhcmdldCBhZGRyZXNzCQkqLworCXN0cnVjdCBzb2NrYWRkcglydF9nYXRld2F5OwkvKiBnYXRld2F5IGFkZHIgKFJURl9HQVRFV0FZKQkqLworCXN0cnVjdCBzb2NrYWRkcglydF9nZW5tYXNrOwkvKiB0YXJnZXQgbmV0d29yayBtYXNrIChJUCkJKi8KKwl1bnNpZ25lZCBzaG9ydAlydF9mbGFnczsKKwlzaG9ydAkJcnRfcGFkMjsKKwl1bnNpZ25lZCBsb25nCXJ0X3BhZDM7CisJdm9pZAkJKnJ0X3BhZDQ7CisJc2hvcnQJCXJ0X21ldHJpYzsJLyogKzEgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5IQkqLworCWNoYXIgKnJ0X2RldjsJLyogZm9yY2luZyB0aGUgZGV2aWNlIGF0IGFkZAkqLworCXVuc2lnbmVkIGxvbmcJcnRfbXR1OwkJLyogcGVyIHJvdXRlIE1UVS9XaW5kb3cgCSovCisjZGVmaW5lIHJ0X21zcwlydF9tdHUJCQkvKiBDb21wYXRpYmlsaXR5IDotKCAgICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZwlydF93aW5kb3c7CS8qIFdpbmRvdyBjbGFtcGluZyAJCSovCisJdW5zaWduZWQgc2hvcnQJcnRfaXJ0dDsJLyogSW5pdGlhbCBSVFQJCQkqLworfTsKKworCisjZGVmaW5lCVJURl9VUAkJMHgwMDAxCQkvKiByb3V0ZSB1c2FibGUJCSAgCSovCisjZGVmaW5lCVJURl9HQVRFV0FZCTB4MDAwMgkJLyogZGVzdGluYXRpb24gaXMgYSBnYXRld2F5CSovCisjZGVmaW5lCVJURl9IT1NUCTB4MDAwNAkJLyogaG9zdCBlbnRyeSAobmV0IG90aGVyd2lzZSkJKi8KKyNkZWZpbmUgUlRGX1JFSU5TVEFURQkweDAwMDgJCS8qIHJlaW5zdGF0ZSByb3V0ZSBhZnRlciB0bW91dAkqLworI2RlZmluZQlSVEZfRFlOQU1JQwkweDAwMTAJCS8qIGNyZWF0ZWQgZHluLiAoYnkgcmVkaXJlY3QpCSovCisjZGVmaW5lCVJURl9NT0RJRklFRAkweDAwMjAJCS8qIG1vZGlmaWVkIGR5bi4gKGJ5IHJlZGlyZWN0KQkqLworI2RlZmluZSBSVEZfTVRVCQkweDAwNDAJCS8qIHNwZWNpZmljIE1UVSBmb3IgdGhpcyByb3V0ZQkqLworI2RlZmluZSBSVEZfTVNTCQlSVEZfTVRVCQkvKiBDb21wYXRpYmlsaXR5IDotKAkJKi8KKyNkZWZpbmUgUlRGX1dJTkRPVwkweDAwODAJCS8qIHBlciByb3V0ZSB3aW5kb3cgY2xhbXBpbmcJKi8KKyNkZWZpbmUgUlRGX0lSVFQJMHgwMTAwCQkvKiBJbml0aWFsIHJvdW5kIHRyaXAgdGltZQkqLworI2RlZmluZSBSVEZfUkVKRUNUCTB4MDIwMAkJLyogUmVqZWN0IHJvdXRlCQkJKi8KKworLyoKKyAqCTxsaW51eC9pcHY2X3JvdXRlLmg+IHVzZXMgUlRGIHZhbHVlcyA+PSA2NGsKKyAqLworCisKKworI2VuZGlmCS8qIF9MSU5VWF9ST1VURV9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcnRjLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3J0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNjgzN2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3J0Yy5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogR2VuZXJpYyBSVEMgaW50ZXJmYWNlLgorICogVGhpcyB2ZXJzaW9uIGNvbnRhaW5zIHRoZSBwYXJ0IG9mIHRoZSB1c2VyIGludGVyZmFjZSB0byB0aGUgUmVhbCBUaW1lIENsb2NrCisgKiBzZXJ2aWNlLiBJdCBpcyB1c2VkIHdpdGggYm90aCB0aGUgbGVnYWN5IG1jMTQ2ODE4IGFuZCBhbHNvICBFRkkKKyAqIFN0cnVjdCBydGNfdGltZSBhbmQgZmlyc3QgMTIgaW9jdGwgYnkgUGF1bCBHb3J0bWFrZXIsIDE5OTYgLSBzZXBhcmF0ZWQgb3V0CisgKiBmcm9tIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPiB0byB0aGlzIGZpbGUgZm9yIDIuNCBrZXJuZWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBIZXdsZXR0LVBhY2thcmQgQ28uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgorICovCisjaWZuZGVmIF9MSU5VWF9SVENfSF8KKyNkZWZpbmUgX0xJTlVYX1JUQ19IXworCisvKgorICogVGhlIHN0cnVjdCB1c2VkIHRvIHBhc3MgZGF0YSB2aWEgdGhlIGZvbGxvd2luZyBpb2N0bC4gU2ltaWxhciB0byB0aGUKKyAqIHN0cnVjdCB0bSBpbiA8dGltZS5oPiwgYnV0IGl0IG5lZWRzIHRvIGJlIGhlcmUgc28gdGhhdCB0aGUga2VybmVsCisgKiBzb3VyY2UgaXMgc2VsZiBjb250YWluZWQsIGFsbG93aW5nIGNyb3NzLWNvbXBpbGVzLCBldGMuIGV0Yy4KKyAqLworCitzdHJ1Y3QgcnRjX3RpbWUgeworCWludCB0bV9zZWM7CisJaW50IHRtX21pbjsKKwlpbnQgdG1faG91cjsKKwlpbnQgdG1fbWRheTsKKwlpbnQgdG1fbW9uOworCWludCB0bV95ZWFyOworCWludCB0bV93ZGF5OworCWludCB0bV95ZGF5OworCWludCB0bV9pc2RzdDsKK307CisKKy8qCisgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIGluc3BpcmVkIGJ5IHRoZSBFRkkgKHYwLjkyKSB3YWtldXAKKyAqIGFsYXJtIEFQSS4KKyAqLworc3RydWN0IHJ0Y193a2Fscm0geworCXVuc2lnbmVkIGNoYXIgZW5hYmxlZDsJLyogMCA9IGFsYXJtIGRpc2FibGVkLCAxID0gYWxhcm0gZW5hYmxlZCAqLworCXVuc2lnbmVkIGNoYXIgcGVuZGluZzsgIC8qIDAgPSBhbGFybSBub3QgcGVuZGluZywgMSA9IGFsYXJtIHBlbmRpbmcgKi8KKwlzdHJ1Y3QgcnRjX3RpbWUgdGltZTsJLyogdGltZSB0aGUgYWxhcm0gaXMgc2V0IHRvICovCit9OworCisvKgorICogRGF0YSBzdHJ1Y3R1cmUgdG8gY29udHJvbCBQTEwgY29ycmVjdGlvbiBzb21lIGJldHRlciBSVEMgZmVhdHVyZQorICogcGxsX3ZhbHVlIGlzIHVzZWQgdG8gZ2V0IG9yIHNldCBjdXJyZW50IHZhbHVlIG9mIGNvcnJlY3Rpb24sCisgKiB0aGUgcmVzdCBvZiB0aGUgc3RydWN0IGlzIHVzZWQgdG8gcXVlcnkgSFcgY2FwYWJpbGl0aWVzLgorICogVGhpcyBpcyBtb2RlbGVkIGFmdGVyIHRoZSBSVEMgdXNlZCBpbiBRNDAvUTYwIGNvbXB1dGVycyBidXQKKyAqIHNob3VsZCBiZSBzdWZmaWNpZW50bHkgZmxleGlibGUgZm9yIG90aGVyIGRldmljZXMKKyAqCisgKiArdmUgcGxsX3ZhbHVlIG1lYW5zIGNsb2NrIHdpbGwgcnVuIGZhc3RlciBieQorICogICBwbGxfdmFsdWUqcGxsX3Bvc211bHQvcGxsX2Nsb2NrCisgKiAtdmUgcGxsX3ZhbHVlIG1lYW5zIGNsb2NrIHdpbGwgcnVuIHNsb3dlciBieQorICogICBwbGxfdmFsdWUqcGxsX25lZ211bHQvcGxsX2Nsb2NrCisgKi8KKworc3RydWN0IHJ0Y19wbGxfaW5mbyB7CisJaW50IHBsbF9jdHJsOyAgICAgICAvKiBwbGFjZWhvbGRlciBmb3IgZmFuY2llciBjb250cm9sICovCisJaW50IHBsbF92YWx1ZTsgICAgICAvKiBnZXQvc2V0IGNvcnJlY3Rpb24gdmFsdWUgKi8KKwlpbnQgcGxsX21heDsgICAgICAgIC8qIG1heCArdmUgKGZhc3RlcikgYWRqdXN0bWVudCB2YWx1ZSAqLworCWludCBwbGxfbWluOyAgICAgICAgLyogbWF4IC12ZSAoc2xvd2VyKSBhZGp1c3RtZW50IHZhbHVlICovCisJaW50IHBsbF9wb3NtdWx0OyAgICAvKiBmYWN0b3IgZm9yICt2ZSBjb3JyZWN0aW9uICovCisJaW50IHBsbF9uZWdtdWx0OyAgICAvKiBmYWN0b3IgZm9yIC12ZSBjb3JyZWN0aW9uICovCisJbG9uZyBwbGxfY2xvY2s7ICAgICAvKiBiYXNlIFBMTCBmcmVxdWVuY3kgKi8KK307CisKKy8qCisgKiBpb2N0bCBjYWxscyB0aGF0IGFyZSBwZXJtaXR0ZWQgdG8gdGhlIC9kZXYvcnRjIGludGVyZmFjZSwgaWYKKyAqIGFueSBvZiB0aGUgUlRDIGRyaXZlcnMgYXJlIGVuYWJsZWQuCisgKi8KKworI2RlZmluZSBSVENfQUlFX09OCV9JTygncCcsIDB4MDEpCS8qIEFsYXJtIGludC4gZW5hYmxlIG9uCQkqLworI2RlZmluZSBSVENfQUlFX09GRglfSU8oJ3AnLCAweDAyKQkvKiAuLi4gb2ZmCQkJKi8KKyNkZWZpbmUgUlRDX1VJRV9PTglfSU8oJ3AnLCAweDAzKQkvKiBVcGRhdGUgaW50LiBlbmFibGUgb24JKi8KKyNkZWZpbmUgUlRDX1VJRV9PRkYJX0lPKCdwJywgMHgwNCkJLyogLi4uIG9mZgkJCSovCisjZGVmaW5lIFJUQ19QSUVfT04JX0lPKCdwJywgMHgwNSkJLyogUGVyaW9kaWMgaW50LiBlbmFibGUgb24JKi8KKyNkZWZpbmUgUlRDX1BJRV9PRkYJX0lPKCdwJywgMHgwNikJLyogLi4uIG9mZgkJCSovCisjZGVmaW5lIFJUQ19XSUVfT04JX0lPKCdwJywgMHgwZikgIC8qIFdhdGNoZG9nIGludC4gZW5hYmxlIG9uCSovCisjZGVmaW5lIFJUQ19XSUVfT0ZGCV9JTygncCcsIDB4MTApICAvKiAuLi4gb2ZmCQkJKi8KKworI2RlZmluZSBSVENfQUxNX1NFVAlfSU9XKCdwJywgMHgwNywgc3RydWN0IHJ0Y190aW1lKSAvKiBTZXQgYWxhcm0gdGltZSAgKi8KKyNkZWZpbmUgUlRDX0FMTV9SRUFECV9JT1IoJ3AnLCAweDA4LCBzdHJ1Y3QgcnRjX3RpbWUpIC8qIFJlYWQgYWxhcm0gdGltZSAqLworI2RlZmluZSBSVENfUkRfVElNRQlfSU9SKCdwJywgMHgwOSwgc3RydWN0IHJ0Y190aW1lKSAvKiBSZWFkIFJUQyB0aW1lICAgKi8KKyNkZWZpbmUgUlRDX1NFVF9USU1FCV9JT1coJ3AnLCAweDBhLCBzdHJ1Y3QgcnRjX3RpbWUpIC8qIFNldCBSVEMgdGltZSAgICAqLworI2RlZmluZSBSVENfSVJRUF9SRUFECV9JT1IoJ3AnLCAweDBiLCB1bnNpZ25lZCBsb25nKQkgLyogUmVhZCBJUlEgcmF0ZSAgICovCisjZGVmaW5lIFJUQ19JUlFQX1NFVAlfSU9XKCdwJywgMHgwYywgdW5zaWduZWQgbG9uZykJIC8qIFNldCBJUlEgcmF0ZSAgICAqLworI2RlZmluZSBSVENfRVBPQ0hfUkVBRAlfSU9SKCdwJywgMHgwZCwgdW5zaWduZWQgbG9uZykJIC8qIFJlYWQgZXBvY2ggICAgICAqLworI2RlZmluZSBSVENfRVBPQ0hfU0VUCV9JT1coJ3AnLCAweDBlLCB1bnNpZ25lZCBsb25nKQkgLyogU2V0IGVwb2NoICAgICAgICovCisKKyNkZWZpbmUgUlRDX1dLQUxNX1NFVAlfSU9XKCdwJywgMHgwZiwgc3RydWN0IHJ0Y193a2Fscm0pLyogU2V0IHdha2V1cCBhbGFybSovCisjZGVmaW5lIFJUQ19XS0FMTV9SRAlfSU9SKCdwJywgMHgxMCwgc3RydWN0IHJ0Y193a2Fscm0pLyogR2V0IHdha2V1cCBhbGFybSovCisKKyNkZWZpbmUgUlRDX1BMTF9HRVQJX0lPUigncCcsIDB4MTEsIHN0cnVjdCBydGNfcGxsX2luZm8pICAvKiBHZXQgUExMIGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUgUlRDX1BMTF9TRVQJX0lPVygncCcsIDB4MTIsIHN0cnVjdCBydGNfcGxsX2luZm8pICAvKiBTZXQgUExMIGNvcnJlY3Rpb24gKi8KKworLyogaW50ZXJydXB0IGZsYWdzICovCisjZGVmaW5lIFJUQ19JUlFGIDB4ODAJLyogQW55IG9mIHRoZSBmb2xsb3dpbmcgaXMgYWN0aXZlICovCisjZGVmaW5lIFJUQ19QRiAweDQwCS8qIFBlcmlvZGljIGludGVycnVwdCAqLworI2RlZmluZSBSVENfQUYgMHgyMAkvKiBBbGFybSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUlRDX1VGIDB4MTAJLyogVXBkYXRlIGludGVycnVwdCBmb3IgMUh6IFJUQyAqLworCisKKyNkZWZpbmUgUlRDX01BWF9GUkVRCTgxOTIKKworCisjZW5kaWYgLyogX0xJTlVYX1JUQ19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJiMTllNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKQEAgLTAsMCArMSw2MDcgQEAKKyNpZm5kZWYgX19MSU5VWF9SVE5FVExJTktfSAorI2RlZmluZSBfX0xJTlVYX1JUTkVUTElOS19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYWRkci5oPgorI2luY2x1ZGUgPGxpbnV4L25laWdoYm91ci5oPgorCisvKiBydG5ldGxpbmsgZmFtaWxpZXMuIFZhbHVlcyB1cCB0byAxMjcgYXJlIHJlc2VydmVkIGZvciByZWFsIGFkZHJlc3MKKyAqIGZhbWlsaWVzLCB2YWx1ZXMgYWJvdmUgMTI4IG1heSBiZSB1c2VkIGFyYml0cmFyaWx5LgorICovCisjZGVmaW5lIFJUTkxfRkFNSUxZX0lQTVIJCTEyOAorI2RlZmluZSBSVE5MX0ZBTUlMWV9JUDZNUgkJMTI5CisjZGVmaW5lIFJUTkxfRkFNSUxZX01BWAkJCTEyOQorCisvKioqKgorICoJCVJvdXRpbmcvbmVpZ2hib3VyIGRpc2NvdmVyeSBtZXNzYWdlcy4KKyAqKioqLworCisvKiBUeXBlcyBvZiBtZXNzYWdlcyAqLworCitlbnVtIHsKKwlSVE1fQkFTRQk9IDE2LAorI2RlZmluZSBSVE1fQkFTRQlSVE1fQkFTRQorCisJUlRNX05FV0xJTksJPSAxNiwKKyNkZWZpbmUgUlRNX05FV0xJTksJUlRNX05FV0xJTksKKwlSVE1fREVMTElOSywKKyNkZWZpbmUgUlRNX0RFTExJTksJUlRNX0RFTExJTksKKwlSVE1fR0VUTElOSywKKyNkZWZpbmUgUlRNX0dFVExJTksJUlRNX0dFVExJTksKKwlSVE1fU0VUTElOSywKKyNkZWZpbmUgUlRNX1NFVExJTksJUlRNX1NFVExJTksKKworCVJUTV9ORVdBRERSCT0gMjAsCisjZGVmaW5lIFJUTV9ORVdBRERSCVJUTV9ORVdBRERSCisJUlRNX0RFTEFERFIsCisjZGVmaW5lIFJUTV9ERUxBRERSCVJUTV9ERUxBRERSCisJUlRNX0dFVEFERFIsCisjZGVmaW5lIFJUTV9HRVRBRERSCVJUTV9HRVRBRERSCisKKwlSVE1fTkVXUk9VVEUJPSAyNCwKKyNkZWZpbmUgUlRNX05FV1JPVVRFCVJUTV9ORVdST1VURQorCVJUTV9ERUxST1VURSwKKyNkZWZpbmUgUlRNX0RFTFJPVVRFCVJUTV9ERUxST1VURQorCVJUTV9HRVRST1VURSwKKyNkZWZpbmUgUlRNX0dFVFJPVVRFCVJUTV9HRVRST1VURQorCisJUlRNX05FV05FSUdICT0gMjgsCisjZGVmaW5lIFJUTV9ORVdORUlHSAlSVE1fTkVXTkVJR0gKKwlSVE1fREVMTkVJR0gsCisjZGVmaW5lIFJUTV9ERUxORUlHSAlSVE1fREVMTkVJR0gKKwlSVE1fR0VUTkVJR0gsCisjZGVmaW5lIFJUTV9HRVRORUlHSAlSVE1fR0VUTkVJR0gKKworCVJUTV9ORVdSVUxFCT0gMzIsCisjZGVmaW5lIFJUTV9ORVdSVUxFCVJUTV9ORVdSVUxFCisJUlRNX0RFTFJVTEUsCisjZGVmaW5lIFJUTV9ERUxSVUxFCVJUTV9ERUxSVUxFCisJUlRNX0dFVFJVTEUsCisjZGVmaW5lIFJUTV9HRVRSVUxFCVJUTV9HRVRSVUxFCisKKwlSVE1fTkVXUURJU0MJPSAzNiwKKyNkZWZpbmUgUlRNX05FV1FESVNDCVJUTV9ORVdRRElTQworCVJUTV9ERUxRRElTQywKKyNkZWZpbmUgUlRNX0RFTFFESVNDCVJUTV9ERUxRRElTQworCVJUTV9HRVRRRElTQywKKyNkZWZpbmUgUlRNX0dFVFFESVNDCVJUTV9HRVRRRElTQworCisJUlRNX05FV1RDTEFTUwk9IDQwLAorI2RlZmluZSBSVE1fTkVXVENMQVNTCVJUTV9ORVdUQ0xBU1MKKwlSVE1fREVMVENMQVNTLAorI2RlZmluZSBSVE1fREVMVENMQVNTCVJUTV9ERUxUQ0xBU1MKKwlSVE1fR0VUVENMQVNTLAorI2RlZmluZSBSVE1fR0VUVENMQVNTCVJUTV9HRVRUQ0xBU1MKKworCVJUTV9ORVdURklMVEVSCT0gNDQsCisjZGVmaW5lIFJUTV9ORVdURklMVEVSCVJUTV9ORVdURklMVEVSCisJUlRNX0RFTFRGSUxURVIsCisjZGVmaW5lIFJUTV9ERUxURklMVEVSCVJUTV9ERUxURklMVEVSCisJUlRNX0dFVFRGSUxURVIsCisjZGVmaW5lIFJUTV9HRVRURklMVEVSCVJUTV9HRVRURklMVEVSCisKKwlSVE1fTkVXQUNUSU9OCT0gNDgsCisjZGVmaW5lIFJUTV9ORVdBQ1RJT04gICBSVE1fTkVXQUNUSU9OCisJUlRNX0RFTEFDVElPTiwKKyNkZWZpbmUgUlRNX0RFTEFDVElPTiAgIFJUTV9ERUxBQ1RJT04KKwlSVE1fR0VUQUNUSU9OLAorI2RlZmluZSBSVE1fR0VUQUNUSU9OICAgUlRNX0dFVEFDVElPTgorCisJUlRNX05FV1BSRUZJWAk9IDUyLAorI2RlZmluZSBSVE1fTkVXUFJFRklYCVJUTV9ORVdQUkVGSVgKKworCVJUTV9HRVRNVUxUSUNBU1QgPSA1OCwKKyNkZWZpbmUgUlRNX0dFVE1VTFRJQ0FTVCBSVE1fR0VUTVVMVElDQVNUCisKKwlSVE1fR0VUQU5ZQ0FTVAk9IDYyLAorI2RlZmluZSBSVE1fR0VUQU5ZQ0FTVAlSVE1fR0VUQU5ZQ0FTVAorCisJUlRNX05FV05FSUdIVEJMCT0gNjQsCisjZGVmaW5lIFJUTV9ORVdORUlHSFRCTAlSVE1fTkVXTkVJR0hUQkwKKwlSVE1fR0VUTkVJR0hUQkwJPSA2NiwKKyNkZWZpbmUgUlRNX0dFVE5FSUdIVEJMCVJUTV9HRVRORUlHSFRCTAorCVJUTV9TRVRORUlHSFRCTCwKKyNkZWZpbmUgUlRNX1NFVE5FSUdIVEJMCVJUTV9TRVRORUlHSFRCTAorCisJUlRNX05FV05EVVNFUk9QVCA9IDY4LAorI2RlZmluZSBSVE1fTkVXTkRVU0VST1BUIFJUTV9ORVdORFVTRVJPUFQKKworCVJUTV9ORVdBRERSTEFCRUwgPSA3MiwKKyNkZWZpbmUgUlRNX05FV0FERFJMQUJFTCBSVE1fTkVXQUREUkxBQkVMCisJUlRNX0RFTEFERFJMQUJFTCwKKyNkZWZpbmUgUlRNX0RFTEFERFJMQUJFTCBSVE1fREVMQUREUkxBQkVMCisJUlRNX0dFVEFERFJMQUJFTCwKKyNkZWZpbmUgUlRNX0dFVEFERFJMQUJFTCBSVE1fR0VUQUREUkxBQkVMCisKKwlSVE1fR0VURENCID0gNzgsCisjZGVmaW5lIFJUTV9HRVREQ0IgUlRNX0dFVERDQgorCVJUTV9TRVREQ0IsCisjZGVmaW5lIFJUTV9TRVREQ0IgUlRNX1NFVERDQgorCisJX19SVE1fTUFYLAorI2RlZmluZSBSVE1fTUFYCQkoKChfX1JUTV9NQVggKyAzKSAmIH4zKSAtIDEpCit9OworCisjZGVmaW5lIFJUTV9OUl9NU0dUWVBFUwkoUlRNX01BWCArIDEgLSBSVE1fQkFTRSkKKyNkZWZpbmUgUlRNX05SX0ZBTUlMSUVTCShSVE1fTlJfTVNHVFlQRVMgPj4gMikKKyNkZWZpbmUgUlRNX0ZBTShjbWQpCSgoKGNtZCkgLSBSVE1fQkFTRSkgPj4gMikKKworLyogCisgICBHZW5lcmljIHN0cnVjdHVyZSBmb3IgZW5jYXBzdWxhdGlvbiBvZiBvcHRpb25hbCByb3V0ZSBpbmZvcm1hdGlvbi4KKyAgIEl0IGlzIHJlbWluaXNjZW50IG9mIHNvY2thZGRyLCBidXQgd2l0aCBzYV9mYW1pbHkgcmVwbGFjZWQKKyAgIHdpdGggYXR0cmlidXRlIHR5cGUuCisgKi8KKworc3RydWN0IHJ0YXR0ciB7CisJdW5zaWduZWQgc2hvcnQJcnRhX2xlbjsKKwl1bnNpZ25lZCBzaG9ydAlydGFfdHlwZTsKK307CisKKy8qIE1hY3JvcyB0byBoYW5kbGUgcnRhdHRyaWJ1dGVzICovCisKKyNkZWZpbmUgUlRBX0FMSUdOVE8JNAorI2RlZmluZSBSVEFfQUxJR04obGVuKSAoICgobGVuKStSVEFfQUxJR05UTy0xKSAmIH4oUlRBX0FMSUdOVE8tMSkgKQorI2RlZmluZSBSVEFfT0socnRhLGxlbikgKChsZW4pID49IChpbnQpc2l6ZW9mKHN0cnVjdCBydGF0dHIpICYmIFwKKwkJCSAocnRhKS0+cnRhX2xlbiA+PSBzaXplb2Yoc3RydWN0IHJ0YXR0cikgJiYgXAorCQkJIChydGEpLT5ydGFfbGVuIDw9IChsZW4pKQorI2RlZmluZSBSVEFfTkVYVChydGEsYXR0cmxlbikJKChhdHRybGVuKSAtPSBSVEFfQUxJR04oKHJ0YSktPnJ0YV9sZW4pLCBcCisJCQkJIChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocnRhKSkgKyBSVEFfQUxJR04oKHJ0YSktPnJ0YV9sZW4pKSkKKyNkZWZpbmUgUlRBX0xFTkdUSChsZW4pCShSVEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBydGF0dHIpKSArIChsZW4pKQorI2RlZmluZSBSVEFfU1BBQ0UobGVuKQlSVEFfQUxJR04oUlRBX0xFTkdUSChsZW4pKQorI2RlZmluZSBSVEFfREFUQShydGEpICAgKCh2b2lkKikoKChjaGFyKikocnRhKSkgKyBSVEFfTEVOR1RIKDApKSkKKyNkZWZpbmUgUlRBX1BBWUxPQUQocnRhKSAoKGludCkoKHJ0YSktPnJ0YV9sZW4pIC0gUlRBX0xFTkdUSCgwKSkKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCURlZmluaXRpb25zIHVzZWQgaW4gcm91dGluZyB0YWJsZSBhZG1pbmlzdHJhdGlvbi4KKyAqKioqLworCitzdHJ1Y3QgcnRtc2cgeworCXVuc2lnbmVkIGNoYXIJCXJ0bV9mYW1pbHk7CisJdW5zaWduZWQgY2hhcgkJcnRtX2RzdF9sZW47CisJdW5zaWduZWQgY2hhcgkJcnRtX3NyY19sZW47CisJdW5zaWduZWQgY2hhcgkJcnRtX3RvczsKKworCXVuc2lnbmVkIGNoYXIJCXJ0bV90YWJsZTsJLyogUm91dGluZyB0YWJsZSBpZCAqLworCXVuc2lnbmVkIGNoYXIJCXJ0bV9wcm90b2NvbDsJLyogUm91dGluZyBwcm90b2NvbDsgc2VlIGJlbG93CSovCisJdW5zaWduZWQgY2hhcgkJcnRtX3Njb3BlOwkvKiBTZWUgYmVsb3cgKi8JCisJdW5zaWduZWQgY2hhcgkJcnRtX3R5cGU7CS8qIFNlZSBiZWxvdwkqLworCisJdW5zaWduZWQJCXJ0bV9mbGFnczsKK307CisKKy8qIHJ0bV90eXBlICovCisKK2VudW0geworCVJUTl9VTlNQRUMsCisJUlROX1VOSUNBU1QsCQkvKiBHYXRld2F5IG9yIGRpcmVjdCByb3V0ZQkqLworCVJUTl9MT0NBTCwJCS8qIEFjY2VwdCBsb2NhbGx5CQkqLworCVJUTl9CUk9BRENBU1QsCQkvKiBBY2NlcHQgbG9jYWxseSBhcyBicm9hZGNhc3QsCisJCQkJICAgc2VuZCBhcyBicm9hZGNhc3QgKi8KKwlSVE5fQU5ZQ0FTVCwJCS8qIEFjY2VwdCBsb2NhbGx5IGFzIGJyb2FkY2FzdCwKKwkJCQkgICBidXQgc2VuZCBhcyB1bmljYXN0ICovCisJUlROX01VTFRJQ0FTVCwJCS8qIE11bHRpY2FzdCByb3V0ZQkJKi8KKwlSVE5fQkxBQ0tIT0xFLAkJLyogRHJvcAkJCQkqLworCVJUTl9VTlJFQUNIQUJMRSwJLyogRGVzdGluYXRpb24gaXMgdW5yZWFjaGFibGUgICAqLworCVJUTl9QUk9ISUJJVCwJCS8qIEFkbWluaXN0cmF0aXZlbHkgcHJvaGliaXRlZAkqLworCVJUTl9USFJPVywJCS8qIE5vdCBpbiB0aGlzIHRhYmxlCQkqLworCVJUTl9OQVQsCQkvKiBUcmFuc2xhdGUgdGhpcyBhZGRyZXNzCSovCisJUlROX1hSRVNPTFZFLAkJLyogVXNlIGV4dGVybmFsIHJlc29sdmVyCSovCisJX19SVE5fTUFYCit9OworCisjZGVmaW5lIFJUTl9NQVggKF9fUlROX01BWCAtIDEpCisKKworLyogcnRtX3Byb3RvY29sICovCisKKyNkZWZpbmUgUlRQUk9UX1VOU1BFQwkwCisjZGVmaW5lIFJUUFJPVF9SRURJUkVDVAkxCS8qIFJvdXRlIGluc3RhbGxlZCBieSBJQ01QIHJlZGlyZWN0czsKKwkJCQkgICBub3QgdXNlZCBieSBjdXJyZW50IElQdjQgKi8KKyNkZWZpbmUgUlRQUk9UX0tFUk5FTAkyCS8qIFJvdXRlIGluc3RhbGxlZCBieSBrZXJuZWwJCSovCisjZGVmaW5lIFJUUFJPVF9CT09UCTMJLyogUm91dGUgaW5zdGFsbGVkIGR1cmluZyBib290CQkqLworI2RlZmluZSBSVFBST1RfU1RBVElDCTQJLyogUm91dGUgaW5zdGFsbGVkIGJ5IGFkbWluaXN0cmF0b3IJKi8KKworLyogVmFsdWVzIG9mIHByb3RvY29sID49IFJUUFJPVF9TVEFUSUMgYXJlIG5vdCBpbnRlcnByZXRlZCBieSBrZXJuZWw7CisgICB0aGV5IGFyZSBqdXN0IHBhc3NlZCBmcm9tIHVzZXIgYW5kIGJhY2sgYXMgaXMuCisgICBJdCB3aWxsIGJlIHVzZWQgYnkgaHlwb3RoZXRpY2FsIG11bHRpcGxlIHJvdXRpbmcgZGFlbW9ucy4KKyAgIE5vdGUgdGhhdCBwcm90b2NvbCB2YWx1ZXMgc2hvdWxkIGJlIHN0YW5kYXJkaXplZCBpbiBvcmRlciB0bworICAgYXZvaWQgY29uZmxpY3RzLgorICovCisKKyNkZWZpbmUgUlRQUk9UX0dBVEVECTgJLyogQXBwYXJlbnRseSwgR2F0ZUQgKi8KKyNkZWZpbmUgUlRQUk9UX1JBCTkJLyogUkRJU0MvTkQgcm91dGVyIGFkdmVydGlzZW1lbnRzICovCisjZGVmaW5lIFJUUFJPVF9NUlQJMTAJLyogTWVyaXQgTVJUICovCisjZGVmaW5lIFJUUFJPVF9aRUJSQQkxMQkvKiBaZWJyYSAqLworI2RlZmluZSBSVFBST1RfQklSRAkxMgkvKiBCSVJEICovCisjZGVmaW5lIFJUUFJPVF9ETlJPVVRFRAkxMwkvKiBERUNuZXQgcm91dGluZyBkYWVtb24gKi8KKyNkZWZpbmUgUlRQUk9UX1hPUlAJMTQJLyogWE9SUCAqLworI2RlZmluZSBSVFBST1RfTlRLCTE1CS8qIE5ldHN1a3VrdSAqLworI2RlZmluZSBSVFBST1RfREhDUAkxNiAgICAgIC8qIERIQ1AgY2xpZW50ICovCisKKy8qIHJ0bV9zY29wZQorCisgICBSZWFsbHkgaXQgaXMgbm90IHNjb3BlLCBidXQgc29ydCBvZiBkaXN0YW5jZSB0byB0aGUgZGVzdGluYXRpb24uCisgICBOT1dIRVJFIGFyZSByZXNlcnZlZCBmb3Igbm90IGV4aXN0aW5nIGRlc3RpbmF0aW9ucywgSE9TVCBpcyBvdXIKKyAgIGxvY2FsIGFkZHJlc3NlcywgTElOSyBhcmUgZGVzdGluYXRpb25zLCBsb2NhdGVkIG9uIGRpcmVjdGx5IGF0dGFjaGVkCisgICBsaW5rIGFuZCBVTklWRVJTRSBpcyBldmVyeXdoZXJlIGluIHRoZSBVbml2ZXJzZS4KKworICAgSW50ZXJtZWRpYXRlIHZhbHVlcyBhcmUgYWxzbyBwb3NzaWJsZSBmLmUuIGludGVyaW9yIHJvdXRlcworICAgY291bGQgYmUgYXNzaWduZWQgYSB2YWx1ZSBiZXR3ZWVuIFVOSVZFUlNFIGFuZCBMSU5LLgorKi8KKworZW51bSBydF9zY29wZV90IHsKKwlSVF9TQ09QRV9VTklWRVJTRT0wLAorLyogVXNlciBkZWZpbmVkIHZhbHVlcyAgKi8KKwlSVF9TQ09QRV9TSVRFPTIwMCwKKwlSVF9TQ09QRV9MSU5LPTI1MywKKwlSVF9TQ09QRV9IT1NUPTI1NCwKKwlSVF9TQ09QRV9OT1dIRVJFPTI1NQorfTsKKworLyogcnRtX2ZsYWdzICovCisKKyNkZWZpbmUgUlRNX0ZfTk9USUZZCQkweDEwMAkvKiBOb3RpZnkgdXNlciBvZiByb3V0ZSBjaGFuZ2UJKi8KKyNkZWZpbmUgUlRNX0ZfQ0xPTkVECQkweDIwMAkvKiBUaGlzIHJvdXRlIGlzIGNsb25lZAkJKi8KKyNkZWZpbmUgUlRNX0ZfRVFVQUxJWkUJCTB4NDAwCS8qIE11bHRpcGF0aCBlcXVhbGl6ZXI6IE5JCSovCisjZGVmaW5lIFJUTV9GX1BSRUZJWAkJMHg4MDAJLyogUHJlZml4IGFkZHJlc3NlcwkJKi8KKworLyogUmVzZXJ2ZWQgdGFibGUgaWRlbnRpZmllcnMgKi8KKworZW51bSBydF9jbGFzc190IHsKKwlSVF9UQUJMRV9VTlNQRUM9MCwKKy8qIFVzZXIgZGVmaW5lZCB2YWx1ZXMgKi8KKwlSVF9UQUJMRV9DT01QQVQ9MjUyLAorCVJUX1RBQkxFX0RFRkFVTFQ9MjUzLAorCVJUX1RBQkxFX01BSU49MjU0LAorCVJUX1RBQkxFX0xPQ0FMPTI1NSwKKwlSVF9UQUJMRV9NQVg9MHhGRkZGRkZGRgorfTsKKworCisvKiBSb3V0aW5nIG1lc3NhZ2UgYXR0cmlidXRlcyAqLworCitlbnVtIHJ0YXR0cl90eXBlX3QgeworCVJUQV9VTlNQRUMsCisJUlRBX0RTVCwKKwlSVEFfU1JDLAorCVJUQV9JSUYsCisJUlRBX09JRiwKKwlSVEFfR0FURVdBWSwKKwlSVEFfUFJJT1JJVFksCisJUlRBX1BSRUZTUkMsCisJUlRBX01FVFJJQ1MsCisJUlRBX01VTFRJUEFUSCwKKwlSVEFfUFJPVE9JTkZPLCAvKiBubyBsb25nZXIgdXNlZCAqLworCVJUQV9GTE9XLAorCVJUQV9DQUNIRUlORk8sCisJUlRBX1NFU1NJT04sIC8qIG5vIGxvbmdlciB1c2VkICovCisJUlRBX01QX0FMR08sIC8qIG5vIGxvbmdlciB1c2VkICovCisJUlRBX1RBQkxFLAorCVJUQV9NQVJLLAorCV9fUlRBX01BWAorfTsKKworI2RlZmluZSBSVEFfTUFYIChfX1JUQV9NQVggLSAxKQorCisjZGVmaW5lIFJUTV9SVEEocikgICgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHIpKSArIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgcnRtc2cpKSkpCisjZGVmaW5lIFJUTV9QQVlMT0FEKG4pIE5MTVNHX1BBWUxPQUQobixzaXplb2Yoc3RydWN0IHJ0bXNnKSkKKworLyogUlRNX01VTFRJUEFUSCAtLS0gYXJyYXkgb2Ygc3RydWN0IHJ0bmV4dGhvcC4KKyAqCisgKiAic3RydWN0IHJ0bmV4dGhvcCIgZGVzY3JpYmVzIGFsbCBuZWNlc3NhcnkgbmV4dGhvcCBpbmZvcm1hdGlvbiwKKyAqIGkuZS4gcGFyYW1ldGVycyBvZiBwYXRoIHRvIGEgZGVzdGluYXRpb24gdmlhIHRoaXMgbmV4dGhvcC4KKyAqCisgKiBBdCB0aGUgbW9tZW50IGl0IGlzIGltcG9zc2libGUgdG8gc2V0IGRpZmZlcmVudCBwcmVmc3JjLCBtdHUsIHdpbmRvdworICogYW5kIHJ0dCBmb3IgZGlmZmVyZW50IHBhdGhzIGZyb20gbXVsdGlwYXRoLgorICovCisKK3N0cnVjdCBydG5leHRob3AgeworCXVuc2lnbmVkIHNob3J0CQlydG5oX2xlbjsKKwl1bnNpZ25lZCBjaGFyCQlydG5oX2ZsYWdzOworCXVuc2lnbmVkIGNoYXIJCXJ0bmhfaG9wczsKKwlpbnQJCQlydG5oX2lmaW5kZXg7Cit9OworCisvKiBydG5oX2ZsYWdzICovCisKKyNkZWZpbmUgUlROSF9GX0RFQUQJCTEJLyogTmV4dGhvcCBpcyBkZWFkICh1c2VkIGJ5IG11bHRpcGF0aCkJKi8KKyNkZWZpbmUgUlROSF9GX1BFUlZBU0lWRQkyCS8qIERvIHJlY3Vyc2l2ZSBnYXRld2F5IGxvb2t1cAkqLworI2RlZmluZSBSVE5IX0ZfT05MSU5LCQk0CS8qIEdhdGV3YXkgaXMgZm9yY2VkIG9uIGxpbmsJKi8KKworLyogTWFjcm9zIHRvIGhhbmRsZSBoZXh0aG9wcyAqLworCisjZGVmaW5lIFJUTkhfQUxJR05UTwk0CisjZGVmaW5lIFJUTkhfQUxJR04obGVuKSAoICgobGVuKStSVE5IX0FMSUdOVE8tMSkgJiB+KFJUTkhfQUxJR05UTy0xKSApCisjZGVmaW5lIFJUTkhfT0socnRuaCxsZW4pICgocnRuaCktPnJ0bmhfbGVuID49IHNpemVvZihzdHJ1Y3QgcnRuZXh0aG9wKSAmJiBcCisJCQkgICAoKGludCkocnRuaCktPnJ0bmhfbGVuKSA8PSAobGVuKSkKKyNkZWZpbmUgUlROSF9ORVhUKHJ0bmgpCSgoc3RydWN0IHJ0bmV4dGhvcCopKCgoY2hhciopKHJ0bmgpKSArIFJUTkhfQUxJR04oKHJ0bmgpLT5ydG5oX2xlbikpKQorI2RlZmluZSBSVE5IX0xFTkdUSChsZW4pIChSVE5IX0FMSUdOKHNpemVvZihzdHJ1Y3QgcnRuZXh0aG9wKSkgKyAobGVuKSkKKyNkZWZpbmUgUlROSF9TUEFDRShsZW4pCVJUTkhfQUxJR04oUlROSF9MRU5HVEgobGVuKSkKKyNkZWZpbmUgUlROSF9EQVRBKHJ0bmgpICAgKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocnRuaCkpICsgUlROSF9MRU5HVEgoMCkpKQorCisvKiBSVE1fQ0FDSEVJTkZPICovCisKK3N0cnVjdCBydGFfY2FjaGVpbmZvIHsKKwlfX3UzMglydGFfY2xudHJlZjsKKwlfX3UzMglydGFfbGFzdHVzZTsKKwlfX3MzMglydGFfZXhwaXJlczsKKwlfX3UzMglydGFfZXJyb3I7CisJX191MzIJcnRhX3VzZWQ7CisKKyNkZWZpbmUgUlRORVRMSU5LX0hBVkVfUEVFUklORk8gMQorCV9fdTMyCXJ0YV9pZDsKKwlfX3UzMglydGFfdHM7CisJX191MzIJcnRhX3RzYWdlOworfTsKKworLyogUlRNX01FVFJJQ1MgLS0tIGFycmF5IG9mIHN0cnVjdCBydGF0dHIgd2l0aCB0eXBlcyBvZiBSVEFYXyogKi8KKworZW51bSB7CisJUlRBWF9VTlNQRUMsCisjZGVmaW5lIFJUQVhfVU5TUEVDIFJUQVhfVU5TUEVDCisJUlRBWF9MT0NLLAorI2RlZmluZSBSVEFYX0xPQ0sgUlRBWF9MT0NLCisJUlRBWF9NVFUsCisjZGVmaW5lIFJUQVhfTVRVIFJUQVhfTVRVCisJUlRBWF9XSU5ET1csCisjZGVmaW5lIFJUQVhfV0lORE9XIFJUQVhfV0lORE9XCisJUlRBWF9SVFQsCisjZGVmaW5lIFJUQVhfUlRUIFJUQVhfUlRUCisJUlRBWF9SVFRWQVIsCisjZGVmaW5lIFJUQVhfUlRUVkFSIFJUQVhfUlRUVkFSCisJUlRBWF9TU1RIUkVTSCwKKyNkZWZpbmUgUlRBWF9TU1RIUkVTSCBSVEFYX1NTVEhSRVNICisJUlRBWF9DV05ELAorI2RlZmluZSBSVEFYX0NXTkQgUlRBWF9DV05ECisJUlRBWF9BRFZNU1MsCisjZGVmaW5lIFJUQVhfQURWTVNTIFJUQVhfQURWTVNTCisJUlRBWF9SRU9SREVSSU5HLAorI2RlZmluZSBSVEFYX1JFT1JERVJJTkcgUlRBWF9SRU9SREVSSU5HCisJUlRBWF9IT1BMSU1JVCwKKyNkZWZpbmUgUlRBWF9IT1BMSU1JVCBSVEFYX0hPUExJTUlUCisJUlRBWF9JTklUQ1dORCwKKyNkZWZpbmUgUlRBWF9JTklUQ1dORCBSVEFYX0lOSVRDV05ECisJUlRBWF9GRUFUVVJFUywKKyNkZWZpbmUgUlRBWF9GRUFUVVJFUyBSVEFYX0ZFQVRVUkVTCisJUlRBWF9SVE9fTUlOLAorI2RlZmluZSBSVEFYX1JUT19NSU4gUlRBWF9SVE9fTUlOCisJUlRBWF9JTklUUldORCwKKyNkZWZpbmUgUlRBWF9JTklUUldORCBSVEFYX0lOSVRSV05ECisJX19SVEFYX01BWAorfTsKKworI2RlZmluZSBSVEFYX01BWCAoX19SVEFYX01BWCAtIDEpCisKKyNkZWZpbmUgUlRBWF9GRUFUVVJFX0VDTgkweDAwMDAwMDAxCisjZGVmaW5lIFJUQVhfRkVBVFVSRV9TQUNLCTB4MDAwMDAwMDIKKyNkZWZpbmUgUlRBWF9GRUFUVVJFX1RJTUVTVEFNUAkweDAwMDAwMDA0CisjZGVmaW5lIFJUQVhfRkVBVFVSRV9BTExGUkFHCTB4MDAwMDAwMDgKKworc3RydWN0IHJ0YV9zZXNzaW9uIHsKKwlfX3U4CXByb3RvOworCV9fdTgJcGFkMTsKKwlfX3UxNglwYWQyOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191MTYJc3BvcnQ7CisJCQlfX3UxNglkcG9ydDsKKwkJfSBwb3J0czsKKworCQlzdHJ1Y3QgeworCQkJX191OAl0eXBlOworCQkJX191OAljb2RlOworCQkJX191MTYJaWRlbnQ7CisJCX0gaWNtcHQ7CisKKwkJX191MzIJCXNwaTsKKwl9IHU7Cit9OworCisvKioqKgorICoJCUdlbmVyYWwgZm9ybSBvZiBhZGRyZXNzIGZhbWlseSBkZXBlbmRlbnQgbWVzc2FnZS4KKyAqKioqLworCitzdHJ1Y3QgcnRnZW5tc2cgeworCXVuc2lnbmVkIGNoYXIJCXJ0Z2VuX2ZhbWlseTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUxpbmsgbGF5ZXIgc3BlY2lmaWMgbWVzc2FnZXMuCisgKioqKi8KKworLyogc3RydWN0IGlmaW5mb21zZworICogcGFzc2VzIGxpbmsgbGV2ZWwgc3BlY2lmaWMgaW5mb3JtYXRpb24sIG5vdCBkZXBlbmRlbnQKKyAqIG9uIG5ldHdvcmsgcHJvdG9jb2wuCisgKi8KKworc3RydWN0IGlmaW5mb21zZyB7CisJdW5zaWduZWQgY2hhcglpZmlfZmFtaWx5OworCXVuc2lnbmVkIGNoYXIJX19pZmlfcGFkOworCXVuc2lnbmVkIHNob3J0CWlmaV90eXBlOwkJLyogQVJQSFJEXyogKi8KKwlpbnQJCWlmaV9pbmRleDsJCS8qIExpbmsgaW5kZXgJKi8KKwl1bnNpZ25lZAlpZmlfZmxhZ3M7CQkvKiBJRkZfKiBmbGFncwkqLworCXVuc2lnbmVkCWlmaV9jaGFuZ2U7CQkvKiBJRkZfKiBjaGFuZ2UgbWFzayAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJcHJlZml4IGluZm9ybWF0aW9uIAorICoqKiovCisKK3N0cnVjdCBwcmVmaXhtc2cgeworCXVuc2lnbmVkIGNoYXIJcHJlZml4X2ZhbWlseTsKKwl1bnNpZ25lZCBjaGFyCXByZWZpeF9wYWQxOworCXVuc2lnbmVkIHNob3J0CXByZWZpeF9wYWQyOworCWludAkJcHJlZml4X2lmaW5kZXg7CisJdW5zaWduZWQgY2hhcglwcmVmaXhfdHlwZTsKKwl1bnNpZ25lZCBjaGFyCXByZWZpeF9sZW47CisJdW5zaWduZWQgY2hhcglwcmVmaXhfZmxhZ3M7CisJdW5zaWduZWQgY2hhcglwcmVmaXhfcGFkMzsKK307CisKK2VudW0gCit7CisJUFJFRklYX1VOU1BFQywKKwlQUkVGSVhfQUREUkVTUywKKwlQUkVGSVhfQ0FDSEVJTkZPLAorCV9fUFJFRklYX01BWAorfTsKKworI2RlZmluZSBQUkVGSVhfTUFYCShfX1BSRUZJWF9NQVggLSAxKQorCitzdHJ1Y3QgcHJlZml4X2NhY2hlaW5mbyB7CisJX191MzIJcHJlZmVycmVkX3RpbWU7CisJX191MzIJdmFsaWRfdGltZTsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJVHJhZmZpYyBjb250cm9sIG1lc3NhZ2VzLgorICoqKiovCisKK3N0cnVjdCB0Y21zZyB7CisJdW5zaWduZWQgY2hhcgl0Y21fZmFtaWx5OworCXVuc2lnbmVkIGNoYXIJdGNtX19wYWQxOworCXVuc2lnbmVkIHNob3J0CXRjbV9fcGFkMjsKKwlpbnQJCXRjbV9pZmluZGV4OworCV9fdTMyCQl0Y21faGFuZGxlOworCV9fdTMyCQl0Y21fcGFyZW50OworCV9fdTMyCQl0Y21faW5mbzsKK307CisKK2VudW0geworCVRDQV9VTlNQRUMsCisJVENBX0tJTkQsCisJVENBX09QVElPTlMsCisJVENBX1NUQVRTLAorCVRDQV9YU1RBVFMsCisJVENBX1JBVEUsCisJVENBX0ZDTlQsCisJVENBX1NUQVRTMiwKKwlUQ0FfU1RBQiwKKwlfX1RDQV9NQVgKK307CisKKyNkZWZpbmUgVENBX01BWCAoX19UQ0FfTUFYIC0gMSkKKworI2RlZmluZSBUQ0FfUlRBKHIpICAoKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKShyKSkgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHRjbXNnKSkpKQorI2RlZmluZSBUQ0FfUEFZTE9BRChuKSBOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCB0Y21zZykpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCU5laWdoYm9yIERpc2NvdmVyeSB1c2VybGFuZCBvcHRpb25zCisgKioqKi8KKworc3RydWN0IG5kdXNlcm9wdG1zZyB7CisJdW5zaWduZWQgY2hhcgluZHVzZXJvcHRfZmFtaWx5OworCXVuc2lnbmVkIGNoYXIJbmR1c2Vyb3B0X3BhZDE7CisJdW5zaWduZWQgc2hvcnQJbmR1c2Vyb3B0X29wdHNfbGVuOwkvKiBUb3RhbCBsZW5ndGggb2Ygb3B0aW9ucyAqLworCWludAkJbmR1c2Vyb3B0X2lmaW5kZXg7CisJX191OAkJbmR1c2Vyb3B0X2ljbXBfdHlwZTsKKwlfX3U4CQluZHVzZXJvcHRfaWNtcF9jb2RlOworCXVuc2lnbmVkIHNob3J0CW5kdXNlcm9wdF9wYWQyOworCXVuc2lnbmVkIGludAluZHVzZXJvcHRfcGFkMzsKKwkvKiBGb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBORCBvcHRpb25zICovCit9OworCitlbnVtIHsKKwlORFVTRVJPUFRfVU5TUEVDLAorCU5EVVNFUk9QVF9TUkNBRERSLAorCV9fTkRVU0VST1BUX01BWAorfTsKKworI2RlZmluZSBORFVTRVJPUFRfTUFYCShfX05EVVNFUk9QVF9NQVggLSAxKQorCisvKiBSVG5ldGxpbmsgbXVsdGljYXN0IGdyb3VwcyAtIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1c2Vyc3BhY2UgKi8KKyNkZWZpbmUgUlRNR1JQX0xJTksJCTEKKyNkZWZpbmUgUlRNR1JQX05PVElGWQkJMgorI2RlZmluZSBSVE1HUlBfTkVJR0gJCTQKKyNkZWZpbmUgUlRNR1JQX1RDCQk4CisKKyNkZWZpbmUgUlRNR1JQX0lQVjRfSUZBRERSCTB4MTAKKyNkZWZpbmUgUlRNR1JQX0lQVjRfTVJPVVRFCTB4MjAKKyNkZWZpbmUgUlRNR1JQX0lQVjRfUk9VVEUJMHg0MAorI2RlZmluZSBSVE1HUlBfSVBWNF9SVUxFCTB4ODAKKworI2RlZmluZSBSVE1HUlBfSVBWNl9JRkFERFIJMHgxMDAKKyNkZWZpbmUgUlRNR1JQX0lQVjZfTVJPVVRFCTB4MjAwCisjZGVmaW5lIFJUTUdSUF9JUFY2X1JPVVRFCTB4NDAwCisjZGVmaW5lIFJUTUdSUF9JUFY2X0lGSU5GTwkweDgwMAorCisjZGVmaW5lIFJUTUdSUF9ERUNuZXRfSUZBRERSICAgIDB4MTAwMAorI2RlZmluZSBSVE1HUlBfREVDbmV0X1JPVVRFICAgICAweDQwMDAKKworI2RlZmluZSBSVE1HUlBfSVBWNl9QUkVGSVgJMHgyMDAwMAorCisvKiBSVG5ldGxpbmsgbXVsdGljYXN0IGdyb3VwcyAqLworZW51bSBydG5ldGxpbmtfZ3JvdXBzIHsKKwlSVE5MR1JQX05PTkUsCisjZGVmaW5lIFJUTkxHUlBfTk9ORQkJUlROTEdSUF9OT05FCisJUlROTEdSUF9MSU5LLAorI2RlZmluZSBSVE5MR1JQX0xJTksJCVJUTkxHUlBfTElOSworCVJUTkxHUlBfTk9USUZZLAorI2RlZmluZSBSVE5MR1JQX05PVElGWQkJUlROTEdSUF9OT1RJRlkKKwlSVE5MR1JQX05FSUdILAorI2RlZmluZSBSVE5MR1JQX05FSUdICQlSVE5MR1JQX05FSUdICisJUlROTEdSUF9UQywKKyNkZWZpbmUgUlROTEdSUF9UQwkJUlROTEdSUF9UQworCVJUTkxHUlBfSVBWNF9JRkFERFIsCisjZGVmaW5lIFJUTkxHUlBfSVBWNF9JRkFERFIJUlROTEdSUF9JUFY0X0lGQUREUgorCVJUTkxHUlBfSVBWNF9NUk9VVEUsCisjZGVmaW5lCVJUTkxHUlBfSVBWNF9NUk9VVEUJUlROTEdSUF9JUFY0X01ST1VURQorCVJUTkxHUlBfSVBWNF9ST1VURSwKKyNkZWZpbmUgUlROTEdSUF9JUFY0X1JPVVRFCVJUTkxHUlBfSVBWNF9ST1VURQorCVJUTkxHUlBfSVBWNF9SVUxFLAorI2RlZmluZSBSVE5MR1JQX0lQVjRfUlVMRQlSVE5MR1JQX0lQVjRfUlVMRQorCVJUTkxHUlBfSVBWNl9JRkFERFIsCisjZGVmaW5lIFJUTkxHUlBfSVBWNl9JRkFERFIJUlROTEdSUF9JUFY2X0lGQUREUgorCVJUTkxHUlBfSVBWNl9NUk9VVEUsCisjZGVmaW5lIFJUTkxHUlBfSVBWNl9NUk9VVEUJUlROTEdSUF9JUFY2X01ST1VURQorCVJUTkxHUlBfSVBWNl9ST1VURSwKKyNkZWZpbmUgUlROTEdSUF9JUFY2X1JPVVRFCVJUTkxHUlBfSVBWNl9ST1VURQorCVJUTkxHUlBfSVBWNl9JRklORk8sCisjZGVmaW5lIFJUTkxHUlBfSVBWNl9JRklORk8JUlROTEdSUF9JUFY2X0lGSU5GTworCVJUTkxHUlBfREVDbmV0X0lGQUREUiwKKyNkZWZpbmUgUlROTEdSUF9ERUNuZXRfSUZBRERSCVJUTkxHUlBfREVDbmV0X0lGQUREUgorCVJUTkxHUlBfTk9QMiwKKwlSVE5MR1JQX0RFQ25ldF9ST1VURSwKKyNkZWZpbmUgUlROTEdSUF9ERUNuZXRfUk9VVEUJUlROTEdSUF9ERUNuZXRfUk9VVEUKKwlSVE5MR1JQX0RFQ25ldF9SVUxFLAorI2RlZmluZSBSVE5MR1JQX0RFQ25ldF9SVUxFCVJUTkxHUlBfREVDbmV0X1JVTEUKKwlSVE5MR1JQX05PUDQsCisJUlROTEdSUF9JUFY2X1BSRUZJWCwKKyNkZWZpbmUgUlROTEdSUF9JUFY2X1BSRUZJWAlSVE5MR1JQX0lQVjZfUFJFRklYCisJUlROTEdSUF9JUFY2X1JVTEUsCisjZGVmaW5lIFJUTkxHUlBfSVBWNl9SVUxFCVJUTkxHUlBfSVBWNl9SVUxFCisJUlROTEdSUF9ORF9VU0VST1BULAorI2RlZmluZSBSVE5MR1JQX05EX1VTRVJPUFQJUlROTEdSUF9ORF9VU0VST1BUCisJUlROTEdSUF9QSE9ORVRfSUZBRERSLAorI2RlZmluZSBSVE5MR1JQX1BIT05FVF9JRkFERFIJUlROTEdSUF9QSE9ORVRfSUZBRERSCisJUlROTEdSUF9QSE9ORVRfUk9VVEUsCisjZGVmaW5lIFJUTkxHUlBfUEhPTkVUX1JPVVRFCVJUTkxHUlBfUEhPTkVUX1JPVVRFCisJUlROTEdSUF9EQ0IsCisjZGVmaW5lIFJUTkxHUlBfRENCCQlSVE5MR1JQX0RDQgorCV9fUlROTEdSUF9NQVgKK307CisjZGVmaW5lIFJUTkxHUlBfTUFYCShfX1JUTkxHUlBfTUFYIC0gMSkKKworLyogVEMgYWN0aW9uIHBpZWNlICovCitzdHJ1Y3QgdGNhbXNnIHsKKwl1bnNpZ25lZCBjaGFyCXRjYV9mYW1pbHk7CisJdW5zaWduZWQgY2hhcgl0Y2FfX3BhZDE7CisJdW5zaWduZWQgc2hvcnQJdGNhX19wYWQyOworfTsKKyNkZWZpbmUgVEFfUlRBKHIpICAoKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKShyKSkgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHRjYW1zZykpKSkKKyNkZWZpbmUgVEFfUEFZTE9BRChuKSBOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCB0Y2Ftc2cpKQorI2RlZmluZSBUQ0FfQUNUX1RBQiAxIC8qIGF0dHIgdHlwZSBtdXN0IGJlID49MSAqLwkKKyNkZWZpbmUgVENBQV9NQVggMQorCisvKiBFbmQgb2YgaW5mb3JtYXRpb24gZXhwb3J0ZWQgdG8gdXNlciBsZXZlbCAqLworCisKKworI2VuZGlmCS8qIF9fTElOVVhfUlRORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2NjLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2N2NjMDMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NjYy5oCkBAIC0wLDAgKzEsMTcyIEBACisvKiAkSWQ6IHNjYy5oLHYgMS4yOSAxOTk3LzA0LzAyIDE0OjU2OjQ1IGpyZXV0ZXIgRXhwIGpyZXV0ZXIgJCAqLworCisjaWZuZGVmCV9TQ0NfSAorI2RlZmluZQlfU0NDX0gKKworCisvKiBzZWxlY3Rpb24gb2YgaGFyZHdhcmUgdHlwZXMgKi8KKworI2RlZmluZSBQQTBIWlAJCTB4MDAJLyogaGFyZHdhcmUgdHlwZSBmb3IgUEEwSFpQIFNDQyBjYXJkIGFuZCBjb21wYXRpYmxlICovCisjZGVmaW5lIEVBR0xFCQkweDAxICAgIC8qIGhhcmR3YXJlIHR5cGUgZm9yIEVBR0xFIGNhcmQgKi8KKyNkZWZpbmUgUEMxMDAJCTB4MDIJLyogaGFyZHdhcmUgdHlwZSBmb3IgUEMxMDAgY2FyZCAqLworI2RlZmluZSBQUklNVVMJCTB4MDQJLyogaGFyZHdhcmUgdHlwZSBmb3IgUFJJTVVTLVBDIChERzlCTCkgY2FyZCAqLworI2RlZmluZSBEUlNJCQkweDA4CS8qIGhhcmR3YXJlIHR5cGUgZm9yIERSU0kgUEMqUGFja2V0IGNhcmQgKi8KKyNkZWZpbmUgQkFZQ09NCQkweDEwCS8qIGhhcmR3YXJlIHR5cGUgZm9yIEJheUNvbSAoVSlTQ0MgKi8KKworLyogREVWIGlvY3RsKCkgY29tbWFuZHMgKi8KKworZW51bSBTQ0NfaW9jdGxfY21kcyB7CisJU0lPQ1NDQ1JFU0VSVkVEID0gU0lPQ0RFVlBSSVZBVEUsCisJU0lPQ1NDQ0NGRywKKwlTSU9DU0NDSU5JLAorCVNJT0NTQ0NDSEFOSU5JLAorCVNJT0NTQ0NTTUVNLAorCVNJT0NTQ0NHS0lTUywKKwlTSU9DU0NDU0tJU1MsCisJU0lPQ1NDQ0dTVEFULAorCVNJT0NTQ0NDQUwKK307CisKKy8qIERldmljZSBwYXJhbWV0ZXIgY29udHJvbCAoZnJvbSBXQU1QRVMpICovCisKK2VudW0gTDFfcGFyYW1zIHsKKwlQQVJBTV9EQVRBLAorCVBBUkFNX1RYREVMQVksCisJUEFSQU1fUEVSU0lTVCwKKwlQQVJBTV9TTE9UVElNRSwKKwlQQVJBTV9UWFRBSUwsCisJUEFSQU1fRlVMTERVUCwKKwlQQVJBTV9TT0ZURENELAkJLyogd2FzOiBQQVJBTV9IVyAqLworCVBBUkFNX01VVEUsCQkvKiA/Pz8gKi8KKwlQQVJBTV9EVFIsCisJUEFSQU1fUlRTLAorCVBBUkFNX1NQRUVELAorCVBBUkFNX0VORERFTEFZLAkJLyogPz8/ICovCisJUEFSQU1fR1JPVVAsCisJUEFSQU1fSURMRSwKKwlQQVJBTV9NSU4sCisJUEFSQU1fTUFYS0VZLAorCVBBUkFNX1dBSVQsCisJUEFSQU1fTUFYREVGRVIsCisJUEFSQU1fVFgsCisJUEFSQU1fSFdFVkVOVCA9IDMxLAorCVBBUkFNX1JFVFVSTiA9IDI1NQkvKiByZXNldCBraXNzIG1vZGUgKi8KK307CisKKy8qIGZ1bGxkdXAgcGFyYW1ldGVyICovCisKK2VudW0gRlVMTERVUF9tb2RlcyB7CisJS0lTU19EVVBMRVhfSEFMRiwJLyogbm9ybWFsIENTTUEgb3BlcmF0aW9uICovCisJS0lTU19EVVBMRVhfRlVMTCwJLyogZnVsbGR1cGxleCwga2V5IGRvd24gdHJ4IGFmdGVyIHRyYW5zbWlzc2lvbiAqLworCUtJU1NfRFVQTEVYX0xJTkssCS8qIGZ1bGxkdXBsZXgsIGtleSBkb3duIHRyeCBhZnRlciAnaWRsZXRpbWUnIHNlYyAqLworCUtJU1NfRFVQTEVYX09QVElNQQkvKiBmdWxsZHVwbGV4LCBsZXQgdGhlIHByb3RvY29sIGxheWVyIGNvbnRyb2wgdGhlIGh3ICovCit9OworCisvKiBtaXNjLiBwYXJhbWV0ZXJzICovCisKKyNkZWZpbmUgVElNRVJfT0ZGCTY1NTM1VQkvKiB0byBzd2l0Y2ggb2ZmIHRpbWVycyAqLworI2RlZmluZSBOT19TVUNIX1BBUkFNCTY1NTM0VQkvKiBwYXJhbSBub3QgaW1wbGVtZW50ZWQgKi8KKworLyogSFdFVkVOVCBwYXJhbWV0ZXIgKi8KKworZW51bSBIV0VWRU5UX29wdHMgeworCUhXRVZfRENEX09OLAorCUhXRVZfRENEX09GRiwKKwlIV0VWX0FMTF9TRU5UCit9OworCisvKiBjaGFubmVsIGdyb3VwaW5nICovCisKKyNkZWZpbmUgUlhHUk9VUAkJMDEwMAkvKiBpZiBzZXQsIG9ubHkgdHggd2hlbiBhbGwgY2hhbm5lbHMgY2xlYXIgKi8KKyNkZWZpbmUgVFhHUk9VUAkJMDIwMAkvKiBpZiBzZXQsIGRvbid0IHRyYW5zbWl0IHNpbXVsdGFuZW91c2x5ICovCisKKy8qIFR4L1J4IGNsb2NrIHNvdXJjZXMgKi8KKworZW51bSBDTE9DS19zb3VyY2VzIHsKKwlDTEtfRFBMTCwJLyogbm9ybWFsIGhhbGZkdXBsZXggb3BlcmF0aW9uICovCisJQ0xLX0VYVEVSTkFMLAkvKiBleHRlcm5hbCBjbG9ja2luZyAoRzNSVUgvREY5SUMgbW9kZW1zKSAqLworCUNMS19ESVZJREVSLAkvKiBSeCA9IERQTEwsIFR4ID0gZGl2aWRlciAoZnVsbGR1cGxleCB3aXRoICovCisJCQkvKiBtb2RlbXMgd2l0aG91dCBjbG9jayByZWdlbmVyYXRpb24gKi8KKwlDTEtfQlJHCQkvKiBleHBlcmltZW50YWwgZnVsbGR1cGxleCBtb2RlIHdpdGggRFBMTC9CUkcgZm9yICovCisJCQkvKiBNT0RFTXMgd2l0aG91dCBjbG9jayByZWNvdmVyeSAqLworfTsKKworLyogVHggc3RhdGUgKi8KKworZW51bSBUWF9zdGF0ZSB7CisJVFhTX0lETEUsCS8qIFRyYW5zbWl0dGVyIG9mZiwgbm8gZGF0YSBwZW5kaW5nICovCisJVFhTX0JVU1ksCS8qIHdhaXRpbmcgZm9yIHBlcm1pc3Npb24gdG8gc2VuZCAvIHRhaWx0aW1lICovCisJVFhTX0FDVElWRSwJLyogVHJhbnNtaXR0ZXIgb24sIHNlbmRpbmcgZGF0YSAqLworCVRYU19ORVdGUkFNRSwJLyogcmVzZXQgQ1JDIGFuZCBzZW5kIChuZXh0KSBmcmFtZSAqLworCVRYU19JRExFMiwJLyogVHJhbnNtaXR0ZXIgb24sIG5vIGRhdGEgcGVuZGluZyAqLworCVRYU19XQUlULAkvKiBXYWl0aW5nIGZvciBNaW50aW1lIHRvIGV4cGlyZSAqLworCVRYU19USU1FT1VUCS8qIFdlIGhhZCBhIHRyYW5zbWlzc2lvbiB0aW1lb3V0ICovCit9OworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW9fcG9ydDsJLyogdHlwZSBkZWZpbml0aW9uIGZvciBhbiAnaW8gcG9ydCBhZGRyZXNzJyAqLworCisvKiBTQ0Mgc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gKi8KKworc3RydWN0IHNjY19zdGF0IHsKKyAgICAgICAgbG9uZyByeGludHM7ICAgICAgICAgICAgLyogUmVjZWl2ZXIgaW50ZXJydXB0cyAqLworICAgICAgICBsb25nIHR4aW50czsgICAgICAgICAgICAvKiBUcmFuc21pdHRlciBpbnRlcnJ1cHRzICovCisgICAgICAgIGxvbmcgZXhpbnRzOyAgICAgICAgICAgIC8qIEV4dGVybmFsL3N0YXR1cyBpbnRlcnJ1cHRzICovCisgICAgICAgIGxvbmcgc3BpbnRzOyAgICAgICAgICAgIC8qIFNwZWNpYWwgcmVjZWl2ZXIgaW50ZXJydXB0cyAqLworCisgICAgICAgIGxvbmcgdHhmcmFtZXM7ICAgICAgICAgIC8qIFBhY2tldHMgc2VudCAqLworICAgICAgICBsb25nIHJ4ZnJhbWVzOyAgICAgICAgICAvKiBOdW1iZXIgb2YgRnJhbWVzIEFjdHVhbGx5IFJlY2VpdmVkICovCisgICAgICAgIGxvbmcgcnhlcnJzOyAgICAgICAgICAgIC8qIENSQyBFcnJvcnMgKi8KKyAgICAgICAgbG9uZyB0eGVycnM7CQkvKiBLSVNTIGVycm9ycyAqLworICAgICAgICAKKwl1bnNpZ25lZCBpbnQgbm9zcGFjZTsJLyogIk91dCBvZiBidWZmZXJzIiAqLworCXVuc2lnbmVkIGludCByeF9vdmVyOwkvKiBSZWNlaXZlciBPdmVycnVucyAqLworCXVuc2lnbmVkIGludCB0eF91bmRlcjsJLyogVHJhbnNtaXR0ZXIgVW5kZXJydW5zICovCisKKwl1bnNpZ25lZCBpbnQgdHhfc3RhdGU7CS8qIFRyYW5zbWl0dGVyIHN0YXRlICovCisJaW50IHR4X3F1ZXVlZDsJCS8qIHR4IGZyYW1lcyBlbnF1ZXVlZCAqLworCisJdW5zaWduZWQgaW50IG1heHF1ZXVlOwkvKiBhbGxvY2F0ZWQgdHhfYnVmZmVycyAqLworCXVuc2lnbmVkIGludCBidWZzaXplOwkvKiB1c2VkIGJ1ZmZlcnNpemUgKi8KK307CisKK3N0cnVjdCBzY2NfbW9kZW0geworCWxvbmcgc3BlZWQ7CQkvKiBMaW5lIHNwZWVkLCBicHMgKi8KKwljaGFyIGNsb2Nrc3JjOwkJLyogMCA9IERQTEwsIDEgPSBleHRlcm5hbCwgMiA9IGRpdmlkZXIgKi8KKwljaGFyIG5yejsJCS8qIE5SWiBpbnN0ZWFkIG9mIE5SWkkgKi8JCit9OworCitzdHJ1Y3Qgc2NjX2tpc3NfY21kIHsKKwlpbnQgIAkgY29tbWFuZDsJLyogb25lIG9mIHRoZSBLSVNTLUNvbW1hbmRzIGRlZmluZWQgYWJvdmUgKi8KKwl1bnNpZ25lZCBwYXJhbTsJCS8qIEtJU1MtUGFyYW0gKi8KK307CisKK3N0cnVjdCBzY2NfaHdfY29uZmlnIHsKKwlpb19wb3J0IGRhdGFfYTsJCS8qIGRhdGEgcG9ydCBjaGFubmVsIEEgKi8KKwlpb19wb3J0IGN0cmxfYTsJCS8qIGNvbnRyb2wgcG9ydCBjaGFubmVsIEEgKi8KKwlpb19wb3J0IGRhdGFfYjsJCS8qIGRhdGEgcG9ydCBjaGFubmVsIEIgKi8KKwlpb19wb3J0IGN0cmxfYjsJCS8qIGNvbnRyb2wgcG9ydCBjaGFubmVsIEIgKi8KKwlpb19wb3J0IHZlY3Rvcl9sYXRjaDsJLyogSU5UQUNLLUxhdGNoICgjKSAqLworCWlvX3BvcnQJc3BlY2lhbDsJLyogc3BlY2lhbCBmdW5jdGlvbiBwb3J0ICovCisKKwlpbnQJaXJxOwkJLyogaXJxICovCisJbG9uZwljbG9jazsJCS8qIGNsb2NrICovCisJY2hhcglvcHRpb247CQkvKiBjb21tYW5kIGZvciBmdW5jdGlvbiBwb3J0ICovCisKKwljaGFyIGJyYW5kOwkJLyogaGFyZHdhcmUgdHlwZSAqLworCWNoYXIgZXNjYzsJCS8qIHVzZSBleHQuIGZlYXR1cmVzIG9mIGEgODU4MC84NTE4MC84NTI4MCAqLworfTsKKworLyogKCMpIG9ubHkgb25lIElOVEFDSyBsYXRjaCBhbGxvd2VkLiAqLworCisKK3N0cnVjdCBzY2NfbWVtX2NvbmZpZyB7CisJdW5zaWduZWQgaW50IGR1bW15OworCXVuc2lnbmVkIGludCBidWZzaXplOworfTsKKworc3RydWN0IHNjY19jYWxpYnJhdGUgeworCXVuc2lnbmVkIGludCB0aW1lOworCXVuc2lnbmVkIGNoYXIgcGF0dGVybjsKK307CisKKyNlbmRpZiAvKiBkZWZpbmVkKF9TQ0NfSCkgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2NoZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDk2OGNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgX0xJTlVYX1NDSEVEX0gKKyNkZWZpbmUgX0xJTlVYX1NDSEVEX0gKKworLyoKKyAqIGNsb25pbmcgZmxhZ3M6CisgKi8KKyNkZWZpbmUgQ1NJR05BTAkJMHgwMDAwMDBmZgkvKiBzaWduYWwgbWFzayB0byBiZSBzZW50IGF0IGV4aXQgKi8KKyNkZWZpbmUgQ0xPTkVfVk0JMHgwMDAwMDEwMAkvKiBzZXQgaWYgVk0gc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzICovCisjZGVmaW5lIENMT05FX0ZTCTB4MDAwMDAyMDAJLyogc2V0IGlmIGZzIGluZm8gc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzICovCisjZGVmaW5lIENMT05FX0ZJTEVTCTB4MDAwMDA0MDAJLyogc2V0IGlmIG9wZW4gZmlsZXMgc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzICovCisjZGVmaW5lIENMT05FX1NJR0hBTkQJMHgwMDAwMDgwMAkvKiBzZXQgaWYgc2lnbmFsIGhhbmRsZXJzIGFuZCBibG9ja2VkIHNpZ25hbHMgc2hhcmVkICovCisjZGVmaW5lIENMT05FX1BUUkFDRQkweDAwMDAyMDAwCS8qIHNldCBpZiB3ZSB3YW50IHRvIGxldCB0cmFjaW5nIGNvbnRpbnVlIG9uIHRoZSBjaGlsZCB0b28gKi8KKyNkZWZpbmUgQ0xPTkVfVkZPUksJMHgwMDAwNDAwMAkvKiBzZXQgaWYgdGhlIHBhcmVudCB3YW50cyB0aGUgY2hpbGQgdG8gd2FrZSBpdCB1cCBvbiBtbV9yZWxlYXNlICovCisjZGVmaW5lIENMT05FX1BBUkVOVAkweDAwMDA4MDAwCS8qIHNldCBpZiB3ZSB3YW50IHRvIGhhdmUgdGhlIHNhbWUgcGFyZW50IGFzIHRoZSBjbG9uZXIgKi8KKyNkZWZpbmUgQ0xPTkVfVEhSRUFECTB4MDAwMTAwMDAJLyogU2FtZSB0aHJlYWQgZ3JvdXA/ICovCisjZGVmaW5lIENMT05FX05FV05TCTB4MDAwMjAwMDAJLyogTmV3IG5hbWVzcGFjZSBncm91cD8gKi8KKyNkZWZpbmUgQ0xPTkVfU1lTVlNFTQkweDAwMDQwMDAwCS8qIHNoYXJlIHN5c3RlbSBWIFNFTV9VTkRPIHNlbWFudGljcyAqLworI2RlZmluZSBDTE9ORV9TRVRUTFMJMHgwMDA4MDAwMAkvKiBjcmVhdGUgYSBuZXcgVExTIGZvciB0aGUgY2hpbGQgKi8KKyNkZWZpbmUgQ0xPTkVfUEFSRU5UX1NFVFRJRAkweDAwMTAwMDAwCS8qIHNldCB0aGUgVElEIGluIHRoZSBwYXJlbnQgKi8KKyNkZWZpbmUgQ0xPTkVfQ0hJTERfQ0xFQVJUSUQJMHgwMDIwMDAwMAkvKiBjbGVhciB0aGUgVElEIGluIHRoZSBjaGlsZCAqLworI2RlZmluZSBDTE9ORV9ERVRBQ0hFRAkJMHgwMDQwMDAwMAkvKiBVbnVzZWQsIGlnbm9yZWQgKi8KKyNkZWZpbmUgQ0xPTkVfVU5UUkFDRUQJCTB4MDA4MDAwMDAJLyogc2V0IGlmIHRoZSB0cmFjaW5nIHByb2Nlc3MgY2FuJ3QgZm9yY2UgQ0xPTkVfUFRSQUNFIG9uIHRoaXMgY2xvbmUgKi8KKyNkZWZpbmUgQ0xPTkVfQ0hJTERfU0VUVElECTB4MDEwMDAwMDAJLyogc2V0IHRoZSBUSUQgaW4gdGhlIGNoaWxkICovCisvKiAweDAyMDAwMDAwIHdhcyBwcmV2aW91c2x5IHRoZSB1bnVzZWQgQ0xPTkVfU1RPUFBFRCAoU3RhcnQgaW4gc3RvcHBlZCBzdGF0ZSkKKyAgIGFuZCBpcyBub3cgYXZhaWxhYmxlIGZvciByZS11c2UuICovCisjZGVmaW5lIENMT05FX05FV1VUUwkJMHgwNDAwMDAwMAkvKiBOZXcgdXRzbmFtZSBncm91cD8gKi8KKyNkZWZpbmUgQ0xPTkVfTkVXSVBDCQkweDA4MDAwMDAwCS8qIE5ldyBpcGNzICovCisjZGVmaW5lIENMT05FX05FV1VTRVIJCTB4MTAwMDAwMDAJLyogTmV3IHVzZXIgbmFtZXNwYWNlICovCisjZGVmaW5lIENMT05FX05FV1BJRAkJMHgyMDAwMDAwMAkvKiBOZXcgcGlkIG5hbWVzcGFjZSAqLworI2RlZmluZSBDTE9ORV9ORVdORVQJCTB4NDAwMDAwMDAJLyogTmV3IG5ldHdvcmsgbmFtZXNwYWNlICovCisjZGVmaW5lIENMT05FX0lPCQkweDgwMDAwMDAwCS8qIENsb25lIGlvIGNvbnRleHQgKi8KKworLyoKKyAqIFNjaGVkdWxpbmcgcG9saWNpZXMKKyAqLworI2RlZmluZSBTQ0hFRF9OT1JNQUwJCTAKKyNkZWZpbmUgU0NIRURfRklGTwkJMQorI2RlZmluZSBTQ0hFRF9SUgkJMgorI2RlZmluZSBTQ0hFRF9CQVRDSAkJMworLyogU0NIRURfSVNPOiByZXNlcnZlZCBidXQgbm90IGltcGxlbWVudGVkIHlldCAqLworI2RlZmluZSBTQ0hFRF9JRExFCQk1CisvKiBDYW4gYmUgT1JlZCBpbiB0byBtYWtlIHN1cmUgdGhlIHByb2Nlc3MgaXMgcmV2ZXJ0ZWQgYmFjayB0byBTQ0hFRF9OT1JNQUwgb24gZm9yayAqLworI2RlZmluZSBTQ0hFRF9SRVNFVF9PTl9GT1JLICAgICAweDQwMDAwMDAwCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NjcmVlbl9pbmZvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NjcmVlbl9pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwMGI5NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2NyZWVuX2luZm8uaApAQCAtMCwwICsxLDczIEBACisjaWZuZGVmIF9TQ1JFRU5fSU5GT19ICisjZGVmaW5lIF9TQ1JFRU5fSU5GT19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogVGhlc2UgYXJlIHNldCB1cCBieSB0aGUgc2V0dXAtcm91dGluZSBhdCBib290LXRpbWU6CisgKi8KKworc3RydWN0IHNjcmVlbl9pbmZvIHsKKwlfX3U4ICBvcmlnX3g7CQkvKiAweDAwICovCisJX191OCAgb3JpZ195OwkJLyogMHgwMSAqLworCV9fdTE2IGV4dF9tZW1fazsJLyogMHgwMiAqLworCV9fdTE2IG9yaWdfdmlkZW9fcGFnZTsJLyogMHgwNCAqLworCV9fdTggIG9yaWdfdmlkZW9fbW9kZTsJLyogMHgwNiAqLworCV9fdTggIG9yaWdfdmlkZW9fY29sczsJLyogMHgwNyAqLworCV9fdTggIGZsYWdzOwkJLyogMHgwOCAqLworCV9fdTggIHVudXNlZDI7CQkvKiAweDA5ICovCisJX191MTYgb3JpZ192aWRlb19lZ2FfYng7LyogMHgwYSAqLworCV9fdTE2IHVudXNlZDM7CQkvKiAweDBjICovCisJX191OCAgb3JpZ192aWRlb19saW5lczsJLyogMHgwZSAqLworCV9fdTggIG9yaWdfdmlkZW9faXNWR0E7CS8qIDB4MGYgKi8KKwlfX3UxNiBvcmlnX3ZpZGVvX3BvaW50czsvKiAweDEwICovCisKKwkvKiBWRVNBIGdyYXBoaWMgbW9kZSAtLSBsaW5lYXIgZnJhbWUgYnVmZmVyICovCisJX191MTYgbGZiX3dpZHRoOwkvKiAweDEyICovCisJX191MTYgbGZiX2hlaWdodDsJLyogMHgxNCAqLworCV9fdTE2IGxmYl9kZXB0aDsJLyogMHgxNiAqLworCV9fdTMyIGxmYl9iYXNlOwkJLyogMHgxOCAqLworCV9fdTMyIGxmYl9zaXplOwkJLyogMHgxYyAqLworCV9fdTE2IGNsX21hZ2ljLCBjbF9vZmZzZXQ7IC8qIDB4MjAgKi8KKwlfX3UxNiBsZmJfbGluZWxlbmd0aDsJLyogMHgyNCAqLworCV9fdTggIHJlZF9zaXplOwkJLyogMHgyNiAqLworCV9fdTggIHJlZF9wb3M7CQkvKiAweDI3ICovCisJX191OCAgZ3JlZW5fc2l6ZTsJLyogMHgyOCAqLworCV9fdTggIGdyZWVuX3BvczsJLyogMHgyOSAqLworCV9fdTggIGJsdWVfc2l6ZTsJLyogMHgyYSAqLworCV9fdTggIGJsdWVfcG9zOwkJLyogMHgyYiAqLworCV9fdTggIHJzdmRfc2l6ZTsJLyogMHgyYyAqLworCV9fdTggIHJzdmRfcG9zOwkJLyogMHgyZCAqLworCV9fdTE2IHZlc2FwbV9zZWc7CS8qIDB4MmUgKi8KKwlfX3UxNiB2ZXNhcG1fb2ZmOwkvKiAweDMwICovCisJX191MTYgcGFnZXM7CQkvKiAweDMyICovCisJX191MTYgdmVzYV9hdHRyaWJ1dGVzOwkvKiAweDM0ICovCisJX191MzIgY2FwYWJpbGl0aWVzOyAgICAgLyogMHgzNiAqLworCV9fdTggIF9yZXNlcnZlZFs2XTsJLyogMHgzYSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBWSURFT19UWVBFX01EQQkJMHgxMAkvKiBNb25vY2hyb21lIFRleHQgRGlzcGxheQkqLworI2RlZmluZSBWSURFT19UWVBFX0NHQQkJMHgxMQkvKiBDR0EgRGlzcGxheSAJCQkqLworI2RlZmluZSBWSURFT19UWVBFX0VHQU0JCTB4MjAJLyogRUdBL1ZHQSBpbiBNb25vY2hyb21lIE1vZGUJKi8KKyNkZWZpbmUgVklERU9fVFlQRV9FR0FDCQkweDIxCS8qIEVHQSBpbiBDb2xvciBNb2RlCQkqLworI2RlZmluZSBWSURFT19UWVBFX1ZHQUMJCTB4MjIJLyogVkdBKyBpbiBDb2xvciBNb2RlCQkqLworI2RlZmluZSBWSURFT19UWVBFX1ZMRkIJCTB4MjMJLyogVkVTQSBWR0EgaW4gZ3JhcGhpYyBtb2RlCSovCisKKyNkZWZpbmUgVklERU9fVFlQRV9QSUNBX1MzCTB4MzAJLyogQUNFUiBQSUNBLTYxIGxvY2FsIFMzIHZpZGVvCSovCisjZGVmaW5lIFZJREVPX1RZUEVfTUlQU19HMzY0CTB4MzEgICAgLyogTUlQUyBNYWdudW0gNDAwMCBHMzY0IHZpZGVvICAqLworI2RlZmluZSBWSURFT19UWVBFX1NHSSAgICAgICAgICAweDMzICAgIC8qIFZhcmlvdXMgU0dJIGdyYXBoaWNzIGhhcmR3YXJlICovCisKKyNkZWZpbmUgVklERU9fVFlQRV9UR0FDCQkweDQwCS8qIERFQyBUR0EgKi8KKworI2RlZmluZSBWSURFT19UWVBFX1NVTiAgICAgICAgICAweDUwICAgIC8qIFN1biBmcmFtZSBidWZmZXIuICovCisjZGVmaW5lIFZJREVPX1RZUEVfU1VOUENJICAgICAgIDB4NTEgICAgLyogU3VuIFBDSSBiYXNlZCBmcmFtZSBidWZmZXIuICovCisKKyNkZWZpbmUgVklERU9fVFlQRV9QTUFDCQkweDYwCS8qIFBvd2VyTWFjaW50b3NoIGZyYW1lIGJ1ZmZlci4gKi8KKworI2RlZmluZSBWSURFT19UWVBFX0VGSQkJMHg3MAkvKiBFRkkgZ3JhcGhpYyBtb2RlCQkqLworCisjZGVmaW5lIFZJREVPX0ZMQUdTX05PQ1VSU09SCSgxIDw8IDApIC8qIFRoZSB2aWRlbyBtb2RlIGhhcyBubyBjdXJzb3Igc2V0ICovCisjZGVmaW5lIFZJREVPX0ZMQUdTX0hBTkRPRkYJKDEgPDwgMSkgLyogVmlkZW8gYnVmZmVyIGlzIGFscmVkeSBwYWludGVkICovCisKKworI2VuZGlmIC8qIF9TQ1JFRU5fSU5GT19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NkbGEuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2RsYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNGY3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NkbGEuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBGcmFtZSByZWxheSBpbnRlcmZhY2UuCisgKgorICogVmVyc2lvbjoJQCgjKWlmX2lmcmFkLmgJMC4yMAkxMyBBcHIgOTYKKyAqCisgKiBBdXRob3I6CU1pa2UgTWNMYWdhbiA8bWlrZS5tY2xhZ2FuQGxpbnV4Lm9yZz4KKyAqCisgKiBDaGFuZ2VzOgorICoJCTAuMTUJTWlrZSBNY0xhZ2FuCVN0cnVjdHVyZSBwYWNraW5nCisgKgorICoJCTAuMjAJTWlrZSBNY0xhZ2FuCU5ldyBmbGFncyBmb3IgUzUwOCBidWZmZXIgaGFuZGxpbmcKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIFNETEFfSAorI2RlZmluZSBTRExBX0gKKworLyogYWRhcHRlciB0eXBlICovCisjZGVmaW5lIFNETEFfVFlQRVMKKyNkZWZpbmUgU0RMQV9TNTAyQQkJCTUwMjAKKyNkZWZpbmUgU0RMQV9TNTAyRQkJCTUwMjEKKyNkZWZpbmUgU0RMQV9TNTAzCQkJNTAzMAorI2RlZmluZSBTRExBX1M1MDcJCQk1MDcwCisjZGVmaW5lIFNETEFfUzUwOAkJCTUwODAKKyNkZWZpbmUgU0RMQV9TNTA5CQkJNTA5MAorI2RlZmluZSBTRExBX1VOS05PV04JCQktMQorCisvKiBwb3J0IHNlbGVjdGlvbiBmbGFncyBmb3IgdGhlIFM1MDggKi8KKyNkZWZpbmUgU0RMQV9TNTA4X1BPUlRfVjM1CQkweDAwCisjZGVmaW5lIFNETEFfUzUwOF9QT1JUX1JTMjMyCQkweDAyCisKKy8qIFo4MCBDUFUgc3BlZWRzICovCisjZGVmaW5lIFNETEFfQ1BVXzNNCQkJMHgwMAorI2RlZmluZSBTRExBX0NQVV81TQkJCTB4MDEKKyNkZWZpbmUgU0RMQV9DUFVfN00JCQkweDAyCisjZGVmaW5lIFNETEFfQ1BVXzhNCQkJMHgwMworI2RlZmluZSBTRExBX0NQVV8xME0JCQkweDA0CisjZGVmaW5lIFNETEFfQ1BVXzE2TQkJCTB4MDUKKyNkZWZpbmUgU0RMQV9DUFVfMTJNCQkJMHgwNgorCisvKiBzb21lIHByaXZhdGUgSU9DVExzICovCisjZGVmaW5lIFNETEFfSURFTlRJRlkJCQkoRlJBRF9MQVNUX0lPQ1RMICsgMSkKKyNkZWZpbmUgU0RMQV9DUFVTUEVFRAkJCShGUkFEX0xBU1RfSU9DVEwgKyAyKQorI2RlZmluZSBTRExBX1BST1RPQ09MCQkJKEZSQURfTEFTVF9JT0NUTCArIDMpCisKKyNkZWZpbmUgU0RMQV9DTEVBUk1FTQkJCShGUkFEX0xBU1RfSU9DVEwgKyA0KQorI2RlZmluZSBTRExBX1dSSVRFTUVNCQkJKEZSQURfTEFTVF9JT0NUTCArIDUpCisjZGVmaW5lIFNETEFfUkVBRE1FTQkJCShGUkFEX0xBU1RfSU9DVEwgKyA2KQorCitzdHJ1Y3Qgc2RsYV9tZW0geworICAgaW50ICBhZGRyOworICAgaW50ICBsZW47CisgICB2b2lkICpkYXRhOworfTsKKworI2RlZmluZSBTRExBX1NUQVJUCQkJKEZSQURfTEFTVF9JT0NUTCArIDcpCisjZGVmaW5lIFNETEFfU1RPUAkJCShGUkFEX0xBU1RfSU9DVEwgKyA4KQorCisvKiBzb21lIG9mZnNldHMgaW4gdGhlIFo4MCdzIG1lbW9yeSBzcGFjZSAqLworI2RlZmluZSBTRExBX05NSUFERFIJCQkweDAwMDAKKyNkZWZpbmUgU0RMQV9DT05GX0FERFIJCQkweDAwMTAKKyNkZWZpbmUgU0RMQV9TNTAyQV9OTUlBRERSCQkweDAwNjYKKyNkZWZpbmUgU0RMQV9DT0RFX0JBU0VBRERSCQkweDAxMDAKKyNkZWZpbmUgU0RMQV9XSU5ET1dfU0laRQkJMHgyMDAwCisjZGVmaW5lIFNETEFfQUREUl9NQVNLCQkJMHgxRkZGCisKKy8qIGxhcmdlc3QgaGFuZGxlYWJsZSBibG9jayBvZiBkYXRhICovCisjZGVmaW5lIFNETEFfTUFYX0RBVEEJCQk0MDgwCisjZGVmaW5lIFNETEFfTUFYX01UVQkJCTQwNzIJLyogTUFYX0RBVEEgLSBzaXplb2YoZnJhZGhkcikgKi8KKyNkZWZpbmUgU0RMQV9NQVhfRExDSQkJCTI0CisKKy8qIHRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGZyYWRfY29uZiAqLworc3RydWN0IHNkbGFfY29uZiB7CisgICBzaG9ydCBzdGF0aW9uOworICAgc2hvcnQgY29uZmlnOworICAgc2hvcnQga2JhdWQ7CisgICBzaG9ydCBjbG9ja2luZzsKKyAgIHNob3J0IG1heF9mcm07CisgICBzaG9ydCBUMzkxOworICAgc2hvcnQgVDM5MjsKKyAgIHNob3J0IE4zOTE7CisgICBzaG9ydCBOMzkyOworICAgc2hvcnQgTjM5MzsKKyAgIHNob3J0IENJUl9md2Q7CisgICBzaG9ydCBCY19md2Q7CisgICBzaG9ydCBCZV9md2Q7CisgICBzaG9ydCBDSVJfYndkOworICAgc2hvcnQgQmNfYndkOworICAgc2hvcnQgQmVfYndkOworfTsKKworLyogdGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgZGxjaV9jb25mICovCitzdHJ1Y3Qgc2RsYV9kbGNpX2NvbmYgeworICAgc2hvcnQgY29uZmlnOworICAgc2hvcnQgQ0lSX2Z3ZDsKKyAgIHNob3J0IEJjX2Z3ZDsKKyAgIHNob3J0IEJlX2Z3ZDsKKyAgIHNob3J0IENJUl9id2Q7CisgICBzaG9ydCBCY19id2Q7CisgICBzaG9ydCBCZV9id2Q7IAorICAgc2hvcnQgVGNfZndkOworICAgc2hvcnQgVGNfYndkOworICAgc2hvcnQgVGZfbWF4OworICAgc2hvcnQgVGJfbWF4OworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VjY29tcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZWNjb21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3ODg1ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VjY29tcC5oCkBAIC0wLDAgKzEsNDcgQEAKKyNpZm5kZWYgX0xJTlVYX1NFQ0NPTVBfSAorI2RlZmluZSBfTElOVVhfU0VDQ09NUF9ICisKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKworLyogVmFsaWQgdmFsdWVzIGZvciBzZWNjb21wLm1vZGUgYW5kIHByY3RsKFBSX1NFVF9TRUNDT01QLCA8bW9kZT4pICovCisjZGVmaW5lIFNFQ0NPTVBfTU9ERV9ESVNBQkxFRAkwIC8qIHNlY2NvbXAgaXMgbm90IGluIHVzZS4gKi8KKyNkZWZpbmUgU0VDQ09NUF9NT0RFX1NUUklDVAkxIC8qIHVzZXMgaGFyZC1jb2RlZCBmaWx0ZXIuICovCisjZGVmaW5lIFNFQ0NPTVBfTU9ERV9GSUxURVIJMiAvKiB1c2VzIHVzZXItc3VwcGxpZWQgZmlsdGVyLiAqLworCisvKgorICogQWxsIEJQRiBwcm9ncmFtcyBtdXN0IHJldHVybiBhIDMyLWJpdCB2YWx1ZS4KKyAqIFRoZSBib3R0b20gMTYtYml0cyBhcmUgZm9yIG9wdGlvbmFsIHJldHVybiBkYXRhLgorICogVGhlIHVwcGVyIDE2LWJpdHMgYXJlIG9yZGVyZWQgZnJvbSBsZWFzdCBwZXJtaXNzaXZlIHZhbHVlcyB0byBtb3N0LgorICoKKyAqIFRoZSBvcmRlcmluZyBlbnN1cmVzIHRoYXQgYSBtaW5fdCgpIG92ZXIgY29tcG9zZWQgcmV0dXJuIHZhbHVlcyBhbHdheXMKKyAqIHNlbGVjdHMgdGhlIGxlYXN0IHBlcm1pc3NpdmUgY2hvaWNlLgorICovCisjZGVmaW5lIFNFQ0NPTVBfUkVUX0tJTEwJMHgwMDAwMDAwMFUgLyoga2lsbCB0aGUgdGFzayBpbW1lZGlhdGVseSAqLworI2RlZmluZSBTRUNDT01QX1JFVF9UUkFQCTB4MDAwMzAwMDBVIC8qIGRpc2FsbG93IGFuZCBmb3JjZSBhIFNJR1NZUyAqLworI2RlZmluZSBTRUNDT01QX1JFVF9FUlJOTwkweDAwMDUwMDAwVSAvKiByZXR1cm5zIGFuIGVycm5vICovCisjZGVmaW5lIFNFQ0NPTVBfUkVUX1RSQUNFCTB4N2ZmMDAwMDBVIC8qIHBhc3MgdG8gYSB0cmFjZXIgb3IgZGlzYWxsb3cgKi8KKyNkZWZpbmUgU0VDQ09NUF9SRVRfQUxMT1cJMHg3ZmZmMDAwMFUgLyogYWxsb3cgKi8KKworLyogTWFza3MgZm9yIHRoZSByZXR1cm4gdmFsdWUgc2VjdGlvbnMuICovCisjZGVmaW5lIFNFQ0NPTVBfUkVUX0FDVElPTgkweGZmZmYwMDAwVQorI2RlZmluZSBTRUNDT01QX1JFVF9EQVRBCTB4MDAwMGZmZmZVCisKKy8qKgorICogc3RydWN0IHNlY2NvbXBfZGF0YSAtIHRoZSBmb3JtYXQgdGhlIEJQRiBwcm9ncmFtIGV4ZWN1dGVzIG92ZXIuCisgKiBAbnI6IHRoZSBzeXN0ZW0gY2FsbCBudW1iZXIKKyAqIEBhcmNoOiBpbmRpY2F0ZXMgc3lzdGVtIGNhbGwgY29udmVudGlvbiBhcyBhbiBBVURJVF9BUkNIXyogdmFsdWUKKyAqICAgICAgICBhcyBkZWZpbmVkIGluIDxsaW51eC9hdWRpdC5oPi4KKyAqIEBpbnN0cnVjdGlvbl9wb2ludGVyOiBhdCB0aGUgdGltZSBvZiB0aGUgc3lzdGVtIGNhbGwuCisgKiBAYXJnczogdXAgdG8gNiBzeXN0ZW0gY2FsbCBhcmd1bWVudHMgYWx3YXlzIHN0b3JlZCBhcyA2NC1iaXQgdmFsdWVzCisgKiAgICAgICAgcmVnYXJkbGVzcyBvZiB0aGUgYXJjaGl0ZWN0dXJlLgorICovCitzdHJ1Y3Qgc2VjY29tcF9kYXRhIHsKKwlpbnQgbnI7CisJX191MzIgYXJjaDsKKwlfX3U2NCBpbnN0cnVjdGlvbl9wb2ludGVyOworCV9fdTY0IGFyZ3NbNl07Cit9OworCisjZW5kaWYgLyogX0xJTlVYX1NFQ0NPTVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZWN1cmViaXRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlY3VyZWJpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDM1YzYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZWN1cmViaXRzLmgKQEAgLTAsMCArMSw1MSBAQAorI2lmbmRlZiBfTElOVVhfU0VDVVJFQklUU19ICisjZGVmaW5lIF9MSU5VWF9TRUNVUkVCSVRTX0ggMQorCisvKiBFYWNoIHNlY3VyZXNldHRpbmcgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdHdvIGJpdHMuIE9uZSBiaXQgc3BlY2lmaWVzCisgICB3aGV0aGVyIHRoZSBzZXR0aW5nIGlzIG9uIG9yIG9mZi4gVGhlIG90aGVyIGJpdCBzcGVjaWZ5IHdoZXRoZXIgdGhlCisgICBzZXR0aW5nIGlzIGxvY2tlZCBvciBub3QuIEEgc2V0dGluZyB3aGljaCBpcyBsb2NrZWQgY2Fubm90IGJlCisgICBjaGFuZ2VkIGZyb20gdXNlci1sZXZlbC4gKi8KKyNkZWZpbmUgaXNzZWN1cmVfbWFzayhYKQkoMSA8PCAoWCkpCisKKyNkZWZpbmUgU0VDVVJFQklUU19ERUZBVUxUIDB4MDAwMDAwMDAKKworLyogV2hlbiBzZXQgVUlEIDAgaGFzIG5vIHNwZWNpYWwgcHJpdmlsZWdlcy4gV2hlbiB1bnNldCwgd2Ugc3VwcG9ydAorICAgaW5oZXJpdGFuY2Ugb2Ygcm9vdC1wZXJtaXNzaW9ucyBhbmQgc3VpZC1yb290IGV4ZWN1dGFibGUgdW5kZXIKKyAgIGNvbXBhdGliaWxpdHkgbW9kZS4gV2UgcmFpc2UgdGhlIGVmZmVjdGl2ZSBhbmQgaW5oZXJpdGFibGUgYml0bWFza3MKKyAgICpvZiB0aGUgZXhlY3V0YWJsZSBmaWxlKiBpZiB0aGUgZWZmZWN0aXZlIHVpZCBvZiB0aGUgbmV3IHByb2Nlc3MgaXMKKyAgIDAuIElmIHRoZSByZWFsIHVpZCBpcyAwLCB3ZSByYWlzZSB0aGUgZWZmZWN0aXZlIChsZWdhY3kpIGJpdCBvZiB0aGUKKyAgIGV4ZWN1dGFibGUgZmlsZS4gKi8KKyNkZWZpbmUgU0VDVVJFX05PUk9PVAkJCTAKKyNkZWZpbmUgU0VDVVJFX05PUk9PVF9MT0NLRUQJCTEgIC8qIG1ha2UgYml0LTAgaW1tdXRhYmxlICovCisKKyNkZWZpbmUgU0VDQklUX05PUk9PVAkJKGlzc2VjdXJlX21hc2soU0VDVVJFX05PUk9PVCkpCisjZGVmaW5lIFNFQ0JJVF9OT1JPT1RfTE9DS0VECShpc3NlY3VyZV9tYXNrKFNFQ1VSRV9OT1JPT1RfTE9DS0VEKSkKKworLyogV2hlbiBzZXQsIHNldHVpZCB0by9mcm9tIHVpZCAwIGRvZXMgbm90IHRyaWdnZXIgY2FwYWJpbGl0eS0iZml4dXAiLgorICAgV2hlbiB1bnNldCwgdG8gcHJvdmlkZSBjb21wYXRpYmxpbGl0eSB3aXRoIG9sZCBwcm9ncmFtcyByZWx5aW5nIG9uCisgICBzZXQqdWlkIHRvIGdhaW4vbG9zZSBwcml2aWxlZ2UsIHRyYW5zaXRpb25zIHRvL2Zyb20gdWlkIDAgY2F1c2UKKyAgIGNhcGFiaWxpdGllcyB0byBiZSBnYWluZWQvbG9zdC4gKi8KKyNkZWZpbmUgU0VDVVJFX05PX1NFVFVJRF9GSVhVUAkJMgorI2RlZmluZSBTRUNVUkVfTk9fU0VUVUlEX0ZJWFVQX0xPQ0tFRAkzICAvKiBtYWtlIGJpdC0yIGltbXV0YWJsZSAqLworCisjZGVmaW5lIFNFQ0JJVF9OT19TRVRVSURfRklYVVAJKGlzc2VjdXJlX21hc2soU0VDVVJFX05PX1NFVFVJRF9GSVhVUCkpCisjZGVmaW5lIFNFQ0JJVF9OT19TRVRVSURfRklYVVBfTE9DS0VEIFwKKwkJCShpc3NlY3VyZV9tYXNrKFNFQ1VSRV9OT19TRVRVSURfRklYVVBfTE9DS0VEKSkKKworLyogV2hlbiBzZXQsIGEgcHJvY2VzcyBjYW4gcmV0YWluIGl0cyBjYXBhYmlsaXRpZXMgZXZlbiBhZnRlcgorICAgdHJhbnNpdGlvbmluZyB0byBhIG5vbi1yb290IHVzZXIgKHRoZSBzZXQtdWlkIGZpeHVwIHN1cHByZXNzZWQgYnkKKyAgIGJpdCAyKS4gQml0LTQgaXMgY2xlYXJlZCB3aGVuIGEgcHJvY2VzcyBjYWxscyBleGVjKCk7IHNldHRpbmcgYm90aAorICAgYml0IDQgYW5kIDUgd2lsbCBjcmVhdGUgYSBiYXJyaWVyIHRocm91Z2ggZXhlYyB0aGF0IG5vIGV4ZWMoKSdkCisgICBjaGlsZCBjYW4gdXNlIHRoaXMgZmVhdHVyZSBhZ2Fpbi4gKi8KKyNkZWZpbmUgU0VDVVJFX0tFRVBfQ0FQUwkJNAorI2RlZmluZSBTRUNVUkVfS0VFUF9DQVBTX0xPQ0tFRAkJNSAgLyogbWFrZSBiaXQtNCBpbW11dGFibGUgKi8KKworI2RlZmluZSBTRUNCSVRfS0VFUF9DQVBTCShpc3NlY3VyZV9tYXNrKFNFQ1VSRV9LRUVQX0NBUFMpKQorI2RlZmluZSBTRUNCSVRfS0VFUF9DQVBTX0xPQ0tFRCAoaXNzZWN1cmVfbWFzayhTRUNVUkVfS0VFUF9DQVBTX0xPQ0tFRCkpCisKKyNkZWZpbmUgU0VDVVJFX0FMTF9CSVRTCQkoaXNzZWN1cmVfbWFzayhTRUNVUkVfTk9ST09UKSB8IFwKKwkJCQkgaXNzZWN1cmVfbWFzayhTRUNVUkVfTk9fU0VUVUlEX0ZJWFVQKSB8IFwKKwkJCQkgaXNzZWN1cmVfbWFzayhTRUNVUkVfS0VFUF9DQVBTKSkKKyNkZWZpbmUgU0VDVVJFX0FMTF9MT0NLUwkoU0VDVVJFX0FMTF9CSVRTIDw8IDEpCisKKyNlbmRpZiAvKiAhX0xJTlVYX1NFQ1VSRUJJVFNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZWxpbnV4X25ldGxpbmsuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VsaW51eF9uZXRsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5YmY2YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VsaW51eF9uZXRsaW5rLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIE5ldGxpbmsgZXZlbnQgbm90aWZpY2F0aW9ucyBmb3IgU0VMaW51eC4KKyAqCisgKiBBdXRob3I6IEphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuLCBKYW1lcyBNb3JyaXMgPGptb3JyaXNAcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfU0VMSU5VWF9ORVRMSU5LX0gKKyNkZWZpbmUgX0xJTlVYX1NFTElOVVhfTkVUTElOS19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBNZXNzYWdlIHR5cGVzLiAqLworI2RlZmluZSBTRUxOTF9NU0dfQkFTRSAweDEwCitlbnVtIHsKKwlTRUxOTF9NU0dfU0VURU5GT1JDRSA9IFNFTE5MX01TR19CQVNFLAorCVNFTE5MX01TR19QT0xJQ1lMT0FELAorCVNFTE5MX01TR19NQVgKK307CisKKy8qIE11bHRpY2FzdCBncm91cHMgLSBiYWNrd2FyZHMgY29tcGF0aWJsaWxpdHkgZm9yIHVzZXJzcGFjZSAqLworI2RlZmluZSBTRUxOTF9HUlBfTk9ORQkJMHgwMDAwMDAwMAorI2RlZmluZSBTRUxOTF9HUlBfQVZDCQkweDAwMDAwMDAxCS8qIEFWQyBub3RpZmljYXRpb25zICovCisjZGVmaW5lIFNFTE5MX0dSUF9BTEwJCTB4ZmZmZmZmZmYKKworZW51bSBzZWxpbnV4X25sZ3JvdXBzIHsKKwlTRUxOTEdSUF9OT05FLAorI2RlZmluZSBTRUxOTEdSUF9OT05FCVNFTE5MR1JQX05PTkUKKwlTRUxOTEdSUF9BVkMsCisjZGVmaW5lIFNFTE5MR1JQX0FWQwlTRUxOTEdSUF9BVkMKKwlfX1NFTE5MR1JQX01BWAorfTsKKyNkZWZpbmUgU0VMTkxHUlBfTUFYCShfX1NFTE5MR1JQX01BWCAtIDEpCisKKy8qIE1lc3NhZ2Ugc3RydWN0dXJlcyAqLworc3RydWN0IHNlbG5sX21zZ19zZXRlbmZvcmNlIHsKKwlfX3MzMgkJdmFsOworfTsKKworc3RydWN0IHNlbG5sX21zZ19wb2xpY3lsb2FkIHsKKwlfX3UzMglzZXFubzsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfU0VMSU5VWF9ORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMTk3NGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlbS5oCkBAIC0wLDAgKzEsODAgQEAKKyNpZm5kZWYgX0xJTlVYX1NFTV9ICisjZGVmaW5lIF9MSU5VWF9TRU1fSAorCisjaW5jbHVkZSA8bGludXgvaXBjLmg+CisKKy8qIHNlbW9wIGZsYWdzICovCisjZGVmaW5lIFNFTV9VTkRPICAgICAgICAweDEwMDAgIC8qIHVuZG8gdGhlIG9wZXJhdGlvbiBvbiBleGl0ICovCisKKy8qIHNlbWN0bCBDb21tYW5kIERlZmluaXRpb25zLiAqLworI2RlZmluZSBHRVRQSUQgIDExICAgICAgIC8qIGdldCBzZW1waWQgKi8KKyNkZWZpbmUgR0VUVkFMICAxMiAgICAgICAvKiBnZXQgc2VtdmFsICovCisjZGVmaW5lIEdFVEFMTCAgMTMgICAgICAgLyogZ2V0IGFsbCBzZW12YWwncyAqLworI2RlZmluZSBHRVROQ05UIDE0ICAgICAgIC8qIGdldCBzZW1uY250ICovCisjZGVmaW5lIEdFVFpDTlQgMTUgICAgICAgLyogZ2V0IHNlbXpjbnQgKi8KKyNkZWZpbmUgU0VUVkFMICAxNiAgICAgICAvKiBzZXQgc2VtdmFsICovCisjZGVmaW5lIFNFVEFMTCAgMTcgICAgICAgLyogc2V0IGFsbCBzZW12YWwncyAqLworCisvKiBpcGNzIGN0bCBjbWRzICovCisjZGVmaW5lIFNFTV9TVEFUIDE4CisjZGVmaW5lIFNFTV9JTkZPIDE5CisKKy8qIE9ic29sZXRlLCB1c2VkIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBsaWJjNSBjb21waWxlcyAqLworc3RydWN0IHNlbWlkX2RzIHsKKwlzdHJ1Y3QgaXBjX3Blcm0Jc2VtX3Blcm07CQkvKiBwZXJtaXNzaW9ucyAuLiBzZWUgaXBjLmggKi8KKwlfX2tlcm5lbF90aW1lX3QJc2VtX290aW1lOwkJLyogbGFzdCBzZW1vcCB0aW1lICovCisJX19rZXJuZWxfdGltZV90CXNlbV9jdGltZTsJCS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKwlzdHJ1Y3Qgc2VtCSpzZW1fYmFzZTsJCS8qIHB0ciB0byBmaXJzdCBzZW1hcGhvcmUgaW4gYXJyYXkgKi8KKwlzdHJ1Y3Qgc2VtX3F1ZXVlICpzZW1fcGVuZGluZzsJCS8qIHBlbmRpbmcgb3BlcmF0aW9ucyB0byBiZSBwcm9jZXNzZWQgKi8KKwlzdHJ1Y3Qgc2VtX3F1ZXVlICoqc2VtX3BlbmRpbmdfbGFzdDsJLyogbGFzdCBwZW5kaW5nIG9wZXJhdGlvbiAqLworCXN0cnVjdCBzZW1fdW5kbwkqdW5kbzsJCQkvKiB1bmRvIHJlcXVlc3RzIG9uIHRoaXMgYXJyYXkgKi8KKwl1bnNpZ25lZCBzaG9ydAlzZW1fbnNlbXM7CQkvKiBuby4gb2Ygc2VtYXBob3JlcyBpbiBhcnJheSAqLworfTsKKworLyogSW5jbHVkZSB0aGUgZGVmaW5pdGlvbiBvZiBzZW1pZDY0X2RzICovCisjaW5jbHVkZSA8YXNtL3NlbWJ1Zi5oPgorCisvKiBzZW1vcCBzeXN0ZW0gY2FsbHMgdGFrZXMgYW4gYXJyYXkgb2YgdGhlc2UuICovCitzdHJ1Y3Qgc2VtYnVmIHsKKwl1bnNpZ25lZCBzaG9ydCAgc2VtX251bTsJLyogc2VtYXBob3JlIGluZGV4IGluIGFycmF5ICovCisJc2hvcnQJCXNlbV9vcDsJCS8qIHNlbWFwaG9yZSBvcGVyYXRpb24gKi8KKwlzaG9ydAkJc2VtX2ZsZzsJLyogb3BlcmF0aW9uIGZsYWdzICovCit9OworCisvKiBhcmcgZm9yIHNlbWN0bCBzeXN0ZW0gY2FsbHMuICovCit1bmlvbiBzZW11biB7CisJaW50IHZhbDsJCQkvKiB2YWx1ZSBmb3IgU0VUVkFMICovCisJc3RydWN0IHNlbWlkX2RzICpidWY7CS8qIGJ1ZmZlciBmb3IgSVBDX1NUQVQgJiBJUENfU0VUICovCisJdW5zaWduZWQgc2hvcnQgKmFycmF5OwkvKiBhcnJheSBmb3IgR0VUQUxMICYgU0VUQUxMICovCisJc3RydWN0IHNlbWluZm8gKl9fYnVmOwkvKiBidWZmZXIgZm9yIElQQ19JTkZPICovCisJdm9pZCAqX19wYWQ7Cit9OworCitzdHJ1Y3QgIHNlbWluZm8geworCWludCBzZW1tYXA7CisJaW50IHNlbW1uaTsKKwlpbnQgc2VtbW5zOworCWludCBzZW1tbnU7CisJaW50IHNlbW1zbDsKKwlpbnQgc2Vtb3BtOworCWludCBzZW11bWU7CisJaW50IHNlbXVzejsKKwlpbnQgc2Vtdm14OworCWludCBzZW1hZW07Cit9OworCisjZGVmaW5lIFNFTU1OSSAgMTI4ICAgICAgICAgICAgIC8qIDw9IElQQ01OSSAgbWF4ICMgb2Ygc2VtYXBob3JlIGlkZW50aWZpZXJzICovCisjZGVmaW5lIFNFTU1TTCAgMjUwICAgICAgICAgICAgIC8qIDw9IDggMDAwIG1heCBudW0gb2Ygc2VtYXBob3JlcyBwZXIgaWQgKi8KKyNkZWZpbmUgU0VNTU5TICAoU0VNTU5JKlNFTU1TTCkgLyogPD0gSU5UX01BWCBtYXggIyBvZiBzZW1hcGhvcmVzIGluIHN5c3RlbSAqLworI2RlZmluZSBTRU1PUE0gIDMyCSAgICAgICAgLyogPD0gMSAwMDAgbWF4IG51bSBvZiBvcHMgcGVyIHNlbW9wIGNhbGwgKi8KKyNkZWZpbmUgU0VNVk1YICAzMjc2NyAgICAgICAgICAgLyogPD0gMzI3Njcgc2VtYXBob3JlIG1heGltdW0gdmFsdWUgKi8KKyNkZWZpbmUgU0VNQUVNICBTRU1WTVggICAgICAgICAgLyogYWRqdXN0IG9uIGV4aXQgbWF4IHZhbHVlICovCisKKy8qIHVudXNlZCAqLworI2RlZmluZSBTRU1VTUUgIFNFTU9QTSAgICAgICAgICAvKiBtYXggbnVtIG9mIHVuZG8gZW50cmllcyBwZXIgcHJvY2VzcyAqLworI2RlZmluZSBTRU1NTlUgIFNFTU1OUyAgICAgICAgICAvKiBudW0gb2YgdW5kbyBzdHJ1Y3R1cmVzIHN5c3RlbSB3aWRlICovCisjZGVmaW5lIFNFTU1BUCAgU0VNTU5TICAgICAgICAgIC8qICMgb2YgZW50cmllcyBpbiBzZW1hcGhvcmUgbWFwICovCisjZGVmaW5lIFNFTVVTWiAgMjAJCS8qIHNpemVvZiBzdHJ1Y3Qgc2VtX3VuZG8gKi8KKworCisjZW5kaWYgLyogX0xJTlVYX1NFTV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDk3MjMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZXJpYWwuaApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvc2VyaWFsLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIgYnkgVGhlb2RvcmUgVHMnby4KKyAqIAorICogUmVkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSAKKyAqIFB1YmxpYyBMaWNlbnNlIChHUEwpCisgKi8KKworI2lmbmRlZiBfTElOVVhfU0VSSUFMX0gKKyNkZWZpbmUgX0xJTlVYX1NFUklBTF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKK3N0cnVjdCBzZXJpYWxfc3RydWN0IHsKKwlpbnQJdHlwZTsKKwlpbnQJbGluZTsKKwl1bnNpZ25lZCBpbnQJcG9ydDsKKwlpbnQJaXJxOworCWludAlmbGFnczsKKwlpbnQJeG1pdF9maWZvX3NpemU7CisJaW50CWN1c3RvbV9kaXZpc29yOworCWludAliYXVkX2Jhc2U7CisJdW5zaWduZWQgc2hvcnQJY2xvc2VfZGVsYXk7CisJY2hhcglpb190eXBlOworCWNoYXIJcmVzZXJ2ZWRfY2hhclsxXTsKKwlpbnQJaHViNjsKKwl1bnNpZ25lZCBzaG9ydAljbG9zaW5nX3dhaXQ7IC8qIHRpbWUgdG8gd2FpdCBiZWZvcmUgY2xvc2luZyAqLworCXVuc2lnbmVkIHNob3J0CWNsb3Npbmdfd2FpdDI7IC8qIG5vIGxvbmdlciB1c2VkLi4uICovCisJdW5zaWduZWQgY2hhcgkqaW9tZW1fYmFzZTsKKwl1bnNpZ25lZCBzaG9ydAlpb21lbV9yZWdfc2hpZnQ7CisJdW5zaWduZWQgaW50CXBvcnRfaGlnaDsKKwl1bnNpZ25lZCBsb25nCWlvbWFwX2Jhc2U7CS8qIGNvb2tpZSBwYXNzZWQgaW50byBpb3JlbWFwICovCit9OworCisvKgorICogRm9yIHRoZSBjbG9zZSB3YWl0IHRpbWVzLCAwIG1lYW5zIHdhaXQgZm9yZXZlciBmb3Igc2VyaWFsIHBvcnQgdG8KKyAqIGZsdXNoIGl0cyBvdXRwdXQuICA2NTUzNSBtZWFucyBkb24ndCB3YWl0IGF0IGFsbC4KKyAqLworI2RlZmluZSBBU1lOQ19DTE9TSU5HX1dBSVRfSU5GCTAKKyNkZWZpbmUgQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUJNjU1MzUKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgc3VwcG9ydGVkIHNlcmlhbCB0eXBlcy4KKyAqLworI2RlZmluZSBQT1JUX1VOS05PV04JMAorI2RlZmluZSBQT1JUXzgyNTAJMQorI2RlZmluZSBQT1JUXzE2NDUwCTIKKyNkZWZpbmUgUE9SVF8xNjU1MAkzCisjZGVmaW5lIFBPUlRfMTY1NTBBCTQKKyNkZWZpbmUgUE9SVF9DSVJSVVMgICAgIDUJLyogdXN1cnBlZCBieSBjeWNsYWRlcy5jICovCisjZGVmaW5lIFBPUlRfMTY2NTAJNgorI2RlZmluZSBQT1JUXzE2NjUwVjIJNworI2RlZmluZSBQT1JUXzE2NzUwCTgKKyNkZWZpbmUgUE9SVF9TVEFSVEVDSAk5CS8qIHVzdXJwZWQgYnkgY3ljbGFkZXMuYyAqLworI2RlZmluZSBQT1JUXzE2Qzk1MAkxMAkvKiBPeGZvcmQgU2VtaWNvbmR1Y3RvciAqLworI2RlZmluZSBQT1JUXzE2NjU0CTExCisjZGVmaW5lIFBPUlRfMTY4NTAJMTIKKyNkZWZpbmUgUE9SVF9SU0EJMTMJLyogUlNBLURWIElJL1MgY2FyZCAqLworI2RlZmluZSBQT1JUX01BWAkxMworCisjZGVmaW5lIFNFUklBTF9JT19QT1JUCTAKKyNkZWZpbmUgU0VSSUFMX0lPX0hVQjYJMQorI2RlZmluZSBTRVJJQUxfSU9fTUVNCTIKKworc3RydWN0IHNlcmlhbF91YXJ0X2NvbmZpZyB7CisJY2hhcgkqbmFtZTsKKwlpbnQJZGZsX3htaXRfZmlmb19zaXplOworCWludAlmbGFnczsKK307CisKKyNkZWZpbmUgVUFSVF9DTEVBUl9GSUZPCQkweDAxCisjZGVmaW5lIFVBUlRfVVNFX0ZJRk8JCTB4MDIKKyNkZWZpbmUgVUFSVF9TVEFSVEVDSAkJMHgwNAorI2RlZmluZSBVQVJUX05BVFNFTUkJCTB4MDgKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBhc3luY19zdHJ1Y3QgKGFuZCBzZXJpYWxfc3RydWN0KSBmbGFncyBmaWVsZAorICoKKyAqIERlZmluZSBBU1lOQ0JfKiBmb3IgY29udmVuaWVudCB1c2Ugd2l0aCB7dGVzdCxzZXQsY2xlYXJ9X2JpdC4KKyAqLworI2RlZmluZSBBU1lOQ0JfSFVQX05PVElGWQkgMCAvKiBOb3RpZnkgZ2V0dHkgb24gaGFuZ3VwcyBhbmQgY2xvc2VzCisJCQkJICAgICogb24gdGhlIGNhbGxvdXQgcG9ydCAqLworI2RlZmluZSBBU1lOQ0JfRk9VUlBPUlQJCSAxIC8qIFNldCBPVTEsIE9VVDIgcGVyIEFTVCBGb3VycG9ydCBzZXR0aW5ncyAqLworI2RlZmluZSBBU1lOQ0JfU0FLCQkgMiAvKiBTZWN1cmUgQXR0ZW50aW9uIEtleSAoT3JhbmdlIGJvb2spICovCisjZGVmaW5lIEFTWU5DQl9TUExJVF9URVJNSU9TCSAzIC8qIFNlcGFyYXRlIHRlcm1pb3MgZm9yIGRpYWxpbi9jYWxsb3V0ICovCisjZGVmaW5lIEFTWU5DQl9TUERfSEkJCSA0IC8qIFVzZSA1NjAwMCBpbnN0ZWFkIG9mIDM4NDAwIGJwcyAqLworI2RlZmluZSBBU1lOQ0JfU1BEX1ZISQkJIDUgLyogVXNlIDExNTIwMCBpbnN0ZWFkIG9mIDM4NDAwIGJwcyAqLworI2RlZmluZSBBU1lOQ0JfU0tJUF9URVNUCSA2IC8qIFNraXAgVUFSVCB0ZXN0IGR1cmluZyBhdXRvY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBU1lOQ0JfQVVUT19JUlEJCSA3IC8qIERvIGF1dG9tYXRpYyBJUlEgZHVyaW5nCisJCQkJICAgICogYXV0b2NvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQVNZTkNCX1NFU1NJT05fTE9DS09VVAkgOCAvKiBMb2NrIG91dCBjdWEgb3BlbnMgYmFzZWQgb24gc2Vzc2lvbiAqLworI2RlZmluZSBBU1lOQ0JfUEdSUF9MT0NLT1VUCSA5IC8qIExvY2sgb3V0IGN1YSBvcGVucyBiYXNlZCBvbiBwZ3JwICovCisjZGVmaW5lIEFTWU5DQl9DQUxMT1VUX05PSFVQCTEwIC8qIERvbid0IGRvIGhhbmd1cHMgZm9yIGN1YSBkZXZpY2UgKi8KKyNkZWZpbmUgQVNZTkNCX0hBUkRQUFNfQ0QJMTEgLyogQ2FsbCBoYXJkcHBzIHdoZW4gQ0QgZ29lcyBoaWdoICAqLworI2RlZmluZSBBU1lOQ0JfU1BEX1NISQkJMTIgLyogVXNlIDIzMDQwMCBpbnN0ZWFkIG9mIDM4NDAwIGJwcyAqLworI2RlZmluZSBBU1lOQ0JfTE9XX0xBVEVOQ1kJMTMgLyogUmVxdWVzdCBsb3cgbGF0ZW5jeSBiZWhhdmlvdXIgKi8KKyNkZWZpbmUgQVNZTkNCX0JVR0dZX1VBUlQJMTQgLyogVGhpcyBpcyBhIGJ1Z2d5IFVBUlQsIHNraXAgc29tZSBzYWZldHkKKwkJCQkgICAgKiBjaGVja3MuICBOb3RlOiBjYW4gYmUgZGFuZ2Vyb3VzISAqLworI2RlZmluZSBBU1lOQ0JfQVVUT1BST0JFCTE1IC8qIFBvcnQgd2FzIGF1dG9wcm9iZWQgYnkgUENJIG9yIFBOUCBjb2RlICovCisjZGVmaW5lIEFTWU5DQl9MQVNUX1VTRVIJMTUKKworLyogSW50ZXJuYWwgZmxhZ3MgdXNlZCBvbmx5IGJ5IGtlcm5lbCAqLworI2RlZmluZSBBU1lOQ0JfSU5JVElBTElaRUQJMzEgLyogU2VyaWFsIHBvcnQgd2FzIGluaXRpYWxpemVkICovCisjZGVmaW5lIEFTWU5DQl9TVVNQRU5ERUQJMzAgLyogU2VyaWFsIHBvcnQgaXMgc3VzcGVuZGVkICovCisjZGVmaW5lIEFTWU5DQl9OT1JNQUxfQUNUSVZFCTI5IC8qIE5vcm1hbCBkZXZpY2UgaXMgYWN0aXZlICovCisjZGVmaW5lIEFTWU5DQl9CT09UX0FVVE9DT05GCTI4IC8qIEF1dG9jb25maWd1cmUgcG9ydCBvbiBib290dXAgKi8KKyNkZWZpbmUgQVNZTkNCX0NMT1NJTkcJCTI3IC8qIFNlcmlhbCBwb3J0IGlzIGNsb3NpbmcgKi8KKyNkZWZpbmUgQVNZTkNCX0NUU19GTE9XCQkyNiAvKiBEbyBDVFMgZmxvdyBjb250cm9sICovCisjZGVmaW5lIEFTWU5DQl9DSEVDS19DRAkJMjUgLyogaS5lLiwgQ0xPQ0FMICovCisjZGVmaW5lIEFTWU5DQl9TSEFSRV9JUlEJMjQgLyogZm9yIG11bHRpZnVuY3Rpb24gY2FyZHMsIG5vIGxvbmdlciB1c2VkICovCisjZGVmaW5lIEFTWU5DQl9DT05TX0ZMT1cJMjMgLyogZmxvdyBjb250cm9sIGZvciBjb25zb2xlICAqLworI2RlZmluZSBBU1lOQ0JfQk9PVF9PTkxZTUNBCTIyIC8qIFByb2JlIG9ubHkgaWYgTUNBIGJ1cyAqLworI2RlZmluZSBBU1lOQ0JfRklSU1RfS0VSTkVMCTIyCisKKyNkZWZpbmUgQVNZTkNfSFVQX05PVElGWQkoMVUgPDwgQVNZTkNCX0hVUF9OT1RJRlkpCisjZGVmaW5lIEFTWU5DX1NVU1BFTkRFRAkJKDFVIDw8IEFTWU5DQl9TVVNQRU5ERUQpCisjZGVmaW5lIEFTWU5DX0ZPVVJQT1JUCQkoMVUgPDwgQVNZTkNCX0ZPVVJQT1JUKQorI2RlZmluZSBBU1lOQ19TQUsJCSgxVSA8PCBBU1lOQ0JfU0FLKQorI2RlZmluZSBBU1lOQ19TUExJVF9URVJNSU9TCSgxVSA8PCBBU1lOQ0JfU1BMSVRfVEVSTUlPUykKKyNkZWZpbmUgQVNZTkNfU1BEX0hJCQkoMVUgPDwgQVNZTkNCX1NQRF9ISSkKKyNkZWZpbmUgQVNZTkNfU1BEX1ZISQkJKDFVIDw8IEFTWU5DQl9TUERfVkhJKQorI2RlZmluZSBBU1lOQ19TS0lQX1RFU1QJCSgxVSA8PCBBU1lOQ0JfU0tJUF9URVNUKQorI2RlZmluZSBBU1lOQ19BVVRPX0lSUQkJKDFVIDw8IEFTWU5DQl9BVVRPX0lSUSkKKyNkZWZpbmUgQVNZTkNfU0VTU0lPTl9MT0NLT1VUCSgxVSA8PCBBU1lOQ0JfU0VTU0lPTl9MT0NLT1VUKQorI2RlZmluZSBBU1lOQ19QR1JQX0xPQ0tPVVQJKDFVIDw8IEFTWU5DQl9QR1JQX0xPQ0tPVVQpCisjZGVmaW5lIEFTWU5DX0NBTExPVVRfTk9IVVAJKDFVIDw8IEFTWU5DQl9DQUxMT1VUX05PSFVQKQorI2RlZmluZSBBU1lOQ19IQVJEUFBTX0NECSgxVSA8PCBBU1lOQ0JfSEFSRFBQU19DRCkKKyNkZWZpbmUgQVNZTkNfU1BEX1NISQkJKDFVIDw8IEFTWU5DQl9TUERfU0hJKQorI2RlZmluZSBBU1lOQ19MT1dfTEFURU5DWQkoMVUgPDwgQVNZTkNCX0xPV19MQVRFTkNZKQorI2RlZmluZSBBU1lOQ19CVUdHWV9VQVJUCSgxVSA8PCBBU1lOQ0JfQlVHR1lfVUFSVCkKKyNkZWZpbmUgQVNZTkNfQVVUT1BST0JFCQkoMVUgPDwgQVNZTkNCX0FVVE9QUk9CRSkKKworI2RlZmluZSBBU1lOQ19GTEFHUwkJKCgxVSA8PCAoQVNZTkNCX0xBU1RfVVNFUiArIDEpKSAtIDEpCisjZGVmaW5lIEFTWU5DX1VTUl9NQVNLCQkoQVNZTkNfU1BEX0hJfEFTWU5DX1NQRF9WSEl8IFwKKwkJQVNZTkNfQ0FMTE9VVF9OT0hVUHxBU1lOQ19TUERfU0hJfEFTWU5DX0xPV19MQVRFTkNZKQorI2RlZmluZSBBU1lOQ19TUERfQ1VTVAkJKEFTWU5DX1NQRF9ISXxBU1lOQ19TUERfVkhJKQorI2RlZmluZSBBU1lOQ19TUERfV0FSUAkJKEFTWU5DX1NQRF9ISXxBU1lOQ19TUERfU0hJKQorI2RlZmluZSBBU1lOQ19TUERfTUFTSwkJKEFTWU5DX1NQRF9ISXxBU1lOQ19TUERfVkhJfEFTWU5DX1NQRF9TSEkpCisKKyNkZWZpbmUgQVNZTkNfSU5JVElBTElaRUQJKDFVIDw8IEFTWU5DQl9JTklUSUFMSVpFRCkKKyNkZWZpbmUgQVNZTkNfTk9STUFMX0FDVElWRQkoMVUgPDwgQVNZTkNCX05PUk1BTF9BQ1RJVkUpCisjZGVmaW5lIEFTWU5DX0JPT1RfQVVUT0NPTkYJKDFVIDw8IEFTWU5DQl9CT09UX0FVVE9DT05GKQorI2RlZmluZSBBU1lOQ19DTE9TSU5HCQkoMVUgPDwgQVNZTkNCX0NMT1NJTkcpCisjZGVmaW5lIEFTWU5DX0NUU19GTE9XCQkoMVUgPDwgQVNZTkNCX0NUU19GTE9XKQorI2RlZmluZSBBU1lOQ19DSEVDS19DRAkJKDFVIDw8IEFTWU5DQl9DSEVDS19DRCkKKyNkZWZpbmUgQVNZTkNfU0hBUkVfSVJRCQkoMVUgPDwgQVNZTkNCX1NIQVJFX0lSUSkKKyNkZWZpbmUgQVNZTkNfQ09OU19GTE9XCQkoMVUgPDwgQVNZTkNCX0NPTlNfRkxPVykKKyNkZWZpbmUgQVNZTkNfQk9PVF9PTkxZTUNBCSgxVSA8PCBBU1lOQ0JfQk9PVF9PTkxZTUNBKQorI2RlZmluZSBBU1lOQ19JTlRFUk5BTF9GTEFHUwkofigoMVUgPDwgQVNZTkNCX0ZJUlNUX0tFUk5FTCkgLSAxKSkKKworLyoKKyAqIE11bHRpcG9ydCBzZXJpYWwgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgLS0tIGV4dGVybmFsIHN0cnVjdHVyZQorICovCitzdHJ1Y3Qgc2VyaWFsX211bHRpcG9ydF9zdHJ1Y3QgeworCWludAkJaXJxOworCWludAkJcG9ydDE7CisJdW5zaWduZWQgY2hhcgltYXNrMSwgbWF0Y2gxOworCWludAkJcG9ydDI7CisJdW5zaWduZWQgY2hhcgltYXNrMiwgbWF0Y2gyOworCWludAkJcG9ydDM7CisJdW5zaWduZWQgY2hhcgltYXNrMywgbWF0Y2gzOworCWludAkJcG9ydDQ7CisJdW5zaWduZWQgY2hhcgltYXNrNCwgbWF0Y2g0OworCWludAkJcG9ydF9tb25pdG9yOworCWludAlyZXNlcnZlZFszMl07Cit9OworCisvKgorICogU2VyaWFsIGlucHV0IGludGVycnVwdCBsaW5lIGNvdW50ZXJzIC0tIGV4dGVybmFsIHN0cnVjdHVyZQorICogRm91ciBsaW5lcyBjYW4gaW50ZXJydXB0OiBDVFMsIERTUiwgUkksIERDRAorICovCitzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCB7CisJaW50IGN0cywgZHNyLCBybmcsIGRjZDsKKwlpbnQgcngsIHR4OworCWludCBmcmFtZSwgb3ZlcnJ1biwgcGFyaXR5LCBicms7CisJaW50IGJ1Zl9vdmVycnVuOworCWludCByZXNlcnZlZFs5XTsKK307CisKKy8qCisgKiBTZXJpYWwgaW50ZXJmYWNlIGZvciBjb250cm9sbGluZyBSUzQ4NSBzZXR0aW5ncyBvbiBjaGlwcyB3aXRoIHN1aXRhYmxlCisgKiBzdXBwb3J0LiBTZXQgd2l0aCBUSU9DU1JTNDg1IGFuZCBnZXQgd2l0aCBUSU9DR1JTNDg1IGlmIHN1cHBvcnRlZCBieSB5b3VyCisgKiBwbGF0Zm9ybS4gVGhlIHNldCBmdW5jdGlvbiByZXR1cm5zIHRoZSBuZXcgc3RhdGUsIHdpdGggYW55IHVuc3VwcG9ydGVkIGJpdHMKKyAqIHJldmVydGVkIGFwcHJvcHJpYXRlbHkuCisgKi8KKworc3RydWN0IHNlcmlhbF9yczQ4NSB7CisJX191MzIJZmxhZ3M7CQkJLyogUlM0ODUgZmVhdHVyZSBmbGFncyAqLworI2RlZmluZSBTRVJfUlM0ODVfRU5BQkxFRAkJKDEgPDwgMCkJLyogSWYgZW5hYmxlZCAqLworI2RlZmluZSBTRVJfUlM0ODVfUlRTX09OX1NFTkQJCSgxIDw8IDEpCS8qIExvZ2ljYWwgbGV2ZWwgZm9yCisJCQkJCQkJICAgUlRTIHBpbiB3aGVuCisJCQkJCQkJICAgc2VuZGluZyAqLworI2RlZmluZSBTRVJfUlM0ODVfUlRTX0FGVEVSX1NFTkQJKDEgPDwgMikJLyogTG9naWNhbCBsZXZlbCBmb3IKKwkJCQkJCQkgICBSVFMgcGluIGFmdGVyIHNlbnQqLworI2RlZmluZSBTRVJfUlM0ODVfUlhfRFVSSU5HX1RYCQkoMSA8PCA0KQorCV9fdTMyCWRlbGF5X3J0c19iZWZvcmVfc2VuZDsJLyogRGVsYXkgYmVmb3JlIHNlbmQgKG1pbGxpc2Vjb25kcykgKi8KKwlfX3UzMglkZWxheV9ydHNfYWZ0ZXJfc2VuZDsJLyogRGVsYXkgYWZ0ZXIgc2VuZCAobWlsbGlzZWNvbmRzKSAqLworCV9fdTMyCXBhZGRpbmdbNV07CQkvKiBNZW1vcnkgaXMgY2hlYXAsIG5ldyBzdHJ1Y3RzCisJCQkJCSAgIGFyZSBhIHJveWFsIFBJVEEgLi4gKi8KK307CisKKyNlbmRpZiAvKiBfTElOVVhfU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDE3M2ViCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvY2hhci9zZXJpYWxfY29yZS5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgTElOVVhfU0VSSUFMX0NPUkVfSAorI2RlZmluZSBMSU5VWF9TRVJJQUxfQ09SRV9ICisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworLyoKKyAqIFRoZSB0eXBlIGRlZmluaXRpb25zLiAgVGhlc2UgYXJlIGZyb20gVGVkIFRzJ28ncyBzZXJpYWwuaAorICovCisjZGVmaW5lIFBPUlRfVU5LTk9XTgkwCisjZGVmaW5lIFBPUlRfODI1MAkxCisjZGVmaW5lIFBPUlRfMTY0NTAJMgorI2RlZmluZSBQT1JUXzE2NTUwCTMKKyNkZWZpbmUgUE9SVF8xNjU1MEEJNAorI2RlZmluZSBQT1JUX0NJUlJVUwk1CisjZGVmaW5lIFBPUlRfMTY2NTAJNgorI2RlZmluZSBQT1JUXzE2NjUwVjIJNworI2RlZmluZSBQT1JUXzE2NzUwCTgKKyNkZWZpbmUgUE9SVF9TVEFSVEVDSAk5CisjZGVmaW5lIFBPUlRfMTZDOTUwCTEwCisjZGVmaW5lIFBPUlRfMTY2NTQJMTEKKyNkZWZpbmUgUE9SVF8xNjg1MAkxMgorI2RlZmluZSBQT1JUX1JTQQkxMworI2RlZmluZSBQT1JUX05TMTY1NTBBCTE0CisjZGVmaW5lIFBPUlRfWFNDQUxFCTE1CisjZGVmaW5lIFBPUlRfUk05MDAwCTE2CS8qIFBNQy1TaWVycmEgUk05eHh4IGludGVybmFsIFVBUlQgKi8KKyNkZWZpbmUgUE9SVF9PQ1RFT04JMTcJLyogQ2F2aXVtIE9DVEVPTiBpbnRlcm5hbCBVQVJUICovCisjZGVmaW5lIFBPUlRfQVI3CTE4CS8qIFRleGFzIEluc3RydW1lbnRzIEFSNyBpbnRlcm5hbCBVQVJUICovCisjZGVmaW5lIFBPUlRfVTZfMTY1NTBBCTE5CS8qIFNULUVyaWNzc29uIFU2eHh4IGludGVybmFsIFVBUlQgKi8KKyNkZWZpbmUgUE9SVF9URUdSQQkyMAkvKiBOVklESUEgVGVncmEgaW50ZXJuYWwgVUFSVCAqLworI2RlZmluZSBQT1JUX1hSMTdEMTVYCTIxCS8qIEV4YXIgWFIxN0QxNXggVUFSVCAqLworI2RlZmluZSBQT1JUX01BWF84MjUwCTIxCS8qIG1heCBwb3J0IElEICovCisKKy8qCisgKiBBUk0gc3BlY2lmaWMgdHlwZSBudW1iZXJzLiAgVGhlc2UgYXJlIG5vdCBjdXJyZW50bHkgZ3VhcmFudGVlZAorICogdG8gYmUgaW1wbGVtZW50ZWQsIGFuZCB3aWxsIGNoYW5nZSBpbiB0aGUgZnV0dXJlLiAgVGhlc2UgYXJlCisgKiBzZXBhcmF0ZSBzbyBhbnkgYWRkaXRpb25zIHRvIHRoZSBvbGQgc2VyaWFsLmMgdGhhdCBvY2N1ciBiZWZvcmUKKyAqIHdlIGFyZSBtZXJnZWQgY2FuIGJlIGVhc2lseSBtZXJnZWQgaGVyZS4KKyAqLworI2RlZmluZSBQT1JUX1BYQQkzMQorI2RlZmluZSBQT1JUX0FNQkEJMzIKKyNkZWZpbmUgUE9SVF9DTFBTNzExWAkzMworI2RlZmluZSBQT1JUX1NBMTEwMAkzNAorI2RlZmluZSBQT1JUX1VBUlQwMAkzNQorI2RlZmluZSBQT1JUXzIxMjg1CTM3CisKKy8qIFNwYXJjIHR5cGUgbnVtYmVycy4gICovCisjZGVmaW5lIFBPUlRfU1VOWklMT0cJMzgKKyNkZWZpbmUgUE9SVF9TVU5TQUIJMzkKKworLyogREVDICovCisjZGVmaW5lIFBPUlRfRFoJCTQ2CisjZGVmaW5lIFBPUlRfWlMJCTQ3CisKKy8qIFBhcmlzYyB0eXBlIG51bWJlcnMuICovCisjZGVmaW5lIFBPUlRfTVVYCTQ4CisKKy8qIEF0bWVsIEFUOTEgLyBBVDMyIFNvQyAqLworI2RlZmluZSBQT1JUX0FUTUVMCTQ5CisKKy8qIE1hY2ludG9zaCBaaWxvZyB0eXBlIG51bWJlcnMgKi8KKyNkZWZpbmUgUE9SVF9NQUNfWklMT0cJNTAJLyogbTY4ayA6IG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgUE9SVF9QTUFDX1pJTE9HCTUxCisKKy8qIFNILVNDSSAqLworI2RlZmluZSBQT1JUX1NDSQk1MgorI2RlZmluZSBQT1JUX1NDSUYJNTMKKyNkZWZpbmUgUE9SVF9JUkRBCTU0CisKKy8qIFNhbXN1bmcgUzNDMjQxMCBTb0MgYW5kIGRlcml2YXRpdmVzIHRoZXJlb2YgKi8KKyNkZWZpbmUgUE9SVF9TM0MyNDEwICAgIDU1CisKKy8qIFNHSSBJUDIyIGFrYSBJbmR5IC8gQ2hhbGxlbmdlIFMgLyBJbmRpZ28gMiAqLworI2RlZmluZSBQT1JUX0lQMjJaSUxPRwk1NgorCisvKiBTaGFycCBMSDdhNDB4IC0tIGFuIEFSTTkgU29DIHNlcmllcyAqLworI2RlZmluZSBQT1JUX0xIN0E0MFgJNTcKKworLyogUFBDIENQTSB0eXBlIG51bWJlciAqLworI2RlZmluZSBQT1JUX0NQTSAgICAgICAgNTgKKworLyogTVBDNTJ4eCAoYW5kIE1QQzUxMngpIHR5cGUgbnVtYmVycyAqLworI2RlZmluZSBQT1JUX01QQzUyeHgJNTkKKworLyogSUJNIGljb20gKi8KKyNkZWZpbmUgUE9SVF9JQ09NCTYwCisKKy8qIFNhbXN1bmcgUzNDMjQ0MCBTb0MgKi8KKyNkZWZpbmUgUE9SVF9TM0MyNDQwCTYxCisKKy8qIE1vdG9yb2xhIGkuTVggU29DICovCisjZGVmaW5lIFBPUlRfSU1YCTYyCisKKy8qIE1hcnZlbGwgTVBTQyAqLworI2RlZmluZSBQT1JUX01QU0MJNjMKKworLyogVFhYOSB0eXBlIG51bWJlciAqLworI2RlZmluZSBQT1JUX1RYWDkJNjQKKworLyogTkVDIFZSNDEwMCBzZXJpZXMgU0lVL0RTSVUgKi8KKyNkZWZpbmUgUE9SVF9WUjQxWFhfU0lVCQk2NQorI2RlZmluZSBQT1JUX1ZSNDFYWF9EU0lVCTY2CisKKy8qIFNhbXN1bmcgUzNDMjQwMCBTb0MgKi8KKyNkZWZpbmUgUE9SVF9TM0MyNDAwCTY3CisKKy8qIE0zMlIgU0lPICovCisjZGVmaW5lIFBPUlRfTTMyUl9TSU8JNjgKKworLypEaWdpIGpzbSAqLworI2RlZmluZSBQT1JUX0pTTSAgICAgICAgNjkKKworI2RlZmluZSBQT1JUX1BOWDhYWFgJNzAKKworLyogSGlsc2NoZXIgbmV0eCAqLworI2RlZmluZSBQT1JUX05FVFgJNzEKKworLyogU1VONFYgSHlwZXJ2aXNvciBDb25zb2xlICovCisjZGVmaW5lIFBPUlRfU1VOSFYJNzIKKworI2RlZmluZSBQT1JUX1MzQzI0MTIJNzMKKworLyogWGlsaW54IHVhcnRsaXRlICovCisjZGVmaW5lIFBPUlRfVUFSVExJVEUJNzQKKworLyogQmxhY2tmaW4gYmY1eHggKi8KKyNkZWZpbmUgUE9SVF9CRklOCTc1CisKKy8qIE1pY3JlbCBLUzg2OTUgKi8KKyNkZWZpbmUgUE9SVF9LUzg2OTUJNzYKKworLyogQnJvYWRjb20gU0IxMjUwLCBldGMuIFNPQyAqLworI2RlZmluZSBQT1JUX1NCMTI1MF9EVUFSVAk3NworCisvKiBGcmVlc2NhbGUgQ29sZEZpcmUgKi8KKyNkZWZpbmUgUE9SVF9NQ0YJNzgKKworLyogQmxhY2tmaW4gU1BPUlQgKi8KKyNkZWZpbmUgUE9SVF9CRklOX1NQT1JUCQk3OQorCisvKiBNTjEwMzAwIG9uLWNoaXAgVUFSVCBudW1iZXJzICovCisjZGVmaW5lIFBPUlRfTU4xMDMwMAkJODAKKyNkZWZpbmUgUE9SVF9NTjEwMzAwX0NUUwk4MQorCisjZGVmaW5lIFBPUlRfU0MyNlhYCTgyCisKKy8qIFNILVNDSSAqLworI2RlZmluZSBQT1JUX1NDSUZBCTgzCisKKyNkZWZpbmUgUE9SVF9TM0M2NDAwCTg0CisKKy8qIE5XUFNFUklBTCAqLworI2RlZmluZSBQT1JUX05XUFNFUklBTAk4NQorCisvKiBNQVgzMTAwICovCisjZGVmaW5lIFBPUlRfTUFYMzEwMCAgICA4NgorCisvKiBUaW1iZXJkYWxlIFVBUlQgKi8KKyNkZWZpbmUgUE9SVF9USU1CVUFSVAk4NworCisvKiBRdWFsY29tbSBNU00gU29DcyAqLworI2RlZmluZSBQT1JUX01TTQk4OAorCisvKiBCQ002M3h4IGZhbWlseSBTb0NzICovCisjZGVmaW5lIFBPUlRfQkNNNjNYWAk4OQorCisvKiBBZXJvZmxleCBHYWlzbGVyIEdSTElCIEFQQlVBUlQgKi8KKyNkZWZpbmUgUE9SVF9BUEJVQVJUICAgIDkwCisKKy8qIEFsdGVyYSBVQVJUcyAqLworI2RlZmluZSBQT1JUX0FMVEVSQV9KVEFHVUFSVAk5MQorI2RlZmluZSBQT1JUX0FMVEVSQV9VQVJUCTkyCisKKy8qIFNILVNDSSAqLworI2RlZmluZSBQT1JUX1NDSUZCCTkzCisKKy8qIE1BWDMxMDcgKi8KKyNkZWZpbmUgUE9SVF9NQVgzMTA3CTk0CisKKy8qIEhpZ2ggU3BlZWQgVUFSVCBmb3IgTWVkZmllbGQgKi8KKyNkZWZpbmUgUE9SVF9NRkQJOTUKKworLyogVEkgT01BUC1VQVJUICovCisjZGVmaW5lIFBPUlRfT01BUAk5NgorCisvKiBWSUEgVlQ4NTAwIFNvQyAqLworI2RlZmluZSBQT1JUX1ZUODUwMAk5NworCisvKiBYaWxpbnggUFNTIFVBUlQgKi8KKyNkZWZpbmUgUE9SVF9YVUFSVFBTCTk4CisKKworI2VuZGlmIC8qIExJTlVYX1NFUklBTF9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VyaWFsX3JlZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZXJpYWxfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlNzBkNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VyaWFsX3JlZy5oCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogaW5jbHVkZS9saW51eC9zZXJpYWxfcmVnLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQgYnkgVGhlb2RvcmUgVHMnby4KKyAqIAorICogUmVkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSAKKyAqIFB1YmxpYyBMaWNlbnNlIChHUEwpCisgKiAKKyAqIFRoZXNlIGFyZSB0aGUgVUFSVCBwb3J0IGFzc2lnbm1lbnRzLCBleHByZXNzZWQgYXMgb2Zmc2V0cyBmcm9tIHRoZSBiYXNlCisgKiByZWdpc3Rlci4gIFRoZXNlIGFzc2lnbm1lbnRzIHNob3VsZCBob2xkIGZvciBhbnkgc2VyaWFsIHBvcnQgYmFzZWQgb24KKyAqIGEgODI1MCwgMTY0NTAsIG9yIDE2NTUwKEEpLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1NFUklBTF9SRUdfSAorI2RlZmluZSBfTElOVVhfU0VSSUFMX1JFR19ICisKKy8qCisgKiBETEFCPTAKKyAqLworI2RlZmluZSBVQVJUX1JYCQkwCS8qIEluOiAgUmVjZWl2ZSBidWZmZXIgKi8KKyNkZWZpbmUgVUFSVF9UWAkJMAkvKiBPdXQ6IFRyYW5zbWl0IGJ1ZmZlciAqLworCisjZGVmaW5lIFVBUlRfSUVSCTEJLyogT3V0OiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfSUVSX01TSQkJMHgwOCAvKiBFbmFibGUgTW9kZW0gc3RhdHVzIGludGVycnVwdCAqLworI2RlZmluZSBVQVJUX0lFUl9STFNJCQkweDA0IC8qIEVuYWJsZSByZWNlaXZlciBsaW5lIHN0YXR1cyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVUFSVF9JRVJfVEhSSQkJMHgwMiAvKiBFbmFibGUgVHJhbnNtaXR0ZXIgaG9sZGluZyByZWdpc3RlciBpbnQuICovCisjZGVmaW5lIFVBUlRfSUVSX1JESQkJMHgwMSAvKiBFbmFibGUgcmVjZWl2ZXIgZGF0YSBpbnRlcnJ1cHQgKi8KKy8qCisgKiBTbGVlcCBtb2RlIGZvciBTVDE2NjUwIGFuZCBUSTE2NzUwLiAgRm9yIHRoZSBTVDE2NjUwLCBFRlJbNF09MQorICovCisjZGVmaW5lIFVBUlRfSUVSWF9TTEVFUAkJMHgxMCAvKiBFbmFibGUgc2xlZXAgbW9kZSAqLworCisjZGVmaW5lIFVBUlRfSUlSCTIJLyogSW46ICBJbnRlcnJ1cHQgSUQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9JSVJfTk9fSU5UCQkweDAxIC8qIE5vIGludGVycnVwdHMgcGVuZGluZyAqLworI2RlZmluZSBVQVJUX0lJUl9JRAkJMHgwNiAvKiBNYXNrIGZvciB0aGUgaW50ZXJydXB0IElEICovCisjZGVmaW5lIFVBUlRfSUlSX01TSQkJMHgwMCAvKiBNb2RlbSBzdGF0dXMgaW50ZXJydXB0ICovCisjZGVmaW5lIFVBUlRfSUlSX1RIUkkJCTB4MDIgLyogVHJhbnNtaXR0ZXIgaG9sZGluZyByZWdpc3RlciBlbXB0eSAqLworI2RlZmluZSBVQVJUX0lJUl9SREkJCTB4MDQgLyogUmVjZWl2ZXIgZGF0YSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVUFSVF9JSVJfUkxTSQkJMHgwNiAvKiBSZWNlaXZlciBsaW5lIHN0YXR1cyBpbnRlcnJ1cHQgKi8KKworI2RlZmluZSBVQVJUX0lJUl9CVVNZCQkweDA3IC8qIERlc2lnbldhcmUgQVBCIEJ1c3kgRGV0ZWN0ICovCisKKyNkZWZpbmUgVUFSVF9GQ1IJMgkvKiBPdXQ6IEZJRk8gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0ZDUl9FTkFCTEVfRklGTwkweDAxIC8qIEVuYWJsZSB0aGUgRklGTyAqLworI2RlZmluZSBVQVJUX0ZDUl9DTEVBUl9SQ1ZSCTB4MDIgLyogQ2xlYXIgdGhlIFJDVlIgRklGTyAqLworI2RlZmluZSBVQVJUX0ZDUl9DTEVBUl9YTUlUCTB4MDQgLyogQ2xlYXIgdGhlIFhNSVQgRklGTyAqLworI2RlZmluZSBVQVJUX0ZDUl9ETUFfU0VMRUNUCTB4MDggLyogRm9yIERNQSBhcHBsaWNhdGlvbnMgKi8KKy8qCisgKiBOb3RlOiBUaGUgRklGTyB0cmlnZ2VyIGxldmVscyBhcmUgY2hpcCBzcGVjaWZpYzoKKyAqCVJYOjc2ID0gMDAgIDAxICAxMCAgMTEJVFg6NTQgPSAwMCAgMDEgIDEwICAxMQorICogUEMxNjU1MEQ6CSAxICAgNCAgIDggIDE0CQl4eCAgeHggIHh4ICB4eAorICogVEkxNkM1NTBBOgkgMSAgIDQgICA4ICAxNCAgICAgICAgICB4eCAgeHggIHh4ICB4eAorICogVEkxNkM1NTBDOgkgMSAgIDQgICA4ICAxNCAgICAgICAgICB4eCAgeHggIHh4ICB4eAorICogU1QxNkM1NTA6CSAxICAgNCAgIDggIDE0CQl4eCAgeHggIHh4ICB4eAorICogU1QxNkM2NTA6CSA4ICAxNiAgMjQgIDI4CQkxNiAgIDggIDI0ICAzMAlQT1JUXzE2NjUwVjIKKyAqIE5TMTZDNTUyOgkgMSAgIDQgICA4ICAxNAkJeHggIHh4ICB4eCAgeHgKKyAqIFNUMTZDNjU0OgkgOCAgMTYgIDU2ICA2MAkJIDggIDE2ICAzMiAgNTYJUE9SVF8xNjY1NAorICogVEkxNkM3NTA6CSAxICAxNiAgMzIgIDU2CQl4eCAgeHggIHh4ICB4eAlQT1JUXzE2NzUwCisgKiBUSTE2Qzc1MjoJIDggIDE2ICA1NiAgNjAJCSA4ICAxNiAgMzIgIDU2CisgKiBUZWdyYToJIDEgICA0ICAgOCAgMTQJCTE2ICAgOCAgIDQgICAxCVBPUlRfVEVHUkEKKyAqLworI2RlZmluZSBVQVJUX0ZDUl9SX1RSSUdfMDAJMHgwMAorI2RlZmluZSBVQVJUX0ZDUl9SX1RSSUdfMDEJMHg0MAorI2RlZmluZSBVQVJUX0ZDUl9SX1RSSUdfMTAJMHg4MAorI2RlZmluZSBVQVJUX0ZDUl9SX1RSSUdfMTEJMHhjMAorI2RlZmluZSBVQVJUX0ZDUl9UX1RSSUdfMDAJMHgwMAorI2RlZmluZSBVQVJUX0ZDUl9UX1RSSUdfMDEJMHgxMAorI2RlZmluZSBVQVJUX0ZDUl9UX1RSSUdfMTAJMHgyMAorI2RlZmluZSBVQVJUX0ZDUl9UX1RSSUdfMTEJMHgzMAorCisjZGVmaW5lIFVBUlRfRkNSX1RSSUdHRVJfTUFTSwkweEMwIC8qIE1hc2sgZm9yIHRoZSBGSUZPIHRyaWdnZXIgcmFuZ2UgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfVFJJR0dFUl8xCTB4MDAgLyogTWFzayBmb3IgdHJpZ2dlciBzZXQgYXQgMSAqLworI2RlZmluZSBVQVJUX0ZDUl9UUklHR0VSXzQJMHg0MCAvKiBNYXNrIGZvciB0cmlnZ2VyIHNldCBhdCA0ICovCisjZGVmaW5lIFVBUlRfRkNSX1RSSUdHRVJfOAkweDgwIC8qIE1hc2sgZm9yIHRyaWdnZXIgc2V0IGF0IDggKi8KKyNkZWZpbmUgVUFSVF9GQ1JfVFJJR0dFUl8xNAkweEMwIC8qIE1hc2sgZm9yIHRyaWdnZXIgc2V0IGF0IDE0ICovCisvKiAxNjY1MCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBVQVJUX0ZDUjZfUl9UUklHR0VSXzgJMHgwMCAvKiBNYXNrIGZvciByZWNlaXZlIHRyaWdnZXIgc2V0IGF0IDEgKi8KKyNkZWZpbmUgVUFSVF9GQ1I2X1JfVFJJR0dFUl8xNgkweDQwIC8qIE1hc2sgZm9yIHJlY2VpdmUgdHJpZ2dlciBzZXQgYXQgNCAqLworI2RlZmluZSBVQVJUX0ZDUjZfUl9UUklHR0VSXzI0ICAweDgwIC8qIE1hc2sgZm9yIHJlY2VpdmUgdHJpZ2dlciBzZXQgYXQgOCAqLworI2RlZmluZSBVQVJUX0ZDUjZfUl9UUklHR0VSXzI4CTB4QzAgLyogTWFzayBmb3IgcmVjZWl2ZSB0cmlnZ2VyIHNldCBhdCAxNCAqLworI2RlZmluZSBVQVJUX0ZDUjZfVF9UUklHR0VSXzE2CTB4MDAgLyogTWFzayBmb3IgdHJhbnNtaXQgdHJpZ2dlciBzZXQgYXQgMTYgKi8KKyNkZWZpbmUgVUFSVF9GQ1I2X1RfVFJJR0dFUl84CTB4MTAgLyogTWFzayBmb3IgdHJhbnNtaXQgdHJpZ2dlciBzZXQgYXQgOCAqLworI2RlZmluZSBVQVJUX0ZDUjZfVF9UUklHR0VSXzI0ICAweDIwIC8qIE1hc2sgZm9yIHRyYW5zbWl0IHRyaWdnZXIgc2V0IGF0IDI0ICovCisjZGVmaW5lIFVBUlRfRkNSNl9UX1RSSUdHRVJfMzAJMHgzMCAvKiBNYXNrIGZvciB0cmFuc21pdCB0cmlnZ2VyIHNldCBhdCAzMCAqLworI2RlZmluZSBVQVJUX0ZDUjdfNjRCWVRFCTB4MjAgLyogR28gaW50byA2NCBieXRlIG1vZGUgKFRJMTZDNzUwKSAqLworCisjZGVmaW5lIFVBUlRfTENSCTMJLyogT3V0OiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgKi8KKy8qCisgKiBOb3RlOiBpZiB0aGUgd29yZCBsZW5ndGggaXMgNSBiaXRzIChVQVJUX0xDUl9XTEVONSksIHRoZW4gc2V0dGluZyAKKyAqIFVBUlRfTENSX1NUT1Agd2lsbCBzZWxlY3QgMS41IHN0b3AgYml0cywgbm90IDIgc3RvcCBiaXRzLgorICovCisjZGVmaW5lIFVBUlRfTENSX0RMQUIJCTB4ODAgLyogRGl2aXNvciBsYXRjaCBhY2Nlc3MgYml0ICovCisjZGVmaW5lIFVBUlRfTENSX1NCQwkJMHg0MCAvKiBTZXQgYnJlYWsgY29udHJvbCAqLworI2RlZmluZSBVQVJUX0xDUl9TUEFSCQkweDIwIC8qIFN0aWNrIHBhcml0eSAoPykgKi8KKyNkZWZpbmUgVUFSVF9MQ1JfRVBBUgkJMHgxMCAvKiBFdmVuIHBhcml0eSBzZWxlY3QgKi8KKyNkZWZpbmUgVUFSVF9MQ1JfUEFSSVRZCQkweDA4IC8qIFBhcml0eSBFbmFibGUgKi8KKyNkZWZpbmUgVUFSVF9MQ1JfU1RPUAkJMHgwNCAvKiBTdG9wIGJpdHM6IDA9MSBiaXQsIDE9MiBiaXRzICovCisjZGVmaW5lIFVBUlRfTENSX1dMRU41CQkweDAwIC8qIFdvcmRsZW5ndGg6IDUgYml0cyAqLworI2RlZmluZSBVQVJUX0xDUl9XTEVONgkJMHgwMSAvKiBXb3JkbGVuZ3RoOiA2IGJpdHMgKi8KKyNkZWZpbmUgVUFSVF9MQ1JfV0xFTjcJCTB4MDIgLyogV29yZGxlbmd0aDogNyBiaXRzICovCisjZGVmaW5lIFVBUlRfTENSX1dMRU44CQkweDAzIC8qIFdvcmRsZW5ndGg6IDggYml0cyAqLworCisvKgorICogQWNjZXNzIHRvIHNvbWUgcmVnaXN0ZXJzIGRlcGVuZHMgb24gcmVnaXN0ZXIgYWNjZXNzIC8gY29uZmlndXJhdGlvbgorICogbW9kZS4KKyAqLworI2RlZmluZSBVQVJUX0xDUl9DT05GX01PREVfQQlVQVJUX0xDUl9ETEFCCS8qIENvbmZpZ3V0YXRpb24gbW9kZSBBICovCisjZGVmaW5lIFVBUlRfTENSX0NPTkZfTU9ERV9CCTB4QkYJCS8qIENvbmZpZ3V0YXRpb24gbW9kZSBCICovCisKKyNkZWZpbmUgVUFSVF9NQ1IJNAkvKiBPdXQ6IE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9NQ1JfQ0xLU0VMCQkweDgwIC8qIERpdmlkZSBjbG9jayBieSA0IChUSTE2Qzc1MiwgRUZSWzRdPTEpICovCisjZGVmaW5lIFVBUlRfTUNSX1RDUlRMUgkJMHg0MCAvKiBBY2Nlc3MgVENSL1RMUiAoVEkxNkM3NTIsIEVGUls0XT0xKSAqLworI2RlZmluZSBVQVJUX01DUl9YT05BTlkJCTB4MjAgLyogRW5hYmxlIFhvbiBBbnkgKFRJMTZDNzUyLCBFRlJbNF09MSkgKi8KKyNkZWZpbmUgVUFSVF9NQ1JfQUZFCQkweDIwIC8qIEVuYWJsZSBhdXRvLVJUUy9DVFMgKFRJMTZDNTUwQy9USTE2Qzc1MCkgKi8KKyNkZWZpbmUgVUFSVF9NQ1JfTE9PUAkJMHgxMCAvKiBFbmFibGUgbG9vcGJhY2sgdGVzdCBtb2RlICovCisjZGVmaW5lIFVBUlRfTUNSX09VVDIJCTB4MDggLyogT3V0MiBjb21wbGVtZW50ICovCisjZGVmaW5lIFVBUlRfTUNSX09VVDEJCTB4MDQgLyogT3V0MSBjb21wbGVtZW50ICovCisjZGVmaW5lIFVBUlRfTUNSX1JUUwkJMHgwMiAvKiBSVFMgY29tcGxlbWVudCAqLworI2RlZmluZSBVQVJUX01DUl9EVFIJCTB4MDEgLyogRFRSIGNvbXBsZW1lbnQgKi8KKworI2RlZmluZSBVQVJUX0xTUgk1CS8qIEluOiAgTGluZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9MU1JfRklGT0UJCTB4ODAgLyogRmlmbyBlcnJvciAqLworI2RlZmluZSBVQVJUX0xTUl9URU1UCQkweDQwIC8qIFRyYW5zbWl0dGVyIGVtcHR5ICovCisjZGVmaW5lIFVBUlRfTFNSX1RIUkUJCTB4MjAgLyogVHJhbnNtaXQtaG9sZC1yZWdpc3RlciBlbXB0eSAqLworI2RlZmluZSBVQVJUX0xTUl9CSQkJMHgxMCAvKiBCcmVhayBpbnRlcnJ1cHQgaW5kaWNhdG9yICovCisjZGVmaW5lIFVBUlRfTFNSX0ZFCQkweDA4IC8qIEZyYW1lIGVycm9yIGluZGljYXRvciAqLworI2RlZmluZSBVQVJUX0xTUl9QRQkJMHgwNCAvKiBQYXJpdHkgZXJyb3IgaW5kaWNhdG9yICovCisjZGVmaW5lIFVBUlRfTFNSX09FCQkweDAyIC8qIE92ZXJydW4gZXJyb3IgaW5kaWNhdG9yICovCisjZGVmaW5lIFVBUlRfTFNSX0RSCQkweDAxIC8qIFJlY2VpdmVyIGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgVUFSVF9MU1JfQlJLX0VSUk9SX0JJVFMJMHgxRSAvKiBCSSwgRkUsIFBFLCBPRSBiaXRzICovCisKKyNkZWZpbmUgVUFSVF9NU1IJNgkvKiBJbjogIE1vZGVtIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX01TUl9EQ0QJCTB4ODAgLyogRGF0YSBDYXJyaWVyIERldGVjdCAqLworI2RlZmluZSBVQVJUX01TUl9SSQkJMHg0MCAvKiBSaW5nIEluZGljYXRvciAqLworI2RlZmluZSBVQVJUX01TUl9EU1IJCTB4MjAgLyogRGF0YSBTZXQgUmVhZHkgKi8KKyNkZWZpbmUgVUFSVF9NU1JfQ1RTCQkweDEwIC8qIENsZWFyIHRvIFNlbmQgKi8KKyNkZWZpbmUgVUFSVF9NU1JfRERDRAkJMHgwOCAvKiBEZWx0YSBEQ0QgKi8KKyNkZWZpbmUgVUFSVF9NU1JfVEVSSQkJMHgwNCAvKiBUcmFpbGluZyBlZGdlIHJpbmcgaW5kaWNhdG9yICovCisjZGVmaW5lIFVBUlRfTVNSX0REU1IJCTB4MDIgLyogRGVsdGEgRFNSICovCisjZGVmaW5lIFVBUlRfTVNSX0RDVFMJCTB4MDEgLyogRGVsdGEgQ1RTICovCisjZGVmaW5lIFVBUlRfTVNSX0FOWV9ERUxUQQkweDBGIC8qIEFueSBvZiB0aGUgZGVsdGEgYml0cyEgKi8KKworI2RlZmluZSBVQVJUX1NDUgk3CS8qIEkvTzogU2NyYXRjaCBSZWdpc3RlciAqLworCisvKgorICogRExBQj0xCisgKi8KKyNkZWZpbmUgVUFSVF9ETEwJMAkvKiBPdXQ6IERpdmlzb3IgTGF0Y2ggTG93ICovCisjZGVmaW5lIFVBUlRfRExNCTEJLyogT3V0OiBEaXZpc29yIExhdGNoIEhpZ2ggKi8KKworLyoKKyAqIExDUj0weEJGIChvciBETEFCPTEgZm9yIDE2QzY2MCkKKyAqLworI2RlZmluZSBVQVJUX0VGUgkyCS8qIEkvTzogRXh0ZW5kZWQgRmVhdHVyZXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9YUl9FRlIJOQkvKiBJL086IEV4dGVuZGVkIEZlYXR1cmVzIFJlZ2lzdGVyIChYUjE3RDE1eCkgKi8KKyNkZWZpbmUgVUFSVF9FRlJfQ1RTCQkweDgwIC8qIENUUyBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgVUFSVF9FRlJfUlRTCQkweDQwIC8qIFJUUyBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgVUFSVF9FRlJfU0NECQkweDIwIC8qIFNwZWNpYWwgY2hhcmFjdGVyIGRldGVjdCAqLworI2RlZmluZSBVQVJUX0VGUl9FQ0IJCTB4MTAgLyogRW5oYW5jZWQgY29udHJvbCBiaXQgKi8KKy8qCisgKiB0aGUgbG93IGZvdXIgYml0cyBjb250cm9sIHNvZnR3YXJlIGZsb3cgY29udHJvbAorICovCisKKy8qCisgKiBMQ1I9MHhCRiwgVEkxNkM3NTIsIFNUMTY2NTAsIFNUMTY2NTBBLCBTVDE2NjU0CisgKi8KKyNkZWZpbmUgVUFSVF9YT04xCTQJLyogSS9POiBYb24gY2hhcmFjdGVyIDEgKi8KKyNkZWZpbmUgVUFSVF9YT04yCTUJLyogSS9POiBYb24gY2hhcmFjdGVyIDIgKi8KKyNkZWZpbmUgVUFSVF9YT0ZGMQk2CS8qIEkvTzogWG9mZiBjaGFyYWN0ZXIgMSAqLworI2RlZmluZSBVQVJUX1hPRkYyCTcJLyogSS9POiBYb2ZmIGNoYXJhY3RlciAyICovCisKKy8qCisgKiBFRlJbNF09MSBNQ1JbNl09MSwgVEkxNkM3NTIKKyAqLworI2RlZmluZSBVQVJUX1RJNzUyX1RDUgk2CS8qIEkvTzogdHJhbnNtaXNzaW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9USTc1Ml9UTFIJNwkvKiBJL086IHRyaWdnZXIgbGV2ZWwgcmVnaXN0ZXIgKi8KKworLyoKKyAqIExDUj0weEJGLCBYUjE2Qzg1eAorICovCisjZGVmaW5lIFVBUlRfVFJHCTAJLyogRkNUUiBiaXQgNyBzZWxlY3RzIFJ4IG9yIFR4CisJCQkJICogSW46IEZpZm8gY291bnQKKwkJCQkgKiBPdXQ6IEZpZm8gY3VzdG9tIHRyaWdnZXIgbGV2ZWxzICovCisvKgorICogVGhlc2UgYXJlIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIFByb2dyYW1tYWJsZSBUcmlnZ2VyIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgVUFSVF9UUkdfMQkJMHgwMQorI2RlZmluZSBVQVJUX1RSR180CQkweDA0CisjZGVmaW5lIFVBUlRfVFJHXzgJCTB4MDgKKyNkZWZpbmUgVUFSVF9UUkdfMTYJCTB4MTAKKyNkZWZpbmUgVUFSVF9UUkdfMzIJCTB4MjAKKyNkZWZpbmUgVUFSVF9UUkdfNjQJCTB4NDAKKyNkZWZpbmUgVUFSVF9UUkdfOTYJCTB4NjAKKyNkZWZpbmUgVUFSVF9UUkdfMTIwCQkweDc4CisjZGVmaW5lIFVBUlRfVFJHXzEyOAkJMHg4MAorCisjZGVmaW5lIFVBUlRfRkNUUgkxCS8qIEZlYXR1cmUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0ZDVFJfUlRTX05PREVMQVkJMHgwMCAgLyogUlRTIGZsb3cgY29udHJvbCBkZWxheSAqLworI2RlZmluZSBVQVJUX0ZDVFJfUlRTXzRERUxBWQkweDAxCisjZGVmaW5lIFVBUlRfRkNUUl9SVFNfNkRFTEFZCTB4MDIKKyNkZWZpbmUgVUFSVF9GQ1RSX1JUU184REVMQVkJMHgwMworI2RlZmluZSBVQVJUX0ZDVFJfSVJEQQkJMHgwNCAgLyogSXJEYSBkYXRhIGVuY29kZSBzZWxlY3QgKi8KKyNkZWZpbmUgVUFSVF9GQ1RSX1RYX0lOVAkweDA4ICAvKiBUeCBpbnRlcnJ1cHQgdHlwZSBzZWxlY3QgKi8KKyNkZWZpbmUgVUFSVF9GQ1RSX1RSR0EJCTB4MDAgIC8qIFR4L1J4IDU1MCB0cmlnZ2VyIHRhYmxlIHNlbGVjdCAqLworI2RlZmluZSBVQVJUX0ZDVFJfVFJHQgkJMHgxMCAgLyogVHgvUnggNjUwIHRyaWdnZXIgdGFibGUgc2VsZWN0ICovCisjZGVmaW5lIFVBUlRfRkNUUl9UUkdDCQkweDIwICAvKiBUeC9SeCA2NTQgdHJpZ2dlciB0YWJsZSBzZWxlY3QgKi8KKyNkZWZpbmUgVUFSVF9GQ1RSX1RSR0QJCTB4MzAgIC8qIFR4L1J4IDg1MCBwcm9ncmFtbWFibGUgdHJpZ2dlciBzZWxlY3QgKi8KKyNkZWZpbmUgVUFSVF9GQ1RSX1NDUl9TV0FQCTB4NDAgIC8qIFNjcmF0Y2ggcGFkIHJlZ2lzdGVyIHN3YXAgKi8KKyNkZWZpbmUgVUFSVF9GQ1RSX1JYCQkweDAwICAvKiBQcm9ncmFtbWFibGUgdHJpZ2dlciBtb2RlIHNlbGVjdCAqLworI2RlZmluZSBVQVJUX0ZDVFJfVFgJCTB4ODAgIC8qIFByb2dyYW1tYWJsZSB0cmlnZ2VyIG1vZGUgc2VsZWN0ICovCisKKy8qCisgKiBMQ1I9MHhCRiwgRkNUUls2XT0xCisgKi8KKyNkZWZpbmUgVUFSVF9FTVNSCTcJLyogRXh0ZW5kZWQgTW9kZSBTZWxlY3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9FTVNSX0ZJRk9fQ09VTlQJMHgwMSAgLyogUngvVHggc2VsZWN0ICovCisjZGVmaW5lIFVBUlRfRU1TUl9BTFRfQ09VTlQJMHgwMiAgLyogQWx0ZXJuYXRpbmcgY291bnQgc2VsZWN0ICovCisKKy8qCisgKiBUaGUgSW50ZWwgWFNjYWxlIG9uLWNoaXAgVUFSVHMgZGVmaW5lIHRoZXNlIGJpdHMKKyAqLworI2RlZmluZSBVQVJUX0lFUl9ETUFFCTB4ODAJLyogRE1BIFJlcXVlc3RzIEVuYWJsZSAqLworI2RlZmluZSBVQVJUX0lFUl9VVUUJMHg0MAkvKiBVQVJUIFVuaXQgRW5hYmxlICovCisjZGVmaW5lIFVBUlRfSUVSX05SWkUJMHgyMAkvKiBOUlogY29kaW5nIEVuYWJsZSAqLworI2RlZmluZSBVQVJUX0lFUl9SVE9JRQkweDEwCS8qIFJlY2VpdmVyIFRpbWUgT3V0IEludGVycnVwdCBFbmFibGUgKi8KKworI2RlZmluZSBVQVJUX0lJUl9UT0QJMHgwOAkvKiBDaGFyYWN0ZXIgVGltZW91dCBJbmRpY2F0aW9uIERldGVjdGVkICovCisKKyNkZWZpbmUgVUFSVF9GQ1JfUFhBUjEJMHgwMAkvKiByZWNlaXZlIEZJRk8gdGhyZXNob2xkID0gMSAqLworI2RlZmluZSBVQVJUX0ZDUl9QWEFSOAkweDQwCS8qIHJlY2VpdmUgRklGTyB0aHJlc2hvbGQgPSA4ICovCisjZGVmaW5lIFVBUlRfRkNSX1BYQVIxNgkweDgwCS8qIHJlY2VpdmUgRklGTyB0aHJlc2hvbGQgPSAxNiAqLworI2RlZmluZSBVQVJUX0ZDUl9QWEFSMzIJMHhjMAkvKiByZWNlaXZlIEZJRk8gdGhyZXNob2xkID0gMzIgKi8KKworLyoKKyAqIEludGVsIE1JRCBvbi1jaGlwIEhTVSAoSGlnaCBTcGVlZCBVQVJUKSBkZWZpbmVkIGJpdHMKKyAqLworI2RlZmluZSBVQVJUX0ZDUl9IU1VfNjRfMUIJMHgwMAkvKiByZWNlaXZlIEZJRk8gdHJlc2hvbGQgPSAxICovCisjZGVmaW5lIFVBUlRfRkNSX0hTVV82NF8xNkIJMHg0MAkvKiByZWNlaXZlIEZJRk8gdHJlc2hvbGQgPSAxNiAqLworI2RlZmluZSBVQVJUX0ZDUl9IU1VfNjRfMzJCCTB4ODAJLyogcmVjZWl2ZSBGSUZPIHRyZXNob2xkID0gMzIgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfSFNVXzY0XzU2QgkweGMwCS8qIHJlY2VpdmUgRklGTyB0cmVzaG9sZCA9IDU2ICovCisKKyNkZWZpbmUgVUFSVF9GQ1JfSFNVXzE2XzFCCTB4MDAJLyogcmVjZWl2ZSBGSUZPIHRyZXNob2xkID0gMSAqLworI2RlZmluZSBVQVJUX0ZDUl9IU1VfMTZfNEIJMHg0MAkvKiByZWNlaXZlIEZJRk8gdHJlc2hvbGQgPSA0ICovCisjZGVmaW5lIFVBUlRfRkNSX0hTVV8xNl84QgkweDgwCS8qIHJlY2VpdmUgRklGTyB0cmVzaG9sZCA9IDggKi8KKyNkZWZpbmUgVUFSVF9GQ1JfSFNVXzE2XzE0QgkweGMwCS8qIHJlY2VpdmUgRklGTyB0cmVzaG9sZCA9IDE0ICovCisKKyNkZWZpbmUgVUFSVF9GQ1JfSFNVXzY0Ql9GSUZPCTB4MjAJLyogY2hvc2UgNjQgYnl0ZXMgRklGTyAqLworI2RlZmluZSBVQVJUX0ZDUl9IU1VfMTZCX0ZJRk8JMHgwMAkvKiBjaG9zZSAxNiBieXRlcyBGSUZPICovCisKKyNkZWZpbmUgVUFSVF9GQ1JfSEFMRl9FTVBUX1RYSQkweDAwCS8qIHRyaWdnZXIgVFhfRU1QVCBJUlEgZm9yIGhhbGYgZW1wdHkgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfRlVMTF9FTVBUX1RYSQkweDA4CS8qIHRyaWdnZXIgVFhfRU1QVCBJUlEgZm9yIGZ1bGwgZW1wdHkgKi8KKworLyoKKyAqIFRoZXNlIHJlZ2lzdGVyIGRlZmluaXRpb25zIGFyZSBmb3IgdGhlIDE2Qzk1MAorICovCisjZGVmaW5lIFVBUlRfQVNSCTB4MDEJLyogQWRkaXRpb25hbCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9SRkwJMHgwMwkvKiBSZWNlaXZlciBGSUZPIGxldmVsICovCisjZGVmaW5lIFVBUlRfVEZMIAkweDA0CS8qIFRyYW5zbWl0dGVyIEZJRk8gbGV2ZWwgKi8KKyNkZWZpbmUgVUFSVF9JQ1IJMHgwNQkvKiBJbmRleCBDb250cm9sIFJlZ2lzdGVyICovCisKKy8qIFRoZSAxNjk1MCBJQ1IgcmVnaXN0ZXJzICovCisjZGVmaW5lIFVBUlRfQUNSCTB4MDAJLyogQWRkaXRpb25hbCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfQ1BSCTB4MDEJLyogQ2xvY2sgUHJlc2NhbGFyIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfVENSCTB4MDIJLyogVGltZXMgQ2xvY2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9DS1MJMHgwMwkvKiBDbG9jayBTZWxlY3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9UVEwJMHgwNAkvKiBUcmFuc21pdHRlciBJbnRlcnJ1cHQgVHJpZ2dlciBMZXZlbCAqLworI2RlZmluZSBVQVJUX1JUTAkweDA1CS8qIFJlY2VpdmVyIEludGVycnVwdCBUcmlnZ2VyIExldmVsICovCisjZGVmaW5lIFVBUlRfRkNMCTB4MDYJLyogRmxvdyBDb250cm9sIExldmVsIExvd2VyICovCisjZGVmaW5lIFVBUlRfRkNICTB4MDcJLyogRmxvdyBDb250cm9sIExldmVsIEhpZ2hlciAqLworI2RlZmluZSBVQVJUX0lEMQkweDA4CS8qIElEICMxICovCisjZGVmaW5lIFVBUlRfSUQyCTB4MDkJLyogSUQgIzIgKi8KKyNkZWZpbmUgVUFSVF9JRDMJMHgwQQkvKiBJRCAjMyAqLworI2RlZmluZSBVQVJUX1JFVgkweDBCCS8qIFJldmlzaW9uICovCisjZGVmaW5lIFVBUlRfQ1NSCTB4MEMJLyogQ2hhbm5lbCBTb2Z0d2FyZSBSZXNldCAqLworI2RlZmluZSBVQVJUX05NUgkweDBECS8qIE5pbmUtYml0IE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9DVFIJMHhGRgorCisvKgorICogVGhlIDE2Qzk1MCBBZGRpdGlvbmFsIENvbnRyb2wgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBVQVJUX0FDUl9SWERJUwkweDAxCS8qIFJlY2VpdmVyIGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9BQ1JfVFhESVMJMHgwMgkvKiBUcmFuc21pdHRlciBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfQUNSX0RTUkZDCTB4MDQJLyogRFNSIEZsb3cgQ29udHJvbCAqLworI2RlZmluZSBVQVJUX0FDUl9UTEVOQgkweDIwCS8qIDk1MCB0cmlnZ2VyIGxldmVscyBlbmFibGUgKi8KKyNkZWZpbmUgVUFSVF9BQ1JfSUNSUkQJMHg0MAkvKiBJQ1IgUmVhZCBlbmFibGUgKi8KKyNkZWZpbmUgVUFSVF9BQ1JfQVNSRU4JMHg4MAkvKiBBZGRpdGlvbmFsIHN0YXR1cyBlbmFibGUgKi8KKworCisKKy8qCisgKiBUaGVzZSBkZWZpbml0aW9ucyBhcmUgZm9yIHRoZSBSU0EtRFYgSUkvUyBjYXJkLCBmcm9tCisgKgorICogS2l5b2thenUgU1VUTyA8c3V0b0Brcy1hbmQta3MubmUuanA+CisgKi8KKworI2RlZmluZSBVQVJUX1JTQV9CQVNFICgtOCkKKworI2RlZmluZSBVQVJUX1JTQV9NU1IgKChVQVJUX1JTQV9CQVNFKSArIDApIC8qIEkvTzogTW9kZSBTZWxlY3QgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBVQVJUX1JTQV9NU1JfU1dBUCAoMSA8PCAwKSAvKiBTd2FwIGxvdy9oaWdoIDggYnl0ZXMgaW4gSS9PIHBvcnQgYWRkciAqLworI2RlZmluZSBVQVJUX1JTQV9NU1JfRklGTyAoMSA8PCAyKSAvKiBFbmFibGUgdGhlIGV4dGVybmFsIEZJRk8gKi8KKyNkZWZpbmUgVUFSVF9SU0FfTVNSX0ZMT1cgKDEgPDwgMykgLyogRW5hYmxlIHRoZSBhdXRvIFJUUy9DVFMgZmxvdyBjb250cm9sICovCisjZGVmaW5lIFVBUlRfUlNBX01TUl9JVFlQICgxIDw8IDQpIC8qIExldmVsICgxKSAvIEVkZ2UgdHJpZ2VyICgwKSAqLworCisjZGVmaW5lIFVBUlRfUlNBX0lFUiAoKFVBUlRfUlNBX0JBU0UpICsgMSkgLyogSS9POiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgVUFSVF9SU0FfSUVSX1J4X0ZJRk9fSCAoMSA8PCAwKSAvKiBFbmFibGUgUnggRklGTyBoYWxmIGZ1bGwgaW50LiAqLworI2RlZmluZSBVQVJUX1JTQV9JRVJfVHhfRklGT19IICgxIDw8IDEpIC8qIEVuYWJsZSBUeCBGSUZPIGhhbGYgZnVsbCBpbnQuICovCisjZGVmaW5lIFVBUlRfUlNBX0lFUl9UeF9GSUZPX0UgKDEgPDwgMikgLyogRW5hYmxlIFR4IEZJRk8gZW1wdHkgaW50LiAqLworI2RlZmluZSBVQVJUX1JTQV9JRVJfUnhfVE9VVCAoMSA8PCAzKSAvKiBFbmFibGUgY2hhciByZWNlaXZlIHRpbWVvdXQgaW50ICovCisjZGVmaW5lIFVBUlRfUlNBX0lFUl9USU1FUiAoMSA8PCA0KSAvKiBFbmFibGUgdGltZXIgaW50ZXJydXB0ICovCisKKyNkZWZpbmUgVUFSVF9SU0FfU1JSICgoVUFSVF9SU0FfQkFTRSkgKyAyKSAvKiBJTjogU3RhdHVzIFJlYWQgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBVQVJUX1JTQV9TUlJfVHhfRklGT19ORU1QICgxIDw8IDApIC8qIFR4IEZJRk8gaXMgbm90IGVtcHR5ICgxKSAqLworI2RlZmluZSBVQVJUX1JTQV9TUlJfVHhfRklGT19OSEZMICgxIDw8IDEpIC8qIFR4IEZJRk8gaXMgbm90IGhhbGYgZnVsbCAoMSkgKi8KKyNkZWZpbmUgVUFSVF9SU0FfU1JSX1R4X0ZJRk9fTkZVTCAoMSA8PCAyKSAvKiBUeCBGSUZPIGlzIG5vdCBmdWxsICgxKSAqLworI2RlZmluZSBVQVJUX1JTQV9TUlJfUnhfRklGT19ORU1QICgxIDw8IDMpIC8qIFJ4IEZJRk8gaXMgbm90IGVtcHR5ICgxKSAqLworI2RlZmluZSBVQVJUX1JTQV9TUlJfUnhfRklGT19OSEZMICgxIDw8IDQpIC8qIFJ4IEZJRk8gaXMgbm90IGhhbGYgZnVsbCAoMSkgKi8KKyNkZWZpbmUgVUFSVF9SU0FfU1JSX1J4X0ZJRk9fTkZVTCAoMSA8PCA1KSAvKiBSeCBGSUZPIGlzIG5vdCBmdWxsICgxKSAqLworI2RlZmluZSBVQVJUX1JTQV9TUlJfUnhfVE9VVCAoMSA8PCA2KSAvKiBDaGFyYWN0ZXIgcmVjZXB0aW9uIHRpbWVvdXQgb2NjdXJyZWQgKDEpICovCisjZGVmaW5lIFVBUlRfUlNBX1NSUl9USU1FUiAoMSA8PCA3KSAvKiBUaW1lciBpbnRlcnJ1cHQgb2NjdXJyZWQgKi8KKworI2RlZmluZSBVQVJUX1JTQV9GUlIgKChVQVJUX1JTQV9CQVNFKSArIDIpIC8qIE9VVDogRklGTyBSZXNldCBSZWdpc3RlciAqLworCisjZGVmaW5lIFVBUlRfUlNBX1RJVlNSICgoVUFSVF9SU0FfQkFTRSkgKyAzKSAvKiBJL086IFRpbWVyIEludGVydmFsIFZhbHVlIFNldCBSZWdpc3RlciAqLworCisjZGVmaW5lIFVBUlRfUlNBX1RDUiAoKFVBUlRfUlNBX0JBU0UpICsgNCkgLyogT1VUOiBUaW1lciBDb250cm9sIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgVUFSVF9SU0FfVENSX1NXSVRDSCAoMSA8PCAwKSAvKiBUaW1lciBvbiAqLworCisvKgorICogVGhlIFJTQSBEU1YvSUkgYm9hcmQgaGFzIHR3byBmaXhlZCBjbG9jayBmcmVxdWVuY2llcy4gIE9uZSBpcyB0aGUKKyAqIHN0YW5kYXJkIHJhdGUsIGFuZCB0aGUgb3RoZXIgaXMgOCB0aW1lcyBmYXN0ZXIuCisgKi8KKyNkZWZpbmUgU0VSSUFMX1JTQV9CQVVEX0JBU0UgKDkyMTYwMCkKKyNkZWZpbmUgU0VSSUFMX1JTQV9CQVVEX0JBU0VfTE8gKFNFUklBTF9SU0FfQkFVRF9CQVNFIC8gOCkKKworLyoKKyAqIEV4dHJhIHNlcmlhbCByZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIGludGVybmFsIFVBUlRzCisgKiBpbiBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKi8KKyNkZWZpbmUgVUFSVF9PTUFQX01EUjEJCTB4MDgJLyogTW9kZSBkZWZpbml0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfT01BUF9NRFIyCQkweDA5CS8qIE1vZGUgZGVmaW5pdGlvbiByZWdpc3RlciAyICovCisjZGVmaW5lIFVBUlRfT01BUF9TQ1IJCTB4MTAJLyogU3VwcGxlbWVudGFyeSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfT01BUF9TU1IJCTB4MTEJLyogU3VwcGxlbWVudGFyeSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9PTUFQX0VCTFIJCTB4MTIJLyogQk9GIGxlbmd0aCByZWdpc3RlciAqLworI2RlZmluZSBVQVJUX09NQVBfT1NDXzEyTV9TRUwJMHgxMwkvKiBPTUFQMTUxMCAxMk1IeiBvc2Mgc2VsZWN0ICovCisjZGVmaW5lIFVBUlRfT01BUF9NVkVSCQkweDE0CS8qIE1vZHVsZSB2ZXJzaW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfT01BUF9TWVNDCQkweDE1CS8qIFN5c3RlbSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfT01BUF9TWVNTCQkweDE2CS8qIFN5c3RlbSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9PTUFQX1dFUgkJMHgxNwkvKiBXYWtlLXVwIGVuYWJsZSByZWdpc3RlciAqLworCisvKgorICogVGhlc2UgYXJlIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIE1EUjEgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBVQVJUX09NQVBfTURSMV8xNlhfTU9ERQkJMHgwMAkvKiBVQVJUIDE2eCBtb2RlICovCisjZGVmaW5lIFVBUlRfT01BUF9NRFIxX1NJUl9NT0RFCQkweDAxCS8qIFNJUiBtb2RlICovCisjZGVmaW5lIFVBUlRfT01BUF9NRFIxXzE2WF9BQkFVRF9NT0RFCTB4MDIJLyogVUFSVCAxNnggYXV0by1iYXVkICovCisjZGVmaW5lIFVBUlRfT01BUF9NRFIxXzEzWF9NT0RFCQkweDAzCS8qIFVBUlQgMTN4IG1vZGUgKi8KKyNkZWZpbmUgVUFSVF9PTUFQX01EUjFfTUlSX01PREUJCTB4MDQJLyogTUlSIG1vZGUgKi8KKyNkZWZpbmUgVUFSVF9PTUFQX01EUjFfRklSX01PREUJCTB4MDUJLyogRklSIG1vZGUgKi8KKyNkZWZpbmUgVUFSVF9PTUFQX01EUjFfQ0lSX01PREUJCTB4MDYJLyogQ0lSIG1vZGUgKi8KKyNkZWZpbmUgVUFSVF9PTUFQX01EUjFfRElTQUJMRQkJMHgwNwkvKiBEaXNhYmxlIChkZWZhdWx0IHN0YXRlKSAqLworCisjZW5kaWYgLyogX0xJTlVYX1NFUklBTF9SRUdfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlcmlvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxMjdlMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VyaW8uaApAQCAtMCwwICsxLDgwIEBACisjaWZuZGVmIF9TRVJJT19ICisjZGVmaW5lIF9TRVJJT19ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMiBWb2p0ZWNoIFBhdmxpaworKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBTUElPQ1NUWVBFCV9JT1coJ3EnLCAweDAxLCB1bnNpZ25lZCBsb25nKQorCisKKy8qCisgKiBiaXQgbWFza3MgZm9yIHVzZSBpbiAiaW50ZXJydXB0IiBmbGFncyAoM3JkIGFyZ3VtZW50KQorICovCisjZGVmaW5lIFNFUklPX1RJTUVPVVQJMQorI2RlZmluZSBTRVJJT19QQVJJVFkJMgorI2RlZmluZSBTRVJJT19GUkFNRQk0CisKKy8qCisgKiBTZXJpbyB0eXBlcworICovCisjZGVmaW5lIFNFUklPX1hUCTB4MDAKKyNkZWZpbmUgU0VSSU9fODA0MgkweDAxCisjZGVmaW5lIFNFUklPX1JTMjMyCTB4MDIKKyNkZWZpbmUgU0VSSU9fSElMX01MQwkweDAzCisjZGVmaW5lIFNFUklPX1BTX1BTVEhSVQkweDA1CisjZGVmaW5lIFNFUklPXzgwNDJfWEwJMHgwNgorCisvKgorICogU2VyaW8gcHJvdG9jb2xzCisgKi8KKyNkZWZpbmUgU0VSSU9fVU5LTk9XTgkweDAwCisjZGVmaW5lIFNFUklPX01TQwkweDAxCisjZGVmaW5lIFNFUklPX1NVTgkweDAyCisjZGVmaW5lIFNFUklPX01TCTB4MDMKKyNkZWZpbmUgU0VSSU9fTVAJMHgwNAorI2RlZmluZSBTRVJJT19NWgkweDA1CisjZGVmaW5lIFNFUklPX01aUAkweDA2CisjZGVmaW5lIFNFUklPX01aUFAJMHgwNworI2RlZmluZSBTRVJJT19WU1hYWEFBCTB4MDgKKyNkZWZpbmUgU0VSSU9fU1VOS0JECTB4MTAKKyNkZWZpbmUgU0VSSU9fV0FSUklPUgkweDE4CisjZGVmaW5lIFNFUklPX1NQQUNFT1JCCTB4MTkKKyNkZWZpbmUgU0VSSU9fTUFHRUxMQU4JMHgxYQorI2RlZmluZSBTRVJJT19TUEFDRUJBTEwJMHgxYgorI2RlZmluZSBTRVJJT19HVU5aRQkweDFjCisjZGVmaW5lIFNFUklPX0lGT1JDRQkweDFkCisjZGVmaW5lIFNFUklPX1NUSU5HRVIJMHgxZQorI2RlZmluZSBTRVJJT19ORVdUT04JMHgxZgorI2RlZmluZSBTRVJJT19TVE9XQVdBWQkweDIwCisjZGVmaW5lIFNFUklPX0gzNjAwCTB4MjEKKyNkZWZpbmUgU0VSSU9fUFMyU0VSCTB4MjIKKyNkZWZpbmUgU0VSSU9fVFdJREtCRAkweDIzCisjZGVmaW5lIFNFUklPX1RXSURKT1kJMHgyNAorI2RlZmluZSBTRVJJT19ISUwJMHgyNQorI2RlZmluZSBTRVJJT19TTkVTMjMyCTB4MjYKKyNkZWZpbmUgU0VSSU9fU0VNVEVDSAkweDI3CisjZGVmaW5lIFNFUklPX0xLS0JECTB4MjgKKyNkZWZpbmUgU0VSSU9fRUxPCTB4MjkKKyNkZWZpbmUgU0VSSU9fTUlDUk9UT1VDSAkweDMwCisjZGVmaW5lIFNFUklPX1BFTk1PVU5UCTB4MzEKKyNkZWZpbmUgU0VSSU9fVE9VQ0hSSUdIVAkweDMyCisjZGVmaW5lIFNFUklPX1RPVUNIV0lOCTB4MzMKKyNkZWZpbmUgU0VSSU9fVEFPU0VWTQkweDM0CisjZGVmaW5lIFNFUklPX0ZVSklUU1UJMHgzNQorI2RlZmluZSBTRVJJT19aSEVOSFVBCTB4MzYKKyNkZWZpbmUgU0VSSU9fSU5FWElPCTB4MzcKKyNkZWZpbmUgU0VSSU9fVE9VQ0hJVDIxMwkweDM4CisjZGVmaW5lIFNFUklPX1c4MDAxCTB4MzkKKyNkZWZpbmUgU0VSSU9fRFlOQVBSTwkweDNhCisjZGVmaW5lIFNFUklPX0hBTVBTSElSRQkweDNiCisjZGVmaW5lIFNFUklPX1BTMk1VTFQJMHgzYworI2RlZmluZSBTRVJJT19UU0M0MAkweDNkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zaG0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2htLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5Y2VmMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2htLmgKQEAgLTAsMCArMSw3NSBAQAorI2lmbmRlZiBfTElOVVhfU0hNX0hfCisjZGVmaW5lIF9MSU5VWF9TSE1fSF8KKworI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qCisgKiBTSE1NQVgsIFNITU1OSSBhbmQgU0hNQUxMIGFyZSB1cHBlciBsaW1pdHMgYXJlIGRlZmF1bHRzIHdoaWNoIGNhbgorICogYmUgaW5jcmVhc2VkIGJ5IHN5c2N0bAorICovCisKKyNkZWZpbmUgU0hNTUFYIDB4MjAwMDAwMAkJIC8qIG1heCBzaGFyZWQgc2VnIHNpemUgKGJ5dGVzKSAqLworI2RlZmluZSBTSE1NSU4gMQkJCSAvKiBtaW4gc2hhcmVkIHNlZyBzaXplIChieXRlcykgKi8KKyNkZWZpbmUgU0hNTU5JIDQwOTYJCQkgLyogbWF4IG51bSBvZiBzZWdzIHN5c3RlbSB3aWRlICovCisjZGVmaW5lIFNITUFMTCAoU0hNTUFYL2dldHBhZ2VzaXplKCkqKFNITU1OSS8xNikpCisjZGVmaW5lIFNITVNFRyBTSE1NTkkJCQkgLyogbWF4IHNoYXJlZCBzZWdzIHBlciBwcm9jZXNzICovCisKKworLyogT2Jzb2xldGUsIHVzZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYW5kIGxpYmM1IGNvbXBpbGVzICovCitzdHJ1Y3Qgc2htaWRfZHMgeworCXN0cnVjdCBpcGNfcGVybQkJc2htX3Blcm07CS8qIG9wZXJhdGlvbiBwZXJtcyAqLworCWludAkJCXNobV9zZWdzejsJLyogc2l6ZSBvZiBzZWdtZW50IChieXRlcykgKi8KKwlfX2tlcm5lbF90aW1lX3QJCXNobV9hdGltZTsJLyogbGFzdCBhdHRhY2ggdGltZSAqLworCV9fa2VybmVsX3RpbWVfdAkJc2htX2R0aW1lOwkvKiBsYXN0IGRldGFjaCB0aW1lICovCisJX19rZXJuZWxfdGltZV90CQlzaG1fY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKwlfX2tlcm5lbF9pcGNfcGlkX3QJc2htX2NwaWQ7CS8qIHBpZCBvZiBjcmVhdG9yICovCisJX19rZXJuZWxfaXBjX3BpZF90CXNobV9scGlkOwkvKiBwaWQgb2YgbGFzdCBvcGVyYXRvciAqLworCXVuc2lnbmVkIHNob3J0CQlzaG1fbmF0dGNoOwkvKiBuby4gb2YgY3VycmVudCBhdHRhY2hlcyAqLworCXVuc2lnbmVkIHNob3J0IAkJc2htX3VudXNlZDsJLyogY29tcGF0aWJpbGl0eSAqLworCXZvaWQgCQkJKnNobV91bnVzZWQyOwkvKiBkaXR0byAtIHVzZWQgYnkgRElQQyAqLworCXZvaWQJCQkqc2htX3VudXNlZDM7CS8qIHVudXNlZCAqLworfTsKKworLyogSW5jbHVkZSB0aGUgZGVmaW5pdGlvbiBvZiBzaG1pZDY0X2RzIGFuZCBzaG1pbmZvNjQgKi8KKyNpbmNsdWRlIDxhc20vc2htYnVmLmg+CisKKy8qIHBlcm1pc3Npb24gZmxhZyBmb3Igc2htZ2V0ICovCisjZGVmaW5lIFNITV9SCQkwNDAwCS8qIG9yIFNfSVJVR08gZnJvbSA8bGludXgvc3RhdC5oPiAqLworI2RlZmluZSBTSE1fVwkJMDIwMAkvKiBvciBTX0lXVUdPIGZyb20gPGxpbnV4L3N0YXQuaD4gKi8KKworLyogbW9kZSBmb3IgYXR0YWNoICovCisjZGVmaW5lCVNITV9SRE9OTFkJMDEwMDAwCS8qIHJlYWQtb25seSBhY2Nlc3MgKi8KKyNkZWZpbmUJU0hNX1JORAkJMDIwMDAwCS8qIHJvdW5kIGF0dGFjaCBhZGRyZXNzIHRvIFNITUxCQSBib3VuZGFyeSAqLworI2RlZmluZQlTSE1fUkVNQVAJMDQwMDAwCS8qIHRha2Utb3ZlciByZWdpb24gb24gYXR0YWNoICovCisjZGVmaW5lCVNITV9FWEVDCTAxMDAwMDAJLyogZXhlY3V0aW9uIGFjY2VzcyAqLworCisvKiBzdXBlciB1c2VyIHNobWN0bCBjb21tYW5kcyAqLworI2RlZmluZSBTSE1fTE9DSyAJMTEKKyNkZWZpbmUgU0hNX1VOTE9DSyAJMTIKKworLyogaXBjcyBjdGwgY29tbWFuZHMgKi8KKyNkZWZpbmUgU0hNX1NUQVQgCTEzCisjZGVmaW5lIFNITV9JTkZPIAkxNAorCisvKiBPYnNvbGV0ZSwgdXNlZCBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworc3RydWN0CXNobWluZm8geworCWludCBzaG1tYXg7CisJaW50IHNobW1pbjsKKwlpbnQgc2htbW5pOworCWludCBzaG1zZWc7CisJaW50IHNobWFsbDsKK307CisKK3N0cnVjdCBzaG1faW5mbyB7CisJaW50IHVzZWRfaWRzOworCXVuc2lnbmVkIGxvbmcgc2htX3RvdDsJLyogdG90YWwgYWxsb2NhdGVkIHNobSAqLworCXVuc2lnbmVkIGxvbmcgc2htX3JzczsJLyogdG90YWwgcmVzaWRlbnQgc2htICovCisJdW5zaWduZWQgbG9uZyBzaG1fc3dwOwkvKiB0b3RhbCBzd2FwcGVkIHNobSAqLworCXVuc2lnbmVkIGxvbmcgc3dhcF9hdHRlbXB0czsKKwl1bnNpZ25lZCBsb25nIHN3YXBfc3VjY2Vzc2VzOworfTsKKworCisjZW5kaWYgLyogX0xJTlVYX1NITV9IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zaWduYWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiNjlkOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9MSU5VWF9TSUdOQUxfSAorI2RlZmluZSBfTElOVVhfU0lHTkFMX0gKKworI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KKyNpbmNsdWRlIDxhc20vc2lnaW5mby5oPgorCisKKyNlbmRpZiAvKiBfTElOVVhfU0lHTkFMX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2lnbmFsZmQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2lnbmFsZmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGU2ODlhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zaWduYWxmZC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiAgaW5jbHVkZS9saW51eC9zaWduYWxmZC5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9TSUdOQUxGRF9ICisjZGVmaW5lIF9MSU5VWF9TSUdOQUxGRF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorLyogRm9yIE9fQ0xPRVhFQyBhbmQgT19OT05CTE9DSyAqLworI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisKKy8qIEZsYWdzIGZvciBzaWduYWxmZDQuICAqLworI2RlZmluZSBTRkRfQ0xPRVhFQyBPX0NMT0VYRUMKKyNkZWZpbmUgU0ZEX05PTkJMT0NLIE9fTk9OQkxPQ0sKKworc3RydWN0IHNpZ25hbGZkX3NpZ2luZm8geworCV9fdTMyIHNzaV9zaWdubzsKKwlfX3MzMiBzc2lfZXJybm87CisJX19zMzIgc3NpX2NvZGU7CisJX191MzIgc3NpX3BpZDsKKwlfX3UzMiBzc2lfdWlkOworCV9fczMyIHNzaV9mZDsKKwlfX3UzMiBzc2lfdGlkOworCV9fdTMyIHNzaV9iYW5kOworCV9fdTMyIHNzaV9vdmVycnVuOworCV9fdTMyIHNzaV90cmFwbm87CisJX19zMzIgc3NpX3N0YXR1czsKKwlfX3MzMiBzc2lfaW50OworCV9fdTY0IHNzaV9wdHI7CisJX191NjQgc3NpX3V0aW1lOworCV9fdTY0IHNzaV9zdGltZTsKKwlfX3U2NCBzc2lfYWRkcjsKKwlfX3UxNiBzc2lfYWRkcl9sc2I7CisKKwkvKgorCSAqIFBhZCBzdHJjdHVyZSB0byAxMjggYnl0ZXMuIFJlbWVtYmVyIHRvIHVwZGF0ZSB0aGUKKwkgKiBwYWQgc2l6ZSB3aGVuIHlvdSBhZGQgbmV3IG1lbWJlcnMuIFdlIHVzZSBhIGZpeGVkCisJICogc2l6ZSBzdHJ1Y3R1cmUgdG8gYXZvaWQgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aXRoCisJICogZnV0dXJlIHZlcnNpb25zLCBhbmQgd2UgbGVhdmUgZXh0cmEgc3BhY2UgZm9yIGFkZGl0aW9uYWwKKwkgKiBtZW1iZXJzLiBXZSB1c2UgZml4ZWQgc2l6ZSBtZW1iZXJzIGJlY2F1c2UgdGhpcyBzdHJjdHVyZQorCSAqIGNvbWVzIG91dCBvZiBhIHJlYWQoMikgYW5kIHdlIHJlYWxseSBkb24ndCB3YW50IHRvIGhhdmUKKwkgKiBhIGNvbXBhdCBvbiByZWFkKDIpLgorCSAqLworCV9fdTggX19wYWRbNDZdOworfTsKKworCisKKyNlbmRpZiAvKiBfTElOVVhfU0lHTkFMRkRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zbm1wLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NubXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTY1NTdhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zbm1wLmgKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgTUlCcworICoKKyAqIEF1dGhvcjogSGlkZWFraSBZT1NISUZVSkkgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorICovCisKKyNpZm5kZWYgX0xJTlVYX1NOTVBfSAorI2RlZmluZSBfTElOVVhfU05NUF9ICisKKy8qIGlwc3RhdHMgbWliIGRlZmluaXRpb25zICovCisvKgorICogUkZDIDEyMTM6ICBNSUItSUkKKyAqIFJGQyAyMDExICh1cGRhdGVzIDEyMTMpOiAgU05NUHYyLU1JQi1JUAorICogUkZDIDI4NjM6ICBJbnRlcmZhY2VzIEdyb3VwIE1JQgorICogUkZDIDI0NjU6ICBJUHY2IE1JQjogR2VuZXJhbCBHcm91cAorICogZHJhZnQtaWV0Zi1pcHY2LXJmYzIwMTEtdXBkYXRlLTEwLnR4dDogTUlCIGZvciBJUDogSVAgU3RhdGlzdGljcyBUYWJsZXMKKyAqLworZW51bQoreworCUlQU1RBVFNfTUlCX05VTSA9IDAsCisJSVBTVEFUU19NSUJfSU5QS1RTLAkJCS8qIEluUmVjZWl2ZXMgKi8KKwlJUFNUQVRTX01JQl9JTkhEUkVSUk9SUywJCS8qIEluSGRyRXJyb3JzICovCisJSVBTVEFUU19NSUJfSU5UT09CSUdFUlJPUlMsCQkvKiBJblRvb0JpZ0Vycm9ycyAqLworCUlQU1RBVFNfTUlCX0lOTk9ST1VURVMsCQkJLyogSW5Ob1JvdXRlcyAqLworCUlQU1RBVFNfTUlCX0lOQUREUkVSUk9SUywJCS8qIEluQWRkckVycm9ycyAqLworCUlQU1RBVFNfTUlCX0lOVU5LTk9XTlBST1RPUywJCS8qIEluVW5rbm93blByb3RvcyAqLworCUlQU1RBVFNfTUlCX0lOVFJVTkNBVEVEUEtUUywJCS8qIEluVHJ1bmNhdGVkUGt0cyAqLworCUlQU1RBVFNfTUlCX0lORElTQ0FSRFMsCQkJLyogSW5EaXNjYXJkcyAqLworCUlQU1RBVFNfTUlCX0lOREVMSVZFUlMsCQkJLyogSW5EZWxpdmVycyAqLworCUlQU1RBVFNfTUlCX09VVEZPUldEQVRBR1JBTVMsCQkvKiBPdXRGb3J3RGF0YWdyYW1zICovCisJSVBTVEFUU19NSUJfT1VUUEtUUywJCQkvKiBPdXRSZXF1ZXN0cyAqLworCUlQU1RBVFNfTUlCX09VVERJU0NBUkRTLAkJLyogT3V0RGlzY2FyZHMgKi8KKwlJUFNUQVRTX01JQl9PVVROT1JPVVRFUywJCS8qIE91dE5vUm91dGVzICovCisJSVBTVEFUU19NSUJfUkVBU01USU1FT1VULAkJLyogUmVhc21UaW1lb3V0ICovCisJSVBTVEFUU19NSUJfUkVBU01SRVFEUywJCQkvKiBSZWFzbVJlcWRzICovCisJSVBTVEFUU19NSUJfUkVBU01PS1MsCQkJLyogUmVhc21PS3MgKi8KKwlJUFNUQVRTX01JQl9SRUFTTUZBSUxTLAkJCS8qIFJlYXNtRmFpbHMgKi8KKwlJUFNUQVRTX01JQl9GUkFHT0tTLAkJCS8qIEZyYWdPS3MgKi8KKwlJUFNUQVRTX01JQl9GUkFHRkFJTFMsCQkJLyogRnJhZ0ZhaWxzICovCisJSVBTVEFUU19NSUJfRlJBR0NSRUFURVMsCQkvKiBGcmFnQ3JlYXRlcyAqLworCUlQU1RBVFNfTUlCX0lOTUNBU1RQS1RTLAkJLyogSW5NY2FzdFBrdHMgKi8KKwlJUFNUQVRTX01JQl9PVVRNQ0FTVFBLVFMsCQkvKiBPdXRNY2FzdFBrdHMgKi8KKwlJUFNUQVRTX01JQl9JTkJDQVNUUEtUUywJCS8qIEluQmNhc3RQa3RzICovCisJSVBTVEFUU19NSUJfT1VUQkNBU1RQS1RTLAkJLyogT3V0QmNhc3RQa3RzICovCisJSVBTVEFUU19NSUJfSU5PQ1RFVFMsCQkJLyogSW5PY3RldHMgKi8KKwlJUFNUQVRTX01JQl9PVVRPQ1RFVFMsCQkJLyogT3V0T2N0ZXRzICovCisJSVBTVEFUU19NSUJfSU5NQ0FTVE9DVEVUUywJCS8qIEluTWNhc3RPY3RldHMgKi8KKwlJUFNUQVRTX01JQl9PVVRNQ0FTVE9DVEVUUywJCS8qIE91dE1jYXN0T2N0ZXRzICovCisJSVBTVEFUU19NSUJfSU5CQ0FTVE9DVEVUUywJCS8qIEluQmNhc3RPY3RldHMgKi8KKwlJUFNUQVRTX01JQl9PVVRCQ0FTVE9DVEVUUywJCS8qIE91dEJjYXN0T2N0ZXRzICovCisJX19JUFNUQVRTX01JQl9NQVgKK307CisKKy8qIGljbXAgbWliIGRlZmluaXRpb25zICovCisvKgorICogUkZDIDEyMTM6ICBNSUItSUkgSUNNUCBHcm91cAorICogUkZDIDIwMTEgKHVwZGF0ZXMgMTIxMyk6ICBTTk1QdjIgTUlCIGZvciBJUDogSUNNUCBncm91cAorICovCitlbnVtCit7CisJSUNNUF9NSUJfTlVNID0gMCwKKwlJQ01QX01JQl9JTk1TR1MsCQkJLyogSW5Nc2dzICovCisJSUNNUF9NSUJfSU5FUlJPUlMsCQkJLyogSW5FcnJvcnMgKi8KKwlJQ01QX01JQl9JTkRFU1RVTlJFQUNIUywJCS8qIEluRGVzdFVucmVhY2hzICovCisJSUNNUF9NSUJfSU5USU1FRVhDRFMsCQkJLyogSW5UaW1lRXhjZHMgKi8KKwlJQ01QX01JQl9JTlBBUk1QUk9CUywJCQkvKiBJblBhcm1Qcm9icyAqLworCUlDTVBfTUlCX0lOU1JDUVVFTkNIUywJCQkvKiBJblNyY1F1ZW5jaHMgKi8KKwlJQ01QX01JQl9JTlJFRElSRUNUUywJCQkvKiBJblJlZGlyZWN0cyAqLworCUlDTVBfTUlCX0lORUNIT1MsCQkJLyogSW5FY2hvcyAqLworCUlDTVBfTUlCX0lORUNIT1JFUFMsCQkJLyogSW5FY2hvUmVwcyAqLworCUlDTVBfTUlCX0lOVElNRVNUQU1QUywJCQkvKiBJblRpbWVzdGFtcHMgKi8KKwlJQ01QX01JQl9JTlRJTUVTVEFNUFJFUFMsCQkvKiBJblRpbWVzdGFtcFJlcHMgKi8KKwlJQ01QX01JQl9JTkFERFJNQVNLUywJCQkvKiBJbkFkZHJNYXNrcyAqLworCUlDTVBfTUlCX0lOQUREUk1BU0tSRVBTLAkJLyogSW5BZGRyTWFza1JlcHMgKi8KKwlJQ01QX01JQl9PVVRNU0dTLAkJCS8qIE91dE1zZ3MgKi8KKwlJQ01QX01JQl9PVVRFUlJPUlMsCQkJLyogT3V0RXJyb3JzICovCisJSUNNUF9NSUJfT1VUREVTVFVOUkVBQ0hTLAkJLyogT3V0RGVzdFVucmVhY2hzICovCisJSUNNUF9NSUJfT1VUVElNRUVYQ0RTLAkJCS8qIE91dFRpbWVFeGNkcyAqLworCUlDTVBfTUlCX09VVFBBUk1QUk9CUywJCQkvKiBPdXRQYXJtUHJvYnMgKi8KKwlJQ01QX01JQl9PVVRTUkNRVUVOQ0hTLAkJCS8qIE91dFNyY1F1ZW5jaHMgKi8KKwlJQ01QX01JQl9PVVRSRURJUkVDVFMsCQkJLyogT3V0UmVkaXJlY3RzICovCisJSUNNUF9NSUJfT1VURUNIT1MsCQkJLyogT3V0RWNob3MgKi8KKwlJQ01QX01JQl9PVVRFQ0hPUkVQUywJCQkvKiBPdXRFY2hvUmVwcyAqLworCUlDTVBfTUlCX09VVFRJTUVTVEFNUFMsCQkJLyogT3V0VGltZXN0YW1wcyAqLworCUlDTVBfTUlCX09VVFRJTUVTVEFNUFJFUFMsCQkvKiBPdXRUaW1lc3RhbXBSZXBzICovCisJSUNNUF9NSUJfT1VUQUREUk1BU0tTLAkJCS8qIE91dEFkZHJNYXNrcyAqLworCUlDTVBfTUlCX09VVEFERFJNQVNLUkVQUywJCS8qIE91dEFkZHJNYXNrUmVwcyAqLworCV9fSUNNUF9NSUJfTUFYCit9OworCisjZGVmaW5lIF9fSUNNUE1TR19NSUJfTUFYIDUxMgkvKiBPdXQrSW4gZm9yIGFsbCA4LWJpdCBJQ01QIHR5cGVzICovCisKKy8qIGljbXA2IG1pYiBkZWZpbml0aW9ucyAqLworLyoKKyAqIFJGQyAyNDY2OiAgSUNNUHY2LU1JQgorICovCitlbnVtCit7CisJSUNNUDZfTUlCX05VTSA9IDAsCisJSUNNUDZfTUlCX0lOTVNHUywJCQkvKiBJbk1zZ3MgKi8KKwlJQ01QNl9NSUJfSU5FUlJPUlMsCQkJLyogSW5FcnJvcnMgKi8KKwlJQ01QNl9NSUJfT1VUTVNHUywJCQkvKiBPdXRNc2dzICovCisJSUNNUDZfTUlCX09VVEVSUk9SUywJCQkvKiBPdXRFcnJvcnMgKi8KKwlfX0lDTVA2X01JQl9NQVgKK307CisKKyNkZWZpbmUgX19JQ01QNk1TR19NSUJfTUFYIDUxMiAvKiBPdXQrSW4gZm9yIGFsbCA4LWJpdCBJQ01QdjYgdHlwZXMgKi8KKworLyogdGNwIG1pYiBkZWZpbml0aW9ucyAqLworLyoKKyAqIFJGQyAxMjEzOiAgTUlCLUlJIFRDUCBncm91cAorICogUkZDIDIwMTIgKHVwZGF0ZXMgMTIxMyk6ICBTTk1QdjItTUlCLVRDUAorICovCitlbnVtCit7CisJVENQX01JQl9OVU0gPSAwLAorCVRDUF9NSUJfUlRPQUxHT1JJVEhNLAkJCS8qIFJ0b0FsZ29yaXRobSAqLworCVRDUF9NSUJfUlRPTUlOLAkJCQkvKiBSdG9NaW4gKi8KKwlUQ1BfTUlCX1JUT01BWCwJCQkJLyogUnRvTWF4ICovCisJVENQX01JQl9NQVhDT05OLAkJCS8qIE1heENvbm4gKi8KKwlUQ1BfTUlCX0FDVElWRU9QRU5TLAkJCS8qIEFjdGl2ZU9wZW5zICovCisJVENQX01JQl9QQVNTSVZFT1BFTlMsCQkJLyogUGFzc2l2ZU9wZW5zICovCisJVENQX01JQl9BVFRFTVBURkFJTFMsCQkJLyogQXR0ZW1wdEZhaWxzICovCisJVENQX01JQl9FU1RBQlJFU0VUUywJCQkvKiBFc3RhYlJlc2V0cyAqLworCVRDUF9NSUJfQ1VSUkVTVEFCLAkJCS8qIEN1cnJFc3RhYiAqLworCVRDUF9NSUJfSU5TRUdTLAkJCQkvKiBJblNlZ3MgKi8KKwlUQ1BfTUlCX09VVFNFR1MsCQkJLyogT3V0U2VncyAqLworCVRDUF9NSUJfUkVUUkFOU1NFR1MsCQkJLyogUmV0cmFuc1NlZ3MgKi8KKwlUQ1BfTUlCX0lORVJSUywJCQkJLyogSW5FcnJzICovCisJVENQX01JQl9PVVRSU1RTLAkJCS8qIE91dFJzdHMgKi8KKwlfX1RDUF9NSUJfTUFYCit9OworCisvKiB1ZHAgbWliIGRlZmluaXRpb25zICovCisvKgorICogUkZDIDEyMTM6ICBNSUItSUkgVURQIGdyb3VwCisgKiBSRkMgMjAxMyAodXBkYXRlcyAxMjEzKTogIFNOTVB2Mi1NSUItVURQCisgKi8KK2VudW0KK3sKKwlVRFBfTUlCX05VTSA9IDAsCisJVURQX01JQl9JTkRBVEFHUkFNUywJCQkvKiBJbkRhdGFncmFtcyAqLworCVVEUF9NSUJfTk9QT1JUUywJCQkvKiBOb1BvcnRzICovCisJVURQX01JQl9JTkVSUk9SUywJCQkvKiBJbkVycm9ycyAqLworCVVEUF9NSUJfT1VUREFUQUdSQU1TLAkJCS8qIE91dERhdGFncmFtcyAqLworCVVEUF9NSUJfUkNWQlVGRVJST1JTLAkJCS8qIFJjdmJ1ZkVycm9ycyAqLworCVVEUF9NSUJfU05EQlVGRVJST1JTLAkJCS8qIFNuZGJ1ZkVycm9ycyAqLworCV9fVURQX01JQl9NQVgKK307CisKKy8qIGxpbnV4IG1pYiBkZWZpbml0aW9ucyAqLworZW51bQoreworCUxJTlVYX01JQl9OVU0gPSAwLAorCUxJTlVYX01JQl9TWU5DT09LSUVTU0VOVCwJCS8qIFN5bmNvb2tpZXNTZW50ICovCisJTElOVVhfTUlCX1NZTkNPT0tJRVNSRUNWLAkJLyogU3luY29va2llc1JlY3YgKi8KKwlMSU5VWF9NSUJfU1lOQ09PS0lFU0ZBSUxFRCwJCS8qIFN5bmNvb2tpZXNGYWlsZWQgKi8KKwlMSU5VWF9NSUJfRU1CUllPTklDUlNUUywJCS8qIEVtYnJ5b25pY1JzdHMgKi8KKwlMSU5VWF9NSUJfUFJVTkVDQUxMRUQsCQkJLyogUHJ1bmVDYWxsZWQgKi8KKwlMSU5VWF9NSUJfUkNWUFJVTkVELAkJCS8qIFJjdlBydW5lZCAqLworCUxJTlVYX01JQl9PRk9QUlVORUQsCQkJLyogT2ZvUHJ1bmVkICovCisJTElOVVhfTUlCX09VVE9GV0lORE9XSUNNUFMsCQkvKiBPdXRPZldpbmRvd0ljbXBzICovCisJTElOVVhfTUlCX0xPQ0tEUk9QUEVESUNNUFMsCQkvKiBMb2NrRHJvcHBlZEljbXBzICovCisJTElOVVhfTUlCX0FSUEZJTFRFUiwJCQkvKiBBcnBGaWx0ZXIgKi8KKwlMSU5VWF9NSUJfVElNRVdBSVRFRCwJCQkvKiBUaW1lV2FpdGVkICovCisJTElOVVhfTUlCX1RJTUVXQUlUUkVDWUNMRUQsCQkvKiBUaW1lV2FpdFJlY3ljbGVkICovCisJTElOVVhfTUlCX1RJTUVXQUlUS0lMTEVELAkJLyogVGltZVdhaXRLaWxsZWQgKi8KKwlMSU5VWF9NSUJfUEFXU1BBU1NJVkVSRUpFQ1RFRCwJCS8qIFBBV1NQYXNzaXZlUmVqZWN0ZWQgKi8KKwlMSU5VWF9NSUJfUEFXU0FDVElWRVJFSkVDVEVELAkJLyogUEFXU0FjdGl2ZVJlamVjdGVkICovCisJTElOVVhfTUlCX1BBV1NFU1RBQlJFSkVDVEVELAkJLyogUEFXU0VzdGFiUmVqZWN0ZWQgKi8KKwlMSU5VWF9NSUJfREVMQVlFREFDS1MsCQkJLyogRGVsYXllZEFDS3MgKi8KKwlMSU5VWF9NSUJfREVMQVlFREFDS0xPQ0tFRCwJCS8qIERlbGF5ZWRBQ0tMb2NrZWQgKi8KKwlMSU5VWF9NSUJfREVMQVlFREFDS0xPU1QsCQkvKiBEZWxheWVkQUNLTG9zdCAqLworCUxJTlVYX01JQl9MSVNURU5PVkVSRkxPV1MsCQkvKiBMaXN0ZW5PdmVyZmxvd3MgKi8KKwlMSU5VWF9NSUJfTElTVEVORFJPUFMsCQkJLyogTGlzdGVuRHJvcHMgKi8KKwlMSU5VWF9NSUJfVENQUFJFUVVFVUVELAkJCS8qIFRDUFByZXF1ZXVlZCAqLworCUxJTlVYX01JQl9UQ1BESVJFQ1RDT1BZRlJPTUJBQ0tMT0csCS8qIFRDUERpcmVjdENvcHlGcm9tQmFja2xvZyAqLworCUxJTlVYX01JQl9UQ1BESVJFQ1RDT1BZRlJPTVBSRVFVRVVFLAkvKiBUQ1BEaXJlY3RDb3B5RnJvbVByZXF1ZXVlICovCisJTElOVVhfTUlCX1RDUFBSRVFVRVVFRFJPUFBFRCwJCS8qIFRDUFByZXF1ZXVlRHJvcHBlZCAqLworCUxJTlVYX01JQl9UQ1BIUEhJVFMsCQkJLyogVENQSFBIaXRzICovCisJTElOVVhfTUlCX1RDUEhQSElUU1RPVVNFUiwJCS8qIFRDUEhQSGl0c1RvVXNlciAqLworCUxJTlVYX01JQl9UQ1BQVVJFQUNLUywJCQkvKiBUQ1BQdXJlQWNrcyAqLworCUxJTlVYX01JQl9UQ1BIUEFDS1MsCQkJLyogVENQSFBBY2tzICovCisJTElOVVhfTUlCX1RDUFJFTk9SRUNPVkVSWSwJCS8qIFRDUFJlbm9SZWNvdmVyeSAqLworCUxJTlVYX01JQl9UQ1BTQUNLUkVDT1ZFUlksCQkvKiBUQ1BTYWNrUmVjb3ZlcnkgKi8KKwlMSU5VWF9NSUJfVENQU0FDS1JFTkVHSU5HLAkJLyogVENQU0FDS1JlbmVnaW5nICovCisJTElOVVhfTUlCX1RDUEZBQ0tSRU9SREVSLAkJLyogVENQRkFDS1Jlb3JkZXIgKi8KKwlMSU5VWF9NSUJfVENQU0FDS1JFT1JERVIsCQkvKiBUQ1BTQUNLUmVvcmRlciAqLworCUxJTlVYX01JQl9UQ1BSRU5PUkVPUkRFUiwJCS8qIFRDUFJlbm9SZW9yZGVyICovCisJTElOVVhfTUlCX1RDUFRTUkVPUkRFUiwJCQkvKiBUQ1BUU1Jlb3JkZXIgKi8KKwlMSU5VWF9NSUJfVENQRlVMTFVORE8sCQkJLyogVENQRnVsbFVuZG8gKi8KKwlMSU5VWF9NSUJfVENQUEFSVElBTFVORE8sCQkvKiBUQ1BQYXJ0aWFsVW5kbyAqLworCUxJTlVYX01JQl9UQ1BEU0FDS1VORE8sCQkJLyogVENQRFNBQ0tVbmRvICovCisJTElOVVhfTUlCX1RDUExPU1NVTkRPLAkJCS8qIFRDUExvc3NVbmRvICovCisJTElOVVhfTUlCX1RDUExPU1MsCQkJLyogVENQTG9zcyAqLworCUxJTlVYX01JQl9UQ1BMT1NUUkVUUkFOU01JVCwJCS8qIFRDUExvc3RSZXRyYW5zbWl0ICovCisJTElOVVhfTUlCX1RDUFJFTk9GQUlMVVJFUywJCS8qIFRDUFJlbm9GYWlsdXJlcyAqLworCUxJTlVYX01JQl9UQ1BTQUNLRkFJTFVSRVMsCQkvKiBUQ1BTYWNrRmFpbHVyZXMgKi8KKwlMSU5VWF9NSUJfVENQTE9TU0ZBSUxVUkVTLAkJLyogVENQTG9zc0ZhaWx1cmVzICovCisJTElOVVhfTUlCX1RDUEZBU1RSRVRSQU5TLAkJLyogVENQRmFzdFJldHJhbnMgKi8KKwlMSU5VWF9NSUJfVENQRk9SV0FSRFJFVFJBTlMsCQkvKiBUQ1BGb3J3YXJkUmV0cmFucyAqLworCUxJTlVYX01JQl9UQ1BTTE9XU1RBUlRSRVRSQU5TLAkJLyogVENQU2xvd1N0YXJ0UmV0cmFucyAqLworCUxJTlVYX01JQl9UQ1BUSU1FT1VUUywJCQkvKiBUQ1BUaW1lb3V0cyAqLworCUxJTlVYX01JQl9UQ1BSRU5PUkVDT1ZFUllGQUlMLAkJLyogVENQUmVub1JlY292ZXJ5RmFpbCAqLworCUxJTlVYX01JQl9UQ1BTQUNLUkVDT1ZFUllGQUlMLAkJLyogVENQU2Fja1JlY292ZXJ5RmFpbCAqLworCUxJTlVYX01JQl9UQ1BTQ0hFRFVMRVJGQUlMRUQsCQkvKiBUQ1BTY2hlZHVsZXJGYWlsZWQgKi8KKwlMSU5VWF9NSUJfVENQUkNWQ09MTEFQU0VELAkJLyogVENQUmN2Q29sbGFwc2VkICovCisJTElOVVhfTUlCX1RDUERTQUNLT0xEU0VOVCwJCS8qIFRDUERTQUNLT2xkU2VudCAqLworCUxJTlVYX01JQl9UQ1BEU0FDS09GT1NFTlQsCQkvKiBUQ1BEU0FDS09mb1NlbnQgKi8KKwlMSU5VWF9NSUJfVENQRFNBQ0tSRUNWLAkJCS8qIFRDUERTQUNLUmVjdiAqLworCUxJTlVYX01JQl9UQ1BEU0FDS09GT1JFQ1YsCQkvKiBUQ1BEU0FDS09mb1JlY3YgKi8KKwlMSU5VWF9NSUJfVENQQUJPUlRPTlNZTiwJCS8qIFRDUEFib3J0T25TeW4gKi8KKwlMSU5VWF9NSUJfVENQQUJPUlRPTkRBVEEsCQkvKiBUQ1BBYm9ydE9uRGF0YSAqLworCUxJTlVYX01JQl9UQ1BBQk9SVE9OQ0xPU0UsCQkvKiBUQ1BBYm9ydE9uQ2xvc2UgKi8KKwlMSU5VWF9NSUJfVENQQUJPUlRPTk1FTU9SWSwJCS8qIFRDUEFib3J0T25NZW1vcnkgKi8KKwlMSU5VWF9NSUJfVENQQUJPUlRPTlRJTUVPVVQsCQkvKiBUQ1BBYm9ydE9uVGltZW91dCAqLworCUxJTlVYX01JQl9UQ1BBQk9SVE9OTElOR0VSLAkJLyogVENQQWJvcnRPbkxpbmdlciAqLworCUxJTlVYX01JQl9UQ1BBQk9SVEZBSUxFRCwJCS8qIFRDUEFib3J0RmFpbGVkICovCisJTElOVVhfTUlCX1RDUE1FTU9SWVBSRVNTVVJFUywJCS8qIFRDUE1lbW9yeVByZXNzdXJlcyAqLworCUxJTlVYX01JQl9UQ1BTQUNLRElTQ0FSRCwJCS8qIFRDUFNBQ0tEaXNjYXJkICovCisJTElOVVhfTUlCX1RDUERTQUNLSUdOT1JFRE9MRCwJCS8qIFRDUFNBQ0tJZ25vcmVkT2xkICovCisJTElOVVhfTUlCX1RDUERTQUNLSUdOT1JFRE5PVU5ETywJLyogVENQU0FDS0lnbm9yZWROb1VuZG8gKi8KKwlMSU5VWF9NSUJfVENQU1BVUklPVVNSVE9TLAkJLyogVENQU3B1cmlvdXNSVE9zICovCisJTElOVVhfTUlCX1RDUE1ENU5PVEZPVU5ELAkJLyogVENQTUQ1Tm90Rm91bmQgKi8KKwlMSU5VWF9NSUJfVENQTUQ1VU5FWFBFQ1RFRCwJCS8qIFRDUE1ENVVuZXhwZWN0ZWQgKi8KKwlMSU5VWF9NSUJfU0FDS1NISUZURUQsCisJTElOVVhfTUlCX1NBQ0tNRVJHRUQsCisJTElOVVhfTUlCX1NBQ0tTSElGVEZBTExCQUNLLAorCUxJTlVYX01JQl9UQ1BCQUNLTE9HRFJPUCwKKwlMSU5VWF9NSUJfVENQTUlOVFRMRFJPUCwgLyogUkZDIDUwODIgKi8KKwlMSU5VWF9NSUJfVENQREVGRVJBQ0NFUFREUk9QLAorCUxJTlVYX01JQl9JUFJQRklMVEVSLCAvKiBJUCBSZXZlcnNlIFBhdGggRmlsdGVyIChycF9maWx0ZXIpICovCisJTElOVVhfTUlCX1RDUFRJTUVXQUlUT1ZFUkZMT1csCQkvKiBUQ1BUaW1lV2FpdE92ZXJmbG93ICovCisJTElOVVhfTUlCX1RDUFJFUVFGVUxMRE9DT09LSUVTLAkJLyogVENQUmVxUUZ1bGxEb0Nvb2tpZXMgKi8KKwlMSU5VWF9NSUJfVENQUkVRUUZVTExEUk9QLAkJLyogVENQUmVxUUZ1bGxEcm9wICovCisJX19MSU5VWF9NSUJfTUFYCit9OworCisvKiBsaW51eCBYZnJtIG1pYiBkZWZpbml0aW9ucyAqLworZW51bQoreworCUxJTlVYX01JQl9YRlJNTlVNID0gMCwKKwlMSU5VWF9NSUJfWEZSTUlORVJST1IsCQkJLyogWGZybUluRXJyb3IgKi8KKwlMSU5VWF9NSUJfWEZSTUlOQlVGRkVSRVJST1IsCQkvKiBYZnJtSW5CdWZmZXJFcnJvciAqLworCUxJTlVYX01JQl9YRlJNSU5IRFJFUlJPUiwJCS8qIFhmcm1JbkhkckVycm9yICovCisJTElOVVhfTUlCX1hGUk1JTk5PU1RBVEVTLAkJLyogWGZybUluTm9TdGF0ZXMgKi8KKwlMSU5VWF9NSUJfWEZSTUlOU1RBVEVQUk9UT0VSUk9SLAkvKiBYZnJtSW5TdGF0ZVByb3RvRXJyb3IgKi8KKwlMSU5VWF9NSUJfWEZSTUlOU1RBVEVNT0RFRVJST1IsCQkvKiBYZnJtSW5TdGF0ZU1vZGVFcnJvciAqLworCUxJTlVYX01JQl9YRlJNSU5TVEFURVNFUUVSUk9SLAkJLyogWGZybUluU3RhdGVTZXFFcnJvciAqLworCUxJTlVYX01JQl9YRlJNSU5TVEFURUVYUElSRUQsCQkvKiBYZnJtSW5TdGF0ZUV4cGlyZWQgKi8KKwlMSU5VWF9NSUJfWEZSTUlOU1RBVEVNSVNNQVRDSCwJCS8qIFhmcm1JblN0YXRlTWlzbWF0Y2ggKi8KKwlMSU5VWF9NSUJfWEZSTUlOU1RBVEVJTlZBTElELAkJLyogWGZybUluU3RhdGVJbnZhbGlkICovCisJTElOVVhfTUlCX1hGUk1JTlRNUExNSVNNQVRDSCwJCS8qIFhmcm1JblRtcGxNaXNtYXRjaCAqLworCUxJTlVYX01JQl9YRlJNSU5OT1BPTFMsCQkJLyogWGZybUluTm9Qb2xzICovCisJTElOVVhfTUlCX1hGUk1JTlBPTEJMT0NLLAkJLyogWGZybUluUG9sQmxvY2sgKi8KKwlMSU5VWF9NSUJfWEZSTUlOUE9MRVJST1IsCQkvKiBYZnJtSW5Qb2xFcnJvciAqLworCUxJTlVYX01JQl9YRlJNT1VURVJST1IsCQkJLyogWGZybU91dEVycm9yICovCisJTElOVVhfTUlCX1hGUk1PVVRCVU5ETEVHRU5FUlJPUiwJLyogWGZybU91dEJ1bmRsZUdlbkVycm9yICovCisJTElOVVhfTUlCX1hGUk1PVVRCVU5ETEVDSEVDS0VSUk9SLAkvKiBYZnJtT3V0QnVuZGxlQ2hlY2tFcnJvciAqLworCUxJTlVYX01JQl9YRlJNT1VUTk9TVEFURVMsCQkvKiBYZnJtT3V0Tm9TdGF0ZXMgKi8KKwlMSU5VWF9NSUJfWEZSTU9VVFNUQVRFUFJPVE9FUlJPUiwJLyogWGZybU91dFN0YXRlUHJvdG9FcnJvciAqLworCUxJTlVYX01JQl9YRlJNT1VUU1RBVEVNT0RFRVJST1IsCS8qIFhmcm1PdXRTdGF0ZU1vZGVFcnJvciAqLworCUxJTlVYX01JQl9YRlJNT1VUU1RBVEVTRVFFUlJPUiwJCS8qIFhmcm1PdXRTdGF0ZVNlcUVycm9yICovCisJTElOVVhfTUlCX1hGUk1PVVRTVEFURUVYUElSRUQsCQkvKiBYZnJtT3V0U3RhdGVFeHBpcmVkICovCisJTElOVVhfTUlCX1hGUk1PVVRQT0xCTE9DSywJCS8qIFhmcm1PdXRQb2xCbG9jayAqLworCUxJTlVYX01JQl9YRlJNT1VUUE9MREVBRCwJCS8qIFhmcm1PdXRQb2xEZWFkICovCisJTElOVVhfTUlCX1hGUk1PVVRQT0xFUlJPUiwJCS8qIFhmcm1PdXRQb2xFcnJvciAqLworCUxJTlVYX01JQl9YRlJNRldESERSRVJST1IsCQkvKiBYZnJtRndkSGRyRXJyb3IqLworCV9fTElOVVhfTUlCX1hGUk1NQVgKK307CisKKyNlbmRpZgkvKiBfTElOVVhfU05NUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzFlNTAxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb2NrZXQuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9MSU5VWF9TT0NLRVRfSAorI2RlZmluZSBfTElOVVhfU09DS0VUX0gKKworLyoKKyAqIERlc2lyZWQgZGVzaWduIG9mIG1heGltdW0gc2l6ZSBhbmQgYWxpZ25tZW50IChzZWUgUkZDMjU1MykKKyAqLworI2RlZmluZSBfS19TU19NQVhTSVpFCTEyOAkvKiBJbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBtYXggc2l6ZSAqLworI2RlZmluZSBfS19TU19BTElHTlNJWkUJKF9fYWxpZ25vZl9fIChzdHJ1Y3Qgc29ja2FkZHIgKikpCisJCQkJLyogSW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZGVzaXJlZCBhbGlnbm1lbnQgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX2tlcm5lbF9zYV9mYW1pbHlfdDsKKworc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UgeworCV9fa2VybmVsX3NhX2ZhbWlseV90CXNzX2ZhbWlseTsJCS8qIGFkZHJlc3MgZmFtaWx5ICovCisJLyogRm9sbG93aW5nIGZpZWxkKHMpIGFyZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyAqLworCWNoYXIJCV9fZGF0YVtfS19TU19NQVhTSVpFIC0gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KV07CisJCQkJLyogc3BhY2UgdG8gYWNoaWV2ZSBkZXNpcmVkIHNpemUsICovCisJCQkJLyogX1NTX01BWFNJWkUgdmFsdWUgbWludXMgc2l6ZSBvZiBzc19mYW1pbHkgKi8KK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoX0tfU1NfQUxJR05TSVpFKSkpOwkvKiBmb3JjZSBkZXNpcmVkIGFsaWdubWVudCAqLworCisjZW5kaWYgLyogX0xJTlVYX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvY2tpb3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29ja2lvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OTdhNTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvY2tpb3MuaApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlEZWZpbml0aW9ucyBvZiB0aGUgc29ja2V0LWxldmVsIEkvTyBjb250cm9sIGNhbGxzLgorICoKKyAqIFZlcnNpb246CUAoIylzb2NraW9zLmgJMS4wLjIJMDMvMDkvOTMKKyAqCisgKiBBdXRob3JzOglSb3NzIEJpcm8KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfU09DS0lPU19ICisjZGVmaW5lIF9MSU5VWF9TT0NLSU9TX0gKKworI2luY2x1ZGUgPGFzbS9zb2NraW9zLmg+CisKKy8qIExpbnV4LXNwZWNpZmljIHNvY2tldCBpb2N0bHMgKi8KKyNkZWZpbmUgU0lPQ0lOUQkJRklPTlJFQUQKKyNkZWZpbmUgU0lPQ09VVFEJVElPQ09VVFEgICAgICAgIC8qIG91dHB1dCBxdWV1ZSBzaXplIChub3Qgc2VudCArIG5vdCBhY2tlZCkgKi8KKworLyogUm91dGluZyB0YWJsZSBjYWxscy4gKi8KKyNkZWZpbmUgU0lPQ0FERFJUCTB4ODkwQgkJLyogYWRkIHJvdXRpbmcgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ0RFTFJUCTB4ODkwQwkJLyogZGVsZXRlIHJvdXRpbmcgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ1JUTVNHCTB4ODkwRAkJLyogY2FsbCB0byByb3V0aW5nIHN5c3RlbQkqLworCisvKiBTb2NrZXQgY29uZmlndXJhdGlvbiBjb250cm9scy4gKi8KKyNkZWZpbmUgU0lPQ0dJRk5BTUUJMHg4OTEwCQkvKiBnZXQgaWZhY2UgbmFtZQkJKi8KKyNkZWZpbmUgU0lPQ1NJRkxJTksJMHg4OTExCQkvKiBzZXQgaWZhY2UgY2hhbm5lbAkJKi8KKyNkZWZpbmUgU0lPQ0dJRkNPTkYJMHg4OTEyCQkvKiBnZXQgaWZhY2UgbGlzdAkJKi8KKyNkZWZpbmUgU0lPQ0dJRkZMQUdTCTB4ODkxMwkJLyogZ2V0IGZsYWdzCQkJKi8KKyNkZWZpbmUgU0lPQ1NJRkZMQUdTCTB4ODkxNAkJLyogc2V0IGZsYWdzCQkJKi8KKyNkZWZpbmUgU0lPQ0dJRkFERFIJMHg4OTE1CQkvKiBnZXQgUEEgYWRkcmVzcwkJKi8KKyNkZWZpbmUgU0lPQ1NJRkFERFIJMHg4OTE2CQkvKiBzZXQgUEEgYWRkcmVzcwkJKi8KKyNkZWZpbmUgU0lPQ0dJRkRTVEFERFIJMHg4OTE3CQkvKiBnZXQgcmVtb3RlIFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ1NJRkRTVEFERFIJMHg4OTE4CQkvKiBzZXQgcmVtb3RlIFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ0dJRkJSREFERFIJMHg4OTE5CQkvKiBnZXQgYnJvYWRjYXN0IFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ1NJRkJSREFERFIJMHg4OTFhCQkvKiBzZXQgYnJvYWRjYXN0IFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ0dJRk5FVE1BU0sJMHg4OTFiCQkvKiBnZXQgbmV0d29yayBQQSBtYXNrCQkqLworI2RlZmluZSBTSU9DU0lGTkVUTUFTSwkweDg5MWMJCS8qIHNldCBuZXR3b3JrIFBBIG1hc2sJCSovCisjZGVmaW5lIFNJT0NHSUZNRVRSSUMJMHg4OTFkCQkvKiBnZXQgbWV0cmljCQkJKi8KKyNkZWZpbmUgU0lPQ1NJRk1FVFJJQwkweDg5MWUJCS8qIHNldCBtZXRyaWMJCQkqLworI2RlZmluZSBTSU9DR0lGTUVNCTB4ODkxZgkJLyogZ2V0IG1lbW9yeSBhZGRyZXNzIChCU0QpCSovCisjZGVmaW5lIFNJT0NTSUZNRU0JMHg4OTIwCQkvKiBzZXQgbWVtb3J5IGFkZHJlc3MgKEJTRCkJKi8KKyNkZWZpbmUgU0lPQ0dJRk1UVQkweDg5MjEJCS8qIGdldCBNVFUgc2l6ZQkJCSovCisjZGVmaW5lIFNJT0NTSUZNVFUJMHg4OTIyCQkvKiBzZXQgTVRVIHNpemUJCQkqLworI2RlZmluZSBTSU9DU0lGTkFNRQkweDg5MjMJCS8qIHNldCBpbnRlcmZhY2UgbmFtZSAqLworI2RlZmluZQlTSU9DU0lGSFdBRERSCTB4ODkyNAkJLyogc2V0IGhhcmR3YXJlIGFkZHJlc3MgCSovCisjZGVmaW5lIFNJT0NHSUZFTkNBUAkweDg5MjUJCS8qIGdldC9zZXQgZW5jYXBzdWxhdGlvbnMgICAgICAgKi8KKyNkZWZpbmUgU0lPQ1NJRkVOQ0FQCTB4ODkyNgkJCisjZGVmaW5lIFNJT0NHSUZIV0FERFIJMHg4OTI3CQkvKiBHZXQgaGFyZHdhcmUgYWRkcmVzcwkJKi8KKyNkZWZpbmUgU0lPQ0dJRlNMQVZFCTB4ODkyOQkJLyogRHJpdmVyIHNsYXZpbmcgc3VwcG9ydAkqLworI2RlZmluZSBTSU9DU0lGU0xBVkUJMHg4OTMwCisjZGVmaW5lIFNJT0NBRERNVUxUSQkweDg5MzEJCS8qIE11bHRpY2FzdCBhZGRyZXNzIGxpc3RzCSovCisjZGVmaW5lIFNJT0NERUxNVUxUSQkweDg5MzIKKyNkZWZpbmUgU0lPQ0dJRklOREVYCTB4ODkzMwkJLyogbmFtZSAtPiBpZl9pbmRleCBtYXBwaW5nCSovCisjZGVmaW5lIFNJT0dJRklOREVYCVNJT0NHSUZJTkRFWAkvKiBtaXNwcmludCBjb21wYXRpYmlsaXR5IDotKQkqLworI2RlZmluZSBTSU9DU0lGUEZMQUdTCTB4ODkzNAkJLyogc2V0L2dldCBleHRlbmRlZCBmbGFncyBzZXQJKi8KKyNkZWZpbmUgU0lPQ0dJRlBGTEFHUwkweDg5MzUKKyNkZWZpbmUgU0lPQ0RJRkFERFIJMHg4OTM2CQkvKiBkZWxldGUgUEEgYWRkcmVzcwkJKi8KKyNkZWZpbmUJU0lPQ1NJRkhXQlJPQURDQVNUCTB4ODkzNwkvKiBzZXQgaGFyZHdhcmUgYnJvYWRjYXN0IGFkZHIJKi8KKyNkZWZpbmUgU0lPQ0dJRkNPVU5UCTB4ODkzOAkJLyogZ2V0IG51bWJlciBvZiBkZXZpY2VzICovCisKKyNkZWZpbmUgU0lPQ0dJRkJSCTB4ODk0MAkJLyogQnJpZGdpbmcgc3VwcG9ydAkJKi8KKyNkZWZpbmUgU0lPQ1NJRkJSCTB4ODk0MQkJLyogU2V0IGJyaWRnaW5nIG9wdGlvbnMgCSovCisKKyNkZWZpbmUgU0lPQ0dJRlRYUUxFTgkweDg5NDIJCS8qIEdldCB0aGUgdHggcXVldWUgbGVuZ3RoCSovCisjZGVmaW5lIFNJT0NTSUZUWFFMRU4JMHg4OTQzCQkvKiBTZXQgdGhlIHR4IHF1ZXVlIGxlbmd0aCAJKi8KKworLyogU0lPQ0dJRkRJVkVSVCB3YXM6CTB4ODk0NAkJRnJhbWUgZGl2ZXJzaW9uIHN1cHBvcnQgKi8KKy8qIFNJT0NTSUZESVZFUlQgd2FzOgkweDg5NDUJCVNldCBmcmFtZSBkaXZlcnNpb24gb3B0aW9ucyAqLworCisjZGVmaW5lIFNJT0NFVEhUT09MCTB4ODk0NgkJLyogRXRodG9vbCBpbnRlcmZhY2UJCSovCisKKyNkZWZpbmUgU0lPQ0dNSUlQSFkJMHg4OTQ3CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KKyNkZWZpbmUgU0lPQ0dNSUlSRUcJMHg4OTQ4CQkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuCSovCisjZGVmaW5lIFNJT0NTTUlJUkVHCTB4ODk0OQkJLyogV3JpdGUgTUlJIFBIWSByZWdpc3Rlci4JKi8KKworI2RlZmluZSBTSU9DV0FOREVWCTB4ODk0QQkJLyogZ2V0L3NldCBuZXRkZXYgcGFyYW1ldGVycwkqLworCisjZGVmaW5lIFNJT0NPVVRRTlNECTB4ODk0QgkJLyogb3V0cHV0IHF1ZXVlIHNpemUgKG5vdCBzZW50IG9ubHkpICovCisKKy8qIEFSUCBjYWNoZSBjb250cm9sIGNhbGxzLiAqLworCQkgICAgLyogIDB4ODk1MCAtIDB4ODk1MiAgKiBvYnNvbGV0ZSBjYWxscywgZG9uJ3QgcmUtdXNlICovCisjZGVmaW5lIFNJT0NEQVJQCTB4ODk1MwkJLyogZGVsZXRlIEFSUCB0YWJsZSBlbnRyeQkqLworI2RlZmluZSBTSU9DR0FSUAkweDg5NTQJCS8qIGdldCBBUlAgdGFibGUgZW50cnkJCSovCisjZGVmaW5lIFNJT0NTQVJQCTB4ODk1NQkJLyogc2V0IEFSUCB0YWJsZSBlbnRyeQkJKi8KKworLyogUkFSUCBjYWNoZSBjb250cm9sIGNhbGxzLiAqLworI2RlZmluZSBTSU9DRFJBUlAJMHg4OTYwCQkvKiBkZWxldGUgUkFSUCB0YWJsZSBlbnRyeQkqLworI2RlZmluZSBTSU9DR1JBUlAJMHg4OTYxCQkvKiBnZXQgUkFSUCB0YWJsZSBlbnRyeQkJKi8KKyNkZWZpbmUgU0lPQ1NSQVJQCTB4ODk2MgkJLyogc2V0IFJBUlAgdGFibGUgZW50cnkJCSovCisKKy8qIERyaXZlciBjb25maWd1cmF0aW9uIGNhbGxzICovCisKKyNkZWZpbmUgU0lPQ0dJRk1BUAkweDg5NzAJCS8qIEdldCBkZXZpY2UgcGFyYW1ldGVycwkqLworI2RlZmluZSBTSU9DU0lGTUFQCTB4ODk3MQkJLyogU2V0IGRldmljZSBwYXJhbWV0ZXJzCSovCisKKy8qIERMQ0kgY29uZmlndXJhdGlvbiBjYWxscyAqLworCisjZGVmaW5lIFNJT0NBRERETENJCTB4ODk4MAkJLyogQ3JlYXRlIG5ldyBETENJIGRldmljZQkqLworI2RlZmluZSBTSU9DREVMRExDSQkweDg5ODEJCS8qIERlbGV0ZSBETENJIGRldmljZQkJKi8KKworI2RlZmluZSBTSU9DR0lGVkxBTgkweDg5ODIJCS8qIDgwMi4xUSBWTEFOIHN1cHBvcnQJCSovCisjZGVmaW5lIFNJT0NTSUZWTEFOCTB4ODk4MwkJLyogU2V0IDgwMi4xUSBWTEFOIG9wdGlvbnMgCSovCisKKy8qIGJvbmRpbmcgY2FsbHMgKi8KKworI2RlZmluZSBTSU9DQk9OREVOU0xBVkUJMHg4OTkwCQkvKiBlbnNsYXZlIGEgZGV2aWNlIHRvIHRoZSBib25kICovCisjZGVmaW5lIFNJT0NCT05EUkVMRUFTRSAweDg5OTEJCS8qIHJlbGVhc2UgYSBzbGF2ZSBmcm9tIHRoZSBib25kKi8KKyNkZWZpbmUgU0lPQ0JPTkRTRVRIV0FERFIgICAgICAweDg5OTIJLyogc2V0IHRoZSBodyBhZGRyIG9mIHRoZSBib25kICAqLworI2RlZmluZSBTSU9DQk9ORFNMQVZFSU5GT1FVRVJZIDB4ODk5MyAgIC8qIHJ0biBpbmZvIGFib3V0IHNsYXZlIHN0YXRlICAgKi8KKyNkZWZpbmUgU0lPQ0JPTkRJTkZPUVVFUlkgICAgICAweDg5OTQJLyogcnRuIGluZm8gYWJvdXQgYm9uZCBzdGF0ZSAgICAqLworI2RlZmluZSBTSU9DQk9ORENIQU5HRUFDVElWRSAgIDB4ODk5NSAgIC8qIHVwZGF0ZSB0byBhIG5ldyBhY3RpdmUgc2xhdmUgKi8KKwkJCQorLyogYnJpZGdlIGNhbGxzICovCisjZGVmaW5lIFNJT0NCUkFEREJSICAgICAweDg5YTAJCS8qIGNyZWF0ZSBuZXcgYnJpZGdlIGRldmljZSAgICAgKi8KKyNkZWZpbmUgU0lPQ0JSREVMQlIgICAgIDB4ODlhMQkJLyogcmVtb3ZlIGJyaWRnZSBkZXZpY2UgICAgICAgICAqLworI2RlZmluZSBTSU9DQlJBRERJRgkweDg5YTIJCS8qIGFkZCBpbnRlcmZhY2UgdG8gYnJpZGdlICAgICAgKi8KKyNkZWZpbmUgU0lPQ0JSREVMSUYJMHg4OWEzCQkvKiByZW1vdmUgaW50ZXJmYWNlIGZyb20gYnJpZGdlICovCisKKy8qIGhhcmR3YXJlIHRpbWUgc3RhbXBpbmc6IHBhcmFtZXRlcnMgaW4gbGludXgvbmV0X3RzdGFtcC5oICovCisjZGVmaW5lIFNJT0NTSFdUU1RBTVAgICAweDg5YjAKKworLyogRGV2aWNlIHByaXZhdGUgaW9jdGwgY2FsbHMgKi8KKworLyoKKyAqCVRoZXNlIDE2IGlvY3RscyBhcmUgYXZhaWxhYmxlIHRvIGRldmljZXMgdmlhIHRoZSBkb19pb2N0bCgpIGRldmljZQorICoJdmVjdG9yLiBFYWNoIGRldmljZSBzaG91bGQgaW5jbHVkZSB0aGlzIGZpbGUgYW5kIHJlZGVmaW5lIHRoZXNlIG5hbWVzCisgKglhcyB0aGVpciBvd24uIEJlY2F1c2UgdGhlc2UgYXJlIGRldmljZSBkZXBlbmRlbnQgaXQgaXMgYSBnb29kIGlkZWEKKyAqCV9OT1RfIHRvIGlzc3VlIHRoZW0gdG8gcmFuZG9tIG9iamVjdHMgYW5kIGhvcGUuCisgKgorICoJVEhFU0UgSU9DVExTIEFSRSBfREVQUkVDQVRFRF8gQU5EIFdJTEwgRElTQVBQRUFSIElOIDIuNS5YIC1EYXZlTQorICovCisgCisjZGVmaW5lIFNJT0NERVZQUklWQVRFCTB4ODlGMAkvKiB0byA4OUZGICovCisKKy8qCisgKglUaGVzZSAxNiBpb2N0bCBjYWxscyBhcmUgcHJvdG9jb2wgcHJpdmF0ZQorICovCisgCisjZGVmaW5lIFNJT0NQUk9UT1BSSVZBVEUgMHg4OUUwIC8qIHRvIDg5RUYgKi8KKyNlbmRpZgkvKiBfTElOVVhfU09DS0lPU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjY1OTRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb20uaApAQCAtMCwwICsxLDE1NCBAQAorI2lmbmRlZiBfTElOVVhfU09NX0gKKyNkZWZpbmUgX0xJTlVYX1NPTV9ICisKKy8qIEZpbGUgZm9ybWF0IGRlZmluaXRpb24gZm9yIFNPTSBleGVjdXRhYmxlcyAvIHNoYXJlZCBsaWJyYXJpZXMgKi8KKworLyogd2UgbmVlZCBzdHJ1Y3QgdGltZXNwZWMgKi8KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNkZWZpbmUgU09NX1BBR0VTSVpFIDQwOTYKKworLyogdGhpcyBpcyB0aGUgU09NIGhlYWRlciAqLworc3RydWN0IHNvbV9oZHIgeworCXNob3J0CQlzeXN0ZW1faWQ7CQkvKiBtYWdpYyBudW1iZXIgLSBzeXN0ZW0gKi8KKwlzaG9ydAkJYV9tYWdpYzsJCS8qIG1hZ2ljIG51bWJlciAtIGZpbGUgdHlwZSAqLworCXVuc2lnbmVkIGludAl2ZXJzaW9uX2lkOwkJLyogdmVyc2lvZCBJRDogWVlNTURESEggKi8KKwlzdHJ1Y3QgdGltZXNwZWMJZmlsZV90aW1lOwkJLyogc3lzdGVtIGNsb2NrICovCisJdW5zaWduZWQgaW50CWVudHJ5X3NwYWNlOwkJLyogc3BhY2UgZm9yIGVudHJ5IHBvaW50ICovCisJdW5zaWduZWQgaW50CWVudHJ5X3N1YnNwYWNlOwkJLyogc3Vic3BhY2UgZm9yIGVudHJ5IHBvaW50ICovCisJdW5zaWduZWQgaW50CWVudHJ5X29mZnNldDsJCS8qIG9mZnNldCBvZiBlbnRyeSBwb2ludCAqLworCXVuc2lnbmVkIGludAlhdXhfaGVhZGVyX2xvY2F0aW9uOwkvKiBhdXhpbGlhcnkgaGVhZGVyIGxvY2F0aW9uICovCisJdW5zaWduZWQgaW50CWF1eF9oZWFkZXJfc2l6ZTsJLyogYXV4aWxpYXJ5IGhlYWRlciBzaXplICovCisJdW5zaWduZWQgaW50CXNvbV9sZW5ndGg7CQkvKiBsZW5ndGggb2YgZW50aXJlIFNPTSAqLworCXVuc2lnbmVkIGludAlwcmVzdW1lZF9kcDsJCS8qIGNvbXBpbGVyJ3MgRFAgdmFsdWUgKi8KKwl1bnNpZ25lZCBpbnQJc3BhY2VfbG9jYXRpb247CQkvKiBzcGFjZSBkaWN0aW9uYXJ5IGxvY2F0aW9uICovCisJdW5zaWduZWQgaW50CXNwYWNlX3RvdGFsOwkJLyogbnVtYmVyIG9mIHNwYWNlIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQJc3Vic3BhY2VfbG9jYXRpb247CS8qIHN1YnNwYWNlIGVudHJpZXMgbG9jYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQJc3Vic3BhY2VfdG90YWw7CQkvKiBudW1iZXIgb2Ygc3Vic3BhY2UgZW50cmllcyAqLworCXVuc2lnbmVkIGludAlsb2FkZXJfZml4dXBfbG9jYXRpb247CS8qIE1QRS9pWCBsb2FkZXIgZml4dXAgKi8KKwl1bnNpZ25lZCBpbnQJbG9hZGVyX2ZpeHVwX3RvdGFsOwkvKiBudW1iZXIgb2YgZml4dXAgcmVjb3JkcyAqLworCXVuc2lnbmVkIGludAlzcGFjZV9zdHJpbmdzX2xvY2F0aW9uOwkvKiAoc3ViKXNwYWNlIG5hbWVzICovCisJdW5zaWduZWQgaW50CXNwYWNlX3N0cmluZ3Nfc2l6ZTsJLyogc2l6ZSBvZiBzdHJpbmdzIGFyZWEgKi8KKwl1bnNpZ25lZCBpbnQJaW5pdF9hcnJheV9sb2NhdGlvbjsJLyogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBpbnQJaW5pdF9hcnJheV90b3RhbDsJLyogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBpbnQJY29tcGlsZXJfbG9jYXRpb247CS8qIG1vZHVsZSBkaWN0aW9uYXJ5ICovCisJdW5zaWduZWQgaW50CWNvbXBpbGVyX3RvdGFsOwkJLyogbnVtYmVyIG9mIG1vZHVsZXMgKi8KKwl1bnNpZ25lZCBpbnQJc3ltYm9sX2xvY2F0aW9uOwkvKiBzeW1ib2wgZGljdGlvbmFyeSAqLworCXVuc2lnbmVkIGludAlzeW1ib2xfdG90YWw7CQkvKiBudW1iZXIgb2Ygc3ltYm9scyAqLworCXVuc2lnbmVkIGludAlmaXh1cF9yZXF1ZXN0X2xvY2F0aW9uOwkvKiBmaXh1cCByZXF1ZXN0cyAqLworCXVuc2lnbmVkIGludAlmaXh1cF9yZXF1ZXN0X3RvdGFsOwkvKiBudW1iZXIgb2YgZml4dXAgcmVxdWVzdHMgKi8KKwl1bnNpZ25lZCBpbnQJc3ltYm9sX3N0cmluZ3NfbG9jYXRpb247LyogbW9kdWxlICYgc3ltYm9sIG5hbWVzIGFyZWEgKi8KKwl1bnNpZ25lZCBpbnQJc3ltYm9sX3N0cmluZ3Nfc2l6ZTsJLyogc2l6ZSBvZiBzdHJpbmdzIGFyZWEgKi8KKwl1bnNpZ25lZCBpbnQJdW5sb2FkYWJsZV9zcF9sb2NhdGlvbjsJLyogdW5sb2FkYWJsZSBzcGFjZXMgbG9jYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQJdW5sb2FkYWJsZV9zcF9zaXplOwkvKiBzaXplIG9mIGRhdGEgKi8KKwl1bnNpZ25lZCBpbnQJY2hlY2tzdW07Cit9OworCisvKiB2YWx1ZXMgZm9yIHN5c3RlbV9pZCAqLworCisjZGVmaW5lIFNPTV9TSURfUEFSSVNDXzFfMAkweDAyMGIKKyNkZWZpbmUgU09NX1NJRF9QQVJJU0NfMV8xCTB4MDIxMAorI2RlZmluZSBTT01fU0lEX1BBUklTQ18yXzAJMHgwMjE0CisKKy8qIHZhbHVlcyBmb3IgYV9tYWdpYyAqLworCisjZGVmaW5lIFNPTV9MSUJfRVhFQwkJMHgwMTA0CisjZGVmaW5lIFNPTV9SRUxPQ0FUQUJMRQkJMHgwMTA2CisjZGVmaW5lIFNPTV9FWEVDX05PTlNIQVJFCTB4MDEwNworI2RlZmluZSBTT01fRVhFQ19TSEFSRQkJMHgwMTA4CisjZGVmaW5lIFNPTV9FWEVDX0RFTUFORAkJMHgwMTBCCisjZGVmaW5lIFNPTV9MSUJfRFlOCQkweDAxMEQKKyNkZWZpbmUgU09NX0xJQl9TSEFSRQkJMHgwMTBFCisjZGVmaW5lIFNPTV9MSUJfUkVMT0MJCTB4MDYxOQorCisvKiB2YWx1ZXMgZm9yIHZlcnNpb25faWQuICBEZWNpbWFsIG5vdCBoZXgsIHllcy4gIEdyci4gKi8KKworI2RlZmluZSBTT01fSURfT0xECQk4NTA4MjExMgorI2RlZmluZSBTT01fSURfTkVXCQk4NzEwMjQxMgorCitzdHJ1Y3QgYXV4X2lkIHsKKwl1bnNpZ25lZCBpbnQJbWFuZGF0b3J5IDoxOwkvKiB0aGUgbGlua2VyIG11c3QgdW5kZXJzdGFuZCB0aGlzICovCisJdW5zaWduZWQgaW50CWNvcHkJICA6MTsJLyogTXVzdCBiZSBjb3BpZWQgYnkgdGhlIGxpbmtlciAqLworCXVuc2lnbmVkIGludAlhcHBlbmQJICA6MTsJLyogTXVzdCBiZSBtZXJnZWQgYnkgdGhlIGxpbmtlciAqLworCXVuc2lnbmVkIGludAlpZ25vcmUJICA6MTsJLyogRGlzY2FyZCBzZWN0aW9uIGlmIHVua25vd24gKi8KKwl1bnNpZ25lZCBpbnQJcmVzZXJ2ZWQgIDoxMjsKKwl1bnNpZ25lZCBpbnQJdHlwZQkgIDoxNjsJLyogSGVhZGVyIHR5cGUgKi8KKwl1bnNpZ25lZCBpbnQJbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIF9mb2xsb3dpbmdfIGRhdGEgKi8KK307CisKKy8qIFRoZSBFeGVjIEF1eGlsaWFyeSBIZWFkZXIuICBDYWxsZWQgVGhlIEhQLVVYIEhlYWRlciB3aXRoaW4gSFAgYXBwYXJlbnRseS4gKi8KK3N0cnVjdCBzb21fZXhlY19hdXhoZHIgeworCXN0cnVjdCBhdXhfaWQJc29tX2F1eGhkcjsKKwlpbnQJCWV4ZWNfdHNpemU7CS8qIFRleHQgc2l6ZSBpbiBieXRlcyAqLworCWludAkJZXhlY190bWVtOwkvKiBBZGRyZXNzIHRvIGxvYWQgdGV4dCBhdCAqLworCWludAkJZXhlY190ZmlsZTsJLyogTG9jYXRpb24gb2YgdGV4dCBpbiBmaWxlICovCisJaW50CQlleGVjX2RzaXplOwkvKiBEYXRhIHNpemUgaW4gYnl0ZXMgKi8KKwlpbnQJCWV4ZWNfZG1lbTsJLyogQWRkcmVzcyB0byBsb2FkIGRhdGEgYXQgKi8KKwlpbnQJCWV4ZWNfZGZpbGU7CS8qIExvY2F0aW9uIG9mIGRhdGEgaW4gZmlsZSAqLworCWludAkJZXhlY19ic2l6ZTsJLyogVW5pbml0aWFsaXNlZCBkYXRhIChic3MpICovCisJaW50CQlleGVjX2VudHJ5OwkvKiBBZGRyZXNzIHRvIHN0YXJ0IGV4ZWN1dGluZyAqLworCWludAkJZXhlY19mbGFnczsJLyogbG9hZGVyIGZsYWdzICovCisJaW50CQlleGVjX2JmaWxsOwkvKiBpbml0aWFsaXNhdGlvbiB2YWx1ZSBmb3IgYnNzICovCit9OworCisvKiBPaCwgdGhlIHRoaW5ncyBwZW9wbGUgZG8gdG8gYXZvaWQgY2FzdHMuICBTaGFtZSBpdCdsbCBicmVhayB3aXRoIGdjYydzCisgKiBuZXcgYWxpYXNpbmcgcnVsZXMgcmVhbGx5LgorICovCit1bmlvbiBuYW1lX3B0IHsKKwljaGFyICoJCW5fbmFtZTsKKwl1bnNpZ25lZCBpbnQJbl9zdHJ4OworfTsKKworLyogVGhlIFNwYWNlIERpY3Rpb25hcnkgKi8KK3N0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCB7CisJdW5pb24gbmFtZV9wdAluYW1lOwkJCS8qIGluZGV4IHRvIHN1YnNwYWNlIG5hbWUgKi8KKwl1bnNpZ25lZCBpbnQJaXNfbG9hZGFibGUJOjE7CS8qIGxvYWRhYmxlICovCisJdW5zaWduZWQgaW50CWlzX2RlZmluZWQJOjE7CS8qIGRlZmluZWQgd2l0aGluIGZpbGUgKi8KKwl1bnNpZ25lZCBpbnQJaXNfcHJpdmF0ZQk6MTsJLyogbm90IHNoYXJhYmxlICovCisJdW5zaWduZWQgaW50CWhhc19pbnRlcm1lZGlhdGVfY29kZSA6MTsgLyogY29udGFpbnMgaW50ZXJtZWRpYXRlIGNvZGUgKi8KKwl1bnNpZ25lZCBpbnQJaXNfdHNwZWNpZmljCToxOwkvKiB0aHJlYWQgc3BlY2lmaWMgKi8KKwl1bnNpZ25lZCBpbnQJcmVzZXJ2ZWQJOjExOwkvKiBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworCXVuc2lnbmVkIGludAlzb3J0X2tleQk6ODsJLyogZm9yIGxpbmtlciAqLworCXVuc2lnbmVkIGludAlyZXNlcnZlZDIJOjg7CS8qIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisKKwlpbnQJCXNwYWNlX251bWJlcjsJCS8qIGluZGV4ICovCisJaW50CQlzdWJzcGFjZV9pbmRleDsJCS8qIGluZGV4IGludG8gc3Vic3BhY2UgZGljdCAqLworCXVuc2lnbmVkIGludAlzdWJzcGFjZV9xdWFudGl0eTsJLyogbnVtYmVyIG9mIHN1YnNwYWNlcyAqLworCWludAkJbG9hZGVyX2ZpeF9pbmRleDsJLyogZm9yIGxvYWRlciAqLworCXVuc2lnbmVkIGludAlsb2FkZXJfZml4X3F1YW50aXR5OwkvKiBmb3IgbG9hZGVyICovCisJaW50CQlpbml0X3BvaW50ZXJfaW5kZXg7CS8qIGRhdGEgcG9pbnRlciBhcnJheSBpbmRleCAqLworCXVuc2lnbmVkIGludAlpbml0X3BvaW50ZXJfcXVhbnRpdHk7CS8qIG51bWJlciBvZiBkYXRhIHBvaW50ZXJzICovCit9OworCisvKiBUaGUgU3Vic3BhY2UgRGljdGlvbmFyeSAqLworc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkIHsKKwlpbnQJCXNwYWNlX2luZGV4OworCXVuc2lnbmVkIGludAlhY2Nlc3NfY29udHJvbF9iaXRzIDo3OworCXVuc2lnbmVkIGludAltZW1vcnlfcmVzaWRlbnQJOjE7CisJdW5zaWduZWQgaW50CWR1cF9jb21tb24JOjE7CisJdW5zaWduZWQgaW50CWlzX2NvbW1vbgk6MTsKKwl1bnNpZ25lZCBpbnQJcXVhZHJhbnQJOjI7CisJdW5zaWduZWQgaW50CWluaXRpYWxseV9mcm96ZW4gOjE7CisJdW5zaWduZWQgaW50CWlzX2ZpcnN0CToxOworCXVuc2lnbmVkIGludAljb2RlX29ubHkJOjE7CisJdW5zaWduZWQgaW50CXNvcnRfa2V5CTo4OworCXVuc2lnbmVkIGludAlyZXBsaWNhdGVfaW5pdAk6MTsKKwl1bnNpZ25lZCBpbnQJY29udGludWF0aW9uCToxOworCXVuc2lnbmVkIGludAlpc190c3BlY2lmaWMJOjE7CisJdW5zaWduZWQgaW50CWlzX2NvbWRhdAk6MTsKKwl1bnNpZ25lZCBpbnQJcmVzZXJ2ZWQJOjQ7CisKKwlpbnQJCWZpbGVfbG9jX2luaXRfdmFsdWU7CisJdW5zaWduZWQgaW50CWluaXRpYWxpemF0aW9uX2xlbmd0aDsKKwl1bnNpZ25lZCBpbnQJc3Vic3BhY2Vfc3RhcnQ7CisJdW5zaWduZWQgaW50CXN1YnNwYWNlX2xlbmd0aDsKKworCXVuc2lnbmVkIGludAlyZXNlcnZlZDIJOjU7CisJdW5zaWduZWQgaW50CWFsaWdubWVudAk6Mjc7CisKKwl1bmlvbiBuYW1lX3B0CW5hbWU7CisJaW50CQlmaXh1cF9yZXF1ZXN0X2luZGV4OworCXVuc2lnbmVkIGludAlmaXh1cF9yZXF1ZXN0X3F1YW50aXR5OworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9TT01fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb25ldC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNjgyOTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvbmV0LmgKQEAgLTAsMCArMSw2MCBAQAorLyogc29uZXQuaCAtIFNPTkVUL1NIRCBwaHlzaWNhbCBsYXllciBjb250cm9sICovCisgCisvKiBXcml0dGVuIDE5OTUtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworIAorCisjaWZuZGVmIExJTlVYX1NPTkVUX0gKKyNkZWZpbmUgTElOVVhfU09ORVRfSAorCisjZGVmaW5lIF9fU09ORVRfSVRFTVMgXAorICAgIF9fSEFORExFX0lURU0oc2VjdGlvbl9iaXApOyAJLyogc2VjdGlvbiBwYXJpdHkgZXJyb3JzIChCMSkgKi8gXAorICAgIF9fSEFORExFX0lURU0obGluZV9iaXApOwkJLyogbGluZSBwYXJpdHkgZXJyb3JzIChCMikgKi8gXAorICAgIF9fSEFORExFX0lURU0ocGF0aF9iaXApOwkJLyogcGF0aCBwYXJpdHkgZXJyb3JzIChCMykgKi8gXAorICAgIF9fSEFORExFX0lURU0obGluZV9mZWJlKTsJCS8qIGxpbmUgcGFyaXR5IGVycm9ycyBhdCByZW1vdGUgKi8gXAorICAgIF9fSEFORExFX0lURU0ocGF0aF9mZWJlKTsJCS8qIHBhdGggcGFyaXR5IGVycm9ycyBhdCByZW1vdGUgKi8gXAorICAgIF9fSEFORExFX0lURU0oY29ycl9oY3MpOwkJLyogY29ycmVjdGFibGUgaGVhZGVyIGVycm9ycyAqLyBcCisgICAgX19IQU5ETEVfSVRFTSh1bmNvcnJfaGNzKTsJCS8qIHVuY29ycmVjdGFibGUgaGVhZGVyIGVycm9ycyAqLyBcCisgICAgX19IQU5ETEVfSVRFTSh0eF9jZWxscyk7CQkvKiBjZWxscyBzZW50ICovIFwKKyAgICBfX0hBTkRMRV9JVEVNKHJ4X2NlbGxzKTsJCS8qIGNlbGxzIHJlY2VpdmVkICovCisKK3N0cnVjdCBzb25ldF9zdGF0cyB7CisjZGVmaW5lIF9fSEFORExFX0lURU0oaSkgaW50IGkKKwlfX1NPTkVUX0lURU1TCisjdW5kZWYgX19IQU5ETEVfSVRFTQorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworI2RlZmluZSBTT05FVF9HRVRTVEFUCV9JT1IoJ2EnLEFUTUlPQ19QSFlUWVAsc3RydWN0IHNvbmV0X3N0YXRzKQorCQkJCQkvKiBnZXQgc3RhdGlzdGljcyAqLworI2RlZmluZSBTT05FVF9HRVRTVEFUWglfSU9SKCdhJyxBVE1JT0NfUEhZVFlQKzEsc3RydWN0IHNvbmV0X3N0YXRzKQorCQkJCQkvKiAuLi4gYW5kIHplcm8gY291bnRlcnMgKi8KKyNkZWZpbmUgU09ORVRfU0VURElBRwlfSU9XUignYScsQVRNSU9DX1BIWVRZUCsyLGludCkKKwkJCQkJLyogc2V0IGVycm9yIGluc2VydGlvbiAqLworI2RlZmluZSBTT05FVF9DTFJESUFHCV9JT1dSKCdhJyxBVE1JT0NfUEhZVFlQKzMsaW50KQorCQkJCQkvKiBjbGVhciBlcnJvciBpbnNlcnRpb24gKi8KKyNkZWZpbmUgU09ORVRfR0VURElBRwlfSU9SKCdhJyxBVE1JT0NfUEhZVFlQKzQsaW50KQorCQkJCQkvKiBxdWVyeSBlcnJvciBpbnNlcnRpb24gKi8KKyNkZWZpbmUgU09ORVRfU0VURlJBTUlORyBfSU9XKCdhJyxBVE1JT0NfUEhZVFlQKzUsaW50KQorCQkJCQkvKiBzZXQgZnJhbWluZyBtb2RlIChTT05FVC9TREgpICovCisjZGVmaW5lIFNPTkVUX0dFVEZSQU1JTkcgX0lPUignYScsQVRNSU9DX1BIWVRZUCs2LGludCkKKwkJCQkJLyogZ2V0IGZyYW1pbmcgbW9kZSAqLworI2RlZmluZSBTT05FVF9HRVRGUlNFTlNFIF9JT1IoJ2EnLEFUTUlPQ19QSFlUWVArNywgXAorICB1bnNpZ25lZCBjaGFyW1NPTkVUX0ZSU0VOU0VfU0laRV0pCS8qIGdldCBmcmFtaW5nIHNlbnNlIGluZm9ybWF0aW9uICovCisKKyNkZWZpbmUgU09ORVRfSU5TX1NCSVAJICAxCQkvKiBzZWN0aW9uIEJJUCAqLworI2RlZmluZSBTT05FVF9JTlNfTEJJUAkgIDIJCS8qIGxpbmUgQklQICovCisjZGVmaW5lIFNPTkVUX0lOU19QQklQCSAgNAkJLyogcGF0aCBCSVAgKi8KKyNkZWZpbmUgU09ORVRfSU5TX0ZSQU1FCSAgOAkJLyogb3V0IG9mIGZyYW1lICovCisjZGVmaW5lIFNPTkVUX0lOU19MT1MJIDE2CQkvKiBzZXQgbGluZSB0byB6ZXJvICovCisjZGVmaW5lIFNPTkVUX0lOU19MQUlTCSAzMgkJLyogbGluZSBhbGFybSBpbmRpY2F0aW9uIHNpZ25hbCAqLworI2RlZmluZSBTT05FVF9JTlNfUEFJUwkgNjQJCS8qIHBhdGggYWxhcm0gaW5kaWNhdGlvbiBzaWduYWwgKi8KKyNkZWZpbmUgU09ORVRfSU5TX0hDUwkxMjgJCS8qIGluc2VydCBIQ1MgZXJyb3IgKi8KKworI2RlZmluZSBTT05FVF9GUkFNRV9TT05FVCAwCQkvKiBTT05FVCBTVFMtMyBmcmFtaW5nICovCisjZGVmaW5lIFNPTkVUX0ZSQU1FX1NESCAgIDEJCS8qIFNESCBTVE0tMSBmcmFtaW5nICovCisKKyNkZWZpbmUgU09ORVRfRlJTRU5TRV9TSVpFIDYJCS8qIEMxWzNdLEgxWzNdICgweGZmIGZvciB1bmtub3duKSAqLworCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb255cGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODVkYTBmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb255cGkuaApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIFNvbnkgUHJvZ3JhbW1hYmxlIEkvTyBDb250cm9sIERldmljZSBkcml2ZXIgZm9yIFZBSU8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOYXJheWFuYW4gUiBTIDxuYXJzQGthZGFtYmEub3JnPgorCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBBbGPDtHZlIDx3d3cuYWxjb3ZlLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWljaGFlbCBBc2hsZXkgPG0uYXNobGV5QHVuc3cuZWR1LmF1PgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBKdW5pY2hpIE1vcml0YSA8anVuMW1AbWFycy5kdGkubmUuanA+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIFRha2F5YSBLaW5qbyA8dC1raW5qb0B0YzQuc28tbmV0Lm5lLmpwPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBBbmRyZXcgVHJpZGdlbGwgPHRyaWRnZUB2YWxpbnV4LmNvbT4KKyAqCisgKiBFYXJsaWVyIHdvcmsgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBQYXVsIGBSdXN0eScgUnVzc2VsbCBhbmQgUGF1bCBNYWNrZXJyYXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX1NPTllQSV9IXworI2RlZmluZSBfU09OWVBJX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBldmVudHMgdGhlIHVzZXIgYXBwbGljYXRpb24gcmVhZGluZyAvZGV2L3NvbnlwaSBjYW4gdXNlICovCisKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0lHTk9SRQkJCSAwCisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV04JCSAxCisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQCQkJIDIKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTl9QUkVTU0VECSAzCisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQX1BSRVNTRUQJCSA0CisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX1BSRVNTRUQJCSA1CisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX1JFTEVBU0VECQkgNgkvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VECQkgNworI2RlZmluZSBTT05ZUElfRVZFTlRfQ0FQVFVSRV9SRUxFQVNFRAkJIDgJLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgU09OWVBJX0VWRU5UX0NBUFRVUkVfUEFSVElBTFBSRVNTRUQJIDkKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0NBUFRVUkVfUEFSVElBTFJFTEVBU0VECTEwCisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9FU0MJCQkxMQorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRjEJCQkxMgorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRjIJCQkxMworI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRjMJCQkxNAorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRjQJCQkxNQorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRjUJCQkxNgorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRjYJCQkxNworI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRjcJCQkxOAorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRjgJCQkxOQorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRjkJCQkyMAorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRjEwCQkJMjEKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMQkJCTIyCisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9GMTIJCQkyMworI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfMQkJCTI0CisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV8yCQkJMjUKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0QJCQkyNgorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRQkJCTI3CisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9GCQkJMjgKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX1MJCQkyOQorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfQgkJCTMwCisjZGVmaW5lIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfUFJFU1NFRAkJMzEKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1BLRVlfUDEJCQkzMgorI2RlZmluZSBTT05ZUElfRVZFTlRfUEtFWV9QMgkJCTMzCisjZGVmaW5lIFNPTllQSV9FVkVOVF9QS0VZX1AzCQkJMzQKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0JBQ0tfUFJFU1NFRAkJMzUKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0xJRF9DTE9TRUQJCQkzNgorI2RlZmluZSBTT05ZUElfRVZFTlRfTElEX09QRU5FRAkJCTM3CisjZGVmaW5lIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfT04JCTM4CisjZGVmaW5lIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfT0ZGCQkzOQorI2RlZmluZSBTT05ZUElfRVZFTlRfSEVMUF9QUkVTU0VECQk0MAorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfT05MWQkJCTQxCisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTgkJNDIKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9VUAkJNDMKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOX1BSRVNTRUQJNDQKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9VUF9QUkVTU0VECTQ1CisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX0RPV04JCTQ2CisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX1VQCQk0NworI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9ET1dOX1BSRVNTRUQJNDgKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVBfUFJFU1NFRAk0OQorI2RlZmluZSBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VECQk1MAorI2RlZmluZSBTT05ZUElfRVZFTlRfVEhVTUJQSFJBU0VfUFJFU1NFRAk1MQorI2RlZmluZSBTT05ZUElfRVZFTlRfTUVZRV9GQUNFCQkJNTIKKyNkZWZpbmUgU09OWVBJX0VWRU5UX01FWUVfT1BQT1NJVEUJCTUzCisjZGVmaW5lIFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19JTlNFUlQJCTU0CisjZGVmaW5lIFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19FSkVDVAkJNTUKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0FOWUJVVFRPTl9SRUxFQVNFRAkJNTYKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0JBVFRFUllfSU5TRVJUCQk1NworI2RlZmluZSBTT05ZUElfRVZFTlRfQkFUVEVSWV9SRU1PVkUJCTU4CisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRAkJNTkKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1dJUkVMRVNTX09OCQk2MAorI2RlZmluZSBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT0ZGCQk2MQorI2RlZmluZSBTT05ZUElfRVZFTlRfWk9PTV9JTl9QUkVTU0VECQk2MgorI2RlZmluZSBTT05ZUElfRVZFTlRfWk9PTV9PVVRfUFJFU1NFRAkJNjMKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0NEX0VKRUNUX1BSRVNTRUQJCTY0CisjZGVmaW5lIFNPTllQSV9FVkVOVF9NT0RFS0VZX1BSRVNTRUQJCTY1CisjZGVmaW5lIFNPTllQSV9FVkVOVF9QS0VZX1A0CQkJNjYKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1BLRVlfUDUJCQk2NworI2RlZmluZSBTT05ZUElfRVZFTlRfU0VUVElOR0tFWV9QUkVTU0VECQk2OAorI2RlZmluZSBTT05ZUElfRVZFTlRfVk9MVU1FX0lOQ19QUkVTU0VECQk2OQorI2RlZmluZSBTT05ZUElfRVZFTlRfVk9MVU1FX0RFQ19QUkVTU0VECQk3MAorI2RlZmluZSBTT05ZUElfRVZFTlRfQlJJR0hUTkVTU19QUkVTU0VECQk3MQorI2RlZmluZSBTT05ZUElfRVZFTlRfTUVESUFfUFJFU1NFRAkJNzIKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1ZFTkRPUl9QUkVTU0VECQk3MworCisvKiBnZXQvc2V0IGJyaWdodG5lc3MgKi8KKyNkZWZpbmUgU09OWVBJX0lPQ0dCUlQJCV9JT1IoJ3YnLCAwLCBfX3U4KQorI2RlZmluZSBTT05ZUElfSU9DU0JSVAkJX0lPVygndicsIDAsIF9fdTgpCisKKy8qIGdldCBiYXR0ZXJ5IGZ1bGwgY2FwYWNpdHkvcmVtYWluaW5nIGNhcGFjaXR5ICovCisjZGVmaW5lIFNPTllQSV9JT0NHQkFUMUNBUAlfSU9SKCd2JywgMiwgX191MTYpCisjZGVmaW5lIFNPTllQSV9JT0NHQkFUMVJFTQlfSU9SKCd2JywgMywgX191MTYpCisjZGVmaW5lIFNPTllQSV9JT0NHQkFUMkNBUAlfSU9SKCd2JywgNCwgX191MTYpCisjZGVmaW5lIFNPTllQSV9JT0NHQkFUMlJFTQlfSU9SKCd2JywgNSwgX191MTYpCisKKy8qIGdldCBiYXR0ZXJ5IGZsYWdzOiBiYXR0ZXJ5MS9iYXR0ZXJ5Mi9hYyBhZGFwdGVyIHByZXNlbnQgKi8KKyNkZWZpbmUgU09OWVBJX0JGTEFHU19CMQkweDAxCisjZGVmaW5lIFNPTllQSV9CRkxBR1NfQjIJMHgwMgorI2RlZmluZSBTT05ZUElfQkZMQUdTX0FDCTB4MDQKKyNkZWZpbmUgU09OWVBJX0lPQ0dCQVRGTEFHUwlfSU9SKCd2JywgNywgX191OCkKKworLyogZ2V0L3NldCBibHVldG9vdGggc3Vic3lzdGVtIHN0YXRlIG9uL29mZiAqLworI2RlZmluZSBTT05ZUElfSU9DR0JMVUUJCV9JT1IoJ3YnLCA4LCBfX3U4KQorI2RlZmluZSBTT05ZUElfSU9DU0JMVUUJCV9JT1coJ3YnLCA5LCBfX3U4KQorCisvKiBnZXQvc2V0IGZhbiBzdGF0ZSBvbi9vZmYgKi8KKyNkZWZpbmUgU09OWVBJX0lPQ0dGQU4JCV9JT1IoJ3YnLCAxMCwgX191OCkKKyNkZWZpbmUgU09OWVBJX0lPQ1NGQU4JCV9JT1coJ3YnLCAxMSwgX191OCkKKworLyogZ2V0IHRlbXBlcmF0dXJlIChDKSAqLworI2RlZmluZSBTT05ZUElfSU9DR1RFTVAJCV9JT1IoJ3YnLCAxMiwgX191OCkKKworCisjZW5kaWYJCQkJLyogX1NPTllQSV9IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb3VuZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb3VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZDg0MmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvdW5kLmgKQEAgLTAsMCArMSwyNyBAQAorCisvKgorICogTWlub3IgbnVtYmVycyBmb3IgdGhlIHNvdW5kIGRyaXZlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworI2RlZmluZSBTTkRfREVWX0NUTAkJMAkvKiBDb250cm9sIHBvcnQgL2Rldi9taXhlciAqLworI2RlZmluZSBTTkRfREVWX1NFUQkJMQkvKiBTZXF1ZW5jZXIgb3V0cHV0IC9kZXYvc2VxdWVuY2VyIChGTQorCQkJCQkJc3ludGhlc2l6ZXIgYW5kIE1JREkgb3V0cHV0KSAqLworI2RlZmluZSBTTkRfREVWX01JRElOCQkyCS8qIFJhdyBtaWRpIGFjY2VzcyAqLworI2RlZmluZSBTTkRfREVWX0RTUAkJMwkvKiBEaWdpdGl6ZWQgdm9pY2UgL2Rldi9kc3AgKi8KKyNkZWZpbmUgU05EX0RFVl9BVURJTwkJNAkvKiBTcGFyYyBjb21wYXRpYmxlIC9kZXYvYXVkaW8gKi8KKyNkZWZpbmUgU05EX0RFVl9EU1AxNgkJNQkvKiBMaWtlIC9kZXYvZHNwIGJ1dCAxNiBiaXRzL3NhbXBsZSAqLworLyogI2RlZmluZSBTTkRfREVWX1NUQVRVUwk2ICovCS8qIC9kZXYvc25kc3RhdCAob2Jzb2xldGUpICovCisjZGVmaW5lIFNORF9ERVZfVU5VU0VECQk2CisjZGVmaW5lIFNORF9ERVZfQVdGTQkJNwkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBTTkRfREVWX1NFUTIJCTgJLyogL2Rldi9zZXF1ZW5jZXIsIGxldmVsIDIgaW50ZXJmYWNlICovCisvKiAjZGVmaW5lIFNORF9ERVZfU05EUFJPQwk5ICovCS8qIC9kZXYvc25kcHJvYyBmb3IgcHJvZ3JhbW1hYmxlIGRldmljZXMgKG5vdCB1c2VkKSAqLworLyogI2RlZmluZSBTTkRfREVWX0RNTUlESQk5ICovCisjZGVmaW5lIFNORF9ERVZfU1lOVEgJCTkJLyogUmF3IHN5bnRoIGFjY2VzcyAvZGV2L3N5bnRoIChzYW1lIGFzIC9kZXYvZG1mbSkgKi8KKyNkZWZpbmUgU05EX0RFVl9ETUZNCQkxMAkvKiBSYXcgc3ludGggYWNjZXNzIC9kZXYvZG1mbSAqLworI2RlZmluZSBTTkRfREVWX1VOS05PV04xMQkxMQorI2RlZmluZSBTTkRfREVWX0FEU1AJCTEyCS8qIExpa2UgL2Rldi9kc3AgKG9ic29sZXRlKSAqLworI2RlZmluZSBTTkRfREVWX0FNSURJCQkxMwkvKiBMaWtlIC9kZXYvbWlkaSAob2Jzb2xldGUpICovCisjZGVmaW5lIFNORF9ERVZfQURNTUlESQkJMTQJLyogTGlrZSAvZGV2L2RtbWlkaSAob25zb2xldGUpICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc291bmRjYXJkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvdW5kY2FyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjY1YmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvdW5kY2FyZC5oCkBAIC0wLDAgKzEsMTI3NiBAQAorI2lmbmRlZiBTT1VORENBUkRfSAorI2RlZmluZSBTT1VORENBUkRfSAorLyoKKyAqIENvcHlyaWdodCBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAyLgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworCisvKgorICogT1NTIGludGVyZmFjZSB2ZXJzaW9uLiBXaXRoIHZlcnNpb25zIGVhcmxpZXIgdGhhbiAzLjYgdGhpcyB2YWx1ZSBpcworICogYW4gaW50ZWdlciB3aXRoIHZhbHVlIGxlc3MgdGhhbiAzNjEuIEluIHZlcnNpb25zIDMuNiBhbmQgbGF0ZXIKKyAqIGl0J3MgYSBzaXggZGlnaXQgaGV4YWRlY2ltYWwgdmFsdWUuIEZvciBleGFtcGxlIHZhbHVlCisgKiBvZiAweDAzMDYwMCByZXByZXNlbnRzIE9TUyB2ZXJzaW9uIDMuNi4wLgorICogVXNlIGlvY3RsKGZkLCBPU1NfR0VUVkVSU0lPTiwgJmludCkgdG8gZ2V0IHRoZSB2ZXJzaW9uIG51bWJlciBvZgorICogdGhlIGN1cnJlbnRseSBhY3RpdmUgZHJpdmVyLgorICovCisjZGVmaW5lIFNPVU5EX1ZFUlNJT04JMHgwMzA4MDIKKyNkZWZpbmUgT1BFTl9TT1VORF9TWVNURU0KKworLyogSW4gTGludXggd2UgbmVlZCB0byBiZSBwcmVwYXJlZCBmb3IgY3Jvc3MgY29tcGlsaW5nICovCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworLyogRW5kaWFuIG1hY3Jvcy4gKi8KKyMgIGluY2x1ZGUgPGVuZGlhbi5oPgorCisvKgorICoJU3VwcG9ydGVkIGNhcmQgSUQgbnVtYmVycyAoU2hvdWxkIGJlIHNvbWV3aGVyZSBlbHNlPykKKyAqLworCisjZGVmaW5lIFNORENBUkRfQURMSUIJCTEKKyNkZWZpbmUgU05EQ0FSRF9TQgkJMgorI2RlZmluZSBTTkRDQVJEX1BBUwkJMworI2RlZmluZSBTTkRDQVJEX0dVUwkJNAorI2RlZmluZSBTTkRDQVJEX01QVTQwMQkJNQorI2RlZmluZSBTTkRDQVJEX1NCMTYJCTYKKyNkZWZpbmUgU05EQ0FSRF9TQjE2TUlESQk3CisjZGVmaW5lIFNORENBUkRfVUFSVDY4NTAJOAorI2RlZmluZSBTTkRDQVJEX0dVUzE2CQk5CisjZGVmaW5lIFNORENBUkRfTVNTCQkxMAorI2RlZmluZSBTTkRDQVJEX1BTUyAgICAgCTExCisjZGVmaW5lIFNORENBUkRfU1NDQVBFCQkxMgorI2RlZmluZSBTTkRDQVJEX1BTU19NUFUgICAgIAkxMworI2RlZmluZSBTTkRDQVJEX1BTU19NU1MgICAgIAkxNAorI2RlZmluZSBTTkRDQVJEX1NTQ0FQRV9NU1MJMTUKKyNkZWZpbmUgU05EQ0FSRF9UUlhQUk8JCTE2CisjZGVmaW5lIFNORENBUkRfVFJYUFJPX1NCCTE3CisjZGVmaW5lIFNORENBUkRfVFJYUFJPX01QVQkxOAorI2RlZmluZSBTTkRDQVJEX01BRDE2CQkxOQorI2RlZmluZSBTTkRDQVJEX01BRDE2X01QVQkyMAorI2RlZmluZSBTTkRDQVJEX0NTNDIzMgkJMjEKKyNkZWZpbmUgU05EQ0FSRF9DUzQyMzJfTVBVCTIyCisjZGVmaW5lIFNORENBUkRfTUFVSQkJMjMKKyNkZWZpbmUgU05EQ0FSRF9QU0VVRE9fTVNTCTI0CisjZGVmaW5lIFNORENBUkRfR1VTUE5QCQkyNQorI2RlZmluZSBTTkRDQVJEX1VBUlQ0MDEJCTI2CisvKiBTb3VuZCBjYXJkIG51bWJlcnMgMjcgdG8gTiBhcmUgcmVzZXJ2ZWQuIERvbid0IGFkZCBtb3JlIG51bWJlcnMgaGVyZS4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJT0NUTCBDb21tYW5kcyBmb3IgL2Rldi9zZXF1ZW5jZXIKKyAqLworCisjaWZuZGVmIF9TSU9XUgorI2lmIGRlZmluZWQoX0lPV1IpICYmIChkZWZpbmVkKF9BSVgpIHx8ICghZGVmaW5lZChzdW4pICYmICFkZWZpbmVkKHNwYXJjKSAmJiAhZGVmaW5lZChfX3NwYXJjX18pICYmICFkZWZpbmVkKF9fSU5DaW9jdGxoKSAmJiAhZGVmaW5lZChfX0x5bnhfXykpKQorLyogVXNlIGFscmVhZHkgZGVmaW5lZCBpb2N0bCBkZWZpbmVzIGlmIHRoZXkgZXhpc3QgKGV4Y2VwdCB3aXRoIFN1biBvciBTcGFyYykgKi8KKyNkZWZpbmUJU0lPQ1BBUk1fTUFTSwlJT0NQQVJNX01BU0sKKyNkZWZpbmUJU0lPQ19WT0lECUlPQ19WT0lECisjZGVmaW5lCVNJT0NfT1VUCUlPQ19PVVQKKyNkZWZpbmUJU0lPQ19JTgkJSU9DX0lOCisjZGVmaW5lCVNJT0NfSU5PVVQJSU9DX0lOT1VUCisjZGVmaW5lIF9TSU9DX1NJWkUJX0lPQ19TSVpFCisjZGVmaW5lIF9TSU9DX0RJUglfSU9DX0RJUgorI2RlZmluZSBfU0lPQ19OT05FCV9JT0NfTk9ORQorI2RlZmluZSBfU0lPQ19SRUFECV9JT0NfUkVBRAorI2RlZmluZSBfU0lPQ19XUklURQlfSU9DX1dSSVRFCisjZGVmaW5lCV9TSU8JCV9JTworI2RlZmluZQlfU0lPUgkJX0lPUgorI2RlZmluZQlfU0lPVwkJX0lPVworI2RlZmluZQlfU0lPV1IJCV9JT1dSCisjZWxzZQorCisvKiBJb2N0bCdzIGhhdmUgdGhlIGNvbW1hbmQgZW5jb2RlZCBpbiB0aGUgbG93ZXIgd29yZCwKKyAqIGFuZCB0aGUgc2l6ZSBvZiBhbnkgaW4gb3Igb3V0IHBhcmFtZXRlcnMgaW4gdGhlIHVwcGVyCisgKiB3b3JkLiAgVGhlIGhpZ2ggMiBiaXRzIG9mIHRoZSB1cHBlciB3b3JkIGFyZSB1c2VkCisgKiB0byBlbmNvZGUgdGhlIGluL291dCBzdGF0dXMgb2YgdGhlIHBhcmFtZXRlcjsgZm9yIG5vdworICogd2UgcmVzdHJpY3QgcGFyYW1ldGVycyB0byBhdCBtb3N0IDgxOTEgYnl0ZXMuCisgKi8KKy8qICNkZWZpbmUJU0lPQ1RZUEUJCSgweGZmPDw4KSAqLworI2RlZmluZQlTSU9DUEFSTV9NQVNLCTB4MWZmZgkJLyogcGFyYW1ldGVycyBtdXN0IGJlIDwgODE5MiBieXRlcyAqLworI2RlZmluZQlTSU9DX1ZPSUQJMHgwMDAwMDAwMAkvKiBubyBwYXJhbWV0ZXJzICovCisjZGVmaW5lCVNJT0NfT1VUCTB4MjAwMDAwMDAJLyogY29weSBvdXQgcGFyYW1ldGVycyAqLworI2RlZmluZQlTSU9DX0lOCQkweDQwMDAwMDAwCS8qIGNvcHkgaW4gcGFyYW1ldGVycyAqLworI2RlZmluZQlTSU9DX0lOT1VUCShTSU9DX0lOfFNJT0NfT1VUKQorLyogdGhlIDB4MjAwMDAwMDAgaXMgc28gd2UgY2FuIGRpc3Rpbmd1aXNoIG5ldyBpb2N0bCdzIGZyb20gb2xkICovCisjZGVmaW5lCV9TSU8oeCx5KQkoKGludCkoU0lPQ19WT0lEfCh4PDw4KXx5KSkKKyNkZWZpbmUJX1NJT1IoeCx5LHQpCSgoaW50KShTSU9DX09VVHwoKHNpemVvZih0KSZTSU9DUEFSTV9NQVNLKTw8MTYpfCh4PDw4KXx5KSkKKyNkZWZpbmUJX1NJT1coeCx5LHQpCSgoaW50KShTSU9DX0lOfCgoc2l6ZW9mKHQpJlNJT0NQQVJNX01BU0spPDwxNil8KHg8PDgpfHkpKQorLyogdGhpcyBzaG91bGQgYmUgX1NJT1JXLCBidXQgc3RkaW8gZ290IHRoZXJlIGZpcnN0ICovCisjZGVmaW5lCV9TSU9XUih4LHksdCkJKChpbnQpKFNJT0NfSU5PVVR8KChzaXplb2YodCkmU0lPQ1BBUk1fTUFTSyk8PDE2KXwoeDw8OCl8eSkpCisjZGVmaW5lIF9TSU9DX1NJWkUoeCkJKCh4Pj4xNikmU0lPQ1BBUk1fTUFTSykJCisjZGVmaW5lIF9TSU9DX0RJUih4KQkoeCAmIDB4ZjAwMDAwMDApCisjZGVmaW5lIF9TSU9DX05PTkUJU0lPQ19WT0lECisjZGVmaW5lIF9TSU9DX1JFQUQJU0lPQ19PVVQKKyNkZWZpbmUgX1NJT0NfV1JJVEUJU0lPQ19JTgorIyAgZW5kaWYgLyogX0lPV1IgKi8KKyNlbmRpZiAgLyogIV9TSU9XUiAqLworCisjZGVmaW5lIFNORENUTF9TRVFfUkVTRVQJCV9TSU8gICgnUScsIDApCisjZGVmaW5lIFNORENUTF9TRVFfU1lOQwkJCV9TSU8gICgnUScsIDEpCisjZGVmaW5lIFNORENUTF9TWU5USF9JTkZPCQlfU0lPV1IoJ1EnLCAyLCBzdHJ1Y3Qgc3ludGhfaW5mbykKKyNkZWZpbmUgU05EQ1RMX1NFUV9DVFJMUkFURQkJX1NJT1dSKCdRJywgMywgaW50KQkvKiBTZXQvZ2V0IHRpbWVyIHJlc29sdXRpb24gKEhaKSAqLworI2RlZmluZSBTTkRDVExfU0VRX0dFVE9VVENPVU5UCQlfU0lPUiAoJ1EnLCA0LCBpbnQpCisjZGVmaW5lIFNORENUTF9TRVFfR0VUSU5DT1VOVAkJX1NJT1IgKCdRJywgNSwgaW50KQorI2RlZmluZSBTTkRDVExfU0VRX1BFUkNNT0RFCQlfU0lPVyAoJ1EnLCA2LCBpbnQpCisjZGVmaW5lIFNORENUTF9GTV9MT0FEX0lOU1RSCQlfU0lPVyAoJ1EnLCA3LCBzdHJ1Y3Qgc2JpX2luc3RydW1lbnQpCS8qIE9ic29sZXRlLiBEb24ndCB1c2UhISEhISEgKi8KKyNkZWZpbmUgU05EQ1RMX1NFUV9URVNUTUlESQkJX1NJT1cgKCdRJywgOCwgaW50KQorI2RlZmluZSBTTkRDVExfU0VRX1JFU0VUU0FNUExFUwkJX1NJT1cgKCdRJywgOSwgaW50KQorI2RlZmluZSBTTkRDVExfU0VRX05SU1lOVEhTCQlfU0lPUiAoJ1EnLDEwLCBpbnQpCisjZGVmaW5lIFNORENUTF9TRVFfTlJNSURJUwkJX1NJT1IgKCdRJywxMSwgaW50KQorI2RlZmluZSBTTkRDVExfTUlESV9JTkZPCQlfU0lPV1IoJ1EnLDEyLCBzdHJ1Y3QgbWlkaV9pbmZvKQorI2RlZmluZSBTTkRDVExfU0VRX1RIUkVTSE9MRAkJX1NJT1cgKCdRJywxMywgaW50KQorI2RlZmluZSBTTkRDVExfU1lOVEhfTUVNQVZMCQlfU0lPV1IoJ1EnLDE0LCBpbnQpCS8qIGluPWRldiMsIG91dD1tZW1zaXplICovCisjZGVmaW5lIFNORENUTF9GTV80T1BfRU5BQkxFCQlfU0lPVyAoJ1EnLDE1LCBpbnQpCS8qIGluPWRldiMgKi8KKyNkZWZpbmUgU05EQ1RMX1NFUV9QQU5JQwkJX1NJTyAgKCdRJywxNykKKyNkZWZpbmUgU05EQ1RMX1NFUV9PVVRPRkJBTkQJCV9TSU9XICgnUScsMTgsIHN0cnVjdCBzZXFfZXZlbnRfcmVjKQorI2RlZmluZSBTTkRDVExfU0VRX0dFVFRJTUUJCV9TSU9SICgnUScsMTksIGludCkKKyNkZWZpbmUgU05EQ1RMX1NZTlRIX0lECQkJX1NJT1dSKCdRJywyMCwgc3RydWN0IHN5bnRoX2luZm8pCisjZGVmaW5lIFNORENUTF9TWU5USF9DT05UUk9MCQlfU0lPV1IoJ1EnLDIxLCBzdHJ1Y3Qgc3ludGhfY29udHJvbCkKKyNkZWZpbmUgU05EQ1RMX1NZTlRIX1JFTU9WRVNBTVBMRQlfU0lPV1IoJ1EnLDIyLCBzdHJ1Y3QgcmVtb3ZlX3NhbXBsZSkKKwordHlwZWRlZiBzdHJ1Y3Qgc3ludGhfY29udHJvbAoreworCWludCBkZXZubzsJLyogU3ludGhlc2l6ZXIgIyAqLworCWNoYXIgZGF0YVs0MDAwXTsgLyogRGV2aWNlIHNwZXNpZmljIGNvbW1hbmQvZGF0YSByZWNvcmQgKi8KK31zeW50aF9jb250cm9sOworCit0eXBlZGVmIHN0cnVjdCByZW1vdmVfc2FtcGxlCit7CisJaW50IGRldm5vOwkvKiBTeW50aGVzaXplciAjICovCisJaW50IGJhbmtubzsJLyogTUlESSBiYW5rICMgKDA9R2VuZXJhbCBNSURJKSAqLworCWludCBpbnN0cm5vOwkvKiBNSURJIGluc3RydW1lbnQgbnVtYmVyICovCit9IHJlbW92ZV9zYW1wbGU7CisKK3R5cGVkZWYgc3RydWN0IHNlcV9ldmVudF9yZWMgeworCQl1bnNpZ25lZCBjaGFyIGFycls4XTsKK30gc2VxX2V2ZW50X3JlYzsKKworI2RlZmluZSBTTkRDVExfVE1SX1RJTUVCQVNFCQlfU0lPV1IoJ1QnLCAxLCBpbnQpCisjZGVmaW5lIFNORENUTF9UTVJfU1RBUlQJCV9TSU8gICgnVCcsIDIpCisjZGVmaW5lIFNORENUTF9UTVJfU1RPUAkJCV9TSU8gICgnVCcsIDMpCisjZGVmaW5lIFNORENUTF9UTVJfQ09OVElOVUUJCV9TSU8gICgnVCcsIDQpCisjZGVmaW5lIFNORENUTF9UTVJfVEVNUE8JCV9TSU9XUignVCcsIDUsIGludCkKKyNkZWZpbmUgU05EQ1RMX1RNUl9TT1VSQ0UJCV9TSU9XUignVCcsIDYsIGludCkKKyMJZGVmaW5lIFRNUl9JTlRFUk5BTAkJMHgwMDAwMDAwMQorIwlkZWZpbmUgVE1SX0VYVEVSTkFMCQkweDAwMDAwMDAyCisjCQlkZWZpbmUgVE1SX01PREVfTUlESQkweDAwMDAwMDEwCisjCQlkZWZpbmUgVE1SX01PREVfRlNLCTB4MDAwMDAwMjAKKyMJCWRlZmluZSBUTVJfTU9ERV9DTFMJMHgwMDAwMDA0MAorIwkJZGVmaW5lIFRNUl9NT0RFX1NNUFRFCTB4MDAwMDAwODAKKyNkZWZpbmUgU05EQ1RMX1RNUl9NRVRST05PTUUJCV9TSU9XICgnVCcsIDcsIGludCkKKyNkZWZpbmUgU05EQ1RMX1RNUl9TRUxFQ1QJCV9TSU9XICgnVCcsIDgsIGludCkKKworLyoKKyAqIFNvbWUgYmlnIGVuZGlhbi9saXR0bGUgZW5kaWFuIGhhbmRsaW5nIG1hY3JvcworICovCisKKyNkZWZpbmUgX0xJTlVYX1BBVENIS0VZX0hfSU5ESVJFQ1QKKyNpbmNsdWRlIDxsaW51eC9wYXRjaGtleS5oPgorI3VuZGVmIF9MSU5VWF9QQVRDSEtFWV9IX0lORElSRUNUCisKKyNpZiAgIGRlZmluZWQoX19CWVRFX09SREVSKQorIyAgaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyAgICBkZWZpbmUgQUZNVF9TMTZfTkUgQUZNVF9TMTZfQkUKKyMgIGVsaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyAgICBkZWZpbmUgQUZNVF9TMTZfTkUgQUZNVF9TMTZfTEUKKyMgIGVsc2UKKyMgICAgZXJyb3IgImNvdWxkIG5vdCBkZXRlcm1pbmUgYnl0ZSBvcmRlciIKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyAqCVNhbXBsZSBsb2FkaW5nIG1lY2hhbmlzbSBmb3IgaW50ZXJuYWwgc3ludGhlc2l6ZXJzICgvZGV2L3NlcXVlbmNlcikKKyAqCVRoZSBmb2xsb3dpbmcgcGF0Y2hfaW5mbyBzdHJ1Y3R1cmUgaGFzIGJlZW4gZGVzaWduZWQgdG8gc3VwcG9ydAorICoJR3JhdmlzIFVsdHJhU291bmQuIEl0IHRyaWVzIHRvIGJlIHVuaXZlcnNhbCBmb3JtYXQgZm9yIHVwbG9hZGluZworICoJc2FtcGxlIGJhc2VkIHBhdGNoZXMgYnV0IGlzIHByb2JhYmx5IHRvbyBsaW1pdGVkLgorICoKKyAqICAgICAgKFBCRCkgQXMgSGFubnUgZ3Vlc3NlZCwgdGhlIEdVUyBzdHJ1Y3R1cmUgaXMgdG9vIGxpbWl0ZWQgZm9yIAorICogICAgICB0aGUgV2F2ZUZyb250LCBidXQgdGhpcyBpcyB0aGUgcmlnaHQgcGxhY2UgZm9yIGEgY29uc3RhbnQgZGVmaW5pdGlvbi4KKyAqLworCitzdHJ1Y3QgcGF0Y2hfaW5mbyB7CisJCXVuc2lnbmVkIHNob3J0IGtleTsJCS8qIFVzZSBXQVZFX1BBVENIIGhlcmUgKi8KKyNkZWZpbmUgV0FWRV9QQVRDSAkgICBfUEFUQ0hLRVkoMHgwNCkKKyNkZWZpbmUgR1VTX1BBVENICSAgIFdBVkVfUEFUQ0gKKyNkZWZpbmUgV0FWRUZST05UX1BBVENIICAgIF9QQVRDSEtFWSgweDA2KQorCisJCXNob3J0IGRldmljZV9ubzsJLyogU3ludGhlc2l6ZXIgbnVtYmVyICovCisJCXNob3J0IGluc3RyX25vOwkJLyogTWlkaSBwZ20jICovCisKKwkJdW5zaWduZWQgaW50IG1vZGU7CisvKgorICogVGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgaGFzIHRoZSBzYW1lIGZvcm1hdCB0aGFuIHRoZSBHVVMgLlBBVAorICogZmlsZXMKKyAqLworI2RlZmluZSBXQVZFXzE2X0JJVFMJMHgwMQkvKiBiaXQgMCA9IDggb3IgMTYgYml0IHdhdmUgZGF0YS4gKi8KKyNkZWZpbmUgV0FWRV9VTlNJR05FRAkweDAyCS8qIGJpdCAxID0gU2lnbmVkIC0gVW5zaWduZWQgZGF0YS4gKi8KKyNkZWZpbmUgV0FWRV9MT09QSU5HCTB4MDQJLyogYml0IDIgPSBsb29waW5nIGVuYWJsZWQtMS4gKi8KKyNkZWZpbmUgV0FWRV9CSURJUl9MT09QCTB4MDgJLyogYml0IDMgPSBTZXQgaXMgYmlkaXJlY3Rpb25hbCBsb29waW5nLiAqLworI2RlZmluZSBXQVZFX0xPT1BfQkFDSwkweDEwCS8qIGJpdCA0ID0gU2V0IGlzIGxvb3BpbmcgYmFja3dhcmQuICovCisjZGVmaW5lIFdBVkVfU1VTVEFJTl9PTgkweDIwCS8qIGJpdCA1ID0gVHVybiBzdXN0YWluaW5nIG9uLiAoRW52LiBwdHMuIDMpKi8KKyNkZWZpbmUgV0FWRV9FTlZFTE9QRVMJMHg0MAkvKiBiaXQgNiA9IEVuYWJsZSBlbnZlbG9wZXMgLSAxICovCisjZGVmaW5lIFdBVkVfRkFTVF9SRUxFQVNFIDB4ODAJLyogYml0IDcgPSBTaHV0IG9mZiBpbW1lZGlhdGVseSBhZnRlciBub3RlIG9mZiAqLworCQkJCS8qIAkodXNlIHRoZSBlbnZfcmF0ZS9lbnZfb2ZmcyBmaWVsZHMpLiAqLworLyogTGludXggc3BlY2lmaWMgYml0cyAqLworI2RlZmluZSBXQVZFX1ZJQlJBVE8JMHgwMDAxMDAwMAkvKiBUaGUgdmlicmF0byBpbmZvIGlzIHZhbGlkICovCisjZGVmaW5lIFdBVkVfVFJFTU9MTwkweDAwMDIwMDAwCS8qIFRoZSB0cmVtb2xvIGluZm8gaXMgdmFsaWQgKi8KKyNkZWZpbmUgV0FWRV9TQ0FMRQkweDAwMDQwMDAwCS8qIFRoZSBzY2FsaW5nIGluZm8gaXMgdmFsaWQgKi8KKyNkZWZpbmUgV0FWRV9GUkFDVElPTlMJMHgwMDA4MDAwMAkvKiBGcmFjdGlvbiBpbmZvcm1hdGlvbiBpcyB2YWxpZCAqLworLyogUmVzZXJ2ZWQgYml0cyAqLworI2RlZmluZSBXQVZFX1JPTQkweDQwMDAwMDAwCS8qIEZvciBmdXR1cmUgdXNlICovCisjZGVmaW5lIFdBVkVfTVVMQVcJMHgyMDAwMDAwMAkvKiBGb3IgZnV0dXJlIHVzZSAqLworLyogT3RoZXIgYml0cyBtdXN0IGJlIHplcm9lZCAqLworCisJCWludCBsZW47CS8qIFNpemUgb2YgdGhlIHdhdmUgZGF0YSBpbiBieXRlcyAqLworCQlpbnQgbG9vcF9zdGFydCwgbG9vcF9lbmQ7IC8qIEJ5dGUgb2Zmc2V0cyBmcm9tIHRoZSBiZWdpbm5pbmcgKi8KKworLyogCisgKiBUaGUgYmFzZV9mcmVxIGFuZCBiYXNlX25vdGUgZmllbGRzIGFyZSB1c2VkIHdoZW4gY29tcHV0aW5nIHRoZQorICogcGxheWJhY2sgc3BlZWQgZm9yIGEgbm90ZS4gVGhlIGJhc2Vfbm90ZSBkZWZpbmVzIHRoZSB0b25lIGZyZXF1ZW5jeQorICogd2hpY2ggaXMgaGVhcmQgaWYgdGhlIHNhbXBsZSBpcyBwbGF5ZWQgdXNpbmcgdGhlIGJhc2VfZnJlcSBhcyB0aGUKKyAqIHBsYXliYWNrIHNwZWVkLgorICoKKyAqIFRoZSBsb3dfbm90ZSBhbmQgaGlnaF9ub3RlIGZpZWxkcyBkZWZpbmUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gbm90ZQorICogZnJlcXVlbmNpZXMgZm9yIHdoaWNoIHRoaXMgc2FtcGxlIGlzIHZhbGlkLiBJdCBpcyBwb3NzaWJsZSB0byBkZWZpbmUKKyAqIG1vcmUgdGhhbiBvbmUgc2FtcGxlcyBmb3IgYW4gaW5zdHJ1bWVudCBudW1iZXIgYXQgdGhlIHNhbWUgdGltZS4gVGhlCisgKiBsb3dfbm90ZSBhbmQgaGlnaF9ub3RlIGZpZWxkcyBhcmUgdXNlZCB0byBzZWxlY3QgdGhlIG1vc3Qgc3VpdGFibGUgb25lLgorICoKKyAqIFRoZSBmaWVsZHMgYmFzZV9ub3RlLCBoaWdoX25vdGUgYW5kIGxvd19ub3RlIHNob3VsZCBjb250YWluCisgKiB0aGUgbm90ZSBmcmVxdWVuY3kgbXVsdGlwbGllZCBieSAxMDAwLiBGb3IgZXhhbXBsZSB2YWx1ZSBmb3IgdGhlCisgKiBtaWRkbGUgQSBpcyA0NDAqMTAwMC4KKyAqLworCisJCXVuc2lnbmVkIGludCBiYXNlX2ZyZXE7CisJCXVuc2lnbmVkIGludCBiYXNlX25vdGU7CisJCXVuc2lnbmVkIGludCBoaWdoX25vdGU7CisJCXVuc2lnbmVkIGludCBsb3dfbm90ZTsKKwkJaW50IHBhbm5pbmc7CS8qIC0xMjg9bGVmdCwgMTI3PXJpZ2h0ICovCisJCWludCBkZXR1bmluZzsKKworLyoJTmV3IGZpZWxkcyBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS45OS41CSovCisKKyAgICAgICAvKiBFbnZlbG9wZS4gRW5hYmxlZCBieSBtb2RlIGJpdCBXQVZFX0VOVkVMT1BFUwkqLworCQl1bnNpZ25lZCBjaGFyCWVudl9yYXRlWyA2IF07CSAvKiBHVVMgSFcgcmFtcGluZyByYXRlICovCisJCXVuc2lnbmVkIGNoYXIJZW52X29mZnNldFsgNiBdOyAvKiAyNTUgPT0gMTAwJSAqLworCisJLyogCisJICogVGhlIHRyZW1vbG8sIHZpYnJhdG8gYW5kIHNjYWxlIGluZm8gYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgorCSAqIEVuYWJsZSBieSBzZXR0aW5nIHRoZSBtb2RlIGJpdHMgV0FWRV9UUkVNT0xPLCBXQVZFX1ZJQlJBVE8gb3IKKwkgKiBXQVZFX1NDQUxFCisJICovCisKKwkJdW5zaWduZWQgY2hhcgl0cmVtb2xvX3N3ZWVwOworCQl1bnNpZ25lZCBjaGFyCXRyZW1vbG9fcmF0ZTsKKwkJdW5zaWduZWQgY2hhcgl0cmVtb2xvX2RlcHRoOworCQorCQl1bnNpZ25lZCBjaGFyCXZpYnJhdG9fc3dlZXA7CisJCXVuc2lnbmVkIGNoYXIJdmlicmF0b19yYXRlOworCQl1bnNpZ25lZCBjaGFyCXZpYnJhdG9fZGVwdGg7CisKKwkJaW50CQlzY2FsZV9mcmVxdWVuY3k7CisJCXVuc2lnbmVkIGludAlzY2FsZV9mYWN0b3I7CQkvKiBmcm9tIDAgdG8gMjA0OCBvciAwIHRvIDIgKi8KKwkKKwkgICAgICAgIGludAkJdm9sdW1lOworCQlpbnQJCWZyYWN0aW9uczsKKwkJaW50CQlyZXNlcnZlZDE7CisJICAgICAgICBpbnQJCXNwYXJlWzJdOworCQljaGFyIGRhdGFbMV07CS8qIFRoZSB3YXZlZm9ybSBkYXRhIHN0YXJ0cyBoZXJlICovCisJfTsKKworc3RydWN0IHN5c2V4X2luZm8geworCQlzaG9ydCBrZXk7CQkvKiBVc2UgU1lTRVhfUEFUQ0ggb3IgTUFVSV9QQVRDSCBoZXJlICovCisjZGVmaW5lIFNZU0VYX1BBVENICV9QQVRDSEtFWSgweDA1KQorI2RlZmluZSBNQVVJX1BBVENICV9QQVRDSEtFWSgweDA2KQorCQlzaG9ydCBkZXZpY2Vfbm87CS8qIFN5bnRoZXNpemVyIG51bWJlciAqLworCQlpbnQgbGVuOwkvKiBTaXplIG9mIHRoZSBzeXNleCBkYXRhIGluIGJ5dGVzICovCisJCXVuc2lnbmVkIGNoYXIgZGF0YVsxXTsJLyogU3lzZXggZGF0YSBzdGFydHMgaGVyZSAqLworCX07CisKKy8qCisgKiAvZGV2L3NlcXVlbmNlciBpbnB1dCBldmVudHMuCisgKgorICogVGhlIGRhdGEgd3JpdHRlbiB0byB0aGUgL2Rldi9zZXF1ZW5jZXIgaXMgYSBzdHJlYW0gb2YgZXZlbnRzLiBFdmVudHMKKyAqIGFyZSByZWNvcmRzIG9mIDQgb3IgOCBieXRlcy4gVGhlIGZpcnN0IGJ5dGUgZGVmaW5lcyB0aGUgc2l6ZS4gCisgKiBBbnkgbnVtYmVyIG9mIGV2ZW50cyBjYW4gYmUgd3JpdHRlbiB3aXRoIGEgd3JpdGUgY2FsbC4gVGhlcmUKKyAqIGlzIGEgc2V0IG9mIG1hY3JvcyBmb3Igc2VuZGluZyB0aGVzZSBldmVudHMuIFVzZSB0aGVzZSBtYWNyb3MgaWYgeW91CisgKiB3YW50IHRvIG1heGltaXplIHBvcnRhYmlsaXR5IG9mIHlvdXIgcHJvZ3JhbS4KKyAqCisgKiBFdmVudHMgU0VRX1dBSVQsIFNFUV9NSURJUFVUQyBhbmQgU0VRX0VDSE8uIEFyZSBhbHNvIGlucHV0IGV2ZW50cy4KKyAqIChBbGwgaW5wdXQgZXZlbnRzIGFyZSBjdXJyZW50bHkgNCBieXRlcyBsb25nLiBCZSBwcmVwYXJlZCB0byBzdXBwb3J0CisgKiA4IGJ5dGUgZXZlbnRzIGFsc28uIElmIHlvdSByZWNlaXZlIGFueSBldmVudCBoYXZpbmcgZmlyc3QgYnl0ZSA+PSAxMjgsCisgKiBpdCdzIGEgOCBieXRlIGV2ZW50LgorICoKKyAqIFRoZSBldmVudHMgYXJlIGRvY3VtZW50ZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisgKgorICogTm9ybWFsIGV2ZW50cyAoNCBieXRlcykKKyAqIFRoZXJlIGlzIGFsc28gYSA4IGJ5dGUgdmVyc2lvbiBvZiBtb3N0IG9mIHRoZSA0IGJ5dGUgZXZlbnRzLiBUaGUKKyAqIDggYnl0ZSBvbmUgaXMgcmVjb21tZW5kZWQuCisgKi8KKyNkZWZpbmUgU0VRX05PVEVPRkYJCTAKKyNkZWZpbmUgU0VRX0ZNTk9URU9GRgkJU0VRX05PVEVPRkYJLyogSnVzdCBvbGQgbmFtZSAqLworI2RlZmluZSBTRVFfTk9URU9OCQkxCisjZGVmaW5lCVNFUV9GTU5PVEVPTgkJU0VRX05PVEVPTgorI2RlZmluZSBTRVFfV0FJVAkJVE1SX1dBSVRfQUJTCisjZGVmaW5lIFNFUV9QR01DSEFOR0UJCTMKKyNkZWZpbmUgU0VRX0ZNUEdNQ0hBTkdFCQlTRVFfUEdNQ0hBTkdFCisjZGVmaW5lIFNFUV9TWU5DVElNRVIJCVRNUl9TVEFSVAorI2RlZmluZSBTRVFfTUlESVBVVEMJCTUKKyNkZWZpbmUgU0VRX0RSVU1PTgkJNgkvKioqIE9CU09MRVRFICoqKi8KKyNkZWZpbmUgU0VRX0RSVU1PRkYJCTcJLyoqKiBPQlNPTEVURSAqKiovCisjZGVmaW5lIFNFUV9FQ0hPCQlUTVJfRUNITwkvKiBGb3Igc3luY2hpbmcgcHJvZ3JhbXMgd2l0aCBvdXRwdXQgKi8KKyNkZWZpbmUgU0VRX0FGVEVSVE9VQ0gJCTkKKyNkZWZpbmUgU0VRX0NPTlRST0xMRVIJCTEwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglNaWRpIGNvbnRyb2xsZXIgbnVtYmVycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbnRyb2xsZXJzIDAgdG8gMzEgKDB4MDAgdG8gMHgxZikgYW5kCisgKiAzMiB0byA2MyAoMHgyMCB0byAweDNmKSBhcmUgY29udGludW91cworICogY29udHJvbGxlcnMuCisgKiBJbiB0aGUgTUlESSAxLjAgdGhlc2UgY29udHJvbGxlcnMgYXJlIHNlbnQgdXNpbmcKKyAqIHR3byBtZXNzYWdlcy4gQ29udHJvbGxlciBudW1iZXJzIDAgdG8gMzEgYXJlIHVzZWQKKyAqIHRvIHNlbmQgdGhlIE1TQiBhbmQgdGhlIGNvbnRyb2xsZXIgbnVtYmVycyAzMiB0byA2MworICogYXJlIGZvciB0aGUgTFNCLiBOb3RlIHRoYXQganVzdCA3IGJpdHMgYXJlIHVzZWQgaW4gTUlESSBieXRlcy4KKyAqLworCisjZGVmaW5lCSAgIENUTF9CQU5LX1NFTEVDVAkJMHgwMAorI2RlZmluZQkgICBDVExfTU9EV0hFRUwJCQkweDAxCisjZGVmaW5lICAgIENUTF9CUkVBVEgJCQkweDAyCisvKgkJdW5kZWZpbmVkCQkweDAzICovCisjZGVmaW5lICAgIENUTF9GT09UCQkJMHgwNAorI2RlZmluZSAgICBDVExfUE9SVEFNRU5UT19USU1FCQkweDA1CisjZGVmaW5lICAgIENUTF9EQVRBX0VOVFJZCQkweDA2CisjZGVmaW5lICAgIENUTF9NQUlOX1ZPTFVNRQkJMHgwNworI2RlZmluZSAgICBDVExfQkFMQU5DRQkJCTB4MDgKKy8qCQl1bmRlZmluZWQJCTB4MDkgKi8KKyNkZWZpbmUgICAgQ1RMX1BBTgkJCTB4MGEKKyNkZWZpbmUgICAgQ1RMX0VYUFJFU1NJT04JCTB4MGIKKy8qCQl1bmRlZmluZWQJCTB4MGMgKi8KKy8qCQl1bmRlZmluZWQJCTB4MGQgKi8KKy8qCQl1bmRlZmluZWQJCTB4MGUgKi8KKy8qCQl1bmRlZmluZWQJCTB4MGYgKi8KKyNkZWZpbmUgICAgQ1RMX0dFTkVSQUxfUFVSUE9TRTEJMHgxMAorI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFMgkweDExCisjZGVmaW5lICAgIENUTF9HRU5FUkFMX1BVUlBPU0UzCTB4MTIKKyNkZWZpbmUgICAgQ1RMX0dFTkVSQUxfUFVSUE9TRTQJMHgxMworLyoJCXVuZGVmaW5lZAkJMHgxNCAtIDB4MWYgKi8KKworLyoJCXVuZGVmaW5lZAkJMHgyMCAqLworLyogVGhlIGNvbnRyb2xsZXIgbnVtYmVycyAweDIxIHRvIDB4M2YgYXJlIHJlc2VydmVkIGZvciB0aGUgKi8KKy8qIGxlYXN0IHNpZ25pZmljYW50IGJ5dGVzIG9mIHRoZSBjb250cm9sbGVycyAweDAwIHRvIDB4MWYuICovCisvKiBUaGVzZSBjb250cm9sbGVycyBhcmUgbm90IHJlY29nbmlzZWQgYnkgdGhlIGRyaXZlci4gKi8KKworLyogQ29udHJvbGxlcnMgNjQgdG8gNjkgKDB4NDAgdG8gMHg0NSkgYXJlIG9uL29mZiBzd2l0Y2hlcy4gKi8KKy8qIDA9T0ZGIGFuZCAxMjc9T04gKGludGVybWVkaWF0ZSB2YWx1ZXMgYXJlIHBvc3NpYmxlKSAqLworI2RlZmluZSAgICBDVExfREFNUEVSX1BFREFMCQkweDQwCisjZGVmaW5lICAgIENUTF9TVVNUQUlOCQkJMHg0MAkvKiBBbGlhcyAqLworI2RlZmluZSAgICBDVExfSE9MRAkJCTB4NDAJLyogQWxpYXMgKi8KKyNkZWZpbmUgICAgQ1RMX1BPUlRBTUVOVE8JCTB4NDEKKyNkZWZpbmUgICAgQ1RMX1NPU1RFTlVUTwkJMHg0MgorI2RlZmluZSAgICBDVExfU09GVF9QRURBTAkJMHg0MworLyoJCXVuZGVmaW5lZAkJMHg0NCAqLworI2RlZmluZSAgICBDVExfSE9MRDIJCQkweDQ1CisvKgkJdW5kZWZpbmVkCQkweDQ2IC0gMHg0ZiAqLworCisjZGVmaW5lICAgIENUTF9HRU5FUkFMX1BVUlBPU0U1CTB4NTAKKyNkZWZpbmUgICAgQ1RMX0dFTkVSQUxfUFVSUE9TRTYJMHg1MQorI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFNwkweDUyCisjZGVmaW5lICAgIENUTF9HRU5FUkFMX1BVUlBPU0U4CTB4NTMKKy8qCQl1bmRlZmluZWQJCTB4NTQgLSAweDVhICovCisjZGVmaW5lICAgIENUTF9FWFRfRUZGX0RFUFRICQkweDViCisjZGVmaW5lICAgIENUTF9UUkVNT0xPX0RFUFRICQkweDVjCisjZGVmaW5lICAgIENUTF9DSE9SVVNfREVQVEgJCTB4NWQKKyNkZWZpbmUgICAgQ1RMX0RFVFVORV9ERVBUSAkJMHg1ZQorI2RlZmluZSAgICBDVExfQ0VMRVNURV9ERVBUSAkJMHg1ZQkvKiBBbGlhcyBmb3IgdGhlIGFib3ZlIG9uZSAqLworI2RlZmluZSAgICBDVExfUEhBU0VSX0RFUFRICQkweDVmCisjZGVmaW5lICAgIENUTF9EQVRBX0lOQ1JFTUVOVAkJMHg2MAorI2RlZmluZSAgICBDVExfREFUQV9ERUNSRU1FTlQJCTB4NjEKKyNkZWZpbmUgICAgQ1RMX05PTlJFR19QQVJNX05VTV9MU0IJMHg2MgorI2RlZmluZSAgICBDVExfTk9OUkVHX1BBUk1fTlVNX01TQgkweDYzCisjZGVmaW5lICAgIENUTF9SRUdJU1RfUEFSTV9OVU1fTFNCCTB4NjQKKyNkZWZpbmUgICAgQ1RMX1JFR0lTVF9QQVJNX05VTV9NU0IJMHg2NQorLyoJCXVuZGVmaW5lZAkJMHg2NiAtIDB4NzggKi8KKy8qCQlyZXNlcnZlZAkJMHg3OSAtIDB4N2YgKi8KKworLyogUHNldWRvIGNvbnRyb2xsZXJzIChub3QgbWlkaSBjb21wYXRpYmxlKSAqLworI2RlZmluZSAgICBDVFJMX1BJVENIX0JFTkRFUgkJMjU1CisjZGVmaW5lICAgIENUUkxfUElUQ0hfQkVOREVSX1JBTkdFCTI1NAorI2RlZmluZSAgICBDVFJMX0VYUFJFU1NJT04JCTI1MwkvKiBPYnNvbGV0ZSAqLworI2RlZmluZSAgICBDVFJMX01BSU5fVk9MVU1FCQkyNTIJLyogT2Jzb2xldGUgKi8KKyNkZWZpbmUgU0VRX0JBTEFOQ0UJCTExCisjZGVmaW5lIFNFUV9WT0xNT0RFICAgICAgICAgICAgIDEyCisKKy8qCisgKiBWb2x1bWUgbW9kZSBkZWNpZGVzIGhvdyB2b2x1bWVzIGFyZSB1c2VkCisgKi8KKworI2RlZmluZSBWT0xfTUVUSE9EX0FEQUdJTwkxCisjZGVmaW5lIFZPTF9NRVRIT0RfTElORUFSCTIKKworLyoKKyAqIE5vdGUhIFNFUV9XQUlULCBTRVFfTUlESVBVVEMgYW5kIFNFUV9FQ0hPIGFyZSB1c2VkIGFsc28gYXMKKyAqCSBpbnB1dCBldmVudHMuCisgKi8KKworLyoKKyAqIEV2ZW50IGNvZGVzIDB4ZjAgdG8gMHhmYyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zLgorICovCisKKyNkZWZpbmUgU0VRX0ZVTExTSVpFCQkweGZkCS8qIExvbmcgZXZlbnRzICovCisvKgorICoJU0VRX0ZVTExTSVpFIGV2ZW50cyBhcmUgdXNlZCBmb3IgbG9hZGluZyBwYXRjaGVzL3NhbXBsZXMgdG8gdGhlCisgKglzeW50aGVzaXplciBkZXZpY2VzLiBUaGVzZSBldmVudHMgYXJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgZHJpdmVyCisgKglvZiB0aGUgYXNzb2NpYXRlZCBzeW50aGVzaXplciBkZXZpY2UuIFRoZXJlIGlzIG5vIGxpbWl0IHRvIHRoZSBzaXplCisgKglvZiB0aGUgZXh0ZW5kZWQgZXZlbnRzLiBUaGVzZSBldmVudHMgYXJlIG5vdCBxdWV1ZWQgYnV0IGV4ZWN1dGVkCisgKglpbW1lZGlhdGVseSB3aGVuIHRoZSB3cml0ZSgpIGlzIGNhbGxlZCAoZXhlY3V0aW9uIGNhbiB0YWtlIHNldmVyYWwKKyAqCXNlY29uZHMgb2YgdGltZSkuIAorICoKKyAqCVdoZW4gYSBTRVFfRlVMTFNJWkUgbWVzc2FnZSBpcyB3cml0dGVuIHRvIHRoZSBkZXZpY2UsIGl0IG11c3QKKyAqCWJlIHdyaXR0ZW4gdXNpbmcgZXhhY3RseSBvbmUgd3JpdGUoKSBjYWxsLiBPdGhlciBldmVudHMgY2Fubm90CisgKgliZSBtaXhlZCB0byB0aGUgc2FtZSB3cml0ZS4KKyAqCQorICoJRm9yIEZNIHN5bnRocyAoWU0zODEyL09QTDMpIHVzZSBzdHJ1Y3Qgc2JpX2luc3RydW1lbnQgYW5kIHdyaXRlIGl0IHRvIHRoZSAKKyAqCS9kZXYvc2VxdWVuY2VyLiBEb24ndCB3cml0ZSBvdGhlciBkYXRhIHRvZ2V0aGVyIHdpdGggdGhlIGluc3RydW1lbnQgc3RydWN0dXJlCisgKglTZXQgdGhlIGtleSBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIHRvIEZNX1BBVENILiBUaGUgZGV2aWNlIGZpZWxkIGlzIHVzZWQgdG8KKyAqCXJvdXRlIHRoZSBwYXRjaCB0byB0aGUgY29ycmVzcG9uZGluZyBkZXZpY2UuCisgKgorICoJRm9yIHdhdmUgdGFibGUgdXNlIHN0cnVjdCBwYXRjaF9pbmZvLiBJbml0aWFsaXplIHRoZSBrZXkgZmllbGQKKyAqICAgICAgdG8gV0FWRV9QQVRDSC4KKyAqLworI2RlZmluZSBTRVFfUFJJVkFURQkJMHhmZQkvKiBMb3cgbGV2ZWwgSFcgZGVwZW5kZW50IGV2ZW50cyAoOCBieXRlcykgKi8KKyNkZWZpbmUgU0VRX0VYVEVOREVECQkweGZmCS8qIEV4dGVuZGVkIGV2ZW50cyAoOCBieXRlcykgT0JTT0xFVEUgKi8KKworLyoKKyAqIFJlY29yZCBmb3IgRk0gcGF0Y2hlcworICovCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBzYmlfaW5zdHJfZGF0YVszMl07CisKK3N0cnVjdCBzYmlfaW5zdHJ1bWVudCB7CisJCXVuc2lnbmVkIHNob3J0CWtleTsJLyogRk1fUEFUQ0ggb3IgT1BMM19QQVRDSCAqLworI2RlZmluZSBGTV9QQVRDSAlfUEFUQ0hLRVkoMHgwMSkKKyNkZWZpbmUgT1BMM19QQVRDSAlfUEFUQ0hLRVkoMHgwMykKKwkJc2hvcnQJCWRldmljZTsJCS8qCVN5bnRoIyAoMC00KQkqLworCQlpbnQgCQljaGFubmVsOwkvKglQcm9ncmFtIyB0byBiZSBpbml0aWFsaXplZCAJKi8KKwkJc2JpX2luc3RyX2RhdGEJb3BlcmF0b3JzOwkvKglSZWdpc3RlciBzZXR0aW5ncyBmb3Igb3BlcmF0b3IgY2VsbHMgKC5TQkkgZm9ybWF0KQkqLworCX07CisKK3N0cnVjdCBzeW50aF9pbmZvIHsJLyogUmVhZCBvbmx5ICovCisJCWNoYXIJbmFtZVszMF07CisJCWludAlkZXZpY2U7CQkvKiAwLU4uIElOSVRJQUxJWkUgQkVGT1JFIENBTExJTkcgKi8KKwkJaW50CXN5bnRoX3R5cGU7CisjZGVmaW5lIFNZTlRIX1RZUEVfRk0JCQkwCisjZGVmaW5lIFNZTlRIX1RZUEVfU0FNUExFCQkxCisjZGVmaW5lIFNZTlRIX1RZUEVfTUlESQkJCTIJLyogTWlkaSBpbnRlcmZhY2UgKi8KKworCQlpbnQJc3ludGhfc3VidHlwZTsKKyNkZWZpbmUgRk1fVFlQRV9BRExJQgkJCTB4MDAKKyNkZWZpbmUgRk1fVFlQRV9PUEwzCQkJMHgwMQorI2RlZmluZSBNSURJX1RZUEVfTVBVNDAxCQkweDQwMQorCisjZGVmaW5lIFNBTVBMRV9UWVBFX0JBU0lDCQkweDEwCisjZGVmaW5lIFNBTVBMRV9UWVBFX0dVUwkJCVNBTVBMRV9UWVBFX0JBU0lDCisjZGVmaW5lIFNBTVBMRV9UWVBFX1dBVkVGUk9OVCAgICAgICAgICAgMHgxMQorCisJCWludAlwZXJjX21vZGU7CS8qIE5vIGxvbmdlciBzdXBwb3J0ZWQgKi8KKwkJaW50CW5yX3ZvaWNlczsKKwkJaW50CW5yX2RydW1zOwkvKiBPYnNvbGV0ZSBmaWVsZCAqLworCQlpbnQJaW5zdHJfYmFua19zaXplOworCQl1bnNpZ25lZCBpbnQJY2FwYWJpbGl0aWVzOwkKKyNkZWZpbmUgU1lOVEhfQ0FQX1BFUkNNT0RFCQkweDAwMDAwMDAxIC8qIE5vIGxvbmdlciB1c2VkICovCisjZGVmaW5lIFNZTlRIX0NBUF9PUEwzCQkJMHgwMDAwMDAwMiAvKiBTZXQgaWYgT1BMMyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU1lOVEhfQ0FQX0lOUFVUCQkJMHgwMDAwMDAwNCAvKiBJbnB1dCAoTUlESSkgZGV2aWNlICovCisJCWludAlkdW1taWVzWzE5XTsJLyogUmVzZXJ2ZSBzcGFjZSAqLworCX07CisKK3N0cnVjdCBzb3VuZF90aW1lcl9pbmZvIHsKKwkJY2hhciBuYW1lWzMyXTsKKwkJaW50IGNhcHM7CisJfTsKKworI2RlZmluZSBNSURJX0NBUF9NUFU0MDEJCTEJCS8qIE1QVS00MDEgaW50ZWxsaWdlbnQgbW9kZSAqLworCitzdHJ1Y3QgbWlkaV9pbmZvIHsKKwkJY2hhcgkJbmFtZVszMF07CisJCWludAkJZGV2aWNlOwkJLyogMC1OLiBJTklUSUFMSVpFIEJFRk9SRSBDQUxMSU5HICovCisJCXVuc2lnbmVkIGludAljYXBhYmlsaXRpZXM7CS8qIFRvIGJlIGRlZmluZWQgbGF0ZXIgKi8KKwkJaW50CQlkZXZfdHlwZTsKKwkJaW50CQlkdW1taWVzWzE4XTsJLyogUmVzZXJ2ZSBzcGFjZSAqLworCX07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW9jdGwgY29tbWFuZHMgZm9yIHRoZSAvZGV2L21pZGkjIworICovCit0eXBlZGVmIHN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kOworCQljaGFyIG5yX2FyZ3MsIG5yX3JldHVybnM7CisJCXVuc2lnbmVkIGNoYXIgZGF0YVszMF07CisJfSBtcHVfY29tbWFuZF9yZWM7CisKKyNkZWZpbmUgU05EQ1RMX01JRElfUFJFVElNRQkJX1NJT1dSKCdtJywgMCwgaW50KQorI2RlZmluZSBTTkRDVExfTUlESV9NUFVNT0RFCQlfU0lPV1IoJ20nLCAxLCBpbnQpCisjZGVmaW5lIFNORENUTF9NSURJX01QVUNNRAkJX1NJT1dSKCdtJywgMiwgbXB1X2NvbW1hbmRfcmVjKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElPQ1RMIGNvbW1hbmRzIGZvciAvZGV2L2RzcCBhbmQgL2Rldi9hdWRpbworICovCisKKyNkZWZpbmUgU05EQ1RMX0RTUF9SRVNFVAkJX1NJTyAgKCdQJywgMCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TWU5DCQkJX1NJTyAgKCdQJywgMSkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TUEVFRAkJX1NJT1dSKCdQJywgMiwgaW50KQorI2RlZmluZSBTTkRDVExfRFNQX1NURVJFTwkJX1NJT1dSKCdQJywgMywgaW50KQorI2RlZmluZSBTTkRDVExfRFNQX0dFVEJMS1NJWkUJCV9TSU9XUignUCcsIDQsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TQU1QTEVTSVpFCQlTTkRDVExfRFNQX1NFVEZNVAorI2RlZmluZSBTTkRDVExfRFNQX0NIQU5ORUxTCQlfU0lPV1IoJ1AnLCA2LCBpbnQpCisjZGVmaW5lIFNPVU5EX1BDTV9XUklURV9DSEFOTkVMUwlTTkRDVExfRFNQX0NIQU5ORUxTCisjZGVmaW5lIFNPVU5EX1BDTV9XUklURV9GSUxURVIJCV9TSU9XUignUCcsIDcsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9QT1NUCQkJX1NJTyAgKCdQJywgOCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TVUJESVZJREUJCV9TSU9XUignUCcsIDksIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVAkJX1NJT1dSKCdQJywxMCwgaW50KQorCisvKglBdWRpbyBkYXRhIGZvcm1hdHMgKE5vdGUhIFU4PTggYW5kIFMxNl9MRT0xNiBmb3IgY29tcGF0aWJpbGl0eSkgKi8KKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRGTVRTCQlfU0lPUiAoJ1AnLDExLCBpbnQpIC8qIFJldHVybnMgYSBtYXNrICovCisjZGVmaW5lIFNORENUTF9EU1BfU0VURk1UCQlfU0lPV1IoJ1AnLDUsIGludCkgLyogU2VsZWN0cyBPTkUgZm10Ki8KKyMJZGVmaW5lIEFGTVRfUVVFUlkJCTB4MDAwMDAwMDAJLyogUmV0dXJuIGN1cnJlbnQgZm10ICovCisjCWRlZmluZSBBRk1UX01VX0xBVwkJMHgwMDAwMDAwMQorIwlkZWZpbmUgQUZNVF9BX0xBVwkJMHgwMDAwMDAwMgorIwlkZWZpbmUgQUZNVF9JTUFfQURQQ00JCTB4MDAwMDAwMDQKKyMJZGVmaW5lIEFGTVRfVTgJCQkweDAwMDAwMDA4CisjCWRlZmluZSBBRk1UX1MxNl9MRQkJMHgwMDAwMDAxMAkvKiBMaXR0bGUgZW5kaWFuIHNpZ25lZCAxNiovCisjCWRlZmluZSBBRk1UX1MxNl9CRQkJMHgwMDAwMDAyMAkvKiBCaWcgZW5kaWFuIHNpZ25lZCAxNiAqLworIwlkZWZpbmUgQUZNVF9TOAkJCTB4MDAwMDAwNDAKKyMJZGVmaW5lIEFGTVRfVTE2X0xFCQkweDAwMDAwMDgwCS8qIExpdHRsZSBlbmRpYW4gVTE2ICovCisjCWRlZmluZSBBRk1UX1UxNl9CRQkJMHgwMDAwMDEwMAkvKiBCaWcgZW5kaWFuIFUxNiAqLworIwlkZWZpbmUgQUZNVF9NUEVHCQkweDAwMDAwMjAwCS8qIE1QRUcgKDIpIGF1ZGlvICovCisjCWRlZmluZSBBRk1UX0FDMwkJMHgwMDAwMDQwMAkvKiBEb2xieSBEaWdpdGFsIEFDMyAqLworCisvKgorICogQnVmZmVyIHN0YXR1cyBxdWVyaWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBhdWRpb19idWZfaW5mbyB7CisJCQlpbnQgZnJhZ21lbnRzOwkvKiAjIG9mIGF2YWlsYWJsZSBmcmFnbWVudHMgKHBhcnRpYWxseSB1c2VuZCBvbmVzIG5vdCBjb3VudGVkKSAqLworCQkJaW50IGZyYWdzdG90YWw7CS8qIFRvdGFsICMgb2YgZnJhZ21lbnRzIGFsbG9jYXRlZCAqLworCQkJaW50IGZyYWdzaXplOwkvKiBTaXplIG9mIGEgZnJhZ21lbnQgaW4gYnl0ZXMgKi8KKworCQkJaW50IGJ5dGVzOwkvKiBBdmFpbGFibGUgc3BhY2UgaW4gYnl0ZXMgKGluY2x1ZGVzIHBhcnRpYWxseSB1c2VkIGZyYWdtZW50cykgKi8KKwkJCS8qIE5vdGUhICdieXRlcycgY291bGQgYmUgbW9yZSB0aGFuIGZyYWdtZW50cypmcmFnc2l6ZSAqLworCQl9IGF1ZGlvX2J1Zl9pbmZvOworCisjZGVmaW5lIFNORENUTF9EU1BfR0VUT1NQQUNFCQlfU0lPUiAoJ1AnLDEyLCBhdWRpb19idWZfaW5mbykKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRJU1BBQ0UJCV9TSU9SICgnUCcsMTMsIGF1ZGlvX2J1Zl9pbmZvKQorI2RlZmluZSBTTkRDVExfRFNQX05PTkJMT0NLCQlfU0lPICAoJ1AnLDE0KQorI2RlZmluZSBTTkRDVExfRFNQX0dFVENBUFMJCV9TSU9SICgnUCcsMTUsIGludCkKKyMJZGVmaW5lIERTUF9DQVBfUkVWSVNJT04JCTB4MDAwMDAwZmYJLyogQml0cyBmb3IgcmV2aXNpb24gbGV2ZWwgKDAgdG8gMjU1KSAqLworIwlkZWZpbmUgRFNQX0NBUF9EVVBMRVgJCTB4MDAwMDAxMDAJLyogRnVsbCBkdXBsZXggcmVjb3JkL3BsYXliYWNrICovCisjCWRlZmluZSBEU1BfQ0FQX1JFQUxUSU1FCQkweDAwMDAwMjAwCS8qIFJlYWwgdGltZSBjYXBhYmlsaXR5ICovCisjCWRlZmluZSBEU1BfQ0FQX0JBVENICQkweDAwMDAwNDAwCS8qIERldmljZSBoYXMgc29tZSBraW5kIG9mICovCisJCQkJCQkJLyogaW50ZXJuYWwgYnVmZmVycyB3aGljaCBtYXkgKi8KKwkJCQkJCQkvKiBjYXVzZSBzb21lIGRlbGF5cyBhbmQgKi8KKwkJCQkJCQkvKiBkZWNyZWFzZSBwcmVjaXNpb24gb2YgdGltaW5nICovCisjCWRlZmluZSBEU1BfQ0FQX0NPUFJPQwkJMHgwMDAwMDgwMAkvKiBIYXMgYSBjb3Byb2Nlc3NvciAqLworCQkJCQkJCS8qIFNvbWV0aW1lcyBpdCdzIGEgRFNQICovCisJCQkJCQkJLyogYnV0IHVzdWFsbHkgbm90ICovCisjCWRlZmluZSBEU1BfQ0FQX1RSSUdHRVIJCTB4MDAwMDEwMDAJLyogU3VwcG9ydHMgU0VUVFJJR0dFUiAqLworIwlkZWZpbmUgRFNQX0NBUF9NTUFQCQkweDAwMDAyMDAwCS8qIFN1cHBvcnRzIG1tYXAoKSAqLworIwlkZWZpbmUgRFNQX0NBUF9NVUxUSQkJMHgwMDAwNDAwMAkvKiBzdXBwb3J0IG11bHRpcGxlIG9wZW4gKi8KKyMJZGVmaW5lIERTUF9DQVBfQklORAkJMHgwMDAwODAwMAkvKiBjaGFubmVsIGJpbmRpbmcgdG8gZnJvbnQvcmVhci9jbmV0ZXIvbGZlICovCisKKworI2RlZmluZSBTTkRDVExfRFNQX0dFVFRSSUdHRVIJCV9TSU9SICgnUCcsMTYsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TRVRUUklHR0VSCQlfU0lPVyAoJ1AnLDE2LCBpbnQpCisjCWRlZmluZSBQQ01fRU5BQkxFX0lOUFVUCQkweDAwMDAwMDAxCisjCWRlZmluZSBQQ01fRU5BQkxFX09VVFBVVAkJMHgwMDAwMDAwMgorCit0eXBlZGVmIHN0cnVjdCBjb3VudF9pbmZvIHsKKwkJaW50IGJ5dGVzOwkvKiBUb3RhbCAjIG9mIGJ5dGVzIHByb2Nlc3NlZCAqLworCQlpbnQgYmxvY2tzOwkvKiAjIG9mIGZyYWdtZW50IHRyYW5zaXRpb25zIHNpbmNlIGxhc3QgdGltZSAqLworCQlpbnQgcHRyOwkvKiBDdXJyZW50IERNQSBwb2ludGVyIHZhbHVlICovCisJfSBjb3VudF9pbmZvOworCisjZGVmaW5lIFNORENUTF9EU1BfR0VUSVBUUgkJX1NJT1IgKCdQJywxNywgY291bnRfaW5mbykKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRPUFRSCQlfU0lPUiAoJ1AnLDE4LCBjb3VudF9pbmZvKQorCit0eXBlZGVmIHN0cnVjdCBidWZmbWVtX2Rlc2MgeworCQl1bnNpZ25lZCAqYnVmZmVyOworCQlpbnQgc2l6ZTsKKwl9IGJ1ZmZtZW1fZGVzYzsKKyNkZWZpbmUgU05EQ1RMX0RTUF9NQVBJTkJVRgkJX1NJT1IgKCdQJywgMTksIGJ1ZmZtZW1fZGVzYykKKyNkZWZpbmUgU05EQ1RMX0RTUF9NQVBPVVRCVUYJCV9TSU9SICgnUCcsIDIwLCBidWZmbWVtX2Rlc2MpCisjZGVmaW5lIFNORENUTF9EU1BfU0VUU1lOQ1JPCQlfU0lPICAoJ1AnLCAyMSkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TRVREVVBMRVgJCV9TSU8gICgnUCcsIDIyKQorI2RlZmluZSBTTkRDVExfRFNQX0dFVE9ERUxBWQkJX1NJT1IgKCdQJywgMjMsIGludCkKKworI2RlZmluZSBTTkRDVExfRFNQX0dFVENIQU5ORUxNQVNLCQlfU0lPV1IoJ1AnLCA2NCwgaW50KQorI2RlZmluZSBTTkRDVExfRFNQX0JJTkRfQ0hBTk5FTAkJX1NJT1dSKCdQJywgNjUsIGludCkKKyMJZGVmaW5lIERTUF9CSU5EX1FVRVJZCQkweDAwMDAwMDAwCisjCWRlZmluZSBEU1BfQklORF9GUk9OVAkJMHgwMDAwMDAwMQorIwlkZWZpbmUgRFNQX0JJTkRfU1VSUgkJMHgwMDAwMDAwMgorIwlkZWZpbmUgRFNQX0JJTkRfQ0VOVEVSX0xGRQkweDAwMDAwMDA0CisjCWRlZmluZSBEU1BfQklORF9IQU5EU0VUCQkweDAwMDAwMDA4CisjCWRlZmluZSBEU1BfQklORF9NSUMJCTB4MDAwMDAwMTAKKyMJZGVmaW5lIERTUF9CSU5EX01PREVNMQkJMHgwMDAwMDAyMAorIwlkZWZpbmUgRFNQX0JJTkRfTU9ERU0yCQkweDAwMDAwMDQwCisjCWRlZmluZSBEU1BfQklORF9JMlMJCTB4MDAwMDAwODAKKyMJZGVmaW5lIERTUF9CSU5EX1NQRElGCQkweDAwMDAwMTAwCisKKyNkZWZpbmUgU05EQ1RMX0RTUF9TRVRTUERJRgkJX1NJT1cgKCdQJywgNjYsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRTUERJRgkJX1NJT1IgKCdQJywgNjcsIGludCkKKyMJZGVmaW5lIFNQRElGX1BSTwkweDAwMDEKKyMJZGVmaW5lIFNQRElGX05fQVVECTB4MDAwMgorIwlkZWZpbmUgU1BESUZfQ09QWQkweDAwMDQKKyMJZGVmaW5lIFNQRElGX1BSRQkweDAwMDgKKyMJZGVmaW5lIFNQRElGX0NDCQkweDA3ZjAKKyMJZGVmaW5lIFNQRElGX0wJCTB4MDgwMAorIwlkZWZpbmUgU1BESUZfRFJTCTB4NDAwMAorIwlkZWZpbmUgU1BESUZfVgkJMHg4MDAwCisKKy8qCisgKiBBcHBsaWNhdGlvbidzIHByb2ZpbGUgZGVmaW5lcyB0aGUgd2F5IGhvdyBwbGF5YmFjayB1bmRlcnJ1biBzaXR1YXRpb25zIHNob3VsZCBiZSBoYW5kbGVkLgorICogCisgKglBUEZfTk9STUFMICh0aGUgZGVmYXVsdCkgYW5kIEFQRl9ORVRXT1JLIG1ha2UgdGhlIGRyaXZlciB0byBjbGVhbnVwIHRoZQorICoJcGxheWJhY2sgYnVmZmVyIHdoZW5ldmVyIGFuIHVuZGVycnVuIG9jY3Vycy4gVGhpcyBjb25zdW1lcyBzb21lIHRpbWUKKyAqCXByZXZlbnRzIGxvb3BpbmcgdGhlIGV4aXN0aW5nIGJ1ZmZlci4KKyAqCUFQRl9DUFVJTlRFTlMgaXMgaW50ZW5kZWQgdG8gYmUgc2V0IGJ5IENQVSBpbnRlbnNpdmUgYXBwbGljYXRpb25zIHdoaWNoCisgKglhcmUgbGlrZWx5IHRvIHJ1biBvdXQgb2YgdGltZSBvY2Nhc2lvbmFsbHkuIEluIHRoaXMgbW9kZSB0aGUgYnVmZmVyIGNsZWFudXAgaXMKKyAqCWRpc2FibGVkIHdoaWNoIHNhdmVzIENQVSB0aW1lIGJ1dCBhbHNvIGxldCdzIHRoZSBwcmV2aW91cyBidWZmZXIgY29udGVudCB0bworICoJYmUgcGxheWVkIGR1cmluZyB0aGUgInBhdXNlIiBhZnRlciB0aGUgdW5kZXJydW4uCisgKi8KKyNkZWZpbmUgU05EQ1RMX0RTUF9QUk9GSUxFCQlfU0lPVyAoJ1AnLCAyMywgaW50KQorI2RlZmluZQkgIEFQRl9OT1JNQUwJMAkvKiBOb3JtYWwgYXBwbGljYXRpb25zICovCisjZGVmaW5lCSAgQVBGX05FVFdPUksJMQkvKiBVbmRlcnJ1bnMgcHJvYmFibHkgY2F1c2VkIGJ5IGFuICJleHRlcm5hbCIgZGVsYXkgKi8KKyNkZWZpbmUgICBBUEZfQ1BVSU5URU5TIDIJLyogVW5kZXJydW5zIHByb2JhYmx5IGNhdXNlZCBieSAib3ZlcmhlYXRpbmciIHRoZSBDUFUgKi8KKworI2RlZmluZSBTT1VORF9QQ01fUkVBRF9SQVRFCQlfU0lPUiAoJ1AnLCAyLCBpbnQpCisjZGVmaW5lIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTCQlfU0lPUiAoJ1AnLCA2LCBpbnQpCisjZGVmaW5lIFNPVU5EX1BDTV9SRUFEX0JJVFMJCV9TSU9SICgnUCcsIDUsIGludCkKKyNkZWZpbmUgU09VTkRfUENNX1JFQURfRklMVEVSCQlfU0lPUiAoJ1AnLCA3LCBpbnQpCisKKy8qIFNvbWUgYWxpYXMgbmFtZXMgKi8KKyNkZWZpbmUgU09VTkRfUENNX1dSSVRFX0JJVFMJCVNORENUTF9EU1BfU0VURk1UCisjZGVmaW5lIFNPVU5EX1BDTV9XUklURV9SQVRFCQlTTkRDVExfRFNQX1NQRUVECisjZGVmaW5lIFNPVU5EX1BDTV9QT1NUCQkJU05EQ1RMX0RTUF9QT1NUCisjZGVmaW5lIFNPVU5EX1BDTV9SRVNFVAkJCVNORENUTF9EU1BfUkVTRVQKKyNkZWZpbmUgU09VTkRfUENNX1NZTkMJCQlTTkRDVExfRFNQX1NZTkMKKyNkZWZpbmUgU09VTkRfUENNX1NVQkRJVklERQkJU05EQ1RMX0RTUF9TVUJESVZJREUKKyNkZWZpbmUgU09VTkRfUENNX1NFVEZSQUdNRU5UCQlTTkRDVExfRFNQX1NFVEZSQUdNRU5UCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRGTVRTCQlTTkRDVExfRFNQX0dFVEZNVFMKKyNkZWZpbmUgU09VTkRfUENNX1NFVEZNVAkJU05EQ1RMX0RTUF9TRVRGTVQKKyNkZWZpbmUgU09VTkRfUENNX0dFVE9TUEFDRQkJU05EQ1RMX0RTUF9HRVRPU1BBQ0UKKyNkZWZpbmUgU09VTkRfUENNX0dFVElTUEFDRQkJU05EQ1RMX0RTUF9HRVRJU1BBQ0UKKyNkZWZpbmUgU09VTkRfUENNX05PTkJMT0NLCQlTTkRDVExfRFNQX05PTkJMT0NLCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRDQVBTCQlTTkRDVExfRFNQX0dFVENBUFMKKyNkZWZpbmUgU09VTkRfUENNX0dFVFRSSUdHRVIJCVNORENUTF9EU1BfR0VUVFJJR0dFUgorI2RlZmluZSBTT1VORF9QQ01fU0VUVFJJR0dFUgkJU05EQ1RMX0RTUF9TRVRUUklHR0VSCisjZGVmaW5lIFNPVU5EX1BDTV9TRVRTWU5DUk8JCVNORENUTF9EU1BfU0VUU1lOQ1JPCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRJUFRSCQlTTkRDVExfRFNQX0dFVElQVFIKKyNkZWZpbmUgU09VTkRfUENNX0dFVE9QVFIJCVNORENUTF9EU1BfR0VUT1BUUgorI2RlZmluZSBTT1VORF9QQ01fTUFQSU5CVUYJCVNORENUTF9EU1BfTUFQSU5CVUYKKyNkZWZpbmUgU09VTkRfUENNX01BUE9VVEJVRgkJU05EQ1RMX0RTUF9NQVBPVVRCVUYKKworLyoKKyAqIGlvY3RsIGNhbGxzIHRvIGJlIHVzZWQgaW4gY29tbXVuaWNhdGlvbiB3aXRoIGNvcHJvY2Vzc29ycyBhbmQKKyAqIERTUCBjaGlwcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBjb3ByX2J1ZmZlciB7CisJCWludCBjb21tYW5kOwkvKiBTZXQgdG8gMCBpZiBub3QgdXNlZCAqLworCQlpbnQgZmxhZ3M7CisjZGVmaW5lIENQRl9OT05FCQkweDAwMDAKKyNkZWZpbmUgQ1BGX0ZJUlNUCQkweDAwMDEJLyogRmlyc3QgYmxvY2sgKi8KKyNkZWZpbmUgQ1BGX0xBU1QJCTB4MDAwMgkvKiBMYXN0IGJsb2NrICovCisJCWludCBsZW47CisJCWludCBvZmZzOwkvKiBJZiByZXF1aXJlZCBieSB0aGUgZGV2aWNlICgwIGlmIG5vdCB1c2VkKSAqLworCisJCXVuc2lnbmVkIGNoYXIgZGF0YVs0MDAwXTsgLyogTk9URSEgNDAwMCBpcyBub3QgNGsgKi8KKwl9IGNvcHJfYnVmZmVyOworCit0eXBlZGVmIHN0cnVjdCBjb3ByX2RlYnVnX2J1ZiB7CisJCWludCBjb21tYW5kOwkvKiBVc2VkIGludGVybmFsbHkuIFNldCB0byAwICovCisJCWludCBwYXJtMTsKKwkJaW50IHBhcm0yOworCQlpbnQgZmxhZ3M7CQorCQlpbnQgbGVuOwkvKiBMZW5ndGggb2YgZGF0YSBpbiBieXRlcyAqLworCX0gY29wcl9kZWJ1Z19idWY7CisKK3R5cGVkZWYgc3RydWN0IGNvcHJfbXNnIHsKKwkJaW50IGxlbjsKKwkJdW5zaWduZWQgY2hhciBkYXRhWzQwMDBdOworCX0gY29wcl9tc2c7CisKKyNkZWZpbmUgU05EQ1RMX0NPUFJfUkVTRVQgICAgICAgICAgICAgX1NJTyAgKCdDJywgIDApCisjZGVmaW5lIFNORENUTF9DT1BSX0xPQUQJICAgICAgX1NJT1dSKCdDJywgIDEsIGNvcHJfYnVmZmVyKQorI2RlZmluZSBTTkRDVExfQ09QUl9SREFUQQkgICAgICBfU0lPV1IoJ0MnLCAgMiwgY29wcl9kZWJ1Z19idWYpCisjZGVmaW5lIFNORENUTF9DT1BSX1JDT0RFCSAgICAgIF9TSU9XUignQycsICAzLCBjb3ByX2RlYnVnX2J1ZikKKyNkZWZpbmUgU05EQ1RMX0NPUFJfV0RBVEEJICAgICAgX1NJT1cgKCdDJywgIDQsIGNvcHJfZGVidWdfYnVmKQorI2RlZmluZSBTTkRDVExfQ09QUl9XQ09ERQkgICAgICBfU0lPVyAoJ0MnLCAgNSwgY29wcl9kZWJ1Z19idWYpCisjZGVmaW5lIFNORENUTF9DT1BSX1JVTgkJICAgICAgX1NJT1dSKCdDJywgIDYsIGNvcHJfZGVidWdfYnVmKQorI2RlZmluZSBTTkRDVExfQ09QUl9IQUxUCSAgICAgIF9TSU9XUignQycsICA3LCBjb3ByX2RlYnVnX2J1ZikKKyNkZWZpbmUgU05EQ1RMX0NPUFJfU0VORE1TRwkgICAgICBfU0lPV1IoJ0MnLCAgOCwgY29wcl9tc2cpCisjZGVmaW5lIFNORENUTF9DT1BSX1JDVk1TRwkgICAgICBfU0lPUiAoJ0MnLCAgOSwgY29wcl9tc2cpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElPQ1RMIGNvbW1hbmRzIGZvciAvZGV2L21peGVyCisgKi8KKwkKKy8qIAorICogTWl4ZXIgZGV2aWNlcworICoKKyAqIFRoZXJlIGNhbiBiZSB1cCB0byAyMCBkaWZmZXJlbnQgYW5hbG9nIG1peGVyIGNoYW5uZWxzLiBUaGUKKyAqIFNPVU5EX01JWEVSX05SREVWSUNFUyBnaXZlcyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCBtYXhpbXVtLiAKKyAqIFRoZSBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0sgcmV0dXJucyBhIGJpdG1hc2sgd2hpY2ggdGVsbHMKKyAqIHRoZSBkZXZpY2VzIHN1cHBvcnRlZCBieSB0aGUgcGFydGljdWxhciBtaXhlci4KKyAqLworCisjZGVmaW5lIFNPVU5EX01JWEVSX05SREVWSUNFUwkyNQorI2RlZmluZSBTT1VORF9NSVhFUl9WT0xVTUUJMAorI2RlZmluZSBTT1VORF9NSVhFUl9CQVNTCTEKKyNkZWZpbmUgU09VTkRfTUlYRVJfVFJFQkxFCTIKKyNkZWZpbmUgU09VTkRfTUlYRVJfU1lOVEgJMworI2RlZmluZSBTT1VORF9NSVhFUl9QQ00JCTQKKyNkZWZpbmUgU09VTkRfTUlYRVJfU1BFQUtFUgk1CisjZGVmaW5lIFNPVU5EX01JWEVSX0xJTkUJNgorI2RlZmluZSBTT1VORF9NSVhFUl9NSUMJCTcKKyNkZWZpbmUgU09VTkRfTUlYRVJfQ0QJCTgKKyNkZWZpbmUgU09VTkRfTUlYRVJfSU1JWAk5CS8qICBSZWNvcmRpbmcgbW9uaXRvciAgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfQUxUUENNCTEwCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQ0xFVgkxMQkvKiBSZWNvcmRpbmcgbGV2ZWwgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfSUdBSU4JMTIJLyogSW5wdXQgZ2FpbiAqLworI2RlZmluZSBTT1VORF9NSVhFUl9PR0FJTgkxMwkvKiBPdXRwdXQgZ2FpbiAqLworLyogCisgKiBUaGUgQUQxODQ4IGNvZGVjIGFuZCBjb21wYXRpYmxlcyBoYXZlIHRocmVlIGxpbmUgbGV2ZWwgaW5wdXRzCisgKiAobGluZSwgYXV4MSBhbmQgYXV4MikuIFNpbmNlIGVhY2ggY2FyZCBtYW51ZmFjdHVyZXIgaGF2ZSBhc3NpZ25lZAorICogZGlmZmVyZW50IG1lYW5pbmdzIHRvIHRoZXNlIGlucHV0cywgaXQncyBpbnByYWN0aWNhbCB0byBhc3NpZ24KKyAqIHNwZWNpZmljIG1lYW5pbmdzIChsaW5lLCBjZCwgc3ludGggZXRjLikgdG8gdGhlbS4KKyAqLworI2RlZmluZSBTT1VORF9NSVhFUl9MSU5FMQkxNAkvKiBJbnB1dCBzb3VyY2UgMSAgKGF1eDEpICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0xJTkUyCTE1CS8qIElucHV0IHNvdXJjZSAyICAoYXV4MikgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfTElORTMJMTYJLyogSW5wdXQgc291cmNlIDMgIChsaW5lKSAqLworI2RlZmluZSBTT1VORF9NSVhFUl9ESUdJVEFMMQkxNwkvKiBEaWdpdGFsIChpbnB1dCkgMSAqLworI2RlZmluZSBTT1VORF9NSVhFUl9ESUdJVEFMMgkxOAkvKiBEaWdpdGFsIChpbnB1dCkgMiAqLworI2RlZmluZSBTT1VORF9NSVhFUl9ESUdJVEFMMwkxOQkvKiBEaWdpdGFsIChpbnB1dCkgMyAqLworI2RlZmluZSBTT1VORF9NSVhFUl9QSE9ORUlOCTIwCS8qIFBob25lIGlucHV0ICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1BIT05FT1VUCTIxCS8qIFBob25lIG91dHB1dCAqLworI2RlZmluZSBTT1VORF9NSVhFUl9WSURFTwkyMgkvKiBWaWRlby9UViAoYXVkaW8pIGluICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1JBRElPCTIzCS8qIFJhZGlvIGluICovCisjZGVmaW5lIFNPVU5EX01JWEVSX01PTklUT1IJMjQJLyogTW9uaXRvciAodXN1YWxseSBtaWMpIHZvbHVtZSAqLworCisvKiBTb21lIG9uL29mZiBzZXR0aW5ncyAoU09VTkRfU1BFQ0lBTF9NSU4gLSBTT1VORF9TUEVDSUFMX01BWCkgKi8KKy8qIE5vdCBjb3VudGVkIHRvIFNPVU5EX01JWEVSX05SREVWSUNFUywgYnV0IHVzZSB0aGUgc2FtZSBudW1iZXIgc3BhY2UgKi8KKyNkZWZpbmUgU09VTkRfT05PRkZfTUlOCQkyOAorI2RlZmluZSBTT1VORF9PTk9GRl9NQVgJCTMwCisKKy8qIE5vdGUhCU51bWJlciAzMSBjYW5ub3QgYmUgdXNlZCBzaW5jZSB0aGUgc2lnbiBiaXQgaXMgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfTk9ORQkzMQorCisvKgorICogVGhlIGZvbGxvd2luZyB1bnN1cHBvcnRlZCBtYWNyb3MgYXJlIG5vIGxvbmdlciBmdW5jdGlvbmFsLgorICogVXNlIFNPVU5EX01JWEVSX1BSSVZBVEUjIG1hY3JvcyBpbiBmdXR1cmUuCisgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfRU5IQU5DRQlTT1VORF9NSVhFUl9OT05FCisjZGVmaW5lIFNPVU5EX01JWEVSX01VVEUJU09VTkRfTUlYRVJfTk9ORQorI2RlZmluZSBTT1VORF9NSVhFUl9MT1VECVNPVU5EX01JWEVSX05PTkUKKworCisjZGVmaW5lIFNPVU5EX0RFVklDRV9MQUJFTFMJeyJWb2wgICIsICJCYXNzICIsICJUcmVibCIsICJTeW50aCIsICJQY20gICIsICJTcGtyICIsICJMaW5lICIsIFwKKwkJCQkgIk1pYyAgIiwgIkNEICAgIiwgIk1peCAgIiwgIlBjbTIgIiwgIlJlYyAgIiwgIklHYWluIiwgIk9HYWluIiwgXAorCQkJCSAiTGluZTEiLCAiTGluZTIiLCAiTGluZTMiLCAiRGlnaXRhbDEiLCAiRGlnaXRhbDIiLCAiRGlnaXRhbDMiLCBcCisJCQkJICJQaG9uZUluIiwgIlBob25lT3V0IiwgIlZpZGVvIiwgIlJhZGlvIiwgIk1vbml0b3IifQorCisjZGVmaW5lIFNPVU5EX0RFVklDRV9OQU1FUwl7InZvbCIsICJiYXNzIiwgInRyZWJsZSIsICJzeW50aCIsICJwY20iLCAic3BlYWtlciIsICJsaW5lIiwgXAorCQkJCSAibWljIiwgImNkIiwgIm1peCIsICJwY20yIiwgInJlYyIsICJpZ2FpbiIsICJvZ2FpbiIsIFwKKwkJCQkgImxpbmUxIiwgImxpbmUyIiwgImxpbmUzIiwgImRpZzEiLCAiZGlnMiIsICJkaWczIiwgXAorCQkJCSAicGhpbiIsICJwaG91dCIsICJ2aWRlbyIsICJyYWRpbyIsICJtb25pdG9yIn0KKworLyoJRGV2aWNlIGJpdG1hc2sgaWRlbnRpZmllcnMJKi8KKworI2RlZmluZSBTT1VORF9NSVhFUl9SRUNTUkMJMHhmZgkvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAqLworI2RlZmluZSBTT1VORF9NSVhFUl9ERVZNQVNLCTB4ZmUJLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHN1cHBvcnRlZCBkZXZpY2UgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVDTUFTSwkweGZkCS8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgcmVjb3JkaW5nIHNvdXJjZSAqLworI2RlZmluZSBTT1VORF9NSVhFUl9DQVBTCTB4ZmMKKyMJZGVmaW5lIFNPVU5EX0NBUF9FWENMX0lOUFVUCTB4MDAwMDAwMDEJLyogT25seSBvbmUgcmVjb3JkaW5nIHNvdXJjZSBhdCBhIHRpbWUgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfU1RFUkVPREVWUwkweGZiCS8qIE1peGVyIGNoYW5uZWxzIHN1cHBvcnRpbmcgc3RlcmVvICovCisjZGVmaW5lIFNPVU5EX01JWEVSX09VVFNSQwkweGZhCS8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBpbnB1dCBzb3VyY2UgdG8gb3V0cHV0ICovCisjZGVmaW5lIFNPVU5EX01JWEVSX09VVE1BU0sJMHhmOQkvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIGlucHV0IHNvdXJjZSB0byBvdXRwdXQgKi8KKworLyoJRGV2aWNlIG1hc2sgYml0cwkqLworCisjZGVmaW5lIFNPVU5EX01BU0tfVk9MVU1FCSgxIDw8IFNPVU5EX01JWEVSX1ZPTFVNRSkKKyNkZWZpbmUgU09VTkRfTUFTS19CQVNTCQkoMSA8PCBTT1VORF9NSVhFUl9CQVNTKQorI2RlZmluZSBTT1VORF9NQVNLX1RSRUJMRQkoMSA8PCBTT1VORF9NSVhFUl9UUkVCTEUpCisjZGVmaW5lIFNPVU5EX01BU0tfU1lOVEgJKDEgPDwgU09VTkRfTUlYRVJfU1lOVEgpCisjZGVmaW5lIFNPVU5EX01BU0tfUENNCQkoMSA8PCBTT1VORF9NSVhFUl9QQ00pCisjZGVmaW5lIFNPVU5EX01BU0tfU1BFQUtFUgkoMSA8PCBTT1VORF9NSVhFUl9TUEVBS0VSKQorI2RlZmluZSBTT1VORF9NQVNLX0xJTkUJCSgxIDw8IFNPVU5EX01JWEVSX0xJTkUpCisjZGVmaW5lIFNPVU5EX01BU0tfTUlDCQkoMSA8PCBTT1VORF9NSVhFUl9NSUMpCisjZGVmaW5lIFNPVU5EX01BU0tfQ0QJCSgxIDw8IFNPVU5EX01JWEVSX0NEKQorI2RlZmluZSBTT1VORF9NQVNLX0lNSVgJCSgxIDw8IFNPVU5EX01JWEVSX0lNSVgpCisjZGVmaW5lIFNPVU5EX01BU0tfQUxUUENNCSgxIDw8IFNPVU5EX01JWEVSX0FMVFBDTSkKKyNkZWZpbmUgU09VTkRfTUFTS19SRUNMRVYJKDEgPDwgU09VTkRfTUlYRVJfUkVDTEVWKQorI2RlZmluZSBTT1VORF9NQVNLX0lHQUlOCSgxIDw8IFNPVU5EX01JWEVSX0lHQUlOKQorI2RlZmluZSBTT1VORF9NQVNLX09HQUlOCSgxIDw8IFNPVU5EX01JWEVSX09HQUlOKQorI2RlZmluZSBTT1VORF9NQVNLX0xJTkUxCSgxIDw8IFNPVU5EX01JWEVSX0xJTkUxKQorI2RlZmluZSBTT1VORF9NQVNLX0xJTkUyCSgxIDw8IFNPVU5EX01JWEVSX0xJTkUyKQorI2RlZmluZSBTT1VORF9NQVNLX0xJTkUzCSgxIDw8IFNPVU5EX01JWEVSX0xJTkUzKQorI2RlZmluZSBTT1VORF9NQVNLX0RJR0lUQUwxCSgxIDw8IFNPVU5EX01JWEVSX0RJR0lUQUwxKQorI2RlZmluZSBTT1VORF9NQVNLX0RJR0lUQUwyCSgxIDw8IFNPVU5EX01JWEVSX0RJR0lUQUwyKQorI2RlZmluZSBTT1VORF9NQVNLX0RJR0lUQUwzCSgxIDw8IFNPVU5EX01JWEVSX0RJR0lUQUwzKQorI2RlZmluZSBTT1VORF9NQVNLX1BIT05FSU4JKDEgPDwgU09VTkRfTUlYRVJfUEhPTkVJTikKKyNkZWZpbmUgU09VTkRfTUFTS19QSE9ORU9VVAkoMSA8PCBTT1VORF9NSVhFUl9QSE9ORU9VVCkKKyNkZWZpbmUgU09VTkRfTUFTS19SQURJTwkoMSA8PCBTT1VORF9NSVhFUl9SQURJTykKKyNkZWZpbmUgU09VTkRfTUFTS19WSURFTwkoMSA8PCBTT1VORF9NSVhFUl9WSURFTykKKyNkZWZpbmUgU09VTkRfTUFTS19NT05JVE9SCSgxIDw8IFNPVU5EX01JWEVSX01PTklUT1IpCisKKy8qIE9ic29sZXRlIG1hY3JvcyAqLworI2RlZmluZSBTT1VORF9NQVNLX01VVEUJCSgxIDw8IFNPVU5EX01JWEVSX01VVEUpCisjZGVmaW5lIFNPVU5EX01BU0tfRU5IQU5DRQkoMSA8PCBTT1VORF9NSVhFUl9FTkhBTkNFKQorI2RlZmluZSBTT1VORF9NQVNLX0xPVUQJCSgxIDw8IFNPVU5EX01JWEVSX0xPVUQpCisKKyNkZWZpbmUgTUlYRVJfUkVBRChkZXYpCQlfU0lPUignTScsIGRldiwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1ZPTFVNRQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9WT0xVTUUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfQkFTUwkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9CQVNTKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1RSRUJMRQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9UUkVCTEUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfU1lOVEgJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfU1lOVEgpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfUENNCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1BDTSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9TUEVBS0VSCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfU1BFQUtFUikKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9MSU5FCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0xJTkUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfTUlDCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX01JQykKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9DRAkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9DRCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9JTUlYCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0lNSVgpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfQUxUUENNCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0FMVFBDTSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9SRUNMRVYJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfUkVDTEVWKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0lHQUlOCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0lHQUlOKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX09HQUlOCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX09HQUlOKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0xJTkUxCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0xJTkUxKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0xJTkUyCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0xJTkUyKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0xJTkUzCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0xJTkUzKQorCisvKiBPYnNvbGV0ZSBtYWNyb3MgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9NVVRFCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX01VVEUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfRU5IQU5DRQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0VOSEFOQ0UpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfTE9VRAkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MT1VEKQorCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfUkVDU1JDCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JFQ1NSQykKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9ERVZNQVNLCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfREVWTUFTSykKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9SRUNNQVNLCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfUkVDTUFTSykKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9TVEVSRU9ERVZTCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfU1RFUkVPREVWUykKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9DQVBTCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0NBUFMpCisKKyNkZWZpbmUgTUlYRVJfV1JJVEUoZGV2KQkJX1NJT1dSKCdNJywgZGV2LCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1ZPTFVNRQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9WT0xVTUUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0JBU1MJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0JBU1MpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1RSRUJMRQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9UUkVCTEUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1NZTlRICQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9TWU5USCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfUENNCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9QQ00pCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1NQRUFLRVIJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfU1BFQUtFUikKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfTElORQkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTElORSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfTUlDCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9NSUMpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0NECQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9DRCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfSU1JWAkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfSU1JWCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfQUxUUENNCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0FMVFBDTSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfUkVDTEVWCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1JFQ0xFVikKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfSUdBSU4JCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0lHQUlOKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9PR0FJTgkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfT0dBSU4pCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUxCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9MSU5FMSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfTElORTIJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUyKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9MSU5FMwkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTElORTMpCisKKy8qIE9ic29sZXRlIG1hY3JvcyAqLworI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9NVVRFCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9NVVRFKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9FTkhBTkNFCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0VOSEFOQ0UpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0xPVUQJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xPVUQpCisKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1JFQ1NSQykKKwordHlwZWRlZiBzdHJ1Y3QgbWl4ZXJfaW5mbworeworICBjaGFyIGlkWzE2XTsKKyAgY2hhciBuYW1lWzMyXTsKKyAgaW50ICBtb2RpZnlfY291bnRlcjsKKyAgaW50IGZpbGxlcnNbMTBdOworfSBtaXhlcl9pbmZvOworCit0eXBlZGVmIHN0cnVjdCBfb2xkX21peGVyX2luZm8gLyogT2Jzb2xldGUgKi8KK3sKKyAgY2hhciBpZFsxNl07CisgIGNoYXIgbmFtZVszMl07Cit9IF9vbGRfbWl4ZXJfaW5mbzsKKworI2RlZmluZSBTT1VORF9NSVhFUl9JTkZPCQlfU0lPUiAoJ00nLCAxMDEsIG1peGVyX2luZm8pCisjZGVmaW5lIFNPVU5EX09MRF9NSVhFUl9JTkZPCQlfU0lPUiAoJ00nLCAxMDEsIF9vbGRfbWl4ZXJfaW5mbykKKworLyoKKyAqIEEgbWVjaGFuaXNtIGZvciBhY2Nlc3NpbmcgInByb3ByaWV0YXJ5IiBtaXhlciBmZWF0dXJlcy4gVGhpcyBtZXRob2QKKyAqIHBlcm1pdHMgcGFzc2luZyAxMjggYnl0ZXMgb2YgYXJiaXRyYXJ5IGRhdGEgYmV0d2VlbiBhIG1peGVyIGFwcGxpY2F0aW9uCisgKiBhbmQgdGhlIG1peGVyIGRyaXZlci4gSW50ZXJwcmV0YXRpb24gb2YgdGhlIHJlY29yZCBpcyBkZWZpbmVkIGJ5CisgKiB0aGUgcGFydGljdWxhciBtaXhlciBkcml2ZXIuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBtaXhlcl9yZWNvcmRbMTI4XTsKKworI2RlZmluZSBTT1VORF9NSVhFUl9BQ0NFU1MJCV9TSU9XUignTScsIDEwMiwgbWl4ZXJfcmVjb3JkKQorCisvKgorICogVHdvIGlvY3RscyBmb3Igc3BlY2lhbCBzb3VuY2FyZCBmdW5jdGlvbgorICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0FHQyAgX1NJT1dSKCdNJywgMTAzLCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSXzNEU0UgIF9TSU9XUignTScsIDEwNCwgaW50KQorCisvKgorICogVGhlIFNPVU5EX01JWEVSX1BSSVZBVEUjIGNvbW1hbmRzIGNhbiBiZSByZWRlZmluZWQgYnkgbG93IGxldmVsIGRyaXZlcnMuCisgKiBUaGVzZSBmZWF0dXJlcyBjYW4gYmUgdXNlZCB3aGVuIGFjY2Vzc2luZyBkZXZpY2Ugc3BlY2lmaWMgZmVhdHVyZXMuCisgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfUFJJVkFURTEJCV9TSU9XUignTScsIDExMSwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9QUklWQVRFMgkJX1NJT1dSKCdNJywgMTEyLCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX1BSSVZBVEUzCQlfU0lPV1IoJ00nLCAxMTMsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUFJJVkFURTQJCV9TSU9XUignTScsIDExNCwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9QUklWQVRFNQkJX1NJT1dSKCdNJywgMTE1LCBpbnQpCisKKy8qCisgKiBTT1VORF9NSVhFUl9HRVRMRVZFTFMgYW5kIFNPVU5EX01JWEVSX1NFVExFVkVMUyBjYWxscyBjYW4gYmUgdXNlZAorICogZm9yIHF1ZXJ5aW5nIGN1cnJlbnQgbWl4ZXIgc2V0dGluZ3MgZnJvbSB0aGUgZHJpdmVyIGFuZCBmb3IgbG9hZGluZworICogZGVmYXVsdCB2b2x1bWUgc2V0dGluZ3MgX3ByaW9yXyBhY3RpdmF0aW5nIHRoZSBtaXhlciAobG9hZGluZworICogZG9lc24ndCBhZmZlY3QgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWl4ZXIgaGFyZHdhcmUpLiBUaGVzZSBjYWxscworICogYXJlIGZvciBpbnRlcm5hbCB1c2Ugb25seS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBtaXhlcl92b2xfdGFibGUgeworICBpbnQgbnVtOwkvKiBJbmRleCB0byB2b2x1bWUgdGFibGUgKi8KKyAgY2hhciBuYW1lWzMyXTsKKyAgaW50IGxldmVsc1szMl07Cit9IG1peGVyX3ZvbF90YWJsZTsKKworI2RlZmluZSBTT1VORF9NSVhFUl9HRVRMRVZFTFMJCV9TSU9XUignTScsIDExNiwgbWl4ZXJfdm9sX3RhYmxlKQorI2RlZmluZSBTT1VORF9NSVhFUl9TRVRMRVZFTFMJCV9TSU9XUignTScsIDExNywgbWl4ZXJfdm9sX3RhYmxlKQorCisvKiAKKyAqIEFuIGlvY3RsIGZvciBpZGVudGlmeWluZyB0aGUgZHJpdmVyIHZlcnNpb24uIEl0IHdpbGwgcmV0dXJuIHZhbHVlCisgKiBvZiB0aGUgU09VTkRfVkVSU0lPTiBtYWNybyB1c2VkIHdoZW4gY29tcGlsaW5nIHRoZSBkcml2ZXIuCisgKiBUaGlzIGNhbGwgd2FzIGludHJvZHVjZWQgaW4gT1NTIHZlcnNpb24gMy42IGFuZCBpdCB3aWxsIG5vdCB3b3JrCisgKiB3aXRoIGVhcmxpZXIgdmVyc2lvbnMgKHJldHVybnMgRUlOVkFMKS4KKyAqLworI2RlZmluZSBPU1NfR0VUVkVSU0lPTgkJCV9TSU9SICgnTScsIDExOCwgaW50KQorCisvKgorICogTGV2ZWwgMiBldmVudCB0eXBlcyBmb3IgL2Rldi9zZXF1ZW5jZXIKKyAqLworCisvKgorICogVGhlIDQgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIGJ5dGUgMCBzcGVjaWZ5IHRoZSBjbGFzcyBvZgorICogdGhlIGV2ZW50OiAKKyAqCisgKgkweDhYID0gc3lzdGVtIGxldmVsIGV2ZW50cywKKyAqCTB4OVggPSBkZXZpY2UvcG9ydCBzcGVjaWZpYyBldmVudHMsIGV2ZW50WzFdID0gZGV2aWNlL3BvcnQsCisgKgkJVGhlIGxhc3QgNCBiaXRzIGdpdmUgdGhlIHN1YnR5cGU6CisgKgkJCTB4MDIJPSBDaGFubmVsIGV2ZW50IChldmVudFszXSA9IGNobikuCisgKgkJCTB4MDEJPSBub3RlIGV2ZW50IChldmVudFs0XSA9IG5vdGUpLgorICoJCQkoMHgwMSBpcyBub3QgdXNlZCBhbG9uZSBidXQgYWx3YXlzIHdpdGggYml0IDB4MDIpLgorICoJICAgICAgIGV2ZW50WzJdID0gTUlESSBtZXNzYWdlIGNvZGUgKDB4ODA9bm90ZSBvZmYgZXRjLikKKyAqCisgKi8KKworI2RlZmluZSBFVl9TRVFfTE9DQUwJCTB4ODAKKyNkZWZpbmUgRVZfVElNSU5HCQkweDgxCisjZGVmaW5lIEVWX0NITl9DT01NT04JCTB4OTIKKyNkZWZpbmUgRVZfQ0hOX1ZPSUNFCQkweDkzCisjZGVmaW5lIEVWX1NZU0VYCQkweDk0CisvKgorICogRXZlbnQgdHlwZXMgMjAwIHRvIDIyMCBhcmUgcmVzZXJ2ZWQgZm9yIGFwcGxpY2F0aW9uIHVzZS4KKyAqIFRoZXNlIG51bWJlcnMgd2lsbCBub3QgYmUgdXNlZCBieSB0aGUgZHJpdmVyLgorICovCisKKy8qCisgKiBFdmVudHMgZm9yIGV2ZW50IHR5cGUgRVZfQ0hOX1ZPSUNFCisgKi8KKworI2RlZmluZSBNSURJX05PVEVPRkYJCTB4ODAKKyNkZWZpbmUgTUlESV9OT1RFT04JCTB4OTAKKyNkZWZpbmUgTUlESV9LRVlfUFJFU1NVUkUJMHhBMAorCisvKgorICogRXZlbnRzIGZvciBldmVudCB0eXBlIEVWX0NITl9DT01NT04KKyAqLworCisjZGVmaW5lIE1JRElfQ1RMX0NIQU5HRQkJMHhCMAorI2RlZmluZSBNSURJX1BHTV9DSEFOR0UJCTB4QzAKKyNkZWZpbmUgTUlESV9DSE5fUFJFU1NVUkUJMHhEMAorI2RlZmluZSBNSURJX1BJVENIX0JFTkQJCTB4RTAKKworI2RlZmluZSBNSURJX1NZU1RFTV9QUkVGSVgJMHhGMAorCisvKgorICogVGltZXIgZXZlbnQgdHlwZXMKKyAqLworI2RlZmluZSBUTVJfV0FJVF9SRUwJCTEJLyogVGltZSByZWxhdGl2ZSB0byB0aGUgcHJldiB0aW1lICovCisjZGVmaW5lIFRNUl9XQUlUX0FCUwkJMgkvKiBBYnNvbHV0ZSB0aW1lIHNpbmNlIFRNUl9TVEFSVCAqLworI2RlZmluZSBUTVJfU1RPUAkJMworI2RlZmluZSBUTVJfU1RBUlQJCTQKKyNkZWZpbmUgVE1SX0NPTlRJTlVFCQk1CisjZGVmaW5lIFRNUl9URU1QTwkJNgorI2RlZmluZSBUTVJfRUNITwkJOAorI2RlZmluZSBUTVJfQ0xPQ0sJCTkJLyogTUlESSBjbG9jayAqLworI2RlZmluZSBUTVJfU1BQCQkJMTAJLyogU29uZyBwb3NpdGlvbiBwb2ludGVyICovCisjZGVmaW5lIFRNUl9USU1FU0lHCQkxMQkvKiBUaW1lIHNpZ25hdHVyZSAqLworCisvKgorICoJTG9jYWwgZXZlbnQgdHlwZXMKKyAqLworI2RlZmluZSBMT0NMX1NUQVJUQVVESU8JCTEKKworLyoKKyAqCVNvbWUgY29udmVuaWVuY2UgbWFjcm9zIHRvIHNpbXBsaWZ5IHByb2dyYW1taW5nIG9mIHRoZQorICoJL2Rldi9zZXF1ZW5jZXIgaW50ZXJmYWNlCisgKgorICoJVGhpcyBpcyBhIGxlZ2FjeSBpbnRlcmZhY2UgZm9yIGFwcGxpY2F0aW9ucyB3cml0dGVuIGFnYWluc3QKKyAqCXRoZSBPU1NsaWItMy44IHN0eWxlIGludGVyZmFjZS4gSXQgaXMgbm8gbG9uZ2VyIHBvc3NpYmxlCisgKgl0byBhY3R1YWxseSBsaW5rIGFnYWluc3QgT1NTbGliIHdpdGggdGhpcyBoZWFkZXIsIGJ1dCB3ZQorICoJc3RpbGwgcHJvdmlkZSB0aGVzZSBtYWNyb3MgZm9yIHByb2dyYW1zIHVzaW5nIHRoZW0uCisgKgorICoJSWYgeW91IHdhbnQgdG8gdXNlIE9TU2xpYiwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgZ2V0CisgKgl0aGUgR1BMIHZlcnNpb24gb2YgT1NTLTQueCBhbmQgYnVpbGQgYWdhaW5zdCB0aGF0IHZlcnNpb24KKyAqCW9mIHRoZSBoZWFkZXIuCisgKgorICoJV2UgcmVkZWZpbmUgdGhlIGV4dGVybiBrZXl3b3JkIHNvIHRoYXQgbWFrZSBoZWFkZXJzX2NoZWNrCisgKglkb2VzIG5vdCBjb21wbGFpbiBhYm91dCBTRVFfVVNFX0VYVEJVRi4KKyAqLworI2RlZmluZSBTRVFfREVDTEFSRUJVRigpCQlTRVFfVVNFX0VYVEJVRigpCisKK3ZvaWQgc2VxYnVmX2R1bXAodm9pZCk7CS8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBwcm92aWRlZCBieSBwcm9ncmFtcyAqLworCisjZGVmaW5lIFNFUV9QTV9ERUZJTkVTIGludCBfX2Zvb19iYXJfX18KKworI2RlZmluZSBTRVFfTE9BRF9HTUlOU1RSKGRldiwgaW5zdHIpCisjZGVmaW5lIFNFUV9MT0FEX0dNRFJVTShkZXYsIGRydW0pCisKKyNkZWZpbmUgX1NFUV9FWFRFUk4gZXh0ZXJuCisjZGVmaW5lIFNFUV9VU0VfRVhUQlVGKCkgXAorCQlfU0VRX0VYVEVSTiB1bnNpZ25lZCBjaGFyIF9zZXFidWZbXTsgXAorCQlfU0VRX0VYVEVSTiBpbnQgX3NlcWJ1ZmxlbjsgX1NFUV9FWFRFUk4gaW50IF9zZXFidWZwdHIKKworI2lmbmRlZiBVU0VfU0lNUExFX01BQ1JPUworLyogU2FtcGxlIHNlcWJ1Zl9kdW1wKCkgaW1wbGVtZW50YXRpb246CisgKgorICoJU0VRX0RFRklORUJVRiAoMjA0OCk7CS0tIERlZmluZXMgYSBidWZmZXIgZm9yIDIwNDggYnl0ZXMKKyAqCisgKglpbnQgc2VxZmQ7CQktLSBUaGUgZmlsZSBkZXNjcmlwdG9yIGZvciAvZGV2L3NlcXVlbmNlci4KKyAqCisgKgl2b2lkCisgKglzZXFidWZfZHVtcCAoKQorICoJeworICoJICBpZiAoX3NlcWJ1ZnB0cikKKyAqCSAgICBpZiAod3JpdGUgKHNlcWZkLCBfc2VxYnVmLCBfc2VxYnVmcHRyKSA9PSAtMSkKKyAqCSAgICAgIHsKKyAqCQlwZXJyb3IgKCJ3cml0ZSAvZGV2L3NlcXVlbmNlciIpOworICoJCWV4aXQgKC0xKTsKKyAqCSAgICAgIH0KKyAqCSAgX3NlcWJ1ZnB0ciA9IDA7CisgKgl9CisgKi8KKworI2RlZmluZSBTRVFfREVGSU5FQlVGKGxlbikJCXVuc2lnbmVkIGNoYXIgX3NlcWJ1ZltsZW5dOyBpbnQgX3NlcWJ1ZmxlbiA9IGxlbjtpbnQgX3NlcWJ1ZnB0ciA9IDAKKyNkZWZpbmUgX1NFUV9ORUVEQlVGKGxlbikJCWlmICgoX3NlcWJ1ZnB0cisobGVuKSkgPiBfc2VxYnVmbGVuKSBzZXFidWZfZHVtcCgpCisjZGVmaW5lIF9TRVFfQURWQlVGKGxlbikJCV9zZXFidWZwdHIgKz0gbGVuCisjZGVmaW5lIFNFUV9EVU1QQlVGCQkJc2VxYnVmX2R1bXAKKyNlbHNlCisvKgorICogVGhpcyB2YXJpYXRpb24gb2YgdGhlIHNlcXVlbmNlciBtYWNyb3MgaXMgdXNlZCBqdXN0IHRvIGZvcm1hdCBvbmUgZXZlbnQKKyAqIHVzaW5nIGZpeGVkIGJ1ZmZlci4KKyAqIAorICogVGhlIHByb2dyYW0gdXNpbmcgdGhlIG1hY3JvIGxpYnJhcnkgbXVzdCBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNyb3MgYmVmb3JlCisgKiB1c2luZyB0aGlzIGxpYnJhcnkuCisgKgorICogI2RlZmluZSBfc2VxYnVmIAkJIG5hbWUgb2YgdGhlIGJ1ZmZlciAodW5zaWduZWQgY2hhcltdKSAKKyAqICNkZWZpbmUgX1NFUV9BRFZCVUYobGVuKQkgSWYgdGhlIGFwcGxpYyBuZWVkcyB0byBrbm93IHRoZSBleGFjdAorICoJCQkJIHNpemUgb2YgdGhlIGV2ZW50LCB0aGlzIG1hY3JvIGNhbiBiZSB1c2VkLgorICoJCQkJIE90aGVyd2lzZSB0aGlzIG11c3QgYmUgZGVmaW5lZCBhcyBlbXB0eS4KKyAqICNkZWZpbmUgX3NlcWJ1ZnB0cgkJIERlZmluZSB0aGUgbmFtZSBvZiBpbmRleCB2YXJpYWJsZSBvciAwIGlmCisgKgkJCQkgbm90IHJlcXVpcmVkLiAKKyAqLworI2RlZmluZSBfU0VRX05FRURCVUYobGVuKQkvKiBlbXB0eSAqLworI2VuZGlmCisKKyNkZWZpbmUgU0VRX1ZPTFVNRV9NT0RFKGRldiwgbW9kZSkJe19TRVFfTkVFREJVRig4KTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cl0gPSBTRVFfRVhURU5ERUQ7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMV0gPSBTRVFfVk9MTU9ERTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisyXSA9IChkZXYpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gKG1vZGUpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gMDtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis1XSA9IDA7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNl0gPSAwO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzddID0gMDtcCisJCQkJCV9TRVFfQURWQlVGKDgpO30KKworLyoKKyAqIE1pZGkgdm9pY2UgbWVzc2FnZXMKKyAqLworCisjZGVmaW5lIF9DSE5fVk9JQ0UoZGV2LCBldmVudCwgY2huLCBub3RlLCBwYXJtKSBcCisJCQkJCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHJdID0gRVZfQ0hOX1ZPSUNFO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzFdID0gKGRldik7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMl0gPSAoZXZlbnQpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gKGNobik7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNF0gPSAobm90ZSk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNV0gPSAocGFybSk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNl0gPSAoMCk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrN10gPSAwO1wKKwkJCQkJX1NFUV9BRFZCVUYoOCk7fQorCisjZGVmaW5lIFNFUV9TVEFSVF9OT1RFKGRldiwgY2huLCBub3RlLCB2b2wpIFwKKwkJX0NITl9WT0lDRShkZXYsIE1JRElfTk9URU9OLCBjaG4sIG5vdGUsIHZvbCkKKworI2RlZmluZSBTRVFfU1RPUF9OT1RFKGRldiwgY2huLCBub3RlLCB2b2wpIFwKKwkJX0NITl9WT0lDRShkZXYsIE1JRElfTk9URU9GRiwgY2huLCBub3RlLCB2b2wpCisKKyNkZWZpbmUgU0VRX0tFWV9QUkVTU1VSRShkZXYsIGNobiwgbm90ZSwgcHJlc3N1cmUpIFwKKwkJX0NITl9WT0lDRShkZXYsIE1JRElfS0VZX1BSRVNTVVJFLCBjaG4sIG5vdGUsIHByZXNzdXJlKQorCisvKgorICogTWlkaSBjaGFubmVsIG1lc3NhZ2VzCisgKi8KKworI2RlZmluZSBfQ0hOX0NPTU1PTihkZXYsIGV2ZW50LCBjaG4sIHAxLCBwMiwgdzE0KSBcCisJCQkJCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHJdID0gRVZfQ0hOX0NPTU1PTjtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChkZXYpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gKGV2ZW50KTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0ciszXSA9IChjaG4pO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gKHAxKTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis1XSA9IChwMik7XAorCQkJCQkqKHNob3J0ICopJl9zZXFidWZbX3NlcWJ1ZnB0cis2XSA9ICh3MTQpO1wKKwkJCQkJX1NFUV9BRFZCVUYoOCk7fQorLyoKKyAqIFNFUV9TWVNFWCBwZXJtaXRzIHNlbmRpbmcgb2Ygc3lzZXggbWVzc2FnZXMuIChJdCBtYXkgbG9vayB0aGF0IGl0IHBlcm1pdHMKKyAqIHNlbmRpbmcgYW55IE1JREkgYnl0ZXMgYnV0IGl0J3MgYWJzb2x1dGVseSBub3QgcG9zc2libGUuIFRyeWluZyB0byBkbworICogc28gX3dpbGxfIGNhdXNlIHByb2JsZW1zIHdpdGggTVBVNDAxIGludGVsbGlnZW50IG1vZGUpLgorICoKKyAqIFN5c2V4IG1lc3NhZ2VzIGFyZSBzZW50IGluIGJsb2NrcyBvZiAxIHRvIDYgYnl0ZXMuIExvbmdlciBtZXNzYWdlcyBtdXN0IGJlIAorICogc2VudCBieSBjYWxsaW5nIFNFUV9TWVNFWCgpIHNldmVyYWwgdGltZXMgKHRoZXJlIG11c3QgYmUgbm8gb3RoZXIgZXZlbnRzCisgKiBiZXR3ZWVuIHRoZW0pLiBGaXJzdCBzeXNleCBmcmFnbWVudCBtdXN0IGhhdmUgMHhmMCBpbiB0aGUgZmlyc3QgYnl0ZQorICogYW5kIHRoZSBsYXN0IGJ5dGUgKGJ1ZltsZW4tMV0gb2YgdGhlIGxhc3QgZnJhZ21lbnQgbXVzdCBiZSAweGY3LiBObyBieXRlCisgKiBiZXR3ZWVuIHRoZXNlIHN5c2V4IHN0YXJ0IGFuZCBlbmQgbWFya2VycyBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gMHg3Zi4gQWxzbworICogbGVuZ3RocyBvZiBlYWNoIGZyYWdtZW50cyAoZXhjZXB0IHRoZSBsYXN0IG9uZSkgbXVzdCBiZSA2LgorICoKKyAqIEJyZWFraW5nIHRoZSBhYm92ZSBydWxlcyBtYXkgd29yayB3aXRoIHNvbWUgTUlESSBwb3J0cyBidXQgaXMgbGlrZWx5IHRvCisgKiBjYXVzZSBmYXRhbCBwcm9ibGVtcyB3aXRoIHNvbWUgb3RoZXIgZGV2aWNlcyAoc3VjaCBhcyBNUFU0MDEpLgorICovCisjZGVmaW5lIFNFUV9TWVNFWChkZXYsIGJ1ZiwgbGVuKSBcCisJCQkJCXtpbnQgaWksIGxsPShsZW4pOyBcCisJCQkJCSB1bnNpZ25lZCBjaGFyICpidWZwPWJ1ZjtcCisJCQkJCSBpZiAobGw+NilsbD02O1wKKwkJCQkJX1NFUV9ORUVEQlVGKDgpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyXSA9IEVWX1NZU0VYO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzFdID0gKGRldik7XAorCQkJCQlmb3IoaWk9MDtpaTxsbDtpaSsrKVwKKwkJCQkJICAgX3NlcWJ1Zltfc2VxYnVmcHRyK2lpKzJdID0gYnVmcFtpaV07XAorCQkJCQlmb3IoaWk9bGw7aWk8NjtpaSsrKVwKKwkJCQkJICAgX3NlcWJ1Zltfc2VxYnVmcHRyK2lpKzJdID0gMHhmZjtcCisJCQkJCV9TRVFfQURWQlVGKDgpO30KKworI2RlZmluZSBTRVFfQ0hOX1BSRVNTVVJFKGRldiwgY2huLCBwcmVzc3VyZSkgXAorCQlfQ0hOX0NPTU1PTihkZXYsIE1JRElfQ0hOX1BSRVNTVVJFLCBjaG4sIHByZXNzdXJlLCAwLCAwKQorCisjZGVmaW5lIFNFUV9TRVRfUEFUQ0ggU0VRX1BHTV9DSEFOR0UKKyNkZWZpbmUgU0VRX1BHTV9DSEFOR0UoZGV2LCBjaG4sIHBhdGNoKSBcCisJCV9DSE5fQ09NTU9OKGRldiwgTUlESV9QR01fQ0hBTkdFLCBjaG4sIHBhdGNoLCAwLCAwKQorCisjZGVmaW5lIFNFUV9DT05UUk9MKGRldiwgY2huLCBjb250cm9sbGVyLCB2YWx1ZSkgXAorCQlfQ0hOX0NPTU1PTihkZXYsIE1JRElfQ1RMX0NIQU5HRSwgY2huLCBjb250cm9sbGVyLCAwLCB2YWx1ZSkKKworI2RlZmluZSBTRVFfQkVOREVSKGRldiwgY2huLCB2YWx1ZSkgXAorCQlfQ0hOX0NPTU1PTihkZXYsIE1JRElfUElUQ0hfQkVORCwgY2huLCAwLCAwLCB2YWx1ZSkKKworCisjZGVmaW5lIFNFUV9WMl9YX0NPTlRST0woZGV2LCB2b2ljZSwgY29udHJvbGxlciwgdmFsdWUpCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHJdID0gU0VRX0VYVEVOREVEO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzFdID0gU0VRX0NPTlRST0xMRVI7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMl0gPSAoZGV2KTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0ciszXSA9ICh2b2ljZSk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNF0gPSAoY29udHJvbGxlcik7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNV0gPSAoKHZhbHVlKSYweGZmKTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis2XSA9ICgodmFsdWU+PjgpJjB4ZmYpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzddID0gMDtcCisJCQkJCV9TRVFfQURWQlVGKDgpO30KKy8qCisgKiBUaGUgZm9sbG93aW5nIDUgbWFjcm9zIGFyZSBpbmNvcnJlY3RseSBpbXBsZW1lbnRlZCBhbmQgb2Jzb2xldGUuCisgKiBVc2UgU0VRX0JFTkRFUiBhbmQgU0VRX0NPTlRST0wgKHdpdGggcHJvcGVyIGNvbnRyb2xsZXIpIGluc3RlYWQuCisgKi8KKyNkZWZpbmUgU0VRX1BJVENIQkVORChkZXYsIHZvaWNlLCB2YWx1ZSkgU0VRX1YyX1hfQ09OVFJPTChkZXYsIHZvaWNlLCBDVFJMX1BJVENIX0JFTkRFUiwgdmFsdWUpCisjZGVmaW5lIFNFUV9CRU5ERVJfUkFOR0UoZGV2LCB2b2ljZSwgdmFsdWUpIFNFUV9WMl9YX0NPTlRST0woZGV2LCB2b2ljZSwgQ1RSTF9QSVRDSF9CRU5ERVJfUkFOR0UsIHZhbHVlKQorI2RlZmluZSBTRVFfRVhQUkVTU0lPTihkZXYsIHZvaWNlLCB2YWx1ZSkgU0VRX0NPTlRST0woZGV2LCB2b2ljZSwgQ1RMX0VYUFJFU1NJT04sIHZhbHVlKjEyOCkKKyNkZWZpbmUgU0VRX01BSU5fVk9MVU1FKGRldiwgdm9pY2UsIHZhbHVlKSBTRVFfQ09OVFJPTChkZXYsIHZvaWNlLCBDVExfTUFJTl9WT0xVTUUsICh2YWx1ZSoxNjM4MykvMTAwKQorI2RlZmluZSBTRVFfUEFOTklORyhkZXYsIHZvaWNlLCBwb3MpIFNFUV9DT05UUk9MKGRldiwgdm9pY2UsIENUTF9QQU4sIChwb3MrMTI4KSAvIDIpCisKKy8qCisgKiBUaW1pbmcgYW5kIHN5bmNocm9uaXphdGlvbiBtYWNyb3MKKyAqLworCisjZGVmaW5lIF9USU1FUl9FVkVOVChldiwgcGFybSkJCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCSAJX3NlcWJ1Zltfc2VxYnVmcHRyKzBdID0gRVZfVElNSU5HOyBcCisJCQkJIAlfc2VxYnVmW19zZXFidWZwdHIrMV0gPSAoZXYpOyBcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisyXSA9IDA7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrM10gPSAwO1wKKwkJCQkgCSoodW5zaWduZWQgaW50ICopJl9zZXFidWZbX3NlcWJ1ZnB0cis0XSA9IChwYXJtKTsgXAorCQkJCQlfU0VRX0FEVkJVRig4KTt9CisKKyNkZWZpbmUgU0VRX1NUQVJUX1RJTUVSKCkJCV9USU1FUl9FVkVOVChUTVJfU1RBUlQsIDApCisjZGVmaW5lIFNFUV9TVE9QX1RJTUVSKCkJCV9USU1FUl9FVkVOVChUTVJfU1RPUCwgMCkKKyNkZWZpbmUgU0VRX0NPTlRJTlVFX1RJTUVSKCkJCV9USU1FUl9FVkVOVChUTVJfQ09OVElOVUUsIDApCisjZGVmaW5lIFNFUV9XQUlUX1RJTUUodGlja3MpCQlfVElNRVJfRVZFTlQoVE1SX1dBSVRfQUJTLCB0aWNrcykKKyNkZWZpbmUgU0VRX0RFTFRBX1RJTUUodGlja3MpCQlfVElNRVJfRVZFTlQoVE1SX1dBSVRfUkVMLCB0aWNrcykKKyNkZWZpbmUgU0VRX0VDSE9fQkFDSyhrZXkpCQlfVElNRVJfRVZFTlQoVE1SX0VDSE8sIGtleSkKKyNkZWZpbmUgU0VRX1NFVF9URU1QTyh2YWx1ZSkJCV9USU1FUl9FVkVOVChUTVJfVEVNUE8sIHZhbHVlKQorI2RlZmluZSBTRVFfU09OR1BPUyhwb3MpCQlfVElNRVJfRVZFTlQoVE1SX1NQUCwgcG9zKQorI2RlZmluZSBTRVFfVElNRV9TSUdOQVRVUkUoc2lnKQkJX1RJTUVSX0VWRU5UKFRNUl9USU1FU0lHLCBzaWcpCisKKy8qCisgKiBMb2NhbCBjb250cm9sIGV2ZW50cworICovCisKKyNkZWZpbmUgX0xPQ0FMX0VWRU5UKGV2LCBwYXJtKQkJe19TRVFfTkVFREJVRig4KTtcCisJCQkJIAlfc2VxYnVmW19zZXFidWZwdHIrMF0gPSBFVl9TRVFfTE9DQUw7IFwKKwkJCQkgCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChldik7IFwKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gMDtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0ciszXSA9IDA7XAorCQkJCSAJKih1bnNpZ25lZCBpbnQgKikmX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gKHBhcm0pOyBcCisJCQkJCV9TRVFfQURWQlVGKDgpO30KKworI2RlZmluZSBTRVFfUExBWUFVRElPKGRldm1hc2spCQlfTE9DQUxfRVZFTlQoTE9DTF9TVEFSVEFVRElPLCBkZXZtYXNrKQorLyoKKyAqIEV2ZW50cyBmb3IgdGhlIGxldmVsIDEgaW50ZXJmYWNlIG9ubHkgCisgKi8KKworI2RlZmluZSBTRVFfTUlESU9VVChkZXZpY2UsIGJ5dGUpCXtfU0VRX05FRURCVUYoNCk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHJdID0gU0VRX01JRElQVVRDO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzFdID0gKGJ5dGUpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gKGRldmljZSk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrM10gPSAwO1wKKwkJCQkJX1NFUV9BRFZCVUYoNCk7fQorCisvKgorICogUGF0Y2ggbG9hZGluZy4KKyAqLworI2RlZmluZSBTRVFfV1JQQVRDSChwYXRjaHgsIGxlbikgXAorCQl7aWYgKF9zZXFidWZwdHIpIFNFUV9EVU1QQlVGKCk7XAorCQkgaWYgKHdyaXRlKHNlcWZkLCAoY2hhciopKHBhdGNoeCksIGxlbik9PS0xKSBcCisJCSAgICBwZXJyb3IoIldyaXRlIHBhdGNoOiAvZGV2L3NlcXVlbmNlciIpO30KKyNkZWZpbmUgU0VRX1dSUEFUQ0gyKHBhdGNoeCwgbGVuKSBcCisJCShTRVFfRFVNUEJVRigpLCB3cml0ZShzZXFmZCwgKGNoYXIqKShwYXRjaHgpLCBsZW4pKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3BpL3NwaWRldi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zcGkvc3BpZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkOWVkMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3BpL3NwaWRldi5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogaW5jbHVkZS9saW51eC9zcGkvc3BpZGV2LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU1dBUFAKKyAqCUFuZHJlYSBQYXRlcm5pYW5pIDxhLnBhdGVybmlhbmlAc3dhcHAtZW5nLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICAqLworCisjaWZuZGVmIFNQSURFVl9ICisjZGVmaW5lIFNQSURFVl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBVc2VyIHNwYWNlIHZlcnNpb25zIG9mIGtlcm5lbCBzeW1ib2xzIGZvciBTUEkgY2xvY2tpbmcgbW9kZXMsCisgKiBtYXRjaGluZyA8bGludXgvc3BpL3NwaS5oPgorICovCisKKyNkZWZpbmUgU1BJX0NQSEEJCTB4MDEKKyNkZWZpbmUgU1BJX0NQT0wJCTB4MDIKKworI2RlZmluZSBTUElfTU9ERV8wCQkoMHwwKQorI2RlZmluZSBTUElfTU9ERV8xCQkoMHxTUElfQ1BIQSkKKyNkZWZpbmUgU1BJX01PREVfMgkJKFNQSV9DUE9MfDApCisjZGVmaW5lIFNQSV9NT0RFXzMJCShTUElfQ1BPTHxTUElfQ1BIQSkKKworI2RlZmluZSBTUElfQ1NfSElHSAkJMHgwNAorI2RlZmluZSBTUElfTFNCX0ZJUlNUCQkweDA4CisjZGVmaW5lIFNQSV8zV0lSRQkJMHgxMAorI2RlZmluZSBTUElfTE9PUAkJMHgyMAorI2RlZmluZSBTUElfTk9fQ1MJCTB4NDAKKyNkZWZpbmUgU1BJX1JFQURZCQkweDgwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogSU9DVEwgY29tbWFuZHMgKi8KKworI2RlZmluZSBTUElfSU9DX01BR0lDCQkJJ2snCisKKy8qKgorICogc3RydWN0IHNwaV9pb2NfdHJhbnNmZXIgLSBkZXNjcmliZXMgYSBzaW5nbGUgU1BJIHRyYW5zZmVyCisgKiBAdHhfYnVmOiBIb2xkcyBwb2ludGVyIHRvIHVzZXJzcGFjZSBidWZmZXIgd2l0aCB0cmFuc21pdCBkYXRhLCBvciBudWxsLgorICoJSWYgbm8gZGF0YSBpcyBwcm92aWRlZCwgemVyb2VzIGFyZSBzaGlmdGVkIG91dC4KKyAqIEByeF9idWY6IEhvbGRzIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGJ1ZmZlciBmb3IgcmVjZWl2ZSBkYXRhLCBvciBudWxsLgorICogQGxlbjogTGVuZ3RoIG9mIHR4IGFuZCByeCBidWZmZXJzLCBpbiBieXRlcy4KKyAqIEBzcGVlZF9oejogVGVtcG9yYXJ5IG92ZXJyaWRlIG9mIHRoZSBkZXZpY2UncyBiaXRyYXRlLgorICogQGJpdHNfcGVyX3dvcmQ6IFRlbXBvcmFyeSBvdmVycmlkZSBvZiB0aGUgZGV2aWNlJ3Mgd29yZHNpemUuCisgKiBAZGVsYXlfdXNlY3M6IElmIG5vbnplcm8sIGhvdyBsb25nIHRvIGRlbGF5IGFmdGVyIHRoZSBsYXN0IGJpdCB0cmFuc2ZlcgorICoJYmVmb3JlIG9wdGlvbmFsbHkgZGVzZWxlY3RpbmcgdGhlIGRldmljZSBiZWZvcmUgdGhlIG5leHQgdHJhbnNmZXIuCisgKiBAY3NfY2hhbmdlOiBUcnVlIHRvIGRlc2VsZWN0IGRldmljZSBiZWZvcmUgc3RhcnRpbmcgdGhlIG5leHQgdHJhbnNmZXIuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgbWFwcGVkIGRpcmVjdGx5IHRvIHRoZSBrZXJuZWwgc3BpX3RyYW5zZmVyIHN0cnVjdHVyZTsKKyAqIHRoZSBmaWVsZHMgaGF2ZSB0aGUgc2FtZSBtZWFuaW5ncywgZXhjZXB0IG9mIGNvdXJzZSB0aGF0IHRoZSBwb2ludGVycworICogYXJlIGluIGEgZGlmZmVyZW50IGFkZHJlc3Mgc3BhY2UgKGFuZCBtYXkgYmUgb2YgZGlmZmVyZW50IHNpemVzIGluIHNvbWUKKyAqIGNhc2VzLCBzdWNoIGFzIDMyLWJpdCBpMzg2IHVzZXJzcGFjZSBvdmVyIGEgNjQtYml0IHg4Nl82NCBrZXJuZWwpLgorICogWmVyby1pbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUsIGluY2x1ZGluZyBjdXJyZW50bHkgdW51c2VkIGZpZWxkcywgdG8KKyAqIGFjY29tbW9kYXRlIHBvdGVudGlhbCBmdXR1cmUgdXBkYXRlcy4KKyAqCisgKiBTUElfSU9DX01FU1NBR0UgZ2l2ZXMgdXNlcnNwYWNlIHRoZSBlcXVpdmFsZW50IG9mIGtlcm5lbCBzcGlfc3luYygpLgorICogUGFzcyBpdCBhbiBhcnJheSBvZiByZWxhdGVkIHRyYW5zZmVycywgdGhleSdsbCBleGVjdXRlIHRvZ2V0aGVyLgorICogRWFjaCB0cmFuc2ZlciBtYXkgYmUgaGFsZiBkdXBsZXggKGVpdGhlciBkaXJlY3Rpb24pIG9yIGZ1bGwgZHVwbGV4LgorICoKKyAqCXN0cnVjdCBzcGlfaW9jX3RyYW5zZmVyIG1lc2dbNF07CisgKgkuLi4KKyAqCXN0YXR1cyA9IGlvY3RsKGZkLCBTUElfSU9DX01FU1NBR0UoNCksIG1lc2cpOworICoKKyAqIFNvIGZvciBleGFtcGxlIG9uZSB0cmFuc2ZlciBtaWdodCBzZW5kIGEgbmluZSBiaXQgY29tbWFuZCAocmlnaHQgYWxpZ25lZAorICogaW4gYSAxNi1iaXQgd29yZCksIHRoZSBuZXh0IGNvdWxkIHJlYWQgYSBibG9jayBvZiA4LWJpdCBkYXRhIGJlZm9yZQorICogdGVybWluYXRpbmcgdGhhdCBjb21tYW5kIGJ5IHRlbXBvcmFyaWx5IGRlc2VsZWN0aW5nIHRoZSBjaGlwOyB0aGUgbmV4dAorICogY291bGQgc2VuZCBhIGRpZmZlcmVudCBuaW5lIGJpdCBjb21tYW5kIChyZS1zZWxlY3RpbmcgdGhlIGNoaXApLCBhbmQgdGhlCisgKiBsYXN0IHRyYW5zZmVyIG1pZ2h0IHdyaXRlIHNvbWUgcmVnaXN0ZXIgdmFsdWVzLgorICovCitzdHJ1Y3Qgc3BpX2lvY190cmFuc2ZlciB7CisJX191NjQJCXR4X2J1ZjsKKwlfX3U2NAkJcnhfYnVmOworCisJX191MzIJCWxlbjsKKwlfX3UzMgkJc3BlZWRfaHo7CisKKwlfX3UxNgkJZGVsYXlfdXNlY3M7CisJX191OAkJYml0c19wZXJfd29yZDsKKwlfX3U4CQljc19jaGFuZ2U7CisJX191MzIJCXBhZDsKKworCS8qIElmIHRoZSBjb250ZW50cyBvZiAnc3RydWN0IHNwaV9pb2NfdHJhbnNmZXInIGV2ZXIgY2hhbmdlCisJICogaW5jb21wYXRpYmx5LCB0aGVuIHRoZSBpb2N0bCBudW1iZXIgKGN1cnJlbnRseSAwKSBtdXN0IGNoYW5nZTsKKwkgKiBpb2N0bHMgd2l0aCBjb25zdGFudCBzaXplIGZpZWxkcyBnZXQgYSBiaXQgbW9yZSBpbiB0aGUgd2F5IG9mCisJICogZXJyb3IgY2hlY2tpbmcgdGhhbiBvbmVzIChsaWtlIHRoaXMpIHdoZXJlIHRoYXQgZmllbGQgdmFyaWVzLgorCSAqCisJICogTk9URTogc3RydWN0IGxheW91dCBpcyB0aGUgc2FtZSBpbiA2NGJpdCBhbmQgMzJiaXQgdXNlcnNwYWNlLgorCSAqLworfTsKKworLyogbm90IGFsbCBwbGF0Zm9ybXMgdXNlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPiBvciBfSU9DX1RZUEVDSEVDSygpIC4uLiAqLworI2RlZmluZSBTUElfTVNHU0laRShOKSBcCisJKCgoKE4pKihzaXplb2YgKHN0cnVjdCBzcGlfaW9jX3RyYW5zZmVyKSkpIDwgKDEgPDwgX0lPQ19TSVpFQklUUykpIFwKKwkJPyAoKE4pKihzaXplb2YgKHN0cnVjdCBzcGlfaW9jX3RyYW5zZmVyKSkpIDogMCkKKyNkZWZpbmUgU1BJX0lPQ19NRVNTQUdFKE4pIF9JT1coU1BJX0lPQ19NQUdJQywgMCwgY2hhcltTUElfTVNHU0laRShOKV0pCisKKworLyogUmVhZCAvIFdyaXRlIG9mIFNQSSBtb2RlIChTUElfTU9ERV8wLi5TUElfTU9ERV8zKSAqLworI2RlZmluZSBTUElfSU9DX1JEX01PREUJCQlfSU9SKFNQSV9JT0NfTUFHSUMsIDEsIF9fdTgpCisjZGVmaW5lIFNQSV9JT0NfV1JfTU9ERQkJCV9JT1coU1BJX0lPQ19NQUdJQywgMSwgX191OCkKKworLyogUmVhZCAvIFdyaXRlIFNQSSBiaXQganVzdGlmaWNhdGlvbiAqLworI2RlZmluZSBTUElfSU9DX1JEX0xTQl9GSVJTVAkJX0lPUihTUElfSU9DX01BR0lDLCAyLCBfX3U4KQorI2RlZmluZSBTUElfSU9DX1dSX0xTQl9GSVJTVAkJX0lPVyhTUElfSU9DX01BR0lDLCAyLCBfX3U4KQorCisvKiBSZWFkIC8gV3JpdGUgU1BJIGRldmljZSB3b3JkIGxlbmd0aCAoMS4uTikgKi8KKyNkZWZpbmUgU1BJX0lPQ19SRF9CSVRTX1BFUl9XT1JECV9JT1IoU1BJX0lPQ19NQUdJQywgMywgX191OCkKKyNkZWZpbmUgU1BJX0lPQ19XUl9CSVRTX1BFUl9XT1JECV9JT1coU1BJX0lPQ19NQUdJQywgMywgX191OCkKKworLyogUmVhZCAvIFdyaXRlIFNQSSBkZXZpY2UgZGVmYXVsdCBtYXggc3BlZWQgaHogKi8KKyNkZWZpbmUgU1BJX0lPQ19SRF9NQVhfU1BFRURfSFoJCV9JT1IoU1BJX0lPQ19NQUdJQywgNCwgX191MzIpCisjZGVmaW5lIFNQSV9JT0NfV1JfTUFYX1NQRUVEX0haCQlfSU9XKFNQSV9JT0NfTUFHSUMsIDQsIF9fdTMyKQorCisKKworI2VuZGlmIC8qIFNQSURFVl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N0YXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOWYwMzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N0YXQuaApAQCAtMCwwICsxLDQ1IEBACisjaWZuZGVmIF9MSU5VWF9TVEFUX0gKKyNkZWZpbmUgX0xJTlVYX1NUQVRfSAorCisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpCisKKyNkZWZpbmUgU19JRk1UICAwMDE3MDAwMAorI2RlZmluZSBTX0lGU09DSyAwMTQwMDAwCisjZGVmaW5lIFNfSUZMTksJIDAxMjAwMDAKKyNkZWZpbmUgU19JRlJFRyAgMDEwMDAwMAorI2RlZmluZSBTX0lGQkxLICAwMDYwMDAwCisjZGVmaW5lIFNfSUZESVIgIDAwNDAwMDAKKyNkZWZpbmUgU19JRkNIUiAgMDAyMDAwMAorI2RlZmluZSBTX0lGSUZPICAwMDEwMDAwCisjZGVmaW5lIFNfSVNVSUQgIDAwMDQwMDAKKyNkZWZpbmUgU19JU0dJRCAgMDAwMjAwMAorI2RlZmluZSBTX0lTVlRYICAwMDAxMDAwCisKKyNkZWZpbmUgU19JU0xOSyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkxOSykKKyNkZWZpbmUgU19JU1JFRyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRlJFRykKKyNkZWZpbmUgU19JU0RJUihtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkRJUikKKyNkZWZpbmUgU19JU0NIUihtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkNIUikKKyNkZWZpbmUgU19JU0JMSyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkJMSykKKyNkZWZpbmUgU19JU0ZJRk8obSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZJRk8pCisjZGVmaW5lIFNfSVNTT0NLKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGU09DSykKKworI2RlZmluZSBTX0lSV1hVIDAwNzAwCisjZGVmaW5lIFNfSVJVU1IgMDA0MDAKKyNkZWZpbmUgU19JV1VTUiAwMDIwMAorI2RlZmluZSBTX0lYVVNSIDAwMTAwCisKKyNkZWZpbmUgU19JUldYRyAwMDA3MAorI2RlZmluZSBTX0lSR1JQIDAwMDQwCisjZGVmaW5lIFNfSVdHUlAgMDAwMjAKKyNkZWZpbmUgU19JWEdSUCAwMDAxMAorCisjZGVmaW5lIFNfSVJXWE8gMDAwMDcKKyNkZWZpbmUgU19JUk9USCAwMDAwNAorI2RlZmluZSBTX0lXT1RIIDAwMDAyCisjZGVmaW5lIFNfSVhPVEggMDAwMDEKKworI2VuZGlmCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N0ZGRlZi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdGRkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTJjZTFiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdGRkZWYuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9MSU5VWF9TVERERUZfSAorI2RlZmluZSBfTElOVVhfU1REREVGX0gKKworCisKKyN1bmRlZiBOVUxMCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgTlVMTCAwCisjZWxzZQorI2RlZmluZSBOVUxMICgodm9pZCAqKTApCisjZW5kaWYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3RyaW5nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZWQ4NDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfTElOVVhfU1RSSU5HX0hfCisjZGVmaW5lIF9MSU5VWF9TVFJJTkdfSF8KKworLyogV2UgZG9uJ3Qgd2FudCBzdHJpbmdzLmggc3R1ZmYgYmVpbmcgdXNlZCBieSB1c2VyIHN0dWZmIGJ5IGFjY2lkZW50ICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZiAvKiBfTElOVVhfU1RSSU5HX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N1bnJwYy9kZWJ1Zy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdW5ycGMvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWFkMzE4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdW5ycGMvZGVidWcuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogbGludXgvaW5jbHVkZS9saW51eC9zdW5ycGMvZGVidWcuaAorICoKKyAqIERlYnVnZ2luZyBzdXBwb3J0IGZvciBzdW5ycGMgbW9kdWxlCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9TVU5SUENfREVCVUdfSF8KKyNkZWZpbmUgX0xJTlVYX1NVTlJQQ19ERUJVR19IXworCisvKgorICogUlBDIGRlYnVnIGZhY2lsaXRpZXMKKyAqLworI2RlZmluZSBSUENEQkdfWFBSVAkJMHgwMDAxCisjZGVmaW5lIFJQQ0RCR19DQUxMCQkweDAwMDIKKyNkZWZpbmUgUlBDREJHX0RFQlVHCQkweDAwMDQKKyNkZWZpbmUgUlBDREJHX05GUwkJMHgwMDA4CisjZGVmaW5lIFJQQ0RCR19BVVRICQkweDAwMTAKKyNkZWZpbmUgUlBDREJHX0JJTkQJCTB4MDAyMAorI2RlZmluZSBSUENEQkdfU0NIRUQJCTB4MDA0MAorI2RlZmluZSBSUENEQkdfVFJBTlMJCTB4MDA4MAorI2RlZmluZSBSUENEQkdfU1ZDWFBSVAkJMHgwMTAwCisjZGVmaW5lIFJQQ0RCR19TVkNEU1AJCTB4MDIwMAorI2RlZmluZSBSUENEQkdfTUlTQwkJMHgwNDAwCisjZGVmaW5lIFJQQ0RCR19DQUNIRQkJMHgwODAwCisjZGVmaW5lIFJQQ0RCR19BTEwJCTB4N2ZmZgorCisKKy8qCisgKiBEZWNsYXJhdGlvbnMgZm9yIHRoZSBzeXNjdGwgZGVidWcgaW50ZXJmYWNlLCB3aGljaCBhbGxvd3MgdG8gcmVhZCBvcgorICogY2hhbmdlIHRoZSBkZWJ1ZyBmbGFncyBmb3IgcnBjLCBuZnMsIG5mc2QsIGFuZCBsb2NrZC4gU2luY2UgdGhlIHN1bnJwYworICogbW9kdWxlIGN1cnJlbnRseSByZWdpc3RlcnMgaXRzIHN5c2N0bCB0YWJsZSBkeW5hbWljYWxseSwgdGhlIHN5c2N0bCBwYXRoCisgKiBmb3IgbW9kdWxlIEZPTyBpcyA8Q1RMX1NVTlJQQywgQ1RMX0ZPT0RFQlVHPi4KKyAqLworCitlbnVtIHsKKwlDVExfUlBDREVCVUcgPSAxLAorCUNUTF9ORlNERUJVRywKKwlDVExfTkZTRERFQlVHLAorCUNUTF9OTE1ERUJVRywKKwlDVExfU0xPVFRBQkxFX1VEUCwKKwlDVExfU0xPVFRBQkxFX1RDUCwKKwlDVExfTUlOX1JFU1ZQT1JULAorCUNUTF9NQVhfUkVTVlBPUlQsCit9OworCisjZW5kaWYgLyogX0xJTlVYX1NVTlJQQ19ERUJVR19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdXNwZW5kX2lvY3Rscy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdXNwZW5kX2lvY3Rscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzAzODIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N1c3BlbmRfaW9jdGxzLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBfTElOVVhfU1VTUEVORF9JT0NUTFNfSAorI2RlZmluZSBfTElOVVhfU1VTUEVORF9JT0NUTFNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgdGhlIHZhbHVlcyBuZWVkZWQgZm9yIHRoZSBpZGVudGlmaWNhdGlvbgorICogb2YgdGhlIHJlc3VtZSBzd2FwIGFyZWEgZnJvbSBhIHVzZXIgc3BhY2UgdG8gdGhlIGtlcm5lbCB2aWEgdGhlCisgKiBTTkFQU0hPVF9TRVRfU1dBUF9BUkVBIGlvY3RsCisgKi8KK3N0cnVjdCByZXN1bWVfc3dhcF9hcmVhIHsKKwlfX2tlcm5lbF9sb2ZmX3Qgb2Zmc2V0OworCV9fdTMyIGRldjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgU05BUFNIT1RfSU9DX01BR0lDCSczJworI2RlZmluZSBTTkFQU0hPVF9GUkVFWkUJCQlfSU8oU05BUFNIT1RfSU9DX01BR0lDLCAxKQorI2RlZmluZSBTTkFQU0hPVF9VTkZSRUVaRQkJX0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMikKKyNkZWZpbmUgU05BUFNIT1RfQVRPTUlDX1JFU1RPUkUJCV9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDQpCisjZGVmaW5lIFNOQVBTSE9UX0ZSRUUJCQlfSU8oU05BUFNIT1RfSU9DX01BR0lDLCA1KQorI2RlZmluZSBTTkFQU0hPVF9GUkVFX1NXQVBfUEFHRVMJX0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgOSkKKyNkZWZpbmUgU05BUFNIT1RfUzJSQU0JCQlfSU8oU05BUFNIT1RfSU9DX01BR0lDLCAxMSkKKyNkZWZpbmUgU05BUFNIT1RfU0VUX1NXQVBfQVJFQQkJX0lPVyhTTkFQU0hPVF9JT0NfTUFHSUMsIDEzLCBcCisJCQkJCQkJc3RydWN0IHJlc3VtZV9zd2FwX2FyZWEpCisjZGVmaW5lIFNOQVBTSE9UX0dFVF9JTUFHRV9TSVpFCQlfSU9SKFNOQVBTSE9UX0lPQ19NQUdJQywgMTQsIF9fa2VybmVsX2xvZmZfdCkKKyNkZWZpbmUgU05BUFNIT1RfUExBVEZPUk1fU1VQUE9SVAlfSU8oU05BUFNIT1RfSU9DX01BR0lDLCAxNSkKKyNkZWZpbmUgU05BUFNIT1RfUE9XRVJfT0ZGCQlfSU8oU05BUFNIT1RfSU9DX01BR0lDLCAxNikKKyNkZWZpbmUgU05BUFNIT1RfQ1JFQVRFX0lNQUdFCQlfSU9XKFNOQVBTSE9UX0lPQ19NQUdJQywgMTcsIGludCkKKyNkZWZpbmUgU05BUFNIT1RfUFJFRl9JTUFHRV9TSVpFCV9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDE4KQorI2RlZmluZSBTTkFQU0hPVF9BVkFJTF9TV0FQX1NJWkUJX0lPUihTTkFQU0hPVF9JT0NfTUFHSUMsIDE5LCBfX2tlcm5lbF9sb2ZmX3QpCisjZGVmaW5lIFNOQVBTSE9UX0FMTE9DX1NXQVBfUEFHRQlfSU9SKFNOQVBTSE9UX0lPQ19NQUdJQywgMjAsIF9fa2VybmVsX2xvZmZfdCkKKyNkZWZpbmUgU05BUFNIT1RfSU9DX01BWE5SCTIwCisKKyNlbmRpZiAvKiBfTElOVVhfU1VTUEVORF9JT0NUTFNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zd2FiLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTRhZmRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zd2FiLmgKQEAgLTAsMCArMSwyODIgQEAKKyNpZm5kZWYgX0xJTlVYX1NXQUJfSAorI2RlZmluZSBfTElOVVhfU1dBQl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KKworLyoKKyAqIGNhc3RzIGFyZSBuZWNlc3NhcnkgZm9yIGNvbnN0YW50cywgYmVjYXVzZSB3ZSBuZXZlciBrbm93IGhvdyBmb3Igc3VyZQorICogaG93IFUvVUwvVUxMIG1hcCB0byBfX3UxNiwgX191MzIsIF9fdTY0LiBBdCBsZWFzdCBub3QgaW4gYSBwb3J0YWJsZSB3YXkuCisgKi8KKyNkZWZpbmUgX19fY29uc3RhbnRfc3dhYjE2KHgpICgoX191MTYpKAkJCQlcCisJKCgoX191MTYpKHgpICYgKF9fdTE2KTB4MDBmZlUpIDw8IDgpIHwJCQlcCisJKCgoX191MTYpKHgpICYgKF9fdTE2KTB4ZmYwMFUpID4+IDgpKSkKKworI2RlZmluZSBfX19jb25zdGFudF9zd2FiMzIoeCkgKChfX3UzMikoCQkJCVwKKwkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMDAwMDBmZlVMKSA8PCAyNCkgfAkJXAorCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDBmZjAwVUwpIDw8ICA4KSB8CQlcCisJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDBmZjAwMDBVTCkgPj4gIDgpIHwJCVwKKwkoKChfX3UzMikoeCkgJiAoX191MzIpMHhmZjAwMDAwMFVMKSA+PiAyNCkpKQorCisjZGVmaW5lIF9fX2NvbnN0YW50X3N3YWI2NCh4KSAoKF9fdTY0KSgJCQkJXAorCSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDAwMDAwMDAwMDAwZmZVTEwpIDw8IDU2KSB8CVwKKwkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwMDBmZjAwVUxMKSA8PCA0MCkgfAlcCisJKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMGZmMDAwMFVMTCkgPDwgMjQpIHwJXAorCSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8CVwKKwkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAgOCkgfAlcCisJKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMGZmMDAwMDAwMDAwMFVMTCkgPj4gMjQpIHwJXAorCSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8CVwKKwkoKChfX3U2NCkoeCkgJiAoX191NjQpMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSA+PiA1NikpKQorCisjZGVmaW5lIF9fX2NvbnN0YW50X3N3YWh3MzIoeCkgKChfX3UzMikoCQkJXAorCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDBmZmZmVUwpIDw8IDE2KSB8CQlcCisJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4ZmZmZjAwMDBVTCkgPj4gMTYpKSkKKworI2RlZmluZSBfX19jb25zdGFudF9zd2FoYjMyKHgpICgoX191MzIpKAkJCVwKKwkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMGZmMDBmZlVMKSA8PCA4KSB8CQlcCisJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4ZmYwMGZmMDBVTCkgPj4gOCkpKQorCisvKgorICogSW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgYXMgaW5saW5lcywgYnV0IGRlZmluZSB0aGUgaW50ZXJmYWNlIHVzaW5nCisgKiBtYWNyb3MgdG8gYWxsb3cgY29uc3RhbnQgZm9sZGluZyB3aGVuIHBvc3NpYmxlOgorICogX19fc3dhYjE2LCBfX19zd2FiMzIsIF9fX3N3YWI2NCwgX19fc3dhaHczMiwgX19fc3dhaGIzMgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IF9fZnN3YWIxNihfX3UxNiB2YWwpCit7CisjaWZkZWYgX19hcmNoX3N3YWIxNgorCXJldHVybiBfX2FyY2hfc3dhYjE2KHZhbCk7CisjZWxzZQorCXJldHVybiBfX19jb25zdGFudF9zd2FiMTYodmFsKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX2Zzd2FiMzIoX191MzIgdmFsKQoreworI2lmZGVmIF9fYXJjaF9zd2FiMzIKKwlyZXR1cm4gX19hcmNoX3N3YWIzMih2YWwpOworI2Vsc2UKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhYjMyKHZhbCk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gX191NjQgX19mc3dhYjY0KF9fdTY0IHZhbCkKK3sKKyNpZmRlZiBfX2FyY2hfc3dhYjY0CisJcmV0dXJuIF9fYXJjaF9zd2FiNjQodmFsKTsKKyNlbGlmIGRlZmluZWQoX19TV0FCXzY0X1RIUlVfMzJfXykKKwlfX3UzMiBoID0gdmFsID4+IDMyOworCV9fdTMyIGwgPSB2YWwgJiAoKDFVTEwgPDwgMzIpIC0gMSk7CisJcmV0dXJuICgoKF9fdTY0KV9fZnN3YWIzMihsKSkgPDwgMzIpIHwgKChfX3U2NCkoX19mc3dhYjMyKGgpKSk7CisjZWxzZQorCXJldHVybiBfX19jb25zdGFudF9zd2FiNjQodmFsKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX2Zzd2FodzMyKF9fdTMyIHZhbCkKK3sKKyNpZmRlZiBfX2FyY2hfc3dhaHczMgorCXJldHVybiBfX2FyY2hfc3dhaHczMih2YWwpOworI2Vsc2UKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhaHczMih2YWwpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIF9fZnN3YWhiMzIoX191MzIgdmFsKQoreworI2lmZGVmIF9fYXJjaF9zd2FoYjMyCisJcmV0dXJuIF9fYXJjaF9zd2FoYjMyKHZhbCk7CisjZWxzZQorCXJldHVybiBfX19jb25zdGFudF9zd2FoYjMyKHZhbCk7CisjZW5kaWYKK30KKworLyoqCisgKiBfX3N3YWIxNiAtIHJldHVybiBhIGJ5dGVzd2FwcGVkIDE2LWJpdCB2YWx1ZQorICogQHg6IHZhbHVlIHRvIGJ5dGVzd2FwCisgKi8KKyNkZWZpbmUgX19zd2FiMTYoeCkJCQkJXAorCShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MTYpKHgpKSA/CVwKKwlfX19jb25zdGFudF9zd2FiMTYoeCkgOgkJCVwKKwlfX2Zzd2FiMTYoeCkpCisKKy8qKgorICogX19zd2FiMzIgLSByZXR1cm4gYSBieXRlc3dhcHBlZCAzMi1iaXQgdmFsdWUKKyAqIEB4OiB2YWx1ZSB0byBieXRlc3dhcAorICovCisjZGVmaW5lIF9fc3dhYjMyKHgpCQkJCVwKKwkoX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTMyKSh4KSkgPwlcCisJX19fY29uc3RhbnRfc3dhYjMyKHgpIDoJCQlcCisJX19mc3dhYjMyKHgpKQorCisvKioKKyAqIF9fc3dhYjY0IC0gcmV0dXJuIGEgYnl0ZXN3YXBwZWQgNjQtYml0IHZhbHVlCisgKiBAeDogdmFsdWUgdG8gYnl0ZXN3YXAKKyAqLworI2RlZmluZSBfX3N3YWI2NCh4KQkJCQlcCisJKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3U2NCkoeCkpID8JXAorCV9fX2NvbnN0YW50X3N3YWI2NCh4KSA6CQkJXAorCV9fZnN3YWI2NCh4KSkKKworLyoqCisgKiBfX3N3YWh3MzIgLSByZXR1cm4gYSB3b3JkLXN3YXBwZWQgMzItYml0IHZhbHVlCisgKiBAeDogdmFsdWUgdG8gd29yZHN3YXAKKyAqCisgKiBfX3N3YWh3MzIoMHgxMjM0MDAwMCkgaXMgMHgwMDAwMTIzNAorICovCisjZGVmaW5lIF9fc3dhaHczMih4KQkJCQlcCisJKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UzMikoeCkpID8JXAorCV9fX2NvbnN0YW50X3N3YWh3MzIoeCkgOgkJXAorCV9fZnN3YWh3MzIoeCkpCisKKy8qKgorICogX19zd2FoYjMyIC0gcmV0dXJuIGEgaGlnaCBhbmQgbG93IGJ5dGUtc3dhcHBlZCAzMi1iaXQgdmFsdWUKKyAqIEB4OiB2YWx1ZSB0byBieXRlc3dhcAorICoKKyAqIF9fc3dhaGIzMigweDEyMzQ1Njc4KSBpcyAweDM0MTI3ODU2CisgKi8KKyNkZWZpbmUgX19zd2FoYjMyKHgpCQkJCVwKKwkoX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTMyKSh4KSkgPwlcCisJX19fY29uc3RhbnRfc3dhaGIzMih4KSA6CQlcCisJX19mc3dhaGIzMih4KSkKKworLyoqCisgKiBfX3N3YWIxNnAgLSByZXR1cm4gYSBieXRlc3dhcHBlZCAxNi1iaXQgdmFsdWUgZnJvbSBhIHBvaW50ZXIKKyAqIEBwOiBwb2ludGVyIHRvIGEgbmF0dXJhbGx5LWFsaWduZWQgMTYtYml0IHZhbHVlCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IF9fc3dhYjE2cChjb25zdCBfX3UxNiAqcCkKK3sKKyNpZmRlZiBfX2FyY2hfc3dhYjE2cAorCXJldHVybiBfX2FyY2hfc3dhYjE2cChwKTsKKyNlbHNlCisJcmV0dXJuIF9fc3dhYjE2KCpwKTsKKyNlbmRpZgorfQorCisvKioKKyAqIF9fc3dhYjMycCAtIHJldHVybiBhIGJ5dGVzd2FwcGVkIDMyLWJpdCB2YWx1ZSBmcm9tIGEgcG9pbnRlcgorICogQHA6IHBvaW50ZXIgdG8gYSBuYXR1cmFsbHktYWxpZ25lZCAzMi1iaXQgdmFsdWUKKyAqLworc3RhdGljIF9faW5saW5lX18gX191MzIgX19zd2FiMzJwKGNvbnN0IF9fdTMyICpwKQoreworI2lmZGVmIF9fYXJjaF9zd2FiMzJwCisJcmV0dXJuIF9fYXJjaF9zd2FiMzJwKHApOworI2Vsc2UKKwlyZXR1cm4gX19zd2FiMzIoKnApOworI2VuZGlmCit9CisKKy8qKgorICogX19zd2FiNjRwIC0gcmV0dXJuIGEgYnl0ZXN3YXBwZWQgNjQtYml0IHZhbHVlIGZyb20gYSBwb2ludGVyCisgKiBAcDogcG9pbnRlciB0byBhIG5hdHVyYWxseS1hbGlnbmVkIDY0LWJpdCB2YWx1ZQorICovCitzdGF0aWMgX19pbmxpbmVfXyBfX3U2NCBfX3N3YWI2NHAoY29uc3QgX191NjQgKnApCit7CisjaWZkZWYgX19hcmNoX3N3YWI2NHAKKwlyZXR1cm4gX19hcmNoX3N3YWI2NHAocCk7CisjZWxzZQorCXJldHVybiBfX3N3YWI2NCgqcCk7CisjZW5kaWYKK30KKworLyoqCisgKiBfX3N3YWh3MzJwIC0gcmV0dXJuIGEgd29yZHN3YXBwZWQgMzItYml0IHZhbHVlIGZyb20gYSBwb2ludGVyCisgKiBAcDogcG9pbnRlciB0byBhIG5hdHVyYWxseS1hbGlnbmVkIDMyLWJpdCB2YWx1ZQorICoKKyAqIFNlZSBfX3N3YWh3MzIoKSBmb3IgZGV0YWlscyBvZiB3b3Jkc3dhcHBpbmcuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIF9fc3dhaHczMnAoY29uc3QgX191MzIgKnApCit7CisjaWZkZWYgX19hcmNoX3N3YWh3MzJwCisJcmV0dXJuIF9fYXJjaF9zd2FodzMycChwKTsKKyNlbHNlCisJcmV0dXJuIF9fc3dhaHczMigqcCk7CisjZW5kaWYKK30KKworLyoqCisgKiBfX3N3YWhiMzJwIC0gcmV0dXJuIGEgaGlnaCBhbmQgbG93IGJ5dGVzd2FwcGVkIDMyLWJpdCB2YWx1ZSBmcm9tIGEgcG9pbnRlcgorICogQHA6IHBvaW50ZXIgdG8gYSBuYXR1cmFsbHktYWxpZ25lZCAzMi1iaXQgdmFsdWUKKyAqCisgKiBTZWUgX19zd2FoYjMyKCkgZm9yIGRldGFpbHMgb2YgaGlnaC9sb3cgYnl0ZXN3YXBwaW5nLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX3N3YWhiMzJwKGNvbnN0IF9fdTMyICpwKQoreworI2lmZGVmIF9fYXJjaF9zd2FoYjMycAorCXJldHVybiBfX2FyY2hfc3dhaGIzMnAocCk7CisjZWxzZQorCXJldHVybiBfX3N3YWhiMzIoKnApOworI2VuZGlmCit9CisKKy8qKgorICogX19zd2FiMTZzIC0gYnl0ZXN3YXAgYSAxNi1iaXQgdmFsdWUgaW4tcGxhY2UKKyAqIEBwOiBwb2ludGVyIHRvIGEgbmF0dXJhbGx5LWFsaWduZWQgMTYtYml0IHZhbHVlCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiMTZzKF9fdTE2ICpwKQoreworI2lmZGVmIF9fYXJjaF9zd2FiMTZzCisJX19hcmNoX3N3YWIxNnMocCk7CisjZWxzZQorCSpwID0gX19zd2FiMTZwKHApOworI2VuZGlmCit9CisvKioKKyAqIF9fc3dhYjMycyAtIGJ5dGVzd2FwIGEgMzItYml0IHZhbHVlIGluLXBsYWNlCisgKiBAcDogcG9pbnRlciB0byBhIG5hdHVyYWxseS1hbGlnbmVkIDMyLWJpdCB2YWx1ZQorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc3dhYjMycyhfX3UzMiAqcCkKK3sKKyNpZmRlZiBfX2FyY2hfc3dhYjMycworCV9fYXJjaF9zd2FiMzJzKHApOworI2Vsc2UKKwkqcCA9IF9fc3dhYjMycChwKTsKKyNlbmRpZgorfQorCisvKioKKyAqIF9fc3dhYjY0cyAtIGJ5dGVzd2FwIGEgNjQtYml0IHZhbHVlIGluLXBsYWNlCisgKiBAcDogcG9pbnRlciB0byBhIG5hdHVyYWxseS1hbGlnbmVkIDY0LWJpdCB2YWx1ZQorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc3dhYjY0cyhfX3U2NCAqcCkKK3sKKyNpZmRlZiBfX2FyY2hfc3dhYjY0cworCV9fYXJjaF9zd2FiNjRzKHApOworI2Vsc2UKKwkqcCA9IF9fc3dhYjY0cChwKTsKKyNlbmRpZgorfQorCisvKioKKyAqIF9fc3dhaHczMnMgLSB3b3Jkc3dhcCBhIDMyLWJpdCB2YWx1ZSBpbi1wbGFjZQorICogQHA6IHBvaW50ZXIgdG8gYSBuYXR1cmFsbHktYWxpZ25lZCAzMi1iaXQgdmFsdWUKKyAqCisgKiBTZWUgX19zd2FodzMyKCkgZm9yIGRldGFpbHMgb2Ygd29yZHN3YXBwaW5nCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FodzMycyhfX3UzMiAqcCkKK3sKKyNpZmRlZiBfX2FyY2hfc3dhaHczMnMKKwlfX2FyY2hfc3dhaHczMnMocCk7CisjZWxzZQorCSpwID0gX19zd2FodzMycChwKTsKKyNlbmRpZgorfQorCisvKioKKyAqIF9fc3dhaGIzMnMgLSBoaWdoIGFuZCBsb3cgYnl0ZXN3YXAgYSAzMi1iaXQgdmFsdWUgaW4tcGxhY2UKKyAqIEBwOiBwb2ludGVyIHRvIGEgbmF0dXJhbGx5LWFsaWduZWQgMzItYml0IHZhbHVlCisgKgorICogU2VlIF9fc3dhaGIzMigpIGZvciBkZXRhaWxzIG9mIGhpZ2ggYW5kIGxvdyBieXRlIHN3YXBwaW5nCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FoYjMycyhfX3UzMiAqcCkKK3sKKyNpZmRlZiBfX2FyY2hfc3dhaGIzMnMKKwlfX2FyY2hfc3dhaGIzMnMocCk7CisjZWxzZQorCSpwID0gX19zd2FoYjMycChwKTsKKyNlbmRpZgorfQorCisKKyNlbmRpZiAvKiBfTElOVVhfU1dBQl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N5bmNsaW5rLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N5bmNsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxODQzNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3luY2xpbmsuaApAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIFN5bmNMaW5rIE11bHRpcHJvdG9jb2wgU2VyaWFsIEFkYXB0ZXIgRHJpdmVyCisgKgorICogJElkOiBzeW5jbGluay5oLHYgMy4xNCAyMDA2LzA3LzE3IDIwOjE1OjQzIHBhdWxrZiBFeHAgJAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIGJ5IE1pY3JvZ2F0ZSBDb3Jwb3JhdGlvbgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSBpcyBwZXJtaXR0ZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIChHUEwpCisgKi8KKworI2lmbmRlZiBfU1lOQ0xJTktfSF8KKyNkZWZpbmUgX1NZTkNMSU5LX0hfCisjZGVmaW5lIFNZTkNMSU5LX0hfVkVSU0lPTiAzLjYKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgQklUMAkweDAwMDEKKyNkZWZpbmUgQklUMQkweDAwMDIKKyNkZWZpbmUgQklUMgkweDAwMDQKKyNkZWZpbmUgQklUMwkweDAwMDgKKyNkZWZpbmUgQklUNAkweDAwMTAKKyNkZWZpbmUgQklUNQkweDAwMjAKKyNkZWZpbmUgQklUNgkweDAwNDAKKyNkZWZpbmUgQklUNwkweDAwODAKKyNkZWZpbmUgQklUOAkweDAxMDAKKyNkZWZpbmUgQklUOQkweDAyMDAKKyNkZWZpbmUgQklUMTAJMHgwNDAwCisjZGVmaW5lIEJJVDExCTB4MDgwMAorI2RlZmluZSBCSVQxMgkweDEwMDAKKyNkZWZpbmUgQklUMTMJMHgyMDAwCisjZGVmaW5lIEJJVDE0CTB4NDAwMAorI2RlZmluZSBCSVQxNQkweDgwMDAKKyNkZWZpbmUgQklUMTYJMHgwMDAxMDAwMAorI2RlZmluZSBCSVQxNwkweDAwMDIwMDAwCisjZGVmaW5lIEJJVDE4CTB4MDAwNDAwMDAKKyNkZWZpbmUgQklUMTkJMHgwMDA4MDAwMAorI2RlZmluZSBCSVQyMAkweDAwMTAwMDAwCisjZGVmaW5lIEJJVDIxCTB4MDAyMDAwMDAKKyNkZWZpbmUgQklUMjIJMHgwMDQwMDAwMAorI2RlZmluZSBCSVQyMwkweDAwODAwMDAwCisjZGVmaW5lIEJJVDI0CTB4MDEwMDAwMDAKKyNkZWZpbmUgQklUMjUJMHgwMjAwMDAwMAorI2RlZmluZSBCSVQyNgkweDA0MDAwMDAwCisjZGVmaW5lIEJJVDI3CTB4MDgwMDAwMDAKKyNkZWZpbmUgQklUMjgJMHgxMDAwMDAwMAorI2RlZmluZSBCSVQyOQkweDIwMDAwMDAwCisjZGVmaW5lIEJJVDMwCTB4NDAwMDAwMDAKKyNkZWZpbmUgQklUMzEJMHg4MDAwMDAwMAorCisKKyNkZWZpbmUgSERMQ19NQVhfRlJBTUVfU0laRQk2NTUzNQorI2RlZmluZSBNQVhfQVNZTkNfVFJBTlNNSVQJNDA5NgorI2RlZmluZSBNQVhfQVNZTkNfQlVGRkVSX1NJWkUJNDA5NgorCisjZGVmaW5lIEFTWU5DX1BBUklUWV9OT05FCQkwCisjZGVmaW5lIEFTWU5DX1BBUklUWV9FVkVOCQkxCisjZGVmaW5lIEFTWU5DX1BBUklUWV9PREQJCTIKKyNkZWZpbmUgQVNZTkNfUEFSSVRZX1NQQUNFCQkzCisKKyNkZWZpbmUgSERMQ19GTEFHX1VOREVSUlVOX0FCT1JUNwkweDAwMDAKKyNkZWZpbmUgSERMQ19GTEFHX1VOREVSUlVOX0FCT1JUMTUJMHgwMDAxCisjZGVmaW5lIEhETENfRkxBR19VTkRFUlJVTl9GTEFHCQkweDAwMDIKKyNkZWZpbmUgSERMQ19GTEFHX1VOREVSUlVOX0NSQwkJMHgwMDA0CisjZGVmaW5lIEhETENfRkxBR19TSEFSRV9aRVJPCQkweDAwMTAKKyNkZWZpbmUgSERMQ19GTEFHX0FVVE9fQ1RTCQkweDAwMjAKKyNkZWZpbmUgSERMQ19GTEFHX0FVVE9fRENECQkweDAwNDAKKyNkZWZpbmUgSERMQ19GTEFHX0FVVE9fUlRTCQkweDAwODAKKyNkZWZpbmUgSERMQ19GTEFHX1JYQ19EUExMCQkweDAxMDAKKyNkZWZpbmUgSERMQ19GTEFHX1JYQ19CUkcJCTB4MDIwMAorI2RlZmluZSBIRExDX0ZMQUdfUlhDX1RYQ1BJTgkJMHg4MDAwCisjZGVmaW5lIEhETENfRkxBR19SWENfUlhDUElOCQkweDAwMDAKKyNkZWZpbmUgSERMQ19GTEFHX1RYQ19EUExMCQkweDA0MDAKKyNkZWZpbmUgSERMQ19GTEFHX1RYQ19CUkcJCTB4MDgwMAorI2RlZmluZSBIRExDX0ZMQUdfVFhDX1RYQ1BJTgkJMHgwMDAwCisjZGVmaW5lIEhETENfRkxBR19UWENfUlhDUElOCQkweDAwMDgKKyNkZWZpbmUgSERMQ19GTEFHX0RQTExfRElWOAkJMHgxMDAwCisjZGVmaW5lIEhETENfRkxBR19EUExMX0RJVjE2CQkweDIwMDAKKyNkZWZpbmUgSERMQ19GTEFHX0RQTExfRElWMzIJCTB4MDAwMAorI2RlZmluZSBIRExDX0ZMQUdfSERMQ19MT09QTU9ERQkJMHg0MDAwCisKKyNkZWZpbmUgSERMQ19DUkNfTk9ORQkJCTAKKyNkZWZpbmUgSERMQ19DUkNfMTZfQ0NJVFQJCTEKKyNkZWZpbmUgSERMQ19DUkNfMzJfQ0NJVFQJCTIKKyNkZWZpbmUgSERMQ19DUkNfTUFTSwkJCTB4MDBmZgorI2RlZmluZSBIRExDX0NSQ19SRVRVUk5fRVgJCTB4ODAwMAorCisjZGVmaW5lIFJYX09LCQkJCTAKKyNkZWZpbmUgUlhfQ1JDX0VSUk9SCQkJMQorCisjZGVmaW5lIEhETENfVFhJRExFX0ZMQUdTCQkwCisjZGVmaW5lIEhETENfVFhJRExFX0FMVF9aRVJPU19PTkVTCTEKKyNkZWZpbmUgSERMQ19UWElETEVfWkVST1MJCTIKKyNkZWZpbmUgSERMQ19UWElETEVfT05FUwkJMworI2RlZmluZSBIRExDX1RYSURMRV9BTFRfTUFSS19TUEFDRQk0CisjZGVmaW5lIEhETENfVFhJRExFX1NQQUNFCQk1CisjZGVmaW5lIEhETENfVFhJRExFX01BUksJCTYKKyNkZWZpbmUgSERMQ19UWElETEVfQ1VTVE9NXzggICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEhETENfVFhJRExFX0NVU1RPTV8xNiAgICAgICAgICAgMHgyMDAwMDAwMAorCisjZGVmaW5lIEhETENfRU5DT0RJTkdfTlJaCQkJMAorI2RlZmluZSBIRExDX0VOQ09ESU5HX05SWkIJCQkxCisjZGVmaW5lIEhETENfRU5DT0RJTkdfTlJaSV9NQVJLCQkJMgorI2RlZmluZSBIRExDX0VOQ09ESU5HX05SWklfU1BBQ0UJCTMKKyNkZWZpbmUgSERMQ19FTkNPRElOR19OUlpJCQkJSERMQ19FTkNPRElOR19OUlpJX1NQQUNFCisjZGVmaW5lIEhETENfRU5DT0RJTkdfQklQSEFTRV9NQVJLCQk0CisjZGVmaW5lIEhETENfRU5DT0RJTkdfQklQSEFTRV9TUEFDRQkJNQorI2RlZmluZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTEVWRUwJCTYKKyNkZWZpbmUgSERMQ19FTkNPRElOR19ESUZGX0JJUEhBU0VfTEVWRUwJNworCisjZGVmaW5lIEhETENfUFJFQU1CTEVfTEVOR1RIXzhCSVRTCTAKKyNkZWZpbmUgSERMQ19QUkVBTUJMRV9MRU5HVEhfMTZCSVRTCTEKKyNkZWZpbmUgSERMQ19QUkVBTUJMRV9MRU5HVEhfMzJCSVRTCTIKKyNkZWZpbmUgSERMQ19QUkVBTUJMRV9MRU5HVEhfNjRCSVRTCTMKKworI2RlZmluZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fTk9ORQkwCisjZGVmaW5lIEhETENfUFJFQU1CTEVfUEFUVEVSTl9aRVJPUwkxCisjZGVmaW5lIEhETENfUFJFQU1CTEVfUEFUVEVSTl9GTEFHUwkyCisjZGVmaW5lIEhETENfUFJFQU1CTEVfUEFUVEVSTl8xMAkzCisjZGVmaW5lIEhETENfUFJFQU1CTEVfUEFUVEVSTl8wMQk0CisjZGVmaW5lIEhETENfUFJFQU1CTEVfUEFUVEVSTl9PTkVTCTUKKworI2RlZmluZSBNR1NMX01PREVfQVNZTkMJCTEKKyNkZWZpbmUgTUdTTF9NT0RFX0hETEMJCTIKKyNkZWZpbmUgTUdTTF9NT0RFX01PTk9TWU5DCTMKKyNkZWZpbmUgTUdTTF9NT0RFX0JJU1lOQwk0CisjZGVmaW5lIE1HU0xfTU9ERV9SQVcJCTYKKyNkZWZpbmUgTUdTTF9NT0RFX0JBU0VfQ0xPQ0sgICAgNworI2RlZmluZSBNR1NMX01PREVfWFNZTkMgICAgICAgICA4CisKKyNkZWZpbmUgTUdTTF9CVVNfVFlQRV9JU0EJMQorI2RlZmluZSBNR1NMX0JVU19UWVBFX0VJU0EJMgorI2RlZmluZSBNR1NMX0JVU19UWVBFX1BDSQk1CisKKyNkZWZpbmUgTUdTTF9JTlRFUkZBQ0VfTUFTSyAgICAgMHhmCisjZGVmaW5lIE1HU0xfSU5URVJGQUNFX0RJU0FCTEUgIDAKKyNkZWZpbmUgTUdTTF9JTlRFUkZBQ0VfUlMyMzIgICAgMQorI2RlZmluZSBNR1NMX0lOVEVSRkFDRV9WMzUgICAgICAyCisjZGVmaW5lIE1HU0xfSU5URVJGQUNFX1JTNDIyICAgIDMKKyNkZWZpbmUgTUdTTF9JTlRFUkZBQ0VfUlRTX0VOICAgMHgxMAorI2RlZmluZSBNR1NMX0lOVEVSRkFDRV9MTCAgICAgICAweDIwCisjZGVmaW5lIE1HU0xfSU5URVJGQUNFX1JMICAgICAgIDB4NDAKKyNkZWZpbmUgTUdTTF9JTlRFUkZBQ0VfTVNCX0ZJUlNUIDB4ODAKKwordHlwZWRlZiBzdHJ1Y3QgX01HU0xfUEFSQU1TCit7CisJLyogQ29tbW9uICovCisKKwl1bnNpZ25lZCBsb25nCW1vZGU7CQkvKiBBc3luY2hyb25vdXMgb3IgSERMQyAqLworCXVuc2lnbmVkIGNoYXIJbG9vcGJhY2s7CS8qIGludGVybmFsIGxvb3BiYWNrIG1vZGUgKi8KKworCS8qIEhETEMgT25seSAqLworCisJdW5zaWduZWQgc2hvcnQJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgllbmNvZGluZzsJLyogTlJaLCBOUlpJLCBldGMuICovCisJdW5zaWduZWQgbG9uZwljbG9ja19zcGVlZDsJLyogZXh0ZXJuYWwgY2xvY2sgc3BlZWQgaW4gYml0cyBwZXIgc2Vjb25kICovCisJdW5zaWduZWQgY2hhcglhZGRyX2ZpbHRlcjsJLyogcmVjZWl2ZSBIRExDIGFkZHJlc3MgZmlsdGVyLCAweEZGID0gZGlzYWJsZSAqLworCXVuc2lnbmVkIHNob3J0CWNyY190eXBlOwkvKiBOb25lLCBDUkMxNi1DQ0lUVCwgb3IgQ1JDMzItQ0NJVFQgKi8KKwl1bnNpZ25lZCBjaGFyCXByZWFtYmxlX2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyCXByZWFtYmxlOworCisJLyogQXN5bmMgT25seSAqLworCisJdW5zaWduZWQgbG9uZwlkYXRhX3JhdGU7CS8qIGJpdHMgcGVyIHNlY29uZCAqLworCXVuc2lnbmVkIGNoYXIJZGF0YV9iaXRzOwkvKiA3IG9yIDggZGF0YSBiaXRzICovCisJdW5zaWduZWQgY2hhcglzdG9wX2JpdHM7CS8qIDEgb3IgMiBzdG9wIGJpdHMgKi8KKwl1bnNpZ25lZCBjaGFyCXBhcml0eTsJCS8qIG5vbmUsIGV2ZW4sIG9yIG9kZCAqLworCit9IE1HU0xfUEFSQU1TLCAqUE1HU0xfUEFSQU1TOworCisjZGVmaW5lIE1JQ1JPR0FURV9WRU5ET1JfSUQgMHgxM2MwCisjZGVmaW5lIFNZTkNMSU5LX0RFVklDRV9JRCAweDAwMTAKKyNkZWZpbmUgTUdTQ0NfREVWSUNFX0lEIDB4MDAyMAorI2RlZmluZSBTWU5DTElOS19TQ0FfREVWSUNFX0lEIDB4MDAzMAorI2RlZmluZSBTWU5DTElOS19HVF9ERVZJQ0VfSUQgMHgwMDcwCisjZGVmaW5lIFNZTkNMSU5LX0dUNF9ERVZJQ0VfSUQgMHgwMDgwCisjZGVmaW5lIFNZTkNMSU5LX0FDX0RFVklDRV9JRCAgMHgwMDkwCisjZGVmaW5lIFNZTkNMSU5LX0dUMl9ERVZJQ0VfSUQgMHgwMEEwCisjZGVmaW5lIE1HU0xfTUFYX1NFUklBTF9OVU1CRVIgMzAKKworLyoKKyoqIGRldmljZSBkaWFnbm9zdGljcyBzdGF0dXMKKyovCisKKyNkZWZpbmUgRGlhZ1N0YXR1c19PSwkJCQkwCisjZGVmaW5lIERpYWdTdGF0dXNfQWRkcmVzc0ZhaWx1cmUJCTEKKyNkZWZpbmUgRGlhZ1N0YXR1c19BZGRyZXNzQ29uZmxpY3QJCTIKKyNkZWZpbmUgRGlhZ1N0YXR1c19JcnFGYWlsdXJlCQkJMworI2RlZmluZSBEaWFnU3RhdHVzX0lycUNvbmZsaWN0CQkJNAorI2RlZmluZSBEaWFnU3RhdHVzX0RtYUZhaWx1cmUJCQk1CisjZGVmaW5lIERpYWdTdGF0dXNfRG1hQ29uZmxpY3QJCQk2CisjZGVmaW5lIERpYWdTdGF0dXNfUGNpQWRhcHRlck5vdEZvdW5kCQk3CisjZGVmaW5lIERpYWdTdGF0dXNfQ2FudEFzc2lnblBjaVJlc291cmNlcwk4CisjZGVmaW5lIERpYWdTdGF0dXNfQ2FudEFzc2lnblBjaU1lbUFkZHIJCTkKKyNkZWZpbmUgRGlhZ1N0YXR1c19DYW50QXNzaWduUGNpSW9BZGRyCQkxMAorI2RlZmluZSBEaWFnU3RhdHVzX0NhbnRBc3NpZ25QY2lJcnEJCTExCisjZGVmaW5lIERpYWdTdGF0dXNfTWVtb3J5RXJyb3IJCQkxMgorCisjZGVmaW5lIFNlcmlhbFNpZ25hbF9EQ0QgICAgICAgICAgICAweDAxICAgICAvKiBEYXRhIENhcnJpZXIgRGV0ZWN0ICovCisjZGVmaW5lIFNlcmlhbFNpZ25hbF9UWEQgICAgICAgICAgICAweDAyICAgICAvKiBUcmFuc21pdCBEYXRhICovCisjZGVmaW5lIFNlcmlhbFNpZ25hbF9SSSAgICAgICAgICAgICAweDA0ICAgICAvKiBSaW5nIEluZGljYXRvciAqLworI2RlZmluZSBTZXJpYWxTaWduYWxfUlhEICAgICAgICAgICAgMHgwOCAgICAgLyogUmVjZWl2ZSBEYXRhICovCisjZGVmaW5lIFNlcmlhbFNpZ25hbF9DVFMgICAgICAgICAgICAweDEwICAgICAvKiBDbGVhciB0byBTZW5kICovCisjZGVmaW5lIFNlcmlhbFNpZ25hbF9SVFMgICAgICAgICAgICAweDIwICAgICAvKiBSZXF1ZXN0IHRvIFNlbmQgKi8KKyNkZWZpbmUgU2VyaWFsU2lnbmFsX0RTUiAgICAgICAgICAgIDB4NDAgICAgIC8qIERhdGEgU2V0IFJlYWR5ICovCisjZGVmaW5lIFNlcmlhbFNpZ25hbF9EVFIgICAgICAgICAgICAweDgwICAgICAvKiBEYXRhIFRlcm1pbmFsIFJlYWR5ICovCisKKworLyoKKyAqIENvdW50ZXJzIG9mIHRoZSBpbnB1dCBsaW5lcyAoQ1RTLCBEU1IsIFJJLCBDRCkgaW50ZXJydXB0cworICovCitzdHJ1Y3QgbWdzbF9pY291bnQgeworCV9fdTMyCWN0cywgZHNyLCBybmcsIGRjZCwgdHgsIHJ4OworCV9fdTMyCWZyYW1lLCBwYXJpdHksIG92ZXJydW4sIGJyazsKKwlfX3UzMglidWZfb3ZlcnJ1bjsKKwlfX3UzMgl0eG9rOworCV9fdTMyCXR4dW5kZXI7CisJX191MzIJdHhhYm9ydDsKKwlfX3UzMgl0eHRpbWVvdXQ7CisJX191MzIJcnhzaG9ydDsKKwlfX3UzMglyeGxvbmc7CisJX191MzIJcnhhYm9ydDsKKwlfX3UzMglyeG92ZXI7CisJX191MzIJcnhjcmM7CisJX191MzIJcnhvazsKKwlfX3UzMglleGl0aHVudDsKKwlfX3UzMglyeGlkbGU7Cit9OworCitzdHJ1Y3QgZ3Bpb19kZXNjIHsKKwlfX3UzMiBzdGF0ZTsKKwlfX3UzMiBzbWFzazsKKwlfX3UzMiBkaXI7CisJX191MzIgZG1hc2s7Cit9OworCisjZGVmaW5lIERFQlVHX0xFVkVMX0RBVEEJMQorI2RlZmluZSBERUJVR19MRVZFTF9FUlJPUiAJMgorI2RlZmluZSBERUJVR19MRVZFTF9JTkZPICAJMworI2RlZmluZSBERUJVR19MRVZFTF9CSCAgICAJNAorI2RlZmluZSBERUJVR19MRVZFTF9JU1IJCTUKKworLyoKKyoqIEV2ZW50IGJpdCBmbGFncyBmb3IgdXNlIHdpdGggTWdzbFdhaXRFdmVudAorKi8KKworI2RlZmluZSBNZ3NsRXZlbnRfRHNyQWN0aXZlCTB4MDAwMQorI2RlZmluZSBNZ3NsRXZlbnRfRHNySW5hY3RpdmUJMHgwMDAyCisjZGVmaW5lIE1nc2xFdmVudF9Ec3IJCTB4MDAwMworI2RlZmluZSBNZ3NsRXZlbnRfQ3RzQWN0aXZlCTB4MDAwNAorI2RlZmluZSBNZ3NsRXZlbnRfQ3RzSW5hY3RpdmUJMHgwMDA4CisjZGVmaW5lIE1nc2xFdmVudF9DdHMJCTB4MDAwYworI2RlZmluZSBNZ3NsRXZlbnRfRGNkQWN0aXZlCTB4MDAxMAorI2RlZmluZSBNZ3NsRXZlbnRfRGNkSW5hY3RpdmUJMHgwMDIwCisjZGVmaW5lIE1nc2xFdmVudF9EY2QJCTB4MDAzMAorI2RlZmluZSBNZ3NsRXZlbnRfUmlBY3RpdmUJMHgwMDQwCisjZGVmaW5lIE1nc2xFdmVudF9SaUluYWN0aXZlCTB4MDA4MAorI2RlZmluZSBNZ3NsRXZlbnRfUmkJCTB4MDBjMAorI2RlZmluZSBNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlCTB4MDEwMAorI2RlZmluZSBNZ3NsRXZlbnRfSWRsZVJlY2VpdmVkCTB4MDIwMAorCisvKiBQcml2YXRlIElPQ1RMIGNvZGVzOgorICoKKyAqIE1HU0xfSU9DU1BBUkFNUwlzZXQgTUdTTF9QQVJBTVMgc3RydWN0dXJlIHZhbHVlcworICogTUdTTF9JT0NHUEFSQU1TCWdldCBjdXJyZW50IE1HU0xfUEFSQU1TIHN0cnVjdHVyZSB2YWx1ZXMKKyAqIE1HU0xfSU9DU1RYSURMRQlzZXQgY3VycmVudCB0cmFuc21pdCBpZGxlIG1vZGUKKyAqIE1HU0xfSU9DR1RYSURMRQlnZXQgY3VycmVudCB0cmFuc21pdCBpZGxlIG1vZGUKKyAqIE1HU0xfSU9DVFhFTkFCTEUJZW5hYmxlIG9yIGRpc2FibGUgdHJhbnNtaXR0ZXIKKyAqIE1HU0xfSU9DUlhFTkFCTEUJZW5hYmxlIG9yIGRpc2FibGUgcmVjZWl2ZXIKKyAqIE1HU0xfSU9DVFhBQk9SVAlhYm9ydCB0cmFuc21pdHRpbmcgZnJhbWUgKEhETEMpCisgKiBNR1NMX0lPQ0dTVEFUUwlyZXR1cm4gY3VycmVudCBzdGF0aXN0aWNzCisgKiBNR1NMX0lPQ1dBSVRFVkVOVAl3YWl0IGZvciBzcGVjaWZpZWQgZXZlbnQgdG8gb2NjdXIKKyAqIE1HU0xfTE9PUFRYRE9ORQl0cmFuc21pdCBpbiBIRExDIExvb3BNb2RlIGRvbmUKKyAqIE1HU0xfSU9DU0lGICAgICAgICAgIHNldCB0aGUgc2VyaWFsIGludGVyZmFjZSB0eXBlCisgKiBNR1NMX0lPQ0dJRiAgICAgICAgICBnZXQgdGhlIHNlcmlhbCBpbnRlcmZhY2UgdHlwZQorICovCisjZGVmaW5lIE1HU0xfTUFHSUNfSU9DCSdtJworI2RlZmluZSBNR1NMX0lPQ1NQQVJBTVMJCV9JT1coTUdTTF9NQUdJQ19JT0MsMCxzdHJ1Y3QgX01HU0xfUEFSQU1TKQorI2RlZmluZSBNR1NMX0lPQ0dQQVJBTVMJCV9JT1IoTUdTTF9NQUdJQ19JT0MsMSxzdHJ1Y3QgX01HU0xfUEFSQU1TKQorI2RlZmluZSBNR1NMX0lPQ1NUWElETEUJCV9JTyhNR1NMX01BR0lDX0lPQywyKQorI2RlZmluZSBNR1NMX0lPQ0dUWElETEUJCV9JTyhNR1NMX01BR0lDX0lPQywzKQorI2RlZmluZSBNR1NMX0lPQ1RYRU5BQkxFCV9JTyhNR1NMX01BR0lDX0lPQyw0KQorI2RlZmluZSBNR1NMX0lPQ1JYRU5BQkxFCV9JTyhNR1NMX01BR0lDX0lPQyw1KQorI2RlZmluZSBNR1NMX0lPQ1RYQUJPUlQJCV9JTyhNR1NMX01BR0lDX0lPQyw2KQorI2RlZmluZSBNR1NMX0lPQ0dTVEFUUwkJX0lPKE1HU0xfTUFHSUNfSU9DLDcpCisjZGVmaW5lIE1HU0xfSU9DV0FJVEVWRU5UCV9JT1dSKE1HU0xfTUFHSUNfSU9DLDgsaW50KQorI2RlZmluZSBNR1NMX0lPQ0NMUk1PRENPVU5UCV9JTyhNR1NMX01BR0lDX0lPQywxNSkKKyNkZWZpbmUgTUdTTF9JT0NMT09QVFhET05FCV9JTyhNR1NMX01BR0lDX0lPQyw5KQorI2RlZmluZSBNR1NMX0lPQ1NJRgkJX0lPKE1HU0xfTUFHSUNfSU9DLDEwKQorI2RlZmluZSBNR1NMX0lPQ0dJRgkJX0lPKE1HU0xfTUFHSUNfSU9DLDExKQorI2RlZmluZSBNR1NMX0lPQ1NHUElPCQlfSU9XKE1HU0xfTUFHSUNfSU9DLDE2LHN0cnVjdCBncGlvX2Rlc2MpCisjZGVmaW5lIE1HU0xfSU9DR0dQSU8JCV9JT1IoTUdTTF9NQUdJQ19JT0MsMTcsc3RydWN0IGdwaW9fZGVzYykKKyNkZWZpbmUgTUdTTF9JT0NXQUlUR1BJTwlfSU9XUihNR1NMX01BR0lDX0lPQywxOCxzdHJ1Y3QgZ3Bpb19kZXNjKQorI2RlZmluZSBNR1NMX0lPQ1NYU1lOQwkJX0lPKE1HU0xfTUFHSUNfSU9DLCAxOSkKKyNkZWZpbmUgTUdTTF9JT0NHWFNZTkMJCV9JTyhNR1NMX01BR0lDX0lPQywgMjApCisjZGVmaW5lIE1HU0xfSU9DU1hDVFJMCQlfSU8oTUdTTF9NQUdJQ19JT0MsIDIxKQorI2RlZmluZSBNR1NMX0lPQ0dYQ1RSTAkJX0lPKE1HU0xfTUFHSUNfSU9DLCAyMikKKworCisjZW5kaWYgLyogX1NZTkNMSU5LX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zeXNjdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDkyYmNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zeXNjdGwuaApAQCAtMCwwICsxLDkzMiBAQAorLyoKKyAqIHN5c2N0bC5oOiBHZW5lcmFsIGxpbnV4IHN5c3RlbSBjb250cm9sIGludGVyZmFjZQorICoKKyAqIEJlZ3VuIDI0IE1hcmNoIDE5OTUsIFN0ZXBoZW4gVHdlZWRpZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogIFdBUk5JTkc6CisgKiogIFRoZSB2YWx1ZXMgaW4gdGhpcyBmaWxlIGFyZSBleHBvcnRlZCB0byB1c2VyIHNwYWNlIHZpYSAKKyAqKiAgdGhlIHN5c2N0bCgpIGJpbmFyeSBpbnRlcmZhY2UuICBEbyAqTk9UKiBjaGFuZ2UgdGhlCisgKiogIG51bWJlcmluZyBvZiBhbnkgZXhpc3RpbmcgdmFsdWVzIGhlcmUsIGFuZCBkbyBub3QgY2hhbmdlCisgKiogIGFueSBudW1iZXJzIHdpdGhpbiBhbnkgb25lIHNldCBvZiB2YWx1ZXMuICBJZiB5b3UgaGF2ZSB0bworICoqICByZWRlZmluZSBhbiBleGlzdGluZyBpbnRlcmZhY2UsIHVzZSBhIG5ldyBudW1iZXIgZm9yIGl0LgorICoqICBUaGUga2VybmVsIHdpbGwgdGhlbiByZXR1cm4gLUVOT1RESVIgdG8gYW55IGFwcGxpY2F0aW9uIHVzaW5nCisgKiogIHRoZSBvbGQgYmluYXJ5IGludGVyZmFjZS4KKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfTElOVVhfU1lTQ1RMX0gKKyNkZWZpbmUgX0xJTlVYX1NZU0NUTF9ICisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKK3N0cnVjdCBjb21wbGV0aW9uOworCisjZGVmaW5lIENUTF9NQVhOQU1FIDEwCQkvKiBob3cgbWFueSBwYXRoIGNvbXBvbmVudHMgZG8gd2UgYWxsb3cgaW4gYQorCQkJCSAgIGNhbGwgdG8gc3lzY3RsPyAgIEluIG90aGVyIHdvcmRzLCB3aGF0IGlzCisJCQkJICAgdGhlIGxhcmdlc3QgYWNjZXB0YWJsZSB2YWx1ZSBmb3IgdGhlIG5sZW4KKwkJCQkgICBtZW1iZXIgb2YgYSBzdHJ1Y3QgX19zeXNjdGxfYXJncyB0byBoYXZlPyAqLworCitzdHJ1Y3QgX19zeXNjdGxfYXJncyB7CisJaW50ICpuYW1lOworCWludCBubGVuOworCXZvaWQgKm9sZHZhbDsKKwlzaXplX3QgKm9sZGxlbnA7CisJdm9pZCAqbmV3dmFsOworCXNpemVfdCBuZXdsZW47CisJdW5zaWduZWQgbG9uZyBfX3VudXNlZFs0XTsKK307CisKKy8qIERlZmluZSBzeXNjdGwgbmFtZXMgZmlyc3QgKi8KKworLyogVG9wLWxldmVsIG5hbWVzOiAqLworCitlbnVtCit7CisJQ1RMX0tFUk49MSwJCS8qIEdlbmVyYWwga2VybmVsIGluZm8gYW5kIGNvbnRyb2wgKi8KKwlDVExfVk09MiwJCS8qIFZNIG1hbmFnZW1lbnQgKi8KKwlDVExfTkVUPTMsCQkvKiBOZXR3b3JraW5nICovCisJQ1RMX1BST0M9NCwJCS8qIHJlbW92YWwgYnJlYWtzIHN0cmFjZSgxKSBjb21waWxhdGlvbiAqLworCUNUTF9GUz01LAkJLyogRmlsZXN5c3RlbXMgKi8KKwlDVExfREVCVUc9NiwJCS8qIERlYnVnZ2luZyAqLworCUNUTF9ERVY9NywJCS8qIERldmljZXMgKi8KKwlDVExfQlVTPTgsCQkvKiBCdXNzZXMgKi8KKwlDVExfQUJJPTksCQkvKiBCaW5hcnkgZW11bGF0aW9uICovCisJQ1RMX0NQVT0xMCwJCS8qIENQVSBzdHVmZiAoc3BlZWQgc2NhbGluZywgZXRjKSAqLworCUNUTF9BUkxBTj0yNTQsCQkvKiBhcmxhbiB3aXJlbGVzcyBkcml2ZXIgKi8KKwlDVExfUzM5MERCRj01Njc3LAkvKiBzMzkwIGRlYnVnICovCisJQ1RMX1NVTlJQQz03MjQ5LAkvKiBzdW5ycGMgZGVidWcgKi8KKwlDVExfUE09OTg5OSwJCS8qIGZydiBwb3dlciBtYW5hZ2VtZW50ICovCisJQ1RMX0ZSVj05ODk4LAkJLyogZnJ2IHNwZWNpZmljIHN5c2N0bHMgKi8KK307CisKKy8qIENUTF9CVVMgbmFtZXM6ICovCitlbnVtCit7CisJQ1RMX0JVU19JU0E9MQkJLyogSVNBICovCit9OworCisvKiAvcHJvYy9zeXMvZnMvaW5vdGlmeS8gKi8KK2VudW0KK3sKKwlJTk9USUZZX01BWF9VU0VSX0lOU1RBTkNFUz0xLAkvKiBtYXggaW5zdGFuY2VzIHBlciB1c2VyICovCisJSU5PVElGWV9NQVhfVVNFUl9XQVRDSEVTPTIsCS8qIG1heCB3YXRjaGVzIHBlciB1c2VyICovCisJSU5PVElGWV9NQVhfUVVFVUVEX0VWRU5UUz0zCS8qIG1heCBxdWV1ZWQgZXZlbnRzIHBlciBpbnN0YW5jZSAqLworfTsKKworLyogQ1RMX0tFUk4gbmFtZXM6ICovCitlbnVtCit7CisJS0VSTl9PU1RZUEU9MSwJCS8qIHN0cmluZzogc3lzdGVtIHZlcnNpb24gKi8KKwlLRVJOX09TUkVMRUFTRT0yLAkvKiBzdHJpbmc6IHN5c3RlbSByZWxlYXNlICovCisJS0VSTl9PU1JFVj0zLAkJLyogaW50OiBzeXN0ZW0gcmV2aXNpb24gKi8KKwlLRVJOX1ZFUlNJT049NCwJCS8qIHN0cmluZzogY29tcGlsZSB0aW1lIGluZm8gKi8KKwlLRVJOX1NFQ1VSRU1BU0s9NSwJLyogc3RydWN0OiBtYXhpbXVtIHJpZ2h0cyBtYXNrICovCisJS0VSTl9QUk9GPTYsCQkvKiB0YWJsZTogcHJvZmlsaW5nIGluZm9ybWF0aW9uICovCisJS0VSTl9OT0RFTkFNRT03LAkvKiBzdHJpbmc6IGhvc3RuYW1lICovCisJS0VSTl9ET01BSU5OQU1FPTgsCS8qIHN0cmluZzogZG9tYWlubmFtZSAqLworCisJS0VSTl9QQU5JQz0xNSwJCS8qIGludDogcGFuaWMgdGltZW91dCAqLworCUtFUk5fUkVBTFJPT1RERVY9MTYsCS8qIHJlYWwgcm9vdCBkZXZpY2UgdG8gbW91bnQgYWZ0ZXIgaW5pdHJkICovCisKKwlLRVJOX1NQQVJDX1JFQk9PVD0yMSwJLyogcmVib290IGNvbW1hbmQgb24gU3BhcmMgKi8KKwlLRVJOX0NUTEFMVERFTD0yMiwJLyogaW50OiBhbGxvdyBjdGwtYWx0LWRlbCB0byByZWJvb3QgKi8KKwlLRVJOX1BSSU5USz0yMywJCS8qIHN0cnVjdDogY29udHJvbCBwcmludGsgbG9nZ2luZyBwYXJhbWV0ZXJzICovCisJS0VSTl9OQU1FVFJBTlM9MjQsCS8qIE5hbWUgdHJhbnNsYXRpb24gKi8KKwlLRVJOX1BQQ19IVEFCUkVDTEFJTT0yNSwgLyogdHVybiBodGFiIHJlY2xhaW1hdGlvbiBvbi9vZmYgb24gUFBDICovCisJS0VSTl9QUENfWkVST1BBR0VEPTI2LAkvKiB0dXJuIGlkbGUgcGFnZSB6ZXJvaW5nIG9uL29mZiBvbiBQUEMgKi8KKwlLRVJOX1BQQ19QT1dFUlNBVkVfTkFQPTI3LCAvKiB1c2UgbmFwIG1vZGUgZm9yIHBvd2VyIHNhdmluZyAqLworCUtFUk5fTU9EUFJPQkU9MjgsCS8qIHN0cmluZzogbW9kcHJvYmUgcGF0aCAqLworCUtFUk5fU0dfQklHX0JVRkY9MjksCS8qIGludDogc2cgZHJpdmVyIHJlc2VydmVkIGJ1ZmZlciBzaXplICovCisJS0VSTl9BQ0NUPTMwLAkJLyogQlNEIHByb2Nlc3MgYWNjb3VudGluZyBwYXJhbWV0ZXJzICovCisJS0VSTl9QUENfTDJDUj0zMSwJLyogbDJjciByZWdpc3RlciBvbiBQUEMgKi8KKworCUtFUk5fUlRTSUdOUj0zMiwJLyogTnVtYmVyIG9mIHJ0IHNpZ3MgcXVldWVkICovCisJS0VSTl9SVFNJR01BWD0zMywJLyogTWF4IHF1ZXVhYmxlICovCisJCisJS0VSTl9TSE1NQVg9MzQsICAgICAgICAgLyogbG9uZzogTWF4aW11bSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgKi8KKwlLRVJOX01TR01BWD0zNSwgICAgICAgICAvKiBpbnQ6IE1heGltdW0gc2l6ZSBvZiBhIG1lc3NlZ2UgKi8KKwlLRVJOX01TR01OQj0zNiwgICAgICAgICAvKiBpbnQ6IE1heGltdW0gbWVzc2FnZSBxdWV1ZSBzaXplICovCisJS0VSTl9NU0dQT09MPTM3LCAgICAgICAgLyogaW50OiBNYXhpbXVtIHN5c3RlbSBtZXNzYWdlIHBvb2wgc2l6ZSAqLworCUtFUk5fU1lTUlE9MzgsCQkvKiBpbnQ6IFN5c3JlcSBlbmFibGUgKi8KKwlLRVJOX01BWF9USFJFQURTPTM5LAkvKiBpbnQ6IE1heGltdW0gbnIgb2YgdGhyZWFkcyBpbiB0aGUgc3lzdGVtICovCisgCUtFUk5fUkFORE9NPTQwLAkJLyogUmFuZG9tIGRyaXZlciAqLworIAlLRVJOX1NITUFMTD00MSwJCS8qIGludDogTWF4aW11bSBzaXplIG9mIHNoYXJlZCBtZW1vcnkgKi8KKyAJS0VSTl9NU0dNTkk9NDIsCQkvKiBpbnQ6IG1zZyBxdWV1ZSBpZGVudGlmaWVycyAqLworIAlLRVJOX1NFTT00MywJCS8qIHN0cnVjdDogc3lzdiBzZW1hcGhvcmUgbGltaXRzICovCisgCUtFUk5fU1BBUkNfU1RPUF9BPTQ0LAkvKiBpbnQ6IFNwYXJjIFN0b3AtQSBlbmFibGUgKi8KKyAJS0VSTl9TSE1NTkk9NDUsCQkvKiBpbnQ6IHNobSBhcnJheSBpZGVudGlmaWVycyAqLworCUtFUk5fT1ZFUkZMT1dVSUQ9NDYsCS8qIGludDogb3ZlcmZsb3cgVUlEICovCisJS0VSTl9PVkVSRkxPV0dJRD00NywJLyogaW50OiBvdmVyZmxvdyBHSUQgKi8KKwlLRVJOX1NITVBBVEg9NDgsCS8qIHN0cmluZzogcGF0aCB0byBzaG0gZnMgKi8KKwlLRVJOX0hPVFBMVUc9NDksCS8qIHN0cmluZzogcGF0aCB0byB1ZXZlbnQgaGVscGVyIChkZXByZWNhdGVkKSAqLworCUtFUk5fSUVFRV9FTVVMQVRJT05fV0FSTklOR1M9NTAsIC8qIGludDogdW5pbXBsZW1lbnRlZCBpZWVlIGluc3RydWN0aW9ucyAqLworCUtFUk5fUzM5MF9VU0VSX0RFQlVHX0xPR0dJTkc9NTEsICAvKiBpbnQ6IGR1bXBzIG9mIHVzZXIgZmF1bHRzICovCisJS0VSTl9DT1JFX1VTRVNfUElEPTUyLAkJLyogaW50OiB1c2UgY29yZSBvciBjb3JlLiVwaWQgKi8KKwlLRVJOX1RBSU5URUQ9NTMsCS8qIGludDogdmFyaW91cyBrZXJuZWwgdGFpbnRlZCBmbGFncyAqLworCUtFUk5fQ0FEUElEPTU0LAkJLyogaW50OiBQSUQgb2YgdGhlIHByb2Nlc3MgdG8gbm90aWZ5IG9uIENBRCAqLworCUtFUk5fUElETUFYPTU1LAkJLyogaW50OiBQSUQgIyBsaW1pdCAqLworICAJS0VSTl9DT1JFX1BBVFRFUk49NTYsCS8qIHN0cmluZzogcGF0dGVybiBmb3IgY29yZS1maWxlIG5hbWVzICovCisJS0VSTl9QQU5JQ19PTl9PT1BTPTU3LCAgLyogaW50OiB3aGV0aGVyIHdlIHdpbGwgcGFuaWMgb24gYW4gb29wcyAqLworCUtFUk5fSFBQQV9QV1JTVz01OCwJLyogaW50OiBocHBhIHNvZnQtcG93ZXIgZW5hYmxlICovCisJS0VSTl9IUFBBX1VOQUxJR05FRD01OSwJLyogaW50OiBocHBhIHVuYWxpZ25lZC10cmFwIGVuYWJsZSAqLworCUtFUk5fUFJJTlRLX1JBVEVMSU1JVD02MCwgLyogaW50OiB0dW5lIHByaW50ayByYXRlbGltaXRpbmcgKi8KKwlLRVJOX1BSSU5US19SQVRFTElNSVRfQlVSU1Q9NjEsCS8qIGludDogdHVuZSBwcmludGsgcmF0ZWxpbWl0aW5nICovCisJS0VSTl9QVFk9NjIsCQkvKiBkaXI6IHB0eSBkcml2ZXIgKi8KKwlLRVJOX05HUk9VUFNfTUFYPTYzLAkvKiBpbnQ6IE5HUk9VUFNfTUFYICovCisJS0VSTl9TUEFSQ19TQ09OU19QV1JPRkY9NjQsIC8qIGludDogc2VyaWFsIGNvbnNvbGUgcG93ZXItb2ZmIGhhbHQgKi8KKwlLRVJOX0haX1RJTUVSPTY1LAkvKiBpbnQ6IGh6IHRpbWVyIG9uIG9yIG9mZiAqLworCUtFUk5fVU5LTk9XTl9OTUlfUEFOSUM9NjYsIC8qIGludDogdW5rbm93biBubWkgcGFuaWMgZmxhZyAqLworCUtFUk5fQk9PVExPQURFUl9UWVBFPTY3LCAvKiBpbnQ6IGJvb3QgbG9hZGVyIHR5cGUgKi8KKwlLRVJOX1JBTkRPTUlaRT02OCwgLyogaW50OiByYW5kb21pemUgdmlydHVhbCBhZGRyZXNzIHNwYWNlICovCisJS0VSTl9TRVRVSURfRFVNUEFCTEU9NjksIC8qIGludDogYmVoYXZpb3VyIG9mIGR1bXBzIGZvciBzZXR1aWQgY29yZSAqLworCUtFUk5fU1BJTl9SRVRSWT03MCwJLyogaW50OiBudW1iZXIgb2Ygc3BpbmxvY2sgcmV0cmllcyAqLworCUtFUk5fQUNQSV9WSURFT19GTEFHUz03MSwgLyogaW50OiBmbGFncyBmb3Igc2V0dGluZyB1cCB2aWRlbyBhZnRlciBBQ1BJIHNsZWVwICovCisJS0VSTl9JQTY0X1VOQUxJR05FRD03MiwgLyogaW50OiBpYTY0IHVuYWxpZ25lZCB1c2VybGFuZCB0cmFwIGVuYWJsZSAqLworCUtFUk5fQ09NUEFUX0xPRz03MywJLyogaW50OiBwcmludCBjb21wYXQgbGF5ZXIgIG1lc3NhZ2VzICovCisJS0VSTl9NQVhfTE9DS19ERVBUSD03NCwgLyogaW50OiBydG11dGV4J3MgbWF4aW11bSBsb2NrIGRlcHRoICovCisJS0VSTl9OTUlfV0FUQ0hET0c9NzUsIC8qIGludDogZW5hYmxlL2Rpc2FibGUgbm1pIHdhdGNoZG9nICovCisJS0VSTl9QQU5JQ19PTl9OTUk9NzYsIC8qIGludDogd2hldGhlciB3ZSB3aWxsIHBhbmljIG9uIGFuIHVucmVjb3ZlcmVkICovCit9OworCisKKworLyogQ1RMX1ZNIG5hbWVzOiAqLworZW51bQoreworCVZNX1VOVVNFRDE9MSwJCS8qIHdhczogc3RydWN0OiBTZXQgdm0gc3dhcHBpbmcgY29udHJvbCAqLworCVZNX1VOVVNFRDI9MiwJCS8qIHdhczsgaW50OiBMaW5lYXIgb3Igc3FydCgpIHN3YXBvdXQgZm9yIGhvZ3MgKi8KKwlWTV9VTlVTRUQzPTMsCQkvKiB3YXM6IHN0cnVjdDogU2V0IGZyZWUgcGFnZSB0aHJlc2hvbGRzICovCisJVk1fVU5VU0VEND00LAkJLyogU3BhcmUgKi8KKwlWTV9PVkVSQ09NTUlUX01FTU9SWT01LAkvKiBUdXJuIG9mZiB0aGUgdmlydHVhbCBtZW1vcnkgc2FmZXR5IGxpbWl0ICovCisJVk1fVU5VU0VENT02LAkJLyogd2FzOiBzdHJ1Y3Q6IFNldCBidWZmZXIgbWVtb3J5IHRocmVzaG9sZHMgKi8KKwlWTV9VTlVTRUQ3PTcsCQkvKiB3YXM6IHN0cnVjdDogU2V0IGNhY2hlIG1lbW9yeSB0aHJlc2hvbGRzICovCisJVk1fVU5VU0VEOD04LAkJLyogd2FzOiBzdHJ1Y3Q6IENvbnRyb2wga3N3YXBkIGJlaGF2aW91ciAqLworCVZNX1VOVVNFRDk9OSwJCS8qIHdhczogc3RydWN0OiBTZXQgcGFnZSB0YWJsZSBjYWNoZSBwYXJhbWV0ZXJzICovCisJVk1fUEFHRV9DTFVTVEVSPTEwLAkvKiBpbnQ6IHNldCBudW1iZXIgb2YgcGFnZXMgdG8gc3dhcCB0b2dldGhlciAqLworCVZNX0RJUlRZX0JBQ0tHUk9VTkQ9MTEsCS8qIGRpcnR5X2JhY2tncm91bmRfcmF0aW8gKi8KKwlWTV9ESVJUWV9SQVRJTz0xMiwJLyogZGlydHlfcmF0aW8gKi8KKwlWTV9ESVJUWV9XQl9DUz0xMywJLyogZGlydHlfd3JpdGViYWNrX2NlbnRpc2VjcyAqLworCVZNX0RJUlRZX0VYUElSRV9DUz0xNCwJLyogZGlydHlfZXhwaXJlX2NlbnRpc2VjcyAqLworCVZNX05SX1BERkxVU0hfVEhSRUFEUz0xNSwgLyogbnJfcGRmbHVzaF90aHJlYWRzICovCisJVk1fT1ZFUkNPTU1JVF9SQVRJTz0xNiwgLyogcGVyY2VudCBvZiBSQU0gdG8gYWxsb3cgb3ZlcmNvbW1pdCBpbiAqLworCVZNX1BBR0VCVUY9MTcsCQkvKiBzdHJ1Y3Q6IENvbnRyb2wgcGFnZWJ1ZiBwYXJhbWV0ZXJzICovCisJVk1fSFVHRVRMQl9QQUdFUz0xOCwJLyogaW50OiBOdW1iZXIgb2YgYXZhaWxhYmxlIEh1Z2UgUGFnZXMgKi8KKwlWTV9TV0FQUElORVNTPTE5LAkvKiBUZW5kZW5jeSB0byBzdGVhbCBtYXBwZWQgbWVtb3J5ICovCisJVk1fTE9XTUVNX1JFU0VSVkVfUkFUSU89MjAsLyogcmVzZXJ2YXRpb24gcmF0aW8gZm9yIGxvd2VyIG1lbW9yeSB6b25lcyAqLworCVZNX01JTl9GUkVFX0tCWVRFUz0yMSwJLyogTWluaW11bSBmcmVlIGtpbG9ieXRlcyB0byBtYWludGFpbiAqLworCVZNX01BWF9NQVBfQ09VTlQ9MjIsCS8qIGludDogTWF4aW11bSBudW1iZXIgb2YgbW1hcHMvYWRkcmVzcy1zcGFjZSAqLworCVZNX0xBUFRPUF9NT0RFPTIzLAkvKiB2bSBsYXB0b3AgbW9kZSAqLworCVZNX0JMT0NLX0RVTVA9MjQsCS8qIGJsb2NrIGR1bXAgbW9kZSAqLworCVZNX0hVR0VUTEJfR1JPVVA9MjUsCS8qIHBlcm1pdHRlZCBodWdldGxiIGdyb3VwICovCisJVk1fVkZTX0NBQ0hFX1BSRVNTVVJFPTI2LCAvKiBkY2FjaGUvaWNhY2hlIHJlY2xhaW0gcHJlc3N1cmUgKi8KKwlWTV9MRUdBQ1lfVkFfTEFZT1VUPTI3LCAvKiBsZWdhY3kvY29tcGF0aWJpbGl0eSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgbGF5b3V0ICovCisJVk1fU1dBUF9UT0tFTl9USU1FT1VUPTI4LCAvKiBkZWZhdWx0IHRpbWUgZm9yIHRva2VuIHRpbWUgb3V0ICovCisJVk1fRFJPUF9QQUdFQ0FDSEU9MjksCS8qIGludDogbnVrZSBsb3RzIG9mIHBhZ2VjYWNoZSAqLworCVZNX1BFUkNQVV9QQUdFTElTVF9GUkFDVElPTj0zMCwvKiBpbnQ6IGZyYWN0aW9uIG9mIHBhZ2VzIGluIGVhY2ggcGVyY3B1X3BhZ2VsaXN0ICovCisJVk1fWk9ORV9SRUNMQUlNX01PREU9MzEsIC8qIHJlY2xhaW0gbG9jYWwgem9uZSBtZW1vcnkgYmVmb3JlIGdvaW5nIG9mZiBub2RlICovCisJVk1fTUlOX1VOTUFQUEVEPTMyLAkvKiBTZXQgbWluIHBlcmNlbnQgb2YgdW5tYXBwZWQgcGFnZXMgKi8KKwlWTV9QQU5JQ19PTl9PT009MzMsCS8qIHBhbmljIGF0IG91dC1vZi1tZW1vcnkgKi8KKwlWTV9WRFNPX0VOQUJMRUQ9MzQsCS8qIG1hcCBWRFNPIGludG8gbmV3IHByb2Nlc3Nlcz8gKi8KKwlWTV9NSU5fU0xBQj0zNSwJCSAvKiBQZXJjZW50IHBhZ2VzIGlnbm9yZWQgYnkgem9uZSByZWNsYWltICovCit9OworCisKKy8qIENUTF9ORVQgbmFtZXM6ICovCitlbnVtCit7CisJTkVUX0NPUkU9MSwKKwlORVRfRVRIRVI9MiwKKwlORVRfODAyPTMsCisJTkVUX1VOSVg9NCwKKwlORVRfSVBWND01LAorCU5FVF9JUFg9NiwKKwlORVRfQVRBTEs9NywKKwlORVRfTkVUUk9NPTgsCisJTkVUX0FYMjU9OSwKKwlORVRfQlJJREdFPTEwLAorCU5FVF9ST1NFPTExLAorCU5FVF9JUFY2PTEyLAorCU5FVF9YMjU9MTMsCisJTkVUX1RSPTE0LAorCU5FVF9ERUNORVQ9MTUsCisJTkVUX0VDT05FVD0xNiwKKwlORVRfU0NUUD0xNywKKwlORVRfTExDPTE4LAorCU5FVF9ORVRGSUxURVI9MTksCisJTkVUX0RDQ1A9MjAsCisJTkVUX0lSREE9NDEyLAorfTsKKworLyogL3Byb2Mvc3lzL2tlcm5lbC9yYW5kb20gKi8KK2VudW0KK3sKKwlSQU5ET01fUE9PTFNJWkU9MSwKKwlSQU5ET01fRU5UUk9QWV9DT1VOVD0yLAorCVJBTkRPTV9SRUFEX1RIUkVTSD0zLAorCVJBTkRPTV9XUklURV9USFJFU0g9NCwKKwlSQU5ET01fQk9PVF9JRD01LAorCVJBTkRPTV9VVUlEPTYKK307CisKKy8qIC9wcm9jL3N5cy9rZXJuZWwvcHR5ICovCitlbnVtCit7CisJUFRZX01BWD0xLAorCVBUWV9OUj0yCit9OworCisvKiAvcHJvYy9zeXMvYnVzL2lzYSAqLworZW51bQoreworCUJVU19JU0FfTUVNX0JBU0U9MSwKKwlCVVNfSVNBX1BPUlRfQkFTRT0yLAorCUJVU19JU0FfUE9SVF9TSElGVD0zCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2NvcmUgKi8KK2VudW0KK3sKKwlORVRfQ09SRV9XTUVNX01BWD0xLAorCU5FVF9DT1JFX1JNRU1fTUFYPTIsCisJTkVUX0NPUkVfV01FTV9ERUZBVUxUPTMsCisJTkVUX0NPUkVfUk1FTV9ERUZBVUxUPTQsCisvKiB3YXMJTkVUX0NPUkVfREVTVFJPWV9ERUxBWSAqLworCU5FVF9DT1JFX01BWF9CQUNLTE9HPTYsCisJTkVUX0NPUkVfRkFTVFJPVVRFPTcsCisJTkVUX0NPUkVfTVNHX0NPU1Q9OCwKKwlORVRfQ09SRV9NU0dfQlVSU1Q9OSwKKwlORVRfQ09SRV9PUFRNRU1fTUFYPTEwLAorCU5FVF9DT1JFX0hPVF9MSVNUX0xFTkdUSD0xMSwKKwlORVRfQ09SRV9ESVZFUlRfVkVSU0lPTj0xMiwKKwlORVRfQ09SRV9OT19DT05HX1RIUkVTSD0xMywKKwlORVRfQ09SRV9OT19DT05HPTE0LAorCU5FVF9DT1JFX0xPX0NPTkc9MTUsCisJTkVUX0NPUkVfTU9EX0NPTkc9MTYsCisJTkVUX0NPUkVfREVWX1dFSUdIVD0xNywKKwlORVRfQ09SRV9TT01BWENPTk49MTgsCisJTkVUX0NPUkVfQlVER0VUPTE5LAorCU5FVF9DT1JFX0FFVkVOVF9FVElNRT0yMCwKKwlORVRfQ09SRV9BRVZFTlRfUlNFUVRIPTIxLAorCU5FVF9DT1JFX1dBUk5JTkdTPTIyLAorfTsKKworLyogL3Byb2Mvc3lzL25ldC9ldGhlcm5ldCAqLworCisvKiAvcHJvYy9zeXMvbmV0LzgwMiAqLworCisvKiAvcHJvYy9zeXMvbmV0L3VuaXggKi8KKworZW51bQoreworCU5FVF9VTklYX0RFU1RST1lfREVMQVk9MSwKKwlORVRfVU5JWF9ERUxFVEVfREVMQVk9MiwKKwlORVRfVU5JWF9NQVhfREdSQU1fUUxFTj0zLAorfTsKKworLyogL3Byb2Mvc3lzL25ldC9uZXRmaWx0ZXIgKi8KK2VudW0KK3sKKwlORVRfTkZfQ09OTlRSQUNLX01BWD0xLAorCU5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfU1lOX1NFTlQ9MiwKKwlORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1NZTl9SRUNWPTMsCisJTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9FU1RBQkxJU0hFRD00LAorCU5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfRklOX1dBSVQ9NSwKKwlORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0NMT1NFX1dBSVQ9NiwKKwlORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0xBU1RfQUNLPTcsCisJTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9USU1FX1dBSVQ9OCwKKwlORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0NMT1NFPTksCisJTkVUX05GX0NPTk5UUkFDS19VRFBfVElNRU9VVD0xMCwKKwlORVRfTkZfQ09OTlRSQUNLX1VEUF9USU1FT1VUX1NUUkVBTT0xMSwKKwlORVRfTkZfQ09OTlRSQUNLX0lDTVBfVElNRU9VVD0xMiwKKwlORVRfTkZfQ09OTlRSQUNLX0dFTkVSSUNfVElNRU9VVD0xMywKKwlORVRfTkZfQ09OTlRSQUNLX0JVQ0tFVFM9MTQsCisJTkVUX05GX0NPTk5UUkFDS19MT0dfSU5WQUxJRD0xNSwKKwlORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX01BWF9SRVRSQU5TPTE2LAorCU5FVF9ORl9DT05OVFJBQ0tfVENQX0xPT1NFPTE3LAorCU5FVF9ORl9DT05OVFJBQ0tfVENQX0JFX0xJQkVSQUw9MTgsCisJTkVUX05GX0NPTk5UUkFDS19UQ1BfTUFYX1JFVFJBTlM9MTksCisJTkVUX05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ0xPU0VEPTIwLAorCU5FVF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0NPT0tJRV9XQUlUPTIxLAorCU5FVF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0NPT0tJRV9FQ0hPRUQ9MjIsCisJTkVUX05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfRVNUQUJMSVNIRUQ9MjMsCisJTkVUX05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fU0VOVD0yNCwKKwlORVRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9TSFVURE9XTl9SRUNEPTI1LAorCU5FVF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX1NIVVRET1dOX0FDS19TRU5UPTI2LAorCU5FVF9ORl9DT05OVFJBQ0tfQ09VTlQ9MjcsCisJTkVUX05GX0NPTk5UUkFDS19JQ01QVjZfVElNRU9VVD0yOCwKKwlORVRfTkZfQ09OTlRSQUNLX0ZSQUc2X1RJTUVPVVQ9MjksCisJTkVUX05GX0NPTk5UUkFDS19GUkFHNl9MT1dfVEhSRVNIPTMwLAorCU5FVF9ORl9DT05OVFJBQ0tfRlJBRzZfSElHSF9USFJFU0g9MzEsCisJTkVUX05GX0NPTk5UUkFDS19DSEVDS1NVTT0zMiwKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvaXB2NCAqLworZW51bQoreworCS8qIHYyLjAgY29tcGF0aWJpbGUgdmFyaWFibGVzICovCisJTkVUX0lQVjRfRk9SV0FSRD04LAorCU5FVF9JUFY0X0RZTkFERFI9OSwKKworCU5FVF9JUFY0X0NPTkY9MTYsCisJTkVUX0lQVjRfTkVJR0g9MTcsCisJTkVUX0lQVjRfUk9VVEU9MTgsCisJTkVUX0lQVjRfRklCX0hBU0g9MTksCisJTkVUX0lQVjRfTkVURklMVEVSPTIwLAorCisJTkVUX0lQVjRfVENQX1RJTUVTVEFNUFM9MzMsCisJTkVUX0lQVjRfVENQX1dJTkRPV19TQ0FMSU5HPTM0LAorCU5FVF9JUFY0X1RDUF9TQUNLPTM1LAorCU5FVF9JUFY0X1RDUF9SRVRSQU5TX0NPTExBUFNFPTM2LAorCU5FVF9JUFY0X0RFRkFVTFRfVFRMPTM3LAorCU5FVF9JUFY0X0FVVE9DT05GSUc9MzgsCisJTkVUX0lQVjRfTk9fUE1UVV9ESVNDPTM5LAorCU5FVF9JUFY0X1RDUF9TWU5fUkVUUklFUz00MCwKKwlORVRfSVBWNF9JUEZSQUdfSElHSF9USFJFU0g9NDEsCisJTkVUX0lQVjRfSVBGUkFHX0xPV19USFJFU0g9NDIsCisJTkVUX0lQVjRfSVBGUkFHX1RJTUU9NDMsCisJTkVUX0lQVjRfVENQX01BWF9LQV9QUk9CRVM9NDQsCisJTkVUX0lQVjRfVENQX0tFRVBBTElWRV9USU1FPTQ1LAorCU5FVF9JUFY0X1RDUF9LRUVQQUxJVkVfUFJPQkVTPTQ2LAorCU5FVF9JUFY0X1RDUF9SRVRSSUVTMT00NywKKwlORVRfSVBWNF9UQ1BfUkVUUklFUzI9NDgsCisJTkVUX0lQVjRfVENQX0ZJTl9USU1FT1VUPTQ5LAorCU5FVF9JUFY0X0lQX01BU1FfREVCVUc9NTAsCisJTkVUX1RDUF9TWU5DT09LSUVTPTUxLAorCU5FVF9UQ1BfU1REVVJHPTUyLAorCU5FVF9UQ1BfUkZDMTMzNz01MywKKwlORVRfVENQX1NZTl9UQUlMRFJPUD01NCwKKwlORVRfVENQX01BWF9TWU5fQkFDS0xPRz01NSwKKwlORVRfSVBWNF9MT0NBTF9QT1JUX1JBTkdFPTU2LAorCU5FVF9JUFY0X0lDTVBfRUNIT19JR05PUkVfQUxMPTU3LAorCU5FVF9JUFY0X0lDTVBfRUNIT19JR05PUkVfQlJPQURDQVNUUz01OCwKKwlORVRfSVBWNF9JQ01QX1NPVVJDRVFVRU5DSF9SQVRFPTU5LAorCU5FVF9JUFY0X0lDTVBfREVTVFVOUkVBQ0hfUkFURT02MCwKKwlORVRfSVBWNF9JQ01QX1RJTUVFWENFRURfUkFURT02MSwKKwlORVRfSVBWNF9JQ01QX1BBUkFNUFJPQl9SQVRFPTYyLAorCU5FVF9JUFY0X0lDTVBfRUNIT1JFUExZX1JBVEU9NjMsCisJTkVUX0lQVjRfSUNNUF9JR05PUkVfQk9HVVNfRVJST1JfUkVTUE9OU0VTPTY0LAorCU5FVF9JUFY0X0lHTVBfTUFYX01FTUJFUlNISVBTPTY1LAorCU5FVF9UQ1BfVFdfUkVDWUNMRT02NiwKKwlORVRfSVBWNF9BTFdBWVNfREVGUkFHPTY3LAorCU5FVF9JUFY0X1RDUF9LRUVQQUxJVkVfSU5UVkw9NjgsCisJTkVUX0lQVjRfSU5FVF9QRUVSX1RIUkVTSE9MRD02OSwKKwlORVRfSVBWNF9JTkVUX1BFRVJfTUlOVFRMPTcwLAorCU5FVF9JUFY0X0lORVRfUEVFUl9NQVhUVEw9NzEsCisJTkVUX0lQVjRfSU5FVF9QRUVSX0dDX01JTlRJTUU9NzIsCisJTkVUX0lQVjRfSU5FVF9QRUVSX0dDX01BWFRJTUU9NzMsCisJTkVUX1RDUF9PUlBIQU5fUkVUUklFUz03NCwKKwlORVRfVENQX0FCT1JUX09OX09WRVJGTE9XPTc1LAorCU5FVF9UQ1BfU1lOQUNLX1JFVFJJRVM9NzYsCisJTkVUX1RDUF9NQVhfT1JQSEFOUz03NywKKwlORVRfVENQX01BWF9UV19CVUNLRVRTPTc4LAorCU5FVF9UQ1BfRkFDSz03OSwKKwlORVRfVENQX1JFT1JERVJJTkc9ODAsCisJTkVUX1RDUF9FQ049ODEsCisJTkVUX1RDUF9EU0FDSz04MiwKKwlORVRfVENQX01FTT04MywKKwlORVRfVENQX1dNRU09ODQsCisJTkVUX1RDUF9STUVNPTg1LAorCU5FVF9UQ1BfQVBQX1dJTj04NiwKKwlORVRfVENQX0FEVl9XSU5fU0NBTEU9ODcsCisJTkVUX0lQVjRfTk9OTE9DQUxfQklORD04OCwKKwlORVRfSVBWNF9JQ01QX1JBVEVMSU1JVD04OSwKKwlORVRfSVBWNF9JQ01QX1JBVEVNQVNLPTkwLAorCU5FVF9UQ1BfVFdfUkVVU0U9OTEsCisJTkVUX1RDUF9GUlRPPTkyLAorCU5FVF9UQ1BfTE9XX0xBVEVOQ1k9OTMsCisJTkVUX0lQVjRfSVBGUkFHX1NFQ1JFVF9JTlRFUlZBTD05NCwKKwlORVRfSVBWNF9JR01QX01BWF9NU0Y9OTYsCisJTkVUX1RDUF9OT19NRVRSSUNTX1NBVkU9OTcsCisJTkVUX1RDUF9ERUZBVUxUX1dJTl9TQ0FMRT0xMDUsCisJTkVUX1RDUF9NT0RFUkFURV9SQ1ZCVUY9MTA2LAorCU5FVF9UQ1BfVFNPX1dJTl9ESVZJU09SPTEwNywKKwlORVRfVENQX0JJQ19CRVRBPTEwOCwKKwlORVRfSVBWNF9JQ01QX0VSUk9SU19VU0VfSU5CT1VORF9JRkFERFI9MTA5LAorCU5FVF9UQ1BfQ09OR19DT05UUk9MPTExMCwKKwlORVRfVENQX0FCQz0xMTEsCisJTkVUX0lQVjRfSVBGUkFHX01BWF9ESVNUPTExMiwKKyAJTkVUX1RDUF9NVFVfUFJPQklORz0xMTMsCisJTkVUX1RDUF9CQVNFX01TUz0xMTQsCisJTkVUX0lQVjRfVENQX1dPUktBUk9VTkRfU0lHTkVEX1dJTkRPV1M9MTE1LAorCU5FVF9UQ1BfRE1BX0NPUFlCUkVBSz0xMTYsCisJTkVUX1RDUF9TTE9XX1NUQVJUX0FGVEVSX0lETEU9MTE3LAorCU5FVF9DSVBTT1Y0X0NBQ0hFX0VOQUJMRT0xMTgsCisJTkVUX0NJUFNPVjRfQ0FDSEVfQlVDS0VUX1NJWkU9MTE5LAorCU5FVF9DSVBTT1Y0X1JCTV9PUFRGTVQ9MTIwLAorCU5FVF9DSVBTT1Y0X1JCTV9TVFJJQ1RWQUxJRD0xMjEsCisJTkVUX1RDUF9BVkFJTF9DT05HX0NPTlRST0w9MTIyLAorCU5FVF9UQ1BfQUxMT1dFRF9DT05HX0NPTlRST0w9MTIzLAorCU5FVF9UQ1BfTUFYX1NTVEhSRVNIPTEyNCwKKwlORVRfVENQX0ZSVE9fUkVTUE9OU0U9MTI1LAorfTsKKworZW51bSB7CisJTkVUX0lQVjRfUk9VVEVfRkxVU0g9MSwKKwlORVRfSVBWNF9ST1VURV9NSU5fREVMQVk9MiwgLyogb2Jzb2xldGUgc2luY2UgMi42LjI1ICovCisJTkVUX0lQVjRfUk9VVEVfTUFYX0RFTEFZPTMsIC8qIG9ic29sZXRlIHNpbmNlIDIuNi4yNSAqLworCU5FVF9JUFY0X1JPVVRFX0dDX1RIUkVTSD00LAorCU5FVF9JUFY0X1JPVVRFX01BWF9TSVpFPTUsCisJTkVUX0lQVjRfUk9VVEVfR0NfTUlOX0lOVEVSVkFMPTYsCisJTkVUX0lQVjRfUk9VVEVfR0NfVElNRU9VVD03LAorCU5FVF9JUFY0X1JPVVRFX0dDX0lOVEVSVkFMPTgsIC8qIG9ic29sZXRlIHNpbmNlIDIuNi4zOCAqLworCU5FVF9JUFY0X1JPVVRFX1JFRElSRUNUX0xPQUQ9OSwKKwlORVRfSVBWNF9ST1VURV9SRURJUkVDVF9OVU1CRVI9MTAsCisJTkVUX0lQVjRfUk9VVEVfUkVESVJFQ1RfU0lMRU5DRT0xMSwKKwlORVRfSVBWNF9ST1VURV9FUlJPUl9DT1NUPTEyLAorCU5FVF9JUFY0X1JPVVRFX0VSUk9SX0JVUlNUPTEzLAorCU5FVF9JUFY0X1JPVVRFX0dDX0VMQVNUSUNJVFk9MTQsCisJTkVUX0lQVjRfUk9VVEVfTVRVX0VYUElSRVM9MTUsCisJTkVUX0lQVjRfUk9VVEVfTUlOX1BNVFU9MTYsCisJTkVUX0lQVjRfUk9VVEVfTUlOX0FEVk1TUz0xNywKKwlORVRfSVBWNF9ST1VURV9TRUNSRVRfSU5URVJWQUw9MTgsCisJTkVUX0lQVjRfUk9VVEVfR0NfTUlOX0lOVEVSVkFMX01TPTE5LAorfTsKKworZW51bQoreworCU5FVF9QUk9UT19DT05GX0FMTD0tMiwKKwlORVRfUFJPVE9fQ09ORl9ERUZBVUxUPS0zCisKKwkvKiBBbmQgZGV2aWNlIGlmaW5kaWNlcyAuLi4gKi8KK307CisKK2VudW0KK3sKKwlORVRfSVBWNF9DT05GX0ZPUldBUkRJTkc9MSwKKwlORVRfSVBWNF9DT05GX01DX0ZPUldBUkRJTkc9MiwKKwlORVRfSVBWNF9DT05GX1BST1hZX0FSUD0zLAorCU5FVF9JUFY0X0NPTkZfQUNDRVBUX1JFRElSRUNUUz00LAorCU5FVF9JUFY0X0NPTkZfU0VDVVJFX1JFRElSRUNUUz01LAorCU5FVF9JUFY0X0NPTkZfU0VORF9SRURJUkVDVFM9NiwKKwlORVRfSVBWNF9DT05GX1NIQVJFRF9NRURJQT03LAorCU5FVF9JUFY0X0NPTkZfUlBfRklMVEVSPTgsCisJTkVUX0lQVjRfQ09ORl9BQ0NFUFRfU09VUkNFX1JPVVRFPTksCisJTkVUX0lQVjRfQ09ORl9CT09UUF9SRUxBWT0xMCwKKwlORVRfSVBWNF9DT05GX0xPR19NQVJUSUFOUz0xMSwKKwlORVRfSVBWNF9DT05GX1RBRz0xMiwKKwlORVRfSVBWNF9DT05GX0FSUEZJTFRFUj0xMywKKwlORVRfSVBWNF9DT05GX01FRElVTV9JRD0xNCwKKwlORVRfSVBWNF9DT05GX05PWEZSTT0xNSwKKwlORVRfSVBWNF9DT05GX05PUE9MSUNZPTE2LAorCU5FVF9JUFY0X0NPTkZfRk9SQ0VfSUdNUF9WRVJTSU9OPTE3LAorCU5FVF9JUFY0X0NPTkZfQVJQX0FOTk9VTkNFPTE4LAorCU5FVF9JUFY0X0NPTkZfQVJQX0lHTk9SRT0xOSwKKwlORVRfSVBWNF9DT05GX1BST01PVEVfU0VDT05EQVJJRVM9MjAsCisJTkVUX0lQVjRfQ09ORl9BUlBfQUNDRVBUPTIxLAorCU5FVF9JUFY0X0NPTkZfQVJQX05PVElGWT0yMiwKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvaXB2NC9uZXRmaWx0ZXIgKi8KK2VudW0KK3sKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfTUFYPTEsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1NZTl9TRU5UPTIsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1NZTl9SRUNWPTMsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0VTVEFCTElTSEVEPTQsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0ZJTl9XQUlUPTUsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0NMT1NFX1dBSVQ9NiwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfTEFTVF9BQ0s9NywKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfVElNRV9XQUlUPTgsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0NMT1NFPTksCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1VEUF9USU1FT1VUPTEwLAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19VRFBfVElNRU9VVF9TVFJFQU09MTEsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0lDTVBfVElNRU9VVD0xMiwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfR0VORVJJQ19USU1FT1VUPTEzLAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19CVUNLRVRTPTE0LAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19MT0dfSU5WQUxJRD0xNSwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfTUFYX1JFVFJBTlM9MTYsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9MT09TRT0xNywKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX0JFX0xJQkVSQUw9MTgsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9NQVhfUkVUUkFOUz0xOSwKKyAJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9DTE9TRUQ9MjAsCisgCU5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ09PS0lFX1dBSVQ9MjEsCisgCU5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ09PS0lFX0VDSE9FRD0yMiwKKyAJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9FU1RBQkxJU0hFRD0yMywKKyAJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9TSFVURE9XTl9TRU5UPTI0LAorIAlORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX1NIVVRET1dOX1JFQ0Q9MjUsCisgCU5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fQUNLX1NFTlQ9MjYsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0NPVU5UPTI3LAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19DSEVDS1NVTT0yOCwKK307CisgCisvKiAvcHJvYy9zeXMvbmV0L2lwdjYgKi8KK2VudW0geworCU5FVF9JUFY2X0NPTkY9MTYsCisJTkVUX0lQVjZfTkVJR0g9MTcsCisJTkVUX0lQVjZfUk9VVEU9MTgsCisJTkVUX0lQVjZfSUNNUD0xOSwKKwlORVRfSVBWNl9CSU5EVjZPTkxZPTIwLAorCU5FVF9JUFY2X0lQNkZSQUdfSElHSF9USFJFU0g9MjEsCisJTkVUX0lQVjZfSVA2RlJBR19MT1dfVEhSRVNIPTIyLAorCU5FVF9JUFY2X0lQNkZSQUdfVElNRT0yMywKKwlORVRfSVBWNl9JUDZGUkFHX1NFQ1JFVF9JTlRFUlZBTD0yNCwKKwlORVRfSVBWNl9NTERfTUFYX01TRj0yNSwKK307CisKK2VudW0geworCU5FVF9JUFY2X1JPVVRFX0ZMVVNIPTEsCisJTkVUX0lQVjZfUk9VVEVfR0NfVEhSRVNIPTIsCisJTkVUX0lQVjZfUk9VVEVfTUFYX1NJWkU9MywKKwlORVRfSVBWNl9ST1VURV9HQ19NSU5fSU5URVJWQUw9NCwKKwlORVRfSVBWNl9ST1VURV9HQ19USU1FT1VUPTUsCisJTkVUX0lQVjZfUk9VVEVfR0NfSU5URVJWQUw9NiwKKwlORVRfSVBWNl9ST1VURV9HQ19FTEFTVElDSVRZPTcsCisJTkVUX0lQVjZfUk9VVEVfTVRVX0VYUElSRVM9OCwKKwlORVRfSVBWNl9ST1VURV9NSU5fQURWTVNTPTksCisJTkVUX0lQVjZfUk9VVEVfR0NfTUlOX0lOVEVSVkFMX01TPTEwCit9OworCitlbnVtIHsKKwlORVRfSVBWNl9GT1JXQVJESU5HPTEsCisJTkVUX0lQVjZfSE9QX0xJTUlUPTIsCisJTkVUX0lQVjZfTVRVPTMsCisJTkVUX0lQVjZfQUNDRVBUX1JBPTQsCisJTkVUX0lQVjZfQUNDRVBUX1JFRElSRUNUUz01LAorCU5FVF9JUFY2X0FVVE9DT05GPTYsCisJTkVUX0lQVjZfREFEX1RSQU5TTUlUUz03LAorCU5FVF9JUFY2X1JUUl9TT0xJQ0lUUz04LAorCU5FVF9JUFY2X1JUUl9TT0xJQ0lUX0lOVEVSVkFMPTksCisJTkVUX0lQVjZfUlRSX1NPTElDSVRfREVMQVk9MTAsCisJTkVUX0lQVjZfVVNFX1RFTVBBRERSPTExLAorCU5FVF9JUFY2X1RFTVBfVkFMSURfTEZUPTEyLAorCU5FVF9JUFY2X1RFTVBfUFJFRkVSRURfTEZUPTEzLAorCU5FVF9JUFY2X1JFR0VOX01BWF9SRVRSWT0xNCwKKwlORVRfSVBWNl9NQVhfREVTWU5DX0ZBQ1RPUj0xNSwKKwlORVRfSVBWNl9NQVhfQUREUkVTU0VTPTE2LAorCU5FVF9JUFY2X0ZPUkNFX01MRF9WRVJTSU9OPTE3LAorCU5FVF9JUFY2X0FDQ0VQVF9SQV9ERUZSVFI9MTgsCisJTkVUX0lQVjZfQUNDRVBUX1JBX1BJTkZPPTE5LAorCU5FVF9JUFY2X0FDQ0VQVF9SQV9SVFJfUFJFRj0yMCwKKwlORVRfSVBWNl9SVFJfUFJPQkVfSU5URVJWQUw9MjEsCisJTkVUX0lQVjZfQUNDRVBUX1JBX1JUX0lORk9fTUFYX1BMRU49MjIsCisJTkVUX0lQVjZfUFJPWFlfTkRQPTIzLAorCU5FVF9JUFY2X0FDQ0VQVF9TT1VSQ0VfUk9VVEU9MjUsCisJX19ORVRfSVBWNl9NQVgKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvaXB2Ni9pY21wICovCitlbnVtIHsKKwlORVRfSVBWNl9JQ01QX1JBVEVMSU1JVD0xCit9OworCisvKiAvcHJvYy9zeXMvbmV0Lzxwcm90b2NvbD4vbmVpZ2gvPGRldj4gKi8KK2VudW0geworCU5FVF9ORUlHSF9NQ0FTVF9TT0xJQ0lUPTEsCisJTkVUX05FSUdIX1VDQVNUX1NPTElDSVQ9MiwKKwlORVRfTkVJR0hfQVBQX1NPTElDSVQ9MywKKwlORVRfTkVJR0hfUkVUUkFOU19USU1FPTQsCisJTkVUX05FSUdIX1JFQUNIQUJMRV9USU1FPTUsCisJTkVUX05FSUdIX0RFTEFZX1BST0JFX1RJTUU9NiwKKwlORVRfTkVJR0hfR0NfU1RBTEVfVElNRT03LAorCU5FVF9ORUlHSF9VTlJFU19RTEVOPTgsCisJTkVUX05FSUdIX1BST1hZX1FMRU49OSwKKwlORVRfTkVJR0hfQU5ZQ0FTVF9ERUxBWT0xMCwKKwlORVRfTkVJR0hfUFJPWFlfREVMQVk9MTEsCisJTkVUX05FSUdIX0xPQ0tUSU1FPTEyLAorCU5FVF9ORUlHSF9HQ19JTlRFUlZBTD0xMywKKwlORVRfTkVJR0hfR0NfVEhSRVNIMT0xNCwKKwlORVRfTkVJR0hfR0NfVEhSRVNIMj0xNSwKKwlORVRfTkVJR0hfR0NfVEhSRVNIMz0xNiwKKwlORVRfTkVJR0hfUkVUUkFOU19USU1FX01TPTE3LAorCU5FVF9ORUlHSF9SRUFDSEFCTEVfVElNRV9NUz0xOCwKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvZGNjcCAqLworZW51bSB7CisJTkVUX0RDQ1BfREVGQVVMVD0xLAorfTsKKworLyogL3Byb2Mvc3lzL25ldC9pcHggKi8KK2VudW0geworCU5FVF9JUFhfUFBST1BfQlJPQURDQVNUSU5HPTEsCisJTkVUX0lQWF9GT1JXQVJESU5HPTIKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvbGxjICovCitlbnVtIHsKKwlORVRfTExDMj0xLAorCU5FVF9MTENfU1RBVElPTj0yLAorfTsKKworLyogL3Byb2Mvc3lzL25ldC9sbGMvbGxjMiAqLworZW51bSB7CisJTkVUX0xMQzJfVElNRU9VVD0xLAorfTsKKworLyogL3Byb2Mvc3lzL25ldC9sbGMvc3RhdGlvbiAqLworZW51bSB7CisJTkVUX0xMQ19TVEFUSU9OX0FDS19USU1FT1VUPTEsCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2xsYy9sbGMyL3RpbWVvdXQgKi8KK2VudW0geworCU5FVF9MTEMyX0FDS19USU1FT1VUPTEsCisJTkVUX0xMQzJfUF9USU1FT1VUPTIsCisJTkVUX0xMQzJfUkVKX1RJTUVPVVQ9MywKKwlORVRfTExDMl9CVVNZX1RJTUVPVVQ9NCwKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvYXBwbGV0YWxrICovCitlbnVtIHsKKwlORVRfQVRBTEtfQUFSUF9FWFBJUllfVElNRT0xLAorCU5FVF9BVEFMS19BQVJQX1RJQ0tfVElNRT0yLAorCU5FVF9BVEFMS19BQVJQX1JFVFJBTlNNSVRfTElNSVQ9MywKKwlORVRfQVRBTEtfQUFSUF9SRVNPTFZFX1RJTUU9NAorfTsKKworCisvKiAvcHJvYy9zeXMvbmV0L25ldHJvbSAqLworZW51bSB7CisJTkVUX05FVFJPTV9ERUZBVUxUX1BBVEhfUVVBTElUWT0xLAorCU5FVF9ORVRST01fT0JTT0xFU0NFTkNFX0NPVU5UX0lOSVRJQUxJU0VSPTIsCisJTkVUX05FVFJPTV9ORVRXT1JLX1RUTF9JTklUSUFMSVNFUj0zLAorCU5FVF9ORVRST01fVFJBTlNQT1JUX1RJTUVPVVQ9NCwKKwlORVRfTkVUUk9NX1RSQU5TUE9SVF9NQVhJTVVNX1RSSUVTPTUsCisJTkVUX05FVFJPTV9UUkFOU1BPUlRfQUNLTk9XTEVER0VfREVMQVk9NiwKKwlORVRfTkVUUk9NX1RSQU5TUE9SVF9CVVNZX0RFTEFZPTcsCisJTkVUX05FVFJPTV9UUkFOU1BPUlRfUkVRVUVTVEVEX1dJTkRPV19TSVpFPTgsCisJTkVUX05FVFJPTV9UUkFOU1BPUlRfTk9fQUNUSVZJVFlfVElNRU9VVD05LAorCU5FVF9ORVRST01fUk9VVElOR19DT05UUk9MPTEwLAorCU5FVF9ORVRST01fTElOS19GQUlMU19DT1VOVD0xMSwKKwlORVRfTkVUUk9NX1JFU0VUPTEyCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2F4MjUgKi8KK2VudW0geworCU5FVF9BWDI1X0lQX0RFRkFVTFRfTU9ERT0xLAorCU5FVF9BWDI1X0RFRkFVTFRfTU9ERT0yLAorCU5FVF9BWDI1X0JBQ0tPRkZfVFlQRT0zLAorCU5FVF9BWDI1X0NPTk5FQ1RfTU9ERT00LAorCU5FVF9BWDI1X1NUQU5EQVJEX1dJTkRPVz01LAorCU5FVF9BWDI1X0VYVEVOREVEX1dJTkRPVz02LAorCU5FVF9BWDI1X1QxX1RJTUVPVVQ9NywKKwlORVRfQVgyNV9UMl9USU1FT1VUPTgsCisJTkVUX0FYMjVfVDNfVElNRU9VVD05LAorCU5FVF9BWDI1X0lETEVfVElNRU9VVD0xMCwKKwlORVRfQVgyNV9OMj0xMSwKKwlORVRfQVgyNV9QQUNMRU49MTIsCisJTkVUX0FYMjVfUFJPVE9DT0w9MTMsCisJTkVUX0FYMjVfREFNQV9TTEFWRV9USU1FT1VUPTE0Cit9OworCisvKiAvcHJvYy9zeXMvbmV0L3Jvc2UgKi8KK2VudW0geworCU5FVF9ST1NFX1JFU1RBUlRfUkVRVUVTVF9USU1FT1VUPTEsCisJTkVUX1JPU0VfQ0FMTF9SRVFVRVNUX1RJTUVPVVQ9MiwKKwlORVRfUk9TRV9SRVNFVF9SRVFVRVNUX1RJTUVPVVQ9MywKKwlORVRfUk9TRV9DTEVBUl9SRVFVRVNUX1RJTUVPVVQ9NCwKKwlORVRfUk9TRV9BQ0tfSE9MRF9CQUNLX1RJTUVPVVQ9NSwKKwlORVRfUk9TRV9ST1VUSU5HX0NPTlRST0w9NiwKKwlORVRfUk9TRV9MSU5LX0ZBSUxfVElNRU9VVD03LAorCU5FVF9ST1NFX01BWF9WQ1M9OCwKKwlORVRfUk9TRV9XSU5ET1dfU0laRT05LAorCU5FVF9ST1NFX05PX0FDVElWSVRZX1RJTUVPVVQ9MTAKK307CisKKy8qIC9wcm9jL3N5cy9uZXQveDI1ICovCitlbnVtIHsKKwlORVRfWDI1X1JFU1RBUlRfUkVRVUVTVF9USU1FT1VUPTEsCisJTkVUX1gyNV9DQUxMX1JFUVVFU1RfVElNRU9VVD0yLAorCU5FVF9YMjVfUkVTRVRfUkVRVUVTVF9USU1FT1VUPTMsCisJTkVUX1gyNV9DTEVBUl9SRVFVRVNUX1RJTUVPVVQ9NCwKKwlORVRfWDI1X0FDS19IT0xEX0JBQ0tfVElNRU9VVD01LAorCU5FVF9YMjVfRk9SV0FSRD02Cit9OworCisvKiAvcHJvYy9zeXMvbmV0L3Rva2VuLXJpbmcgKi8KK2VudW0KK3sKKwlORVRfVFJfUklGX1RJTUVPVVQ9MQorfTsKKworLyogL3Byb2Mvc3lzL25ldC9kZWNuZXQvICovCitlbnVtIHsKKwlORVRfREVDTkVUX05PREVfVFlQRSA9IDEsCisJTkVUX0RFQ05FVF9OT0RFX0FERFJFU1MgPSAyLAorCU5FVF9ERUNORVRfTk9ERV9OQU1FID0gMywKKwlORVRfREVDTkVUX0RFRkFVTFRfREVWSUNFID0gNCwKKwlORVRfREVDTkVUX1RJTUVfV0FJVCA9IDUsCisJTkVUX0RFQ05FVF9ETl9DT1VOVCA9IDYsCisJTkVUX0RFQ05FVF9ESV9DT1VOVCA9IDcsCisJTkVUX0RFQ05FVF9EUl9DT1VOVCA9IDgsCisJTkVUX0RFQ05FVF9EU1RfR0NfSU5URVJWQUwgPSA5LAorCU5FVF9ERUNORVRfQ09ORiA9IDEwLAorCU5FVF9ERUNORVRfTk9fRkNfTUFYX0NXTkQgPSAxMSwKKwlORVRfREVDTkVUX01FTSA9IDEyLAorCU5FVF9ERUNORVRfUk1FTSA9IDEzLAorCU5FVF9ERUNORVRfV01FTSA9IDE0LAorCU5FVF9ERUNORVRfREVCVUdfTEVWRUwgPSAyNTUKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvZGVjbmV0L2NvbmYvPGRldj4gKi8KK2VudW0geworCU5FVF9ERUNORVRfQ09ORl9MT09QQkFDSyA9IC0yLAorCU5FVF9ERUNORVRfQ09ORl9ERENNUCA9IC0zLAorCU5FVF9ERUNORVRfQ09ORl9QUFAgPSAtNCwKKwlORVRfREVDTkVUX0NPTkZfWDI1ID0gLTUsCisJTkVUX0RFQ05FVF9DT05GX0dSRSA9IC02LAorCU5FVF9ERUNORVRfQ09ORl9FVEhFUiA9IC03CisKKwkvKiAuLi4gYW5kIGlmaW5kZXggb2YgZGV2aWNlcyAqLworfTsKKworLyogL3Byb2Mvc3lzL25ldC9kZWNuZXQvY29uZi88ZGV2Pi8gKi8KK2VudW0geworCU5FVF9ERUNORVRfQ09ORl9ERVZfUFJJT1JJVFkgPSAxLAorCU5FVF9ERUNORVRfQ09ORl9ERVZfVDEgPSAyLAorCU5FVF9ERUNORVRfQ09ORl9ERVZfVDIgPSAzLAorCU5FVF9ERUNORVRfQ09ORl9ERVZfVDMgPSA0LAorCU5FVF9ERUNORVRfQ09ORl9ERVZfRk9SV0FSRElORyA9IDUsCisJTkVUX0RFQ05FVF9DT05GX0RFVl9CTEtTSVpFID0gNiwKKwlORVRfREVDTkVUX0NPTkZfREVWX1NUQVRFID0gNworfTsKKworLyogL3Byb2Mvc3lzL25ldC9zY3RwICovCitlbnVtIHsKKwlORVRfU0NUUF9SVE9fSU5JVElBTCA9IDEsCisJTkVUX1NDVFBfUlRPX01JTiAgICAgPSAyLAorCU5FVF9TQ1RQX1JUT19NQVggICAgID0gMywKKwlORVRfU0NUUF9SVE9fQUxQSEEgICA9IDQsCisJTkVUX1NDVFBfUlRPX0JFVEEgICAgPSA1LAorCU5FVF9TQ1RQX1ZBTElEX0NPT0tJRV9MSUZFICAgICAgID0gIDYsCisJTkVUX1NDVFBfQVNTT0NJQVRJT05fTUFYX1JFVFJBTlMgPSAgNywKKwlORVRfU0NUUF9QQVRIX01BWF9SRVRSQU5TICAgICAgICA9ICA4LAorCU5FVF9TQ1RQX01BWF9JTklUX1JFVFJBTlNNSVRTICAgID0gIDksCisJTkVUX1NDVFBfSEJfSU5URVJWQUwgICAgICAgICAgICAgPSAxMCwKKwlORVRfU0NUUF9QUkVTRVJWRV9FTkFCTEUgICAgICAgICA9IDExLAorCU5FVF9TQ1RQX01BWF9CVVJTVCAgICAgICAgICAgICAgID0gMTIsCisJTkVUX1NDVFBfQURESVBfRU5BQkxFCQkgPSAxMywKKwlORVRfU0NUUF9QUlNDVFBfRU5BQkxFCQkgPSAxNCwKKwlORVRfU0NUUF9TTkRCVUZfUE9MSUNZCQkgPSAxNSwKKwlORVRfU0NUUF9TQUNLX1RJTUVPVVQJCSA9IDE2LAorCU5FVF9TQ1RQX1JDVkJVRl9QT0xJQ1kJCSA9IDE3LAorfTsKKworLyogL3Byb2Mvc3lzL25ldC9icmlkZ2UgKi8KK2VudW0geworCU5FVF9CUklER0VfTkZfQ0FMTF9BUlBUQUJMRVMgPSAxLAorCU5FVF9CUklER0VfTkZfQ0FMTF9JUFRBQkxFUyA9IDIsCisJTkVUX0JSSURHRV9ORl9DQUxMX0lQNlRBQkxFUyA9IDMsCisJTkVUX0JSSURHRV9ORl9GSUxURVJfVkxBTl9UQUdHRUQgPSA0LAorCU5FVF9CUklER0VfTkZfRklMVEVSX1BQUE9FX1RBR0dFRCA9IDUsCit9OworCisvKiBwcm9jL3N5cy9uZXQvaXJkYSAqLworZW51bSB7CisJTkVUX0lSREFfRElTQ09WRVJZPTEsCisJTkVUX0lSREFfREVWTkFNRT0yLAorCU5FVF9JUkRBX0RFQlVHPTMsCisJTkVUX0lSREFfRkFTVF9QT0xMPTQsCisJTkVUX0lSREFfRElTQ09WRVJZX1NMT1RTPTUsCisJTkVUX0lSREFfRElTQ09WRVJZX1RJTUVPVVQ9NiwKKwlORVRfSVJEQV9TTE9UX1RJTUVPVVQ9NywKKwlORVRfSVJEQV9NQVhfQkFVRF9SQVRFPTgsCisJTkVUX0lSREFfTUlOX1RYX1RVUk5fVElNRT05LAorCU5FVF9JUkRBX01BWF9UWF9EQVRBX1NJWkU9MTAsCisJTkVUX0lSREFfTUFYX1RYX1dJTkRPVz0xMSwKKwlORVRfSVJEQV9NQVhfTk9SRVBMWV9USU1FPTEyLAorCU5FVF9JUkRBX1dBUk5fTk9SRVBMWV9USU1FPTEzLAorCU5FVF9JUkRBX0xBUF9LRUVQQUxJVkVfVElNRT0xNCwKK307CisKKworLyogQ1RMX0ZTIG5hbWVzOiAqLworZW51bQoreworCUZTX05SSU5PREU9MSwJLyogaW50OmN1cnJlbnQgbnVtYmVyIG9mIGFsbG9jYXRlZCBpbm9kZXMgKi8KKwlGU19TVEFUSU5PREU9MiwKKwlGU19NQVhJTk9ERT0zLAkvKiBpbnQ6bWF4aW11bSBudW1iZXIgb2YgaW5vZGVzIHRoYXQgY2FuIGJlIGFsbG9jYXRlZCAqLworCUZTX05SRFFVT1Q9NCwJLyogaW50OmN1cnJlbnQgbnVtYmVyIG9mIGFsbG9jYXRlZCBkcXVvdHMgKi8KKwlGU19NQVhEUVVPVD01LAkvKiBpbnQ6bWF4aW11bSBudW1iZXIgb2YgZHF1b3RzIHRoYXQgY2FuIGJlIGFsbG9jYXRlZCAqLworCUZTX05SRklMRT02LAkvKiBpbnQ6Y3VycmVudCBudW1iZXIgb2YgYWxsb2NhdGVkIGZpbGVkZXNjcmlwdG9ycyAqLworCUZTX01BWEZJTEU9NywJLyogaW50Om1heGltdW0gbnVtYmVyIG9mIGZpbGVkZXNjcmlwdG9ycyB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQgKi8KKwlGU19ERU5UUlk9OCwKKwlGU19OUlNVUEVSPTksCS8qIGludDpjdXJyZW50IG51bWJlciBvZiBhbGxvY2F0ZWQgc3VwZXJfYmxvY2tzICovCisJRlNfTUFYU1VQRVI9MTAsCS8qIGludDptYXhpbXVtIG51bWJlciBvZiBzdXBlcl9ibG9ja3MgdGhhdCBjYW4gYmUgYWxsb2NhdGVkICovCisJRlNfT1ZFUkZMT1dVSUQ9MTEsCS8qIGludDogb3ZlcmZsb3cgVUlEICovCisJRlNfT1ZFUkZMT1dHSUQ9MTIsCS8qIGludDogb3ZlcmZsb3cgR0lEICovCisJRlNfTEVBU0VTPTEzLAkvKiBpbnQ6IGxlYXNlcyBlbmFibGVkICovCisJRlNfRElSX05PVElGWT0xNCwJLyogaW50OiBkaXJlY3Rvcnkgbm90aWZpY2F0aW9uIGVuYWJsZWQgKi8KKwlGU19MRUFTRV9USU1FPTE1LAkvKiBpbnQ6IG1heGltdW0gdGltZSB0byB3YWl0IGZvciBhIGxlYXNlIGJyZWFrICovCisJRlNfRFFTVEFUUz0xNiwJLyogZGlzYyBxdW90YSB1c2FnZSBzdGF0aXN0aWNzIGFuZCBjb250cm9sICovCisJRlNfWEZTPTE3LAkvKiBzdHJ1Y3Q6IGNvbnRyb2wgeGZzIHBhcmFtZXRlcnMgKi8KKwlGU19BSU9fTlI9MTgsCS8qIGN1cnJlbnQgc3lzdGVtLXdpZGUgbnVtYmVyIG9mIGFpbyByZXF1ZXN0cyAqLworCUZTX0FJT19NQVhfTlI9MTksCS8qIHN5c3RlbS13aWRlIG1heGltdW0gbnVtYmVyIG9mIGFpbyByZXF1ZXN0cyAqLworCUZTX0lOT1RJRlk9MjAsCS8qIGlub3RpZnkgc3VibWVudSAqLworCUZTX09DRlMyPTk4OCwJLyogb2NmczIgKi8KK307CisKKy8qIC9wcm9jL3N5cy9mcy9xdW90YS8gKi8KK2VudW0geworCUZTX0RRX0xPT0tVUFMgPSAxLAorCUZTX0RRX0RST1BTID0gMiwKKwlGU19EUV9SRUFEUyA9IDMsCisJRlNfRFFfV1JJVEVTID0gNCwKKwlGU19EUV9DQUNIRV9ISVRTID0gNSwKKwlGU19EUV9BTExPQ0FURUQgPSA2LAorCUZTX0RRX0ZSRUUgPSA3LAorCUZTX0RRX1NZTkNTID0gOCwKKwlGU19EUV9XQVJOSU5HUyA9IDksCit9OworCisvKiBDVExfREVCVUcgbmFtZXM6ICovCisKKy8qIENUTF9ERVYgbmFtZXM6ICovCitlbnVtIHsKKwlERVZfQ0RST009MSwKKwlERVZfSFdNT049MiwKKwlERVZfUEFSUE9SVD0zLAorCURFVl9SQUlEPTQsCisJREVWX01BQ19ISUQ9NSwKKwlERVZfU0NTST02LAorCURFVl9JUE1JPTcsCit9OworCisvKiAvcHJvYy9zeXMvZGV2L2Nkcm9tICovCitlbnVtIHsKKwlERVZfQ0RST01fSU5GTz0xLAorCURFVl9DRFJPTV9BVVRPQ0xPU0U9MiwKKwlERVZfQ0RST01fQVVUT0VKRUNUPTMsCisJREVWX0NEUk9NX0RFQlVHPTQsCisJREVWX0NEUk9NX0xPQ0s9NSwKKwlERVZfQ0RST01fQ0hFQ0tfTUVESUE9NgorfTsKKworLyogL3Byb2Mvc3lzL2Rldi9wYXJwb3J0ICovCitlbnVtIHsKKwlERVZfUEFSUE9SVF9ERUZBVUxUPS0zCit9OworCisvKiAvcHJvYy9zeXMvZGV2L3JhaWQgKi8KK2VudW0geworCURFVl9SQUlEX1NQRUVEX0xJTUlUX01JTj0xLAorCURFVl9SQUlEX1NQRUVEX0xJTUlUX01BWD0yCit9OworCisvKiAvcHJvYy9zeXMvZGV2L3BhcnBvcnQvZGVmYXVsdCAqLworZW51bSB7CisJREVWX1BBUlBPUlRfREVGQVVMVF9USU1FU0xJQ0U9MSwKKwlERVZfUEFSUE9SVF9ERUZBVUxUX1NQSU5USU1FPTIKK307CisKKy8qIC9wcm9jL3N5cy9kZXYvcGFycG9ydC9wYXJwb3J0IG4gKi8KK2VudW0geworCURFVl9QQVJQT1JUX1NQSU5USU1FPTEsCisJREVWX1BBUlBPUlRfQkFTRV9BRERSPTIsCisJREVWX1BBUlBPUlRfSVJRPTMsCisJREVWX1BBUlBPUlRfRE1BPTQsCisJREVWX1BBUlBPUlRfTU9ERVM9NSwKKwlERVZfUEFSUE9SVF9ERVZJQ0VTPTYsCisJREVWX1BBUlBPUlRfQVVUT1BST0JFPTE2Cit9OworCisvKiAvcHJvYy9zeXMvZGV2L3BhcnBvcnQvcGFycG9ydCBuL2RldmljZXMvICovCitlbnVtIHsKKwlERVZfUEFSUE9SVF9ERVZJQ0VTX0FDVElWRT0tMywKK307CisKKy8qIC9wcm9jL3N5cy9kZXYvcGFycG9ydC9wYXJwb3J0IG4vZGV2aWNlcy9kZXZpY2UgbiAqLworZW51bSB7CisJREVWX1BBUlBPUlRfREVWSUNFX1RJTUVTTElDRT0xLAorfTsKKworLyogL3Byb2Mvc3lzL2Rldi9tYWNfaGlkICovCitlbnVtIHsKKwlERVZfTUFDX0hJRF9LRVlCT0FSRF9TRU5EU19MSU5VWF9LRVlDT0RFUz0xLAorCURFVl9NQUNfSElEX0tFWUJPQVJEX0xPQ0tfS0VZQ09ERVM9MiwKKwlERVZfTUFDX0hJRF9NT1VTRV9CVVRUT05fRU1VTEFUSU9OPTMsCisJREVWX01BQ19ISURfTU9VU0VfQlVUVE9OMl9LRVlDT0RFPTQsCisJREVWX01BQ19ISURfTU9VU0VfQlVUVE9OM19LRVlDT0RFPTUsCisJREVWX01BQ19ISURfQURCX01PVVNFX1NFTkRTX0tFWUNPREVTPTYKK307CisKKy8qIC9wcm9jL3N5cy9kZXYvc2NzaSAqLworZW51bSB7CisJREVWX1NDU0lfTE9HR0lOR19MRVZFTD0xLAorfTsKKworLyogL3Byb2Mvc3lzL2Rldi9pcG1pICovCitlbnVtIHsKKwlERVZfSVBNSV9QT1dFUk9GRl9QT1dFUkNZQ0xFPTEsCit9OworCisvKiAvcHJvYy9zeXMvYWJpICovCitlbnVtCit7CisJQUJJX0RFRkhBTkRMRVJfQ09GRj0xLAkvKiBkZWZhdWx0IGhhbmRsZXIgZm9yIGNvZmYgYmluYXJpZXMgKi8KKwlBQklfREVGSEFORExFUl9FTEY9MiwgCS8qIGRlZmF1bHQgaGFuZGxlciBmb3IgRUxGIGJpbmFyaWVzICovCisJQUJJX0RFRkhBTkRMRVJfTENBTEw3PTMsLyogZGVmYXVsdCBoYW5kbGVyIGZvciBwcm9jcyB1c2luZyBsY2FsbDcgKi8KKwlBQklfREVGSEFORExFUl9MSUJDU089NCwvKiBkZWZhdWx0IGhhbmRsZXIgZm9yIGFuIGxpYmMuc28gRUxGIGludGVycCAqLworCUFCSV9UUkFDRT01LAkJLyogdHJhY2luZyBmbGFncyAqLworCUFCSV9GQUtFX1VUU05BTUU9NiwJLyogZmFrZSB0YXJnZXQgdXRzbmFtZSBpbmZvcm1hdGlvbiAqLworfTsKKworCisjZW5kaWYgLyogX0xJTlVYX1NZU0NUTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Rhc2tzdGF0cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90YXNrc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDY2ZTU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90YXNrc3RhdHMuaApAQCAtMCwwICsxLDIxMyBAQAorLyogdGFza3N0YXRzLmggLSBleHBvcnRpbmcgcGVyLXRhc2sgc3RhdGlzdGljcworICoKKyAqIENvcHlyaWdodCAoQykgU2hhaWxhYmggTmFnYXIsIElCTSBDb3JwLiAyMDA2CisgKiAgICAgICAgICAgKEMpIEJhbGJpciBTaW5naCwgICBJQk0gQ29ycC4gMjAwNgorICogICAgICAgICAgIChDKSBKYXkgTGFuLCAgICAgICAgU0dJLCAyMDA2CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1RBU0tTVEFUU19ICisjZGVmaW5lIF9MSU5VWF9UQVNLU1RBVFNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogRm9ybWF0IGZvciBwZXItdGFzayBkYXRhIHJldHVybmVkIHRvIHVzZXJsYW5kIHdoZW4KKyAqCS0gYSB0YXNrIGV4aXRzCisgKgktIGxpc3RlbmVyIHJlcXVlc3RzIHN0YXRzIGZvciBhIHRhc2sKKyAqCisgKiBUaGUgc3RydWN0IGlzIHZlcnNpb25lZC4gTmV3ZXIgdmVyc2lvbnMgc2hvdWxkIG9ubHkgYWRkIGZpZWxkcyB0bworICogdGhlIGJvdHRvbSBvZiB0aGUgc3RydWN0IHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKgorICoKKyAqIFRvIGFkZCBuZXcgZmllbGRzCisgKglhKSBidW1wIHVwIFRBU0tTVEFUU19WRVJTSU9OCisgKgliKSBhZGQgY29tbWVudCBpbmRpY2F0aW5nIG5ldyB2ZXJzaW9uIG51bWJlciBhdCBlbmQgb2Ygc3RydWN0CisgKgljKSBhZGQgbmV3IGZpZWxkcyBhZnRlciB2ZXJzaW9uIGNvbW1lbnQ7IG1haW50YWluIDY0LWJpdCBhbGlnbm1lbnQKKyAqLworCisKKyNkZWZpbmUgVEFTS1NUQVRTX1ZFUlNJT04JOAorI2RlZmluZSBUU19DT01NX0xFTgkJMzIJLyogc2hvdWxkIGJlID49IFRBU0tfQ09NTV9MRU4KKwkJCQkJICogaW4gbGludXgvc2NoZWQuaCAqLworCitzdHJ1Y3QgdGFza3N0YXRzIHsKKworCS8qIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIHN0cnVjdC4gVGhpcyBmaWVsZCBpcyBhbHdheXMgc2V0IHRvCisJICogVEFLU1RBVFNfVkVSU0lPTiwgd2hpY2ggaXMgZGVmaW5lZCBpbiA8bGludXgvdGFza3N0YXRzLmg+LgorCSAqIEVhY2ggdGltZSB0aGUgc3RydWN0IGlzIGNoYW5nZWQsIHRoZSB2YWx1ZSBzaG91bGQgYmUgaW5jcmVtZW50ZWQuCisJICovCisJX191MTYJdmVyc2lvbjsKKwlfX3UzMglhY19leGl0Y29kZTsJCS8qIEV4aXQgc3RhdHVzICovCisKKwkvKiBUaGUgYWNjb3VudGluZyBmbGFncyBvZiBhIHRhc2sgYXMgZGVmaW5lZCBpbiA8bGludXgvYWNjdC5oPgorCSAqIERlZmluZWQgdmFsdWVzIGFyZSBBRk9SSywgQVNVLCBBQ09NUEFULCBBQ09SRSwgYW5kIEFYU0lHLgorCSAqLworCV9fdTgJYWNfZmxhZzsJCS8qIFJlY29yZCBmbGFncyAqLworCV9fdTgJYWNfbmljZTsJCS8qIHRhc2tfbmljZSAqLworCisJLyogRGVsYXkgYWNjb3VudGluZyBmaWVsZHMgc3RhcnQKKwkgKgorCSAqIEFsbCB2YWx1ZXMsIHVudGlsIGNvbW1lbnQgIkRlbGF5IGFjY291bnRpbmcgZmllbGRzIGVuZCIgYXJlCisJICogYXZhaWxhYmxlIG9ubHkgaWYgZGVsYXkgYWNjb3VudGluZyBpcyBlbmFibGVkLCBldmVuIHRob3VnaCB0aGUgbGFzdAorCSAqIGZldyBmaWVsZHMgYXJlIG5vdCBkZWxheXMKKwkgKgorCSAqIHh4eF9jb3VudCBpcyB0aGUgbnVtYmVyIG9mIGRlbGF5IHZhbHVlcyByZWNvcmRlZAorCSAqIHh4eF9kZWxheV90b3RhbCBpcyB0aGUgY29ycmVzcG9uZGluZyBjdW11bGF0aXZlIGRlbGF5IGluIG5hbm9zZWNvbmRzCisJICoKKwkgKiB4eHhfZGVsYXlfdG90YWwgd3JhcHMgYXJvdW5kIHRvIHplcm8gb24gb3ZlcmZsb3cKKwkgKiB4eHhfY291bnQgaW5jcmVtZW50ZWQgcmVnYXJkbGVzcyBvZiBvdmVyZmxvdworCSAqLworCisJLyogRGVsYXkgd2FpdGluZyBmb3IgY3B1LCB3aGlsZSBydW5uYWJsZQorCSAqIGNvdW50LCBkZWxheV90b3RhbCBOT1QgdXBkYXRlZCBhdG9taWNhbGx5CisJICovCisJX191NjQJY3B1X2NvdW50IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlfX3U2NAljcHVfZGVsYXlfdG90YWw7CisKKwkvKiBGb2xsb3dpbmcgZm91ciBmaWVsZHMgYXRvbWljYWxseSB1cGRhdGVkIHVzaW5nIHRhc2stPmRlbGF5cy0+bG9jayAqLworCisJLyogRGVsYXkgd2FpdGluZyBmb3Igc3luY2hyb25vdXMgYmxvY2sgSS9PIHRvIGNvbXBsZXRlCisJICogZG9lcyBub3QgYWNjb3VudCBmb3IgZGVsYXlzIGluIEkvTyBzdWJtaXNzaW9uCisJICovCisJX191NjQJYmxraW9fY291bnQ7CisJX191NjQJYmxraW9fZGVsYXlfdG90YWw7CisKKwkvKiBEZWxheSB3YWl0aW5nIGZvciBwYWdlIGZhdWx0IEkvTyAoc3dhcCBpbiBvbmx5KSAqLworCV9fdTY0CXN3YXBpbl9jb3VudDsKKwlfX3U2NAlzd2FwaW5fZGVsYXlfdG90YWw7CisKKwkvKiBjcHUgIndhbGwtY2xvY2siIHJ1bm5pbmcgdGltZQorCSAqIE9uIHNvbWUgYXJjaGl0ZWN0dXJlcywgdmFsdWUgd2lsbCBhZGp1c3QgZm9yIGNwdSB0aW1lIHN0b2xlbgorCSAqIGZyb20gdGhlIGtlcm5lbCBpbiBpbnZvbHVudGFyeSB3YWl0cyBkdWUgdG8gdmlydHVhbGl6YXRpb24uCisJICogVmFsdWUgaXMgY3VtdWxhdGl2ZSwgaW4gbmFub3NlY29uZHMsIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nIGNvdW50CisJICogYW5kIHdyYXBzIGFyb3VuZCB0byB6ZXJvIHNpbGVudGx5IG9uIG92ZXJmbG93CisJICovCisJX191NjQJY3B1X3J1bl9yZWFsX3RvdGFsOworCisJLyogY3B1ICJ2aXJ0dWFsIiBydW5uaW5nIHRpbWUKKwkgKiBVc2VzIHRpbWUgaW50ZXJ2YWxzIHNlZW4gYnkgdGhlIGtlcm5lbCBpLmUuIG5vIGFkanVzdG1lbnQKKwkgKiBmb3Iga2VybmVsJ3MgaW52b2x1bnRhcnkgd2FpdHMgZHVlIHRvIHZpcnR1YWxpemF0aW9uLgorCSAqIFZhbHVlIGlzIGN1bXVsYXRpdmUsIGluIG5hbm9zZWNvbmRzLCB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBjb3VudAorCSAqIGFuZCB3cmFwcyBhcm91bmQgdG8gemVybyBzaWxlbnRseSBvbiBvdmVyZmxvdworCSAqLworCV9fdTY0CWNwdV9ydW5fdmlydHVhbF90b3RhbDsKKwkvKiBEZWxheSBhY2NvdW50aW5nIGZpZWxkcyBlbmQgKi8KKwkvKiB2ZXJzaW9uIDEgZW5kcyBoZXJlICovCisKKwkvKiBCYXNpYyBBY2NvdW50aW5nIEZpZWxkcyBzdGFydCAqLworCWNoYXIJYWNfY29tbVtUU19DT01NX0xFTl07CS8qIENvbW1hbmQgbmFtZSAqLworCV9fdTgJYWNfc2NoZWQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCQkJCQkvKiBTY2hlZHVsaW5nIGRpc2NpcGxpbmUgKi8KKwlfX3U4CWFjX3BhZFszXTsKKwlfX3UzMglhY191aWQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCQkJCQkvKiBVc2VyIElEICovCisJX191MzIJYWNfZ2lkOwkJCS8qIEdyb3VwIElEICovCisJX191MzIJYWNfcGlkOwkJCS8qIFByb2Nlc3MgSUQgKi8KKwlfX3UzMglhY19wcGlkOwkJLyogUGFyZW50IHByb2Nlc3MgSUQgKi8KKwlfX3UzMglhY19idGltZTsJCS8qIEJlZ2luIHRpbWUgW3NlYyBzaW5jZSAxOTcwXSAqLworCV9fdTY0CWFjX2V0aW1lIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwkJCQkJLyogRWxhcHNlZCB0aW1lIFt1c2VjXSAqLworCV9fdTY0CWFjX3V0aW1lOwkJLyogVXNlciBDUFUgdGltZSBbdXNlY10gKi8KKwlfX3U2NAlhY19zdGltZTsJCS8qIFNZc3RlbSBDUFUgdGltZSBbdXNlY10gKi8KKwlfX3U2NAlhY19taW5mbHQ7CQkvKiBNaW5vciBQYWdlIEZhdWx0IENvdW50ICovCisJX191NjQJYWNfbWFqZmx0OwkJLyogTWFqb3IgUGFnZSBGYXVsdCBDb3VudCAqLworCS8qIEJhc2ljIEFjY291bnRpbmcgRmllbGRzIGVuZCAqLworCisJLyogRXh0ZW5kZWQgYWNjb3VudGluZyBmaWVsZHMgc3RhcnQgKi8KKwkvKiBBY2N1bXVsYXRlZCBSU1MgdXNhZ2UgaW4gZHVyYXRpb24gb2YgYSB0YXNrLCBpbiBNQnl0ZXMtdXNlY3MuCisJICogVGhlIGN1cnJlbnQgcnNzIHVzYWdlIGlzIGFkZGVkIHRvIHRoaXMgY291bnRlciBldmVyeSB0aW1lCisJICogYSB0aWNrIGlzIGNoYXJnZWQgdG8gYSB0YXNrJ3Mgc3lzdGVtIHRpbWUuIFNvLCBhdCB0aGUgZW5kIHdlCisJICogd2lsbCBoYXZlIG1lbW9yeSB1c2FnZSBtdWx0aXBsaWVkIGJ5IHN5c3RlbSB0aW1lLiBUaHVzIGFuCisJICogYXZlcmFnZSB1c2FnZSBwZXIgc3lzdGVtIHRpbWUgdW5pdCBjYW4gYmUgY2FsY3VsYXRlZC4KKwkgKi8KKwlfX3U2NAljb3JlbWVtOwkJLyogYWNjdW11bGF0ZWQgUlNTIHVzYWdlIGluIE1CLXVzZWMgKi8KKwkvKiBBY2N1bXVsYXRlZCB2aXJ0dWFsIG1lbW9yeSB1c2FnZSBpbiBkdXJhdGlvbiBvZiBhIHRhc2suCisJICogU2FtZSBhcyBhY2N0X3Jzc19tZW0xIGFib3ZlIGV4Y2VwdCB0aGF0IHdlIGtlZXAgdHJhY2sgb2YgVk0gdXNhZ2UuCisJICovCisJX191NjQJdmlydG1lbTsJCS8qIGFjY3VtdWxhdGVkIFZNICB1c2FnZSBpbiBNQi11c2VjICovCisKKwkvKiBIaWdoIHdhdGVybWFyayBvZiBSU1MgYW5kIHZpcnR1YWwgbWVtb3J5IHVzYWdlIGluIGR1cmF0aW9uIG9mCisJICogYSB0YXNrLCBpbiBLQnl0ZXMuCisJICovCisJX191NjQJaGl3YXRlcl9yc3M7CQkvKiBIaWdoLXdhdGVybWFyayBvZiBSU1MgdXNhZ2UsIGluIEtCICovCisJX191NjQJaGl3YXRlcl92bTsJCS8qIEhpZ2gtd2F0ZXIgVk0gdXNhZ2UsIGluIEtCICovCisKKwkvKiBUaGUgZm9sbG93aW5nIGZvdXIgZmllbGRzIGFyZSBJL08gc3RhdGlzdGljcyBvZiBhIHRhc2suICovCisJX191NjQJcmVhZF9jaGFyOwkJLyogYnl0ZXMgcmVhZCAqLworCV9fdTY0CXdyaXRlX2NoYXI7CQkvKiBieXRlcyB3cml0dGVuICovCisJX191NjQJcmVhZF9zeXNjYWxsczsJCS8qIHJlYWQgc3lzY2FsbHMgKi8KKwlfX3U2NAl3cml0ZV9zeXNjYWxsczsJCS8qIHdyaXRlIHN5c2NhbGxzICovCisJLyogRXh0ZW5kZWQgYWNjb3VudGluZyBmaWVsZHMgZW5kICovCisKKyNkZWZpbmUgVEFTS1NUQVRTX0hBU19JT19BQ0NPVU5USU5HCisJLyogUGVyLXRhc2sgc3RvcmFnZSBJL08gYWNjb3VudGluZyBzdGFydHMgKi8KKwlfX3U2NAlyZWFkX2J5dGVzOwkJLyogYnl0ZXMgb2YgcmVhZCBJL08gKi8KKwlfX3U2NAl3cml0ZV9ieXRlczsJCS8qIGJ5dGVzIG9mIHdyaXRlIEkvTyAqLworCV9fdTY0CWNhbmNlbGxlZF93cml0ZV9ieXRlczsJLyogYnl0ZXMgb2YgY2FuY2VsbGVkIHdyaXRlIEkvTyAqLworCisJX191NjQgIG52Y3N3OwkJCS8qIHZvbHVudGFyeV9jdHh0X3N3aXRjaGVzICovCisJX191NjQgIG5pdmNzdzsJCQkvKiBub252b2x1bnRhcnlfY3R4dF9zd2l0Y2hlcyAqLworCisJLyogdGltZSBhY2NvdW50aW5nIGZvciBTTVQgbWFjaGluZXMgKi8KKwlfX3U2NAlhY191dGltZXNjYWxlZDsJCS8qIHV0aW1lIHNjYWxlZCBvbiBmcmVxdWVuY3kgZXRjICovCisJX191NjQJYWNfc3RpbWVzY2FsZWQ7CQkvKiBzdGltZSBzY2FsZWQgb24gZnJlcXVlbmN5IGV0YyAqLworCV9fdTY0CWNwdV9zY2FsZWRfcnVuX3JlYWxfdG90YWw7IC8qIHNjYWxlZCBjcHVfcnVuX3JlYWxfdG90YWwgKi8KKworCS8qIERlbGF5IHdhaXRpbmcgZm9yIG1lbW9yeSByZWNsYWltICovCisJX191NjQJZnJlZXBhZ2VzX2NvdW50OworCV9fdTY0CWZyZWVwYWdlc19kZWxheV90b3RhbDsKK307CisKKworLyoKKyAqIENvbW1hbmRzIHNlbnQgZnJvbSB1c2Vyc3BhY2UKKyAqIE5vdCB2ZXJzaW9uZWQuIE5ldyBjb21tYW5kcyBzaG91bGQgb25seSBiZSBpbnNlcnRlZCBhdCB0aGUgZW51bSdzIGVuZAorICogcHJpb3IgdG8gX19UQVNLU1RBVFNfQ01EX01BWAorICovCisKK2VudW0geworCVRBU0tTVEFUU19DTURfVU5TUEVDID0gMCwJLyogUmVzZXJ2ZWQgKi8KKwlUQVNLU1RBVFNfQ01EX0dFVCwJCS8qIHVzZXItPmtlcm5lbCByZXF1ZXN0L2dldC1yZXNwb25zZSAqLworCVRBU0tTVEFUU19DTURfTkVXLAkJLyoga2VybmVsLT51c2VyIGV2ZW50ICovCisJX19UQVNLU1RBVFNfQ01EX01BWCwKK307CisKKyNkZWZpbmUgVEFTS1NUQVRTX0NNRF9NQVggKF9fVEFTS1NUQVRTX0NNRF9NQVggLSAxKQorCitlbnVtIHsKKwlUQVNLU1RBVFNfVFlQRV9VTlNQRUMgPSAwLAkvKiBSZXNlcnZlZCAqLworCVRBU0tTVEFUU19UWVBFX1BJRCwJCS8qIFByb2Nlc3MgaWQgKi8KKwlUQVNLU1RBVFNfVFlQRV9UR0lELAkJLyogVGhyZWFkIGdyb3VwIGlkICovCisJVEFTS1NUQVRTX1RZUEVfU1RBVFMsCQkvKiB0YXNrc3RhdHMgc3RydWN0dXJlICovCisJVEFTS1NUQVRTX1RZUEVfQUdHUl9QSUQsCS8qIGNvbnRhaW5zIHBpZCArIHN0YXRzICovCisJVEFTS1NUQVRTX1RZUEVfQUdHUl9UR0lELAkvKiBjb250YWlucyB0Z2lkICsgc3RhdHMgKi8KKwlUQVNLU1RBVFNfVFlQRV9OVUxMLAkJLyogY29udGFpbnMgbm90aGluZyAqLworCV9fVEFTS1NUQVRTX1RZUEVfTUFYLAorfTsKKworI2RlZmluZSBUQVNLU1RBVFNfVFlQRV9NQVggKF9fVEFTS1NUQVRTX1RZUEVfTUFYIC0gMSkKKworZW51bSB7CisJVEFTS1NUQVRTX0NNRF9BVFRSX1VOU1BFQyA9IDAsCisJVEFTS1NUQVRTX0NNRF9BVFRSX1BJRCwKKwlUQVNLU1RBVFNfQ01EX0FUVFJfVEdJRCwKKwlUQVNLU1RBVFNfQ01EX0FUVFJfUkVHSVNURVJfQ1BVTUFTSywKKwlUQVNLU1RBVFNfQ01EX0FUVFJfREVSRUdJU1RFUl9DUFVNQVNLLAorCV9fVEFTS1NUQVRTX0NNRF9BVFRSX01BWCwKK307CisKKyNkZWZpbmUgVEFTS1NUQVRTX0NNRF9BVFRSX01BWCAoX19UQVNLU1RBVFNfQ01EX0FUVFJfTUFYIC0gMSkKKworLyogTkVUTElOS19HRU5FUklDIHJlbGF0ZWQgaW5mbyAqLworCisjZGVmaW5lIFRBU0tTVEFUU19HRU5MX05BTUUJIlRBU0tTVEFUUyIKKyNkZWZpbmUgVEFTS1NUQVRTX0dFTkxfVkVSU0lPTgkweDEKKworI2VuZGlmIC8qIF9MSU5VWF9UQVNLU1RBVFNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfY3N1bS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfY3N1bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDdjNDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19jc3VtLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfX0xJTlVYX1RDX0NTVU1fSAorI2RlZmluZSBfX0xJTlVYX1RDX0NTVU1fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CisKKyNkZWZpbmUgVENBX0FDVF9DU1VNIDE2CisKK2VudW0geworCVRDQV9DU1VNX1VOU1BFQywKKwlUQ0FfQ1NVTV9QQVJNUywKKwlUQ0FfQ1NVTV9UTSwKKwlfX1RDQV9DU1VNX01BWAorfTsKKyNkZWZpbmUgVENBX0NTVU1fTUFYIChfX1RDQV9DU1VNX01BWCAtIDEpCisKK2VudW0geworCVRDQV9DU1VNX1VQREFURV9GTEFHX0lQVjRIRFIgPSAxLAorCVRDQV9DU1VNX1VQREFURV9GTEFHX0lDTVAgICAgPSAyLAorCVRDQV9DU1VNX1VQREFURV9GTEFHX0lHTVAgICAgPSA0LAorCVRDQV9DU1VNX1VQREFURV9GTEFHX1RDUCAgICAgPSA4LAorCVRDQV9DU1VNX1VQREFURV9GTEFHX1VEUCAgICAgPSAxNiwKKwlUQ0FfQ1NVTV9VUERBVEVfRkxBR19VRFBMSVRFID0gMzIKK307CisKK3N0cnVjdCB0Y19jc3VtIHsKKwl0Y19nZW47CisKKwlfX3UzMiB1cGRhdGVfZmxhZ3M7Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9UQ19DU1VNX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2dhY3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2dhY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2JmOTRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfZ2FjdC5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19HQUNUX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19HQUNUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfR0FDVCA1CitzdHJ1Y3QgdGNfZ2FjdCB7CisJdGNfZ2VuOworCit9OworCitzdHJ1Y3QgdGNfZ2FjdF9wIHsKKyNkZWZpbmUgUEdBQ1RfTk9ORSAgICAgICAgICAgICAgMAorI2RlZmluZSBQR0FDVF9ORVRSQU5EICAgICAgICAgICAxCisjZGVmaW5lIFBHQUNUX0RFVEVSTSAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFYX1JBTkQgICAgICAgICAgICAgICAgKFBHQUNUX0RFVEVSTSArIDEgKQorCV9fdTE2ICAgICAgICAgICAgICAgICBwdHlwZTsKKwlfX3UxNiAgICAgICAgICAgICAgICAgcHZhbDsKKwlpbnQgICAgICAgICAgICAgICAgICAgcGFjdGlvbjsKK307CisgCitlbnVtIHsKKwlUQ0FfR0FDVF9VTlNQRUMsCisJVENBX0dBQ1RfVE0sCisJVENBX0dBQ1RfUEFSTVMsCisJVENBX0dBQ1RfUFJPQiwKKwlfX1RDQV9HQUNUX01BWAorfTsKKyNkZWZpbmUgVENBX0dBQ1RfTUFYIChfX1RDQV9HQUNUX01BWCAtIDEpCisgCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2lwdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfaXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzMzU1NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2lwdC5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19JUFRfSAorI2RlZmluZSBfX0xJTlVYX1RDX0lQVF9ICisKKyNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CisKKyNkZWZpbmUgVENBX0FDVF9JUFQgNgorCitlbnVtIHsKKwlUQ0FfSVBUX1VOU1BFQywKKwlUQ0FfSVBUX1RBQkxFLAorCVRDQV9JUFRfSE9PSywKKwlUQ0FfSVBUX0lOREVYLAorCVRDQV9JUFRfQ05ULAorCVRDQV9JUFRfVE0sCisJVENBX0lQVF9UQVJHLAorCV9fVENBX0lQVF9NQVgKK307CisjZGVmaW5lIFRDQV9JUFRfTUFYIChfX1RDQV9JUFRfTUFYIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX21pcnJlZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfbWlycmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2MTc1MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX21pcnJlZC5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19NSVJfSAorI2RlZmluZSBfX0xJTlVYX1RDX01JUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX01JUlJFRCA4CisjZGVmaW5lIFRDQV9FR1JFU1NfUkVESVIgMSAgLyogcGFja2V0IHJlZGlyZWN0IHRvIEVHUkVTUyovCisjZGVmaW5lIFRDQV9FR1JFU1NfTUlSUk9SIDIgLyogbWlycm9yIHBhY2tldCB0byBFR1JFU1MgKi8KKyNkZWZpbmUgVENBX0lOR1JFU1NfUkVESVIgMyAgLyogcGFja2V0IHJlZGlyZWN0IHRvIElOR1JFU1MqLworI2RlZmluZSBUQ0FfSU5HUkVTU19NSVJST1IgNCAvKiBtaXJyb3IgcGFja2V0IHRvIElOR1JFU1MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitzdHJ1Y3QgdGNfbWlycmVkIHsKKwl0Y19nZW47CisJaW50ICAgICAgICAgICAgICAgICAgICAgZWFjdGlvbjsgICAvKiBvbmUgb2YgSU4vRUdSRVNTX01JUlJPUi9SRURJUiAqLworCV9fdTMyICAgICAgICAgICAgICAgICAgIGlmaW5kZXg7ICAvKiBpZmluZGV4IG9mIGVncmVzcyBwb3J0ICovCit9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK2VudW0geworCVRDQV9NSVJSRURfVU5TUEVDLAorCVRDQV9NSVJSRURfVE0sCisJVENBX01JUlJFRF9QQVJNUywKKwlfX1RDQV9NSVJSRURfTUFYCit9OworI2RlZmluZSBUQ0FfTUlSUkVEX01BWCAoX19UQ0FfTUlSUkVEX01BWCAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19uYXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX25hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NjNhZWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19uYXQuaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIF9fTElOVVhfVENfTkFUX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19OQVRfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgVENBX0FDVF9OQVQgOQorCitlbnVtIHsKKwlUQ0FfTkFUX1VOU1BFQywKKwlUQ0FfTkFUX1BBUk1TLAorCVRDQV9OQVRfVE0sCisJX19UQ0FfTkFUX01BWAorfTsKKyNkZWZpbmUgVENBX05BVF9NQVggKF9fVENBX05BVF9NQVggLSAxKQorCisjZGVmaW5lIFRDQV9OQVRfRkxBR19FR1JFU1MgMQorCitzdHJ1Y3QgdGNfbmF0IHsKKwl0Y19nZW47CisJX19iZTMyIG9sZF9hZGRyOworCV9fYmUzMiBuZXdfYWRkcjsKKwlfX2JlMzIgbWFzazsKKwlfX3UzMiBmbGFnczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfcGVkaXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX3BlZGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2Y2ZhYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX3BlZGl0LmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBfX0xJTlVYX1RDX1BFRF9ICisjZGVmaW5lIF9fTElOVVhfVENfUEVEX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfUEVESVQgNworCitlbnVtIHsKKwlUQ0FfUEVESVRfVU5TUEVDLAorCVRDQV9QRURJVF9UTSwKKwlUQ0FfUEVESVRfUEFSTVMsCisJX19UQ0FfUEVESVRfTUFYCit9OworI2RlZmluZSBUQ0FfUEVESVRfTUFYIChfX1RDQV9QRURJVF9NQVggLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0cnVjdCB0Y19wZWRpdF9rZXkgeworCV9fdTMyICAgICAgICAgICBtYXNrOyAgLyogQU5EICovCisJX191MzIgICAgICAgICAgIHZhbDsgICAvKlhPUiAqLworCV9fdTMyICAgICAgICAgICBvZmY7ICAvKm9mZnNldCAqLworCV9fdTMyICAgICAgICAgICBhdDsKKwlfX3UzMiAgICAgICAgICAgb2ZmbWFzazsKKwlfX3UzMiAgICAgICAgICAgc2hpZnQ7Cit9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0cnVjdCB0Y19wZWRpdF9zZWwgeworCXRjX2dlbjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBua2V5czsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBmbGFnczsKKwlzdHJ1Y3QgdGNfcGVkaXRfa2V5ICAgICBrZXlzWzBdOworfTsKKyNkZWZpbmUgdGNfcGVkaXQgdGNfcGVkaXRfc2VsCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfc2tiZWRpdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfc2tiZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMmU5MTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19za2JlZGl0LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIEF1dGhvcjogQWxleGFuZGVyIER1eWNrIDxhbGV4YW5kZXIuaC5kdXlja0BpbnRlbC5jb20+CisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1RDX1NLQkVESVRfSAorI2RlZmluZSBfX0xJTlVYX1RDX1NLQkVESVRfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfU0tCRURJVCAxMQorCisjZGVmaW5lIFNLQkVESVRfRl9QUklPUklUWQkJMHgxCisjZGVmaW5lIFNLQkVESVRfRl9RVUVVRV9NQVBQSU5HCQkweDIKKyNkZWZpbmUgU0tCRURJVF9GX01BUksJCQkweDQKKworc3RydWN0IHRjX3NrYmVkaXQgeworCXRjX2dlbjsKK307CisKK2VudW0geworCVRDQV9TS0JFRElUX1VOU1BFQywKKwlUQ0FfU0tCRURJVF9UTSwKKwlUQ0FfU0tCRURJVF9QQVJNUywKKwlUQ0FfU0tCRURJVF9QUklPUklUWSwKKwlUQ0FfU0tCRURJVF9RVUVVRV9NQVBQSU5HLAorCVRDQV9TS0JFRElUX01BUkssCisJX19UQ0FfU0tCRURJVF9NQVgKK307CisjZGVmaW5lIFRDQV9TS0JFRElUX01BWCAoX19UQ0FfU0tCRURJVF9NQVggLSAxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX2NtcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fY21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0YmIxYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX2NtcC5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19FTV9DTVBfSAorI2RlZmluZSBfX0xJTlVYX1RDX0VNX0NNUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworc3RydWN0IHRjZl9lbV9jbXAgeworCV9fdTMyCQl2YWw7CisJX191MzIJCW1hc2s7CisJX191MTYJCW9mZjsKKwlfX3U4CQlhbGlnbjo0OworCV9fdTgJCWZsYWdzOjQ7CisJX191OAkJbGF5ZXI6NDsKKwlfX3U4CQlvcG5kOjQ7Cit9OworCitlbnVtIHsKKwlUQ0ZfRU1fQUxJR05fVTggID0gMSwKKwlUQ0ZfRU1fQUxJR05fVTE2ID0gMiwKKwlUQ0ZfRU1fQUxJR05fVTMyID0gNAorfTsKKworI2RlZmluZSBUQ0ZfRU1fQ01QX1RSQU5TCTEKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9tZXRhLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9tZXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExZjhjZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX21ldGEuaApAQCAtMCwwICsxLDkyIEBACisjaWZuZGVmIF9fTElOVVhfVENfRU1fTUVUQV9ICisjZGVmaW5lIF9fTElOVVhfVENfRU1fTUVUQV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworZW51bSB7CisJVENBX0VNX01FVEFfVU5TUEVDLAorCVRDQV9FTV9NRVRBX0hEUiwKKwlUQ0FfRU1fTUVUQV9MVkFMVUUsCisJVENBX0VNX01FVEFfUlZBTFVFLAorCV9fVENBX0VNX01FVEFfTUFYCit9OworI2RlZmluZSBUQ0FfRU1fTUVUQV9NQVggKF9fVENBX0VNX01FVEFfTUFYIC0gMSkKKworc3RydWN0IHRjZl9tZXRhX3ZhbCB7CisJX191MTYJCQlraW5kOworCV9fdTgJCQlzaGlmdDsKKwlfX3U4CQkJb3A7Cit9OworCisjZGVmaW5lIFRDRl9NRVRBX1RZUEVfTUFTSwkoMHhmIDw8IDEyKQorI2RlZmluZSBUQ0ZfTUVUQV9UWVBFKGtpbmQpCSgoKGtpbmQpICYgVENGX01FVEFfVFlQRV9NQVNLKSA+PiAxMikKKyNkZWZpbmUgVENGX01FVEFfSURfTUFTSwkweDdmZgorI2RlZmluZSBUQ0ZfTUVUQV9JRChraW5kKQkoKGtpbmQpICYgVENGX01FVEFfSURfTUFTSykKKworZW51bSB7CisJVENGX01FVEFfVFlQRV9WQVIsCisJVENGX01FVEFfVFlQRV9JTlQsCisJX19UQ0ZfTUVUQV9UWVBFX01BWAorfTsKKyNkZWZpbmUgVENGX01FVEFfVFlQRV9NQVggKF9fVENGX01FVEFfVFlQRV9NQVggLSAxKQorCitlbnVtIHsKKwlUQ0ZfTUVUQV9JRF9WQUxVRSwKKwlUQ0ZfTUVUQV9JRF9SQU5ET00sCisJVENGX01FVEFfSURfTE9BREFWR18wLAorCVRDRl9NRVRBX0lEX0xPQURBVkdfMSwKKwlUQ0ZfTUVUQV9JRF9MT0FEQVZHXzIsCisJVENGX01FVEFfSURfREVWLAorCVRDRl9NRVRBX0lEX1BSSU9SSVRZLAorCVRDRl9NRVRBX0lEX1BST1RPQ09MLAorCVRDRl9NRVRBX0lEX1BLVFRZUEUsCisJVENGX01FVEFfSURfUEtUTEVOLAorCVRDRl9NRVRBX0lEX0RBVEFMRU4sCisJVENGX01FVEFfSURfTUFDTEVOLAorCVRDRl9NRVRBX0lEX05GTUFSSywKKwlUQ0ZfTUVUQV9JRF9UQ0lOREVYLAorCVRDRl9NRVRBX0lEX1JUQ0xBU1NJRCwKKwlUQ0ZfTUVUQV9JRF9SVElJRiwKKwlUQ0ZfTUVUQV9JRF9TS19GQU1JTFksCisJVENGX01FVEFfSURfU0tfU1RBVEUsCisJVENGX01FVEFfSURfU0tfUkVVU0UsCisJVENGX01FVEFfSURfU0tfQk9VTkRfSUYsCisJVENGX01FVEFfSURfU0tfUkVGQ05ULAorCVRDRl9NRVRBX0lEX1NLX1NIVVRET1dOLAorCVRDRl9NRVRBX0lEX1NLX1BST1RPLAorCVRDRl9NRVRBX0lEX1NLX1RZUEUsCisJVENGX01FVEFfSURfU0tfUkNWQlVGLAorCVRDRl9NRVRBX0lEX1NLX1JNRU1fQUxMT0MsCisJVENGX01FVEFfSURfU0tfV01FTV9BTExPQywKKwlUQ0ZfTUVUQV9JRF9TS19PTUVNX0FMTE9DLAorCVRDRl9NRVRBX0lEX1NLX1dNRU1fUVVFVUVELAorCVRDRl9NRVRBX0lEX1NLX1JDVl9RTEVOLAorCVRDRl9NRVRBX0lEX1NLX1NORF9RTEVOLAorIAlUQ0ZfTUVUQV9JRF9TS19FUlJfUUxFTiwKKwlUQ0ZfTUVUQV9JRF9TS19GT1JXQVJEX0FMTE9DUywKKwlUQ0ZfTUVUQV9JRF9TS19TTkRCVUYsCisgCVRDRl9NRVRBX0lEX1NLX0FMTE9DUywKKwlfX1RDRl9NRVRBX0lEX1NLX1JPVVRFX0NBUFMsCS8qIHVuaW1wbGVtZW50ZWQgYnV0IGluIEFCSSBhbHJlYWR5ICovCisgCVRDRl9NRVRBX0lEX1NLX0hBU0gsCisgCVRDRl9NRVRBX0lEX1NLX0xJTkdFUlRJTUUsCisgCVRDRl9NRVRBX0lEX1NLX0FDS19CQUNLTE9HLAorIAlUQ0ZfTUVUQV9JRF9TS19NQVhfQUNLX0JBQ0tMT0csCisgCVRDRl9NRVRBX0lEX1NLX1BSSU8sCisgCVRDRl9NRVRBX0lEX1NLX1JDVkxPV0FULAorIAlUQ0ZfTUVUQV9JRF9TS19SQ1ZUSU1FTywKKyAJVENGX01FVEFfSURfU0tfU05EVElNRU8sCisgCVRDRl9NRVRBX0lEX1NLX1NFTkRNU0dfT0ZGLAorIAlUQ0ZfTUVUQV9JRF9TS19XUklURV9QRU5ESU5HLAorCVRDRl9NRVRBX0lEX1ZMQU5fVEFHLAorCVRDRl9NRVRBX0lEX1JYSEFTSCwKKwlfX1RDRl9NRVRBX0lEX01BWAorfTsKKyNkZWZpbmUgVENGX01FVEFfSURfTUFYIChfX1RDRl9NRVRBX0lEX01BWCAtIDEpCisKK3N0cnVjdCB0Y2ZfbWV0YV9oZHIgeworCXN0cnVjdCB0Y2ZfbWV0YV92YWwJbGVmdDsKKwlzdHJ1Y3QgdGNmX21ldGFfdmFsCXJpZ2h0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9uYnl0ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fbmJ5dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTcyY2ZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fbmJ5dGUuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9fTElOVVhfVENfRU1fTkJZVEVfSAorI2RlZmluZSBfX0xJTlVYX1RDX0VNX05CWVRFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCitzdHJ1Y3QgdGNmX2VtX25ieXRlIHsKKwlfX3UxNgkJb2ZmOworCV9fdTE2CQlsZW46MTI7CisJX191OAkJbGF5ZXI6NDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fdGV4dC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fdGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYWM0MDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV90ZXh0LmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfX0xJTlVYX1RDX0VNX1RFWFRfSAorI2RlZmluZSBfX0xJTlVYX1RDX0VNX1RFWFRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CisKKyNkZWZpbmUgVENfRU1fVEVYVF9BTEdPU0laCTE2CisKK3N0cnVjdCB0Y2ZfZW1fdGV4dCB7CisJY2hhcgkJYWxnb1tUQ19FTV9URVhUX0FMR09TSVpdOworCV9fdTE2CQlmcm9tX29mZnNldDsKKwlfX3UxNgkJdG9fb2Zmc2V0OworCV9fdTE2CQlwYXR0ZXJuX2xlbjsKKwlfX3U4CQlmcm9tX2xheWVyOjQ7CisJX191OAkJdG9fbGF5ZXI6NDsKKwlfX3U4CQlwYWQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MmYxNzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjcC5oCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCURlZmluaXRpb25zIGZvciB0aGUgVENQIHByb3RvY29sLgorICoKKyAqIFZlcnNpb246CUAoIyl0Y3AuaAkxLjAuMgkwNC8yOC85MworICoKKyAqIEF1dGhvcjoJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX1RDUF9ICisjZGVmaW5lIF9MSU5VWF9UQ1BfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisKK3N0cnVjdCB0Y3BoZHIgeworCV9fYmUxNglzb3VyY2U7CisJX19iZTE2CWRlc3Q7CisJX19iZTMyCXNlcTsKKwlfX2JlMzIJYWNrX3NlcTsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3UxNglyZXMxOjQsCisJCWRvZmY6NCwKKwkJZmluOjEsCisJCXN5bjoxLAorCQlyc3Q6MSwKKwkJcHNoOjEsCisJCWFjazoxLAorCQl1cmc6MSwKKwkJZWNlOjEsCisJCWN3cjoxOworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191MTYJZG9mZjo0LAorCQlyZXMxOjQsCisJCWN3cjoxLAorCQllY2U6MSwKKwkJdXJnOjEsCisJCWFjazoxLAorCQlwc2g6MSwKKwkJcnN0OjEsCisJCXN5bjoxLAorCQlmaW46MTsKKyNlbHNlCisjZXJyb3IJIkFkanVzdCB5b3VyIDxhc20vYnl0ZW9yZGVyLmg+IGRlZmluZXMiCisjZW5kaWYJCisJX19iZTE2CXdpbmRvdzsKKwlfX3N1bTE2CWNoZWNrOworCV9fYmUxNgl1cmdfcHRyOworfTsKKworLyoKKyAqCVRoZSB1bmlvbiBjYXN0IHVzZXMgYSBnY2MgZXh0ZW5zaW9uIHRvIGF2b2lkIGFsaWFzaW5nIHByb2JsZW1zCisgKiAgKHVuaW9uIGlzIGNvbXBhdGlibGUgdG8gYW55IG9mIGl0cyBtZW1iZXJzKQorICogIFRoaXMgbWVhbnMgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIGlzIC1mc3RyaWN0LWFsaWFzaW5nIHNhZmUgbm93LgorICovCit1bmlvbiB0Y3Bfd29yZF9oZHIgeyAKKwlzdHJ1Y3QgdGNwaGRyIGhkcjsKKwlfX2JlMzIgCQkgIHdvcmRzWzVdOworfTsgCisKKyNkZWZpbmUgdGNwX2ZsYWdfd29yZCh0cCkgKCAoKHVuaW9uIHRjcF93b3JkX2hkciAqKSh0cCkpLT53b3JkcyBbM10pIAorCitlbnVtIHsgCisJVENQX0ZMQUdfQ1dSID0gX19jcHVfdG9fYmUzMigweDAwODAwMDAwKSwKKwlUQ1BfRkxBR19FQ0UgPSBfX2NwdV90b19iZTMyKDB4MDA0MDAwMDApLAorCVRDUF9GTEFHX1VSRyA9IF9fY3B1X3RvX2JlMzIoMHgwMDIwMDAwMCksCisJVENQX0ZMQUdfQUNLID0gX19jcHVfdG9fYmUzMigweDAwMTAwMDAwKSwKKwlUQ1BfRkxBR19QU0ggPSBfX2NwdV90b19iZTMyKDB4MDAwODAwMDApLAorCVRDUF9GTEFHX1JTVCA9IF9fY3B1X3RvX2JlMzIoMHgwMDA0MDAwMCksCisJVENQX0ZMQUdfU1lOID0gX19jcHVfdG9fYmUzMigweDAwMDIwMDAwKSwKKwlUQ1BfRkxBR19GSU4gPSBfX2NwdV90b19iZTMyKDB4MDAwMTAwMDApLAorCVRDUF9SRVNFUlZFRF9CSVRTID0gX19jcHVfdG9fYmUzMigweDBGMDAwMDAwKSwKKwlUQ1BfREFUQV9PRkZTRVQgPSBfX2NwdV90b19iZTMyKDB4RjAwMDAwMDApCit9OyAKKworLyoKKyAqIFRDUCBnZW5lcmFsIGNvbnN0YW50cworICovCisjZGVmaW5lIFRDUF9NU1NfREVGQVVMVAkJIDUzNlUJLyogSVB2NCAoUkZDMTEyMiwgUkZDMjU4MSkgKi8KKyNkZWZpbmUgVENQX01TU19ERVNJUkVECQkxMjIwVQkvKiBJUHY2ICh0dW5uZWxlZCksIEVETlMwIChSRkMzMjI2KSAqLworCisvKiBUQ1Agc29ja2V0IG9wdGlvbnMgKi8KKyNkZWZpbmUgVENQX05PREVMQVkJCTEJLyogVHVybiBvZmYgTmFnbGUncyBhbGdvcml0aG0uICovCisjZGVmaW5lIFRDUF9NQVhTRUcJCTIJLyogTGltaXQgTVNTICovCisjZGVmaW5lIFRDUF9DT1JLCQkzCS8qIE5ldmVyIHNlbmQgcGFydGlhbGx5IGNvbXBsZXRlIHNlZ21lbnRzICovCisjZGVmaW5lIFRDUF9LRUVQSURMRQkJNAkvKiBTdGFydCBrZWVwbGl2ZXMgYWZ0ZXIgdGhpcyBwZXJpb2QgKi8KKyNkZWZpbmUgVENQX0tFRVBJTlRWTAkJNQkvKiBJbnRlcnZhbCBiZXR3ZWVuIGtlZXBhbGl2ZXMgKi8KKyNkZWZpbmUgVENQX0tFRVBDTlQJCTYJLyogTnVtYmVyIG9mIGtlZXBhbGl2ZXMgYmVmb3JlIGRlYXRoICovCisjZGVmaW5lIFRDUF9TWU5DTlQJCTcJLyogTnVtYmVyIG9mIFNZTiByZXRyYW5zbWl0cyAqLworI2RlZmluZSBUQ1BfTElOR0VSMgkJOAkvKiBMaWZlIHRpbWUgb2Ygb3JwaGFuZWQgRklOLVdBSVQtMiBzdGF0ZSAqLworI2RlZmluZSBUQ1BfREVGRVJfQUNDRVBUCTkJLyogV2FrZSB1cCBsaXN0ZW5lciBvbmx5IHdoZW4gZGF0YSBhcnJpdmUgKi8KKyNkZWZpbmUgVENQX1dJTkRPV19DTEFNUAkxMAkvKiBCb3VuZCBhZHZlcnRpc2VkIHdpbmRvdyAqLworI2RlZmluZSBUQ1BfSU5GTwkJMTEJLyogSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb25uZWN0aW9uLiAqLworI2RlZmluZSBUQ1BfUVVJQ0tBQ0sJCTEyCS8qIEJsb2NrL3JlZW5hYmxlIHF1aWNrIGFja3MgKi8KKyNkZWZpbmUgVENQX0NPTkdFU1RJT04JCTEzCS8qIENvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG0gKi8KKyNkZWZpbmUgVENQX01ENVNJRwkJMTQJLyogVENQIE1ENSBTaWduYXR1cmUgKFJGQzIzODUpICovCisjZGVmaW5lIFRDUF9DT09LSUVfVFJBTlNBQ1RJT05TCTE1CS8qIFRDUCBDb29raWUgVHJhbnNhY3Rpb25zICovCisjZGVmaW5lIFRDUF9USElOX0xJTkVBUl9USU1FT1VUUyAxNiAgICAgIC8qIFVzZSBsaW5lYXIgdGltZW91dHMgZm9yIHRoaW4gc3RyZWFtcyovCisjZGVmaW5lIFRDUF9USElOX0RVUEFDSyAgICAgICAgIDE3ICAgICAgLyogRmFzdCByZXRyYW5zLiBhZnRlciAxIGR1cGFjayAqLworI2RlZmluZSBUQ1BfVVNFUl9USU1FT1VUCTE4CS8qIEhvdyBsb25nIGZvciBsb3NzIHJldHJ5IGJlZm9yZSB0aW1lb3V0ICovCisKKy8qIGZvciBUQ1BfSU5GTyBzb2NrZXQgb3B0aW9uICovCisjZGVmaW5lIFRDUElfT1BUX1RJTUVTVEFNUFMJMQorI2RlZmluZSBUQ1BJX09QVF9TQUNLCQkyCisjZGVmaW5lIFRDUElfT1BUX1dTQ0FMRQkJNAorI2RlZmluZSBUQ1BJX09QVF9FQ04JCTggLyogRUNOIHdhcyBuZWdvY2lhdGVkIGF0IFRDUCBzZXNzaW9uIGluaXQgKi8KKyNkZWZpbmUgVENQSV9PUFRfRUNOX1NFRU4JMTYgLyogd2UgcmVjZWl2ZWQgYXQgbGVhc3Qgb25lIHBhY2tldCB3aXRoIEVDVCAqLworCitlbnVtIHRjcF9jYV9zdGF0ZSB7CisJVENQX0NBX09wZW4gPSAwLAorI2RlZmluZSBUQ1BGX0NBX09wZW4JKDE8PFRDUF9DQV9PcGVuKQorCVRDUF9DQV9EaXNvcmRlciA9IDEsCisjZGVmaW5lIFRDUEZfQ0FfRGlzb3JkZXIgKDE8PFRDUF9DQV9EaXNvcmRlcikKKwlUQ1BfQ0FfQ1dSID0gMiwKKyNkZWZpbmUgVENQRl9DQV9DV1IJKDE8PFRDUF9DQV9DV1IpCisJVENQX0NBX1JlY292ZXJ5ID0gMywKKyNkZWZpbmUgVENQRl9DQV9SZWNvdmVyeSAoMTw8VENQX0NBX1JlY292ZXJ5KQorCVRDUF9DQV9Mb3NzID0gNAorI2RlZmluZSBUQ1BGX0NBX0xvc3MJKDE8PFRDUF9DQV9Mb3NzKQorfTsKKworc3RydWN0IHRjcF9pbmZvIHsKKwlfX3U4CXRjcGlfc3RhdGU7CisJX191OAl0Y3BpX2NhX3N0YXRlOworCV9fdTgJdGNwaV9yZXRyYW5zbWl0czsKKwlfX3U4CXRjcGlfcHJvYmVzOworCV9fdTgJdGNwaV9iYWNrb2ZmOworCV9fdTgJdGNwaV9vcHRpb25zOworCV9fdTgJdGNwaV9zbmRfd3NjYWxlIDogNCwgdGNwaV9yY3Zfd3NjYWxlIDogNDsKKworCV9fdTMyCXRjcGlfcnRvOworCV9fdTMyCXRjcGlfYXRvOworCV9fdTMyCXRjcGlfc25kX21zczsKKwlfX3UzMgl0Y3BpX3Jjdl9tc3M7CisKKwlfX3UzMgl0Y3BpX3VuYWNrZWQ7CisJX191MzIJdGNwaV9zYWNrZWQ7CisJX191MzIJdGNwaV9sb3N0OworCV9fdTMyCXRjcGlfcmV0cmFuczsKKwlfX3UzMgl0Y3BpX2ZhY2tldHM7CisKKwkvKiBUaW1lcy4gKi8KKwlfX3UzMgl0Y3BpX2xhc3RfZGF0YV9zZW50OworCV9fdTMyCXRjcGlfbGFzdF9hY2tfc2VudDsgICAgIC8qIE5vdCByZW1lbWJlcmVkLCBzb3JyeS4gKi8KKwlfX3UzMgl0Y3BpX2xhc3RfZGF0YV9yZWN2OworCV9fdTMyCXRjcGlfbGFzdF9hY2tfcmVjdjsKKworCS8qIE1ldHJpY3MuICovCisJX191MzIJdGNwaV9wbXR1OworCV9fdTMyCXRjcGlfcmN2X3NzdGhyZXNoOworCV9fdTMyCXRjcGlfcnR0OworCV9fdTMyCXRjcGlfcnR0dmFyOworCV9fdTMyCXRjcGlfc25kX3NzdGhyZXNoOworCV9fdTMyCXRjcGlfc25kX2N3bmQ7CisJX191MzIJdGNwaV9hZHZtc3M7CisJX191MzIJdGNwaV9yZW9yZGVyaW5nOworCisJX191MzIJdGNwaV9yY3ZfcnR0OworCV9fdTMyCXRjcGlfcmN2X3NwYWNlOworCisJX191MzIJdGNwaV90b3RhbF9yZXRyYW5zOworfTsKKworLyogZm9yIFRDUF9NRDVTSUcgc29ja2V0IG9wdGlvbiAqLworI2RlZmluZSBUQ1BfTUQ1U0lHX01BWEtFWUxFTgk4MAorCitzdHJ1Y3QgdGNwX21kNXNpZyB7CisJc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UgdGNwbV9hZGRyOwkvKiBhZGRyZXNzIGFzc29jaWF0ZWQgKi8KKwlfX3UxNglfX3RjcG1fcGFkMTsJCQkJLyogemVybyAqLworCV9fdTE2CXRjcG1fa2V5bGVuOwkJCQkvKiBrZXkgbGVuZ3RoICovCisJX191MzIJX190Y3BtX3BhZDI7CQkJCS8qIHplcm8gKi8KKwlfX3U4CXRjcG1fa2V5W1RDUF9NRDVTSUdfTUFYS0VZTEVOXTsJCS8qIGtleSAoYmluYXJ5KSAqLworfTsKKworLyogZm9yIFRDUF9DT09LSUVfVFJBTlNBQ1RJT05TIChUQ1BDVCkgc29ja2V0IG9wdGlvbiAqLworI2RlZmluZSBUQ1BfQ09PS0lFX01JTgkJIDgJCS8qICA2NC1iaXRzICovCisjZGVmaW5lIFRDUF9DT09LSUVfTUFYCQkxNgkJLyogMTI4LWJpdHMgKi8KKyNkZWZpbmUgVENQX0NPT0tJRV9QQUlSX1NJWkUJKDIqVENQX0NPT0tJRV9NQVgpCisKKy8qIEZsYWdzIGZvciBib3RoIGdldHNvY2tvcHQgYW5kIHNldHNvY2tvcHQgKi8KKyNkZWZpbmUgVENQX0NPT0tJRV9JTl9BTFdBWVMJKDEgPDwgMCkJLyogRGlzY2FyZCBTWU4gd2l0aG91dCBjb29raWUgKi8KKyNkZWZpbmUgVENQX0NPT0tJRV9PVVRfTkVWRVIJKDEgPDwgMSkJLyogUHJvaGliaXQgb3V0Z29pbmcgY29va2llcywKKwkJCQkJCSAqIHN1cGVyY2VkZXMgZXZlcnl0aGluZy4gKi8KKworLyogRmxhZ3MgZm9yIGdldHNvY2tvcHQgKi8KKyNkZWZpbmUgVENQX1NfREFUQV9JTgkJKDEgPDwgMikJLyogV2FzIGRhdGEgcmVjZWl2ZWQ/ICovCisjZGVmaW5lIFRDUF9TX0RBVEFfT1VUCQkoMSA8PCAzKQkvKiBXYXMgZGF0YSBzZW50PyAqLworCisvKiBUQ1BfQ09PS0lFX1RSQU5TQUNUSU9OUyBkYXRhICovCitzdHJ1Y3QgdGNwX2Nvb2tpZV90cmFuc2FjdGlvbnMgeworCV9fdTE2CXRjcGN0X2ZsYWdzOwkJCS8qIHNlZSBhYm92ZSAqLworCV9fdTgJX190Y3BjdF9wYWQxOwkJCS8qIHplcm8gKi8KKwlfX3U4CXRjcGN0X2Nvb2tpZV9kZXNpcmVkOwkJLyogYnl0ZXMgKi8KKwlfX3UxNgl0Y3BjdF9zX2RhdGFfZGVzaXJlZDsJCS8qIGJ5dGVzIG9mIHZhcmlhYmxlIGRhdGEgKi8KKwlfX3UxNgl0Y3BjdF91c2VkOwkJCS8qIGJ5dGVzIGluIHZhbHVlICovCisJX191OAl0Y3BjdF92YWx1ZVtUQ1BfTVNTX0RFRkFVTFRdOworfTsKKworCisjZW5kaWYJLyogX0xJTlVYX1RDUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RlbGVwaG9ueS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90ZWxlcGhvbnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjNhZmUzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90ZWxlcGhvbnkuaApAQCAtMCwwICsxLDI2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCQl0ZWxlcGhvbnkuaAorICoKKyAqCQlCYXNpYyBMaW51eCBUZWxlcGhvbnkgSW50ZXJmYWNlCisgKgorICoJCShjKSBDb3B5cmlnaHQgMTk5OS0yMDAxIFF1aWNrbmV0IFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIEF1dGhvcnM6ICAgICAgIEVkIE9rZXJzb24sIDxlb2tlcnNvbkBxdWlja25ldC5uZXQ+CisgKiAgICAgICAgICAgICAgICAgICBHcmVnIEhlcmxlaW4sIDxnaGVybGVpbkBxdWlja25ldC5uZXQ+CisgKgorICogICAgQ29udHJpYnV0b3JzOiAgQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CisgKiAgICAgICAgICAgICAgICAgICBEYXZpZCBXLiBFcmhhcnQsIDxkZXJoYXJ0QHF1aWNrbmV0Lm5ldD4KKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBRVUlDS05FVCBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFIFRPIEFOWSBQQVJUWSBGT1IKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTiwgRVZFTiBJRiBRVUlDS05FVAorICogVEVDSE5PTE9HSUVTLCBJTkMuIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFFVSUNLTkVUIFRFQ0hOT0xPR0lFUywgSU5DLiBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgU09GVFdBUkUgUFJPVklERUQgSEVSRVVOREVSIElTCisgKiBPTiBBTiAiQVMgSVMiIEJBU0lTLCBBTkQgUVVJQ0tORVQgVEVDSE5PTE9HSUVTLCBJTkMuIEhBUyBOTyBPQkxJR0FUSU9OCisgKiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLCBTVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsIE9SIE1PRElGSUNBVElPTlMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRFTEVQSE9OWV9ICisjZGVmaW5lIFRFTEVQSE9OWV9ICisKKyNkZWZpbmUgVEVMRVBIT05ZX1ZFUlNJT04gMzAxMworCisjZGVmaW5lIFBIT05FX1ZFTkRPUl9JWEogICAgICAgICAgMQorI2RlZmluZSBQSE9ORV9WRU5ET1JfUVVJQ0tORVQJICBQSE9ORV9WRU5ET1JfSVhKCisjZGVmaW5lIFBIT05FX1ZFTkRPUl9WT0lDRVRST05JWCAgMgorI2RlZmluZSBQSE9ORV9WRU5ET1JfQUNVTEFCICAgICAgIDMKKyNkZWZpbmUgUEhPTkVfVkVORE9SX0RJR0kgICAgICAgICA0CisjZGVmaW5lIFBIT05FX1ZFTkRPUl9GUkFOS0xJTiAgICAgNQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgVmVuZG9yIFN1bW1hcnkgSW5mb3JtYXRpb24gQXJlYQorICoKKyAqICBRdWlja25ldCBUZWNobm9sb2dpZXMsIEluYy4gLSBtYWtlcyBsb3cgZGVuc2l0eSBhbmFsb2cgdGVsZXBob255IGNhcmRzCisgKiAgICB3aXRoIGF1ZGlvIGNvbXByZXNzaW9uLCBQT1RTIGFuZCBQU1ROIGludGVyZmFjZXMgKHd3dy5xdWlja25ldC5uZXQpCisgKgorICogIChvdGhlciB2ZW5kb3JzIGZvbGxvd2luZyB0aGlzIEFQSSBzaHVsZCBhZGQgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZgorICogIHRoZSB0ZWxlcGhvbnkgcHJvZHVjdHMgdGhleSBzdXBwb3J0IHVuZGVyIExpbnV4KQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUVRJX1BIT05FSkFDSwkJMTAwCisjZGVmaW5lIFFUSV9MSU5FSkFDSwkJMzAwCisjZGVmaW5lIFFUSV9QSE9ORUpBQ0tfTElURQk0MDAKKyNkZWZpbmUgUVRJX1BIT05FSkFDS19QQ0kJNTAwCisjZGVmaW5lIFFUSV9QSE9ORUNBUkQJCTYwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoZSBjYXBhYmlsaXRpZXMgaW9jdGxzIGNhbiBpbmZvcm0geW91IG9mIHRoZSBjYXBhYmlsaXRpZXMgb2YgZWFjaCBwaG9uZQorKiBkZXZpY2UgaW5zdGFsbGVkIGluIHlvdXIgc3lzdGVtLiAgVGhlIFBIT05FQ1RMX0NBUEFCSUxJVElFUyBpb2N0bAorKiByZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGNhcGFiaWxpdGllcyB0aGUgICAKKyogZGV2aWNlIGhhcy4gIFRoZSBQSE9ORUNUTF9DQVBBQklMSVRJRVNfTElTVCB3aWxsIGZpbGwgYW4gYXJyYXkgb2YgCisqIGNhcGFiaWxpdHkgc3RydWN0cyB3aXRoIGFsbCBvZiBpdHMgY2FwYWJpbGl0aWVzLiAgVGhlCisqIFBIT05FQ1RMX0NBUEFCSUxJVElFU19DSEVDSyB0YWtlcyBhIHNpbmdsZSBjYXBhYmlsaXR5IHN0cnVjdCBhbmQgcmV0dXJucworKiBhIFRSVUUgaWYgdGhlIGRldmljZSBoYXMgdGhhdCBjYXBhYmlsaXR5LCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCXZlbmRvciA9IDAsCisJZGV2aWNlLAorCXBvcnQsCisJY29kZWMsCisJZHNwCit9IHBob25lX2NhcDsKKworc3RydWN0IHBob25lX2NhcGFiaWxpdHkgeworCWNoYXIgZGVzY1s4MF07CisJcGhvbmVfY2FwIGNhcHR5cGU7CisJaW50IGNhcDsKKwlpbnQgaGFuZGxlOworfTsKKwordHlwZWRlZiBlbnVtIHsKKwlwb3RzID0gMCwKKwlwc3RuLAorCWhhbmRzZXQsCisJc3BlYWtlcgorfSBwaG9uZV9wb3J0czsKKworI2RlZmluZSBQSE9ORV9DQVBBQklMSVRJRVMgICAgICAgICAgICAgIF9JTyAgKCdxJywgMHg4MCkKKyNkZWZpbmUgUEhPTkVfQ0FQQUJJTElUSUVTX0xJU1QgICAgICAgICBfSU9SICgncScsIDB4ODEsIHN0cnVjdCBwaG9uZV9jYXBhYmlsaXR5ICopCisjZGVmaW5lIFBIT05FX0NBUEFCSUxJVElFU19DSEVDSyAgICAgICAgX0lPVyAoJ3EnLCAweDgyLCBzdHJ1Y3QgcGhvbmVfY2FwYWJpbGl0eSAqKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGNoYXIgbW9udGhbM107CisgICAgICAgIGNoYXIgZGF5WzNdOworICAgICAgICBjaGFyIGhvdXJbM107CisgICAgICAgIGNoYXIgbWluWzNdOworICAgICAgICBpbnQgbnVtbGVuOworICAgICAgICBjaGFyIG51bWJlclsxMV07CisgICAgICAgIGludCBuYW1lbGVuOworICAgICAgICBjaGFyIG5hbWVbODBdOworfSBQSE9ORV9DSUQ7CisgCisjZGVmaW5lIFBIT05FX1JJTkcJCQlfSU8gICgncScsIDB4ODMpCisjZGVmaW5lIFBIT05FX0hPT0tTVEFURQkJCV9JTyAgKCdxJywgMHg4NCkKKyNkZWZpbmUgUEhPTkVfTUFYUklOR1MJCQlfSU9XICgncScsIDB4ODUsIGNoYXIpCisjZGVmaW5lIFBIT05FX1JJTkdfQ0FERU5DRQkJX0lPVyAoJ3EnLCAweDg2LCBzaG9ydCkKKyNkZWZpbmUgT0xEX1BIT05FX1JJTkdfU1RBUlQgICAgICAgICAgICBfSU8gICgncScsIDB4ODcpCisjZGVmaW5lIFBIT05FX1JJTkdfU1RBUlQJCV9JT1cgKCdxJywgMHg4NywgUEhPTkVfQ0lEICopCisjZGVmaW5lIFBIT05FX1JJTkdfU1RPUAkJCV9JTyAgKCdxJywgMHg4OCkKKworI2RlZmluZSBVU0FfUklOR19DQURFTkNFCSAweEMwQzAKKworI2RlZmluZSBQSE9ORV9SRUNfQ09ERUMJCQlfSU9XICgncScsIDB4ODksIGludCkKKyNkZWZpbmUgUEhPTkVfUkVDX1NUQVJUCQkJX0lPICAoJ3EnLCAweDhBKQorI2RlZmluZSBQSE9ORV9SRUNfU1RPUAkJCV9JTyAgKCdxJywgMHg4QikKKyNkZWZpbmUgUEhPTkVfUkVDX0RFUFRICQkJX0lPVyAoJ3EnLCAweDhDLCBpbnQpCisjZGVmaW5lIFBIT05FX0ZSQU1FCQkJX0lPVyAoJ3EnLCAweDhELCBpbnQpCisjZGVmaW5lIFBIT05FX1JFQ19WT0xVTUUJCV9JT1cgKCdxJywgMHg4RSwgaW50KQorI2RlZmluZSBQSE9ORV9SRUNfVk9MVU1FX0xJTkVBUgkJX0lPVyAoJ3EnLCAweERCLCBpbnQpCisjZGVmaW5lIFBIT05FX1JFQ19MRVZFTAkJCV9JTyAgKCdxJywgMHg4RikKKworI2RlZmluZSBQSE9ORV9QTEFZX0NPREVDCQlfSU9XICgncScsIDB4OTAsIGludCkKKyNkZWZpbmUgUEhPTkVfUExBWV9TVEFSVAkJX0lPICAoJ3EnLCAweDkxKQorI2RlZmluZSBQSE9ORV9QTEFZX1NUT1AJCQlfSU8gICgncScsIDB4OTIpCisjZGVmaW5lIFBIT05FX1BMQVlfREVQVEgJCV9JT1cgKCdxJywgMHg5MywgaW50KQorI2RlZmluZSBQSE9ORV9QTEFZX1ZPTFVNRQkJX0lPVyAoJ3EnLCAweDk0LCBpbnQpCisjZGVmaW5lIFBIT05FX1BMQVlfVk9MVU1FX0xJTkVBUglfSU9XICgncScsIDB4REMsIGludCkKKyNkZWZpbmUgUEhPTkVfUExBWV9MRVZFTAkJX0lPICAoJ3EnLCAweDk1KQorI2RlZmluZSBQSE9ORV9EVE1GX1JFQURZCQlfSU9SICgncScsIDB4OTYsIGludCkKKyNkZWZpbmUgUEhPTkVfR0VUX0RUTUYJCQlfSU9SICgncScsIDB4OTcsIGludCkKKyNkZWZpbmUgUEhPTkVfR0VUX0RUTUZfQVNDSUkJCV9JT1IgKCdxJywgMHg5OCwgaW50KQorI2RlZmluZSBQSE9ORV9EVE1GX09PQgkJCV9JT1cgKCdxJywgMHg5OSwgaW50KQorI2RlZmluZSBQSE9ORV9FWENFUFRJT04JCQlfSU9SICgncScsIDB4OUEsIGludCkKKyNkZWZpbmUgUEhPTkVfUExBWV9UT05FCQkJX0lPVyAoJ3EnLCAweDlCLCBjaGFyKQorI2RlZmluZSBQSE9ORV9TRVRfVE9ORV9PTl9USU1FCQlfSU9XICgncScsIDB4OUMsIGludCkKKyNkZWZpbmUgUEhPTkVfU0VUX1RPTkVfT0ZGX1RJTUUJCV9JT1cgKCdxJywgMHg5RCwgaW50KQorI2RlZmluZSBQSE9ORV9HRVRfVE9ORV9PTl9USU1FCQlfSU8gICgncScsIDB4OUUpCisjZGVmaW5lIFBIT05FX0dFVF9UT05FX09GRl9USU1FCQlfSU8gICgncScsIDB4OUYpCisjZGVmaW5lIFBIT05FX0dFVF9UT05FX1NUQVRFCQlfSU8gICgncScsIDB4QTApCisjZGVmaW5lIFBIT05FX0JVU1kJCQlfSU8gICgncScsIDB4QTEpCisjZGVmaW5lIFBIT05FX1JJTkdCQUNLCQkJX0lPICAoJ3EnLCAweEEyKQorI2RlZmluZSBQSE9ORV9ESUFMVE9ORQkJCV9JTyAgKCdxJywgMHhBMykKKyNkZWZpbmUgUEhPTkVfQ1BUX1NUT1AJCQlfSU8gICgncScsIDB4QTQpCisKKyNkZWZpbmUgUEhPTkVfUFNUTl9TRVRfU1RBVEUJCV9JT1cgKCdxJywgMHhBNCwgaW50KQorI2RlZmluZSBQSE9ORV9QU1ROX0dFVF9TVEFURQkJX0lPICAoJ3EnLCAweEE1KQorCisjZGVmaW5lIFBTVE5fT05fSE9PSwkJMAorI2RlZmluZSBQU1ROX1JJTkdJTkcJCTEKKyNkZWZpbmUgUFNUTl9PRkZfSE9PSwkJMgorI2RlZmluZSBQU1ROX1BVTFNFX0RJQUwJCTMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogVGhlIHdpbmsgZHVyYXRpb24gaXMgdHVuYWJsZSB3aXRoIHRoaXMgaW9jdGwuICBUaGUgZGVmYXVsdCB3aW5rIGR1cmF0aW9uICAKKyogaXMgMzIwbXMuICBZb3UgZG8gbm90IG5lZWQgdG8gdXNlIHRoaXMgaW9jdGwgaWYgeW91IGRvIG5vdCByZXF1aXJlIGEKKyogZGlmZmVyZW50IHdpbmsgZHVyYXRpb24uCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSE9ORV9XSU5LX0RVUkFUSU9OCQlfSU9XICgncScsIDB4QTYsIGludCkKKyNkZWZpbmUgUEhPTkVfV0lOSwkJCV9JT1cgKCdxJywgMHhBQSwgaW50KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIAorKiAgQ29kZWMgRGVmaW5pdGlvbnMKKyogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCUc3MjNfNjMgPSAxLAorCUc3MjNfNTMgPSAyLAorCVRTODUgPSAzLAorCVRTNDggPSA0LAorCVRTNDEgPSA1LAorCUc3MjggPSA2LAorCUc3MjkgPSA3LAorCVVMQVcgPSA4LAorCUFMQVcgPSA5LAorCUxJTkVBUjE2ID0gMTAsCisJTElORUFSOCA9IDExLAorCVdTUyA9IDEyLAorCUc3MjlCID0gMTMKK30gcGhvbmVfY29kZWM7CisKK3N0cnVjdCBwaG9uZV9jb2RlY19kYXRhCit7CisgICAgICAgIHBob25lX2NvZGVjIHR5cGU7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGJ1Zl9taW4sIGJ1Zl9vcHQsIGJ1Zl9tYXg7Cit9OworCisjZGVmaW5lIFBIT05FX1FVRVJZX0NPREVDICAgICAgICAgICAgICAgX0lPV1IgKCdxJywgMHhBNywgc3RydWN0IHBob25lX2NvZGVjX2RhdGEgKikKKyNkZWZpbmUgUEhPTkVfUFNUTl9MSU5FVEVTVCAgICAgICAgICAgICBfSU8gKCdxJywgMHhBOCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogVGhpcyBjb250cm9scyB0aGUgVkFEL0NORyBmdW5jdGlvbmFsaXR5IG9mIEcuNzIzLjEuICBUaGUgZHJpdmVyIHdpbGwKKyogYWx3YXlzIHBhc3MgZnVsbCBzaXplIGZyYW1lcywgYW55IHVudXNlZCBieXRlcyB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm9zLAorKiBhbmQgZnJhbWVzIHBhc3NlZCB0byB0aGUgZHJpdmVyIHNob3VsZCBhbHNvIGJlIHBhZGRlZCB3aXRoIHplcm9zLiAgVGhlCisqIGZyYW1lIHR5cGUgaXMgZW5jb2RlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgdHdvIGJpdHMgb2YgdGhlIGZpcnN0CisqIFdPUkQgb2YgdGhlIGZyYW1lIGFzIGZvbGxvd3M6CisqCisqIGJpdHMgMS0wCUZyYW1lIFR5cGUJRGF0YSBSYXRlCQlTaWduaWZpY2FudCBXb3JkcworKiAwMAkJMAkJRy43MjMuMSA2LjMJCTEyCisqIDAxCQkxCQlHLjcyMy4xIDUuMwkJMTAKKyogMTAJCTIJCVZBRC9DTkcJCQkgMgorKiAxMQkJMwkJUmVwZWF0IGxhc3QgQ05HCQkgMiBiaXRzCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSE9ORV9WQUQJCQlfSU9XICgncScsIDB4QTksIGludCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoZSBleGNlcHRpb24gc3RydWN0dXJlIGFsbG93cyB1cyB0byBtdWx0aXBsZXggbXVsdGlwbGUgZXZlbnRzIG9udG8gdGhlCisqIHNlbGVjdCgpIGV4Y2VwdGlvbiBzZXQuICBJZiBhbnkgb2YgdGhlc2UgZmxhZ3MgYXJlIHNldCBzZWxlY3QoKSB3aWxsCisqIHJldHVybiB3aXRoIGEgcG9zaXRpdmUgaW5kaWNhdGlvbiBvbiB0aGUgZXhjZXB0aW9uIHNldC4gIFRoZSBkdG1mX3JlYWR5CisqIGJpdCBpbmRpY2F0ZXMgaWYgdGhlcmUgaXMgZGF0YSB3YWl0aW5nIGluIHRoZSBEVE1GIGJ1ZmZlci4gIFRoZQorKiBob29rc3RhdGUgYml0IGlzIHNldCBpZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiBob29rc3RhdGUgc3RhdHVzLCBpdCBkb2VzIG5vdAorKiBpbmRpY2F0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaG9va3N3aXRjaC4gIFRoZSBwc3RuX3JpbmcgYml0CisqIGluZGljYXRlcyB0aGF0IHRoZSBEQUEgb24gYSBMaW5lSkFDSyBjYXJkIGhhcyBkZXRlY3RlZCByaW5nIHZvbHRhZ2Ugb24KKyogdGhlIFBTVE4gcG9ydC4gIFRoZSBjYWxsZXJfaWQgYml0IGluZGljYXRlcyB0aGF0IGNhbGxlcl9pZCBkYXRhIGhhcyBiZWVuCisqIHJlY2VpdmVkIGFuZCBpcyBhdmFpbGFibGUuICBUaGUgcHN0bl93aW5rIGJpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgREFBIG9uCisqIHRoZSBMaW5lSkFDSyBoYXMgcmVjZWl2ZWQgYSB3aW5rIGZyb20gdGhlIHRlbGNvIHN3aXRjaC4gIFRoZSBmMCwgZjEsIGYyCisqIGFuZCBmMyBiaXRzIGluZGljYXRlIHRoYXQgdGhlIGZpbHRlciBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgZGV0ZWN0aW5nIHRoZQorKiBmcmVxdWVuY3kgcHJvZ3JhbW1lZCBpbnRvIHRoYXQgZmlsdGVyLgorKgorKiBUaGUgcmVtYWluaW5nIGJpdHMgc2hvdWxkIGJlIHNldCB0byB6ZXJvLiBUaGV5IHdpbGwgYmVjb21lIGRlZmluZWQgb3ZlciB0aW1lCisqIGZvciBvdGhlciBpbnRlcmZhY2UgY2FyZHMgYW5kIHRoZWlyIG5lZWRzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHBob25lX2V4Y2VwdAoreworCXVuc2lnbmVkIGludCBkdG1mX3JlYWR5OjE7CisJdW5zaWduZWQgaW50IGhvb2tzdGF0ZToxOworCXVuc2lnbmVkIGludCBwc3RuX3Jpbmc6MTsKKwl1bnNpZ25lZCBpbnQgY2FsbGVyX2lkOjE7CisJdW5zaWduZWQgaW50IHBzdG5fd2luazoxOworCXVuc2lnbmVkIGludCBmMDoxOworCXVuc2lnbmVkIGludCBmMToxOworCXVuc2lnbmVkIGludCBmMjoxOworCXVuc2lnbmVkIGludCBmMzoxOworCXVuc2lnbmVkIGludCBmbGFzaDoxOworCXVuc2lnbmVkIGludCBmYzA6MTsKKwl1bnNpZ25lZCBpbnQgZmMxOjE7CisJdW5zaWduZWQgaW50IGZjMjoxOworCXVuc2lnbmVkIGludCBmYzM6MTsKKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ6MTg7Cit9OworCit1bmlvbiB0ZWxlcGhvbnlfZXhjZXB0aW9uIHsKKwlzdHJ1Y3QgcGhvbmVfZXhjZXB0IGJpdHM7CisJdW5zaWduZWQgaW50IGJ5dGVzOworfTsKKworCisjZW5kaWYJCS8qIFRFTEVQSE9OWV9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGVybWlvcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90ZXJtaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFjZDBjMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGVybWlvcy5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX0xJTlVYX1RFUk1JT1NfSAorI2RlZmluZSBfTElOVVhfVEVSTUlPU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS90ZXJtaW9zLmg+CisKKyNkZWZpbmUgTkZGCTUKKworc3RydWN0IHRlcm1pb3gKK3sKKwlfX3UxNgl4X2hmbGFnOworCV9fdTE2CXhfY2ZsYWc7CisJX191MTYJeF9yZmxhZ1tORkZdOworCV9fdTE2CXhfc2ZsYWc7Cit9OworCisjZGVmaW5lCVJUU1hPRkYJCTB4MDAwMQkJLyogUlRTIGZsb3cgY29udHJvbCBvbiBpbnB1dCAqLworI2RlZmluZQlDVFNYT04JCTB4MDAwMgkJLyogQ1RTIGZsb3cgY29udHJvbCBvbiBvdXRwdXQgKi8KKyNkZWZpbmUJRFRSWE9GRgkJMHgwMDA0CQkvKiBEVFIgZmxvdyBjb250cm9sIG9uIGlucHV0ICovCisjZGVmaW5lIERTUlhPTgkJMHgwMDA4CQkvKiBEQ0QgZmxvdyBjb250cm9sIG9uIG91dHB1dCAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGltZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmNWZlNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGltZS5oCkBAIC0wLDAgKzEsNzkgQEAKKyNpZm5kZWYgX0xJTlVYX1RJTUVfSAorI2RlZmluZSBfTElOVVhfVElNRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKyNpZm5kZWYgX1NUUlVDVF9USU1FU1BFQworI2RlZmluZSBfU1RSVUNUX1RJTUVTUEVDCitzdHJ1Y3QgdGltZXNwZWMgeworCV9fa2VybmVsX3RpbWVfdAl0dl9zZWM7CQkJLyogc2Vjb25kcyAqLworCWxvbmcJCXR2X25zZWM7CQkvKiBuYW5vc2Vjb25kcyAqLworfTsKKyNlbmRpZgorCitzdHJ1Y3QgdGltZXZhbCB7CisJX19rZXJuZWxfdGltZV90CQl0dl9zZWM7CQkvKiBzZWNvbmRzICovCisJX19rZXJuZWxfc3VzZWNvbmRzX3QJdHZfdXNlYzsJLyogbWljcm9zZWNvbmRzICovCit9OworCitzdHJ1Y3QgdGltZXpvbmUgeworCWludAl0el9taW51dGVzd2VzdDsJLyogbWludXRlcyB3ZXN0IG9mIEdyZWVud2ljaCAqLworCWludAl0el9kc3R0aW1lOwkvKiB0eXBlIG9mIGRzdCBjb3JyZWN0aW9uICovCit9OworCisKKyNkZWZpbmUgTkZEQklUUwkJCV9fTkZEQklUUworCisjZGVmaW5lIEZEX1NFVFNJWkUJCV9fRkRfU0VUU0laRQorI2RlZmluZSBGRF9TRVQoZmQsZmRzZXRwKQlfX0ZEX1NFVChmZCxmZHNldHApCisjZGVmaW5lIEZEX0NMUihmZCxmZHNldHApCV9fRkRfQ0xSKGZkLGZkc2V0cCkKKyNkZWZpbmUgRkRfSVNTRVQoZmQsZmRzZXRwKQlfX0ZEX0lTU0VUKGZkLGZkc2V0cCkKKyNkZWZpbmUgRkRfWkVSTyhmZHNldHApCQlfX0ZEX1pFUk8oZmRzZXRwKQorCisvKgorICogTmFtZXMgb2YgdGhlIGludGVydmFsIHRpbWVycywgYW5kIHN0cnVjdHVyZQorICogZGVmaW5pbmcgYSB0aW1lciBzZXR0aW5nOgorICovCisjZGVmaW5lCUlUSU1FUl9SRUFMCQkwCisjZGVmaW5lCUlUSU1FUl9WSVJUVUFMCQkxCisjZGVmaW5lCUlUSU1FUl9QUk9GCQkyCisKK3N0cnVjdCBpdGltZXJzcGVjIHsKKwlzdHJ1Y3QgdGltZXNwZWMgaXRfaW50ZXJ2YWw7CS8qIHRpbWVyIHBlcmlvZCAqLworCXN0cnVjdCB0aW1lc3BlYyBpdF92YWx1ZTsJLyogdGltZXIgZXhwaXJhdGlvbiAqLworfTsKKworc3RydWN0IGl0aW1lcnZhbCB7CisJc3RydWN0IHRpbWV2YWwgaXRfaW50ZXJ2YWw7CS8qIHRpbWVyIGludGVydmFsICovCisJc3RydWN0IHRpbWV2YWwgaXRfdmFsdWU7CS8qIGN1cnJlbnQgdmFsdWUgKi8KK307CisKKy8qCisgKiBUaGUgSURzIG9mIHRoZSB2YXJpb3VzIHN5c3RlbSBjbG9ja3MgKGZvciBQT1NJWC4xYiBpbnRlcnZhbCB0aW1lcnMpOgorICovCisjZGVmaW5lIENMT0NLX1JFQUxUSU1FCQkJMAorI2RlZmluZSBDTE9DS19NT05PVE9OSUMJCQkxCisjZGVmaW5lIENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRAkyCisjZGVmaW5lIENMT0NLX1RIUkVBRF9DUFVUSU1FX0lECQkzCisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19SQVcJCTQKKyNkZWZpbmUgQ0xPQ0tfUkVBTFRJTUVfQ09BUlNFCQk1CisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19DT0FSU0UJCTYKKyNkZWZpbmUgQ0xPQ0tfQk9PVFRJTUUJCQk3CisjZGVmaW5lIENMT0NLX1JFQUxUSU1FX0FMQVJNCQk4CisjZGVmaW5lIENMT0NLX0JPT1RUSU1FX0FMQVJNCQk5CisKKy8qCisgKiBUaGUgSURzIG9mIHZhcmlvdXMgaGFyZHdhcmUgY2xvY2tzOgorICovCisjZGVmaW5lIENMT0NLX1NHSV9DWUNMRQkJCTEwCisjZGVmaW5lIE1BWF9DTE9DS1MJCQkxNgorI2RlZmluZSBDTE9DS1NfTUFTSwkJCShDTE9DS19SRUFMVElNRSB8IENMT0NLX01PTk9UT05JQykKKyNkZWZpbmUgQ0xPQ0tTX01PTk8JCQlDTE9DS19NT05PVE9OSUMKKworLyoKKyAqIFRoZSB2YXJpb3VzIGZsYWdzIGZvciBzZXR0aW5nIFBPU0lYLjFiIGludGVydmFsIHRpbWVyczoKKyAqLworI2RlZmluZSBUSU1FUl9BQlNUSU1FCQkJMHgwMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGltZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGltZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2I2MjYxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90aW1lcy5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX0xJTlVYX1RJTUVTX0gKKyNkZWZpbmUgX0xJTlVYX1RJTUVTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB0bXMgeworCV9fa2VybmVsX2Nsb2NrX3QgdG1zX3V0aW1lOworCV9fa2VybmVsX2Nsb2NrX3QgdG1zX3N0aW1lOworCV9fa2VybmVsX2Nsb2NrX3QgdG1zX2N1dGltZTsKKwlfX2tlcm5lbF9jbG9ja190IHRtc19jc3RpbWU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGltZXguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGltZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY5NDNjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90aW1leC5oCkBAIC0wLDAgKzEsMTY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChjKSBEYXZpZCBMLiBNaWxscyAxOTkzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAgICAgKgorICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCAqCisgKiB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoZSAgICoKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgICAgICAgICAgKgorICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgVW5pdmVyc2l0eSBvZiBEZWxhd2FyZSBub3QgYmUgdXNlZCBpbiAgICAqCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlICAgICAgICoKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBVbml2ZXJzaXR5IG9mIERlbGF3YXJlICAgKgorICogbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgICAgICAqCisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4gICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogTW9kaWZpY2F0aW9uIGhpc3RvcnkgdGltZXguaAorICoKKyAqIDI5IERlYyA5NwlSdXNzZWxsIEtpbmcKKyAqCU1vdmVkIENMT0NLX1RJQ0tfUkFURSwgQ0xPQ0tfVElDS19GQUNUT1IgYW5kIEZJTkVUVU5FIHRvIGFzbS90aW1leC5oCisgKglmb3IgQVJNIG1hY2hpbmVzCisgKgorICogIDkgSmFuIDk3ICAgIEFkcmlhbiBTdW4KKyAqICAgICAgU2hpZnRlZCBMQVRDSCBkZWZpbmUgdG8gYWxsb3cgYWNjZXNzIHRvIGFscGhhIG1hY2hpbmVzLgorICoKKyAqIDI2IFNlcCA5NAlEYXZpZCBMLiBNaWxscworICoJQWRkZWQgZGVmaW5lcyBmb3IgaHlicmlkIHBoYXNlL2ZyZXF1ZW5jeS1sb2NrIGxvb3AuCisgKgorICogMTkgTWFyIDk0CURhdmlkIEwuIE1pbGxzCisgKglNb3ZlZCBkZWZpbmVzIGZyb20ga2VybmVsIHJvdXRpbmVzIHRvIGhlYWRlciBmaWxlIGFuZCBhZGRlZCBuZXcKKyAqCWRlZmluZXMgZm9yIFBQUyBwaGFzZS1sb2NrIGxvb3AuCisgKgorICogMjAgRmViIDk0CURhdmlkIEwuIE1pbGxzCisgKglSZXZpc2VkIHN0YXR1cyBjb2RlcyBhbmQgc3RydWN0dXJlcyBmb3IgZXh0ZXJuYWwgY2xvY2sgYW5kIFBQUworICoJc2lnbmFsIGRpc2NpcGxpbmUuCisgKgorICogMjggTm92IDkzCURhdmlkIEwuIE1pbGxzCisgKglBZGp1c3RlZCBwYXJhbWV0ZXJzIHRvIGltcHJvdmUgc3RhYmlsaXR5IGFuZCBpbmNyZWFzZSBwb2xsCisgKglpbnRlcnZhbC4KKyAqCisgKiAxNyBTZXAgOTMgICAgRGF2aWQgTC4gTWlsbHMKKyAqICAgICAgQ3JlYXRlZCBmaWxlICROVFAvaW5jbHVkZS9zeXMvdGltZXguaAorICogMDcgT2N0IDkzICAgIFRvcnN0ZW4gRHV3ZQorICogICAgICBEZXJpdmVkIGxpbnV4L3RpbWV4LmgKKyAqIDE5OTUtMDgtMTMgICAgVG9yc3RlbiBEdXdlCisgKiAgICAgIGtlcm5lbCBQTEwgdXBkYXRlZCB0byAxOTk0LTEyLTEzIHNwZWNzIChyZmMtMTU4OSkKKyAqIDE5OTctMDgtMzAgICAgVWxyaWNoIFdpbmRsCisgKiAgICAgIEFkZGVkIG5ldyBjb25zdGFudCBOVFBfUEhBU0VfTElNSVQKKyAqIDIwMDQtMDgtMTIgICAgQ2hyaXN0b3BoIExhbWV0ZXIKKyAqICAgICAgUmV3b3JrZWQgdGltZSBpbnRlcnBvbGF0aW9uIGxvZ2ljCisgKi8KKyNpZm5kZWYgX0xJTlVYX1RJTUVYX0gKKyNkZWZpbmUgX0xJTlVYX1RJTUVYX0gKKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2RlZmluZSBOVFBfQVBJCQk0CS8qIE5UUCBBUEkgdmVyc2lvbiAqLworCisvKgorICogc3lzY2FsbCBpbnRlcmZhY2UgLSB1c2VkIChtYWlubHkgYnkgTlRQIGRhZW1vbikKKyAqIHRvIGRpc2NpcGxpbmUga2VybmVsIGNsb2NrIG9zY2lsbGF0b3IKKyAqLworc3RydWN0IHRpbWV4IHsKKwl1bnNpZ25lZCBpbnQgbW9kZXM7CS8qIG1vZGUgc2VsZWN0b3IgKi8KKwlsb25nIG9mZnNldDsJCS8qIHRpbWUgb2Zmc2V0ICh1c2VjKSAqLworCWxvbmcgZnJlcTsJCS8qIGZyZXF1ZW5jeSBvZmZzZXQgKHNjYWxlZCBwcG0pICovCisJbG9uZyBtYXhlcnJvcjsJCS8qIG1heGltdW0gZXJyb3IgKHVzZWMpICovCisJbG9uZyBlc3RlcnJvcjsJCS8qIGVzdGltYXRlZCBlcnJvciAodXNlYykgKi8KKwlpbnQgc3RhdHVzOwkJLyogY2xvY2sgY29tbWFuZC9zdGF0dXMgKi8KKwlsb25nIGNvbnN0YW50OwkJLyogcGxsIHRpbWUgY29uc3RhbnQgKi8KKwlsb25nIHByZWNpc2lvbjsJCS8qIGNsb2NrIHByZWNpc2lvbiAodXNlYykgKHJlYWQgb25seSkgKi8KKwlsb25nIHRvbGVyYW5jZTsJCS8qIGNsb2NrIGZyZXF1ZW5jeSB0b2xlcmFuY2UgKHBwbSkKKwkJCQkgKiAocmVhZCBvbmx5KQorCQkJCSAqLworCXN0cnVjdCB0aW1ldmFsIHRpbWU7CS8qIChyZWFkIG9ubHksIGV4Y2VwdCBmb3IgQURKX1NFVE9GRlNFVCkgKi8KKwlsb25nIHRpY2s7CQkvKiAobW9kaWZpZWQpIHVzZWNzIGJldHdlZW4gY2xvY2sgdGlja3MgKi8KKworCWxvbmcgcHBzZnJlcTsgICAgICAgICAgIC8qIHBwcyBmcmVxdWVuY3kgKHNjYWxlZCBwcG0pIChybykgKi8KKwlsb25nIGppdHRlcjsgICAgICAgICAgICAvKiBwcHMgaml0dGVyICh1cykgKHJvKSAqLworCWludCBzaGlmdDsgICAgICAgICAgICAgIC8qIGludGVydmFsIGR1cmF0aW9uIChzKSAoc2hpZnQpIChybykgKi8KKwlsb25nIHN0YWJpbDsgICAgICAgICAgICAvKiBwcHMgc3RhYmlsaXR5IChzY2FsZWQgcHBtKSAocm8pICovCisJbG9uZyBqaXRjbnQ7ICAgICAgICAgICAgLyogaml0dGVyIGxpbWl0IGV4Y2VlZGVkIChybykgKi8KKwlsb25nIGNhbGNudDsgICAgICAgICAgICAvKiBjYWxpYnJhdGlvbiBpbnRlcnZhbHMgKHJvKSAqLworCWxvbmcgZXJyY250OyAgICAgICAgICAgIC8qIGNhbGlicmF0aW9uIGVycm9ycyAocm8pICovCisJbG9uZyBzdGJjbnQ7ICAgICAgICAgICAgLyogc3RhYmlsaXR5IGxpbWl0IGV4Y2VlZGVkIChybykgKi8KKworCWludCB0YWk7CQkvKiBUQUkgb2Zmc2V0IChybykgKi8KKworCWludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOworCWludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOworCWludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7Cit9OworCisvKgorICogTW9kZSBjb2RlcyAodGltZXgubW9kZSkKKyAqLworI2RlZmluZSBBREpfT0ZGU0VUCQkweDAwMDEJLyogdGltZSBvZmZzZXQgKi8KKyNkZWZpbmUgQURKX0ZSRVFVRU5DWQkJMHgwMDAyCS8qIGZyZXF1ZW5jeSBvZmZzZXQgKi8KKyNkZWZpbmUgQURKX01BWEVSUk9SCQkweDAwMDQJLyogbWF4aW11bSB0aW1lIGVycm9yICovCisjZGVmaW5lIEFESl9FU1RFUlJPUgkJMHgwMDA4CS8qIGVzdGltYXRlZCB0aW1lIGVycm9yICovCisjZGVmaW5lIEFESl9TVEFUVVMJCTB4MDAxMAkvKiBjbG9jayBzdGF0dXMgKi8KKyNkZWZpbmUgQURKX1RJTUVDT05TVAkJMHgwMDIwCS8qIHBsbCB0aW1lIGNvbnN0YW50ICovCisjZGVmaW5lIEFESl9UQUkJCQkweDAwODAJLyogc2V0IFRBSSBvZmZzZXQgKi8KKyNkZWZpbmUgQURKX1NFVE9GRlNFVAkJMHgwMTAwICAvKiBhZGQgJ3RpbWUnIHRvIGN1cnJlbnQgdGltZSAqLworI2RlZmluZSBBREpfTUlDUk8JCTB4MTAwMAkvKiBzZWxlY3QgbWljcm9zZWNvbmQgcmVzb2x1dGlvbiAqLworI2RlZmluZSBBREpfTkFOTwkJMHgyMDAwCS8qIHNlbGVjdCBuYW5vc2Vjb25kIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgQURKX1RJQ0sJCTB4NDAwMAkvKiB0aWNrIHZhbHVlICovCisKKyNkZWZpbmUgQURKX09GRlNFVF9TSU5HTEVTSE9UCTB4ODAwMQkvKiBvbGQtZmFzaGlvbmVkIGFkanRpbWUgKi8KKyNkZWZpbmUgQURKX09GRlNFVF9TU19SRUFECTB4YTAwMQkvKiByZWFkLW9ubHkgYWRqdGltZSAqLworCisvKiBOVFAgdXNlcmxhbmQgbGlrZXMgdGhlIE1PRF8gcHJlZml4IGJldHRlciAqLworI2RlZmluZSBNT0RfT0ZGU0VUCUFESl9PRkZTRVQKKyNkZWZpbmUgTU9EX0ZSRVFVRU5DWQlBREpfRlJFUVVFTkNZCisjZGVmaW5lIE1PRF9NQVhFUlJPUglBREpfTUFYRVJST1IKKyNkZWZpbmUgTU9EX0VTVEVSUk9SCUFESl9FU1RFUlJPUgorI2RlZmluZSBNT0RfU1RBVFVTCUFESl9TVEFUVVMKKyNkZWZpbmUgTU9EX1RJTUVDT05TVAlBREpfVElNRUNPTlNUCisjZGVmaW5lIE1PRF9UQUkJQURKX1RBSQorI2RlZmluZSBNT0RfTUlDUk8JQURKX01JQ1JPCisjZGVmaW5lIE1PRF9OQU5PCUFESl9OQU5PCisKKworLyoKKyAqIFN0YXR1cyBjb2RlcyAodGltZXguc3RhdHVzKQorICovCisjZGVmaW5lIFNUQV9QTEwJCTB4MDAwMQkvKiBlbmFibGUgUExMIHVwZGF0ZXMgKHJ3KSAqLworI2RlZmluZSBTVEFfUFBTRlJFUQkweDAwMDIJLyogZW5hYmxlIFBQUyBmcmVxIGRpc2NpcGxpbmUgKHJ3KSAqLworI2RlZmluZSBTVEFfUFBTVElNRQkweDAwMDQJLyogZW5hYmxlIFBQUyB0aW1lIGRpc2NpcGxpbmUgKHJ3KSAqLworI2RlZmluZSBTVEFfRkxMCQkweDAwMDgJLyogc2VsZWN0IGZyZXF1ZW5jeS1sb2NrIG1vZGUgKHJ3KSAqLworCisjZGVmaW5lIFNUQV9JTlMJCTB4MDAxMAkvKiBpbnNlcnQgbGVhcCAocncpICovCisjZGVmaW5lIFNUQV9ERUwJCTB4MDAyMAkvKiBkZWxldGUgbGVhcCAocncpICovCisjZGVmaW5lIFNUQV9VTlNZTkMJMHgwMDQwCS8qIGNsb2NrIHVuc3luY2hyb25pemVkIChydykgKi8KKyNkZWZpbmUgU1RBX0ZSRVFIT0xECTB4MDA4MAkvKiBob2xkIGZyZXF1ZW5jeSAocncpICovCisKKyNkZWZpbmUgU1RBX1BQU1NJR05BTAkweDAxMDAJLyogUFBTIHNpZ25hbCBwcmVzZW50IChybykgKi8KKyNkZWZpbmUgU1RBX1BQU0pJVFRFUgkweDAyMDAJLyogUFBTIHNpZ25hbCBqaXR0ZXIgZXhjZWVkZWQgKHJvKSAqLworI2RlZmluZSBTVEFfUFBTV0FOREVSCTB4MDQwMAkvKiBQUFMgc2lnbmFsIHdhbmRlciBleGNlZWRlZCAocm8pICovCisjZGVmaW5lIFNUQV9QUFNFUlJPUgkweDA4MDAJLyogUFBTIHNpZ25hbCBjYWxpYnJhdGlvbiBlcnJvciAocm8pICovCisKKyNkZWZpbmUgU1RBX0NMT0NLRVJSCTB4MTAwMAkvKiBjbG9jayBoYXJkd2FyZSBmYXVsdCAocm8pICovCisjZGVmaW5lIFNUQV9OQU5PCTB4MjAwMAkvKiByZXNvbHV0aW9uICgwID0gdXMsIDEgPSBucykgKHJvKSAqLworI2RlZmluZSBTVEFfTU9ERQkweDQwMDAJLyogbW9kZSAoMCA9IFBMTCwgMSA9IEZMTCkgKHJvKSAqLworI2RlZmluZSBTVEFfQ0xLCQkweDgwMDAJLyogY2xvY2sgc291cmNlICgwID0gQSwgMSA9IEIpIChybykgKi8KKworLyogcmVhZC1vbmx5IGJpdHMgKi8KKyNkZWZpbmUgU1RBX1JPTkxZIChTVEFfUFBTU0lHTkFMIHwgU1RBX1BQU0pJVFRFUiB8IFNUQV9QUFNXQU5ERVIgfCBcCisJU1RBX1BQU0VSUk9SIHwgU1RBX0NMT0NLRVJSIHwgU1RBX05BTk8gfCBTVEFfTU9ERSB8IFNUQV9DTEspCisKKy8qCisgKiBDbG9jayBzdGF0ZXMgKHRpbWVfc3RhdGUpCisgKi8KKyNkZWZpbmUgVElNRV9PSwkJMAkvKiBjbG9jayBzeW5jaHJvbml6ZWQsIG5vIGxlYXAgc2Vjb25kICovCisjZGVmaW5lIFRJTUVfSU5TCTEJLyogaW5zZXJ0IGxlYXAgc2Vjb25kICovCisjZGVmaW5lIFRJTUVfREVMCTIJLyogZGVsZXRlIGxlYXAgc2Vjb25kICovCisjZGVmaW5lIFRJTUVfT09QCTMJLyogbGVhcCBzZWNvbmQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgVElNRV9XQUlUCTQJLyogbGVhcCBzZWNvbmQgaGFzIG9jY3VycmVkICovCisjZGVmaW5lIFRJTUVfRVJST1IJNQkvKiBjbG9jayBub3Qgc3luY2hyb25pemVkICovCisjZGVmaW5lIFRJTUVfQkFECVRJTUVfRVJST1IgLyogYncgY29tcGF0ICovCisKKworI2VuZGlmIC8qIExJTlVYX1RJTUVYX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGlvY2wuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGlvY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzU2ODYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90aW9jbC5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgX0xJTlVYX1RJT0NMX0gKKyNkZWZpbmUgX0xJTlVYX1RJT0NMX0gKKworI2RlZmluZSBUSU9DTF9TRVRTRUwJMgkvKiBzZXQgYSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgCVRJT0NMX1NFTENIQVIJMAkvKiBzZWxlY3QgY2hhcmFjdGVycyAqLworI2RlZmluZSAJVElPQ0xfU0VMV09SRAkxCS8qIHNlbGVjdCB3aG9sZSB3b3JkcyAqLworI2RlZmluZSAJVElPQ0xfU0VMTElORQkyCS8qIHNlbGVjdCB3aG9sZSBsaW5lcyAqLworI2RlZmluZSAJVElPQ0xfU0VMUE9JTlRFUgkzCS8qIHNob3cgdGhlIHBvaW50ZXIgKi8KKyNkZWZpbmUgCVRJT0NMX1NFTENMRUFSCTQJLyogY2xlYXIgdmlzaWJpbGl0eSBvZiBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgCVRJT0NMX1NFTE1PVVNFUkVQT1JUCTE2CS8qIHJlcG9ydCBiZWdpbm5pbmcgb2Ygc2VsZWN0aW9uICovCisjZGVmaW5lIAlUSU9DTF9TRUxCVVRUT05NQVNLCTE1CS8qIGJ1dHRvbiBtYXNrIGZvciByZXBvcnQgKi8KKy8qIHNlbGVjdGlvbiBleHRlbnQgKi8KK3N0cnVjdCB0aW9jbF9zZWxlY3Rpb24geworCXVuc2lnbmVkIHNob3J0IHhzOwkvKiBYIHN0YXJ0ICovCisJdW5zaWduZWQgc2hvcnQgeXM7CS8qIFkgc3RhcnQgKi8KKwl1bnNpZ25lZCBzaG9ydCB4ZTsJLyogWCBlbmQgKi8KKwl1bnNpZ25lZCBzaG9ydCB5ZTsJLyogWSBlbmQgKi8KKwl1bnNpZ25lZCBzaG9ydCBzZWxfbW9kZTsJLyogc2VsZWN0aW9uIG1vZGUgKi8KK307CisKKyNkZWZpbmUgVElPQ0xfUEFTVEVTRUwJMwkvKiBwYXN0ZSBwcmV2aW91cyBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgVElPQ0xfVU5CTEFOS1NDUkVFTgk0CS8qIHVuYmxhbmsgc2NyZWVuICovCisKKyNkZWZpbmUgVElPQ0xfU0VMTE9BRExVVAk1CisJLyogc2V0IGNoYXJhY3RlcnMgdG8gYmUgY29uc2lkZXJlZCBhbHBoYWJldGljIHdoZW4gc2VsZWN0aW5nICovCisJLyogdTMyWzhdIGJpdCBhcnJheSwgNCBieXRlcy1hbGlnbmVkIHdpdGggdHlwZSAqLworCisvKiB0aGVzZSB0d28gZG9uJ3QgcmV0dXJuIGEgdmFsdWU6IHRoZXkgd3JpdGUgaXQgYmFjayBpbiB0aGUgdHlwZSAqLworI2RlZmluZSBUSU9DTF9HRVRTSElGVFNUQVRFCTYJLyogd3JpdGUgc2hpZnQgc3RhdGUgKi8KKyNkZWZpbmUgVElPQ0xfR0VUTU9VU0VSRVBPUlRJTkcJNwkvKiB3cml0ZSB3aGV0aGVyIG1vdXNlIGV2ZW50IGFyZSByZXBvcnRlZCAqLworI2RlZmluZSBUSU9DTF9TRVRWRVNBQkxBTksJMTAJLyogc2V0IHZlc2EgYmxhbmtpbmcgbW9kZSAqLworI2RlZmluZSBUSU9DTF9TRVRLTVNHUkVESVJFQ1QJMTEJLyogcmVzdHJpY3Qga2VybmVsIG1lc3NhZ2VzIHRvIGEgdnQgKi8KKyNkZWZpbmUgVElPQ0xfR0VURkdDT05TT0xFCTEyCS8qIGdldCBmb3JlZ3JvdW5kIHZ0ICovCisjZGVmaW5lIFRJT0NMX1NDUk9MTENPTlNPTEUJMTMJLyogc2Nyb2xsIGNvbnNvbGUgKi8KKyNkZWZpbmUgVElPQ0xfQkxBTktTQ1JFRU4JMTQJLyoga2VlcCBzY3JlZW4gYmxhbmsgZXZlbiBpZiBhIGtleSBpcyBwcmVzc2VkICovCisjZGVmaW5lIFRJT0NMX0JMQU5LRURTQ1JFRU4JMTUJLyogcmV0dXJuIHdoaWNoIHZ0IHdhcyBibGFua2VkICovCisjZGVmaW5lIFRJT0NMX0dFVEtNU0dSRURJUkVDVAkxNwkvKiBnZXQgdGhlIHZ0IHRoZSBrZXJuZWwgbWVzc2FnZXMgYXJlIHJlc3RyaWN0ZWQgdG8gKi8KKworI2VuZGlmIC8qIF9MSU5VWF9USU9DTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpcGMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGlwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmNhMGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpcGMuaApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvdGlwYy5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgc29ja2V0IGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwLTIwMTEsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTElOVVhfVElQQ19IXworI2RlZmluZSBfTElOVVhfVElQQ19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIFRJUEMgYWRkcmVzc2luZyBwcmltaXRpdmVzCisgKi8KKworc3RydWN0IHRpcGNfcG9ydGlkIHsKKwlfX3UzMiByZWY7CisJX191MzIgbm9kZTsKK307CisKK3N0cnVjdCB0aXBjX25hbWUgeworCV9fdTMyIHR5cGU7CisJX191MzIgaW5zdGFuY2U7Cit9OworCitzdHJ1Y3QgdGlwY19uYW1lX3NlcSB7CisJX191MzIgdHlwZTsKKwlfX3UzMiBsb3dlcjsKKwlfX3UzMiB1cHBlcjsKK307CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIHRpcGNfYWRkcih1bnNpZ25lZCBpbnQgem9uZSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBjbHVzdGVyLAorCQkJICAgICAgdW5zaWduZWQgaW50IG5vZGUpCit7CisJcmV0dXJuICh6b25lIDw8IDI0KSB8IChjbHVzdGVyIDw8IDEyKSB8IG5vZGU7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCB0aXBjX3pvbmUoX191MzIgYWRkcikKK3sKKwlyZXR1cm4gYWRkciA+PiAyNDsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IHRpcGNfY2x1c3RlcihfX3UzMiBhZGRyKQoreworCXJldHVybiAoYWRkciA+PiAxMikgJiAweGZmZjsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IHRpcGNfbm9kZShfX3UzMiBhZGRyKQoreworCXJldHVybiBhZGRyICYgMHhmZmY7Cit9CisKKy8qCisgKiBBcHBsaWNhdGlvbi1hY2Nlc3NpYmxlIHBvcnQgbmFtZSB0eXBlcworICovCisKKyNkZWZpbmUgVElQQ19DRkdfU1JWCQkwCS8qIGNvbmZpZ3VyYXRpb24gc2VydmljZSBuYW1lIHR5cGUgKi8KKyNkZWZpbmUgVElQQ19UT1BfU1JWCQkxCS8qIHRvcG9sb2d5IHNlcnZpY2UgbmFtZSB0eXBlICovCisjZGVmaW5lIFRJUENfUkVTRVJWRURfVFlQRVMJNjQJLyogbG93ZXN0IHVzZXItcHVibGlzaGFibGUgbmFtZSB0eXBlICovCisKKy8qCisgKiBQdWJsaWNhdGlvbiBzY29wZXMgd2hlbiBiaW5kaW5nIHBvcnQgbmFtZXMgYW5kIHBvcnQgbmFtZSBzZXF1ZW5jZXMKKyAqLworCisjZGVmaW5lIFRJUENfWk9ORV9TQ09QRQkJMQorI2RlZmluZSBUSVBDX0NMVVNURVJfU0NPUEUJMgorI2RlZmluZSBUSVBDX05PREVfU0NPUEUJCTMKKworLyoKKyAqIExpbWl0aW5nIHZhbHVlcyBmb3IgbWVzc2FnZXMKKyAqLworCisjZGVmaW5lIFRJUENfTUFYX1VTRVJfTVNHX1NJWkUJNjYwMDBVCisKKy8qCisgKiBNZXNzYWdlIGltcG9ydGFuY2UgbGV2ZWxzCisgKi8KKworI2RlZmluZSBUSVBDX0xPV19JTVBPUlRBTkNFCQkwCisjZGVmaW5lIFRJUENfTUVESVVNX0lNUE9SVEFOQ0UJCTEKKyNkZWZpbmUgVElQQ19ISUdIX0lNUE9SVEFOQ0UJCTIKKyNkZWZpbmUgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFCTMKKworLyoKKyAqIE1zZyByZWplY3Rpb24vY29ubmVjdGlvbiBzaHV0ZG93biByZWFzb25zCisgKi8KKworI2RlZmluZSBUSVBDX09LCQkJMAorI2RlZmluZSBUSVBDX0VSUl9OT19OQU1FCTEKKyNkZWZpbmUgVElQQ19FUlJfTk9fUE9SVAkyCisjZGVmaW5lIFRJUENfRVJSX05PX05PREUJMworI2RlZmluZSBUSVBDX0VSUl9PVkVSTE9BRAk0CisjZGVmaW5lIFRJUENfQ09OTl9TSFVURE9XTgk1CisKKy8qCisgKiBUSVBDIHRvcG9sb2d5IHN1YnNjcmlwdGlvbiBzZXJ2aWNlIGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBUSVBDX1NVQl9QT1JUUwkJMHgwMQkvKiBmaWx0ZXIgZm9yIHBvcnQgYXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIFRJUENfU1VCX1NFUlZJQ0UJMHgwMgkvKiBmaWx0ZXIgZm9yIHNlcnZpY2UgYXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIFRJUENfU1VCX0NBTkNFTAkJMHgwNAkvKiBjYW5jZWwgYSBzdWJzY3JpcHRpb24gKi8KKworI2RlZmluZSBUSVBDX1dBSVRfRk9SRVZFUgkofjApCS8qIHRpbWVvdXQgZm9yIHBlcm1hbmVudCBzdWJzY3JpcHRpb24gKi8KKworc3RydWN0IHRpcGNfc3Vic2NyIHsKKwlzdHJ1Y3QgdGlwY19uYW1lX3NlcSBzZXE7CS8qIG5hbWUgc2VxdWVuY2Ugb2YgaW50ZXJlc3QgKi8KKwlfX3UzMiB0aW1lb3V0OwkJCS8qIHN1YnNjcmlwdGlvbiBkdXJhdGlvbiAoaW4gbXMpICovCisJX191MzIgZmlsdGVyOwkJCS8qIGJpdG1hc2sgb2YgZmlsdGVyIG9wdGlvbnMgKi8KKwljaGFyIHVzcl9oYW5kbGVbOF07CQkvKiBhdmFpbGFibGUgZm9yIHN1YnNjcmliZXIgdXNlICovCit9OworCisjZGVmaW5lIFRJUENfUFVCTElTSEVECQkxCS8qIHB1YmxpY2F0aW9uIGV2ZW50ICovCisjZGVmaW5lIFRJUENfV0lUSERSQVdOCQkyCS8qIHdpdGhkcmF3IGV2ZW50ICovCisjZGVmaW5lIFRJUENfU1VCU0NSX1RJTUVPVVQJMwkvKiBzdWJzY3JpcHRpb24gdGltZW91dCBldmVudCAqLworCitzdHJ1Y3QgdGlwY19ldmVudCB7CisJX191MzIgZXZlbnQ7CQkJLyogZXZlbnQgdHlwZSAqLworCV9fdTMyIGZvdW5kX2xvd2VyOwkJLyogbWF0Y2hpbmcgbmFtZSBzZXEgaW5zdGFuY2VzICovCisJX191MzIgZm91bmRfdXBwZXI7CQkvKiAgICAiICAgICAgIiAgICAiICAgICAiICAgICAgKi8KKwlzdHJ1Y3QgdGlwY19wb3J0aWQgcG9ydDsJLyogYXNzb2NpYXRlZCBwb3J0ICovCisJc3RydWN0IHRpcGNfc3Vic2NyIHM7CQkvKiBhc3NvY2lhdGVkIHN1YnNjcmlwdGlvbiAqLworfTsKKworLyoKKyAqIFNvY2tldCBBUEkKKyAqLworCisjaWZuZGVmIEFGX1RJUEMKKyNkZWZpbmUgQUZfVElQQwkJMzAKKyNlbmRpZgorCisjaWZuZGVmIFBGX1RJUEMKKyNkZWZpbmUgUEZfVElQQwkJQUZfVElQQworI2VuZGlmCisKKyNpZm5kZWYgU09MX1RJUEMKKyNkZWZpbmUgU09MX1RJUEMJMjcxCisjZW5kaWYKKworI2RlZmluZSBUSVBDX0FERFJfTkFNRVNFUQkxCisjZGVmaW5lIFRJUENfQUREUl9NQ0FTVAkJMQorI2RlZmluZSBUSVBDX0FERFJfTkFNRQkJMgorI2RlZmluZSBUSVBDX0FERFJfSUQJCTMKKworc3RydWN0IHNvY2thZGRyX3RpcGMgeworCXVuc2lnbmVkIHNob3J0IGZhbWlseTsKKwl1bnNpZ25lZCBjaGFyICBhZGRydHlwZTsKKwlzaWduZWQgICBjaGFyICBzY29wZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB0aXBjX3BvcnRpZCBpZDsKKwkJc3RydWN0IHRpcGNfbmFtZV9zZXEgbmFtZXNlcTsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB0aXBjX25hbWUgbmFtZTsKKwkJCV9fdTMyIGRvbWFpbjsKKwkJfSBuYW1lOworCX0gYWRkcjsKK307CisKKy8qCisgKiBBbmNpbGxhcnkgZGF0YSBvYmplY3RzIHN1cHBvcnRlZCBieSByZWN2bXNnKCkKKyAqLworCisjZGVmaW5lIFRJUENfRVJSSU5GTwkxCS8qIGVycm9yIGluZm8gKi8KKyNkZWZpbmUgVElQQ19SRVREQVRBCTIJLyogcmV0dXJuZWQgZGF0YSAqLworI2RlZmluZSBUSVBDX0RFU1ROQU1FCTMJLyogZGVzdGluYXRpb24gbmFtZSAqLworCisvKgorICogVElQQy1zcGVjaWZpYyBzb2NrZXQgb3B0aW9uIHZhbHVlcworICovCisKKyNkZWZpbmUgVElQQ19JTVBPUlRBTkNFCQkxMjcJLyogRGVmYXVsdDogVElQQ19MT1dfSU1QT1JUQU5DRSAqLworI2RlZmluZSBUSVBDX1NSQ19EUk9QUEFCTEUJMTI4CS8qIERlZmF1bHQ6IGJhc2VkIG9uIHNvY2tldCB0eXBlICovCisjZGVmaW5lIFRJUENfREVTVF9EUk9QUEFCTEUJMTI5CS8qIERlZmF1bHQ6IGJhc2VkIG9uIHNvY2tldCB0eXBlICovCisjZGVmaW5lIFRJUENfQ09OTl9USU1FT1VUCTEzMAkvKiBEZWZhdWx0OiA4MDAwIChtcykgICovCisjZGVmaW5lIFRJUENfTk9ERV9SRUNWUV9ERVBUSAkxMzEJLyogRGVmYXVsdDogbm9uZSAocmVhZCBvbmx5KSAqLworI2RlZmluZSBUSVBDX1NPQ0tfUkVDVlFfREVQVEgJMTMyCS8qIERlZmF1bHQ6IG5vbmUgKHJlYWQgb25seSkgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyNTlmZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGlwY19jb25maWcuaApAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvdGlwY19jb25maWcuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNywgMjAxMC0yMDExLCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1RJUENfQ09ORklHX0hfCisjZGVmaW5lIF9MSU5VWF9USVBDX0NPTkZJR19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4gLyogZm9yIG50b2hzIGV0Yy4gKi8KKworLyoKKyAqIENvbmZpZ3VyYXRpb24KKyAqCisgKiBBbGwgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IG1lc3NhZ2luZyBpbnZvbHZlcyBzZW5kaW5nIGEgcmVxdWVzdCBtZXNzYWdlCisgKiB0byB0aGUgVElQQyBjb25maWd1cmF0aW9uIHNlcnZpY2Ugb24gYSBub2RlLCB3aGljaCBzZW5kcyBhIHJlcGx5IG1lc3NhZ2UKKyAqIGJhY2suICAoSW4gdGhlIGZ1dHVyZSBtdWx0aS1tZXNzYWdlIHJlcGxpZXMgbWF5IGJlIHN1cHBvcnRlZC4pCisgKgorICogQm90aCByZXF1ZXN0IGFuZCByZXBseSBtZXNzYWdlcyBjb25zaXN0IG9mIGEgdHJhbnNwb3J0IGhlYWRlciBhbmQgcGF5bG9hZC4KKyAqIFRoZSB0cmFuc3BvcnQgaGVhZGVyIGNvbnRhaW5zIGluZm8gYWJvdXQgdGhlIGRlc2lyZWQgb3BlcmF0aW9uOworICogdGhlIHBheWxvYWQgY29uc2lzdHMgb2YgemVybyBvciBtb3JlIHR5cGUvbGVuZ3RoL3ZhbHVlIChUTFYpIGl0ZW1zCisgKiB3aGljaCBzcGVjaWZ5IHBhcmFtZXRlcnMgb3IgcmVzdWx0cyBmb3IgdGhlIG9wZXJhdGlvbi4KKyAqCisgKiBGb3IgbWFueSBvcGVyYXRpb25zLCB0aGUgcmVxdWVzdCBhbmQgcmVwbHkgbWVzc2FnZXMgaGF2ZSBhIGZpeGVkIG51bWJlcgorICogb2YgVExWcyAodXN1YWxseSB6ZXJvIG9yIG9uZSk7IGhvd2V2ZXIsIHNvbWUgcmVwbHkgbWVzc2FnZXMgbWF5IHJldHVybgorICogYSB2YXJpYWJsZSBudW1iZXIgb2YgVExWcy4gIEEgZmFpbGVkIHJlcXVlc3QgaXMgZGVub3RlZCBieSB0aGUgcHJlc2VuY2UKKyAqIG9mIGFuICJlcnJvciBzdHJpbmciIFRMViBpbiB0aGUgcmVwbHkgbWVzc2FnZSBpbnN0ZWFkIG9mIHRoZSBUTFYocykgdGhlCisgKiByZXBseSBzaG91bGQgY29udGFpbiBpZiB0aGUgcmVxdWVzdCBzdWNjZWVkcy4KKyAqLworCisvKgorICogUHVibGljIGNvbW1hbmRzOgorICogTWF5IGJlIGlzc3VlZCBieSBhbnkgcHJvY2Vzcy4KKyAqIEFjY2VwdGVkIGJ5IG93biBub2RlLCBvciBieSByZW1vdGUgbm9kZSBvbmx5IGlmIHJlbW90ZSBtYW5hZ2VtZW50IGVuYWJsZWQuCisgKi8KKworI2RlZmluZSAgVElQQ19DTURfTk9PUCAgICAgICAgICAgICAgMHgwMDAwICAgIC8qIHR4IG5vbmUsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9OT0RFUyAgICAgICAgIDB4MDAwMSAgICAvKiB0eCBuZXRfYWRkciwgcnggbm9kZV9pbmZvKHMpICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUVESUFfTkFNRVMgICAweDAwMDIgICAgLyogdHggbm9uZSwgcnggbWVkaWFfbmFtZShzKSAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX0JFQVJFUl9OQU1FUyAgMHgwMDAzICAgIC8qIHR4IG5vbmUsIHJ4IGJlYXJlcl9uYW1lKHMpICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTElOS1MgICAgICAgICAweDAwMDQgICAgLyogdHggbmV0X2FkZHIsIHJ4IGxpbmtfaW5mbyhzKSAqLworI2RlZmluZSAgVElQQ19DTURfU0hPV19OQU1FX1RBQkxFICAgMHgwMDA1ICAgIC8qIHR4IG5hbWVfdGJsX3F1ZXJ5LCByeCB1bHRyYV9zdHJpbmcgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NIT1dfUE9SVFMgICAgICAgIDB4MDAwNiAgICAvKiB0eCBub25lLCByeCB1bHRyYV9zdHJpbmcgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NIT1dfTElOS19TVEFUUyAgIDB4MDAwQiAgICAvKiB0eCBsaW5rX25hbWUsIHJ4IHVsdHJhX3N0cmluZyAqLworI2RlZmluZSAgVElQQ19DTURfU0hPV19TVEFUUyAgICAgICAgMHgwMDBGICAgIC8qIHR4IHVuc2lnbmVkLCByeCB1bHRyYV9zdHJpbmcgKi8KKworLyoKKyAqIFByb3RlY3RlZCBjb21tYW5kczoKKyAqIE1heSBvbmx5IGJlIGlzc3VlZCBieSAibmV0d29yayBhZG1pbmlzdHJhdGlvbiBjYXBhYmxlIiBwcm9jZXNzLgorICogQWNjZXB0ZWQgYnkgb3duIG5vZGUsIG9yIGJ5IHJlbW90ZSBub2RlIG9ubHkgaWYgcmVtb3RlIG1hbmFnZW1lbnQgZW5hYmxlZAorICogYW5kIHRoaXMgbm9kZSBpcyB6b25lIG1hbmFnZXIuCisgKi8KKworI2RlZmluZSAgVElQQ19DTURfR0VUX1JFTU9URV9NTkcgICAgMHg0MDAzICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX1BPUlRTICAgICAweDQwMDQgICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9NQVhfUFVCTCAgICAgIDB4NDAwNSAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9TVUJTQ1IgICAgMHg0MDA2ICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX1pPTkVTICAgICAweDQwMDcgICAgLyogb2Jzb2xldGVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX0NMVVNURVJTICAweDQwMDggICAgLyogb2Jzb2xldGVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX05PREVTICAgICAweDQwMDkgICAgLyogb2Jzb2xldGVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX1NMQVZFUyAgICAweDQwMEEgICAgLyogb2Jzb2xldGVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTkVUSUQgICAgICAgICAweDQwMEIgICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKworI2RlZmluZSAgVElQQ19DTURfRU5BQkxFX0JFQVJFUiAgICAgMHg0MTAxICAgIC8qIHR4IGJlYXJlcl9jb25maWcsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0RJU0FCTEVfQkVBUkVSICAgIDB4NDEwMiAgICAvKiB0eCBiZWFyZXJfbmFtZSwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX0xJTktfVE9MICAgICAgMHg0MTA3ICAgIC8qIHR4IGxpbmtfY29uZmlnLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTElOS19QUkkgICAgICAweDQxMDggICAgLyogdHggbGlua19jb25maWcsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9MSU5LX1dJTkRPVyAgIDB4NDEwOSAgICAvKiB0eCBsaW5rX2NvbmZpZywgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX0xPR19TSVpFICAgICAgMHg0MTBBICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9EVU1QX0xPRyAgICAgICAgICAweDQxMEIgICAgLyogdHggbm9uZSwgcnggdWx0cmFfc3RyaW5nICovCisjZGVmaW5lICBUSVBDX0NNRF9SRVNFVF9MSU5LX1NUQVRTICAweDQxMEMgICAgLyogdHggbGlua19uYW1lLCByeCBub25lICovCisKKy8qCisgKiBQcml2YXRlIGNvbW1hbmRzOgorICogTWF5IG9ubHkgYmUgaXNzdWVkIGJ5ICJuZXR3b3JrIGFkbWluaXN0cmF0aW9uIGNhcGFibGUiIHByb2Nlc3MuCisgKiBBY2NlcHRlZCBieSBvd24gbm9kZSBvbmx5OyBjYW5ub3QgYmUgdXNlZCBvbiBhIHJlbW90ZSBub2RlLgorICovCisKKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9OT0RFX0FERFIgICAgIDB4ODAwMSAgICAvKiB0eCBuZXRfYWRkciwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX1JFTU9URV9NTkcgICAgMHg4MDAzICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX1BPUlRTICAgICAweDgwMDQgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9NQVhfUFVCTCAgICAgIDB4ODAwNSAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9TVUJTQ1IgICAgMHg4MDA2ICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX1pPTkVTICAgICAweDgwMDcgICAgLyogb2Jzb2xldGVkICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX0NMVVNURVJTICAweDgwMDggICAgLyogb2Jzb2xldGVkICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX05PREVTICAgICAweDgwMDkgICAgLyogb2Jzb2xldGVkICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX1NMQVZFUyAgICAweDgwMEEgICAgLyogb2Jzb2xldGVkICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTkVUSUQgICAgICAgICAweDgwMEIgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKworLyoKKyAqIFJlc2VydmVkIGNvbW1hbmRzOgorICogTWF5IG5vdCBiZSBpc3N1ZWQgYnkgYW55IHByb2Nlc3MuCisgKiBVc2VkIGludGVybmFsbHkgYnkgVElQQy4KKyAqLworCisjZGVmaW5lICBUSVBDX0NNRF9OT1RfTkVUX0FETUlOICAgICAweEMwMDEgICAgLyogdHggbm9uZSwgcnggbm9uZSAqLworCisvKgorICogVExWIHR5cGVzIGRlZmluZWQgZm9yIFRJUEMKKyAqLworCisjZGVmaW5lIFRJUENfVExWX05PTkUJCTAJLyogbm8gVExWIHByZXNlbnQgKi8KKyNkZWZpbmUgVElQQ19UTFZfVk9JRAkJMQkvKiBlbXB0eSBUTFYgKDAgZGF0YSBieXRlcykqLworI2RlZmluZSBUSVBDX1RMVl9VTlNJR05FRAkyCS8qIDMyLWJpdCBpbnRlZ2VyICovCisjZGVmaW5lIFRJUENfVExWX1NUUklORwkJMwkvKiBjaGFyWzEyOF0gKG1heCkgKi8KKyNkZWZpbmUgVElQQ19UTFZfTEFSR0VfU1RSSU5HCTQJLyogY2hhclsyMDQ4XSAobWF4KSAqLworI2RlZmluZSBUSVBDX1RMVl9VTFRSQV9TVFJJTkcJNQkvKiBjaGFyWzMyNzY4XSAobWF4KSAqLworCisjZGVmaW5lIFRJUENfVExWX0VSUk9SX1NUUklORwkxNgkvKiBjaGFyWzEyOF0gY29udGFpbmluZyAiZXJyb3IgY29kZSIgKi8KKyNkZWZpbmUgVElQQ19UTFZfTkVUX0FERFIJMTcJLyogMzItYml0IGludGVnZXIgZGVub3RpbmcgPFouQy5OPiAqLworI2RlZmluZSBUSVBDX1RMVl9NRURJQV9OQU1FCTE4CS8qIGNoYXJbVElQQ19NQVhfTUVESUFfTkFNRV0gKi8KKyNkZWZpbmUgVElQQ19UTFZfQkVBUkVSX05BTUUJMTkJLyogY2hhcltUSVBDX01BWF9CRUFSRVJfTkFNRV0gKi8KKyNkZWZpbmUgVElQQ19UTFZfTElOS19OQU1FCTIwCS8qIGNoYXJbVElQQ19NQVhfTElOS19OQU1FXSAqLworI2RlZmluZSBUSVBDX1RMVl9OT0RFX0lORk8JMjEJLyogc3RydWN0IHRpcGNfbm9kZV9pbmZvICovCisjZGVmaW5lIFRJUENfVExWX0xJTktfSU5GTwkyMgkvKiBzdHJ1Y3QgdGlwY19saW5rX2luZm8gKi8KKyNkZWZpbmUgVElQQ19UTFZfQkVBUkVSX0NPTkZJRwkyMwkvKiBzdHJ1Y3QgdGlwY19iZWFyZXJfY29uZmlnICovCisjZGVmaW5lIFRJUENfVExWX0xJTktfQ09ORklHCTI0CS8qIHN0cnVjdCB0aXBjX2xpbmtfY29uZmlnICovCisjZGVmaW5lIFRJUENfVExWX05BTUVfVEJMX1FVRVJZCTI1CS8qIHN0cnVjdCB0aXBjX25hbWVfdGFibGVfcXVlcnkgKi8KKyNkZWZpbmUgVElQQ19UTFZfUE9SVF9SRUYJMjYJLyogMzItYml0IHBvcnQgcmVmZXJlbmNlICovCisKKy8qCisgKiBNYXhpbXVtIHNpemVzIG9mIFRJUEMgYmVhcmVyLXJlbGF0ZWQgbmFtZXMgKGluY2x1ZGluZyB0ZXJtaW5hdGluZyBOVUwpCisgKi8KKworI2RlZmluZSBUSVBDX01BWF9NRURJQV9OQU1FCTE2CS8qIGZvcm1hdCA9IG1lZGlhICovCisjZGVmaW5lIFRJUENfTUFYX0lGX05BTUUJMTYJLyogZm9ybWF0ID0gaW50ZXJmYWNlICovCisjZGVmaW5lIFRJUENfTUFYX0JFQVJFUl9OQU1FCTMyCS8qIGZvcm1hdCA9IG1lZGlhOmludGVyZmFjZSAqLworI2RlZmluZSBUSVBDX01BWF9MSU5LX05BTUUJNjAJLyogZm9ybWF0ID0gWi5DLk46aW50ZXJmYWNlLVouQy5OOmludGVyZmFjZSAqLworCisvKgorICogTGluayBwcmlvcml0eSBsaW1pdHMgKG1pbiwgZGVmYXVsdCwgbWF4LCBtZWRpYSBkZWZhdWx0KQorICovCisKKyNkZWZpbmUgVElQQ19NSU5fTElOS19QUkkJMAorI2RlZmluZSBUSVBDX0RFRl9MSU5LX1BSSQkxMAorI2RlZmluZSBUSVBDX01BWF9MSU5LX1BSSQkzMQorI2RlZmluZSBUSVBDX01FRElBX0xJTktfUFJJCShUSVBDX01BWF9MSU5LX1BSSSArIDEpCisKKy8qCisgKiBMaW5rIHRvbGVyYW5jZSBsaW1pdHMgKG1pbiwgZGVmYXVsdCwgbWF4KSwgaW4gbXMKKyAqLworCisjZGVmaW5lIFRJUENfTUlOX0xJTktfVE9MIDUwCisjZGVmaW5lIFRJUENfREVGX0xJTktfVE9MIDE1MDAKKyNkZWZpbmUgVElQQ19NQVhfTElOS19UT0wgMzAwMDAKKworI2lmIChUSVBDX01JTl9MSU5LX1RPTCA8IDE2KQorI2Vycm9yICJUSVBDX01JTl9MSU5LX1RPTCBpcyB0b28gc21hbGwgKGFib3J0IGxpbWl0IG1heSBiZSBOYU4pIgorI2VuZGlmCisKKy8qCisgKiBMaW5rIHdpbmRvdyBsaW1pdHMgKG1pbiwgZGVmYXVsdCwgbWF4KSwgaW4gcGFja2V0cworICovCisKKyNkZWZpbmUgVElQQ19NSU5fTElOS19XSU4gMTYKKyNkZWZpbmUgVElQQ19ERUZfTElOS19XSU4gNTAKKyNkZWZpbmUgVElQQ19NQVhfTElOS19XSU4gMTUwCisKKworc3RydWN0IHRpcGNfbm9kZV9pbmZvIHsKKwlfX2JlMzIgYWRkcjsJCQkvKiBuZXR3b3JrIGFkZHJlc3Mgb2Ygbm9kZSAqLworCV9fYmUzMiB1cDsJCQkvKiAwPWRvd24sIDE9IHVwICovCit9OworCitzdHJ1Y3QgdGlwY19saW5rX2luZm8geworCV9fYmUzMiBkZXN0OwkJCS8qIG5ldHdvcmsgYWRkcmVzcyBvZiBwZWVyIG5vZGUgKi8KKwlfX2JlMzIgdXA7CQkJLyogMD1kb3duLCAxPXVwICovCisJY2hhciBzdHJbVElQQ19NQVhfTElOS19OQU1FXTsJLyogbGluayBuYW1lICovCit9OworCitzdHJ1Y3QgdGlwY19iZWFyZXJfY29uZmlnIHsKKwlfX2JlMzIgcHJpb3JpdHk7CQkvKiBSYW5nZSBbMSwzMV0uIE92ZXJyaWRlIHBlciBsaW5rICAqLworCV9fYmUzMiBkaXNjX2RvbWFpbjsJCS8qIDxaLkMuTj4gZGVzY3JpYmluZyBkZXNpcmVkIG5vZGVzICovCisJY2hhciBuYW1lW1RJUENfTUFYX0JFQVJFUl9OQU1FXTsKK307CisKK3N0cnVjdCB0aXBjX2xpbmtfY29uZmlnIHsKKwlfX2JlMzIgdmFsdWU7CisJY2hhciBuYW1lW1RJUENfTUFYX0xJTktfTkFNRV07Cit9OworCisjZGVmaW5lIFRJUENfTlRRX0FMTFRZUEVTIDB4ODAwMDAwMDAKKworc3RydWN0IHRpcGNfbmFtZV90YWJsZV9xdWVyeSB7CisJX19iZTMyIGRlcHRoOwkvKiAxOnR5cGUsIDI6K25hbWUgaW5mbywgMzorcG9ydCBpbmZvLCA0KzorZGVidWcgaW5mbyAqLworCV9fYmUzMiB0eXBlOwkvKiB7dCxsLHV9IGluZm8gaWdub3JlZCBpZiBoaWdoIGJpdCBvZiAiZGVwdGgiIGlzIHNldCAqLworCV9fYmUzMiBsb3dib3VuZDsgLyogKGkuZS4gZGlzcGxheXMgYWxsIGVudHJpZXMgb2YgbmFtZSB0YWJsZSkgKi8KKwlfX2JlMzIgdXBib3VuZDsKK307CisKKy8qCisgKiBUaGUgZXJyb3Igc3RyaW5nIFRMViBpcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY2F1c2UKKyAqIG9mIHRoZSByZXF1ZXN0IGZhaWx1cmUuICBUbyBzaW1wbGlmeSBlcnJvciBwcm9jZXNzaW5nIChhbmQgdG8gc2F2ZSBzcGFjZSkKKyAqIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBjYW4gYmUgYSBzcGVjaWFsIGVycm9yIGNvZGUgY2hhcmFjdGVyCisgKiAobHlpbmcgYnkgdGhlIHJhbmdlIDB4ODAgdG8gMHhGRikgd2hpY2ggcmVwcmVzZW50cyBhIHByZS1kZWZpbmVkIHJlYXNvbi4KKyAqLworCisjZGVmaW5lIFRJUENfQ0ZHX1RMVl9FUlJPUiAgICAgICJceDgwIiAgLyogcmVxdWVzdCBjb250YWlucyBpbmNvcnJlY3QgVExWKHMpICovCisjZGVmaW5lIFRJUENfQ0ZHX05PVF9ORVRfQURNSU4gICJceDgxIgkvKiBtdXN0IGJlIG5ldHdvcmsgYWRtaW5pc3RyYXRvciAqLworI2RlZmluZSBUSVBDX0NGR19OT1RfWk9ORV9NU1RSCSJceDgyIgkvKiBtdXN0IGJlIHpvbmUgbWFzdGVyICovCisjZGVmaW5lIFRJUENfQ0ZHX05PX1JFTU9URQkiXHg4MyIJLyogcmVtb3RlIG1hbmFnZW1lbnQgbm90IGVuYWJsZWQgKi8KKyNkZWZpbmUgVElQQ19DRkdfTk9UX1NVUFBPUlRFRCAgIlx4ODQiCS8qIHJlcXVlc3QgaXMgbm90IHN1cHBvcnRlZCBieSBUSVBDICovCisjZGVmaW5lIFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUgICJceDg1IiAgLyogcmVxdWVzdCBoYXMgaW52YWxpZCBhcmd1bWVudCB2YWx1ZSAqLworCisvKgorICogQSBUTFYgY29uc2lzdHMgb2YgYSBkZXNjcmlwdG9yLCBmb2xsb3dlZCBieSB0aGUgVExWIHZhbHVlLgorICogVExWIGRlc2NyaXB0b3IgZmllbGRzIGFyZSBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyOworICogVExWIHZhbHVlcyBtdXN0IGFsc28gYmUgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAod2hlcmUgYXBwbGljYWJsZSkuCisgKiBUTFYgZGVzY3JpcHRvcnMgbXVzdCBiZSBhbGlnbmVkIHRvIGFkZHJlc3NlcyB3aGljaCBhcmUgbXVsdGlwbGUgb2YgNCwKKyAqIHNvIHVwIHRvIDMgYnl0ZXMgb2YgcGFkZGluZyBtYXkgZXhpc3QgYXQgdGhlIGVuZCBvZiB0aGUgVExWIHZhbHVlIGFyZWEuCisgKiBUaGVyZSBtdXN0IG5vdCBiZSBhbnkgcGFkZGluZyBiZXR3ZWVuIHRoZSBUTFYgZGVzY3JpcHRvciBhbmQgaXRzIHZhbHVlLgorICovCisKK3N0cnVjdCB0bHZfZGVzYyB7CisJX19iZTE2IHRsdl9sZW47CQkvKiBUTFYgbGVuZ3RoIChkZXNjcmlwdG9yICsgdmFsdWUpICovCisJX19iZTE2IHRsdl90eXBlOwkJLyogVExWIGlkZW50aWZpZXIgKi8KK307CisKKyNkZWZpbmUgVExWX0FMSUdOVE8gNAorCisjZGVmaW5lIFRMVl9BTElHTihkYXRhbGVuKSAoKChkYXRhbGVuKSsoVExWX0FMSUdOVE8tMSkpICYgfihUTFZfQUxJR05UTy0xKSkKKyNkZWZpbmUgVExWX0xFTkdUSChkYXRhbGVuKSAoc2l6ZW9mKHN0cnVjdCB0bHZfZGVzYykgKyAoZGF0YWxlbikpCisjZGVmaW5lIFRMVl9TUEFDRShkYXRhbGVuKSAoVExWX0FMSUdOKFRMVl9MRU5HVEgoZGF0YWxlbikpKQorI2RlZmluZSBUTFZfREFUQSh0bHYpICgodm9pZCAqKSgoY2hhciAqKSh0bHYpICsgVExWX0xFTkdUSCgwKSkpCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBUTFZfT0soY29uc3Qgdm9pZCAqdGx2LCBfX3UxNiBzcGFjZSkKK3sKKwkvKgorCSAqIFdvdWxkIGFsc28gbGlrZSB0byBjaGVjayB0aGF0ICJ0bHYiIGlzIGEgbXVsdGlwbGUgb2YgNCwKKwkgKiBidXQgZG9uJ3Qga25vdyBob3cgdG8gZG8gdGhpcyBpbiBhIHBvcnRhYmxlIHdheS4KKwkgKiAtIFRyaWVkIGRvaW5nICghKHRsdiAmIChUTFZfQUxJR05UTy0xKSkpLCBidXQgR0NDIGNvbXBpbGVyCisJICogICB3b24ndCBhbGxvdyBiaW5hcnkgIiYiIHdpdGggYSBwb2ludGVyLgorCSAqIC0gVHJpZWQgY2FzdGluZyAidGx2IiB0byBpbnRlZ2VyIHR5cGUsIGJ1dCBjYXVzZXMgd2FybmluZyBhYm91dCBzaXplCisJICogICBtaXNtYXRjaCB3aGVuIHBvaW50ZXIgaXMgYmlnZ2VyIHRoYW4gY2hvc2VuIHR5cGUgKGludCwgbG9uZywgLi4uKS4KKwkgKi8KKworCXJldHVybiAoc3BhY2UgPj0gVExWX1NQQUNFKDApKSAmJgorCQkobnRvaHMoKChzdHJ1Y3QgdGx2X2Rlc2MgKil0bHYpLT50bHZfbGVuKSA8PSBzcGFjZSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBUTFZfQ0hFQ0soY29uc3Qgdm9pZCAqdGx2LCBfX3UxNiBzcGFjZSwgX191MTYgZXhwX3R5cGUpCit7CisJcmV0dXJuIFRMVl9PSyh0bHYsIHNwYWNlKSAmJgorCQkobnRvaHMoKChzdHJ1Y3QgdGx2X2Rlc2MgKil0bHYpLT50bHZfdHlwZSkgPT0gZXhwX3R5cGUpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgVExWX1NFVCh2b2lkICp0bHYsIF9fdTE2IHR5cGUsIHZvaWQgKmRhdGEsIF9fdTE2IGxlbikKK3sKKwlzdHJ1Y3QgdGx2X2Rlc2MgKnRsdl9wdHI7CisJaW50IHRsdl9sZW47CisKKwl0bHZfbGVuID0gVExWX0xFTkdUSChsZW4pOworCXRsdl9wdHIgPSAoc3RydWN0IHRsdl9kZXNjICopdGx2OworCXRsdl9wdHItPnRsdl90eXBlID0gaHRvbnModHlwZSk7CisJdGx2X3B0ci0+dGx2X2xlbiAgPSBodG9ucyh0bHZfbGVuKTsKKwlpZiAobGVuICYmIGRhdGEpCisJCW1lbWNweShUTFZfREFUQSh0bHZfcHRyKSwgZGF0YSwgdGx2X2xlbik7CisJcmV0dXJuIFRMVl9TUEFDRShsZW4pOworfQorCisvKgorICogQSBUTFYgbGlzdCBkZXNjcmlwdG9yIHNpbXBsaWZpZXMgcHJvY2Vzc2luZyBvZiBtZXNzYWdlcworICogY29udGFpbmluZyBtdWx0aXBsZSBUTFZzLgorICovCisKK3N0cnVjdCB0bHZfbGlzdF9kZXNjIHsKKwlzdHJ1Y3QgdGx2X2Rlc2MgKnRsdl9wdHI7CS8qIHB0ciB0byBjdXJyZW50IFRMViAqLworCV9fdTMyIHRsdl9zcGFjZTsJCS8qICMgYnl0ZXMgZnJvbSBjdXJyIFRMViB0byBsaXN0IGVuZCAqLworfTsKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBUTFZfTElTVF9JTklUKHN0cnVjdCB0bHZfbGlzdF9kZXNjICpsaXN0LAorCQkJCSB2b2lkICpkYXRhLCBfX3UzMiBzcGFjZSkKK3sKKwlsaXN0LT50bHZfcHRyID0gKHN0cnVjdCB0bHZfZGVzYyAqKWRhdGE7CisJbGlzdC0+dGx2X3NwYWNlID0gc3BhY2U7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBUTFZfTElTVF9FTVBUWShzdHJ1Y3QgdGx2X2xpc3RfZGVzYyAqbGlzdCkKK3sKKwlyZXR1cm4gKGxpc3QtPnRsdl9zcGFjZSA9PSAwKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IFRMVl9MSVNUX0NIRUNLKHN0cnVjdCB0bHZfbGlzdF9kZXNjICpsaXN0LCBfX3UxNiBleHBfdHlwZSkKK3sKKwlyZXR1cm4gVExWX0NIRUNLKGxpc3QtPnRsdl9wdHIsIGxpc3QtPnRsdl9zcGFjZSwgZXhwX3R5cGUpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkICpUTFZfTElTVF9EQVRBKHN0cnVjdCB0bHZfbGlzdF9kZXNjICpsaXN0KQoreworCXJldHVybiBUTFZfREFUQShsaXN0LT50bHZfcHRyKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBUTFZfTElTVF9TVEVQKHN0cnVjdCB0bHZfbGlzdF9kZXNjICpsaXN0KQoreworCV9fdTE2IHRsdl9zcGFjZSA9IFRMVl9BTElHTihudG9ocyhsaXN0LT50bHZfcHRyLT50bHZfbGVuKSk7CisKKwlsaXN0LT50bHZfcHRyID0gKHN0cnVjdCB0bHZfZGVzYyAqKSgoY2hhciAqKWxpc3QtPnRsdl9wdHIgKyB0bHZfc3BhY2UpOworCWxpc3QtPnRsdl9zcGFjZSAtPSB0bHZfc3BhY2U7Cit9CisKKy8qCisgKiBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGV4Y2hhbmdlZCB2aWEgTkVUTElOS19HRU5FUklDIHVzZSB0aGUgZm9sbG93aW5nCisgKiBmYW1pbHkgaWQsIG5hbWUsIHZlcnNpb24gYW5kIGNvbW1hbmQuCisgKi8KKyNkZWZpbmUgVElQQ19HRU5MX05BTUUJCSJUSVBDIgorI2RlZmluZSBUSVBDX0dFTkxfVkVSU0lPTgkweDEKKyNkZWZpbmUgVElQQ19HRU5MX0NNRAkJMHgxCisKKy8qCisgKiBUSVBDIHNwZWNpZmljIGhlYWRlciB1c2VkIGluIE5FVExJTktfR0VORVJJQyByZXF1ZXN0cy4KKyAqLworc3RydWN0IHRpcGNfZ2VubG1zZ2hkciB7CisJX191MzIgZGVzdDsJCS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlfX3UxNiBjbWQ7CQkvKiBDb21tYW5kICovCisJX191MTYgcmVzZXJ2ZWQ7CQkvKiBVbnVzZWQgKi8KK307CisKKyNkZWZpbmUgVElQQ19HRU5MX0hEUkxFTglOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHRpcGNfZ2VubG1zZ2hkcikpCisKKy8qCisgKiBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGV4Y2hhbmdlZCB2aWEgVElQQyBzb2NrZXRzIHVzZSB0aGUgVElQQyBjb25maWd1cmF0aW9uCisgKiBtZXNzYWdlIGhlYWRlciwgd2hpY2ggaXMgZGVmaW5lZCBiZWxvdy4gIFRoaXMgc3RydWN0dXJlIGlzIGFuYWxvZ291cworICogdG8gdGhlIE5ldGxpbmsgbWVzc2FnZSBoZWFkZXIsIGJ1dCBmaWVsZHMgYXJlIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKKyAqIGFuZCBubyBwYWRkaW5nIGlzIHBlcm1pdHRlZCBiZXR3ZWVuIHRoZSBoZWFkZXIgYW5kIHRoZSBtZXNzYWdlIGRhdGEKKyAqIHRoYXQgZm9sbG93cy4KKyAqLworCitzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciB7CisJX19iZTMyIHRjbV9sZW47CQkvKiBNZXNzYWdlIGxlbmd0aCAoaW5jbHVkaW5nIGhlYWRlcikgKi8KKwlfX2JlMTYgdGNtX3R5cGU7CS8qIENvbW1hbmQgdHlwZSAqLworCV9fYmUxNiB0Y21fZmxhZ3M7CS8qIEFkZGl0aW9uYWwgZmxhZ3MgKi8KKwljaGFyICB0Y21fcmVzZXJ2ZWRbOF07CS8qIFVudXNlZCAqLworfTsKKworI2RlZmluZSBUQ01fRl9SRVFVRVNUCTB4MQkvKiBGbGFnOiBSZXF1ZXN0IG1lc3NhZ2UgKi8KKyNkZWZpbmUgVENNX0ZfTU9SRQkweDIJLyogRmxhZzogTWVzc2FnZSB0byBiZSBjb250aW51ZWQgKi8KKworI2RlZmluZSBUQ01fQUxJR04oZGF0YWxlbikgICgoKGRhdGFsZW4pKzMpICYgfjMpCisjZGVmaW5lIFRDTV9MRU5HVEgoZGF0YWxlbikgKHNpemVvZihzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkcikgKyBkYXRhbGVuKQorI2RlZmluZSBUQ01fU1BBQ0UoZGF0YWxlbikgIChUQ01fQUxJR04oVENNX0xFTkdUSChkYXRhbGVuKSkpCisjZGVmaW5lIFRDTV9EQVRBKHRjbV9oZHIpICAgKCh2b2lkICopKChjaGFyICopKHRjbV9oZHIpICsgVENNX0xFTkdUSCgwKSkpCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBUQ01fU0VUKHZvaWQgKm1zZywgX191MTYgY21kLCBfX3UxNiBmbGFncywKKwkJCSAgdm9pZCAqZGF0YSwgX191MTYgZGF0YV9sZW4pCit7CisJc3RydWN0IHRpcGNfY2ZnX21zZ19oZHIgKnRjbV9oZHI7CisJaW50IG1zZ19sZW47CisKKwltc2dfbGVuID0gVENNX0xFTkdUSChkYXRhX2xlbik7CisJdGNtX2hkciA9IChzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciAqKW1zZzsKKwl0Y21faGRyLT50Y21fbGVuICAgPSBodG9ubChtc2dfbGVuKTsKKwl0Y21faGRyLT50Y21fdHlwZSAgPSBodG9ucyhjbWQpOworCXRjbV9oZHItPnRjbV9mbGFncyA9IGh0b25zKGZsYWdzKTsKKwlpZiAoZGF0YV9sZW4gJiYgZGF0YSkKKwkJbWVtY3B5KFRDTV9EQVRBKG1zZyksIGRhdGEsIGRhdGFfbGVuKTsKKwlyZXR1cm4gVENNX1NQQUNFKGRhdGFfbGVuKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Rvc2hpYmEuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdG9zaGliYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjUyN2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Rvc2hpYmEuaApAQCAtMCwwICsxLDM3IEBACisvKiB0b3NoaWJhLmggLS0gTGludXggZHJpdmVyIGZvciBhY2Nlc3NpbmcgdGhlIFNNTSBvbiBUb3NoaWJhIGxhcHRvcHMgCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDAgIEpvbmF0aGFuIEEuIEJ1enphcmQgKGpvbmF0aGFuQGJ1enphcmQub3JnLnVrKQorICoKKyAqIFRoYW5rcyB0byBKdWVyZ2VuIEhlaW56bCA8anVlcmdlbkBtb25vY2VydXMuZGVtb24uY28udWs+IGZvciB0aGUgcG9pbnRlcnMKKyAqIG9uIG1ha2luZyBzdXJlIHRoZSBzdHJ1Y3R1cmUgaXMgYWxpZ25lZCBhbmQgcGFja2VkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfVE9TSElCQV9ICisjZGVmaW5lIF9MSU5VWF9UT1NISUJBX0gKKworI2RlZmluZSBUT1NIX1BST0MgIi9wcm9jL3Rvc2hpYmEiCisjZGVmaW5lIFRPU0hfREVWSUNFICIvZGV2L3Rvc2hpYmEiCisjZGVmaW5lIFRPU0hfU01NIF9JT1dSKCd0JywgMHg5MCwgaW50KQkvKiBicm9rZW46IG1lYW50IDI0IGJ5dGVzICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgZWF4OworCXVuc2lnbmVkIGludCBlYnggX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCXVuc2lnbmVkIGludCBlY3ggX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCXVuc2lnbmVkIGludCBlZHggX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCXVuc2lnbmVkIGludCBlc2kgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCXVuc2lnbmVkIGludCBlZGkgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBTTU1SZWdpc3RlcnM7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3R0eS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90dHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmRiZWRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90dHkuaApAQCAtMCwwICsxLDM4IEBACisjaWZuZGVmIF9MSU5VWF9UVFlfSAorI2RlZmluZSBfTElOVVhfVFRZX0gKKworLyoKKyAqICd0dHkuaCcgZGVmaW5lcyBzb21lIHN0cnVjdHVyZXMgdXNlZCBieSB0dHlfaW8uYyBhbmQgc29tZSBkZWZpbmVzLgorICovCisKKyNkZWZpbmUgTlJfTERJU0NTCQkzMAorCisvKiBsaW5lIGRpc2NpcGxpbmVzICovCisjZGVmaW5lIE5fVFRZCQkwCisjZGVmaW5lIE5fU0xJUAkJMQorI2RlZmluZSBOX01PVVNFCQkyCisjZGVmaW5lIE5fUFBQCQkzCisjZGVmaW5lIE5fU1RSSVAJCTQKKyNkZWZpbmUgTl9BWDI1CQk1CisjZGVmaW5lIE5fWDI1CQk2CS8qIFguMjUgYXN5bmMgKi8KKyNkZWZpbmUgTl82UEFDSwkJNworI2RlZmluZSBOX01BU0MJCTgJLyogUmVzZXJ2ZWQgZm9yIE1vYml0ZXggbW9kdWxlIDxrYXpAY2FmZS5uZXQ+ICovCisjZGVmaW5lIE5fUjM5NjQJCTkJLyogUmVzZXJ2ZWQgZm9yIFNpbWF0aWMgUjM5NjQgbW9kdWxlICovCisjZGVmaW5lIE5fUFJPRklCVVNfRkRMCTEwCS8qIFJlc2VydmVkIGZvciBQcm9maWJ1cyAqLworI2RlZmluZSBOX0lSREEJCTExCS8qIExpbnV4IElyRGEgLSBodHRwOi8vaXJkYS5zb3VyY2Vmb3JnZS5uZXQvICovCisjZGVmaW5lIE5fU01TQkxPQ0sJMTIJLyogU01TIGJsb2NrIG1vZGUgLSBmb3IgdGFsa2luZyB0byBHU00gZGF0YSAqLworCQkJCS8qIGNhcmRzIGFib3V0IFNNUyBtZXNzYWdlcyAqLworI2RlZmluZSBOX0hETEMJCTEzCS8qIHN5bmNocm9ub3VzIEhETEMgKi8KKyNkZWZpbmUgTl9TWU5DX1BQUAkxNAkvKiBzeW5jaHJvbm91cyBQUFAgKi8KKyNkZWZpbmUgTl9IQ0kJCTE1CS8qIEJsdWV0b290aCBIQ0kgVUFSVCAqLworI2RlZmluZSBOX0dJR0FTRVRfTTEwMQkxNgkvKiBTaWVtZW5zIEdpZ2FzZXQgTTEwMSBzZXJpYWwgREVDVCBhZGFwdGVyICovCisjZGVmaW5lIE5fU0xDQU4JCTE3CS8qIFNlcmlhbCAvIFVTQiBzZXJpYWwgQ0FOIEFkYXB0b3JzICovCisjZGVmaW5lIE5fUFBTCQkxOAkvKiBQdWxzZSBwZXIgU2Vjb25kICovCisjZGVmaW5lIE5fVjI1MwkJMTkJLyogQ29kZWMgY29udHJvbCBvdmVyIHZvaWNlIG1vZGVtICovCisjZGVmaW5lIE5fQ0FJRgkJMjAgICAgICAvKiBDQUlGIHByb3RvY29sIGZvciB0YWxraW5nIHRvIG1vZGVtcyAqLworI2RlZmluZSBOX0dTTTA3MTAJMjEJLyogR1NNIDA3MTAgTXV4ICovCisjZGVmaW5lIE5fVElfV0wJCTIyCS8qIGZvciBUSSdzIFdMIEJULCBGTSwgR1BTIGNvbWJvIGNoaXBzICovCisjZGVmaW5lIE5fVFJBQ0VTSU5LCTIzCS8qIFRyYWNlIGRhdGEgcm91dGluZyBmb3IgTUlQSSBQMTE0OS43ICovCisjZGVmaW5lIE5fVFJBQ0VST1VURVIJMjQJLyogVHJhY2UgZGF0YSByb3V0aW5nIGZvciBNSVBJIFAxMTQ5LjcgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3R5cGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwY2QzYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdHlwZXMuaApAQCAtMCwwICsxLDUxIEBACisjaWZuZGVmIF9MSU5VWF9UWVBFU19ICisjZGVmaW5lIF9MSU5VWF9UWVBFU19ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X3R5cGVzLmg+CisKKworLyoKKyAqIEJlbG93IGFyZSB0cnVseSBMaW51eC1zcGVjaWZpYyB0eXBlcyB0aGF0IHNob3VsZCBuZXZlciBjb2xsaWRlIHdpdGgKKyAqIGFueSBhcHBsaWNhdGlvbi9saWJyYXJ5IHRoYXQgd2FudHMgbGludXgvdHlwZXMuaC4KKyAqLworCisjaWZkZWYgX19DSEVDS0VSX18KKyNkZWZpbmUgX19iaXR3aXNlX18gX19hdHRyaWJ1dGVfXygoYml0d2lzZSkpCisjZWxzZQorI2RlZmluZSBfX2JpdHdpc2VfXworI2VuZGlmCisjaWZkZWYgX19DSEVDS19FTkRJQU5fXworI2RlZmluZSBfX2JpdHdpc2UgX19iaXR3aXNlX18KKyNlbHNlCisjZGVmaW5lIF9fYml0d2lzZQorI2VuZGlmCisKK3R5cGVkZWYgX191MTYgX19iaXR3aXNlIF9fbGUxNjsKK3R5cGVkZWYgX191MTYgX19iaXR3aXNlIF9fYmUxNjsKK3R5cGVkZWYgX191MzIgX19iaXR3aXNlIF9fbGUzMjsKK3R5cGVkZWYgX191MzIgX19iaXR3aXNlIF9fYmUzMjsKK3R5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fbGU2NDsKK3R5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fYmU2NDsKKwordHlwZWRlZiBfX3UxNiBfX2JpdHdpc2UgX19zdW0xNjsKK3R5cGVkZWYgX191MzIgX19iaXR3aXNlIF9fd3N1bTsKKworLyoKKyAqIGFsaWduZWRfdTY0IHNob3VsZCBiZSB1c2VkIGluIGRlZmluaW5nIGtlcm5lbDwtPnVzZXJzcGFjZSBBQklzIHRvIGF2b2lkCisgKiBjb21tb24gMzIvNjQtYml0IGNvbXBhdCBwcm9ibGVtcy4KKyAqIDY0LWJpdCB2YWx1ZXMgYWxpZ24gdG8gNC1ieXRlIGJvdW5kYXJpZXMgb24geDg2XzMyIChhbmQgcG9zc2libHkgb3RoZXIKKyAqIGFyY2hpdGVjdHVyZXMpIGFuZCB0byA4LWJ5dGUgYm91bmRhcmllcyBvbiA2NC1iaXQgYXJjaGl0ZXR1cmVzLiAgVGhlIG5ldworICogYWxpZ25lZF82NCB0eXBlIGVuZm9yY2VzIDgtYnl0ZSBhbGlnbm1lbnQgc28gdGhhdCBzdHJ1Y3RzIGNvbnRhaW5pbmcKKyAqIGFsaWduZWRfNjQgdmFsdWVzIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50IG9uIDMyLWJpdCBhbmQgNjQtYml0IGFyY2hpdGVjdHVyZXMuCisgKiBObyBjb252ZXJzaW9ucyBhcmUgbmVjZXNzYXJ5IGJldHdlZW4gMzItYml0IHVzZXItc3BhY2UgYW5kIGEgNjQtYml0IGtlcm5lbC4KKyAqLworI2RlZmluZSBfX2FsaWduZWRfdTY0IF9fdTY0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKQorI2RlZmluZSBfX2FsaWduZWRfYmU2NCBfX2JlNjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpCisjZGVmaW5lIF9fYWxpZ25lZF9sZTY0IF9fbGU2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkKKworI2VuZGlmIC8qICBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBfTElOVVhfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91ZGZfZnNfaS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91ZGZfZnNfaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzY5NjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VkZl9mc19pLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIHVkZl9mc19pLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgZm9yIHRoZSBMaW51eCBrZXJuZWwvbW9kdWxlLiAKKyAqCisgKiBDT1BZUklHSFQKKyAqCVRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSAoR1BMKS4gQ29waWVzIG9mIHRoZSBHUEwgY2FuIGJlIG9idGFpbmVkIGZyb206CisgKgkJZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKglFYWNoIGNvbnRyaWJ1dGluZyBhdXRob3IgcmV0YWlucyBhbGwgcmlnaHRzIHRvIHRoZWlyIG93biB3b3JrLgorICovCisjaWZuZGVmIF9VREZfRlNfSV9ICisjZGVmaW5lIF9VREZfRlNfSV9IIDEKKworLyogZXhwb3J0ZWQgSU9DVExzLCB3ZSBoYXZlICdsJywgMHg0MC0weDdmICovCisjZGVmaW5lIFVERl9HRVRFQVNJWkUgICBfSU9SKCdsJywgMHg0MCwgaW50KQorI2RlZmluZSBVREZfR0VURUFCTE9DSyAgX0lPUignbCcsIDB4NDEsIHZvaWQgKikKKyNkZWZpbmUgVURGX0dFVFZPTElERU5UIF9JT1IoJ2wnLCAweDQyLCB2b2lkICopCisjZGVmaW5lIFVERl9SRUxPQ0FURV9CTE9DS1MgX0lPV1IoJ2wnLCAweDQzLCBsb25nKQorCisjZW5kaWYgLyogX1VERl9GU19JX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWRwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzY2YyMWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VkcC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJRGVmaW5pdGlvbnMgZm9yIHRoZSBVRFAgcHJvdG9jb2wuCisgKgorICogVmVyc2lvbjoJQCgjKXVkcC5oCTEuMC4yCTA0LzI4LzkzCisgKgorICogQXV0aG9yOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfVURQX0gKKyNkZWZpbmUgX0xJTlVYX1VEUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgdWRwaGRyIHsKKwlfX2JlMTYJc291cmNlOworCV9fYmUxNglkZXN0OworCV9fYmUxNglsZW47CisJX19zdW0xNgljaGVjazsKK307CisKKy8qIFVEUCBzb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBVRFBfQ09SSwkxCS8qIE5ldmVyIHNlbmQgcGFydGlhbGx5IGNvbXBsZXRlIHNlZ21lbnRzICovCisjZGVmaW5lIFVEUF9FTkNBUAkxMDAJLyogU2V0IHRoZSBzb2NrZXQgdG8gYWNjZXB0IGVuY2Fwc3VsYXRlZCBwYWNrZXRzICovCisKKy8qIFVEUCBlbmNhcHN1bGF0aW9uIHR5cGVzICovCisjZGVmaW5lIFVEUF9FTkNBUF9FU1BJTlVEUF9OT05fSUtFCTEgLyogZHJhZnQtaWV0Zi1pcHNlYy1uYXQtdC1pa2UtMDAvMDEgKi8KKyNkZWZpbmUgVURQX0VOQ0FQX0VTUElOVURQCTIgLyogZHJhZnQtaWV0Zi1pcHNlYy11ZHAtZW5jYXBzLTA2ICovCisjZGVmaW5lIFVEUF9FTkNBUF9MMlRQSU5VRFAJMyAvKiByZmMyNjYxICovCisKKworI2VuZGlmCS8qIF9MSU5VWF9VRFBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91aW5wdXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWlucHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2NjU5NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWlucHV0LmgKQEAgLTAsMCArMSwxMzcgQEAKKyNpZm5kZWYgX19VSU5QVVRfSF8KKyNkZWZpbmUgX19VSU5QVVRfSF8KKy8qCisgKiAgVXNlciBsZXZlbCBkcml2ZXIgc3VwcG9ydCBmb3IgaW5wdXQgc3Vic3lzdGVtCisgKgorICogSGVhdmlseSBiYXNlZCBvbiBldmRldi5jIGJ5IFZvanRlY2ggUGF2bGlrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBBdXRob3I6IEFyaXN0ZXUgU2VyZ2lvIFJvemFuc2tpIEZpbGhvIDxhcmlzQGNhdGhlZHJhbGxhYnMub3JnPgorICoKKyAqIENoYW5nZXMvUmV2aXNpb25zOgorICoJMC4zCTI0LzA1LzIwMDYgKEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFnbWFpbC5jb20+KQorICoJCS0gdXBkYXRlIGZmIHN1cHBvcnQgZm9yIHRoZSBjaGFuZ2VzIGluIGtlcm5lbCBpbnRlcmZhY2UKKyAqCQktIGFkZCBVSU5QVVRfVkVSU0lPTgorICoJMC4yCTE2LzEwLzIwMDQgKE1pY2FoIERvd3R5IDxtaWNhaEBuYXZpLmN4PikKKyAqCQktIGFkZGVkIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQKKyAqICAgICAgICAgICAgIC0gYWRkZWQgVUlfU0VUX1BIWVMKKyAqCTAuMQkyMC8wNi8yMDAyCisgKgkJLSBmaXJzdCBwdWJsaWMgdmVyc2lvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCisjZGVmaW5lIFVJTlBVVF9WRVJTSU9OCQkzCisKKworc3RydWN0IHVpbnB1dF9mZl91cGxvYWQgeworCWludAkJCXJlcXVlc3RfaWQ7CisJaW50CQkJcmV0dmFsOworCXN0cnVjdCBmZl9lZmZlY3QJZWZmZWN0OworCXN0cnVjdCBmZl9lZmZlY3QJb2xkOworfTsKKworc3RydWN0IHVpbnB1dF9mZl9lcmFzZSB7CisJaW50CQkJcmVxdWVzdF9pZDsKKwlpbnQJCQlyZXR2YWw7CisJaW50CQkJZWZmZWN0X2lkOworfTsKKworLyogaW9jdGwgKi8KKyNkZWZpbmUgVUlOUFVUX0lPQ1RMX0JBU0UJJ1UnCisjZGVmaW5lIFVJX0RFVl9DUkVBVEUJCV9JTyhVSU5QVVRfSU9DVExfQkFTRSwgMSkKKyNkZWZpbmUgVUlfREVWX0RFU1RST1kJCV9JTyhVSU5QVVRfSU9DVExfQkFTRSwgMikKKworI2RlZmluZSBVSV9TRVRfRVZCSVQJCV9JT1coVUlOUFVUX0lPQ1RMX0JBU0UsIDEwMCwgaW50KQorI2RlZmluZSBVSV9TRVRfS0VZQklUCQlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAxMDEsIGludCkKKyNkZWZpbmUgVUlfU0VUX1JFTEJJVAkJX0lPVyhVSU5QVVRfSU9DVExfQkFTRSwgMTAyLCBpbnQpCisjZGVmaW5lIFVJX1NFVF9BQlNCSVQJCV9JT1coVUlOUFVUX0lPQ1RMX0JBU0UsIDEwMywgaW50KQorI2RlZmluZSBVSV9TRVRfTVNDQklUCQlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAxMDQsIGludCkKKyNkZWZpbmUgVUlfU0VUX0xFREJJVAkJX0lPVyhVSU5QVVRfSU9DVExfQkFTRSwgMTA1LCBpbnQpCisjZGVmaW5lIFVJX1NFVF9TTkRCSVQJCV9JT1coVUlOUFVUX0lPQ1RMX0JBU0UsIDEwNiwgaW50KQorI2RlZmluZSBVSV9TRVRfRkZCSVQJCV9JT1coVUlOUFVUX0lPQ1RMX0JBU0UsIDEwNywgaW50KQorI2RlZmluZSBVSV9TRVRfUEhZUwkJX0lPVyhVSU5QVVRfSU9DVExfQkFTRSwgMTA4LCBjaGFyKikKKyNkZWZpbmUgVUlfU0VUX1NXQklUCQlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAxMDksIGludCkKKyNkZWZpbmUgVUlfU0VUX1BST1BCSVQJCV9JT1coVUlOUFVUX0lPQ1RMX0JBU0UsIDExMCwgaW50KQorCisjZGVmaW5lIFVJX0JFR0lOX0ZGX1VQTE9BRAlfSU9XUihVSU5QVVRfSU9DVExfQkFTRSwgMjAwLCBzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCkKKyNkZWZpbmUgVUlfRU5EX0ZGX1VQTE9BRAlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAyMDEsIHN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkKQorI2RlZmluZSBVSV9CRUdJTl9GRl9FUkFTRQlfSU9XUihVSU5QVVRfSU9DVExfQkFTRSwgMjAyLCBzdHJ1Y3QgdWlucHV0X2ZmX2VyYXNlKQorI2RlZmluZSBVSV9FTkRfRkZfRVJBU0UJCV9JT1coVUlOUFVUX0lPQ1RMX0JBU0UsIDIwMywgc3RydWN0IHVpbnB1dF9mZl9lcmFzZSkKKworLyoKKyAqIFRvIHdyaXRlIGEgZm9yY2UtZmVlZGJhY2stY2FwYWJsZSBkcml2ZXIsIHRoZSB1cGxvYWRfZWZmZWN0CisgKiBhbmQgZXJhc2VfZWZmZWN0IGNhbGxiYWNrcyBpbiBpbnB1dF9kZXYgbXVzdCBiZSBpbXBsZW1lbnRlZC4KKyAqIFRoZSB1aW5wdXQgZHJpdmVyIHdpbGwgZ2VuZXJhdGUgYSBmYWtlIGlucHV0IGV2ZW50IHdoZW4gb25lIG9mCisgKiB0aGVzZSBjYWxsYmFja3MgYXJlIGludm9rZWQuIFRoZSB1c2Vyc3BhY2UgY29kZSB0aGVuIHVzZXMKKyAqIGlvY3RscyB0byByZXRyaWV2ZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYW5kIHNlbmQgdGhlIHJldHVybiBjb2RlLgorICogVGhlIGNhbGxiYWNrIGJsb2NrcyB1bnRpbCB0aGlzIHJldHVybiBjb2RlIGlzIHNlbnQuCisgKgorICogVGhlIGRlc2NyaWJlZCBjYWxsYmFjayBtZWNoYW5pc20gaXMgb25seSB1c2VkIGlmIGZmX2VmZmVjdHNfbWF4CisgKiBpcyBzZXQuCisgKgorICogVG8gaW1wbGVtZW50IHVwbG9hZF9lZmZlY3QoKToKKyAqICAgMS4gV2FpdCBmb3IgYW4gZXZlbnQgd2l0aCB0eXBlID09IEVWX1VJTlBVVCBhbmQgY29kZSA9PSBVSV9GRl9VUExPQUQuCisgKiAgICAgIEEgcmVxdWVzdCBJRCB3aWxsIGJlIGdpdmVuIGluICd2YWx1ZScuCisgKiAgIDIuIEFsbG9jYXRlIGEgdWlucHV0X2ZmX3VwbG9hZCBzdHJ1Y3QsIGZpbGwgaW4gcmVxdWVzdF9pZCB3aXRoCisgKiAgICAgIHRoZSAndmFsdWUnIGZyb20gdGhlIEVWX1VJTlBVVCBldmVudC4KKyAqICAgMy4gSXNzdWUgYSBVSV9CRUdJTl9GRl9VUExPQUQgaW9jdGwsIGdpdmluZyBpdCB0aGUKKyAqICAgICAgdWlucHV0X2ZmX3VwbG9hZCBzdHJ1Y3QuIEl0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGggdGhlCisgKiAgICAgIGZmX2VmZmVjdHMgcGFzc2VkIHRvIHVwbG9hZF9lZmZlY3QoKS4KKyAqICAgNC4gUGVyZm9ybSB0aGUgZWZmZWN0IHVwbG9hZCwgYW5kIHBsYWNlIGEgcmV0dXJuIGNvZGUgYmFjayBpbnRvCisgICAgICAgIHRoZSB1aW5wdXRfZmZfdXBsb2FkIHN0cnVjdC4KKyAqICAgNS4gSXNzdWUgYSBVSV9FTkRfRkZfVVBMT0FEIGlvY3RsLCBhbHNvIGdpdmluZyBpdCB0aGUKKyAqICAgICAgdWlucHV0X2ZmX3VwbG9hZF9lZmZlY3Qgc3RydWN0LiBUaGlzIHdpbGwgY29tcGxldGUgZXhlY3V0aW9uCisgKiAgICAgIG9mIG91ciB1cGxvYWRfZWZmZWN0KCkgaGFuZGxlci4KKyAqCisgKiBUbyBpbXBsZW1lbnQgZXJhc2VfZWZmZWN0KCk6CisgKiAgIDEuIFdhaXQgZm9yIGFuIGV2ZW50IHdpdGggdHlwZSA9PSBFVl9VSU5QVVQgYW5kIGNvZGUgPT0gVUlfRkZfRVJBU0UuCisgKiAgICAgIEEgcmVxdWVzdCBJRCB3aWxsIGJlIGdpdmVuIGluICd2YWx1ZScuCisgKiAgIDIuIEFsbG9jYXRlIGEgdWlucHV0X2ZmX2VyYXNlIHN0cnVjdCwgZmlsbCBpbiByZXF1ZXN0X2lkIHdpdGgKKyAqICAgICAgdGhlICd2YWx1ZScgZnJvbSB0aGUgRVZfVUlOUFVUIGV2ZW50LgorICogICAzLiBJc3N1ZSBhIFVJX0JFR0lOX0ZGX0VSQVNFIGlvY3RsLCBnaXZpbmcgaXQgdGhlCisgKiAgICAgIHVpbnB1dF9mZl9lcmFzZSBzdHJ1Y3QuIEl0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGggdGhlCisgKiAgICAgIGVmZmVjdCBJRCBwYXNzZWQgdG8gZXJhc2VfZWZmZWN0KCkuCisgKiAgIDQuIFBlcmZvcm0gdGhlIGVmZmVjdCBlcmFzdXJlLCBhbmQgcGxhY2UgYSByZXR1cm4gY29kZSBiYWNrCisgKiAgICAgIGludG8gdGhlIHVpbnB1dF9mZl9lcmFzZSBzdHJ1Y3QuCisgKiAgIDUuIElzc3VlIGEgVUlfRU5EX0ZGX0VSQVNFIGlvY3RsLCBhbHNvIGdpdmluZyBpdCB0aGUKKyAqICAgICAgdWlucHV0X2ZmX2VyYXNlX2VmZmVjdCBzdHJ1Y3QuIFRoaXMgd2lsbCBjb21wbGV0ZSBleGVjdXRpb24KKyAqICAgICAgb2Ygb3VyIGVyYXNlX2VmZmVjdCgpIGhhbmRsZXIuCisgKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIG5ldyBldmVudCB0eXBlLCB1c2VkIG9ubHkgYnkgdWlucHV0LgorICogJ2NvZGUnIGlzIFVJX0ZGX1VQTE9BRCBvciBVSV9GRl9FUkFTRSwgYW5kICd2YWx1ZScKKyAqIGlzIHRoZSB1bmlxdWUgcmVxdWVzdCBJRC4gVGhpcyBudW1iZXIgd2FzIHBpY2tlZAorICogYXJiaXRyYXJpbHksIGFib3ZlIEVWX01BWCAoc2luY2UgdGhlIGlucHV0IHN5c3RlbQorICogbmV2ZXIgc2VlcyBpdCkgYnV0IGluIHRoZSByYW5nZSBvZiBhIDE2LWJpdCBpbnQuCisgKi8KKyNkZWZpbmUgRVZfVUlOUFVUCQkweDAxMDEKKyNkZWZpbmUgVUlfRkZfVVBMT0FECQkxCisjZGVmaW5lIFVJX0ZGX0VSQVNFCQkyCisKKyNkZWZpbmUgVUlOUFVUX01BWF9OQU1FX1NJWkUJODAKK3N0cnVjdCB1aW5wdXRfdXNlcl9kZXYgeworCWNoYXIgbmFtZVtVSU5QVVRfTUFYX05BTUVfU0laRV07CisJc3RydWN0IGlucHV0X2lkIGlkOworCWludCBmZl9lZmZlY3RzX21heDsKKwlpbnQgYWJzbWF4W0FCU19DTlRdOworCWludCBhYnNtaW5bQUJTX0NOVF07CisJaW50IGFic2Z1enpbQUJTX0NOVF07CisJaW50IGFic2ZsYXRbQUJTX0NOVF07Cit9OworI2VuZGlmCS8qIF9fVUlOUFVUX0hfICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWlvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Vpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjRhODYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Vpby5oCkBAIC0wLDAgKzEsMzAgQEAKKyNpZm5kZWYgX19MSU5VWF9VSU9fSAorI2RlZmluZSBfX0xJTlVYX1VJT19ICisKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKglCZXJrZWxleSBzdHlsZSBVSU8gc3RydWN0dXJlcwktCUFsYW4gQ294IDE5OTQuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworc3RydWN0IGlvdmVjCit7CisJdm9pZCAqaW92X2Jhc2U7CS8qIEJTRCB1c2VzIGNhZGRyX3QgKDEwMDMuMWcgcmVxdWlyZXMgdm9pZCAqKSAqLworCV9fa2VybmVsX3NpemVfdCBpb3ZfbGVuOyAvKiBNdXN0IGJlIHNpemVfdCAoMTAwMy4xZykgKi8KK307CisKKy8qCisgKglVSU9fTUFYSU9WIHNoYWxsIGJlIGF0IGxlYXN0IDE2IDEwMDMuMWcgKDUuNC4xLjEpCisgKi8KKyAKKyNkZWZpbmUgVUlPX0ZBU1RJT1YJOAorI2RlZmluZSBVSU9fTUFYSU9WCTEwMjQKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWx0cmFzb3VuZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91bHRyYXNvdW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzMzlkYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWx0cmFzb3VuZC5oCkBAIC0wLDAgKzEsMTAzIEBACisjaWZuZGVmIF9VTFRSQVNPVU5EX0hfCisjZGVmaW5lIF9VTFRSQVNPVU5EX0hfCisvKgorICoJdWx0cmFzb3VuZC5oIC0gTWFjcm9zIGZvciBwcm9ncmFtbWluZyB0aGUgR3JhdmlzIFVsdHJhc291bmQKKyAqCQkJVGhlc2UgbWFjcm9zIGFyZSBleHRyZW1lbHkgZGV2aWNlIGRlcGVuZGVudAorICoJCQlhbmQgbm90IHBvcnRhYmxlLgorICovCisvKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKworCisvKgorICoJUHJpdmF0ZSBldmVudHMgZm9yIEdyYXZpcyBVbHRyYXNvdW5kIChHVVMpCisgKgorICoJRm9ybWF0OgorICoJCWJ5dGUgMCAJCS0gU0VRX1BSSVZBVEUgKDB4ZmUpCisgKgkJYnl0ZSAxIAkJLSBTeW50aGVzaXplciBkZXZpY2UgbnVtYmVyICgwLU4pCisgKgkJYnl0ZSAyIAkJLSBDb21tYW5kIChzZWUgYmVsb3cpCisgKgkJYnl0ZSAzIAkJLSBWb2ljZSBudW1iZXIgKDAtMzEpCisgKgkJYnl0ZXMgNCBhbmQgNQktIHBhcmFtZXRlciBQMSAodW5zaWduZWQgc2hvcnQpCisgKgkJYnl0ZXMgNiBhbmQgNwktIHBhcmFtZXRlciBQMiAodW5zaWduZWQgc2hvcnQpCisgKgorICoJQ29tbWFuZHM6CisgKgkJRWFjaCBjb21tYW5kIGFmZmVjdHMgb25lIHZvaWNlIGRlZmluZWQgaW4gYnl0ZSAzLgorICoJCVVudXNlZCBwYXJhbWV0ZXJzIChQMSBhbmQvb3IgUDIgKk1VU1QqIGJlIGluaXRpYWxpemVkIHRvIHplcm8pLgorICoJCV9HVVNfTlVNVk9JQ0VTCS0gU2V0cyBtYXguIG51bWJlciBvZiBjb25jdXJyZW50IHZvaWNlcyAoUDE9MTQtMzEsIGRlZmF1bHQgMTYpCisgKgkJX0dVU19WT0lDRVNBTVBMRS0gKioqKioqKioqKioqIE9CU09MRVRFICoqKioqKioqKioqKioKKyAqCQlfR1VTX1ZPSUNFT04JLSBTdGFydHMgdm9pY2UgKFAxPXZvaWNlIG1vZGUpCisgKgkJX0dVU19WT0lDRU9GRgktIFN0b3BzIHZvaWNlIChubyBwYXJhbWV0ZXJzKQorICoJCV9HVVNfVk9JQ0VGQURFCS0gU3RvcHMgdGhlIHZvaWNlIHNtb290aGx5LgorICoJCV9HVVNfVk9JQ0VNT0RFCS0gQWx0ZXJzIHRoZSB2b2ljZSBtb2RlLCBkb24ndCBzdGFydCBvciBzdG9wIHZvaWNlIChQMT12b2ljZSBtb2RlKQorICoJCV9HVVNfVk9JQ0VCQUxBCS0gU2V0cyB2b2ljZSBiYWxhbmNlIChQMSwgMD1sZWZ0LCA3PW1pZGRsZSBhbmQgMTU9cmlnaHQsIGRlZmF1bHQgNykKKyAqCQlfR1VTX1ZPSUNFRlJFUQktIFNldHMgdm9pY2UgKHNhbXBsZSkgcGxheWJhY2sgZnJlcXVlbmN5IChQMT1IeikKKyAqCQlfR1VTX1ZPSUNFVk9MCS0gU2V0cyB2b2ljZSB2b2x1bWUgKFAxPXZvbHVtZSwgMHhmZmY9bWF4LCAweGVmZj1oYWxmLCAweDAwMD1vZmYpCisgKgkJX0dVU19WT0lDRVZPTDIJLSBTZXRzIHZvaWNlIHZvbHVtZSAoUDE9dm9sdW1lLCAweGZmZj1tYXgsIDB4ZWZmPWhhbGYsIDB4MDAwPW9mZikKKyAqCQkJCSAgKExpa2UgR1VTX1ZPSUNFVk9MIGJ1dCBkb2Vzbid0IGNoYW5nZSB0aGUgaHcKKyAqCQkJCSAgdm9sdW1lLiBJdCBqdXN0IHVwZGF0ZXMgdm9sdW1lIGluIHRoZSB2b2ljZSB0YWJsZSkuCisgKgorICoJCV9HVVNfUkFNUFJBTkdFCS0gU2V0cyBsaW1pdHMgZm9yIHZvbHVtZSByYW1waW5nIChQMT1sb3cgdm9sdW1lLCBQMj1oaWdoIHZvbHVtZSkKKyAqCQlfR1VTX1JBTVBSQVRFCS0gU2V0cyB0aGUgc3BlZWQgZm9yIHZvbHVtZSByYW1waW5nIChQMT1zY2FsZSwgUDI9cmF0ZSkKKyAqCQlfR1VTX1JBTVBNT0RFCS0gU2V0cyB0aGUgdm9sdW1lIHJhbXBpbmcgbW9kZSAoUDE9cmFtcGluZyBtb2RlKQorICoJCV9HVVNfUkFNUE9OCS0gU3RhcnRzIHZvbHVtZSByYW1waW5nIChubyBwYXJhbWV0ZXJzKQorICoJCV9HVVNfUkFNUE9GRgktIFN0b3BzIHZvbHVtZSByYW1waW5nIChubyBwYXJhbWV0ZXJzKQorICoJCV9HVVNfVk9MVU1FX1NDQUxFIC0gQ2hhbmdlcyB0aGUgdm9sdW1lIGNhbGN1bGF0aW9uIGNvbnN0YW50cworICoJCQkJICBmb3IgYWxsIHZvaWNlcy4KKyAqLworCisjZGVmaW5lIF9HVVNfTlVNVk9JQ0VTCQkweDAwCisjZGVmaW5lIF9HVVNfVk9JQ0VTQU1QTEUJMHgwMQkvKiBPQlNPTEVURSAqLworI2RlZmluZSBfR1VTX1ZPSUNFT04JCTB4MDIKKyNkZWZpbmUgX0dVU19WT0lDRU9GRgkJMHgwMworI2RlZmluZSBfR1VTX1ZPSUNFTU9ERQkJMHgwNAorI2RlZmluZSBfR1VTX1ZPSUNFQkFMQQkJMHgwNQorI2RlZmluZSBfR1VTX1ZPSUNFRlJFUQkJMHgwNgorI2RlZmluZSBfR1VTX1ZPSUNFVk9MCQkweDA3CisjZGVmaW5lIF9HVVNfUkFNUFJBTkdFCQkweDA4CisjZGVmaW5lIF9HVVNfUkFNUFJBVEUJCTB4MDkKKyNkZWZpbmUgX0dVU19SQU1QTU9ERQkJMHgwYQorI2RlZmluZSBfR1VTX1JBTVBPTgkJMHgwYgorI2RlZmluZSBfR1VTX1JBTVBPRkYJCTB4MGMKKyNkZWZpbmUgX0dVU19WT0lDRUZBREUJCTB4MGQKKyNkZWZpbmUgX0dVU19WT0xVTUVfU0NBTEUJMHgwZQorI2RlZmluZSBfR1VTX1ZPSUNFVk9MMgkJMHgwZgorI2RlZmluZSBfR1VTX1ZPSUNFX1BPUwkJMHgxMAorCisvKgorICoJR1VTIEFQSSBtYWNyb3MKKyAqLworCisjZGVmaW5lIF9HVVNfQ01EKGNobiwgdm9pY2UsIGNtZCwgcDEsIHAyKSBcCisJCQkJCXtfU0VRX05FRURCVUYoOCk7IF9zZXFidWZbX3NlcWJ1ZnB0cl0gPSBTRVFfUFJJVkFURTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChjaG4pOyBfc2VxYnVmW19zZXFidWZwdHIrMl0gPSBjbWQ7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrM10gPSB2b2ljZTtcCisJCQkJCSoodW5zaWduZWQgc2hvcnQqKSZfc2VxYnVmW19zZXFidWZwdHIrNF0gPSBwMTtcCisJCQkJCSoodW5zaWduZWQgc2hvcnQqKSZfc2VxYnVmW19zZXFidWZwdHIrNl0gPSBwMjtcCisJCQkJCV9TRVFfQURWQlVGKDgpO30KKworI2RlZmluZSBHVVNfTlVNVk9JQ0VTKGNobiwgcDEpCQkJX0dVU19DTUQoY2huLCAwLCBfR1VTX05VTVZPSUNFUywgKHAxKSwgMCkKKyNkZWZpbmUgR1VTX1ZPSUNFU0FNUExFKGNobiwgdm9pY2UsIHAxKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19WT0lDRVNBTVBMRSwgKHAxKSwgMCkJLyogT0JTT0xFVEUgKi8KKyNkZWZpbmUgR1VTX1ZPSUNFT04oY2huLCB2b2ljZSwgcDEpCQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1ZPSUNFT04sIChwMSksIDApCisjZGVmaW5lIEdVU19WT0lDRU9GRihjaG4sIHZvaWNlKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19WT0lDRU9GRiwgMCwgMCkKKyNkZWZpbmUgR1VTX1ZPSUNFRkFERShjaG4sIHZvaWNlKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19WT0lDRUZBREUsIDAsIDApCisjZGVmaW5lIEdVU19WT0lDRU1PREUoY2huLCB2b2ljZSwgcDEpCQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1ZPSUNFTU9ERSwgKHAxKSwgMCkKKyNkZWZpbmUgR1VTX1ZPSUNFQkFMQShjaG4sIHZvaWNlLCBwMSkJCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfVk9JQ0VCQUxBLCAocDEpLCAwKQorI2RlZmluZSBHVVNfVk9JQ0VGUkVRKGNobiwgdm9pY2UsIHApCQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1ZPSUNFRlJFUSwgXAorCQkJCQkJCShwKSAmIDB4ZmZmZiwgKChwKSA+PiAxNikgJiAweGZmZmYpCisjZGVmaW5lIEdVU19WT0lDRVZPTChjaG4sIHZvaWNlLCBwMSkJCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfVk9JQ0VWT0wsIChwMSksIDApCisjZGVmaW5lIEdVU19WT0lDRVZPTDIoY2huLCB2b2ljZSwgcDEpCQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1ZPSUNFVk9MMiwgKHAxKSwgMCkKKyNkZWZpbmUgR1VTX1JBTVBSQU5HRShjaG4sIHZvaWNlLCBsb3csIGhpZ2gpCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfUkFNUFJBTkdFLCAobG93KSwgKGhpZ2gpKQorI2RlZmluZSBHVVNfUkFNUFJBVEUoY2huLCB2b2ljZSwgcDEsIHAyKQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1JBTVBSQVRFLCAocDEpLCAocDIpKQorI2RlZmluZSBHVVNfUkFNUE1PREUoY2huLCB2b2ljZSwgcDEpCQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1JBTVBNT0RFLCAocDEpLCAwKQorI2RlZmluZSBHVVNfUkFNUE9OKGNobiwgdm9pY2UsIHAxKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19SQU1QT04sIChwMSksIDApCisjZGVmaW5lIEdVU19SQU1QT0ZGKGNobiwgdm9pY2UpCQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19SQU1QT0ZGLCAwLCAwKQorI2RlZmluZSBHVVNfVk9MVU1FX1NDQUxFKGNobiwgdm9pY2UsIHAxLCBwMikJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19WT0xVTUVfU0NBTEUsIChwMSksIChwMikpCisjZGVmaW5lIEdVU19WT0lDRV9QT1MoY2huLCB2b2ljZSwgcCkJCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfVk9JQ0VfUE9TLCBcCisJCQkJCQkJKHApICYgMHhmZmZmLCAoKHApID4+IDE2KSAmIDB4ZmZmZikKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VuLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkM2U0NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdW4uaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9MSU5VWF9VTl9ICisjZGVmaW5lIF9MSU5VWF9VTl9ICisKKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKworI2RlZmluZSBVTklYX1BBVEhfTUFYCTEwOAorCitzdHJ1Y3Qgc29ja2FkZHJfdW4geworCV9fa2VybmVsX3NhX2ZhbWlseV90IHN1bl9mYW1pbHk7IC8qIEFGX1VOSVggKi8KKwljaGFyIHN1bl9wYXRoW1VOSVhfUEFUSF9NQVhdOwkvKiBwYXRobmFtZSAqLworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9VTl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VuaXN0ZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91bmlzdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYThkNWI1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91bmlzdGQuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX0xJTlVYX1VOSVNURF9IXworI2RlZmluZSBfTElOVVhfVU5JU1REX0hfCisKKy8qCisgKiBJbmNsdWRlIG1hY2hpbmUgc3BlY2lmaWMgc3lzY2FsbCBudW1iZXJzCisgKi8KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKyNlbmRpZiAvKiBfTElOVVhfVU5JU1REX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9hdWRpby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzU0ZGJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvYXVkaW8uaApAQCAtMCwwICsxLDU0NSBAQAorLyoKKyAqIDxsaW51eC91c2IvYXVkaW8uaD4gLS0gVVNCIEF1ZGlvIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaHVtdHJvbmljcyBQdHkgTHRkLgorICogRGV2ZWxvcGVkIGZvciBUaHVtdHJvbmljcyBieSBHcmV5IElubm92YXRpb24KKyAqIEJlbiBXaWxsaWFtc29uIDxiZW4ud2lsbGlhbXNvbkBncmV5aW5ub3ZhdGlvbi5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBmaWxlIGhvbGRzIFVTQiBjb25zdGFudHMgYW5kIHN0cnVjdHVyZXMgZGVmaW5lZAorICogYnkgdGhlIFVTQiBEZXZpY2UgQ2xhc3MgRGVmaW5pdGlvbiBmb3IgQXVkaW8gRGV2aWNlcy4KKyAqIENvbW1lbnRzIGJlbG93IHJlZmVyZW5jZSByZWxldmFudCBzZWN0aW9ucyBvZiB0aGF0IGRvY3VtZW50OgorICoKKyAqIGh0dHA6Ly93d3cudXNiLm9yZy9kZXZlbG9wZXJzL2RldmNsYXNzX2RvY3MvYXVkaW8xMC5wZGYKKyAqCisgKiBUeXBlcyBhbmQgZGVmaW5lcyBpbiB0aGlzIGZpbGUgYXJlIGVpdGhlciBzcGVjaWZpYyB0byB2ZXJzaW9uIDEuMCBvZgorICogdGhpcyBzdGFuZGFyZCBvciBjb21tb24gZm9yIG5ld2VyIHZlcnNpb25zLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9VU0JfQVVESU9fSAorI2RlZmluZSBfX0xJTlVYX1VTQl9BVURJT19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBiSW50ZXJmYWNlUHJvdG9jb2wgdmFsdWVzIHRvIGRlbm90ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc3RhbmRhcmQgdXNlZCAqLworI2RlZmluZSBVQUNfVkVSU0lPTl8xCQkJMHgwMAorI2RlZmluZSBVQUNfVkVSU0lPTl8yCQkJMHgyMAorCisvKiBBLjIgQXVkaW8gSW50ZXJmYWNlIFN1YmNsYXNzIENvZGVzICovCisjZGVmaW5lIFVTQl9TVUJDTEFTU19BVURJT0NPTlRST0wJMHgwMQorI2RlZmluZSBVU0JfU1VCQ0xBU1NfQVVESU9TVFJFQU1JTkcJMHgwMgorI2RlZmluZSBVU0JfU1VCQ0xBU1NfTUlESVNUUkVBTUlORwkweDAzCisKKy8qIEEuNSBBdWRpbyBDbGFzcy1TcGVjaWZpYyBBQyBJbnRlcmZhY2UgRGVzY3JpcHRvciBTdWJ0eXBlcyAqLworI2RlZmluZSBVQUNfSEVBREVSCQkJMHgwMQorI2RlZmluZSBVQUNfSU5QVVRfVEVSTUlOQUwJCTB4MDIKKyNkZWZpbmUgVUFDX09VVFBVVF9URVJNSU5BTAkJMHgwMworI2RlZmluZSBVQUNfTUlYRVJfVU5JVAkJCTB4MDQKKyNkZWZpbmUgVUFDX1NFTEVDVE9SX1VOSVQJCTB4MDUKKyNkZWZpbmUgVUFDX0ZFQVRVUkVfVU5JVAkJMHgwNgorI2RlZmluZSBVQUMxX1BST0NFU1NJTkdfVU5JVAkJMHgwNworI2RlZmluZSBVQUMxX0VYVEVOU0lPTl9VTklUCQkweDA4CisKKy8qIEEuNiBBdWRpbyBDbGFzcy1TcGVjaWZpYyBBUyBJbnRlcmZhY2UgRGVzY3JpcHRvciBTdWJ0eXBlcyAqLworI2RlZmluZSBVQUNfQVNfR0VORVJBTAkJCTB4MDEKKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFCQkJMHgwMgorI2RlZmluZSBVQUNfRk9STUFUX1NQRUNJRklDCQkweDAzCisKKy8qIEEuNyBQcm9jZXNzaW5nIFVuaXQgUHJvY2VzcyBUeXBlcyAqLworI2RlZmluZSBVQUNfUFJPQ0VTU19VTkRFRklORUQJCTB4MDAKKyNkZWZpbmUgVUFDX1BST0NFU1NfVVBfRE9XTk1JWAkJMHgwMQorI2RlZmluZSBVQUNfUFJPQ0VTU19ET0xCWV9QUk9MT0dJQwkweDAyCisjZGVmaW5lIFVBQ19QUk9DRVNTX1NURVJFT19FWFRFTkRFUgkweDAzCisjZGVmaW5lIFVBQ19QUk9DRVNTX1JFVkVSQgkJMHgwNAorI2RlZmluZSBVQUNfUFJPQ0VTU19DSE9SVVMJCTB4MDUKKyNkZWZpbmUgVUFDX1BST0NFU1NfRFlOX1JBTkdFX0NPTVAJMHgwNgorCisvKiBBLjggQXVkaW8gQ2xhc3MtU3BlY2lmaWMgRW5kcG9pbnQgRGVzY3JpcHRvciBTdWJ0eXBlcyAqLworI2RlZmluZSBVQUNfRVBfR0VORVJBTAkJCTB4MDEKKworLyogQS45IEF1ZGlvIENsYXNzLVNwZWNpZmljIFJlcXVlc3QgQ29kZXMgKi8KKyNkZWZpbmUgVUFDX1NFVF8JCQkweDAwCisjZGVmaW5lIFVBQ19HRVRfCQkJMHg4MAorCisjZGVmaW5lIFVBQ19fQ1VSCQkJMHgxCisjZGVmaW5lIFVBQ19fTUlOCQkJMHgyCisjZGVmaW5lIFVBQ19fTUFYCQkJMHgzCisjZGVmaW5lIFVBQ19fUkVTCQkJMHg0CisjZGVmaW5lIFVBQ19fTUVNCQkJMHg1CisKKyNkZWZpbmUgVUFDX1NFVF9DVVIJCQkoVUFDX1NFVF8gfCBVQUNfX0NVUikKKyNkZWZpbmUgVUFDX0dFVF9DVVIJCQkoVUFDX0dFVF8gfCBVQUNfX0NVUikKKyNkZWZpbmUgVUFDX1NFVF9NSU4JCQkoVUFDX1NFVF8gfCBVQUNfX01JTikKKyNkZWZpbmUgVUFDX0dFVF9NSU4JCQkoVUFDX0dFVF8gfCBVQUNfX01JTikKKyNkZWZpbmUgVUFDX1NFVF9NQVgJCQkoVUFDX1NFVF8gfCBVQUNfX01BWCkKKyNkZWZpbmUgVUFDX0dFVF9NQVgJCQkoVUFDX0dFVF8gfCBVQUNfX01BWCkKKyNkZWZpbmUgVUFDX1NFVF9SRVMJCQkoVUFDX1NFVF8gfCBVQUNfX1JFUykKKyNkZWZpbmUgVUFDX0dFVF9SRVMJCQkoVUFDX0dFVF8gfCBVQUNfX1JFUykKKyNkZWZpbmUgVUFDX1NFVF9NRU0JCQkoVUFDX1NFVF8gfCBVQUNfX01FTSkKKyNkZWZpbmUgVUFDX0dFVF9NRU0JCQkoVUFDX0dFVF8gfCBVQUNfX01FTSkKKworI2RlZmluZSBVQUNfR0VUX1NUQVQJCQkweGZmCisKKy8qIEEuMTAgQ29udHJvbCBTZWxlY3RvciBDb2RlcyAqLworCisvKiBBLjEwLjEgVGVybWluYWwgQ29udHJvbCBTZWxlY3RvcnMgKi8KKyNkZWZpbmUgVUFDX1RFUk1fQ09QWV9QUk9URUNUCQkweDAxCisKKy8qIEEuMTAuMiBGZWF0dXJlIFVuaXQgQ29udHJvbCBTZWxlY3RvcnMgKi8KKyNkZWZpbmUgVUFDX0ZVX01VVEUJCQkweDAxCisjZGVmaW5lIFVBQ19GVV9WT0xVTUUJCQkweDAyCisjZGVmaW5lIFVBQ19GVV9CQVNTCQkJMHgwMworI2RlZmluZSBVQUNfRlVfTUlECQkJMHgwNAorI2RlZmluZSBVQUNfRlVfVFJFQkxFCQkJMHgwNQorI2RlZmluZSBVQUNfRlVfR1JBUEhJQ19FUVVBTElaRVIJMHgwNgorI2RlZmluZSBVQUNfRlVfQVVUT01BVElDX0dBSU4JCTB4MDcKKyNkZWZpbmUgVUFDX0ZVX0RFTEFZCQkJMHgwOAorI2RlZmluZSBVQUNfRlVfQkFTU19CT09TVAkJMHgwOQorI2RlZmluZSBVQUNfRlVfTE9VRE5FU1MJCQkweDBhCisKKyNkZWZpbmUgVUFDX0NPTlRST0xfQklUKENTKQkoMSA8PCAoKENTKSAtIDEpKQorCisvKiBBLjEwLjMuMSBVcC9Eb3duLW1peCBQcm9jZXNzaW5nIFVuaXQgQ29udHJvbHMgU2VsZWN0b3JzICovCisjZGVmaW5lIFVBQ19VRF9FTkFCTEUJCQkweDAxCisjZGVmaW5lIFVBQ19VRF9NT0RFX1NFTEVDVAkJMHgwMgorCisvKiBBLjEwLjMuMiBEb2xieSBQcm9sb2dpYyAodG0pIFByb2Nlc3NpbmcgVW5pdCBDb250cm9scyBTZWxlY3RvcnMgKi8KKyNkZWZpbmUgVUFDX0RQX0VOQUJMRQkJCTB4MDEKKyNkZWZpbmUgVUFDX0RQX01PREVfU0VMRUNUCQkweDAyCisKKy8qIEEuMTAuMy4zIDNEIFN0ZXJlbyBFeHRlbmRlciBQcm9jZXNzaW5nIFVuaXQgQ29udHJvbCBTZWxlY3RvcnMgKi8KKyNkZWZpbmUgVUFDXzNEX0VOQUJMRQkJCTB4MDEKKyNkZWZpbmUgVUFDXzNEX1NQQUNFCQkJMHgwMgorCisvKiBBLjEwLjMuNCBSZXZlcmJlcmF0aW9uIFByb2Nlc3NpbmcgVW5pdCBDb250cm9sIFNlbGVjdG9ycyAqLworI2RlZmluZSBVQUNfUkVWRVJCX0VOQUJMRQkJMHgwMQorI2RlZmluZSBVQUNfUkVWRVJCX0xFVkVMCQkweDAyCisjZGVmaW5lIFVBQ19SRVZFUkJfVElNRQkJCTB4MDMKKyNkZWZpbmUgVUFDX1JFVkVSQl9GRUVEQkFDSwkJMHgwNAorCisvKiBBLjEwLjMuNSBDaG9ydXMgUHJvY2Vzc2luZyBVbml0IENvbnRyb2wgU2VsZWN0b3JzICovCisjZGVmaW5lIFVBQ19DSE9SVVNfRU5BQkxFCQkweDAxCisjZGVmaW5lIFVBQ19DSE9SVVNfTEVWRUwJCTB4MDIKKyNkZWZpbmUgVUFDX0NIT1JVU19SQVRFCQkJMHgwMworI2RlZmluZSBVQUNfQ0hPUlVTX0RFUFRICQkweDA0CisKKy8qIEEuMTAuMy42IER5bmFtaWMgUmFuZ2UgQ29tcHJlc3NvciBVbml0IENvbnRyb2wgU2VsZWN0b3JzICovCisjZGVmaW5lIFVBQ19EQ1JfRU5BQkxFCQkJMHgwMQorI2RlZmluZSBVQUNfRENSX1JBVEUJCQkweDAyCisjZGVmaW5lIFVBQ19EQ1JfTUFYQU1QTAkJCTB4MDMKKyNkZWZpbmUgVUFDX0RDUl9USFJFU0hPTEQJCTB4MDQKKyNkZWZpbmUgVUFDX0RDUl9BVFRBQ0tfVElNRQkJMHgwNQorI2RlZmluZSBVQUNfRENSX1JFTEVBU0VfVElNRQkJMHgwNgorCisvKiBBLjEwLjQgRXh0ZW5zaW9uIFVuaXQgQ29udHJvbCBTZWxlY3RvcnMgKi8KKyNkZWZpbmUgVUFDX1hVX0VOQUJMRQkJCTB4MDEKKworLyogTUlESSAtIEEuMSBNUyBDbGFzcy1TcGVjaWZpYyBJbnRlcmZhY2UgRGVzY3JpcHRvciBTdWJ0eXBlcyAqLworI2RlZmluZSBVQUNfTVNfSEVBREVSCQkJMHgwMQorI2RlZmluZSBVQUNfTUlESV9JTl9KQUNLCQkweDAyCisjZGVmaW5lIFVBQ19NSURJX09VVF9KQUNLCQkweDAzCisKKy8qIE1JREkgLSBBLjEgTVMgQ2xhc3MtU3BlY2lmaWMgRW5kcG9pbnQgRGVzY3JpcHRvciBTdWJ0eXBlcyAqLworI2RlZmluZSBVQUNfTVNfR0VORVJBTAkJCTB4MDEKKworLyogVGVybWluYWxzIC0gMi4xIFVTQiBUZXJtaW5hbCBUeXBlcyAqLworI2RlZmluZSBVQUNfVEVSTUlOQUxfVU5ERUZJTkVECQkweDEwMAorI2RlZmluZSBVQUNfVEVSTUlOQUxfU1RSRUFNSU5HCQkweDEwMQorI2RlZmluZSBVQUNfVEVSTUlOQUxfVkVORE9SX1NQRUMJMHgxRkYKKworLyogVGVybWluYWwgQ29udHJvbCBTZWxlY3RvcnMgKi8KKy8qIDQuMy4yICBDbGFzcy1TcGVjaWZpYyBBQyBJbnRlcmZhY2UgRGVzY3JpcHRvciAqLworc3RydWN0IHVhYzFfYWNfaGVhZGVyX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CQkJLyogOCArIG4gKi8KKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkvKiBVU0JfRFRfQ1NfSU5URVJGQUNFICovCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkvKiBVQUNfTVNfSEVBREVSICovCisJX19sZTE2IGJjZEFEQzsJCQkvKiAweDAxMDAgKi8KKwlfX2xlMTYgd1RvdGFsTGVuZ3RoOwkJLyogaW5jbHVkZXMgVW5pdCBhbmQgVGVybWluYWwgZGVzYy4gKi8KKwlfX3U4ICBiSW5Db2xsZWN0aW9uOwkJLyogbiAqLworCV9fdTggIGJhSW50ZXJmYWNlTnJbXTsJCS8qIFtuXSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVUFDX0RUX0FDX0hFQURFUl9TSVpFKG4pCSg4ICsgKG4pKQorCisvKiBBcyBhYm92ZSwgYnV0IG1vcmUgdXNlZnVsIGZvciBkZWZpbmluZyB5b3VyIG93biBkZXNjcmlwdG9yczogKi8KKyNkZWZpbmUgREVDTEFSRV9VQUNfQUNfSEVBREVSX0RFU0NSSVBUT1IobikJCQlcCitzdHJ1Y3QgdWFjMV9hY19oZWFkZXJfZGVzY3JpcHRvcl8jI24gewkJCVwKKwlfX3U4ICBiTGVuZ3RoOwkJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkJCQlcCisJX19sZTE2IGJjZEFEQzsJCQkJCQlcCisJX19sZTE2IHdUb3RhbExlbmd0aDsJCQkJCVwKKwlfX3U4ICBiSW5Db2xsZWN0aW9uOwkJCQkJXAorCV9fdTggIGJhSW50ZXJmYWNlTnJbbl07CQkJCQlcCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisvKiA0LjMuMi4xIElucHV0IFRlcm1pbmFsIERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1YWNfaW5wdXRfdGVybWluYWxfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsJCQkvKiBpbiBieXRlczogMTIgKi8KKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkvKiBDU19JTlRFUkZBQ0UgZGVzY3JpcHRvciB0eXBlICovCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkvKiBJTlBVVF9URVJNSU5BTCBkZXNjcmlwdG9yIHN1YnR5cGUgKi8KKwlfX3U4ICBiVGVybWluYWxJRDsJCS8qIENvbnN0YW50IHVuaXF1ZWx5IHRlcm1pbmFsIElEICovCisJX19sZTE2IHdUZXJtaW5hbFR5cGU7CQkvKiBVU0IgQXVkaW8gVGVybWluYWwgVHlwZXMgKi8KKwlfX3U4ICBiQXNzb2NUZXJtaW5hbDsJCS8qIElEIG9mIHRoZSBPdXRwdXQgVGVybWluYWwgYXNzb2NpYXRlZCAqLworCV9fdTggIGJOckNoYW5uZWxzOwkJLyogTnVtYmVyIG9mIGxvZ2ljYWwgb3V0cHV0IGNoYW5uZWxzICovCisJX19sZTE2IHdDaGFubmVsQ29uZmlnOworCV9fdTggIGlDaGFubmVsTmFtZXM7CisJX191OCAgaVRlcm1pbmFsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVUFDX0RUX0lOUFVUX1RFUk1JTkFMX1NJWkUJCQkxMgorCisvKiBUZXJtaW5hbHMgLSAyLjIgSW5wdXQgVGVybWluYWwgVHlwZXMgKi8KKyNkZWZpbmUgVUFDX0lOUFVUX1RFUk1JTkFMX1VOREVGSU5FRAkJCTB4MjAwCisjZGVmaW5lIFVBQ19JTlBVVF9URVJNSU5BTF9NSUNST1BIT05FCQkJMHgyMDEKKyNkZWZpbmUgVUFDX0lOUFVUX1RFUk1JTkFMX0RFU0tUT1BfTUlDUk9QSE9ORQkJMHgyMDIKKyNkZWZpbmUgVUFDX0lOUFVUX1RFUk1JTkFMX1BFUlNPTkFMX01JQ1JPUEhPTkUJCTB4MjAzCisjZGVmaW5lIFVBQ19JTlBVVF9URVJNSU5BTF9PTU5JX0RJUl9NSUNST1BIT05FCQkweDIwNAorI2RlZmluZSBVQUNfSU5QVVRfVEVSTUlOQUxfTUlDUk9QSE9ORV9BUlJBWQkJMHgyMDUKKyNkZWZpbmUgVUFDX0lOUFVUX1RFUk1JTkFMX1BST0NfTUlDUk9QSE9ORV9BUlJBWQkweDIwNgorCisvKiBUZXJtaW5hbHMgLSBjb250cm9sIHNlbGVjdG9ycyAqLworCisjZGVmaW5lIFVBQ19URVJNSU5BTF9DU19DT1BZX1BST1RFQ1RfQ09OVFJPTAkJMHgwMQorCisvKiA0LjMuMi4yIE91dHB1dCBUZXJtaW5hbCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdWFjMV9vdXRwdXRfdGVybWluYWxfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsJCQkvKiBpbiBieXRlczogOSAqLworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCS8qIENTX0lOVEVSRkFDRSBkZXNjcmlwdG9yIHR5cGUgKi8KKwlfX3U4ICBiRGVzY3JpcHRvclN1YnR5cGU7CS8qIE9VVFBVVF9URVJNSU5BTCBkZXNjcmlwdG9yIHN1YnR5cGUgKi8KKwlfX3U4ICBiVGVybWluYWxJRDsJCS8qIENvbnN0YW50IHVuaXF1ZWx5IHRlcm1pbmFsIElEICovCisJX19sZTE2IHdUZXJtaW5hbFR5cGU7CQkvKiBVU0IgQXVkaW8gVGVybWluYWwgVHlwZXMgKi8KKwlfX3U4ICBiQXNzb2NUZXJtaW5hbDsJCS8qIElEIG9mIHRoZSBJbnB1dCBUZXJtaW5hbCBhc3NvY2lhdGVkICovCisJX191OCAgYlNvdXJjZUlEOwkJLyogSUQgb2YgdGhlIGNvbm5lY3RlZCBVbml0IG9yIFRlcm1pbmFsKi8KKwlfX3U4ICBpVGVybWluYWw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBVQUNfRFRfT1VUUFVUX1RFUk1JTkFMX1NJWkUJCQk5CisKKy8qIFRlcm1pbmFscyAtIDIuMyBPdXRwdXQgVGVybWluYWwgVHlwZXMgKi8KKyNkZWZpbmUgVUFDX09VVFBVVF9URVJNSU5BTF9VTkRFRklORUQJCQkweDMwMAorI2RlZmluZSBVQUNfT1VUUFVUX1RFUk1JTkFMX1NQRUFLRVIJCQkweDMwMQorI2RlZmluZSBVQUNfT1VUUFVUX1RFUk1JTkFMX0hFQURQSE9ORVMJCQkweDMwMgorI2RlZmluZSBVQUNfT1VUUFVUX1RFUk1JTkFMX0hFQURfTU9VTlRFRF9ESVNQTEFZX0FVRElPCTB4MzAzCisjZGVmaW5lIFVBQ19PVVRQVVRfVEVSTUlOQUxfREVTS1RPUF9TUEVBS0VSCQkweDMwNAorI2RlZmluZSBVQUNfT1VUUFVUX1RFUk1JTkFMX1JPT01fU1BFQUtFUgkJMHgzMDUKKyNkZWZpbmUgVUFDX09VVFBVVF9URVJNSU5BTF9DT01NVU5JQ0FUSU9OX1NQRUFLRVIJMHgzMDYKKyNkZWZpbmUgVUFDX09VVFBVVF9URVJNSU5BTF9MT1dfRlJFUV9FRkZFQ1RTX1NQRUFLRVIJMHgzMDcKKworLyogU2V0IGJDb250cm9sU2l6ZSA9IDIgYXMgZGVmYXVsdCBzZXR0aW5nICovCisjZGVmaW5lIFVBQ19EVF9GRUFUVVJFX1VOSVRfU0laRShjaCkJCSg3ICsgKChjaCkgKyAxKSAqIDIpCisKKy8qIEFzIGFib3ZlLCBidXQgbW9yZSB1c2VmdWwgZm9yIGRlZmluaW5nIHlvdXIgb3duIGRlc2NyaXB0b3JzOiAqLworI2RlZmluZSBERUNMQVJFX1VBQ19GRUFUVVJFX1VOSVRfREVTQ1JJUFRPUihjaCkJCQlcCitzdHJ1Y3QgdWFjX2ZlYXR1cmVfdW5pdF9kZXNjcmlwdG9yXyMjY2ggewkJCVwKKwlfX3U4ICBiTGVuZ3RoOwkJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkJCQlcCisJX191OCAgYlVuaXRJRDsJCQkJCQlcCisJX191OCAgYlNvdXJjZUlEOwkJCQkJXAorCV9fdTggIGJDb250cm9sU2l6ZTsJCQkJCVwKKwlfX2xlMTYgYm1hQ29udHJvbHNbY2ggKyAxXTsJCQkJXAorCV9fdTggIGlGZWF0dXJlOwkJCQkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8qIDQuMy4yLjMgTWl4ZXIgVW5pdCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdWFjX21peGVyX3VuaXRfZGVzY3JpcHRvciB7CisJX191OCBiTGVuZ3RoOworCV9fdTggYkRlc2NyaXB0b3JUeXBlOworCV9fdTggYkRlc2NyaXB0b3JTdWJ0eXBlOworCV9fdTggYlVuaXRJRDsKKwlfX3U4IGJOckluUGluczsKKwlfX3U4IGJhU291cmNlSURbXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgX19pbmxpbmVfXyBfX3U4IHVhY19taXhlcl91bml0X2JOckNoYW5uZWxzKHN0cnVjdCB1YWNfbWl4ZXJfdW5pdF9kZXNjcmlwdG9yICpkZXNjKQoreworCXJldHVybiBkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGluc107Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIHVhY19taXhlcl91bml0X3dDaGFubmVsQ29uZmlnKHN0cnVjdCB1YWNfbWl4ZXJfdW5pdF9kZXNjcmlwdG9yICpkZXNjLAorCQkJCQkJICBpbnQgcHJvdG9jb2wpCit7CisJaWYgKHByb3RvY29sID09IFVBQ19WRVJTSU9OXzEpCisJCXJldHVybiAoZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyAyXSA8PCA4KSB8CisJCQlkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGlucyArIDFdOworCWVsc2UKKwkJcmV0dXJuICAoZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyA0XSA8PCAyNCkgfAorCQkJKGRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgM10gPDwgMTYpIHwKKwkJCShkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGlucyArIDJdIDw8IDgpICB8CisJCQkoZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyAxXSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTggdWFjX21peGVyX3VuaXRfaUNoYW5uZWxOYW1lcyhzdHJ1Y3QgdWFjX21peGVyX3VuaXRfZGVzY3JpcHRvciAqZGVzYywKKwkJCQkJCWludCBwcm90b2NvbCkKK3sKKwlyZXR1cm4gKHByb3RvY29sID09IFVBQ19WRVJTSU9OXzEpID8KKwkJZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyAzXSA6CisJCWRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgNV07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTggKnVhY19taXhlcl91bml0X2JtQ29udHJvbHMoc3RydWN0IHVhY19taXhlcl91bml0X2Rlc2NyaXB0b3IgKmRlc2MsCisJCQkJCSAgICAgIGludCBwcm90b2NvbCkKK3sKKwlyZXR1cm4gKHByb3RvY29sID09IFVBQ19WRVJTSU9OXzEpID8KKwkJJmRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgNF0gOgorCQkmZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyA2XTsKK30KKworc3RhdGljIF9faW5saW5lX18gX191OCB1YWNfbWl4ZXJfdW5pdF9pTWl4ZXIoc3RydWN0IHVhY19taXhlcl91bml0X2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJX191OCAqcmF3ID0gKF9fdTggKikgZGVzYzsKKwlyZXR1cm4gcmF3W2Rlc2MtPmJMZW5ndGggLSAxXTsKK30KKworLyogNC4zLjIuNCBTZWxlY3RvciBVbml0IERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1YWNfc2VsZWN0b3JfdW5pdF9kZXNjcmlwdG9yIHsKKwlfX3U4IGJMZW5ndGg7CisJX191OCBiRGVzY3JpcHRvclR5cGU7CisJX191OCBiRGVzY3JpcHRvclN1YnR5cGU7CisJX191OCBiVWludElEOworCV9fdTggYk5ySW5QaW5zOworCV9fdTggYmFTb3VyY2VJRFtdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTggdWFjX3NlbGVjdG9yX3VuaXRfaVNlbGVjdG9yKHN0cnVjdCB1YWNfc2VsZWN0b3JfdW5pdF9kZXNjcmlwdG9yICpkZXNjKQoreworCV9fdTggKnJhdyA9IChfX3U4ICopIGRlc2M7CisJcmV0dXJuIHJhd1tkZXNjLT5iTGVuZ3RoIC0gMV07Cit9CisKKy8qIDQuMy4yLjUgRmVhdHVyZSBVbml0IERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1YWNfZmVhdHVyZV91bml0X2Rlc2NyaXB0b3IgeworCV9fdTggYkxlbmd0aDsKKwlfX3U4IGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4IGJEZXNjcmlwdG9yU3VidHlwZTsKKwlfX3U4IGJVbml0SUQ7CisJX191OCBiU291cmNlSUQ7CisJX191OCBiQ29udHJvbFNpemU7CisJX191OCBibWFDb250cm9sc1swXTsgLyogdmFyaWFibGUgbGVuZ3RoICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgX19pbmxpbmVfXyBfX3U4IHVhY19mZWF0dXJlX3VuaXRfaUZlYXR1cmUoc3RydWN0IHVhY19mZWF0dXJlX3VuaXRfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlfX3U4ICpyYXcgPSAoX191OCAqKSBkZXNjOworCXJldHVybiByYXdbZGVzYy0+Ykxlbmd0aCAtIDFdOworfQorCisvKiA0LjMuMi42IFByb2Nlc3NpbmcgVW5pdCBEZXNjcmlwdG9ycyAqLworc3RydWN0IHVhY19wcm9jZXNzaW5nX3VuaXRfZGVzY3JpcHRvciB7CisJX191OCBiTGVuZ3RoOworCV9fdTggYkRlc2NyaXB0b3JUeXBlOworCV9fdTggYkRlc2NyaXB0b3JTdWJ0eXBlOworCV9fdTggYlVuaXRJRDsKKwlfX3UxNiB3UHJvY2Vzc1R5cGU7CisJX191OCBiTnJJblBpbnM7CisJX191OCBiYVNvdXJjZUlEW107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIF9faW5saW5lX18gX191OCB1YWNfcHJvY2Vzc2luZ191bml0X2JOckNoYW5uZWxzKHN0cnVjdCB1YWNfcHJvY2Vzc2luZ191bml0X2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJcmV0dXJuIGRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zXTsKK30KKworc3RhdGljIF9faW5saW5lX18gX191MzIgdWFjX3Byb2Nlc3NpbmdfdW5pdF93Q2hhbm5lbENvbmZpZyhzdHJ1Y3QgdWFjX3Byb2Nlc3NpbmdfdW5pdF9kZXNjcmlwdG9yICpkZXNjLAorCQkJCQkJICAgICAgIGludCBwcm90b2NvbCkKK3sKKwlpZiAocHJvdG9jb2wgPT0gVUFDX1ZFUlNJT05fMSkKKwkJcmV0dXJuIChkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGlucyArIDJdIDw8IDgpIHwKKwkJCWRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgMV07CisJZWxzZQorCQlyZXR1cm4gIChkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGlucyArIDRdIDw8IDI0KSB8CisJCQkoZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyAzXSA8PCAxNikgfAorCQkJKGRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgMl0gPDwgOCkgIHwKKwkJCShkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGlucyArIDFdKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX191OCB1YWNfcHJvY2Vzc2luZ191bml0X2lDaGFubmVsTmFtZXMoc3RydWN0IHVhY19wcm9jZXNzaW5nX3VuaXRfZGVzY3JpcHRvciAqZGVzYywKKwkJCQkJCSAgICAgaW50IHByb3RvY29sKQoreworCXJldHVybiAocHJvdG9jb2wgPT0gVUFDX1ZFUlNJT05fMSkgPworCQlkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGlucyArIDNdIDoKKwkJZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyA1XTsKK30KKworc3RhdGljIF9faW5saW5lX18gX191OCB1YWNfcHJvY2Vzc2luZ191bml0X2JDb250cm9sU2l6ZShzdHJ1Y3QgdWFjX3Byb2Nlc3NpbmdfdW5pdF9kZXNjcmlwdG9yICpkZXNjLAorCQkJCQkJICAgIGludCBwcm90b2NvbCkKK3sKKwlyZXR1cm4gKHByb3RvY29sID09IFVBQ19WRVJTSU9OXzEpID8KKwkJZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyA0XSA6CisJCWRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgNl07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTggKnVhY19wcm9jZXNzaW5nX3VuaXRfYm1Db250cm9scyhzdHJ1Y3QgdWFjX3Byb2Nlc3NpbmdfdW5pdF9kZXNjcmlwdG9yICpkZXNjLAorCQkJCQkJICAgaW50IHByb3RvY29sKQoreworCXJldHVybiAocHJvdG9jb2wgPT0gVUFDX1ZFUlNJT05fMSkgPworCQkmZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyA1XSA6CisJCSZkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGlucyArIDddOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3U4IHVhY19wcm9jZXNzaW5nX3VuaXRfaVByb2Nlc3Npbmcoc3RydWN0IHVhY19wcm9jZXNzaW5nX3VuaXRfZGVzY3JpcHRvciAqZGVzYywKKwkJCQkJCSAgIGludCBwcm90b2NvbCkKK3sKKwlfX3U4IGNvbnRyb2xfc2l6ZSA9IHVhY19wcm9jZXNzaW5nX3VuaXRfYkNvbnRyb2xTaXplKGRlc2MsIHByb3RvY29sKTsKKwlyZXR1cm4gZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyBjb250cm9sX3NpemVdOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3U4ICp1YWNfcHJvY2Vzc2luZ191bml0X3NwZWNpZmljKHN0cnVjdCB1YWNfcHJvY2Vzc2luZ191bml0X2Rlc2NyaXB0b3IgKmRlc2MsCisJCQkJCQkgaW50IHByb3RvY29sKQoreworCV9fdTggY29udHJvbF9zaXplID0gdWFjX3Byb2Nlc3NpbmdfdW5pdF9iQ29udHJvbFNpemUoZGVzYywgcHJvdG9jb2wpOworCXJldHVybiAmZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyBjb250cm9sX3NpemUgKyAxXTsKK30KKworLyogNC41LjIgQ2xhc3MtU3BlY2lmaWMgQVMgSW50ZXJmYWNlIERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1YWMxX2FzX2hlYWRlcl9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOwkJCS8qIGluIGJ5dGVzOiA3ICovCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJLyogVVNCX0RUX0NTX0lOVEVSRkFDRSAqLworCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJLyogQVNfR0VORVJBTCAqLworCV9fdTggIGJUZXJtaW5hbExpbms7CQkvKiBUZXJtaW5hbCBJRCBvZiBjb25uZWN0ZWQgVGVybWluYWwgKi8KKwlfX3U4ICBiRGVsYXk7CQkJLyogRGVsYXkgaW50cm9kdWNlZCBieSB0aGUgZGF0YSBwYXRoICovCisJX19sZTE2IHdGb3JtYXRUYWc7CQkvKiBUaGUgQXVkaW8gRGF0YSBGb3JtYXQgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVBQ19EVF9BU19IRUFERVJfU0laRQkJNworCisvKiBGb3JtYXRzIC0gQS4xLjEgQXVkaW8gRGF0YSBGb3JtYXQgVHlwZSBJIENvZGVzICovCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRV9JX1VOREVGSU5FRAkweDAKKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFX0lfUENNCQkweDEKKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFX0lfUENNOAkJMHgyCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRV9JX0lFRUVfRkxPQVQJMHgzCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRV9JX0FMQVcJCTB4NAorI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfSV9NVUxBVwkJMHg1CisKK3N0cnVjdCB1YWNfZm9ybWF0X3R5cGVfaV9jb250aW51b3VzX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CQkJLyogaW4gYnl0ZXM6IDggKyAobnMgKiAzKSAqLworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCS8qIFVTQl9EVF9DU19JTlRFUkZBQ0UgKi8KKwlfX3U4ICBiRGVzY3JpcHRvclN1YnR5cGU7CS8qIEZPUk1BVF9UWVBFICovCisJX191OCAgYkZvcm1hdFR5cGU7CQkvKiBGT1JNQVRfVFlQRV8xICovCisJX191OCAgYk5yQ2hhbm5lbHM7CQkvKiBwaHlzaWNhbCBjaGFubmVscyBpbiB0aGUgc3RyZWFtICovCisJX191OCAgYlN1YmZyYW1lU2l6ZTsJCS8qICovCisJX191OCAgYkJpdFJlc29sdXRpb247CisJX191OCAgYlNhbUZyZXFUeXBlOworCV9fdTggIHRMb3dlclNhbUZyZXFbM107CisJX191OCAgdFVwcGVyU2FtRnJlcVszXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRV9JX0NPTlRJTlVPVVNfREVTQ19TSVpFCTE0CisKK3N0cnVjdCB1YWNfZm9ybWF0X3R5cGVfaV9kaXNjcmV0ZV9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOwkJCS8qIGluIGJ5dGVzOiA4ICsgKG5zICogMykgKi8KKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkvKiBVU0JfRFRfQ1NfSU5URVJGQUNFICovCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkvKiBGT1JNQVRfVFlQRSAqLworCV9fdTggIGJGb3JtYXRUeXBlOwkJLyogRk9STUFUX1RZUEVfMSAqLworCV9fdTggIGJOckNoYW5uZWxzOwkJLyogcGh5c2ljYWwgY2hhbm5lbHMgaW4gdGhlIHN0cmVhbSAqLworCV9fdTggIGJTdWJmcmFtZVNpemU7CQkvKiAqLworCV9fdTggIGJCaXRSZXNvbHV0aW9uOworCV9fdTggIGJTYW1GcmVxVHlwZTsKKwlfX3U4ICB0U2FtRnJlcVtdWzNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgREVDTEFSRV9VQUNfRk9STUFUX1RZUEVfSV9ESVNDUkVURV9ERVNDKG4pCQlcCitzdHJ1Y3QgdWFjX2Zvcm1hdF90eXBlX2lfZGlzY3JldGVfZGVzY3JpcHRvcl8jI24gewkJXAorCV9fdTggIGJMZW5ndGg7CQkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YnR5cGU7CQkJCVwKKwlfX3U4ICBiRm9ybWF0VHlwZTsJCQkJCVwKKwlfX3U4ICBiTnJDaGFubmVsczsJCQkJCVwKKwlfX3U4ICBiU3ViZnJhbWVTaXplOwkJCQkJXAorCV9fdTggIGJCaXRSZXNvbHV0aW9uOwkJCQkJXAorCV9fdTggIGJTYW1GcmVxVHlwZTsJCQkJCVwKKwlfX3U4ICB0U2FtRnJlcVtuXVszXTsJCQkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFX0lfRElTQ1JFVEVfREVTQ19TSVpFKG4pCSg4ICsgKG4gKiAzKSkKKworc3RydWN0IHVhY19mb3JtYXRfdHlwZV9pX2V4dF9kZXNjcmlwdG9yIHsKKwlfX3U4IGJMZW5ndGg7CisJX191OCBiRGVzY3JpcHRvclR5cGU7CisJX191OCBiRGVzY3JpcHRvclN1YnR5cGU7CisJX191OCBiRm9ybWF0VHlwZTsKKwlfX3U4IGJTdWJzbG90U2l6ZTsKKwlfX3U4IGJCaXRSZXNvbHV0aW9uOworCV9fdTggYkhlYWRlckxlbmd0aDsKKwlfX3U4IGJDb250cm9sU2l6ZTsKKwlfX3U4IGJTaWRlQmFuZFByb3RvY29sOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRm9ybWF0cyAtIEF1ZGlvIERhdGEgRm9ybWF0IFR5cGUgSSBDb2RlcyAqLworCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRV9JSV9NUEVHCTB4MTAwMQorI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfSUlfQUMzCTB4MTAwMgorCitzdHJ1Y3QgdWFjX2Zvcm1hdF90eXBlX2lpX2Rpc2NyZXRlX2Rlc2NyaXB0b3IgeworCV9fdTggYkxlbmd0aDsKKwlfX3U4IGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4IGJEZXNjcmlwdG9yU3VidHlwZTsKKwlfX3U4IGJGb3JtYXRUeXBlOworCV9fbGUxNiB3TWF4Qml0UmF0ZTsKKwlfX2xlMTYgd1NhbXBsZXNQZXJGcmFtZTsKKwlfX3U4IGJTYW1GcmVxVHlwZTsKKwlfX3U4IHRTYW1GcmVxW11bM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdWFjX2Zvcm1hdF90eXBlX2lpX2V4dF9kZXNjcmlwdG9yIHsKKwlfX3U4IGJMZW5ndGg7CisJX191OCBiRGVzY3JpcHRvclR5cGU7CisJX191OCBiRGVzY3JpcHRvclN1YnR5cGU7CisJX191OCBiRm9ybWF0VHlwZTsKKwlfX3UxNiB3TWF4Qml0UmF0ZTsKKwlfX3UxNiB3U2FtcGxlc1BlckZyYW1lOworCV9fdTggYkhlYWRlckxlbmd0aDsKKwlfX3U4IGJTaWRlQmFuZFByb3RvY29sOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogdHlwZSBJSUkgKi8KKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFX0lJSV9JRUMxOTM3X0FDMwkweDIwMDEKKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFX0lJSV9JRUMxOTM3X01QRUcxX0xBWUVSMQkweDIwMDIKKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFX0lJSV9JRUMxOTM3X01QRUcyX05PRVhUCTB4MjAwMworI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfSUlJX0lFQzE5MzdfTVBFRzJfRVhUCTB4MjAwNAorI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfSUlJX0lFQzE5MzdfTVBFRzJfTEFZRVIxX0xTCTB4MjAwNQorI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfSUlJX0lFQzE5MzdfTVBFRzJfTEFZRVIyM19MUwkweDIwMDYKKworLyogRm9ybWF0cyAtIEEuMiBGb3JtYXQgVHlwZSBDb2RlcyAqLworI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfVU5ERUZJTkVECTB4MAorI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfSQkJMHgxCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRV9JSQkJMHgyCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRV9JSUkJCTB4MworI2RlZmluZSBVQUNfRVhUX0ZPUk1BVF9UWVBFX0kJCTB4ODEKKyNkZWZpbmUgVUFDX0VYVF9GT1JNQVRfVFlQRV9JSQkJMHg4MgorI2RlZmluZSBVQUNfRVhUX0ZPUk1BVF9UWVBFX0lJSQkJMHg4MworCitzdHJ1Y3QgdWFjX2lzb19lbmRwb2ludF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOwkJCS8qIGluIGJ5dGVzOiA3ICovCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJLyogVVNCX0RUX0NTX0VORFBPSU5UICovCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkvKiBFUF9HRU5FUkFMICovCisJX191OCAgYm1BdHRyaWJ1dGVzOworCV9fdTggIGJMb2NrRGVsYXlVbml0czsKKwlfX2xlMTYgd0xvY2tEZWxheTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisjZGVmaW5lIFVBQ19JU09fRU5EUE9JTlRfREVTQ19TSVpFCTcKKworI2RlZmluZSBVQUNfRVBfQ1NfQVRUUl9TQU1QTEVfUkFURQkweDAxCisjZGVmaW5lIFVBQ19FUF9DU19BVFRSX1BJVENIX0NPTlRST0wJMHgwMgorI2RlZmluZSBVQUNfRVBfQ1NfQVRUUl9GSUxMX01BWAkJMHg4MAorCisvKiBzdGF0dXMgd29yZCBmb3JtYXQgKDMuNy4xLjEpICovCisKKyNkZWZpbmUgVUFDMV9TVEFUVVNfVFlQRV9PUklHX01BU0sJCTB4MGYKKyNkZWZpbmUgVUFDMV9TVEFUVVNfVFlQRV9PUklHX0FVRElPX0NPTlRST0xfSUYJMHgwCisjZGVmaW5lIFVBQzFfU1RBVFVTX1RZUEVfT1JJR19BVURJT19TVFJFQU1fSUYJMHgxCisjZGVmaW5lIFVBQzFfU1RBVFVTX1RZUEVfT1JJR19BVURJT19TVFJFQU1fRVAJMHgyCisKKyNkZWZpbmUgVUFDMV9TVEFUVVNfVFlQRV9JUlFfUEVORElORwkJKDEgPDwgNykKKyNkZWZpbmUgVUFDMV9TVEFUVVNfVFlQRV9NRU1fQ0hBTkdFRAkJKDEgPDwgNikKKworc3RydWN0IHVhYzFfc3RhdHVzX3dvcmQgeworCV9fdTggYlN0YXR1c1R5cGU7CisJX191OCBiT3JpZ2luYXRvcjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworI2VuZGlmIC8qIF9fTElOVVhfVVNCX0FVRElPX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2NkYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvY2RjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhOTI3OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2NkYy5oCkBAIC0wLDAgKzEsNDEyIEBACisvKgorICogVVNCIENvbW11bmljYXRpb25zIERldmljZSBDbGFzcyAoQ0RDKSBkZWZpbml0aW9ucworICoKKyAqIENEQyBzYXlzIGhvdyB0byB0YWxrIHRvIGxvdHMgb2YgZGlmZmVyZW50IHR5cGVzIG9mIG5ldHdvcmsgYWRhcHRlcnMsCisgKiBub3RhYmx5IGV0aGVybmV0IGFkYXB0ZXJzIGFuZCB2YXJpb3VzIG1vZGVtcy4gIEl0J3MgdXNlZCBtb3N0bHkgd2l0aAorICogZmlybXdhcmUgYmFzZWQgVVNCIHBlcmlwaGVyYWxzLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9VU0JfQ0RDX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfQ0RDX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgVVNCX0NEQ19TVUJDTEFTU19BQ00JCQkweDAyCisjZGVmaW5lIFVTQl9DRENfU1VCQ0xBU1NfRVRIRVJORVQJCTB4MDYKKyNkZWZpbmUgVVNCX0NEQ19TVUJDTEFTU19XSENNCQkJMHgwOAorI2RlZmluZSBVU0JfQ0RDX1NVQkNMQVNTX0RNTQkJCTB4MDkKKyNkZWZpbmUgVVNCX0NEQ19TVUJDTEFTU19NRExNCQkJMHgwYQorI2RlZmluZSBVU0JfQ0RDX1NVQkNMQVNTX09CRVgJCQkweDBiCisjZGVmaW5lIFVTQl9DRENfU1VCQ0xBU1NfRUVNCQkJMHgwYworI2RlZmluZSBVU0JfQ0RDX1NVQkNMQVNTX05DTQkJCTB4MGQKKworI2RlZmluZSBVU0JfQ0RDX1BST1RPX05PTkUJCQkwCisKKyNkZWZpbmUgVVNCX0NEQ19BQ01fUFJPVE9fQVRfVjI1VEVSCQkxCisjZGVmaW5lIFVTQl9DRENfQUNNX1BST1RPX0FUX1BDQ0ExMDEJCTIKKyNkZWZpbmUgVVNCX0NEQ19BQ01fUFJPVE9fQVRfUENDQTEwMV9XQUtFCTMKKyNkZWZpbmUgVVNCX0NEQ19BQ01fUFJPVE9fQVRfR1NNCQk0CisjZGVmaW5lIFVTQl9DRENfQUNNX1BST1RPX0FUXzNHCQkJNQorI2RlZmluZSBVU0JfQ0RDX0FDTV9QUk9UT19BVF9DRE1BCQk2CisjZGVmaW5lIFVTQl9DRENfQUNNX1BST1RPX1ZFTkRPUgkJMHhmZgorCisjZGVmaW5lIFVTQl9DRENfUFJPVE9fRUVNCQkJNworCisjZGVmaW5lIFVTQl9DRENfTkNNX1BST1RPX05UQgkJCTEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIENsYXNzLVNwZWNpZmljIGRlc2NyaXB0b3JzIC4uLiB0aGVyZSBhcmUgYSBjb3VwbGUgZG96ZW4gb2YgdGhlbQorICovCisKKyNkZWZpbmUgVVNCX0NEQ19IRUFERVJfVFlQRQkJMHgwMAkvKiBoZWFkZXJfZGVzYyAqLworI2RlZmluZSBVU0JfQ0RDX0NBTExfTUFOQUdFTUVOVF9UWVBFCTB4MDEJLyogY2FsbF9tZ210X2Rlc2NyaXB0b3IgKi8KKyNkZWZpbmUgVVNCX0NEQ19BQ01fVFlQRQkJMHgwMgkvKiBhY21fZGVzY3JpcHRvciAqLworI2RlZmluZSBVU0JfQ0RDX1VOSU9OX1RZUEUJCTB4MDYJLyogdW5pb25fZGVzYyAqLworI2RlZmluZSBVU0JfQ0RDX0NPVU5UUllfVFlQRQkJMHgwNworI2RlZmluZSBVU0JfQ0RDX05FVFdPUktfVEVSTUlOQUxfVFlQRQkweDBhCS8qIG5ldHdvcmtfdGVybWluYWxfZGVzYyAqLworI2RlZmluZSBVU0JfQ0RDX0VUSEVSTkVUX1RZUEUJCTB4MGYJLyogZXRoZXJfZGVzYyAqLworI2RlZmluZSBVU0JfQ0RDX1dIQ01fVFlQRQkJMHgxMQorI2RlZmluZSBVU0JfQ0RDX01ETE1fVFlQRQkJMHgxMgkvKiBtZGxtX2Rlc2MgKi8KKyNkZWZpbmUgVVNCX0NEQ19NRExNX0RFVEFJTF9UWVBFCTB4MTMJLyogbWRsbV9kZXRhaWxfZGVzYyAqLworI2RlZmluZSBVU0JfQ0RDX0RNTV9UWVBFCQkweDE0CisjZGVmaW5lIFVTQl9DRENfT0JFWF9UWVBFCQkweDE1CisjZGVmaW5lIFVTQl9DRENfTkNNX1RZUEUJCTB4MWEKKworLyogIkhlYWRlciBGdW5jdGlvbmFsIERlc2NyaXB0b3IiIGZyb20gQ0RDIHNwZWMgIDUuMi4zLjEgKi8KK3N0cnVjdCB1c2JfY2RjX2hlYWRlcl9kZXNjIHsKKwlfX3U4CWJMZW5ndGg7CisJX191OAliRGVzY3JpcHRvclR5cGU7CisJX191OAliRGVzY3JpcHRvclN1YlR5cGU7CisKKwlfX2xlMTYJYmNkQ0RDOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qICJDYWxsIE1hbmFnZW1lbnQgRGVzY3JpcHRvciIgZnJvbSBDREMgc3BlYyAgNS4yLjMuMiAqLworc3RydWN0IHVzYl9jZGNfY2FsbF9tZ210X2Rlc2NyaXB0b3IgeworCV9fdTgJYkxlbmd0aDsKKwlfX3U4CWJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4CWJEZXNjcmlwdG9yU3ViVHlwZTsKKworCV9fdTgJYm1DYXBhYmlsaXRpZXM7CisjZGVmaW5lIFVTQl9DRENfQ0FMTF9NR01UX0NBUF9DQUxMX01HTVQJCTB4MDEKKyNkZWZpbmUgVVNCX0NEQ19DQUxMX01HTVRfQ0FQX0RBVEFfSU5URgkJMHgwMgorCisJX191OAliRGF0YUludGVyZmFjZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiAiQWJzdHJhY3QgQ29udHJvbCBNYW5hZ2VtZW50IERlc2NyaXB0b3IiIGZyb20gQ0RDIHNwZWMgIDUuMi4zLjMgKi8KK3N0cnVjdCB1c2JfY2RjX2FjbV9kZXNjcmlwdG9yIHsKKwlfX3U4CWJMZW5ndGg7CisJX191OAliRGVzY3JpcHRvclR5cGU7CisJX191OAliRGVzY3JpcHRvclN1YlR5cGU7CisKKwlfX3U4CWJtQ2FwYWJpbGl0aWVzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIGNhcGFiaWxpdGllcyBmcm9tIDUuMi4zLjMgKi8KKworI2RlZmluZSBVU0JfQ0RDX0NPTU1fRkVBVFVSRQkweDAxCisjZGVmaW5lIFVTQl9DRENfQ0FQX0xJTkUJMHgwMgorI2RlZmluZSBVU0JfQ0RDX0NBUF9CUksJCTB4MDQKKyNkZWZpbmUgVVNCX0NEQ19DQVBfTk9USUZZCTB4MDgKKworLyogIlVuaW9uIEZ1bmN0aW9uYWwgRGVzY3JpcHRvciIgZnJvbSBDREMgc3BlYyA1LjIuMy44ICovCitzdHJ1Y3QgdXNiX2NkY191bmlvbl9kZXNjIHsKKwlfX3U4CWJMZW5ndGg7CisJX191OAliRGVzY3JpcHRvclR5cGU7CisJX191OAliRGVzY3JpcHRvclN1YlR5cGU7CisKKwlfX3U4CWJNYXN0ZXJJbnRlcmZhY2UwOworCV9fdTgJYlNsYXZlSW50ZXJmYWNlMDsKKwkvKiAuLi4gYW5kIHRoZXJlIGNvdWxkIGJlIG90aGVyIHNsYXZlIGludGVyZmFjZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiAiQ291bnRyeSBTZWxlY3Rpb24gRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiBmcm9tIENEQyBzcGVjIDUuMi4zLjkgKi8KK3N0cnVjdCB1c2JfY2RjX2NvdW50cnlfZnVuY3Rpb25hbF9kZXNjIHsKKwlfX3U4CWJMZW5ndGg7CisJX191OAliRGVzY3JpcHRvclR5cGU7CisJX191OAliRGVzY3JpcHRvclN1YlR5cGU7CisKKwlfX3U4CWlDb3VudHJ5Q29kZVJlbERhdGU7CisJX19sZTE2CXdDb3VudHlDb2RlMDsKKwkvKiAuLi4gYW5kIHRoZXJlIGNhbiBiZSBhIGxvdCBvZiBjb3VudHJ5IGNvZGVzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogIk5ldHdvcmsgQ2hhbm5lbCBUZXJtaW5hbCBGdW5jdGlvbmFsIERlc2NyaXB0b3IiIGZyb20gQ0RDIHNwZWMgNS4yLjMuMTEgKi8KK3N0cnVjdCB1c2JfY2RjX25ldHdvcmtfdGVybWluYWxfZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX191OAliRW50aXR5SWQ7CisJX191OAlpTmFtZTsKKwlfX3U4CWJDaGFubmVsSW5kZXg7CisJX191OAliUGh5c2ljYWxJbnRlcmZhY2U7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogIkV0aGVybmV0IE5ldHdvcmtpbmcgRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiBmcm9tIENEQyBzcGVjIDUuMi4zLjE2ICovCitzdHJ1Y3QgdXNiX2NkY19ldGhlcl9kZXNjIHsKKwlfX3U4CWJMZW5ndGg7CisJX191OAliRGVzY3JpcHRvclR5cGU7CisJX191OAliRGVzY3JpcHRvclN1YlR5cGU7CisKKwlfX3U4CWlNQUNBZGRyZXNzOworCV9fbGUzMglibUV0aGVybmV0U3RhdGlzdGljczsKKwlfX2xlMTYJd01heFNlZ21lbnRTaXplOworCV9fbGUxNgl3TnVtYmVyTUNGaWx0ZXJzOworCV9fdTgJYk51bWJlclBvd2VyRmlsdGVyczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiAiVGVsZXBob25lIENvbnRyb2wgTW9kZWwgRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiBmcm9tIENEQyBXTUMgc3BlYyA2LjMuLjMgKi8KK3N0cnVjdCB1c2JfY2RjX2RtbV9kZXNjIHsKKwlfX3U4CWJGdW5jdGlvbkxlbmd0aDsKKwlfX3U4CWJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4CWJEZXNjcmlwdG9yU3VidHlwZTsKKwlfX3UxNgliY2RWZXJzaW9uOworCV9fbGUxNgl3TWF4Q29tbWFuZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiAiTURMTSBGdW5jdGlvbmFsIERlc2NyaXB0b3IiIGZyb20gQ0RDIFdNQyBzcGVjIDYuNy4yLjMgKi8KK3N0cnVjdCB1c2JfY2RjX21kbG1fZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX19sZTE2CWJjZFZlcnNpb247CisJX191OAliR1VJRFsxNl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogIk1ETE0gRGV0YWlsIEZ1bmN0aW9uYWwgRGVzY3JpcHRvciIgZnJvbSBDREMgV01DIHNwZWMgNi43LjIuNCAqLworc3RydWN0IHVzYl9jZGNfbWRsbV9kZXRhaWxfZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJLyogdHlwZSBpcyBhc3NvY2lhdGVkIHdpdGggbWRsbV9kZXNjLmJHVUlEICovCisJX191OAliR3VpZERlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRldGFpbERhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogIk9CRVggQ29udHJvbCBNb2RlbCBGdW5jdGlvbmFsIERlc2NyaXB0b3IiICovCitzdHJ1Y3QgdXNiX2NkY19vYmV4X2Rlc2MgeworCV9fdTgJYkxlbmd0aDsKKwlfX3U4CWJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4CWJEZXNjcmlwdG9yU3ViVHlwZTsKKworCV9fbGUxNgliY2RWZXJzaW9uOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qICJOQ00gQ29udHJvbCBNb2RlbCBGdW5jdGlvbmFsIERlc2NyaXB0b3IiICovCitzdHJ1Y3QgdXNiX2NkY19uY21fZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX19sZTE2CWJjZE5jbVZlcnNpb247CisJX191OAlibU5ldHdvcmtDYXBhYmlsaXRpZXM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBDbGFzcy1TcGVjaWZpYyBDb250cm9sIFJlcXVlc3RzICg2LjIpCisgKgorICogc2VjdGlvbiAzLjYuMi4xIHRhYmxlIDQgaGFzIHRoZSBBQ00gcHJvZmlsZSwgZm9yIG1vZGVtcy4KKyAqIHNlY3Rpb24gMy44LjIgdGFibGUgMTAgaGFzIHRoZSBldGhlcm5ldCBwcm9maWxlLgorICoKKyAqIE1pY3Jvc29mdCdzIFJORElTIHN0YWNrIGZvciBFdGhlcm5ldCBpcyBhIHZlbmRvci1zcGVjaWZpYyBDREMgQUNNIHZhcmlhbnQsCisgKiBoZWF2aWx5IGRlcGVuZGVudCBvbiB0aGUgZW5jYXBzdWxhdGVkIChwcm9wcmlldGFyeSkgY29tbWFuZCBtZWNoYW5pc20uCisgKi8KKworI2RlZmluZSBVU0JfQ0RDX1NFTkRfRU5DQVBTVUxBVEVEX0NPTU1BTkQJMHgwMAorI2RlZmluZSBVU0JfQ0RDX0dFVF9FTkNBUFNVTEFURURfUkVTUE9OU0UJMHgwMQorI2RlZmluZSBVU0JfQ0RDX1JFUV9TRVRfTElORV9DT0RJTkcJCTB4MjAKKyNkZWZpbmUgVVNCX0NEQ19SRVFfR0VUX0xJTkVfQ09ESU5HCQkweDIxCisjZGVmaW5lIFVTQl9DRENfUkVRX1NFVF9DT05UUk9MX0xJTkVfU1RBVEUJMHgyMgorI2RlZmluZSBVU0JfQ0RDX1JFUV9TRU5EX0JSRUFLCQkJMHgyMworI2RlZmluZSBVU0JfQ0RDX1NFVF9FVEhFUk5FVF9NVUxUSUNBU1RfRklMVEVSUwkweDQwCisjZGVmaW5lIFVTQl9DRENfU0VUX0VUSEVSTkVUX1BNX1BBVFRFUk5fRklMVEVSCTB4NDEKKyNkZWZpbmUgVVNCX0NEQ19HRVRfRVRIRVJORVRfUE1fUEFUVEVSTl9GSUxURVIJMHg0MgorI2RlZmluZSBVU0JfQ0RDX1NFVF9FVEhFUk5FVF9QQUNLRVRfRklMVEVSCTB4NDMKKyNkZWZpbmUgVVNCX0NEQ19HRVRfRVRIRVJORVRfU1RBVElTVElDCQkweDQ0CisjZGVmaW5lIFVTQl9DRENfR0VUX05UQl9QQVJBTUVURVJTCQkweDgwCisjZGVmaW5lIFVTQl9DRENfR0VUX05FVF9BRERSRVNTCQkJMHg4MQorI2RlZmluZSBVU0JfQ0RDX1NFVF9ORVRfQUREUkVTUwkJCTB4ODIKKyNkZWZpbmUgVVNCX0NEQ19HRVRfTlRCX0ZPUk1BVAkJCTB4ODMKKyNkZWZpbmUgVVNCX0NEQ19TRVRfTlRCX0ZPUk1BVAkJCTB4ODQKKyNkZWZpbmUgVVNCX0NEQ19HRVRfTlRCX0lOUFVUX1NJWkUJCTB4ODUKKyNkZWZpbmUgVVNCX0NEQ19TRVRfTlRCX0lOUFVUX1NJWkUJCTB4ODYKKyNkZWZpbmUgVVNCX0NEQ19HRVRfTUFYX0RBVEFHUkFNX1NJWkUJCTB4ODcKKyNkZWZpbmUgVVNCX0NEQ19TRVRfTUFYX0RBVEFHUkFNX1NJWkUJCTB4ODgKKyNkZWZpbmUgVVNCX0NEQ19HRVRfQ1JDX01PREUJCQkweDg5CisjZGVmaW5lIFVTQl9DRENfU0VUX0NSQ19NT0RFCQkJMHg4YQorCisvKiBMaW5lIENvZGluZyBTdHJ1Y3R1cmUgZnJvbSBDREMgc3BlYyA2LjIuMTMgKi8KK3N0cnVjdCB1c2JfY2RjX2xpbmVfY29kaW5nIHsKKwlfX2xlMzIJZHdEVEVSYXRlOworCV9fdTgJYkNoYXJGb3JtYXQ7CisjZGVmaW5lIFVTQl9DRENfMV9TVE9QX0JJVFMJCQkwCisjZGVmaW5lIFVTQl9DRENfMV81X1NUT1BfQklUUwkJCTEKKyNkZWZpbmUgVVNCX0NEQ18yX1NUT1BfQklUUwkJCTIKKworCV9fdTgJYlBhcml0eVR5cGU7CisjZGVmaW5lIFVTQl9DRENfTk9fUEFSSVRZCQkJMAorI2RlZmluZSBVU0JfQ0RDX09ERF9QQVJJVFkJCQkxCisjZGVmaW5lIFVTQl9DRENfRVZFTl9QQVJJVFkJCQkyCisjZGVmaW5lIFVTQl9DRENfTUFSS19QQVJJVFkJCQkzCisjZGVmaW5lIFVTQl9DRENfU1BBQ0VfUEFSSVRZCQkJNAorCisJX191OAliRGF0YUJpdHM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogdGFibGUgNjI7IGJpdHMgaW4gbXVsdGljYXN0IGZpbHRlciAqLworI2RlZmluZQlVU0JfQ0RDX1BBQ0tFVF9UWVBFX1BST01JU0NVT1VTCQkoMSA8PCAwKQorI2RlZmluZQlVU0JfQ0RDX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QJKDEgPDwgMSkgLyogbm8gZmlsdGVyICovCisjZGVmaW5lCVVTQl9DRENfUEFDS0VUX1RZUEVfRElSRUNURUQJCSgxIDw8IDIpCisjZGVmaW5lCVVTQl9DRENfUEFDS0VUX1RZUEVfQlJPQURDQVNUCQkoMSA8PCAzKQorI2RlZmluZQlVU0JfQ0RDX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVAkJKDEgPDwgNCkgLyogZmlsdGVyZWQgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQ2xhc3MtU3BlY2lmaWMgTm90aWZpY2F0aW9ucyAoNi4zKSBzZW50IGJ5IGludGVycnVwdCB0cmFuc2ZlcnMKKyAqCisgKiBzZWN0aW9uIDMuOC4yIHRhYmxlIDExIG9mIHRoZSBDREMgc3BlYyBsaXN0cyBFdGhlcm5ldCBub3RpZmljYXRpb25zCisgKiBzZWN0aW9uIDMuNi4yLjEgdGFibGUgNSBzcGVjaWZpZXMgQUNNIG5vdGlmaWNhdGlvbnMsIGFjY2VwdGVkIGJ5IFJORElTCisgKiBSTkRJUyBhbHNvIGRlZmluZXMgaXRzIG93biBiaXQtaW5jb21wYXRpYmxlIG5vdGlmaWNhdGlvbnMKKyAqLworCisjZGVmaW5lIFVTQl9DRENfTk9USUZZX05FVFdPUktfQ09OTkVDVElPTgkweDAwCisjZGVmaW5lIFVTQl9DRENfTk9USUZZX1JFU1BPTlNFX0FWQUlMQUJMRQkweDAxCisjZGVmaW5lIFVTQl9DRENfTk9USUZZX1NFUklBTF9TVEFURQkJMHgyMAorI2RlZmluZSBVU0JfQ0RDX05PVElGWV9TUEVFRF9DSEFOR0UJCTB4MmEKKworc3RydWN0IHVzYl9jZGNfbm90aWZpY2F0aW9uIHsKKwlfX3U4CWJtUmVxdWVzdFR5cGU7CisJX191OAliTm90aWZpY2F0aW9uVHlwZTsKKwlfX2xlMTYJd1ZhbHVlOworCV9fbGUxNgl3SW5kZXg7CisJX19sZTE2CXdMZW5ndGg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHVzYl9jZGNfc3BlZWRfY2hhbmdlIHsKKwlfX2xlMzIJRExCaXRSUmF0ZTsJLyogY29udGFpbnMgdGhlIGRvd25saW5rIGJpdCByYXRlIChJTiBwaXBlKSAqLworCV9fbGUzMglVTEJpdFJhdGU7CS8qIGNvbnRhaW5zIHRoZSB1cGxpbmsgYml0IHJhdGUgKE9VVCBwaXBlKSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBDbGFzcyBTcGVjaWZpYyBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMKKyAqCisgKiBDREMgTkNNIE5UQiBwYXJhbWV0ZXJzIHN0cnVjdHVyZSwgQ0RDIE5DTSBzdWJjbGFzcyA2LjIuMQorICoKKyAqLworCitzdHJ1Y3QgdXNiX2NkY19uY21fbnRiX3BhcmFtZXRlcnMgeworCV9fbGUxNgl3TGVuZ3RoOworCV9fbGUxNglibU50YkZvcm1hdHNTdXBwb3J0ZWQ7CisJX19sZTMyCWR3TnRiSW5NYXhTaXplOworCV9fbGUxNgl3TmRwSW5EaXZpc29yOworCV9fbGUxNgl3TmRwSW5QYXlsb2FkUmVtYWluZGVyOworCV9fbGUxNgl3TmRwSW5BbGlnbm1lbnQ7CisJX19sZTE2CXdQYWRkaW5nMTsKKwlfX2xlMzIJZHdOdGJPdXRNYXhTaXplOworCV9fbGUxNgl3TmRwT3V0RGl2aXNvcjsKKwlfX2xlMTYJd05kcE91dFBheWxvYWRSZW1haW5kZXI7CisJX19sZTE2CXdOZHBPdXRBbGlnbm1lbnQ7CisJX19sZTE2CXdOdGJPdXRNYXhEYXRhZ3JhbXM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIENEQyBOQ00gdHJhbnNmZXIgaGVhZGVycywgQ0RDIE5DTSBzdWJjbGFzcyAzLjIKKyAqLworCisjZGVmaW5lIFVTQl9DRENfTkNNX05USDE2X1NJR04JCTB4NDg0RDQzNEUgLyogTkNNSCAqLworI2RlZmluZSBVU0JfQ0RDX05DTV9OVEgzMl9TSUdOCQkweDY4NkQ2MzZFIC8qIG5jbWggKi8KKworc3RydWN0IHVzYl9jZGNfbmNtX250aDE2IHsKKwlfX2xlMzIJZHdTaWduYXR1cmU7CisJX19sZTE2CXdIZWFkZXJMZW5ndGg7CisJX19sZTE2CXdTZXF1ZW5jZTsKKwlfX2xlMTYJd0Jsb2NrTGVuZ3RoOworCV9fbGUxNgl3TmRwSW5kZXg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHVzYl9jZGNfbmNtX250aDMyIHsKKwlfX2xlMzIJZHdTaWduYXR1cmU7CisJX19sZTE2CXdIZWFkZXJMZW5ndGg7CisJX19sZTE2CXdTZXF1ZW5jZTsKKwlfX2xlMzIJZHdCbG9ja0xlbmd0aDsKKwlfX2xlMzIJZHdOZHBJbmRleDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKgorICogQ0RDIE5DTSBkYXRhZ3JhbSBwb2ludGVycywgQ0RDIE5DTSBzdWJjbGFzcyAzLjMKKyAqLworCisjZGVmaW5lIFVTQl9DRENfTkNNX05EUDE2X0NSQ19TSUdOCTB4MzE0RDQzNEUgLyogTkNNMSAqLworI2RlZmluZSBVU0JfQ0RDX05DTV9ORFAxNl9OT0NSQ19TSUdOCTB4MzA0RDQzNEUgLyogTkNNMCAqLworI2RlZmluZSBVU0JfQ0RDX05DTV9ORFAzMl9DUkNfU0lHTgkweDMxNkQ2MzZFIC8qIG5jbTEgKi8KKyNkZWZpbmUgVVNCX0NEQ19OQ01fTkRQMzJfTk9DUkNfU0lHTgkweDMwNkQ2MzZFIC8qIG5jbTAgKi8KKworLyogMTYtYml0IE5DTSBEYXRhZ3JhbSBQb2ludGVyIEVudHJ5ICovCitzdHJ1Y3QgdXNiX2NkY19uY21fZHBlMTYgeworCV9fbGUxNgl3RGF0YWdyYW1JbmRleDsKKwlfX2xlMTYJd0RhdGFncmFtTGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKy8qIDE2LWJpdCBOQ00gRGF0YWdyYW0gUG9pbnRlciBUYWJsZSAqLworc3RydWN0IHVzYl9jZGNfbmNtX25kcDE2IHsKKwlfX2xlMzIJZHdTaWduYXR1cmU7CisJX19sZTE2CXdMZW5ndGg7CisJX19sZTE2CXdOZXh0TmRwSW5kZXg7CisJc3RydWN0CXVzYl9jZGNfbmNtX2RwZTE2IGRwZTE2WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIDMyLWJpdCBOQ00gRGF0YWdyYW0gUG9pbnRlciBFbnRyeSAqLworc3RydWN0IHVzYl9jZGNfbmNtX2RwZTMyIHsKKwlfX2xlMzIJZHdEYXRhZ3JhbUluZGV4OworCV9fbGUzMglkd0RhdGFncmFtTGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKy8qIDMyLWJpdCBOQ00gRGF0YWdyYW0gUG9pbnRlciBUYWJsZSAqLworc3RydWN0IHVzYl9jZGNfbmNtX25kcDMyIHsKKwlfX2xlMzIJZHdTaWduYXR1cmU7CisJX19sZTE2CXdMZW5ndGg7CisJX19sZTE2CXdSZXNlcnZlZDY7CisJX19sZTMyCWR3TmV4dE5kcEluZGV4OworCV9fbGUzMglkd1Jlc2VydmVkMTI7CisJc3RydWN0CXVzYl9jZGNfbmNtX2RwZTMyIGRwZTMyWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIENEQyBOQ00gc3ViY2xhc3MgMy4yLjEgYW5kIDMuMi4yICovCisjZGVmaW5lIFVTQl9DRENfTkNNX05EUDE2X0lOREVYX01JTgkJCTB4MDAwQworI2RlZmluZSBVU0JfQ0RDX05DTV9ORFAzMl9JTkRFWF9NSU4JCQkweDAwMTAKKworLyogQ0RDIE5DTSBzdWJjbGFzcyAzLjMuMyBEYXRhZ3JhbSBGb3JtYXR0aW5nICovCisjZGVmaW5lIFVTQl9DRENfTkNNX0RBVEFHUkFNX0ZPUk1BVF9DUkMJCQkweDMwCisjZGVmaW5lIFVTQl9DRENfTkNNX0RBVEFHUkFNX0ZPUk1BVF9OT0NSQwkJMFgzMQorCisvKiBDREMgTkNNIHN1YmNsYXNzIDQuMiBOQ00gQ29tbXVuaWNhdGlvbnMgSW50ZXJmYWNlIFByb3RvY29sIENvZGUgKi8KKyNkZWZpbmUgVVNCX0NEQ19OQ01fUFJPVE9fQ09ERV9OT19FTkNBUF9DT01NQU5EUwkweDAwCisjZGVmaW5lIFVTQl9DRENfTkNNX1BST1RPX0NPREVfRVhURVJOX1BST1RPCQkweEZFCisKKy8qIENEQyBOQ00gc3ViY2xhc3MgNS4yLjEgTkNNIEZ1bmN0aW9uYWwgRGVzY3JpcHRvciwgYm1OZXR3b3JrQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lIFVTQl9DRENfTkNNX05DQVBfRVRIX0ZJTFRFUgkJCSgxIDw8IDApCisjZGVmaW5lIFVTQl9DRENfTkNNX05DQVBfTkVUX0FERFJFU1MJCQkoMSA8PCAxKQorI2RlZmluZSBVU0JfQ0RDX05DTV9OQ0FQX0VOQ0FQX0NPTU1BTkQJCQkoMSA8PCAyKQorI2RlZmluZSBVU0JfQ0RDX05DTV9OQ0FQX01BWF9EQVRBR1JBTV9TSVpFCQkoMSA8PCAzKQorI2RlZmluZSBVU0JfQ0RDX05DTV9OQ0FQX0NSQ19NT0RFCQkJKDEgPDwgNCkKKyNkZWZpbmUJVVNCX0NEQ19OQ01fTkNBUF9OVEJfSU5QVVRfU0laRQkJCSgxIDw8IDUpCisKKy8qIENEQyBOQ00gc3ViY2xhc3MgVGFibGUgNi0zOiBOVEIgUGFyYW1ldGVyIFN0cnVjdHVyZSAqLworI2RlZmluZSBVU0JfQ0RDX05DTV9OVEIxNl9TVVBQT1JURUQJCQkoMSA8PCAwKQorI2RlZmluZSBVU0JfQ0RDX05DTV9OVEIzMl9TVVBQT1JURUQJCQkoMSA8PCAxKQorCisvKiBDREMgTkNNIHN1YmNsYXNzIFRhYmxlIDYtMzogTlRCIFBhcmFtZXRlciBTdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgVVNCX0NEQ19OQ01fTkRQX0FMSUdOX01JTl9TSVpFCQkJMHgwNAorI2RlZmluZSBVU0JfQ0RDX05DTV9OVEJfTUFYX0xFTkdUSAkJCTB4MUMKKworLyogQ0RDIE5DTSBzdWJjbGFzcyA2LjIuNSBTZXROdGJGb3JtYXQgKi8KKyNkZWZpbmUgVVNCX0NEQ19OQ01fTlRCMTZfRk9STUFUCQkJMHgwMAorI2RlZmluZSBVU0JfQ0RDX05DTV9OVEIzMl9GT1JNQVQJCQkweDAxCisKKy8qIENEQyBOQ00gc3ViY2xhc3MgNi4yLjcgU2V0TnRiSW5wdXRTaXplICovCisjZGVmaW5lIFVTQl9DRENfTkNNX05UQl9NSU5fSU5fU0laRQkJCTIwNDgKKyNkZWZpbmUgVVNCX0NEQ19OQ01fTlRCX01JTl9PVVRfU0laRQkJCTIwNDgKKworLyogTlRCIElucHV0IFNpemUgU3RydWN0dXJlICovCitzdHJ1Y3QgdXNiX2NkY19uY21fbmRwX2lucHV0X3NpemUgeworCV9fbGUzMglkd050YkluTWF4U2l6ZTsKKwlfX2xlMTYJd050YkluTWF4RGF0YWdyYW1zOworCV9fbGUxNgl3UmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQ0RDIE5DTSBzdWJjbGFzcyA2LjIuMTEgU2V0Q3JjTW9kZSAqLworI2RlZmluZSBVU0JfQ0RDX05DTV9DUkNfTk9UX0FQUEVOREVECQkJMHgwMAorI2RlZmluZSBVU0JfQ0RDX05DTV9DUkNfQVBQRU5ERUQJCQkweDAxCisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9DRENfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvY2gxMS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvY2gxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjczNWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9jaDExLmgKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaG9sZHMgSHViIHByb3RvY29sIGNvbnN0YW50cyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYXJlCisgKiBkZWZpbmVkIGluIGNoYXB0ZXIgMTEgKEh1YiBTcGVjaWZpY2F0aW9uKSBvZiB0aGUgVVNCIDIuMCBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEl0IGlzIHVzZWQvc2hhcmVkIGJldHdlZW4gdGhlIFVTQiBjb3JlLCB0aGUgSENEcyBhbmQgY291cGxlIG9mIG90aGVyIFVTQgorICogZHJpdmVycy4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfQ0gxMV9ICisjZGVmaW5lIF9fTElOVVhfQ0gxMV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgkvKiBfX3U4IGV0YyAqLworCisvKgorICogSHViIHJlcXVlc3QgdHlwZXMKKyAqLworCisjZGVmaW5lIFVTQl9SVF9IVUIJKFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0RFVklDRSkKKyNkZWZpbmUgVVNCX1JUX1BPUlQJKFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX09USEVSKQorCisvKgorICogSHViIGNsYXNzIHJlcXVlc3RzCisgKiBTZWUgVVNCIDIuMCBzcGVjIFRhYmxlIDExLTE2CisgKi8KKyNkZWZpbmUgSFVCX0NMRUFSX1RUX0JVRkZFUgk4CisjZGVmaW5lIEhVQl9SRVNFVF9UVAkJOQorI2RlZmluZSBIVUJfR0VUX1RUX1NUQVRFCTEwCisjZGVmaW5lIEhVQl9TVE9QX1RUCQkxMQorI2RlZmluZSBIVUJfU0VUX0RFUFRICQkxMgorCisvKgorICogSHViIGNsYXNzIGFkZGl0aW9uYWwgcmVxdWVzdHMgZGVmaW5lZCBieSBVU0IgMy4wIHNwZWMKKyAqIFNlZSBVU0IgMy4wIHNwZWMgVGFibGUgMTAtNgorICovCisjZGVmaW5lIEhVQl9TRVRfREVQVEgJCTEyCisjZGVmaW5lIEhVQl9HRVRfUE9SVF9FUlJfQ09VTlQJMTMKKworLyoKKyAqIEh1YiBDbGFzcyBmZWF0dXJlIG51bWJlcnMKKyAqIFNlZSBVU0IgMi4wIHNwZWMgVGFibGUgMTEtMTcKKyAqLworI2RlZmluZSBDX0hVQl9MT0NBTF9QT1dFUgkwCisjZGVmaW5lIENfSFVCX09WRVJfQ1VSUkVOVAkxCisKKy8qCisgKiBQb3J0IGZlYXR1cmUgbnVtYmVycworICogU2VlIFVTQiAyLjAgc3BlYyBUYWJsZSAxMS0xNworICovCisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfQ09OTkVDVElPTgkwCisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfRU5BQkxFCQkxCisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfU1VTUEVORAkJMgkvKiBMMiBzdXNwZW5kICovCisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfT1ZFUl9DVVJSRU5UCTMKKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9SRVNFVAkJNAorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0wxCQk1CS8qIEwxIHN1c3BlbmQgKi8KKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9QT1dFUgkJOAorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0xPV1NQRUVECQk5CS8qIFNob3VsZCBuZXZlciBiZSB1c2VkICovCisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OCTE2CisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfQ19FTkFCTEUJCTE3CisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5ECQkxOAorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0NfT1ZFUl9DVVJSRU5UCTE5CisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfQ19SRVNFVAkJMjAKKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9URVNUICAgICAgICAgICAgICAyMQorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0lORElDQVRPUiAgICAgICAgIDIyCisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfQ19QT1JUX0wxICAgICAgICAgMjMKKworLyoKKyAqIFBvcnQgZmVhdHVyZSBzZWxlY3RvcnMgYWRkZWQgYnkgVVNCIDMuMCBzcGVjLgorICogU2VlIFVTQiAzLjAgc3BlYyBUYWJsZSAxMC03CisgKi8KKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9MSU5LX1NUQVRFCQk1CisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfVTFfVElNRU9VVAkJMjMKKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9VMl9USU1FT1VUCQkyNAorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0NfUE9SVF9MSU5LX1NUQVRFCQkyNQorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0NfUE9SVF9DT05GSUdfRVJST1IJMjYKKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9SRU1PVEVfV0FLRV9NQVNLCQkyNworI2RlZmluZSBVU0JfUE9SVF9GRUFUX0JIX1BPUlRfUkVTRVQJCTI4CisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfQ19CSF9QT1JUX1JFU0VUCQkyOQorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0ZPUkNFX0xJTktQTV9BQ0NFUFQJMzAKKworLyoKKyAqIEh1YiBTdGF0dXMgYW5kIEh1YiBDaGFuZ2UgcmVzdWx0cworICogU2VlIFVTQiAyLjAgc3BlYyBUYWJsZSAxMS0xOSBhbmQgVGFibGUgMTEtMjAKKyAqLworc3RydWN0IHVzYl9wb3J0X3N0YXR1cyB7CisJX19sZTE2IHdQb3J0U3RhdHVzOworCV9fbGUxNiB3UG9ydENoYW5nZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKgorICogd1BvcnRTdGF0dXMgYml0IGZpZWxkCisgKiBTZWUgVVNCIDIuMCBzcGVjIFRhYmxlIDExLTIxCisgKi8KKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OCTB4MDAwMQorI2RlZmluZSBVU0JfUE9SVF9TVEFUX0VOQUJMRQkJMHgwMDAyCisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfU1VTUEVORAkJMHgwMDA0CisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfT1ZFUkNVUlJFTlQJMHgwMDA4CisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfUkVTRVQJCTB4MDAxMAorI2RlZmluZSBVU0JfUE9SVF9TVEFUX0wxCQkweDAwMjAKKy8qIGJpdHMgNiB0byA3IGFyZSByZXNlcnZlZCAqLworI2RlZmluZSBVU0JfUE9SVF9TVEFUX1BPV0VSCQkweDAxMDAKKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9MT1dfU1BFRUQJCTB4MDIwMAorI2RlZmluZSBVU0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQgICAgICAgIDB4MDQwMAorI2RlZmluZSBVU0JfUE9SVF9TVEFUX1RFU1QgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBVU0JfUE9SVF9TVEFUX0lORElDQVRPUiAgICAgICAgIDB4MTAwMAorLyogYml0cyAxMyB0byAxNSBhcmUgcmVzZXJ2ZWQgKi8KKworLyoKKyAqIEFkZGl0aW9ucyB0byB3UG9ydFN0YXR1cyBiaXQgZmllbGQgZnJvbSBVU0IgMy4wCisgKiBTZWUgVVNCIDMuMCBzcGVjIFRhYmxlIDEwLTEwCisgKi8KKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9MSU5LX1NUQVRFCTB4MDFlMAorI2RlZmluZSBVU0JfU1NfUE9SVF9TVEFUX1BPV0VSCQkweDAyMDAKKyNkZWZpbmUgVVNCX1NTX1BPUlRfU1RBVF9TUEVFRAkJMHgxYzAwCisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfU1BFRURfNUdCUFMJMHgwMDAwCisvKiBWYWxpZCBvbmx5IGlmIHBvcnQgaXMgZW5hYmxlZCAqLworLyogQml0cyB0aGF0IGFyZSB0aGUgc2FtZSBmcm9tIFVTQiAyLjAgKi8KKyNkZWZpbmUgVVNCX1NTX1BPUlRfU1RBVF9NQVNLIChVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04gfAkgICAgXAorCQkJCVVTQl9QT1JUX1NUQVRfRU5BQkxFIHwJICAgIFwKKwkJCQlVU0JfUE9SVF9TVEFUX09WRVJDVVJSRU5UIHwgXAorCQkJCVVTQl9QT1JUX1NUQVRfUkVTRVQpCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgUE9SVF9MSU5LX1NUQVRFIHZhbHVlcworICogKGJpdHMgNS04KSBpbiB3UG9ydFN0YXR1cworICovCisjZGVmaW5lIFVTQl9TU19QT1JUX0xTX1UwCQkweDAwMDAKKyNkZWZpbmUgVVNCX1NTX1BPUlRfTFNfVTEJCTB4MDAyMAorI2RlZmluZSBVU0JfU1NfUE9SVF9MU19VMgkJMHgwMDQwCisjZGVmaW5lIFVTQl9TU19QT1JUX0xTX1UzCQkweDAwNjAKKyNkZWZpbmUgVVNCX1NTX1BPUlRfTFNfU1NfRElTQUJMRUQJMHgwMDgwCisjZGVmaW5lIFVTQl9TU19QT1JUX0xTX1JYX0RFVEVDVAkweDAwYTAKKyNkZWZpbmUgVVNCX1NTX1BPUlRfTFNfU1NfSU5BQ1RJVkUJMHgwMGMwCisjZGVmaW5lIFVTQl9TU19QT1JUX0xTX1BPTExJTkcJCTB4MDBlMAorI2RlZmluZSBVU0JfU1NfUE9SVF9MU19SRUNPVkVSWQkJMHgwMTAwCisjZGVmaW5lIFVTQl9TU19QT1JUX0xTX0hPVF9SRVNFVAkweDAxMjAKKyNkZWZpbmUgVVNCX1NTX1BPUlRfTFNfQ09NUF9NT0QJCTB4MDE0MAorI2RlZmluZSBVU0JfU1NfUE9SVF9MU19MT09QQkFDSwkJMHgwMTYwCisKKy8qCisgKiB3UG9ydENoYW5nZSBiaXQgZmllbGQKKyAqIFNlZSBVU0IgMi4wIHNwZWMgVGFibGUgMTEtMjIgYW5kIFVTQiAyLjAgTFBNIEVDTiBUYWJsZS00LjEwCisgKiBCaXRzIDAgdG8gNSBzaG93biwgYml0cyA2IHRvIDE1IGFyZSByZXNlcnZlZAorICovCisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfQ19DT05ORUNUSU9OCTB4MDAwMQorI2RlZmluZSBVU0JfUE9SVF9TVEFUX0NfRU5BQkxFCQkweDAwMDIKKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9DX1NVU1BFTkQJCTB4MDAwNAorI2RlZmluZSBVU0JfUE9SVF9TVEFUX0NfT1ZFUkNVUlJFTlQJMHgwMDA4CisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfQ19SRVNFVAkJMHgwMDEwCisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfQ19MMQkJMHgwMDIwCisvKgorICogVVNCIDMuMCB3UG9ydENoYW5nZSBiaXQgZmllbGRzCisgKiBTZWUgVVNCIDMuMCBzcGVjIFRhYmxlIDEwLTExCisgKi8KKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9DX0JIX1JFU0VUCTB4MDAyMAorI2RlZmluZSBVU0JfUE9SVF9TVEFUX0NfTElOS19TVEFURQkweDAwNDAKKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9DX0NPTkZJR19FUlJPUgkweDAwODAKKworLyoKKyAqIHdIdWJDaGFyYWN0ZXJpc3RpY3MgKG1hc2tzKQorICogU2VlIFVTQiAyLjAgc3BlYyBUYWJsZSAxMS0xMywgb2Zmc2V0IDMKKyAqLworI2RlZmluZSBIVUJfQ0hBUl9MUFNNCQkweDAwMDMgLyogRDEgLi4gRDAgKi8KKyNkZWZpbmUgSFVCX0NIQVJfQ09NUE9VTkQJMHgwMDA0IC8qIEQyICAgICAgICovCisjZGVmaW5lIEhVQl9DSEFSX09DUE0JCTB4MDAxOCAvKiBENCAuLiBEMyAqLworI2RlZmluZSBIVUJfQ0hBUl9UVFRUICAgICAgICAgICAweDAwNjAgLyogRDYgLi4gRDUgKi8KKyNkZWZpbmUgSFVCX0NIQVJfUE9SVElORCAgICAgICAgMHgwMDgwIC8qIEQ3ICAgICAgICovCisKK3N0cnVjdCB1c2JfaHViX3N0YXR1cyB7CisJX19sZTE2IHdIdWJTdGF0dXM7CisJX19sZTE2IHdIdWJDaGFuZ2U7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIEh1YiBTdGF0dXMgJiBIdWIgQ2hhbmdlIGJpdCBtYXNrcworICogU2VlIFVTQiAyLjAgc3BlYyBUYWJsZSAxMS0xOSBhbmQgVGFibGUgMTEtMjAKKyAqIEJpdHMgMCBhbmQgMSBmb3Igd0h1YlN0YXR1cyBhbmQgd0h1YkNoYW5nZQorICogQml0cyAyIHRvIDE1IGFyZSByZXNlcnZlZCBmb3IgYm90aAorICovCisjZGVmaW5lIEhVQl9TVEFUVVNfTE9DQUxfUE9XRVIJMHgwMDAxCisjZGVmaW5lIEhVQl9TVEFUVVNfT1ZFUkNVUlJFTlQJMHgwMDAyCisjZGVmaW5lIEhVQl9DSEFOR0VfTE9DQUxfUE9XRVIJMHgwMDAxCisjZGVmaW5lIEhVQl9DSEFOR0VfT1ZFUkNVUlJFTlQJMHgwMDAyCisKKworLyoKKyAqIEh1YiBkZXNjcmlwdG9yCisgKiBTZWUgVVNCIDIuMCBzcGVjIFRhYmxlIDExLTEzCisgKi8KKworI2RlZmluZSBVU0JfRFRfSFVCCQkJKFVTQl9UWVBFX0NMQVNTIHwgMHgwOSkKKyNkZWZpbmUgVVNCX0RUX1NTX0hVQgkJCShVU0JfVFlQRV9DTEFTUyB8IDB4MGEpCisjZGVmaW5lIFVTQl9EVF9IVUJfTk9OVkFSX1NJWkUJCTcKKyNkZWZpbmUgVVNCX0RUX1NTX0hVQl9TSVpFICAgICAgICAgICAgICAxMgorCitzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiRGVzY0xlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYk5iclBvcnRzOworCV9fbGUxNiB3SHViQ2hhcmFjdGVyaXN0aWNzOworCV9fdTggIGJQd3JPbjJQd3JHb29kOworCV9fdTggIGJIdWJDb250ckN1cnJlbnQ7CisKKwkvKiAyLjAgYW5kIDMuMCBodWJzIGRpZmZlciBoZXJlICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyogYWRkIDEgYml0IGZvciBodWIgc3RhdHVzIGNoYW5nZTsgcm91bmQgdG8gYnl0ZXMgKi8KKwkJCV9fdTggIERldmljZVJlbW92YWJsZVsoVVNCX01BWENISUxEUkVOICsgMSArIDcpIC8gOF07CisJCQlfX3U4ICBQb3J0UHdyQ3RybE1hc2tbKFVTQl9NQVhDSElMRFJFTiArIDEgKyA3KSAvIDhdOworCQl9ICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaHM7CisKKwkJc3RydWN0IHsKKwkJCV9fdTggYkh1YkhkckRlY0xhdDsKKwkJCV9fdTE2IHdIdWJEZWxheTsKKwkJCV9fdTE2IERldmljZVJlbW92YWJsZTsKKwkJfSAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHNzOworCX0gdTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBwb3J0IGluZGljYXRvciBzdGF0dXMgc2VsZWN0b3JzLCB0YWJsZXMgMTEtNyBhbmQgMTEtMjUgKi8KKyNkZWZpbmUgSFVCX0xFRF9BVVRPCTAKKyNkZWZpbmUgSFVCX0xFRF9BTUJFUgkxCisjZGVmaW5lIEhVQl9MRURfR1JFRU4JMgorI2RlZmluZSBIVUJfTEVEX09GRgkzCisKK2VudW0gaHViX2xlZF9tb2RlIHsKKwlJTkRJQ0FUT1JfQVVUTyA9IDAsCisJSU5ESUNBVE9SX0NZQ0xFLAorCS8qIHNvZnR3YXJlIGJsaW5rcyBmb3IgYXR0ZW50aW9uOiAgc29mdHdhcmUsIGhhcmR3YXJlLCByZXNlcnZlZCAqLworCUlORElDQVRPUl9HUkVFTl9CTElOSywgSU5ESUNBVE9SX0dSRUVOX0JMSU5LX09GRiwKKwlJTkRJQ0FUT1JfQU1CRVJfQkxJTkssIElORElDQVRPUl9BTUJFUl9CTElOS19PRkYsCisJSU5ESUNBVE9SX0FMVF9CTElOSywgSU5ESUNBVE9SX0FMVF9CTElOS19PRkYKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUcmFuc2FjdGlvbiBUcmFuc2xhdG9yIFRoaW5rIFRpbWVzLCBpbiBiaXRzICovCisjZGVmaW5lIEhVQl9UVFRUXzhfQklUUwkJMHgwMAorI2RlZmluZSBIVUJfVFRUVF8xNl9CSVRTCTB4MjAKKyNkZWZpbmUgSFVCX1RUVFRfMjRfQklUUwkweDQwCisjZGVmaW5lIEhVQl9UVFRUXzMyX0JJVFMJMHg2MAorCisjZW5kaWYgLyogX19MSU5VWF9DSDExX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvY2g5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3YmQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCkBAIC0wLDAgKzEsOTMwIEBACisvKgorICogVGhpcyBmaWxlIGhvbGRzIFVTQiBjb25zdGFudHMgYW5kIHN0cnVjdHVyZXMgdGhhdCBhcmUgbmVlZGVkIGZvcgorICogVVNCIGRldmljZSBBUElzLiAgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIFVTQiBkZXZpY2UgbW9kZWwsIHdoaWNoIGlzCisgKiBkZWZpbmVkIGluIGNoYXB0ZXIgOSBvZiB0aGUgVVNCIDIuMCBzcGVjaWZpY2F0aW9uIGFuZCBpbiB0aGUKKyAqIFdpcmVsZXNzIFVTQiAxLjAgKHNwcmVhZCBhcm91bmQpLiAgTGludXggaGFzIHNldmVyYWwgQVBJcyBpbiBDIHRoYXQKKyAqIG5lZWQgdGhlc2U6CisgKgorICogLSB0aGUgbWFzdGVyL2hvc3Qgc2lkZSBMaW51eC1VU0Iga2VybmVsIGRyaXZlciBBUEk7CisgKiAtIHRoZSAidXNiZnMiIHVzZXIgc3BhY2UgQVBJOyBhbmQKKyAqIC0gdGhlIExpbnV4ICJnYWRnZXQiIHNsYXZlL2RldmljZS9wZXJpcGhlcmFsIHNpZGUgZHJpdmVyIEFQSS4KKyAqCisgKiBVU0IgMi4wIGFkZHMgYW4gYWRkaXRpb25hbCAiT24gVGhlIEdvIiAoT1RHKSBtb2RlLCB3aGljaCBsZXRzIHN5c3RlbXMKKyAqIGFjdCBlaXRoZXIgYXMgYSBVU0IgbWFzdGVyL2hvc3Qgb3IgYXMgYSBVU0Igc2xhdmUvZGV2aWNlLiAgVGhhdCBtZWFucworICogdGhlIG1hc3RlciBhbmQgc2xhdmUgc2lkZSBBUElzIGJlbmVmaXQgZnJvbSB3b3JraW5nIHdlbGwgdG9nZXRoZXIuCisgKgorICogVGhlcmUncyBhbHNvICJXaXJlbGVzcyBVU0IiLCB1c2luZyBsb3cgcG93ZXIgc2hvcnQgcmFuZ2UgcmFkaW9zIGZvcgorICogcGVyaXBoZXJhbCBpbnRlcmNvbm5lY3Rpb24gYnV0IG90aGVyd2lzZSBidWlsZGluZyBvbiB0aGUgVVNCIGZyYW1ld29yay4KKyAqCisgKiBOb3RlIGFsbCBkZXNjcmlwdG9ycyBhcmUgZGVjbGFyZWQgJ19fYXR0cmlidXRlX18oKHBhY2tlZCkpJyBzbyB0aGF0OgorICoKKyAqIFthXSB0aGV5IG5ldmVyIGdldCBwYWRkZWQsIGVpdGhlciBpbnRlcm5hbGx5IChVU0Igc3BlYyB3cml0ZXJzCisgKiAgICAgcHJvYmFibHkgaGFuZGxlZCB0aGF0KSBvciBleHRlcm5hbGx5OworICoKKyAqIFtiXSBzbyB0aGF0IGFjY2Vzc2luZyBiaWdnZXItdGhhbi1hLWJ5dGVzIGZpZWxkcyB3aWxsIG5ldmVyCisgKiAgICAgZ2VuZXJhdGUgYnVzIGVycm9ycyBvbiBhbnkgcGxhdGZvcm0sIGV2ZW4gd2hlbiB0aGUgbG9jYXRpb24gb2YKKyAqICAgICBpdHMgZGVzY3JpcHRvciBpbnNpZGUgYSBidW5kbGUgaXNuJ3QgIm5hdHVyYWxseSBhbGlnbmVkIiwgYW5kCisgKgorICogW2NdIGZvciBjb25zaXN0ZW5jeSwgcmVtb3ZpbmcgYWxsIGRvdWJ0IGV2ZW4gd2hlbiBpdCBhcHBlYXJzIHRvCisgKiAgICAgc29tZW9uZSB0aGF0IHRoZSB0d28gb3RoZXIgcG9pbnRzIGFyZSBub24taXNzdWVzIGZvciB0aGF0CisgKiAgICAgcGFydGljdWxhciBkZXNjcmlwdG9yIHR5cGUuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1VTQl9DSDlfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9DSDlfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JLyogX191OCBldGMgKi8KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIGxlMTZfdG9fY3B1ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENPTlRST0wgUkVRVUVTVCBTVVBQT1JUICovCisKKy8qCisgKiBVU0IgZGlyZWN0aW9ucworICoKKyAqIFRoaXMgYml0IGZsYWcgaXMgdXNlZCBpbiBlbmRwb2ludCBkZXNjcmlwdG9ycycgYkVuZHBvaW50QWRkcmVzcyBmaWVsZC4KKyAqIEl0J3MgYWxzbyBvbmUgb2YgdGhyZWUgZmllbGRzIGluIGNvbnRyb2wgcmVxdWVzdHMgYlJlcXVlc3RUeXBlLgorICovCisjZGVmaW5lIFVTQl9ESVJfT1VUCQkJMAkJLyogdG8gZGV2aWNlICovCisjZGVmaW5lIFVTQl9ESVJfSU4JCQkweDgwCQkvKiB0byBob3N0ICovCisKKy8qCisgKiBVU0IgdHlwZXMsIHRoZSBzZWNvbmQgb2YgdGhyZWUgYlJlcXVlc3RUeXBlIGZpZWxkcworICovCisjZGVmaW5lIFVTQl9UWVBFX01BU0sJCQkoMHgwMyA8PCA1KQorI2RlZmluZSBVU0JfVFlQRV9TVEFOREFSRAkJKDB4MDAgPDwgNSkKKyNkZWZpbmUgVVNCX1RZUEVfQ0xBU1MJCQkoMHgwMSA8PCA1KQorI2RlZmluZSBVU0JfVFlQRV9WRU5ET1IJCQkoMHgwMiA8PCA1KQorI2RlZmluZSBVU0JfVFlQRV9SRVNFUlZFRAkJKDB4MDMgPDwgNSkKKworLyoKKyAqIFVTQiByZWNpcGllbnRzLCB0aGUgdGhpcmQgb2YgdGhyZWUgYlJlcXVlc3RUeXBlIGZpZWxkcworICovCisjZGVmaW5lIFVTQl9SRUNJUF9NQVNLCQkJMHgxZgorI2RlZmluZSBVU0JfUkVDSVBfREVWSUNFCQkweDAwCisjZGVmaW5lIFVTQl9SRUNJUF9JTlRFUkZBQ0UJCTB4MDEKKyNkZWZpbmUgVVNCX1JFQ0lQX0VORFBPSU5UCQkweDAyCisjZGVmaW5lIFVTQl9SRUNJUF9PVEhFUgkJCTB4MDMKKy8qIEZyb20gV2lyZWxlc3MgVVNCIDEuMCAqLworI2RlZmluZSBVU0JfUkVDSVBfUE9SVAkJCTB4MDQKKyNkZWZpbmUgVVNCX1JFQ0lQX1JQSVBFCQkweDA1CisKKy8qCisgKiBTdGFuZGFyZCByZXF1ZXN0cywgZm9yIHRoZSBiUmVxdWVzdCBmaWVsZCBvZiBhIFNFVFVQIHBhY2tldC4KKyAqCisgKiBUaGVzZSBhcmUgcXVhbGlmaWVkIGJ5IHRoZSBiUmVxdWVzdFR5cGUgZmllbGQsIHNvIHRoYXQgZm9yIGV4YW1wbGUKKyAqIFRZUEVfQ0xBU1Mgb3IgVFlQRV9WRU5ET1Igc3BlY2lmaWMgZmVhdHVyZSBmbGFncyBjb3VsZCBiZSByZXRyaWV2ZWQKKyAqIGJ5IGEgR0VUX1NUQVRVUyByZXF1ZXN0LgorICovCisjZGVmaW5lIFVTQl9SRVFfR0VUX1NUQVRVUwkJMHgwMAorI2RlZmluZSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkUJCTB4MDEKKyNkZWZpbmUgVVNCX1JFUV9TRVRfRkVBVFVSRQkJMHgwMworI2RlZmluZSBVU0JfUkVRX1NFVF9BRERSRVNTCQkweDA1CisjZGVmaW5lIFVTQl9SRVFfR0VUX0RFU0NSSVBUT1IJCTB4MDYKKyNkZWZpbmUgVVNCX1JFUV9TRVRfREVTQ1JJUFRPUgkJMHgwNworI2RlZmluZSBVU0JfUkVRX0dFVF9DT05GSUdVUkFUSU9OCTB4MDgKKyNkZWZpbmUgVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTgkweDA5CisjZGVmaW5lIFVTQl9SRVFfR0VUX0lOVEVSRkFDRQkJMHgwQQorI2RlZmluZSBVU0JfUkVRX1NFVF9JTlRFUkZBQ0UJCTB4MEIKKyNkZWZpbmUgVVNCX1JFUV9TWU5DSF9GUkFNRQkJMHgwQworCisjZGVmaW5lIFVTQl9SRVFfU0VUX0VOQ1JZUFRJT04JCTB4MEQJLyogV2lyZWxlc3MgVVNCICovCisjZGVmaW5lIFVTQl9SRVFfR0VUX0VOQ1JZUFRJT04JCTB4MEUKKyNkZWZpbmUgVVNCX1JFUV9SUElQRV9BQk9SVAkJMHgwRQorI2RlZmluZSBVU0JfUkVRX1NFVF9IQU5EU0hBS0UJCTB4MEYKKyNkZWZpbmUgVVNCX1JFUV9SUElQRV9SRVNFVAkJMHgwRgorI2RlZmluZSBVU0JfUkVRX0dFVF9IQU5EU0hBS0UJCTB4MTAKKyNkZWZpbmUgVVNCX1JFUV9TRVRfQ09OTkVDVElPTgkJMHgxMQorI2RlZmluZSBVU0JfUkVRX1NFVF9TRUNVUklUWV9EQVRBCTB4MTIKKyNkZWZpbmUgVVNCX1JFUV9HRVRfU0VDVVJJVFlfREFUQQkweDEzCisjZGVmaW5lIFVTQl9SRVFfU0VUX1dVU0JfREFUQQkJMHgxNAorI2RlZmluZSBVU0JfUkVRX0xPT1BCQUNLX0RBVEFfV1JJVEUJMHgxNQorI2RlZmluZSBVU0JfUkVRX0xPT1BCQUNLX0RBVEFfUkVBRAkweDE2CisjZGVmaW5lIFVTQl9SRVFfU0VUX0lOVEVSRkFDRV9EUwkweDE3CisKKy8qIFRoZSBMaW5rIFBvd2VyIE1hbmFnZW1lbnQgKExQTSkgRUNOIGRlZmluZXMgVVNCX1JFUV9URVNUX0FORF9TRVQgY29tbWFuZCwKKyAqIHVzZWQgYnkgaHVicyB0byBwdXQgcG9ydHMgaW50byBhIG5ldyBMMSBzdXNwZW5kIHN0YXRlLCBleGNlcHQgdGhhdCBpdAorICogZm9yZ290IHRvIGRlZmluZSBpdHMgbnVtYmVyIC4uLgorICovCisKKy8qCisgKiBVU0IgZmVhdHVyZSBmbGFncyBhcmUgd3JpdHRlbiB1c2luZyBVU0JfUkVRX3tDTEVBUixTRVR9X0ZFQVRVUkUsIGFuZAorICogYXJlIHJlYWQgYXMgYSBiaXQgYXJyYXkgcmV0dXJuZWQgYnkgVVNCX1JFUV9HRVRfU1RBVFVTLiAgKFNvIHRoZXJlCisgKiBhcmUgYXQgbW9zdCBzaXh0ZWVuIGZlYXR1cmVzIG9mIGVhY2ggdHlwZS4pICBIdWJzIG1heSBhbHNvIHN1cHBvcnQgYQorICogbmV3IFVTQl9SRVFfVEVTVF9BTkRfU0VUX0ZFQVRVUkUgdG8gcHV0IHBvcnRzIGludG8gTDEgc3VzcGVuZC4KKyAqLworI2RlZmluZSBVU0JfREVWSUNFX1NFTEZfUE9XRVJFRAkJMAkvKiAocmVhZCBvbmx5KSAqLworI2RlZmluZSBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVAJMQkvKiBkZXYgbWF5IGluaXRpYXRlIHdha2V1cCAqLworI2RlZmluZSBVU0JfREVWSUNFX1RFU1RfTU9ERQkJMgkvKiAod2lyZWQgaGlnaCBzcGVlZCBvbmx5KSAqLworI2RlZmluZSBVU0JfREVWSUNFX0JBVFRFUlkJCTIJLyogKHdpcmVsZXNzKSAqLworI2RlZmluZSBVU0JfREVWSUNFX0JfSE5QX0VOQUJMRQkJMwkvKiAob3RnKSBkZXYgbWF5IGluaXRpYXRlIEhOUCAqLworI2RlZmluZSBVU0JfREVWSUNFX1dVU0JfREVWSUNFCQkzCS8qICh3aXJlbGVzcykqLworI2RlZmluZSBVU0JfREVWSUNFX0FfSE5QX1NVUFBPUlQJNAkvKiAob3RnKSBSSCBwb3J0IHN1cHBvcnRzIEhOUCAqLworI2RlZmluZSBVU0JfREVWSUNFX0FfQUxUX0hOUF9TVVBQT1JUCTUJLyogKG90Zykgb3RoZXIgUkggcG9ydCBkb2VzICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfREVCVUdfTU9ERQkJNgkvKiAoc3BlY2lhbCBkZXZpY2VzIG9ubHkpICovCisKKy8qCisgKiBUZXN0IE1vZGUgU2VsZWN0b3JzCisgKiBTZWUgVVNCIDIuMCBzcGVjIFRhYmxlIDktNworICovCisjZGVmaW5lCVRFU1RfSgkJMQorI2RlZmluZQlURVNUX0sJCTIKKyNkZWZpbmUJVEVTVF9TRTBfTkFLCTMKKyNkZWZpbmUJVEVTVF9QQUNLRVQJNAorI2RlZmluZQlURVNUX0ZPUkNFX0VOCTUKKworLyoKKyAqIE5ldyBGZWF0dXJlIFNlbGVjdG9ycyBhcyBhZGRlZCBieSBVU0IgMy4wCisgKiBTZWUgVVNCIDMuMCBzcGVjIFRhYmxlIDktNgorICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfVTFfRU5BQkxFCTQ4CS8qIGRldiBtYXkgaW5pdGlhdGUgVTEgdHJhbnNpdGlvbiAqLworI2RlZmluZSBVU0JfREVWSUNFX1UyX0VOQUJMRQk0OQkvKiBkZXYgbWF5IGluaXRpYXRlIFUyIHRyYW5zaXRpb24gKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9MVE1fRU5BQkxFCTUwCS8qIGRldiBtYXkgc2VuZCBMVE0gKi8KKyNkZWZpbmUgVVNCX0lOVFJGX0ZVTkNfU1VTUEVORAkwCS8qIGZ1bmN0aW9uIHN1c3BlbmQgKi8KKworI2RlZmluZSBVU0JfSU5UUl9GVU5DX1NVU1BFTkRfT1BUX01BU0sJMHhGRjAwCisvKgorICogU3VzcGVuZCBPcHRpb25zLCBUYWJsZSA5LTcgVVNCIDMuMCBzcGVjCisgKi8KKyNkZWZpbmUgVVNCX0lOVFJGX0ZVTkNfU1VTUEVORF9MUAkoMSA8PCAoOCArIDApKQorI2RlZmluZSBVU0JfSU5UUkZfRlVOQ19TVVNQRU5EX1JXCSgxIDw8ICg4ICsgMSkpCisKKyNkZWZpbmUgVVNCX0VORFBPSU5UX0hBTFQJCTAJLyogSU4vT1VUIHdpbGwgU1RBTEwgKi8KKworLyogQml0IGFycmF5IGVsZW1lbnRzIGFzIHJldHVybmVkIGJ5IHRoZSBVU0JfUkVRX0dFVF9TVEFUVVMgcmVxdWVzdC4gKi8KKyNkZWZpbmUgVVNCX0RFVl9TVEFUX1UxX0VOQUJMRUQJCTIJLyogdHJhbnNpdGlvbiBpbnRvIFUxIHN0YXRlICovCisjZGVmaW5lIFVTQl9ERVZfU1RBVF9VMl9FTkFCTEVECQkzCS8qIHRyYW5zaXRpb24gaW50byBVMiBzdGF0ZSAqLworI2RlZmluZSBVU0JfREVWX1NUQVRfTFRNX0VOQUJMRUQJNAkvKiBMYXRlbmN5IHRvbGVyYW5jZSBtZXNzYWdlcyAqLworCisvKioKKyAqIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgLSBTRVRVUCBkYXRhIGZvciBhIFVTQiBkZXZpY2UgY29udHJvbCByZXF1ZXN0CisgKiBAYlJlcXVlc3RUeXBlOiBtYXRjaGVzIHRoZSBVU0IgYm1SZXF1ZXN0VHlwZSBmaWVsZAorICogQGJSZXF1ZXN0OiBtYXRjaGVzIHRoZSBVU0IgYlJlcXVlc3QgZmllbGQKKyAqIEB3VmFsdWU6IG1hdGNoZXMgdGhlIFVTQiB3VmFsdWUgZmllbGQgKGxlMTYgYnl0ZSBvcmRlcikKKyAqIEB3SW5kZXg6IG1hdGNoZXMgdGhlIFVTQiB3SW5kZXggZmllbGQgKGxlMTYgYnl0ZSBvcmRlcikKKyAqIEB3TGVuZ3RoOiBtYXRjaGVzIHRoZSBVU0Igd0xlbmd0aCBmaWVsZCAobGUxNiBieXRlIG9yZGVyKQorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc2VuZCBjb250cm9sIHJlcXVlc3RzIHRvIGEgVVNCIGRldmljZS4gIEl0IG1hdGNoZXMKKyAqIHRoZSBkaWZmZXJlbnQgZmllbGRzIG9mIHRoZSBVU0IgMi4wIFNwZWMgc2VjdGlvbiA5LjMsIHRhYmxlIDktMi4gIFNlZSB0aGUKKyAqIFVTQiBzcGVjIGZvciBhIGZ1bGxlciBkZXNjcmlwdGlvbiBvZiB0aGUgZGlmZmVyZW50IGZpZWxkcywgYW5kIHdoYXQgdGhleSBhcmUKKyAqIHVzZWQgZm9yLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgZHJpdmVyIGZvciBhbnkgaW50ZXJmYWNlIGNhbiBpc3N1ZSBjb250cm9sIHJlcXVlc3RzLgorICogRm9yIG1vc3QgZGV2aWNlcywgaW50ZXJmYWNlcyBkb24ndCBjb29yZGluYXRlIHdpdGggZWFjaCBvdGhlciwgc28KKyAqIHN1Y2ggcmVxdWVzdHMgbWF5IGJlIG1hZGUgYXQgYW55IHRpbWUuCisgKi8KK3N0cnVjdCB1c2JfY3RybHJlcXVlc3QgeworCV9fdTggYlJlcXVlc3RUeXBlOworCV9fdTggYlJlcXVlc3Q7CisJX19sZTE2IHdWYWx1ZTsKKwlfX2xlMTYgd0luZGV4OworCV9fbGUxNiB3TGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTVEFOREFSRCBERVNDUklQVE9SUyAuLi4gYXMgcmV0dXJuZWQgYnkgR0VUX0RFU0NSSVBUT1IsIG9yCisgKiAocmFyZWx5KSBhY2NlcHRlZCBieSBTRVRfREVTQ1JJUFRPUi4KKyAqCisgKiBOb3RlIHRoYXQgYWxsIG11bHRpLWJ5dGUgdmFsdWVzIGhlcmUgYXJlIGVuY29kZWQgaW4gbGl0dGxlIGVuZGlhbgorICogYnl0ZSBvcmRlciAib24gdGhlIHdpcmUiLiAgV2l0aGluIHRoZSBrZXJuZWwgYW5kIHdoZW4gZXhwb3NlZAorICogdGhyb3VnaCB0aGUgTGludXgtVVNCIEFQSXMsIHRoZXkgYXJlIG5vdCBjb252ZXJ0ZWQgdG8gY3B1IGJ5dGUKKyAqIG9yZGVyOyBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNsaWVudCBjb2RlIHRvIGRvIHRoaXMuCisgKiBUaGUgc2luZ2xlIGV4Y2VwdGlvbiBpcyB3aGVuIGRldmljZSBhbmQgY29uZmlndXJhdGlvbiBkZXNjcmlwdG9ycyAoYnV0CisgKiBub3Qgb3RoZXIgZGVzY3JpcHRvcnMpIGFyZSByZWFkIGZyb20gdXNiZnMgKGkuZS4gL3Byb2MvYnVzL3VzYi9CQkIvREREKTsKKyAqIGluIHRoaXMgY2FzZSB0aGUgZmllbGRzIGFyZSBjb252ZXJ0ZWQgdG8gaG9zdCBlbmRpYW5uZXNzIGJ5IHRoZSBrZXJuZWwuCisgKi8KKworLyoKKyAqIERlc2NyaXB0b3IgdHlwZXMgLi4uIFVTQiAyLjAgc3BlYyB0YWJsZSA5LjUKKyAqLworI2RlZmluZSBVU0JfRFRfREVWSUNFCQkJMHgwMQorI2RlZmluZSBVU0JfRFRfQ09ORklHCQkJMHgwMgorI2RlZmluZSBVU0JfRFRfU1RSSU5HCQkJMHgwMworI2RlZmluZSBVU0JfRFRfSU5URVJGQUNFCQkweDA0CisjZGVmaW5lIFVTQl9EVF9FTkRQT0lOVAkJCTB4MDUKKyNkZWZpbmUgVVNCX0RUX0RFVklDRV9RVUFMSUZJRVIJCTB4MDYKKyNkZWZpbmUgVVNCX0RUX09USEVSX1NQRUVEX0NPTkZJRwkweDA3CisjZGVmaW5lIFVTQl9EVF9JTlRFUkZBQ0VfUE9XRVIJCTB4MDgKKy8qIHRoZXNlIGFyZSBmcm9tIGEgbWlub3IgdXNiIDIuMCByZXZpc2lvbiAoRUNOKSAqLworI2RlZmluZSBVU0JfRFRfT1RHCQkJMHgwOQorI2RlZmluZSBVU0JfRFRfREVCVUcJCQkweDBhCisjZGVmaW5lIFVTQl9EVF9JTlRFUkZBQ0VfQVNTT0NJQVRJT04JMHgwYgorLyogdGhlc2UgYXJlIGZyb20gdGhlIFdpcmVsZXNzIFVTQiBzcGVjICovCisjZGVmaW5lIFVTQl9EVF9TRUNVUklUWQkJCTB4MGMKKyNkZWZpbmUgVVNCX0RUX0tFWQkJCTB4MGQKKyNkZWZpbmUgVVNCX0RUX0VOQ1JZUFRJT05fVFlQRQkJMHgwZQorI2RlZmluZSBVU0JfRFRfQk9TCQkJMHgwZgorI2RlZmluZSBVU0JfRFRfREVWSUNFX0NBUEFCSUxJVFkJMHgxMAorI2RlZmluZSBVU0JfRFRfV0lSRUxFU1NfRU5EUE9JTlRfQ09NUAkweDExCisjZGVmaW5lIFVTQl9EVF9XSVJFX0FEQVBURVIJCTB4MjEKKyNkZWZpbmUgVVNCX0RUX1JQSVBFCQkJMHgyMgorI2RlZmluZSBVU0JfRFRfQ1NfUkFESU9fQ09OVFJPTAkJMHgyMworLyogRnJvbSB0aGUgVDEwIFVBUyBzcGVjaWZpY2F0aW9uICovCisjZGVmaW5lIFVTQl9EVF9QSVBFX1VTQUdFCQkweDI0CisvKiBGcm9tIHRoZSBVU0IgMy4wIHNwZWMgKi8KKyNkZWZpbmUJVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAJCTB4MzAKKworLyogQ29udmVudGlvbmFsIGNvZGVzIGZvciBjbGFzcy1zcGVjaWZpYyBkZXNjcmlwdG9ycy4gIFRoZSBjb252ZW50aW9uIGlzCisgKiBkZWZpbmVkIGluIHRoZSBVU0IgIkNvbW1vbiBDbGFzcyIgU3BlYyAoMy4xMSkuICBJbmRpdmlkdWFsIGNsYXNzIHNwZWNzCisgKiBhcmUgYXV0aG9yaXRhdGl2ZSBmb3IgdGhlaXIgdXNhZ2UsIG5vdCB0aGUgImNvbW1vbiBjbGFzcyIgd3JpdGV1cC4KKyAqLworI2RlZmluZSBVU0JfRFRfQ1NfREVWSUNFCQkoVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRFRfREVWSUNFKQorI2RlZmluZSBVU0JfRFRfQ1NfQ09ORklHCQkoVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRFRfQ09ORklHKQorI2RlZmluZSBVU0JfRFRfQ1NfU1RSSU5HCQkoVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRFRfU1RSSU5HKQorI2RlZmluZSBVU0JfRFRfQ1NfSU5URVJGQUNFCQkoVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRFRfSU5URVJGQUNFKQorI2RlZmluZSBVU0JfRFRfQ1NfRU5EUE9JTlQJCShVU0JfVFlQRV9DTEFTUyB8IFVTQl9EVF9FTkRQT0lOVCkKKworLyogQWxsIHN0YW5kYXJkIGRlc2NyaXB0b3JzIGhhdmUgdGhlc2UgMiBmaWVsZHMgYXQgdGhlIGJlZ2lubmluZyAqLworc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfREVWSUNFOiBEZXZpY2UgZGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX2xlMTYgYmNkVVNCOworCV9fdTggIGJEZXZpY2VDbGFzczsKKwlfX3U4ICBiRGV2aWNlU3ViQ2xhc3M7CisJX191OCAgYkRldmljZVByb3RvY29sOworCV9fdTggIGJNYXhQYWNrZXRTaXplMDsKKwlfX2xlMTYgaWRWZW5kb3I7CisJX19sZTE2IGlkUHJvZHVjdDsKKwlfX2xlMTYgYmNkRGV2aWNlOworCV9fdTggIGlNYW51ZmFjdHVyZXI7CisJX191OCAgaVByb2R1Y3Q7CisJX191OCAgaVNlcmlhbE51bWJlcjsKKwlfX3U4ICBiTnVtQ29uZmlndXJhdGlvbnM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBVU0JfRFRfREVWSUNFX1NJWkUJCTE4CisKKworLyoKKyAqIERldmljZSBhbmQvb3IgSW50ZXJmYWNlIENsYXNzIGNvZGVzCisgKiBhcyBmb3VuZCBpbiBiRGV2aWNlQ2xhc3Mgb3IgYkludGVyZmFjZUNsYXNzCisgKiBhbmQgZGVmaW5lZCBieSB3d3cudXNiLm9yZyBkb2N1bWVudHMKKyAqLworI2RlZmluZSBVU0JfQ0xBU1NfUEVSX0lOVEVSRkFDRQkJMAkvKiBmb3IgRGV2aWNlQ2xhc3MgKi8KKyNkZWZpbmUgVVNCX0NMQVNTX0FVRElPCQkJMQorI2RlZmluZSBVU0JfQ0xBU1NfQ09NTQkJCTIKKyNkZWZpbmUgVVNCX0NMQVNTX0hJRAkJCTMKKyNkZWZpbmUgVVNCX0NMQVNTX1BIWVNJQ0FMCQk1CisjZGVmaW5lIFVTQl9DTEFTU19TVElMTF9JTUFHRQkJNgorI2RlZmluZSBVU0JfQ0xBU1NfUFJJTlRFUgkJNworI2RlZmluZSBVU0JfQ0xBU1NfTUFTU19TVE9SQUdFCQk4CisjZGVmaW5lIFVTQl9DTEFTU19IVUIJCQk5CisjZGVmaW5lIFVTQl9DTEFTU19DRENfREFUQQkJMHgwYQorI2RlZmluZSBVU0JfQ0xBU1NfQ1NDSUQJCQkweDBiCS8qIGNoaXArIHNtYXJ0IGNhcmQgKi8KKyNkZWZpbmUgVVNCX0NMQVNTX0NPTlRFTlRfU0VDCQkweDBkCS8qIGNvbnRlbnQgc2VjdXJpdHkgKi8KKyNkZWZpbmUgVVNCX0NMQVNTX1ZJREVPCQkJMHgwZQorI2RlZmluZSBVU0JfQ0xBU1NfV0lSRUxFU1NfQ09OVFJPTExFUgkweGUwCisjZGVmaW5lIFVTQl9DTEFTU19NSVNDCQkJMHhlZgorI2RlZmluZSBVU0JfQ0xBU1NfQVBQX1NQRUMJCTB4ZmUKKyNkZWZpbmUgVVNCX0NMQVNTX1ZFTkRPUl9TUEVDCQkweGZmCisKKyNkZWZpbmUgVVNCX1NVQkNMQVNTX1ZFTkRPUl9TUEVDCTB4ZmYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX0NPTkZJRzogQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIGluZm9ybWF0aW9uLgorICoKKyAqIFVTQl9EVF9PVEhFUl9TUEVFRF9DT05GSUcgaXMgdGhlIHNhbWUgZGVzY3JpcHRvciwgZXhjZXB0IHRoYXQgdGhlCisgKiBkZXNjcmlwdG9yIHR5cGUgaXMgZGlmZmVyZW50LiAgSGlnaHNwZWVkLWNhcGFibGUgZGV2aWNlcyBjYW4gbG9vaworICogZGlmZmVyZW50IGRlcGVuZGluZyBvbiB3aGF0IHNwZWVkIHRoZXkncmUgY3VycmVudGx5IHJ1bm5pbmcuICBPbmx5CisgKiBkZXZpY2VzIHdpdGggYSBVU0JfRFRfREVWSUNFX1FVQUxJRklFUiBoYXZlIGFueSBPVEhFUl9TUEVFRF9DT05GSUcKKyAqIGRlc2NyaXB0b3JzLgorICovCitzdHJ1Y3QgdXNiX2NvbmZpZ19kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fbGUxNiB3VG90YWxMZW5ndGg7CisJX191OCAgYk51bUludGVyZmFjZXM7CisJX191OCAgYkNvbmZpZ3VyYXRpb25WYWx1ZTsKKwlfX3U4ICBpQ29uZmlndXJhdGlvbjsKKwlfX3U4ICBibUF0dHJpYnV0ZXM7CisJX191OCAgYk1heFBvd2VyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX0NPTkZJR19TSVpFCQk5CisKKy8qIGZyb20gY29uZmlnIGRlc2NyaXB0b3IgYm1BdHRyaWJ1dGVzICovCisjZGVmaW5lIFVTQl9DT05GSUdfQVRUX09ORQkJKDEgPDwgNykJLyogbXVzdCBiZSBzZXQgKi8KKyNkZWZpbmUgVVNCX0NPTkZJR19BVFRfU0VMRlBPV0VSCSgxIDw8IDYpCS8qIHNlbGYgcG93ZXJlZCAqLworI2RlZmluZSBVU0JfQ09ORklHX0FUVF9XQUtFVVAJCSgxIDw8IDUpCS8qIGNhbiB3YWtldXAgKi8KKyNkZWZpbmUgVVNCX0NPTkZJR19BVFRfQkFUVEVSWQkJKDEgPDwgNCkJLyogYmF0dGVyeSBwb3dlcmVkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9TVFJJTkc6IFN0cmluZyBkZXNjcmlwdG9yICovCitzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fbGUxNiB3RGF0YVsxXTsJCS8qIFVURi0xNkxFIGVuY29kZWQgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBub3RlIHRoYXQgInN0cmluZyIgemVybyBpcyBzcGVjaWFsLCBpdCBob2xkcyBsYW5ndWFnZSBjb2RlcyB0aGF0CisgKiB0aGUgZGV2aWNlIHN1cHBvcnRzLCBub3QgVW5pY29kZSBjaGFyYWN0ZXJzLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9JTlRFUkZBQ0U6IEludGVyZmFjZSBkZXNjcmlwdG9yICovCitzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fdTggIGJJbnRlcmZhY2VOdW1iZXI7CisJX191OCAgYkFsdGVybmF0ZVNldHRpbmc7CisJX191OCAgYk51bUVuZHBvaW50czsKKwlfX3U4ICBiSW50ZXJmYWNlQ2xhc3M7CisJX191OCAgYkludGVyZmFjZVN1YkNsYXNzOworCV9fdTggIGJJbnRlcmZhY2VQcm90b2NvbDsKKwlfX3U4ICBpSW50ZXJmYWNlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX0lOVEVSRkFDRV9TSVpFCQk5CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9FTkRQT0lOVDogRW5kcG9pbnQgZGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fdTggIGJFbmRwb2ludEFkZHJlc3M7CisJX191OCAgYm1BdHRyaWJ1dGVzOworCV9fbGUxNiB3TWF4UGFja2V0U2l6ZTsKKwlfX3U4ICBiSW50ZXJ2YWw7CisKKwkvKiBOT1RFOiAgdGhlc2UgdHdvIGFyZSBfb25seV8gaW4gYXVkaW8gZW5kcG9pbnRzLiAqLworCS8qIHVzZSBVU0JfRFRfRU5EUE9JTlQqX1NJWkUgaW4gYkxlbmd0aCwgbm90IHNpemVvZi4gKi8KKwlfX3U4ICBiUmVmcmVzaDsKKwlfX3U4ICBiU3luY2hBZGRyZXNzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX0VORFBPSU5UX1NJWkUJCTcKKyNkZWZpbmUgVVNCX0RUX0VORFBPSU5UX0FVRElPX1NJWkUJOQkvKiBBdWRpbyBleHRlbnNpb24gKi8KKworCisvKgorICogRW5kcG9pbnRzCisgKi8KKyNkZWZpbmUgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLCTB4MGYJLyogaW4gYkVuZHBvaW50QWRkcmVzcyAqLworI2RlZmluZSBVU0JfRU5EUE9JTlRfRElSX01BU0sJCTB4ODAKKworI2RlZmluZSBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSwkweDAzCS8qIGluIGJtQXR0cmlidXRlcyAqLworI2RlZmluZSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MCTAKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1hGRVJfSVNPQwkJMQorI2RlZmluZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLCQkyCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9YRkVSX0lOVAkJMworI2RlZmluZSBVU0JfRU5EUE9JTlRfTUFYX0FESlVTVEFCTEUJMHg4MAorCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9TWU5DVFlQRQkJMHgwYworI2RlZmluZSBVU0JfRU5EUE9JTlRfU1lOQ19OT05FCQkoMCA8PCAyKQorI2RlZmluZSBVU0JfRU5EUE9JTlRfU1lOQ19BU1lOQwkJKDEgPDwgMikKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NZTkNfQURBUFRJVkUJKDIgPDwgMikKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NZTkNfU1lOQwkJKDMgPDwgMikKKworI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfTUFTSwkJMHgzMAorI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfREFUQQkJMHgwMAorI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfRkVFREJBQ0sJMHgxMAorI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfSU1QTElDSVRfRkIJMHgyMAkvKiBJbXBsaWNpdCBmZWVkYmFjayBEYXRhIGVuZHBvaW50ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogdXNiX2VuZHBvaW50X251bSAtIGdldCB0aGUgZW5kcG9pbnQncyBudW1iZXIKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIEBlcGQncyBudW1iZXI6IDAgdG8gMTUuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB1c2JfZW5kcG9pbnRfbnVtKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiBlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X3R5cGUgLSBnZXQgdGhlIGVuZHBvaW50J3MgdHJhbnNmZXIgdHlwZQorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgb25lIG9mIFVTQl9FTkRQT0lOVF9YRkVSX3tDT05UUk9MLCBJU09DLCBCVUxLLCBJTlR9IGFjY29yZGluZworICogdG8gQGVwZCdzIHRyYW5zZmVyIHR5cGUuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB1c2JfZW5kcG9pbnRfdHlwZShjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSzsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfZGlyX2luIC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGhhcyBJTiBkaXJlY3Rpb24KKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGlzIG9mIHR5cGUgSU4sIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdXNiX2VuZHBvaW50X2Rpcl9pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKChlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9kaXJfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGhhcyBPVVQgZGlyZWN0aW9uCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIE9VVCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB1c2JfZW5kcG9pbnRfZGlyX291dCgKKwkJCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKChlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfeGZlcl9idWxrIC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGhhcyBidWxrIHRyYW5zZmVyIHR5cGUKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGlzIG9mIHR5cGUgYnVsaywgb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB1c2JfZW5kcG9pbnRfeGZlcl9idWxrKAorCQkJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09CisJCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEspOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2wgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaGFzIGNvbnRyb2wgdHJhbnNmZXIgdHlwZQorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBjb250cm9sLCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woCisJCQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICgoZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KKwkJVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X3hmZXJfaW50IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGhhcyBpbnRlcnJ1cHQgdHJhbnNmZXIgdHlwZQorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBpbnRlcnJ1cHQsIG90aGVyd2lzZSBpdCByZXR1cm5zCisgKiBmYWxzZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHVzYl9lbmRwb2ludF94ZmVyX2ludCgKKwkJCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQorCQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF94ZmVyX2lzb2MgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaGFzIGlzb2Nocm9ub3VzIHRyYW5zZmVyIHR5cGUKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGlzIG9mIHR5cGUgaXNvY2hyb25vdXMsIG90aGVyd2lzZSBpdCByZXR1cm5zCisgKiBmYWxzZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoCisJCQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICgoZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KKwkJVVNCX0VORFBPSU5UX1hGRVJfSVNPQyk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2J1bGtfaW4gLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaXMgYnVsayBJTgorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaGFzIGJ1bGsgdHJhbnNmZXIgdHlwZSBhbmQgSU4gZGlyZWN0aW9uLAorICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB1c2JfZW5kcG9pbnRfaXNfYnVsa19pbigKKwkJCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gdXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfaW4oZXBkKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaXMgYnVsayBPVVQKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBidWxrIHRyYW5zZmVyIHR5cGUgYW5kIE9VVCBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHVzYl9lbmRwb2ludF9pc19idWxrX291dCgKKwkJCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gdXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2ludF9pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgSU4KKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpbnRlcnJ1cHQgdHJhbnNmZXIgdHlwZSBhbmQgSU4gZGlyZWN0aW9uLAorICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB1c2JfZW5kcG9pbnRfaXNfaW50X2luKAorCQkJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiB1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX2luKGVwZCk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2ludF9vdXQgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaXMgaW50ZXJydXB0IE9VVAorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaGFzIGludGVycnVwdCB0cmFuc2ZlciB0eXBlIGFuZCBPVVQgZGlyZWN0aW9uLAorICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB1c2JfZW5kcG9pbnRfaXNfaW50X291dCgKKwkJCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfaXNfaXNvY19pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpc29jaHJvbm91cyBJTgorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaGFzIGlzb2Nocm9ub3VzIHRyYW5zZmVyIHR5cGUgYW5kIElOIGRpcmVjdGlvbiwKKyAqIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdXNiX2VuZHBvaW50X2lzX2lzb2NfaW4oCisJCQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuIHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX2luKGVwZCk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2lzb2Nfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGlzb2Nocm9ub3VzIE9VVAorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaGFzIGlzb2Nocm9ub3VzIHRyYW5zZmVyIHR5cGUgYW5kIE9VVCBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHVzYl9lbmRwb2ludF9pc19pc29jX291dCgKKwkJCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X21heHAgLSBnZXQgZW5kcG9pbnQncyBtYXggcGFja2V0IHNpemUKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIEBlcGQncyBtYXggcGFja2V0CisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB1c2JfZW5kcG9pbnRfbWF4cChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gX19sZTE2X3RvX2NwdShlcGQtPndNYXhQYWNrZXRTaXplKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX1NTX0VORFBPSU5UX0NPTVA6IFN1cGVyU3BlZWQgRW5kcG9pbnQgQ29tcGFuaW9uIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fdTggIGJNYXhCdXJzdDsKKwlfX3U4ICBibUF0dHJpYnV0ZXM7CisJX19sZTE2IHdCeXRlc1BlckludGVydmFsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX1NTX0VQX0NPTVBfU0laRQkJNgorCisvKiBCaXRzIDQ6MCBvZiBibUF0dHJpYnV0ZXMgaWYgdGhpcyBpcyBhIGJ1bGsgZW5kcG9pbnQgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludAordXNiX3NzX21heF9zdHJlYW1zKGNvbnN0IHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yICpjb21wKQoreworCWludAkJbWF4X3N0cmVhbXM7CisKKwlpZiAoIWNvbXApCisJCXJldHVybiAwOworCisJbWF4X3N0cmVhbXMgPSBjb21wLT5ibUF0dHJpYnV0ZXMgJiAweDFmOworCisJaWYgKCFtYXhfc3RyZWFtcykKKwkJcmV0dXJuIDA7CisKKwltYXhfc3RyZWFtcyA9IDEgPDwgbWF4X3N0cmVhbXM7CisKKwlyZXR1cm4gbWF4X3N0cmVhbXM7Cit9CisKKy8qIEJpdHMgMTowIG9mIGJtQXR0cmlidXRlcyBpZiB0aGlzIGlzIGFuIGlzb2MgZW5kcG9pbnQgKi8KKyNkZWZpbmUgVVNCX1NTX01VTFQocCkJCQkoMSArICgocCkgJiAweDMpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfREVWSUNFX1FVQUxJRklFUjogRGV2aWNlIFF1YWxpZmllciBkZXNjcmlwdG9yICovCitzdHJ1Y3QgdXNiX3F1YWxpZmllcl9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fbGUxNiBiY2RVU0I7CisJX191OCAgYkRldmljZUNsYXNzOworCV9fdTggIGJEZXZpY2VTdWJDbGFzczsKKwlfX3U4ICBiRGV2aWNlUHJvdG9jb2w7CisJX191OCAgYk1heFBhY2tldFNpemUwOworCV9fdTggIGJOdW1Db25maWd1cmF0aW9uczsKKwlfX3U4ICBiUkVTRVJWRUQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfT1RHIChmcm9tIE9URyAxLjBhIHN1cHBsZW1lbnQpICovCitzdHJ1Y3QgdXNiX290Z19kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fdTggIGJtQXR0cmlidXRlczsJLyogc3VwcG9ydCBmb3IgSE5QLCBTUlAsIGV0YyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIGZyb20gdXNiX290Z19kZXNjcmlwdG9yLmJtQXR0cmlidXRlcyAqLworI2RlZmluZSBVU0JfT1RHX1NSUAkJKDEgPDwgMCkKKyNkZWZpbmUgVVNCX09UR19ITlAJCSgxIDw8IDEpCS8qIHN3YXAgaG9zdC9kZXZpY2Ugcm9sZXMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX0RFQlVHOiAgZm9yIHNwZWNpYWwgaGlnaHNwZWVkIGRldmljZXMsIHJlcGxhY2luZyBzZXJpYWwgY29uc29sZSAqLworc3RydWN0IHVzYl9kZWJ1Z19kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCS8qIGJ1bGsgZW5kcG9pbnRzIHdpdGggOCBieXRlIG1heHBhY2tldCAqLworCV9fdTggIGJEZWJ1Z0luRW5kcG9pbnQ7CisJX191OCAgYkRlYnVnT3V0RW5kcG9pbnQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfSU5URVJGQUNFX0FTU09DSUFUSU9OOiBncm91cHMgaW50ZXJmYWNlcyAqLworc3RydWN0IHVzYl9pbnRlcmZhY2VfYXNzb2NfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX3U4ICBiRmlyc3RJbnRlcmZhY2U7CisJX191OCAgYkludGVyZmFjZUNvdW50OworCV9fdTggIGJGdW5jdGlvbkNsYXNzOworCV9fdTggIGJGdW5jdGlvblN1YkNsYXNzOworCV9fdTggIGJGdW5jdGlvblByb3RvY29sOworCV9fdTggIGlGdW5jdGlvbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9TRUNVUklUWTogIGdyb3VwIG9mIHdpcmVsZXNzIHNlY3VyaXR5IGRlc2NyaXB0b3JzLCBpbmNsdWRpbmcKKyAqIGVuY3J5cHRpb24gdHlwZXMgYXZhaWxhYmxlIGZvciBzZXR0aW5nIHVwIGEgQ0MvYXNzb2NpYXRpb24uCisgKi8KK3N0cnVjdCB1c2Jfc2VjdXJpdHlfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX2xlMTYgd1RvdGFsTGVuZ3RoOworCV9fdTggIGJOdW1FbmNyeXB0aW9uVHlwZXM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfS0VZOiAgdXNlZCB3aXRoIHtHRVQsU0VUfV9TRUNVUklUWV9EQVRBOyBvbmx5IHB1YmxpYyBrZXlzCisgKiBtYXkgYmUgcmV0cmlldmVkLgorICovCitzdHJ1Y3QgdXNiX2tleV9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fdTggIHRUS0lEWzNdOworCV9fdTggIGJSZXNlcnZlZDsKKwlfX3U4ICBiS2V5RGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9FTkNSWVBUSU9OX1RZUEU6ICBidW5kbGVkIGluIERUX1NFQ1VSSVRZIGdyb3VwcyAqLworc3RydWN0IHVzYl9lbmNyeXB0aW9uX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCisJX191OCAgYkVuY3J5cHRpb25UeXBlOworI2RlZmluZQlVU0JfRU5DX1RZUEVfVU5TRUNVUkUJCTAKKyNkZWZpbmUJVVNCX0VOQ19UWVBFX1dJUkVECQkxCS8qIG5vbi13aXJlbGVzcyBtb2RlICovCisjZGVmaW5lCVVTQl9FTkNfVFlQRV9DQ01fMQkJMgkvKiBhZXMxMjgvY2JjIHNlc3Npb24gKi8KKyNkZWZpbmUJVVNCX0VOQ19UWVBFX1JTQV8xCQkzCS8qIHJzYTMwNzIvc2hhMSBhdXRoICovCisJX191OCAgYkVuY3J5cHRpb25WYWx1ZTsJCS8qIHVzZSBpbiBTRVRfRU5DUllQVElPTiAqLworCV9fdTggIGJBdXRoS2V5SW5kZXg7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9CT1M6ICBncm91cCBvZiBkZXZpY2UtbGV2ZWwgY2FwYWJpbGl0aWVzICovCitzdHJ1Y3QgdXNiX2Jvc19kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fbGUxNiB3VG90YWxMZW5ndGg7CisJX191OCAgYk51bURldmljZUNhcHM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9CT1NfU0laRQkJNQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX0RFVklDRV9DQVBBQklMSVRZOiAgZ3JvdXBlZCB3aXRoIEJPUyAqLworc3RydWN0IHVzYl9kZXZfY2FwX2hlYWRlciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRldkNhcGFiaWxpdHlUeXBlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZQlVU0JfQ0FQX1RZUEVfV0lSRUxFU1NfVVNCCTEKKworc3RydWN0IHVzYl93aXJlbGVzc19jYXBfZGVzY3JpcHRvciB7CS8qIFVsdHJhIFdpZGUgQmFuZCAqLworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXZDYXBhYmlsaXR5VHlwZTsKKworCV9fdTggIGJtQXR0cmlidXRlczsKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1AyUF9EUkQJCSgxIDw8IDEpCisjZGVmaW5lCVVTQl9XSVJFTEVTU19CRUFDT05fTUFTSwkoMyA8PCAyKQorI2RlZmluZQlVU0JfV0lSRUxFU1NfQkVBQ09OX1NFTEYJKDEgPDwgMikKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX0JFQUNPTl9ESVJFQ1RFRAkoMiA8PCAyKQorI2RlZmluZQlVU0JfV0lSRUxFU1NfQkVBQ09OX05PTkUJKDMgPDwgMikKKwlfX2xlMTYgd1BIWVJhdGVzOwkvKiBiaXQgcmF0ZXMsIE1icHMgKi8KKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV81MwkJKDEgPDwgMCkJLyogYWx3YXlzIHNldCAqLworI2RlZmluZQlVU0JfV0lSRUxFU1NfUEhZXzgwCQkoMSA8PCAxKQorI2RlZmluZQlVU0JfV0lSRUxFU1NfUEhZXzEwNwkJKDEgPDwgMikJLyogYWx3YXlzIHNldCAqLworI2RlZmluZQlVU0JfV0lSRUxFU1NfUEhZXzE2MAkJKDEgPDwgMykKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV8yMDAJCSgxIDw8IDQpCS8qIGFsd2F5cyBzZXQgKi8KKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV8zMjAJCSgxIDw8IDUpCisjZGVmaW5lCVVTQl9XSVJFTEVTU19QSFlfNDAwCQkoMSA8PCA2KQorI2RlZmluZQlVU0JfV0lSRUxFU1NfUEhZXzQ4MAkJKDEgPDwgNykKKwlfX3U4ICBibVRGSVRYUG93ZXJJbmZvOwkvKiBURkkgcG93ZXIgbGV2ZWxzICovCisJX191OCAgYm1GRklUWFBvd2VySW5mbzsJLyogRkZJIHBvd2VyIGxldmVscyAqLworCV9fbGUxNiBibUJhbmRHcm91cDsKKwlfX3U4ICBiUmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBVU0IgMi4wIEV4dGVuc2lvbiBkZXNjcmlwdG9yICovCisjZGVmaW5lCVVTQl9DQVBfVFlQRV9FWFQJCTIKKworc3RydWN0IHVzYl9leHRfY2FwX2Rlc2NyaXB0b3IgewkJLyogTGluayBQb3dlciBNYW5hZ2VtZW50ICovCisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRldkNhcGFiaWxpdHlUeXBlOworCV9fbGUzMiBibUF0dHJpYnV0ZXM7CisjZGVmaW5lIFVTQl9MUE1fU1VQUE9SVAkJCSgxIDw8IDEpCS8qIHN1cHBvcnRzIExQTSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBVU0JfRFRfVVNCX0VYVF9DQVBfU0laRQk3CisKKy8qCisgKiBTdXBlclNwZWVkIFVTQiBDYXBhYmlsaXR5IGRlc2NyaXB0b3I6IERlZmluZXMgdGhlIHNldCBvZiBTdXBlclNwZWVkIFVTQgorICogc3BlY2lmaWMgZGV2aWNlIGxldmVsIGNhcGFiaWxpdGllcworICovCisjZGVmaW5lCQlVU0JfU1NfQ0FQX1RZUEUJCTMKK3N0cnVjdCB1c2Jfc3NfY2FwX2Rlc2NyaXB0b3IgewkJLyogTGluayBQb3dlciBNYW5hZ2VtZW50ICovCisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRldkNhcGFiaWxpdHlUeXBlOworCV9fdTggIGJtQXR0cmlidXRlczsKKyNkZWZpbmUgVVNCX0xUTV9TVVBQT1JUCQkJKDEgPDwgMSkgLyogc3VwcG9ydHMgTFRNICovCisJX19sZTE2IHdTcGVlZFN1cHBvcnRlZDsKKyNkZWZpbmUgVVNCX0xPV19TUEVFRF9PUEVSQVRJT04JCSgxKQkgLyogTG93IHNwZWVkIG9wZXJhdGlvbiAqLworI2RlZmluZSBVU0JfRlVMTF9TUEVFRF9PUEVSQVRJT04JKDEgPDwgMSkgLyogRnVsbCBzcGVlZCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgVVNCX0hJR0hfU1BFRURfT1BFUkFUSU9OCSgxIDw8IDIpIC8qIEhpZ2ggc3BlZWQgb3BlcmF0aW9uICovCisjZGVmaW5lIFVTQl81R0JQU19PUEVSQVRJT04JCSgxIDw8IDMpIC8qIE9wZXJhdGlvbiBhdCA1R2JwcyAqLworCV9fdTggIGJGdW5jdGlvbmFsaXR5U3VwcG9ydDsKKwlfX3U4ICBiVTFkZXZFeGl0TGF0OworCV9fbGUxNiBiVTJEZXZFeGl0TGF0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBVU0JfRFRfVVNCX1NTX0NBUF9TSVpFCTEwCisKKy8qCisgKiBDb250YWluZXIgSUQgQ2FwYWJpbGl0eSBkZXNjcmlwdG9yOiBEZWZpbmVzIHRoZSBpbnN0YW5jZSB1bmlxdWUgSUQgdXNlZCB0bworICogaWRlbnRpZnkgdGhlIGluc3RhbmNlIGFjcm9zcyBhbGwgb3BlcmF0aW5nIG1vZGVzCisgKi8KKyNkZWZpbmUJQ09OVEFJTkVSX0lEX1RZUEUJNAorc3RydWN0IHVzYl9zc19jb250YWluZXJfaWRfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRldkNhcGFiaWxpdHlUeXBlOworCV9fdTggIGJSZXNlcnZlZDsKKwlfX3U4ICBDb250YWluZXJJRFsxNl07IC8qIDEyOC1iaXQgbnVtYmVyICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9VU0JfU1NfQ09OVE5fSURfU0laRQkyMAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX1dJUkVMRVNTX0VORFBPSU5UX0NPTVA6ICBjb21wYW5pb24gZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGgKKyAqIGVhY2ggZW5kcG9pbnQgZGVzY3JpcHRvciBmb3IgYSB3aXJlbGVzcyBkZXZpY2UKKyAqLworc3RydWN0IHVzYl93aXJlbGVzc19lcF9jb21wX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCisJX191OCAgYk1heEJ1cnN0OworCV9fdTggIGJNYXhTZXF1ZW5jZTsKKwlfX2xlMTYgd01heFN0cmVhbURlbGF5OworCV9fbGUxNiB3T3ZlclRoZUFpclBhY2tldFNpemU7CisJX191OCAgYk92ZXJUaGVBaXJJbnRlcnZhbDsKKwlfX3U4ICBibUNvbXBBdHRyaWJ1dGVzOworI2RlZmluZSBVU0JfRU5EUE9JTlRfU1dJVENIX01BU0sJMHgwMwkvKiBpbiBibUNvbXBBdHRyaWJ1dGVzICovCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9TV0lUQ0hfTk8JCTAKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NXSVRDSF9TV0lUQ0gJMQorI2RlZmluZSBVU0JfRU5EUE9JTlRfU1dJVENIX1NDQUxFCTIKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9SRVFfU0VUX0hBTkRTSEFLRSBpcyBhIGZvdXItd2F5IGhhbmRzaGFrZSB1c2VkIGJldHdlZW4gYSB3aXJlbGVzcworICogaG9zdCBhbmQgYSBkZXZpY2UgZm9yIGNvbm5lY3Rpb24gc2V0IHVwLCBtdXR1YWwgYXV0aGVudGljYXRpb24sIGFuZAorICogZXhjaGFuZ2luZyBzaG9ydCBsaXZlZCBzZXNzaW9uIGtleXMuICBUaGUgaGFuZHNoYWtlIGRlcGVuZHMgb24gYSBDQy4KKyAqLworc3RydWN0IHVzYl9oYW5kc2hha2UgeworCV9fdTggYk1lc3NhZ2VOdW1iZXI7CisJX191OCBiU3RhdHVzOworCV9fdTggdFRLSURbM107CisJX191OCBiUmVzZXJ2ZWQ7CisJX191OCBDRElEWzE2XTsKKwlfX3U4IG5vbmNlWzE2XTsKKwlfX3U4IE1JQ1s4XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9SRVFfU0VUX0NPTk5FQ1RJT04gbW9kaWZpZXMgb3IgcmV2b2tlcyBhIGNvbm5lY3Rpb24gY29udGV4dCAoQ0MpLgorICogQSBDQyBtYXkgYWxzbyBiZSBzZXQgdXAgdXNpbmcgbm9uLXdpcmVsZXNzIHNlY3VyZSBjaGFubmVscyAoaW5jbHVkaW5nCisgKiB3aXJlZCBVU0IhKSwgYW5kIHNvbWUgZGV2aWNlcyBtYXkgc3VwcG9ydCBDQ3Mgd2l0aCBtdWx0aXBsZSBob3N0cy4KKyAqLworc3RydWN0IHVzYl9jb25uZWN0aW9uX2NvbnRleHQgeworCV9fdTggQ0hJRFsxNl07CQkvKiBwZXJzaXN0ZW50IGhvc3QgaWQgKi8KKwlfX3U4IENESURbMTZdOwkJLyogZGV2aWNlIGlkICh1bmlxdWUgdy9pbiBob3N0IGNvbnRleHQpICovCisJX191OCBDS1sxNl07CQkvKiBjb25uZWN0aW9uIGtleSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCIDIuMCBkZWZpbmVzIHRocmVlIHNwZWVkcywgaGVyZSdzIGhvdyBMaW51eCBpZGVudGlmaWVzIHRoZW0gKi8KKworZW51bSB1c2JfZGV2aWNlX3NwZWVkIHsKKwlVU0JfU1BFRURfVU5LTk9XTiA9IDAsCQkJLyogZW51bWVyYXRpbmcgKi8KKwlVU0JfU1BFRURfTE9XLCBVU0JfU1BFRURfRlVMTCwJCS8qIHVzYiAxLjEgKi8KKwlVU0JfU1BFRURfSElHSCwJCQkJLyogdXNiIDIuMCAqLworCVVTQl9TUEVFRF9XSVJFTEVTUywJCQkvKiB3aXJlbGVzcyAodXNiIDIuNSkgKi8KKwlVU0JfU1BFRURfU1VQRVIsCQkJLyogdXNiIDMuMCAqLworfTsKKworCitlbnVtIHVzYl9kZXZpY2Vfc3RhdGUgeworCS8qIE5PVEFUVEFDSEVEIGlzbid0IGluIHRoZSBVU0Igc3BlYywgYW5kIHRoaXMgc3RhdGUgYWN0cworCSAqIHRoZSBzYW1lIGFzIEFUVEFDSEVEIC4uLiBidXQgaXQncyBjbGVhcmVyIHRoaXMgd2F5LgorCSAqLworCVVTQl9TVEFURV9OT1RBVFRBQ0hFRCA9IDAsCisKKwkvKiBjaGFwdGVyIDkgYW5kIGF1dGhlbnRpY2F0aW9uICh3aXJlbGVzcykgZGV2aWNlIHN0YXRlcyAqLworCVVTQl9TVEFURV9BVFRBQ0hFRCwKKwlVU0JfU1RBVEVfUE9XRVJFRCwJCQkvKiB3aXJlZCAqLworCVVTQl9TVEFURV9SRUNPTk5FQ1RJTkcsCQkJLyogYXV0aCAqLworCVVTQl9TVEFURV9VTkFVVEhFTlRJQ0FURUQsCQkvKiBhdXRoICovCisJVVNCX1NUQVRFX0RFRkFVTFQsCQkJLyogbGltaXRlZCBmdW5jdGlvbiAqLworCVVTQl9TVEFURV9BRERSRVNTLAorCVVTQl9TVEFURV9DT05GSUdVUkVELAkJCS8qIG1vc3QgZnVuY3Rpb25zICovCisKKwlVU0JfU1RBVEVfU1VTUEVOREVECisKKwkvKiBOT1RFOiAgdGhlcmUgYXJlIGFjdHVhbGx5IGZvdXIgZGlmZmVyZW50IFNVU1BFTkRFRAorCSAqIHN0YXRlcywgcmV0dXJuaW5nIHRvIFBPV0VSRUQsIERFRkFVTFQsIEFERFJFU1MsIG9yCisJICogQ09ORklHVVJFRCByZXNwZWN0aXZlbHkgd2hlbiBTT0YgdG9rZW5zIGZsb3cgYWdhaW4uCisJICogQXQgdGhpcyBsZXZlbCB0aGVyZSdzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBMMSBhbmQgTDIKKwkgKiBzdXNwZW5kIHN0YXRlcy4gIChMMiBiZWluZyBvcmlnaW5hbCBVU0IgMS4xIHN1c3BlbmQuKQorCSAqLworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEFzIHBlciBVU0IgY29tcGxpYW5jZSB1cGRhdGUsIGEgZGV2aWNlIHRoYXQgaXMgYWN0aXZlbHkgZHJhd2luZworICogbW9yZSB0aGFuIDEwMG1BIGZyb20gVVNCIG11c3QgcmVwb3J0IGl0c2VsZiBhcyBidXMtcG93ZXJlZCBpbgorICogdGhlIEdldFN0YXR1cyhERVZJQ0UpIGNhbGwuCisgKiBodHRwOi8vY29tcGxpYW5jZS51c2Iub3JnL2luZGV4LmFzcD9VcGRhdGVGaWxlPUVsZWN0cmljYWwmRm9ybWF0PVN0YW5kYXJkIzM0CisgKi8KKyNkZWZpbmUgVVNCX1NFTEZfUE9XRVJfVkJVU19NQVhfRFJBVwkJMTAwCisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9DSDlfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvZnVuY3Rpb25mcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvZnVuY3Rpb25mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTNmMzAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9mdW5jdGlvbmZzLmgKQEAgLTAsMCArMSwxNjcgQEAKKyNpZm5kZWYgX19MSU5VWF9GVU5DVElPTkZTX0hfXworI2RlZmluZSBfX0xJTlVYX0ZVTkNUSU9ORlNfSF9fIDEKKworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorCisKK2VudW0geworCUZVTkNUSU9ORlNfREVTQ1JJUFRPUlNfTUFHSUMgPSAxLAorCUZVTkNUSU9ORlNfU1RSSU5HU19NQUdJQyAgICAgPSAyCit9OworCisKKworLyogRGVzY3JpcHRvciBvZiBhbiBub24tYXVkaW8gZW5kcG9pbnQgKi8KK3N0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX3U4ICBiRW5kcG9pbnRBZGRyZXNzOworCV9fdTggIGJtQXR0cmlidXRlczsKKwlfX2xlMTYgd01heFBhY2tldFNpemU7CisJX191OCAgYkludGVydmFsOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKgorICogQWxsIG51bWJlcnMgbXVzdCBiZSBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyLgorICovCisKK3N0cnVjdCB1c2JfZnVuY3Rpb25mc19kZXNjc19oZWFkIHsKKwlfX2xlMzIgbWFnaWM7CisJX19sZTMyIGxlbmd0aDsKKwlfX2xlMzIgZnNfY291bnQ7CisJX19sZTMyIGhzX2NvdW50OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIERlc2NyaXB0b3JzIGZvcm1hdDoKKyAqCisgKiB8IG9mZiB8IG5hbWUgICAgICB8IHR5cGUgICAgICAgICB8IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgMCB8IG1hZ2ljICAgICB8IExFMzIgICAgICAgICB8IEZVTkNUSU9ORlNfe0ZTLEhTfV9ERVNDUklQVE9SU19NQUdJQyB8CisgKiB8ICAgNCB8IGxlbmd0aCAgICB8IExFMzIgICAgICAgICB8IGxlbmd0aCBvZiB0aGUgd2hvbGUgZGF0YSBjaHVuayAgICAgICB8CisgKiB8ICAgOCB8IGZzX2NvdW50ICB8IExFMzIgICAgICAgICB8IG51bWJlciBvZiBmdWxsLXNwZWVkIGRlc2NyaXB0b3JzICAgICB8CisgKiB8ICAxMiB8IGhzX2NvdW50ICB8IExFMzIgICAgICAgICB8IG51bWJlciBvZiBoaWdoLXNwZWVkIGRlc2NyaXB0b3JzICAgICB8CisgKiB8ICAxNiB8IGZzX2Rlc2NycyB8IERlc2NyaXB0b3JbXSB8IGxpc3Qgb2YgZnVsbC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgICB8CisgKiB8ICAgICB8IGhzX2Rlc2NycyB8IERlc2NyaXB0b3JbXSB8IGxpc3Qgb2YgaGlnaC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgICB8CisgKgorICogZGVzY3MgYXJlIGp1c3QgdmFsaWQgVVNCIGRlc2NyaXB0b3JzIGFuZCBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICoKKyAqIHwgb2ZmIHwgbmFtZSAgICAgICAgICAgIHwgdHlwZSB8IGRlc2NyaXB0aW9uICAgICAgICAgICAgICB8CisgKiB8LS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgIDAgfCBiTGVuZ3RoICAgICAgICAgfCBVOCAgIHwgbGVuZ3RoIG9mIHRoZSBkZXNjcmlwdG9yIHwKKyAqIHwgICAxIHwgYkRlc2NyaXB0b3JUeXBlIHwgVTggICB8IGRlc2NyaXB0b3IgdHlwZSAgICAgICAgICB8CisgKiB8ICAgMiB8IHBheWxvYWQgICAgICAgICB8ICAgICAgfCBkZXNjcmlwdG9yJ3MgcGF5bG9hZCAgICAgfAorICovCisKK3N0cnVjdCB1c2JfZnVuY3Rpb25mc19zdHJpbmdzX2hlYWQgeworCV9fbGUzMiBtYWdpYzsKKwlfX2xlMzIgbGVuZ3RoOworCV9fbGUzMiBzdHJfY291bnQ7CisJX19sZTMyIGxhbmdfY291bnQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKgorICogU3RyaW5ncyBmb3JtYXQ6CisgKgorICogfCBvZmYgfCBuYW1lICAgICAgIHwgdHlwZSAgICAgICAgICAgICAgICAgIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgfAorICogfC0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgIDAgfCBtYWdpYyAgICAgIHwgTEUzMiAgICAgICAgICAgICAgICAgIHwgRlVOQ1RJT05GU19TVFJJTkdTX01BR0lDICAgfAorICogfCAgIDQgfCBsZW5ndGggICAgIHwgTEUzMiAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mIHRoZSBkYXRhIGNodW5rICAgfAorICogfCAgIDggfCBzdHJfY291bnQgIHwgTEUzMiAgICAgICAgICAgICAgICAgIHwgbnVtYmVyIG9mIHN0cmluZ3MgICAgICAgICAgfAorICogfCAgMTIgfCBsYW5nX2NvdW50IHwgTEUzMiAgICAgICAgICAgICAgICAgIHwgbnVtYmVyIG9mIGxhbmd1YWdlcyAgICAgICAgfAorICogfCAgMTYgfCBzdHJpbmd0YWIgIHwgU3RyaW5nVGFiW2xhbmdfY291bnRdIHwgdGFibGUgb2Ygc3RyaW5ncyBwZXIgbGFuZyAgfAorICoKKyAqIEZvciBlYWNoIGxhbmd1YWdlIHRoZXJlIGlzIG9uZSBzdHJpbmd0YWIgZW50cnkgKGllLiB0aGVyZSBhcmUgbGFuZ19jb3VudAorICogc3RyaW5ndGFiIGVudGlyZXMpLiAgRWFjaCBTdHJpbmdUYWIgaGFzIGZvbGxvd2luZyBmb3JtYXQ6CisgKgorICogfCBvZmYgfCBuYW1lICAgIHwgdHlwZSAgICAgICAgICAgICAgfCBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiB8ICAgMCB8IGxhbmcgICAgfCBMRTE2ICAgICAgICAgICAgICB8IGxhbmd1YWdlIGNvZGUgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgIDIgfCBzdHJpbmdzIHwgU3RyaW5nW3N0cl9jb3VudF0gfCBhcnJheSBvZiBzdHJpbmdzIGluIGdpdmVuIGxhbmd1YWdlIHwKKyAqCisgKiBGb3IgZWFjaCBzdHJpbmcgdGhlcmUgaXMgb25lIHN0cmluZ3MgZW50cnkgKGllLiB0aGVyZSBhcmUgc3RyX2NvdW50CisgKiBzdHJpbmcgZW50cmllcykuICBFYWNoIFN0cmluZyBpcyBhIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyBlbmNvZGVkIGluCisgKiBVVEYtOC4KKyAqLworCisKKworLyoKKyAqIEV2ZW50cyBhcmUgZGVsaXZlcmVkIG9uIHRoZSBlcDAgZmlsZSBkZXNjcmlwdG9yLCB3aGVuIHRoZSB1c2VyIG1vZGUgZHJpdmVyCisgKiByZWFkcyBmcm9tIHRoaXMgZmlsZSBkZXNjcmlwdG9yIGFmdGVyIHdyaXRpbmcgdGhlIGRlc2NyaXB0b3JzLiAgRG9uJ3QKKyAqIHN0b3AgcG9sbGluZyB0aGlzIGRlc2NyaXB0b3IuCisgKi8KKworZW51bSB1c2JfZnVuY3Rpb25mc19ldmVudF90eXBlIHsKKwlGVU5DVElPTkZTX0JJTkQsCisJRlVOQ1RJT05GU19VTkJJTkQsCisKKwlGVU5DVElPTkZTX0VOQUJMRSwKKwlGVU5DVElPTkZTX0RJU0FCTEUsCisKKwlGVU5DVElPTkZTX1NFVFVQLAorCisJRlVOQ1RJT05GU19TVVNQRU5ELAorCUZVTkNUSU9ORlNfUkVTVU1FCit9OworCisvKiBOT1RFOiAgdGhpcyBzdHJ1Y3R1cmUgbXVzdCBzdGF5IHRoZSBzYW1lIHNpemUgYW5kIGxheW91dCBvbgorICogYm90aCAzMi1iaXQgYW5kIDY0LWJpdCBrZXJuZWxzLgorICovCitzdHJ1Y3QgdXNiX2Z1bmN0aW9uZnNfZXZlbnQgeworCXVuaW9uIHsKKwkJLyogU0VUVVA6IHBhY2tldDsgREFUQSBwaGFzZSBpL28gcHJlY2VkZXMgbmV4dCBldmVudAorCQkgKihzZXR1cC5ibVJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikgZmxhZ3MgZGlyZWN0aW9uICovCisJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJc2V0dXA7CisJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB1OworCisJLyogZW51bSB1c2JfZnVuY3Rpb25mc19ldmVudF90eXBlICovCisJX191OAkJCQl0eXBlOworCV9fdTgJCQkJX3BhZFszXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyogRW5kcG9pbnQgaW9jdGxzICovCisvKiBUaGUgc2FtZSBhcyBpbiBnYWRnZXRmcyAqLworCisvKiBJTiB0cmFuc2ZlcnMgbWF5IGJlIHJlcG9ydGVkIHRvIHRoZSBnYWRnZXQgZHJpdmVyIGFzIGNvbXBsZXRlCisgKgl3aGVuIHRoZSBmaWZvIGlzIGxvYWRlZCwgYmVmb3JlIHRoZSBob3N0IHJlYWRzIHRoZSBkYXRhOworICogT1VUIHRyYW5zZmVycyBtYXkgYmUgcmVwb3J0ZWQgdG8gdGhlIGhvc3QncyAiY2xpZW50IiBkcml2ZXIgYXMKKyAqCWNvbXBsZXRlIHdoZW4gdGhleSdyZSBzaXR0aW5nIGluIHRoZSBGSUZPIHVucmVhZC4KKyAqIFRISVMgcmV0dXJucyBob3cgbWFueSBieXRlcyBhcmUgInVuY2xhaW1lZCIgaW4gdGhlIGVuZHBvaW50IGZpZm8KKyAqIChuZWVkZWQgZm9yIHByZWNpc2UgZmF1bHQgaGFuZGxpbmcsIHdoZW4gdGhlIGhhcmR3YXJlIGFsbG93cyBpdCkKKyAqLworI2RlZmluZQlGVU5DVElPTkZTX0ZJRk9fU1RBVFVTCV9JTygnZycsIDEpCisKKy8qIGRpc2NhcmRzIGFueSB1bmNsYWltZWQgZGF0YSBpbiB0aGUgZmlmby4gKi8KKyNkZWZpbmUJRlVOQ1RJT05GU19GSUZPX0ZMVVNICV9JTygnZycsIDIpCisKKy8qIHJlc2V0cyBlbmRwb2ludCBoYWx0K3RvZ2dsZTsgdXNlZCB0byBpbXBsZW1lbnQgc2V0X2ludGVyZmFjZS4KKyAqIHNvbWUgaGFyZHdhcmUgKGxpa2UgcHhhMnh4KSBjYW4ndCBzdXBwb3J0IHRoaXMuCisgKi8KKyNkZWZpbmUJRlVOQ1RJT05GU19DTEVBUl9IQUxUCV9JTygnZycsIDMpCisKKy8qIFNwZWNpZmljIGZvciBmdW5jdGlvbmZzICovCisKKy8qCisgKiBSZXR1cm5zIHJldmVyc2UgbWFwcGluZyBvZiBhbiBpbnRlcmZhY2UuICBDYWxsZWQgb24gRVAwLiAgSWYgdGhlcmUKKyAqIGlzIG5vIHN1Y2ggaW50ZXJmYWNlIHJldHVybnMgLUVET00uICBJZiBmdW5jdGlvbiBpcyBub3QgYWN0aXZlCisgKiByZXR1cm5zIC1FTk9ERVYuCisgKi8KKyNkZWZpbmUJRlVOQ1RJT05GU19JTlRFUkZBQ0VfUkVWTUFQCV9JTygnZycsIDEyOCkKKworLyoKKyAqIFJldHVybnMgcmVhbCBiRW5kcG9pbnRBZGRyZXNzIG9mIGFuIGVuZHBvaW50LiAgSWYgZnVuY3Rpb24gaXMgbm90CisgKiBhY3RpdmUgcmV0dXJucyAtRU5PREVWLgorICovCisjZGVmaW5lCUZVTkNUSU9ORlNfRU5EUE9JTlRfUkVWTUFQCV9JTygnZycsIDEyOSkKKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvZ19wcmludGVyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9nX3ByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTc4ZmRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvZ19wcmludGVyLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIGdfcHJpbnRlci5oIC0tIEhlYWRlciBmaWxlIGZvciBVU0IgUHJpbnRlciBnYWRnZXQgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IENyYWlnIFcuIE5hZGxlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9fTElOVVhfVVNCX0dfUFJJTlRFUl9ICisjZGVmaW5lIF9fTElOVVhfVVNCX0dfUFJJTlRFUl9ICisKKyNkZWZpbmUgUFJJTlRFUl9OT1RfRVJST1IJMHgwOAorI2RlZmluZSBQUklOVEVSX1NFTEVDVEVECTB4MTAKKyNkZWZpbmUgUFJJTlRFUl9QQVBFUl9FTVBUWQkweDIwCisKKy8qIFRoZSAnZycgY29kZSBpcyBhbHNvIHVzZWQgYnkgZ2FkZ2V0ZnMgaW9jdGwgcmVxdWVzdHMuCisgKiBEb24ndCBhZGQgYW55IGNvbGxpZGluZyBjb2RlcyB0byBlaXRoZXIgZHJpdmVyLCBhbmQga2VlcAorICogdGhlbSBpbiB1bmlxdWUgcmFuZ2VzIChzaXplIDB4MjAgZm9yIG5vdykuCisgKi8KKyNkZWZpbmUgR0FER0VUX0dFVF9QUklOVEVSX1NUQVRVUwlfSU9SKCdnJywgMHgyMSwgdW5zaWduZWQgY2hhcikKKyNkZWZpbmUgR0FER0VUX1NFVF9QUklOVEVSX1NUQVRVUwlfSU9XUignZycsIDB4MjIsIHVuc2lnbmVkIGNoYXIpCisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9HX1BSSU5URVJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvZ2FkZ2V0ZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2dhZGdldGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiMTJlMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2dhZGdldGZzLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIEZpbGVzeXN0ZW0gYmFzZWQgdXNlci1tb2RlIEFQSSB0byBVU0IgR2FkZ2V0IGNvbnRyb2xsZXIgaGFyZHdhcmUKKyAqCisgKiBPdGhlciB0aGFuIGVwMCBvcGVyYXRpb25zLCBtb3N0IHRoaW5ncyBhcmUgZG9uZSBieSByZWFkKCkgYW5kIHdyaXRlKCkKKyAqIG9uIGVuZHBvaW50IGZpbGVzIGZvdW5kIGluIG9uZSBkaXJlY3RvcnkuICBUaGV5IGFyZSBjb25maWd1cmVkIGJ5CisgKiB3cml0aW5nIGRlc2NyaXB0b3JzLCBhbmQgdGhlbiBtYXkgYmUgdXNlZCBmb3Igbm9ybWFsIHN0cmVhbSBzdHlsZQorICogaS9vIHJlcXVlc3RzLiAgV2hlbiBlcDAgaXMgY29uZmlndXJlZCwgdGhlIGRldmljZSBjYW4gZW51bWVyYXRlOworICogd2hlbiBpdCdzIGNsb3NlZCwgdGhlIGRldmljZSBkaXNjb25uZWN0cyBmcm9tIHVzYi4gIE9wZXJhdGlvbnMgb24KKyAqIGVwMCByZXF1aXJlIGlvY3RsKCkgb3BlcmF0aW9ucy4KKyAqCisgKiBDb25maWd1cmF0aW9uIGFuZCBkZXZpY2UgZGVzY3JpcHRvcnMgZ2V0IHdyaXR0ZW4gdG8gL2Rldi9nYWRnZXQvJENISVAsCisgKiB3aGljaCBtYXkgdGhlbiBiZSB1c2VkIHRvIHJlYWQgdXNiX2dhZGdldGZzX2V2ZW50IHN0cnVjdHMuICBUaGUgZHJpdmVyCisgKiBtYXkgYWN0aXZhdGUgZW5kcG9pbnRzIGFzIGl0IGhhbmRsZXMgU0VUX0NPTkZJR1VSQVRJT04gc2V0dXAgZXZlbnRzLAorICogb3IgZWFybGllcjsgd3JpdGluZyBlbmRwb2ludCBkZXNjcmlwdG9ycyB0byAvZGV2L2dhZGdldC8kRU5EUE9JTlQKKyAqIHRoZW4gcGVyZm9ybWluZyBkYXRhIHRyYW5zZmVycyBieSByZWFkaW5nIG9yIHdyaXRpbmcuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1VTQl9HQURHRVRGU19ICisjZGVmaW5lIF9fTElOVVhfVVNCX0dBREdFVEZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKworLyoKKyAqIEV2ZW50cyBhcmUgZGVsaXZlcmVkIG9uIHRoZSBlcDAgZmlsZSBkZXNjcmlwdG9yLCB3aGVuIHRoZSB1c2VyIG1vZGUgZHJpdmVyCisgKiByZWFkcyBmcm9tIHRoaXMgZmlsZSBkZXNjcmlwdG9yIGFmdGVyIHdyaXRpbmcgdGhlIGRlc2NyaXB0b3JzLiAgRG9uJ3QKKyAqIHN0b3AgcG9sbGluZyB0aGlzIGRlc2NyaXB0b3IuCisgKi8KKworZW51bSB1c2JfZ2FkZ2V0ZnNfZXZlbnRfdHlwZSB7CisJR0FER0VURlNfTk9QID0gMCwKKworCUdBREdFVEZTX0NPTk5FQ1QsCisJR0FER0VURlNfRElTQ09OTkVDVCwKKwlHQURHRVRGU19TRVRVUCwKKwlHQURHRVRGU19TVVNQRU5ELAorCS8qIGFuZCBsaWtlbHkgbW9yZSAhICovCit9OworCisvKiBOT1RFOiAgdGhpcyBzdHJ1Y3R1cmUgbXVzdCBzdGF5IHRoZSBzYW1lIHNpemUgYW5kIGxheW91dCBvbgorICogYm90aCAzMi1iaXQgYW5kIDY0LWJpdCBrZXJuZWxzLgorICovCitzdHJ1Y3QgdXNiX2dhZGdldGZzX2V2ZW50IHsKKwl1bmlvbiB7CisJCS8qIE5PUCwgRElTQ09OTkVDVCwgU1VTUEVORDogbm90aGluZworCQkgKiAuLi4gc29tZSBoYXJkd2FyZSBjYW4ndCByZXBvcnQgZGlzY29ubmVjdGlvbgorCQkgKi8KKworCQkvKiBDT05ORUNUOiBqdXN0IHRoZSBzcGVlZCAqLworCQllbnVtIHVzYl9kZXZpY2Vfc3BlZWQJc3BlZWQ7CisKKwkJLyogU0VUVVA6IHBhY2tldDsgREFUQSBwaGFzZSBpL28gcHJlY2VkZXMgbmV4dCBldmVudAorCQkgKihzZXR1cC5ibVJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikgZmxhZ3MgZGlyZWN0aW9uCisJCSAqIC4uLiBpbmNsdWRlcyBTRVRfQ09ORklHVVJBVElPTiwgU0VUX0lOVEVSRkFDRQorCQkgKi8KKwkJc3RydWN0IHVzYl9jdHJscmVxdWVzdAlzZXR1cDsKKwl9IHU7CisJZW51bSB1c2JfZ2FkZ2V0ZnNfZXZlbnRfdHlwZQl0eXBlOworfTsKKworCisvKiBUaGUgJ2cnIGNvZGUgaXMgYWxzbyB1c2VkIGJ5IHByaW50ZXIgZ2FkZ2V0IGlvY3RsIHJlcXVlc3RzLgorICogRG9uJ3QgYWRkIGFueSBjb2xsaWRpbmcgY29kZXMgdG8gZWl0aGVyIGRyaXZlciwgYW5kIGtlZXAKKyAqIHRoZW0gaW4gdW5pcXVlIHJhbmdlcyAoc2l6ZSAweDIwIGZvciBub3cpLgorICovCisKKy8qIGVuZHBvaW50IGlvY3RscyAqLworCisvKiBJTiB0cmFuc2ZlcnMgbWF5IGJlIHJlcG9ydGVkIHRvIHRoZSBnYWRnZXQgZHJpdmVyIGFzIGNvbXBsZXRlCisgKgl3aGVuIHRoZSBmaWZvIGlzIGxvYWRlZCwgYmVmb3JlIHRoZSBob3N0IHJlYWRzIHRoZSBkYXRhOworICogT1VUIHRyYW5zZmVycyBtYXkgYmUgcmVwb3J0ZWQgdG8gdGhlIGhvc3QncyAiY2xpZW50IiBkcml2ZXIgYXMKKyAqCWNvbXBsZXRlIHdoZW4gdGhleSdyZSBzaXR0aW5nIGluIHRoZSBGSUZPIHVucmVhZC4KKyAqIFRISVMgcmV0dXJucyBob3cgbWFueSBieXRlcyBhcmUgInVuY2xhaW1lZCIgaW4gdGhlIGVuZHBvaW50IGZpZm8KKyAqIChuZWVkZWQgZm9yIHByZWNpc2UgZmF1bHQgaGFuZGxpbmcsIHdoZW4gdGhlIGhhcmR3YXJlIGFsbG93cyBpdCkKKyAqLworI2RlZmluZQlHQURHRVRGU19GSUZPX1NUQVRVUwlfSU8oJ2cnLCAxKQorCisvKiBkaXNjYXJkcyBhbnkgdW5jbGFpbWVkIGRhdGEgaW4gdGhlIGZpZm8uICovCisjZGVmaW5lCUdBREdFVEZTX0ZJRk9fRkxVU0gJX0lPKCdnJywgMikKKworLyogcmVzZXRzIGVuZHBvaW50IGhhbHQrdG9nZ2xlOyB1c2VkIHRvIGltcGxlbWVudCBzZXRfaW50ZXJmYWNlLgorICogc29tZSBoYXJkd2FyZSAobGlrZSBweGEyeHgpIGNhbid0IHN1cHBvcnQgdGhpcy4KKyAqLworI2RlZmluZQlHQURHRVRGU19DTEVBUl9IQUxUCV9JTygnZycsIDMpCisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9HQURHRVRGU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9taWRpLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9taWRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjNTJlMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL21pZGkuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIDxsaW51eC91c2IvbWlkaS5oPiAtLSBVU0IgTUlESSBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGh1bXRyb25pY3MgUHR5IEx0ZC4KKyAqIERldmVsb3BlZCBmb3IgVGh1bXRyb25pY3MgYnkgR3JleSBJbm5vdmF0aW9uCisgKiBCZW4gV2lsbGlhbXNvbiA8YmVuLndpbGxpYW1zb25AZ3JleWlubm92YXRpb24uY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBob2xkcyBVU0IgY29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzIGRlZmluZWQKKyAqIGJ5IHRoZSBVU0IgRGV2aWNlIENsYXNzIERlZmluaXRpb24gZm9yIE1JREkgRGV2aWNlcy4KKyAqIENvbW1lbnRzIGJlbG93IHJlZmVyZW5jZSByZWxldmFudCBzZWN0aW9ucyBvZiB0aGF0IGRvY3VtZW50OgorICoKKyAqIGh0dHA6Ly93d3cudXNiLm9yZy9kZXZlbG9wZXJzL2RldmNsYXNzX2RvY3MvbWlkaTEwLnBkZgorICovCisKKyNpZm5kZWYgX19MSU5VWF9VU0JfTUlESV9ICisjZGVmaW5lIF9fTElOVVhfVVNCX01JRElfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogQS4xICBNUyBDbGFzcy1TcGVjaWZpYyBJbnRlcmZhY2UgRGVzY3JpcHRvciBTdWJ0eXBlcyAqLworI2RlZmluZSBVU0JfTVNfSEVBREVSCQkweDAxCisjZGVmaW5lIFVTQl9NU19NSURJX0lOX0pBQ0sJMHgwMgorI2RlZmluZSBVU0JfTVNfTUlESV9PVVRfSkFDSwkweDAzCisjZGVmaW5lIFVTQl9NU19FTEVNRU5UCQkweDA0CisKKy8qIEEuMiAgTVMgQ2xhc3MtU3BlY2lmaWMgRW5kcG9pbnQgRGVzY3JpcHRvciBTdWJ0eXBlcyAqLworI2RlZmluZSBVU0JfTVNfR0VORVJBTAkJMHgwMQorCisvKiBBLjMgIE1TIE1JREkgSU4gYW5kIE9VVCBKYWNrIFR5cGVzICovCisjZGVmaW5lIFVTQl9NU19FTUJFRERFRAkJMHgwMQorI2RlZmluZSBVU0JfTVNfRVhURVJOQUwJCTB4MDIKKworLyogNi4xLjIuMSAgQ2xhc3MtU3BlY2lmaWMgTVMgSW50ZXJmYWNlIEhlYWRlciBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXNiX21zX2hlYWRlcl9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YnR5cGU7CisJX19sZTE2IGJjZE1TQzsKKwlfX2xlMTYgd1RvdGFsTGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX01TX0hFQURFUl9TSVpFCTcKKworLyogNi4xLjIuMiAgTUlESSBJTiBKYWNrIERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1c2JfbWlkaV9pbl9qYWNrX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJLyogVVNCX0RUX0NTX0lOVEVSRkFDRSAqLworCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJLyogVVNCX01TX01JRElfSU5fSkFDSyAqLworCV9fdTggIGJKYWNrVHlwZTsJCS8qIFVTQl9NU19FTUJFRERFRC9FWFRFUk5BTCAqLworCV9fdTggIGJKYWNrSUQ7CisJX191OCAgaUphY2s7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBVU0JfRFRfTUlESV9JTl9TSVpFCTYKKworc3RydWN0IHVzYl9taWRpX3NvdXJjZV9waW4geworCV9fdTggIGJhU291cmNlSUQ7CisJX191OCAgYmFTb3VyY2VQaW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogNi4xLjIuMyAgTUlESSBPVVQgSmFjayBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXNiX21pZGlfb3V0X2phY2tfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkvKiBVU0JfRFRfQ1NfSU5URVJGQUNFICovCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkvKiBVU0JfTVNfTUlESV9PVVRfSkFDSyAqLworCV9fdTggIGJKYWNrVHlwZTsJCS8qIFVTQl9NU19FTUJFRERFRC9FWFRFUk5BTCAqLworCV9fdTggIGJKYWNrSUQ7CisJX191OCAgYk5ySW5wdXRQaW5zOwkJLyogcCAqLworCXN0cnVjdCB1c2JfbWlkaV9zb3VyY2VfcGluIHBpbnNbXTsgLyogW3BdICovCisJLypfX3U4ICBpSmFjazsgIC0tIG9taXR0ZWQgZHVlIHRvIHZhcmlhYmxlLXNpemVkIHBpbnNbXSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX01JRElfT1VUX1NJWkUocCkJKDcgKyAyICogKHApKQorCisvKiBBcyBhYm92ZSwgYnV0IG1vcmUgdXNlZnVsIGZvciBkZWZpbmluZyB5b3VyIG93biBkZXNjcmlwdG9yczogKi8KKyNkZWZpbmUgREVDTEFSRV9VU0JfTUlESV9PVVRfSkFDS19ERVNDUklQVE9SKHApCQkJXAorc3RydWN0IHVzYl9taWRpX291dF9qYWNrX2Rlc2NyaXB0b3JfIyNwIHsJCQlcCisJX191OCAgYkxlbmd0aDsJCQkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJCQkJXAorCV9fdTggIGJKYWNrVHlwZTsJCQkJCVwKKwlfX3U4ICBiSmFja0lEOwkJCQkJCVwKKwlfX3U4ICBiTnJJbnB1dFBpbnM7CQkJCQlcCisJc3RydWN0IHVzYl9taWRpX3NvdXJjZV9waW4gcGluc1twXTsJCQlcCisJX191OCAgaUphY2s7CQkJCQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworLyogNi4yLjIgIENsYXNzLVNwZWNpZmljIE1TIEJ1bGsgRGF0YSBFbmRwb2ludCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXNiX21zX2VuZHBvaW50X2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CQkJLyogNCtuICovCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJLyogVVNCX0RUX0NTX0VORFBPSU5UICovCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkvKiBVU0JfTVNfR0VORVJBTCAqLworCV9fdTggIGJOdW1FbWJNSURJSmFjazsJCS8qIG4gKi8KKwlfX3U4ICBiYUFzc29jSmFja0lEW107CQkvKiBbbl0gKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9NU19FTkRQT0lOVF9TSVpFKG4pCSg0ICsgKG4pKQorCisvKiBBcyBhYm92ZSwgYnV0IG1vcmUgdXNlZnVsIGZvciBkZWZpbmluZyB5b3VyIG93biBkZXNjcmlwdG9yczogKi8KKyNkZWZpbmUgREVDTEFSRV9VU0JfTVNfRU5EUE9JTlRfREVTQ1JJUFRPUihuKQkJCVwKK3N0cnVjdCB1c2JfbXNfZW5kcG9pbnRfZGVzY3JpcHRvcl8jI24gewkJCQlcCisJX191OCAgYkxlbmd0aDsJCQkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJCQkJXAorCV9fdTggIGJOdW1FbWJNSURJSmFjazsJCQkJCVwKKwlfX3U4ICBiYUFzc29jSmFja0lEW25dOwkJCQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworI2VuZGlmIC8qIF9fTElOVVhfVVNCX01JRElfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvdG1jLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi90bWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQ1YWUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvdG1jLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTdGVmYW4gS29wcCwgR2VjaGluZ2VuLCBHZXJtYW55CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm92ZWxsLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaG9sZHMgVVNCIGNvbnN0YW50cyBkZWZpbmVkIGJ5IHRoZSBVU0IgRGV2aWNlIENsYXNzCisgKiBEZWZpbml0aW9uIGZvciBUZXN0IGFuZCBNZWFzdXJlbWVudCBkZXZpY2VzIHB1Ymxpc2hlZCBieSB0aGUgVVNCLUlGLgorICoKKyAqIEl0IGFsc28gaGFzIHRoZSBpb2N0bCBkZWZpbml0aW9ucyBmb3IgdGhlIHVzYnRtYyBrZXJuZWwgZHJpdmVyIHRoYXQKKyAqIHVzZXJzcGFjZSBuZWVkcyB0byBrbm93IGFib3V0LgorICovCisKKyNpZm5kZWYgX19MSU5VWF9VU0JfVE1DX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfVE1DX0gKKworLyogVVNCIFRNQyBzdGF0dXMgdmFsdWVzICovCisjZGVmaW5lIFVTQlRNQ19TVEFUVVNfU1VDQ0VTUwkJCQkweDAxCisjZGVmaW5lIFVTQlRNQ19TVEFUVVNfUEVORElORwkJCQkweDAyCisjZGVmaW5lIFVTQlRNQ19TVEFUVVNfRkFJTEVECQkJCTB4ODAKKyNkZWZpbmUgVVNCVE1DX1NUQVRVU19UUkFOU0ZFUl9OT1RfSU5fUFJPR1JFU1MJCTB4ODEKKyNkZWZpbmUgVVNCVE1DX1NUQVRVU19TUExJVF9OT1RfSU5fUFJPR1JFU1MJCTB4ODIKKyNkZWZpbmUgVVNCVE1DX1NUQVRVU19TUExJVF9JTl9QUk9HUkVTUwkJCTB4ODMKKworLyogVVNCIFRNQyByZXF1ZXN0cyB2YWx1ZXMgKi8KKyNkZWZpbmUgVVNCVE1DX1JFUVVFU1RfSU5JVElBVEVfQUJPUlRfQlVMS19PVVQJCTEKKyNkZWZpbmUgVVNCVE1DX1JFUVVFU1RfQ0hFQ0tfQUJPUlRfQlVMS19PVVRfU1RBVFVTCTIKKyNkZWZpbmUgVVNCVE1DX1JFUVVFU1RfSU5JVElBVEVfQUJPUlRfQlVMS19JTgkJMworI2RlZmluZSBVU0JUTUNfUkVRVUVTVF9DSEVDS19BQk9SVF9CVUxLX0lOX1NUQVRVUwk0CisjZGVmaW5lIFVTQlRNQ19SRVFVRVNUX0lOSVRJQVRFX0NMRUFSCQkJNQorI2RlZmluZSBVU0JUTUNfUkVRVUVTVF9DSEVDS19DTEVBUl9TVEFUVVMJCTYKKyNkZWZpbmUgVVNCVE1DX1JFUVVFU1RfR0VUX0NBUEFCSUxJVElFUwkJCTcKKyNkZWZpbmUgVVNCVE1DX1JFUVVFU1RfSU5ESUNBVE9SX1BVTFNFCQkJNjQKKworLyogUmVxdWVzdCB2YWx1ZXMgZm9yIFVTQlRNQyBkcml2ZXIncyBpb2N0bCBlbnRyeSBwb2ludCAqLworI2RlZmluZSBVU0JUTUNfSU9DX05SCQkJOTEKKyNkZWZpbmUgVVNCVE1DX0lPQ1RMX0lORElDQVRPUl9QVUxTRQlfSU8oVVNCVE1DX0lPQ19OUiwgMSkKKyNkZWZpbmUgVVNCVE1DX0lPQ1RMX0NMRUFSCQlfSU8oVVNCVE1DX0lPQ19OUiwgMikKKyNkZWZpbmUgVVNCVE1DX0lPQ1RMX0FCT1JUX0JVTEtfT1VUCV9JTyhVU0JUTUNfSU9DX05SLCAzKQorI2RlZmluZSBVU0JUTUNfSU9DVExfQUJPUlRfQlVMS19JTglfSU8oVVNCVE1DX0lPQ19OUiwgNCkKKyNkZWZpbmUgVVNCVE1DX0lPQ1RMX0NMRUFSX09VVF9IQUxUCV9JTyhVU0JUTUNfSU9DX05SLCA2KQorI2RlZmluZSBVU0JUTUNfSU9DVExfQ0xFQVJfSU5fSEFMVAlfSU8oVVNCVE1DX0lPQ19OUiwgNykKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi92aWRlby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjNiOTVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvdmlkZW8uaApAQCAtMCwwICsxLDU2OCBAQAorLyoKKyAqIFVTQiBWaWRlbyBDbGFzcyBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBza3luZXQuYmU+CisgKgorICogVGhpcyBmaWxlIGhvbGRzIFVTQiBjb25zdGFudHMgYW5kIHN0cnVjdHVyZXMgZGVmaW5lZCBieSB0aGUgVVNCIERldmljZQorICogQ2xhc3MgRGVmaW5pdGlvbiBmb3IgVmlkZW8gRGV2aWNlcy4gVW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsIGNvbW1lbnRzCisgKiBiZWxvdyByZWZlcmVuY2UgcmVsZXZhbnQgc2VjdGlvbnMgb2YgdGhlIFVTQiBWaWRlbyBDbGFzcyAxLjEgc3BlY2lmaWNhdGlvbgorICogYXZhaWxhYmxlIGF0CisgKgorICogaHR0cDovL3d3dy51c2Iub3JnL2RldmVsb3BlcnMvZGV2Y2xhc3NfZG9jcy9VU0JfVmlkZW9fQ2xhc3NfMV8xLnppcAorICovCisKKyNpZm5kZWYgX19MSU5VWF9VU0JfVklERU9fSAorI2RlZmluZSBfX0xJTlVYX1VTQl9WSURFT19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVVZDIGNvbnN0YW50cworICovCisKKy8qIEEuMi4gVmlkZW8gSW50ZXJmYWNlIFN1YmNsYXNzIENvZGVzICovCisjZGVmaW5lIFVWQ19TQ19VTkRFRklORUQJCQkJMHgwMAorI2RlZmluZSBVVkNfU0NfVklERU9DT05UUk9MCQkJCTB4MDEKKyNkZWZpbmUgVVZDX1NDX1ZJREVPU1RSRUFNSU5HCQkJCTB4MDIKKyNkZWZpbmUgVVZDX1NDX1ZJREVPX0lOVEVSRkFDRV9DT0xMRUNUSU9OCQkweDAzCisKKy8qIEEuMy4gVmlkZW8gSW50ZXJmYWNlIFByb3RvY29sIENvZGVzICovCisjZGVmaW5lIFVWQ19QQ19QUk9UT0NPTF9VTkRFRklORUQJCQkweDAwCisKKy8qIEEuNS4gVmlkZW8gQ2xhc3MtU3BlY2lmaWMgVkMgSW50ZXJmYWNlIERlc2NyaXB0b3IgU3VidHlwZXMgKi8KKyNkZWZpbmUgVVZDX1ZDX0RFU0NSSVBUT1JfVU5ERUZJTkVECQkJMHgwMAorI2RlZmluZSBVVkNfVkNfSEVBREVSCQkJCQkweDAxCisjZGVmaW5lIFVWQ19WQ19JTlBVVF9URVJNSU5BTAkJCQkweDAyCisjZGVmaW5lIFVWQ19WQ19PVVRQVVRfVEVSTUlOQUwJCQkJMHgwMworI2RlZmluZSBVVkNfVkNfU0VMRUNUT1JfVU5JVAkJCQkweDA0CisjZGVmaW5lIFVWQ19WQ19QUk9DRVNTSU5HX1VOSVQJCQkJMHgwNQorI2RlZmluZSBVVkNfVkNfRVhURU5TSU9OX1VOSVQJCQkJMHgwNgorCisvKiBBLjYuIFZpZGVvIENsYXNzLVNwZWNpZmljIFZTIEludGVyZmFjZSBEZXNjcmlwdG9yIFN1YnR5cGVzICovCisjZGVmaW5lIFVWQ19WU19VTkRFRklORUQJCQkJMHgwMAorI2RlZmluZSBVVkNfVlNfSU5QVVRfSEVBREVSCQkJCTB4MDEKKyNkZWZpbmUgVVZDX1ZTX09VVFBVVF9IRUFERVIJCQkJMHgwMgorI2RlZmluZSBVVkNfVlNfU1RJTExfSU1BR0VfRlJBTUUJCQkweDAzCisjZGVmaW5lIFVWQ19WU19GT1JNQVRfVU5DT01QUkVTU0VECQkJMHgwNAorI2RlZmluZSBVVkNfVlNfRlJBTUVfVU5DT01QUkVTU0VECQkJMHgwNQorI2RlZmluZSBVVkNfVlNfRk9STUFUX01KUEVHCQkJCTB4MDYKKyNkZWZpbmUgVVZDX1ZTX0ZSQU1FX01KUEVHCQkJCTB4MDcKKyNkZWZpbmUgVVZDX1ZTX0ZPUk1BVF9NUEVHMlRTCQkJCTB4MGEKKyNkZWZpbmUgVVZDX1ZTX0ZPUk1BVF9EVgkJCQkweDBjCisjZGVmaW5lIFVWQ19WU19DT0xPUkZPUk1BVAkJCQkweDBkCisjZGVmaW5lIFVWQ19WU19GT1JNQVRfRlJBTUVfQkFTRUQJCQkweDEwCisjZGVmaW5lIFVWQ19WU19GUkFNRV9GUkFNRV9CQVNFRAkJCTB4MTEKKyNkZWZpbmUgVVZDX1ZTX0ZPUk1BVF9TVFJFQU1fQkFTRUQJCQkweDEyCisKKy8qIEEuNy4gVmlkZW8gQ2xhc3MtU3BlY2lmaWMgRW5kcG9pbnQgRGVzY3JpcHRvciBTdWJ0eXBlcyAqLworI2RlZmluZSBVVkNfRVBfVU5ERUZJTkVECQkJCTB4MDAKKyNkZWZpbmUgVVZDX0VQX0dFTkVSQUwJCQkJCTB4MDEKKyNkZWZpbmUgVVZDX0VQX0VORFBPSU5UCQkJCQkweDAyCisjZGVmaW5lIFVWQ19FUF9JTlRFUlJVUFQJCQkJMHgwMworCisvKiBBLjguIFZpZGVvIENsYXNzLVNwZWNpZmljIFJlcXVlc3QgQ29kZXMgKi8KKyNkZWZpbmUgVVZDX1JDX1VOREVGSU5FRAkJCQkweDAwCisjZGVmaW5lIFVWQ19TRVRfQ1VSCQkJCQkweDAxCisjZGVmaW5lIFVWQ19HRVRfQ1VSCQkJCQkweDgxCisjZGVmaW5lIFVWQ19HRVRfTUlOCQkJCQkweDgyCisjZGVmaW5lIFVWQ19HRVRfTUFYCQkJCQkweDgzCisjZGVmaW5lIFVWQ19HRVRfUkVTCQkJCQkweDg0CisjZGVmaW5lIFVWQ19HRVRfTEVOCQkJCQkweDg1CisjZGVmaW5lIFVWQ19HRVRfSU5GTwkJCQkJMHg4NgorI2RlZmluZSBVVkNfR0VUX0RFRgkJCQkJMHg4NworCisvKiBBLjkuMS4gVmlkZW9Db250cm9sIEludGVyZmFjZSBDb250cm9sIFNlbGVjdG9ycyAqLworI2RlZmluZSBVVkNfVkNfQ09OVFJPTF9VTkRFRklORUQJCQkweDAwCisjZGVmaW5lIFVWQ19WQ19WSURFT19QT1dFUl9NT0RFX0NPTlRST0wJCQkweDAxCisjZGVmaW5lIFVWQ19WQ19SRVFVRVNUX0VSUk9SX0NPREVfQ09OVFJPTAkJMHgwMgorCisvKiBBLjkuMi4gVGVybWluYWwgQ29udHJvbCBTZWxlY3RvcnMgKi8KKyNkZWZpbmUgVVZDX1RFX0NPTlRST0xfVU5ERUZJTkVECQkJMHgwMAorCisvKiBBLjkuMy4gU2VsZWN0b3IgVW5pdCBDb250cm9sIFNlbGVjdG9ycyAqLworI2RlZmluZSBVVkNfU1VfQ09OVFJPTF9VTkRFRklORUQJCQkweDAwCisjZGVmaW5lIFVWQ19TVV9JTlBVVF9TRUxFQ1RfQ09OVFJPTAkJCTB4MDEKKworLyogQS45LjQuIENhbWVyYSBUZXJtaW5hbCBDb250cm9sIFNlbGVjdG9ycyAqLworI2RlZmluZSBVVkNfQ1RfQ09OVFJPTF9VTkRFRklORUQJCQkweDAwCisjZGVmaW5lIFVWQ19DVF9TQ0FOTklOR19NT0RFX0NPTlRST0wJCQkweDAxCisjZGVmaW5lIFVWQ19DVF9BRV9NT0RFX0NPTlRST0wJCQkJMHgwMgorI2RlZmluZSBVVkNfQ1RfQUVfUFJJT1JJVFlfQ09OVFJPTAkJCTB4MDMKKyNkZWZpbmUgVVZDX0NUX0VYUE9TVVJFX1RJTUVfQUJTT0xVVEVfQ09OVFJPTAkJMHgwNAorI2RlZmluZSBVVkNfQ1RfRVhQT1NVUkVfVElNRV9SRUxBVElWRV9DT05UUk9MCQkweDA1CisjZGVmaW5lIFVWQ19DVF9GT0NVU19BQlNPTFVURV9DT05UUk9MCQkJMHgwNgorI2RlZmluZSBVVkNfQ1RfRk9DVVNfUkVMQVRJVkVfQ09OVFJPTAkJCTB4MDcKKyNkZWZpbmUgVVZDX0NUX0ZPQ1VTX0FVVE9fQ09OVFJPTAkJCTB4MDgKKyNkZWZpbmUgVVZDX0NUX0lSSVNfQUJTT0xVVEVfQ09OVFJPTAkJCTB4MDkKKyNkZWZpbmUgVVZDX0NUX0lSSVNfUkVMQVRJVkVfQ09OVFJPTAkJCTB4MGEKKyNkZWZpbmUgVVZDX0NUX1pPT01fQUJTT0xVVEVfQ09OVFJPTAkJCTB4MGIKKyNkZWZpbmUgVVZDX0NUX1pPT01fUkVMQVRJVkVfQ09OVFJPTAkJCTB4MGMKKyNkZWZpbmUgVVZDX0NUX1BBTlRJTFRfQUJTT0xVVEVfQ09OVFJPTAkJCTB4MGQKKyNkZWZpbmUgVVZDX0NUX1BBTlRJTFRfUkVMQVRJVkVfQ09OVFJPTAkJCTB4MGUKKyNkZWZpbmUgVVZDX0NUX1JPTExfQUJTT0xVVEVfQ09OVFJPTAkJCTB4MGYKKyNkZWZpbmUgVVZDX0NUX1JPTExfUkVMQVRJVkVfQ09OVFJPTAkJCTB4MTAKKyNkZWZpbmUgVVZDX0NUX1BSSVZBQ1lfQ09OVFJPTAkJCQkweDExCisKKy8qIEEuOS41LiBQcm9jZXNzaW5nIFVuaXQgQ29udHJvbCBTZWxlY3RvcnMgKi8KKyNkZWZpbmUgVVZDX1BVX0NPTlRST0xfVU5ERUZJTkVECQkJMHgwMAorI2RlZmluZSBVVkNfUFVfQkFDS0xJR0hUX0NPTVBFTlNBVElPTl9DT05UUk9MCQkweDAxCisjZGVmaW5lIFVWQ19QVV9CUklHSFRORVNTX0NPTlRST0wJCQkweDAyCisjZGVmaW5lIFVWQ19QVV9DT05UUkFTVF9DT05UUk9MCQkJCTB4MDMKKyNkZWZpbmUgVVZDX1BVX0dBSU5fQ09OVFJPTAkJCQkweDA0CisjZGVmaW5lIFVWQ19QVV9QT1dFUl9MSU5FX0ZSRVFVRU5DWV9DT05UUk9MCQkweDA1CisjZGVmaW5lIFVWQ19QVV9IVUVfQ09OVFJPTAkJCQkweDA2CisjZGVmaW5lIFVWQ19QVV9TQVRVUkFUSU9OX0NPTlRST0wJCQkweDA3CisjZGVmaW5lIFVWQ19QVV9TSEFSUE5FU1NfQ09OVFJPTAkJCTB4MDgKKyNkZWZpbmUgVVZDX1BVX0dBTU1BX0NPTlRST0wJCQkJMHgwOQorI2RlZmluZSBVVkNfUFVfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRV9DT05UUk9MCTB4MGEKKyNkZWZpbmUgVVZDX1BVX1dISVRFX0JBTEFOQ0VfVEVNUEVSQVRVUkVfQVVUT19DT05UUk9MCTB4MGIKKyNkZWZpbmUgVVZDX1BVX1dISVRFX0JBTEFOQ0VfQ09NUE9ORU5UX0NPTlRST0wJCTB4MGMKKyNkZWZpbmUgVVZDX1BVX1dISVRFX0JBTEFOQ0VfQ09NUE9ORU5UX0FVVE9fQ09OVFJPTAkweDBkCisjZGVmaW5lIFVWQ19QVV9ESUdJVEFMX01VTFRJUExJRVJfQ09OVFJPTAkJMHgwZQorI2RlZmluZSBVVkNfUFVfRElHSVRBTF9NVUxUSVBMSUVSX0xJTUlUX0NPTlRST0wJCTB4MGYKKyNkZWZpbmUgVVZDX1BVX0hVRV9BVVRPX0NPTlRST0wJCQkJMHgxMAorI2RlZmluZSBVVkNfUFVfQU5BTE9HX1ZJREVPX1NUQU5EQVJEX0NPTlRST0wJCTB4MTEKKyNkZWZpbmUgVVZDX1BVX0FOQUxPR19MT0NLX1NUQVRVU19DT05UUk9MCQkweDEyCisKKy8qIEEuOS43LiBWaWRlb1N0cmVhbWluZyBJbnRlcmZhY2UgQ29udHJvbCBTZWxlY3RvcnMgKi8KKyNkZWZpbmUgVVZDX1ZTX0NPTlRST0xfVU5ERUZJTkVECQkJMHgwMAorI2RlZmluZSBVVkNfVlNfUFJPQkVfQ09OVFJPTAkJCQkweDAxCisjZGVmaW5lIFVWQ19WU19DT01NSVRfQ09OVFJPTAkJCQkweDAyCisjZGVmaW5lIFVWQ19WU19TVElMTF9QUk9CRV9DT05UUk9MCQkJMHgwMworI2RlZmluZSBVVkNfVlNfU1RJTExfQ09NTUlUX0NPTlRST0wJCQkweDA0CisjZGVmaW5lIFVWQ19WU19TVElMTF9JTUFHRV9UUklHR0VSX0NPTlRST0wJCTB4MDUKKyNkZWZpbmUgVVZDX1ZTX1NUUkVBTV9FUlJPUl9DT0RFX0NPTlRST0wJCTB4MDYKKyNkZWZpbmUgVVZDX1ZTX0dFTkVSQVRFX0tFWV9GUkFNRV9DT05UUk9MCQkweDA3CisjZGVmaW5lIFVWQ19WU19VUERBVEVfRlJBTUVfU0VHTUVOVF9DT05UUk9MCQkweDA4CisjZGVmaW5lIFVWQ19WU19TWU5DX0RFTEFZX0NPTlRST0wJCQkweDA5CisKKy8qIEIuMS4gVVNCIFRlcm1pbmFsIFR5cGVzICovCisjZGVmaW5lIFVWQ19UVF9WRU5ET1JfU1BFQ0lGSUMJCQkJMHgwMTAwCisjZGVmaW5lIFVWQ19UVF9TVFJFQU1JTkcJCQkJMHgwMTAxCisKKy8qIEIuMi4gSW5wdXQgVGVybWluYWwgVHlwZXMgKi8KKyNkZWZpbmUgVVZDX0lUVF9WRU5ET1JfU1BFQ0lGSUMJCQkJMHgwMjAwCisjZGVmaW5lIFVWQ19JVFRfQ0FNRVJBCQkJCQkweDAyMDEKKyNkZWZpbmUgVVZDX0lUVF9NRURJQV9UUkFOU1BPUlRfSU5QVVQJCQkweDAyMDIKKworLyogQi4zLiBPdXRwdXQgVGVybWluYWwgVHlwZXMgKi8KKyNkZWZpbmUgVVZDX09UVF9WRU5ET1JfU1BFQ0lGSUMJCQkJMHgwMzAwCisjZGVmaW5lIFVWQ19PVFRfRElTUExBWQkJCQkJMHgwMzAxCisjZGVmaW5lIFVWQ19PVFRfTUVESUFfVFJBTlNQT1JUX09VVFBVVAkJCTB4MDMwMgorCisvKiBCLjQuIEV4dGVybmFsIFRlcm1pbmFsIFR5cGVzICovCisjZGVmaW5lIFVWQ19FWFRFUk5BTF9WRU5ET1JfU1BFQ0lGSUMJCQkweDA0MDAKKyNkZWZpbmUgVVZDX0NPTVBPU0lURV9DT05ORUNUT1IJCQkJMHgwNDAxCisjZGVmaW5lIFVWQ19TVklERU9fQ09OTkVDVE9SCQkJCTB4MDQwMgorI2RlZmluZSBVVkNfQ09NUE9ORU5UX0NPTk5FQ1RPUgkJCQkweDA0MDMKKworLyogMi40LjIuMi4gU3RhdHVzIFBhY2tldCBUeXBlICovCisjZGVmaW5lIFVWQ19TVEFUVVNfVFlQRV9DT05UUk9MCQkJCTEKKyNkZWZpbmUgVVZDX1NUQVRVU19UWVBFX1NUUkVBTUlORwkJCTIKKworLyogMi40LjMuMy4gUGF5bG9hZCBIZWFkZXIgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgVVZDX1NUUkVBTV9FT0gJCQkJCSgxIDw8IDcpCisjZGVmaW5lIFVWQ19TVFJFQU1fRVJSCQkJCQkoMSA8PCA2KQorI2RlZmluZSBVVkNfU1RSRUFNX1NUSQkJCQkJKDEgPDwgNSkKKyNkZWZpbmUgVVZDX1NUUkVBTV9SRVMJCQkJCSgxIDw8IDQpCisjZGVmaW5lIFVWQ19TVFJFQU1fU0NSCQkJCQkoMSA8PCAzKQorI2RlZmluZSBVVkNfU1RSRUFNX1BUUwkJCQkJKDEgPDwgMikKKyNkZWZpbmUgVVZDX1NUUkVBTV9FT0YJCQkJCSgxIDw8IDEpCisjZGVmaW5lIFVWQ19TVFJFQU1fRklECQkJCQkoMSA8PCAwKQorCisvKiA0LjEuMi4gQ29udHJvbCBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgVVZDX0NPTlRST0xfQ0FQX0dFVAkJCQkoMSA8PCAwKQorI2RlZmluZSBVVkNfQ09OVFJPTF9DQVBfU0VUCQkJCSgxIDw8IDEpCisjZGVmaW5lIFVWQ19DT05UUk9MX0NBUF9ESVNBQkxFRAkJCSgxIDw8IDIpCisjZGVmaW5lIFVWQ19DT05UUk9MX0NBUF9BVVRPVVBEQVRFCQkJKDEgPDwgMykKKyNkZWZpbmUgVVZDX0NPTlRST0xfQ0FQX0FTWU5DSFJPTk9VUwkJCSgxIDw8IDQpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVVZDIHN0cnVjdHVyZXMKKyAqLworCisvKiBBbGwgVVZDIGRlc2NyaXB0b3JzIGhhdmUgdGhlc2UgMyBmaWVsZHMgYXQgdGhlIGJlZ2lubmluZyAqLworc3RydWN0IHV2Y19kZXNjcmlwdG9yX2hlYWRlciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogMy43LjIuIFZpZGVvIENvbnRyb2wgSW50ZXJmYWNlIEhlYWRlciBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXZjX2hlYWRlcl9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191MTYgYmNkVVZDOworCV9fdTE2IHdUb3RhbExlbmd0aDsKKwlfX3UzMiBkd0Nsb2NrRnJlcXVlbmN5OworCV9fdTggIGJJbkNvbGxlY3Rpb247CisJX191OCAgYmFJbnRlcmZhY2VOcltdOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX0hFQURFUl9TSVpFKG4pCQkJCSgxMisobikpCisKKyNkZWZpbmUgVVZDX0hFQURFUl9ERVNDUklQVE9SKG4pIFwKKwl1dmNfaGVhZGVyX2Rlc2NyaXB0b3JfIyNuCisKKyNkZWZpbmUgREVDTEFSRV9VVkNfSEVBREVSX0RFU0NSSVBUT1IobikJCVwKK3N0cnVjdCBVVkNfSEVBREVSX0RFU0NSSVBUT1IobikgewkJCVwKKwlfX3U4ICBiTGVuZ3RoOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsJCQlcCisJX191MTYgYmNkVVZDOwkJCQkJXAorCV9fdTE2IHdUb3RhbExlbmd0aDsJCQkJXAorCV9fdTMyIGR3Q2xvY2tGcmVxdWVuY3k7CQkJCVwKKwlfX3U4ICBiSW5Db2xsZWN0aW9uOwkJCQlcCisJX191OCAgYmFJbnRlcmZhY2VOcltuXTsJCQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworLyogMy43LjIuMS4gSW5wdXQgVGVybWluYWwgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19pbnB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYlRlcm1pbmFsSUQ7CisJX191MTYgd1Rlcm1pbmFsVHlwZTsKKwlfX3U4ICBiQXNzb2NUZXJtaW5hbDsKKwlfX3U4ICBpVGVybWluYWw7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBVVkNfRFRfSU5QVVRfVEVSTUlOQUxfU0laRQkJCTgKKworLyogMy43LjIuMi4gT3V0cHV0IFRlcm1pbmFsIERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfb3V0cHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKKwlfX3U4ICBiVGVybWluYWxJRDsKKwlfX3UxNiB3VGVybWluYWxUeXBlOworCV9fdTggIGJBc3NvY1Rlcm1pbmFsOworCV9fdTggIGJTb3VyY2VJRDsKKwlfX3U4ICBpVGVybWluYWw7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBVVkNfRFRfT1VUUFVUX1RFUk1JTkFMX1NJWkUJCQk5CisKKy8qIDMuNy4yLjMuIENhbWVyYSBUZXJtaW5hbCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXZjX2NhbWVyYV90ZXJtaW5hbF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYlRlcm1pbmFsSUQ7CisJX191MTYgd1Rlcm1pbmFsVHlwZTsKKwlfX3U4ICBiQXNzb2NUZXJtaW5hbDsKKwlfX3U4ICBpVGVybWluYWw7CisJX191MTYgd09iamVjdGl2ZUZvY2FsTGVuZ3RoTWluOworCV9fdTE2IHdPYmplY3RpdmVGb2NhbExlbmd0aE1heDsKKwlfX3UxNiB3T2N1bGFyRm9jYWxMZW5ndGg7CisJX191OCAgYkNvbnRyb2xTaXplOworCV9fdTggIGJtQ29udHJvbHNbM107Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBVVkNfRFRfQ0FNRVJBX1RFUk1JTkFMX1NJWkUobikJCQkoMTUrKG4pKQorCisvKiAzLjcuMi40LiBTZWxlY3RvciBVbml0IERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfc2VsZWN0b3JfdW5pdF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYlVuaXRJRDsKKwlfX3U4ICBiTnJJblBpbnM7CisJX191OCAgYmFTb3VyY2VJRFswXTsKKwlfX3U4ICBpU2VsZWN0b3I7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBVVkNfRFRfU0VMRUNUT1JfVU5JVF9TSVpFKG4pCQkJKDYrKG4pKQorCisjZGVmaW5lIFVWQ19TRUxFQ1RPUl9VTklUX0RFU0NSSVBUT1IobikJXAorCXV2Y19zZWxlY3Rvcl91bml0X2Rlc2NyaXB0b3JfIyNuCisKKyNkZWZpbmUgREVDTEFSRV9VVkNfU0VMRUNUT1JfVU5JVF9ERVNDUklQVE9SKG4pCVwKK3N0cnVjdCBVVkNfU0VMRUNUT1JfVU5JVF9ERVNDUklQVE9SKG4pIHsJCVwKKwlfX3U4ICBiTGVuZ3RoOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsJCQlcCisJX191OCAgYlVuaXRJRDsJCQkJCVwKKwlfX3U4ICBiTnJJblBpbnM7CQkJCVwKKwlfX3U4ICBiYVNvdXJjZUlEW25dOwkJCQlcCisJX191OCAgaVNlbGVjdG9yOwkJCQlcCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisvKiAzLjcuMi41LiBQcm9jZXNzaW5nIFVuaXQgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19wcm9jZXNzaW5nX3VuaXRfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTggIGJVbml0SUQ7CisJX191OCAgYlNvdXJjZUlEOworCV9fdTE2IHdNYXhNdWx0aXBsaWVyOworCV9fdTggIGJDb250cm9sU2l6ZTsKKwlfX3U4ICBibUNvbnRyb2xzWzJdOworCV9fdTggIGlQcm9jZXNzaW5nOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX1BST0NFU1NJTkdfVU5JVF9TSVpFKG4pCQkJKDkrKG4pKQorCisvKiAzLjcuMi42LiBFeHRlbnNpb24gVW5pdCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXZjX2V4dGVuc2lvbl91bml0X2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKKwlfX3U4ICBiVW5pdElEOworCV9fdTggIGd1aWRFeHRlbnNpb25Db2RlWzE2XTsKKwlfX3U4ICBiTnVtQ29udHJvbHM7CisJX191OCAgYk5ySW5QaW5zOworCV9fdTggIGJhU291cmNlSURbMF07CisJX191OCAgYkNvbnRyb2xTaXplOworCV9fdTggIGJtQ29udHJvbHNbMF07CisJX191OCAgaUV4dGVuc2lvbjsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9FWFRFTlNJT05fVU5JVF9TSVpFKHAsIG4pCQkoMjQrKHApKyhuKSkKKworI2RlZmluZSBVVkNfRVhURU5TSU9OX1VOSVRfREVTQ1JJUFRPUihwLCBuKSBcCisJdXZjX2V4dGVuc2lvbl91bml0X2Rlc2NyaXB0b3JfIyNwXyMjbgorCisjZGVmaW5lIERFQ0xBUkVfVVZDX0VYVEVOU0lPTl9VTklUX0RFU0NSSVBUT1IocCwgbikJXAorc3RydWN0IFVWQ19FWFRFTlNJT05fVU5JVF9ERVNDUklQVE9SKHAsIG4pIHsJCVwKKwlfX3U4ICBiTGVuZ3RoOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsJCQlcCisJX191OCAgYlVuaXRJRDsJCQkJCVwKKwlfX3U4ICBndWlkRXh0ZW5zaW9uQ29kZVsxNl07CQkJXAorCV9fdTggIGJOdW1Db250cm9sczsJCQkJXAorCV9fdTggIGJOckluUGluczsJCQkJXAorCV9fdTggIGJhU291cmNlSURbcF07CQkJCVwKKwlfX3U4ICBiQ29udHJvbFNpemU7CQkJCVwKKwlfX3U4ICBibUNvbnRyb2xzW25dOwkJCQlcCisJX191OCAgaUV4dGVuc2lvbjsJCQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworLyogMy44LjIuMi4gVmlkZW8gQ29udHJvbCBJbnRlcnJ1cHQgRW5kcG9pbnQgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19jb250cm9sX2VuZHBvaW50X2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKKwlfX3UxNiB3TWF4VHJhbnNmZXJTaXplOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX0NPTlRST0xfRU5EUE9JTlRfU0laRQkJCTUKKworLyogMy45LjIuMS4gSW5wdXQgSGVhZGVyIERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfaW5wdXRfaGVhZGVyX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKKwlfX3U4ICBiTnVtRm9ybWF0czsKKwlfX3UxNiB3VG90YWxMZW5ndGg7CisJX191OCAgYkVuZHBvaW50QWRkcmVzczsKKwlfX3U4ICBibUluZm87CisJX191OCAgYlRlcm1pbmFsTGluazsKKwlfX3U4ICBiU3RpbGxDYXB0dXJlTWV0aG9kOworCV9fdTggIGJUcmlnZ2VyU3VwcG9ydDsKKwlfX3U4ICBiVHJpZ2dlclVzYWdlOworCV9fdTggIGJDb250cm9sU2l6ZTsKKwlfX3U4ICBibWFDb250cm9sc1tdOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX0lOUFVUX0hFQURFUl9TSVpFKG4sIHApCQkJKDEzKyhuKnApKQorCisjZGVmaW5lIFVWQ19JTlBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKSBcCisJdXZjX2lucHV0X2hlYWRlcl9kZXNjcmlwdG9yXyMjbl8jI3AKKworI2RlZmluZSBERUNMQVJFX1VWQ19JTlBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKQlcCitzdHJ1Y3QgVVZDX0lOUFVUX0hFQURFUl9ERVNDUklQVE9SKG4sIHApIHsJCVwKKwlfX3U4ICBiTGVuZ3RoOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsJCQlcCisJX191OCAgYk51bUZvcm1hdHM7CQkJCVwKKwlfX3UxNiB3VG90YWxMZW5ndGg7CQkJCVwKKwlfX3U4ICBiRW5kcG9pbnRBZGRyZXNzOwkJCQlcCisJX191OCAgYm1JbmZvOwkJCQkJXAorCV9fdTggIGJUZXJtaW5hbExpbms7CQkJCVwKKwlfX3U4ICBiU3RpbGxDYXB0dXJlTWV0aG9kOwkJCVwKKwlfX3U4ICBiVHJpZ2dlclN1cHBvcnQ7CQkJCVwKKwlfX3U4ICBiVHJpZ2dlclVzYWdlOwkJCQlcCisJX191OCAgYkNvbnRyb2xTaXplOwkJCQlcCisJX191OCAgYm1hQ29udHJvbHNbcF1bbl07CQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworLyogMy45LjIuMi4gT3V0cHV0IEhlYWRlciBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXZjX291dHB1dF9oZWFkZXJfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTggIGJOdW1Gb3JtYXRzOworCV9fdTE2IHdUb3RhbExlbmd0aDsKKwlfX3U4ICBiRW5kcG9pbnRBZGRyZXNzOworCV9fdTggIGJUZXJtaW5hbExpbms7CisJX191OCAgYkNvbnRyb2xTaXplOworCV9fdTggIGJtYUNvbnRyb2xzW107Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBVVkNfRFRfT1VUUFVUX0hFQURFUl9TSVpFKG4sIHApCQkJKDkrKG4qcCkpCisKKyNkZWZpbmUgVVZDX09VVFBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKSBcCisJdXZjX291dHB1dF9oZWFkZXJfZGVzY3JpcHRvcl8jI25fIyNwCisKKyNkZWZpbmUgREVDTEFSRV9VVkNfT1VUUFVUX0hFQURFUl9ERVNDUklQVE9SKG4sIHApCVwKK3N0cnVjdCBVVkNfT1VUUFVUX0hFQURFUl9ERVNDUklQVE9SKG4sIHApIHsJCVwKKwlfX3U4ICBiTGVuZ3RoOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsJCQlcCisJX191OCAgYk51bUZvcm1hdHM7CQkJCVwKKwlfX3UxNiB3VG90YWxMZW5ndGg7CQkJCVwKKwlfX3U4ICBiRW5kcG9pbnRBZGRyZXNzOwkJCQlcCisJX191OCAgYlRlcm1pbmFsTGluazsJCQkJXAorCV9fdTggIGJDb250cm9sU2l6ZTsJCQkJXAorCV9fdTggIGJtYUNvbnRyb2xzW3BdW25dOwkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8qIDMuOS4yLjYuIENvbG9yIG1hdGNoaW5nIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfY29sb3JfbWF0Y2hpbmdfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTggIGJDb2xvclByaW1hcmllczsKKwlfX3U4ICBiVHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3M7CisJX191OCAgYk1hdHJpeENvZWZmaWNpZW50czsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9DT0xPUl9NQVRDSElOR19TSVpFCQkJNgorCisvKiA0LjMuMS4xLiBWaWRlbyBQcm9iZSBhbmQgQ29tbWl0IENvbnRyb2xzICovCitzdHJ1Y3QgdXZjX3N0cmVhbWluZ19jb250cm9sIHsKKwlfX3UxNiBibUhpbnQ7CisJX191OCAgYkZvcm1hdEluZGV4OworCV9fdTggIGJGcmFtZUluZGV4OworCV9fdTMyIGR3RnJhbWVJbnRlcnZhbDsKKwlfX3UxNiB3S2V5RnJhbWVSYXRlOworCV9fdTE2IHdQRnJhbWVSYXRlOworCV9fdTE2IHdDb21wUXVhbGl0eTsKKwlfX3UxNiB3Q29tcFdpbmRvd1NpemU7CisJX191MTYgd0RlbGF5OworCV9fdTMyIGR3TWF4VmlkZW9GcmFtZVNpemU7CisJX191MzIgZHdNYXhQYXlsb2FkVHJhbnNmZXJTaXplOworCV9fdTMyIGR3Q2xvY2tGcmVxdWVuY3k7CisJX191OCAgYm1GcmFtaW5nSW5mbzsKKwlfX3U4ICBiUHJlZmVyZWRWZXJzaW9uOworCV9fdTggIGJNaW5WZXJzaW9uOworCV9fdTggIGJNYXhWZXJzaW9uOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKy8qIFVuY29tcHJlc3NlZCBQYXlsb2FkIC0gMy4xLjEuIFVuY29tcHJlc3NlZCBWaWRlbyBGb3JtYXQgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19mb3JtYXRfdW5jb21wcmVzc2VkIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYkZvcm1hdEluZGV4OworCV9fdTggIGJOdW1GcmFtZURlc2NyaXB0b3JzOworCV9fdTggIGd1aWRGb3JtYXRbMTZdOworCV9fdTggIGJCaXRzUGVyUGl4ZWw7CisJX191OCAgYkRlZmF1bHRGcmFtZUluZGV4OworCV9fdTggIGJBc3BlY3RSYXRpb1g7CisJX191OCAgYkFzcGVjdFJhdGlvWTsKKwlfX3U4ICBibUludGVyZmFjZUZsYWdzOworCV9fdTggIGJDb3B5UHJvdGVjdDsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9GT1JNQVRfVU5DT01QUkVTU0VEX1NJWkUJCQkyNworCisvKiBVbmNvbXByZXNzZWQgUGF5bG9hZCAtIDMuMS4yLiBVbmNvbXByZXNzZWQgVmlkZW8gRnJhbWUgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19mcmFtZV91bmNvbXByZXNzZWQgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKKwlfX3U4ICBiRnJhbWVJbmRleDsKKwlfX3U4ICBibUNhcGFiaWxpdGllczsKKwlfX3UxNiB3V2lkdGg7CisJX191MTYgd0hlaWdodDsKKwlfX3UzMiBkd01pbkJpdFJhdGU7CisJX191MzIgZHdNYXhCaXRSYXRlOworCV9fdTMyIGR3TWF4VmlkZW9GcmFtZUJ1ZmZlclNpemU7CisJX191MzIgZHdEZWZhdWx0RnJhbWVJbnRlcnZhbDsKKwlfX3U4ICBiRnJhbWVJbnRlcnZhbFR5cGU7CisJX191MzIgZHdGcmFtZUludGVydmFsW107Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBVVkNfRFRfRlJBTUVfVU5DT01QUkVTU0VEX1NJWkUobikJCSgyNis0KihuKSkKKworI2RlZmluZSBVVkNfRlJBTUVfVU5DT01QUkVTU0VEKG4pIFwKKwl1dmNfZnJhbWVfdW5jb21wcmVzc2VkXyMjbgorCisjZGVmaW5lIERFQ0xBUkVfVVZDX0ZSQU1FX1VOQ09NUFJFU1NFRChuKQkJXAorc3RydWN0IFVWQ19GUkFNRV9VTkNPTVBSRVNTRUQobikgewkJCVwKKwlfX3U4ICBiTGVuZ3RoOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsJCQlcCisJX191OCAgYkZyYW1lSW5kZXg7CQkJCVwKKwlfX3U4ICBibUNhcGFiaWxpdGllczsJCQkJXAorCV9fdTE2IHdXaWR0aDsJCQkJCVwKKwlfX3UxNiB3SGVpZ2h0OwkJCQkJXAorCV9fdTMyIGR3TWluQml0UmF0ZTsJCQkJXAorCV9fdTMyIGR3TWF4Qml0UmF0ZTsJCQkJXAorCV9fdTMyIGR3TWF4VmlkZW9GcmFtZUJ1ZmZlclNpemU7CQlcCisJX191MzIgZHdEZWZhdWx0RnJhbWVJbnRlcnZhbDsJCQlcCisJX191OCAgYkZyYW1lSW50ZXJ2YWxUeXBlOwkJCVwKKwlfX3UzMiBkd0ZyYW1lSW50ZXJ2YWxbbl07CQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworLyogTUpQRUcgUGF5bG9hZCAtIDMuMS4xLiBNSlBFRyBWaWRlbyBGb3JtYXQgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19mb3JtYXRfbWpwZWcgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKKwlfX3U4ICBiRm9ybWF0SW5kZXg7CisJX191OCAgYk51bUZyYW1lRGVzY3JpcHRvcnM7CisJX191OCAgYm1GbGFnczsKKwlfX3U4ICBiRGVmYXVsdEZyYW1lSW5kZXg7CisJX191OCAgYkFzcGVjdFJhdGlvWDsKKwlfX3U4ICBiQXNwZWN0UmF0aW9ZOworCV9fdTggIGJtSW50ZXJmYWNlRmxhZ3M7CisJX191OCAgYkNvcHlQcm90ZWN0OworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX0ZPUk1BVF9NSlBFR19TSVpFCQkJMTEKKworLyogTUpQRUcgUGF5bG9hZCAtIDMuMS4yLiBNSlBFRyBWaWRlbyBGcmFtZSBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXZjX2ZyYW1lX21qcGVnIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYkZyYW1lSW5kZXg7CisJX191OCAgYm1DYXBhYmlsaXRpZXM7CisJX191MTYgd1dpZHRoOworCV9fdTE2IHdIZWlnaHQ7CisJX191MzIgZHdNaW5CaXRSYXRlOworCV9fdTMyIGR3TWF4Qml0UmF0ZTsKKwlfX3UzMiBkd01heFZpZGVvRnJhbWVCdWZmZXJTaXplOworCV9fdTMyIGR3RGVmYXVsdEZyYW1lSW50ZXJ2YWw7CisJX191OCAgYkZyYW1lSW50ZXJ2YWxUeXBlOworCV9fdTMyIGR3RnJhbWVJbnRlcnZhbFtdOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX0ZSQU1FX01KUEVHX1NJWkUobikJCQkoMjYrNCoobikpCisKKyNkZWZpbmUgVVZDX0ZSQU1FX01KUEVHKG4pIFwKKwl1dmNfZnJhbWVfbWpwZWdfIyNuCisKKyNkZWZpbmUgREVDTEFSRV9VVkNfRlJBTUVfTUpQRUcobikJCQlcCitzdHJ1Y3QgVVZDX0ZSQU1FX01KUEVHKG4pIHsJCQkJXAorCV9fdTggIGJMZW5ndGg7CQkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOwkJCVwKKwlfX3U4ICBiRnJhbWVJbmRleDsJCQkJXAorCV9fdTggIGJtQ2FwYWJpbGl0aWVzOwkJCQlcCisJX191MTYgd1dpZHRoOwkJCQkJXAorCV9fdTE2IHdIZWlnaHQ7CQkJCQlcCisJX191MzIgZHdNaW5CaXRSYXRlOwkJCQlcCisJX191MzIgZHdNYXhCaXRSYXRlOwkJCQlcCisJX191MzIgZHdNYXhWaWRlb0ZyYW1lQnVmZmVyU2l6ZTsJCVwKKwlfX3UzMiBkd0RlZmF1bHRGcmFtZUludGVydmFsOwkJCVwKKwlfX3U4ICBiRnJhbWVJbnRlcnZhbFR5cGU7CQkJXAorCV9fdTMyIGR3RnJhbWVJbnRlcnZhbFtuXTsJCQlcCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisjZW5kaWYgLyogX19MSU5VWF9VU0JfVklERU9fSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYmRldmljZV9mcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2JkZXZpY2VfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzVlYzA1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2JkZXZpY2VfZnMuaApAQCAtMCwwICsxLDE1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJdXNiZGV2aWNlX2ZzLmggIC0tICBVU0IgZGV2aWNlIGZpbGUgc3lzdGVtLgorICoKKyAqCUNvcHlyaWdodCAoQykgMjAwMAorICogICAgICAgICAgVGhvbWFzIFNhaWxlciAoc2FpbGVyQGlmZS5lZS5ldGh6LmNoKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBIaXN0b3J5OgorICogICAwLjEgIDA0LjAxLjIwMDAgIENyZWF0ZWQKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0xJTlVYX1VTQkRFVklDRV9GU19ICisjZGVmaW5lIF9MSU5VWF9VU0JERVZJQ0VfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogdXNiZGV2ZnMgaW9jdGwgY29kZXMgKi8KKworc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlciB7CisJX191OCBiUmVxdWVzdFR5cGU7CisJX191OCBiUmVxdWVzdDsKKwlfX3UxNiB3VmFsdWU7CisJX191MTYgd0luZGV4OworCV9fdTE2IHdMZW5ndGg7CisJX191MzIgdGltZW91dDsgIC8qIGluIG1pbGxpc2Vjb25kcyAqLworIAl2b2lkICpkYXRhOworfTsKKworc3RydWN0IHVzYmRldmZzX2J1bGt0cmFuc2ZlciB7CisJdW5zaWduZWQgaW50IGVwOworCXVuc2lnbmVkIGludCBsZW47CisJdW5zaWduZWQgaW50IHRpbWVvdXQ7IC8qIGluIG1pbGxpc2Vjb25kcyAqLworCXZvaWQgKmRhdGE7Cit9OworCitzdHJ1Y3QgdXNiZGV2ZnNfc2V0aW50ZXJmYWNlIHsKKwl1bnNpZ25lZCBpbnQgaW50ZXJmYWNlOworCXVuc2lnbmVkIGludCBhbHRzZXR0aW5nOworfTsKKworc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwgeworCXVuc2lnbmVkIGludCBzaWducjsKKwl2b2lkICpjb250ZXh0OworfTsKKworI2RlZmluZSBVU0JERVZGU19NQVhEUklWRVJOQU1FIDI1NQorCitzdHJ1Y3QgdXNiZGV2ZnNfZ2V0ZHJpdmVyIHsKKwl1bnNpZ25lZCBpbnQgaW50ZXJmYWNlOworCWNoYXIgZHJpdmVyW1VTQkRFVkZTX01BWERSSVZFUk5BTUUgKyAxXTsKK307CisKK3N0cnVjdCB1c2JkZXZmc19jb25uZWN0aW5mbyB7CisJdW5zaWduZWQgaW50IGRldm51bTsKKwl1bnNpZ25lZCBjaGFyIHNsb3c7Cit9OworCisjZGVmaW5lIFVTQkRFVkZTX1VSQl9TSE9SVF9OT1RfT0sJMHgwMQorI2RlZmluZSBVU0JERVZGU19VUkJfSVNPX0FTQVAJCTB4MDIKKyNkZWZpbmUgVVNCREVWRlNfVVJCX0JVTEtfQ09OVElOVUFUSU9OCTB4MDQKKyNkZWZpbmUgVVNCREVWRlNfVVJCX05PX0ZTQlIJCTB4MjAKKyNkZWZpbmUgVVNCREVWRlNfVVJCX1pFUk9fUEFDS0VUCTB4NDAKKyNkZWZpbmUgVVNCREVWRlNfVVJCX05PX0lOVEVSUlVQVAkweDgwCisKKyNkZWZpbmUgVVNCREVWRlNfVVJCX1RZUEVfSVNPCQkgICAwCisjZGVmaW5lIFVTQkRFVkZTX1VSQl9UWVBFX0lOVEVSUlVQVAkgICAxCisjZGVmaW5lIFVTQkRFVkZTX1VSQl9UWVBFX0NPTlRST0wJICAgMgorI2RlZmluZSBVU0JERVZGU19VUkJfVFlQRV9CVUxLCQkgICAzCisKK3N0cnVjdCB1c2JkZXZmc19pc29fcGFja2V0X2Rlc2MgeworCXVuc2lnbmVkIGludCBsZW5ndGg7CisJdW5zaWduZWQgaW50IGFjdHVhbF9sZW5ndGg7CisJdW5zaWduZWQgaW50IHN0YXR1czsKK307CisKK3N0cnVjdCB1c2JkZXZmc191cmIgeworCXVuc2lnbmVkIGNoYXIgdHlwZTsKKwl1bnNpZ25lZCBjaGFyIGVuZHBvaW50OworCWludCBzdGF0dXM7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXZvaWQgKmJ1ZmZlcjsKKwlpbnQgYnVmZmVyX2xlbmd0aDsKKwlpbnQgYWN0dWFsX2xlbmd0aDsKKwlpbnQgc3RhcnRfZnJhbWU7CisJaW50IG51bWJlcl9vZl9wYWNrZXRzOworCWludCBlcnJvcl9jb3VudDsKKwl1bnNpZ25lZCBpbnQgc2lnbnI7CS8qIHNpZ25hbCB0byBiZSBzZW50IG9uIGNvbXBsZXRpb24sCisJCQkJICBvciAwIGlmIG5vbmUgc2hvdWxkIGJlIHNlbnQuICovCisJdm9pZCAqdXNlcmNvbnRleHQ7CisJc3RydWN0IHVzYmRldmZzX2lzb19wYWNrZXRfZGVzYyBpc29fZnJhbWVfZGVzY1swXTsKK307CisKKy8qIGlvY3RscyBmb3IgdGFsa2luZyBkaXJlY3RseSB0byBkcml2ZXJzICovCitzdHJ1Y3QgdXNiZGV2ZnNfaW9jdGwgeworCWludAlpZm5vOwkJLyogaW50ZXJmYWNlIDAuLk4gOyBuZWdhdGl2ZSBudW1iZXJzIHJlc2VydmVkICovCisJaW50CWlvY3RsX2NvZGU7CS8qIE1VU1QgZW5jb2RlIHNpemUgKyBkaXJlY3Rpb24gb2YgZGF0YSBzbyB0aGUKKwkJCQkgKiBtYWNyb3MgaW4gPGFzbS9pb2N0bC5oPiBnaXZlIGNvcnJlY3QgdmFsdWVzICovCisJdm9pZCAqZGF0YTsJLyogcGFyYW0gYnVmZmVyIChpbiwgb3Igb3V0KSAqLworfTsKKworLyogWW91IGNhbiBkbyBtb3N0IHRoaW5ncyB3aXRoIGh1YnMganVzdCB0aHJvdWdoIGNvbnRyb2wgbWVzc2FnZXMsCisgKiBleGNlcHQgZmluZCBvdXQgd2hhdCBkZXZpY2UgY29ubmVjdHMgdG8gd2hhdCBwb3J0LiAqLworc3RydWN0IHVzYmRldmZzX2h1Yl9wb3J0aW5mbyB7CisJY2hhciBucG9ydHM7CQkvKiBudW1iZXIgb2YgZG93bnN0cmVhbSBwb3J0cyBpbiB0aGlzIGh1YiAqLworCWNoYXIgcG9ydCBbMTI3XTsJLyogZS5nLiBwb3J0IDMgY29ubmVjdHMgdG8gZGV2aWNlIDI3ICovCit9OworCisKKyNkZWZpbmUgVVNCREVWRlNfQ09OVFJPTCAgICAgICAgICAgX0lPV1IoJ1UnLCAwLCBzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyKQorI2RlZmluZSBVU0JERVZGU19DT05UUk9MMzIgICAgICAgICAgIF9JT1dSKCdVJywgMCwgc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlcjMyKQorI2RlZmluZSBVU0JERVZGU19CVUxLICAgICAgICAgICAgICBfSU9XUignVScsIDIsIHN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIpCisjZGVmaW5lIFVTQkRFVkZTX0JVTEszMiAgICAgICAgICAgICAgX0lPV1IoJ1UnLCAyLCBzdHJ1Y3QgdXNiZGV2ZnNfYnVsa3RyYW5zZmVyMzIpCisjZGVmaW5lIFVTQkRFVkZTX1JFU0VURVAgICAgICAgICAgIF9JT1IoJ1UnLCAzLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFVTQkRFVkZTX1NFVElOVEVSRkFDRSAgICAgIF9JT1IoJ1UnLCA0LCBzdHJ1Y3QgdXNiZGV2ZnNfc2V0aW50ZXJmYWNlKQorI2RlZmluZSBVU0JERVZGU19TRVRDT05GSUdVUkFUSU9OICBfSU9SKCdVJywgNSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBVU0JERVZGU19HRVREUklWRVIgICAgICAgICBfSU9XKCdVJywgOCwgc3RydWN0IHVzYmRldmZzX2dldGRyaXZlcikKKyNkZWZpbmUgVVNCREVWRlNfU1VCTUlUVVJCICAgICAgICAgX0lPUignVScsIDEwLCBzdHJ1Y3QgdXNiZGV2ZnNfdXJiKQorI2RlZmluZSBVU0JERVZGU19TVUJNSVRVUkIzMiAgICAgICBfSU9SKCdVJywgMTAsIHN0cnVjdCB1c2JkZXZmc191cmIzMikKKyNkZWZpbmUgVVNCREVWRlNfRElTQ0FSRFVSQiAgICAgICAgX0lPKCdVJywgMTEpCisjZGVmaW5lIFVTQkRFVkZTX1JFQVBVUkIgICAgICAgICAgIF9JT1coJ1UnLCAxMiwgdm9pZCAqKQorI2RlZmluZSBVU0JERVZGU19SRUFQVVJCMzIgICAgICAgICBfSU9XKCdVJywgMTIsIF9fdTMyKQorI2RlZmluZSBVU0JERVZGU19SRUFQVVJCTkRFTEFZICAgICBfSU9XKCdVJywgMTMsIHZvaWQgKikKKyNkZWZpbmUgVVNCREVWRlNfUkVBUFVSQk5ERUxBWTMyICAgX0lPVygnVScsIDEzLCBfX3UzMikKKyNkZWZpbmUgVVNCREVWRlNfRElTQ1NJR05BTCAgICAgICAgX0lPUignVScsIDE0LCBzdHJ1Y3QgdXNiZGV2ZnNfZGlzY29ubmVjdHNpZ25hbCkKKyNkZWZpbmUgVVNCREVWRlNfRElTQ1NJR05BTDMyICAgICAgX0lPUignVScsIDE0LCBzdHJ1Y3QgdXNiZGV2ZnNfZGlzY29ubmVjdHNpZ25hbDMyKQorI2RlZmluZSBVU0JERVZGU19DTEFJTUlOVEVSRkFDRSAgICBfSU9SKCdVJywgMTUsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVVNCREVWRlNfUkVMRUFTRUlOVEVSRkFDRSAgX0lPUignVScsIDE2LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFVTQkRFVkZTX0NPTk5FQ1RJTkZPICAgICAgIF9JT1coJ1UnLCAxNywgc3RydWN0IHVzYmRldmZzX2Nvbm5lY3RpbmZvKQorI2RlZmluZSBVU0JERVZGU19JT0NUTCAgICAgICAgICAgICBfSU9XUignVScsIDE4LCBzdHJ1Y3QgdXNiZGV2ZnNfaW9jdGwpCisjZGVmaW5lIFVTQkRFVkZTX0lPQ1RMMzIgICAgICAgICAgIF9JT1dSKCdVJywgMTgsIHN0cnVjdCB1c2JkZXZmc19pb2N0bDMyKQorI2RlZmluZSBVU0JERVZGU19IVUJfUE9SVElORk8gICAgICBfSU9SKCdVJywgMTksIHN0cnVjdCB1c2JkZXZmc19odWJfcG9ydGluZm8pCisjZGVmaW5lIFVTQkRFVkZTX1JFU0VUICAgICAgICAgICAgIF9JTygnVScsIDIwKQorI2RlZmluZSBVU0JERVZGU19DTEVBUl9IQUxUICAgICAgICBfSU9SKCdVJywgMjEsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVVNCREVWRlNfRElTQ09OTkVDVCAgICAgICAgX0lPKCdVJywgMjIpCisjZGVmaW5lIFVTQkRFVkZTX0NPTk5FQ1QgICAgICAgICAgIF9JTygnVScsIDIzKQorI2RlZmluZSBVU0JERVZGU19DTEFJTV9QT1JUICAgICAgICBfSU9SKCdVJywgMjQsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVVNCREVWRlNfUkVMRUFTRV9QT1JUICAgICAgX0lPUignVScsIDI1LCB1bnNpZ25lZCBpbnQpCisjZW5kaWYgLyogX0xJTlVYX1VTQkRFVklDRV9GU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3V0aW1lLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3V0aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkZjY3MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXRpbWUuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9MSU5VWF9VVElNRV9ICisjZGVmaW5lIF9MSU5VWF9VVElNRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgdXRpbWJ1ZiB7CisJX19rZXJuZWxfdGltZV90IGFjdGltZTsKKwlfX2tlcm5lbF90aW1lX3QgbW9kdGltZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91dHNuYW1lLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg3ZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91dHNuYW1lLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBfTElOVVhfVVRTTkFNRV9ICisjZGVmaW5lIF9MSU5VWF9VVFNOQU1FX0gKKworI2RlZmluZSBfX09MRF9VVFNfTEVOIDgKKworc3RydWN0IG9sZG9sZF91dHNuYW1lIHsKKwljaGFyIHN5c25hbWVbOV07CisJY2hhciBub2RlbmFtZVs5XTsKKwljaGFyIHJlbGVhc2VbOV07CisJY2hhciB2ZXJzaW9uWzldOworCWNoYXIgbWFjaGluZVs5XTsKK307CisKKyNkZWZpbmUgX19ORVdfVVRTX0xFTiA2NAorCitzdHJ1Y3Qgb2xkX3V0c25hbWUgeworCWNoYXIgc3lzbmFtZVs2NV07CisJY2hhciBub2RlbmFtZVs2NV07CisJY2hhciByZWxlYXNlWzY1XTsKKwljaGFyIHZlcnNpb25bNjVdOworCWNoYXIgbWFjaGluZVs2NV07Cit9OworCitzdHJ1Y3QgbmV3X3V0c25hbWUgeworCWNoYXIgc3lzbmFtZVtfX05FV19VVFNfTEVOICsgMV07CisJY2hhciBub2RlbmFtZVtfX05FV19VVFNfTEVOICsgMV07CisJY2hhciByZWxlYXNlW19fTkVXX1VUU19MRU4gKyAxXTsKKwljaGFyIHZlcnNpb25bX19ORVdfVVRTX0xFTiArIDFdOworCWNoYXIgbWFjaGluZVtfX05FV19VVFNfTEVOICsgMV07CisJY2hhciBkb21haW5uYW1lW19fTkVXX1VUU19MRU4gKyAxXTsKK307CisKKworI2VuZGlmIC8qIF9MSU5VWF9VVFNOQU1FX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXZjdmlkZW8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXZjdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFhY2ZjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91dmN2aWRlby5oCkBAIC0wLDAgKzEsNjkgQEAKKyNpZm5kZWYgX19MSU5VWF9VVkNWSURFT19IXworI2RlZmluZSBfX0xJTlVYX1VWQ1ZJREVPX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBEeW5hbWljIGNvbnRyb2xzCisgKi8KKworLyogRGF0YSB0eXBlcyBmb3IgVVZDIGNvbnRyb2wgZGF0YSAqLworI2RlZmluZSBVVkNfQ1RSTF9EQVRBX1RZUEVfUkFXCQkwCisjZGVmaW5lIFVWQ19DVFJMX0RBVEFfVFlQRV9TSUdORUQJMQorI2RlZmluZSBVVkNfQ1RSTF9EQVRBX1RZUEVfVU5TSUdORUQJMgorI2RlZmluZSBVVkNfQ1RSTF9EQVRBX1RZUEVfQk9PTEVBTgkzCisjZGVmaW5lIFVWQ19DVFJMX0RBVEFfVFlQRV9FTlVNCQk0CisjZGVmaW5lIFVWQ19DVFJMX0RBVEFfVFlQRV9CSVRNQVNLCTUKKworLyogQ29udHJvbCBmbGFncyAqLworI2RlZmluZSBVVkNfQ1RSTF9GTEFHX1NFVF9DVVIJCSgxIDw8IDApCisjZGVmaW5lIFVWQ19DVFJMX0ZMQUdfR0VUX0NVUgkJKDEgPDwgMSkKKyNkZWZpbmUgVVZDX0NUUkxfRkxBR19HRVRfTUlOCQkoMSA8PCAyKQorI2RlZmluZSBVVkNfQ1RSTF9GTEFHX0dFVF9NQVgJCSgxIDw8IDMpCisjZGVmaW5lIFVWQ19DVFJMX0ZMQUdfR0VUX1JFUwkJKDEgPDwgNCkKKyNkZWZpbmUgVVZDX0NUUkxfRkxBR19HRVRfREVGCQkoMSA8PCA1KQorLyogQ29udHJvbCBzaG91bGQgYmUgc2F2ZWQgYXQgc3VzcGVuZCBhbmQgcmVzdG9yZWQgYXQgcmVzdW1lLiAqLworI2RlZmluZSBVVkNfQ1RSTF9GTEFHX1JFU1RPUkUJCSgxIDw8IDYpCisvKiBDb250cm9sIGNhbiBiZSB1cGRhdGVkIGJ5IHRoZSBjYW1lcmEuICovCisjZGVmaW5lIFVWQ19DVFJMX0ZMQUdfQVVUT19VUERBVEUJKDEgPDwgNykKKworI2RlZmluZSBVVkNfQ1RSTF9GTEFHX0dFVF9SQU5HRSBcCisJKFVWQ19DVFJMX0ZMQUdfR0VUX0NVUiB8IFVWQ19DVFJMX0ZMQUdfR0VUX01JTiB8IFwKKwkgVVZDX0NUUkxfRkxBR19HRVRfTUFYIHwgVVZDX0NUUkxfRkxBR19HRVRfUkVTIHwgXAorCSBVVkNfQ1RSTF9GTEFHX0dFVF9ERUYpCisKK3N0cnVjdCB1dmNfbWVudV9pbmZvIHsKKwlfX3UzMiB2YWx1ZTsKKwlfX3U4IG5hbWVbMzJdOworfTsKKworc3RydWN0IHV2Y194dV9jb250cm9sX21hcHBpbmcgeworCV9fdTMyIGlkOworCV9fdTggbmFtZVszMl07CisJX191OCBlbnRpdHlbMTZdOworCV9fdTggc2VsZWN0b3I7CisKKwlfX3U4IHNpemU7CisJX191OCBvZmZzZXQ7CisJX191MzIgdjRsMl90eXBlOworCV9fdTMyIGRhdGFfdHlwZTsKKworCXN0cnVjdCB1dmNfbWVudV9pbmZvICptZW51X2luZm87CisJX191MzIgbWVudV9jb3VudDsKKworCV9fdTMyIHJlc2VydmVkWzRdOworfTsKKworc3RydWN0IHV2Y194dV9jb250cm9sX3F1ZXJ5IHsKKwlfX3U4IHVuaXQ7CisJX191OCBzZWxlY3RvcjsKKwlfX3U4IHF1ZXJ5OworCV9fdTE2IHNpemU7CisJX191OCAqZGF0YTsKK307CisKKyNkZWZpbmUgVVZDSU9DX0NUUkxfTUFQCQlfSU9XUigndScsIDB4MjAsIHN0cnVjdCB1dmNfeHVfY29udHJvbF9tYXBwaW5nKQorI2RlZmluZSBVVkNJT0NfQ1RSTF9RVUVSWQlfSU9XUigndScsIDB4MjEsIHN0cnVjdCB1dmNfeHVfY29udHJvbF9xdWVyeSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Y0bDItbWVkaWFidXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdjRsMi1tZWRpYWJ1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYTdmNzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Y0bDItbWVkaWFidXMuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIE1lZGlhIEJ1cyBBUEkgaGVhZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCBHdWVubmFkaSBMaWFraG92ZXRza2kgPGcubGlha2hvdmV0c2tpQGdteC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9WNEwyX01FRElBQlVTX0gKKyNkZWZpbmUgX19MSU5VWF9WNEwyX01FRElBQlVTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKy8qCisgKiBUaGVzZSBwaXhlbCBjb2RlcyB1bmlxdWVseSBpZGVudGlmeSBkYXRhIGZvcm1hdHMgb24gdGhlIG1lZGlhIGJ1cy4gTW9zdGx5CisgKiB0aGV5IGNvcnJlc3BvbmQgdG8gc2ltaWxhcmx5IG5hbWVkIFY0TDJfUElYX0ZNVF8qIGZvcm1hdHMsIGZvcm1hdCAwIGlzCisgKiByZXNlcnZlZCwgVjRMMl9NQlVTX0ZNVF9GSVhFRCBzaGFsbCBiZSB1c2VkIGJ5IGhvc3QtY2xpZW50IHBhaXJzLCB3aGVyZSB0aGUKKyAqIGRhdGEgZm9ybWF0IGlzIGZpeGVkLiBBZGRpdGlvbmFsbHksICIyWDgiIG1lYW5zIHRoYXQgb25lIHBpeGVsIGlzIHRyYW5zZmVycmVkCisgKiBpbiB0d28gOC1iaXQgc2FtcGxlcywgIkJFIiBvciAiTEUiIHNwZWNpZnkgaW4gd2hpY2ggb3JkZXIgdGhvc2Ugc2FtcGxlcyBhcmUKKyAqIHRyYW5zZmVycmVkIG92ZXIgdGhlIGJ1czogIkxFIiBtZWFucyB0aGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGFyZQorICogdHJhbnNmZXJyZWQgZmlyc3QsICJCRSIgbWVhbnMgdGhhdCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIGFyZSB0cmFuc2ZlcnJlZAorICogZmlyc3QsIGFuZCAiUEFESEkiIGFuZCAiUEFETE8iIGRlZmluZSB3aGljaCBiaXRzIC0gbG93IG9yIGhpZ2gsIGluIHRoZQorICogaW5jb21wbGV0ZSBoaWdoIGJ5dGUsIGFyZSBmaWxsZWQgd2l0aCBwYWRkaW5nIGJpdHMuCisgKgorICogVGhlIHBpeGVsIGNvZGVzIGFyZSBncm91cGVkIGJ5IHR5cGUsIGJ1c193aWR0aCwgYml0cyBwZXIgY29tcG9uZW50LCBzYW1wbGVzCisgKiBwZXIgcGl4ZWwgYW5kIG9yZGVyIG9mIHN1YnNhbXBsZXMuIE51bWVyaWNhbCB2YWx1ZXMgYXJlIHNvcnRlZCB1c2luZyBnZW5lcmljCisgKiBudW1lcmljYWwgc29ydCBvcmRlciAoOCB0aHVzIGNvbWVzIGJlZm9yZSAxMCkuCisgKgorICogQXMgdGhlaXIgdmFsdWUgY2FuJ3QgY2hhbmdlIHdoZW4gYSBuZXcgcGl4ZWwgY29kZSBpcyBpbnNlcnRlZCBpbiB0aGUKKyAqIGVudW1lcmF0aW9uLCB0aGUgcGl4ZWwgY29kZXMgYXJlIGV4cGxpY2l0bHkgZ2l2ZW4gYSBudW1lcmljYWwgdmFsdWUuIFRoZSBuZXh0CisgKiBmcmVlIHZhbHVlcyBmb3IgZWFjaCBjYXRlZ29yeSBhcmUgbGlzdGVkIGJlbG93LCB1cGRhdGUgdGhlbSB3aGVuIGluc2VydGluZworICogbmV3IHBpeGVsIGNvZGVzLgorICovCitlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgeworCVY0TDJfTUJVU19GTVRfRklYRUQgPSAweDAwMDEsCisKKwkvKiBSR0IgLSBuZXh0IGlzIDB4MTAwOSAqLworCVY0TDJfTUJVU19GTVRfUkdCNDQ0XzJYOF9QQURISV9CRSA9IDB4MTAwMSwKKwlWNEwyX01CVVNfRk1UX1JHQjQ0NF8yWDhfUEFESElfTEUgPSAweDEwMDIsCisJVjRMMl9NQlVTX0ZNVF9SR0I1NTVfMlg4X1BBREhJX0JFID0gMHgxMDAzLAorCVY0TDJfTUJVU19GTVRfUkdCNTU1XzJYOF9QQURISV9MRSA9IDB4MTAwNCwKKwlWNEwyX01CVVNfRk1UX0JHUjU2NV8yWDhfQkUgPSAweDEwMDUsCisJVjRMMl9NQlVTX0ZNVF9CR1I1NjVfMlg4X0xFID0gMHgxMDA2LAorCVY0TDJfTUJVU19GTVRfUkdCNTY1XzJYOF9CRSA9IDB4MTAwNywKKwlWNEwyX01CVVNfRk1UX1JHQjU2NV8yWDhfTEUgPSAweDEwMDgsCisKKwkvKiBZVVYgKGluY2x1ZGluZyBncmV5KSAtIG5leHQgaXMgMHgyMDE0ICovCisJVjRMMl9NQlVTX0ZNVF9ZOF8xWDggPSAweDIwMDEsCisJVjRMMl9NQlVTX0ZNVF9VWVZZOF8xXzVYOCA9IDB4MjAwMiwKKwlWNEwyX01CVVNfRk1UX1ZZVVk4XzFfNVg4ID0gMHgyMDAzLAorCVY0TDJfTUJVU19GTVRfWVVZVjhfMV81WDggPSAweDIwMDQsCisJVjRMMl9NQlVTX0ZNVF9ZVllVOF8xXzVYOCA9IDB4MjAwNSwKKwlWNEwyX01CVVNfRk1UX1VZVlk4XzJYOCA9IDB4MjAwNiwKKwlWNEwyX01CVVNfRk1UX1ZZVVk4XzJYOCA9IDB4MjAwNywKKwlWNEwyX01CVVNfRk1UX1lVWVY4XzJYOCA9IDB4MjAwOCwKKwlWNEwyX01CVVNfRk1UX1lWWVU4XzJYOCA9IDB4MjAwOSwKKwlWNEwyX01CVVNfRk1UX1kxMF8xWDEwID0gMHgyMDBhLAorCVY0TDJfTUJVU19GTVRfWVVZVjEwXzJYMTAgPSAweDIwMGIsCisJVjRMMl9NQlVTX0ZNVF9ZVllVMTBfMlgxMCA9IDB4MjAwYywKKwlWNEwyX01CVVNfRk1UX1kxMl8xWDEyID0gMHgyMDEzLAorCVY0TDJfTUJVU19GTVRfVVlWWThfMVgxNiA9IDB4MjAwZiwKKwlWNEwyX01CVVNfRk1UX1ZZVVk4XzFYMTYgPSAweDIwMTAsCisJVjRMMl9NQlVTX0ZNVF9ZVVlWOF8xWDE2ID0gMHgyMDExLAorCVY0TDJfTUJVU19GTVRfWVZZVThfMVgxNiA9IDB4MjAxMiwKKwlWNEwyX01CVVNfRk1UX1lVWVYxMF8xWDIwID0gMHgyMDBkLAorCVY0TDJfTUJVU19GTVRfWVZZVTEwXzFYMjAgPSAweDIwMGUsCisKKwkvKiBCYXllciAtIG5leHQgaXMgMHgzMDE1ICovCisJVjRMMl9NQlVTX0ZNVF9TQkdHUjhfMVg4ID0gMHgzMDAxLAorCVY0TDJfTUJVU19GTVRfU0dCUkc4XzFYOCA9IDB4MzAxMywKKwlWNEwyX01CVVNfRk1UX1NHUkJHOF8xWDggPSAweDMwMDIsCisJVjRMMl9NQlVTX0ZNVF9TUkdHQjhfMVg4ID0gMHgzMDE0LAorCVY0TDJfTUJVU19GTVRfU0JHR1IxMF9EUENNOF8xWDggPSAweDMwMGIsCisJVjRMMl9NQlVTX0ZNVF9TR0JSRzEwX0RQQ004XzFYOCA9IDB4MzAwYywKKwlWNEwyX01CVVNfRk1UX1NHUkJHMTBfRFBDTThfMVg4ID0gMHgzMDA5LAorCVY0TDJfTUJVU19GTVRfU1JHR0IxMF9EUENNOF8xWDggPSAweDMwMGQsCisJVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzJYOF9QQURISV9CRSA9IDB4MzAwMywKKwlWNEwyX01CVVNfRk1UX1NCR0dSMTBfMlg4X1BBREhJX0xFID0gMHgzMDA0LAorCVY0TDJfTUJVU19GTVRfU0JHR1IxMF8yWDhfUEFETE9fQkUgPSAweDMwMDUsCisJVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzJYOF9QQURMT19MRSA9IDB4MzAwNiwKKwlWNEwyX01CVVNfRk1UX1NCR0dSMTBfMVgxMCA9IDB4MzAwNywKKwlWNEwyX01CVVNfRk1UX1NHQlJHMTBfMVgxMCA9IDB4MzAwZSwKKwlWNEwyX01CVVNfRk1UX1NHUkJHMTBfMVgxMCA9IDB4MzAwYSwKKwlWNEwyX01CVVNfRk1UX1NSR0dCMTBfMVgxMCA9IDB4MzAwZiwKKwlWNEwyX01CVVNfRk1UX1NCR0dSMTJfMVgxMiA9IDB4MzAwOCwKKwlWNEwyX01CVVNfRk1UX1NHQlJHMTJfMVgxMiA9IDB4MzAxMCwKKwlWNEwyX01CVVNfRk1UX1NHUkJHMTJfMVgxMiA9IDB4MzAxMSwKKwlWNEwyX01CVVNfRk1UX1NSR0dCMTJfMVgxMiA9IDB4MzAxMiwKKworCS8qIEpQRUcgY29tcHJlc3NlZCBmb3JtYXRzIC0gbmV4dCBpcyAweDQwMDIgKi8KKwlWNEwyX01CVVNfRk1UX0pQRUdfMVg4ID0gMHg0MDAxLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IC0gZnJhbWUgZm9ybWF0IG9uIHRoZSBtZWRpYSBidXMKKyAqIEB3aWR0aDoJZnJhbWUgd2lkdGgKKyAqIEBoZWlnaHQ6CWZyYW1lIGhlaWdodAorICogQGNvZGU6CWRhdGEgZm9ybWF0IGNvZGUgKGZyb20gZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlKQorICogQGZpZWxkOgl1c2VkIGludGVybGFjaW5nIHR5cGUgKGZyb20gZW51bSB2NGwyX2ZpZWxkKQorICogQGNvbG9yc3BhY2U6CWNvbG9yc3BhY2Ugb2YgdGhlIGRhdGEgKGZyb20gZW51bSB2NGwyX2NvbG9yc3BhY2UpCisgKi8KK3N0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgeworCV9fdTMyCQkJd2lkdGg7CisJX191MzIJCQloZWlnaHQ7CisJX191MzIJCQljb2RlOworCV9fdTMyCQkJZmllbGQ7CisJX191MzIJCQljb2xvcnNwYWNlOworCV9fdTMyCQkJcmVzZXJ2ZWRbN107Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdjRsMi1zdWJkZXYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdjRsMi1zdWJkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDI5Y2JiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92NGwyLXN1YmRldi5oCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogVjRMMiBzdWJkZXYgdXNlcnNwYWNlIEFQSQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIENvbnRhY3RzOiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+CisgKgkgICAgIFNha2FyaSBBaWx1cyA8c2FrYXJpLmFpbHVzQGlraS5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1Y0TDJfU1VCREVWX0gKKyNkZWZpbmUgX19MSU5VWF9WNEwyX1NVQkRFVl9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgorCisvKioKKyAqIGVudW0gdjRsMl9zdWJkZXZfZm9ybWF0X3doZW5jZSAtIE1lZGlhIGJ1cyBmb3JtYXQgdHlwZQorICogQFY0TDJfU1VCREVWX0ZPUk1BVF9UUlk6IHRyeSBmb3JtYXQsIGZvciBuZWdvdGlhdGlvbiBvbmx5CisgKiBAVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRTogYWN0aXZlIGZvcm1hdCwgYXBwbGllZCB0byB0aGUgZGV2aWNlCisgKi8KK2VudW0gdjRsMl9zdWJkZXZfZm9ybWF0X3doZW5jZSB7CisJVjRMMl9TVUJERVZfRk9STUFUX1RSWSA9IDAsCisJVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRSA9IDEsCit9OworCisvKioKKyAqIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgLSBQYWQtbGV2ZWwgbWVkaWEgYnVzIGZvcm1hdAorICogQHdoaWNoOiBmb3JtYXQgdHlwZSAoZnJvbSBlbnVtIHY0bDJfc3ViZGV2X2Zvcm1hdF93aGVuY2UpCisgKiBAcGFkOiBwYWQgbnVtYmVyLCBhcyByZXBvcnRlZCBieSB0aGUgbWVkaWEgQVBJCisgKiBAZm9ybWF0OiBtZWRpYSBidXMgZm9ybWF0IChmb3JtYXQgY29kZSBhbmQgZnJhbWUgc2l6ZSkKKyAqLworc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCB7CisJX191MzIgd2hpY2g7CisJX191MzIgcGFkOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgZm9ybWF0OworCV9fdTMyIHJlc2VydmVkWzhdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9zdWJkZXZfY3JvcCAtIFBhZC1sZXZlbCBjcm9wIHNldHRpbmdzCisgKiBAd2hpY2g6IGZvcm1hdCB0eXBlIChmcm9tIGVudW0gdjRsMl9zdWJkZXZfZm9ybWF0X3doZW5jZSkKKyAqIEBwYWQ6IHBhZCBudW1iZXIsIGFzIHJlcG9ydGVkIGJ5IHRoZSBtZWRpYSBBUEkKKyAqIEByZWN0OiBwYWQgY3JvcCByZWN0YW5nbGUgYm91bmRhcmllcworICovCitzdHJ1Y3QgdjRsMl9zdWJkZXZfY3JvcCB7CisJX191MzIgd2hpY2g7CisJX191MzIgcGFkOworCXN0cnVjdCB2NGwyX3JlY3QgcmVjdDsKKwlfX3UzMiByZXNlcnZlZFs4XTsKK307CisKKy8qKgorICogc3RydWN0IHY0bDJfc3ViZGV2X21idXNfY29kZV9lbnVtIC0gTWVkaWEgYnVzIGZvcm1hdCBlbnVtZXJhdGlvbgorICogQHBhZDogcGFkIG51bWJlciwgYXMgcmVwb3J0ZWQgYnkgdGhlIG1lZGlhIEFQSQorICogQGluZGV4OiBmb3JtYXQgaW5kZXggZHVyaW5nIGVudW1lcmF0aW9uCisgKiBAY29kZTogZm9ybWF0IGNvZGUgKGZyb20gZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlKQorICovCitzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0geworCV9fdTMyIHBhZDsKKwlfX3UzMiBpbmRleDsKKwlfX3UzMiBjb2RlOworCV9fdTMyIHJlc2VydmVkWzldOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9zdWJkZXZfZnJhbWVfc2l6ZV9lbnVtIC0gTWVkaWEgYnVzIGZvcm1hdCBlbnVtZXJhdGlvbgorICogQHBhZDogcGFkIG51bWJlciwgYXMgcmVwb3J0ZWQgYnkgdGhlIG1lZGlhIEFQSQorICogQGluZGV4OiBmb3JtYXQgaW5kZXggZHVyaW5nIGVudW1lcmF0aW9uCisgKiBAY29kZTogZm9ybWF0IGNvZGUgKGZyb20gZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlKQorICovCitzdHJ1Y3QgdjRsMl9zdWJkZXZfZnJhbWVfc2l6ZV9lbnVtIHsKKwlfX3UzMiBpbmRleDsKKwlfX3UzMiBwYWQ7CisJX191MzIgY29kZTsKKwlfX3UzMiBtaW5fd2lkdGg7CisJX191MzIgbWF4X3dpZHRoOworCV9fdTMyIG1pbl9oZWlnaHQ7CisJX191MzIgbWF4X2hlaWdodDsKKwlfX3UzMiByZXNlcnZlZFs5XTsKK307CisKKy8qKgorICogc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX2ludGVydmFsIC0gUGFkLWxldmVsIGZyYW1lIHJhdGUKKyAqIEBwYWQ6IHBhZCBudW1iZXIsIGFzIHJlcG9ydGVkIGJ5IHRoZSBtZWRpYSBBUEkKKyAqIEBpbnRlcnZhbDogZnJhbWUgaW50ZXJ2YWwgaW4gc2Vjb25kcworICovCitzdHJ1Y3QgdjRsMl9zdWJkZXZfZnJhbWVfaW50ZXJ2YWwgeworCV9fdTMyIHBhZDsKKwlzdHJ1Y3QgdjRsMl9mcmFjdCBpbnRlcnZhbDsKKwlfX3UzMiByZXNlcnZlZFs5XTsKK307CisKKy8qKgorICogc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX2ludGVydmFsX2VudW0gLSBGcmFtZSBpbnRlcnZhbCBlbnVtZXJhdGlvbgorICogQHBhZDogcGFkIG51bWJlciwgYXMgcmVwb3J0ZWQgYnkgdGhlIG1lZGlhIEFQSQorICogQGluZGV4OiBmcmFtZSBpbnRlcnZhbCBpbmRleCBkdXJpbmcgZW51bWVyYXRpb24KKyAqIEBjb2RlOiBmb3JtYXQgY29kZSAoZnJvbSBlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUpCisgKiBAd2lkdGg6IGZyYW1lIHdpZHRoIGluIHBpeGVscworICogQGhlaWdodDogZnJhbWUgaGVpZ2h0IGluIHBpeGVscworICogQGludGVydmFsOiBmcmFtZSBpbnRlcnZhbCBpbiBzZWNvbmRzCisgKi8KK3N0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbF9lbnVtIHsKKwlfX3UzMiBpbmRleDsKKwlfX3UzMiBwYWQ7CisJX191MzIgY29kZTsKKwlfX3UzMiB3aWR0aDsKKwlfX3UzMiBoZWlnaHQ7CisJc3RydWN0IHY0bDJfZnJhY3QgaW50ZXJ2YWw7CisJX191MzIgcmVzZXJ2ZWRbOV07Cit9OworCisjZGVmaW5lIFZJRElPQ19TVUJERVZfR19GTVQJX0lPV1IoJ1YnLCAgNCwgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCkKKyNkZWZpbmUgVklESU9DX1NVQkRFVl9TX0ZNVAlfSU9XUignVicsICA1LCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0KQorI2RlZmluZSBWSURJT0NfU1VCREVWX0dfRlJBTUVfSU5URVJWQUwgXAorCQkJX0lPV1IoJ1YnLCAyMSwgc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX2ludGVydmFsKQorI2RlZmluZSBWSURJT0NfU1VCREVWX1NfRlJBTUVfSU5URVJWQUwgXAorCQkJX0lPV1IoJ1YnLCAyMiwgc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX2ludGVydmFsKQorI2RlZmluZSBWSURJT0NfU1VCREVWX0VOVU1fTUJVU19DT0RFIFwKKwkJCV9JT1dSKCdWJywgIDIsIHN0cnVjdCB2NGwyX3N1YmRldl9tYnVzX2NvZGVfZW51bSkKKyNkZWZpbmUgVklESU9DX1NVQkRFVl9FTlVNX0ZSQU1FX1NJWkUgXAorCQkJX0lPV1IoJ1YnLCA3NCwgc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX3NpemVfZW51bSkKKyNkZWZpbmUgVklESU9DX1NVQkRFVl9FTlVNX0ZSQU1FX0lOVEVSVkFMIFwKKwkJCV9JT1dSKCdWJywgNzUsIHN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbF9lbnVtKQorI2RlZmluZSBWSURJT0NfU1VCREVWX0dfQ1JPUAlfSU9XUignVicsIDU5LCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY3JvcCkKKyNkZWZpbmUgVklESU9DX1NVQkRFVl9TX0NST1AJX0lPV1IoJ1YnLCA2MCwgc3RydWN0IHY0bDJfc3ViZGV2X2Nyb3ApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92ZXJzaW9uLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzcwNDhmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92ZXJzaW9uLmgKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIExJTlVYX1ZFUlNJT05fQ09ERSAxOTcxMzQKKyNkZWZpbmUgS0VSTkVMX1ZFUlNJT04oYSxiLGMpICgoKGEpIDw8IDE2KSArICgoYikgPDwgOCkgKyAoYykpCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZldGguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmV0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTRjMWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZldGguaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9fTkVUX1ZFVEhfSF8KKyNkZWZpbmUgX19ORVRfVkVUSF9IXworCitlbnVtIHsKKwlWRVRIX0lORk9fVU5TUEVDLAorCVZFVEhfSU5GT19QRUVSLAorCisJX19WRVRIX0lORk9fTUFYCisjZGVmaW5lIFZFVEhfSU5GT19NQVgJKF9fVkVUSF9JTkZPX01BWCAtIDEpCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmhvc3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmhvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjVhNDg0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aG9zdC5oCkBAIC0wLDAgKzEsMTMwIEBACisjaWZuZGVmIF9MSU5VWF9WSE9TVF9ICisjZGVmaW5lIF9MSU5VWF9WSE9TVF9ICisvKiBVc2Vyc3BhY2UgaW50ZXJmYWNlIGZvciBpbi1rZXJuZWwgdmlydGlvIGFjY2VsZXJhdG9ycy4gKi8KKworLyogdmhvc3QgaXMgdXNlZCB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBzeXN0ZW0gY2FsbHMgaW52b2x2ZWQgaW4gdmlydGlvLgorICoKKyAqIEV4aXN0aW5nIHZpcnRpbyBuZXQgY29kZSBpcyB1c2VkIGluIHRoZSBndWVzdCB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqCisgKiBUaGlzIGhlYWRlciBpbmNsdWRlcyBpbnRlcmZhY2UgdXNlZCBieSB1c2Vyc3BhY2UgaHlwZXJ2aXNvciBmb3IKKyAqIGRldmljZSBjb25maWd1cmF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX3JpbmcuaD4KKworc3RydWN0IHZob3N0X3ZyaW5nX3N0YXRlIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdW5zaWduZWQgaW50IG51bTsKK307CisKK3N0cnVjdCB2aG9zdF92cmluZ19maWxlIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJaW50IGZkOyAvKiBQYXNzIC0xIHRvIHVuYmluZCBmcm9tIGZpbGUuICovCisKK307CisKK3N0cnVjdCB2aG9zdF92cmluZ19hZGRyIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJLyogT3B0aW9uIGZsYWdzLiAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKwkvKiBGbGFnIHZhbHVlczogKi8KKwkvKiBXaGV0aGVyIGxvZyBhZGRyZXNzIGlzIHZhbGlkLiBJZiBzZXQgZW5hYmxlcyBsb2dnaW5nLiAqLworI2RlZmluZSBWSE9TVF9WUklOR19GX0xPRyAwCisKKwkvKiBTdGFydCBvZiBhcnJheSBvZiBkZXNjcmlwdG9ycyAodmlydHVhbGx5IGNvbnRpZ3VvdXMpICovCisJX191NjQgZGVzY191c2VyX2FkZHI7CisJLyogVXNlZCBzdHJ1Y3R1cmUgYWRkcmVzcy4gTXVzdCBiZSAzMiBiaXQgYWxpZ25lZCAqLworCV9fdTY0IHVzZWRfdXNlcl9hZGRyOworCS8qIEF2YWlsYWJsZSBzdHJ1Y3R1cmUgYWRkcmVzcy4gTXVzdCBiZSAxNiBiaXQgYWxpZ25lZCAqLworCV9fdTY0IGF2YWlsX3VzZXJfYWRkcjsKKwkvKiBMb2dnaW5nIHN1cHBvcnQuICovCisJLyogTG9nIHdyaXRlcyB0byB1c2VkIHN0cnVjdHVyZSwgYXQgb2Zmc2V0IGNhbGN1bGF0ZWQgZnJvbSBzcGVjaWZpZWQKKwkgKiBhZGRyZXNzLiBBZGRyZXNzIG11c3QgYmUgMzIgYml0IGFsaWduZWQuICovCisJX191NjQgbG9nX2d1ZXN0X2FkZHI7Cit9OworCitzdHJ1Y3Qgdmhvc3RfbWVtb3J5X3JlZ2lvbiB7CisJX191NjQgZ3Vlc3RfcGh5c19hZGRyOworCV9fdTY0IG1lbW9yeV9zaXplOyAvKiBieXRlcyAqLworCV9fdTY0IHVzZXJzcGFjZV9hZGRyOworCV9fdTY0IGZsYWdzX3BhZGRpbmc7IC8qIE5vIGZsYWdzIGFyZSBjdXJyZW50bHkgc3BlY2lmaWVkLiAqLworfTsKKworLyogQWxsIHJlZ2lvbiBhZGRyZXNzZXMgYW5kIHNpemVzIG11c3QgYmUgNEsgYWxpZ25lZC4gKi8KKyNkZWZpbmUgVkhPU1RfUEFHRV9TSVpFIDB4MTAwMAorCitzdHJ1Y3Qgdmhvc3RfbWVtb3J5IHsKKwlfX3UzMiBucmVnaW9uczsKKwlfX3UzMiBwYWRkaW5nOworCXN0cnVjdCB2aG9zdF9tZW1vcnlfcmVnaW9uIHJlZ2lvbnNbMF07Cit9OworCisvKiBpb2N0bHMgKi8KKworI2RlZmluZSBWSE9TVF9WSVJUSU8gMHhBRgorCisvKiBGZWF0dXJlcyBiaXRtYXNrIGZvciBmb3J3YXJkIGNvbXBhdGliaWxpdHkuICBUcmFuc3BvcnQgYml0cyBhcmUgdXNlZCBmb3IKKyAqIHZob3N0IHNwZWNpZmljIGZlYXR1cmVzLiAqLworI2RlZmluZSBWSE9TVF9HRVRfRkVBVFVSRVMJX0lPUihWSE9TVF9WSVJUSU8sIDB4MDAsIF9fdTY0KQorI2RlZmluZSBWSE9TVF9TRVRfRkVBVFVSRVMJX0lPVyhWSE9TVF9WSVJUSU8sIDB4MDAsIF9fdTY0KQorCisvKiBTZXQgY3VycmVudCBwcm9jZXNzIGFzIHRoZSAoZXhjbHVzaXZlKSBvd25lciBvZiB0aGlzIGZpbGUgZGVzY3JpcHRvci4gIFRoaXMKKyAqIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgdmhvc3QgY29tbWFuZC4gIEZ1cnRoZXIgY2FsbHMgdG8KKyAqIFZIT1NUX09XTkVSX1NFVCBmYWlsIHVudGlsIFZIT1NUX09XTkVSX1JFU0VUIGlzIGNhbGxlZC4gKi8KKyNkZWZpbmUgVkhPU1RfU0VUX09XTkVSIF9JTyhWSE9TVF9WSVJUSU8sIDB4MDEpCisvKiBHaXZlIHVwIG93bmVyc2hpcCwgYW5kIHJlc2V0IHRoZSBkZXZpY2UgdG8gZGVmYXVsdCB2YWx1ZXMuCisgKiBBbGxvd3Mgc3Vic2VxdWVudCBjYWxsIHRvIFZIT1NUX09XTkVSX1NFVCB0byBzdWNjZWVkLiAqLworI2RlZmluZSBWSE9TVF9SRVNFVF9PV05FUiBfSU8oVkhPU1RfVklSVElPLCAweDAyKQorCisvKiBTZXQgdXAvbW9kaWZ5IG1lbW9yeSBsYXlvdXQgKi8KKyNkZWZpbmUgVkhPU1RfU0VUX01FTV9UQUJMRQlfSU9XKFZIT1NUX1ZJUlRJTywgMHgwMywgc3RydWN0IHZob3N0X21lbW9yeSkKKworLyogV3JpdGUgbG9nZ2luZyBzZXR1cC4gKi8KKy8qIE1lbW9yeSB3cml0ZXMgY2FuIG9wdGlvbmFsbHkgYmUgbG9nZ2VkIGJ5IHNldHRpbmcgYml0IGF0IGFuIG9mZnNldAorICogKGNhbGN1bGF0ZWQgZnJvbSB0aGUgcGh5c2ljYWwgYWRkcmVzcykgZnJvbSBzcGVjaWZpZWQgbG9nIGJhc2UuCisgKiBUaGUgYml0IGlzIHNldCB1c2luZyBhbiBhdG9taWMgMzIgYml0IG9wZXJhdGlvbi4gKi8KKy8qIFNldCBiYXNlIGFkZHJlc3MgZm9yIGxvZ2dpbmcuICovCisjZGVmaW5lIFZIT1NUX1NFVF9MT0dfQkFTRSBfSU9XKFZIT1NUX1ZJUlRJTywgMHgwNCwgX191NjQpCisvKiBTcGVjaWZ5IGFuIGV2ZW50ZmQgZmlsZSBkZXNjcmlwdG9yIHRvIHNpZ25hbCBvbiBsb2cgd3JpdGUuICovCisjZGVmaW5lIFZIT1NUX1NFVF9MT0dfRkQgX0lPVyhWSE9TVF9WSVJUSU8sIDB4MDcsIGludCkKKworLyogUmluZyBzZXR1cC4gKi8KKy8qIFNldCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gcmluZy4gVGhpcyBwYXJhbWV0ZXIgY2FuIG5vdAorICogYmUgbW9kaWZpZWQgd2hpbGUgcmluZyBpcyBydW5uaW5nIChib3VuZCB0byBhIGRldmljZSkuICovCisjZGVmaW5lIFZIT1NUX1NFVF9WUklOR19OVU0gX0lPVyhWSE9TVF9WSVJUSU8sIDB4MTAsIHN0cnVjdCB2aG9zdF92cmluZ19zdGF0ZSkKKy8qIFNldCBhZGRyZXNzZXMgZm9yIHRoZSByaW5nLiAqLworI2RlZmluZSBWSE9TVF9TRVRfVlJJTkdfQUREUiBfSU9XKFZIT1NUX1ZJUlRJTywgMHgxMSwgc3RydWN0IHZob3N0X3ZyaW5nX2FkZHIpCisvKiBCYXNlIHZhbHVlIHdoZXJlIHF1ZXVlIGxvb2tzIGZvciBhdmFpbGFibGUgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgVkhPU1RfU0VUX1ZSSU5HX0JBU0UgX0lPVyhWSE9TVF9WSVJUSU8sIDB4MTIsIHN0cnVjdCB2aG9zdF92cmluZ19zdGF0ZSkKKy8qIEdldCBhY2Nlc3NvcjogcmVhZHMgaW5kZXgsIHdyaXRlcyB2YWx1ZSBpbiBudW0gKi8KKyNkZWZpbmUgVkhPU1RfR0VUX1ZSSU5HX0JBU0UgX0lPV1IoVkhPU1RfVklSVElPLCAweDEyLCBzdHJ1Y3Qgdmhvc3RfdnJpbmdfc3RhdGUpCisKKy8qIFRoZSBmb2xsb3dpbmcgaW9jdGxzIHVzZSBldmVudGZkIGZpbGUgZGVzY3JpcHRvcnMgdG8gc2lnbmFsIGFuZCBwb2xsCisgKiBmb3IgZXZlbnRzLiAqLworCisvKiBTZXQgZXZlbnRmZCB0byBwb2xsIGZvciBhZGRlZCBidWZmZXJzICovCisjZGVmaW5lIFZIT1NUX1NFVF9WUklOR19LSUNLIF9JT1coVkhPU1RfVklSVElPLCAweDIwLCBzdHJ1Y3Qgdmhvc3RfdnJpbmdfZmlsZSkKKy8qIFNldCBldmVudGZkIHRvIHNpZ25hbCB3aGVuIGJ1ZmZlcnMgaGF2ZSBiZWVkIHVzZWQgKi8KKyNkZWZpbmUgVkhPU1RfU0VUX1ZSSU5HX0NBTEwgX0lPVyhWSE9TVF9WSVJUSU8sIDB4MjEsIHN0cnVjdCB2aG9zdF92cmluZ19maWxlKQorLyogU2V0IGV2ZW50ZmQgdG8gc2lnbmFsIGFuIGVycm9yICovCisjZGVmaW5lIFZIT1NUX1NFVF9WUklOR19FUlIgX0lPVyhWSE9TVF9WSVJUSU8sIDB4MjIsIHN0cnVjdCB2aG9zdF92cmluZ19maWxlKQorCisvKiBWSE9TVF9ORVQgc3BlY2lmaWMgZGVmaW5lcyAqLworCisvKiBBdHRhY2ggdmlydGlvIG5ldCByaW5nIHRvIGEgcmF3IHNvY2tldCwgb3IgdGFwIGRldmljZS4KKyAqIFRoZSBzb2NrZXQgbXVzdCBiZSBhbHJlYWR5IGJvdW5kIHRvIGFuIGV0aGVybmV0IGRldmljZSwgdGhpcyBkZXZpY2Ugd2lsbCBiZQorICogdXNlZCBmb3IgdHJhbnNtaXQuICBQYXNzIGZkIC0xIHRvIHVuYmluZCBmcm9tIHRoZSBzb2NrZXQgYW5kIHRoZSB0cmFuc21pdAorICogZGV2aWNlLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBzdG9wIHRoZSByaW5nIChlLmcuIGZvciBtaWdyYXRpb24pLiAqLworI2RlZmluZSBWSE9TVF9ORVRfU0VUX0JBQ0tFTkQgX0lPVyhWSE9TVF9WSVJUSU8sIDB4MzAsIHN0cnVjdCB2aG9zdF92cmluZ19maWxlKQorCisvKiBGZWF0dXJlIGJpdHMgKi8KKy8qIExvZyBhbGwgd3JpdGUgZGVzY3JpcHRvcnMuIENhbiBiZSBjaGFuZ2VkIHdoaWxlIGRldmljZSBpcyBhY3RpdmUuICovCisjZGVmaW5lIFZIT1NUX0ZfTE9HX0FMTCAyNgorLyogdmhvc3QtbmV0IHNob3VsZCBhZGQgdmlydGlvX25ldF9oZHIgZm9yIFJYLCBhbmQgc3RyaXAgZm9yIFRYIHBhY2tldHMuICovCisjZGVmaW5lIFZIT1NUX05FVF9GX1ZJUlRJT19ORVRfSERSIDI3CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzOWFiZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKQEAgLTAsMCArMSwyMjU4IEBACisvKgorICogIFZpZGVvIGZvciBMaW51eCBUd28gaGVhZGVyIGZpbGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgdGhlIGNvbnRyaWJ1dG9ycworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gcmVkaXN0cmlidXRlIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiAgQlNEIGxpY2Vuc2UgYXMgc3RhdGVkIGJlbG93OgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiAgICAgcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqICBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqICBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiAgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoJSGVhZGVyIGZpbGUgZm9yIHY0bCBvciBWNEwyIGRyaXZlcnMgYW5kIGFwcGxpY2F0aW9ucworICogd2l0aCBwdWJsaWMgQVBJLgorICogQWxsIGtlcm5lbC1zcGVjaWZpYyBzdHVmZiB3ZXJlIG1vdmVkIHRvIG1lZGlhL3Y0bDItZGV2LmgsIHNvCisgKiBubyAjaWYgX19LRVJORUwgdGVzdHMgYXJlIGFsbG93ZWQgaGVyZQorICoKKyAqCVNlZSBodHRwOi8vbGludXh0di5vcmcgZm9yIG1vcmUgaW5mbworICoKKyAqCUF1dGhvcjogQmlsbCBEaXJrcyA8YmlsbEB0aGVkaXJrcy5vcmc+CisgKgkJSnVzdGluIFNjaG9lbWFuCisgKiAgICAgICAgICAgICAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKgkJZXQgYWwuCisgKi8KKyNpZm5kZWYgX19MSU5VWF9WSURFT0RFVjJfSAorI2RlZmluZSBfX0xJTlVYX1ZJREVPREVWMl9ICisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogQ29tbW9uIHN0dWZmIGZvciBib3RoIFY0TDEgYW5kIFY0TDIKKyAqIE1vdmVkIGZyb20gdmlkZW9kZXYuaAorICovCisjZGVmaW5lIFZJREVPX01BWF9GUkFNRSAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFZJREVPX01BWF9QTEFORVMgICAgICAgICAgICAgICA4CisKKworLyogVGhlc2UgZGVmaW5lcyBhcmUgVjRMMSBzcGVjaWZpYyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggdGhlIFY0TDIgQVBJIQorICAgVGhleSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGlzIGhlYWRlciBpbiB0aGUgZnV0dXJlLiAqLworCisjZGVmaW5lIFZJRF9UWVBFX0NBUFRVUkUJMQkvKiBDYW4gY2FwdHVyZSAqLworI2RlZmluZSBWSURfVFlQRV9UVU5FUgkJMgkvKiBDYW4gdHVuZSAqLworI2RlZmluZSBWSURfVFlQRV9URUxFVEVYVAk0CS8qIERvZXMgdGVsZXRleHQgKi8KKyNkZWZpbmUgVklEX1RZUEVfT1ZFUkxBWQk4CS8qIE92ZXJsYXkgb250byBmcmFtZSBidWZmZXIgKi8KKyNkZWZpbmUgVklEX1RZUEVfQ0hST01BS0VZCTE2CS8qIE92ZXJsYXkgYnkgY2hyb21ha2V5ICovCisjZGVmaW5lIFZJRF9UWVBFX0NMSVBQSU5HCTMyCS8qIENhbiBjbGlwICovCisjZGVmaW5lIFZJRF9UWVBFX0ZSQU1FUkFNCTY0CS8qIFVzZXMgdGhlIGZyYW1lIGJ1ZmZlciBtZW1vcnkgKi8KKyNkZWZpbmUgVklEX1RZUEVfU0NBTEVTCQkxMjgJLyogU2NhbGFibGUgKi8KKyNkZWZpbmUgVklEX1RZUEVfTU9OT0NIUk9NRQkyNTYJLyogTW9ub2Nocm9tZSBvbmx5ICovCisjZGVmaW5lIFZJRF9UWVBFX1NVQkNBUFRVUkUJNTEyCS8qIENhbiBjYXB0dXJlIHN1YmFyZWFzIG9mIHRoZSBpbWFnZSAqLworI2RlZmluZSBWSURfVFlQRV9NUEVHX0RFQ09ERVIJMTAyNAkvKiBDYW4gZGVjb2RlIE1QRUcgc3RyZWFtcyAqLworI2RlZmluZSBWSURfVFlQRV9NUEVHX0VOQ09ERVIJMjA0OAkvKiBDYW4gZW5jb2RlIE1QRUcgc3RyZWFtcyAqLworI2RlZmluZSBWSURfVFlQRV9NSlBFR19ERUNPREVSCTQwOTYJLyogQ2FuIGRlY29kZSBNSlBFRyBzdHJlYW1zICovCisjZGVmaW5lIFZJRF9UWVBFX01KUEVHX0VOQ09ERVIJODE5MgkvKiBDYW4gZW5jb2RlIE1KUEVHIHN0cmVhbXMgKi8KKworLyoKKyAqCU0gSSBTIEMgRSBMIEwgQSBOIEUgTyBVIFMKKyAqLworCisvKiAgRm91ci1jaGFyYWN0ZXItY29kZSAoRk9VUkNDKSAqLworI2RlZmluZSB2NGwyX2ZvdXJjYyhhLCBiLCBjLCBkKVwKKwkoKF9fdTMyKShhKSB8ICgoX191MzIpKGIpIDw8IDgpIHwgKChfX3UzMikoYykgPDwgMTYpIHwgKChfX3UzMikoZCkgPDwgMjQpKQorCisvKgorICoJRSBOIFUgTSBTCisgKi8KK2VudW0gdjRsMl9maWVsZCB7CisJVjRMMl9GSUVMRF9BTlkgICAgICAgICAgID0gMCwgLyogZHJpdmVyIGNhbiBjaG9vc2UgZnJvbSBub25lLAorCQkJCQkgdG9wLCBib3R0b20sIGludGVybGFjZWQKKwkJCQkJIGRlcGVuZGluZyBvbiB3aGF0ZXZlciBpdCB0aGlua3MKKwkJCQkJIGlzIGFwcHJveGltYXRlIC4uLiAqLworCVY0TDJfRklFTERfTk9ORSAgICAgICAgICA9IDEsIC8qIHRoaXMgZGV2aWNlIGhhcyBubyBmaWVsZHMgLi4uICovCisJVjRMMl9GSUVMRF9UT1AgICAgICAgICAgID0gMiwgLyogdG9wIGZpZWxkIG9ubHkgKi8KKwlWNEwyX0ZJRUxEX0JPVFRPTSAgICAgICAgPSAzLCAvKiBib3R0b20gZmllbGQgb25seSAqLworCVY0TDJfRklFTERfSU5URVJMQUNFRCAgICA9IDQsIC8qIGJvdGggZmllbGRzIGludGVybGFjZWQgKi8KKwlWNEwyX0ZJRUxEX1NFUV9UQiAgICAgICAgPSA1LCAvKiBib3RoIGZpZWxkcyBzZXF1ZW50aWFsIGludG8gb25lCisJCQkJCSBidWZmZXIsIHRvcC1ib3R0b20gb3JkZXIgKi8KKwlWNEwyX0ZJRUxEX1NFUV9CVCAgICAgICAgPSA2LCAvKiBzYW1lIGFzIGFib3ZlICsgYm90dG9tLXRvcCBvcmRlciAqLworCVY0TDJfRklFTERfQUxURVJOQVRFICAgICA9IDcsIC8qIGJvdGggZmllbGRzIGFsdGVybmF0aW5nIGludG8KKwkJCQkJIHNlcGFyYXRlIGJ1ZmZlcnMgKi8KKwlWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIgPSA4LCAvKiBib3RoIGZpZWxkcyBpbnRlcmxhY2VkLCB0b3AgZmllbGQKKwkJCQkJIGZpcnN0IGFuZCB0aGUgdG9wIGZpZWxkIGlzCisJCQkJCSB0cmFuc21pdHRlZCBmaXJzdCAqLworCVY0TDJfRklFTERfSU5URVJMQUNFRF9CVCA9IDksIC8qIGJvdGggZmllbGRzIGludGVybGFjZWQsIHRvcCBmaWVsZAorCQkJCQkgZmlyc3QgYW5kIHRoZSBib3R0b20gZmllbGQgaXMKKwkJCQkJIHRyYW5zbWl0dGVkIGZpcnN0ICovCit9OworI2RlZmluZSBWNEwyX0ZJRUxEX0hBU19UT1AoZmllbGQpCVwKKwkoKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1RPUCAJfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9UQiB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfVEIJfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfQlQpCisjZGVmaW5lIFY0TDJfRklFTERfSEFTX0JPVFRPTShmaWVsZCkJXAorCSgoZmllbGQpID09IFY0TDJfRklFTERfQk9UVE9NIAl8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9CVCB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9UQgl8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9CVCkKKyNkZWZpbmUgVjRMMl9GSUVMRF9IQVNfQk9USChmaWVsZCkJXAorCSgoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRCB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX1RCIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX0JUKQorCitlbnVtIHY0bDJfYnVmX3R5cGUgeworCVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAgICAgICAgPSAxLAorCVY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICAgICAgICAgPSAyLAorCVY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWSAgICAgICAgPSAzLAorCVY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUgICAgICAgICAgPSA0LAorCVY0TDJfQlVGX1RZUEVfVkJJX09VVFBVVCAgICAgICAgICAgPSA1LAorCVY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFICAgPSA2LAorCVY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQgICAgPSA3LAorI2lmIDEKKwkvKiBFeHBlcmltZW50YWwgKi8KKwlWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZID0gOCwKKyNlbmRpZgorCVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUgPSA5LAorCVY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSAgPSAxMCwKKwlWNEwyX0JVRl9UWVBFX1BSSVZBVEUgICAgICAgICAgICAgID0gMHg4MCwKK307CisKKyNkZWZpbmUgVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKHR5cGUpCQkJXAorCSgodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORQlcCisJIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpCisKKyNkZWZpbmUgVjRMMl9UWVBFX0lTX09VVFBVVCh0eXBlKQkJCQlcCisJKCh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVAkJCVwKKwkgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORQkJXAorCSB8fCAodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZCQlcCisJIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZCVwKKwkgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVkJJX09VVFBVVAkJCVwKKwkgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQpCisKK2VudW0gdjRsMl90dW5lcl90eXBlIHsKKwlWNEwyX1RVTkVSX1JBRElPCSAgICAgPSAxLAorCVY0TDJfVFVORVJfQU5BTE9HX1RWCSAgICAgPSAyLAorCVY0TDJfVFVORVJfRElHSVRBTF9UVgkgICAgID0gMywKK307CisKK2VudW0gdjRsMl9tZW1vcnkgeworCVY0TDJfTUVNT1JZX01NQVAgICAgICAgICAgICAgPSAxLAorCVY0TDJfTUVNT1JZX1VTRVJQVFIgICAgICAgICAgPSAyLAorCVY0TDJfTUVNT1JZX09WRVJMQVkgICAgICAgICAgPSAzLAorfTsKKworLyogc2VlIGFsc28gaHR0cDovL3Zla3Rvci50aGVvcmVtLmNhL2dyYXBoaWNzL3ljYmNyLyAqLworZW51bSB2NGwyX2NvbG9yc3BhY2UgeworCS8qIElUVS1SIDYwMSAtLSBicm9hZGNhc3QgTlRTQy9QQUwgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNICAgICA9IDEsCisKKwkvKiAxMTI1LUxpbmUgKFVTKSBIRFRWICovCisJVjRMMl9DT0xPUlNQQUNFX1NNUFRFMjQwTSAgICAgPSAyLAorCisJLyogSEQgYW5kIG1vZGVybiBjYXB0dXJlcy4gKi8KKwlWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5ICAgICAgICA9IDMsCisKKwkvKiBicm9rZW4gQlQ4NzggZXh0ZW50cyAoNjAxLCBsdW1hIHJhbmdlIDE2LTI1MyBpbnN0ZWFkIG9mIDE2LTIzNSkgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfQlQ4NzggICAgICAgICA9IDQsCisKKwkvKiBUaGVzZSBzaG91bGQgYmUgdXNlZnVsLiAgQXNzdW1lIDYwMSBleHRlbnRzLiAqLworCVY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX00gID0gNSwKKwlWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRyA9IDYsCisKKwkvKiBJIGtub3cgdGhlcmUgd2lsbCBiZSBjYW1lcmFzIHRoYXQgc2VuZCB0aGlzLiAgU28sIHRoaXMgaXMKKwkgKiB1bnNwZWNpZmllZCBjaHJvbWF0aWNpdGllcyBhbmQgZnVsbCAwLTI1NSBvbiBlYWNoIG9mIHRoZQorCSAqIFknQ2JDciBjb21wb25lbnRzCisJICovCisJVjRMMl9DT0xPUlNQQUNFX0pQRUcgICAgICAgICAgPSA3LAorCisJLyogRm9yIFJHQiBjb2xvdXJzcGFjZXMsIHRoaXMgaXMgcHJvYmFibHkgYSBnb29kIHN0YXJ0LiAqLworCVY0TDJfQ09MT1JTUEFDRV9TUkdCICAgICAgICAgID0gOCwKK307CisKK2VudW0gdjRsMl9wcmlvcml0eSB7CisJVjRMMl9QUklPUklUWV9VTlNFVCAgICAgICA9IDAsICAvKiBub3QgaW5pdGlhbGl6ZWQgKi8KKwlWNEwyX1BSSU9SSVRZX0JBQ0tHUk9VTkQgID0gMSwKKwlWNEwyX1BSSU9SSVRZX0lOVEVSQUNUSVZFID0gMiwKKwlWNEwyX1BSSU9SSVRZX1JFQ09SRCAgICAgID0gMywKKwlWNEwyX1BSSU9SSVRZX0RFRkFVTFQgICAgID0gVjRMMl9QUklPUklUWV9JTlRFUkFDVElWRSwKK307CisKK3N0cnVjdCB2NGwyX3JlY3QgeworCV9fczMyICAgbGVmdDsKKwlfX3MzMiAgIHRvcDsKKwlfX3MzMiAgIHdpZHRoOworCV9fczMyICAgaGVpZ2h0OworfTsKKworc3RydWN0IHY0bDJfZnJhY3QgeworCV9fdTMyICAgbnVtZXJhdG9yOworCV9fdTMyICAgZGVub21pbmF0b3I7Cit9OworCisvKgorICoJRCBSIEkgViBFIFIgICBDIEEgUCBBIEIgSSBMIEkgVCBJIEUgUworICovCitzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IHsKKwlfX3U4CWRyaXZlclsxNl07CS8qIGkuZS4gImJ0dHYiICovCisJX191OAljYXJkWzMyXTsJLyogaS5lLiAiSGF1cHBhdWdlIFdpblRWIiAqLworCV9fdTgJYnVzX2luZm9bMzJdOwkvKiAiUENJOiIgKyBwY2lfbmFtZShwY2lfZGV2KSAqLworCV9fdTMyICAgdmVyc2lvbjsgICAgICAgIC8qIHNob3VsZCB1c2UgS0VSTkVMX1ZFUlNJT04oKSAqLworCV9fdTMyCWNhcGFiaWxpdGllczsJLyogRGV2aWNlIGNhcGFiaWxpdGllcyAqLworCV9fdTMyCXJlc2VydmVkWzRdOworfTsKKworLyogVmFsdWVzIGZvciAnY2FwYWJpbGl0aWVzJyBmaWVsZCAqLworI2RlZmluZSBWNEwyX0NBUF9WSURFT19DQVBUVVJFCQkweDAwMDAwMDAxICAvKiBJcyBhIHZpZGVvIGNhcHR1cmUgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX09VVFBVVAkJMHgwMDAwMDAwMiAgLyogSXMgYSB2aWRlbyBvdXRwdXQgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX09WRVJMQVkJCTB4MDAwMDAwMDQgIC8qIENhbiBkbyB2aWRlbyBvdmVybGF5ICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZCSV9DQVBUVVJFCQkweDAwMDAwMDEwICAvKiBJcyBhIHJhdyBWQkkgY2FwdHVyZSBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVkJJX09VVFBVVAkJMHgwMDAwMDAyMCAgLyogSXMgYSByYXcgVkJJIG91dHB1dCBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfU0xJQ0VEX1ZCSV9DQVBUVVJFCTB4MDAwMDAwNDAgIC8qIElzIGEgc2xpY2VkIFZCSSBjYXB0dXJlIGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9TTElDRURfVkJJX09VVFBVVAkweDAwMDAwMDgwICAvKiBJcyBhIHNsaWNlZCBWQkkgb3V0cHV0IGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9SRFNfQ0FQVFVSRQkJMHgwMDAwMDEwMCAgLyogUkRTIGRhdGEgY2FwdHVyZSAqLworI2RlZmluZSBWNEwyX0NBUF9WSURFT19PVVRQVVRfT1ZFUkxBWQkweDAwMDAwMjAwICAvKiBDYW4gZG8gdmlkZW8gb3V0cHV0IG92ZXJsYXkgKi8KKyNkZWZpbmUgVjRMMl9DQVBfSFdfRlJFUV9TRUVLCQkweDAwMDAwNDAwICAvKiBDYW4gZG8gaGFyZHdhcmUgZnJlcXVlbmN5IHNlZWsgICovCisjZGVmaW5lIFY0TDJfQ0FQX1JEU19PVVRQVVQJCTB4MDAwMDA4MDAgIC8qIElzIGFuIFJEUyBlbmNvZGVyICovCisKKy8qIElzIGEgdmlkZW8gY2FwdHVyZSBkZXZpY2UgdGhhdCBzdXBwb3J0cyBtdWx0aXBsYW5hciBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkVfTVBMQU5FCTB4MDAwMDEwMDAKKy8qIElzIGEgdmlkZW8gb3V0cHV0IGRldmljZSB0aGF0IHN1cHBvcnRzIG11bHRpcGxhbmFyIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fT1VUUFVUX01QTEFORQkweDAwMDAyMDAwCisKKyNkZWZpbmUgVjRMMl9DQVBfVFVORVIJCQkweDAwMDEwMDAwICAvKiBoYXMgYSB0dW5lciAqLworI2RlZmluZSBWNEwyX0NBUF9BVURJTwkJCTB4MDAwMjAwMDAgIC8qIGhhcyBhdWRpbyBzdXBwb3J0ICovCisjZGVmaW5lIFY0TDJfQ0FQX1JBRElPCQkJMHgwMDA0MDAwMCAgLyogaXMgYSByYWRpbyBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfTU9EVUxBVE9SCQkweDAwMDgwMDAwICAvKiBoYXMgYSBtb2R1bGF0b3IgKi8KKworI2RlZmluZSBWNEwyX0NBUF9SRUFEV1JJVEUgICAgICAgICAgICAgIDB4MDEwMDAwMDAgIC8qIHJlYWQvd3JpdGUgc3lzdGVtY2FsbHMgKi8KKyNkZWZpbmUgVjRMMl9DQVBfQVNZTkNJTyAgICAgICAgICAgICAgICAweDAyMDAwMDAwICAvKiBhc3luYyBJL08gKi8KKyNkZWZpbmUgVjRMMl9DQVBfU1RSRUFNSU5HICAgICAgICAgICAgICAweDA0MDAwMDAwICAvKiBzdHJlYW1pbmcgSS9PIGlvY3RscyAqLworCisvKgorICoJViBJIEQgRSBPICAgSSBNIEEgRyBFICAgRiBPIFIgTSBBIFQKKyAqLworc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB7CisJX191MzIgICAgICAgICAJCXdpZHRoOworCV9fdTMyCQkJaGVpZ2h0OworCV9fdTMyCQkJcGl4ZWxmb3JtYXQ7CisJZW51bSB2NGwyX2ZpZWxkICAJZmllbGQ7CisJX191MzIgICAgICAgICAgICAJYnl0ZXNwZXJsaW5lOwkvKiBmb3IgcGFkZGluZywgemVybyBpZiB1bnVzZWQgKi8KKwlfX3UzMiAgICAgICAgICAJCXNpemVpbWFnZTsKKwllbnVtIHY0bDJfY29sb3JzcGFjZQljb2xvcnNwYWNlOworCV9fdTMyCQkJcHJpdjsJCS8qIHByaXZhdGUgZGF0YSwgZGVwZW5kcyBvbiBwaXhlbGZvcm1hdCAqLworfTsKKworLyogICAgICBQaXhlbCBmb3JtYXQgICAgICAgICBGT1VSQ0MgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoICBEZXNjcmlwdGlvbiAgKi8KKworLyogUkdCIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjMzMiAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJzEnKSAvKiAgOCAgUkdCLTMtMy0yICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCNDQ0ICB2NGwyX2ZvdXJjYygnUicsICc0JywgJzQnLCAnNCcpIC8qIDE2ICB4eHh4cnJyciBnZ2dnYmJiYiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCNTU1ICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnTycpIC8qIDE2ICBSR0ItNS01LTUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I1NjUgIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICdQJykgLyogMTYgIFJHQi01LTYtNSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjU1NVggdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJ1EnKSAvKiAxNiAgUkdCLTUtNS01IEJFICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCNTY1WCB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnUicpIC8qIDE2ICBSR0ItNS02LTUgQkUgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9CR1I2NjYgIHY0bDJfZm91cmNjKCdCJywgJ0cnLCAnUicsICdIJykgLyogMTggIEJHUi02LTYtNgkgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9CR1IyNCAgIHY0bDJfZm91cmNjKCdCJywgJ0cnLCAnUicsICczJykgLyogMjQgIEJHUi04LTgtOCAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjI0ICAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJzMnKSAvKiAyNCAgUkdCLTgtOC04ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfQkdSMzIgICB2NGwyX2ZvdXJjYygnQicsICdHJywgJ1InLCAnNCcpIC8qIDMyICBCR1ItOC04LTgtOCAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0IzMiAgIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICc0JykgLyogMzIgIFJHQi04LTgtOC04ICAgKi8KKworLyogR3JleSBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9HUkVZICAgIHY0bDJfZm91cmNjKCdHJywgJ1InLCAnRScsICdZJykgLyogIDggIEdyZXlzY2FsZSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1k0ICAgICAgdjRsMl9mb3VyY2MoJ1knLCAnMCcsICc0JywgJyAnKSAvKiAgNCAgR3JleXNjYWxlICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTYgICAgICB2NGwyX2ZvdXJjYygnWScsICcwJywgJzYnLCAnICcpIC8qICA2ICBHcmV5c2NhbGUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZMTAgICAgIHY0bDJfZm91cmNjKCdZJywgJzEnLCAnMCcsICcgJykgLyogMTAgIEdyZXlzY2FsZSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1kxMiAgICAgdjRsMl9mb3VyY2MoJ1knLCAnMScsICcyJywgJyAnKSAvKiAxMiAgR3JleXNjYWxlICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTE2ICAgICB2NGwyX2ZvdXJjYygnWScsICcxJywgJzYnLCAnICcpIC8qIDE2ICBHcmV5c2NhbGUgICAgICovCisKKy8qIEdyZXkgYml0LXBhY2tlZCBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZMTBCUEFDSyAgICB2NGwyX2ZvdXJjYygnWScsICcxJywgJzAnLCAnQicpIC8qIDEwICBHcmV5c2NhbGUgYml0LXBhY2tlZCAqLworCisvKiBQYWxldHRlIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1BBTDggICAgdjRsMl9mb3VyY2MoJ1AnLCAnQScsICdMJywgJzgnKSAvKiAgOCAgOC1iaXQgcGFsZXR0ZSAqLworCisvKiBMdW1pbmFuY2UrQ2hyb21pbmFuY2UgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVZVNDEwICB2NGwyX2ZvdXJjYygnWScsICdWJywgJ1UnLCAnOScpIC8qICA5ICBZVlUgNDoxOjAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVlU0MjAgIHY0bDJfZm91cmNjKCdZJywgJ1YnLCAnMScsICcyJykgLyogMTIgIFlWVSA0OjI6MCAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVWVYgICAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICdZJywgJ1YnKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVlVViAgICB2NGwyX2ZvdXJjYygnWScsICdZJywgJ1UnLCAnVicpIC8qIDE2ICBZVVYgNDoyOjIgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVllVICAgIHY0bDJfZm91cmNjKCdZJywgJ1YnLCAnWScsICdVJykgLyogMTYgWVZVIDQ6MjoyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9VWVZZICAgIHY0bDJfZm91cmNjKCdVJywgJ1knLCAnVicsICdZJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZZVVkgICAgdjRsMl9mb3VyY2MoJ1YnLCAnWScsICdVJywgJ1knKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDIyUCB2NGwyX2ZvdXJjYygnNCcsICcyJywgJzInLCAnUCcpIC8qIDE2ICBZVlU0MjIgcGxhbmFyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY0MTFQIHY0bDJfZm91cmNjKCc0JywgJzEnLCAnMScsICdQJykgLyogMTYgIFlWVTQxMSBwbGFuYXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1k0MVAgICAgdjRsMl9mb3VyY2MoJ1knLCAnNCcsICcxJywgJ1AnKSAvKiAxMiAgWVVWIDQ6MToxICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDQ0ICB2NGwyX2ZvdXJjYygnWScsICc0JywgJzQnLCAnNCcpIC8qIDE2ICB4eHh4eXl5eSB1dXV1dnZ2diAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNTU1ICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1YnLCAnTycpIC8qIDE2ICBZVVYtNS01LTUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY1NjUgIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnVicsICdQJykgLyogMTYgIFlVVi01LTYtNSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjMyICAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICdWJywgJzQnKSAvKiAzMiAgWVVWLTgtOC04LTggICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDEwICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1YnLCAnOScpIC8qICA5ICBZVVYgNDoxOjAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY0MjAgIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnMScsICcyJykgLyogMTIgIFlVViA0OjI6MCAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0hJMjQwICAgdjRsMl9mb3VyY2MoJ0gnLCAnSScsICcyJywgJzQnKSAvKiAgOCAgOC1iaXQgY29sb3IgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSE0xMiAgICB2NGwyX2ZvdXJjYygnSCcsICdNJywgJzEnLCAnMicpIC8qICA4ICBZVVYgNDoyOjAgMTZ4MTYgbWFjcm9ibG9ja3MgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX000MjAgICAgdjRsMl9mb3VyY2MoJ00nLCAnNCcsICcyJywgJzAnKSAvKiAxMiAgWVVWIDQ6MjowIDIgbGluZXMgeSwgMSBsaW5lIHV2IGludGVybGVhdmVkICovCisKKy8qIHR3byBwbGFuZXMgLS0gb25lIFksIG9uZSBDciArIENiIGludGVybGVhdmVkICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxMiAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzEnLCAnMicpIC8qIDEyICBZL0NiQ3IgNDoyOjAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjIxICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnMicsICcxJykgLyogMTIgIFkvQ3JDYiA0OjI6MCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTYgICAgdjRsMl9mb3VyY2MoJ04nLCAnVicsICcxJywgJzYnKSAvKiAxNiAgWS9DYkNyIDQ6MjoyICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlY2MSAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzYnLCAnMScpIC8qIDE2ICBZL0NyQ2IgNDoyOjIgICovCisKKy8qIHR3byBub24gY29udGlndW91cyBwbGFuZXMgLSBvbmUgWSwgb25lIENyICsgQ2IgaW50ZXJsZWF2ZWQgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjEyTSAgIHY0bDJfZm91cmNjKCdOJywgJ00nLCAnMScsICcyJykgLyogMTIgIFkvQ2JDciA0OjI6MCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTJNVCAgdjRsMl9mb3VyY2MoJ1QnLCAnTScsICcxJywgJzInKSAvKiAxMiAgWS9DYkNyIDQ6MjowIDY0eDMyIG1hY3JvYmxvY2tzICovCisKKy8qIHRocmVlIG5vbiBjb250aWd1b3VzIHBsYW5lcyAtIFksIENiLCBDciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDIwTSB2NGwyX2ZvdXJjYygnWScsICdNJywgJzEnLCAnMicpIC8qIDEyICBZVVY0MjAgcGxhbmFyICovCisKKy8qIEJheWVyIGZvcm1hdHMgLSBzZWUgaHR0cDovL3d3dy5zaWxpY29uaW1hZ2luZy5jb20vUkdCJTIwQmF5ZXIuaHRtICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TQkdHUjggIHY0bDJfZm91cmNjKCdCJywgJ0EnLCAnOCcsICcxJykgLyogIDggIEJHQkcuLiBHUkdSLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHQlJHOCAgdjRsMl9mb3VyY2MoJ0cnLCAnQicsICdSJywgJ0cnKSAvKiAgOCAgR0JHQi4uIFJHUkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dSQkc4ICB2NGwyX2ZvdXJjYygnRycsICdSJywgJ0InLCAnRycpIC8qICA4ICBHUkdSLi4gQkdCRy4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUkdHQjggIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnRycsICdCJykgLyogIDggIFJHUkcuLiBHQkdCLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSMTAgdjRsMl9mb3VyY2MoJ0InLCAnRycsICcxJywgJzAnKSAvKiAxMCAgQkdCRy4uIEdSR1IuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dCUkcxMCB2NGwyX2ZvdXJjYygnRycsICdCJywgJzEnLCAnMCcpIC8qIDEwICBHQkdCLi4gUkdSRy4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR1JCRzEwIHY0bDJfZm91cmNjKCdCJywgJ0EnLCAnMScsICcwJykgLyogMTAgIEdSR1IuLiBCR0JHLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NSR0dCMTAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICcxJywgJzAnKSAvKiAxMCAgUkdSRy4uIEdCR0IuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0JHR1IxMiB2NGwyX2ZvdXJjYygnQicsICdHJywgJzEnLCAnMicpIC8qIDEyICBCR0JHLi4gR1JHUi4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR0JSRzEyIHY0bDJfZm91cmNjKCdHJywgJ0InLCAnMScsICcyJykgLyogMTIgIEdCR0IuLiBSR1JHLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHUkJHMTIgdjRsMl9mb3VyY2MoJ0InLCAnQScsICcxJywgJzInKSAvKiAxMiAgR1JHUi4uIEJHQkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1JHR0IxMiB2NGwyX2ZvdXJjYygnUicsICdHJywgJzEnLCAnMicpIC8qIDEyICBSR1JHLi4gR0JHQi4uICovCisJLyogMTBiaXQgcmF3IGJheWVyIERQQ00gY29tcHJlc3NlZCB0byA4IGJpdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHUkJHMTBEUENNOCB2NGwyX2ZvdXJjYygnQicsICdEJywgJzEnLCAnMCcpCisJLyoKKwkgKiAxMGJpdCByYXcgYmF5ZXIsIGV4cGFuZGVkIHRvIDE2IGJpdHMKKwkgKiB4eHh4cnJycnJycnJycnh4eHhnZ2dnZ2dnZ2dnIHh4eHhnZ2dnZ2dnZ2dneHh4eGJiYmJiYmJiYmIuLi4KKwkgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSMTYgdjRsMl9mb3VyY2MoJ0InLCAnWScsICdSJywgJzInKSAvKiAxNiAgQkdCRy4uIEdSR1IuLiAqLworCisvKiBjb21wcmVzc2VkIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01KUEVHICAgIHY0bDJfZm91cmNjKCdNJywgJ0onLCAnUCcsICdHJykgLyogTW90aW9uLUpQRUcgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSlBFRyAgICAgdjRsMl9mb3VyY2MoJ0onLCAnUCcsICdFJywgJ0cnKSAvKiBKRklGIEpQRUcgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9EViAgICAgICB2NGwyX2ZvdXJjYygnZCcsICd2JywgJ3MnLCAnZCcpIC8qIDEzOTQgICAgICAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01QRUcgICAgIHY0bDJfZm91cmNjKCdNJywgJ1AnLCAnRScsICdHJykgLyogTVBFRy0xLzIvNCBNdWx0aXBsZXhlZCAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSDI2NCAgICAgdjRsMl9mb3VyY2MoJ0gnLCAnMicsICc2JywgJzQnKSAvKiBIMjY0IHdpdGggc3RhcnQgY29kZXMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0gyNjRfTk9fU0MgdjRsMl9mb3VyY2MoJ0EnLCAnVicsICdDJywgJzEnKSAvKiBIMjY0IHdpdGhvdXQgc3RhcnQgY29kZXMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0gyNjMgICAgIHY0bDJfZm91cmNjKCdIJywgJzInLCAnNicsICczJykgLyogSDI2MyAgICAgICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTVBFRzEgICAgdjRsMl9mb3VyY2MoJ00nLCAnUCcsICdHJywgJzEnKSAvKiBNUEVHLTEgRVMgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHMiAgICB2NGwyX2ZvdXJjYygnTScsICdQJywgJ0cnLCAnMicpIC8qIE1QRUctMiBFUyAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01QRUc0ICAgIHY0bDJfZm91cmNjKCdNJywgJ1AnLCAnRycsICc0JykgLyogTVBFRy00IEVTICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWFZJRCAgICAgdjRsMl9mb3VyY2MoJ1gnLCAnVicsICdJJywgJ0QnKSAvKiBYdmlkICAgICAgICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfVkMxX0FOTkVYX0cgdjRsMl9mb3VyY2MoJ1YnLCAnQycsICcxJywgJ0cnKSAvKiBTTVBURSA0MjFNIEFubmV4IEcgY29tcGxpYW50IHN0cmVhbSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfVkMxX0FOTkVYX0wgdjRsMl9mb3VyY2MoJ1YnLCAnQycsICcxJywgJ0wnKSAvKiBTTVBURSA0MjFNIEFubmV4IEwgY29tcGxpYW50IHN0cmVhbSAqLworCisvKiAgVmVuZG9yLXNwZWNpZmljIGZvcm1hdHMgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfQ1BJQTEgICAgdjRsMl9mb3VyY2MoJ0MnLCAnUCcsICdJJywgJ0EnKSAvKiBjcGlhMSBZVVYgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1dOVkEgICAgIHY0bDJfZm91cmNjKCdXJywgJ04nLCAnVicsICdBJykgLyogV2lubm92IGh3IGNvbXByZXNzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TTjlDMTBYICB2NGwyX2ZvdXJjYygnUycsICc5JywgJzEnLCAnMCcpIC8qIFNOOUMxMHggY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NOOUMyMFhfSTQyMCB2NGwyX2ZvdXJjYygnUycsICc5JywgJzInLCAnMCcpIC8qIFNOOUMyMHggWVVWIDQ6MjowICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9QV0MxICAgICB2NGwyX2ZvdXJjYygnUCcsICdXJywgJ0MnLCAnMScpIC8qIHB3YyBvbGRlciB3ZWJjYW0gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1BXQzIgICAgIHY0bDJfZm91cmNjKCdQJywgJ1cnLCAnQycsICcyJykgLyogcHdjIG5ld2VyIHdlYmNhbSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfRVQ2MVgyNTEgdjRsMl9mb3VyY2MoJ0UnLCAnNicsICcyJywgJzUnKSAvKiBFVDYxWDI1MSBjb21wcmVzc2lvbiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1BDQTUwMSAgdjRsMl9mb3VyY2MoJ1MnLCAnNScsICcwJywgJzEnKSAvKiBZVVlWIHBlciBsaW5lICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUENBNTA1ICB2NGwyX2ZvdXJjYygnUycsICc1JywgJzAnLCAnNScpIC8qIFlZVVYgcGVyIGxpbmUgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NQQ0E1MDggIHY0bDJfZm91cmNjKCdTJywgJzUnLCAnMCcsICc4JykgLyogWVVWWSBwZXIgbGluZSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1BDQTU2MSAgdjRsMl9mb3VyY2MoJ1MnLCAnNScsICc2JywgJzEnKSAvKiBjb21wcmVzc2VkIEdCUkcgYmF5ZXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1BBQzIwNyAgIHY0bDJfZm91cmNjKCdQJywgJzInLCAnMCcsICc3JykgLyogY29tcHJlc3NlZCBCR0dSIGJheWVyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUjk3MzEwQSB2NGwyX2ZvdXJjYygnTScsICczJywgJzEnLCAnMCcpIC8qIGNvbXByZXNzZWQgQkdHUiBiYXllciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU045QzIwMjggdjRsMl9mb3VyY2MoJ1MnLCAnTycsICdOJywgJ1gnKSAvKiBjb21wcmVzc2VkIEdCUkcgYmF5ZXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NROTA1QyAgIHY0bDJfZm91cmNjKCc5JywgJzAnLCAnNScsICdDJykgLyogY29tcHJlc3NlZCBSR0dCIGJheWVyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9QSlBHICAgICB2NGwyX2ZvdXJjYygnUCcsICdKJywgJ1AnLCAnRycpIC8qIFBpeGFydCA3M3h4IEpQRUcgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX09WNTExICAgIHY0bDJfZm91cmNjKCdPJywgJzUnLCAnMScsICcxJykgLyogb3Y1MTEgSlBFRyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfT1Y1MTggICAgdjRsMl9mb3VyY2MoJ08nLCAnNScsICcxJywgJzgnKSAvKiBvdjUxOCBKUEVHICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TVFYwNjgwICB2NGwyX2ZvdXJjYygnUycsICc2JywgJzgnLCAnMCcpIC8qIHN0djA2ODAgYmF5ZXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1RNNjAwMCAgIHY0bDJfZm91cmNjKCdUJywgJ00nLCAnNicsICcwJykgLyogdG01NjAwL3RtNjB4MCAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfQ0lUX1lZVllVWSB2NGwyX2ZvdXJjYygnQycsICdJJywgJ1QnLCAnVicpIC8qIG9uZSBsaW5lIG9mIFkgdGhlbiAxIGxpbmUgb2YgVllVWSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfS09OSUNBNDIwICB2NGwyX2ZvdXJjYygnSycsICdPJywgJ04nLCAnSScpIC8qIFlVVjQyMCBwbGFuYXIgaW4gYmxvY2tzIG9mIDI1NiBwaXhlbHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0pQR0wJdjRsMl9mb3VyY2MoJ0onLCAnUCcsICdHJywgJ0wnKSAvKiBKUEVHLUxpdGUgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NFNDAxICAgICAgdjRsMl9mb3VyY2MoJ1MnLCAnNCcsICcwJywgJzEnKSAvKiBzZTQwMSBqYW5nZ3UgY29tcHJlc3NlZCByZ2IgKi8KKworLyoKKyAqCUYgTyBSIE0gQSBUICAgRSBOIFUgTSBFIFIgQSBUIEkgTyBOCisgKi8KK3N0cnVjdCB2NGwyX2ZtdGRlc2MgeworCV9fdTMyCQkgICAgaW5kZXg7ICAgICAgICAgICAgIC8qIEZvcm1hdCBudW1iZXIgICAgICAqLworCWVudW0gdjRsMl9idWZfdHlwZSAgdHlwZTsgICAgICAgICAgICAgIC8qIGJ1ZmZlciB0eXBlICAgICAgICAqLworCV9fdTMyICAgICAgICAgICAgICAgZmxhZ3M7CisJX191OAkJICAgIGRlc2NyaXB0aW9uWzMyXTsgICAvKiBEZXNjcmlwdGlvbiBzdHJpbmcgKi8KKwlfX3UzMgkJICAgIHBpeGVsZm9ybWF0OyAgICAgICAvKiBGb3JtYXQgZm91cmNjICAgICAgKi8KKwlfX3UzMgkJICAgIHJlc2VydmVkWzRdOworfTsKKworI2RlZmluZSBWNEwyX0ZNVF9GTEFHX0NPTVBSRVNTRUQgMHgwMDAxCisjZGVmaW5lIFY0TDJfRk1UX0ZMQUdfRU1VTEFURUQgICAweDAwMDIKKworI2lmIDEKKwkvKiBFeHBlcmltZW50YWwgRnJhbWUgU2l6ZSBhbmQgZnJhbWUgcmF0ZSBlbnVtZXJhdGlvbiAqLworLyoKKyAqCUYgUiBBIE0gRSAgIFMgSSBaIEUgICBFIE4gVSBNIEUgUiBBIFQgSSBPIE4KKyAqLworZW51bSB2NGwyX2ZybXNpemV0eXBlcyB7CisJVjRMMl9GUk1TSVpFX1RZUEVfRElTQ1JFVEUJPSAxLAorCVY0TDJfRlJNU0laRV9UWVBFX0NPTlRJTlVPVVMJPSAyLAorCVY0TDJfRlJNU0laRV9UWVBFX1NURVBXSVNFCT0gMywKK307CisKK3N0cnVjdCB2NGwyX2ZybXNpemVfZGlzY3JldGUgeworCV9fdTMyCQkJd2lkdGg7CQkvKiBGcmFtZSB3aWR0aCBbcGl4ZWxdICovCisJX191MzIJCQloZWlnaHQ7CQkvKiBGcmFtZSBoZWlnaHQgW3BpeGVsXSAqLworfTsKKworc3RydWN0IHY0bDJfZnJtc2l6ZV9zdGVwd2lzZSB7CisJX191MzIJCQltaW5fd2lkdGg7CS8qIE1pbmltdW0gZnJhbWUgd2lkdGggW3BpeGVsXSAqLworCV9fdTMyCQkJbWF4X3dpZHRoOwkvKiBNYXhpbXVtIGZyYW1lIHdpZHRoIFtwaXhlbF0gKi8KKwlfX3UzMgkJCXN0ZXBfd2lkdGg7CS8qIEZyYW1lIHdpZHRoIHN0ZXAgc2l6ZSBbcGl4ZWxdICovCisJX191MzIJCQltaW5faGVpZ2h0OwkvKiBNaW5pbXVtIGZyYW1lIGhlaWdodCBbcGl4ZWxdICovCisJX191MzIJCQltYXhfaGVpZ2h0OwkvKiBNYXhpbXVtIGZyYW1lIGhlaWdodCBbcGl4ZWxdICovCisJX191MzIJCQlzdGVwX2hlaWdodDsJLyogRnJhbWUgaGVpZ2h0IHN0ZXAgc2l6ZSBbcGl4ZWxdICovCit9OworCitzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSB7CisJX191MzIJCQlpbmRleDsJCS8qIEZyYW1lIHNpemUgbnVtYmVyICovCisJX191MzIJCQlwaXhlbF9mb3JtYXQ7CS8qIFBpeGVsIGZvcm1hdCAqLworCV9fdTMyCQkJdHlwZTsJCS8qIEZyYW1lIHNpemUgdHlwZSB0aGUgZGV2aWNlIHN1cHBvcnRzLiAqLworCisJdW5pb24gewkJCQkJLyogRnJhbWUgc2l6ZSAqLworCQlzdHJ1Y3QgdjRsMl9mcm1zaXplX2Rpc2NyZXRlCWRpc2NyZXRlOworCQlzdHJ1Y3QgdjRsMl9mcm1zaXplX3N0ZXB3aXNlCXN0ZXB3aXNlOworCX07CisKKwlfX3UzMiAgIHJlc2VydmVkWzJdOwkJCS8qIFJlc2VydmVkIHNwYWNlIGZvciBmdXR1cmUgdXNlICovCit9OworCisvKgorICoJRiBSIEEgTSBFICAgUiBBIFQgRSAgIEUgTiBVIE0gRSBSIEEgVCBJIE8gTgorICovCitlbnVtIHY0bDJfZnJtaXZhbHR5cGVzIHsKKwlWNEwyX0ZSTUlWQUxfVFlQRV9ESVNDUkVURQk9IDEsCisJVjRMMl9GUk1JVkFMX1RZUEVfQ09OVElOVU9VUwk9IDIsCisJVjRMMl9GUk1JVkFMX1RZUEVfU1RFUFdJU0UJPSAzLAorfTsKKworc3RydWN0IHY0bDJfZnJtaXZhbF9zdGVwd2lzZSB7CisJc3RydWN0IHY0bDJfZnJhY3QJbWluOwkJLyogTWluaW11bSBmcmFtZSBpbnRlcnZhbCBbc10gKi8KKwlzdHJ1Y3QgdjRsMl9mcmFjdAltYXg7CQkvKiBNYXhpbXVtIGZyYW1lIGludGVydmFsIFtzXSAqLworCXN0cnVjdCB2NGwyX2ZyYWN0CXN0ZXA7CQkvKiBGcmFtZSBpbnRlcnZhbCBzdGVwIHNpemUgW3NdICovCit9OworCitzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSB7CisJX191MzIJCQlpbmRleDsJCS8qIEZyYW1lIGZvcm1hdCBpbmRleCAqLworCV9fdTMyCQkJcGl4ZWxfZm9ybWF0OwkvKiBQaXhlbCBmb3JtYXQgKi8KKwlfX3UzMgkJCXdpZHRoOwkJLyogRnJhbWUgd2lkdGggKi8KKwlfX3UzMgkJCWhlaWdodDsJCS8qIEZyYW1lIGhlaWdodCAqLworCV9fdTMyCQkJdHlwZTsJCS8qIEZyYW1lIGludGVydmFsIHR5cGUgdGhlIGRldmljZSBzdXBwb3J0cy4gKi8KKworCXVuaW9uIHsJCQkJCS8qIEZyYW1lIGludGVydmFsICovCisJCXN0cnVjdCB2NGwyX2ZyYWN0CQlkaXNjcmV0ZTsKKwkJc3RydWN0IHY0bDJfZnJtaXZhbF9zdGVwd2lzZQlzdGVwd2lzZTsKKwl9OworCisJX191MzIJcmVzZXJ2ZWRbMl07CQkJLyogUmVzZXJ2ZWQgc3BhY2UgZm9yIGZ1dHVyZSB1c2UgKi8KK307CisjZW5kaWYKKworLyoKKyAqCVQgSSBNIEUgQyBPIEQgRQorICovCitzdHJ1Y3QgdjRsMl90aW1lY29kZSB7CisJX191MzIJdHlwZTsKKwlfX3UzMglmbGFnczsKKwlfX3U4CWZyYW1lczsKKwlfX3U4CXNlY29uZHM7CisJX191OAltaW51dGVzOworCV9fdTgJaG91cnM7CisJX191OAl1c2VyYml0c1s0XTsKK307CisKKy8qICBUeXBlICAqLworI2RlZmluZSBWNEwyX1RDX1RZUEVfMjRGUFMJCTEKKyNkZWZpbmUgVjRMMl9UQ19UWVBFXzI1RlBTCQkyCisjZGVmaW5lIFY0TDJfVENfVFlQRV8zMEZQUwkJMworI2RlZmluZSBWNEwyX1RDX1RZUEVfNTBGUFMJCTQKKyNkZWZpbmUgVjRMMl9UQ19UWVBFXzYwRlBTCQk1CisKKy8qICBGbGFncyAgKi8KKyNkZWZpbmUgVjRMMl9UQ19GTEFHX0RST1BGUkFNRQkJMHgwMDAxIC8qICJkcm9wLWZyYW1lIiBtb2RlICovCisjZGVmaW5lIFY0TDJfVENfRkxBR19DT0xPUkZSQU1FCQkweDAwMDIKKyNkZWZpbmUgVjRMMl9UQ19VU0VSQklUU19maWVsZAkJMHgwMDBDCisjZGVmaW5lIFY0TDJfVENfVVNFUkJJVFNfVVNFUkRFRklORUQJMHgwMDAwCisjZGVmaW5lIFY0TDJfVENfVVNFUkJJVFNfOEJJVENIQVJTCTB4MDAwOAorLyogVGhlIGFib3ZlIGlzIGJhc2VkIG9uIFNNUFRFIHRpbWVjb2RlcyAqLworCitzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24geworCWludCBxdWFsaXR5OworCisJaW50ICBBUFBuOyAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIEFQUCBzZWdtZW50IHRvIGJlIHdyaXR0ZW4sCisJCQkJICogbXVzdCBiZSAwLi4xNSAqLworCWludCAgQVBQX2xlbjsgICAgICAgICAgIC8qIExlbmd0aCBvZiBkYXRhIGluIEpQRUcgQVBQbiBzZWdtZW50ICovCisJY2hhciBBUFBfZGF0YVs2MF07ICAgICAgLyogRGF0YSBpbiB0aGUgSlBFRyBBUFBuIHNlZ21lbnQuICovCisKKwlpbnQgIENPTV9sZW47ICAgICAgICAgICAvKiBMZW5ndGggb2YgZGF0YSBpbiBKUEVHIENPTSBzZWdtZW50ICovCisJY2hhciBDT01fZGF0YVs2MF07ICAgICAgLyogRGF0YSBpbiBKUEVHIENPTSBzZWdtZW50ICovCisKKwlfX3UzMiBqcGVnX21hcmtlcnM7ICAgICAvKiBXaGljaCBtYXJrZXJzIHNob3VsZCBnbyBpbnRvIHRoZSBKUEVHCisJCQkJICogb3V0cHV0LiBVbmxlc3MgeW91IGV4YWN0bHkga25vdyB3aGF0CisJCQkJICogeW91IGRvLCBsZWF2ZSB0aGVtIHVudG91Y2hlZC4KKwkJCQkgKiBJbmx1ZGluZyBsZXNzIG1hcmtlcnMgd2lsbCBtYWtlIHRoZQorCQkJCSAqIHJlc3VsdGluZyBjb2RlIHNtYWxsZXIsIGJ1dCB0aGVyZSB3aWxsCisJCQkJICogYmUgZmV3ZXIgYXBwbGljYXRpb25zIHdoaWNoIGNhbiByZWFkIGl0LgorCQkJCSAqIFRoZSBwcmVzZW5jZSBvZiB0aGUgQVBQIGFuZCBDT00gbWFya2VyCisJCQkJICogaXMgaW5mbHVlbmNlZCBieSBBUFBfbGVuIGFuZCBDT01fbGVuCisJCQkJICogT05MWSwgbm90IGJ5IHRoaXMgcHJvcGVydHkhICovCisKKyNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9ESFQgKDE8PDMpICAgIC8qIERlZmluZSBIdWZmbWFuIFRhYmxlcyAqLworI2RlZmluZSBWNEwyX0pQRUdfTUFSS0VSX0RRVCAoMTw8NCkgICAgLyogRGVmaW5lIFF1YW50aXphdGlvbiBUYWJsZXMgKi8KKyNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9EUkkgKDE8PDUpICAgIC8qIERlZmluZSBSZXN0YXJ0IEludGVydmFsICovCisjZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfQ09NICgxPDw2KSAgICAvKiBDb21tZW50IHNlZ21lbnQgKi8KKyNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9BUFAgKDE8PDcpICAgIC8qIEFwcCBzZWdtZW50LCBkcml2ZXIgd2lsbAorCQkJCQkqIGFsbHdheXMgdXNlIEFQUDAgKi8KK307CisKKy8qCisgKglNIEUgTSBPIFIgWSAtIE0gQSBQIFAgSSBOIEcgICBCIFUgRiBGIEUgUiBTCisgKi8KK3N0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIHsKKwlfX3UzMgkJCWNvdW50OworCWVudW0gdjRsMl9idWZfdHlwZSAgICAgIHR5cGU7CisJZW51bSB2NGwyX21lbW9yeSAgICAgICAgbWVtb3J5OworCV9fdTMyCQkJcmVzZXJ2ZWRbMl07Cit9OworCisvKioKKyAqIHN0cnVjdCB2NGwyX3BsYW5lIC0gcGxhbmUgaW5mbyBmb3IgbXVsdGktcGxhbmFyIGJ1ZmZlcnMKKyAqIEBieXRlc3VzZWQ6CQludW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgZGF0YSBpbiB0aGUgcGxhbmUgKHBheWxvYWQpCisgKiBAbGVuZ3RoOgkJc2l6ZSBvZiB0aGlzIHBsYW5lIChOT1QgdGhlIHBheWxvYWQpIGluIGJ5dGVzCisgKiBAbWVtX29mZnNldDoJCXdoZW4gbWVtb3J5IGluIHRoZSBhc3NvY2lhdGVkIHN0cnVjdCB2NGwyX2J1ZmZlciBpcworICoJCQlWNEwyX01FTU9SWV9NTUFQLCBlcXVhbHMgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZgorICoJCQl0aGUgZGV2aWNlIG1lbW9yeSBmb3IgdGhpcyBwbGFuZSAob3IgaXMgYSAiY29va2llIiB0aGF0CisgKgkJCXNob3VsZCBiZSBwYXNzZWQgdG8gbW1hcCgpIGNhbGxlZCBvbiB0aGUgdmlkZW8gbm9kZSkKKyAqIEB1c2VycHRyOgkJd2hlbiBtZW1vcnkgaXMgVjRMMl9NRU1PUllfVVNFUlBUUiwgYSB1c2Vyc3BhY2UgcG9pbnRlcgorICoJCQlwb2ludGluZyB0byB0aGlzIHBsYW5lCisgKiBAZGF0YV9vZmZzZXQ6CW9mZnNldCBpbiB0aGUgcGxhbmUgdG8gdGhlIHN0YXJ0IG9mIGRhdGE7IHVzdWFsbHkgMCwKKyAqCQkJdW5sZXNzIHRoZXJlIGlzIGEgaGVhZGVyIGluIGZyb250IG9mIHRoZSBkYXRhCisgKgorICogTXVsdGktcGxhbmFyIGJ1ZmZlcnMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSBwbGFuZXMsIGUuZy4gYW4gWUNiQ3IgYnVmZmVyCisgKiB3aXRoIHR3byBwbGFuZXMgY2FuIGhhdmUgb25lIHBsYW5lIGZvciBZLCBhbmQgYW5vdGhlciBmb3IgaW50ZXJsZWF2ZWQgQ2JDcgorICogY29tcG9uZW50cy4gRWFjaCBwbGFuZSBjYW4gcmVzaWRlIGluIGEgc2VwYXJhdGUgbWVtb3J5IGJ1ZmZlciwgb3IgZXZlbiBpbgorICogYSBjb21wbGV0ZWx5IHNlcGFyYXRlIG1lbW9yeSBub2RlIChlLmcuIGluIGVtYmVkZGVkIGRldmljZXMpLgorICovCitzdHJ1Y3QgdjRsMl9wbGFuZSB7CisJX191MzIJCQlieXRlc3VzZWQ7CisJX191MzIJCQlsZW5ndGg7CisJdW5pb24geworCQlfX3UzMgkJbWVtX29mZnNldDsKKwkJdW5zaWduZWQgbG9uZwl1c2VycHRyOworCX0gbTsKKwlfX3UzMgkJCWRhdGFfb2Zmc2V0OworCV9fdTMyCQkJcmVzZXJ2ZWRbMTFdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9idWZmZXIgLSB2aWRlbyBidWZmZXIgaW5mbworICogQGluZGV4OglpZCBudW1iZXIgb2YgdGhlIGJ1ZmZlcgorICogQHR5cGU6CWJ1ZmZlciB0eXBlICh0eXBlID09ICpfTVBMQU5FIGZvciBtdWx0aXBsYW5hciBidWZmZXJzKQorICogQGJ5dGVzdXNlZDoJbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkIGJ5IGRhdGEgaW4gdGhlIGJ1ZmZlciAocGF5bG9hZCk7CisgKgkJdW51c2VkIChzZXQgdG8gMCkgZm9yIG11bHRpcGxhbmFyIGJ1ZmZlcnMKKyAqIEBmbGFnczoJYnVmZmVyIGluZm9ybWF0aW9uYWwgZmxhZ3MKKyAqIEBmaWVsZDoJZmllbGQgb3JkZXIgb2YgdGhlIGltYWdlIGluIHRoZSBidWZmZXIKKyAqIEB0aW1lc3RhbXA6CWZyYW1lIHRpbWVzdGFtcAorICogQHRpbWVjb2RlOglmcmFtZSB0aW1lY29kZQorICogQHNlcXVlbmNlOglzZXF1ZW5jZSBjb3VudCBvZiB0aGlzIGZyYW1lCisgKiBAbWVtb3J5Ogl0aGUgbWV0aG9kLCBpbiB3aGljaCB0aGUgYWN0dWFsIHZpZGVvIGRhdGEgaXMgcGFzc2VkCisgKiBAb2Zmc2V0Oglmb3Igbm9uLW11bHRpcGxhbmFyIGJ1ZmZlcnMgd2l0aCBtZW1vcnkgPT0gVjRMMl9NRU1PUllfTU1BUDsKKyAqCQlvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGRldmljZSBtZW1vcnkgZm9yIHRoaXMgcGxhbmUsCisgKgkJKG9yIGEgImNvb2tpZSIgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIG1tYXAoKSBhcyBvZmZzZXQpCisgKiBAdXNlcnB0cjoJZm9yIG5vbi1tdWx0aXBsYW5hciBidWZmZXJzIHdpdGggbWVtb3J5ID09IFY0TDJfTUVNT1JZX1VTRVJQVFI7CisgKgkJYSB1c2Vyc3BhY2UgcG9pbnRlciBwb2ludGluZyB0byB0aGlzIGJ1ZmZlcgorICogQHBsYW5lczoJZm9yIG11bHRpcGxhbmFyIGJ1ZmZlcnM7IHVzZXJzcGFjZSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBwbGFuZQorICoJCWluZm8gc3RydWN0cyBmb3IgdGhpcyBidWZmZXIKKyAqIEBsZW5ndGg6CXNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciAoTk9UIGl0cyBwYXlsb2FkKSBmb3Igc2luZ2xlLXBsYW5lCisgKgkJYnVmZmVycyAod2hlbiB0eXBlICE9ICpfTVBMQU5FKTsgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQorICoJCXBsYW5lcyBhcnJheSBmb3IgbXVsdGktcGxhbmUgYnVmZmVycworICogQGlucHV0OglpbnB1dCBudW1iZXIgZnJvbSB3aGljaCB0aGUgdmlkZW8gZGF0YSBoYXMgaGFzIGJlZW4gY2FwdHVyZWQKKyAqCisgKiBDb250YWlucyBkYXRhIGV4Y2hhbmdlZCBieSBhcHBsaWNhdGlvbiBhbmQgZHJpdmVyIHVzaW5nIG9uZSBvZiB0aGUgU3RyZWFtaW5nCisgKiBJL08gbWV0aG9kcy4KKyAqLworc3RydWN0IHY0bDJfYnVmZmVyIHsKKwlfX3UzMgkJCWluZGV4OworCWVudW0gdjRsMl9idWZfdHlwZSAgICAgIHR5cGU7CisJX191MzIJCQlieXRlc3VzZWQ7CisJX191MzIJCQlmbGFnczsKKwllbnVtIHY0bDJfZmllbGQJCWZpZWxkOworCXN0cnVjdCB0aW1ldmFsCQl0aW1lc3RhbXA7CisJc3RydWN0IHY0bDJfdGltZWNvZGUJdGltZWNvZGU7CisJX191MzIJCQlzZXF1ZW5jZTsKKworCS8qIG1lbW9yeSBsb2NhdGlvbiAqLworCWVudW0gdjRsMl9tZW1vcnkgICAgICAgIG1lbW9yeTsKKwl1bmlvbiB7CisJCV9fdTMyICAgICAgICAgICBvZmZzZXQ7CisJCXVuc2lnbmVkIGxvbmcgICB1c2VycHRyOworCQlzdHJ1Y3QgdjRsMl9wbGFuZSAqcGxhbmVzOworCX0gbTsKKwlfX3UzMgkJCWxlbmd0aDsKKwlfX3UzMgkJCWlucHV0OworCV9fdTMyCQkJcmVzZXJ2ZWQ7Cit9OworCisvKiAgRmxhZ3MgZm9yICdmbGFncycgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19NQVBQRUQJMHgwMDAxICAvKiBCdWZmZXIgaXMgbWFwcGVkIChmbGFnKSAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX1FVRVVFRAkweDAwMDIJLyogQnVmZmVyIGlzIHF1ZXVlZCBmb3IgcHJvY2Vzc2luZyAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX0RPTkUJMHgwMDA0CS8qIEJ1ZmZlciBpcyByZWFkeSAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FCTB4MDAwOAkvKiBJbWFnZSBpcyBhIGtleWZyYW1lIChJLWZyYW1lKSAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX1BGUkFNRQkweDAwMTAJLyogSW1hZ2UgaXMgYSBQLWZyYW1lICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfQkZSQU1FCTB4MDAyMAkvKiBJbWFnZSBpcyBhIEItZnJhbWUgKi8KKy8qIEJ1ZmZlciBpcyByZWFkeSwgYnV0IHRoZSBkYXRhIGNvbnRhaW5lZCB3aXRoaW4gaXMgY29ycnVwdGVkLiAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX0VSUk9SCTB4MDA0MAorI2RlZmluZSBWNEwyX0JVRl9GTEFHX1RJTUVDT0RFCTB4MDEwMAkvKiB0aW1lY29kZSBmaWVsZCBpcyB2YWxpZCAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX0lOUFVUICAgICAweDAyMDAgIC8qIGlucHV0IGZpZWxkIGlzIHZhbGlkICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfUFJFUEFSRUQJMHgwNDAwCS8qIEJ1ZmZlciBpcyBwcmVwYXJlZCBmb3IgcXVldWluZyAqLworLyogQ2FjaGUgaGFuZGxpbmcgZmxhZ3MgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19OT19DQUNIRV9JTlZBTElEQVRFCTB4MDgwMAorI2RlZmluZSBWNEwyX0JVRl9GTEFHX05PX0NBQ0hFX0NMRUFOCQkweDEwMDAKKworLyoKKyAqCU8gViBFIFIgTCBBIFkgICBQIFIgRSBWIEkgRSBXCisgKi8KK3N0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyIHsKKwlfX3UzMgkJCWNhcGFiaWxpdHk7CisJX191MzIJCQlmbGFnczsKKy8qIEZJWE1FOiBpbiB0aGVvcnkgd2Ugc2hvdWxkIHBhc3Mgc29tZXRoaW5nIGxpa2UgUENJIGRldmljZSArIG1lbW9yeQorICogcmVnaW9uICsgb2Zmc2V0IGluc3RlYWQgb2Ygc29tZSBwaHlzaWNhbCBhZGRyZXNzICovCisJdm9pZCAgICAgICAgICAgICAgICAgICAgKmJhc2U7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdAlmbXQ7Cit9OworLyogIEZsYWdzIGZvciB0aGUgJ2NhcGFiaWxpdHknIGZpZWxkLiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9FWFRFUk5PVkVSTEFZCTB4MDAwMQorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0NIUk9NQUtFWQkJMHgwMDAyCisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfTElTVF9DTElQUElORyAgICAgMHgwMDA0CisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfQklUTUFQX0NMSVBQSU5HCTB4MDAwOAorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0xPQ0FMX0FMUEhBCTB4MDAxMAorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0dMT0JBTF9BTFBIQQkweDAwMjAKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9MT0NBTF9JTlZfQUxQSEEJMHgwMDQwCisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfU1JDX0NIUk9NQUtFWQkweDAwODAKKy8qICBGbGFncyBmb3IgdGhlICdmbGFncycgZmllbGQuICovCisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX1BSSU1BUlkJCTB4MDAwMQorI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19PVkVSTEFZCQkweDAwMDIKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfQ0hST01BS0VZCTB4MDAwNAorI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19MT0NBTF9BTFBIQQkweDAwMDgKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfR0xPQkFMX0FMUEhBCTB4MDAxMAorI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19MT0NBTF9JTlZfQUxQSEEJMHgwMDIwCisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX1NSQ19DSFJPTUFLRVkJMHgwMDQwCisKK3N0cnVjdCB2NGwyX2NsaXAgeworCXN0cnVjdCB2NGwyX3JlY3QgICAgICAgIGM7CisJc3RydWN0IHY0bDJfY2xpcAkqbmV4dDsKK307CisKK3N0cnVjdCB2NGwyX3dpbmRvdyB7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgdzsKKwllbnVtIHY0bDJfZmllbGQgIAlmaWVsZDsKKwlfX3UzMgkJCWNocm9tYWtleTsKKwlzdHJ1Y3QgdjRsMl9jbGlwCSpjbGlwczsKKwlfX3UzMgkJCWNsaXBjb3VudDsKKwl2b2lkCQkJKmJpdG1hcDsKKwlfX3U4ICAgICAgICAgICAgICAgICAgICBnbG9iYWxfYWxwaGE7Cit9OworCisvKgorICoJQyBBIFAgVCBVIFIgRSAgIFAgQSBSIEEgTSBFIFQgRSBSIFMKKyAqLworc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0geworCV9fdTMyCQkgICBjYXBhYmlsaXR5OwkgIC8qICBTdXBwb3J0ZWQgbW9kZXMgKi8KKwlfX3UzMgkJICAgY2FwdHVyZW1vZGU7CSAgLyogIEN1cnJlbnQgbW9kZSAqLworCXN0cnVjdCB2NGwyX2ZyYWN0ICB0aW1lcGVyZnJhbWU7ICAvKiAgVGltZSBwZXIgZnJhbWUgaW4gLjF1cyB1bml0cyAqLworCV9fdTMyCQkgICBleHRlbmRlZG1vZGU7ICAvKiAgRHJpdmVyLXNwZWNpZmljIGV4dGVuc2lvbnMgKi8KKwlfX3UzMiAgICAgICAgICAgICAgcmVhZGJ1ZmZlcnM7ICAgLyogICMgb2YgYnVmZmVycyBmb3IgcmVhZCAqLworCV9fdTMyCQkgICByZXNlcnZlZFs0XTsKK307CisKKy8qICBGbGFncyBmb3IgJ2NhcGFiaWxpdHknIGFuZCAnY2FwdHVyZW1vZGUnIGZpZWxkcyAqLworI2RlZmluZSBWNEwyX01PREVfSElHSFFVQUxJVFkJMHgwMDAxCS8qICBIaWdoIHF1YWxpdHkgaW1hZ2luZyBtb2RlICovCisjZGVmaW5lIFY0TDJfQ0FQX1RJTUVQRVJGUkFNRQkweDEwMDAJLyogIHRpbWVwZXJmcmFtZSBmaWVsZCBpcyBzdXBwb3J0ZWQgKi8KKworc3RydWN0IHY0bDJfb3V0cHV0cGFybSB7CisJX191MzIJCSAgIGNhcGFiaWxpdHk7CSAvKiAgU3VwcG9ydGVkIG1vZGVzICovCisJX191MzIJCSAgIG91dHB1dG1vZGU7CSAvKiAgQ3VycmVudCBtb2RlICovCisJc3RydWN0IHY0bDJfZnJhY3QgIHRpbWVwZXJmcmFtZTsgLyogIFRpbWUgcGVyIGZyYW1lIGluIHNlY29uZHMgKi8KKwlfX3UzMgkJICAgZXh0ZW5kZWRtb2RlOyAvKiAgRHJpdmVyLXNwZWNpZmljIGV4dGVuc2lvbnMgKi8KKwlfX3UzMiAgICAgICAgICAgICAgd3JpdGVidWZmZXJzOyAvKiAgIyBvZiBidWZmZXJzIGZvciB3cml0ZSAqLworCV9fdTMyCQkgICByZXNlcnZlZFs0XTsKK307CisKKy8qCisgKglJIE4gUCBVIFQgICBJIE0gQSBHIEUgICBDIFIgTyBQIFAgSSBOIEcKKyAqLworc3RydWN0IHY0bDJfY3JvcGNhcCB7CisJZW51bSB2NGwyX2J1Zl90eXBlICAgICAgdHlwZTsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICBib3VuZHM7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgZGVmcmVjdDsKKwlzdHJ1Y3QgdjRsMl9mcmFjdCAgICAgICBwaXhlbGFzcGVjdDsKK307CisKK3N0cnVjdCB2NGwyX2Nyb3AgeworCWVudW0gdjRsMl9idWZfdHlwZSAgICAgIHR5cGU7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgYzsKK307CisKKy8qCisgKiAgICAgIEEgTiBBIEwgTyBHICAgViBJIEQgRSBPICAgUyBUIEEgTiBEIEEgUiBECisgKi8KKwordHlwZWRlZiBfX3U2NCB2NGwyX3N0ZF9pZDsKKworLyogb25lIGJpdCBmb3IgZWFjaCAqLworI2RlZmluZSBWNEwyX1NURF9QQUxfQiAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMDEpCisjZGVmaW5lIFY0TDJfU1REX1BBTF9CMSAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAwMikKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0cgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDA0KQorI2RlZmluZSBWNEwyX1NURF9QQUxfSCAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMDgpCisjZGVmaW5lIFY0TDJfU1REX1BBTF9JICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAxMCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0QgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDIwKQorI2RlZmluZSBWNEwyX1NURF9QQUxfRDEgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwNDApCisjZGVmaW5lIFY0TDJfU1REX1BBTF9LICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDA4MCkKKworI2RlZmluZSBWNEwyX1NURF9QQUxfTSAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAxMDApCisjZGVmaW5lIFY0TDJfU1REX1BBTF9OICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDIwMCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX05jICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwNDAwKQorI2RlZmluZSBWNEwyX1NURF9QQUxfNjAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDA4MDApCisKKyNkZWZpbmUgVjRMMl9TVERfTlRTQ19NICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAxMDAwKQkvKiBCVFNDICovCisjZGVmaW5lIFY0TDJfU1REX05UU0NfTV9KUCAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMjAwMCkJLyogRUlBLUogKi8KKyNkZWZpbmUgVjRMMl9TVERfTlRTQ180NDMgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDA0MDAwKQorI2RlZmluZSBWNEwyX1NURF9OVFNDX01fS1IgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDgwMDApCS8qIEZNIEEyICovCisKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fQiAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDEwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9EICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMjAwMDApCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0cgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDA0MDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fSCAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDgwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9LICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAxMDAwMDApCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0sxICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDIwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fTCAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwNDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9MQyAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDA4MDAwMDApCisKKy8qIEFUU0MvSERUViAqLworI2RlZmluZSBWNEwyX1NURF9BVFNDXzhfVlNCICAgICAoKHY0bDJfc3RkX2lkKTB4MDEwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REX0FUU0NfMTZfVlNCICAgICgodjRsMl9zdGRfaWQpMHgwMjAwMDAwMCkKKworLyogRklYTUU6CisgICBBbHRob3VnaCBzdGRfaWQgaXMgNjQgYml0cywgdGhlcmUgaXMgYW4gaXNzdWUgb24gUFBDMzIgYXJjaGl0ZWN0dXJlIHRoYXQKKyAgIG1ha2VzIHN3aXRjaChfX3U2NCkgdG8gYnJlYWsuIFNvLCB0aGVyZSdzIGEgaGFjayBvbiB2NGwyLWNvbW1vbi5jIHJvdW5kaW5nCisgICB0aGlzIHZhbHVlIHRvIDMyIGJpdHMuCisgICBBcywgY3VycmVudGx5LCB0aGUgbWF4IHZhbHVlIGlzIGZvciBWNEwyX1NURF9BVFNDXzE2X1ZTQiAoMzAgYml0cyB3aWRlKSwKKyAgIGl0IHNob3VsZCB3b3JrIGZpbmUuIEhvd2V2ZXIsIGlmIG5lZWRlZCB0byBhZGQgbW9yZSB0aGFuIHR3byBzdGFuZGFyZHMsCisgICB2NGwyLWNvbW1vbi5jIHNob3VsZCBiZSBmaXhlZC4KKyAqLworCisvKgorICogU29tZSBtYWNyb3MgdG8gbWVyZ2UgdmlkZW8gc3RhbmRhcmRzIGluIG9yZGVyIHRvIG1ha2UgbGl2ZSBlYXNpZXIgZm9yIHRoZQorICogZHJpdmVycyBhbmQgVjRMMiBhcHBsaWNhdGlvbnMKKyAqLworCisvKgorICogIkNvbW1vbiIgTlRTQy9NIC0gSXQgc2hvdWxkIGJlIG5vdGljZWQgdGhhdCBWNEwyX1NURF9OVFNDXzQ0MyBpcworICogTWlzc2luZyBoZXJlLgorICovCisjZGVmaW5lIFY0TDJfU1REX05UU0MgICAgICAgICAgIChWNEwyX1NURF9OVFNDX00JfFwKKwkJCQkgVjRMMl9TVERfTlRTQ19NX0pQICAgICB8XAorCQkJCSBWNEwyX1NURF9OVFNDX01fS1IpCisvKiBTZWNhbSBtYWNyb3MgKi8KKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fREsgICAgICAJKFY0TDJfU1REX1NFQ0FNX0QJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fSwl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9LMSkKKy8qIEFsbCBTZWNhbSBTdGFuZGFyZHMgKi8KKyNkZWZpbmUgVjRMMl9TVERfU0VDQU0JCShWNEwyX1NURF9TRUNBTV9CCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0cJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fSAl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9ESwl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9MICAgICAgIHxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0xDKQorLyogUEFMIG1hY3JvcyAqLworI2RlZmluZSBWNEwyX1NURF9QQUxfQkcJCShWNEwyX1NURF9QQUxfQgkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0IxCXxcCisJCQkJIFY0TDJfU1REX1BBTF9HKQorI2RlZmluZSBWNEwyX1NURF9QQUxfREsJCShWNEwyX1NURF9QQUxfRAkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0QxCXxcCisJCQkJIFY0TDJfU1REX1BBTF9LKQorLyoKKyAqICJDb21tb24iIFBBTCAtIFRoaXMgbWFjcm8gaXMgdGhlcmUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBvbGQKKyAqIFY0TDEgY29uY2VwdCBvZiAiUEFMIjogL0JHREtISS4KKyAqIFNldmVyYWwgUEFMIHN0YW5kYXJkcyBhcmUgbWlzaW5nIGhlcmU6IC9NLCAvTiBhbmQgL05jCisgKi8KKyNkZWZpbmUgVjRMMl9TVERfUEFMCQkoVjRMMl9TVERfUEFMX0JHCXxcCisJCQkJIFY0TDJfU1REX1BBTF9ESwl8XAorCQkJCSBWNEwyX1NURF9QQUxfSAkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0kpCisvKiBDaHJvbWEgImFnbm9zdGljIiBzdGFuZGFyZHMgKi8KKyNkZWZpbmUgVjRMMl9TVERfQgkJKFY0TDJfU1REX1BBTF9CCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfQjEJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fQikKKyNkZWZpbmUgVjRMMl9TVERfRwkJKFY0TDJfU1REX1BBTF9HCQl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9HKQorI2RlZmluZSBWNEwyX1NURF9ICQkoVjRMMl9TVERfUEFMX0gJCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0gpCisjZGVmaW5lIFY0TDJfU1REX0wJCShWNEwyX1NURF9TRUNBTV9MCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0xDKQorI2RlZmluZSBWNEwyX1NURF9HSAkJKFY0TDJfU1REX0cJCXxcCisJCQkJIFY0TDJfU1REX0gpCisjZGVmaW5lIFY0TDJfU1REX0RLCQkoVjRMMl9TVERfUEFMX0RLCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0RLKQorI2RlZmluZSBWNEwyX1NURF9CRwkJKFY0TDJfU1REX0IJCXxcCisJCQkJIFY0TDJfU1REX0cpCisjZGVmaW5lIFY0TDJfU1REX01OCQkoVjRMMl9TVERfUEFMX00JCXxcCisJCQkJIFY0TDJfU1REX1BBTF9OCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfTmMJfFwKKwkJCQkgVjRMMl9TVERfTlRTQykKKworLyogU3RhbmRhcmRzIHdoZXJlIE1UUy9CVFNDIHN0ZXJlbyBjb3VsZCBiZSBmb3VuZCAqLworI2RlZmluZSBWNEwyX1NURF9NVFMJCShWNEwyX1NURF9OVFNDX00JfFwKKwkJCQkgVjRMMl9TVERfUEFMX00JCXxcCisJCQkJIFY0TDJfU1REX1BBTF9OCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfTmMpCisKKy8qIFN0YW5kYXJkcyBmb3IgQ291bnRyaWVzIHdpdGggNjBIeiBMaW5lIGZyZXF1ZW5jeSAqLworI2RlZmluZSBWNEwyX1NURF81MjVfNjAJCShWNEwyX1NURF9QQUxfTQkJfFwKKwkJCQkgVjRMMl9TVERfUEFMXzYwCXxcCisJCQkJIFY0TDJfU1REX05UU0MJCXxcCisJCQkJIFY0TDJfU1REX05UU0NfNDQzKQorLyogU3RhbmRhcmRzIGZvciBDb3VudHJpZXMgd2l0aCA1MEh6IExpbmUgZnJlcXVlbmN5ICovCisjZGVmaW5lIFY0TDJfU1REXzYyNV81MAkJKFY0TDJfU1REX1BBTAkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX04JCXxcCisJCQkJIFY0TDJfU1REX1BBTF9OYwl8XAorCQkJCSBWNEwyX1NURF9TRUNBTSkKKworI2RlZmluZSBWNEwyX1NURF9BVFNDICAgICAgICAgICAoVjRMMl9TVERfQVRTQ184X1ZTQiAgICB8XAorCQkJCSBWNEwyX1NURF9BVFNDXzE2X1ZTQikKKy8qIE1hY3JvcyB3aXRoIG5vbmUgYW5kIGFsbCBhbmFsb2cgc3RhbmRhcmRzICovCisjZGVmaW5lIFY0TDJfU1REX1VOS05PV04gICAgICAgIDAKKyNkZWZpbmUgVjRMMl9TVERfQUxMICAgICAgICAgICAgKFY0TDJfU1REXzUyNV82MAl8XAorCQkJCSBWNEwyX1NURF82MjVfNTApCisKK3N0cnVjdCB2NGwyX3N0YW5kYXJkIHsKKwlfX3UzMgkJICAgICBpbmRleDsKKwl2NGwyX3N0ZF9pZCAgICAgICAgICBpZDsKKwlfX3U4CQkgICAgIG5hbWVbMjRdOworCXN0cnVjdCB2NGwyX2ZyYWN0ICAgIGZyYW1lcGVyaW9kOyAvKiBGcmFtZXMsIG5vdCBmaWVsZHMgKi8KKwlfX3UzMgkJICAgICBmcmFtZWxpbmVzOworCV9fdTMyCQkgICAgIHJlc2VydmVkWzRdOworfTsKKworLyoKKyAqCVYgSSBEIEUgTwlUIEkgTSBJIE4gRyBTCUQgVglQIFIgRSBTIEUgVAorICovCitzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgeworCV9fdTMyCXByZXNldDsKKwlfX3UzMglyZXNlcnZlZFs0XTsKK307CisKKy8qCisgKglEIFYJUCBSIEUgUyBFIFQgUwlFIE4gVSBNIEUgUiBBIFQgSSBPIE4KKyAqLworc3RydWN0IHY0bDJfZHZfZW51bV9wcmVzZXQgeworCV9fdTMyCWluZGV4OworCV9fdTMyCXByZXNldDsKKwlfX3U4CW5hbWVbMzJdOyAvKiBOYW1lIG9mIHRoZSBwcmVzZXQgdGltaW5nICovCisJX191MzIJd2lkdGg7CisJX191MzIJaGVpZ2h0OworCV9fdTMyCXJlc2VydmVkWzRdOworfTsKKworLyoKKyAqIAlEIFYJUCBSIEUgUyBFIFQJViBBIEwgVSBFIFMKKyAqLworI2RlZmluZQkJVjRMMl9EVl9JTlZBTElECQkwCisjZGVmaW5lCQlWNEwyX0RWXzQ4MFA1OV85NAkxIC8qIEJULjEzNjIgKi8KKyNkZWZpbmUJCVY0TDJfRFZfNTc2UDUwCQkyIC8qIEJULjEzNjIgKi8KKyNkZWZpbmUJCVY0TDJfRFZfNzIwUDI0CQkzIC8qIFNNUFRFIDI5Nk0gKi8KKyNkZWZpbmUJCVY0TDJfRFZfNzIwUDI1CQk0IC8qIFNNUFRFIDI5Nk0gKi8KKyNkZWZpbmUJCVY0TDJfRFZfNzIwUDMwCQk1IC8qIFNNUFRFIDI5Nk0gKi8KKyNkZWZpbmUJCVY0TDJfRFZfNzIwUDUwCQk2IC8qIFNNUFRFIDI5Nk0gKi8KKyNkZWZpbmUJCVY0TDJfRFZfNzIwUDU5Xzk0CTcgLyogU01QVEUgMjc0TSAqLworI2RlZmluZQkJVjRMMl9EVl83MjBQNjAJCTggLyogU01QVEUgMjc0TS8yOTZNICovCisjZGVmaW5lCQlWNEwyX0RWXzEwODBJMjlfOTcJOSAvKiBCVC4xMTIwLyBTTVBURSAyNzRNICovCisjZGVmaW5lCQlWNEwyX0RWXzEwODBJMzAJCTEwIC8qIEJULjExMjAvIFNNUFRFIDI3NE0gKi8KKyNkZWZpbmUJCVY0TDJfRFZfMTA4MEkyNQkJMTEgLyogQlQuMTEyMCAqLworI2RlZmluZQkJVjRMMl9EVl8xMDgwSTUwCQkxMiAvKiBTTVBURSAyOTZNICovCisjZGVmaW5lCQlWNEwyX0RWXzEwODBJNjAJCTEzIC8qIFNNUFRFIDI5Nk0gKi8KKyNkZWZpbmUJCVY0TDJfRFZfMTA4MFAyNAkJMTQgLyogU01QVEUgMjk2TSAqLworI2RlZmluZQkJVjRMMl9EVl8xMDgwUDI1CQkxNSAvKiBTTVBURSAyOTZNICovCisjZGVmaW5lCQlWNEwyX0RWXzEwODBQMzAJCTE2IC8qIFNNUFRFIDI5Nk0gKi8KKyNkZWZpbmUJCVY0TDJfRFZfMTA4MFA1MAkJMTcgLyogQlQuMTEyMCAqLworI2RlZmluZQkJVjRMMl9EVl8xMDgwUDYwCQkxOCAvKiBCVC4xMTIwICovCisKKy8qCisgKglEIFYgCUIgVAlUIEkgTSBJIE4gRyBTCisgKi8KKworLyogQlQuNjU2L0JULjExMjAgdGltaW5nIGRhdGEgKi8KK3N0cnVjdCB2NGwyX2J0X3RpbWluZ3MgeworCV9fdTMyCXdpZHRoOwkJLyogd2lkdGggaW4gcGl4ZWxzICovCisJX191MzIJaGVpZ2h0OwkJLyogaGVpZ2h0IGluIGxpbmVzICovCisJX191MzIJaW50ZXJsYWNlZDsJLyogSW50ZXJsYWNlZCBvciBwcm9ncmVzc2l2ZSAqLworCV9fdTMyCXBvbGFyaXRpZXM7CS8qIFBvc2l0aXZlIG9yIG5lZ2F0aXZlIHBvbGFyaXR5ICovCisJX191NjQJcGl4ZWxjbG9jazsJLyogUGl4ZWwgY2xvY2sgaW4gSFouIEV4LiA3NC4yNU1Iei0+NzQyNTAwMDAgKi8KKwlfX3UzMgloZnJvbnRwb3JjaDsJLyogSG9yaXpwb250YWwgZnJvbnQgcG9yY2ggaW4gcGl4ZWxzICovCisJX191MzIJaHN5bmM7CQkvKiBIb3Jpem9udGFsIFN5bmMgbGVuZ3RoIGluIHBpeGVscyAqLworCV9fdTMyCWhiYWNrcG9yY2g7CS8qIEhvcml6b250YWwgYmFjayBwb3JjaCBpbiBwaXhlbHMgKi8KKwlfX3UzMgl2ZnJvbnRwb3JjaDsJLyogVmVydGljYWwgZnJvbnQgcG9yY2ggaW4gcGl4ZWxzICovCisJX191MzIJdnN5bmM7CQkvKiBWZXJ0aWNhbCBTeW5jIGxlbmd0aCBpbiBsaW5lcyAqLworCV9fdTMyCXZiYWNrcG9yY2g7CS8qIFZlcnRpY2FsIGJhY2sgcG9yY2ggaW4gbGluZXMgKi8KKwlfX3UzMglpbF92ZnJvbnRwb3JjaDsJLyogVmVydGljYWwgZnJvbnQgcG9yY2ggZm9yIGJvdHRvbSBmaWVsZCBvZgorCQkJCSAqIGludGVybGFjZWQgZmllbGQgZm9ybWF0cworCQkJCSAqLworCV9fdTMyCWlsX3ZzeW5jOwkvKiBWZXJ0aWNhbCBzeW5jIGxlbmd0aCBmb3IgYm90dG9tIGZpZWxkIG9mCisJCQkJICogaW50ZXJsYWNlZCBmaWVsZCBmb3JtYXRzCisJCQkJICovCisJX191MzIJaWxfdmJhY2twb3JjaDsJLyogVmVydGljYWwgYmFjayBwb3JjaCBmb3IgYm90dG9tIGZpZWxkIG9mCisJCQkJICogaW50ZXJsYWNlZCBmaWVsZCBmb3JtYXRzCisJCQkJICovCisJX191MzIJcmVzZXJ2ZWRbMTZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEludGVybGFjZWQgb3IgcHJvZ3Jlc3NpdmUgZm9ybWF0ICovCisjZGVmaW5lCVY0TDJfRFZfUFJPR1JFU1NJVkUJMAorI2RlZmluZQlWNEwyX0RWX0lOVEVSTEFDRUQJMQorCisvKiBQb2xhcml0aWVzLiBJZiBiaXQgaXMgbm90IHNldCwgaXQgaXMgYXNzdW1lZCB0byBiZSBuZWdhdGl2ZSBwb2xhcml0eSAqLworI2RlZmluZSBWNEwyX0RWX1ZTWU5DX1BPU19QT0wJMHgwMDAwMDAwMQorI2RlZmluZSBWNEwyX0RWX0hTWU5DX1BPU19QT0wJMHgwMDAwMDAwMgorCisKKy8qIERWIHRpbWluZ3MgKi8KK3N0cnVjdCB2NGwyX2R2X3RpbWluZ3MgeworCV9fdTMyIHR5cGU7CisJdW5pb24geworCQlzdHJ1Y3QgdjRsMl9idF90aW1pbmdzCWJ0OworCQlfX3UzMglyZXNlcnZlZFszMl07CisJfTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBWYWx1ZXMgZm9yIHRoZSB0eXBlIGZpZWxkICovCisjZGVmaW5lIFY0TDJfRFZfQlRfNjU2XzExMjAJMAkvKiBCVC42NTYvMTEyMCB0aW1pbmcgdHlwZSAqLworCisvKgorICoJViBJIEQgRSBPICAgSSBOIFAgVSBUIFMKKyAqLworc3RydWN0IHY0bDJfaW5wdXQgeworCV9fdTMyCSAgICAgaW5kZXg7CQkvKiAgV2hpY2ggaW5wdXQgKi8KKwlfX3U4CSAgICAgbmFtZVszMl07CQkvKiAgTGFiZWwgKi8KKwlfX3UzMgkgICAgIHR5cGU7CQkvKiAgVHlwZSBvZiBpbnB1dCAqLworCV9fdTMyCSAgICAgYXVkaW9zZXQ7CQkvKiAgQXNzb2NpYXRlZCBhdWRpb3MgKGJpdGZpZWxkKSAqLworCV9fdTMyICAgICAgICB0dW5lcjsgICAgICAgICAgICAgLyogIEFzc29jaWF0ZWQgdHVuZXIgKi8KKwl2NGwyX3N0ZF9pZCAgc3RkOworCV9fdTMyCSAgICAgc3RhdHVzOworCV9fdTMyCSAgICAgY2FwYWJpbGl0aWVzOworCV9fdTMyCSAgICAgcmVzZXJ2ZWRbM107Cit9OworCisvKiAgVmFsdWVzIGZvciB0aGUgJ3R5cGUnIGZpZWxkICovCisjZGVmaW5lIFY0TDJfSU5QVVRfVFlQRV9UVU5FUgkJMQorI2RlZmluZSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBCQkyCisKKy8qIGZpZWxkICdzdGF0dXMnIC0gZ2VuZXJhbCAqLworI2RlZmluZSBWNEwyX0lOX1NUX05PX1BPV0VSICAgIDB4MDAwMDAwMDEgIC8qIEF0dGFjaGVkIGRldmljZSBpcyBvZmYgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19TSUdOQUwgICAweDAwMDAwMDAyCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fQ09MT1IgICAgMHgwMDAwMDAwNAorCisvKiBmaWVsZCAnc3RhdHVzJyAtIHNlbnNvciBvcmllbnRhdGlvbiAqLworLyogSWYgc2Vuc29yIGlzIG1vdW50ZWQgdXBzaWRlIGRvd24gc2V0IGJvdGggYml0cyAqLworI2RlZmluZSBWNEwyX0lOX1NUX0hGTElQICAgICAgIDB4MDAwMDAwMTAgLyogRnJhbWVzIGFyZSBmbGlwcGVkIGhvcml6b250YWxseSAqLworI2RlZmluZSBWNEwyX0lOX1NUX1ZGTElQICAgICAgIDB4MDAwMDAwMjAgLyogRnJhbWVzIGFyZSBmbGlwcGVkIHZlcnRpY2FsbHkgKi8KKworLyogZmllbGQgJ3N0YXR1cycgLSBhbmFsb2cgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19IX0xPQ0sgICAweDAwMDAwMTAwICAvKiBObyBob3Jpem9udGFsIHN5bmMgbG9jayAqLworI2RlZmluZSBWNEwyX0lOX1NUX0NPTE9SX0tJTEwgIDB4MDAwMDAyMDAgIC8qIENvbG9yIGtpbGxlciBpcyBhY3RpdmUgKi8KKworLyogZmllbGQgJ3N0YXR1cycgLSBkaWdpdGFsICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fU1lOQyAgICAgMHgwMDAxMDAwMCAgLyogTm8gc3luY2hyb25pemF0aW9uIGxvY2sgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19FUVUgICAgICAweDAwMDIwMDAwICAvKiBObyBlcXVhbGl6ZXIgbG9jayAqLworI2RlZmluZSBWNEwyX0lOX1NUX05PX0NBUlJJRVIgIDB4MDAwNDAwMDAgIC8qIENhcnJpZXIgcmVjb3ZlcnkgZmFpbGVkICovCisKKy8qIGZpZWxkICdzdGF0dXMnIC0gVkNSIGFuZCBzZXQtdG9wIGJveCAqLworI2RlZmluZSBWNEwyX0lOX1NUX01BQ1JPVklTSU9OIDB4MDEwMDAwMDAgIC8qIE1hY3JvdmlzaW9uIGRldGVjdGVkICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fQUNDRVNTICAgMHgwMjAwMDAwMCAgLyogQ29uZGl0aW9uYWwgYWNjZXNzIGRlbmllZCAqLworI2RlZmluZSBWNEwyX0lOX1NUX1ZUUiAgICAgICAgIDB4MDQwMDAwMDAgIC8qIFZUUiB0aW1lIGNvbnN0YW50ICovCisKKy8qIGNhcGFiaWxpdGllcyBmbGFncyAqLworI2RlZmluZSBWNEwyX0lOX0NBUF9QUkVTRVRTCQkweDAwMDAwMDAxIC8qIFN1cHBvcnRzIFNfRFZfUFJFU0VUICovCisjZGVmaW5lIFY0TDJfSU5fQ0FQX0NVU1RPTV9USU1JTkdTCTB4MDAwMDAwMDIgLyogU3VwcG9ydHMgU19EVl9USU1JTkdTICovCisjZGVmaW5lIFY0TDJfSU5fQ0FQX1NURAkJCTB4MDAwMDAwMDQgLyogU3VwcG9ydHMgU19TVEQgKi8KKworLyoKKyAqCVYgSSBEIEUgTyAgIE8gVSBUIFAgVSBUIFMKKyAqLworc3RydWN0IHY0bDJfb3V0cHV0IHsKKwlfX3UzMgkgICAgIGluZGV4OwkJLyogIFdoaWNoIG91dHB1dCAqLworCV9fdTgJICAgICBuYW1lWzMyXTsJCS8qICBMYWJlbCAqLworCV9fdTMyCSAgICAgdHlwZTsJCS8qICBUeXBlIG9mIG91dHB1dCAqLworCV9fdTMyCSAgICAgYXVkaW9zZXQ7CQkvKiAgQXNzb2NpYXRlZCBhdWRpb3MgKGJpdGZpZWxkKSAqLworCV9fdTMyCSAgICAgbW9kdWxhdG9yOyAgICAgICAgIC8qICBBc3NvY2lhdGVkIG1vZHVsYXRvciAqLworCXY0bDJfc3RkX2lkICBzdGQ7CisJX191MzIJICAgICBjYXBhYmlsaXRpZXM7CisJX191MzIJICAgICByZXNlcnZlZFszXTsKK307CisvKiAgVmFsdWVzIGZvciB0aGUgJ3R5cGUnIGZpZWxkICovCisjZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfTU9EVUxBVE9SCQkxCisjZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfQU5BTE9HCQkJMgorI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX0FOQUxPR1ZHQU9WRVJMQVkJMworCisvKiBjYXBhYmlsaXRpZXMgZmxhZ3MgKi8KKyNkZWZpbmUgVjRMMl9PVVRfQ0FQX1BSRVNFVFMJCTB4MDAwMDAwMDEgLyogU3VwcG9ydHMgU19EVl9QUkVTRVQgKi8KKyNkZWZpbmUgVjRMMl9PVVRfQ0FQX0NVU1RPTV9USU1JTkdTCTB4MDAwMDAwMDIgLyogU3VwcG9ydHMgU19EVl9USU1JTkdTICovCisjZGVmaW5lIFY0TDJfT1VUX0NBUF9TVEQJCTB4MDAwMDAwMDQgLyogU3VwcG9ydHMgU19TVEQgKi8KKworLyoKKyAqCUMgTyBOIFQgUiBPIEwgUworICovCitzdHJ1Y3QgdjRsMl9jb250cm9sIHsKKwlfX3UzMgkJICAgICBpZDsKKwlfX3MzMgkJICAgICB2YWx1ZTsKK307CisKK3N0cnVjdCB2NGwyX2V4dF9jb250cm9sIHsKKwlfX3UzMiBpZDsKKwlfX3UzMiBzaXplOworCV9fdTMyIHJlc2VydmVkMlsxXTsKKwl1bmlvbiB7CisJCV9fczMyIHZhbHVlOworCQlfX3M2NCB2YWx1ZTY0OworCQljaGFyICpzdHJpbmc7CisJfTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgeworCV9fdTMyIGN0cmxfY2xhc3M7CisJX191MzIgY291bnQ7CisJX191MzIgZXJyb3JfaWR4OworCV9fdTMyIHJlc2VydmVkWzJdOworCXN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjb250cm9sczsKK307CisKKy8qICBWYWx1ZXMgZm9yIGN0cmxfY2xhc3MgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX1VTRVIgMHgwMDk4MDAwMAkvKiBPbGQtc3R5bGUgJ3VzZXInIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19NUEVHIDB4MDA5OTAwMDAJLyogTVBFRy1jb21wcmVzc2lvbiBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfQ0FNRVJBIDB4MDA5YTAwMDAJLyogQ2FtZXJhIGNsYXNzIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19GTV9UWCAweDAwOWIwMDAwCS8qIEZNIE1vZHVsYXRvciBjb250cm9sIGNsYXNzICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19GTEFTSCAweDAwOWMwMDAwCS8qIENhbWVyYSBmbGFzaCBjb250cm9scyAqLworCisjZGVmaW5lIFY0TDJfQ1RSTF9JRF9NQVNLICAgICAgCSAgKDB4MGZmZmZmZmYpCisjZGVmaW5lIFY0TDJfQ1RSTF9JRDJDTEFTUyhpZCkgICAgKChpZCkgJiAweDBmZmYwMDAwVUwpCisjZGVmaW5lIFY0TDJfQ1RSTF9EUklWRVJfUFJJVihpZCkgKCgoaWQpICYgMHhmZmZmKSA+PSAweDEwMDApCisKK2VudW0gdjRsMl9jdHJsX3R5cGUgeworCVY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIJICAgICA9IDEsCisJVjRMMl9DVFJMX1RZUEVfQk9PTEVBTgkgICAgID0gMiwKKwlWNEwyX0NUUkxfVFlQRV9NRU5VCSAgICAgPSAzLAorCVY0TDJfQ1RSTF9UWVBFX0JVVFRPTgkgICAgID0gNCwKKwlWNEwyX0NUUkxfVFlQRV9JTlRFR0VSNjQgICAgID0gNSwKKwlWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTICAgID0gNiwKKwlWNEwyX0NUUkxfVFlQRV9TVFJJTkcgICAgICAgID0gNywKKwlWNEwyX0NUUkxfVFlQRV9CSVRNQVNLICAgICAgID0gOCwKK307CisKKy8qICBVc2VkIGluIHRoZSBWSURJT0NfUVVFUllDVFJMIGlvY3RsIGZvciBxdWVyeWluZyBjb250cm9scyAqLworc3RydWN0IHY0bDJfcXVlcnljdHJsIHsKKwlfX3UzMgkJICAgICBpZDsKKwllbnVtIHY0bDJfY3RybF90eXBlICB0eXBlOworCV9fdTgJCSAgICAgbmFtZVszMl07CS8qIFdoYXRldmVyICovCisJX19zMzIJCSAgICAgbWluaW11bTsJLyogTm90ZSBzaWduZWRuZXNzICovCisJX19zMzIJCSAgICAgbWF4aW11bTsKKwlfX3MzMgkJICAgICBzdGVwOworCV9fczMyCQkgICAgIGRlZmF1bHRfdmFsdWU7CisJX191MzIgICAgICAgICAgICAgICAgZmxhZ3M7CisJX191MzIJCSAgICAgcmVzZXJ2ZWRbMl07Cit9OworCisvKiAgVXNlZCBpbiB0aGUgVklESU9DX1FVRVJZTUVOVSBpb2N0bCBmb3IgcXVlcnlpbmcgbWVudSBpdGVtcyAqLworc3RydWN0IHY0bDJfcXVlcnltZW51IHsKKwlfX3UzMgkJaWQ7CisJX191MzIJCWluZGV4OworCV9fdTgJCW5hbWVbMzJdOwkvKiBXaGF0ZXZlciAqLworCV9fdTMyCQlyZXNlcnZlZDsKK307CisKKy8qICBDb250cm9sIGZsYWdzICAqLworI2RlZmluZSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRAkJMHgwMDAxCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX0dSQUJCRUQJCTB4MDAwMgorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19SRUFEX09OTFkgCTB4MDAwNAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19VUERBVEUgCQkweDAwMDgKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkUgCTB4MDAxMAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19TTElERVIgCQkweDAwMjAKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWSAJMHgwMDQwCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFCQkweDAwODAKKworLyogIFF1ZXJ5IGZsYWcsIHRvIGJlIE9SZWQgd2l0aCB0aGUgY29udHJvbCBJRCAqLworI2RlZmluZSBWNEwyX0NUUkxfRkxBR19ORVhUX0NUUkwJMHg4MDAwMDAwMAorCisvKiAgVXNlci1jbGFzcyBjb250cm9sIElEcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfTUFYX0NUUkxTCQkxMDI0CisjZGVmaW5lIFY0TDJfQ0lEX0JBU0UJCQkoVjRMMl9DVFJMX0NMQVNTX1VTRVIgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfVVNFUl9CQVNFIAkJVjRMMl9DSURfQkFTRQorLyogIElEcyByZXNlcnZlZCBmb3IgZHJpdmVyIHNwZWNpZmljIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRQkJMHgwODAwMDAwMAorCisjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQ0xBU1MgCQkoVjRMMl9DVFJMX0NMQVNTX1VTRVIgfCAxKQorI2RlZmluZSBWNEwyX0NJRF9CUklHSFRORVNTCQkoVjRMMl9DSURfQkFTRSswKQorI2RlZmluZSBWNEwyX0NJRF9DT05UUkFTVAkJKFY0TDJfQ0lEX0JBU0UrMSkKKyNkZWZpbmUgVjRMMl9DSURfU0FUVVJBVElPTgkJKFY0TDJfQ0lEX0JBU0UrMikKKyNkZWZpbmUgVjRMMl9DSURfSFVFCQkJKFY0TDJfQ0lEX0JBU0UrMykKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fVk9MVU1FCQkoVjRMMl9DSURfQkFTRSs1KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFCQkoVjRMMl9DSURfQkFTRSs2KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19CQVNTCQkoVjRMMl9DSURfQkFTRSs3KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19UUkVCTEUJCShWNEwyX0NJRF9CQVNFKzgpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX01VVEUJCShWNEwyX0NJRF9CQVNFKzkpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTCQkoVjRMMl9DSURfQkFTRSsxMCkKKyNkZWZpbmUgVjRMMl9DSURfQkxBQ0tfTEVWRUwJCShWNEwyX0NJRF9CQVNFKzExKSAvKiBEZXByZWNhdGVkICovCisjZGVmaW5lIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRQkoVjRMMl9DSURfQkFTRSsxMikKKyNkZWZpbmUgVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRQkoVjRMMl9DSURfQkFTRSsxMykKKyNkZWZpbmUgVjRMMl9DSURfUkVEX0JBTEFOQ0UJCShWNEwyX0NJRF9CQVNFKzE0KQorI2RlZmluZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UJCShWNEwyX0NJRF9CQVNFKzE1KQorI2RlZmluZSBWNEwyX0NJRF9HQU1NQQkJCShWNEwyX0NJRF9CQVNFKzE2KQorI2RlZmluZSBWNEwyX0NJRF9XSElURU5FU1MJCShWNEwyX0NJRF9HQU1NQSkgLyogRGVwcmVjYXRlZCAqLworI2RlZmluZSBWNEwyX0NJRF9FWFBPU1VSRQkJKFY0TDJfQ0lEX0JBU0UrMTcpCisjZGVmaW5lIFY0TDJfQ0lEX0FVVE9HQUlOCQkoVjRMMl9DSURfQkFTRSsxOCkKKyNkZWZpbmUgVjRMMl9DSURfR0FJTgkJCShWNEwyX0NJRF9CQVNFKzE5KQorI2RlZmluZSBWNEwyX0NJRF9IRkxJUAkJCShWNEwyX0NJRF9CQVNFKzIwKQorI2RlZmluZSBWNEwyX0NJRF9WRkxJUAkJCShWNEwyX0NJRF9CQVNFKzIxKQorCisvKiBEZXByZWNhdGVkOyB1c2UgVjRMMl9DSURfUEFOX1JFU0VUIGFuZCBWNEwyX0NJRF9USUxUX1JFU0VUICovCisjZGVmaW5lIFY0TDJfQ0lEX0hDRU5URVIJCShWNEwyX0NJRF9CQVNFKzIyKQorI2RlZmluZSBWNEwyX0NJRF9WQ0VOVEVSCQkoVjRMMl9DSURfQkFTRSsyMykKKworI2RlZmluZSBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWQkoVjRMMl9DSURfQkFTRSsyNCkKK2VudW0gdjRsMl9wb3dlcl9saW5lX2ZyZXF1ZW5jeSB7CisJVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfRElTQUJMRUQJPSAwLAorCVY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZXzUwSFoJPSAxLAorCVY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZXzYwSFoJPSAyLAorCVY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZX0FVVE8JPSAzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfSFVFX0FVVE8JCQkoVjRMMl9DSURfQkFTRSsyNSkKKyNkZWZpbmUgVjRMMl9DSURfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRQkoVjRMMl9DSURfQkFTRSsyNikKKyNkZWZpbmUgVjRMMl9DSURfU0hBUlBORVNTCQkJKFY0TDJfQ0lEX0JBU0UrMjcpCisjZGVmaW5lIFY0TDJfQ0lEX0JBQ0tMSUdIVF9DT01QRU5TQVRJT04gCShWNEwyX0NJRF9CQVNFKzI4KQorI2RlZmluZSBWNEwyX0NJRF9DSFJPTUFfQUdDICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMjkpCisjZGVmaW5lIFY0TDJfQ0lEX0NPTE9SX0tJTExFUiAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSszMCkKKyNkZWZpbmUgVjRMMl9DSURfQ09MT1JGWAkJCShWNEwyX0NJRF9CQVNFKzMxKQorZW51bSB2NGwyX2NvbG9yZnggeworCVY0TDJfQ09MT1JGWF9OT05FCT0gMCwKKwlWNEwyX0NPTE9SRlhfQlcJCT0gMSwKKwlWNEwyX0NPTE9SRlhfU0VQSUEJPSAyLAorCVY0TDJfQ09MT1JGWF9ORUdBVElWRSA9IDMsCisJVjRMMl9DT0xPUkZYX0VNQk9TUyA9IDQsCisJVjRMMl9DT0xPUkZYX1NLRVRDSCA9IDUsCisJVjRMMl9DT0xPUkZYX1NLWV9CTFVFID0gNiwKKwlWNEwyX0NPTE9SRlhfR1JBU1NfR1JFRU4gPSA3LAorCVY0TDJfQ09MT1JGWF9TS0lOX1dISVRFTiA9IDgsCisJVjRMMl9DT0xPUkZYX1ZJVklEID0gOSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX0FVVE9CUklHSFRORVNTCQkJKFY0TDJfQ0lEX0JBU0UrMzIpCisjZGVmaW5lIFY0TDJfQ0lEX0JBTkRfU1RPUF9GSUxURVIJCShWNEwyX0NJRF9CQVNFKzMzKQorCisjZGVmaW5lIFY0TDJfQ0lEX1JPVEFURQkJCQkoVjRMMl9DSURfQkFTRSszNCkKKyNkZWZpbmUgVjRMMl9DSURfQkdfQ09MT1IJCQkoVjRMMl9DSURfQkFTRSszNSkKKworI2RlZmluZSBWNEwyX0NJRF9DSFJPTUFfR0FJTiAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzYpCisKKyNkZWZpbmUgVjRMMl9DSURfSUxMVU1JTkFUT1JTXzEJCQkoVjRMMl9DSURfQkFTRSszNykKKyNkZWZpbmUgVjRMMl9DSURfSUxMVU1JTkFUT1JTXzIJCQkoVjRMMl9DSURfQkFTRSszOCkKKworI2RlZmluZSBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfQ0FQVFVSRQkoVjRMMl9DSURfQkFTRSszOSkKKyNkZWZpbmUgVjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX09VVFBVVAkJKFY0TDJfQ0lEX0JBU0UrNDApCisKKy8qIGxhc3QgQ0lEICsgMSAqLworI2RlZmluZSBWNEwyX0NJRF9MQVNUUDEgICAgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrNDEpCisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIGJ1ZmZlciBuZWVkZSBieSB0aGUgZGV2aWNlICovCisKKy8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIGRlZmluZWQgYnkgVjRMMiAqLworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0JBU0UgCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMHg5MDApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ0xBU1MgCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMSkKKworLyogIE1QRUcgc3RyZWFtcywgc3BlY2lmaWMgdG8gbXVsdGlwbGV4ZWQgc3RyZWFtcyAqLworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSswKQorZW51bSB2NGwyX21wZWdfc3RyZWFtX3R5cGUgeworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9QUyAgID0gMCwgLyogTVBFRy0yIHByb2dyYW0gc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1RTICAgPSAxLCAvKiBNUEVHLTIgdHJhbnNwb3J0IHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMV9TUyAgID0gMiwgLyogTVBFRy0xIHN5c3RlbSBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfRFZEICA9IDMsIC8qIE1QRUctMiBEVkQtY29tcGF0aWJsZSBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzFfVkNEICA9IDQsIC8qIE1QRUctMSBWQ0QtY29tcGF0aWJsZSBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfU1ZDRCA9IDUsIC8qIE1QRUctMiBTVkNELWNvbXBhdGlibGUgc3RyZWFtICovCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUE1UIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfQVVESU8gCQkoVjRMMl9DSURfTVBFR19CQVNFKzIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9WSURFTyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BDUiAJCShWNEwyX0NJRF9NUEVHX0JBU0UrNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX0FVRElPIAkoVjRMMl9DSURfTVBFR19CQVNFKzUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9WSURFTyAJKFY0TDJfQ0lEX01QRUdfQkFTRSs2KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9WQklfRk1UIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs3KQorZW51bSB2NGwyX21wZWdfc3RyZWFtX3ZiaV9mbXQgeworCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FID0gMCwgIC8qIE5vIFZCSSBpbiB0aGUgTVBFRyBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfSVZUViA9IDEsICAvKiBWQkkgaW4gcHJpdmF0ZSBwYWNrZXRzLCBJVlRWIGZvcm1hdCAqLworfTsKKworLyogIE1QRUcgYXVkaW8gY29udHJvbHMgc3BlY2lmaWMgdG8gbXVsdGlwbGV4ZWQgc3RyZWFtcyAgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVRIAkoVjRMMl9DSURfTVBFR19CQVNFKzEwMCkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX3NhbXBsaW5nX2ZyZXEgeworCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ0MTAwID0gMCwKKwlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV80ODAwMCA9IDEsCisJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfMzIwMDAgPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTAxKQorZW51bSB2NGwyX21wZWdfYXVkaW9fZW5jb2RpbmcgeworCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8xID0gMCwKKwlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMiA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzMgPSAyLAorCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19BQUMgICAgID0gMywKKwlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfQUMzICAgICA9IDQsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwMikKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2wxX2JpdHJhdGUgeworCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzMySyAgPSAwLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzY0SyAgPSAxLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzk2SyAgPSAyLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzEyOEsgPSAzLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzE2MEsgPSA0LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzE5MksgPSA1LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzIyNEsgPSA2LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzI1NksgPSA3LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzI4OEsgPSA4LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzMyMEsgPSA5LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzM1MksgPSAxMCwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zODRLID0gMTEsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfNDE2SyA9IDEyLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzQ0OEsgPSAxMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTAzKQorZW51bSB2NGwyX21wZWdfYXVkaW9fbDJfYml0cmF0ZSB7CisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzJLICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfNDhLICA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfNTZLICA9IDIsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfNjRLICA9IDMsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfODBLICA9IDQsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfOTZLICA9IDUsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTEySyA9IDYsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTI4SyA9IDcsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTYwSyA9IDgsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTkySyA9IDksCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMjI0SyA9IDEwLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzI1NksgPSAxMSwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zMjBLID0gMTIsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzg0SyA9IDEzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDQpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19sM19iaXRyYXRlIHsKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8zMksgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV80MEsgID0gMSwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV80OEsgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV81NksgID0gMywKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV82NEsgID0gNCwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV84MEsgID0gNSwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV85NksgID0gNiwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xMTJLID0gNywKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xMjhLID0gOCwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xNjBLID0gOSwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xOTJLID0gMTAsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMjI0SyA9IDExLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzI1NksgPSAxMiwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8zMjBLID0gMTMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwNSkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX21vZGUgeworCVY0TDJfTVBFR19BVURJT19NT0RFX1NURVJFTyAgICAgICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX01PREVfSk9JTlRfU1RFUkVPID0gMSwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9EVUFMICAgICAgICAgPSAyLAorCVY0TDJfTVBFR19BVURJT19NT0RFX01PTk8gICAgICAgICA9IDMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OIAkoVjRMMl9DSURfTVBFR19CQVNFKzEwNikKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX21vZGVfZXh0ZW5zaW9uIHsKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfNCAgPSAwLAorCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF84ICA9IDEsCisJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzEyID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfMTYgPSAzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19FTVBIQVNJUyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA3KQorZW51bSB2NGwyX21wZWdfYXVkaW9fZW1waGFzaXMgeworCVY0TDJfTVBFR19BVURJT19FTVBIQVNJU19OT05FICAgICAgICAgPSAwLAorCVY0TDJfTVBFR19BVURJT19FTVBIQVNJU181MF9ESVZfMTVfdVMgPSAxLAorCVY0TDJfTVBFR19BVURJT19FTVBIQVNJU19DQ0lUVF9KMTcgICAgPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19DUkMgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwOCkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2NyYyB7CisJVjRMMl9NUEVHX0FVRElPX0NSQ19OT05FICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0NSQ19DUkMxNiA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX01VVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwOSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19BQUNfQklUUkFURQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMTApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fQUMzX0JJVFJBVEUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTExKQorZW51bSB2NGwyX21wZWdfYXVkaW9fYWMzX2JpdHJhdGUgeworCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8zMksgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNDBLICA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzQ4SyAgPSAyLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV81NksgID0gMywKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNjRLICA9IDQsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzgwSyAgPSA1LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV85NksgID0gNiwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMTEySyA9IDcsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzEyOEsgPSA4LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8xNjBLID0gOSwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMTkySyA9IDEwLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8yMjRLID0gMTEsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzI1NksgPSAxMiwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMzIwSyA9IDEzLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8zODRLID0gMTQsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzQ0OEsgPSAxNSwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNTEySyA9IDE2LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV81NzZLID0gMTcsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzY0MEsgPSAxOCwKK307CisKKy8qICBNUEVHIHZpZGVvIGNvbnRyb2xzIHNwZWNpZmljIHRvIG11bHRpcGxleGVkIHN0cmVhbXMgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAwKQorZW51bSB2NGwyX21wZWdfdmlkZW9fZW5jb2RpbmcgeworCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEgICAgID0gMCwKKwlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yICAgICA9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNF9BVkMgPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1QgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMSkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2FzcGVjdCB7CisJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEgICAgID0gMCwKKwlWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4MyAgICAgPSAxLAorCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OSAgICA9IDIsCisJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8yMjF4MTAwID0gMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVMgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFIAkoVjRMMl9DSURfTVBFR19CQVNFKzIwNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTiAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERSAJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDYpCitlbnVtIHY0bDJfbXBlZ192aWRlb19iaXRyYXRlX21vZGUgeworCVY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSID0gMCwKKwlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX0NCUiA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwNykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUsgCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT04gKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjEwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEVfWVVWIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fREVDT0RFUl9TTElDRV9JTlRFUkZBQ0UJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjEyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0RFQ09ERVJfTVBFRzRfREVCTE9DS19GSUxURVIJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQ1lDTElDX0lOVFJBX1JFRlJFU0hfTUIJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0ZSQU1FX1JDX0VOQUJMRQkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0hFQURFUl9NT0RFCQkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE2KQorZW51bSB2NGwyX21wZWdfdmlkZW9faGVhZGVyX21vZGUgeworCVY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9TRVBBUkFURQkJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fSEVBREVSX01PREVfSk9JTkVEX1dJVEhfMVNUX0ZSQU1FCT0gMSwKKworfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NQVhfUkVGX1BJQwkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01CX1JDX0VOQUJMRQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTgpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTUFYX0JZVEVTCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE5KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01BWF9NQgkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMjApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMjEpCitlbnVtIHY0bDJfbXBlZ192aWRlb19tdWx0aV9zbGljZV9tb2RlIHsKKwlWNEwyX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERV9TSU5HTEUJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fTVVMVElfU0lDRV9NT0RFX01BWF9NQgkJPSAxLAorCVY0TDJfTVBFR19WSURFT19NVUxUSV9TSUNFX01PREVfTUFYX0JZVEVTCT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVkJWX1NJWkUJCQkoVjRMMl9DSURfTVBFR19CQVNFKzIyMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX0lfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzAwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfUF9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszMDEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19CX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzMwMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX01JTl9RUAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzAzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfTUFYX1FQCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszMDQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9JX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1MCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1BfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzUxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfQl9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9NSU5fUVAJCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1MykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X01BWF9RUAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfOFg4X1RSQU5TRk9STQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9DUEJfU0laRQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTYpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU3KQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9lbnRyb3B5X21vZGUgeworCVY0TDJfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERV9DQVZMQwk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfRU5UUk9QWV9NT0RFX0NBQkFDCT0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9JX1BFUklPRAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTgpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MRVZFTAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU5KQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9sZXZlbCB7CisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8wCT0gMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xQgk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8xCT0gMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzIJPSAzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMwk9IDQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8wCT0gNSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzEJPSA2LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMgk9IDcsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18wCT0gOCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzEJPSA5LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMgk9IDEwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMAk9IDExLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMQk9IDEyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMgk9IDEzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzVfMAk9IDE0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzVfMQk9IDE1LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX0FMUEhBCShWNEwyX0NJRF9NUEVHX0JBU0UrMzYwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfQkVUQQkoVjRMMl9DSURfTVBFR19CQVNFKzM2MSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREUJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjIpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X2xvb3BfZmlsdGVyX21vZGUgeworCVY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRU5BQkxFRAkJCQk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERV9ESVNBQkxFRAkJCQk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERV9ESVNBQkxFRF9BVF9TTElDRV9CT1VOREFSWQk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjMpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X3Byb2ZpbGUgeworCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQkFTRUxJTkUJCQk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9DT05TVFJBSU5FRF9CQVNFTElORQk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9NQUlOCQkJPSAyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfRVhURU5ERUQJCQk9IDMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdICQkJPSA0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF8xMAkJCT0gNSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDIyCQkJPSA2LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80NDRfUFJFRElDVElWRQk9IDcsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzEwX0lOVFJBCQk9IDgsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQyMl9JTlRSQQkJPSA5LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80NDRfSU5UUkEJCT0gMTAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9DQVZMQ180NDRfSU5UUkEJCT0gMTEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TQ0FMQUJMRV9CQVNFTElORQkJPSAxMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NDQUxBQkxFX0hJR0gJCT0gMTMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TQ0FMQUJMRV9ISUdIX0lOVFJBCT0gMTQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TVEVSRU9fSElHSAkJPSAxNSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX01VTFRJVklFV19ISUdICQk9IDE2LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9FWFRfU0FSX0hFSUdIVAkoVjRMMl9DSURfTVBFR19CQVNFKzM2NCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9FWFRfU0FSX1dJRFRICShWNEwyX0NJRF9NUEVHX0JBU0UrMzY1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9FTkFCTEUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzY2KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JREMJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzY3KQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF92dWlfc2FyX2lkYyB7CisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfVU5TUEVDSUZJRUQJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzF4MQkJPSAxLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzEyeDExCQk9IDIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTB4MTEJCT0gMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xNngxMQkJPSA0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzQweDMzCQk9IDUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMjR4MTEJCT0gNiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18yMHgxMQkJPSA3LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzMyeDExCQk9IDgsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfODB4MzMJCT0gOSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xOHgxMQkJPSAxMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xNXgxMQkJPSAxMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ182NHgzMwkJPSAxMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xNjB4OTkJCT0gMTMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfNHgzCQk9IDE0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzN4MgkJPSAxNSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18yeDEJCT0gMTYsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfRVhURU5ERUQJPSAxNywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfSV9GUkFNRV9RUAkoVjRMMl9DSURfTVBFR19CQVNFKzQwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9QX0ZSQU1FX1FQCShWNEwyX0NJRF9NUEVHX0JBU0UrNDAxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X0JfRlJBTUVfUVAJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTUlOX1FQCShWNEwyX0NJRF9NUEVHX0JBU0UrNDAzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X01BWF9RUAkoVjRMMl9DSURfTVBFR19CQVNFKzQwNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9MRVZFTAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDUpCitlbnVtIHY0bDJfbXBlZ192aWRlb19tcGVnNF9sZXZlbCB7CisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzAJPSAwLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8wQgk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzEJPSAyLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8yCT0gMywKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMwk9IDQsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzNCCT0gNSwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfNAk9IDYsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzUJPSA3LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFCShWNEwyX0NJRF9NUEVHX0JBU0UrNDA2KQorZW51bSB2NGwyX21wZWdfdmlkZW9fbXBlZzRfcHJvZmlsZSB7CisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfU0lNUExFCQkJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9BRFZBTkNFRF9TSU1QTEUJCQk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfQ09SRQkJCQk9IDIsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfU0lNUExFX1NDQUxBQkxFCQkJPSAzLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX0FEVkFOQ0VEX0NPRElOR19FRkZJQ0lFTkNZCT0gNCwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUVBFTAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDcpCisKKy8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIHNwZWNpZmljIHRvIHRoZSBDWDIzNDF4IGRyaXZlciBhcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UgCQkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDB4MTAwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSswKQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFX01BTlVBTCA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9BVVRPICAgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSIAkJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsyKQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGUgeworCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV9PRkYgICAgICAgICAgICAgICAgICA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX0hPUiAgICAgICAgICAgICAgID0gMSwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMURfVkVSVCAgICAgICAgICAgICAgPSAyLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV8yRF9IVl9TRVBBUkFCTEUgICAgICA9IDMsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzJEX1NZTV9OT05fU0VQQVJBQkxFID0gNCwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRSAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzMpCitlbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRV9PRkYgICAgPSAwLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX0hPUiA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs0KQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfTUFOVUFMID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERV9BVVRPICAgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUiAJCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFIAkJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzYpCitlbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX21lZGlhbl9maWx0ZXJfdHlwZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX09GRiAgICAgID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfSE9SICAgICAgPSAxLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9WRVJUICAgICA9IDIsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX0hPUl9WRVJUID0gMywKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfRElBRyAgICAgPSA0LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9CT1RUT00gCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX1RPUCAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzgpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9CT1RUT00JKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9UT1AgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1NUUkVBTV9JTlNFUlRfTkFWX1BBQ0tFVFMgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxMSkKKworLyogIE1QRUctY2xhc3MgY29udHJvbCBJRHMgc3BlY2lmaWMgdG8gdGhlIFNhbXN1bmcgTUZDIDUuMSBkcml2ZXIgYXMgZGVmaW5lZCBieSBWNEwyICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRQkJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAweDExMDApCisKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19ERUNPREVSX0gyNjRfRElTUExBWV9ERUxBWQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSswKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0RFQ09ERVJfSDI2NF9ESVNQTEFZX0RFTEFZX0VOQUJMRQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSsyKQorZW51bSB2NGwyX21wZWdfbWZjNTFfdmlkZW9fZnJhbWVfc2tpcF9tb2RlIHsKKwlWNEwyX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFX0RJU0FCTEVECQk9IDAsCisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9MRVZFTF9MSU1JVAk9IDEsCisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9CVUZfTElNSVQJCT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRQkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrMykKK2VudW0gdjRsMl9tcGVnX21mYzUxX3ZpZGVvX2ZvcmNlX2ZyYW1lX3R5cGUgeworCVY0TDJfTVBFR19NRkM1MV9WSURFT19GT1JDRV9GUkFNRV9UWVBFX0RJU0FCTEVECQk9IDAsCisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEVfSV9GUkFNRQkJPSAxLAorCVY0TDJfTVBFR19NRkM1MV9WSURFT19GT1JDRV9GUkFNRV9UWVBFX05PVF9DT0RFRAk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1BBRERJTkcJCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1BBRERJTkdfWVVWCQkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19SQ19GSVhFRF9UQVJHRVRfQklUCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs2KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1JDX1JFQUNUSU9OX0NPRUZGCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfQUNUSVZJVFkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNTApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19EQVJLCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1MSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX1NNT09USAkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1MikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX1NUQVRJQwkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1MykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X05VTV9SRUZfUElDX0ZPUl9QCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzU0KQorCisvKiAgQ2FtZXJhIGNsYXNzIGNvbnRyb2wgSURzICovCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFIAkoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQ0xBU1MgCQkoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDEpCisKKyNkZWZpbmUgVjRMMl9DSURfRVhQT1NVUkVfQVVUTwkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxKQorZW51bSAgdjRsMl9leHBvc3VyZV9hdXRvX3R5cGUgeworCVY0TDJfRVhQT1NVUkVfQVVUTyA9IDAsCisJVjRMMl9FWFBPU1VSRV9NQU5VQUwgPSAxLAorCVY0TDJfRVhQT1NVUkVfU0hVVFRFUl9QUklPUklUWSA9IDIsCisJVjRMMl9FWFBPU1VSRV9BUEVSVFVSRV9QUklPUklUWSA9IDMKK307CisjZGVmaW5lIFY0TDJfQ0lEX0VYUE9TVVJFX0FCU09MVVRFCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMikKKyNkZWZpbmUgVjRMMl9DSURfRVhQT1NVUkVfQVVUT19QUklPUklUWQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzMpCisKKyNkZWZpbmUgVjRMMl9DSURfUEFOX1JFTEFUSVZFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzQpCisjZGVmaW5lIFY0TDJfQ0lEX1RJTFRfUkVMQVRJVkUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrNSkKKyNkZWZpbmUgVjRMMl9DSURfUEFOX1JFU0VUCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzYpCisjZGVmaW5lIFY0TDJfQ0lEX1RJTFRfUkVTRVQJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrNykKKworI2RlZmluZSBWNEwyX0NJRF9QQU5fQUJTT0xVVEUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrOCkKKyNkZWZpbmUgVjRMMl9DSURfVElMVF9BQlNPTFVURQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSs5KQorCisjZGVmaW5lIFY0TDJfQ0lEX0ZPQ1VTX0FCU09MVVRFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzEwKQorI2RlZmluZSBWNEwyX0NJRF9GT0NVU19SRUxBVElWRQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxMSkKKyNkZWZpbmUgVjRMMl9DSURfRk9DVVNfQVVUTwkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxMikKKworI2RlZmluZSBWNEwyX0NJRF9aT09NX0FCU09MVVRFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzEzKQorI2RlZmluZSBWNEwyX0NJRF9aT09NX1JFTEFUSVZFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE0KQorI2RlZmluZSBWNEwyX0NJRF9aT09NX0NPTlRJTlVPVVMJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxNSkKKworI2RlZmluZSBWNEwyX0NJRF9QUklWQUNZCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE2KQorCisjZGVmaW5lIFY0TDJfQ0lEX0lSSVNfQUJTT0xVVEUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTcpCisjZGVmaW5lIFY0TDJfQ0lEX0lSSVNfUkVMQVRJVkUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTgpCisKKy8qIEZNIE1vZHVsYXRvciBjbGFzcyBjb250cm9sIElEcyAqLworI2RlZmluZSBWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFCQkoVjRMMl9DVFJMX0NMQVNTX0ZNX1RYIHwgMHg5MDApCisjZGVmaW5lIFY0TDJfQ0lEX0ZNX1RYX0NMQVNTCQkJKFY0TDJfQ1RSTF9DTEFTU19GTV9UWCB8IDEpCisKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX0RFVklBVElPTgkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxKQorI2RlZmluZSBWNEwyX0NJRF9SRFNfVFhfUEkJCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDIpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9QVFkJCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDMpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9QU19OQU1FCQkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA1KQorI2RlZmluZSBWNEwyX0NJRF9SRFNfVFhfUkFESU9fVEVYVAkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA2KQorCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0xJTUlURVJfRU5BQkxFRAkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA2NCkKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fTElNSVRFUl9SRUxFQVNFX1RJTUUJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA2NSkKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fTElNSVRFUl9ERVZJQVRJT04JKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA2NikKKworI2RlZmluZSBWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9FTkFCTEVECShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgODApCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0NPTVBSRVNTSU9OX0dBSU4JCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgODEpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0NPTVBSRVNTSU9OX1RIUkVTSE9MRAkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDgyKQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9BVFRBQ0tfVElNRQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDgzKQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9SRUxFQVNFX1RJTUUJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA4NCkKKworI2RlZmluZSBWNEwyX0NJRF9QSUxPVF9UT05FX0VOQUJMRUQJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgOTYpCisjZGVmaW5lIFY0TDJfQ0lEX1BJTE9UX1RPTkVfREVWSUFUSU9OCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDk3KQorI2RlZmluZSBWNEwyX0NJRF9QSUxPVF9UT05FX0ZSRVFVRU5DWQkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA5OCkKKworI2RlZmluZSBWNEwyX0NJRF9UVU5FX1BSRUVNUEhBU0lTCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDExMikKK2VudW0gdjRsMl9wcmVlbXBoYXNpcyB7CisJVjRMMl9QUkVFTVBIQVNJU19ESVNBQkxFRAk9IDAsCisJVjRMMl9QUkVFTVBIQVNJU181MF91UwkJPSAxLAorCVY0TDJfUFJFRU1QSEFTSVNfNzVfdVMJCT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX1RVTkVfUE9XRVJfTEVWRUwJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMTEzKQorI2RlZmluZSBWNEwyX0NJRF9UVU5FX0FOVEVOTkFfQ0FQQUNJVE9SCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDExNCkKKworLyogRmxhc2ggYW5kIHByaXZhY3kgKGluZGljYXRvcikgbGlnaHQgY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRQkJKFY0TDJfQ1RSTF9DTEFTU19GTEFTSCB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9DTEFTUwkJCShWNEwyX0NUUkxfQ0xBU1NfRkxBU0ggfCAxKQorCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0xFRF9NT0RFCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAxKQorZW51bSB2NGwyX2ZsYXNoX2xlZF9tb2RlIHsKKwlWNEwyX0ZMQVNIX0xFRF9NT0RFX05PTkUsCisJVjRMMl9GTEFTSF9MRURfTU9ERV9GTEFTSCwKKwlWNEwyX0ZMQVNIX0xFRF9NT0RFX1RPUkNILAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU09VUkNFCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDIpCitlbnVtIHY0bDJfZmxhc2hfc3Ryb2JlX3NvdXJjZSB7CisJVjRMMl9GTEFTSF9TVFJPQkVfU09VUkNFX1NPRlRXQVJFLAorCVY0TDJfRkxBU0hfU1RST0JFX1NPVVJDRV9FWFRFUk5BTCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfU1RST0JFCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAzKQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU1RPUAkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA0KQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU1RBVFVTCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDUpCisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfVElNRU9VVAkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgNikKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfSU5URU5TSVRZCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDcpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1RPUkNIX0lOVEVOU0lUWQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA4KQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9JTkRJQ0FUT1JfSU5URU5TSVRZCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgOSkKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9GQVVMVAkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMTApCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9WT0xUQUdFCQkoMSA8PCAwKQorI2RlZmluZSBWNEwyX0ZMQVNIX0ZBVUxUX1RJTUVPVVQJCSgxIDw8IDEpCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9URU1QRVJBVFVSRQkoMSA8PCAyKQorI2RlZmluZSBWNEwyX0ZMQVNIX0ZBVUxUX1NIT1JUX0NJUkNVSVQJCSgxIDw8IDMpCisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfQ0hBUkdFCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAxMSkKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfUkVBRFkJCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDEyKQorCisvKgorICoJVCBVIE4gSSBOIEcKKyAqLworc3RydWN0IHY0bDJfdHVuZXIgeworCV9fdTMyICAgICAgICAgICAgICAgICAgIGluZGV4OworCV9fdTgJCQluYW1lWzMyXTsKKwllbnVtIHY0bDJfdHVuZXJfdHlwZSAgICB0eXBlOworCV9fdTMyCQkJY2FwYWJpbGl0eTsKKwlfX3UzMgkJCXJhbmdlbG93OworCV9fdTMyCQkJcmFuZ2VoaWdoOworCV9fdTMyCQkJcnhzdWJjaGFuczsKKwlfX3UzMgkJCWF1ZG1vZGU7CisJX19zMzIJCQlzaWduYWw7CisJX19zMzIJCQlhZmM7CisJX191MzIJCQlyZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCB2NGwyX21vZHVsYXRvciB7CisJX191MzIJCQlpbmRleDsKKwlfX3U4CQkJbmFtZVszMl07CisJX191MzIJCQljYXBhYmlsaXR5OworCV9fdTMyCQkJcmFuZ2Vsb3c7CisJX191MzIJCQlyYW5nZWhpZ2g7CisJX191MzIJCQl0eHN1YmNoYW5zOworCV9fdTMyCQkJcmVzZXJ2ZWRbNF07Cit9OworCisvKiAgRmxhZ3MgZm9yIHRoZSAnY2FwYWJpbGl0eScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfTE9XCQkweDAwMDEKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfTk9STQkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1NURVJFTwkJMHgwMDEwCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX0xBTkcyCQkweDAwMjAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfU0FQCQkweDAwMjAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfTEFORzEJCTB4MDA0MAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9SRFMJCTB4MDA4MAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9SRFNfQkxPQ0tfSU8JMHgwMTAwCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1JEU19DT05UUk9MUwkweDAyMDAKKworLyogIEZsYWdzIGZvciB0aGUgJ3J4c3ViY2hhbnMnIGZpZWxkICovCisjZGVmaW5lIFY0TDJfVFVORVJfU1VCX01PTk8JCTB4MDAwMQorI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9TVEVSRU8JCTB4MDAwMgorI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9MQU5HMgkJMHgwMDA0CisjZGVmaW5lIFY0TDJfVFVORVJfU1VCX1NBUAkJMHgwMDA0CisjZGVmaW5lIFY0TDJfVFVORVJfU1VCX0xBTkcxCQkweDAwMDgKKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfUkRTCQkweDAwMTAKKworLyogIFZhbHVlcyBmb3IgdGhlICdhdWRtb2RlJyBmaWVsZCAqLworI2RlZmluZSBWNEwyX1RVTkVSX01PREVfTU9OTwkJMHgwMDAwCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9TVEVSRU8JCTB4MDAwMQorI2RlZmluZSBWNEwyX1RVTkVSX01PREVfTEFORzIJCTB4MDAwMgorI2RlZmluZSBWNEwyX1RVTkVSX01PREVfU0FQCQkweDAwMDIKKyNkZWZpbmUgVjRMMl9UVU5FUl9NT0RFX0xBTkcxCQkweDAwMDMKKyNkZWZpbmUgVjRMMl9UVU5FUl9NT0RFX0xBTkcxX0xBTkcyCTB4MDAwNAorCitzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgeworCV9fdTMyCQkgICAgICB0dW5lcjsKKwllbnVtIHY0bDJfdHVuZXJfdHlwZSAgdHlwZTsKKwlfX3UzMgkJICAgICAgZnJlcXVlbmN5OworCV9fdTMyCQkgICAgICByZXNlcnZlZFs4XTsKK307CisKK3N0cnVjdCB2NGwyX2h3X2ZyZXFfc2VlayB7CisJX191MzIJCSAgICAgIHR1bmVyOworCWVudW0gdjRsMl90dW5lcl90eXBlICB0eXBlOworCV9fdTMyCQkgICAgICBzZWVrX3Vwd2FyZDsKKwlfX3UzMgkJICAgICAgd3JhcF9hcm91bmQ7CisJX191MzIJCSAgICAgIHNwYWNpbmc7CisJX191MzIJCSAgICAgIHJlc2VydmVkWzddOworfTsKKworLyoKKyAqCVIgRCBTCisgKi8KKworc3RydWN0IHY0bDJfcmRzX2RhdGEgeworCV9fdTggCWxzYjsKKwlfX3U4IAltc2I7CisJX191OCAJYmxvY2s7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBWNEwyX1JEU19CTE9DS19NU0sgCSAweDcKKyNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfQSAJIDAKKyNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfQiAJIDEKKyNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfQyAJIDIKKyNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfRCAJIDMKKyNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfQ19BTFQgCSA0CisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0lOVkFMSUQgCSA3CisKKyNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfQ09SUkVDVEVEIDB4NDAKKyNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfRVJST1IgCSAweDgwCisKKy8qCisgKglBIFUgRCBJIE8KKyAqLworc3RydWN0IHY0bDJfYXVkaW8geworCV9fdTMyCWluZGV4OworCV9fdTgJbmFtZVszMl07CisJX191MzIJY2FwYWJpbGl0eTsKKwlfX3UzMgltb2RlOworCV9fdTMyCXJlc2VydmVkWzJdOworfTsKKworLyogIEZsYWdzIGZvciB0aGUgJ2NhcGFiaWxpdHknIGZpZWxkICovCisjZGVmaW5lIFY0TDJfQVVEQ0FQX1NURVJFTwkJMHgwMDAwMQorI2RlZmluZSBWNEwyX0FVRENBUF9BVkwJCQkweDAwMDAyCisKKy8qICBGbGFncyBmb3IgdGhlICdtb2RlJyBmaWVsZCAqLworI2RlZmluZSBWNEwyX0FVRE1PREVfQVZMCQkweDAwMDAxCisKK3N0cnVjdCB2NGwyX2F1ZGlvb3V0IHsKKwlfX3UzMglpbmRleDsKKwlfX3U4CW5hbWVbMzJdOworCV9fdTMyCWNhcGFiaWxpdHk7CisJX191MzIJbW9kZTsKKwlfX3UzMglyZXNlcnZlZFsyXTsKK307CisKKy8qCisgKglNIFAgRSBHICAgUyBFIFIgViBJIEMgRSBTCisgKgorICoJTk9URTogRVhQRVJJTUVOVEFMIEFQSQorICovCisjaWYgMQorI2RlZmluZSBWNEwyX0VOQ19JRFhfRlJBTUVfSSAgICAoMCkKKyNkZWZpbmUgVjRMMl9FTkNfSURYX0ZSQU1FX1AgICAgKDEpCisjZGVmaW5lIFY0TDJfRU5DX0lEWF9GUkFNRV9CICAgICgyKQorI2RlZmluZSBWNEwyX0VOQ19JRFhfRlJBTUVfTUFTSyAoMHhmKQorCitzdHJ1Y3QgdjRsMl9lbmNfaWR4X2VudHJ5IHsKKwlfX3U2NCBvZmZzZXQ7CisJX191NjQgcHRzOworCV9fdTMyIGxlbmd0aDsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiByZXNlcnZlZFsyXTsKK307CisKKyNkZWZpbmUgVjRMMl9FTkNfSURYX0VOVFJJRVMgKDY0KQorc3RydWN0IHY0bDJfZW5jX2lkeCB7CisJX191MzIgZW50cmllczsKKwlfX3UzMiBlbnRyaWVzX2NhcDsKKwlfX3UzMiByZXNlcnZlZFs0XTsKKwlzdHJ1Y3QgdjRsMl9lbmNfaWR4X2VudHJ5IGVudHJ5W1Y0TDJfRU5DX0lEWF9FTlRSSUVTXTsKK307CisKKworI2RlZmluZSBWNEwyX0VOQ19DTURfU1RBUlQgICAgICAoMCkKKyNkZWZpbmUgVjRMMl9FTkNfQ01EX1NUT1AgICAgICAgKDEpCisjZGVmaW5lIFY0TDJfRU5DX0NNRF9QQVVTRSAgICAgICgyKQorI2RlZmluZSBWNEwyX0VOQ19DTURfUkVTVU1FICAgICAoMykKKworLyogRmxhZ3MgZm9yIFY0TDJfRU5DX0NNRF9TVE9QICovCisjZGVmaW5lIFY0TDJfRU5DX0NNRF9TVE9QX0FUX0dPUF9FTkQgICAgKDEgPDwgMCkKKworc3RydWN0IHY0bDJfZW5jb2Rlcl9jbWQgeworCV9fdTMyIGNtZDsKKwlfX3UzMiBmbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3UzMiBkYXRhWzhdOworCQl9IHJhdzsKKwl9OworfTsKKworI2VuZGlmCisKKworLyoKKyAqCUQgQSBUIEEgICBTIEUgUiBWIEkgQyBFIFMgICAoIFYgQiBJICkKKyAqCisgKglEYXRhIHNlcnZpY2VzIEFQSSBieSBNaWNoYWVsIFNjaGltZWsKKyAqLworCisvKiBSYXcgVkJJICovCitzdHJ1Y3QgdjRsMl92YmlfZm9ybWF0IHsKKwlfX3UzMglzYW1wbGluZ19yYXRlOwkJLyogaW4gMSBIeiAqLworCV9fdTMyCW9mZnNldDsKKwlfX3UzMglzYW1wbGVzX3Blcl9saW5lOworCV9fdTMyCXNhbXBsZV9mb3JtYXQ7CQkvKiBWNEwyX1BJWF9GTVRfKiAqLworCV9fczMyCXN0YXJ0WzJdOworCV9fdTMyCWNvdW50WzJdOworCV9fdTMyCWZsYWdzOwkJCS8qIFY0TDJfVkJJXyogKi8KKwlfX3UzMglyZXNlcnZlZFsyXTsJCS8qIG11c3QgYmUgemVybyAqLworfTsKKworLyogIFZCSSBmbGFncyAgKi8KKyNkZWZpbmUgVjRMMl9WQklfVU5TWU5DCQkoMSA8PCAwKQorI2RlZmluZSBWNEwyX1ZCSV9JTlRFUkxBQ0VECSgxIDw8IDEpCisKKy8qIFNsaWNlZCBWQkkKKyAqCisgKiAgICBUaGlzIGltcGxlbWVudHMgaXMgYSBwcm9wb3NhbCBWNEwyIEFQSSB0byBhbGxvdyBTTElDRUQgVkJJCisgKiByZXF1aXJlZCBmb3Igc29tZSBoYXJkd2FyZSBlbmNvZGVycy4gSXQgc2hvdWxkIGNoYW5nZSB3aXRob3V0CisgKiBub3RpY2UgaW4gdGhlIGRlZmluaXRpdmUgaW1wbGVtZW50YXRpb24uCisgKi8KKworc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQgeworCV9fdTE2ICAgc2VydmljZV9zZXQ7CisJLyogc2VydmljZV9saW5lc1swXVsuLi5dIHNwZWNpZmllcyBsaW5lcyAwLTIzICgxLTIzIHVzZWQpIG9mIHRoZSBmaXJzdCBmaWVsZAorCSAgIHNlcnZpY2VfbGluZXNbMV1bLi4uXSBzcGVjaWZpZXMgbGluZXMgMC0yMyAoMS0yMyB1c2VkKSBvZiB0aGUgc2Vjb25kIGZpZWxkCisJCQkJIChlcXVhbHMgZnJhbWUgbGluZXMgMzEzLTMzNiBmb3IgNjI1IGxpbmUgdmlkZW8KKwkJCQkgIHN0YW5kYXJkcywgMjYzLTI4NiBmb3IgNTI1IGxpbmUgc3RhbmRhcmRzKSAqLworCV9fdTE2ICAgc2VydmljZV9saW5lc1syXVsyNF07CisJX191MzIgICBpb19zaXplOworCV9fdTMyICAgcmVzZXJ2ZWRbMl07ICAgICAgICAgICAgLyogbXVzdCBiZSB6ZXJvICovCit9OworCisvKiBUZWxldGV4dCBXb3JsZCBTeXN0ZW0gVGVsZXRleHQKKyAgIChXU1QpLCBkZWZpbmVkIG9uIElUVS1SIEJULjY1My0yICovCisjZGVmaW5lIFY0TDJfU0xJQ0VEX1RFTEVURVhUX0IgICAgICAgICAgKDB4MDAwMSkKKy8qIFZpZGVvIFByb2dyYW0gU3lzdGVtLCBkZWZpbmVkIG9uIEVUUyAzMDAgMjMxKi8KKyNkZWZpbmUgVjRMMl9TTElDRURfVlBTICAgICAgICAgICAgICAgICAoMHgwNDAwKQorLyogQ2xvc2VkIENhcHRpb24sIGRlZmluZWQgb24gRUlBLTYwOCAqLworI2RlZmluZSBWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNSAgICAgICAgICgweDEwMDApCisvKiBXaWRlIFNjcmVlbiBTeXN0ZW0sIGRlZmluZWQgb24gSVRVLVIgQlQxMTE5LjEgKi8KKyNkZWZpbmUgVjRMMl9TTElDRURfV1NTXzYyNSAgICAgICAgICAgICAoMHg0MDAwKQorCisjZGVmaW5lIFY0TDJfU0xJQ0VEX1ZCSV81MjUgICAgICAgICAgICAgKFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1KQorI2RlZmluZSBWNEwyX1NMSUNFRF9WQklfNjI1ICAgICAgICAgICAgIChWNEwyX1NMSUNFRF9URUxFVEVYVF9CIHwgVjRMMl9TTElDRURfVlBTIHwgVjRMMl9TTElDRURfV1NTXzYyNSkKKworc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9jYXAgeworCV9fdTE2ICAgc2VydmljZV9zZXQ7CisJLyogc2VydmljZV9saW5lc1swXVsuLi5dIHNwZWNpZmllcyBsaW5lcyAwLTIzICgxLTIzIHVzZWQpIG9mIHRoZSBmaXJzdCBmaWVsZAorCSAgIHNlcnZpY2VfbGluZXNbMV1bLi4uXSBzcGVjaWZpZXMgbGluZXMgMC0yMyAoMS0yMyB1c2VkKSBvZiB0aGUgc2Vjb25kIGZpZWxkCisJCQkJIChlcXVhbHMgZnJhbWUgbGluZXMgMzEzLTMzNiBmb3IgNjI1IGxpbmUgdmlkZW8KKwkJCQkgIHN0YW5kYXJkcywgMjYzLTI4NiBmb3IgNTI1IGxpbmUgc3RhbmRhcmRzKSAqLworCV9fdTE2ICAgc2VydmljZV9saW5lc1syXVsyNF07CisJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisJX191MzIgICByZXNlcnZlZFszXTsgICAgLyogbXVzdCBiZSAwICovCit9OworCitzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEgeworCV9fdTMyICAgaWQ7CisJX191MzIgICBmaWVsZDsgICAgICAgICAgLyogMDogZmlyc3QgZmllbGQsIDE6IHNlY29uZCBmaWVsZCAqLworCV9fdTMyICAgbGluZTsgICAgICAgICAgIC8qIDEtMjMgKi8KKwlfX3UzMiAgIHJlc2VydmVkOyAgICAgICAvKiBtdXN0IGJlIDAgKi8KKwlfX3U4ICAgIGRhdGFbNDhdOworfTsKKworLyoKKyAqIFNsaWNlZCBWQkkgZGF0YSBpbnNlcnRlZCBpbnRvIE1QRUcgU3RyZWFtcworICovCisKKy8qCisgKiBWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfSVZUVjoKKyAqCisgKiBTdHJ1Y3R1cmUgb2YgcGF5bG9hZCBjb250YWluZWQgaW4gYW4gTVBFRyAyIFByaXZhdGUgU3RyZWFtIDEgUEVTIFBhY2tldCBpbiBhbgorICogTVBFRy0yIFByb2dyYW0gUGFjayB0aGF0IGNvbnRhaW5zIFY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9JVlRWIFNsaWNlZCBWQkkKKyAqIGRhdGEKKyAqCisgKiBOb3RlLCB0aGUgTVBFRy0yIFByb2dyYW0gUGFjayBhbmQgUHJpdmF0ZSBTdHJlYW0gMSBQRVMgcGFja2V0IGhlYWRlcgorICogZGVmaW5pdGlvbnMgYXJlIG5vdCBpbmNsdWRlZCBoZXJlLiAgU2VlIHRoZSBNUEVHLTIgc3BlY2lmaWNhdGlvbnMgZm9yIGRldGFpbHMKKyAqIG9uIHRoZXNlIGhlYWRlcnMuCisgKi8KKworLyogTGluZSB0eXBlIElEcyAqLworI2RlZmluZSBWNEwyX01QRUdfVkJJX0lWVFZfVEVMRVRFWFRfQiAgICAgKDEpCisjZGVmaW5lIFY0TDJfTVBFR19WQklfSVZUVl9DQVBUSU9OXzUyNSAgICAoNCkKKyNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX1dTU182MjUgICAgICAgICg1KQorI2RlZmluZSBWNEwyX01QRUdfVkJJX0lWVFZfVlBTICAgICAgICAgICAgKDcpCisKK3N0cnVjdCB2NGwyX21wZWdfdmJpX2l0djBfbGluZSB7CisJX191OCBpZDsJLyogT25lIG9mIFY0TDJfTVBFR19WQklfSVZUVl8qIGFib3ZlICovCisJX191OCBkYXRhWzQyXTsJLyogU2xpY2VkIFZCSSBkYXRhIGZvciB0aGUgbGluZSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB2NGwyX21wZWdfdmJpX2l0djAgeworCV9fbGUzMiBsaW5lbWFza1syXTsgLyogQml0bWFza3Mgb2YgVkJJIHNlcnZpY2UgbGluZXMgcHJlc2VudCAqLworCXN0cnVjdCB2NGwyX21wZWdfdmJpX2l0djBfbGluZSBsaW5lWzM1XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgdjRsMl9tcGVnX3ZiaV9JVFYwIHsKKwlzdHJ1Y3QgdjRsMl9tcGVnX3ZiaV9pdHYwX2xpbmUgbGluZVszNl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBWNEwyX01QRUdfVkJJX0lWVFZfTUFHSUMwCSJpdHYwIgorI2RlZmluZSBWNEwyX01QRUdfVkJJX0lWVFZfTUFHSUMxCSJJVFYwIgorCitzdHJ1Y3QgdjRsMl9tcGVnX3ZiaV9mbXRfaXZ0diB7CisJX191OCBtYWdpY1s0XTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2NGwyX21wZWdfdmJpX2l0djAgaXR2MDsKKwkJc3RydWN0IHY0bDJfbXBlZ192YmlfSVRWMCBJVFYwOworCX07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqCUEgRyBHIFIgRSBHIEEgVCBFICAgUyBUIFIgVSBDIFQgVSBSIEUgUworICovCisKKy8qKgorICogc3RydWN0IHY0bDJfcGxhbmVfcGl4X2Zvcm1hdCAtIGFkZGl0aW9uYWwsIHBlci1wbGFuZSBmb3JtYXQgZGVmaW5pdGlvbgorICogQHNpemVpbWFnZToJCW1heGltdW0gc2l6ZSBpbiBieXRlcyByZXF1aXJlZCBmb3IgZGF0YSwgZm9yIHdoaWNoCisgKgkJCXRoaXMgcGxhbmUgd2lsbCBiZSB1c2VkCisgKiBAYnl0ZXNwZXJsaW5lOglkaXN0YW5jZSBpbiBieXRlcyBiZXR3ZWVuIHRoZSBsZWZ0bW9zdCBwaXhlbHMgaW4gdHdvCisgKgkJCWFkamFjZW50IGxpbmVzCisgKi8KK3N0cnVjdCB2NGwyX3BsYW5lX3BpeF9mb3JtYXQgeworCV9fdTMyCQlzaXplaW1hZ2U7CisJX191MTYJCWJ5dGVzcGVybGluZTsKKwlfX3UxNgkJcmVzZXJ2ZWRbN107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAtIG11bHRpcGxhbmFyIGZvcm1hdCBkZWZpbml0aW9uCisgKiBAd2lkdGg6CQlpbWFnZSB3aWR0aCBpbiBwaXhlbHMKKyAqIEBoZWlnaHQ6CQlpbWFnZSBoZWlnaHQgaW4gcGl4ZWxzCisgKiBAcGl4ZWxmb3JtYXQ6CWxpdHRsZSBlbmRpYW4gZm91ciBjaGFyYWN0ZXIgY29kZSAoZm91cmNjKQorICogQGZpZWxkOgkJZmllbGQgb3JkZXIgKGZvciBpbnRlcmxhY2VkIHZpZGVvKQorICogQGNvbG9yc3BhY2U6CQlzdXBwbGVtZW50YWwgdG8gcGl4ZWxmb3JtYXQKKyAqIEBwbGFuZV9mbXQ6CQlwZXItcGxhbmUgaW5mb3JtYXRpb24KKyAqIEBudW1fcGxhbmVzOgkJbnVtYmVyIG9mIHBsYW5lcyBmb3IgdGhpcyBmb3JtYXQKKyAqLworc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgeworCV9fdTMyCQkJCXdpZHRoOworCV9fdTMyCQkJCWhlaWdodDsKKwlfX3UzMgkJCQlwaXhlbGZvcm1hdDsKKwllbnVtIHY0bDJfZmllbGQJCQlmaWVsZDsKKwllbnVtIHY0bDJfY29sb3JzcGFjZQkJY29sb3JzcGFjZTsKKworCXN0cnVjdCB2NGwyX3BsYW5lX3BpeF9mb3JtYXQJcGxhbmVfZm10W1ZJREVPX01BWF9QTEFORVNdOworCV9fdTgJCQkJbnVtX3BsYW5lczsKKwlfX3U4CQkJCXJlc2VydmVkWzExXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioKKyAqIHN0cnVjdCB2NGwyX2Zvcm1hdCAtIHN0cmVhbSBkYXRhIGZvcm1hdAorICogQHR5cGU6CXR5cGUgb2YgdGhlIGRhdGEgc3RyZWFtCisgKiBAcGl4OglkZWZpbml0aW9uIG9mIGFuIGltYWdlIGZvcm1hdAorICogQHBpeF9tcDoJZGVmaW5pdGlvbiBvZiBhIG11bHRpcGxhbmFyIGltYWdlIGZvcm1hdAorICogQHdpbjoJZGVmaW5pdGlvbiBvZiBhbiBvdmVybGFpZCBpbWFnZQorICogQHZiaToJcmF3IFZCSSBjYXB0dXJlIG9yIG91dHB1dCBwYXJhbWV0ZXJzCisgKiBAc2xpY2VkOglzbGljZWQgVkJJIGNhcHR1cmUgb3Igb3V0cHV0IHBhcmFtZXRlcnMKKyAqIEByYXdfZGF0YToJcGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBleHRlbnNpb25zIGFuZCBjdXN0b20gZm9ybWF0cworICovCitzdHJ1Y3QgdjRsMl9mb3JtYXQgeworCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdAkJcGl4OyAgICAgLyogVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFICovCisJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lCXBpeF9tcDsgIC8qIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUgKi8KKwkJc3RydWN0IHY0bDJfd2luZG93CQl3aW47ICAgICAvKiBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVkgKi8KKwkJc3RydWN0IHY0bDJfdmJpX2Zvcm1hdAkJdmJpOyAgICAgLyogVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSAqLworCQlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdAlzbGljZWQ7ICAvKiBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRSAqLworCQlfX3U4CXJhd19kYXRhWzIwMF07ICAgICAgICAgICAgICAgICAgIC8qIHVzZXItZGVmaW5lZCAqLworCX0gZm10OworfTsKKworLyoJU3RyZWFtIHR5cGUtZGVwZW5kZW50IHBhcmFtZXRlcnMKKyAqLworc3RydWN0IHY0bDJfc3RyZWFtcGFybSB7CisJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisJdW5pb24geworCQlzdHJ1Y3QgdjRsMl9jYXB0dXJlcGFybQljYXB0dXJlOworCQlzdHJ1Y3QgdjRsMl9vdXRwdXRwYXJtCW91dHB1dDsKKwkJX191OAlyYXdfZGF0YVsyMDBdOyAgLyogdXNlci1kZWZpbmVkICovCisJfSBwYXJtOworfTsKKworLyoKKyAqCUUgViBFIE4gVCBTCisgKi8KKworI2RlZmluZSBWNEwyX0VWRU5UX0FMTAkJCQkwCisjZGVmaW5lIFY0TDJfRVZFTlRfVlNZTkMJCQkxCisjZGVmaW5lIFY0TDJfRVZFTlRfRU9TCQkJCTIKKyNkZWZpbmUgVjRMMl9FVkVOVF9DVFJMCQkJCTMKKyNkZWZpbmUgVjRMMl9FVkVOVF9GUkFNRV9TWU5DCQkJNAorI2RlZmluZSBWNEwyX0VWRU5UX1BSSVZBVEVfU1RBUlQJCTB4MDgwMDAwMDAKKworLyogUGF5bG9hZCBmb3IgVjRMMl9FVkVOVF9WU1lOQyAqLworc3RydWN0IHY0bDJfZXZlbnRfdnN5bmMgeworCS8qIENhbiBiZSBWNEwyX0ZJRUxEX0FOWSwgX05PTkUsIF9UT1Agb3IgX0JPVFRPTSAqLworCV9fdTggZmllbGQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogUGF5bG9hZCBmb3IgVjRMMl9FVkVOVF9DVFJMICovCisjZGVmaW5lIFY0TDJfRVZFTlRfQ1RSTF9DSF9WQUxVRQkJKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9FVkVOVF9DVFJMX0NIX0ZMQUdTCQkoMSA8PCAxKQorCitzdHJ1Y3QgdjRsMl9ldmVudF9jdHJsIHsKKwlfX3UzMiBjaGFuZ2VzOworCV9fdTMyIHR5cGU7CisJdW5pb24geworCQlfX3MzMiB2YWx1ZTsKKwkJX19zNjQgdmFsdWU2NDsKKwl9OworCV9fdTMyIGZsYWdzOworCV9fczMyIG1pbmltdW07CisJX19zMzIgbWF4aW11bTsKKwlfX3MzMiBzdGVwOworCV9fczMyIGRlZmF1bHRfdmFsdWU7Cit9OworCitzdHJ1Y3QgdjRsMl9ldmVudF9mcmFtZV9zeW5jIHsKKwlfX3UzMiBmcmFtZV9zZXF1ZW5jZTsKK307CisKK3N0cnVjdCB2NGwyX2V2ZW50IHsKKwlfX3UzMgkJCQl0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IHY0bDJfZXZlbnRfdnN5bmMJCXZzeW5jOworCQlzdHJ1Y3QgdjRsMl9ldmVudF9jdHJsCQljdHJsOworCQlzdHJ1Y3QgdjRsMl9ldmVudF9mcmFtZV9zeW5jCWZyYW1lX3N5bmM7CisJCV9fdTgJCQkJZGF0YVs2NF07CisJfSB1OworCV9fdTMyCQkJCXBlbmRpbmc7CisJX191MzIJCQkJc2VxdWVuY2U7CisJc3RydWN0IHRpbWVzcGVjCQkJdGltZXN0YW1wOworCV9fdTMyCQkJCWlkOworCV9fdTMyCQkJCXJlc2VydmVkWzhdOworfTsKKworI2RlZmluZSBWNEwyX0VWRU5UX1NVQl9GTF9TRU5EX0lOSVRJQUwJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfRVZFTlRfU1VCX0ZMX0FMTE9XX0ZFRURCQUNLCSgxIDw8IDEpCisKK3N0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiB7CisJX191MzIJCQkJdHlwZTsKKwlfX3UzMgkJCQlpZDsKKwlfX3UzMgkJCQlmbGFnczsKKwlfX3UzMgkJCQlyZXNlcnZlZFs1XTsKK307CisKKy8qCisgKglBIEQgViBBIE4gQyBFIEQgICBEIEUgQiBVIEcgRyBJIE4gRworICoKKyAqCU5PVEU6IEVYUEVSSU1FTlRBTCBBUEksIE5FVkVSIFJFTFkgT04gVEhJUyBJTiBBUFBMSUNBVElPTlMhCisgKglGT1IgREVCVUdHSU5HLCBURVNUSU5HIEFORCBJTlRFUk5BTCBVU0UgT05MWSEKKyAqLworCisvKiBWSURJT0NfREJHX0dfUkVHSVNURVIgYW5kIFZJRElPQ19EQkdfU19SRUdJU1RFUiAqLworCisjZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9IT1NUICAgICAgIDAgIC8qIE1hdGNoIGFnYWluc3QgY2hpcCBJRCBvbiBob3N0ICgwIGZvciB0aGUgaG9zdCkgKi8KKyNkZWZpbmUgVjRMMl9DSElQX01BVENIX0kyQ19EUklWRVIgMSAgLyogTWF0Y2ggYWdhaW5zdCBJMkMgZHJpdmVyIG5hbWUgKi8KKyNkZWZpbmUgVjRMMl9DSElQX01BVENIX0kyQ19BRERSICAgMiAgLyogTWF0Y2ggYWdhaW5zdCBJMkMgNy1iaXQgYWRkcmVzcyAqLworI2RlZmluZSBWNEwyX0NISVBfTUFUQ0hfQUM5NyAgICAgICAzICAvKiBNYXRjaCBhZ2FpbnN0IGFuY2lsaWFyeSBBQzk3IGNoaXAgKi8KKworc3RydWN0IHY0bDJfZGJnX21hdGNoIHsKKwlfX3UzMiB0eXBlOyAvKiBNYXRjaCB0eXBlICovCisJdW5pb24geyAgICAgLyogTWF0Y2ggdGhpcyBjaGlwLCBtZWFuaW5nIGRldGVybWluZWQgYnkgdHlwZSAqLworCQlfX3UzMiBhZGRyOworCQljaGFyIG5hbWVbMzJdOworCX07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyIHsKKwlzdHJ1Y3QgdjRsMl9kYmdfbWF0Y2ggbWF0Y2g7CisJX191MzIgc2l6ZTsJLyogcmVnaXN0ZXIgc2l6ZSBpbiBieXRlcyAqLworCV9fdTY0IHJlZzsKKwlfX3U2NCB2YWw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVklESU9DX0RCR19HX0NISVBfSURFTlQgKi8KK3N0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50IHsKKwlzdHJ1Y3QgdjRsMl9kYmdfbWF0Y2ggbWF0Y2g7CisJX191MzIgaWRlbnQ7ICAgICAgIC8qIGNoaXAgaWRlbnRpZmllciBhcyBzcGVjaWZpZWQgaW4gPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPiAqLworCV9fdTMyIHJldmlzaW9uOyAgICAvKiBjaGlwIHJldmlzaW9uLCBjaGlwIHNwZWNpZmljICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycyAtIFZJRElPQ19DUkVBVEVfQlVGUyBhcmd1bWVudAorICogQGluZGV4OglvbiByZXR1cm4sIGluZGV4IG9mIHRoZSBmaXJzdCBjcmVhdGVkIGJ1ZmZlcgorICogQGNvdW50OgllbnRyeTogbnVtYmVyIG9mIHJlcXVlc3RlZCBidWZmZXJzLAorICoJCXJldHVybjogbnVtYmVyIG9mIGNyZWF0ZWQgYnVmZmVycworICogQG1lbW9yeToJYnVmZmVyIG1lbW9yeSB0eXBlCisgKiBAZm9ybWF0OglmcmFtZSBmb3JtYXQsIGZvciB3aGljaCBidWZmZXJzIGFyZSByZXF1ZXN0ZWQKKyAqIEByZXNlcnZlZDoJZnV0dXJlIGV4dGVuc2lvbnMKKyAqLworc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMgeworCV9fdTMyCQkJaW5kZXg7CisJX191MzIJCQljb3VudDsKKwllbnVtIHY0bDJfbWVtb3J5ICAgICAgICBtZW1vcnk7CisJc3RydWN0IHY0bDJfZm9ybWF0CWZvcm1hdDsKKwlfX3UzMgkJCXJlc2VydmVkWzhdOworfTsKKworLyoKKyAqCUkgTyBDIFQgTCAgIEMgTyBEIEUgUyAgIEYgTyBSICAgViBJIEQgRSBPICAgRCBFIFYgSSBDIEUgUworICoKKyAqLworI2RlZmluZSBWSURJT0NfUVVFUllDQVAJCSBfSU9SKCdWJywgIDAsIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkpCisjZGVmaW5lIFZJRElPQ19SRVNFUlZFRAkJICBfSU8oJ1YnLCAgMSkKKyNkZWZpbmUgVklESU9DX0VOVU1fRk1UICAgICAgICAgX0lPV1IoJ1YnLCAgMiwgc3RydWN0IHY0bDJfZm10ZGVzYykKKyNkZWZpbmUgVklESU9DX0dfRk1UCQlfSU9XUignVicsICA0LCBzdHJ1Y3QgdjRsMl9mb3JtYXQpCisjZGVmaW5lIFZJRElPQ19TX0ZNVAkJX0lPV1IoJ1YnLCAgNSwgc3RydWN0IHY0bDJfZm9ybWF0KQorI2RlZmluZSBWSURJT0NfUkVRQlVGUwkJX0lPV1IoJ1YnLCAgOCwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMpCisjZGVmaW5lIFZJRElPQ19RVUVSWUJVRgkJX0lPV1IoJ1YnLCAgOSwgc3RydWN0IHY0bDJfYnVmZmVyKQorI2RlZmluZSBWSURJT0NfR19GQlVGCQkgX0lPUignVicsIDEwLCBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcikKKyNkZWZpbmUgVklESU9DX1NfRkJVRgkJIF9JT1coJ1YnLCAxMSwgc3RydWN0IHY0bDJfZnJhbWVidWZmZXIpCisjZGVmaW5lIFZJRElPQ19PVkVSTEFZCQkgX0lPVygnVicsIDE0LCBpbnQpCisjZGVmaW5lIFZJRElPQ19RQlVGCQlfSU9XUignVicsIDE1LCBzdHJ1Y3QgdjRsMl9idWZmZXIpCisjZGVmaW5lIFZJRElPQ19EUUJVRgkJX0lPV1IoJ1YnLCAxNywgc3RydWN0IHY0bDJfYnVmZmVyKQorI2RlZmluZSBWSURJT0NfU1RSRUFNT04JCSBfSU9XKCdWJywgMTgsIGludCkKKyNkZWZpbmUgVklESU9DX1NUUkVBTU9GRgkgX0lPVygnVicsIDE5LCBpbnQpCisjZGVmaW5lIFZJRElPQ19HX1BBUk0JCV9JT1dSKCdWJywgMjEsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pCisjZGVmaW5lIFZJRElPQ19TX1BBUk0JCV9JT1dSKCdWJywgMjIsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pCisjZGVmaW5lIFZJRElPQ19HX1NURAkJIF9JT1IoJ1YnLCAyMywgdjRsMl9zdGRfaWQpCisjZGVmaW5lIFZJRElPQ19TX1NURAkJIF9JT1coJ1YnLCAyNCwgdjRsMl9zdGRfaWQpCisjZGVmaW5lIFZJRElPQ19FTlVNU1RECQlfSU9XUignVicsIDI1LCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZCkKKyNkZWZpbmUgVklESU9DX0VOVU1JTlBVVAlfSU9XUignVicsIDI2LCBzdHJ1Y3QgdjRsMl9pbnB1dCkKKyNkZWZpbmUgVklESU9DX0dfQ1RSTAkJX0lPV1IoJ1YnLCAyNywgc3RydWN0IHY0bDJfY29udHJvbCkKKyNkZWZpbmUgVklESU9DX1NfQ1RSTAkJX0lPV1IoJ1YnLCAyOCwgc3RydWN0IHY0bDJfY29udHJvbCkKKyNkZWZpbmUgVklESU9DX0dfVFVORVIJCV9JT1dSKCdWJywgMjksIHN0cnVjdCB2NGwyX3R1bmVyKQorI2RlZmluZSBWSURJT0NfU19UVU5FUgkJIF9JT1coJ1YnLCAzMCwgc3RydWN0IHY0bDJfdHVuZXIpCisjZGVmaW5lIFZJRElPQ19HX0FVRElPCQkgX0lPUignVicsIDMzLCBzdHJ1Y3QgdjRsMl9hdWRpbykKKyNkZWZpbmUgVklESU9DX1NfQVVESU8JCSBfSU9XKCdWJywgMzQsIHN0cnVjdCB2NGwyX2F1ZGlvKQorI2RlZmluZSBWSURJT0NfUVVFUllDVFJMCV9JT1dSKCdWJywgMzYsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCkKKyNkZWZpbmUgVklESU9DX1FVRVJZTUVOVQlfSU9XUignVicsIDM3LCBzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUpCisjZGVmaW5lIFZJRElPQ19HX0lOUFVUCQkgX0lPUignVicsIDM4LCBpbnQpCisjZGVmaW5lIFZJRElPQ19TX0lOUFVUCQlfSU9XUignVicsIDM5LCBpbnQpCisjZGVmaW5lIFZJRElPQ19HX09VVFBVVAkJIF9JT1IoJ1YnLCA0NiwgaW50KQorI2RlZmluZSBWSURJT0NfU19PVVRQVVQJCV9JT1dSKCdWJywgNDcsIGludCkKKyNkZWZpbmUgVklESU9DX0VOVU1PVVRQVVQJX0lPV1IoJ1YnLCA0OCwgc3RydWN0IHY0bDJfb3V0cHV0KQorI2RlZmluZSBWSURJT0NfR19BVURPVVQJCSBfSU9SKCdWJywgNDksIHN0cnVjdCB2NGwyX2F1ZGlvb3V0KQorI2RlZmluZSBWSURJT0NfU19BVURPVVQJCSBfSU9XKCdWJywgNTAsIHN0cnVjdCB2NGwyX2F1ZGlvb3V0KQorI2RlZmluZSBWSURJT0NfR19NT0RVTEFUT1IJX0lPV1IoJ1YnLCA1NCwgc3RydWN0IHY0bDJfbW9kdWxhdG9yKQorI2RlZmluZSBWSURJT0NfU19NT0RVTEFUT1IJIF9JT1coJ1YnLCA1NSwgc3RydWN0IHY0bDJfbW9kdWxhdG9yKQorI2RlZmluZSBWSURJT0NfR19GUkVRVUVOQ1kJX0lPV1IoJ1YnLCA1Niwgc3RydWN0IHY0bDJfZnJlcXVlbmN5KQorI2RlZmluZSBWSURJT0NfU19GUkVRVUVOQ1kJIF9JT1coJ1YnLCA1Nywgc3RydWN0IHY0bDJfZnJlcXVlbmN5KQorI2RlZmluZSBWSURJT0NfQ1JPUENBUAkJX0lPV1IoJ1YnLCA1OCwgc3RydWN0IHY0bDJfY3JvcGNhcCkKKyNkZWZpbmUgVklESU9DX0dfQ1JPUAkJX0lPV1IoJ1YnLCA1OSwgc3RydWN0IHY0bDJfY3JvcCkKKyNkZWZpbmUgVklESU9DX1NfQ1JPUAkJIF9JT1coJ1YnLCA2MCwgc3RydWN0IHY0bDJfY3JvcCkKKyNkZWZpbmUgVklESU9DX0dfSlBFR0NPTVAJIF9JT1IoJ1YnLCA2MSwgc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uKQorI2RlZmluZSBWSURJT0NfU19KUEVHQ09NUAkgX0lPVygnVicsIDYyLCBzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24pCisjZGVmaW5lIFZJRElPQ19RVUVSWVNURCAgICAgIAkgX0lPUignVicsIDYzLCB2NGwyX3N0ZF9pZCkKKyNkZWZpbmUgVklESU9DX1RSWV9GTVQgICAgICAJX0lPV1IoJ1YnLCA2NCwgc3RydWN0IHY0bDJfZm9ybWF0KQorI2RlZmluZSBWSURJT0NfRU5VTUFVRElPCV9JT1dSKCdWJywgNjUsIHN0cnVjdCB2NGwyX2F1ZGlvKQorI2RlZmluZSBWSURJT0NfRU5VTUFVRE9VVAlfSU9XUignVicsIDY2LCBzdHJ1Y3QgdjRsMl9hdWRpb291dCkKKyNkZWZpbmUgVklESU9DX0dfUFJJT1JJVFkgICAgICAgIF9JT1IoJ1YnLCA2NywgZW51bSB2NGwyX3ByaW9yaXR5KQorI2RlZmluZSBWSURJT0NfU19QUklPUklUWSAgICAgICAgX0lPVygnVicsIDY4LCBlbnVtIHY0bDJfcHJpb3JpdHkpCisjZGVmaW5lIFZJRElPQ19HX1NMSUNFRF9WQklfQ0FQIF9JT1dSKCdWJywgNjksIHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfY2FwKQorI2RlZmluZSBWSURJT0NfTE9HX1NUQVRVUyAgICAgICAgIF9JTygnVicsIDcwKQorI2RlZmluZSBWSURJT0NfR19FWFRfQ1RSTFMJX0lPV1IoJ1YnLCA3MSwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzKQorI2RlZmluZSBWSURJT0NfU19FWFRfQ1RSTFMJX0lPV1IoJ1YnLCA3Miwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzKQorI2RlZmluZSBWSURJT0NfVFJZX0VYVF9DVFJMUwlfSU9XUignVicsIDczLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMpCisjaWYgMQorI2RlZmluZSBWSURJT0NfRU5VTV9GUkFNRVNJWkVTCV9JT1dSKCdWJywgNzQsIHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtKQorI2RlZmluZSBWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUyBfSU9XUignVicsIDc1LCBzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSkKKyNkZWZpbmUgVklESU9DX0dfRU5DX0lOREVYICAgICAgIF9JT1IoJ1YnLCA3Niwgc3RydWN0IHY0bDJfZW5jX2lkeCkKKyNkZWZpbmUgVklESU9DX0VOQ09ERVJfQ01EICAgICAgX0lPV1IoJ1YnLCA3Nywgc3RydWN0IHY0bDJfZW5jb2Rlcl9jbWQpCisjZGVmaW5lIFZJRElPQ19UUllfRU5DT0RFUl9DTUQgIF9JT1dSKCdWJywgNzgsIHN0cnVjdCB2NGwyX2VuY29kZXJfY21kKQorI2VuZGlmCisKKyNpZiAxCisvKiBFeHBlcmltZW50YWwsIG1lYW50IGZvciBkZWJ1Z2dpbmcsIHRlc3RpbmcgYW5kIGludGVybmFsIHVzZS4KKyAgIE9ubHkgaW1wbGVtZW50ZWQgaWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRyBpcyBkZWZpbmVkLgorICAgWW91IG11c3QgYmUgcm9vdCB0byB1c2UgdGhlc2UgaW9jdGxzLiBOZXZlciB1c2UgdGhlc2UgaW4gYXBwbGljYXRpb25zISAqLworI2RlZmluZQlWSURJT0NfREJHX1NfUkVHSVNURVIgCSBfSU9XKCdWJywgNzksIHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlcikKKyNkZWZpbmUJVklESU9DX0RCR19HX1JFR0lTVEVSIAlfSU9XUignVicsIDgwLCBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIpCisKKy8qIEV4cGVyaW1lbnRhbCwgbWVhbnQgZm9yIGRlYnVnZ2luZywgdGVzdGluZyBhbmQgaW50ZXJuYWwgdXNlLgorICAgTmV2ZXIgdXNlIHRoaXMgaW9jdGwgaW4gYXBwbGljYXRpb25zISAqLworI2RlZmluZSBWSURJT0NfREJHX0dfQ0hJUF9JREVOVCBfSU9XUignVicsIDgxLCBzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCkKKyNlbmRpZgorCisjZGVmaW5lIFZJRElPQ19TX0hXX0ZSRVFfU0VFSwkgX0lPVygnVicsIDgyLCBzdHJ1Y3QgdjRsMl9od19mcmVxX3NlZWspCisjZGVmaW5lCVZJRElPQ19FTlVNX0RWX1BSRVNFVFMJX0lPV1IoJ1YnLCA4Mywgc3RydWN0IHY0bDJfZHZfZW51bV9wcmVzZXQpCisjZGVmaW5lCVZJRElPQ19TX0RWX1BSRVNFVAlfSU9XUignVicsIDg0LCBzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQpCisjZGVmaW5lCVZJRElPQ19HX0RWX1BSRVNFVAlfSU9XUignVicsIDg1LCBzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQpCisjZGVmaW5lCVZJRElPQ19RVUVSWV9EVl9QUkVTRVQJX0lPUignVicsICA4Niwgc3RydWN0IHY0bDJfZHZfcHJlc2V0KQorI2RlZmluZQlWSURJT0NfU19EVl9USU1JTkdTCV9JT1dSKCdWJywgODcsIHN0cnVjdCB2NGwyX2R2X3RpbWluZ3MpCisjZGVmaW5lCVZJRElPQ19HX0RWX1RJTUlOR1MJX0lPV1IoJ1YnLCA4OCwgc3RydWN0IHY0bDJfZHZfdGltaW5ncykKKyNkZWZpbmUJVklESU9DX0RRRVZFTlQJCSBfSU9SKCdWJywgODksIHN0cnVjdCB2NGwyX2V2ZW50KQorI2RlZmluZQlWSURJT0NfU1VCU0NSSUJFX0VWRU5UCSBfSU9XKCdWJywgOTAsIHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbikKKyNkZWZpbmUJVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UIF9JT1coJ1YnLCA5MSwgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uKQorCisvKiBFeHBlcmltZW50YWwsIHRoZSBiZWxvdyB0d28gaW9jdGxzIG1heSBjaGFuZ2Ugb3ZlciB0aGUgbmV4dCBjb3VwbGUgb2Yga2VybmVsCisgICB2ZXJzaW9ucyAqLworI2RlZmluZSBWSURJT0NfQ1JFQVRFX0JVRlMJX0lPV1IoJ1YnLCA5Miwgc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMpCisjZGVmaW5lIFZJRElPQ19QUkVQQVJFX0JVRglfSU9XUignVicsIDkzLCBzdHJ1Y3QgdjRsMl9idWZmZXIpCisKKy8qIFJlbWluZGVyOiB3aGVuIGFkZGluZyBuZXcgaW9jdGxzIHBsZWFzZSBhZGQgc3VwcG9ydCBmb3IgdGhlbSB0bworICAgZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbXBhdC1pb2N0bDMyLmMgYXMgd2VsbCEgKi8KKworI2RlZmluZSBCQVNFX1ZJRElPQ19QUklWQVRFCTE5MgkJLyogMTkyLTI1NSBhcmUgcHJpdmF0ZSAqLworCisjZW5kaWYgLyogX19MSU5VWF9WSURFT0RFVjJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fOXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvXzlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3YzRhZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvXzlwLmgKQEAgLTAsMCArMSw0NCBAQAorI2lmbmRlZiBfTElOVVhfVklSVElPXzlQX0gKKyNkZWZpbmUgX0xJTlVYX1ZJUlRJT185UF9ICisvKiBUaGlzIGhlYWRlciBpcyBCU0QgbGljZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudAorICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIElCTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgorCisvKiBUaGUgZmVhdHVyZSBiaXRtYXAgZm9yIHZpcnRpbyA5UCAqLworCisvKiBUaGUgbW91bnQgcG9pbnQgaXMgc3BlY2lmaWVkIGluIGEgY29uZmlnIHZhcmlhYmxlICovCisjZGVmaW5lIFZJUlRJT185UF9NT1VOVF9UQUcgMAorCitzdHJ1Y3QgdmlydGlvXzlwX2NvbmZpZyB7CisJLyogbGVuZ3RoIG9mIHRoZSB0YWcgbmFtZSAqLworCV9fdTE2IHRhZ19sZW47CisJLyogbm9uLU5VTEwgdGVybWluYXRlZCB0YWcgbmFtZSAqLworCV9fdTggdGFnWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2VuZGlmIC8qIF9MSU5VWF9WSVJUSU9fOVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fYmFsbG9vbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fYmFsbG9vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MmRjOGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19iYWxsb29uLmgKQEAgLTAsMCArMSw1OSBAQAorI2lmbmRlZiBfTElOVVhfVklSVElPX0JBTExPT05fSAorI2RlZmluZSBfTElOVVhfVklSVElPX0JBTExPT05fSAorLyogVGhpcyBoZWFkZXIgaXMgQlNEIGxpY2Vuc2VkIHNvIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQKKyAqIGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBJQk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIElCTSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLiAqLworI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uZmlnLmg+CisKKy8qIFRoZSBmZWF0dXJlIGJpdG1hcCBmb3IgdmlydGlvIGJhbGxvb24gKi8KKyNkZWZpbmUgVklSVElPX0JBTExPT05fRl9NVVNUX1RFTExfSE9TVAkwIC8qIFRlbGwgYmVmb3JlIHJlY2xhaW1pbmcgcGFnZXMgKi8KKyNkZWZpbmUgVklSVElPX0JBTExPT05fRl9TVEFUU19WUQkxIC8qIE1lbW9yeSBTdGF0cyB2aXJ0cXVldWUgKi8KKworLyogU2l6ZSBvZiBhIFBGTiBpbiB0aGUgYmFsbG9vbiBpbnRlcmZhY2UuICovCisjZGVmaW5lIFZJUlRJT19CQUxMT09OX1BGTl9TSElGVCAxMgorCitzdHJ1Y3QgdmlydGlvX2JhbGxvb25fY29uZmlnCit7CisJLyogTnVtYmVyIG9mIHBhZ2VzIGhvc3Qgd2FudHMgR3Vlc3QgdG8gZ2l2ZSB1cC4gKi8KKwlfX2xlMzIgbnVtX3BhZ2VzOworCS8qIE51bWJlciBvZiBwYWdlcyB3ZSd2ZSBhY3R1YWxseSBnb3QgaW4gYmFsbG9vbi4gKi8KKwlfX2xlMzIgYWN0dWFsOworfTsKKworI2RlZmluZSBWSVJUSU9fQkFMTE9PTl9TX1NXQVBfSU4gIDAgICAvKiBBbW91bnQgb2YgbWVtb3J5IHN3YXBwZWQgaW4gKi8KKyNkZWZpbmUgVklSVElPX0JBTExPT05fU19TV0FQX09VVCAxICAgLyogQW1vdW50IG9mIG1lbW9yeSBzd2FwcGVkIG91dCAqLworI2RlZmluZSBWSVJUSU9fQkFMTE9PTl9TX01BSkZMVCAgIDIgICAvKiBOdW1iZXIgb2YgbWFqb3IgZmF1bHRzICovCisjZGVmaW5lIFZJUlRJT19CQUxMT09OX1NfTUlORkxUICAgMyAgIC8qIE51bWJlciBvZiBtaW5vciBmYXVsdHMgKi8KKyNkZWZpbmUgVklSVElPX0JBTExPT05fU19NRU1GUkVFICA0ICAgLyogVG90YWwgYW1vdW50IG9mIGZyZWUgbWVtb3J5ICovCisjZGVmaW5lIFZJUlRJT19CQUxMT09OX1NfTUVNVE9UICAgNSAgIC8qIFRvdGFsIGFtb3VudCBvZiBtZW1vcnkgKi8KKyNkZWZpbmUgVklSVElPX0JBTExPT05fU19OUiAgICAgICA2CisKK3N0cnVjdCB2aXJ0aW9fYmFsbG9vbl9zdGF0IHsKKwl1MTYgdGFnOworCXU2NCB2YWw7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZW5kaWYgLyogX0xJTlVYX1ZJUlRJT19CQUxMT09OX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2Jsay5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fYmxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBlZGI0MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2Jsay5oCkBAIC0wLDAgKzEsMTIyIEBACisjaWZuZGVmIF9MSU5VWF9WSVJUSU9fQkxLX0gKKyNkZWZpbmUgX0xJTlVYX1ZJUlRJT19CTEtfSAorLyogVGhpcyBoZWFkZXIgaXMgQlNEIGxpY2Vuc2VkIHNvIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQKKyAqIGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBJQk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIElCTSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLiAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25maWcuaD4KKworLyogRmVhdHVyZSBiaXRzICovCisjZGVmaW5lIFZJUlRJT19CTEtfRl9CQVJSSUVSCTAJLyogRG9lcyBob3N0IHN1cHBvcnQgYmFycmllcnM/ICovCisjZGVmaW5lIFZJUlRJT19CTEtfRl9TSVpFX01BWAkxCS8qIEluZGljYXRlcyBtYXhpbXVtIHNlZ21lbnQgc2l6ZSAqLworI2RlZmluZSBWSVJUSU9fQkxLX0ZfU0VHX01BWAkyCS8qIEluZGljYXRlcyBtYXhpbXVtICMgb2Ygc2VnbWVudHMgKi8KKyNkZWZpbmUgVklSVElPX0JMS19GX0dFT01FVFJZCTQJLyogTGVnYWN5IGdlb21ldHJ5IGF2YWlsYWJsZSAgKi8KKyNkZWZpbmUgVklSVElPX0JMS19GX1JPCQk1CS8qIERpc2sgaXMgcmVhZC1vbmx5ICovCisjZGVmaW5lIFZJUlRJT19CTEtfRl9CTEtfU0laRQk2CS8qIEJsb2NrIHNpemUgb2YgZGlzayBpcyBhdmFpbGFibGUqLworI2RlZmluZSBWSVJUSU9fQkxLX0ZfU0NTSQk3CS8qIFN1cHBvcnRzIHNjc2kgY29tbWFuZCBwYXNzdGhydSAqLworI2RlZmluZSBWSVJUSU9fQkxLX0ZfRkxVU0gJOQkvKiBDYWNoZSBmbHVzaCBjb21tYW5kIHN1cHBvcnQgKi8KKyNkZWZpbmUgVklSVElPX0JMS19GX1RPUE9MT0dZCTEwCS8qIFRvcG9sb2d5IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSAqLworCisjZGVmaW5lIFZJUlRJT19CTEtfSURfQllURVMJMjAJLyogSUQgc3RyaW5nIGxlbmd0aCAqLworCitzdHJ1Y3QgdmlydGlvX2Jsa19jb25maWcgeworCS8qIFRoZSBjYXBhY2l0eSAoaW4gNTEyLWJ5dGUgc2VjdG9ycykuICovCisJX191NjQgY2FwYWNpdHk7CisJLyogVGhlIG1heGltdW0gc2VnbWVudCBzaXplIChpZiBWSVJUSU9fQkxLX0ZfU0laRV9NQVgpICovCisJX191MzIgc2l6ZV9tYXg7CisJLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzIChpZiBWSVJUSU9fQkxLX0ZfU0VHX01BWCkgKi8KKwlfX3UzMiBzZWdfbWF4OworCS8qIGdlb21ldHJ5IHRoZSBkZXZpY2UgKGlmIFZJUlRJT19CTEtfRl9HRU9NRVRSWSkgKi8KKwlzdHJ1Y3QgdmlydGlvX2Jsa19nZW9tZXRyeSB7CisJCV9fdTE2IGN5bGluZGVyczsKKwkJX191OCBoZWFkczsKKwkJX191OCBzZWN0b3JzOworCX0gZ2VvbWV0cnk7CisKKwkvKiBibG9jayBzaXplIG9mIGRldmljZSAoaWYgVklSVElPX0JMS19GX0JMS19TSVpFKSAqLworCV9fdTMyIGJsa19zaXplOworCisJLyogdGhlIG5leHQgNCBlbnRyaWVzIGFyZSBndWFyZGVkIGJ5IFZJUlRJT19CTEtfRl9UT1BPTE9HWSAgKi8KKwkvKiBleHBvbmVudCBmb3IgcGh5c2ljYWwgYmxvY2sgcGVyIGxvZ2ljYWwgYmxvY2suICovCisJX191OCBwaHlzaWNhbF9ibG9ja19leHA7CisJLyogYWxpZ25tZW50IG9mZnNldCBpbiBsb2dpY2FsIGJsb2Nrcy4gKi8KKwlfX3U4IGFsaWdubWVudF9vZmZzZXQ7CisJLyogbWluaW11bSBJL08gc2l6ZSB3aXRob3V0IHBlcmZvcm1hbmNlIHBlbmFsdHkgaW4gbG9naWNhbCBibG9ja3MuICovCisJX191MTYgbWluX2lvX3NpemU7CisJLyogb3B0aW1hbCBzdXN0YWluZWQgSS9PIHNpemUgaW4gbG9naWNhbCBibG9ja3MuICovCisJX191MzIgb3B0X2lvX3NpemU7CisKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qCisgKiBDb21tYW5kIHR5cGVzCisgKgorICogVXNhZ2UgaXMgYSBiaXQgdHJpY2t5IGFzIHNvbWUgYml0cyBhcmUgdXNlZCBhcyBmbGFncyBhbmQgc29tZSBhcmUgbm90LgorICoKKyAqIFJ1bGVzOgorICogICBWSVJUSU9fQkxLX1RfT1VUIG1heSBiZSBjb21iaW5lZCB3aXRoIFZJUlRJT19CTEtfVF9TQ1NJX0NNRCBvcgorICogICBWSVJUSU9fQkxLX1RfQkFSUklFUi4gIFZJUlRJT19CTEtfVF9GTFVTSCBpcyBhIGNvbW1hbmQgb2YgaXRzIG93bgorICogICBhbmQgbWF5IG5vdCBiZSBjb21iaW5lZCB3aXRoIGFueSBvZiB0aGUgb3RoZXIgZmxhZ3MuCisgKi8KKworLyogVGhlc2UgdHdvIGRlZmluZSBkaXJlY3Rpb24uICovCisjZGVmaW5lIFZJUlRJT19CTEtfVF9JTgkJMAorI2RlZmluZSBWSVJUSU9fQkxLX1RfT1VUCTEKKworLyogVGhpcyBiaXQgc2F5cyBpdCdzIGEgc2NzaSBjb21tYW5kLCBub3QgYW4gYWN0dWFsIHJlYWQgb3Igd3JpdGUuICovCisjZGVmaW5lIFZJUlRJT19CTEtfVF9TQ1NJX0NNRAkyCisKKy8qIENhY2hlIGZsdXNoIGNvbW1hbmQgKi8KKyNkZWZpbmUgVklSVElPX0JMS19UX0ZMVVNICTQKKworLyogR2V0IGRldmljZSBJRCBjb21tYW5kICovCisjZGVmaW5lIFZJUlRJT19CTEtfVF9HRVRfSUQgICAgOAorCisvKiBCYXJyaWVyIGJlZm9yZSB0aGlzIG9wLiAqLworI2RlZmluZSBWSVJUSU9fQkxLX1RfQkFSUklFUgkweDgwMDAwMDAwCisKKy8qIFRoaXMgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHJlYWQgc2NhdHRlci1nYXRoZXIgbGlzdC4gKi8KK3N0cnVjdCB2aXJ0aW9fYmxrX291dGhkciB7CisJLyogVklSVElPX0JMS19UKiAqLworCV9fdTMyIHR5cGU7CisJLyogaW8gcHJpb3JpdHkuICovCisJX191MzIgaW9wcmlvOworCS8qIFNlY3RvciAoaWUuIDUxMiBieXRlIG9mZnNldCkgKi8KKwlfX3U2NCBzZWN0b3I7Cit9OworCitzdHJ1Y3QgdmlydGlvX3Njc2lfaW5oZHIgeworCV9fdTMyIGVycm9yczsKKwlfX3UzMiBkYXRhX2xlbjsKKwlfX3UzMiBzZW5zZV9sZW47CisJX191MzIgcmVzaWR1YWw7Cit9OworCisvKiBBbmQgdGhpcyBpcyB0aGUgZmluYWwgYnl0ZSBvZiB0aGUgd3JpdGUgc2NhdHRlci1nYXRoZXIgbGlzdC4gKi8KKyNkZWZpbmUgVklSVElPX0JMS19TX09LCQkwCisjZGVmaW5lIFZJUlRJT19CTEtfU19JT0VSUgkxCisjZGVmaW5lIFZJUlRJT19CTEtfU19VTlNVUFAJMgorI2VuZGlmIC8qIF9MSU5VWF9WSVJUSU9fQkxLX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbmZpZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1MWQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbmZpZy5oCkBAIC0wLDAgKzEsNTQgQEAKKyNpZm5kZWYgX0xJTlVYX1ZJUlRJT19DT05GSUdfSAorI2RlZmluZSBfTElOVVhfVklSVElPX0NPTkZJR19ICisvKiBUaGlzIGhlYWRlciwgZXhjbHVkaW5nIHRoZSAjaWZkZWYgX19LRVJORUxfXyBwYXJ0LCBpcyBCU0QgbGljZW5zZWQgc28KKyAqIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQgY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIElCTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuICovCisKKy8qIFZpcnRpbyBkZXZpY2VzIHVzZSBhIHN0YW5kYXJkaXplZCBjb25maWd1cmF0aW9uIHNwYWNlIHRvIGRlZmluZSB0aGVpcgorICogZmVhdHVyZXMgYW5kIHBhc3MgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiwgYnV0IGVhY2ggaW1wbGVtZW50YXRpb24gY2FuCisgKiBzdG9yZSBhbmQgYWNjZXNzIHRoYXQgc3BhY2UgZGlmZmVyZW50bHkuICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogU3RhdHVzIGJ5dGUgZm9yIGd1ZXN0IHRvIHJlcG9ydCBwcm9ncmVzcywgYW5kIHN5bmNocm9uaXplIGZlYXR1cmVzLiAqLworLyogV2UgaGF2ZSBzZWVuIGRldmljZSBhbmQgcHJvY2Vzc2VkIGdlbmVyaWMgZmllbGRzIChWSVJUSU9fQ09ORklHX0ZfVklSVElPKSAqLworI2RlZmluZSBWSVJUSU9fQ09ORklHX1NfQUNLTk9XTEVER0UJMQorLyogV2UgaGF2ZSBmb3VuZCBhIGRyaXZlciBmb3IgdGhlIGRldmljZS4gKi8KKyNkZWZpbmUgVklSVElPX0NPTkZJR19TX0RSSVZFUgkJMgorLyogRHJpdmVyIGhhcyB1c2VkIGl0cyBwYXJ0cyBvZiB0aGUgY29uZmlnLCBhbmQgaXMgaGFwcHkgKi8KKyNkZWZpbmUgVklSVElPX0NPTkZJR19TX0RSSVZFUl9PSwk0CisvKiBXZSd2ZSBnaXZlbiB1cCBvbiB0aGlzIGRldmljZS4gKi8KKyNkZWZpbmUgVklSVElPX0NPTkZJR19TX0ZBSUxFRAkJMHg4MAorCisvKiBTb21lIHZpcnRpbyBmZWF0dXJlIGJpdHMgKGN1cnJlbnRseSBiaXRzIDI4IHRocm91Z2ggMzEpIGFyZSByZXNlcnZlZCBmb3IgdGhlCisgKiB0cmFuc3BvcnQgYmVpbmcgdXNlZCAoZWcuIHZpcnRpb19yaW5nKSwgdGhlIHJlc3QgYXJlIHBlci1kZXZpY2UgZmVhdHVyZQorICogYml0cy4gKi8KKyNkZWZpbmUgVklSVElPX1RSQU5TUE9SVF9GX1NUQVJUCTI4CisjZGVmaW5lIFZJUlRJT19UUkFOU1BPUlRfRl9FTkQJCTMyCisKKy8qIERvIHdlIGdldCBjYWxsYmFja3Mgd2hlbiB0aGUgcmluZyBpcyBjb21wbGV0ZWx5IHVzZWQsIGV2ZW4gaWYgd2UndmUKKyAqIHN1cHByZXNzZWQgdGhlbT8gKi8KKyNkZWZpbmUgVklSVElPX0ZfTk9USUZZX09OX0VNUFRZCTI0CisKKyNlbmRpZiAvKiBfTElOVVhfVklSVElPX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25zb2xlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25zb2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1NGUyZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbnNvbGUuaApAQCAtMCwwICsxLDc0IEBACisjaWZuZGVmIF9MSU5VWF9WSVJUSU9fQ09OU09MRV9ICisjZGVmaW5lIF9MSU5VWF9WSVJUSU9fQ09OU09MRV9ICisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgorLyoKKyAqIFRoaXMgaGVhZGVyLCBleGNsdWRpbmcgdGhlICNpZmRlZiBfX0tFUk5FTF9fIHBhcnQsIGlzIEJTRCBsaWNlbnNlZCBzbworICogYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudCBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVyczoKKyAqCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIElCTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogQ29weXJpZ2h0IChDKSBSZWQgSGF0LCBJbmMuLCAyMDA5LCAyMDEwLCAyMDExCisgKiBDb3B5cmlnaHQgKEMpIEFtaXQgU2hhaCA8YW1pdC5zaGFoQHJlZGhhdC5jb20+LCAyMDA5LCAyMDEwLCAyMDExCisgKi8KKworLyogRmVhdHVyZSBiaXRzICovCisjZGVmaW5lIFZJUlRJT19DT05TT0xFX0ZfU0laRQkwCS8qIERvZXMgaG9zdCBwcm92aWRlIGNvbnNvbGUgc2l6ZT8gKi8KKyNkZWZpbmUgVklSVElPX0NPTlNPTEVfRl9NVUxUSVBPUlQgMQkvKiBEb2VzIGhvc3QgcHJvdmlkZSBtdWx0aXBsZSBwb3J0cz8gKi8KKworI2RlZmluZSBWSVJUSU9fQ09OU09MRV9CQURfSUQJCSh+KHUzMikwKQorCitzdHJ1Y3QgdmlydGlvX2NvbnNvbGVfY29uZmlnIHsKKwkvKiBjb2x1bXMgb2YgdGhlIHNjcmVlbnMgKi8KKwlfX3UxNiBjb2xzOworCS8qIHJvd3Mgb2YgdGhlIHNjcmVlbnMgKi8KKwlfX3UxNiByb3dzOworCS8qIG1heC4gbnVtYmVyIG9mIHBvcnRzIHRoaXMgZGV2aWNlIGNhbiBob2xkICovCisJX191MzIgbWF4X25yX3BvcnRzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIEEgbWVzc2FnZSB0aGF0J3MgcGFzc2VkIGJldHdlZW4gdGhlIEhvc3QgYW5kIHRoZSBHdWVzdCBmb3IgYQorICogcGFydGljdWxhciBwb3J0LgorICovCitzdHJ1Y3QgdmlydGlvX2NvbnNvbGVfY29udHJvbCB7CisJX191MzIgaWQ7CQkvKiBQb3J0IG51bWJlciAqLworCV9fdTE2IGV2ZW50OwkJLyogVGhlIGtpbmQgb2YgY29udHJvbCBldmVudCAoc2VlIGJlbG93KSAqLworCV9fdTE2IHZhbHVlOwkJLyogRXh0cmEgaW5mb3JtYXRpb24gZm9yIHRoZSBrZXkgKi8KK307CisKKy8qIFNvbWUgZXZlbnRzIGZvciBjb250cm9sIG1lc3NhZ2VzICovCisjZGVmaW5lIFZJUlRJT19DT05TT0xFX0RFVklDRV9SRUFEWQkwCisjZGVmaW5lIFZJUlRJT19DT05TT0xFX1BPUlRfQURECQkxCisjZGVmaW5lIFZJUlRJT19DT05TT0xFX1BPUlRfUkVNT1ZFCTIKKyNkZWZpbmUgVklSVElPX0NPTlNPTEVfUE9SVF9SRUFEWQkzCisjZGVmaW5lIFZJUlRJT19DT05TT0xFX0NPTlNPTEVfUE9SVAk0CisjZGVmaW5lIFZJUlRJT19DT05TT0xFX1JFU0laRQkJNQorI2RlZmluZSBWSVJUSU9fQ09OU09MRV9QT1JUX09QRU4JNgorI2RlZmluZSBWSVJUSU9fQ09OU09MRV9QT1JUX05BTUUJNworCisKKyNlbmRpZiAvKiBfTElOVVhfVklSVElPX0NPTlNPTEVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9faWRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWJiMGJiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9faWRzLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfTElOVVhfVklSVElPX0lEU19ICisjZGVmaW5lIF9MSU5VWF9WSVJUSU9fSURTX0gKKy8qCisgKiBWaXJ0aW8gSURzCisgKgorICogVGhpcyBoZWFkZXIgaXMgQlNEIGxpY2Vuc2VkIHNvIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQKKyAqIGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBJQk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIElCTSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLiAqLworCisjZGVmaW5lIFZJUlRJT19JRF9ORVQJCTEgLyogdmlydGlvIG5ldCAqLworI2RlZmluZSBWSVJUSU9fSURfQkxPQ0sJCTIgLyogdmlydGlvIGJsb2NrICovCisjZGVmaW5lIFZJUlRJT19JRF9DT05TT0xFCTMgLyogdmlydGlvIGNvbnNvbGUgKi8KKyNkZWZpbmUgVklSVElPX0lEX1JORwkJNCAvKiB2aXJ0aW8gcmluZyAqLworI2RlZmluZSBWSVJUSU9fSURfQkFMTE9PTgk1IC8qIHZpcnRpbyBiYWxsb29uICovCisjZGVmaW5lIFZJUlRJT19JRF85UAkJOSAvKiA5cCB2aXJ0aW8gY29uc29sZSAqLworCisjZW5kaWYgLyogX0xJTlVYX1ZJUlRJT19JRFNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fbmV0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19uZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzBkNWEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fbmV0LmgKQEAgLTAsMCArMSwxNTUgQEAKKyNpZm5kZWYgX0xJTlVYX1ZJUlRJT19ORVRfSAorI2RlZmluZSBfTElOVVhfVklSVElPX05FVF9ICisvKiBUaGlzIGhlYWRlciBpcyBCU0QgbGljZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudAorICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIElCTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisKKy8qIFRoZSBmZWF0dXJlIGJpdG1hcCBmb3IgdmlydGlvIG5ldCAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfQ1NVTQkwCS8qIEhvc3QgaGFuZGxlcyBwa3RzIHcvIHBhcnRpYWwgY3N1bSAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfR1VFU1RfQ1NVTQkxCS8qIEd1ZXN0IGhhbmRsZXMgcGt0cyB3LyBwYXJ0aWFsIGNzdW0gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX01BQwk1CS8qIEhvc3QgaGFzIGdpdmVuIE1BQyBhZGRyZXNzLiAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfR1NPCTYJLyogSG9zdCBoYW5kbGVzIHBrdHMgdy8gYW55IEdTTyB0eXBlICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9HVUVTVF9UU080CTcJLyogR3Vlc3QgY2FuIGhhbmRsZSBUU092NCBpbi4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0dVRVNUX1RTTzYJOAkvKiBHdWVzdCBjYW4gaGFuZGxlIFRTT3Y2IGluLiAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfR1VFU1RfRUNOCTkJLyogR3Vlc3QgY2FuIGhhbmRsZSBUU09bNl0gdy8gRUNOIGluLiAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfR1VFU1RfVUZPCTEwCS8qIEd1ZXN0IGNhbiBoYW5kbGUgVUZPIGluLiAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfSE9TVF9UU080CTExCS8qIEhvc3QgY2FuIGhhbmRsZSBUU092NCBpbi4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0hPU1RfVFNPNgkxMgkvKiBIb3N0IGNhbiBoYW5kbGUgVFNPdjYgaW4uICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9IT1NUX0VDTgkxMwkvKiBIb3N0IGNhbiBoYW5kbGUgVFNPWzZdIHcvIEVDTiBpbi4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0hPU1RfVUZPCTE0CS8qIEhvc3QgY2FuIGhhbmRsZSBVRk8gaW4uICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9NUkdfUlhCVUYJMTUJLyogSG9zdCBjYW4gbWVyZ2UgcmVjZWl2ZSBidWZmZXJzLiAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfU1RBVFVTCTE2CS8qIHZpcnRpb19uZXRfY29uZmlnLnN0YXR1cyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0NUUkxfVlEJMTcJLyogQ29udHJvbCBjaGFubmVsIGF2YWlsYWJsZSAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfQ1RSTF9SWAkxOAkvKiBDb250cm9sIGNoYW5uZWwgUlggbW9kZSBzdXBwb3J0ICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9DVFJMX1ZMQU4JMTkJLyogQ29udHJvbCBjaGFubmVsIFZMQU4gZmlsdGVyaW5nICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9DVFJMX1JYX0VYVFJBIDIwCS8qIEV4dHJhIFJYIG1vZGUgY29udHJvbCBzdXBwb3J0ICovCisKKyNkZWZpbmUgVklSVElPX05FVF9TX0xJTktfVVAJMQkvKiBMaW5rIGlzIHVwICovCisKK3N0cnVjdCB2aXJ0aW9fbmV0X2NvbmZpZyB7CisJLyogVGhlIGNvbmZpZyBkZWZpbmluZyBtYWMgYWRkcmVzcyAoaWYgVklSVElPX05FVF9GX01BQykgKi8KKwlfX3U4IG1hY1s2XTsKKwkvKiBTZWUgVklSVElPX05FVF9GX1NUQVRVUyBhbmQgVklSVElPX05FVF9TXyogYWJvdmUgKi8KKwlfX3UxNiBzdGF0dXM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBUaGlzIGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBzY2F0dGVyLWdhdGhlciBsaXN0LiAgSWYgeW91IGRvbid0CisgKiBzcGVjaWZ5IEdTTyBvciBDU1VNIGZlYXR1cmVzLCB5b3UgY2FuIHNpbXBseSBpZ25vcmUgdGhlIGhlYWRlci4gKi8KK3N0cnVjdCB2aXJ0aW9fbmV0X2hkciB7CisjZGVmaW5lIFZJUlRJT19ORVRfSERSX0ZfTkVFRFNfQ1NVTQkxCS8vIFVzZSBjc3VtX3N0YXJ0LCBjc3VtX29mZnNldAorI2RlZmluZSBWSVJUSU9fTkVUX0hEUl9GX0RBVEFfVkFMSUQJMgkvLyBDc3VtIGlzIHZhbGlkCisJX191OCBmbGFnczsKKyNkZWZpbmUgVklSVElPX05FVF9IRFJfR1NPX05PTkUJCTAJLy8gTm90IGEgR1NPIGZyYW1lCisjZGVmaW5lIFZJUlRJT19ORVRfSERSX0dTT19UQ1BWNAkxCS8vIEdTTyBmcmFtZSwgSVB2NCBUQ1AgKFRTTykKKyNkZWZpbmUgVklSVElPX05FVF9IRFJfR1NPX1VEUAkJMwkvLyBHU08gZnJhbWUsIElQdjQgVURQIChVRk8pCisjZGVmaW5lIFZJUlRJT19ORVRfSERSX0dTT19UQ1BWNgk0CS8vIEdTTyBmcmFtZSwgSVB2NiBUQ1AKKyNkZWZpbmUgVklSVElPX05FVF9IRFJfR1NPX0VDTgkJMHg4MAkvLyBUQ1AgaGFzIEVDTiBzZXQKKwlfX3U4IGdzb190eXBlOworCV9fdTE2IGhkcl9sZW47CQkvKiBFdGhlcm5ldCArIElQICsgdGNwL3VkcCBoZHJzICovCisJX191MTYgZ3NvX3NpemU7CQkvKiBCeXRlcyB0byBhcHBlbmQgdG8gaGRyX2xlbiBwZXIgZnJhbWUgKi8KKwlfX3UxNiBjc3VtX3N0YXJ0OwkvKiBQb3NpdGlvbiB0byBzdGFydCBjaGVja3N1bW1pbmcgZnJvbSAqLworCV9fdTE2IGNzdW1fb2Zmc2V0OwkvKiBPZmZzZXQgYWZ0ZXIgdGhhdCB0byBwbGFjZSBjaGVja3N1bSAqLworfTsKKworLyogVGhpcyBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyIHRvIHVzZSB3aGVuIHRoZSBNUkdfUlhCVUYKKyAqIGZlYXR1cmUgaGFzIGJlZW4gbmVnb3RpYXRlZC4gKi8KK3N0cnVjdCB2aXJ0aW9fbmV0X2hkcl9tcmdfcnhidWYgeworCXN0cnVjdCB2aXJ0aW9fbmV0X2hkciBoZHI7CisJX191MTYgbnVtX2J1ZmZlcnM7CS8qIE51bWJlciBvZiBtZXJnZWQgcnggYnVmZmVycyAqLworfTsKKworLyoKKyAqIENvbnRyb2wgdmlydHF1ZXVlIGRhdGEgc3RydWN0dXJlcworICoKKyAqIFRoZSBjb250cm9sIHZpcnRxdWV1ZSBleHBlY3RzIGEgaGVhZGVyIGluIHRoZSBmaXJzdCBzZyBlbnRyeQorICogYW5kIGFuIGFjay9zdGF0dXMgcmVzcG9uc2UgaW4gdGhlIGxhc3QgZW50cnkuICBEYXRhIGZvciB0aGUKKyAqIGNvbW1hbmQgZ29lcyBpbiBiZXR3ZWVuLgorICovCitzdHJ1Y3QgdmlydGlvX25ldF9jdHJsX2hkciB7CisJX191OCBjbGFzczsKKwlfX3U4IGNtZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3R5cGVkZWYgX191OCB2aXJ0aW9fbmV0X2N0cmxfYWNrOworCisjZGVmaW5lIFZJUlRJT19ORVRfT0sgICAgIDAKKyNkZWZpbmUgVklSVElPX05FVF9FUlIgICAgMQorCisvKgorICogQ29udHJvbCB0aGUgUlggbW9kZSwgaWUuIHByb21pc3Vjb3VzLCBhbGxtdWx0aSwgZXRjLi4uCisgKiBBbGwgY29tbWFuZHMgcmVxdWlyZSBhbiAib3V0IiBzZyBlbnRyeSBjb250YWluaW5nIGEgMSBieXRlCisgKiBzdGF0ZSB2YWx1ZSwgemVybyA9IGRpc2FibGUsIG5vbi16ZXJvID0gZW5hYmxlLiAgQ29tbWFuZHMKKyAqIDAgYW5kIDEgYXJlIHN1cHBvcnRlZCB3aXRoIHRoZSBWSVJUSU9fTkVUX0ZfQ1RSTF9SWCBmZWF0dXJlLgorICogQ29tbWFuZHMgMi01IGFyZSBhZGRlZCB3aXRoIFZJUlRJT19ORVRfRl9DVFJMX1JYX0VYVFJBLgorICovCisjZGVmaW5lIFZJUlRJT19ORVRfQ1RSTF9SWCAgICAwCisgI2RlZmluZSBWSVJUSU9fTkVUX0NUUkxfUlhfUFJPTUlTQyAgICAgIDAKKyAjZGVmaW5lIFZJUlRJT19ORVRfQ1RSTF9SWF9BTExNVUxUSSAgICAgMQorICNkZWZpbmUgVklSVElPX05FVF9DVFJMX1JYX0FMTFVOSSAgICAgICAyCisgI2RlZmluZSBWSVJUSU9fTkVUX0NUUkxfUlhfTk9NVUxUSSAgICAgIDMKKyAjZGVmaW5lIFZJUlRJT19ORVRfQ1RSTF9SWF9OT1VOSSAgICAgICAgNAorICNkZWZpbmUgVklSVElPX05FVF9DVFJMX1JYX05PQkNBU1QgICAgICA1CisKKy8qCisgKiBDb250cm9sIHRoZSBNQUMgZmlsdGVyIHRhYmxlLgorICoKKyAqIFRoZSBNQUMgZmlsdGVyIHRhYmxlIGlzIG1hbmFnZWQgYnkgdGhlIGh5cGVydmlzb3IsIHRoZSBndWVzdCBzaG91bGQKKyAqIGFzc3VtZSB0aGUgc2l6ZSBpcyBpbmZpbml0ZS4gIEZpbHRlcmluZyBzaG91bGQgYmUgY29uc2lkZXJlZAorICogbm9uLXBlcmZlY3QsIGllLiBiYXNlZCBvbiBoeXBlcnZpc29yIHJlc291cmNlcywgdGhlIGd1ZXN0IG1heQorICogcmVjZWl2ZWQgcGFja2V0cyBmcm9tIHNvdXJjZXMgbm90IHNwZWNpZmllZCBpbiB0aGUgZmlsdGVyIGxpc3QuCisgKgorICogSW4gYWRkaXRpb24gdG8gdGhlIGNsYXNzL2NtZCBoZWFkZXIsIHRoZSBUQUJMRV9TRVQgY29tbWFuZCByZXF1aXJlcworICogdHdvIG91dCBzY2F0dGVybGlzdHMuICBFYWNoIGNvbnRhaW5zIGEgNCBieXRlIGNvdW50IG9mIGVudHJpZXMgZm9sbG93ZWQKKyAqIGJ5IGEgY29uY2F0ZW5hdGVkIGJ5dGUgc3RyZWFtIG9mIHRoZSBFVEhfQUxFTiBNQUMgYWRkcmVzc2VzLiAgVGhlCisgKiBmaXJzdCBzZyBsaXN0IGNvbnRhaW5zIHVuaWNhc3QgYWRkcmVzc2VzLCB0aGUgc2Vjb25kIGlzIGZvciBtdWx0aWNhc3QuCisgKiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgcHJlc2VudCBpZiB0aGUgVklSVElPX05FVF9GX0NUUkxfUlggZmVhdHVyZQorICogaXMgYXZhaWxhYmxlLgorICovCitzdHJ1Y3QgdmlydGlvX25ldF9jdHJsX21hYyB7CisJX191MzIgZW50cmllczsKKwlfX3U4IG1hY3NbXVtFVEhfQUxFTl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFZJUlRJT19ORVRfQ1RSTF9NQUMgICAgMQorICNkZWZpbmUgVklSVElPX05FVF9DVFJMX01BQ19UQUJMRV9TRVQgICAgICAgIDAKKworLyoKKyAqIENvbnRyb2wgVkxBTiBmaWx0ZXJpbmcKKyAqCisgKiBUaGUgVkxBTiBmaWx0ZXIgdGFibGUgaXMgY29udHJvbGxlZCB2aWEgYSBzaW1wbGUgQUREL0RFTCBpbnRlcmZhY2UuCisgKiBWTEFOIElEcyBub3QgYWRkZWQgbWF5IGJlIGZpbHRlcmQgYnkgdGhlIGh5cGVydmlzb3IuICBEZWwgaXMgdGhlCisgKiBvcHBvc2l0ZSBvZiBhZGQuICBCb3RoIGNvbW1hbmRzIGV4cGVjdCBhbiBvdXQgZW50cnkgY29udGFpbmluZyBhIDIKKyAqIGJ5dGUgVkxBTiBJRC4gIFZMQU4gZmlsdGVydGluZyBpcyBhdmFpbGFibGUgd2l0aCB0aGUKKyAqIFZJUlRJT19ORVRfRl9DVFJMX1ZMQU4gZmVhdHVyZSBiaXQuCisgKi8KKyNkZWZpbmUgVklSVElPX05FVF9DVFJMX1ZMQU4gICAgICAgMgorICNkZWZpbmUgVklSVElPX05FVF9DVFJMX1ZMQU5fQUREICAgICAgICAgICAgIDAKKyAjZGVmaW5lIFZJUlRJT19ORVRfQ1RSTF9WTEFOX0RFTCAgICAgICAgICAgICAxCisKKyNlbmRpZiAvKiBfTElOVVhfVklSVElPX05FVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19wY2kuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjZmM2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19wY2kuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogVmlydGlvIFBDSSBkcml2ZXIKKyAqCisgKiBUaGlzIG1vZHVsZSBhbGxvd3MgdmlydGlvIGRldmljZXMgdG8gYmUgdXNlZCBvdmVyIGEgdmlydHVhbCBQQ0kgZGV2aWNlLgorICogVGhpcyBjYW4gYmUgdXNlZCB3aXRoIFFFTVUgYmFzZWQgVk1NcyBsaWtlIEtWTSBvciBYZW4uCisgKgorICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA3CisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CisgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9WSVJUSU9fUENJX0gKKyNkZWZpbmUgX0xJTlVYX1ZJUlRJT19QQ0lfSAorCisjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgorCisvKiBBIDMyLWJpdCByL28gYml0bWFzayBvZiB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBob3N0ICovCisjZGVmaW5lIFZJUlRJT19QQ0lfSE9TVF9GRUFUVVJFUwkwCisKKy8qIEEgMzItYml0IHIvdyBiaXRtYXNrIG9mIGZlYXR1cmVzIGFjdGl2YXRlZCBieSB0aGUgZ3Vlc3QgKi8KKyNkZWZpbmUgVklSVElPX1BDSV9HVUVTVF9GRUFUVVJFUwk0CisKKy8qIEEgMzItYml0IHIvdyBQRk4gZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcXVldWUgKi8KKyNkZWZpbmUgVklSVElPX1BDSV9RVUVVRV9QRk4JCTgKKworLyogQSAxNi1iaXQgci9vIHF1ZXVlIHNpemUgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcXVldWUgKi8KKyNkZWZpbmUgVklSVElPX1BDSV9RVUVVRV9OVU0JCTEyCisKKy8qIEEgMTYtYml0IHIvdyBxdWV1ZSBzZWxlY3RvciAqLworI2RlZmluZSBWSVJUSU9fUENJX1FVRVVFX1NFTAkJMTQKKworLyogQSAxNi1iaXQgci93IHF1ZXVlIG5vdGlmaWVyICovCisjZGVmaW5lIFZJUlRJT19QQ0lfUVVFVUVfTk9USUZZCQkxNgorCisvKiBBbiA4LWJpdCBkZXZpY2Ugc3RhdHVzIHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgVklSVElPX1BDSV9TVEFUVVMJCTE4CisKKy8qIEFuIDgtYml0IHIvbyBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyLiAgUmVhZGluZyB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlCisgKiBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBJU1IgYW5kIHdpbGwgYWxzbyBjbGVhciBpdC4gIFRoaXMgaXMgZWZmZWN0aXZlbHkKKyAqIGEgcmVhZC1hbmQtYWNrbm93bGVkZ2UuICovCisjZGVmaW5lIFZJUlRJT19QQ0lfSVNSCQkJMTkKKworLyogVGhlIGJpdCBvZiB0aGUgSVNSIHdoaWNoIGluZGljYXRlcyBhIGRldmljZSBjb25maWd1cmF0aW9uIGNoYW5nZS4gKi8KKyNkZWZpbmUgVklSVElPX1BDSV9JU1JfQ09ORklHCQkweDIKKworLyogTVNJLVggcmVnaXN0ZXJzOiBvbmx5IGVuYWJsZWQgaWYgTVNJLVggaXMgZW5hYmxlZC4gKi8KKy8qIEEgMTYtYml0IHZlY3RvciBmb3IgY29uZmlndXJhdGlvbiBjaGFuZ2VzLiAqLworI2RlZmluZSBWSVJUSU9fTVNJX0NPTkZJR19WRUNUT1IgICAgICAgIDIwCisvKiBBIDE2LWJpdCB2ZWN0b3IgZm9yIHNlbGVjdGVkIHF1ZXVlIG5vdGlmaWNhdGlvbnMuICovCisjZGVmaW5lIFZJUlRJT19NU0lfUVVFVUVfVkVDVE9SICAgICAgICAgMjIKKy8qIFZlY3RvciB2YWx1ZSB1c2VkIHRvIGRpc2FibGUgTVNJIGZvciBxdWV1ZSAqLworI2RlZmluZSBWSVJUSU9fTVNJX05PX1ZFQ1RPUiAgICAgICAgICAgIDB4ZmZmZgorCisvKiBUaGUgcmVtYWluaW5nIHNwYWNlIGlzIGRlZmluZWQgYnkgZWFjaCBkcml2ZXIgYXMgdGhlIHBlci1kcml2ZXIKKyAqIGNvbmZpZ3VyYXRpb24gc3BhY2UgKi8KKyNkZWZpbmUgVklSVElPX1BDSV9DT05GSUcoZGV2KQkJKChkZXYpLT5tc2l4X2VuYWJsZWQgPyAyNCA6IDIwKQorCisvKiBWaXJ0aW8gQUJJIHZlcnNpb24sIHRoaXMgbXVzdCBtYXRjaCBleGFjdGx5ICovCisjZGVmaW5lIFZJUlRJT19QQ0lfQUJJX1ZFUlNJT04JCTAKKworLyogSG93IG1hbnkgYml0cyB0byBzaGlmdCBwaHlzaWNhbCBxdWV1ZSBhZGRyZXNzIHdyaXR0ZW4gdG8gUVVFVUVfUEZOLgorICogMTIgaXMgaGlzdG9yaWNhbCwgYW5kIGR1ZSB0byB4ODYgcGFnZSBzaXplLiAqLworI2RlZmluZSBWSVJUSU9fUENJX1FVRVVFX0FERFJfU0hJRlQJMTIKKworLyogVGhlIGFsaWdubWVudCB0byB1c2UgYmV0d2VlbiBjb25zdW1lciBhbmQgcHJvZHVjZXIgcGFydHMgb2YgdnJpbmcuCisgKiB4ODYgcGFnZXNpemUgYWdhaW4uICovCisjZGVmaW5lIFZJUlRJT19QQ0lfVlJJTkdfQUxJR04JCTQwOTYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fcmluZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fcmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMzMzZTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19yaW5nLmgKQEAgLTAsMCArMSwxNjMgQEAKKyNpZm5kZWYgX0xJTlVYX1ZJUlRJT19SSU5HX0gKKyNkZWZpbmUgX0xJTlVYX1ZJUlRJT19SSU5HX0gKKy8qIEFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50IHZpcnRpbyBpbXBsZW1lbnRhdGlvbiwgY3VycmVudGx5IGZvciB1c2UgYnkgS1ZNCisgKiBhbmQgbGd1ZXN0LCBidXQgaG9wZWZ1bGx5IG90aGVycyBzb29uLiAgRG8gTk9UIGNoYW5nZSB0aGlzIHNpbmNlIGl0IHdpbGwKKyAqIGJyZWFrIGV4aXN0aW5nIHNlcnZlcnMgYW5kIGNsaWVudHMuCisgKgorICogVGhpcyBoZWFkZXIgaXMgQlNEIGxpY2Vuc2VkIHNvIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQKKyAqIGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBJQk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIElCTSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIENvcHlyaWdodCBSdXN0eSBSdXNzZWxsIElCTSBDb3Jwb3JhdGlvbiAyMDA3LiAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIFRoaXMgbWFya3MgYSBidWZmZXIgYXMgY29udGludWluZyB2aWEgdGhlIG5leHQgZmllbGQuICovCisjZGVmaW5lIFZSSU5HX0RFU0NfRl9ORVhUCTEKKy8qIFRoaXMgbWFya3MgYSBidWZmZXIgYXMgd3JpdGUtb25seSAob3RoZXJ3aXNlIHJlYWQtb25seSkuICovCisjZGVmaW5lIFZSSU5HX0RFU0NfRl9XUklURQkyCisvKiBUaGlzIG1lYW5zIHRoZSBidWZmZXIgY29udGFpbnMgYSBsaXN0IG9mIGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KKyNkZWZpbmUgVlJJTkdfREVTQ19GX0lORElSRUNUCTQKKworLyogVGhlIEhvc3QgdXNlcyB0aGlzIGluIHVzZWQtPmZsYWdzIHRvIGFkdmlzZSB0aGUgR3Vlc3Q6IGRvbid0IGtpY2sgbWUgd2hlbgorICogeW91IGFkZCBhIGJ1ZmZlci4gIEl0J3MgdW5yZWxpYWJsZSwgc28gaXQncyBzaW1wbHkgYW4gb3B0aW1pemF0aW9uLiAgR3Vlc3QKKyAqIHdpbGwgc3RpbGwga2ljayBpZiBpdCdzIG91dCBvZiBidWZmZXJzLiAqLworI2RlZmluZSBWUklOR19VU0VEX0ZfTk9fTk9USUZZCTEKKy8qIFRoZSBHdWVzdCB1c2VzIHRoaXMgaW4gYXZhaWwtPmZsYWdzIHRvIGFkdmlzZSB0aGUgSG9zdDogZG9uJ3QgaW50ZXJydXB0IG1lCisgKiB3aGVuIHlvdSBjb25zdW1lIGEgYnVmZmVyLiAgSXQncyB1bnJlbGlhYmxlLCBzbyBpdCdzIHNpbXBseSBhbgorICogb3B0aW1pemF0aW9uLiAgKi8KKyNkZWZpbmUgVlJJTkdfQVZBSUxfRl9OT19JTlRFUlJVUFQJMQorCisvKiBXZSBzdXBwb3J0IGluZGlyZWN0IGJ1ZmZlciBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBWSVJUSU9fUklOR19GX0lORElSRUNUX0RFU0MJMjgKKworLyogVGhlIEd1ZXN0IHB1Ymxpc2hlcyB0aGUgdXNlZCBpbmRleCBmb3Igd2hpY2ggaXQgZXhwZWN0cyBhbiBpbnRlcnJ1cHQKKyAqIGF0IHRoZSBlbmQgb2YgdGhlIGF2YWlsIHJpbmcuIEhvc3Qgc2hvdWxkIGlnbm9yZSB0aGUgYXZhaWwtPmZsYWdzIGZpZWxkLiAqLworLyogVGhlIEhvc3QgcHVibGlzaGVzIHRoZSBhdmFpbCBpbmRleCBmb3Igd2hpY2ggaXQgZXhwZWN0cyBhIGtpY2sKKyAqIGF0IHRoZSBlbmQgb2YgdGhlIHVzZWQgcmluZy4gR3Vlc3Qgc2hvdWxkIGlnbm9yZSB0aGUgdXNlZC0+ZmxhZ3MgZmllbGQuICovCisjZGVmaW5lIFZJUlRJT19SSU5HX0ZfRVZFTlRfSURYCQkyOQorCisvKiBWaXJ0aW8gcmluZyBkZXNjcmlwdG9yczogMTYgYnl0ZXMuICBUaGVzZSBjYW4gY2hhaW4gdG9nZXRoZXIgdmlhICJuZXh0Ii4gKi8KK3N0cnVjdCB2cmluZ19kZXNjIHsKKwkvKiBBZGRyZXNzIChndWVzdC1waHlzaWNhbCkuICovCisJX191NjQgYWRkcjsKKwkvKiBMZW5ndGguICovCisJX191MzIgbGVuOworCS8qIFRoZSBmbGFncyBhcyBpbmRpY2F0ZWQgYWJvdmUuICovCisJX191MTYgZmxhZ3M7CisJLyogV2UgY2hhaW4gdW51c2VkIGRlc2NyaXB0b3JzIHZpYSB0aGlzLCB0b28gKi8KKwlfX3UxNiBuZXh0OworfTsKKworc3RydWN0IHZyaW5nX2F2YWlsIHsKKwlfX3UxNiBmbGFnczsKKwlfX3UxNiBpZHg7CisJX191MTYgcmluZ1tdOworfTsKKworLyogdTMyIGlzIHVzZWQgaGVyZSBmb3IgaWRzIGZvciBwYWRkaW5nIHJlYXNvbnMuICovCitzdHJ1Y3QgdnJpbmdfdXNlZF9lbGVtIHsKKwkvKiBJbmRleCBvZiBzdGFydCBvZiB1c2VkIGRlc2NyaXB0b3IgY2hhaW4uICovCisJX191MzIgaWQ7CisJLyogVG90YWwgbGVuZ3RoIG9mIHRoZSBkZXNjcmlwdG9yIGNoYWluIHdoaWNoIHdhcyB1c2VkICh3cml0dGVuIHRvKSAqLworCV9fdTMyIGxlbjsKK307CisKK3N0cnVjdCB2cmluZ191c2VkIHsKKwlfX3UxNiBmbGFnczsKKwlfX3UxNiBpZHg7CisJc3RydWN0IHZyaW5nX3VzZWRfZWxlbSByaW5nW107Cit9OworCitzdHJ1Y3QgdnJpbmcgeworCXVuc2lnbmVkIGludCBudW07CisKKwlzdHJ1Y3QgdnJpbmdfZGVzYyAqZGVzYzsKKworCXN0cnVjdCB2cmluZ19hdmFpbCAqYXZhaWw7CisKKwlzdHJ1Y3QgdnJpbmdfdXNlZCAqdXNlZDsKK307CisKKy8qIFRoZSBzdGFuZGFyZCBsYXlvdXQgZm9yIHRoZSByaW5nIGlzIGEgY29udGludW91cyBjaHVuayBvZiBtZW1vcnkgd2hpY2ggbG9va3MKKyAqIGxpa2UgdGhpcy4gIFdlIGFzc3VtZSBudW0gaXMgYSBwb3dlciBvZiAyLgorICoKKyAqIHN0cnVjdCB2cmluZworICogeworICoJLy8gVGhlIGFjdHVhbCBkZXNjcmlwdG9ycyAoMTYgYnl0ZXMgZWFjaCkKKyAqCXN0cnVjdCB2cmluZ19kZXNjIGRlc2NbbnVtXTsKKyAqCisgKgkvLyBBIHJpbmcgb2YgYXZhaWxhYmxlIGRlc2NyaXB0b3IgaGVhZHMgd2l0aCBmcmVlLXJ1bm5pbmcgaW5kZXguCisgKglfX3UxNiBhdmFpbF9mbGFnczsKKyAqCV9fdTE2IGF2YWlsX2lkeDsKKyAqCV9fdTE2IGF2YWlsYWJsZVtudW1dOworICoJX191MTYgdXNlZF9ldmVudF9pZHg7CisgKgorICoJLy8gUGFkZGluZyB0byB0aGUgbmV4dCBhbGlnbiBib3VuZGFyeS4KKyAqCWNoYXIgcGFkW107CisgKgorICoJLy8gQSByaW5nIG9mIHVzZWQgZGVzY3JpcHRvciBoZWFkcyB3aXRoIGZyZWUtcnVubmluZyBpbmRleC4KKyAqCV9fdTE2IHVzZWRfZmxhZ3M7CisgKglfX3UxNiB1c2VkX2lkeDsKKyAqCXN0cnVjdCB2cmluZ191c2VkX2VsZW0gdXNlZFtudW1dOworICoJX191MTYgYXZhaWxfZXZlbnRfaWR4OworICogfTsKKyAqLworLyogV2UgcHVibGlzaCB0aGUgdXNlZCBldmVudCBpbmRleCBhdCB0aGUgZW5kIG9mIHRoZSBhdmFpbGFibGUgcmluZywgYW5kIHZpY2UKKyAqIHZlcnNhLiBUaGV5IGFyZSBhdCB0aGUgZW5kIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KKyNkZWZpbmUgdnJpbmdfdXNlZF9ldmVudCh2cikgKCh2ciktPmF2YWlsLT5yaW5nWyh2ciktPm51bV0pCisjZGVmaW5lIHZyaW5nX2F2YWlsX2V2ZW50KHZyKSAoKihfX3UxNiAqKSYodnIpLT51c2VkLT5yaW5nWyh2ciktPm51bV0pCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgdnJpbmdfaW5pdChzdHJ1Y3QgdnJpbmcgKnZyLCB1bnNpZ25lZCBpbnQgbnVtLCB2b2lkICpwLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbikKK3sKKwl2ci0+bnVtID0gbnVtOworCXZyLT5kZXNjID0gcDsKKwl2ci0+YXZhaWwgPSBwICsgbnVtKnNpemVvZihzdHJ1Y3QgdnJpbmdfZGVzYyk7CisJdnItPnVzZWQgPSAodm9pZCAqKSgoKHVuc2lnbmVkIGxvbmcpJnZyLT5hdmFpbC0+cmluZ1tudW1dICsgc2l6ZW9mKF9fdTE2KQorCQkrIGFsaWduLTEpICYgfihhbGlnbiAtIDEpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgdnJpbmdfc2l6ZSh1bnNpZ25lZCBpbnQgbnVtLCB1bnNpZ25lZCBsb25nIGFsaWduKQoreworCXJldHVybiAoKHNpemVvZihzdHJ1Y3QgdnJpbmdfZGVzYykgKiBudW0gKyBzaXplb2YoX191MTYpICogKDMgKyBudW0pCisJCSArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSkpCisJCSsgc2l6ZW9mKF9fdTE2KSAqIDMgKyBzaXplb2Yoc3RydWN0IHZyaW5nX3VzZWRfZWxlbSkgKiBudW07Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgdXNlZCB3aXRoIFVTRURfRVZFTlRfSURYIGFuZCBBVkFJTF9FVkVOVF9JRFggKi8KKy8qIEFzc3VtaW5nIGEgZ2l2ZW4gZXZlbnRfaWR4IHZhbHVlIGZyb20gdGhlIG90aGVyIHNpemUsIGlmCisgKiB3ZSBoYXZlIGp1c3QgaW5jcmVtZW50ZWQgaW5kZXggZnJvbSBvbGQgdG8gbmV3X2lkeCwKKyAqIHNob3VsZCB3ZSB0cmlnZ2VyIGFuIGV2ZW50PyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHZyaW5nX25lZWRfZXZlbnQoX191MTYgZXZlbnRfaWR4LCBfX3UxNiBuZXdfaWR4LCBfX3UxNiBvbGQpCit7CisJLyogTm90ZTogWGVuIGhhcyBzaW1pbGFyIGxvZ2ljIGZvciBub3RpZmljYXRpb24gaG9sZC1vZmYKKwkgKiBpbiBpbmNsdWRlL3hlbi9pbnRlcmZhY2UvaW8vcmluZy5oIHdpdGggcmVxX2V2ZW50IGFuZCByZXFfcHJvZAorCSAqIGNvcnJlc3BvbmRpbmcgdG8gZXZlbnRfaWR4ICsgMSBhbmQgbmV3X2lkeCByZXNwZWN0aXZlbHkuCisJICogTm90ZSBhbHNvIHRoYXQgcmVxX2V2ZW50IGFuZCByZXFfcHJvZCBpbiBYZW4gc3RhcnQgYXQgMSwKKwkgKiBldmVudCBpbmRleGVzIGluIHZpcnRpbyBzdGFydCBhdCAwLiAqLworCXJldHVybiAoX191MTYpKG5ld19pZHggLSBldmVudF9pZHggLSAxKSA8IChfX3UxNikobmV3X2lkeCAtIG9sZCk7Cit9CisKKyNlbmRpZiAvKiBfTElOVVhfVklSVElPX1JJTkdfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fcm5nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ybmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGQ1ZGU4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fcm5nLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9MSU5VWF9WSVJUSU9fUk5HX0gKKyNkZWZpbmUgX0xJTlVYX1ZJUlRJT19STkdfSAorLyogVGhpcyBoZWFkZXIgaXMgQlNEIGxpY2Vuc2VkIHNvIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQKKyAqIGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLiAqLworI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uZmlnLmg+CisKKyNlbmRpZiAvKiBfTElOVVhfVklSVElPX1JOR19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Z0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Z0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwOGYwNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdnQuaApAQCAtMCwwICsxLDkwIEBACisjaWZuZGVmIF9MSU5VWF9WVF9ICisjZGVmaW5lIF9MSU5VWF9WVF9ICisKKworLyoKKyAqIFRoZXNlIGNvbnN0YW50cyBhcmUgYWxzbyB1c2VmdWwgZm9yIHVzZXItbGV2ZWwgYXBwcyAoZS5nLiwgVkMKKyAqIHJlc2l6aW5nKS4KKyAqLworI2RlZmluZSBNSU5fTlJfQ09OU09MRVMgMSAgICAgICAvKiBtdXN0IGJlIGF0IGxlYXN0IDEgKi8KKyNkZWZpbmUgTUFYX05SX0NPTlNPTEVTCTYzCS8qIHNlcmlhbCBsaW5lcyBzdGFydCBhdCA2NCAqLworI2RlZmluZSBNQVhfTlJfVVNFUl9DT05TT0xFUyA2MwkvKiBtdXN0IGJlIHJvb3QgdG8gYWxsb2NhdGUgYWJvdmUgdGhpcyAqLworCQkvKiBOb3RlOiB0aGUgaW9jdGwgVlRfR0VUU1RBVEUgZG9lcyBub3Qgd29yayBmb3IKKwkJICAgY29uc29sZXMgMTYgYW5kIGhpZ2hlciAoc2luY2UgaXQgcmV0dXJucyBhIHNob3J0KSAqLworCisvKiAweDU2IGlzICdWJywgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggdGVybWlvcyBhbmQga2QgKi8KKworI2RlZmluZSBWVF9PUEVOUVJZCTB4NTYwMAkvKiBmaW5kIGF2YWlsYWJsZSB2dCAqLworCitzdHJ1Y3QgdnRfbW9kZSB7CisJY2hhciBtb2RlOwkJLyogdnQgbW9kZSAqLworCWNoYXIgd2FpdHY7CQkvKiBpZiBzZXQsIGhhbmcgb24gd3JpdGVzIGlmIG5vdCBhY3RpdmUgKi8KKwlzaG9ydCByZWxzaWc7CQkvKiBzaWduYWwgdG8gcmFpc2Ugb24gcmVsZWFzZSByZXEgKi8KKwlzaG9ydCBhY3FzaWc7CQkvKiBzaWduYWwgdG8gcmFpc2Ugb24gYWNxdWlzaXRpb24gKi8KKwlzaG9ydCBmcnNpZzsJCS8qIHVudXNlZCAoc2V0IHRvIDApICovCit9OworI2RlZmluZSBWVF9HRVRNT0RFCTB4NTYwMQkvKiBnZXQgbW9kZSBvZiBhY3RpdmUgdnQgKi8KKyNkZWZpbmUgVlRfU0VUTU9ERQkweDU2MDIJLyogc2V0IG1vZGUgb2YgYWN0aXZlIHZ0ICovCisjZGVmaW5lCQlWVF9BVVRPCQkweDAwCS8qIGF1dG8gdnQgc3dpdGNoaW5nICovCisjZGVmaW5lCQlWVF9QUk9DRVNTCTB4MDEJLyogcHJvY2VzcyBjb250cm9scyBzd2l0Y2hpbmcgKi8KKyNkZWZpbmUJCVZUX0FDS0FDUQkweDAyCS8qIGFja25vd2xlZGdlIHN3aXRjaCAqLworCitzdHJ1Y3QgdnRfc3RhdCB7CisJdW5zaWduZWQgc2hvcnQgdl9hY3RpdmU7CS8qIGFjdGl2ZSB2dCAqLworCXVuc2lnbmVkIHNob3J0IHZfc2lnbmFsOwkvKiBzaWduYWwgdG8gc2VuZCAqLworCXVuc2lnbmVkIHNob3J0IHZfc3RhdGU7CQkvKiB2dCBiaXRtYXNrICovCit9OworI2RlZmluZSBWVF9HRVRTVEFURQkweDU2MDMJLyogZ2V0IGdsb2JhbCB2dCBzdGF0ZSBpbmZvICovCisjZGVmaW5lIFZUX1NFTkRTSUcJMHg1NjA0CS8qIHNpZ25hbCB0byBzZW5kIHRvIGJpdG1hc2sgb2YgdnRzICovCisKKyNkZWZpbmUgVlRfUkVMRElTUAkweDU2MDUJLyogcmVsZWFzZSBkaXNwbGF5ICovCisKKyNkZWZpbmUgVlRfQUNUSVZBVEUJMHg1NjA2CS8qIG1ha2UgdnQgYWN0aXZlICovCisjZGVmaW5lIFZUX1dBSVRBQ1RJVkUJMHg1NjA3CS8qIHdhaXQgZm9yIHZ0IGFjdGl2ZSAqLworI2RlZmluZSBWVF9ESVNBTExPQ0FURQkweDU2MDggIC8qIGZyZWUgbWVtb3J5IGFzc29jaWF0ZWQgdG8gdnQgKi8KKworc3RydWN0IHZ0X3NpemVzIHsKKwl1bnNpZ25lZCBzaG9ydCB2X3Jvd3M7CQkvKiBudW1iZXIgb2Ygcm93cyAqLworCXVuc2lnbmVkIHNob3J0IHZfY29sczsJCS8qIG51bWJlciBvZiBjb2x1bW5zICovCisJdW5zaWduZWQgc2hvcnQgdl9zY3JvbGxzaXplOwkvKiBudW1iZXIgb2YgbGluZXMgb2Ygc2Nyb2xsYmFjayAqLworfTsKKyNkZWZpbmUgVlRfUkVTSVpFCTB4NTYwOQkvKiBzZXQga2VybmVsJ3MgaWRlYSBvZiBzY3JlZW5zaXplICovCisKK3N0cnVjdCB2dF9jb25zaXplIHsKKwl1bnNpZ25lZCBzaG9ydCB2X3Jvd3M7CS8qIG51bWJlciBvZiByb3dzICovCisJdW5zaWduZWQgc2hvcnQgdl9jb2xzOwkvKiBudW1iZXIgb2YgY29sdW1ucyAqLworCXVuc2lnbmVkIHNob3J0IHZfdmxpbjsJLyogbnVtYmVyIG9mIHBpeGVsIHJvd3Mgb24gc2NyZWVuICovCisJdW5zaWduZWQgc2hvcnQgdl9jbGluOwkvKiBudW1iZXIgb2YgcGl4ZWwgcm93cyBwZXIgY2hhcmFjdGVyICovCisJdW5zaWduZWQgc2hvcnQgdl92Y29sOwkvKiBudW1iZXIgb2YgcGl4ZWwgY29sdW1ucyBvbiBzY3JlZW4gKi8KKwl1bnNpZ25lZCBzaG9ydCB2X2Njb2w7CS8qIG51bWJlciBvZiBwaXhlbCBjb2x1bW5zIHBlciBjaGFyYWN0ZXIgKi8KK307CisjZGVmaW5lIFZUX1JFU0laRVggICAgICAweDU2MEEgIC8qIHNldCBrZXJuZWwncyBpZGVhIG9mIHNjcmVlbnNpemUgKyBtb3JlICovCisjZGVmaW5lIFZUX0xPQ0tTV0lUQ0ggICAweDU2MEIgIC8qIGRpc2FsbG93IHZ0IHN3aXRjaGluZyAqLworI2RlZmluZSBWVF9VTkxPQ0tTV0lUQ0ggMHg1NjBDICAvKiBhbGxvdyB2dCBzd2l0Y2hpbmcgKi8KKyNkZWZpbmUgVlRfR0VUSElGT05UTUFTSyAweDU2MEQgIC8qIHJldHVybiBoaSBmb250IG1hc2sgKi8KKworc3RydWN0IHZ0X2V2ZW50IHsKKwl1bnNpZ25lZCBpbnQgZXZlbnQ7CisjZGVmaW5lIFZUX0VWRU5UX1NXSVRDSAkJMHgwMDAxCS8qIENvbnNvbGUgc3dpdGNoICovCisjZGVmaW5lIFZUX0VWRU5UX0JMQU5LCQkweDAwMDIJLyogU2NyZWVuIGJsYW5rICovCisjZGVmaW5lIFZUX0VWRU5UX1VOQkxBTksJMHgwMDA0CS8qIFNjcmVlbiB1bmJsYW5rICovCisjZGVmaW5lIFZUX0VWRU5UX1JFU0laRQkJMHgwMDA4CS8qIFJlc2l6ZSBkaXNwbGF5ICovCisjZGVmaW5lIFZUX01BWF9FVkVOVAkJMHgwMDBGCisJdW5zaWduZWQgaW50IG9sZGV2OwkJLyogT2xkIGNvbnNvbGUgKi8KKwl1bnNpZ25lZCBpbnQgbmV3ZXY7CQkvKiBOZXcgY29uc29sZSAoaWYgY2hhbmdpbmcpICovCisJdW5zaWduZWQgaW50IHBhZFs0XTsJCS8qIFBhZGRpbmcgZm9yIGV4cGFuc2lvbiAqLworfTsKKworI2RlZmluZSBWVF9XQUlURVZFTlQJMHg1NjBFCS8qIFdhaXQgZm9yIGFuIGV2ZW50ICovCisKK3N0cnVjdCB2dF9zZXRhY3RpdmF0ZSB7CisJdW5zaWduZWQgaW50IGNvbnNvbGU7CisJc3RydWN0IHZ0X21vZGUgbW9kZTsKK307CisKKyNkZWZpbmUgVlRfU0VUQUNUSVZBVEUJMHg1NjBGCS8qIEFjdGl2YXRlIGFuZCBzZXQgdGhlIG1vZGUgb2YgYSBjb25zb2xlICovCisKKworI2RlZmluZSB2dF9nZXRfa21zZ19yZWRpcmVjdCgpIHZ0X2ttc2dfcmVkaXJlY3QoLTEpCisKKyNlbmRpZiAvKiBfTElOVVhfVlRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93YWl0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dhaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2RiZGMyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93YWl0LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfTElOVVhfV0FJVF9ICisjZGVmaW5lIF9MSU5VWF9XQUlUX0gKKworI2RlZmluZSBXTk9IQU5HCQkweDAwMDAwMDAxCisjZGVmaW5lIFdVTlRSQUNFRAkweDAwMDAwMDAyCisjZGVmaW5lIFdTVE9QUEVECVdVTlRSQUNFRAorI2RlZmluZSBXRVhJVEVECQkweDAwMDAwMDA0CisjZGVmaW5lIFdDT05USU5VRUQJMHgwMDAwMDAwOAorI2RlZmluZSBXTk9XQUlUCQkweDAxMDAwMDAwCS8qIERvbid0IHJlYXAsIGp1c3QgcG9sbCBzdGF0dXMuICAqLworCisjZGVmaW5lIF9fV05PVEhSRUFECTB4MjAwMDAwMDAJLyogRG9uJ3Qgd2FpdCBvbiBjaGlsZHJlbiBvZiBvdGhlciB0aHJlYWRzIGluIHRoaXMgZ3JvdXAgKi8KKyNkZWZpbmUgX19XQUxMCQkweDQwMDAwMDAwCS8qIFdhaXQgb24gYWxsIGNoaWxkcmVuLCByZWdhcmRsZXNzIG9mIHR5cGUgKi8KKyNkZWZpbmUgX19XQ0xPTkUJMHg4MDAwMDAwMAkvKiBXYWl0IG9ubHkgb24gbm9uLVNJR0NITEQgY2hpbGRyZW4gKi8KKworLyogRmlyc3QgYXJndW1lbnQgdG8gd2FpdGlkOiAqLworI2RlZmluZSBQX0FMTAkJMAorI2RlZmluZSBQX1BJRAkJMQorI2RlZmluZSBQX1BHSUQJCTIKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvd2Fucm91dGVyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NjE1YWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oCkBAIC0wLDAgKzEsNDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogd2Fucm91dGVyLmgJRGVmaW5pdGlvbnMgZm9yIHRoZSBXQU4gTXVsdGlwcm90b2NvbCBSb3V0ZXIgTW9kdWxlLgorKgkJVGhpcyBtb2R1bGUgcHJvdmlkZXMgQVBJIGFuZCBjb21tb24gc2VydmljZXMgZm9yIFdBTiBMaW5rCisqCQlEcml2ZXJzIGFuZCBpcyBjb21wbGV0ZWx5IGhhcmR3YXJlLWluZGVwZW5kZW50LgorKgorKiBBdXRob3I6IAlOZW5hZCBDb3JiaWMgPG5jb3JiaWNAc2FuZ29tYS5jb20+CisqCQlHaWRlb24gSGFjayAJCisqIEFkZGl0aW9uczoJQXJuYWxkbyBNZWxvCisqCisqIENvcHlyaWdodDoJKGMpIDE5OTUtMjAwMCBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuCisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIEp1bCAyMSwgMjAwMCAgTmVuYWQgQ29yYmljCUFkZGVkIFdBTl9GVDFfUkVBRFkgU3RhdGUKKyogRmViIDI0LCAyMDAwICBOZW5hZCBDb3JiaWMgICAgQWRkZWQgc3VwcG9ydCBmb3Igc29ja2V0IGJhc2VkIHgyNWFwaQorKiBKYW4gMjgsIDIwMDAgIE5lbmFkIENvcmJpYyAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgQVNZTkMgcHJvdG9jb2wuCisqIE9jdCAwNCwgMTk5OSAgTmVuYWQgQ29yYmljIAlVcGRhdGVkIGZvciAyLjEuMCByZWxlYXNlCisqIEp1biAwMiwgMTk5OSAgR2lkZW9uIEhhY2sJQWRkZWQgc3VwcG9ydCBmb3IgdGhlIFM1MTQgYWRhcHRlci4KKyogTWF5IDIzLCAxOTk5CUFybmFsZG8gTWVsbwlBZGRlZCBsb2NhbF9hZGRyIHRvIHdhbmlmX2NvbmZfdAorKgkJCQlXQU5fRElTQ09OTkVDVElORyBzdGF0ZSBhZGRlZAorKiBKdWwgMjAsIDE5OTgJRGF2aWQgRm9uZwlBZGRlZCBJbnZlcnNlIEFSUCBvcHRpb25zIHRvICd3YW5pZl9jb25mX3QnCisqIEp1biAxMiwgMTk5OAlEYXZpZCBGb25nCUFkZGVkIENpc2NvIEhETEMgc3VwcG9ydC4KKyogRGVjIDE2LCAxOTk3CUphc3ByZWV0IFNpbmdoCU1vdmVkICdlbmFibGVfSVBYJyBhbmQgJ25ldHdvcmtfbnVtYmVyJyB0bworKgkJCQknd2FuaWZfY29uZl90JworKiBEZWMgMDUsIDE5OTcJSmFzcHJlZXQgU2luZ2gJQWRkZWQgJ3BhcCcsICdjaGFwJyB0byAnd2FuaWZfY29uZl90JworKgkJCQlBZGRlZCAnYXV0aGVudGljYXRvcicgdG8gJ3dhbl9wcHBfY29uZl90JworKiBOb3YgMDYsIDE5OTcJSmFzcHJlZXQgU2luZ2gJQ2hhbmdlZCBSb3V0ZXIgRHJpdmVyIHZlcnNpb24gdG8gMS4xIGZyb20gMS4wCisqIE9jdCAyMCwgMTk5NwlKYXNwcmVldCBTaW5naAlBZGRlZCAnY2lyJywnYmMnLCdiZScgYW5kICdtYycgdG8gJ3dhbmlmX2NvbmZfdCcKKyoJCQkJQWRkZWQgJ2VuYWJsZV9JUFgnIGFuZCAnbmV0d29ya19udW1iZXInIHRvIAorKgkJCQknd2FuX2RldmljZV90Jy4gIEFsc28gYWRkZWQgZGVmaW5lcyBmb3IKKyoJCQkJVURQIFBBQ0tFVCBUWVBFLCBJbnRlcnJ1cHQgdGVzdCwgY3JpdGljYWwgdmFsdWVzCisqCQkJCWZvciBSQUNFIGNvbmRpdGlvbnMuCisqIE9jdCAwNSwgMTk5NwlKYXNwcmVldCBTaW5naAlBZGRlZCAnZGxjaV9udW0nIGFuZCAnZGxjaVsxMDBdJyB0byAKKyoJCQkJJ3dhbl9mcl9jb25mX3QnIHRvIGNvbmZpZ3VyZSBhIGxpc3Qgb2YgZGxjaShzKQorKgkJCQlmb3IgYSBOT0RFIAorKiBKdWwgMDcsIDE5OTcJSmFzcHJlZXQgU2luZ2gJQWRkZWQgJ3R0bCcgdG8gJ3dhbmRldl9jb25mX3QnICYgJ3dhbl9kZXZpY2VfdCcKKyogTWF5IDI5LCAxOTk3IAlKYXNwcmVldCBTaW5naAlBZGRlZCAndHhfaW50X2VuYWJsZWQnIHRvICd3YW5fZGV2aWNlX3QnCisqIE1heSAyMSwgMTk5NwlKYXNwcmVldCBTaW5naAlBZGRlZCAndWRwX3BvcnQnIHRvICd3YW5fZGV2aWNlX3QnCisqIEFwciAyNSwgMTk5NyAgRmFyaGFuIFRoYXdhciAgIEFkZGVkICd1ZHBfcG9ydCcgdG8gJ3dhbmRldl9jb25mX3QnCisqIEphbiAxNiwgMTk5NwlHZW5lIEtvemluCXJvdXRlcl9kZXZsaXN0IG1hZGUgcHVibGljCisqIEphbiAwMiwgMTk5NwlHZW5lIEtvemluCUluaXRpYWwgdmVyc2lvbiAoYmFzZWQgb24gd2FucGlwZS5oKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV9ST1VURVJfSAorI2RlZmluZQlfUk9VVEVSX0gKKworI2RlZmluZQlST1VURVJfTkFNRQkid2Fucm91dGVyIgkvKiBpbiBjYXNlIHdlIGV2ZXIgY2hhbmdlIGl0ICovCisjZGVmaW5lCVJPVVRFUl9WRVJTSU9OCTEJCS8qIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lCVJPVVRFUl9SRUxFQVNFCTEJCS8qIHJlbGVhc2UgKG1pbm9yIHZlcnNpb24pIG51bWJlciAqLworI2RlZmluZQlST1VURVJfSU9DVEwJJ1cnCQkvKiBmb3IgSU9DVEwgY2FsbHMgKi8KKyNkZWZpbmUJUk9VVEVSX01BR0lDCTB4NTI0RDQxNTdMCS8qIHNpZ25hdHVyZTogJ1dBTlInIHJldmVyc2VkICovCisKKy8qIElPQ1RMIGNvZGVzIGZvciAvcHJvYy9yb3V0ZXIvPGRldmljZT4gZW50cmllcyAodXAgdG8gMjU1KSAqLworZW51bSByb3V0ZXJfaW9jdGxzCit7CisJUk9VVEVSX1NFVFVQCT0gUk9VVEVSX0lPQ1RMPDw4LAkvKiBjb25maWd1cmUgZGV2aWNlICovCisJUk9VVEVSX0RPV04sCQkJCS8qIHNodXQgZG93biBkZXZpY2UgKi8KKwlST1VURVJfU1RBVCwJCQkJLyogZ2V0IGRldmljZSBzdGF0dXMgKi8KKwlST1VURVJfSUZORVcsCQkJCS8qIGFkZCBpbnRlcmZhY2UgKi8KKwlST1VURVJfSUZERUwsCQkJCS8qIGRlbGV0ZSBpbnRlcmZhY2UgKi8KKwlST1VURVJfSUZTVEFULAkJCQkvKiBnZXQgaW50ZXJmYWNlIHN0YXR1cyAqLworCVJPVVRFUl9VU0VSCT0gKFJPVVRFUl9JT0NUTDw8OCkrMTYsCS8qIGRyaXZlci1zcGVjaWZpYyBjYWxscyAqLworCVJPVVRFUl9VU0VSX01BWAk9IChST1VURVJfSU9DVEw8PDgpKzMxCit9OworCisvKiBpZGVudGlmaWVycyBmb3IgZGlzcGxheWluZyBwcm9jIGZpbGUgZGF0YSBmb3IgZHVhbCBwb3J0IGFkYXB0ZXJzICovCisjZGVmaW5lIFBST0NfREFUQV9QT1JUXzAgMHg4MDAwCS8qIHRoZSBkYXRhIGlzIGZvciBwb3J0IDAgKi8KKyNkZWZpbmUgUFJPQ19EQVRBX1BPUlRfMSAweDgwMDEJLyogdGhlIGRhdGEgaXMgZm9yIHBvcnQgMSAqLworCisvKiBOTFBJRCBmb3IgcGFja2V0IGVuY2Fwc3VsYXRpb24gKElTTy9JRUMgVFIgOTU3NykgKi8KKyNkZWZpbmUJTkxQSURfSVAJMHhDQwkvKiBJbnRlcm5ldCBQcm90b2NvbCBEYXRhZ3JhbSAqLworI2RlZmluZQlOTFBJRF9TTkFQCTB4ODAJLyogSUVFRSBTdWJuZXR3b3JrIEFjY2VzcyBQcm90b2NvbCAqLworI2RlZmluZQlOTFBJRF9DTE5QCTB4ODEJLyogSVNPL0lFQyA4NDczICovCisjZGVmaW5lCU5MUElEX0VTSVMJMHg4MgkvKiBJU08vSUVDIDk1NDIgKi8KKyNkZWZpbmUJTkxQSURfSVNJUwkweDgzCS8qIElTTy9JRUMgSVNJUyAqLworI2RlZmluZQlOTFBJRF9ROTMzCTB4MDgJLyogQ0NJVFQgUS45MzMgKi8KKworLyogTWlzY2VsbGFuZW91cyAqLworI2RlZmluZQlXQU5fSUZOQU1FX1NaCTE1CS8qIG1heCBsZW5ndGggb2YgdGhlIGludGVyZmFjZSBuYW1lICovCisjZGVmaW5lCVdBTl9EUlZOQU1FX1NaCTE1CS8qIG1heCBsZW5ndGggb2YgdGhlIGxpbmsgZHJpdmVyIG5hbWUgKi8KKyNkZWZpbmUJV0FOX0FERFJFU1NfU1oJMzEJLyogbWF4IGxlbmd0aCBvZiB0aGUgV0FOIG1lZGlhIGFkZHJlc3MgKi8KKyNkZWZpbmUgVVNFRF9CWV9GSUVMRAk4CS8qIG1heCBsZW5ndGggb2YgdGhlIHVzZWQgYnkgZmllbGQgKi8KKworLyogRGVmaW5lcyBmb3IgVURQIFBBQ0tFVCBUWVBFICovCisjZGVmaW5lIFVEUF9QVFBJUEVfVFlQRSAJMHgwMQorI2RlZmluZSBVRFBfRlBJUEVfVFlQRQkJMHgwMgorI2RlZmluZSBVRFBfQ1BJUEVfVFlQRQkJMHgwMworI2RlZmluZSBVRFBfRFJWU1RBVFNfVFlQRSAJMHgwNAorI2RlZmluZSBVRFBfSU5WQUxJRF9UWVBFICAJMHgwNQorCisvKiBDb21tYW5kIHJldHVybiBjb2RlICovCisjZGVmaW5lIENNRF9PSwkJMAkJLyogbm9ybWFsIGZpcm13YXJlIHJldHVybiBjb2RlICovCisjZGVmaW5lIENNRF9USU1FT1VUCTB4RkYJCS8qIGZpcm13YXJlIGNvbW1hbmQgdGltZWQgb3V0ICovCisKKy8qIFVEUCBQYWNrZXQgTWFuYWdlbWVudCAqLworI2RlZmluZSBVRFBfUEtUX0ZSTV9TVEFDSwkweDAwCisjZGVmaW5lIFVEUF9QS1RfRlJNX05FVFdPUksJMHgwMQorCisvKiBNYXhpbXVtIGludGVycnVwdCB0ZXN0IGNvdW50ZXIgKi8KKyNkZWZpbmUgTUFYX0lOVFJfVEVTVF9DT1VOVEVSCTEwMAorCisvKiBDcml0aWNhbCBWYWx1ZXMgZm9yIFJBQ0UgY29uZGl0aW9ucyovCisjZGVmaW5lIENSSVRJQ0FMX0lOX0lTUgkJMHhBMQorI2RlZmluZSBDUklUSUNBTF9JTlRSX0hBTkRMRUQJMHhCMQorCisvKioqKioqIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBYLjI1LXNwZWNpZmljIGxpbmstbGV2ZWwgY29uZmlndXJhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgd2FuX3gyNV9jb25mCit7CisJdW5zaWduZWQgbG9fcHZjOwkvKiBsb3dlc3QgcGVybWFuZW50IGNpcmN1aXQgbnVtYmVyICovCisJdW5zaWduZWQgaGlfcHZjOwkvKiBoaWdoZXN0IHBlcm1hbmVudCBjaXJjdWl0IG51bWJlciAqLworCXVuc2lnbmVkIGxvX3N2YzsJLyogbG93ZXN0IHN3aXRjaGVkIGNpcmN1aXQgbnVtYmVyICovCisJdW5zaWduZWQgaGlfc3ZjOwkvKiBoaWdoZXN0IHN3aXRjaGVkIGNpcmN1aXQgbnVtYmVyICovCisJdW5zaWduZWQgaGRsY193aW5kb3c7CS8qIEhETEMgd2luZG93IHNpemUgKDEuLjcpICovCisJdW5zaWduZWQgcGt0X3dpbmRvdzsJLyogWC4yNSBwYWNrZXQgd2luZG93IHNpemUgKDEuLjcpICovCisJdW5zaWduZWQgdDE7CQkvKiBIRExDIHRpbWVyIFQxLCBzZWMgKDEuLjMwKSAqLworCXVuc2lnbmVkIHQyOwkJLyogSERMQyB0aW1lciBUMiwgc2VjICgwLi4yOSkgKi8KKwl1bnNpZ25lZCB0NDsJCS8qIEhETEMgc3VwZXJ2aXNvcnkgZnJhbWUgdGltZXIgPSBUNCAqIFQxICovCisJdW5zaWduZWQgbjI7CQkvKiBIRExDIHJldHJhbnNtaXNzaW9uIGxpbWl0ICgxLi4zMCkgKi8KKwl1bnNpZ25lZCB0MTBfdDIwOwkvKiBYLjI1IFJFU1RBUlQgdGltZW91dCwgc2VjICgxLi4yNTUpICovCisJdW5zaWduZWQgdDExX3QyMTsJLyogWC4yNSBDQUxMIHRpbWVvdXQsIHNlYyAoMS4uMjU1KSAqLworCXVuc2lnbmVkIHQxMl90MjI7CS8qIFguMjUgUkVTRVQgdGltZW91dCwgc2VjICgxLi4yNTUpICovCisJdW5zaWduZWQgdDEzX3QyMzsJLyogWC4yNSBDTEVBUiB0aW1lb3V0LCBzZWMgKDEuLjI1NSkgKi8KKwl1bnNpZ25lZCB0MTZfdDI2OwkvKiBYLjI1IElOVEVSUlVQVCB0aW1lb3V0LCBzZWMgKDEuLjI1NSkgKi8KKwl1bnNpZ25lZCB0Mjg7CQkvKiBYLjI1IFJFR0lTVFJBVElPTiB0aW1lb3V0LCBzZWMgKDEuLjI1NSkgKi8KKwl1bnNpZ25lZCByMTBfcjIwOwkvKiBSRVNUQVJUIHJldHJhbnNtaXNzaW9uIGxpbWl0ICgwLi4yNTApICovCisJdW5zaWduZWQgcjEyX3IyMjsJLyogUkVTRVQgcmV0cmFuc21pc3Npb24gbGltaXQgKDAuLjI1MCkgKi8KKwl1bnNpZ25lZCByMTNfcjIzOwkvKiBDTEVBUiByZXRyYW5zbWlzc2lvbiBsaW1pdCAoMC4uMjUwKSAqLworCXVuc2lnbmVkIGNjaXR0X2NvbXBhdDsJLyogY29tcGF0aWJpbGl0eSBtb2RlOiAxOTg4LzE5ODQvMTk4MCAqLworCXVuc2lnbmVkIHgyNV9jb25mX29wdDsgICAvKiBVc2VyIGRlZmluZWQgeDI1IGNvbmZpZyBvcHRvaW5zICovCisJdW5zaWduZWQgY2hhciBMQVBCX2hkbGNfb25seTsgLyogUnVuIGluIEhETEMgb25seSBtb2RlICovCisJdW5zaWduZWQgY2hhciBsb2dnaW5nOyAgIC8qIENvbnRyb2wgY29ubmVjdGlvbiBsb2dnaW5nICovICAKKwl1bnNpZ25lZCBjaGFyIG9vYl9vbl9tb2RlbTsgLyogV2hldGhlciB0byBzZW5kIG1vZGVtIHN0YXR1cyB0byB0aGUgdXNlciBhcHAgKi8KK30gd2FuX3gyNV9jb25mX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnJhbWUgcmVsYXkgc3BlY2lmaWMgbGluay1sZXZlbCBjb25maWd1cmF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB3YW5fZnJfY29uZgoreworCXVuc2lnbmVkIHNpZ25hbGxpbmc7CS8qIGxvY2FsIGluLWNoYW5uZWwgc2lnbmFsbGluZyB0eXBlICovCisJdW5zaWduZWQgdDM5MTsJCS8qIGxpbmsgaW50ZWdyaXR5IHZlcmlmaWNhdGlvbiB0aW1lciAqLworCXVuc2lnbmVkIHQzOTI7CQkvKiBwb2xsaW5nIHZlcmlmaWNhdGlvbiB0aW1lciAqLworCXVuc2lnbmVkIG4zOTE7CQkvKiBmdWxsIHN0YXR1cyBwb2xsaW5nIGN5Y2xlIGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBuMzkyOwkJLyogZXJyb3IgdGhyZXNob2xkIGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBuMzkzOwkJLyogbW9uaXRvcmVkIGV2ZW50cyBjb3VudGVyICovCisJdW5zaWduZWQgZGxjaV9udW07CS8qIG51bWJlciBvZiBETENzIChhY2Nlc3Mgbm9kZSkgKi8KKwl1bnNpZ25lZCAgZGxjaVsxMDBdOyAgICAvKiBMaXN0IG9mIGFsbCBETENJcyAqLworfSB3YW5fZnJfY29uZl90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBQUC1zcGVjaWZpYyBsaW5rLWxldmVsIGNvbmZpZ3VyYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHdhbl9wcHBfY29uZgoreworCXVuc2lnbmVkIHJlc3RhcnRfdG1yOwkvKiByZXN0YXJ0IHRpbWVyICovCisJdW5zaWduZWQgYXV0aF9yc3J0X3RtcjsJLyogYXV0aGVudGljYXRpb24gdGltZXIgKi8KKwl1bnNpZ25lZCBhdXRoX3dhaXRfdG1yOwkvKiBhdXRoZW50aWNhdGlvbiB0aW1lciAqLworCXVuc2lnbmVkIG1kbV9mYWlsX3RtcjsJLyogbW9kZW0gZmFpbHVyZSB0aW1lciAqLworCXVuc2lnbmVkIGR0cl9kcm9wX3RtcjsJLyogRFRSIGRyb3AgdGltZXIgKi8KKwl1bnNpZ25lZCBjb25uZWN0X3Rtb3V0OwkvKiBjb25uZWN0aW9uIHRpbWVvdXQgKi8KKwl1bnNpZ25lZCBjb25mX3JldHJ5OwkvKiBtYXguIHJldHJ5ICovCisJdW5zaWduZWQgdGVybV9yZXRyeTsJLyogbWF4LiByZXRyeSAqLworCXVuc2lnbmVkIGZhaWxfcmV0cnk7CS8qIG1heC4gcmV0cnkgKi8KKwl1bnNpZ25lZCBhdXRoX3JldHJ5OwkvKiBtYXguIHJldHJ5ICovCisJdW5zaWduZWQgYXV0aF9vcHRpb25zOwkvKiBhdXRoZW50aWNhdGlvbiBvcHQuICovCisJdW5zaWduZWQgaXBfb3B0aW9uczsJLyogSVAgb3B0aW9ucyAqLworCWNoYXIJYXV0aGVudGljYXRvcjsJLyogQVVUSEVOVElDQVRPUiBvciBub3QgKi8KKwljaGFyCWlwX21vZGU7CS8qIFN0YXRpYy9Ib3N0L1BlZXIgKi8KK30gd2FuX3BwcF9jb25mX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ0hETEMtc3BlY2lmaWMgbGluay1sZXZlbCBjb25maWd1cmF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB3YW5fY2hkbGNfY29uZgoreworCXVuc2lnbmVkIGNoYXIgaWdub3JlX2RjZDsJLyogUHJvdG9jb2wgb3B0aW9uczoJCSovCisJdW5zaWduZWQgY2hhciBpZ25vcmVfY3RzOwkvKiAgSWdub3JlIHRoZXNlIHRvIGRldGVybWluZQkqLworCXVuc2lnbmVkIGNoYXIgaWdub3JlX2tlZXBhbGl2ZTsJLyogIGxpbmsgc3RhdHVzIChZZXMgb3IgTm8pCSovCisJdW5zaWduZWQgY2hhciBoZGxjX3N0cmVhbWluZzsJLyogIGhkbGNfc3RyZWFtaW5nIG1vZGUgKFkvTikgKi8KKwl1bnNpZ25lZCBjaGFyIHJlY2VpdmVfb25seTsJLyogIG5vIHRyYW5zbWl0IGJ1ZmZlcmluZyAoWS9OKSAqLworCXVuc2lnbmVkIGtlZXBhbGl2ZV90eF90bXI7CS8qIHRyYW5zbWl0IGtlZXBhbGl2ZSB0aW1lciAqLworCXVuc2lnbmVkIGtlZXBhbGl2ZV9yeF90bXI7CS8qIHJlY2VpdmUgIGtlZXBhbGl2ZSB0aW1lciAqLworCXVuc2lnbmVkIGtlZXBhbGl2ZV9lcnJfbWFyZ2luOwkvKiBrZWVwYWxpdmVfZXJyb3JfdG9sZXJhbmNlICovCisJdW5zaWduZWQgc2xhcnBfdGltZXI7CQkvKiBTTEFSUCByZXF1ZXN0IHRpbWVyICovCit9IHdhbl9jaGRsY19jb25mX3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXQU4gZGV2aWNlIGNvbmZpZ3VyYXRpb24uIFBhc3NlZCB0byBST1VURVJfU0VUVVAgSU9DVEwuCisgKi8KK3R5cGVkZWYgc3RydWN0IHdhbmRldl9jb25mCit7CisJdW5zaWduZWQgbWFnaWM7CQkvKiBtYWdpYyBudW1iZXIgKGZvciB2ZXJpZmljYXRpb24pICovCisJdW5zaWduZWQgY29uZmlnX2lkOwkvKiBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBpZGVudGlmaWVyICovCisJCQkJLyoqKioqKiBoYXJkd2FyZSBjb25maWd1cmF0aW9uICoqKioqKi8KKwl1bnNpZ25lZCBpb3BvcnQ7CS8qIGFkYXB0ZXIgSS9PIHBvcnQgYmFzZSAqLworCXVuc2lnbmVkIGxvbmcgbWFkZHI7CS8qIGR1YWwtcG9ydCBtZW1vcnkgYWRkcmVzcyAqLworCXVuc2lnbmVkIG1zaXplOwkJLyogZHVhbC1wb3J0IG1lbW9yeSBzaXplICovCisJaW50IGlycTsJCS8qIGludGVycnVwdCByZXF1ZXN0IGxldmVsICovCisJaW50IGRtYTsJCS8qIERNQSByZXF1ZXN0IGxldmVsICovCisgICAgICAgIGNoYXIgUzUxNF9DUFVfbm9bMV07CS8qIFM1MTQgUENJIGFkYXB0ZXIgQ1BVIG51bWJlciAoJ0EnIG9yICdCJykgKi8KKyAgICAgICAgdW5zaWduZWQgUENJX3Nsb3Rfbm87CS8qIFM1MTQgUENJIGFkYXB0ZXIgc2xvdCBudW1iZXIgKi8KKwljaGFyIGF1dG9fcGNpX2NmZzsJLyogUzUxNSBQQ0kgYXV0b21hdGljIHNsb3QgZGV0ZWN0aW9uICovCisJY2hhciBjb21tX3BvcnQ7CQkvKiBDb21tdW5pY2F0aW9uIFBvcnQgKFBSST0wLCBTRUM9MSkgKi8gCisJdW5zaWduZWQgYnBzOwkJLyogZGF0YSB0cmFuc2ZlciByYXRlICovCisJdW5zaWduZWQgbXR1OwkJLyogbWF4aW11bSB0cmFuc21pdCB1bml0IHNpemUgKi8KKyAgICAgICAgdW5zaWduZWQgdWRwX3BvcnQ7ICAgICAgLyogVURQIHBvcnQgZm9yIG1hbmFnZW1lbnQgKi8KKwl1bnNpZ25lZCBjaGFyIHR0bDsJLyogVGltZSBUbyBMaXZlIGZvciBVRFAgc2VjdXJpdHkgKi8KKwl1bnNpZ25lZCBjaGFyIGZ0MTsJLyogRlQxIENvbmZpZ3VyYXRvciBPcHRpb24gKi8KKyAgICAgICAgY2hhciBpbnRlcmZhY2U7CQkvKiBSUy0yMzIvVi4zNSwgZXRjLiAqLworCWNoYXIgY2xvY2tpbmc7CQkvKiBleHRlcm5hbC9pbnRlcm5hbCAqLworCWNoYXIgbGluZV9jb2Rpbmc7CS8qIE5SWi9OUlpJL0ZNMC9GTTEsIGV0Yy4gKi8KKwljaGFyIHN0YXRpb247CQkvKiBEVEUvRENFLCBwcmltYXJ5L3NlY29uZGFyeSwgZXRjLiAqLworCWNoYXIgY29ubmVjdGlvbjsJLyogcGVybWFuZW50L3N3aXRjaGVkL29uLWRlbWFuZCAqLworCWNoYXIgcmVhZF9tb2RlOwkJLyogcmVhZCBtb2RlOiBQb2xsaW5nIG9yIGludGVycnVwdCAqLworCWNoYXIgcmVjZWl2ZV9vbmx5OwkvKiBkaXNhYmxlIHR4IGJ1ZmZlcnMgKi8KKwljaGFyIHR0eTsJCS8qIENyZWF0ZSBhIGZha2UgdHR5IGRldmljZSAqLworCXVuc2lnbmVkIHR0eV9tYWpvcjsJLyogTWFqb3IgbnVtYmVyIGZvciB3YW5waXBlIHR0eSBkZXZpY2UgKi8KKwl1bnNpZ25lZCB0dHlfbWlub3I7IAkvKiBNaW5vciBudW1iZXIgZm9yIHdhbnBpcGUgdHR5IGRldmljZSAqLworCXVuc2lnbmVkIHR0eV9tb2RlOwkvKiBUVFkgb3BlcmF0aW9uIG1vZGUgU1lOQyBvciBBU1lOQyAqLworCWNoYXIgYmFja3VwOwkJLyogQmFja3VwIE1vZGUgKi8KKwl1bnNpZ25lZCBod19vcHRbNF07CS8qIG90aGVyIGhhcmR3YXJlIG9wdGlvbnMgKi8KKwl1bnNpZ25lZCByZXNlcnZlZFs0XTsKKwkJCQkvKioqKioqIGFyYml0cmFyeSBkYXRhICoqKioqKioqKioqKioqKi8KKwl1bnNpZ25lZCBkYXRhX3NpemU7CS8qIGRhdGEgYnVmZmVyIHNpemUgKi8KKwl2b2lkKiBkYXRhOwkJLyogZGF0YSBidWZmZXIsIGUuZy4gZmlybXdhcmUgKi8KKwl1bmlvbgkJCS8qKioqKiogcHJvdG9jb2wtc3BlY2lmaWMgKioqKioqKioqKioqLworCXsKKwkJd2FuX3gyNV9jb25mX3QgeDI1OwkvKiBYLjI1IGNvbmZpZ3VyYXRpb24gKi8KKwkJd2FuX3BwcF9jb25mX3QgcHBwOwkvKiBQUFAgY29uZmlndXJhdGlvbiAqLworCQl3YW5fZnJfY29uZl90IGZyOwkvKiBmcmFtZSByZWxheSBjb25maWd1cmF0aW9uICovCisJCXdhbl9jaGRsY19jb25mX3QgY2hkbGM7CS8qIENpc2NvIEhETEMgY29uZmlndXJhdGlvbiAqLworCX0gdTsKK30gd2FuZGV2X2NvbmZfdDsKKworLyogJ2NvbmZpZ19pZCcgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJV0FOQ09ORklHX1gyNQkxMDEJLyogWC4yNSBsaW5rICovCisjZGVmaW5lCVdBTkNPTkZJR19GUgkxMDIJLyogZnJhbWUgcmVsYXkgbGluayAqLworI2RlZmluZQlXQU5DT05GSUdfUFBQCTEwMwkvKiBzeW5jaHJvbm91cyBQUFAgbGluayAqLworI2RlZmluZSBXQU5DT05GSUdfQ0hETEMJMTA0CS8qIENpc2NvIEhETEMgTGluayAqLworI2RlZmluZSBXQU5DT05GSUdfQlNDCTEwNQkvKiBCaVN5bmMgU3RyZWFtaW5nICovCisjZGVmaW5lIFdBTkNPTkZJR19IRExDCTEwNgkvKiBIRExDIFN1cHBvcnQgKi8KKyNkZWZpbmUgV0FOQ09ORklHX01QUFAgIDEwNwkvKiBNdWx0aSBQb3J0IFBQUCBvdmVyIFJBVyBDSERMQyAqLworCisvKgorICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGRlZmluZXMuCisgKi8KKy8qIGdlbmVyYWwgb3B0aW9ucyAqLworI2RlZmluZQlXQU5PUFRfT0ZGCTAKKyNkZWZpbmUJV0FOT1BUX09OCTEKKyNkZWZpbmUJV0FOT1BUX05PCTAKKyNkZWZpbmUJV0FOT1BUX1lFUwkxCisKKy8qIGludGVyY2FjZSBvcHRpb25zICovCisjZGVmaW5lCVdBTk9QVF9SUzIzMgkwCisjZGVmaW5lCVdBTk9QVF9WMzUJMQorCisvKiBkYXRhIGVuY29kaW5nIG9wdGlvbnMgKi8KKyNkZWZpbmUJV0FOT1BUX05SWgkwCisjZGVmaW5lCVdBTk9QVF9OUlpJCTEKKyNkZWZpbmUJV0FOT1BUX0ZNMAkyCisjZGVmaW5lCVdBTk9QVF9GTTEJMworCisvKiBsaW5rIHR5cGUgb3B0aW9ucyAqLworI2RlZmluZQlXQU5PUFRfUE9JTlRUT1BPSU5UCTAJLyogUlRTIGFsd2F5cyBhY3RpdmUgKi8KKyNkZWZpbmUJV0FOT1BUX01VTFRJRFJPUAkxCS8qIFJUUyBpcyBhY3RpdmUgd2hlbiB0cmFuc21pdHRpbmcgKi8KKworLyogY2xvY2tpbmcgb3B0aW9ucyAqLworI2RlZmluZQlXQU5PUFRfRVhURVJOQUwJMAorI2RlZmluZQlXQU5PUFRfSU5URVJOQUwJMQorCisvKiBzdGF0aW9uIG9wdGlvbnMgKi8KKyNkZWZpbmUJV0FOT1BUX0RURQkJMAorI2RlZmluZQlXQU5PUFRfRENFCQkxCisjZGVmaW5lCVdBTk9QVF9DUEUJCTAKKyNkZWZpbmUJV0FOT1BUX05PREUJCTEKKyNkZWZpbmUJV0FOT1BUX1NFQ09OREFSWQkwCisjZGVmaW5lCVdBTk9QVF9QUklNQVJZCQkxCisKKy8qIGNvbm5lY3Rpb24gb3B0aW9ucyAqLworI2RlZmluZQlXQU5PUFRfUEVSTUFORU5UCTAJLyogRFRSIGFsd2F5cyBhY3RpdmUgKi8KKyNkZWZpbmUJV0FOT1BUX1NXSVRDSEVECQkxCS8qIHVzZSBEVFIgdG8gc2V0dXAgbGluayAoZGlhbC11cCkgKi8KKyNkZWZpbmUJV0FOT1BUX09OREVNQU5ECQkyCS8qIGFjdGl2YXRlIERUUiBvbmx5IGJlZm9yZSBzZW5kaW5nICovCisKKy8qIGZyYW1lIHJlbGF5IGluLWNoYW5uZWwgc2lnbmFsbGluZyAqLworI2RlZmluZQlXQU5PUFRfRlJfQU5TSQkJMQkvKiBBTlNJIFQxLjYxNyBBbm5leCBEICovCisjZGVmaW5lCVdBTk9QVF9GUl9ROTMzCQkyCS8qIElUVSBRLjkzM0EgKi8KKyNkZWZpbmUJV0FOT1BUX0ZSX0xNSQkJMwkvKiBMTUkgKi8KKworLyogUFBQIElQIE1vZGUgT3B0aW9ucyAqLworI2RlZmluZQlXQU5PUFRfUFBQX1NUQVRJQwkwCisjZGVmaW5lCVdBTk9QVF9QUFBfSE9TVAkJMQorI2RlZmluZQlXQU5PUFRfUFBQX1BFRVIJCTIKKworLyogQVNZIE1vZGUgT3B0aW9ucyAqLworI2RlZmluZSBXQU5PUFRfT05FIAkJMQorI2RlZmluZSBXQU5PUFRfVFdPCQkyCisjZGVmaW5lIFdBTk9QVF9PTkVfQU5EX0hBTEYJMworCisjZGVmaW5lIFdBTk9QVF9OT05FCTAKKyNkZWZpbmUgV0FOT1BUX09ERCAgICAgIDEKKyNkZWZpbmUgV0FOT1BUX0VWRU4JMgorCisvKiBDSERMQyBQcm90b2NvbCBPcHRpb25zICovCisvKiBERiBDb21tbWVudGVkIG91dCBmb3Igbm93LgorCisjZGVmaW5lIFdBTk9QVF9DSERMQ19OT19EQ0QJCUlHTk9SRV9EQ0RfRk9SX0xJTktfU1RBVAorI2RlZmluZSBXQU5PUFRfQ0hETENfTk9fQ1RTCQlJR05PUkVfQ1RTX0ZPUl9MSU5LX1NUQVQKKyNkZWZpbmUgV0FOT1BUX0NIRExDX05PX0tFRVBBTElWRQlJR05PUkVfS1BBTFZfRk9SX0xJTktfU1RBVAorKi8KKworLyogUG9ydCBvcHRpb25zICovCisjZGVmaW5lIFdBTk9QVF9QUkkgMAorI2RlZmluZSBXQU5PUFRfU0VDIDEKKy8qIHJlYWQgbW9kZSAqLworI2RlZmluZQlXQU5PUFRfSU5UUgkwCisjZGVmaW5lIFdBTk9QVF9QT0xMCTEKKworCisjZGVmaW5lIFdBTk9QVF9UVFlfU1lOQyAgMAorI2RlZmluZSBXQU5PUFRfVFRZX0FTWU5DIDEKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV0FOIExpbmsgU3RhdHVzIEluZm8gKGZvciBST1VURVJfU1RBVCBJT0NUTCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHdhbmRldl9zdGF0Cit7CisJdW5zaWduZWQgc3RhdGU7CQkvKiBsaW5rIHN0YXRlICovCisJdW5zaWduZWQgbmRldjsJCS8qIG51bWJlciBvZiBjb25maWd1cmVkIGludGVyZmFjZXMgKi8KKworCS8qIGxpbmsvaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gKi8KKwl1bnNpZ25lZCBjb25uZWN0aW9uOwkvKiBwZXJtYW5lbnQvc3dpdGNoZWQvb24tZGVtYW5kICovCisJdW5zaWduZWQgbWVkaWFfdHlwZTsJLyogRnJhbWUgcmVsYXkvUFBQL1guMjUvU0RMQywgZXRjLiAqLworCXVuc2lnbmVkIG10dTsJCS8qIG1heC4gdHJhbnNtaXQgdW5pdCBmb3IgdGhpcyBkZXZpY2UgKi8KKworCS8qIHBoeXNpY2FsIGxldmVsIHN0YXRpc3RpY3MgKi8KKwl1bnNpZ25lZCBtb2RlbV9zdGF0dXM7CS8qIG1vZGVtIHN0YXR1cyAqLworCXVuc2lnbmVkIHJ4X2ZyYW1lczsJLyogcmVjZWl2ZWQgZnJhbWVzIGNvdW50ICovCisJdW5zaWduZWQgcnhfb3ZlcnJ1bnM7CS8qIHJlY2VpdmVyIG92ZXJydW4gZXJyb3IgY291bnQgKi8KKwl1bnNpZ25lZCByeF9jcmNfZXJyOwkvKiByZWNlaXZlIENSQyBlcnJvciBjb3VudCAqLworCXVuc2lnbmVkIHJ4X2Fib3J0czsJLyogcmVjZWl2ZWQgYWJvcnRlZCBmcmFtZXMgY291bnQgKi8KKwl1bnNpZ25lZCByeF9iYWRfbGVuZ3RoOwkvKiB1bmV4cGV0ZWRseSBsb25nL3Nob3J0IGZyYW1lcyBjb3VudCAqLworCXVuc2lnbmVkIHJ4X2Ryb3BwZWQ7CS8qIGZyYW1lcyBkaXNjYXJkZWQgYXQgZGV2aWNlIGxldmVsICovCisJdW5zaWduZWQgdHhfZnJhbWVzOwkvKiB0cmFuc21pdHRlZCBmcmFtZXMgY291bnQgKi8KKwl1bnNpZ25lZCB0eF91bmRlcnJ1bnM7CS8qIGFib3J0ZWQgdHJhbnNtaXNzaW9ucyAodW5kZXJydW5zKSBjb3VudCAqLworCXVuc2lnbmVkIHR4X3RpbWVvdXRzOwkvKiB0cmFuc21pc3Npb24gdGltZW91dHMgKi8KKwl1bnNpZ25lZCB0eF9yZWplY3RzOwkvKiBvdGhlciB0cmFuc21pdCBlcnJvcnMgKi8KKworCS8qIG1lZGlhIGxldmVsIHN0YXRpc3RpY3MgKi8KKwl1bnNpZ25lZCByeF9iYWRfZm9ybWF0OwkvKiBmcmFtZXMgd2l0aCBpbnZhbGlkIGZvcm1hdCAqLworCXVuc2lnbmVkIHJ4X2JhZF9hZGRyOwkvKiBmcmFtZXMgd2l0aCBpbnZhbGlkIG1lZGlhIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCB0eF9yZXRyaWVzOwkvKiBmcmFtZXMgcmUtdHJhbnNtaXR0ZWQgKi8KKwl1bnNpZ25lZCByZXNlcnZlZFsxNl07CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCit9IHdhbmRldl9zdGF0X3Q7CisKKy8qICdzdGF0ZScgZGVmaW5lcyAqLworZW51bSB3YW5fc3RhdGVzCit7CisJV0FOX1VOQ09ORklHVVJFRCwJLyogbGluay9jaGFubmVsIGlzIG5vdCBjb25maWd1cmVkICovCisJV0FOX0RJU0NPTk5FQ1RFRCwJLyogbGluay9jaGFubmVsIGlzIGRpc2Nvbm5lY3RlZCAqLworCVdBTl9DT05ORUNUSU5HLAkJLyogY29ubmVjdGlvbiBpcyBpbiBwcm9ncmVzcyAqLworCVdBTl9DT05ORUNURUQsCQkvKiBsaW5rL2NoYW5uZWwgaXMgb3BlcmF0aW9uYWwgKi8KKwlXQU5fTElNSVQsCQkvKiBmb3IgdmVyaWZpY2F0aW9uIG9ubHkgKi8KKwlXQU5fRFVBTFBPUlQsCQkvKiBmb3IgRHVhbCBQb3J0IGNhcmRzICovCisJV0FOX0RJU0NPTk5FQ1RJTkcsCisJV0FOX0ZUMV9SRUFEWQkJLyogRlQxIENvbmZpZ3VyYXRvciBSZWFkeSAqLworfTsKKworZW51bSB7CisJV0FOX0xPQ0FMX0lQLAorCVdBTl9QT0lOVE9QT0lOVF9JUCwKKwlXQU5fTkVUTUFTS19JUCwKKwlXQU5fQlJPQURDQVNUX0lQCit9OworCisvKiAnbW9kZW1fc3RhdHVzJyBtYXNrcyAqLworI2RlZmluZQlXQU5fTU9ERU1fQ1RTCTB4MDAwMQkvKiBDVFMgbGluZSBhY3RpdmUgKi8KKyNkZWZpbmUJV0FOX01PREVNX0RDRAkweDAwMDIJLyogRENEIGxpbmUgYWN0aXZlICovCisjZGVmaW5lCVdBTl9NT0RFTV9EVFIJMHgwMDEwCS8qIERUUiBsaW5lIGFjdGl2ZSAqLworI2RlZmluZQlXQU5fTU9ERU1fUlRTCTB4MDAyMAkvKiBSVFMgbGluZSBhY3RpdmUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXQU4gaW50ZXJmYWNlIChsb2dpY2FsIGNoYW5uZWwpIGNvbmZpZ3VyYXRpb24gKGZvciBST1VURVJfSUZORVcgSU9DVEwpLgorICovCit0eXBlZGVmIHN0cnVjdCB3YW5pZl9jb25mCit7CisJdW5zaWduZWQgbWFnaWM7CQkJLyogbWFnaWMgbnVtYmVyICovCisJdW5zaWduZWQgY29uZmlnX2lkOwkJLyogY29uZmlndXJhdGlvbiBpZGVudGlmaWVyICovCisJY2hhciBuYW1lW1dBTl9JRk5BTUVfU1orMV07CS8qIGludGVyZmFjZSBuYW1lLCBBU0NJSVogKi8KKwljaGFyIGFkZHJbV0FOX0FERFJFU1NfU1orMV07CS8qIG1lZGlhIGFkZHJlc3MsIEFTQ0lJWiAqLworCWNoYXIgdXNlZGJ5W1VTRURfQllfRklFTERdOwkvKiB1c2VkIGJ5IEFQSSBvciBXQU5QSVBFICovCisJdW5zaWduZWQgaWRsZV90aW1lb3V0OwkJLyogc2VjLCBiZWZvcmUgZGlzY29ubmVjdGluZyAqLworCXVuc2lnbmVkIGhvbGRfdGltZW91dDsJCS8qIHNlYywgYmVmb3JlIHJlLWNvbm5lY3RpbmcgKi8KKwl1bnNpZ25lZCBjaXI7CQkJLyogQ29tbWl0dGVkIEluZm9ybWF0aW9uIFJhdGUgZndkLGJ3ZCovCisJdW5zaWduZWQgYmM7CQkJLyogQ29tbWl0dGVkIEJ1cnN0IFNpemUgZndkLCBid2QgKi8KKwl1bnNpZ25lZCBiZTsJCQkvKiBFeGNlc3MgQnVyc3QgU2l6ZSBmd2QsIGJ3ZCAqLyAKKwl1bnNpZ25lZCBjaGFyIGVuYWJsZV9JUFg7CS8qIEVuYWJsZSBvciBEaXNhYmxlIElQWCAqLworCXVuc2lnbmVkIGNoYXIgaW5hcnA7CQkvKiBTZW5kIEludmVyc2UgQVJQIHJlcXVlc3RzIFkvTiAqLworCXVuc2lnbmVkIGluYXJwX2ludGVydmFsOwkvKiBzZWMsIGJldHdlZW4gSW5BUlAgcmVxdWVzdHMgKi8KKwl1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyOwkvKiBOZXR3b3JrIE51bWJlciBmb3IgSVBYICovCisJY2hhciBtYzsJCQkvKiBNdWx0aWNhc3Qgb24gb3Igb2ZmICovCisJY2hhciBsb2NhbF9hZGRyW1dBTl9BRERSRVNTX1NaKzFdOy8qIGxvY2FsIG1lZGlhIGFkZHJlc3MsIEFTQ0lJWiAqLworCXVuc2lnbmVkIGNoYXIgcG9ydDsJCS8qIGJvYXJkIHBvcnQgKi8KKwl1bnNpZ25lZCBjaGFyIHByb3RvY29sOwkJLyogcHJvY29jb2wgdXNlZCBpbiB0aGlzIGNoYW5uZWwgKFRDUE9YMjUgb3IgWDI1KSAqLworCWNoYXIgcGFwOwkJCS8qIFBBUCBlbmFibGVkIG9yIGRpc2FibGVkICovCisJY2hhciBjaGFwOwkJCS8qIENIQVAgZW5hYmxlZCBvciBkaXNhYmxlZCAqLworCXVuc2lnbmVkIGNoYXIgdXNlcmlkWzUxMV07CS8qIExpc3Qgb2YgVXNlciBJZCAqLworCXVuc2lnbmVkIGNoYXIgcGFzc3dkWzUxMV07CS8qIExpc3Qgb2YgcGFzc3dvcmRzICovCisJdW5zaWduZWQgY2hhciBzeXNuYW1lWzMxXTsJLyogTmFtZSBvZiB0aGUgc3lzdGVtICovCisJdW5zaWduZWQgY2hhciBpZ25vcmVfZGNkOwkvKiBQcm90b2NvbCBvcHRpb25zOiAqLworCXVuc2lnbmVkIGNoYXIgaWdub3JlX2N0czsJLyogIElnbm9yZSB0aGVzZSB0byBkZXRlcm1pbmUgKi8KKwl1bnNpZ25lZCBjaGFyIGlnbm9yZV9rZWVwYWxpdmU7CS8qICBsaW5rIHN0YXR1cyAoWWVzIG9yIE5vKSAqLworCXVuc2lnbmVkIGNoYXIgaGRsY19zdHJlYW1pbmc7CS8qICBIZGxjIHN0cmVhbWluZyBtb2RlIChZL04pICovCisJdW5zaWduZWQga2VlcGFsaXZlX3R4X3RtcjsJLyogdHJhbnNtaXQga2VlcGFsaXZlIHRpbWVyICovCisJdW5zaWduZWQga2VlcGFsaXZlX3J4X3RtcjsJLyogcmVjZWl2ZSAga2VlcGFsaXZlIHRpbWVyICovCisJdW5zaWduZWQga2VlcGFsaXZlX2Vycl9tYXJnaW47CS8qIGtlZXBhbGl2ZV9lcnJvcl90b2xlcmFuY2UgKi8KKwl1bnNpZ25lZCBzbGFycF90aW1lcjsJCS8qIFNMQVJQIHJlcXVlc3QgdGltZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHR0bDsJCS8qIFRpbWUgVG8gTGl2ZSBmb3IgVURQIHNlY3VyaXR5ICovCisJY2hhciBpbnRlcmZhY2U7CQkJLyogUlMtMjMyL1YuMzUsIGV0Yy4gKi8KKwljaGFyIGNsb2NraW5nOwkJCS8qIGV4dGVybmFsL2ludGVybmFsICovCisJdW5zaWduZWQgYnBzOwkJCS8qIGRhdGEgdHJhbnNmZXIgcmF0ZSAqLworCXVuc2lnbmVkIG10dTsJCQkvKiBtYXhpbXVtIHRyYW5zbWl0IHVuaXQgc2l6ZSAqLworCXVuc2lnbmVkIGNoYXIgaWZfZG93bjsJCS8qIGJyaW5kIGRvd24gaW50ZXJmYWNlIHdoZW4gZGlzY29ubmVjdGVkICovCisJdW5zaWduZWQgY2hhciBnYXRld2F5OwkJLyogSXMgdGhpcyBpbnRlcmZhY2UgYSBnYXRld2F5ICovCisJdW5zaWduZWQgY2hhciB0cnVlX2lmX2VuY29kaW5nOwkvKiBTZXQgdGhlIGRldi0+dHlwZSB0byB0cnVlIGJvYXJkIHByb3RvY29sICovCisKKwl1bnNpZ25lZCBjaGFyIGFzeV9kYXRhX3RyYW5zOyAgICAgLyogYXN5bmMgQVBJIG9wdGlvbnMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciBydHNfaHNfZm9yX3JlY2VpdmU7IC8qIGFzeW5jIFByb3RvY29sIG9wdGlvbnMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciB4b25feG9mZl9oc19mb3JfcmVjZWl2ZTsKKwl1bnNpZ25lZCBjaGFyIHhvbl94b2ZmX2hzX2Zvcl90cmFuc21pdDsKKwl1bnNpZ25lZCBjaGFyIGRjZF9oc19mb3JfdHJhbnNtaXQ7CisJdW5zaWduZWQgY2hhciBjdHNfaHNfZm9yX3RyYW5zbWl0OworCXVuc2lnbmVkIGNoYXIgYXN5bmNfbW9kZTsKKwl1bnNpZ25lZCB0eF9iaXRzX3Blcl9jaGFyOworCXVuc2lnbmVkIHJ4X2JpdHNfcGVyX2NoYXI7CisJdW5zaWduZWQgc3RvcF9iaXRzOyAgCisJdW5zaWduZWQgY2hhciBwYXJpdHk7CisgCXVuc2lnbmVkIGJyZWFrX3RpbWVyOworICAgICAgICB1bnNpZ25lZCBpbnRlcl9jaGFyX3RpbWVyOworCXVuc2lnbmVkIHJ4X2NvbXBsZXRlX2xlbmd0aDsKKwl1bnNpZ25lZCB4b25fY2hhcjsKKwl1bnNpZ25lZCB4b2ZmX2NoYXI7CisJdW5zaWduZWQgY2hhciByZWNlaXZlX29ubHk7CS8qICBubyB0cmFuc21pdCBidWZmZXJpbmcgKFkvTikgKi8KK30gd2FuaWZfY29uZl90OworCisjZW5kaWYJLyogX1JPVVRFUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dhdGNoZG9nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dhdGNoZG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjMGM2MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvd2F0Y2hkb2cuaApAQCAtMCwwICsxLDU1IEBACisvKgorICoJR2VuZXJpYyB3YXRjaGRvZyBkZWZpbmVzLiBEZXJpdmVkIGZyb20uLgorICoKKyAqIEJlcmtzaGlyZSBQQyBXYXRjaGRvZyBEZWZpbmVzCisgKiBieSBLZW4gSG9sbGlzIDxraG9sbGlzQGJpdGdhdGUuY29tPgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9XQVRDSERPR19ICisjZGVmaW5lIF9MSU5VWF9XQVRDSERPR19ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUJV0FUQ0hET0dfSU9DVExfQkFTRQknVycKKworc3RydWN0IHdhdGNoZG9nX2luZm8geworCV9fdTMyIG9wdGlvbnM7CQkvKiBPcHRpb25zIHRoZSBjYXJkL2RyaXZlciBzdXBwb3J0cyAqLworCV9fdTMyIGZpcm13YXJlX3ZlcnNpb247CS8qIEZpcm13YXJlIHZlcnNpb24gb2YgdGhlIGNhcmQgKi8KKwlfX3U4ICBpZGVudGl0eVszMl07CS8qIElkZW50aXR5IG9mIHRoZSBib2FyZCAqLworfTsKKworI2RlZmluZQlXRElPQ19HRVRTVVBQT1JUCV9JT1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgMCwgc3RydWN0IHdhdGNoZG9nX2luZm8pCisjZGVmaW5lCVdESU9DX0dFVFNUQVRVUwkJX0lPUihXQVRDSERPR19JT0NUTF9CQVNFLCAxLCBpbnQpCisjZGVmaW5lCVdESU9DX0dFVEJPT1RTVEFUVVMJX0lPUihXQVRDSERPR19JT0NUTF9CQVNFLCAyLCBpbnQpCisjZGVmaW5lCVdESU9DX0dFVFRFTVAJCV9JT1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgMywgaW50KQorI2RlZmluZQlXRElPQ19TRVRPUFRJT05TCV9JT1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgNCwgaW50KQorI2RlZmluZQlXRElPQ19LRUVQQUxJVkUJCV9JT1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgNSwgaW50KQorI2RlZmluZQlXRElPQ19TRVRUSU1FT1VUICAgICAgICBfSU9XUihXQVRDSERPR19JT0NUTF9CQVNFLCA2LCBpbnQpCisjZGVmaW5lCVdESU9DX0dFVFRJTUVPVVQgICAgICAgIF9JT1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgNywgaW50KQorI2RlZmluZQlXRElPQ19TRVRQUkVUSU1FT1VUCV9JT1dSKFdBVENIRE9HX0lPQ1RMX0JBU0UsIDgsIGludCkKKyNkZWZpbmUJV0RJT0NfR0VUUFJFVElNRU9VVAlfSU9SKFdBVENIRE9HX0lPQ1RMX0JBU0UsIDksIGludCkKKyNkZWZpbmUJV0RJT0NfR0VUVElNRUxFRlQJX0lPUihXQVRDSERPR19JT0NUTF9CQVNFLCAxMCwgaW50KQorCisjZGVmaW5lCVdESU9GX1VOS05PV04JCS0xCS8qIFVua25vd24gZmxhZyBlcnJvciAqLworI2RlZmluZQlXRElPU19VTktOT1dOCQktMQkvKiBVbmtub3duIHN0YXR1cyBlcnJvciAqLworCisjZGVmaW5lCVdESU9GX09WRVJIRUFUCQkweDAwMDEJLyogUmVzZXQgZHVlIHRvIENQVSBvdmVyaGVhdCAqLworI2RlZmluZQlXRElPRl9GQU5GQVVMVAkJMHgwMDAyCS8qIEZhbiBmYWlsZWQgKi8KKyNkZWZpbmUJV0RJT0ZfRVhURVJOMQkJMHgwMDA0CS8qIEV4dGVybmFsIHJlbGF5IDEgKi8KKyNkZWZpbmUJV0RJT0ZfRVhURVJOMgkJMHgwMDA4CS8qIEV4dGVybmFsIHJlbGF5IDIgKi8KKyNkZWZpbmUJV0RJT0ZfUE9XRVJVTkRFUgkweDAwMTAJLyogUG93ZXIgYmFkL3Bvd2VyIGZhdWx0ICovCisjZGVmaW5lCVdESU9GX0NBUkRSRVNFVAkJMHgwMDIwCS8qIENhcmQgcHJldmlvdXNseSByZXNldCB0aGUgQ1BVICovCisjZGVmaW5lCVdESU9GX1BPV0VST1ZFUgkJMHgwMDQwCS8qIFBvd2VyIG92ZXIgdm9sdGFnZSAqLworI2RlZmluZQlXRElPRl9TRVRUSU1FT1VUCTB4MDA4MCAgLyogU2V0IHRpbWVvdXQgKGluIHNlY29uZHMpICovCisjZGVmaW5lCVdESU9GX01BR0lDQ0xPU0UJMHgwMTAwCS8qIFN1cHBvcnRzIG1hZ2ljIGNsb3NlIGNoYXIgKi8KKyNkZWZpbmUJV0RJT0ZfUFJFVElNRU9VVAkweDAyMDAgIC8qIFByZXRpbWVvdXQgKGluIHNlY29uZHMpLCBnZXQvc2V0ICovCisjZGVmaW5lCVdESU9GX0tFRVBBTElWRVBJTkcJMHg4MDAwCS8qIEtlZXAgYWxpdmUgcGluZyByZXBseSAqLworCisjZGVmaW5lCVdESU9TX0RJU0FCTEVDQVJECTB4MDAwMQkvKiBUdXJuIG9mZiB0aGUgd2F0Y2hkb2cgdGltZXIgKi8KKyNkZWZpbmUJV0RJT1NfRU5BQkxFQ0FSRAkweDAwMDIJLyogVHVybiBvbiB0aGUgd2F0Y2hkb2cgdGltZXIgKi8KKyNkZWZpbmUJV0RJT1NfVEVNUFBBTklDCQkweDAwMDQJLyogS2VybmVsIHBhbmljIG9uIHRlbXBlcmF0dXJlIHRyaXAgKi8KKworCisjZW5kaWYgIC8qIGlmbmRlZiBfTElOVVhfV0FUQ0hET0dfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93aW1heC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93aW1heC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNmI3N2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dpbWF4LmgKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBMaW51eCBXaU1heAorICogQVBJIGZvciB1c2VyIHNwYWNlCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSB1c2VyL2tlcm5lbCBwcm90b2NvbCB0aGF0IGlzIHNwb2tlbiBvdmVyCisgKiBHZW5lcmljIE5ldGxpbmssIGFzIHdlbGwgYXMgYW55IHR5cGUgZGVjbGFyYXRpb24gdGhhdCBpcyB0byBiZSB1c2VkCisgKiBieSBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisgKgorICogSXQgaXMgaW50ZW5kZWQgZm9yIHVzZXIgc3BhY2UgdG8gY2xvbmUgaXQgdmVyYmF0aW0gdG8gdXNlIGl0IGFzIGEKKyAqIHByaW1hcnkgcmVmZXJlbmNlIGZvciBkZWZpbml0aW9ucy4KKyAqCisgKiBTdHVmZiBpbnRlbmRlZCBmb3Iga2VybmVsIHVzYWdlIGFzIHdlbGwgYXMgZnVsbCBwcm90b2NvbCBhbmQgc3RhY2sKKyAqIGRvY3VtZW50YXRpb24gaXMgcm9vdGVkIGluIGluY2x1ZGUvbmV0L3dpbWF4LmguCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX19XSU1BWF9IX18KKyNkZWZpbmUgX19MSU5VWF9fV0lNQVhfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwkvKioKKwkgKiBWZXJzaW9uIG9mIHRoZSBpbnRlcmZhY2UgKHVuc2lnbmVkIGRlY2ltYWwsIE1NbSwgbWF4IDI1LjUpCisJICogTSAtIE1ham9yOiBjaGFuZ2UgaWYgcmVtb3Zpbmcgb3IgbW9kaWZ5aW5nIGFuIGV4aXN0aW5nIGNhbGwuCisJICogbSAtIG1pbm9yOiBjaGFuZ2Ugd2hlbiBhZGRpbmcgYSBuZXcgY2FsbAorCSAqLworCVdJTUFYX0dOTF9WRVJTSU9OID0gMDEsCisJLyogR2VuZXJpYyBOZXRMaW5rIGF0dHJpYnV0ZXMgKi8KKwlXSU1BWF9HTkxfQVRUUl9JTlZBTElEID0gMHgwMCwKKwlXSU1BWF9HTkxfQVRUUl9NQVggPSAxMCwKK307CisKKworLyoKKyAqIEdlbmVyaWMgTmV0TGluayBvcGVyYXRpb25zCisgKgorICogTW9zdCBvZiB0aGVzZSBtYXAgdG8gYW4gQVBJIGNhbGw7IF9PUF8gc3RhbmRzIGZvciBvcGVyYXRpb24sIF9SUF8KKyAqIGZvciByZXBseSBhbmQgX1JFXyBmb3IgcmVwb3J0IChha2E6IHNpZ25hbCkuCisgKi8KK2VudW0geworCVdJTUFYX0dOTF9PUF9NU0dfRlJPTV9VU0VSLAkvKiBVc2VyIHRvIGtlcm5lbCBtZXNzYWdlICovCisJV0lNQVhfR05MX09QX01TR19UT19VU0VSLAkvKiBLZXJuZWwgdG8gdXNlciBtZXNzYWdlICovCisJV0lNQVhfR05MX09QX1JGS0lMTCwJLyogUnVuIHdpbWF4X3Jma2lsbCgpICovCisJV0lNQVhfR05MX09QX1JFU0VULAkvKiBSdW4gd2ltYXhfcmZraWxsKCkgKi8KKwlXSU1BWF9HTkxfUkVfU1RBVEVfQ0hBTkdFLAkvKiBSZXBvcnQ6IHN0YXR1cyBjaGFuZ2UgKi8KKwlXSU1BWF9HTkxfT1BfU1RBVEVfR0VULAkJLyogUmVxdWVzdCBmb3IgY3VycmVudCBzdGF0ZSAqLworfTsKKworCisvKiBNZXNzYWdlIGZyb20gdXNlciAvIHRvIHVzZXIgKi8KK2VudW0geworCVdJTUFYX0dOTF9NU0dfSUZJRFggPSAxLAorCVdJTUFYX0dOTF9NU0dfUElQRV9OQU1FLAorCVdJTUFYX0dOTF9NU0dfREFUQSwKK307CisKKworLyoKKyAqIHdpbWF4X3Jma2lsbCgpCisgKgorICogVGhlIHN0YXRlIG9mIHRoZSByYWRpbyAoT04vT0ZGKSBpcyBtYXBwZWQgdG8gdGhlIHJma2lsbCBzdWJzeXN0ZW0ncworICogc3dpdGNoIHN0YXRlIChESVNBQkxFRC9FTkFCTEVEKS4KKyAqLworZW51bSB3aW1heF9yZl9zdGF0ZSB7CisJV0lNQVhfUkZfT0ZGID0gMCwJLyogUmFkaW8gaXMgb2ZmLCByZmtpbGwgb24vZW5hYmxlZCAqLworCVdJTUFYX1JGX09OID0gMSwJLyogUmFkaW8gaXMgb24sIHJma2lsbCBvZmYvZGlzYWJsZWQgKi8KKwlXSU1BWF9SRl9RVUVSWSA9IDIsCit9OworCisvKiBBdHRyaWJ1dGVzICovCitlbnVtIHsKKwlXSU1BWF9HTkxfUkZLSUxMX0lGSURYID0gMSwKKwlXSU1BWF9HTkxfUkZLSUxMX1NUQVRFLAorfTsKKworCisvKiBBdHRyaWJ1dGVzIGZvciB3aW1heF9yZXNldCgpICovCitlbnVtIHsKKwlXSU1BWF9HTkxfUkVTRVRfSUZJRFggPSAxLAorfTsKKworLyogQXR0cmlidXRlcyBmb3Igd2ltYXhfc3RhdGVfZ2V0KCkgKi8KK2VudW0geworCVdJTUFYX0dOTF9TVEdFVF9JRklEWCA9IDEsCit9OworCisvKgorICogQXR0cmlidXRlcyBmb3IgdGhlIFJlcG9ydCBTdGF0ZSBDaGFuZ2UKKyAqCisgKiBGb3Igbm93IHdlIGp1c3QgaGF2ZSB0aGUgb2xkIGFuZCBuZXcgc3RhdGVzOyBuZXcgYXR0cmlidXRlcyBtaWdodAorICogYmUgYWRkZWQgbGF0ZXIgb24uCisgKi8KK2VudW0geworCVdJTUFYX0dOTF9TVENIX0lGSURYID0gMSwKKwlXSU1BWF9HTkxfU1RDSF9TVEFURV9PTEQsCisJV0lNQVhfR05MX1NUQ0hfU1RBVEVfTkVXLAorfTsKKworCisvKioKKyAqIGVudW0gd2ltYXhfc3QgLSBUaGUgZGlmZmVyZW50IHN0YXRlcyBvZiBhIFdpTUFYIGRldmljZQorICogQF9fV0lNQVhfU1RfTlVMTDogVGhlIGRldmljZSBzdHJ1Y3R1cmUgaGFzIGJlZW4gYWxsb2NhdGVkIGFuZCB6ZXJvZWQsCisgKiAgICAgYnV0IHN0aWxsIHdpbWF4X2Rldl9hZGQoKSBoYXNuJ3QgYmVlbiBjYWxsZWQuIFRoZXJlIGlzIG5vIHN0YXRlLgorICoKKyAqIEBXSU1BWF9TVF9ET1dOOiBUaGUgZGV2aWNlIGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgV2lNQVggYW5kCisgKiAgICAgbmV0d29ya2luZyBzdGFja3MsIGJ1dCBpdCBpcyBub3QgaW5pdGlhbGl6ZWQgKG5vcm1hbGx5IHRoYXQgaXMKKyAqICAgICBkb25lIHdpdGggJ2lmY29uZmlnIERFViB1cCcgW29yIGVxdWl2YWxlbnRdLCB3aGljaCBjYW4gdXBsb2FkCisgKiAgICAgZmlybXdhcmUgYW5kIGVuYWJsZSBjb21tdW5pY2F0aW9ucyB3aXRoIHRoZSBkZXZpY2UpLgorICogICAgIEluIHRoaXMgc3RhdGUsIHRoZSBkZXZpY2UgaXMgcG93ZXJlZCBkb3duIGFuZCB1c2luZyBhcyBsZXNzCisgKiAgICAgcG93ZXIgYXMgcG9zc2libGUuCisgKiAgICAgVGhpcyBzdGF0ZSBpcyB0aGUgZGVmYXVsdCBhZnRlciBhIGNhbGwgdG8gd2ltYXhfZGV2X2FkZCgpLiBJdAorICogICAgIGlzIG9rIHRvIGhhdmUgZHJpdmVycyBtb3ZlIGRpcmVjdGx5IHRvICVXSU1BWF9TVF9VTklOSVRJQUxJWkVECisgKiAgICAgb3IgJVdJTUFYX1NUX1JBRElPX09GRiBpbiBfcHJvYmUoKSBhZnRlciB0aGUgY2FsbCB0bworICogICAgIHdpbWF4X2Rldl9hZGQoKS4KKyAqICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBkcml2ZXIgbGVhdmVzIHRoaXMgc3RhdGUgd2hlbgorICogICAgIGNhbGxpbmcgJ2lmY29uZmlnIERFViB1cCcgYW5kIGVudGVycyBpdCBiYWNrIG9uICdpZmNvbmZpZyBERVYKKyAqICAgICBkb3duJy4KKyAqCisgKiBAX19XSU1BWF9TVF9RVUlFU0NJTkc6IFRoZSBkZXZpY2UgaXMgYmVpbmcgdG9ybiBkb3duLCBzbyBubyBBUEkKKyAqICAgICBvcGVyYXRpb25zIGFyZSBhbGxvd2VkIHRvIHByb2NlZWQgZXhjZXB0IHRoZSBvbmVzIG5lZWRlZCB0bworICogICAgIGNvbXBsZXRlIHRoZSBkZXZpY2UgY2xlYW4gdXAgcHJvY2Vzcy4KKyAqCisgKiBAV0lNQVhfU1RfVU5JTklUSUFMSVpFRDogW29wdGlvbmFsXSBDb21tdW5pY2F0aW9uIHdpdGggdGhlIGRldmljZQorICogICAgIGlzIHNldHVwLCBidXQgdGhlIGRldmljZSBzdGlsbCByZXF1aXJlcyBzb21lIGNvbmZpZ3VyYXRpb24KKyAqICAgICBiZWZvcmUgYmVpbmcgb3BlcmF0aW9uYWwuCisgKiAgICAgU29tZSBXaU1BWCBBUEkgY2FsbHMgbWlnaHQgd29yay4KKyAqCisgKiBAV0lNQVhfU1RfUkFESU9fT0ZGOiBUaGUgZGV2aWNlIGlzIGZ1bGx5IHVwOyByYWRpbyBpcyBvZmYgKHdldGhlcgorICogICAgIGJ5IGhhcmR3YXJlIG9yIHNvZnR3YXJlIHN3aXRjaGVzKS4KKyAqICAgICBJdCBpcyByZWNvbW1lbmRlZCB0byBhbHdheXMgbGVhdmUgdGhlIGRldmljZSBpbiB0aGlzIHN0YXRlCisgKiAgICAgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCisgKgorICogQFdJTUFYX1NUX1JFQURZOiBUaGUgZGV2aWNlIGlzIGZ1bGx5IHVwIGFuZCByYWRpbyBpcyBvbi4KKyAqCisgKiBAV0lNQVhfU1RfU0NBTk5JTkc6IFtvcHRpb25hbF0gVGhlIGRldmljZSBoYXMgYmVlbiBpbnN0cnVjdGVkIHRvCisgKiAgICAgc2Nhbi4gSW4gdGhpcyBzdGF0ZSwgdGhlIGRldmljZSBjYW5ub3QgYmUgYWN0aXZlbHkgY29ubmVjdGVkIHRvCisgKiAgICAgYSBuZXR3b3JrLgorICoKKyAqIEBXSU1BWF9TVF9DT05ORUNUSU5HOiBUaGUgZGV2aWNlIGlzIGNvbm5lY3RpbmcgdG8gYSBuZXR3b3JrLiBUaGlzCisgKiAgICAgc3RhdGUgZXhpc3RzIGJlY2F1c2UgaW4gc29tZSBkZXZpY2VzLCB0aGUgY29ubmVjdCBwcm9jZXNzIGNhbgorICogICAgIGluY2x1ZGUgYSBudW1iZXIgb2YgbmVnb3RpYXRpb25zIGJldHdlZW4gdXNlciBzcGFjZSwga2VybmVsCisgKiAgICAgc3BhY2UgYW5kIHRoZSBkZXZpY2UuIFVzZXIgc3BhY2UgbmVlZHMgdG8ga25vdyB3aGF0IHRoZSBkZXZpY2UKKyAqICAgICBpcyBkb2luZy4gSWYgdGhlIGNvbm5lY3Qgc2VxdWVuY2UgaW4gYSBkZXZpY2UgaXMgYXRvbWljIGFuZAorICogICAgIGZhc3QsIHRoZSBkZXZpY2UgY2FuIHRyYW5zaXRpb24gZGlyZWN0bHkgdG8gQ09OTkVDVEVECisgKgorICogQFdJTUFYX1NUX0NPTk5FQ1RFRDogVGhlIGRldmljZSBpcyBjb25uZWN0ZWQgdG8gYSBuZXR3b3JrLgorICoKKyAqIEBfX1dJTUFYX1NUX0lOVkFMSUQ6IFRoaXMgaXMgYW4gaW52YWxpZCBzdGF0ZSB1c2VkIHRvIG1hcmsgdGhlCisgKiAgICAgbWF4aW11bSBudW1lcmljIHZhbHVlIG9mIHN0YXRlcy4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBUcmFuc2l0aW9ucyBmcm9tIG9uZSBzdGF0ZSB0byBhbm90aGVyIG9uZSBhcmUgYXRvbWljIGFuZCBjYW4gb25seQorICogYmUgY2F1c2VkIGluIGtlcm5lbCBzcGFjZSB3aXRoIHdpbWF4X3N0YXRlX2NoYW5nZSgpLiBUbyByZWFkIHRoZQorICogc3RhdGUsIHVzZSB3aW1heF9zdGF0ZV9nZXQoKS4KKyAqCisgKiBTdGF0ZXMgc3RhcnRpbmcgd2l0aCBfXyBhcmUgaW50ZXJuYWwgYW5kIHNoYWxsIG5vdCBiZSB1c2VkIG9yCisgKiByZWZlcnJlZCB0byBieSBkcml2ZXJzIG9yIHVzZXJzcGFjZS4gVGhleSBsb29rIHVnbHksIGJ1dCB0aGF0J3MgdGhlCisgKiBwb2ludCAtLSBpZiBhbnkgdXNlIGlzIG1hZGUgbm9uLWludGVybmFsIHRvIHRoZSBzdGFjaywgaXQgaXMgZWFzaWVyCisgKiB0byBjYXRjaCBvbiByZXZpZXcuCisgKgorICogQWxsIEFQSSBvcGVyYXRpb25zIFt3aXRoIHdlbGwgZGVmaW5lZCBleGNlcHRpb25zXSB3aWxsIHRha2UgdGhlCisgKiBkZXZpY2UgbXV0ZXggYmVmb3JlIHN0YXJ0aW5nIGFuZCB0aGVuIGNoZWNrIHRoZSBzdGF0ZS4gSWYgdGhlIHN0YXRlCisgKiBpcyAlX19XSU1BWF9TVF9OVUxMLCAlV0lNQVhfU1RfRE9XTiwgJVdJTUFYX1NUX1VOSU5JVElBTElaRUQgb3IKKyAqICVfX1dJTUFYX1NUX1FVSUVTQ0lORywgaXQgd2lsbCBkcm9wIHRoZSBsb2NrIGFuZCBxdWl0IHdpdGgKKyAqIC0lRUlOVkFMLCAtJUVOT01FRElVTSwgLSVFTk9UQ09OTiBvciAtJUVTSFVURE9XTi4KKyAqCisgKiBUaGUgb3JkZXIgb2YgdGhlIGRlZmluaXRpb25zIGlzIGltcG9ydGFudCwgc28gd2UgY2FuIGRvIG51bWVyaWNhbAorICogY29tcGFyaXNvbnMgKGVnOiA8ICVXSU1BWF9TVF9SQURJT19PRkYgbWVhbnMgdGhlIGRldmljZSBpcyBub3QgcmVhZHkKKyAqIHRvIG9wZXJhdGUpLgorICovCisvKgorICogVGhlIGFsbG93ZWQgc3RhdGUgdHJhbnNpdGlvbnMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgdGFibGUgYmVsb3cKKyAqIChzdGF0ZXMgaW4gcm93cyBjYW4gZ28gdG8gc3RhdGVzIGluIGNvbHVtbnMgd2hlcmUgdGhlcmUgaXMgYW4gWCk6CisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JTkkgICBSQURJTyBSRUFEWSBTQ0FOIENPTk5FQyBDT05ORUMKKyAqICAgICAgICAgICAgIE5VTEwgRE9XTiBRVUlFU0NJTkcgVElBTElaRUQgIE9GRiAgICAgICAgTklORyAgVElORyAgIFRFRAorICogTlVMTCAgICAgICAgIC0gICAgeAorICogRE9XTiAgICAgICAgICAgICAgLSAgICAgIHggICAgICAgIHggICAgICAgeAorICogUVVJRVNDSU5HICAgICAgICAgeCAgICAgIC0KKyAqIFVOSU5JVElBTElaRUQgICAgICAgICAgICB4ICAgICAgICAtICAgICAgIHgKKyAqIFJBRElPX09GRiAgICAgICAgICAgICAgICB4ICAgICAgICAgICAgICAgIC0gICAgIHgKKyAqIFJFQURZICAgICAgICAgICAgICAgICAgICB4ICAgICAgICAgICAgICAgIHggICAgIC0gICAgIHggICAgIHggICAgICB4CisgKiBTQ0FOTklORyAgICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgICB4ICAgICB4ICAgICAtICAgICB4ICAgICAgeAorICogQ09OTkVDVElORyAgICAgICAgICAgICAgIHggICAgICAgICAgICAgICAgeCAgICAgeCAgICAgeCAgICAgLSAgICAgIHgKKyAqIENPTk5FQ1RFRCAgICAgICAgICAgICAgICB4ICAgICAgICAgICAgICAgIHggICAgIHggICAgICAgICAgICAgICAgICAtCisgKgorICogVGhpcyB0YWJsZSBub3QgYXZhaWxhYmxlIGluIGtlcm5lbC1kb2MgYmVjYXVzZSB0aGUgZm9ybWF0dGluZyBtZXNzZXMgaXQgdXAuCisgKi8KKyBlbnVtIHdpbWF4X3N0IHsKKwlfX1dJTUFYX1NUX05VTEwgPSAwLAorCVdJTUFYX1NUX0RPV04sCisJX19XSU1BWF9TVF9RVUlFU0NJTkcsCisJV0lNQVhfU1RfVU5JTklUSUFMSVpFRCwKKwlXSU1BWF9TVF9SQURJT19PRkYsCisJV0lNQVhfU1RfUkVBRFksCisJV0lNQVhfU1RfU0NBTk5JTkcsCisJV0lNQVhfU1RfQ09OTkVDVElORywKKwlXSU1BWF9TVF9DT05ORUNURUQsCisJX19XSU1BWF9TVF9JTlZBTElECQkJLyogQWx3YXlzIGtlZXAgbGFzdCAqLworfTsKKworCisjZW5kaWYgLyogI2lmbmRlZiBfX0xJTlVYX19XSU1BWF9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvd2ltYXgvaTI0MDBtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dpbWF4L2kyNDAwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDM1NjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dpbWF4L2kyNDAwbS5oCkBAIC0wLDAgKzEsNTcyIEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNYXggQ29ubmVjdGlvbiAyNDAwbQorICogSG9zdC1EZXZpY2UgcHJvdG9jb2wgaW50ZXJmYWNlIGRlZmluaXRpb25zCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMgdXNlZCB0bworICogY29tbXVuaWNhdGUgd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIEJPT1RNT0RFL0JPT1RST00vRklSTVdBUkUgVVBMT0FEIFBST1RPQ09MCisgKgorICogVGhlIGZpcm13YXJlIHVwbG9hZCBwcm90b2NvbCBpcyBxdWl0ZSBzaW1wbGUgYW5kIG9ubHkgcmVxdWlyZXMgYQorICogaGFuZGZ1bCBvZiBjb21tYW5kcy4gU2VlIGRyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9mdy5jIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFRoZSBCQ0YgZGF0YSBzdHJ1Y3R1cmUgaXMgZm9yIHRoZSBmaXJtd2FyZSBmaWxlIGhlYWRlci4KKyAqCisgKgorICogVEhFIERBVEEgLyBDT05UUk9MIFBST1RPQ09MCisgKgorICogVGhpcyBpcyB0aGUgbm9ybWFsIHByb3RvY29sIHNwb2tlbiB3aXRoIHRoZSBkZXZpY2Ugb25jZSB0aGUKKyAqIGZpcm13YXJlIGlzIHVwbG9hZGVkLiBJdCB0cmFuc3BvcnRzIGRhdGEgcGF5bG9hZHMgYW5kIGNvbnRyb2wKKyAqIG1lc3NhZ2VzIGJhY2sgYW5kIGZvcnRoLgorICoKKyAqIEl0IGNvbnNpc3RzICdtZXNzYWdlcycgdGhhdCBwYWNrIG9uZSBvciBtb3JlIHBheWxvYWRzIGVhY2guIFRoZQorICogZm9ybWF0IGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3J4LmMgYW5kCisgKiB0eC5jLgorICoKKyAqCisgKiBUSEUgTDNMNCBQUk9UT0NPTAorICoKKyAqIFRoZSB0ZXJtIEwzTDQgcmVmZXJzIHRvIExheWVyIDMgKHRoZSBkZXZpY2UpLCBMYXllciA0ICh0aGUKKyAqIGRyaXZlci9ob3N0IHNvZnR3YXJlKS4KKyAqCisgKiBUaGlzIGlzIHRoZSBjb250cm9sIHByb3RvY29sIHVzZWQgYnkgdGhlIGhvc3QgdG8gY29udHJvbCB0aGUgaTI0MDBtCisgKiBkZXZpY2UgKHNjYW4sIGNvbm5lY3QsIGRpc2Nvbm5lY3QuLi4pLiBUaGlzIGlzIHNlbnQgdG8gLyByZWNlaXZlZAorICogYXMgY29udHJvbCBmcmFtZXMuIFRoZXNlIGZyYW1lcyBjb25zaXN0IG9mIGEgaGVhZGVyIGFuZCB6ZXJvIG9yCisgKiBtb3JlIFRMVnMgd2l0aCBpbmZvcm1hdGlvbi4gV2UgY2FsbCBlYWNoIGNvbnRyb2wgZnJhbWUgYSAibWVzc2FnZSIuCisgKgorICogRWFjaCBtZXNzYWdlIGlzIGNvbXBvc2VkIG9mOgorICoKKyAqIEhFQURFUgorICogW1RMVjAgKyBQQVlMT0FEMF0KKyAqIFtUTFYxICsgUEFZTE9BRDFdCisgKiBbLi4uXQorICogW1RMVk4gKyBQQVlMT0FETl0KKyAqCisgKiBUaGUgSEVBREVSIGlzIGRlZmluZWQgYnkgJ3N0cnVjdCBpMjQwMG1fbDNsNF9oZHInLiBUaGUgcGF5bG9hZHMgYXJlCisgKiBkZWZpbmVkIGJ5IGEgVExWIHN0cnVjdHVyZSAoVHlwZSBMZW5ndGggVmFsdWUpIHdoaWNoIGlzIGEgJ2hlYWRlcicKKyAqIChzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIpIGFuZCB0aGVuIHRoZSBwYXlsb2FkLgorICoKKyAqIEFsbCBpbnRlZ2VycyBhcmUgcmVwcmVzZW50ZWQgYXMgTGl0dGxlIEVuZGlhbi4KKyAqCisgKiAtIFJFUVVFU1RTIEFORCBFVkVOVFMKKyAqCisgKiBUaGUgcmVxdWVzdHMgY2FuIGJlIGNsYXNpZmllZCBhcyBmb2xsb3dzOgorICoKKyAqICAgQ09NTUFORDogIGltcGxpZXMgYSByZXF1ZXN0IGZyb20gdGhlIGhvc3QgdG8gdGhlIGRldmljZSByZXF1ZXN0aW5nCisgKiAgICAgICAgICAgICBhbiBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkLiBUaGUgZGV2aWNlIHdpbGwgcmVwbHkgd2l0aCBhCisgKiAgICAgICAgICAgICBtZXNzYWdlICh3aXRoIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGNvbW1hbmQpLCBzdGF0dXMgYW5kCisgKiAgICAgICAgICAgICBubyAoVExWKSBwYXlsb2FkLiBFeGVjdXRpb24gb2YgYSBjb21tYW5kIG1pZ2h0IGNhdXNlCisgKiAgICAgICAgICAgICBldmVudHMgKG9mIGRpZmZlcmVudCB0eXBlKSB0byBiZSBzZW50IGxhdGVyIG9uIGFzCisgKiAgICAgICAgICAgICBkZXZpY2UncyBzdGF0ZSBjaGFuZ2VzLgorICoKKyAqICAgR0VUL1NFVDogIHNpbWlsYXIgdG8gQ09NTUFORCwgYnV0IHdpbGwgbm90IGNhdXNlIG90aGVyCisgKiAgICAgICAgICAgICBFVkVOVHMuIFRoZSByZXBseSwgaW4gdGhlIGNhc2Ugb2YgR0VULCB3aWxsIGNvbnRhaW4KKyAqICAgICAgICAgICAgIFRMVnMgd2l0aCB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uLgorICoKKyAqICAgRVZFTlQ6ICAgIGFzeW5jaHJvbm91cyBtZXNzYWdlcyBzZW50IGZyb20gdGhlIGRldmljZSwgbWF5YmUgYXMgYQorICogICAgICAgICAgICAgY29uc2VxdWVuY2Ugb2YgcHJldmlvdXMgQ09NTUFORHMgYnV0IGRpc2Fzc29jaWF0ZWQgZnJvbQorICogICAgICAgICAgICAgdGhlbS4KKyAqCisgKiBPbmx5IG9uZSByZXF1ZXN0IG1pZ2h0IGJlIHBlbmRpbmcgYXQgdGhlIHNhbWUgdGltZSAoaWU6IGRvbid0CisgKiBwYXJhbGxlbGl6ZSBub3IgcG9zdCBhbm90aGVyIEdFVCByZXF1ZXN0IGJlZm9yZSB0aGUgcHJldmlvdXMKKyAqIENPTU1BTkQgaGFzIGJlZW4gYWNrbm93bGVkZ2VkIHdpdGggaXQncyBjb3JyZXNwb25kaW5nIHJlcGx5IGJ5IHRoZQorICogZGV2aWNlKS4KKyAqCisgKiBUaGUgZGlmZmVyZW50IHJlcXVlc3RzIGFuZCB0aGVpciBmb3JtYXRzIGFyZSBkZXNjcmliZWQgYmVsb3c6CisgKgorICogIEkyNDAwTV9NVF8qICAgTWVzc2FnZSB0eXBlcworICogIEkyNDAwTV9NU18qICAgTWVzc2FnZSBzdGF0dXMgKGZvciByZXBsaWVzLCBldmVudHMpCisgKiAgaTI0MDBtX3Rsdl8qICBUTFZzCisgKgorICogZGF0YSB0eXBlcyBhcmUgbmFtZWQgJ3N0cnVjdCBpMjQwMG1fbXNnX09QTkFNRScsIE9QTkFNRSBtYXRjaGluZyB0aGUKKyAqIG9wZXJhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfX1dJTUFYX19JMjQwME1fSF9fCisjZGVmaW5lIF9fTElOVVhfX1dJTUFYX19JMjQwME1fSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKy8qCisgKiBIb3N0IERldmljZSBJbnRlcmZhY2UgKEhESSkgY29tbW9uIHRvIGFsbCBidXNzZXMKKyAqLworCisvKiBCb290LW1vZGUgKGZpcm13YXJlIHVwbG9hZCBtb2RlKSBjb21tYW5kcyAqLworCisvKiBIZWFkZXIgZm9yIHRoZSBmaXJtd2FyZSBmaWxlICovCitzdHJ1Y3QgaTI0MDBtX2JjZl9oZHIgeworCV9fbGUzMiBtb2R1bGVfdHlwZTsKKwlfX2xlMzIgaGVhZGVyX2xlbjsKKwlfX2xlMzIgaGVhZGVyX3ZlcnNpb247CisJX19sZTMyIG1vZHVsZV9pZDsKKwlfX2xlMzIgbW9kdWxlX3ZlbmRvcjsKKwlfX2xlMzIgZGF0ZTsJCS8qIEJDRCBZWVlNTUREICovCisJX19sZTMyIHNpemU7ICAgICAgICAgICAgLyogaW4gZHdvcmRzICovCisJX19sZTMyIGtleV9zaXplOwkvKiBpbiBkd29yZHMgKi8KKwlfX2xlMzIgbW9kdWx1c19zaXplOwkvKiBpbiBkd29yZHMgKi8KKwlfX2xlMzIgZXhwb25lbnRfc2l6ZTsJLyogaW4gZHdvcmRzICovCisJX191OCByZXNlcnZlZFs4OF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQm9vdCBtb2RlIG9wY29kZXMgKi8KK2VudW0gaTI0MDBtX2JyaF9vcGNvZGUgeworCUkyNDAwTV9CUkhfUkVBRCA9IDEsCisJSTI0MDBNX0JSSF9XUklURSA9IDIsCisJSTI0MDBNX0JSSF9KVU1QID0gMywKKwlJMjQwME1fQlJIX1NJR05FRF9KVU1QID0gOCwKKwlJMjQwME1fQlJIX0hBU0hfUEFZTE9BRF9PTkxZID0gOSwKK307CisKKy8qIEJvb3QgbW9kZSBjb21tYW5kIG1hc2tzIGFuZCBzdHVmZiAqLworZW51bSBpMjQwMG1fYnJoIHsKKwlJMjQwME1fQlJIX1NJR05BVFVSRSA9IDB4Y2JiYzAwMDAsCisJSTI0MDBNX0JSSF9TSUdOQVRVUkVfTUFTSyA9IDB4ZmZmZjAwMDAsCisJSTI0MDBNX0JSSF9TSUdOQVRVUkVfU0hJRlQgPSAxNiwKKwlJMjQwME1fQlJIX09QQ09ERV9NQVNLID0gMHgwMDAwMDAwZiwKKwlJMjQwME1fQlJIX1JFU1BPTlNFX01BU0sgPSAweDAwMDAwMGYwLAorCUkyNDAwTV9CUkhfUkVTUE9OU0VfU0hJRlQgPSA0LAorCUkyNDAwTV9CUkhfRElSRUNUX0FDQ0VTUyA9IDB4MDAwMDA0MDAsCisJSTI0MDBNX0JSSF9SRVNQT05TRV9SRVFVSVJFRCA9IDB4MDAwMDAyMDAsCisJSTI0MDBNX0JSSF9VU0VfQ0hFQ0tTVU0gPSAweDAwMDAwMTAwLAorfTsKKworCisvKioKKyAqIGkyNDAwbV9ib290cm9tX2hlYWRlciAtIEhlYWRlciBmb3IgYSBib290LW1vZGUgY29tbWFuZAorICoKKyAqIEBjbWQ6IHRoZSBhYm92ZSBjb21tYW5kIGRlc2NyaXB0b3IKKyAqIEB0YXJnZXRfYWRkcjogd2hlcmUgb24gdGhlIGRldmljZSBtZW1vcnkgc2hvdWxkIHRoZSBhY3Rpb24gYmUgcGVyZm9ybWVkLgorICogQGRhdGFfc2l6ZTogZm9yIHJlYWQvd3JpdGUsIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlYWQvd3JpdHRlbgorICogQGJsb2NrX2NoZWNrc3VtOiBjaGVja3N1bSB2YWx1ZSAoaWYgYXBwbGljYWJsZSkKKyAqIEBwYXlsb2FkOiB0aGUgYmVnaW5uaW5nIG9mIGRhdGEgYXR0YWNoZWQgdG8gdGhpcyBoZWFkZXIKKyAqLworc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciB7CisJX19sZTMyIGNvbW1hbmQ7CQkvKiBDb21wb3NlIHdpdGggZW51bSBpMjQwMF9icmggKi8KKwlfX2xlMzIgdGFyZ2V0X2FkZHI7CisJX19sZTMyIGRhdGFfc2l6ZTsKKwlfX2xlMzIgYmxvY2tfY2hlY2tzdW07CisJY2hhciBwYXlsb2FkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKyAqIERhdGEgLyBjb250cm9sIHByb3RvY29sCisgKi8KKworLyogUGFja2V0IHR5cGVzIGZvciB0aGUgaG9zdC1kZXZpY2UgaW50ZXJmYWNlICovCitlbnVtIGkyNDAwbV9wdCB7CisJSTI0MDBNX1BUX0RBVEEgPSAwLAorCUkyNDAwTV9QVF9DVFJMLAorCUkyNDAwTV9QVF9UUkFDRSwJLyogRm9yIGRldmljZSBkZWJ1ZyAqLworCUkyNDAwTV9QVF9SRVNFVF9XQVJNLAkvKiBkZXZpY2UgcmVzZXQgKi8KKwlJMjQwME1fUFRfUkVTRVRfQ09MRCwJLyogVVNCW3RyYW5zcG9ydF0gcmVzZXQsIGxpa2UgcmVjb25uZWN0ICovCisJSTI0MDBNX1BUX0VEQVRBLAkvKiBFeHRlbmRlZCBSWCBkYXRhICovCisJSTI0MDBNX1BUX0lMTEVHQUwKK307CisKKworLyoKKyAqIFBheWxvYWQgZm9yIGEgZGF0YSBwYWNrZXQKKyAqCisgKiBUaGlzIGlzIHByZWZpeGVkIHRvIGVhY2ggYW5kIGV2ZXJ5IG91dGdvaW5nIERBVEEgdHlwZS4KKyAqLworc3RydWN0IGkyNDAwbV9wbF9kYXRhX2hkciB7CisJX19sZTMyIHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKgorICogUGF5bG9hZCBmb3IgYW4gZXh0ZW5kZWQgZGF0YSBwYWNrZXQKKyAqCisgKiBOZXcgaW4gZncgdjEuNAorICoKKyAqIEByZW9yZGVyOiBpZiB0aGlzIHBheWxvYWQgaGFzIHRvIGJlIHJlb3JkZXIgb3Igbm90IChhbmQgaG93KQorICogQGNzOiB0aGUgdHlwZSBvZiBkYXRhIGluIHRoZSBwYWNrZXQsIGFzIGRlZmluZWQgcGVyICg4MDIuMTZlCisgKiAgICAgVDExLjEzLjE5LjEpLiBDdXJyZW50bHkgb25seSAyIChJUHY0IHBhY2tldCkgc3VwcG9ydGVkLgorICoKKyAqIFRoaXMgaXMgcHJlZml4ZWQgdG8gZWFjaCBhbmQgZXZlcnkgSU5DT01JTkcgREFUQSBwYWNrZXQuCisgKi8KK3N0cnVjdCBpMjQwMG1fcGxfZWRhdGFfaGRyIHsKKwlfX2xlMzIgcmVvcmRlcjsJCS8qIGJpdHMgZGVmaW5lZCBpbiBpMjQwMG1fcm8gKi8KKwlfX3U4IGNzOworCV9fdTggcmVzZXJ2ZWRbMTFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZW51bSBpMjQwMG1fY3MgeworCUkyNDAwTV9DU19JUFY0XzAgPSAwLAorCUkyNDAwTV9DU19JUFY0ID0gMiwKK307CisKK2VudW0gaTI0MDBtX3JvIHsKKwlJMjQwME1fUk9fTkVFREVEICAgICA9IDB4MDEsCisJSTI0MDBNX1JPX1RZUEUgICAgICAgPSAweDAzLAorCUkyNDAwTV9ST19UWVBFX1NISUZUID0gMSwKKwlJMjQwME1fUk9fQ0lOICAgICAgICA9IDB4MGYsCisJSTI0MDBNX1JPX0NJTl9TSElGVCAgPSA0LAorCUkyNDAwTV9ST19GQk4gICAgICAgID0gMHgwN2ZmLAorCUkyNDAwTV9ST19GQk5fU0hJRlQgID0gOCwKKwlJMjQwME1fUk9fU04gICAgICAgICA9IDB4MDdmZiwKKwlJMjQwME1fUk9fU05fU0hJRlQgICA9IDIxLAorfTsKKworZW51bSBpMjQwMG1fcm9fdHlwZSB7CisJSTI0MDBNX1JPX1RZUEVfUkVTRVQgPSAwLAorCUkyNDAwTV9ST19UWVBFX1BBQ0tFVCwKKwlJMjQwME1fUk9fVFlQRV9XUywKKwlJMjQwME1fUk9fVFlQRV9QQUNLRVRfV1MsCit9OworCisKKy8qIE1pc2MgY29uc3RhbnRzICovCitlbnVtIHsKKwlJMjQwME1fUExfQUxJR04gPSAxNiwJLyogUGF5bG9hZCBkYXRhIHNpemUgYWxpZ25tZW50ICovCisJSTI0MDBNX1BMX1NJWkVfTUFYID0gMHgzRUZGLAorCUkyNDAwTV9NQVhfUExTX0lOX01TRyA9IDYwLAorCS8qIHByb3RvY29sIGJhcmtlcnM6IHN5bmMgc2VxdWVuY2VzOyBmb3Igbm90aWZpY2F0aW9ucyB0aGV5CisJICogYXJlIHNlbnQgaW4gZ3JvdXBzIG9mIGZvdXIuICovCisJSTI0MDBNX0gyRF9QUkVWSUVXX0JBUktFUiA9IDB4Y2FmZTkwMGQsCisJSTI0MDBNX0NPTERfUkVTRVRfQkFSS0VSID0gMHhjMDFkYzAxZCwKKwlJMjQwME1fV0FSTV9SRVNFVF9CQVJLRVIgPSAweDUwZjc1MGY3LAorCUkyNDAwTV9OQk9PVF9CQVJLRVIgPSAweGRlYWRiZWVmLAorCUkyNDAwTV9TQk9PVF9CQVJLRVIgPSAweDBmZjFjMWExLAorCUkyNDAwTV9TQk9PVF9CQVJLRVJfNjA1MCA9IDB4ODAwMDAwMDEsCisJSTI0MDBNX0FDS19CQVJLRVIgPSAweGZlZWRiYWJlLAorCUkyNDAwTV9EMkhfTVNHX0JBUktFUiA9IDB4YmVlZmJhYmUsCit9OworCisKKy8qCisgKiBIYXJkd2FyZSBwYXlsb2FkIGRlc2NyaXB0b3IKKyAqCisgKiBCaXRmaWVsZHMgZW5jb2RlZCBpbiBhIHN0cnVjdCB0byBlbmZvcmNlIHR5cGluZyBzZW1hbnRpY3MuCisgKgorICogTG9vayBpbiByeC5jIGFuZCB0eC5jIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdC4KKyAqLworc3RydWN0IGkyNDAwbV9wbGQgeworCV9fbGUzMiB2YWw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBJMjQwME1fUExEX1NJWkVfTUFTSyAweDAwMDAzZmZmCisjZGVmaW5lIEkyNDAwTV9QTERfVFlQRV9TSElGVCAxNgorI2RlZmluZSBJMjQwME1fUExEX1RZUEVfTUFTSyAweDAwMGYwMDAwCisKKy8qCisgKiBIZWFkZXIgZm9yIGEgVFggbWVzc2FnZSBvciBSWCBtZXNzYWdlCisgKgorICogQGJhcmtlcjogcHJlYW1ibGUKKyAqIEBzaXplOiB1c2VkIGZvciBtYW5hZ2VtZW50IG9mIHRoZSBGSUZPIHF1ZXVlIGJ1ZmZlcjsgYmVmb3JlCisgKiAgICAgc2VuZGluZywgdGhpcyBpcyBjb252ZXJ0ZWQgdG8gYmUgYSByZWFsIHByZWFtYmxlLiBUaGlzCisgKiAgICAgaW5kaWNhdGVzIHRoZSByZWFsIHNpemUgb2YgdGhlIFRYIG1lc3NhZ2UgdGhhdCBzdGFydHMgYXQgdGhpcworICogICAgIHBvaW50LiBJZiB0aGUgaGlnaGVzdCBiaXQgaXMgc2V0LCB0aGVuIHRoaXMgbWVzc2FnZSBpcyB0byBiZQorICogICAgIHNraXBwZWQuCisgKiBAc2VxdWVuY2U6IHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIG1lc3NhZ2UKKyAqIEBvZmZzZXQ6IG9mZnNldCB3aGVyZSB0aGUgbWVzc2FnZSBpdHNlbGYgc3RhcnRzIC0tIHNlZSB0aGUgY29tbWVudHMKKyAqICAgICBpbiB0aGUgZmlsZSBoZWFkZXIgYWJvdXQgbWVzc2FnZSBoZWFkZXIgYW5kIHBheWxvYWQgZGVzY3JpcHRvcgorICogICAgIGFsaWdubWVudC4KKyAqIEBudW1fcGxzOiBudW1iZXIgb2YgcGF5bG9hZHMgaW4gdGhpcyBtZXNzYWdlCisgKiBAcGFkZGluZzogYW1vdW50IG9mIHBhZGRpbmcgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSB0byBtYWtlCisgKiAgICAgICAgICAgaXQgYmUgb2YgYmxvY2stc2l6ZSBhbGlnbmVkCisgKgorICogTG9vayBpbiByeC5jIGFuZCB0eC5jIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdC4KKyAqLworc3RydWN0IGkyNDAwbV9tc2dfaGRyIHsKKwl1bmlvbiB7CisJCV9fbGUzMiBiYXJrZXI7CisJCV9fdTMyIHNpemU7CS8qIHNhbWUgc2l6ZSB0eXBlIGFzIGJhcmtlciEhICovCisJfTsKKwl1bmlvbiB7CisJCV9fbGUzMiBzZXF1ZW5jZTsKKwkJX191MzIgb2Zmc2V0OwkvKiBzYW1lIHNpemUgdHlwZSBhcyBiYXJrZXIhISAqLworCX07CisJX19sZTE2IG51bV9wbHM7CisJX19sZTE2IHJzdjE7CisJX19sZTE2IHBhZGRpbmc7CisJX19sZTE2IHJzdjI7CisJc3RydWN0IGkyNDAwbV9wbGQgcGxkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworCisvKgorICogTDMvTDQgY29udHJvbCBwcm90b2NvbAorICovCisKK2VudW0geworCS8qIEludGVyZmFjZSB2ZXJzaW9uICovCisJSTI0MDBNX0wzTDRfVkVSU0lPTiAgICAgICAgICAgICA9IDB4MDEwMCwKK307CisKKy8qIE1lc3NhZ2UgdHlwZXMgKi8KK2VudW0gaTI0MDBtX210IHsKKwlJMjQwME1fTVRfUkVTRVJWRUQgICAgICAgICAgICAgID0gMHgwMDAwLAorCUkyNDAwTV9NVF9JTlZBTElEICAgICAgICAgICAgICAgPSAweGZmZmYsCisJSTI0MDBNX01UX1JFUE9SVF9NQVNLCQk9IDB4ODAwMCwKKworCUkyNDAwTV9NVF9HRVRfU0NBTl9SRVNVTFQgIAk9IDB4NDIwMiwKKwlJMjQwME1fTVRfU0VUX1NDQU5fUEFSQU0gICAJPSAweDQ0MDIsCisJSTI0MDBNX01UX0NNRF9SRl9DT05UUk9MICAgCT0gMHg0NjAyLAorCUkyNDAwTV9NVF9DTURfU0NBTiAgICAgICAgIAk9IDB4NDYwMywKKwlJMjQwME1fTVRfQ01EX0NPTk5FQ1QgICAgICAJPSAweDQ2MDQsCisJSTI0MDBNX01UX0NNRF9ESVNDT05ORUNUICAgCT0gMHg0NjA1LAorCUkyNDAwTV9NVF9DTURfRVhJVF9JRExFICAgCT0gMHg0NjA2LAorCUkyNDAwTV9NVF9HRVRfTE1fVkVSU0lPTiAgIAk9IDB4NTIwMSwKKwlJMjQwME1fTVRfR0VUX0RFVklDRV9JTkZPICAJPSAweDUyMDIsCisJSTI0MDBNX01UX0dFVF9MSU5LX1NUQVRVUyAgCT0gMHg1MjAzLAorCUkyNDAwTV9NVF9HRVRfU1RBVElTVElDUyAgIAk9IDB4NTIwNCwKKwlJMjQwME1fTVRfR0VUX1NUQVRFICAgICAgICAJPSAweDUyMDUsCisJSTI0MDBNX01UX0dFVF9NRURJQV9TVEFUVVMJPSAweDUyMDYsCisJSTI0MDBNX01UX1NFVF9JTklUX0NPTkZJRwk9IDB4NTQwNCwKKwlJMjQwME1fTVRfQ01EX0lOSVQJICAgICAgICA9IDB4NTYwMSwKKwlJMjQwME1fTVRfQ01EX1RFUk1JTkFURQkJPSAweDU2MDIsCisJSTI0MDBNX01UX0NNRF9NT0RFX09GX09QCT0gMHg1NjAzLAorCUkyNDAwTV9NVF9DTURfUkVTRVRfREVWSUNFCT0gMHg1NjA0LAorCUkyNDAwTV9NVF9DTURfTU9OSVRPUl9DT05UUk9MICAgPSAweDU2MDUsCisJSTI0MDBNX01UX0NNRF9FTlRFUl9QT1dFUlNBVkUgICA9IDB4NTYwNiwKKwlJMjQwME1fTVRfR0VUX1RMU19PUEVSQVRJT05fUkVTVUxUID0gMHg2MjAxLAorCUkyNDAwTV9NVF9TRVRfRUFQX1NVQ0NFU1MgICAgICAgPSAweDY0MDIsCisJSTI0MDBNX01UX1NFVF9FQVBfRkFJTCAgICAgICAgICA9IDB4NjQwMywKKwlJMjQwME1fTVRfU0VUX0VBUF9LRVkgICAgICAgICAgCT0gMHg2NDA0LAorCUkyNDAwTV9NVF9DTURfU0VORF9FQVBfUkVTUE9OU0UgPSAweDY2MDIsCisJSTI0MDBNX01UX1JFUE9SVF9TQ0FOX1JFU1VMVCAgICA9IDB4YzAwMiwKKwlJMjQwME1fTVRfUkVQT1JUX1NUQVRFCQk9IDB4ZDAwMiwKKwlJMjQwME1fTVRfUkVQT1JUX1BPV0VSU0FWRV9SRUFEWSA9IDB4ZDAwNSwKKwlJMjQwME1fTVRfUkVQT1JUX0VBUF9SRVFVRVNUICAgID0gMHhlMDAyLAorCUkyNDAwTV9NVF9SRVBPUlRfRUFQX1JFU1RBUlQgICAgPSAweGUwMDMsCisJSTI0MDBNX01UX1JFUE9SVF9BTFRfQUNDRVBUICAgIAk9IDB4ZTAwNCwKKwlJMjQwME1fTVRfUkVQT1JUX0tFWV9SRVFVRVNUIAk9IDB4ZTAwNSwKK307CisKKworLyoKKyAqIE1lc3NhZ2UgQWNrIFN0YXR1cyBjb2RlcworICoKKyAqIFdoZW4gYSBtZXNzYWdlIGlzIHJlcGxpZWQtdG8sIHRoaXMgc3RhdHVzIGlzIHJlcG9ydGVkLgorICovCitlbnVtIGkyNDAwbV9tcyB7CisJSTI0MDBNX01TX0RPTkVfT0sgICAgICAgICAgICAgICAgICA9IDAsCisJSTI0MDBNX01TX0RPTkVfSU5fUFJPR1JFU1MgICAgICAgICA9IDEsCisJSTI0MDBNX01TX0lOVkFMSURfT1AgICAgICAgICAgICAgICA9IDIsCisJSTI0MDBNX01TX0JBRF9TVEFURSAgICAgICAgICAgICAgICA9IDMsCisJSTI0MDBNX01TX0lMTEVHQUxfVkFMVUUgICAgICAgICAgICA9IDQsCisJSTI0MDBNX01TX01JU1NJTkdfUEFSQU1TICAgICAgICAgICA9IDUsCisJSTI0MDBNX01TX1ZFUlNJT05fRVJST1IgICAgICAgICAgICA9IDYsCisJSTI0MDBNX01TX0FDQ0VTU0lCSUxJVFlfRVJST1IgICAgICA9IDcsCisJSTI0MDBNX01TX0JVU1kgICAgICAgICAgICAgICAgICAgICA9IDgsCisJSTI0MDBNX01TX0NPUlJVUFRFRF9UTFYgICAgICAgICAgICA9IDksCisJSTI0MDBNX01TX1VOSU5JVElBTElaRUQgICAgICAgICAgICA9IDEwLAorCUkyNDAwTV9NU19VTktOT1dOX0VSUk9SICAgICAgICAgICAgPSAxMSwKKwlJMjQwME1fTVNfUFJPRFVDVElPTl9FUlJPUiAgICAgICAgID0gMTIsCisJSTI0MDBNX01TX05PX1JGICAgICAgICAgICAgICAgICAgICA9IDEzLAorCUkyNDAwTV9NU19OT1RfUkVBRFlfRk9SX1BPV0VSU0FWRSAgPSAxNCwKKwlJMjQwME1fTVNfVEhFUk1BTF9DUklUSUNBTCAgICAgICAgID0gMTUsCisJSTI0MDBNX01TX01BWAorfTsKKworCisvKioKKyAqIGkyNDAwbV90bHYgLSBlbnVtZXJhdGlvbiBvZiB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFRMVnMKKyAqCisgKiBUTFZzIHN0YW5kIGZvciB0eXBlLWxlbmd0aC12YWx1ZSBhbmQgYXJlIHRoZSBoZWFkZXIgZm9yIGEgcGF5bG9hZAorICogY29tcG9zZWQgb2YgYWxtb3N0IGFueXRoaW5nLiBFYWNoIHBheWxvYWQgaGFzIGEgdHlwZSBhc3NpZ25lZAorICogYW5kIGEgbGVuZ3RoLgorICovCitlbnVtIGkyNDAwbV90bHYgeworCUkyNDAwTV9UTFZfTDRfTUVTU0FHRV9WRVJTSU9OUyA9IDEyOSwKKwlJMjQwME1fVExWX1NZU1RFTV9TVEFURSA9IDE0MSwKKwlJMjQwME1fVExWX01FRElBX1NUQVRVUyA9IDE2MSwKKwlJMjQwME1fVExWX1JGX09QRVJBVElPTiA9IDE2MiwKKwlJMjQwME1fVExWX1JGX1NUQVRVUyA9IDE2MywKKwlJMjQwME1fVExWX0RFVklDRV9SRVNFVF9UWVBFID0gMTMyLAorCUkyNDAwTV9UTFZfQ09ORklHX0lETEVfUEFSQU1FVEVSUyA9IDYwMSwKKwlJMjQwME1fVExWX0NPTkZJR19JRExFX1RJTUVPVVQgPSA2MTEsCisJSTI0MDBNX1RMVl9DT05GSUdfRDJIX0RBVEFfRk9STUFUID0gNjE0LAorCUkyNDAwTV9UTFZfQ09ORklHX0RMX0hPU1RfUkVPUkRFUiA9IDYxNSwKK307CisKKworc3RydWN0IGkyNDAwbV90bHZfaGRyIHsKKwlfX2xlMTYgdHlwZTsKKwlfX2xlMTYgbGVuZ3RoOwkJLyogcGF5bG9hZCdzICovCisJX191OCAgIHBsWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyIHsKKwlfX2xlMTYgdHlwZTsKKwlfX2xlMTYgbGVuZ3RoOwkJLyogcGF5bG9hZCdzICovCisJX19sZTE2IHZlcnNpb247CisJX19sZTE2IHJlc3YxOworCV9fbGUxNiBzdGF0dXM7CisJX19sZTE2IHJlc3YyOworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciBwbFswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyoqCisgKiBpMjQwMG1fc3lzdGVtX3N0YXRlIC0gZGlmZmVyZW50IHN0YXRlcyBvZiB0aGUgZGV2aWNlCisgKi8KK2VudW0gaTI0MDBtX3N5c3RlbV9zdGF0ZSB7CisJSTI0MDBNX1NTX1VOSU5JVElBTElaRUQgPSAxLAorCUkyNDAwTV9TU19JTklULAorCUkyNDAwTV9TU19SRUFEWSwKKwlJMjQwME1fU1NfU0NBTiwKKwlJMjQwME1fU1NfU1RBTkRCWSwKKwlJMjQwME1fU1NfQ09OTkVDVElORywKKwlJMjQwME1fU1NfV0lNQVhfQ09OTkVDVEVELAorCUkyNDAwTV9TU19EQVRBX1BBVEhfQ09OTkVDVEVELAorCUkyNDAwTV9TU19JRExFLAorCUkyNDAwTV9TU19ESVNDT05ORUNUSU5HLAorCUkyNDAwTV9TU19PVVRfT0ZfWk9ORSwKKwlJMjQwME1fU1NfU0xFRVBBQ1RJVkUsCisJSTI0MDBNX1NTX1BST0RVQ1RJT04sCisJSTI0MDBNX1NTX0NPTkZJRywKKwlJMjQwME1fU1NfUkZfT0ZGLAorCUkyNDAwTV9TU19SRl9TSFVURE9XTiwKKwlJMjQwME1fU1NfREVWSUNFX0RJU0NPTk5FQ1QsCisJSTI0MDBNX1NTX01BWCwKK307CisKKworLyoqCisgKiBpMjQwMG1fdGx2X3N5c3RlbV9zdGF0ZSAtIHJlcG9ydCBvbiB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbQorICoKKyAqIEBzdGF0ZTogc2VlIGVudW0gaTI0MDBtX3N5c3RlbV9zdGF0ZQorICovCitzdHJ1Y3QgaTI0MDBtX3Rsdl9zeXN0ZW1fc3RhdGUgeworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciBoZHI7CisJX19sZTMyIHN0YXRlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaTI0MDBtX3Rsdl9sNF9tZXNzYWdlX3ZlcnNpb25zIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fbGUxNiBtYWpvcjsKKwlfX2xlMTYgbWlub3I7CisJX19sZTE2IGJyYW5jaDsKKwlfX2xlMTYgcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK3N0cnVjdCBpMjQwMG1fdGx2X2RldGFpbGVkX2RldmljZV9pbmZvIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fdTggcmVzZXJ2ZWQxWzQwMF07CisJX191OCBtYWNfYWRkcmVzc1s2XTsKKwlfX3U4IHJlc2VydmVkMlsyXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworZW51bSBpMjQwMG1fcmZfc3dpdGNoX3N0YXR1cyB7CisJSTI0MDBNX1JGX1NXSVRDSF9PTiA9IDEsCisJSTI0MDBNX1JGX1NXSVRDSF9PRkYgPSAyLAorfTsKKworc3RydWN0IGkyNDAwbV90bHZfcmZfc3dpdGNoZXNfc3RhdHVzIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fdTggc3dfcmZfc3dpdGNoOwkvKiAxIE9OLCAyIE9GRiAqLworCV9fdTggaHdfcmZfc3dpdGNoOwkvKiAxIE9OLCAyIE9GRiAqLworCV9fdTggcmVzZXJ2ZWRbMl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK2VudW0geworCWkyNDAwbV9yZl9vcGVyYXRpb25fb24gPSAxLAorCWkyNDAwbV9yZl9vcGVyYXRpb25fb2ZmID0gMgorfTsKKworc3RydWN0IGkyNDAwbV90bHZfcmZfb3BlcmF0aW9uIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fbGUzMiBzdGF0dXM7CS8qIDEgT04sIDIgT0ZGICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK2VudW0gaTI0MDBtX3Rsdl9yZXNldF90eXBlIHsKKwlJMjQwME1fUkVTRVRfVFlQRV9DT0xEID0gMSwKKwlJMjQwME1fUkVTRVRfVFlQRV9XQVJNCit9OworCitzdHJ1Y3QgaTI0MDBtX3Rsdl9kZXZpY2VfcmVzZXRfdHlwZSB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgcmVzZXRfdHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworc3RydWN0IGkyNDAwbV90bHZfY29uZmlnX2lkbGVfcGFyYW1ldGVycyB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgaWRsZV90aW1lb3V0OwkvKiAxMDAgdG8gMzAwMDAwIG1zIFs1bWluXSwgMTAwIGluY3JlbWVudHMKKwkJCQkgKiAwIGRpc2FibGVkICovCisJX19sZTMyIGlkbGVfcGFnaW5nX2ludGVydmFsOwkvKiBmcmFtZXMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworZW51bSBpMjQwMG1fbWVkaWFfc3RhdHVzIHsKKwlJMjQwME1fTUVESUFfU1RBVFVTX0xJTktfVVAgPSAxLAorCUkyNDAwTV9NRURJQV9TVEFUVVNfTElOS19ET1dOLAorCUkyNDAwTV9NRURJQV9TVEFUVVNfTElOS19SRU5FVywKK307CisKK3N0cnVjdCBpMjQwMG1fdGx2X21lZGlhX3N0YXR1cyB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgbWVkaWFfc3RhdHVzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKiBOZXcgaW4gdjEuNCAqLworc3RydWN0IGkyNDAwbV90bHZfY29uZmlnX2lkbGVfdGltZW91dCB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgdGltZW91dDsJLyogMTAwIHRvIDMwMDAwMCBtcyBbNW1pbl0sIDEwMCBpbmNyZW1lbnRzCisJCQkgKiAwIGRpc2FibGVkICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBOZXcgaW4gdjEuNCAtLSBmb3IgYmFja3dhcmQgY29tcGF0LCB3aWxsIGJlIHJlbW92ZWQgKi8KK3N0cnVjdCBpMjQwMG1fdGx2X2NvbmZpZ19kMmhfZGF0YV9mb3JtYXQgeworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciBoZHI7CisJX191OCBmb3JtYXQ7IAkJLyogMCBvbGQgZm9ybWF0LCAxIGVuaGFuY2VkICovCisJX191OCByZXNlcnZlZFszXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIE5ldyBpbiB2MS40ICovCitzdHJ1Y3QgaTI0MDBtX3Rsdl9jb25maWdfZGxfaG9zdF9yZW9yZGVyIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fdTggcmVvcmRlcjsgCQkvKiAwIGRpc2FibGVkLCAxIGVuYWJsZWQgKi8KKwlfX3U4IHJlc2VydmVkWzNdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisjZW5kaWYgLyogI2lmbmRlZiBfX0xJTlVYX19XSU1BWF9fSTI0MDBNX0hfXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93aXJlbGVzcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93aXJlbGVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNjQyNmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dpcmVsZXNzLmgKQEAgLTAsMCArMSwxMTI4IEBACisvKgorICogVGhpcyBmaWxlIGRlZmluZSBhIHNldCBvZiBzdGFuZGFyZCB3aXJlbGVzcyBleHRlbnNpb25zCisgKgorICogVmVyc2lvbiA6CTIyCTE2LjMuMDcKKyAqCisgKiBBdXRob3JzIDoJSmVhbiBUb3VycmlsaGVzIC0gSFBMIC0gPGp0QGhwbC5ocC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNyBKZWFuIFRvdXJyaWxoZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKworI2lmbmRlZiBfTElOVVhfV0lSRUxFU1NfSAorI2RlZmluZSBfTElOVVhfV0lSRUxFU1NfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRE9DVU1FTlRBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBJbml0aWFsIEFQSXMgKDE5OTYgLT4gb253YXJkKSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQmFzaWNhbGx5LCB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyBhcmUgZm9yIG5vdyBhIHNldCBvZiBzdGFuZGFyZCBpb2N0bAorICogY2FsbCArIC9wcm9jL25ldC93aXJlbGVzcworICoKKyAqIFRoZSBlbnRyeSAvcHJvYy9uZXQvd2lyZWxlc3MgZ2l2ZSBzdGF0aXN0aWNzIGFuZCBpbmZvcm1hdGlvbiBvbiB0aGUKKyAqIGRyaXZlci4KKyAqIFRoaXMgaXMgYmV0dGVyIHRoYW4gaGF2aW5nIGVhY2ggZHJpdmVyIGhhdmluZyBpdHMgZW50cnkgYmVjYXVzZQorICogaXRzIGNlbnRyYWxpc2VkIGFuZCB3ZSBtYXkgcmVtb3ZlIHRoZSBkcml2ZXIgbW9kdWxlIHNhZmVseS4KKyAqCisgKiBJb2N0bCBhcmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGRyaXZlciBhbmQgaXNzdWUgY29tbWFuZHMuICBUaGlzIGlzCisgKiBiZXR0ZXIgdGhhbiBjb21tYW5kIGxpbmUgb3B0aW9ucyBvZiBpbnNtb2QgYmVjYXVzZSB3ZSBtYXkgd2FudCB0bworICogY2hhbmdlIGR5bmFtaWNhbGx5ICh3aGlsZSB0aGUgZHJpdmVyIGlzIHJ1bm5pbmcpIHNvbWUgcGFyYW1ldGVycy4KKyAqCisgKiBUaGUgaW9jdGwgbWVjaGFuaW1zbSBhcmUgY29waWVkIGZyb20gc3RhbmRhcmQgZGV2aWNlcyBpb2N0bC4KKyAqIFdlIGhhdmUgdGhlIGxpc3Qgb2YgY29tbWFuZCBwbHVzIGEgc3RydWN0dXJlIGRlc2NpYmluZyB0aGUKKyAqIGRhdGEgZXhjaGFuZ2VkLi4uCisgKiBOb3RlIHRoYXQgdG8gYWRkIHRoZXNlIGlvY3RsLCBJIHdhcyBvYmxpZ2VkIHRvIG1vZGlmeSA6CisgKgkjIG5ldC9jb3JlL2Rldi5jICh0d28gcGxhY2UgKyBhZGQgaW5jbHVkZSkKKyAqCSMgbmV0L2lwdjQvYWZfaW5ldC5jIChvbmUgcGxhY2UgKyBhZGQgaW5jbHVkZSkKKyAqCisgKiAvcHJvYy9uZXQvd2lyZWxlc3MgaXMgYSBjb3B5IG9mIC9wcm9jL25ldC9kZXYuCisgKiBXZSBoYXZlIGEgc3RydWN0dXJlIGZvciBkYXRhIHBhc3NlZCBmcm9tIHRoZSBkcml2ZXIgdG8gL3Byb2MvbmV0L3dpcmVsZXNzCisgKiBUb28gYWRkIHRoaXMsIEkndmUgbW9kaWZpZWQgOgorICoJIyBuZXQvY29yZS9kZXYuYyAodHdvIG90aGVyIHBsYWNlcykKKyAqCSMgaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCAob25lIHBsYWNlKQorICoJIyBpbmNsdWRlL2xpbnV4L3Byb2NfZnMuaCAob25lIHBsYWNlKQorICoKKyAqIE5ldyBkcml2ZXIgQVBJICgyMDAyIC0+IG9ud2FyZCkgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBmaWxlIGlzIG9ubHkgY29uY2VybmVkIHdpdGggdGhlIHVzZXIgc3BhY2UgQVBJIGFuZCBjb21tb24gZGVmaW5pdGlvbnMuCisgKiBUaGUgbmV3IGRyaXZlciBBUEkgaXMgZGVmaW5lZCBhbmQgZG9jdW1lbnRlZCBpbiA6CisgKgkjIGluY2x1ZGUvbmV0L2l3X2hhbmRsZXIuaAorICoKKyAqIE5vdGUgYXMgd2VsbCB0aGF0IC9wcm9jL25ldC93aXJlbGVzcyBpbXBsZW1lbnRhdGlvbiBoYXMgbm93IG1vdmVkIGluIDoKKyAqCSMgbmV0L2NvcmUvd2lyZWxlc3MuYworICoKKyAqIFdpcmVsZXNzIEV2ZW50cyAoMjAwMiAtPiBvbndhcmQpIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFdmVudHMgYXJlIGRlZmluZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUsIGFuZCBpbXBsZW1lbnRlZCBpbiA6CisgKgkjIG5ldC9jb3JlL3dpcmVsZXNzLmMKKyAqCisgKiBPdGhlciBjb21tZW50cyA6CisgKiAtLS0tLS0tLS0tLS0tLQorICogRG8gbm90IGFkZCBoZXJlIHRoaW5ncyB0aGF0IGFyZSByZWR1bmRhbnQgd2l0aCBvdGhlciBtZWNoYW5pc21zCisgKiAoZHJpdmVycyBpbml0LCBpZmNvbmZpZywgL3Byb2MvbmV0L2RldiwgLi4uKSBhbmQgd2l0aCBhcmUgbm90CisgKiB3aXJlbGVzcyBzcGVjaWZpYy4KKyAqCisgKiBUaGVzZSB3aXJlbGVzcyBleHRlbnNpb25zIGFyZSBub3QgbWFnaWMgOiBlYWNoIGRyaXZlciBoYXMgdG8gcHJvdmlkZQorICogc3VwcG9ydCBmb3IgdGhlbS4uLgorICoKKyAqIElNUE9SVEFOVCBOT1RFIDogQXMgZXZlcnl0aGluZyBpbiB0aGUga2VybmVsLCB0aGlzIGlzIHZlcnkgbXVjaCBhCisgKiB3b3JrIGluIHByb2dyZXNzLiBDb250YWN0IG1lIGlmIHlvdSBoYXZlIGlkZWFzIG9mIGltcHJvdmVtZW50cy4uLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CQkvKiBmb3IgX191KiBhbmQgX19zKiB0eXBlZGVmcyAqLworI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgkJLyogZm9yICJzdHJ1Y3Qgc29ja2FkZHIiIGV0IGFsCSovCisjaW5jbHVkZSA8bGludXgvaWYuaD4JCQkvKiBmb3IgSUZOQU1TSVogYW5kIGNvLi4uICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBWRVJTSU9OICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoaXMgY29uc3RhbnQgaXMgdXNlZCB0byBrbm93IHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIHdpcmVsZXNzCisgKiBleHRlbnNpb25zIGFuZCB0byBrbm93IHdoaWNoIHZlcnNpb24gb2Ygd2lyZWxlc3MgZXh0ZW5zaW9ucyBpdCBpcworICogKHRoZXJlIGlzIHNvbWUgc3R1ZmYgdGhhdCB3aWxsIGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuLi4pCisgKiBJIGp1c3QgcGxhbiB0byBpbmNyZW1lbnQgd2l0aCBlYWNoIG5ldyB2ZXJzaW9uLgorICovCisjZGVmaW5lIFdJUkVMRVNTX0VYVAkyMgorCisvKgorICogQ2hhbmdlcyA6CisgKgorICogVjIgdG8gVjMKKyAqIC0tLS0tLS0tCisgKglBbGFuIENveCBzdGFydCBzb21lIGluY29tcGF0aWJsZXMgY2hhbmdlcy4gSSd2ZSBpbnRlZ3JhdGVkIGEgYml0IG1vcmUuCisgKgktIEVuY3J5cHRpb24gcmVuYW1lZCB0byBFbmNvZGUgdG8gYXZvaWQgVVMgcmVndWxhdGlvbiBwcm9ibGVtcworICoJLSBGcmVxdWVuY3kgY2hhbmdlZCBmcm9tIGZsb2F0IHRvIHN0cnVjdCB0byBhdm9pZCBwcm9ibGVtcyBvbiBvbGQgMzg2CisgKgorICogVjMgdG8gVjQKKyAqIC0tLS0tLS0tCisgKgktIEFkZCBzZW5zaXRpdml0eQorICoKKyAqIFY0IHRvIFY1CisgKiAtLS0tLS0tLQorICoJLSBNaXNzaW5nIGVuY29kaW5nIGRlZmluaXRpb25zIGluIHJhbmdlCisgKgktIEFjY2VzcyBwb2ludHMgc3R1ZmYKKyAqCisgKiBWNSB0byBWNgorICogLS0tLS0tLS0KKyAqCS0gODAyLjExIHN1cHBvcnQgKEVTU0lEIGlvY3RscykKKyAqCisgKiBWNiB0byBWNworICogLS0tLS0tLS0KKyAqCS0gZGVmaW5lIElXX0VTU0lEX01BWF9TSVpFIGFuZCBJV19NQVhfQVAKKyAqCisgKiBWNyB0byBWOAorICogLS0tLS0tLS0KKyAqCS0gQ2hhbmdlZCBteSBlLW1haWwgYWRkcmVzcworICoJLSBNb3JlIDgwMi4xMSBzdXBwb3J0IChuaWNrbmFtZSwgcmF0ZSwgcnRzLCBmcmFnKQorICoJLSBMaXN0IGluZGV4IGluIGZyZXF1ZW5jaWVzCisgKgorICogVjggdG8gVjkKKyAqIC0tLS0tLS0tCisgKgktIFN1cHBvcnQgZm9yICdtb2RlIG9mIG9wZXJhdGlvbicgKGFkLWhvYywgbWFuYWdlZC4uLikKKyAqCS0gU3VwcG9ydCBmb3IgdW5pY2FzdCBhbmQgbXVsdGljYXN0IHBvd2VyIHNhdmluZworICoJLSBDaGFuZ2UgZW5jb2RpbmcgdG8gc3VwcG9ydCBsYXJnZXIgdG9rZW5zICg+NjQgYml0cykKKyAqCS0gVXBkYXRlZCBpd19wYXJhbXMgKGRpc2FibGUsIGZsYWdzKSBhbmQgdXNlIGl0IGZvciBOV0lECisgKgktIEV4dHJhY3RlZCBpd19wb2ludCBmcm9tIGl3cmVxIGZvciBjbGFyaXR5CisgKgorICogVjkgdG8gVjEwCisgKiAtLS0tLS0tLS0KKyAqCS0gQWRkIFBNIGNhcGFiaWxpdHkgdG8gcmFuZ2Ugc3RydWN0dXJlCisgKgktIEFkZCBQTSBtb2RpZmllciA6IE1BWC9NSU4vUkVMQVRJVkUKKyAqCS0gQWRkIGVuY29kaW5nIG9wdGlvbiA6IElXX0VOQ09ERV9OT0tFWQorICoJLSBBZGQgVHhQb3dlciBpb2N0bHMgKHdvcmsgbGlrZSBUeFJhdGUpCisgKgorICogVjEwIHRvIFYxMQorICogLS0tLS0tLS0tLQorICoJLSBBZGQgV0UgdmVyc2lvbiBpbiByYW5nZSAoaGVscCBiYWNrd2FyZC9mb3J3YXJkIGNvbXBhdGliaWxpdHkpCisgKgktIEFkZCByZXRyeSBpb2N0bHMgKHdvcmsgbGlrZSBQTSkKKyAqCisgKiBWMTEgdG8gVjEyCisgKiAtLS0tLS0tLS0tCisgKgktIEFkZCBTSU9DU0lXU1RBVFMgdG8gZ2V0IC9wcm9jL25ldC93aXJlbGVzcyBwcm9ncmFtYXRpY2FsbHkKKyAqCS0gQWRkIERFViBQUklWQVRFIElPQ1RMIHRvIGF2b2lkIGNvbGxpc2lvbnMgaW4gU0lPQ0RFVlBSSVZBVEUgc3BhY2UKKyAqCS0gQWRkIG5ldyBzdGF0aXN0aWNzIChmcmFnLCByZXRyeSwgYmVhY29uKQorICoJLSBBZGQgYXZlcmFnZSBxdWFsaXR5IChmb3IgdXNlciBzcGFjZSBjYWxpYnJhdGlvbikKKyAqCisgKiBWMTIgdG8gVjEzCisgKiAtLS0tLS0tLS0tCisgKgktIERvY3VtZW50IGNyZWF0aW9uIG9mIG5ldyBkcml2ZXIgQVBJLgorICoJLSBFeHRyYWN0IHVuaW9uIGl3cmVxX2RhdGEgZnJvbSBzdHJ1Y3QgaXdyZXEgKGZvciBuZXcgZHJpdmVyIEFQSSkuCisgKgktIFJlbmFtZSBTSU9DU0lXTkFNRSBhcyBTSU9DU0lXQ09NTUlUCisgKgorICogVjEzIHRvIFYxNAorICogLS0tLS0tLS0tLQorICoJLSBXaXJlbGVzcyBFdmVudHMgc3VwcG9ydCA6IGRlZmluZSBzdHJ1Y3QgaXdfZXZlbnQKKyAqCS0gRGVmaW5lIGFkZGl0aW9uYWwgc3BlY2lmaWMgZXZlbnQgbnVtYmVycworICoJLSBBZGQgImFkZHIiIGFuZCAicGFyYW0iIGZpZWxkcyBpbiB1bmlvbiBpd3JlcV9kYXRhCisgKgktIEFQIHNjYW5uaW5nIHN0dWZmIChTSU9DU0lXU0NBTiBhbmQgZnJpZW5kcykKKyAqCisgKiBWMTQgdG8gVjE1CisgKiAtLS0tLS0tLS0tCisgKgktIEFkZCBJV19QUklWX1RZUEVfQUREUiBmb3Igc3RydWN0IHNvY2thZGRyIHByaXZhdGUgYXJnCisgKgktIE1ha2Ugc3RydWN0IGl3X2ZyZXEgc2lnbmVkIChib3RoIG0gJiBlKSwgYWRkIGV4cGxpY2l0IHBhZGRpbmcKKyAqCS0gQWRkIElXRVZDVVNUT00gZm9yIGRyaXZlciBzcGVjaWZpYyBldmVudC9zY2FubmluZyB0b2tlbgorICoJLSBBZGQgSVdfTUFYX0dFVF9TUFkgZm9yIGRyaXZlciByZXR1cm5pbmcgYSBsb3Qgb2YgYWRkcmVzc2VzCisgKgktIEFkZCBJV19UWFBPV19SQU5HRSBmb3IgcmFuZ2Ugb2YgVHggUG93ZXJzCisgKgktIEFkZCBJV0VWUkVHSVNURVJFRCAmIElXRVZFWFBJUkVEIGV2ZW50cyBmb3IgQWNjZXNzIFBvaW50cworICoJLSBBZGQgSVdfTU9ERV9NT05JVE9SIGZvciBwYXNzaXZlIG1vbml0b3IKKyAqCisgKiBWMTUgdG8gVjE2CisgKiAtLS0tLS0tLS0tCisgKgktIEluY3JlYXNlIHRoZSBudW1iZXIgb2YgYml0cmF0ZXMgaW4gaXdfcmFuZ2UgdG8gMzIgKGZvciA4MDIuMTFnKQorICoJLSBJbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGZyZXF1ZW5jaWVzIGluIGl3X3JhbmdlIHRvIDMyIChmb3IgODAyLjExYithKQorICoJLSBSZXNodWZmbGUgc3RydWN0IGl3X3JhbmdlIGZvciBpbmNyZWFzZXMsIGFkZCBmaWxsZXIKKyAqCS0gSW5jcmVhc2UgSVdfTUFYX0FQIHRvIDY0IGZvciBkcml2ZXIgcmV0dXJuaW5nIGEgbG90IG9mIGFkZHJlc3NlcworICoJLSBSZW1vdmUgSVdfTUFYX0dFVF9TUFkgYmVjYXVzZSBjb25mbGljdCB3aXRoIGVuaGFuY2VkIHNweSBzdXBwb3J0CisgKgktIEFkZCBTSU9DU0lXVEhSU1BZL1NJT0NHSVdUSFJTUFkgYW5kICJzdHJ1Y3QgaXdfdGhyc3B5IgorICoJLSBBZGQgSVdfRU5DT0RFX1RFTVAgYW5kIGl3X3JhbmdlLT5lbmNvZGluZ19sb2dpbl9pbmRleAorICoKKyAqIFYxNiB0byBWMTcKKyAqIC0tLS0tLS0tLS0KKyAqCS0gQWRkIGZsYWdzIHRvIGZyZXF1ZW5jeSAtPiBhdXRvL2ZpeGVkCisgKgktIERvY3VtZW50IChzdHJ1Y3QgaXdfcXVhbGl0eSAqKS0+dXBkYXRlZCwgYWRkIG5ldyBmbGFncyAoSU5WQUxJRCkKKyAqCS0gV2lyZWxlc3MgRXZlbnQgY2FwYWJpbGl0eSBpbiBzdHJ1Y3QgaXdfcmFuZ2UKKyAqCS0gQWRkIHN1cHBvcnQgZm9yIHJlbGF0aXZlIFR4UG93ZXIgKHlpY2sgISkKKyAqCisgKiBWMTcgdG8gVjE4IChGcm9tIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+KQorICogLS0tLS0tLS0tLQorICoJLSBBZGQgc3VwcG9ydCBmb3IgV1BBL1dQQTIKKyAqCS0gQWRkIGV4dGVuZGVkIGVuY29kaW5nIGNvbmZpZ3VyYXRpb24gKFNJT0NTSVdFTkNPREVFWFQgYW5kCisgKgkgIFNJT0NHSVdFTkNPREVFWFQpCisgKgktIEFkZCBTSU9DU0lXR0VOSUUvU0lPQ0dJV0dFTklFCisgKgktIEFkZCBTSU9DU0lXTUxNRQorICoJLSBBZGQgU0lPQ1NJV1BNS1NBCisgKgktIEFkZCBzdHJ1Y3QgaXdfcmFuZ2UgYml0IGZpZWxkIGZvciBzdXBwb3J0ZWQgZW5jb2RpbmcgY2FwYWJpbGl0aWVzCisgKgktIEFkZCBvcHRpb25hbCBzY2FuIHJlcXVlc3QgcGFyYW1ldGVycyBmb3IgU0lPQ1NJV1NDQU4KKyAqCS0gQWRkIFNJT0NTSVdBVVRIL1NJT0NHSVdBVVRIIGZvciBzZXR0aW5nIGF1dGhlbnRpY2F0aW9uIGFuZCBXUEEKKyAqCSAgcmVsYXRlZCBwYXJhbWV0ZXJzIChleHRlbnNpYmxlIHVwIHRvIDQwOTYgcGFyYW1ldGVyIHZhbHVlcykKKyAqCS0gQWRkIHdpcmVsZXNzIGV2ZW50czogSVdFVkdFTklFLCBJV0VWTUlDSEFFTE1JQ0ZBSUxVUkUsCisgKgkgIElXRVZBU1NPQ1JFUUlFLCBJV0VWQVNTT0NSRVNQSUUsIElXRVZQTUtJRENBTkQKKyAqCisgKiBWMTggdG8gVjE5CisgKiAtLS0tLS0tLS0tCisgKgktIFJlbW92ZSAoc3RydWN0IGl3X3BvaW50ICopLT5wb2ludGVyIGZyb20gZXZlbnRzIGFuZCBzdHJlYW1zCisgKgktIFJlbW92ZSBoZWFkZXIgaW5jbHVkZXMgdG8gaGVscCB1c2VyIHNwYWNlCisgKgktIEluY3JlYXNlIElXX0VOQ09ESU5HX1RPS0VOX01BWCBmcm9tIDMyIHRvIDY0CisgKgktIEFkZCBJV19RVUFMX0FMTF9VUERBVEVEIGFuZCBJV19RVUFMX0FMTF9JTlZBTElEIG1hY3JvcworICoJLSBBZGQgZXhwbGljaXQgZmxhZyB0byB0ZWxsIHN0YXRzIGFyZSBpbiBkQm0gOiBJV19RVUFMX0RCTQorICoJLSBBZGQgSVdfSU9DVExfSURYKCkgYW5kIElXX0VWRU5UX0lEWCgpIG1hY3JvcworICoKKyAqIFYxOSB0byBWMjAKKyAqIC0tLS0tLS0tLS0KKyAqCS0gUnROZXRsaW5rIHJlcXVlc3RzIHN1cHBvcnQgKFNFVC9HRVQpCisgKgorICogVjIwIHRvIFYyMQorICogLS0tLS0tLS0tLQorICoJLSBSZW1vdmUgKHN0cnVjdCBuZXRfZGV2aWNlICopLT5nZXRfd2lyZWxlc3Nfc3RhdHMoKQorICoJLSBDaGFuZ2UgbGVuZ3RoIGluIEVTU0lEIGFuZCBOSUNLIHRvIHN0cmxlbigpIGluc3RlYWQgb2Ygc3RybGVuKCkrMQorICoJLSBBZGQgSVdfUkVUUllfU0hPUlQvSVdfUkVUUllfTE9ORyByZXRyeSBtb2RpZmllcnMKKyAqCS0gUG93ZXIvUmV0cnkgcmVsYXRpdmUgdmFsdWVzIG5vIGxvbmdlciAqIDEwMDAwMAorICoJLSBBZGQgZXhwbGljaXQgZmxhZyB0byB0ZWxsIHN0YXRzIGFyZSBpbiA4MDIuMTFrIFJDUEkgOiBJV19RVUFMX1JDUEkKKyAqCisgKiBWMjEgdG8gVjIyCisgKiAtLS0tLS0tLS0tCisgKgktIFByZXZlbnQgbGVha2luZyBvZiBrZXJuZWwgc3BhY2UgaW4gc3RyZWFtIG9uIDY0IGJpdHMuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09OU1RBTlRTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElPQ1RMIExJU1QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogV2lyZWxlc3MgSWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUgU0lPQ1NJV0NPTU1JVAkweDhCMDAJCS8qIENvbW1pdCBwZW5kaW5nIGNoYW5nZXMgdG8gZHJpdmVyICovCisjZGVmaW5lIFNJT0NHSVdOQU1FCTB4OEIwMQkJLyogZ2V0IG5hbWUgPT0gd2lyZWxlc3MgcHJvdG9jb2wgKi8KKy8qIFNJT0NHSVdOQU1FIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSBwcmVzZW5jZSBvZiBXaXJlbGVzcyBFeHRlbnNpb25zLgorICogQ29tbW9uIHZhbHVlcyA6ICJJRUVFIDgwMi4xMS1EUyIsICJJRUVFIDgwMi4xMS1GSCIsICJJRUVFIDgwMi4xMWIiLi4uCisgKiBEb24ndCBwdXQgdGhlIG5hbWUgb2YgeW91ciBkcml2ZXIgdGhlcmUsIGl0J3MgdXNlbGVzcy4gKi8KKworLyogQmFzaWMgb3BlcmF0aW9ucyAqLworI2RlZmluZSBTSU9DU0lXTldJRAkweDhCMDIJCS8qIHNldCBuZXR3b3JrIGlkIChwcmUtODAyLjExKSAqLworI2RlZmluZSBTSU9DR0lXTldJRAkweDhCMDMJCS8qIGdldCBuZXR3b3JrIGlkICh0aGUgY2VsbCkgKi8KKyNkZWZpbmUgU0lPQ1NJV0ZSRVEJMHg4QjA0CQkvKiBzZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KSAqLworI2RlZmluZSBTSU9DR0lXRlJFUQkweDhCMDUJCS8qIGdldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopICovCisjZGVmaW5lIFNJT0NTSVdNT0RFCTB4OEIwNgkJLyogc2V0IG9wZXJhdGlvbiBtb2RlICovCisjZGVmaW5lIFNJT0NHSVdNT0RFCTB4OEIwNwkJLyogZ2V0IG9wZXJhdGlvbiBtb2RlICovCisjZGVmaW5lIFNJT0NTSVdTRU5TCTB4OEIwOAkJLyogc2V0IHNlbnNpdGl2aXR5IChkQm0pICovCisjZGVmaW5lIFNJT0NHSVdTRU5TCTB4OEIwOQkJLyogZ2V0IHNlbnNpdGl2aXR5IChkQm0pICovCisKKy8qIEluZm9ybWF0aXZlIHN0dWZmICovCisjZGVmaW5lIFNJT0NTSVdSQU5HRQkweDhCMEEJCS8qIFVudXNlZCAqLworI2RlZmluZSBTSU9DR0lXUkFOR0UJMHg4QjBCCQkvKiBHZXQgcmFuZ2Ugb2YgcGFyYW1ldGVycyAqLworI2RlZmluZSBTSU9DU0lXUFJJVgkweDhCMEMJCS8qIFVudXNlZCAqLworI2RlZmluZSBTSU9DR0lXUFJJVgkweDhCMEQJCS8qIGdldCBwcml2YXRlIGlvY3RsIGludGVyZmFjZSBpbmZvICovCisjZGVmaW5lIFNJT0NTSVdTVEFUUwkweDhCMEUJCS8qIFVudXNlZCAqLworI2RlZmluZSBTSU9DR0lXU1RBVFMJMHg4QjBGCQkvKiBHZXQgL3Byb2MvbmV0L3dpcmVsZXNzIHN0YXRzICovCisvKiBTSU9DR0lXU1RBVFMgaXMgc3RyaWN0bHkgdXNlZCBiZXR3ZWVuIHVzZXIgc3BhY2UgYW5kIHRoZSBrZXJuZWwsIGFuZAorICogaXMgbmV2ZXIgcGFzc2VkIHRvIHRoZSBkcml2ZXIgKGkuZS4gdGhlIGRyaXZlciB3aWxsIG5ldmVyIHNlZSBpdCkuICovCisKKy8qIFNweSBzdXBwb3J0IChzdGF0aXN0aWNzIHBlciBNQUMgYWRkcmVzcyAtIHVzZWQgZm9yIE1vYmlsZSBJUCBzdXBwb3J0KSAqLworI2RlZmluZSBTSU9DU0lXU1BZCTB4OEIxMAkJLyogc2V0IHNweSBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU0lPQ0dJV1NQWQkweDhCMTEJCS8qIGdldCBzcHkgaW5mbyAocXVhbGl0eSBvZiBsaW5rKSAqLworI2RlZmluZSBTSU9DU0lXVEhSU1BZCTB4OEIxMgkJLyogc2V0IHNweSB0aHJlc2hvbGQgKHNweSBldmVudCkgKi8KKyNkZWZpbmUgU0lPQ0dJV1RIUlNQWQkweDhCMTMJCS8qIGdldCBzcHkgdGhyZXNob2xkICovCisKKy8qIEFjY2VzcyBQb2ludCBtYW5pcHVsYXRpb24gKi8KKyNkZWZpbmUgU0lPQ1NJV0FQCTB4OEIxNAkJLyogc2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzICovCisjZGVmaW5lIFNJT0NHSVdBUAkweDhCMTUJCS8qIGdldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcyAqLworI2RlZmluZSBTSU9DR0lXQVBMSVNUCTB4OEIxNwkJLyogRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBzY2FubmluZyAqLworI2RlZmluZSBTSU9DU0lXU0NBTgkweDhCMTgJCS8qIHRyaWdnZXIgc2Nhbm5pbmcgKGxpc3QgY2VsbHMpICovCisjZGVmaW5lIFNJT0NHSVdTQ0FOCTB4OEIxOQkJLyogZ2V0IHNjYW5uaW5nIHJlc3VsdHMgKi8KKworLyogODAyLjExIHNwZWNpZmljIHN1cHBvcnQgKi8KKyNkZWZpbmUgU0lPQ1NJV0VTU0lECTB4OEIxQQkJLyogc2V0IEVTU0lEIChuZXR3b3JrIG5hbWUpICovCisjZGVmaW5lIFNJT0NHSVdFU1NJRAkweDhCMUIJCS8qIGdldCBFU1NJRCAqLworI2RlZmluZSBTSU9DU0lXTklDS04JMHg4QjFDCQkvKiBzZXQgbm9kZSBuYW1lL25pY2tuYW1lICovCisjZGVmaW5lIFNJT0NHSVdOSUNLTgkweDhCMUQJCS8qIGdldCBub2RlIG5hbWUvbmlja25hbWUgKi8KKy8qIEFzIHRoZSBFU1NJRCBhbmQgTklDS04gYXJlIHN0cmluZ3MgdXAgdG8gMzIgYnl0ZXMgbG9uZywgaXQgZG9lc24ndCBmaXQKKyAqIHdpdGhpbiB0aGUgJ2l3cmVxJyBzdHJ1Y3R1cmUsIHNvIHdlIG5lZWQgdG8gdXNlIHRoZSAnZGF0YScgbWVtYmVyIHRvCisgKiBwb2ludCB0byBhIHN0cmluZyBpbiB1c2VyIHNwYWNlLCBsaWtlIGl0IGlzIGRvbmUgZm9yIFJBTkdFLi4uICovCisKKy8qIE90aGVyIHBhcmFtZXRlcnMgdXNlZnVsIGluIDgwMi4xMSBhbmQgc29tZSBvdGhlciBkZXZpY2VzICovCisjZGVmaW5lIFNJT0NTSVdSQVRFCTB4OEIyMAkJLyogc2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykgKi8KKyNkZWZpbmUgU0lPQ0dJV1JBVEUJMHg4QjIxCQkvKiBnZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKSAqLworI2RlZmluZSBTSU9DU0lXUlRTCTB4OEIyMgkJLyogc2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykgKi8KKyNkZWZpbmUgU0lPQ0dJV1JUUwkweDhCMjMJCS8qIGdldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpICovCisjZGVmaW5lIFNJT0NTSVdGUkFHCTB4OEIyNAkJLyogc2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykgKi8KKyNkZWZpbmUgU0lPQ0dJV0ZSQUcJMHg4QjI1CQkvKiBnZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKSAqLworI2RlZmluZSBTSU9DU0lXVFhQT1cJMHg4QjI2CQkvKiBzZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkgKi8KKyNkZWZpbmUgU0lPQ0dJV1RYUE9XCTB4OEIyNwkJLyogZ2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pICovCisjZGVmaW5lIFNJT0NTSVdSRVRSWQkweDhCMjgJCS8qIHNldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lICovCisjZGVmaW5lIFNJT0NHSVdSRVRSWQkweDhCMjkJCS8qIGdldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lICovCisKKy8qIEVuY29kaW5nIHN0dWZmIChzY3JhbWJsaW5nLCBoYXJkd2FyZSBzZWN1cml0eSwgV0VQLi4uKSAqLworI2RlZmluZSBTSU9DU0lXRU5DT0RFCTB4OEIyQQkJLyogc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLworI2RlZmluZSBTSU9DR0lXRU5DT0RFCTB4OEIyQgkJLyogZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLworLyogUG93ZXIgc2F2aW5nIHN0dWZmIChwb3dlciBtYW5hZ2VtZW50LCB1bmljYXN0IGFuZCBtdWx0aWNhc3QpICovCisjZGVmaW5lIFNJT0NTSVdQT1dFUgkweDhCMkMJCS8qIHNldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzICovCisjZGVmaW5lIFNJT0NHSVdQT1dFUgkweDhCMkQJCS8qIGdldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzICovCisKKy8qIFdQQSA6IEdlbmVyaWMgSUVFRSA4MDIuMTEgaW5mb3JtYXRpb20gZWxlbWVudCAoZS5nLiwgZm9yIFdQQS9SU04vV01NKS4KKyAqIFRoaXMgaW9jdGwgdXNlcyBzdHJ1Y3QgaXdfcG9pbnQgYW5kIGRhdGEgYnVmZmVyIHRoYXQgaW5jbHVkZXMgSUUgaWQgYW5kIGxlbgorICogZmllbGRzLiBNb3JlIHRoYW4gb25lIElFIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgcmVxdWVzdC4gU2V0dGluZyB0aGUgZ2VuZXJpYworICogSUUgdG8gZW1wdHkgYnVmZmVyIChsZW49MCkgcmVtb3ZlcyB0aGUgZ2VuZXJpYyBJRSBmcm9tIHRoZSBkcml2ZXIuIERyaXZlcnMKKyAqIGFyZSBhbGxvd2VkIHRvIGdlbmVyYXRlIHRoZWlyIG93biBXUEEvUlNOIElFcywgYnV0IGluIHRoZXNlIGNhc2VzLCBkcml2ZXJzCisgKiBhcmUgcmVxdWlyZWQgdG8gcmVwb3J0IHRoZSB1c2VkIElFIGFzIGEgd2lyZWxlc3MgZXZlbnQsIGUuZy4sIHdoZW4KKyAqIGFzc29jaWF0aW5nIHdpdGggYW4gQVAuICovCisjZGVmaW5lIFNJT0NTSVdHRU5JRQkweDhCMzAJCS8qIHNldCBnZW5lcmljIElFICovCisjZGVmaW5lIFNJT0NHSVdHRU5JRQkweDhCMzEJCS8qIGdldCBnZW5lcmljIElFICovCisKKy8qIFdQQSA6IElFRUUgODAyLjExIE1MTUUgcmVxdWVzdHMgKi8KKyNkZWZpbmUgU0lPQ1NJV01MTUUJMHg4QjE2CQkvKiByZXF1ZXN0IE1MTUUgb3BlcmF0aW9uOyB1c2VzCisJCQkJCSAqIHN0cnVjdCBpd19tbG1lICovCisvKiBXUEEgOiBBdXRoZW50aWNhdGlvbiBtb2RlIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgU0lPQ1NJV0FVVEgJMHg4QjMyCQkvKiBzZXQgYXV0aGVudGljYXRpb24gbW9kZSBwYXJhbXMgKi8KKyNkZWZpbmUgU0lPQ0dJV0FVVEgJMHg4QjMzCQkvKiBnZXQgYXV0aGVudGljYXRpb24gbW9kZSBwYXJhbXMgKi8KKworLyogV1BBIDogRXh0ZW5kZWQgdmVyc2lvbiBvZiBlbmNvZGluZyBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFNJT0NTSVdFTkNPREVFWFQgMHg4QjM0CQkvKiBzZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlICovCisjZGVmaW5lIFNJT0NHSVdFTkNPREVFWFQgMHg4QjM1CQkvKiBnZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlICovCisKKy8qIFdQQTIgOiBQTUtTQSBjYWNoZSBtYW5hZ2VtZW50ICovCisjZGVmaW5lIFNJT0NTSVdQTUtTQQkweDhCMzYJCS8qIFBNS1NBIGNhY2hlIG9wZXJhdGlvbiAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBERVYgUFJJVkFURSBJT0NUTCBMSVNUIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoZXNlIDMyIGlvY3RsIGFyZSB3aXJlbGVzcyBkZXZpY2UgcHJpdmF0ZSwgZm9yIDE2IGNvbW1hbmRzLgorICogRWFjaCBkcml2ZXIgaXMgZnJlZSB0byB1c2UgdGhlbSBmb3Igd2hhdGV2ZXIgcHVycG9zZSBpdCBjaG9vc2VzLAorICogaG93ZXZlciB0aGUgZHJpdmVyICptdXN0KiBleHBvcnQgdGhlIGRlc2NyaXB0aW9uIG9mIHRob3NlIGlvY3RscworICogd2l0aCBTSU9DR0lXUFJJViBhbmQgKm11c3QqIHVzZSBhcmd1bWVudHMgYXMgZGVmaW5lZCBiZWxvdy4KKyAqIElmIHlvdSBkb24ndCBmb2xsb3cgdGhvc2UgcnVsZXMsIERhdmVNIGlzIGdvaW5nIHRvIGhhdGUgeW91IChyZWFzb24gOgorICogaXQgbWFrZSBtaXhlZCAzMi82NGJpdCBvcGVyYXRpb24gaW1wb3NzaWJsZSkuCisgKi8KKyNkZWZpbmUgU0lPQ0lXRklSU1RQUklWCTB4OEJFMAorI2RlZmluZSBTSU9DSVdMQVNUUFJJVgkweDhCRkYKKy8qIFByZXZpb3VzbHksIHdlIHdlcmUgdXNpbmcgU0lPQ0RFVlBSSVZBVEUsIGJ1dCB3ZSBub3cgaGF2ZSBvdXIKKyAqIHNlcGFyYXRlIHJhbmdlIGJlY2F1c2Ugb2YgY29sbGlzaW9ucyB3aXRoIG90aGVyIHRvb2xzIHN1Y2ggYXMKKyAqICdtaWktdG9vbCcuCisgKiBXZSBub3cgaGF2ZSAzMiBjb21tYW5kcywgc28gYSBiaXQgbW9yZSBzcGFjZSA7LSkuCisgKiBBbHNvLCBhbGwgJ2V2ZW4nIGNvbW1hbmRzIGFyZSBvbmx5IHVzYWJsZSBieSByb290IGFuZCBkb24ndCByZXR1cm4gdGhlCisgKiBjb250ZW50IG9mIGlmci9pd3IgdG8gdXNlciAoYnV0IHlvdSBhcmUgbm90IG9ibGlnZWQgdG8gdXNlIHRoZSBzZXQvZ2V0CisgKiBjb252ZW50aW9uLCBqdXN0IHVzZSBldmVyeSBvdGhlciB0d28gY29tbWFuZCkuIE1vcmUgZGV0YWlscyBpbiBpd3ByaXYuYy4KKyAqIEFuZCBJIHJlcGVhdCA6IHlvdSBhcmUgbm90IGZvcmNlZCB0byB1c2UgdGhlbSB3aXRoIGl3cHJpdiwgYnV0IHlvdQorICogbXVzdCBiZSBjb21wbGlhbnQgd2l0aCBpdC4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElPQ1RMIFNUVUZGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhlIGZpcnN0IGFuZCB0aGUgbGFzdCAocmFuZ2UpICovCisjZGVmaW5lIFNJT0NJV0ZJUlNUCTB4OEIwMAorI2RlZmluZSBTSU9DSVdMQVNUCVNJT0NJV0xBU1RQUklWCQkvKiAweDhCRkYgKi8KKyNkZWZpbmUgSVdfSU9DVExfSURYKGNtZCkJKChjbWQpIC0gU0lPQ0lXRklSU1QpCisjZGVmaW5lIElXX0hBTkRMRVIoaWQsIGZ1bmMpCQkJXAorCVtJV19JT0NUTF9JRFgoaWQpXSA9IGZ1bmMKKworLyogT2RkIDogZ2V0ICh3b3JsZCBhY2Nlc3MpLCBldmVuIDogc2V0IChyb290IGFjY2VzcykgKi8KKyNkZWZpbmUgSVdfSVNfU0VUKGNtZCkJKCEoKGNtZCkgJiAweDEpKQorI2RlZmluZSBJV19JU19HRVQoY21kKQkoKGNtZCkgJiAweDEpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdJUkVMRVNTIEVWRU5UUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVGhvc2UgYXJlICpOT1QqIGlvY3RscywgZG8gbm90IGlzc3VlIHJlcXVlc3Qgb24gdGhlbSAhISEgKi8KKy8qIE1vc3QgZXZlbnRzIHVzZSB0aGUgc2FtZSBpZGVudGlmaWVyIGFzIGlvY3RsIHJlcXVlc3RzICovCisKKyNkZWZpbmUgSVdFVlRYRFJPUAkweDhDMDAJCS8qIFBhY2tldCBkcm9wcGVkIHRvIGV4Y2Vzc2l2ZSByZXRyeSAqLworI2RlZmluZSBJV0VWUVVBTAkweDhDMDEJCS8qIFF1YWxpdHkgcGFydCBvZiBzdGF0aXN0aWNzIChzY2FuKSAqLworI2RlZmluZSBJV0VWQ1VTVE9NCTB4OEMwMgkJLyogRHJpdmVyIHNwZWNpZmljIGFzY2lpIHN0cmluZyAqLworI2RlZmluZSBJV0VWUkVHSVNURVJFRAkweDhDMDMJCS8qIERpc2NvdmVyZWQgYSBuZXcgbm9kZSAoQVAgbW9kZSkgKi8KKyNkZWZpbmUgSVdFVkVYUElSRUQJMHg4QzA0CQkvKiBFeHBpcmVkIGEgbm9kZSAoQVAgbW9kZSkgKi8KKyNkZWZpbmUgSVdFVkdFTklFCTB4OEMwNQkJLyogR2VuZXJpYyBJRSAoV1BBLCBSU04sIFdNTSwgLi4pCisJCQkJCSAqIChzY2FuIHJlc3VsdHMpOyBUaGlzIGluY2x1ZGVzIGlkIGFuZAorCQkJCQkgKiBsZW5ndGggZmllbGRzLiBPbmUgSVdFVkdFTklFIG1heQorCQkJCQkgKiBjb250YWluIG1vcmUgdGhhbiBvbmUgSUUuIFNjYW4KKwkJCQkJICogcmVzdWx0cyBtYXkgY29udGFpbiBvbmUgb3IgbW9yZQorCQkJCQkgKiBJV0VWR0VOSUUgZXZlbnRzLiAqLworI2RlZmluZSBJV0VWTUlDSEFFTE1JQ0ZBSUxVUkUgMHg4QzA2CS8qIE1pY2hhZWwgTUlDIGZhaWx1cmUKKwkJCQkJICogKHN0cnVjdCBpd19taWNoYWVsbWljZmFpbHVyZSkKKwkJCQkJICovCisjZGVmaW5lIElXRVZBU1NPQ1JFUUlFCTB4OEMwNwkJLyogSUVzIHVzZWQgaW4gKFJlKUFzc29jaWF0aW9uIFJlcXVlc3QuCisJCQkJCSAqIFRoZSBkYXRhIGluY2x1ZGVzIGlkIGFuZCBsZW5ndGgKKwkJCQkJICogZmllbGRzIGFuZCBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lCisJCQkJCSAqIElFLiBUaGlzIGV2ZW50IGlzIHJlcXVpcmVkIGluCisJCQkJCSAqIE1hbmFnZWQgbW9kZSBpZiB0aGUgZHJpdmVyCisJCQkJCSAqIGdlbmVyYXRlcyBpdHMgb3duIFdQQS9SU04gSUUuIFRoaXMKKwkJCQkJICogc2hvdWxkIGJlIHNlbnQganVzdCBiZWZvcmUKKwkJCQkJICogSVdFVlJFR0lTVEVSRUQgZXZlbnQgZm9yIHRoZQorCQkJCQkgKiBhc3NvY2lhdGlvbi4gKi8KKyNkZWZpbmUgSVdFVkFTU09DUkVTUElFCTB4OEMwOAkJLyogSUVzIHVzZWQgaW4gKFJlKUFzc29jaWF0aW9uCisJCQkJCSAqIFJlc3BvbnNlLiBUaGUgZGF0YSBpbmNsdWRlcyBpZCBhbmQKKwkJCQkJICogbGVuZ3RoIGZpZWxkcyBhbmQgbWF5IGNvbnRhaW4gbW9yZQorCQkJCQkgKiB0aGFuIG9uZSBJRS4gVGhpcyBtYXkgYmUgc2VudAorCQkJCQkgKiBiZXR3ZWVuIElXRVZBU1NPQ1JFUUlFIGFuZAorCQkJCQkgKiBJV0VWUkVHSVNURVJFRCBldmVudHMgZm9yIHRoZQorCQkJCQkgKiBhc3NvY2lhdGlvbi4gKi8KKyNkZWZpbmUgSVdFVlBNS0lEQ0FORAkweDhDMDkJCS8qIFBNS0lEIGNhbmRpZGF0ZSBmb3IgUlNOCisJCQkJCSAqIHByZS1hdXRoZW50aWNhdGlvbgorCQkJCQkgKiAoc3RydWN0IGl3X3Bta2lkX2NhbmQpICovCisKKyNkZWZpbmUgSVdFVkZJUlNUCTB4OEMwMAorI2RlZmluZSBJV19FVkVOVF9JRFgoY21kKQkoKGNtZCkgLSBJV0VWRklSU1QpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFJJVkFURSBJTkZPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGUgZm9sbG93aW5nIGlzIHVzZWQgd2l0aCBTSU9DR0lXUFJJVi4gSXQgYWxsb3cgYSBkcml2ZXIgdG8gZGVmaW5lCisgKiB0aGUgaW50ZXJmYWNlIChuYW1lLCB0eXBlIG9mIGRhdGEpIGZvciBpdHMgcHJpdmF0ZSBpb2N0bC4KKyAqIFByaXZhdGVzIGlvY3RsIGFyZSBTSU9DSVdGSVJTVFBSSVYgLT4gU0lPQ0lXTEFTVFBSSVYKKyAqLworCisjZGVmaW5lIElXX1BSSVZfVFlQRV9NQVNLCTB4NzAwMAkvKiBUeXBlIG9mIGFyZ3VtZW50cyAqLworI2RlZmluZSBJV19QUklWX1RZUEVfTk9ORQkweDAwMDAKKyNkZWZpbmUgSVdfUFJJVl9UWVBFX0JZVEUJMHgxMDAwCS8qIENoYXIgYXMgbnVtYmVyICovCisjZGVmaW5lIElXX1BSSVZfVFlQRV9DSEFSCTB4MjAwMAkvKiBDaGFyIGFzIGNoYXJhY3RlciAqLworI2RlZmluZSBJV19QUklWX1RZUEVfSU5UCTB4NDAwMAkvKiAzMiBiaXRzIGludCAqLworI2RlZmluZSBJV19QUklWX1RZUEVfRkxPQVQJMHg1MDAwCS8qIHN0cnVjdCBpd19mcmVxICovCisjZGVmaW5lIElXX1BSSVZfVFlQRV9BRERSCTB4NjAwMAkvKiBzdHJ1Y3Qgc29ja2FkZHIgKi8KKworI2RlZmluZSBJV19QUklWX1NJWkVfRklYRUQJMHgwODAwCS8qIFZhcmlhYmxlIG9yIGZpeGVkIG51bWJlciBvZiBhcmdzICovCisKKyNkZWZpbmUgSVdfUFJJVl9TSVpFX01BU0sJMHgwN0ZGCS8qIE1heCBudW1iZXIgb2YgdGhvc2UgYXJncyAqLworCisvKgorICogTm90ZSA6IGlmIHRoZSBudW1iZXIgb2YgYXJncyBpcyBmaXhlZCBhbmQgdGhlIHNpemUgPCAxNiBvY3RldHMsCisgKiBpbnN0ZWFkIG9mIHBhc3NpbmcgYSBwb2ludGVyIHdlIHdpbGwgcHV0IGFyZ3MgaW4gdGhlIGl3cmVxIHN0cnVjdC4uLgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9USEVSIENPTlNUQU5UUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBNYXhpbXVtIGZyZXF1ZW5jaWVzIGluIHRoZSByYW5nZSBzdHJ1Y3QgKi8KKyNkZWZpbmUgSVdfTUFYX0ZSRVFVRU5DSUVTCTMyCisvKiBOb3RlIDogaWYgeW91IGhhdmUgc29tZXRoaW5nIGxpa2UgODAgZnJlcXVlbmNpZXMsCisgKiBkb24ndCBpbmNyZWFzZSB0aGlzIGNvbnN0YW50IGFuZCBkb24ndCBmaWxsIHRoZSBmcmVxdWVuY3kgbGlzdC4KKyAqIFRoZSB1c2VyIHdpbGwgYmUgYWJsZSB0byBzZXQgYnkgY2hhbm5lbCBhbnl3YXkuLi4gKi8KKworLyogTWF4aW11bSBiaXQgcmF0ZXMgaW4gdGhlIHJhbmdlIHN0cnVjdCAqLworI2RlZmluZSBJV19NQVhfQklUUkFURVMJCTMyCisKKy8qIE1heGltdW0gdHggcG93ZXJzIGluIHRoZSByYW5nZSBzdHJ1Y3QgKi8KKyNkZWZpbmUgSVdfTUFYX1RYUE9XRVIJCTgKKy8qIE5vdGUgOiBpZiB5b3UgbW9yZSB0aGFuIDggVFhQb3dlcnMsIGp1c3Qgc2V0IHRoZSBtYXggYW5kIG1pbiBvcgorICogYSBmZXcgb2YgdGhlbSBpbiB0aGUgc3RydWN0IGl3X3JhbmdlLiAqLworCisvKiBNYXhpbXVtIG9mIGFkZHJlc3MgdGhhdCB5b3UgbWF5IHNldCB3aXRoIFNQWSAqLworI2RlZmluZSBJV19NQVhfU1BZCQk4CisKKy8qIE1heGltdW0gb2YgYWRkcmVzcyB0aGF0IHlvdSBtYXkgZ2V0IGluIHRoZQorICAgbGlzdCBvZiBhY2Nlc3MgcG9pbnRzIGluIHJhbmdlICovCisjZGVmaW5lIElXX01BWF9BUAkJNjQKKworLyogTWF4aW11bSBzaXplIG9mIHRoZSBFU1NJRCBhbmQgTklDS04gc3RyaW5ncyAqLworI2RlZmluZSBJV19FU1NJRF9NQVhfU0laRQkzMgorCisvKiBNb2RlcyBvZiBvcGVyYXRpb24gKi8KKyNkZWZpbmUgSVdfTU9ERV9BVVRPCTAJLyogTGV0IHRoZSBkcml2ZXIgZGVjaWRlcyAqLworI2RlZmluZSBJV19NT0RFX0FESE9DCTEJLyogU2luZ2xlIGNlbGwgbmV0d29yayAqLworI2RlZmluZSBJV19NT0RFX0lORlJBCTIJLyogTXVsdGkgY2VsbCBuZXR3b3JrLCByb2FtaW5nLCAuLi4gKi8KKyNkZWZpbmUgSVdfTU9ERV9NQVNURVIJMwkvKiBTeW5jaHJvbmlzYXRpb24gbWFzdGVyIG9yIEFjY2VzcyBQb2ludCAqLworI2RlZmluZSBJV19NT0RFX1JFUEVBVAk0CS8qIFdpcmVsZXNzIFJlcGVhdGVyIChmb3J3YXJkZXIpICovCisjZGVmaW5lIElXX01PREVfU0VDT05ECTUJLyogU2Vjb25kYXJ5IG1hc3Rlci9yZXBlYXRlciAoYmFja3VwKSAqLworI2RlZmluZSBJV19NT0RFX01PTklUT1IJNgkvKiBQYXNzaXZlIG1vbml0b3IgKGxpc3RlbiBvbmx5KSAqLworI2RlZmluZSBJV19NT0RFX01FU0gJNwkvKiBNZXNoIChJRUVFIDgwMi4xMXMpIG5ldHdvcmsgKi8KKworLyogU3RhdGlzdGljcyBmbGFncyAoYml0bWFzayBpbiB1cGRhdGVkKSAqLworI2RlZmluZSBJV19RVUFMX1FVQUxfVVBEQVRFRAkweDAxCS8qIFZhbHVlIHdhcyB1cGRhdGVkIHNpbmNlIGxhc3QgcmVhZCAqLworI2RlZmluZSBJV19RVUFMX0xFVkVMX1VQREFURUQJMHgwMgorI2RlZmluZSBJV19RVUFMX05PSVNFX1VQREFURUQJMHgwNAorI2RlZmluZSBJV19RVUFMX0FMTF9VUERBVEVECTB4MDcKKyNkZWZpbmUgSVdfUVVBTF9EQk0JCTB4MDgJLyogTGV2ZWwgKyBOb2lzZSBhcmUgZEJtICovCisjZGVmaW5lIElXX1FVQUxfUVVBTF9JTlZBTElECTB4MTAJLyogRHJpdmVyIGRvZXNuJ3QgcHJvdmlkZSB2YWx1ZSAqLworI2RlZmluZSBJV19RVUFMX0xFVkVMX0lOVkFMSUQJMHgyMAorI2RlZmluZSBJV19RVUFMX05PSVNFX0lOVkFMSUQJMHg0MAorI2RlZmluZSBJV19RVUFMX1JDUEkJCTB4ODAJLyogTGV2ZWwgKyBOb2lzZSBhcmUgODAyLjExayBSQ1BJICovCisjZGVmaW5lIElXX1FVQUxfQUxMX0lOVkFMSUQJMHg3MAorCisvKiBGcmVxdWVuY3kgZmxhZ3MgKi8KKyNkZWZpbmUgSVdfRlJFUV9BVVRPCQkweDAwCS8qIExldCB0aGUgZHJpdmVyIGRlY2lkZXMgKi8KKyNkZWZpbmUgSVdfRlJFUV9GSVhFRAkJMHgwMQkvKiBGb3JjZSBhIHNwZWNpZmljIHZhbHVlICovCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHNpemUgb2YgZW5jb2RpbmcgdG9rZW4gYXZhaWxhYmxlCisgKiB0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIHJhbmdlIHN0cnVjdHVyZSAqLworI2RlZmluZSBJV19NQVhfRU5DT0RJTkdfU0laRVMJOAorCisvKiBNYXhpbXVtIHNpemUgb2YgdGhlIGVuY29kaW5nIHRva2VuIGluIGJ5dGVzICovCisjZGVmaW5lIElXX0VOQ09ESU5HX1RPS0VOX01BWAk2NAkvKiA1MTIgYml0cyAoZm9yIG5vdykgKi8KKworLyogRmxhZ3MgZm9yIGVuY29kaW5nIChhbG9uZyB3aXRoIHRoZSB0b2tlbikgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX0lOREVYCQkweDAwRkYJLyogVG9rZW4gaW5kZXggKGlmIG5lZWRlZCkgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX0ZMQUdTCQkweEZGMDAJLyogRmxhZ3MgZGVmaW5lZCBiZWxvdyAqLworI2RlZmluZSBJV19FTkNPREVfTU9ERQkJMHhGMDAwCS8qIE1vZGVzIGRlZmluZWQgYmVsb3cgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX0RJU0FCTEVECTB4ODAwMAkvKiBFbmNvZGluZyBkaXNhYmxlZCAqLworI2RlZmluZSBJV19FTkNPREVfRU5BQkxFRAkweDAwMDAJLyogRW5jb2RpbmcgZW5hYmxlZCAqLworI2RlZmluZSBJV19FTkNPREVfUkVTVFJJQ1RFRAkweDQwMDAJLyogUmVmdXNlIG5vbi1lbmNvZGVkIHBhY2tldHMgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX09QRU4JCTB4MjAwMAkvKiBBY2NlcHQgbm9uLWVuY29kZWQgcGFja2V0cyAqLworI2RlZmluZSBJV19FTkNPREVfTk9LRVkJCTB4MDgwMCAgLyogS2V5IGlzIHdyaXRlIG9ubHksIHNvIG5vdCBwcmVzZW50ICovCisjZGVmaW5lIElXX0VOQ09ERV9URU1QCQkweDA0MDAgIC8qIFRlbXBvcmFyeSBrZXkgKi8KKworLyogUG93ZXIgbWFuYWdlbWVudCBmbGFncyBhdmFpbGFibGUgKGFsb25nIHdpdGggdGhlIHZhbHVlLCBpZiBhbnkpICovCisjZGVmaW5lIElXX1BPV0VSX09OCQkweDAwMDAJLyogTm8gZGV0YWlscy4uLiAqLworI2RlZmluZSBJV19QT1dFUl9UWVBFCQkweEYwMDAJLyogVHlwZSBvZiBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgSVdfUE9XRVJfUEVSSU9ECQkweDEwMDAJLyogVmFsdWUgaXMgYSBwZXJpb2QvZHVyYXRpb24gb2YgICovCisjZGVmaW5lIElXX1BPV0VSX1RJTUVPVVQJMHgyMDAwCS8qIFZhbHVlIGlzIGEgdGltZW91dCAodG8gZ28gYXNsZWVwKSAqLworI2RlZmluZSBJV19QT1dFUl9NT0RFCQkweDBGMDAJLyogUG93ZXIgTWFuYWdlbWVudCBtb2RlICovCisjZGVmaW5lIElXX1BPV0VSX1VOSUNBU1RfUgkweDAxMDAJLyogUmVjZWl2ZSBvbmx5IHVuaWNhc3QgbWVzc2FnZXMgKi8KKyNkZWZpbmUgSVdfUE9XRVJfTVVMVElDQVNUX1IJMHgwMjAwCS8qIFJlY2VpdmUgb25seSBtdWx0aWNhc3QgbWVzc2FnZXMgKi8KKyNkZWZpbmUgSVdfUE9XRVJfQUxMX1IJCTB4MDMwMAkvKiBSZWNlaXZlIGFsbCBtZXNzYWdlcyB0aG91Z2ggUE0gKi8KKyNkZWZpbmUgSVdfUE9XRVJfRk9SQ0VfUwkweDA0MDAJLyogRm9yY2UgUE0gcHJvY2VkdXJlIGZvciBzZW5kaW5nIHVuaWNhc3QgKi8KKyNkZWZpbmUgSVdfUE9XRVJfUkVQRUFURVIJMHgwODAwCS8qIFJlcGVhdCBicm9hZGNhc3QgbWVzc2FnZXMgaW4gUE0gcGVyaW9kICovCisjZGVmaW5lIElXX1BPV0VSX01PRElGSUVSCTB4MDAwRgkvKiBNb2RpZnkgYSBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgSVdfUE9XRVJfTUlOCQkweDAwMDEJLyogVmFsdWUgaXMgYSBtaW5pbXVtICAqLworI2RlZmluZSBJV19QT1dFUl9NQVgJCTB4MDAwMgkvKiBWYWx1ZSBpcyBhIG1heGltdW0gKi8KKyNkZWZpbmUgSVdfUE9XRVJfUkVMQVRJVkUJMHgwMDA0CS8qIFZhbHVlIGlzIG5vdCBpbiBzZWNvbmRzL21zL3VzICovCisKKy8qIFRyYW5zbWl0IFBvd2VyIGZsYWdzIGF2YWlsYWJsZSAqLworI2RlZmluZSBJV19UWFBPV19UWVBFCQkweDAwRkYJLyogVHlwZSBvZiB2YWx1ZSAqLworI2RlZmluZSBJV19UWFBPV19EQk0JCTB4MDAwMAkvKiBWYWx1ZSBpcyBpbiBkQm0gKi8KKyNkZWZpbmUgSVdfVFhQT1dfTVdBVFQJCTB4MDAwMQkvKiBWYWx1ZSBpcyBpbiBtVyAqLworI2RlZmluZSBJV19UWFBPV19SRUxBVElWRQkweDAwMDIJLyogVmFsdWUgaXMgaW4gYXJiaXRyYXJ5IHVuaXRzICovCisjZGVmaW5lIElXX1RYUE9XX1JBTkdFCQkweDEwMDAJLyogUmFuZ2Ugb2YgdmFsdWUgYmV0d2VlbiBtaW4vbWF4ICovCisKKy8qIFJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUgZmxhZ3MgYXZhaWxhYmxlICovCisjZGVmaW5lIElXX1JFVFJZX09OCQkweDAwMDAJLyogTm8gZGV0YWlscy4uLiAqLworI2RlZmluZSBJV19SRVRSWV9UWVBFCQkweEYwMDAJLyogVHlwZSBvZiBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgSVdfUkVUUllfTElNSVQJCTB4MTAwMAkvKiBNYXhpbXVtIG51bWJlciBvZiByZXRyaWVzKi8KKyNkZWZpbmUgSVdfUkVUUllfTElGRVRJTUUJMHgyMDAwCS8qIE1heGltdW0gZHVyYXRpb24gb2YgcmV0cmllcyBpbiB1cyAqLworI2RlZmluZSBJV19SRVRSWV9NT0RJRklFUgkweDAwRkYJLyogTW9kaWZ5IGEgcGFyYW1ldGVyICovCisjZGVmaW5lIElXX1JFVFJZX01JTgkJMHgwMDAxCS8qIFZhbHVlIGlzIGEgbWluaW11bSAgKi8KKyNkZWZpbmUgSVdfUkVUUllfTUFYCQkweDAwMDIJLyogVmFsdWUgaXMgYSBtYXhpbXVtICovCisjZGVmaW5lIElXX1JFVFJZX1JFTEFUSVZFCTB4MDAwNAkvKiBWYWx1ZSBpcyBub3QgaW4gc2Vjb25kcy9tcy91cyAqLworI2RlZmluZSBJV19SRVRSWV9TSE9SVAkJMHgwMDEwCS8qIFZhbHVlIGlzIGZvciBzaG9ydCBwYWNrZXRzICAqLworI2RlZmluZSBJV19SRVRSWV9MT05HCQkweDAwMjAJLyogVmFsdWUgaXMgZm9yIGxvbmcgcGFja2V0cyAqLworCisvKiBTY2FubmluZyByZXF1ZXN0IGZsYWdzICovCisjZGVmaW5lIElXX1NDQU5fREVGQVVMVAkJMHgwMDAwCS8qIERlZmF1bHQgc2NhbiBvZiB0aGUgZHJpdmVyICovCisjZGVmaW5lIElXX1NDQU5fQUxMX0VTU0lECTB4MDAwMQkvKiBTY2FuIGFsbCBFU1NJRHMgKi8KKyNkZWZpbmUgSVdfU0NBTl9USElTX0VTU0lECTB4MDAwMgkvKiBTY2FuIG9ubHkgdGhpcyBFU1NJRCAqLworI2RlZmluZSBJV19TQ0FOX0FMTF9GUkVRCTB4MDAwNAkvKiBTY2FuIGFsbCBGcmVxdWVuY2llcyAqLworI2RlZmluZSBJV19TQ0FOX1RISVNfRlJFUQkweDAwMDgJLyogU2NhbiBvbmx5IHRoaXMgRnJlcXVlbmN5ICovCisjZGVmaW5lIElXX1NDQU5fQUxMX01PREUJMHgwMDEwCS8qIFNjYW4gYWxsIE1vZGVzICovCisjZGVmaW5lIElXX1NDQU5fVEhJU19NT0RFCTB4MDAyMAkvKiBTY2FuIG9ubHkgdGhpcyBNb2RlICovCisjZGVmaW5lIElXX1NDQU5fQUxMX1JBVEUJMHgwMDQwCS8qIFNjYW4gYWxsIEJpdC1SYXRlcyAqLworI2RlZmluZSBJV19TQ0FOX1RISVNfUkFURQkweDAwODAJLyogU2NhbiBvbmx5IHRoaXMgQml0LVJhdGUgKi8KKy8qIHN0cnVjdCBpd19zY2FuX3JlcSBzY2FuX3R5cGUgKi8KKyNkZWZpbmUgSVdfU0NBTl9UWVBFX0FDVElWRSAwCisjZGVmaW5lIElXX1NDQU5fVFlQRV9QQVNTSVZFIDEKKy8qIE1heGltdW0gc2l6ZSBvZiByZXR1cm5lZCBkYXRhICovCisjZGVmaW5lIElXX1NDQU5fTUFYX0RBVEEJNDA5NgkvKiBJbiBieXRlcyAqLworCisvKiBTY2FuIGNhcGFiaWxpdHkgZmxhZ3MgLSBpbiAoc3RydWN0IGl3X3JhbmdlICopLT5zY2FuX2NhcGEgKi8KKyNkZWZpbmUgSVdfU0NBTl9DQVBBX05PTkUJCTB4MDAKKyNkZWZpbmUgSVdfU0NBTl9DQVBBX0VTU0lECQkweDAxCisjZGVmaW5lIElXX1NDQU5fQ0FQQV9CU1NJRAkJMHgwMgorI2RlZmluZSBJV19TQ0FOX0NBUEFfQ0hBTk5FTAkweDA0CisjZGVmaW5lIElXX1NDQU5fQ0FQQV9NT0RFCQkweDA4CisjZGVmaW5lIElXX1NDQU5fQ0FQQV9SQVRFCQkweDEwCisjZGVmaW5lIElXX1NDQU5fQ0FQQV9UWVBFCQkweDIwCisjZGVmaW5lIElXX1NDQU5fQ0FQQV9USU1FCQkweDQwCisKKy8qIE1heCBudW1iZXIgb2YgY2hhciBpbiBjdXN0b20gZXZlbnQgLSB1c2UgbXVsdGlwbGUgb2YgdGhlbSBpZiBuZWVkZWQgKi8KKyNkZWZpbmUgSVdfQ1VTVE9NX01BWAkJMjU2CS8qIEluIGJ5dGVzICovCisKKy8qIEdlbmVyaWMgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBJV19HRU5FUklDX0lFX01BWAkxMDI0CisKKy8qIE1MTUUgcmVxdWVzdHMgKFNJT0NTSVdNTE1FIC8gc3RydWN0IGl3X21sbWUpICovCisjZGVmaW5lIElXX01MTUVfREVBVVRICQkwCisjZGVmaW5lIElXX01MTUVfRElTQVNTT0MJMQorI2RlZmluZSBJV19NTE1FX0FVVEgJCTIKKyNkZWZpbmUgSVdfTUxNRV9BU1NPQwkJMworCisvKiBTSU9DU0lXQVVUSC9TSU9DR0lXQVVUSCBzdHJ1Y3QgaXdfcGFyYW0gZmxhZ3MgKi8KKyNkZWZpbmUgSVdfQVVUSF9JTkRFWAkJMHgwRkZGCisjZGVmaW5lIElXX0FVVEhfRkxBR1MJCTB4RjAwMAorLyogU0lPQ1NJV0FVVEgvU0lPQ0dJV0FVVEggcGFyYW1ldGVycyAoMCAuLiA0MDk1KQorICogKElXX0FVVEhfSU5ERVggbWFzayBpbiBzdHJ1Y3QgaXdfcGFyYW0gZmxhZ3M7IHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZQorICogcGFyYW1ldGVyIHRoYXQgaXMgYmVpbmcgc2V0L2dldCB0bzsgdmFsdWUgd2lsbCBiZSByZWFkL3dyaXR0ZW4gdG8KKyAqIHN0cnVjdCBpd19wYXJhbSB2YWx1ZSBmaWVsZCkgKi8KKyNkZWZpbmUgSVdfQVVUSF9XUEFfVkVSU0lPTgkJMAorI2RlZmluZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRQkJMQorI2RlZmluZSBJV19BVVRIX0NJUEhFUl9HUk9VUAkJMgorI2RlZmluZSBJV19BVVRIX0tFWV9NR01UCQkzCisjZGVmaW5lIElXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVMJNAorI2RlZmluZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQJNQorI2RlZmluZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHCQk2CisjZGVmaW5lIElXX0FVVEhfV1BBX0VOQUJMRUQJCTcKKyNkZWZpbmUgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTAk4CisjZGVmaW5lIElXX0FVVEhfUk9BTUlOR19DT05UUk9MCQk5CisjZGVmaW5lIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VECQkxMAorI2RlZmluZSBJV19BVVRIX0NJUEhFUl9HUk9VUF9NR01UCTExCisjZGVmaW5lIElXX0FVVEhfTUZQCQkJMTIKKworLyogSVdfQVVUSF9XUEFfVkVSU0lPTiB2YWx1ZXMgKGJpdCBmaWVsZCkgKi8KKyNkZWZpbmUgSVdfQVVUSF9XUEFfVkVSU0lPTl9ESVNBQkxFRAkweDAwMDAwMDAxCisjZGVmaW5lIElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBCQkweDAwMDAwMDAyCisjZGVmaW5lIElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMgkweDAwMDAwMDA0CisKKy8qIElXX0FVVEhfUEFJUldJU0VfQ0lQSEVSLCBJV19BVVRIX0dST1VQX0NJUEhFUiwgYW5kIElXX0FVVEhfQ0lQSEVSX0dST1VQX01HTVQKKyAqIHZhbHVlcyAoYml0IGZpZWxkKSAqLworI2RlZmluZSBJV19BVVRIX0NJUEhFUl9OT05FCTB4MDAwMDAwMDEKKyNkZWZpbmUgSVdfQVVUSF9DSVBIRVJfV0VQNDAJMHgwMDAwMDAwMgorI2RlZmluZSBJV19BVVRIX0NJUEhFUl9US0lQCTB4MDAwMDAwMDQKKyNkZWZpbmUgSVdfQVVUSF9DSVBIRVJfQ0NNUAkweDAwMDAwMDA4CisjZGVmaW5lIElXX0FVVEhfQ0lQSEVSX1dFUDEwNAkweDAwMDAwMDEwCisjZGVmaW5lIElXX0FVVEhfQ0lQSEVSX0FFU19DTUFDCTB4MDAwMDAwMjAKKworLyogSVdfQVVUSF9LRVlfTUdNVCB2YWx1ZXMgKGJpdCBmaWVsZCkgKi8KKyNkZWZpbmUgSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgJMQorI2RlZmluZSBJV19BVVRIX0tFWV9NR01UX1BTSwkyCisKKy8qIElXX0FVVEhfODAyMTFfQVVUSF9BTEcgdmFsdWVzIChiaXQgZmllbGQpICovCisjZGVmaW5lIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNCTB4MDAwMDAwMDEKKyNkZWZpbmUgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWQkweDAwMDAwMDAyCisjZGVmaW5lIElXX0FVVEhfQUxHX0xFQVAJMHgwMDAwMDAwNAorCisvKiBJV19BVVRIX1JPQU1JTkdfQ09OVFJPTCB2YWx1ZXMgKi8KKyNkZWZpbmUgSVdfQVVUSF9ST0FNSU5HX0VOQUJMRQkwCS8qIGRyaXZlci9maXJtd2FyZSBiYXNlZCByb2FtaW5nICovCisjZGVmaW5lIElXX0FVVEhfUk9BTUlOR19ESVNBQkxFCTEJLyogdXNlciBzcGFjZSBwcm9ncmFtIHVzZWQgZm9yIHJvYW1pbmcKKwkJCQkJICogY29udHJvbCAqLworCisvKiBJV19BVVRIX01GUCAobWFuYWdlbWVudCBmcmFtZSBwcm90ZWN0aW9uKSB2YWx1ZXMgKi8KKyNkZWZpbmUgSVdfQVVUSF9NRlBfRElTQUJMRUQJMAkvKiBNRlAgZGlzYWJsZWQgKi8KKyNkZWZpbmUgSVdfQVVUSF9NRlBfT1BUSU9OQUwJMQkvKiBNRlAgb3B0aW9uYWwgKi8KKyNkZWZpbmUgSVdfQVVUSF9NRlBfUkVRVUlSRUQJMgkvKiBNRlAgcmVxdWlyZWQgKi8KKworLyogU0lPQ1NJV0VOQ09ERUVYVCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBJV19FTkNPREVfU0VRX01BWF9TSVpFCTgKKy8qIHN0cnVjdCBpd19lbmNvZGVfZXh0IC0+YWxnICovCisjZGVmaW5lIElXX0VOQ09ERV9BTEdfTk9ORQkwCisjZGVmaW5lIElXX0VOQ09ERV9BTEdfV0VQCTEKKyNkZWZpbmUgSVdfRU5DT0RFX0FMR19US0lQCTIKKyNkZWZpbmUgSVdfRU5DT0RFX0FMR19DQ01QCTMKKyNkZWZpbmUgSVdfRU5DT0RFX0FMR19QTUsJNAorI2RlZmluZSBJV19FTkNPREVfQUxHX0FFU19DTUFDCTUKKy8qIHN0cnVjdCBpd19lbmNvZGVfZXh0IC0+ZXh0X2ZsYWdzICovCisjZGVmaW5lIElXX0VOQ09ERV9FWFRfVFhfU0VRX1ZBTElECTB4MDAwMDAwMDEKKyNkZWZpbmUgSVdfRU5DT0RFX0VYVF9SWF9TRVFfVkFMSUQJMHgwMDAwMDAwMgorI2RlZmluZSBJV19FTkNPREVfRVhUX0dST1VQX0tFWQkJMHgwMDAwMDAwNAorI2RlZmluZSBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkJMHgwMDAwMDAwOAorCisvKiBJV0VWTUlDSEFFTE1JQ0ZBSUxVUkUgOiBzdHJ1Y3QgaXdfbWljaGFlbG1pY2ZhaWx1cmUgLT5mbGFncyAqLworI2RlZmluZSBJV19NSUNGQUlMVVJFX0tFWV9JRAkweDAwMDAwMDAzIC8qIEtleSBJRCAwLi4zICovCisjZGVmaW5lIElXX01JQ0ZBSUxVUkVfR1JPVVAJMHgwMDAwMDAwNAorI2RlZmluZSBJV19NSUNGQUlMVVJFX1BBSVJXSVNFCTB4MDAwMDAwMDgKKyNkZWZpbmUgSVdfTUlDRkFJTFVSRV9TVEFLRVkJMHgwMDAwMDAxMAorI2RlZmluZSBJV19NSUNGQUlMVVJFX0NPVU5UCTB4MDAwMDAwNjAgLyogMSBvciAyICgwID0gY291bnQgbm90IHN1cHBvcnRlZCkKKwkJCQkJICAgICovCisKKy8qIEJpdCBmaWVsZCB2YWx1ZXMgZm9yIGVuY19jYXBhIGluIHN0cnVjdCBpd19yYW5nZSAqLworI2RlZmluZSBJV19FTkNfQ0FQQV9XUEEJCTB4MDAwMDAwMDEKKyNkZWZpbmUgSVdfRU5DX0NBUEFfV1BBMgkweDAwMDAwMDAyCisjZGVmaW5lIElXX0VOQ19DQVBBX0NJUEhFUl9US0lQCTB4MDAwMDAwMDQKKyNkZWZpbmUgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVAJMHgwMDAwMDAwOAorI2RlZmluZSBJV19FTkNfQ0FQQV80V0FZX0hBTkRTSEFLRQkweDAwMDAwMDEwCisKKy8qIEV2ZW50IGNhcGFiaWxpdHkgbWFjcm9zIC0gaW4gKHN0cnVjdCBpd19yYW5nZSAqKS0+ZXZlbnRfY2FwYQorICogQmVjYXVzZSB3ZSBoYXZlIG1vcmUgdGhhbiAzMiBwb3NzaWJsZSBldmVudHMsIHdlIHVzZSBhbiBhcnJheSBvZgorICogMzIgYml0IGJpdG1hc2tzLiBOb3RlIDogMzIgYml0cyA9IDB4MjAgPSAyXjUuICovCisjZGVmaW5lIElXX0VWRU5UX0NBUEFfQkFTRShjbWQpCQkoKGNtZCA+PSBTSU9DSVdGSVJTVFBSSVYpID8gXAorCQkJCQkgKGNtZCAtIFNJT0NJV0ZJUlNUUFJJViArIDB4NjApIDogXAorCQkJCQkgKGNtZCAtIFNJT0NJV0ZJUlNUKSkKKyNkZWZpbmUgSVdfRVZFTlRfQ0FQQV9JTkRFWChjbWQpCShJV19FVkVOVF9DQVBBX0JBU0UoY21kKSA+PiA1KQorI2RlZmluZSBJV19FVkVOVF9DQVBBX01BU0soY21kKQkJKDEgPDwgKElXX0VWRU5UX0NBUEFfQkFTRShjbWQpICYgMHgxRikpCisvKiBFdmVudCBjYXBhYmlsaXR5IGNvbnN0YW50cyAtIGV2ZW50IGF1dG9nZW5lcmF0ZWQgYnkgdGhlIGtlcm5lbAorICogVGhpcyBsaXN0IGlzIHZhbGlkIGZvciBtb3N0IDgwMi4xMSBkZXZpY2VzLCBjdXN0b21pc2UgYXMgbmVlZGVkLi4uICovCisjZGVmaW5lIElXX0VWRU5UX0NBUEFfS18wCShJV19FVkVOVF9DQVBBX01BU0soMHg4QjA0KSB8IFwKKwkJCQkgSVdfRVZFTlRfQ0FQQV9NQVNLKDB4OEIwNikgfCBcCisJCQkJIElXX0VWRU5UX0NBUEFfTUFTSygweDhCMUEpKQorI2RlZmluZSBJV19FVkVOVF9DQVBBX0tfMQkoSVdfRVZFTlRfQ0FQQV9NQVNLKDB4OEIyQSkpCisvKiAiRWFzeSIgbWFjcm8gdG8gc2V0IGV2ZW50cyBpbiBpd19yYW5nZSAobGVzcyBlZmZpY2llbnQpICovCisjZGVmaW5lIElXX0VWRU5UX0NBUEFfU0VUKGV2ZW50X2NhcGEsIGNtZCkgKGV2ZW50X2NhcGFbSVdfRVZFTlRfQ0FQQV9JTkRFWChjbWQpXSB8PSBJV19FVkVOVF9DQVBBX01BU0soY21kKSkKKyNkZWZpbmUgSVdfRVZFTlRfQ0FQQV9TRVRfS0VSTkVMKGV2ZW50X2NhcGEpIHtldmVudF9jYXBhWzBdIHw9IElXX0VWRU5UX0NBUEFfS18wOyBldmVudF9jYXBhWzFdIHw9IElXX0VWRU5UX0NBUEFfS18xOyB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBUWVBFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTVUJUWVBFUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKglHZW5lcmljIGZvcm1hdCBmb3IgbW9zdCBwYXJhbWV0ZXJzIHRoYXQgZml0IGluIGFuIGludAorICovCitzdHJ1Y3QJaXdfcGFyYW0KK3sKKyAgX19zMzIJCXZhbHVlOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgaXRzZWxmICovCisgIF9fdTgJCWZpeGVkOwkJLyogSGFyZHdhcmUgc2hvdWxkIG5vdCB1c2UgYXV0byBzZWxlY3QgKi8KKyAgX191OAkJZGlzYWJsZWQ7CS8qIERpc2FibGUgdGhlIGZlYXR1cmUgKi8KKyAgX191MTYJCWZsYWdzOwkJLyogVmFyaW91cyBzcGVjaWZjIGZsYWdzIChpZiBhbnkpICovCit9OworCisvKgorICoJRm9yIGFsbCBkYXRhIGxhcmdlciB0aGFuIDE2IG9jdGV0cywgd2UgbmVlZCB0byB1c2UgYQorICoJcG9pbnRlciB0byBtZW1vcnkgYWxsb2NhdGVkIGluIHVzZXIgc3BhY2UuCisgKi8KK3N0cnVjdAlpd19wb2ludAoreworICB2b2lkICpwb2ludGVyOwkvKiBQb2ludGVyIHRvIHRoZSBkYXRhICAoaW4gdXNlciBzcGFjZSkgKi8KKyAgX191MTYJCWxlbmd0aDsJCS8qIG51bWJlciBvZiBmaWVsZHMgb3Igc2l6ZSBpbiBieXRlcyAqLworICBfX3UxNgkJZmxhZ3M7CQkvKiBPcHRpb25hbCBwYXJhbXMgKi8KK307CisKKworLyoKKyAqCUEgZnJlcXVlbmN5CisgKglGb3IgbnVtYmVycyBsb3dlciB0aGFuIDEwXjksIHdlIGVuY29kZSB0aGUgbnVtYmVyIGluICdtJyBhbmQKKyAqCXNldCAnZScgdG8gMAorICoJRm9yIG51bWJlciBncmVhdGVyIHRoYW4gMTBeOSwgd2UgZGl2aWRlIGl0IGJ5IHRoZSBsb3dlc3QgcG93ZXIKKyAqCW9mIDEwIHRvIGdldCAnbScgbG93ZXIgdGhhbiAxMF45LCB3aXRoICdtJz0gZiAvICgxMF4nZScpLi4uCisgKglUaGUgcG93ZXIgb2YgMTAgaXMgaW4gJ2UnLCB0aGUgcmVzdWx0IG9mIHRoZSBkaXZpc2lvbiBpcyBpbiAnbScuCisgKi8KK3N0cnVjdAlpd19mcmVxCit7CisJX19zMzIJCW07CQkvKiBNYW50aXNzYSAqLworCV9fczE2CQllOwkJLyogRXhwb25lbnQgKi8KKwlfX3U4CQlpOwkJLyogTGlzdCBpbmRleCAod2hlbiBpbiByYW5nZSBzdHJ1Y3QpICovCisJX191OAkJZmxhZ3M7CQkvKiBGbGFncyAoZml4ZWQvYXV0bykgKi8KK307CisKKy8qCisgKglRdWFsaXR5IG9mIHRoZSBsaW5rCisgKi8KK3N0cnVjdAlpd19xdWFsaXR5Cit7CisJX191OAkJcXVhbDsJCS8qIGxpbmsgcXVhbGl0eSAoJXJldHJpZXMsIFNOUiwKKwkJCQkJICAgJW1pc3NlZCBiZWFjb25zIG9yIGJldHRlci4uLikgKi8KKwlfX3U4CQlsZXZlbDsJCS8qIHNpZ25hbCBsZXZlbCAoZEJtKSAqLworCV9fdTgJCW5vaXNlOwkJLyogbm9pc2UgbGV2ZWwgKGRCbSkgKi8KKwlfX3U4CQl1cGRhdGVkOwkvKiBGbGFncyB0byBrbm93IGlmIHVwZGF0ZWQgKi8KK307CisKKy8qCisgKglQYWNrZXQgZGlzY2FyZGVkIGluIHRoZSB3aXJlbGVzcyBhZGFwdGVyIGR1ZSB0bworICoJIndpcmVsZXNzIiBzcGVjaWZpYyBwcm9ibGVtcy4uLgorICoJTm90ZSA6IHRoZSBsaXN0IG9mIGNvdW50ZXIgYW5kIHN0YXRpc3RpY3MgaW4gbmV0X2RldmljZV9zdGF0cworICoJaXMgYWxyZWFkeSBwcmV0dHkgZXhoYXVzdGl2ZSwgYW5kIHlvdSBzaG91bGQgdXNlIHRoYXQgZmlyc3QuCisgKglUaGlzIGlzIG9ubHkgYWRkaXRpb25hbCBzdGF0cy4uLgorICovCitzdHJ1Y3QJaXdfZGlzY2FyZGVkCit7CisJX191MzIJCW53aWQ7CQkvKiBSeCA6IFdyb25nIG53aWQvZXNzaWQgKi8KKwlfX3UzMgkJY29kZTsJCS8qIFJ4IDogVW5hYmxlIHRvIGNvZGUvZGVjb2RlIChXRVApICovCisJX191MzIJCWZyYWdtZW50OwkvKiBSeCA6IENhbid0IHBlcmZvcm0gTUFDIHJlYXNzZW1ibHkgKi8KKwlfX3UzMgkJcmV0cmllczsJLyogVHggOiBNYXggTUFDIHJldHJpZXMgbnVtIHJlYWNoZWQgKi8KKwlfX3UzMgkJbWlzYzsJCS8qIE90aGVycyBjYXNlcyAqLworfTsKKworLyoKKyAqCVBhY2tldC9UaW1lIHBlcmlvZCBtaXNzZWQgaW4gdGhlIHdpcmVsZXNzIGFkYXB0ZXIgZHVlIHRvCisgKgkid2lyZWxlc3MiIHNwZWNpZmljIHByb2JsZW1zLi4uCisgKi8KK3N0cnVjdAlpd19taXNzZWQKK3sKKwlfX3UzMgkJYmVhY29uOwkJLyogTWlzc2VkIGJlYWNvbnMvc3VwZXJmcmFtZSAqLworfTsKKworLyoKKyAqCVF1YWxpdHkgcmFuZ2UgKGZvciBzcHkgdGhyZXNob2xkKQorICovCitzdHJ1Y3QJaXdfdGhyc3B5Cit7CisJc3RydWN0IHNvY2thZGRyCQlhZGRyOwkJLyogU291cmNlIGFkZHJlc3MgKGh3L21hYykgKi8KKwlzdHJ1Y3QgaXdfcXVhbGl0eQlxdWFsOwkJLyogUXVhbGl0eSBvZiB0aGUgbGluayAqLworCXN0cnVjdCBpd19xdWFsaXR5CWxvdzsJCS8qIExvdyB0aHJlc2hvbGQgKi8KKwlzdHJ1Y3QgaXdfcXVhbGl0eQloaWdoOwkJLyogSGlnaCB0aHJlc2hvbGQgKi8KK307CisKKy8qCisgKglPcHRpb25hbCBkYXRhIGZvciBzY2FuIHJlcXVlc3QKKyAqCisgKglOb3RlOiB0aGVzZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBjb250cm9sbGluZyBwYXJhbWV0ZXJzIGZvciB0aGUKKyAqCXNjYW5uaW5nIGJlaGF2aW9yLCB0aGVzZSBkbyBub3QgYXBwbHkgdG8gZ2V0dGluZyBzY2FuIHJlc3VsdHMKKyAqCShTSU9DR0lXU0NBTikuIERyaXZlcnMgYXJlIGV4cGVjdGVkIHRvIGtlZXAgYSBsb2NhbCBCU1MgdGFibGUgYW5kCisgKglwcm92aWRlIGEgbWVyZ2VkIHJlc3VsdHMgd2l0aCBhbGwgQlNTZXMgZXZlbiBpZiB0aGUgcHJldmlvdXMgc2NhbgorICoJcmVxdWVzdCBsaW1pdGVkIHNjYW5uaW5nIHRvIGEgc3Vic2V0LCBlLmcuLCBieSBzcGVjaWZ5aW5nIGFuIFNTSUQuCisgKglFc3BlY2lhbGx5LCBzY2FuIHJlc3VsdHMgYXJlIHJlcXVpcmVkIHRvIGluY2x1ZGUgYW4gZW50cnkgZm9yIHRoZQorICoJY3VycmVudCBCU1MgaWYgdGhlIGRyaXZlciBpcyBpbiBNYW5hZ2VkIG1vZGUgYW5kIGFzc29jaWF0ZWQgd2l0aCBhbiBBUC4KKyAqLworc3RydWN0CWl3X3NjYW5fcmVxCit7CisJX191OAkJc2Nhbl90eXBlOyAvKiBJV19TQ0FOX1RZUEVfe0FDVElWRSxQQVNTSVZFfSAqLworCV9fdTgJCWVzc2lkX2xlbjsKKwlfX3U4CQludW1fY2hhbm5lbHM7IC8qIG51bSBlbnRyaWVzIGluIGNoYW5uZWxfbGlzdDsKKwkJCQkgICAgICAgKiAwID0gc2NhbiBhbGwgYWxsb3dlZCBjaGFubmVscyAqLworCV9fdTgJCWZsYWdzOyAvKiByZXNlcnZlZCBhcyBwYWRkaW5nOyB1c2UgemVybywgdGhpcyBtYXkKKwkJCQkqIGJlIHVzZWQgaW4gdGhlIGZ1dHVyZSBmb3IgYWRkaW5nIGZsYWdzCisJCQkJKiB0byByZXF1ZXN0IGRpZmZlcmVudCBzY2FuIGJlaGF2aW9yICovCisJc3RydWN0IHNvY2thZGRyCWJzc2lkOyAvKiBmZjpmZjpmZjpmZjpmZjpmZiBmb3IgYnJvYWRjYXN0IEJTU0lEIG9yCisJCQkJKiBpbmRpdmlkdWFsIGFkZHJlc3Mgb2YgYSBzcGVjaWZpYyBCU1MgKi8KKworCS8qCisJICogVXNlIHRoaXMgRVNTSUQgaWYgSVdfU0NBTl9USElTX0VTU0lEIGZsYWcgaXMgdXNlZCBpbnN0ZWFkIG9mIHVzaW5nCisJICogdGhlIGN1cnJlbnQgRVNTSUQuIFRoaXMgYWxsb3dzIHNjYW4gcmVxdWVzdHMgZm9yIHNwZWNpZmljIEVTU0lECisJICogd2l0aG91dCBoYXZpbmcgdG8gY2hhbmdlIHRoZSBjdXJyZW50IEVTU0lEIGFuZCBwb3RlbnRpYWxseSBicmVha2luZworCSAqIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uLgorCSAqLworCV9fdTgJCWVzc2lkW0lXX0VTU0lEX01BWF9TSVpFXTsKKworCS8qCisJICogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgY2hhbmdpbmcgdGhlIGRlZmF1bHQgc2Nhbm5pbmcgYmVoYXZpb3IuCisJICogVGhlc2UgYXJlIGJhc2VkIG9uIHRoZSBNTE1FLVNDQU4ucmVxdWVzdCBmcm9tIElFRUUgU3RkIDgwMi4xMS4KKwkgKiBUVSBpcyAxLjAyNCBtcy4gSWYgdGhlc2UgYXJlIHNldCB0byAwLCBkcml2ZXIgaXMgZXhwZWN0ZWQgdG8gdXNlCisJICogcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcy4gbWluX2NoYW5uZWxfdGltZSBkZWZpbmVzIHRoZSB0aW1lIHRoYXQKKwkgKiB3aWxsIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhlIGZpcnN0IHJlcGx5IG9uIGVhY2ggY2hhbm5lbC4gSWYgbm8KKwkgKiByZXBsaWVzIGFyZSByZWNlaXZlZCwgbmV4dCBjaGFubmVsIHdpbGwgYmUgc2Nhbm5lZCBhZnRlciB0aGlzLiBJZgorCSAqIHJlcGxpZXMgYXJlIHJlY2VpdmVkLCB0b3RhbCB0aW1lIHdhaXRlZCBvbiB0aGUgY2hhbm5lbCBpcyBkZWZpbmVkIGJ5CisJICogbWF4X2NoYW5uZWxfdGltZS4KKwkgKi8KKwlfX3UzMgkJbWluX2NoYW5uZWxfdGltZTsgLyogaW4gVFUgKi8KKwlfX3UzMgkJbWF4X2NoYW5uZWxfdGltZTsgLyogaW4gVFUgKi8KKworCXN0cnVjdCBpd19mcmVxCWNoYW5uZWxfbGlzdFtJV19NQVhfRlJFUVVFTkNJRVNdOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXUEEgU1VQUE9SVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKglFeHRlbmRlZCBkYXRhIHN0cnVjdHVyZSBmb3IgZ2V0L3NldCBlbmNvZGluZyAodGhpcyBpcyB1c2VkIHdpdGgKKyAqCVNJT0NTSVdFTkNPREVFWFQvU0lPQ0dJV0VOQ09ERUVYVC4gc3RydWN0IGl3X3BvaW50IGFuZCBJV19FTkNPREVfKgorICoJZmxhZ3MgYXJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHdpdGggU0lPQ1NJV0VOQ09ERS9TSU9DR0lXRU5DT0RFIGFuZAorICoJb25seSB0aGUgZGF0YSBjb250ZW50cyBjaGFuZ2VzIChrZXkgZGF0YSAtPiB0aGlzIHN0cnVjdHVyZSwgaW5jbHVkaW5nCisgKglrZXkgZGF0YSkuCisgKgorICoJSWYgdGhlIG5ldyBrZXkgaXMgdGhlIGZpcnN0IGdyb3VwIGtleSwgaXQgd2lsbCBiZSBzZXQgYXMgdGhlIGRlZmF1bHQKKyAqCVRYIGtleS4gT3RoZXJ3aXNlLCBkZWZhdWx0IFRYIGtleSBpbmRleCBpcyBvbmx5IGNoYW5nZWQgaWYKKyAqCUlXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSBmbGFnIGlzIHNldC4KKyAqCisgKglLZXkgd2lsbCBiZSBjaGFuZ2VkIHdpdGggU0lPQ1NJV0VOQ09ERUVYVCBpbiBhbGwgY2FzZXMgZXhjZXB0IGZvcgorICoJc3BlY2lhbCAiY2hhbmdlIFRYIGtleSBpbmRleCIgb3BlcmF0aW9uIHdoaWNoIGlzIGluZGljYXRlZCBieSBzZXR0aW5nCisgKglrZXlfbGVuID0gMCBhbmQgZXh0X2ZsYWdzIHw9IElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWS4KKyAqCisgKgl0eF9zZXEvcnhfc2VxIGFyZSBvbmx5IHVzZWQgd2hlbiByZXNwZWN0aXZlCisgKglJV19FTkNPREVfRVhUX3tUWCxSWH1fU0VRX1ZBTElEIGZsYWcgaXMgc2V0IGluIGV4dF9mbGFncy4gTm9ybWFsCisgKglUS0lQL0NDTVAgb3BlcmF0aW9uIGlzIHRvIHNldCBSWCBzZXEgd2l0aCBTSU9DU0lXRU5DT0RFRVhUIGFuZCBzdGFydAorICoJVFggc2VxIGZyb20gemVybyB3aGVuZXZlciBrZXkgaXMgY2hhbmdlZC4gU0lPQ0dJV0VOQ09ERUVYVCBpcyBub3JtYWxseQorICoJdXNlZCBvbmx5IGJ5IGFuIEF1dGhlbnRpY2F0b3IgKEFQIG9yIGFuIElCU1Mgc3RhdGlvbikgdG8gZ2V0IHRoZQorICoJY3VycmVudCBUWCBzZXF1ZW5jZSBudW1iZXIuIFVzaW5nIFRYX1NFUV9WQUxJRCBmb3IgU0lPQ1NJV0VOQ09ERUVYVCBhbmQKKyAqCVJYX1NFUV9WQUxJRCBmb3IgU0lPQ0dJV0VOQ09ERUVYVCBhcmUgb3B0aW9uYWwsIGJ1dCBjYW4gYmUgdXNlZnVsIGZvcgorICoJZGVidWdnaW5nL3Rlc3RpbmcuCisgKi8KK3N0cnVjdAlpd19lbmNvZGVfZXh0Cit7CisJX191MzIJCWV4dF9mbGFnczsgLyogSVdfRU5DT0RFX0VYVF8qICovCisJX191OAkJdHhfc2VxW0lXX0VOQ09ERV9TRVFfTUFYX1NJWkVdOyAvKiBMU0IgZmlyc3QgKi8KKwlfX3U4CQlyeF9zZXFbSVdfRU5DT0RFX1NFUV9NQVhfU0laRV07IC8qIExTQiBmaXJzdCAqLworCXN0cnVjdCBzb2NrYWRkcglhZGRyOyAvKiBmZjpmZjpmZjpmZjpmZjpmZiBmb3IgYnJvYWRjYXN0L211bHRpY2FzdAorCQkJICAgICAgICogKGdyb3VwKSBrZXlzIG9yIHVuaWNhc3QgYWRkcmVzcyBmb3IKKwkJCSAgICAgICAqIGluZGl2aWR1YWwga2V5cyAqLworCV9fdTE2CQlhbGc7IC8qIElXX0VOQ09ERV9BTEdfKiAqLworCV9fdTE2CQlrZXlfbGVuOworCV9fdTgJCWtleVswXTsKK307CisKKy8qIFNJT0NTSVdNTE1FIGRhdGEgKi8KK3N0cnVjdAlpd19tbG1lCit7CisJX191MTYJCWNtZDsgLyogSVdfTUxNRV8qICovCisJX191MTYJCXJlYXNvbl9jb2RlOworCXN0cnVjdCBzb2NrYWRkcglhZGRyOworfTsKKworLyogU0lPQ1NJV1BNS1NBIGRhdGEgKi8KKyNkZWZpbmUgSVdfUE1LU0FfQURECQkxCisjZGVmaW5lIElXX1BNS1NBX1JFTU9WRQkJMgorI2RlZmluZSBJV19QTUtTQV9GTFVTSAkJMworCisjZGVmaW5lIElXX1BNS0lEX0xFTgkxNgorCitzdHJ1Y3QJaXdfcG1rc2EKK3sKKwlfX3UzMgkJY21kOyAvKiBJV19QTUtTQV8qICovCisJc3RydWN0IHNvY2thZGRyCWJzc2lkOworCV9fdTgJCXBta2lkW0lXX1BNS0lEX0xFTl07Cit9OworCisvKiBJV0VWTUlDSEFFTE1JQ0ZBSUxVUkUgZGF0YSAqLworc3RydWN0CWl3X21pY2hhZWxtaWNmYWlsdXJlCit7CisJX191MzIJCWZsYWdzOworCXN0cnVjdCBzb2NrYWRkcglzcmNfYWRkcjsKKwlfX3U4CQl0c2NbSVdfRU5DT0RFX1NFUV9NQVhfU0laRV07IC8qIExTQiBmaXJzdCAqLworfTsKKworLyogSVdFVlBNS0lEQ0FORCBkYXRhICovCisjZGVmaW5lIElXX1BNS0lEX0NBTkRfUFJFQVVUSAkweDAwMDAwMDAxIC8qIFJOUyBwcmUtYXV0aGVudGljYXRpb24gZW5hYmxlZCAqLworc3RydWN0CWl3X3Bta2lkX2NhbmQKK3sKKwlfX3UzMgkJZmxhZ3M7IC8qIElXX1BNS0lEX0NBTkRfKiAqLworCV9fdTMyCQlpbmRleDsgLyogdGhlIHNtYWxsZXIgdGhlIGluZGV4LCB0aGUgaGlnaGVyIHRoZQorCQkJCSogcHJpb3JpdHkgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIJYnNzaWQ7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV0lSRUxFU1MgU1RBVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogV2lyZWxlc3Mgc3RhdGlzdGljcyAodXNlZCBmb3IgL3Byb2MvbmV0L3dpcmVsZXNzKQorICovCitzdHJ1Y3QJaXdfc3RhdGlzdGljcworeworCV9fdTE2CQlzdGF0dXM7CQkvKiBTdGF0dXMKKwkJCQkJICogLSBkZXZpY2UgZGVwZW5kZW50IGZvciBub3cgKi8KKworCXN0cnVjdCBpd19xdWFsaXR5CXF1YWw7CQkvKiBRdWFsaXR5IG9mIHRoZSBsaW5rCisJCQkJCQkgKiAoaW5zdGFudC9tZWFuL21heCkgKi8KKwlzdHJ1Y3QgaXdfZGlzY2FyZGVkCWRpc2NhcmQ7CS8qIFBhY2tldCBkaXNjYXJkZWQgY291bnRzICovCisJc3RydWN0IGl3X21pc3NlZAltaXNzOwkJLyogUGFja2V0IG1pc3NlZCBjb3VudHMgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJT0NUTCBSRVFVRVNUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHBheWxvYWQgb2YgYW4gaW9jdGwsIGFuZCBpcyB1c2VkIAorICogYmVsb3cuCisgKgorICogTm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlIHNob3VsZCBmaXQgb24gdGhlIG1lbW9yeSBmb290cHJpbnQKKyAqIG9mIGl3cmVxICh3aGljaCBpcyB0aGUgc2FtZSBhcyBpZnJlcSksIHdoaWNoIG1lYW4gYSBtYXggc2l6ZSBvZgorICogMTYgb2N0ZXRzID0gMTI4IGJpdHMuIFdhcm5pbmcsIHBvaW50ZXJzIG1pZ2h0IGJlIDY0IGJpdHMgd2lkZS4uLgorICogWW91IHNob3VsZCBjaGVjayB0aGlzIHdoZW4gaW5jcmVhc2luZyB0aGUgc3RydWN0dXJlcyBkZWZpbmVkCisgKiBhYm92ZSBpbiB0aGlzIGZpbGUuLi4KKyAqLwordW5pb24JaXdyZXFfZGF0YQoreworCS8qIENvbmZpZyAtIGdlbmVyaWMgKi8KKwljaGFyCQluYW1lW0lGTkFNU0laXTsKKwkvKiBOYW1lIDogdXNlZCB0byB2ZXJpZnkgdGhlIHByZXNlbmNlIG9mICB3aXJlbGVzcyBleHRlbnNpb25zLgorCSAqIE5hbWUgb2YgdGhlIHByb3RvY29sL3Byb3ZpZGVyLi4uICovCisKKwlzdHJ1Y3QgaXdfcG9pbnQJZXNzaWQ7CQkvKiBFeHRlbmRlZCBuZXR3b3JrIG5hbWUgKi8KKwlzdHJ1Y3QgaXdfcGFyYW0JbndpZDsJCS8qIG5ldHdvcmsgaWQgKG9yIGRvbWFpbiAtIHRoZSBjZWxsKSAqLworCXN0cnVjdCBpd19mcmVxCWZyZXE7CQkvKiBmcmVxdWVuY3kgb3IgY2hhbm5lbCA6CisJCQkJCSAqIDAtMTAwMCA9IGNoYW5uZWwKKwkJCQkJICogPiAxMDAwID0gZnJlcXVlbmN5IGluIEh6ICovCisKKwlzdHJ1Y3QgaXdfcGFyYW0Jc2VuczsJCS8qIHNpZ25hbCBsZXZlbCB0aHJlc2hvbGQgKi8KKwlzdHJ1Y3QgaXdfcGFyYW0JYml0cmF0ZTsJLyogZGVmYXVsdCBiaXQgcmF0ZSAqLworCXN0cnVjdCBpd19wYXJhbQl0eHBvd2VyOwkvKiBkZWZhdWx0IHRyYW5zbWl0IHBvd2VyICovCisJc3RydWN0IGl3X3BhcmFtCXJ0czsJCS8qIFJUUyB0aHJlc2hvbGQgdGhyZXNob2xkICovCisJc3RydWN0IGl3X3BhcmFtCWZyYWc7CQkvKiBGcmFnbWVudGF0aW9uIHRocmVzaG9sZCAqLworCV9fdTMyCQltb2RlOwkJLyogT3BlcmF0aW9uIG1vZGUgKi8KKwlzdHJ1Y3QgaXdfcGFyYW0JcmV0cnk7CQkvKiBSZXRyeSBsaW1pdHMgJiBsaWZldGltZSAqLworCisJc3RydWN0IGl3X3BvaW50CWVuY29kaW5nOwkvKiBFbmNvZGluZyBzdHVmZiA6IHRva2VucyAqLworCXN0cnVjdCBpd19wYXJhbQlwb3dlcjsJCS8qIFBNIGR1cmF0aW9uL3RpbWVvdXQgKi8KKwlzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsOwkJLyogUXVhbGl0eSBwYXJ0IG9mIHN0YXRpc3RpY3MgKi8KKworCXN0cnVjdCBzb2NrYWRkcglhcF9hZGRyOwkvKiBBY2Nlc3MgcG9pbnQgYWRkcmVzcyAqLworCXN0cnVjdCBzb2NrYWRkcglhZGRyOwkJLyogRGVzdGluYXRpb24gYWRkcmVzcyAoaHcvbWFjKSAqLworCisJc3RydWN0IGl3X3BhcmFtCXBhcmFtOwkJLyogT3RoZXIgc21hbGwgcGFyYW1ldGVycyAqLworCXN0cnVjdCBpd19wb2ludAlkYXRhOwkJLyogT3RoZXIgbGFyZ2UgcGFyYW1ldGVycyAqLworfTsKKworLyoKKyAqIFRoZSBzdHJ1Y3R1cmUgdG8gZXhjaGFuZ2UgZGF0YSBmb3IgaW9jdGwuCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgc2FtZSBhcyAnc3RydWN0IGlmcmVxJywgYnV0IChyZSlkZWZpbmVkIGZvcgorICogY29udmVuaWVuY2UuLi4KKyAqIERvIEkgbmVlZCB0byByZW1pbmQgeW91IGFib3V0IHN0cnVjdHVyZSBzaXplICgzMiBvY3RldHMpID8KKyAqLworc3RydWN0CWl3cmVxIAoreworCXVuaW9uCisJeworCQljaGFyCWlmcm5fbmFtZVtJRk5BTVNJWl07CS8qIGlmIG5hbWUsIGUuZy4gImV0aDAiICovCisJfSBpZnJfaWZybjsKKworCS8qIERhdGEgcGFydCAoZGVmaW5lZCBqdXN0IGFib3ZlKSAqLworCXVuaW9uCWl3cmVxX2RhdGEJdTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElPQ1RMIERBVEEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKglGb3IgdGhvc2UgaW9jdGwgd2hpY2ggd2FudCB0byBleGNoYW5nZSBtb2RlIGRhdGEgdGhhdCB3aGF0IGNvdWxkCisgKglmaXQgaW4gdGhlIGFib3ZlIHN0cnVjdHVyZS4uLgorICovCisKKy8qCisgKglSYW5nZSBvZiBwYXJhbWV0ZXJzCisgKi8KKworc3RydWN0CWl3X3JhbmdlCit7CisJLyogSW5mb3JtYXRpdmUgc3R1ZmYgKHRvIGNob29zZSBiZXR3ZWVuIGRpZmZlcmVudCBpbnRlcmZhY2UpICovCisJX191MzIJCXRocm91Z2hwdXQ7CS8qIFRvIGdpdmUgYW4gaWRlYS4uLiAqLworCS8qIEluIHRoZW9yeSB0aGlzIHZhbHVlIHNob3VsZCBiZSB0aGUgbWF4aW11bSBiZW5jaG1hcmtlZAorCSAqIFRDUC9JUCB0aHJvdWdocHV0LCBiZWNhdXNlIHdpdGggbW9zdCBvZiB0aGVzZSBkZXZpY2VzIHRoZQorCSAqIGJpdCByYXRlIGlzIG1lYW5pbmdsZXNzIChvdmVyaGVhZCBhbiBjbykgdG8gZXN0aW1hdGUgaG93CisJICogZmFzdCB0aGUgY29ubmVjdGlvbiB3aWxsIGdvIGFuZCBwaWNrIHRoZSBmYXN0ZXN0IG9uZS4KKwkgKiBJIHN1Z2dlc3QgcGVvcGxlIHRvIHBsYXkgd2l0aCBOZXRwZXJmIG9yIGFueSBiZW5jaG1hcmsuLi4KKwkgKi8KKworCS8qIE5XSUQgKG9yIGRvbWFpbiBpZCkgKi8KKwlfX3UzMgkJbWluX253aWQ7CS8qIE1pbmltYWwgTldJRCB3ZSBhcmUgYWJsZSB0byBzZXQgKi8KKwlfX3UzMgkJbWF4X253aWQ7CS8qIE1heGltYWwgTldJRCB3ZSBhcmUgYWJsZSB0byBzZXQgKi8KKworCS8qIE9sZCBGcmVxdWVuY3kgKGJhY2t3YXJkIGNvbXBhdCAtIG1vdmVkIGxvd2VyICkgKi8KKwlfX3UxNgkJb2xkX251bV9jaGFubmVsczsKKwlfX3U4CQlvbGRfbnVtX2ZyZXF1ZW5jeTsKKworCS8qIFNjYW4gY2FwYWJpbGl0aWVzICovCisJX191OAkJc2Nhbl9jYXBhOyAJLyogSVdfU0NBTl9DQVBBXyogYml0IGZpZWxkICovCisKKwkvKiBXaXJlbGVzcyBldmVudCBjYXBhYmlsaXR5IGJpdG1hc2tzICovCisJX191MzIJCWV2ZW50X2NhcGFbNl07CisKKwkvKiBzaWduYWwgbGV2ZWwgdGhyZXNob2xkIHJhbmdlICovCisJX19zMzIJCXNlbnNpdGl2aXR5OworCisJLyogUXVhbGl0eSBvZiBsaW5rICYgU05SIHN0dWZmICovCisJLyogUXVhbGl0eSByYW5nZSAobGluaywgbGV2ZWwsIG5vaXNlKQorCSAqIElmIHRoZSBxdWFsaXR5IGlzIGFic29sdXRlLCBpdCB3aWxsIGJlIGluIHRoZSByYW5nZSBbMCA7IG1heF9xdWFsXSwKKwkgKiBpZiB0aGUgcXVhbGl0eSBpcyBkQm0sIGl0IHdpbGwgYmUgaW4gdGhlIHJhbmdlIFttYXhfcXVhbCA7IDBdLgorCSAqIERvbid0IGZvcmdldCB0aGF0IHdlIHVzZSA4IGJpdCBhcml0aG1ldGljcy4uLiAqLworCXN0cnVjdCBpd19xdWFsaXR5CW1heF9xdWFsOwkvKiBRdWFsaXR5IG9mIHRoZSBsaW5rICovCisJLyogVGhpcyBzaG91bGQgY29udGFpbiB0aGUgYXZlcmFnZS90eXBpY2FsIHZhbHVlcyBvZiB0aGUgcXVhbGl0eQorCSAqIGluZGljYXRvci4gVGhpcyBzaG91bGQgYmUgdGhlIHRocmVzaG9sZCBiZXR3ZWVuIGEgImdvb2QiIGFuZAorCSAqIGEgImJhZCIgbGluayAoZXhhbXBsZSA6IG1vbml0b3IgZ29pbmcgZnJvbSBncmVlbiB0byBvcmFuZ2UpLgorCSAqIEN1cnJlbnRseSwgdXNlciBzcGFjZSBhcHBzIGxpa2UgcXVhbGl0eSBtb25pdG9ycyBkb24ndCBoYXZlIGFueQorCSAqIHdheSB0byBjYWxpYnJhdGUgdGhlIG1lYXN1cmVtZW50LiBXaXRoIHRoaXMsIHRoZXkgY2FuIHNwbGl0CisJICogdGhlIHJhbmdlIGJldHdlZW4gMCBhbmQgbWF4X3F1YWwgaW4gZGlmZmVyZW50IHF1YWxpdHkgbGV2ZWwKKwkgKiAodXNpbmcgYSBnZW9tZXRyaWMgc3ViZGl2aXNpb24gY2VudGVyZWQgb24gdGhlIGF2ZXJhZ2UpLgorCSAqIEkgZXhwZWN0IHRoYXQgcGVvcGxlIGRvaW5nIHRoZSB1c2VyIHNwYWNlIGFwcHMgd2lsbCBmZWVkYmFjaworCSAqIHVzIG9uIHdoaWNoIHZhbHVlIHdlIG5lZWQgdG8gcHV0IGluIGVhY2ggZHJpdmVyLi4uICovCisJc3RydWN0IGl3X3F1YWxpdHkJYXZnX3F1YWw7CS8qIFF1YWxpdHkgb2YgdGhlIGxpbmsgKi8KKworCS8qIFJhdGVzICovCisJX191OAkJbnVtX2JpdHJhdGVzOwkvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbGlzdCAqLworCV9fczMyCQliaXRyYXRlW0lXX01BWF9CSVRSQVRFU107CS8qIGxpc3QsIGluIGJwcyAqLworCisJLyogUlRTIHRocmVzaG9sZCAqLworCV9fczMyCQltaW5fcnRzOwkvKiBNaW5pbWFsIFJUUyB0aHJlc2hvbGQgKi8KKwlfX3MzMgkJbWF4X3J0czsJLyogTWF4aW1hbCBSVFMgdGhyZXNob2xkICovCisKKwkvKiBGcmFnIHRocmVzaG9sZCAqLworCV9fczMyCQltaW5fZnJhZzsJLyogTWluaW1hbCBmcmFnIHRocmVzaG9sZCAqLworCV9fczMyCQltYXhfZnJhZzsJLyogTWF4aW1hbCBmcmFnIHRocmVzaG9sZCAqLworCisJLyogUG93ZXIgTWFuYWdlbWVudCBkdXJhdGlvbiAmIHRpbWVvdXQgKi8KKwlfX3MzMgkJbWluX3BtcDsJLyogTWluaW1hbCBQTSBwZXJpb2QgKi8KKwlfX3MzMgkJbWF4X3BtcDsJLyogTWF4aW1hbCBQTSBwZXJpb2QgKi8KKwlfX3MzMgkJbWluX3BtdDsJLyogTWluaW1hbCBQTSB0aW1lb3V0ICovCisJX19zMzIJCW1heF9wbXQ7CS8qIE1heGltYWwgUE0gdGltZW91dCAqLworCV9fdTE2CQlwbXBfZmxhZ3M7CS8qIEhvdyB0byBkZWNvZGUgbWF4L21pbiBQTSBwZXJpb2QgKi8KKwlfX3UxNgkJcG10X2ZsYWdzOwkvKiBIb3cgdG8gZGVjb2RlIG1heC9taW4gUE0gdGltZW91dCAqLworCV9fdTE2CQlwbV9jYXBhOwkvKiBXaGF0IFBNIG9wdGlvbnMgYXJlIHN1cHBvcnRlZCAqLworCisJLyogRW5jb2RlciBzdHVmZiAqLworCV9fdTE2CWVuY29kaW5nX3NpemVbSVdfTUFYX0VOQ09ESU5HX1NJWkVTXTsJLyogRGlmZmVyZW50IHRva2VuIHNpemVzICovCisJX191OAludW1fZW5jb2Rpbmdfc2l6ZXM7CS8qIE51bWJlciBvZiBlbnRyeSBpbiB0aGUgbGlzdCAqLworCV9fdTgJbWF4X2VuY29kaW5nX3Rva2VuczsJLyogTWF4IG51bWJlciBvZiB0b2tlbnMgKi8KKwkvKiBGb3IgZHJpdmVycyB0aGF0IG5lZWQgYSAibG9naW4vcGFzc3dkIiBmb3JtICovCisJX191OAllbmNvZGluZ19sb2dpbl9pbmRleDsJLyogdG9rZW4gaW5kZXggZm9yIGxvZ2luIHRva2VuICovCisKKwkvKiBUcmFuc21pdCBwb3dlciAqLworCV9fdTE2CQl0eHBvd2VyX2NhcGE7CS8qIFdoYXQgb3B0aW9ucyBhcmUgc3VwcG9ydGVkICovCisJX191OAkJbnVtX3R4cG93ZXI7CS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBsaXN0ICovCisJX19zMzIJCXR4cG93ZXJbSVdfTUFYX1RYUE9XRVJdOwkvKiBsaXN0LCBpbiBicHMgKi8KKworCS8qIFdpcmVsZXNzIEV4dGVuc2lvbiB2ZXJzaW9uIGluZm8gKi8KKwlfX3U4CQl3ZV92ZXJzaW9uX2NvbXBpbGVkOwkvKiBNdXN0IGJlIFdJUkVMRVNTX0VYVCAqLworCV9fdTgJCXdlX3ZlcnNpb25fc291cmNlOwkvKiBMYXN0IHVwZGF0ZSBvZiBzb3VyY2UgKi8KKworCS8qIFJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUgKi8KKwlfX3UxNgkJcmV0cnlfY2FwYTsJLyogV2hhdCByZXRyeSBvcHRpb25zIGFyZSBzdXBwb3J0ZWQgKi8KKwlfX3UxNgkJcmV0cnlfZmxhZ3M7CS8qIEhvdyB0byBkZWNvZGUgbWF4L21pbiByZXRyeSBsaW1pdCAqLworCV9fdTE2CQlyX3RpbWVfZmxhZ3M7CS8qIEhvdyB0byBkZWNvZGUgbWF4L21pbiByZXRyeSBsaWZlICovCisJX19zMzIJCW1pbl9yZXRyeTsJLyogTWluaW1hbCBudW1iZXIgb2YgcmV0cmllcyAqLworCV9fczMyCQltYXhfcmV0cnk7CS8qIE1heGltYWwgbnVtYmVyIG9mIHJldHJpZXMgKi8KKwlfX3MzMgkJbWluX3JfdGltZTsJLyogTWluaW1hbCByZXRyeSBsaWZldGltZSAqLworCV9fczMyCQltYXhfcl90aW1lOwkvKiBNYXhpbWFsIHJldHJ5IGxpZmV0aW1lICovCisKKwkvKiBGcmVxdWVuY3kgKi8KKwlfX3UxNgkJbnVtX2NoYW5uZWxzOwkvKiBOdW1iZXIgb2YgY2hhbm5lbHMgWzA7IG51bSAtIDFdICovCisJX191OAkJbnVtX2ZyZXF1ZW5jeTsJLyogTnVtYmVyIG9mIGVudHJ5IGluIHRoZSBsaXN0ICovCisJc3RydWN0IGl3X2ZyZXEJZnJlcVtJV19NQVhfRlJFUVVFTkNJRVNdOwkvKiBsaXN0ICovCisJLyogTm90ZSA6IHRoaXMgZnJlcXVlbmN5IGxpc3QgZG9lc24ndCBuZWVkIHRvIGZpdCBjaGFubmVsIG51bWJlcnMsCisJICogYmVjYXVzZSBlYWNoIGVudHJ5IGNvbnRhaW4gaXRzIGNoYW5uZWwgaW5kZXggKi8KKworCV9fdTMyCQllbmNfY2FwYTsJLyogSVdfRU5DX0NBUEFfKiBiaXQgZmllbGQgKi8KK307CisKKy8qCisgKiBQcml2YXRlIGlvY3RsIGludGVyZmFjZSBpbmZvcm1hdGlvbgorICovCisgCitzdHJ1Y3QJaXdfcHJpdl9hcmdzCit7CisJX191MzIJCWNtZDsJCS8qIE51bWJlciBvZiB0aGUgaW9jdGwgdG8gaXNzdWUgKi8KKwlfX3UxNgkJc2V0X2FyZ3M7CS8qIFR5cGUgYW5kIG51bWJlciBvZiBhcmdzICovCisJX191MTYJCWdldF9hcmdzOwkvKiBUeXBlIGFuZCBudW1iZXIgb2YgYXJncyAqLworCWNoYXIJCW5hbWVbSUZOQU1TSVpdOwkvKiBOYW1lIG9mIHRoZSBleHRlbnNpb24gKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdJUkVMRVNTIEVWRU5UUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFdpcmVsZXNzIGV2ZW50cyBhcmUgY2FycmllZCB0aHJvdWdoIHRoZSBydG5ldGxpbmsgc29ja2V0IHRvIHVzZXIKKyAqIHNwYWNlLiBUaGV5IGFyZSBlbmNhcHN1bGF0ZWQgaW4gdGhlIElGTEFfV0lSRUxFU1MgZmllbGQgb2YKKyAqIGEgUlRNX05FV0xJTksgbWVzc2FnZS4KKyAqLworCisvKgorICogQSBXaXJlbGVzcyBFdmVudC4gQ29udGFpbnMgYmFzaWNhbGx5IHRoZSBzYW1lIGRhdGEgYXMgdGhlIGlvY3RsLi4uCisgKi8KK3N0cnVjdCBpd19ldmVudAoreworCV9fdTE2CQlsZW47CQkJLyogUmVhbCBsZW5ndGggb2YgdGhpcyBzdHVmZiAqLworCV9fdTE2CQljbWQ7CQkJLyogV2lyZWxlc3MgSU9DVEwgKi8KKwl1bmlvbiBpd3JlcV9kYXRhCXU7CQkvKiBJT0NUTCBmaXhlZCBwYXlsb2FkICovCit9OworCisvKiBTaXplIG9mIHRoZSBFdmVudCBwcmVmaXggKGluY2x1ZGluZyBwYWRkaW5nIGFuZCBhbGlnbmVtZW50IGp1bmspICovCisjZGVmaW5lIElXX0VWX0xDUF9MRU4JKHNpemVvZihzdHJ1Y3QgaXdfZXZlbnQpIC0gc2l6ZW9mKHVuaW9uIGl3cmVxX2RhdGEpKQorLyogU2l6ZSBvZiB0aGUgdmFyaW91cyBldmVudHMgKi8KKyNkZWZpbmUgSVdfRVZfQ0hBUl9MRU4JKElXX0VWX0xDUF9MRU4gKyBJRk5BTVNJWikKKyNkZWZpbmUgSVdfRVZfVUlOVF9MRU4JKElXX0VWX0xDUF9MRU4gKyBzaXplb2YoX191MzIpKQorI2RlZmluZSBJV19FVl9GUkVRX0xFTgkoSVdfRVZfTENQX0xFTiArIHNpemVvZihzdHJ1Y3QgaXdfZnJlcSkpCisjZGVmaW5lIElXX0VWX1BBUkFNX0xFTgkoSVdfRVZfTENQX0xFTiArIHNpemVvZihzdHJ1Y3QgaXdfcGFyYW0pKQorI2RlZmluZSBJV19FVl9BRERSX0xFTgkoSVdfRVZfTENQX0xFTiArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKQorI2RlZmluZSBJV19FVl9RVUFMX0xFTgkoSVdfRVZfTENQX0xFTiArIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpCisKKy8qIGl3X3BvaW50IGV2ZW50cyBhcmUgc3BlY2lhbC4gRmlyc3QsIHRoZSBwYXlsb2FkIChleHRyYSBkYXRhKSBjb21lIGF0CisgKiB0aGUgZW5kIG9mIHRoZSBldmVudCwgc28gdGhleSBhcmUgYmlnZ2VyIHRoYW4gSVdfRVZfUE9JTlRfTEVOLiBTZWNvbmQsCisgKiB3ZSBvbWl0IHRoZSBwb2ludGVyLCBzbyBzdGFydCBhdCBhbiBvZmZzZXQuICovCisjZGVmaW5lIElXX0VWX1BPSU5UX09GRiAoKChjaGFyICopICYoKChzdHJ1Y3QgaXdfcG9pbnQgKikgTlVMTCktPmxlbmd0aCkpIC0gXAorCQkJICAoY2hhciAqKSBOVUxMKQorI2RlZmluZSBJV19FVl9QT0lOVF9MRU4JKElXX0VWX0xDUF9MRU4gKyBzaXplb2Yoc3RydWN0IGl3X3BvaW50KSAtIFwKKwkJCSBJV19FVl9QT0lOVF9PRkYpCisKKworLyogU2l6ZSBvZiB0aGUgRXZlbnQgcHJlZml4IHdoZW4gcGFja2VkIGluIHN0cmVhbSAqLworI2RlZmluZSBJV19FVl9MQ1BfUEtfTEVOCSg0KQorLyogU2l6ZSBvZiB0aGUgdmFyaW91cyBldmVudHMgd2hlbiBwYWNrZWQgaW4gc3RyZWFtICovCisjZGVmaW5lIElXX0VWX0NIQVJfUEtfTEVOCShJV19FVl9MQ1BfUEtfTEVOICsgSUZOQU1TSVopCisjZGVmaW5lIElXX0VWX1VJTlRfUEtfTEVOCShJV19FVl9MQ1BfUEtfTEVOICsgc2l6ZW9mKF9fdTMyKSkKKyNkZWZpbmUgSVdfRVZfRlJFUV9QS19MRU4JKElXX0VWX0xDUF9QS19MRU4gKyBzaXplb2Yoc3RydWN0IGl3X2ZyZXEpKQorI2RlZmluZSBJV19FVl9QQVJBTV9QS19MRU4JKElXX0VWX0xDUF9QS19MRU4gKyBzaXplb2Yoc3RydWN0IGl3X3BhcmFtKSkKKyNkZWZpbmUgSVdfRVZfQUREUl9QS19MRU4JKElXX0VWX0xDUF9QS19MRU4gKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSkKKyNkZWZpbmUgSVdfRVZfUVVBTF9QS19MRU4JKElXX0VWX0xDUF9QS19MRU4gKyBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpKQorI2RlZmluZSBJV19FVl9QT0lOVF9QS19MRU4JKElXX0VWX0xDUF9QS19MRU4gKyA0KQorCisjZW5kaWYJLyogX0xJTlVYX1dJUkVMRVNTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgveDI1LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3gyNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMGNjZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3gyNS5oCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogVGhlc2UgYXJlIHRoZSBwdWJsaWMgZWxlbWVudHMgb2YgdGhlIExpbnV4IGtlcm5lbCBYLjI1IGltcGxlbWVudGF0aW9uLgorICoKKyAqIAlIaXN0b3J5CisgKgltYXIvMjAvMDAJRGFuaWVsYSBTcXVhc3NvbmkgRGlzYWJsaW5nL2VuYWJsaW5nIG9mIGZhY2lsaXRpZXMgCisgKgkJCQkJICBuZWdvdGlhdGlvbi4KKyAqCWFwci8wMi8wNQlTaGF1biBQZXJlaXJhIFNlbGVjdGl2ZSBzdWIgYWRkcmVzcyBtYXRjaGluZyB3aXRoCisgKgkJCQkJY2FsbCB1c2VyIGRhdGEKKyAqLworCisjaWZuZGVmCVgyNV9LRVJORUxfSAorI2RlZmluZQlYMjVfS0VSTkVMX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisKKyNkZWZpbmUJU0lPQ1gyNUdTVUJTQ1JJUAkoU0lPQ1BST1RPUFJJVkFURSArIDApCisjZGVmaW5lCVNJT0NYMjVTU1VCU0NSSVAJKFNJT0NQUk9UT1BSSVZBVEUgKyAxKQorI2RlZmluZQlTSU9DWDI1R0ZBQ0lMSVRJRVMJKFNJT0NQUk9UT1BSSVZBVEUgKyAyKQorI2RlZmluZQlTSU9DWDI1U0ZBQ0lMSVRJRVMJKFNJT0NQUk9UT1BSSVZBVEUgKyAzKQorI2RlZmluZQlTSU9DWDI1R0NBTExVU0VSREFUQQkoU0lPQ1BST1RPUFJJVkFURSArIDQpCisjZGVmaW5lCVNJT0NYMjVTQ0FMTFVTRVJEQVRBCShTSU9DUFJPVE9QUklWQVRFICsgNSkKKyNkZWZpbmUJU0lPQ1gyNUdDQVVTRURJQUcJKFNJT0NQUk9UT1BSSVZBVEUgKyA2KQorI2RlZmluZSBTSU9DWDI1U0NVRE1BVENITEVOCShTSU9DUFJPVE9QUklWQVRFICsgNykKKyNkZWZpbmUgU0lPQ1gyNUNBTExBQ0NQVEFQUFJWICAgKFNJT0NQUk9UT1BSSVZBVEUgKyA4KQorI2RlZmluZSBTSU9DWDI1U0VORENBTExBQ0NQVCAgICAoU0lPQ1BST1RPUFJJVkFURSArIDkpCisjZGVmaW5lIFNJT0NYMjVHRFRFRkFDSUxJVElFUyAoU0lPQ1BST1RPUFJJVkFURSArIDEwKQorI2RlZmluZSBTSU9DWDI1U0RURUZBQ0lMSVRJRVMgKFNJT0NQUk9UT1BSSVZBVEUgKyAxMSkKKyNkZWZpbmUgU0lPQ1gyNVNDQVVTRURJQUcJKFNJT0NQUk9UT1BSSVZBVEUgKyAxMikKKworLyoKKyAqCVZhbHVlcyBmb3Ige2dldCxzZXR9c29ja29wdC4KKyAqLworI2RlZmluZQlYMjVfUUJJVElOQ0wJCTEKKworLyoKKyAqCVguMjUgUGFja2V0IFNpemUgdmFsdWVzLgorICovCisjZGVmaW5lCVgyNV9QUzE2CQk0CisjZGVmaW5lCVgyNV9QUzMyCQk1CisjZGVmaW5lCVgyNV9QUzY0CQk2CisjZGVmaW5lCVgyNV9QUzEyOAkJNworI2RlZmluZQlYMjVfUFMyNTYJCTgKKyNkZWZpbmUJWDI1X1BTNTEyCQk5CisjZGVmaW5lCVgyNV9QUzEwMjQJCTEwCisjZGVmaW5lCVgyNV9QUzIwNDgJCTExCisjZGVmaW5lCVgyNV9QUzQwOTYJCTEyCisKKy8qCisgKiBBbiBYLjEyMSBhZGRyZXNzLCBpdCBpcyBoZWxkIGFzIEFTQ0lJIHRleHQsIG51bGwgdGVybWluYXRlZCwgdXAgdG8gMTUKKyAqIGRpZ2l0cyBhbmQgYSBudWxsIHRlcm1pbmF0b3IuCisgKi8KK3N0cnVjdCB4MjVfYWRkcmVzcyB7CisJY2hhciB4MjVfYWRkclsxNl07Cit9OworCisvKgorICoJTGludXggWC4yNSBBZGRyZXNzIHN0cnVjdHVyZSwgdXNlZCBmb3IgYmluZCwgYW5kIGNvbm5lY3QgbW9zdGx5LgorICovCitzdHJ1Y3Qgc29ja2FkZHJfeDI1IHsKKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCBzeDI1X2ZhbWlseTsJLyogTXVzdCBiZSBBRl9YMjUgKi8KKwlzdHJ1Y3QgeDI1X2FkZHJlc3Mgc3gyNV9hZGRyOwkJLyogWC4xMjEgQWRkcmVzcyAqLworfTsKKworLyoKKyAqCURURS9EQ0Ugc3Vic2NyaXB0aW9uIG9wdGlvbnMuCisgKgorICogICAgICBBcyB0aGlzIGlzIG1pc3NpbmcgbG90cyBvZiBvcHRpb25zLCB1c2VyIHNob3VsZCBleHBlY3QgbWFqb3IKKyAqCWNoYW5nZXMgb2YgdGhpcyBzdHJ1Y3R1cmUgaW4gMi41Lnggd2hpY2ggbWlnaHQgYnJlYWsgY29tcGF0aWJpbHR5LgorICogICAgICBUaGUgc29tZXdoYXQgdWdseSBkaW1lbnNpb24gMjAwLXNpemVvZigpIGlzIG5lZWRlZCB0byBtYWludGFpbgorICoJYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAqLworc3RydWN0IHgyNV9zdWJzY3JpcF9zdHJ1Y3QgeworCWNoYXIgZGV2aWNlWzIwMC1zaXplb2YodW5zaWduZWQgbG9uZyldOworCXVuc2lnbmVkIGxvbmcJZ2xvYmFsX2ZhY2lsX21hc2s7CS8qIDAgdG8gZGlzYWJsZSBuZWdvdGlhdGlvbiAqLworCXVuc2lnbmVkIGludAlleHRlbmRlZDsKK307CisKKy8qIHZhbHVlcyBmb3IgYWJvdmUgZ2xvYmFsX2ZhY2lsX21hc2sgKi8KKworI2RlZmluZQlYMjVfTUFTS19SRVZFUlNFCTB4MDEJCisjZGVmaW5lCVgyNV9NQVNLX1RIUk9VR0hQVVQJMHgwMgorI2RlZmluZQlYMjVfTUFTS19QQUNLRVRfU0laRQkweDA0CisjZGVmaW5lCVgyNV9NQVNLX1dJTkRPV19TSVpFCTB4MDgKKworI2RlZmluZSBYMjVfTUFTS19DQUxMSU5HX0FFIDB4MTAKKyNkZWZpbmUgWDI1X01BU0tfQ0FMTEVEX0FFIDB4MjAKKworCisvKgorICoJUm91dGluZyB0YWJsZSBjb250cm9sIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHgyNV9yb3V0ZV9zdHJ1Y3QgeworCXN0cnVjdCB4MjVfYWRkcmVzcyBhZGRyZXNzOworCXVuc2lnbmVkIGludAkgICBzaWdkaWdpdHM7CisJY2hhcgkJICAgZGV2aWNlWzIwMF07Cit9OworCisvKgorICoJRmFjaWxpdGllcyBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCB4MjVfZmFjaWxpdGllcyB7CisJdW5zaWduZWQgaW50CXdpbnNpemVfaW4sIHdpbnNpemVfb3V0OworCXVuc2lnbmVkIGludAlwYWNzaXplX2luLCBwYWNzaXplX291dDsKKwl1bnNpZ25lZCBpbnQJdGhyb3VnaHB1dDsKKwl1bnNpZ25lZCBpbnQJcmV2ZXJzZTsKK307CisKKy8qCisqIElUVSBEVEUgZmFjaWxpdGllcworKiBPbmx5IHRoZSBjYWxsZWQgYW5kIGNhbGxpbmcgYWRkcmVzcworKiBleHRlbnNpb24gYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZC4KKyogVGhlIHJlc3QgYXJlIGluIHBsYWNlIHRvIGF2b2lkIHRoZSBzdHJ1Y3QKKyogY2hhbmdpbmcgc2l6ZSBpZiBzb21lb25lIG5lZWRzIHRoZW0gbGF0ZXIKKyovCisKK3N0cnVjdCB4MjVfZHRlX2ZhY2lsaXRpZXMgeworCV9fdTE2IGRlbGF5X2N1bXVsOworCV9fdTE2IGRlbGF5X3RhcmdldDsKKwlfX3UxNiBkZWxheV9tYXg7CisJX191OCBtaW5fdGhyb3VnaHB1dDsKKwlfX3U4IGV4cGVkaXRlZDsKKwlfX3U4IGNhbGxpbmdfbGVuOworCV9fdTggY2FsbGVkX2xlbjsKKwlfX3U4IGNhbGxpbmdfYWVbMjBdOworCV9fdTggY2FsbGVkX2FlWzIwXTsKK307CisKKy8qCisgKglDYWxsIFVzZXIgRGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCB4MjVfY2FsbHVzZXJkYXRhIHsKKwl1bnNpZ25lZCBpbnQJY3VkbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIJY3VkZGF0YVsxMjhdOworfTsKKworLyoKKyAqCUNhbGwgY2xlYXJpbmcgQ2F1c2UgYW5kIERpYWdub3N0aWMgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgeDI1X2NhdXNlZGlhZyB7CisJdW5zaWduZWQgY2hhcgljYXVzZTsKKwl1bnNpZ25lZCBjaGFyCWRpYWdub3N0aWM7Cit9OworCisvKgorICoJRnVydGhlciBvcHRpb25hbCBjYWxsIHVzZXIgZGF0YSBtYXRjaCBsZW5ndGggc2VsZWN0aW9uCisgKi8KK3N0cnVjdCB4MjVfc3ViYWRkciB7CisJdW5zaWduZWQgaW50IGN1ZG1hdGNobGVuZ3RoOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3hhdHRyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3hhdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2MjUzNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgveGF0dHIuaApAQCAtMCwwICsxLDYxIEBACisvKgorICBGaWxlOiBsaW51eC94YXR0ci5oCisKKyAgRXh0ZW5kZWQgYXR0cmlidXRlcyBoYW5kbGluZy4KKworICBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgQW5kcmVhcyBHcnVlbmJhY2hlciA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CisgIENvcHlyaWdodCAoYykgMjAwMS0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgIENvcHlyaWdodCAoYykgMjAwNCBSZWQgSGF0LCBJbmMuLCBKYW1lcyBNb3JyaXMgPGptb3JyaXNAcmVkaGF0LmNvbT4KKyovCisjaWZuZGVmIF9MSU5VWF9YQVRUUl9ICisjZGVmaW5lIF9MSU5VWF9YQVRUUl9ICisKKyNkZWZpbmUgWEFUVFJfQ1JFQVRFCTB4MQkvKiBzZXQgdmFsdWUsIGZhaWwgaWYgYXR0ciBhbHJlYWR5IGV4aXN0cyAqLworI2RlZmluZSBYQVRUUl9SRVBMQUNFCTB4MgkvKiBzZXQgdmFsdWUsIGZhaWwgaWYgYXR0ciBkb2VzIG5vdCBleGlzdCAqLworCisvKiBOYW1lc3BhY2VzICovCisjZGVmaW5lIFhBVFRSX09TMl9QUkVGSVggIm9zMi4iCisjZGVmaW5lIFhBVFRSX09TMl9QUkVGSVhfTEVOIChzaXplb2YgKFhBVFRSX09TMl9QUkVGSVgpIC0gMSkKKworI2RlZmluZSBYQVRUUl9TRUNVUklUWV9QUkVGSVgJInNlY3VyaXR5LiIKKyNkZWZpbmUgWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9TRUNVUklUWV9QUkVGSVgpIC0gMSkKKworI2RlZmluZSBYQVRUUl9TWVNURU1fUFJFRklYICJzeXN0ZW0uIgorI2RlZmluZSBYQVRUUl9TWVNURU1fUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9TWVNURU1fUFJFRklYKSAtIDEpCisKKyNkZWZpbmUgWEFUVFJfVFJVU1RFRF9QUkVGSVggInRydXN0ZWQuIgorI2RlZmluZSBYQVRUUl9UUlVTVEVEX1BSRUZJWF9MRU4gKHNpemVvZiAoWEFUVFJfVFJVU1RFRF9QUkVGSVgpIC0gMSkKKworI2RlZmluZSBYQVRUUl9VU0VSX1BSRUZJWCAidXNlci4iCisjZGVmaW5lIFhBVFRSX1VTRVJfUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9VU0VSX1BSRUZJWCkgLSAxKQorCisvKiBTZWN1cml0eSBuYW1lc3BhY2UgKi8KKyNkZWZpbmUgWEFUVFJfRVZNX1NVRkZJWCAiZXZtIgorI2RlZmluZSBYQVRUUl9OQU1FX0VWTSBYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfRVZNX1NVRkZJWAorCisjZGVmaW5lIFhBVFRSX1NFTElOVVhfU1VGRklYICJzZWxpbnV4IgorI2RlZmluZSBYQVRUUl9OQU1FX1NFTElOVVggWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX1NFTElOVVhfU1VGRklYCisKKyNkZWZpbmUgWEFUVFJfU01BQ0tfU1VGRklYICJTTUFDSzY0IgorI2RlZmluZSBYQVRUUl9TTUFDS19JUElOICJTTUFDSzY0SVBJTiIKKyNkZWZpbmUgWEFUVFJfU01BQ0tfSVBPVVQgIlNNQUNLNjRJUE9VVCIKKyNkZWZpbmUgWEFUVFJfU01BQ0tfRVhFQyAiU01BQ0s2NEVYRUMiCisjZGVmaW5lIFhBVFRSX1NNQUNLX1RSQU5TTVVURSAiU01BQ0s2NFRSQU5TTVVURSIKKyNkZWZpbmUgWEFUVFJfU01BQ0tfTU1BUCAiU01BQ0s2NE1NQVAiCisjZGVmaW5lIFhBVFRSX05BTUVfU01BQ0sgWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX1NNQUNLX1NVRkZJWAorI2RlZmluZSBYQVRUUl9OQU1FX1NNQUNLSVBJTglYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU01BQ0tfSVBJTgorI2RlZmluZSBYQVRUUl9OQU1FX1NNQUNLSVBPVVQJWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX1NNQUNLX0lQT1VUCisjZGVmaW5lIFhBVFRSX05BTUVfU01BQ0tFWEVDCVhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TTUFDS19FWEVDCisjZGVmaW5lIFhBVFRSX05BTUVfU01BQ0tUUkFOU01VVEUgWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX1NNQUNLX1RSQU5TTVVURQorI2RlZmluZSBYQVRUUl9OQU1FX1NNQUNLTU1BUCBYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU01BQ0tfTU1BUAorCisjZGVmaW5lIFhBVFRSX0NBUFNfU1VGRklYICJjYXBhYmlsaXR5IgorI2RlZmluZSBYQVRUUl9OQU1FX0NBUFMgWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX0NBUFNfU1VGRklYCisKKyNkZWZpbmUgWEFUVFJfUE9TSVhfQUNMX0FDQ0VTUyAgInBvc2l4X2FjbF9hY2Nlc3MiCisjZGVmaW5lIFhBVFRSX05BTUVfUE9TSVhfQUNMX0FDQ0VTUyBYQVRUUl9TWVNURU1fUFJFRklYIFhBVFRSX1BPU0lYX0FDTF9BQ0NFU1MKKyNkZWZpbmUgWEFUVFJfUE9TSVhfQUNMX0RFRkFVTFQgICJwb3NpeF9hY2xfZGVmYXVsdCIKKyNkZWZpbmUgWEFUVFJfTkFNRV9QT1NJWF9BQ0xfREVGQVVMVCBYQVRUUl9TWVNURU1fUFJFRklYIFhBVFRSX1BPU0lYX0FDTF9ERUZBVUxUCisKKworI2VuZGlmCS8qIF9MSU5VWF9YQVRUUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3hmcm0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgveGZybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYTM4MDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3hmcm0uaApAQCAtMCwwICsxLDUwMiBAQAorI2lmbmRlZiBfTElOVVhfWEZSTV9ICisjZGVmaW5lIF9MSU5VWF9YRlJNX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEFsbCBvZiB0aGUgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgbWF5IG5vdCBjaGFuZ2Ugc2l6ZSBhcyB0aGV5IGFyZQorICogcGFzc2VkIGludG8gdGhlIGtlcm5lbCBmcm9tIHVzZXJzcGFjZSB2aWEgbmV0bGluayBzb2NrZXRzLgorICovCisKKy8qIFN0cnVjdHVyZSB0byBlbmNhcHN1bGF0ZSBhZGRyZXNzZXMuIEkgZG8gbm90IHdhbnQgdG8gdXNlCisgKiAic3RhbmRhcmQiIHN0cnVjdHVyZS4gTXkgYXBvbG9naWVzLgorICovCit0eXBlZGVmIHVuaW9uIHsKKwlfX2JlMzIJCWE0OworCV9fYmUzMgkJYTZbNF07Cit9IHhmcm1fYWRkcmVzc190OworCisvKiBJZGVudCBvZiBhIHNwZWNpZmljIHhmcm1fc3RhdGUuIEl0IGlzIHVzZWQgb24gaW5wdXQgdG8gbG9va3VwCisgKiB0aGUgc3RhdGUgYnkgKHNwaSxkYWRkcixhaC9lc3ApIG9yIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0CisgKiBzcGksIHByb3RvY29sIGFuZCB0dW5uZWwgYWRkcmVzcyBvbiBvdXRwdXQuCisgKi8KK3N0cnVjdCB4ZnJtX2lkIHsKKwl4ZnJtX2FkZHJlc3NfdAlkYWRkcjsKKwlfX2JlMzIJCXNwaTsKKwlfX3U4CQlwcm90bzsKK307CisKK3N0cnVjdCB4ZnJtX3NlY19jdHggeworCV9fdTgJY3R4X2RvaTsKKwlfX3U4CWN0eF9hbGc7CisJX191MTYJY3R4X2xlbjsKKwlfX3UzMgljdHhfc2lkOworCWNoYXIJY3R4X3N0clswXTsKK307CisKKy8qIFNlY3VyaXR5IENvbnRleHQgRG9tYWlucyBvZiBJbnRlcnByZXRhdGlvbiAqLworI2RlZmluZSBYRlJNX1NDX0RPSV9SRVNFUlZFRCAwCisjZGVmaW5lIFhGUk1fU0NfRE9JX0xTTSAxCisKKy8qIFNlY3VyaXR5IENvbnRleHQgQWxnb3JpdGhtcyAqLworI2RlZmluZSBYRlJNX1NDX0FMR19SRVNFUlZFRCAwCisjZGVmaW5lIFhGUk1fU0NfQUxHX1NFTElOVVggMQorCisvKiBTZWxlY3RvciwgdXNlZCBhcyBzZWxlY3RvciBib3RoIG9uIHBvbGljeSBydWxlcyAoU1BEKSBhbmQgU0FzLiAqLworCitzdHJ1Y3QgeGZybV9zZWxlY3RvciB7CisJeGZybV9hZGRyZXNzX3QJZGFkZHI7CisJeGZybV9hZGRyZXNzX3QJc2FkZHI7CisJX19iZTE2CWRwb3J0OworCV9fYmUxNglkcG9ydF9tYXNrOworCV9fYmUxNglzcG9ydDsKKwlfX2JlMTYJc3BvcnRfbWFzazsKKwlfX3UxNglmYW1pbHk7CisJX191OAlwcmVmaXhsZW5fZDsKKwlfX3U4CXByZWZpeGxlbl9zOworCV9fdTgJcHJvdG87CisJaW50CWlmaW5kZXg7CisJX19rZXJuZWxfdWlkMzJfdAl1c2VyOworfTsKKworI2RlZmluZSBYRlJNX0lORiAofihfX3U2NCkwKQorCitzdHJ1Y3QgeGZybV9saWZldGltZV9jZmcgeworCV9fdTY0CXNvZnRfYnl0ZV9saW1pdDsKKwlfX3U2NAloYXJkX2J5dGVfbGltaXQ7CisJX191NjQJc29mdF9wYWNrZXRfbGltaXQ7CisJX191NjQJaGFyZF9wYWNrZXRfbGltaXQ7CisJX191NjQJc29mdF9hZGRfZXhwaXJlc19zZWNvbmRzOworCV9fdTY0CWhhcmRfYWRkX2V4cGlyZXNfc2Vjb25kczsKKwlfX3U2NAlzb2Z0X3VzZV9leHBpcmVzX3NlY29uZHM7CisJX191NjQJaGFyZF91c2VfZXhwaXJlc19zZWNvbmRzOworfTsKKworc3RydWN0IHhmcm1fbGlmZXRpbWVfY3VyIHsKKwlfX3U2NAlieXRlczsKKwlfX3U2NAlwYWNrZXRzOworCV9fdTY0CWFkZF90aW1lOworCV9fdTY0CXVzZV90aW1lOworfTsKKworc3RydWN0IHhmcm1fcmVwbGF5X3N0YXRlIHsKKwlfX3UzMglvc2VxOworCV9fdTMyCXNlcTsKKwlfX3UzMgliaXRtYXA7Cit9OworCitzdHJ1Y3QgeGZybV9yZXBsYXlfc3RhdGVfZXNuIHsKKwl1bnNpZ25lZCBpbnQJYm1wX2xlbjsKKwlfX3UzMgkJb3NlcTsKKwlfX3UzMgkJc2VxOworCV9fdTMyCQlvc2VxX2hpOworCV9fdTMyCQlzZXFfaGk7CisJX191MzIJCXJlcGxheV93aW5kb3c7CisJX191MzIJCWJtcFswXTsKK307CisKK3N0cnVjdCB4ZnJtX2FsZ28geworCWNoYXIJCWFsZ19uYW1lWzY0XTsKKwl1bnNpZ25lZCBpbnQJYWxnX2tleV9sZW47ICAgIC8qIGluIGJpdHMgKi8KKwljaGFyCQlhbGdfa2V5WzBdOworfTsKKworc3RydWN0IHhmcm1fYWxnb19hdXRoIHsKKwljaGFyCQlhbGdfbmFtZVs2NF07CisJdW5zaWduZWQgaW50CWFsZ19rZXlfbGVuOyAgICAvKiBpbiBiaXRzICovCisJdW5zaWduZWQgaW50CWFsZ190cnVuY19sZW47ICAvKiBpbiBiaXRzICovCisJY2hhcgkJYWxnX2tleVswXTsKK307CisKK3N0cnVjdCB4ZnJtX2FsZ29fYWVhZCB7CisJY2hhcgkJYWxnX25hbWVbNjRdOworCXVuc2lnbmVkIGludAlhbGdfa2V5X2xlbjsJLyogaW4gYml0cyAqLworCXVuc2lnbmVkIGludAlhbGdfaWN2X2xlbjsJLyogaW4gYml0cyAqLworCWNoYXIJCWFsZ19rZXlbMF07Cit9OworCitzdHJ1Y3QgeGZybV9zdGF0cyB7CisJX191MzIJcmVwbGF5X3dpbmRvdzsKKwlfX3UzMglyZXBsYXk7CisJX191MzIJaW50ZWdyaXR5X2ZhaWxlZDsKK307CisKK2VudW0geworCVhGUk1fUE9MSUNZX1RZUEVfTUFJTgk9IDAsCisJWEZSTV9QT0xJQ1lfVFlQRV9TVUIJPSAxLAorCVhGUk1fUE9MSUNZX1RZUEVfTUFYCT0gMiwKKwlYRlJNX1BPTElDWV9UWVBFX0FOWQk9IDI1NQorfTsKKworZW51bSB7CisJWEZSTV9QT0xJQ1lfSU4JPSAwLAorCVhGUk1fUE9MSUNZX09VVAk9IDEsCisJWEZSTV9QT0xJQ1lfRldECT0gMiwKKwlYRlJNX1BPTElDWV9NQVNLID0gMywKKwlYRlJNX1BPTElDWV9NQVgJPSAzCit9OworCitlbnVtIHsKKwlYRlJNX1NIQVJFX0FOWSwJCS8qIE5vIGxpbWl0YXRpb25zICovCisJWEZSTV9TSEFSRV9TRVNTSU9OLAkvKiBGb3IgdGhpcyBzZXNzaW9uIG9ubHkgKi8KKwlYRlJNX1NIQVJFX1VTRVIsCS8qIEZvciB0aGlzIHVzZXIgb25seSAqLworCVhGUk1fU0hBUkVfVU5JUVVFCS8qIFVzZSBvbmNlICovCit9OworCisjZGVmaW5lIFhGUk1fTU9ERV9UUkFOU1BPUlQgMAorI2RlZmluZSBYRlJNX01PREVfVFVOTkVMIDEKKyNkZWZpbmUgWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIDIKKyNkZWZpbmUgWEZSTV9NT0RFX0lOX1RSSUdHRVIgMworI2RlZmluZSBYRlJNX01PREVfQkVFVCA0CisjZGVmaW5lIFhGUk1fTU9ERV9NQVggNQorCisvKiBOZXRsaW5rIGNvbmZpZ3VyYXRpb24gbWVzc2FnZXMuICAqLworZW51bSB7CisJWEZSTV9NU0dfQkFTRSA9IDB4MTAsCisKKwlYRlJNX01TR19ORVdTQSA9IDB4MTAsCisjZGVmaW5lIFhGUk1fTVNHX05FV1NBIFhGUk1fTVNHX05FV1NBCisJWEZSTV9NU0dfREVMU0EsCisjZGVmaW5lIFhGUk1fTVNHX0RFTFNBIFhGUk1fTVNHX0RFTFNBCisJWEZSTV9NU0dfR0VUU0EsCisjZGVmaW5lIFhGUk1fTVNHX0dFVFNBIFhGUk1fTVNHX0dFVFNBCisKKwlYRlJNX01TR19ORVdQT0xJQ1ksCisjZGVmaW5lIFhGUk1fTVNHX05FV1BPTElDWSBYRlJNX01TR19ORVdQT0xJQ1kKKwlYRlJNX01TR19ERUxQT0xJQ1ksCisjZGVmaW5lIFhGUk1fTVNHX0RFTFBPTElDWSBYRlJNX01TR19ERUxQT0xJQ1kKKwlYRlJNX01TR19HRVRQT0xJQ1ksCisjZGVmaW5lIFhGUk1fTVNHX0dFVFBPTElDWSBYRlJNX01TR19HRVRQT0xJQ1kKKworCVhGUk1fTVNHX0FMTE9DU1BJLAorI2RlZmluZSBYRlJNX01TR19BTExPQ1NQSSBYRlJNX01TR19BTExPQ1NQSQorCVhGUk1fTVNHX0FDUVVJUkUsCisjZGVmaW5lIFhGUk1fTVNHX0FDUVVJUkUgWEZSTV9NU0dfQUNRVUlSRQorCVhGUk1fTVNHX0VYUElSRSwKKyNkZWZpbmUgWEZSTV9NU0dfRVhQSVJFIFhGUk1fTVNHX0VYUElSRQorCisJWEZSTV9NU0dfVVBEUE9MSUNZLAorI2RlZmluZSBYRlJNX01TR19VUERQT0xJQ1kgWEZSTV9NU0dfVVBEUE9MSUNZCisJWEZSTV9NU0dfVVBEU0EsCisjZGVmaW5lIFhGUk1fTVNHX1VQRFNBIFhGUk1fTVNHX1VQRFNBCisKKwlYRlJNX01TR19QT0xFWFBJUkUsCisjZGVmaW5lIFhGUk1fTVNHX1BPTEVYUElSRSBYRlJNX01TR19QT0xFWFBJUkUKKworCVhGUk1fTVNHX0ZMVVNIU0EsCisjZGVmaW5lIFhGUk1fTVNHX0ZMVVNIU0EgWEZSTV9NU0dfRkxVU0hTQQorCVhGUk1fTVNHX0ZMVVNIUE9MSUNZLAorI2RlZmluZSBYRlJNX01TR19GTFVTSFBPTElDWSBYRlJNX01TR19GTFVTSFBPTElDWQorCisJWEZSTV9NU0dfTkVXQUUsCisjZGVmaW5lIFhGUk1fTVNHX05FV0FFIFhGUk1fTVNHX05FV0FFCisJWEZSTV9NU0dfR0VUQUUsCisjZGVmaW5lIFhGUk1fTVNHX0dFVEFFIFhGUk1fTVNHX0dFVEFFCisKKwlYRlJNX01TR19SRVBPUlQsCisjZGVmaW5lIFhGUk1fTVNHX1JFUE9SVCBYRlJNX01TR19SRVBPUlQKKworCVhGUk1fTVNHX01JR1JBVEUsCisjZGVmaW5lIFhGUk1fTVNHX01JR1JBVEUgWEZSTV9NU0dfTUlHUkFURQorCisJWEZSTV9NU0dfTkVXU0FESU5GTywKKyNkZWZpbmUgWEZSTV9NU0dfTkVXU0FESU5GTyBYRlJNX01TR19ORVdTQURJTkZPCisJWEZSTV9NU0dfR0VUU0FESU5GTywKKyNkZWZpbmUgWEZSTV9NU0dfR0VUU0FESU5GTyBYRlJNX01TR19HRVRTQURJTkZPCisKKwlYRlJNX01TR19ORVdTUERJTkZPLAorI2RlZmluZSBYRlJNX01TR19ORVdTUERJTkZPIFhGUk1fTVNHX05FV1NQRElORk8KKwlYRlJNX01TR19HRVRTUERJTkZPLAorI2RlZmluZSBYRlJNX01TR19HRVRTUERJTkZPIFhGUk1fTVNHX0dFVFNQRElORk8KKworCVhGUk1fTVNHX01BUFBJTkcsCisjZGVmaW5lIFhGUk1fTVNHX01BUFBJTkcgWEZSTV9NU0dfTUFQUElORworCV9fWEZSTV9NU0dfTUFYCit9OworI2RlZmluZSBYRlJNX01TR19NQVggKF9fWEZSTV9NU0dfTUFYIC0gMSkKKworI2RlZmluZSBYRlJNX05SX01TR1RZUEVTIChYRlJNX01TR19NQVggKyAxIC0gWEZSTV9NU0dfQkFTRSkKKworLyoKKyAqIEdlbmVyaWMgTFNNIHNlY3VyaXR5IGNvbnRleHQgZm9yIGNvbXVuaWNhdGluZyB0byB1c2VyIHNwYWNlCisgKiBOT1RFOiBTYW1lIGZvcm1hdCBhcyBzYWRiX3hfc2VjX2N0eAorICovCitzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggeworCV9fdTE2CQkJbGVuOworCV9fdTE2CQkJZXh0dHlwZTsKKwlfX3U4CQkJY3R4X2FsZzsgIC8qIExTTXM6IGUuZy4sIHNlbGludXggPT0gMSAqLworCV9fdTgJCQljdHhfZG9pOworCV9fdTE2CQkJY3R4X2xlbjsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJfdG1wbCB7CisJc3RydWN0IHhmcm1faWQJCWlkOworCV9fdTE2CQkJZmFtaWx5OworCXhmcm1fYWRkcmVzc190CQlzYWRkcjsKKwlfX3UzMgkJCXJlcWlkOworCV9fdTgJCQltb2RlOworCV9fdTgJCQlzaGFyZTsKKwlfX3U4CQkJb3B0aW9uYWw7CisJX191MzIJCQlhYWxnb3M7CisJX191MzIJCQllYWxnb3M7CisJX191MzIJCQljYWxnb3M7Cit9OworCitzdHJ1Y3QgeGZybV9lbmNhcF90bXBsIHsKKwlfX3UxNgkJZW5jYXBfdHlwZTsKKwlfX2JlMTYJCWVuY2FwX3Nwb3J0OworCV9fYmUxNgkJZW5jYXBfZHBvcnQ7CisJeGZybV9hZGRyZXNzX3QJZW5jYXBfb2E7Cit9OworCisvKiBBRVZFTlQgZmxhZ3MgICovCitlbnVtIHhmcm1fYWVfZnR5cGVfdCB7CisJWEZSTV9BRV9VTlNQRUMsCisJWEZSTV9BRV9SVEhSPTEsCS8qIHJlcGxheSB0aHJlc2hvbGQqLworCVhGUk1fQUVfUlZBTD0yLCAvKiByZXBsYXkgdmFsdWUgKi8KKwlYRlJNX0FFX0xWQUw9NCwgLyogbGlmZXRpbWUgdmFsdWUgKi8KKwlYRlJNX0FFX0VUSFI9OCwgLyogZXhwaXJ5IHRpbWVyIHRocmVzaG9sZCAqLworCVhGUk1fQUVfQ1I9MTYsIC8qIEV2ZW50IGNhdXNlIGlzIHJlcGxheSB1cGRhdGUgKi8KKwlYRlJNX0FFX0NFPTMyLCAvKiBFdmVudCBjYXVzZSBpcyB0aW1lciBleHBpcnkgKi8KKwlYRlJNX0FFX0NVPTY0LCAvKiBFdmVudCBjYXVzZSBpcyBwb2xpY3kgdXBkYXRlICovCisJX19YRlJNX0FFX01BWAorCisjZGVmaW5lIFhGUk1fQUVfTUFYIChfX1hGUk1fQUVfTUFYIC0gMSkKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSB7CisJX191OAkJdHlwZTsKKwlfX3UxNgkJcmVzZXJ2ZWQxOworCV9fdTgJCXJlc2VydmVkMjsKK307CisKKy8qIE5ldGxpbmsgbWVzc2FnZSBhdHRyaWJ1dGVzLiAgKi8KK2VudW0geGZybV9hdHRyX3R5cGVfdCB7CisJWEZSTUFfVU5TUEVDLAorCVhGUk1BX0FMR19BVVRILAkJLyogc3RydWN0IHhmcm1fYWxnbyAqLworCVhGUk1BX0FMR19DUllQVCwJLyogc3RydWN0IHhmcm1fYWxnbyAqLworCVhGUk1BX0FMR19DT01QLAkJLyogc3RydWN0IHhmcm1fYWxnbyAqLworCVhGUk1BX0VOQ0FQLAkJLyogc3RydWN0IHhmcm1fYWxnbyArIHN0cnVjdCB4ZnJtX2VuY2FwX3RtcGwgKi8KKwlYRlJNQV9UTVBMLAkJLyogMSBvciBtb3JlIHN0cnVjdCB4ZnJtX3VzZXJfdG1wbCAqLworCVhGUk1BX1NBLAkJLyogc3RydWN0IHhmcm1fdXNlcnNhX2luZm8gICovCisJWEZSTUFfUE9MSUNZLAkJLypzdHJ1Y3QgeGZybV91c2VycG9saWN5X2luZm8gKi8KKwlYRlJNQV9TRUNfQ1RYLAkJLyogc3RydWN0IHhmcm1fc2VjX2N0eCAqLworCVhGUk1BX0xUSU1FX1ZBTCwKKwlYRlJNQV9SRVBMQVlfVkFMLAorCVhGUk1BX1JFUExBWV9USFJFU0gsCisJWEZSTUFfRVRJTUVSX1RIUkVTSCwKKwlYRlJNQV9TUkNBRERSLAkJLyogeGZybV9hZGRyZXNzX3QgKi8KKwlYRlJNQV9DT0FERFIsCQkvKiB4ZnJtX2FkZHJlc3NfdCAqLworCVhGUk1BX0xBU1RVU0VELAkJLyogdW5zaWduZWQgbG9uZyAgKi8KKwlYRlJNQV9QT0xJQ1lfVFlQRSwJLyogc3RydWN0IHhmcm1fdXNlcnBvbGljeV90eXBlICovCisJWEZSTUFfTUlHUkFURSwKKwlYRlJNQV9BTEdfQUVBRCwJCS8qIHN0cnVjdCB4ZnJtX2FsZ29fYWVhZCAqLworCVhGUk1BX0tNQUREUkVTUywgICAgICAgIC8qIHN0cnVjdCB4ZnJtX3VzZXJfa21hZGRyZXNzICovCisJWEZSTUFfQUxHX0FVVEhfVFJVTkMsCS8qIHN0cnVjdCB4ZnJtX2FsZ29fYXV0aCAqLworCVhGUk1BX01BUkssCQkvKiBzdHJ1Y3QgeGZybV9tYXJrICovCisJWEZSTUFfVEZDUEFELAkJLyogX191MzIgKi8KKwlYRlJNQV9SRVBMQVlfRVNOX1ZBTCwJLyogc3RydWN0IHhmcm1fcmVwbGF5X2VzbiAqLworCV9fWEZSTUFfTUFYCisKKyNkZWZpbmUgWEZSTUFfTUFYIChfX1hGUk1BX01BWCAtIDEpCit9OworCitzdHJ1Y3QgeGZybV9tYXJrIHsKKwlfX3UzMiAgICAgICAgICAgdjsgLyogdmFsdWUgKi8KKwlfX3UzMiAgICAgICAgICAgbTsgLyogbWFzayAqLworfTsKKworZW51bSB4ZnJtX3NhZGF0dHJfdHlwZV90IHsKKwlYRlJNQV9TQURfVU5TUEVDLAorCVhGUk1BX1NBRF9DTlQsCisJWEZSTUFfU0FEX0hJTkZPLAorCV9fWEZSTUFfU0FEX01BWAorCisjZGVmaW5lIFhGUk1BX1NBRF9NQVggKF9fWEZSTUFfU0FEX01BWCAtIDEpCit9OworCitzdHJ1Y3QgeGZybXVfc2FkaGluZm8geworCV9fdTMyIHNhZGhjbnQ7IC8qIGN1cnJlbnQgaGFzaCBia3RzICovCisJX191MzIgc2FkaG1jbnQ7IC8qIG1heCBhbGxvd2VkIGhhc2ggYmt0cyAqLworfTsKKworZW51bSB4ZnJtX3NwZGF0dHJfdHlwZV90IHsKKwlYRlJNQV9TUERfVU5TUEVDLAorCVhGUk1BX1NQRF9JTkZPLAorCVhGUk1BX1NQRF9ISU5GTywKKwlfX1hGUk1BX1NQRF9NQVgKKworI2RlZmluZSBYRlJNQV9TUERfTUFYIChfX1hGUk1BX1NQRF9NQVggLSAxKQorfTsKKworc3RydWN0IHhmcm11X3NwZGluZm8geworCV9fdTMyIGluY250OworCV9fdTMyIG91dGNudDsKKwlfX3UzMiBmd2RjbnQ7CisJX191MzIgaW5zY250OworCV9fdTMyIG91dHNjbnQ7CisJX191MzIgZndkc2NudDsKK307CisKK3N0cnVjdCB4ZnJtdV9zcGRoaW5mbyB7CisJX191MzIgc3BkaGNudDsKKwlfX3UzMiBzcGRobWNudDsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJzYV9pbmZvIHsKKwlzdHJ1Y3QgeGZybV9zZWxlY3RvcgkJc2VsOworCXN0cnVjdCB4ZnJtX2lkCQkJaWQ7CisJeGZybV9hZGRyZXNzX3QJCQlzYWRkcjsKKwlzdHJ1Y3QgeGZybV9saWZldGltZV9jZmcJbGZ0OworCXN0cnVjdCB4ZnJtX2xpZmV0aW1lX2N1cgljdXJsZnQ7CisJc3RydWN0IHhmcm1fc3RhdHMJCXN0YXRzOworCV9fdTMyCQkJCXNlcTsKKwlfX3UzMgkJCQlyZXFpZDsKKwlfX3UxNgkJCQlmYW1pbHk7CisJX191OAkJCQltb2RlOwkJLyogWEZSTV9NT0RFX3h4eCAqLworCV9fdTgJCQkJcmVwbGF5X3dpbmRvdzsKKwlfX3U4CQkJCWZsYWdzOworI2RlZmluZSBYRlJNX1NUQVRFX05PRUNOCTEKKyNkZWZpbmUgWEZSTV9TVEFURV9ERUNBUF9EU0NQCTIKKyNkZWZpbmUgWEZSTV9TVEFURV9OT1BNVFVESVNDCTQKKyNkZWZpbmUgWEZSTV9TVEFURV9XSUxEUkVDVgk4CisjZGVmaW5lIFhGUk1fU1RBVEVfSUNNUAkJMTYKKyNkZWZpbmUgWEZSTV9TVEFURV9BRl9VTlNQRUMJMzIKKyNkZWZpbmUgWEZSTV9TVEFURV9BTElHTjQJNjQKKyNkZWZpbmUgWEZSTV9TVEFURV9FU04JCTEyOAorfTsKKworc3RydWN0IHhmcm1fdXNlcnNhX2lkIHsKKwl4ZnJtX2FkZHJlc3NfdAkJCWRhZGRyOworCV9fYmUzMgkJCQlzcGk7CisJX191MTYJCQkJZmFtaWx5OworCV9fdTgJCQkJcHJvdG87Cit9OworCitzdHJ1Y3QgeGZybV9hZXZlbnRfaWQgeworCXN0cnVjdCB4ZnJtX3VzZXJzYV9pZAkJc2FfaWQ7CisJeGZybV9hZGRyZXNzX3QJCQlzYWRkcjsKKwlfX3UzMgkJCQlmbGFnczsKKwlfX3UzMgkJCQlyZXFpZDsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJzcGlfaW5mbyB7CisJc3RydWN0IHhmcm1fdXNlcnNhX2luZm8JCWluZm87CisJX191MzIJCQkJbWluOworCV9fdTMyCQkJCW1heDsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbyB7CisJc3RydWN0IHhmcm1fc2VsZWN0b3IJCXNlbDsKKwlzdHJ1Y3QgeGZybV9saWZldGltZV9jZmcJbGZ0OworCXN0cnVjdCB4ZnJtX2xpZmV0aW1lX2N1cgljdXJsZnQ7CisJX191MzIJCQkJcHJpb3JpdHk7CisJX191MzIJCQkJaW5kZXg7CisJX191OAkJCQlkaXI7CisJX191OAkJCQlhY3Rpb247CisjZGVmaW5lIFhGUk1fUE9MSUNZX0FMTE9XCTAKKyNkZWZpbmUgWEZSTV9QT0xJQ1lfQkxPQ0sJMQorCV9fdTgJCQkJZmxhZ3M7CisjZGVmaW5lIFhGUk1fUE9MSUNZX0xPQ0FMT0sJMQkvKiBBbGxvdyB1c2VyIHRvIG92ZXJyaWRlIGdsb2JhbCBwb2xpY3kgKi8KKwkvKiBBdXRvbWF0aWNhbGx5IGV4cGFuZCBzZWxlY3RvciB0byBpbmNsdWRlIG1hdGNoaW5nIElDTVAgcGF5bG9hZHMuICovCisjZGVmaW5lIFhGUk1fUE9MSUNZX0lDTVAJMgorCV9fdTgJCQkJc2hhcmU7Cit9OworCitzdHJ1Y3QgeGZybV91c2VycG9saWN5X2lkIHsKKwlzdHJ1Y3QgeGZybV9zZWxlY3RvcgkJc2VsOworCV9fdTMyCQkJCWluZGV4OworCV9fdTgJCQkJZGlyOworfTsKKworc3RydWN0IHhmcm1fdXNlcl9hY3F1aXJlIHsKKwlzdHJ1Y3QgeGZybV9pZAkJCWlkOworCXhmcm1fYWRkcmVzc190CQkJc2FkZHI7CisJc3RydWN0IHhmcm1fc2VsZWN0b3IJCXNlbDsKKwlzdHJ1Y3QgeGZybV91c2VycG9saWN5X2luZm8JcG9saWN5OworCV9fdTMyCQkJCWFhbGdvczsKKwlfX3UzMgkJCQllYWxnb3M7CisJX191MzIJCQkJY2FsZ29zOworCV9fdTMyCQkJCXNlcTsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJfZXhwaXJlIHsKKwlzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbwkJc3RhdGU7CisJX191OAkJCQloYXJkOworfTsKKworc3RydWN0IHhmcm1fdXNlcl9wb2xleHBpcmUgeworCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbwlwb2w7CisJX191OAkJCQloYXJkOworfTsKKworc3RydWN0IHhmcm1fdXNlcnNhX2ZsdXNoIHsKKwlfX3U4CQkJCXByb3RvOworfTsKKworc3RydWN0IHhmcm1fdXNlcl9yZXBvcnQgeworCV9fdTgJCQkJcHJvdG87CisJc3RydWN0IHhmcm1fc2VsZWN0b3IJCXNlbDsKK307CisKKy8qIFVzZWQgYnkgTUlHUkFURSB0byBwYXNzIGFkZHJlc3NlcyBJS0Ugc2hvdWxkIHVzZSB0byBwZXJmb3JtCisgKiBTQSBuZWdvdGlhdGlvbiB3aXRoIHRoZSBwZWVyICovCitzdHJ1Y3QgeGZybV91c2VyX2ttYWRkcmVzcyB7CisJeGZybV9hZGRyZXNzX3QgICAgICAgICAgICAgICAgICBsb2NhbDsKKwl4ZnJtX2FkZHJlc3NfdCAgICAgICAgICAgICAgICAgIHJlbW90ZTsKKwlfX3UzMgkJCQlyZXNlcnZlZDsKKwlfX3UxNgkJCQlmYW1pbHk7Cit9OworCitzdHJ1Y3QgeGZybV91c2VyX21pZ3JhdGUgeworCXhmcm1fYWRkcmVzc190CQkJb2xkX2RhZGRyOworCXhmcm1fYWRkcmVzc190CQkJb2xkX3NhZGRyOworCXhmcm1fYWRkcmVzc190CQkJbmV3X2RhZGRyOworCXhmcm1fYWRkcmVzc190CQkJbmV3X3NhZGRyOworCV9fdTgJCQkJcHJvdG87CisJX191OAkJCQltb2RlOworCV9fdTE2CQkJCXJlc2VydmVkOworCV9fdTMyCQkJCXJlcWlkOworCV9fdTE2CQkJCW9sZF9mYW1pbHk7CisJX191MTYJCQkJbmV3X2ZhbWlseTsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJfbWFwcGluZyB7CisJc3RydWN0IHhmcm1fdXNlcnNhX2lkCQlpZDsKKwlfX3UzMgkJCQlyZXFpZDsKKwl4ZnJtX2FkZHJlc3NfdAkJCW9sZF9zYWRkcjsKKwl4ZnJtX2FkZHJlc3NfdAkJCW5ld19zYWRkcjsKKwlfX2JlMTYJCQkJb2xkX3Nwb3J0OworCV9fYmUxNgkJCQluZXdfc3BvcnQ7Cit9OworCisvKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgdXNlcnNwYWNlICovCisjZGVmaW5lIFhGUk1HUlBfQUNRVUlSRQkJMQorI2RlZmluZSBYRlJNR1JQX0VYUElSRQkJMgorI2RlZmluZSBYRlJNR1JQX1NBCQk0CisjZGVmaW5lIFhGUk1HUlBfUE9MSUNZCQk4CisjZGVmaW5lIFhGUk1HUlBfUkVQT1JUCQkweDIwCisKK2VudW0geGZybV9ubGdyb3VwcyB7CisJWEZSTU5MR1JQX05PTkUsCisjZGVmaW5lIFhGUk1OTEdSUF9OT05FCQlYRlJNTkxHUlBfTk9ORQorCVhGUk1OTEdSUF9BQ1FVSVJFLAorI2RlZmluZSBYRlJNTkxHUlBfQUNRVUlSRQlYRlJNTkxHUlBfQUNRVUlSRQorCVhGUk1OTEdSUF9FWFBJUkUsCisjZGVmaW5lIFhGUk1OTEdSUF9FWFBJUkUJWEZSTU5MR1JQX0VYUElSRQorCVhGUk1OTEdSUF9TQSwKKyNkZWZpbmUgWEZSTU5MR1JQX1NBCQlYRlJNTkxHUlBfU0EKKwlYRlJNTkxHUlBfUE9MSUNZLAorI2RlZmluZSBYRlJNTkxHUlBfUE9MSUNZCVhGUk1OTEdSUF9QT0xJQ1kKKwlYRlJNTkxHUlBfQUVWRU5UUywKKyNkZWZpbmUgWEZSTU5MR1JQX0FFVkVOVFMJWEZSTU5MR1JQX0FFVkVOVFMKKwlYRlJNTkxHUlBfUkVQT1JULAorI2RlZmluZSBYRlJNTkxHUlBfUkVQT1JUCVhGUk1OTEdSUF9SRVBPUlQKKwlYRlJNTkxHUlBfTUlHUkFURSwKKyNkZWZpbmUgWEZSTU5MR1JQX01JR1JBVEUJWEZSTU5MR1JQX01JR1JBVEUKKwlYRlJNTkxHUlBfTUFQUElORywKKyNkZWZpbmUgWEZSTU5MR1JQX01BUFBJTkcJWEZSTU5MR1JQX01BUFBJTkcKKwlfX1hGUk1OTEdSUF9NQVgKK307CisjZGVmaW5lIFhGUk1OTEdSUF9NQVgJKF9fWEZSTU5MR1JQX01BWCAtIDEpCisKKyNlbmRpZiAvKiBfTElOVVhfWEZSTV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL2xvY2FsZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9sb2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWExOWU3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9sb2NhbGUuaApAQCAtMCwwICsxLDIwOCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDE5OTIsMTk5NS0yMDAyLDIwMDcsMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTkgU3RhbmRhcmQ6IDcuMTEgTG9jYWxpemF0aW9uCTxsb2NhbGUuaD4KKyAqLworCisjaWZuZGVmCV9MT0NBTEVfSAorI2RlZmluZQlfTE9DQUxFX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZSBfX25lZWRfTlVMTAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGJpdHMvbG9jYWxlLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVGhlc2UgYXJlIHRoZSBwb3NzaWJpbGl0aWVzIGZvciB0aGUgZmlyc3QgYXJndW1lbnQgdG8gc2V0bG9jYWxlLgorICAgVGhlIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBsb3dlc3QgTENfKiBzeW1ib2wgaGFzIHRoZSB2YWx1ZSB6ZXJvLiAgKi8KKyNkZWZpbmUgTENfQ1RZUEUgICAgICAgICAgX19MQ19DVFlQRQorI2RlZmluZSBMQ19OVU1FUklDICAgICAgICBfX0xDX05VTUVSSUMKKyNkZWZpbmUgTENfVElNRSAgICAgICAgICAgX19MQ19USU1FCisjZGVmaW5lIExDX0NPTExBVEUgICAgICAgIF9fTENfQ09MTEFURQorI2RlZmluZSBMQ19NT05FVEFSWSAgICAgICBfX0xDX01PTkVUQVJZCisjZGVmaW5lIExDX01FU1NBR0VTICAgICAgIF9fTENfTUVTU0FHRVMKKyNkZWZpbmUJTENfQUxMCQkgIF9fTENfQUxMCisjZGVmaW5lIExDX1BBUEVSCSAgX19MQ19QQVBFUgorI2RlZmluZSBMQ19OQU1FCQkgIF9fTENfTkFNRQorI2RlZmluZSBMQ19BRERSRVNTCSAgX19MQ19BRERSRVNTCisjZGVmaW5lIExDX1RFTEVQSE9ORQkgIF9fTENfVEVMRVBIT05FCisjZGVmaW5lIExDX01FQVNVUkVNRU5UCSAgX19MQ19NRUFTVVJFTUVOVAorI2RlZmluZSBMQ19JREVOVElGSUNBVElPTiBfX0xDX0lERU5USUZJQ0FUSU9OCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisKKy8qIFN0cnVjdHVyZSBnaXZpbmcgaW5mb3JtYXRpb24gYWJvdXQgbnVtZXJpYyBhbmQgbW9uZXRhcnkgbm90YXRpb24uICAqLworc3RydWN0IGxjb252Cit7CisgIC8qIE51bWVyaWMgKG5vbi1tb25ldGFyeSkgaW5mb3JtYXRpb24uICAqLworCisgIGNoYXIgKmRlY2ltYWxfcG9pbnQ7CQkvKiBEZWNpbWFsIHBvaW50IGNoYXJhY3Rlci4gICovCisgIGNoYXIgKnRob3VzYW5kc19zZXA7CQkvKiBUaG91c2FuZHMgc2VwYXJhdG9yLiAgKi8KKyAgLyogRWFjaCBlbGVtZW50IGlzIHRoZSBudW1iZXIgb2YgZGlnaXRzIGluIGVhY2ggZ3JvdXA7CisgICAgIGVsZW1lbnRzIHdpdGggaGlnaGVyIGluZGljZXMgYXJlIGZhcnRoZXIgbGVmdC4KKyAgICAgQW4gZWxlbWVudCB3aXRoIHZhbHVlIENIQVJfTUFYIG1lYW5zIHRoYXQgbm8gZnVydGhlciBncm91cGluZyBpcyBkb25lLgorICAgICBBbiBlbGVtZW50IHdpdGggdmFsdWUgMCBtZWFucyB0aGF0IHRoZSBwcmV2aW91cyBlbGVtZW50IGlzIHVzZWQKKyAgICAgZm9yIGFsbCBncm91cHMgZmFydGhlciBsZWZ0LiAgKi8KKyAgY2hhciAqZ3JvdXBpbmc7CisKKyAgLyogTW9uZXRhcnkgaW5mb3JtYXRpb24uICAqLworCisgIC8qIEZpcnN0IHRocmVlIGNoYXJzIGFyZSBhIGN1cnJlbmN5IHN5bWJvbCBmcm9tIElTTyA0MjE3LgorICAgICBGb3VydGggY2hhciBpcyB0aGUgc2VwYXJhdG9yLiAgRmlmdGggY2hhciBpcyAnXDAnLiAgKi8KKyAgY2hhciAqaW50X2N1cnJfc3ltYm9sOworICBjaGFyICpjdXJyZW5jeV9zeW1ib2w7CS8qIExvY2FsIGN1cnJlbmN5IHN5bWJvbC4gICovCisgIGNoYXIgKm1vbl9kZWNpbWFsX3BvaW50OwkvKiBEZWNpbWFsIHBvaW50IGNoYXJhY3Rlci4gICovCisgIGNoYXIgKm1vbl90aG91c2FuZHNfc2VwOwkvKiBUaG91c2FuZHMgc2VwYXJhdG9yLiAgKi8KKyAgY2hhciAqbW9uX2dyb3VwaW5nOwkJLyogTGlrZSBgZ3JvdXBpbmcnIGVsZW1lbnQgKGFib3ZlKS4gICovCisgIGNoYXIgKnBvc2l0aXZlX3NpZ247CQkvKiBTaWduIGZvciBwb3NpdGl2ZSB2YWx1ZXMuICAqLworICBjaGFyICpuZWdhdGl2ZV9zaWduOwkJLyogU2lnbiBmb3IgbmVnYXRpdmUgdmFsdWVzLiAgKi8KKyAgY2hhciBpbnRfZnJhY19kaWdpdHM7CQkvKiBJbnQnbCBmcmFjdGlvbmFsIGRpZ2l0cy4gICovCisgIGNoYXIgZnJhY19kaWdpdHM7CQkvKiBMb2NhbCBmcmFjdGlvbmFsIGRpZ2l0cy4gICovCisgIC8qIDEgaWYgY3VycmVuY3lfc3ltYm9sIHByZWNlZGVzIGEgcG9zaXRpdmUgdmFsdWUsIDAgaWYgc3VjY2VlZHMuICAqLworICBjaGFyIHBfY3NfcHJlY2VkZXM7CisgIC8qIDEgaWZmIGEgc3BhY2Ugc2VwYXJhdGVzIGN1cnJlbmN5X3N5bWJvbCBmcm9tIGEgcG9zaXRpdmUgdmFsdWUuICAqLworICBjaGFyIHBfc2VwX2J5X3NwYWNlOworICAvKiAxIGlmIGN1cnJlbmN5X3N5bWJvbCBwcmVjZWRlcyBhIG5lZ2F0aXZlIHZhbHVlLCAwIGlmIHN1Y2NlZWRzLiAgKi8KKyAgY2hhciBuX2NzX3ByZWNlZGVzOworICAvKiAxIGlmZiBhIHNwYWNlIHNlcGFyYXRlcyBjdXJyZW5jeV9zeW1ib2wgZnJvbSBhIG5lZ2F0aXZlIHZhbHVlLiAgKi8KKyAgY2hhciBuX3NlcF9ieV9zcGFjZTsKKyAgLyogUG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHNpZ24gcG9zaXRpb25zOgorICAgICAwIFBhcmVudGhlc2VzIHN1cnJvdW5kIHRoZSBxdWFudGl0eSBhbmQgY3VycmVuY3lfc3ltYm9sLgorICAgICAxIFRoZSBzaWduIHN0cmluZyBwcmVjZWRlcyB0aGUgcXVhbnRpdHkgYW5kIGN1cnJlbmN5X3N5bWJvbC4KKyAgICAgMiBUaGUgc2lnbiBzdHJpbmcgZm9sbG93cyB0aGUgcXVhbnRpdHkgYW5kIGN1cnJlbmN5X3N5bWJvbC4KKyAgICAgMyBUaGUgc2lnbiBzdHJpbmcgaW1tZWRpYXRlbHkgcHJlY2VkZXMgdGhlIGN1cnJlbmN5X3N5bWJvbC4KKyAgICAgNCBUaGUgc2lnbiBzdHJpbmcgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgY3VycmVuY3lfc3ltYm9sLiAgKi8KKyAgY2hhciBwX3NpZ25fcG9zbjsKKyAgY2hhciBuX3NpZ25fcG9zbjsKKyNpZmRlZiBfX1VTRV9JU09DOTkKKyAgLyogMSBpZiBpbnRfY3Vycl9zeW1ib2wgcHJlY2VkZXMgYSBwb3NpdGl2ZSB2YWx1ZSwgMCBpZiBzdWNjZWVkcy4gICovCisgIGNoYXIgaW50X3BfY3NfcHJlY2VkZXM7CisgIC8qIDEgaWZmIGEgc3BhY2Ugc2VwYXJhdGVzIGludF9jdXJyX3N5bWJvbCBmcm9tIGEgcG9zaXRpdmUgdmFsdWUuICAqLworICBjaGFyIGludF9wX3NlcF9ieV9zcGFjZTsKKyAgLyogMSBpZiBpbnRfY3Vycl9zeW1ib2wgcHJlY2VkZXMgYSBuZWdhdGl2ZSB2YWx1ZSwgMCBpZiBzdWNjZWVkcy4gICovCisgIGNoYXIgaW50X25fY3NfcHJlY2VkZXM7CisgIC8qIDEgaWZmIGEgc3BhY2Ugc2VwYXJhdGVzIGludF9jdXJyX3N5bWJvbCBmcm9tIGEgbmVnYXRpdmUgdmFsdWUuICAqLworICBjaGFyIGludF9uX3NlcF9ieV9zcGFjZTsKKyAgLyogUG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHNpZ24gcG9zaXRpb25zOgorICAgICAwIFBhcmVudGhlc2VzIHN1cnJvdW5kIHRoZSBxdWFudGl0eSBhbmQgaW50X2N1cnJfc3ltYm9sLgorICAgICAxIFRoZSBzaWduIHN0cmluZyBwcmVjZWRlcyB0aGUgcXVhbnRpdHkgYW5kIGludF9jdXJyX3N5bWJvbC4KKyAgICAgMiBUaGUgc2lnbiBzdHJpbmcgZm9sbG93cyB0aGUgcXVhbnRpdHkgYW5kIGludF9jdXJyX3N5bWJvbC4KKyAgICAgMyBUaGUgc2lnbiBzdHJpbmcgaW1tZWRpYXRlbHkgcHJlY2VkZXMgdGhlIGludF9jdXJyX3N5bWJvbC4KKyAgICAgNCBUaGUgc2lnbiBzdHJpbmcgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgaW50X2N1cnJfc3ltYm9sLiAgKi8KKyAgY2hhciBpbnRfcF9zaWduX3Bvc247CisgIGNoYXIgaW50X25fc2lnbl9wb3NuOworI2Vsc2UKKyAgY2hhciBfX2ludF9wX2NzX3ByZWNlZGVzOworICBjaGFyIF9faW50X3Bfc2VwX2J5X3NwYWNlOworICBjaGFyIF9faW50X25fY3NfcHJlY2VkZXM7CisgIGNoYXIgX19pbnRfbl9zZXBfYnlfc3BhY2U7CisgIGNoYXIgX19pbnRfcF9zaWduX3Bvc247CisgIGNoYXIgX19pbnRfbl9zaWduX3Bvc247CisjZW5kaWYKK307CisKKworLyogU2V0IGFuZC9vciByZXR1cm4gdGhlIGN1cnJlbnQgbG9jYWxlLiAgKi8KK2V4dGVybiBjaGFyICpzZXRsb2NhbGUgKGludCBfX2NhdGVnb3J5LCBfX2NvbnN0IGNoYXIgKl9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIG51bWVyaWMvbW9uZXRhcnkgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4gICovCitleHRlcm4gc3RydWN0IGxjb252ICpsb2NhbGVjb252ICh2b2lkKSBfX1RIUk9XOworCitfX0VORF9OQU1FU1BBQ0VfU1RECisKKworI2lmZGVmCV9fVVNFX1hPUEVOMks4CisvKiBUaGUgY29uY2VwdCBvZiBvbmUgc3RhdGljIGxvY2FsZSBwZXIgY2F0ZWdvcnkgaXMgbm90IHZlcnkgd2VsbAorICAgdGhvdWdodCBvdXQuICBNYW55IGFwcGxpY2F0aW9ucyB3aWxsIG5lZWQgdG8gcHJvY2VzcyBpdHMgZGF0YSB1c2luZworICAgaW5mb3JtYXRpb24gZnJvbSBzZXZlcmFsIGRpZmZlcmVudCBsb2NhbGVzLiAgQW5vdGhlciBhcHBsaWNhdGlvbiBpcworICAgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBoYW5kbGluZyBpbiB0aGUKKyAgIHVwY29taW5nIElTTyBDKysgc3RhbmRhcmQgbGlicmFyeS4gIFRvIHN1cHBvcnQgdGhpcyBhbm90aGVyIHNldCBvZgorICAgdGhlIGZ1bmN0aW9ucyB1c2luZyBsb2NhbGUgZGF0YSBleGlzdCB3aGljaCBoYXZlIGFuIGFkZGl0aW9uYWwKKyAgIGFyZ3VtZW50LgorCisgICBBdHRlbnRpb246IGFsbCB0aGVzZSBmdW5jdGlvbnMgYXJlICpub3QqIHN0YW5kYXJkaXplZCBpbiBhbnkgZm9ybS4KKyAgIFRoaXMgaXMgYSBwcm9vZi1vZi1jb25jZXB0IGltcGxlbWVudGF0aW9uLiAgKi8KKworLyogR2V0IGxvY2FsZSBkYXRhdHlwZSBkZWZpbml0aW9uLiAgKi8KKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorCisvKiBSZXR1cm4gYSByZWZlcmVuY2UgdG8gYSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBzZXQgb2YgbG9jYWxlCisgICBkYXRhc2V0cy4gIFVubGlrZSBmb3IgdGhlIENBVEVHT1JZIHBhcmFtZXRlciBmb3IgYHNldGxvY2FsZScgdGhlCisgICBDQVRFR09SWV9NQVNLIHBhcmFtZXRlciBoZXJlIHVzZXMgYSBzaW5nbGUgYml0IGZvciBlYWNoIGNhdGVnb3J5LAorICAgbWFkZSBieSBPUidpbmcgdG9nZXRoZXIgTENfKl9NQVNLIGJpdHMgYWJvdmUuICAqLworZXh0ZXJuIF9fbG9jYWxlX3QgbmV3bG9jYWxlIChpbnQgX19jYXRlZ29yeV9tYXNrLCBfX2NvbnN0IGNoYXIgKl9fbG9jYWxlLAorCQkJICAgICBfX2xvY2FsZV90IF9fYmFzZSkgX19USFJPVzsKKworLyogVGhlc2UgYXJlIHRoZSBiaXRzIHRoYXQgY2FuIGJlIHNldCBpbiB0aGUgQ0FURUdPUllfTUFTSyBhcmd1bWVudCB0bworICAgYG5ld2xvY2FsZScuICBJbiB0aGUgR05VIGltcGxlbWVudGF0aW9uLCBMQ19GT09fTUFTSyBoYXMgdGhlIHZhbHVlCisgICBvZiAoMSA8PCBMQ19GT08pLCBidXQgdGhpcyBpcyBub3QgYSBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UgdGhhdAorICAgY2FsbGVycyBjYW4gYXNzdW1lIHdpbGwgYmUgdHJ1ZS4gICovCisjIGRlZmluZSBMQ19DVFlQRV9NQVNLCQkoMSA8PCBfX0xDX0NUWVBFKQorIyBkZWZpbmUgTENfTlVNRVJJQ19NQVNLCSgxIDw8IF9fTENfTlVNRVJJQykKKyMgZGVmaW5lIExDX1RJTUVfTUFTSwkJKDEgPDwgX19MQ19USU1FKQorIyBkZWZpbmUgTENfQ09MTEFURV9NQVNLCSgxIDw8IF9fTENfQ09MTEFURSkKKyMgZGVmaW5lIExDX01PTkVUQVJZX01BU0sJKDEgPDwgX19MQ19NT05FVEFSWSkKKyMgZGVmaW5lIExDX01FU1NBR0VTX01BU0sJKDEgPDwgX19MQ19NRVNTQUdFUykKKyMgZGVmaW5lIExDX1BBUEVSX01BU0sJCSgxIDw8IF9fTENfUEFQRVIpCisjIGRlZmluZSBMQ19OQU1FX01BU0sJCSgxIDw8IF9fTENfTkFNRSkKKyMgZGVmaW5lIExDX0FERFJFU1NfTUFTSwkoMSA8PCBfX0xDX0FERFJFU1MpCisjIGRlZmluZSBMQ19URUxFUEhPTkVfTUFTSwkoMSA8PCBfX0xDX1RFTEVQSE9ORSkKKyMgZGVmaW5lIExDX01FQVNVUkVNRU5UX01BU0sJKDEgPDwgX19MQ19NRUFTVVJFTUVOVCkKKyMgZGVmaW5lIExDX0lERU5USUZJQ0FUSU9OX01BU0sJKDEgPDwgX19MQ19JREVOVElGSUNBVElPTikKKyMgZGVmaW5lIExDX0FMTF9NQVNLCQkoTENfQ1RZUEVfTUFTSyBcCisJCQkJIHwgTENfTlVNRVJJQ19NQVNLIFwKKwkJCQkgfCBMQ19USU1FX01BU0sgXAorCQkJCSB8IExDX0NPTExBVEVfTUFTSyBcCisJCQkJIHwgTENfTU9ORVRBUllfTUFTSyBcCisJCQkJIHwgTENfTUVTU0FHRVNfTUFTSyBcCisJCQkJIHwgTENfUEFQRVJfTUFTSyBcCisJCQkJIHwgTENfTkFNRV9NQVNLIFwKKwkJCQkgfCBMQ19BRERSRVNTX01BU0sgXAorCQkJCSB8IExDX1RFTEVQSE9ORV9NQVNLIFwKKwkJCQkgfCBMQ19NRUFTVVJFTUVOVF9NQVNLIFwKKwkJCQkgfCBMQ19JREVOVElGSUNBVElPTl9NQVNLIFwKKwkJCQkgKQorCisvKiBSZXR1cm4gYSBkdXBsaWNhdGUgb2YgdGhlIHNldCBvZiBsb2NhbGUgaW4gREFUQVNFVC4gIEFsbCB1c2FnZQorICAgY291bnRlcnMgYXJlIGluY3JlYXNlZCBpZiBuZWNlc3NhcnkuICAqLworZXh0ZXJuIF9fbG9jYWxlX3QgZHVwbG9jYWxlIChfX2xvY2FsZV90IF9fZGF0YXNldCkgX19USFJPVzsKKworLyogRnJlZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBsb2NhbGUgZGF0YXNldCBwcmV2aW91c2x5IHJldHVybmVkCisgICBieSBhIGNhbGwgdG8gYHNldGxvY2FsZV9yJy4gICovCitleHRlcm4gdm9pZCBmcmVlbG9jYWxlIChfX2xvY2FsZV90IF9fZGF0YXNldCkgX19USFJPVzsKKworLyogU3dpdGNoIHRoZSBjdXJyZW50IHRocmVhZCdzIGxvY2FsZSB0byBEQVRBU0VULgorICAgSWYgREFUQVNFVCBpcyBudWxsLCBpbnN0ZWFkIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IHNldHRpbmcuCisgICBUaGUgc3BlY2lhbCB2YWx1ZSBMQ19HTE9CQUxfTE9DQUxFIGlzIHRoZSBpbml0aWFsIHNldHRpbmcKKyAgIGZvciBhbGwgdGhyZWFkcyBhbmQgY2FuIGFsc28gYmUgaW5zdGFsbGVkIGFueSB0aW1lLCBtZWFuaW5nCisgICB0aGUgdGhyZWFkIHVzZXMgdGhlIGdsb2JhbCBzZXR0aW5ncyBjb250cm9sbGVkIGJ5IGBzZXRsb2NhbGUnLiAgKi8KK2V4dGVybiBfX2xvY2FsZV90IHVzZWxvY2FsZSAoX19sb2NhbGVfdCBfX2RhdGFzZXQpIF9fVEhST1c7CisKKy8qIFRoaXMgdmFsdWUgY2FuIGJlIHBhc3NlZCB0byBgdXNlbG9jYWxlJyBhbmQgbWF5IGJlIHJldHVybmVkIGJ5IGl0LgorICAgUGFzc2luZyB0aGlzIHZhbHVlIHRvIGFueSBvdGhlciBmdW5jdGlvbiBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yLiAgKi8KKyMgZGVmaW5lIExDX0dMT0JBTF9MT0NBTEUJKChfX2xvY2FsZV90KSAtMUwpCisKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbG9jYWxlLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL21hbGxvYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQzZjdjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tYWxsb2MuaApAQCAtMCwwICsxLDE5NSBAQAorLyogUHJvdG90eXBlcyBhbmQgZGVmaW5pdGlvbiBmb3IgbWFsbG9jIGltcGxlbWVudGF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwLCAyMDAyLTIwMDQsIDIwMDUsIDIwMDcsIDIwMDksIDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NQUxMT0NfSAorI2RlZmluZSBfTUFMTE9DX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorIyBkZWZpbmUgX19tYWxsb2NfcHRyX3QgIHZvaWQgKgorCisvKiBVc2VkIGJ5IEdOVSBsaWJjIGludGVybmFscy4gKi8KKyNkZWZpbmUgX19tYWxsb2Nfc2l6ZV90IHNpemVfdAorI2RlZmluZSBfX21hbGxvY19wdHJkaWZmX3QgcHRyZGlmZl90CisKKyNpZmRlZiBfX0dOVUNfXworCisjIGRlZmluZSBfX01BTExPQ19QKGFyZ3MpCWFyZ3MgX19USFJPVworLyogVGhpcyBtYWNybyB3aWxsIGJlIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBtaWdodCB0YWtlIEMrKyBjYWxsYmFjaworICAgZnVuY3Rpb25zLiAgKi8KKyMgZGVmaW5lIF9fTUFMTE9DX1BNVChhcmdzKQlhcmdzCisKKyMgaWZkZWYgX0xJQkMKKyMgIGRlZmluZSBfX01BTExPQ19IT09LX1ZPTEFUSUxFCisjICBkZWZpbmUgX19NQUxMT0NfREVQUkVDQVRFRAorIyBlbHNlCisjICBkZWZpbmUgX19NQUxMT0NfSE9PS19WT0xBVElMRSBfX3ZvbGF0aWxlCisjICBkZWZpbmUgX19NQUxMT0NfREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX18KKyMgZW5kaWYKKworI2Vsc2UJLyogTm90IEdDQy4gICovCisKKyMgZGVmaW5lIF9fTUFMTE9DX1AoYXJncykJYXJncworIyBkZWZpbmUgX19NQUxMT0NfUE1UKGFyZ3MpCWFyZ3MKKyMgZGVmaW5lIF9fTUFMTE9DX0hPT0tfVk9MQVRJTEUKKyMgZGVmaW5lIF9fTUFMTE9DX0RFUFJFQ0FURUQgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fCisKKyNlbmRpZgkvKiBHQ0MuICAqLworCisKK19fQkVHSU5fREVDTFMKKworLyogQWxsb2NhdGUgU0laRSBieXRlcyBvZiBtZW1vcnkuICAqLworZXh0ZXJuIHZvaWQgKm1hbGxvYyAoc2l6ZV90IF9fc2l6ZSkgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX3d1cjsKKworLyogQWxsb2NhdGUgTk1FTUIgZWxlbWVudHMgb2YgU0laRSBieXRlcyBlYWNoLCBhbGwgaW5pdGlhbGl6ZWQgdG8gMC4gICovCitleHRlcm4gdm9pZCAqY2FsbG9jIChzaXplX3QgX19ubWVtYiwgc2l6ZV90IF9fc2l6ZSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX3d1cjsKKworLyogUmUtYWxsb2NhdGUgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGJsb2NrIGluIF9fcHRyLCBtYWtpbmcgdGhlIG5ldworICAgYmxvY2sgU0laRSBieXRlcyBsb25nLiAgKi8KKy8qIF9fYXR0cmlidXRlX21hbGxvY19fIGlzIG5vdCB1c2VkLCBiZWNhdXNlIGlmIHJlYWxsb2MgcmV0dXJucworICAgdGhlIHNhbWUgcG9pbnRlciB0aGF0IHdhcyBwYXNzZWQgdG8gaXQsIGFsaWFzaW5nIG5lZWRzIHRvIGJlIGFsbG93ZWQKKyAgIGJldHdlZW4gb2JqZWN0cyBwb2ludGVkIGJ5IHRoZSBvbGQgYW5kIG5ldyBwb2ludGVycy4gICovCitleHRlcm4gdm9pZCAqcmVhbGxvYyAodm9pZCAqX19wdHIsIHNpemVfdCBfX3NpemUpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfd2Fybl91bnVzZWRfcmVzdWx0X187CisKKy8qIEZyZWUgYSBibG9jayBhbGxvY2F0ZWQgYnkgYG1hbGxvYycsIGByZWFsbG9jJyBvciBgY2FsbG9jJy4gICovCitleHRlcm4gdm9pZCBmcmVlICh2b2lkICpfX3B0cikgX19USFJPVzsKKworLyogRnJlZSBhIGJsb2NrIGFsbG9jYXRlZCBieSBgY2FsbG9jJy4gKi8KK2V4dGVybiB2b2lkIGNmcmVlICh2b2lkICpfX3B0cikgX19USFJPVzsKKworLyogQWxsb2NhdGUgU0laRSBieXRlcyBhbGxvY2F0ZWQgdG8gQUxJR05NRU5UIGJ5dGVzLiAgKi8KK2V4dGVybiB2b2lkICptZW1hbGlnbiAoc2l6ZV90IF9fYWxpZ25tZW50LCBzaXplX3QgX19zaXplKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX21hbGxvY19fIF9fd3VyOworCisvKiBBbGxvY2F0ZSBTSVpFIGJ5dGVzIG9uIGEgcGFnZSBib3VuZGFyeS4gICovCitleHRlcm4gdm9pZCAqdmFsbG9jIChzaXplX3QgX19zaXplKSBfX1RIUk9XIF9fYXR0cmlidXRlX21hbGxvY19fIF9fd3VyOworCisvKiBFcXVpdmFsZW50IHRvIHZhbGxvYyhtaW5pbXVtLXBhZ2UtdGhhdC1ob2xkcyhuKSksIHRoYXQgaXMsIHJvdW5kIHVwCisgICBfX3NpemUgdG8gbmVhcmVzdCBwYWdlc2l6ZS4gKi8KK2V4dGVybiB2b2lkICogcHZhbGxvYyAoc2l6ZV90IF9fc2l6ZSkgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX3d1cjsKKworLyogVW5kZXJseWluZyBhbGxvY2F0aW9uIGZ1bmN0aW9uOyBzdWNjZXNzaXZlIGNhbGxzIHNob3VsZCByZXR1cm4KKyAgIGNvbnRpZ3VvdXMgcGllY2VzIG9mIG1lbW9yeS4gICovCitleHRlcm4gdm9pZCAqKCpfX21vcmVjb3JlKSAocHRyZGlmZl90IF9fc2l6ZSk7CisKKy8qIERlZmF1bHQgdmFsdWUgb2YgYF9fbW9yZWNvcmUnLiAgKi8KK2V4dGVybiB2b2lkICpfX2RlZmF1bHRfbW9yZWNvcmUgKHB0cmRpZmZfdCBfX3NpemUpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfbWFsbG9jX187CisKKy8qIFNWSUQyL1hQRyBtYWxsaW5mbyBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IG1hbGxpbmZvCit7CisgIGludCBhcmVuYTsgICAgLyogbm9uLW1tYXBwZWQgc3BhY2UgYWxsb2NhdGVkIGZyb20gc3lzdGVtICovCisgIGludCBvcmRibGtzOyAgLyogbnVtYmVyIG9mIGZyZWUgY2h1bmtzICovCisgIGludCBzbWJsa3M7ICAgLyogbnVtYmVyIG9mIGZhc3RiaW4gYmxvY2tzICovCisgIGludCBoYmxrczsgICAgLyogbnVtYmVyIG9mIG1tYXBwZWQgcmVnaW9ucyAqLworICBpbnQgaGJsa2hkOyAgIC8qIHNwYWNlIGluIG1tYXBwZWQgcmVnaW9ucyAqLworICBpbnQgdXNtYmxrczsgIC8qIG1heGltdW0gdG90YWwgYWxsb2NhdGVkIHNwYWNlICovCisgIGludCBmc21ibGtzOyAgLyogc3BhY2UgYXZhaWxhYmxlIGluIGZyZWVkIGZhc3RiaW4gYmxvY2tzICovCisgIGludCB1b3JkYmxrczsgLyogdG90YWwgYWxsb2NhdGVkIHNwYWNlICovCisgIGludCBmb3JkYmxrczsgLyogdG90YWwgZnJlZSBzcGFjZSAqLworICBpbnQga2VlcGNvc3Q7IC8qIHRvcC1tb3N0LCByZWxlYXNhYmxlICh2aWEgbWFsbG9jX3RyaW0pIHNwYWNlICovCit9OworCisvKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgdXBkYXRlZCBjdXJyZW50IG1hbGxpbmZvLiAqLworZXh0ZXJuIHN0cnVjdCBtYWxsaW5mbyBtYWxsaW5mbyAodm9pZCkgX19USFJPVzsKKworLyogU1ZJRDIvWFBHIG1hbGxvcHQgb3B0aW9ucyAqLworI2lmbmRlZiBNX01YRkFTVAorIyBkZWZpbmUgTV9NWEZBU1QgIDEJLyogbWF4aW11bSByZXF1ZXN0IHNpemUgZm9yICJmYXN0YmlucyIgKi8KKyNlbmRpZgorI2lmbmRlZiBNX05MQkxLUworIyBkZWZpbmUgTV9OTEJMS1MgIDIJLyogVU5VU0VEIGluIHRoaXMgbWFsbG9jICovCisjZW5kaWYKKyNpZm5kZWYgTV9HUkFJTgorIyBkZWZpbmUgTV9HUkFJTiAgIDMJLyogVU5VU0VEIGluIHRoaXMgbWFsbG9jICovCisjZW5kaWYKKyNpZm5kZWYgTV9LRUVQCisjIGRlZmluZSBNX0tFRVAgICAgNAkvKiBVTlVTRUQgaW4gdGhpcyBtYWxsb2MgKi8KKyNlbmRpZgorCisvKiBtYWxsb3B0IG9wdGlvbnMgdGhhdCBhY3R1YWxseSBkbyBzb21ldGhpbmcgKi8KKyNkZWZpbmUgTV9UUklNX1RIUkVTSE9MRCAgICAtMQorI2RlZmluZSBNX1RPUF9QQUQgICAgICAgICAgIC0yCisjZGVmaW5lIE1fTU1BUF9USFJFU0hPTEQgICAgLTMKKyNkZWZpbmUgTV9NTUFQX01BWCAgICAgICAgICAtNAorI2RlZmluZSBNX0NIRUNLX0FDVElPTiAgICAgIC01CisjZGVmaW5lIE1fUEVSVFVSQgkgICAgLTYKKyNkZWZpbmUgTV9BUkVOQV9URVNUCSAgICAtNworI2RlZmluZSBNX0FSRU5BX01BWAkgICAgLTgKKworLyogR2VuZXJhbCBTVklEL1hQRyBpbnRlcmZhY2UgdG8gdHVuYWJsZSBwYXJhbWV0ZXJzLiAqLworZXh0ZXJuIGludCBtYWxsb3B0IChpbnQgX19wYXJhbSwgaW50IF9fdmFsKSBfX1RIUk9XOworCisvKiBSZWxlYXNlIGFsbCBidXQgX19wYWQgYnl0ZXMgb2YgZnJlZWQgdG9wLW1vc3QgbWVtb3J5IGJhY2sgdG8gdGhlCisgICBzeXN0ZW0uIFJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIGVsc2UgMC4gKi8KK2V4dGVybiBpbnQgbWFsbG9jX3RyaW0gKHNpemVfdCBfX3BhZCkgX19USFJPVzsKKworLyogUmVwb3J0IHRoZSBudW1iZXIgb2YgdXNhYmxlIGFsbG9jYXRlZCBieXRlcyBhc3NvY2lhdGVkIHdpdGggYWxsb2NhdGVkCisgICBjaHVuayBfX3B0ci4gKi8KK2V4dGVybiBzaXplX3QgbWFsbG9jX3VzYWJsZV9zaXplICh2b2lkICpfX3B0cikgX19USFJPVzsKKworLyogUHJpbnRzIGJyaWVmIHN1bW1hcnkgc3RhdGlzdGljcyBvbiBzdGRlcnIuICovCitleHRlcm4gdm9pZCBtYWxsb2Nfc3RhdHMgKHZvaWQpIF9fVEhST1c7CisKKy8qIE91dHB1dCBpbmZvcm1hdGlvbiBhYm91dCBzdGF0ZSBvZiBhbGxvY2F0b3IgdG8gc3RyZWFtIEZQLiAgKi8KK2V4dGVybiBpbnQgbWFsbG9jX2luZm8gKGludCBfX29wdGlvbnMsIEZJTEUgKl9fZnApIF9fVEhST1c7CisKKy8qIFJlY29yZCB0aGUgc3RhdGUgb2YgYWxsIG1hbGxvYyB2YXJpYWJsZXMgaW4gYW4gb3BhcXVlIGRhdGEgc3RydWN0dXJlLiAqLworZXh0ZXJuIHZvaWQgKm1hbGxvY19nZXRfc3RhdGUgKHZvaWQpIF9fVEhST1c7CisKKy8qIFJlc3RvcmUgdGhlIHN0YXRlIG9mIGFsbCBtYWxsb2MgdmFyaWFibGVzIGZyb20gZGF0YSBvYnRhaW5lZCB3aXRoCisgICBtYWxsb2NfZ2V0X3N0YXRlKCkuICovCitleHRlcm4gaW50IG1hbGxvY19zZXRfc3RhdGUgKHZvaWQgKl9fcHRyKSBfX1RIUk9XOworCisvKiBDYWxsZWQgb25jZSB3aGVuIG1hbGxvYyBpcyBpbml0aWFsaXplZDsgcmVkZWZpbmluZyB0aGlzIHZhcmlhYmxlIGluCisgICB0aGUgYXBwbGljYXRpb24gcHJvdmlkZXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gc2V0IHVwIHRoZSBob29rCisgICBwb2ludGVycy4gKi8KK2V4dGVybiB2b2lkICgqX19NQUxMT0NfSE9PS19WT0xBVElMRSBfX21hbGxvY19pbml0aWFsaXplX2hvb2spICh2b2lkKQorICAgICBfX01BTExPQ19ERVBSRUNBVEVEOworLyogSG9va3MgZm9yIGRlYnVnZ2luZyBhbmQgdXNlci1kZWZpbmVkIHZlcnNpb25zLiAqLworZXh0ZXJuIHZvaWQgKCpfX01BTExPQ19IT09LX1ZPTEFUSUxFIF9fZnJlZV9ob29rKSAodm9pZCAqX19wdHIsCisJCQkJCQkgICBfX2NvbnN0IF9fbWFsbG9jX3B0cl90KQorICAgICBfX01BTExPQ19ERVBSRUNBVEVEOworZXh0ZXJuIHZvaWQgKigqX19NQUxMT0NfSE9PS19WT0xBVElMRSBfX21hbGxvY19ob29rKSAoc2l6ZV90IF9fc2l6ZSwKKwkJCQkJCSAgICAgIF9fY29uc3QgX19tYWxsb2NfcHRyX3QpCisgICAgIF9fTUFMTE9DX0RFUFJFQ0FURUQ7CitleHRlcm4gdm9pZCAqKCpfX01BTExPQ19IT09LX1ZPTEFUSUxFIF9fcmVhbGxvY19ob29rKSAodm9pZCAqX19wdHIsCisJCQkJCQkgICAgICAgc2l6ZV90IF9fc2l6ZSwKKwkJCQkJCSAgICAgICBfX2NvbnN0IF9fbWFsbG9jX3B0cl90KQorICAgICBfX01BTExPQ19ERVBSRUNBVEVEOworZXh0ZXJuIHZvaWQgKigqX19NQUxMT0NfSE9PS19WT0xBVElMRSBfX21lbWFsaWduX2hvb2spIChzaXplX3QgX19hbGlnbm1lbnQsCisJCQkJCQkJc2l6ZV90IF9fc2l6ZSwKKwkJCQkJCQlfX2NvbnN0IF9fbWFsbG9jX3B0cl90KQorICAgICBfX01BTExPQ19ERVBSRUNBVEVEOworZXh0ZXJuIHZvaWQgKCpfX01BTExPQ19IT09LX1ZPTEFUSUxFIF9fYWZ0ZXJfbW9yZWNvcmVfaG9vaykgKHZvaWQpOworCisvKiBBY3RpdmF0ZSBhIHN0YW5kYXJkIHNldCBvZiBkZWJ1Z2dpbmcgaG9va3MuICovCitleHRlcm4gdm9pZCBfX21hbGxvY19jaGVja19pbml0ICh2b2lkKSBfX1RIUk9XIF9fTUFMTE9DX0RFUFJFQ0FURUQ7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG1hbGxvYy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL21hdGguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYzIzNTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL21hdGguaApAQCAtMCwwICsxLDQ4NiBAQAorLyogRGVjbGFyYXRpb25zIGZvciBtYXRoIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5MS0xOTkzLCAxOTk1LTE5OTksIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDYsIDIwMDksIDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4xMiBNYXRoZW1hdGljcwk8bWF0aC5oPgorICovCisKKyNpZm5kZWYJX01BVEhfSAorI2RlZmluZQlfTUFUSF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogR2V0IG1hY2hpbmUtZGVwZW5kZW50IEhVR0VfVkFMIHZhbHVlIChyZXR1cm5lZCBvbiBvdmVyZmxvdykuCisgICBPbiBhbGwgSUVFRTc1NCBtYWNoaW5lcywgdGhpcyBpcyArSW5maW5pdHkuICAqLworI2luY2x1ZGUgPGJpdHMvaHVnZV92YWwuaD4KKyNpZmRlZiBfX1VTRV9JU09DOTkKKyMgaW5jbHVkZSA8Yml0cy9odWdlX3ZhbGYuaD4KKyMgaW5jbHVkZSA8Yml0cy9odWdlX3ZhbGwuaD4KKworLyogR2V0IG1hY2hpbmUtZGVwZW5kZW50IElORklOSVRZIHZhbHVlLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9pbmYuaD4KKworLyogR2V0IG1hY2hpbmUtZGVwZW5kZW50IE5BTiB2YWx1ZSAocmV0dXJuZWQgZm9yIHNvbWUgZG9tYWluIGVycm9ycykuICAqLworIyBpbmNsdWRlIDxiaXRzL25hbi5oPgorI2VuZGlmIC8qIF9fVVNFX0lTT0M5OSAqLworCisvKiBHZXQgZ2VuZXJhbCBhbmQgSVNPIEM5OSBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCisjaW5jbHVkZSA8Yml0cy9tYXRoZGVmLmg+CisKKy8qIFRoZSBmaWxlIDxiaXRzL21hdGhjYWxscy5oPiBjb250YWlucyB0aGUgcHJvdG90eXBlcyBmb3IgYWxsIHRoZQorICAgYWN0dWFsIG1hdGggZnVuY3Rpb25zLiAgVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGZvciB0aG9zZSBwcm90b3R5cGVzLAorICAgc28gd2UgY2FuIGVhc2lseSBkZWNsYXJlIGVhY2ggZnVuY3Rpb24gYXMgYm90aCBgbmFtZScgYW5kIGBfX25hbWUnLAorICAgYW5kIGNhbiBkZWNsYXJlIHRoZSBmbG9hdCB2ZXJzaW9ucyBgbmFtZWYnIGFuZCBgX19uYW1lZicuICAqLworCisjZGVmaW5lIF9fTUFUSENBTEwoZnVuY3Rpb24sc3VmZml4LCBhcmdzKQlcCisgIF9fTUFUSERFQ0wgKF9NZG91YmxlXyxmdW5jdGlvbixzdWZmaXgsIGFyZ3MpCisjZGVmaW5lIF9fTUFUSERFQ0wodHlwZSwgZnVuY3Rpb24sc3VmZml4LCBhcmdzKSBcCisgIF9fTUFUSERFQ0xfMSh0eXBlLCBmdW5jdGlvbixzdWZmaXgsIGFyZ3MpOyBcCisgIF9fTUFUSERFQ0xfMSh0eXBlLCBfX0NPTkNBVChfXyxmdW5jdGlvbiksc3VmZml4LCBhcmdzKQorI2RlZmluZSBfX01BVEhDQUxMWChmdW5jdGlvbixzdWZmaXgsIGFyZ3MsIGF0dHJpYikJXAorICBfX01BVEhERUNMWCAoX01kb3VibGVfLGZ1bmN0aW9uLHN1ZmZpeCwgYXJncywgYXR0cmliKQorI2RlZmluZSBfX01BVEhERUNMWCh0eXBlLCBmdW5jdGlvbixzdWZmaXgsIGFyZ3MsIGF0dHJpYikgXAorICBfX01BVEhERUNMXzEodHlwZSwgZnVuY3Rpb24sc3VmZml4LCBhcmdzKSBfX2F0dHJpYnV0ZV9fIChhdHRyaWIpOyBcCisgIF9fTUFUSERFQ0xfMSh0eXBlLCBfX0NPTkNBVChfXyxmdW5jdGlvbiksc3VmZml4LCBhcmdzKSBfX2F0dHJpYnV0ZV9fIChhdHRyaWIpCisjZGVmaW5lIF9fTUFUSERFQ0xfMSh0eXBlLCBmdW5jdGlvbixzdWZmaXgsIGFyZ3MpIFwKKyAgZXh0ZXJuIHR5cGUgX19NQVRIX1BSRUNOQU1FKGZ1bmN0aW9uLHN1ZmZpeCkgYXJncyBfX1RIUk9XCisKKyNkZWZpbmUgX01kb3VibGVfCQlkb3VibGUKKyNkZWZpbmUgX19NQVRIX1BSRUNOQU1FKG5hbWUscikJX19DT05DQVQobmFtZSxyKQorI2RlZmluZSBfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UgX19CRUdJTl9OQU1FU1BBQ0VfU1RECisjZGVmaW5lIF9NZG91YmxlX0VORF9OQU1FU1BBQ0UgICBfX0VORF9OQU1FU1BBQ0VfU1RECisjaW5jbHVkZSA8Yml0cy9tYXRoY2FsbHMuaD4KKyN1bmRlZglfTWRvdWJsZV8KKyN1bmRlZiBfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UKKyN1bmRlZiBfTWRvdWJsZV9FTkRfTkFNRVNQQUNFCisjdW5kZWYJX19NQVRIX1BSRUNOQU1FCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKKworCisvKiBJbmNsdWRlIHRoZSBmaWxlIG9mIGRlY2xhcmF0aW9ucyBhZ2FpbiwgdGhpcyB0aW1lIHVzaW5nIGBmbG9hdCcKKyAgIGluc3RlYWQgb2YgYGRvdWJsZScgYW5kIGFwcGVuZGluZyBmIHRvIGVhY2ggZnVuY3Rpb24gbmFtZS4gICovCisKKyMgaWZuZGVmIF9NZmxvYXRfCisjICBkZWZpbmUgX01mbG9hdF8JCWZsb2F0CisjIGVuZGlmCisjIGRlZmluZSBfTWRvdWJsZV8JCV9NZmxvYXRfCisjIGlmZGVmIF9fU1REQ19fCisjICBkZWZpbmUgX19NQVRIX1BSRUNOQU1FKG5hbWUscikgbmFtZSMjZiMjcgorIyBlbHNlCisjICBkZWZpbmUgX19NQVRIX1BSRUNOQU1FKG5hbWUscikgbmFtZS8qKi9mLyoqL3IKKyMgZW5kaWYKKyMgZGVmaW5lIF9NZG91YmxlX0JFR0lOX05BTUVTUEFDRSBfX0JFR0lOX05BTUVTUEFDRV9DOTkKKyMgZGVmaW5lIF9NZG91YmxlX0VORF9OQU1FU1BBQ0UgICBfX0VORF9OQU1FU1BBQ0VfQzk5CisjIGluY2x1ZGUgPGJpdHMvbWF0aGNhbGxzLmg+CisjIHVuZGVmCV9NZG91YmxlXworIyB1bmRlZiBfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UKKyMgdW5kZWYgX01kb3VibGVfRU5EX05BTUVTUEFDRQorIyB1bmRlZglfX01BVEhfUFJFQ05BTUUKKworIyBpZiAoX19TVERDX18gLSAwIHx8IF9fR05VQ19fIC0gMCkgXAorICAgICAmJiAoIShkZWZpbmVkIF9fTk9fTE9OR19ET1VCTEVfTUFUSCAmJiBkZWZpbmVkIF9MSUJDKSBcCisJIHx8IGRlZmluZWQgX19MREJMX0NPTVBBVCkKKyMgIGlmZGVmIF9fTERCTF9DT01QQVQKKworIyAgIGlmZGVmIF9fVVNFX0lTT0M5OQorZXh0ZXJuIGZsb2F0IF9fbmxkYmxfbmV4dHRvd2FyZGYgKGZsb2F0IF9feCwgbG9uZyBkb3VibGUgX195KQorCQkJCSAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisjICAgIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKG5leHR0b3dhcmRmLCAoZmxvYXQgX194LCBsb25nIGRvdWJsZSBfX3kpLAorCQkJICAgICBfX25sZGJsX25leHR0b3dhcmRmKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChuZXh0dG93YXJkLCAoZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KSwKKwkJCSAgICAgIG5leHRhZnRlcikgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChuZXh0dG93YXJkbCwKKwkJCQkgICAobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpLAorCQkJCSAgIG5leHRhZnRlcikgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIF9fTERCTF9DT01QQVQgfHwgZGVmaW5lZCBfX05PX0xPTkdfRE9VQkxFX01BVEgKKworIyAgIHVuZGVmIF9fTUFUSERFQ0xfMQorIyAgIGRlZmluZSBfX01BVEhERUNMXzIodHlwZSwgZnVuY3Rpb24sc3VmZml4LCBhcmdzLCBhbGlhcykgXAorICBleHRlcm4gdHlwZSBfX1JFRElSRUNUX05USChfX01BVEhfUFJFQ05BTUUoZnVuY3Rpb24sc3VmZml4KSwgXAorCQkJICAgICBhcmdzLCBhbGlhcykKKyMgICBkZWZpbmUgX19NQVRIREVDTF8xKHR5cGUsIGZ1bmN0aW9uLHN1ZmZpeCwgYXJncykgXAorICBfX01BVEhERUNMXzIodHlwZSwgZnVuY3Rpb24sc3VmZml4LCBhcmdzLCBfX0NPTkNBVChmdW5jdGlvbixzdWZmaXgpKQorIyAgZW5kaWYKKworLyogSW5jbHVkZSB0aGUgZmlsZSBvZiBkZWNsYXJhdGlvbnMgYWdhaW4sIHRoaXMgdGltZSB1c2luZyBgbG9uZyBkb3VibGUnCisgICBpbnN0ZWFkIG9mIGBkb3VibGUnIGFuZCBhcHBlbmRpbmcgbCB0byBlYWNoIGZ1bmN0aW9uIG5hbWUuICAqLworCisjICBpZm5kZWYgX01sb25nX2RvdWJsZV8KKyMgICBkZWZpbmUgX01sb25nX2RvdWJsZV8JbG9uZyBkb3VibGUKKyMgIGVuZGlmCisjICBkZWZpbmUgX01kb3VibGVfCQlfTWxvbmdfZG91YmxlXworIyAgaWZkZWYgX19TVERDX18KKyMgICBkZWZpbmUgX19NQVRIX1BSRUNOQU1FKG5hbWUscikgbmFtZSMjbCMjcgorIyAgZWxzZQorIyAgIGRlZmluZSBfX01BVEhfUFJFQ05BTUUobmFtZSxyKSBuYW1lLyoqL2wvKiovcgorIyAgZW5kaWYKKyMgIGRlZmluZSBfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UgX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisjICBkZWZpbmUgX01kb3VibGVfRU5EX05BTUVTUEFDRSAgIF9fRU5EX05BTUVTUEFDRV9DOTkKKyMgIGRlZmluZSBfX01BVEhfREVDTEFSRV9MRE9VQkxFICAgMQorIyAgaW5jbHVkZSA8Yml0cy9tYXRoY2FsbHMuaD4KKyMgIHVuZGVmIF9NZG91YmxlXworIyAgdW5kZWYgX01kb3VibGVfQkVHSU5fTkFNRVNQQUNFCisjICB1bmRlZiBfTWRvdWJsZV9FTkRfTkFNRVNQQUNFCisjICB1bmRlZiBfX01BVEhfUFJFQ05BTUUKKworIyBlbmRpZiAvKiBfX1NURENfXyB8fCBfX0dOVUNfXyAqLworCisjZW5kaWYJLyogVXNlIG1pc2Mgb3IgSVNPIEM5OS4gICovCisjdW5kZWYJX19NQVRIREVDTF8xCisjdW5kZWYJX19NQVRIREVDTAorI3VuZGVmCV9fTUFUSENBTEwKKworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBieSBgZ2FtbWEnIGFuZCBgbGdhbW1hJy4gICovCitleHRlcm4gaW50IHNpZ25nYW07CisjZW5kaWYKKworCisvKiBJU08gQzk5IGRlZmluZXMgc29tZSBnZW5lcmljIG1hY3JvcyB3aGljaCB3b3JrIG9uIGFueSBkYXRhIHR5cGUuICAqLworI2lmZGVmIF9fVVNFX0lTT0M5OQorCisvKiBHZXQgdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyB2YWx1ZXMgZGVzY3JpYmluZyB0aGUgZmxvYXRpbmctcG9pbnQKKyAgIGV2YWx1YXRpb24uICBUaGUgZm9sbG93aW5nIHN5bWJvbHMgd2lsbCBnZXQgZGVmaW5lZDoKKworICAgIGZsb2F0X3QJZmxvYXRpbmctcG9pbnQgdHlwZSBhdCBsZWFzdCBhcyB3aWRlIGFzIGBmbG9hdCcgdXNlZAorCQl0byBldmFsdWF0ZSBgZmxvYXQnIGV4cHJlc3Npb25zCisgICAgZG91YmxlX3QJZmxvYXRpbmctcG9pbnQgdHlwZSBhdCBsZWFzdCBhcyB3aWRlIGFzIGBkb3VibGUnIHVzZWQKKwkJdG8gZXZhbHVhdGUgYGRvdWJsZScgZXhwcmVzc2lvbnMKKworICAgIEZMVF9FVkFMX01FVEhPRAorCQlEZWZpbmVkIHRvCisJCSAgMAlpZiBgZmxvYXRfdCcgaXMgYGZsb2F0JyBhbmQgYGRvdWJsZV90JyBpcyBgZG91YmxlJworCQkgIDEJaWYgYGZsb2F0X3QnIGFuZCBgZG91YmxlX3QnIGFyZSBgZG91YmxlJworCQkgIDIJaWYgYGZsb2F0X3QnIGFuZCBgZG91YmxlX3QnIGFyZSBgbG9uZyBkb3VibGUnCisJCSAgZWxzZQlgZmxvYXRfdCcgYW5kIGBkb3VibGVfdCcgYXJlIHVuc3BlY2lmaWVkCisKKyAgICBJTkZJTklUWQlyZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5maW5pdHkgdmFsdWUgb2YgdHlwZSBgZmxvYXQnCisKKyAgICBGUF9GQVNUX0ZNQQorICAgIEZQX0ZBU1RfRk1BRgorICAgIEZQX0ZBU1RfRk1BTAorCQlJZiBkZWZpbmVkIGl0IGluZGljYXRlcyB0aGF0IHRoZSBgZm1hJyBmdW5jdGlvbgorCQlnZW5lcmFsbHkgZXhlY3V0ZXMgYWJvdXQgYXMgZmFzdCBhcyBhIG11bHRpcGx5IGFuZCBhbiBhZGQuCisJCVRoaXMgbWFjcm8gaXMgZGVmaW5lZCBvbmx5IGlmZiB0aGUgYGZtYScgZnVuY3Rpb24gaXMKKwkJaW1wbGVtZW50ZWQgZGlyZWN0bHkgd2l0aCBhIGhhcmR3YXJlIG11bHRpcGx5LWFkZCBpbnN0cnVjdGlvbnMuCisKKyAgICBGUF9JTE9HQjAJRXhwYW5kcyB0byBhIHZhbHVlIHJldHVybmVkIGJ5IGBpbG9nYiAoMC4wKScuCisgICAgRlBfSUxPR0JOQU4JRXhwYW5kcyB0byBhIHZhbHVlIHJldHVybmVkIGJ5IGBpbG9nYiAoTkFOKScuCisKKyAgICBERUNJTUFMX0RJRwlOdW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMgc3VwcG9ydGVkIGJ5IGNvbnZlcnNpb24gYmV0d2VlbgorCQlkZWNpbWFsIGFuZCBhbGwgaW50ZXJuYWwgZmxvYXRpbmctcG9pbnQgZm9ybWF0cy4KKworKi8KKworLyogQWxsIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgY2FuIGJlIHB1dCBpbiBvbmUgb2YgdGhlc2UgY2F0ZWdvcmllcy4gICovCitlbnVtCisgIHsKKyAgICBGUF9OQU4sCisjIGRlZmluZSBGUF9OQU4gRlBfTkFOCisgICAgRlBfSU5GSU5JVEUsCisjIGRlZmluZSBGUF9JTkZJTklURSBGUF9JTkZJTklURQorICAgIEZQX1pFUk8sCisjIGRlZmluZSBGUF9aRVJPIEZQX1pFUk8KKyAgICBGUF9TVUJOT1JNQUwsCisjIGRlZmluZSBGUF9TVUJOT1JNQUwgRlBfU1VCTk9STUFMCisgICAgRlBfTk9STUFMCisjIGRlZmluZSBGUF9OT1JNQUwgRlBfTk9STUFMCisgIH07CisKKy8qIFJldHVybiBudW1iZXIgb2YgY2xhc3NpZmljYXRpb24gYXBwcm9wcmlhdGUgZm9yIFguICAqLworIyBpZmRlZiBfX05PX0xPTkdfRE9VQkxFX01BVEgKKyMgIGRlZmluZSBmcGNsYXNzaWZ5KHgpIFwKKyAgICAgKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkgPyBfX2ZwY2xhc3NpZnlmICh4KSA6IF9fZnBjbGFzc2lmeSAoeCkpCisjIGVsc2UKKyMgIGRlZmluZSBmcGNsYXNzaWZ5KHgpIFwKKyAgICAgKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkJCQkJCSAgICAgIFwKKyAgICAgID8gX19mcGNsYXNzaWZ5ZiAoeCkJCQkJCQkgICAgICBcCisgICAgICA6IHNpemVvZiAoeCkgPT0gc2l6ZW9mIChkb3VibGUpCQkJCQkgICAgICBcCisgICAgICA/IF9fZnBjbGFzc2lmeSAoeCkgOiBfX2ZwY2xhc3NpZnlsICh4KSkKKyMgZW5kaWYKKworLyogUmV0dXJuIG5vbnplcm8gdmFsdWUgaWYgc2lnbiBvZiBYIGlzIG5lZ2F0aXZlLiAgKi8KKyMgaWZkZWYgX19OT19MT05HX0RPVUJMRV9NQVRICisjICBkZWZpbmUgc2lnbmJpdCh4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpID8gX19zaWduYml0ZiAoeCkgOiBfX3NpZ25iaXQgKHgpKQorIyBlbHNlCisjICBkZWZpbmUgc2lnbmJpdCh4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpCQkJCQkgICAgICBcCisgICAgICA/IF9fc2lnbmJpdGYgKHgpCQkJCQkJCSAgICAgIFwKKyAgICAgIDogc2l6ZW9mICh4KSA9PSBzaXplb2YgKGRvdWJsZSkJCQkJCSAgICAgIFwKKyAgICAgID8gX19zaWduYml0ICh4KSA6IF9fc2lnbmJpdGwgKHgpKQorIyBlbmRpZgorCisvKiBSZXR1cm4gbm9uemVybyB2YWx1ZSBpZiBYIGlzIG5vdCArLUluZiBvciBOYU4uICAqLworIyBpZmRlZiBfX05PX0xPTkdfRE9VQkxFX01BVEgKKyMgIGRlZmluZSBpc2Zpbml0ZSh4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpID8gX19maW5pdGVmICh4KSA6IF9fZmluaXRlICh4KSkKKyMgZWxzZQorIyAgZGVmaW5lIGlzZmluaXRlKHgpIFwKKyAgICAgKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkJCQkJCSAgICAgIFwKKyAgICAgID8gX19maW5pdGVmICh4KQkJCQkJCQkgICAgICBcCisgICAgICA6IHNpemVvZiAoeCkgPT0gc2l6ZW9mIChkb3VibGUpCQkJCQkgICAgICBcCisgICAgICA/IF9fZmluaXRlICh4KSA6IF9fZmluaXRlbCAoeCkpCisjIGVuZGlmCisKKy8qIFJldHVybiBub256ZXJvIHZhbHVlIGlmIFggaXMgbmVpdGhlciB6ZXJvLCBzdWJub3JtYWwsIEluZiwgbm9yIE5hTi4gICovCisjIGRlZmluZSBpc25vcm1hbCh4KSAoZnBjbGFzc2lmeSAoeCkgPT0gRlBfTk9STUFMKQorCisvKiBSZXR1cm4gbm9uemVybyB2YWx1ZSBpZiBYIGlzIGEgTmFOLiAgV2UgY291bGQgdXNlIGBmcGNsYXNzaWZ5JyBidXQKKyAgIHdlIGFscmVhZHkgaGF2ZSB0aGlzIGZ1bmN0aW9ucyBgX19pc25hbicgYW5kIGl0IGlzIGZhc3Rlci4gICovCisjIGlmZGVmIF9fTk9fTE9OR19ET1VCTEVfTUFUSAorIyAgZGVmaW5lIGlzbmFuKHgpIFwKKyAgICAgKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkgPyBfX2lzbmFuZiAoeCkgOiBfX2lzbmFuICh4KSkKKyMgZWxzZQorIyAgZGVmaW5lIGlzbmFuKHgpIFwKKyAgICAgKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkJCQkJCSAgICAgIFwKKyAgICAgID8gX19pc25hbmYgKHgpCQkJCQkJCSAgICAgIFwKKyAgICAgIDogc2l6ZW9mICh4KSA9PSBzaXplb2YgKGRvdWJsZSkJCQkJCSAgICAgIFwKKyAgICAgID8gX19pc25hbiAoeCkgOiBfX2lzbmFubCAoeCkpCisjIGVuZGlmCisKKy8qIFJldHVybiBub256ZXJvIHZhbHVlIGlmIFggaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW5maW5pdHkuICAqLworIyBpZmRlZiBfX05PX0xPTkdfRE9VQkxFX01BVEgKKyMgIGRlZmluZSBpc2luZih4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpID8gX19pc2luZmYgKHgpIDogX19pc2luZiAoeCkpCisjIGVsc2UKKyMgIGRlZmluZSBpc2luZih4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpCQkJCQkgICAgICBcCisgICAgICA/IF9faXNpbmZmICh4KQkJCQkJCQkgICAgICBcCisgICAgICA6IHNpemVvZiAoeCkgPT0gc2l6ZW9mIChkb3VibGUpCQkJCQkgICAgICBcCisgICAgICA/IF9faXNpbmYgKHgpIDogX19pc2luZmwgKHgpKQorIyBlbmRpZgorCisvKiBCaXRtYXNrcyBmb3IgdGhlIG1hdGhfZXJyaGFuZGxpbmcgbWFjcm8uICAqLworIyBkZWZpbmUgTUFUSF9FUlJOTwkxCS8qIGVycm5vIHNldCBieSBtYXRoIGZ1bmN0aW9ucy4gICovCisjIGRlZmluZSBNQVRIX0VSUkVYQ0VQVAkyCS8qIEV4Y2VwdGlvbnMgcmFpc2VkIGJ5IG1hdGggZnVuY3Rpb25zLiAgKi8KKworLyogQnkgZGVmYXVsdCBhbGwgZnVuY3Rpb25zIHN1cHBvcnQgYm90aCBlcnJubyBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgSW4gZ2NjJ3MgZmFzdCBtYXRoIG1vZGUgYW5kIGlmIGlubGluZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgdGhpcworICAgbWlnaHQgbm90IGJlIHRydWUuICAqLworIyBpZm5kZWYgX19GQVNUX01BVEhfXworIyAgZGVmaW5lIG1hdGhfZXJyaGFuZGxpbmcJKE1BVEhfRVJSTk8gfCBNQVRIX0VSUkVYQ0VQVCkKKyMgZW5kaWYKKworI2VuZGlmIC8qIFVzZSBJU08gQzk5LiAgKi8KKworI2lmZGVmCV9fVVNFX01JU0MKKy8qIFN1cHBvcnQgZm9yIHZhcmlvdXMgZGlmZmVyZW50IHN0YW5kYXJkIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9ycy4gICovCit0eXBlZGVmIGVudW0KK3sKKyAgX0lFRUVfID0gLTEsCS8qIEFjY29yZGluZyB0byBJRUVFIDc1NC9JRUVFIDg1NC4gICovCisgIF9TVklEXywJLyogQWNjb3JkaW5nIHRvIFN5c3RlbSBWLCByZWxlYXNlIDQuICAqLworICBfWE9QRU5fLAkvKiBOb3dhZGF5cyBhbHNvIFVuaXg5OC4gICovCisgIF9QT1NJWF8sCisgIF9JU09DXwkvKiBBY3R1YWxseSB0aGlzIGlzIElTTyBDOTkuICAqLworfSBfTElCX1ZFUlNJT05fVFlQRTsKKworLyogVGhpcyB2YXJpYWJsZSBjYW4gYmUgY2hhbmdlZCBhdCBydW4tdGltZSB0byBhbnkgb2YgdGhlIHZhbHVlcyBhYm92ZSB0bworICAgYWZmZWN0IGZsb2F0aW5nIHBvaW50IGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yIChpdCBtYXkgYWxzbyBiZSBuZWNlc3NhcnkKKyAgIHRvIGNoYW5nZSB0aGUgaGFyZHdhcmUgRlBVIGV4Y2VwdGlvbiBzZXR0aW5ncykuICAqLworZXh0ZXJuIF9MSUJfVkVSU0lPTl9UWVBFIF9MSUJfVkVSU0lPTjsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9TVklECisvKiBJbiBTVklEIGVycm9yIGhhbmRsaW5nLCBgbWF0aGVycicgaXMgY2FsbGVkIHdpdGggdGhpcyBkZXNjcmlwdGlvbgorICAgb2YgdGhlIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbi4KKworICAgV2UgaGF2ZSBhIHByb2JsZW0gd2hlbiB1c2luZyBDKysgc2luY2UgYGV4Y2VwdGlvbicgaXMgYSByZXNlcnZlZAorICAgbmFtZSBpbiBDKysuICAqLworIyBpZmRlZiBfX2NwbHVzcGx1cworc3RydWN0IF9fZXhjZXB0aW9uCisjIGVsc2UKK3N0cnVjdCBleGNlcHRpb24KKyMgZW5kaWYKKyAgeworICAgIGludCB0eXBlOworICAgIGNoYXIgKm5hbWU7CisgICAgZG91YmxlIGFyZzE7CisgICAgZG91YmxlIGFyZzI7CisgICAgZG91YmxlIHJldHZhbDsKKyAgfTsKKworIyBpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuIGludCBtYXRoZXJyIChzdHJ1Y3QgX19leGNlcHRpb24gKl9fZXhjKSB0aHJvdyAoKTsKKyMgZWxzZQorZXh0ZXJuIGludCBtYXRoZXJyIChzdHJ1Y3QgZXhjZXB0aW9uICpfX2V4Yyk7CisjIGVuZGlmCisKKyMgZGVmaW5lIFhfVExPU1MJMS40MTQ4NDc1NTA0MDU2ODgwMDAwMGUrMTYKKworLyogVHlwZXMgb2YgZXhjZXB0aW9ucyBpbiB0aGUgYHR5cGUnIGZpZWxkLiAgKi8KKyMgZGVmaW5lIERPTUFJTgkJMQorIyBkZWZpbmUgU0lORwkJMgorIyBkZWZpbmUgT1ZFUkZMT1cJMworIyBkZWZpbmUgVU5ERVJGTE9XCTQKKyMgZGVmaW5lIFRMT1NTCQk1CisjIGRlZmluZSBQTE9TUwkJNgorCisvKiBTVklEIG1vZGUgc3BlY2lmaWVzIHJldHVybmluZyB0aGlzIGxhcmdlIHZhbHVlIGluc3RlYWQgb2YgaW5maW5pdHkuICAqLworIyBkZWZpbmUgSFVHRQkJMy40MDI4MjM0N2UrMzhGCisKKyNlbHNlCS8qICFTVklEICovCisKKyMgaWZkZWYgX19VU0VfWE9QRU4KKy8qIFgvT3BlbiB3YW50cyBhbm90aGVyIHN0cmFuZ2UgY29uc3RhbnQuICAqLworIyAgZGVmaW5lIE1BWEZMT0FUCTMuNDAyODIzNDdlKzM4RgorIyBlbmRpZgorCisjZW5kaWYJLyogU1ZJRCAqLworCisKKy8qIFNvbWUgdXNlZnVsIGNvbnN0YW50cy4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorIyBkZWZpbmUgTV9FCQkyLjcxODI4MTgyODQ1OTA0NTIzNTQJLyogZSAqLworIyBkZWZpbmUgTV9MT0cyRQkxLjQ0MjY5NTA0MDg4ODk2MzQwNzQJLyogbG9nXzIgZSAqLworIyBkZWZpbmUgTV9MT0cxMEUJMC40MzQyOTQ0ODE5MDMyNTE4Mjc2NQkvKiBsb2dfMTAgZSAqLworIyBkZWZpbmUgTV9MTjIJCTAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDIJLyogbG9nX2UgMiAqLworIyBkZWZpbmUgTV9MTjEwCQkyLjMwMjU4NTA5Mjk5NDA0NTY4NDAyCS8qIGxvZ19lIDEwICovCisjIGRlZmluZSBNX1BJCQkzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CS8qIHBpICovCisjIGRlZmluZSBNX1BJXzIJCTEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMJLyogcGkvMiAqLworIyBkZWZpbmUgTV9QSV80CQkwLjc4NTM5ODE2MzM5NzQ0ODMwOTYyCS8qIHBpLzQgKi8KKyMgZGVmaW5lIE1fMV9QSQkJMC4zMTgzMDk4ODYxODM3OTA2NzE1NAkvKiAxL3BpICovCisjIGRlZmluZSBNXzJfUEkJCTAuNjM2NjE5NzcyMzY3NTgxMzQzMDgJLyogMi9waSAqLworIyBkZWZpbmUgTV8yX1NRUlRQSQkxLjEyODM3OTE2NzA5NTUxMjU3MzkwCS8qIDIvc3FydChwaSkgKi8KKyMgZGVmaW5lIE1fU1FSVDIJMS40MTQyMTM1NjIzNzMwOTUwNDg4MAkvKiBzcXJ0KDIpICovCisjIGRlZmluZSBNX1NRUlQxXzIJMC43MDcxMDY3ODExODY1NDc1MjQ0MAkvKiAxL3NxcnQoMikgKi8KKyNlbmRpZgorCisvKiBUaGUgYWJvdmUgY29uc3RhbnRzIGFyZSBub3QgYWRlcXVhdGUgZm9yIGNvbXB1dGF0aW9uIHVzaW5nIGBsb25nIGRvdWJsZSdzLgorICAgVGhlcmVmb3JlIHdlIHByb3ZpZGUgYXMgYW4gZXh0ZW5zaW9uIGNvbnN0YW50cyB3aXRoIHNpbWlsYXIgbmFtZXMgYXMgYQorICAgR05VIGV4dGVuc2lvbi4gIFByb3ZpZGUgZW5vdWdoIGRpZ2l0cyBmb3IgdGhlIDEyOC1iaXQgSUVFRSBxdWFkLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE1fRWwJCTIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYyNUwgIC8qIGUgKi8KKyMgZGVmaW5lIE1fTE9HMkVsCTEuNDQyNjk1MDQwODg4OTYzNDA3MzU5OTI0NjgxMDAxODkyMUwgIC8qIGxvZ18yIGUgKi8KKyMgZGVmaW5lIE1fTE9HMTBFbAkwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1MTEyODkxODkxNjYwNTFMICAvKiBsb2dfMTAgZSAqLworIyBkZWZpbmUgTV9MTjJsCQkwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NjZMICAvKiBsb2dfZSAyICovCisjIGRlZmluZSBNX0xOMTBsCTIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MkwgIC8qIGxvZ19lIDEwICovCisjIGRlZmluZSBNX1BJbAkJMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI5TCAgLyogcGkgKi8KKyMgZGVmaW5lIE1fUElfMmwJMS41NzA3OTYzMjY3OTQ4OTY2MTkyMzEzMjE2OTE2Mzk3NTE0TCAgLyogcGkvMiAqLworIyBkZWZpbmUgTV9QSV80bAkwLjc4NTM5ODE2MzM5NzQ0ODMwOTYxNTY2MDg0NTgxOTg3NTdMICAvKiBwaS80ICovCisjIGRlZmluZSBNXzFfUElsCTAuMzE4MzA5ODg2MTgzNzkwNjcxNTM3NzY3NTI2NzQ1MDI4N0wgIC8qIDEvcGkgKi8KKyMgZGVmaW5lIE1fMl9QSWwJMC42MzY2MTk3NzIzNjc1ODEzNDMwNzU1MzUwNTM0OTAwNTc0TCAgLyogMi9waSAqLworIyBkZWZpbmUgTV8yX1NRUlRQSWwJMS4xMjgzNzkxNjcwOTU1MTI1NzM4OTYxNTg5MDMxMjE1NDUyTCAgLyogMi9zcXJ0KHBpKSAqLworIyBkZWZpbmUgTV9TUVJUMmwJMS40MTQyMTM1NjIzNzMwOTUwNDg4MDE2ODg3MjQyMDk2OTgxTCAgLyogc3FydCgyKSAqLworIyBkZWZpbmUgTV9TUVJUMV8ybAkwLjcwNzEwNjc4MTE4NjU0NzUyNDQwMDg0NDM2MjEwNDg0OTBMICAvKiAxL3NxcnQoMikgKi8KKyNlbmRpZgorCisKKy8qIFdoZW4gY29tcGlsaW5nIGluIHN0cmljdCBJU08gQyBjb21wYXRpYmxlIG1vZGUgd2UgbXVzdCBub3QgdXNlIHRoZQorICAgaW5saW5lIGZ1bmN0aW9ucyBzaW5jZSB0aGV5LCBhbW9uZyBvdGhlciB0aGluZ3MsIGRvIG5vdCBzZXQgdGhlCisgICBgZXJybm8nIHZhcmlhYmxlIGNvcnJlY3RseS4gICovCisjaWYgZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gJiYgIWRlZmluZWQgX19OT19NQVRIX0lOTElORVMKKyMgZGVmaW5lIF9fTk9fTUFUSF9JTkxJTkVTCTEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgX19HTlVDX1BSRVJFUSgyLDk3KQorLyogSVNPIEM5OSBkZWZpbmVzIHNvbWUgbWFjcm9zIHRvIGNvbXBhcmUgbnVtYmVyIHdoaWxlIHRha2luZyBjYXJlIGZvcgorICAgdW5vcmRlcmVkIG51bWJlcnMuICBNYW55IEZQVXMgcHJvdmlkZSBzcGVjaWFsIGluc3RydWN0aW9ucyB0byBzdXBwb3J0CisgICB0aGVzZSBvcGVyYXRpb25zLiAgR2VuZXJpYyBzdXBwb3J0IGluIEdDQyBmb3IgdGhlc2UgYXMgYnVpbHRpbnMgd2VudAorICAgaW4gYmVmb3JlIDMuMC4wLCBidXQgbm90IGFsbCBjcHVzIGFkZGVkIHRoZWlyIHBhdHRlcm5zLiAgV2UgZGVmaW5lCisgICB2ZXJzaW9ucyB0aGF0IHVzZSB0aGUgYnVpbHRpbnMgaGVyZSwgYW5kIDxiaXRzL21hdGhpbmxpbmUuaD4gd2lsbAorICAgdW5kZWYvcmVkZWZpbmUgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBzcGVjaWZpYyBHQ0MgdmVyc2lvbiBpbiB1c2UuICAqLworIyBkZWZpbmUgaXNncmVhdGVyKHgsIHkpCV9fYnVpbHRpbl9pc2dyZWF0ZXIoeCwgeSkKKyMgZGVmaW5lIGlzZ3JlYXRlcmVxdWFsKHgsIHkpCV9fYnVpbHRpbl9pc2dyZWF0ZXJlcXVhbCh4LCB5KQorIyBkZWZpbmUgaXNsZXNzKHgsIHkpCQlfX2J1aWx0aW5faXNsZXNzKHgsIHkpCisjIGRlZmluZSBpc2xlc3NlcXVhbCh4LCB5KQlfX2J1aWx0aW5faXNsZXNzZXF1YWwoeCwgeSkKKyMgZGVmaW5lIGlzbGVzc2dyZWF0ZXIoeCwgeSkJX19idWlsdGluX2lzbGVzc2dyZWF0ZXIoeCwgeSkKKyMgZGVmaW5lIGlzdW5vcmRlcmVkKHUsIHYpCV9fYnVpbHRpbl9pc3Vub3JkZXJlZCh1LCB2KQorI2VuZGlmCisKKy8qIEdldCBtYWNoaW5lLWRlcGVuZGVudCBpbmxpbmUgdmVyc2lvbnMgKGlmIHRoZXJlIGFyZSBhbnkpLiAgKi8KKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworIyBpbmNsdWRlIDxiaXRzL21hdGhpbmxpbmUuaD4KKyNlbmRpZgorCisvKiBEZWZpbmUgc3BlY2lhbCBlbnRyeSBwb2ludHMgdG8gdXNlIHdoZW4gdGhlIGNvbXBpbGVyIGdvdCB0b2xkIHRvCisgICBvbmx5IGV4cGVjdCBmaW5pdGUgcmVzdWx0cy4gICovCisjaWYgZGVmaW5lZCBfX0ZJTklURV9NQVRIX09OTFlfXyAmJiBfX0ZJTklURV9NQVRIX09OTFlfXyA+IDAKKyMgaW5jbHVkZSA8Yml0cy9tYXRoLWZpbml0ZS5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9JU09DOTkKKy8qIElmIHdlJ3ZlIHN0aWxsIGdvdCB1bmRlZmluZWQgY29tcGFyaXNvbiBtYWNyb3MsIHByb3ZpZGUgZGVmYXVsdHMuICAqLworCisvKiBSZXR1cm4gbm9uemVybyB2YWx1ZSBpZiBYIGlzIGdyZWF0ZXIgdGhhbiBZLiAgKi8KKyMgaWZuZGVmIGlzZ3JlYXRlcgorIyAgZGVmaW5lIGlzZ3JlYXRlcih4LCB5KSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fdHlwZW9mX18oeCkgX194ID0gKHgpOyBfX3R5cGVvZl9fKHkpIF9feSA9ICh5KTsJCQkgICAgICBcCisgICAgICAhaXN1bm9yZGVyZWQgKF9feCwgX195KSAmJiBfX3ggPiBfX3k7IH0pKQorIyBlbmRpZgorCisvKiBSZXR1cm4gbm9uemVybyB2YWx1ZSBpZiBYIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBZLiAgKi8KKyMgaWZuZGVmIGlzZ3JlYXRlcmVxdWFsCisjICBkZWZpbmUgaXNncmVhdGVyZXF1YWwoeCwgeSkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBfX3R5cGVvZl9fKHgpIF9feCA9ICh4KTsgX190eXBlb2ZfXyh5KSBfX3kgPSAoeSk7CQkJICAgICAgXAorICAgICAgIWlzdW5vcmRlcmVkIChfX3gsIF9feSkgJiYgX194ID49IF9feTsgfSkpCisjIGVuZGlmCisKKy8qIFJldHVybiBub256ZXJvIHZhbHVlIGlmIFggaXMgbGVzcyB0aGFuIFkuICAqLworIyBpZm5kZWYgaXNsZXNzCisjICBkZWZpbmUgaXNsZXNzKHgsIHkpIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgX190eXBlb2ZfXyh4KSBfX3ggPSAoeCk7IF9fdHlwZW9mX18oeSkgX195ID0gKHkpOwkJCSAgICAgIFwKKyAgICAgICFpc3Vub3JkZXJlZCAoX194LCBfX3kpICYmIF9feCA8IF9feTsgfSkpCisjIGVuZGlmCisKKy8qIFJldHVybiBub256ZXJvIHZhbHVlIGlmIFggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFkuICAqLworIyBpZm5kZWYgaXNsZXNzZXF1YWwKKyMgIGRlZmluZSBpc2xlc3NlcXVhbCh4LCB5KSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fdHlwZW9mX18oeCkgX194ID0gKHgpOyBfX3R5cGVvZl9fKHkpIF9feSA9ICh5KTsJCQkgICAgICBcCisgICAgICAhaXN1bm9yZGVyZWQgKF9feCwgX195KSAmJiBfX3ggPD0gX195OyB9KSkKKyMgZW5kaWYKKworLyogUmV0dXJuIG5vbnplcm8gdmFsdWUgaWYgZWl0aGVyIFggaXMgbGVzcyB0aGFuIFkgb3IgWSBpcyBsZXNzIHRoYW4gWC4gICovCisjIGlmbmRlZiBpc2xlc3NncmVhdGVyCisjICBkZWZpbmUgaXNsZXNzZ3JlYXRlcih4LCB5KSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fdHlwZW9mX18oeCkgX194ID0gKHgpOyBfX3R5cGVvZl9fKHkpIF9feSA9ICh5KTsJCQkgICAgICBcCisgICAgICAhaXN1bm9yZGVyZWQgKF9feCwgX195KSAmJiAoX194IDwgX195IHx8IF9feSA8IF9feCk7IH0pKQorIyBlbmRpZgorCisvKiBSZXR1cm4gbm9uemVybyB2YWx1ZSBpZiBhcmd1bWVudHMgYXJlIHVub3JkZXJlZC4gICovCisjIGlmbmRlZiBpc3Vub3JkZXJlZAorIyAgZGVmaW5lIGlzdW5vcmRlcmVkKHUsIHYpIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgX190eXBlb2ZfXyh1KSBfX3UgPSAodSk7IF9fdHlwZW9mX18odikgX192ID0gKHYpOwkJCSAgICAgIFwKKyAgICAgIGZwY2xhc3NpZnkgKF9fdSkgPT0gRlBfTkFOIHx8IGZwY2xhc3NpZnkgKF9fdikgPT0gRlBfTkFOOyB9KSkKKyMgZW5kaWYKKworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKworI2VuZGlmIC8qIG1hdGguaCAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbWNoZWNrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL21jaGVjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MmI5NDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL21jaGVjay5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01DSEVDS19ICisjZGVmaW5lIF9NQ0hFQ0tfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJldHVybiB2YWx1ZXMgZm9yIGBtcHJvYmUnOiB0aGVzZSBhcmUgdGhlIGtpbmRzIG9mIGluY29uc2lzdGVuY2llcyB0aGF0CisgICBgbWNoZWNrJyBlbmFibGVzIGRldGVjdGlvbiBvZi4gICovCitlbnVtIG1jaGVja19zdGF0dXMKKyAgeworICAgIE1DSEVDS19ESVNBQkxFRCA9IC0xLCAgICAgICAvKiBDb25zaXN0ZW5jeSBjaGVja2luZyBpcyBub3QgdHVybmVkIG9uLiAgKi8KKyAgICBNQ0hFQ0tfT0ssICAgICAgICAgICAgICAgICAgLyogQmxvY2sgaXMgZmluZS4gICovCisgICAgTUNIRUNLX0ZSRUUsICAgICAgICAgICAgICAgIC8qIEJsb2NrIGZyZWVkIHR3aWNlLiAgKi8KKyAgICBNQ0hFQ0tfSEVBRCwgICAgICAgICAgICAgICAgLyogTWVtb3J5IGJlZm9yZSB0aGUgYmxvY2sgd2FzIGNsb2JiZXJlZC4gICovCisgICAgTUNIRUNLX1RBSUwgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhZnRlciB0aGUgYmxvY2sgd2FzIGNsb2JiZXJlZC4gICovCisgIH07CisKKworLyogQWN0aXZhdGUgYSBzdGFuZGFyZCBjb2xsZWN0aW9uIG9mIGRlYnVnZ2luZyBob29rcy4gIFRoaXMgbXVzdCBiZSBjYWxsZWQKKyAgIGJlZm9yZSBgbWFsbG9jJyBpcyBldmVyIGNhbGxlZC4gIEFCT1JURlVOQyBpcyBjYWxsZWQgd2l0aCBhbiBlcnJvciBjb2RlCisgICAoc2VlIGVudW0gYWJvdmUpIHdoZW4gYW4gaW5jb25zaXN0ZW5jeSBpcyBkZXRlY3RlZC4gIElmIEFCT1JURlVOQyBpcworICAgbnVsbCwgdGhlIHN0YW5kYXJkIGZ1bmN0aW9uIHByaW50cyBvbiBzdGRlcnIgYW5kIHRoZW4gY2FsbHMgYGFib3J0Jy4gICovCitleHRlcm4gaW50IG1jaGVjayAodm9pZCAoKl9fYWJvcnRmdW5jKSAoZW51bSBtY2hlY2tfc3RhdHVzKSkgX19USFJPVzsKKworLyogU2ltaWxhciB0byBgbWNoZWNrJyBidXQgcGVyZm9ybXMgY2hlY2tzIGZvciBhbGwgYmxvY2sgd2hlbmV2ZXIgb25lIG9mCisgICB0aGUgbWVtb3J5IGhhbmRsaW5nIGZ1bmN0aW9ucyBpcyBjYWxsZWQuICBUaGlzIGNhbiBiZSB2ZXJ5IHNsb3cuICAqLworZXh0ZXJuIGludCBtY2hlY2tfcGVkYW50aWMgKHZvaWQgKCpfX2Fib3J0ZnVuYykgKGVudW0gbWNoZWNrX3N0YXR1cykpIF9fVEhST1c7CisKKy8qIEZvcmNlIGNoZWNrIG9mIGFsbCBibG9ja3Mgbm93LiAgKi8KK2V4dGVybiB2b2lkIG1jaGVja19jaGVja19hbGwgKHZvaWQpOworCisvKiBDaGVjayBmb3IgYWJlcnJhdGlvbnMgaW4gYSBwYXJ0aWN1bGFyIG1hbGxvYydkIGJsb2NrLiAgWW91IG11c3QgaGF2ZQorICAgY2FsbGVkIGBtY2hlY2snIGFscmVhZHkuICBUaGVzZSBhcmUgdGhlIHNhbWUgY2hlY2tzIHRoYXQgYG1jaGVjaycgZG9lcworICAgd2hlbiB5b3UgZnJlZSBvciByZWFsbG9jYXRlIGEgYmxvY2suICAqLworZXh0ZXJuIGVudW0gbWNoZWNrX3N0YXR1cyBtcHJvYmUgKHZvaWQgKl9fcHRyKSBfX1RIUk9XOworCisvKiBBY3RpdmF0ZSBhIHN0YW5kYXJkIGNvbGxlY3Rpb24gb2YgdHJhY2luZyBob29rcy4gICovCitleHRlcm4gdm9pZCBtdHJhY2UgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gdm9pZCBtdW50cmFjZSAodm9pZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG1jaGVjay5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL21lbW9yeS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDNmYTZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tZW1vcnkuaApAQCAtMCwwICsxLDM0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBTVklECisgKi8KKworI2lmbmRlZglfTUVNT1JZX0gKKyNkZWZpbmUJX01FTU9SWV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKworI2lmbmRlZglfU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYJLyogc3RyaW5nLmggICovCisKKworI2VuZGlmCS8qIG1lbW9yeS5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tZW51LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL21lbnUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWVhYzAxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tZW51LmgKQEAgLTAsMCArMSwyNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNywyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIEF1dGhvcjogIEp1ZXJnZW4gUGZlaWZlciwgMTk5NSwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICRJZDogbWVudS5oLHYgMS4yMCAyMDA5LzA0LzA1IDAwOjI4OjA3IHRvbSBFeHAgJCAqLworCisjaWZuZGVmIEVUSV9NRU5VCisjZGVmaW5lIEVUSV9NRU5VCisKKyNpZmRlZiBBTUlHQQorI2RlZmluZSBURVhUIFRFWFRfbmN1cnNlcworI2VuZGlmCisKKyNpbmNsdWRlIDxjdXJzZXMuaD4KKyNpbmNsdWRlIDxldGkuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIGludCBNZW51X09wdGlvbnM7Cit0eXBlZGVmIGludCBJdGVtX09wdGlvbnM7CisKKy8qIE1lbnUgb3B0aW9uczogKi8KKyNkZWZpbmUgT19PTkVWQUxVRSAgICAgICgweDAxKQorI2RlZmluZSBPX1NIT1dERVNDICAgICAgKDB4MDIpCisjZGVmaW5lIE9fUk9XTUFKT1IgICAgICAoMHgwNCkKKyNkZWZpbmUgT19JR05PUkVDQVNFICAgICgweDA4KQorI2RlZmluZSBPX1NIT1dNQVRDSCAgICAgKDB4MTApCisjZGVmaW5lIE9fTk9OQ1lDTElDICAgICAoMHgyMCkKKworLyogSXRlbSBvcHRpb25zOiAqLworI2RlZmluZSBPX1NFTEVDVEFCTEUgICAgKDB4MDEpCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIqIHN0cjsKKyAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworfSBURVhUOworCit0eXBlZGVmIHN0cnVjdCB0YWdJVEVNIAoreworICBURVhUICAgICAgICAgICBuYW1lOyAgICAgICAgLyogbmFtZSBvZiBtZW51IGl0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVEVYVCAgICAgICAgICAgZGVzY3JpcHRpb247IC8qIGRlc2NyaXB0aW9uIG9mIGl0ZW0sIG9wdGlvbmFsIGluIGRpc3BsYXkgICovIAorICBzdHJ1Y3QgdGFnTUVOVSAqaW1lbnU7ICAgICAgLyogUG9pbnRlciB0byBwYXJlbnQgbWVudSAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAgICAgICAgICAgKnVzZXJwdHI7ICAgIC8qIFBvaW50ZXIgdG8gdXNlciBkZWZpbmVkIHBlciBpdGVtIGRhdGEgICAgICovIAorICBJdGVtX09wdGlvbnMgICBvcHQ7ICAgICAgICAgLyogSXRlbSBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisgIHNob3J0ICAgICAgICAgIGluZGV4OyAgICAgICAvKiBJdGVtIG51bWJlciBpZiBjb25uZWN0ZWQgdG8gYSBtZW51ICAgICAgICAqLworICBzaG9ydCAgICAgICAgICB5OyAgICAgICAgICAgLyogeSBhbmQgeCBsb2NhdGlvbiBvZiBpdGVtIGluIG1lbnUgICAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgeDsKKyAgYm9vbCAgICAgICAgICAgdmFsdWU7ICAgICAgIC8qIFNlbGVjdGlvbiB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBzdHJ1Y3QgdGFnSVRFTSAqbGVmdDsgICAgICAgLyogbmVpZ2hib3IgaXRlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RydWN0IHRhZ0lURU0gKnJpZ2h0OworICBzdHJ1Y3QgdGFnSVRFTSAqdXA7CisgIHN0cnVjdCB0YWdJVEVNICpkb3duOworCit9IElURU07CisKK3R5cGVkZWYgdm9pZCAoKk1lbnVfSG9vaykoc3RydWN0IHRhZ01FTlUgKik7CisKK3R5cGVkZWYgc3RydWN0IHRhZ01FTlUgCit7CisgIHNob3J0ICAgICAgICAgIGhlaWdodDsgICAgICAgICAgICAgICAgLyogTnIuIG9mIGNoYXJzIGhpZ2ggICAgICAgICAgICAgICAqLworICBzaG9ydCAgICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgIC8qIE5yLiBvZiBjaGFycyB3aWRlICAgICAgICAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgcm93czsgICAgICAgICAgICAgICAgICAvKiBOci4gb2YgaXRlbXMgaGlnaCAgICAgICAgICAgICAgICovCisgIHNob3J0ICAgICAgICAgIGNvbHM7ICAgICAgICAgICAgICAgICAgLyogTnIuIG9mIGl0ZW1zIHdpZGUgICAgICAgICAgICAgICAqLworICBzaG9ydCAgICAgICAgICBmcm93czsgICAgICAgICAgICAgICAgIC8qIE5yLiBvZiBmb3JtYXR0ZWQgaXRlbXMgaGlnaCAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgZmNvbHM7ICAgICAgICAgICAgICAgICAvKiBOci4gb2YgZm9ybWF0dGVkIGl0ZW1zIHdpZGUgICAgICovCisgIHNob3J0ICAgICAgICAgIGFyb3dzOyAgICAgICAgICAgICAgICAgLyogTnIuIG9mIGl0ZW1zIGhpZ2ggKGFjdHVhbCkgICAgICAqLworICBzaG9ydCAgICAgICAgICBuYW1lbGVuOyAgICAgICAgICAgICAgIC8qIE1heC4gbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgZGVzY2xlbjsgICAgICAgICAgICAgICAvKiBNYXguIGRlc2NyaXB0aW9uIGxlbmd0aCAgICAgICAgICovCisgIHNob3J0ICAgICAgICAgIG1hcmtsZW47ICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIG1hcmssIGlmIGFueSAgICAgICAgICAqLworICBzaG9ydCAgICAgICAgICBpdGVtbGVuOyAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBvbmUgaXRlbSAgICAgICAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgc3BjX2Rlc2M7ICAgICAgICAgICAgICAvKiBTcGFjaW5nIGZvciBkZXNjcmlwdG9yICAgICAgICAgICovCisgIHNob3J0ICAgICAgICAgIHNwY19jb2xzOyAgICAgICAgICAgICAgLyogU3BhY2luZyBmb3IgY29sdW1ucyAgICAgICAgICAgICAqLworICBzaG9ydCAgICAgICAgICBzcGNfcm93czsgICAgICAgICAgICAgIC8qIFNwYWNpbmcgZm9yIHJvd3MgICAgICAgICAgICAgICAgKi8gCisgIGNoYXIgICAgICAgICAgKnBhdHRlcm47ICAgICAgICAgICAgICAgLyogQnVmZmVyIHRvIHN0b3JlIG1hdGNoIGNoYXJzICAgICAqLworICBzaG9ydCAgICAgICAgICBwaW5kZXg7ICAgICAgICAgICAgICAgIC8qIEluZGV4IGludG8gcGF0dGVybiBidWZmZXIgICAgICAgKi8KKyAgV0lORE9XICAgICAgICAqd2luOyAgICAgICAgICAgICAgICAgICAvKiBXaW5kb3cgY29udGFpbmluZyBtZW51ICAgICAgICAgICovCisgIFdJTkRPVyAgICAgICAgKnN1YjsgICAgICAgICAgICAgICAgICAgLyogU3Vid2luZG93IGZvciBtZW51IGRpc3BsYXkgICAgICAqLworICBXSU5ET1cgICAgICAgICp1c2Vyd2luOyAgICAgICAgICAgICAgIC8qIFVzZXIncyB3aW5kb3cgICAgICAgICAgICAgICAgICAgKi8KKyAgV0lORE9XICAgICAgICAqdXNlcnN1YjsgICAgICAgICAgICAgICAvKiBVc2VyJ3Mgc3Vid2luZG93ICAgICAgICAgICAgICAgICovCisgIElURU0gICAgICAgICAgKippdGVtczsgICAgICAgICAgICAgICAgLyogYXJyYXkgb2YgaXRlbXMgICAgICAgICAgICAgICAgICAqLyAKKyAgc2hvcnQgICAgICAgICAgbml0ZW1zOyAgICAgICAgICAgICAgICAvKiBOci4gb2YgaXRlbXMgaW4gbWVudSAgICAgICAgICAgICovCisgIElURU0gICAgICAgICAgKmN1cml0ZW07ICAgICAgICAgICAgICAgLyogQ3VycmVudCBpdGVtICAgICAgICAgICAgICAgICAgICAqLworICBzaG9ydCAgICAgICAgICB0b3Byb3c7ICAgICAgICAgICAgICAgIC8qIFRvcCByb3cgb2YgbWVudSAgICAgICAgICAgICAgICAgKi8KKyAgY2h0eXBlICAgICAgICAgZm9yZTsgICAgICAgICAgICAgICAgICAvKiBTZWxlY3Rpb24gYXR0cmlidXRlICAgICAgICAgICAgICovCisgIGNodHlwZSAgICAgICAgIGJhY2s7ICAgICAgICAgICAgICAgICAgLyogTm9uc2VsZWN0aW9uIGF0dHJpYnV0ZSAgICAgICAgICAqLworICBjaHR5cGUgICAgICAgICBncmV5OyAgICAgICAgICAgICAgICAgIC8qIEluYWN0aXZlIGF0dHJpYnV0ZSAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgY2hhciAgcGFkOyAgICAgICAgICAgICAgICAgICAvKiBQYWQgY2hhcmFjdGVyICAgICAgICAgICAgICAgICAgICovCisKKyAgTWVudV9Ib29rICAgICAgbWVudWluaXQ7ICAgICAgICAgICAgICAvKiBVc2VyIGhvb2tzICAgICAgICAgICAgICAgICAgICAgICovCisgIE1lbnVfSG9vayAgICAgIG1lbnV0ZXJtOworICBNZW51X0hvb2sgICAgICBpdGVtaW5pdDsKKyAgTWVudV9Ib29rICAgICAgaXRlbXRlcm07CisKKyAgdm9pZCAgICAgICAgICAqdXNlcnB0cjsgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG1lbnVzIHVzZXIgZGF0YSAgICAgICovCisgIGNoYXIgICAgICAgICAgKm1hcms7ICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBtYXJrZXIgc3RyaW5nICAgICAgICAqLworCisgIE1lbnVfT3B0aW9ucyAgIG9wdDsgICAgICAgICAgICAgICAgICAgLyogTWVudSBvcHRpb25zICAgICAgICAgICAgICAgICAgICAqLworICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7ICAgICAgICAgICAgICAgIC8qIEludGVybmFsIHN0YXRlIG9mIG1lbnUgICAgICAgICAgKi8KKworfSBNRU5VOworCisKKy8qIERlZmluZSBrZXlzICovCisKKyNkZWZpbmUgUkVRX0xFRlRfSVRFTSAgICAgICAgICAgKEtFWV9NQVggKyAxKQorI2RlZmluZSBSRVFfUklHSFRfSVRFTSAgICAgICAgICAoS0VZX01BWCArIDIpCisjZGVmaW5lIFJFUV9VUF9JVEVNICAgICAgICAgICAgIChLRVlfTUFYICsgMykKKyNkZWZpbmUgUkVRX0RPV05fSVRFTSAgICAgICAgICAgKEtFWV9NQVggKyA0KQorI2RlZmluZSBSRVFfU0NSX1VMSU5FICAgICAgICAgICAoS0VZX01BWCArIDUpCisjZGVmaW5lIFJFUV9TQ1JfRExJTkUgICAgICAgICAgIChLRVlfTUFYICsgNikKKyNkZWZpbmUgUkVRX1NDUl9EUEFHRSAgICAgICAgICAgKEtFWV9NQVggKyA3KQorI2RlZmluZSBSRVFfU0NSX1VQQUdFICAgICAgICAgICAoS0VZX01BWCArIDgpCisjZGVmaW5lIFJFUV9GSVJTVF9JVEVNICAgICAgICAgIChLRVlfTUFYICsgOSkKKyNkZWZpbmUgUkVRX0xBU1RfSVRFTSAgICAgICAgICAgKEtFWV9NQVggKyAxMCkKKyNkZWZpbmUgUkVRX05FWFRfSVRFTSAgICAgICAgICAgKEtFWV9NQVggKyAxMSkKKyNkZWZpbmUgUkVRX1BSRVZfSVRFTSAgICAgICAgICAgKEtFWV9NQVggKyAxMikKKyNkZWZpbmUgUkVRX1RPR0dMRV9JVEVNICAgICAgICAgKEtFWV9NQVggKyAxMykKKyNkZWZpbmUgUkVRX0NMRUFSX1BBVFRFUk4gICAgICAgKEtFWV9NQVggKyAxNCkKKyNkZWZpbmUgUkVRX0JBQ0tfUEFUVEVSTiAgICAgICAgKEtFWV9NQVggKyAxNSkKKyNkZWZpbmUgUkVRX05FWFRfTUFUQ0ggICAgICAgICAgKEtFWV9NQVggKyAxNikKKyNkZWZpbmUgUkVRX1BSRVZfTUFUQ0ggICAgICAgICAgKEtFWV9NQVggKyAxNykKKworI2RlZmluZSBNSU5fTUVOVV9DT01NQU5EICAgICAgICAoS0VZX01BWCArIDEpCisjZGVmaW5lIE1BWF9NRU5VX0NPTU1BTkQgICAgICAgIChLRVlfTUFYICsgMTcpCisKKy8qCisgKiBTb21lIEFUJlQgY29kZSBleHBlY3RzIE1BWF9DT01NQU5EIHRvIGJlIG91dC1vZi1iYW5kIG5vdAorICoganVzdCBmb3IgbWVudSBjb21tYW5kcyBidXQgZm9yIGZvcm1zIG9uZXMgYXMgd2VsbC4KKyAqLworI2lmIGRlZmluZWQoTUFYX0NPTU1BTkQpCisjICBpZiAoTUFYX01FTlVfQ09NTUFORCA+IE1BWF9DT01NQU5EKQorIyAgICBlcnJvciBTb21ldGhpbmcgaXMgd3JvbmcgLS0gTUFYX01FTlVfQ09NTUFORCBpcyBncmVhdGVyIHRoYW4gTUFYX0NPTU1BTkQKKyMgIGVsaWYgKE1BWF9DT01NQU5EICE9IChLRVlfTUFYICsgMTI4KSkKKyMgICAgZXJyb3IgU29tZXRoaW5nIGlzIHdyb25nIC0tIE1BWF9DT01NQU5EIGlzIGFscmVhZHkgaW5jb25zaXN0ZW50bHkgZGVmaW5lZC4KKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIE1BWF9DT01NQU5EIChLRVlfTUFYICsgMTI4KQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tIHByb3RvdHlwZXMgZm9yIGxpYm1lbnUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChJVEVNICoqKQltZW51X2l0ZW1zIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKElURU0gKikJY3VycmVudF9pdGVtIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKElURU0gKikJbmV3X2l0ZW0gKGNvbnN0IGNoYXIgKixjb25zdCBjaGFyICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoTUVOVSAqKQluZXdfbWVudSAoSVRFTSAqKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChJdGVtX09wdGlvbnMpCWl0ZW1fb3B0cyAoY29uc3QgSVRFTSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChNZW51X09wdGlvbnMpCW1lbnVfb3B0cyAoY29uc3QgTUVOVSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKE1lbnVfSG9vaykJaXRlbV9pbml0IChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKE1lbnVfSG9vaykJaXRlbV90ZXJtIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKE1lbnVfSG9vaykJbWVudV9pbml0IChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKE1lbnVfSG9vaykJbWVudV90ZXJtIChjb25zdCBNRU5VICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopCW1lbnVfc3ViIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKQltZW51X3dpbiAoY29uc3QgTUVOVSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IGNoYXIgKikJaXRlbV9kZXNjcmlwdGlvbiAoY29uc3QgSVRFTSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopCWl0ZW1fbmFtZSAoY29uc3QgSVRFTSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopCW1lbnVfbWFyayAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopCW1lbnVfcmVxdWVzdF9uYW1lIChpbnQpOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKQltZW51X3BhdHRlcm4gKGNvbnN0IE1FTlUgKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkICopCW1lbnVfdXNlcnB0ciAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkICopCWl0ZW1fdXNlcnB0ciAoY29uc3QgSVRFTSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNodHlwZSkJbWVudV9iYWNrIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNodHlwZSkJbWVudV9mb3JlIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNodHlwZSkJbWVudV9ncmV5IChjb25zdCBNRU5VICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmcmVlX2l0ZW0gKElURU0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmcmVlX21lbnUgKE1FTlUgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlpdGVtX2NvdW50IChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJaXRlbV9pbmRleCAoY29uc3QgSVRFTSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWl0ZW1fb3B0c19vZmYgKElURU0gKixJdGVtX09wdGlvbnMpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJaXRlbV9vcHRzX29uIChJVEVNICosSXRlbV9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCW1lbnVfZHJpdmVyIChNRU5VICosaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCW1lbnVfb3B0c19vZmYgKE1FTlUgKixNZW51X09wdGlvbnMpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJbWVudV9vcHRzX29uIChNRU5VICosTWVudV9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCW1lbnVfcGFkIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJcG9zX21lbnVfY3Vyc29yIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJcG9zdF9tZW51IChNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2NhbGVfbWVudSAoY29uc3QgTUVOVSAqLGludCAqLGludCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9jdXJyZW50X2l0ZW0gKE1FTlUgKm1lbnUsSVRFTSAqaXRlbSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfaXRlbV9pbml0IChNRU5VICosIE1lbnVfSG9vayk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfaXRlbV9vcHRzIChJVEVNICosSXRlbV9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9pdGVtX3Rlcm0gKE1FTlUgKiwgTWVudV9Ib29rKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9pdGVtX3VzZXJwdHIgKElURU0gKiwgdm9pZCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9pdGVtX3ZhbHVlIChJVEVNICosYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9iYWNrIChNRU5VICosY2h0eXBlKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X2ZvcmUgKE1FTlUgKixjaHR5cGUpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X21lbnVfZm9ybWF0IChNRU5VICosaW50LGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9ncmV5IChNRU5VICosY2h0eXBlKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X2luaXQgKE1FTlUgKiwgTWVudV9Ib29rKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X2l0ZW1zIChNRU5VICosSVRFTSAqKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9tYXJrIChNRU5VICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9vcHRzIChNRU5VICosTWVudV9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X3BhZCAoTUVOVSAqLGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9wYXR0ZXJuIChNRU5VICosY29uc3QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X3N1YiAoTUVOVSAqLFdJTkRPVyAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X3Rlcm0gKE1FTlUgKiwgTWVudV9Ib29rKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X3VzZXJwdHIgKE1FTlUgKix2b2lkICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X21lbnVfd2luIChNRU5VICosV0lORE9XICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X3RvcF9yb3cgKE1FTlUgKixpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJdG9wX3JvdyAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXVucG9zdF9tZW51IChNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJbWVudV9yZXF1ZXN0X2J5X25hbWUgKGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9zcGFjaW5nIChNRU5VICosaW50LGludCxpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJbWVudV9zcGFjaW5nIChjb25zdCBNRU5VICosaW50ICosaW50ICosaW50ICopOworCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKQlpdGVtX3ZhbHVlIChjb25zdCBJVEVNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpCWl0ZW1fdmlzaWJsZSAoY29uc3QgSVRFTSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpCW1lbnVfZm9ybWF0IChjb25zdCBNRU5VICosaW50ICosaW50ICopOworCisjaWYgTkNVUlNFU19TUF9GVU5DUworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKE1FTlUgKikJTkNVUlNFU19TUF9OQU1FKG5ld19tZW51KSAoU0NSRUVOKiwgSVRFTSAqKik7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIH0KKyNlbmRpZgorCisjZW5kaWYgLyogRVRJX01FTlUgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbW50ZW50LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL21udGVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MmU5NTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL21udGVudC5oCkBAIC0wLDAgKzEsOTggQEAKKy8qIFV0aWxpdGllcyBmb3IgcmVhZGluZy93cml0aW5nIGZzdGFiLCBtdGFiLCBldGMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX01OVEVOVF9ICisjZGVmaW5lCV9NTlRFTlRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2RlZmluZSBfX25lZWRfRklMRQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cGF0aHMuaD4KKworCisvKiBGaWxlIGxpc3RpbmcgY2Fub25pY2FsIGludGVyZXN0aW5nIG1vdW50IHBvaW50cy4gICovCisjZGVmaW5lCU1OVFRBQgkJX1BBVEhfTU5UVEFCCS8qIERlcHJlY2F0ZWQgYWxpYXMuICAqLworCisvKiBGaWxlIGxpc3RpbmcgY3VycmVudGx5IGFjdGl2ZSBtb3VudCBwb2ludHMuICAqLworI2RlZmluZQlNT1VOVEVECQlfUEFUSF9NT1VOVEVECS8qIERlcHJlY2F0ZWQgYWxpYXMuICAqLworCisKKy8qIEdlbmVyYWwgZmlsZXN5c3RlbSB0eXBlcy4gICovCisjZGVmaW5lIE1OVFRZUEVfSUdOT1JFCSJpZ25vcmUiCS8qIElnbm9yZSB0aGlzIGVudHJ5LiAgKi8KKyNkZWZpbmUgTU5UVFlQRV9ORlMJIm5mcyIJCS8qIE5ldHdvcmsgZmlsZSBzeXN0ZW0uICAqLworI2RlZmluZSBNTlRUWVBFX1NXQVAJInN3YXAiCQkvKiBTd2FwIGRldmljZS4gICovCisKKworLyogR2VuZXJpYyBtb3VudCBvcHRpb25zLiAgKi8KKyNkZWZpbmUgTU5UT1BUX0RFRkFVTFRTCSJkZWZhdWx0cyIJLyogVXNlIGFsbCBkZWZhdWx0IG9wdGlvbnMuICAqLworI2RlZmluZSBNTlRPUFRfUk8JInJvIgkJLyogUmVhZCBvbmx5LiAgKi8KKyNkZWZpbmUgTU5UT1BUX1JXCSJydyIJCS8qIFJlYWQvd3JpdGUuICAqLworI2RlZmluZSBNTlRPUFRfU1VJRAkic3VpZCIJCS8qIFNldCB1aWQgYWxsb3dlZC4gICovCisjZGVmaW5lIE1OVE9QVF9OT1NVSUQJIm5vc3VpZCIJLyogTm8gc2V0IHVpZCBhbGxvd2VkLiAgKi8KKyNkZWZpbmUgTU5UT1BUX05PQVVUTwkibm9hdXRvIgkvKiBEbyBub3QgYXV0byBtb3VudC4gICovCisKKworX19CRUdJTl9ERUNMUworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIG1vdW50IHRhYmxlIGVudHJ5LiAgKi8KK3N0cnVjdCBtbnRlbnQKKyAgeworICAgIGNoYXIgKm1udF9mc25hbWU7CQkvKiBEZXZpY2Ugb3Igc2VydmVyIGZvciBmaWxlc3lzdGVtLiAgKi8KKyAgICBjaGFyICptbnRfZGlyOwkJLyogRGlyZWN0b3J5IG1vdW50ZWQgb24uICAqLworICAgIGNoYXIgKm1udF90eXBlOwkJLyogVHlwZSBvZiBmaWxlc3lzdGVtOiB1ZnMsIG5mcywgZXRjLiAgKi8KKyAgICBjaGFyICptbnRfb3B0czsJCS8qIENvbW1hLXNlcGFyYXRlZCBvcHRpb25zIGZvciBmcy4gICovCisgICAgaW50IG1udF9mcmVxOwkJLyogRHVtcCBmcmVxdWVuY3kgKGluIGRheXMpLiAgKi8KKyAgICBpbnQgbW50X3Bhc3NubzsJCS8qIFBhc3MgbnVtYmVyIGZvciBgZnNjaycuICAqLworICB9OworCisKKy8qIFByZXBhcmUgdG8gYmVnaW4gcmVhZGluZyBhbmQvb3Igd3JpdGluZyBtb3VudCB0YWJsZSBlbnRyaWVzIGZyb20gdGhlCisgICBiZWdpbm5pbmcgb2YgRklMRS4gIE1PREUgaXMgYXMgZm9yIGBmb3BlbicuICAqLworZXh0ZXJuIEZJTEUgKnNldG1udGVudCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fY29uc3QgY2hhciAqX19tb2RlKSBfX1RIUk9XOworCisvKiBSZWFkIG9uZSBtb3VudCB0YWJsZSBlbnRyeSBmcm9tIFNUUkVBTS4gIFJldHVybnMgYSBwb2ludGVyIHRvIHN0b3JhZ2UKKyAgIHJldXNlZCBvbiB0aGUgbmV4dCBjYWxsLCBvciBudWxsIGZvciBFT0Ygb3IgZXJyb3IgKHVzZSBmZW9mL2ZlcnJvciB0bworICAgY2hlY2spLiAgKi8KK2V4dGVybiBzdHJ1Y3QgbW50ZW50ICpnZXRtbnRlbnQgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XOworCisjaWZkZWYgX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb24gb2YgdGhlIGFib3ZlIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiBzdHJ1Y3QgbW50ZW50ICpnZXRtbnRlbnRfciAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJCQkgICBzdHJ1Y3QgbW50ZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0LAorCQkJCSAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsCisJCQkJICAgaW50IF9fYnVmc2l6ZSkgX19USFJPVzsKKyNlbmRpZgorCisvKiBXcml0ZSB0aGUgbW91bnQgdGFibGUgZW50cnkgZGVzY3JpYmVkIGJ5IE1OVCB0byBTVFJFQU0uCisgICBSZXR1cm4gemVybyBvbiBzdWNjZXNzLCBub256ZXJvIG9uIGZhaWx1cmUuICAqLworZXh0ZXJuIGludCBhZGRtbnRlbnQgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCSAgICAgIF9fY29uc3Qgc3RydWN0IG1udGVudCAqX19yZXN0cmljdCBfX21udCkgX19USFJPVzsKKworLyogQ2xvc2UgYSBzdHJlYW0gb3BlbmVkIHdpdGggYHNldG1udGVudCcuICAqLworZXh0ZXJuIGludCBlbmRtbnRlbnQgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XOworCisvKiBTZWFyY2ggTU5ULT5tbnRfb3B0cyBmb3IgYW4gb3B0aW9uIG1hdGNoaW5nIE9QVC4KKyAgIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN1YnN0cmluZywgb3IgbnVsbCBpZiBub25lIGZvdW5kLiAgKi8KK2V4dGVybiBjaGFyICpoYXNtbnRvcHQgKF9fY29uc3Qgc3RydWN0IG1udGVudCAqX19tbnQsCisJCQlfX2NvbnN0IGNoYXIgKl9fb3B0KSBfX1RIUk9XOworCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBtbnRlbnQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tb25ldGFyeS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tb25ldGFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMGMwZWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL21vbmV0YXJ5LmgKQEAgLTAsMCArMSw2MCBAQAorLyogSGVhZGVyIGZpbGUgZm9yIG1vbmV0YXJ5IHZhbHVlIGZvcm1hdHRpbmcgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMiwyMDA2LDIwMDkKKwlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfTU9ORVRBUllfSAorI2RlZmluZQlfTU9ORVRBUllfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgbmVlZGVkIHR5cGVzLiAgKi8KKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworI2lmbmRlZglfX3NzaXplX3RfZGVmaW5lZAordHlwZWRlZiBfX3NzaXplX3Qgc3NpemVfdDsKKyMgZGVmaW5lIF9fc3NpemVfdF9kZWZpbmVkCisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIEZvcm1hdHRpbmcgYSBtb25ldGFyeSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLiAgKi8KK2V4dGVybiBzc2l6ZV90IHN0cmZtb24gKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhzaXplLAorCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZm9ybWF0X3N0cmZtb25fXyAoMywgNCk7CisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorIyBpbmNsdWRlIDx4bG9jYWxlLmg+CisKKy8qIEZvcm1hdHRpbmcgYSBtb25ldGFyeSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLiAgKi8KK2V4dGVybiBzc2l6ZV90IHN0cmZtb25fbCAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX21heHNpemUsCisJCQkgIF9fbG9jYWxlX3QgX19sb2MsCisJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2Zvcm1hdF9zdHJmbW9uX18gKDQsIDUpOworI2VuZGlmCisKKyNpZmRlZiBfX0xEQkxfQ09NUEFUCisjIGluY2x1ZGUgPGJpdHMvbW9uZXRhcnktbGRibC5oPgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBtb25ldGFyeS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL21xdWV1ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGMzZTFiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tcXVldWUuaApAQCAtMCwwICsxLDEwMSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NUVVFVUVfSAorI2RlZmluZSBfTVFVRVVFX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2RlZmluZSBfX25lZWRfc2lnZXZlbnRfdAorI2luY2x1ZGUgPGJpdHMvc2lnaW5mby5oPgorI2RlZmluZSBfX25lZWRfdGltZXNwZWMKKyNpbmNsdWRlIDx0aW1lLmg+CisvKiBHZXQgdGhlIGRlZmluaXRpb24gb2YgbXFkX3QgYW5kIHN0cnVjdCBtcV9hdHRyLiAgKi8KKyNpbmNsdWRlIDxiaXRzL21xdWV1ZS5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIEVzdGFibGlzaCBjb25uZWN0aW9uIGJldHdlZW4gYSBwcm9jZXNzIGFuZCBhIG1lc3NhZ2UgcXVldWUgTkFNRSBhbmQKKyAgIHJldHVybiBtZXNzYWdlIHF1ZXVlIGRlc2NyaXB0b3Igb3IgKG1xZF90KSAtMSBvbiBlcnJvci4gIE9GTEFHIGRldGVybWluZXMKKyAgIHRoZSB0eXBlIG9mIGFjY2VzcyB1c2VkLiAgSWYgT19DUkVBVCBpcyBvbiBPRkxBRywgdGhlIHRoaXJkIGFyZ3VtZW50IGlzCisgICB0YWtlbiBhcyBhIGBtb2RlX3QnLCB0aGUgbW9kZSBvZiB0aGUgY3JlYXRlZCBtZXNzYWdlIHF1ZXVlLCBhbmQgdGhlIGZvdXJ0aAorICAgYXJndW1lbnQgaXMgdGFrZW4gYXMgYHN0cnVjdCBtcV9hdHRyIConLCBwb2ludGVyIHRvIG1lc3NhZ2UgcXVldWUKKyAgIGF0dHJpYnV0ZXMuICBJZiB0aGUgZm91cnRoIGFyZ3VtZW50IGlzIE5VTEwsIGRlZmF1bHQgYXR0cmlidXRlcyBhcmUKKyAgIHVzZWQuICAqLworZXh0ZXJuIG1xZF90IG1xX29wZW4gKF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQgX19vZmxhZywgLi4uKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogUmVtb3ZlcyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBtZXNzYWdlIHF1ZXVlIGRlc2NyaXB0b3IgTVFERVMgYW5kIGl0cworICAgbWVzc2FnZSBxdWV1ZS4gICovCitleHRlcm4gaW50IG1xX2Nsb3NlIChtcWRfdCBfX21xZGVzKSBfX1RIUk9XOworCisvKiBRdWVyeSBzdGF0dXMgYW5kIGF0dHJpYnV0ZXMgb2YgbWVzc2FnZSBxdWV1ZSBNUURFUy4gICovCitleHRlcm4gaW50IG1xX2dldGF0dHIgKG1xZF90IF9fbXFkZXMsIHN0cnVjdCBtcV9hdHRyICpfX21xc3RhdCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKKy8qIFNldCBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBtZXNzYWdlIHF1ZXVlIE1RREVTIGFuZCBpZiBPTVFTVEFUIGlzCisgICBub3QgTlVMTCBhbHNvIHF1ZXJ5IGl0cyBvbGQgYXR0cmlidXRlcy4gICovCitleHRlcm4gaW50IG1xX3NldGF0dHIgKG1xZF90IF9fbXFkZXMsCisJCSAgICAgICBfX2NvbnN0IHN0cnVjdCBtcV9hdHRyICpfX3Jlc3RyaWN0IF9fbXFzdGF0LAorCQkgICAgICAgc3RydWN0IG1xX2F0dHIgKl9fcmVzdHJpY3QgX19vbXFzdGF0KQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworLyogUmVtb3ZlIG1lc3NhZ2UgcXVldWUgbmFtZWQgTkFNRS4gICovCitleHRlcm4gaW50IG1xX3VubGluayAoX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZWdpc3RlciBub3RpZmljYXRpb24gaXNzdWVkIHVwb24gbWVzc2FnZSBhcnJpdmFsIHRvIGFuIGVtcHR5CisgICBtZXNzYWdlIHF1ZXVlIE1RREVTLiAgKi8KK2V4dGVybiBpbnQgbXFfbm90aWZ5IChtcWRfdCBfX21xZGVzLCBfX2NvbnN0IHN0cnVjdCBzaWdldmVudCAqX19ub3RpZmljYXRpb24pCisgICAgIF9fVEhST1c7CisKKy8qIFJlY2VpdmUgdGhlIG9sZGVzdCBmcm9tIGhpZ2hlc3QgcHJpb3JpdHkgbWVzc2FnZXMgaW4gbWVzc2FnZSBxdWV1ZQorICAgTVFERVMuICAqLworZXh0ZXJuIHNzaXplX3QgbXFfcmVjZWl2ZSAobXFkX3QgX19tcWRlcywgY2hhciAqX19tc2dfcHRyLCBzaXplX3QgX19tc2dfbGVuLAorCQkJICAgdW5zaWduZWQgaW50ICpfX21zZ19wcmlvKSBfX25vbm51bGwgKCgyKSk7CisKKy8qIEFkZCBtZXNzYWdlIHBvaW50ZWQgYnkgTVNHX1BUUiB0byBtZXNzYWdlIHF1ZXVlIE1RREVTLiAgKi8KK2V4dGVybiBpbnQgbXFfc2VuZCAobXFkX3QgX19tcWRlcywgX19jb25zdCBjaGFyICpfX21zZ19wdHIsIHNpemVfdCBfX21zZ19sZW4sCisJCSAgICB1bnNpZ25lZCBpbnQgX19tc2dfcHJpbykgX19ub25udWxsICgoMikpOworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogUmVjZWl2ZSB0aGUgb2xkZXN0IGZyb20gaGlnaGVzdCBwcmlvcml0eSBtZXNzYWdlcyBpbiBtZXNzYWdlIHF1ZXVlCisgICBNUURFUywgc3RvcCB3YWl0aW5nIGlmIEFCU19USU1FT1VUIGV4cGlyZXMuICAqLworZXh0ZXJuIHNzaXplX3QgbXFfdGltZWRyZWNlaXZlIChtcWRfdCBfX21xZGVzLCBjaGFyICpfX3Jlc3RyaWN0IF9fbXNnX3B0ciwKKwkJCQlzaXplX3QgX19tc2dfbGVuLAorCQkJCXVuc2lnbmVkIGludCAqX19yZXN0cmljdCBfX21zZ19wcmlvLAorCQkJCV9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3Jlc3RyaWN0IF9fYWJzX3RpbWVvdXQpCisgIF9fbm9ubnVsbCAoKDIsIDUpKTsKKworLyogQWRkIG1lc3NhZ2UgcG9pbnRlZCBieSBNU0dfUFRSIHRvIG1lc3NhZ2UgcXVldWUgTVFERVMsIHN0b3AgYmxvY2tpbmcKKyAgIG9uIGZ1bGwgbWVzc2FnZSBxdWV1ZSBpZiBBQlNfVElNRU9VVCBleHBpcmVzLiAgKi8KK2V4dGVybiBpbnQgbXFfdGltZWRzZW5kIChtcWRfdCBfX21xZGVzLCBfX2NvbnN0IGNoYXIgKl9fbXNnX3B0ciwKKwkJCSBzaXplX3QgX19tc2dfbGVuLCB1bnNpZ25lZCBpbnQgX19tc2dfcHJpbywKKwkJCSBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19hYnNfdGltZW91dCkKKyAgX19ub25udWxsICgoMiwgNSkpOworI2VuZGlmCisKKy8qIERlZmluZSBzb21lIGlubGluZXMgaGVscGluZyB0byBjYXRjaCBjb21tb24gcHJvYmxlbXMuICAqLworI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZSBcCisgICAgJiYgZGVmaW5lZCBfX3ZhX2FyZ19wYWNrX2xlbgorIyBpbmNsdWRlIDxiaXRzL21xdWV1ZTIuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbXF1ZXVlLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbXRkL2luZnRsLXVzZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbXRkL2luZnRsLXVzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzc2YmQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tdGQvaW5mdGwtdXNlci5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBQYXJ0cyBvZiBJTkZUTCBoZWFkZXJzIHNoYXJlZCB3aXRoIHVzZXJzcGFjZQorICoKKyAqLworCisjaWZuZGVmIF9fTVREX0lORlRMX1VTRVJfSF9fCisjZGVmaW5lIF9fTVREX0lORlRMX1VTRVJfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lCU9TQUtfVkVSU0lPTgkweDUxMjAKKyNkZWZpbmUJUEVSQ0VOVFVTRUQJOTgKKworI2RlZmluZQlTRUNUT1JTSVpFCTUxMgorCisvKiBCbG9jayBDb250cm9sIEluZm9ybWF0aW9uICovCisKK3N0cnVjdCBpbmZ0bF9iY2kgeworCV9fdTggRUNDc2lnWzZdOworCV9fdTggU3RhdHVzOworCV9fdTggU3RhdHVzMTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpbmZ0bF91bml0aGVhZDEgeworCV9fdTE2IHZpcnR1YWxVbml0Tm87CisJX191MTYgcHJldlVuaXRObzsKKwlfX3U4IEFOQUM7CisJX191OCBOQUNzOworCV9fdTggcGFyaXR5UGVyRmllbGQ7CisJX191OCBkaXNjYXJkZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaW5mdGxfdW5pdGhlYWQyIHsKKwlfX3U4IHBhcml0eVBlckZpZWxkOworCV9fdTggQU5BQzsKKwlfX3UxNiBwcmV2VW5pdE5vOworCV9fdTE2IHZpcnR1YWxVbml0Tm87CisJX191OCBOQUNzOworCV9fdTggZGlzY2FyZGVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGluZnRsX3VuaXR0YWlsIHsKKwlfX3U4IFJlc2VydmVkWzRdOworCV9fdTE2IEVyYXNlTWFyazsKKwlfX3UxNiBFcmFzZU1hcmsxOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordW5pb24gaW5mdGxfdWNpIHsKKwlzdHJ1Y3QgaW5mdGxfdW5pdGhlYWQxIGE7CisJc3RydWN0IGluZnRsX3VuaXRoZWFkMiBiOworCXN0cnVjdCBpbmZ0bF91bml0dGFpbCBjOworfTsKKworc3RydWN0IGluZnRsX29vYiB7CisJc3RydWN0IGluZnRsX2JjaSBiOworCXVuaW9uIGluZnRsX3VjaSB1OworfTsKKworCisvKiBJTkZUTCBNZWRpYSBIZWFkZXIgKi8KKworc3RydWN0IElORlRMUGFydGl0aW9uIHsKKwlfX3UzMiB2aXJ0dWFsVW5pdHM7CisJX191MzIgZmlyc3RVbml0OworCV9fdTMyIGxhc3RVbml0OworCV9fdTMyIGZsYWdzOworCV9fdTMyIHNwYXJlVW5pdHM7CisJX191MzIgUmVzZXJ2ZWQwOworCV9fdTMyIFJlc2VydmVkMTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBJTkZUTE1lZGlhSGVhZGVyIHsKKwljaGFyIGJvb3RSZWNvcmRJRFs4XTsKKwlfX3UzMiBOb09mQm9vdEltYWdlQmxvY2tzOworCV9fdTMyIE5vT2ZCaW5hcnlQYXJ0aXRpb25zOworCV9fdTMyIE5vT2ZCRFRMUGFydGl0aW9uczsKKwlfX3UzMiBCbG9ja011bHRpcGxpZXJCaXRzOworCV9fdTMyIEZvcm1hdEZsYWdzOworCV9fdTMyIE9zYWtWZXJzaW9uOworCV9fdTMyIFBlcmNlbnRVc2VkOworCXN0cnVjdCBJTkZUTFBhcnRpdGlvbiBQYXJ0aXRpb25zWzRdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogUGFydGl0aW9uIGZsYWcgdHlwZXMgKi8KKyNkZWZpbmUJSU5GVExfQklOQVJZCTB4MjAwMDAwMDAKKyNkZWZpbmUJSU5GVExfQkRUTAkweDQwMDAwMDAwCisjZGVmaW5lCUlORlRMX0xBU1QJMHg4MDAwMDAwMAorCisjZW5kaWYgLyogX19NVERfSU5GVExfVVNFUl9IX18gKi8KKworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL210ZC9tdGQtYWJpLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL210ZC9tdGQtYWJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlMTY3YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbXRkL210ZC1hYmkuaApAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAxOTk5LTIwMTAgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPiBldCBhbC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fTVREX0FCSV9IX18KKyNkZWZpbmUgX19NVERfQUJJX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGVyYXNlX2luZm9fdXNlciB7CisJX191MzIgc3RhcnQ7CisJX191MzIgbGVuZ3RoOworfTsKKworc3RydWN0IGVyYXNlX2luZm9fdXNlcjY0IHsKKwlfX3U2NCBzdGFydDsKKwlfX3U2NCBsZW5ndGg7Cit9OworCitzdHJ1Y3QgbXRkX29vYl9idWYgeworCV9fdTMyIHN0YXJ0OworCV9fdTMyIGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyICpwdHI7Cit9OworCitzdHJ1Y3QgbXRkX29vYl9idWY2NCB7CisJX191NjQgc3RhcnQ7CisJX191MzIgcGFkOworCV9fdTMyIGxlbmd0aDsKKwlfX3U2NCB1c3JfcHRyOworfTsKKworLyoqCisgKiBNVEQgb3BlcmF0aW9uIG1vZGVzCisgKgorICogQE1URF9PUFNfUExBQ0VfT09COglPT0IgZGF0YSBhcmUgcGxhY2VkIGF0IHRoZSBnaXZlbiBvZmZzZXQgKGRlZmF1bHQpCisgKiBATVREX09QU19BVVRPX09PQjoJT09CIGRhdGEgYXJlIGF1dG9tYXRpY2FsbHkgcGxhY2VkIGF0IHRoZSBmcmVlIGFyZWFzCisgKgkJCXdoaWNoIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbnRlcm5hbCBlY2NsYXlvdXQKKyAqIEBNVERfT1BTX1JBVzoJZGF0YSBhcmUgdHJhbnNmZXJyZWQgYXMtaXMsIHdpdGggbm8gZXJyb3IgY29ycmVjdGlvbjsKKyAqCQkJdGhpcyBtb2RlIGltcGxpZXMgJU1URF9PUFNfUExBQ0VfT09CCisgKgorICogVGhlc2UgbW9kZXMgY2FuIGJlIHBhc3NlZCB0byBpb2N0bChNRU1XUklURSkgYW5kIGFyZSBhbHNvIHVzZWQgaW50ZXJuYWxseS4KKyAqIFNlZSBub3RlcyBvbiAiTVREIGZpbGUgbW9kZXMiIGZvciBkaXNjdXNzaW9uIG9uICVNVERfT1BTX1JBVyB2cy4KKyAqICVNVERfRklMRV9NT0RFX1JBVy4KKyAqLworZW51bSB7CisJTVREX09QU19QTEFDRV9PT0IgPSAwLAorCU1URF9PUFNfQVVUT19PT0IgPSAxLAorCU1URF9PUFNfUkFXID0gMiwKK307CisKKy8qKgorICogc3RydWN0IG10ZF93cml0ZV9yZXEgLSBkYXRhIHN0cnVjdHVyZSBmb3IgcmVxdWVzdGluZyBhIHdyaXRlIG9wZXJhdGlvbgorICoKKyAqIEBzdGFydDoJc3RhcnQgYWRkcmVzcworICogQGxlbjoJbGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgKiBAb29ibGVuOglsZW5ndGggb2YgT09CIGJ1ZmZlcgorICogQHVzcl9kYXRhOgl1c2VyLXByb3ZpZGVkIGRhdGEgYnVmZmVyCisgKiBAdXNyX29vYjoJdXNlci1wcm92aWRlZCBPT0IgYnVmZmVyCisgKiBAbW9kZToJTVREIG1vZGUgKHNlZSAiTVREIG9wZXJhdGlvbiBtb2RlcyIpCisgKiBAcGFkZGluZzoJcmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIDAKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBzdXBwb3J0cyBpb2N0bChNRU1XUklURSkgb3BlcmF0aW9ucywgYWxsb3dpbmcgZGF0YSBhbmQvb3IgT09CCisgKiB3cml0ZXMgaW4gdmFyaW91cyBtb2Rlcy4gVG8gd3JpdGUgdG8gT09CLW9ubHksIHNldCBAdXNyX2RhdGEgPT0gTlVMTCwgYW5kIHRvCisgKiB3cml0ZSBkYXRhLW9ubHksIHNldCBAdXNyX29vYiA9PSBOVUxMLiBIb3dldmVyLCBzZXR0aW5nIGJvdGggQHVzcl9kYXRhIGFuZAorICogQHVzcl9vb2IgdG8gTlVMTCBpcyBub3QgYWxsb3dlZC4KKyAqLworc3RydWN0IG10ZF93cml0ZV9yZXEgeworCV9fdTY0IHN0YXJ0OworCV9fdTY0IGxlbjsKKwlfX3U2NCBvb2JsZW47CisJX191NjQgdXNyX2RhdGE7CisJX191NjQgdXNyX29vYjsKKwlfX3U4IG1vZGU7CisJX191OCBwYWRkaW5nWzddOworfTsKKworI2RlZmluZSBNVERfQUJTRU5UCQkwCisjZGVmaW5lIE1URF9SQU0JCQkxCisjZGVmaW5lIE1URF9ST00JCQkyCisjZGVmaW5lIE1URF9OT1JGTEFTSAkJMworI2RlZmluZSBNVERfTkFOREZMQVNICQk0CisjZGVmaW5lIE1URF9EQVRBRkxBU0gJCTYKKyNkZWZpbmUgTVREX1VCSVZPTFVNRQkJNworI2RlZmluZSBNVERfTUxDTkFOREZMQVNICTgKKworI2RlZmluZSBNVERfV1JJVEVBQkxFCQkweDQwMAkvKiBEZXZpY2UgaXMgd3JpdGVhYmxlICovCisjZGVmaW5lIE1URF9CSVRfV1JJVEVBQkxFCTB4ODAwCS8qIFNpbmdsZSBiaXRzIGNhbiBiZSBmbGlwcGVkICovCisjZGVmaW5lIE1URF9OT19FUkFTRQkJMHgxMDAwCS8qIE5vIGVyYXNlIG5lY2Vzc2FyeSAqLworI2RlZmluZSBNVERfUE9XRVJVUF9MT0NLCTB4MjAwMAkvKiBBbHdheXMgbG9ja2VkIGFmdGVyIHJlc2V0ICovCisKKy8qIFNvbWUgY29tbW9uIGRldmljZXMgLyBjb21iaW5hdGlvbnMgb2YgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lIE1URF9DQVBfUk9NCQkwCisjZGVmaW5lIE1URF9DQVBfUkFNCQkoTVREX1dSSVRFQUJMRSB8IE1URF9CSVRfV1JJVEVBQkxFIHwgTVREX05PX0VSQVNFKQorI2RlZmluZSBNVERfQ0FQX05PUkZMQVNICShNVERfV1JJVEVBQkxFIHwgTVREX0JJVF9XUklURUFCTEUpCisjZGVmaW5lIE1URF9DQVBfTkFOREZMQVNICShNVERfV1JJVEVBQkxFKQorCisvKiBPYnNvbGV0ZSBFQ0MgYnl0ZSBwbGFjZW1lbnQgbW9kZXMgKHVzZWQgd2l0aCBvYnNvbGV0ZSBNRU1HRVRPT0JTRUwpICovCisjZGVmaW5lIE1URF9OQU5ERUNDX09GRgkJMAkvLyBTd2l0Y2ggb2ZmIEVDQyAoTm90IHJlY29tbWVuZGVkKQorI2RlZmluZSBNVERfTkFOREVDQ19QTEFDRQkxCS8vIFVzZSB0aGUgZ2l2ZW4gcGxhY2VtZW50IGluIHRoZSBzdHJ1Y3R1cmUgKFlBRkZTMSBsZWdhY3kgbW9kZSkKKyNkZWZpbmUgTVREX05BTkRFQ0NfQVVUT1BMQUNFCTIJLy8gVXNlIHRoZSBkZWZhdWx0IHBsYWNlbWVudCBzY2hlbWUKKyNkZWZpbmUgTVREX05BTkRFQ0NfUExBQ0VPTkxZCTMJLy8gVXNlIHRoZSBnaXZlbiBwbGFjZW1lbnQgaW4gdGhlIHN0cnVjdHVyZSAoRG8gbm90IHN0b3JlIGVjYyByZXN1bHQgb24gcmVhZCkKKyNkZWZpbmUgTVREX05BTkRFQ0NfQVVUT1BMX1VTUiAJNAkvLyBVc2UgdGhlIGdpdmVuIGF1dG9wbGFjZW1lbnQgc2NoZW1lIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBkZWZhdWx0CisKKy8qIE9UUCBtb2RlIHNlbGVjdGlvbiAqLworI2RlZmluZSBNVERfT1RQX09GRgkJMAorI2RlZmluZSBNVERfT1RQX0ZBQ1RPUlkJCTEKKyNkZWZpbmUgTVREX09UUF9VU0VSCQkyCisKK3N0cnVjdCBtdGRfaW5mb191c2VyIHsKKwlfX3U4IHR5cGU7CisJX191MzIgZmxhZ3M7CisJX191MzIgc2l6ZTsJLyogVG90YWwgc2l6ZSBvZiB0aGUgTVREICovCisJX191MzIgZXJhc2VzaXplOworCV9fdTMyIHdyaXRlc2l6ZTsKKwlfX3UzMiBvb2JzaXplOwkvKiBBbW91bnQgb2YgT09CIGRhdGEgcGVyIGJsb2NrIChlLmcuIDE2KSAqLworCV9fdTY0IHBhZGRpbmc7CS8qIE9sZCBvYnNvbGV0ZSBmaWVsZDsgZG8gbm90IHVzZSAqLworfTsKKworc3RydWN0IHJlZ2lvbl9pbmZvX3VzZXIgeworCV9fdTMyIG9mZnNldDsJCS8qIEF0IHdoaWNoIHRoaXMgcmVnaW9uIHN0YXJ0cywKKwkJCQkgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1URCAqLworCV9fdTMyIGVyYXNlc2l6ZTsJLyogRm9yIHRoaXMgcmVnaW9uICovCisJX191MzIgbnVtYmxvY2tzOwkvKiBOdW1iZXIgb2YgYmxvY2tzIGluIHRoaXMgcmVnaW9uICovCisJX191MzIgcmVnaW9uaW5kZXg7Cit9OworCitzdHJ1Y3Qgb3RwX2luZm8geworCV9fdTMyIHN0YXJ0OworCV9fdTMyIGxlbmd0aDsKKwlfX3UzMiBsb2NrZWQ7Cit9OworCisvKgorICogTm90ZSwgdGhlIGZvbGxvd2luZyBpb2N0bCBleGlzdGVkIGluIHRoZSBwYXN0IGFuZCB3YXMgcmVtb3ZlZDoKKyAqICNkZWZpbmUgTUVNU0VUT09CU0VMICAgICAgICAgICBfSU9XKCdNJywgOSwgc3RydWN0IG5hbmRfb29iaW5mbykKKyAqIFRyeSB0byBhdm9pZCBhZGRpbmcgYSBuZXcgaW9jdGwgd2l0aCB0aGUgc2FtZSBpb2N0bCBudW1iZXIuCisgKi8KKworLyogR2V0IGJhc2ljIE1URCBjaGFyYWN0ZXJpc3RpY3MgaW5mbyAoYmV0dGVyIHRvIHVzZSBzeXNmcykgKi8KKyNkZWZpbmUgTUVNR0VUSU5GTwkJX0lPUignTScsIDEsIHN0cnVjdCBtdGRfaW5mb191c2VyKQorLyogRXJhc2Ugc2VnbWVudCBvZiBNVEQgKi8KKyNkZWZpbmUgTUVNRVJBU0UJCV9JT1coJ00nLCAyLCBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyKQorLyogV3JpdGUgb3V0LW9mLWJhbmQgZGF0YSBmcm9tIE1URCAqLworI2RlZmluZSBNRU1XUklURU9PQgkJX0lPV1IoJ00nLCAzLCBzdHJ1Y3QgbXRkX29vYl9idWYpCisvKiBSZWFkIG91dC1vZi1iYW5kIGRhdGEgZnJvbSBNVEQgKi8KKyNkZWZpbmUgTUVNUkVBRE9PQgkJX0lPV1IoJ00nLCA0LCBzdHJ1Y3QgbXRkX29vYl9idWYpCisvKiBMb2NrIGEgY2hpcCAoZm9yIE1URCB0aGF0IHN1cHBvcnRzIGl0KSAqLworI2RlZmluZSBNRU1MT0NLCQkJX0lPVygnTScsIDUsIHN0cnVjdCBlcmFzZV9pbmZvX3VzZXIpCisvKiBVbmxvY2sgYSBjaGlwIChmb3IgTVREIHRoYXQgc3VwcG9ydHMgaXQpICovCisjZGVmaW5lIE1FTVVOTE9DSwkJX0lPVygnTScsIDYsIHN0cnVjdCBlcmFzZV9pbmZvX3VzZXIpCisvKiBHZXQgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZXJhc2UgcmVnaW9ucyAqLworI2RlZmluZSBNRU1HRVRSRUdJT05DT1VOVAlfSU9SKCdNJywgNywgaW50KQorLyogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcmFzZSByZWdpb24gZm9yIGEgc3BlY2lmaWMgaW5kZXggKi8KKyNkZWZpbmUgTUVNR0VUUkVHSU9OSU5GTwlfSU9XUignTScsIDgsIHN0cnVjdCByZWdpb25faW5mb191c2VyKQorLyogR2V0IGluZm8gYWJvdXQgT09CIG1vZGVzIChlLmcuLCBSQVcsIFBMQUNFLCBBVVRPKSAtIGxlZ2FjeSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgTUVNR0VUT09CU0VMCQlfSU9SKCdNJywgMTAsIHN0cnVjdCBuYW5kX29vYmluZm8pCisvKiBDaGVjayBpZiBhbiBlcmFzZWJsb2NrIGlzIGJhZCAqLworI2RlZmluZSBNRU1HRVRCQURCTE9DSwkJX0lPVygnTScsIDExLCBfX2tlcm5lbF9sb2ZmX3QpCisvKiBNYXJrIGFuIGVyYXNlYmxvY2sgYXMgYmFkICovCisjZGVmaW5lIE1FTVNFVEJBREJMT0NLCQlfSU9XKCdNJywgMTIsIF9fa2VybmVsX2xvZmZfdCkKKy8qIFNldCBPVFAgKE9uZS1UaW1lIFByb2dyYW1tYWJsZSkgbW9kZSAoZmFjdG9yeSB2cy4gdXNlcikgKi8KKyNkZWZpbmUgT1RQU0VMRUNUCQlfSU9SKCdNJywgMTMsIGludCkKKy8qIEdldCBudW1iZXIgb2YgT1RQIChPbmUtVGltZSBQcm9ncmFtbWFibGUpIHJlZ2lvbnMgKi8KKyNkZWZpbmUgT1RQR0VUUkVHSU9OQ09VTlQJX0lPVygnTScsIDE0LCBpbnQpCisvKiBHZXQgYWxsIE9UUCAoT25lLVRpbWUgUHJvZ3JhbW1hYmxlKSBpbmZvIGFib3V0IE1URCAqLworI2RlZmluZSBPVFBHRVRSRUdJT05JTkZPCV9JT1coJ00nLCAxNSwgc3RydWN0IG90cF9pbmZvKQorLyogTG9jayBhIGdpdmVuIHJhbmdlIG9mIHVzZXIgZGF0YSAobXVzdCBiZSBpbiBtb2RlICVNVERfRklMRV9NT0RFX09UUF9VU0VSKSAqLworI2RlZmluZSBPVFBMT0NLCQkJX0lPUignTScsIDE2LCBzdHJ1Y3Qgb3RwX2luZm8pCisvKiBHZXQgRUNDIGxheW91dCAoZGVwcmVjYXRlZCkgKi8KKyNkZWZpbmUgRUNDR0VUTEFZT1VUCQlfSU9SKCdNJywgMTcsIHN0cnVjdCBuYW5kX2VjY2xheW91dF91c2VyKQorLyogR2V0IHN0YXRpc3RpY3MgYWJvdXQgY29ycmVjdGVkL3VuY29ycmVjdGVkIGVycm9ycyAqLworI2RlZmluZSBFQ0NHRVRTVEFUUwkJX0lPUignTScsIDE4LCBzdHJ1Y3QgbXRkX2VjY19zdGF0cykKKy8qIFNldCBNVEQgbW9kZSBvbiBhIHBlci1maWxlLWRlc2NyaXB0b3IgYmFzaXMgKHNlZSAiTVREIGZpbGUgbW9kZXMiKSAqLworI2RlZmluZSBNVERGSUxFTU9ERQkJX0lPKCdNJywgMTkpCisvKiBFcmFzZSBzZWdtZW50IG9mIE1URCAoc3VwcG9ydHMgNjQtYml0IGFkZHJlc3MpICovCisjZGVmaW5lIE1FTUVSQVNFNjQJCV9JT1coJ00nLCAyMCwgc3RydWN0IGVyYXNlX2luZm9fdXNlcjY0KQorLyogV3JpdGUgZGF0YSB0byBPT0IgKDY0LWJpdCB2ZXJzaW9uKSAqLworI2RlZmluZSBNRU1XUklURU9PQjY0CQlfSU9XUignTScsIDIxLCBzdHJ1Y3QgbXRkX29vYl9idWY2NCkKKy8qIFJlYWQgZGF0YSBmcm9tIE9PQiAoNjQtYml0IHZlcnNpb24pICovCisjZGVmaW5lIE1FTVJFQURPT0I2NAkJX0lPV1IoJ00nLCAyMiwgc3RydWN0IG10ZF9vb2JfYnVmNjQpCisvKiBDaGVjayBpZiBjaGlwIGlzIGxvY2tlZCAoZm9yIE1URCB0aGF0IHN1cHBvcnRzIGl0KSAqLworI2RlZmluZSBNRU1JU0xPQ0tFRAkJX0lPUignTScsIDIzLCBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyKQorLyoKKyAqIE1vc3QgZ2VuZXJpYyB3cml0ZSBpbnRlcmZhY2U7IGNhbiB3cml0ZSBpbi1iYW5kIGFuZC9vciBvdXQtb2YtYmFuZCBpbiB2YXJpb3VzCisgKiBtb2RlcyAoc2VlICJzdHJ1Y3QgbXRkX3dyaXRlX3JlcSIpCisgKi8KKyNkZWZpbmUgTUVNV1JJVEUJCV9JT1dSKCdNJywgMjQsIHN0cnVjdCBtdGRfd3JpdGVfcmVxKQorCisvKgorICogT2Jzb2xldGUgbGVnYWN5IGludGVyZmFjZS4gS2VlcCBpdCBpbiBvcmRlciBub3QgdG8gYnJlYWsgdXNlcnNwYWNlCisgKiBpbnRlcmZhY2VzCisgKi8KK3N0cnVjdCBuYW5kX29vYmluZm8geworCV9fdTMyIHVzZWVjYzsKKwlfX3UzMiBlY2NieXRlczsKKwlfX3UzMiBvb2JmcmVlWzhdWzJdOworCV9fdTMyIGVjY3Bvc1szMl07Cit9OworCitzdHJ1Y3QgbmFuZF9vb2JmcmVlIHsKKwlfX3UzMiBvZmZzZXQ7CisJX191MzIgbGVuZ3RoOworfTsKKworI2RlZmluZSBNVERfTUFYX09PQkZSRUVfRU5UUklFUwk4CisjZGVmaW5lIE1URF9NQVhfRUNDUE9TX0VOVFJJRVMJNjQKKy8qCisgKiBPQlNPTEVURTogRUNDIGxheW91dCBjb250cm9sIHN0cnVjdHVyZS4gRXhwb3J0ZWQgdG8gdXNlci1zcGFjZSB2aWEgaW9jdGwKKyAqIEVDQ0dFVExBWU9VVCBmb3IgYmFja3dhcmRzIGNvbXBhdGJpbGl0eSBhbmQgc2hvdWxkIG5vdCBiZSBtaXN0YWtlbiBhcyBhCisgKiBjb21wbGV0ZSBzZXQgb2YgRUNDIGluZm9ybWF0aW9uLiBUaGUgaW9jdGwgdHJ1bmNhdGVzIHRoZSBsYXJnZXIgaW50ZXJuYWwKKyAqIHN0cnVjdHVyZSB0byByZXRhaW4gYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgc3RhdGljIGRlY2xhcmF0aW9uIG9mIHRoZQorICogaW9jdGwuIE5vdGUgdGhhdCB0aGUgIk1URF9NQVhfLi4uX0VOVFJJRVMiIG1hY3JvcyByZXByZXNlbnQgdGhlIG1heCBzaXplIG9mCisgKiB0aGUgdXNlciBzdHJ1Y3QsIG5vdCB0aGUgTUFYIHNpemUgb2YgdGhlIGludGVybmFsIHN0cnVjdCBuYW5kX2VjY2xheW91dC4KKyAqLworc3RydWN0IG5hbmRfZWNjbGF5b3V0X3VzZXIgeworCV9fdTMyIGVjY2J5dGVzOworCV9fdTMyIGVjY3Bvc1tNVERfTUFYX0VDQ1BPU19FTlRSSUVTXTsKKwlfX3UzMiBvb2JhdmFpbDsKKwlzdHJ1Y3QgbmFuZF9vb2JmcmVlIG9vYmZyZWVbTVREX01BWF9PT0JGUkVFX0VOVFJJRVNdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgbXRkX2VjY19zdGF0cyAtIGVycm9yIGNvcnJlY3Rpb24gc3RhdHMKKyAqCisgKiBAY29ycmVjdGVkOgludW1iZXIgb2YgY29ycmVjdGVkIGJpdHMKKyAqIEBmYWlsZWQ6CW51bWJlciBvZiB1bmNvcnJlY3RhYmxlIGVycm9ycworICogQGJhZGJsb2NrczoJbnVtYmVyIG9mIGJhZCBibG9ja3MgaW4gdGhpcyBwYXJ0aXRpb24KKyAqIEBiYnRibG9ja3M6CW51bWJlciBvZiBibG9ja3MgcmVzZXJ2ZWQgZm9yIGJhZCBibG9jayB0YWJsZXMKKyAqLworc3RydWN0IG10ZF9lY2Nfc3RhdHMgeworCV9fdTMyIGNvcnJlY3RlZDsKKwlfX3UzMiBmYWlsZWQ7CisJX191MzIgYmFkYmxvY2tzOworCV9fdTMyIGJidGJsb2NrczsKK307CisKKy8qCisgKiBNVEQgZmlsZSBtb2RlcyAtIGZvciByZWFkL3dyaXRlIGFjY2VzcyB0byBNVEQKKyAqCisgKiBATVREX0ZJTEVfTU9ERV9OT1JNQUw6CU9UUCBkaXNhYmxlZCwgRUNDIGVuYWJsZWQKKyAqIEBNVERfRklMRV9NT0RFX09UUF9GQUNUT1JZOglPVFAgZW5hYmxlZCBpbiBmYWN0b3J5IG1vZGUKKyAqIEBNVERfRklMRV9NT0RFX09UUF9VU0VSOglPVFAgZW5hYmxlZCBpbiB1c2VyIG1vZGUKKyAqIEBNVERfRklMRV9NT0RFX1JBVzoJCU9UUCBkaXNhYmxlZCwgRUNDIGRpc2FibGVkCisgKgorICogVGhlc2UgbW9kZXMgY2FuIGJlIHNldCB2aWEgaW9jdGwoTVRERklMRU1PREUpLiBUaGUgbW9kZSBtb2RlIHdpbGwgYmUgcmV0YWluZWQKKyAqIHNlcGFyYXRlbHkgZm9yIGVhY2ggb3BlbiBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogTm90ZTogJU1URF9GSUxFX01PREVfUkFXIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgJU1URF9PUFNfUkFXIC0KKyAqIHJhdyBhY2Nlc3MgdG8gdGhlIGZsYXNoLCB3aXRob3V0IGVycm9yIGNvcnJlY3Rpb24gb3IgYXV0b3BsYWNlbWVudCBzY2hlbWVzLgorICogV2hlcmV2ZXIgcG9zc2libGUsIHRoZSBNVERfT1BTXyogbW9kZSB3aWxsIG92ZXJyaWRlIHRoZSBNVERfRklMRV9NT0RFXyogbW9kZQorICogKGUuZy4sIHdoZW4gdXNpbmcgaW9jdGwoTUVNV1JJVEUpKSwgYnV0IGluIHNvbWUgY2FzZXMsIHRoZSBNVERfRklMRV9NT0RFIGlzCisgKiB1c2VkIG91dCBvZiBuZWNlc3NpdHkgKGUuZy4sIGB3cml0ZSgpJywgaW9jdGwoTUVNV1JJVEVPT0I2NCkpLgorICovCitlbnVtIG10ZF9maWxlX21vZGVzIHsKKwlNVERfRklMRV9NT0RFX05PUk1BTCA9IE1URF9PVFBfT0ZGLAorCU1URF9GSUxFX01PREVfT1RQX0ZBQ1RPUlkgPSBNVERfT1RQX0ZBQ1RPUlksCisJTVREX0ZJTEVfTU9ERV9PVFBfVVNFUiA9IE1URF9PVFBfVVNFUiwKKwlNVERfRklMRV9NT0RFX1JBVywKK307CisKKyNlbmRpZiAvKiBfX01URF9BQklfSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL210ZC9tdGQtdXNlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tdGQvbXRkLXVzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzMyN2M4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tdGQvbXRkLXVzZXIuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IMKpIDE5OTktMjAxMCBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX01URF9VU0VSX0hfXworI2RlZmluZSBfX01URF9VU0VSX0hfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIFRoaXMgZmlsZSBpcyBibGVzc2VkIGZvciBpbmNsdXNpb24gYnkgdXNlcnNwYWNlICovCisjaW5jbHVkZSA8bXRkL210ZC1hYmkuaD4KKwordHlwZWRlZiBzdHJ1Y3QgbXRkX2luZm9fdXNlciBtdGRfaW5mb190OwordHlwZWRlZiBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyIGVyYXNlX2luZm9fdDsKK3R5cGVkZWYgc3RydWN0IHJlZ2lvbl9pbmZvX3VzZXIgcmVnaW9uX2luZm9fdDsKK3R5cGVkZWYgc3RydWN0IG5hbmRfb29iaW5mbyBuYW5kX29vYmluZm9fdDsKK3R5cGVkZWYgc3RydWN0IG5hbmRfZWNjbGF5b3V0X3VzZXIgbmFuZF9lY2NsYXlvdXRfdDsKKworI2VuZGlmIC8qIF9fTVREX1VTRVJfSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL210ZC9uZnRsLXVzZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbXRkL25mdGwtdXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZWFiZDgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL210ZC9uZnRsLXVzZXIuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IMKpIDE5OTktMjAxMCBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX01URF9ORlRMX1VTRVJfSF9fCisjZGVmaW5lIF9fTVREX05GVExfVVNFUl9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEJsb2NrIENvbnRyb2wgSW5mb3JtYXRpb24gKi8KKworc3RydWN0IG5mdGxfYmNpIHsKKwl1bnNpZ25lZCBjaGFyIEVDQ1NpZ1s2XTsKKwlfX3U4IFN0YXR1czsKKwlfX3U4IFN0YXR1czE7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFVuaXQgQ29udHJvbCBJbmZvcm1hdGlvbiAqLworCitzdHJ1Y3QgbmZ0bF91Y2kwIHsKKwlfX3UxNiBWaXJ0VW5pdE51bTsKKwlfX3UxNiBSZXBsVW5pdE51bTsKKwlfX3UxNiBTcGFyZVZpcnRVbml0TnVtOworCV9fdTE2IFNwYXJlUmVwbFVuaXROdW07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbmZ0bF91Y2kxIHsKKwlfX3UzMiBXZWFySW5mbzsKKwlfX3UxNiBFcmFzZU1hcms7CisJX191MTYgRXJhc2VNYXJrMTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBuZnRsX3VjaTIgeworICAgICAgICBfX3UxNiBGb2xkTWFyazsKKyAgICAgICAgX191MTYgRm9sZE1hcmsxOworCV9fdTMyIHVudXNlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3VuaW9uIG5mdGxfdWNpIHsKKwlzdHJ1Y3QgbmZ0bF91Y2kwIGE7CisJc3RydWN0IG5mdGxfdWNpMSBiOworCXN0cnVjdCBuZnRsX3VjaTIgYzsKK307CisKK3N0cnVjdCBuZnRsX29vYiB7CisJc3RydWN0IG5mdGxfYmNpIGI7CisJdW5pb24gbmZ0bF91Y2kgdTsKK307CisKKy8qIE5GVEwgTWVkaWEgSGVhZGVyICovCisKK3N0cnVjdCBORlRMTWVkaWFIZWFkZXIgeworCWNoYXIgRGF0YU9yZ0lEWzZdOworCV9fdTE2IE51bUVyYXNlVW5pdHM7CisJX191MTYgRmlyc3RQaHlzaWNhbEVVTjsKKwlfX3UzMiBGb3JtYXR0ZWRTaXplOworCXVuc2lnbmVkIGNoYXIgVW5pdFNpemVGYWN0b3I7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIE1BWF9FUkFTRV9aT05FUyAoODE5MiAtIDUxMikKKworI2RlZmluZSBFUkFTRV9NQVJLIDB4M2M2OQorI2RlZmluZSBTRUNUT1JfRlJFRSAweGZmCisjZGVmaW5lIFNFQ1RPUl9VU0VEIDB4NTUKKyNkZWZpbmUgU0VDVE9SX0lHTk9SRSAweDExCisjZGVmaW5lIFNFQ1RPUl9ERUxFVEVEIDB4MDAKKworI2RlZmluZSBGT0xEX01BUktfSU5fUFJPR1JFU1MgMHg1NTU1CisKKyNkZWZpbmUgWk9ORV9HT09EIDB4ZmYKKyNkZWZpbmUgWk9ORV9CQURfT1JJR0lOQUwgMAorI2RlZmluZSBaT05FX0JBRF9NQVJLRUQgNworCisKKyNlbmRpZiAvKiBfX01URF9ORlRMX1VTRVJfSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL210ZC91YmktdXNlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tdGQvdWJpLXVzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2UxOTkzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9tdGQvdWJpLXVzZXIuaApAQCAtMCwwICsxLDQxNCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDA2CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEF1dGhvcjogQXJ0ZW0gQml0eXV0c2tpeSAo0JHQuNGC0Y7RhtC60LjQuSDQkNGA0YLRkdC8KQorICovCisKKyNpZm5kZWYgX19VQklfVVNFUl9IX18KKyNkZWZpbmUgX19VQklfVVNFUl9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBVQkkgZGV2aWNlIGNyZWF0aW9uICh0aGUgc2FtZSBhcyBNVEQgZGV2aWNlIGF0dGFjaG1lbnQpCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqIE1URCBkZXZpY2VzIG1heSBiZSBhdHRhY2hlZCB1c2luZyAlVUJJX0lPQ0FUVCBpb2N0bCBjb21tYW5kIG9mIHRoZSBVQkkKKyAqIGNvbnRyb2wgZGV2aWNlLiBUaGUgY2FsbGVyIGhhcyB0byBwcm9wZXJseSBmaWxsIGFuZCBwYXNzCisgKiAmc3RydWN0IHViaV9hdHRhY2hfcmVxIG9iamVjdCAtIFVCSSB3aWxsIGF0dGFjaCB0aGUgTVREIGRldmljZSBzcGVjaWZpZWQgaW4KKyAqIHRoZSByZXF1ZXN0IGFuZCByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgVUJJIGRldmljZSBudW1iZXIgYXMgdGhlIGlvY3RsCisgKiByZXR1cm4gdmFsdWUuCisgKgorICogVUJJIGRldmljZSBkZWxldGlvbiAodGhlIHNhbWUgYXMgTVREIGRldmljZSBkZXRhY2htZW50KQorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBBbiBVQkkgZGV2aWNlIG1heWJlIGRlbGV0ZWQgd2l0aCAlVUJJX0lPQ0RFVCBpb2N0bCBjb21tYW5kIG9mIHRoZSBVQkkKKyAqIGNvbnRyb2wgZGV2aWNlLgorICoKKyAqIFVCSSB2b2x1bWUgY3JlYXRpb24KKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBVQkkgdm9sdW1lcyBhcmUgY3JlYXRlZCB2aWEgdGhlICVVQklfSU9DTUtWT0wgaW9jdGwgY29tbWFuZCBvZiBVQkkgY2hhcmFjdGVyCisgKiBkZXZpY2UuIEEgJnN0cnVjdCB1YmlfbWt2b2xfcmVxIG9iamVjdCBoYXMgdG8gYmUgcHJvcGVybHkgZmlsbGVkIGFuZCBhCisgKiBwb2ludGVyIHRvIGl0IGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIGlvY3RsLgorICoKKyAqIFVCSSB2b2x1bWUgZGVsZXRpb24KKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBUbyBkZWxldGUgYSB2b2x1bWUsIHRoZSAlVUJJX0lPQ1JNVk9MIGlvY3RsIGNvbW1hbmQgb2YgdGhlIFVCSSBjaGFyYWN0ZXIKKyAqIGRldmljZSBzaG91bGQgYmUgdXNlZC4gQSBwb2ludGVyIHRvIHRoZSAzMi1iaXQgdm9sdW1lIElEIGhhc3QgdG8gYmUgcGFzc2VkCisgKiB0byB0aGUgaW9jdGwuCisgKgorICogVUJJIHZvbHVtZSByZS1zaXplCisgKiB+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBUbyByZS1zaXplIGEgdm9sdW1lLCB0aGUgJVVCSV9JT0NSU1ZPTCBpb2N0bCBjb21tYW5kIG9mIHRoZSBVQkkgY2hhcmFjdGVyCisgKiBkZXZpY2Ugc2hvdWxkIGJlIHVzZWQuIEEgJnN0cnVjdCB1YmlfcnN2b2xfcmVxIG9iamVjdCBoYXMgdG8gYmUgcHJvcGVybHkKKyAqIGZpbGxlZCBhbmQgYSBwb2ludGVyIHRvIGl0IGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIGlvY3RsLgorICoKKyAqIFVCSSB2b2x1bWVzIHJlLW5hbWUKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBUbyByZS1uYW1lIHNldmVyYWwgdm9sdW1lcyBhdG9taWNhbGx5IGF0IG9uZSBnbywgdGhlICVVQklfSU9DUk5WT0wgY29tbWFuZAorICogb2YgdGhlIFVCSSBjaGFyYWN0ZXIgZGV2aWNlIHNob3VsZCBiZSB1c2VkLiBBICZzdHJ1Y3QgdWJpX3Judm9sX3JlcSBvYmplY3QKKyAqIGhhcyB0byBiZSBwcm9wZXJseSBmaWxsZWQgYW5kIGEgcG9pbnRlciB0byBpdCBoYXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBpb2N0bC4KKyAqCisgKiBVQkkgdm9sdW1lIHVwZGF0ZQorICogfn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBWb2x1bWUgdXBkYXRlIHNob3VsZCBiZSBkb25lIHZpYSB0aGUgJVVCSV9JT0NWT0xVUCBpb2N0bCBjb21tYW5kIG9mIHRoZQorICogY29ycmVzcG9uZGluZyBVQkkgdm9sdW1lIGNoYXJhY3RlciBkZXZpY2UuIEEgcG9pbnRlciB0byBhIDY0LWJpdCB1cGRhdGUKKyAqIHNpemUgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgaW9jdGwuIEFmdGVyIHRoaXMsIFVCSSBleHBlY3RzIHVzZXIgdG8gd3JpdGUKKyAqIHRoaXMgbnVtYmVyIG9mIGJ5dGVzIHRvIHRoZSB2b2x1bWUgY2hhcmFjdGVyIGRldmljZS4gVGhlIHVwZGF0ZSBpcyBmaW5pc2hlZAorICogd2hlbiB0aGUgY2xhaW1lZCBudW1iZXIgb2YgYnl0ZXMgaXMgcGFzc2VkLiBTbywgdGhlIHZvbHVtZSB1cGRhdGUgc2VxdWVuY2UKKyAqIGlzIHNvbWV0aGluZyBsaWtlOgorICoKKyAqIGZkID0gb3BlbigiL2Rldi9teV92b2x1bWUiKTsKKyAqIGlvY3RsKGZkLCBVQklfSU9DVk9MVVAsICZpbWFnZV9zaXplKTsKKyAqIHdyaXRlKGZkLCBidWYsIGltYWdlX3NpemUpOworICogY2xvc2UoZmQpOworICoKKyAqIExvZ2ljYWwgZXJhc2VibG9jayBlcmFzZQorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVG8gZXJhc2UgYSBsb2dpY2FsIGVyYXNlYmxvY2ssIHRoZSAlVUJJX0lPQ0VCRVIgaW9jdGwgY29tbWFuZCBvZiB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgVUJJIHZvbHVtZSBjaGFyYWN0ZXIgZGV2aWNlIHNob3VsZCBiZSB1c2VkLiBUaGlzIGNvbW1hbmQKKyAqIHVubWFwcyB0aGUgcmVxdWVzdGVkIGxvZ2ljYWwgZXJhc2VibG9jaywgbWFrZXMgc3VyZSB0aGUgY29ycmVzcG9uZGluZworICogcGh5c2ljYWwgZXJhc2VibG9jayBpcyBzdWNjZXNzZnVsbHkgZXJhc2VkLCBhbmQgcmV0dXJucy4KKyAqCisgKiBBdG9taWMgbG9naWNhbCBlcmFzZWJsb2NrIGNoYW5nZQorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBBdG9taWMgbG9naWNhbCBlcmFzZWJsb2NrIGNoYW5nZSBvcGVyYXRpb24gaXMgY2FsbGVkIHVzaW5nIHRoZSAlVUJJX0lPQ0VCQ0gKKyAqIGlvY3RsIGNvbW1hbmQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgVUJJIHZvbHVtZSBjaGFyYWN0ZXIgZGV2aWNlLiBBIHBvaW50ZXIgdG8KKyAqIGEgJnN0cnVjdCB1YmlfbGViX2NoYW5nZV9yZXEgb2JqZWN0IGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIGlvY3RsLiBUaGVuIHRoZQorICogdXNlciBpcyBleHBlY3RlZCB0byB3cml0ZSB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBieXRlcyAoc2ltaWxhcmx5IHRvIHdoYXQKKyAqIHNob3VsZCBiZSBkb25lIGluIGNhc2Ugb2YgdGhlICJ2b2x1bWUgdXBkYXRlIiBpb2N0bCkuCisgKgorICogTG9naWNhbCBlcmFzZWJsb2NrIG1hcAorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVG8gbWFwIGEgbG9naWNhbCBlcmFzZWJsb2NrIHRvIGEgcGh5c2ljYWwgZXJhc2VibG9jaywgdGhlICVVQklfSU9DRUJNQVAKKyAqIGlvY3RsIGNvbW1hbmQgc2hvdWxkIGJlIHVzZWQuIEEgcG9pbnRlciB0byBhICZzdHJ1Y3QgdWJpX21hcF9yZXEgb2JqZWN0IGlzCisgKiBleHBlY3RlZCB0byBiZSBwYXNzZWQuIFRoZSBpb2N0bCBtYXBzIHRoZSByZXF1ZXN0ZWQgbG9naWNhbCBlcmFzZWJsb2NrIHRvCisgKiBhIHBoeXNpY2FsIGVyYXNlYmxvY2sgYW5kIHJldHVybnMuICBPbmx5IG5vbi1tYXBwZWQgbG9naWNhbCBlcmFzZWJsb2NrcyBjYW4KKyAqIGJlIG1hcHBlZC4gSWYgdGhlIGxvZ2ljYWwgZXJhc2VibG9jayBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgaXMgYWxyZWFkeQorICogbWFwcGVkIHRvIGEgcGh5c2ljYWwgZXJhc2VibG9jaywgdGhlIGlvY3RsIGZhaWxzIGFuZCByZXR1cm5zIGVycm9yLgorICoKKyAqIExvZ2ljYWwgZXJhc2VibG9jayB1bm1hcAorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVG8gdW5tYXAgYSBsb2dpY2FsIGVyYXNlYmxvY2sgdG8gYSBwaHlzaWNhbCBlcmFzZWJsb2NrLCB0aGUgJVVCSV9JT0NFQlVOTUFQCisgKiBpb2N0bCBjb21tYW5kIHNob3VsZCBiZSB1c2VkLiBUaGUgaW9jdGwgdW5tYXBzIHRoZSBsb2dpY2FsIGVyYXNlYmxvY2tzLAorICogc2NoZWR1bGVzIGNvcnJlc3BvbmRpbmcgcGh5c2ljYWwgZXJhc2VibG9jayBmb3IgZXJhc3VyZSwgYW5kIHJldHVybnMuIFVubGlrZQorICogdGhlICJMRUIgZXJhc2UiIGNvbW1hbmQsIGl0IGRvZXMgbm90IHdhaXQgZm9yIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGJlaW5nCisgKiBlcmFzZWQuIE5vdGUsIHRoZSBzaWRlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgaWYgYW4gdW5jbGVhbiByZWJvb3QgaGFwcGVucworICogYWZ0ZXIgdGhlIHVubWFwIGlvY3RsIHJldHVybnMsIHlvdSBtYXkgZmluZCB0aGUgTEVCIG1hcHBlZCBhZ2FpbiB0byB0aGUgc2FtZQorICogcGh5c2ljYWwgZXJhc2VibG9jayBhZnRlciB0aGUgVUJJIGlzIHJ1biBhZ2Fpbi4KKyAqCisgKiBDaGVjayBpZiBsb2dpY2FsIGVyYXNlYmxvY2sgaXMgbWFwcGVkCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqIFRvIGNoZWNrIGlmIGEgbG9naWNhbCBlcmFzZWJsb2NrIGlzIG1hcHBlZCB0byBhIHBoeXNpY2FsIGVyYXNlYmxvY2ssIHRoZQorICogJVVCSV9JT0NFQklTTUFQIGlvY3RsIGNvbW1hbmQgc2hvdWxkIGJlIHVzZWQuIEl0IHJldHVybnMgJTAgaWYgdGhlIExFQiBpcworICogbm90IG1hcHBlZCwgYW5kICUxIGlmIGl0IGlzIG1hcHBlZC4KKyAqCisgKiBTZXQgYW4gVUJJIHZvbHVtZSBwcm9wZXJ0eQorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqIFRvIHNldCBhbiBVQkkgdm9sdW1lIHByb3BlcnR5IHRoZSAlVUJJX0lPQ1NFVFBST1AgaW9jdGwgY29tbWFuZCBzaG91bGQgYmUKKyAqIHVzZWQuIEEgcG9pbnRlciB0byBhICZzdHJ1Y3QgdWJpX3NldF92b2xfcHJvcF9yZXEgb2JqZWN0IGlzIGV4cGVjdGVkIHRvIGJlCisgKiBwYXNzZWQuIFRoZSBvYmplY3QgZGVzY3JpYmVzIHdoaWNoIHByb3BlcnR5IHNob3VsZCBiZSBzZXQsIGFuZCB0byB3aGljaCB2YWx1ZQorICogaXQgc2hvdWxkIGJlIHNldC4KKyAqLworCisvKgorICogV2hlbiBhIG5ldyBVQkkgdm9sdW1lIG9yIFVCSSBkZXZpY2UgaXMgY3JlYXRlZCwgdXNlcnMgbWF5IGVpdGhlciBzcGVjaWZ5IHRoZQorICogdm9sdW1lL2RldmljZSBudW1iZXIgdGhleSB3YW50IHRvIGNyZWF0ZSBvciB0byBsZXQgVUJJIGF1dG9tYXRpY2FsbHkgYXNzaWduCisgKiB0aGUgbnVtYmVyIHVzaW5nIHRoZXNlIGNvbnN0YW50cy4KKyAqLworI2RlZmluZSBVQklfVk9MX05VTV9BVVRPICgtMSkKKyNkZWZpbmUgVUJJX0RFVl9OVU1fQVVUTyAoLTEpCisKKy8qIE1heGltdW0gdm9sdW1lIG5hbWUgbGVuZ3RoICovCisjZGVmaW5lIFVCSV9NQVhfVk9MVU1FX05BTUUgMTI3CisKKy8qIGlvY3RsIGNvbW1hbmRzIG9mIFVCSSBjaGFyYWN0ZXIgZGV2aWNlcyAqLworCisjZGVmaW5lIFVCSV9JT0NfTUFHSUMgJ28nCisKKy8qIENyZWF0ZSBhbiBVQkkgdm9sdW1lICovCisjZGVmaW5lIFVCSV9JT0NNS1ZPTCBfSU9XKFVCSV9JT0NfTUFHSUMsIDAsIHN0cnVjdCB1YmlfbWt2b2xfcmVxKQorLyogUmVtb3ZlIGFuIFVCSSB2b2x1bWUgKi8KKyNkZWZpbmUgVUJJX0lPQ1JNVk9MIF9JT1coVUJJX0lPQ19NQUdJQywgMSwgX19zMzIpCisvKiBSZS1zaXplIGFuIFVCSSB2b2x1bWUgKi8KKyNkZWZpbmUgVUJJX0lPQ1JTVk9MIF9JT1coVUJJX0lPQ19NQUdJQywgMiwgc3RydWN0IHViaV9yc3ZvbF9yZXEpCisvKiBSZS1uYW1lIHZvbHVtZXMgKi8KKyNkZWZpbmUgVUJJX0lPQ1JOVk9MIF9JT1coVUJJX0lPQ19NQUdJQywgMywgc3RydWN0IHViaV9ybnZvbF9yZXEpCisKKy8qIGlvY3RsIGNvbW1hbmRzIG9mIHRoZSBVQkkgY29udHJvbCBjaGFyYWN0ZXIgZGV2aWNlICovCisKKyNkZWZpbmUgVUJJX0NUUkxfSU9DX01BR0lDICdvJworCisvKiBBdHRhY2ggYW4gTVREIGRldmljZSAqLworI2RlZmluZSBVQklfSU9DQVRUIF9JT1coVUJJX0NUUkxfSU9DX01BR0lDLCA2NCwgc3RydWN0IHViaV9hdHRhY2hfcmVxKQorLyogRGV0YWNoIGFuIE1URCBkZXZpY2UgKi8KKyNkZWZpbmUgVUJJX0lPQ0RFVCBfSU9XKFVCSV9DVFJMX0lPQ19NQUdJQywgNjUsIF9fczMyKQorCisvKiBpb2N0bCBjb21tYW5kcyBvZiBVQkkgdm9sdW1lIGNoYXJhY3RlciBkZXZpY2VzICovCisKKyNkZWZpbmUgVUJJX1ZPTF9JT0NfTUFHSUMgJ08nCisKKy8qIFN0YXJ0IFVCSSB2b2x1bWUgdXBkYXRlICovCisjZGVmaW5lIFVCSV9JT0NWT0xVUCBfSU9XKFVCSV9WT0xfSU9DX01BR0lDLCAwLCBfX3M2NCkKKy8qIExFQiBlcmFzdXJlIGNvbW1hbmQsIHVzZWQgZm9yIGRlYnVnZ2luZywgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLworI2RlZmluZSBVQklfSU9DRUJFUiBfSU9XKFVCSV9WT0xfSU9DX01BR0lDLCAxLCBfX3MzMikKKy8qIEF0b21pYyBMRUIgY2hhbmdlIGNvbW1hbmQgKi8KKyNkZWZpbmUgVUJJX0lPQ0VCQ0ggX0lPVyhVQklfVk9MX0lPQ19NQUdJQywgMiwgX19zMzIpCisvKiBNYXAgTEVCIGNvbW1hbmQgKi8KKyNkZWZpbmUgVUJJX0lPQ0VCTUFQIF9JT1coVUJJX1ZPTF9JT0NfTUFHSUMsIDMsIHN0cnVjdCB1YmlfbWFwX3JlcSkKKy8qIFVubWFwIExFQiBjb21tYW5kICovCisjZGVmaW5lIFVCSV9JT0NFQlVOTUFQIF9JT1coVUJJX1ZPTF9JT0NfTUFHSUMsIDQsIF9fczMyKQorLyogQ2hlY2sgaWYgTEVCIGlzIG1hcHBlZCBjb21tYW5kICovCisjZGVmaW5lIFVCSV9JT0NFQklTTUFQIF9JT1IoVUJJX1ZPTF9JT0NfTUFHSUMsIDUsIF9fczMyKQorLyogU2V0IGFuIFVCSSB2b2x1bWUgcHJvcGVydHkgKi8KKyNkZWZpbmUgVUJJX0lPQ1NFVFZPTFBST1AgX0lPVyhVQklfVk9MX0lPQ19NQUdJQywgNiwgXAorCQkJICAgICAgIHN0cnVjdCB1Ymlfc2V0X3ZvbF9wcm9wX3JlcSkKKworLyogTWF4aW11bSBNVEQgZGV2aWNlIG5hbWUgbGVuZ3RoIHN1cHBvcnRlZCBieSBVQkkgKi8KKyNkZWZpbmUgTUFYX1VCSV9NVERfTkFNRV9MRU4gMTI3CisKKy8qIE1heGltdW0gYW1vdW50IG9mIFVCSSB2b2x1bWVzIHRoYXQgY2FuIGJlIHJlLW5hbWVkIGF0IG9uZSBnbyAqLworI2RlZmluZSBVQklfTUFYX1JOVk9MIDMyCisKKy8qCisgKiBVQkkgZGF0YSB0eXBlIGhpbnQgY29uc3RhbnRzLgorICoKKyAqIFVCSV9MT05HVEVSTTogbG9uZy10ZXJtIGRhdGEKKyAqIFVCSV9TSE9SVFRFUk06IHNob3J0LXRlcm0gZGF0YQorICogVUJJX1VOS05PV046IGRhdGEgcGVyc2lzdGVuY2UgaXMgdW5rbm93bgorICoKKyAqIFRoZXNlIGNvbnN0YW50cyBhcmUgdXNlZCB3aGVuIGRhdGEgaXMgd3JpdHRlbiB0byBVQkkgdm9sdW1lcyBpbiBvcmRlciB0bworICogaGVscCB0aGUgVUJJIHdlYXItbGV2ZWxpbmcgdW5pdCB0byBmaW5kIG1vcmUgYXBwcm9wcmlhdGUgcGh5c2ljYWwKKyAqIGVyYXNlYmxvY2tzLgorICovCitlbnVtIHsKKwlVQklfTE9OR1RFUk0gID0gMSwKKwlVQklfU0hPUlRURVJNID0gMiwKKwlVQklfVU5LTk9XTiAgID0gMywKK307CisKKy8qCisgKiBVQkkgdm9sdW1lIHR5cGUgY29uc3RhbnRzLgorICoKKyAqIEBVQklfRFlOQU1JQ19WT0xVTUU6IGR5bmFtaWMgdm9sdW1lCisgKiBAVUJJX1NUQVRJQ19WT0xVTUU6ICBzdGF0aWMgdm9sdW1lCisgKi8KK2VudW0geworCVVCSV9EWU5BTUlDX1ZPTFVNRSA9IDMsCisJVUJJX1NUQVRJQ19WT0xVTUUgID0gNCwKK307CisKKy8qCisgKiBVQkkgc2V0IHZvbHVtZSBwcm9wZXJ0eSBpb2N0bCBjb25zdGFudHMuCisgKgorICogQFVCSV9WT0xfUFJPUF9ESVJFQ1RfV1JJVEU6IGFsbG93IChhbnkgbm9uLXplcm8gdmFsdWUpIG9yIGRpc2FsbG93ICh2YWx1ZSAwKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgdG8gZGlyZWN0bHkgd3JpdGUgYW5kIGVyYXNlIGluZGl2aWR1YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZWJsb2NrcyBvbiBkeW5hbWljIHZvbHVtZXMKKyAqLworZW51bSB7CisJVUJJX1ZPTF9QUk9QX0RJUkVDVF9XUklURSA9IDEsCit9OworCisvKioKKyAqIHN0cnVjdCB1YmlfYXR0YWNoX3JlcSAtIGF0dGFjaCBNVEQgZGV2aWNlIHJlcXVlc3QuCisgKiBAdWJpX251bTogVUJJIGRldmljZSBudW1iZXIgdG8gY3JlYXRlCisgKiBAbXRkX251bTogTVREIGRldmljZSBudW1iZXIgdG8gYXR0YWNoCisgKiBAdmlkX2hkcl9vZmZzZXQ6IFZJRCBoZWFkZXIgb2Zmc2V0ICh1c2UgZGVmYXVsdHMgaWYgJTApCisgKiBAcGFkZGluZzogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSwgbm90IHVzZWQsIGhhcyB0byBiZSB6ZXJvZWQKKyAqCisgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3BlY2lmeSBNVEQgZGV2aWNlIFVCSSBoYXMgdG8gYXR0YWNoIGFuZCB0aGUKKyAqIHBhcmFtZXRlcnMgaXQgaGFzIHRvIHVzZS4gVGhlIG51bWJlciB3aGljaCBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlIG5ldyBVQkkKKyAqIGRldmljZSBpcyBwYXNzZWQgaW4gQHViaV9udW0uIFVCSSBtYXkgYXV0b21hdGljYWxseSBhc3NpZ24gdGhlIG51bWJlciBpZgorICogQFVCSV9ERVZfTlVNX0FVVE8gaXMgcGFzc2VkLiBJbiB0aGlzIGNhc2UsIHRoZSBkZXZpY2UgbnVtYmVyIGlzIHJldHVybmVkIGluCisgKiBAdWJpX251bS4KKyAqCisgKiBNb3N0IGFwcGxpY2F0aW9ucyBzaG91bGQgcGFzcyAlMCBpbiBAdmlkX2hkcl9vZmZzZXQgdG8gbWFrZSBVQkkgdXNlIGRlZmF1bHQKKyAqIG9mZnNldCBvZiB0aGUgVklEIGhlYWRlciB3aXRoaW4gcGh5c2ljYWwgZXJhc2VibG9ja3MuIFRoZSBkZWZhdWx0IG9mZnNldCBpcworICogdGhlIG5leHQgbWluLiBJL08gdW5pdCBhZnRlciB0aGUgRUMgaGVhZGVyLiBGb3IgZXhhbXBsZSwgaXQgd2lsbCBiZSBvZmZzZXQKKyAqIDUxMiBpbiBjYXNlIG9mIGEgNTEyIGJ5dGVzIHBhZ2UgTkFORCBmbGFzaCB3aXRoIG5vIHN1Yi1wYWdlIHN1cHBvcnQuIE9yCisgKiBpdCB3aWxsIGJlIDUxMiBpbiBjYXNlIG9mIGEgMktpQiBwYWdlIE5BTkQgZmxhc2ggd2l0aCA0IDUxMi1ieXRlIHN1Yi1wYWdlcy4KKyAqCisgKiBCdXQgaW4gcmFyZSBjYXNlcywgaWYgdGhpcyBvcHRpbWl6ZXMgdGhpbmdzLCB0aGUgVklEIGhlYWRlciBtYXkgYmUgcGxhY2VkIHRvCisgKiBhIGRpZmZlcmVudCBvZmZzZXQuIEZvciBleGFtcGxlLCB0aGUgYm9vdC1sb2FkZXIgbWlnaHQgZG8gdGhpbmdzIGZhc3RlciBpZgorICogdGhlIFZJRCBoZWFkZXIgc2l0cyBhdCB0aGUgZW5kIG9mIHRoZSBmaXJzdCAyS2lCIE5BTkQgcGFnZSB3aXRoIDQgc3ViLXBhZ2VzLgorICogQXMgdGhlIGJvb3QtbG9hZGVyIHdvdWxkIG5vdCBub3JtYWxseSBuZWVkIHRvIHJlYWQgRUMgaGVhZGVycyAodW5sZXNzIGl0CisgKiBuZWVkcyBVQkkgaW4gUlcgbW9kZSksIGl0IG1pZ2h0IGJlIGZhc3RlciB0byBjYWxjdWxhdGUgRUNDLiBUaGlzIGlzIHdlaXJkCisgKiBleGFtcGxlLCBidXQgaXQgcmVhbC1saWZlIGV4YW1wbGUuIFNvLCBpbiB0aGlzIGV4YW1wbGUsIEB2aWRfaGRyX29mZmVyIHdvdWxkCisgKiBiZSAyS2lCLTY0IGJ5dGVzID0gMTk4NC4gTm90ZSwgdGhhdCB0aGlzIHBvc2l0aW9uIGlzIG5vdCBldmVuIDUxMi1ieXRlcworICogYWxpZ25lZCwgd2hpY2ggaXMgT0ssIGFzIFVCSSBpcyBjbGV2ZXIgZW5vdWdoIHRvIHJlYWxpemUgdGhpcyBpcyA0dGgKKyAqIHN1Yi1wYWdlIG9mIHRoZSBmaXJzdCBwYWdlIGFuZCBhZGQgbmVlZGVkIHBhZGRpbmcuCisgKi8KK3N0cnVjdCB1YmlfYXR0YWNoX3JlcSB7CisJX19zMzIgdWJpX251bTsKKwlfX3MzMiBtdGRfbnVtOworCV9fczMyIHZpZF9oZHJfb2Zmc2V0OworCV9fczggcGFkZGluZ1sxMl07Cit9OworCisvKioKKyAqIHN0cnVjdCB1YmlfbWt2b2xfcmVxIC0gdm9sdW1lIGRlc2NyaXB0aW9uIGRhdGEgc3RydWN0dXJlIHVzZWQgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lIGNyZWF0aW9uIHJlcXVlc3RzLgorICogQHZvbF9pZDogdm9sdW1lIG51bWJlcgorICogQGFsaWdubWVudDogdm9sdW1lIGFsaWdubWVudAorICogQGJ5dGVzOiB2b2x1bWUgc2l6ZSBpbiBieXRlcworICogQHZvbF90eXBlOiB2b2x1bWUgdHlwZSAoJVVCSV9EWU5BTUlDX1ZPTFVNRSBvciAlVUJJX1NUQVRJQ19WT0xVTUUpCisgKiBAcGFkZGluZzE6IHJlc2VydmVkIGZvciBmdXR1cmUsIG5vdCB1c2VkLCBoYXMgdG8gYmUgemVyb2VkCisgKiBAbmFtZV9sZW46IHZvbHVtZSBuYW1lIGxlbmd0aAorICogQHBhZGRpbmcyOiByZXNlcnZlZCBmb3IgZnV0dXJlLCBub3QgdXNlZCwgaGFzIHRvIGJlIHplcm9lZAorICogQG5hbWU6IHZvbHVtZSBuYW1lCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB1c2VyLXNwYWNlIHByb2dyYW1zIHdoZW4gY3JlYXRpbmcgbmV3IHZvbHVtZXMuIFRoZQorICogQHVzZWRfYnl0ZXMgZmllbGQgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiBjcmVhdGluZyBzdGF0aWMgdm9sdW1lcy4KKyAqCisgKiBUaGUgQGFsaWdubWVudCBmaWVsZCBzcGVjaWZpZXMgdGhlIHJlcXVpcmVkIGFsaWdubWVudCBvZiB0aGUgdm9sdW1lIGxvZ2ljYWwKKyAqIGVyYXNlYmxvY2suIFRoaXMgbWVhbnMsIHRoYXQgdGhlIHNpemUgb2YgbG9naWNhbCBlcmFzZWJsb2NrcyB3aWxsIGJlIGFsaWduZWQKKyAqIHRvIHRoaXMgbnVtYmVyLCBpLmUuLAorICoJKFVCSSBkZXZpY2UgbG9naWNhbCBlcmFzZWJsb2NrIHNpemUpIG1vZCAoQGFsaWdubWVudCkgPSAwLgorICoKKyAqIFRvIHB1dCBpdCBkaWZmZXJlbnRseSwgdGhlIGxvZ2ljYWwgZXJhc2VibG9jayBvZiB0aGlzIHZvbHVtZSBtYXkgYmUgc2xpZ2h0bHkKKyAqIHNob3J0ZW5lZCBpbiBvcmRlciB0byBtYWtlIGl0IHByb3Blcmx5IGFsaWduZWQuIFRoZSBhbGlnbm1lbnQgaGFzIHRvIGJlCisgKiBtdWx0aXBsZSBvZiB0aGUgZmxhc2ggbWluaW1hbCBpbnB1dC9vdXRwdXQgdW5pdCwgb3IgJTEgdG8gdXRpbGl6ZSB0aGUgZW50aXJlCisgKiBhdmFpbGFibGUgc3BhY2Ugb2YgbG9naWNhbCBlcmFzZWJsb2Nrcy4KKyAqCisgKiBUaGUgQGFsaWdubWVudCBmaWVsZCBtYXkgYmUgdXNlZnVsLCBmb3IgZXhhbXBsZSwgd2hlbiBvbmUgd2FudHMgdG8gbWFpbnRhaW4KKyAqIGEgYmxvY2sgZGV2aWNlIG9uIHRvcCBvZiBhbiBVQkkgdm9sdW1lLiBJbiB0aGlzIGNhc2UsIGl0IGlzIGRlc2lyYWJsZSB0byBmaXQKKyAqIGFuIGludGVnZXIgbnVtYmVyIG9mIGJsb2NrcyBpbiBsb2dpY2FsIGVyYXNlYmxvY2tzIG9mIHRoaXMgVUJJIHZvbHVtZS4gV2l0aAorICogYWxpZ25tZW50IGl0IGlzIHBvc3NpYmxlIHRvIHVwZGF0ZSB0aGlzIHZvbHVtZSB1c2luZyBwbGFuZSBVQkkgdm9sdW1lIGltYWdlCisgKiBCTE9Ccywgd2l0aG91dCBjYXJpbmcgYWJvdXQgaG93IHRvIHByb3Blcmx5IGFsaWduIHRoZW0uCisgKi8KK3N0cnVjdCB1YmlfbWt2b2xfcmVxIHsKKwlfX3MzMiB2b2xfaWQ7CisJX19zMzIgYWxpZ25tZW50OworCV9fczY0IGJ5dGVzOworCV9fczggdm9sX3R5cGU7CisJX19zOCBwYWRkaW5nMTsKKwlfX3MxNiBuYW1lX2xlbjsKKwlfX3M4IHBhZGRpbmcyWzRdOworCWNoYXIgbmFtZVtVQklfTUFYX1ZPTFVNRV9OQU1FICsgMV07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKioKKyAqIHN0cnVjdCB1YmlfcnN2b2xfcmVxIC0gYSBkYXRhIHN0cnVjdHVyZSB1c2VkIGluIHZvbHVtZSByZS1zaXplIHJlcXVlc3RzLgorICogQHZvbF9pZDogSUQgb2YgdGhlIHZvbHVtZSB0byByZS1zaXplCisgKiBAYnl0ZXM6IG5ldyBzaXplIG9mIHRoZSB2b2x1bWUgaW4gYnl0ZXMKKyAqCisgKiBSZS1zaXppbmcgaXMgcG9zc2libGUgZm9yIGJvdGggZHluYW1pYyBhbmQgc3RhdGljIHZvbHVtZXMuIEJ1dCB3aGlsZSBkeW5hbWljCisgKiB2b2x1bWVzIG1heSBiZSByZS1zaXplZCBhcmJpdHJhcmlseSwgc3RhdGljIHZvbHVtZXMgY2Fubm90IGJlIG1hZGUgdG8gYmUKKyAqIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZXkgYmVhci4gVG8gYXJiaXRyYXJpbHkgc2hyaW5rIGEgc3RhdGljCisgKiB2b2x1bWUsIGl0IG11c3QgYmUgd2lwZWQgb3V0IGZpcnN0IChieSBtZWFucyBvZiB2b2x1bWUgdXBkYXRlIG9wZXJhdGlvbiB3aXRoCisgKiB6ZXJvIG51bWJlciBvZiBieXRlcykuCisgKi8KK3N0cnVjdCB1YmlfcnN2b2xfcmVxIHsKKwlfX3M2NCBieXRlczsKKwlfX3MzMiB2b2xfaWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKioKKyAqIHN0cnVjdCB1Ymlfcm52b2xfcmVxIC0gdm9sdW1lcyByZS1uYW1lIHJlcXVlc3QuCisgKiBAY291bnQ6IGNvdW50IG9mIHZvbHVtZXMgdG8gcmUtbmFtZQorICogQHBhZGRpbmcxOiAgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSwgbm90IHVzZWQsIGhhcyB0byBiZSB6ZXJvZWQKKyAqIEB2b2xfaWQ6IElEIG9mIHRoZSB2b2x1bWUgdG8gcmUtbmFtZQorICogQG5hbWVfbGVuOiBuYW1lIGxlbmd0aAorICogQHBhZGRpbmcyOiAgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSwgbm90IHVzZWQsIGhhcyB0byBiZSB6ZXJvZWQKKyAqIEBuYW1lOiBuZXcgdm9sdW1lIG5hbWUKKyAqCisgKiBVQkkgYWxsb3dzIHRvIHJlLW5hbWUgdXAgdG8gJTMyIHZvbHVtZXMgYXQgb25lIGdvLiBUaGUgY291bnQgb2Ygdm9sdW1lcyB0bworICogcmUtbmFtZSBpcyBzcGVjaWZpZWQgaW4gdGhlIEBjb3VudCBmaWVsZC4gVGhlIElEIG9mIHRoZSB2b2x1bWVzIHRvIHJlLW5hbWUKKyAqIGFuZCB0aGUgbmV3IG5hbWVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIEB2b2xfaWQgYW5kIEBuYW1lIGZpZWxkcy4KKyAqCisgKiBUaGUgVUJJIHZvbHVtZSByZS1uYW1lIG9wZXJhdGlvbiBpcyBhdG9taWMsIHdoaWNoIG1lYW5zIHRoYXQgc2hvdWxkIHBvd2VyIGN1dAorICogaGFwcGVuLCB0aGUgdm9sdW1lcyB3aWxsIGhhdmUgZWl0aGVyIG9sZCBuYW1lIG9yIG5ldyBuYW1lLiBTbyB0aGUgcG9zc2libGUKKyAqIHVzZS1jYXNlcyBvZiB0aGlzIGNvbW1hbmQgaXMgYXRvbWljIHVwZ3JhZGUuIEluZGVlZCwgdG8gdXBncmFkZSwgc2F5LCB2b2x1bWVzCisgKiBBIGFuZCBCIG9uZSBtYXkgY3JlYXRlIHRlbXBvcmFyeSB2b2x1bWVzICVBMSBhbmQgJUIxIHdpdGggdGhlIG5ldyBjb250ZW50cywKKyAqIHRoZW4gYXRvbWljYWxseSByZS1uYW1lIEExLT5BIGFuZCBCMS0+QiwgaW4gd2hpY2ggY2FzZSBvbGQgJUEgYW5kICVCIHdpbGwKKyAqIGJlIHJlbW92ZWQuCisgKgorICogSWYgaXQgaXMgbm90IGRlc2lyYWJsZSB0byByZW1vdmUgb2xkIEEgYW5kIEIsIHRoZSByZS1uYW1lIHJlcXVlc3QgaGFzIHRvCisgKiBjb250YWluIDQgZW50cmllczogQTEtPkEsIEEtPkExLCBCMS0+QiwgQi0+QjEsIGluIHdoaWNoIGNhc2Ugb2xkIEExIGFuZCBCMQorICogYmVjb21lIEEgYW5kIEIsIGFuZCBvbGQgQSBhbmQgQiB3aWxsIGJlY29tZSBBMSBhbmQgQjEuCisgKgorICogSXQgaXMgYWxzbyBPSyB0byByZXF1ZXN0OiBBMS0+QSwgQTEtPlgsIEIxLT5CLCBCLT5ZLCBpbiB3aGljaCBjYXNlIG9sZCBBMQorICogYW5kIEIxIGJlY29tZSBBIGFuZCBCLCBhbmQgb2xkIEEgYW5kIEIgYmVjb21lIFggYW5kIFkuCisgKgorICogSW4gb3RoZXIgd29yZHMsIGluIGNhc2Ugb2YgcmUtbmFtaW5nIGludG8gYW4gZXhpc3Rpbmcgdm9sdW1lIG5hbWUsIHRoZQorICogZXhpc3Rpbmcgdm9sdW1lIGlzIHJlbW92ZWQsIHVubGVzcyBpdCBpcyByZS1uYW1lZCBhcyB3ZWxsIGF0IHRoZSBzYW1lCisgKiByZS1uYW1lIHJlcXVlc3QuCisgKi8KK3N0cnVjdCB1Ymlfcm52b2xfcmVxIHsKKwlfX3MzMiBjb3VudDsKKwlfX3M4IHBhZGRpbmcxWzEyXTsKKwlzdHJ1Y3QgeworCQlfX3MzMiB2b2xfaWQ7CisJCV9fczE2IG5hbWVfbGVuOworCQlfX3M4ICBwYWRkaW5nMlsyXTsKKwkJY2hhciAgICBuYW1lW1VCSV9NQVhfVk9MVU1FX05BTUUgKyAxXTsKKwl9IGVudHNbVUJJX01BWF9STlZPTF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKioKKyAqIHN0cnVjdCB1YmlfbGViX2NoYW5nZV9yZXEgLSBhIGRhdGEgc3RydWN0dXJlIHVzZWQgaW4gYXRvbWljIExFQiBjaGFuZ2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cy4KKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyIHRvIGNoYW5nZQorICogQGJ5dGVzOiBob3cgbWFueSBieXRlcyB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGxvZ2ljYWwgZXJhc2VibG9jaworICogQGR0eXBlOiBkYXRhIHR5cGUgKCVVQklfTE9OR1RFUk0sICVVQklfU0hPUlRURVJNLCAlVUJJX1VOS05PV04pCisgKiBAcGFkZGluZzogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSwgbm90IHVzZWQsIGhhcyB0byBiZSB6ZXJvZWQKKyAqLworc3RydWN0IHViaV9sZWJfY2hhbmdlX3JlcSB7CisJX19zMzIgbG51bTsKKwlfX3MzMiBieXRlczsKKwlfX3M4ICBkdHlwZTsKKwlfX3M4ICBwYWRkaW5nWzddOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqCisgKiBzdHJ1Y3QgdWJpX21hcF9yZXEgLSBhIGRhdGEgc3RydWN0dXJlIHVzZWQgaW4gbWFwIExFQiByZXF1ZXN0cy4KKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyIHRvIHVubWFwCisgKiBAZHR5cGU6IGRhdGEgdHlwZSAoJVVCSV9MT05HVEVSTSwgJVVCSV9TSE9SVFRFUk0sICVVQklfVU5LTk9XTikKKyAqIEBwYWRkaW5nOiByZXNlcnZlZCBmb3IgZnV0dXJlLCBub3QgdXNlZCwgaGFzIHRvIGJlIHplcm9lZAorICovCitzdHJ1Y3QgdWJpX21hcF9yZXEgeworCV9fczMyIGxudW07CisJX19zOCAgZHR5cGU7CisJX19zOCAgcGFkZGluZ1szXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyoqCisgKiBzdHJ1Y3QgdWJpX3NldF92b2xfcHJvcF9yZXEgLSBhIGRhdGEgc3RydWN0dXJlIHVzZWQgdG8gc2V0IGFuIFVCSSB2b2x1bWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LgorICogQHByb3BlcnR5OiBwcm9wZXJ0eSB0byBzZXQgKCVVQklfVk9MX1BST1BfRElSRUNUX1dSSVRFKQorICogQHBhZGRpbmc6IHJlc2VydmVkIGZvciBmdXR1cmUsIG5vdCB1c2VkLCBoYXMgdG8gYmUgemVyb2VkCisgKiBAdmFsdWU6IHZhbHVlIHRvIHNldAorICovCitzdHJ1Y3QgdWJpX3NldF92b2xfcHJvcF9yZXEgeworCV9fdTggIHByb3BlcnR5OworCV9fdTggIHBhZGRpbmdbN107CisJX191NjQgdmFsdWU7Cit9ICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2VuZGlmIC8qIF9fVUJJX1VTRVJfSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25jX3RwYXJtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25jX3RwYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkYmNhYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmNfdHBhcm0uaApAQCAtMCwwICsxLDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEF1dGhvcjogVGhvbWFzIEUuIERpY2tleSAgICAgICAgICAgICAgICAgICAgICAgIDIwMDYgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAkSWQ6IG5jX3RwYXJtLmgsdiAxLjUgMjAxMC8xMi8yNSAyMDoyNzoyMiB0b20gRXhwICQgKi8KKworI2lmbmRlZiBOQ19UUEFSTV9pbmNsdWRlZAorI2RlZmluZSBOQ19UUEFSTV9pbmNsdWRlZCAxCisKKy8qCisgKiBDYXN0IHBhcmFtZXRlcnMgcGFzdCB0aGUgZm9ybWF0dGluZy1zdHJpbmcgZm9yIHRwYXJtKCkgdG8gbWF0Y2ggdGhlCisgKiBhc3N1bXB0aW9uIG9mIHRoZSB2YXJhcmdzIGNvZGUuCisgKi8KKyNpZm5kZWYgVFBBUk1fQVJHCisjZGVmaW5lIFRQQVJNX0FSRyBsb25nCisjZW5kaWYKKworI2RlZmluZSBUUEFSTV9OKG4pIChUUEFSTV9BUkcpKG4pCisKKyNkZWZpbmUgVFBBUk1fOShhLGIsYyxkLGUsZixnLGgsaSxqKSB0cGFybShhLFRQQVJNX04oYiksVFBBUk1fTihjKSxUUEFSTV9OKGQpLFRQQVJNX04oZSksVFBBUk1fTihmKSxUUEFSTV9OKGcpLFRQQVJNX04oaCksVFBBUk1fTihpKSxUUEFSTV9OKGopKQorCisjaWYgTkNVUlNFU19UUEFSTV9WQVJBUkdTCisjZGVmaW5lIFRQQVJNXzgoYSxiLGMsZCxlLGYsZyxoLGkpIHRwYXJtKGEsVFBBUk1fTihiKSxUUEFSTV9OKGMpLFRQQVJNX04oZCksVFBBUk1fTihlKSxUUEFSTV9OKGYpLFRQQVJNX04oZyksVFBBUk1fTihoKSxUUEFSTV9OKGkpKQorI2RlZmluZSBUUEFSTV83KGEsYixjLGQsZSxmLGcsaCkgdHBhcm0oYSxUUEFSTV9OKGIpLFRQQVJNX04oYyksVFBBUk1fTihkKSxUUEFSTV9OKGUpLFRQQVJNX04oZiksVFBBUk1fTihnKSxUUEFSTV9OKGgpKQorI2RlZmluZSBUUEFSTV82KGEsYixjLGQsZSxmLGcpIHRwYXJtKGEsVFBBUk1fTihiKSxUUEFSTV9OKGMpLFRQQVJNX04oZCksVFBBUk1fTihlKSxUUEFSTV9OKGYpLFRQQVJNX04oZykpCisjZGVmaW5lIFRQQVJNXzUoYSxiLGMsZCxlLGYpIHRwYXJtKGEsVFBBUk1fTihiKSxUUEFSTV9OKGMpLFRQQVJNX04oZCksVFBBUk1fTihlKSxUUEFSTV9OKGYpKQorI2RlZmluZSBUUEFSTV80KGEsYixjLGQsZSkgdHBhcm0oYSxUUEFSTV9OKGIpLFRQQVJNX04oYyksVFBBUk1fTihkKSxUUEFSTV9OKGUpKQorI2RlZmluZSBUUEFSTV8zKGEsYixjLGQpIHRwYXJtKGEsVFBBUk1fTihiKSxUUEFSTV9OKGMpLFRQQVJNX04oZCkpCisjZGVmaW5lIFRQQVJNXzIoYSxiLGMpIHRwYXJtKGEsVFBBUk1fTihiKSxUUEFSTV9OKGMpKQorI2RlZmluZSBUUEFSTV8xKGEsYikgdHBhcm0oYSxUUEFSTV9OKGIpKQorI2RlZmluZSBUUEFSTV8wKGEpIHRwYXJtKGEpCisjZWxzZQorI2RlZmluZSBUUEFSTV84KGEsYixjLGQsZSxmLGcsaCxpKSBUUEFSTV85KGEsYixjLGQsZSxmLGcsaCxpLDApCisjZGVmaW5lIFRQQVJNXzcoYSxiLGMsZCxlLGYsZyxoKSBUUEFSTV84KGEsYixjLGQsZSxmLGcsaCwwKQorI2RlZmluZSBUUEFSTV82KGEsYixjLGQsZSxmLGcpIFRQQVJNXzcoYSxiLGMsZCxlLGYsZywwKQorI2RlZmluZSBUUEFSTV81KGEsYixjLGQsZSxmKSBUUEFSTV82KGEsYixjLGQsZSxmLDApCisjZGVmaW5lIFRQQVJNXzQoYSxiLGMsZCxlKSBUUEFSTV81KGEsYixjLGQsZSwwKQorI2RlZmluZSBUUEFSTV8zKGEsYixjLGQpIFRQQVJNXzQoYSxiLGMsZCwwKQorI2RlZmluZSBUUEFSTV8yKGEsYixjKSBUUEFSTV8zKGEsYixjLDApCisjZGVmaW5lIFRQQVJNXzEoYSxiKSBUUEFSTV8yKGEsYiwwKQorI2RlZmluZSBUUEFSTV8xKGEsYikgVFBBUk1fMihhLGIsMCkKKyNkZWZpbmUgVFBBUk1fMChhKSBUUEFSTV8xKGEsMCkKKyNlbmRpZgorCisjZW5kaWYgLyogTkNfVFBBUk1faW5jbHVkZWQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmN1cnNlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uY3Vyc2VzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMTQ5ZGU2YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmN1cnNlcy5oCkBAIC0wLDAgKzEgQEAKK2N1cnNlcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uY3Vyc2VzX2RsbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uY3Vyc2VzX2RsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzODVkMmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25jdXJzZXNfZGxsLmgKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3LDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRJZDogbmN1cnNlc19kbGwuaC5pbix2IDEuOCAyMDA5LzA0LzA0IDIyOjI2OjI3IHRvbSBFeHAgJCAqLworCisjaWZuZGVmIE5DVVJTRVNfRExMX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX0RMTF9IX2luY2wgMQorCisvKgorICogRm9yIHJlZW50cmFudCBjb2RlLCB3ZSBtYXAgdGhlIHZhcmlvdXMgZ2xvYmFsIHZhcmlhYmxlcyBpbnRvIFNDUkVFTiBieQorICogdXNpbmcgZnVuY3Rpb25zIHRvIGFjY2VzcyB0aGVtLgorICovCisjZGVmaW5lIE5DVVJTRVNfUFVCTElDX1ZBUihuYW1lKSBfbmNfIyNuYW1lCisjZGVmaW5lIE5DVVJTRVNfV1JBUFBFRF9WQVIodHlwZSxuYW1lKSBleHRlcm4gdHlwZSBOQ1VSU0VTX1BVQkxJQ19WQVIobmFtZSkodm9pZCkKKworLyogbm8gbG9uZ2VyIG5lZWRlZCBvbiBjeWd3aW4gb3IgbWluZ3csIHRoYW5rcyB0byBhdXRvLWltcG9ydCAgICAgICAqLworLyogYnV0IHRoaXMgc3RydWN0dXJlIG1heSBiZSB1c2VmdWwgYXQgc29tZSBwb2ludCBmb3IgYW4gTVNWQyBidWlsZCAqLworLyogc28sIGZvciBub3cgdW5jb25kaXRpb25hbGx5IGRlZmluZSB0aGUgaW1wb3J0YW50IGZsYWdzICAgICAgICAgICAqLworLyogInRoZSByaWdodCB3YXkiIGZvciBwcm9wZXIgc3RhdGljIGFuZCBkbGwrYXV0by1pbXBvcnQgYmVoYXZpb3IgICAqLworI3VuZGVmIE5DVVJTRVNfRExMCisjZGVmaW5lIE5DVVJTRVNfU1RBVElDCisKKyNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisjICBpZiBkZWZpbmVkKE5DVVJTRVNfRExMKQorIyAgICBpZiBkZWZpbmVkKE5DVVJTRVNfU1RBVElDKQorIyAgICAgIHVuZGVmIE5DVVJTRVNfU1RBVElDCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgdW5kZWYgTkNVUlNFU19JTVBFWFAKKyMgIHVuZGVmIE5DVVJTRVNfQVBJCisjICB1bmRlZiBOQ1VSU0VTX0VYUE9SVAorIyAgdW5kZWYgTkNVUlNFU19FWFBPUlRfVkFSCisjICBpZiBkZWZpbmVkKE5DVVJTRVNfRExMKQorLyogYnVpbGRpbmcgYSBETEwgKi8KKyMgICAgZGVmaW5lIE5DVVJTRVNfSU1QRVhQIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgZWxpZiBkZWZpbmVkKE5DVVJTRVNfU1RBVElDKQorLyogYnVpbGRpbmcgb3IgbGlua2luZyB0byBhIHN0YXRpYyBsaWJyYXJ5ICovCisjICAgIGRlZmluZSBOQ1VSU0VTX0lNUEVYUCAvKiBub3RoaW5nICovCisjICBlbHNlCisvKiBsaW5raW5nIHRvIHRoZSBETEwgKi8KKyMgICAgZGVmaW5lIE5DVVJTRVNfSU1QRVhQIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgZW5kaWYKKyMgIGRlZmluZSBOQ1VSU0VTX0FQSSBfX2NkZWNsCisjICBkZWZpbmUgTkNVUlNFU19FWFBPUlQodHlwZSkgTkNVUlNFU19JTVBFWFAgdHlwZSBOQ1VSU0VTX0FQSQorIyAgZGVmaW5lIE5DVVJTRVNfRVhQT1JUX1ZBUih0eXBlKSBOQ1VSU0VTX0lNUEVYUCB0eXBlCisjZW5kaWYKKworLyogVGFrZSBjYXJlIG9mIG5vbi1jeWd3aW4gcGxhdGZvcm1zICovCisjaWYgIWRlZmluZWQoTkNVUlNFU19JTVBFWFApCisjICBkZWZpbmUgTkNVUlNFU19JTVBFWFAgLyogbm90aGluZyAqLworI2VuZGlmCisjaWYgIWRlZmluZWQoTkNVUlNFU19BUEkpCisjICBkZWZpbmUgTkNVUlNFU19BUEkgLyogbm90aGluZyAqLworI2VuZGlmCisjaWYgIWRlZmluZWQoTkNVUlNFU19FWFBPUlQpCisjICBkZWZpbmUgTkNVUlNFU19FWFBPUlQodHlwZSkgTkNVUlNFU19JTVBFWFAgdHlwZSBOQ1VSU0VTX0FQSQorI2VuZGlmCisjaWYgIWRlZmluZWQoTkNVUlNFU19FWFBPUlRfVkFSKQorIyAgZGVmaW5lIE5DVVJTRVNfRVhQT1JUX1ZBUih0eXBlKSBOQ1VSU0VTX0lNUEVYUCB0eXBlCisjZW5kaWYKKworI2VuZGlmIC8qIE5DVVJTRVNfRExMX0hfaW5jbCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvZXRoZXJuZXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2V0aGVybmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0MmQ1OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2V0aGVybmV0LmgKQEAgLTAsMCArMSw4NCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5LCAyMDAxLCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBCYXNlZCBvbiB0aGUgRnJlZUJTRCB2ZXJzaW9uIG9mIHRoaXMgZmlsZS4gQ3VyaW91c2x5LCB0aGF0IGZpbGUKKyAgIGxhY2tzIGEgY29weXJpZ2h0IGluIHRoZSBoZWFkZXIuICovCisKKyNpZm5kZWYgX19ORVRfRVRIRVJORVRfSAorI2RlZmluZSBfX05FVF9FVEhFUk5FVF9IIDEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+ICAgICAvKiBJRUVFIDgwMi4zIEV0aGVybmV0IGNvbnN0YW50cyAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoaXMgaXMgYSBuYW1lIGZvciB0aGUgNDggYml0IGV0aGVybmV0IGFkZHJlc3MgYXZhaWxhYmxlIG9uIG1hbnkKKyAgIHN5c3RlbXMuICAqLworc3RydWN0IGV0aGVyX2FkZHIKK3sKKyAgdV9pbnQ4X3QgZXRoZXJfYWRkcl9vY3RldFtFVEhfQUxFTl07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qIDEwTWIvcyBldGhlcm5ldCBoZWFkZXIgKi8KK3N0cnVjdCBldGhlcl9oZWFkZXIKK3sKKyAgdV9pbnQ4X3QgIGV0aGVyX2Rob3N0W0VUSF9BTEVOXTsJLyogZGVzdGluYXRpb24gZXRoIGFkZHIJKi8KKyAgdV9pbnQ4X3QgIGV0aGVyX3Nob3N0W0VUSF9BTEVOXTsJLyogc291cmNlIGV0aGVyIGFkZHIJKi8KKyAgdV9pbnQxNl90IGV0aGVyX3R5cGU7CQkgICAgICAgIC8qIHBhY2tldCB0eXBlIElEIGZpZWxkCSovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qIEV0aGVybmV0IHByb3RvY29sIElEJ3MgKi8KKyNkZWZpbmUJRVRIRVJUWVBFX1BVUAkJMHgwMjAwICAgICAgICAgIC8qIFhlcm94IFBVUCAqLworI2RlZmluZSBFVEhFUlRZUEVfU1BSSVRFCTB4MDUwMAkJLyogU3ByaXRlICovCisjZGVmaW5lCUVUSEVSVFlQRV9JUAkJMHgwODAwCQkvKiBJUCAqLworI2RlZmluZQlFVEhFUlRZUEVfQVJQCQkweDA4MDYJCS8qIEFkZHJlc3MgcmVzb2x1dGlvbiAqLworI2RlZmluZQlFVEhFUlRZUEVfUkVWQVJQCTB4ODAzNQkJLyogUmV2ZXJzZSBBUlAgKi8KKyNkZWZpbmUgRVRIRVJUWVBFX0FUCQkweDgwOUIJCS8qIEFwcGxlVGFsayBwcm90b2NvbCAqLworI2RlZmluZSBFVEhFUlRZUEVfQUFSUAkJMHg4MEYzCQkvKiBBcHBsZVRhbGsgQVJQICovCisjZGVmaW5lCUVUSEVSVFlQRV9WTEFOCQkweDgxMDAJCS8qIElFRUUgODAyLjFRIFZMQU4gdGFnZ2luZyAqLworI2RlZmluZSBFVEhFUlRZUEVfSVBYCQkweDgxMzcJCS8qIElQWCAqLworI2RlZmluZQlFVEhFUlRZUEVfSVBWNgkJMHg4NmRkCQkvKiBJUCBwcm90b2NvbCB2ZXJzaW9uIDYgKi8KKyNkZWZpbmUgRVRIRVJUWVBFX0xPT1BCQUNLCTB4OTAwMAkJLyogdXNlZCB0byB0ZXN0IGludGVyZmFjZXMgKi8KKworCisjZGVmaW5lCUVUSEVSX0FERFJfTEVOCUVUSF9BTEVOICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIGV0aGVybmV0IGFkZHIgKi8KKyNkZWZpbmUJRVRIRVJfVFlQRV9MRU4JMiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ5dGVzIGluIHR5cGUgZmllbGQgKi8KKyNkZWZpbmUJRVRIRVJfQ1JDX0xFTgk0ICAgICAgICAgICAgICAgICAgICAgICAgLyogYnl0ZXMgaW4gQ1JDIGZpZWxkICovCisjZGVmaW5lCUVUSEVSX0hEUl9MRU4JRVRIX0hMRU4gICAgICAgICAgICAgICAgIC8qIHRvdGFsIG9jdGV0cyBpbiBoZWFkZXIgKi8KKyNkZWZpbmUJRVRIRVJfTUlOX0xFTgkoRVRIX1pMRU4gKyBFVEhFUl9DUkNfTEVOKSAvKiBtaW4gcGFja2V0IGxlbmd0aCAqLworI2RlZmluZQlFVEhFUl9NQVhfTEVOCShFVEhfRlJBTUVfTEVOICsgRVRIRVJfQ1JDX0xFTikgLyogbWF4IHBhY2tldCBsZW5ndGggKi8KKworLyogbWFrZSBzdXJlIGV0aGVuZXQgbGVuZ3RoIGlzIHZhbGlkICovCisjZGVmaW5lCUVUSEVSX0lTX1ZBTElEX0xFTihmb28pCVwKKwkoKGZvbykgPj0gRVRIRVJfTUlOX0xFTiAmJiAoZm9vKSA8PSBFVEhFUl9NQVhfTEVOKQorCisvKgorICogVGhlIEVUSEVSVFlQRV9OVFJBSUxFUiBwYWNrZXQgdHlwZXMgc3RhcnRpbmcgYXQgRVRIRVJUWVBFX1RSQUlMIGhhdmUKKyAqICh0eXBlLUVUSEVSVFlQRV9UUkFJTCkqNTEyIGJ5dGVzIG9mIGRhdGEgZm9sbG93ZWQKKyAqIGJ5IGFuIEVUSEVSIHR5cGUgKGFzIGdpdmVuIGFib3ZlKSBhbmQgdGhlbiB0aGUgKHZhcmlhYmxlLWxlbmd0aCkgaGVhZGVyLgorICovCisjZGVmaW5lCUVUSEVSVFlQRV9UUkFJTAkJMHgxMDAwCQkvKiBUcmFpbGVyIHBhY2tldCAqLworI2RlZmluZQlFVEhFUlRZUEVfTlRSQUlMRVIJMTYKKworI2RlZmluZQlFVEhFUk1UVQlFVEhfREFUQV9MRU4KKyNkZWZpbmUJRVRIRVJNSU4JKEVUSEVSX01JTl9MRU4gLSBFVEhFUl9IRFJfTEVOIC0gRVRIRVJfQ1JDX0xFTikKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIG5ldC9ldGhlcm5ldC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmIzZTlmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWYuaApAQCAtMCwwICsxLDIwNSBAQAorLyogbmV0L2lmLmggLS0gZGVjbGFyYXRpb25zIGZvciBpbnF1aXJpbmcgYWJvdXQgbmV0d29yayBpbnRlcmZhY2VzCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsOTgsOTksMjAwMCwyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ORVRfSUZfSAorI2RlZmluZSBfTkVUX0lGX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2lmZGVmIF9fVVNFX01JU0MKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorCisKKy8qIExlbmd0aCBvZiBpbnRlcmZhY2UgbmFtZS4gICovCisjZGVmaW5lIElGX05BTUVTSVpFCTE2CisKK3N0cnVjdCBpZl9uYW1laW5kZXgKKyAgeworICAgIHVuc2lnbmVkIGludCBpZl9pbmRleDsJLyogMSwgMiwgLi4uICovCisgICAgY2hhciAqaWZfbmFtZTsJCS8qIG51bGwgdGVybWluYXRlZCBuYW1lOiAiZXRoMCIsIC4uLiAqLworICB9OworCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBTdGFuZGFyZCBpbnRlcmZhY2UgZmxhZ3MuICovCitlbnVtCisgIHsKKyAgICBJRkZfVVAgPSAweDEsCQkvKiBJbnRlcmZhY2UgaXMgdXAuICAqLworIyBkZWZpbmUgSUZGX1VQCUlGRl9VUAorICAgIElGRl9CUk9BRENBU1QgPSAweDIsCS8qIEJyb2FkY2FzdCBhZGRyZXNzIHZhbGlkLiAgKi8KKyMgZGVmaW5lIElGRl9CUk9BRENBU1QJSUZGX0JST0FEQ0FTVAorICAgIElGRl9ERUJVRyA9IDB4NCwJCS8qIFR1cm4gb24gZGVidWdnaW5nLiAgKi8KKyMgZGVmaW5lIElGRl9ERUJVRwlJRkZfREVCVUcKKyAgICBJRkZfTE9PUEJBQ0sgPSAweDgsCQkvKiBJcyBhIGxvb3BiYWNrIG5ldC4gICovCisjIGRlZmluZSBJRkZfTE9PUEJBQ0sJSUZGX0xPT1BCQUNLCisgICAgSUZGX1BPSU5UT1BPSU5UID0gMHgxMCwJLyogSW50ZXJmYWNlIGlzIHBvaW50LXRvLXBvaW50IGxpbmsuICAqLworIyBkZWZpbmUgSUZGX1BPSU5UT1BPSU5UIElGRl9QT0lOVE9QT0lOVAorICAgIElGRl9OT1RSQUlMRVJTID0gMHgyMCwJLyogQXZvaWQgdXNlIG9mIHRyYWlsZXJzLiAgKi8KKyMgZGVmaW5lIElGRl9OT1RSQUlMRVJTCUlGRl9OT1RSQUlMRVJTCisgICAgSUZGX1JVTk5JTkcgPSAweDQwLAkJLyogUmVzb3VyY2VzIGFsbG9jYXRlZC4gICovCisjIGRlZmluZSBJRkZfUlVOTklORwlJRkZfUlVOTklORworICAgIElGRl9OT0FSUCA9IDB4ODAsCQkvKiBObyBhZGRyZXNzIHJlc29sdXRpb24gcHJvdG9jb2wuICAqLworIyBkZWZpbmUgSUZGX05PQVJQCUlGRl9OT0FSUAorICAgIElGRl9QUk9NSVNDID0gMHgxMDAsCS8qIFJlY2VpdmUgYWxsIHBhY2tldHMuICAqLworIyBkZWZpbmUgSUZGX1BST01JU0MJSUZGX1BST01JU0MKKworICAgIC8qIE5vdCBzdXBwb3J0ZWQgKi8KKyAgICBJRkZfQUxMTVVMVEkgPSAweDIwMCwJLyogUmVjZWl2ZSBhbGwgbXVsdGljYXN0IHBhY2tldHMuICAqLworIyBkZWZpbmUgSUZGX0FMTE1VTFRJCUlGRl9BTExNVUxUSQorCisgICAgSUZGX01BU1RFUiA9IDB4NDAwLAkJLyogTWFzdGVyIG9mIGEgbG9hZCBiYWxhbmNlci4gICovCisjIGRlZmluZSBJRkZfTUFTVEVSCUlGRl9NQVNURVIKKyAgICBJRkZfU0xBVkUgPSAweDgwMCwJCS8qIFNsYXZlIG9mIGEgbG9hZCBiYWxhbmNlci4gICovCisjIGRlZmluZSBJRkZfU0xBVkUJSUZGX1NMQVZFCisKKyAgICBJRkZfTVVMVElDQVNUID0gMHgxMDAwLAkvKiBTdXBwb3J0cyBtdWx0aWNhc3QuICAqLworIyBkZWZpbmUgSUZGX01VTFRJQ0FTVAlJRkZfTVVMVElDQVNUCisKKyAgICBJRkZfUE9SVFNFTCA9IDB4MjAwMCwJLyogQ2FuIHNldCBtZWRpYSB0eXBlLiAgKi8KKyMgZGVmaW5lIElGRl9QT1JUU0VMCUlGRl9QT1JUU0VMCisgICAgSUZGX0FVVE9NRURJQSA9IDB4NDAwMCwJLyogQXV0byBtZWRpYSBzZWxlY3QgYWN0aXZlLiAgKi8KKyMgZGVmaW5lIElGRl9BVVRPTUVESUEJSUZGX0FVVE9NRURJQQorICAgIElGRl9EWU5BTUlDID0gMHg4MDAwCS8qIERpYWx1cCBkZXZpY2Ugd2l0aCBjaGFuZ2luZyBhZGRyZXNzZXMuICAqLworIyBkZWZpbmUgSUZGX0RZTkFNSUMJSUZGX0RZTkFNSUMKKyAgfTsKKworLyogVGhlIGlmYWRkciBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgb25lIGFkZHJlc3Mgb2YgYW4KKyAgIGludGVyZmFjZS4gIFRoZXkgYXJlIG1haW50YWluZWQgYnkgdGhlIGRpZmZlcmVudCBhZGRyZXNzIGZhbWlsaWVzLAorICAgYXJlIGFsbG9jYXRlZCBhbmQgYXR0YWNoZWQgd2hlbiBhbiBhZGRyZXNzIGlzIHNldCwgYW5kIGFyZSBsaW5rZWQKKyAgIHRvZ2V0aGVyIHNvIGFsbCBhZGRyZXNzZXMgZm9yIGFuIGludGVyZmFjZSBjYW4gYmUgbG9jYXRlZC4gICovCisKK3N0cnVjdCBpZmFkZHIKKyAgeworICAgIHN0cnVjdCBzb2NrYWRkciBpZmFfYWRkcjsJLyogQWRkcmVzcyBvZiBpbnRlcmZhY2UuICAqLworICAgIHVuaW9uCisgICAgICB7CisJc3RydWN0IHNvY2thZGRyCWlmdV9icm9hZGFkZHI7CisJc3RydWN0IHNvY2thZGRyCWlmdV9kc3RhZGRyOworICAgICAgfSBpZmFfaWZ1OworICAgIHN0cnVjdCBpZmFjZSAqaWZhX2lmcDsJLyogQmFjay1wb2ludGVyIHRvIGludGVyZmFjZS4gICovCisgICAgc3RydWN0IGlmYWRkciAqaWZhX25leHQ7CS8qIE5leHQgYWRkcmVzcyBmb3IgaW50ZXJmYWNlLiAgKi8KKyAgfTsKKworIyBkZWZpbmUgaWZhX2Jyb2FkYWRkcglpZmFfaWZ1LmlmdV9icm9hZGFkZHIJLyogYnJvYWRjYXN0IGFkZHJlc3MJKi8KKyMgZGVmaW5lIGlmYV9kc3RhZGRyCWlmYV9pZnUuaWZ1X2RzdGFkZHIJLyogb3RoZXIgZW5kIG9mIGxpbmsJKi8KKworLyogRGV2aWNlIG1hcHBpbmcgc3RydWN0dXJlLiBJJ2QganVzdCBnb25lIG9mZiBhbmQgZGVzaWduZWQgYQorICAgYmVhdXRpZnVsIHNjaGVtZSB1c2luZyBvbmx5IGxvYWRhYmxlIG1vZHVsZXMgd2l0aCBhcmd1bWVudHMgZm9yCisgICBkcml2ZXIgb3B0aW9ucyBhbmQgYWxvbmcgY29tZSB0aGUgUENNQ0lBIHBlb3BsZSA4KQorCisgICBBaCB3ZWxsLiBUaGUgZ2V0KCkgc2lkZSBvZiB0aGlzIGlzIGdvb2QgZm9yIFdEU0VUVVAsIGFuZCBpdCdsbCBiZQorICAgaGFuZHkgZm9yIGRlYnVnZ2luZyB0aGluZ3MuIFRoZSBzZXQgc2lkZSBpcyBmaW5lIGZvciBub3cgYW5kIGJlaW5nCisgICB2ZXJ5IHNtYWxsIG1pZ2h0IGJlIHdvcnRoIGtlZXBpbmcgZm9yIGNsZWFuIGNvbmZpZ3VyYXRpb24uICAqLworCitzdHJ1Y3QgaWZtYXAKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IG1lbV9zdGFydDsKKyAgICB1bnNpZ25lZCBsb25nIGludCBtZW1fZW5kOworICAgIHVuc2lnbmVkIHNob3J0IGludCBiYXNlX2FkZHI7CisgICAgdW5zaWduZWQgY2hhciBpcnE7CisgICAgdW5zaWduZWQgY2hhciBkbWE7CisgICAgdW5zaWduZWQgY2hhciBwb3J0OworICAgIC8qIDMgYnl0ZXMgc3BhcmUgKi8KKyAgfTsKKworLyogSW50ZXJmYWNlIHJlcXVlc3Qgc3RydWN0dXJlIHVzZWQgZm9yIHNvY2tldCBpb2N0bCdzLiAgQWxsIGludGVyZmFjZQorICAgaW9jdGwncyBtdXN0IGhhdmUgcGFyYW1ldGVyIGRlZmluaXRpb25zIHdoaWNoIGJlZ2luIHdpdGggaWZyX25hbWUuCisgICBUaGUgcmVtYWluZGVyIG1heSBiZSBpbnRlcmZhY2Ugc3BlY2lmaWMuICAqLworCitzdHJ1Y3QgaWZyZXEKKyAgeworIyBkZWZpbmUgSUZIV0FERFJMRU4JNgorIyBkZWZpbmUgSUZOQU1TSVoJSUZfTkFNRVNJWkUKKyAgICB1bmlvbgorICAgICAgeworCWNoYXIgaWZybl9uYW1lW0lGTkFNU0laXTsJLyogSW50ZXJmYWNlIG5hbWUsIGUuZy4gImVuMCIuICAqLworICAgICAgfSBpZnJfaWZybjsKKworICAgIHVuaW9uCisgICAgICB7CisJc3RydWN0IHNvY2thZGRyIGlmcnVfYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHIgaWZydV9kc3RhZGRyOworCXN0cnVjdCBzb2NrYWRkciBpZnJ1X2Jyb2FkYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHIgaWZydV9uZXRtYXNrOworCXN0cnVjdCBzb2NrYWRkciBpZnJ1X2h3YWRkcjsKKwlzaG9ydCBpbnQgaWZydV9mbGFnczsKKwlpbnQgaWZydV9pdmFsdWU7CisJaW50IGlmcnVfbXR1OworCXN0cnVjdCBpZm1hcCBpZnJ1X21hcDsKKwljaGFyIGlmcnVfc2xhdmVbSUZOQU1TSVpdOwkvKiBKdXN0IGZpdHMgdGhlIHNpemUgKi8KKwljaGFyIGlmcnVfbmV3bmFtZVtJRk5BTVNJWl07CisJX19jYWRkcl90IGlmcnVfZGF0YTsKKyAgICAgIH0gaWZyX2lmcnU7CisgIH07CisjIGRlZmluZSBpZnJfbmFtZQlpZnJfaWZybi5pZnJuX25hbWUJLyogaW50ZXJmYWNlIG5hbWUgCSovCisjIGRlZmluZSBpZnJfaHdhZGRyCWlmcl9pZnJ1LmlmcnVfaHdhZGRyCS8qIE1BQyBhZGRyZXNzIAkJKi8KKyMgZGVmaW5lIGlmcl9hZGRyCWlmcl9pZnJ1LmlmcnVfYWRkcgkvKiBhZGRyZXNzCQkqLworIyBkZWZpbmUgaWZyX2RzdGFkZHIJaWZyX2lmcnUuaWZydV9kc3RhZGRyCS8qIG90aGVyIGVuZCBvZiBwLXAgbG5rCSovCisjIGRlZmluZSBpZnJfYnJvYWRhZGRyCWlmcl9pZnJ1LmlmcnVfYnJvYWRhZGRyCS8qIGJyb2FkY2FzdCBhZGRyZXNzCSovCisjIGRlZmluZSBpZnJfbmV0bWFzawlpZnJfaWZydS5pZnJ1X25ldG1hc2sJLyogaW50ZXJmYWNlIG5ldCBtYXNrCSovCisjIGRlZmluZSBpZnJfZmxhZ3MJaWZyX2lmcnUuaWZydV9mbGFncwkvKiBmbGFncwkJKi8KKyMgZGVmaW5lIGlmcl9tZXRyaWMJaWZyX2lmcnUuaWZydV9pdmFsdWUJLyogbWV0cmljCQkqLworIyBkZWZpbmUgaWZyX210dQlpZnJfaWZydS5pZnJ1X210dQkvKiBtdHUJCQkqLworIyBkZWZpbmUgaWZyX21hcAlpZnJfaWZydS5pZnJ1X21hcAkvKiBkZXZpY2UgbWFwCQkqLworIyBkZWZpbmUgaWZyX3NsYXZlCWlmcl9pZnJ1LmlmcnVfc2xhdmUJLyogc2xhdmUgZGV2aWNlCQkqLworIyBkZWZpbmUgaWZyX2RhdGEJaWZyX2lmcnUuaWZydV9kYXRhCS8qIGZvciB1c2UgYnkgaW50ZXJmYWNlCSovCisjIGRlZmluZSBpZnJfaWZpbmRleAlpZnJfaWZydS5pZnJ1X2l2YWx1ZSAgICAvKiBpbnRlcmZhY2UgaW5kZXggICAgICAqLworIyBkZWZpbmUgaWZyX2JhbmR3aWR0aAlpZnJfaWZydS5pZnJ1X2l2YWx1ZQkvKiBsaW5rIGJhbmR3aWR0aAkqLworIyBkZWZpbmUgaWZyX3FsZW4JaWZyX2lmcnUuaWZydV9pdmFsdWUJLyogcXVldWUgbGVuZ3RoCQkqLworIyBkZWZpbmUgaWZyX25ld25hbWUJaWZyX2lmcnUuaWZydV9uZXduYW1lCS8qIE5ldyBuYW1lCQkqLworIyBkZWZpbmUgX0lPVF9pZnJlcQlfSU9UKF9JT1RTKGNoYXIpLElGTkFNU0laLF9JT1RTKGNoYXIpLDE2LDAsMCkKKyMgZGVmaW5lIF9JT1RfaWZyZXFfc2hvcnQgX0lPVChfSU9UUyhjaGFyKSxJRk5BTVNJWixfSU9UUyhzaG9ydCksMSwwLDApCisjIGRlZmluZSBfSU9UX2lmcmVxX2ludAlfSU9UKF9JT1RTKGNoYXIpLElGTkFNU0laLF9JT1RTKGludCksMSwwLDApCisKKworLyogU3RydWN0dXJlIHVzZWQgaW4gU0lPQ0dJRkNPTkYgcmVxdWVzdC4gIFVzZWQgdG8gcmV0cmlldmUgaW50ZXJmYWNlCisgICBjb25maWd1cmF0aW9uIGZvciBtYWNoaW5lICh1c2VmdWwgZm9yIHByb2dyYW1zIHdoaWNoIG11c3Qga25vdyBhbGwKKyAgIG5ldHdvcmtzIGFjY2Vzc2libGUpLiAgKi8KKworc3RydWN0IGlmY29uZgorICB7CisgICAgaW50CWlmY19sZW47CQkJLyogU2l6ZSBvZiBidWZmZXIuICAqLworICAgIHVuaW9uCisgICAgICB7CisJX19jYWRkcl90IGlmY3VfYnVmOworCXN0cnVjdCBpZnJlcSAqaWZjdV9yZXE7CisgICAgICB9IGlmY19pZmN1OworICB9OworIyBkZWZpbmUgaWZjX2J1ZglpZmNfaWZjdS5pZmN1X2J1ZgkvKiBCdWZmZXIgYWRkcmVzcy4gICovCisjIGRlZmluZSBpZmNfcmVxCWlmY19pZmN1LmlmY3VfcmVxCS8qIEFycmF5IG9mIHN0cnVjdHVyZXMuICAqLworIyBkZWZpbmUgX0lPVF9pZmNvbmYgX0lPVChfSU9UUyhzdHJ1Y3QgaWZjb25mKSwxLDAsMCwwLDApIC8qIG5vdCByaWdodCAqLworI2VuZGlmCS8qIE1pc2MuICAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIENvbnZlcnQgYW4gaW50ZXJmYWNlIG5hbWUgdG8gYW4gaW5kZXgsIGFuZCB2aWNlIHZlcnNhLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgaWZfbmFtZXRvaW5kZXggKF9fY29uc3QgY2hhciAqX19pZm5hbWUpIF9fVEhST1c7CitleHRlcm4gY2hhciAqaWZfaW5kZXh0b25hbWUgKHVuc2lnbmVkIGludCBfX2lmaW5kZXgsIGNoYXIgKl9faWZuYW1lKSBfX1RIUk9XOworCisvKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBpbnRlcmZhY2VzIGFuZCB0aGVpciBpbmRpY2VzLiAgKi8KK2V4dGVybiBzdHJ1Y3QgaWZfbmFtZWluZGV4ICppZl9uYW1laW5kZXggKHZvaWQpIF9fVEhST1c7CisKKy8qIEZyZWUgdGhlIGRhdGEgcmV0dXJuZWQgZnJvbSBpZl9uYW1laW5kZXguICAqLworZXh0ZXJuIHZvaWQgaWZfZnJlZW5hbWVpbmRleCAoc3RydWN0IGlmX25hbWVpbmRleCAqX19wdHIpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBuZXQvaWYuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfYXJwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZl9hcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2NiNjFmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfYXJwLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qIERlZmluaXRpb25zIGZvciBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OSwyMDAxLDIwMDYsMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTcuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBCYXNlZCBvbiB0aGUgNC40QlNEIGFuZCBMaW51eCB2ZXJzaW9uIG9mIHRoaXMgZmlsZS4gICovCisKKyNpZm5kZWYgX05FVF9JRl9BUlBfSAorCisjZGVmaW5lIF9ORVRfSUZfQVJQX0ggMQorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFNvbWUgaW50ZXJuYWxzIGZyb20gZGVlcCBkb3duIGluIHRoZSBrZXJuZWwuICAqLworI2RlZmluZSBNQVhfQUREUl9MRU4JNworCisKKy8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gZXRoZXJuZXQgYXJwIGhlYWRlci4gICovCisKKy8qIEFSUCBwcm90b2NvbCBvcGNvZGVzLiAqLworI2RlZmluZQlBUlBPUF9SRVFVRVNUCTEJCS8qIEFSUCByZXF1ZXN0LiAgKi8KKyNkZWZpbmUJQVJQT1BfUkVQTFkJMgkJLyogQVJQIHJlcGx5LiAgKi8KKyNkZWZpbmUJQVJQT1BfUlJFUVVFU1QJMwkJLyogUkFSUCByZXF1ZXN0LiAgKi8KKyNkZWZpbmUJQVJQT1BfUlJFUExZCTQJCS8qIFJBUlAgcmVwbHkuICAqLworI2RlZmluZQlBUlBPUF9JblJFUVVFU1QJOAkJLyogSW5BUlAgcmVxdWVzdC4gICovCisjZGVmaW5lCUFSUE9QX0luUkVQTFkJOQkJLyogSW5BUlAgcmVwbHkuICAqLworI2RlZmluZQlBUlBPUF9OQUsJMTAJCS8qIChBVE0pQVJQIE5BSy4gICovCisKKy8qIFNlZSBSRkMgODI2IGZvciBwcm90b2NvbCBkZXNjcmlwdGlvbi4gIEFSUCBwYWNrZXRzIGFyZSB2YXJpYWJsZQorICAgaW4gc2l6ZTsgdGhlIGFycGhkciBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZml4ZWQtbGVuZ3RoIHBvcnRpb24uCisgICBQcm90b2NvbCB0eXBlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgZm9yIDEwIE1iL3MgRXRoZXJuZXQuCisgICBJdCBpcyBmb2xsb3dlZCBieSB0aGUgdmFyaWFibGUtc2l6ZWQgZmllbGRzIGFyX3NoYSwgYXJwX3NwYSwKKyAgIGFycF90aGEgYW5kIGFycF90cGEgaW4gdGhhdCBvcmRlciwgYWNjb3JkaW5nIHRvIHRoZSBsZW5ndGhzCisgICBzcGVjaWZpZWQuICBGaWVsZCBuYW1lcyB1c2VkIGNvcnJlc3BvbmQgdG8gUkZDIDgyNi4gICovCisKK3N0cnVjdCBhcnBoZHIKKyAgeworICAgIHVuc2lnbmVkIHNob3J0IGludCBhcl9ocmQ7CQkvKiBGb3JtYXQgb2YgaGFyZHdhcmUgYWRkcmVzcy4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGFyX3BybzsJCS8qIEZvcm1hdCBvZiBwcm90b2NvbCBhZGRyZXNzLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGFyX2hsbjsJCS8qIExlbmd0aCBvZiBoYXJkd2FyZSBhZGRyZXNzLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGFyX3BsbjsJCS8qIExlbmd0aCBvZiBwcm90b2NvbCBhZGRyZXNzLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgYXJfb3A7CQkvKiBBUlAgb3Bjb2RlIChjb21tYW5kKS4gICovCisjaWYgMAorICAgIC8qIEV0aGVybmV0IGxvb2tzIGxpa2UgdGhpcyA6IFRoaXMgYml0IGlzIHZhcmlhYmxlIHNpemVkCisgICAgICAgaG93ZXZlci4uLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIF9fYXJfc2hhW0VUSF9BTEVOXTsJLyogU2VuZGVyIGhhcmR3YXJlIGFkZHJlc3MuICAqLworICAgIHVuc2lnbmVkIGNoYXIgX19hcl9zaXBbNF07CQkvKiBTZW5kZXIgSVAgYWRkcmVzcy4gICovCisgICAgdW5zaWduZWQgY2hhciBfX2FyX3RoYVtFVEhfQUxFTl07CS8qIFRhcmdldCBoYXJkd2FyZSBhZGRyZXNzLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIF9fYXJfdGlwWzRdOwkJLyogVGFyZ2V0IElQIGFkZHJlc3MuICAqLworI2VuZGlmCisgIH07CisKKworLyogQVJQIHByb3RvY29sIEhBUkRXQVJFIGlkZW50aWZpZXJzLiAqLworI2RlZmluZSBBUlBIUkRfTkVUUk9NCTAJCS8qIEZyb20gS0E5UTogTkVUL1JPTSBwc2V1ZG8uICovCisjZGVmaW5lIEFSUEhSRF9FVEhFUiAJMQkJLyogRXRoZXJuZXQgMTAvMTAwTWJwcy4gICovCisjZGVmaW5lCUFSUEhSRF9FRVRIRVIJMgkJLyogRXhwZXJpbWVudGFsIEV0aGVybmV0LiAgKi8KKyNkZWZpbmUJQVJQSFJEX0FYMjUJMwkJLyogQVguMjUgTGV2ZWwgMi4gICovCisjZGVmaW5lCUFSUEhSRF9QUk9ORVQJNAkJLyogUFJPbmV0IHRva2VuIHJpbmcuICAqLworI2RlZmluZQlBUlBIUkRfQ0hBT1MJNQkJLyogQ2hhb3NuZXQuICAqLworI2RlZmluZQlBUlBIUkRfSUVFRTgwMgk2CQkvKiBJRUVFIDgwMi4yIEV0aGVybmV0L1RSL1RCLiAgKi8KKyNkZWZpbmUJQVJQSFJEX0FSQ05FVAk3CQkvKiBBUkNuZXQuICAqLworI2RlZmluZQlBUlBIUkRfQVBQTEVUTEsJOAkJLyogQVBQTEV0YWxrLiAgKi8KKyNkZWZpbmUJQVJQSFJEX0RMQ0kJMTUJCS8qIEZyYW1lIFJlbGF5IERMQ0kuICAqLworI2RlZmluZQlBUlBIUkRfQVRNCTE5CQkvKiBBVE0uICAqLworI2RlZmluZQlBUlBIUkRfTUVUUklDT00JMjMJCS8qIE1ldHJpY29tIFNUUklQIChuZXcgSUFOQSBpZCkuICAqLworI2RlZmluZSBBUlBIUkRfSUVFRTEzOTQJMjQJCS8qIElFRUUgMTM5NCBJUHY0IC0gUkZDIDI3MzQuICAqLworI2RlZmluZSBBUlBIUkRfRVVJNjQJCTI3CQkvKiBFVUktNjQuICAqLworI2RlZmluZSBBUlBIUkRfSU5GSU5JQkFORAkzMgkJLyogSW5maW5pQmFuZC4gICovCisKKy8qIER1bW15IHR5cGVzIGZvciBub24gQVJQIGhhcmR3YXJlICovCisjZGVmaW5lIEFSUEhSRF9TTElQCTI1NgorI2RlZmluZSBBUlBIUkRfQ1NMSVAJMjU3CisjZGVmaW5lIEFSUEhSRF9TTElQNgkyNTgKKyNkZWZpbmUgQVJQSFJEX0NTTElQNgkyNTkKKyNkZWZpbmUgQVJQSFJEX1JTUlZECTI2MAkJLyogTm90aW9uYWwgS0lTUyB0eXBlLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0FEQVBUCTI2NAorI2RlZmluZSBBUlBIUkRfUk9TRQkyNzAKKyNkZWZpbmUgQVJQSFJEX1gyNQkyNzEJCS8qIENDSVRUIFguMjUuICAqLworI2RlZmluZSBBUlBIUkRfSFdYMjUJMjcyCQkvKiBCb2FyZHMgd2l0aCBYLjI1IGluIGZpcm13YXJlLiAgKi8KKyNkZWZpbmUgQVJQSFJEX1BQUAk1MTIKKyNkZWZpbmUgQVJQSFJEX0NJU0NPCTUxMwkJLyogQ2lzY28gSERMQy4gICovCisjZGVmaW5lIEFSUEhSRF9IRExDCUFSUEhSRF9DSVNDTworI2RlZmluZSBBUlBIUkRfTEFQQgk1MTYJCS8qIExBUEIuICAqLworI2RlZmluZSBBUlBIUkRfRERDTVAJNTE3CQkvKiBEaWdpdGFsJ3MgRERDTVAuICAqLworI2RlZmluZQlBUlBIUkRfUkFXSERMQwk1MTgJCS8qIFJhdyBIRExDLiAgKi8KKworI2RlZmluZSBBUlBIUkRfVFVOTkVMCTc2OAkJLyogSVBJUCB0dW5uZWwuICAqLworI2RlZmluZSBBUlBIUkRfVFVOTkVMNgk3NjkJCS8qIElQSVA2IHR1bm5lbC4gICovCisjZGVmaW5lIEFSUEhSRF9GUkFECTc3MCAgICAgICAgICAgICAvKiBGcmFtZSBSZWxheSBBY2Nlc3MgRGV2aWNlLiAgKi8KKyNkZWZpbmUgQVJQSFJEX1NLSVAJNzcxCQkvKiBTS0lQIHZpZi4gICovCisjZGVmaW5lIEFSUEhSRF9MT09QQkFDSwk3NzIJCS8qIExvb3BiYWNrIGRldmljZS4gICovCisjZGVmaW5lIEFSUEhSRF9MT0NBTFRMSyA3NzMJCS8qIExvY2FsdGFsayBkZXZpY2UuICAqLworI2RlZmluZSBBUlBIUkRfRkRESQk3NzQJCS8qIEZpYmVyIERpc3RyaWJ1dGVkIERhdGEgSW50ZXJmYWNlLiAqLworI2RlZmluZSBBUlBIUkRfQklGCTc3NSAgICAgICAgICAgICAvKiBBUDEwMDAgQklGLiAgKi8KKyNkZWZpbmUgQVJQSFJEX1NJVAk3NzYJCS8qIHNpdDAgZGV2aWNlIC0gSVB2Ni1pbi1JUHY0LiAgKi8KKyNkZWZpbmUgQVJQSFJEX0lQRERQCTc3NwkJLyogSVAtaW4tRERQIHR1bm5lbC4gICovCisjZGVmaW5lIEFSUEhSRF9JUEdSRQk3NzgJCS8qIEdSRSBvdmVyIElQLiAgKi8KKyNkZWZpbmUgQVJQSFJEX1BJTVJFRwk3NzkJCS8qIFBJTVNNIHJlZ2lzdGVyIGludGVyZmFjZS4gICovCisjZGVmaW5lIEFSUEhSRF9ISVBQSQk3ODAJCS8qIEhpZ2ggUGVyZm9ybWFuY2UgUGFyYWxsZWwgSSdmYWNlLiAqLworI2RlZmluZSBBUlBIUkRfQVNICTc4MQkJLyogKE5leHVzIEVsZWN0cm9uaWNzKSBBc2guICAqLworI2RlZmluZSBBUlBIUkRfRUNPTkVUCTc4MgkJLyogQWNvcm4gRWNvbmV0LiAgKi8KKyNkZWZpbmUgQVJQSFJEX0lSREEJNzgzCQkvKiBMaW51eC1JckRBLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0ZDUFAJNzg0CQkvKiBQb2ludCB0byBwb2ludCBmaWJyZWNoYW5lbC4gICovCisjZGVmaW5lIEFSUEhSRF9GQ0FMCTc4NQkJLyogRmlicmVjaGFuZWwgYXJiaXRyYXRlZCBsb29wLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0ZDUEwJNzg2CQkvKiBGaWJyZWNoYW5lbCBwdWJsaWMgbG9vcC4gICovCisjZGVmaW5lIEFSUEhSRF9GQ0ZBQlJJQyA3ODcJCS8qIEZpYnJlY2hhbmVsIGZhYnJpYy4gICovCisjZGVmaW5lIEFSUEhSRF9JRUVFODAyX1RSIDgwMAkJLyogTWFnaWMgdHlwZSBpZGVudCBmb3IgVFIuICAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMjExIDgwMQkJLyogSUVFRSA4MDIuMTEuICAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNIDgwMgkvKiBJRUVFIDgwMi4xMSArIFByaXNtMiBoZWFkZXIuICAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMjExX1JBRElPVEFQIDgwMwkvKiBJRUVFIDgwMi4xMSArIHJhZGlvdGFwIGhlYWRlci4gICovCisjZGVmaW5lIEFSUEhSRF9JRUVFODAyMTU0IDgwNAkJLyogSUVFRSA4MDIuMTUuNCBoZWFkZXIuICAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMjE1NF9QSFkgODA1CS8qIElFRUUgODAyLjE1LjQgUEhZIGhlYWRlci4gICovCisKKyNkZWZpbmUgQVJQSFJEX1ZPSUQJICAweEZGRkYJLyogVm9pZCB0eXBlLCBub3RoaW5nIGlzIGtub3duLiAgKi8KKyNkZWZpbmUgQVJQSFJEX05PTkUJICAweEZGRkUJLyogWmVybyBoZWFkZXIgbGVuZ3RoLiAgKi8KKworCisvKiBBUlAgaW9jdGwgcmVxdWVzdC4gICovCitzdHJ1Y3QgYXJwcmVxCisgIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgYXJwX3BhOwkJLyogUHJvdG9jb2wgYWRkcmVzcy4gICovCisgICAgc3RydWN0IHNvY2thZGRyIGFycF9oYTsJCS8qIEhhcmR3YXJlIGFkZHJlc3MuICAqLworICAgIGludCBhcnBfZmxhZ3M7CQkJLyogRmxhZ3MuICAqLworICAgIHN0cnVjdCBzb2NrYWRkciBhcnBfbmV0bWFzazsJLyogTmV0bWFzayAob25seSBmb3IgcHJveHkgYXJwcykuICAqLworICAgIGNoYXIgYXJwX2RldlsxNl07CisgIH07CisKK3N0cnVjdCBhcnByZXFfb2xkCisgIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgYXJwX3BhOwkJLyogUHJvdG9jb2wgYWRkcmVzcy4gICovCisgICAgc3RydWN0IHNvY2thZGRyIGFycF9oYTsJCS8qIEhhcmR3YXJlIGFkZHJlc3MuICAqLworICAgIGludCBhcnBfZmxhZ3M7CQkJLyogRmxhZ3MuICAqLworICAgIHN0cnVjdCBzb2NrYWRkciBhcnBfbmV0bWFzazsJLyogTmV0bWFzayAob25seSBmb3IgcHJveHkgYXJwcykuICAqLworICB9OworCisvKiBBUlAgRmxhZyB2YWx1ZXMuICAqLworI2RlZmluZSBBVEZfQ09NCQkweDAyCQkvKiBDb21wbGV0ZWQgZW50cnkgKGhhIHZhbGlkKS4gICovCisjZGVmaW5lCUFURl9QRVJNCTB4MDQJCS8qIFBlcm1hbmVudCBlbnRyeS4gICovCisjZGVmaW5lCUFURl9QVUJMCTB4MDgJCS8qIFB1Ymxpc2ggZW50cnkuICAqLworI2RlZmluZQlBVEZfVVNFVFJBSUxFUlMJMHgxMAkJLyogSGFzIHJlcXVlc3RlZCB0cmFpbGVycy4gICovCisjZGVmaW5lIEFURl9ORVRNQVNLICAgICAweDIwICAgICAgICAgICAgLyogV2FudCB0byB1c2UgYSBuZXRtYXNrIChvbmx5CisJCQkJCSAgIGZvciBwcm94eSBlbnRyaWVzKS4gICovCisjZGVmaW5lIEFURl9ET05UUFVCCTB4NDAJCS8qIERvbid0IGFuc3dlciB0aGlzIGFkZHJlc3Nlcy4gICovCisjZGVmaW5lIEFURl9NQUdJQwkweDgwCQkvKiBBdXRvbWF0aWNhbGx5IGFkZGVkIGVudHJ5LiAgKi8KKworCisvKiBTdXBwb3J0IGZvciB0aGUgdXNlciBzcGFjZSBhcnAgZGFlbW9uLCBhcnBkLiAgKi8KKyNkZWZpbmUgQVJQRF9VUERBVEUJMHgwMQorI2RlZmluZSBBUlBEX0xPT0tVUAkweDAyCisjZGVmaW5lIEFSUERfRkxVU0gJMHgwMworCitzdHJ1Y3QgYXJwZF9yZXF1ZXN0CisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgcmVxOwkJLyogUmVxdWVzdCB0eXBlLiAgKi8KKyAgICB1X2ludDMyX3QgaXA7CQkJLyogSVAgYWRkcmVzcyBvZiBlbnRyeS4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgZGV2OwkJLyogRGV2aWNlIGVudHJ5IGlzIHRpZWQgdG8uICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN0YW1wOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHVwZGF0ZWQ7CisgICAgdW5zaWduZWQgY2hhciBoYVtNQVhfQUREUl9MRU5dOwkvKiBIYXJkd2FyZSBhZGRyZXNzLiAgKi8KKyAgfTsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIG5ldC9pZl9hcnAuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfcGFja2V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZl9wYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTE4NGU3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfcGFja2V0LmgKQEAgLTAsMCArMSwzNyBAQAorLyogRGVmaW5pdGlvbnMgZm9yIHVzZSB3aXRoIExpbnV4IFNPQ0tfUEFDS0VUIHNvY2tldHMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19JRl9QQUNLRVRfSAorI2RlZmluZSBfX0lGX1BBQ0tFVF9ICisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvc29ja2FkZHIuaD4KKworLyogVGhpcyBpcyB0aGUgU09DS19QQUNLRVQgYWRkcmVzcyBzdHJ1Y3R1cmUgYXMgdXNlZCBpbiBMaW51eCAyLjAuCisgICBGcm9tIExpbnV4IDIuMSB0aGUgQUZfUEFDS0VUIGludGVyZmFjZSBpcyBwcmVmZXJyZWQgYW5kIHlvdSBzaG91bGQKKyAgIGNvbnNpZGVyIHVzaW5nIGl0IGluIHBsYWNlIG9mIHRoaXMgb25lLiAgKi8KKworc3RydWN0IHNvY2thZGRyX3BrdAorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHNwa3RfKTsKKyAgICB1bnNpZ25lZCBjaGFyIHNwa3RfZGV2aWNlWzE0XTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzcGt0X3Byb3RvY29sOworICB9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3BwcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfcHBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1ZWM4MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3BwcC5oCkBAIC0wLDAgKzEsMTY5IEBACisvKglGcm9tOiBpZl9wcHAuaCx2IDEuMyAxOTk1LzA2LzEyIDExOjM2OjUwIHBhdWx1cyBFeHAgKi8KKworLyoKKyAqIGlmX3BwcC5oIC0gUG9pbnQtdG8tUG9pbnQgUHJvdG9jb2wgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiAKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQU5ECisgKiBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgVU5JVkVSU0lUWSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvKgorICogID09RklMRVZFUlNJT04gOTYwOTI2PT0KKyAqCisgKiAgTk9URSBUTyBNQUlOVEFJTkVSUzoKKyAqICAgICBJZiB5b3UgbW9kaWZ5IHRoaXMgZmlsZSBhdCBhbGwsIHBsZWFzZSBzZXQgdGhlIGFib3ZlIGRhdGUuCisgKiAgICAgaWZfcHBwLmggaXMgc2hpcHBlZCB3aXRoIGEgUFBQIGRpc3RyaWJ1dGlvbiBhcyB3ZWxsIGFzIHdpdGggdGhlIGtlcm5lbDsKKyAqICAgICBpZiBldmVyeW9uZSBpbmNyZWFzZXMgdGhlIEZJTEVWRVJTSU9OIG51bWJlciBhYm92ZSwgdGhlbiBzY3JpcHRzCisgKiAgICAgY2FuIGRvIHRoZSByaWdodCB0aGluZyB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gaW5zdGFsbCBhIG5ldyBpZl9wcHAuaAorICogICAgIGZpbGUuICBEb24ndCBjaGFuZ2UgdGhlIGZvcm1hdCBvZiB0aGF0IGxpbmUgb3RoZXJ3aXNlLCBzbyB0aGUKKyAqICAgICBpbnN0YWxsYXRpb24gc2NyaXB0IGNhbiByZWNvZ25pemUgaXQuCisgKi8KKworCisjaWZuZGVmIF9fTkVUX0lGX1BQUF9ICisjZGVmaW5lIF9fTkVUX0lGX1BQUF9IIDEKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8bmV0L3BwcF9kZWZzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIFBhY2tldCBzaXplcworICovCisKKyNkZWZpbmUJUFBQX01UVQkJMTUwMAkvKiBEZWZhdWx0IE1UVSAoc2l6ZSBvZiBJbmZvIGZpZWxkKSAqLworI2RlZmluZSBQUFBfTUFYTVJVCTY1MDAwCS8qIExhcmdlc3QgTVJVIHdlIGFsbG93ICovCisjZGVmaW5lIFBQUF9WRVJTSU9OCSIyLjIuMCIKKyNkZWZpbmUgUFBQX01BR0lDCTB4NTAwMgkvKiBNYWdpYyB2YWx1ZSBmb3IgdGhlIHBwcCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgUFJPVE9fSVBYCTB4MDAyYgkvKiBwcm90b2NvbCBudW1iZXJzICovCisjZGVmaW5lIFBST1RPX0ROQV9SVCAgICAweDAwMjcgIC8qIEROQSBSb3V0aW5nICovCisKKworLyoKKyAqIEJpdCBkZWZpbml0aW9ucyBmb3IgZmxhZ3MuCisgKi8KKworI2RlZmluZSBTQ19DT01QX1BST1QJMHgwMDAwMDAwMQkvKiBwcm90b2NvbCBjb21wcmVzc2lvbiAob3V0cHV0KSAqLworI2RlZmluZSBTQ19DT01QX0FDCTB4MDAwMDAwMDIJLyogaGVhZGVyIGNvbXByZXNzaW9uIChvdXRwdXQpICovCisjZGVmaW5lCVNDX0NPTVBfVENQCTB4MDAwMDAwMDQJLyogVENQIChWSikgY29tcHJlc3Npb24gKG91dHB1dCkgKi8KKyNkZWZpbmUgU0NfTk9fVENQX0NDSUQJMHgwMDAwMDAwOAkvKiBkaXNhYmxlIFZKIGNvbm5lY3Rpb24taWQgY29tcC4gKi8KKyNkZWZpbmUgU0NfUkVKX0NPTVBfQUMJMHgwMDAwMDAxMAkvKiByZWplY3QgYWRycy9jdHJsIGNvbXAuIG9uIGlucHV0ICovCisjZGVmaW5lIFNDX1JFSl9DT01QX1RDUAkweDAwMDAwMDIwCS8qIHJlamVjdCBUQ1AgKFZKKSBjb21wLiBvbiBpbnB1dCAqLworI2RlZmluZSBTQ19DQ1BfT1BFTgkweDAwMDAwMDQwCS8qIExvb2sgYXQgQ0NQIHBhY2tldHMgKi8KKyNkZWZpbmUgU0NfQ0NQX1VQCTB4MDAwMDAwODAJLyogTWF5IHNlbmQvcmVjdiBjb21wcmVzc2VkIHBhY2tldHMgKi8KKyNkZWZpbmUgU0NfRU5BQkxFX0lQCTB4MDAwMDAxMDAJLyogSVAgcGFja2V0cyBtYXkgYmUgZXhjaGFuZ2VkICovCisjZGVmaW5lIFNDX0NPTVBfUlVOCTB4MDAwMDEwMDAJLyogY29tcHJlc3NvciBoYXMgYmVlbiBpbml0ZWQgKi8KKyNkZWZpbmUgU0NfREVDT01QX1JVTgkweDAwMDAyMDAwCS8qIGRlY29tcHJlc3NvciBoYXMgYmVlbiBpbml0ZWQgKi8KKyNkZWZpbmUgU0NfREVCVUcJMHgwMDAxMDAwMAkvKiBlbmFibGUgZGVidWcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgU0NfTE9HX0lOUEtUCTB4MDAwMjAwMDAJLyogbG9nIGNvbnRlbnRzIG9mIGdvb2QgcGt0cyByZWN2ZCAqLworI2RlZmluZSBTQ19MT0dfT1VUUEtUCTB4MDAwNDAwMDAJLyogbG9nIGNvbnRlbnRzIG9mIHBrdHMgc2VudCAqLworI2RlZmluZSBTQ19MT0dfUkFXSU4JMHgwMDA4MDAwMAkvKiBsb2cgYWxsIGNoYXJzIHJlY2VpdmVkICovCisjZGVmaW5lIFNDX0xPR19GTFVTSAkweDAwMTAwMDAwCS8qIGxvZyBhbGwgY2hhcnMgZmx1c2hlZCAqLworI2RlZmluZQlTQ19NQVNLCQkweDBmRTBmZmZmCS8qIGJpdHMgdGhhdCB1c2VyIGNhbiBjaGFuZ2UgKi8KKworLyogc3RhdGUgYml0cyAqLworI2RlZmluZQlTQ19FU0NBUEVECTB4ODAwMDAwMDAJLyogc2F3IGEgUFBQX0VTQ0FQRSAqLworI2RlZmluZQlTQ19GTFVTSAkweDQwMDAwMDAwCS8qIGZsdXNoIGlucHV0IHVudGlsIG5leHQgUFBQX0ZMQUcgKi8KKyNkZWZpbmUgU0NfVkpfUkVTRVQJMHgyMDAwMDAwMAkvKiBOZWVkIHRvIHJlc2V0IHRoZSBWSiBkZWNvbXByZXNzb3IgKi8KKyNkZWZpbmUgU0NfWE1JVF9CVVNZCTB4MTAwMDAwMDAJLyogcHBwX3dyaXRlX3dha2V1cCBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgU0NfUkNWX09ERFAJMHgwODAwMDAwMAkvKiBoYXZlIHJjdmQgY2hhciB3aXRoIG9kZCBwYXJpdHkgKi8KKyNkZWZpbmUgU0NfUkNWX0VWTlAJMHgwNDAwMDAwMAkvKiBoYXZlIHJjdmQgY2hhciB3aXRoIGV2ZW4gcGFyaXR5ICovCisjZGVmaW5lIFNDX1JDVl9CN18xCTB4MDIwMDAwMDAJLyogaGF2ZSByY3ZkIGNoYXIgd2l0aCBiaXQgNyA9IDEgKi8KKyNkZWZpbmUgU0NfUkNWX0I3XzAJMHgwMTAwMDAwMAkvKiBoYXZlIHJjdmQgY2hhciB3aXRoIGJpdCA3ID0gMCAqLworI2RlZmluZSBTQ19EQ19GRVJST1IJMHgwMDgwMDAwMAkvKiBmYXRhbCBkZWNvbXAgZXJyb3IgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgU0NfRENfRVJST1IJMHgwMDQwMDAwMAkvKiBub24tZmF0YWwgZGVjb21wIGVycm9yIGRldGVjdGVkICovCisKKy8qCisgKiBJb2N0bCBkZWZpbml0aW9ucy4KKyAqLworCitzdHJ1Y3QgbnBpb2N0bCB7CisgICAgaW50CQlwcm90b2NvbDsJLyogUFBQIHByb3RvY29sLCBlLmcuIFBQUF9JUCAqLworICAgIGVudW0gTlBtb2RlCW1vZGU7Cit9OworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIENDUCBjb25maWd1cmF0aW9uIG9wdGlvbiwgZm9yIFBQUElPQ1NDT01QUkVTUyAqLworc3RydWN0IHBwcF9vcHRpb25fZGF0YSB7CisJdV9pbnQ4X3QgICpwdHI7CisJdV9pbnQzMl90IGxlbmd0aDsKKwlpbnQJICB0cmFuc21pdDsKK307CisKK3N0cnVjdCBpZnBwcHN0YXRzcmVxIHsKKyAgc3RydWN0IGlmcmVxCSAgIGI7CisgIHN0cnVjdCBwcHBfc3RhdHMgc3RhdHM7CQkJLyogc3RhdGlzdGljIGluZm9ybWF0aW9uICovCit9OworCitzdHJ1Y3QgaWZwcHBjc3RhdHNyZXEgeworICBzdHJ1Y3QgaWZyZXEJCWI7CisgIHN0cnVjdCBwcHBfY29tcF9zdGF0cyBzdGF0czsKK307CisKKyNkZWZpbmUgaWZyX19uYW1lICAgICAgIGIuaWZyX2lmcm4uaWZybl9uYW1lCisjZGVmaW5lIHN0YXRzX3B0ciAgICAgICBiLmlmcl9pZnJ1LmlmcnVfZGF0YQorCisvKgorICogSW9jdGwgZGVmaW5pdGlvbnMuCisgKi8KKworI2RlZmluZQlQUFBJT0NHRkxBR1MJX0lPUigndCcsIDkwLCBpbnQpCS8qIGdldCBjb25maWd1cmF0aW9uIGZsYWdzICovCisjZGVmaW5lCVBQUElPQ1NGTEFHUwlfSU9XKCd0JywgODksIGludCkJLyogc2V0IGNvbmZpZ3VyYXRpb24gZmxhZ3MgKi8KKyNkZWZpbmUJUFBQSU9DR0FTWU5DTUFQCV9JT1IoJ3QnLCA4OCwgaW50KQkvKiBnZXQgYXN5bmMgbWFwICovCisjZGVmaW5lCVBQUElPQ1NBU1lOQ01BUAlfSU9XKCd0JywgODcsIGludCkJLyogc2V0IGFzeW5jIG1hcCAqLworI2RlZmluZQlQUFBJT0NHVU5JVAlfSU9SKCd0JywgODYsIGludCkJLyogZ2V0IHBwcCB1bml0IG51bWJlciAqLworI2RlZmluZQlQUFBJT0NHUkFTWU5DTUFQIF9JT1IoJ3QnLCA4NSwgaW50KQkvKiBnZXQgcmVjZWl2ZSBhc3luYyBtYXAgKi8KKyNkZWZpbmUJUFBQSU9DU1JBU1lOQ01BUCBfSU9XKCd0JywgODQsIGludCkJLyogc2V0IHJlY2VpdmUgYXN5bmMgbWFwICovCisjZGVmaW5lCVBQUElPQ0dNUlUJX0lPUigndCcsIDgzLCBpbnQpCS8qIGdldCBtYXggcmVjZWl2ZSB1bml0ICovCisjZGVmaW5lCVBQUElPQ1NNUlUJX0lPVygndCcsIDgyLCBpbnQpCS8qIHNldCBtYXggcmVjZWl2ZSB1bml0ICovCisjZGVmaW5lCVBQUElPQ1NNQVhDSUQJX0lPVygndCcsIDgxLCBpbnQpCS8qIHNldCBWSiBtYXggc2xvdCBJRCAqLworI2RlZmluZSBQUFBJT0NHWEFTWU5DTUFQIF9JT1IoJ3QnLCA4MCwgZXh0X2FjY20pIC8qIGdldCBleHRlbmRlZCBBQ0NNICovCisjZGVmaW5lIFBQUElPQ1NYQVNZTkNNQVAgX0lPVygndCcsIDc5LCBleHRfYWNjbSkgLyogc2V0IGV4dGVuZGVkIEFDQ00gKi8KKyNkZWZpbmUgUFBQSU9DWEZFUlVOSVQJX0lPKCd0JywgNzgpCQkvKiB0cmFuc2ZlciBQUFAgdW5pdCAqLworI2RlZmluZSBQUFBJT0NTQ09NUFJFU1MJX0lPVygndCcsIDc3LCBzdHJ1Y3QgcHBwX29wdGlvbl9kYXRhKQorI2RlZmluZSBQUFBJT0NHTlBNT0RFCV9JT1dSKCd0JywgNzYsIHN0cnVjdCBucGlvY3RsKSAvKiBnZXQgTlAgbW9kZSAqLworI2RlZmluZSBQUFBJT0NTTlBNT0RFCV9JT1coJ3QnLCA3NSwgc3RydWN0IG5waW9jdGwpICAvKiBzZXQgTlAgbW9kZSAqLworI2RlZmluZSBQUFBJT0NHREVCVUcJX0lPUigndCcsIDY1LCBpbnQpCS8qIFJlYWQgZGVidWcgbGV2ZWwgKi8KKyNkZWZpbmUgUFBQSU9DU0RFQlVHCV9JT1coJ3QnLCA2NCwgaW50KQkvKiBTZXQgZGVidWcgbGV2ZWwgKi8KKyNkZWZpbmUgUFBQSU9DR0lETEUJX0lPUigndCcsIDYzLCBzdHJ1Y3QgcHBwX2lkbGUpIC8qIGdldCBpZGxlIHRpbWUgKi8KKworI2RlZmluZSBTSU9DR1BQUFNUQVRTICAgKFNJT0NERVZQUklWQVRFICsgMCkKKyNkZWZpbmUgU0lPQ0dQUFBWRVIgICAgIChTSU9DREVWUFJJVkFURSArIDEpICAvKiBORVZFUiBjaGFuZ2UgdGhpcyEhICovCisjZGVmaW5lIFNJT0NHUFBQQ1NUQVRTICAoU0lPQ0RFVlBSSVZBVEUgKyAyKQorCisjaWYgIWRlZmluZWQoaWZyX210dSkKKyNkZWZpbmUgaWZyX210dQlpZnJfaWZydS5pZnJ1X21ldHJpYworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBuZXQvaWZfcHBwLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3NoYXBlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfc2hhcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2MGFmMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3NoYXBlci5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUX0lGX1NIQVBFUl9ICisjZGVmaW5lIF9ORVRfSUZfU0hBUEVSX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworX19CRUdJTl9ERUNMUworCisjZGVmaW5lIFNIQVBFUl9RTEVOCTEwCisvKgorICoJVGhpcyBpcyBhIGJpdCBzcGVlZCBkZXBlbmRhbnQgKHJlYWQgaXQgc2hvdWxkbnQgYmUgYSBjb25zdGFudCEpCisgKgorICoJNSBpcyBhYm91dCByaWdodCBmb3IgMjguOCB1cHdhcmRzLiBCZWxvdyB0aGF0IGRvdWJsZSBmb3IgZXZlcnkKKyAqCWhhbHZpbmcgb2Ygc3BlZWQgb3Igc28uIC0gaWUgYWJvdXQgMjAgZm9yIDk2MDAgYmF1ZC4KKyAqLworI2RlZmluZSBTSEFQRVJfTEFURU5DWQkoNSAqIEhaKQorI2RlZmluZSBTSEFQRVJfTUFYU0xJUAkyCisjZGVmaW5lIFNIQVBFUl9CVVJTVAkoSFogLyA1MCkJLyogR29vZCBmb3IgPjEyOEsgdGhlbiAqLworCisjZGVmaW5lIFNIQVBFUl9TRVRfREVWCQkweDAwMDEKKyNkZWZpbmUgU0hBUEVSX1NFVF9TUEVFRAkweDAwMDIKKyNkZWZpbmUgU0hBUEVSX0dFVF9ERVYJCTB4MDAwMworI2RlZmluZSBTSEFQRVJfR0VUX1NQRUVECTB4MDAwNAorCitzdHJ1Y3Qgc2hhcGVyY29uZgoreworICB1X2ludDE2X3Qgc3NfY21kOworICB1bmlvbgorICB7CisgICAgY2hhciBzc3VfbmFtZVsxNF07CisgICAgdV9pbnQzMl90IHNzdV9zcGVlZDsKKyAgfSBzc191OworI2RlZmluZSBzc19zcGVlZCBzc191LnNzdV9zcGVlZAorI2RlZmluZSBzc19uYW1lIHNzX3Uuc3N1X25hbWUKK307CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBuZXQvaWZfc2hhcGVyLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3NsaXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3NsaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmJkN2YzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfc2xpcC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUX0lGX1NMSVBfSAorI2RlZmluZSBfTkVUX0lGX1NMSVBfSCAxCisKKy8qIFdlIGNhbiB1c2UgdGhlIGtlcm5lbCBoZWFkZXIuICAqLworI2luY2x1ZGUgPGxpbnV4L2lmX3NsaXAuaD4KKworI2VuZGlmCS8qIG5ldC9pZl9zbGlwLmguICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvcHBwLWNvbXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L3BwcC1jb21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5OTJkNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L3BwcC1jb21wLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGxpbnV4L3BwcC1jb21wLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9wcHBfZGVmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvcHBwX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODkyNGM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvcHBwX2RlZnMuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9ORVRfUFBQX0RFRlNfSAorI2RlZmluZSBfTkVUX1BQUF9ERUZTX0ggMQorCisjZGVmaW5lIF9fbmVlZF90aW1lX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgorCisjZW5kaWYgLyogbmV0L3BwcF9kZWZzLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L3JvdXRlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9yb3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNWM4MTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9yb3V0ZS5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIEJhc2VkIG9uIHRoZSA0LjRCU0QgYW5kIExpbnV4IHZlcnNpb24gb2YgdGhpcyBmaWxlLiAgKi8KKworI2lmbmRlZiBfTkVUX1JPVVRFX0gKKyNkZWZpbmUgX05FVF9ST1VURV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKworLyogVGhpcyBzdHJ1Y3R1cmUgZ2V0cyBwYXNzZWQgYnkgdGhlIFNJT0NBRERSVCBhbmQgU0lPQ0RFTFJUIGNhbGxzLiAqLworc3RydWN0IHJ0ZW50cnkKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IHJ0X3BhZDE7CisgICAgc3RydWN0IHNvY2thZGRyIHJ0X2RzdDsJCS8qIFRhcmdldCBhZGRyZXNzLiAgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHIgcnRfZ2F0ZXdheTsJCS8qIEdhdGV3YXkgYWRkciAoUlRGX0dBVEVXQVkpLiAgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHIgcnRfZ2VubWFzazsJCS8qIFRhcmdldCBuZXR3b3JrIG1hc2sgKElQKS4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IHJ0X2ZsYWdzOworICAgIHNob3J0IGludCBydF9wYWQyOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHJ0X3BhZDM7CisgICAgdW5zaWduZWQgY2hhciBydF90b3M7CisgICAgdW5zaWduZWQgY2hhciBydF9jbGFzczsKKyNpZiBfX1dPUkRTSVpFID09IDY0CisgICAgc2hvcnQgaW50IHJ0X3BhZDRbM107CisjZWxzZQorICAgIHNob3J0IGludCBydF9wYWQ0OworI2VuZGlmCisgICAgc2hvcnQgaW50IHJ0X21ldHJpYzsJCS8qICsxIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSEgICovCisgICAgY2hhciAqcnRfZGV2OwkJCS8qIEZvcmNpbmcgdGhlIGRldmljZSBhdCBhZGQuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHJ0X210dTsJCS8qIFBlciByb3V0ZSBNVFUvV2luZG93LiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBydF93aW5kb3c7CS8qIFdpbmRvdyBjbGFtcGluZy4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IHJ0X2lydHQ7CQkvKiBJbml0aWFsIFJUVC4gICovCisgIH07CisvKiBDb21wYXRpYmlsaXR5IGhhY2suICAqLworI2RlZmluZSBydF9tc3MJcnRfbXR1CisKKworc3RydWN0IGluNl9ydG1zZworICB7CisgICAgc3RydWN0IGluNl9hZGRyIHJ0bXNnX2RzdDsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgcnRtc2dfc3JjOworICAgIHN0cnVjdCBpbjZfYWRkciBydG1zZ19nYXRld2F5OworICAgIHVfaW50MzJfdCBydG1zZ190eXBlOworICAgIHVfaW50MTZfdCBydG1zZ19kc3RfbGVuOworICAgIHVfaW50MTZfdCBydG1zZ19zcmNfbGVuOworICAgIHVfaW50MzJfdCBydG1zZ19tZXRyaWM7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgcnRtc2dfaW5mbzsKKyAgICB1X2ludDMyX3QgcnRtc2dfZmxhZ3M7CisgICAgaW50IHJ0bXNnX2lmaW5kZXg7CisgIH07CisKKworI2RlZmluZQlSVEZfVVAJCTB4MDAwMQkJLyogUm91dGUgdXNhYmxlLiAgKi8KKyNkZWZpbmUJUlRGX0dBVEVXQVkJMHgwMDAyCQkvKiBEZXN0aW5hdGlvbiBpcyBhIGdhdGV3YXkuICAqLworCisjZGVmaW5lCVJURl9IT1NUCTB4MDAwNAkJLyogSG9zdCBlbnRyeSAobmV0IG90aGVyd2lzZSkuICAqLworI2RlZmluZSBSVEZfUkVJTlNUQVRFCTB4MDAwOAkJLyogUmVpbnN0YXRlIHJvdXRlIGFmdGVyIHRpbWVvdXQuICAqLworI2RlZmluZQlSVEZfRFlOQU1JQwkweDAwMTAJCS8qIENyZWF0ZWQgZHluLiAoYnkgcmVkaXJlY3QpLiAgKi8KKyNkZWZpbmUJUlRGX01PRElGSUVECTB4MDAyMAkJLyogTW9kaWZpZWQgZHluLiAoYnkgcmVkaXJlY3QpLiAgKi8KKyNkZWZpbmUgUlRGX01UVQkJMHgwMDQwCQkvKiBTcGVjaWZpYyBNVFUgZm9yIHRoaXMgcm91dGUuICAqLworI2RlZmluZSBSVEZfTVNTCQlSVEZfTVRVCQkvKiBDb21wYXRpYmlsaXR5LiAgKi8KKyNkZWZpbmUgUlRGX1dJTkRPVwkweDAwODAJCS8qIFBlciByb3V0ZSB3aW5kb3cgY2xhbXBpbmcuICAqLworI2RlZmluZSBSVEZfSVJUVAkweDAxMDAJCS8qIEluaXRpYWwgcm91bmQgdHJpcCB0aW1lLiAgKi8KKyNkZWZpbmUgUlRGX1JFSkVDVAkweDAyMDAJCS8qIFJlamVjdCByb3V0ZS4gICovCisjZGVmaW5lCVJURl9TVEFUSUMJMHgwNDAwCQkvKiBNYW51YWxseSBpbmplY3RlZCByb3V0ZS4gICovCisjZGVmaW5lCVJURl9YUkVTT0xWRQkweDA4MDAJCS8qIEV4dGVybmFsIHJlc29sdmVyLiAgKi8KKyNkZWZpbmUgUlRGX05PRk9SV0FSRCAgIDB4MTAwMAkJLyogRm9yd2FyZGluZyBpbmhpYml0ZWQuICAqLworI2RlZmluZSBSVEZfVEhST1cJMHgyMDAwCQkvKiBHbyB0byBuZXh0IGNsYXNzLiAgKi8KKyNkZWZpbmUgUlRGX05PUE1UVURJU0MgIDB4NDAwMAkJLyogRG8gbm90IHNlbmQgcGFja2V0cyB3aXRoIERGLiAgKi8KKworLyogZm9yIElQdjYgKi8KKyNkZWZpbmUgUlRGX0RFRkFVTFQJMHgwMDAxMDAwMAkvKiBkZWZhdWx0IC0gbGVhcm5lZCB2aWEgTkQJKi8KKyNkZWZpbmUgUlRGX0FMTE9OTElOSwkweDAwMDIwMDAwCS8qIGZhbGxiYWNrLCBubyByb3V0ZXJzIG9uIGxpbmsJKi8KKyNkZWZpbmUgUlRGX0FERFJDT05GCTB4MDAwNDAwMDAJLyogYWRkcmNvbmYgcm91dGUgLSBSQQkJKi8KKworI2RlZmluZSBSVEZfTElOS1JUCTB4MDAxMDAwMDAJLyogbGluayBzcGVjaWZpYyAtIGRldmljZSBtYXRjaAkqLworI2RlZmluZSBSVEZfTk9ORVhUSE9QCTB4MDAyMDAwMDAJLyogcm91dGUgd2l0aCBubyBuZXh0aG9wCSovCisKKyNkZWZpbmUgUlRGX0NBQ0hFCTB4MDEwMDAwMDAJLyogY2FjaGUgZW50cnkJCQkqLworI2RlZmluZSBSVEZfRkxPVwkweDAyMDAwMDAwCS8qIGZsb3cgc2lnbmlmaWNhbnQgcm91dGUJKi8KKyNkZWZpbmUgUlRGX1BPTElDWQkweDA0MDAwMDAwCS8qIHBvbGljeSByb3V0ZQkJCSovCisKKyNkZWZpbmUgUlRDRl9WQUxWRQkweDAwMjAwMDAwCisjZGVmaW5lIFJUQ0ZfTUFTUQkweDAwNDAwMDAwCisjZGVmaW5lIFJUQ0ZfTkFUCTB4MDA4MDAwMDAKKyNkZWZpbmUgUlRDRl9ET1JFRElSRUNUIDB4MDEwMDAwMDAKKyNkZWZpbmUgUlRDRl9MT0cJMHgwMjAwMDAwMAorI2RlZmluZSBSVENGX0RJUkVDVFNSQwkweDA0MDAwMDAwCisKKyNkZWZpbmUgUlRGX0xPQ0FMCTB4ODAwMDAwMDAKKyNkZWZpbmUgUlRGX0lOVEVSRkFDRQkweDQwMDAwMDAwCisjZGVmaW5lIFJURl9NVUxUSUNBU1QJMHgyMDAwMDAwMAorI2RlZmluZSBSVEZfQlJPQURDQVNUCTB4MTAwMDAwMDAKKyNkZWZpbmUgUlRGX05BVAkJMHgwODAwMDAwMAorCisjZGVmaW5lIFJURl9BRERSQ0xBU1NNQVNLCTB4RjgwMDAwMDAKKyNkZWZpbmUgUlRfQUREUkNMQVNTKGZsYWdzKQkoKF9fdV9pbnQzMl90KSBmbGFncyA+PiAyMykKKworI2RlZmluZSBSVF9UT1ModG9zKQkJKCh0b3MpICYgSVBUT1NfVE9TX01BU0spCisKKyNkZWZpbmUgUlRfTE9DQUxBRERSKGZsYWdzKQkoKGZsYWdzICYgUlRGX0FERFJDTEFTU01BU0spIFwKKwkJCQkgPT0gKFJURl9MT0NBTHxSVEZfSU5URVJGQUNFKSkKKworI2RlZmluZSBSVF9DTEFTU19VTlNQRUMJCTAKKyNkZWZpbmUgUlRfQ0xBU1NfREVGQVVMVAkyNTMKKworI2RlZmluZSBSVF9DTEFTU19NQUlOCQkyNTQKKyNkZWZpbmUgUlRfQ0xBU1NfTE9DQUwJCTI1NQorI2RlZmluZSBSVF9DTEFTU19NQVgJCTI1NQorCisKKyNkZWZpbmUgUlRNU0dfQUNLCQlOTE1TR19BQ0sKKyNkZWZpbmUgUlRNU0dfT1ZFUlJVTgkJTkxNU0dfT1ZFUlJVTgorCisjZGVmaW5lIFJUTVNHX05FV0RFVklDRQkJMHgxMQorI2RlZmluZSBSVE1TR19ERUxERVZJQ0UJCTB4MTIKKyNkZWZpbmUgUlRNU0dfTkVXUk9VVEUJCTB4MjEKKyNkZWZpbmUgUlRNU0dfREVMUk9VVEUJCTB4MjIKKyNkZWZpbmUgUlRNU0dfTkVXUlVMRQkJMHgzMQorI2RlZmluZSBSVE1TR19ERUxSVUxFCQkweDMyCisjZGVmaW5lIFJUTVNHX0NPTlRST0wJCTB4NDAKKworI2RlZmluZSBSVE1TR19BUl9GQUlMRUQJCTB4NTEJLyogQWRkcmVzcyBSZXNvbHV0aW9uIGZhaWxlZC4gICovCisKKyNlbmRpZiAvKiBuZXQvcm91dGUuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRhc2gvYXNoLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGFzaC9hc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTJjMGFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRhc2gvYXNoLmgKQEAgLTAsMCArMSw0MCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIHVzZSB3aXRoIExpbnV4IEFGX0FTSCBzb2NrZXRzLgorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ORVRBU0hfQVNIX0gKKyNkZWZpbmUgX05FVEFTSF9BU0hfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvc29ja2FkZHIuaD4KKworc3RydWN0IHNvY2thZGRyX2FzaAorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHNhc2hfKTsJCS8qIENvbW1vbiBkYXRhOiBhZGRyZXNzIGZhbWlseSBldGMuICAqLworICAgIGludCBzYXNoX2lmaW5kZXg7CQkJLyogSW50ZXJmYWNlIHRvIHVzZS4gICovCisgICAgdW5zaWduZWQgY2hhciBzYXNoX2NoYW5uZWw7CQkvKiBSZWFsdGltZSBvciBjb250cm9sLiAgKi8KKyAgICB1bnNpZ25lZCBpbnQgc2FzaF9wbGVuOworICAgIHVuc2lnbmVkIGNoYXIgc2FzaF9wcmVmaXhbMTZdOworICB9OworCisvKiBWYWx1ZXMgZm9yIGBjaGFubmVsJyBtZW1iZXIuICAqLworI2RlZmluZSBBU0hfQ0hBTk5FTF9BTlkJCTAKKyNkZWZpbmUgQVNIX0NIQU5ORUxfQ09OVFJPTAkxCisjZGVmaW5lIEFTSF9DSEFOTkVMX1JFQUxUSU1FCTIKKworI2VuZGlmCS8qIG5ldGFzaC9hc2guaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRhdGFsay9hdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRhdGFsay9hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjhmYzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGF0YWxrL2F0LmgKQEAgLTAsMCArMSwzMCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk1LCAxOTk2LCAxOTk3LCAyMDA0CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUQVRBTEtfQVRfSAorI2RlZmluZSBfTkVUQVRBTEtfQVRfSCAxCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3NvY2thZGRyLmg+CisjaW5jbHVkZSA8bGludXgvYXRhbGsuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNkZWZpbmUgU09MX0FUQUxLICAgICAgIDI1OCAgICAgLyogc29ja29wdCBsZXZlbCBmb3IgYXRhbGsgKi8KKworI2VuZGlmCS8qIG5ldGF0YWxrL2F0LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0YXgyNS9heDI1LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGF4MjUvYXgyNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlM2M3YWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGF4MjUvYXgyNS5oCkBAIC0wLDAgKzEsMTcxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVEFYMjVfQVgyNV9ICisjZGVmaW5lIF9ORVRBWDI1X0FYMjVfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvc29ja2FkZHIuaD4KKworLyogU2V0c29ja29wdGlvbnMoMikgbGV2ZWwuICBUaGFua3MgdG8gQlNEIHRoZXNlIG11c3QgbWF0Y2ggSVBQUk9UT194eHguICAqLworI2RlZmluZSBTT0xfQVgyNQkyNTcKKworLyogQVguMjUgZmxhZ3M6ICovCisjZGVmaW5lIEFYMjVfV0lORE9XCTEKKyNkZWZpbmUgQVgyNV9UMQkJMgorI2RlZmluZSBBWDI1X1QyCQk1CisjZGVmaW5lIEFYMjVfVDMJCTQKKyNkZWZpbmUgQVgyNV9OMgkJMworI2RlZmluZSBBWDI1X0JBQ0tPRkYJNgorI2RlZmluZSBBWDI1X0VYVFNFUQk3CisjZGVmaW5lIEFYMjVfUElESU5DTAk4CisjZGVmaW5lIEFYMjVfSURMRQk5CisjZGVmaW5lCUFYMjVfUEFDTEVOCTEwCisjZGVmaW5lIEFYMjVfSVBNQVhRVUVVRSAxMQorI2RlZmluZSBBWDI1X0lBTURJR0kJMTIKKyNkZWZpbmUgQVgyNV9LSUxMCTk5CisKKy8qIEFYLjI1IHNvY2tldCBpb2N0bHM6ICovCisjZGVmaW5lIFNJT0NBWDI1R0VUVUlECQkoU0lPQ1BST1RPUFJJVkFURSkKKyNkZWZpbmUgU0lPQ0FYMjVBRERVSUQJCShTSU9DUFJPVE9QUklWQVRFKzEpCisjZGVmaW5lIFNJT0NBWDI1REVMVUlECQkoU0lPQ1BST1RPUFJJVkFURSsyKQorI2RlZmluZSBTSU9DQVgyNU5PVUlECQkoU0lPQ1BST1RPUFJJVkFURSszKQorI2RlZmluZSBTSU9DQVgyNUJQUUFERFIJCShTSU9DUFJPVE9QUklWQVRFKzQpCisjZGVmaW5lIFNJT0NBWDI1R0VUUEFSTVMJKFNJT0NQUk9UT1BSSVZBVEUrNSkKKyNkZWZpbmUgU0lPQ0FYMjVTRVRQQVJNUwkoU0lPQ1BST1RPUFJJVkFURSs2KQorI2RlZmluZSBTSU9DQVgyNU9QVFJUCQkoU0lPQ1BST1RPUFJJVkFURSs3KQorI2RlZmluZSBTSU9DQVgyNUNUTENPTgkJKFNJT0NQUk9UT1BSSVZBVEUrOCkKKyNkZWZpbmUgU0lPQ0FYMjVHRVRJTkZPCQkoU0lPQ1BST1RPUFJJVkFURSs5KQorI2RlZmluZSBTSU9DQVgyNUFEREZXRAkJKFNJT0NQUk9UT1BSSVZBVEUrMTApCisjZGVmaW5lIFNJT0NBWDI1REVMRldECQkoU0lPQ1BST1RPUFJJVkFURSsxMSkKKworLyogdW5rbm93bjogKi8KKyNkZWZpbmUgQVgyNV9OT1VJRF9ERUZBVUxUCTAKKyNkZWZpbmUgQVgyNV9OT1VJRF9CTE9DSwkxCisjZGVmaW5lIEFYMjVfU0VUX1JUX0lQTU9ERQkyCisKKy8qIERpZ2lwZWF0aW5nIGZsYWdzOiAqLworI2RlZmluZSBBWDI1X0RJR0lfSU5CQU5ECTB4MDEJLyogQWxsb3cgZGlnaXBlYXRpbmcgd2l0aGluIHBvcnQgKi8KKyNkZWZpbmUgQVgyNV9ESUdJX1hCQU5ECQkweDAyCS8qIEFsbG93IGRpZ2lwZWF0aW5nIGFjcm9zcyBwb3J0cyAqLworCisvKiBNYXhpbWltIG51bWJlciBvZiBkaWdpcGVhdGVyczogKi8KKyNkZWZpbmUgQVgyNV9NQVhfRElHSVMgOAorCisKK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBjaGFyIGF4MjVfY2FsbFs3XTsJCS8qIDYgY2FsbCArIFNTSUQgKHNoaWZ0ZWQgYXNjaWkpICovCisgIH0KK2F4MjVfYWRkcmVzczsKKworc3RydWN0IHNvY2thZGRyX2F4MjUKKyAgeworICAgIHNhX2ZhbWlseV90IHNheDI1X2ZhbWlseTsKKyAgICBheDI1X2FkZHJlc3Mgc2F4MjVfY2FsbDsKKyAgICBpbnQgc2F4MjVfbmRpZ2lzOworICB9OworCisvKgorICogVGhlIHNvY2thZGRyIHN0cnVjdCB3aXRoIHRoZSBkaWdpcGVhdGVyIGFkcmVzc2VzOgorICovCitzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9heDI1CisgIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfYXgyNSBmc2FfYXgyNTsKKyAgICBheDI1X2FkZHJlc3MgZnNhX2RpZ2lwZWF0ZXJbQVgyNV9NQVhfRElHSVNdOworICB9OworI2RlZmluZSBzYXgyNV91aWQJc2F4MjVfbmRpZ2lzCisKK3N0cnVjdCBheDI1X3JvdXRlc19zdHJ1Y3QKKyAgeworICAgIGF4MjVfYWRkcmVzcyBwb3J0X2FkZHI7CisgICAgYXgyNV9hZGRyZXNzIGRlc3RfYWRkcjsKKyAgICB1bnNpZ25lZCBjaGFyIGRpZ2lfY291bnQ7CisgICAgYXgyNV9hZGRyZXNzIGRpZ2lfYWRkcltBWDI1X01BWF9ESUdJU107CisgIH07CisKKy8qIFRoZSBBWC4yNSBpb2N0bCBzdHJ1Y3R1cmU6ICovCitzdHJ1Y3QgYXgyNV9jdGxfc3RydWN0CisgIHsKKyAgICBheDI1X2FkZHJlc3MgcG9ydF9hZGRyOworICAgIGF4MjVfYWRkcmVzcyBzb3VyY2VfYWRkcjsKKyAgICBheDI1X2FkZHJlc3MgZGVzdF9hZGRyOworICAgIHVuc2lnbmVkIGludCBjbWQ7CisgICAgdW5zaWduZWQgbG9uZyBhcmc7CisgICAgdW5zaWduZWQgY2hhciBkaWdpX2NvdW50OworICAgIGF4MjVfYWRkcmVzcyBkaWdpX2FkZHJbQVgyNV9NQVhfRElHSVNdOworICB9OworCitzdHJ1Y3QgYXgyNV9pbmZvX3N0cnVjdAorICB7CisgICAgdW5zaWduZWQgaW50ICBuMiwgbjJjb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgdDEsIHQxdGltZXI7CisgICAgdW5zaWduZWQgaW50IHQyLCB0MnRpbWVyOworICAgIHVuc2lnbmVkIGludCB0MywgdDN0aW1lcjsKKyAgICB1bnNpZ25lZCBpbnQgaWRsZSwgaWRsZXRpbWVyOworICAgIHVuc2lnbmVkIGludCBzdGF0ZTsKKyAgICB1bnNpZ25lZCBpbnQgcmN2X3EsIHNuZF9xOworICB9OworCitzdHJ1Y3QgYXgyNV9md2Rfc3RydWN0CisgIHsKKyAgICBheDI1X2FkZHJlc3MgcG9ydF9mcm9tOworICAgIGF4MjVfYWRkcmVzcyBwb3J0X3RvOworICB9OworCisvKiBBWC4yNSByb3V0ZSBzdHJ1Y3R1cmU6ICovCitzdHJ1Y3QgYXgyNV9yb3V0ZV9vcHRfc3RydWN0CisgIHsKKyAgICBheDI1X2FkZHJlc3MgcG9ydF9hZGRyOworICAgIGF4MjVfYWRkcmVzcyBkZXN0X2FkZHI7CisgICAgaW50IGNtZDsKKyAgICBpbnQgYXJnOworICB9OworCisvKiBBWC4yNSBCUFEgc3R1ZmY6ICovCitzdHJ1Y3QgYXgyNV9icHFhZGRyX3N0cnVjdAorICB7CisgICAgY2hhciBkZXZbMTZdOworICAgIGF4MjVfYWRkcmVzcyBhZGRyOworICB9OworCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIEFYLjI1IGB2YWx1ZXMnIGZpZWxkczogKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfSVBERUZNT0RFCTAJLyogJ0QnPURHICdWJz1WQyAqLworI2RlZmluZQlBWDI1X1ZBTFVFU19BWERFRk1PREUJMQkvKiA4PU5vcm1hbCAxMjg9RXh0ZW5kZWQgU2VxIE5vcyAqLworI2RlZmluZQlBWDI1X1ZBTFVFU19ORVRST00JMgkvKiBBbGxvdyBORVQvUk9NICAtIDA9Tm8gMT1ZZXMgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfVEVYVAkzCS8qIEFsbG93IFBJRD1UZXh0IC0gMD1ObyAxPVllcyAqLworI2RlZmluZQlBWDI1X1ZBTFVFU19CQUNLT0ZGCTQJLyogJ0UnPUV4cG9uZW50aWFsICdMJz1MaW5lYXIgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfQ09OTU9ERQk1CS8qIEFsbG93IGNvbm5lY3RlZCBtb2RlcyAtIDA9Tm8gMT1ZZXMgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfV0lORE9XCTYJLyogRGVmYXVsdCB3aW5kb3cgc2l6ZSBmb3Igc3RhbmRhcmQgQVguMjUgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfRVdJTkRPVwk3CS8qIERlZmF1bHQgd2luZG93IHNpemUgZm9yIGV4dGVuZGVkIEFYLjI1ICovCisjZGVmaW5lCUFYMjVfVkFMVUVTX1QxCQk4CS8qIERlZmF1bHQgVDEgdGltZW91dCB2YWx1ZSAqLworI2RlZmluZQlBWDI1X1ZBTFVFU19UMgkJOQkvKiBEZWZhdWx0IFQyIHRpbWVvdXQgdmFsdWUgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfVDMJCTEwCS8qIERlZmF1bHQgVDMgdGltZW91dCB2YWx1ZSAqLworI2RlZmluZQlBWDI1X1ZBTFVFU19OMgkJMTEJLyogRGVmYXVsdCBOMiB2YWx1ZSAqLworI2RlZmluZQlBWDI1X1ZBTFVFU19ESUdJCTEyCS8qIERpZ2lwZWF0IG1vZGUgKi8KKyNkZWZpbmUgQVgyNV9WQUxVRVNfSURMRQkxMwkvKiBtb2RlIHZjIGlkbGUgdGltZXIgKi8KKyNkZWZpbmUgQVgyNV9WQUxVRVNfUEFDTEVOCTE0CS8qIEFYLjI1IE1UVSAqLworI2RlZmluZSBBWDI1X1ZBTFVFU19JUE1BWFFVRVVFICAxNQkvKiBNYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGVucXVldWVkICovCisjZGVmaW5lCUFYMjVfTUFYX1ZBTFVFUwkJMjAKKworc3RydWN0IGF4MjVfcGFybXNfc3RydWN0CisgIHsKKyAgICBheDI1X2FkZHJlc3MgcG9ydF9hZGRyOworICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlc1tBWDI1X01BWF9WQUxVRVNdOworICB9OworCisjZW5kaWYgLyogbmV0YXgyNS9heDI1LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0ZGIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0ZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjc2YTI1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRkYi5oCkBAIC0wLDAgKzEsNzE3IEBACisgIC8qIENvcHlyaWdodCAoQykgMTk5Ni0yMDA0LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBBbGwgZGF0YSByZXR1cm5lZCBieSB0aGUgbmV0d29yayBkYXRhIGJhc2UgbGlicmFyeSBhcmUgc3VwcGxpZWQgaW4KKyAgIGhvc3Qgb3JkZXIgYW5kIHJldHVybmVkIGluIG5ldHdvcmsgb3JkZXIgKHN1aXRhYmxlIGZvciB1c2UgaW4KKyAgIHN5c3RlbSBjYWxscykuICAqLworCisjaWZuZGVmCV9ORVREQl9ICisjZGVmaW5lCV9ORVREQl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWZkZWYgX19VU0VfTUlTQworLyogVGhpcyBpcyBuZWNlc3NhcnkgdG8gbWFrZSB0aGlzIGluY2x1ZGUgZmlsZSBwcm9wZXJseSByZXBsYWNlIHRoZQorICAgU3VuIHZlcnNpb24uICAqLworIyBpbmNsdWRlIDxycGMvbmV0ZGIuaD4KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBfX25lZWRfc2lnZXZlbnRfdAorIyBpbmNsdWRlIDxiaXRzL3NpZ2luZm8uaD4KKyMgZGVmaW5lIF9fbmVlZF90aW1lc3BlYworIyBpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvbmV0ZGIuaD4KKworLyogQWJzb2x1dGUgZmlsZSBuYW1lIGZvciBuZXR3b3JrIGRhdGEgYmFzZSBmaWxlcy4gICovCisjZGVmaW5lCV9QQVRIX0hFUVVJVgkJIi9ldGMvaG9zdHMuZXF1aXYiCisjZGVmaW5lCV9QQVRIX0hPU1RTCQkiL2V0Yy9ob3N0cyIKKyNkZWZpbmUJX1BBVEhfTkVUV09SS1MJCSIvZXRjL25ldHdvcmtzIgorI2RlZmluZQlfUEFUSF9OU1NXSVRDSF9DT05GCSIvZXRjL25zc3dpdGNoLmNvbmYiCisjZGVmaW5lCV9QQVRIX1BST1RPQ09MUwkJIi9ldGMvcHJvdG9jb2xzIgorI2RlZmluZQlfUEFUSF9TRVJWSUNFUwkJIi9ldGMvc2VydmljZXMiCisKKworX19CRUdJTl9ERUNMUworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8ICFkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisvKiBFcnJvciBzdGF0dXMgZm9yIG5vbi1yZWVudHJhbnQgbG9va3VwIGZ1bmN0aW9ucy4KKyAgIFdlIHVzZSBhIG1hY3JvIHRvIGFjY2VzcyBhbHdheXMgdGhlIHRocmVhZC1zcGVjaWZpYyBgaF9lcnJubycgdmFyaWFibGUuICAqLworIyBkZWZpbmUgaF9lcnJubyAoKl9faF9lcnJub19sb2NhdGlvbiAoKSkKKworLyogRnVuY3Rpb24gdG8gZ2V0IGFkZHJlc3Mgb2YgZ2xvYmFsIGBoX2Vycm5vJyB2YXJpYWJsZS4gICovCitleHRlcm4gaW50ICpfX2hfZXJybm9fbG9jYXRpb24gKHZvaWQpIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisKKy8qIFBvc3NpYmxlIHZhbHVlcyBsZWZ0IGluIGBoX2Vycm5vJy4gICovCisjIGRlZmluZSBIT1NUX05PVF9GT1VORAkxCS8qIEF1dGhvcml0YXRpdmUgQW5zd2VyIEhvc3Qgbm90IGZvdW5kLiAgKi8KKyMgZGVmaW5lIFRSWV9BR0FJTgkyCS8qIE5vbi1BdXRob3JpdGF0aXZlIEhvc3Qgbm90IGZvdW5kLAorCQkJCSAgIG9yIFNFUlZFUkZBSUwuICAqLworIyBkZWZpbmUgTk9fUkVDT1ZFUlkJMwkvKiBOb24gcmVjb3ZlcmFibGUgZXJyb3JzLCBGT1JNRVJSLCBSRUZVU0VELAorCQkJCSAgIE5PVElNUC4gICovCisjIGRlZmluZSBOT19EQVRBCTQJLyogVmFsaWQgbmFtZSwgbm8gZGF0YSByZWNvcmQgb2YgcmVxdWVzdGVkCisJCQkJICAgdHlwZS4gICovCisjZW5kaWYKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKyMgZGVmaW5lIE5FVERCX0lOVEVSTkFMCS0xCS8qIFNlZSBlcnJuby4gICovCisjIGRlZmluZSBORVREQl9TVUNDRVNTCTAJLyogTm8gcHJvYmxlbS4gICovCisjIGRlZmluZSBOT19BRERSRVNTCU5PX0RBVEEJLyogTm8gYWRkcmVzcywgbG9vayBmb3IgTVggcmVjb3JkLiAgKi8KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogSGlnaGVzdCByZXNlcnZlZCBJbnRlcm5ldCBwb3J0IG51bWJlci4gICovCisjIGRlZmluZSBJUFBPUlRfUkVTRVJWRUQJMTAyNAorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFNjb3BlIGRlbGltaXRlciBmb3IgZ2V0YWRkcmluZm8oKSwgZ2V0bmFtZWluZm8oKS4gICovCisjIGRlZmluZSBTQ09QRV9ERUxJTUlURVIJJyUnCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFByaW50IGVycm9yIGluZGljYXRlZCBieSBgaF9lcnJubycgdmFyaWFibGUgb24gc3RhbmRhcmQgZXJyb3IuICBTVFIKKyAgIGlmIG5vbi1udWxsIGlzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvciBzdHJpbmcuICAqLworZXh0ZXJuIHZvaWQgaGVycm9yIChfX2NvbnN0IGNoYXIgKl9fc3RyKSBfX1RIUk9XOworCisvKiBSZXR1cm4gc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBlcnJvciBFUlJfTlVNLiAgKi8KK2V4dGVybiBfX2NvbnN0IGNoYXIgKmhzdHJlcnJvciAoaW50IF9fZXJyX251bSkgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIERlc2NyaXB0aW9uIG9mIGRhdGEgYmFzZSBlbnRyeSBmb3IgYSBzaW5nbGUgaG9zdC4gICovCitzdHJ1Y3QgaG9zdGVudAoreworICBjaGFyICpoX25hbWU7CQkJLyogT2ZmaWNpYWwgbmFtZSBvZiBob3N0LiAgKi8KKyAgY2hhciAqKmhfYWxpYXNlczsJCS8qIEFsaWFzIGxpc3QuICAqLworICBpbnQgaF9hZGRydHlwZTsJCS8qIEhvc3QgYWRkcmVzcyB0eXBlLiAgKi8KKyAgaW50IGhfbGVuZ3RoOwkJCS8qIExlbmd0aCBvZiBhZGRyZXNzLiAgKi8KKyAgY2hhciAqKmhfYWRkcl9saXN0OwkJLyogTGlzdCBvZiBhZGRyZXNzZXMgZnJvbSBuYW1lIHNlcnZlci4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfR05VCisjIGRlZmluZQloX2FkZHIJaF9hZGRyX2xpc3RbMF0gLyogQWRkcmVzcywgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuKi8KKyNlbmRpZgorfTsKKworLyogT3BlbiBob3N0IGRhdGEgYmFzZSBmaWxlcyBhbmQgbWFyayB0aGVtIGFzIHN0YXlpbmcgb3BlbiBldmVuIGFmdGVyCisgICBhIGxhdGVyIHNlYXJjaCBpZiBTVEFZX09QRU4gaXMgbm9uLXplcm8uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgc2V0aG9zdGVudCAoaW50IF9fc3RheV9vcGVuKTsKKworLyogQ2xvc2UgaG9zdCBkYXRhIGJhc2UgZmlsZXMgYW5kIGNsZWFyIGBzdGF5IG9wZW4nIGZsYWcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgZW5kaG9zdGVudCAodm9pZCk7CisKKy8qIEdldCBuZXh0IGVudHJ5IGZyb20gaG9zdCBkYXRhIGJhc2UgZmlsZS4gIE9wZW4gZGF0YSBiYXNlIGlmCisgICBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBob3N0ZW50ICpnZXRob3N0ZW50ICh2b2lkKTsKKworLyogUmV0dXJuIGVudHJ5IGZyb20gaG9zdCBkYXRhIGJhc2Ugd2hpY2ggYWRkcmVzcyBtYXRjaCBBRERSIHdpdGgKKyAgIGxlbmd0aCBMRU4gYW5kIHR5cGUgVFlQRS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IGhvc3RlbnQgKmdldGhvc3RieWFkZHIgKF9fY29uc3Qgdm9pZCAqX19hZGRyLCBfX3NvY2tsZW5fdCBfX2xlbiwKKwkJCQkgICAgICBpbnQgX190eXBlKTsKKworLyogUmV0dXJuIGVudHJ5IGZyb20gaG9zdCBkYXRhIGJhc2UgZm9yIGhvc3Qgd2l0aCBOQU1FLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgaG9zdGVudCAqZ2V0aG9zdGJ5bmFtZSAoX19jb25zdCBjaGFyICpfX25hbWUpOworCisjaWZkZWYgX19VU0VfTUlTQworLyogUmV0dXJuIGVudHJ5IGZyb20gaG9zdCBkYXRhIGJhc2UgZm9yIGhvc3Qgd2l0aCBOQU1FLiAgQUYgbXVzdCBiZQorICAgc2V0IHRvIHRoZSBhZGRyZXNzIHR5cGUgd2hpY2ggaXMgYEFGX0lORVQnIGZvciBJUHY0IG9yIGBBRl9JTkVUNicKKyAgIGZvciBJUHY2LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IGhvc3RlbnQgKmdldGhvc3RieW5hbWUyIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fYWYpOworCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZS4gIFRoZSBhZGRpdGlvbmFsCisgICBhcmd1bWVudHMgc3BlY2lmeSBhIGJ1ZmZlciBvZiBCVUZMRU4gc3RhcnRpbmcgYXQgQlVGLiAgVGhlIGxhc3QKKyAgIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byBhIHZhcmlhYmxlIHdoaWNoIGdldHMgdGhlIHZhbHVlIHdoaWNoCisgICB3b3VsZCBiZSBzdG9yZWQgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSBgaGVycm5vJyBieSB0aGUKKyAgIG5vbi1yZWVudHJhbnQgZnVuY3Rpb25zLgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGV5IGFyZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0aG9zdGVudF9yIChzdHJ1Y3QgaG9zdGVudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJIHN0cnVjdCBob3N0ZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCwKKwkJCSBpbnQgKl9fcmVzdHJpY3QgX19oX2Vycm5vcCk7CisKK2V4dGVybiBpbnQgZ2V0aG9zdGJ5YWRkcl9yIChfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19hZGRyLCBfX3NvY2tsZW5fdCBfX2xlbiwKKwkJCSAgICBpbnQgX190eXBlLAorCQkJICAgIHN0cnVjdCBob3N0ZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCSAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgc3RydWN0IGhvc3RlbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0LAorCQkJICAgIGludCAqX19yZXN0cmljdCBfX2hfZXJybm9wKTsKKworZXh0ZXJuIGludCBnZXRob3N0YnluYW1lX3IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCQkgICAgc3RydWN0IGhvc3RlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBzdHJ1Y3QgaG9zdGVudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQsCisJCQkgICAgaW50ICpfX3Jlc3RyaWN0IF9faF9lcnJub3ApOworCitleHRlcm4gaW50IGdldGhvc3RieW5hbWUyX3IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsIGludCBfX2FmLAorCQkJICAgICBzdHJ1Y3QgaG9zdGVudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICAgc3RydWN0IGhvc3RlbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0LAorCQkJICAgICBpbnQgKl9fcmVzdHJpY3QgX19oX2Vycm5vcCk7CisjZW5kaWYJLyogbWlzYyAqLworCisKKy8qIE9wZW4gbmV0d29yayBkYXRhIGJhc2UgZmlsZXMgYW5kIG1hcmsgdGhlbSBhcyBzdGF5aW5nIG9wZW4gZXZlbgorICAgYWZ0ZXIgYSBsYXRlciBzZWFyY2ggaWYgU1RBWV9PUEVOIGlzIG5vbi16ZXJvLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHNldG5ldGVudCAoaW50IF9fc3RheV9vcGVuKTsKKworLyogQ2xvc2UgbmV0d29yayBkYXRhIGJhc2UgZmlsZXMgYW5kIGNsZWFyIGBzdGF5IG9wZW4nIGZsYWcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgZW5kbmV0ZW50ICh2b2lkKTsKKworLyogR2V0IG5leHQgZW50cnkgZnJvbSBuZXR3b3JrIGRhdGEgYmFzZSBmaWxlLiAgT3BlbiBkYXRhIGJhc2UgaWYKKyAgIG5lY2Vzc2FyeS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IG5ldGVudCAqZ2V0bmV0ZW50ICh2b2lkKTsKKworLyogUmV0dXJuIGVudHJ5IGZyb20gbmV0d29yayBkYXRhIGJhc2Ugd2hpY2ggYWRkcmVzcyBtYXRjaCBORVQgYW5kCisgICB0eXBlIFRZUEUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBuZXRlbnQgKmdldG5ldGJ5YWRkciAodWludDMyX3QgX19uZXQsIGludCBfX3R5cGUpOworCisvKiBSZXR1cm4gZW50cnkgZnJvbSBuZXR3b3JrIGRhdGEgYmFzZSBmb3IgbmV0d29yayB3aXRoIE5BTUUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBuZXRlbnQgKmdldG5ldGJ5bmFtZSAoX19jb25zdCBjaGFyICpfX25hbWUpOworCisjaWZkZWYJX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUuICBUaGUgYWRkaXRpb25hbAorICAgYXJndW1lbnRzIHNwZWNpZnkgYSBidWZmZXIgb2YgQlVGTEVOIHN0YXJ0aW5nIGF0IEJVRi4gIFRoZSBsYXN0CisgICBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB3aGljaCBnZXRzIHRoZSB2YWx1ZSB3aGljaAorICAgd291bGQgYmUgc3RvcmVkIGluIHRoZSBnbG9iYWwgdmFyaWFibGUgYGhlcnJubycgYnkgdGhlCisgICBub24tcmVlbnRyYW50IGZ1bmN0aW9ucy4KKworICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gdGhleSBhcmUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldG5ldGVudF9yIChzdHJ1Y3QgbmV0ZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCWNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCXN0cnVjdCBuZXRlbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0LAorCQkJaW50ICpfX3Jlc3RyaWN0IF9faF9lcnJub3ApOworCitleHRlcm4gaW50IGdldG5ldGJ5YWRkcl9yICh1aW50MzJfdCBfX25ldCwgaW50IF9fdHlwZSwKKwkJCSAgIHN0cnVjdCBuZXRlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgc3RydWN0IG5ldGVudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQsCisJCQkgICBpbnQgKl9fcmVzdHJpY3QgX19oX2Vycm5vcCk7CisKK2V4dGVybiBpbnQgZ2V0bmV0YnluYW1lX3IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCQkgICBzdHJ1Y3QgbmV0ZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCSAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgIHN0cnVjdCBuZXRlbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0LAorCQkJICAgaW50ICpfX3Jlc3RyaWN0IF9faF9lcnJub3ApOworI2VuZGlmCS8qIG1pc2MgKi8KKworCisvKiBEZXNjcmlwdGlvbiBvZiBkYXRhIGJhc2UgZW50cnkgZm9yIGEgc2luZ2xlIHNlcnZpY2UuICAqLworc3RydWN0IHNlcnZlbnQKK3sKKyAgY2hhciAqc19uYW1lOwkJCS8qIE9mZmljaWFsIHNlcnZpY2UgbmFtZS4gICovCisgIGNoYXIgKipzX2FsaWFzZXM7CQkvKiBBbGlhcyBsaXN0LiAgKi8KKyAgaW50IHNfcG9ydDsJCQkvKiBQb3J0IG51bWJlci4gICovCisgIGNoYXIgKnNfcHJvdG87CQkvKiBQcm90b2NvbCB0byB1c2UuICAqLworfTsKKworLyogT3BlbiBzZXJ2aWNlIGRhdGEgYmFzZSBmaWxlcyBhbmQgbWFyayB0aGVtIGFzIHN0YXlpbmcgb3BlbiBldmVuCisgICBhZnRlciBhIGxhdGVyIHNlYXJjaCBpZiBTVEFZX09QRU4gaXMgbm9uLXplcm8uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgc2V0c2VydmVudCAoaW50IF9fc3RheV9vcGVuKTsKKworLyogQ2xvc2Ugc2VydmljZSBkYXRhIGJhc2UgZmlsZXMgYW5kIGNsZWFyIGBzdGF5IG9wZW4nIGZsYWcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgZW5kc2VydmVudCAodm9pZCk7CisKKy8qIEdldCBuZXh0IGVudHJ5IGZyb20gc2VydmljZSBkYXRhIGJhc2UgZmlsZS4gIE9wZW4gZGF0YSBiYXNlIGlmCisgICBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBzZXJ2ZW50ICpnZXRzZXJ2ZW50ICh2b2lkKTsKKworLyogUmV0dXJuIGVudHJ5IGZyb20gbmV0d29yayBkYXRhIGJhc2UgZm9yIG5ldHdvcmsgd2l0aCBOQU1FIGFuZAorICAgcHJvdG9jb2wgUFJPVE8uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBzZXJ2ZW50ICpnZXRzZXJ2YnluYW1lIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwKKwkJCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fcHJvdG8pOworCisvKiBSZXR1cm4gZW50cnkgZnJvbSBzZXJ2aWNlIGRhdGEgYmFzZSB3aGljaCBtYXRjaGVzIHBvcnQgUE9SVCBhbmQKKyAgIHByb3RvY29sIFBST1RPLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgc2VydmVudCAqZ2V0c2VydmJ5cG9ydCAoaW50IF9fcG9ydCwgX19jb25zdCBjaGFyICpfX3Byb3RvKTsKKworCisjaWZkZWYJX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUuICBUaGUgYWRkaXRpb25hbAorICAgYXJndW1lbnRzIHNwZWNpZnkgYSBidWZmZXIgb2YgQlVGTEVOIHN0YXJ0aW5nIGF0IEJVRi4KKworICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gdGhleSBhcmUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldHNlcnZlbnRfciAoc3RydWN0IHNlcnZlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSBzdHJ1Y3Qgc2VydmVudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworCitleHRlcm4gaW50IGdldHNlcnZieW5hbWVfciAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wcm90bywKKwkJCSAgICBzdHJ1Y3Qgc2VydmVudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgIHN0cnVjdCBzZXJ2ZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKK2V4dGVybiBpbnQgZ2V0c2VydmJ5cG9ydF9yIChpbnQgX19wb3J0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wcm90bywKKwkJCSAgICBzdHJ1Y3Qgc2VydmVudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgIHN0cnVjdCBzZXJ2ZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisjZW5kaWYJLyogbWlzYyAqLworCisKKy8qIERlc2NyaXB0aW9uIG9mIGRhdGEgYmFzZSBlbnRyeSBmb3IgYSBzaW5nbGUgc2VydmljZS4gICovCitzdHJ1Y3QgcHJvdG9lbnQKK3sKKyAgY2hhciAqcF9uYW1lOwkJCS8qIE9mZmljaWFsIHByb3RvY29sIG5hbWUuICAqLworICBjaGFyICoqcF9hbGlhc2VzOwkJLyogQWxpYXMgbGlzdC4gICovCisgIGludCBwX3Byb3RvOwkJCS8qIFByb3RvY29sIG51bWJlci4gICovCit9OworCisvKiBPcGVuIHByb3RvY29sIGRhdGEgYmFzZSBmaWxlcyBhbmQgbWFyayB0aGVtIGFzIHN0YXlpbmcgb3BlbiBldmVuCisgICBhZnRlciBhIGxhdGVyIHNlYXJjaCBpZiBTVEFZX09QRU4gaXMgbm9uLXplcm8uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgc2V0cHJvdG9lbnQgKGludCBfX3N0YXlfb3Blbik7CisKKy8qIENsb3NlIHByb3RvY29sIGRhdGEgYmFzZSBmaWxlcyBhbmQgY2xlYXIgYHN0YXkgb3BlbicgZmxhZy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBlbmRwcm90b2VudCAodm9pZCk7CisKKy8qIEdldCBuZXh0IGVudHJ5IGZyb20gcHJvdG9jb2wgZGF0YSBiYXNlIGZpbGUuICBPcGVuIGRhdGEgYmFzZSBpZgorICAgbmVjZXNzYXJ5LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgcHJvdG9lbnQgKmdldHByb3RvZW50ICh2b2lkKTsKKworLyogUmV0dXJuIGVudHJ5IGZyb20gcHJvdG9jb2wgZGF0YSBiYXNlIGZvciBuZXR3b3JrIHdpdGggTkFNRS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHByb3RvZW50ICpnZXRwcm90b2J5bmFtZSAoX19jb25zdCBjaGFyICpfX25hbWUpOworCisvKiBSZXR1cm4gZW50cnkgZnJvbSBwcm90b2NvbCBkYXRhIGJhc2Ugd2hpY2ggbnVtYmVyIGlzIFBST1RPLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgcHJvdG9lbnQgKmdldHByb3RvYnludW1iZXIgKGludCBfX3Byb3RvKTsKKworCisjaWZkZWYJX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUuICBUaGUgYWRkaXRpb25hbAorICAgYXJndW1lbnRzIHNwZWNpZnkgYSBidWZmZXIgb2YgQlVGTEVOIHN0YXJ0aW5nIGF0IEJVRi4KKworICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gdGhleSBhcmUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldHByb3RvZW50X3IgKHN0cnVjdCBwcm90b2VudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgc3RydWN0IHByb3RvZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKK2V4dGVybiBpbnQgZ2V0cHJvdG9ieW5hbWVfciAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJCSAgICAgc3RydWN0IHByb3RvZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCSAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgICBzdHJ1Y3QgcHJvdG9lbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworZXh0ZXJuIGludCBnZXRwcm90b2J5bnVtYmVyX3IgKGludCBfX3Byb3RvLAorCQkJICAgICAgIHN0cnVjdCBwcm90b2VudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgICAgIHN0cnVjdCBwcm90b2VudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworCisKKy8qIEVzdGFibGlzaCBuZXR3b3JrIGdyb3VwIE5FVEdST1VQIGZvciBlbnVtZXJhdGlvbi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzZXRuZXRncmVudCAoX19jb25zdCBjaGFyICpfX25ldGdyb3VwKTsKKworLyogRnJlZSBhbGwgc3BhY2UgYWxsb2NhdGVkIGJ5IHByZXZpb3VzIGBzZXRuZXRncmVudCcgY2FsbC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgZW5kbmV0Z3JlbnQgKHZvaWQpOworCisvKiBHZXQgbmV4dCBtZW1iZXIgb2YgbmV0Z3JvdXAgZXN0YWJsaXNoZWQgYnkgbGFzdCBgc2V0bmV0Z3JlbnQnIGNhbGwKKyAgIGFuZCByZXR1cm4gcG9pbnRlcnMgdG8gZWxlbWVudHMgaW4gSE9TVFAsIFVTRVJQLCBhbmQgRE9NQUlOUC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRuZXRncmVudCAoY2hhciAqKl9fcmVzdHJpY3QgX19ob3N0cCwKKwkJCWNoYXIgKipfX3Jlc3RyaWN0IF9fdXNlcnAsCisJCQljaGFyICoqX19yZXN0cmljdCBfX2RvbWFpbnApOworCisKKy8qIFRlc3Qgd2hldGhlciBORVRHUk9VUCBjb250YWlucyB0aGUgdHJpcGxlIChIT1NULFVTRVIsRE9NQUlOKS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBpbm5ldGdyIChfX2NvbnN0IGNoYXIgKl9fbmV0Z3JvdXAsIF9fY29uc3QgY2hhciAqX19ob3N0LAorCQkgICAgX19jb25zdCBjaGFyICpfX3VzZXIsIF9fY29uc3QgY2hhciAqX19kb21haW4pOworCisvKiBSZWVudHJhbnQgdmVyc2lvbiBvZiBgZ2V0bmV0Z3JlbnQnIHdoZXJlIHJlc3VsdCBpcyBwbGFjZWQgaW4gQlVGRkVSLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldG5ldGdyZW50X3IgKGNoYXIgKipfX3Jlc3RyaWN0IF9faG9zdHAsCisJCQkgIGNoYXIgKipfX3Jlc3RyaWN0IF9fdXNlcnAsCisJCQkgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZG9tYWlucCwKKwkJCSAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuKTsKKyNlbmRpZgkvKiBtaXNjICovCisKKworI2lmZGVmIF9fVVNFX0JTRAorLyogQ2FsbCBgcnNoZCcgYXQgcG9ydCBSUE9SVCBvbiByZW1vdGUgbWFjaGluZSAqQUhPU1QgdG8gZXhlY3V0ZSBDTUQuCisgICBUaGUgbG9jYWwgdXNlciBpcyBMT0NVU0VSLCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUgdGhlIGNvbW1hbmQgaXMKKyAgIGV4ZWN1dGVkIGFzIFJFTVVTRVIuICBJbiAqRkQyUCB0aGUgZGVzY3JpcHRvciB0byB0aGUgc29ja2V0IGZvciB0aGUKKyAgIGNvbm5lY3Rpb24gaXMgcmV0dXJuZWQuICBUaGUgY2FsbGVyIG11c3QgaGF2ZSB0aGUgcmlnaHQgdG8gdXNlIGEKKyAgIHJlc2VydmVkIHBvcnQuICBXaGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zICpBSE9TVCBjb250YWlucyB0aGUKKyAgIG9mZmljaWFsIGhvc3QgbmFtZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCByY21kIChjaGFyICoqX19yZXN0cmljdCBfX2Fob3N0LCB1bnNpZ25lZCBzaG9ydCBpbnQgX19ycG9ydCwKKwkJIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2xvY3VzZXIsCisJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19yZW11c2VyLAorCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fY21kLCBpbnQgKl9fcmVzdHJpY3QgX19mZDJwKTsKKworLyogVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBmdW5jdGlvbiB3aGVyZSB0aGUgcHJvdG9jb2wgY2FuIGJlIHNlbGVjdGVkCisgICBhbmQgd2hpY2ggdGhlcmVmb3JlIGNhbiBiZSB1c2VkIGZvciBJUHY2LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHJjbWRfYWYgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYWhvc3QsIHVuc2lnbmVkIHNob3J0IGludCBfX3Jwb3J0LAorCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbG9jdXNlciwKKwkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3JlbXVzZXIsCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19jbWQsIGludCAqX19yZXN0cmljdCBfX2ZkMnAsCisJCSAgICBzYV9mYW1pbHlfdCBfX2FmKTsKKworLyogQ2FsbCBgcmV4ZWNkJyBhdCBwb3J0IFJQT1JUIG9uIHJlbW90ZSBtYWNoaW5lICpBSE9TVCB0byBleGVjdXRlCisgICBDTUQuICBUaGUgcHJvY2VzcyBydW5zIGF0IHRoZSByZW1vdGUgbWFjaGluZSB1c2luZyB0aGUgSUQgb2YgdXNlcgorICAgTkFNRSB3aG9zZSBjbGVhcnRleHQgcGFzc3dvcmQgaXMgUEFTU1dELiAgSW4gKkZEMlAgdGhlIGRlc2NyaXB0b3IKKyAgIHRvIHRoZSBzb2NrZXQgZm9yIHRoZSBjb25uZWN0aW9uIGlzIHJldHVybmVkLiAgV2hlbiB0aGUgZnVuY3Rpb24KKyAgIHJldHVybnMgKkFIT1NUIGNvbnRhaW5zIHRoZSBvZmZpY2lhbCBob3N0IG5hbWUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcmV4ZWMgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYWhvc3QsIGludCBfX3Jwb3J0LAorCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGFzcywKKwkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19jbWQsIGludCAqX19yZXN0cmljdCBfX2ZkMnApOworCisvKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IGZ1bmN0aW9uIHdoZXJlIHRoZSBwcm90b2NvbCBjYW4gYmUgc2VsZWN0ZWQKKyAgIGFuZCB3aGljaCB0aGVyZWZvcmUgY2FuIGJlIHVzZWQgZm9yIElQdjYuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcmV4ZWNfYWYgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYWhvc3QsIGludCBfX3Jwb3J0LAorCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGFzcywKKwkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19jbWQsIGludCAqX19yZXN0cmljdCBfX2ZkMnAsCisJCSAgICAgc2FfZmFtaWx5X3QgX19hZik7CisKKy8qIENoZWNrIHdoZXRoZXIgdXNlciBSRU1VU0VSIG9uIHN5c3RlbSBSSE9TVCBpcyBhbGxvd2VkIHRvIGxvZ2luIGFzIExPQ1VTRVIuCisgICBJZiBTVVNFUiBpcyBub3QgemVybyB0aGUgdXNlciB0cmllcyB0byBiZWNvbWUgc3VwZXJ1c2VyLiAgUmV0dXJuIDAgaWYKKyAgIGl0IGlzIHBvc3NpYmxlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHJ1c2Vyb2sgKF9fY29uc3QgY2hhciAqX19yaG9zdCwgaW50IF9fc3VzZXIsCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVtdXNlciwgX19jb25zdCBjaGFyICpfX2xvY3VzZXIpOworCisvKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IGZ1bmN0aW9uIHdoZXJlIHRoZSBwcm90b2NvbCBjYW4gYmUgc2VsZWN0ZWQKKyAgIGFuZCB3aGljaCB0aGVyZWZvcmUgY2FuIGJlIHVzZWQgZm9yIElQdjYuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcnVzZXJva19hZiAoX19jb25zdCBjaGFyICpfX3Job3N0LCBpbnQgX19zdXNlciwKKwkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZW11c2VyLCBfX2NvbnN0IGNoYXIgKl9fbG9jdXNlciwKKwkJICAgICAgIHNhX2ZhbWlseV90IF9fYWYpOworCisvKiBDaGVjayB3aGV0aGVyIHVzZXIgUkVNVVNFUiBvbiBzeXN0ZW0gaW5kaWNhdGVkIGJ5IElQdjQgYWRkcmVzcworICAgUkFERFIgaXMgYWxsb3dlZCB0byBsb2dpbiBhcyBMT0NVU0VSLiAgTm9uLUlQdjQgKGUuZy4sIElQdjYpIGFyZQorICAgbm90IHN1cHBvcnRlZC4gIElmIFNVU0VSIGlzIG5vdCB6ZXJvIHRoZSB1c2VyIHRyaWVzIHRvIGJlY29tZQorICAgc3VwZXJ1c2VyLiAgUmV0dXJuIDAgaWYgaXQgaXMgcG9zc2libGUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgaXJ1c2Vyb2sgKHVpbnQzMl90IF9fcmFkZHIsIGludCBfX3N1c2VyLAorCQkgICAgIF9fY29uc3QgY2hhciAqX19yZW11c2VyLCBfX2NvbnN0IGNoYXIgKl9fbG9jdXNlcik7CisKKy8qIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgZnVuY3Rpb24gd2hlcmUgdGhlIHBmYW1pbGl5IGlmIHRoZSBhZGRyZXNzCisgICBwb2ludGVkIHRvIGJ5IFJBRERSIGlzIGRldGVybWluZWQgYnkgdGhlIHZhbHVlIG9mIEFGLiAgSXQgdGhlcmVmb3JlCisgICBjYW4gYmUgdXNlZCBmb3IgSVB2NgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGlydXNlcm9rX2FmIChfX2NvbnN0IHZvaWQgKl9fcmFkZHIsIGludCBfX3N1c2VyLAorCQkJX19jb25zdCBjaGFyICpfX3JlbXVzZXIsIF9fY29uc3QgY2hhciAqX19sb2N1c2VyLAorCQkJc2FfZmFtaWx5X3QgX19hZik7CisKKy8qIFRyeSB0byBhbGxvY2F0ZSByZXNlcnZlZCBwb3J0LCByZXR1cm5pbmcgYSBkZXNjcmlwdG9yIGZvciBhIHNvY2tldCBvcGVuZWQKKyAgIGF0IHRoaXMgcG9ydCBvciAtMSBpZiB1bnN1Y2Nlc3NmdWwuICBUaGUgc2VhcmNoIGZvciBhbiBhdmFpbGFibGUgcG9ydAorICAgd2lsbCBzdGFydCBhdCBBTFBPUlQgYW5kIGNvbnRpbnVlcyB3aXRoIGxvd2VyIG51bWJlcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcnJlc3Zwb3J0IChpbnQgKl9fYWxwb3J0KTsKKworLyogVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBmdW5jdGlvbiB3aGVyZSB0aGUgcHJvdG9jb2wgY2FuIGJlIHNlbGVjdGVkCisgICBhbmQgd2hpY2ggdGhlcmVmb3JlIGNhbiBiZSB1c2VkIGZvciBJUHY2LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHJyZXN2cG9ydF9hZiAoaW50ICpfX2FscG9ydCwgc2FfZmFtaWx5X3QgX19hZik7CisjZW5kaWYKKworCisvKiBFeHRlbnNpb24gZnJvbSBQT1NJWC4xZy4gICovCisjaWZkZWYJX19VU0VfUE9TSVgKKy8qIFN0cnVjdHVyZSB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGFkZHJlc3Mgb2YgYSBzZXJ2aWNlIHByb3ZpZGVyLiAgKi8KK3N0cnVjdCBhZGRyaW5mbworeworICBpbnQgYWlfZmxhZ3M7CQkJLyogSW5wdXQgZmxhZ3MuICAqLworICBpbnQgYWlfZmFtaWx5OwkJLyogUHJvdG9jb2wgZmFtaWx5IGZvciBzb2NrZXQuICAqLworICBpbnQgYWlfc29ja3R5cGU7CQkvKiBTb2NrZXQgdHlwZS4gICovCisgIGludCBhaV9wcm90b2NvbDsJCS8qIFByb3RvY29sIGZvciBzb2NrZXQuICAqLworICBzb2NrbGVuX3QgYWlfYWRkcmxlbjsJCS8qIExlbmd0aCBvZiBzb2NrZXQgYWRkcmVzcy4gICovCisgIHN0cnVjdCBzb2NrYWRkciAqYWlfYWRkcjsJLyogU29ja2V0IGFkZHJlc3MgZm9yIHNvY2tldC4gICovCisgIGNoYXIgKmFpX2Nhbm9ubmFtZTsJCS8qIENhbm9uaWNhbCBuYW1lIGZvciBzZXJ2aWNlIGxvY2F0aW9uLiAgKi8KKyAgc3RydWN0IGFkZHJpbmZvICphaV9uZXh0OwkvKiBQb2ludGVyIHRvIG5leHQgaW4gbGlzdC4gICovCit9OworCisjIGlmZGVmIF9fVVNFX0dOVQorLyogU3RydWN0dXJlIHVzZWQgYXMgY29udHJvbCBibG9jayBmb3IgYXN5bmNocm9ub3VzIGxvb2t1cC4gICovCitzdHJ1Y3QgZ2FpY2IKK3sKKyAgY29uc3QgY2hhciAqYXJfbmFtZTsJCS8qIE5hbWUgdG8gbG9vayB1cC4gICovCisgIGNvbnN0IGNoYXIgKmFyX3NlcnZpY2U7CS8qIFNlcnZpY2UgbmFtZS4gICovCisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqYXJfcmVxdWVzdDsgLyogQWRkaXRpb25hbCByZXF1ZXN0IHNwZWNpZmljYXRpb24uICAqLworICBzdHJ1Y3QgYWRkcmluZm8gKmFyX3Jlc3VsdDsJLyogUG9pbnRlciB0byByZXN1bHQuICAqLworICAvKiBUaGUgZm9sbG93aW5nIGFyZSBpbnRlcm5hbCBlbGVtZW50cy4gICovCisgIGludCBfX3JldHVybjsKKyAgaW50IF9fdW51c2VkWzVdOworfTsKKworLyogTG9va3VwIG1vZGUuICAqLworIyAgZGVmaW5lIEdBSV9XQUlUCTAKKyMgIGRlZmluZSBHQUlfTk9XQUlUCTEKKyMgZW5kaWYKKworLyogUG9zc2libGUgdmFsdWVzIGZvciBgYWlfZmxhZ3MnIGZpZWxkIGluIGBhZGRyaW5mbycgc3RydWN0dXJlLiAgKi8KKyMgZGVmaW5lIEFJX1BBU1NJVkUJMHgwMDAxCS8qIFNvY2tldCBhZGRyZXNzIGlzIGludGVuZGVkIGZvciBgYmluZCcuICAqLworIyBkZWZpbmUgQUlfQ0FOT05OQU1FCTB4MDAwMgkvKiBSZXF1ZXN0IGZvciBjYW5vbmljYWwgbmFtZS4gICovCisjIGRlZmluZSBBSV9OVU1FUklDSE9TVAkweDAwMDQJLyogRG9uJ3QgdXNlIG5hbWUgcmVzb2x1dGlvbi4gICovCisjIGRlZmluZSBBSV9WNE1BUFBFRAkweDAwMDgJLyogSVB2NCBtYXBwZWQgYWRkcmVzc2VzIGFyZSBhY2NlcHRhYmxlLiAgKi8KKyMgZGVmaW5lIEFJX0FMTAkJMHgwMDEwCS8qIFJldHVybiBJUHY0IG1hcHBlZCBhbmQgSVB2NiBhZGRyZXNzZXMuICAqLworIyBkZWZpbmUgQUlfQUREUkNPTkZJRwkweDAwMjAJLyogVXNlIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBob3N0IHRvIGNob29zZQorCQkJCSAgIHJldHVybmVkIGFkZHJlc3MgdHlwZS4uICAqLworIyBpZmRlZiBfX1VTRV9HTlUKKyMgIGRlZmluZSBBSV9JRE4JMHgwMDQwCS8qIElETiBlbmNvZGUgaW5wdXQgKGFzc3VtaW5nIGl0IGlzIGVuY29kZWQKKwkJCQkgICBpbiB0aGUgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgc2V0KQorCQkJCSAgIGJlZm9yZSBsb29raW5nIGl0IHVwLiAqLworIyAgZGVmaW5lIEFJX0NBTk9OSUROCTB4MDA4MAkvKiBUcmFuc2xhdGUgY2Fub25pY2FsIG5hbWUgZnJvbSBJRE4gZm9ybWF0LiAqLworIyAgZGVmaW5lIEFJX0lETl9BTExPV19VTkFTU0lHTkVEIDB4MDEwMCAvKiBEb24ndCByZWplY3QgdW5hc3NpZ25lZCBVbmljb2RlCisJCQkJCSAgICBjb2RlIHBvaW50cy4gICovCisjICBkZWZpbmUgQUlfSUROX1VTRV9TVEQzX0FTQ0lJX1JVTEVTIDB4MDIwMCAvKiBWYWxpZGF0ZSBzdHJpbmdzIGFjY29yZGluZyB0bworCQkJCQkJU1REMyBydWxlcy4gICovCisjIGVuZGlmCisjIGRlZmluZSBBSV9OVU1FUklDU0VSVgkweDA0MDAJLyogRG9uJ3QgdXNlIG5hbWUgcmVzb2x1dGlvbi4gICovCisKKy8qIEVycm9yIHZhbHVlcyBmb3IgYGdldGFkZHJpbmZvJyBmdW5jdGlvbi4gICovCisjIGRlZmluZSBFQUlfQkFERkxBR1MJICAtMQkvKiBJbnZhbGlkIHZhbHVlIGZvciBgYWlfZmxhZ3MnIGZpZWxkLiAgKi8KKyMgZGVmaW5lIEVBSV9OT05BTUUJICAtMgkvKiBOQU1FIG9yIFNFUlZJQ0UgaXMgdW5rbm93bi4gICovCisjIGRlZmluZSBFQUlfQUdBSU4JICAtMwkvKiBUZW1wb3JhcnkgZmFpbHVyZSBpbiBuYW1lIHJlc29sdXRpb24uICAqLworIyBkZWZpbmUgRUFJX0ZBSUwJICAtNAkvKiBOb24tcmVjb3ZlcmFibGUgZmFpbHVyZSBpbiBuYW1lIHJlcy4gICovCisjIGRlZmluZSBFQUlfRkFNSUxZCSAgLTYJLyogYGFpX2ZhbWlseScgbm90IHN1cHBvcnRlZC4gICovCisjIGRlZmluZSBFQUlfU09DS1RZUEUJICAtNwkvKiBgYWlfc29ja3R5cGUnIG5vdCBzdXBwb3J0ZWQuICAqLworIyBkZWZpbmUgRUFJX1NFUlZJQ0UJICAtOAkvKiBTRVJWSUNFIG5vdCBzdXBwb3J0ZWQgZm9yIGBhaV9zb2NrdHlwZScuICAqLworIyBkZWZpbmUgRUFJX01FTU9SWQkgIC0xMAkvKiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLiAgKi8KKyMgZGVmaW5lIEVBSV9TWVNURU0JICAtMTEJLyogU3lzdGVtIGVycm9yIHJldHVybmVkIGluIGBlcnJubycuICAqLworIyBkZWZpbmUgRUFJX09WRVJGTE9XCSAgLTEyCS8qIEFyZ3VtZW50IGJ1ZmZlciBvdmVyZmxvdy4gICovCisjIGlmZGVmIF9fVVNFX0dOVQorIyAgZGVmaW5lIEVBSV9OT0RBVEEJICAtNQkvKiBObyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBOQU1FLiAgKi8KKyMgIGRlZmluZSBFQUlfQUREUkZBTUlMWSAgLTkJLyogQWRkcmVzcyBmYW1pbHkgZm9yIE5BTUUgbm90IHN1cHBvcnRlZC4gICovCisjICBkZWZpbmUgRUFJX0lOUFJPR1JFU1MgIC0xMDAJLyogUHJvY2Vzc2luZyByZXF1ZXN0IGluIHByb2dyZXNzLiAgKi8KKyMgIGRlZmluZSBFQUlfQ0FOQ0VMRUQJICAtMTAxCS8qIFJlcXVlc3QgY2FuY2VsZWQuICAqLworIyAgZGVmaW5lIEVBSV9OT1RDQU5DRUxFRCAtMTAyCS8qIFJlcXVlc3Qgbm90IGNhbmNlbGVkLiAgKi8KKyMgIGRlZmluZSBFQUlfQUxMRE9ORQkgIC0xMDMJLyogQWxsIHJlcXVlc3RzIGRvbmUuICAqLworIyAgZGVmaW5lIEVBSV9JTlRSCSAgLTEwNAkvKiBJbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4gICovCisjICBkZWZpbmUgRUFJX0lETl9FTkNPREUgIC0xMDUJLyogSUROIGVuY29kaW5nIGZhaWxlZC4gICovCisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfTUlTQworIyAgZGVmaW5lIE5JX01BWEhPU1QgICAgICAxMDI1CisjICBkZWZpbmUgTklfTUFYU0VSViAgICAgIDMyCisjIGVuZGlmCisKKyMgZGVmaW5lIE5JX05VTUVSSUNIT1NUCTEJLyogRG9uJ3QgdHJ5IHRvIGxvb2sgdXAgaG9zdG5hbWUuICAqLworIyBkZWZpbmUgTklfTlVNRVJJQ1NFUlYgMgkvKiBEb24ndCBjb252ZXJ0IHBvcnQgbnVtYmVyIHRvIG5hbWUuICAqLworIyBkZWZpbmUgTklfTk9GUUROCTQJLyogT25seSByZXR1cm4gbm9kZW5hbWUgcG9ydGlvbi4gICovCisjIGRlZmluZSBOSV9OQU1FUkVRRAk4CS8qIERvbid0IHJldHVybiBudW1lcmljIGFkZHJlc3Nlcy4gICovCisjIGRlZmluZSBOSV9ER1JBTQkxNgkvKiBMb29rIHVwIFVEUCBzZXJ2aWNlIHJhdGhlciB0aGFuIFRDUC4gICovCisjIGlmZGVmIF9fVVNFX0dOVQorIyAgZGVmaW5lIE5JX0lETgkzMgkvKiBDb252ZXJ0IG5hbWUgZnJvbSBJRE4gZm9ybWF0LiAgKi8KKyMgIGRlZmluZSBOSV9JRE5fQUxMT1dfVU5BU1NJR05FRCA2NCAvKiBEb24ndCByZWplY3QgdW5hc3NpZ25lZCBVbmljb2RlCisJCQkJCWNvZGUgcG9pbnRzLiAgKi8KKyMgIGRlZmluZSBOSV9JRE5fVVNFX1NURDNfQVNDSUlfUlVMRVMgMTI4IC8qIFZhbGlkYXRlIHN0cmluZ3MgYWNjb3JkaW5nIHRvCisJCQkJCSAgICAgU1REMyBydWxlcy4gICovCisjIGVuZGlmCisKKy8qIFRyYW5zbGF0ZSBuYW1lIG9mIGEgc2VydmljZSBsb2NhdGlvbiBhbmQvb3IgYSBzZXJ2aWNlIG5hbWUgdG8gc2V0IG9mCisgICBzb2NrZXQgYWRkcmVzc2VzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0YWRkcmluZm8gKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zZXJ2aWNlLAorCQkJX19jb25zdCBzdHJ1Y3QgYWRkcmluZm8gKl9fcmVzdHJpY3QgX19yZXEsCisJCQlzdHJ1Y3QgYWRkcmluZm8gKipfX3Jlc3RyaWN0IF9fcGFpKTsKKworLyogRnJlZSBgYWRkcmluZm8nIHN0cnVjdHVyZSBBSSBpbmNsdWRpbmcgYXNzb2NpYXRlZCBzdG9yYWdlLiAgKi8KK2V4dGVybiB2b2lkIGZyZWVhZGRyaW5mbyAoc3RydWN0IGFkZHJpbmZvICpfX2FpKSBfX1RIUk9XOworCisvKiBDb252ZXJ0IGVycm9yIHJldHVybiBmcm9tIGdldGFkZHJpbmZvKCkgdG8gYSBzdHJpbmcuICAqLworZXh0ZXJuIF9fY29uc3QgY2hhciAqZ2FpX3N0cmVycm9yIChpbnQgX19lY29kZSkgX19USFJPVzsKKworLyogVHJhbnNsYXRlIGEgc29ja2V0IGFkZHJlc3MgdG8gYSBsb2NhdGlvbiBhbmQgc2VydmljZSBuYW1lLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0bmFtZWluZm8gKF9fY29uc3Qgc3RydWN0IHNvY2thZGRyICpfX3Jlc3RyaWN0IF9fc2EsCisJCQlzb2NrbGVuX3QgX19zYWxlbiwgY2hhciAqX19yZXN0cmljdCBfX2hvc3QsCisJCQlzb2NrbGVuX3QgX19ob3N0bGVuLCBjaGFyICpfX3Jlc3RyaWN0IF9fc2VydiwKKwkJCXNvY2tsZW5fdCBfX3NlcnZsZW4sIGludCBfX2ZsYWdzKTsKKyNlbmRpZgkvKiBQT1NJWCAqLworCisjaWZkZWYgX19VU0VfR05VCisvKiBFbnF1ZXVlIEVOVCByZXF1ZXN0cyBmcm9tIHRoZSBMSVNULiAgSWYgTU9ERSBpcyBHQUlfV0FJVCB3YWl0IHVudGlsIGFsbAorICAgcmVxdWVzdHMgYXJlIGhhbmRsZWQuICBJZiBXQUlUIGlzIEdBSV9OT1dBSVQgcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyCisgICBxdWV1ZWluZyB0aGUgcmVxdWVzdHMgYW5kIHNpZ25hbCBjb21wbGV0aW9uIGFjY29yZGluZyB0byBTSUcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0YWRkcmluZm9fYSAoaW50IF9fbW9kZSwgc3RydWN0IGdhaWNiICpfX2xpc3RbX19yZXN0cmljdF9hcnJdLAorCQkJICBpbnQgX19lbnQsIHN0cnVjdCBzaWdldmVudCAqX19yZXN0cmljdCBfX3NpZyk7CisKKy8qIFN1c3BlbmQgZXhlY3V0aW9uIG9mIHRoZSB0aHJlYWQgdW50aWwgYXQgbGVhc3Qgb25lIG9mIHRoZSBFTlQgcmVxdWVzdHMKKyAgIGluIExJU1QgaXMgaGFuZGxlZC4gIElmIFRJTUVPVVQgaXMgbm90IGEgbnVsbCBwb2ludGVyIGl0IHNwZWNpZmllcyB0aGUKKyAgIGxvbmdlc3QgdGltZSB0aGUgZnVuY3Rpb24ga2VlcHMgd2FpdGluZyBiZWZvcmUgcmV0dXJuaW5nIHdpdGggYW4gZXJyb3IuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2FpX3N1c3BlbmQgKF9fY29uc3Qgc3RydWN0IGdhaWNiICpfX2NvbnN0IF9fbGlzdFtdLCBpbnQgX19lbnQsCisJCQlfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX190aW1lb3V0KTsKKworLyogR2V0IHRoZSBlcnJvciBzdGF0dXMgb2YgdGhlIHJlcXVlc3QgUkVRLiAgKi8KK2V4dGVybiBpbnQgZ2FpX2Vycm9yIChzdHJ1Y3QgZ2FpY2IgKl9fcmVxKSBfX1RIUk9XOworCisvKiBDYW5jZWwgdGhlIHJlcXVlc3RzIGFzc29jaWF0ZWQgd2l0aCBHQUlDQlAuICAqLworZXh0ZXJuIGludCBnYWlfY2FuY2VsIChzdHJ1Y3QgZ2FpY2IgKl9fZ2FpY2JwKSBfX1RIUk9XOworI2VuZGlmCS8qIEdOVSAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogbmV0ZGIuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRlY29uZXQvZWMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0ZWNvbmV0L2VjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxNjAxYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0ZWNvbmV0L2VjLmgKQEAgLTAsMCArMSw1MiBAQAorLyogRGVmaW5pdGlvbnMgZm9yIHVzZSB3aXRoIExpbnV4IEFGX0VDT05FVCBzb2NrZXRzLgorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ORVRFQ09ORVRfRUNfSAorI2RlZmluZSBfTkVURUNPTkVUX0VDX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3NvY2thZGRyLmg+CisKK3N0cnVjdCBlY19hZGRyCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyIHN0YXRpb247CQkvKiBTdGF0aW9uIG51bWJlci4gICovCisgICAgdW5zaWduZWQgY2hhciBuZXQ7CQkJLyogTmV0d29yayBudW1iZXIuICAqLworICB9OworCitzdHJ1Y3Qgc29ja2FkZHJfZWMKKyAgeworICAgIF9fU09DS0FERFJfQ09NTU9OIChzZWNfKTsKKyAgICB1bnNpZ25lZCBjaGFyIHBvcnQ7CQkJLyogUG9ydCBudW1iZXIuICAqLworICAgIHVuc2lnbmVkIGNoYXIgY2I7CQkJLyogQ29udHJvbC9mbGFnIGJ5dGUuICAqLworICAgIHVuc2lnbmVkIGNoYXIgdHlwZTsJCQkvKiBUeXBlIG9mIG1lc3NhZ2UuICAqLworICAgIHN0cnVjdCBlY19hZGRyIGFkZHI7CisgICAgdW5zaWduZWQgbG9uZyBjb29raWU7CisgIH07CisKKyNkZWZpbmUgRUNUWVBFX1BBQ0tFVF9SRUNFSVZFRAkJMAkvKiBQYWNrZXQgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRUNUWVBFX1RSQU5TTUlUX1NUQVRVUwkJMHgxMAkvKiBUcmFuc21pdCBjb21wbGV0ZWQgKi8KKworI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfT0sJCTEKKyNkZWZpbmUgRUNUWVBFX1RSQU5TTUlUX05PVF9MSVNURU5JTkcJMgorI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfTkVUX0VSUk9SCTMKKyNkZWZpbmUgRUNUWVBFX1RSQU5TTUlUX05PX0NMT0NLCTQKKyNkZWZpbmUgRUNUWVBFX1RSQU5TTUlUX0xJTkVfSkFNTUVECTUKKyNkZWZpbmUgRUNUWVBFX1RSQU5TTUlUX05PVF9QUkVTRU5UCTYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvZXRoZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9ldGhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNzgwZTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvZXRoZXIuaApAQCAtMCwwICsxLDU0IEBACisvKiBGdW5jdGlvbnMgZm9yIHN0b3JpbmcgRXRoZXJuZXQgYWRkcmVzc2VzIGluIEFTQ0lJIGFuZCBtYXBwaW5nIHRvIGhvc3RuYW1lcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9FVEhFUl9ICisjZGVmaW5lIF9ORVRJTkVUX0VUSEVSX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IGRlZmluaXRpb24gb2YgYHN0cnVjdCBldGhlcl9hZGRyJy4gICovCisjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIENvbnZlcnQgNDggYml0IEV0aGVybmV0IEFERFJlc3MgdG8gQVNDSUkuICAqLworZXh0ZXJuIGNoYXIgKmV0aGVyX250b2EgKF9fY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKl9fYWRkcikgX19USFJPVzsKK2V4dGVybiBjaGFyICpldGhlcl9udG9hX3IgKF9fY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKl9fYWRkciwgY2hhciAqX19idWYpCisgICAgIF9fVEhST1c7CisKKy8qIENvbnZlcnQgQVNDSUkgc3RyaW5nIFMgdG8gNDggYml0IEV0aGVybmV0IGFkZHJlc3MuICAqLworZXh0ZXJuIHN0cnVjdCBldGhlcl9hZGRyICpldGhlcl9hdG9uIChfX2NvbnN0IGNoYXIgKl9fYXNjKSBfX1RIUk9XOworZXh0ZXJuIHN0cnVjdCBldGhlcl9hZGRyICpldGhlcl9hdG9uX3IgKF9fY29uc3QgY2hhciAqX19hc2MsCisJCQkJCXN0cnVjdCBldGhlcl9hZGRyICpfX2FkZHIpIF9fVEhST1c7CisKKy8qIE1hcCA0OCBiaXQgRXRoZXJuZXQgbnVtYmVyIEFERFIgdG8gSE9TVE5BTUUuICAqLworZXh0ZXJuIGludCBldGhlcl9udG9ob3N0IChjaGFyICpfX2hvc3RuYW1lLCBfX2NvbnN0IHN0cnVjdCBldGhlcl9hZGRyICpfX2FkZHIpCisgICAgIF9fVEhST1c7CisKKy8qIE1hcCBIT1NUTkFNRSB0byA0OCBiaXQgRXRoZXJuZXQgYWRkcmVzcy4gICovCitleHRlcm4gaW50IGV0aGVyX2hvc3R0b24gKF9fY29uc3QgY2hhciAqX19ob3N0bmFtZSwgc3RydWN0IGV0aGVyX2FkZHIgKl9fYWRkcikKKyAgICAgX19USFJPVzsKKworLyogU2NhbiBMSU5FIGFuZCBzZXQgQUREUiBhbmQgSE9TVE5BTUUuICAqLworZXh0ZXJuIGludCBldGhlcl9saW5lIChfX2NvbnN0IGNoYXIgKl9fbGluZSwgc3RydWN0IGV0aGVyX2FkZHIgKl9fYWRkciwKKwkJICAgICAgIGNoYXIgKl9faG9zdG5hbWUpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBuZXRpbmV0L2V0aGVyLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pY21wNi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2ljbXA2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4OTNkYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pY21wNi5oCkBAIC0wLDAgKzEsMzQ2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywyMDAwLDIwMDYsMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9JQ01QNl9ICisjZGVmaW5lIF9ORVRJTkVUX0lDTVA2X0ggMQorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNkZWZpbmUgSUNNUDZfRklMVEVSIDEKKworI2RlZmluZSBJQ01QNl9GSUxURVJfQkxPQ0sJCTEKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1BBU1MJCTIKKyNkZWZpbmUgSUNNUDZfRklMVEVSX0JMT0NLT1RIRVJTCTMKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1BBU1NPTkxZCQk0CisKK3N0cnVjdCBpY21wNl9maWx0ZXIKKyAgeworICAgIHVpbnQzMl90IGljbXA2X2ZpbHRbOF07CisgIH07CisKK3N0cnVjdCBpY21wNl9oZHIKKyAgeworICAgIHVpbnQ4X3QgICAgIGljbXA2X3R5cGU7ICAgLyogdHlwZSBmaWVsZCAqLworICAgIHVpbnQ4X3QgICAgIGljbXA2X2NvZGU7ICAgLyogY29kZSBmaWVsZCAqLworICAgIHVpbnQxNl90ICAgIGljbXA2X2Nrc3VtOyAgLyogY2hlY2tzdW0gZmllbGQgKi8KKyAgICB1bmlvbgorICAgICAgeworCXVpbnQzMl90ICBpY21wNl91bl9kYXRhMzJbMV07IC8qIHR5cGUtc3BlY2lmaWMgZmllbGQgKi8KKwl1aW50MTZfdCAgaWNtcDZfdW5fZGF0YTE2WzJdOyAvKiB0eXBlLXNwZWNpZmljIGZpZWxkICovCisJdWludDhfdCAgIGljbXA2X3VuX2RhdGE4WzRdOyAgLyogdHlwZS1zcGVjaWZpYyBmaWVsZCAqLworICAgICAgfSBpY21wNl9kYXRhdW47CisgIH07CisKKyNkZWZpbmUgaWNtcDZfZGF0YTMyICAgIGljbXA2X2RhdGF1bi5pY21wNl91bl9kYXRhMzIKKyNkZWZpbmUgaWNtcDZfZGF0YTE2ICAgIGljbXA2X2RhdGF1bi5pY21wNl91bl9kYXRhMTYKKyNkZWZpbmUgaWNtcDZfZGF0YTggICAgIGljbXA2X2RhdGF1bi5pY21wNl91bl9kYXRhOAorI2RlZmluZSBpY21wNl9wcHRyICAgICAgaWNtcDZfZGF0YTMyWzBdICAvKiBwYXJhbWV0ZXIgcHJvYiAqLworI2RlZmluZSBpY21wNl9tdHUgICAgICAgaWNtcDZfZGF0YTMyWzBdICAvKiBwYWNrZXQgdG9vIGJpZyAqLworI2RlZmluZSBpY21wNl9pZCAgICAgICAgaWNtcDZfZGF0YTE2WzBdICAvKiBlY2hvIHJlcXVlc3QvcmVwbHkgKi8KKyNkZWZpbmUgaWNtcDZfc2VxICAgICAgIGljbXA2X2RhdGExNlsxXSAgLyogZWNobyByZXF1ZXN0L3JlcGx5ICovCisjZGVmaW5lIGljbXA2X21heGRlbGF5ICBpY21wNl9kYXRhMTZbMF0gIC8qIG1jYXN0IGdyb3VwIG1lbWJlcnNoaXAgKi8KKworI2RlZmluZSBJQ01QNl9EU1RfVU5SRUFDSCAgICAgICAgICAgICAxCisjZGVmaW5lIElDTVA2X1BBQ0tFVF9UT09fQklHICAgICAgICAgIDIKKyNkZWZpbmUgSUNNUDZfVElNRV9FWENFRURFRCAgICAgICAgICAgMworI2RlZmluZSBJQ01QNl9QQVJBTV9QUk9CICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgSUNNUDZfSU5GT01TR19NQVNLICAweDgwICAgIC8qIGFsbCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzICovCisKKyNkZWZpbmUgSUNNUDZfRUNIT19SRVFVRVNUICAgICAgICAgIDEyOAorI2RlZmluZSBJQ01QNl9FQ0hPX1JFUExZICAgICAgICAgICAgMTI5CisjZGVmaW5lIE1MRF9MSVNURU5FUl9RVUVSWSAgICAgICAgICAxMzAKKyNkZWZpbmUgTUxEX0xJU1RFTkVSX1JFUE9SVCAgICAgICAgIDEzMQorI2RlZmluZSBNTERfTElTVEVORVJfUkVEVUNUSU9OICAgICAgMTMyCisKKyNkZWZpbmUgSUNNUDZfRFNUX1VOUkVBQ0hfTk9ST1VURSAgICAgMCAvKiBubyByb3V0ZSB0byBkZXN0aW5hdGlvbiAqLworI2RlZmluZSBJQ01QNl9EU1RfVU5SRUFDSF9BRE1JTiAgICAgICAxIC8qIGNvbW11bmljYXRpb24gd2l0aCBkZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkbWluaXN0cmF0aXZlbHkgcHJvaGliaXRlZCAqLworI2RlZmluZSBJQ01QNl9EU1RfVU5SRUFDSF9CRVlPTkRTQ09QRSAyIC8qIGJleW9uZCBzY29wZSBvZiBzb3VyY2UgYWRkcmVzcyAqLworI2RlZmluZSBJQ01QNl9EU1RfVU5SRUFDSF9BRERSICAgICAgICAzIC8qIGFkZHJlc3MgdW5yZWFjaGFibGUgKi8KKyNkZWZpbmUgSUNNUDZfRFNUX1VOUkVBQ0hfTk9QT1JUICAgICAgNCAvKiBiYWQgcG9ydCAqLworCisjZGVmaW5lIElDTVA2X1RJTUVfRVhDRUVEX1RSQU5TSVQgICAgIDAgLyogSG9wIExpbWl0ID09IDAgaW4gdHJhbnNpdCAqLworI2RlZmluZSBJQ01QNl9USU1FX0VYQ0VFRF9SRUFTU0VNQkxZICAxIC8qIFJlYXNzZW1ibHkgdGltZSBvdXQgKi8KKworI2RlZmluZSBJQ01QNl9QQVJBTVBST0JfSEVBREVSICAgICAgICAwIC8qIGVycm9uZW91cyBoZWFkZXIgZmllbGQgKi8KKyNkZWZpbmUgSUNNUDZfUEFSQU1QUk9CX05FWFRIRUFERVIgICAgMSAvKiB1bnJlY29nbml6ZWQgTmV4dCBIZWFkZXIgKi8KKyNkZWZpbmUgSUNNUDZfUEFSQU1QUk9CX09QVElPTiAgICAgICAgMiAvKiB1bnJlY29nbml6ZWQgSVB2NiBvcHRpb24gKi8KKworI2RlZmluZSBJQ01QNl9GSUxURVJfV0lMTFBBU1ModHlwZSwgZmlsdGVycCkgXAorCSgoKChmaWx0ZXJwKS0+aWNtcDZfZmlsdFsodHlwZSkgPj4gNV0pICYgKDEgPDwgKCh0eXBlKSAmIDMxKSkpID09IDApCisKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1dJTExCTE9DSyh0eXBlLCBmaWx0ZXJwKSBcCisJKCgoKGZpbHRlcnApLT5pY21wNl9maWx0Wyh0eXBlKSA+PiA1XSkgJiAoMSA8PCAoKHR5cGUpICYgMzEpKSkgIT0gMCkKKworI2RlZmluZSBJQ01QNl9GSUxURVJfU0VUUEFTUyh0eXBlLCBmaWx0ZXJwKSBcCisJKCgoKGZpbHRlcnApLT5pY21wNl9maWx0Wyh0eXBlKSA+PiA1XSkgJj0gfigxIDw8ICgodHlwZSkgJiAzMSkpKSkKKworI2RlZmluZSBJQ01QNl9GSUxURVJfU0VUQkxPQ0sodHlwZSwgZmlsdGVycCkgXAorCSgoKChmaWx0ZXJwKS0+aWNtcDZfZmlsdFsodHlwZSkgPj4gNV0pIHw9ICAoMSA8PCAoKHR5cGUpICYgMzEpKSkpCisKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1NFVFBBU1NBTEwoZmlsdGVycCkgXAorCW1lbXNldCAoZmlsdGVycCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaWNtcDZfZmlsdGVyKSk7CisKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1NFVEJMT0NLQUxMKGZpbHRlcnApIFwKKwltZW1zZXQgKGZpbHRlcnAsIDB4RkYsIHNpemVvZiAoc3RydWN0IGljbXA2X2ZpbHRlcikpOworCisjZGVmaW5lIE5EX1JPVVRFUl9TT0xJQ0lUICAgICAgICAgICAxMzMKKyNkZWZpbmUgTkRfUk9VVEVSX0FEVkVSVCAgICAgICAgICAgIDEzNAorI2RlZmluZSBORF9ORUlHSEJPUl9TT0xJQ0lUICAgICAgICAgMTM1CisjZGVmaW5lIE5EX05FSUdIQk9SX0FEVkVSVCAgICAgICAgICAxMzYKKyNkZWZpbmUgTkRfUkVESVJFQ1QgICAgICAgICAgICAgICAgIDEzNworCitzdHJ1Y3QgbmRfcm91dGVyX3NvbGljaXQgICAgICAvKiByb3V0ZXIgc29saWNpdGF0aW9uICovCisgIHsKKyAgICBzdHJ1Y3QgaWNtcDZfaGRyICBuZF9yc19oZHI7CisgICAgLyogY291bGQgYmUgZm9sbG93ZWQgYnkgb3B0aW9ucyAqLworICB9OworCisjZGVmaW5lIG5kX3JzX3R5cGUgICAgICAgICAgICAgICBuZF9yc19oZHIuaWNtcDZfdHlwZQorI2RlZmluZSBuZF9yc19jb2RlICAgICAgICAgICAgICAgbmRfcnNfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgbmRfcnNfY2tzdW0gICAgICAgICAgICAgIG5kX3JzX2hkci5pY21wNl9ja3N1bQorI2RlZmluZSBuZF9yc19yZXNlcnZlZCAgICAgICAgICAgbmRfcnNfaGRyLmljbXA2X2RhdGEzMlswXQorCitzdHJ1Y3QgbmRfcm91dGVyX2FkdmVydCAgICAgICAvKiByb3V0ZXIgYWR2ZXJ0aXNlbWVudCAqLworICB7CisgICAgc3RydWN0IGljbXA2X2hkciAgbmRfcmFfaGRyOworICAgIHVpbnQzMl90ICAgbmRfcmFfcmVhY2hhYmxlOyAgIC8qIHJlYWNoYWJsZSB0aW1lICovCisgICAgdWludDMyX3QgICBuZF9yYV9yZXRyYW5zbWl0OyAgLyogcmV0cmFuc21pdCB0aW1lciAqLworICAgIC8qIGNvdWxkIGJlIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KKyAgfTsKKworI2RlZmluZSBuZF9yYV90eXBlICAgICAgICAgICAgICAgbmRfcmFfaGRyLmljbXA2X3R5cGUKKyNkZWZpbmUgbmRfcmFfY29kZSAgICAgICAgICAgICAgIG5kX3JhX2hkci5pY21wNl9jb2RlCisjZGVmaW5lIG5kX3JhX2Nrc3VtICAgICAgICAgICAgICBuZF9yYV9oZHIuaWNtcDZfY2tzdW0KKyNkZWZpbmUgbmRfcmFfY3VyaG9wbGltaXQgICAgICAgIG5kX3JhX2hkci5pY21wNl9kYXRhOFswXQorI2RlZmluZSBuZF9yYV9mbGFnc19yZXNlcnZlZCAgICAgbmRfcmFfaGRyLmljbXA2X2RhdGE4WzFdCisjZGVmaW5lIE5EX1JBX0ZMQUdfTUFOQUdFRCAgICAgICAweDgwCisjZGVmaW5lIE5EX1JBX0ZMQUdfT1RIRVIgICAgICAgICAweDQwCisjZGVmaW5lIE5EX1JBX0ZMQUdfSE9NRV9BR0VOVCAgICAweDIwCisjZGVmaW5lIG5kX3JhX3JvdXRlcl9saWZldGltZSAgICBuZF9yYV9oZHIuaWNtcDZfZGF0YTE2WzFdCisKK3N0cnVjdCBuZF9uZWlnaGJvcl9zb2xpY2l0ICAgIC8qIG5laWdoYm9yIHNvbGljaXRhdGlvbiAqLworICB7CisgICAgc3RydWN0IGljbXA2X2hkciAgbmRfbnNfaGRyOworICAgIHN0cnVjdCBpbjZfYWRkciAgIG5kX25zX3RhcmdldDsgLyogdGFyZ2V0IGFkZHJlc3MgKi8KKyAgICAvKiBjb3VsZCBiZSBmb2xsb3dlZCBieSBvcHRpb25zICovCisgIH07CisKKyNkZWZpbmUgbmRfbnNfdHlwZSAgICAgICAgICAgICAgIG5kX25zX2hkci5pY21wNl90eXBlCisjZGVmaW5lIG5kX25zX2NvZGUgICAgICAgICAgICAgICBuZF9uc19oZHIuaWNtcDZfY29kZQorI2RlZmluZSBuZF9uc19ja3N1bSAgICAgICAgICAgICAgbmRfbnNfaGRyLmljbXA2X2Nrc3VtCisjZGVmaW5lIG5kX25zX3Jlc2VydmVkICAgICAgICAgICBuZF9uc19oZHIuaWNtcDZfZGF0YTMyWzBdCisKK3N0cnVjdCBuZF9uZWlnaGJvcl9hZHZlcnQgICAgIC8qIG5laWdoYm9yIGFkdmVydGlzZW1lbnQgKi8KKyAgeworICAgIHN0cnVjdCBpY21wNl9oZHIgIG5kX25hX2hkcjsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgICBuZF9uYV90YXJnZXQ7IC8qIHRhcmdldCBhZGRyZXNzICovCisgICAgLyogY291bGQgYmUgZm9sbG93ZWQgYnkgb3B0aW9ucyAqLworICB9OworCisjZGVmaW5lIG5kX25hX3R5cGUgICAgICAgICAgICAgICBuZF9uYV9oZHIuaWNtcDZfdHlwZQorI2RlZmluZSBuZF9uYV9jb2RlICAgICAgICAgICAgICAgbmRfbmFfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgbmRfbmFfY2tzdW0gICAgICAgICAgICAgIG5kX25hX2hkci5pY21wNl9ja3N1bQorI2RlZmluZSBuZF9uYV9mbGFnc19yZXNlcnZlZCAgICAgbmRfbmFfaGRyLmljbXA2X2RhdGEzMlswXQorI2lmICAgICBCWVRFX09SREVSID09IEJJR19FTkRJQU4KKyNkZWZpbmUgTkRfTkFfRkxBR19ST1VURVIgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTkRfTkFfRkxBR19TT0xJQ0lURUQgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgTkRfTkFfRkxBR19PVkVSUklERSAgICAgIDB4MjAwMDAwMDAKKyNlbHNlICAgLyogQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOICovCisjZGVmaW5lIE5EX05BX0ZMQUdfUk9VVEVSICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIE5EX05BX0ZMQUdfU09MSUNJVEVEICAgICAweDAwMDAwMDQwCisjZGVmaW5lIE5EX05BX0ZMQUdfT1ZFUlJJREUgICAgICAweDAwMDAwMDIwCisjZW5kaWYKKworc3RydWN0IG5kX3JlZGlyZWN0ICAgICAgICAgICAgLyogcmVkaXJlY3QgKi8KKyAgeworICAgIHN0cnVjdCBpY21wNl9oZHIgIG5kX3JkX2hkcjsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgICBuZF9yZF90YXJnZXQ7IC8qIHRhcmdldCBhZGRyZXNzICovCisgICAgc3RydWN0IGluNl9hZGRyICAgbmRfcmRfZHN0OyAgICAvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisgICAgLyogY291bGQgYmUgZm9sbG93ZWQgYnkgb3B0aW9ucyAqLworICB9OworCisjZGVmaW5lIG5kX3JkX3R5cGUgICAgICAgICAgICAgICBuZF9yZF9oZHIuaWNtcDZfdHlwZQorI2RlZmluZSBuZF9yZF9jb2RlICAgICAgICAgICAgICAgbmRfcmRfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgbmRfcmRfY2tzdW0gICAgICAgICAgICAgIG5kX3JkX2hkci5pY21wNl9ja3N1bQorI2RlZmluZSBuZF9yZF9yZXNlcnZlZCAgICAgICAgICAgbmRfcmRfaGRyLmljbXA2X2RhdGEzMlswXQorCitzdHJ1Y3QgbmRfb3B0X2hkciAgICAgICAgICAgICAvKiBOZWlnaGJvciBkaXNjb3Zlcnkgb3B0aW9uIGhlYWRlciAqLworICB7CisgICAgdWludDhfdCAgbmRfb3B0X3R5cGU7CisgICAgdWludDhfdCAgbmRfb3B0X2xlbjsgICAgICAgIC8qIGluIHVuaXRzIG9mIDggb2N0ZXRzICovCisgICAgLyogZm9sbG93ZWQgYnkgb3B0aW9uIHNwZWNpZmljIGRhdGEgKi8KKyAgfTsKKworI2RlZmluZSBORF9PUFRfU09VUkNFX0xJTktBRERSCQkxCisjZGVmaW5lIE5EX09QVF9UQVJHRVRfTElOS0FERFIJCTIKKyNkZWZpbmUgTkRfT1BUX1BSRUZJWF9JTkZPUk1BVElPTgkzCisjZGVmaW5lIE5EX09QVF9SRURJUkVDVEVEX0hFQURFUgk0CisjZGVmaW5lIE5EX09QVF9NVFUJCQk1CisjZGVmaW5lIE5EX09QVF9SVFJfQURWX0lOVEVSVkFMCQk3CisjZGVmaW5lIE5EX09QVF9IT01FX0FHRU5UX0lORk8JCTgKKworc3RydWN0IG5kX29wdF9wcmVmaXhfaW5mbyAgICAgLyogcHJlZml4IGluZm9ybWF0aW9uICovCisgIHsKKyAgICB1aW50OF90ICAgbmRfb3B0X3BpX3R5cGU7CisgICAgdWludDhfdCAgIG5kX29wdF9waV9sZW47CisgICAgdWludDhfdCAgIG5kX29wdF9waV9wcmVmaXhfbGVuOworICAgIHVpbnQ4X3QgICBuZF9vcHRfcGlfZmxhZ3NfcmVzZXJ2ZWQ7CisgICAgdWludDMyX3QgIG5kX29wdF9waV92YWxpZF90aW1lOworICAgIHVpbnQzMl90ICBuZF9vcHRfcGlfcHJlZmVycmVkX3RpbWU7CisgICAgdWludDMyX3QgIG5kX29wdF9waV9yZXNlcnZlZDI7CisgICAgc3RydWN0IGluNl9hZGRyICBuZF9vcHRfcGlfcHJlZml4OworICB9OworCisjZGVmaW5lIE5EX09QVF9QSV9GTEFHX09OTElOSwkweDgwCisjZGVmaW5lIE5EX09QVF9QSV9GTEFHX0FVVE8JMHg0MAorI2RlZmluZSBORF9PUFRfUElfRkxBR19SQUREUgkweDIwCisKK3N0cnVjdCBuZF9vcHRfcmRfaGRyICAgICAgICAgIC8qIHJlZGlyZWN0ZWQgaGVhZGVyICovCisgIHsKKyAgICB1aW50OF90ICAgbmRfb3B0X3JoX3R5cGU7CisgICAgdWludDhfdCAgIG5kX29wdF9yaF9sZW47CisgICAgdWludDE2X3QgIG5kX29wdF9yaF9yZXNlcnZlZDE7CisgICAgdWludDMyX3QgIG5kX29wdF9yaF9yZXNlcnZlZDI7CisgICAgLyogZm9sbG93ZWQgYnkgSVAgaGVhZGVyIGFuZCBkYXRhICovCisgIH07CisKK3N0cnVjdCBuZF9vcHRfbXR1ICAgICAgICAgICAgIC8qIE1UVSBvcHRpb24gKi8KKyAgeworICAgIHVpbnQ4X3QgICBuZF9vcHRfbXR1X3R5cGU7CisgICAgdWludDhfdCAgIG5kX29wdF9tdHVfbGVuOworICAgIHVpbnQxNl90ICBuZF9vcHRfbXR1X3Jlc2VydmVkOworICAgIHVpbnQzMl90ICBuZF9vcHRfbXR1X210dTsKKyAgfTsKKworc3RydWN0IG1sZF9oZHIKKyAgeworICAgIHN0cnVjdCBpY21wNl9oZHIgICAgbWxkX2ljbXA2X2hkcjsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgICAgIG1sZF9hZGRyOyAvKiBtdWx0aWNhc3QgYWRkcmVzcyAqLworICB9OworCisjZGVmaW5lIG1sZF90eXBlICAgICAgICBtbGRfaWNtcDZfaGRyLmljbXA2X3R5cGUKKyNkZWZpbmUgbWxkX2NvZGUgICAgICAgIG1sZF9pY21wNl9oZHIuaWNtcDZfY29kZQorI2RlZmluZSBtbGRfY2tzdW0gICAgICAgbWxkX2ljbXA2X2hkci5pY21wNl9ja3N1bQorI2RlZmluZSBtbGRfbWF4ZGVsYXkgICAgbWxkX2ljbXA2X2hkci5pY21wNl9kYXRhMTZbMF0KKyNkZWZpbmUgbWxkX3Jlc2VydmVkICAgIG1sZF9pY21wNl9oZHIuaWNtcDZfZGF0YTE2WzFdCisKKyNkZWZpbmUgSUNNUDZfUk9VVEVSX1JFTlVNQkVSSU5HICAgIDEzOAorCitzdHJ1Y3QgaWNtcDZfcm91dGVyX3JlbnVtICAgIC8qIHJvdXRlciByZW51bWJlcmluZyBoZWFkZXIgKi8KKyAgeworICAgIHN0cnVjdCBpY21wNl9oZHIgICAgcnJfaGRyOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnJfc2VnbnVtOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnJfZmxhZ3M7CisgICAgdWludDE2X3QgICAgICAgICAgICBycl9tYXhkZWxheTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJyX3Jlc2VydmVkOworICB9OworCisjZGVmaW5lIHJyX3R5cGUJCXJyX2hkci5pY21wNl90eXBlCisjZGVmaW5lIHJyX2NvZGUgICAgICAgICBycl9oZHIuaWNtcDZfY29kZQorI2RlZmluZSBycl9ja3N1bSAgICAgICAgcnJfaGRyLmljbXA2X2Nrc3VtCisjZGVmaW5lIHJyX3NlcW51bSAgICAgICBycl9oZHIuaWNtcDZfZGF0YTMyWzBdCisKKy8qIFJvdXRlciByZW51bWJlcmluZyBmbGFncyAqLworI2RlZmluZSBJQ01QNl9SUl9GTEFHU19URVNUICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgSUNNUDZfUlJfRkxBR1NfUkVRUkVTVUxUICAgICAgICAweDQwCisjZGVmaW5lIElDTVA2X1JSX0ZMQUdTX0ZPUkNFQVBQTFkgICAgICAgMHgyMAorI2RlZmluZSBJQ01QNl9SUl9GTEFHU19TUEVDU0lURSAgICAgICAgIDB4MTAKKyNkZWZpbmUgSUNNUDZfUlJfRkxBR1NfUFJFVkRPTkUgICAgICAgICAweDA4CisKK3N0cnVjdCBycl9wY29fbWF0Y2ggICAgLyogbWF0Y2ggcHJlZml4IHBhcnQgKi8KKyAgeworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnBtX2NvZGU7CisgICAgdWludDhfdCAgICAgICAgICAgICBycG1fbGVuOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnBtX29yZGluYWw7CisgICAgdWludDhfdCAgICAgICAgICAgICBycG1fbWF0Y2hsZW47CisgICAgdWludDhfdCAgICAgICAgICAgICBycG1fbWlubGVuOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnBtX21heGxlbjsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIHJwbV9yZXNlcnZlZDsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgICAgIHJwbV9wcmVmaXg7CisgIH07CisKKy8qIFBDTyBjb2RlIHZhbHVlcyAqLworI2RlZmluZSBSUE1fUENPX0FERCAgICAgICAgICAgICAxCisjZGVmaW5lIFJQTV9QQ09fQ0hBTkdFICAgICAgICAgIDIKKyNkZWZpbmUgUlBNX1BDT19TRVRHTE9CQUwgICAgICAgMworCitzdHJ1Y3QgcnJfcGNvX3VzZSAgICAgIC8qIHVzZSBwcmVmaXggcGFydCAqLworICB7CisgICAgdWludDhfdCAgICAgICAgICAgICBycHVfdXNlbGVuOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnB1X2tlZXBsZW47CisgICAgdWludDhfdCAgICAgICAgICAgICBycHVfcmFtYXNrOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnB1X3JhZmxhZ3M7CisgICAgdWludDMyX3QgICAgICAgICAgICBycHVfdmx0aW1lOworICAgIHVpbnQzMl90ICAgICAgICAgICAgcnB1X3BsdGltZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJwdV9mbGFnczsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgICAgIHJwdV9wcmVmaXg7CisgIH07CisKKyNkZWZpbmUgSUNNUDZfUlJfUENPVVNFX1JBRkxBR1NfT05MSU5LICAweDIwCisjZGVmaW5lIElDTVA2X1JSX1BDT1VTRV9SQUZMQUdTX0FVVE8gICAgMHgxMAorCisjaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisjIGRlZmluZSBJQ01QNl9SUl9QQ09VU0VfRkxBR1NfREVDUlZMVElNRSAweDgwMDAwMDAwCisjIGRlZmluZSBJQ01QNl9SUl9QQ09VU0VfRkxBR1NfREVDUlBMVElNRSAweDQwMDAwMDAwCisjZWxpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIElDTVA2X1JSX1BDT1VTRV9GTEFHU19ERUNSVkxUSU1FIDB4ODAKKyMgZGVmaW5lIElDTVA2X1JSX1BDT1VTRV9GTEFHU19ERUNSUExUSU1FIDB4NDAKKyNlbmRpZgorCitzdHJ1Y3QgcnJfcmVzdWx0ICAgICAgIC8qIHJvdXRlciByZW51bWJlcmluZyByZXN1bHQgbWVzc2FnZSAqLworICB7CisgICAgdWludDE2X3QgICAgICAgICAgICBycnJfZmxhZ3M7CisgICAgdWludDhfdCAgICAgICAgICAgICBycnJfb3JkaW5hbDsKKyAgICB1aW50OF90ICAgICAgICAgICAgIHJycl9tYXRjaGVkbGVuOworICAgIHVpbnQzMl90ICAgICAgICAgICAgcnJyX2lmaWQ7CisgICAgc3RydWN0IGluNl9hZGRyICAgICBycnJfcHJlZml4OworICB9OworCisjaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisjIGRlZmluZSBJQ01QNl9SUl9SRVNVTFRfRkxBR1NfT09CICAgICAgIDB4MDAwMgorIyBkZWZpbmUgSUNNUDZfUlJfUkVTVUxUX0ZMQUdTX0ZPUkJJRERFTiAweDAwMDEKKyNlbGlmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorIyBkZWZpbmUgSUNNUDZfUlJfUkVTVUxUX0ZMQUdTX09PQiAgICAgICAweDAyMDAKKyMgZGVmaW5lIElDTVA2X1JSX1JFU1VMVF9GTEFHU19GT1JCSURERU4gMHgwMTAwCisjZW5kaWYKKworLyogTW9iaWxlIElQdjYgZXh0ZW5zaW9uOiBBZHZlcnRpc2VtZW50IEludGVydmFsLiAgKi8KK3N0cnVjdCBuZF9vcHRfYWR2X2ludGVydmFsCisgIHsKKyAgICB1aW50OF90ICAgbmRfb3B0X2Fkdl9pbnRlcnZhbF90eXBlOworICAgIHVpbnQ4X3QgICBuZF9vcHRfYWR2X2ludGVydmFsX2xlbjsKKyAgICB1aW50MTZfdCAgbmRfb3B0X2Fkdl9pbnRlcnZhbF9yZXNlcnZlZDsKKyAgICB1aW50MzJfdCAgbmRfb3B0X2Fkdl9pbnRlcnZhbF9pdmFsOworICB9OworCisvKiBNb2JpbGUgSVB2NiBleHRlbnNpb246IEhvbWUgQWdlbnQgSW5mby4gICovCitzdHJ1Y3QgbmRfb3B0X2hvbWVfYWdlbnRfaW5mbworICB7CisgICAgdWludDhfdCAgIG5kX29wdF9ob21lX2FnZW50X2luZm9fdHlwZTsKKyAgICB1aW50OF90ICAgbmRfb3B0X2hvbWVfYWdlbnRfaW5mb19sZW47CisgICAgdWludDE2X3QgIG5kX29wdF9ob21lX2FnZW50X2luZm9fcmVzZXJ2ZWQ7CisgICAgdWludDE2X3QgIG5kX29wdF9ob21lX2FnZW50X2luZm9fcHJlZmVyZW5jZTsKKyAgICB1aW50MTZfdCAgbmRfb3B0X2hvbWVfYWdlbnRfaW5mb19saWZldGltZTsKKyAgfTsKKworI2VuZGlmIC8qIG5ldGluZXQvaWNtcHY2LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZl9ldGhlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX2V0aGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFkYjU5YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZl9ldGhlci5oCkBAIC0wLDAgKzEsMTA1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19ORVRJTkVUX0lGX0VUSEVSX0gKKworI2RlZmluZSBfX05FVElORVRfSUZfRVRIRVJfSAkxCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogR2V0IGRlZmluaXRpb25zIGZyb20ga2VybmVsIGhlYWRlciBmaWxlLiAgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCisjaWZkZWYgX19VU0VfQlNECisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWlmX2V0aGVyLmgJOC4zIChCZXJrZWxleSkgNS8yLzk1CisgKgkkRnJlZUJTRCQKKyAqLworCisjaW5jbHVkZSA8bmV0L2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorCitfX0JFR0lOX0RFQ0xTCisvKgorICogRXRoZXJuZXQgQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sLgorICoKKyAqIFNlZSBSRkMgODI2IGZvciBwcm90b2NvbCBkZXNjcmlwdGlvbi4gIFN0cnVjdHVyZSBiZWxvdyBpcyBhZGFwdGVkCisgKiB0byByZXNvbHZpbmcgaW50ZXJuZXQgYWRkcmVzc2VzLiAgRmllbGQgbmFtZXMgdXNlZCBjb3JyZXNwb25kIHRvCisgKiBSRkMgODI2LgorICovCitzdHJ1Y3QJZXRoZXJfYXJwIHsKKwlzdHJ1Y3QJYXJwaGRyIGVhX2hkcjsJCS8qIGZpeGVkLXNpemUgaGVhZGVyICovCisJdV9pbnQ4X3QgYXJwX3NoYVtFVEhfQUxFTl07CS8qIHNlbmRlciBoYXJkd2FyZSBhZGRyZXNzICovCisJdV9pbnQ4X3QgYXJwX3NwYVs0XTsJCS8qIHNlbmRlciBwcm90b2NvbCBhZGRyZXNzICovCisJdV9pbnQ4X3QgYXJwX3RoYVtFVEhfQUxFTl07CS8qIHRhcmdldCBoYXJkd2FyZSBhZGRyZXNzICovCisJdV9pbnQ4X3QgYXJwX3RwYVs0XTsJCS8qIHRhcmdldCBwcm90b2NvbCBhZGRyZXNzICovCit9OworI2RlZmluZQlhcnBfaHJkCWVhX2hkci5hcl9ocmQKKyNkZWZpbmUJYXJwX3BybwllYV9oZHIuYXJfcHJvCisjZGVmaW5lCWFycF9obG4JZWFfaGRyLmFyX2hsbgorI2RlZmluZQlhcnBfcGxuCWVhX2hkci5hcl9wbG4KKyNkZWZpbmUJYXJwX29wCWVhX2hkci5hcl9vcAorCisvKgorICogTWFjcm8gdG8gbWFwIGFuIElQIG11bHRpY2FzdCBhZGRyZXNzIHRvIGFuIEV0aGVybmV0IG11bHRpY2FzdCBhZGRyZXNzLgorICogVGhlIGhpZ2gtb3JkZXIgMjUgYml0cyBvZiB0aGUgRXRoZXJuZXQgYWRkcmVzcyBhcmUgc3RhdGljYWxseSBhc3NpZ25lZCwKKyAqIGFuZCB0aGUgbG93LW9yZGVyIDIzIGJpdHMgYXJlIHRha2VuIGZyb20gdGhlIGxvdyBlbmQgb2YgdGhlIElQIGFkZHJlc3MuCisgKi8KKyNkZWZpbmUgRVRIRVJfTUFQX0lQX01VTFRJQ0FTVChpcGFkZHIsIGVuYWRkcikgXAorCS8qIHN0cnVjdCBpbl9hZGRyICppcGFkZHI7ICovIFwKKwkvKiB1X2NoYXIgZW5hZGRyW0VUSF9BTEVOXTsJICAgKi8gXAoreyBcCisJKGVuYWRkcilbMF0gPSAweDAxOyBcCisJKGVuYWRkcilbMV0gPSAweDAwOyBcCisJKGVuYWRkcilbMl0gPSAweDVlOyBcCisJKGVuYWRkcilbM10gPSAoKHVfaW50OF90ICopaXBhZGRyKVsxXSAmIDB4N2Y7IFwKKwkoZW5hZGRyKVs0XSA9ICgodV9pbnQ4X3QgKilpcGFkZHIpWzJdOyBcCisJKGVuYWRkcilbNV0gPSAoKHVfaW50OF90ICopaXBhZGRyKVszXTsgXAorfQorCitfX0VORF9ERUNMUworI2VuZGlmIC8qIF9fVVNFX0JTRCAqLworCisjZW5kaWYgLyogbmV0aW5ldC9pZl9ldGhlci5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaWZfZmRkaS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX2ZkZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQ1ZjBhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX2ZkZGkuaApAQCAtMCwwICsxLDM4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVElORVRfSUZfRkRESV9ICisjZGVmaW5lCV9ORVRJTkVUX0lGX0ZERElfSCAxCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZmRkaS5oPgorCisjaWZkZWYgX19VU0VfQlNECisKK3N0cnVjdCBmZGRpX2hlYWRlciB7CisgIHVfaW50OF90IGZkZGlfZmM7ICAgICAgICAgICAgICAgICAgICAvKiBGcmFtZSBDb250cm9sIChGQykgdmFsdWUgKi8KKyAgdV9pbnQ4X3QgZmRkaV9kaG9zdFtGRERJX0tfQUxFTl07ICAgIC8qIERlc3RpbmF0aW9uIGhvc3QgKi8KKyAgdV9pbnQ4X3QgZmRkaV9zaG9zdFtGRERJX0tfQUxFTl07ICAgIC8qIFNvdXJjZSBob3N0ICovCit9OworI2VuZGlmCisKKyNlbmRpZgkvKiBuZXRpbmV0L2lmX2ZkZGkuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX3RyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaWZfdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWMzOTExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX3RyLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9JRl9UUl9ICisjZGVmaW5lCV9ORVRJTkVUX0lGX1RSX0ggMQorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIElFRUUgODAyLjUgVG9rZW4tUmluZyBtYWdpYyBjb25zdGFudHMuICBUaGUgZnJhbWUgc2l6ZXMgb21pdCB0aGUgcHJlYW1ibGUKKyAgIGFuZCBGQ1MvQ1JDIChmcmFtZSBjaGVjayBzZXF1ZW5jZSkuICovCisjZGVmaW5lIFRSX0FMRU4JCTYJCS8qIE9jdGV0cyBpbiBvbmUgdG9rZW4tcmluZyBhZGRyICovCisjZGVmaW5lIFRSX0hMRU4gCShzaXplb2YgKHN0cnVjdCB0cmhfaGRyKSArIHNpemVvZiAoc3RydWN0IHRybGxjKSkKKyNkZWZpbmUgQUMJCTB4MTAKKyNkZWZpbmUgTExDX0ZSQU1FIAkweDQwCisKKy8qIExMQyBhbmQgU05BUCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRVhURU5ERURfU0FQIAkweEFBCisjZGVmaW5lIFVJX0NNRCAgICAgICAJMHgwMworCisvKiBUaGlzIGlzIGFuIFRva2VuLVJpbmcgZnJhbWUgaGVhZGVyLiAqLworc3RydWN0IHRyaF9oZHIKK3sKKyAgdV9pbnQ4X3QgIGFjOwkJCS8qIGFjY2VzcyBjb250cm9sIGZpZWxkICovCisgIHVfaW50OF90ICBmYzsJCQkvKiBmcmFtZSBjb250cm9sIGZpZWxkICovCisgIHVfaW50OF90ICBkYWRkcltUUl9BTEVOXTsJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworICB1X2ludDhfdCAgc2FkZHJbVFJfQUxFTl07CS8qIHNvdXJjZSBhZGRyZXNzICovCisgIHVfaW50MTZfdCByY2Y7CQkvKiByb3V0ZSBjb250cm9sIGZpZWxkICovCisgIHVfaW50MTZfdCByc2VnWzhdOwkJLyogcm91dGluZyByZWdpc3RlcnMgKi8KK307CisKKy8qIFRoaXMgaXMgYW4gVG9rZW4tUmluZyBMTEMgc3RydWN0dXJlICovCitzdHJ1Y3QgdHJsbGMKK3sKKyAgdV9pbnQ4X3QgIGRzYXA7CQkvKiBkZXN0aW5hdGlvbiBTQVAgKi8KKyAgdV9pbnQ4X3QgIHNzYXA7CQkvKiBzb3VyY2UgU0FQICovCisgIHVfaW50OF90ICBsbGM7CQkvKiBMTEMgY29udHJvbCBmaWVsZCAqLworICB1X2ludDhfdCAgcHJvdGlkWzNdOwkJLyogcHJvdG9jb2wgaWQgKi8KKyAgdV9pbnQxNl90IGV0aGVydHlwZTsJCS8qIGV0aGVyIHR5cGUgZmllbGQgKi8KK307CisKKy8qIFRva2VuLVJpbmcgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGRhdGEuICovCitzdHJ1Y3QgdHJfc3RhdGlzdGljcworeworICB1bnNpZ25lZCBsb25nIHJ4X3BhY2tldHM7ICAgICAvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkCSovCisgIHVuc2lnbmVkIGxvbmcgdHhfcGFja2V0czsJLyogdG90YWwgcGFja2V0cyB0cmFuc21pdHRlZAkqLworICB1bnNpZ25lZCBsb25nIHJ4X2J5dGVzOwkvKiB0b3RhbCBieXRlcyByZWNlaXZlZCAgIAkqLworICB1bnNpZ25lZCBsb25nIHR4X2J5dGVzOwkvKiB0b3RhbCBieXRlcyB0cmFuc21pdHRlZAkqLworICB1bnNpZ25lZCBsb25nIHJ4X2Vycm9yczsJLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQJCSovCisgIHVuc2lnbmVkIGxvbmcgdHhfZXJyb3JzOwkvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMJKi8KKyAgdW5zaWduZWQgbG9uZyByeF9kcm9wcGVkOwkvKiBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzCSovCisgIHVuc2lnbmVkIGxvbmcgdHhfZHJvcHBlZDsJLyogbm8gc3BhY2UgYXZhaWxhYmxlIGluIGxpbnV4CSovCisgIHVuc2lnbmVkIGxvbmcgbXVsdGljYXN0OwkvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAkqLworICB1bnNpZ25lZCBsb25nIHRyYW5zbWl0X2NvbGxpc2lvbjsKKworICAvKiBkZXRhaWxlZCBUb2tlbi1SaW5nIGVycm9ycy4gU2VlIElCTSBUb2tlbi1SaW5nIE5ldHdvcmsKKyAgICAgQXJjaGl0ZWN0dXJlIGZvciBtb3JlIGluZm8gKi8KKworICB1bnNpZ25lZCBsb25nIGxpbmVfZXJyb3JzOworICB1bnNpZ25lZCBsb25nIGludGVybmFsX2Vycm9yczsKKyAgdW5zaWduZWQgbG9uZyBidXJzdF9lcnJvcnM7CisgIHVuc2lnbmVkIGxvbmcgQV9DX2Vycm9yczsKKyAgdW5zaWduZWQgbG9uZyBhYm9ydF9kZWxpbWl0ZXJzOworICB1bnNpZ25lZCBsb25nIGxvc3RfZnJhbWVzOworICB1bnNpZ25lZCBsb25nIHJlY3ZfY29uZ2VzdF9jb3VudDsKKyAgdW5zaWduZWQgbG9uZyBmcmFtZV9jb3BpZWRfZXJyb3JzOworICB1bnNpZ25lZCBsb25nIGZyZXF1ZW5jeV9lcnJvcnM7CisgIHVuc2lnbmVkIGxvbmcgdG9rZW5fZXJyb3JzOworICB1bnNpZ25lZCBsb25nIGR1bW15MTsKK307CisKKy8qIHNvdXJjZSByb3V0aW5nIHN0dWZmICovCisjZGVmaW5lIFRSX1JJSSAJCQkweDgwCisjZGVmaW5lIFRSX1JDRl9ESVJfQklUIAkJMHg4MAorI2RlZmluZSBUUl9SQ0ZfTEVOX01BU0sgCTB4MWYwMAorI2RlZmluZSBUUl9SQ0ZfQlJPQURDQVNUIAkweDgwMDAJLyogYWxsLXJvdXRlcyBicm9hZGNhc3QgKi8KKyNkZWZpbmUgVFJfUkNGX0xJTUlURURfQlJPQURDQVNUIDB4QzAwMAkvKiBzaW5nbGUtcm91dGUgYnJvYWRjYXN0ICovCisjZGVmaW5lIFRSX1JDRl9GUkFNRTJLIAkJMHgyMAorI2RlZmluZSBUUl9SQ0ZfQlJPQURDQVNUX01BU0sgCTB4QzAwMAorI2RlZmluZSBUUl9NQVhSSUZMRU4gCQkxOAorCisjaWZkZWYgX19VU0VfQlNECisKK3N0cnVjdCB0cm5faGRyCit7CisgIHVfaW50OF90IHRybl9hYzsgICAgICAgICAgICAgICAgLyogYWNjZXNzIGNvbnRyb2wgZmllbGQgKi8KKyAgdV9pbnQ4X3QgdHJuX2ZjOyAgICAgICAgICAgICAgICAvKiBmaWVsZCBjb250cm9sIGZpZWxkICovCisgIHVfaW50OF90IHRybl9kaG9zdFtUUl9BTEVOXTsgICAgLyogZGVzdGluYXRpb24gaG9zdCAqLworICB1X2ludDhfdCB0cm5fc2hvc3RbVFJfQUxFTl07ICAgIC8qIHNvdXJjZSBob3N0ICovCisgIHVfaW50MTZfdCB0cm5fcmNmOyAgICAgICAgICAgICAgLyogcm91dGUgY29udHJvbCBmaWVsZCAqLworICB1X2ludDE2X3QgdHJuX3JzZWdbOF07ICAgICAgICAgIC8qIHJvdXRpbmcgcmVnaXN0ZXJzICovCit9OworCisjZW5kaWYKKworI2VuZGlmCS8qIG5ldGluZXQvaWZfdHIuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lnbXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZ21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczOTZiYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZ21wLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9JR01QX0gKKyNkZWZpbmUJX05FVElORVRfSUdNUF9IIDEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWZkZWYgX19VU0VfQlNECisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCBTdGVwaGVuIERlZXJpbmcuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIFN0ZXBoZW4gRGVlcmluZyBvZiBTdGFuZm9yZCBVbml2ZXJzaXR5LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaWdtcC5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqCSRGcmVlQlNEJAorICovCisKK3N0cnVjdCBpZ21wIHsKKyAgdV9pbnQ4X3QgaWdtcF90eXBlOyAgICAgICAgICAgICAvKiBJR01QIHR5cGUgKi8KKyAgdV9pbnQ4X3QgaWdtcF9jb2RlOyAgICAgICAgICAgICAvKiByb3V0aW5nIGNvZGUgKi8KKyAgdV9pbnQxNl90IGlnbXBfY2tzdW07ICAgICAgICAgICAvKiBjaGVja3N1bSAqLworICBzdHJ1Y3QgaW5fYWRkciBpZ21wX2dyb3VwOyAgICAgIC8qIGdyb3VwIGFkZHJlc3MgKi8KK307CisKKyNkZWZpbmUgSUdNUF9NSU5MRU4JCQk4CisKKy8qCisgKiBNZXNzYWdlIHR5cGVzLCBpbmNsdWRpbmcgdmVyc2lvbiBudW1iZXIuCisgKi8KKyNkZWZpbmUgSUdNUF9NRU1CRVJTSElQX1FVRVJZICAgCTB4MTEJLyogbWVtYmVyc2hpcCBxdWVyeSAgICAgICAgICovCisjZGVmaW5lIElHTVBfVjFfTUVNQkVSU0hJUF9SRVBPUlQJMHgxMgkvKiBWZXIuIDEgbWVtYmVyc2hpcCByZXBvcnQgKi8KKyNkZWZpbmUgSUdNUF9WMl9NRU1CRVJTSElQX1JFUE9SVAkweDE2CS8qIFZlci4gMiBtZW1iZXJzaGlwIHJlcG9ydCAqLworI2RlZmluZSBJR01QX1YyX0xFQVZFX0dST1VQCQkweDE3CS8qIExlYXZlLWdyb3VwIG1lc3NhZ2UJICAgICovCisKKyNkZWZpbmUgSUdNUF9EVk1SUAkJCTB4MTMJLyogRFZNUlAgcm91dGluZyBtZXNzYWdlICAgICovCisjZGVmaW5lIElHTVBfUElNCQkJMHgxNAkvKiBQSU0gcm91dGluZyBtZXNzYWdlICAgICAgKi8KKyNkZWZpbmUgSUdNUF9UUkFDRQkJCTB4MTUKKworI2RlZmluZSBJR01QX01UUkFDRV9SRVNQCQkweDFlCS8qIHRyYWNlcm91dGUgcmVzcC4odG8gc2VuZGVyKSovCisjZGVmaW5lIElHTVBfTVRSQUNFCQkJMHgxZgkvKiBtY2FzdCB0cmFjZXJvdXRlIG1lc3NhZ2VzICAqLworCisjZGVmaW5lIElHTVBfTUFYX0hPU1RfUkVQT1JUX0RFTEFZCTEwCS8qIG1heCBkZWxheSBmb3IgcmVzcG9uc2UgdG8gICAgICovCisJCQkJCQkvKiAgcXVlcnkgKGluIHNlY29uZHMpIGFjY29yZGluZyAqLworCQkJCQkJLyogIHRvIFJGQzExMTIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSUdNUF9USU1FUl9TQ0FMRQkJMTAJLyogZGVub3RlcyB0aGF0IHRoZSBpZ21wIGNvZGUgZmllbGQgKi8KKwkJCQkJCS8qIHNwZWNpZmllcyB0aW1lIGluIDEwdGggb2Ygc2Vjb25kcyovCisKKy8qCisgKiBTdGF0ZXMgZm9yIHRoZSBJR01QIHYyIHN0YXRlIHRhYmxlLgorICovCisjZGVmaW5lIElHTVBfREVMQVlJTkdfTUVNQkVSCTEKKyNkZWZpbmUgSUdNUF9JRExFX01FTUJFUgkyCisjZGVmaW5lIElHTVBfTEFaWV9NRU1CRVIJMworI2RlZmluZSBJR01QX1NMRUVQSU5HX01FTUJFUgk0CisjZGVmaW5lIElHTVBfQVdBS0VOSU5HX01FTUJFUgk1CisKKy8qCisgKiBTdGF0ZXMgZm9yIElHTVAgcm91dGVyIHZlcnNpb24gY2FjaGUuCisgKi8KKyNkZWZpbmUgSUdNUF92MV9ST1VURVIJCTEKKyNkZWZpbmUgSUdNUF92Ml9ST1VURVIJCTIKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZm91ciBkZWZpbmluaXRpb25zIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgKiBUaGV5IHNob3VsZCBiZSByZW1vdmVkIGFzIHNvb24gYXMgYWxsIGFwcGxpY2F0aW9ucyBhcmUgdXBkYXRlZCB0bworICogdXNlIHRoZSBuZXcgY29uc3RhbnQgbmFtZXMuCisgKi8KKyNkZWZpbmUgSUdNUF9IT1NUX01FTUJFUlNISVBfUVVFUlkJSUdNUF9NRU1CRVJTSElQX1FVRVJZCisjZGVmaW5lIElHTVBfSE9TVF9NRU1CRVJTSElQX1JFUE9SVAlJR01QX1YxX01FTUJFUlNISVBfUkVQT1JUCisjZGVmaW5lIElHTVBfSE9TVF9ORVdfTUVNQkVSU0hJUF9SRVBPUlQJSUdNUF9WMl9NRU1CRVJTSElQX1JFUE9SVAorI2RlZmluZSBJR01QX0hPU1RfTEVBVkVfTUVTU0FHRQkJSUdNUF9WMl9MRUFWRV9HUk9VUAorCitfX0VORF9ERUNMUworCisjZW5kaWYKKworI2VuZGlmCS8qIG5ldGluZXQvaWdtcC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMmMxODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaApAQCAtMCwwICsxLDYxOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTIwMDEsIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9ORVRJTkVUX0lOX0gKKyNkZWZpbmUJX05FVElORVRfSU5fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBTdGFuZGFyZCB3ZWxsLWRlZmluZWQgSVAgcHJvdG9jb2xzLiAgKi8KK2VudW0KKyAgeworICAgIElQUFJPVE9fSVAgPSAwLAkgICAvKiBEdW1teSBwcm90b2NvbCBmb3IgVENQLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19JUAkJSVBQUk9UT19JUAorICAgIElQUFJPVE9fSE9QT1BUUyA9IDAsICAgLyogSVB2NiBIb3AtYnktSG9wIG9wdGlvbnMuICAqLworI2RlZmluZSBJUFBST1RPX0hPUE9QVFMJCUlQUFJPVE9fSE9QT1BUUworICAgIElQUFJPVE9fSUNNUCA9IDEsCSAgIC8qIEludGVybmV0IENvbnRyb2wgTWVzc2FnZSBQcm90b2NvbC4gICovCisjZGVmaW5lIElQUFJPVE9fSUNNUAkJSVBQUk9UT19JQ01QCisgICAgSVBQUk9UT19JR01QID0gMiwJICAgLyogSW50ZXJuZXQgR3JvdXAgTWFuYWdlbWVudCBQcm90b2NvbC4gKi8KKyNkZWZpbmUgSVBQUk9UT19JR01QCQlJUFBST1RPX0lHTVAKKyAgICBJUFBST1RPX0lQSVAgPSA0LAkgICAvKiBJUElQIHR1bm5lbHMgKG9sZGVyIEtBOVEgdHVubmVscyB1c2UgOTQpLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19JUElQCQlJUFBST1RPX0lQSVAKKyAgICBJUFBST1RPX1RDUCA9IDYsCSAgIC8qIFRyYW5zbWlzc2lvbiBDb250cm9sIFByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19UQ1AJCUlQUFJPVE9fVENQCisgICAgSVBQUk9UT19FR1AgPSA4LAkgICAvKiBFeHRlcmlvciBHYXRld2F5IFByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19FR1AJCUlQUFJPVE9fRUdQCisgICAgSVBQUk9UT19QVVAgPSAxMiwJICAgLyogUFVQIHByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19QVVAJCUlQUFJPVE9fUFVQCisgICAgSVBQUk9UT19VRFAgPSAxNywJICAgLyogVXNlciBEYXRhZ3JhbSBQcm90b2NvbC4gICovCisjZGVmaW5lIElQUFJPVE9fVURQCQlJUFBST1RPX1VEUAorICAgIElQUFJPVE9fSURQID0gMjIsCSAgIC8qIFhOUyBJRFAgcHJvdG9jb2wuICAqLworI2RlZmluZSBJUFBST1RPX0lEUAkJSVBQUk9UT19JRFAKKyAgICBJUFBST1RPX1RQID0gMjksCSAgIC8qIFNPIFRyYW5zcG9ydCBQcm90b2NvbCBDbGFzcyA0LiAgKi8KKyNkZWZpbmUgSVBQUk9UT19UUAkJSVBQUk9UT19UUAorICAgIElQUFJPVE9fRENDUCA9IDMzLAkgICAvKiBEYXRhZ3JhbSBDb25nZXN0aW9uIENvbnRyb2wgUHJvdG9jb2wuICAqLworI2RlZmluZSBJUFBST1RPX0RDQ1AJCUlQUFJPVE9fRENDUAorICAgIElQUFJPVE9fSVBWNiA9IDQxLCAgICAgLyogSVB2NiBoZWFkZXIuICAqLworI2RlZmluZSBJUFBST1RPX0lQVjYJCUlQUFJPVE9fSVBWNgorICAgIElQUFJPVE9fUk9VVElORyA9IDQzLCAgLyogSVB2NiByb3V0aW5nIGhlYWRlci4gICovCisjZGVmaW5lIElQUFJPVE9fUk9VVElORwkJSVBQUk9UT19ST1VUSU5HCisgICAgSVBQUk9UT19GUkFHTUVOVCA9IDQ0LCAvKiBJUHY2IGZyYWdtZW50YXRpb24gaGVhZGVyLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19GUkFHTUVOVAlJUFBST1RPX0ZSQUdNRU5UCisgICAgSVBQUk9UT19SU1ZQID0gNDYsCSAgIC8qIFJlc2VydmF0aW9uIFByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19SU1ZQCQlJUFBST1RPX1JTVlAKKyAgICBJUFBST1RPX0dSRSA9IDQ3LAkgICAvKiBHZW5lcmFsIFJvdXRpbmcgRW5jYXBzdWxhdGlvbi4gICovCisjZGVmaW5lIElQUFJPVE9fR1JFCQlJUFBST1RPX0dSRQorICAgIElQUFJPVE9fRVNQID0gNTAsICAgICAgLyogZW5jYXBzdWxhdGluZyBzZWN1cml0eSBwYXlsb2FkLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19FU1AJCUlQUFJPVE9fRVNQCisgICAgSVBQUk9UT19BSCA9IDUxLCAgICAgICAvKiBhdXRoZW50aWNhdGlvbiBoZWFkZXIuICAqLworI2RlZmluZSBJUFBST1RPX0FICQlJUFBST1RPX0FICisgICAgSVBQUk9UT19JQ01QVjYgPSA1OCwgICAvKiBJQ01QdjYuICAqLworI2RlZmluZSBJUFBST1RPX0lDTVBWNgkJSVBQUk9UT19JQ01QVjYKKyAgICBJUFBST1RPX05PTkUgPSA1OSwgICAgIC8qIElQdjYgbm8gbmV4dCBoZWFkZXIuICAqLworI2RlZmluZSBJUFBST1RPX05PTkUJCUlQUFJPVE9fTk9ORQorICAgIElQUFJPVE9fRFNUT1BUUyA9IDYwLCAgLyogSVB2NiBkZXN0aW5hdGlvbiBvcHRpb25zLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19EU1RPUFRTCQlJUFBST1RPX0RTVE9QVFMKKyAgICBJUFBST1RPX01UUCA9IDkyLAkgICAvKiBNdWx0aWNhc3QgVHJhbnNwb3J0IFByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19NVFAJCUlQUFJPVE9fTVRQCisgICAgSVBQUk9UT19FTkNBUCA9IDk4LAkgICAvKiBFbmNhcHN1bGF0aW9uIEhlYWRlci4gICovCisjZGVmaW5lIElQUFJPVE9fRU5DQVAJCUlQUFJPVE9fRU5DQVAKKyAgICBJUFBST1RPX1BJTSA9IDEwMywJICAgLyogUHJvdG9jb2wgSW5kZXBlbmRlbnQgTXVsdGljYXN0LiAgKi8KKyNkZWZpbmUgSVBQUk9UT19QSU0JCUlQUFJPVE9fUElNCisgICAgSVBQUk9UT19DT01QID0gMTA4LAkgICAvKiBDb21wcmVzc2lvbiBIZWFkZXIgUHJvdG9jb2wuICAqLworI2RlZmluZSBJUFBST1RPX0NPTVAJCUlQUFJPVE9fQ09NUAorICAgIElQUFJPVE9fU0NUUCA9IDEzMiwJICAgLyogU3RyZWFtIENvbnRyb2wgVHJhbnNtaXNzaW9uIFByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19TQ1RQCQlJUFBST1RPX1NDVFAKKyAgICBJUFBST1RPX1VEUExJVEUgPSAxMzYsIC8qIFVEUC1MaXRlIHByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19VRFBMSVRFCQlJUFBST1RPX1VEUExJVEUKKyAgICBJUFBST1RPX1JBVyA9IDI1NSwJICAgLyogUmF3IElQIHBhY2tldHMuICAqLworI2RlZmluZSBJUFBST1RPX1JBVwkJSVBQUk9UT19SQVcKKyAgICBJUFBST1RPX01BWAorICB9OworCisKKy8qIFR5cGUgdG8gcmVwcmVzZW50IGEgcG9ydC4gICovCit0eXBlZGVmIHVpbnQxNl90IGluX3BvcnRfdDsKKworLyogU3RhbmRhcmQgd2VsbC1rbm93biBwb3J0cy4gICovCitlbnVtCisgIHsKKyAgICBJUFBPUlRfRUNITyA9IDcsCQkvKiBFY2hvIHNlcnZpY2UuICAqLworICAgIElQUE9SVF9ESVNDQVJEID0gOSwJCS8qIERpc2NhcmQgdHJhbnNtaXNzaW9ucyBzZXJ2aWNlLiAgKi8KKyAgICBJUFBPUlRfU1lTVEFUID0gMTEsCQkvKiBTeXN0ZW0gc3RhdHVzIHNlcnZpY2UuICAqLworICAgIElQUE9SVF9EQVlUSU1FID0gMTMsCS8qIFRpbWUgb2YgZGF5IHNlcnZpY2UuICAqLworICAgIElQUE9SVF9ORVRTVEFUID0gMTUsCS8qIE5ldHdvcmsgc3RhdHVzIHNlcnZpY2UuICAqLworICAgIElQUE9SVF9GVFAgPSAyMSwJCS8qIEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wuICAqLworICAgIElQUE9SVF9URUxORVQgPSAyMywJCS8qIFRlbG5ldCBwcm90b2NvbC4gICovCisgICAgSVBQT1JUX1NNVFAgPSAyNSwJCS8qIFNpbXBsZSBNYWlsIFRyYW5zZmVyIFByb3RvY29sLiAgKi8KKyAgICBJUFBPUlRfVElNRVNFUlZFUiA9IDM3LAkvKiBUaW1lc2VydmVyIHNlcnZpY2UuICAqLworICAgIElQUE9SVF9OQU1FU0VSVkVSID0gNDIsCS8qIERvbWFpbiBOYW1lIFNlcnZpY2UuICAqLworICAgIElQUE9SVF9XSE9JUyA9IDQzLAkJLyogSW50ZXJuZXQgV2hvaXMgc2VydmljZS4gICovCisgICAgSVBQT1JUX01UUCA9IDU3LAorCisgICAgSVBQT1JUX1RGVFAgPSA2OSwJCS8qIFRyaXZpYWwgRmlsZSBUcmFuc2ZlciBQcm90b2NvbC4gICovCisgICAgSVBQT1JUX1JKRSA9IDc3LAorICAgIElQUE9SVF9GSU5HRVIgPSA3OSwJCS8qIEZpbmdlciBzZXJ2aWNlLiAgKi8KKyAgICBJUFBPUlRfVFRZTElOSyA9IDg3LAorICAgIElQUE9SVF9TVVBEVVAgPSA5NSwJCS8qIFNVUERVUCBwcm90b2NvbC4gICovCisKKworICAgIElQUE9SVF9FWEVDU0VSVkVSID0gNTEyLAkvKiBleGVjZCBzZXJ2aWNlLiAgKi8KKyAgICBJUFBPUlRfTE9HSU5TRVJWRVIgPSA1MTMsCS8qIHJsb2dpbmQgc2VydmljZS4gICovCisgICAgSVBQT1JUX0NNRFNFUlZFUiA9IDUxNCwKKyAgICBJUFBPUlRfRUZTU0VSVkVSID0gNTIwLAorCisgICAgLyogVURQIHBvcnRzLiAgKi8KKyAgICBJUFBPUlRfQklGRlVEUCA9IDUxMiwKKyAgICBJUFBPUlRfV0hPU0VSVkVSID0gNTEzLAorICAgIElQUE9SVF9ST1VURVNFUlZFUiA9IDUyMCwKKworICAgIC8qIFBvcnRzIGxlc3MgdGhhbiB0aGlzIHZhbHVlIGFyZSByZXNlcnZlZCBmb3IgcHJpdmlsZWdlZCBwcm9jZXNzZXMuICAqLworICAgIElQUE9SVF9SRVNFUlZFRCA9IDEwMjQsCisKKyAgICAvKiBQb3J0cyBncmVhdGVyIHRoaXMgdmFsdWUgYXJlIHJlc2VydmVkIGZvciAobm9uLXByaXZpbGVnZWQpIHNlcnZlcnMuICAqLworICAgIElQUE9SVF9VU0VSUkVTRVJWRUQgPSA1MDAwCisgIH07CisKKworLyogSW50ZXJuZXQgYWRkcmVzcy4gICovCit0eXBlZGVmIHVpbnQzMl90IGluX2FkZHJfdDsKK3N0cnVjdCBpbl9hZGRyCisgIHsKKyAgICBpbl9hZGRyX3Qgc19hZGRyOworICB9OworCisKKy8qIERlZmluaXRpb25zIG9mIHRoZSBiaXRzIGluIGFuIEludGVybmV0IGFkZHJlc3MgaW50ZWdlci4KKworICAgT24gc3VibmV0cywgaG9zdCBhbmQgbmV0d29yayBwYXJ0cyBhcmUgZm91bmQgYWNjb3JkaW5nIHRvCisgICB0aGUgc3VibmV0IG1hc2ssIG5vdCB0aGVzZSBtYXNrcy4gICovCisKKyNkZWZpbmUJSU5fQ0xBU1NBKGEpCQkoKCgoaW5fYWRkcl90KShhKSkgJiAweDgwMDAwMDAwKSA9PSAwKQorI2RlZmluZQlJTl9DTEFTU0FfTkVUCQkweGZmMDAwMDAwCisjZGVmaW5lCUlOX0NMQVNTQV9OU0hJRlQJMjQKKyNkZWZpbmUJSU5fQ0xBU1NBX0hPU1QJCSgweGZmZmZmZmZmICYgfklOX0NMQVNTQV9ORVQpCisjZGVmaW5lCUlOX0NMQVNTQV9NQVgJCTEyOAorCisjZGVmaW5lCUlOX0NMQVNTQihhKQkJKCgoKGluX2FkZHJfdCkoYSkpICYgMHhjMDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkKKyNkZWZpbmUJSU5fQ0xBU1NCX05FVAkJMHhmZmZmMDAwMAorI2RlZmluZQlJTl9DTEFTU0JfTlNISUZUCTE2CisjZGVmaW5lCUlOX0NMQVNTQl9IT1NUCQkoMHhmZmZmZmZmZiAmIH5JTl9DTEFTU0JfTkVUKQorI2RlZmluZQlJTl9DTEFTU0JfTUFYCQk2NTUzNgorCisjZGVmaW5lCUlOX0NMQVNTQyhhKQkJKCgoKGluX2FkZHJfdCkoYSkpICYgMHhlMDAwMDAwMCkgPT0gMHhjMDAwMDAwMCkKKyNkZWZpbmUJSU5fQ0xBU1NDX05FVAkJMHhmZmZmZmYwMAorI2RlZmluZQlJTl9DTEFTU0NfTlNISUZUCTgKKyNkZWZpbmUJSU5fQ0xBU1NDX0hPU1QJCSgweGZmZmZmZmZmICYgfklOX0NMQVNTQ19ORVQpCisKKyNkZWZpbmUJSU5fQ0xBU1NEKGEpCQkoKCgoaW5fYWRkcl90KShhKSkgJiAweGYwMDAwMDAwKSA9PSAweGUwMDAwMDAwKQorI2RlZmluZQlJTl9NVUxUSUNBU1QoYSkJCUlOX0NMQVNTRChhKQorCisjZGVmaW5lCUlOX0VYUEVSSU1FTlRBTChhKQkoKCgoaW5fYWRkcl90KShhKSkgJiAweGUwMDAwMDAwKSA9PSAweGUwMDAwMDAwKQorI2RlZmluZQlJTl9CQURDTEFTUyhhKQkJKCgoKGluX2FkZHJfdCkoYSkpICYgMHhmMDAwMDAwMCkgPT0gMHhmMDAwMDAwMCkKKworLyogQWRkcmVzcyB0byBhY2NlcHQgYW55IGluY29taW5nIG1lc3NhZ2VzLiAgKi8KKyNkZWZpbmUJSU5BRERSX0FOWQkJKChpbl9hZGRyX3QpIDB4MDAwMDAwMDApCisvKiBBZGRyZXNzIHRvIHNlbmQgdG8gYWxsIGhvc3RzLiAgKi8KKyNkZWZpbmUJSU5BRERSX0JST0FEQ0FTVAkoKGluX2FkZHJfdCkgMHhmZmZmZmZmZikKKy8qIEFkZHJlc3MgaW5kaWNhdGluZyBhbiBlcnJvciByZXR1cm4uICAqLworI2RlZmluZQlJTkFERFJfTk9ORQkJKChpbl9hZGRyX3QpIDB4ZmZmZmZmZmYpCisKKy8qIE5ldHdvcmsgbnVtYmVyIGZvciBsb2NhbCBob3N0IGxvb3BiYWNrLiAgKi8KKyNkZWZpbmUJSU5fTE9PUEJBQ0tORVQJCTEyNworLyogQWRkcmVzcyB0byBsb29wYmFjayBpbiBzb2Z0d2FyZSB0byBsb2NhbCBob3N0LiAgKi8KKyNpZm5kZWYgSU5BRERSX0xPT1BCQUNLCisjIGRlZmluZSBJTkFERFJfTE9PUEJBQ0sJKChpbl9hZGRyX3QpIDB4N2YwMDAwMDEpIC8qIEluZXQgMTI3LjAuMC4xLiAgKi8KKyNlbmRpZgorCisvKiBEZWZpbmVzIGZvciBNdWx0aWNhc3QgSU5BRERSLiAgKi8KKyNkZWZpbmUgSU5BRERSX1VOU1BFQ19HUk9VUAkoKGluX2FkZHJfdCkgMHhlMDAwMDAwMCkgLyogMjI0LjAuMC4wICovCisjZGVmaW5lIElOQUREUl9BTExIT1NUU19HUk9VUAkoKGluX2FkZHJfdCkgMHhlMDAwMDAwMSkgLyogMjI0LjAuMC4xICovCisjZGVmaW5lIElOQUREUl9BTExSVFJTX0dST1VQICAgICgoaW5fYWRkcl90KSAweGUwMDAwMDAyKSAvKiAyMjQuMC4wLjIgKi8KKyNkZWZpbmUgSU5BRERSX01BWF9MT0NBTF9HUk9VUCAgKChpbl9hZGRyX3QpIDB4ZTAwMDAwZmYpIC8qIDIyNC4wLjAuMjU1ICovCisKKworLyogSVB2NiBhZGRyZXNzICovCitzdHJ1Y3QgaW42X2FkZHIKKyAgeworICAgIHVuaW9uCisgICAgICB7CisJdWludDhfdAlfX3U2X2FkZHI4WzE2XTsKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKwl1aW50MTZfdCBfX3U2X2FkZHIxNls4XTsKKwl1aW50MzJfdCBfX3U2X2FkZHIzMls0XTsKKyNlbmRpZgorICAgICAgfSBfX2luNl91OworI2RlZmluZSBzNl9hZGRyCQkJX19pbjZfdS5fX3U2X2FkZHI4CisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfR05VCisjIGRlZmluZSBzNl9hZGRyMTYJCV9faW42X3UuX191Nl9hZGRyMTYKKyMgZGVmaW5lIHM2X2FkZHIzMgkJX19pbjZfdS5fX3U2X2FkZHIzMgorI2VuZGlmCisgIH07CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgaW42YWRkcl9hbnk7ICAgICAgICAvKiA6OiAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbjZfYWRkciBpbjZhZGRyX2xvb3BiYWNrOyAgIC8qIDo6MSAqLworI2RlZmluZSBJTjZBRERSX0FOWV9JTklUIHsgeyB7IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfSB9IH0KKyNkZWZpbmUgSU42QUREUl9MT09QQkFDS19JTklUIHsgeyB7IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEgfSB9IH0KKworI2RlZmluZSBJTkVUX0FERFJTVFJMRU4gMTYKKyNkZWZpbmUgSU5FVDZfQUREUlNUUkxFTiA0NgorCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGFuIEludGVybmV0IHNvY2tldCBhZGRyZXNzLiAgKi8KK3N0cnVjdCBzb2NrYWRkcl9pbgorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHNpbl8pOworICAgIGluX3BvcnRfdCBzaW5fcG9ydDsJCQkvKiBQb3J0IG51bWJlci4gICovCisgICAgc3RydWN0IGluX2FkZHIgc2luX2FkZHI7CQkvKiBJbnRlcm5ldCBhZGRyZXNzLiAgKi8KKworICAgIC8qIFBhZCB0byBzaXplIG9mIGBzdHJ1Y3Qgc29ja2FkZHInLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNpbl96ZXJvW3NpemVvZiAoc3RydWN0IHNvY2thZGRyKSAtCisJCQkgICBfX1NPQ0tBRERSX0NPTU1PTl9TSVpFIC0KKwkJCSAgIHNpemVvZiAoaW5fcG9ydF90KSAtCisJCQkgICBzaXplb2YgKHN0cnVjdCBpbl9hZGRyKV07CisgIH07CisKKy8qIERpdHRvLCBmb3IgSVB2Ni4gICovCitzdHJ1Y3Qgc29ja2FkZHJfaW42CisgIHsKKyAgICBfX1NPQ0tBRERSX0NPTU1PTiAoc2luNl8pOworICAgIGluX3BvcnRfdCBzaW42X3BvcnQ7CS8qIFRyYW5zcG9ydCBsYXllciBwb3J0ICMgKi8KKyAgICB1aW50MzJfdCBzaW42X2Zsb3dpbmZvOwkvKiBJUHY2IGZsb3cgaW5mb3JtYXRpb24gKi8KKyAgICBzdHJ1Y3QgaW42X2FkZHIgc2luNl9hZGRyOwkvKiBJUHY2IGFkZHJlc3MgKi8KKyAgICB1aW50MzJfdCBzaW42X3Njb3BlX2lkOwkvKiBJUHY2IHNjb3BlLWlkICovCisgIH07CisKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0dOVQorLyogSVB2NCBtdWx0aWNhc3QgcmVxdWVzdC4gICovCitzdHJ1Y3QgaXBfbXJlcQorICB7CisgICAgLyogSVAgbXVsdGljYXN0IGFkZHJlc3Mgb2YgZ3JvdXAuICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltcl9tdWx0aWFkZHI7CisKKyAgICAvKiBMb2NhbCBJUCBhZGRyZXNzIG9mIGludGVyZmFjZS4gICovCisgICAgc3RydWN0IGluX2FkZHIgaW1yX2ludGVyZmFjZTsKKyAgfTsKKworc3RydWN0IGlwX21yZXFfc291cmNlCisgIHsKKyAgICAvKiBJUCBtdWx0aWNhc3QgYWRkcmVzcyBvZiBncm91cC4gICovCisgICAgc3RydWN0IGluX2FkZHIgaW1yX211bHRpYWRkcjsKKworICAgIC8qIElQIGFkZHJlc3Mgb2Ygc291cmNlLiAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpbXJfaW50ZXJmYWNlOworCisgICAgLyogSVAgYWRkcmVzcyBvZiBpbnRlcmZhY2UuICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltcl9zb3VyY2VhZGRyOworICB9OworI2VuZGlmCisKKworLyogTGlrZXdpc2UsIGZvciBJUHY2LiAgKi8KK3N0cnVjdCBpcHY2X21yZXEKKyAgeworICAgIC8qIElQdjYgbXVsdGljYXN0IGFkZHJlc3Mgb2YgZ3JvdXAgKi8KKyAgICBzdHJ1Y3QgaW42X2FkZHIgaXB2Nm1yX211bHRpYWRkcjsKKworICAgIC8qIGxvY2FsIGludGVyZmFjZSAqLworICAgIHVuc2lnbmVkIGludCBpcHY2bXJfaW50ZXJmYWNlOworICB9OworCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKy8qIE11bHRpY2FzdCBncm91cCByZXF1ZXN0LiAgKi8KK3N0cnVjdCBncm91cF9yZXEKKyAgeworICAgIC8qIEludGVyZmFjZSBpbmRleC4gICovCisgICAgdWludDMyX3QgZ3JfaW50ZXJmYWNlOworCisgICAgLyogR3JvdXAgYWRkcmVzcy4gICovCisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZ3JfZ3JvdXA7CisgIH07CisKK3N0cnVjdCBncm91cF9zb3VyY2VfcmVxCisgIHsKKyAgICAvKiBJbnRlcmZhY2UgaW5kZXguICAqLworICAgIHVpbnQzMl90IGdzcl9pbnRlcmZhY2U7CisKKyAgICAvKiBHcm91cCBhZGRyZXNzLiAgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBnc3JfZ3JvdXA7CisKKyAgICAvKiBTb3VyY2UgYWRkcmVzcy4gICovCisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZ3NyX3NvdXJjZTsKKyAgfTsKKworCisvKiBGdWxsLXN0YXRlIGZpbHRlciBvcGVyYXRpb25zLiAgKi8KK3N0cnVjdCBpcF9tc2ZpbHRlcgorICB7CisgICAgLyogSVAgbXVsdGljYXN0IGFkZHJlc3Mgb2YgZ3JvdXAuICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltc2ZfbXVsdGlhZGRyOworCisgICAgLyogTG9jYWwgSVAgYWRkcmVzcyBvZiBpbnRlcmZhY2UuICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltc2ZfaW50ZXJmYWNlOworCisgICAgLyogRmlsdGVyIG1vZGUuICAqLworICAgIHVpbnQzMl90IGltc2ZfZm1vZGU7CisKKyAgICAvKiBOdW1iZXIgb2Ygc291cmNlIGFkZHJlc3Nlcy4gICovCisgICAgdWludDMyX3QgaW1zZl9udW1zcmM7CisgICAgLyogU291cmNlIGFkZHJlc3Nlcy4gICovCisgICAgc3RydWN0IGluX2FkZHIgaW1zZl9zbGlzdFsxXTsKKyAgfTsKKworI2RlZmluZSBJUF9NU0ZJTFRFUl9TSVpFKG51bXNyYykgKHNpemVvZiAoc3RydWN0IGlwX21zZmlsdGVyKSBcCisJCQkJICAtIHNpemVvZiAoc3RydWN0IGluX2FkZHIpCQkgICAgICBcCisJCQkJICArIChudW1zcmMpICogc2l6ZW9mIChzdHJ1Y3QgaW5fYWRkcikpCisKK3N0cnVjdCBncm91cF9maWx0ZXIKKyAgeworICAgIC8qIEludGVyZmFjZSBpbmRleC4gICovCisgICAgdWludDMyX3QgZ2ZfaW50ZXJmYWNlOworCisgICAgLyogR3JvdXAgYWRkcmVzcy4gICovCisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZ2ZfZ3JvdXA7CisKKyAgICAvKiBGaWx0ZXIgbW9kZS4gICovCisgICAgdWludDMyX3QgZ2ZfZm1vZGU7CisKKyAgICAvKiBOdW1iZXIgb2Ygc291cmNlIGFkZHJlc3Nlcy4gICovCisgICAgdWludDMyX3QgZ2ZfbnVtc3JjOworICAgIC8qIFNvdXJjZSBhZGRyZXNzZXMuICAqLworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGdmX3NsaXN0WzFdOworfTsKKworI2RlZmluZSBHUk9VUF9GSUxURVJfU0laRShudW1zcmMpIChzaXplb2YgKHN0cnVjdCBncm91cF9maWx0ZXIpIFwKKwkJCQkgICAtIHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpCSAgICAgIFwKKwkJCQkgICArICgobnVtc3JjKQkJCQkgICAgICBcCisJCQkJICAgICAgKiBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSkpCisjZW5kaWYKKworCisvKiBHZXQgc3lzdGVtLXNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KKyNpbmNsdWRlIDxiaXRzL2luLmg+CisKKy8qIEZ1bmN0aW9ucyB0byBjb252ZXJ0IGJldHdlZW4gaG9zdCBhbmQgbmV0d29yayBieXRlIG9yZGVyLgorCisgICBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBub3JtYWxseSB0YWtlIGB1bnNpZ25lZCBsb25nIGludCcgb3IKKyAgIGB1bnNpZ25lZCBzaG9ydCBpbnQnIHZhbHVlcyBhcyBhcmd1bWVudHMgYW5kIGFsc28gcmV0dXJuIHRoZW0uICBCdXQKKyAgIHRoaXMgd2FzIGEgc2hvcnQtc2lnaHRlZCBkZWNpc2lvbiBzaW5jZSBvbiBkaWZmZXJlbnQgc3lzdGVtcyB0aGUgdHlwZXMKKyAgIG1heSBoYXZlIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbnMgYnV0IHRoZSB2YWx1ZXMgYXJlIGFsd2F5cyB0aGUgc2FtZS4gICovCisKK2V4dGVybiB1aW50MzJfdCBudG9obCAodWludDMyX3QgX19uZXRsb25nKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKK2V4dGVybiB1aW50MTZfdCBudG9ocyAodWludDE2X3QgX19uZXRzaG9ydCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CitleHRlcm4gdWludDMyX3QgaHRvbmwgKHVpbnQzMl90IF9faG9zdGxvbmcpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworZXh0ZXJuIHVpbnQxNl90IGh0b25zICh1aW50MTZfdCBfX2hvc3RzaG9ydCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworLyogR2V0IG1hY2hpbmUgZGVwZW5kZW50IG9wdGltaXplZCB2ZXJzaW9ucyBvZiBieXRlIHN3YXBwaW5nIGZ1bmN0aW9ucy4gICovCisjaW5jbHVkZSA8Yml0cy9ieXRlc3dhcC5oPgorCisjaWZkZWYgX19PUFRJTUlaRV9fCisvKiBXZSBjYW4gb3B0aW1pemUgY2FsbHMgdG8gdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zLiAgRWl0aGVyIG5vdGhpbmcgaGFzCisgICB0byBiZSBkb25lIG9yIHdlIGFyZSB1c2luZyBkaXJlY3RseSB0aGUgYnl0ZS1zd2FwcGluZyBmdW5jdGlvbnMgd2hpY2gKKyAgIG9mdGVuIGNhbiBiZSBpbmxpbmVkLiAgKi8KKyMgaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorLyogVGhlIGhvc3QgYnl0ZSBvcmRlciBpcyB0aGUgc2FtZSBhcyBuZXR3b3JrIGJ5dGUgb3JkZXIsCisgICBzbyB0aGVzZSBmdW5jdGlvbnMgYXJlIGFsbCBqdXN0IGlkZW50aXR5LiAgKi8KKyMgZGVmaW5lIG50b2hsKHgpCSh4KQorIyBkZWZpbmUgbnRvaHMoeCkJKHgpCisjIGRlZmluZSBodG9ubCh4KQkoeCkKKyMgZGVmaW5lIGh0b25zKHgpCSh4KQorIyBlbHNlCisjICBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICAgZGVmaW5lIG50b2hsKHgpCV9fYnN3YXBfMzIgKHgpCisjICAgZGVmaW5lIG50b2hzKHgpCV9fYnN3YXBfMTYgKHgpCisjICAgZGVmaW5lIGh0b25sKHgpCV9fYnN3YXBfMzIgKHgpCisjICAgZGVmaW5lIGh0b25zKHgpCV9fYnN3YXBfMTYgKHgpCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgSU42X0lTX0FERFJfVU5TUEVDSUZJRUQoYSkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBfX2NvbnN0IHN0cnVjdCBpbjZfYWRkciAqX19hID0gKF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICopIChhKTsJICAgICAgXAorICAgICAgX19hLT5zNl9hZGRyMzJbMF0gPT0gMAkJCQkJCSAgICAgIFwKKyAgICAgICYmIF9fYS0+czZfYWRkcjMyWzFdID09IDAJCQkJCQkgICAgICBcCisgICAgICAmJiBfX2EtPnM2X2FkZHIzMlsyXSA9PSAwCQkJCQkJICAgICAgXAorICAgICAgJiYgX19hLT5zNl9hZGRyMzJbM10gPT0gMDsgfSkpCisKKyMgZGVmaW5lIElONl9JU19BRERSX0xPT1BCQUNLKGEpIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgX19jb25zdCBzdHJ1Y3QgaW42X2FkZHIgKl9fYSA9IChfX2NvbnN0IHN0cnVjdCBpbjZfYWRkciAqKSAoYSk7CSAgICAgIFwKKyAgICAgIF9fYS0+czZfYWRkcjMyWzBdID09IDAJCQkJCQkgICAgICBcCisgICAgICAmJiBfX2EtPnM2X2FkZHIzMlsxXSA9PSAwCQkJCQkJICAgICAgXAorICAgICAgJiYgX19hLT5zNl9hZGRyMzJbMl0gPT0gMAkJCQkJCSAgICAgIFwKKyAgICAgICYmIF9fYS0+czZfYWRkcjMyWzNdID09IGh0b25sICgxKTsgfSkpCisKKyMgZGVmaW5lIElONl9JU19BRERSX0xJTktMT0NBTChhKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICpfX2EgPSAoX19jb25zdCBzdHJ1Y3QgaW42X2FkZHIgKikgKGEpOwkgICAgICBcCisgICAgICAoX19hLT5zNl9hZGRyMzJbMF0gJiBodG9ubCAoMHhmZmMwMDAwMCkpID09IGh0b25sICgweGZlODAwMDAwKTsgfSkpCisKKyMgZGVmaW5lIElONl9JU19BRERSX1NJVEVMT0NBTChhKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICpfX2EgPSAoX19jb25zdCBzdHJ1Y3QgaW42X2FkZHIgKikgKGEpOwkgICAgICBcCisgICAgICAoX19hLT5zNl9hZGRyMzJbMF0gJiBodG9ubCAoMHhmZmMwMDAwMCkpID09IGh0b25sICgweGZlYzAwMDAwKTsgfSkpCisKKyMgZGVmaW5lIElONl9JU19BRERSX1Y0TUFQUEVEKGEpIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgX19jb25zdCBzdHJ1Y3QgaW42X2FkZHIgKl9fYSA9IChfX2NvbnN0IHN0cnVjdCBpbjZfYWRkciAqKSAoYSk7CSAgICAgIFwKKyAgICAgIF9fYS0+czZfYWRkcjMyWzBdID09IDAJCQkJCQkgICAgICBcCisgICAgICAmJiBfX2EtPnM2X2FkZHIzMlsxXSA9PSAwCQkJCQkJICAgICAgXAorICAgICAgJiYgX19hLT5zNl9hZGRyMzJbMl0gPT0gaHRvbmwgKDB4ZmZmZik7IH0pKQorCisjIGRlZmluZSBJTjZfSVNfQUREUl9WNENPTVBBVChhKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICpfX2EgPSAoX19jb25zdCBzdHJ1Y3QgaW42X2FkZHIgKikgKGEpOwkgICAgICBcCisgICAgICBfX2EtPnM2X2FkZHIzMlswXSA9PSAwCQkJCQkJICAgICAgXAorICAgICAgJiYgX19hLT5zNl9hZGRyMzJbMV0gPT0gMAkJCQkJCSAgICAgIFwKKyAgICAgICYmIF9fYS0+czZfYWRkcjMyWzJdID09IDAJCQkJCQkgICAgICBcCisgICAgICAmJiBudG9obCAoX19hLT5zNl9hZGRyMzJbM10pID4gMTsgfSkpCisKKyMgZGVmaW5lIElONl9BUkVfQUREUl9FUVVBTChhLGIpIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgX19jb25zdCBzdHJ1Y3QgaW42X2FkZHIgKl9fYSA9IChfX2NvbnN0IHN0cnVjdCBpbjZfYWRkciAqKSAoYSk7CSAgICAgIFwKKyAgICAgIF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICpfX2IgPSAoX19jb25zdCBzdHJ1Y3QgaW42X2FkZHIgKikgKGIpOwkgICAgICBcCisgICAgICBfX2EtPnM2X2FkZHIzMlswXSA9PSBfX2ItPnM2X2FkZHIzMlswXQkJCQkgICAgICBcCisgICAgICAmJiBfX2EtPnM2X2FkZHIzMlsxXSA9PSBfX2ItPnM2X2FkZHIzMlsxXQkJCQkgICAgICBcCisgICAgICAmJiBfX2EtPnM2X2FkZHIzMlsyXSA9PSBfX2ItPnM2X2FkZHIzMlsyXQkJCQkgICAgICBcCisgICAgICAmJiBfX2EtPnM2X2FkZHIzMlszXSA9PSBfX2ItPnM2X2FkZHIzMlszXTsgfSkpCisjZWxzZQorIyBkZWZpbmUgSU42X0lTX0FERFJfVU5TUEVDSUZJRUQoYSkgXAorCSgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVswXSA9PSAwCQkJCSAgICAgIFwKKwkgJiYgKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMV0gPT0gMAkJCQkgICAgICBcCisJICYmICgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzJdID09IDAJCQkJICAgICAgXAorCSAmJiAoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVszXSA9PSAwKQorCisjIGRlZmluZSBJTjZfSVNfQUREUl9MT09QQkFDSyhhKSBcCisJKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzBdID09IDAJCQkJICAgICAgXAorCSAmJiAoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVsxXSA9PSAwCQkJCSAgICAgIFwKKwkgJiYgKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMl0gPT0gMAkJCQkgICAgICBcCisJICYmICgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzNdID09IGh0b25sICgxKSkKKworIyBkZWZpbmUgSU42X0lTX0FERFJfTElOS0xPQ0FMKGEpIFwKKwkoKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzBdICYgaHRvbmwgKDB4ZmZjMDAwMDApKQkJICAgICAgXAorCSA9PSBodG9ubCAoMHhmZTgwMDAwMCkpCisKKyMgZGVmaW5lIElONl9JU19BRERSX1NJVEVMT0NBTChhKSBcCisJKCgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVswXSAmIGh0b25sICgweGZmYzAwMDAwKSkJCSAgICAgIFwKKwkgPT0gaHRvbmwgKDB4ZmVjMDAwMDApKQorCisjIGRlZmluZSBJTjZfSVNfQUREUl9WNE1BUFBFRChhKSBcCisJKCgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVswXSA9PSAwKQkJCQkgICAgICBcCisJICYmICgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVsxXSA9PSAwKQkJCSAgICAgIFwKKwkgJiYgKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzJdID09IGh0b25sICgweGZmZmYpKSkKKworIyBkZWZpbmUgSU42X0lTX0FERFJfVjRDT01QQVQoYSkgXAorCSgoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMF0gPT0gMCkJCQkJICAgICAgXAorCSAmJiAoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMV0gPT0gMCkJCQkgICAgICBcCisJICYmICgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVsyXSA9PSAwKQkJCSAgICAgIFwKKwkgJiYgKG50b2hsICgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVszXSkgPiAxKSkKKworIyBkZWZpbmUgSU42X0FSRV9BRERSX0VRVUFMKGEsYikgXAorCSgoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMF0gPT0gKChfX2NvbnN0IHVpbnQzMl90ICopIChiKSlbMF0pICAgICBcCisJICYmICgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVsxXSA9PSAoKF9fY29uc3QgdWludDMyX3QgKikgKGIpKVsxXSkgIFwKKwkgJiYgKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzJdID09ICgoX19jb25zdCB1aW50MzJfdCAqKSAoYikpWzJdKSAgXAorCSAmJiAoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbM10gPT0gKChfX2NvbnN0IHVpbnQzMl90ICopIChiKSlbM10pKQorI2VuZGlmCisKKyNkZWZpbmUgSU42X0lTX0FERFJfTVVMVElDQVNUKGEpICgoKF9fY29uc3QgdWludDhfdCAqKSAoYSkpWzBdID09IDB4ZmYpCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKy8qIEJpbmQgc29ja2V0IHRvIGEgcHJpdmlsZWdlZCBJUCBwb3J0LiAgKi8KK2V4dGVybiBpbnQgYmluZHJlc3Zwb3J0IChpbnQgX19zb2NrZmQsIHN0cnVjdCBzb2NrYWRkcl9pbiAqX19zb2NrX2luKSBfX1RIUk9XOworCisvKiBUaGUgSVB2NiB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24uICAqLworZXh0ZXJuIGludCBiaW5kcmVzdnBvcnQ2IChpbnQgX19zb2NrZmQsIHN0cnVjdCBzb2NrYWRkcl9pbjYgKl9fc29ja19pbikKKyAgICAgX19USFJPVzsKKyNlbmRpZgorCisKKyNkZWZpbmUgSU42X0lTX0FERFJfTUNfTk9ERUxPQ0FMKGEpIFwKKwkoSU42X0lTX0FERFJfTVVMVElDQVNUKGEpCQkJCQkgICAgICBcCisJICYmICgoKChfX2NvbnN0IHVpbnQ4X3QgKikgKGEpKVsxXSAmIDB4ZikgPT0gMHgxKSkKKworI2RlZmluZSBJTjZfSVNfQUREUl9NQ19MSU5LTE9DQUwoYSkgXAorCShJTjZfSVNfQUREUl9NVUxUSUNBU1QoYSkJCQkJCSAgICAgIFwKKwkgJiYgKCgoKF9fY29uc3QgdWludDhfdCAqKSAoYSkpWzFdICYgMHhmKSA9PSAweDIpKQorCisjZGVmaW5lIElONl9JU19BRERSX01DX1NJVEVMT0NBTChhKSBcCisJKElONl9JU19BRERSX01VTFRJQ0FTVChhKQkJCQkJICAgICAgXAorCSAmJiAoKCgoX19jb25zdCB1aW50OF90ICopIChhKSlbMV0gJiAweGYpID09IDB4NSkpCisKKyNkZWZpbmUgSU42X0lTX0FERFJfTUNfT1JHTE9DQUwoYSkgXAorCShJTjZfSVNfQUREUl9NVUxUSUNBU1QoYSkJCQkJCSAgICAgIFwKKwkgJiYgKCgoKF9fY29uc3QgdWludDhfdCAqKSAoYSkpWzFdICYgMHhmKSA9PSAweDgpKQorCisjZGVmaW5lIElONl9JU19BRERSX01DX0dMT0JBTChhKSBcCisJKElONl9JU19BRERSX01VTFRJQ0FTVChhKQkJCQkJICAgICAgXAorCSAmJiAoKCgoX19jb25zdCB1aW50OF90ICopIChhKSlbMV0gJiAweGYpID09IDB4ZSkpCisKKworI2lmZGVmIF9fVVNFX0dOVQorLyogSVB2NiBwYWNrZXQgaW5mb3JtYXRpb24uICAqLworc3RydWN0IGluNl9wa3RpbmZvCisgIHsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgaXBpNl9hZGRyOwkvKiBzcmMvZHN0IElQdjYgYWRkcmVzcyAqLworICAgIHVuc2lnbmVkIGludCBpcGk2X2lmaW5kZXg7CS8qIHNlbmQvcmVjdiBpbnRlcmZhY2UgaW5kZXggKi8KKyAgfTsKKworLyogSVB2NiBNVFUgaW5mb3JtYXRpb24uICAqLworc3RydWN0IGlwNl9tdHVpbmZvCisgIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGlwNm1fYWRkcjsgLyogZHN0IGFkZHJlc3MgaW5jbHVkaW5nIHpvbmUgSUQgKi8KKyAgICB1aW50MzJfdCBpcDZtX210dTsJCSAgIC8qIHBhdGggTVRVIGluIGhvc3QgYnl0ZSBvcmRlciAqLworICB9OworCisKKy8qIE9ic29sZXRlIGhvcC1ieS1ob3AgYW5kIERlc3RpbmF0aW9uIE9wdGlvbnMgUHJvY2Vzc2luZyAoUkZDIDIyOTIpLiAgKi8KK2V4dGVybiBpbnQgaW5ldDZfb3B0aW9uX3NwYWNlIChpbnQgX19uYnl0ZXMpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworZXh0ZXJuIGludCBpbmV0Nl9vcHRpb25faW5pdCAodm9pZCAqX19icCwgc3RydWN0IGNtc2doZHIgKipfX2Ntc2dwLAorCQkJICAgICAgaW50IF9fdHlwZSkgX19USFJPVyBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX187CitleHRlcm4gaW50IGluZXQ2X29wdGlvbl9hcHBlbmQgKHN0cnVjdCBjbXNnaGRyICpfX2Ntc2csCisJCQkJX19jb25zdCB1aW50OF90ICpfX3R5cGVwLCBpbnQgX19tdWx0eCwKKwkJCQlpbnQgX19wbHVzeSkgX19USFJPVyBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX187CitleHRlcm4gdWludDhfdCAqaW5ldDZfb3B0aW9uX2FsbG9jIChzdHJ1Y3QgY21zZ2hkciAqX19jbXNnLCBpbnQgX19kYXRhbGVuLAorCQkJCSAgICBpbnQgX19tdWx0eCwgaW50IF9fcGx1c3kpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworZXh0ZXJuIGludCBpbmV0Nl9vcHRpb25fbmV4dCAoX19jb25zdCBzdHJ1Y3QgY21zZ2hkciAqX19jbXNnLAorCQkJICAgICAgdWludDhfdCAqKl9fdHB0cnApCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworZXh0ZXJuIGludCBpbmV0Nl9vcHRpb25fZmluZCAoX19jb25zdCBzdHJ1Y3QgY21zZ2hkciAqX19jbXNnLAorCQkJICAgICAgdWludDhfdCAqKl9fdHB0cnAsIGludCBfX3R5cGUpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworCisKKy8qIEhvcC1ieS1Ib3AgYW5kIERlc3RpbmF0aW9uIE9wdGlvbnMgUHJvY2Vzc2luZyAoUkZDIDM1NDIpLiAgKi8KK2V4dGVybiBpbnQgaW5ldDZfb3B0X2luaXQgKHZvaWQgKl9fZXh0YnVmLCBzb2NrbGVuX3QgX19leHRsZW4pIF9fVEhST1c7CitleHRlcm4gaW50IGluZXQ2X29wdF9hcHBlbmQgKHZvaWQgKl9fZXh0YnVmLCBzb2NrbGVuX3QgX19leHRsZW4sIGludCBfX29mZnNldCwKKwkJCSAgICAgdWludDhfdCBfX3R5cGUsIHNvY2tsZW5fdCBfX2xlbiwgdWludDhfdCBfX2FsaWduLAorCQkJICAgICB2b2lkICoqX19kYXRhYnVmcCkgX19USFJPVzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0X2ZpbmlzaCAodm9pZCAqX19leHRidWYsIHNvY2tsZW5fdCBfX2V4dGxlbiwgaW50IF9fb2Zmc2V0KQorICAgICBfX1RIUk9XOworZXh0ZXJuIGludCBpbmV0Nl9vcHRfc2V0X3ZhbCAodm9pZCAqX19kYXRhYnVmLCBpbnQgX19vZmZzZXQsIHZvaWQgKl9fdmFsLAorCQkJICAgICAgc29ja2xlbl90IF9fdmFsbGVuKSBfX1RIUk9XOworZXh0ZXJuIGludCBpbmV0Nl9vcHRfbmV4dCAodm9pZCAqX19leHRidWYsIHNvY2tsZW5fdCBfX2V4dGxlbiwgaW50IF9fb2Zmc2V0LAorCQkJICAgdWludDhfdCAqX190eXBlcCwgc29ja2xlbl90ICpfX2xlbnAsCisJCQkgICB2b2lkICoqX19kYXRhYnVmcCkgX19USFJPVzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0X2ZpbmQgKHZvaWQgKl9fZXh0YnVmLCBzb2NrbGVuX3QgX19leHRsZW4sIGludCBfX29mZnNldCwKKwkJCSAgIHVpbnQ4X3QgX190eXBlLCBzb2NrbGVuX3QgKl9fbGVucCwKKwkJCSAgIHZvaWQgKipfX2RhdGFidWZwKSBfX1RIUk9XOworZXh0ZXJuIGludCBpbmV0Nl9vcHRfZ2V0X3ZhbCAodm9pZCAqX19kYXRhYnVmLCBpbnQgX19vZmZzZXQsIHZvaWQgKl9fdmFsLAorCQkJICAgICAgc29ja2xlbl90IF9fdmFsbGVuKSBfX1RIUk9XOworCisKKy8qIFJvdXRpbmcgSGVhZGVyIE9wdGlvbiAoUkZDIDM1NDIpLiAgKi8KK2V4dGVybiBzb2NrbGVuX3QgaW5ldDZfcnRoX3NwYWNlIChpbnQgX190eXBlLCBpbnQgX19zZWdtZW50cykgX19USFJPVzsKK2V4dGVybiB2b2lkICppbmV0Nl9ydGhfaW5pdCAodm9pZCAqX19icCwgc29ja2xlbl90IF9fYnBfbGVuLCBpbnQgX190eXBlLAorCQkJICAgICBpbnQgX19zZWdtZW50cykgX19USFJPVzsKK2V4dGVybiBpbnQgaW5ldDZfcnRoX2FkZCAodm9pZCAqX19icCwgX19jb25zdCBzdHJ1Y3QgaW42X2FkZHIgKl9fYWRkcikgX19USFJPVzsKK2V4dGVybiBpbnQgaW5ldDZfcnRoX3JldmVyc2UgKF9fY29uc3Qgdm9pZCAqX19pbiwgdm9pZCAqX19vdXQpIF9fVEhST1c7CitleHRlcm4gaW50IGluZXQ2X3J0aF9zZWdtZW50cyAoX19jb25zdCB2b2lkICpfX2JwKSBfX1RIUk9XOworZXh0ZXJuIHN0cnVjdCBpbjZfYWRkciAqaW5ldDZfcnRoX2dldGFkZHIgKF9fY29uc3Qgdm9pZCAqX19icCwgaW50IF9faW5kZXgpCisgICAgIF9fVEhST1c7CisKKworLyogTXVsdGljYXN0IHNvdXJjZSBmaWx0ZXIgc3VwcG9ydC4gICovCisKKy8qIEdldCBJUHY0IHNvdXJjZSBmaWx0ZXIuICAqLworZXh0ZXJuIGludCBnZXRpcHY0c291cmNlZmlsdGVyIChpbnQgX19zLCBzdHJ1Y3QgaW5fYWRkciBfX2ludGVyZmFjZV9hZGRyLAorCQkJCXN0cnVjdCBpbl9hZGRyIF9fZ3JvdXAsIHVpbnQzMl90ICpfX2Ztb2RlLAorCQkJCXVpbnQzMl90ICpfX251bXNyYywgc3RydWN0IGluX2FkZHIgKl9fc2xpc3QpCisgICAgIF9fVEhST1c7CisKKy8qIFNldCBJUHY0IHNvdXJjZSBmaWx0ZXIuICAqLworZXh0ZXJuIGludCBzZXRpcHY0c291cmNlZmlsdGVyIChpbnQgX19zLCBzdHJ1Y3QgaW5fYWRkciBfX2ludGVyZmFjZV9hZGRyLAorCQkJCXN0cnVjdCBpbl9hZGRyIF9fZ3JvdXAsIHVpbnQzMl90IF9fZm1vZGUsCisJCQkJdWludDMyX3QgX19udW1zcmMsCisJCQkJX19jb25zdCBzdHJ1Y3QgaW5fYWRkciAqX19zbGlzdCkKKyAgICAgX19USFJPVzsKKworCisvKiBHZXQgc291cmNlIGZpbHRlci4gICovCitleHRlcm4gaW50IGdldHNvdXJjZWZpbHRlciAoaW50IF9fcywgdWludDMyX3QgX19pbnRlcmZhY2VfYWRkciwKKwkJCSAgICBfX2NvbnN0IHN0cnVjdCBzb2NrYWRkciAqX19ncm91cCwKKwkJCSAgICBzb2NrbGVuX3QgX19ncm91cGxlbiwgdWludDMyX3QgKl9fZm1vZGUsCisJCQkgICAgdWludDMyX3QgKl9fbnVtc3JjLAorCQkJICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpfX3NsaXN0KSBfX1RIUk9XOworCisvKiBTZXQgc291cmNlIGZpbHRlci4gICovCitleHRlcm4gaW50IHNldHNvdXJjZWZpbHRlciAoaW50IF9fcywgdWludDMyX3QgX19pbnRlcmZhY2VfYWRkciwKKwkJCSAgICBfX2NvbnN0IHN0cnVjdCBzb2NrYWRkciAqX19ncm91cCwKKwkJCSAgICBzb2NrbGVuX3QgX19ncm91cGxlbiwgdWludDMyX3QgX19mbW9kZSwKKwkJCSAgICB1aW50MzJfdCBfX251bXNyYywKKwkJCSAgICBfX2NvbnN0IHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpfX3NsaXN0KSBfX1RIUk9XOworI2VuZGlmCS8qIHVzZSBHTlUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIG5ldGluZXQvaW4uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2luX3N5c3RtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaW5fc3lzdG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWEwOGUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2luX3N5c3RtLmgKQEAgLTAsMCArMSw0MSBAQAorLyogU3lzdGVtIHNwZWNpZmljIHR5cGUgZGVmaW5pdGlvbnMgZm9yIG5ldHdvcmtpbmcgY29kZS4KKyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9JTl9TWVNUTV9ICisjZGVmaW5lIF9ORVRJTkVUX0lOX1NZU1RNX0ggMQorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIE5ldHdvcmsgb3JkZXIgdmVyc2lvbnMgb2YgdmFyaW91cyBkYXRhIHR5cGVzLiBVbmZvcnR1bmF0ZWx5LCBCU0QKKyAqIGFzc3VtZXMgc3BlY2lmaWMgc2l6ZXMgZm9yIHNob3J0cyAoMTYgYml0KSBhbmQgbG9uZ3MgKDMyIGJpdCkgd2hpY2gKKyAqIGRvbid0IGhvbGQgaW4gZ2VuZXJhbC4gQXMgYSBjb25zZXF1ZW5jZSwgdGhlIG5ldHdvcmsgb3JkZXIgdmVyc2lvbnMKKyAqIG1heSBub3QgcmVmbGVjdCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIG5hdGl2ZSBkYXRhIHR5cGVzLgorICovCisKK3R5cGVkZWYgdV9pbnQxNl90IG5fc2hvcnQ7ICAgICAgLyogc2hvcnQgYXMgcmVjZWl2ZWQgZnJvbSB0aGUgbmV0ICovCit0eXBlZGVmIHVfaW50MzJfdCBuX2xvbmc7ICAgICAgIC8qIGxvbmcgYXMgcmVjZWl2ZWQgZnJvbSB0aGUgbmV0ICAqLwordHlwZWRlZiB1X2ludDMyX3Qgbl90aW1lOyAgICAgICAvKiBtcyBzaW5jZSAwMDowMCBHTVQsIGJ5dGUgcmV2ICAgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG5ldGluZXQvaW5fc3lzdG0uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTU1ZmVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lwLmgKQEAgLTAsMCArMSwzMDMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTkzLDE5OTUtMjAwMCwyMDA5LDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19ORVRJTkVUX0lQX0gKKyNkZWZpbmUgX19ORVRJTkVUX0lQX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworX19CRUdJTl9ERUNMUworCitzdHJ1Y3QgdGltZXN0YW1wCisgIHsKKyAgICB1X2ludDhfdCBsZW47CisgICAgdV9pbnQ4X3QgcHRyOworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyAgICB1bnNpZ25lZCBpbnQgZmxhZ3M6NDsKKyAgICB1bnNpZ25lZCBpbnQgb3ZlcmZsb3c6NDsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyAgICB1bnNpZ25lZCBpbnQgb3ZlcmZsb3c6NDsKKyAgICB1bnNpZ25lZCBpbnQgZmxhZ3M6NDsKKyNlbHNlCisjIGVycm9yCSJQbGVhc2UgZml4IDxiaXRzL2VuZGlhbi5oPiIKKyNlbmRpZgorICAgIHVfaW50MzJfdCBkYXRhWzldOworICB9OworCitzdHJ1Y3QgaXBoZHIKKyAgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyAgICB1bnNpZ25lZCBpbnQgaWhsOjQ7CisgICAgdW5zaWduZWQgaW50IHZlcnNpb246NDsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyAgICB1bnNpZ25lZCBpbnQgdmVyc2lvbjo0OworICAgIHVuc2lnbmVkIGludCBpaGw6NDsKKyNlbHNlCisjIGVycm9yCSJQbGVhc2UgZml4IDxiaXRzL2VuZGlhbi5oPiIKKyNlbmRpZgorICAgIHVfaW50OF90IHRvczsKKyAgICB1X2ludDE2X3QgdG90X2xlbjsKKyAgICB1X2ludDE2X3QgaWQ7CisgICAgdV9pbnQxNl90IGZyYWdfb2ZmOworICAgIHVfaW50OF90IHR0bDsKKyAgICB1X2ludDhfdCBwcm90b2NvbDsKKyAgICB1X2ludDE2X3QgY2hlY2s7CisgICAgdV9pbnQzMl90IHNhZGRyOworICAgIHVfaW50MzJfdCBkYWRkcjsKKyAgICAvKlRoZSBvcHRpb25zIHN0YXJ0IGhlcmUuICovCisgIH07CisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaXAuaAk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBpbnRlcm5ldCBwcm90b2NvbCB2ZXJzaW9uIDQuCisgKiBQZXIgUkZDIDc5MSwgU2VwdGVtYmVyIDE5ODEuCisgKi8KKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhbiBpbnRlcm5ldCBoZWFkZXIsIG5ha2VkIG9mIG9wdGlvbnMuCisgKi8KK3N0cnVjdCBpcAorICB7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorICAgIHVuc2lnbmVkIGludCBpcF9obDo0OwkJLyogaGVhZGVyIGxlbmd0aCAqLworICAgIHVuc2lnbmVkIGludCBpcF92OjQ7CQkvKiB2ZXJzaW9uICovCisjZW5kaWYKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisgICAgdW5zaWduZWQgaW50IGlwX3Y6NDsJCS8qIHZlcnNpb24gKi8KKyAgICB1bnNpZ25lZCBpbnQgaXBfaGw6NDsJCS8qIGhlYWRlciBsZW5ndGggKi8KKyNlbmRpZgorICAgIHVfaW50OF90IGlwX3RvczsJCQkvKiB0eXBlIG9mIHNlcnZpY2UgKi8KKyAgICB1X3Nob3J0IGlwX2xlbjsJCQkvKiB0b3RhbCBsZW5ndGggKi8KKyAgICB1X3Nob3J0IGlwX2lkOwkJCS8qIGlkZW50aWZpY2F0aW9uICovCisgICAgdV9zaG9ydCBpcF9vZmY7CQkJLyogZnJhZ21lbnQgb2Zmc2V0IGZpZWxkICovCisjZGVmaW5lCUlQX1JGIDB4ODAwMAkJCS8qIHJlc2VydmVkIGZyYWdtZW50IGZsYWcgKi8KKyNkZWZpbmUJSVBfREYgMHg0MDAwCQkJLyogZG9udCBmcmFnbWVudCBmbGFnICovCisjZGVmaW5lCUlQX01GIDB4MjAwMAkJCS8qIG1vcmUgZnJhZ21lbnRzIGZsYWcgKi8KKyNkZWZpbmUJSVBfT0ZGTUFTSyAweDFmZmYJCS8qIG1hc2sgZm9yIGZyYWdtZW50aW5nIGJpdHMgKi8KKyAgICB1X2ludDhfdCBpcF90dGw7CQkJLyogdGltZSB0byBsaXZlICovCisgICAgdV9pbnQ4X3QgaXBfcDsJCQkvKiBwcm90b2NvbCAqLworICAgIHVfc2hvcnQgaXBfc3VtOwkJCS8qIGNoZWNrc3VtICovCisgICAgc3RydWN0IGluX2FkZHIgaXBfc3JjLCBpcF9kc3Q7CS8qIHNvdXJjZSBhbmQgZGVzdCBhZGRyZXNzICovCisgIH07CisKKy8qCisgKiBUaW1lIHN0YW1wIG9wdGlvbiBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBpcF90aW1lc3RhbXAKKyAgeworICAgIHVfaW50OF90IGlwdF9jb2RlOwkJCS8qIElQT1BUX1RTICovCisgICAgdV9pbnQ4X3QgaXB0X2xlbjsJCQkvKiBzaXplIG9mIHN0cnVjdHVyZSAodmFyaWFibGUpICovCisgICAgdV9pbnQ4X3QgaXB0X3B0cjsJCQkvKiBpbmRleCBvZiBjdXJyZW50IGVudHJ5ICovCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorICAgIHVuc2lnbmVkIGludCBpcHRfZmxnOjQ7CQkvKiBmbGFncywgc2VlIGJlbG93ICovCisgICAgdW5zaWduZWQgaW50IGlwdF9vZmx3OjQ7CQkvKiBvdmVyZmxvdyBjb3VudGVyICovCisjZW5kaWYKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisgICAgdW5zaWduZWQgaW50IGlwdF9vZmx3OjQ7CQkvKiBvdmVyZmxvdyBjb3VudGVyICovCisgICAgdW5zaWduZWQgaW50IGlwdF9mbGc6NDsJCS8qIGZsYWdzLCBzZWUgYmVsb3cgKi8KKyNlbmRpZgorICAgIHVfaW50MzJfdCBkYXRhWzldOworICB9OworI2VuZGlmIC8qIF9fVVNFX0JTRCAqLworCisjZGVmaW5lCUlQVkVSU0lPTgk0ICAgICAgICAgICAgICAgLyogSVAgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUJSVBfTUFYUEFDS0VUCTY1NTM1CQkvKiBtYXhpbXVtIHBhY2tldCBzaXplICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgRXhwbGljaXQgQ29uZ2VzdGlvbiBOb3RpZmljYXRpb24gKEVDTikKKyAqCisgKiBUYWtlbiBmcm9tIFJGQy0zMTY4LCBTZWN0aW9uIDUuCisgKi8KKworI2RlZmluZQlJUFRPU19FQ05fTUFTSwkJMHgwMworI2RlZmluZQlJUFRPU19FQ04oeCkJCSgoeCkgJiBJUFRPU19FQ05fTUFTSykKKyNkZWZpbmUJSVBUT1NfRUNOX05PVF9FQ1QJMHgwMAorI2RlZmluZQlJUFRPU19FQ05fRUNUMQkJMHgwMQorI2RlZmluZQlJUFRPU19FQ05fRUNUMAkJMHgwMgorI2RlZmluZQlJUFRPU19FQ05fQ0UJCTB4MDMKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBJUCBkaWZmZXJlbnRpYXRlZCBzZXJ2aWNlcyBjb2RlIHBvaW50cyAoRFNDUCkKKyAqCisgKiBUYWtlbiBmcm9tIFJGQy0yNTk3LCBTZWN0aW9uIDYgYW5kIFJGQy0yNTk4LCBTZWN0aW9uIDIuMy4KKyAqLworCisjZGVmaW5lCUlQVE9TX0RTQ1BfTUFTSwkJMHhmYworI2RlZmluZQlJUFRPU19EU0NQKHgpCQkoKHgpICYgSVBUT1NfRFNDUF9NQVNLKQorI2RlZmluZQlJUFRPU19EU0NQX0FGMTEJCTB4MjgKKyNkZWZpbmUJSVBUT1NfRFNDUF9BRjEyCQkweDMwCisjZGVmaW5lCUlQVE9TX0RTQ1BfQUYxMwkJMHgzOAorI2RlZmluZQlJUFRPU19EU0NQX0FGMjEJCTB4NDgKKyNkZWZpbmUJSVBUT1NfRFNDUF9BRjIyCQkweDUwCisjZGVmaW5lCUlQVE9TX0RTQ1BfQUYyMwkJMHg1OAorI2RlZmluZQlJUFRPU19EU0NQX0FGMzEJCTB4NjgKKyNkZWZpbmUJSVBUT1NfRFNDUF9BRjMyCQkweDcwCisjZGVmaW5lCUlQVE9TX0RTQ1BfQUYzMwkJMHg3OAorI2RlZmluZQlJUFRPU19EU0NQX0FGNDEJCTB4ODgKKyNkZWZpbmUJSVBUT1NfRFNDUF9BRjQyCQkweDkwCisjZGVmaW5lCUlQVE9TX0RTQ1BfQUY0MwkJMHg5OAorI2RlZmluZQlJUFRPU19EU0NQX0VGCQkweGI4CisKKy8qCisgKiBJbiBSRkMgMjQ3NCwgU2VjdGlvbiA0LjIuMi4xLCB0aGUgQ2xhc3MgU2VsZWN0b3IgQ29kZXBvaW50cyBzdWJzdW1lCisgKiB0aGUgb2xkIFRvUyBQcmVjZWRlbmNlIHZhbHVlcy4KKyAqLworCisjZGVmaW5lCUlQVE9TX0NMQVNTX01BU0sJCTB4ZTAKKyNkZWZpbmUJSVBUT1NfQ0xBU1MoY2xhc3MpCQkoKGNsYXNzKSAmIElQVE9TX0NMQVNTX01BU0spCisjZGVmaW5lCUlQVE9TX0NMQVNTX0NTMAkJCTB4MDAKKyNkZWZpbmUJSVBUT1NfQ0xBU1NfQ1MxCQkJMHgyMAorI2RlZmluZQlJUFRPU19DTEFTU19DUzIJCQkweDQwCisjZGVmaW5lCUlQVE9TX0NMQVNTX0NTMwkJCTB4NjAKKyNkZWZpbmUJSVBUT1NfQ0xBU1NfQ1M0CQkJMHg4MAorI2RlZmluZQlJUFRPU19DTEFTU19DUzUJCQkweGEwCisjZGVmaW5lCUlQVE9TX0NMQVNTX0NTNgkJCTB4YzAKKyNkZWZpbmUJSVBUT1NfQ0xBU1NfQ1M3CQkJMHhlMAorCisjZGVmaW5lCUlQVE9TX0NMQVNTX0RFRkFVTFQJCUlQVE9TX0NMQVNTX0NTMAorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIElQIHR5cGUgb2Ygc2VydmljZSAoaXBfdG9zKSBbZGVwcmVjYXRlZDsgdXNlIERTQ1AKKyAqIGFuZCBDUyBkZWZpbml0aW9ucyBhYm92ZSBpbnN0ZWFkLl0KKyAqLworI2RlZmluZQlJUFRPU19UT1NfTUFTSwkJMHgxRQorI2RlZmluZQlJUFRPU19UT1ModG9zKQkJKCh0b3MpICYgSVBUT1NfVE9TX01BU0spCisjZGVmaW5lCUlQVE9TX0xPV0RFTEFZCQkweDEwCisjZGVmaW5lCUlQVE9TX1RIUk9VR0hQVVQJMHgwOAorI2RlZmluZQlJUFRPU19SRUxJQUJJTElUWQkweDA0CisjZGVmaW5lCUlQVE9TX0xPV0NPU1QJCTB4MDIKKyNkZWZpbmUJSVBUT1NfTUlOQ09TVAkJSVBUT1NfTE9XQ09TVAorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIElQIHByZWNlZGVuY2UgKGFsc28gaW4gaXBfdG9zKSBbYWxzbyBkZXByZWNhdGVkLl0KKyAqLworI2RlZmluZQlJUFRPU19QUkVDX01BU0sJCQlJUFRPU19DTEFTU19NQVNLCisjZGVmaW5lCUlQVE9TX1BSRUModG9zKQkJCUlQVE9TX0NMQVNTKHRvcykKKyNkZWZpbmUJSVBUT1NfUFJFQ19ORVRDT05UUk9MCQlJUFRPU19DTEFTU19DUzcKKyNkZWZpbmUJSVBUT1NfUFJFQ19JTlRFUk5FVENPTlRST0wJSVBUT1NfQ0xBU1NfQ1M2CisjZGVmaW5lCUlQVE9TX1BSRUNfQ1JJVElDX0VDUAkJSVBUT1NfQ0xBU1NfQ1M1CisjZGVmaW5lCUlQVE9TX1BSRUNfRkxBU0hPVkVSUklERQlJUFRPU19DTEFTU19DUzQKKyNkZWZpbmUJSVBUT1NfUFJFQ19GTEFTSAkJSVBUT1NfQ0xBU1NfQ1MzCisjZGVmaW5lCUlQVE9TX1BSRUNfSU1NRURJQVRFCQlJUFRPU19DTEFTU19DUzIKKyNkZWZpbmUJSVBUT1NfUFJFQ19QUklPUklUWQkJSVBUT1NfQ0xBU1NfQ1MxCisjZGVmaW5lCUlQVE9TX1BSRUNfUk9VVElORQkJSVBUT1NfQ0xBU1NfQ1MwCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3Igb3B0aW9ucy4KKyAqLworI2RlZmluZQlJUE9QVF9DT1BZCQkweDgwCisjZGVmaW5lCUlQT1BUX0NMQVNTX01BU0sJMHg2MAorI2RlZmluZQlJUE9QVF9OVU1CRVJfTUFTSwkweDFmCisKKyNkZWZpbmUJSVBPUFRfQ09QSUVEKG8pCQkoKG8pICYgSVBPUFRfQ09QWSkKKyNkZWZpbmUJSVBPUFRfQ0xBU1MobykJCSgobykgJiBJUE9QVF9DTEFTU19NQVNLKQorI2RlZmluZQlJUE9QVF9OVU1CRVIobykJCSgobykgJiBJUE9QVF9OVU1CRVJfTUFTSykKKworI2RlZmluZQlJUE9QVF9DT05UUk9MCQkweDAwCisjZGVmaW5lCUlQT1BUX1JFU0VSVkVEMQkJMHgyMAorI2RlZmluZQlJUE9QVF9ERUJNRUFTCQkweDQwCisjZGVmaW5lCUlQT1BUX01FQVNVUkVNRU5UICAgICAgIElQT1BUX0RFQk1FQVMKKyNkZWZpbmUJSVBPUFRfUkVTRVJWRUQyCQkweDYwCisKKyNkZWZpbmUJSVBPUFRfRU9MCQkwCQkvKiBlbmQgb2Ygb3B0aW9uIGxpc3QgKi8KKyNkZWZpbmUJSVBPUFRfRU5ECQlJUE9QVF9FT0wKKyNkZWZpbmUJSVBPUFRfTk9QCQkxCQkvKiBubyBvcGVyYXRpb24gKi8KKyNkZWZpbmUJSVBPUFRfTk9PUAkJSVBPUFRfTk9QCisKKyNkZWZpbmUJSVBPUFRfUlIJCTcJCS8qIHJlY29yZCBwYWNrZXQgcm91dGUgKi8KKyNkZWZpbmUJSVBPUFRfVFMJCTY4CQkvKiB0aW1lc3RhbXAgKi8KKyNkZWZpbmUJSVBPUFRfVElNRVNUQU1QCQlJUE9QVF9UUworI2RlZmluZQlJUE9QVF9TRUNVUklUWQkJMTMwCQkvKiBwcm92aWRlIHMsYyxoLHRjYyAqLworI2RlZmluZQlJUE9QVF9TRUMJCUlQT1BUX1NFQ1VSSVRZCisjZGVmaW5lCUlQT1BUX0xTUlIJCTEzMQkJLyogbG9vc2Ugc291cmNlIHJvdXRlICovCisjZGVmaW5lCUlQT1BUX1NBVElECQkxMzYJCS8qIHNhdG5ldCBpZCAqLworI2RlZmluZQlJUE9QVF9TSUQJCUlQT1BUX1NBVElECisjZGVmaW5lCUlQT1BUX1NTUlIJCTEzNwkJLyogc3RyaWN0IHNvdXJjZSByb3V0ZSAqLworI2RlZmluZQlJUE9QVF9SQQkJMTQ4CQkvKiByb3V0ZXIgYWxlcnQgKi8KKworLyoKKyAqIE9mZnNldHMgdG8gZmllbGRzIGluIG9wdGlvbnMgb3RoZXIgdGhhbiBFT0wgYW5kIE5PUC4KKyAqLworI2RlZmluZQlJUE9QVF9PUFRWQUwJCTAJCS8qIG9wdGlvbiBJRCAqLworI2RlZmluZQlJUE9QVF9PTEVOCQkxCQkvKiBvcHRpb24gbGVuZ3RoICovCisjZGVmaW5lCUlQT1BUX09GRlNFVAkJMgkJLyogb2Zmc2V0IHdpdGhpbiBvcHRpb24gKi8KKyNkZWZpbmUJSVBPUFRfTUlOT0ZGCQk0CQkvKiBtaW4gdmFsdWUgb2YgYWJvdmUgKi8KKworI2RlZmluZQlNQVhfSVBPUFRMRU4JCTQwCisKKy8qIGZsYWcgYml0cyBmb3IgaXB0X2ZsZyAqLworI2RlZmluZQlJUE9QVF9UU19UU09OTFkJCTAJCS8qIHRpbWVzdGFtcHMgb25seSAqLworI2RlZmluZQlJUE9QVF9UU19UU0FOREFERFIJMQkJLyogdGltZXN0YW1wcyBhbmQgYWRkcmVzc2VzICovCisjZGVmaW5lCUlQT1BUX1RTX1BSRVNQRUMJMwkJLyogc3BlY2lmaWVkIG1vZHVsZXMgb25seSAqLworCisvKiBiaXRzIGZvciBzZWN1cml0eSAobm90IGJ5dGUgc3dhcHBlZCkgKi8KKyNkZWZpbmUJSVBPUFRfU0VDVVJfVU5DTEFTUwkweDAwMDAKKyNkZWZpbmUJSVBPUFRfU0VDVVJfQ09ORklECTB4ZjEzNQorI2RlZmluZQlJUE9QVF9TRUNVUl9FRlRPCTB4Nzg5YQorI2RlZmluZQlJUE9QVF9TRUNVUl9NTU1NCTB4YmM0ZAorI2RlZmluZQlJUE9QVF9TRUNVUl9SRVNUUgkweGFmMTMKKyNkZWZpbmUJSVBPUFRfU0VDVVJfU0VDUkVUCTB4ZDc4OAorI2RlZmluZQlJUE9QVF9TRUNVUl9UT1BTRUNSRVQJMHg2YmM1CisKKy8qCisgKiBJbnRlcm5ldCBpbXBsZW1lbnRhdGlvbiBwYXJhbWV0ZXJzLgorICovCisjZGVmaW5lCU1BWFRUTAkJMjU1CQkvKiBtYXhpbXVtIHRpbWUgdG8gbGl2ZSAoc2Vjb25kcykgKi8KKyNkZWZpbmUJSVBERUZUVEwJNjQJCS8qIGRlZmF1bHQgdHRsLCBmcm9tIFJGQyAxMzQwICovCisjZGVmaW5lCUlQRlJBR1RUTAk2MAkJLyogdGltZSB0byBsaXZlIGZvciBmcmFncywgc2xvd2h6ICovCisjZGVmaW5lCUlQVFRMREVDCTEJCS8qIHN1YnRyYWN0ZWQgd2hlbiBmb3J3YXJkaW5nICovCisKKyNkZWZpbmUJSVBfTVNTCQk1NzYJCS8qIGRlZmF1bHQgbWF4aW11bSBzZWdtZW50IHNpemUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG5ldGluZXQvaXAuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lwNi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lwNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjJhZjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaXA2LmgKQEAgLTAsMCArMSwxODkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCAyMDAxLCAyMDAzLCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ORVRJTkVUX0lQNl9ICisjZGVmaW5lIF9ORVRJTkVUX0lQNl9IIDEKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCitzdHJ1Y3QgaXA2X2hkcgorICB7CisgICAgdW5pb24KKyAgICAgIHsKKwlzdHJ1Y3QgaXA2X2hkcmN0bAorCSAgeworCSAgICB1aW50MzJfdCBpcDZfdW4xX2Zsb3c7ICAgLyogNCBiaXRzIHZlcnNpb24sIDggYml0cyBUQywKKwkJCQkJMjAgYml0cyBmbG93LUlEICovCisJICAgIHVpbnQxNl90IGlwNl91bjFfcGxlbjsgICAvKiBwYXlsb2FkIGxlbmd0aCAqLworCSAgICB1aW50OF90ICBpcDZfdW4xX254dDsgICAgLyogbmV4dCBoZWFkZXIgKi8KKwkgICAgdWludDhfdCAgaXA2X3VuMV9obGltOyAgIC8qIGhvcCBsaW1pdCAqLworCSAgfSBpcDZfdW4xOworCXVpbnQ4X3QgaXA2X3VuMl92ZmM7ICAgICAgIC8qIDQgYml0cyB2ZXJzaW9uLCB0b3AgNCBiaXRzIHRjbGFzcyAqLworICAgICAgfSBpcDZfY3RsdW47CisgICAgc3RydWN0IGluNl9hZGRyIGlwNl9zcmM7ICAgICAgLyogc291cmNlIGFkZHJlc3MgKi8KKyAgICBzdHJ1Y3QgaW42X2FkZHIgaXA2X2RzdDsgICAgICAvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisgIH07CisKKyNkZWZpbmUgaXA2X3ZmYyAgIGlwNl9jdGx1bi5pcDZfdW4yX3ZmYworI2RlZmluZSBpcDZfZmxvdyAgaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9mbG93CisjZGVmaW5lIGlwNl9wbGVuICBpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX3BsZW4KKyNkZWZpbmUgaXA2X254dCAgIGlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfbnh0CisjZGVmaW5lIGlwNl9obGltICBpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX2hsaW0KKyNkZWZpbmUgaXA2X2hvcHMgIGlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfaGxpbQorCisvKiBHZW5lcmljIGV4dGVuc2lvbiBoZWFkZXIuICAqLworc3RydWN0IGlwNl9leHQKKyAgeworICAgIHVpbnQ4X3QgIGlwNmVfbnh0OwkJLyogbmV4dCBoZWFkZXIuICAqLworICAgIHVpbnQ4X3QgIGlwNmVfbGVuOwkJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzLiAgKi8KKyAgfTsKKworLyogSG9wLWJ5LUhvcCBvcHRpb25zIGhlYWRlci4gICovCitzdHJ1Y3QgaXA2X2hiaAorICB7CisgICAgdWludDhfdCAgaXA2aF9ueHQ7CQkvKiBuZXh0IGhlYWRlci4gICovCisgICAgdWludDhfdCAgaXA2aF9sZW47CQkvKiBsZW5ndGggaW4gdW5pdHMgb2YgOCBvY3RldHMuICAqLworICAgIC8qIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KKyAgfTsKKworLyogRGVzdGluYXRpb24gb3B0aW9ucyBoZWFkZXIgKi8KK3N0cnVjdCBpcDZfZGVzdAorICB7CisgICAgdWludDhfdCAgaXA2ZF9ueHQ7CQkvKiBuZXh0IGhlYWRlciAqLworICAgIHVpbnQ4X3QgIGlwNmRfbGVuOwkJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzICovCisgICAgLyogZm9sbG93ZWQgYnkgb3B0aW9ucyAqLworICB9OworCisvKiBSb3V0aW5nIGhlYWRlciAqLworc3RydWN0IGlwNl9ydGhkcgorICB7CisgICAgdWludDhfdCAgaXA2cl9ueHQ7CQkvKiBuZXh0IGhlYWRlciAqLworICAgIHVpbnQ4X3QgIGlwNnJfbGVuOwkJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzICovCisgICAgdWludDhfdCAgaXA2cl90eXBlOwkJLyogcm91dGluZyB0eXBlICovCisgICAgdWludDhfdCAgaXA2cl9zZWdsZWZ0OwkvKiBzZWdtZW50cyBsZWZ0ICovCisgICAgLyogZm9sbG93ZWQgYnkgcm91dGluZyB0eXBlIHNwZWNpZmljIGRhdGEgKi8KKyAgfTsKKworLyogVHlwZSAwIFJvdXRpbmcgaGVhZGVyICovCitzdHJ1Y3QgaXA2X3J0aGRyMAorICB7CisgICAgdWludDhfdCAgaXA2cjBfbnh0OwkJLyogbmV4dCBoZWFkZXIgKi8KKyAgICB1aW50OF90ICBpcDZyMF9sZW47CQkvKiBsZW5ndGggaW4gdW5pdHMgb2YgOCBvY3RldHMgKi8KKyAgICB1aW50OF90ICBpcDZyMF90eXBlOwkvKiBhbHdheXMgemVybyAqLworICAgIHVpbnQ4X3QgIGlwNnIwX3NlZ2xlZnQ7CS8qIHNlZ21lbnRzIGxlZnQgKi8KKyAgICB1aW50OF90ICBpcDZyMF9yZXNlcnZlZDsJLyogcmVzZXJ2ZWQgZmllbGQgKi8KKyAgICB1aW50OF90ICBpcDZyMF9zbG1hcFszXTsJLyogc3RyaWN0L2xvb3NlIGJpdCBtYXAgKi8KKyAgICAvKiBmb2xsb3dlZCBieSB1cCB0byAxMjcgc3RydWN0IGluNl9hZGRyICovCisgICAgc3RydWN0IGluNl9hZGRyIGlwNnIwX2FkZHJbMF07CisgIH07CisKKy8qIEZyYWdtZW50IGhlYWRlciAqLworc3RydWN0IGlwNl9mcmFnCisgIHsKKyAgICB1aW50OF90ICAgaXA2Zl9ueHQ7CQkvKiBuZXh0IGhlYWRlciAqLworICAgIHVpbnQ4X3QgICBpcDZmX3Jlc2VydmVkOwkvKiByZXNlcnZlZCBmaWVsZCAqLworICAgIHVpbnQxNl90ICBpcDZmX29mZmxnOwkvKiBvZmZzZXQsIHJlc2VydmVkLCBhbmQgZmxhZyAqLworICAgIHVpbnQzMl90ICBpcDZmX2lkZW50OwkvKiBpZGVudGlmaWNhdGlvbiAqLworICB9OworCisjaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisjIGRlZmluZSBJUDZGX09GRl9NQVNLICAgICAgIDB4ZmZmOCAgLyogbWFzayBvdXQgb2Zmc2V0IGZyb20gX29mZmxnICovCisjIGRlZmluZSBJUDZGX1JFU0VSVkVEX01BU0sgIDB4MDAwNiAgLyogcmVzZXJ2ZWQgYml0cyBpbiBpcDZmX29mZmxnICovCisjIGRlZmluZSBJUDZGX01PUkVfRlJBRyAgICAgIDB4MDAwMSAgLyogbW9yZS1mcmFnbWVudHMgZmxhZyAqLworI2Vsc2UgICAvKiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4gKi8KKyMgZGVmaW5lIElQNkZfT0ZGX01BU0sgICAgICAgMHhmOGZmICAvKiBtYXNrIG91dCBvZmZzZXQgZnJvbSBfb2ZmbGcgKi8KKyMgZGVmaW5lIElQNkZfUkVTRVJWRURfTUFTSyAgMHgwNjAwICAvKiByZXNlcnZlZCBiaXRzIGluIGlwNmZfb2ZmbGcgKi8KKyMgZGVmaW5lIElQNkZfTU9SRV9GUkFHICAgICAgMHgwMTAwICAvKiBtb3JlLWZyYWdtZW50cyBmbGFnICovCisjZW5kaWYKKworLyogSVB2NiBvcHRpb25zICovCitzdHJ1Y3QgaXA2X29wdAorICB7CisgICAgdWludDhfdCAgaXA2b190eXBlOworICAgIHVpbnQ4X3QgIGlwNm9fbGVuOworICB9OworCisvKiBUaGUgaGlnaC1vcmRlciAzIGJpdHMgb2YgdGhlIG9wdGlvbiB0eXBlIGRlZmluZSB0aGUgYmVoYXZpb3IKKyAqIHdoZW4gcHJvY2Vzc2luZyBhbiB1bmtub3duIG9wdGlvbiBhbmQgd2hldGhlciBvciBub3QgdGhlIG9wdGlvbgorICogY29udGVudCBjaGFuZ2VzIGluIGZsaWdodC4KKyAqLworI2RlZmluZSBJUDZPUFRfVFlQRShvKQkJKChvKSAmIDB4YzApCisjZGVmaW5lIElQNk9QVF9UWVBFX1NLSVAJMHgwMAorI2RlZmluZSBJUDZPUFRfVFlQRV9ESVNDQVJECTB4NDAKKyNkZWZpbmUgSVA2T1BUX1RZUEVfRk9SQ0VJQ01QCTB4ODAKKyNkZWZpbmUgSVA2T1BUX1RZUEVfSUNNUAkweGMwCisjZGVmaW5lIElQNk9QVF9UWVBFX01VVEFCTEUJMHgyMAorCisvKiBTcGVjaWFsIG9wdGlvbiB0eXBlcyBmb3IgcGFkZGluZy4gICovCisjZGVmaW5lIElQNk9QVF9QQUQxCTAKKyNkZWZpbmUgSVA2T1BUX1BBRE4JMQorCisjZGVmaW5lIElQNk9QVF9KVU1CTwkJMHhjMgorI2RlZmluZSBJUDZPUFRfTlNBUF9BRERSCTB4YzMKKyNkZWZpbmUgSVA2T1BUX1RVTk5FTF9MSU1JVAkweDA0CisjZGVmaW5lIElQNk9QVF9ST1VURVJfQUxFUlQJMHgwNQorCisvKiBKdW1ibyBQYXlsb2FkIE9wdGlvbiAqLworc3RydWN0IGlwNl9vcHRfanVtYm8KKyAgeworICAgIHVpbnQ4X3QgIGlwNm9qX3R5cGU7CisgICAgdWludDhfdCAgaXA2b2pfbGVuOworICAgIHVpbnQ4X3QgIGlwNm9qX2p1bWJvX2xlbls0XTsKKyAgfTsKKyNkZWZpbmUgSVA2T1BUX0pVTUJPX0xFTgk2CisKKy8qIE5TQVAgQWRkcmVzcyBPcHRpb24gKi8KK3N0cnVjdCBpcDZfb3B0X25zYXAKKyAgeworICAgIHVpbnQ4X3QgIGlwNm9uX3R5cGU7CisgICAgdWludDhfdCAgaXA2b25fbGVuOworICAgIHVpbnQ4X3QgIGlwNm9uX3NyY19uc2FwX2xlbjsKKyAgICB1aW50OF90ICBpcDZvbl9kc3RfbnNhcF9sZW47CisgICAgICAvKiBmb2xsb3dlZCBieSBzb3VyY2UgTlNBUCAqLworICAgICAgLyogZm9sbG93ZWQgYnkgZGVzdGluYXRpb24gTlNBUCAqLworICB9OworCisvKiBUdW5uZWwgTGltaXQgT3B0aW9uICovCitzdHJ1Y3QgaXA2X29wdF90dW5uZWwKKyAgeworICAgIHVpbnQ4X3QgIGlwNm90X3R5cGU7CisgICAgdWludDhfdCAgaXA2b3RfbGVuOworICAgIHVpbnQ4X3QgIGlwNm90X2VuY2FwX2xpbWl0OworICB9OworCisvKiBSb3V0ZXIgQWxlcnQgT3B0aW9uICovCitzdHJ1Y3QgaXA2X29wdF9yb3V0ZXIKKyAgeworICAgIHVpbnQ4X3QgIGlwNm9yX3R5cGU7CisgICAgdWludDhfdCAgaXA2b3JfbGVuOworICAgIHVpbnQ4X3QgIGlwNm9yX3ZhbHVlWzJdOworICB9OworCisvKiBSb3V0ZXIgYWxlcnQgdmFsdWVzIChpbiBuZXR3b3JrIGJ5dGUgb3JkZXIpICovCisjaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisjIGRlZmluZSBJUDZfQUxFUlRfTUxECTB4MDAwMAorIyBkZWZpbmUgSVA2X0FMRVJUX1JTVlAJMHgwMDAxCisjIGRlZmluZSBJUDZfQUxFUlRfQU4JMHgwMDAyCisjZWxzZSAvKiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJTkcgKi8KKyMgZGVmaW5lIElQNl9BTEVSVF9NTEQJMHgwMDAwCisjIGRlZmluZSBJUDZfQUxFUlRfUlNWUAkweDAxMDAKKyMgZGVmaW5lIElQNl9BTEVSVF9BTgkweDAyMDAKKyNlbmRpZgorCisjZW5kaWYgLyogbmV0aW5ldC9pcDYuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lwX2ljbXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcF9pY21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjOGU5YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcF9pY21wLmgKQEAgLTAsMCArMSwyODMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NSwgOTYsIDk3LCA5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfX05FVElORVRfSVBfSUNNUF9ICisjZGVmaW5lIF9fTkVUSU5FVF9JUF9JQ01QX0ggICAgMQorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK19fQkVHSU5fREVDTFMKKworc3RydWN0IGljbXBoZHIKK3sKKyAgdV9pbnQ4X3QgdHlwZTsJCS8qIG1lc3NhZ2UgdHlwZSAqLworICB1X2ludDhfdCBjb2RlOwkJLyogdHlwZSBzdWItY29kZSAqLworICB1X2ludDE2X3QgY2hlY2tzdW07CisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICB1X2ludDE2X3QJaWQ7CisgICAgICB1X2ludDE2X3QJc2VxdWVuY2U7CisgICAgfSBlY2hvOwkJCS8qIGVjaG8gZGF0YWdyYW0gKi8KKyAgICB1X2ludDMyX3QJZ2F0ZXdheTsJLyogZ2F0ZXdheSBhZGRyZXNzICovCisgICAgc3RydWN0CisgICAgeworICAgICAgdV9pbnQxNl90CV9fdW51c2VkOworICAgICAgdV9pbnQxNl90CW10dTsKKyAgICB9IGZyYWc7CQkJLyogcGF0aCBtdHUgZGlzY292ZXJ5ICovCisgIH0gdW47Cit9OworCisjZGVmaW5lIElDTVBfRUNIT1JFUExZCQkwCS8qIEVjaG8gUmVwbHkJCQkqLworI2RlZmluZSBJQ01QX0RFU1RfVU5SRUFDSAkzCS8qIERlc3RpbmF0aW9uIFVucmVhY2hhYmxlCSovCisjZGVmaW5lIElDTVBfU09VUkNFX1FVRU5DSAk0CS8qIFNvdXJjZSBRdWVuY2gJCSovCisjZGVmaW5lIElDTVBfUkVESVJFQ1QJCTUJLyogUmVkaXJlY3QgKGNoYW5nZSByb3V0ZSkJKi8KKyNkZWZpbmUgSUNNUF9FQ0hPCQk4CS8qIEVjaG8gUmVxdWVzdAkJCSovCisjZGVmaW5lIElDTVBfVElNRV9FWENFRURFRAkxMQkvKiBUaW1lIEV4Y2VlZGVkCQkqLworI2RlZmluZSBJQ01QX1BBUkFNRVRFUlBST0IJMTIJLyogUGFyYW1ldGVyIFByb2JsZW0JCSovCisjZGVmaW5lIElDTVBfVElNRVNUQU1QCQkxMwkvKiBUaW1lc3RhbXAgUmVxdWVzdAkJKi8KKyNkZWZpbmUgSUNNUF9USU1FU1RBTVBSRVBMWQkxNAkvKiBUaW1lc3RhbXAgUmVwbHkJCSovCisjZGVmaW5lIElDTVBfSU5GT19SRVFVRVNUCTE1CS8qIEluZm9ybWF0aW9uIFJlcXVlc3QJCSovCisjZGVmaW5lIElDTVBfSU5GT19SRVBMWQkJMTYJLyogSW5mb3JtYXRpb24gUmVwbHkJCSovCisjZGVmaW5lIElDTVBfQUREUkVTUwkJMTcJLyogQWRkcmVzcyBNYXNrIFJlcXVlc3QJCSovCisjZGVmaW5lIElDTVBfQUREUkVTU1JFUExZCTE4CS8qIEFkZHJlc3MgTWFzayBSZXBseQkJKi8KKyNkZWZpbmUgTlJfSUNNUF9UWVBFUwkJMTgKKworCisvKiBDb2RlcyBmb3IgVU5SRUFDSC4gKi8KKyNkZWZpbmUgSUNNUF9ORVRfVU5SRUFDSAkwCS8qIE5ldHdvcmsgVW5yZWFjaGFibGUJCSovCisjZGVmaW5lIElDTVBfSE9TVF9VTlJFQUNICTEJLyogSG9zdCBVbnJlYWNoYWJsZQkJKi8KKyNkZWZpbmUgSUNNUF9QUk9UX1VOUkVBQ0gJMgkvKiBQcm90b2NvbCBVbnJlYWNoYWJsZQkJKi8KKyNkZWZpbmUgSUNNUF9QT1JUX1VOUkVBQ0gJMwkvKiBQb3J0IFVucmVhY2hhYmxlCQkqLworI2RlZmluZSBJQ01QX0ZSQUdfTkVFREVECTQJLyogRnJhZ21lbnRhdGlvbiBOZWVkZWQvREYgc2V0CSovCisjZGVmaW5lIElDTVBfU1JfRkFJTEVECQk1CS8qIFNvdXJjZSBSb3V0ZSBmYWlsZWQJCSovCisjZGVmaW5lIElDTVBfTkVUX1VOS05PV04JNgorI2RlZmluZSBJQ01QX0hPU1RfVU5LTk9XTgk3CisjZGVmaW5lIElDTVBfSE9TVF9JU09MQVRFRAk4CisjZGVmaW5lIElDTVBfTkVUX0FOTwkJOQorI2RlZmluZSBJQ01QX0hPU1RfQU5PCQkxMAorI2RlZmluZSBJQ01QX05FVF9VTlJfVE9TCTExCisjZGVmaW5lIElDTVBfSE9TVF9VTlJfVE9TCTEyCisjZGVmaW5lIElDTVBfUEtUX0ZJTFRFUkVECTEzCS8qIFBhY2tldCBmaWx0ZXJlZCAqLworI2RlZmluZSBJQ01QX1BSRUNfVklPTEFUSU9OCTE0CS8qIFByZWNlZGVuY2UgdmlvbGF0aW9uICovCisjZGVmaW5lIElDTVBfUFJFQ19DVVRPRkYJMTUJLyogUHJlY2VkZW5jZSBjdXQgb2ZmICovCisjZGVmaW5lIE5SX0lDTVBfVU5SRUFDSAkJMTUJLyogaW5zdGVhZCBvZiBoYXJkY29kaW5nIGltbWVkaWF0ZSB2YWx1ZSAqLworCisvKiBDb2RlcyBmb3IgUkVESVJFQ1QuICovCisjZGVmaW5lIElDTVBfUkVESVJfTkVUCQkwCS8qIFJlZGlyZWN0IE5ldAkJCSovCisjZGVmaW5lIElDTVBfUkVESVJfSE9TVAkJMQkvKiBSZWRpcmVjdCBIb3N0CQkqLworI2RlZmluZSBJQ01QX1JFRElSX05FVFRPUwkyCS8qIFJlZGlyZWN0IE5ldCBmb3IgVE9TCQkqLworI2RlZmluZSBJQ01QX1JFRElSX0hPU1RUT1MJMwkvKiBSZWRpcmVjdCBIb3N0IGZvciBUT1MJKi8KKworLyogQ29kZXMgZm9yIFRJTUVfRVhDRUVERUQuICovCisjZGVmaW5lIElDTVBfRVhDX1RUTAkJMAkvKiBUVEwgY291bnQgZXhjZWVkZWQJCSovCisjZGVmaW5lIElDTVBfRVhDX0ZSQUdUSU1FCTEJLyogRnJhZ21lbnQgUmVhc3MgdGltZSBleGNlZWRlZAkqLworCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaXBfaWNtcC5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqLworCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKworLyoKKyAqIEludGVybmFsIG9mIGFuIElDTVAgUm91dGVyIEFkdmVydGlzZW1lbnQKKyAqLworc3RydWN0IGljbXBfcmFfYWRkcgoreworICB1X2ludDMyX3QgaXJhX2FkZHI7CisgIHVfaW50MzJfdCBpcmFfcHJlZmVyZW5jZTsKK307CisKK3N0cnVjdCBpY21wCit7CisgIHVfaW50OF90ICBpY21wX3R5cGU7CS8qIHR5cGUgb2YgbWVzc2FnZSwgc2VlIGJlbG93ICovCisgIHVfaW50OF90ICBpY21wX2NvZGU7CS8qIHR5cGUgc3ViIGNvZGUgKi8KKyAgdV9pbnQxNl90IGljbXBfY2tzdW07CS8qIG9uZXMgY29tcGxlbWVudCBjaGVja3N1bSBvZiBzdHJ1Y3QgKi8KKyAgdW5pb24KKyAgeworICAgIHVfY2hhciBpaF9wcHRyOwkJLyogSUNNUF9QQVJBTVBST0IgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpaF9nd2FkZHI7CS8qIGdhdGV3YXkgYWRkcmVzcyAqLworICAgIHN0cnVjdCBpaF9pZHNlcQkJLyogZWNobyBkYXRhZ3JhbSAqLworICAgIHsKKyAgICAgIHVfaW50MTZfdCBpY2RfaWQ7CisgICAgICB1X2ludDE2X3QgaWNkX3NlcTsKKyAgICB9IGloX2lkc2VxOworICAgIHVfaW50MzJfdCBpaF92b2lkOworCisgICAgLyogSUNNUF9VTlJFQUNIX05FRURGUkFHIC0tIFBhdGggTVRVIERpc2NvdmVyeSAoUkZDMTE5MSkgKi8KKyAgICBzdHJ1Y3QgaWhfcG10dQorICAgIHsKKyAgICAgIHVfaW50MTZfdCBpcG1fdm9pZDsKKyAgICAgIHVfaW50MTZfdCBpcG1fbmV4dG10dTsKKyAgICB9IGloX3BtdHU7CisKKyAgICBzdHJ1Y3QgaWhfcnRyYWR2CisgICAgeworICAgICAgdV9pbnQ4X3QgaXJ0X251bV9hZGRyczsKKyAgICAgIHVfaW50OF90IGlydF93cGE7CisgICAgICB1X2ludDE2X3QgaXJ0X2xpZmV0aW1lOworICAgIH0gaWhfcnRyYWR2OworICB9IGljbXBfaHVuOworI2RlZmluZQlpY21wX3BwdHIJaWNtcF9odW4uaWhfcHB0cgorI2RlZmluZQlpY21wX2d3YWRkcglpY21wX2h1bi5paF9nd2FkZHIKKyNkZWZpbmUJaWNtcF9pZAkJaWNtcF9odW4uaWhfaWRzZXEuaWNkX2lkCisjZGVmaW5lCWljbXBfc2VxCWljbXBfaHVuLmloX2lkc2VxLmljZF9zZXEKKyNkZWZpbmUJaWNtcF92b2lkCWljbXBfaHVuLmloX3ZvaWQKKyNkZWZpbmUJaWNtcF9wbXZvaWQJaWNtcF9odW4uaWhfcG10dS5pcG1fdm9pZAorI2RlZmluZQlpY21wX25leHRtdHUJaWNtcF9odW4uaWhfcG10dS5pcG1fbmV4dG10dQorI2RlZmluZQlpY21wX251bV9hZGRycwlpY21wX2h1bi5paF9ydHJhZHYuaXJ0X251bV9hZGRycworI2RlZmluZQlpY21wX3dwYQlpY21wX2h1bi5paF9ydHJhZHYuaXJ0X3dwYQorI2RlZmluZQlpY21wX2xpZmV0aW1lCWljbXBfaHVuLmloX3J0cmFkdi5pcnRfbGlmZXRpbWUKKyAgdW5pb24KKyAgeworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIHVfaW50MzJfdCBpdHNfb3RpbWU7CisgICAgICB1X2ludDMyX3QgaXRzX3J0aW1lOworICAgICAgdV9pbnQzMl90IGl0c190dGltZTsKKyAgICB9IGlkX3RzOworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIHN0cnVjdCBpcCBpZGlfaXA7CisgICAgICAvKiBvcHRpb25zIGFuZCB0aGVuIDY0IGJpdHMgb2YgZGF0YSAqLworICAgIH0gaWRfaXA7CisgICAgc3RydWN0IGljbXBfcmFfYWRkciBpZF9yYWR2OworICAgIHVfaW50MzJfdCAgIGlkX21hc2s7CisgICAgdV9pbnQ4X3QgICAgaWRfZGF0YVsxXTsKKyAgfSBpY21wX2R1bjsKKyNkZWZpbmUJaWNtcF9vdGltZQlpY21wX2R1bi5pZF90cy5pdHNfb3RpbWUKKyNkZWZpbmUJaWNtcF9ydGltZQlpY21wX2R1bi5pZF90cy5pdHNfcnRpbWUKKyNkZWZpbmUJaWNtcF90dGltZQlpY21wX2R1bi5pZF90cy5pdHNfdHRpbWUKKyNkZWZpbmUJaWNtcF9pcAkJaWNtcF9kdW4uaWRfaXAuaWRpX2lwCisjZGVmaW5lCWljbXBfcmFkdglpY21wX2R1bi5pZF9yYWR2CisjZGVmaW5lCWljbXBfbWFzawlpY21wX2R1bi5pZF9tYXNrCisjZGVmaW5lCWljbXBfZGF0YQlpY21wX2R1bi5pZF9kYXRhCit9OworCisvKgorICogTG93ZXIgYm91bmRzIG9uIHBhY2tldCBsZW5ndGhzIGZvciB2YXJpb3VzIHR5cGVzLgorICogRm9yIHRoZSBlcnJvciBhZHZpY2UgcGFja2V0cyBtdXN0IGZpcnN0IGluc3VyZSB0aGF0IHRoZQorICogcGFja2V0IGlzIGxhcmdlIGVub3VnaCB0byBjb250YWluIHRoZSByZXR1cm5lZCBpcCBoZWFkZXIuCisgKiBPbmx5IHRoZW4gY2FuIHdlIGRvIHRoZSBjaGVjayB0byBzZWUgaWYgNjQgYml0cyBvZiBwYWNrZXQKKyAqIGRhdGEgaGF2ZSBiZWVuIHJldHVybmVkLCBzaW5jZSB3ZSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm5lZAorICogaXAgaGVhZGVyIGxlbmd0aC4KKyAqLworI2RlZmluZQlJQ01QX01JTkxFTgk4CQkJCS8qIGFicyBtaW5pbXVtICovCisjZGVmaW5lCUlDTVBfVFNMRU4JKDggKyAzICogc2l6ZW9mIChuX3RpbWUpKQkvKiB0aW1lc3RhbXAgKi8KKyNkZWZpbmUJSUNNUF9NQVNLTEVOCTEyCQkJCS8qIGFkZHJlc3MgbWFzayAqLworI2RlZmluZQlJQ01QX0FEVkxFTk1JTgkoOCArIHNpemVvZiAoc3RydWN0IGlwKSArIDgpCS8qIG1pbiAqLworI2lmbmRlZiBfSVBfVkhMCisjZGVmaW5lCUlDTVBfQURWTEVOKHApCSg4ICsgKChwKS0+aWNtcF9pcC5pcF9obCA8PCAyKSArIDgpCisJLyogTi5CLjogbXVzdCBzZXBhcmF0ZWx5IGNoZWNrIHRoYXQgaXBfaGwgPj0gNSAqLworI2Vsc2UKKyNkZWZpbmUJSUNNUF9BRFZMRU4ocCkJKDggKyAoSVBfVkhMX0hMKChwKS0+aWNtcF9pcC5pcF92aGwpIDw8IDIpICsgOCkKKwkvKiBOLkIuOiBtdXN0IHNlcGFyYXRlbHkgY2hlY2sgdGhhdCBoZWFkZXIgbGVuZ3RoID49IDUgKi8KKyNlbmRpZgorCisvKiBEZWZpbml0aW9uIG9mIHR5cGUgYW5kIGNvZGUgZmllbGRzLiAqLworLyogZGVmaW5lZCBhYm92ZTogSUNNUF9FQ0hPUkVQTFksIElDTVBfUkVESVJFQ1QsIElDTVBfRUNITyAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0gJCTMJCS8qIGRlc3QgdW5yZWFjaGFibGUsIGNvZGVzOiAqLworI2RlZmluZQlJQ01QX1NPVVJDRVFVRU5DSAk0CQkvKiBwYWNrZXQgbG9zdCwgc2xvdyBkb3duICovCisjZGVmaW5lCUlDTVBfUk9VVEVSQURWRVJUCTkJCS8qIHJvdXRlciBhZHZlcnRpc2VtZW50ICovCisjZGVmaW5lCUlDTVBfUk9VVEVSU09MSUNJVAkxMAkJLyogcm91dGVyIHNvbGljaXRhdGlvbiAqLworI2RlZmluZQlJQ01QX1RJTVhDRUVECQkxMQkJLyogdGltZSBleGNlZWRlZCwgY29kZTogKi8KKyNkZWZpbmUJSUNNUF9QQVJBTVBST0IJCTEyCQkvKiBpcCBoZWFkZXIgYmFkICovCisjZGVmaW5lCUlDTVBfVFNUQU1QCQkxMwkJLyogdGltZXN0YW1wIHJlcXVlc3QgKi8KKyNkZWZpbmUJSUNNUF9UU1RBTVBSRVBMWQkxNAkJLyogdGltZXN0YW1wIHJlcGx5ICovCisjZGVmaW5lCUlDTVBfSVJFUQkJMTUJCS8qIGluZm9ybWF0aW9uIHJlcXVlc3QgKi8KKyNkZWZpbmUJSUNNUF9JUkVRUkVQTFkJCTE2CQkvKiBpbmZvcm1hdGlvbiByZXBseSAqLworI2RlZmluZQlJQ01QX01BU0tSRVEJCTE3CQkvKiBhZGRyZXNzIG1hc2sgcmVxdWVzdCAqLworI2RlZmluZQlJQ01QX01BU0tSRVBMWQkJMTgJCS8qIGFkZHJlc3MgbWFzayByZXBseSAqLworCisjZGVmaW5lCUlDTVBfTUFYVFlQRQkJMTgKKworLyogVU5SRUFDSCBjb2RlcyAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfTkVUCSAgICAgICAgMAkvKiBiYWQgbmV0ICovCisjZGVmaW5lCUlDTVBfVU5SRUFDSF9IT1NUCSAgICAgICAgMQkvKiBiYWQgaG9zdCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfUFJPVE9DT0wJICAgICAgICAyCS8qIGJhZCBwcm90b2NvbCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfUE9SVAkgICAgICAgIDMJLyogYmFkIHBvcnQgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX05FRURGUkFHCSAgICAgICAgNAkvKiBJUF9ERiBjYXVzZWQgZHJvcCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfU1JDRkFJTAkgICAgICAgIDUJLyogc3JjIHJvdXRlIGZhaWxlZCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfTkVUX1VOS05PV04gICAgICAgIDYJLyogdW5rbm93biBuZXQgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX0hPU1RfVU5LTk9XTiAgICAgICA3CS8qIHVua25vd24gaG9zdCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfSVNPTEFURUQJICAgICAgICA4CS8qIHNyYyBob3N0IGlzb2xhdGVkICovCisjZGVmaW5lCUlDTVBfVU5SRUFDSF9ORVRfUFJPSElCCSAgICAgICAgOQkvKiBuZXQgZGVuaWVkICovCisjZGVmaW5lCUlDTVBfVU5SRUFDSF9IT1NUX1BST0hJQiAgICAgICAgMTAJLyogaG9zdCBkZW5pZWQgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX1RPU05FVAkgICAgICAgIDExCS8qIGJhZCB0b3MgZm9yIG5ldCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfVE9TSE9TVAkgICAgICAgIDEyCS8qIGJhZCB0b3MgZm9yIGhvc3QgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX0ZJTFRFUl9QUk9ISUIgICAgICAxMwkvKiBhZG1pbiBwcm9oaWIgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX0hPU1RfUFJFQ0VERU5DRSAgICAxNAkvKiBob3N0IHByZWMgdmlvLiAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfUFJFQ0VERU5DRV9DVVRPRkYgIDE1CS8qIHByZWMgY3V0b2ZmICovCisKKy8qIFJFRElSRUNUIGNvZGVzICovCisjZGVmaW5lCUlDTVBfUkVESVJFQ1RfTkVUCTAJCS8qIGZvciBuZXR3b3JrICovCisjZGVmaW5lCUlDTVBfUkVESVJFQ1RfSE9TVAkxCQkvKiBmb3IgaG9zdCAqLworI2RlZmluZQlJQ01QX1JFRElSRUNUX1RPU05FVAkyCQkvKiBmb3IgdG9zIGFuZCBuZXQgKi8KKyNkZWZpbmUJSUNNUF9SRURJUkVDVF9UT1NIT1NUCTMJCS8qIGZvciB0b3MgYW5kIGhvc3QgKi8KKworLyogVElNRVhDRUVEIGNvZGVzICovCisjZGVmaW5lCUlDTVBfVElNWENFRURfSU5UUkFOUwkwCQkvKiB0dGw9PTAgaW4gdHJhbnNpdCAqLworI2RlZmluZQlJQ01QX1RJTVhDRUVEX1JFQVNTCTEJCS8qIHR0bD09MCBpbiByZWFzcyAqLworCisvKiBQQVJBTVBST0IgY29kZSAqLworI2RlZmluZQlJQ01QX1BBUkFNUFJPQl9PUFRBQlNFTlQgMQkJLyogcmVxLiBvcHQuIGFic2VudCAqLworCisjZGVmaW5lCUlDTVBfSU5GT1RZUEUodHlwZSkgXAorCSgodHlwZSkgPT0gSUNNUF9FQ0hPUkVQTFkgfHwgKHR5cGUpID09IElDTVBfRUNITyB8fCBcCisJKHR5cGUpID09IElDTVBfUk9VVEVSQURWRVJUIHx8ICh0eXBlKSA9PSBJQ01QX1JPVVRFUlNPTElDSVQgfHwgXAorCSh0eXBlKSA9PSBJQ01QX1RTVEFNUCB8fCAodHlwZSkgPT0gSUNNUF9UU1RBTVBSRVBMWSB8fCBcCisJKHR5cGUpID09IElDTVBfSVJFUSB8fCAodHlwZSkgPT0gSUNNUF9JUkVRUkVQTFkgfHwgXAorCSh0eXBlKSA9PSBJQ01QX01BU0tSRVEgfHwgKHR5cGUpID09IElDTVBfTUFTS1JFUExZKQorCisjZW5kaWYgLyogX19VU0VfQlNEICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBuZXRpbmV0L2lwX2ljbXAuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L3RjcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L3RjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTg0MTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvdGNwLmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGNwLmgJOC4xIChCZXJrZWxleSkgNi8xMC85MworICovCisKKyNpZm5kZWYgX05FVElORVRfVENQX0gKKyNkZWZpbmUgX05FVElORVRfVENQX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyoKKyAqIFVzZXItc2V0dGFibGUgb3B0aW9ucyAodXNlZCB3aXRoIHNldHNvY2tvcHQpLgorICovCisjZGVmaW5lCVRDUF9OT0RFTEFZCSAxCS8qIERvbid0IGRlbGF5IHNlbmQgdG8gY29hbGVzY2UgcGFja2V0cyAgKi8KKyNkZWZpbmUJVENQX01BWFNFRwkgMgkvKiBTZXQgbWF4aW11bSBzZWdtZW50IHNpemUgICovCisjZGVmaW5lIFRDUF9DT1JLCSAzCS8qIENvbnRyb2wgc2VuZGluZyBvZiBwYXJ0aWFsIGZyYW1lcyAgKi8KKyNkZWZpbmUgVENQX0tFRVBJRExFCSA0CS8qIFN0YXJ0IGtlZXBsaXZlcyBhZnRlciB0aGlzIHBlcmlvZCAqLworI2RlZmluZSBUQ1BfS0VFUElOVFZMCSA1CS8qIEludGVydmFsIGJldHdlZW4ga2VlcGFsaXZlcyAqLworI2RlZmluZSBUQ1BfS0VFUENOVAkgNgkvKiBOdW1iZXIgb2Yga2VlcGFsaXZlcyBiZWZvcmUgZGVhdGggKi8KKyNkZWZpbmUgVENQX1NZTkNOVAkgNwkvKiBOdW1iZXIgb2YgU1lOIHJldHJhbnNtaXRzICovCisjZGVmaW5lIFRDUF9MSU5HRVIyCSA4CS8qIExpZmUgdGltZSBvZiBvcnBoYW5lZCBGSU4tV0FJVC0yIHN0YXRlICovCisjZGVmaW5lIFRDUF9ERUZFUl9BQ0NFUFQgOQkvKiBXYWtlIHVwIGxpc3RlbmVyIG9ubHkgd2hlbiBkYXRhIGFycml2ZSAqLworI2RlZmluZSBUQ1BfV0lORE9XX0NMQU1QIDEwCS8qIEJvdW5kIGFkdmVydGlzZWQgd2luZG93ICovCisjZGVmaW5lIFRDUF9JTkZPCSAxMQkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbm5lY3Rpb24uICovCisjZGVmaW5lCVRDUF9RVUlDS0FDSwkgMTIJLyogQm9jay9yZWVuYWJsZSBxdWljayBBQ0tzLiAgKi8KKyNkZWZpbmUgVENQX0NPTkdFU1RJT04JIDEzCS8qIENvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG0uICAqLworI2RlZmluZSBUQ1BfTUQ1U0lHCSAxNAkvKiBUQ1AgTUQ1IFNpZ25hdHVyZSAoUkZDMjM4NSkgKi8KKworI2lmZGVmIF9fVVNFX01JU0MKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworIyBpZmRlZiBfX0ZBVk9SX0JTRAordHlwZWRlZgl1X2ludDMyX3QgdGNwX3NlcTsKKy8qCisgKiBUQ1AgaGVhZGVyLgorICogUGVyIFJGQyA3OTMsIFNlcHRlbWJlciwgMTk4MS4KKyAqLworc3RydWN0IHRjcGhkcgorICB7CisgICAgdV9pbnQxNl90IHRoX3Nwb3J0OwkJLyogc291cmNlIHBvcnQgKi8KKyAgICB1X2ludDE2X3QgdGhfZHBvcnQ7CQkvKiBkZXN0aW5hdGlvbiBwb3J0ICovCisgICAgdGNwX3NlcSB0aF9zZXE7CQkvKiBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB0Y3Bfc2VxIHRoX2FjazsJCS8qIGFja25vd2xlZGdlbWVudCBudW1iZXIgKi8KKyMgIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyAgICB1X2ludDhfdCB0aF94Mjo0OwkJLyogKHVudXNlZCkgKi8KKyAgICB1X2ludDhfdCB0aF9vZmY6NDsJCS8qIGRhdGEgb2Zmc2V0ICovCisjICBlbmRpZgorIyAgaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorICAgIHVfaW50OF90IHRoX29mZjo0OwkJLyogZGF0YSBvZmZzZXQgKi8KKyAgICB1X2ludDhfdCB0aF94Mjo0OwkJLyogKHVudXNlZCkgKi8KKyMgIGVuZGlmCisgICAgdV9pbnQ4X3QgdGhfZmxhZ3M7CisjICBkZWZpbmUgVEhfRklOCTB4MDEKKyMgIGRlZmluZSBUSF9TWU4JMHgwMgorIyAgZGVmaW5lIFRIX1JTVAkweDA0CisjICBkZWZpbmUgVEhfUFVTSAkweDA4CisjICBkZWZpbmUgVEhfQUNLCTB4MTAKKyMgIGRlZmluZSBUSF9VUkcJMHgyMAorICAgIHVfaW50MTZfdCB0aF93aW47CQkvKiB3aW5kb3cgKi8KKyAgICB1X2ludDE2X3QgdGhfc3VtOwkJLyogY2hlY2tzdW0gKi8KKyAgICB1X2ludDE2X3QgdGhfdXJwOwkJLyogdXJnZW50IHBvaW50ZXIgKi8KK307CisKKyMgZWxzZSAvKiAhX19GQVZPUl9CU0QgKi8KK3N0cnVjdCB0Y3BoZHIKKyAgeworICAgIHVfaW50MTZfdCBzb3VyY2U7CisgICAgdV9pbnQxNl90IGRlc3Q7CisgICAgdV9pbnQzMl90IHNlcTsKKyAgICB1X2ludDMyX3QgYWNrX3NlcTsKKyMgIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyAgICB1X2ludDE2X3QgcmVzMTo0OworICAgIHVfaW50MTZfdCBkb2ZmOjQ7CisgICAgdV9pbnQxNl90IGZpbjoxOworICAgIHVfaW50MTZfdCBzeW46MTsKKyAgICB1X2ludDE2X3QgcnN0OjE7CisgICAgdV9pbnQxNl90IHBzaDoxOworICAgIHVfaW50MTZfdCBhY2s6MTsKKyAgICB1X2ludDE2X3QgdXJnOjE7CisgICAgdV9pbnQxNl90IHJlczI6MjsKKyMgIGVsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorICAgIHVfaW50MTZfdCBkb2ZmOjQ7CisgICAgdV9pbnQxNl90IHJlczE6NDsKKyAgICB1X2ludDE2X3QgcmVzMjoyOworICAgIHVfaW50MTZfdCB1cmc6MTsKKyAgICB1X2ludDE2X3QgYWNrOjE7CisgICAgdV9pbnQxNl90IHBzaDoxOworICAgIHVfaW50MTZfdCByc3Q6MTsKKyAgICB1X2ludDE2X3Qgc3luOjE7CisgICAgdV9pbnQxNl90IGZpbjoxOworIyAgZWxzZQorIyAgIGVycm9yICJBZGp1c3QgeW91ciA8Yml0cy9lbmRpYW4uaD4gZGVmaW5lcyIKKyMgIGVuZGlmCisgICAgdV9pbnQxNl90IHdpbmRvdzsKKyAgICB1X2ludDE2X3QgY2hlY2s7CisgICAgdV9pbnQxNl90IHVyZ19wdHI7Cit9OworIyBlbmRpZiAvKiBfX0ZBVk9SX0JTRCAqLworCitlbnVtCit7CisgIFRDUF9FU1RBQkxJU0hFRCA9IDEsCisgIFRDUF9TWU5fU0VOVCwKKyAgVENQX1NZTl9SRUNWLAorICBUQ1BfRklOX1dBSVQxLAorICBUQ1BfRklOX1dBSVQyLAorICBUQ1BfVElNRV9XQUlULAorICBUQ1BfQ0xPU0UsCisgIFRDUF9DTE9TRV9XQUlULAorICBUQ1BfTEFTVF9BQ0ssCisgIFRDUF9MSVNURU4sCisgIFRDUF9DTE9TSU5HICAgLyogbm93IGEgdmFsaWQgc3RhdGUgKi8KK307CisKKyMgZGVmaW5lIFRDUE9QVF9FT0wJCTAKKyMgZGVmaW5lIFRDUE9QVF9OT1AJCTEKKyMgZGVmaW5lIFRDUE9QVF9NQVhTRUcJCTIKKyMgZGVmaW5lIFRDUE9MRU5fTUFYU0VHCQk0CisjIGRlZmluZSBUQ1BPUFRfV0lORE9XCQkzCisjIGRlZmluZSBUQ1BPTEVOX1dJTkRPVwkJMworIyBkZWZpbmUgVENQT1BUX1NBQ0tfUEVSTUlUVEVECTQJCS8qIEV4cGVyaW1lbnRhbCAqLworIyBkZWZpbmUgVENQT0xFTl9TQUNLX1BFUk1JVFRFRAkyCisjIGRlZmluZSBUQ1BPUFRfU0FDSwkJNQkJLyogRXhwZXJpbWVudGFsICovCisjIGRlZmluZSBUQ1BPUFRfVElNRVNUQU1QCTgKKyMgZGVmaW5lIFRDUE9MRU5fVElNRVNUQU1QCTEwCisjIGRlZmluZSBUQ1BPTEVOX1RTVEFNUF9BUFBBCShUQ1BPTEVOX1RJTUVTVEFNUCsyKSAvKiBhcHBlbmRpeCBBICovCisKKyMgZGVmaW5lIFRDUE9QVF9UU1RBTVBfSERSCVwKKyAgICAoVENQT1BUX05PUDw8MjR8VENQT1BUX05PUDw8MTZ8VENQT1BUX1RJTUVTVEFNUDw8OHxUQ1BPTEVOX1RJTUVTVEFNUCkKKworLyoKKyAqIERlZmF1bHQgbWF4aW11bSBzZWdtZW50IHNpemUgZm9yIFRDUC4KKyAqIFdpdGggYW4gSVAgTVNTIG9mIDU3NiwgdGhpcyBpcyA1MzYsCisgKiBidXQgNTEyIGlzIHByb2JhYmx5IG1vcmUgY29udmVuaWVudC4KKyAqIFRoaXMgc2hvdWxkIGJlIGRlZmluZWQgYXMgTUlOKDUxMiwgSVBfTVNTIC0gc2l6ZW9mIChzdHJ1Y3QgdGNwaXBoZHIpKS4KKyAqLworIyBkZWZpbmUgVENQX01TUwk1MTIKKworIyBkZWZpbmUgVENQX01BWFdJTgk2NTUzNQkvKiBsYXJnZXN0IHZhbHVlIGZvciAodW5zY2FsZWQpIHdpbmRvdyAqLworCisjIGRlZmluZSBUQ1BfTUFYX1dJTlNISUZUCTE0CS8qIG1heGltdW0gd2luZG93IHNoaWZ0ICovCisKKyMgZGVmaW5lIFNPTF9UQ1AJCTYJLyogVENQIGxldmVsICovCisKKworIyBkZWZpbmUgVENQSV9PUFRfVElNRVNUQU1QUwkxCisjIGRlZmluZSBUQ1BJX09QVF9TQUNLCQkyCisjIGRlZmluZSBUQ1BJX09QVF9XU0NBTEUJNAorIyBkZWZpbmUgVENQSV9PUFRfRUNOCQk4CisKKy8qIFZhbHVlcyBmb3IgdGNwaV9zdGF0ZS4gICovCitlbnVtIHRjcF9jYV9zdGF0ZQoreworICBUQ1BfQ0FfT3BlbiA9IDAsCisgIFRDUF9DQV9EaXNvcmRlciA9IDEsCisgIFRDUF9DQV9DV1IgPSAyLAorICBUQ1BfQ0FfUmVjb3ZlcnkgPSAzLAorICBUQ1BfQ0FfTG9zcyA9IDQKK307CisKK3N0cnVjdCB0Y3BfaW5mbworeworICB1X2ludDhfdAl0Y3BpX3N0YXRlOworICB1X2ludDhfdAl0Y3BpX2NhX3N0YXRlOworICB1X2ludDhfdAl0Y3BpX3JldHJhbnNtaXRzOworICB1X2ludDhfdAl0Y3BpX3Byb2JlczsKKyAgdV9pbnQ4X3QJdGNwaV9iYWNrb2ZmOworICB1X2ludDhfdAl0Y3BpX29wdGlvbnM7CisgIHVfaW50OF90CXRjcGlfc25kX3dzY2FsZSA6IDQsIHRjcGlfcmN2X3dzY2FsZSA6IDQ7CisKKyAgdV9pbnQzMl90CXRjcGlfcnRvOworICB1X2ludDMyX3QJdGNwaV9hdG87CisgIHVfaW50MzJfdAl0Y3BpX3NuZF9tc3M7CisgIHVfaW50MzJfdAl0Y3BpX3Jjdl9tc3M7CisKKyAgdV9pbnQzMl90CXRjcGlfdW5hY2tlZDsKKyAgdV9pbnQzMl90CXRjcGlfc2Fja2VkOworICB1X2ludDMyX3QJdGNwaV9sb3N0OworICB1X2ludDMyX3QJdGNwaV9yZXRyYW5zOworICB1X2ludDMyX3QJdGNwaV9mYWNrZXRzOworCisgIC8qIFRpbWVzLiAqLworICB1X2ludDMyX3QJdGNwaV9sYXN0X2RhdGFfc2VudDsKKyAgdV9pbnQzMl90CXRjcGlfbGFzdF9hY2tfc2VudDsJLyogTm90IHJlbWVtYmVyZWQsIHNvcnJ5LiAgKi8KKyAgdV9pbnQzMl90CXRjcGlfbGFzdF9kYXRhX3JlY3Y7CisgIHVfaW50MzJfdAl0Y3BpX2xhc3RfYWNrX3JlY3Y7CisKKyAgLyogTWV0cmljcy4gKi8KKyAgdV9pbnQzMl90CXRjcGlfcG10dTsKKyAgdV9pbnQzMl90CXRjcGlfcmN2X3NzdGhyZXNoOworICB1X2ludDMyX3QJdGNwaV9ydHQ7CisgIHVfaW50MzJfdAl0Y3BpX3J0dHZhcjsKKyAgdV9pbnQzMl90CXRjcGlfc25kX3NzdGhyZXNoOworICB1X2ludDMyX3QJdGNwaV9zbmRfY3duZDsKKyAgdV9pbnQzMl90CXRjcGlfYWR2bXNzOworICB1X2ludDMyX3QJdGNwaV9yZW9yZGVyaW5nOworCisgIHVfaW50MzJfdAl0Y3BpX3Jjdl9ydHQ7CisgIHVfaW50MzJfdAl0Y3BpX3Jjdl9zcGFjZTsKKworICB1X2ludDMyX3QJdGNwaV90b3RhbF9yZXRyYW5zOworfTsKKworCisvKiBGb3IgVENQX01ENVNJRyBzb2NrZXQgb3B0aW9uLiAgKi8KKyNkZWZpbmUgVENQX01ENVNJR19NQVhLRVlMRU4JODAKKworc3RydWN0IHRjcF9tZDVzaWcKK3sKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgdGNwbV9hZGRyOwkJLyogQWRkcmVzcyBhc3NvY2lhdGVkLiAgKi8KKyAgdV9pbnQxNl90CV9fdGNwbV9wYWQxOwkJCS8qIFplcm8uICAqLworICB1X2ludDE2X3QJdGNwbV9rZXlsZW47CQkJLyogS2V5IGxlbmd0aC4gICovCisgIHVfaW50MzJfdAlfX3RjcG1fcGFkMjsJCQkvKiBaZXJvLiAgKi8KKyAgdV9pbnQ4X3QJdGNwbV9rZXlbVENQX01ENVNJR19NQVhLRVlMRU5dOwkvKiBLZXkgKGJpbmFyeSkuICAqLworfTsKKworI2VuZGlmIC8qIE1pc2MuICAqLworCisjZW5kaWYgLyogbmV0aW5ldC90Y3AuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L3VkcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L3VkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMWJlYjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvdWRwLmgKQEAgLTAsMCArMSw4OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTMsMTk5NS0xOTk3LDIwMDQsMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk4MiwgMTk4NiBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fTkVUSU5FVF9VRFBfSAorI2RlZmluZSBfX05FVElORVRfVURQX0ggICAgMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCisvKiBVRFAgaGVhZGVyIGFzIHNwZWNpZmllZCBieSBSRkMgNzY4LCBBdWd1c3QgMTk4MC4gKi8KKyNpZmRlZiBfX0ZBVk9SX0JTRAorCitzdHJ1Y3QgdWRwaGRyCit7CisgIHVfaW50MTZfdCB1aF9zcG9ydDsJCS8qIHNvdXJjZSBwb3J0ICovCisgIHVfaW50MTZfdCB1aF9kcG9ydDsJCS8qIGRlc3RpbmF0aW9uIHBvcnQgKi8KKyAgdV9pbnQxNl90IHVoX3VsZW47CQkvKiB1ZHAgbGVuZ3RoICovCisgIHVfaW50MTZfdCB1aF9zdW07CQkvKiB1ZHAgY2hlY2tzdW0gKi8KK307CisKKyNlbHNlCisKK3N0cnVjdCB1ZHBoZHIKK3sKKyAgdV9pbnQxNl90IHNvdXJjZTsKKyAgdV9pbnQxNl90IGRlc3Q7CisgIHVfaW50MTZfdCBsZW47CisgIHVfaW50MTZfdCBjaGVjazsKK307CisjZW5kaWYKKworLyogVURQIHNvY2tldCBvcHRpb25zICovCisjZGVmaW5lIFVEUF9DT1JLCTEJLyogTmV2ZXIgc2VuZCBwYXJ0aWFsbHkgY29tcGxldGUgc2VnbWVudHMuICAqLworI2RlZmluZSBVRFBfRU5DQVAJMTAwCS8qIFNldCB0aGUgc29ja2V0IHRvIGFjY2VwdAorCQkJCSAgIGVuY2Fwc3VsYXRlZCBwYWNrZXRzLiAgKi8KKworLyogVURQIGVuY2Fwc3VsYXRpb24gdHlwZXMgKi8KKyNkZWZpbmUgVURQX0VOQ0FQX0VTUElOVURQX05PTl9JS0UgMQkvKiBkcmFmdC1pZXRmLWlwc2VjLW5hdC10LWlrZS0wMC8wMSAqLworI2RlZmluZSBVRFBfRU5DQVBfRVNQSU5VRFAJMgkvKiBkcmFmdC1pZXRmLWlwc2VjLXVkcC1lbmNhcHMtMDYgKi8KKyNkZWZpbmUgVURQX0VOQ0FQX0wyVFBJTlVEUAkzCS8qIHJmYzI2NjEgKi8KKworI2RlZmluZSBTT0xfVURQICAgICAgICAgICAgMTcgICAgICAvKiBzb2Nrb3B0IGxldmVsIGZvciBVRFAgKi8KKworI2VuZGlmIC8qIG5ldGluZXQvdWRwLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aXB4L2lweC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpcHgvaXB4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ViNDJlZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aXB4L2lweC5oCkBAIC0wLDAgKzEsMTEzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTUsIDk2LCA5NywgOTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19ORVRJUFhfSVBYX0gKKyNkZWZpbmUgX19ORVRJUFhfSVBYX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMvc29ja2FkZHIuaD4KKworX19CRUdJTl9ERUNMUworCisjZGVmaW5lIFNPTF9JUFggICAgMjU2ICAgICAgICAgIC8qIHNvY2tvcHQgbGV2ZWwgKi8KKworI2RlZmluZSBJUFhfVFlQRSAgICAgICAgMQorI2RlZmluZSBJUFhfTk9ERV9MRU4JNgorI2RlZmluZSBJUFhfTVRVCQk1NzYKKworc3RydWN0IHNvY2thZGRyX2lweAorICB7CisgICAgc2FfZmFtaWx5X3Qgc2lweF9mYW1pbHk7CisgICAgdV9pbnQxNl90IHNpcHhfcG9ydDsKKyAgICB1X2ludDMyX3Qgc2lweF9uZXR3b3JrOworICAgIHVuc2lnbmVkIGNoYXIgc2lweF9ub2RlW0lQWF9OT0RFX0xFTl07CisgICAgdV9pbnQ4X3Qgc2lweF90eXBlOworICAgIHVuc2lnbmVkIGNoYXIgc2lweF96ZXJvOwkvKiAxNiBieXRlIGZpbGwgKi8KKyAgfTsKKworLyoKKyAqCVNvIHdlIGNhbiBmaXQgdGhlIGV4dHJhIGluZm8gZm9yIFNJT0NTSUZBRERSIGludG8gdGhlIGFkZHJlc3MgbmljZWx5CisgKi8KKworI2RlZmluZSBzaXB4X3NwZWNpYWwJc2lweF9wb3J0CisjZGVmaW5lIHNpcHhfYWN0aW9uCXNpcHhfemVybworI2RlZmluZSBJUFhfRExUSVRGCTAKKyNkZWZpbmUgSVBYX0NSVElURgkxCisKK3R5cGVkZWYgc3RydWN0IGlweF9yb3V0ZV9kZWZpbml0aW9uCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGlweF9uZXR3b3JrOworICAgIHVuc2lnbmVkIGxvbmcgaXB4X3JvdXRlcl9uZXR3b3JrOworICAgIHVuc2lnbmVkIGNoYXIgaXB4X3JvdXRlcl9ub2RlW0lQWF9OT0RFX0xFTl07CisgIH0KK2lweF9yb3V0ZV9kZWZpbml0aW9uOworCit0eXBlZGVmIHN0cnVjdCBpcHhfaW50ZXJmYWNlX2RlZmluaXRpb24KKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaXB4X25ldHdvcms7CisgICAgdW5zaWduZWQgY2hhciBpcHhfZGV2aWNlWzE2XTsKKyAgICB1bnNpZ25lZCBjaGFyIGlweF9kbGlua190eXBlOworI2RlZmluZSBJUFhfRlJBTUVfTk9ORQkJMAorI2RlZmluZSBJUFhfRlJBTUVfU05BUAkJMQorI2RlZmluZSBJUFhfRlJBTUVfODAyMgkJMgorI2RlZmluZSBJUFhfRlJBTUVfRVRIRVJJSQkzCisjZGVmaW5lIElQWF9GUkFNRV84MDIzCQk0CisjZGVmaW5lIElQWF9GUkFNRV9UUl84MDIyCTUKKyAgICB1bnNpZ25lZCBjaGFyIGlweF9zcGVjaWFsOworI2RlZmluZSBJUFhfU1BFQ0lBTF9OT05FCTAKKyNkZWZpbmUgSVBYX1BSSU1BUlkJCTEKKyNkZWZpbmUgSVBYX0lOVEVSTkFMCQkyCisgICAgdW5zaWduZWQgY2hhciBpcHhfbm9kZVtJUFhfTk9ERV9MRU5dOworICB9CitpcHhfaW50ZXJmYWNlX2RlZmluaXRpb247CisKK3R5cGVkZWYgc3RydWN0IGlweF9jb25maWdfZGF0YQorICB7CisgICAgdW5zaWduZWQgY2hhciBpcHhjZmdfYXV0b19zZWxlY3RfcHJpbWFyeTsKKyAgICB1bnNpZ25lZCBjaGFyIGlweGNmZ19hdXRvX2NyZWF0ZV9pbnRlcmZhY2VzOworICB9CitpcHhfY29uZmlnX2RhdGE7CisKKy8qCisgKiBPTEQgUm91dGUgRGVmaW5pdGlvbiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAqLworCitzdHJ1Y3QgaXB4X3JvdXRlX2RlZgorICB7CisgICAgdW5zaWduZWQgbG9uZyBpcHhfbmV0d29yazsKKyAgICB1bnNpZ25lZCBsb25nIGlweF9yb3V0ZXJfbmV0d29yazsKKyNkZWZpbmUgSVBYX1JPVVRFX05PX1JPVVRFUgkwCisgICAgdW5zaWduZWQgY2hhciBpcHhfcm91dGVyX25vZGVbSVBYX05PREVfTEVOXTsKKyAgICB1bnNpZ25lZCBjaGFyIGlweF9kZXZpY2VbMTZdOworICAgIHVuc2lnbmVkIHNob3J0IGlweF9mbGFnczsKKyNkZWZpbmUgSVBYX1JUX1NOQVAJCTgKKyNkZWZpbmUgSVBYX1JUXzgwMjIJCTQKKyNkZWZpbmUgSVBYX1JUX0JMVUVCT09LCQkyCisjZGVmaW5lIElQWF9SVF9ST1VURUQJCTEKKyAgfTsKKworI2RlZmluZSBTSU9DQUlQWElURkNSVAkJKFNJT0NQUk9UT1BSSVZBVEUpCisjZGVmaW5lIFNJT0NBSVBYUFJJU0xUCQkoU0lPQ1BST1RPUFJJVkFURSArIDEpCisjZGVmaW5lIFNJT0NJUFhDRkdEQVRBCQkoU0lPQ1BST1RPUFJJVkFURSArIDIpCisjZGVmaW5lIFNJT0NJUFhOQ1BDT05OCQkoU0lPQ1BST1RPUFJJVkFURSArIDMpCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBuZXRpcHgvaXB4LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aXVjdi9pdWN2LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGl1Y3YvaXVjdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OWViZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldGl1Y3YvaXVjdi5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfX05FVElVQ1ZfSVVDVl9ICisjZGVmaW5lIF9fTkVUSVVDVl9JVUNWX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3NvY2thZGRyLmg+CisKK19fQkVHSU5fREVDTFMKKworc3RydWN0IHNvY2thZGRyX2l1Y3YKKyAgeworICAgIF9fU09DS0FERFJfQ09NTU9OIChzaXVjdl8pOworICAgIHVuc2lnbmVkIHNob3J0CXNpdWN2X3BvcnQ7CQkvKiBSZXNlcnZlZCAqLworICAgIHVuc2lnbmVkIGludAlzaXVjdl9hZGRyOwkJLyogUmVzZXJ2ZWQgKi8KKyAgICBjaGFyCQlzaXVjdl9ub2RlaWRbOF07CS8qIFJlc2VydmVkICovCisgICAgY2hhcgkJc2l1Y3ZfdXNlcl9pZFs4XTsJLyogR3Vlc3QgVXNlciBJZCAqLworICAgIGNoYXIJCXNpdWN2X25hbWVbOF07CQkvKiBBcHBsaWNhdGlvbiBOYW1lICovCisgIH07CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRwYWNrZXQvcGFja2V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldHBhY2tldC9wYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzYzNDI4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRwYWNrZXQvcGFja2V0LmgKQEAgLTAsMCArMSw2NCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIHVzZSB3aXRoIExpbnV4IEFGX1BBQ0tFVCBzb2NrZXRzLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9fTkVUUEFDS0VUX1BBQ0tFVF9ICisjZGVmaW5lIF9fTkVUUEFDS0VUX1BBQ0tFVF9ICTEKKworc3RydWN0IHNvY2thZGRyX2xsCisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgc2xsX2ZhbWlseTsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgc2xsX3Byb3RvY29sOworICAgIGludCBzbGxfaWZpbmRleDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgc2xsX2hhdHlwZTsKKyAgICB1bnNpZ25lZCBjaGFyIHNsbF9wa3R0eXBlOworICAgIHVuc2lnbmVkIGNoYXIgc2xsX2hhbGVuOworICAgIHVuc2lnbmVkIGNoYXIgc2xsX2FkZHJbOF07CisgIH07CisKKy8qIFBhY2tldCB0eXBlcy4gICovCisKKyNkZWZpbmUgUEFDS0VUX0hPU1QJCTAJCS8qIFRvIHVzLiAgKi8KKyNkZWZpbmUgUEFDS0VUX0JST0FEQ0FTVAkxCQkvKiBUbyBhbGwuICAqLworI2RlZmluZSBQQUNLRVRfTVVMVElDQVNUCTIJCS8qIFRvIGdyb3VwLiAgKi8KKyNkZWZpbmUgUEFDS0VUX09USEVSSE9TVAkzCQkvKiBUbyBzb21lb25lIGVsc2UuICAqLworI2RlZmluZSBQQUNLRVRfT1VUR09JTkcJCTQJCS8qIE9yaWdpbmF0ZWQgYnkgdXMgLiAqLworI2RlZmluZSBQQUNLRVRfTE9PUEJBQ0sJCTUKKyNkZWZpbmUgUEFDS0VUX0ZBU1RST1VURQk2CisKKy8qIFBhY2tldCBzb2NrZXQgb3B0aW9ucy4gICovCisKKyNkZWZpbmUgUEFDS0VUX0FERF9NRU1CRVJTSElQCQkxCisjZGVmaW5lIFBBQ0tFVF9EUk9QX01FTUJFUlNISVAJCTIKKyNkZWZpbmUJUEFDS0VUX1JFQ1ZfT1VUUFVUCQkzCisjZGVmaW5lCVBBQ0tFVF9SWF9SSU5HCQkJNQorI2RlZmluZQlQQUNLRVRfU1RBVElTVElDUwkJNgorCitzdHJ1Y3QgcGFja2V0X21yZXEKKyAgeworICAgIGludCBtcl9pZmluZGV4OworICAgIHVuc2lnbmVkIHNob3J0IGludCBtcl90eXBlOworICAgIHVuc2lnbmVkIHNob3J0IGludCBtcl9hbGVuOworICAgIHVuc2lnbmVkIGNoYXIgbXJfYWRkcmVzc1s4XTsKKyAgfTsKKworI2RlZmluZSBQQUNLRVRfTVJfTVVMVElDQVNUCTAKKyNkZWZpbmUgUEFDS0VUX01SX1BST01JU0MJMQorI2RlZmluZSBQQUNLRVRfTVJfQUxMTVVMVEkJMgorCisjZW5kaWYJLyogbmV0cGFja2V0L3BhY2tldC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldHJvbS9uZXRyb20uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0cm9tL25ldHJvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODQ3NzIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25ldHJvbS9uZXRyb20uaApAQCAtMCwwICsxLDg0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVFJPTV9ORVRST01fSAorI2RlZmluZSBfTkVUUk9NX05FVFJPTV9ICTEKKworI2luY2x1ZGUgPG5ldGF4MjUvYXgyNS5oPgorCisvKiBTZXRzb2Nrb3B0aW9ucygyKSBsZXZlbC4gIFRoYW5rcyB0byBCU0QgdGhlc2UgbXVzdCBtYXRjaCBJUFBST1RPX3h4eC4gICovCisjZGVmaW5lIFNPTF9ORVRST00JMjU5CisKKy8qIE5ldFJvbSBjb250cm9sIHZhbHVlczogKi8KKyNkZWZpbmUgTkVUUk9NX1QxCTEKKyNkZWZpbmUgTkVUUk9NX1QyCTIKKyNkZWZpbmUgTkVUUk9NX04yCTMKKyNkZWZpbmUgTkVUUk9NX1BBQ0xFTgk1CisjZGVmaW5lCU5FVFJPTV9UNAk2CisjZGVmaW5lIE5FVFJPTV9JRExFCTcKKworI2RlZmluZSBORVRST01fS0lMTAk5OQorCisvKiBUeXBlIG9mIHJvdXRlOiAqLworI2RlZmluZSBORVRST01fTkVJR0ggICAgMAorI2RlZmluZSBORVRST01fTk9ERSAgICAgMQorCitzdHJ1Y3QgbnJfcm91dGVfc3RydWN0CisgIHsKKyAgICBpbnQgdHlwZTsKKyAgICBheDI1X2FkZHJlc3MgY2FsbHNpZ247CisgICAgY2hhciBkZXZpY2VbMTZdOworICAgIHVuc2lnbmVkIGludCBxdWFsaXR5OworICAgIGNoYXIgbW5lbW9uaWNbN107CisgICAgYXgyNV9hZGRyZXNzIG5laWdoYm91cjsKKyAgICB1bnNpZ25lZCBpbnQgb2JzX2NvdW50OworICAgIHVuc2lnbmVkIGludCBuZGlnaXM7CisgICAgYXgyNV9hZGRyZXNzIGRpZ2lwZWF0ZXJzW0FYMjVfTUFYX0RJR0lTXTsKKyAgfTsKKworLyogTmV0Um9tIHNvY2tldCBpb2N0bHM6ICovCisjZGVmaW5lCVNJT0NOUkdFVFBBUk1TCQkoU0lPQ1BST1RPUFJJVkFURSswKQorI2RlZmluZQlTSU9DTlJTRVRQQVJNUwkJKFNJT0NQUk9UT1BSSVZBVEUrMSkKKyNkZWZpbmUJU0lPQ05SREVDT0JTCQkoU0lPQ1BST1RPUFJJVkFURSsyKQorI2RlZmluZQlTSU9DTlJSVENUTAkJKFNJT0NQUk9UT1BSSVZBVEUrMykKKyNkZWZpbmUJU0lPQ05SQ1RMQ09OCQkoU0lPQ1BST1RPUFJJVkFURSs0KQorCisvKiBOZXRSb20gcGFyYW1ldGVyIHN0cnVjdHVyZTogKi8KK3N0cnVjdCBucl9wYXJtc19zdHJ1Y3QKKyAgeworICAgIHVuc2lnbmVkIGludCBxdWFsaXR5OworICAgIHVuc2lnbmVkIGludCBvYnNfY291bnQ7CisgICAgdW5zaWduZWQgaW50IHR0bDsKKyAgICB1bnNpZ25lZCBpbnQgdGltZW91dDsKKyAgICB1bnNpZ25lZCBpbnQgYWNrX2RlbGF5OworICAgIHVuc2lnbmVkIGludCBidXN5X2RlbGF5OworICAgIHVuc2lnbmVkIGludCB0cmllczsKKyAgICB1bnNpZ25lZCBpbnQgd2luZG93OworICAgIHVuc2lnbmVkIGludCBwYWNsZW47CisgIH07CisKKy8qIE5ldFJvbSBjb250cm9sIHN0cnVjdHVyZTogKi8KK3N0cnVjdCBucl9jdGxfc3RydWN0CisgIHsKKyAgICB1bnNpZ25lZCBjaGFyIGluZGV4OworICAgIHVuc2lnbmVkIGNoYXIgaWQ7CisgICAgdW5zaWduZWQgaW50IGNtZDsKKyAgICB1bnNpZ25lZCBsb25nIGFyZzsKKyAgfTsKKworI2VuZGlmIC8qIG5ldHJvbS9uZXRyb20uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRyb3NlL3Jvc2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0cm9zZS9yb3NlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiYTdkNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0cm9zZS9yb3NlLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qIERlZmluaXRpb25zIGZvciBSb3NlIHBhY2tldCByYWRpbyBhZGRyZXNzIGZhbWlseS4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogV2hhdCBmb2xsb3dzIGlzIGNvcGllZCBmcm9tIHRoZSAyLjEuOTMgPGxpbnV4L3Jvc2UuaD4uICAqLworCisjaWZuZGVmIF9ORVRST1NFX1JPU0VfSAorI2RlZmluZSBfTkVUUk9TRV9ST1NFX0ggMQorCisvKiBTb2NrZXQgbGV2ZWwgdmFsdWVzLiAgKi8KKyNkZWZpbmUgU09MX1JPU0UgICAgICAgIDI2MAorCisKKy8qIFRoZXNlIGFyZSB0aGUgcHVibGljIGVsZW1lbnRzIG9mIHRoZSBMaW51eCBrZXJuZWwgUm9zZQorICAgaW1wbGVtZW50YXRpb24uICBGb3Iga2VybmVsIEFYLjI1IHNlZSB0aGUgZmlsZSBheDI1LmguIFRoaXMgZmlsZQorICAgcmVxdWlyZXMgYXgyNS5oIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYXgyNV9hZGRyZXNzIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIFJPU0VfTVRVCTI1MQorCisjZGVmaW5lIFJPU0VfTUFYX0RJR0lTCTYKKworI2RlZmluZQlST1NFX0RFRkVSCTEKKyNkZWZpbmUJUk9TRV9UMQkJMgorI2RlZmluZQlST1NFX1QyCQkzCisjZGVmaW5lCVJPU0VfVDMJCTQKKyNkZWZpbmUJUk9TRV9JRExFCTUKKyNkZWZpbmUJUk9TRV9RQklUSU5DTAk2CisjZGVmaW5lCVJPU0VfSE9MREJBQ0sJNworCisjZGVmaW5lCVNJT0NSU0dDQVVTRQkJKFNJT0NQUk9UT1BSSVZBVEUgKyAwKQorI2RlZmluZQlTSU9DUlNTQ0FVU0UJCShTSU9DUFJPVE9QUklWQVRFICsgMSkKKyNkZWZpbmUJU0lPQ1JTTDJDQUxMCQkoU0lPQ1BST1RPUFJJVkFURSArIDIpCisjZGVmaW5lCVNJT0NSU1NMMkNBTEwJCShTSU9DUFJPVE9QUklWQVRFICsgMikKKyNkZWZpbmUJU0lPQ1JTQUNDRVBUCQkoU0lPQ1BST1RPUFJJVkFURSArIDMpCisjZGVmaW5lCVNJT0NSU0NMUlJUCQkoU0lPQ1BST1RPUFJJVkFURSArIDQpCisjZGVmaW5lCVNJT0NSU0dMMkNBTEwJCShTSU9DUFJPVE9QUklWQVRFICsgNSkKKyNkZWZpbmUJU0lPQ1JTR0ZBQ0lMSVRJRVMJKFNJT0NQUk9UT1BSSVZBVEUgKyA2KQorCisjZGVmaW5lCVJPU0VfRFRFX09SSUdJTkFURUQJMHgwMAorI2RlZmluZQlST1NFX05VTUJFUl9CVVNZCTB4MDEKKyNkZWZpbmUJUk9TRV9JTlZBTElEX0ZBQ0lMSVRZCTB4MDMKKyNkZWZpbmUJUk9TRV9ORVRXT1JLX0NPTkdFU1RJT04JMHgwNQorI2RlZmluZQlST1NFX09VVF9PRl9PUkRFUgkweDA5CisjZGVmaW5lCVJPU0VfQUNDRVNTX0JBUlJFRAkweDBCCisjZGVmaW5lCVJPU0VfTk9UX09CVEFJTkFCTEUJMHgwRAorI2RlZmluZQlST1NFX1JFTU9URV9QUk9DRURVUkUJMHgxMQorI2RlZmluZQlST1NFX0xPQ0FMX1BST0NFRFVSRQkweDEzCisjZGVmaW5lCVJPU0VfU0hJUF9BQlNFTlQJMHgzOQorCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgcm9zZV9hZGRyWzVdOworfSByb3NlX2FkZHJlc3M7CisKK3N0cnVjdCBzb2NrYWRkcl9yb3NlCit7CisgIHNhX2ZhbWlseV90IHNyb3NlX2ZhbWlseTsKKyAgcm9zZV9hZGRyZXNzIHNyb3NlX2FkZHI7CisgIGF4MjVfYWRkcmVzcyBzcm9zZV9jYWxsOworICBpbnQgc3Jvc2VfbmRpZ2lzOworICBheDI1X2FkZHJlc3MJc3Jvc2VfZGlnaTsKK307CisKK3N0cnVjdCBmdWxsX3NvY2thZGRyX3Jvc2UKK3sKKyAgc2FfZmFtaWx5X3Qgc3Jvc2VfZmFtaWx5OworICByb3NlX2FkZHJlc3Mgc3Jvc2VfYWRkcjsKKyAgYXgyNV9hZGRyZXNzIHNyb3NlX2NhbGw7CisgIHVuc2lnbmVkIGludCBzcm9zZV9uZGlnaXM7CisgIGF4MjVfYWRkcmVzcyBzcm9zZV9kaWdpc1tST1NFX01BWF9ESUdJU107Cit9OworCitzdHJ1Y3Qgcm9zZV9yb3V0ZV9zdHJ1Y3QKK3sKKyAgcm9zZV9hZGRyZXNzIGFkZHJlc3M7CisgIHVuc2lnbmVkIHNob3J0IGludCBtYXNrOworICBheDI1X2FkZHJlc3MJbmVpZ2hib3VyOworICBjaGFyIGRldmljZVsxNl07CisgIHVuc2lnbmVkIGNoYXIJbmRpZ2lzOworICBheDI1X2FkZHJlc3MgZGlnaXBlYXRlcnNbQVgyNV9NQVhfRElHSVNdOworfTsKKworc3RydWN0IHJvc2VfY2F1c2Vfc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIJY2F1c2U7CisgIHVuc2lnbmVkIGNoYXIJZGlhZ25vc3RpYzsKK307CisKK3N0cnVjdCByb3NlX2ZhY2lsaXRpZXNfc3RydWN0Cit7CisgIHJvc2VfYWRkcmVzcyBzb3VyY2VfYWRkciwgICBkZXN0X2FkZHI7CisgIGF4MjVfYWRkcmVzcyBzb3VyY2VfY2FsbCwgICBkZXN0X2NhbGw7CisgIHVuc2lnbmVkIGNoYXIgc291cmNlX25kaWdpcywgZGVzdF9uZGlnaXM7CisgIGF4MjVfYWRkcmVzcyBzb3VyY2VfZGlnaXNbUk9TRV9NQVhfRElHSVNdOworICBheDI1X2FkZHJlc3MgZGVzdF9kaWdpc1tST1NFX01BWF9ESUdJU107CisgIHVuc2lnbmVkIGludCByYW5kOworICByb3NlX2FkZHJlc3MgZmFpbF9hZGRyOworICBheDI1X2FkZHJlc3MgZmFpbF9jYWxsOworfTsKKworI2VuZGlmCS8qIG5ldHJvc2Uvcm9zZS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25mcy9uZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmZzL25mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZTRiNjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25mcy9uZnMuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8bGludXgvbmZzLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25sX3R5cGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL25sX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExOTBiNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmxfdHlwZXMuaApAQCAtMCwwICsxLDU1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDMsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05MX1RZUEVTX0gKKyNkZWZpbmUgX05MX1RZUEVTX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogVGhlIGRlZmF1bHQgbWVzc2FnZSBzZXQgdXNlZCBieSB0aGUgZ2VuY2F0IHByb2dyYW0uICAqLworI2RlZmluZSBOTF9TRVREIDEKKworLyogVmFsdWUgZm9yIEZMQUcgcGFyYW1ldGVyIG9mIGBjYXRnZXRzJyB0byBzYXkgd2Ugd2FudCBYUEc0IGNvbXBsaWFuY2UuICAqLworI2RlZmluZSBOTF9DQVRfTE9DQUxFIDEKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIE1lc3NhZ2UgY2F0YWxvZyBkZXNjcmlwdG9yIHR5cGUuICAqLwordHlwZWRlZiB2b2lkICpubF9jYXRkOworCisvKiBUeXBlIHVzZWQgYnkgYG5sX2xhbmdpbmZvJy4gICovCit0eXBlZGVmIGludCBubF9pdGVtOworCisvKiBPcGVuIG1lc3NhZ2UgY2F0YWxvZyBmb3IgbGF0ZXIgdXNlLCByZXR1cm5pbmcgZGVzY3JpcHRvci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gbmxfY2F0ZCBjYXRvcGVuIChfX2NvbnN0IGNoYXIgKl9fY2F0X25hbWUsIGludCBfX2ZsYWcpIF9fbm9ubnVsbCAoKDEpKTsKKworLyogUmV0dXJuIHRyYW5zbGF0aW9uIHdpdGggTlVNQkVSIGluIFNFVCBvZiBDQVRBTE9HOyBpZiBub3QgZm91bmQKKyAgIHJldHVybiBTVFJJTkcuICAqLworZXh0ZXJuIGNoYXIgKmNhdGdldHMgKG5sX2NhdGQgX19jYXRhbG9nLCBpbnQgX19zZXQsIGludCBfX251bWJlciwKKwkJICAgICAgX19jb25zdCBjaGFyICpfX3N0cmluZykgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIENsb3NlIG1lc3NhZ2UgQ0FUQUxPRy4gICovCitleHRlcm4gaW50IGNhdGNsb3NlIChubF9jYXRkIF9fY2F0YWxvZykgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBubF90eXBlcy5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9uc3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbnNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExYjI1OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvbnNzLmgKQEAgLTAsMCArMSw2NCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBEZWZpbmUgaW50ZXJmYWNlIHRvIE5TUy4gIFRoaXMgaXMgbWVhbnQgZm9yIHRoZSBpbnRlcmZhY2UgZnVuY3Rpb25zCisgICBhbmQgZm9yIGltcGxlbWVudG9ycyBvZiBuZXcgc2VydmljZXMuICAqLworCisjaWZuZGVmIF9OU1NfSAorI2RlZmluZSBfTlNTX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFBvc3NpYmxlIHJlc3VsdHMgb2YgbG9va3VwIHVzaW5nIGEgbnNzXyogZnVuY3Rpb24uICAqLworZW51bSBuc3Nfc3RhdHVzCit7CisgIE5TU19TVEFUVVNfVFJZQUdBSU4gPSAtMiwKKyAgTlNTX1NUQVRVU19VTkFWQUlMLAorICBOU1NfU1RBVFVTX05PVEZPVU5ELAorICBOU1NfU1RBVFVTX1NVQ0NFU1MsCisgIE5TU19TVEFUVVNfUkVUVVJOCit9OworCisKKy8qIERhdGEgc3RydWN0dXJlIHVzZWQgZm9yIHRoZSAnZ2V0aG9zdGJ5bmFtZTRfcicgZnVuY3Rpb24uICAqLworc3RydWN0IGdhaWhfYWRkcnR1cGxlCisgIHsKKyAgICBzdHJ1Y3QgZ2FpaF9hZGRydHVwbGUgKm5leHQ7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgZmFtaWx5OworICAgIHVpbnQzMl90IGFkZHJbNF07CisgICAgdWludDMyX3Qgc2NvcGVpZDsKKyAgfTsKKworCisvKiBPdmVyd3JpdGUgc2VydmljZSBzZWxlY3Rpb24gZm9yIGRhdGFiYXNlIERCTkFNRSB1c2luZyBzcGVjaWZpY2F0aW9uCisgICBpbiBTVFJJTkcuCisgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgc3lzdGVtIHByb2dyYW1zIHdoaWNoIGhhdmUgdG8KKyAgIHdvcmsgYXJvdW5kIG5vbi1leGlzdGluZyBzZXJ2aWNlcyAoZS5lLiwgd2hpbGUgYm9vdGluZykuCisgICBBdHRlbnRpb246IFVzaW5nIHRoaXMgZnVuY3Rpb24gcmVwZWF0ZWRseSB3aWxsIHNsb3dseSBlYXQgdXAgdGhlCisgICB3aG9sZSBtZW1vcnkgc2luY2UgcHJldmlvdXMgc2VsZWN0aW9uIGRhdGEgY2Fubm90IGJlIGZyZWVkLiAgKi8KK2V4dGVybiBpbnQgX19uc3NfY29uZmlndXJlX2xvb2t1cCAoX19jb25zdCBjaGFyICpfX2RibmFtZSwKKwkJCQkgICBfX2NvbnN0IGNoYXIgKl9fc3RyaW5nKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbnNzLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvb2JzdGFjay5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9vYnN0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3Nzg5MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvb2JzdGFjay5oCkBAIC0wLDAgKzEsNTA5IEBACisvKiBvYnN0YWNrLmggLSBvYmplY3Qgc3RhY2sgbWFjcm9zCisgICBDb3B5cmlnaHQgKEMpIDE5ODgtMTk5NCwxOTk2LTE5OTksMjAwMywyMDA0LDIwMDUsMjAwOSwyMDExCisJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCisKKy8qIFN1bW1hcnk6CisKK0FsbCB0aGUgYXBwYXJlbnQgZnVuY3Rpb25zIGRlZmluZWQgaGVyZSBhcmUgbWFjcm9zLiBUaGUgaWRlYQoraXMgdGhhdCB5b3Ugd291bGQgdXNlIHRoZXNlIHByZS10ZXN0ZWQgbWFjcm9zIHRvIHNvbHZlIGEKK3Zlcnkgc3BlY2lmaWMgc2V0IG9mIHByb2JsZW1zLCBhbmQgdGhleSB3b3VsZCBydW4gZmFzdC4KK0NhdXRpb246IG5vIHNpZGUtZWZmZWN0cyBpbiBhcmd1bWVudHMgcGxlYXNlISEgVGhleSBtYXkgYmUKK2V2YWx1YXRlZCBNQU5ZIHRpbWVzISEKKworVGhlc2UgbWFjcm9zIG9wZXJhdGUgYSBzdGFjayBvZiBvYmplY3RzLiAgRWFjaCBvYmplY3Qgc3RhcnRzIGxpZmUKK3NtYWxsLCBhbmQgbWF5IGdyb3cgdG8gbWF0dXJpdHkuICAoQ29uc2lkZXIgYnVpbGRpbmcgYSB3b3JkIHN5bGxhYmxlCitieSBzeWxsYWJsZS4pICBBbiBvYmplY3QgY2FuIG1vdmUgd2hpbGUgaXQgaXMgZ3Jvd2luZy4gIE9uY2UgaXQgaGFzCitiZWVuICJmaW5pc2hlZCIgaXQgbmV2ZXIgY2hhbmdlcyBhZGRyZXNzIGFnYWluLiAgU28gdGhlICJ0b3Agb2YgdGhlCitzdGFjayIgaXMgdHlwaWNhbGx5IGFuIGltbWF0dXJlIGdyb3dpbmcgb2JqZWN0LCB3aGlsZSB0aGUgcmVzdCBvZiB0aGUKK3N0YWNrIGlzIG9mIG1hdHVyZSwgZml4ZWQgc2l6ZSBhbmQgZml4ZWQgYWRkcmVzcyBvYmplY3RzLgorCitUaGVzZSByb3V0aW5lcyBncmFiIGxhcmdlIGNodW5rcyBvZiBtZW1vcnksIHVzaW5nIGEgZnVuY3Rpb24geW91CitzdXBwbHksIGNhbGxlZCBgb2JzdGFja19jaHVua19hbGxvYycuICBPbiBvY2Nhc2lvbiwgdGhleSBmcmVlIGNodW5rcywKK2J5IGNhbGxpbmcgYG9ic3RhY2tfY2h1bmtfZnJlZScuICBZb3UgbXVzdCBkZWZpbmUgdGhlbSBhbmQgZGVjbGFyZQordGhlbSBiZWZvcmUgdXNpbmcgYW55IG9ic3RhY2sgbWFjcm9zLgorCitFYWNoIGluZGVwZW5kZW50IHN0YWNrIGlzIHJlcHJlc2VudGVkIGJ5IGEgYHN0cnVjdCBvYnN0YWNrJy4KK0VhY2ggb2YgdGhlIG9ic3RhY2sgbWFjcm9zIGV4cGVjdHMgYSBwb2ludGVyIHRvIHN1Y2ggYSBzdHJ1Y3R1cmUKK2FzIHRoZSBmaXJzdCBhcmd1bWVudC4KKworT25lIG1vdGl2YXRpb24gZm9yIHRoaXMgcGFja2FnZSBpcyB0aGUgcHJvYmxlbSBvZiBncm93aW5nIGNoYXIgc3RyaW5ncworaW4gc3ltYm9sIHRhYmxlcy4gIFVubGVzcyB5b3UgYXJlICJmYXNjaXN0IHBpZyB3aXRoIGEgcmVhZC1vbmx5IG1pbmQiCistLUdvc3BlcidzIGltbW9ydGFsIHF1b3RlIGZyb20gSEFLTUVNIGl0ZW0gMTU0LCBvdXQgb2YgY29udGV4dC0teW91Cit3b3VsZCBub3QgbGlrZSB0byBwdXQgYW55IGFyYml0cmFyeSB1cHBlciBsaW1pdCBvbiB0aGUgbGVuZ3RoIG9mIHlvdXIKK3N5bWJvbHMuCisKK0luIHByYWN0aWNlIHRoaXMgb2Z0ZW4gbWVhbnMgeW91IHdpbGwgYnVpbGQgbWFueSBzaG9ydCBzeW1ib2xzIGFuZCBhCitmZXcgbG9uZyBzeW1ib2xzLiAgQXQgdGhlIHRpbWUgeW91IGFyZSByZWFkaW5nIGEgc3ltYm9sIHlvdSBkb24ndCBrbm93Citob3cgbG9uZyBpdCBpcy4gIE9uZSB0cmFkaXRpb25hbCBtZXRob2QgaXMgdG8gcmVhZCBhIHN5bWJvbCBpbnRvIGEKK2J1ZmZlciwgcmVhbGxvYygpYXRpbmcgdGhlIGJ1ZmZlciBldmVyeSB0aW1lIHlvdSB0cnkgdG8gcmVhZCBhIHN5bWJvbAordGhhdCBpcyBsb25nZXIgdGhhbiB0aGUgYnVmZmVyLiAgVGhpcyBpcyBiZWF1dCwgYnV0IHlvdSBzdGlsbCB3aWxsCit3YW50IHRvIGNvcHkgdGhlIHN5bWJvbCBmcm9tIHRoZSBidWZmZXIgdG8gYSBtb3JlIHBlcm1hbmVudAorc3ltYm9sLXRhYmxlIGVudHJ5IHNheSBhYm91dCBoYWxmIHRoZSB0aW1lLgorCitXaXRoIG9ic3RhY2tzLCB5b3UgY2FuIHdvcmsgZGlmZmVyZW50bHkuICBVc2Ugb25lIG9ic3RhY2sgZm9yIGFsbCBzeW1ib2wKK25hbWVzLiAgQXMgeW91IHJlYWQgYSBzeW1ib2wsIGdyb3cgdGhlIG5hbWUgaW4gdGhlIG9ic3RhY2sgZ3JhZHVhbGx5LgorV2hlbiB0aGUgbmFtZSBpcyBjb21wbGV0ZSwgZmluYWxpemUgaXQuICBUaGVuLCBpZiB0aGUgc3ltYm9sIGV4aXN0cyBhbHJlYWR5LAorZnJlZSB0aGUgbmV3bHkgcmVhZCBuYW1lLgorCitUaGUgd2F5IHdlIGRvIHRoaXMgaXMgdG8gdGFrZSBhIGxhcmdlIGNodW5rLCBhbGxvY2F0aW5nIG1lbW9yeSBmcm9tCitsb3cgYWRkcmVzc2VzLiAgV2hlbiB5b3Ugd2FudCB0byBidWlsZCBhIHN5bWJvbCBpbiB0aGUgY2h1bmsgeW91IGp1c3QKK2FkZCBjaGFycyBhYm92ZSB0aGUgY3VycmVudCAiaGlnaCB3YXRlciBtYXJrIiBpbiB0aGUgY2h1bmsuICBXaGVuIHlvdQoraGF2ZSBmaW5pc2hlZCBhZGRpbmcgY2hhcnMsIGJlY2F1c2UgeW91IGdvdCB0byB0aGUgZW5kIG9mIHRoZSBzeW1ib2wsCit5b3Uga25vdyBob3cgbG9uZyB0aGUgY2hhcnMgYXJlLCBhbmQgeW91IGNhbiBjcmVhdGUgYSBuZXcgb2JqZWN0LgorTW9zdGx5IHRoZSBjaGFycyB3aWxsIG5vdCBidXJzdCBvdmVyIHRoZSBoaWdoZXN0IGFkZHJlc3Mgb2YgdGhlIGNodW5rLAorYmVjYXVzZSB5b3Ugd291bGQgdHlwaWNhbGx5IGV4cGVjdCBhIGNodW5rIHRvIGJlIChzYXkpIDEwMCB0aW1lcyBhcworbG9uZyBhcyBhbiBhdmVyYWdlIG9iamVjdC4KKworSW4gY2FzZSB0aGF0IGlzbid0IGNsZWFyLCB3aGVuIHdlIGhhdmUgZW5vdWdoIGNoYXJzIHRvIG1ha2UgdXAKK3RoZSBvYmplY3QsIFRIRVkgQVJFIEFMUkVBRFkgQ09OVElHVU9VUyBJTiBUSEUgQ0hVTksgKGd1YXJhbnRlZWQpCitzbyB3ZSBqdXN0IHBvaW50IHRvIGl0IHdoZXJlIGl0IGxpZXMuICBObyBtb3Zpbmcgb2YgY2hhcnMgaXMKK25lZWRlZCBhbmQgdGhpcyBpcyB0aGUgc2Vjb25kIHdpbjogcG90ZW50aWFsbHkgbG9uZyBzdHJpbmdzIG5lZWQKK25ldmVyIGJlIGV4cGxpY2l0bHkgc2h1ZmZsZWQuIE9uY2UgYW4gb2JqZWN0IGlzIGZvcm1lZCwgaXQgZG9lcyBub3QKK2NoYW5nZSBpdHMgYWRkcmVzcyBkdXJpbmcgaXRzIGxpZmV0aW1lLgorCitXaGVuIHRoZSBjaGFycyBidXJzdCBvdmVyIGEgY2h1bmsgYm91bmRhcnksIHdlIGFsbG9jYXRlIGEgbGFyZ2VyCitjaHVuaywgYW5kIHRoZW4gY29weSB0aGUgcGFydGx5IGZvcm1lZCBvYmplY3QgZnJvbSB0aGUgZW5kIG9mIHRoZSBvbGQKK2NodW5rIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5ldyBsYXJnZXIgY2h1bmsuICBXZSB0aGVuIGNhcnJ5IG9uCithY2NyZXRpbmcgY2hhcmFjdGVycyB0byB0aGUgZW5kIG9mIHRoZSBvYmplY3QgYXMgd2Ugbm9ybWFsbHkgd291bGQuCisKK0Egc3BlY2lhbCBtYWNybyBpcyBwcm92aWRlZCB0byBhZGQgYSBzaW5nbGUgY2hhciBhdCBhIHRpbWUgdG8gYQorZ3Jvd2luZyBvYmplY3QuICBUaGlzIGFsbG93cyB0aGUgdXNlIG9mIHJlZ2lzdGVyIHZhcmlhYmxlcywgd2hpY2gKK2JyZWFrIHRoZSBvcmRpbmFyeSAnZ3Jvd3RoJyBtYWNyby4KKworU3VtbWFyeToKKwlXZSBhbGxvY2F0ZSBsYXJnZSBjaHVua3MuCisJV2UgY2FydmUgb3V0IG9uZSBvYmplY3QgYXQgYSB0aW1lIGZyb20gdGhlIGN1cnJlbnQgY2h1bmsuCisJT25jZSBjYXJ2ZWQsIGFuIG9iamVjdCBuZXZlciBtb3Zlcy4KKwlXZSBhcmUgZnJlZSB0byBhcHBlbmQgZGF0YSBvZiBhbnkgc2l6ZSB0byB0aGUgY3VycmVudGx5CisJICBncm93aW5nIG9iamVjdC4KKwlFeGFjdGx5IG9uZSBvYmplY3QgaXMgZ3Jvd2luZyBpbiBhbiBvYnN0YWNrIGF0IGFueSBvbmUgdGltZS4KKwlZb3UgY2FuIHJ1biBvbmUgb2JzdGFjayBwZXIgY29udHJvbCBibG9jay4KKwlZb3UgbWF5IGhhdmUgYXMgbWFueSBjb250cm9sIGJsb2NrcyBhcyB5b3UgZGFyZS4KKwlCZWNhdXNlIG9mIHRoZSB3YXkgd2UgZG8gaXQsIHlvdSBjYW4gYHVud2luZCcgYW4gb2JzdGFjaworCSAgYmFjayB0byBhIHByZXZpb3VzIHN0YXRlLiAoWW91IG1heSByZW1vdmUgb2JqZWN0cyBtdWNoCisJICBhcyB5b3Ugd291bGQgd2l0aCBhIHN0YWNrLikKKyovCisKKworLyogRG9uJ3QgZG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtb3JlIHRoYW4gb25jZS4gICovCisKKyNpZm5kZWYgX09CU1RBQ0tfSAorI2RlZmluZSBfT0JTVEFDS19IIDEKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorDAorLyogV2UgbmVlZCB0aGUgdHlwZSBvZiBhIHBvaW50ZXIgc3VidHJhY3Rpb24uICBJZiBfX1BUUkRJRkZfVFlQRV9fIGlzCisgICBkZWZpbmVkLCBhcyB3aXRoIEdOVSBDLCB1c2UgdGhhdDsgdGhhdCB3YXkgd2UgZG9uJ3QgcG9sbHV0ZSB0aGUKKyAgIG5hbWVzcGFjZSB3aXRoIDxzdGRkZWYuaD4ncyBzeW1ib2xzLiAgT3RoZXJ3aXNlLCBpbmNsdWRlIDxzdGRkZWYuaD4KKyAgIGFuZCB1c2UgcHRyZGlmZl90LiAgKi8KKworI2lmZGVmIF9fUFRSRElGRl9UWVBFX18KKyMgZGVmaW5lIFBUUl9JTlRfVFlQRSBfX1BUUkRJRkZfVFlQRV9fCisjZWxzZQorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgZGVmaW5lIFBUUl9JTlRfVFlQRSBwdHJkaWZmX3QKKyNlbmRpZgorCisvKiBJZiBCIGlzIHRoZSBiYXNlIG9mIGFuIG9iamVjdCBhZGRyZXNzZWQgYnkgUCwgcmV0dXJuIHRoZSByZXN1bHQgb2YKKyAgIGFsaWduaW5nIFAgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YgQSArIDEuICBCIGFuZCBQIG11c3QgYmUgb2YgdHlwZQorICAgY2hhciAqLiAgQSArIDEgbXVzdCBiZSBhIHBvd2VyIG9mIDIuICAqLworCisjZGVmaW5lIF9fQlBUUl9BTElHTihCLCBQLCBBKSAoKEIpICsgKCgoUCkgLSAoQikgKyAoQSkpICYgfihBKSkpCisKKy8qIFNpbWlsaWFyIHRvIF9CUFRSX0FMSUdOIChCLCBQLCBBKSwgZXhjZXB0IG9wdGltaXplIHRoZSBjb21tb24gY2FzZQorICAgd2hlcmUgcG9pbnRlcnMgY2FuIGJlIGNvbnZlcnRlZCB0byBpbnRlZ2VycywgYWxpZ25lZCBhcyBpbnRlZ2VycywKKyAgIGFuZCBjb252ZXJ0ZWQgYmFjayBhZ2Fpbi4gIElmIFBUUl9JTlRfVFlQRSBpcyBuYXJyb3dlciB0aGFuIGEKKyAgIHBvaW50ZXIgKGUuZy4sIHRoZSBBUy80MDApLCBwbGF5IGl0IHNhZmUgYW5kIGNvbXB1dGUgdGhlIGFsaWdubWVudAorICAgcmVsYXRpdmUgdG8gQi4gIE90aGVyd2lzZSwgdXNlIHRoZSBmYXN0ZXIgc3RyYXRlZ3kgb2YgY29tcHV0aW5nIHRoZQorICAgYWxpZ25tZW50IHJlbGF0aXZlIHRvIDAuICAqLworCisjZGVmaW5lIF9fUFRSX0FMSUdOKEIsIFAsIEEpCQkJCQkJICAgIFwKKyAgX19CUFRSX0FMSUdOIChzaXplb2YgKFBUUl9JTlRfVFlQRSkgPCBzaXplb2YgKHZvaWQgKikgPyAoQikgOiAoY2hhciAqKSAwLCBcCisJCVAsIEEpCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RydWN0IF9vYnN0YWNrX2NodW5rCQkvKiBMaXZlcyBhdCBmcm9udCBvZiBlYWNoIGNodW5rLiAqLworeworICBjaGFyICAqbGltaXQ7CQkJLyogMSBwYXN0IGVuZCBvZiB0aGlzIGNodW5rICovCisgIHN0cnVjdCBfb2JzdGFja19jaHVuayAqcHJldjsJLyogYWRkcmVzcyBvZiBwcmlvciBjaHVuayBvciBOVUxMICovCisgIGNoYXIJY29udGVudHNbNF07CQkvKiBvYmplY3RzIGJlZ2luIGhlcmUgKi8KK307CisKK3N0cnVjdCBvYnN0YWNrCQkvKiBjb250cm9sIGN1cnJlbnQgb2JqZWN0IGluIGN1cnJlbnQgY2h1bmsgKi8KK3sKKyAgbG9uZwljaHVua19zaXplOwkJLyogcHJlZmVycmVkIHNpemUgdG8gYWxsb2NhdGUgY2h1bmtzIGluICovCisgIHN0cnVjdCBfb2JzdGFja19jaHVuayAqY2h1bms7CS8qIGFkZHJlc3Mgb2YgY3VycmVudCBzdHJ1Y3Qgb2JzdGFja19jaHVuayAqLworICBjaGFyCSpvYmplY3RfYmFzZTsJCS8qIGFkZHJlc3Mgb2Ygb2JqZWN0IHdlIGFyZSBidWlsZGluZyAqLworICBjaGFyCSpuZXh0X2ZyZWU7CQkvKiB3aGVyZSB0byBhZGQgbmV4dCBjaGFyIHRvIGN1cnJlbnQgb2JqZWN0ICovCisgIGNoYXIJKmNodW5rX2xpbWl0OwkJLyogYWRkcmVzcyBvZiBjaGFyIGFmdGVyIGN1cnJlbnQgY2h1bmsgKi8KKyAgdW5pb24KKyAgeworICAgIFBUUl9JTlRfVFlQRSB0ZW1waW50OworICAgIHZvaWQgKnRlbXBwdHI7CisgIH0gdGVtcDsJCQkvKiBUZW1wb3JhcnkgZm9yIHNvbWUgbWFjcm9zLiAgKi8KKyAgaW50ICAgYWxpZ25tZW50X21hc2s7CQkvKiBNYXNrIG9mIGFsaWdubWVudCBmb3IgZWFjaCBvYmplY3QuICovCisgIC8qIFRoZXNlIHByb3RvdHlwZXMgdmFyeSBiYXNlZCBvbiBgdXNlX2V4dHJhX2FyZycsIGFuZCB3ZSB1c2UKKyAgICAgY2FzdHMgdG8gdGhlIHByb3RvdHlwZWxlc3MgZnVuY3Rpb24gdHlwZSBpbiBhbGwgYXNzaWdubWVudHMsCisgICAgIGJ1dCBoYXZpbmcgcHJvdG90eXBlcyBoZXJlIHF1aWV0cyAtV3N0cmljdC1wcm90b3R5cGVzLiAgKi8KKyAgc3RydWN0IF9vYnN0YWNrX2NodW5rICooKmNodW5rZnVuKSAodm9pZCAqLCBsb25nKTsKKyAgdm9pZCAoKmZyZWVmdW4pICh2b2lkICosIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKTsKKyAgdm9pZCAqZXh0cmFfYXJnOwkJLyogZmlyc3QgYXJnIGZvciBjaHVuayBhbGxvYy9kZWFsbG9jIGZ1bmNzICovCisgIHVuc2lnbmVkIHVzZV9leHRyYV9hcmc6MTsJLyogY2h1bmsgYWxsb2MvZGVhbGxvYyBmdW5jcyB0YWtlIGV4dHJhIGFyZyAqLworICB1bnNpZ25lZCBtYXliZV9lbXB0eV9vYmplY3Q6MTsvKiBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGN1cnJlbnQKKwkJCQkgICBjaHVuayBjb250YWlucyBhIHplcm8tbGVuZ3RoIG9iamVjdC4gIFRoaXMKKwkJCQkgICBwcmV2ZW50cyBmcmVlaW5nIHRoZSBjaHVuayBpZiB3ZSBhbGxvY2F0ZQorCQkJCSAgIGEgYmlnZ2VyIGNodW5rIHRvIHJlcGxhY2UgaXQuICovCisgIHVuc2lnbmVkIGFsbG9jX2ZhaWxlZDoxOwkvKiBObyBsb25nZXIgdXNlZCwgYXMgd2Ugbm93IGNhbGwgdGhlIGZhaWxlZAorCQkJCSAgIGhhbmRsZXIgb24gZXJyb3IsIGJ1dCByZXRhaW5lZCBmb3IgYmluYXJ5CisJCQkJICAgY29tcGF0aWJpbGl0eS4gICovCit9OworCisvKiBEZWNsYXJlIHRoZSBleHRlcm5hbCBmdW5jdGlvbnMgd2UgdXNlOyB0aGV5IGFyZSBpbiBvYnN0YWNrLmMuICAqLworCitleHRlcm4gdm9pZCBfb2JzdGFja19uZXdjaHVuayAoc3RydWN0IG9ic3RhY2sgKiwgaW50KTsKK2V4dGVybiBpbnQgX29ic3RhY2tfYmVnaW4gKHN0cnVjdCBvYnN0YWNrICosIGludCwgaW50LAorCQkJICAgIHZvaWQgKigqKSAobG9uZyksIHZvaWQgKCopICh2b2lkICopKTsKK2V4dGVybiBpbnQgX29ic3RhY2tfYmVnaW5fMSAoc3RydWN0IG9ic3RhY2sgKiwgaW50LCBpbnQsCisJCQkgICAgIHZvaWQgKigqKSAodm9pZCAqLCBsb25nKSwKKwkJCSAgICAgdm9pZCAoKikgKHZvaWQgKiwgdm9pZCAqKSwgdm9pZCAqKTsKK2V4dGVybiBpbnQgX29ic3RhY2tfbWVtb3J5X3VzZWQgKHN0cnVjdCBvYnN0YWNrICopOworCit2b2lkIG9ic3RhY2tfZnJlZSAoc3RydWN0IG9ic3RhY2sgKl9fb2JzdGFjaywgdm9pZCAqX19ibG9jayk7CisKKwwKKy8qIEVycm9yIGhhbmRsZXIgY2FsbGVkIHdoZW4gYG9ic3RhY2tfY2h1bmtfYWxsb2MnIGZhaWxlZCB0byBhbGxvY2F0ZQorICAgbW9yZSBtZW1vcnkuICBUaGlzIGNhbiBiZSBzZXQgdG8gYSB1c2VyIGRlZmluZWQgZnVuY3Rpb24gd2hpY2gKKyAgIHNob3VsZCBlaXRoZXIgYWJvcnQgZ3JhY2VmdWxseSBvciB1c2UgbG9uZ2p1bXAgLSBidXQgc2hvdWxkbid0CisgICByZXR1cm4uICBUaGUgZGVmYXVsdCBhY3Rpb24gaXMgdG8gcHJpbnQgYSBtZXNzYWdlIGFuZCBhYm9ydC4gICovCitleHRlcm4gdm9pZCAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICh2b2lkKTsKKworLyogRXhpdCB2YWx1ZSB1c2VkIHdoZW4gYHByaW50X2FuZF9hYm9ydCcgaXMgdXNlZC4gICovCitleHRlcm4gaW50IG9ic3RhY2tfZXhpdF9mYWlsdXJlOworDAorLyogUG9pbnRlciB0byBiZWdpbm5pbmcgb2Ygb2JqZWN0IGJlaW5nIGFsbG9jYXRlZCBvciB0byBiZSBhbGxvY2F0ZWQgbmV4dC4KKyAgIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IG5vdCBiZSB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUgb2JqZWN0CisgICBiZWNhdXNlIGEgbmV3IGNodW5rIG1pZ2h0IGJlIG5lZWRlZCB0byBob2xkIHRoZSBmaW5hbCBzaXplLiAgKi8KKworI2RlZmluZSBvYnN0YWNrX2Jhc2UoaCkgKCh2b2lkICopIChoKS0+b2JqZWN0X2Jhc2UpCisKKy8qIFNpemUgZm9yIGFsbG9jYXRpbmcgb3JkaW5hcnkgY2h1bmtzLiAgKi8KKworI2RlZmluZSBvYnN0YWNrX2NodW5rX3NpemUoaCkgKChoKS0+Y2h1bmtfc2l6ZSkKKworLyogUG9pbnRlciB0byBuZXh0IGJ5dGUgbm90IHlldCBhbGxvY2F0ZWQgaW4gY3VycmVudCBjaHVuay4gICovCisKKyNkZWZpbmUgb2JzdGFja19uZXh0X2ZyZWUoaCkJKChoKS0+bmV4dF9mcmVlKQorCisvKiBNYXNrIHNwZWNpZnlpbmcgbG93IGJpdHMgdGhhdCBzaG91bGQgYmUgY2xlYXIgaW4gYWRkcmVzcyBvZiBhbiBvYmplY3QuICAqLworCisjZGVmaW5lIG9ic3RhY2tfYWxpZ25tZW50X21hc2soaCkgKChoKS0+YWxpZ25tZW50X21hc2spCisKKy8qIFRvIHByZXZlbnQgcHJvdG90eXBlIHdhcm5pbmdzIHByb3ZpZGUgY29tcGxldGUgYXJndW1lbnQgbGlzdC4gICovCisjZGVmaW5lIG9ic3RhY2tfaW5pdChoKQkJCQkJCVwKKyAgX29ic3RhY2tfYmVnaW4gKChoKSwgMCwgMCwJCQkJCVwKKwkJICAodm9pZCAqKCopIChsb25nKSkgb2JzdGFja19jaHVua19hbGxvYywJXAorCQkgICh2b2lkICgqKSAodm9pZCAqKSkgb2JzdGFja19jaHVua19mcmVlKQorCisjZGVmaW5lIG9ic3RhY2tfYmVnaW4oaCwgc2l6ZSkJCQkJCVwKKyAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAwLAkJCQlcCisJCSAgKHZvaWQgKigqKSAobG9uZykpIG9ic3RhY2tfY2h1bmtfYWxsb2MsCVwKKwkJICAodm9pZCAoKikgKHZvaWQgKikpIG9ic3RhY2tfY2h1bmtfZnJlZSkKKworI2RlZmluZSBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbihoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuKSAgXAorICBfb2JzdGFja19iZWdpbiAoKGgpLCAoc2l6ZSksIChhbGlnbm1lbnQpLAkJCQkgICBcCisJCSAgKHZvaWQgKigqKSAobG9uZykpIChjaHVua2Z1biksCQkJICAgXAorCQkgICh2b2lkICgqKSAodm9pZCAqKSkgKGZyZWVmdW4pKQorCisjZGVmaW5lIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uX3dpdGhfYXJnKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4sIGFyZykgXAorICBfb2JzdGFja19iZWdpbl8xICgoaCksIChzaXplKSwgKGFsaWdubWVudCksCQkJCVwKKwkJICAgICh2b2lkICooKikgKHZvaWQgKiwgbG9uZykpIChjaHVua2Z1biksCQlcCisJCSAgICAodm9pZCAoKikgKHZvaWQgKiwgdm9pZCAqKSkgKGZyZWVmdW4pLCAoYXJnKSkKKworI2RlZmluZSBvYnN0YWNrX2NodW5rZnVuKGgsIG5ld2NodW5rZnVuKSBcCisgICgoaCkgLT4gY2h1bmtmdW4gPSAoc3RydWN0IF9vYnN0YWNrX2NodW5rICooKikodm9pZCAqLCBsb25nKSkgKG5ld2NodW5rZnVuKSkKKworI2RlZmluZSBvYnN0YWNrX2ZyZWVmdW4oaCwgbmV3ZnJlZWZ1bikgXAorICAoKGgpIC0+IGZyZWVmdW4gPSAodm9pZCAoKikodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKikpIChuZXdmcmVlZnVuKSkKKworI2RlZmluZSBvYnN0YWNrXzFncm93X2Zhc3QoaCxhY2hhcikgKCooKGgpLT5uZXh0X2ZyZWUpKysgPSAoYWNoYXIpKQorCisjZGVmaW5lIG9ic3RhY2tfYmxhbmtfZmFzdChoLG4pICgoaCktPm5leHRfZnJlZSArPSAobikpCisKKyNkZWZpbmUgb2JzdGFja19tZW1vcnlfdXNlZChoKSBfb2JzdGFja19tZW1vcnlfdXNlZCAoaCkKKwwKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KKy8qIE5leHRTdGVwIDIuMCBjYyBpcyByZWFsbHkgZ2NjIDEuOTMgYnV0IGl0IGRlZmluZXMgX19HTlVDX18gPSAyIGFuZAorICAgZG9lcyBub3QgaW1wbGVtZW50IF9fZXh0ZW5zaW9uX18uICBCdXQgdGhhdCBjb21waWxlciBkb2Vzbid0IGRlZmluZQorICAgX19HTlVDX01JTk9SX18uICAqLworIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fTmVYVF9fICYmICFfX0dOVUNfTUlOT1JfXykKKyMgIGRlZmluZSBfX2V4dGVuc2lvbl9fCisjIGVuZGlmCisKKy8qIEZvciBHTlUgQywgaWYgbm90IC10cmFkaXRpb25hbCwKKyAgIHdlIGNhbiBkZWZpbmUgdGhlc2UgbWFjcm9zIHRvIGNvbXB1dGUgYWxsIGFyZ3Mgb25seSBvbmNlCisgICB3aXRob3V0IHVzaW5nIGEgZ2xvYmFsIHZhcmlhYmxlLgorICAgQWxzbywgd2UgY2FuIGF2b2lkIHVzaW5nIHRoZSBgdGVtcCcgc2xvdCwgdG8gbWFrZSBmYXN0ZXIgY29kZS4gICovCisKKyMgZGVmaW5lIG9ic3RhY2tfb2JqZWN0X3NpemUoT0JTVEFDSykJCQkJCVwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJXAorICAoeyBzdHJ1Y3Qgb2JzdGFjayBjb25zdCAqX19vID0gKE9CU1RBQ0spOwkJCQlcCisgICAgICh1bnNpZ25lZCkgKF9fby0+bmV4dF9mcmVlIC0gX19vLT5vYmplY3RfYmFzZSk7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfcm9vbShPQlNUQUNLKQkJCQkJCVwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJXAorICAoeyBzdHJ1Y3Qgb2JzdGFjayBjb25zdCAqX19vID0gKE9CU1RBQ0spOwkJCQlcCisgICAgICh1bnNpZ25lZCkgKF9fby0+Y2h1bmtfbGltaXQgLSBfX28tPm5leHRfZnJlZSk7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfbWFrZV9yb29tKE9CU1RBQ0ssbGVuZ3RoKQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAorICAgaW50IF9fbGVuID0gKGxlbmd0aCk7CQkJCQkJXAorICAgaWYgKF9fby0+Y2h1bmtfbGltaXQgLSBfX28tPm5leHRfZnJlZSA8IF9fbGVuKQkJCVwKKyAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgX19sZW4pOwkJCQkJXAorICAgKHZvaWQpIDA7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfZW1wdHlfcChPQlNUQUNLKQkJCQkJXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisgICh7IHN0cnVjdCBvYnN0YWNrIGNvbnN0ICpfX28gPSAoT0JTVEFDSyk7CQkJCVwKKyAgICAgKF9fby0+Y2h1bmstPnByZXYgPT0gMAkJCQkJCVwKKyAgICAgICYmIF9fby0+bmV4dF9mcmVlID09IF9fUFRSX0FMSUdOICgoY2hhciAqKSBfX28tPmNodW5rLAkJXAorCQkJCQlfX28tPmNodW5rLT5jb250ZW50cywJCVwKKwkJCQkJX19vLT5hbGlnbm1lbnRfbWFzaykpOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX2dyb3coT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCisgICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBfX2xlbiA+IF9fby0+Y2h1bmtfbGltaXQpCQkJXAorICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbik7CQkJCQlcCisgICBtZW1jcHkgKF9fby0+bmV4dF9mcmVlLCB3aGVyZSwgX19sZW4pOwkJCQlcCisgICBfX28tPm5leHRfZnJlZSArPSBfX2xlbjsJCQkJCQlcCisgICAodm9pZCkgMDsgfSkKKworIyBkZWZpbmUgb2JzdGFja19ncm93MChPQlNUQUNLLHdoZXJlLGxlbmd0aCkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIGludCBfX2xlbiA9IChsZW5ndGgpOwkJCQkJCVwKKyAgIGlmIChfX28tPm5leHRfZnJlZSArIF9fbGVuICsgMSA+IF9fby0+Y2h1bmtfbGltaXQpCQkJXAorICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbiArIDEpOwkJCQlcCisgICBtZW1jcHkgKF9fby0+bmV4dF9mcmVlLCB3aGVyZSwgX19sZW4pOwkJCQlcCisgICBfX28tPm5leHRfZnJlZSArPSBfX2xlbjsJCQkJCQlcCisgICAqKF9fby0+bmV4dF9mcmVlKSsrID0gMDsJCQkJCQlcCisgICAodm9pZCkgMDsgfSkKKworIyBkZWZpbmUgb2JzdGFja18xZ3JvdyhPQlNUQUNLLGRhdHVtKQkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIGlmIChfX28tPm5leHRfZnJlZSArIDEgPiBfX28tPmNodW5rX2xpbWl0KQkJCQlcCisgICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIDEpOwkJCQkJXAorICAgb2JzdGFja18xZ3Jvd19mYXN0IChfX28sIGRhdHVtKTsJCQkJCVwKKyAgICh2b2lkKSAwOyB9KQorCisvKiBUaGVzZSBhc3N1bWUgdGhhdCB0aGUgb2JzdGFjayBhbGlnbm1lbnQgaXMgZ29vZCBlbm91Z2ggZm9yIHBvaW50ZXJzCisgICBvciBpbnRzLCBhbmQgdGhhdCB0aGUgZGF0YSBhZGRlZCBzbyBmYXIgdG8gdGhlIGN1cnJlbnQgb2JqZWN0CisgICBzaGFyZXMgdGhhdCBtdWNoIGFsaWdubWVudC4gICovCisKKyMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3coT0JTVEFDSyxkYXR1bSkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIGlmIChfX28tPm5leHRfZnJlZSArIHNpemVvZiAodm9pZCAqKSA+IF9fby0+Y2h1bmtfbGltaXQpCQlcCisgICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIHNpemVvZiAodm9pZCAqKSk7CQkJCVwKKyAgIG9ic3RhY2tfcHRyX2dyb3dfZmFzdCAoX19vLCBkYXR1bSk7IH0pCQkJCVwKKworIyBkZWZpbmUgb2JzdGFja19pbnRfZ3JvdyhPQlNUQUNLLGRhdHVtKQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAorICAgaWYgKF9fby0+bmV4dF9mcmVlICsgc2l6ZW9mIChpbnQpID4gX19vLT5jaHVua19saW1pdCkJCVwKKyAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgc2l6ZW9mIChpbnQpKTsJCQkJXAorICAgb2JzdGFja19pbnRfZ3Jvd19mYXN0IChfX28sIGRhdHVtKTsgfSkKKworIyBkZWZpbmUgb2JzdGFja19wdHJfZ3Jvd19mYXN0KE9CU1RBQ0ssYXB0cikJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbzEgPSAoT0JTVEFDSyk7CQkJCQlcCisgICAqKGNvbnN0IHZvaWQgKiopIF9fbzEtPm5leHRfZnJlZSA9IChhcHRyKTsJCQkJXAorICAgX19vMS0+bmV4dF9mcmVlICs9IHNpemVvZiAoY29uc3Qgdm9pZCAqKTsJCQkJXAorICAgKHZvaWQpIDA7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfaW50X2dyb3dfZmFzdChPQlNUQUNLLGFpbnQpCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28xID0gKE9CU1RBQ0spOwkJCQkJXAorICAgKihpbnQgKikgX19vMS0+bmV4dF9mcmVlID0gKGFpbnQpOwkJCQkJXAorICAgX19vMS0+bmV4dF9mcmVlICs9IHNpemVvZiAoaW50KTsJCQkJCVwKKyAgICh2b2lkKSAwOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX2JsYW5rKE9CU1RBQ0ssbGVuZ3RoKQkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIGludCBfX2xlbiA9IChsZW5ndGgpOwkJCQkJCVwKKyAgIGlmIChfX28tPmNodW5rX2xpbWl0IC0gX19vLT5uZXh0X2ZyZWUgPCBfX2xlbikJCQlcCisgICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIF9fbGVuKTsJCQkJCVwKKyAgIG9ic3RhY2tfYmxhbmtfZmFzdCAoX19vLCBfX2xlbik7CQkJCQlcCisgICAodm9pZCkgMDsgfSkKKworIyBkZWZpbmUgb2JzdGFja19hbGxvYyhPQlNUQUNLLGxlbmd0aCkJCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX2ggPSAoT0JTVEFDSyk7CQkJCQlcCisgICBvYnN0YWNrX2JsYW5rIChfX2gsIChsZW5ndGgpKTsJCQkJCVwKKyAgIG9ic3RhY2tfZmluaXNoIChfX2gpOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX2NvcHkoT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX2ggPSAoT0JTVEFDSyk7CQkJCQlcCisgICBvYnN0YWNrX2dyb3cgKF9faCwgKHdoZXJlKSwgKGxlbmd0aCkpOwkJCQlcCisgICBvYnN0YWNrX2ZpbmlzaCAoX19oKTsgfSkKKworIyBkZWZpbmUgb2JzdGFja19jb3B5MChPQlNUQUNLLHdoZXJlLGxlbmd0aCkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9faCA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIG9ic3RhY2tfZ3JvdzAgKF9faCwgKHdoZXJlKSwgKGxlbmd0aCkpOwkJCQlcCisgICBvYnN0YWNrX2ZpbmlzaCAoX19oKTsgfSkKKworLyogVGhlIGxvY2FsIHZhcmlhYmxlIGlzIG5hbWVkIF9fbzEgdG8gYXZvaWQgYSBuYW1lIGNvbmZsaWN0CisgICB3aGVuIG9ic3RhY2tfYmxhbmsgaXMgY2FsbGVkLiAgKi8KKyMgZGVmaW5lIG9ic3RhY2tfZmluaXNoKE9CU1RBQ0spCQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vMSA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIHZvaWQgKl9fdmFsdWUgPSAodm9pZCAqKSBfX28xLT5vYmplY3RfYmFzZTsJCQkJXAorICAgaWYgKF9fbzEtPm5leHRfZnJlZSA9PSBfX3ZhbHVlKQkJCQkJXAorICAgICBfX28xLT5tYXliZV9lbXB0eV9vYmplY3QgPSAxOwkJCQkJXAorICAgX19vMS0+bmV4dF9mcmVlCQkJCQkJCVwKKyAgICAgPSBfX1BUUl9BTElHTiAoX19vMS0+b2JqZWN0X2Jhc2UsIF9fbzEtPm5leHRfZnJlZSwJCQlcCisJCSAgICBfX28xLT5hbGlnbm1lbnRfbWFzayk7CQkJCVwKKyAgIGlmIChfX28xLT5uZXh0X2ZyZWUgLSAoY2hhciAqKV9fbzEtPmNodW5rCQkJCVwKKyAgICAgICA+IF9fbzEtPmNodW5rX2xpbWl0IC0gKGNoYXIgKilfX28xLT5jaHVuaykJCQlcCisgICAgIF9fbzEtPm5leHRfZnJlZSA9IF9fbzEtPmNodW5rX2xpbWl0OwkJCQlcCisgICBfX28xLT5vYmplY3RfYmFzZSA9IF9fbzEtPm5leHRfZnJlZTsJCQkJCVwKKyAgIF9fdmFsdWU7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfZnJlZShPQlNUQUNLLCBPQkopCQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAorICAgdm9pZCAqX19vYmogPSAoT0JKKTsJCQkJCQkJXAorICAgaWYgKF9fb2JqID4gKHZvaWQgKilfX28tPmNodW5rICYmIF9fb2JqIDwgKHZvaWQgKilfX28tPmNodW5rX2xpbWl0KSAgXAorICAgICBfX28tPm5leHRfZnJlZSA9IF9fby0+b2JqZWN0X2Jhc2UgPSAoY2hhciAqKV9fb2JqOwkJCVwKKyAgIGVsc2UgKG9ic3RhY2tfZnJlZSkgKF9fbywgX19vYmopOyB9KQorDAorI2Vsc2UgLyogbm90IF9fR05VQ19fIG9yIG5vdCBfX1NURENfXyAqLworCisjIGRlZmluZSBvYnN0YWNrX29iamVjdF9zaXplKGgpIFwKKyAodW5zaWduZWQpICgoaCktPm5leHRfZnJlZSAtIChoKS0+b2JqZWN0X2Jhc2UpCisKKyMgZGVmaW5lIG9ic3RhY2tfcm9vbShoKQkJXAorICh1bnNpZ25lZCkgKChoKS0+Y2h1bmtfbGltaXQgLSAoaCktPm5leHRfZnJlZSkKKworIyBkZWZpbmUgb2JzdGFja19lbXB0eV9wKGgpIFwKKyAoKGgpLT5jaHVuay0+cHJldiA9PSAwCQkJCQkJCVwKKyAgJiYgKGgpLT5uZXh0X2ZyZWUgPT0gX19QVFJfQUxJR04gKChjaGFyICopIChoKS0+Y2h1bmssCQlcCisJCQkJICAgIChoKS0+Y2h1bmstPmNvbnRlbnRzLAkJXAorCQkJCSAgICAoaCktPmFsaWdubWVudF9tYXNrKSkKKworLyogTm90ZSB0aGF0IHRoZSBjYWxsIHRvIF9vYnN0YWNrX25ld2NodW5rIGlzIGVuY2xvc2VkIGluICguLi4sIDApCisgICBzbyB0aGF0IHdlIGNhbiBhdm9pZCBoYXZpbmcgdm9pZCBleHByZXNzaW9ucworICAgaW4gdGhlIGFybXMgb2YgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCisgICBDYXN0aW5nIHRoZSB0aGlyZCBvcGVyYW5kIHRvIHZvaWQgd2FzIHRyaWVkIGJlZm9yZSwKKyAgIGJ1dCBzb21lIGNvbXBpbGVycyB3b24ndCBhY2NlcHQgaXQuICAqLworCisjIGRlZmluZSBvYnN0YWNrX21ha2Vfcm9vbShoLGxlbmd0aCkJCQkJCVwKKyggKGgpLT50ZW1wLnRlbXBpbnQgPSAobGVuZ3RoKSwJCQkJCQlcCisgICgoKGgpLT5uZXh0X2ZyZWUgKyAoaCktPnRlbXAudGVtcGludCA+IChoKS0+Y2h1bmtfbGltaXQpCQlcCisgICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCAoaCktPnRlbXAudGVtcGludCksIDApIDogMCkpCisKKyMgZGVmaW5lIG9ic3RhY2tfZ3JvdyhoLHdoZXJlLGxlbmd0aCkJCQkJCVwKKyggKGgpLT50ZW1wLnRlbXBpbnQgPSAobGVuZ3RoKSwJCQkJCQlcCisgICgoKGgpLT5uZXh0X2ZyZWUgKyAoaCktPnRlbXAudGVtcGludCA+IChoKS0+Y2h1bmtfbGltaXQpCQlcCisgICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCAoaCktPnRlbXAudGVtcGludCksIDApIDogMCksCQlcCisgIG1lbWNweSAoKGgpLT5uZXh0X2ZyZWUsIHdoZXJlLCAoaCktPnRlbXAudGVtcGludCksCQkJXAorICAoaCktPm5leHRfZnJlZSArPSAoaCktPnRlbXAudGVtcGludCkKKworIyBkZWZpbmUgb2JzdGFja19ncm93MChoLHdoZXJlLGxlbmd0aCkJCQkJCVwKKyggKGgpLT50ZW1wLnRlbXBpbnQgPSAobGVuZ3RoKSwJCQkJCQlcCisgICgoKGgpLT5uZXh0X2ZyZWUgKyAoaCktPnRlbXAudGVtcGludCArIDEgPiAoaCktPmNodW5rX2xpbWl0KQkJXAorICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wLnRlbXBpbnQgKyAxKSwgMCkgOiAwKSwJCVwKKyAgbWVtY3B5ICgoaCktPm5leHRfZnJlZSwgd2hlcmUsIChoKS0+dGVtcC50ZW1waW50KSwJCQlcCisgIChoKS0+bmV4dF9mcmVlICs9IChoKS0+dGVtcC50ZW1waW50LAkJCQkJXAorICAqKChoKS0+bmV4dF9mcmVlKSsrID0gMCkKKworIyBkZWZpbmUgb2JzdGFja18xZ3JvdyhoLGRhdHVtKQkJCQkJCVwKKyggKCgoaCktPm5leHRfZnJlZSArIDEgPiAoaCktPmNodW5rX2xpbWl0KQkJCQlcCisgICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCAxKSwgMCkgOiAwKSwJCQkJXAorICBvYnN0YWNrXzFncm93X2Zhc3QgKGgsIGRhdHVtKSkKKworIyBkZWZpbmUgb2JzdGFja19wdHJfZ3JvdyhoLGRhdHVtKQkJCQkJXAorKCAoKChoKS0+bmV4dF9mcmVlICsgc2l6ZW9mIChjaGFyICopID4gKGgpLT5jaHVua19saW1pdCkJCVwKKyAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIHNpemVvZiAoY2hhciAqKSksIDApIDogMCksCQlcCisgIG9ic3RhY2tfcHRyX2dyb3dfZmFzdCAoaCwgZGF0dW0pKQorCisjIGRlZmluZSBvYnN0YWNrX2ludF9ncm93KGgsZGF0dW0pCQkJCQlcCisoICgoKGgpLT5uZXh0X2ZyZWUgKyBzaXplb2YgKGludCkgPiAoaCktPmNodW5rX2xpbWl0KQkJCVwKKyAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIHNpemVvZiAoaW50KSksIDApIDogMCksCQkJXAorICBvYnN0YWNrX2ludF9ncm93X2Zhc3QgKGgsIGRhdHVtKSkKKworIyBkZWZpbmUgb2JzdGFja19wdHJfZ3Jvd19mYXN0KGgsYXB0cikJCQkJCVwKKyAgKCgoY29uc3Qgdm9pZCAqKikgKChoKS0+bmV4dF9mcmVlICs9IHNpemVvZiAodm9pZCAqKSkpWy0xXSA9IChhcHRyKSkKKworIyBkZWZpbmUgb2JzdGFja19pbnRfZ3Jvd19mYXN0KGgsYWludCkJCQkJCVwKKyAgKCgoaW50ICopICgoaCktPm5leHRfZnJlZSArPSBzaXplb2YgKGludCkpKVstMV0gPSAoYWludCkpCisKKyMgZGVmaW5lIG9ic3RhY2tfYmxhbmsoaCxsZW5ndGgpCQkJCQlcCisoIChoKS0+dGVtcC50ZW1waW50ID0gKGxlbmd0aCksCQkJCQkJXAorICAoKChoKS0+Y2h1bmtfbGltaXQgLSAoaCktPm5leHRfZnJlZSA8IChoKS0+dGVtcC50ZW1waW50KQkJXAorICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wLnRlbXBpbnQpLCAwKSA6IDApLAkJXAorICBvYnN0YWNrX2JsYW5rX2Zhc3QgKGgsIChoKS0+dGVtcC50ZW1waW50KSkKKworIyBkZWZpbmUgb2JzdGFja19hbGxvYyhoLGxlbmd0aCkJCQkJCVwKKyAob2JzdGFja19ibGFuayAoKGgpLCAobGVuZ3RoKSksIG9ic3RhY2tfZmluaXNoICgoaCkpKQorCisjIGRlZmluZSBvYnN0YWNrX2NvcHkoaCx3aGVyZSxsZW5ndGgpCQkJCQlcCisgKG9ic3RhY2tfZ3JvdyAoKGgpLCAod2hlcmUpLCAobGVuZ3RoKSksIG9ic3RhY2tfZmluaXNoICgoaCkpKQorCisjIGRlZmluZSBvYnN0YWNrX2NvcHkwKGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAorIChvYnN0YWNrX2dyb3cwICgoaCksICh3aGVyZSksIChsZW5ndGgpKSwgb2JzdGFja19maW5pc2ggKChoKSkpCisKKyMgZGVmaW5lIG9ic3RhY2tfZmluaXNoKGgpCQkJCQkJXAorKCAoKGgpLT5uZXh0X2ZyZWUgPT0gKGgpLT5vYmplY3RfYmFzZQkJCQkJXAorICAgPyAoKChoKS0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMSksIDApCQkJCQlcCisgICA6IDApLAkJCQkJCQkJXAorICAoaCktPnRlbXAudGVtcHB0ciA9IChoKS0+b2JqZWN0X2Jhc2UsCQkJCQlcCisgIChoKS0+bmV4dF9mcmVlCQkJCQkJCVwKKyAgICA9IF9fUFRSX0FMSUdOICgoaCktPm9iamVjdF9iYXNlLCAoaCktPm5leHRfZnJlZSwJCQlcCisJCSAgIChoKS0+YWxpZ25tZW50X21hc2spLAkJCQlcCisgICgoKGgpLT5uZXh0X2ZyZWUgLSAoY2hhciAqKSAoaCktPmNodW5rCQkJCVwKKyAgICA+IChoKS0+Y2h1bmtfbGltaXQgLSAoY2hhciAqKSAoaCktPmNodW5rKQkJCQlcCisgICA/ICgoaCktPm5leHRfZnJlZSA9IChoKS0+Y2h1bmtfbGltaXQpIDogMCksCQkJCVwKKyAgKGgpLT5vYmplY3RfYmFzZSA9IChoKS0+bmV4dF9mcmVlLAkJCQkJXAorICAoaCktPnRlbXAudGVtcHB0cikKKworIyBkZWZpbmUgb2JzdGFja19mcmVlKGgsb2JqKQkJCQkJCVwKKyggKGgpLT50ZW1wLnRlbXBpbnQgPSAoY2hhciAqKSAob2JqKSAtIChjaGFyICopIChoKS0+Y2h1bmssCQlcCisgICgoKChoKS0+dGVtcC50ZW1waW50ID4gMAkJCQkJCVwKKyAgICAmJiAoaCktPnRlbXAudGVtcGludCA8IChoKS0+Y2h1bmtfbGltaXQgLSAoY2hhciAqKSAoaCktPmNodW5rKSkJXAorICAgPyAoKChoKS0+bmV4dF9mcmVlID0gKGgpLT5vYmplY3RfYmFzZQkJCQlcCisgICAgICAgPSAoaCktPnRlbXAudGVtcGludCArIChjaGFyICopIChoKS0+Y2h1bmspLCAwKQkJCVwKKyAgIDogKChvYnN0YWNrX2ZyZWUpICgoaCksIChoKS0+dGVtcC50ZW1waW50ICsgKGNoYXIgKikgKGgpLT5jaHVuayksIDApKSkKKworI2VuZGlmIC8qIG5vdCBfX0dOVUNfXyBvciBub3QgX19TVERDX18gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CS8qIEMrKyAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBvYnN0YWNrLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcGFuZWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcGFuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQyMDYxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wYW5lbC5oCkBAIC0wLDAgKzEsODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiwyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQXV0aG9yOiBaZXlkIE0uIEJlbi1IYWxpbSA8em1iZW5oYWxAbmV0Y29tLmNvbT4gMTk5NSAgICAgICAgICAgICAgICAgICAgKgorICogICAgIGFuZDogRXJpYyBTLiBSYXltb25kIDxlc3JAc25hcmsudGh5cnN1cy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICBhbmQ6IEp1ZXJnZW4gUGZlaWZlciAgICAgICAgICAgICAgICAgICAgICAgICAxOTk2LTE5OTksMjAwOCAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogJElkOiBwYW5lbC5oLHYgMS4xMSAyMDA5LzA0LzExIDE5OjUwOjQwIHRvbSBFeHAgJCAqLworCisvKiBwYW5lbC5oIC0tIGludGVyZmFjZSBmaWxlIGZvciBwYW5lbHMgbGlicmFyeSAqLworCisjaWZuZGVmIE5DVVJTRVNfUEFORUxfSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfUEFORUxfSF9pbmNsIDEKKworI2luY2x1ZGUgPGN1cnNlcy5oPgorCit0eXBlZGVmIHN0cnVjdCBwYW5lbAoreworICBXSU5ET1cgKndpbjsKKyAgc3RydWN0IHBhbmVsICpiZWxvdzsKKyAgc3RydWN0IHBhbmVsICphYm92ZTsKKyAgTkNVUlNFU19DT05TVCB2b2lkICp1c2VyOworfSBQQU5FTDsKKworI2lmCWRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XKikgcGFuZWxfd2luZG93IChjb25zdCBQQU5FTCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSAgICB1cGRhdGVfcGFuZWxzICh2b2lkKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBoaWRlX3BhbmVsIChQQU5FTCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBzaG93X3BhbmVsIChQQU5FTCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBkZWxfcGFuZWwgKFBBTkVMICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIHRvcF9wYW5lbCAoUEFORUwgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgYm90dG9tX3BhbmVsIChQQU5FTCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChQQU5FTCopICBuZXdfcGFuZWwgKFdJTkRPVyAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChQQU5FTCopICBwYW5lbF9hYm92ZSAoY29uc3QgUEFORUwgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoUEFORUwqKSAgcGFuZWxfYmVsb3cgKGNvbnN0IFBBTkVMICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIHNldF9wYW5lbF91c2VycHRyIChQQU5FTCAqLCBOQ1VSU0VTX0NPTlNUIHZvaWQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoTkNVUlNFU19DT05TVCB2b2lkKikgcGFuZWxfdXNlcnB0ciAoY29uc3QgUEFORUwgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgbW92ZV9wYW5lbCAoUEFORUwgKiwgaW50LCBpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIHJlcGxhY2VfcGFuZWwgKFBBTkVMICosV0lORE9XICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIHBhbmVsX2hpZGRlbiAoY29uc3QgUEFORUwgKik7CisKKyNpZiBOQ1VSU0VTX1NQX0ZVTkNTCitleHRlcm4gTkNVUlNFU19FWFBPUlQoUEFORUwgKikgZ3JvdW5kX3BhbmVsKFNDUkVFTiAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChQQU5FTCAqKSBjZWlsaW5nX3BhbmVsKFNDUkVFTiAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpICAgIE5DVVJTRVNfU1BfTkFNRSh1cGRhdGVfcGFuZWxzKSAoU0NSRUVOKik7CisjZW5kaWYKKworI2lmCWRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmIC8qIE5DVVJTRVNfUEFORUxfSF9pbmNsICovCisKKy8qIGVuZCBvZiBwYW5lbC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3BhdGhzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3BhdGhzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkYTljNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcGF0aHMuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXBhdGhzLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfUEFUSFNfSF8KKyNkZWZpbmUJX1BBVEhTX0hfCisKKy8qIERlZmF1bHQgc2VhcmNoIHBhdGguICovCisjZGVmaW5lCV9QQVRIX0RFRlBBVEgJIi91c3IvYmluOi9iaW4iCisvKiBBbGwgc3RhbmRhcmQgdXRpbGl0aWVzIHBhdGguICovCisjZGVmaW5lCV9QQVRIX1NURFBBVEggXAorCSIvdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbiIKKworI2RlZmluZQlfUEFUSF9CU0hFTEwJIi9iaW4vc2giCisjZGVmaW5lCV9QQVRIX0NPTlNPTEUJIi9kZXYvY29uc29sZSIKKyNkZWZpbmUJX1BBVEhfQ1NIRUxMCSIvYmluL2NzaCIKKyNkZWZpbmUJX1BBVEhfREVWREIJIi92YXIvcnVuL2Rldi5kYiIKKyNkZWZpbmUJX1BBVEhfREVWTlVMTAkiL2Rldi9udWxsIgorI2RlZmluZQlfUEFUSF9EUlVNCSIvZGV2L2RydW0iCisjZGVmaW5lCV9QQVRIX0dTSEFET1cJIi9ldGMvZ3NoYWRvdyIKKyNkZWZpbmUJX1BBVEhfS0xPRwkiL3Byb2Mva21zZyIKKyNkZWZpbmUJX1BBVEhfS01FTQkiL2Rldi9rbWVtIgorI2RlZmluZQlfUEFUSF9MQVNUTE9HCSIvdmFyL2xvZy9sYXN0bG9nIgorI2RlZmluZQlfUEFUSF9NQUlMRElSCSIvdmFyL21haWwiCisjZGVmaW5lCV9QQVRIX01BTgkiL3Vzci9zaGFyZS9tYW4iCisjZGVmaW5lCV9QQVRIX01FTQkiL2Rldi9tZW0iCisjZGVmaW5lCV9QQVRIX01OVFRBQgkiL2V0Yy9mc3RhYiIKKyNkZWZpbmUJX1BBVEhfTU9VTlRFRAkiL2V0Yy9tdGFiIgorI2RlZmluZQlfUEFUSF9OT0xPR0lOCSIvZXRjL25vbG9naW4iCisjZGVmaW5lCV9QQVRIX1BSRVNFUlZFCSIvdmFyL2xpYiIKKyNkZWZpbmUJX1BBVEhfUldIT0RJUgkiL3Zhci9zcG9vbC9yd2hvIgorI2RlZmluZQlfUEFUSF9TRU5ETUFJTAkiL3Vzci9zYmluL3NlbmRtYWlsIgorI2RlZmluZQlfUEFUSF9TSEFET1cJIi9ldGMvc2hhZG93IgorI2RlZmluZQlfUEFUSF9TSEVMTFMJIi9ldGMvc2hlbGxzIgorI2RlZmluZQlfUEFUSF9UVFkJIi9kZXYvdHR5IgorI2RlZmluZQlfUEFUSF9VTklYCSIvYm9vdC92bWxpbnV4IgorI2RlZmluZSBfUEFUSF9VVE1QCSIvdmFyL3J1bi91dG1wIgorI2RlZmluZQlfUEFUSF9WSQkiL3Vzci9iaW4vdmkiCisjZGVmaW5lIF9QQVRIX1dUTVAJIi92YXIvbG9nL3d0bXAiCisKKy8qIFByb3ZpZGUgdHJhaWxpbmcgc2xhc2gsIHNpbmNlIG1vc3RseSB1c2VkIGZvciBidWlsZGluZyBwYXRobmFtZXMuICovCisjZGVmaW5lCV9QQVRIX0RFVgkiL2Rldi8iCisjZGVmaW5lCV9QQVRIX1RNUAkiL3RtcC8iCisjZGVmaW5lCV9QQVRIX1ZBUkRCCSIvdmFyL2xpYi9taXNjLyIKKyNkZWZpbmUJX1BBVEhfVkFSUlVOCSIvdmFyL3J1bi8iCisjZGVmaW5lCV9QQVRIX1ZBUlRNUAkiL3Zhci90bXAvIgorCisjZW5kaWYgLyogIV9QQVRIU19IXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wb2xsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmZiNDFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wb2xsLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3ByaW50Zi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wcmludGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjhjZjM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wcmludGYuaApAQCAtMCwwICsxLDE5MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTMsMTk5NS0yMDAxLDIwMDYsMjAwOQorCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9QUklOVEZfSAorCisjZGVmaW5lCV9QUklOVEZfSAkxCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjZGVmaW5lCV9fbmVlZF9GSUxFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUJX19uZWVkX3NpemVfdAorI2RlZmluZSBfX25lZWRfd2NoYXJfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisKK3N0cnVjdCBwcmludGZfaW5mbworeworICBpbnQgcHJlYzsJCQkvKiBQcmVjaXNpb24uICAqLworICBpbnQgd2lkdGg7CQkJLyogV2lkdGguICAqLworICB3Y2hhcl90IHNwZWM7CQkJLyogRm9ybWF0IGxldHRlci4gICovCisgIHVuc2lnbmVkIGludCBpc19sb25nX2RvdWJsZToxOy8qIEwgZmxhZy4gICovCisgIHVuc2lnbmVkIGludCBpc19zaG9ydDoxOwkvKiBoIGZsYWcuICAqLworICB1bnNpZ25lZCBpbnQgaXNfbG9uZzoxOwkvKiBsIGZsYWcuICAqLworICB1bnNpZ25lZCBpbnQgYWx0OjE7CQkvKiAjIGZsYWcuICAqLworICB1bnNpZ25lZCBpbnQgc3BhY2U6MTsJCS8qIFNwYWNlIGZsYWcuICAqLworICB1bnNpZ25lZCBpbnQgbGVmdDoxOwkJLyogLSBmbGFnLiAgKi8KKyAgdW5zaWduZWQgaW50IHNob3dzaWduOjE7CS8qICsgZmxhZy4gICovCisgIHVuc2lnbmVkIGludCBncm91cDoxOwkJLyogJyBmbGFnLiAgKi8KKyAgdW5zaWduZWQgaW50IGV4dHJhOjE7CQkvKiBGb3Igc3BlY2lhbCB1c2UuICAqLworICB1bnNpZ25lZCBpbnQgaXNfY2hhcjoxOwkvKiBoaCBmbGFnLiAgKi8KKyAgdW5zaWduZWQgaW50IHdpZGU6MTsJCS8qIE5vbnplcm8gZm9yIHdpZGUgY2hhcmFjdGVyIHN0cmVhbXMuICAqLworICB1bnNpZ25lZCBpbnQgaTE4bjoxOwkJLyogSSBmbGFnLiAgKi8KKyAgdW5zaWduZWQgaW50IF9fcGFkOjQ7CQkvKiBVbnVzZWQgc28gZmFyLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgaW50IHVzZXI7CS8qIEJpdHMgZm9yIHVzZXItaW5zdGFsbGVkIG1vZGlmaWVycy4gICovCisgIHdjaGFyX3QgcGFkOwkJCS8qIFBhZGRpbmcgY2hhcmFjdGVyLiAgKi8KK307CisKKworLyogVHlwZSBvZiBhIHByaW50ZiBzcGVjaWZpZXItaGFuZGxlciBmdW5jdGlvbi4KKyAgIFNUUkVBTSBpcyB0aGUgRklMRSBvbiB3aGljaCB0byB3cml0ZSBvdXRwdXQuCisgICBJTkZPIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbi4KKyAgIEFSR1MgaXMgYSB2ZWN0b3Igb2YgcG9pbnRlcnMgdG8gdGhlIGFyZ3VtZW50IGRhdGE7CisgICB0aGUgbnVtYmVyIG9mIHBvaW50ZXJzIHdpbGwgYmUgdGhlIG51bWJlciByZXR1cm5lZAorICAgYnkgdGhlIGFzc29jaWF0ZWQgYXJnaW5mbyBmdW5jdGlvbiBmb3IgdGhlIHNhbWUgSU5GTy4KKworICAgVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4sCisgICBvciAtMSBmb3IgZXJyb3JzLiAgKi8KKwordHlwZWRlZiBpbnQgcHJpbnRmX2Z1bmN0aW9uIChGSUxFICpfX3N0cmVhbSwKKwkJCSAgICAgX19jb25zdCBzdHJ1Y3QgcHJpbnRmX2luZm8gKl9faW5mbywKKwkJCSAgICAgX19jb25zdCB2b2lkICpfX2NvbnN0ICpfX2FyZ3MpOworCisvKiBUeXBlIG9mIGEgcHJpbnRmIHNwZWNpZmllci1hcmdpbmZvIGZ1bmN0aW9uLgorICAgSU5GTyBnaXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZm9ybWF0IHNwZWNpZmljYXRpb24uCisgICBOLCBBUkdUWVBFUywgKlNJWkUgaGFzIHRvIGNvbnRhaW4gdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBmb3IKKyAgIHVzZXItZGVmaW5lZCB0eXBlcywgYW5kIHJldHVybiB2YWx1ZSBhcmUgYXMgZm9yIHBhcnNlX3ByaW50Zl9mb3JtYXQKKyAgIGV4Y2VwdCB0aGF0IC0xIHNob3VsZCBiZSByZXR1cm5lZCBpZiB0aGUgaGFuZGxlciBjYW5ub3QgaGFuZGxlCisgICB0aGlzIGNhc2UuICBUaGlzIGFsbG93cyB0byBwYXJ0aWFsbHkgb3ZlcndyaXRlIHRoZSBmdW5jdGlvbmFsaXR5CisgICBvZiBleGlzdGluZyBmb3JtYXQgc3BlY2lmaWVycy4gICovCisKK3R5cGVkZWYgaW50IHByaW50Zl9hcmdpbmZvX3NpemVfZnVuY3Rpb24gKF9fY29uc3Qgc3RydWN0IHByaW50Zl9pbmZvICpfX2luZm8sCisJCQkJCSAgc2l6ZV90IF9fbiwgaW50ICpfX2FyZ3R5cGVzLAorCQkJCQkgIGludCAqX19zaXplKTsKKworLyogT2xkIHZlcnNpb24gb2YgJ3ByaW50Zl9hcmdpbmZvX2Z1bmN0aW9uJyB3aXRob3V0IGEgU0laRSBwYXJhbWV0ZXIuICAqLworCit0eXBlZGVmIGludCBwcmludGZfYXJnaW5mb19mdW5jdGlvbiAoX19jb25zdCBzdHJ1Y3QgcHJpbnRmX2luZm8gKl9faW5mbywKKwkJCQkgICAgIHNpemVfdCBfX24sIGludCAqX19hcmd0eXBlcyk7CisKKy8qIFR5cGUgb2YgYSBmdW5jdGlvbiB0byBnZXQgYSB2YWx1ZSBvZiBhIHVzZXItZGVmaW5lZCBmcm9tIHRoZQorICAgdmFyaWFibGUgYXJndW1lbnQgbGlzdC4gICovCit0eXBlZGVmIHZvaWQgcHJpbnRmX3ZhX2FyZ19mdW5jdGlvbiAodm9pZCAqX19tZW0sIHZhX2xpc3QgKl9fYXApOworCisKKy8qIFJlZ2lzdGVyIEZVTkMgdG8gYmUgY2FsbGVkIHRvIGZvcm1hdCBTUEVDIHNwZWNpZmllcnM7IEFSR0lORk8gbXVzdCBiZQorICAgc3BlY2lmaWVkIHRvIGRldGVybWluZSBob3cgbWFueSBhcmd1bWVudHMgYSBTUEVDIGNvbnZlcnNpb24gcmVxdWlyZXMgYW5kCisgICB3aGF0IHRoZWlyIHR5cGVzIGFyZS4gICovCisKK2V4dGVybiBpbnQgcmVnaXN0ZXJfcHJpbnRmX3NwZWNpZmllciAoaW50IF9fc3BlYywgcHJpbnRmX2Z1bmN0aW9uIF9fZnVuYywKKwkJCQkgICAgICBwcmludGZfYXJnaW5mb19zaXplX2Z1bmN0aW9uIF9fYXJnaW5mbykKKyAgX19USFJPVzsKKworCisvKiBPYnNvbGV0ZSBpbnRlcmZhY2Ugc2ltaWxhciB0byByZWdpc3Rlcl9wcmludGZfc3BlY2lmaWVyLiAgSXQgY2FuIG9ubHkKKyAgIGhhbmRsZSBiYXNpYyBkYXRhIHR5cGVzIGJlY2F1c2UgdGhlIEFSR0lORk8gY2FsbGJhY2sgZG9lcyBub3QgcmV0dXJuCisgICBpbmZvcm1hdGlvbiBvbiB0aGUgc2l6ZSBvZiB0aGUgdXNlci1kZWZpbmVkIHR5cGUuICAqLworCitleHRlcm4gaW50IHJlZ2lzdGVyX3ByaW50Zl9mdW5jdGlvbiAoaW50IF9fc3BlYywgcHJpbnRmX2Z1bmN0aW9uIF9fZnVuYywKKwkJCQkgICAgIHByaW50Zl9hcmdpbmZvX2Z1bmN0aW9uIF9fYXJnaW5mbykKKyAgX19USFJPVyBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX187CisKKworLyogUmVnaXN0ZXIgYSBuZXcgbW9kaWZpZXIgY2hhcmFjdGVyIHNlcXVlbmNlLiAgSWYgdGhlIGNhbGwgc3VjY2VlZHMKKyAgIGl0IHJldHVybnMgYSBwb3NpdGl2ZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGJpdCBzZXQgaW4gdGhlIFVTRVIKKyAgIGZpZWxkIGluICdzdHJ1Y3QgcHJpbnRmX2luZm8nLiAgKi8KKworZXh0ZXJuIGludCByZWdpc3Rlcl9wcmludGZfbW9kaWZpZXIgKF9fY29uc3Qgd2NoYXJfdCAqX19zdHIpIF9fd3VyIF9fVEhST1c7CisKKworLyogUmVnaXN0ZXIgdmFyaWFibGUgYXJndW1lbnQgaGFuZGxlciBmb3IgdXNlciB0eXBlLiAgVGhlIHJldHVybiB2YWx1ZQorICAgaXMgdG8gYmUgdXNlZCBpbiBBUkdJTkZPIGZ1bmN0aW9ucyB0byBzaWduYWwgdGhlIHVzZSBvZiB0aGUKKyAgIHR5cGUuICAqLworZXh0ZXJuIGludCByZWdpc3Rlcl9wcmludGZfdHlwZSAocHJpbnRmX3ZhX2FyZ19mdW5jdGlvbiBfX2ZjdCkgX193dXIgX19USFJPVzsKKworCisvKiBQYXJzZSBGTVQsIGFuZCBmaWxsIGluIE4gZWxlbWVudHMgb2YgQVJHVFlQRVMgd2l0aCB0aGUKKyAgIHR5cGVzIG5lZWRlZCBmb3IgdGhlIGNvbnZlcnNpb25zIEZNVCBzcGVjaWZpZXMuICBSZXR1cm5zCisgICB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyByZXF1aXJlZCBieSBGTVQuCisKKyAgIFRoZSBBUkdJTkZPIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgd2l0aCBhIHVzZXItZGVmaW5lZCBmb3JtYXQgaXMgcGFzc2VkIGEKKyAgIGBzdHJ1Y3QgcHJpbnRmX2luZm8nIGRlc2NyaWJpbmcgdGhlIGZvcm1hdCBzcGVjIGJlaW5nIHBhcnNlZC4gIEEgd2lkdGgKKyAgIG9yIHByZWNpc2lvbiBvZiBJTlRfTUlOIG1lYW5zIGEgYConIHdhcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlCisgICB3aWR0aC9wcmVjaXNpb24gd2lsbCBjb21lIGZyb20gYW4gYXJnLiAgVGhlIGZ1bmN0aW9uIHNob3VsZCBmaWxsIGluIHRoZQorICAgYXJyYXkgaXQgaXMgcGFzc2VkIHdpdGggdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgaXQgd2FudHMsIGFuZCByZXR1cm4KKyAgIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGl0IHdhbnRzLiAgKi8KKworZXh0ZXJuIHNpemVfdCBwYXJzZV9wcmludGZfZm9ybWF0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIHNpemVfdCBfX24sCisJCQkJICAgaW50ICpfX3Jlc3RyaWN0IF9fYXJndHlwZXMpIF9fVEhST1c7CisKKworLyogQ29kZXMgcmV0dXJuZWQgYnkgYHBhcnNlX3ByaW50Zl9mb3JtYXQnIGZvciBiYXNpYyB0eXBlcy4KKworICAgVGhlc2UgdmFsdWVzIGNvdmVyIGFsbCB0aGUgc3RhbmRhcmQgZm9ybWF0IHNwZWNpZmljYXRpb25zLgorICAgVXNlcnMgY2FuIHJlc2VydmUgbmV3IHZhbHVlcyBhZnRlciBQQV9MQVNUIGZvciB0aGVpciBvd24gdHlwZXMKKyAgIHVzaW5nICdyZWdpc3Rlcl9wcmludGZfdHlwZScuICAqLworCitlbnVtCit7CQkJCS8qIEMgdHlwZTogKi8KKyAgUEFfSU5ULAkJCS8qIGludCAqLworICBQQV9DSEFSLAkJCS8qIGludCwgY2FzdCB0byBjaGFyICovCisgIFBBX1dDSEFSLAkJCS8qIHdpZGUgY2hhciAqLworICBQQV9TVFJJTkcsCQkJLyogY29uc3QgY2hhciAqLCBhICdcMCctdGVybWluYXRlZCBzdHJpbmcgKi8KKyAgUEFfV1NUUklORywJCQkvKiBjb25zdCB3Y2hhcl90ICosIHdpZGUgY2hhcmFjdGVyIHN0cmluZyAqLworICBQQV9QT0lOVEVSLAkJCS8qIHZvaWQgKiAqLworICBQQV9GTE9BVCwJCQkvKiBmbG9hdCAqLworICBQQV9ET1VCTEUsCQkJLyogZG91YmxlICovCisgIFBBX0xBU1QKK307CisKKy8qIEZsYWcgYml0cyB0aGF0IGNhbiBiZSBzZXQgaW4gYSB0eXBlIHJldHVybmVkIGJ5IGBwYXJzZV9wcmludGZfZm9ybWF0Jy4gICovCisjZGVmaW5lCVBBX0ZMQUdfTUFTSwkJMHhmZjAwCisjZGVmaW5lCVBBX0ZMQUdfTE9OR19MT05HCSgxIDw8IDgpCisjZGVmaW5lCVBBX0ZMQUdfTE9OR19ET1VCTEUJUEFfRkxBR19MT05HX0xPTkcKKyNkZWZpbmUJUEFfRkxBR19MT05HCQkoMSA8PCA5KQorI2RlZmluZQlQQV9GTEFHX1NIT1JUCQkoMSA8PCAxMCkKKyNkZWZpbmUJUEFfRkxBR19QVFIJCSgxIDw8IDExKQorCisKKworLyogRnVuY3Rpb24gd2hpY2ggY2FuIGJlIHJlZ2lzdGVyZWQgYXMgYHByaW50ZictaGFuZGxlcnMuICAqLworCisvKiBQcmludCBmbG9hdGluZyBwb2ludCB2YWx1ZSB1c2luZyB1c2luZyBhYmJyZXZpYXRpb25zIGZvciB0aGUgb3JkZXJzCisgICBvZiBtYWduaXR1ZGUgdXNlZCBmb3IgbnVtYmVycyAoJ2snIGZvciBraWxvLCAnbScgZm9yIG1lZ2EgZXRjKS4gIElmCisgICB0aGUgZm9ybWF0IHNwZWNpZmllciBpcyBhIHVwcGVyY2FzZSBjaGFyYWN0ZXIgcG93ZXJzIG9mIDEwMDAgYXJlCisgICB1c2VkLiAgT3RoZXJ3aXNlIHBvd2VycyBvZiAxMDI0LiAgKi8KK2V4dGVybiBpbnQgcHJpbnRmX3NpemUgKEZJTEUgKl9fcmVzdHJpY3QgX19mcCwKKwkJCV9fY29uc3Qgc3RydWN0IHByaW50Zl9pbmZvICpfX2luZm8sCisJCQlfX2NvbnN0IHZvaWQgKl9fY29uc3QgKl9fcmVzdHJpY3QgX19hcmdzKSBfX1RIUk9XOworCisvKiBUaGlzIGlzIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudCBpbmZvcm1hdGlvbiBmdW5jdGlvbiBmb3IgYHByaW50Zl9zaXplJy4gICovCitleHRlcm4gaW50IHByaW50Zl9zaXplX2luZm8gKF9fY29uc3Qgc3RydWN0IHByaW50Zl9pbmZvICpfX3Jlc3RyaWN0CisJCQkgICAgIF9faW5mbywgc2l6ZV90IF9fbiwgaW50ICpfX3Jlc3RyaWN0IF9fYXJndHlwZXMpCisgICAgIF9fVEhST1c7CisKKyNpZmRlZiBfX0xEQkxfQ09NUEFUCisjIGluY2x1ZGUgPGJpdHMvcHJpbnRmLWxkYmwuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcHJpbnRmLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy9yb3V0ZWQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3JvdXRlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZmQ4NjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy9yb3V0ZWQuaApAQCAtMCwwICsxLDEwMSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5ODksIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpcm91dGVkLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfUFJPVE9DT0xTX1JPVVRFRF9ICisjZGVmaW5lCV9QUk9UT0NPTFNfUk9VVEVEX0ggMQorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorLyoKKyAqIFJvdXRpbmcgSW5mb3JtYXRpb24gUHJvdG9jb2wKKyAqCisgKiBEZXJpdmVkIGZyb20gWGVyb3ggTlMgUm91dGluZyBJbmZvcm1hdGlvbiBQcm90b2NvbAorICogYnkgY2hhbmdpbmcgMzItYml0IG5ldCBudW1iZXJzIHRvIHNvY2thZGRyJ3MgYW5kCisgKiBwYWRkaW5nIHN0dWZmIHRvIDMyLWJpdCBib3VuZGFyaWVzLgorICovCisjZGVmaW5lCVJJUFZFUlNJT04JMQorCitzdHJ1Y3QgbmV0aW5mbyB7CisJc3RydWN0CXNvY2thZGRyIHJpcF9kc3Q7CS8qIGRlc3RpbmF0aW9uIG5ldC9ob3N0ICovCisJaW50CXJpcF9tZXRyaWM7CQkvKiBjb3N0IG9mIHJvdXRlICovCit9OworCitzdHJ1Y3QgcmlwIHsKKwl1X2NoYXIJcmlwX2NtZDsJCS8qIHJlcXVlc3QvcmVzcG9uc2UgKi8KKwl1X2NoYXIJcmlwX3ZlcnM7CQkvKiBwcm90b2NvbCB2ZXJzaW9uICMgKi8KKwl1X2NoYXIJcmlwX3JlczFbMl07CQkvKiBwYWQgdG8gMzItYml0IGJvdW5kYXJ5ICovCisJdW5pb24geworCQlzdHJ1Y3QJbmV0aW5mbyBydV9uZXRzWzFdOwkvKiB2YXJpYWJsZSBsZW5ndGguLi4gKi8KKwkJY2hhcglydV90cmFjZWZpbGVbMV07CS8qIGRpdHRvIC4uLiAqLworCX0gcmlwdW47CisjZGVmaW5lCXJpcF9uZXRzCXJpcHVuLnJ1X25ldHMKKyNkZWZpbmUJcmlwX3RyYWNlZmlsZQlyaXB1bi5ydV90cmFjZWZpbGUKK307CisKKy8qCisgKiBQYWNrZXQgdHlwZXMuCisgKi8KKyNkZWZpbmUJUklQQ01EX1JFUVVFU1QJCTEJLyogd2FudCBpbmZvICovCisjZGVmaW5lCVJJUENNRF9SRVNQT05TRQkJMgkvKiByZXNwb25kaW5nIHRvIHJlcXVlc3QgKi8KKyNkZWZpbmUJUklQQ01EX1RSQUNFT04JCTMJLyogdHVybiB0cmFjaW5nIG9uICovCisjZGVmaW5lCVJJUENNRF9UUkFDRU9GRgkJNAkvKiB0dXJuIGl0IG9mZiAqLworCisjZGVmaW5lCVJJUENNRF9NQVgJCTUKKyNpZmRlZiBSSVBDTURTCitjaGFyICpyaXBjbWRzW1JJUENNRF9NQVhdID0KKyAgeyAiIzAiLCAiUkVRVUVTVCIsICJSRVNQT05TRSIsICJUUkFDRU9OIiwgIlRSQUNFT0ZGIiB9OworI2VuZGlmCisKKyNkZWZpbmUJSE9QQ05UX0lORklOSVRZCQkxNgkvKiBwZXIgWGVyb3ggTlMgKi8KKyNkZWZpbmUJTUFYUEFDS0VUU0laRQkJNTEyCS8qIG1heCBicm9hZGNhc3Qgc2l6ZSAqLworCisvKgorICogVGltZXIgdmFsdWVzIHVzZWQgaW4gbWFuYWdpbmcgdGhlIHJvdXRpbmcgdGFibGUuCisgKiBDb21wbGV0ZSB0YWJsZXMgYXJlIGJyb2FkY2FzdCBldmVyeSBTVVBQTFlfSU5URVJWQUwgc2Vjb25kcy4KKyAqIElmIGNoYW5nZXMgb2NjdXIgYmV0d2VlbiB1cGRhdGVzLCBkeW5hbWljIHVwZGF0ZXMgY29udGFpbmluZyBvbmx5IGNoYW5nZXMKKyAqIG1heSBiZSBzZW50LiAgV2hlbiB0aGVzZSBhcmUgc2VudCwgYSB0aW1lciBpcyBzZXQgZm9yIGEgcmFuZG9tIHZhbHVlCisgKiBiZXR3ZWVuIE1JTl9XQUlUVElNRSBhbmQgTUFYX1dBSVRUSU1FLCBhbmQgbm8gYWRkaXRpb25hbCBkeW5hbWljIHVwZGF0ZXMKKyAqIGFyZSBzZW50IHVudGlsIHRoZSB0aW1lciBleHBpcmVzLgorICoKKyAqIEV2ZXJ5IHVwZGF0ZSBvZiBhIHJvdXRpbmcgZW50cnkgZm9yY2VzIGFuIGVudHJ5J3MgdGltZXIgdG8gYmUgcmVzZXQuCisgKiBBZnRlciBFWFBJUkVfVElNRSB3aXRob3V0IHVwZGF0ZXMsIHRoZSBlbnRyeSBpcyBtYXJrZWQgaW52YWxpZCwKKyAqIGJ1dCBoZWxkIG9udG8gdW50aWwgR0FSQkFHRV9USU1FIHNvIHRoYXQgb3RoZXJzIG1heQorICogc2VlIGl0ICJiZSBkZWxldGVkIi4KKyAqLworI2RlZmluZQlUSU1FUl9SQVRFCQkzMAkvKiBhbGFybSBjbG9ja3MgZXZlcnkgMzAgc2Vjb25kcyAqLworCisjZGVmaW5lCVNVUFBMWV9JTlRFUlZBTAkJMzAJLyogdGltZSB0byBzdXBwbHkgdGFibGVzICovCisjZGVmaW5lCU1JTl9XQUlUVElNRQkJMgkvKiBtaW4uIGludGVydmFsIHRvIGJyb2FkY2FzdCBjaGFuZ2VzICovCisjZGVmaW5lCU1BWF9XQUlUVElNRQkJNQkvKiBtYXguIHRpbWUgdG8gZGVsYXkgY2hhbmdlcyAqLworCisjZGVmaW5lCUVYUElSRV9USU1FCQkxODAJLyogdGltZSB0byBtYXJrIGVudHJ5IGludmFsaWQgKi8KKyNkZWZpbmUJR0FSQkFHRV9USU1FCQkyNDAJLyogdGltZSB0byBnYXJiYWdlIGNvbGxlY3QgKi8KKworI2VuZGlmIC8qIHByb3RvY29scy9yb3V0ZWQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wcm90b2NvbHMvcndob2QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3J3aG9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2ZDZmOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3J3aG9kLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylyd2hvZC5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICovCisKKyNpZm5kZWYgX1BST1RPQ09MU19SV0hPRF9ICisjZGVmaW5lCV9QUk9UT0NPTFNfUldIT0RfSCAxCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyoKKyAqIHJ3aG8gcHJvdG9jb2wgcGFja2V0IGZvcm1hdC4KKyAqLworc3RydWN0CW91dG1wIHsKKwljaGFyCW91dF9saW5lWzhdOwkJLyogdHR5IG5hbWUgKi8KKwljaGFyCW91dF9uYW1lWzhdOwkJLyogdXNlciBpZCAqLworCWludDMyX3QJb3V0X3RpbWU7CQkvKiB0aW1lIG9uICovCit9OworCitzdHJ1Y3QJd2hvZCB7CisJY2hhcgl3ZF92ZXJzOwkJLyogcHJvdG9jb2wgdmVyc2lvbiAjICovCisJY2hhcgl3ZF90eXBlOwkJLyogcGFja2V0IHR5cGUsIHNlZSBiZWxvdyAqLworCWNoYXIJd2RfcGFkWzJdOworCWludAl3ZF9zZW5kdGltZTsJCS8qIHRpbWUgc3RhbXAgYnkgc2VuZGVyICovCisJaW50CXdkX3JlY3Z0aW1lOwkJLyogdGltZSBzdGFtcCBhcHBsaWVkIGJ5IHJlY2VpdmVyICovCisJY2hhcgl3ZF9ob3N0bmFtZVszMl07CS8qIGhvc3RzJ3MgbmFtZSAqLworCWludAl3ZF9sb2FkYXZbM107CQkvKiBsb2FkIGF2ZXJhZ2UgYXMgaW4gdXB0aW1lICovCisJaW50CXdkX2Jvb3R0aW1lOwkJLyogdGltZSBzeXN0ZW0gYm9vdGVkICovCisJc3RydWN0CXdob2VudCB7CisJCXN0cnVjdAlvdXRtcCB3ZV91dG1wOwkvKiBhY3RpdmUgdHR5IGluZm8gKi8KKwkJaW50CXdlX2lkbGU7CS8qIHR0eSBpZGxlIHRpbWUgKi8KKwl9IHdkX3dlWzEwMjQgLyBzaXplb2YgKHN0cnVjdCB3aG9lbnQpXTsKK307CisKKyNkZWZpbmUJV0hPRFZFUlNJT04JMQorI2RlZmluZQlXSE9EVFlQRV9TVEFUVVMJMQkJLyogaG9zdCBzdGF0dXMgKi8KKworLyogV2UgdXNlZCB0byBkZWZpbmUgX1BBVEhfUldIT0RJUiBoZXJlIGJ1dCBpdCdzIG5vdyBpbiA8cGF0aHMuaD4uICAqLworI2luY2x1ZGUgPHBhdGhzLmg+CisKKyNlbmRpZiAvKiBwcm90b2NvbHMvcndob2QuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wcm90b2NvbHMvdGFsa2QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3RhbGtkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmMzNiMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3RhbGtkLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGFsa2QuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqLworCisjaWZuZGVmIF9QUk9UT0NPTFNfVEFMS0RfSAorI2RlZmluZQlfUFJPVE9DT0xTX1RBTEtEX0ggMQorCisvKgorICogVGhpcyBkZXNjcmliZXMgdGhlIHByb3RvY29sIHVzZWQgYnkgdGhlIHRhbGsgc2VydmVyIGFuZCBjbGllbnRzLgorICoKKyAqIFRoZSB0YWxrIHNlcnZlciBhY3RzIGEgcmVwb3NpdG9yeSBvZiBpbnZpdGF0aW9ucywgcmVzcG9uZGluZyB0bworICogcmVxdWVzdHMgYnkgY2xpZW50cyB3aXNoaW5nIHRvIHJlbmRlenZvdXMgZm9yIHRoZSBwdXJwb3NlIG9mCisgKiBob2xkaW5nIGEgY29udmVyc2F0aW9uLiAgSW4gbm9ybWFsIG9wZXJhdGlvbiwgYSBjbGllbnQsIHRoZSBjYWxsZXIsCisgKiBpbml0aWF0ZXMgYSByZW5kZXp2b3VzIGJ5IHNlbmRpbmcgYSBDVExfTVNHIHRvIHRoZSBzZXJ2ZXIgb2YKKyAqIHR5cGUgTE9PS19VUC4gIFRoaXMgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8gc2VhcmNoIGl0cyBpbnZpdGF0aW9uCisgKiB0YWJsZXMgdG8gY2hlY2sgaWYgYW4gaW52aXRhdGlvbiBjdXJyZW50bHkgZXhpc3RzIGZvciB0aGUgY2FsbGVyCisgKiAodG8gc3BlYWsgdG8gdGhlIGNhbGxlZSBzcGVjaWZpZWQgaW4gdGhlIG1lc3NhZ2UpLiAgSWYgdGhlIGxvb2t1cAorICogZmFpbHMsIHRoZSBjYWxsZXIgdGhlbiBzZW5kcyBhbiBBTk5PVU5DRSBtZXNzYWdlIGNhdXNpbmcgdGhlIHNlcnZlcgorICogdG8gYnJvYWRjYXN0IGFuIGFubm91bmNlbWVudCBvbiB0aGUgY2FsbGVlJ3MgbG9naW4gcG9ydHMgcmVxdWVzdGluZworICogY29udGFjdC4gIFdoZW4gdGhlIGNhbGxlZSByZXNwb25kcywgdGhlIGxvY2FsIHNlcnZlciB1c2VzIHRoZQorICogcmVjb3JkZWQgaW52aXRhdGlvbiB0byByZXNwb25kIHdpdGggdGhlIGFwcHJvcHJpYXRlIHJlbmRlenZvdXMKKyAqIGFkZHJlc3MgYW5kIHRoZSBjYWxsZXIgYW5kIGNhbGxlZSBjbGllbnQgcHJvZ3JhbXMgZXN0YWJsaXNoIGEKKyAqIHN0cmVhbSBjb25uZWN0aW9uIHRocm91Z2ggd2hpY2ggdGhlIGNvbnZlcnNhdGlvbiB0YWtlcyBwbGFjZS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisvKgorICogQ2xpZW50LT5zZXJ2ZXIgcmVxdWVzdCBtZXNzYWdlIGZvcm1hdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVfY2hhcgl2ZXJzOwkJLyogcHJvdG9jb2wgdmVyc2lvbiAqLworCXVfY2hhcgl0eXBlOwkJLyogcmVxdWVzdCB0eXBlLCBzZWUgYmVsb3cgKi8KKwl1X2NoYXIJYW5zd2VyOwkJLyogbm90IHVzZWQgKi8KKwl1X2NoYXIJcGFkOworCXVfaW50MzJfdCBpZF9udW07CS8qIG1lc3NhZ2UgaWQgKi8KKwlzdHJ1Y3QJb3NvY2thZGRyIGFkZHI7CQkvKiBvbGQgKDQuMykgc3R5bGUgKi8KKwlzdHJ1Y3QJb3NvY2thZGRyIGN0bF9hZGRyOwkvKiBvbGQgKDQuMykgc3R5bGUgKi8KKwlpbnQzMl90CXBpZDsJCS8qIGNhbGxlcidzIHByb2Nlc3MgaWQgKi8KKyNkZWZpbmUJTkFNRV9TSVpFCTEyCisJY2hhcglsX25hbWVbTkFNRV9TSVpFXTsvKiBjYWxsZXIncyBuYW1lICovCisJY2hhcglyX25hbWVbTkFNRV9TSVpFXTsvKiBjYWxsZWUncyBuYW1lICovCisjZGVmaW5lCVRUWV9TSVpFCTE2CisJY2hhcglyX3R0eVtUVFlfU0laRV07LyogY2FsbGVlJ3MgdHR5IG5hbWUgKi8KK30gQ1RMX01TRzsKKworLyoKKyAqIFNlcnZlci0+Y2xpZW50IHJlc3BvbnNlIG1lc3NhZ2UgZm9ybWF0LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdV9jaGFyCXZlcnM7CQkvKiBwcm90b2NvbCB2ZXJzaW9uICovCisJdV9jaGFyCXR5cGU7CQkvKiB0eXBlIG9mIHJlcXVlc3QgbWVzc2FnZSwgc2VlIGJlbG93ICovCisJdV9jaGFyCWFuc3dlcjsJCS8qIHJlc3BvbnNlIHRvIHJlcXVlc3QgbWVzc2FnZSwgc2VlIGJlbG93ICovCisJdV9jaGFyCXBhZDsKKwl1X2ludDMyX3QgaWRfbnVtOwkvKiBtZXNzYWdlIGlkICovCisJc3RydWN0CW9zb2NrYWRkciBhZGRyOwkvKiBhZGRyZXNzIGZvciBlc3RhYmxpc2hpbmcgY29udmVyc2F0aW9uICovCit9IENUTF9SRVNQT05TRTsKKworI2RlZmluZQlUQUxLX1ZFUlNJT04JMQkJLyogcHJvdG9jb2wgdmVyc2lvbiAqLworCisvKiBtZXNzYWdlIHR5cGUgdmFsdWVzICovCisjZGVmaW5lIExFQVZFX0lOVklURQkwCS8qIGxlYXZlIGludml0YXRpb24gd2l0aCBzZXJ2ZXIgKi8KKyNkZWZpbmUgTE9PS19VUAkJMQkvKiBjaGVjayBmb3IgaW52aXRhdGlvbiBieSBjYWxsZWUgKi8KKyNkZWZpbmUgREVMRVRFCQkyCS8qIGRlbGV0ZSBpbnZpdGF0aW9uIGJ5IGNhbGxlciAqLworI2RlZmluZSBBTk5PVU5DRQkzCS8qIGFubm91bmNlIGludml0YXRpb24gYnkgY2FsbGVyICovCisKKy8qIGFuc3dlciB2YWx1ZXMgKi8KKyNkZWZpbmUgU1VDQ0VTUwkJMAkvKiBvcGVyYXRpb24gY29tcGxldGVkIHByb3Blcmx5ICovCisjZGVmaW5lIE5PVF9IRVJFCTEJLyogY2FsbGVlIG5vdCBsb2dnZWQgaW4gKi8KKyNkZWZpbmUgRkFJTEVECQkyCS8qIG9wZXJhdGlvbiBmYWlsZWQgZm9yIHVuZXhwbGFpbmVkIHJlYXNvbiAqLworI2RlZmluZSBNQUNISU5FX1VOS05PV04JMwkvKiBjYWxsZXIncyBtYWNoaW5lIG5hbWUgdW5rbm93biAqLworI2RlZmluZSBQRVJNSVNTSU9OX0RFTklFRCA0CS8qIGNhbGxlZSdzIHR0eSBkb2Vzbid0IHBlcm1pdCBhbm5vdW5jZSAqLworI2RlZmluZSBVTktOT1dOX1JFUVVFU1QJNQkvKiByZXF1ZXN0IGhhcyBpbnZhbGlkIHR5cGUgdmFsdWUgKi8KKyNkZWZpbmUJQkFEVkVSU0lPTgk2CS8qIHJlcXVlc3QgaGFzIGludmFsaWQgcHJvdG9jb2wgdmVyc2lvbiAqLworI2RlZmluZQlCQURBRERSCQk3CS8qIHJlcXVlc3QgaGFzIGludmFsaWQgYWRkciB2YWx1ZSAqLworI2RlZmluZQlCQURDVExBRERSCTgJLyogcmVxdWVzdCBoYXMgaW52YWxpZCBjdGxfYWRkciB2YWx1ZSAqLworCisvKgorICogT3BlcmF0aW9uYWwgcGFyYW1ldGVycy4KKyAqLworI2RlZmluZSBNQVhfTElGRQk2MAkvKiBtYXggdGltZSBkYWVtb24gc2F2ZXMgaW52aXRhdGlvbnMgKi8KKy8qIFJJTkdfV0FJVCBzaG91bGQgYmUgMTAncyBvZiBzZWNvbmRzIGxlc3MgdGhhbiBNQVhfTElGRSAqLworI2RlZmluZSBSSU5HX1dBSVQJMzAJLyogdGltZSB0byB3YWl0IGJlZm9yZSByZXNlbmRpbmcgaW52aXRhdGlvbiAqLworCisjZW5kaWYgLyogcHJvdG9jb2xzL3RhbGtkLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3RpbWVkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy90aW1lZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZDQ3MDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy90aW1lZC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGltZWQuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqLworCisjaWZuZGVmCV9QUk9UT0NPTFNfVElNRURfSAorI2RlZmluZQlfUFJPVE9DT0xTX1RJTUVEX0ggMQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworLyoKKyAqIFRpbWUgU3luY2hyb25pemF0aW9uIFByb3RvY29sCisgKi8KKworI2RlZmluZQlUU1BWRVJTSU9OCTEKKyNkZWZpbmUgQU5ZQUREUiAJTlVMTAorI2RlZmluZSBNQVhIT1NUTkFNRUxFTgk2NAorCitzdHJ1Y3QgdHNwIHsKKwl1X2NoYXIJdHNwX3R5cGU7CisJdV9jaGFyCXRzcF92ZXJzOworCXVfc2hvcnQJdHNwX3NlcTsKKwl1bmlvbiB7CisJCXN0cnVjdCB0aW1ldmFsIHRzcHVfdGltZTsKKwkJY2hhciB0c3B1X2hvcGNudDsKKwl9IHRzcF91OworCWNoYXIgdHNwX25hbWVbTUFYSE9TVE5BTUVMRU5dOworfTsKKworI2RlZmluZQl0c3BfdGltZQl0c3BfdS50c3B1X3RpbWUKKyNkZWZpbmUJdHNwX2hvcGNudAl0c3BfdS50c3B1X2hvcGNudAorCisvKgorICogQ29tbWFuZCB0eXBlcy4KKyAqLworI2RlZmluZQlUU1BfQU5ZCQkJMAkvKiBtYXRjaCBhbnkgdHlwZXMgKi8KKyNkZWZpbmUJVFNQX0FESlRJTUUJCTEJLyogc2VuZCBhZGp0aW1lICovCisjZGVmaW5lCVRTUF9BQ0sJCQkyCS8qIGdlbmVyaWMgYWNrbm93bGVkZ2VtZW50ICovCisjZGVmaW5lCVRTUF9NQVNURVJSRVEJCTMJLyogYXNrIGZvciBtYXN0ZXIncyBuYW1lICovCisjZGVmaW5lCVRTUF9NQVNURVJBQ0sJCTQJLyogYWNrbm93bGVkZ2UgbWFzdGVyIHJlcXVlc3QgKi8KKyNkZWZpbmUJVFNQX1NFVFRJTUUJCTUJLyogc2VuZCBuZXR3b3JrIHRpbWUgKi8KKyNkZWZpbmUJVFNQX01BU1RFUlVQCQk2CS8qIGluZm9ybSBzbGF2ZXMgdGhhdCBtYXN0ZXIgaXMgdXAgKi8KKyNkZWZpbmUJVFNQX1NMQVZFVVAJCTcJLyogc2xhdmUgaXMgdXAgYnV0IG5vdCBwb2xsZWQgKi8KKyNkZWZpbmUJVFNQX0VMRUNUSU9OCQk4CS8qIGFkdmFuY2UgY2FuZGlkYXR1cmUgZm9yIG1hc3RlciAqLworI2RlZmluZQlUU1BfQUNDRVBUCQk5CS8qIHN1cHBvcnQgY2FuZGlkYXR1cmUgb2YgbWFzdGVyICovCisjZGVmaW5lCVRTUF9SRUZVU0UJCTEwCS8qIHJlamVjdCBjYW5kaWRhdHVyZSBvZiBtYXN0ZXIgKi8KKyNkZWZpbmUJVFNQX0NPTkZMSUNUCQkxMQkvKiB0d28gb3IgbW9yZSBtYXN0ZXJzIHByZXNlbnQgKi8KKyNkZWZpbmUJVFNQX1JFU09MVkUJCTEyCS8qIG1hc3RlcnMnIGNvbmZsaWN0IHJlc29sdXRpb24gKi8KKyNkZWZpbmUJVFNQX1FVSVQJCTEzCS8qIHJlamVjdCBjYW5kaWRhdHVyZSBpZiBtYXN0ZXIgaXMgdXAgKi8KKyNkZWZpbmUJVFNQX0RBVEUJCTE0CS8qIHJlc2V0IHRoZSB0aW1lIChkYXRlIGNvbW1hbmQpICovCisjZGVmaW5lCVRTUF9EQVRFUkVRCQkxNQkvKiByZW1vdGUgcmVxdWVzdCB0byByZXNldCB0aGUgdGltZSAqLworI2RlZmluZQlUU1BfREFURUFDSwkJMTYJLyogYWNrbm93bGVkZ2UgdGltZSBzZXR0aW5nICAqLworI2RlZmluZQlUU1BfVFJBQ0VPTgkJMTcJLyogdHVybiB0cmFjaW5nIG9uICovCisjZGVmaW5lCVRTUF9UUkFDRU9GRgkJMTgJLyogdHVybiB0cmFjaW5nIG9mZiAqLworI2RlZmluZQlUU1BfTVNJVEUJCTE5CS8qIGZpbmQgb3V0IG1hc3RlcidzIHNpdGUgKi8KKyNkZWZpbmUJVFNQX01TSVRFUkVRCQkyMAkvKiByZW1vdGUgbWFzdGVyJ3Mgc2l0ZSByZXF1ZXN0ICovCisjZGVmaW5lCVRTUF9URVNUCQkyMQkvKiBmb3IgdGVzdGluZyBlbGVjdGlvbiBhbGdvICovCisjZGVmaW5lCVRTUF9TRVREQVRFCQkyMgkvKiBOZXcgZnJvbSBkYXRlIGNvbW1hbmQgKi8KKyNkZWZpbmUJVFNQX1NFVERBVEVSRVEJCTIzCS8qIE5ldyByZW1vdGUgZm9yIGFib3ZlICovCisjZGVmaW5lCVRTUF9MT09QCQkyNAkvKiBsb29wIGRldGVjdGlvbiBwYWNrZXQgKi8KKworI2RlZmluZQlUU1BUWVBFTlVNQkVSCQkyNQorCisjaWZkZWYgVFNQVFlQRVMKK2NoYXIgKnRzcHR5cGVbVFNQVFlQRU5VTUJFUl0gPQorICB7ICJBTlkiLCAiQURKVElNRSIsICJBQ0siLCAiTUFTVEVSUkVRIiwgIk1BU1RFUkFDSyIsICJTRVRUSU1FIiwgIk1BU1RFUlVQIiwKKyAgIlNMQVZFVVAiLCAiRUxFQ1RJT04iLCAiQUNDRVBUIiwgIlJFRlVTRSIsICJDT05GTElDVCIsICJSRVNPTFZFIiwgIlFVSVQiLAorICAiREFURSIsICJEQVRFUkVRIiwgIkRBVEVBQ0siLCAiVFJBQ0VPTiIsICJUUkFDRU9GRiIsICJNU0lURSIsICJNU0lURVJFUSIsCisgICJURVNUIiwgIlNFVERBVEUiLCAiU0VUREFURVJFUSIsICJMT09QIiB9OworI2VuZGlmCisKKyNlbmRpZiAvKiBwcm90b2NvbHMvdGltZWQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdGhyZWFkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B0aHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTI0MjgxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdGhyZWFkLmgKQEAgLTAsMCArMSwxMTQ1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9QVEhSRUFEX0gKKyNkZWZpbmUgX1BUSFJFQURfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8Yml0cy9wdGhyZWFkdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3NldGptcC5oPgorI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworCisvKiBEZXRhY2ggc3RhdGUuICAqLworZW51bQoreworICBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSwKKyNkZWZpbmUgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUJUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUKKyAgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQKKyNkZWZpbmUgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQJUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQKK307CisKKworLyogTXV0ZXggdHlwZXMuICAqLworZW51bQoreworICBQVEhSRUFEX01VVEVYX1RJTUVEX05QLAorICBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCwKKyAgUFRIUkVBRF9NVVRFWF9FUlJPUkNIRUNLX05QLAorICBQVEhSRUFEX01VVEVYX0FEQVBUSVZFX05QCisjaWYgZGVmaW5lZCBfX1VTRV9VTklYOTggfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorICAsCisgIFBUSFJFQURfTVVURVhfTk9STUFMID0gUFRIUkVBRF9NVVRFWF9USU1FRF9OUCwKKyAgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgPSBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCwKKyAgUFRIUkVBRF9NVVRFWF9FUlJPUkNIRUNLID0gUFRIUkVBRF9NVVRFWF9FUlJPUkNIRUNLX05QLAorICBQVEhSRUFEX01VVEVYX0RFRkFVTFQgPSBQVEhSRUFEX01VVEVYX05PUk1BTAorI2VuZGlmCisjaWZkZWYgX19VU0VfR05VCisgIC8qIEZvciBjb21wYXRpYmlsaXR5LiAgKi8KKyAgLCBQVEhSRUFEX01VVEVYX0ZBU1RfTlAgPSBQVEhSRUFEX01VVEVYX1RJTUVEX05QCisjZW5kaWYKK307CisKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIFJvYnVzdCBtdXRleCBvciBub3QgZmxhZ3MuICAqLworZW51bQoreworICBQVEhSRUFEX01VVEVYX1NUQUxMRUQsCisgIFBUSFJFQURfTVVURVhfU1RBTExFRF9OUCA9IFBUSFJFQURfTVVURVhfU1RBTExFRCwKKyAgUFRIUkVBRF9NVVRFWF9ST0JVU1QsCisgIFBUSFJFQURfTVVURVhfUk9CVVNUX05QID0gUFRIUkVBRF9NVVRFWF9ST0JVU1QKK307CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfVU5JWDk4CisvKiBNdXRleCBwcm90b2NvbHMuICAqLworZW51bQoreworICBQVEhSRUFEX1BSSU9fTk9ORSwKKyAgUFRIUkVBRF9QUklPX0lOSEVSSVQsCisgIFBUSFJFQURfUFJJT19QUk9URUNUCit9OworI2VuZGlmCisKKworLyogTXV0ZXggaW5pdGlhbGl6ZXJzLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDY0CisjIGRlZmluZSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSIFwKKyAgeyB7IDAsIDAsIDAsIDAsIDAsIDAsIHsgMCwgMCB9IH0gfQorIyBpZmRlZiBfX1VTRV9HTlUKKyMgIGRlZmluZSBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCBcCisgIHsgeyAwLCAwLCAwLCAwLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCwgMCwgeyAwLCAwIH0gfSB9CisjICBkZWZpbmUgUFRIUkVBRF9FUlJPUkNIRUNLX01VVEVYX0lOSVRJQUxJWkVSX05QIFwKKyAgeyB7IDAsIDAsIDAsIDAsIFBUSFJFQURfTVVURVhfRVJST1JDSEVDS19OUCwgMCwgeyAwLCAwIH0gfSB9CisjICBkZWZpbmUgUFRIUkVBRF9BREFQVElWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCBcCisgIHsgeyAwLCAwLCAwLCAwLCBQVEhSRUFEX01VVEVYX0FEQVBUSVZFX05QLCAwLCB7IDAsIDAgfSB9IH0KKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSIFwKKyAgeyB7IDAsIDAsIDAsIDAsIDAsIHsgMCB9IH0gfQorIyBpZmRlZiBfX1VTRV9HTlUKKyMgIGRlZmluZSBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCBcCisgIHsgeyAwLCAwLCAwLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCwgMCwgeyAwIH0gfSB9CisjICBkZWZpbmUgUFRIUkVBRF9FUlJPUkNIRUNLX01VVEVYX0lOSVRJQUxJWkVSX05QIFwKKyAgeyB7IDAsIDAsIDAsIFBUSFJFQURfTVVURVhfRVJST1JDSEVDS19OUCwgMCwgeyAwIH0gfSB9CisjICBkZWZpbmUgUFRIUkVBRF9BREFQVElWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCBcCisgIHsgeyAwLCAwLCAwLCBQVEhSRUFEX01VVEVYX0FEQVBUSVZFX05QLCAwLCB7IDAgfSB9IH0KKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIFJlYWQtd3JpdGUgbG9jayB0eXBlcy4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9VTklYOTggfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCitlbnVtCit7CisgIFBUSFJFQURfUldMT0NLX1BSRUZFUl9SRUFERVJfTlAsCisgIFBUSFJFQURfUldMT0NLX1BSRUZFUl9XUklURVJfTlAsCisgIFBUSFJFQURfUldMT0NLX1BSRUZFUl9XUklURVJfTk9OUkVDVVJTSVZFX05QLAorICBQVEhSRUFEX1JXTE9DS19ERUZBVUxUX05QID0gUFRIUkVBRF9SV0xPQ0tfUFJFRkVSX1JFQURFUl9OUAorfTsKKworLyogUmVhZC13cml0ZSBsb2NrIGluaXRpYWxpemVycy4gICovCisjIGRlZmluZSBQVEhSRUFEX1JXTE9DS19JTklUSUFMSVpFUiBcCisgIHsgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0gfQorIyBpZmRlZiBfX1VTRV9HTlUKKyMgIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgICBkZWZpbmUgUFRIUkVBRF9SV0xPQ0tfV1JJVEVSX05PTlJFQ1VSU0lWRV9JTklUSUFMSVpFUl9OUCBcCisgIHsgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkJCQkJICAgICAgXAorCVBUSFJFQURfUldMT0NLX1BSRUZFUl9XUklURVJfTk9OUkVDVVJTSVZFX05QIH0gfQorIyAgZWxzZQorIyAgIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgICAgZGVmaW5lIFBUSFJFQURfUldMT0NLX1dSSVRFUl9OT05SRUNVUlNJVkVfSU5JVElBTElaRVJfTlAgXAorICB7IHsgMCwgMCwgMCwgMCwgMCwgMCwgUFRIUkVBRF9SV0xPQ0tfUFJFRkVSX1dSSVRFUl9OT05SRUNVUlNJVkVfTlAsIFwKKyAgICAgIDAsIDAsIDAsIDAgfSB9CisjICAgZWxzZQorIyAgICBkZWZpbmUgUFRIUkVBRF9SV0xPQ0tfV1JJVEVSX05PTlJFQ1VSU0lWRV9JTklUSUFMSVpFUl9OUCBcCisgIHsgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBQVEhSRUFEX1JXTE9DS19QUkVGRVJfV1JJVEVSX05PTlJFQ1VSU0lWRV9OUCxcCisgICAgICAwIH0gfQorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmICAvKiBVbml4OTggb3IgWE9wZW4ySyAqLworCisKKy8qIFNjaGVkdWxlciBpbmhlcml0YW5jZS4gICovCitlbnVtCit7CisgIFBUSFJFQURfSU5IRVJJVF9TQ0hFRCwKKyNkZWZpbmUgUFRIUkVBRF9JTkhFUklUX1NDSEVEICAgUFRIUkVBRF9JTkhFUklUX1NDSEVECisgIFBUSFJFQURfRVhQTElDSVRfU0NIRUQKKyNkZWZpbmUgUFRIUkVBRF9FWFBMSUNJVF9TQ0hFRCAgUFRIUkVBRF9FWFBMSUNJVF9TQ0hFRAorfTsKKworCisvKiBTY29wZSBoYW5kbGluZy4gICovCitlbnVtCit7CisgIFBUSFJFQURfU0NPUEVfU1lTVEVNLAorI2RlZmluZSBQVEhSRUFEX1NDT1BFX1NZU1RFTSAgICBQVEhSRUFEX1NDT1BFX1NZU1RFTQorICBQVEhSRUFEX1NDT1BFX1BST0NFU1MKKyNkZWZpbmUgUFRIUkVBRF9TQ09QRV9QUk9DRVNTICAgUFRIUkVBRF9TQ09QRV9QUk9DRVNTCit9OworCisKKy8qIFByb2Nlc3Mgc2hhcmVkIG9yIHByaXZhdGUgZmxhZy4gICovCitlbnVtCit7CisgIFBUSFJFQURfUFJPQ0VTU19QUklWQVRFLAorI2RlZmluZSBQVEhSRUFEX1BST0NFU1NfUFJJVkFURSBQVEhSRUFEX1BST0NFU1NfUFJJVkFURQorICBQVEhSRUFEX1BST0NFU1NfU0hBUkVECisjZGVmaW5lIFBUSFJFQURfUFJPQ0VTU19TSEFSRUQgIFBUSFJFQURfUFJPQ0VTU19TSEFSRUQKK307CisKKworCisvKiBDb25kaXRpb25hbCB2YXJpYWJsZSBoYW5kbGluZy4gICovCisjZGVmaW5lIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUiB7IHsgMCwgMCwgMCwgMCwgMCwgKHZvaWQgKikgMCwgMCwgMCB9IH0KKworCisvKiBDbGVhbnVwIGJ1ZmZlcnMgKi8KK3N0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlcgoreworICB2b2lkICgqX19yb3V0aW5lKSAodm9pZCAqKTsgICAgICAgICAgICAgLyogRnVuY3Rpb24gdG8gY2FsbC4gICovCisgIHZvaWQgKl9fYXJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdHMgYXJndW1lbnQuICAqLworICBpbnQgX19jYW5jZWx0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZWQgY2FuY2VsbGF0aW9uIHR5cGUuICovCisgIHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqX19wcmV2OyAvKiBDaGFpbmluZyBvZiBjbGVhbnVwIGZ1bmN0aW9ucy4gICovCit9OworCisvKiBDYW5jZWxsYXRpb24gKi8KK2VudW0KK3sKKyAgUFRIUkVBRF9DQU5DRUxfRU5BQkxFLAorI2RlZmluZSBQVEhSRUFEX0NBTkNFTF9FTkFCTEUgICBQVEhSRUFEX0NBTkNFTF9FTkFCTEUKKyAgUFRIUkVBRF9DQU5DRUxfRElTQUJMRQorI2RlZmluZSBQVEhSRUFEX0NBTkNFTF9ESVNBQkxFICBQVEhSRUFEX0NBTkNFTF9ESVNBQkxFCit9OworZW51bQoreworICBQVEhSRUFEX0NBTkNFTF9ERUZFUlJFRCwKKyNkZWZpbmUgUFRIUkVBRF9DQU5DRUxfREVGRVJSRUQJUFRIUkVBRF9DQU5DRUxfREVGRVJSRUQKKyAgUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTCisjZGVmaW5lIFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUwlQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVMKK307CisjZGVmaW5lIFBUSFJFQURfQ0FOQ0VMRUQgKCh2b2lkICopIC0xKQorCisKKy8qIFNpbmdsZSBleGVjdXRpb24gaGFuZGxpbmcuICAqLworI2RlZmluZSBQVEhSRUFEX09OQ0VfSU5JVCAwCisKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIFZhbHVlIHJldHVybmVkIGJ5ICdwdGhyZWFkX2JhcnJpZXJfd2FpdCcgZm9yIG9uZSBvZiB0aGUgdGhyZWFkcyBhZnRlcgorICAgdGhlIHJlcXVpcmVkIG51bWJlciBvZiB0aHJlYWRzIGhhdmUgY2FsbGVkIHRoaXMgZnVuY3Rpb24uCisgICAtMSBpcyBkaXN0aW5jdCBmcm9tIDAgYW5kIGFsbCBlcnJubyBjb25zdGFudHMgKi8KKyMgZGVmaW5lIFBUSFJFQURfQkFSUklFUl9TRVJJQUxfVEhSRUFEIC0xCisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIENyZWF0ZSBhIG5ldyB0aHJlYWQsIHN0YXJ0aW5nIHdpdGggZXhlY3V0aW9uIG9mIFNUQVJULVJPVVRJTkUKKyAgIGdldHRpbmcgcGFzc2VkIEFSRy4gIENyZWF0aW9uIGF0dHJpYnV0ZWQgY29tZSBmcm9tIEFUVFIuICBUaGUgbmV3CisgICBoYW5kbGUgaXMgc3RvcmVkIGluICpORVdUSFJFQUQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2NyZWF0ZSAocHRocmVhZF90ICpfX3Jlc3RyaWN0IF9fbmV3dGhyZWFkLAorCQkJICAgX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19yZXN0cmljdCBfX2F0dHIsCisJCQkgICB2b2lkICooKl9fc3RhcnRfcm91dGluZSkgKHZvaWQgKiksCisJCQkgICB2b2lkICpfX3Jlc3RyaWN0IF9fYXJnKSBfX1RIUk9XTkwgX19ub25udWxsICgoMSwgMykpOworCisvKiBUZXJtaW5hdGUgY2FsbGluZyB0aHJlYWQuCisKKyAgIFRoZSByZWdpc3RlcmVkIGNsZWFudXAgaGFuZGxlcnMgYXJlIGNhbGxlZCB2aWEgZXhjZXB0aW9uIGhhbmRsaW5nCisgICBzbyB3ZSBjYW5ub3QgbWFyayB0aGlzIGZ1bmN0aW9uIHdpdGggX19USFJPVy4qLworZXh0ZXJuIHZvaWQgcHRocmVhZF9leGl0ICh2b2lkICpfX3JldHZhbCkgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCisvKiBNYWtlIGNhbGxpbmcgdGhyZWFkIHdhaXQgZm9yIHRlcm1pbmF0aW9uIG9mIHRoZSB0aHJlYWQgVEguICBUaGUKKyAgIGV4aXQgc3RhdHVzIG9mIHRoZSB0aHJlYWQgaXMgc3RvcmVkIGluICpUSFJFQURfUkVUVVJOLCBpZiBUSFJFQURfUkVUVVJOCisgICBpcyBub3QgTlVMTC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfam9pbiAocHRocmVhZF90IF9fdGgsIHZvaWQgKipfX3RocmVhZF9yZXR1cm4pOworCisjaWZkZWYgX19VU0VfR05VCisvKiBDaGVjayB3aGV0aGVyIHRocmVhZCBUSCBoYXMgdGVybWluYXRlZC4gIElmIHllcyByZXR1cm4gdGhlIHN0YXR1cyBvZgorICAgdGhlIHRocmVhZCBpbiAqVEhSRUFEX1JFVFVSTiwgaWYgVEhSRUFEX1JFVFVSTiBpcyBub3QgTlVMTC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfdHJ5am9pbl9ucCAocHRocmVhZF90IF9fdGgsIHZvaWQgKipfX3RocmVhZF9yZXR1cm4pIF9fVEhST1c7CisKKy8qIE1ha2UgY2FsbGluZyB0aHJlYWQgd2FpdCBmb3IgdGVybWluYXRpb24gb2YgdGhlIHRocmVhZCBUSCwgYnV0IG9ubHkKKyAgIHVudGlsIFRJTUVPVVQuICBUaGUgZXhpdCBzdGF0dXMgb2YgdGhlIHRocmVhZCBpcyBzdG9yZWQgaW4KKyAgICpUSFJFQURfUkVUVVJOLCBpZiBUSFJFQURfUkVUVVJOIGlzIG5vdCBOVUxMLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF90aW1lZGpvaW5fbnAgKHB0aHJlYWRfdCBfX3RoLCB2b2lkICoqX190aHJlYWRfcmV0dXJuLAorCQkJCSBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19hYnN0aW1lKTsKKyNlbmRpZgorCisvKiBJbmRpY2F0ZSB0aGF0IHRoZSB0aHJlYWQgVEggaXMgbmV2ZXIgdG8gYmUgam9pbmVkIHdpdGggUFRIUkVBRF9KT0lOLgorICAgVGhlIHJlc291cmNlcyBvZiBUSCB3aWxsIHRoZXJlZm9yZSBiZSBmcmVlZCBpbW1lZGlhdGVseSB3aGVuIGl0CisgICB0ZXJtaW5hdGVzLCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkIHRvIHBlcmZvcm0gUFRIUkVBRF9KT0lOCisgICBvbiBpdC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfZGV0YWNoIChwdGhyZWFkX3QgX190aCkgX19USFJPVzsKKworCisvKiBPYnRhaW4gdGhlIGlkZW50aWZpZXIgb2YgdGhlIGN1cnJlbnQgdGhyZWFkLiAgKi8KK2V4dGVybiBwdGhyZWFkX3QgcHRocmVhZF9zZWxmICh2b2lkKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworLyogQ29tcGFyZSB0d28gdGhyZWFkIGlkZW50aWZpZXJzLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9lcXVhbCAocHRocmVhZF90IF9fdGhyZWFkMSwgcHRocmVhZF90IF9fdGhyZWFkMikgX19USFJPVzsKKworCisvKiBUaHJlYWQgYXR0cmlidXRlIGhhbmRsaW5nLiAgKi8KKworLyogSW5pdGlhbGl6ZSB0aHJlYWQgYXR0cmlidXRlICpBVFRSIHdpdGggZGVmYXVsdCBhdHRyaWJ1dGVzCisgICAoZGV0YWNoc3RhdGUgaXMgUFRIUkVBRF9KT0lOQUJMRSwgc2NoZWR1bGluZyBwb2xpY3kgaXMgU0NIRURfT1RIRVIsCisgICAgbm8gdXNlci1wcm92aWRlZCBzdGFjaykuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfaW5pdCAocHRocmVhZF9hdHRyX3QgKl9fYXR0cikgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIERlc3Ryb3kgdGhyZWFkIGF0dHJpYnV0ZSAqQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9kZXN0cm95IChwdGhyZWFkX2F0dHJfdCAqX19hdHRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogR2V0IGRldGFjaCBzdGF0ZSBhdHRyaWJ1dGUuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0ZGV0YWNoc3RhdGUgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKKwkJCQkJaW50ICpfX2RldGFjaHN0YXRlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IGRldGFjaCBzdGF0ZSBhdHRyaWJ1dGUuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCisJCQkJCWludCBfX2RldGFjaHN0YXRlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworCisvKiBHZXQgdGhlIHNpemUgb2YgdGhlIGd1YXJkIGFyZWEgY3JlYXRlZCBmb3Igc3RhY2sgb3ZlcmZsb3cgcHJvdGVjdGlvbi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9nZXRndWFyZHNpemUgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKKwkJCQkgICAgICBzaXplX3QgKl9fZ3VhcmRzaXplKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHRoZSBzaXplIG9mIHRoZSBndWFyZCBhcmVhIGNyZWF0ZWQgZm9yIHN0YWNrIG92ZXJmbG93IHByb3RlY3Rpb24uICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfc2V0Z3VhcmRzaXplIChwdGhyZWFkX2F0dHJfdCAqX19hdHRyLAorCQkJCSAgICAgIHNpemVfdCBfX2d1YXJkc2l6ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKworLyogUmV0dXJuIGluICpQQVJBTSB0aGUgc2NoZWR1bGluZyBwYXJhbWV0ZXJzIG9mICpBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldHNjaGVkcGFyYW0gKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QKKwkJCQkgICAgICAgX19hdHRyLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcmVzdHJpY3QgX19wYXJhbSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgKHByaW9yaXR5LCBldGMpIGluICpBVFRSIGFjY29yZGluZyB0byBQQVJBTS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtIChwdGhyZWFkX2F0dHJfdCAqX19yZXN0cmljdCBfX2F0dHIsCisJCQkJICAgICAgIF9fY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICpfX3Jlc3RyaWN0CisJCQkJICAgICAgIF9fcGFyYW0pIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBSZXR1cm4gaW4gKlBPTElDWSB0aGUgc2NoZWR1bGluZyBwb2xpY3kgb2YgKkFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0c2NoZWRwb2xpY3kgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QKKwkJCQkJX19hdHRyLCBpbnQgKl9fcmVzdHJpY3QgX19wb2xpY3kpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgc2NoZWR1bGluZyBwb2xpY3kgaW4gKkFUVFIgYWNjb3JkaW5nIHRvIFBPTElDWS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgaW50IF9fcG9saWN5KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogUmV0dXJuIGluICpJTkhFUklUIHRoZSBzY2hlZHVsaW5nIGluaGVyaXRhbmNlIG1vZGUgb2YgKkFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0aW5oZXJpdHNjaGVkIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX3Jlc3RyaWN0CisJCQkJCSBfX2F0dHIsIGludCAqX19yZXN0cmljdCBfX2luaGVyaXQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgc2NoZWR1bGluZyBpbmhlcml0YW5jZSBtb2RlIGluICpBVFRSIGFjY29yZGluZyB0byBJTkhFUklULiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldGluaGVyaXRzY2hlZCAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKKwkJCQkJIGludCBfX2luaGVyaXQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisKKy8qIFJldHVybiBpbiAqU0NPUEUgdGhlIHNjaGVkdWxpbmcgY29udGVudGlvbiBzY29wZSBvZiAqQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9nZXRzY29wZSAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19yZXN0cmljdCBfX2F0dHIsCisJCQkJICBpbnQgKl9fcmVzdHJpY3QgX19zY29wZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCBzY2hlZHVsaW5nIGNvbnRlbnRpb24gc2NvcGUgaW4gKkFUVFIgYWNjb3JkaW5nIHRvIFNDT1BFLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldHNjb3BlIChwdGhyZWFkX2F0dHJfdCAqX19hdHRyLCBpbnQgX19zY29wZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJldHVybiB0aGUgcHJldmlvdXNseSBzZXQgYWRkcmVzcyBmb3IgdGhlIHN0YWNrLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldHN0YWNrYWRkciAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19yZXN0cmljdAorCQkJCSAgICAgIF9fYXR0ciwgdm9pZCAqKl9fcmVzdHJpY3QgX19zdGFja2FkZHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKKworLyogU2V0IHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBzdGFjayBvZiB0aGUgdGhyZWFkIHRvIGJlIGNyZWF0ZWQuCisgICBEZXBlbmRpbmcgb24gd2hldGhlciB0aGUgc3RhY2sgZ3Jvd3MgdXAgb3IgZG93biB0aGUgdmFsdWUgbXVzdCBlaXRoZXIKKyAgIGJlIGhpZ2hlciBvciBsb3dlciB0aGFuIGFsbCB0aGUgYWRkcmVzcyBpbiB0aGUgbWVtb3J5IGJsb2NrLiAgVGhlCisgICBtaW5pbWFsIHNpemUgb2YgdGhlIGJsb2NrIG11c3QgYmUgUFRIUkVBRF9TVEFDS19NSU4uICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfc2V0c3RhY2thZGRyIChwdGhyZWFkX2F0dHJfdCAqX19hdHRyLAorCQkJCSAgICAgIHZvaWQgKl9fc3RhY2thZGRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX187CisKKy8qIFJldHVybiB0aGUgY3VycmVudGx5IHVzZWQgbWluaW1hbCBzdGFjayBzaXplLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldHN0YWNrc2l6ZSAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19yZXN0cmljdAorCQkJCSAgICAgIF9fYXR0ciwgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fc3RhY2tzaXplKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogQWRkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtaW5pbXVtIHN0YWNrIHNpemUgbmVlZGVkIGZvciB0aGUgdGhyZWFkCisgICB0byBiZSBzdGFydGVkLiAgVGhpcyBzaXplIG11c3QgbmV2ZXIgYmUgbGVzcyB0aGFuIFBUSFJFQURfU1RBQ0tfTUlOCisgICBhbmQgbXVzdCBhbHNvIG5vdCBleGNlZWQgdGhlIHN5c3RlbSBsaW1pdHMuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplIChwdGhyZWFkX2F0dHJfdCAqX19hdHRyLAorCQkJCSAgICAgIHNpemVfdCBfX3N0YWNrc2l6ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBSZXR1cm4gdGhlIHByZXZpb3VzbHkgc2V0IGFkZHJlc3MgZm9yIHRoZSBzdGFjay4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9nZXRzdGFjayAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19yZXN0cmljdCBfX2F0dHIsCisJCQkJICB2b2lkICoqX19yZXN0cmljdCBfX3N0YWNrYWRkciwKKwkJCQkgIHNpemVfdCAqX19yZXN0cmljdCBfX3N0YWNrc2l6ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyLCAzKSk7CisKKy8qIFRoZSBmb2xsb3dpbmcgdHdvIGludGVyZmFjZXMgYXJlIGludGVuZGVkIHRvIHJlcGxhY2UgdGhlIGxhc3QgdHdvLiAgVGhleQorICAgcmVxdWlyZSBzZXR0aW5nIHRoZSBhZGRyZXNzIGFzIHdlbGwgYXMgdGhlIHNpemUgc2luY2Ugb25seSBzZXR0aW5nIHRoZQorICAgYWRkcmVzcyB3aWxsIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcyBpbXBvc3NpYmxlLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldHN0YWNrIChwdGhyZWFkX2F0dHJfdCAqX19hdHRyLCB2b2lkICpfX3N0YWNrYWRkciwKKwkJCQkgIHNpemVfdCBfX3N0YWNrc2l6ZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhyZWFkIGNyZWF0ZWQgd2l0aCBhdHRyaWJ1dGUgQVRUUiB3aWxsIGJlIGxpbWl0ZWQgdG8gcnVuIG9ubHkgb24KKyAgIHRoZSBwcm9jZXNzb3JzIHJlcHJlc2VudGVkIGluIENQVVNFVC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRhZmZpbml0eV9ucCAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKKwkJCQkJc2l6ZV90IF9fY3B1c2V0c2l6ZSwKKwkJCQkJX19jb25zdCBjcHVfc2V0X3QgKl9fY3B1c2V0KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDMpKTsKKworLyogR2V0IGJpdCBzZXQgaW4gQ1BVU0VUIHJlcHJlc2VudGluZyB0aGUgcHJvY2Vzc29ycyB0aHJlYWRzIGNyZWF0ZWQgd2l0aAorICAgQVRUUiBjYW4gcnVuIG9uLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldGFmZmluaXR5X25wIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCisJCQkJCXNpemVfdCBfX2NwdXNldHNpemUsCisJCQkJCWNwdV9zZXRfdCAqX19jcHVzZXQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMykpOworCisKKy8qIEluaXRpYWxpemUgdGhyZWFkIGF0dHJpYnV0ZSAqQVRUUiB3aXRoIGF0dHJpYnV0ZXMgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgIGFscmVhZHkgcnVubmluZyB0aHJlYWQgVEguICBJdCBzaGFsbCBiZSBjYWxsZWQgb24gdW5pbml0aWFsaXplZCBBVFRSCisgICBhbmQgZGVzdHJveWVkIHdpdGggcHRocmVhZF9hdHRyX2Rlc3Ryb3kgd2hlbiBubyBsb25nZXIgbmVlZGVkLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9nZXRhdHRyX25wIChwdGhyZWFkX3QgX190aCwgcHRocmVhZF9hdHRyX3QgKl9fYXR0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworCisvKiBGdW5jdGlvbnMgZm9yIHNjaGVkdWxpbmcgY29udHJvbC4gICovCisKKy8qIFNldCB0aGUgc2NoZWR1bGluZyBwYXJhbWV0ZXJzIGZvciBUQVJHRVRfVEhSRUFEIGFjY29yZGluZyB0byBQT0xJQ1kKKyAgIGFuZCAqUEFSQU0uICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NldHNjaGVkcGFyYW0gKHB0aHJlYWRfdCBfX3RhcmdldF90aHJlYWQsIGludCBfX3BvbGljeSwKKwkJCQkgIF9fY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICpfX3BhcmFtKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDMpKTsKKworLyogUmV0dXJuIGluICpQT0xJQ1kgYW5kICpQQVJBTSB0aGUgc2NoZWR1bGluZyBwYXJhbWV0ZXJzIGZvciBUQVJHRVRfVEhSRUFELiAqLworZXh0ZXJuIGludCBwdGhyZWFkX2dldHNjaGVkcGFyYW0gKHB0aHJlYWRfdCBfX3RhcmdldF90aHJlYWQsCisJCQkJICBpbnQgKl9fcmVzdHJpY3QgX19wb2xpY3ksCisJCQkJICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcmVzdHJpY3QgX19wYXJhbSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCAzKSk7CisKKy8qIFNldCB0aGUgc2NoZWR1bGluZyBwcmlvcml0eSBmb3IgVEFSR0VUX1RIUkVBRC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc2V0c2NoZWRwcmlvIChwdGhyZWFkX3QgX190YXJnZXRfdGhyZWFkLCBpbnQgX19wcmlvKQorICAgICBfX1RIUk9XOworCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEdldCB0aHJlYWQgbmFtZSB2aXNpYmxlIGluIHRoZSBrZXJuZWwgYW5kIGl0cyBpbnRlcmZhY2VzLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9nZXRuYW1lX25wIChwdGhyZWFkX3QgX190YXJnZXRfdGhyZWFkLCBjaGFyICpfX2J1ZiwKKwkJCSAgICAgICBzaXplX3QgX19idWZsZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworCisvKiBTZXQgdGhyZWFkIG5hbWUgdmlzaWJsZSBpbiB0aGUga2VybmVsIGFuZCBpdHMgaW50ZXJmYWNlcy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc2V0bmFtZV9ucCAocHRocmVhZF90IF9fdGFyZ2V0X3RocmVhZCwgX19jb25zdCBjaGFyICpfX25hbWUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX1VOSVg5OAorLyogRGV0ZXJtaW5lIGxldmVsIG9mIGNvbmN1cnJlbmN5LiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9nZXRjb25jdXJyZW5jeSAodm9pZCkgX19USFJPVzsKKworLyogU2V0IG5ldyBjb25jdXJyZW5jeSBsZXZlbCB0byBMRVZFTC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc2V0Y29uY3VycmVuY3kgKGludCBfX2xldmVsKSBfX1RIUk9XOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFlpZWxkIHRoZSBwcm9jZXNzb3IgdG8gYW5vdGhlciB0aHJlYWQgb3IgcHJvY2Vzcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgUE9TSVggYHNjaGVkX3lpZWxkJyBmdW5jdGlvbiBidXQKKyAgIG1pZ2h0IGJlIGRpZmZlcmVudGx5IGltcGxlbWVudGVkIGluIHRoZSBjYXNlIG9mIGEgbS1vbi1uIHRocmVhZAorICAgaW1wbGVtZW50YXRpb24uICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3lpZWxkICh2b2lkKSBfX1RIUk9XOworCisKKy8qIExpbWl0IHNwZWNpZmllZCB0aHJlYWQgVEggdG8gcnVuIG9ubHkgb24gdGhlIHByb2Nlc3NvcnMgcmVwcmVzZW50ZWQKKyAgIGluIENQVVNFVC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc2V0YWZmaW5pdHlfbnAgKHB0aHJlYWRfdCBfX3RoLCBzaXplX3QgX19jcHVzZXRzaXplLAorCQkJCSAgIF9fY29uc3QgY3B1X3NldF90ICpfX2NwdXNldCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzKSk7CisKKy8qIEdldCBiaXQgc2V0IGluIENQVVNFVCByZXByZXNlbnRpbmcgdGhlIHByb2Nlc3NvcnMgVEggY2FuIHJ1biBvbi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfZ2V0YWZmaW5pdHlfbnAgKHB0aHJlYWRfdCBfX3RoLCBzaXplX3QgX19jcHVzZXRzaXplLAorCQkJCSAgIGNwdV9zZXRfdCAqX19jcHVzZXQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMykpOworI2VuZGlmCisKKworLyogRnVuY3Rpb25zIGZvciBoYW5kbGluZyBpbml0aWFsaXphdGlvbi4gICovCisKKy8qIEd1YXJhbnRlZSB0aGF0IHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBJTklUX1JPVVRJTkUgd2lsbCBiZSBjYWxsZWQKKyAgIG9ubHkgb25jZSwgZXZlbiBpZiBwdGhyZWFkX29uY2UgaXMgZXhlY3V0ZWQgc2V2ZXJhbCB0aW1lcyB3aXRoIHRoZQorICAgc2FtZSBPTkNFX0NPTlRST0wgYXJndW1lbnQuIE9OQ0VfQ09OVFJPTCBtdXN0IHBvaW50IHRvIGEgc3RhdGljIG9yCisgICBleHRlcm4gdmFyaWFibGUgaW5pdGlhbGl6ZWQgdG8gUFRIUkVBRF9PTkNFX0lOSVQuCisKKyAgIFRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgbWlnaHQgdGhyb3cgZXhjZXB0aW9uIHdoaWNoIGlzIHdoeQorICAgdGhpcyBmdW5jdGlvbiBpcyBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfb25jZSAocHRocmVhZF9vbmNlX3QgKl9fb25jZV9jb250cm9sLAorCQkJIHZvaWQgKCpfX2luaXRfcm91dGluZSkgKHZvaWQpKSBfX25vbm51bGwgKCgxLCAyKSk7CisKKworLyogRnVuY3Rpb25zIGZvciBoYW5kbGluZyBjYW5jZWxsYXRpb24uCisKKyAgIE5vdGUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIGV4cGxpY2l0bHkgbm90IG1hcmtlZCB0byBub3QgdGhyb3cgYW4KKyAgIGV4Y2VwdGlvbiBpbiBDKysgY29kZS4gIElmIGNhbmNlbGxhdGlvbiBpcyBpbXBsZW1lbnRlZCBieSB1bndpbmRpbmcKKyAgIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGhhdmUgdGhlIGNvbXBpbGVyIGdlbmVyYXRlIHRoZSB1bndpbmQgaW5mb3JtYXRpb24uICAqLworCisvKiBTZXQgY2FuY2VsYWJpbGl0eSBzdGF0ZSBvZiBjdXJyZW50IHRocmVhZCB0byBTVEFURSwgcmV0dXJuaW5nIG9sZAorICAgc3RhdGUgaW4gKk9MRFNUQVRFIGlmIE9MRFNUQVRFIGlzIG5vdCBOVUxMLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSAoaW50IF9fc3RhdGUsIGludCAqX19vbGRzdGF0ZSk7CisKKy8qIFNldCBjYW5jZWxsYXRpb24gc3RhdGUgb2YgY3VycmVudCB0aHJlYWQgdG8gVFlQRSwgcmV0dXJuaW5nIHRoZSBvbGQKKyAgIHR5cGUgaW4gKk9MRFRZUEUgaWYgT0xEVFlQRSBpcyBub3QgTlVMTC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSAoaW50IF9fdHlwZSwgaW50ICpfX29sZHR5cGUpOworCisvKiBDYW5jZWwgVEhSRUFEIGltbWVkaWF0ZWx5IG9yIGF0IHRoZSBuZXh0IHBvc3NpYmlsaXR5LiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9jYW5jZWwgKHB0aHJlYWRfdCBfX3RoKTsKKworLyogVGVzdCBmb3IgcGVuZGluZyBjYW5jZWxsYXRpb24gZm9yIHRoZSBjdXJyZW50IHRocmVhZCBhbmQgdGVybWluYXRlCisgICB0aGUgdGhyZWFkIGFzIHBlciBwdGhyZWFkX2V4aXQoUFRIUkVBRF9DQU5DRUxFRCkgaWYgaXQgaGFzIGJlZW4KKyAgIGNhbmNlbGxlZC4gICovCitleHRlcm4gdm9pZCBwdGhyZWFkX3Rlc3RjYW5jZWwgKHZvaWQpOworCisKKy8qIENhbmNlbGxhdGlvbiBoYW5kbGluZyB3aXRoIGludGVncmF0aW9uIGludG8gZXhjZXB0aW9uIGhhbmRsaW5nLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgc3RydWN0CisgIHsKKyAgICBfX2ptcF9idWYgX19jYW5jZWxfam1wX2J1ZjsKKyAgICBpbnQgX19tYXNrX3dhc19zYXZlZDsKKyAgfSBfX2NhbmNlbF9qbXBfYnVmWzFdOworICB2b2lkICpfX3BhZFs0XTsKK30gX19wdGhyZWFkX3Vud2luZF9idWZfdCBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18pKTsKKworLyogTm8gc3BlY2lhbCBhdHRyaWJ1dGVzIGJ5IGRlZmF1bHQuICAqLworI2lmbmRlZiBfX2NsZWFudXBfZmN0X2F0dHJpYnV0ZQorIyBkZWZpbmUgX19jbGVhbnVwX2ZjdF9hdHRyaWJ1dGUKKyNlbmRpZgorCisKKy8qIFN0cnVjdHVyZSB0byBob2xkIHRoZSBjbGVhbnVwIGhhbmRsZXIgaW5mb3JtYXRpb24uICAqLworc3RydWN0IF9fcHRocmVhZF9jbGVhbnVwX2ZyYW1lCit7CisgIHZvaWQgKCpfX2NhbmNlbF9yb3V0aW5lKSAodm9pZCAqKTsKKyAgdm9pZCAqX19jYW5jZWxfYXJnOworICBpbnQgX19kb19pdDsKKyAgaW50IF9fY2FuY2VsX3R5cGU7Cit9OworCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBkZWZpbmVkIF9fRVhDRVBUSU9OUworIyBpZmRlZiBfX2NwbHVzcGx1cworLyogQ2xhc3MgdG8gaGFuZGxlIGNhbmNlbGxhdGlvbiBoYW5kbGVyIGludm9jYXRpb24uICAqLworY2xhc3MgX19wdGhyZWFkX2NsZWFudXBfY2xhc3MKK3sKKyAgdm9pZCAoKl9fY2FuY2VsX3JvdXRpbmUpICh2b2lkICopOworICB2b2lkICpfX2NhbmNlbF9hcmc7CisgIGludCBfX2RvX2l0OworICBpbnQgX19jYW5jZWxfdHlwZTsKKworIHB1YmxpYzoKKyAgX19wdGhyZWFkX2NsZWFudXBfY2xhc3MgKHZvaWQgKCpfX2ZjdCkgKHZvaWQgKiksIHZvaWQgKl9fYXJnKQorICAgIDogX19jYW5jZWxfcm91dGluZSAoX19mY3QpLCBfX2NhbmNlbF9hcmcgKF9fYXJnKSwgX19kb19pdCAoMSkgeyB9CisgIH5fX3B0aHJlYWRfY2xlYW51cF9jbGFzcyAoKSB7IGlmIChfX2RvX2l0KSBfX2NhbmNlbF9yb3V0aW5lIChfX2NhbmNlbF9hcmcpOyB9CisgIHZvaWQgX19zZXRkb2l0IChpbnQgX19uZXd2YWwpIHsgX19kb19pdCA9IF9fbmV3dmFsOyB9CisgIHZvaWQgX19kZWZlciAoKSB7IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSAoUFRIUkVBRF9DQU5DRUxfREVGRVJSRUQsCisJCQkJCSAgICZfX2NhbmNlbF90eXBlKTsgfQorICB2b2lkIF9fcmVzdG9yZSAoKSBjb25zdCB7IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSAoX19jYW5jZWxfdHlwZSwgMCk7IH0KK307CisKKy8qIEluc3RhbGwgYSBjbGVhbnVwIGhhbmRsZXI6IFJPVVRJTkUgd2lsbCBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgQVJHCisgICB3aGVuIHRoZSB0aHJlYWQgaXMgY2FuY2VsZWQgb3IgY2FsbHMgcHRocmVhZF9leGl0LiAgUk9VVElORSB3aWxsIGFsc28KKyAgIGJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50cyBBUkcgd2hlbiB0aGUgbWF0Y2hpbmcgcHRocmVhZF9jbGVhbnVwX3BvcAorICAgaXMgZXhlY3V0ZWQgd2l0aCBub24temVybyBFWEVDVVRFIGFyZ3VtZW50LgorCisgICBwdGhyZWFkX2NsZWFudXBfcHVzaCBhbmQgcHRocmVhZF9jbGVhbnVwX3BvcCBhcmUgbWFjcm9zIGFuZCBtdXN0IGFsd2F5cworICAgYmUgdXNlZCBpbiBtYXRjaGluZyBwYWlycyBhdCB0aGUgc2FtZSBuZXN0aW5nIGxldmVsIG9mIGJyYWNlcy4gICovCisjICBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3B1c2gocm91dGluZSwgYXJnKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgX19wdGhyZWFkX2NsZWFudXBfY2xhc3MgX19jbGZyYW1lIChyb3V0aW5lLCBhcmcpCisKKy8qIFJlbW92ZSBhIGNsZWFudXAgaGFuZGxlciBpbnN0YWxsZWQgYnkgdGhlIG1hdGNoaW5nIHB0aHJlYWRfY2xlYW51cF9wdXNoLgorICAgSWYgRVhFQ1VURSBpcyBub24temVybywgdGhlIGhhbmRsZXIgZnVuY3Rpb24gaXMgY2FsbGVkLiAqLworIyAgZGVmaW5lIHB0aHJlYWRfY2xlYW51cF9wb3AoZXhlY3V0ZSkgXAorICAgIF9fY2xmcmFtZS5fX3NldGRvaXQgKGV4ZWN1dGUpOwkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisjICBpZmRlZiBfX1VTRV9HTlUKKy8qIEluc3RhbGwgYSBjbGVhbnVwIGhhbmRsZXIgYXMgcHRocmVhZF9jbGVhbnVwX3B1c2ggZG9lcywgYnV0IGFsc28KKyAgIHNhdmVzIHRoZSBjdXJyZW50IGNhbmNlbGxhdGlvbiB0eXBlIGFuZCBzZXRzIGl0IHRvIGRlZmVycmVkCisgICBjYW5jZWxsYXRpb24uICAqLworIyAgIGRlZmluZSBwdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcl9ucChyb3V0aW5lLCBhcmcpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBfX3B0aHJlYWRfY2xlYW51cF9jbGFzcyBfX2NsZnJhbWUgKHJvdXRpbmUsIGFyZyk7CQkJICAgICAgXAorICAgIF9fY2xmcmFtZS5fX2RlZmVyICgpCisKKy8qIFJlbW92ZSBhIGNsZWFudXAgaGFuZGxlciBhcyBwdGhyZWFkX2NsZWFudXBfcG9wIGRvZXMsIGJ1dCBhbHNvCisgICByZXN0b3JlcyB0aGUgY2FuY2VsbGF0aW9uIHR5cGUgdGhhdCB3YXMgaW4gZWZmZWN0IHdoZW4gdGhlIG1hdGNoaW5nCisgICBwdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlciB3YXMgY2FsbGVkLiAgKi8KKyMgICBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlX25wKGV4ZWN1dGUpIFwKKyAgICBfX2NsZnJhbWUuX19yZXN0b3JlICgpOwkJCQkJCSAgICAgIFwKKyAgICBfX2NsZnJhbWUuX19zZXRkb2l0IChleGVjdXRlKTsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgIGVuZGlmCisjIGVsc2UKKy8qIEZ1bmN0aW9uIGNhbGxlZCB0byBjYWxsIHRoZSBjbGVhbnVwIGhhbmRsZXIuICBBcyBhbiBleHRlcm4gaW5saW5lCisgICBmdW5jdGlvbiB0aGUgY29tcGlsZXIgaXMgZnJlZSB0byBkZWNpZGUgaW5saW5pbmcgdGhlIGNoYW5nZSB3aGVuCisgICBuZWVkZWQgb3IgZmFsbCBiYWNrIG9uIHRoZSBjb3B5IHdoaWNoIG11c3QgZXhpc3Qgc29tZXdoZXJlCisgICBlbHNlLiAgKi8KK19fZXh0ZXJuX2lubGluZSB2b2lkCitfX3B0aHJlYWRfY2xlYW51cF9yb3V0aW5lIChzdHJ1Y3QgX19wdGhyZWFkX2NsZWFudXBfZnJhbWUgKl9fZnJhbWUpCit7CisgIGlmIChfX2ZyYW1lLT5fX2RvX2l0KQorICAgIF9fZnJhbWUtPl9fY2FuY2VsX3JvdXRpbmUgKF9fZnJhbWUtPl9fY2FuY2VsX2FyZyk7Cit9CisKKy8qIEluc3RhbGwgYSBjbGVhbnVwIGhhbmRsZXI6IFJPVVRJTkUgd2lsbCBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgQVJHCisgICB3aGVuIHRoZSB0aHJlYWQgaXMgY2FuY2VsZWQgb3IgY2FsbHMgcHRocmVhZF9leGl0LiAgUk9VVElORSB3aWxsIGFsc28KKyAgIGJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50cyBBUkcgd2hlbiB0aGUgbWF0Y2hpbmcgcHRocmVhZF9jbGVhbnVwX3BvcAorICAgaXMgZXhlY3V0ZWQgd2l0aCBub24temVybyBFWEVDVVRFIGFyZ3VtZW50LgorCisgICBwdGhyZWFkX2NsZWFudXBfcHVzaCBhbmQgcHRocmVhZF9jbGVhbnVwX3BvcCBhcmUgbWFjcm9zIGFuZCBtdXN0IGFsd2F5cworICAgYmUgdXNlZCBpbiBtYXRjaGluZyBwYWlycyBhdCB0aGUgc2FtZSBuZXN0aW5nIGxldmVsIG9mIGJyYWNlcy4gICovCisjICBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3B1c2gocm91dGluZSwgYXJnKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgc3RydWN0IF9fcHRocmVhZF9jbGVhbnVwX2ZyYW1lIF9fY2xmcmFtZQkJCQkgICAgICBcCisgICAgICBfX2F0dHJpYnV0ZV9fICgoX19jbGVhbnVwX18gKF9fcHRocmVhZF9jbGVhbnVwX3JvdXRpbmUpKSkJCSAgICAgIFwKKyAgICAgID0geyAuX19jYW5jZWxfcm91dGluZSA9IChyb3V0aW5lKSwgLl9fY2FuY2VsX2FyZyA9IChhcmcpLAkgCSAgICAgIFwKKwkgIC5fX2RvX2l0ID0gMSB9OworCisvKiBSZW1vdmUgYSBjbGVhbnVwIGhhbmRsZXIgaW5zdGFsbGVkIGJ5IHRoZSBtYXRjaGluZyBwdGhyZWFkX2NsZWFudXBfcHVzaC4KKyAgIElmIEVYRUNVVEUgaXMgbm9uLXplcm8sIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGlzIGNhbGxlZC4gKi8KKyMgIGRlZmluZSBwdGhyZWFkX2NsZWFudXBfcG9wKGV4ZWN1dGUpIFwKKyAgICBfX2NsZnJhbWUuX19kb19pdCA9IChleGVjdXRlKTsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworIyAgaWZkZWYgX19VU0VfR05VCisvKiBJbnN0YWxsIGEgY2xlYW51cCBoYW5kbGVyIGFzIHB0aHJlYWRfY2xlYW51cF9wdXNoIGRvZXMsIGJ1dCBhbHNvCisgICBzYXZlcyB0aGUgY3VycmVudCBjYW5jZWxsYXRpb24gdHlwZSBhbmQgc2V0cyBpdCB0byBkZWZlcnJlZAorICAgY2FuY2VsbGF0aW9uLiAgKi8KKyMgICBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXJfbnAocm91dGluZSwgYXJnKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgc3RydWN0IF9fcHRocmVhZF9jbGVhbnVwX2ZyYW1lIF9fY2xmcmFtZQkJCQkgICAgICBcCisgICAgICBfX2F0dHJpYnV0ZV9fICgoX19jbGVhbnVwX18gKF9fcHRocmVhZF9jbGVhbnVwX3JvdXRpbmUpKSkJCSAgICAgIFwKKyAgICAgID0geyAuX19jYW5jZWxfcm91dGluZSA9IChyb3V0aW5lKSwgLl9fY2FuY2VsX2FyZyA9IChhcmcpLAkJICAgICAgXAorCSAgLl9fZG9faXQgPSAxIH07CQkJCQkJICAgICAgXAorICAgICh2b2lkKSBwdGhyZWFkX3NldGNhbmNlbHR5cGUgKFBUSFJFQURfQ0FOQ0VMX0RFRkVSUkVELAkJICAgICAgXAorCQkJCSAgJl9fY2xmcmFtZS5fX2NhbmNlbF90eXBlKQorCisvKiBSZW1vdmUgYSBjbGVhbnVwIGhhbmRsZXIgYXMgcHRocmVhZF9jbGVhbnVwX3BvcCBkb2VzLCBidXQgYWxzbworICAgcmVzdG9yZXMgdGhlIGNhbmNlbGxhdGlvbiB0eXBlIHRoYXQgd2FzIGluIGVmZmVjdCB3aGVuIHRoZSBtYXRjaGluZworICAgcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIgd2FzIGNhbGxlZC4gICovCisjICAgZGVmaW5lIHB0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZV9ucChleGVjdXRlKSBcCisgICAgKHZvaWQpIHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSAoX19jbGZyYW1lLl9fY2FuY2VsX3R5cGUsIE5VTEwpOwkgICAgICBcCisgICAgX19jbGZyYW1lLl9fZG9faXQgPSAoZXhlY3V0ZSk7CQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjICBlbmRpZgorIyBlbmRpZgorI2Vsc2UKKy8qIEluc3RhbGwgYSBjbGVhbnVwIGhhbmRsZXI6IFJPVVRJTkUgd2lsbCBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgQVJHCisgICB3aGVuIHRoZSB0aHJlYWQgaXMgY2FuY2VsZWQgb3IgY2FsbHMgcHRocmVhZF9leGl0LiAgUk9VVElORSB3aWxsIGFsc28KKyAgIGJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50cyBBUkcgd2hlbiB0aGUgbWF0Y2hpbmcgcHRocmVhZF9jbGVhbnVwX3BvcAorICAgaXMgZXhlY3V0ZWQgd2l0aCBub24temVybyBFWEVDVVRFIGFyZ3VtZW50LgorCisgICBwdGhyZWFkX2NsZWFudXBfcHVzaCBhbmQgcHRocmVhZF9jbGVhbnVwX3BvcCBhcmUgbWFjcm9zIGFuZCBtdXN0IGFsd2F5cworICAgYmUgdXNlZCBpbiBtYXRjaGluZyBwYWlycyBhdCB0aGUgc2FtZSBuZXN0aW5nIGxldmVsIG9mIGJyYWNlcy4gICovCisjIGRlZmluZSBwdGhyZWFkX2NsZWFudXBfcHVzaChyb3V0aW5lLCBhcmcpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBfX3B0aHJlYWRfdW53aW5kX2J1Zl90IF9fY2FuY2VsX2J1ZjsJCQkJICAgICAgXAorICAgIHZvaWQgKCpfX2NhbmNlbF9yb3V0aW5lKSAodm9pZCAqKSA9IChyb3V0aW5lKTsJCQkgICAgICBcCisgICAgdm9pZCAqX19jYW5jZWxfYXJnID0gKGFyZyk7CQkJCQkJICAgICAgXAorICAgIGludCBfX25vdF9maXJzdF9jYWxsID0gX19zaWdzZXRqbXAgKChzdHJ1Y3QgX19qbXBfYnVmX3RhZyAqKSAodm9pZCAqKSAgICAgXAorCQkJCQlfX2NhbmNlbF9idWYuX19jYW5jZWxfam1wX2J1ZiwgMCk7ICAgIFwKKyAgICBpZiAoX19idWlsdGluX2V4cGVjdCAoX19ub3RfZmlyc3RfY2FsbCwgMCkpCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJX19jYW5jZWxfcm91dGluZSAoX19jYW5jZWxfYXJnKTsJCQkJICAgICAgXAorCV9fcHRocmVhZF91bndpbmRfbmV4dCAoJl9fY2FuY2VsX2J1Zik7CQkJCSAgICAgIFwKKwkvKiBOT1RSRUFDSEVEICovCQkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICBfX3B0aHJlYWRfcmVnaXN0ZXJfY2FuY2VsICgmX19jYW5jZWxfYnVmKTsJCQkJICAgICAgXAorICAgIGRvIHsKK2V4dGVybiB2b2lkIF9fcHRocmVhZF9yZWdpc3Rlcl9jYW5jZWwgKF9fcHRocmVhZF91bndpbmRfYnVmX3QgKl9fYnVmKQorICAgICBfX2NsZWFudXBfZmN0X2F0dHJpYnV0ZTsKKworLyogUmVtb3ZlIGEgY2xlYW51cCBoYW5kbGVyIGluc3RhbGxlZCBieSB0aGUgbWF0Y2hpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2guCisgICBJZiBFWEVDVVRFIGlzIG5vbi16ZXJvLCB0aGUgaGFuZGxlciBmdW5jdGlvbiBpcyBjYWxsZWQuICovCisjIGRlZmluZSBwdGhyZWFkX2NsZWFudXBfcG9wKGV4ZWN1dGUpIFwKKyAgICAgIGRvIHsgfSB3aGlsZSAoMCk7LyogRW1wdHkgdG8gYWxsb3cgbGFiZWwgYmVmb3JlIHB0aHJlYWRfY2xlYW51cF9wb3AuICAqL1wKKyAgICB9IHdoaWxlICgwKTsJCQkJCQkJICAgICAgXAorICAgIF9fcHRocmVhZF91bnJlZ2lzdGVyX2NhbmNlbCAoJl9fY2FuY2VsX2J1Zik7CQkJICAgICAgXAorICAgIGlmIChleGVjdXRlKQkJCQkJCQkgICAgICBcCisgICAgICBfX2NhbmNlbF9yb3V0aW5lIChfX2NhbmNlbF9hcmcpOwkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorZXh0ZXJuIHZvaWQgX19wdGhyZWFkX3VucmVnaXN0ZXJfY2FuY2VsIChfX3B0aHJlYWRfdW53aW5kX2J1Zl90ICpfX2J1ZikKKyAgX19jbGVhbnVwX2ZjdF9hdHRyaWJ1dGU7CisKKyMgaWZkZWYgX19VU0VfR05VCisvKiBJbnN0YWxsIGEgY2xlYW51cCBoYW5kbGVyIGFzIHB0aHJlYWRfY2xlYW51cF9wdXNoIGRvZXMsIGJ1dCBhbHNvCisgICBzYXZlcyB0aGUgY3VycmVudCBjYW5jZWxsYXRpb24gdHlwZSBhbmQgc2V0cyBpdCB0byBkZWZlcnJlZAorICAgY2FuY2VsbGF0aW9uLiAgKi8KKyMgIGRlZmluZSBwdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcl9ucChyb3V0aW5lLCBhcmcpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBfX3B0aHJlYWRfdW53aW5kX2J1Zl90IF9fY2FuY2VsX2J1ZjsJCQkJICAgICAgXAorICAgIHZvaWQgKCpfX2NhbmNlbF9yb3V0aW5lKSAodm9pZCAqKSA9IChyb3V0aW5lKTsJCQkgICAgICBcCisgICAgdm9pZCAqX19jYW5jZWxfYXJnID0gKGFyZyk7CQkJCQkJICAgICAgXAorICAgIGludCBfX25vdF9maXJzdF9jYWxsID0gX19zaWdzZXRqbXAgKChzdHJ1Y3QgX19qbXBfYnVmX3RhZyAqKSAodm9pZCAqKSAgICAgXAorCQkJCQlfX2NhbmNlbF9idWYuX19jYW5jZWxfam1wX2J1ZiwgMCk7ICAgIFwKKyAgICBpZiAoX19idWlsdGluX2V4cGVjdCAoX19ub3RfZmlyc3RfY2FsbCwgMCkpCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJX19jYW5jZWxfcm91dGluZSAoX19jYW5jZWxfYXJnKTsJCQkJICAgICAgXAorCV9fcHRocmVhZF91bndpbmRfbmV4dCAoJl9fY2FuY2VsX2J1Zik7CQkJCSAgICAgIFwKKwkvKiBOT1RSRUFDSEVEICovCQkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICBfX3B0aHJlYWRfcmVnaXN0ZXJfY2FuY2VsX2RlZmVyICgmX19jYW5jZWxfYnVmKTsJCQkgICAgICBcCisgICAgZG8geworZXh0ZXJuIHZvaWQgX19wdGhyZWFkX3JlZ2lzdGVyX2NhbmNlbF9kZWZlciAoX19wdGhyZWFkX3Vud2luZF9idWZfdCAqX19idWYpCisgICAgIF9fY2xlYW51cF9mY3RfYXR0cmlidXRlOworCisvKiBSZW1vdmUgYSBjbGVhbnVwIGhhbmRsZXIgYXMgcHRocmVhZF9jbGVhbnVwX3BvcCBkb2VzLCBidXQgYWxzbworICAgcmVzdG9yZXMgdGhlIGNhbmNlbGxhdGlvbiB0eXBlIHRoYXQgd2FzIGluIGVmZmVjdCB3aGVuIHRoZSBtYXRjaGluZworICAgcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIgd2FzIGNhbGxlZC4gICovCisjICBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlX25wKGV4ZWN1dGUpIFwKKyAgICAgIGRvIHsgfSB3aGlsZSAoMCk7LyogRW1wdHkgdG8gYWxsb3cgbGFiZWwgYmVmb3JlIHB0aHJlYWRfY2xlYW51cF9wb3AuICAqL1wKKyAgICB9IHdoaWxlICgwKTsJCQkJCQkJICAgICAgXAorICAgIF9fcHRocmVhZF91bnJlZ2lzdGVyX2NhbmNlbF9yZXN0b3JlICgmX19jYW5jZWxfYnVmKTsJCSAgICAgIFwKKyAgICBpZiAoZXhlY3V0ZSkJCQkJCQkJICAgICAgXAorICAgICAgX19jYW5jZWxfcm91dGluZSAoX19jYW5jZWxfYXJnKTsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKK2V4dGVybiB2b2lkIF9fcHRocmVhZF91bnJlZ2lzdGVyX2NhbmNlbF9yZXN0b3JlIChfX3B0aHJlYWRfdW53aW5kX2J1Zl90ICpfX2J1ZikKKyAgX19jbGVhbnVwX2ZjdF9hdHRyaWJ1dGU7CisjIGVuZGlmCisKKy8qIEludGVybmFsIGludGVyZmFjZSB0byBpbml0aWF0ZSBjbGVhbnVwLiAgKi8KK2V4dGVybiB2b2lkIF9fcHRocmVhZF91bndpbmRfbmV4dCAoX19wdGhyZWFkX3Vud2luZF9idWZfdCAqX19idWYpCisgICAgIF9fY2xlYW51cF9mY3RfYXR0cmlidXRlIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKQorIyBpZm5kZWYgU0hBUkVECisgICAgIF9fYXR0cmlidXRlX18gKChfX3dlYWtfXykpCisjIGVuZGlmCisgICAgIDsKKyNlbmRpZgorCisvKiBGdW5jdGlvbiB1c2VkIGluIHRoZSBtYWNyb3MuICAqLworc3RydWN0IF9fam1wX2J1Zl90YWc7CitleHRlcm4gaW50IF9fc2lnc2V0am1wIChzdHJ1Y3QgX19qbXBfYnVmX3RhZyAqX19lbnYsIGludCBfX3NhdmVtYXNrKSBfX1RIUk9XOworCisKKy8qIE11dGV4IGhhbmRsaW5nLiAgKi8KKworLyogSW5pdGlhbGl6ZSBhIG11dGV4LiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleF9pbml0IChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkgICAgICAgX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICpfX211dGV4YXR0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIERlc3Ryb3kgYSBtdXRleC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAocHRocmVhZF9tdXRleF90ICpfX211dGV4KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogVHJ5IGxvY2tpbmcgYSBtdXRleC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jayAocHRocmVhZF9tdXRleF90ICpfX211dGV4KQorICAgICBfX1RIUk9XTkwgX19ub25udWxsICgoMSkpOworCisvKiBMb2NrIGEgbXV0ZXguICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X2xvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKKyAgICAgX19USFJPV05MIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIFdhaXQgdW50aWwgbG9jayBiZWNvbWVzIGF2YWlsYWJsZSwgb3Igc3BlY2lmaWVkIHRpbWUgcGFzc2VzLiAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X3RpbWVkbG9jayAocHRocmVhZF9tdXRleF90ICpfX3Jlc3RyaWN0IF9fbXV0ZXgsCisJCQkJICAgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3Jlc3RyaWN0CisJCQkJICAgIF9fYWJzdGltZSkgX19USFJPV05MIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZgorCisvKiBVbmxvY2sgYSBtdXRleC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfdW5sb2NrIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCisgICAgIF9fVEhST1dOTCBfX25vbm51bGwgKCgxKSk7CisKKworLyogR2V0IHRoZSBwcmlvcml0eSBjZWlsaW5nIG9mIE1VVEVYLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleF9nZXRwcmlvY2VpbGluZyAoX19jb25zdCBwdGhyZWFkX211dGV4X3QgKgorCQkJCQkgX19yZXN0cmljdCBfX211dGV4LAorCQkJCQkgaW50ICpfX3Jlc3RyaWN0IF9fcHJpb2NlaWxpbmcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgdGhlIHByaW9yaXR5IGNlaWxpbmcgb2YgTVVURVggdG8gUFJJT0NFSUxJTkcsIHJldHVybiBvbGQKKyAgIHByaW9yaXR5IGNlaWxpbmcgdmFsdWUgaW4gKk9MRF9DRUlMSU5HLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleF9zZXRwcmlvY2VpbGluZyAocHRocmVhZF9tdXRleF90ICpfX3Jlc3RyaWN0IF9fbXV0ZXgsCisJCQkJCSBpbnQgX19wcmlvY2VpbGluZywKKwkJCQkJIGludCAqX19yZXN0cmljdCBfX29sZF9jZWlsaW5nKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDMpKTsKKworCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKy8qIERlY2xhcmUgdGhlIHN0YXRlIHByb3RlY3RlZCBieSBNVVRFWCBhcyBjb25zaXN0ZW50LiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleF9jb25zaXN0ZW50IChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworIyBpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleF9jb25zaXN0ZW50X25wIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworIyBlbmRpZgorI2VuZGlmCisKKworLyogRnVuY3Rpb25zIGZvciBoYW5kbGluZyBtdXRleCBhdHRyaWJ1dGVzLiAgKi8KKworLyogSW5pdGlhbGl6ZSBtdXRleCBhdHRyaWJ1dGUgb2JqZWN0IEFUVFIgd2l0aCBkZWZhdWx0IGF0dHJpYnV0ZXMKKyAgIChraW5kIGlzIFBUSFJFQURfTVVURVhfVElNRURfTlApLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfaW5pdCAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRGVzdHJveSBtdXRleCBhdHRyaWJ1dGUgb2JqZWN0IEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95IChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBHZXQgdGhlIHByb2Nlc3Mtc2hhcmVkIGZsYWcgb2YgdGhlIG11dGV4IGF0dHJpYnV0ZSBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfZ2V0cHNoYXJlZCAoX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICoKKwkJCQkJIF9fcmVzdHJpY3QgX19hdHRyLAorCQkJCQkgaW50ICpfX3Jlc3RyaWN0IF9fcHNoYXJlZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCB0aGUgcHJvY2Vzcy1zaGFyZWQgZmxhZyBvZiB0aGUgbXV0ZXggYXR0cmlidXRlIEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9zZXRwc2hhcmVkIChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIsCisJCQkJCSBpbnQgX19wc2hhcmVkKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKy8qIFJldHVybiBpbiAqS0lORCB0aGUgbXV0ZXgga2luZCBhdHRyaWJ1dGUgaW4gKkFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9nZXR0eXBlIChfX2NvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fcmVzdHJpY3QKKwkJCQkgICAgICBfX2F0dHIsIGludCAqX19yZXN0cmljdCBfX2tpbmQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgdGhlIG11dGV4IGtpbmQgYXR0cmlidXRlIGluICpBVFRSIHRvIEtJTkQgKGVpdGhlciBQVEhSRUFEX01VVEVYX05PUk1BTCwKKyAgIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFLCBQVEhSRUFEX01VVEVYX0VSUk9SQ0hFQ0ssIG9yCisgICBQVEhSRUFEX01VVEVYX0RFRkFVTFQpLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLCBpbnQgX19raW5kKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisvKiBSZXR1cm4gaW4gKlBST1RPQ09MIHRoZSBtdXRleCBwcm90b2NvbCBhdHRyaWJ1dGUgaW4gKkFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9nZXRwcm90b2NvbCAoX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICoKKwkJCQkJICBfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkJICBpbnQgKl9fcmVzdHJpY3QgX19wcm90b2NvbCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCB0aGUgbXV0ZXggcHJvdG9jb2wgYXR0cmlidXRlIGluICpBVFRSIHRvIFBST1RPQ09MIChlaXRoZXIKKyAgIFBUSFJFQURfUFJJT19OT05FLCBQVEhSRUFEX1BSSU9fSU5IRVJJVCwgb3IgUFRIUkVBRF9QUklPX1BST1RFQ1QpLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfc2V0cHJvdG9jb2wgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0ciwKKwkJCQkJICBpbnQgX19wcm90b2NvbCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJldHVybiBpbiAqUFJJT0NFSUxJTkcgdGhlIG11dGV4IHByaW9jZWlsaW5nIGF0dHJpYnV0ZSBpbiAqQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX2dldHByaW9jZWlsaW5nIChfX2NvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKgorCQkJCQkgICAgIF9fcmVzdHJpY3QgX19hdHRyLAorCQkJCQkgICAgIGludCAqX19yZXN0cmljdCBfX3ByaW9jZWlsaW5nKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHRoZSBtdXRleCBwcmlvY2VpbGluZyBhdHRyaWJ1dGUgaW4gKkFUVFIgdG8gUFJJT0NFSUxJTkcuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9zZXRwcmlvY2VpbGluZyAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLAorCQkJCQkgICAgIGludCBfX3ByaW9jZWlsaW5nKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIEdldCB0aGUgcm9idXN0bmVzcyBmbGFnIG9mIHRoZSBtdXRleCBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX2dldHJvYnVzdCAoX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIsCisJCQkJCWludCAqX19yb2J1c3RuZXNzKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgaWZkZWYgX19VU0VfR05VCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX2dldHJvYnVzdF9ucCAoX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIsCisJCQkJCSAgIGludCAqX19yb2J1c3RuZXNzKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZW5kaWYKKworLyogU2V0IHRoZSByb2J1c3RuZXNzIGZsYWcgb2YgdGhlIG11dGV4IGF0dHJpYnV0ZSBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfc2V0cm9idXN0IChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIsCisJCQkJCWludCBfX3JvYnVzdG5lc3MpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworIyBpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfc2V0cm9idXN0X25wIChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIsCisJCQkJCSAgIGludCBfX3JvYnVzdG5lc3MpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworIyBlbmRpZgorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworLyogRnVuY3Rpb25zIGZvciBoYW5kbGluZyByZWFkLXdyaXRlIGxvY2tzLiAgKi8KKworLyogSW5pdGlhbGl6ZSByZWFkLXdyaXRlIGxvY2sgUldMT0NLIHVzaW5nIGF0dHJpYnV0ZXMgQVRUUiwgb3IgdXNlCisgICB0aGUgZGVmYXVsdCB2YWx1ZXMgaWYgbGF0ZXIgaXMgTlVMTC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX2luaXQgKHB0aHJlYWRfcndsb2NrX3QgKl9fcmVzdHJpY3QgX19yd2xvY2ssCisJCQkJX19jb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqX19yZXN0cmljdAorCQkJCV9fYXR0cikgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIERlc3Ryb3kgcmVhZC13cml0ZSBsb2NrIFJXTE9DSy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogQWNxdWlyZSByZWFkIGxvY2sgZm9yIFJXTE9DSy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX3JkbG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spCisgICAgIF9fVEhST1dOTCBfX25vbm51bGwgKCgxKSk7CisKKy8qIFRyeSB0byBhY3F1aXJlIHJlYWQgbG9jayBmb3IgUldMT0NLLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jaykKKyAgX19USFJPV05MIF9fbm9ubnVsbCAoKDEpKTsKKworIyBpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBUcnkgdG8gYWNxdWlyZSByZWFkIGxvY2sgZm9yIFJXTE9DSyBvciByZXR1cm4gYWZ0ZXIgc3BlY2ZpZWQgdGltZS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX3RpbWVkcmRsb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3Jlc3RyaWN0IF9fcndsb2NrLAorCQkJCSAgICAgICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXN0cmljdAorCQkJCSAgICAgICBfX2Fic3RpbWUpIF9fVEhST1dOTCBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVuZGlmCisKKy8qIEFjcXVpcmUgd3JpdGUgbG9jayBmb3IgUldMT0NLLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9yd2xvY2tfd3Jsb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jaykKKyAgICAgX19USFJPV05MIF9fbm9ubnVsbCAoKDEpKTsKKworLyogVHJ5IHRvIGFjcXVpcmUgd3JpdGUgbG9jayBmb3IgUldMT0NLLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jaykKKyAgICAgX19USFJPV05MIF9fbm9ubnVsbCAoKDEpKTsKKworIyBpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBUcnkgdG8gYWNxdWlyZSB3cml0ZSBsb2NrIGZvciBSV0xPQ0sgb3IgcmV0dXJuIGFmdGVyIHNwZWNmaWVkIHRpbWUuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja190aW1lZHdybG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yZXN0cmljdCBfX3J3bG9jaywKKwkJCQkgICAgICAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QKKwkJCQkgICAgICAgX19hYnN0aW1lKSBfX1RIUk9XTkwgX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgorCisvKiBVbmxvY2sgUldMT0NLLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9yd2xvY2tfdW5sb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jaykKKyAgICAgX19USFJPV05MIF9fbm9ubnVsbCAoKDEpKTsKKworCisvKiBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHJlYWQtd3JpdGUgbG9jayBhdHRyaWJ1dGVzLiAgKi8KKworLyogSW5pdGlhbGl6ZSBhdHRyaWJ1dGUgb2JqZWN0IEFUVFIgd2l0aCBkZWZhdWx0IHZhbHVlcy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrYXR0cl9pbml0IChwdGhyZWFkX3J3bG9ja2F0dHJfdCAqX19hdHRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRGVzdHJveSBhdHRyaWJ1dGUgb2JqZWN0IEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja2F0dHJfZGVzdHJveSAocHRocmVhZF9yd2xvY2thdHRyX3QgKl9fYXR0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJldHVybiBjdXJyZW50IHNldHRpbmcgb2YgcHJvY2Vzcy1zaGFyZWQgYXR0cmlidXRlIG9mIEFUVFIgaW4gUFNIQVJFRC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrYXR0cl9nZXRwc2hhcmVkIChfX2NvbnN0IHB0aHJlYWRfcndsb2NrYXR0cl90ICoKKwkJCQkJICBfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkJICBpbnQgKl9fcmVzdHJpY3QgX19wc2hhcmVkKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHByb2Nlc3Mtc2hhcmVkIGF0dHJpYnV0ZSBvZiBBVFRSIHRvIFBTSEFSRUQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja2F0dHJfc2V0cHNoYXJlZCAocHRocmVhZF9yd2xvY2thdHRyX3QgKl9fYXR0ciwKKwkJCQkJICBpbnQgX19wc2hhcmVkKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogUmV0dXJuIGN1cnJlbnQgc2V0dGluZyBvZiByZWFkZXIvd3JpdGVyIHByZWZlcmVuY2UuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja2F0dHJfZ2V0a2luZF9ucCAoX19jb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqCisJCQkJCSAgX19yZXN0cmljdCBfX2F0dHIsCisJCQkJCSAgaW50ICpfX3Jlc3RyaWN0IF9fcHJlZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCByZWFkZXIvd3JpdGUgcHJlZmVyZW5jZS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrYXR0cl9zZXRraW5kX25wIChwdGhyZWFkX3J3bG9ja2F0dHJfdCAqX19hdHRyLAorCQkJCQkgIGludCBfX3ByZWYpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKworLyogRnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb25kaXRpb25hbCB2YXJpYWJsZXMuICAqLworCisvKiBJbml0aWFsaXplIGNvbmRpdGlvbiB2YXJpYWJsZSBDT05EIHVzaW5nIGF0dHJpYnV0ZXMgQVRUUiwgb3IgdXNlCisgICB0aGUgZGVmYXVsdCB2YWx1ZXMgaWYgbGF0ZXIgaXMgTlVMTC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZF9pbml0IChwdGhyZWFkX2NvbmRfdCAqX19yZXN0cmljdCBfX2NvbmQsCisJCQkgICAgICBfX2NvbnN0IHB0aHJlYWRfY29uZGF0dHJfdCAqX19yZXN0cmljdAorCQkJICAgICAgX19jb25kX2F0dHIpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IGNvbmRpdGlvbiB2YXJpYWJsZSBDT05ELiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9jb25kX2Rlc3Ryb3kgKHB0aHJlYWRfY29uZF90ICpfX2NvbmQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBXYWtlIHVwIG9uZSB0aHJlYWQgd2FpdGluZyBmb3IgY29uZGl0aW9uIHZhcmlhYmxlIENPTkQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRfc2lnbmFsIChwdGhyZWFkX2NvbmRfdCAqX19jb25kKQorICAgICBfX1RIUk9XTkwgX19ub25udWxsICgoMSkpOworCisvKiBXYWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgZm9yIGNvbmRpdGlvbiB2YXJpYWJsZXMgQ09ORC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZF9icm9hZGNhc3QgKHB0aHJlYWRfY29uZF90ICpfX2NvbmQpCisgICAgIF9fVEhST1dOTCBfX25vbm51bGwgKCgxKSk7CisKKy8qIFdhaXQgZm9yIGNvbmRpdGlvbiB2YXJpYWJsZSBDT05EIHRvIGJlIHNpZ25hbGVkIG9yIGJyb2FkY2FzdC4KKyAgIE1VVEVYIGlzIGFzc3VtZWQgdG8gYmUgbG9ja2VkIGJlZm9yZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZF93YWl0IChwdGhyZWFkX2NvbmRfdCAqX19yZXN0cmljdCBfX2NvbmQsCisJCQkgICAgICBwdGhyZWFkX211dGV4X3QgKl9fcmVzdHJpY3QgX19tdXRleCkKKyAgICAgX19ub25udWxsICgoMSwgMikpOworCisvKiBXYWl0IGZvciBjb25kaXRpb24gdmFyaWFibGUgQ09ORCB0byBiZSBzaWduYWxlZCBvciBicm9hZGNhc3QgdW50aWwKKyAgIEFCU1RJTUUuICBNVVRFWCBpcyBhc3N1bWVkIHRvIGJlIGxvY2tlZCBiZWZvcmUuICBBQlNUSU1FIGlzIGFuCisgICBhYnNvbHV0ZSB0aW1lIHNwZWNpZmljYXRpb247IHplcm8gaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgZXBvY2gKKyAgICgwMDowMDowMCBHTVQsIEphbnVhcnkgMSwgMTk3MCkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRfdGltZWR3YWl0IChwdGhyZWFkX2NvbmRfdCAqX19yZXN0cmljdCBfX2NvbmQsCisJCQkJICAgcHRocmVhZF9tdXRleF90ICpfX3Jlc3RyaWN0IF9fbXV0ZXgsCisJCQkJICAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QKKwkJCQkgICBfX2Fic3RpbWUpIF9fbm9ubnVsbCAoKDEsIDIsIDMpKTsKKworLyogRnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb25kaXRpb24gdmFyaWFibGUgYXR0cmlidXRlcy4gICovCisKKy8qIEluaXRpYWxpemUgY29uZGl0aW9uIHZhcmlhYmxlIGF0dHJpYnV0ZSBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9jb25kYXR0cl9pbml0IChwdGhyZWFkX2NvbmRhdHRyX3QgKl9fYXR0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIERlc3Ryb3kgY29uZGl0aW9uIHZhcmlhYmxlIGF0dHJpYnV0ZSBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9jb25kYXR0cl9kZXN0cm95IChwdGhyZWFkX2NvbmRhdHRyX3QgKl9fYXR0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEdldCB0aGUgcHJvY2Vzcy1zaGFyZWQgZmxhZyBvZiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGF0dHJpYnV0ZSBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9jb25kYXR0cl9nZXRwc2hhcmVkIChfX2NvbnN0IHB0aHJlYWRfY29uZGF0dHJfdCAqCisJCQkJCV9fcmVzdHJpY3QgX19hdHRyLAorCQkJCQlpbnQgKl9fcmVzdHJpY3QgX19wc2hhcmVkKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHRoZSBwcm9jZXNzLXNoYXJlZCBmbGFnIG9mIHRoZSBjb25kaXRpb24gdmFyaWFibGUgYXR0cmlidXRlIEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRhdHRyX3NldHBzaGFyZWQgKHB0aHJlYWRfY29uZGF0dHJfdCAqX19hdHRyLAorCQkJCQlpbnQgX19wc2hhcmVkKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIEdldCB0aGUgY2xvY2sgc2VsZWN0ZWQgZm9yIHRoZSBjb25kaXRvbiB2YXJpYWJsZSBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfZ2V0Y2xvY2sgKF9fY29uc3QgcHRocmVhZF9jb25kYXR0cl90ICoKKwkJCQkgICAgICBfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkgICAgICBfX2Nsb2NraWRfdCAqX19yZXN0cmljdCBfX2Nsb2NrX2lkKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHRoZSBjbG9jayBzZWxlY3RlZCBmb3IgdGhlIGNvbmRpdG9uIHZhcmlhYmxlIGF0dHJpYnV0ZSBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9jb25kYXR0cl9zZXRjbG9jayAocHRocmVhZF9jb25kYXR0cl90ICpfX2F0dHIsCisJCQkJICAgICAgX19jbG9ja2lkX3QgX19jbG9ja19pZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogRnVuY3Rpb25zIHRvIGhhbmRsZSBzcGlubG9ja3MuICAqLworCisvKiBJbml0aWFsaXplIHRoZSBzcGlubG9jayBMT0NLLiAgSWYgUFNIQVJFRCBpcyBub256ZXJvIHRoZSBzcGlubG9jayBjYW4KKyAgIGJlIHNoYXJlZCBiZXR3ZWVuIGRpZmZlcmVudCBwcm9jZXNzZXMuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NwaW5faW5pdCAocHRocmVhZF9zcGlubG9ja190ICpfX2xvY2ssIGludCBfX3BzaGFyZWQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IHRoZSBzcGlubG9jayBMT0NLLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9zcGluX2Rlc3Ryb3kgKHB0aHJlYWRfc3BpbmxvY2tfdCAqX19sb2NrKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogV2FpdCB1bnRpbCBzcGlubG9jayBMT0NLIGlzIHJldHJpZXZlZC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc3Bpbl9sb2NrIChwdGhyZWFkX3NwaW5sb2NrX3QgKl9fbG9jaykKKyAgICAgX19USFJPV05MIF9fbm9ubnVsbCAoKDEpKTsKKworLyogVHJ5IHRvIGxvY2sgc3BpbmxvY2sgTE9DSy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc3Bpbl90cnlsb2NrIChwdGhyZWFkX3NwaW5sb2NrX3QgKl9fbG9jaykKKyAgICAgX19USFJPV05MIF9fbm9ubnVsbCAoKDEpKTsKKworLyogUmVsZWFzZSBzcGlubG9jayBMT0NLLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9zcGluX3VubG9jayAocHRocmVhZF9zcGlubG9ja190ICpfX2xvY2spCisgICAgIF9fVEhST1dOTCBfX25vbm51bGwgKCgxKSk7CisKKworLyogRnVuY3Rpb25zIHRvIGhhbmRsZSBiYXJyaWVycy4gICovCisKKy8qIEluaXRpYWxpemUgQkFSUklFUiB3aXRoIHRoZSBhdHRyaWJ1dGVzIGluIEFUVFIuICBUaGUgYmFycmllciBpcworICAgb3BlbmVkIHdoZW4gQ09VTlQgd2FpdGVycyBhcnJpdmVkLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9iYXJyaWVyX2luaXQgKHB0aHJlYWRfYmFycmllcl90ICpfX3Jlc3RyaWN0IF9fYmFycmllciwKKwkJCQkgX19jb25zdCBwdGhyZWFkX2JhcnJpZXJhdHRyX3QgKl9fcmVzdHJpY3QKKwkJCQkgX19hdHRyLCB1bnNpZ25lZCBpbnQgX19jb3VudCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIERlc3Ryb3kgYSBwcmV2aW91c2x5IGR5bmFtaWNhbGx5IGluaXRpYWxpemVkIGJhcnJpZXIgQkFSUklFUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYmFycmllcl9kZXN0cm95IChwdGhyZWFkX2JhcnJpZXJfdCAqX19iYXJyaWVyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogV2FpdCBvbiBiYXJyaWVyIEJBUlJJRVIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2JhcnJpZXJfd2FpdCAocHRocmVhZF9iYXJyaWVyX3QgKl9fYmFycmllcikKKyAgICAgX19USFJPV05MIF9fbm9ubnVsbCAoKDEpKTsKKworCisvKiBJbml0aWFsaXplIGJhcnJpZXIgYXR0cmlidXRlIEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2JhcnJpZXJhdHRyX2luaXQgKHB0aHJlYWRfYmFycmllcmF0dHJfdCAqX19hdHRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRGVzdHJveSBwcmV2aW91c2x5IGR5bmFtaWNhbGx5IGluaXRpYWxpemVkIGJhcnJpZXIgYXR0cmlidXRlIEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2JhcnJpZXJhdHRyX2Rlc3Ryb3kgKHB0aHJlYWRfYmFycmllcmF0dHJfdCAqX19hdHRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogR2V0IHRoZSBwcm9jZXNzLXNoYXJlZCBmbGFnIG9mIHRoZSBiYXJyaWVyIGF0dHJpYnV0ZSBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9iYXJyaWVyYXR0cl9nZXRwc2hhcmVkIChfX2NvbnN0IHB0aHJlYWRfYmFycmllcmF0dHJfdCAqCisJCQkJCSAgIF9fcmVzdHJpY3QgX19hdHRyLAorCQkJCQkgICBpbnQgKl9fcmVzdHJpY3QgX19wc2hhcmVkKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHRoZSBwcm9jZXNzLXNoYXJlZCBmbGFnIG9mIHRoZSBiYXJyaWVyIGF0dHJpYnV0ZSBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9iYXJyaWVyYXR0cl9zZXRwc2hhcmVkIChwdGhyZWFkX2JhcnJpZXJhdHRyX3QgKl9fYXR0ciwKKwkJCQkJICAgaW50IF9fcHNoYXJlZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworCisvKiBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHRocmVhZC1zcGVjaWZpYyBkYXRhLiAgKi8KKworLyogQ3JlYXRlIGEga2V5IHZhbHVlIGlkZW50aWZ5aW5nIGEgbG9jYXRpb24gaW4gdGhlIHRocmVhZC1zcGVjaWZpYworICAgZGF0YSBhcmVhLiAgRWFjaCB0aHJlYWQgbWFpbnRhaW5zIGEgZGlzdGluY3QgdGhyZWFkLXNwZWNpZmljIGRhdGEKKyAgIGFyZWEuICBERVNUUl9GVU5DVElPTiwgaWYgbm9uLU5VTEwsIGlzIGNhbGxlZCB3aXRoIHRoZSB2YWx1ZQorICAgYXNzb2NpYXRlZCB0byB0aGF0IGtleSB3aGVuIHRoZSBrZXkgaXMgZGVzdHJveWVkLgorICAgREVTVFJfRlVOQ1RJT04gaXMgbm90IGNhbGxlZCBpZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCBpcyBOVUxMIHdoZW4KKyAgIHRoZSBrZXkgaXMgZGVzdHJveWVkLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9rZXlfY3JlYXRlIChwdGhyZWFkX2tleV90ICpfX2tleSwKKwkJCSAgICAgICB2b2lkICgqX19kZXN0cl9mdW5jdGlvbikgKHZvaWQgKikpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IEtFWS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfa2V5X2RlbGV0ZSAocHRocmVhZF9rZXlfdCBfX2tleSkgX19USFJPVzsKKworLyogUmV0dXJuIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHRocmVhZC1zcGVjaWZpYyBkYXRhIHNsb3QgaWRlbnRpZmllZCBieSBLRVkuICAqLworZXh0ZXJuIHZvaWQgKnB0aHJlYWRfZ2V0c3BlY2lmaWMgKHB0aHJlYWRfa2V5X3QgX19rZXkpIF9fVEhST1c7CisKKy8qIFN0b3JlIFBPSU5URVIgaW4gdGhlIHRocmVhZC1zcGVjaWZpYyBkYXRhIHNsb3QgaWRlbnRpZmllZCBieSBLRVkuICovCitleHRlcm4gaW50IHB0aHJlYWRfc2V0c3BlY2lmaWMgKHB0aHJlYWRfa2V5X3QgX19rZXksCisJCQkJX19jb25zdCB2b2lkICpfX3BvaW50ZXIpIF9fVEhST1cgOworCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBHZXQgSUQgb2YgQ1BVLXRpbWUgY2xvY2sgZm9yIHRocmVhZCBUSFJFQURfSUQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2dldGNwdWNsb2NraWQgKHB0aHJlYWRfdCBfX3RocmVhZF9pZCwKKwkJCQkgIF9fY2xvY2tpZF90ICpfX2Nsb2NrX2lkKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCisKKy8qIEluc3RhbGwgaGFuZGxlcnMgdG8gYmUgY2FsbGVkIHdoZW4gYSBuZXcgcHJvY2VzcyBpcyBjcmVhdGVkIHdpdGggRk9SSy4KKyAgIFRoZSBQUkVQQVJFIGhhbmRsZXIgaXMgY2FsbGVkIGluIHRoZSBwYXJlbnQgcHJvY2VzcyBqdXN0IGJlZm9yZSBwZXJmb3JtaW5nCisgICBGT1JLLiBUaGUgUEFSRU5UIGhhbmRsZXIgaXMgY2FsbGVkIGluIHRoZSBwYXJlbnQgcHJvY2VzcyBqdXN0IGFmdGVyIEZPUksuCisgICBUaGUgQ0hJTEQgaGFuZGxlciBpcyBjYWxsZWQgaW4gdGhlIGNoaWxkIHByb2Nlc3MuICBFYWNoIG9mIHRoZSB0aHJlZQorICAgaGFuZGxlcnMgY2FuIGJlIE5VTEwsIG1lYW5pbmcgdGhhdCBubyBoYW5kbGVyIG5lZWRzIHRvIGJlIGNhbGxlZCBhdCB0aGF0CisgICBwb2ludC4KKyAgIFBUSFJFQURfQVRGT1JLIGNhbiBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcywgaW4gd2hpY2ggY2FzZSB0aGUgUFJFUEFSRQorICAgaGFuZGxlcnMgYXJlIGNhbGxlZCBpbiBMSUZPIG9yZGVyIChsYXN0IGFkZGVkIHdpdGggUFRIUkVBRF9BVEZPUkssCisgICBmaXJzdCBjYWxsZWQgYmVmb3JlIEZPUkspLCBhbmQgdGhlIFBBUkVOVCBhbmQgQ0hJTEQgaGFuZGxlcnMgYXJlIGNhbGxlZAorICAgaW4gRklGTyAoZmlyc3QgYWRkZWQsIGZpcnN0IGNhbGxlZCkuICAqLworCitleHRlcm4gaW50IHB0aHJlYWRfYXRmb3JrICh2b2lkICgqX19wcmVwYXJlKSAodm9pZCksCisJCQkgICB2b2lkICgqX19wYXJlbnQpICh2b2lkKSwKKwkJCSAgIHZvaWQgKCpfX2NoaWxkKSAodm9pZCkpIF9fVEhST1c7CisKKworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisvKiBPcHRpbWl6YXRpb25zLiAgKi8KK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChwdGhyZWFkX2VxdWFsIChwdGhyZWFkX3QgX190aHJlYWQxLCBwdGhyZWFkX3QgX190aHJlYWQyKSkKK3sKKyAgcmV0dXJuIF9fdGhyZWFkMSA9PSBfX3RocmVhZDI7Cit9CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHB0aHJlYWQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdHkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlZDc3ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHR5LmgKQEAgLTAsMCArMSw0NiBAQAorLyogRnVuY3Rpb25zIGZvciBwc2V1ZG8gVFRZIGhhbmRsaW5nLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9QVFlfSAorI2RlZmluZSBfUFRZX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIENyZWF0ZSBwc2V1ZG8gdHR5IG1hc3RlciBzbGF2ZSBwYWlyIHdpdGggTkFNRSBhbmQgc2V0IHRlcm1pbmFsCisgICBhdHRyaWJ1dGVzIGFjY29yZGluZyB0byBURVJNUCBhbmQgV0lOUCBhbmQgcmV0dXJuIGhhbmRsZXMgZm9yIGJvdGgKKyAgIGVuZHMgaW4gQU1BU1RFUiBhbmQgQVNMQVZFLiAgKi8KK2V4dGVybiBpbnQgb3BlbnB0eSAoaW50ICpfX2FtYXN0ZXIsIGludCAqX19hc2xhdmUsIGNoYXIgKl9fbmFtZSwKKwkJICAgIGNvbnN0IHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1wLAorCQkgICAgY29uc3Qgc3RydWN0IHdpbnNpemUgKl9fd2lucCkgX19USFJPVzsKKworLyogQ3JlYXRlIGNoaWxkIHByb2Nlc3MgYW5kIGVzdGFibGlzaCB0aGUgc2xhdmUgcHNldWRvIHRlcm1pbmFsIGFzIHRoZQorICAgY2hpbGQncyBjb250cm9sbGluZyB0ZXJtaW5hbC4gICovCitleHRlcm4gaW50IGZvcmtwdHkgKGludCAqX19hbWFzdGVyLCBjaGFyICpfX25hbWUsCisJCSAgICBjb25zdCBzdHJ1Y3QgdGVybWlvcyAqX190ZXJtcCwKKwkJICAgIGNvbnN0IHN0cnVjdCB3aW5zaXplICpfX3dpbnApIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBwdHkuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9jZGVjbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9jZGVjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMGQxNGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2NkZWNsLmgKQEAgLTAsMCArMSw0MiBAQAorI2lmbmRlZiBmb29wdWxzZWNkZWNsaGZvbworI2RlZmluZSBmb29wdWxzZWNkZWNsaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKy8qKiBcZmlsZQorICogQysrIGNvbXBhdGliaWxpdHkgc3VwcG9ydCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKy8qKiBJZiB1c2luZyBDKysgdGhpcyBtYWNybyBlbmFibGVzIEMgbW9kZSwgb3RoZXJ3aXNlIGRvZXMgbm90aGluZyAqLworI2RlZmluZSBQQV9DX0RFQ0xfQkVHSU4gZXh0ZXJuICJDIiB7CisvKiogSWYgdXNpbmcgQysrIHRoaXMgbWFjcm9zIHN3aXRjaGVzIGJhY2sgdG8gQysrIG1vZGUsIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcgKi8KKyNkZWZpbmUgUEFfQ19ERUNMX0VORCB9CisKKyNlbHNlCisvKiogSWYgdXNpbmcgQysrIHRoaXMgbWFjcm8gZW5hYmxlcyBDIG1vZGUsIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcgKi8KKyNkZWZpbmUgUEFfQ19ERUNMX0JFR0lOCisvKiogSWYgdXNpbmcgQysrIHRoaXMgbWFjcm9zIHN3aXRjaGVzIGJhY2sgdG8gQysrIG1vZGUsIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcgKi8KKyNkZWZpbmUgUEFfQ19ERUNMX0VORAorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2NoYW5uZWxtYXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvY2hhbm5lbG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNjIyMjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2NoYW5uZWxtYXAuaApAQCAtMCwwICsxLDM2MyBAQAorI2lmbmRlZiBmb29jaGFubmVsbWFwaGZvbworI2RlZmluZSBmb29jaGFubmVsbWFwaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDUtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHB1bHNlL3NhbXBsZS5oPgorI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvZ2NjbWFjcm8uaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBccGFnZSBjaGFubmVsbWFwIENoYW5uZWwgTWFwcworICoKKyAqIFxzZWN0aW9uIG92ZXJ2X3NlYyBPdmVydmlldworICoKKyAqIENoYW5uZWwgbWFwcyBwcm92aWRlIGEgd2F5IHRvIGFzc29jaWF0ZSBjaGFubmVscyBpbiBhIHN0cmVhbSB3aXRoIGEKKyAqIHNwZWNpZmljIHNwZWFrZXIgcG9zaXRpb24uIFRoaXMgcmVsaWV2ZXMgYXBwbGljYXRpb25zIG9mIGhhdmluZyB0bworICogbWFrZSBzdXJlIHRoZWlyIGNoYW5uZWwgb3JkZXIgaXMgaWRlbnRpY2FsIHRvIHRoZSBmaW5hbCBvdXRwdXQuCisgKgorICogXHNlY3Rpb24gaW5pdF9zZWMgSW5pdGlhbGlzYXRpb24KKyAqCisgKiBBIGNoYW5uZWwgbWFwIGNvbnNpc3RzIG9mIGFuIGFycmF5IG9mIFxyZWYgcGFfY2hhbm5lbF9wb3NpdGlvbiB2YWx1ZXMsCisgKiBvbmUgZm9yIGVhY2ggY2hhbm5lbC4gVGhpcyBhcnJheSBpcyBzdG9yZWQgdG9nZXRoZXIgd2l0aCBhIGNoYW5uZWwgY291bnQKKyAqIGluIGEgcGFfY2hhbm5lbF9tYXAgc3RydWN0dXJlLgorICoKKyAqIEJlZm9yZSBmaWxsaW5nIHRoZSBzdHJ1Y3R1cmUsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGluaXRpYWxpc2UgaXQgdXNpbmcKKyAqIHBhX2NoYW5uZWxfbWFwX2luaXQoKS4gVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YgY29udmVuaWVuY2UgZnVuY3Rpb25zCisgKiBmb3Igc3RhbmRhcmQgY2hhbm5lbCBtYXBwaW5nczoKKyAqCisgKiBcbGkgcGFfY2hhbm5lbF9tYXBfaW5pdF9tb25vKCkgLSBDcmVhdGUgYSBjaGFubmVsIG1hcCB3aXRoIG9ubHkgbW9ubyBhdWRpby4KKyAqIFxsaSBwYV9jaGFubmVsX21hcF9pbml0X3N0ZXJlbygpIC0gQ3JlYXRlIGEgc3RhbmRhcmQgc3RlcmVvIG1hcHBpbmcuCisgKiBcbGkgcGFfY2hhbm5lbF9tYXBfaW5pdF9hdXRvKCkgLSBDcmVhdGUgYSBzdGFuZGFyZCBjaGFubmVsIG1hcCBmb3IgYSBzcGVjaWZpYyBudW1iZXIgb2YgY2hhbm5lbHMKKyAqIFxsaSBwYV9jaGFubmVsX21hcF9pbml0X2V4dGVuZCgpIC0gU2ltaWxhciB0bworICogcGFfY2hhbm5lbF9tYXBfaW5pdF9hdXRvKCkgYnV0IHN5bnRoZXNpemUgYSBjaGFubmVsIG1hcCBpZiBubworICogcHJlZGVmaW5lZCBvbmUgaXMga25vd24gZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYW5uZWxzLgorICoKKyAqIFxzZWN0aW9uIGNvbnZfc2VjIENvbnZlbmllbmNlIEZ1bmN0aW9ucworICoKKyAqIFRoZSBsaWJyYXJ5IGNvbnRhaW5zIGEgbnVtYmVyIG9mIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoCisgKiBjaGFubmVsIG1hcHM6CisgKgorICogXGxpIHBhX2NoYW5uZWxfbWFwX3ZhbGlkKCkgLSBUZXN0cyBpZiBhIGNoYW5uZWwgbWFwIGlzIHZhbGlkLgorICogXGxpIHBhX2NoYW5uZWxfbWFwX2VxdWFsKCkgLSBUZXN0cyBpZiB0d28gY2hhbm5lbCBtYXBzIGFyZSBpZGVudGljYWwuCisgKiBcbGkgcGFfY2hhbm5lbF9tYXBfc25wcmludCgpIC0gQ3JlYXRlcyBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgYSBjaGFubmVsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLgorICovCisKKy8qKiBcZmlsZQorICogQ29uc3RhbnRzIGFuZCByb3V0aW5lcyBmb3IgY2hhbm5lbCBtYXBwaW5nIGhhbmRsaW5nCisgKgorICogU2VlIGFsc28gXHN1YnBhZ2UgY2hhbm5lbG1hcAorICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogQSBsaXN0IG9mIGNoYW5uZWwgbGFiZWxzICovCit0eXBlZGVmIGVudW0gcGFfY2hhbm5lbF9wb3NpdGlvbiB7CisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElEID0gLTEsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9NT05PID0gMCwKKworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwgICAgICAgICAgICAgICAvKio8IEFwcGxlLCBEb2xieSBjYWxsIHRoaXMgJ0xlZnQnICovCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwgICAgICAgICAgICAgIC8qKjwgQXBwbGUsIERvbGJ5IGNhbGwgdGhpcyAnUmlnaHQnICovCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsICAgICAgICAgICAgIC8qKjwgQXBwbGUsIERvbGJ5IGNhbGwgdGhpcyAnQ2VudGVyJyAqLworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0xFRlQgPSBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9SSUdIVCA9IFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9DRU5URVIgPSBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKy8qKiBcZW5kY29uZCAqLworCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0NFTlRFUiwgICAgICAgICAgICAgIC8qKjwgTWljcm9zb2Z0IGNhbGxzIHRoaXMgJ0JhY2sgQ2VudGVyJywgQXBwbGUgY2FsbHMgdGhpcyAnQ2VudGVyIFN1cnJvdW5kJywgRG9sYnkgY2FsbHMgdGhpcyAnU3Vycm91bmQgUmVhciBDZW50ZXInICovCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlQsICAgICAgICAgICAgICAgIC8qKjwgTWljcm9zb2Z0IGNhbGxzIHRoaXMgJ0JhY2sgTGVmdCcsIEFwcGxlIGNhbGxzIHRoaXMgJ0xlZnQgU3Vycm91bmQnICghKSwgRG9sYnkgY2FsbHMgdGhpcyAnU3Vycm91bmQgUmVhciBMZWZ0JyAgKi8KKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFQsICAgICAgICAgICAgICAgLyoqPCBNaWNyb3NvZnQgY2FsbHMgdGhpcyAnQmFjayBSaWdodCcsIEFwcGxlIGNhbGxzIHRoaXMgJ1JpZ2h0IFN1cnJvdW5kJyAoISksIERvbGJ5IGNhbGxzIHRoaXMgJ1N1cnJvdW5kIFJlYXIgUmlnaHQnICAqLworCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9MRkUsICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWljcm9zb2Z0IGNhbGxzIHRoaXMgJ0xvdyBGcmVxdWVuY3knLCBBcHBsZSBjYWxscyB0aGlzICdMRkVTY3JlZW4nICovCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1NVQldPT0ZFUiA9IFBBX0NIQU5ORUxfUE9TSVRJT05fTEZFLAorLyoqIFxlbmRjb25kICovCisKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSLCAgICAgLyoqPCBBcHBsZSwgRG9sYnkgY2FsbCB0aGlzICdMZWZ0IENlbnRlcicgKi8KKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUX09GX0NFTlRFUiwgICAgLyoqPCBBcHBsZSwgRG9sYnkgY2FsbCB0aGlzICdSaWdodCBDZW50ZXIgKi8KKworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZULCAgICAgICAgICAgICAgICAvKio8IEFwcGxlIGNhbGxzIHRoaXMgJ0xlZnQgU3Vycm91bmQgRGlyZWN0JywgRG9sYnkgY2FsbHMgdGhpcyAnU3Vycm91bmQgTGVmdCcgKCEpICovCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hULCAgICAgICAgICAgICAgIC8qKjwgQXBwbGUgY2FsbHMgdGhpcyAnUmlnaHQgU3Vycm91bmQgRGlyZWN0JywgRG9sYnkgY2FsbHMgdGhpcyAnU3Vycm91bmQgUmlnaHQnICghKSAqLworCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgwLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMSwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDIsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgzLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYNCwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDUsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg2LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYNywKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDgsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg5LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTAsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxMSwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDEyLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTMsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxNCwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE1LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTYsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxNywKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE4LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTksCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyMCwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDIxLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjIsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyMywKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI0LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjUsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyNiwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI3LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjgsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyOSwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDMwLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMzEsCisKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9DRU5URVIsICAgICAgICAgICAgICAgLyoqPCBBcHBsZSBjYWxscyB0aGlzICdUb3AgQ2VudGVyIFN1cnJvdW5kJyAqLworCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfTEVGVCwgICAgICAgICAgIC8qKjwgQXBwbGUgY2FsbHMgdGhpcyAnVmVydGljYWwgSGVpZ2h0IExlZnQnICovCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfUklHSFQsICAgICAgICAgIC8qKjwgQXBwbGUgY2FsbHMgdGhpcyAnVmVydGljYWwgSGVpZ2h0IFJpZ2h0JyAqLworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0NFTlRFUiwgICAgICAgICAvKio8IEFwcGxlIGNhbGxzIHRoaXMgJ1ZlcnRpY2FsIEhlaWdodCBDZW50ZXInICovCisKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0xFRlQsICAgICAgICAgICAgLyoqPCBNaWNyb3NvZnQgYW5kIEFwcGxlIGNhbGwgdGhpcyAnVG9wIEJhY2sgTGVmdCcgKi8KKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX1JJR0hULCAgICAgICAgICAgLyoqPCBNaWNyb3NvZnQgYW5kIEFwcGxlIGNhbGwgdGhpcyAnVG9wIEJhY2sgUmlnaHQnICovCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9DRU5URVIsICAgICAgICAgIC8qKjwgTWljcm9zb2Z0IGFuZCBBcHBsZSBjYWxsIHRoaXMgJ1RvcCBCYWNrIENlbnRlcicgKi8KKworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fTUFYCit9IHBhX2NoYW5uZWxfcG9zaXRpb25fdDsKKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fSU5WQUxJRCBQQV9DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9NT05PIFBBX0NIQU5ORUxfUE9TSVRJT05fTU9OTworI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0xFRlQgUEFfQ0hBTk5FTF9QT1NJVElPTl9MRUZUCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fUklHSFQgUEFfQ0hBTk5FTF9QT1NJVElPTl9SSUdIVAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0NFTlRFUiBQQV9DSEFOTkVMX1BPU0lUSU9OX0NFTlRFUgorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUgorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX1JFQVJfQ0VOVEVSIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9DRU5URVIKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlQgUEFfQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlQKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hUIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0xGRSBQQV9DSEFOTkVMX1BPU0lUSU9OX0xGRQorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX1NVQldPT0ZFUiBQQV9DSEFOTkVMX1BPU0lUSU9OX1NVQldPT0ZFUgorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVF9PRl9DRU5URVIKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVF9PRl9DRU5URVIgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVF9PRl9DRU5URVIKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQgUEFfQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hUIFBBX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgwCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDEKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMgorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDMgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgzCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYNCBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDQKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg1IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYNQorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDYgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg2CisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYNyBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDcKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg4IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYOAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDkgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg5CisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxMAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDExIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTEKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxMiBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDEyCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTMgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxMworI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE0IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTQKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxNSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE1CisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTYgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxNgorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE3IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTcKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxOCBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE4CisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTkgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxOQorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDIwIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjAKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyMSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDIxCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjIgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyMgorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDIzIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjMKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyNCBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI0CisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyNQorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI2IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjYKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyNyBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI3CisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjggUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyOAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI5IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjkKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgzMCBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDMwCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMzEgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgzMQorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9DRU5URVIgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfQ0VOVEVSCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0xFRlQgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfTEVGVAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9SSUdIVCBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9SSUdIVAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9DRU5URVIgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfQ0VOVEVSCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfTEVGVCBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0xFRlQKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9SSUdIVCBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX1JJR0hUCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfQ0VOVEVSIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfQ0VOVEVSCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fTUFYIFBBX0NIQU5ORUxfUE9TSVRJT05fTUFYCisvKiogXGVuZGNvbmQgKi8KKworLyoqIEEgbWFzayBvZiBjaGFubmVsIHBvc2l0aW9ucy4gXHNpbmNlIDAuOS4xNiAqLwordHlwZWRlZiB1aW50NjRfdCBwYV9jaGFubmVsX3Bvc2l0aW9uX21hc2tfdDsKKworLyoqIE1ha2VzIGEgYml0IG1hc2sgZnJvbSBhIGNoYW5uZWwgcG9zaXRpb24uIFxzaW5jZSAwLjkuMTYgKi8KKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9NQVNLKGYpICgocGFfY2hhbm5lbF9wb3NpdGlvbl9tYXNrX3QpICgxVUxMIDw8IChmKSkpCisKKy8qKiBBIGxpc3Qgb2YgY2hhbm5lbCBtYXBwaW5nIGRlZmluaXRpb25zIGZvciBwYV9jaGFubmVsX21hcF9pbml0X2F1dG8oKSAqLwordHlwZWRlZiBlbnVtIHBhX2NoYW5uZWxfbWFwX2RlZiB7CisgICAgUEFfQ0hBTk5FTF9NQVBfQUlGRiwKKyAgICAvKio8IFRoZSBtYXBwaW5nIGZyb20gUkZDMzU1MSwgd2hpY2ggaXMgYmFzZWQgb24gQUlGRi1DICovCisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworICAgIFBBX0NIQU5ORUxfTUFQX0FMU0EsCisgICAgLyoqPCBUaGUgZGVmYXVsdCBtYXBwaW5nIHVzZWQgYnkgQUxTQS4gVGhpcyBtYXBwaW5nIGlzIHByb2JhYmx5CisgICAgICogbm90IHRvbyB1c2VmdWwgc2luY2UgQUxTQSdzIGRlZmF1bHQgY2hhbm5lbCBtYXBwaW5nIGRlcGVuZHMgb24KKyAgICAgKiB0aGUgZGV2aWNlIHN0cmluZyB1c2VkLiAqLworLyoqIFxlbmRjb25kICovCisKKyAgICBQQV9DSEFOTkVMX01BUF9BVVgsCisgICAgLyoqPCBPbmx5IGF1eCBjaGFubmVscyAqLworCisgICAgUEFfQ0hBTk5FTF9NQVBfV0FWRUVYLAorICAgIC8qKjwgTWljcm9zb2Z0J3MgV0FWRUZPUk1BVEVYVEVOU0lCTEUgbWFwcGluZy4gVGhpcyBtYXBwaW5nIHdvcmtzCisgICAgICogYXMgaWYgYWxsIExTQnMgb2YgZHdDaGFubmVsTWFzayBhcmUgc2V0LiAgKi8KKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisgICAgUEFfQ0hBTk5FTF9NQVBfT1NTLAorICAgIC8qKjwgVGhlIGRlZmF1bHQgY2hhbm5lbCBtYXBwaW5nIHVzZWQgYnkgT1NTIGFzIGRlZmluZWQgaW4gdGhlIE9TUworICAgICAqIDQuMCBBUEkgc3BlY3MuIFRoaXMgbWFwcGluZyBpcyBwcm9iYWJseSBub3QgdG9vIHVzZWZ1bCBzaW5jZQorICAgICAqIHRoZSBPU1MgQVBJIGhhcyBjaGFuZ2VkIGluIHRoaXMgcmVzcGVjdCBhbmQgbm8gbG9uZ2VyIGtub3dzIGEKKyAgICAgKiBkZWZhdWx0IGNoYW5uZWwgbWFwcGluZyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLiAqLworLyoqIFxlbmRjb25kICovCisKKyAgICAvKio8IFVwcGVyIGxpbWl0IG9mIHZhbGlkIGNoYW5uZWwgbWFwcGluZyBkZWZpbml0aW9ucyAqLworICAgIFBBX0NIQU5ORUxfTUFQX0RFRl9NQVgsCisKKyAgICBQQV9DSEFOTkVMX01BUF9ERUZBVUxUID0gUEFfQ0hBTk5FTF9NQVBfQUlGRgorICAgIC8qKjwgVGhlIGRlZmF1bHQgY2hhbm5lbCBtYXAgKi8KK30gcGFfY2hhbm5lbF9tYXBfZGVmX3Q7CisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworI2RlZmluZSBQQV9DSEFOTkVMX01BUF9BSUZGIFBBX0NIQU5ORUxfTUFQX0FJRkYKKyNkZWZpbmUgUEFfQ0hBTk5FTF9NQVBfQUxTQSBQQV9DSEFOTkVMX01BUF9BTFNBCisjZGVmaW5lIFBBX0NIQU5ORUxfTUFQX0FVWCBQQV9DSEFOTkVMX01BUF9BVVgKKyNkZWZpbmUgUEFfQ0hBTk5FTF9NQVBfV0FWRUVYIFBBX0NIQU5ORUxfTUFQX1dBVkVFWAorI2RlZmluZSBQQV9DSEFOTkVMX01BUF9PU1MgUEFfQ0hBTk5FTF9NQVBfT1NTCisjZGVmaW5lIFBBX0NIQU5ORUxfTUFQX0RFRl9NQVggUEFfQ0hBTk5FTF9NQVBfREVGX01BWAorI2RlZmluZSBQQV9DSEFOTkVMX01BUF9ERUZBVUxUIFBBX0NIQU5ORUxfTUFQX0RFRkFVTFQKKy8qKiBcZW5kY29uZCAqLworCisvKiogQSBjaGFubmVsIG1hcCB3aGljaCBjYW4gYmUgdXNlZCB0byBhdHRhY2ggbGFiZWxzIHRvIHNwZWNpZmljCisgKiBjaGFubmVscyBvZiBhIHN0cmVhbS4gVGhlc2UgdmFsdWVzIGFyZSByZWxldmFudCBmb3IgY29udmVyc2lvbiBhbmQKKyAqIG1peGluZyBvZiBzdHJlYW1zICovCit0eXBlZGVmIHN0cnVjdCBwYV9jaGFubmVsX21hcCB7CisgICAgdWludDhfdCBjaGFubmVsczsKKyAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLworCisgICAgcGFfY2hhbm5lbF9wb3NpdGlvbl90IG1hcFtQQV9DSEFOTkVMU19NQVhdOworICAgIC8qKjwgQ2hhbm5lbCBsYWJlbHMgKi8KK30gcGFfY2hhbm5lbF9tYXA7CisKKy8qKiBJbml0aWFsaXplIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBtYXAgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8KKyAqIGl0LiBUaGUgY2hhbm5lbCBtYXAgd2lsbCBoYXZlIGEgZGVmaW5lZCBzdGF0ZSBidXQKKyAqIHBhX2NoYW5uZWxfbWFwX3ZhbGlkKCkgd2lsbCBmYWlsIGZvciBpdC4gKi8KK3BhX2NoYW5uZWxfbWFwKiBwYV9jaGFubmVsX21hcF9pbml0KHBhX2NoYW5uZWxfbWFwICptKTsKKworLyoqIEluaXRpYWxpemUgdGhlIHNwZWNpZmllZCBjaGFubmVsIG1hcCBmb3IgbW9uYXVyYWwgYXVkaW8gYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQgKi8KK3BhX2NoYW5uZWxfbWFwKiBwYV9jaGFubmVsX21hcF9pbml0X21vbm8ocGFfY2hhbm5lbF9tYXAgKm0pOworCisvKiogSW5pdGlhbGl6ZSB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgbWFwIGZvciBzdGVyZW9waG9uaWMgYXVkaW8gYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQgKi8KK3BhX2NoYW5uZWxfbWFwKiBwYV9jaGFubmVsX21hcF9pbml0X3N0ZXJlbyhwYV9jaGFubmVsX21hcCAqbSk7CisKKy8qKiBJbml0aWFsaXplIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBtYXAgZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mCisgKiBjaGFubmVscyB1c2luZyBkZWZhdWx0IGxhYmVscyBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4gVGhpcyBjYWxsCisgKiB3aWxsIGZhaWwgKHJldHVybiBOVUxMKSBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IGNoYW5uZWwgbWFwIGtub3duIGZvciB0aGlzCisgKiBzcGVjaWZpYyBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIG1hcHBpbmcuICovCitwYV9jaGFubmVsX21hcCogcGFfY2hhbm5lbF9tYXBfaW5pdF9hdXRvKHBhX2NoYW5uZWxfbWFwICptLCB1bnNpZ25lZCBjaGFubmVscywgcGFfY2hhbm5lbF9tYXBfZGVmX3QgZGVmKTsKKworLyoqIFNpbWlsYXIgdG8gcGFfY2hhbm5lbF9tYXBfaW5pdF9hdXRvKCkgYnV0IGluc3RlYWQgb2YgZmFpbGluZyBpZiBubworICogZGVmYXVsdCBtYXBwaW5nIGlzIGtub3duIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGl0IHdpbGwKKyAqIHN5bnRoZXNpemUgYSBtYXBwaW5nIGJhc2VkIG9uIGEga25vd24gbWFwcGluZyB3aXRoIGZld2VyIGNoYW5uZWxzCisgKiBhbmQgZmlsbCB1cCB0aGUgcmVzdCB3aXRoIEFVWDAuLi5BVVgzMSBjaGFubmVscyAgXHNpbmNlIDAuOS4xMSAqLworcGFfY2hhbm5lbF9tYXAqIHBhX2NoYW5uZWxfbWFwX2luaXRfZXh0ZW5kKHBhX2NoYW5uZWxfbWFwICptLCB1bnNpZ25lZCBjaGFubmVscywgcGFfY2hhbm5lbF9tYXBfZGVmX3QgZGVmKTsKKworLyoqIFJldHVybiBhIHRleHQgbGFiZWwgZm9yIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBwb3NpdGlvbiAqLworY29uc3QgY2hhciogcGFfY2hhbm5lbF9wb3NpdGlvbl90b19zdHJpbmcocGFfY2hhbm5lbF9wb3NpdGlvbl90IHBvcykgUEFfR0NDX1BVUkU7CisKKy8qKiBUaGUgaW52ZXJzZSBvZiBwYV9jaGFubmVsX3Bvc2l0aW9uX3RvX3N0cmluZygpLiBcc2luY2UgMC45LjE2ICovCitwYV9jaGFubmVsX3Bvc2l0aW9uX3QgcGFfY2hhbm5lbF9wb3NpdGlvbl9mcm9tX3N0cmluZyhjb25zdCBjaGFyICpzKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIHRleHQgbGFiZWwgZm9yIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBwb3NpdGlvbi4gXHNpbmNlIDAuOS43ICovCitjb25zdCBjaGFyKiBwYV9jaGFubmVsX3Bvc2l0aW9uX3RvX3ByZXR0eV9zdHJpbmcocGFfY2hhbm5lbF9wb3NpdGlvbl90IHBvcyk7CisKKy8qKiBUaGUgbWF4aW11bSBsZW5ndGggb2Ygc3RyaW5ncyByZXR1cm5lZCBieQorICogcGFfY2hhbm5lbF9tYXBfc25wcmludCgpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgdmFsdWUgY2FuIGNoYW5nZQorICogd2l0aCBhbnkgcmVsZWFzZSB3aXRob3V0IHdhcm5pbmcgYW5kIHdpdGhvdXQgYmVpbmcgY29uc2lkZXJlZCBBUEkKKyAqIG9yIEFCSSBicmVha2FnZS4gWW91IHNob3VsZCBub3QgdXNlIHRoaXMgZGVmaW5pdGlvbiBhbnl3aGVyZSB3aGVyZQorICogaXQgbWlnaHQgYmVjb21lIHBhcnQgb2YgYW4gQUJJLiAqLworI2RlZmluZSBQQV9DSEFOTkVMX01BUF9TTlBSSU5UX01BWCAzMzYKKworLyoqIE1ha2UgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgbWFwICovCitjaGFyKiBwYV9jaGFubmVsX21hcF9zbnByaW50KGNoYXIgKnMsIHNpemVfdCBsLCBjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwKTsKKworLyoqIFBhcnNlIGEgY2hhbm5lbCBwb3NpdGlvbiBsaXN0IG9yIHdlbGwta25vd24gbWFwcGluZyBuYW1lIGludG8gYQorICogY2hhbm5lbCBtYXAgc3RydWN0dXJlLiBUaGlzIHR1cm5zIHRoZSBvdXRwdXQgb2YKKyAqIHBhX2NoYW5uZWxfbWFwX3NucHJpbnQoKSBhbmQgcGFfY2hhbm5lbF9tYXBfdG9fbmFtZSgpIGJhY2sgaW50byBhCisgKiBwYV9jaGFubmVsX21hcCAqLworcGFfY2hhbm5lbF9tYXAgKnBhX2NoYW5uZWxfbWFwX3BhcnNlKHBhX2NoYW5uZWxfbWFwICptYXAsIGNvbnN0IGNoYXIgKnMpOworCisvKiogQ29tcGFyZSB0d28gY2hhbm5lbCBtYXBzLiBSZXR1cm4gMSBpZiBib3RoIG1hdGNoLiAqLworaW50IHBhX2NoYW5uZWxfbWFwX2VxdWFsKGNvbnN0IHBhX2NoYW5uZWxfbWFwICphLCBjb25zdCBwYV9jaGFubmVsX21hcCAqYikgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIHNwZWNpZmllZCBjaGFubmVsIG1hcCBpcyBjb25zaWRlcmVkIHZhbGlkICovCitpbnQgcGFfY2hhbm5lbF9tYXBfdmFsaWQoY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCkgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIHNwZWNpZmllZCBjaGFubmVsIG1hcCBpcyBjb21wYXRpYmxlIHdpdGgKKyAqIHRoZSBzcGVjaWZpZWQgc2FtcGxlIHNwZWMuIFxzaW5jZSAwLjkuMTIgKi8KK2ludCBwYV9jaGFubmVsX21hcF9jb21wYXRpYmxlKGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXAsIGNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcykgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGV2ZXJ5IGNoYW5uZWwgZGVmaW5lZCBpbiBiIGlzIGFsc28gZGVmaW5lZCBpbiBhLiBcc2luY2UgMC45LjE1ICovCitpbnQgcGFfY2hhbm5lbF9tYXBfc3VwZXJzZXQoY29uc3QgcGFfY2hhbm5lbF9tYXAgKmEsIGNvbnN0IHBhX2NoYW5uZWxfbWFwICpiKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybnMgbm9uLXplcm8gaWYgaXQgbWFrZXMgc2Vuc2UgdG8gYXBwbHkgYSB2b2x1bWUgJ2JhbGFuY2UnCisgKiB3aXRoIHRoaXMgbWFwcGluZywgaS5lLiBpZiB0aGVyZSBhcmUgbGVmdC9yaWdodCBjaGFubmVscworICogYXZhaWxhYmxlLiBcc2luY2UgMC45LjE1ICovCitpbnQgcGFfY2hhbm5lbF9tYXBfY2FuX2JhbGFuY2UoY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCkgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGl0IG1ha2VzIHNlbnNlIHRvIGFwcGx5IGEgdm9sdW1lICdmYWRlJworICogKGkuZS4gJ2JhbGFuY2UnIGJldHdlZW4gZnJvbnQgYW5kIHJlYXIpIHdpdGggdGhpcyBtYXBwaW5nLCBpLmUuIGlmCisgKiB0aGVyZSBhcmUgZnJvbnQvcmVhciBjaGFubmVscyBhdmFpbGFibGUuIFxzaW5jZSAwLjkuMTUgKi8KK2ludCBwYV9jaGFubmVsX21hcF9jYW5fZmFkZShjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwKSBQQV9HQ0NfUFVSRTsKKworLyoqIFRyaWVzIHRvIGZpbmQgYSB3ZWxsLWtub3duIGNoYW5uZWwgbWFwcGluZyBuYW1lIGZvciB0aGlzIGNoYW5uZWwKKyAqIG1hcHBpbmcuIEkuZS4gInN0ZXJlbyIsICJzdXJyb3VuZC03MSIgYW5kIHNvIG9uLiBJZiB0aGUgY2hhbm5lbAorICogbWFwcGluZyBpcyB1bmtub3duIE5VTEwgd2lsbCBiZSByZXR1cm5lZC4gVGhpcyBuYW1lIGNhbiBiZSBwYXJzZWQKKyAqIHdpdGggcGFfY2hhbm5lbF9tYXBfcGFyc2UoKSBcc2luY2UgMC45LjE1ICovCitjb25zdCBjaGFyKiBwYV9jaGFubmVsX21hcF90b19uYW1lKGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXApIFBBX0dDQ19QVVJFOworCisvKiogVHJpZXMgdG8gZmluZCBhIGh1bWFuIHJlYWRhYmxlIHRleHQgbGFiZWwgZm9yIHRoaXMgY2hhbm5lbAorbWFwcGluZy4gSS5lLiAiU3RlcmVvIiwgIlN1cnJvdW5kIDcuMSIgYW5kIHNvIG9uLiBJZiB0aGUgY2hhbm5lbAorbWFwcGluZyBpcyB1bmtub3duIE5VTEwgd2lsbCBiZSByZXR1cm5lZC4gXHNpbmNlIDAuOS4xNSAqLworY29uc3QgY2hhciogcGFfY2hhbm5lbF9tYXBfdG9fcHJldHR5X25hbWUoY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCkgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm5zIFRSVUUgaWYgdGhlIHNwZWNpZmllZCBjaGFubmVsIHBvc2l0aW9uIGlzIGF2YWlsYWJsZSBhdAorICogbGVhc3Qgb25jZSBpbiB0aGUgY2hhbm5lbCBtYXAuIFxzaW5jZSAwLjkuMTYgKi8KK2ludCBwYV9jaGFubmVsX21hcF9oYXNfcG9zaXRpb24oY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCwgcGFfY2hhbm5lbF9wb3NpdGlvbl90IHApIFBBX0dDQ19QVVJFOworCisvKiogR2VuZXJhdGVzIGEgYml0IG1hc2sgZnJvbSBhIGNoYW5uZWwgbWFwLiBcc2luY2UgMC45LjE2ICovCitwYV9jaGFubmVsX3Bvc2l0aW9uX21hc2tfdCBwYV9jaGFubmVsX21hcF9tYXNrKGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXApIFBBX0dDQ19QVVJFOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9jb250ZXh0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmQ0MTMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9jb250ZXh0LmgKQEAgLTAsMCArMSwyODUgQEAKKyNpZm5kZWYgZm9vY29udGV4dGhmb28KKyNkZWZpbmUgZm9vY29udGV4dGhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9zYW1wbGUuaD4KKyNpbmNsdWRlIDxwdWxzZS9kZWYuaD4KKyNpbmNsdWRlIDxwdWxzZS9tYWlubG9vcC1hcGkuaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL29wZXJhdGlvbi5oPgorI2luY2x1ZGUgPHB1bHNlL3Byb3BsaXN0Lmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXHBhZ2UgYXN5bmMgQXN5bmNocm9ub3VzIEFQSQorICoKKyAqIFxzZWN0aW9uIG92ZXJ2X3NlYyBPdmVydmlldworICoKKyAqIFRoZSBhc3luY2hyb25vdXMgQVBJIGlzIHRoZSBuYXRpdmUgaW50ZXJmYWNlIHRvIHRoZSBQdWxzZUF1ZGlvIGxpYnJhcnkuCisgKiBJdCBhbGxvd3MgZnVsbCBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBmdW5jdGlvbmFsaXR5LiBUaGlzIGhvd2V2ZXIgbWVhbnMgdGhhdAorICogaXQgaXMgcmF0aGVyIGNvbXBsZXggYW5kIGNhbiB0YWtlIHNvbWUgdGltZSB0byBmdWxseSBtYXN0ZXIuCisgKgorICogXHNlY3Rpb24gbWFpbmxvb3Bfc2VjIE1haW4gTG9vcCBBYnN0cmFjdGlvbgorICoKKyAqIFRoZSBBUEkgaXMgYmFzZWQgYXJvdW5kIGFuIGFzeW5jaHJvbm91cyBldmVudCBsb29wLCBvciBtYWluIGxvb3AsCisgKiBhYnN0cmFjdGlvbi4gVGhpcyBhYnN0cmFjdGlvbiBjb250YWlucyB0aHJlZSBiYXNpYyBlbGVtZW50czoKKyAqCisgKiBcbGkgRGVmZXJyZWQgZXZlbnRzIC0gRXZlbnRzIHRoYXQgd2lsbCB0cmlnZ2VyIGFzIHNvb24gYXMgcG9zc2libGUuIE5vdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHNvbWUgaW1wbGVtZW50YXRpb25zIG1heSBibG9jayBhbGwgb3RoZXIgZXZlbnRzCisgKiAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBhIGRlZmVycmVkIGV2ZW50IGlzIGFjdGl2ZS4KKyAqIFxsaSBJL08gZXZlbnRzIC0gRXZlbnRzIHRoYXQgdHJpZ2dlciBvbiBmaWxlIGRlc2NyaXB0b3IgYWN0aXZpdGllcy4KKyAqIFxsaSBUaW1lcyBldmVudHMgLSBFdmVudHMgdGhhdCB0cmlnZ2VyIGFmdGVyIGEgZml4ZWQgYW1vdW50IG9mIHRpbWUuCisgKgorICogVGhlIGFic3RyYWN0aW9uIGlzIHJlcHJlc2VudGVkIGFzIGEgbnVtYmVyIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGluIHRoZQorICogcGFfbWFpbmxvb3BfYXBpIHN0cnVjdHVyZS4KKyAqCisgKiBUbyBhY3R1YWxseSBiZSBhYmxlIHRvIHVzZSB0aGVzZSBmdW5jdGlvbnMsIGFuIGltcGxlbWVudGF0aW9uIG5lZWRzIHRvCisgKiBiZSBjb3VwbGVkIHRvIHRoZSBhYnN0cmFjdGlvbi4gVGhlcmUgYXJlIHRocmVlIG9mIHRoZXNlIHNoaXBwZWQgd2l0aAorICogUHVsc2VBdWRpbywgYnV0IGFueSBvdGhlciBjYW4gYmUgdXNlZCB3aXRoIGEgbWluaW1hbCBhbW91bnQgb2Ygd29yaywKKyAqIHByb3ZpZGVkIGl0IHN1cHBvcnRzIHRoZSB0aHJlZSBiYXNpYyBldmVudHMgbGlzdGVkIGFib3ZlLgorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbnMgc2hpcHBlZCB3aXRoIFB1bHNlQXVkaW8gYXJlOgorICoKKyAqIFxsaSBcc3VicGFnZSBtYWlubG9vcCAtIEEgbWluaW1hbCBidXQgZmFzdCBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBwb2xsKCkuCisgKiBcbGkgXHN1YnBhZ2UgdGhyZWFkZWRfbWFpbmxvb3AgLSBBIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgcHJldmlvdXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHdoZXJlIGFsbCBvZiBQdWxzZUF1ZGlvJ3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGhhbmRsaW5nIHJ1bnMgaW4gYSBzZXBhcmF0ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLgorICogXGxpIFxzdWJwYWdlIGdsaWItbWFpbmxvb3AgLSBBIHdyYXBwZXIgYXJvdW5kIEdMaWIncyBtYWluIGxvb3AuCisgKgorICogVU5JWCBzaWduYWxzIG1heSBiZSBob29rZWQgdG8gYSBtYWluIGxvb3AgdXNpbmcgdGhlIGZ1bmN0aW9ucyBmcm9tCisgKiBccmVmIG1haW5sb29wLXNpZ25hbC5oLiBUaGVzZSByZWx5IG9ubHkgb24gdGhlIG1haW4gbG9vcCBhYnN0cmFjdGlvbgorICogYW5kIGNhbiB0aGVyZWZvcmUgYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgaW1wbGVtZW50YXRpb25zLgorICoKKyAqIFxzZWN0aW9uIHJlZmNudF9zZWMgUmVmZXJlbmNlIENvdW50aW5nCisgKgorICogQWxtb3N0IGFsbCBvYmplY3RzIGluIFB1bHNlQXVkaW8gYXJlIHJlZmVyZW5jZSBjb3VudGVkLiBXaGF0IHRoYXQgbWVhbnMKKyAqIGlzIHRoYXQgeW91IHJhcmVseSBtYWxsb2MoKSBvciBmcmVlKCkgYW55IG9iamVjdHMuIEluc3RlYWQgeW91IGluY3JlYXNlCisgKiBhbmQgZGVjcmVhc2UgdGhlaXIgcmVmZXJlbmNlIGNvdW50cy4gV2hlbmV2ZXIgYW4gb2JqZWN0J3MgcmVmZXJlbmNlCisgKiBjb3VudCByZWFjaGVzIHplcm8sIHRoYXQgb2JqZWN0IGdldHMgZGVzdHJveSBhbmQgYW55IHJlc291cmNlcyBpdCB1c2VzCisgKiBnZXQgZnJlZWQuCisgKgorICogVGhlIGJlbmVmaXQgb2YgdGhpcyBkZXNpZ24gaXMgdGhhdCBhbiBhcHBsaWNhdGlvbiBuZWVkIG5vdCB3b3JyeSBhYm91dAorICogd2hldGhlciBvciBub3QgaXQgbmVlZHMgdG8ga2VlcCBhbiBvYmplY3QgYXJvdW5kIGluIGNhc2UgdGhlIGxpYnJhcnkgaXMKKyAqIHVzaW5nIGl0IGludGVybmFsbHkuIElmIGl0IGlzLCB0aGVuIGl0IGhhcyBtYWRlIHN1cmUgaXQgaGFzIGl0cyBvd24KKyAqIHJlZmVyZW5jZSB0byBpdC4KKyAqCisgKiBXaGVuZXZlciB0aGUgbGlicmFyeSBjcmVhdGVzIGFuIG9iamVjdCwgaXQgd2lsbCBoYXZlIGFuIGluaXRpYWwKKyAqIHJlZmVyZW5jZSBjb3VudCBvZiBvbmUuIE1vc3Qgb2YgdGhlIHRpbWUsIHRoaXMgc2luZ2xlIHJlZmVyZW5jZSB3aWxsIGJlCisgKiBzdWZmaWNpZW50IGZvciB0aGUgYXBwbGljYXRpb24sIHNvIGFsbCByZXF1aXJlZCByZWZlcmVuY2UgY291bnQKKyAqIGludGVyYWN0aW9uIHdpbGwgYmUgYSBzaW5nbGUgY2FsbCB0byB0aGUgb2JqZWN0cyB1bnJlZiBmdW5jdGlvbi4KKyAqCisgKiBcc2VjdGlvbiBjb250ZXh0X3NlYyBDb250ZXh0CisgKgorICogQSBjb250ZXh0IGlzIHRoZSBiYXNpYyBvYmplY3QgZm9yIGEgY29ubmVjdGlvbiB0byBhIFB1bHNlQXVkaW8gc2VydmVyLgorICogSXQgbXVsdGlwbGV4ZXMgY29tbWFuZHMsIGRhdGEgc3RyZWFtcyBhbmQgZXZlbnRzIHRocm91Z2ggYSBzaW5nbGUKKyAqIGNoYW5uZWwuCisgKgorICogVGhlcmUgaXMgbm8gbmVlZCBmb3IgbW9yZSB0aGFuIG9uZSBjb250ZXh0IHBlciBhcHBsaWNhdGlvbiwgdW5sZXNzCisgKiBjb25uZWN0aW9ucyB0byBtdWx0aXBsZSBzZXJ2ZXJzIGFyZSBuZWVkZWQuCisgKgorICogXHN1YnNlY3Rpb24gb3BzX3N1YnNlYyBPcGVyYXRpb25zCisgKgorICogQWxsIG9wZXJhdGlvbnMgb24gdGhlIGNvbnRleHQgYXJlIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseS4gSS5lLiB0aGUKKyAqIGNsaWVudCB3aWxsIG5vdCB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0LiBUbyBrZWVwCisgKiB0cmFjayBvZiBhbGwgdGhlc2UgaW4tZmxpZ2h0IG9wZXJhdGlvbnMsIHRoZSBhcHBsaWNhdGlvbiBpcyBnaXZlbiBhCisgKiBwYV9vcGVyYXRpb24gb2JqZWN0IGZvciBlYWNoIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uCisgKgorICogVGhlcmUgYXJlIG9ubHkgdHdvIGFjdGlvbnMgKGJlc2lkZXMgcmVmZXJlbmNlIGNvdW50aW5nKSB0aGF0IGNhbiBiZQorICogcGVyZm9ybWVkIG9uIGEgcGFfb3BlcmF0aW9uOiBxdWVyeWluZyBpdHMgc3RhdGUgd2l0aAorICogcGFfb3BlcmF0aW9uX2dldF9zdGF0ZSgpIGFuZCBhYm9ydGluZyBpdCB3aXRoIHBhX29wZXJhdGlvbl9jYW5jZWwoKS4KKyAqCisgKiBBIHBhX29wZXJhdGlvbiBvYmplY3QgaXMgcmVmZXJlbmNlIGNvdW50ZWQsIHNvIGFuIGFwcGxpY2F0aW9uIG11c3QKKyAqIG1ha2Ugc3VyZSB0byB1bnJlZmVyZW5jZSBpdCwgZXZlbiBpZiBpdCBoYXMgbm8gaW50ZW50aW9uIG9mIHVzaW5nIGl0LgorICoKKyAqIFxzdWJzZWN0aW9uIGNvbm5fc3Vic2VjIENvbm5lY3RpbmcKKyAqCisgKiBBIGNvbnRleHQgbXVzdCBiZSBjb25uZWN0ZWQgdG8gYSBzZXJ2ZXIgYmVmb3JlIGFueSBvcGVyYXRpb24gY2FuIGJlCisgKiBpc3N1ZWQuIENhbGxpbmcgcGFfY29udGV4dF9jb25uZWN0KCkgd2lsbCBpbml0aWF0ZSB0aGUgY29ubmVjdGlvbgorICogcHJvY2VkdXJlLiBVbmxpa2UgbW9zdCBhc3luY2hyb25vdXMgb3BlcmF0aW9ucywgY29ubmVjdGluZyBkb2VzIG5vdAorICogcmVzdWx0IGluIGEgcGFfb3BlcmF0aW9uIG9iamVjdC4gSW5zdGVhZCwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZAorICogcmVnaXN0ZXIgYSBjYWxsYmFjayB1c2luZyBwYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjaygpLgorICoKKyAqIFxzdWJzZWN0aW9uIGRpc2Nfc3Vic2VjIERpc2Nvbm5lY3RpbmcKKyAqCisgKiBXaGVuIHRoZSBzb3VuZCBzdXBwb3J0IGlzIG5vIGxvbmdlciBuZWVkZWQsIHRoZSBjb25uZWN0aW9uIG5lZWRzIHRvIGJlCisgKiBjbG9zZWQgdXNpbmcgcGFfY29udGV4dF9kaXNjb25uZWN0KCkuIFRoaXMgaXMgYW4gaW1tZWRpYXRlIGZ1bmN0aW9uIHRoYXQKKyAqIHdvcmtzIHN5bmNocm9ub3VzbHkuCisgKgorICogU2luY2UgdGhlIGNvbnRleHQgb2JqZWN0IGhhcyByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHMgaXQgbXVzdCBiZQorICogZGlzY29ubmVjdGVkIGFmdGVyIHVzZSBvciB0aGVyZSBpcyBhIGhpZ2ggcmlzayBvZiBtZW1vcnkgbGVha3MuIElmIHRoZQorICogY29ubmVjdGlvbiBoYXMgdGVybWluYXRlZCBieSBpdHNlbGYsIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byBleHBsaWNpdGx5CisgKiBkaXNjb25uZWN0IHRoZSBjb250ZXh0IHVzaW5nIHBhX2NvbnRleHRfZGlzY29ubmVjdCgpLgorICoKKyAqIFxzZWN0aW9uIEZ1bmN0aW9ucworICoKKyAqIFRoZSBzb3VuZCBzZXJ2ZXIncyBmdW5jdGlvbmFsaXR5IGNhbiBiZSBkaXZpZGVkIGludG8gYSBudW1iZXIgb2YKKyAqIHN1YnNlY3Rpb25zOgorICoKKyAqIFxsaSBcc3VicGFnZSBzdHJlYW1zCisgKiBcbGkgXHN1YnBhZ2Ugc2NhY2hlCisgKiBcbGkgXHN1YnBhZ2UgaW50cm9zcGVjdAorICogXGxpIFxzdWJwYWdlIHN1YnNjcmliZQorICovCisKKy8qKiBcZmlsZQorICogQ29ubmVjdGlvbiBjb250ZXh0cyBmb3IgYXN5bmNocm9ub3VzIGNvbW11bmljYXRpb24gd2l0aCBhCisgKiBzZXJ2ZXIuIEEgcGFfY29udGV4dCBvYmplY3Qgd3JhcHMgYSBjb25uZWN0aW9uIHRvIGEgUHVsc2VBdWRpbworICogc2VydmVyIHVzaW5nIGl0cyBuYXRpdmUgcHJvdG9jb2wuCisgKgorICogU2VlIGFsc28gXHN1YnBhZ2UgYXN5bmMKKyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIEFuIG9wYXF1ZSBjb25uZWN0aW9uIGNvbnRleHQgdG8gYSBkYWVtb24gKi8KK3R5cGVkZWYgc3RydWN0IHBhX2NvbnRleHQgcGFfY29udGV4dDsKKworLyoqIEdlbmVyaWMgbm90aWZpY2F0aW9uIGNhbGxiYWNrIHByb3RvdHlwZSAqLwordHlwZWRlZiB2b2lkICgqcGFfY29udGV4dF9ub3RpZnlfY2JfdCkocGFfY29udGV4dCAqYywgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQSBnZW5lcmljIGNhbGxiYWNrIGZvciBvcGVyYXRpb24gY29tcGxldGlvbiAqLwordHlwZWRlZiB2b2lkICgqcGFfY29udGV4dF9zdWNjZXNzX2NiX3QpIChwYV9jb250ZXh0ICpjLCBpbnQgc3VjY2Vzcywgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQSBjYWxsYmFjayBmb3IgYXN5bmNocm9ub3VzIG1ldGEvcG9saWN5IGV2ZW50IG1lc3NhZ2VzLiBUaGUgc2V0CisgKiBvZiBkZWZpbmVkIGV2ZW50cyBjYW4gYmUgZXh0ZW5kZWQgYXQgYW55IHRpbWUuIEFsc28sIHNlcnZlciBtb2R1bGVzCisgKiBtYXkgaW50cm9kdWNlIGFkZGl0aW9uYWwgbWVzc2FnZSB0eXBlcyBzbyBtYWtlIHN1cmUgdGhhdCB5b3VyCisgKiBjYWxsYmFjayBmdW5jdGlvbiBpZ25vcmVzIG1lc3NhZ2VzIGl0IGRvZXNuJ3Qga25vdy4gXHNpbmNlCisgKiAwLjkuMTUgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2NvbnRleHRfZXZlbnRfY2JfdCkocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgcGFfcHJvcGxpc3QgKnAsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEluc3RhbnRpYXRlIGEgbmV3IGNvbm5lY3Rpb24gY29udGV4dCB3aXRoIGFuIGFic3RyYWN0IG1haW5sb29wIEFQSQorICogYW5kIGFuIGFwcGxpY2F0aW9uIG5hbWUuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBwYV9jb250ZXh0X25ld193aXRoX3Byb3BsaXN0KCkKKyAqIGluc3RlYWQgYW5kIHNwZWNpZnkgc29tZSBpbml0aWFsIHByb3BlcnRpZXMuKi8KK3BhX2NvbnRleHQgKnBhX2NvbnRleHRfbmV3KHBhX21haW5sb29wX2FwaSAqbWFpbmxvb3AsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiogSW5zdGFudGlhdGUgYSBuZXcgY29ubmVjdGlvbiBjb250ZXh0IHdpdGggYW4gYWJzdHJhY3QgbWFpbmxvb3AgQVBJCisgKiBhbmQgYW4gYXBwbGljYXRpb24gbmFtZSwgYW5kIHNwZWNpZnkgdGhlIHRoZSBpbml0aWFsIGNsaWVudCBwcm9wZXJ0eQorICogbGlzdC4gXHNpbmNlIDAuOS4xMSAqLworcGFfY29udGV4dCAqcGFfY29udGV4dF9uZXdfd2l0aF9wcm9wbGlzdChwYV9tYWlubG9vcF9hcGkgKm1haW5sb29wLCBjb25zdCBjaGFyICpuYW1lLCBwYV9wcm9wbGlzdCAqcHJvcGxpc3QpOworCisvKiogRGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudGVyIG9mIHRoZSBjb250ZXh0IGJ5IG9uZSAqLwordm9pZCBwYV9jb250ZXh0X3VucmVmKHBhX2NvbnRleHQgKmMpOworCisvKiogSW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudGVyIG9mIHRoZSBjb250ZXh0IGJ5IG9uZSAqLworcGFfY29udGV4dCogcGFfY29udGV4dF9yZWYocGFfY29udGV4dCAqYyk7CisKKy8qKiBTZXQgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgY29udGV4dCBzdGF0dXMgY2hhbmdlcyAqLwordm9pZCBwYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjayhwYV9jb250ZXh0ICpjLCBwYV9jb250ZXh0X25vdGlmeV9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuZXZlciBhIG1ldGEvcG9saWN5CisgKiBjb250cm9sIGV2ZW50IGlzIHJlY2VpdmVkLiBcc2luY2UgMC45LjE1ICovCit2b2lkIHBhX2NvbnRleHRfc2V0X2V2ZW50X2NhbGxiYWNrKHBhX2NvbnRleHQgKnAsIHBhX2NvbnRleHRfZXZlbnRfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmV0dXJuIHRoZSBlcnJvciBudW1iZXIgb2YgdGhlIGxhc3QgZmFpbGVkIG9wZXJhdGlvbiAqLworaW50IHBhX2NvbnRleHRfZXJybm8ocGFfY29udGV4dCAqYyk7CisKKy8qKiBSZXR1cm4gbm9uLXplcm8gaWYgc29tZSBkYXRhIGlzIHBlbmRpbmcgdG8gYmUgd3JpdHRlbiB0byB0aGUgY29ubmVjdGlvbiAqLworaW50IHBhX2NvbnRleHRfaXNfcGVuZGluZyhwYV9jb250ZXh0ICpjKTsKKworLyoqIFJldHVybiB0aGUgY3VycmVudCBjb250ZXh0IHN0YXR1cyAqLworcGFfY29udGV4dF9zdGF0ZV90IHBhX2NvbnRleHRfZ2V0X3N0YXRlKHBhX2NvbnRleHQgKmMpOworCisvKiogQ29ubmVjdCB0aGUgY29udGV4dCB0byB0aGUgc3BlY2lmaWVkIHNlcnZlci4gSWYgc2VydmVyIGlzIE5VTEwsCitjb25uZWN0IHRvIHRoZSBkZWZhdWx0IHNlcnZlci4gVGhpcyByb3V0aW5lIG1heSBidXQgd2lsbCBub3QgYWx3YXlzCityZXR1cm4gc3luY2hyb25vdXNseSBvbiBlcnJvci4gVXNlIHBhX2NvbnRleHRfc2V0X3N0YXRlX2NhbGxiYWNrKCkgdG8KK2JlIG5vdGlmaWVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuIElmIGZsYWdzIGRvZXNuJ3QgaGF2ZQorUEFfQ09OVEVYVF9OT0FVVE9TUEFXTiBzZXQgYW5kIG5vIHNwZWNpZmljIHNlcnZlciBpcyBzcGVjaWZpZWQgb3IKK2FjY2Vzc2libGUgYSBuZXcgZGFlbW9uIGlzIHNwYXduZWQuIElmIGFwaSBpcyBub24tTlVMTCwgdGhlIGZ1bmN0aW9ucworc3BlY2lmaWVkIGluIHRoZSBzdHJ1Y3R1cmUgYXJlIHVzZWQgd2hlbiBmb3JraW5nIGEgbmV3IGNoaWxkCitwcm9jZXNzLiAqLworaW50IHBhX2NvbnRleHRfY29ubmVjdChwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpzZXJ2ZXIsIHBhX2NvbnRleHRfZmxhZ3NfdCBmbGFncywgY29uc3QgcGFfc3Bhd25fYXBpICphcGkpOworCisvKiogVGVybWluYXRlIHRoZSBjb250ZXh0IGNvbm5lY3Rpb24gaW1tZWRpYXRlbHkgKi8KK3ZvaWQgcGFfY29udGV4dF9kaXNjb25uZWN0KHBhX2NvbnRleHQgKmMpOworCisvKiogRHJhaW4gdGhlIGNvbnRleHQuIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZHJhaW4sIHRoZSBmdW5jdGlvbiByZXR1cm5zIE5VTEwgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9kcmFpbihwYV9jb250ZXh0ICpjLCBwYV9jb250ZXh0X25vdGlmeV9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBUZWxsIHRoZSBkYWVtb24gdG8gZXhpdC4gVGhlIHJldHVybmVkIG9wZXJhdGlvbiBpcyB1bmxpa2VseSB0bworICogY29tcGxldGUgc3VjY2Vzc2Z1bGx5LCBzaW5jZSB0aGUgZGFlbW9uIHByb2JhYmx5IGRpZWQgYmVmb3JlCisgKiByZXR1cm5pbmcgYSBzdWNjZXNzIG5vdGlmaWNhdGlvbiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2V4aXRfZGFlbW9uKHBhX2NvbnRleHQgKmMsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgc2luay4gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfZGVmYXVsdF9zaW5rKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKm5hbWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgc291cmNlLiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9kZWZhdWx0X3NvdXJjZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmV0dXJucyAxIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgdG8gYSBsb2NhbCBkYWVtb24uIFJldHVybnMgbmVnYXRpdmUgd2hlbiBubyBjb25uZWN0aW9uIGhhcyBiZWVuIG1hZGUgeWV0LiAqLworaW50IHBhX2NvbnRleHRfaXNfbG9jYWwocGFfY29udGV4dCAqYyk7CisKKy8qKiBTZXQgYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gbmFtZSBmb3IgY29udGV4dCBvbiB0aGUgc2VydmVyLiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9uYW1lKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKm5hbWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBSZXR1cm4gdGhlIHNlcnZlciBuYW1lIHRoaXMgY29udGV4dCBpcyBjb25uZWN0ZWQgdG8uICovCitjb25zdCBjaGFyKiBwYV9jb250ZXh0X2dldF9zZXJ2ZXIocGFfY29udGV4dCAqYyk7CisKKy8qKiBSZXR1cm4gdGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICovCit1aW50MzJfdCBwYV9jb250ZXh0X2dldF9wcm90b2NvbF92ZXJzaW9uKHBhX2NvbnRleHQgKmMpOworCisvKiogUmV0dXJuIHRoZSBwcm90b2NvbCB2ZXJzaW9uIG9mIHRoZSBjb25uZWN0ZWQgc2VydmVyLiAqLwordWludDMyX3QgcGFfY29udGV4dF9nZXRfc2VydmVyX3Byb3RvY29sX3ZlcnNpb24ocGFfY29udGV4dCAqYyk7CisKKy8qKiBVcGRhdGUgdGhlIHByb3BlcnR5IGxpc3Qgb2YgdGhlIGNsaWVudCwgYWRkaW5nIG5ldyBlbnRyaWVzLiBQbGVhc2UKKyAqIG5vdGUgdGhhdCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gc2V0IGFzIG11Y2ggcHJvcGVydGllcworICogaW5pdGlhbGx5IHZpYSBwYV9jb250ZXh0X25ld193aXRoX3Byb3BsaXN0KCkgYXMgcG9zc2libGUgaW5zdGVhZCBhCisgKiBwb3N0ZXJpb3JpIHdpdGggdGhpcyBmdW5jdGlvbiwgc2luY2UgdGhhdCBpbmZvcm1hdGlvbiBtYXkgdGhlbiBiZQorICogdXNlZCB0byByb3V0ZSBzdHJlYW1zIG9mIHRoZSBjbGllbnQgdG8gdGhlIHJpZ2h0IGRldmljZS4gXHNpbmNlIDAuOS4xMSAqLworcGFfb3BlcmF0aW9uICpwYV9jb250ZXh0X3Byb3BsaXN0X3VwZGF0ZShwYV9jb250ZXh0ICpjLCBwYV91cGRhdGVfbW9kZV90IG1vZGUsIHBhX3Byb3BsaXN0ICpwLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogVXBkYXRlIHRoZSBwcm9wZXJ0eSBsaXN0IG9mIHRoZSBjbGllbnQsIHJlbW92ZSBlbnRyaWVzLiBcc2luY2UgMC45LjExICovCitwYV9vcGVyYXRpb24gKnBhX2NvbnRleHRfcHJvcGxpc3RfcmVtb3ZlKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKmNvbnN0IGtleXNbXSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFJldHVybiB0aGUgY2xpZW50IGluZGV4IHRoaXMgY29udGV4dCBpcworICogaWRlbnRpZmllZCBpbiB0aGUgc2VydmVyIHdpdGguIFRoaXMgaXMgdXNlZnVsIGZvciB1c2FnZSB3aXRoIHRoZQorICogaW50cm9zcGVjdGlvbiBmdW5jdGlvbnMsIHN1Y2ggYXMgcGFfY29udGV4dF9nZXRfY2xpZW50X2luZm8oKS4gXHNpbmNlIDAuOS4xMSAqLwordWludDMyX3QgcGFfY29udGV4dF9nZXRfaW5kZXgocGFfY29udGV4dCAqcyk7CisKKy8qKiBDcmVhdGUgYSBuZXcgdGltZXIgZXZlbnQgc291cmNlIGZvciB0aGUgc3BlY2lmaWVkIHRpbWUgKHdyYXBwZXIKKyAqIGZvciBtYWlubG9vcC0+dGltZV9uZXcpLiBcc2luY2UgMC45LjE2ICovCitwYV90aW1lX2V2ZW50KiBwYV9jb250ZXh0X3J0dGltZV9uZXcocGFfY29udGV4dCAqYywgcGFfdXNlY190IHVzZWMsIHBhX3RpbWVfZXZlbnRfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmVzdGFydCBhIHJ1bm5pbmcgb3IgZXhwaXJlZCB0aW1lciBldmVudCBzb3VyY2UgKHdyYXBwZXIgZm9yCisgKiBtYWlubG9vcC0+dGltZV9yZXN0YXJ0KS4gXHNpbmNlIDAuOS4xNiAqLwordm9pZCBwYV9jb250ZXh0X3J0dGltZV9yZXN0YXJ0KHBhX2NvbnRleHQgKmMsIHBhX3RpbWVfZXZlbnQgKmUsIHBhX3VzZWNfdCB1c2VjKTsKKworLyoqIFJldHVybiB0aGUgb3B0aW1hbCBibG9jayBzaXplIGZvciBwYXNzaW5nIGFyb3VuZCBhdWRpbyBidWZmZXJzLiBJdAorICogaXMgcmVjb21tZW5kZWQgdG8gYWxsb2NhdGUgYnVmZmVycyBvZiB0aGUgc2l6ZSByZXR1cm5lZCBoZXJlIHdoZW4KKyAqIHdyaXRpbmcgYXVkaW8gZGF0YSB0byBwbGF5YmFjayBzdHJlYW1zLCBpZiB0aGUgbGF0ZW5jeSBjb25zdHJhaW50cworICogcGVybWl0IHRoaXMuIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB3cml0aW5nIGxhcmdlciBibG9ja3MgdGhhbiB0aGlzCisgKiBiZWNhdXNlIHVzdWFsbHkgdGhleSB3aWxsIHRoZW4gYmUgc3BsaXQgdXAgaW50ZXJuYWxseSBpbnRvIGNodW5rcworICogb2YgdGhpcyBzaXplLiBJdCBpcyBub3QgcmVjb21tZW5kZWQgd3JpdGluZyBzbWFsbGVyIGJsb2NrcyB0aGFuCisgKiB0aGlzICh1bmxlc3MgcmVxdWlyZWQgZHVlIHRvIGxhdGVuY3kgZGVtYW5kcykgYmVjYXVzZSB0aGlzCisgKiBpbmNyZWFzZXMgQ1BVIHVzYWdlLiBJZiBzcyBpcyBOVUxMIHlvdSB3aWxsIGJlIHJldHVybmVkIHRoZQorICogYnl0ZS1leGFjdCB0aWxlIHNpemUuIElmIHlvdSBwYXNzIGEgdmFsaWQgc3MsIHRoZW4gdGhlIHRpbGUgc2l6ZQorICogd2lsbCBiZSByb3VuZGVkIGRvd24gdG8gbXVsdGlwbGUgb2YgdGhlIGZyYW1lIHNpemUuIFRoaXMgaXMKKyAqIHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gYSBjb25zdHJ1Y3Qgc3VjaCBhcworICogcGFfY29udGV4dF9nZXRfdGlsZV9zaXplKHBhX3N0cmVhbV9nZXRfY29udGV4dChzKSwKKyAqIHBhX3N0cmVhbV9nZXRfc2FtcGxlX3NwZWMoc3MpKTsgXHNpbmNlIDAuOS4yMCAqLworc2l6ZV90IHBhX2NvbnRleHRfZ2V0X3RpbGVfc2l6ZShwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9zYW1wbGVfc3BlYyAqc3MpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9kZWYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY5MDA3ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZGVmLmgKQEAgLTAsMCArMSwxMDAxIEBACisjaWZuZGVmIGZvb2RlZmhmb28KKyNkZWZpbmUgZm9vZGVmaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgTGljZW5zZSBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL3NhbXBsZS5oPgorI2luY2x1ZGUgPHB1bHNlL3ZlcnNpb24uaD4KKworLyoqIFxmaWxlCisgKiBHbG9iYWwgZGVmaW5pdGlvbnMgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBUaGUgc3RhdGUgb2YgYSBjb25uZWN0aW9uIGNvbnRleHQgKi8KK3R5cGVkZWYgZW51bSBwYV9jb250ZXh0X3N0YXRlIHsKKyAgICBQQV9DT05URVhUX1VOQ09OTkVDVEVELCAgICAvKio8IFRoZSBjb250ZXh0IGhhc24ndCBiZWVuIGNvbm5lY3RlZCB5ZXQgKi8KKyAgICBQQV9DT05URVhUX0NPTk5FQ1RJTkcsICAgICAvKio8IEEgY29ubmVjdGlvbiBpcyBiZWluZyBlc3RhYmxpc2hlZCAqLworICAgIFBBX0NPTlRFWFRfQVVUSE9SSVpJTkcsICAgIC8qKjwgVGhlIGNsaWVudCBpcyBhdXRob3JpemluZyBpdHNlbGYgdG8gdGhlIGRhZW1vbiAqLworICAgIFBBX0NPTlRFWFRfU0VUVElOR19OQU1FLCAgIC8qKjwgVGhlIGNsaWVudCBpcyBwYXNzaW5nIGl0cyBhcHBsaWNhdGlvbiBuYW1lIHRvIHRoZSBkYWVtb24gKi8KKyAgICBQQV9DT05URVhUX1JFQURZLCAgICAgICAgICAvKio8IFRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCB0aGUgY29udGV4dCBpcyByZWFkeSB0byBleGVjdXRlIG9wZXJhdGlvbnMgKi8KKyAgICBQQV9DT05URVhUX0ZBSUxFRCwgICAgICAgICAvKio8IFRoZSBjb25uZWN0aW9uIGZhaWxlZCBvciB3YXMgZGlzY29ubmVjdGVkICovCisgICAgUEFfQ09OVEVYVF9URVJNSU5BVEVEICAgICAgLyoqPCBUaGUgY29ubmVjdGlvbiB3YXMgdGVybWluYXRlZCBjbGVhbmx5ICovCit9IHBhX2NvbnRleHRfc3RhdGVfdDsKKworLyoqIFJldHVybiBub24temVybyBpZiB0aGUgcGFzc2VkIHN0YXRlIGlzIG9uZSBvZiB0aGUgY29ubmVjdGVkIHN0YXRlcy4gXHNpbmNlIDAuOS4xMSAqLworc3RhdGljIGlubGluZSBpbnQgUEFfQ09OVEVYVF9JU19HT09EKHBhX2NvbnRleHRfc3RhdGVfdCB4KSB7CisgICAgcmV0dXJuCisgICAgICAgIHggPT0gUEFfQ09OVEVYVF9DT05ORUNUSU5HIHx8CisgICAgICAgIHggPT0gUEFfQ09OVEVYVF9BVVRIT1JJWklORyB8fAorICAgICAgICB4ID09IFBBX0NPTlRFWFRfU0VUVElOR19OQU1FIHx8CisgICAgICAgIHggPT0gUEFfQ09OVEVYVF9SRUFEWTsKK30KKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisjZGVmaW5lIFBBX0NPTlRFWFRfVU5DT05ORUNURUQgUEFfQ09OVEVYVF9VTkNPTk5FQ1RFRAorI2RlZmluZSBQQV9DT05URVhUX0NPTk5FQ1RJTkcgUEFfQ09OVEVYVF9DT05ORUNUSU5HCisjZGVmaW5lIFBBX0NPTlRFWFRfQVVUSE9SSVpJTkcgUEFfQ09OVEVYVF9BVVRIT1JJWklORworI2RlZmluZSBQQV9DT05URVhUX1NFVFRJTkdfTkFNRSBQQV9DT05URVhUX1NFVFRJTkdfTkFNRQorI2RlZmluZSBQQV9DT05URVhUX1JFQURZIFBBX0NPTlRFWFRfUkVBRFkKKyNkZWZpbmUgUEFfQ09OVEVYVF9GQUlMRUQgUEFfQ09OVEVYVF9GQUlMRUQKKyNkZWZpbmUgUEFfQ09OVEVYVF9URVJNSU5BVEVEIFBBX0NPTlRFWFRfVEVSTUlOQVRFRAorI2RlZmluZSBQQV9DT05URVhUX0lTX0dPT0QgUEFfQ09OVEVYVF9JU19HT09ECisvKiogXGVuZGNvbmQgKi8KKworLyoqIFRoZSBzdGF0ZSBvZiBhIHN0cmVhbSAqLwordHlwZWRlZiBlbnVtIHBhX3N0cmVhbV9zdGF0ZSB7CisgICAgUEFfU1RSRUFNX1VOQ09OTkVDVEVELCAgLyoqPCBUaGUgc3RyZWFtIGlzIG5vdCB5ZXQgY29ubmVjdGVkIHRvIGFueSBzaW5rIG9yIHNvdXJjZSAqLworICAgIFBBX1NUUkVBTV9DUkVBVElORywgICAgIC8qKjwgVGhlIHN0cmVhbSBpcyBiZWluZyBjcmVhdGVkICovCisgICAgUEFfU1RSRUFNX1JFQURZLCAgICAgICAgLyoqPCBUaGUgc3RyZWFtIGlzIGVzdGFibGlzaGVkLCB5b3UgbWF5IHBhc3MgYXVkaW8gZGF0YSB0byBpdCBub3cgKi8KKyAgICBQQV9TVFJFQU1fRkFJTEVELCAgICAgICAvKio8IEFuIGVycm9yIG9jY3VycmVkIHRoYXQgbWFkZSB0aGUgc3RyZWFtIGludmFsaWQgKi8KKyAgICBQQV9TVFJFQU1fVEVSTUlOQVRFRCAgICAvKio8IFRoZSBzdHJlYW0gaGFzIGJlZW4gdGVybWluYXRlZCBjbGVhbmx5ICovCit9IHBhX3N0cmVhbV9zdGF0ZV90OworCisvKiogUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBwYXNzZWQgc3RhdGUgaXMgb25lIG9mIHRoZSBjb25uZWN0ZWQgc3RhdGVzLiBcc2luY2UgMC45LjExICovCitzdGF0aWMgaW5saW5lIGludCBQQV9TVFJFQU1fSVNfR09PRChwYV9zdHJlYW1fc3RhdGVfdCB4KSB7CisgICAgcmV0dXJuCisgICAgICAgIHggPT0gUEFfU1RSRUFNX0NSRUFUSU5HIHx8CisgICAgICAgIHggPT0gUEFfU1RSRUFNX1JFQURZOworfQorCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyNkZWZpbmUgUEFfU1RSRUFNX1VOQ09OTkVDVEVEIFBBX1NUUkVBTV9VTkNPTk5FQ1RFRAorI2RlZmluZSBQQV9TVFJFQU1fQ1JFQVRJTkcgUEFfU1RSRUFNX0NSRUFUSU5HCisjZGVmaW5lIFBBX1NUUkVBTV9SRUFEWSBQQV9TVFJFQU1fUkVBRFkKKyNkZWZpbmUgUEFfU1RSRUFNX0ZBSUxFRCBQQV9TVFJFQU1fRkFJTEVECisjZGVmaW5lIFBBX1NUUkVBTV9URVJNSU5BVEVEIFBBX1NUUkVBTV9URVJNSU5BVEVECisjZGVmaW5lIFBBX1NUUkVBTV9JU19HT09EIFBBX1NUUkVBTV9JU19HT09ECisvKiogXGVuZGNvbmQgKi8KKworLyoqIFRoZSBzdGF0ZSBvZiBhbiBvcGVyYXRpb24gKi8KK3R5cGVkZWYgZW51bSBwYV9vcGVyYXRpb25fc3RhdGUgeworICAgIFBBX09QRVJBVElPTl9SVU5OSU5HLCAgICAgIC8qKjwgVGhlIG9wZXJhdGlvbiBpcyBzdGlsbCBydW5uaW5nICovCisgICAgUEFfT1BFUkFUSU9OX0RPTkUsICAgICAgICAgLyoqPCBUaGUgb3BlcmF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCAqLworICAgIFBBX09QRVJBVElPTl9DQU5DRUxMRUQgICAgIC8qKjwgVGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQuIEJlZm9yZSAwLjkuMTggdGhpcyB3YXMgY2FsbGVkIFBBX09QRVJBVElPTl9DQU5DRUxFRC4gVGhhdCBuYW1lIGlzIHN0aWxsIGF2YWlsYWJsZSBmb3IgY29tcGF0aWJpbGl0eS4gKi8KK30gcGFfb3BlcmF0aW9uX3N0YXRlX3Q7CisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworI2RlZmluZSBQQV9PUEVSQVRJT05fUlVOTklORyBQQV9PUEVSQVRJT05fUlVOTklORworI2RlZmluZSBQQV9PUEVSQVRJT05fRE9ORSBQQV9PUEVSQVRJT05fRE9ORQorI2RlZmluZSBQQV9PUEVSQVRJT05fQ0FOQ0VMRUQgUEFfT1BFUkFUSU9OX0NBTkNFTExFRAorI2RlZmluZSBQQV9PUEVSQVRJT05fQ0FOQ0VMTEVEIFBBX09QRVJBVElPTl9DQU5DRUxMRUQKKy8qKiBcZW5kY29uZCAqLworCisvKiogQW4gaW52YWxpZCBpbmRleCAqLworI2RlZmluZSBQQV9JTlZBTElEX0lOREVYICgodWludDMyX3QpIC0xKQorCisvKiogU29tZSBzcGVjaWFsIGZsYWdzIGZvciBjb250ZXh0cy4gKi8KK3R5cGVkZWYgZW51bSBwYV9jb250ZXh0X2ZsYWdzIHsKKyAgICBQQV9DT05URVhUX05PRkxBR1MgPSAweDAwMDBVLAorICAgIC8qKjwgRmxhZyB0byBwYXNzIHdoZW4gbm8gc3BlY2lmaWMgb3B0aW9ucyBhcmUgbmVlZGVkICh1c2VkIHRvIGF2b2lkIGNhc3RpbmcpICBcc2luY2UgMC45LjE5ICovCisgICAgUEFfQ09OVEVYVF9OT0FVVE9TUEFXTiA9IDB4MDAwMVUsCisgICAgLyoqPCBEaXNhYmxlZCBhdXRvc3Bhd25pbmcgb2YgdGhlIFB1bHNlQXVkaW8gZGFlbW9uIGlmIHJlcXVpcmVkICovCisgICAgUEFfQ09OVEVYVF9OT0ZBSUwgPSAweDAwMDJVCisgICAgLyoqPCBEb24ndCBmYWlsIGlmIHRoZSBkYWVtb24gaXMgbm90IGF2YWlsYWJsZSB3aGVuIHBhX2NvbnRleHRfY29ubmVjdCgpIGlzIGNhbGxlZCwgaW5zdGVhZCBlbnRlciBQQV9DT05URVhUX0NPTk5FQ1RJTkcgc3RhdGUgYW5kIHdhaXQgZm9yIHRoZSBkYWVtb24gdG8gYXBwZWFyLiAgXHNpbmNlIDAuOS4xNSAqLworfSBwYV9jb250ZXh0X2ZsYWdzX3Q7CisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworLyogQWxsb3cgY2xpZW50cyB0byBjaGVjayB3aXRoICNpZmRlZiBmb3IgdGhvc2UgZmxhZ3MgKi8KKyNkZWZpbmUgUEFfQ09OVEVYVF9OT0FVVE9TUEFXTiBQQV9DT05URVhUX05PQVVUT1NQQVdOCisjZGVmaW5lIFBBX0NPTlRFWFRfTk9GQUlMIFBBX0NPTlRFWFRfTk9GQUlMCisvKiogXGVuZGNvbmQgKi8KKworLyoqIERpcmVjdGlvbiBiaXRmaWVsZCAtIHdoaWxlIHdlIGN1cnJlbnRseSBkbyBub3QgZXhwb3NlIGFueXRoaW5nIGJpZGlyZWN0aW9uYWwsCisgICAgb25lIHNob3VsZCB0ZXN0IGFnYWluc3QgdGhlIGJpdCBpbnN0ZWFkIG9mIHRoZSB2YWx1ZSAoZSBnIGlmIChkICYgUEFfRElSRUNUSU9OX09VVFBVVCkpLAorICAgIGJlY2F1c2Ugd2UgbWlnaHQgYWRkIGJpZGlyZWN0aW9uYWwgc3R1ZmYgaW4gdGhlIGZ1dHVyZS4gXHNpbmNlIDIuMAorKi8KK3R5cGVkZWYgZW51bSBwYV9kaXJlY3Rpb24geworICAgIFBBX0RJUkVDVElPTl9PVVRQVVQgPSAweDAwMDFVLCAgLyoqPCBPdXRwdXQgZGlyZWN0aW9uICovCisgICAgUEFfRElSRUNUSU9OX0lOUFVUID0gMHgwMDAyVSAgICAvKio8IElucHV0IGRpcmVjdGlvbiAqLworfSBwYV9kaXJlY3Rpb25fdDsKKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisjZGVmaW5lIFBBX0RJUkVDVElPTl9PVVRQVVQgUEFfRElSRUNUSU9OX09VVFBVVAorI2RlZmluZSBQQV9ESVJFQ1RJT05fSU5QVVQgUEFfRElSRUNUSU9OX0lOUFVUCisvKiogXGVuZGNvbmQgKi8KKworLyoqIFRoZSB0eXBlIG9mIGRldmljZSB3ZSBhcmUgZGVhbGluZyB3aXRoICovCit0eXBlZGVmIGVudW0gcGFfZGV2aWNlX3R5cGUgeworICAgIFBBX0RFVklDRV9UWVBFX1NJTkssICAgICAvKio8IFBsYXliYWNrIGRldmljZSAqLworICAgIFBBX0RFVklDRV9UWVBFX1NPVVJDRSAgICAvKio8IFJlY29yZGluZyBkZXZpY2UgKi8KK30gcGFfZGV2aWNlX3R5cGVfdDsKKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisjZGVmaW5lIFBBX0RFVklDRV9UWVBFX1NJTksgUEFfREVWSUNFX1RZUEVfU0lOSworI2RlZmluZSBQQV9ERVZJQ0VfVFlQRV9TT1VSQ0UgUEFfREVWSUNFX1RZUEVfU09VUkNFCisvKiogXGVuZGNvbmQgKi8KKworLyoqIFRoZSBkaXJlY3Rpb24gb2YgYSBwYV9zdHJlYW0gb2JqZWN0ICovCit0eXBlZGVmIGVudW0gcGFfc3RyZWFtX2RpcmVjdGlvbiB7CisgICAgUEFfU1RSRUFNX05PRElSRUNUSU9OLCAgIC8qKjwgSW52YWxpZCBkaXJlY3Rpb24gKi8KKyAgICBQQV9TVFJFQU1fUExBWUJBQ0ssICAgICAgLyoqPCBQbGF5YmFjayBzdHJlYW0gKi8KKyAgICBQQV9TVFJFQU1fUkVDT1JELCAgICAgICAgLyoqPCBSZWNvcmQgc3RyZWFtICovCisgICAgUEFfU1RSRUFNX1VQTE9BRCAgICAgICAgIC8qKjwgU2FtcGxlIHVwbG9hZCBzdHJlYW0gKi8KK30gcGFfc3RyZWFtX2RpcmVjdGlvbl90OworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyNkZWZpbmUgUEFfU1RSRUFNX05PRElSRUNUSU9OIFBBX1NUUkVBTV9OT0RJUkVDVElPTgorI2RlZmluZSBQQV9TVFJFQU1fUExBWUJBQ0sgUEFfU1RSRUFNX1BMQVlCQUNLCisjZGVmaW5lIFBBX1NUUkVBTV9SRUNPUkQgUEFfU1RSRUFNX1JFQ09SRAorI2RlZmluZSBQQV9TVFJFQU1fVVBMT0FEIFBBX1NUUkVBTV9VUExPQUQKKy8qKiBcZW5kY29uZCAqLworCisvKiogU29tZSBzcGVjaWFsIGZsYWdzIGZvciBzdHJlYW0gY29ubmVjdGlvbnMuICovCit0eXBlZGVmIGVudW0gcGFfc3RyZWFtX2ZsYWdzIHsKKworICAgIFBBX1NUUkVBTV9OT0ZMQUdTID0gMHgwMDAwVSwKKyAgICAvKio8IEZsYWcgdG8gcGFzcyB3aGVuIG5vIHNwZWNpZmljIG9wdGlvbnMgYXJlIG5lZWRlZCAodXNlZCB0byBhdm9pZCBjYXN0aW5nKSAgXHNpbmNlIDAuOS4xOSAqLworCisgICAgUEFfU1RSRUFNX1NUQVJUX0NPUktFRCA9IDB4MDAwMVUsCisgICAgLyoqPCBDcmVhdGUgdGhlIHN0cmVhbSBjb3JrZWQsIHJlcXVpcmluZyBhbiBleHBsaWNpdAorICAgICAqIHBhX3N0cmVhbV9jb3JrKCkgY2FsbCB0byB1bmNvcmsgaXQuICovCisKKyAgICBQQV9TVFJFQU1fSU5URVJQT0xBVEVfVElNSU5HID0gMHgwMDAyVSwKKyAgICAvKio8IEludGVycG9sYXRlIHRoZSBsYXRlbmN5IGZvciB0aGlzIHN0cmVhbS4gV2hlbiBlbmFibGVkLAorICAgICAqIHBhX3N0cmVhbV9nZXRfbGF0ZW5jeSgpIGFuZCBwYV9zdHJlYW1fZ2V0X3RpbWUoKSB3aWxsIHRyeSB0bworICAgICAqIGVzdGltYXRlIHRoZSBjdXJyZW50IHJlY29yZC9wbGF5YmFjayB0aW1lIGJhc2VkIG9uIHRoZSBsb2NhbAorICAgICAqIHRpbWUgdGhhdCBwYXNzZWQgc2luY2UgdGhlIGxhc3QgdGltaW5nIGluZm8gdXBkYXRlLiAgVXNpbmcgdGhpcworICAgICAqIG9wdGlvbiBoYXMgdGhlIGFkdmFudGFnZSBvZiBub3QgcmVxdWlyaW5nIGEgd2hvbGUgcm91bmR0cmlwCisgICAgICogd2hlbiB0aGUgY3VycmVudCBwbGF5YmFjay9yZWNvcmRpbmcgdGltZSBpcyBuZWVkZWQuIENvbnNpZGVyCisgICAgICogdXNpbmcgdGhpcyBvcHRpb24gd2hlbiByZXF1ZXN0aW5nIGxhdGVuY3kgaW5mb3JtYXRpb24KKyAgICAgKiBmcmVxdWVudGx5LiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIG9uIGxvbmcgbGF0ZW5jeSBuZXR3b3JrCisgICAgICogY29ubmVjdGlvbnMuIEl0IG1ha2VzIGEgbG90IG9mIHNlbnNlIHRvIGNvbWJpbmUgdGhpcyBvcHRpb24KKyAgICAgKiB3aXRoIFBBX1NUUkVBTV9BVVRPX1RJTUlOR19VUERBVEUuICovCisKKyAgICBQQV9TVFJFQU1fTk9UX01PTk9UT05JQyA9IDB4MDAwNFUsCisgICAgLyoqPCBEb24ndCBmb3JjZSB0aGUgdGltZSB0byBpbmNyZWFzZSBtb25vdG9uaWNhbGx5LiBJZiB0aGlzCisgICAgICogb3B0aW9uIGlzIGVuYWJsZWQsIHBhX3N0cmVhbV9nZXRfdGltZSgpIHdpbGwgbm90IG5lY2Vzc2FyaWx5CisgICAgICogcmV0dXJuIGFsd2F5cyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdGltZSB2YWx1ZXMgb24gZWFjaAorICAgICAqIGNhbGwuIFRoaXMgbWF5IGNvbmZ1c2UgYXBwbGljYXRpb25zIHdoaWNoIGNhbm5vdCBkZWFsIHdpdGggdGltZQorICAgICAqIGdvaW5nICdiYWNrd2FyZHMnLCBidXQgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCBiYWQgdHJhbnNwb3J0CisgICAgICogbGF0ZW5jeSBlc3RpbWF0aW9ucyB0aGF0IGNhdXNlZCB0aGUgdGltZSB0byB0byBqdW1wIGFoZWFkIGNhbgorICAgICAqIGJlIGNvcnJlY3RlZCBxdWlja2x5LCB3aXRob3V0IHRoZSBuZWVkIHRvIHdhaXQuIChQbGVhc2Ugbm90ZQorICAgICAqIHRoYXQgdGhpcyBmbGFnIHdhcyBuYW1lZCBQQV9TVFJFQU1fTk9UX01PTk9UT05PVVMgaW4gcmVsZWFzZXMKKyAgICAgKiBwcmlvciB0byAwLjkuMTEuIFRoZSBvbGQgbmFtZSBpcyBzdGlsbCBkZWZpbmVkIHRvbywgZm9yCisgICAgICogY29tcGF0aWJpbGl0eSByZWFzb25zLiAqLworCisgICAgUEFfU1RSRUFNX0FVVE9fVElNSU5HX1VQREFURSA9IDB4MDAwOFUsCisgICAgLyoqPCBJZiBzZXQgdGltaW5nIHVwZGF0ZSByZXF1ZXN0cyBhcmUgaXNzdWVkIHBlcmlvZGljYWxseQorICAgICAqIGF1dG9tYXRpY2FsbHkuIENvbWJpbmVkIHdpdGggUEFfU1RSRUFNX0lOVEVSUE9MQVRFX1RJTUlORyB5b3UKKyAgICAgKiB3aWxsIGJlIGFibGUgdG8gcXVlcnkgdGhlIGN1cnJlbnQgdGltZSBhbmQgbGF0ZW5jeSB3aXRoCisgICAgICogcGFfc3RyZWFtX2dldF90aW1lKCkgYW5kIHBhX3N0cmVhbV9nZXRfbGF0ZW5jeSgpIGF0IGFsbCB0aW1lcworICAgICAqIHdpdGhvdXQgYSBwYWNrZXQgcm91bmQgdHJpcC4qLworCisgICAgUEFfU1RSRUFNX05PX1JFTUFQX0NIQU5ORUxTID0gMHgwMDEwVSwKKyAgICAvKio8IERvbid0IHJlbWFwIGNoYW5uZWxzIGJ5IHRoZWlyIG5hbWUsIGluc3RlYWQgbWFwIHRoZW0gc2ltcGx5CisgICAgICogYnkgdGhlaXIgaW5kZXguIEltcGxpZXMgUEFfU1RSRUFNX05PX1JFTUlYX0NIQU5ORUxTLiBPbmx5CisgICAgICogc3VwcG9ydGVkIHdoZW4gdGhlIHNlcnZlciBpcyBhdCBsZWFzdCBQQSAwLjkuOC4gSXQgaXMgaWdub3JlZAorICAgICAqIG9uIG9sZGVyIHNlcnZlcnMuXHNpbmNlIDAuOS44ICovCisKKyAgICBQQV9TVFJFQU1fTk9fUkVNSVhfQ0hBTk5FTFMgPSAweDAwMjBVLAorICAgIC8qKjwgV2hlbiByZW1hcHBpbmcgY2hhbm5lbHMgYnkgbmFtZSwgZG9uJ3QgdXBtaXggb3IgZG93bm1peCB0aGVtCisgICAgICogdG8gcmVsYXRlZCBjaGFubmVscy4gQ29weSB0aGVtIGludG8gbWF0Y2hpbmcgY2hhbm5lbHMgb2YgdGhlCisgICAgICogZGV2aWNlIDE6MS4gT25seSBzdXBwb3J0ZWQgd2hlbiB0aGUgc2VydmVyIGlzIGF0IGxlYXN0IFBBCisgICAgICogMC45LjguIEl0IGlzIGlnbm9yZWQgb24gb2xkZXIgc2VydmVycy4gXHNpbmNlIDAuOS44ICovCisKKyAgICBQQV9TVFJFQU1fRklYX0ZPUk1BVCA9IDB4MDA0MFUsCisgICAgLyoqPCBVc2UgdGhlIHNhbXBsZSBmb3JtYXQgb2YgdGhlIHNpbmsvZGV2aWNlIHRoaXMgc3RyZWFtIGlzIGJlaW5nCisgICAgICogY29ubmVjdGVkIHRvLCBhbmQgcG9zc2libHkgaWdub3JlIHRoZSBmb3JtYXQgdGhlIHNhbXBsZSBzcGVjCisgICAgICogY29udGFpbnMgLS0gYnV0IHlvdSBzdGlsbCBoYXZlIHRvIHBhc3MgYSB2YWxpZCB2YWx1ZSBpbiBpdCBhcyBhCisgICAgICogaGludCB0byBQdWxzZUF1ZGlvIHdoYXQgd291bGQgc3VpdCB5b3VyIHN0cmVhbSBiZXN0LiBJZiB0aGlzIGlzCisgICAgICogdXNlZCB5b3Ugc2hvdWxkIHF1ZXJ5IHRoZSB1c2VkIHNhbXBsZSBmb3JtYXQgYWZ0ZXIgY3JlYXRpbmcgdGhlCisgICAgICogc3RyZWFtIGJ5IHVzaW5nIHBhX3N0cmVhbV9nZXRfc2FtcGxlX3NwZWMoKS4gQWxzbywgaWYgeW91CisgICAgICogc3BlY2lmaWVkIG1hbnVhbCBidWZmZXIgbWV0cmljcyBpdCBpcyByZWNvbW1lbmRlZCB0byB1cGRhdGUKKyAgICAgKiB0aGVtIHdpdGggcGFfc3RyZWFtX3NldF9idWZmZXJfYXR0cigpIHRvIGNvbXBlbnNhdGUgZm9yIHRoZQorICAgICAqIGNoYW5nZWQgZnJhbWUgc2l6ZXMuIE9ubHkgc3VwcG9ydGVkIHdoZW4gdGhlIHNlcnZlciBpcyBhdCBsZWFzdAorICAgICAqIFBBIDAuOS44LiBJdCBpcyBpZ25vcmVkIG9uIG9sZGVyIHNlcnZlcnMuIFxzaW5jZSAwLjkuOCAqLworCisgICAgUEFfU1RSRUFNX0ZJWF9SQVRFID0gMHgwMDgwVSwKKyAgICAvKio8IFVzZSB0aGUgc2FtcGxlIHJhdGUgb2YgdGhlIHNpbmssIGFuZCBwb3NzaWJseSBpZ25vcmUgdGhlIHJhdGUKKyAgICAgKiB0aGUgc2FtcGxlIHNwZWMgY29udGFpbnMuIFVzYWdlIHNpbWlsYXIgdG8KKyAgICAgKiBQQV9TVFJFQU1fRklYX0ZPUk1BVC5Pbmx5IHN1cHBvcnRlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgYXQgbGVhc3QKKyAgICAgKiBQQSAwLjkuOC4gSXQgaXMgaWdub3JlZCBvbiBvbGRlciBzZXJ2ZXJzLiBcc2luY2UgMC45LjggKi8KKworICAgIFBBX1NUUkVBTV9GSVhfQ0hBTk5FTFMgPSAweDAxMDAsCisgICAgLyoqPCBVc2UgdGhlIG51bWJlciBvZiBjaGFubmVscyBhbmQgdGhlIGNoYW5uZWwgbWFwIG9mIHRoZSBzaW5rLAorICAgICAqIGFuZCBwb3NzaWJseSBpZ25vcmUgdGhlIG51bWJlciBvZiBjaGFubmVscyBhbmQgdGhlIG1hcCB0aGUKKyAgICAgKiBzYW1wbGUgc3BlYyBhbmQgdGhlIHBhc3NlZCBjaGFubmVsIG1hcCBjb250YWlucy4gVXNhZ2Ugc2ltaWxhcgorICAgICAqIHRvIFBBX1NUUkVBTV9GSVhfRk9STUFULiBPbmx5IHN1cHBvcnRlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgYXQKKyAgICAgKiBsZWFzdCBQQSAwLjkuOC4gSXQgaXMgaWdub3JlZCBvbiBvbGRlciBzZXJ2ZXJzLiBcc2luY2UgMC45LjggKi8KKworICAgIFBBX1NUUkVBTV9ET05UX01PVkUgPSAweDAyMDBVLAorICAgIC8qKjwgRG9uJ3QgYWxsb3cgbW92aW5nIG9mIHRoaXMgc3RyZWFtIHRvIGFub3RoZXIKKyAgICAgKiBzaW5rL2RldmljZS4gVXNlZnVsIGlmIHlvdSB1c2UgYW55IG9mIHRoZSBQQV9TVFJFQU1fRklYXyBmbGFncworICAgICAqIGFuZCB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHJlc2FtcGxpbmcgbmV2ZXIgdGFrZXMgcGxhY2UgLS0KKyAgICAgKiB3aGljaCBtaWdodCBoYXBwZW4gaWYgdGhlIHN0cmVhbSBpcyBtb3ZlZCB0byBhbm90aGVyCisgICAgICogc2luay9zb3VyY2Ugd2l0aCBhIGRpZmZlcmVudCBzYW1wbGUgc3BlYy9jaGFubmVsIG1hcC4gT25seQorICAgICAqIHN1cHBvcnRlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgYXQgbGVhc3QgUEEgMC45LjguIEl0IGlzIGlnbm9yZWQKKyAgICAgKiBvbiBvbGRlciBzZXJ2ZXJzLiBcc2luY2UgMC45LjggKi8KKworICAgIFBBX1NUUkVBTV9WQVJJQUJMRV9SQVRFID0gMHgwNDAwVSwKKyAgICAvKio8IEFsbG93IGR5bmFtaWMgY2hhbmdpbmcgb2YgdGhlIHNhbXBsaW5nIHJhdGUgZHVyaW5nIHBsYXliYWNrCisgICAgICogd2l0aCBwYV9zdHJlYW1fdXBkYXRlX3NhbXBsZV9yYXRlKCkuIE9ubHkgc3VwcG9ydGVkIHdoZW4gdGhlCisgICAgICogc2VydmVyIGlzIGF0IGxlYXN0IFBBIDAuOS44LiBJdCBpcyBpZ25vcmVkIG9uIG9sZGVyCisgICAgICogc2VydmVycy4gXHNpbmNlIDAuOS44ICovCisKKyAgICBQQV9TVFJFQU1fUEVBS19ERVRFQ1QgPSAweDA4MDBVLAorICAgIC8qKjwgRmluZCBwZWFrcyBpbnN0ZWFkIG9mIHJlc2FtcGxpbmcuIFxzaW5jZSAwLjkuMTEgKi8KKworICAgIFBBX1NUUkVBTV9TVEFSVF9NVVRFRCA9IDB4MTAwMFUsCisgICAgLyoqPCBDcmVhdGUgaW4gbXV0ZWQgc3RhdGUuIElmIG5laXRoZXIgUEFfU1RSRUFNX1NUQVJUX1VOTVVURUQgbm9yCisgICAgICogUEFfU1RSRUFNX1NUQVJUX01VVEVEIGl0IGlzIGxlZnQgdG8gdGhlIHNlcnZlciB0byBkZWNpZGUKKyAgICAgKiB3aGV0aGVyIHRvIGNyZWF0ZSB0aGUgc3RyZWFtIGluIG11dGVkIG9yIGluIHVubXV0ZWQKKyAgICAgKiBzdGF0ZS4gXHNpbmNlIDAuOS4xMSAqLworCisgICAgUEFfU1RSRUFNX0FESlVTVF9MQVRFTkNZID0gMHgyMDAwVSwKKyAgICAvKio8IFRyeSB0byBhZGp1c3QgdGhlIGxhdGVuY3kgb2YgdGhlIHNpbmsvc291cmNlIGJhc2VkIG9uIHRoZQorICAgICAqIHJlcXVlc3RlZCBidWZmZXIgbWV0cmljcyBhbmQgYWRqdXN0IGJ1ZmZlciBtZXRyaWNzCisgICAgICogYWNjb3JkaW5nbHkuIEFsc28gc2VlIHBhX2J1ZmZlcl9hdHRyLiBUaGlzIG9wdGlvbiBtYXkgbm90IGJlCisgICAgICogc3BlY2lmaWVkIGF0IHRoZSBzYW1lIHRpbWUgYXMgUEFfU1RSRUFNX0VBUkxZX1JFUVVFU1RTLiBcc2luY2UKKyAgICAgKiAwLjkuMTEgKi8KKworICAgIFBBX1NUUkVBTV9FQVJMWV9SRVFVRVNUUyA9IDB4NDAwMFUsCisgICAgLyoqPCBFbmFibGUgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBsZWdhY3kgY2xpZW50cyB0aGF0IHJlbHkgb24gYQorICAgICAqICJjbGFzc2ljIiBoYXJkd2FyZSBkZXZpY2UgZnJhZ21lbnQtc3R5bGUgcGxheWJhY2sgbW9kZWwuIElmCisgICAgICogdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgbWlucmVxIHZhbHVlIG9mIHRoZSBidWZmZXIgbWV0cmljcyBnZXRzCisgICAgICogYSBuZXcgbWVhbmluZzogaW5zdGVhZCBvZiBqdXN0IHNwZWNpZnlpbmcgdGhhdCBubyByZXF1ZXN0cworICAgICAqIGFza2luZyBmb3IgbGVzcyBuZXcgZGF0YSB0aGFuIHRoaXMgdmFsdWUgd2lsbCBiZSBtYWRlIHRvIHRoZQorICAgICAqIGNsaWVudCBpdCB3aWxsIGFsc28gZ3VhcmFudGVlIHRoYXQgcmVxdWVzdHMgYXJlIGdlbmVyYXRlZCBhcworICAgICAqIGVhcmx5IGFzIHRoaXMgbGltaXQgaXMgcmVhY2hlZC4gVGhpcyBmbGFnIHNob3VsZCBvbmx5IGJlIHNldCBpbgorICAgICAqIHZlcnkgZmV3IHNpdHVhdGlvbnMgd2hlcmUgY29tcGF0aWJpbGl0eSB3aXRoIGEgZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBwbGF5YmFjayBtb2RlbCBuZWVkcyB0byBiZSBrZXB0IGFuZCB0aGUgY2xpZW50IGFwcGxpY2F0aW9ucworICAgICAqIGNhbm5vdCBkZWFsIHdpdGggZGF0YSByZXF1ZXN0cyB0aGF0IGFyZSBkZWxheWVkIHRvIHRoZSBsYXRlc3QKKyAgICAgKiBtb21lbnQgcG9zc2libGUuIChVc3VhbGx5IHRoZXNlIGFyZSBwcm9ncmFtcyB0aGF0IHVzZSB1c2xlZXAoKQorICAgICAqIG9yIGEgc2ltaWxhciBjYWxsIGluIHRoZWlyIHBsYXliYWNrIGxvb3BzIGluc3RlYWQgb2Ygc2xlZXBpbmcKKyAgICAgKiBvbiB0aGUgZGV2aWNlIGl0c2VsZi4pIEFsc28gc2VlIHBhX2J1ZmZlcl9hdHRyLiBUaGlzIG9wdGlvbiBtYXkKKyAgICAgKiBub3QgYmUgc3BlY2lmaWVkIGF0IHRoZSBzYW1lIHRpbWUgYXMKKyAgICAgKiBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kuIFxzaW5jZSAwLjkuMTIgKi8KKworICAgIFBBX1NUUkVBTV9ET05UX0lOSElCSVRfQVVUT19TVVNQRU5EID0gMHg4MDAwVSwKKyAgICAvKio8IElmIHNldCB0aGlzIHN0cmVhbSB3b24ndCBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiB3ZSBpdCBpcworICAgICAqIGNoZWNrZWQgd2hldGhlciB0aGUgZGV2aWNlIHRoaXMgc3RyZWFtIGlzIGNvbm5lY3RlZCB0byBzaG91bGQKKyAgICAgKiBhdXRvLXN1c3BlbmQuIFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NUUkVBTV9TVEFSVF9VTk1VVEVEID0gMHgxMDAwMFUsCisgICAgLyoqPCBDcmVhdGUgaW4gdW5tdXRlZCBzdGF0ZS4gSWYgbmVpdGhlciBQQV9TVFJFQU1fU1RBUlRfVU5NVVRFRAorICAgICAqIG5vciBQQV9TVFJFQU1fU1RBUlRfTVVURUQgaXQgaXMgbGVmdCB0byB0aGUgc2VydmVyIHRvIGRlY2lkZQorICAgICAqIHdoZXRoZXIgdG8gY3JlYXRlIHRoZSBzdHJlYW0gaW4gbXV0ZWQgb3IgaW4gdW5tdXRlZAorICAgICAqIHN0YXRlLiBcc2luY2UgMC45LjE1ICovCisKKyAgICBQQV9TVFJFQU1fRkFJTF9PTl9TVVNQRU5EID0gMHgyMDAwMFUsCisgICAgLyoqPCBJZiB0aGUgc2luay9zb3VyY2UgdGhpcyBzdHJlYW0gaXMgY29ubmVjdGVkIHRvIGlzIHN1c3BlbmRlZAorICAgICAqIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgdGhpcyBzdHJlYW0sIGNhdXNlIGl0IHRvIGZhaWwuIElmIHRoZQorICAgICAqIHNpbmsvc291cmNlIGlzIGJlaW5nIHN1c3BlbmRlZCBkdXJpbmcgY3JlYXRpb24gb2YgdGhpcyBzdHJlYW0sCisgICAgICogbWFrZSBzdXJlIHRoaXMgc3RyZWFtIGlzIHRlcm1pbmF0ZWQuIFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NUUkVBTV9SRUxBVElWRV9WT0xVTUUgPSAweDQwMDAwVSwKKyAgICAvKio8IElmIGEgdm9sdW1lIGlzIHBhc3NlZCB3aGVuIHRoaXMgc3RyZWFtIGlzIGNyZWF0ZWQsIGNvbnNpZGVyCisgICAgICogaXQgcmVsYXRpdmUgdG8gdGhlIHNpbmsncyBjdXJyZW50IHZvbHVtZSwgbmV2ZXIgYXMgYWJzb2x1dGUKKyAgICAgKiBkZXZpY2Ugdm9sdW1lLiBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQgdGhlIHZvbHVtZSB3aWxsIGJlCisgICAgICogY29uc2lkZXIgYWJzb2x1dGUgd2hlbiB0aGUgc2luayBpcyBpbiBmbGF0IHZvbHVtZSBtb2RlLAorICAgICAqIHJlbGF0aXZlIG90aGVyd2lzZS4gXHNpbmNlIDAuOS4yMCAqLworCisgICAgUEFfU1RSRUFNX1BBU1NUSFJPVUdIID0gMHg4MDAwMFUKKyAgICAvKio8IFVzZWQgdG8gdGFnIGNvbnRlbnQgdGhhdCB3aWxsIGJlIHJlbmRlcmVkIGJ5IHBhc3N0aHJvdWdoIHNpbmtzLgorICAgICAqIFRoZSBkYXRhIHdpbGwgYmUgbGVmdCBhcyBpcyBhbmQgbm90IHJlZm9ybWF0dGVkLCByZXNhbXBsZWQuCisgICAgICogXHNpbmNlIDEuMCAqLworCit9IHBhX3N0cmVhbV9mbGFnc190OworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKworLyogRW5nbGlzaCBpcyBhbiBldmlsIGxhbmd1YWdlICovCisjZGVmaW5lIFBBX1NUUkVBTV9OT1RfTU9OT1RPTk9VUyBQQV9TVFJFQU1fTk9UX01PTk9UT05JQworCisvKiBBbGxvdyBjbGllbnRzIHRvIGNoZWNrIHdpdGggI2lmZGVmIGZvciB0aG9zZSBmbGFncyAqLworI2RlZmluZSBQQV9TVFJFQU1fU1RBUlRfQ09SS0VEIFBBX1NUUkVBTV9TVEFSVF9DT1JLRUQKKyNkZWZpbmUgUEFfU1RSRUFNX0lOVEVSUE9MQVRFX1RJTUlORyBQQV9TVFJFQU1fSU5URVJQT0xBVEVfVElNSU5HCisjZGVmaW5lIFBBX1NUUkVBTV9OT1RfTU9OT1RPTklDIFBBX1NUUkVBTV9OT1RfTU9OT1RPTklDCisjZGVmaW5lIFBBX1NUUkVBTV9BVVRPX1RJTUlOR19VUERBVEUgUEFfU1RSRUFNX0FVVE9fVElNSU5HX1VQREFURQorI2RlZmluZSBQQV9TVFJFQU1fTk9fUkVNQVBfQ0hBTk5FTFMgUEFfU1RSRUFNX05PX1JFTUFQX0NIQU5ORUxTCisjZGVmaW5lIFBBX1NUUkVBTV9OT19SRU1JWF9DSEFOTkVMUyBQQV9TVFJFQU1fTk9fUkVNSVhfQ0hBTk5FTFMKKyNkZWZpbmUgUEFfU1RSRUFNX0ZJWF9GT1JNQVQgUEFfU1RSRUFNX0ZJWF9GT1JNQVQKKyNkZWZpbmUgUEFfU1RSRUFNX0ZJWF9SQVRFIFBBX1NUUkVBTV9GSVhfUkFURQorI2RlZmluZSBQQV9TVFJFQU1fRklYX0NIQU5ORUxTIFBBX1NUUkVBTV9GSVhfQ0hBTk5FTFMKKyNkZWZpbmUgUEFfU1RSRUFNX0RPTlRfTU9WRSBQQV9TVFJFQU1fRE9OVF9NT1ZFCisjZGVmaW5lIFBBX1NUUkVBTV9WQVJJQUJMRV9SQVRFIFBBX1NUUkVBTV9WQVJJQUJMRV9SQVRFCisjZGVmaW5lIFBBX1NUUkVBTV9QRUFLX0RFVEVDVCBQQV9TVFJFQU1fUEVBS19ERVRFQ1QKKyNkZWZpbmUgUEFfU1RSRUFNX1NUQVJUX01VVEVEIFBBX1NUUkVBTV9TVEFSVF9NVVRFRAorI2RlZmluZSBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kgUEFfU1RSRUFNX0FESlVTVF9MQVRFTkNZCisjZGVmaW5lIFBBX1NUUkVBTV9FQVJMWV9SRVFVRVNUUyBQQV9TVFJFQU1fRUFSTFlfUkVRVUVTVFMKKyNkZWZpbmUgUEFfU1RSRUFNX0RPTlRfSU5ISUJJVF9BVVRPX1NVU1BFTkQgUEFfU1RSRUFNX0RPTlRfSU5ISUJJVF9BVVRPX1NVU1BFTkQKKyNkZWZpbmUgUEFfU1RSRUFNX1NUQVJUX1VOTVVURUQgUEFfU1RSRUFNX1NUQVJUX1VOTVVURUQKKyNkZWZpbmUgUEFfU1RSRUFNX0ZBSUxfT05fU1VTUEVORCBQQV9TVFJFQU1fRkFJTF9PTl9TVVNQRU5ECisjZGVmaW5lIFBBX1NUUkVBTV9SRUxBVElWRV9WT0xVTUUgUEFfU1RSRUFNX1JFTEFUSVZFX1ZPTFVNRQorI2RlZmluZSBQQV9TVFJFQU1fUEFTU1RIUk9VR0ggUEFfU1RSRUFNX1BBU1NUSFJPVUdICisKKy8qKiBcZW5kY29uZCAqLworCisvKiogUGxheWJhY2sgYW5kIHJlY29yZCBidWZmZXIgbWV0cmljcyAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfYnVmZmVyX2F0dHIgeworICAgIHVpbnQzMl90IG1heGxlbmd0aDsKKyAgICAvKio8IE1heGltdW0gbGVuZ3RoIG9mIHRoZSBidWZmZXIuIFNldHRpbmcgdGhpcyB0byAodWludDMyX3QpIC0xCisgICAgICogd2lsbCBpbml0aWFsaXplIHRoaXMgdG8gdGhlIG1heGltdW0gdmFsdWUgc3VwcG9ydGVkIGJ5IHNlcnZlciwKKyAgICAgKiB3aGljaCBpcyByZWNvbW1lbmRlZC4gKi8KKworICAgIHVpbnQzMl90IHRsZW5ndGg7CisgICAgLyoqPCBQbGF5YmFjayBvbmx5OiB0YXJnZXQgbGVuZ3RoIG9mIHRoZSBidWZmZXIuIFRoZSBzZXJ2ZXIgdHJpZXMKKyAgICAgKiB0byBhc3N1cmUgdGhhdCBhdCBsZWFzdCB0bGVuZ3RoIGJ5dGVzIGFyZSBhbHdheXMgYXZhaWxhYmxlIGluCisgICAgICogdGhlIHBlci1zdHJlYW0gc2VydmVyLXNpZGUgcGxheWJhY2sgYnVmZmVyLiBJdCBpcyByZWNvbW1lbmRlZAorICAgICAqIHRvIHNldCB0aGlzIHRvICh1aW50MzJfdCkgLTEsIHdoaWNoIHdpbGwgaW5pdGlhbGl6ZSB0aGlzIHRvIGEKKyAgICAgKiB2YWx1ZSB0aGF0IGlzIGRlZW1lZCBzZW5zaWJsZSBieSB0aGUgc2VydmVyLiBIb3dldmVyLCB0aGlzCisgICAgICogdmFsdWUgd2lsbCBkZWZhdWx0IHRvIHNvbWV0aGluZyBsaWtlIDJzLCBpLmUuIGZvciBhcHBsaWNhdGlvbnMKKyAgICAgKiB0aGF0IGhhdmUgc3BlY2lmaWMgbGF0ZW5jeSByZXF1aXJlbWVudHMgdGhpcyB2YWx1ZSBzaG91bGQgYmUKKyAgICAgKiBzZXQgdG8gdGhlIG1heGltdW0gbGF0ZW5jeSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjYW4gZGVhbAorICAgICAqIHdpdGguIFdoZW4gUEFfU1RSRUFNX0FESlVTVF9MQVRFTkNZIGlzIG5vdCBzZXQgdGhpcyB2YWx1ZSB3aWxsCisgICAgICogaW5mbHVlbmNlIG9ubHkgdGhlIHBlci1zdHJlYW0gcGxheWJhY2sgYnVmZmVyIHNpemUuIFdoZW4KKyAgICAgKiBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kgaXMgc2V0IHRoZSBvdmVyYWxsIGxhdGVuY3kgb2YgdGhlIHNpbmsKKyAgICAgKiBwbHVzIHRoZSBwbGF5YmFjayBidWZmZXIgc2l6ZSBpcyBjb25maWd1cmVkIHRvIHRoaXMgdmFsdWUuIFNldAorICAgICAqIFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWSBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gYWRqdXN0aW5nIHRoZQorICAgICAqIG92ZXJhbGwgbGF0ZW5jeS4gRG9uJ3Qgc2V0IGl0IGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbgorICAgICAqIGNvbmZpZ3VyaW5nIHRoZSBzZXJ2ZXItc2lkZSBwZXItc3RyZWFtIHBsYXliYWNrIGJ1ZmZlcgorICAgICAqIHNpemUuICovCisKKyAgICB1aW50MzJfdCBwcmVidWY7CisgICAgLyoqPCBQbGF5YmFjayBvbmx5OiBwcmUtYnVmZmVyaW5nLiBUaGUgc2VydmVyIGRvZXMgbm90IHN0YXJ0IHdpdGgKKyAgICAgKiBwbGF5YmFjayBiZWZvcmUgYXQgbGVhc3QgcHJlYnVmIGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlCisgICAgICogYnVmZmVyLiBJdCBpcyByZWNvbW1lbmRlZCB0byBzZXQgdGhpcyB0byAodWludDMyX3QpIC0xLCB3aGljaAorICAgICAqIHdpbGwgaW5pdGlhbGl6ZSB0aGlzIHRvIHRoZSBzYW1lIHZhbHVlIGFzIHRsZW5ndGgsIHdoYXRldmVyCisgICAgICogdGhhdCBtYXkgYmUuIEluaXRpYWxpemUgdG8gMCB0byBlbmFibGUgbWFudWFsIHN0YXJ0L3N0b3AKKyAgICAgKiBjb250cm9sIG9mIHRoZSBzdHJlYW0uIFRoaXMgbWVhbnMgdGhhdCBwbGF5YmFjayB3aWxsIG5vdCBzdG9wCisgICAgICogb24gdW5kZXJydW4gYW5kIHBsYXliYWNrIHdpbGwgbm90IHN0YXJ0IGF1dG9tYXRpY2FsbHkuIEluc3RlYWQKKyAgICAgKiBwYV9zdHJlYW1fY29yaygpIG5lZWRzIHRvIGJlIGNhbGxlZCBleHBsaWNpdGx5LiBJZiB5b3Ugc2V0CisgICAgICogdGhpcyB2YWx1ZSB0byAwIHlvdSBzaG91bGQgYWxzbyBzZXQgUEFfU1RSRUFNX1NUQVJUX0NPUktFRC4gKi8KKworICAgIHVpbnQzMl90IG1pbnJlcTsKKyAgICAvKio8IFBsYXliYWNrIG9ubHk6IG1pbmltdW0gcmVxdWVzdC4gVGhlIHNlcnZlciBkb2VzIG5vdCByZXF1ZXN0CisgICAgICogbGVzcyB0aGFuIG1pbnJlcSBieXRlcyBmcm9tIHRoZSBjbGllbnQsIGluc3RlYWQgd2FpdHMgdW50aWwgdGhlCisgICAgICogYnVmZmVyIGlzIGZyZWUgZW5vdWdoIHRvIHJlcXVlc3QgbW9yZSBieXRlcyBhdCBvbmNlLiBJdCBpcworICAgICAqIHJlY29tbWVuZGVkIHRvIHNldCB0aGlzIHRvICh1aW50MzJfdCkgLTEsIHdoaWNoIHdpbGwgaW5pdGlhbGl6ZQorICAgICAqIHRoaXMgdG8gYSB2YWx1ZSB0aGF0IGlzIGRlZW1lZCBzZW5zaWJsZSBieSB0aGUgc2VydmVyLiBUaGlzCisgICAgICogc2hvdWxkIGJlIHNldCB0byBhIHZhbHVlIHRoYXQgZ2l2ZXMgUHVsc2VBdWRpbyBlbm91Z2ggdGltZSB0bworICAgICAqIG1vdmUgdGhlIGRhdGEgZnJvbSB0aGUgcGVyLXN0cmVhbSBwbGF5YmFjayBidWZmZXIgaW50byB0aGUKKyAgICAgKiBoYXJkd2FyZSBwbGF5YmFjayBidWZmZXIuICovCisKKyAgICB1aW50MzJfdCBmcmFnc2l6ZTsKKyAgICAvKio8IFJlY29yZGluZyBvbmx5OiBmcmFnbWVudCBzaXplLiBUaGUgc2VydmVyIHNlbmRzIGRhdGEgaW4KKyAgICAgKiBibG9ja3Mgb2YgZnJhZ3NpemUgYnl0ZXMgc2l6ZS4gTGFyZ2UgdmFsdWVzIGRpbWluaXNoCisgICAgICogaW50ZXJhY3Rpdml0eSB3aXRoIG90aGVyIG9wZXJhdGlvbnMgb24gdGhlIGNvbm5lY3Rpb24gY29udGV4dAorICAgICAqIGJ1dCBkZWNyZWFzZSBjb250cm9sIG92ZXJoZWFkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBzZXQgdGhpcyB0bworICAgICAqICh1aW50MzJfdCkgLTEsIHdoaWNoIHdpbGwgaW5pdGlhbGl6ZSB0aGlzIHRvIGEgdmFsdWUgdGhhdCBpcworICAgICAqIGRlZW1lZCBzZW5zaWJsZSBieSB0aGUgc2VydmVyLiBIb3dldmVyLCB0aGlzIHZhbHVlIHdpbGwgZGVmYXVsdAorICAgICAqIHRvIHNvbWV0aGluZyBsaWtlIDJzLCBpLmUuIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBoYXZlIHNwZWNpZmljCisgICAgICogbGF0ZW5jeSByZXF1aXJlbWVudHMgdGhpcyB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBtYXhpbXVtCisgICAgICogbGF0ZW5jeSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjYW4gZGVhbCB3aXRoLiBJZgorICAgICAqIFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWSBpcyBzZXQgdGhlIG92ZXJhbGwgc291cmNlIGxhdGVuY3kgd2lsbAorICAgICAqIGJlIGFkanVzdGVkIGFjY29yZGluZyB0byB0aGlzIHZhbHVlLiBJZiBpdCBpcyBub3Qgc2V0IHRoZQorICAgICAqIHNvdXJjZSBsYXRlbmN5IGlzIGxlZnQgdW5tb2RpZmllZC4gKi8KKworfSBwYV9idWZmZXJfYXR0cjsKKworLyoqIEVycm9yIHZhbHVlcyBhcyB1c2VkIGJ5IHBhX2NvbnRleHRfZXJybm8oKS4gVXNlIHBhX3N0cmVycm9yKCkgdG8gY29udmVydCB0aGVzZSB2YWx1ZXMgdG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncyAqLworZW51bSB7CisgICAgUEFfT0sgPSAwLCAgICAgICAgICAgICAgICAgICAgIC8qKjwgTm8gZXJyb3IgKi8KKyAgICBQQV9FUlJfQUNDRVNTLCAgICAgICAgICAgICAgICAgLyoqPCBBY2Nlc3MgZmFpbHVyZSAqLworICAgIFBBX0VSUl9DT01NQU5ELCAgICAgICAgICAgICAgICAvKio8IFVua25vd24gY29tbWFuZCAqLworICAgIFBBX0VSUl9JTlZBTElELCAgICAgICAgICAgICAgICAvKio8IEludmFsaWQgYXJndW1lbnQgKi8KKyAgICBQQV9FUlJfRVhJU1QsICAgICAgICAgICAgICAgICAgLyoqPCBFbnRpdHkgZXhpc3RzICovCisgICAgUEFfRVJSX05PRU5USVRZLCAgICAgICAgICAgICAgIC8qKjwgTm8gc3VjaCBlbnRpdHkgKi8KKyAgICBQQV9FUlJfQ09OTkVDVElPTlJFRlVTRUQsICAgICAgLyoqPCBDb25uZWN0aW9uIHJlZnVzZWQgKi8KKyAgICBQQV9FUlJfUFJPVE9DT0wsICAgICAgICAgICAgICAgLyoqPCBQcm90b2NvbCBlcnJvciAqLworICAgIFBBX0VSUl9USU1FT1VULCAgICAgICAgICAgICAgICAvKio8IFRpbWVvdXQgKi8KKyAgICBQQV9FUlJfQVVUSEtFWSwgICAgICAgICAgICAgICAgLyoqPCBObyBhdXRob3JpemF0aW9uIGtleSAqLworICAgIFBBX0VSUl9JTlRFUk5BTCwgICAgICAgICAgICAgICAvKio8IEludGVybmFsIGVycm9yICovCisgICAgUEFfRVJSX0NPTk5FQ1RJT05URVJNSU5BVEVELCAgIC8qKjwgQ29ubmVjdGlvbiB0ZXJtaW5hdGVkICovCisgICAgUEFfRVJSX0tJTExFRCwgICAgICAgICAgICAgICAgIC8qKjwgRW50aXR5IGtpbGxlZCAqLworICAgIFBBX0VSUl9JTlZBTElEU0VSVkVSLCAgICAgICAgICAvKio8IEludmFsaWQgc2VydmVyICovCisgICAgUEFfRVJSX01PRElOSVRGQUlMRUQsICAgICAgICAgIC8qKjwgTW9kdWxlIGluaXRpYWxpemF0aW9uIGZhaWxlZCAqLworICAgIFBBX0VSUl9CQURTVEFURSwgICAgICAgICAgICAgICAvKio8IEJhZCBzdGF0ZSAqLworICAgIFBBX0VSUl9OT0RBVEEsICAgICAgICAgICAgICAgICAvKio8IE5vIGRhdGEgKi8KKyAgICBQQV9FUlJfVkVSU0lPTiwgICAgICAgICAgICAgICAgLyoqPCBJbmNvbXBhdGlibGUgcHJvdG9jb2wgdmVyc2lvbiAqLworICAgIFBBX0VSUl9UT09MQVJHRSwgICAgICAgICAgICAgICAvKio8IERhdGEgdG9vIGxhcmdlICovCisgICAgUEFfRVJSX05PVFNVUFBPUlRFRCwgICAgICAgICAgIC8qKjwgT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgXHNpbmNlIDAuOS41ICovCisgICAgUEFfRVJSX1VOS05PV04sICAgICAgICAgICAgICAgIC8qKjwgVGhlIGVycm9yIGNvZGUgd2FzIHVua25vd24gdG8gdGhlIGNsaWVudCAqLworICAgIFBBX0VSUl9OT0VYVEVOU0lPTiwgICAgICAgICAgICAvKio8IEV4dGVuc2lvbiBkb2VzIG5vdCBleGlzdC4gXHNpbmNlIDAuOS4xMiAqLworICAgIFBBX0VSUl9PQlNPTEVURSwgICAgICAgICAgICAgICAvKio8IE9ic29sZXRlIGZ1bmN0aW9uYWxpdHkuIFxzaW5jZSAwLjkuMTUgKi8KKyAgICBQQV9FUlJfTk9USU1QTEVNRU5URUQsICAgICAgICAgLyoqPCBNaXNzaW5nIGltcGxlbWVudGF0aW9uLiBcc2luY2UgMC45LjE1ICovCisgICAgUEFfRVJSX0ZPUktFRCwgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGNhbGxlciBmb3JrZWQgd2l0aG91dCBjYWxsaW5nIGV4ZWN2ZSgpIGFuZCB0cmllZCB0byByZXVzZSB0aGUgY29udGV4dC4gXHNpbmNlIDAuOS4xNSAqLworICAgIFBBX0VSUl9JTywgICAgICAgICAgICAgICAgICAgICAvKio8IEFuIElPIGVycm9yIGhhcHBlbmVkLiBcc2luY2UgMC45LjE2ICovCisgICAgUEFfRVJSX0JVU1ksICAgICAgICAgICAgICAgICAgIC8qKjwgRGV2aWNlIG9yIHJlc291cmNlIGJ1c3kuIFxzaW5jZSAwLjkuMTcgKi8KKyAgICBQQV9FUlJfTUFYICAgICAgICAgICAgICAgICAgICAgLyoqPCBOb3QgcmVhbGx5IGFuIGVycm9yIGJ1dCB0aGUgZmlyc3QgaW52YWxpZCBlcnJvciBjb2RlICovCit9OworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyNkZWZpbmUgUEFfT0sgUEFfT0sKKyNkZWZpbmUgUEFfRVJSX0FDQ0VTUyBQQV9FUlJfQUNDRVNTCisjZGVmaW5lIFBBX0VSUl9DT01NQU5EIFBBX0VSUl9DT01NQU5ECisjZGVmaW5lIFBBX0VSUl9JTlZBTElEIFBBX0VSUl9JTlZBTElECisjZGVmaW5lIFBBX0VSUl9FWElTVCBQQV9FUlJfRVhJU1QKKyNkZWZpbmUgUEFfRVJSX05PRU5USVRZIFBBX0VSUl9OT0VOVElUWQorI2RlZmluZSBQQV9FUlJfQ09OTkVDVElPTlJFRlVTRUQgUEFfRVJSX0NPTk5FQ1RJT05SRUZVU0VECisjZGVmaW5lIFBBX0VSUl9QUk9UT0NPTCBQQV9FUlJfUFJPVE9DT0wKKyNkZWZpbmUgUEFfRVJSX1RJTUVPVVQgUEFfRVJSX1RJTUVPVVQKKyNkZWZpbmUgUEFfRVJSX0FVVEhLRVkgUEFfRVJSX0FVVEhLRVkKKyNkZWZpbmUgUEFfRVJSX0lOVEVSTkFMIFBBX0VSUl9JTlRFUk5BTAorI2RlZmluZSBQQV9FUlJfQ09OTkVDVElPTlRFUk1JTkFURUQgUEFfRVJSX0NPTk5FQ1RJT05URVJNSU5BVEVECisjZGVmaW5lIFBBX0VSUl9LSUxMRUQgUEFfRVJSX0tJTExFRAorI2RlZmluZSBQQV9FUlJfSU5WQUxJRFNFUlZFUiBQQV9FUlJfSU5WQUxJRFNFUlZFUgorI2RlZmluZSBQQV9FUlJfTU9ESU5JVEZBSUxFRCBQQV9FUlJfTU9ESU5JVEZBSUxFRAorI2RlZmluZSBQQV9FUlJfQkFEU1RBVEUgUEFfRVJSX0JBRFNUQVRFCisjZGVmaW5lIFBBX0VSUl9OT0RBVEEgUEFfRVJSX05PREFUQQorI2RlZmluZSBQQV9FUlJfVkVSU0lPTiBQQV9FUlJfVkVSU0lPTgorI2RlZmluZSBQQV9FUlJfVE9PTEFSR0UgUEFfRVJSX1RPT0xBUkdFCisjZGVmaW5lIFBBX0VSUl9OT1RTVVBQT1JURUQgUEFfRVJSX05PVFNVUFBPUlRFRAorI2RlZmluZSBQQV9FUlJfVU5LTk9XTiBQQV9FUlJfVU5LTk9XTgorI2RlZmluZSBQQV9FUlJfTk9FWFRFTlNJT04gUEFfRVJSX05PRVhURU5TSU9OCisjZGVmaW5lIFBBX0VSUl9PQlNPTEVURSBQQV9FUlJfT0JTT0xFVEUKKyNkZWZpbmUgUEFfRVJSX05PVElNUExFTUVOVEVEIFBBX0VSUl9OT1RJTVBMRU1FTlRFRAorI2RlZmluZSBQQV9FUlJfRk9SS0VEIFBBX0VSUl9GT1JLRUQKKyNkZWZpbmUgUEFfRVJSX01BWCBQQV9FUlJfTUFYCisvKiogXGVuZGNvbmQgKi8KKworLyoqIFN1YnNjcmlwdGlvbiBldmVudCBtYXNrLCBhcyB1c2VkIGJ5IHBhX2NvbnRleHRfc3Vic2NyaWJlKCkgKi8KK3R5cGVkZWYgZW51bSBwYV9zdWJzY3JpcHRpb25fbWFzayB7CisgICAgUEFfU1VCU0NSSVBUSU9OX01BU0tfTlVMTCA9IDB4MDAwMFUsCisgICAgLyoqPCBObyBldmVudHMgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX1NJTksgPSAweDAwMDFVLAorICAgIC8qKjwgU2luayBldmVudHMgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX1NPVVJDRSA9IDB4MDAwMlUsCisgICAgLyoqPCBTb3VyY2UgZXZlbnRzICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19TSU5LX0lOUFVUID0gMHgwMDA0VSwKKyAgICAvKio8IFNpbmsgaW5wdXQgZXZlbnRzICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19TT1VSQ0VfT1VUUFVUID0gMHgwMDA4VSwKKyAgICAvKio8IFNvdXJjZSBvdXRwdXQgZXZlbnRzICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19NT0RVTEUgPSAweDAwMTBVLAorICAgIC8qKjwgTW9kdWxlIGV2ZW50cyAqLworCisgICAgUEFfU1VCU0NSSVBUSU9OX01BU0tfQ0xJRU5UID0gMHgwMDIwVSwKKyAgICAvKio8IENsaWVudCBldmVudHMgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX1NBTVBMRV9DQUNIRSA9IDB4MDA0MFUsCisgICAgLyoqPCBTYW1wbGUgY2FjaGUgZXZlbnRzICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19TRVJWRVIgPSAweDAwODBVLAorICAgIC8qKjwgT3RoZXIgZ2xvYmFsIHNlcnZlciBjaGFuZ2VzLiAqLworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19BVVRPTE9BRCA9IDB4MDEwMFUsCisgICAgLyoqPCBcZGVwcmVjYXRlZCBBdXRvbG9hZCB0YWJsZSBldmVudHMuICovCisvKiogXGVuZGNvbmQgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX0NBUkQgPSAweDAyMDBVLAorICAgIC8qKjwgQ2FyZCBldmVudHMuIFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX0FMTCA9IDB4MDJmZlUKKyAgICAvKio8IENhdGNoIGFsbCBldmVudHMgKi8KK30gcGFfc3Vic2NyaXB0aW9uX21hc2tfdDsKKworLyoqIFN1YnNjcmlwdGlvbiBldmVudCB0eXBlcywgYXMgdXNlZCBieSBwYV9jb250ZXh0X3N1YnNjcmliZSgpICovCit0eXBlZGVmIGVudW0gcGFfc3Vic2NyaXB0aW9uX2V2ZW50X3R5cGUgeworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9TSU5LID0gMHgwMDAwVSwKKyAgICAvKio8IEV2ZW50IHR5cGU6IFNpbmsgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9TT1VSQ0UgPSAweDAwMDFVLAorICAgIC8qKjwgRXZlbnQgdHlwZTogU291cmNlICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU0lOS19JTlBVVCA9IDB4MDAwMlUsCisgICAgLyoqPCBFdmVudCB0eXBlOiBTaW5rIGlucHV0ICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU09VUkNFX09VVFBVVCA9IDB4MDAwM1UsCisgICAgLyoqPCBFdmVudCB0eXBlOiBTb3VyY2Ugb3V0cHV0ICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfTU9EVUxFID0gMHgwMDA0VSwKKyAgICAvKio8IEV2ZW50IHR5cGU6IE1vZHVsZSAqLworCisgICAgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0NMSUVOVCA9IDB4MDAwNVUsCisgICAgLyoqPCBFdmVudCB0eXBlOiBDbGllbnQgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9TQU1QTEVfQ0FDSEUgPSAweDAwMDZVLAorICAgIC8qKjwgRXZlbnQgdHlwZTogU2FtcGxlIGNhY2hlIGl0ZW0gKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9TRVJWRVIgPSAweDAwMDdVLAorICAgIC8qKjwgRXZlbnQgdHlwZTogR2xvYmFsIHNlcnZlciBjaGFuZ2UsIG9ubHkgb2NjdXJyaW5nIHdpdGggUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0NIQU5HRS4gKi8KKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisgICAgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0FVVE9MT0FEID0gMHgwMDA4VSwKKyAgICAvKio8IFxkZXByZWNhdGVkIEV2ZW50IHR5cGU6IEF1dG9sb2FkIHRhYmxlIGNoYW5nZXMuICovCisvKiogXGVuZGNvbmQgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9DQVJEID0gMHgwMDA5VSwKKyAgICAvKio8IEV2ZW50IHR5cGU6IENhcmQgXHNpbmNlIDAuOS4xNSAqLworCisgICAgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0ZBQ0lMSVRZX01BU0sgPSAweDAwMEZVLAorICAgIC8qKjwgQSBtYXNrIHRvIGV4dHJhY3QgdGhlIGV2ZW50IHR5cGUgZnJvbSBhbiBldmVudCB2YWx1ZSAqLworCisgICAgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX05FVyA9IDB4MDAwMFUsCisgICAgLyoqPCBBIG5ldyBvYmplY3Qgd2FzIGNyZWF0ZWQgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9DSEFOR0UgPSAweDAwMTBVLAorICAgIC8qKjwgQSBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0IHdhcyBtb2RpZmllZCAqLworCisgICAgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1JFTU9WRSA9IDB4MDAyMFUsCisgICAgLyoqPCBBbiBvYmplY3Qgd2FzIHJlbW92ZWQgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9UWVBFX01BU0sgPSAweDAwMzBVCisgICAgLyoqPCBBIG1hc2sgdG8gZXh0cmFjdCB0aGUgZXZlbnQgb3BlcmF0aW9uIGZyb20gYW4gZXZlbnQgdmFsdWUgKi8KKworfSBwYV9zdWJzY3JpcHRpb25fZXZlbnRfdHlwZV90OworCisvKiogUmV0dXJuIG9uZSBpZiBhbiBldmVudCB0eXBlIHQgbWF0Y2hlcyBhbiBldmVudCBtYXNrIGJpdGZpZWxkICovCisjZGVmaW5lIHBhX3N1YnNjcmlwdGlvbl9tYXRjaF9mbGFncyhtLCB0KSAoISEoKG0pICYgKDEgPDwgKCh0KSAmIFBBX1NVQlNDUklQVElPTl9FVkVOVF9GQUNJTElUWV9NQVNLKSkpKQorCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX01BU0tfTlVMTCBQQV9TVUJTQ1JJUFRJT05fTUFTS19OVUxMCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9NQVNLX1NJTksgUEFfU1VCU0NSSVBUSU9OX01BU0tfU0lOSworI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fTUFTS19TT1VSQ0UgUEFfU1VCU0NSSVBUSU9OX01BU0tfU09VUkNFCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9NQVNLX1NJTktfSU5QVVQgUEFfU1VCU0NSSVBUSU9OX01BU0tfU0lOS19JTlBVVAorI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fTUFTS19TT1VSQ0VfT1VUUFVUIFBBX1NVQlNDUklQVElPTl9NQVNLX1NPVVJDRV9PVVRQVVQKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX01BU0tfTU9EVUxFIFBBX1NVQlNDUklQVElPTl9NQVNLX01PRFVMRQorI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fTUFTS19DTElFTlQgUEFfU1VCU0NSSVBUSU9OX01BU0tfQ0xJRU5UCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9NQVNLX1NBTVBMRV9DQUNIRSBQQV9TVUJTQ1JJUFRJT05fTUFTS19TQU1QTEVfQ0FDSEUKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX01BU0tfU0VSVkVSIFBBX1NVQlNDUklQVElPTl9NQVNLX1NFUlZFUgorI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fTUFTS19BVVRPTE9BRCBQQV9TVUJTQ1JJUFRJT05fTUFTS19BVVRPTE9BRAorI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fTUFTS19DQVJEIFBBX1NVQlNDUklQVElPTl9NQVNLX0NBUkQKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX01BU0tfQUxMIFBBX1NVQlNDUklQVElPTl9NQVNLX0FMTAorI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU0lOSyBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU0lOSworI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU09VUkNFIFBBX1NVQlNDUklQVElPTl9FVkVOVF9TT1VSQ0UKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NJTktfSU5QVVQgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NJTktfSU5QVVQKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NPVVJDRV9PVVRQVVQgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NPVVJDRV9PVVRQVVQKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX01PRFVMRSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfTU9EVUxFCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9FVkVOVF9DTElFTlQgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0NMSUVOVAorI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU0FNUExFX0NBQ0hFIFBBX1NVQlNDUklQVElPTl9FVkVOVF9TQU1QTEVfQ0FDSEUKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NFUlZFUiBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU0VSVkVSCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9FVkVOVF9BVVRPTE9BRCBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfQVVUT0xPQUQKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0NBUkQgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0NBUkQKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0ZBQ0lMSVRZX01BU0sgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0ZBQ0lMSVRZX01BU0sKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX05FVyBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfTkVXCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9FVkVOVF9DSEFOR0UgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0NIQU5HRQorI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfUkVNT1ZFIFBBX1NVQlNDUklQVElPTl9FVkVOVF9SRU1PVkUKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1RZUEVfTUFTSyBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfVFlQRV9NQVNLCisvKiogXGVuZGNvbmQgKi8KKworLyoqIEEgc3RydWN0dXJlIGZvciBhbGwga2luZHMgb2YgdGltaW5nIGluZm9ybWF0aW9uIG9mIGEgc3RyZWFtLiBTZWUKKyAqIHBhX3N0cmVhbV91cGRhdGVfdGltaW5nX2luZm8oKSBhbmQgcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbygpLiBUaGUKKyAqIHRvdGFsIG91dHB1dCBsYXRlbmN5IGEgc2FtcGxlIHRoYXQgaXMgd3JpdHRlbiB3aXRoCisgKiBwYV9zdHJlYW1fd3JpdGUoKSB0YWtlcyB0byBiZSBwbGF5ZWQgbWF5IGJlIGVzdGltYXRlZCBieQorICogc2lua191c2VjK2J1ZmZlcl91c2VjK3RyYW5zcG9ydF91c2VjLiAod2hlcmUgYnVmZmVyX3VzZWMgaXMgZGVmaW5lZAorICogYXMgcGFfYnl0ZXNfdG9fdXNlYyh3cml0ZV9pbmRleC1yZWFkX2luZGV4KSkgVGhlIG91dHB1dCBidWZmZXIKKyAqIHdoaWNoIGJ1ZmZlcl91c2VjIHJlbGF0ZXMgdG8gbWF5IGJlIG1hbmlwdWxhdGVkIGZyZWVseSAod2l0aAorICogcGFfc3RyZWFtX3dyaXRlKCkncyBzZWVrIGFyZ3VtZW50LCBwYV9zdHJlYW1fZmx1c2goKSBhbmQgZnJpZW5kcyksCisgKiB0aGUgYnVmZmVycyBzaW5rX3VzZWMgYW5kIHNvdXJjZV91c2VjIHJlbGF0ZSB0byBhcmUgZmlyc3QtaW4KKyAqIGZpcnN0LW91dCAoRklGTykgYnVmZmVycyB3aGljaCBjYW5ub3QgYmUgZmx1c2hlZCBvciBtYW5pcHVsYXRlZCBpbgorICogYW55IHdheS4gVGhlIHRvdGFsIGlucHV0IGxhdGVuY3kgYSBzYW1wbGUgdGhhdCBpcyByZWNvcmRlZCB0YWtlcyB0bworICogYmUgZGVsaXZlcmVkIHRvIHRoZSBhcHBsaWNhdGlvbiBpczoKKyAqIHNvdXJjZV91c2VjK2J1ZmZlcl91c2VjK3RyYW5zcG9ydF91c2VjLXNpbmtfdXNlYy4gKFRha2UgY2FyZSBvZgorICogc2lnbiBpc3N1ZXMhKSBXaGVuIGNvbm5lY3RlZCB0byBhIG1vbml0b3Igc291cmNlIHNpbmtfdXNlYyBjb250YWlucworICogdGhlIGxhdGVuY3kgb2YgdGhlIG93bmluZyBzaW5rLiBUaGUgdHdvIGxhdGVuY3kgZXN0aW1hdGlvbnMKKyAqIGRlc2NyaWJlZCBoZXJlIGFyZSBpbXBsZW1lbnRlZCBpbiBwYV9zdHJlYW1fZ2V0X2xhdGVuY3koKS4gUGxlYXNlCisgKiBub3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgY2FuIGJlIGV4dGVuZGVkIGFzIHBhcnQgb2YgZXZvbHV0aW9uYXJ5CisgKiBBUEkgdXBkYXRlcyBhdCBhbnkgdGltZSBpbiBhbnkgbmV3IHJlbGVhc2UuKi8KK3R5cGVkZWYgc3RydWN0IHBhX3RpbWluZ19pbmZvIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lc3RhbXA7CisgICAgLyoqPCBUaGUgdGltZSB3aGVuIHRoaXMgdGltaW5nIGluZm8gc3RydWN0dXJlIHdhcyBjdXJyZW50ICovCisKKyAgICBpbnQgc3luY2hyb25pemVkX2Nsb2NrczsKKyAgICAvKio8IE5vbi16ZXJvIGlmIHRoZSBsb2NhbCBhbmQgdGhlIHJlbW90ZSBtYWNoaW5lIGhhdmUKKyAgICAgKiBzeW5jaHJvbml6ZWQgY2xvY2tzLiBJZiBzeW5jaHJvbml6ZWQgY2xvY2tzIGFyZSBkZXRlY3RlZAorICAgICAqIHRyYW5zcG9ydF91c2VjIGJlY29tZXMgbXVjaCBtb3JlIHJlbGlhYmxlLiBIb3dldmVyLCB0aGUgY29kZQorICAgICAqIHRoYXQgZGV0ZWN0cyBzeW5jaHJvbml6ZWQgY2xvY2tzIGlzIHZlcnkgbGltaXRlZCBhbmQgdW5yZWxpYWJsZQorICAgICAqIGl0c2VsZi4gKi8KKworICAgIHBhX3VzZWNfdCBzaW5rX3VzZWM7CisgICAgLyoqPCBUaW1lIGluIHVzZWNzIGEgc2FtcGxlIHRha2VzIHRvIGJlIHBsYXllZCBvbiB0aGUgc2luay4gRm9yCisgICAgICogcGxheWJhY2sgc3RyZWFtcyBhbmQgcmVjb3JkIHN0cmVhbXMgY29ubmVjdGVkIHRvIGEgbW9uaXRvcgorICAgICAqIHNvdXJjZS4gKi8KKworICAgIHBhX3VzZWNfdCBzb3VyY2VfdXNlYzsKKyAgICAvKio8IFRpbWUgaW4gdXNlY3MgYSBzYW1wbGUgdGFrZXMgZnJvbSBiZWluZyByZWNvcmRlZCB0byBiZWluZworICAgICAqIGRlbGl2ZXJlZCB0byB0aGUgYXBwbGljYXRpb24uIE9ubHkgZm9yIHJlY29yZCBzdHJlYW1zLiAqLworCisgICAgcGFfdXNlY190IHRyYW5zcG9ydF91c2VjOworICAgIC8qKjwgRXN0aW1hdGVkIHRpbWUgaW4gdXNlY3MgYSBzYW1wbGUgdGFrZXMgdG8gYmUgdHJhbnNmZXJyZWQKKyAgICAgKiB0by9mcm9tIHRoZSBkYWVtb24uIEZvciBib3RoIHBsYXliYWNrIGFuZCByZWNvcmQgc3RyZWFtcy4gKi8KKworICAgIGludCBwbGF5aW5nOworICAgIC8qKjwgTm9uLXplcm8gd2hlbiB0aGUgc3RyZWFtIGlzIGN1cnJlbnRseSBub3QgdW5kZXJydW4gYW5kIGRhdGEKKyAgICAgKiBpcyBiZWluZyBwYXNzZWQgb24gdG8gdGhlIGRldmljZS4gT25seSBmb3IgcGxheWJhY2sKKyAgICAgKiBzdHJlYW1zLiBUaGlzIGZpZWxkIGRvZXMgbm90IHNheSB3aGV0aGVyIHRoZSBkYXRhIGlzIGFjdHVhbGx5CisgICAgICogYWxyZWFkeSBiZWluZyBwbGF5ZWQuIFRvIGRldGVybWluZSB0aGlzIGNoZWNrIHdoZXRoZXIKKyAgICAgKiBzaW5jZV91bmRlcnJ1biAoY29udmVydGVkIHRvIHVzZWMpIGlzIGxhcmdlciB0aGFuIHNpbmtfdXNlYy4qLworCisgICAgaW50IHdyaXRlX2luZGV4X2NvcnJ1cHQ7CisgICAgLyoqPCBOb24temVybyBpZiB3cml0ZV9pbmRleCBpcyBub3QgdXAtdG8tZGF0ZSBiZWNhdXNlIGEgbG9jYWwKKyAgICAgKiB3cml0ZSBjb21tYW5kIHRoYXQgY29ycnVwdGVkIGl0IGhhcyBiZWVuIGlzc3VlZCBpbiB0aGUgdGltZQorICAgICAqIHNpbmNlIHRoaXMgbGF0ZW5jeSBpbmZvIHdhcyBjdXJyZW50IC4gT25seSB3cml0ZSBjb21tYW5kcyB3aXRoCisgICAgICogU0VFS19SRUxBVElWRV9PTl9SRUFEIGFuZCBTRUVLX1JFTEFUSVZFX0VORCBjYW4gY29ycnVwdAorICAgICAqIHdyaXRlX2luZGV4LiAqLworCisgICAgaW50NjRfdCB3cml0ZV9pbmRleDsKKyAgICAvKio8IEN1cnJlbnQgd3JpdGUgaW5kZXggaW50byB0aGUgcGxheWJhY2sgYnVmZmVyIGluIGJ5dGVzLiBUaGluaworICAgICAqIHR3aWNlIGJlZm9yZSB1c2luZyB0aGlzIGZvciBzZWVraW5nIHB1cnBvc2VzOiBpdCBtaWdodCBiZSBvdXQKKyAgICAgKiBvZiBkYXRlIGEgdGhlIHRpbWUgeW91IHdhbnQgdG8gdXNlIGl0LiBDb25zaWRlciB1c2luZworICAgICAqIFBBX1NFRUtfUkVMQVRJVkUgaW5zdGVhZC4gKi8KKworICAgIGludCByZWFkX2luZGV4X2NvcnJ1cHQ7CisgICAgLyoqPCBOb24temVybyBpZiByZWFkX2luZGV4IGlzIG5vdCB1cC10by1kYXRlIGJlY2F1c2UgYSBsb2NhbAorICAgICAqIHBhdXNlIG9yIGZsdXNoIHJlcXVlc3QgdGhhdCBjb3JydXB0ZWQgaXQgaGFzIGJlZW4gaXNzdWVkIGluIHRoZQorICAgICAqIHRpbWUgc2luY2UgdGhpcyBsYXRlbmN5IGluZm8gd2FzIGN1cnJlbnQuICovCisKKyAgICBpbnQ2NF90IHJlYWRfaW5kZXg7CisgICAgLyoqPCBDdXJyZW50IHJlYWQgaW5kZXggaW50byB0aGUgcGxheWJhY2sgYnVmZmVyIGluIGJ5dGVzLiBUaGluaworICAgICAqIHR3aWNlIGJlZm9yZSB1c2luZyB0aGlzIGZvciBzZWVraW5nIHB1cnBvc2VzOiBpdCBtaWdodCBiZSBvdXQKKyAgICAgKiBvZiBkYXRlIGEgdGhlIHRpbWUgeW91IHdhbnQgdG8gdXNlIGl0LiBDb25zaWRlciB1c2luZworICAgICAqIFBBX1NFRUtfUkVMQVRJVkVfT05fUkVBRCBpbnN0ZWFkLiAqLworCisgICAgcGFfdXNlY190IGNvbmZpZ3VyZWRfc2lua191c2VjOworICAgIC8qKjwgVGhlIGNvbmZpZ3VyZWQgbGF0ZW5jeSBmb3IgdGhlIHNpbmsuIFxzaW5jZSAwLjkuMTEgKi8KKworICAgIHBhX3VzZWNfdCBjb25maWd1cmVkX3NvdXJjZV91c2VjOworICAgIC8qKjwgVGhlIGNvbmZpZ3VyZWQgbGF0ZW5jeSBmb3IgdGhlIHNvdXJjZS4gXHNpbmNlIDAuOS4xMSAqLworCisgICAgaW50NjRfdCBzaW5jZV91bmRlcnJ1bjsKKyAgICAvKio8IEJ5dGVzIHRoYXQgd2VyZSBoYW5kZWQgdG8gdGhlIHNpbmsgc2luY2UgdGhlIGxhc3QgdW5kZXJydW4KKyAgICAgKiBoYXBwZW5lZCwgb3Igc2luY2UgcGxheWJhY2sgc3RhcnRlZCBhZ2FpbiBhZnRlciB0aGUgbGFzdAorICAgICAqIHVuZGVycnVuLiBwbGF5aW5nIHdpbGwgdGVsbCB5b3Ugd2hpY2ggY2FzZSBpdCBpcy4gXHNpbmNlCisgICAgICogMC45LjExICovCisKK30gcGFfdGltaW5nX2luZm87CisKKy8qKiBBIHN0cnVjdHVyZSBmb3IgdGhlIHNwYXduIGFwaS4gVGhpcyBtYXkgYmUgdXNlZCB0byBpbnRlZ3JhdGUgYXV0bworICogc3Bhd25lZCBkYWVtb25zIGludG8geW91ciBhcHBsaWNhdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlCisgKiBwYV9jb250ZXh0X2Nvbm5lY3QoKS4gV2hlbiBzcGF3bmluZyBhIG5ldyBjaGlsZCBwcm9jZXNzIHRoZQorICogd2FpdHBpZCgpIGlzIHVzZWQgb24gdGhlIGNoaWxkJ3MgUElELiBUaGUgc3Bhd24gcm91dGluZSB3aWxsIG5vdAorICogYmxvY2sgb3IgaWdub3JlIFNJR0NITEQgc2lnbmFscywgc2luY2UgdGhpcyBjYW5ub3QgYmUgZG9uZSBpbiBhCisgKiB0aHJlYWQgY29tcGF0aWJsZSB3YXkuIFlvdSBtaWdodCBoYXZlIHRvIGRvIHRoaXMgaW4KKyAqIHByZWZvcmsvcG9zdGZvcmsuICovCit0eXBlZGVmIHN0cnVjdCBwYV9zcGF3bl9hcGkgeworICAgIHZvaWQgKCpwcmVmb3JrKSh2b2lkKTsKKyAgICAvKio8IElzIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgZm9yayBpbiB0aGUgcGFyZW50IHByb2Nlc3MuIE1heSBiZQorICAgICAqIE5VTEwuICovCisKKyAgICB2b2lkICgqcG9zdGZvcmspKHZvaWQpOworICAgIC8qKjwgSXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmb3JrIGluIHRoZSBwYXJlbnQKKyAgICAgKiBwcm9jZXNzLiBNYXkgYmUgTlVMTC4qLworCisgICAgdm9pZCAoKmF0Zm9yaykodm9pZCk7CisgICAgLyoqPCBJcyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZvcmsgaW4gdGhlIGNoaWxkCisgICAgICogcHJvY2Vzcy4gTWF5IGJlIE5VTEwuIEl0IGlzIG5vdCBzYWZlIHRvIGNsb3NlIGFsbCBmaWxlCisgICAgICogZGVzY3JpcHRvcnMgaW4gdGhpcyBmdW5jdGlvbiB1bmNvbmRpdGlvbmFsbHksIHNpbmNlIGEgVU5JWAorICAgICAqIHNvY2tldCAoY3JlYXRlZCB1c2luZyBzb2NrZXRwYWlyKCkpIGlzIHBhc3NlZCB0byB0aGUgbmV3CisgICAgICogcHJvY2Vzcy4gKi8KK30gcGFfc3Bhd25fYXBpOworCisvKiogU2VlayB0eXBlIGZvciBwYV9zdHJlYW1fd3JpdGUoKS4gKi8KK3R5cGVkZWYgZW51bSBwYV9zZWVrX21vZGUgeworICAgIFBBX1NFRUtfUkVMQVRJVkUgPSAwLAorICAgIC8qKjwgU2VlayByZWxhdGl2ZWx5IHRvIHRoZSB3cml0ZSBpbmRleCAqLworCisgICAgUEFfU0VFS19BQlNPTFVURSA9IDEsCisgICAgLyoqPCBTZWVrIHJlbGF0aXZlbHkgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgcXVldWUgKi8KKworICAgIFBBX1NFRUtfUkVMQVRJVkVfT05fUkVBRCA9IDIsCisgICAgLyoqPCBTZWVrIHJlbGF0aXZlbHkgdG8gdGhlIHJlYWQgaW5kZXguICAqLworCisgICAgUEFfU0VFS19SRUxBVElWRV9FTkQgPSAzCisgICAgLyoqPCBTZWVrIHJlbGF0aXZlbHkgdG8gdGhlIGN1cnJlbnQgZW5kIG9mIHRoZSBidWZmZXIgcXVldWUuICovCit9IHBhX3NlZWtfbW9kZV90OworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyNkZWZpbmUgUEFfU0VFS19SRUxBVElWRSBQQV9TRUVLX1JFTEFUSVZFCisjZGVmaW5lIFBBX1NFRUtfQUJTT0xVVEUgUEFfU0VFS19BQlNPTFVURQorI2RlZmluZSBQQV9TRUVLX1JFTEFUSVZFX09OX1JFQUQgUEFfU0VFS19SRUxBVElWRV9PTl9SRUFECisjZGVmaW5lIFBBX1NFRUtfUkVMQVRJVkVfRU5EIFBBX1NFRUtfUkVMQVRJVkVfRU5ECisvKiogXGVuZGNvbmQgKi8KKworLyoqIFNwZWNpYWwgc2luayBmbGFncy4gKi8KK3R5cGVkZWYgZW51bSBwYV9zaW5rX2ZsYWdzIHsKKyAgICBQQV9TSU5LX05PRkxBR1MgPSAweDAwMDBVLAorICAgIC8qKjwgRmxhZyB0byBwYXNzIHdoZW4gbm8gc3BlY2lmaWMgb3B0aW9ucyBhcmUgbmVlZGVkICh1c2VkIHRvIGF2b2lkIGNhc3RpbmcpICBcc2luY2UgMC45LjE5ICovCisKKyAgICBQQV9TSU5LX0hXX1ZPTFVNRV9DVFJMID0gMHgwMDAxVSwKKyAgICAvKio8IFN1cHBvcnRzIGhhcmR3YXJlIHZvbHVtZSBjb250cm9sLiBUaGlzIGlzIGEgZHluYW1pYyBmbGFnIGFuZCBtYXkKKyAgICAgKiBjaGFuZ2UgYXQgcnVudGltZSBhZnRlciB0aGUgc2luayBoYXMgaW5pdGlhbGl6ZWQgKi8KKworICAgIFBBX1NJTktfTEFURU5DWSA9IDB4MDAwMlUsCisgICAgLyoqPCBTdXBwb3J0cyBsYXRlbmN5IHF1ZXJ5aW5nICovCisKKyAgICBQQV9TSU5LX0hBUkRXQVJFID0gMHgwMDA0VSwKKyAgICAvKio8IElzIGEgaGFyZHdhcmUgc2luayBvZiBzb21lIGtpbmQsIGluIGNvbnRyYXN0IHRvCisgICAgICogInZpcnR1YWwiL3NvZnR3YXJlIHNpbmtzIFxzaW5jZSAwLjkuMyAqLworCisgICAgUEFfU0lOS19ORVRXT1JLID0gMHgwMDA4VSwKKyAgICAvKio8IElzIGEgbmV0d29ya2VkIHNpbmsgb2Ygc29tZSBraW5kLiBcc2luY2UgMC45LjcgKi8KKworICAgIFBBX1NJTktfSFdfTVVURV9DVFJMID0gMHgwMDEwVSwKKyAgICAvKio8IFN1cHBvcnRzIGhhcmR3YXJlIG11dGUgY29udHJvbC4gVGhpcyBpcyBhIGR5bmFtaWMgZmxhZyBhbmQgbWF5CisgICAgICogY2hhbmdlIGF0IHJ1bnRpbWUgYWZ0ZXIgdGhlIHNpbmsgaGFzIGluaXRpYWxpemVkIFxzaW5jZSAwLjkuMTEgKi8KKworICAgIFBBX1NJTktfREVDSUJFTF9WT0xVTUUgPSAweDAwMjBVLAorICAgIC8qKjwgVm9sdW1lIGNhbiBiZSB0cmFuc2xhdGVkIHRvIGRCIHdpdGggcGFfc3dfdm9sdW1lX3RvX2RCKCkuIFRoaXMgaXMgYQorICAgICAqIGR5bmFtaWMgZmxhZyBhbmQgbWF5IGNoYW5nZSBhdCBydW50aW1lIGFmdGVyIHRoZSBzaW5rIGhhcyBpbml0aWFsaXplZAorICAgICAqIFxzaW5jZSAwLjkuMTEgKi8KKworICAgIFBBX1NJTktfRkxBVF9WT0xVTUUgPSAweDAwNDBVLAorICAgIC8qKjwgVGhpcyBzaW5rIGlzIGluIGZsYXQgdm9sdW1lIG1vZGUsIGkuZS4gYWx3YXlzIHRoZSBtYXhpbXVtIG9mCisgICAgICogdGhlIHZvbHVtZSBvZiBhbGwgY29ubmVjdGVkIGlucHV0cy4gXHNpbmNlIDAuOS4xNSAqLworCisgICAgUEFfU0lOS19EWU5BTUlDX0xBVEVOQ1kgPSAweDAwODBVLAorICAgIC8qKjwgVGhlIGxhdGVuY3kgY2FuIGJlIGFkanVzdGVkIGR5bmFtaWNhbGx5IGRlcGVuZGluZyBvbiB0aGUKKyAgICAgKiBuZWVkcyBvZiB0aGUgY29ubmVjdGVkIHN0cmVhbXMuIFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NJTktfU0VUX0ZPUk1BVFMgPSAweDAxMDBVLAorICAgIC8qKjwgVGhlIHNpbmsgYWxsb3dzIHNldHRpbmcgd2hhdCBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbm5lY3RlZAorICAgICAqIGhhcmR3YXJlLiBUaGUgYWN0dWFsIGZ1bmN0aW9uYWxpdHkgdG8gZG8gdGhpcyBtaWdodCBiZSBwcm92aWRlZCBieSBhbgorICAgICAqIGV4dGVuc2lvbi4gXHNpbmNlIDEuMCAqLworCisjaWZkZWYgX19JTkNMVURFRF9GUk9NX1BVTFNFX0FVRElPCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyAgICAvKiBQUklWQVRFOiBTZXJ2ZXItc2lkZSB2YWx1ZXMgLS0gZG8gbm90IHRyeSB0byB1c2UgdGhlc2UgYXQgY2xpZW50LXNpZGUuCisgICAgICogVGhlIHNlcnZlciB3aWxsIGZpbHRlciBvdXQgdGhlc2UgZmxhZ3MgYW55d2F5LCBzbyB5b3Ugc2hvdWxkIG5ldmVyIHNlZQorICAgICAqIHRoZXNlIGZsYWdzIGluIHNpbmtzLiAqLworCisgICAgUEFfU0lOS19TSEFSRV9WT0xVTUVfV0lUSF9NQVNURVIgPSAweDEwMDAwMDBVLAorICAgIC8qKjwgVGhpcyBzaW5rIHNoYXJlcyB0aGUgdm9sdW1lIHdpdGggdGhlIG1hc3RlciBzaW5rICh1c2VkIGJ5IHNvbWUgZmlsdGVyCisgICAgICogc2lua3MpLiAqLworCisgICAgUEFfU0lOS19ERUZFUlJFRF9WT0xVTUUgPSAweDIwMDAwMDBVLAorICAgIC8qKjwgVGhlIEhXIHZvbHVtZSBjaGFuZ2VzIGFyZSBzeW5jcm9uaXplZCB3aXRoIFNXIHZvbHVtZS4gKi8KKy8qKiBcZW5kY29uZCAqLworI2VuZGlmCisKK30gcGFfc2lua19mbGFnc190OworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyNkZWZpbmUgUEFfU0lOS19IV19WT0xVTUVfQ1RSTCBQQV9TSU5LX0hXX1ZPTFVNRV9DVFJMCisjZGVmaW5lIFBBX1NJTktfTEFURU5DWSBQQV9TSU5LX0xBVEVOQ1kKKyNkZWZpbmUgUEFfU0lOS19IQVJEV0FSRSBQQV9TSU5LX0hBUkRXQVJFCisjZGVmaW5lIFBBX1NJTktfTkVUV09SSyBQQV9TSU5LX05FVFdPUksKKyNkZWZpbmUgUEFfU0lOS19IV19NVVRFX0NUUkwgUEFfU0lOS19IV19NVVRFX0NUUkwKKyNkZWZpbmUgUEFfU0lOS19ERUNJQkVMX1ZPTFVNRSBQQV9TSU5LX0RFQ0lCRUxfVk9MVU1FCisjZGVmaW5lIFBBX1NJTktfRkxBVF9WT0xVTUUgUEFfU0lOS19GTEFUX1ZPTFVNRQorI2RlZmluZSBQQV9TSU5LX0RZTkFNSUNfTEFURU5DWSBQQV9TSU5LX0RZTkFNSUNfTEFURU5DWQorI2RlZmluZSBQQV9TSU5LX1NFVF9GT1JNQVRTIFBBX1NJTktfU0VUX0ZPUk1BVFMKKyNpZmRlZiBfX0lOQ0xVREVEX0ZST01fUFVMU0VfQVVESU8KKyNkZWZpbmUgUEFfU0lOS19DTElFTlRfRkxBR1NfTUFTSyAweEZGRkZGRgorI2VuZGlmCisKKy8qKiBcZW5kY29uZCAqLworCisvKiogU2luayBzdGF0ZS4gXHNpbmNlIDAuOS4xNSAqLwordHlwZWRlZiBlbnVtIHBhX3Npbmtfc3RhdGUgeyAvKiBlbnVtIHNlcmlhbGl6ZWQgaW4gdTggKi8KKyAgICBQQV9TSU5LX0lOVkFMSURfU1RBVEUgPSAtMSwKKyAgICAvKio8IFRoaXMgc3RhdGUgaXMgdXNlZCB3aGVuIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzaW5rIHN0YXRlIGludHJvc3BlY3Rpb24gXHNpbmNlIDAuOS4xNSAqLworCisgICAgUEFfU0lOS19SVU5OSU5HID0gMCwKKyAgICAvKio8IFJ1bm5pbmcsIHNpbmsgaXMgcGxheWluZyBhbmQgdXNlZCBieSBhdCBsZWFzdCBvbmUgbm9uLWNvcmtlZCBzaW5rLWlucHV0IFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NJTktfSURMRSA9IDEsCisgICAgLyoqPCBXaGVuIGlkbGUsIHRoZSBzaW5rIGlzIHBsYXlpbmcgYnV0IHRoZXJlIGlzIG5vIG5vbi1jb3JrZWQgc2luay1pbnB1dCBhdHRhY2hlZCB0byBpdCBcc2luY2UgMC45LjE1ICovCisKKyAgICBQQV9TSU5LX1NVU1BFTkRFRCA9IDIsCisgICAgLyoqPCBXaGVuIHN1c3BlbmRlZCwgYWN0dWFsIHNpbmsgYWNjZXNzIGNhbiBiZSBjbG9zZWQsIGZvciBpbnN0YW5jZSBcc2luY2UgMC45LjE1ICovCisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworICAgIC8qIFBSSVZBVEU6IFNlcnZlci1zaWRlIHZhbHVlcyAtLSBETyBOT1QgVVNFIFRISVMgT04gVEhFIENMSUVOVAorICAgICAqIFNJREUhIFRoZXNlIHZhbHVlcyBhcmUgKm5vdCogY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCBQQQorICAgICAqIEFQSS9BQkkuIElmIHlvdSB1c2UgdGhlbSB5b3VyIGFwcGxpY2F0aW9uIG1pZ2h0IGJyZWFrIHdoZW4gUEEKKyAgICAgKiBpcyB1cGdyYWRlZC4gQWxzbywgcGxlYXNlIG5vdGUgdGhhdCB0aGVzZSB2YWx1ZXMgYXJlIG5vdCB1c2VmdWwKKyAgICAgKiBvbiB0aGUgY2xpZW50IHNpZGUgYW55d2F5LiAqLworCisgICAgUEFfU0lOS19JTklUID0gLTIsCisgICAgLyoqPCBJbml0aWFsaXphdGlvbiBzdGF0ZSAqLworCisgICAgUEFfU0lOS19VTkxJTktFRCA9IC0zCisgICAgLyoqPCBUaGUgc3RhdGUgd2hlbiB0aGUgc2luayBpcyBnZXR0aW5nIHVucmVnaXN0ZXJlZCBhbmQgcmVtb3ZlZCBmcm9tIGNsaWVudCBhY2Nlc3MgKi8KKy8qKiBcZW5kY29uZCAqLworCit9IHBhX3Npbmtfc3RhdGVfdDsKKworLyoqIFJldHVybnMgbm9uLXplcm8gaWYgc2luayBpcyBwbGF5aW5nOiBydW5uaW5nIG9yIGlkbGUuIFxzaW5jZSAwLjkuMTUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IFBBX1NJTktfSVNfT1BFTkVEKHBhX3Npbmtfc3RhdGVfdCB4KSB7CisgICAgcmV0dXJuIHggPT0gUEFfU0lOS19SVU5OSU5HIHx8IHggPT0gUEFfU0lOS19JRExFOworfQorCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyNkZWZpbmUgUEFfU0lOS19JTlZBTElEX1NUQVRFIFBBX1NJTktfSU5WQUxJRF9TVEFURQorI2RlZmluZSBQQV9TSU5LX1JVTk5JTkcgUEFfU0lOS19SVU5OSU5HCisjZGVmaW5lIFBBX1NJTktfSURMRSBQQV9TSU5LX0lETEUKKyNkZWZpbmUgUEFfU0lOS19TVVNQRU5ERUQgUEFfU0lOS19TVVNQRU5ERUQKKyNkZWZpbmUgUEFfU0lOS19JTklUIFBBX1NJTktfSU5JVAorI2RlZmluZSBQQV9TSU5LX1VOTElOS0VEIFBBX1NJTktfVU5MSU5LRUQKKyNkZWZpbmUgUEFfU0lOS19JU19PUEVORUQgUEFfU0lOS19JU19PUEVORUQKKy8qKiBcZW5kY29uZCAqLworCisvKiogU3BlY2lhbCBzb3VyY2UgZmxhZ3MuICAqLwordHlwZWRlZiBlbnVtIHBhX3NvdXJjZV9mbGFncyB7CisgICAgUEFfU09VUkNFX05PRkxBR1MgPSAweDAwMDBVLAorICAgIC8qKjwgRmxhZyB0byBwYXNzIHdoZW4gbm8gc3BlY2lmaWMgb3B0aW9ucyBhcmUgbmVlZGVkICh1c2VkIHRvIGF2b2lkIGNhc3RpbmcpICBcc2luY2UgMC45LjE5ICovCisKKyAgICBQQV9TT1VSQ0VfSFdfVk9MVU1FX0NUUkwgPSAweDAwMDFVLAorICAgIC8qKjwgU3VwcG9ydHMgaGFyZHdhcmUgdm9sdW1lIGNvbnRyb2wuIFRoaXMgaXMgYSBkeW5hbWljIGZsYWcgYW5kIG1heQorICAgICAqIGNoYW5nZSBhdCBydW50aW1lIGFmdGVyIHRoZSBzb3VyY2UgaGFzIGluaXRpYWxpemVkICovCisKKyAgICBQQV9TT1VSQ0VfTEFURU5DWSA9IDB4MDAwMlUsCisgICAgLyoqPCBTdXBwb3J0cyBsYXRlbmN5IHF1ZXJ5aW5nICovCisKKyAgICBQQV9TT1VSQ0VfSEFSRFdBUkUgPSAweDAwMDRVLAorICAgIC8qKjwgSXMgYSBoYXJkd2FyZSBzb3VyY2Ugb2Ygc29tZSBraW5kLCBpbiBjb250cmFzdCB0bworICAgICAqICJ2aXJ0dWFsIi9zb2Z0d2FyZSBzb3VyY2UgXHNpbmNlIDAuOS4zICovCisKKyAgICBQQV9TT1VSQ0VfTkVUV09SSyA9IDB4MDAwOFUsCisgICAgLyoqPCBJcyBhIG5ldHdvcmtlZCBzb3VyY2Ugb2Ygc29tZSBraW5kLiBcc2luY2UgMC45LjcgKi8KKworICAgIFBBX1NPVVJDRV9IV19NVVRFX0NUUkwgPSAweDAwMTBVLAorICAgIC8qKjwgU3VwcG9ydHMgaGFyZHdhcmUgbXV0ZSBjb250cm9sLiBUaGlzIGlzIGEgZHluYW1pYyBmbGFnIGFuZCBtYXkKKyAgICAgKiBjaGFuZ2UgYXQgcnVudGltZSBhZnRlciB0aGUgc291cmNlIGhhcyBpbml0aWFsaXplZCBcc2luY2UgMC45LjExICovCisKKyAgICBQQV9TT1VSQ0VfREVDSUJFTF9WT0xVTUUgPSAweDAwMjBVLAorICAgIC8qKjwgVm9sdW1lIGNhbiBiZSB0cmFuc2xhdGVkIHRvIGRCIHdpdGggcGFfc3dfdm9sdW1lX3RvX2RCKCkuIFRoaXMgaXMgYQorICAgICAqIGR5bmFtaWMgZmxhZyBhbmQgbWF5IGNoYW5nZSBhdCBydW50aW1lIGFmdGVyIHRoZSBzb3VyY2UgaGFzIGluaXRpYWxpemVkCisgICAgICogXHNpbmNlIDAuOS4xMSAqLworCisgICAgUEFfU09VUkNFX0RZTkFNSUNfTEFURU5DWSA9IDB4MDA0MFUsCisgICAgLyoqPCBUaGUgbGF0ZW5jeSBjYW4gYmUgYWRqdXN0ZWQgZHluYW1pY2FsbHkgZGVwZW5kaW5nIG9uIHRoZQorICAgICAqIG5lZWRzIG9mIHRoZSBjb25uZWN0ZWQgc3RyZWFtcy4gXHNpbmNlIDAuOS4xNSAqLworCisgICAgUEFfU09VUkNFX0ZMQVRfVk9MVU1FID0gMHgwMDgwVSwKKyAgICAvKio8IFRoaXMgc291cmNlIGlzIGluIGZsYXQgdm9sdW1lIG1vZGUsIGkuZS4gYWx3YXlzIHRoZSBtYXhpbXVtIG9mCisgICAgICogdGhlIHZvbHVtZSBvZiBhbGwgY29ubmVjdGVkIG91dHB1dHMuIFxzaW5jZSAxLjAgKi8KKworI2lmZGVmIF9fSU5DTFVERURfRlJPTV9QVUxTRV9BVURJTworLyoqIFxjb25kIGZ1bGxkb2NzICovCisgICAgLyogUFJJVkFURTogU2VydmVyLXNpZGUgdmFsdWVzIC0tIGRvIG5vdCB0cnkgdG8gdXNlIHRoZXNlIGF0IGNsaWVudC1zaWRlLgorICAgICAqIFRoZSBzZXJ2ZXIgd2lsbCBmaWx0ZXIgb3V0IHRoZXNlIGZsYWdzIGFueXdheSwgc28geW91IHNob3VsZCBuZXZlciBzZWUKKyAgICAgKiB0aGVzZSBmbGFncyBpbiBzb3VyY2VzLiAqLworCisgICAgUEFfU09VUkNFX1NIQVJFX1ZPTFVNRV9XSVRIX01BU1RFUiA9IDB4MTAwMDAwMFUsCisgICAgLyoqPCBUaGlzIHNvdXJjZSBzaGFyZXMgdGhlIHZvbHVtZSB3aXRoIHRoZSBtYXN0ZXIgc291cmNlICh1c2VkIGJ5IHNvbWUgZmlsdGVyCisgICAgICogc291cmNlcykuICovCisKKyAgICBQQV9TT1VSQ0VfREVGRVJSRURfVk9MVU1FID0gMHgyMDAwMDAwVSwKKyAgICAvKio8IFRoZSBIVyB2b2x1bWUgY2hhbmdlcyBhcmUgc3luY3Jvbml6ZWQgd2l0aCBTVyB2b2x1bWUuICovCisjZW5kaWYKK30gcGFfc291cmNlX2ZsYWdzX3Q7CisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworI2RlZmluZSBQQV9TT1VSQ0VfSFdfVk9MVU1FX0NUUkwgUEFfU09VUkNFX0hXX1ZPTFVNRV9DVFJMCisjZGVmaW5lIFBBX1NPVVJDRV9MQVRFTkNZIFBBX1NPVVJDRV9MQVRFTkNZCisjZGVmaW5lIFBBX1NPVVJDRV9IQVJEV0FSRSBQQV9TT1VSQ0VfSEFSRFdBUkUKKyNkZWZpbmUgUEFfU09VUkNFX05FVFdPUksgUEFfU09VUkNFX05FVFdPUksKKyNkZWZpbmUgUEFfU09VUkNFX0hXX01VVEVfQ1RSTCBQQV9TT1VSQ0VfSFdfTVVURV9DVFJMCisjZGVmaW5lIFBBX1NPVVJDRV9ERUNJQkVMX1ZPTFVNRSBQQV9TT1VSQ0VfREVDSUJFTF9WT0xVTUUKKyNkZWZpbmUgUEFfU09VUkNFX0RZTkFNSUNfTEFURU5DWSBQQV9TT1VSQ0VfRFlOQU1JQ19MQVRFTkNZCisjZGVmaW5lIFBBX1NPVVJDRV9GTEFUX1ZPTFVNRSBQQV9TT1VSQ0VfRkxBVF9WT0xVTUUKKyNpZmRlZiBfX0lOQ0xVREVEX0ZST01fUFVMU0VfQVVESU8KKyNkZWZpbmUgUEFfU09VUkNFX0NMSUVOVF9GTEFHU19NQVNLIDB4RkZGRkZGCisjZW5kaWYKKworLyoqIFxlbmRjb25kICovCisKKy8qKiBTb3VyY2Ugc3RhdGUuIFxzaW5jZSAwLjkuMTUgKi8KK3R5cGVkZWYgZW51bSBwYV9zb3VyY2Vfc3RhdGUgeworICAgIFBBX1NPVVJDRV9JTlZBTElEX1NUQVRFID0gLTEsCisgICAgLyoqPCBUaGlzIHN0YXRlIGlzIHVzZWQgd2hlbiB0aGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc291cmNlIHN0YXRlIGludHJvc3BlY3Rpb24gXHNpbmNlIDAuOS4xNSAqLworCisgICAgUEFfU09VUkNFX1JVTk5JTkcgPSAwLAorICAgIC8qKjwgUnVubmluZywgc291cmNlIGlzIHJlY29yZGluZyBhbmQgdXNlZCBieSBhdCBsZWFzdCBvbmUgbm9uLWNvcmtlZCBzb3VyY2Utb3V0cHV0IFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NPVVJDRV9JRExFID0gMSwKKyAgICAvKio8IFdoZW4gaWRsZSwgdGhlIHNvdXJjZSBpcyBzdGlsbCByZWNvcmRpbmcgYnV0IHRoZXJlIGlzIG5vIG5vbi1jb3JrZWQgc291cmNlLW91dHB1dCBcc2luY2UgMC45LjE1ICovCisKKyAgICBQQV9TT1VSQ0VfU1VTUEVOREVEID0gMiwKKyAgICAvKio8IFdoZW4gc3VzcGVuZGVkLCBhY3R1YWwgc291cmNlIGFjY2VzcyBjYW4gYmUgY2xvc2VkLCBmb3IgaW5zdGFuY2UgXHNpbmNlIDAuOS4xNSAqLworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyAgICAvKiBQUklWQVRFOiBTZXJ2ZXItc2lkZSB2YWx1ZXMgLS0gRE8gTk9UIFVTRSBUSElTIE9OIFRIRSBDTElFTlQKKyAgICAgKiBTSURFISBUaGVzZSB2YWx1ZXMgYXJlICpub3QqIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgb2ZmaWNpYWwgUEEKKyAgICAgKiBBUEkvQUJJLiBJZiB5b3UgdXNlIHRoZW0geW91ciBhcHBsaWNhdGlvbiBtaWdodCBicmVhayB3aGVuIFBBCisgICAgICogaXMgdXBncmFkZWQuIEFsc28sIHBsZWFzZSBub3RlIHRoYXQgdGhlc2UgdmFsdWVzIGFyZSBub3QgdXNlZnVsCisgICAgICogb24gdGhlIGNsaWVudCBzaWRlIGFueXdheS4gKi8KKworICAgIFBBX1NPVVJDRV9JTklUID0gLTIsCisgICAgLyoqPCBJbml0aWFsaXphdGlvbiBzdGF0ZSAqLworCisgICAgUEFfU09VUkNFX1VOTElOS0VEID0gLTMKKyAgICAvKio8IFRoZSBzdGF0ZSB3aGVuIHRoZSBzb3VyY2UgaXMgZ2V0dGluZyB1bnJlZ2lzdGVyZWQgYW5kIHJlbW92ZWQgZnJvbSBjbGllbnQgYWNjZXNzICovCisvKiogXGVuZGNvbmQgKi8KKworfSBwYV9zb3VyY2Vfc3RhdGVfdDsKKworLyoqIFJldHVybnMgbm9uLXplcm8gaWYgc291cmNlIGlzIHJlY29yZGluZzogcnVubmluZyBvciBpZGxlLiBcc2luY2UgMC45LjE1ICovCitzdGF0aWMgaW5saW5lIGludCBQQV9TT1VSQ0VfSVNfT1BFTkVEKHBhX3NvdXJjZV9zdGF0ZV90IHgpIHsKKyAgICByZXR1cm4geCA9PSBQQV9TT1VSQ0VfUlVOTklORyB8fCB4ID09IFBBX1NPVVJDRV9JRExFOworfQorCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyNkZWZpbmUgUEFfU09VUkNFX0lOVkFMSURfU1RBVEUgUEFfU09VUkNFX0lOVkFMSURfU1RBVEUKKyNkZWZpbmUgUEFfU09VUkNFX1JVTk5JTkcgUEFfU09VUkNFX1JVTk5JTkcKKyNkZWZpbmUgUEFfU09VUkNFX0lETEUgUEFfU09VUkNFX0lETEUKKyNkZWZpbmUgUEFfU09VUkNFX1NVU1BFTkRFRCBQQV9TT1VSQ0VfU1VTUEVOREVECisjZGVmaW5lIFBBX1NPVVJDRV9JTklUIFBBX1NPVVJDRV9JTklUCisjZGVmaW5lIFBBX1NPVVJDRV9VTkxJTktFRCBQQV9TT1VSQ0VfVU5MSU5LRUQKKyNkZWZpbmUgUEFfU09VUkNFX0lTX09QRU5FRCBQQV9TT1VSQ0VfSVNfT1BFTkVECisvKiogXGVuZGNvbmQgKi8KKworLyoqIEEgZ2VuZXJpYyBmcmVlKCkgbGlrZSBjYWxsYmFjayBwcm90b3R5cGUgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2ZyZWVfY2JfdCkodm9pZCAqcCk7CisKKy8qKiBBIHN0cmVhbSBwb2xpY3kvbWV0YSBldmVudCByZXF1ZXN0aW5nIHRoYXQgYW4gYXBwbGljYXRpb24gc2hvdWxkCisgKiBjb3JrIGEgc3BlY2lmaWMgc3RyZWFtLiBTZWUgcGFfc3RyZWFtX2V2ZW50X2NiX3QgZm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uLCBcc2luY2UgMC45LjE1ICovCisjZGVmaW5lIFBBX1NUUkVBTV9FVkVOVF9SRVFVRVNUX0NPUksgInJlcXVlc3QtY29yayIKKworLyoqIEEgc3RyZWFtIHBvbGljeS9tZXRhIGV2ZW50IHJlcXVlc3RpbmcgdGhhdCBhbiBhcHBsaWNhdGlvbiBzaG91bGQKKyAqIGNvcmsgYSBzcGVjaWZpYyBzdHJlYW0uIFNlZSBwYV9zdHJlYW1fZXZlbnRfY2JfdCBmb3IgbW9yZQorICogaW5mb3JtYXRpb24sIFxzaW5jZSAwLjkuMTUgKi8KKyNkZWZpbmUgUEFfU1RSRUFNX0VWRU5UX1JFUVVFU1RfVU5DT1JLICJyZXF1ZXN0LXVuY29yayIKKworLyoqIEEgc3RyZWFtIGV2ZW50IG5vdGlmeWluZyB0aGF0IHRoZSBzdHJlYW0gaXMgZ29pbmcgdG8gYmUKKyAqIGRpc2Nvbm5lY3RlZCBiZWNhdXNlIHRoZSB1bmRlcmx5aW5nIHNpbmsgY2hhbmdlZCBhbmQgbm8gbG9uZ2VyCisgKiBzdXBwb3J0cyB0aGUgZm9ybWF0IHRoYXQgd2FzIG9yaWdpbmFsbHkgbmVnb3RpYXRlZC4gQ2xpZW50cyBuZWVkCisgKiB0byBjb25uZWN0IGEgbmV3IHN0cmVhbSB0byByZW5lZ290aWF0ZSBhIGZvcm1hdCBhbmQgY29udGludWUKKyAqIHBsYXliYWNrLCBcc2luY2UgMS4wICovCisjZGVmaW5lIFBBX1NUUkVBTV9FVkVOVF9GT1JNQVRfTE9TVCAiZm9ybWF0LWxvc3QiCisKKy8qKiBQb3J0IGF2YWlsYWJpbGl0eSAvIGphY2sgZGV0ZWN0aW9uIHN0YXR1cworICogXHNpbmNlIDIuMCAqLwordHlwZWRlZiBlbnVtIHBhX3BvcnRfYXZhaWxhYmxlIHsKKyAgICBQQV9QT1JUX0FWQUlMQUJMRV9VTktOT1dOID0gMCwgLyoqPCBUaGlzIHBvcnQgZG9lcyBub3Qgc3VwcG9ydCBqYWNrIGRldGVjdGlvbiBcc2luY2UgMi4wICovCisgICAgUEFfUE9SVF9BVkFJTEFCTEVfTk8gPSAxLCAgICAgIC8qKjwgVGhpcyBwb3J0IGlzIG5vdCBhdmFpbGFibGUsIGxpa2VseSBiZWNhdXNlIHRoZSBqYWNrIGlzIG5vdCBwbHVnZ2VkIGluLiBcc2luY2UgMi4wICovCisgICAgUEFfUE9SVF9BVkFJTEFCTEVfWUVTID0gMiwgICAgIC8qKjwgVGhpcyBwb3J0IGlzIGF2YWlsYWJsZSwgbGlrZWx5IGJlY2F1c2UgdGhlIGphY2sgaXMgcGx1Z2dlZCBpbi4gXHNpbmNlIDIuMCAqLworfSBwYV9wb3J0X2F2YWlsYWJsZV90OworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyNkZWZpbmUgUEFfUE9SVF9BVkFJTEFCTEVfVU5LTk9XTiBQQV9QT1JUX0FWQUlMQUJMRV9VTktOT1dOCisjZGVmaW5lIFBBX1BPUlRfQVZBSUxBQkxFX05PIFBBX1BPUlRfQVZBSUxBQkxFX05PCisjZGVmaW5lIFBBX1BPUlRfQVZBSUxBQkxFX1lFUyBQQV9QT1JUX0FWQUlMQUJMRV9ZRVMKKworLyoqIFxlbmRjb25kICovCisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2Vycm9yLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4ZGI4NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZXJyb3IuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIGZvb2Vycm9yaGZvbworI2RlZmluZSBmb29lcnJvcmhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL3ZlcnNpb24uaD4KKworLyoqIFxmaWxlCisgKiBFcnJvciBtYW5hZ2VtZW50ICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogUmV0dXJuIGEgaHVtYW4gcmVhZGFibGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIHNwZWNpZmllZCBudW1lcmljIGVycm9yIGNvZGUgKi8KK2NvbnN0IGNoYXIqIHBhX3N0cmVycm9yKGludCBlcnJvcik7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2V4dC1kZXZpY2UtbWFuYWdlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9leHQtZGV2aWNlLW1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTQxZWJkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9leHQtZGV2aWNlLW1hbmFnZXIuaApAQCAtMCwwICsxLDEyOSBAQAorI2lmbmRlZiBmb29wdWxzZWV4dGRldmljZW1hbmFnZXJoZm9vCisjZGVmaW5lIGZvb3B1bHNlZXh0ZGV2aWNlbWFuYWdlcmhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA4IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwOSBDb2xpbiBHdXRocmllCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXGZpbGUKKyAqCisgKiBSb3V0aW5lcyBmb3IgY29udHJvbGxpbmcgbW9kdWxlLWRldmljZS1tYW5hZ2VyCisgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKK3R5cGVkZWYgc3RydWN0IHBhX2V4dF9kZXZpY2VfbWFuYWdlcl9yb2xlX3ByaW9yaXR5X2luZm8geworICAgIGNvbnN0IGNoYXIgKnJvbGU7CisgICAgdWludDMyX3QgcHJpb3JpdHk7Cit9IHBhX2V4dF9kZXZpY2VfbWFuYWdlcl9yb2xlX3ByaW9yaXR5X2luZm87CisKKy8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgb25lIGRldmljZSBpbiB0aGUgZGV2aWNlIGRhdGFiYXNlIHRoYXQgaXMKKyAqIG1haW50YWluZWQgYnkgbW9kdWxlLWRldmljZS1tYW5hZ2VyLiBcc2luY2UgMC45LjIxICovCit0eXBlZGVmIHN0cnVjdCBwYV9leHRfZGV2aWNlX21hbmFnZXJfaW5mbyB7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAvKio8IElkZW50aWZpZXIgc3RyaW5nIG9mIHRoZSBkZXZpY2UuIEEgc3RyaW5nIGxpa2UgInNpbms6IiBvciBzaW1pbGFyIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UuICovCisgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb247ICAgICAvKio8IFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGV2aWNlIHdoZW4gaXQgd2FzIGxhc3Qgc2VlbiwgaWYgYXBwbGljYWJsZSBhbmQgc2F2ZWQgKi8KKyAgICBjb25zdCBjaGFyICppY29uOyAgICAgICAgICAgIC8qKjwgVGhlIGljb24gZ2l2ZW4gdG8gdGhlIGRldmljZSAqLworICAgIHVpbnQzMl90IGluZGV4OyAgICAgICAgICAgICAgLyoqPCBUaGUgZGV2aWNlIGluZGV4IGlmIGl0IGlzIGN1cnJlbnRseSBhdmFpbGFibGUgb3IgUEFfSU5WQUxJRF9JTkRFWCAqLworICAgIHVpbnQzMl90IG5fcm9sZV9wcmlvcml0aWVzOyAgLyoqPCBIb3cgbWFueSByb2xlIHByaW9yaXRpZXMgZG8gd2UgaGF2ZT8gKi8KKyAgICBwYV9leHRfZGV2aWNlX21hbmFnZXJfcm9sZV9wcmlvcml0eV9pbmZvICpyb2xlX3ByaW9yaXRpZXM7IC8qKjwgQW4gYXJyYXkgb2Ygcm9sZSBwcmlvcml0eSBzdHJ1Y3R1cmVzIG9yIE5VTEwgKi8KK30gcGFfZXh0X2RldmljZV9tYW5hZ2VyX2luZm87CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2V4dF9kZXZpY2VfbWFuYWdlcl90ZXN0KCkuIFxzaW5jZSAwLjkuMjEgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2V4dF9kZXZpY2VfbWFuYWdlcl90ZXN0X2NiX3QpKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICB1aW50MzJfdCB2ZXJzaW9uLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBUZXN0IGlmIHRoaXMgZXh0ZW5zaW9uIG1vZHVsZSBpcyBhdmFpbGFibGUgaW4gdGhlIHNlcnZlci4gXHNpbmNlIDAuOS4yMSAqLworcGFfb3BlcmF0aW9uICpwYV9leHRfZGV2aWNlX21hbmFnZXJfdGVzdCgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgcGFfZXh0X2RldmljZV9tYW5hZ2VyX3Rlc3RfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9leHRfZGV2aWNlX21hbmFnZXJfcmVhZCgpLiBcc2luY2UgMC45LjIxICovCit0eXBlZGVmIHZvaWQgKCpwYV9leHRfZGV2aWNlX21hbmFnZXJfcmVhZF9jYl90KSgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgY29uc3QgcGFfZXh0X2RldmljZV9tYW5hZ2VyX2luZm8gKmluZm8sCisgICAgICAgIGludCBlb2wsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFJlYWQgYWxsIGVudHJpZXMgZnJvbSB0aGUgZGV2aWNlIGRhdGFiYXNlLiBcc2luY2UgMC45LjIxICovCitwYV9vcGVyYXRpb24gKnBhX2V4dF9kZXZpY2VfbWFuYWdlcl9yZWFkKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBwYV9leHRfZGV2aWNlX21hbmFnZXJfcmVhZF9jYl90IGNiLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBmb3IgYSBkZXZpY2UuIFxzaW5jZSAwLjkuMjEgKi8KK3BhX29wZXJhdGlvbiAqcGFfZXh0X2RldmljZV9tYW5hZ2VyX3NldF9kZXZpY2VfZGVzY3JpcHRpb24oCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZSwKKyAgICAgICAgY29uc3QgY2hhciogZGVzY3JpcHRpb24sCisgICAgICAgIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBEZWxldGUgZW50cmllcyBmcm9tIHRoZSBkZXZpY2UgZGF0YWJhc2UuIFxzaW5jZSAwLjkuMjEgKi8KK3BhX29wZXJhdGlvbiAqcGFfZXh0X2RldmljZV9tYW5hZ2VyX2RlbGV0ZSgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgY29uc3QgY2hhciAqY29uc3Qgc1tdLAorICAgICAgICBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogRW5hYmxlIHRoZSByb2xlLWJhc2VkIGRldmljZS1wcmlvcml0eSByb3V0aW5nIG1vZGUuIFxzaW5jZSAwLjkuMjEgKi8KK3BhX29wZXJhdGlvbiAqcGFfZXh0X2RldmljZV9tYW5hZ2VyX2VuYWJsZV9yb2xlX2RldmljZV9wcmlvcml0eV9yb3V0aW5nKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBpbnQgZW5hYmxlLAorICAgICAgICBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUHJlZmVyIGEgZ2l2ZW4gZGV2aWNlIGluIHRoZSBwcmlvcml0eSBsaXN0LiBcc2luY2UgMC45LjIxICovCitwYV9vcGVyYXRpb24gKnBhX2V4dF9kZXZpY2VfbWFuYWdlcl9yZW9yZGVyX2RldmljZXNfZm9yX3JvbGUoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIGNvbnN0IGNoYXIqIHJvbGUsCisgICAgICAgIGNvbnN0IGNoYXIqKiBkZXZpY2VzLAorICAgICAgICBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU3Vic2NyaWJlIHRvIGNoYW5nZXMgaW4gdGhlIGRldmljZSBkYXRhYmFzZS4gXHNpbmNlIDAuOS4yMSAqLworcGFfb3BlcmF0aW9uICpwYV9leHRfZGV2aWNlX21hbmFnZXJfc3Vic2NyaWJlKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBpbnQgZW5hYmxlLAorICAgICAgICBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9leHRfZGV2aWNlX21hbmFnZXJfc2V0X3N1YnNjcmliZV9jYigpLiBcc2luY2UgMC45LjIxICovCit0eXBlZGVmIHZvaWQgKCpwYV9leHRfZGV2aWNlX21hbmFnZXJfc3Vic2NyaWJlX2NiX3QpKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIHN1YnNjcmlwdGlvbiBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aGVuCisgKiBwYV9leHRfZGV2aWNlX21hbmFnZXJfc3Vic2NyaWJlKCkgd2FzIGNhbGxlZC4gXHNpbmNlIDAuOS4yMSAqLwordm9pZCBwYV9leHRfZGV2aWNlX21hbmFnZXJfc2V0X3N1YnNjcmliZV9jYigKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgcGFfZXh0X2RldmljZV9tYW5hZ2VyX3N1YnNjcmliZV9jYl90IGNiLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2V4dC1kZXZpY2UtcmVzdG9yZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9leHQtZGV2aWNlLXJlc3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjg1N2Y0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9leHQtZGV2aWNlLXJlc3RvcmUuaApAQCAtMCwwICsxLDExMiBAQAorI2lmbmRlZiBmb29wdWxzZWV4dGRldmljZXJlc3RvcmVoZm9vCisjZGVmaW5lIGZvb3B1bHNlZXh0ZGV2aWNlcmVzdG9yZWhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA4IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAxMSBDb2xpbiBHdXRocmllCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8cHVsc2UvY29udGV4dC5oPgorI2luY2x1ZGUgPHB1bHNlL2Zvcm1hdC5oPgorI2luY2x1ZGUgPHB1bHNlL3ZlcnNpb24uaD4KKworLyoqIFxmaWxlCisgKgorICogUm91dGluZXMgZm9yIGNvbnRyb2xsaW5nIG1vZHVsZS1kZXZpY2UtcmVzdG9yZQorICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBkZXZpY2UgaW4gdGhlIGRldmljZSBkYXRhYmFzZSB0aGF0IGlzCisgKiBtYWludGFpbmVkIGJ5IG1vZHVsZS1kZXZpY2UtbWFuYWdlci4gXHNpbmNlIDEuMCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfZXh0X2RldmljZV9yZXN0b3JlX2luZm8geworICAgIHBhX2RldmljZV90eXBlX3QgdHlwZTsgICAgICAgLyoqPCBEZXZpY2UgdHlwZSBzaW5rIG9yIHNvdXJjZT8gKi8KKyAgICB1aW50MzJfdCBpbmRleDsgICAgICAgICAgICAgIC8qKjwgVGhlIGRldmljZSBpbmRleCAqLworICAgIHVpbnQ4X3Qgbl9mb3JtYXRzOyAgICAgICAgICAgLyoqPCBIb3cgbWFueSBmb3JtYXRzIGRvIHdlIGhhdmU/ICovCisgICAgcGFfZm9ybWF0X2luZm8gKipmb3JtYXRzOyAgICAvKio8IEFuIGFycmF5IG9mIGZvcm1hdHMgKG1heSBiZSBOVUxMIGlmIG5fZm9ybWF0cyA9PSAwKSAqLworfSBwYV9leHRfZGV2aWNlX3Jlc3RvcmVfaW5mbzsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfZXh0X2RldmljZV9yZXN0b3JlX3Rlc3QoKS4gXHNpbmNlIDEuMCAqLwordHlwZWRlZiB2b2lkICgqcGFfZXh0X2RldmljZV9yZXN0b3JlX3Rlc3RfY2JfdCkoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIHVpbnQzMl90IHZlcnNpb24sCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFRlc3QgaWYgdGhpcyBleHRlbnNpb24gbW9kdWxlIGlzIGF2YWlsYWJsZSBpbiB0aGUgc2VydmVyLiBcc2luY2UgMS4wICovCitwYV9vcGVyYXRpb24gKnBhX2V4dF9kZXZpY2VfcmVzdG9yZV90ZXN0KAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBwYV9leHRfZGV2aWNlX3Jlc3RvcmVfdGVzdF9jYl90IGNiLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTdWJzY3JpYmUgdG8gY2hhbmdlcyBpbiB0aGUgZGV2aWNlIGRhdGFiYXNlLiBcc2luY2UgMS4wICovCitwYV9vcGVyYXRpb24gKnBhX2V4dF9kZXZpY2VfcmVzdG9yZV9zdWJzY3JpYmUoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIGludCBlbmFibGUsCisgICAgICAgIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2V4dF9kZXZpY2VfcmVzdG9yZV9zZXRfc3Vic2NyaWJlX2NiKCkuIFxzaW5jZSAxLjAgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2V4dF9kZXZpY2VfcmVzdG9yZV9zdWJzY3JpYmVfY2JfdCkoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIHBhX2RldmljZV90eXBlX3QgdHlwZSwKKyAgICAgICAgdWludDMyX3QgaWR4LAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIHN1YnNjcmlwdGlvbiBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aGVuCisgKiBwYV9leHRfZGV2aWNlX3Jlc3RvcmVfc3Vic2NyaWJlKCkgd2FzIGNhbGxlZC4gXHNpbmNlIDEuMCAqLwordm9pZCBwYV9leHRfZGV2aWNlX3Jlc3RvcmVfc2V0X3N1YnNjcmliZV9jYigKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgcGFfZXh0X2RldmljZV9yZXN0b3JlX3N1YnNjcmliZV9jYl90IGNiLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2V4dF9kZXZpY2VfcmVzdG9yZV9yZWFkX2Zvcm1hdHMoKS4gXHNpbmNlIDEuMCAqLwordHlwZWRlZiB2b2lkICgqcGFfZXh0X2RldmljZV9yZXN0b3JlX3JlYWRfZGV2aWNlX2Zvcm1hdHNfY2JfdCkoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIGNvbnN0IHBhX2V4dF9kZXZpY2VfcmVzdG9yZV9pbmZvICppbmZvLAorICAgICAgICBpbnQgZW9sLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBSZWFkIHRoZSBmb3JtYXRzIGZvciBhbGwgcHJlc2VudCBkZXZpY2VzIGZyb20gdGhlIGRldmljZSBkYXRhYmFzZS4gXHNpbmNlIDEuMCAqLworcGFfb3BlcmF0aW9uICpwYV9leHRfZGV2aWNlX3Jlc3RvcmVfcmVhZF9mb3JtYXRzX2FsbCgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgcGFfZXh0X2RldmljZV9yZXN0b3JlX3JlYWRfZGV2aWNlX2Zvcm1hdHNfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmVhZCBhbiBlbnRyeSBmcm9tIHRoZSBkZXZpY2UgZGF0YWJhc2UuIFxzaW5jZSAxLjAgKi8KK3BhX29wZXJhdGlvbiAqcGFfZXh0X2RldmljZV9yZXN0b3JlX3JlYWRfZm9ybWF0cygKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgcGFfZGV2aWNlX3R5cGVfdCB0eXBlLAorICAgICAgICB1aW50MzJfdCBpZHgsCisgICAgICAgIHBhX2V4dF9kZXZpY2VfcmVzdG9yZV9yZWFkX2RldmljZV9mb3JtYXRzX2NiX3QgY2IsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFJlYWQgYW4gZW50cnkgZnJvbSB0aGUgZGV2aWNlIGRhdGFiYXNlLiBcc2luY2UgMS4wICovCitwYV9vcGVyYXRpb24gKnBhX2V4dF9kZXZpY2VfcmVzdG9yZV9zYXZlX2Zvcm1hdHMoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIHBhX2RldmljZV90eXBlX3QgdHlwZSwKKyAgICAgICAgdWludDMyX3QgaWR4LAorICAgICAgICB1aW50OF90IG5fZm9ybWF0cywKKyAgICAgICAgcGFfZm9ybWF0X2luZm8gKipmb3JtYXRzLAorICAgICAgICBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9leHQtc3RyZWFtLXJlc3RvcmUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZXh0LXN0cmVhbS1yZXN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiMTZhOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZXh0LXN0cmVhbS1yZXN0b3JlLmgKQEAgLTAsMCArMSwxMTEgQEAKKyNpZm5kZWYgZm9vcHVsc2VleHRzdHJlYW1yZXN0b3JlaGZvbworI2RlZmluZSBmb29wdWxzZWV4dHN0cmVhbXJlc3RvcmVoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwOCBMZW5uYXJ0IFBvZXR0ZXJpbmcKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL2NvbnRleHQuaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cHVsc2Uvdm9sdW1lLmg+CisjaW5jbHVkZSA8cHVsc2UvY2hhbm5lbG1hcC5oPgorCisvKiogXGZpbGUKKyAqCisgKiBSb3V0aW5lcyBmb3IgY29udHJvbGxpbmcgbW9kdWxlLXN0cmVhbS1yZXN0b3JlCisgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgb25lIGVudHJ5IGluIHRoZSBzdHJlYW0gZGF0YWJhc2UgdGhhdCBpcworICogbWFpbnRhaW5lZCBieSBtb2R1bGUtc3RyZWFtLXJlc3RvcmUuIFxzaW5jZSAwLjkuMTIgKi8KK3R5cGVkZWYgc3RydWN0IHBhX2V4dF9zdHJlYW1fcmVzdG9yZV9pbmZvIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgIC8qKjwgSWRlbnRpZmllciBzdHJpbmcgb2YgdGhlIHN0cmVhbS4gQSBzdHJpbmcgbGlrZSAic2luay1pbnB1dC1ieS1yb2xlOiIgb3Igc2ltaWxhciBmb2xsb3dlZCBieSBzb21lIGFyYml0cmFyeSBwcm9wZXJ0eSB2YWx1ZS4gKi8KKyAgICBwYV9jaGFubmVsX21hcCBjaGFubmVsX21hcDsgIC8qKjwgVGhlIGNoYW5uZWwgbWFwIGZvciB0aGUgdm9sdW1lIGZpZWxkLCBpZiBhcHBsaWNhYmxlICovCisgICAgcGFfY3ZvbHVtZSB2b2x1bWU7ICAgICAgICAgICAvKio8IFRoZSB2b2x1bWUgb2YgdGhlIHN0cmVhbSB3aGVuIGl0IHdhcyBzZWVuIGxhc3QsIGlmIGFwcGxpY2FibGUgYW5kIHNhdmVkICovCisgICAgY29uc3QgY2hhciAqZGV2aWNlOyAgICAgICAgICAvKio8IFRoZSBzaW5rL3NvdXJjZSBvZiB0aGUgc3RyZWFtIHdoZW4gaXQgd2FzIGxhc3Qgc2VlbiwgaWYgYXBwbGljYWJsZSBhbmQgc2F2ZWQgKi8KKyAgICBpbnQgbXV0ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGJvb2xlYW4gbXV0ZSBzdGF0ZSBvZiB0aGUgc3RyZWFtIHdoZW4gaXQgd2FzIGxhc3Qgc2VlbiwgaWYgYXBwbGljYWJsZSBhbmQgc2F2ZWQgKi8KK30gcGFfZXh0X3N0cmVhbV9yZXN0b3JlX2luZm87CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2V4dF9zdHJlYW1fcmVzdG9yZV90ZXN0KCkuIFxzaW5jZSAwLjkuMTIgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2V4dF9zdHJlYW1fcmVzdG9yZV90ZXN0X2NiX3QpKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICB1aW50MzJfdCB2ZXJzaW9uLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBUZXN0IGlmIHRoaXMgZXh0ZW5zaW9uIG1vZHVsZSBpcyBhdmFpbGFibGUgaW4gdGhlIHNlcnZlci4gXHNpbmNlIDAuOS4xMiAqLworcGFfb3BlcmF0aW9uICpwYV9leHRfc3RyZWFtX3Jlc3RvcmVfdGVzdCgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgcGFfZXh0X3N0cmVhbV9yZXN0b3JlX3Rlc3RfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9leHRfc3RyZWFtX3Jlc3RvcmVfcmVhZCgpLiBcc2luY2UgMC45LjEyICovCit0eXBlZGVmIHZvaWQgKCpwYV9leHRfc3RyZWFtX3Jlc3RvcmVfcmVhZF9jYl90KSgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgY29uc3QgcGFfZXh0X3N0cmVhbV9yZXN0b3JlX2luZm8gKmluZm8sCisgICAgICAgIGludCBlb2wsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFJlYWQgYWxsIGVudHJpZXMgZnJvbSB0aGUgc3RyZWFtIGRhdGFiYXNlLiBcc2luY2UgMC45LjEyICovCitwYV9vcGVyYXRpb24gKnBhX2V4dF9zdHJlYW1fcmVzdG9yZV9yZWFkKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBwYV9leHRfc3RyZWFtX3Jlc3RvcmVfcmVhZF9jYl90IGNiLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTdG9yZSBlbnRyaWVzIGluIHRoZSBzdHJlYW0gZGF0YWJhc2UuIFxzaW5jZSAwLjkuMTIgKi8KK3BhX29wZXJhdGlvbiAqcGFfZXh0X3N0cmVhbV9yZXN0b3JlX3dyaXRlKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBwYV91cGRhdGVfbW9kZV90IG1vZGUsCisgICAgICAgIGNvbnN0IHBhX2V4dF9zdHJlYW1fcmVzdG9yZV9pbmZvIGRhdGFbXSwKKyAgICAgICAgdW5zaWduZWQgbiwKKyAgICAgICAgaW50IGFwcGx5X2ltbWVkaWF0ZWx5LAorICAgICAgICBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogRGVsZXRlIGVudHJpZXMgZnJvbSB0aGUgc3RyZWFtIGRhdGFiYXNlLiBcc2luY2UgMC45LjEyICovCitwYV9vcGVyYXRpb24gKnBhX2V4dF9zdHJlYW1fcmVzdG9yZV9kZWxldGUoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IHNbXSwKKyAgICAgICAgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFN1YnNjcmliZSB0byBjaGFuZ2VzIGluIHRoZSBzdHJlYW0gZGF0YWJhc2UuIFxzaW5jZSAwLjkuMTIgKi8KK3BhX29wZXJhdGlvbiAqcGFfZXh0X3N0cmVhbV9yZXN0b3JlX3N1YnNjcmliZSgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgaW50IGVuYWJsZSwKKyAgICAgICAgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfZXh0X3N0cmVhbV9yZXN0b3JlX3NldF9zdWJzY3JpYmVfY2IoKS4gXHNpbmNlIDAuOS4xMiAqLwordHlwZWRlZiB2b2lkICgqcGFfZXh0X3N0cmVhbV9yZXN0b3JlX3N1YnNjcmliZV9jYl90KSgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBzdWJzY3JpcHRpb24gY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2hlbgorICogcGFfZXh0X3N0cmVhbV9yZXN0b3JlX3N1YnNjcmliZSgpIHdhcyBjYWxsZWQuIFxzaW5jZSAwLjkuMTIgKi8KK3ZvaWQgcGFfZXh0X3N0cmVhbV9yZXN0b3JlX3NldF9zdWJzY3JpYmVfY2IoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIHBhX2V4dF9zdHJlYW1fcmVzdG9yZV9zdWJzY3JpYmVfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9mb3JtYXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5OTZjNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZm9ybWF0LmgKQEAgLTAsMCArMSwxMzcgQEAKKyNpZm5kZWYgZm9vZm9ybWF0aGZvbworI2RlZmluZSBmb29mb3JtYXRoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgorICBDb3B5cmlnaHQgMjAxMSBDb2xsYWJvcmEgTXVsdGltZWRpYQorICBDb3B5cmlnaHQgMjAxMSBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL2djY21hY3JvLmg+CisjaW5jbHVkZSA8cHVsc2UvcHJvcGxpc3QuaD4KKyNpbmNsdWRlIDxwdWxzZS9zYW1wbGUuaD4KKyNpbmNsdWRlIDxwdWxzZS9jaGFubmVsbWFwLmg+CisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiBlbmNvZGluZyB1c2VkIGluIGEgc3RyZWFtIG9yIGFjY2VwdGVkIGJ5IGEgc2luay4gXHNpbmNlIDEuMCAqLwordHlwZWRlZiBlbnVtIHBhX2VuY29kaW5nIHsKKyAgICBQQV9FTkNPRElOR19BTlksCisgICAgLyoqPCBBbnkgZW5jb2RpbmcgZm9ybWF0LCBQQ00gb3IgY29tcHJlc3NlZCAqLworCisgICAgUEFfRU5DT0RJTkdfUENNLAorICAgIC8qKjwgQW55IFBDTSBmb3JtYXQgKi8KKworICAgIFBBX0VOQ09ESU5HX0FDM19JRUM2MTkzNywKKyAgICAvKio8IEFDMyBkYXRhIGVuY2Fwc3VsYXRlZCBpbiBJRUMgNjE5MzcgaGVhZGVyL3BhZGRpbmcgKi8KKworICAgIFBBX0VOQ09ESU5HX0VBQzNfSUVDNjE5MzcsCisgICAgLyoqPCBFQUMzIGRhdGEgZW5jYXBzdWxhdGVkIGluIElFQyA2MTkzNyBoZWFkZXIvcGFkZGluZyAqLworCisgICAgUEFfRU5DT0RJTkdfTVBFR19JRUM2MTkzNywKKyAgICAvKio8IE1QRUctMSBvciBNUEVHLTIgKFBhcnQgMywgbm90IEFBQykgZGF0YSBlbmNhcHN1bGF0ZWQgaW4gSUVDIDYxOTM3IGhlYWRlci9wYWRkaW5nICovCisKKyAgICBQQV9FTkNPRElOR19EVFNfSUVDNjE5MzcsCisgICAgLyoqPCBEVFMgZGF0YSBlbmNhcHN1bGF0ZWQgaW4gSUVDIDYxOTM3IGhlYWRlci9wYWRkaW5nICovCisKKyAgICBQQV9FTkNPRElOR19NQVgsCisgICAgLyoqPCBWYWxpZCBlbmNvZGluZyB0eXBlcyBtdXN0IGJlIGxlc3MgdGhhbiB0aGlzIHZhbHVlICovCisKKyAgICBQQV9FTkNPRElOR19JTlZBTElEID0gLTEsCisgICAgLyoqPCBSZXByZXNlbnRzIGFuIGludmFsaWQgZW5jb2RpbmcgKi8KK30gcGFfZW5jb2RpbmdfdDsKKworLyoqIFJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gZW5jb2RpbmcgdHlwZS4gXHNpbmNlIDEuMCAqLworY29uc3QgY2hhciAqcGFfZW5jb2RpbmdfdG9fc3RyaW5nKHBhX2VuY29kaW5nX3QgZSkgUEFfR0NDX0NPTlNUOworCisvKiogQ29udmVydHMgYSBzdHJpbmcgb2YgdGhlIGZvcm0gcmV0dXJuZWQgYnkgXGEgcGFfZW5jb2RpbmdfdG9fc3RyaW5nKCkgYmFjayB0byBhIFxhIHBhX2VuY29kaW5nX3QuIFxzaW5jZSAxLjAgKi8KK3BhX2VuY29kaW5nX3QgcGFfZW5jb2RpbmdfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqZW5jb2RpbmcpOworCisvKiogUmVwcmVzZW50cyB0aGUgZm9ybWF0IG9mIGRhdGEgcHJvdmlkZWQgaW4gYSBzdHJlYW0gb3IgcHJvY2Vzc2VkIGJ5IGEgc2luay4gXHNpbmNlIDEuMCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfZm9ybWF0X2luZm8geworICAgIHBhX2VuY29kaW5nX3QgZW5jb2Rpbmc7CisgICAgLyoqPCBUaGUgZW5jb2RpbmcgdXNlZCBmb3IgdGhlIGZvcm1hdCAqLworCisgICAgcGFfcHJvcGxpc3QgKnBsaXN0OworICAgIC8qKjwgQWRkaXRpb25hbCBlbmNvZGluZy1zcGVjaWZpYyBwcm9wZXJ0aWVzIHN1Y2ggYXMgc2FtcGxlIHJhdGUsIGJpdHJhdGUsIGV0Yy4gKi8KK30gcGFfZm9ybWF0X2luZm87CisKKy8qKiBBbGxvY2F0ZXMgYSBuZXcgXGEgcGFfZm9ybWF0X2luZm8gc3RydWN0dXJlLiBDbGllbnRzIG11c3QgaW5pdGlhbGlzZSBhdCBsZWFzdCB0aGUgZW5jb2RpbmcgZmllbGQgdGhlbXNlbHZlcy4gKi8KK3BhX2Zvcm1hdF9pbmZvKiBwYV9mb3JtYXRfaW5mb19uZXcodm9pZCk7CisKKy8qKiBSZXR1cm5zIGEgbmV3IFxhIHBhX2Zvcm1hdF9pbmZvIHN0cnVjdCBhbmQgcmVwcmVzZW50aW5nIHRoZSBzYW1lIGZvcm1hdCBhcyBcYSBzcmMgKi8KK3BhX2Zvcm1hdF9pbmZvKiBwYV9mb3JtYXRfaW5mb19jb3B5KGNvbnN0IHBhX2Zvcm1hdF9pbmZvICpzcmMpOworCisvKiogRnJlZXMgYSBcYSBwYV9mb3JtYXRfaW5mbyBzdHJ1Y3R1cmUgKi8KK3ZvaWQgcGFfZm9ybWF0X2luZm9fZnJlZShwYV9mb3JtYXRfaW5mbyAqZik7CisKKy8qKiBSZXR1cm5zIG5vbi16ZXJvIHdoZW4gdGhlIGZvcm1hdCBpbmZvIHN0cnVjdHVyZSBpcyB2YWxpZCAqLworaW50IHBhX2Zvcm1hdF9pbmZvX3ZhbGlkKGNvbnN0IHBhX2Zvcm1hdF9pbmZvICpmKTsKKworLyoqIFJldHVybnMgbm9uLXplcm8gd2hlbiB0aGUgZm9ybWF0IGluZm8gc3RydWN0dXJlIHJlcHJlc2VudHMgYSBQQ00gKGkuZS4gdW5jb21wcmVzc2VkIGRhdGEpIGZvcm1hdCAqLworaW50IHBhX2Zvcm1hdF9pbmZvX2lzX3BjbShjb25zdCBwYV9mb3JtYXRfaW5mbyAqZik7CisKKy8qKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBmb3JtYXQgcmVwcmVzZW50ZWQgXGEgZmlyc3QgaXMgYSBzdWJzZXQgb2YKKyAqIHRoZSBmb3JtYXQgcmVwcmVzZW50ZWQgYnkgXHNlY29uZC4gVGhpcyBtZWFucyB0aGF0IFxhIHNlY29uZCBtdXN0CisgKiBoYXZlIGFsbCB0aGUgZmllbGRzIHRoYXQgXGEgZmlyc3QgZG9lcywgYnV0IHRoZSByZXZlcnNlIG5lZWQgbm90CisgKiBiZSB0cnVlLiBUaGlzIGlzIHR5cGljYWxseSBleHBlY3RlZCB0byBiZSB1c2VkIHRvIGNoZWNrIGlmIGEKKyAqIHN0cmVhbSdzIGZvcm1hdCBpcyBjb21wYXRpYmxlIHdpdGggYSBnaXZlbiBzaW5rLiBJbiBzdWNoIGEgY2FzZSwKKyAqIFxhIGZpcnN0IHdvdWxkIGJlIHRoZSBzaW5rJ3MgZm9ybWF0IGFuZCBcYSBzZWNvbmQgd291bGQgYmUgdGhlCisgKiBzdHJlYW0ncy4qLworaW50IHBhX2Zvcm1hdF9pbmZvX2lzX2NvbXBhdGlibGUocGFfZm9ybWF0X2luZm8gKmZpcnN0LCBwYV9mb3JtYXRfaW5mbyAqc2Vjb25kKTsKKworLyoqIE1heGltdW0gcmVxdWlyZWQgc3RyaW5nIGxlbmd0aCBmb3IKKyAqIHBhX2Zvcm1hdF9pbmZvX3NucHJpbnQoKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHZhbHVlIGNhbiBjaGFuZ2UKKyAqIHdpdGggYW55IHJlbGVhc2Ugd2l0aG91dCB3YXJuaW5nIGFuZCB3aXRob3V0IGJlaW5nIGNvbnNpZGVyZWQgQVBJCisgKiBvciBBQkkgYnJlYWthZ2UuIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGRlZmluaXRpb24gYW55d2hlcmUgd2hlcmUKKyAqIGl0IG1pZ2h0IGJlY29tZSBwYXJ0IG9mIGFuIEFCSS4gXHNpbmNlIDEuMCAqLworI2RlZmluZSBQQV9GT1JNQVRfSU5GT19TTlBSSU5UX01BWCAyNTYKKworLyoqIFJldHVybiBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGZvcm1hdC4gXHNpbmNlIDEuMCAqLworY2hhciAqcGFfZm9ybWF0X2luZm9fc25wcmludChjaGFyICpzLCBzaXplX3QgbCwgY29uc3QgcGFfZm9ybWF0X2luZm8gKmYpOworCisvKiogUGFyc2UgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgb2YgdGhlIGZvcm0gZ2VuZXJhdGVkIGJ5CisgKiBcYSBwYV9mb3JtYXRfaW5mb19zbnByaW50KCkgaW50byBhIHBhX2Zvcm1hdF9pbmZvIHN0cnVjdHVyZS4gXHNpbmNlIDEuMCAqLworcGFfZm9ybWF0X2luZm8qIHBhX2Zvcm1hdF9pbmZvX2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKnN0cik7CisKKy8qKiBTZXRzIGFuIGludGVnZXIgcHJvcGVydHkgb24gdGhlIGdpdmVuIGZvcm1hdCBpbmZvICovCit2b2lkIHBhX2Zvcm1hdF9pbmZvX3NldF9wcm9wX2ludChwYV9mb3JtYXRfaW5mbyAqZiwgY29uc3QgY2hhciAqa2V5LCBpbnQgdmFsdWUpOworLyoqIFNldHMgYSBwcm9wZXJ0eSB3aXRoIGEgbGlzdCBvZiBpbnRlZ2VyIHZhbHVlcyBvbiB0aGUgZ2l2ZW4gZm9ybWF0IGluZm8gKi8KK3ZvaWQgcGFfZm9ybWF0X2luZm9fc2V0X3Byb3BfaW50X2FycmF5KHBhX2Zvcm1hdF9pbmZvICpmLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGludCAqdmFsdWVzLCBpbnQgbl92YWx1ZXMpOworLyoqIFNldHMgYSBwcm9wZXJ0eSB3aGljaCBjYW4gaGF2ZSBhbnkgdmFsdWUgaW4gYSBnaXZlbiBpbnRlZ2VyIHJhbmdlIG9uIHRoZSBnaXZlbiBmb3JtYXQgaW5mbyAqLwordm9pZCBwYV9mb3JtYXRfaW5mb19zZXRfcHJvcF9pbnRfcmFuZ2UocGFfZm9ybWF0X2luZm8gKmYsIGNvbnN0IGNoYXIgKmtleSwgaW50IG1pbiwgaW50IG1heCk7CisvKiogU2V0cyBhIHN0cmluZyBwcm9wZXJ0eSBvbiB0aGUgZ2l2ZW4gZm9ybWF0IGluZm8gKi8KK3ZvaWQgcGFfZm9ybWF0X2luZm9fc2V0X3Byb3Bfc3RyaW5nKHBhX2Zvcm1hdF9pbmZvICpmLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKTsKKy8qKiBTZXRzIGEgcHJvcGVydHkgd2l0aCBhIGxpc3Qgb2Ygc3RyaW5nIHZhbHVlcyBvbiB0aGUgZ2l2ZW4gZm9ybWF0IGluZm8gKi8KK3ZvaWQgcGFfZm9ybWF0X2luZm9fc2V0X3Byb3Bfc3RyaW5nX2FycmF5KHBhX2Zvcm1hdF9pbmZvICpmLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKip2YWx1ZXMsIGludCBuX3ZhbHVlcyk7CisKKy8qKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc2V0IHRoZSBzYW1wbGUgZm9ybWF0IGFzIGEgcHJvcGVydHkgb24gdGhlIGdpdmVuIGZvcm1hdCAqLwordm9pZCBwYV9mb3JtYXRfaW5mb19zZXRfc2FtcGxlX2Zvcm1hdChwYV9mb3JtYXRfaW5mbyAqZiwgcGFfc2FtcGxlX2Zvcm1hdF90IHNmKTsKKy8qKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc2V0IHRoZSBzYW1wbGluZyByYXRlIGFzIGEgcHJvcGVydHkgb24gdGhlIGdpdmVuIGZvcm1hdCAqLwordm9pZCBwYV9mb3JtYXRfaW5mb19zZXRfcmF0ZShwYV9mb3JtYXRfaW5mbyAqZiwgaW50IHJhdGUpOworLyoqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzZXQgdGhlIG51bWJlciBvZiBjaGFubmVscyBhcyBhIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBmb3JtYXQgKi8KK3ZvaWQgcGFfZm9ybWF0X2luZm9fc2V0X2NoYW5uZWxzKHBhX2Zvcm1hdF9pbmZvICpmLCBpbnQgY2hhbm5lbHMpOworLyoqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzZXQgdGhlIGNoYW5uZWwgbWFwIGFzIGEgcHJvcGVydHkgb24gdGhlIGdpdmVuIGZvcm1hdCAqLwordm9pZCBwYV9mb3JtYXRfaW5mb19zZXRfY2hhbm5lbF9tYXAocGFfZm9ybWF0X2luZm8gKmYsIGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXApOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9nY2NtYWNyby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9nY2NtYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlODE4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2djY21hY3JvLmgKQEAgLTAsMCArMSwxMjcgQEAKKyNpZm5kZWYgZm9vcHVsc2VnY2NtYWNyb2hmb28KKyNkZWZpbmUgZm9vcHVsc2VnY2NtYWNyb2hmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisvKiogXGZpbGUKKyAqIEdDQyBhdHRyaWJ1dGUgbWFjcm9zICovCisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBQQV9HQ0NfUFJJTlRGX0FUVFIoYSxiKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIGEsIGIpKSkKKyNlbHNlCisvKiogSWYgd2UncmUgaW4gR05VIEMsIHVzZSBzb21lIG1hZ2ljIGZvciBkZXRlY3RpbmcgaW52YWxpZCBmb3JtYXQgc3RyaW5ncyAqLworI2RlZmluZSBQQV9HQ0NfUFJJTlRGX0FUVFIoYSxiKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gNCkKKyNkZWZpbmUgUEFfR0NDX1NFTlRJTkVMIF9fYXR0cmlidXRlX18gKChzZW50aW5lbCkpCisjZWxzZQorLyoqIE1hY3JvIGZvciB1c2FnZSBvZiBHQ0MncyBzZW50aW5lbCBjb21waWxhdGlvbiB3YXJuaW5ncyAqLworI2RlZmluZSBQQV9HQ0NfU0VOVElORUwKKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgUEFfR0NDX05PUkVUVVJOIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKKyNlbHNlCisvKiogTWFjcm8gZm9yIG5vLXJldHVybiBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgUEFfR0NDX05PUkVUVVJOCisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFBBX0dDQ19VTlVTRUQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCisjZWxzZQorLyoqIE1hY3JvIGZvciBub3QgdXNlZCBmdW5jdGlvbiwgdmFyaWFibGUgb3IgcGFyYW1ldGVyICovCisjZGVmaW5lIFBBX0dDQ19VTlVTRUQKKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgUEFfR0NDX0RFU1RSVUNUT1IgX19hdHRyaWJ1dGVfXyAoKGRlc3RydWN0b3IpKQorI2Vsc2UKKy8qKiBDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiBwcm9jZXNzIHRlcm1pbmF0ZXMgKi8KKyNkZWZpbmUgUEFfR0NDX0RFU1RSVUNUT1IKKyNlbmRpZgorCisjaWZuZGVmIFBBX0dDQ19QVVJFCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgUEFfR0NDX1BVUkUgX19hdHRyaWJ1dGVfXyAoKHB1cmUpKQorI2Vsc2UKKy8qKiBUaGlzIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGRlcGVuZHMgb25seSB0aGUgYXJndW1lbnRzIGxpc3QgYW5kIGdsb2JhbCBzdGF0ZSAqKi8KKyNkZWZpbmUgUEFfR0NDX1BVUkUKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgUEFfR0NDX0NPTlNUCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgUEFfR0NDX0NPTlNUIF9fYXR0cmlidXRlX18gKChjb25zdCkpCisjZWxzZQorLyoqIFRoaXMgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgZGVwZW5kcyBvbmx5IHRoZSBhcmd1bWVudHMgbGlzdCAoc3RyaWN0ZXIgdmVyc2lvbiBvZiBQQV9HQ0NfUFVSRSkgKiovCisjZGVmaW5lIFBBX0dDQ19DT05TVAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBQQV9HQ0NfREVQUkVDQVRFRAorI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFBBX0dDQ19ERVBSRUNBVEVEIF9fYXR0cmlidXRlX18gKChkZXByZWNhdGVkKSkKKyNlbHNlCisvKiogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkICoqLworI2RlZmluZSBQQV9HQ0NfREVQUkVDQVRFRAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBQQV9HQ0NfUEFDS0VECisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgUEFfR0NDX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKyNlbHNlCisvKiogU3RydWN0dXJlIHNoYWxsIGJlIHBhY2tlZCBpbiBtZW1vcnkgKiovCisjZGVmaW5lIFBBX0dDQ19QQUNLRUQKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgUEFfR0NDX0FMTE9DX1NJWkUKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDMpCisjZGVmaW5lIFBBX0dDQ19BTExPQ19TSVpFKHgpIF9fYXR0cmlidXRlX18gKChfX2FsbG9jX3NpemVfXyh4KSkpCisjZGVmaW5lIFBBX0dDQ19BTExPQ19TSVpFMih4LHkpIF9fYXR0cmlidXRlX18gKChfX2FsbG9jX3NpemVfXyh4LHkpKSkKKyNlbHNlCisvKiogTWFjcm8gZm9yIHVzYWdlIG9mIEdDQydzIGFsbG9jX3NpemUgYXR0cmlidXRlICovCisjZGVmaW5lIFBBX0dDQ19BTExPQ19TSVpFKHgpCisvKiogTWFjcm8gZm9yIHVzYWdlIG9mIEdDQydzIGFsbG9jX3NpemUgYXR0cmlidXRlICovCisjZGVmaW5lIFBBX0dDQ19BTExPQ19TSVpFMih4LHkpCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFBBX0dDQ19NQUxMT0MKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBQQV9HQ0NfTUFMTE9DIF9fYXR0cmlidXRlX18gKChtYWxsb2MpKQorI2Vsc2UKKy8qKiBNYWNybyBmb3IgdXNhZ2Ugb2YgR0NDJ3MgbWFsbG9jIGF0dHJpYnV0ZSAqLworI2RlZmluZSBQQV9HQ0NfTUFMTE9DCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFBBX0dDQ19XRUFLUkVGCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0VMRl9fKSAmJiAoKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPiAxKSkgfHwgKF9fR05VQ19fID4gNCkpCisvKiogTWFjcm8gZm9yIHVzYWdlIG9mIEdDQydzIHdlYWtyZWYgYXR0cmlidXRlICovCisjZGVmaW5lIFBBX0dDQ19XRUFLUkVGKHgpIF9fYXR0cmlidXRlX18oKHdlYWtyZWYoI3gpKSkKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9nbGliLW1haW5sb29wLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2dsaWItbWFpbmxvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDVkNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9nbGliLW1haW5sb29wLmgKQEAgLTAsMCArMSw2OSBAQAorI2lmbmRlZiBmb29nbGlibWFpbmxvb3BoZm9vCisjZGVmaW5lIGZvb2dsaWJtYWlubG9vcGhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9tYWlubG9vcC1hcGkuaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL3ZlcnNpb24uaD4KKworLyoqIFxwYWdlIGdsaWItbWFpbmxvb3AgR0xJQiBNYWluIExvb3AgQmluZGluZ3MKKyAqCisgKiBcc2VjdGlvbiBvdmVydl9zZWMgT3ZlcnZpZXcKKyAqCisgKiBUaGUgR0xJQiBtYWluIGxvb3AgYmluZGluZ3MgYXJlIGV4dHJlbWVseSBlYXN5IHRvIHVzZS4gQWxsIHRoYXQgaXMKKyAqIHJlcXVpcmVkIGlzIHRvIGNyZWF0ZSBhIHBhX2dsaWJfbWFpbmxvb3Agb2JqZWN0IHVzaW5nCisgKiBwYV9nbGliX21haW5sb29wX25ldygpLiBXaGVuIHRoZSBtYWluIGxvb3AgYWJzdHJhY3Rpb24gaXMgbmVlZGVkLCBpdCBpcworICogcHJvdmlkZWQgYnkgcGFfZ2xpYl9tYWlubG9vcF9nZXRfYXBpKCkuCisgKgorICovCisKKy8qKiBcZmlsZQorICogR0xJQiBtYWluIGxvb3Agc3VwcG9ydAorICoKKyAqIFNlZSBhbHNvIFxzdWJwYWdlIGdsaWItbWFpbmxvb3AKKyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIEFuIG9wYXF1ZSBHTElCIG1haW4gbG9vcCBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0IHBhX2dsaWJfbWFpbmxvb3AgcGFfZ2xpYl9tYWlubG9vcDsKKworLyoqIENyZWF0ZSBhIG5ldyBHTElCIG1haW4gbG9vcCBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgR0xJQiBtYWluCisgKiBsb29wIGNvbnRleHQuIFRha2VzIGFuIGFyZ3VtZW50IGMgZm9yIHRoZQorICogR01haW5Db250ZXh0IHRvIHVzZS4gSWYgYyBpcyBOVUxMIHRoZSBkZWZhdWx0IGNvbnRleHQgaXMgdXNlZC4gKi8KK3BhX2dsaWJfbWFpbmxvb3AgKnBhX2dsaWJfbWFpbmxvb3BfbmV3KEdNYWluQ29udGV4dCAqYyk7CisKKy8qKiBGcmVlIHRoZSBHTElCIG1haW4gbG9vcCBvYmplY3QgKi8KK3ZvaWQgcGFfZ2xpYl9tYWlubG9vcF9mcmVlKHBhX2dsaWJfbWFpbmxvb3AqIGcpOworCisvKiogUmV0dXJuIHRoZSBhYnN0cmFjdCBtYWluIGxvb3AgQVBJIHZ0YWJsZSBmb3IgdGhlIEdMSUIgbWFpbiBsb29wCisgICAgb2JqZWN0LiBObyBuZWVkIHRvIGZyZWUgdGhlIEFQSSBhcyBpdCBpcyBvd25lZCBieSB0aGUgbG9vcAorICAgIGFuZCBpcyBkZXN0cm95ZWQgd2hlbiB0aGUgbG9vcCBpcyBmcmVlZC4gKi8KK3BhX21haW5sb29wX2FwaSogcGFfZ2xpYl9tYWlubG9vcF9nZXRfYXBpKHBhX2dsaWJfbWFpbmxvb3AgKmcpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9pbnRyb3NwZWN0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2ludHJvc3BlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzAzZTk3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9pbnRyb3NwZWN0LmgKQEAgLTAsMCArMSw3MTIgQEAKKyNpZm5kZWYgZm9vaW50cm9zcGVjdGhmb28KKyNkZWZpbmUgZm9vaW50cm9zcGVjdGhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8cHVsc2Uvb3BlcmF0aW9uLmg+CisjaW5jbHVkZSA8cHVsc2UvY29udGV4dC5oPgorI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvZ2NjbWFjcm8uaD4KKyNpbmNsdWRlIDxwdWxzZS9jaGFubmVsbWFwLmg+CisjaW5jbHVkZSA8cHVsc2Uvdm9sdW1lLmg+CisjaW5jbHVkZSA8cHVsc2UvcHJvcGxpc3QuaD4KKyNpbmNsdWRlIDxwdWxzZS9mb3JtYXQuaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBccGFnZSBpbnRyb3NwZWN0IFNlcnZlciBRdWVyeSBhbmQgQ29udHJvbAorICoKKyAqIFxzZWN0aW9uIG92ZXJ2X3NlYyBPdmVydmlldworICoKKyAqIFNvbWV0aW1lcyBpdCBpcyBuZWNlc3NhcnkgdG8gcXVlcnkgYW5kIG1vZGlmeSBnbG9iYWwgc2V0dGluZ3MgaW4gdGhlCisgKiBzZXJ2ZXIuIEZvciB0aGlzLCBQdWxzZUF1ZGlvIGhhcyB0aGUgaW50cm9zcGVjdGlvbiBBUEkuIEl0IGNhbiBsaXN0IHNpbmtzLAorICogc291cmNlcywgc2FtcGxlcyBhbmQgb3RoZXIgYXNwZWN0cyBvZiB0aGUgc2VydmVyLiBJdCBjYW4gYWxzbyBtb2RpZnkgdGhlCisgKiBhdHRyaWJ1dGVzIG9mIHRoZSBzZXJ2ZXIgdGhhdCB3aWxsIGFmZmVjdCBvcGVyYXRpb25zIG9uIGEgZ2xvYmFsIGxldmVsLAorICogYW5kIG5vdCBqdXN0IHRoZSBhcHBsaWNhdGlvbidzIGNvbnRleHQuCisgKgorICogXHNlY3Rpb24gcXVlcnlfc2VjIFF1ZXJ5aW5nCisgKgorICogQWxsIHF1ZXJ5aW5nIGlzIGRvbmUgdGhyb3VnaCBjYWxsYmFja3MuIFRoaXMgZGVzaWduIGlzIG5lY2Vzc2FyeSB0bworICogbWFpbnRhaW4gYW4gYXN5bmNocm9ub3VzIGRlc2lnbi4gVGhlIGNsaWVudCB3aWxsIHJlcXVlc3QgdGhlIGluZm9ybWF0aW9uCisgKiBhbmQgc29tZSB0aW1lIGxhdGVyLCB0aGUgc2VydmVyIHdpbGwgcmVzcG9uZCB3aXRoIHRoZSBkZXNpcmVkIGRhdGEuCisgKgorICogU29tZSBvYmplY3RzIGNhbiBoYXZlIG11bHRpcGxlIGVudHJpZXMgYXQgdGhlIHNlcnZlci4gV2hlbiByZXF1ZXN0aW5nIGFsbAorICogb2YgdGhlc2UgYXQgb25jZSwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBvbmNlIGZvcgorICogZWFjaCBvYmplY3QuIFdoZW4gdGhlIGxpc3QgaGFzIGJlZW4gZXhoYXVzdGVkLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQKKyAqIHdpdGhvdXQgYW4gaW5mb3JtYXRpb24gc3RydWN0dXJlIGFuZCB0aGUgZW9sIHBhcmFtZXRlciBzZXQgdG8gYSBwb3NpdGl2ZQorICogdmFsdWUuCisgKgorICogTm90ZSB0aGF0IGV2ZW4gaWYgYSBzaW5nbGUgb2JqZWN0IGlzIHJlcXVlc3RlZCwgYW5kIG5vdCB0aGUgZW50aXJlIGxpc3QsCisgKiB0aGUgdGVybWluYXRpbmcgY2FsbCB3aWxsIHN0aWxsIGJlIG1hZGUuCisgKgorICogSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aG91dCBhbiBpbmZvcm1hdGlvbgorICogc3RydWN0dXJlIGFuZCBlb2wgc2V0IHRvIGEgbmVnYXRpdmUgdmFsdWUuLgorICoKKyAqIERhdGEgbWVtYmVycyBpbiB0aGUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcmUgb25seSB2YWxpZCBkdXJpbmcgdGhlCisgKiBkdXJhdGlvbiBvZiB0aGUgY2FsbGJhY2suIElmIHRoZXkgYXJlIHJlcXVpcmVkIGFmdGVyIHRoZSBjYWxsYmFjayBpcworICogZmluaXNoZWQsIGEgZGVlcCBjb3B5IG11c3QgYmUgcGVyZm9ybWVkLgorICoKKyAqIFxzdWJzZWN0aW9uIHNlcnZlcl9zdWJzZWMgU2VydmVyIEluZm9ybWF0aW9uCisgKgorICogVGhlIHNlcnZlciBjYW4gYmUgcXVlcmllZCBhYm91dCBpdHMgbmFtZSwgdGhlIGVudmlyb25tZW50IGl0J3MgcnVubmluZyBvbgorICogYW5kIHRoZSBjdXJyZW50bHkgYWN0aXZlIGdsb2JhbCBkZWZhdWx0cy4gQ2FsbGluZworICogcGFfY29udGV4dF9nZXRfc2VydmVyX2luZm8oKSB3aWxsIGdldCBhY2Nlc3MgdG8gYSBwYV9zZXJ2ZXJfaW5mbyBzdHJ1Y3R1cmUKKyAqIGNvbnRhaW5pbmcgYWxsIG9mIHRoZXNlLgorICoKKyAqIFxzdWJzZWN0aW9uIG1lbXN0YXRfc3Vic2VjIE1lbW9yeSBVc2FnZQorICoKKyAqIFN0YXRpc3RpY3MgYWJvdXQgbWVtb3J5IHVzYWdlIGNhbiBiZSBmZXRjaGVkIHVzaW5nIHBhX2NvbnRleHRfc3RhdCgpLAorICogZ2l2aW5nIGEgcGFfc3RhdF9pbmZvIHN0cnVjdHVyZS4KKyAqCisgKiBcc3Vic2VjdGlvbiBzaW5rc3JjX3N1YnNlYyBTaW5rcyBhbmQgU291cmNlcworICoKKyAqIFRoZSBzZXJ2ZXIgY2FuIGhhdmUgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBzaW5rcyBhbmQgc291cmNlcy4gRWFjaCBzaW5rCisgKiBhbmQgc291cmNlIGhhdmUgYm90aCBhbiBpbmRleCBhbmQgYSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdC4gQXMgc3VjaAorICogdGhlcmUgYXJlIHRocmVlIHdheXMgdG8gZ2V0IGFjY2VzcyB0byB0aGVtOgorICoKKyAqIFxsaSBCeSBpbmRleCAtIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19ieV9pbmRleCgpIC8KKyAqICAgICAgICAgICAgICAgIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9pbmZvX2J5X2luZGV4KCkKKyAqIFxsaSBCeSBuYW1lIC0gcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X25hbWUoKSAvCisgKiAgICAgICAgICAgICAgIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9pbmZvX2J5X25hbWUoKQorICogXGxpIEFsbCAtIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19saXN0KCkgLworICogICAgICAgICAgIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9pbmZvX2xpc3QoKQorICoKKyAqIEFsbCB0aHJlZSBtZXRob2QgdXNlIHRoZSBzYW1lIGNhbGxiYWNrIGFuZCB3aWxsIHByb3ZpZGUgYSBwYV9zaW5rX2luZm8gb3IKKyAqIHBhX3NvdXJjZV9pbmZvIHN0cnVjdHVyZS4KKyAqCisgKiBcc3Vic2VjdGlvbiBzaXNvX3N1YnNlYyBTaW5rIElucHV0cyBhbmQgU291cmNlIE91dHB1dHMKKyAqCisgKiBTaW5rIGlucHV0cyBhbmQgc291cmNlIG91dHB1dHMgYXJlIHRoZSByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGNsaWVudCBlbmRzCisgKiBvZiBzdHJlYW1zIGluc2lkZSB0aGUgc2VydmVyLiBJLmUuIHRoZXkgY29ubmVjdCBhIGNsaWVudCBzdHJlYW0gdG8gb25lIG9mCisgKiB0aGUgZ2xvYmFsIHNpbmtzIG9yIHNvdXJjZXMuCisgKgorICogU2luayBpbnB1dHMgYW5kIHNvdXJjZSBvdXRwdXRzIG9ubHkgaGF2ZSBhbiBpbmRleCB0byBpZGVudGlmeSB0aGVtLiBBcworICogc3VjaCwgdGhlcmUgYXJlIG9ubHkgdHdvIHdheXMgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZW06CisgKgorICogXGxpIEJ5IGluZGV4IC0gcGFfY29udGV4dF9nZXRfc2lua19pbnB1dF9pbmZvKCkgLworICogICAgICAgICAgICAgICAgcGFfY29udGV4dF9nZXRfc291cmNlX291dHB1dF9pbmZvKCkKKyAqIFxsaSBBbGwgLSBwYV9jb250ZXh0X2dldF9zaW5rX2lucHV0X2luZm9fbGlzdCgpIC8KKyAqICAgICAgICAgICBwYV9jb250ZXh0X2dldF9zb3VyY2Vfb3V0cHV0X2luZm9fbGlzdCgpCisgKgorICogVGhlIHN0cnVjdHVyZSByZXR1cm5lZCBpcyB0aGUgcGFfc2lua19pbnB1dF9pbmZvIG9yIHBhX3NvdXJjZV9vdXRwdXRfaW5mbworICogc3RydWN0dXJlLgorICoKKyAqIFxzdWJzZWN0aW9uIHNhbXBsZXNfc3Vic2VjIFNhbXBsZXMKKyAqCisgKiBUaGUgbGlzdCBvZiBjYWNoZWQgc2FtcGxlcyBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHNlcnZlci4gVGhyZWUgbWV0aG9kcworICogZXhpc3QgZm9yIHF1ZXJ5aW5nIHRoZSBzYW1wbGUgY2FjaGUgbGlzdDoKKyAqCisgKiBcbGkgQnkgaW5kZXggLSBwYV9jb250ZXh0X2dldF9zYW1wbGVfaW5mb19ieV9pbmRleCgpCisgKiBcbGkgQnkgbmFtZSAtIHBhX2NvbnRleHRfZ2V0X3NhbXBsZV9pbmZvX2J5X25hbWUoKQorICogXGxpIEFsbCAtIHBhX2NvbnRleHRfZ2V0X3NhbXBsZV9pbmZvX2xpc3QoKQorICoKKyAqIE5vdGUgdGhhdCB0aGlzIG9ubHkgcmV0cmlldmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGUsIG5vdCB0aGUgc2FtcGxlCisgKiBkYXRhIGl0c2VsZi4KKyAqCisgKiBcc3Vic2VjdGlvbiBtb2R1bGVfc3Vic2VjIERyaXZlciBNb2R1bGVzCisgKgorICogUHVsc2VBdWRpbyBkcml2ZXIgbW9kdWxlcyBhcmUgaWRlbnRpZmllZCBieSBpbmRleCBhbmQgYXJlIHJldHJpZXZlZCB1c2luZyBlaXRoZXIKKyAqIHBhX2NvbnRleHRfZ2V0X21vZHVsZV9pbmZvKCkgb3IgcGFfY29udGV4dF9nZXRfbW9kdWxlX2luZm9fbGlzdCgpLiBUaGUKKyAqIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBpcyBjYWxsZWQgcGFfbW9kdWxlX2luZm8uCisgKgorICogXHN1YnNlY3Rpb24gY2xpZW50X3N1YnNlYyBDbGllbnRzCisgKgorICogUHVsc2VBdWRpbyBjbGllbnRzIGFyZSBhbHNvIGlkZW50aWZpZWQgYnkgaW5kZXggYW5kIGFyZSByZXRyaWV2ZWQgdXNpbmcKKyAqIGVpdGhlciBwYV9jb250ZXh0X2dldF9jbGllbnRfaW5mbygpIG9yIHBhX2NvbnRleHRfZ2V0X2NsaWVudF9pbmZvX2xpc3QoKS4KKyAqIFRoZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgaXMgY2FsbGVkIHBhX2NsaWVudF9pbmZvLgorICoKKyAqIFxzZWN0aW9uIGN0cmxfc2VjIENvbnRyb2wKKyAqCisgKiBTb21lIHBhcnRzIG9mIHRoZSBzZXJ2ZXIgYXJlIG9ubHkgcG9zc2libGUgdG8gcmVhZCwgYnV0IG1vc3QgY2FuIGFsc28gYmUKKyAqIG1vZGlmaWVkIGluIGRpZmZlcmVudCB3YXlzLiBOb3RlIHRoYXQgdGhlc2UgY2hhbmdlcyB3aWxsIGFmZmVjdCBhbGwKKyAqIGNvbm5lY3RlZCBjbGllbnRzIGFuZCBub3QganVzdCB0aGUgb25lIGlzc3VpbmcgdGhlIHJlcXVlc3QuCisgKgorICogXHN1YnNlY3Rpb24gc2lua3NyY19zdWJzZWMgU2lua3MgYW5kIFNvdXJjZXMKKyAqCisgKiBUaGUgbW9zdCBjb21tb24gY2hhbmdlIG9uZSB3b3VsZCB3YW50IHRvIGRvIHRvIHNpbmtzIGFuZCBzb3VyY2VzIGlzIHRvCisgKiBtb2RpZnkgdGhlIHZvbHVtZSBvZiB0aGUgYXVkaW8uIElkZW50aWNhbCB0byBob3cgc2lua3MgYW5kIHNvdXJjZXMgY2FuCisgKiBiZSBxdWVyaWVkLCB0aGVyZSBhcmUgdHdvIHdheXMgb2YgaWRlbnRpZnlpbmcgdGhlbToKKyAqCisgKiBcbGkgQnkgaW5kZXggLSBwYV9jb250ZXh0X3NldF9zaW5rX3ZvbHVtZV9ieV9pbmRleCgpIC8KKyAqICAgICAgICAgICAgICAgIHBhX2NvbnRleHRfc2V0X3NvdXJjZV92b2x1bWVfYnlfaW5kZXgoKQorICogXGxpIEJ5IG5hbWUgLSBwYV9jb250ZXh0X3NldF9zaW5rX3ZvbHVtZV9ieV9uYW1lKCkgLworICogICAgICAgICAgICAgICBwYV9jb250ZXh0X3NldF9zb3VyY2Vfdm9sdW1lX2J5X25hbWUoKQorICoKKyAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gbXV0ZSBhIHNpbmsgb3Igc291cmNlOgorICoKKyAqIFxsaSBCeSBpbmRleCAtIHBhX2NvbnRleHRfc2V0X3NpbmtfbXV0ZV9ieV9pbmRleCgpIC8KKyAqICAgICAgICAgICAgICAgIHBhX2NvbnRleHRfc2V0X3NvdXJjZV9tdXRlX2J5X2luZGV4KCkKKyAqIFxsaSBCeSBuYW1lIC0gcGFfY29udGV4dF9zZXRfc2lua19tdXRlX2J5X25hbWUoKSAvCisgKiAgICAgICAgICAgICAgIHBhX2NvbnRleHRfc2V0X3NvdXJjZV9tdXRlX2J5X25hbWUoKQorICoKKyAqIFxzdWJzZWN0aW9uIHNpc29fc3Vic2VjIFNpbmsgSW5wdXRzIGFuZCBTb3VyY2UgT3V0cHV0cworICoKKyAqIElmIGFuIGFwcGxpY2F0aW9uIGRlc2lyZXMgdG8gbW9kaWZ5IHRoZSB2b2x1bWUgb2YganVzdCBhIHNpbmdsZSBzdHJlYW0KKyAqIChjb21tb25seSBvbmUgb2YgaXRzIG93biBzdHJlYW1zKSwgdGhpcyBjYW4gYmUgZG9uZSBieSBzZXR0aW5nIHRoZSB2b2x1bWUKKyAqIG9mIGl0cyBhc3NvY2lhdGVkIHNpbmsgaW5wdXQgb3Igc291cmNlIG91dHB1dCwgdXNpbmcKKyAqIHBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfdm9sdW1lKCkgb3IgcGFfY29udGV4dF9zZXRfc291cmNlX291dHB1dF92b2x1bWUoKQorICoKKyAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gcmVtb3ZlIHNpbmsgaW5wdXRzIGFuZCBzb3VyY2Ugb3V0cHV0cywgdGVybWluYXRpbmcKKyAqIHRoZSBzdHJlYW1zIGFzc29jaWF0ZWQgd2l0aCB0aGVtOgorICoKKyAqIFxsaSBTaW5rIGlucHV0IC0gcGFfY29udGV4dF9raWxsX3NpbmtfaW5wdXQoKQorICogXGxpIFNvdXJjZSBvdXRwdXQgLSBwYV9jb250ZXh0X2tpbGxfc291cmNlX291dHB1dCgpCisgKgorICogXHN1YnNlY3Rpb24gbW9kdWxlX3N1YnNlYyBNb2R1bGVzCisgKgorICogU2VydmVyIG1vZHVsZXMgY2FuIGJlIHJlbW90ZWx5IGxvYWRlZCBhbmQgdW5sb2FkZWQgdXNpbmcKKyAqIHBhX2NvbnRleHRfbG9hZF9tb2R1bGUoKSBhbmQgcGFfY29udGV4dF91bmxvYWRfbW9kdWxlKCkuCisgKgorICogXHN1YnNlY3Rpb24gY2xpZW50X3N1YnNlYyBDbGllbnRzCisgKgorICogVGhlIG9ubHkgb3BlcmF0aW9uIHN1cHBvcnRlZCBvbiBjbGllbnRzLCBpcyB0aGUgcG9zc2liaWxpdHkgb2Yga2lja2luZworICogdGhlbSBvZmYgdGhlIHNlcnZlciB1c2luZyBwYV9jb250ZXh0X2tpbGxfY2xpZW50KCkuCisgKi8KKworLyoqIFxmaWxlCisgKgorICogUm91dGluZXMgZm9yIGRhZW1vbiBpbnRyb3NwZWN0aW9uLgorICoKKyAqIFNlZSBhbHNvIFxzdWJwYWdlIGludHJvc3BlY3QKKyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIEB7IFxuYW1lIFNpbmtzICovCisKKy8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBwb3J0IG9mIGEgc2luay4gIFBsZWFzZQorICogbm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlIGNhbiBiZSBleHRlbmRlZCBhcyBwYXJ0IG9mIGV2b2x1dGlvbmFyeQorICogQVBJIHVwZGF0ZXMgYXQgYW55IHRpbWUgaW4gYW55IG5ldyByZWxlYXNlLiBcc2luY2UgMC45LjE2ICovCit0eXBlZGVmIHN0cnVjdCBwYV9zaW5rX3BvcnRfaW5mbyB7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoaXMgcG9ydCAqLworICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOyAgICAgICAgICAgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhpcyBwb3J0ICovCisgICAgdWludDMyX3QgcHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgaGlnaGVyIHRoaXMgdmFsdWUgaXMgdGhlIG1vcmUgdXNlZnVsIHRoaXMgcG9ydCBpcyBhcyBhIGRlZmF1bHQgKi8KKyAgICBpbnQgYXZhaWxhYmxlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IEEgXGxpbmsgcGFfcG9ydF9hdmFpbGFibGVfdCwgaW5kaWNhdGluZyBhdmFpbGFiaWxpdHkgc3RhdHVzIG9mIHRoaXMgcG9ydC4gXHNpbmNlIDIuMCAqLworfSBwYV9zaW5rX3BvcnRfaW5mbzsKKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBzaW5rcy4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZQorICogY2FuIGJlIGV4dGVuZGVkIGFzIHBhcnQgb2YgZXZvbHV0aW9uYXJ5IEFQSSB1cGRhdGVzIGF0IGFueSB0aW1lIGluCisgKiBhbnkgbmV3IHJlbGVhc2UuICovCit0eXBlZGVmIHN0cnVjdCBwYV9zaW5rX2luZm8geworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoZSBzaW5rICovCisgICAgdWludDMyX3QgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBzaW5rICovCisgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb247ICAgICAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoaXMgc2luayAqLworICAgIHBhX3NhbXBsZV9zcGVjIHNhbXBsZV9zcGVjOyAgICAgICAgLyoqPCBTYW1wbGUgc3BlYyBvZiB0aGlzIHNpbmsgKi8KKyAgICBwYV9jaGFubmVsX21hcCBjaGFubmVsX21hcDsgICAgICAgIC8qKjwgQ2hhbm5lbCBtYXAgKi8KKyAgICB1aW50MzJfdCBvd25lcl9tb2R1bGU7ICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIG93bmluZyBtb2R1bGUgb2YgdGhpcyBzaW5rLCBvciBQQV9JTlZBTElEX0lOREVYICovCisgICAgcGFfY3ZvbHVtZSB2b2x1bWU7ICAgICAgICAgICAgICAgICAvKio8IFZvbHVtZSBvZiB0aGUgc2luayAqLworICAgIGludCBtdXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNdXRlIHN3aXRjaCBvZiB0aGUgc2luayAqLworICAgIHVpbnQzMl90IG1vbml0b3Jfc291cmNlOyAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgbW9uaXRvciBzb3VyY2UgY29ubmVjdGVkIHRvIHRoaXMgc2luayAqLworICAgIGNvbnN0IGNoYXIgKm1vbml0b3Jfc291cmNlX25hbWU7ICAgLyoqPCBUaGUgbmFtZSBvZiB0aGUgbW9uaXRvciBzb3VyY2UgKi8KKyAgICBwYV91c2VjX3QgbGF0ZW5jeTsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHF1ZXVlZCBhdWRpbyBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4gKi8KKyAgICBjb25zdCBjaGFyICpkcml2ZXI7ICAgICAgICAgICAgICAgIC8qKjwgRHJpdmVyIG5hbWUuICovCisgICAgcGFfc2lua19mbGFnc190IGZsYWdzOyAgICAgICAgICAgICAvKio8IEZsYWdzICovCisgICAgcGFfcHJvcGxpc3QgKnByb3BsaXN0OyAgICAgICAgICAgICAvKio8IFByb3BlcnR5IGxpc3QgXHNpbmNlIDAuOS4xMSAqLworICAgIHBhX3VzZWNfdCBjb25maWd1cmVkX2xhdGVuY3k7ICAgICAgLyoqPCBUaGUgbGF0ZW5jeSB0aGlzIGRldmljZSBoYXMgYmVlbiBjb25maWd1cmVkIHRvLiBcc2luY2UgMC45LjExICovCisgICAgcGFfdm9sdW1lX3QgYmFzZV92b2x1bWU7ICAgICAgICAgICAvKio8IFNvbWUga2luZCBvZiAiYmFzZSIgdm9sdW1lIHRoYXQgcmVmZXJzIHRvIHVuYW1wbGlmaWVkL3VuYXR0ZW51YXRlZCB2b2x1bWUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG91dHB1dCBkZXZpY2UuIFxzaW5jZSAwLjkuMTUgKi8KKyAgICBwYV9zaW5rX3N0YXRlX3Qgc3RhdGU7ICAgICAgICAgICAgIC8qKjwgU3RhdGUgXHNpbmNlIDAuOS4xNSAqLworICAgIHVpbnQzMl90IG5fdm9sdW1lX3N0ZXBzOyAgICAgICAgICAgLyoqPCBOdW1iZXIgb2Ygdm9sdW1lIHN0ZXBzIGZvciBzaW5rcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgdm9sdW1lcy4gXHNpbmNlIDAuOS4xNSAqLworICAgIHVpbnQzMl90IGNhcmQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBDYXJkIGluZGV4LCBvciBQQV9JTlZBTElEX0lOREVYLiBcc2luY2UgMC45LjE1ICovCisgICAgdWludDMyX3Qgbl9wb3J0czsgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnRyaWVzIGluIHBvcnQgYXJyYXkgXHNpbmNlIDAuOS4xNiAqLworICAgIHBhX3NpbmtfcG9ydF9pbmZvKiogcG9ydHM7ICAgICAgICAgLyoqPCBBcnJheSBvZiBhdmFpbGFibGUgcG9ydHMsIG9yIE5VTEwuIEFycmF5IGlzIHRlcm1pbmF0ZWQgYnkgYW4gZW50cnkgc2V0IHRvIE5VTEwuIFRoZSBudW1iZXIgb2YgZW50cmllcyBpcyBzdG9yZWQgaW4gbl9wb3J0cyBcc2luY2UgMC45LjE2ICovCisgICAgcGFfc2lua19wb3J0X2luZm8qIGFjdGl2ZV9wb3J0OyAgICAvKio8IFBvaW50ZXIgdG8gYWN0aXZlIHBvcnQgaW4gdGhlIGFycmF5LCBvciBOVUxMIFxzaW5jZSAwLjkuMTYgKi8KKyAgICB1aW50OF90IG5fZm9ybWF0czsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSBzaW5rLiBcc2luY2UgMS4wICovCisgICAgcGFfZm9ybWF0X2luZm8gKipmb3JtYXRzOyAgICAgICAgICAvKio8IEFycmF5IG9mIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSBzaW5rLiBcc2luY2UgMS4wICovCit9IHBhX3NpbmtfaW5mbzsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X25hbWUoKSBhbmQgZnJpZW5kcyAqLwordHlwZWRlZiB2b2lkICgqcGFfc2lua19pbmZvX2NiX3QpKHBhX2NvbnRleHQgKmMsIGNvbnN0IHBhX3NpbmtfaW5mbyAqaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc2luayBieSBpdHMgbmFtZSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fYnlfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBwYV9zaW5rX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc2luayBieSBpdHMgaW5kZXggKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfc2lua19pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCB0aGUgY29tcGxldGUgc2luayBsaXN0ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19saXN0KHBhX2NvbnRleHQgKmMsIHBhX3NpbmtfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIHZvbHVtZSBvZiBhIHNpbmsgZGV2aWNlIHNwZWNpZmllZCBieSBpdHMgaW5kZXggKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc2lua192b2x1bWVfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBjb25zdCBwYV9jdm9sdW1lICp2b2x1bWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIHZvbHVtZSBvZiBhIHNpbmsgZGV2aWNlIHNwZWNpZmllZCBieSBpdHMgbmFtZSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zaW5rX3ZvbHVtZV9ieV9uYW1lKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHBhX2N2b2x1bWUgKnZvbHVtZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgbXV0ZSBzd2l0Y2ggb2YgYSBzaW5rIGRldmljZSBzcGVjaWZpZWQgYnkgaXRzIGluZGV4ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NpbmtfbXV0ZV9ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIGludCBtdXRlLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBtdXRlIHN3aXRjaCBvZiBhIHNpbmsgZGV2aWNlIHNwZWNpZmllZCBieSBpdHMgbmFtZSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zaW5rX211dGVfYnlfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbXV0ZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFN1c3BlbmQvUmVzdW1lIGEgc2luay4gXHNpbmNlIDAuOS43ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc3VzcGVuZF9zaW5rX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqc2lua19uYW1lLCBpbnQgc3VzcGVuZCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQqIHVzZXJkYXRhKTsKKworLyoqIFN1c3BlbmQvUmVzdW1lIGEgc2luay4gSWYgaWR4IGlzIFBBX0lOVkFMSURfSU5ERVggYWxsIHNpbmtzIHdpbGwgYmUgc3VzcGVuZGVkLiBcc2luY2UgMC45LjcgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zdXNwZW5kX3NpbmtfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBpbnQgc3VzcGVuZCwgIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSk7CisKKy8qKiBDaGFuZ2UgdGhlIHByb2ZpbGUgb2YgYSBzaW5rLiBcc2luY2UgMC45LjE2ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NpbmtfcG9ydF9ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIGNvbnN0IGNoYXIqcG9ydCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIENoYW5nZSB0aGUgcHJvZmlsZSBvZiBhIHNpbmsuIFxzaW5jZSAwLjkuMTUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc2lua19wb3J0X2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhcipuYW1lLCBjb25zdCBjaGFyKnBvcnQsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBAfSAqLworCisvKiogQHsgXG5hbWUgU291cmNlcyAqLworCisvKiogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgcG9ydCBvZiBhIHNvdXJjZS4gIFBsZWFzZQorICogbm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlIGNhbiBiZSBleHRlbmRlZCBhcyBwYXJ0IG9mIGV2b2x1dGlvbmFyeQorICogQVBJIHVwZGF0ZXMgYXQgYW55IHRpbWUgaW4gYW55IG5ldyByZWxlYXNlLiBcc2luY2UgMC45LjE2ICovCit0eXBlZGVmIHN0cnVjdCBwYV9zb3VyY2VfcG9ydF9pbmZvIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhpcyBwb3J0ICovCisgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb247ICAgICAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGlzIHBvcnQgKi8KKyAgICB1aW50MzJfdCBwcmlvcml0eTsgICAgICAgICAgICAgICAgICAvKio8IFRoZSBoaWdoZXIgdGhpcyB2YWx1ZSBpcyB0aGUgbW9yZSB1c2VmdWwgdGhpcyBwb3J0IGlzIGFzIGEgZGVmYXVsdCAqLworICAgIGludCBhdmFpbGFibGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQSBcbGluayBwYV9wb3J0X2F2YWlsYWJsZV90LCBpbmRpY2F0aW5nIGF2YWlsYWJpbGl0eSBzdGF0dXMgb2YgdGhpcyBwb3J0LiBcc2luY2UgMi4wICovCit9IHBhX3NvdXJjZV9wb3J0X2luZm87CisKKy8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgc291cmNlcy4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZQorICogY2FuIGJlIGV4dGVuZGVkIGFzIHBhcnQgb2YgZXZvbHV0aW9uYXJ5IEFQSSB1cGRhdGVzIGF0IGFueSB0aW1lIGluCisgKiBhbnkgbmV3IHJlbGVhc2UuICovCit0eXBlZGVmIHN0cnVjdCBwYV9zb3VyY2VfaW5mbyB7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoZSBzb3VyY2UgKi8KKyAgICB1aW50MzJfdCBpbmRleDsgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBzb3VyY2UgKi8KKyAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsgICAgICAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoaXMgc291cmNlICovCisgICAgcGFfc2FtcGxlX3NwZWMgc2FtcGxlX3NwZWM7ICAgICAgICAgLyoqPCBTYW1wbGUgc3BlYyBvZiB0aGlzIHNvdXJjZSAqLworICAgIHBhX2NoYW5uZWxfbWFwIGNoYW5uZWxfbWFwOyAgICAgICAgIC8qKjwgQ2hhbm5lbCBtYXAgKi8KKyAgICB1aW50MzJfdCBvd25lcl9tb2R1bGU7ICAgICAgICAgICAgICAvKio8IE93bmluZyBtb2R1bGUgaW5kZXgsIG9yIFBBX0lOVkFMSURfSU5ERVggKi8KKyAgICBwYV9jdm9sdW1lIHZvbHVtZTsgICAgICAgICAgICAgICAgICAvKio8IFZvbHVtZSBvZiB0aGUgc291cmNlICovCisgICAgaW50IG11dGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNdXRlIHN3aXRjaCBvZiB0aGUgc2luayAqLworICAgIHVpbnQzMl90IG1vbml0b3Jfb2Zfc2luazsgICAgICAgICAgIC8qKjwgSWYgdGhpcyBpcyBhIG1vbml0b3Igc291cmNlIHRoZSBpbmRleCBvZiB0aGUgb3duaW5nIHNpbmssIG90aGVyd2lzZSBQQV9JTlZBTElEX0lOREVYICovCisgICAgY29uc3QgY2hhciAqbW9uaXRvcl9vZl9zaW5rX25hbWU7ICAgLyoqPCBOYW1lIG9mIHRoZSBvd25pbmcgc2luaywgb3IgUEFfSU5WQUxJRF9JTkRFWCAqLworICAgIHBhX3VzZWNfdCBsYXRlbmN5OyAgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIGZpbGxlZCByZWNvcmQgYnVmZmVyIG9mIHRoaXMgc291cmNlLiAqLworICAgIGNvbnN0IGNoYXIgKmRyaXZlcjsgICAgICAgICAgICAgICAgIC8qKjwgRHJpdmVyIG5hbWUgKi8KKyAgICBwYV9zb3VyY2VfZmxhZ3NfdCBmbGFnczsgICAgICAgICAgICAvKio8IEZsYWdzICovCisgICAgcGFfcHJvcGxpc3QgKnByb3BsaXN0OyAgICAgICAgICAgICAgLyoqPCBQcm9wZXJ0eSBsaXN0IFxzaW5jZSAwLjkuMTEgKi8KKyAgICBwYV91c2VjX3QgY29uZmlndXJlZF9sYXRlbmN5OyAgICAgICAvKio8IFRoZSBsYXRlbmN5IHRoaXMgZGV2aWNlIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8uIFxzaW5jZSAwLjkuMTEgKi8KKyAgICBwYV92b2x1bWVfdCBiYXNlX3ZvbHVtZTsgICAgICAgICAgICAvKio8IFNvbWUga2luZCBvZiAiYmFzZSIgdm9sdW1lIHRoYXQgcmVmZXJzIHRvIHVuYW1wbGlmaWVkL3VuYXR0ZW51YXRlZCB2b2x1bWUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGlucHV0IGRldmljZS4gXHNpbmNlIDAuOS4xNSAqLworICAgIHBhX3NvdXJjZV9zdGF0ZV90IHN0YXRlOyAgICAgICAgICAgIC8qKjwgU3RhdGUgXHNpbmNlIDAuOS4xNSAqLworICAgIHVpbnQzMl90IG5fdm9sdW1lX3N0ZXBzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHZvbHVtZSBzdGVwcyBmb3Igc291cmNlcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgdm9sdW1lcy4gXHNpbmNlIDAuOS4xNSAqLworICAgIHVpbnQzMl90IGNhcmQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2FyZCBpbmRleCwgb3IgUEFfSU5WQUxJRF9JTkRFWC4gXHNpbmNlIDAuOS4xNSAqLworICAgIHVpbnQzMl90IG5fcG9ydHM7ICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudHJpZXMgaW4gcG9ydCBhcnJheSBcc2luY2UgMC45LjE2ICovCisgICAgcGFfc291cmNlX3BvcnRfaW5mbyoqIHBvcnRzOyAgICAgICAgLyoqPCBBcnJheSBvZiBhdmFpbGFibGUgcG9ydHMsIG9yIE5VTEwuIEFycmF5IGlzIHRlcm1pbmF0ZWQgYnkgYW4gZW50cnkgc2V0IHRvIE5VTEwuIFRoZSBudW1iZXIgb2YgZW50cmllcyBpcyBzdG9yZWQgaW4gbl9wb3J0cyBcc2luY2UgMC45LjE2ICAqLworICAgIHBhX3NvdXJjZV9wb3J0X2luZm8qIGFjdGl2ZV9wb3J0OyAgIC8qKjwgUG9pbnRlciB0byBhY3RpdmUgcG9ydCBpbiB0aGUgYXJyYXksIG9yIE5VTEwgXHNpbmNlIDAuOS4xNiAgKi8KKyAgICB1aW50OF90IG5fZm9ybWF0czsgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBmb3JtYXRzIHN1cHBvcnRlZCBieSB0aGUgc291cmNlLiBcc2luY2UgMS4wICovCisgICAgcGFfZm9ybWF0X2luZm8gKipmb3JtYXRzOyAgICAgICAgICAgLyoqPCBBcnJheSBvZiBmb3JtYXRzIHN1cHBvcnRlZCBieSB0aGUgc291cmNlLiBcc2luY2UgMS4wICovCit9IHBhX3NvdXJjZV9pbmZvOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19ieV9uYW1lKCkgYW5kIGZyaWVuZHMgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3NvdXJjZV9pbmZvX2NiX3QpKHBhX2NvbnRleHQgKmMsIGNvbnN0IHBhX3NvdXJjZV9pbmZvICppLCBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzb3VyY2UgYnkgaXRzIG5hbWUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfc291cmNlX2luZm9fYnlfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBwYV9zb3VyY2VfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzb3VyY2UgYnkgaXRzIGluZGV4ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9pbmZvX2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfc291cmNlX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHRoZSBjb21wbGV0ZSBzb3VyY2UgbGlzdCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19saXN0KHBhX2NvbnRleHQgKmMsIHBhX3NvdXJjZV9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgdm9sdW1lIG9mIGEgc291cmNlIGRldmljZSBzcGVjaWZpZWQgYnkgaXRzIGluZGV4ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NvdXJjZV92b2x1bWVfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBjb25zdCBwYV9jdm9sdW1lICp2b2x1bWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIHZvbHVtZSBvZiBhIHNvdXJjZSBkZXZpY2Ugc3BlY2lmaWVkIGJ5IGl0cyBuYW1lICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NvdXJjZV92b2x1bWVfYnlfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBwYV9jdm9sdW1lICp2b2x1bWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIG11dGUgc3dpdGNoIG9mIGEgc291cmNlIGRldmljZSBzcGVjaWZpZWQgYnkgaXRzIGluZGV4ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NvdXJjZV9tdXRlX2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgaW50IG11dGUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIG11dGUgc3dpdGNoIG9mIGEgc291cmNlIGRldmljZSBzcGVjaWZpZWQgYnkgaXRzIG5hbWUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc291cmNlX211dGVfYnlfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbXV0ZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFN1c3BlbmQvUmVzdW1lIGEgc291cmNlLiBcc2luY2UgMC45LjcgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zdXNwZW5kX3NvdXJjZV9ieV9uYW1lKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKnNvdXJjZV9uYW1lLCBpbnQgc3VzcGVuZCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQqIHVzZXJkYXRhKTsKKworLyoqIFN1c3BlbmQvUmVzdW1lIGEgc291cmNlLiBJZiBpZHggaXMgUEFfSU5WQUxJRF9JTkRFWCBhbGwgc291cmNlcyB3aWxsIGJlIHN1c3BlbmRlZC4gXHNpbmNlIDAuOS43ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc3VzcGVuZF9zb3VyY2VfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBpbnQgc3VzcGVuZCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQqIHVzZXJkYXRhKTsKKworLyoqIENoYW5nZSB0aGUgcHJvZmlsZSBvZiBhIHNvdXJjZS4gXHNpbmNlIDAuOS4xNiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zb3VyY2VfcG9ydF9ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIGNvbnN0IGNoYXIqcG9ydCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIENoYW5nZSB0aGUgcHJvZmlsZSBvZiBhIHNvdXJjZS4gXHNpbmNlIDAuOS4xNSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zb3VyY2VfcG9ydF9ieV9uYW1lKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIqbmFtZSwgY29uc3QgY2hhcipwb3J0LCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQH0gKi8KKworLyoqIEB7IFxuYW1lIFNlcnZlciAqLworCisvKiogU2VydmVyIGluZm9ybWF0aW9uLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlIGNhbiBiZQorICogZXh0ZW5kZWQgYXMgcGFydCBvZiBldm9sdXRpb25hcnkgQVBJIHVwZGF0ZXMgYXQgYW55IHRpbWUgaW4gYW55IG5ldworICogcmVsZWFzZS4gKi8KK3R5cGVkZWYgc3RydWN0IHBhX3NlcnZlcl9pbmZvIHsKKyAgICBjb25zdCBjaGFyICp1c2VyX25hbWU7ICAgICAgICAgICAgICAvKio8IFVzZXIgbmFtZSBvZiB0aGUgZGFlbW9uIHByb2Nlc3MgKi8KKyAgICBjb25zdCBjaGFyICpob3N0X25hbWU7ICAgICAgICAgICAgICAvKio8IEhvc3QgbmFtZSB0aGUgZGFlbW9uIGlzIHJ1bm5pbmcgb24gKi8KKyAgICBjb25zdCBjaGFyICpzZXJ2ZXJfdmVyc2lvbjsgICAgICAgICAvKio8IFZlcnNpb24gc3RyaW5nIG9mIHRoZSBkYWVtb24gKi8KKyAgICBjb25zdCBjaGFyICpzZXJ2ZXJfbmFtZTsgICAgICAgICAgICAvKio8IFNlcnZlciBwYWNrYWdlIG5hbWUgKHVzdWFsbHkgInB1bHNlYXVkaW8iKSAqLworICAgIHBhX3NhbXBsZV9zcGVjIHNhbXBsZV9zcGVjOyAgICAgICAgIC8qKjwgRGVmYXVsdCBzYW1wbGUgc3BlY2lmaWNhdGlvbiAqLworICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfc2lua19uYW1lOyAgICAgIC8qKjwgTmFtZSBvZiBkZWZhdWx0IHNpbmsuICovCisgICAgY29uc3QgY2hhciAqZGVmYXVsdF9zb3VyY2VfbmFtZTsgICAgLyoqPCBOYW1lIG9mIGRlZmF1bHQgc291cmNlLiAqLworICAgIHVpbnQzMl90IGNvb2tpZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgQSByYW5kb20gY29va2llIGZvciBpZGVudGlmeWluZyB0aGlzIGluc3RhbmNlIG9mIFB1bHNlQXVkaW8uICovCisgICAgcGFfY2hhbm5lbF9tYXAgY2hhbm5lbF9tYXA7ICAgICAgICAgLyoqPCBEZWZhdWx0IGNoYW5uZWwgbWFwLiBcc2luY2UgMC45LjE1ICovCit9IHBhX3NlcnZlcl9pbmZvOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9jb250ZXh0X2dldF9zZXJ2ZXJfaW5mbygpICovCit0eXBlZGVmIHZvaWQgKCpwYV9zZXJ2ZXJfaW5mb19jYl90KSAocGFfY29udGV4dCAqYywgY29uc3QgcGFfc2VydmVyX2luZm8qaSwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZlciAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zZXJ2ZXJfaW5mbyhwYV9jb250ZXh0ICpjLCBwYV9zZXJ2ZXJfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBAfSAqLworCisvKiogQHsgXG5hbWUgTW9kdWxlcyAqLworCisvKiogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IG1vZHVsZXMuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUKKyAqIGNhbiBiZSBleHRlbmRlZCBhcyBwYXJ0IG9mIGV2b2x1dGlvbmFyeSBBUEkgdXBkYXRlcyBhdCBhbnkgdGltZSBpbgorICogYW55IG5ldyByZWxlYXNlLiAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfbW9kdWxlX2luZm8geworICAgIHVpbnQzMl90IGluZGV4OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIG1vZHVsZSAqLworICAgIGNvbnN0IGNoYXIqbmFtZSwgICAgICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgbW9kdWxlICovCisgICAgICAgICphcmd1bWVudDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBcmd1bWVudCBzdHJpbmcgb2YgdGhlIG1vZHVsZSAqLworICAgIHVpbnQzMl90IG5fdXNlZDsgICAgICAgICAgICAgICAgICAgIC8qKjwgVXNhZ2UgY291bnRlciBvciBQQV9JTlZBTElEX0lOREVYICovCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyAgICBpbnQgYXV0b191bmxvYWQ7ICAgICAgICAgICAgICAgICAgICAvKio8IFxkZXByZWNhdGVkIE5vbi16ZXJvIGlmIHRoaXMgaXMgYW4gYXV0b2xvYWRlZCBtb2R1bGUgKi8KKy8qKiBcZW5kY29uZCAqLworICAgIHBhX3Byb3BsaXN0ICpwcm9wbGlzdDsgICAgICAgICAgICAgIC8qKjwgUHJvcGVydHkgbGlzdCBcc2luY2UgMC45LjE1ICovCit9IHBhX21vZHVsZV9pbmZvOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9jb250ZXh0X2dldF9tb2R1bGVfaW5mbygpIGFuZCBmcmllbmRzKi8KK3R5cGVkZWYgdm9pZCAoKnBhX21vZHVsZV9pbmZvX2NiX3QpIChwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9tb2R1bGVfaW5mbyppLCBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgc29tZSBpbmZvcm1hdGlvbiBhYm91dCBhIG1vZHVsZSBieSBpdHMgaW5kZXggKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfbW9kdWxlX2luZm8ocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBwYV9tb2R1bGVfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgY3VycmVudGx5IGxvYWRlZCBtb2R1bGVzICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X21vZHVsZV9pbmZvX2xpc3QocGFfY29udGV4dCAqYywgcGFfbW9kdWxlX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9jb250ZXh0X2xvYWRfbW9kdWxlKCkgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2NvbnRleHRfaW5kZXhfY2JfdCkocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBMb2FkIGEgbW9kdWxlLiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2xvYWRfbW9kdWxlKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIqbmFtZSwgY29uc3QgY2hhciAqYXJndW1lbnQsIHBhX2NvbnRleHRfaW5kZXhfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogVW5sb2FkIGEgbW9kdWxlLiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3VubG9hZF9tb2R1bGUocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQH0gKi8KKworLyoqIEB7IFxuYW1lIENsaWVudHMgKi8KKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBjbGllbnRzLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlCisgKiBjYW4gYmUgZXh0ZW5kZWQgYXMgcGFydCBvZiBldm9sdXRpb25hcnkgQVBJIHVwZGF0ZXMgYXQgYW55IHRpbWUgaW4KKyAqIGFueSBuZXcgcmVsZWFzZS4gKi8KK3R5cGVkZWYgc3RydWN0IHBhX2NsaWVudF9pbmZvIHsKKyAgICB1aW50MzJfdCBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGlzIGNsaWVudCAqLworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhpcyBjbGllbnQgKi8KKyAgICB1aW50MzJfdCBvd25lcl9tb2R1bGU7ICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgb3duaW5nIG1vZHVsZSwgb3IgUEFfSU5WQUxJRF9JTkRFWCAqLworICAgIGNvbnN0IGNoYXIgKmRyaXZlcjsgICAgICAgICAgICAgICAgICAvKio8IERyaXZlciBuYW1lICovCisgICAgcGFfcHJvcGxpc3QgKnByb3BsaXN0OyAgICAgICAgICAgICAgIC8qKjwgUHJvcGVydHkgbGlzdCBcc2luY2UgMC45LjExICovCit9IHBhX2NsaWVudF9pbmZvOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9jb250ZXh0X2dldF9jbGllbnRfaW5mbygpIGFuZCBmcmllbmRzKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2NsaWVudF9pbmZvX2NiX3QpIChwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9jbGllbnRfaW5mbyppLCBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBjbGllbnQgYnkgaXRzIGluZGV4ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X2NsaWVudF9pbmZvKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfY2xpZW50X2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHRoZSBjb21wbGV0ZSBjbGllbnQgbGlzdCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9jbGllbnRfaW5mb19saXN0KHBhX2NvbnRleHQgKmMsIHBhX2NsaWVudF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEtpbGwgYSBjbGllbnQuICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfa2lsbF9jbGllbnQocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQH0gKi8KKworLyoqIEB7IFxuYW1lIENhcmRzICovCisKKy8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBwcm9maWxlIG9mIGEgY2FyZC4gIFBsZWFzZQorICogbm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlIGNhbiBiZSBleHRlbmRlZCBhcyBwYXJ0IG9mIGV2b2x1dGlvbmFyeQorICogQVBJIHVwZGF0ZXMgYXQgYW55IHRpbWUgaW4gYW55IG5ldyByZWxlYXNlLiBcc2luY2UgMC45LjE1ICovCit0eXBlZGVmIHN0cnVjdCBwYV9jYXJkX3Byb2ZpbGVfaW5mbyB7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoaXMgcHJvZmlsZSAqLworICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOyAgICAgICAgICAgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhpcyBwcm9maWxlICovCisgICAgdWludDMyX3Qgbl9zaW5rczsgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2Ygc2lua3MgdGhpcyBwcm9maWxlIHdvdWxkIGNyZWF0ZSAqLworICAgIHVpbnQzMl90IG5fc291cmNlczsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHNvdXJjZXMgdGhpcyBwcm9maWxlIHdvdWxkIGNyZWF0ZSAqLworICAgIHVpbnQzMl90IHByaW9yaXR5OyAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGhpZ2hlciB0aGlzIHZhbHVlIGlzIHRoZSBtb3JlIHVzZWZ1bCB0aGlzIHByb2ZpbGUgaXMgYXMgYSBkZWZhdWx0ICovCit9IHBhX2NhcmRfcHJvZmlsZV9pbmZvOworCisvKiogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgcG9ydCBvZiBhIGNhcmQuICBQbGVhc2UKKyAqIG5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZSBjYW4gYmUgZXh0ZW5kZWQgYXMgcGFydCBvZiBldm9sdXRpb25hcnkKKyAqIEFQSSB1cGRhdGVzIGF0IGFueSB0aW1lIGluIGFueSBuZXcgcmVsZWFzZS4gXHNpbmNlIDIuMCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfY2FyZF9wb3J0X2luZm8geworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGlzIHBvcnQgKi8KKyAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsgICAgICAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoaXMgcG9ydCAqLworICAgIHVpbnQzMl90IHByaW9yaXR5OyAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGhpZ2hlciB0aGlzIHZhbHVlIGlzIHRoZSBtb3JlIHVzZWZ1bCB0aGlzIHBvcnQgaXMgYXMgYSBkZWZhdWx0ICovCisgICAgaW50IGF2YWlsYWJsZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBIFxsaW5rIHBhX3BvcnRfYXZhaWxhYmxlX3QsIGluZGljYXRpbmcgYXZhaWxhYmlsaXR5IHN0YXR1cyBvZiB0aGlzIHBvcnQuICovCisgICAgaW50IGRpcmVjdGlvbjsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGlzIGlzIGEgXGxpbmsgcGFfZGlyZWN0aW9uX3QgZW51bSwgaW5kaWNhdGluZyB0aGUgZGlyZWN0aW9uIG9mIHRoaXMgcG9ydC4gKi8KKyAgICB1aW50MzJfdCBuX3Byb2ZpbGVzOyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnRyaWVzIGluIHByb2ZpbGUgYXJyYXkgKi8KKyAgICBwYV9jYXJkX3Byb2ZpbGVfaW5mbyoqIHByb2ZpbGVzOyAgICAvKio8IEFycmF5IG9mIHBvaW50ZXJzIGF2YWlsYWJsZSBwcm9maWxlLCBvciBOVUxMLiBBcnJheSBpcyB0ZXJtaW5hdGVkIGJ5IGFuIGVudHJ5IHNldCB0byBOVUxMLiAqLworICAgIHBhX3Byb3BsaXN0ICpwcm9wbGlzdDsgICAgICAgICAgICAgIC8qKjwgUHJvcGVydHkgbGlzdCAqLworfSBwYV9jYXJkX3BvcnRfaW5mbzsKKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBjYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZQorICogY2FuIGJlIGV4dGVuZGVkIGFzIHBhcnQgb2YgZXZvbHV0aW9uYXJ5IEFQSSB1cGRhdGVzIGF0IGFueSB0aW1lIGluCisgKiBhbnkgbmV3IHJlbGVhc2UuICBcc2luY2UgMC45LjE1ICovCit0eXBlZGVmIHN0cnVjdCBwYV9jYXJkX2luZm8geworICAgIHVpbnQzMl90IGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoaXMgY2FyZCAqLworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhpcyBjYXJkICovCisgICAgdWludDMyX3Qgb3duZXJfbW9kdWxlOyAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIG93bmluZyBtb2R1bGUsIG9yIFBBX0lOVkFMSURfSU5ERVggKi8KKyAgICBjb25zdCBjaGFyICpkcml2ZXI7ICAgICAgICAgICAgICAgICAgLyoqPCBEcml2ZXIgbmFtZSAqLworICAgIHVpbnQzMl90IG5fcHJvZmlsZXM7ICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnRyaWVzIGluIHByb2ZpbGUgYXJyYXkgKi8KKyAgICBwYV9jYXJkX3Byb2ZpbGVfaW5mbyogcHJvZmlsZXM7ICAgICAgLyoqPCBBcnJheSBvZiBhdmFpbGFibGUgcHJvZmlsZSwgb3IgTlVMTC4gQXJyYXkgaXMgdGVybWluYXRlZCBieSBhbiBlbnRyeSB3aXRoIG5hbWUgc2V0IHRvIE5VTEwuIE51bWJlciBvZiBlbnRyaWVzIGlzIHN0b3JlZCBpbiBuX3Byb2ZpbGVzICovCisgICAgcGFfY2FyZF9wcm9maWxlX2luZm8qIGFjdGl2ZV9wcm9maWxlOyAvKio8IFBvaW50ZXIgdG8gYWN0aXZlIHByb2ZpbGUgaW4gdGhlIGFycmF5LCBvciBOVUxMICovCisgICAgcGFfcHJvcGxpc3QgKnByb3BsaXN0OyAgICAgICAgICAgICAgIC8qKjwgUHJvcGVydHkgbGlzdCAqLworICAgIHVpbnQzMl90IG5fcG9ydHM7ICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnRyaWVzIGluIHBvcnQgYXJyYXkgKi8KKyAgICBwYV9jYXJkX3BvcnRfaW5mbyAqKnBvcnRzOyAgICAgICAgICAgLyoqPCBBcnJheSBvZiBwb2ludGVycyB0byBwb3J0cywgb3IgTlVMTC4gQXJyYXkgaXMgdGVybWluYXRlZCBieSBhbiBlbnRyeSBzZXQgdG8gTlVMTC4gKi8KK30gcGFfY2FyZF9pbmZvOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9jb250ZXh0X2dldF9jYXJkX2luZm9fLi4uKCkgXHNpbmNlIDAuOS4xNSAqLwordHlwZWRlZiB2b2lkICgqcGFfY2FyZF9pbmZvX2NiX3QpIChwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9jYXJkX2luZm8qaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgY2FyZCBieSBpdHMgaW5kZXggXHNpbmNlIDAuOS4xNSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9jYXJkX2luZm9fYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBwYV9jYXJkX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgY2FyZCBieSBpdHMgbmFtZSBcc2luY2UgMC45LjE1ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X2NhcmRfaW5mb19ieV9uYW1lKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKm5hbWUsIHBhX2NhcmRfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgdGhlIGNvbXBsZXRlIGNhcmQgbGlzdCBcc2luY2UgMC45LjE1ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X2NhcmRfaW5mb19saXN0KHBhX2NvbnRleHQgKmMsIHBhX2NhcmRfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBDaGFuZ2UgdGhlIHByb2ZpbGUgb2YgYSBjYXJkLiBcc2luY2UgMC45LjE1ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X2NhcmRfcHJvZmlsZV9ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIGNvbnN0IGNoYXIqcHJvZmlsZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIENoYW5nZSB0aGUgcHJvZmlsZSBvZiBhIGNhcmQuIFxzaW5jZSAwLjkuMTUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfY2FyZF9wcm9maWxlX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhcipuYW1lLCBjb25zdCBjaGFyKnByb2ZpbGUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBAfSAqLworCisvKiogQHsgXG5hbWUgU2luayBJbnB1dHMgKi8KKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBzaW5rIGlucHV0cy4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZQorICogY2FuIGJlIGV4dGVuZGVkIGFzIHBhcnQgb2YgZXZvbHV0aW9uYXJ5IEFQSSB1cGRhdGVzIGF0IGFueSB0aW1lIGluCisgKiBhbnkgbmV3IHJlbGVhc2UuICovCit0eXBlZGVmIHN0cnVjdCBwYV9zaW5rX2lucHV0X2luZm8geworICAgIHVpbnQzMl90IGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBzaW5rIGlucHV0ICovCisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc2luayBpbnB1dCAqLworICAgIHVpbnQzMl90IG93bmVyX21vZHVsZTsgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBtb2R1bGUgdGhpcyBzaW5rIGlucHV0IGJlbG9uZ3MgdG8sIG9yIFBBX0lOVkFMSURfSU5ERVggd2hlbiBpdCBkb2VzIG5vdCBiZWxvbmcgdG8gYW55IG1vZHVsZSAqLworICAgIHVpbnQzMl90IGNsaWVudDsgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBjbGllbnQgdGhpcyBzaW5rIGlucHV0IGJlbG9uZ3MgdG8sIG9yIFBBX0lOVkFMSURfSU5ERVggd2hlbiBpdCBkb2VzIG5vdCBiZWxvbmcgdG8gYW55IGNsaWVudCAqLworICAgIHVpbnQzMl90IHNpbms7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBjb25uZWN0ZWQgc2luayAqLworICAgIHBhX3NhbXBsZV9zcGVjIHNhbXBsZV9zcGVjOyAgICAgICAgICAvKio8IFRoZSBzYW1wbGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2luayBpbnB1dCAqLworICAgIHBhX2NoYW5uZWxfbWFwIGNoYW5uZWxfbWFwOyAgICAgICAgICAvKio8IENoYW5uZWwgbWFwICovCisgICAgcGFfY3ZvbHVtZSB2b2x1bWU7ICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIHZvbHVtZSBvZiB0aGlzIHNpbmsgaW5wdXQgKi8KKyAgICBwYV91c2VjX3QgYnVmZmVyX3VzZWM7ICAgICAgICAgICAgICAgLyoqPCBMYXRlbmN5IGR1ZSB0byBidWZmZXJpbmcgaW4gc2luayBpbnB1dCwgc2VlIHBhX2xhdGVuY3lfaW5mbyBmb3IgZGV0YWlscyAqLworICAgIHBhX3VzZWNfdCBzaW5rX3VzZWM7ICAgICAgICAgICAgICAgICAvKio8IExhdGVuY3kgb2YgdGhlIHNpbmsgZGV2aWNlLCBzZWUgcGFfbGF0ZW5jeV9pbmZvIGZvciBkZXRhaWxzICovCisgICAgY29uc3QgY2hhciAqcmVzYW1wbGVfbWV0aG9kOyAgICAgICAgIC8qKjwgVGhlIHJlc2FtcGxpbmcgbWV0aG9kIHVzZWQgYnkgdGhpcyBzaW5rIGlucHV0LiAqLworICAgIGNvbnN0IGNoYXIgKmRyaXZlcjsgICAgICAgICAgICAgICAgICAvKio8IERyaXZlciBuYW1lICovCisgICAgaW50IG11dGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU3RyZWFtIG11dGVkIFxzaW5jZSAwLjkuNyAqLworICAgIHBhX3Byb3BsaXN0ICpwcm9wbGlzdDsgICAgICAgICAgICAgICAvKio8IFByb3BlcnR5IGxpc3QgXHNpbmNlIDAuOS4xMSAqLworICAgIGludCBjb3JrZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0cmVhbSBjb3JrZWQgXHNpbmNlIDEuMCAqLworICAgIGludCBoYXNfdm9sdW1lOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0cmVhbSBoYXMgdm9sdW1lLiBJZiBub3Qgc2V0LCB0aGVuIHRoZSBtZWFuaW5nIG9mIHRoaXMgc3RydWN0J3Mgdm9sdW1lIG1lbWJlciBpcyB1bnNwZWNpZmllZC4gXHNpbmNlIDEuMCAqLworICAgIGludCB2b2x1bWVfd3JpdGFibGU7ICAgICAgICAgICAgICAgICAvKio8IFRoZSB2b2x1bWUgY2FuIGJlIHNldC4gSWYgbm90IHNldCwgdGhlIHZvbHVtZSBjYW4gc3RpbGwgY2hhbmdlIGV2ZW4gdGhvdWdoIGNsaWVudHMgY2FuJ3QgY29udHJvbCB0aGUgdm9sdW1lLiBcc2luY2UgMS4wICovCisgICAgcGFfZm9ybWF0X2luZm8gKmZvcm1hdDsgICAgICAgICAgICAgIC8qKjwgU3RyZWFtIGZvcm1hdCBpbmZvcm1hdGlvbi4gXHNpbmNlIDEuMCAqLworfSBwYV9zaW5rX2lucHV0X2luZm87CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5wdXRfaW5mbygpIGFuZCBmcmllbmRzKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3NpbmtfaW5wdXRfaW5mb19jYl90KSAocGFfY29udGV4dCAqYywgY29uc3QgcGFfc2lua19pbnB1dF9pbmZvICppLCBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgc29tZSBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmsgaW5wdXQgYnkgaXRzIGluZGV4ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5wdXRfaW5mbyhwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX3NpbmtfaW5wdXRfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgdGhlIGNvbXBsZXRlIHNpbmsgaW5wdXQgbGlzdCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zaW5rX2lucHV0X2luZm9fbGlzdChwYV9jb250ZXh0ICpjLCBwYV9zaW5rX2lucHV0X2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogTW92ZSB0aGUgc3BlY2lmaWVkIHNpbmsgaW5wdXQgdG8gYSBkaWZmZXJlbnQgc2luay4gXHNpbmNlIDAuOS41ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfbW92ZV9zaW5rX2lucHV0X2J5X25hbWUocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBjb25zdCBjaGFyICpzaW5rX25hbWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSk7CisKKy8qKiBNb3ZlIHRoZSBzcGVjaWZpZWQgc2luayBpbnB1dCB0byBhIGRpZmZlcmVudCBzaW5rLiBcc2luY2UgMC45LjUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9tb3ZlX3NpbmtfaW5wdXRfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCB1aW50MzJfdCBzaW5rX2lkeCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQqIHVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgdm9sdW1lIG9mIGEgc2luayBpbnB1dCBzdHJlYW0gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc2lua19pbnB1dF92b2x1bWUocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBjb25zdCBwYV9jdm9sdW1lICp2b2x1bWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIG11dGUgc3dpdGNoIG9mIGEgc2luayBpbnB1dCBzdHJlYW0gXHNpbmNlIDAuOS43ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfbXV0ZShwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIGludCBtdXRlLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogS2lsbCBhIHNpbmsgaW5wdXQuICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfa2lsbF9zaW5rX2lucHV0KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEB9ICovCisKKy8qKiBAeyBcbmFtZSBTb3VyY2UgT3V0cHV0cyAqLworCisvKiogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IHNvdXJjZSBvdXRwdXRzLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlCisgKiBjYW4gYmUgZXh0ZW5kZWQgYXMgcGFydCBvZiBldm9sdXRpb25hcnkgQVBJIHVwZGF0ZXMgYXQgYW55IHRpbWUgaW4KKyAqIGFueSBuZXcgcmVsZWFzZS4gKi8KK3R5cGVkZWYgc3RydWN0IHBhX3NvdXJjZV9vdXRwdXRfaW5mbyB7CisgICAgdWludDMyX3QgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIHNvdXJjZSBvdXRwdXQgKi8KKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoZSBzb3VyY2Ugb3V0cHV0ICovCisgICAgdWludDMyX3Qgb3duZXJfbW9kdWxlOyAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIG1vZHVsZSB0aGlzIHNvdXJjZSBvdXRwdXQgYmVsb25ncyB0bywgb3IgUEFfSU5WQUxJRF9JTkRFWCB3aGVuIGl0IGRvZXMgbm90IGJlbG9uZyB0byBhbnkgbW9kdWxlICovCisgICAgdWludDMyX3QgY2xpZW50OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIGNsaWVudCB0aGlzIHNvdXJjZSBvdXRwdXQgYmVsb25ncyB0bywgb3IgUEFfSU5WQUxJRF9JTkRFWCB3aGVuIGl0IGRvZXMgbm90IGJlbG9uZyB0byBhbnkgY2xpZW50ICovCisgICAgdWludDMyX3Qgc291cmNlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIGNvbm5lY3RlZCBzb3VyY2UgKi8KKyAgICBwYV9zYW1wbGVfc3BlYyBzYW1wbGVfc3BlYzsgICAgICAgICAgLyoqPCBUaGUgc2FtcGxlIHNwZWNpZmljYXRpb24gb2YgdGhlIHNvdXJjZSBvdXRwdXQgKi8KKyAgICBwYV9jaGFubmVsX21hcCBjaGFubmVsX21hcDsgICAgICAgICAgLyoqPCBDaGFubmVsIG1hcCAqLworICAgIHBhX3VzZWNfdCBidWZmZXJfdXNlYzsgICAgICAgICAgICAgICAvKio8IExhdGVuY3kgZHVlIHRvIGJ1ZmZlcmluZyBpbiB0aGUgc291cmNlIG91dHB1dCwgc2VlIHBhX2xhdGVuY3lfaW5mbyBmb3IgZGV0YWlscy4gKi8KKyAgICBwYV91c2VjX3Qgc291cmNlX3VzZWM7ICAgICAgICAgICAgICAgLyoqPCBMYXRlbmN5IG9mIHRoZSBzb3VyY2UgZGV2aWNlLCBzZWUgcGFfbGF0ZW5jeV9pbmZvIGZvciBkZXRhaWxzLiAqLworICAgIGNvbnN0IGNoYXIgKnJlc2FtcGxlX21ldGhvZDsgICAgICAgICAvKio8IFRoZSByZXNhbXBsaW5nIG1ldGhvZCB1c2VkIGJ5IHRoaXMgc291cmNlIG91dHB1dC4gKi8KKyAgICBjb25zdCBjaGFyICpkcml2ZXI7ICAgICAgICAgICAgICAgICAgLyoqPCBEcml2ZXIgbmFtZSAqLworICAgIHBhX3Byb3BsaXN0ICpwcm9wbGlzdDsgICAgICAgICAgICAgICAvKio8IFByb3BlcnR5IGxpc3QgXHNpbmNlIDAuOS4xMSAqLworICAgIGludCBjb3JrZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0cmVhbSBjb3JrZWQgXHNpbmNlIDEuMCAqLworICAgIHBhX2N2b2x1bWUgdm9sdW1lOyAgICAgICAgICAgICAgICAgICAvKio8IFRoZSB2b2x1bWUgb2YgdGhpcyBzb3VyY2Ugb3V0cHV0IFxzaW5jZSAxLjAgKi8KKyAgICBpbnQgbXV0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdHJlYW0gbXV0ZWQgXHNpbmNlIDEuMCAqLworICAgIGludCBoYXNfdm9sdW1lOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0cmVhbSBoYXMgdm9sdW1lLiBJZiBub3Qgc2V0LCB0aGVuIHRoZSBtZWFuaW5nIG9mIHRoaXMgc3RydWN0J3Mgdm9sdW1lIG1lbWJlciBpcyB1bnNwZWNpZmllZC4gXHNpbmNlIDEuMCAqLworICAgIGludCB2b2x1bWVfd3JpdGFibGU7ICAgICAgICAgICAgICAgICAvKio8IFRoZSB2b2x1bWUgY2FuIGJlIHNldC4gSWYgbm90IHNldCwgdGhlIHZvbHVtZSBjYW4gc3RpbGwgY2hhbmdlIGV2ZW4gdGhvdWdoIGNsaWVudHMgY2FuJ3QgY29udHJvbCB0aGUgdm9sdW1lLiBcc2luY2UgMS4wICovCisgICAgcGFfZm9ybWF0X2luZm8gKmZvcm1hdDsgICAgICAgICAgICAgIC8qKjwgU3RyZWFtIGZvcm1hdCBpbmZvcm1hdGlvbi4gXHNpbmNlIDEuMCAqLworfSBwYV9zb3VyY2Vfb3V0cHV0X2luZm87CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9vdXRwdXRfaW5mbygpIGFuZCBmcmllbmRzKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3NvdXJjZV9vdXRwdXRfaW5mb19jYl90KSAocGFfY29udGV4dCAqYywgY29uc3QgcGFfc291cmNlX291dHB1dF9pbmZvICppLCBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzb3VyY2Ugb3V0cHV0IGJ5IGl0cyBpbmRleCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zb3VyY2Vfb3V0cHV0X2luZm8ocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBwYV9zb3VyY2Vfb3V0cHV0X2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHRoZSBjb21wbGV0ZSBsaXN0IG9mIHNvdXJjZSBvdXRwdXRzICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9vdXRwdXRfaW5mb19saXN0KHBhX2NvbnRleHQgKmMsIHBhX3NvdXJjZV9vdXRwdXRfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBNb3ZlIHRoZSBzcGVjaWZpZWQgc291cmNlIG91dHB1dCB0byBhIGRpZmZlcmVudCBzb3VyY2UuIFxzaW5jZSAwLjkuNSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X21vdmVfc291cmNlX291dHB1dF9ieV9uYW1lKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgY29uc3QgY2hhciAqc291cmNlX25hbWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSk7CisKKy8qKiBNb3ZlIHRoZSBzcGVjaWZpZWQgc291cmNlIG91dHB1dCB0byBhIGRpZmZlcmVudCBzb3VyY2UuIFxzaW5jZSAwLjkuNSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X21vdmVfc291cmNlX291dHB1dF9ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHVpbnQzMl90IHNvdXJjZV9pZHgsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIHZvbHVtZSBvZiBhIHNvdXJjZSBvdXRwdXQgc3RyZWFtIFxzaW5jZSAxLjAgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc291cmNlX291dHB1dF92b2x1bWUocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBjb25zdCBwYV9jdm9sdW1lICp2b2x1bWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIG11dGUgc3dpdGNoIG9mIGEgc291cmNlIG91dHB1dCBzdHJlYW0gXHNpbmNlIDEuMCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zb3VyY2Vfb3V0cHV0X211dGUocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBpbnQgbXV0ZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEtpbGwgYSBzb3VyY2Ugb3V0cHV0LiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2tpbGxfc291cmNlX291dHB1dChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBAfSAqLworCisvKiogQHsgXG5hbWUgU3RhdGlzdGljcyAqLworCisvKiogTWVtb3J5IGJsb2NrIHN0YXRpc3RpY3MuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUKKyAqIGNhbiBiZSBleHRlbmRlZCBhcyBwYXJ0IG9mIGV2b2x1dGlvbmFyeSBBUEkgdXBkYXRlcyBhdCBhbnkgdGltZSBpbgorICogYW55IG5ldyByZWxlYXNlLiAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc3RhdF9pbmZvIHsKKyAgICB1aW50MzJfdCBtZW1ibG9ja190b3RhbDsgICAgICAgICAgIC8qKjwgQ3VycmVudGx5IGFsbG9jYXRlZCBtZW1vcnkgYmxvY2tzICovCisgICAgdWludDMyX3QgbWVtYmxvY2tfdG90YWxfc2l6ZTsgICAgICAvKio8IEN1cnJlbnQgdG90YWwgc2l6ZSBvZiBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrcyAqLworICAgIHVpbnQzMl90IG1lbWJsb2NrX2FsbG9jYXRlZDsgICAgICAgLyoqPCBBbGxvY2F0ZWQgbWVtb3J5IGJsb2NrcyBkdXJpbmcgdGhlIHdob2xlIGxpZmV0aW1lIG9mIHRoZSBkYWVtb24gKi8KKyAgICB1aW50MzJfdCBtZW1ibG9ja19hbGxvY2F0ZWRfc2l6ZTsgIC8qKjwgVG90YWwgc2l6ZSBvZiBhbGwgbWVtb3J5IGJsb2NrcyBhbGxvY2F0ZWQgZHVyaW5nIHRoZSB3aG9sZSBsaWZldGltZSBvZiB0aGUgZGFlbW9uICovCisgICAgdWludDMyX3Qgc2NhY2hlX3NpemU7ICAgICAgICAgICAgICAvKio8IFRvdGFsIHNpemUgb2YgYWxsIHNhbXBsZSBjYWNoZSBlbnRyaWVzLiAqLworfSBwYV9zdGF0X2luZm87CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2NvbnRleHRfc3RhdCgpICovCit0eXBlZGVmIHZvaWQgKCpwYV9zdGF0X2luZm9fY2JfdCkgKHBhX2NvbnRleHQgKmMsIGNvbnN0IHBhX3N0YXRfaW5mbyAqaSwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGRhZW1vbiBtZW1vcnkgYmxvY2sgc3RhdGlzdGljcyAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3N0YXQocGFfY29udGV4dCAqYywgcGFfc3RhdF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEB9ICovCisKKy8qKiBAeyBcbmFtZSBDYWNoZWQgU2FtcGxlcyAqLworCisvKiogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IHNhbXBsZSBjYWNoZSBlbnRyaWVzLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlCisgKiBjYW4gYmUgZXh0ZW5kZWQgYXMgcGFydCBvZiBldm9sdXRpb25hcnkgQVBJIHVwZGF0ZXMgYXQgYW55IHRpbWUgaW4KKyAqIGFueSBuZXcgcmVsZWFzZS4gKi8KK3R5cGVkZWYgc3RydWN0IHBhX3NhbXBsZV9pbmZvIHsKKyAgICB1aW50MzJfdCBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhpcyBlbnRyeSAqLworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoaXMgZW50cnkgKi8KKyAgICBwYV9jdm9sdW1lIHZvbHVtZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgRGVmYXVsdCB2b2x1bWUgb2YgdGhpcyBlbnRyeSAqLworICAgIHBhX3NhbXBsZV9zcGVjIHNhbXBsZV9zcGVjOyAgICAgICAgICAgLyoqPCBTYW1wbGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2FtcGxlICovCisgICAgcGFfY2hhbm5lbF9tYXAgY2hhbm5lbF9tYXA7ICAgICAgICAgICAvKio8IFRoZSBjaGFubmVsIG1hcCAqLworICAgIHBhX3VzZWNfdCBkdXJhdGlvbjsgICAgICAgICAgICAgICAgICAgLyoqPCBEdXJhdGlvbiBvZiB0aGlzIGVudHJ5ICovCisgICAgdWludDMyX3QgYnl0ZXM7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBvZiB0aGlzIHNhbXBsZSBpbiBieXRlcy4gKi8KKyAgICBpbnQgbGF6eTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTm9uLXplcm8gd2hlbiB0aGlzIGlzIGEgbGF6eSBjYWNoZSBlbnRyeS4gKi8KKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsgICAgICAgICAgICAgICAgIC8qKjwgSW4gY2FzZSB0aGlzIGlzIGEgbGF6eSBjYWNoZSBlbnRyeSwgdGhlIGZpbGVuYW1lIGZvciB0aGUgc291bmQgZmlsZSB0byBiZSBsb2FkZWQgb24gZGVtYW5kLiAqLworICAgIHBhX3Byb3BsaXN0ICpwcm9wbGlzdDsgICAgICAgICAgICAgICAgLyoqPCBQcm9wZXJ0eSBsaXN0IGZvciB0aGlzIHNhbXBsZS4gXHNpbmNlIDAuOS4xMSAqLworfSBwYV9zYW1wbGVfaW5mbzsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfY29udGV4dF9nZXRfc2FtcGxlX2luZm9fYnlfbmFtZSgpIGFuZCBmcmllbmRzICovCit0eXBlZGVmIHZvaWQgKCpwYV9zYW1wbGVfaW5mb19jYl90KShwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9zYW1wbGVfaW5mbyAqaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc2FtcGxlIGJ5IGl0cyBuYW1lICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NhbXBsZV9pbmZvX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgcGFfc2FtcGxlX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc2FtcGxlIGJ5IGl0cyBpbmRleCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zYW1wbGVfaW5mb19ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX3NhbXBsZV9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCB0aGUgY29tcGxldGUgbGlzdCBvZiBzYW1wbGVzIHN0b3JlZCBpbiB0aGUgZGFlbW9uLiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zYW1wbGVfaW5mb19saXN0KHBhX2NvbnRleHQgKmMsIHBhX3NhbXBsZV9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEB9ICovCisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworCisvKiogQHsgXG5hbWUgQXV0b2xvYWQgRW50cmllcyAqLworCisvKiogXGRlcHJlY2F0ZWQgVHlwZSBvZiBhbiBhdXRvbG9hZCBlbnRyeS4gKi8KK3R5cGVkZWYgZW51bSBwYV9hdXRvbG9hZF90eXBlIHsKKyAgICBQQV9BVVRPTE9BRF9TSU5LID0gMCwKKyAgICBQQV9BVVRPTE9BRF9TT1VSQ0UgPSAxCit9IHBhX2F1dG9sb2FkX3R5cGVfdDsKKworLyoqIFxkZXByZWNhdGVkIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBhdXRvbG9hZCBlbnRyaWVzLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlCisgKiBjYW4gYmUgZXh0ZW5kZWQgYXMgcGFydCBvZiBldm9sdXRpb25hcnkgQVBJIHVwZGF0ZXMgYXQgYW55IHRpbWUgaW4KKyAqIGFueSBuZXcgcmVsZWFzZS4gKi8KK3R5cGVkZWYgc3RydWN0IHBhX2F1dG9sb2FkX2luZm8geworICAgIHVpbnQzMl90IGluZGV4OyAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhpcyBhdXRvbG9hZCBlbnRyeSAqLworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc2luayBvciBzb3VyY2UgKi8KKyAgICBwYV9hdXRvbG9hZF90eXBlX3QgdHlwZTsgICAgICAvKio8IFR5cGUgb2YgdGhlIGF1dG9sb2FkIGVudHJ5ICovCisgICAgY29uc3QgY2hhciAqbW9kdWxlOyAgICAgICAgICAgLyoqPCBNb2R1bGUgbmFtZSB0byBsb2FkICovCisgICAgY29uc3QgY2hhciAqYXJndW1lbnQ7ICAgICAgICAgLyoqPCBBcmd1bWVudCBzdHJpbmcgZm9yIG1vZHVsZSAqLworfSBwYV9hdXRvbG9hZF9pbmZvOworCisvKiogXGRlcHJlY2F0ZWQgQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9jb250ZXh0X2dldF9hdXRvbG9hZF9pbmZvX2J5X25hbWUoKSBhbmQgZnJpZW5kcyAqLwordHlwZWRlZiB2b2lkICgqcGFfYXV0b2xvYWRfaW5mb19jYl90KShwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9hdXRvbG9hZF9pbmZvICppLCBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBcZGVwcmVjYXRlZCBHZXQgaW5mbyBhYm91dCBhIHNwZWNpZmljIGF1dG9sb2FkIGVudHJ5LiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9hdXRvbG9hZF9pbmZvX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgcGFfYXV0b2xvYWRfdHlwZV90IHR5cGUsIHBhX2F1dG9sb2FkX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpIFBBX0dDQ19ERVBSRUNBVEVEOworCisvKiogXGRlcHJlY2F0ZWQgR2V0IGluZm8gYWJvdXQgYSBzcGVjaWZpYyBhdXRvbG9hZCBlbnRyeS4gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfYXV0b2xvYWRfaW5mb19ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX2F1dG9sb2FkX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpIFBBX0dDQ19ERVBSRUNBVEVEOworCisvKiogXGRlcHJlY2F0ZWQgR2V0IHRoZSBjb21wbGV0ZSBsaXN0IG9mIGF1dG9sb2FkIGVudHJpZXMuICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X2F1dG9sb2FkX2luZm9fbGlzdChwYV9jb250ZXh0ICpjLCBwYV9hdXRvbG9hZF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKSBQQV9HQ0NfREVQUkVDQVRFRDsKKworLyoqIFxkZXByZWNhdGVkIEFkZCBhIG5ldyBhdXRvbG9hZCBlbnRyeS4gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9hZGRfYXV0b2xvYWQocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgcGFfYXV0b2xvYWRfdHlwZV90IHR5cGUsIGNvbnN0IGNoYXIgKm1vZHVsZSwgY29uc3QgY2hhciphcmd1bWVudCwgcGFfY29udGV4dF9pbmRleF9jYl90LCB2b2lkKiB1c2VyZGF0YSkgUEFfR0NDX0RFUFJFQ0FURUQ7CisKKy8qKiBcZGVwcmVjYXRlZCBSZW1vdmUgYW4gYXV0b2xvYWQgZW50cnkuICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfcmVtb3ZlX2F1dG9sb2FkX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgcGFfYXV0b2xvYWRfdHlwZV90IHR5cGUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSkgUEFfR0NDX0RFUFJFQ0FURUQ7CisKKy8qKiBcZGVwcmVjYXRlZCBSZW1vdmUgYW4gYXV0b2xvYWQgZW50cnkuICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfcmVtb3ZlX2F1dG9sb2FkX2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQqIHVzZXJkYXRhKSBQQV9HQ0NfREVQUkVDQVRFRDsKKworLyoqIEB9ICovCisKKy8qKiBcZW5kY29uZCAqLworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9tYWlubG9vcC1hcGkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvbWFpbmxvb3AtYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4YWUxOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvbWFpbmxvb3AtYXBpLmgKQEAgLTAsMCArMSwxMjIgQEAKKyNpZm5kZWYgZm9vbWFpbmxvb3BhcGloZm9vCisjZGVmaW5lIGZvb21haW5sb29wYXBpaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgTGljZW5zZSBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBcZmlsZQorICoKKyAqIE1haW4gbG9vcCBhYnN0cmFjdGlvbiBsYXllci4gQm90aCB0aGUgUHVsc2VBdWRpbyBjb3JlIGFuZCB0aGUKKyAqIFB1bHNlQXVkaW8gY2xpZW50IGxpYnJhcnkgdXNlIGEgbWFpbiBsb29wIGFic3RyYWN0aW9uIGxheWVyLiBEdWUgdG8KKyAqIHRoaXMgaXQgaXMgcG9zc2libGUgdG8gZW1iZWQgUHVsc2VBdWRpbyBpbnRvIG90aGVyCisgKiBhcHBsaWNhdGlvbnMgZWFzaWx5LiBUd28gbWFpbiBsb29wIGltcGxlbWVudGF0aW9ucyBhcmUKKyAqIGN1cnJlbnRseSBhdmFpbGFibGU6CisgKiBcbGkgQSBtaW5pbWFsIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIHRoZSBDIGxpYnJhcnkncyBwb2xsKCkgZnVuY3Rpb24gKFNlZSBccmVmIG1haW5sb29wLmgpCisgKiBcbGkgQSB3cmFwcGVyIGFyb3VuZCB0aGUgR0xJQiBtYWluIGxvb3AuIFVzZSB0aGlzIHRvIGVtYmVkIFB1bHNlQXVkaW8gaW50byB5b3VyIEdMSUIvR1RLKy9HTk9NRSBwcm9ncmFtcyAoU2VlIFxyZWYgZ2xpYi1tYWlubG9vcC5oKQorICoKKyAqIFRoZSBzdHJ1Y3R1cmUgcGFfbWFpbmxvb3BfYXBpIGlzIHVzZWQgYXMgdnRhYmxlIGZvciB0aGUgbWFpbiBsb29wIGFic3RyYWN0aW9uLgorICoKKyAqIFRoaXMgbWFpbmxvb3AgYWJzdHJhY3Rpb24gbGF5ZXIgaGFzIG5vIGRpcmVjdCBzdXBwb3J0IGZvciBVTklYIHNpZ25hbHMuIEdlbmVyaWMsIG1haW5sb29wIGltcGxlbWVudGF0aW9uIGFnbm9zdGljIHN1cHBvcnQgaXMgYXZhaWxhYmxlIHRocm91Z2ggXHJlZiBtYWlubG9vcC1zaWduYWwuaC4KKyAqICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogQW4gYWJzdHJhY3QgbWFpbmxvb3AgQVBJIHZ0YWJsZSAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfbWFpbmxvb3BfYXBpIHBhX21haW5sb29wX2FwaTsKKworLyoqIEEgYml0bWFzayBmb3IgSU8gZXZlbnRzICovCit0eXBlZGVmIGVudW0gcGFfaW9fZXZlbnRfZmxhZ3MgeworICAgIFBBX0lPX0VWRU5UX05VTEwgPSAwLCAgICAgLyoqPCBObyBldmVudCAqLworICAgIFBBX0lPX0VWRU5UX0lOUFVUID0gMSwgICAgLyoqPCBJbnB1dCBldmVudCAqLworICAgIFBBX0lPX0VWRU5UX09VVFBVVCA9IDIsICAgLyoqPCBPdXRwdXQgZXZlbnQgKi8KKyAgICBQQV9JT19FVkVOVF9IQU5HVVAgPSA0LCAgIC8qKjwgSGFuZ3VwIGV2ZW50ICovCisgICAgUEFfSU9fRVZFTlRfRVJST1IgPSA4ICAgICAvKio8IEVycm9yIGV2ZW50ICovCit9IHBhX2lvX2V2ZW50X2ZsYWdzX3Q7CisKKy8qKiBBbiBvcGFxdWUgSU8gZXZlbnQgc291cmNlIG9iamVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfaW9fZXZlbnQgcGFfaW9fZXZlbnQ7CisvKiogQW4gSU8gZXZlbnQgY2FsbGJhY2sgcHJvdG90eXBlIFxzaW5jZSAwLjkuMyAqLwordHlwZWRlZiB2b2lkICgqcGFfaW9fZXZlbnRfY2JfdCkocGFfbWFpbmxvb3BfYXBpKmVhLCBwYV9pb19ldmVudCogZSwgaW50IGZkLCBwYV9pb19ldmVudF9mbGFnc190IGV2ZW50cywgdm9pZCAqdXNlcmRhdGEpOworLyoqIEEgSU8gZXZlbnQgZGVzdHJveSBjYWxsYmFjayBwcm90b3R5cGUgXCBzaW5jZSAwLjkuMyAqLwordHlwZWRlZiB2b2lkICgqcGFfaW9fZXZlbnRfZGVzdHJveV9jYl90KShwYV9tYWlubG9vcF9hcGkqYSwgcGFfaW9fZXZlbnQgKmUsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEFuIG9wYXF1ZSB0aW1lciBldmVudCBzb3VyY2Ugb2JqZWN0ICovCit0eXBlZGVmIHN0cnVjdCBwYV90aW1lX2V2ZW50IHBhX3RpbWVfZXZlbnQ7CisvKiogQSB0aW1lIGV2ZW50IGNhbGxiYWNrIHByb3RvdHlwZSBcc2luY2UgMC45LjMgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3RpbWVfZXZlbnRfY2JfdCkocGFfbWFpbmxvb3BfYXBpKmEsIHBhX3RpbWVfZXZlbnQqIGUsIGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0diwgdm9pZCAqdXNlcmRhdGEpOworLyoqIEEgdGltZSBldmVudCBkZXN0cm95IGNhbGxiYWNrIHByb3RvdHlwZSBcIHNpbmNlIDAuOS4zICovCit0eXBlZGVmIHZvaWQgKCpwYV90aW1lX2V2ZW50X2Rlc3Ryb3lfY2JfdCkocGFfbWFpbmxvb3BfYXBpKmEsIHBhX3RpbWVfZXZlbnQgKmUsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEFuIG9wYXF1ZSBkZWZlcnJlZCBldmVudCBzb3VyY2Ugb2JqZWN0LiBFdmVudHMgb2YgdGhpcyB0eXBlIGFyZSB0cmlnZ2VyZWQgb25jZSBpbiBldmVyeSBtYWluIGxvb3AgaXRlcmF0aW9uICovCit0eXBlZGVmIHN0cnVjdCBwYV9kZWZlcl9ldmVudCBwYV9kZWZlcl9ldmVudDsKKy8qKiBBIGRlZmVyIGV2ZW50IGNhbGxiYWNrIHByb3RvdHlwZSBcc2luY2UgMC45LjMgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2RlZmVyX2V2ZW50X2NiX3QpKHBhX21haW5sb29wX2FwaSphLCBwYV9kZWZlcl9ldmVudCogZSwgdm9pZCAqdXNlcmRhdGEpOworLyoqIEEgZGVmZXIgZXZlbnQgZGVzdHJveSBjYWxsYmFjayBwcm90b3R5cGUgXCBzaW5jZSAwLjkuMyAqLwordHlwZWRlZiB2b2lkICgqcGFfZGVmZXJfZXZlbnRfZGVzdHJveV9jYl90KShwYV9tYWlubG9vcF9hcGkqYSwgcGFfZGVmZXJfZXZlbnQgKmUsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEFuIGFic3RyYWN0IG1haW5sb29wIEFQSSB2dGFibGUgKi8KK3N0cnVjdCBwYV9tYWlubG9vcF9hcGkgeworICAgIC8qKiBBIHBvaW50ZXIgdG8gc29tZSBwcml2YXRlLCBhcmJpdHJhcnkgZGF0YSBvZiB0aGUgbWFpbiBsb29wIGltcGxlbWVudGF0aW9uICovCisgICAgdm9pZCAqdXNlcmRhdGE7CisKKyAgICAvKiogQ3JlYXRlIGEgbmV3IElPIGV2ZW50IHNvdXJjZSBvYmplY3QgKi8KKyAgICBwYV9pb19ldmVudCogKCppb19uZXcpKHBhX21haW5sb29wX2FwaSphLCBpbnQgZmQsIHBhX2lvX2V2ZW50X2ZsYWdzX3QgZXZlbnRzLCBwYV9pb19ldmVudF9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisgICAgLyoqIEVuYWJsZSBvciBkaXNhYmxlIElPIGV2ZW50cyBvbiB0aGlzIG9iamVjdCAqLworICAgIHZvaWQgKCppb19lbmFibGUpKHBhX2lvX2V2ZW50KiBlLCBwYV9pb19ldmVudF9mbGFnc190IGV2ZW50cyk7CisgICAgLyoqIEZyZWUgYSBJTyBldmVudCBzb3VyY2Ugb2JqZWN0ICovCisgICAgdm9pZCAoKmlvX2ZyZWUpKHBhX2lvX2V2ZW50KiBlKTsKKyAgICAvKiogU2V0IGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgSU8gZXZlbnQgc291cmNlIGlzIGRlc3Ryb3llZC4gVXNlIHRoaXMgdG8gZnJlZSB0aGUgdXNlcmRhdGEgYXJndW1lbnQgaWYgcmVxdWlyZWQgKi8KKyAgICB2b2lkICgqaW9fc2V0X2Rlc3Ryb3kpKHBhX2lvX2V2ZW50ICplLCBwYV9pb19ldmVudF9kZXN0cm95X2NiX3QgY2IpOworCisgICAgLyoqIENyZWF0ZSBhIG5ldyB0aW1lciBldmVudCBzb3VyY2Ugb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFVuaXggdGltZSAqLworICAgIHBhX3RpbWVfZXZlbnQqICgqdGltZV9uZXcpKHBhX21haW5sb29wX2FwaSphLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdHYsIHBhX3RpbWVfZXZlbnRfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworICAgIC8qKiBSZXN0YXJ0IGEgcnVubmluZyBvciBleHBpcmVkIHRpbWVyIGV2ZW50IHNvdXJjZSB3aXRoIGEgbmV3IFVuaXggdGltZSAqLworICAgIHZvaWQgKCp0aW1lX3Jlc3RhcnQpKHBhX3RpbWVfZXZlbnQqIGUsIGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0dik7CisgICAgLyoqIEZyZWUgYSBkZWZlcnJlZCB0aW1lciBldmVudCBzb3VyY2Ugb2JqZWN0ICovCisgICAgdm9pZCAoKnRpbWVfZnJlZSkocGFfdGltZV9ldmVudCogZSk7CisgICAgLyoqIFNldCBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIHRpbWVyIGV2ZW50IHNvdXJjZSBpcyBkZXN0cm95ZWQuIFVzZSB0aGlzIHRvIGZyZWUgdGhlIHVzZXJkYXRhIGFyZ3VtZW50IGlmIHJlcXVpcmVkICovCisgICAgdm9pZCAoKnRpbWVfc2V0X2Rlc3Ryb3kpKHBhX3RpbWVfZXZlbnQgKmUsIHBhX3RpbWVfZXZlbnRfZGVzdHJveV9jYl90IGNiKTsKKworICAgIC8qKiBDcmVhdGUgYSBuZXcgZGVmZXJyZWQgZXZlbnQgc291cmNlIG9iamVjdCAqLworICAgIHBhX2RlZmVyX2V2ZW50KiAoKmRlZmVyX25ldykocGFfbWFpbmxvb3BfYXBpKmEsIHBhX2RlZmVyX2V2ZW50X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKyAgICAvKiogRW5hYmxlIG9yIGRpc2FibGUgYSBkZWZlcnJlZCBldmVudCBzb3VyY2UgdGVtcG9yYXJpbHkgKi8KKyAgICB2b2lkICgqZGVmZXJfZW5hYmxlKShwYV9kZWZlcl9ldmVudCogZSwgaW50IGIpOworICAgIC8qKiBGcmVlIGEgZGVmZXJyZWQgZXZlbnQgc291cmNlIG9iamVjdCAqLworICAgIHZvaWQgKCpkZWZlcl9mcmVlKShwYV9kZWZlcl9ldmVudCogZSk7CisgICAgLyoqIFNldCBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIGRlZmVycmVkIGV2ZW50IHNvdXJjZSBpcyBkZXN0cm95ZWQuIFVzZSB0aGlzIHRvIGZyZWUgdGhlIHVzZXJkYXRhIGFyZ3VtZW50IGlmIHJlcXVpcmVkICovCisgICAgdm9pZCAoKmRlZmVyX3NldF9kZXN0cm95KShwYV9kZWZlcl9ldmVudCAqZSwgcGFfZGVmZXJfZXZlbnRfZGVzdHJveV9jYl90IGNiKTsKKworICAgIC8qKiBFeGl0IHRoZSBtYWluIGxvb3AgYW5kIHJldHVybiB0aGUgc3BlY2lmaWVkIHJldHZhbCovCisgICAgdm9pZCAoKnF1aXQpKHBhX21haW5sb29wX2FwaSphLCBpbnQgcmV0dmFsKTsKK307CisKKy8qKiBSdW4gdGhlIHNwZWNpZmllZCBjYWxsYmFjayBmdW5jdGlvbiBvbmNlIGZyb20gdGhlIG1haW4gbG9vcCB1c2luZyBhbiBhbm9ueW1vdXMgZGVmZXIgZXZlbnQuICovCit2b2lkIHBhX21haW5sb29wX2FwaV9vbmNlKHBhX21haW5sb29wX2FwaSptLCB2b2lkICgqY2FsbGJhY2spKHBhX21haW5sb29wX2FwaSptLCB2b2lkICp1c2VyZGF0YSksIHZvaWQgKnVzZXJkYXRhKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvbWFpbmxvb3Atc2lnbmFsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL21haW5sb29wLXNpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYjFmOWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL21haW5sb29wLXNpZ25hbC5oCkBAIC0wLDAgKzEsNjYgQEAKKyNpZm5kZWYgZm9vbWFpbmxvb3BzaWduYWxoZm9vCisjZGVmaW5lIGZvb21haW5sb29wc2lnbmFsaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwOCBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHB1bHNlL21haW5sb29wLWFwaS5oPgorI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogXGZpbGUKKyAqIFVOSVggc2lnbmFsIHN1cHBvcnQgZm9yIG1haW4gbG9vcHMuIEluIGNvbnRyYXN0IHRvIG90aGVyCisgKiBtYWluIGxvb3AgZXZlbnQgc291cmNlcyBzdWNoIGFzIHRpbWVyIGFuZCBJTyBldmVudHMsIFVOSVggc2lnbmFsCisgKiBzdXBwb3J0IHJlcXVpcmVzIG1vZGlmaWNhdGlvbiBvZiB0aGUgZ2xvYmFsIHByb2Nlc3MKKyAqIGVudmlyb25tZW50LiBEdWUgdG8gdGhpcyB0aGUgZ2VuZXJpYyBtYWluIGxvb3AgYWJzdHJhY3Rpb24gbGF5ZXIgYXMKKyAqIGRlZmluZWQgaW4gXHJlZiBtYWlubG9vcC1hcGkuaCBkb2Vzbid0IGhhdmUgZGlyZWN0IHN1cHBvcnQgZm9yIFVOSVgKKyAqIHNpZ25hbHMuIEhvd2V2ZXIsIHlvdSBtYXkgaG9vayBzaWduYWwgc3VwcG9ydCBpbnRvIGFuIGFic3RyYWN0IG1haW4gbG9vcCB2aWEgdGhlIHJvdXRpbmVzIGRlZmluZWQgaGVyZWluLgorICovCisKKy8qKiBBbiBvcGFxdWUgVU5JWCBzaWduYWwgZXZlbnQgc291cmNlIG9iamVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc2lnbmFsX2V2ZW50IHBhX3NpZ25hbF9ldmVudDsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3Igc2lnbmFsIGV2ZW50cyAqLwordHlwZWRlZiB2b2lkICgqcGFfc2lnbmFsX2NiX3QpIChwYV9tYWlubG9vcF9hcGkgKmFwaSwgcGFfc2lnbmFsX2V2ZW50KmUsIGludCBzaWcsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIERlc3Ryb3kgY2FsbGJhY2sgcHJvdG90eXBlIGZvciBzaWduYWwgZXZlbnRzICovCit0eXBlZGVmIHZvaWQgKCpwYV9zaWduYWxfZGVzdHJveV9jYl90KSAocGFfbWFpbmxvb3BfYXBpICphcGksIHBhX3NpZ25hbF9ldmVudCplLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBJbml0aWFsaXplIHRoZSBVTklYIHNpZ25hbCBzdWJzeXN0ZW0gYW5kIGJpbmQgaXQgdG8gdGhlIHNwZWNpZmllZCBtYWluIGxvb3AgKi8KK2ludCBwYV9zaWduYWxfaW5pdChwYV9tYWlubG9vcF9hcGkgKmFwaSk7CisKKy8qKiBDbGVhbnVwIHRoZSBzaWduYWwgc3Vic3lzdGVtICovCit2b2lkIHBhX3NpZ25hbF9kb25lKHZvaWQpOworCisvKiogQ3JlYXRlIGEgbmV3IFVOSVggc2lnbmFsIGV2ZW50IHNvdXJjZSBvYmplY3QgKi8KK3BhX3NpZ25hbF9ldmVudCogcGFfc2lnbmFsX25ldyhpbnQgc2lnLCBwYV9zaWduYWxfY2JfdCBjYWxsYmFjaywgdm9pZCAqdXNlcmRhdGEpOworCisvKiogRnJlZSBhIFVOSVggc2lnbmFsIGV2ZW50IHNvdXJjZSBvYmplY3QgKi8KK3ZvaWQgcGFfc2lnbmFsX2ZyZWUocGFfc2lnbmFsX2V2ZW50ICplKTsKKworLyoqIFNldCBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIHNpZ25hbCBldmVudCBzb3VyY2UgaXMgZGVzdHJveWVkLiBVc2UgdGhpcyB0byBmcmVlIHRoZSB1c2VyZGF0YSBhcmd1bWVudCBpZiByZXF1aXJlZCAqLwordm9pZCBwYV9zaWduYWxfc2V0X2Rlc3Ryb3kocGFfc2lnbmFsX2V2ZW50ICplLCBwYV9zaWduYWxfZGVzdHJveV9jYl90IGNhbGxiYWNrKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvbWFpbmxvb3AuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvbWFpbmxvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWIxN2ZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9tYWlubG9vcC5oCkBAIC0wLDAgKzEsMTMzIEBACisjaWZuZGVmIGZvb21haW5sb29waGZvbworI2RlZmluZSBmb29tYWlubG9vcGhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9tYWlubG9vcC1hcGkuaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorCitQQV9DX0RFQ0xfQkVHSU4KKworc3RydWN0IHBvbGxmZDsKKworLyoqIFxwYWdlIG1haW5sb29wIE1haW4gTG9vcAorICoKKyAqIFxzZWN0aW9uIG92ZXJ2X3NlYyBPdmVydmlldworICoKKyAqIFRoZSBidWlsdC1pbiBtYWluIGxvb3AgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIHBvbGwoKSBzeXN0ZW0gY2FsbC4KKyAqIEl0IHN1cHBvcnRzIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgbWFpbiBsb29wIGFic3RyYWN0aW9uIGFuZCB2ZXJ5CisgKiBsaXR0bGUgZWxzZS4KKyAqCisgKiBUaGUgbWFpbiBsb29wIGlzIGNyZWF0ZWQgdXNpbmcgcGFfbWFpbmxvb3BfbmV3KCkgYW5kIGRlc3Ryb3llZCB1c2luZworICogcGFfbWFpbmxvb3BfZnJlZSgpLiBUbyBnZXQgYWNjZXNzIHRvIHRoZSBtYWluIGxvb3AgYWJzdHJhY3Rpb24sCisgKiBwYV9tYWlubG9vcF9nZXRfYXBpKCkgaXMgdXNlZC4KKyAqCisgKiBcc2VjdGlvbiBpdGVyX3NlYyBJdGVyYXRpb24KKyAqCisgKiBUaGUgbWFpbiBsb29wIGlzIGRlc2lnbmVkIGFyb3VuZCB0aGUgY29uY2VwdCBvZiBpdGVyYXRpb25zLiBFYWNoIGl0ZXJhdGlvbgorICogY29uc2lzdHMgb2YgdGhyZWUgc3RlcHMgdGhhdCByZXBlYXQgZHVyaW5nIHRoZSBhcHBsaWNhdGlvbidzIGVudGlyZQorICogbGlmZXRpbWU6CisgKgorICogLSMgUHJlcGFyZSAtIEJ1aWxkIGEgbGlzdCBvZiBmaWxlIGRlc2NyaXB0b3JzCisgKiAgICAgICAgICAgICAgIHRoYXQgbmVlZCB0byBiZSBtb25pdG9yZWQgYW5kIGNhbGN1bGF0ZSB0aGUgbmV4dCB0aW1lb3V0LgorICogLSMgUG9sbCAtIEV4ZWN1dGUgdGhlIGFjdHVhbCBwb2xsKCkgc3lzdGVtIGNhbGwuCisgKiAtIyBEaXNwYXRjaCAtIERpc3BhdGNoIGFueSBldmVudHMgdGhhdCBoYXZlIGZpcmVkLgorICoKKyAqIFdoZW4gdXNpbmcgdGhlIG1haW4gbG9vcCwgdGhlIGFwcGxpY2F0aW9uIGNhbiBlaXRoZXIgZXhlY3V0ZSBlYWNoCisgKiBpdGVyYXRpb24sIG9uZSBhdCBhIHRpbWUsIHVzaW5nIHBhX21haW5sb29wX2l0ZXJhdGUoKSwgb3IgbGV0IHRoZSBsaWJyYXJ5CisgKiBpdGVyYXRlIGF1dG9tYXRpY2FsbHkgdXNpbmcgcGFfbWFpbmxvb3BfcnVuKCkuCisgKgorICogXHNlY3Rpb24gdGhyZWFkX3NlYyBUaHJlYWRzCisgKgorICogVGhlIG1haW4gbG9vcCBmdW5jdGlvbnMgYXJlIGRlc2lnbmVkIHRvIGJlIHRocmVhZCBzYWZlLCBidXQgdGhlIG9iamVjdHMKKyAqIGFyZSBub3QuIFdoYXQgdGhpcyBtZWFucyBpcyB0aGF0IG11bHRpcGxlIG1haW4gbG9vcHMgY2FuIGJlIHVzZWQsIGJ1dCBvbmx5CisgKiBvbmUgb2JqZWN0IHBlciB0aHJlYWQuCisgKgorICovCisKKy8qKiBcZmlsZQorICoKKyAqIEEgbWluaW1hbCBtYWluIGxvb3AgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gdGhlIEMgbGlicmFyeSdzIHBvbGwoKQorICogZnVuY3Rpb24uIFVzaW5nIHRoZSByb3V0aW5lcyBkZWZpbmVkIGhlcmVpbiB5b3UgbWF5IGNyZWF0ZSBhIHNpbXBsZQorICogbWFpbiBsb29wIHN1cHBvcnRpbmcgdGhlIGdlbmVyaWMgbWFpbiBsb29wIGFic3RyYWN0aW9uIGxheWVyIGFzCisgKiBkZWZpbmVkIGluIFxyZWYgbWFpbmxvb3AtYXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGhyZWFkIHNhZmUKKyAqIGFzIGxvbmcgYXMgeW91IGFjY2VzcyB0aGUgbWFpbiBsb29wIG9iamVjdCBmcm9tIGEgc2luZ2xlIHRocmVhZCBvbmx5LgorICoKKyAqIFNlZSBhbHNvIFxzdWJwYWdlIG1haW5sb29wCisgKi8KKworLyoqIEFuIG9wYXF1ZSBtYWluIGxvb3Agb2JqZWN0ICovCit0eXBlZGVmIHN0cnVjdCBwYV9tYWlubG9vcCBwYV9tYWlubG9vcDsKKworLyoqIEFsbG9jYXRlIGEgbmV3IG1haW4gbG9vcCBvYmplY3QgKi8KK3BhX21haW5sb29wICpwYV9tYWlubG9vcF9uZXcodm9pZCk7CisKKy8qKiBGcmVlIGEgbWFpbiBsb29wIG9iamVjdCAqLwordm9pZCBwYV9tYWlubG9vcF9mcmVlKHBhX21haW5sb29wKiBtKTsKKworLyoqIFByZXBhcmUgZm9yIGEgc2luZ2xlIGl0ZXJhdGlvbiBvZiB0aGUgbWFpbiBsb29wLiBSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUKK29uIGVycm9yIG9yIGV4aXQgcmVxdWVzdC4gdGltZW91dCBzcGVjaWZpZXMgYSBtYXhpbXVtIHRpbWVvdXQgZm9yIHRoZSBzdWJzZXF1ZW50Citwb2xsLCBvciAtMSBmb3IgYmxvY2tpbmcgYmVoYXZpb3VyLiAuKi8KK2ludCBwYV9tYWlubG9vcF9wcmVwYXJlKHBhX21haW5sb29wICptLCBpbnQgdGltZW91dCk7CisKKy8qKiBFeGVjdXRlIHRoZSBwcmV2aW91c2x5IHByZXBhcmVkIHBvbGwuIFJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4qLworaW50IHBhX21haW5sb29wX3BvbGwocGFfbWFpbmxvb3AgKm0pOworCisvKiogRGlzcGF0Y2ggdGltZW91dCwgaW8gYW5kIGRlZmVycmVkIGV2ZW50cyBmcm9tIHRoZSBwcmV2aW91c2x5IGV4ZWN1dGVkIHBvbGwuIFJldHVybnMKK2EgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuIE9uIHN1Y2Nlc3MgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNvdXJjZSBkaXNwYXRjaGVkLiAqLworaW50IHBhX21haW5sb29wX2Rpc3BhdGNoKHBhX21haW5sb29wICptKTsKKworLyoqIFJldHVybiB0aGUgcmV0dXJuIHZhbHVlIGFzIHNwZWNpZmllZCB3aXRoIHRoZSBtYWluIGxvb3AncyBxdWl0KCkgcm91dGluZS4gKi8KK2ludCBwYV9tYWlubG9vcF9nZXRfcmV0dmFsKHBhX21haW5sb29wICptKTsKKworLyoqIFJ1biBhIHNpbmdsZSBpdGVyYXRpb24gb2YgdGhlIG1haW4gbG9vcC4gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uCitmb3IgcGFfbWFpbmxvb3BfcHJlcGFyZSgpLCBwYV9tYWlubG9vcF9wb2xsKCkgYW5kIHBhX21haW5sb29wX2Rpc3BhdGNoKCkuCitSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3Igb3IgZXhpdCByZXF1ZXN0LiBJZiBibG9jayBpcyBub256ZXJvLAorYmxvY2sgZm9yIGV2ZW50cyBpZiBub25lIGFyZSBxdWV1ZWQuIE9wdGlvbmFsbHkgcmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgYXMKK3NwZWNpZmllZCB3aXRoIHRoZSBtYWluIGxvb3AncyBxdWl0KCkgcm91dGluZSBpbiB0aGUgaW50ZWdlciB2YXJpYWJsZSByZXR2YWwgcG9pbnRzCit0by4gT24gc3VjY2VzcyByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc291cmNlcyBkaXNwYXRjaGVkIGluIHRoaXMgaXRlcmF0aW9uLiAqLworaW50IHBhX21haW5sb29wX2l0ZXJhdGUocGFfbWFpbmxvb3AgKm0sIGludCBibG9jaywgaW50ICpyZXR2YWwpOworCisvKiogUnVuIHVubGltaXRlZCBpdGVyYXRpb25zIG9mIHRoZSBtYWluIGxvb3Agb2JqZWN0IHVudGlsIHRoZSBtYWluIGxvb3AncyBxdWl0KCkgcm91dGluZSBpcyBjYWxsZWQuICovCitpbnQgcGFfbWFpbmxvb3BfcnVuKHBhX21haW5sb29wICptLCBpbnQgKnJldHZhbCk7CisKKy8qKiBSZXR1cm4gdGhlIGFic3RyYWN0IG1haW4gbG9vcCBhYnN0cmFjdGlvbiBsYXllciB2dGFibGUgZm9yIHRoaXMKKyAgICBtYWluIGxvb3AuIE5vIG5lZWQgdG8gZnJlZSB0aGUgQVBJIGFzIGl0IGlzIG93bmVkIGJ5IHRoZSBsb29wCisgICAgYW5kIGlzIGRlc3Ryb3llZCB3aGVuIHRoZSBsb29wIGlzIGZyZWVkLiAqLworcGFfbWFpbmxvb3BfYXBpKiBwYV9tYWlubG9vcF9nZXRfYXBpKHBhX21haW5sb29wKm0pOworCisvKiogU2h1dGRvd24gdGhlIG1haW4gbG9vcCAqLwordm9pZCBwYV9tYWlubG9vcF9xdWl0KHBhX21haW5sb29wICptLCBpbnQgcik7CisKKy8qKiBJbnRlcnJ1cHQgYSBydW5uaW5nIHBvbGwgKGZvciB0aHJlYWRlZCBzeXN0ZW1zKSAqLwordm9pZCBwYV9tYWlubG9vcF93YWtldXAocGFfbWFpbmxvb3AgKm0pOworCisvKiogR2VuZXJpYyBwcm90b3R5cGUgb2YgYSBwb2xsKCkgbGlrZSBmdW5jdGlvbiAqLwordHlwZWRlZiBpbnQgKCpwYV9wb2xsX2Z1bmMpKHN0cnVjdCBwb2xsZmQgKnVmZHMsIHVuc2lnbmVkIGxvbmcgbmZkcywgaW50IHRpbWVvdXQsIHZvaWQqdXNlcmRhdGEpOworCisvKiogQ2hhbmdlIHRoZSBwb2xsKCkgaW1wbGVtZW50YXRpb24gKi8KK3ZvaWQgcGFfbWFpbmxvb3Bfc2V0X3BvbGxfZnVuYyhwYV9tYWlubG9vcCAqbSwgcGFfcG9sbF9mdW5jIHBvbGxfZnVuYywgdm9pZCAqdXNlcmRhdGEpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9vcGVyYXRpb24uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvb3BlcmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiNTY5MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvb3BlcmF0aW9uLmgKQEAgLTAsMCArMSw1NSBAQAorI2lmbmRlZiBmb29vcGVyYXRpb25oZm9vCisjZGVmaW5lIGZvb29wZXJhdGlvbmhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS9kZWYuaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBcZmlsZQorICogQXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBBbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIG9iamVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfb3BlcmF0aW9uIHBhX29wZXJhdGlvbjsKKworLyoqIEluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgYnkgb25lICovCitwYV9vcGVyYXRpb24gKnBhX29wZXJhdGlvbl9yZWYocGFfb3BlcmF0aW9uICpvKTsKKworLyoqIERlY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgYnkgb25lICovCit2b2lkIHBhX29wZXJhdGlvbl91bnJlZihwYV9vcGVyYXRpb24gKm8pOworCisvKiogQ2FuY2VsIHRoZSBvcGVyYXRpb24uIEJld2FyZSEgVGhpcyB3aWxsIG5vdCBuZWNlc3NhcmlseSBjYW5jZWwgdGhlCisgKiBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbiBvbiB0aGUgc2VydmVyIHNpZGUuIEhvd2V2ZXIgaXQgd2lsbCBtYWtlCisgKiBzdXJlIHRoYXQgdGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhdGlvbiB3aWxsIG5vdCBiZQorICogY2FsbGVkIGFueW1vcmUsIGVmZmVjdGl2ZWx5IGRpc2FibGluZyB0aGUgb3BlcmF0aW9uIGZyb20gdGhlIGNsaWVudAorICogc2lkZSdzIHZpZXcuICovCit2b2lkIHBhX29wZXJhdGlvbl9jYW5jZWwocGFfb3BlcmF0aW9uICpvKTsKKworLyoqIFJldHVybiB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbiAqLworcGFfb3BlcmF0aW9uX3N0YXRlX3QgcGFfb3BlcmF0aW9uX2dldF9zdGF0ZShwYV9vcGVyYXRpb24gKm8pOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9wcm9wbGlzdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9wcm9wbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjE4MDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3Byb3BsaXN0LmgKQEAgLTAsMCArMSw0MDUgQEAKKyNpZm5kZWYgZm9vcHVsc2Vwcm9wbGlzdGhmb28KKyNkZWZpbmUgZm9vcHVsc2Vwcm9wbGlzdGhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA3IExlbm5hcnQgUG9ldHRlcmluZworCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgTGljZW5zZSBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvZ2NjbWFjcm8uaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogRm9yIHN0cmVhbXM6IGxvY2FsaXplZCBtZWRpYSBuYW1lLCBmb3JtYXR0ZWQgYXMgVVRGLTguIGUuZy4gIkd1bnMnTidSb3NlczogQ2l2aWwgV2FyIi4qLworI2RlZmluZSBQQV9QUk9QX01FRElBX05BTUUgICAgICAgICAgICAgICAgICAgICAibWVkaWEubmFtZSIKKworLyoqIEZvciBzdHJlYW1zOiBsb2NhbGl6ZWQgbWVkaWEgdGl0bGUgaWYgYXBwbGljYWJsZSwgZm9ybWF0dGVkIGFzIFVURi04LiBlLmcuICJDaXZpbCBXYXIiICovCisjZGVmaW5lIFBBX1BST1BfTUVESUFfVElUTEUgICAgICAgICAgICAgICAgICAgICJtZWRpYS50aXRsZSIKKworLyoqIEZvciBzdHJlYW1zOiBsb2NhbGl6ZWQgbWVkaWEgYXJ0aXN0IGlmIGFwcGxpY2FibGUsIGZvcm1hdHRlZCBhcyBVVEYtOC4gZS5nLiAiR3VucydOJ1Jvc2VzIiAqLworI2RlZmluZSBQQV9QUk9QX01FRElBX0FSVElTVCAgICAgICAgICAgICAgICAgICAibWVkaWEuYXJ0aXN0IgorCisvKiogRm9yIHN0cmVhbXM6IGxvY2FsaXplZCBtZWRpYSBjb3B5cmlnaHQgc3RyaW5nIGlmIGFwcGxpY2FibGUsIGZvcm1hdHRlZCBhcyBVVEYtOC4gZS5nLiAiRXZpbCBSZWNvcmQgQ29ycC4iICovCisjZGVmaW5lIFBBX1BST1BfTUVESUFfQ09QWVJJR0hUICAgICAgICAgICAgICAgICJtZWRpYS5jb3B5cmlnaHQiCisKKy8qKiBGb3Igc3RyZWFtczogbG9jYWxpemVkIG1lZGlhIGdlbmVyYXRvciBzb2Z0d2FyZSBzdHJpbmcgaWYgYXBwbGljYWJsZSwgZm9ybWF0dGVkIGFzIFVURi04LiBlLmcuICJGb29jcm9wIEF1ZGlvRnJvYm5pY2F0b3IiICovCisjZGVmaW5lIFBBX1BST1BfTUVESUFfU09GVFdBUkUgICAgICAgICAgICAgICAgICJtZWRpYS5zb2Z0d2FyZSIKKworLyoqIEZvciBzdHJlYW1zOiBtZWRpYSBsYW5ndWFnZSBpZiBhcHBsaWNhYmxlLCBpbiBzdGFuZGFyZCBQT1NJWCBmb3JtYXQuIGUuZy4gImRlX0RFIiAqLworI2RlZmluZSBQQV9QUk9QX01FRElBX0xBTkdVQUdFICAgICAgICAgICAgICAgICAibWVkaWEubGFuZ3VhZ2UiCisKKy8qKiBGb3Igc3RyZWFtczogc291cmNlIGZpbGVuYW1lIGlmIGFwcGxpY2FibGUsIGluIFVSSSBmb3JtYXQgb3IgbG9jYWwgcGF0aC4gZS5nLiAiL2hvbWUvbGVubmFydC9tdXNpYy9mb29iYXIub2dnIiAqLworI2RlZmluZSBQQV9QUk9QX01FRElBX0ZJTEVOQU1FICAgICAgICAgICAgICAgICAibWVkaWEuZmlsZW5hbWUiCisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworLyoqIEZvciBzdHJlYW1zOiBpY29uIGZvciB0aGUgbWVkaWEuIEEgYmluYXJ5IGJsb2IgY29udGFpbmluZyBQTkcgaW1hZ2UgZGF0YSAqLworI2RlZmluZSBQQV9QUk9QX01FRElBX0lDT04gICAgICAgICAgICAgICAgICAgICAibWVkaWEuaWNvbiIKKy8qKiBcZW5kY29uZCAqLworCisvKiogRm9yIHN0cmVhbXM6IGFuIFhERyBpY29uIG5hbWUgZm9yIHRoZSBtZWRpYS4gZS5nLiAiYXVkaW8teC1tcDMiICovCisjZGVmaW5lIFBBX1BST1BfTUVESUFfSUNPTl9OQU1FICAgICAgICAgICAgICAgICJtZWRpYS5pY29uX25hbWUiCisKKy8qKiBGb3Igc3RyZWFtczogbG9naWMgcm9sZSBvZiB0aGlzIG1lZGlhLiBPbmUgb2YgdGhlIHN0cmluZ3MgInZpZGVvIiwgIm11c2ljIiwgImdhbWUiLCAiZXZlbnQiLCAicGhvbmUiLCAiYW5pbWF0aW9uIiwgInByb2R1Y3Rpb24iLCAiYTExeSIsICJ0ZXN0IiAqLworI2RlZmluZSBQQV9QUk9QX01FRElBX1JPTEUgICAgICAgICAgICAgICAgICAgICAibWVkaWEucm9sZSIKKworLyoqIEZvciBzdHJlYW1zOiB0aGUgbmFtZSBvZiBhIGZpbHRlciB0aGF0IGlzIGRlc2lyZWQsIGUuZy4gImVjaG8tY2FuY2VsIiBvciAiZXF1YWxpemVyLXNpbmsiLiBQdWxzZUF1ZGlvIG1heSBjaG9vc2UgdG8gbm90IGFwcGx5IHRoZSBmaWx0ZXIgaWYgaXQgZG9lcyBub3QgbWFrZSBzZW5zZSAoZm9yIGV4YW1wbGUsIGFwcGx5aW5nIGVjaG8tY2FuY2VsbGF0aW9uIG9uIGEgQmx1ZXRvb3RoIGhlYWRzZXQgcHJvYmFibHkgZG9lcyBub3QgbWFrZSBzZW5zZS4gXHNpbmNlIDEuMCAqLworI2RlZmluZSBQQV9QUk9QX0ZJTFRFUl9XQU5UICAgICAgICAgICAgICAgICAgICAiZmlsdGVyLndhbnQiCisKKy8qKiBGb3Igc3RyZWFtczogdGhlIG5hbWUgb2YgYSBmaWx0ZXIgdGhhdCBpcyBkZXNpcmVkLCBlLmcuICJlY2hvLWNhbmNlbCIgb3IgImVxdWFsaXplci1zaW5rIi4gRGlmZmVycyBmcm9tIFBBX1BST1BfRklMVEVSX1dBTlQgaW4gdGhhdCBpdCBmb3JjZXMgUHVsc2VBdWRpbyB0byBhcHBseSB0aGUgZmlsdGVyLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgUHVsc2VBdWRpbyB0aGlua3MgaXQgbWFrZXMgc2Vuc2UgdG8gZG8gc28gb3Igbm90LiBJZiB0aGlzIGlzIHNldCwgUEFfUFJPUF9GSUxURVJfV0FOVCBpcyBpZ25vcmVkLiBJbiBvdGhlciB3b3JkcywgeW91IGFsbW9zdCBjZXJ0YWlubHkgZG8gbm90IHdhbnQgdG8gdXNlIHRoaXMuIFxzaW5jZSAxLjAgKi8KKyNkZWZpbmUgUEFfUFJPUF9GSUxURVJfQVBQTFkgICAgICAgICAgICAgICAgICAgImZpbHRlci5hcHBseSIKKworLyoqIEZvciBzdHJlYW1zOiB0aGUgbmFtZSBvZiBhIGZpbHRlciB0aGF0IHNob3VsZCBzcGVjaWZpY2FsbHkgc3VwcHJlc3NlZCAoaS5lLiBvdmVycmlkZXMgUEFfUFJPUF9GSUxURVJfV0FOVCkuIFVzZWZ1bCBmb3IgdGhlIHRpbWVzIHRoYXQgUEFfUFJPUF9GSUxURVJfV0FOVCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIChlLmcuIGVjaG8tY2FuY2VsbGF0aW9uIGZvciBwaG9uZSBzdHJlYW1zIHdoZW4gJFZPSVBfQVBQIGRvZXMgaXQncyBvd24sIGludGVybmFsIEFFQykgXHNpbmNlIDEuMCAqLworI2RlZmluZSBQQV9QUk9QX0ZJTFRFUl9TVVBQUkVTUyAgICAgICAgICAgICAgICAiZmlsdGVyLnN1cHByZXNzIgorCisvKiogRm9yIGV2ZW50IHNvdW5kIHN0cmVhbXM6IFhERyBldmVudCBzb3VuZCBuYW1lLiBlLmcuICJtZXNzYWdlLW5ldy1lbWFpbCIgKEV2ZW50IHNvdW5kIHN0cmVhbXMgYXJlIHRob3NlIHdpdGggbWVkaWEucm9sZSBzZXQgdG8gImV2ZW50IikgKi8KKyNkZWZpbmUgUEFfUFJPUF9FVkVOVF9JRCAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50LmlkIgorCisvKiogRm9yIGV2ZW50IHNvdW5kIHN0cmVhbXM6IGxvY2FsaXplZCBodW1hbiByZWFkYWJsZSBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXZlbnQsIGZvcm1hdHRlZCBhcyBVVEYtOC4gZS5nLiAiRW1haWwgZnJvbSBsZW5uYXJ0QGV4YW1wbGUuY29tIHJlY2VpdmVkLiIgKi8KKyNkZWZpbmUgUEFfUFJPUF9FVkVOVF9ERVNDUklQVElPTiAgICAgICAgICAgICAgImV2ZW50LmRlc2NyaXB0aW9uIgorCisvKiogRm9yIGV2ZW50IHNvdW5kIHN0cmVhbXM6IGFic29sdXRlIGhvcml6b250YWwgbW91c2UgcG9zaXRpb24gb24gdGhlIHNjcmVlbiBpZiB0aGUgZXZlbnQgc291bmQgd2FzIHRyaWdnZXJlZCBieSBhIG1vdXNlIGNsaWNrLCBpbnRlZ2VyIGZvcm1hdHRlZCBhcyB0ZXh0IHN0cmluZy4gZS5nLiAiODY1IiAqLworI2RlZmluZSBQQV9QUk9QX0VWRU5UX01PVVNFX1ggICAgICAgICAgICAgICAgICAiZXZlbnQubW91c2UueCIKKworLyoqIEZvciBldmVudCBzb3VuZCBzdHJlYW1zOiBhYnNvbHV0ZSB2ZXJ0aWNhbCBtb3VzZSBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuIGlmIHRoZSBldmVudCBzb3VuZCB3YXMgdHJpZ2dlcmVkIGJ5IGEgbW91c2UgY2xpY2ssIGludGVnZXIgZm9ybWF0dGVkIGFzIHRleHQgc3RyaW5nLiBlLmcuICI0MzIiICovCisjZGVmaW5lIFBBX1BST1BfRVZFTlRfTU9VU0VfWSAgICAgICAgICAgICAgICAgICJldmVudC5tb3VzZS55IgorCisvKiogRm9yIGV2ZW50IHNvdW5kIHN0cmVhbXM6IHJlbGF0aXZlIGhvcml6b250YWwgbW91c2UgcG9zaXRpb24gb24gdGhlIHNjcmVlbiBpZiB0aGUgZXZlbnQgc291bmQgd2FzIHRyaWdnZXJlZCBieSBhIG1vdXNlIGNsaWNrLCBmbG9hdCBmb3JtYXR0ZWQgYXMgdGV4dCBzdHJpbmcsIHJhbmdpbmcgZnJvbSAwLjAgKGxlZnQgc2lkZSBvZiB0aGUgc2NyZWVuKSB0byAxLjAgKHJpZ2h0IHNpZGUgb2YgdGhlIHNjcmVlbikuIGUuZy4gIjAuNjUiICovCisjZGVmaW5lIFBBX1BST1BfRVZFTlRfTU9VU0VfSFBPUyAgICAgICAgICAgICAgICJldmVudC5tb3VzZS5ocG9zIgorCisvKiogRm9yIGV2ZW50IHNvdW5kIHN0cmVhbXM6IHJlbGF0aXZlIHZlcnRpY2FsIG1vdXNlIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4gaWYgdGhlIGV2ZW50IHNvdW5kIHdhcyB0cmlnZ2VyZWQgYnkgYSBtb3VzZSBjbGljaywgZmxvYXQgZm9ybWF0dGVkIGFzIHRleHQgc3RyaW5nLCByYW5naW5nIGZyb20gMC4wICh0b3Agb2YgdGhlIHNjcmVlbikgdG8gMS4wIChib3R0b20gb2YgdGhlIHNjcmVlbikuIGUuZy4gIjAuNDMiICovCisjZGVmaW5lIFBBX1BST1BfRVZFTlRfTU9VU0VfVlBPUyAgICAgICAgICAgICAgICJldmVudC5tb3VzZS52cG9zIgorCisvKiogRm9yIGV2ZW50IHNvdW5kIHN0cmVhbXM6IG1vdXNlIGJ1dHRvbiB0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQgaWYgYXBwbGljYWJsZSwgaW50ZWdlciBmb3JtYXR0ZWQgYXMgc3RyaW5nIHdpdGggMD1sZWZ0LCAxPW1pZGRsZSwgMj1yaWdodC4gZS5nLiAiMCIgKi8KKyNkZWZpbmUgUEFfUFJPUF9FVkVOVF9NT1VTRV9CVVRUT04gICAgICAgICAgICAgImV2ZW50Lm1vdXNlLmJ1dHRvbiIKKworLyoqIEZvciBzdHJlYW1zIHRoYXQgYmVsb25nIHRvIGEgd2luZG93IG9uIHRoZSBzY3JlZW46IGxvY2FsaXplZCB3aW5kb3cgdGl0bGUuIGUuZy4gIlRvdGVtIE11c2ljIFBsYXllciIgKi8KKyNkZWZpbmUgUEFfUFJPUF9XSU5ET1dfTkFNRSAgICAgICAgICAgICAgICAgICAgIndpbmRvdy5uYW1lIgorCisvKiogRm9yIHN0cmVhbXMgdGhhdCBiZWxvbmcgdG8gYSB3aW5kb3cgb24gdGhlIHNjcmVlbjogYSB0ZXh0dWFsIGlkIGZvciBpZGVudGlmeWluZyBhIHdpbmRvdyBsb2dpY2FsbHkuIGUuZy4gIm9yZy5nbm9tZS5Ub3RlbS5NYWluV2luZG93IiAqLworI2RlZmluZSBQQV9QUk9QX1dJTkRPV19JRCAgICAgICAgICAgICAgICAgICAgICAid2luZG93LmlkIgorCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKy8qKiBGb3Igc3RyZWFtcyB0aGF0IGJlbG9uZyB0byBhIHdpbmRvdyBvbiB0aGUgc2NyZWVuOiB3aW5kb3cgaWNvbi4gQSBiaW5hcnkgYmxvYiBjb250YWluaW5nIFBORyBpbWFnZSBkYXRhICovCisjZGVmaW5lIFBBX1BST1BfV0lORE9XX0lDT04gICAgICAgICAgICAgICAgICAgICJ3aW5kb3cuaWNvbiIKKy8qKiBcZW5kY29uZCAqLworCisvKiogRm9yIHN0cmVhbXMgdGhhdCBiZWxvbmcgdG8gYSB3aW5kb3cgb24gdGhlIHNjcmVlbjogYW4gWERHIGljb24gbmFtZSBmb3IgdGhlIHdpbmRvdy4gZS5nLiAidG90ZW0iICovCisjZGVmaW5lIFBBX1BST1BfV0lORE9XX0lDT05fTkFNRSAgICAgICAgICAgICAgICJ3aW5kb3cuaWNvbl9uYW1lIgorCisvKiogRm9yIHN0cmVhbXMgdGhhdCBiZWxvbmcgdG8gYSB3aW5kb3cgb24gdGhlIHNjcmVlbjogYWJzb2x1dGUgaG9yaXpvbnRhbCB3aW5kb3cgcG9zaXRpb24gb24gdGhlIHNjcmVlbiwgaW50ZWdlciBmb3JtYXR0ZWQgYXMgdGV4dCBzdHJpbmcuIGUuZy4gIjg2NSIuIFxzaW5jZSAwLjkuMTcgKi8KKyNkZWZpbmUgUEFfUFJPUF9XSU5ET1dfWCAgICAgICAgICAgICAgICAgICAgICAgIndpbmRvdy54IgorCisvKiogRm9yIHN0cmVhbXMgdGhhdCBiZWxvbmcgdG8gYSB3aW5kb3cgb24gdGhlIHNjcmVlbjogYWJzb2x1dGUgdmVydGljYWwgd2luZG93IHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4sIGludGVnZXIgZm9ybWF0dGVkIGFzIHRleHQgc3RyaW5nLiBlLmcuICIzNDMiLiBcc2luY2UgMC45LjE3ICovCisjZGVmaW5lIFBBX1BST1BfV0lORE9XX1kgICAgICAgICAgICAgICAgICAgICAgICJ3aW5kb3cueSIKKworLyoqIEZvciBzdHJlYW1zIHRoYXQgYmVsb25nIHRvIGEgd2luZG93IG9uIHRoZSBzY3JlZW46IHdpbmRvdyB3aWR0aCBvbiB0aGUgc2NyZWVuLCBpbnRlZ2VyIGZvcm1hdHRlZCBhcyB0ZXh0IHN0cmluZy4gZS5nLiAiMzY1Ii4gXHNpbmNlIDAuOS4xNyAqLworI2RlZmluZSBQQV9QUk9QX1dJTkRPV19XSURUSCAgICAgICAgICAgICAgICAgICAid2luZG93LndpZHRoIgorCisvKiogRm9yIHN0cmVhbXMgdGhhdCBiZWxvbmcgdG8gYSB3aW5kb3cgb24gdGhlIHNjcmVlbjogd2luZG93IGhlaWdodCBvbiB0aGUgc2NyZWVuLCBpbnRlZ2VyIGZvcm1hdHRlZCBhcyB0ZXh0IHN0cmluZy4gZS5nLiAiNjQzIi4gXHNpbmNlIDAuOS4xNyAqLworI2RlZmluZSBQQV9QUk9QX1dJTkRPV19IRUlHSFQgICAgICAgICAgICAgICAgICAid2luZG93LmhlaWdodCIKKworLyoqIEZvciBzdHJlYW1zIHRoYXQgYmVsb25nIHRvIGEgd2luZG93IG9uIHRoZSBzY3JlZW46IHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cgY2VudGVyIG9uIHRoZSBzY3JlZW4sIGZsb2F0IGZvcm1hdHRlZCBhcyB0ZXh0IHN0cmluZywgcmFuZ2luZyBmcm9tIDAuMCAobGVmdCBzaWRlIG9mIHRoZSBzY3JlZW4pIHRvIDEuMCAocmlnaHQgc2lkZSBvZiB0aGUgc2NyZWVuKS4gZS5nLiAiMC42NSIuIFxzaW5jZSAwLjkuMTcgKi8KKyNkZWZpbmUgUEFfUFJPUF9XSU5ET1dfSFBPUyAgICAgICAgICAgICAgICAgICAgIndpbmRvdy5ocG9zIgorCisvKiogRm9yIHN0cmVhbXMgdGhhdCBiZWxvbmcgdG8gYSB3aW5kb3cgb24gdGhlIHNjcmVlbjogcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyBjZW50ZXIgb24gdGhlIHNjcmVlbiwgZmxvYXQgZm9ybWF0dGVkIGFzIHRleHQgc3RyaW5nLCByYW5naW5nIGZyb20gMC4wICh0b3Agb2YgdGhlIHNjcmVlbikgdG8gMS4wIChib3R0b20gb2YgdGhlIHNjcmVlbikuIGUuZy4gIjAuNDMiLiBcc2luY2UgMC45LjE3ICovCisjZGVmaW5lIFBBX1BST1BfV0lORE9XX1ZQT1MgICAgICAgICAgICAgICAgICAgICJ3aW5kb3cudnBvcyIKKworLyoqIEZvciBzdHJlYW1zIHRoYXQgYmVsb25nIHRvIGEgd2luZG93IG9uIHRoZSBzY3JlZW46IGlmIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHN1cHBvcnRzIG11bHRpcGxlIGRlc2t0b3BzLCBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGluZGV4ZXMgb2YgdGhlIGRlc2t0b3BzIHRoaXMgd2luZG93IGlzIHZpc2libGUgb24uIElmIHRoaXMgcHJvcGVydHkgaXMgYW4gZW1wdHkgc3RyaW5nLCBpdCBpcyB2aXNpYmxlIG9uIGFsbCBkZXNrdG9wcyAoaS5lLiAnc3RpY2t5JykuIFRoZSBmaXJzdCBkZXNrdG9wIGlzIDAuIGUuZy4gIjAsMiwzIiBcc2luY2UgMC45LjE4ICovCisjZGVmaW5lIFBBX1BST1BfV0lORE9XX0RFU0tUT1AgICAgICAgICAgICAgICAgICJ3aW5kb3cuZGVza3RvcCIKKworLyoqIEZvciBzdHJlYW1zIHRoYXQgYmVsb25nIHRvIGFuIFgxMSB3aW5kb3cgb24gdGhlIHNjcmVlbjogdGhlIFgxMSBkaXNwbGF5IHN0cmluZy4gZS5nLiAiOjAuMCIgKi8KKyNkZWZpbmUgUEFfUFJPUF9XSU5ET1dfWDExX0RJU1BMQVkgICAgICAgICAgICAgIndpbmRvdy54MTEuZGlzcGxheSIKKworLyoqIEZvciBzdHJlYW1zIHRoYXQgYmVsb25nIHRvIGFuIFgxMSB3aW5kb3cgb24gdGhlIHNjcmVlbjogdGhlIFgxMSBzY3JlZW4gdGhlIHdpbmRvdyBpcyBvbiwgYW4gaW50ZWdlciBmb3JtYXR0ZWQgYXMgc3RyaW5nLiBlLmcuICIwIiAqLworI2RlZmluZSBQQV9QUk9QX1dJTkRPV19YMTFfU0NSRUVOICAgICAgICAgICAgICAid2luZG93LngxMS5zY3JlZW4iCisKKy8qKiBGb3Igc3RyZWFtcyB0aGF0IGJlbG9uZyB0byBhbiBYMTEgd2luZG93IG9uIHRoZSBzY3JlZW46IHRoZSBYMTEgbW9uaXRvciB0aGUgd2luZG93IGlzIG9uLCBhbiBpbnRlZ2VyIGZvcm1hdHRlZCBhcyBzdHJpbmcuIGUuZy4gIjAiICovCisjZGVmaW5lIFBBX1BST1BfV0lORE9XX1gxMV9NT05JVE9SICAgICAgICAgICAgICJ3aW5kb3cueDExLm1vbml0b3IiCisKKy8qKiBGb3Igc3RyZWFtcyB0aGF0IGJlbG9uZyB0byBhbiBYMTEgd2luZG93IG9uIHRoZSBzY3JlZW46IHRoZSB3aW5kb3cgWElELCBhbiBpbnRlZ2VyIGZvcm1hdHRlZCBhcyBzdHJpbmcuIGUuZy4gIjI1NjMyIiAqLworI2RlZmluZSBQQV9QUk9QX1dJTkRPV19YMTFfWElEICAgICAgICAgICAgICAgICAid2luZG93LngxMS54aWQiCisKKy8qKiBGb3IgY2xpZW50cy9zdHJlYW1zOiBsb2NhbGl6ZWQgaHVtYW4gcmVhZGFibGUgYXBwbGljYXRpb24gbmFtZS4gZS5nLiAiVG90ZW0gTXVzaWMgUGxheWVyIiAqLworI2RlZmluZSBQQV9QUk9QX0FQUExJQ0FUSU9OX05BTUUgICAgICAgICAgICAgICAiYXBwbGljYXRpb24ubmFtZSIKKworLyoqIEZvciBjbGllbnRzL3N0cmVhbXM6IGEgdGV4dHVhbCBpZCBmb3IgaWRlbnRpZnlpbmcgYW4gYXBwbGljYXRpb24gbG9naWNhbGx5LiBlLmcuICJvcmcuZ25vbWUuVG90ZW0iICovCisjZGVmaW5lIFBBX1BST1BfQVBQTElDQVRJT05fSUQgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi5pZCIKKworLyoqIEZvciBjbGllbnRzL3N0cmVhbXM6IGEgdmVyc2lvbiBzdHJpbmcgZS5nLiAiMC42Ljg4IiAqLworI2RlZmluZSBQQV9QUk9QX0FQUExJQ0FUSU9OX1ZFUlNJT04gICAgICAgICAgICAiYXBwbGljYXRpb24udmVyc2lvbiIKKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisvKiogRm9yIGNsaWVudHMvc3RyZWFtczogYXBwbGljYXRpb24gaWNvbi4gQSBiaW5hcnkgYmxvYiBjb250YWluaW5nIFBORyBpbWFnZSBkYXRhICovCisjZGVmaW5lIFBBX1BST1BfQVBQTElDQVRJT05fSUNPTiAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi5pY29uIgorLyoqIFxlbmRjb25kICovCisKKy8qKiBGb3IgY2xpZW50cy9zdHJlYW1zOiBhbiBYREcgaWNvbiBuYW1lIGZvciB0aGUgYXBwbGljYXRpb24uIGUuZy4gInRvdGVtIiAqLworI2RlZmluZSBQQV9QUk9QX0FQUExJQ0FUSU9OX0lDT05fTkFNRSAgICAgICAgICAiYXBwbGljYXRpb24uaWNvbl9uYW1lIgorCisvKiogRm9yIGNsaWVudHMvc3RyZWFtczogYXBwbGljYXRpb24gbGFuZ3VhZ2UgaWYgYXBwbGljYWJsZSwgaW4gc3RhbmRhcmQgUE9TSVggZm9ybWF0LiBlLmcuICJkZV9ERSIgKi8KKyNkZWZpbmUgUEFfUFJPUF9BUFBMSUNBVElPTl9MQU5HVUFHRSAgICAgICAgICAgImFwcGxpY2F0aW9uLmxhbmd1YWdlIgorCisvKiogRm9yIGNsaWVudHMvc3RyZWFtcyBvbiBVTklYOiBhcHBsaWNhdGlvbiBwcm9jZXNzIFBJRCwgYW4gaW50ZWdlciBmb3JtYXR0ZWQgYXMgc3RyaW5nLiBlLmcuICI0NzExIiAqLworI2RlZmluZSBQQV9QUk9QX0FQUExJQ0FUSU9OX1BST0NFU1NfSUQgICAgICAgICAiYXBwbGljYXRpb24ucHJvY2Vzcy5pZCIKKworLyoqIEZvciBjbGllbnRzL3N0cmVhbXM6IGFwcGxpY2F0aW9uIHByb2Nlc3MgbmFtZS4gZS5nLiAidG90ZW0iICovCisjZGVmaW5lIFBBX1BST1BfQVBQTElDQVRJT05fUFJPQ0VTU19CSU5BUlkgICAgICJhcHBsaWNhdGlvbi5wcm9jZXNzLmJpbmFyeSIKKworLyoqIEZvciBjbGllbnRzL3N0cmVhbXM6IGFwcGxpY2F0aW9uIHVzZXIgbmFtZS4gZS5nLiAibGVubmFydCIgKi8KKyNkZWZpbmUgUEFfUFJPUF9BUFBMSUNBVElPTl9QUk9DRVNTX1VTRVIgICAgICAgImFwcGxpY2F0aW9uLnByb2Nlc3MudXNlciIKKworLyoqIEZvciBjbGllbnRzL3N0cmVhbXM6IGhvc3QgbmFtZSB0aGUgYXBwbGljYXRpb24gcnVucyBvbi4gZS5nLiAib21lZ2EiICovCisjZGVmaW5lIFBBX1BST1BfQVBQTElDQVRJT05fUFJPQ0VTU19IT1NUICAgICAgICJhcHBsaWNhdGlvbi5wcm9jZXNzLmhvc3QiCisKKy8qKiBGb3IgY2xpZW50cy9zdHJlYW1zOiB0aGUgRC1CdXMgaG9zdCBpZCB0aGUgYXBwbGljYXRpb24gcnVucyBvbi4gZS5nLiAiNTQzNjc5ZTdiMDEzOTNlZDNlM2U2NTAwNDdkNzhmNmUiICovCisjZGVmaW5lIFBBX1BST1BfQVBQTElDQVRJT05fUFJPQ0VTU19NQUNISU5FX0lEICJhcHBsaWNhdGlvbi5wcm9jZXNzLm1hY2hpbmVfaWQiCisKKy8qKiBGb3IgY2xpZW50cy9zdHJlYW1zOiBhbiBpZCBmb3IgdGhlIGxvZ2luIHNlc3Npb24gdGhlIGFwcGxpY2F0aW9uIHJ1bnMgaW4uIE9uIFVuaXggdGhlIHZhbHVlIG9mICRYREdfU0VTU0lPTl9DT09LSUUuIGUuZy4gIjU0MzY3OWU3YjAxMzkzZWQzZTNlNjUwMDQ3ZDc4ZjZlLTEyMzUxNTk3OTguNzYxOTMtMTkwMzY3NzE3IiAqLworI2RlZmluZSBQQV9QUk9QX0FQUExJQ0FUSU9OX1BST0NFU1NfU0VTU0lPTl9JRCAiYXBwbGljYXRpb24ucHJvY2Vzcy5zZXNzaW9uX2lkIgorCisvKiogRm9yIGRldmljZXM6IGRldmljZSBzdHJpbmcgaW4gdGhlIHVuZGVybHlpbmcgYXVkaW8gbGF5ZXIncyBmb3JtYXQuIGUuZy4gInN1cnJvdW5kNTE6MCIgKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfU1RSSU5HICAgICAgICAgICAgICAgICAgImRldmljZS5zdHJpbmciCisKKy8qKiBGb3IgZGV2aWNlczogQVBJIHRoaXMgZGV2aWNlIGlzIGFjY2VzcyB3aXRoLiBlLmcuICJhbHNhIiAqLworI2RlZmluZSBQQV9QUk9QX0RFVklDRV9BUEkgICAgICAgICAgICAgICAgICAgICAiZGV2aWNlLmFwaSIKKworLyoqIEZvciBkZXZpY2VzOiBsb2NhbGl6ZWQgaHVtYW4gcmVhZGFibGUgZGV2aWNlIG9uZS1saW5lIGRlc2NyaXB0aW9uLCBlLmcuICJGb29iYXIgSW5kdXN0cmllcyBVU0IgSGVhZHNldCAyMDAwKyBVbHRyYSIgKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfREVTQ1JJUFRJT04gICAgICAgICAgICAgImRldmljZS5kZXNjcmlwdGlvbiIKKworLyoqIEZvciBkZXZpY2VzOiBidXMgcGF0aCB0byB0aGUgZGV2aWNlIGluIHRoZSBPUycgZm9ybWF0LiBlLmcuICIvc3lzL2J1cy9wY2kvZGV2aWNlcy8wMDAwOjAwOjFmLjIiICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX0JVU19QQVRIICAgICAgICAgICAgICAgICJkZXZpY2UuYnVzX3BhdGgiCisKKy8qKiBGb3IgZGV2aWNlczogc2VyaWFsIG51bWJlciBpZiBhcHBsaWNhYmxlLiBlLmcuICI0NzExLTA4MTUtMTIzNCIgKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfU0VSSUFMICAgICAgICAgICAgICAgICAgImRldmljZS5zZXJpYWwiCisKKy8qKiBGb3IgZGV2aWNlczogdmVuZG9yIElEIGlmIGFwcGxpY2FibGUuIGUuZy4gMTI3NCAqLworI2RlZmluZSBQQV9QUk9QX0RFVklDRV9WRU5ET1JfSUQgICAgICAgICAgICAgICAiZGV2aWNlLnZlbmRvci5pZCIKKworLyoqIEZvciBkZXZpY2VzOiB2ZW5kb3IgbmFtZSBpZiBhcHBsaWNhYmxlLiBlLmcuICJGb29jb3JwIEhlYXZ5IEluZHVzdHJpZXMiICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX1ZFTkRPUl9OQU1FICAgICAgICAgICAgICJkZXZpY2UudmVuZG9yLm5hbWUiCisKKy8qKiBGb3IgZGV2aWNlczogcHJvZHVjdCBJRCBpZiBhcHBsaWNhYmxlLiBlLmcuIDQ1NjUgKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfUFJPRFVDVF9JRCAgICAgICAgICAgICAgImRldmljZS5wcm9kdWN0LmlkIgorCisvKiogRm9yIGRldmljZXM6IHByb2R1Y3QgbmFtZSBpZiBhcHBsaWNhYmxlLiBlLmcuICJTdXBlclNwZWFrZXJzIDIwMDAgUHJvIiAqLworI2RlZmluZSBQQV9QUk9QX0RFVklDRV9QUk9EVUNUX05BTUUgICAgICAgICAgICAiZGV2aWNlLnByb2R1Y3QubmFtZSIKKworLyoqIEZvciBkZXZpY2VzOiBkZXZpY2UgY2xhc3MuIE9uZSBvZiAic291bmQiLCAibW9kZW0iLCAibW9uaXRvciIsICJmaWx0ZXIiICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX0NMQVNTICAgICAgICAgICAgICAgICAgICJkZXZpY2UuY2xhc3MiCisKKy8qKiBGb3IgZGV2aWNlczogZm9ybSBmYWN0b3IgaWYgYXBwbGljYWJsZS4gT25lIG9mICJpbnRlcm5hbCIsICJzcGVha2VyIiwgImhhbmRzZXQiLCAidHYiLCAid2ViY2FtIiwgIm1pY3JvcGhvbmUiLCAiaGVhZHNldCIsICJoZWFkcGhvbmUiLCAiaGFuZHMtZnJlZSIsICJjYXIiLCAiaGlmaSIsICJjb21wdXRlciIsICJwb3J0YWJsZSIgKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfRk9STV9GQUNUT1IgICAgICAgICAgICAgImRldmljZS5mb3JtX2ZhY3RvciIKKworLyoqIEZvciBkZXZpY2VzOiBidXMgb2YgdGhlIGRldmljZSBpZiBhcHBsaWNhYmxlLiBPbmUgb2YgImlzYSIsICJwY2kiLCAidXNiIiwgImZpcmV3aXJlIiwgImJsdWV0b290aCIgKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfQlVTICAgICAgICAgICAgICAgICAgICAgImRldmljZS5idXMiCisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworLyoqIEZvciBkZXZpY2VzOiBpY29uIGZvciB0aGUgZGV2aWNlLiBBIGJpbmFyeSBibG9iIGNvbnRhaW5pbmcgUE5HIGltYWdlIGRhdGEgKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfSUNPTiAgICAgICAgICAgICAgICAgICAgImRldmljZS5pY29uIgorLyoqIFxlbmRjb25kICovCisKKy8qKiBGb3IgZGV2aWNlczogYW4gWERHIGljb24gbmFtZSBmb3IgdGhlIGRldmljZS4gZS5nLiAic291bmQtY2FyZC1zcGVha2Vycy11c2IiICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX0lDT05fTkFNRSAgICAgICAgICAgICAgICJkZXZpY2UuaWNvbl9uYW1lIgorCisvKiogRm9yIGRldmljZXM6IGFjY2VzcyBtb2RlIG9mIHRoZSBkZXZpY2UgaWYgYXBwbGljYWJsZS4gT25lIG9mICJtbWFwIiwgIm1tYXBfcmV3cml0ZSIsICJzZXJpYWwiICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX0FDQ0VTU19NT0RFICAgICAgICAgICAgICJkZXZpY2UuYWNjZXNzX21vZGUiCisKKy8qKiBGb3IgZmlsdGVyIGRldmljZXM6IG1hc3RlciBkZXZpY2UgaWQgaWYgYXBwbGljYWJsZS4gKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfTUFTVEVSX0RFVklDRSAgICAgICAgICAgImRldmljZS5tYXN0ZXJfZGV2aWNlIgorCisvKiogRm9yIGRldmljZXM6IGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBpbnRlZ2VyIGZvcm1hdHRlZCBhcyBzdHJpbmcuICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX0JVRkZFUklOR19CVUZGRVJfU0laRSAgICJkZXZpY2UuYnVmZmVyaW5nLmJ1ZmZlcl9zaXplIgorCisvKiogRm9yIGRldmljZXM6IGZyYWdtZW50IHNpemUgaW4gYnl0ZXMsIGludGVnZXIgZm9ybWF0dGVkIGFzIHN0cmluZy4gKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfQlVGRkVSSU5HX0ZSQUdNRU5UX1NJWkUgImRldmljZS5idWZmZXJpbmcuZnJhZ21lbnRfc2l6ZSIKKworLyoqIEZvciBkZXZpY2VzOiBwcm9maWxlIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9maWxlIHRoaXMgZGV2aWNlcyBpcyBpbi4gZS5nLiAiYW5hbG9nLXN0ZXJlbyIsICJhbmFsb2ctc3Vycm91bmQtNDAiLCAiaWVjOTU4LXN0ZXJlbyIsIC4uLiovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX1BST0ZJTEVfTkFNRSAgICAgICAgICAgICJkZXZpY2UucHJvZmlsZS5uYW1lIgorCisvKiogRm9yIGRldmljZXM6IGludGVuZGVkIHVzZS4gQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiByb2xlcyAoc2VlIFBBX1BST1BfTUVESUFfUk9MRSkgdGhpcyBkZXZpY2UgaXMgcGFydGljdWxhcmx5IHdlbGwgc3VpdGVkIGZvciwgZHVlIHRvIGxhdGVuY3ksIHF1YWxpdHkgb3IgZm9ybSBmYWN0b3IuIFxzaW5jZSAwLjkuMTYgKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfSU5URU5ERURfUk9MRVMgICAgICAgICAgImRldmljZS5pbnRlbmRlZF9yb2xlcyIKKworLyoqIEZvciBkZXZpY2VzOiBodW1hbiByZWFkYWJsZSBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvZmlsZSB0aGlzIGRldmljZSBpcyBpbi4gZS5nLiAiQW5hbG9nIFN0ZXJlbyIsIC4uLiAqLworI2RlZmluZSBQQV9QUk9QX0RFVklDRV9QUk9GSUxFX0RFU0NSSVBUSU9OICAgICAiZGV2aWNlLnByb2ZpbGUuZGVzY3JpcHRpb24iCisKKy8qKiBGb3IgbW9kdWxlczogdGhlIGF1dGhvcidzIG5hbWUsIGZvcm1hdHRlZCBhcyBVVEYtOCBzdHJpbmcuIGUuZy4gIkxlbm5hcnQgUG9ldHRlcmluZyIgKi8KKyNkZWZpbmUgUEFfUFJPUF9NT0RVTEVfQVVUSE9SICAgICAgICAgICAgICAgICAgIm1vZHVsZS5hdXRob3IiCisKKy8qKiBGb3IgbW9kdWxlczogYSBodW1hbiByZWFkYWJsZSBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB0aGUgbW9kdWxlJ3MgcHVycG9zZSBmb3JtYXR0ZWQgYXMgVVRGLTguIGUuZy4gIkZyb2JuaWNhdGUgc291bmRzIHdpdGggYSBmbHV4IGNvbXBlbnNhdG9yIiAqLworI2RlZmluZSBQQV9QUk9QX01PRFVMRV9ERVNDUklQVElPTiAgICAgICAgICAgICAibW9kdWxlLmRlc2NyaXB0aW9uIgorCisvKiogRm9yIG1vZHVsZXM6IGEgaHVtYW4gcmVhZGFibGUgdXNhZ2UgZGVzY3JpcHRpb24gb2YgdGhlIG1vZHVsZSdzIGFyZ3VtZW50cyBmb3JtYXR0ZWQgYXMgVVRGLTguICovCisjZGVmaW5lIFBBX1BST1BfTU9EVUxFX1VTQUdFICAgICAgICAgICAgICAgICAgICJtb2R1bGUudXNhZ2UiCisKKy8qKiBGb3IgbW9kdWxlczogYSB2ZXJzaW9uIHN0cmluZyBmb3IgdGhlIG1vZHVsZS4gZS5nLiAiMC45LjE1IiAqLworI2RlZmluZSBQQV9QUk9QX01PRFVMRV9WRVJTSU9OICAgICAgICAgICAgICAgICAibW9kdWxlLnZlcnNpb24iCisKKy8qKiBGb3IgUENNIGZvcm1hdHM6IHRoZSBzYW1wbGUgZm9ybWF0IHVzZWQgYXMgcmV0dXJuZWQgYnkgcGFfc2FtcGxlX2Zvcm1hdF90b19zdHJpbmcoKSBcc2luY2UgMS4wICovCisjZGVmaW5lIFBBX1BST1BfRk9STUFUX1NBTVBMRV9GT1JNQVQgICAgICAgICAgICJmb3JtYXQuc2FtcGxlX2Zvcm1hdCIKKworLyoqIEZvciBhbGwgZm9ybWF0czogdGhlIHNhbXBsZSByYXRlICh1bnNpZ25lZCBpbnRlZ2VyKSBcc2luY2UgMS4wICovCisjZGVmaW5lIFBBX1BST1BfRk9STUFUX1JBVEUgICAgICAgICAgICAgICAgICAgICJmb3JtYXQucmF0ZSIKKworLyoqIEZvciBhbGwgZm9ybWF0czogdGhlIG51bWJlciBvZiBjaGFubmVscyAodW5zaWduZWQgaW50ZWdlcikgXHNpbmNlIDEuMCAqLworI2RlZmluZSBQQV9QUk9QX0ZPUk1BVF9DSEFOTkVMUyAgICAgICAgICAgICAgICAiZm9ybWF0LmNoYW5uZWxzIgorCisvKiogRm9yIFBDTSBmb3JtYXRzOiB0aGUgY2hhbm5lbCBtYXAgb2YgdGhlIHN0cmVhbSBhcyByZXR1cm5lZCBieSBwYV9jaGFubmVsX21hcF9zbnByaW50KCkgXHNpbmNlIDEuMCAqLworI2RlZmluZSBQQV9QUk9QX0ZPUk1BVF9DSEFOTkVMX01BUCAgICAgICAgICAgICAiZm9ybWF0LmNoYW5uZWxfbWFwIgorCisvKiogQSBwcm9wZXJ0eSBsaXN0IG9iamVjdC4gQmFzaWNhbGx5IGEgZGljdGlvbmFyeSB3aXRoIEFTQ0lJIHN0cmluZ3MKKyAqIGFzIGtleXMgYW5kIGFyYml0cmFyeSBkYXRhIGFzIHZhbHVlcy4gXHNpbmNlIDAuOS4xMSAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfcHJvcGxpc3QgcGFfcHJvcGxpc3Q7CisKKy8qKiBBbGxvY2F0ZSBhIHByb3BlcnR5IGxpc3QuIFxzaW5jZSAwLjkuMTEgKi8KK3BhX3Byb3BsaXN0KiBwYV9wcm9wbGlzdF9uZXcodm9pZCk7CisKKy8qKiBGcmVlIHRoZSBwcm9wZXJ0eSBsaXN0LiBcc2luY2UgMC45LjExICovCit2b2lkIHBhX3Byb3BsaXN0X2ZyZWUocGFfcHJvcGxpc3QqIHApOworCisvKiogQXBwZW5kIGEgbmV3IHN0cmluZyBlbnRyeSB0byB0aGUgcHJvcGVydHkgbGlzdCwgcG9zc2libHkKKyAqIG92ZXJ3cml0aW5nIGFuIGFscmVhZHkgZXhpc3RpbmcgZW50cnkgd2l0aCB0aGUgc2FtZSBrZXkuIEFuCisgKiBpbnRlcm5hbCBjb3B5IG9mIHRoZSBkYXRhIHBhc3NlZCBpcyBtYWRlLiBXaWxsIGFjY2VwdCBvbmx5IHZhbGlkCisgKiBVVEYtOC4gXHNpbmNlIDAuOS4xMSAqLworaW50IHBhX3Byb3BsaXN0X3NldHMocGFfcHJvcGxpc3QgKnAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpOworCisvKiogQXBwZW5kIGEgbmV3IHN0cmluZyBlbnRyeSB0byB0aGUgcHJvcGVydHkgbGlzdCwgcG9zc2libHkKKyAqIG92ZXJ3cml0aW5nIGFuIGFscmVhZHkgZXhpc3RpbmcgZW50cnkgd2l0aCB0aGUgc2FtZSBrZXkuIEFuCisgKiBpbnRlcm5hbCBjb3B5IG9mIHRoZSBkYXRhIHBhc3NlZCBpcyBtYWRlLiBXaWxsIGFjY2VwdCBvbmx5IHZhbGlkCisgKiBVVEYtOC4gVGhlIHN0cmluZyBwYXNzZWQgaW4gbXVzdCBjb250YWluIGEgJz0nLiBMZWZ0IGhhbmQgc2lkZSBvZgorICogdGhlICc9JyBpcyB1c2VkIGFzIGtleSBuYW1lLCB0aGUgcmlnaHQgaGFuZCBzaWRlIGFzIHN0cmluZworICogZGF0YS4gXHNpbmNlIDAuOS4xNiAqLworaW50IHBhX3Byb3BsaXN0X3NldHAocGFfcHJvcGxpc3QgKnAsIGNvbnN0IGNoYXIgKnBhaXIpOworCisvKiogQXBwZW5kIGEgbmV3IHN0cmluZyBlbnRyeSB0byB0aGUgcHJvcGVydHkgbGlzdCwgcG9zc2libHkKKyAqIG92ZXJ3cml0aW5nIGFuIGFscmVhZHkgZXhpc3RpbmcgZW50cnkgd2l0aCB0aGUgc2FtZSBrZXkuIEFuCisgKiBpbnRlcm5hbCBjb3B5IG9mIHRoZSBkYXRhIHBhc3NlZCBpcyBtYWRlLiBXaWxsIGFjY2VwdCBvbmx5IHZhbGlkCisgKiBVVEYtOC4gVGhlIGRhdGEgY2FuIGJlIHBhc3NlZCBhcyBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nIHdpdGgKKyAqIGFyZ3VtZW50cy4gXHNpbmNlIDAuOS4xMSAqLworaW50IHBhX3Byb3BsaXN0X3NldGYocGFfcHJvcGxpc3QgKnAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIFBBX0dDQ19QUklOVEZfQVRUUigzLDQpOworCisvKiogQXBwZW5kIGEgbmV3IGFyYml0cmFyeSBkYXRhIGVudHJ5IHRvIHRoZSBwcm9wZXJ0eSBsaXN0LCBwb3NzaWJseQorICogb3ZlcndyaXRpbmcgYW4gYWxyZWFkeSBleGlzdGluZyBlbnRyeSB3aXRoIHRoZSBzYW1lIGtleS4gQW4KKyAqIGludGVybmFsIGNvcHkgb2YgdGhlIGRhdGEgcGFzc2VkIGlzIG1hZGUuIFxzaW5jZSAwLjkuMTEgKi8KK2ludCBwYV9wcm9wbGlzdF9zZXQocGFfcHJvcGxpc3QgKnAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IG5ieXRlcyk7CisKKy8qKiBSZXR1cm4gYSBzdHJpbmcgZW50cnkgZm9yIHRoZSBzcGVjaWZpZWQga2V5LiBXaWxsIHJldHVybiBOVUxMIGlmCisgKiB0aGUgZGF0YSBpcyBub3QgdmFsaWQgVVRGLTguIFdpbGwgcmV0dXJuIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGluCisgKiBhbiBpbnRlcm5hbGx5IGFsbG9jYXRlZCBidWZmZXIuIFRoZSBjYWxsZXIgc2hvdWxkIG1ha2UgYSBjb3B5IG9mCisgKiB0aGUgZGF0YSBiZWZvcmUgYWNjZXNzaW5nIHRoZSBwcm9wZXJ0eSBsaXN0IGFnYWluLiBcc2luY2UgMC45LjExICovCitjb25zdCBjaGFyICpwYV9wcm9wbGlzdF9nZXRzKHBhX3Byb3BsaXN0ICpwLCBjb25zdCBjaGFyICprZXkpOworCisvKiogUmV0dXJuIHRoZSB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQga2V5LiBXaWxsIHJldHVybiBhCisgKiBOVUwtdGVybWluYXRlZCBzdHJpbmcgZm9yIHN0cmluZyBlbnRyaWVzLiBUaGUgcG9pbnRlciByZXR1cm5lZCB3aWxsCisgKiBwb2ludCB0byBhbiBpbnRlcm5hbGx5IGFsbG9jYXRlZCBidWZmZXIuIFRoZSBjYWxsZXIgc2hvdWxkIG1ha2UgYQorICogY29weSBvZiB0aGUgZGF0YSBiZWZvcmUgdGhlIHByb3BlcnR5IGxpc3QgaXMgYWNjZXNzZWQgYWdhaW4uIFxzaW5jZQorICogMC45LjExICovCitpbnQgcGFfcHJvcGxpc3RfZ2V0KHBhX3Byb3BsaXN0ICpwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IHZvaWQgKipkYXRhLCBzaXplX3QgKm5ieXRlcyk7CisKKy8qKiBVcGRhdGUgbW9kZSBlbnVtIGZvciBwYV9wcm9wbGlzdF91cGRhdGUoKS4gXHNpbmNlIDAuOS4xMSAqLwordHlwZWRlZiBlbnVtIHBhX3VwZGF0ZV9tb2RlIHsKKyAgICBQQV9VUERBVEVfU0VUCisgICAgLyoqPCBSZXBsYWNlIHRoZSBlbnRpcmUgcHJvcGVydHkgbGlzdCB3aXRoIHRoZSBuZXcgb25lLiBEb24ndCBrZWVwCisgICAgICogIGFueSBvZiB0aGUgb2xkIGRhdGEgYXJvdW5kICovLAorCisgICAgUEFfVVBEQVRFX01FUkdFCisgICAgLyoqPCBNZXJnZSBuZXcgcHJvcGVydHkgbGlzdCBpbnRvIHRoZSBleGlzdGluZyBvbmUsIG5vdCByZXBsYWNpbmcKKyAgICAgKiAgYW55IG9sZCBlbnRyaWVzIGlmIHRoZXkgc2hhcmUgYSBjb21tb24ga2V5IHdpdGggdGhlIG5ldworICAgICAqICBwcm9wZXJ0eSBsaXN0LiAqLywKKworICAgIFBBX1VQREFURV9SRVBMQUNFCisgICAgLyoqPCBNZXJnZSBuZXcgcHJvcGVydHkgbGlzdCBpbnRvIHRoZSBleGlzdGluZyBvbmUsIHJlcGxhY2luZyBhbGwKKyAgICAgKiAgb2xkIGVudHJpZXMgdGhhdCBzaGFyZSBhIGNvbW1vbiBrZXkgd2l0aCB0aGUgbmV3IHByb3BlcnR5CisgICAgICogIGxpc3QuICovCit9IHBhX3VwZGF0ZV9tb2RlX3Q7CisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworI2RlZmluZSBQQV9VUERBVEVfU0VUIFBBX1VQREFURV9TRVQKKyNkZWZpbmUgUEFfVVBEQVRFX01FUkdFIFBBX1VQREFURV9NRVJHRQorI2RlZmluZSBQQV9VUERBVEVfUkVQTEFDRSBQQV9VUERBVEVfUkVQTEFDRQorLyoqIFxlbmRjb25kICovCisKKy8qKiBNZXJnZSBwcm9wZXJ0eSBsaXN0ICJvdGhlciIgaW50byAicCIsIGFkaGVyaW5nIHRoZSBtZXJnZSBtb2RlIGFzCisgKiBzcGVjaWZpZWQgaW4gIm1vZGUiLiBcc2luY2UgMC45LjExICovCit2b2lkIHBhX3Byb3BsaXN0X3VwZGF0ZShwYV9wcm9wbGlzdCAqcCwgcGFfdXBkYXRlX21vZGVfdCBtb2RlLCBwYV9wcm9wbGlzdCAqb3RoZXIpOworCisvKiogUmVtb3ZlcyBhIHNpbmdsZSBlbnRyeSBmcm9tIHRoZSBwcm9wZXJ0eSBsaXN0LCBpZGVudGlmaWVkIGJlIHRoZQorICogc3BlY2lmaWVkIGtleSBuYW1lLiBcc2luY2UgMC45LjExICovCitpbnQgcGFfcHJvcGxpc3RfdW5zZXQocGFfcHJvcGxpc3QgKnAsIGNvbnN0IGNoYXIgKmtleSk7CisKKy8qKiBTaW1pbGFyIHRvIHBhX3Byb3BsaXN0X3Vuc2V0KCkgYnV0IHRha2VzIGFuIGFycmF5IG9mIGtleXMgdG8KKyAqIHJlbW92ZS4gVGhlIGFycmF5IHNob3VsZCBiZSB0ZXJtaW5hdGVkIGJ5IGEgTlVMTCBwb2ludGVyLiBSZXR1cm4gLTEKKyAqIG9uIGZhaWx1cmUsIG90aGVyd2lzZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgYWN0dWFsbHkgcmVtb3ZlZCAod2hpY2gKKyAqIG1pZ2h0IGV2ZW4gYmUgMCwgaWYgdGhlcmUgd2hlcmUgbm8gbWF0Y2hpbmcgZW50cmllcyB0bworICogcmVtb3ZlKS4gXHNpbmNlIDAuOS4xMSAqLworaW50IHBhX3Byb3BsaXN0X3Vuc2V0X21hbnkocGFfcHJvcGxpc3QgKnAsIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlzW10pOworCisvKiogSXRlcmF0ZSB0aHJvdWdoIHRoZSBwcm9wZXJ0eSBsaXN0LiBUaGUgdXNlciBzaG91bGQgYWxsb2NhdGUgYQorICogc3RhdGUgdmFyaWFibGUgb2YgdHlwZSB2b2lkKiBhbmQgaW5pdGlhbGl6ZSBpdCB3aXRoIE5VTEwuIEEgcG9pbnRlcgorICogdG8gdGhpcyB2YXJpYWJsZSBzaG91bGQgdGhlbiBiZSBwYXNzZWQgdG8gcGFfcHJvcGxpc3RfaXRlcmF0ZSgpCisgKiB3aGljaCBzaG91bGQgYmUgY2FsbGVkIGluIGEgbG9vcCB1bnRpbCBpdCByZXR1cm5zIE5VTEwgd2hpY2gKKyAqIHNpZ25pZmllcyBFT0wuIFRoZSBwcm9wZXJ0eSBsaXN0IHNob3VsZCBub3QgYmUgbW9kaWZpZWQgZHVyaW5nCisgKiBpdGVyYXRpb24gdGhyb3VnaCB0aGUgbGlzdCAtLSBleGNlcHQgZm9yIGRlbGV0aW5nIHRoZSBjdXJyZW50CisgKiBsb29rZWQgYXQgZW50cnkuIE9uIGVhY2ggaW52b2NhdGlvbiB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZQorICoga2V5IHN0cmluZyBmb3IgdGhlIG5leHQgZW50cnkuIFRoZSBrZXlzIGluIHRoZSBwcm9wZXJ0eSBsaXN0IGRvIG5vdAorICogaGF2ZSBhbnkgcGFydGljdWxhciBvcmRlci4gXHNpbmNlIDAuOS4xMSAqLworY29uc3QgY2hhciAqcGFfcHJvcGxpc3RfaXRlcmF0ZShwYV9wcm9wbGlzdCAqcCwgdm9pZCAqKnN0YXRlKTsKKworLyoqIEZvcm1hdCB0aGUgcHJvcGVydHkgbGlzdCBuaWNlbHkgYXMgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcuIFRoaXMKKyAqIHdvcmtzIHZlcnkgbXVjaCBsaWtlIHBhX3Byb3BsaXN0X3RvX3N0cmluZ19zZXAoKSBhbmQgdXNlcyBhIG5ld2xpbmUKKyAqIGFzIHNlcGFyYXRvciBhbmQgYXBwZW5kcyBvbmUgZmluYWwgb25lLiBDYWxsIHBhX3hmcmVlKCkgb24gdGhlCisgKiByZXN1bHQuIFxzaW5jZSAwLjkuMTEgKi8KK2NoYXIgKnBhX3Byb3BsaXN0X3RvX3N0cmluZyhwYV9wcm9wbGlzdCAqcCk7CisKKy8qKiBGb3JtYXQgdGhlIHByb3BlcnR5IGxpc3QgbmljZWx5IGFzIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIGFuZAorICogY2hvb3NlIHRoZSBzZXBhcmF0b3IuIENhbGwgcGFfeGZyZWUoKSBvbiB0aGUgcmVzdWx0LiBcc2luY2UKKyAqIDAuOS4xNSAqLworY2hhciAqcGFfcHJvcGxpc3RfdG9fc3RyaW5nX3NlcChwYV9wcm9wbGlzdCAqcCwgY29uc3QgY2hhciAqc2VwKTsKKworLyoqIEFsbG9jYXRlIGEgbmV3IHByb3BlcnR5IGxpc3QgYW5kIGFzc2lnbiBrZXkvdmFsdWUgZnJvbSBhIGh1bWFuCisgKiByZWFkYWJsZSBzdHJpbmcuIFxzaW5jZSAwLjkuMTUgKi8KK3BhX3Byb3BsaXN0ICpwYV9wcm9wbGlzdF9mcm9tX3N0cmluZyhjb25zdCBjaGFyICpzdHIpOworCisvKiogUmV0dXJucyAxIGlmIGFuIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGtleSBleGlzdHMgaW4gdGhlCisgKiBwcm9wZXJ0eSBsaXN0LiBcc2luY2UgMC45LjExICovCitpbnQgcGFfcHJvcGxpc3RfY29udGFpbnMocGFfcHJvcGxpc3QgKnAsIGNvbnN0IGNoYXIgKmtleSk7CisKKy8qKiBSZW1vdmUgYWxsIGVudHJpZXMgZnJvbSB0aGUgcHJvcGVydHkgbGlzdCBvYmplY3QuIFxzaW5jZSAwLjkuMTEgKi8KK3ZvaWQgcGFfcHJvcGxpc3RfY2xlYXIocGFfcHJvcGxpc3QgKnApOworCisvKiogQWxsb2NhdGUgYSBuZXcgcHJvcGVydHkgbGlzdCBhbmQgY29weSBvdmVyIGV2ZXJ5IHNpbmdsZSBlbnRyeSBmcm9tCisgKiB0aGUgc3BlY2lmaWMgbGlzdC4gXHNpbmNlIDAuOS4xMSAqLworcGFfcHJvcGxpc3QqIHBhX3Byb3BsaXN0X2NvcHkocGFfcHJvcGxpc3QgKnQpOworCisvKiogUmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBvbiB0aGUgcHJvcGVydHkgbGlzdC4gXHNpbmNlIDAuOS4xNSAqLwordW5zaWduZWQgcGFfcHJvcGxpc3Rfc2l6ZShwYV9wcm9wbGlzdCAqdCk7CisKKy8qKiBSZXR1cm5zIDAgd2hlbiB0aGUgcHJvcGxpc3QgaXMgZW1wdHksIHBvc2l0aXZlIG90aGVyd2lzZSBcc2luY2UgMC45LjE1ICovCitpbnQgcGFfcHJvcGxpc3RfaXNlbXB0eShwYV9wcm9wbGlzdCAqdCk7CisKKy8qKiBSZXR1cm4gbm9uLXplcm8gd2hlbiBhIGFuZCBiIGhhdmUgdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzLgorICogXHNpbmNlIDAuOS4xNiAqLworaW50IHBhX3Byb3BsaXN0X2VxdWFsKHBhX3Byb3BsaXN0ICphLCBwYV9wcm9wbGlzdCAqYik7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3B1bHNlYXVkaW8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvcHVsc2VhdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNzE3NzIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3B1bHNlYXVkaW8uaApAQCAtMCwwICsxLDExOCBAQAorI2lmbmRlZiBmb29wdWxzZWF1ZGlvaGZvbworI2RlZmluZSBmb29wdWxzZWF1ZGlvaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgTGljZW5zZSBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9tYWlubG9vcC1hcGkuaD4KKyNpbmNsdWRlIDxwdWxzZS9zYW1wbGUuaD4KKyNpbmNsdWRlIDxwdWxzZS9mb3JtYXQuaD4KKyNpbmNsdWRlIDxwdWxzZS9kZWYuaD4KKyNpbmNsdWRlIDxwdWxzZS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8cHVsc2Uvc3RyZWFtLmg+CisjaW5jbHVkZSA8cHVsc2UvaW50cm9zcGVjdC5oPgorI2luY2x1ZGUgPHB1bHNlL3N1YnNjcmliZS5oPgorI2luY2x1ZGUgPHB1bHNlL3NjYWNoZS5oPgorI2luY2x1ZGUgPHB1bHNlL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwdWxzZS9lcnJvci5oPgorI2luY2x1ZGUgPHB1bHNlL29wZXJhdGlvbi5oPgorI2luY2x1ZGUgPHB1bHNlL2NoYW5uZWxtYXAuaD4KKyNpbmNsdWRlIDxwdWxzZS92b2x1bWUuaD4KKyNpbmNsdWRlIDxwdWxzZS94bWFsbG9jLmg+CisjaW5jbHVkZSA8cHVsc2UvdXRmOC5oPgorI2luY2x1ZGUgPHB1bHNlL3RocmVhZC1tYWlubG9vcC5oPgorI2luY2x1ZGUgPHB1bHNlL21haW5sb29wLmg+CisjaW5jbHVkZSA8cHVsc2UvbWFpbmxvb3Atc2lnbmFsLmg+CisjaW5jbHVkZSA8cHVsc2UvdXRpbC5oPgorI2luY2x1ZGUgPHB1bHNlL3RpbWV2YWwuaD4KKyNpbmNsdWRlIDxwdWxzZS9wcm9wbGlzdC5oPgorI2luY2x1ZGUgPHB1bHNlL3J0Y2xvY2suaD4KKworLyoqIFxmaWxlCisgKiBJbmNsdWRlIGFsbCBsaWJwdWxzZSBoZWFkZXIgZmlsZXMgYXQgb25jZS4gVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUKKyAqIGluY2x1ZGVkOiBccmVmIG1haW5sb29wLWFwaS5oLCBccmVmIHNhbXBsZS5oLCBccmVmIGRlZi5oLCBccmVmCisgKiBjb250ZXh0LmgsIFxyZWYgc3RyZWFtLmgsIFxyZWYgaW50cm9zcGVjdC5oLCBccmVmIHN1YnNjcmliZS5oLCBccmVmCisgKiBzY2FjaGUuaCwgXHJlZiB2ZXJzaW9uLmgsIFxyZWYgZXJyb3IuaCwgXHJlZiBjaGFubmVsbWFwLmgsIFxyZWYKKyAqIG9wZXJhdGlvbi5oLFxyZWYgdm9sdW1lLmgsIFxyZWYgeG1hbGxvYy5oLCBccmVmIHV0ZjguaCwgXHJlZgorICogdGhyZWFkLW1haW5sb29wLmgsIFxyZWYgbWFpbmxvb3AuaCwgXHJlZiB1dGlsLmgsIFxyZWYgcHJvcGxpc3QuaCwKKyAqIFxyZWYgdGltZXZhbC5oLCBccmVmIHJ0Y2xvY2suaCBhbmQgXHJlZiBtYWlubG9vcC1zaWduYWwuaCBhdAorICogb25jZSAqLworCisvKiogXG1haW5wYWdlCisgKgorICogXHNlY3Rpb24gaW50cm9fc2VjIEludHJvZHVjdGlvbgorICoKKyAqIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBjbGllbnQgQVBJIGZvciB0aGUgUHVsc2VBdWRpbyBzb3VuZAorICogc2VydmVyLiBUaGUgQVBJIGNvbWVzIGluIHR3byBmbGF2b3VycyB0byBhY2NvbW1vZGF0ZSBkaWZmZXJlbnQgc3R5bGVzCisgKiBvZiBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBuZWVkcyBpbiBjb21wbGV4aXR5OgorICoKKyAqIFxsaSBUaGUgY29tcGxldGUgYnV0IHNvbWV3aGF0IGNvbXBsaWNhdGVkIHRvIHVzZSBhc3luY2hyb25vdXMgQVBJCisgKiBcbGkgVGhlIHNpbXBsaWZpZWQsIGVhc3kgdG8gdXNlLCBidXQgbGltaXRlZCBzeW5jaHJvbm91cyBBUEkKKyAqCisgKiBBbGwgc3RyaW5ncyBpbiBQdWxzZUF1ZGlvIGFyZSBpbiB0aGUgVVRGLTggZW5jb2RpbmcsIHJlZ2FyZGxlc3Mgb2YgY3VycmVudAorICogbG9jYWxlLiBTb21lIGZ1bmN0aW9ucyB3aWxsIGZpbHRlciBpbnZhbGlkIHNlcXVlbmNlcyBmcm9tIHRoZSBzdHJpbmcsIHNvbWUKKyAqIHdpbGwgc2ltcGx5IGZhaWwuIFRvIGVuc3VyZSByZWxpYWJsZSBiZWhhdmlvdXIsIG1ha2Ugc3VyZSBldmVyeXRoaW5nIHlvdQorICogcGFzcyB0byB0aGUgQVBJIGlzIGFscmVhZHkgaW4gVVRGLTguCisKKyAqIFxzZWN0aW9uIHNpbXBsZV9zZWMgU2ltcGxlIEFQSQorICoKKyAqIFVzZSB0aGlzIGlmIHlvdSBkZXZlbG9wIHlvdXIgcHJvZ3JhbSBpbiBzeW5jaHJvbm91cyBzdHlsZSBhbmQganVzdAorICogbmVlZCBhIHdheSB0byBwbGF5IG9yIHJlY29yZCBkYXRhIG9uIHRoZSBzb3VuZCBzZXJ2ZXIuIFNlZQorICogXHN1YnBhZ2Ugc2ltcGxlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogXHNlY3Rpb24gYXN5bmNfc2VjIEFzeW5jaHJvbm91cyBBUEkKKyAqCisgKiBVc2UgdGhpcyBpZiB5b3UgZGV2ZWxvcCB5b3VyIHByb2dyYW1zIGluIGFzeW5jaHJvbm91cywgZXZlbnQgbG9vcAorICogYmFzZWQgc3R5bGUgb3IgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBhZHZhbmNlZCBmZWF0dXJlcyBvZiB0aGUKKyAqIFB1bHNlQXVkaW8gQVBJLiBBIGd1aWRlIGNhbiBiZSBmb3VuZCBpbiBcc3VicGFnZSBhc3luYy4KKyAqCisgKiBCeSB1c2luZyB0aGUgYnVpbHQtaW4gdGhyZWFkZWQgbWFpbiBsb29wLCBpdCBpcyBwb3NzaWJsZSB0byBhY2hpZXZlIGEKKyAqIHBzZXVkby1zeW5jaHJvbm91cyBBUEksIHdoaWNoIGNhbiBiZSB1c2VmdWwgaW4gc3luY2hyb25vdXMgYXBwbGljYXRpb25zCisgKiB3aGVyZSB0aGUgc2ltcGxlIEFQSSBpcyBpbnN1ZmZpY2llbnQuIFNlZSB0aGUgXHJlZiBhc3luYyBwYWdlIGZvcgorICogZGV0YWlscy4KKyAqCisgKiBcc2VjdGlvbiB0aHJlYWRfc2VjIFRocmVhZHMKKyAqCisgKiBUaGUgUHVsc2VBdWRpbyBjbGllbnQgbGlicmFyaWVzIGFyZSBub3QgZGVzaWduZWQgdG8gYmUgZGlyZWN0bHkKKyAqIHRocmVhZC1zYWZlLiBUaGV5IGFyZSBob3dldmVyIGRlc2lnbmVkIHRvIGJlIHJlZW50cmFudCBhbmQKKyAqIHRocmVhZHMtYXdhcmUuCisgKgorICogVG8gdXNlIHRoZSBsaWJyYXJpZXMgaW4gYSB0aHJlYWRlZCBlbnZpcm9ubWVudCwgeW91IG11c3QgYXNzdXJlIHRoYXQKKyAqIGFsbCBvYmplY3RzIGFyZSBvbmx5IHVzZWQgaW4gb25lIHRocmVhZCBhdCBhIHRpbWUuIE5vcm1hbGx5LCB0aGlzIG1lYW5zCisgKiB0aGF0IGFsbCBvYmplY3RzIGJlbG9uZ2luZyB0byBhIHNpbmdsZSBjb250ZXh0IG11c3QgYmUgYWNjZXNzZWQgZnJvbSB0aGUKKyAqIHNhbWUgdGhyZWFkLgorICoKKyAqIFRoZSBpbmNsdWRlZCBtYWluIGxvb3AgaW1wbGVtZW50YXRpb24gaXMgYWxzbyBub3QgdGhyZWFkIHNhZmUuIFRha2UgY2FyZQorICogdG8gbWFrZSBzdXJlIGV2ZW50IG9iamVjdHMgYXJlIG5vdCBtYW5pcHVsYXRlZCB3aGVuIGFueSBvdGhlciBjb2RlIGlzCisgKiB1c2luZyB0aGUgbWFpbiBsb29wLgorICoKKyAqIFxzZWN0aW9uIHBrZ2NvbmZpZyBwa2ctY29uZmlnCisgKgorICogVGhlIFB1bHNlQXVkaW8gbGlicmFyaWVzIHByb3ZpZGUgcGtnLWNvbmZpZyBzbmlwcGV0cyBmb3IgdGhlIGRpZmZlcmVudAorICogbW9kdWxlczoKKyAqCisgKiBcbGkgbGlicHVsc2UgLSBUaGUgYXN5bmNocm9ub3VzIEFQSSBhbmQgdGhlIGludGVybmFsIG1haW4gbG9vcCBpbXBsZW1lbnRhdGlvbi4KKyAqIFxsaSBsaWJwdWxzZS1tYWlubG9vcC1nbGliIC0gR0xJQiAyLnggbWFpbiBsb29wIGJpbmRpbmdzLgorICogXGxpIGxpYnB1bHNlLXNpbXBsZSAtIFRoZSBzaW1wbGUgUHVsc2VBdWRpbyBBUEkuCisgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3J0Y2xvY2suaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvcnRjbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYTIwZTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3J0Y2xvY2suaApAQCAtMCwwICsxLDQwIEBACisjaWZuZGVmIGZvb3J0Y2xvY2tmb28KKyNkZWZpbmUgZm9vcnRjbG9ja2ZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwOSBMZW5uYXJ0IFBvZXR0ZXJpbmcKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgIExpY2Vuc2UgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS9zYW1wbGUuaD4KKworLyoqIFxmaWxlCisgKiAgTW9ub3RvbmljIGNsb2NrIHV0aWxpdGllcy4gKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBSZXR1cm4gdGhlIGN1cnJlbnQgbW9ub3RvbmljIHN5c3RlbSB0aW1lIGluIHVzZWMsIGlmIHN1Y2ggYSBjbG9jaworICogaXMgYXZhaWxhYmxlLiAgSWYgaXQgaXMgbm90IGF2YWlsYWJsZSB0aGlzIHdpbGwgcmV0dXJuIHRoZQorICogd2FsbGNsb2NrIHRpbWUgaW5zdGVhZC4gIFxzaW5jZSAwLjkuMTYgKi8KK3BhX3VzZWNfdCBwYV9ydGNsb2NrX25vdyh2b2lkKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc2FtcGxlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3NhbXBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTU1OWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3NhbXBsZS5oCkBAIC0wLDAgKzEsMzM5IEBACisjaWZuZGVmIGZvb3NhbXBsZWhmb28KKyNkZWZpbmUgZm9vc2FtcGxlaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9nY2NtYWNyby5oPgorI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXHBhZ2Ugc2FtcGxlIFNhbXBsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbnMKKyAqCisgKiBcc2VjdGlvbiBvdmVydl9zZWMgT3ZlcnZpZXcKKyAqCisgKiBQdWxzZUF1ZGlvIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgYSBtdWx0aXR1ZGUgb2Ygc2FtcGxlIGZvcm1hdHMsIHJhdGVzCisgKiBhbmQgY2hhbm5lbHMsIHRyYW5zcGFyZW50bHkgY29udmVydGluZyBhbmQgbWl4aW5nIHRoZW0gYXMgbmVlZGVkLgorICoKKyAqIFxzZWN0aW9uIGZvcm1hdF9zZWMgU2FtcGxlIEZvcm1hdAorICoKKyAqIFB1bHNlQXVkaW8gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzYW1wbGUgZm9ybWF0czoKKyAqCisgKiBcbGkgUEFfU0FNUExFX1U4IC0gVW5zaWduZWQgOCBiaXQgaW50ZWdlciBQQ00uCisgKiBcbGkgUEFfU0FNUExFX1MxNkxFIC0gU2lnbmVkIDE2IGludGVnZXIgYml0IFBDTSwgbGl0dGxlIGVuZGlhbi4KKyAqIFxsaSBQQV9TQU1QTEVfUzE2QkUgLSBTaWduZWQgMTYgaW50ZWdlciBiaXQgUENNLCBiaWcgZW5kaWFuLgorICogXGxpIFBBX1NBTVBMRV9GTE9BVDMyTEUgLSAzMiBiaXQgSUVFRSBmbG9hdGluZyBwb2ludCBQQ00sIGxpdHRsZSBlbmRpYW4uCisgKiBcbGkgUEFfU0FNUExFX0ZMT0FUMzJCRSAtIDMyIGJpdCBJRUVFIGZsb2F0aW5nIHBvaW50IFBDTSwgYmlnIGVuZGlhbi4KKyAqIFxsaSBQQV9TQU1QTEVfQUxBVyAtIDggYml0IGEtTGF3LgorICogXGxpIFBBX1NBTVBMRV9VTEFXIC0gOCBiaXQgbXUtTGF3LgorICogXGxpIFBBX1NBTVBMRV9TMzJMRSAtIFNpZ25lZCAzMiBiaXQgaW50ZWdlciBQQ00sIGxpdHRsZSBlbmRpYW4uCisgKiBcbGkgUEFfU0FNUExFX1MzMkJFIC0gU2lnbmVkIDMyIGJpdCBpbnRlZ2VyIFBDTSwgYmlnIGVuZGlhbi4KKyAqIFxsaSBQQV9TQU1QTEVfUzI0TEUgLSBTaWduZWQgMjQgYml0IGludGVnZXIgUENNIHBhY2tlZCwgbGl0dGxlIGVuZGlhbi4KKyAqIFxsaSBQQV9TQU1QTEVfUzI0QkUgLSBTaWduZWQgMjQgYml0IGludGVnZXIgUENNIHBhY2tlZCwgYmlnIGVuZGlhbi4KKyAqIFxsaSBQQV9TQU1QTEVfUzI0XzMyTEUgLSBTaWduZWQgMjQgYml0IGludGVnZXIgUENNIGluIExTQiBvZiAzMiBiaXQgd29yZHMsIGxpdHRsZSBlbmRpYW4uCisgKiBcbGkgUEFfU0FNUExFX1MyNF8zMkJFIC0gU2lnbmVkIDI0IGJpdCBpbnRlZ2VyIFBDTSBpbiBMU0Igb2YgMzIgYml0IHdvcmRzLCBiaWcgZW5kaWFuLgorICoKKyAqIFRoZSBmbG9hdGluZyBwb2ludCBzYW1wbGUgZm9ybWF0cyBoYXZlIHRoZSByYW5nZSBmcm9tIC0xLjAgdG8gMS4wLgorICoKKyAqIFRoZSBzYW1wbGUgZm9ybWF0cyB0aGF0IGFyZSBzZW5zaXRpdmUgdG8gZW5kaWFubmVzcyBoYXZlIGNvbnZlbmllbmNlCisgKiBtYWNyb3MgZm9yIG5hdGl2ZSBlbmRpYW4gKE5FKSwgYW5kIHJldmVyc2UgZW5kaWFuIChSRSkuCisgKgorICogXHNlY3Rpb24gcmF0ZV9zZWMgU2FtcGxlIFJhdGVzCisgKgorICogUHVsc2VBdWRpbyBzdXBwb3J0cyBhbnkgc2FtcGxlIHJhdGUgYmV0d2VlbiAxIEh6IGFuZCAxOTIwMDAgSHouIFRoZXJlIGlzIG5vCisgKiBwb2ludCB0cnlpbmcgdG8gZXhjZWVkIHRoZSBzYW1wbGUgcmF0ZSBvZiB0aGUgb3V0cHV0IGRldmljZSB0aG91Z2ggYXMgdGhlCisgKiBzaWduYWwgd2lsbCBvbmx5IGdldCBkb3duc2FtcGxlZCwgY29uc3VtaW5nIENQVSBvbiB0aGUgbWFjaGluZSBydW5uaW5nIHRoZQorICogc2VydmVyLgorICoKKyAqIFxzZWN0aW9uIGNoYW5fc2VjIENoYW5uZWxzCisgKgorICogUHVsc2VBdWRpbyBzdXBwb3J0cyB1cCB0byAzMiBpbmRpdmlkdWFsIGNoYW5uZWxzLiBUaGUgb3JkZXIgb2YgdGhlCisgKiBjaGFubmVscyBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24sIGJ1dCB0aGV5IG11c3QgYmUgY29udGludW91cy4gVG8gbWFwCisgKiBjaGFubmVscyB0byBzcGVha2Vycywgc2VlIFxyZWYgY2hhbm5lbG1hcC4KKyAqCisgKiBcc2VjdGlvbiBjYWxjX3NlYyBDYWxjdWxhdGlvbnMKKyAqCisgKiBUaGUgUHVsc2VBdWRpbyBsaWJyYXJ5IGNvbnRhaW5zIGEgbnVtYmVyIG9mIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBkbworICogY2FsY3VsYXRpb25zIG9uIHNhbXBsZSBmb3JtYXRzOgorICoKKyAqIFxsaSBwYV9ieXRlc19wZXJfc2Vjb25kKCkgLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9uZSBzZWNvbmQgb2YgYXVkaW8gd2lsbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2UgZ2l2ZW4gYSBzYW1wbGUgZm9ybWF0LgorICogXGxpIHBhX2ZyYW1lX3NpemUoKSAtIFRoZSBzaXplLCBpbiBieXRlcywgb2Ygb25lIGZyYW1lIChpLmUuIG9uZSBzZXQgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLCBvbmUgZm9yIGVhY2ggY2hhbm5lbCkuCisgKiBcbGkgcGFfc2FtcGxlX3NpemUoKSAtIFRoZSBzaXplLCBpbiBieXRlcywgb2Ygb25lIHNhbXBsZS4KKyAqIFxsaSBwYV9ieXRlc190b191c2VjKCkgLSBDYWxjdWxhdGUgdGhlIHRpbWUgaXQgd291bGQgdGFrZSB0byBwbGF5IGEgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYSBjZXJ0YWluIHNpemUuCisgKgorICogXHNlY3Rpb24gdXRpbF9zZWMgQ29udmVuaWVuY2UgRnVuY3Rpb25zCisgKgorICogVGhlIGxpYnJhcnkgYWxzbyBjb250YWlucyBhIGNvdXBsZSBvZiBvdGhlciBjb252ZW5pZW5jZSBmdW5jdGlvbnM6CisgKgorICogXGxpIHBhX3NhbXBsZV9zcGVjX3ZhbGlkKCkgLSBUZXN0cyBpZiBhIHNhbXBsZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZC4KKyAqIFxsaSBwYV9zYW1wbGVfc3BlY19lcXVhbCgpIC0gVGVzdHMgaWYgdGhlIHNhbXBsZSBmb3JtYXQgc3BlY2lmaWNhdGlvbnMgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWNhbC4KKyAqIFxsaSBwYV9zYW1wbGVfZm9ybWF0X3RvX3N0cmluZygpIC0gUmV0dXJuIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZSBmb3JtYXQuCisgKiBcbGkgcGFfcGFyc2Vfc2FtcGxlX2Zvcm1hdCgpIC0gUGFyc2UgYSB0ZXh0IHN0cmluZyBpbnRvIGEgc2FtcGxlIGZvcm1hdC4KKyAqIFxsaSBwYV9zYW1wbGVfc3BlY19zbnByaW50KCkgLSBDcmVhdGUgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGEgY29tcGxldGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uLgorICogXGxpIHBhX2J5dGVzX3NucHJpbnQoKSAtIFByZXR0eSBwcmludCBhIGJ5dGUgdmFsdWUgKGUuZy4gMi41IE1pQikuCisgKi8KKworLyoqIFxmaWxlCisgKiBDb25zdGFudHMgYW5kIHJvdXRpbmVzIGZvciBzYW1wbGUgdHlwZSBoYW5kbGluZworICoKKyAqIFNlZSBhbHNvIFxzdWJwYWdlIHNhbXBsZQorICovCisKK1BBX0NfREVDTF9CRUdJTgorCisjaWYgIWRlZmluZWQoV09SRFNfQklHRU5ESUFOKQorI2lmIGRlZmluZWQoX19CWVRFX09SREVSKQorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIGNoYW5uZWxzICovCisjZGVmaW5lIFBBX0NIQU5ORUxTX01BWCAzMlUKKworLyoqIE1heGltdW0gYWxsb3dlZCBzYW1wbGUgcmF0ZSAqLworI2RlZmluZSBQQV9SQVRFX01BWCAoNDgwMDBVKjRVKQorCisvKiogU2FtcGxlIGZvcm1hdCAqLwordHlwZWRlZiBlbnVtIHBhX3NhbXBsZV9mb3JtYXQgeworICAgIFBBX1NBTVBMRV9VOCwKKyAgICAvKio8IFVuc2lnbmVkIDggQml0IFBDTSAqLworCisgICAgUEFfU0FNUExFX0FMQVcsCisgICAgLyoqPCA4IEJpdCBhLUxhdyAqLworCisgICAgUEFfU0FNUExFX1VMQVcsCisgICAgLyoqPCA4IEJpdCBtdS1MYXcgKi8KKworICAgIFBBX1NBTVBMRV9TMTZMRSwKKyAgICAvKio8IFNpZ25lZCAxNiBCaXQgUENNLCBsaXR0bGUgZW5kaWFuIChQQykgKi8KKworICAgIFBBX1NBTVBMRV9TMTZCRSwKKyAgICAvKio8IFNpZ25lZCAxNiBCaXQgUENNLCBiaWcgZW5kaWFuICovCisKKyAgICBQQV9TQU1QTEVfRkxPQVQzMkxFLAorICAgIC8qKjwgMzIgQml0IElFRUUgZmxvYXRpbmcgcG9pbnQsIGxpdHRsZSBlbmRpYW4gKFBDKSwgcmFuZ2UgLTEuMCB0byAxLjAgKi8KKworICAgIFBBX1NBTVBMRV9GTE9BVDMyQkUsCisgICAgLyoqPCAzMiBCaXQgSUVFRSBmbG9hdGluZyBwb2ludCwgYmlnIGVuZGlhbiwgcmFuZ2UgLTEuMCB0byAxLjAgKi8KKworICAgIFBBX1NBTVBMRV9TMzJMRSwKKyAgICAvKio8IFNpZ25lZCAzMiBCaXQgUENNLCBsaXR0bGUgZW5kaWFuIChQQykgKi8KKworICAgIFBBX1NBTVBMRV9TMzJCRSwKKyAgICAvKio8IFNpZ25lZCAzMiBCaXQgUENNLCBiaWcgZW5kaWFuICovCisKKyAgICBQQV9TQU1QTEVfUzI0TEUsCisgICAgLyoqPCBTaWduZWQgMjQgQml0IFBDTSBwYWNrZWQsIGxpdHRsZSBlbmRpYW4gKFBDKS4gXHNpbmNlIDAuOS4xNSAqLworCisgICAgUEFfU0FNUExFX1MyNEJFLAorICAgIC8qKjwgU2lnbmVkIDI0IEJpdCBQQ00gcGFja2VkLCBiaWcgZW5kaWFuLiBcc2luY2UgMC45LjE1ICovCisKKyAgICBQQV9TQU1QTEVfUzI0XzMyTEUsCisgICAgLyoqPCBTaWduZWQgMjQgQml0IFBDTSBpbiBMU0Igb2YgMzIgQml0IHdvcmRzLCBsaXR0bGUgZW5kaWFuIChQQykuIFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NBTVBMRV9TMjRfMzJCRSwKKyAgICAvKio8IFNpZ25lZCAyNCBCaXQgUENNIGluIExTQiBvZiAzMiBCaXQgd29yZHMsIGJpZyBlbmRpYW4uIFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NBTVBMRV9NQVgsCisgICAgLyoqPCBVcHBlciBsaW1pdCBvZiB2YWxpZCBzYW1wbGUgdHlwZXMgKi8KKworICAgIFBBX1NBTVBMRV9JTlZBTElEID0gLTEKKyAgICAvKio8IEFuIGludmFsaWQgdmFsdWUgKi8KK30gcGFfc2FtcGxlX2Zvcm1hdF90OworCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisvKiogU2lnbmVkIDE2IEJpdCBQQ00sIG5hdGl2ZSBlbmRpYW4gKi8KKyNkZWZpbmUgUEFfU0FNUExFX1MxNk5FIFBBX1NBTVBMRV9TMTZCRQorLyoqIDMyIEJpdCBJRUVFIGZsb2F0aW5nIHBvaW50LCBuYXRpdmUgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9GTE9BVDMyTkUgUEFfU0FNUExFX0ZMT0FUMzJCRQorLyoqIFNpZ25lZCAzMiBCaXQgUENNLCBuYXRpdmUgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMzJORSBQQV9TQU1QTEVfUzMyQkUKKy8qKiBTaWduZWQgMjQgQml0IFBDTSBwYWNrZWQsIG5hdGl2ZSBlbmRpYW4uIFxzaW5jZSAwLjkuMTUgKi8KKyNkZWZpbmUgUEFfU0FNUExFX1MyNE5FIFBBX1NBTVBMRV9TMjRCRQorLyoqIFNpZ25lZCAyNCBCaXQgUENNIGluIExTQiBvZiAzMiBCaXQgd29yZHMsIG5hdGl2ZSBlbmRpYW4uIFxzaW5jZSAwLjkuMTUgKi8KKyNkZWZpbmUgUEFfU0FNUExFX1MyNF8zMk5FIFBBX1NBTVBMRV9TMjRfMzJCRQorCisvKiogU2lnbmVkIDE2IEJpdCBQQ00gcmV2ZXJzZSBlbmRpYW4gKi8KKyNkZWZpbmUgUEFfU0FNUExFX1MxNlJFIFBBX1NBTVBMRV9TMTZMRQorLyoqIDMyIEJpdCBJRUVFIGZsb2F0aW5nIHBvaW50LCByZXZlcnNlIGVuZGlhbiAqLworI2RlZmluZSBQQV9TQU1QTEVfRkxPQVQzMlJFIFBBX1NBTVBMRV9GTE9BVDMyTEUKKy8qKiBTaWduZWQgMzIgQml0IFBDTSwgcmV2ZXJzZSBlbmRpYW4gKi8KKyNkZWZpbmUgUEFfU0FNUExFX1MzMlJFIFBBX1NBTVBMRV9TMzJMRQorLyoqIFNpZ25lZCAyNCBCaXQgUENNLCBwYWNrZWQgcmV2ZXJzZSBlbmRpYW4uIFxzaW5jZSAwLjkuMTUgKi8KKyNkZWZpbmUgUEFfU0FNUExFX1MyNFJFIFBBX1NBTVBMRV9TMjRMRQorLyoqIFNpZ25lZCAyNCBCaXQgUENNLCBpbiBMU0Igb2YgMzIgQml0IHdvcmRzLCByZXZlcnNlIGVuZGlhbi4gXHNpbmNlIDAuOS4xNSAqLworI2RlZmluZSBQQV9TQU1QTEVfUzI0XzMyUkUgUEFfU0FNUExFX1MyNF8zMkxFCisjZWxzZQorLyoqIFNpZ25lZCAxNiBCaXQgUENNLCBuYXRpdmUgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMTZORSBQQV9TQU1QTEVfUzE2TEUKKy8qKiAzMiBCaXQgSUVFRSBmbG9hdGluZyBwb2ludCwgbmF0aXZlIGVuZGlhbiAqLworI2RlZmluZSBQQV9TQU1QTEVfRkxPQVQzMk5FIFBBX1NBTVBMRV9GTE9BVDMyTEUKKy8qKiBTaWduZWQgMzIgQml0IFBDTSwgbmF0aXZlIGVuZGlhbiAqLworI2RlZmluZSBQQV9TQU1QTEVfUzMyTkUgUEFfU0FNUExFX1MzMkxFCisvKiogU2lnbmVkIDI0IEJpdCBQQ00gcGFja2VkLCBuYXRpdmUgZW5kaWFuLiBcc2luY2UgMC45LjE1ICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMjRORSBQQV9TQU1QTEVfUzI0TEUKKy8qKiBTaWduZWQgMjQgQml0IFBDTSBpbiBMU0Igb2YgMzIgQml0IHdvcmRzLCBuYXRpdmUgZW5kaWFuLiBcc2luY2UgMC45LjE1ICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMjRfMzJORSBQQV9TQU1QTEVfUzI0XzMyTEUKKworLyoqIFNpZ25lZCAxNiBCaXQgUENNLCByZXZlcnNlIGVuZGlhbiAqLworI2RlZmluZSBQQV9TQU1QTEVfUzE2UkUgUEFfU0FNUExFX1MxNkJFCisvKiogMzIgQml0IElFRUUgZmxvYXRpbmcgcG9pbnQsIHJldmVyc2UgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9GTE9BVDMyUkUgUEFfU0FNUExFX0ZMT0FUMzJCRQorLyoqIFNpZ25lZCAzMiBCaXQgUENNLCByZXZlcnNlIGVuZGlhbiAqLworI2RlZmluZSBQQV9TQU1QTEVfUzMyUkUgUEFfU0FNUExFX1MzMkJFCisvKiogU2lnbmVkIDI0IEJpdCBQQ00sIHBhY2tlZCByZXZlcnNlIGVuZGlhbi4gXHNpbmNlIDAuOS4xNSAqLworI2RlZmluZSBQQV9TQU1QTEVfUzI0UkUgUEFfU0FNUExFX1MyNEJFCisvKiogU2lnbmVkIDI0IEJpdCBQQ00sIGluIExTQiBvZiAzMiBCaXQgd29yZHMsIHJldmVyc2UgZW5kaWFuLiBcc2luY2UgMC45LjE1ICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMjRfMzJSRSBQQV9TQU1QTEVfUzI0XzMyQkUKKyNlbmRpZgorCisvKiogQSBTaG9ydGN1dCBmb3IgUEFfU0FNUExFX0ZMT0FUMzJORSAqLworI2RlZmluZSBQQV9TQU1QTEVfRkxPQVQzMiBQQV9TQU1QTEVfRkxPQVQzMk5FCisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworLyogQWxsb3cgY2xpZW50cyB0byBjaGVjayB3aXRoICNpZmRlZiBmb3IgdGhlc2Ugc2FtcGxlIGZvcm1hdHMgKi8KKyNkZWZpbmUgUEFfU0FNUExFX1U4IFBBX1NBTVBMRV9VOAorI2RlZmluZSBQQV9TQU1QTEVfQUxBVyBQQV9TQU1QTEVfQUxBVworI2RlZmluZSBQQV9TQU1QTEVfVUxBVyBQQV9TQU1QTEVfVUxBVworI2RlZmluZSBQQV9TQU1QTEVfUzE2TEUgUEFfU0FNUExFX1MxNkxFCisjZGVmaW5lIFBBX1NBTVBMRV9TMTZCRSBQQV9TQU1QTEVfUzE2QkUKKyNkZWZpbmUgUEFfU0FNUExFX0ZMT0FUMzJMRSBQQV9TQU1QTEVfRkxPQVQzMkxFCisjZGVmaW5lIFBBX1NBTVBMRV9GTE9BVDMyQkUgUEFfU0FNUExFX0ZMT0FUMzJCRQorI2RlZmluZSBQQV9TQU1QTEVfUzMyTEUgUEFfU0FNUExFX1MzMkxFCisjZGVmaW5lIFBBX1NBTVBMRV9TMzJCRSBQQV9TQU1QTEVfUzMyQkUKKyNkZWZpbmUgUEFfU0FNUExFX1MyNExFIFBBX1NBTVBMRV9TMjRMRQorI2RlZmluZSBQQV9TQU1QTEVfUzI0QkUgUEFfU0FNUExFX1MyNEJFCisjZGVmaW5lIFBBX1NBTVBMRV9TMjRfMzJMRSBQQV9TQU1QTEVfUzI0XzMyTEUKKyNkZWZpbmUgUEFfU0FNUExFX1MyNF8zMkJFIFBBX1NBTVBMRV9TMjRfMzJCRQorLyoqIFxlbmRjb25kICovCisKKy8qKiBBIHNhbXBsZSBmb3JtYXQgYW5kIGF0dHJpYnV0ZSBzcGVjaWZpY2F0aW9uICovCit0eXBlZGVmIHN0cnVjdCBwYV9zYW1wbGVfc3BlYyB7CisgICAgcGFfc2FtcGxlX2Zvcm1hdF90IGZvcm1hdDsKKyAgICAvKio8IFRoZSBzYW1wbGUgZm9ybWF0ICovCisKKyAgICB1aW50MzJfdCByYXRlOworICAgIC8qKjwgVGhlIHNhbXBsZSByYXRlLiAoZS5nLiA0NDEwMCkgKi8KKworICAgIHVpbnQ4X3QgY2hhbm5lbHM7CisgICAgLyoqPCBBdWRpbyBjaGFubmVscy4gKDEgZm9yIG1vbm8sIDIgZm9yIHN0ZXJlbywgLi4uKSAqLworfSBwYV9zYW1wbGVfc3BlYzsKKworLyoqIFR5cGUgZm9yIHVzZWMgc3BlY2lmaWNhdGlvbnMgKHVuc2lnbmVkKS4gQWx3YXlzIDY0IGJpdC4gKi8KK3R5cGVkZWYgdWludDY0X3QgcGFfdXNlY190OworCisvKiogUmV0dXJuIHRoZSBhbW91bnQgb2YgYnl0ZXMgcGxheWJhY2sgb2YgYSBzZWNvbmQgb2YgYXVkaW8gd2l0aCB0aGUgc3BlY2lmaWVkIHNhbXBsZSB0eXBlIHRha2VzICovCitzaXplX3QgcGFfYnl0ZXNfcGVyX3NlY29uZChjb25zdCBwYV9zYW1wbGVfc3BlYyAqc3BlYykgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gdGhlIHNpemUgb2YgYSBmcmFtZSB3aXRoIHRoZSBzcGVjaWZpYyBzYW1wbGUgdHlwZSAqLworc2l6ZV90IHBhX2ZyYW1lX3NpemUoY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNwZWMpIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIHRoZSBzaXplIG9mIGEgc2FtcGxlIHdpdGggdGhlIHNwZWNpZmljIHNhbXBsZSB0eXBlICovCitzaXplX3QgcGFfc2FtcGxlX3NpemUoY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNwZWMpIFBBX0dDQ19QVVJFOworCisvKiogU2ltaWxhciB0byBwYV9zYW1wbGVfc2l6ZSgpIGJ1dCB0YWtlIGEgc2FtcGxlIGZvcm1hdCBpbnN0ZWFkIG9mIGEKKyAqIGZ1bGwgc2FtcGxlIHNwZWMuIFxzaW5jZSAwLjkuMTUgKi8KK3NpemVfdCBwYV9zYW1wbGVfc2l6ZV9vZl9mb3JtYXQocGFfc2FtcGxlX2Zvcm1hdF90IGYpIFBBX0dDQ19QVVJFOworCisvKiogQ2FsY3VsYXRlIHRoZSB0aW1lIHRoZSBzcGVjaWZpZWQgYnl0ZXMgdGFrZSB0byBwbGF5IHdpdGggdGhlCisgKiBzcGVjaWZpZWQgc2FtcGxlIHR5cGUuIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBhbHdheXMgYmUgcm91bmRlZAorICogZG93biBmb3Igbm9uLWludGVncmFsIHJldHVybiB2YWx1ZXMuICovCitwYV91c2VjX3QgcGFfYnl0ZXNfdG9fdXNlYyh1aW50NjRfdCBsZW5ndGgsIGNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcGVjKSBQQV9HQ0NfUFVSRTsKKworLyoqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmllZAorICogdGltZS4gVGhlIHJldHVybiB2YWx1ZSB3aWxsIGFsd2F5cyBiZSByb3VuZGVkIGRvd24gZm9yIG5vbi1pbnRlZ3JhbAorICogcmV0dXJuIHZhbHVlcy4gXHNpbmNlIDAuOSAqLworc2l6ZV90IHBhX3VzZWNfdG9fYnl0ZXMocGFfdXNlY190IHQsIGNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcGVjKSBQQV9HQ0NfUFVSRTsKKworLyoqIEluaXRpYWxpemUgdGhlIHNwZWNpZmllZCBzYW1wbGUgc3BlYyBhbmQgcmV0dXJuIGEgcG9pbnRlciB0bworICogaXQuIFRoZSBzYW1wbGUgc3BlYyB3aWxsIGhhdmUgYSBkZWZpbmVkIHN0YXRlIGJ1dAorICogcGFfc2FtcGxlX3NwZWNfdmFsaWQoKSB3aWxsIGZhaWwgZm9yIGl0LiBcc2luY2UgMC45LjEzICovCitwYV9zYW1wbGVfc3BlYyogcGFfc2FtcGxlX3NwZWNfaW5pdChwYV9zYW1wbGVfc3BlYyAqc3BlYyk7CisKKy8qKiBSZXR1cm4gbm9uLXplcm8gd2hlbiB0aGUgc2FtcGxlIHR5cGUgc3BlY2lmaWNhdGlvbiBpcyB2YWxpZCAqLworaW50IHBhX3NhbXBsZV9zcGVjX3ZhbGlkKGNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcGVjKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiBub24temVybyB3aGVuIHRoZSB0d28gc2FtcGxlIHR5cGUgc3BlY2lmaWNhdGlvbnMgbWF0Y2ggKi8KK2ludCBwYV9zYW1wbGVfc3BlY19lcXVhbChjb25zdCBwYV9zYW1wbGVfc3BlYyphLCBjb25zdCBwYV9zYW1wbGVfc3BlYypiKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiBhIGRlc2NyaXB0aXZlIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBzYW1wbGUgZm9ybWF0LiBcc2luY2UgMC44ICovCitjb25zdCBjaGFyICpwYV9zYW1wbGVfZm9ybWF0X3RvX3N0cmluZyhwYV9zYW1wbGVfZm9ybWF0X3QgZikgUEFfR0NDX1BVUkU7CisKKy8qKiBQYXJzZSBhIHNhbXBsZSBmb3JtYXQgdGV4dC4gSW52ZXJzZSBvZiBwYV9zYW1wbGVfZm9ybWF0X3RvX3N0cmluZygpICovCitwYV9zYW1wbGVfZm9ybWF0X3QgcGFfcGFyc2Vfc2FtcGxlX2Zvcm1hdChjb25zdCBjaGFyICpmb3JtYXQpIFBBX0dDQ19QVVJFOworCisvKiogTWF4aW11bSByZXF1aXJlZCBzdHJpbmcgbGVuZ3RoIGZvcgorICogcGFfc2FtcGxlX3NwZWNfc25wcmludCgpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgdmFsdWUgY2FuIGNoYW5nZQorICogd2l0aCBhbnkgcmVsZWFzZSB3aXRob3V0IHdhcm5pbmcgYW5kIHdpdGhvdXQgYmVpbmcgY29uc2lkZXJlZCBBUEkKKyAqIG9yIEFCSSBicmVha2FnZS4gWW91IHNob3VsZCBub3QgdXNlIHRoaXMgZGVmaW5pdGlvbiBhbnl3aGVyZSB3aGVyZQorICogaXQgbWlnaHQgYmVjb21lIHBhcnQgb2YgYW4gQUJJLiAqLworI2RlZmluZSBQQV9TQU1QTEVfU1BFQ19TTlBSSU5UX01BWCAzMgorCisvKiogUHJldHR5IHByaW50IGEgc2FtcGxlIHR5cGUgc3BlY2lmaWNhdGlvbiB0byBhIHN0cmluZyAqLworY2hhciogcGFfc2FtcGxlX3NwZWNfc25wcmludChjaGFyICpzLCBzaXplX3QgbCwgY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNwZWMpOworCisvKiogTWF4aW11bSByZXF1aXJlZCBzdHJpbmcgbGVuZ3RoIGZvciBwYV9ieXRlc19zbnByaW50KCkuIFBsZWFzZSBub3RlCisgKiB0aGF0IHRoaXMgdmFsdWUgY2FuIGNoYW5nZSB3aXRoIGFueSByZWxlYXNlIHdpdGhvdXQgd2FybmluZyBhbmQKKyAqIHdpdGhvdXQgYmVpbmcgY29uc2lkZXJlZCBBUEkgb3IgQUJJIGJyZWFrYWdlLiBZb3Ugc2hvdWxkIG5vdCB1c2UKKyAqIHRoaXMgZGVmaW5pdGlvbiBhbnl3aGVyZSB3aGVyZSBpdCBtaWdodCBiZWNvbWUgcGFydCBvZiBhbgorICogQUJJLiBcc2luY2UgMC45LjE2ICovCisjZGVmaW5lIFBBX0JZVEVTX1NOUFJJTlRfTUFYIDExCisKKy8qKiBQcmV0dHkgcHJpbnQgYSBieXRlIHNpemUgdmFsdWUuIChpLmUuICIyLjUgTWlCIikgKi8KK2NoYXIqIHBhX2J5dGVzX3NucHJpbnQoY2hhciAqcywgc2l6ZV90IGwsIHVuc2lnbmVkIHYpOworCisvKiogUmV0dXJuIDEgd2hlbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCBpcyBsaXR0bGUgZW5kaWFuLCByZXR1cm4gLTEKKyAqIHdoZW4gZW5kaWFubmVzcyBkb2VzIG5vdCBhcHBseSB0byB0aGlzIGZvcm1hdC4gXHNpbmNlIDAuOS4xNiAqLworaW50IHBhX3NhbXBsZV9mb3JtYXRfaXNfbGUocGFfc2FtcGxlX2Zvcm1hdF90IGYpIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIDEgd2hlbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCBpcyBiaWcgZW5kaWFuLCByZXR1cm4gLTEgd2hlbgorICogZW5kaWFubmVzcyBkb2VzIG5vdCBhcHBseSB0byB0aGlzIGZvcm1hdC4gXHNpbmNlIDAuOS4xNiAqLworaW50IHBhX3NhbXBsZV9mb3JtYXRfaXNfYmUocGFfc2FtcGxlX2Zvcm1hdF90IGYpIFBBX0dDQ19QVVJFOworCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisjZGVmaW5lIHBhX3NhbXBsZV9mb3JtYXRfaXNfbmUoZikgcGFfc2FtcGxlX2Zvcm1hdF9pc19iZShmKQorI2RlZmluZSBwYV9zYW1wbGVfZm9ybWF0X2lzX3JlKGYpIHBhX3NhbXBsZV9mb3JtYXRfaXNfbGUoZikKKyNlbHNlCisvKiogUmV0dXJuIDEgd2hlbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCBpcyBuYXRpdmUgZW5kaWFuLCByZXR1cm4gLTEKKyAqIHdoZW4gZW5kaWFubmVzcyBkb2VzIG5vdCBhcHBseSB0byB0aGlzIGZvcm1hdC4gXHNpbmNlIDAuOS4xNiAqLworI2RlZmluZSBwYV9zYW1wbGVfZm9ybWF0X2lzX25lKGYpIHBhX3NhbXBsZV9mb3JtYXRfaXNfbGUoZikKKy8qKiBSZXR1cm4gMSB3aGVuIHRoZSBzcGVjaWZpZWQgZm9ybWF0IGlzIHJldmVyc2UgZW5kaWFuLCByZXR1cm4gLTEKKyAqIHdoZW4gZW5kaWFubmVzcyBkb2VzIG5vdCBhcHBseSB0byB0aGlzIGZvcm1hdC4gXHNpbmNlIDAuOS4xNiAqLworI2RlZmluZSBwYV9zYW1wbGVfZm9ybWF0X2lzX3JlKGYpIHBhX3NhbXBsZV9mb3JtYXRfaXNfYmUoZikKKyNlbmRpZgorCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zY2FjaGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc2NhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmY2JkMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc2NhY2hlLmgKQEAgLTAsMCArMSwxMjYgQEAKKyNpZm5kZWYgZm9vc2NhY2hlaGZvbworI2RlZmluZSBmb29zY2FjaGVoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8cHVsc2Uvc3RyZWFtLmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBccGFnZSBzY2FjaGUgU2FtcGxlIENhY2hlCisgKgorICogXHNlY3Rpb24gb3ZlcnZfc2VjIE92ZXJ2aWV3CisgKgorICogVGhlIHNhbXBsZSBjYWNoZSBwcm92aWRlcyBhIHNpbXBsZSB3YXkgb2Ygb3ZlcmNvbWluZyBoaWdoIG5ldHdvcmsgbGF0ZW5jaWVzCisgKiBhbmQgcmVkdWNpbmcgYmFuZHdpZHRoLiBJbnN0ZWFkIG9mIHN0cmVhbWluZyBhIHNvdW5kIHByZWNpc2VseSB3aGVuIGl0CisgKiBzaG91bGQgYmUgcGxheWVkLCBpdCBpcyBzdG9yZWQgb24gdGhlIHNlcnZlciBhbmQgb25seSB0aGUgY29tbWFuZCB0byBzdGFydAorICogcGxheWluZyBpdCBuZWVkcyB0byBiZSBzZW50LgorICoKKyAqIFxzZWN0aW9uIGNyZWF0ZV9zZWMgQ3JlYXRpb24KKyAqCisgKiBUbyBjcmVhdGUgYSBzYW1wbGUsIHRoZSBub3JtYWwgc3RyZWFtIEFQSSBpcyB1c2VkIChzZWUgXHJlZiBzdHJlYW1zKS4gVGhlCisgKiBmdW5jdGlvbiBwYV9zdHJlYW1fY29ubmVjdF91cGxvYWQoKSB3aWxsIG1ha2Ugc3VyZSB0aGUgc3RyZWFtIGlzIHN0b3JlZCBhcworICogYSBzYW1wbGUgb24gdGhlIHNlcnZlci4KKyAqCisgKiBUbyBjb21wbGV0ZSB0aGUgdXBsb2FkLCBwYV9zdHJlYW1fZmluaXNoX3VwbG9hZCgpIGlzIGNhbGxlZCBhbmQgdGhlIHNhbXBsZQorICogd2lsbCByZWNlaXZlIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHN0cmVhbS4gSWYgdGhlIHVwbG9hZCBzaG91bGQgYmUgYWJvcnRlZCwKKyAqIHNpbXBseSBjYWxsIHBhX3N0cmVhbV9kaXNjb25uZWN0KCkuCisgKgorICogXHNlY3Rpb24gcGxheV9zZWMgUGxheWluZyBzYW1wbGVzCisgKgorICogVG8gcGxheSBiYWNrIGEgc2FtcGxlLCBzaW1wbHkgY2FsbCBwYV9jb250ZXh0X3BsYXlfc2FtcGxlKCk6CisgKgorICogXGNvZGUKKyAqIHBhX29wZXJhdGlvbiAqbzsKKyAqCisgKiBvID0gcGFfY29udGV4dF9wbGF5X3NhbXBsZShteV9jb250ZXh0LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsZTIiLCAgICAgICAvLyBOYW1lIG9mIG15IHNhbXBsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBzaW5rCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQV9WT0xVTUVfTk9STSwgIC8vIEZ1bGwgdm9sdW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgIC8vIERvbid0IG5lZWQgYSBjYWxsYmFjaworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAqIGlmIChvKQorICogICAgIHBhX29wZXJhdGlvbl91bnJlZihvKTsKKyAqIFxlbmRjb2RlCisgKgorICogXHNlY3Rpb24gcmVtX3NlYyBSZW1vdmluZyBzYW1wbGVzCisgKgorICogV2hlbiBhIHNhbXBsZSBpcyBubyBsb25nZXIgbmVlZGVkLCBpdCBzaG91bGQgYmUgcmVtb3ZlZCBvbiB0aGUgc2VydmVyIHRvCisgKiBzYXZlIHJlc291cmNlcy4gVGhlIHNhbXBsZSBpcyBkZWxldGVkIHVzaW5nIHBhX2NvbnRleHRfcmVtb3ZlX3NhbXBsZSgpLgorICovCisKKy8qKiBcZmlsZQorICogQWxsIHNhbXBsZSBjYWNoZSByZWxhdGVkIHJvdXRpbmVzCisgKgorICogU2VlIGFsc28gXHN1YnBhZ2Ugc2NhY2hlCisgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2NvbnRleHRfcGxheV9zYW1wbGVfd2l0aF9wcm9wbGlzdCgpLiBUaGUKKyAqIGlkeCB2YWx1ZSBpcyB0aGUgaW5kZXggb2YgdGhlIHNpbmsgaW5wdXQgb2JqZWN0LCBvcgorICogUEFfSU5WQUxJRF9JTkRFWCBvbiBmYWlsdXJlLiBcc2luY2UgMC45LjExICovCit0eXBlZGVmIHZvaWQgKCpwYV9jb250ZXh0X3BsYXlfc2FtcGxlX2NiX3QpKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogTWFrZSB0aGlzIHN0cmVhbSBhIHNhbXBsZSB1cGxvYWQgc3RyZWFtICovCitpbnQgcGFfc3RyZWFtX2Nvbm5lY3RfdXBsb2FkKHBhX3N0cmVhbSAqcywgc2l6ZV90IGxlbmd0aCk7CisKKy8qKiBGaW5pc2ggdGhlIHNhbXBsZSB1cGxvYWQsIHRoZSBzdHJlYW0gbmFtZSB3aWxsIGJlY29tZSB0aGUgc2FtcGxlCisgKiBuYW1lLiBZb3UgY2FuY2VsIGEgc2FtcGxlIHVwbG9hZCBieSBpc3N1aW5nCisgKiBwYV9zdHJlYW1fZGlzY29ubmVjdCgpICovCitpbnQgcGFfc3RyZWFtX2ZpbmlzaF91cGxvYWQocGFfc3RyZWFtICpzKTsKKworLyoqIFJlbW92ZSBhIHNhbXBsZSBmcm9tIHRoZSBzYW1wbGUgY2FjaGUuIFJldHVybnMgYW4gb3BlcmF0aW9uIG9iamVjdCB3aGljaCBtYXkgYmUgdXNlZCB0byBjYW5jZWwgdGhlIG9wZXJhdGlvbiB3aGlsZSBpdCBpcyBydW5uaW5nICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfcmVtb3ZlX3NhbXBsZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUGxheSBhIHNhbXBsZSBmcm9tIHRoZSBzYW1wbGUgY2FjaGUgdG8gdGhlIHNwZWNpZmllZCBkZXZpY2UuIElmCisgKiB0aGUgbGF0dGVyIGlzIE5VTEwgdXNlIHRoZSBkZWZhdWx0IHNpbmsuIFJldHVybnMgYW4gb3BlcmF0aW9uCisgKiBvYmplY3QgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9wbGF5X3NhbXBsZSgKKyAgICAgICAgcGFfY29udGV4dCAqYyAgICAgICAgICAgICAgIC8qKjwgQ29udGV4dCAqLywKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc2FtcGxlIHRvIHBsYXkgKi8sCisgICAgICAgIGNvbnN0IGNoYXIgKmRldiAgICAgICAgICAgICAvKio8IFNpbmsgdG8gcGxheSB0aGlzIHNhbXBsZSBvbiAqLywKKyAgICAgICAgcGFfdm9sdW1lX3Qgdm9sdW1lICAgICAgICAgIC8qKjwgVm9sdW1lIHRvIHBsYXkgdGhpcyBzYW1wbGUgd2l0aC4gU3RhcnRpbmcgd2l0aCAwLjkuMTUgeW91IG1heSBwYXNzIGhlcmUgUEFfVk9MVU1FX0lOVkFMSUQgd2hpY2ggd2lsbCBsZWF2ZSB0aGUgZGVjaXNpb24gYWJvdXQgdGhlIHZvbHVtZSB0byB0aGUgc2VydmVyIHNpZGUgd2hpY2ggaXMgYSBnb29kIGlkZWEuICovICwKKyAgICAgICAgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IgIC8qKjwgQ2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIHN1Y2Nlc3NmdWxseSBzdGFydGluZyBwbGF5YmFjaywgb3IgTlVMTCAqLywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEgICAgICAgICAgICAgIC8qKjwgVXNlcmRhdGEgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2sgKi8pOworCisvKiogUGxheSBhIHNhbXBsZSBmcm9tIHRoZSBzYW1wbGUgY2FjaGUgdG8gdGhlIHNwZWNpZmllZCBkZXZpY2UsCisgKiBhbGxvd2luZyBzcGVjaWZpY2F0aW9uIG9mIGEgcHJvcGVydHkgbGlzdCBmb3IgdGhlIHBsYXliYWNrCisgKiBzdHJlYW0uIElmIHRoZSBsYXR0ZXIgaXMgTlVMTCB1c2UgdGhlIGRlZmF1bHQgc2luay4gUmV0dXJucyBhbgorICogb3BlcmF0aW9uIG9iamVjdC4gXHNpbmNlIDAuOS4xMSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3BsYXlfc2FtcGxlX3dpdGhfcHJvcGxpc3QoCisgICAgICAgIHBhX2NvbnRleHQgKmMgICAgICAgICAgICAgICAgICAgLyoqPCBDb250ZXh0ICovLAorICAgICAgICBjb25zdCBjaGFyICpuYW1lICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc2FtcGxlIHRvIHBsYXkgKi8sCisgICAgICAgIGNvbnN0IGNoYXIgKmRldiAgICAgICAgICAgICAgICAgLyoqPCBTaW5rIHRvIHBsYXkgdGhpcyBzYW1wbGUgb24gKi8sCisgICAgICAgIHBhX3ZvbHVtZV90IHZvbHVtZSAgICAgICAgICAgICAgLyoqPCBWb2x1bWUgdG8gcGxheSB0aGlzIHNhbXBsZSB3aXRoLiBTdGFydGluZyB3aXRoIDAuOS4xNSB5b3UgbWF5IHBhc3MgaGVyZSBQQV9WT0xVTUVfSU5WQUxJRCB3aGljaCB3aWxsIGxlYXZlIHRoZSBkZWNpc2lvbiBhYm91dCB0aGUgdm9sdW1lIHRvIHRoZSBzZXJ2ZXIgc2lkZSB3aGljaCBpcyBhIGdvb2QgaWRlYS4gICovICwKKyAgICAgICAgcGFfcHJvcGxpc3QgKnByb3BsaXN0ICAgICAgICAgICAvKio8IFByb3BlcnR5IGxpc3QgZm9yIHRoaXMgc291bmQuIFRoZSBwcm9wZXJ0eSBsaXN0IG9mIHRoZSBjYWNoZWQgZW50cnkgd2lsbCBiZSBtZXJnZWQgaW50byB0aGlzIHByb3BlcnR5IGxpc3QgKi8sCisgICAgICAgIHBhX2NvbnRleHRfcGxheV9zYW1wbGVfY2JfdCBjYiAgLyoqPCBDYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgc3VjY2Vzc2Z1bGx5IHN0YXJ0aW5nIHBsYXliYWNrLCBvciBOVUxMICovLAorICAgICAgICB2b2lkICp1c2VyZGF0YSAgICAgICAgICAgICAgICAgIC8qKjwgVXNlcmRhdGEgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2sgKi8pOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zaW1wbGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc2ltcGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViZWQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc2ltcGxlLmgKQEAgLTAsMCArMSwxNTEgQEAKKyNpZm5kZWYgZm9vc2ltcGxlaGZvbworI2RlZmluZSBmb29zaW1wbGVoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9zYW1wbGUuaD4KKyNpbmNsdWRlIDxwdWxzZS9jaGFubmVsbWFwLmg+CisjaW5jbHVkZSA8cHVsc2UvZGVmLmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBccGFnZSBzaW1wbGUgU2ltcGxlIEFQSQorICoKKyAqIFxzZWN0aW9uIG92ZXJ2X3NlYyBPdmVydmlldworICoKKyAqIFRoZSBzaW1wbGUgQVBJIGlzIGRlc2lnbmVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCB2ZXJ5IGJhc2ljIHNvdW5kCisgKiBwbGF5YmFjayBvciBjYXB0dXJlIG5lZWRzLiBJdCBjYW4gb25seSBzdXBwb3J0IGEgc2luZ2xlIHN0cmVhbSBwZXIKKyAqIGNvbm5lY3Rpb24gYW5kIGhhcyBubyBoYW5kbGluZyBvZiBjb21wbGV4IGZlYXR1cmVzIGxpa2UgZXZlbnRzLCBjaGFubmVsCisgKiBtYXBwaW5ncyBhbmQgdm9sdW1lIGNvbnRyb2wuIEl0IGlzLCBob3dldmVyLCB2ZXJ5IHNpbXBsZSB0byB1c2UgYW5kCisgKiBxdWl0ZSBzdWZmaWNpZW50IGZvciBtYW55IHByb2dyYW1zLgorICoKKyAqIFxzZWN0aW9uIGNvbm5fc2VjIENvbm5lY3RpbmcKKyAqCisgKiBUaGUgZmlyc3Qgc3RlcCBiZWZvcmUgdXNpbmcgdGhlIHNvdW5kIHN5c3RlbSBpcyB0byBjb25uZWN0IHRvIHRoZQorICogc2VydmVyLiBUaGlzIGlzIG5vcm1hbGx5IGRvbmUgdGhpcyB3YXk6CisgKgorICogXGNvZGUKKyAqIHBhX3NpbXBsZSAqczsKKyAqIHBhX3NhbXBsZV9zcGVjIHNzOworICoKKyAqIHNzLmZvcm1hdCA9IFBBX1NBTVBMRV9TMTZORTsKKyAqIHNzLmNoYW5uZWxzID0gMjsKKyAqIHNzLnJhdGUgPSA0NDEwMDsKKyAqCisgKiBzID0gcGFfc2ltcGxlX25ldyhOVUxMLCAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBzZXJ2ZXIuCisgKiAgICAgICAgICAgICAgICAgICAiRm9vYXBwIiwgICAgICAgICAgIC8vIE91ciBhcHBsaWNhdGlvbidzIG5hbWUuCisgKiAgICAgICAgICAgICAgICAgICBQQV9TVFJFQU1fUExBWUJBQ0ssCisgKiAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBkZXZpY2UuCisgKiAgICAgICAgICAgICAgICAgICAiTXVzaWMiLCAgICAgICAgICAgIC8vIERlc2NyaXB0aW9uIG9mIG91ciBzdHJlYW0uCisgKiAgICAgICAgICAgICAgICAgICAmc3MsICAgICAgICAgICAgICAgIC8vIE91ciBzYW1wbGUgZm9ybWF0LgorICogICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBjaGFubmVsIG1hcAorICogICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBidWZmZXJpbmcgYXR0cmlidXRlcy4KKyAqICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgLy8gSWdub3JlIGVycm9yIGNvZGUuCisgKiAgICAgICAgICAgICAgICAgICApOworICogXGVuZGNvZGUKKyAqCisgKiBBdCB0aGlzIHBvaW50IGEgY29ubmVjdGVkIG9iamVjdCBpcyByZXR1cm5lZCwgb3IgTlVMTCBpZiB0aGVyZSB3YXMgYQorICogcHJvYmxlbSBjb25uZWN0aW5nLgorICoKKyAqIFxzZWN0aW9uIHRyYW5zZmVyX3NlYyBUcmFuc2ZlcnJpbmcgZGF0YQorICoKKyAqIE9uY2UgdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgdG8gdGhlIHNlcnZlciwgZGF0YSBjYW4gc3RhcnQgZmxvd2luZy4KKyAqIFVzaW5nIHRoZSBjb25uZWN0aW9uIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgbm9ybWFsIHJlYWQoKSBhbmQgd3JpdGUoKQorICogc3lzdGVtIGNhbGxzLiBUaGUgbWFpbiBkaWZmZXJlbmNlIGlzIHRoYXQgdGhleSdyZSBjYWxsIHBhX3NpbXBsZV9yZWFkKCkKKyAqIGFuZCBwYV9zaW1wbGVfd3JpdGUoKS4gTm90ZSB0aGF0IHRoZXNlIG9wZXJhdGlvbnMgYWx3YXlzIGJsb2NrLgorICoKKyAqIFxzZWN0aW9uIGN0cmxfc2VjIEJ1ZmZlciBjb250cm9sCisgKgorICogSWYgYSBwbGF5YmFjayBzdHJlYW0gaXMgdXNlZCB0aGVuIGEgZmV3IG90aGVyIG9wZXJhdGlvbnMgYXJlIGF2YWlsYWJsZToKKyAqCisgKiBcbGkgcGFfc2ltcGxlX2RyYWluKCkgLSBXaWxsIHdhaXQgZm9yIGFsbCBzZW50IGRhdGEgdG8gZmluaXNoIHBsYXlpbmcuCisgKiBcbGkgcGFfc2ltcGxlX2ZsdXNoKCkgLSBXaWxsIHRocm93IGF3YXkgYWxsIGRhdGEgY3VycmVudGx5IGluIGJ1ZmZlcnMuCisgKiBcbGkgcGFfc2ltcGxlX2dldF9sYXRlbmN5KCkgLSBXaWxsIHJldHVybiB0aGUgdG90YWwgbGF0ZW5jeSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBsYXliYWNrIHBpcGVsaW5lLgorICoKKyAqIFxzZWN0aW9uIGNsZWFudXBfc2VjIENsZWFudXAKKyAqCisgKiBPbmNlIHBsYXliYWNrIG9yIGNhcHR1cmUgaXMgY29tcGxldGUsIHRoZSBjb25uZWN0aW9uIHNob3VsZCBiZSBjbG9zZWQKKyAqIGFuZCByZXNvdXJjZXMgZnJlZWQuIFRoaXMgaXMgZG9uZSB0aHJvdWdoOgorICoKKyAqIFxjb2RlCisgKiBwYV9zaW1wbGVfZnJlZShzKTsKKyAqIFxlbmRjb2RlCisgKi8KKworLyoqIFxmaWxlCisgKiBBIHNpbXBsZSBidXQgbGltaXRlZCBzeW5jaHJvbm91cyBwbGF5YmFjayBhbmQgcmVjb3JkaW5nCisgKiBBUEkuIFRoaXMgaXMgYSBzeW5jaHJvbm91cywgc2ltcGxpZmllZCB3cmFwcGVyIGFyb3VuZCB0aGUgc3RhbmRhcmQKKyAqIGFzeW5jaHJvbm91cyBBUEkuCisgKgorICogU2VlIGFsc28gXHN1YnBhZ2Ugc2ltcGxlCisgKi8KKworLyoqIFxleGFtcGxlIHBhY2F0LXNpbXBsZS5jCisgKiBBIHNpbXBsZSBwbGF5YmFjayB0b29sIHVzaW5nIHRoZSBzaW1wbGUgQVBJICovCisKKy8qKiBcZXhhbXBsZSBwYXJlYy1zaW1wbGUuYworICogQSBzaW1wbGUgcmVjb3JkaW5nIHRvb2wgdXNpbmcgdGhlIHNpbXBsZSBBUEkgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBcc3RydWN0IHBhX3NpbXBsZQorICogQW4gb3BhcXVlIHNpbXBsZSBjb25uZWN0aW9uIG9iamVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc2ltcGxlIHBhX3NpbXBsZTsKKworLyoqIENyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgKi8KK3BhX3NpbXBsZSogcGFfc2ltcGxlX25ldygKKyAgICBjb25zdCBjaGFyICpzZXJ2ZXIsICAgICAgICAgICAgICAgICAvKio8IFNlcnZlciBuYW1lLCBvciBOVUxMIGZvciBkZWZhdWx0ICovCisgICAgY29uc3QgY2hhciAqbmFtZSwgICAgICAgICAgICAgICAgICAgLyoqPCBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoaXMgY2xpZW50IChhcHBsaWNhdGlvbiBuYW1lLCAuLi4pICovCisgICAgcGFfc3RyZWFtX2RpcmVjdGlvbl90IGRpciwgICAgICAgICAgLyoqPCBPcGVuIHRoaXMgc3RyZWFtIGZvciByZWNvcmRpbmcgb3IgcGxheWJhY2s/ICovCisgICAgY29uc3QgY2hhciAqZGV2LCAgICAgICAgICAgICAgICAgICAgLyoqPCBTaW5rIChyZXNwLiBzb3VyY2UpIG5hbWUsIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8KKyAgICBjb25zdCBjaGFyICpzdHJlYW1fbmFtZSwgICAgICAgICAgICAvKio8IEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhpcyBjbGllbnQgKGFwcGxpY2F0aW9uIG5hbWUsIHNvbmcgdGl0bGUsIC4uLikgKi8KKyAgICBjb25zdCBwYV9zYW1wbGVfc3BlYyAqc3MsICAgICAgICAgICAvKio8IFRoZSBzYW1wbGUgdHlwZSB0byB1c2UgKi8KKyAgICBjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwLCAgICAgICAgICAvKio8IFRoZSBjaGFubmVsIG1hcCB0byB1c2UsIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8KKyAgICBjb25zdCBwYV9idWZmZXJfYXR0ciAqYXR0ciwgICAgICAgICAvKio8IEJ1ZmZlcmluZyBhdHRyaWJ1dGVzLCBvciBOVUxMIGZvciBkZWZhdWx0ICovCisgICAgaW50ICplcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBIHBvaW50ZXIgd2hlcmUgdGhlIGVycm9yIGNvZGUgaXMgc3RvcmVkIHdoZW4gdGhlIHJvdXRpbmUgcmV0dXJucyBOVUxMLiBJdCBpcyBPSyB0byBwYXNzIE5VTEwgaGVyZS4gKi8KKyAgICApOworCisvKiogQ2xvc2UgYW5kIGZyZWUgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlci4gVGhlIGNvbm5lY3Rpb24gb2JqZWN0cyBiZWNvbWVzIGludmFsaWQgd2hlbiB0aGlzIGlzIGNhbGxlZC4gKi8KK3ZvaWQgcGFfc2ltcGxlX2ZyZWUocGFfc2ltcGxlICpzKTsKKworLyoqIFdyaXRlIHNvbWUgZGF0YSB0byB0aGUgc2VydmVyICovCitpbnQgcGFfc2ltcGxlX3dyaXRlKHBhX3NpbXBsZSAqcywgY29uc3Qgdm9pZCpkYXRhLCBzaXplX3QgYnl0ZXMsIGludCAqZXJyb3IpOworCisvKiogV2FpdCB1bnRpbCBhbGwgZGF0YSBhbHJlYWR5IHdyaXR0ZW4gaXMgcGxheWVkIGJ5IHRoZSBkYWVtb24gKi8KK2ludCBwYV9zaW1wbGVfZHJhaW4ocGFfc2ltcGxlICpzLCBpbnQgKmVycm9yKTsKKworLyoqIFJlYWQgc29tZSBkYXRhIGZyb20gdGhlIHNlcnZlciAqLworaW50IHBhX3NpbXBsZV9yZWFkKHBhX3NpbXBsZSAqcywgdm9pZCpkYXRhLCBzaXplX3QgYnl0ZXMsIGludCAqZXJyb3IpOworCisvKiogUmV0dXJuIHRoZSBwbGF5YmFjayBsYXRlbmN5LiAqLworcGFfdXNlY190IHBhX3NpbXBsZV9nZXRfbGF0ZW5jeShwYV9zaW1wbGUgKnMsIGludCAqZXJyb3IpOworCisvKiogRmx1c2ggdGhlIHBsYXliYWNrIGJ1ZmZlci4gIFRoaXMgZGlzY2FyZHMgYW55IGF1ZGlvIGluIHRoZSBidWZmZXIuICovCitpbnQgcGFfc2ltcGxlX2ZsdXNoKHBhX3NpbXBsZSAqcywgaW50ICplcnJvcik7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3N0cmVhbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGExZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zdHJlYW0uaApAQCAtMCwwICsxLDc3NCBAQAorI2lmbmRlZiBmb29zdHJlYW1oZm9vCisjZGVmaW5lIGZvb3N0cmVhbWhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHB1bHNlL3NhbXBsZS5oPgorI2luY2x1ZGUgPHB1bHNlL2Zvcm1hdC5oPgorI2luY2x1ZGUgPHB1bHNlL2NoYW5uZWxtYXAuaD4KKyNpbmNsdWRlIDxwdWxzZS92b2x1bWUuaD4KKyNpbmNsdWRlIDxwdWxzZS9kZWYuaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL29wZXJhdGlvbi5oPgorI2luY2x1ZGUgPHB1bHNlL2NvbnRleHQuaD4KKyNpbmNsdWRlIDxwdWxzZS9wcm9wbGlzdC5oPgorCisvKiogXHBhZ2Ugc3RyZWFtcyBBdWRpbyBTdHJlYW1zCisgKgorICogXHNlY3Rpb24gb3ZlcnZfc2VjIE92ZXJ2aWV3CisgKgorICogQXVkaW8gc3RyZWFtcyBmb3JtIHRoZSBjZW50cmFsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHNvdW5kIHNlcnZlci4gRGF0YSBpcworICogcm91dGVkLCBjb252ZXJ0ZWQgYW5kIG1peGVkIGZyb20gc2V2ZXJhbCBzb3VyY2VzIGJlZm9yZSBpdCBpcyBwYXNzZWQgYWxvbmcKKyAqIHRvIGEgZmluYWwgb3V0cHV0LiBDdXJyZW50bHksIHRoZXJlIGFyZSB0aHJlZSBmb3JtcyBvZiBhdWRpbyBzdHJlYW1zOgorICoKKyAqIFxsaSBQbGF5YmFjayBzdHJlYW1zIC0gRGF0YSBmbG93cyBmcm9tIHRoZSBjbGllbnQgdG8gdGhlIHNlcnZlci4KKyAqIFxsaSBSZWNvcmQgc3RyZWFtcyAtIERhdGEgZmxvd3MgZnJvbSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQuCisgKiBcbGkgVXBsb2FkIHN0cmVhbXMgLSBTaW1pbGFyIHRvIHBsYXliYWNrIHN0cmVhbXMsIGJ1dCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1wbGUgY2FjaGUuIFNlZSBccmVmIHNjYWNoZSBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgYWJvdXQgY29udHJvbGxpbmcgdGhlIHNhbXBsZSBjYWNoZS4KKyAqCisgKiBcc2VjdGlvbiBjcmVhdGVfc2VjIENyZWF0aW5nCisgKgorICogVG8gYWNjZXNzIGEgc3RyZWFtLCBhIHBhX3N0cmVhbSBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisgKiBwYV9zdHJlYW1fbmV3KCkuIEF0IHRoaXMgcG9pbnQgdGhlIGF1ZGlvIHNhbXBsZSBmb3JtYXQgYW5kIG1hcHBpbmcgb2YKKyAqIGNoYW5uZWxzIG11c3QgYmUgc3BlY2lmaWVkLiBTZWUgXHJlZiBzYW1wbGUgYW5kIFxyZWYgY2hhbm5lbG1hcCBmb3IgbW9yZQorICogaW5mb3JtYXRpb24gYWJvdXQgdGhvc2Ugc3RydWN0dXJlcy4KKyAqCisgKiBUaGlzIGZpcnN0IHN0ZXAgd2lsbCBvbmx5IGNyZWF0ZSBhIGNsaWVudC1zaWRlIG9iamVjdCwgcmVwcmVzZW50aW5nIHRoZQorICogc3RyZWFtLiBUbyB1c2UgdGhlIHN0cmVhbSwgYSBzZXJ2ZXItc2lkZSBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGFuZAorICogYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2NhbCBvYmplY3QuIERlcGVuZGluZyBvbiB3aGljaCB0eXBlIG9mIHN0cmVhbSBpcworICogZGVzaXJlZCwgYSBkaWZmZXJlbnQgZnVuY3Rpb24gaXMgbmVlZGVkOgorICoKKyAqIFxsaSBQbGF5YmFjayBzdHJlYW0gLSBwYV9zdHJlYW1fY29ubmVjdF9wbGF5YmFjaygpCisgKiBcbGkgUmVjb3JkIHN0cmVhbSAtIHBhX3N0cmVhbV9jb25uZWN0X3JlY29yZCgpCisgKiBcbGkgVXBsb2FkIHN0cmVhbSAtIHBhX3N0cmVhbV9jb25uZWN0X3VwbG9hZCgpIChzZWUgXHJlZiBzY2FjaGUpCisgKgorICogU2ltaWxhciB0byBob3cgY29ubmVjdGlvbnMgYXJlIGRvbmUgaW4gY29udGV4dHMsIGNvbm5lY3RpbmcgYSBzdHJlYW0gd2lsbAorICogbm90IGdlbmVyYXRlIGEgcGFfb3BlcmF0aW9uIG9iamVjdC4gQWxzbyBsaWtlIGNvbnRleHRzLCB0aGUgYXBwbGljYXRpb24KKyAqIHNob3VsZCByZWdpc3RlciBhIHN0YXRlIGNoYW5nZSBjYWxsYmFjaywgdXNpbmcKKyAqIHBhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2soKSwgYW5kIHdhaXQgZm9yIHRoZSBzdHJlYW0gdG8gZW50ZXIgYW4gYWN0aXZlCisgKiBzdGF0ZS4KKyAqCisgKiBcc3Vic2VjdGlvbiBidWZhdHRyX3N1YnNlYyBCdWZmZXIgQXR0cmlidXRlcworICoKKyAqIFBsYXliYWNrIGFuZCByZWNvcmQgc3RyZWFtcyBhbHdheXMgaGF2ZSBhIHNlcnZlci1zaWRlIGJ1ZmZlciBhcworICogcGFydCBvZiB0aGUgZGF0YSBmbG93LiAgVGhlIHNpemUgb2YgdGhpcyBidWZmZXIgbmVlZHMgdG8gYmUgY2hvc2VuCisgKiBpbiBhIGNvbXByb21pc2UgYmV0d2VlbiBsb3cgbGF0ZW5jeSBhbmQgc2Vuc2l0aXZpdHkgZm9yIGJ1ZmZlcgorICogb3ZlcmZsb3dzL3VuZGVycnVucy4KKyAqCisgKiBUaGUgYnVmZmVyIG1ldHJpY3MgbWF5IGJlIGNvbnRyb2xsZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiBUaGV5IGFyZQorICogZGVzY3JpYmVkIHdpdGggYSBwYV9idWZmZXJfYXR0ciBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYSBudW1iZXIKKyAqIG9mIGZpZWxkczoKKyAqCisgKiBcbGkgbWF4bGVuZ3RoIC0gVGhlIGFic29sdXRlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlCisgKiAgICAgICAgICAgICAgICAgc3RvcmVkIGluIHRoZSBidWZmZXIuIElmIHRoaXMgdmFsdWUgaXMgZXhjZWVkZWQKKyAqICAgICAgICAgICAgICAgICB0aGVuIGRhdGEgd2lsbCBiZSBsb3N0LiBJdCBpcyByZWNvbW1lbmRlZCB0byBwYXNzCisgKiAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSAtMSBoZXJlIHdoaWNoIHdpbGwgY2F1c2UgdGhlIHNlcnZlciB0bworICogICAgICAgICAgICAgICAgIGZpbGwgaW4gdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUuCisgKgorICogXGxpIHRsZW5ndGggLSBUaGUgdGFyZ2V0IGZpbGwgbGV2ZWwgb2YgdGhlIHBsYXliYWNrIGJ1ZmZlci4gVGhlCisgKiAgICAgICAgICAgICAgIHNlcnZlciB3aWxsIG9ubHkgc2VuZCByZXF1ZXN0cyBmb3IgbW9yZSBkYXRhIGFzIGxvbmcKKyAqICAgICAgICAgICAgICAgYXMgdGhlIGJ1ZmZlciBoYXMgbGVzcyB0aGFuIHRoaXMgbnVtYmVyIG9mIGJ5dGVzIG9mCisgKiAgICAgICAgICAgICAgIGRhdGEuIElmIHlvdSBwYXNzICh1aW50MzJfdCkgLTEgKHdoaWNoIGlzCisgKiAgICAgICAgICAgICAgIHJlY29tbWVuZGVkKSBoZXJlIHRoZSBzZXJ2ZXIgd2lsbCBjaG9vc2UgdGhlIGxvbmdlc3QKKyAqICAgICAgICAgICAgICAgdGFyZ2V0IGJ1ZmZlciBmaWxsIGxldmVsIHBvc3NpYmxlIHRvIG1pbmltaXplIHRoZQorICogICAgICAgICAgICAgICBudW1iZXIgb2YgbmVjZXNzYXJ5IHdha2V1cHMgYW5kIG1heGltaXplIGRyb3Atb3V0CisgKiAgICAgICAgICAgICAgIHNhZmV0eS4gVGhpcyBjYW4gZXhjZWVkIDJzIG9mIGJ1ZmZlcmluZy4gRm9yCisgKiAgICAgICAgICAgICAgIGxvdy1sYXRlbmN5IGFwcGxpY2F0aW9ucyBvciBhcHBsaWNhdGlvbnMgd2hlcmUKKyAqICAgICAgICAgICAgICAgbGF0ZW5jeSBtYXR0ZXJzIHlvdSBzaG91bGQgcGFzcyBhIHByb3BlciB2YWx1ZSBoZXJlLgorICoKKyAqIFxsaSBwcmVidWYgLSBOdW1iZXIgb2YgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIGluIHRoZSBidWZmZXIgYmVmb3JlCisgKiAgICAgICAgICAgICAgcGxheWJhY2sgd2lsbCBjb21tZW5jZS4gU3RhcnQgb2YgcGxheWJhY2sgY2FuIGJlCisgKiAgICAgICAgICAgICAgZm9yY2VkIHVzaW5nIHBhX3N0cmVhbV90cmlnZ2VyKCkgZXZlbiB0aG91Z2ggdGhlCisgKiAgICAgICAgICAgICAgcHJlYnVmZmVyIHNpemUgaGFzbid0IGJlZW4gcmVhY2hlZC4gSWYgYSBidWZmZXIKKyAqICAgICAgICAgICAgICB1bmRlcnJ1biBvY2N1cnMsIHRoaXMgcHJlYnVmZmVyaW5nIHdpbGwgYmUgYWdhaW4KKyAqICAgICAgICAgICAgICBlbmFibGVkLiBJZiB0aGUgcGxheWJhY2sgc2hhbGwgbmV2ZXIgc3RvcCBpbiBjYXNlIG9mIGEKKyAqICAgICAgICAgICAgICBidWZmZXIgdW5kZXJydW4sIHRoaXMgdmFsdWUgc2hvdWxkIGJlIHNldCB0byAwLiBJbgorICogICAgICAgICAgICAgIHRoYXQgY2FzZSB0aGUgcmVhZCBpbmRleCBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgorICogICAgICAgICAgICAgIG92ZXJ0YWtlcyB0aGUgd3JpdGUgaW5kZXgsIGFuZCBoZW5jZSB0aGUgZmlsbCBsZXZlbCBvZgorICogICAgICAgICAgICAgIHRoZSBidWZmZXIgaXMgbmVnYXRpdmUuIElmIHlvdSBwYXNzICh1aW50MzJfdCkgLTEgaGVyZQorICogICAgICAgICAgICAgICh3aGljaCBpcyByZWNvbW1lbmRlZCkgdGhlIHNlcnZlciB3aWxsIGNob29zZSB0aGUgc2FtZQorICogICAgICAgICAgICAgIHZhbHVlIGFzIHRsZW5ndGggaGVyZS4KKyAqCisgKiBcbGkgbWlucmVxIC0gTWluaW11bSBmcmVlIG51bWJlciBvZiB0aGUgYnl0ZXMgaW4gdGhlIHBsYXliYWNrCisgKiAgICAgICAgICAgICAgYnVmZmVyIGJlZm9yZSB0aGUgc2VydmVyIHdpbGwgcmVxdWVzdCBtb3JlIGRhdGEuIEl0IGlzCisgKiAgICAgICAgICAgICAgcmVjb21tZW5kZWQgdG8gZmlsbCBpbiAodWludDMyX3QpIC0xIGhlcmUuIFRoaXMgdmFsdWUKKyAqICAgICAgICAgICAgICBpbmZsdWVuY2VzIGhvdyBtdWNoIHRpbWUgdGhlIHNvdW5kIHNlcnZlciBoYXMgdG8gbW92ZQorICogICAgICAgICAgICAgIGRhdGEgZnJvbSB0aGUgcGVyLXN0cmVhbSBzZXJ2ZXItc2lkZSBwbGF5YmFjayBidWZmZXIKKyAqICAgICAgICAgICAgICB0byB0aGUgaGFyZHdhcmUgcGxheWJhY2sgYnVmZmVyLgorICoKKyAqIFxsaSBmcmFnc2l6ZSAtIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhlIHNlcnZlciB3aWxsIHB1c2ggaW4KKyAqICAgICAgICAgICAgICAgIG9uZSBjaHVuayBmb3IgcmVjb3JkIHN0cmVhbXMuIElmIHlvdSBwYXNzICh1aW50MzJfdCkKKyAqICAgICAgICAgICAgICAgIC0xICh3aGljaCBpcyByZWNvbW1lbmRlZCkgaGVyZSwgdGhlIHNlcnZlciB3aWxsCisgKiAgICAgICAgICAgICAgICBjaG9vc2UgdGhlIGxvbmdlc3QgZnJhZ21lbnQgc2V0dGluZyBwb3NzaWJsZSB0bworICogICAgICAgICAgICAgICAgbWluaW1pemUgdGhlIG51bWJlciBvZiBuZWNlc3Nhcnkgd2FrZXVwcyBhbmQKKyAqICAgICAgICAgICAgICAgIG1heGltaXplIGRyb3Atb3V0IHNhZmV0eS4gVGhpcyBjYW4gZXhjZWVkIDJzIG9mCisgKiAgICAgICAgICAgICAgICBidWZmZXJpbmcuIEZvciBsb3ctbGF0ZW5jeSBhcHBsaWNhdGlvbnMgb3IKKyAqICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aGVyZSBsYXRlbmN5IG1hdHRlcnMgeW91IHNob3VsZCBwYXNzIGEKKyAqICAgICAgICAgICAgICAgIHByb3BlciB2YWx1ZSBoZXJlLgorICoKKyAqIElmIFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWSBpcyBzZXQsIHRoZW4gdGhlIHRsZW5ndGgvZnJhZ3NpemUKKyAqIHBhcmFtZXRlcnMgd2lsbCBiZSBpbnRlcnByZXRlZCBzbGlnaHRseSBkaWZmZXJlbnRseSB0aGFuIGRlc2NyaWJlZAorICogYWJvdmUgd2hlbiBwYXNzZWQgdG8gcGFfc3RyZWFtX2Nvbm5lY3RfcmVjb3JkKCkgYW5kCisgKiBwYV9zdHJlYW1fY29ubmVjdF9wbGF5YmFjaygpOiB0aGUgb3ZlcmFsbCBsYXRlbmN5IHRoYXQgaXMgY29tcHJpc2VkCisgKiBvZiBib3RoIHRoZSBzZXJ2ZXIgc2lkZSBwbGF5YmFjayBidWZmZXIgbGVuZ3RoLCB0aGUgaGFyZHdhcmUKKyAqIHBsYXliYWNrIGJ1ZmZlciBsZW5ndGggYW5kIGFkZGl0aW9uYWwgbGF0ZW5jaWVzIHdpbGwgYmUgYWRqdXN0ZWQgaW4KKyAqIGEgd2F5IHRoYXQgaXQgbWF0Y2hlcyB0bGVuZ3RoIHJlc3AuIGZyYWdzaXplLiBTZXQKKyAqIFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWSBpZiB5b3Ugd2FudCB0byBjb250cm9sIHRoZSBvdmVyYWxsCisgKiBwbGF5YmFjayBsYXRlbmN5IGZvciB5b3VyIHN0cmVhbS4gVW5zZXQgaXQgaWYgeW91IHdhbnQgdG8gY29udHJvbAorICogb25seSB0aGUgbGF0ZW5jeSBpbmR1Y2VkIGJ5IHRoZSBzZXJ2ZXItc2lkZSwgcmV3cml0YWJsZSBwbGF5YmFjaworICogYnVmZmVyLiBUaGUgc2VydmVyIHdpbGwgdHJ5IHRvIGZ1bGZpbGwgdGhlIGNsaWVudHMgbGF0ZW5jeSByZXF1ZXN0cworICogYXMgZ29vZCBhcyBwb3NzaWJsZS4gSG93ZXZlciBpZiB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBjYW5ub3QKKyAqIGNoYW5nZSB0aGUgaGFyZHdhcmUgYnVmZmVyIGxlbmd0aCBvciBvbmx5IGluIGEgbGltaXRlZCByYW5nZSwgdGhlCisgKiBhY3R1YWxseSByZXN1bHRpbmcgbGF0ZW5jeSBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSB3aGF0IHRoZSBjbGllbnQKKyAqIHJlcXVlc3RlZC4gVGh1cywgZm9yIHN5bmNocm9uaXphdGlvbiBjbGllbnRzIGFsd2F5cyBuZWVkIHRvIGNoZWNrCisgKiB0aGUgYWN0dWFsIG1lYXN1cmVkIGxhdGVuY3kgdmlhIHBhX3N0cmVhbV9nZXRfbGF0ZW5jeSgpIG9yIGEKKyAqIHNpbWlsYXIgY2FsbCwgYW5kIG5vdCBtYWtlIGFueSBhc3N1bXB0aW9ucy4gYWJvdXQgdGhlIGxhdGVuY3kKKyAqIGF2YWlsYWJsZS4gVGhlIGZ1bmN0aW9uIHBhX3N0cmVhbV9nZXRfYnVmZmVyX2F0dHIoKSB3aWxsIGFsd2F5cworICogcmV0dXJuIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgc2VydmVyLXNpZGUgcGVyLXN0cmVhbSBidWZmZXIgaW4KKyAqIHRsZW5ndGgvZnJhZ3NpemUsIHJlZ2FyZGxlc3Mgd2hldGhlciBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kgaXMKKyAqIHNldCBvciBub3QuCisgKgorICogVGhlIHNlcnZlci1zaWRlIHBlci1zdHJlYW0gcGxheWJhY2sgYnVmZmVycyBhcmUgaW5kZXhlZCBieSBhIHdyaXRlIGFuZCBhIHJlYWQKKyAqIGluZGV4LiBUaGUgYXBwbGljYXRpb24gd3JpdGVzIHRvIHRoZSB3cml0ZSBpbmRleCBhbmQgdGhlIHNvdW5kCisgKiBkZXZpY2UgcmVhZHMgZnJvbSB0aGUgcmVhZCBpbmRleC4gVGhlIHJlYWQgaW5kZXggaXMgaW5jcmVhc2VkCisgKiBtb25vdG9uaWNhbGx5LCB3aGlsZSB0aGUgd3JpdGUgaW5kZXggbWF5IGJlIGZyZWVseSBjb250cm9sbGVkIGJ5CisgKiB0aGUgYXBwbGljYXRpb24uIFN1YnRyYWN0aW5nIHRoZSByZWFkIGluZGV4IGZyb20gdGhlIHdyaXRlIGluZGV4CisgKiB3aWxsIGdpdmUgeW91IHRoZSBjdXJyZW50IGZpbGwgbGV2ZWwgb2YgdGhlIGJ1ZmZlci4gVGhlIHJlYWQvd3JpdGUKKyAqIGluZGV4ZXMgYXJlIDY0Yml0IHZhbHVlcyBhbmQgbWVhc3VyZWQgaW4gYnl0ZXMsIHRoZXkgd2lsbCBuZXZlcgorICogd3JhcC4gVGhlIGN1cnJlbnQgcmVhZC93cml0ZSBpbmRleCBtYXkgYmUgcXVlcmllZCB1c2luZworICogcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbygpIChzZWUgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24pLiBJbgorICogY2FzZSBvZiBhIGJ1ZmZlciB1bmRlcnJ1biB0aGUgcmVhZCBpbmRleCBpcyBlcXVhbCBvciBsYXJnZXIgdGhhbgorICogdGhlIHdyaXRlIGluZGV4LiBVbmxlc3MgdGhlIHByZWJ1ZiB2YWx1ZSBpcyAwLCBQdWxzZUF1ZGlvIHdpbGwKKyAqIHRlbXBvcmFyaWx5IHBhdXNlIHBsYXliYWNrIGluIHN1Y2ggYSBjYXNlLCBhbmQgd2FpdCB1bnRpbCB0aGUKKyAqIGJ1ZmZlciBpcyBmaWxsZWQgdXAgdG8gcHJlYnVmIGJ5dGVzIGFnYWluLiBJZiBwcmVidWYgaXMgMCwgdGhlCisgKiByZWFkIGluZGV4IG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgd3JpdGUgaW5kZXgsIGluIHdoaWNoIGNhc2UKKyAqIHNpbGVuY2UgaXMgcGxheWVkLiBJZiB0aGUgYXBwbGljYXRpb24gd3JpdGVzIGRhdGEgdG8gaW5kZXhlcyBsb3dlcgorICogdGhhbiB0aGUgcmVhZCBpbmRleCwgdGhlIGRhdGEgaXMgaW1tZWRpYXRlbHkgbG9zdC4KKyAqCisgKiBcc2VjdGlvbiB0cmFuc2Zlcl9zZWMgVHJhbnNmZXJyaW5nIERhdGEKKyAqCisgKiBPbmNlIHRoZSBzdHJlYW0gaXMgdXAsIGRhdGEgY2FuIHN0YXJ0IGZsb3dpbmcgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUKKyAqIHNlcnZlci4gVHdvIGRpZmZlcmVudCBhY2Nlc3MgbW9kZWxzIGNhbiBiZSB1c2VkIHRvIHRyYW5zZmVyIHRoZSBkYXRhOgorICoKKyAqIFxsaSBBc3luY2hyb25vdXMgLSBUaGUgYXBwbGljYXRpb24gcmVnaXN0ZXIgYSBjYWxsYmFjayB1c2luZworICogICAgICAgICAgICAgICAgICAgIHBhX3N0cmVhbV9zZXRfd3JpdGVfY2FsbGJhY2soKSBhbmQKKyAqICAgICAgICAgICAgICAgICAgICBwYV9zdHJlYW1fc2V0X3JlYWRfY2FsbGJhY2soKSB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMKKyAqICAgICAgICAgICAgICAgICAgICB0aGF0IGRhdGEgY2FuIGVpdGhlciBiZSB3cml0dGVuIG9yIHJlYWQuCisgKiBcbGkgUG9sbGVkIC0gUXVlcnkgdGhlIGxpYnJhcnkgZm9yIGF2YWlsYWJsZSBkYXRhL3NwYWNlIHVzaW5nCisgKiAgICAgICAgICAgICAgcGFfc3RyZWFtX3dyaXRhYmxlX3NpemUoKSBhbmQgcGFfc3RyZWFtX3JlYWRhYmxlX3NpemUoKSBhbmQKKyAqICAgICAgICAgICAgICB0cmFuc2ZlciBkYXRhIGFzIG5lZWRlZC4gVGhlIHNpemVzIGFyZSBzdG9yZWQgbG9jYWxseSwgaW4gdGhlCisgKiAgICAgICAgICAgICAgY2xpZW50IGVuZCwgc28gdGhlcmUgaXMgbm8gZGVsYXkgd2hlbiByZWFkaW5nIHRoZW0uCisgKgorICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBtaXggdGhlIHR3byBtb2RlbHMgZnJlZWx5LgorICoKKyAqIE9uY2UgdGhlcmUgaXMgZGF0YS9zcGFjZSBhdmFpbGFibGUsIGl0IGNhbiBiZSB0cmFuc2ZlcnJlZCB1c2luZyBlaXRoZXIKKyAqIHBhX3N0cmVhbV93cml0ZSgpIGZvciBwbGF5YmFjaywgb3IgcGFfc3RyZWFtX3BlZWsoKSAvIHBhX3N0cmVhbV9kcm9wKCkgZm9yCisgKiByZWNvcmQuIE1ha2Ugc3VyZSB5b3UgZG8gbm90IG92ZXJmbG93IHRoZSBwbGF5YmFjayBidWZmZXJzIGFzIGRhdGEgd2lsbCBiZQorICogZHJvcHBlZC4KKyAqCisgKiBcc2VjdGlvbiBidWZjdGxfc2VjIEJ1ZmZlciBDb250cm9sCisgKgorICogVGhlIHRyYW5zZmVyIGJ1ZmZlcnMgY2FuIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCBhIG51bWJlciBvZiBvcGVyYXRpb25zOgorICoKKyAqIFxsaSBwYV9zdHJlYW1fY29yaygpIC0gU3RhcnQgb3Igc3RvcCB0aGUgcGxheWJhY2sgb3IgcmVjb3JkaW5nLgorICogXGxpIHBhX3N0cmVhbV90cmlnZ2VyKCkgLSBTdGFydCBwbGF5YmFjayBpbW1lZGlhdGVseSBhbmQgZG8gbm90IHdhaXQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gZmlsbCB1cCB0byB0aGUgc2V0IHRyaWdnZXIgbGV2ZWwuCisgKiBcbGkgcGFfc3RyZWFtX3ByZWJ1ZigpIC0gUmVlbmFibGUgdGhlIHBsYXliYWNrIHRyaWdnZXIgbGV2ZWwuCisgKiBcbGkgcGFfc3RyZWFtX2RyYWluKCkgLSBXYWl0IGZvciB0aGUgcGxheWJhY2sgYnVmZmVyIHRvIGdvIGVtcHR5LiBXaWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSBwYV9vcGVyYXRpb24gb2JqZWN0IHRoYXQgd2lsbCBpbmRpY2F0ZSB3aGVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYnVmZmVyIGlzIGNvbXBsZXRlbHkgZHJhaW5lZC4KKyAqIFxsaSBwYV9zdHJlYW1fZmx1c2goKSAtIERyb3AgYWxsIGRhdGEgZnJvbSB0aGUgcGxheWJhY2sgYnVmZmVyIGFuZCBkbyBub3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQgZm9yIGl0IHRvIGZpbmlzaCBwbGF5aW5nLgorICoKKyAqIFxzZWN0aW9uIHNlZWtfbW9kZXMgU2Vla2luZyBpbiB0aGUgUGxheWJhY2sgQnVmZmVyCisgKgorICogQSBjbGllbnQgYXBwbGljYXRpb24gbWF5IGZyZWVseSBzZWVrIGluIHRoZSBwbGF5YmFjayBidWZmZXIuIFRvCisgKiBhY2NvbXBsaXNoIHRoYXQgdGhlIHBhX3N0cmVhbV93cml0ZSgpIGZ1bmN0aW9uIHRha2VzIGEgc2VlayBtb2RlCisgKiBhbmQgYW4gb2Zmc2V0IGFyZ3VtZW50LiBUaGUgc2VlayBtb2RlIGlzIG9uZSBvZjoKKyAqCisgKiBcbGkgUEFfU0VFS19SRUxBVElWRSAtIHNlZWsgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgaW5kZXgKKyAqIFxsaSBQQV9TRUVLX0FCU09MVVRFIC0gc2VlayByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwbGF5YmFjayBidWZmZXIsIChpLmUuIHRoZSBmaXJzdCB0aGF0IHdhcyBldmVyIHBsYXllZCBpbiB0aGUgc3RyZWFtKQorICogXGxpIFBBX1NFRUtfUkVMQVRJVkVfT05fUkVBRCAtIHNlZWsgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcmVhZCBpbmRleC4gVXNlIHRoaXMgdG8gd3JpdGUgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlciB0aGF0IHNob3VsZCBiZSBwbGF5ZWQgYXMgc29vbiBhcyBwb3NzaWJsZQorICogXGxpIFBBX1NFRUtfUkVMQVRJVkVfRU5EIC0gc2VlayByZWxhdGl2ZSB0byB0aGUgbGFzdCBieXRlIGV2ZXIgd3JpdHRlbi4KKyAqCisgKiBJZiBhbiBhcHBsaWNhdGlvbiBqdXN0IHdhbnRzIHRvIGFwcGVuZCBzb21lIGRhdGEgdG8gdGhlIG91dHB1dAorICogYnVmZmVyLCBQQV9TRUVLX1JFTEFUSVZFIGFuZCBhbiBvZmZzZXQgb2YgMCBzaG91bGQgYmUgdXNlZC4KKyAqCisgKiBBZnRlciBhIGNhbGwgdG8gcGFfc3RyZWFtX3dyaXRlKCkgdGhlIHdyaXRlIGluZGV4IHdpbGwgYmUgbGVmdCBhdAorICogdGhlIHBvc2l0aW9uIHJpZ2h0IGFmdGVyIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHdyaXR0ZW4gZGF0YS4KKyAqCisgKiBcc2VjdGlvbiBsYXRlbmN5X3NlYyBMYXRlbmN5CisgKgorICogQSBtYWpvciBwcm9ibGVtIHdpdGggbmV0d29ya2VkIGF1ZGlvIGlzIHRoZSBpbmNyZWFzZWQgbGF0ZW5jeSBjYXVzZWQgYnkKKyAqIHRoZSBuZXR3b3JrLiBUbyByZW1lZHkgdGhpcywgUHVsc2VBdWRpbyBzdXBwb3J0cyBhbiBhZHZhbmNlZCBzeXN0ZW0gb2YKKyAqIG1vbml0b3JpbmcgdGhlIGN1cnJlbnQgbGF0ZW5jeS4KKyAqCisgKiBUbyBnZXQgdGhlIHJhdyBkYXRhIG5lZWRlZCB0byBjYWxjdWxhdGUgbGF0ZW5jaWVzLCBjYWxsCisgKiBwYV9zdHJlYW1fZ2V0X3RpbWluZ19pbmZvKCkuIFRoaXMgd2lsbCBnaXZlIHlvdSBhIHBhX3RpbWluZ19pbmZvCisgKiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBldmVyeXRoaW5nIHRoYXQgaXMga25vd24gYWJvdXQgdGhlIHNlcnZlcgorICogc2lkZSBidWZmZXIgdHJhbnNwb3J0IGRlbGF5cyBhbmQgdGhlIGJhY2tlbmQgYWN0aXZlIGluIHRoZQorICogc2VydmVyLiAoQmVzaWRlcyBvdGhlciB0aGluZ3MgaXQgY29udGFpbnMgdGhlIHdyaXRlIGFuZCByZWFkIGluZGV4CisgKiB2YWx1ZXMgbWVudGlvbmVkIGFib3ZlLikKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1cGRhdGVkIGV2ZXJ5IHRpbWUgYQorICogcGFfc3RyZWFtX3VwZGF0ZV90aW1pbmdfaW5mbygpIG9wZXJhdGlvbiBpcyBleGVjdXRlZC4gKGkuZS4gYmVmb3JlCisgKiB0aGUgZmlyc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIHRoZSB0aW1pbmcgaW5mb3JtYXRpb24gc3RydWN0dXJlIGlzCisgKiBub3QgYXZhaWxhYmxlISkgU2luY2UgaXQgaXMgYSBsb3Qgb2Ygd29yayB0byBrZWVwIHRoaXMgc3RydWN0dXJlCisgKiB1cC10by1kYXRlIG1hbnVhbGx5LCBQdWxzZUF1ZGlvIGNhbiBkbyB0aGF0IGF1dG9tYXRpY2FsbHkgZm9yIHlvdToKKyAqIGlmIFBBX1NUUkVBTV9BVVRPX1RJTUlOR19VUERBVEUgaXMgcGFzc2VkIHdoZW4gY29ubmVjdGluZyB0aGUKKyAqIHN0cmVhbSBQdWxzZUF1ZGlvIHdpbGwgYXV0b21hdGljYWxseSB1cGRhdGUgdGhlIHN0cnVjdHVyZSBldmVyeQorICogMTAwbXMgYW5kIGV2ZXJ5IHRpbWUgYSBmdW5jdGlvbiBpcyBjYWxsZWQgdGhhdCBtaWdodCBpbnZhbGlkYXRlIHRoZQorICogcHJldmlvdXNseSBrbm93biB0aW1pbmcgZGF0YSAoc3VjaCBhcyBwYV9zdHJlYW1fd3JpdGUoKSBvcgorICogcGFfc3RyZWFtX2ZsdXNoKCkpLiBQbGVhc2Ugbm90ZSBob3dldmVyLCB0aGF0IHRoZXJlIGFsd2F5cyBpcyBhCisgKiBzaG9ydCB0aW1lIHdpbmRvdyB3aGVuIHRoZSBkYXRhIGluIHRoZSB0aW1pbmcgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKiBpcyBvdXQtb2YtZGF0ZS4gUHVsc2VBdWRpbyB0cmllcyB0byBtYXJrIHRoZXNlIHNpdHVhdGlvbnMgYnkKKyAqIHNldHRpbmcgdGhlIHdyaXRlX2luZGV4X2NvcnJ1cHQgYW5kIHJlYWRfaW5kZXhfY29ycnVwdCBmaWVsZHMKKyAqIGFjY29yZGluZ2x5LgorICoKKyAqIFRoZSByYXcgdGltaW5nIGRhdGEgaW4gdGhlIHBhX3RpbWluZ19pbmZvIHN0cnVjdHVyZSBpcyB1c3VhbGx5IGhhcmQKKyAqIHRvIGRlYWwgd2l0aC4gVGhlcmVmb3JlIGEgc2ltcGxlciBpbnRlcmZhY2UgaXMgYXZhaWxhYmxlOgorICogeW91IGNhbiBjYWxsIHBhX3N0cmVhbV9nZXRfdGltZSgpIG9yIHBhX3N0cmVhbV9nZXRfbGF0ZW5jeSgpLiBUaGUKKyAqIGZvcm1lciB3aWxsIHJldHVybiB0aGUgY3VycmVudCBwbGF5YmFjayB0aW1lIG9mIHRoZSBoYXJkd2FyZSBzaW5jZQorICogdGhlIHN0cmVhbSBoYXMgYmVlbiBzdGFydGVkLiBUaGUgbGF0dGVyIHJldHVybnMgdGhlIG92ZXJhbGwgdGltZSBhIHNhbXBsZQorICogdGhhdCB5b3Ugd3JpdGUgbm93IHRha2VzIHRvIGJlIHBsYXllZCBieSB0aGUgaGFyZHdhcmUuIFRoZXNlIHR3bworICogZnVuY3Rpb25zIGJhc2UgdGhlaXIgY2FsY3VsYXRpb25zIG9uIHRoZSBzYW1lIGRhdGEgdGhhdCBpcyByZXR1cm5lZAorICogYnkgcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbygpLiBIZW5jZSB0aGUgc2FtZSBydWxlcyBmb3Iga2VlcGluZworICogdGhlIHRpbWluZyBkYXRhIHVwLXRvLWRhdGUgYXBwbHkgaGVyZS4gSW4gY2FzZSB0aGUgd3JpdGUgb3IgcmVhZAorICogaW5kZXggaXMgY29ycnVwdGVkLCB0aGVzZSB0d28gZnVuY3Rpb25zIHdpbGwgZmFpbCB3aXRoCisgKiBQQV9FUlJfTk9EQVRBIHNldC4KKyAqCisgKiBTaW5jZSB1cGRhdGluZyB0aGUgdGltaW5nIGluZm8gc3RydWN0dXJlIHVzdWFsbHkgcmVxdWlyZXMgYSBmdWxsCisgKiBuZXR3b3JrIHJvdW5kIHRyaXAgYW5kIHNvbWUgYXBwbGljYXRpb25zIG1vbml0b3IgdGhlIHRpbWluZyB2ZXJ5CisgKiBvZnRlbiBQdWxzZUF1ZGlvIG9mZmVycyBhIHRpbWluZyBpbnRlcnBvbGF0aW9uIHN5c3RlbS4gSWYKKyAqIFBBX1NUUkVBTV9JTlRFUlBPTEFURV9USU1JTkcgaXMgcGFzc2VkIHdoZW4gY29ubmVjdGluZyB0aGUgc3RyZWFtLAorICogcGFfc3RyZWFtX2dldF90aW1lKCkgYW5kIHBhX3N0cmVhbV9nZXRfbGF0ZW5jeSgpIHdpbGwgdHJ5IHRvCisgKiBpbnRlcnBvbGF0ZSB0aGUgY3VycmVudCBwbGF5YmFjayB0aW1lL2xhdGVuY3kgYnkgZXN0aW1hdGluZyB0aGUKKyAqIG51bWJlciBvZiBzYW1wbGVzIHRoYXQgaGF2ZSBiZWVuIHBsYXllZCBiYWNrIGJ5IHRoZSBoYXJkd2FyZSBzaW5jZQorICogdGhlIGxhc3QgcmVndWxhciB0aW1pbmcgdXBkYXRlLiBJdCBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB0byBjb21iaW5lCisgKiB0aGlzIG9wdGlvbiB3aXRoIFBBX1NUUkVBTV9BVVRPX1RJTUlOR19VUERBVEUsIHdoaWNoIHdpbGwgZW5hYmxlCisgKiB5b3UgdG8gbW9uaXRvciB0aGUgY3VycmVudCBwbGF5YmFjayB0aW1lL2xhdGVuY3kgdmVyeSBwcmVjaXNlbHkgYW5kCisgKiB2ZXJ5IGZyZXF1ZW50bHkgd2l0aG91dCByZXF1aXJpbmcgYSBuZXR3b3JrIHJvdW5kIHRyaXAgZXZlcnkgdGltZS4KKyAqCisgKiBcc2VjdGlvbiBmbG93X3NlYyBPdmVyZmxvdyBhbmQgdW5kZXJmbG93CisgKgorICogRXZlbiB3aXRoIHRoZSBiZXN0IHByZWNhdXRpb25zLCBidWZmZXJzIHdpbGwgc29tZXRpbWUgb3ZlciAtIG9yCisgKiB1bmRlcmZsb3cuICBUbyBoYW5kbGUgdGhpcyBncmFjZWZ1bGx5LCB0aGUgYXBwbGljYXRpb24gY2FuIGJlCisgKiBub3RpZmllZCB3aGVuIHRoaXMgaGFwcGVucy4gQ2FsbGJhY2tzIGFyZSByZWdpc3RlcmVkIHVzaW5nCisgKiBwYV9zdHJlYW1fc2V0X292ZXJmbG93X2NhbGxiYWNrKCkgYW5kCisgKiBwYV9zdHJlYW1fc2V0X3VuZGVyZmxvd19jYWxsYmFjaygpLgorICoKKyAqIFxzZWN0aW9uIHN5bmNfc3RyZWFtcyBTeW5jaHJvbml6aW5nIE11bHRpcGxlIFBsYXliYWNrIFN0cmVhbXMKKyAqCisgKiBQdWxzZUF1ZGlvIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gZnVsbHkgc3luY2hyb25pemUgbXVsdGlwbGUKKyAqIHBsYXliYWNrIHN0cmVhbXMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIHRoZSBzYW1lIG91dHB1dCBkZXZpY2UuIFRoYXQKKyAqIG1lYW5zIHRoZSBzdHJlYW1zIHdpbGwgYWx3YXlzIGJlIHBsYXllZCBiYWNrIHNhbXBsZS1ieS1zYW1wbGUKKyAqIHN5bmNocm9ub3VzbHkuIElmIHN0cmVhbSBvcGVyYXRpb25zIGxpa2UgcGFfc3RyZWFtX2NvcmsoKSBhcmUKKyAqIGlzc3VlZCBvbiBvbmUgb2YgdGhlIHN5bmNocm9uaXplZCBzdHJlYW1zLCB0aGV5IGFyZSBzaW11bHRhbmVvdXNseQorICogaXNzdWVkIG9uIHRoZSBvdGhlcnMuCisgKgorICogVG8gc3luY2hyb25pemUgYSBzdHJlYW0gdG8gYW5vdGhlciwganVzdCBwYXNzIHRoZSAibWFzdGVyIiBzdHJlYW0KKyAqIGFzIGxhc3QgYXJndW1lbnQgdG8gcGFfc3RyZWFtX2Nvbm5lY3RfcGxheWJhY2soKS4gVG8gbWFrZSBzdXJlIHRoYXQKKyAqIHRoZSBmcmVzaGx5IGNyZWF0ZWQgc3RyZWFtIGRvZXNuJ3Qgc3RhcnQgcGxheWJhY2sgcmlnaHQtYXdheSwgbWFrZQorICogc3VyZSB0byBwYXNzIFBBX1NUUkVBTV9TVEFSVF9DT1JLRUQgYW5kIC0gYWZ0ZXIgYWxsIHN0cmVhbXMgaGF2ZQorICogYmVlbiBjcmVhdGVkIC0gdW5jb3JrIHRoZW0gYWxsIHdpdGggYSBzaW5nbGUgY2FsbCB0bworICogcGFfc3RyZWFtX2NvcmsoKSBmb3IgdGhlIG1hc3RlciBzdHJlYW0uCisgKgorICogVG8gbWFrZSBzdXJlIHRoYXQgYSBwYXJ0aWN1bGFyIHN0cmVhbSBkb2Vzbid0IHN0b3AgdG8gcGxheSB3aGVuIGEKKyAqIHNlcnZlciBzaWRlIGJ1ZmZlciB1bmRlcnJ1biBoYXBwZW5zIG9uIGl0IHdoaWxlIHRoZSBvdGhlcgorICogc3luY2hyb25pemVkIHN0cmVhbXMgY29udGludWUgcGxheWluZyBhbmQgaGVuY2UgZGV2aWF0ZSB5b3UgbmVlZCB0bworICogcGFzcyBhICJwcmVidWYiIHBhX2J1ZmZlcl9hdHRyIG9mIDAgd2hlbiBjb25uZWN0aW5nIGl0LgorICoKKyAqIFxzZWN0aW9uIGRpc2Nfc2VjIERpc2Nvbm5lY3RpbmcKKyAqCisgKiBXaGVuIGEgc3RyZWFtIGhhcyBzZXJ2ZWQgaXMgcHVycG9zZSBpdCBtdXN0IGJlIGRpc2Nvbm5lY3RlZCB3aXRoCisgKiBwYV9zdHJlYW1fZGlzY29ubmVjdCgpLiBJZiB5b3Ugb25seSB1bnJlZmVyZW5jZSBpdCwgdGhlbiBpdCB3aWxsIGxpdmUgb24KKyAqIGFuZCBlYXQgcmVzb3VyY2VzIGJvdGggbG9jYWxseSBhbmQgb24gdGhlIHNlcnZlciB1bnRpbCB5b3UgZGlzY29ubmVjdCB0aGUKKyAqIGNvbnRleHQuCisgKgorICovCisKKy8qKiBcZmlsZQorICogQXVkaW8gc3RyZWFtcyBmb3IgaW5wdXQsIG91dHB1dCBhbmQgc2FtcGxlIHVwbG9hZAorICoKKyAqIFNlZSBhbHNvIFxzdWJwYWdlIHN0cmVhbXMKKyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIEFuIG9wYXF1ZSBzdHJlYW0gZm9yIHBsYXliYWNrIG9yIHJlY29yZGluZyAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc3RyZWFtIHBhX3N0cmVhbTsKKworLyoqIEEgZ2VuZXJpYyBjYWxsYmFjayBmb3Igb3BlcmF0aW9uIGNvbXBsZXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3N0cmVhbV9zdWNjZXNzX2NiX3QpIChwYV9zdHJlYW0qcywgaW50IHN1Y2Nlc3MsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEEgZ2VuZXJpYyByZXF1ZXN0IGNhbGxiYWNrICovCit0eXBlZGVmIHZvaWQgKCpwYV9zdHJlYW1fcmVxdWVzdF9jYl90KShwYV9zdHJlYW0gKnAsIHNpemVfdCBuYnl0ZXMsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEEgZ2VuZXJpYyBub3RpZmljYXRpb24gY2FsbGJhY2sgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3N0cmVhbV9ub3RpZnlfY2JfdCkocGFfc3RyZWFtICpwLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBBIGNhbGxiYWNrIGZvciBhc3luY2hyb25vdXMgbWV0YS9wb2xpY3kgZXZlbnQgbWVzc2FnZXMuIFdlbGwga25vd24KKyAqIGV2ZW50IG5hbWVzIGFyZSBQQV9TVFJFQU1fRVZFTlRfUkVRVUVTVF9DT1JLIGFuZAorICogUEFfU1RSRUFNX0VWRU5UX1JFUVVFU1RfVU5DT1JLLiBUaGUgc2V0IG9mIGRlZmluZWQgZXZlbnRzIGNhbiBiZQorICogZXh0ZW5kZWQgYXQgYW55IHRpbWUuIEFsc28sIHNlcnZlciBtb2R1bGVzIG1heSBpbnRyb2R1Y2UgYWRkaXRpb25hbAorICogbWVzc2FnZSB0eXBlcyBzbyBtYWtlIHN1cmUgdGhhdCB5b3VyIGNhbGxiYWNrIGZ1bmN0aW9uIGlnbm9yZXMgbWVzc2FnZXMKKyAqIGl0IGRvZXNuJ3Qga25vdy4gXHNpbmNlIDAuOS4xNSAqLwordHlwZWRlZiB2b2lkICgqcGFfc3RyZWFtX2V2ZW50X2NiX3QpKHBhX3N0cmVhbSAqcCwgY29uc3QgY2hhciAqbmFtZSwgcGFfcHJvcGxpc3QgKnBsLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBDcmVhdGUgYSBuZXcsIHVuY29ubmVjdGVkIHN0cmVhbSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQKKyAqIHNhbXBsZSB0eXBlLiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgcGFfc3RyZWFtX25ld193aXRoX3Byb3BsaXN0KCkKKyAqIGluc3RlYWQgYW5kIHNwZWNpZnkgc29tZSBpbml0aWFsIHByb3BlcnRpZXMuICovCitwYV9zdHJlYW0qIHBhX3N0cmVhbV9uZXcoCisgICAgICAgIHBhX2NvbnRleHQgKmMgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBjb250ZXh0IHRvIGNyZWF0ZSB0aGlzIHN0cmVhbSBpbiAqLywKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSAgICAgICAgICAgICAgICAgIC8qKjwgQSBuYW1lIGZvciB0aGlzIHN0cmVhbSAqLywKKyAgICAgICAgY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNzICAgICAgICAgIC8qKjwgVGhlIGRlc2lyZWQgc2FtcGxlIGZvcm1hdCAqLywKKyAgICAgICAgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCAgICAgICAgIC8qKjwgVGhlIGRlc2lyZWQgY2hhbm5lbCBtYXAsIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8pOworCisvKiogQ3JlYXRlIGEgbmV3LCB1bmNvbm5lY3RlZCBzdHJlYW0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kCisgKiBzYW1wbGUgdHlwZSwgYW5kIHNwZWNpZnkgdGhlIHRoZSBpbml0aWFsIHN0cmVhbSBwcm9wZXJ0eQorICogbGlzdC4gXHNpbmNlIDAuOS4xMSAqLworcGFfc3RyZWFtKiBwYV9zdHJlYW1fbmV3X3dpdGhfcHJvcGxpc3QoCisgICAgICAgIHBhX2NvbnRleHQgKmMgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBjb250ZXh0IHRvIGNyZWF0ZSB0aGlzIHN0cmVhbSBpbiAqLywKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSAgICAgICAgICAgICAgICAgIC8qKjwgQSBuYW1lIGZvciB0aGlzIHN0cmVhbSAqLywKKyAgICAgICAgY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNzICAgICAgICAgIC8qKjwgVGhlIGRlc2lyZWQgc2FtcGxlIGZvcm1hdCAqLywKKyAgICAgICAgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCAgICAgICAgIC8qKjwgVGhlIGRlc2lyZWQgY2hhbm5lbCBtYXAsIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8sCisgICAgICAgIHBhX3Byb3BsaXN0ICpwICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBpbml0aWFsIHByb3BlcnR5IGxpc3QgKi8pOworCisvKiogQ3JlYXRlIGEgbmV3LCB1bmNvbm5lY3RlZCBzdHJlYW0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIHRoZSBzZXQgb2YgZm9ybWF0cworICogdGhpcyBjbGllbnQgY2FuIHByb3ZpZGUsIGFuZCBhbiBpbml0aWFsIGxpc3Qgb2YgcHJvcGVydGllcy4gV2hpbGUKKyAqIGNvbm5lY3RpbmcsIHRoZSBzZXJ2ZXIgd2lsbCBzZWxlY3QgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZm9ybWF0IHdoaWNoIHRoZQorICogY2xpZW50IG11c3QgdGhlbiBwcm92aWRlLiBcc2luY2UgMS4wICovCitwYV9zdHJlYW0gKnBhX3N0cmVhbV9uZXdfZXh0ZW5kZWQoCisgICAgICAgIHBhX2NvbnRleHQgKmMgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBjb250ZXh0IHRvIGNyZWF0ZSB0aGlzIHN0cmVhbSBpbiAqLywKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSAgICAgICAgICAgICAgICAgIC8qKjwgQSBuYW1lIGZvciB0aGlzIHN0cmVhbSAqLywKKyAgICAgICAgcGFfZm9ybWF0X2luZm8gKiBjb25zdCAqIGZvcm1hdHMgIC8qKjwgVGhlIGxpc3Qgb2YgZm9ybWF0cyB0aGF0IGNhbiBiZSBwcm92aWRlZCAqLywKKyAgICAgICAgdW5zaWduZWQgaW50IG5fZm9ybWF0cyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBmb3JtYXRzIGJlaW5nIHBhc3NlZCBpbiAqLywKKyAgICAgICAgcGFfcHJvcGxpc3QgKnAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGluaXRpYWwgcHJvcGVydHkgbGlzdCAqLyk7CisKKy8qKiBEZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50ZXIgYnkgb25lICovCit2b2lkIHBhX3N0cmVhbV91bnJlZihwYV9zdHJlYW0gKnMpOworCisvKiogSW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudGVyIGJ5IG9uZSAqLworcGFfc3RyZWFtICpwYV9zdHJlYW1fcmVmKHBhX3N0cmVhbSAqcyk7CisKKy8qKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHN0cmVhbSAqLworcGFfc3RyZWFtX3N0YXRlX3QgcGFfc3RyZWFtX2dldF9zdGF0ZShwYV9zdHJlYW0gKnApOworCisvKiogUmV0dXJuIHRoZSBjb250ZXh0IHRoaXMgc3RyZWFtIGlzIGF0dGFjaGVkIHRvICovCitwYV9jb250ZXh0KiBwYV9zdHJlYW1fZ2V0X2NvbnRleHQocGFfc3RyZWFtICpwKTsKKworLyoqIFJldHVybiB0aGUgc2luayBpbnB1dCByZXNwLiBzb3VyY2Ugb3V0cHV0IGluZGV4IHRoaXMgc3RyZWFtIGlzCisgKiBpZGVudGlmaWVkIGluIHRoZSBzZXJ2ZXIgd2l0aC4gVGhpcyBpcyB1c2VmdWwgZm9yIHVzYWdlIHdpdGggdGhlCisgKiBpbnRyb3NwZWN0aW9uIGZ1bmN0aW9ucywgc3VjaCBhcyBwYV9jb250ZXh0X2dldF9zaW5rX2lucHV0X2luZm8oKQorICogcmVzcC4gcGFfY29udGV4dF9nZXRfc291cmNlX291dHB1dF9pbmZvKCkuICovCit1aW50MzJfdCBwYV9zdHJlYW1fZ2V0X2luZGV4KHBhX3N0cmVhbSAqcyk7CisKKy8qKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzaW5rIG9yIHNvdXJjZSB0aGlzIHN0cmVhbSBpcyBjb25uZWN0ZWQgdG8KKyAqIGluIHRoZSBzZXJ2ZXIuIFRoaXMgaXMgdXNlZnVsIGZvciB1c2FnZSB3aXRoIHRoZSBpbnRyb3NwZWN0aW9uCisgKiBmdW5jdGlvbnMsIHN1Y2ggYXMgcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X2luZGV4KCkKKyAqIHJlc3AuIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9pbmZvX2J5X2luZGV4KCkuIFBsZWFzZSBub3RlIHRoYXQKKyAqIHN0cmVhbXMgbWF5IGJlIG1vdmVkIGJldHdlZW4gc2lua3Mvc291cmNlcyBhbmQgdGh1cyBpdCBpcworICogcmVjb21tZW5kZWQgdG8gdXNlIHBhX3N0cmVhbV9zZXRfbW92ZWRfY2FsbGJhY2soKSB0byBiZSBub3RpZmllZAorICogYWJvdXQgdGhpcy4gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB3aXRoIFBBX0VSUl9OT1RTVVBQT1JURUQgd2hlbiB0aGUKKyAqIHNlcnZlciBpcyBvbGRlciB0aGFuIDAuOS44LiBcc2luY2UgMC45LjggKi8KK3VpbnQzMl90IHBhX3N0cmVhbV9nZXRfZGV2aWNlX2luZGV4KHBhX3N0cmVhbSAqcyk7CisKKy8qKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNpbmsgb3Igc291cmNlIHRoaXMgc3RyZWFtIGlzIGNvbm5lY3RlZCB0bworICogaW4gdGhlIHNlcnZlci4gVGhpcyBpcyB1c2VmdWwgZm9yIHVzYWdlIHdpdGggdGhlIGludHJvc3BlY3Rpb24KKyAqIGZ1bmN0aW9ucywgc3VjaCBhcyBwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fYnlfbmFtZSgpCisgKiByZXNwLiBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19ieV9uYW1lKCkuIFBsZWFzZSBub3RlIHRoYXQKKyAqIHN0cmVhbXMgbWF5IGJlIG1vdmVkIGJldHdlZW4gc2lua3Mvc291cmNlcyBhbmQgdGh1cyBpdCBpcworICogcmVjb21tZW5kZWQgdG8gdXNlIHBhX3N0cmVhbV9zZXRfbW92ZWRfY2FsbGJhY2soKSB0byBiZSBub3RpZmllZAorICogYWJvdXQgdGhpcy4gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB3aXRoIFBBX0VSUl9OT1RTVVBQT1JURUQgd2hlbiB0aGUKKyAqIHNlcnZlciBpcyBvbGRlciB0aGFuIDAuOS44LiBcc2luY2UgMC45LjggKi8KK2NvbnN0IGNoYXIgKnBhX3N0cmVhbV9nZXRfZGV2aWNlX25hbWUocGFfc3RyZWFtICpzKTsKKworLyoqIFJldHVybiAxIGlmIHRoZSBzaW5rIG9yIHNvdXJjZSB0aGlzIHN0cmVhbSBpcyBjb25uZWN0ZWQgdG8gaGFzCisgKiBiZWVuIHN1c3BlbmRlZC4gVGhpcyB3aWxsIHJldHVybiAwIGlmIG5vdCwgYW5kIG5lZ2F0aXZlIG9uCisgKiBlcnJvci4gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB3aXRoIFBBX0VSUl9OT1RTVVBQT1JURUQgd2hlbiB0aGUKKyAqIHNlcnZlciBpcyBvbGRlciB0aGFuIDAuOS44LiBcc2luY2UgMC45LjggKi8KK2ludCBwYV9zdHJlYW1faXNfc3VzcGVuZGVkKHBhX3N0cmVhbSAqcyk7CisKKy8qKiBSZXR1cm4gMSBpZiB0aGUgdGhpcyBzdHJlYW0gaGFzIGJlZW4gY29ya2VkLiBUaGlzIHdpbGwgcmV0dXJuIDAgaWYKKyAqIG5vdCwgYW5kIG5lZ2F0aXZlIG9uIGVycm9yLiBcc2luY2UgMC45LjExICovCitpbnQgcGFfc3RyZWFtX2lzX2NvcmtlZChwYV9zdHJlYW0gKnMpOworCisvKiogQ29ubmVjdCB0aGUgc3RyZWFtIHRvIGEgc2luay4gSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gcGFzcworICogTlVMTCBpbiBib3RoIGRldiBhbmQgdm9sdW1lIGFuZCBub3QgdG8gc2V0IGVpdGhlcgorICogUEFfU1RSRUFNX1NUQVJUX01VVEVEIG5vciBQQV9TVFJFQU1fU1RBUlRfVU5NVVRFRCAtLSB1bmxlc3MgdGhlc2UKKyAqIG9wdGlvbnMgYXJlIGRpcmVjdGx5IGRlcGVuZGVudCBvbiB1c2VyIGlucHV0IG9yIGNvbmZpZ3VyYXRpb24uIElmCisgKiB5b3UgZm9sbG93IHRoaXMgcnVsZSB0aGVuIHRoZSBzb3VuZCBzZXJ2ZXIgd2lsbCBoYXZlIHRoZSBmdWxsCisgKiBmbGV4aWJpbGl0eSB0byBjaG9vc2UgdGhlIGRldmljZSwgdm9sdW1lIGFuZCBtdXRlIHN0YXR1cworICogYXV0b21hdGljYWxseSwgYmFzZWQgb24gc2VydmVyLXNpZGUgcG9saWNpZXMsIGhldXJpc3RpY3MgYW5kIHN0b3JlZAorICogaW5mb3JtYXRpb24gZnJvbSBwcmV2aW91cyB1c2VzLiBBbHNvIHRoZSBzZXJ2ZXIgbWF5IGNob29zZSB0bworICogcmVjb25maWd1cmUgYXVkaW8gZGV2aWNlcyB0byBtYWtlIG90aGVyIHNpbmtzL3NvdXJjZXMgb3IKKyAqIGNhcGFiaWxpdGllcyBhdmFpbGFibGUgdG8gYmUgYWJsZSB0byBhY2NlcHQgdGhlIHN0cmVhbS4gQmVmb3JlCisgKiAwLjkuMjAgaXQgd2FzIG5vdCBkZWZpbmVkIHdoZXRoZXIgdGhlICd2b2x1bWUnIHBhcmFtZXRlciB3YXMKKyAqIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBzaW5rJ3MgY3VycmVudCB2b2x1bWUgb3IgdHJlYXRlZCBhcworICogYWJzb2x1dGUgZGV2aWNlIHZvbHVtZS4gU2luY2UgMC45LjIwIGl0IGlzIGFuIGFic29sdXRlIHZvbHVtZSB3aGVuCisgKiB0aGUgc2luayBpcyBpbiBmbGF0IHZvbHVtZSBtb2RlLCBhbmQgcmVsYXRpdmUgb3RoZXJ3aXNlLCB0aHVzCisgKiBtYWtpbmcgc3VyZSB0aGUgdm9sdW1lIHBhc3NlZCBoZXJlIGhhcyBhbHdheXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzCisgKiB0aGUgdm9sdW1lIHBhc3NlZCB0byBwYV9jb250ZXh0X3NldF9zaW5rX2lucHV0X3ZvbHVtZSgpLiAqLworaW50IHBhX3N0cmVhbV9jb25uZWN0X3BsYXliYWNrKAorICAgICAgICBwYV9zdHJlYW0gKnMgICAgICAgICAgICAgICAgICAvKio8IFRoZSBzdHJlYW0gdG8gY29ubmVjdCB0byBhIHNpbmsgKi8sCisgICAgICAgIGNvbnN0IGNoYXIgKmRldiAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc2luayB0byBjb25uZWN0IHRvLCBvciBOVUxMIGZvciBkZWZhdWx0ICovICwKKyAgICAgICAgY29uc3QgcGFfYnVmZmVyX2F0dHIgKmF0dHIgICAgLyoqPCBCdWZmZXJpbmcgYXR0cmlidXRlcywgb3IgTlVMTCBmb3IgZGVmYXVsdCAqLywKKyAgICAgICAgcGFfc3RyZWFtX2ZsYWdzX3QgZmxhZ3MgICAgICAgLyoqPCBBZGRpdGlvbmFsIGZsYWdzLCBvciAwIGZvciBkZWZhdWx0ICovLAorICAgICAgICBjb25zdCBwYV9jdm9sdW1lICp2b2x1bWUgICAgICAvKio8IEluaXRpYWwgdm9sdW1lLCBvciBOVUxMIGZvciBkZWZhdWx0ICovLAorICAgICAgICBwYV9zdHJlYW0gKnN5bmNfc3RyZWFtICAgICAgICAvKio8IFN5bmNocm9uaXplIHRoaXMgc3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZCBvbmUsIG9yIE5VTEwgZm9yIGEgc3RhbmRhbG9uZSBzdHJlYW0qLyk7CisKKy8qKiBDb25uZWN0IHRoZSBzdHJlYW0gdG8gYSBzb3VyY2UgKi8KK2ludCBwYV9zdHJlYW1fY29ubmVjdF9yZWNvcmQoCisgICAgICAgIHBhX3N0cmVhbSAqcyAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIHN0cmVhbSB0byBjb25uZWN0IHRvIGEgc291cmNlICovICwKKyAgICAgICAgY29uc3QgY2hhciAqZGV2ICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoZSBzb3VyY2UgdG8gY29ubmVjdCB0bywgb3IgTlVMTCBmb3IgZGVmYXVsdCAqLywKKyAgICAgICAgY29uc3QgcGFfYnVmZmVyX2F0dHIgKmF0dHIgICAgLyoqPCBCdWZmZXIgYXR0cmlidXRlcywgb3IgTlVMTCBmb3IgZGVmYXVsdCAqLywKKyAgICAgICAgcGFfc3RyZWFtX2ZsYWdzX3QgZmxhZ3MgICAgICAgLyoqPCBBZGRpdGlvbmFsIGZsYWdzLCBvciAwIGZvciBkZWZhdWx0ICovKTsKKworLyoqIERpc2Nvbm5lY3QgYSBzdHJlYW0gZnJvbSBhIHNvdXJjZS9zaW5rICovCitpbnQgcGFfc3RyZWFtX2Rpc2Nvbm5lY3QocGFfc3RyZWFtICpzKTsKKworLyoqIFByZXBhcmUgd3JpdGluZyBkYXRhIHRvIHRoZSBzZXJ2ZXIgKGZvciBwbGF5YmFjayBzdHJlYW1zKS4gVGhpcworICogZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gb3B0aW1pemUgdGhlIG51bWJlciBvZiBtZW1vcnkgY29waWVzIHdoZW4KKyAqIGRvaW5nIHBsYXliYWNrICgiemVyby1jb3B5IikuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGNhbGwgdGhpcworICogZnVuY3Rpb24gYmVmb3JlIGVhY2ggY2FsbCB0byBwYV9zdHJlYW1fd3JpdGUoKS4gUGFzcyBpbiB0aGUgYWRkcmVzcworICogdG8gYSBwb2ludGVyIGFuZCBhbiBhZGRyZXNzIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgeW91IHdhbnQgdG8KKyAqIHdyaXRlLiBPbiByZXR1cm4gdGhlIHR3byB2YWx1ZXMgd2lsbCBjb250YWluIGEgcG9pbnRlciB3aGVyZSB5b3UKKyAqIGNhbiBwbGFjZSB0aGUgZGF0YSB0byB3cml0ZSBhbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHlvdSBjYW4KKyAqIHdyaXRlLiBPbiByZXR1cm4gKm5ieXRlcyBjYW4gYmUgc21hbGxlciBvciBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzCisgKiB5b3UgcGFzc2VkIGluLiBZb3UgbmVlZCB0byBiZSBhYmxlIHRvIGhhbmRsZSBib3RoIGNhc2VzLiBBY2Nlc3NpbmcKKyAqIG1lbW9yeSBiZXlvbmQgdGhlIHJldHVybmVkICpuYnl0ZXMgdmFsdWUgaXMgaW52YWxpZC4gQWNjZXNzaW5nIHRoZQorICogbWVtb3J5IHJldHVybmVkIGFmdGVyIHRoZSBmb2xsb3dpbmcgcGFfc3RyZWFtX3dyaXRlKCkgb3IKKyAqIHBhX3N0cmVhbV9jYW5jZWxfd3JpdGUoKSBpcyBpbnZhbGlkLiBPbiBpbnZvY2F0aW9uIG9ubHkgKm5ieXRlcworICogbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQsIG9uIHJldHVybiBib3RoICpkYXRhIGFuZCAqbmJ5dGVzIHdpbGwgYmUKKyAqIHZhbGlkLiBJZiB5b3UgcGxhY2UgKHNpemVfdCkgLTEgaW4gKm5ieXRlcyBvbiBpbnZvY2F0aW9uIHRoZSBtZW1vcnkKKyAqIHNpemUgd2lsbCBiZSBjaG9zZW4gYXV0b21hdGljYWxseSAod2hpY2ggaXMgcmVjb21tZW5kZWQgdG8KKyAqIGRvKS4gQWZ0ZXIgcGxhY2luZyB5b3VyIGRhdGEgaW4gdGhlIG1lbW9yeSBhcmVhIHJldHVybmVkIGNhbGwKKyAqIHBhX3N0cmVhbV93cml0ZSgpIHdpdGggZGF0YSBzZXQgdG8gYW4gYWRkcmVzcyB3aXRoaW4gdGhpcyBtZW1vcnkKKyAqIGFyZWEgYW5kIGFuIG5ieXRlcyB2YWx1ZSB0aGF0IGlzIHNtYWxsZXIgb3IgZXF1YWwgdG8gd2hhdCB3YXMKKyAqIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gdG8gYWN0dWFsbHkgZXhlY3V0ZSB0aGUgd3JpdGUuIEFuCisgKiBpbnZvY2F0aW9uIG9mIHBhX3N0cmVhbV93cml0ZSgpIHNob3VsZCBmb2xsb3cgInF1aWNrbHkiIG9uCisgKiBwYV9zdHJlYW1fYmVnaW5fd3JpdGUoKS4gSXQgaXMgbm90IHJlY29tbWVuZGVkIGxldHRpbmcgYW4gdW5ib3VuZGVkCisgKiBhbW91bnQgb2YgdGltZSBwYXNzIGFmdGVyIGNhbGxpbmcgcGFfc3RyZWFtX2JlZ2luX3dyaXRlKCkgYW5kCisgKiBiZWZvcmUgY2FsbGluZyBwYV9zdHJlYW1fd3JpdGUoKS4gSWYgeW91IHdhbnQgdG8gY2FuY2VsIGEKKyAqIHByZXZpb3VzbHkgY2FsbGVkIHBhX3N0cmVhbV9iZWdpbl93cml0ZSgpIHdpdGhvdXQgY2FsbGluZworICogcGFfc3RyZWFtX3dyaXRlKCkgdXNlIHBhX3N0cmVhbV9jYW5jZWxfd3JpdGUoKS4gQ2FsbGluZworICogcGFfc3RyZWFtX2JlZ2luX3dyaXRlKCkgdHdpY2Ugd2l0aG91dCBjYWxsaW5nIHBhX3N0cmVhbV93cml0ZSgpIG9yCisgKiBwYV9zdHJlYW1fY2FuY2VsX3dyaXRlKCkgaW4gYmV0d2VlbiB3aWxsIHJldHVybiBleGFjdGx5IHRoZSBzYW1lCisgKiBwb2ludGVyL25ieXRlcyB2YWx1ZXMuXHNpbmNlIDAuOS4xNiAqLworaW50IHBhX3N0cmVhbV9iZWdpbl93cml0ZSgKKyAgICAgICAgcGFfc3RyZWFtICpwLAorICAgICAgICB2b2lkICoqZGF0YSwKKyAgICAgICAgc2l6ZV90ICpuYnl0ZXMpOworCisvKiogUmV2ZXJzZXMgdGhlIGVmZmVjdCBvZiBwYV9zdHJlYW1fYmVnaW5fd3JpdGUoKSBkcm9wcGluZyBhbGwgZGF0YQorICogdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHBsYWNlZCBpbiB0aGUgbWVtb3J5IGFyZWEgcmV0dXJuZWQgYnkKKyAqIHBhX3N0cmVhbV9iZWdpbl93cml0ZSgpLiBPbmx5IHZhbGlkIHRvIGNhbGwgaWYKKyAqIHBhX3N0cmVhbV9iZWdpbl93cml0ZSgpIHdhcyBjYWxsZWQgYmVmb3JlIGFuZCBuZWl0aGVyCisgKiBwYV9zdHJlYW1fY2FuY2VsX3dyaXRlKCkgbm9yIHBhX3N0cmVhbV93cml0ZSgpIGhhdmUgYmVlbiBjYWxsZWQKKyAqIHlldC4gQWNjZXNzaW5nIHRoZSBtZW1vcnkgcHJldmlvdXNseSByZXR1cm5lZCBieQorICogcGFfc3RyZWFtX2JlZ2luX3dyaXRlKCkgYWZ0ZXIgdGhpcyBjYWxsIGlzIGludmFsaWQuIEFueSBmdXJ0aGVyCisgKiBleHBsaWNpdCBmcmVlaW5nIG9mIHRoZSBtZW1vcnkgYXJlYSBpcyBub3QgbmVjZXNzYXJ5LiBcc2luY2UKKyAqIDAuOS4xNiAqLworaW50IHBhX3N0cmVhbV9jYW5jZWxfd3JpdGUoCisgICAgICAgIHBhX3N0cmVhbSAqcCk7CisKKy8qKiBXcml0ZSBzb21lIGRhdGEgdG8gdGhlIHNlcnZlciAoZm9yIHBsYXliYWNrIHN0cmVhbXMpLCBpZiBmcmVlX2NiCisgKiBpcyBub24tTlVMTCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYWxsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbgorICogb3V0IGFuZCBhbiBpbnRlcm5hbCByZWZlcmVuY2UgdG8gdGhlIHNwZWNpZmllZCBkYXRhIGlzIGtlcHQsIHRoZQorICogZGF0YSBpcyBub3QgY29waWVkLiBJZiBOVUxMLCB0aGUgZGF0YSBpcyBjb3BpZWQgaW50byBhbiBpbnRlcm5hbAorICogYnVmZmVyLiBUaGUgY2xpZW50IG1heSBmcmVlbHkgc2VlayBhcm91bmQgaW4gdGhlIG91dHB1dCBidWZmZXIuIEZvcgorICogbW9zdCBhcHBsaWNhdGlvbnMgcGFzc2luZyAwIGFuZCBQQV9TRUVLX1JFTEFUSVZFIGFzIGFyZ3VtZW50cyBmb3IKKyAqIG9mZnNldCBhbmQgc2VlayBzaG91bGQgYmUgdXNlZnVsLiBBZnRlciB0aGUgd3JpdGUgY2FsbCBzdWNjZWVkZWQKKyAqIHRoZSB3cml0ZSBpbmRleCB3aWxsIGJlIGF0IHRoZSBwb3NpdGlvbiBhZnRlciB3aGVyZSB0aGlzIGNodW5rIG9mCisgKiBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gdG8uCisgKgorICogQXMgYW4gb3B0aW1pemF0aW9uIGZvciBhdm9pZGluZyBuZWVkbGVzcyBtZW1vcnkgY29waWVzIHlvdSBtYXkgY2FsbAorICogcGFfc3RyZWFtX2JlZ2luX3dyaXRlKCkgYmVmb3JlIHRoaXMgY2FsbCBhbmQgdGhlbiBwbGFjZSB5b3VyIGF1ZGlvCisgKiBkYXRhIGRpcmVjdGx5IGluIHRoZSBtZW1vcnkgYXJlYSByZXR1cm5lZCBieSB0aGF0IGNhbGwuIFRoZW4sIHBhc3MKKyAqIGEgcG9pbnRlciB0byB0aGF0IG1lbW9yeSBhcmVhIHRvIHBhX3N0cmVhbV93cml0ZSgpLiBBZnRlciB0aGUKKyAqIGludm9jYXRpb24gb2YgcGFfc3RyZWFtX3dyaXRlKCkgdGhlIG1lbW9yeSBhcmVhIG1heSBubyBsb25nZXIgYmUKKyAqIGFjY2Vzc2VkLiBBbnkgZnVydGhlciBleHBsaWNpdCBmcmVlaW5nIG9mIHRoZSBtZW1vcnkgYXJlYSBpcyBub3QKKyAqIG5lY2Vzc2FyeS4gSXQgaXMgT0sgdG8gd3JpdGUgdGhlIG1lbW9yeSBhcmVhIHJldHVybmVkIGJ5CisgKiBwYV9zdHJlYW1fYmVnaW5fd3JpdGUoKSBvbmx5IHBhcnRpYWxseSB3aXRoIHRoaXMgY2FsbCwgc2tpcHBpbmcKKyAqIGJ5dGVzIGJvdGggYXQgdGhlIGVuZCBhbmQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVzZXJ2ZWQgbWVtb3J5CisgKiBhcmVhLiovCitpbnQgcGFfc3RyZWFtX3dyaXRlKAorICAgICAgICBwYV9zdHJlYW0gKnAgICAgICAgICAgICAgLyoqPCBUaGUgc3RyZWFtIHRvIHVzZSAqLywKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSAgICAgICAgIC8qKjwgVGhlIGRhdGEgdG8gd3JpdGUgKi8sCisgICAgICAgIHNpemVfdCBuYnl0ZXMgICAgICAgICAgICAvKio8IFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gd3JpdGUgaW4gYnl0ZXMqLywKKyAgICAgICAgcGFfZnJlZV9jYl90IGZyZWVfY2IgICAgIC8qKjwgQSBjbGVhbnVwIHJvdXRpbmUgZm9yIHRoZSBkYXRhIG9yIE5VTEwgdG8gcmVxdWVzdCBhbiBpbnRlcm5hbCBjb3B5ICovLAorICAgICAgICBpbnQ2NF90IG9mZnNldCwgICAgICAgICAgLyoqPCBPZmZzZXQgZm9yIHNlZWtpbmcsIG11c3QgYmUgMCBmb3IgdXBsb2FkIHN0cmVhbXMgKi8KKyAgICAgICAgcGFfc2Vla19tb2RlX3Qgc2VlayAgICAgIC8qKjwgU2VlayBtb2RlLCBtdXN0IGJlIFBBX1NFRUtfUkVMQVRJVkUgZm9yIHVwbG9hZCBzdHJlYW1zICovKTsKKworLyoqIFJlYWQgdGhlIG5leHQgZnJhZ21lbnQgZnJvbSB0aGUgYnVmZmVyIChmb3IgcmVjb3JkaW5nIHN0cmVhbXMpLgorICogZGF0YSB3aWxsIHBvaW50IHRvIHRoZSBhY3R1YWwgZGF0YSBhbmQgbmJ5dGVzIHdpbGwgY29udGFpbiB0aGUgc2l6ZQorICogb2YgdGhlIGRhdGEgaW4gYnl0ZXMgKHdoaWNoIGNhbiBiZSBsZXNzIG9yIG1vcmUgdGhhbiBhIGNvbXBsZXRlCisgKiBmcmFnbWVudCkuICBVc2UgcGFfc3RyZWFtX2Ryb3AoKSB0byBhY3R1YWxseSByZW1vdmUgdGhlIGRhdGEgZnJvbQorICogdGhlIGJ1ZmZlci4gSWYgbm8gZGF0YSBpcyBhdmFpbGFibGUgdGhpcyB3aWxsIHJldHVybiBhIE5VTEwKKyAqIHBvaW50ZXIgKi8KK2ludCBwYV9zdHJlYW1fcGVlaygKKyAgICAgICAgcGFfc3RyZWFtICpwICAgICAgICAgICAgICAgICAvKio8IFRoZSBzdHJlYW0gdG8gdXNlICovLAorICAgICAgICBjb25zdCB2b2lkICoqZGF0YSAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byBwb2ludGVyIHRoYXQgd2lsbCBwb2ludCB0byBkYXRhICovLAorICAgICAgICBzaXplX3QgKm5ieXRlcyAgICAgICAgICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSByZWFkIGluIGJ5dGVzICovKTsKKworLyoqIFJlbW92ZSB0aGUgY3VycmVudCBmcmFnbWVudCBvbiByZWNvcmQgc3RyZWFtcy4gSXQgaXMgaW52YWxpZCB0byBkbyB0aGlzIHdpdGhvdXQgZmlyc3QKKyAqIGNhbGxpbmcgcGFfc3RyZWFtX3BlZWsoKS4gKi8KK2ludCBwYV9zdHJlYW1fZHJvcChwYV9zdHJlYW0gKnApOworCisvKiogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYXkgYmUgd3JpdHRlbiB1c2luZyBwYV9zdHJlYW1fd3JpdGUoKSAqLworc2l6ZV90IHBhX3N0cmVhbV93cml0YWJsZV9zaXplKHBhX3N0cmVhbSAqcCk7CisKKy8qKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG1heSBiZSByZWFkIHVzaW5nIHBhX3N0cmVhbV9wZWVrKCkqLworc2l6ZV90IHBhX3N0cmVhbV9yZWFkYWJsZV9zaXplKHBhX3N0cmVhbSAqcCk7CisKKy8qKiBEcmFpbiBhIHBsYXliYWNrIHN0cmVhbS4gIFVzZSB0aGlzIGZvciBub3RpZmljYXRpb24gd2hlbiB0aGUKKyAqIHBsYXliYWNrIGJ1ZmZlciBpcyBlbXB0eSBhZnRlciBwbGF5aW5nIGFsbCB0aGUgYXVkaW8gaW4gdGhlIGJ1ZmZlci4KKyAqIFBsZWFzZSBub3RlIHRoYXQgb25seSBvbmUgZHJhaW4gb3BlcmF0aW9uIHBlciBzdHJlYW0gbWF5IGJlIGlzc3VlZAorICogYXQgYSB0aW1lLiAqLworcGFfb3BlcmF0aW9uKiBwYV9zdHJlYW1fZHJhaW4ocGFfc3RyZWFtICpzLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBSZXF1ZXN0IGEgdGltaW5nIGluZm8gc3RydWN0dXJlIHVwZGF0ZSBmb3IgYSBzdHJlYW0uIFVzZQorICogcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbygpIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHJhdyB0aW1pbmcgZGF0YSwKKyAqIG9yIHBhX3N0cmVhbV9nZXRfdGltZSgpIG9yIHBhX3N0cmVhbV9nZXRfbGF0ZW5jeSgpIHRvIGdldCBjbGVhbmVkCisgKiB1cCB2YWx1ZXMuICovCitwYV9vcGVyYXRpb24qIHBhX3N0cmVhbV91cGRhdGVfdGltaW5nX2luZm8ocGFfc3RyZWFtICpwLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBzdGF0ZSBvZiB0aGUgc3RyZWFtIGNoYW5nZXMgKi8KK3ZvaWQgcGFfc3RyZWFtX3NldF9zdGF0ZV9jYWxsYmFjayhwYV9zdHJlYW0gKnMsIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIG5ldyBkYXRhIG1heSBiZQorICogd3JpdHRlbiB0byB0aGUgc3RyZWFtLiAqLwordm9pZCBwYV9zdHJlYW1fc2V0X3dyaXRlX2NhbGxiYWNrKHBhX3N0cmVhbSAqcCwgcGFfc3RyZWFtX3JlcXVlc3RfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBzdHJlYW0uCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLiovCit2b2lkIHBhX3N0cmVhbV9zZXRfcmVhZF9jYWxsYmFjayhwYV9zdHJlYW0gKnAsIHBhX3N0cmVhbV9yZXF1ZXN0X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBhIGJ1ZmZlciBvdmVyZmxvdyBoYXBwZW5zLiAoT25seSBmb3IgcGxheWJhY2sgc3RyZWFtcykgKi8KK3ZvaWQgcGFfc3RyZWFtX3NldF9vdmVyZmxvd19jYWxsYmFjayhwYV9zdHJlYW0gKnAsIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmV0dXJuIGF0IHdoYXQgcG9zaXRpb24gdGhlIGxhdGVzdCB1bmRlcmZsb3cgb2NjdXJyZWQsIG9yIC0xIGlmIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90CisgKiBrbm93biAoZSBnIGlmIG5vIHVuZGVyZmxvdyBoYXMgb2NjdXJyZWQsIG9yIHNlcnZlciBpcyBvbGRlciB0aGFuIDEuMCkuCisgKiBDYW4gYmUgdXNlZCBpbnNpZGUgdGhlIHVuZGVyZmxvdyBjYWxsYmFjayB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgdW5kZXJmbG93LgorICogKE9ubHkgZm9yIHBsYXliYWNrIHN0cmVhbXMpIFxzaW5jZSAxLjAgKi8KK2ludDY0X3QgcGFfc3RyZWFtX2dldF91bmRlcmZsb3dfaW5kZXgocGFfc3RyZWFtICpwKTsKKworLyoqIFNldCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBhIGJ1ZmZlciB1bmRlcmZsb3cgaGFwcGVucy4gKE9ubHkgZm9yIHBsYXliYWNrIHN0cmVhbXMpICovCit2b2lkIHBhX3N0cmVhbV9zZXRfdW5kZXJmbG93X2NhbGxiYWNrKHBhX3N0cmVhbSAqcCwgcGFfc3RyZWFtX25vdGlmeV9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSB0aGUgc2VydmVyIHN0YXJ0cworICogcGxheWJhY2sgYWZ0ZXIgYW4gdW5kZXJydW4gb3Igb24gaW5pdGlhbCBzdGFydHVwLiBUaGlzIG9ubHkgaW5mb3JtcworICogdGhhdCBhdWRpbyBpcyBmbG93aW5nIGFnYWluLCBpdCBpcyBubyBpbmRpY2F0aW9uIHRoYXQgYXVkaW8gc3RhcnRlZAorICogdG8gcmVhY2ggdGhlIHNwZWFrZXJzIGFscmVhZHkuIChPbmx5IGZvciBwbGF5YmFjayBzdHJlYW1zKS4gXHNpbmNlCisgKiAwLjkuMTEgKi8KK3ZvaWQgcGFfc3RyZWFtX3NldF9zdGFydGVkX2NhbGxiYWNrKHBhX3N0cmVhbSAqcCwgcGFfc3RyZWFtX25vdGlmeV9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyIGEgbGF0ZW5jeQorICogaW5mb3JtYXRpb24gdXBkYXRlIGhhcHBlbnMuIFVzZWZ1bCBvbiBQQV9TVFJFQU1fQVVUT19USU1JTkdfVVBEQVRFCisgKiBzdHJlYW1zIG9ubHkuIChPbmx5IGZvciBwbGF5YmFjayBzdHJlYW1zKSAqLwordm9pZCBwYV9zdHJlYW1fc2V0X2xhdGVuY3lfdXBkYXRlX2NhbGxiYWNrKHBhX3N0cmVhbSAqcCwgcGFfc3RyZWFtX25vdGlmeV9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBzdHJlYW0gaXMKKyAqIG1vdmVkIHRvIGEgZGlmZmVyZW50IHNpbmsvc291cmNlLiBVc2UgcGFfc3RyZWFtX2dldF9kZXZpY2VfbmFtZSgpb3IKKyAqIHBhX3N0cmVhbV9nZXRfZGV2aWNlX2luZGV4KCkgdG8gcXVlcnkgdGhlIG5ldyBzaW5rL3NvdXJjZS4gVGhpcworICogbm90aWZpY2F0aW9uIGlzIG9ubHkgZ2VuZXJhdGVkIHdoZW4gdGhlIHNlcnZlciBpcyBhdCBsZWFzdAorICogMC45LjguIFxzaW5jZSAwLjkuOCAqLwordm9pZCBwYV9zdHJlYW1fc2V0X21vdmVkX2NhbGxiYWNrKHBhX3N0cmVhbSAqcCwgcGFfc3RyZWFtX25vdGlmeV9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBzaW5rL3NvdXJjZQorICogdGhpcyBzdHJlYW0gaXMgY29ubmVjdGVkIHRvIGlzIHN1c3BlbmRlZCBvciByZXN1bWVkLiBVc2UKKyAqIHBhX3N0cmVhbV9pc19zdXNwZW5kZWQoKSB0byBxdWVyeSB0aGUgbmV3IHN1c3BlbmQgc3RhdHVzLiBQbGVhc2UKKyAqIG5vdGUgdGhhdCB0aGUgc3VzcGVuZCBzdGF0dXMgbWlnaHQgYWxzbyBjaGFuZ2Ugd2hlbiB0aGUgc3RyZWFtIGlzCisgKiBtb3ZlZCBiZXR3ZWVuIGRldmljZXMuIFRodXMgaWYgeW91IGNhbGwgdGhpcyBmdW5jdGlvbiB5b3UgdmVyeQorICogbGlrZWx5IHdhbnQgdG8gY2FsbCBwYV9zdHJlYW1fc2V0X21vdmVkX2NhbGxiYWNrLCB0b28uIFRoaXMKKyAqIG5vdGlmaWNhdGlvbiBpcyBvbmx5IGdlbmVyYXRlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgYXQgbGVhc3QKKyAqIDAuOS44LiBcc2luY2UgMC45LjggKi8KK3ZvaWQgcGFfc3RyZWFtX3NldF9zdXNwZW5kZWRfY2FsbGJhY2socGFfc3RyZWFtICpwLCBwYV9zdHJlYW1fbm90aWZ5X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBtZXRhL3BvbGljeQorICogY29udHJvbCBldmVudCBpcyByZWNlaXZlZC5cc2luY2UgMC45LjE1ICovCit2b2lkIHBhX3N0cmVhbV9zZXRfZXZlbnRfY2FsbGJhY2socGFfc3RyZWFtICpwLCBwYV9zdHJlYW1fZXZlbnRfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgYnVmZmVyCisgKiBhdHRyaWJ1dGVzIG9uIHRoZSBzZXJ2ZXIgc2lkZSBjaGFuZ2UuIFBsZWFzZSBub3RlIHRoYXQgdGhlIGJ1ZmZlcgorICogYXR0cmlidXRlcyBjYW4gY2hhbmdlIHdoZW4gbW92aW5nIGEgc3RyZWFtIHRvIGEgZGlmZmVyZW50CisgKiBzaW5rL3NvdXJjZSB0b28sIGhlbmNlIGlmIHlvdSB1c2UgdGhpcyBjYWxsYmFjayB5b3Ugc2hvdWxkIHVzZQorICogcGFfc3RyZWFtX3NldF9tb3ZlZF9jYWxsYmFjaygpIGFzIHdlbGwuIFxzaW5jZSAwLjkuMTUgKi8KK3ZvaWQgcGFfc3RyZWFtX3NldF9idWZmZXJfYXR0cl9jYWxsYmFjayhwYV9zdHJlYW0gKnAsIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUGF1c2UgKG9yIHJlc3VtZSkgcGxheWJhY2sgb2YgdGhpcyBzdHJlYW0gdGVtcG9yYXJpbHkuIEF2YWlsYWJsZQorICogb24gYm90aCBwbGF5YmFjayBhbmQgcmVjb3JkaW5nIHN0cmVhbXMuIElmIGIgaXMgMSB0aGUgc3RyZWFtIGlzCisgKiBwYXVzZWQuIElmIGIgaXMgMCB0aGUgc3RyZWFtIGlzIHJlc3VtZWQuIFRoZSBwYXVzZS9yZXN1bWUgb3BlcmF0aW9uCisgKiBpcyBleGVjdXRlZCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLiBJZiBhIGNvcmsgaXMgdmVyeSBxdWlja2x5CisgKiBmb2xsb3dlZCBieSBhbiB1bmNvcmsgb3IgdGhlIG90aGVyIHdheSByb3VuZCB0aGlzIG1pZ2h0IG5vdAorICogYWN0dWFsbHkgaGF2ZSBhbnkgZWZmZWN0IG9uIHRoZSBzdHJlYW0gdGhhdCBpcyBvdXRwdXQuIFlvdSBjYW4gdXNlCisgKiBwYV9zdHJlYW1faXNfY29ya2VkKCkgdG8gZmluZCBvdXQgd2hldGhlciB0aGUgc3RyZWFtIGlzIGN1cnJlbnRseQorICogcGF1c2VkIG9yIG5vdC4gTm9ybWFsbHkgYSBzdHJlYW0gd2lsbCBiZSBjcmVhdGVkIGluIHVuY29ya2VkCisgKiBzdGF0ZS4gSWYgeW91IHBhc3MgUEFfU1RSRUFNX1NUQVJUX0NPUktFRCBhcyBmbGFnIGR1cmluZyBjb25uZWN0aW9uCisgKiBvZiB0aGUgc3RyZWFtIGl0IHdpbGwgYmUgY3JlYXRlZCBpbiBjb3JrZWQgc3RhdGUuICovCitwYV9vcGVyYXRpb24qIHBhX3N0cmVhbV9jb3JrKHBhX3N0cmVhbSAqcywgaW50IGIsIHBhX3N0cmVhbV9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEZsdXNoIHRoZSBwbGF5YmFjayBidWZmZXIgb2YgdGhpcyBzdHJlYW0uIFRoaXMgZGlzY2FyZHMgYW55IGF1ZGlvCisgKiBpbiB0aGUgYnVmZmVyLiAgTW9zdCBvZiB0aGUgdGltZSB5b3UncmUgYmV0dGVyIG9mZiB1c2luZyB0aGUgcGFyYW1ldGVyCisgKiBkZWx0YSBvZiBwYV9zdHJlYW1fd3JpdGUoKSBpbnN0ZWFkIG9mIHRoaXMgZnVuY3Rpb24uIEF2YWlsYWJsZSBvbiBib3RoCisgKiBwbGF5YmFjayBhbmQgcmVjb3JkaW5nIHN0cmVhbXMuICovCitwYV9vcGVyYXRpb24qIHBhX3N0cmVhbV9mbHVzaChwYV9zdHJlYW0gKnMsIHBhX3N0cmVhbV9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFJlZW5hYmxlIHByZWJ1ZmZlcmluZyBhcyBzcGVjaWZpZWQgaW4gdGhlIHBhX2J1ZmZlcl9hdHRyCisgKiBzdHJ1Y3R1cmUuIEF2YWlsYWJsZSBmb3IgcGxheWJhY2sgc3RyZWFtcyBvbmx5LiAqLworcGFfb3BlcmF0aW9uKiBwYV9zdHJlYW1fcHJlYnVmKHBhX3N0cmVhbSAqcywgcGFfc3RyZWFtX3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmVxdWVzdCBpbW1lZGlhdGUgc3RhcnQgb2YgcGxheWJhY2sgb24gdGhpcyBzdHJlYW0uIFRoaXMgZGlzYWJsZXMKKyAqIHByZWJ1ZmZlcmluZyBhcyBzcGVjaWZpZWQgaW4gdGhlIHBhX2J1ZmZlcl9hdHRyIHN0cnVjdHVyZSwKKyAqIHRlbXBvcmFyaWx5LiBBdmFpbGFibGUgZm9yIHBsYXliYWNrIHN0cmVhbXMgb25seS4gKi8KK3BhX29wZXJhdGlvbiogcGFfc3RyZWFtX3RyaWdnZXIocGFfc3RyZWFtICpzLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBSZW5hbWUgdGhlIHN0cmVhbS4gKi8KK3BhX29wZXJhdGlvbiogcGFfc3RyZWFtX3NldF9uYW1lKHBhX3N0cmVhbSAqcywgY29uc3QgY2hhciAqbmFtZSwgcGFfc3RyZWFtX3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmV0dXJuIHRoZSBjdXJyZW50IHBsYXliYWNrL3JlY29yZGluZyB0aW1lLiBUaGlzIGlzIGJhc2VkIG9uIHRoZQorICogZGF0YSBpbiB0aGUgdGltaW5nIGluZm8gc3RydWN0dXJlIHJldHVybmVkIGJ5CisgKiBwYV9zdHJlYW1fZ2V0X3RpbWluZ19pbmZvKCkuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHVzdWFsbHkgb25seSByZXR1cm4gbmV3IGRhdGEgaWYgYSB0aW1pbmcgaW5mbworICogdXBkYXRlIGhhcyBiZWVuIHJlY2VpdmVkLiBPbmx5IGlmIHRpbWluZyBpbnRlcnBvbGF0aW9uIGhhcyBiZWVuCisgKiByZXF1ZXN0ZWQgKFBBX1NUUkVBTV9JTlRFUlBPTEFURV9USU1JTkcpIHRoZSBkYXRhIGZyb20gdGhlIGxhc3QKKyAqIHRpbWluZyB1cGRhdGUgaXMgdXNlZCBmb3IgYW4gZXN0aW1hdGlvbiBvZiB0aGUgY3VycmVudAorICogcGxheWJhY2svcmVjb3JkaW5nIHRpbWUgYmFzZWQgb24gdGhlIGxvY2FsIHRpbWUgdGhhdCBwYXNzZWQgc2luY2UKKyAqIHRoZSB0aW1pbmcgaW5mbyBzdHJ1Y3R1cmUgaGFzIGJlZW4gYWNxdWlyZWQuCisgKgorICogVGhlIHRpbWUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIGluY3JlYXNlCisgKiBtb25vdG9uaWNhbGx5LiAgKHRoYXQgbWVhbnM6IHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbHdheXMgZ3JlYXRlcgorICogb3IgZXF1YWwgdG8gdGhlIHZhbHVlIHJldHVybmVkIG9uIHRoZSBsYXN0IGNhbGwpLiBUaGlzIGJlaGF2aW91cgorICogY2FuIGJlIGRpc2FibGVkIGJ5IHVzaW5nIFBBX1NUUkVBTV9OT1RfTU9OT1RPTklDLiBUaGlzIG1heSBiZQorICogZGVzaXJhYmxlIHRvIGRlYWwgYmV0dGVyIHdpdGggYmFkIGVzdGltYXRpb25zIG9mIHRyYW5zcG9ydAorICogbGF0ZW5jaWVzLCBidXQgbWF5IGhhdmUgc3RyYW5nZSBlZmZlY3RzIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBub3QKKyAqIGFibGUgdG8gZGVhbCB3aXRoIHRpbWUgZ29pbmcgJ2JhY2t3YXJkcycuCisgKgorICogVGhlIHRpbWUgaW50ZXJwb2xhdG9yIGFjdGl2YXRlZCBieSBQQV9TVFJFQU1fSU5URVJQT0xBVEVfVElNSU5HCisgKiBmYXZvdXJzICdzbW9vdGgnIHRpbWUgZ3JhcGhzIG92ZXIgYWNjdXJhdGUgb25lcyB0byBpbXByb3ZlIHRoZQorICogc21vb3RobmVzcyBvZiBVSSBvcGVyYXRpb25zIHRoYXQgYXJlIHRpZWQgdG8gdGhlIGF1ZGlvIGNsb2NrLiBJZgorICogYWNjdXJhY3kgaXMgbW9yZSBpbXBvcnRhbnQgdG8geW91IHlvdSBtaWdodCBuZWVkIHRvIGVzdGltYXRlIHlvdXIKKyAqIHRpbWluZyBiYXNlZCBvbiB0aGUgZGF0YSBmcm9tIHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8oKSB5b3Vyc2VsZgorICogb3Igbm90IHdvcmsgd2l0aCBpbnRlcnBvbGF0ZWQgdGltaW5nIGF0IGFsbCBhbmQgaW5zdGVhZCBhbHdheXMKKyAqIHF1ZXJ5IG9uIHRoZSBzZXJ2ZXIgc2lkZSBmb3IgdGhlIG1vc3QgdXAgdG8gZGF0ZSB0aW1pbmcgd2l0aAorICogcGFfc3RyZWFtX3VwZGF0ZV90aW1pbmdfaW5mbygpLgorICoKKyAqIElmIG5vIHRpbWluZyBpbmZvcm1hdGlvbiBoYXMgYmVlbgorICogcmVjZWl2ZWQgeWV0IHRoaXMgY2FsbCB3aWxsIHJldHVybiBQQV9FUlJfTk9EQVRBLiBGb3IgbW9yZSBkZXRhaWxzCisgKiBzZWUgcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbygpLiAqLworaW50IHBhX3N0cmVhbV9nZXRfdGltZShwYV9zdHJlYW0gKnMsIHBhX3VzZWNfdCAqcl91c2VjKTsKKworLyoqIFJldHVybiB0aGUgdG90YWwgc3RyZWFtIGxhdGVuY3kuIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24KKyAqIHBhX3N0cmVhbV9nZXRfdGltZSgpLgorICoKKyAqIEluIGNhc2UgdGhlIHN0cmVhbSBpcyBhIG1vbml0b3Jpbmcgc3RyZWFtIHRoZSByZXN1bHQgY2FuIGJlCisgKiBuZWdhdGl2ZSwgaS5lLiB0aGUgY2FwdHVyZWQgc2FtcGxlcyBhcmUgbm90IHlldCBwbGF5ZWQuIEluIHRoaXMKKyAqIGNhc2UgKm5lZ2F0aXZlIGlzIHNldCB0byAxLgorICoKKyAqIElmIG5vIHRpbWluZyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZWNlaXZlZCB5ZXQgdGhpcyBjYWxsIHdpbGwKKyAqIHJldHVybiBQQV9FUlJfTk9EQVRBLiBGb3IgbW9yZSBkZXRhaWxzIHNlZQorICogcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbygpIGFuZCBwYV9zdHJlYW1fZ2V0X3RpbWUoKS4gKi8KK2ludCBwYV9zdHJlYW1fZ2V0X2xhdGVuY3kocGFfc3RyZWFtICpzLCBwYV91c2VjX3QgKnJfdXNlYywgaW50ICpuZWdhdGl2ZSk7CisKKy8qKiBSZXR1cm4gdGhlIGxhdGVzdCByYXcgdGltaW5nIGRhdGEgc3RydWN0dXJlLiBUaGUgcmV0dXJuZWQgcG9pbnRlcgorICogcG9pbnRzIHRvIGFuIGludGVybmFsIHJlYWQtb25seSBpbnN0YW5jZSBvZiB0aGUgdGltaW5nCisgKiBzdHJ1Y3R1cmUuIFRoZSB1c2VyIHNob3VsZCBtYWtlIGEgY29weSBvZiB0aGlzIHN0cnVjdHVyZSBpZiBoZQorICogd2FudHMgdG8gbW9kaWZ5IGl0LiBBbiBpbi1wbGFjZSB1cGRhdGUgdG8gdGhpcyBkYXRhIHN0cnVjdHVyZSBtYXkKKyAqIGJlIHJlcXVlc3RlZCB1c2luZyBwYV9zdHJlYW1fdXBkYXRlX3RpbWluZ19pbmZvKCkuCisgKgorICogSWYgbm8gdGltaW5nIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJlZm9yZSAoaS5lLiBieQorICogcmVxdWVzdGluZyBwYV9zdHJlYW1fdXBkYXRlX3RpbWluZ19pbmZvKCkgb3IgYnkgdXNpbmcKKyAqIFBBX1NUUkVBTV9BVVRPX1RJTUlOR19VUERBVEUpLCB0aGlzIGZ1bmN0aW9uIHdpbGwgZmFpbCB3aXRoCisgKiBQQV9FUlJfTk9EQVRBLgorICoKKyAqIFBsZWFzZSBub3RlIHRoYXQgdGhlIHdyaXRlX2luZGV4IG1lbWJlciBmaWVsZCAoYW5kIG9ubHkgdGhpcyBmaWVsZCkKKyAqIGlzIHVwZGF0ZWQgb24gZWFjaCBwYV9zdHJlYW1fd3JpdGUoKSBjYWxsLCBub3QganVzdCB3aGVuIGEgdGltaW5nCisgKiB1cGRhdGUgaGFzIGJlZW4gcmVjZWl2ZWQuICovCitjb25zdCBwYV90aW1pbmdfaW5mbyogcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbyhwYV9zdHJlYW0gKnMpOworCisvKiogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RyZWFtJ3Mgc2FtcGxlIHNwZWNpZmljYXRpb24uICovCitjb25zdCBwYV9zYW1wbGVfc3BlYyogcGFfc3RyZWFtX2dldF9zYW1wbGVfc3BlYyhwYV9zdHJlYW0gKnMpOworCisvKiogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RyZWFtJ3MgY2hhbm5lbCBtYXAuICovCitjb25zdCBwYV9jaGFubmVsX21hcCogcGFfc3RyZWFtX2dldF9jaGFubmVsX21hcChwYV9zdHJlYW0gKnMpOworCisvKiogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RyZWFtJ3MgZm9ybWF0IFxzaW5jZSAxLjAgKi8KK2NvbnN0IHBhX2Zvcm1hdF9pbmZvKiBwYV9zdHJlYW1fZ2V0X2Zvcm1hdF9pbmZvKHBhX3N0cmVhbSAqcyk7CisKKy8qKiBSZXR1cm4gdGhlIHBlci1zdHJlYW0gc2VydmVyLXNpZGUgYnVmZmVyIG1ldHJpY3Mgb2YgdGhlCisgKiBzdHJlYW0uIE9ubHkgdmFsaWQgYWZ0ZXIgdGhlIHN0cmVhbSBoYXMgYmVlbiBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5CisgKiBhbmQgaWYgdGhlIHNlcnZlciBpcyBhdCBsZWFzdCBQdWxzZUF1ZGlvIDAuOS4gVGhpcyB3aWxsIHJldHVybiB0aGUKKyAqIGFjdHVhbCBjb25maWd1cmVkIGJ1ZmZlcmluZyBtZXRyaWNzLCB3aGljaCBtYXkgZGlmZmVyIGZyb20gd2hhdCB3YXMKKyAqIHJlcXVlc3RlZCBkdXJpbmcgcGFfc3RyZWFtX2Nvbm5lY3RfcmVjb3JkKCkgb3IKKyAqIHBhX3N0cmVhbV9jb25uZWN0X3BsYXliYWNrKCkuIFRoaXMgY2FsbCB3aWxsIGFsd2F5cyByZXR1cm4gdGhlCisgKiBhY3R1YWxseSBwZXItc3RyZWFtIHNlcnZlci1zaWRlIGJ1ZmZlciBtZXRyaWNzLCByZWdhcmRsZXNzIHdoZXRoZXIKKyAqIFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWSBpcyBzZXQgb3Igbm90LiBcc2luY2UgMC45LjAgKi8KK2NvbnN0IHBhX2J1ZmZlcl9hdHRyKiBwYV9zdHJlYW1fZ2V0X2J1ZmZlcl9hdHRyKHBhX3N0cmVhbSAqcyk7CisKKy8qKiBDaGFuZ2UgdGhlIGJ1ZmZlciBtZXRyaWNzIG9mIHRoZSBzdHJlYW0gZHVyaW5nIHBsYXliYWNrLiBUaGUKKyAqIHNlcnZlciBtaWdodCBoYXZlIGNob3NlbiBkaWZmZXJlbnQgYnVmZmVyIG1ldHJpY3MgdGhlbgorICogcmVxdWVzdGVkLiBUaGUgc2VsZWN0ZWQgbWV0cmljcyBtYXkgYmUgcXVlcmllZCB3aXRoCisgKiBwYV9zdHJlYW1fZ2V0X2J1ZmZlcl9hdHRyKCkgYXMgc29vbiBhcyB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkLiBPbmx5CisgKiB2YWxpZCBhZnRlciB0aGUgc3RyZWFtIGhhcyBiZWVuIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHkgYW5kIGlmIHRoZQorICogc2VydmVyIGlzIGF0IGxlYXN0IFB1bHNlQXVkaW8gMC45LjguIFBsZWFzZSBiZSBhd2FyZSBvZiB0aGUKKyAqIHNsaWdodGx5IGRpZmZlcmVudCBzZW1hbnRpY3Mgb2YgdGhlIGNhbGwgZGVwZW5kaW5nIHdoZXRoZXIKKyAqIFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWSBpcyBzZXQgb3Igbm90LiBcc2luY2UgMC45LjggKi8KK3BhX29wZXJhdGlvbiAqcGFfc3RyZWFtX3NldF9idWZmZXJfYXR0cihwYV9zdHJlYW0gKnMsIGNvbnN0IHBhX2J1ZmZlcl9hdHRyICphdHRyLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBDaGFuZ2UgdGhlIHN0cmVhbSBzYW1wbGluZyByYXRlIGR1cmluZyBwbGF5YmFjay4gWW91IG5lZWQgdG8gcGFzcworICogUEFfU1RSRUFNX1ZBUklBQkxFX1JBVEUgaW4gdGhlIGZsYWdzIHBhcmFtZXRlciBvZgorICogcGFfc3RyZWFtX2Nvbm5lY3RfLi4uKCkgaWYgeW91IHBsYW4gdG8gdXNlIHRoaXMgZnVuY3Rpb24uIE9ubHkgdmFsaWQKKyAqIGFmdGVyIHRoZSBzdHJlYW0gaGFzIGJlZW4gY29ubmVjdGVkIHN1Y2Nlc3NmdWxseSBhbmQgaWYgdGhlIHNlcnZlcgorICogaXMgYXQgbGVhc3QgUHVsc2VBdWRpbyAwLjkuOC4gXHNpbmNlIDAuOS44ICovCitwYV9vcGVyYXRpb24gKnBhX3N0cmVhbV91cGRhdGVfc2FtcGxlX3JhdGUocGFfc3RyZWFtICpzLCB1aW50MzJfdCByYXRlLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBVcGRhdGUgdGhlIHByb3BlcnR5IGxpc3Qgb2YgdGhlIHNpbmsgaW5wdXQvc291cmNlIG91dHB1dCBvZiB0aGlzCisgKiBzdHJlYW0sIGFkZGluZyBuZXcgZW50cmllcy4gUGxlYXNlIG5vdGUgdGhhdCBpdCBpcyBoaWdobHkKKyAqIHJlY29tbWVuZGVkIHRvIHNldCBhcyBtdWNoIHByb3BlcnRpZXMgaW5pdGlhbGx5IHZpYQorICogcGFfc3RyZWFtX25ld193aXRoX3Byb3BsaXN0KCkgYXMgcG9zc2libGUgaW5zdGVhZCBhIHBvc3Rlcmlvcmkgd2l0aAorICogdGhpcyBmdW5jdGlvbiwgc2luY2UgdGhhdCBpbmZvcm1hdGlvbiBtYXkgdGhlbiBiZSB1c2VkIHRvIHJvdXRlCisgKiB0aGlzIHN0cmVhbSB0byB0aGUgcmlnaHQgZGV2aWNlLiBcc2luY2UgMC45LjExICovCitwYV9vcGVyYXRpb24gKnBhX3N0cmVhbV9wcm9wbGlzdF91cGRhdGUocGFfc3RyZWFtICpzLCBwYV91cGRhdGVfbW9kZV90IG1vZGUsIHBhX3Byb3BsaXN0ICpwLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBVcGRhdGUgdGhlIHByb3BlcnR5IGxpc3Qgb2YgdGhlIHNpbmsgaW5wdXQvc291cmNlIG91dHB1dCBvZiB0aGlzCisgKiBzdHJlYW0sIHJlbW92ZSBlbnRyaWVzLiBcc2luY2UgMC45LjExICovCitwYV9vcGVyYXRpb24gKnBhX3N0cmVhbV9wcm9wbGlzdF9yZW1vdmUocGFfc3RyZWFtICpzLCBjb25zdCBjaGFyICpjb25zdCBrZXlzW10sIHBhX3N0cmVhbV9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEZvciByZWNvcmQgc3RyZWFtcyBjb25uZWN0ZWQgdG8gYSBtb25pdG9yIHNvdXJjZTogbW9uaXRvciBvbmx5IGEKKyAqIHZlcnkgc3BlY2lmaWMgc2luayBpbnB1dCBvZiB0aGUgc2luay4gVGh1cyBmdW5jdGlvbiBuZWVkcyB0byBiZQorICogY2FsbGVkIGJlZm9yZSBwYV9zdHJlYW1fY29ubmVjdF9yZWNvcmQoKSBpcyBjYWxsZWQuIFxzaW5jZQorICogMC45LjExICovCitpbnQgcGFfc3RyZWFtX3NldF9tb25pdG9yX3N0cmVhbShwYV9zdHJlYW0gKnMsIHVpbnQzMl90IHNpbmtfaW5wdXRfaWR4KTsKKworLyoqIFJldHVybiB0aGUgc2luayBpbnB1dCBpbmRleCBwcmV2aW91c2x5IHNldCB3aXRoCisgKiBwYV9zdHJlYW1fc2V0X21vbml0b3Jfc3RyZWFtKCkuCisgKiBcc2luY2UgMC45LjExICovCit1aW50MzJfdCBwYV9zdHJlYW1fZ2V0X21vbml0b3Jfc3RyZWFtKHBhX3N0cmVhbSAqcyk7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3N1YnNjcmliZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zdWJzY3JpYmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjdhODg3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zdWJzY3JpYmUuaApAQCAtMCwwICsxLDg2IEBACisjaWZuZGVmIGZvb3N1YnNjcmliZWhmb28KKyNkZWZpbmUgZm9vc3Vic2NyaWJlaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9kZWYuaD4KKyNpbmNsdWRlIDxwdWxzZS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBccGFnZSBzdWJzY3JpYmUgRXZlbnQgU3Vic2NyaXB0aW9uCisgKgorICogXHNlY3Rpb24gb3ZlcnZfc2VjIE92ZXJ2aWV3CisgKgorICogVGhlIGFwcGxpY2F0aW9uIGNhbiBiZSBub3RpZmllZCwgYXN5bmNocm9ub3VzbHksIHdoZW5ldmVyIHRoZSBpbnRlcm5hbAorICogbGF5b3V0IG9mIHRoZSBzZXJ2ZXIgY2hhbmdlcy4gUG9zc2libGUgbm90aWZpY2F0aW9ucyBhcmUgZGVzY3JpYmVkIGluIHRoZQorICogXHJlZiBwYV9zdWJzY3JpcHRpb25fZXZlbnRfdHlwZSBhbmQgXHJlZiBwYV9zdWJzY3JpcHRpb25fbWFzaworICogZW51bWVyYXRpb25zLgorICoKKyAqIFRoZSBhcHBsaWNhdGlvbiBzZXRzIHRoZSBub3RpZmljYXRpb24gbWFzayB1c2luZyBwYV9jb250ZXh0X3N1YnNjcmliZSgpCisgKiBhbmQgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBub3RpZmljYXRpb24gb2NjdXJzIHVzaW5nCisgKiBwYV9jb250ZXh0X3NldF9zdWJzY3JpYmVfY2FsbGJhY2soKS4KKyAqCisgKiBUaGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIFxyZWYgcGFfc3Vic2NyaXB0aW9uX2V2ZW50X3R5cGVfdAorICogcmVwcmVzZW50aW5nIHRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGUgY2FsbGJhY2suIENsaWVudHMgY2FuIGV4YW1pbmUgd2hhdAorICogb2JqZWN0IGNoYW5nZWQgdXNpbmcgXHJlZiBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfRkFDSUxJVFlfTUFTSy4gVGhlIGFjdHVhbAorICogZXZlbnQgdHlwZSBjYW4gdGhlbiBiZSBleHRyYWN0ZWQgd2l0aCBccmVmIFBBX1NVQlNDUklQVElPTl9FVkVOVF9UWVBFX01BU0suCisgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBtYXNrZWQgdmFsdWVzIGFyZSBpbnRlZ2Vycywgbm90IGZsYWdzIChzbyB5b3Ugd2lsbAorICogY2hlY2sgdGhlIG9iamVjdC9ldmVudCB0eXBlIHVzaW5nIGEgY29tcGFyaXNvbiBub3QgYSBiaW5hcnkgQU5EKS4gRm9yCisgKiBleGFtcGxlLCB0aGUgY2FsbGJhY2sgbWlnaHQgbG9vayBzb21ldGhpbmcgbGlrZToKKyAqCitAdmVyYmF0aW0KK3ZvaWQgbXlfc3Vic2NyaXB0aW9uX2NhbGxiYWNrKHBhX2NvbnRleHQgKmMsIHBhX3N1YnNjcmlwdGlvbl9ldmVudF90eXBlX3QgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGlkeCwgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgaWYgKCh0ICYgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0ZBQ0lMSVRZX01BU0spID09IFBBX1NVQlNDUklQVElPTl9FVkVOVF9TT1VSQ0UpIHsKKyAgICAgICAgaWYgKCh0ICYgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1RZUEVfTUFTSykgPT0gUEFfU1VCU0NSSVBUSU9OX0VWRU5UX05FVykgeworICAgICAgICAgICAgLi4uIGEgc291cmNlIHdhcyBhZGRlZCwgbGV0J3MgZG8gc3R1ZmYhIC4uLgorICAgICAgICB9CisgICAgfQorfQorQGVuZHZlcmJhdGltCisgKi8KKworLyoqIFxmaWxlCisgKiBEYWVtb24gaW50cm9zcGVjdGlvbiBldmVudCBzdWJzY3JpcHRpb24gc3Vic3lzdGVtLgorICoKKyAqIFNlZSBhbHNvIFxzdWJwYWdlIHN1YnNjcmliZQorICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogU3Vic2NyaXB0aW9uIGV2ZW50IGNhbGxiYWNrIHByb3RvdHlwZSAqLwordHlwZWRlZiB2b2lkICgqcGFfY29udGV4dF9zdWJzY3JpYmVfY2JfdCkocGFfY29udGV4dCAqYywgcGFfc3Vic2NyaXB0aW9uX2V2ZW50X3R5cGVfdCB0LCB1aW50MzJfdCBpZHgsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEVuYWJsZSBldmVudCBub3RpZmljYXRpb24gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zdWJzY3JpYmUocGFfY29udGV4dCAqYywgcGFfc3Vic2NyaXB0aW9uX21hc2tfdCBtLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjb250ZXh0IHNwZWNpZmljIGNhbGwgYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgc3RhdGUgb2YgdGhlIGRhZW1vbiBjaGFuZ2VzICovCit2b2lkIHBhX2NvbnRleHRfc2V0X3N1YnNjcmliZV9jYWxsYmFjayhwYV9jb250ZXh0ICpjLCBwYV9jb250ZXh0X3N1YnNjcmliZV9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3RocmVhZC1tYWlubG9vcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS90aHJlYWQtbWFpbmxvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTExMjI4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS90aHJlYWQtbWFpbmxvb3AuaApAQCAtMCwwICsxLDMxNSBAQAorI2lmbmRlZiBmb290aHJlYWRtYWlubG9vcGhmb28KKyNkZWZpbmUgZm9vdGhyZWFkbWFpbmxvb3BoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHB1bHNlL21haW5sb29wLWFwaS5oPgorI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFxwYWdlIHRocmVhZGVkX21haW5sb29wIFRocmVhZGVkIE1haW4gTG9vcAorICoKKyAqIFxzZWN0aW9uIG92ZXJ2X3NlYyBPdmVydmlldworICoKKyAqIFRoZSB0aHJlYWRlZCBtYWluIGxvb3AgaW1wbGVtZW50YXRpb24gaXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHByaW1hcnkKKyAqIG1haW4gbG9vcCBpbXBsZW1lbnRhdGlvbiAoc2VlIFxyZWYgbWFpbmxvb3ApLiBGb3IgdGhlIGJhc2ljIGRlc2lnbiwgc2VlCisgKiBpdHMgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBUaGUgYWRkZWQgZmVhdHVyZSBpbiB0aGUgdGhyZWFkZWQgbWFpbiBsb29wIGlzIHRoYXQgaXQgc3Bhd25zIGEgbmV3IHRocmVhZAorICogdGhhdCBydW5zIHRoZSByZWFsIG1haW4gbG9vcC4gVGhpcyBhbGxvd3MgYSBzeW5jaHJvbm91cyBhcHBsaWNhdGlvbiB0byB1c2UKKyAqIHRoZSBhc3luY2hyb25vdXMgQVBJIHdpdGhvdXQgcmlza2luZyB0byBzdGFsbCB0aGUgUHVsc2VBdWRpbyBsaWJyYXJ5LgorICoKKyAqIFxzZWN0aW9uIGNyZWF0X3NlYyBDcmVhdGlvbgorICoKKyAqIEEgcGFfdGhyZWFkZWRfbWFpbmxvb3Agb2JqZWN0IGlzIGNyZWF0ZWQgdXNpbmcgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbmV3KCkuCisgKiBUaGlzIHdpbGwgb25seSBhbGxvY2F0ZSB0aGUgcmVxdWlyZWQgc3RydWN0dXJlcyB0aG91Z2gsIHNvIHRvIHVzZSBpdCB0aGUKKyAqIHRocmVhZCBtdXN0IGFsc28gYmUgc3RhcnRlZC4gVGhpcyBpcyBkb25lIHRocm91Z2gKKyAqIHBhX3RocmVhZGVkX21haW5sb29wX3N0YXJ0KCksIGFmdGVyIHdoaWNoIHlvdSBjYW4gc3RhcnQgdXNpbmcgdGhlIG1haW4gbG9vcC4KKyAqCisgKiBcc2VjdGlvbiBkZXN0cl9zZWMgRGVzdHJ1Y3Rpb24KKyAqCisgKiBXaGVuIHRoZSBQdWxzZUF1ZGlvIGNvbm5lY3Rpb24gaGFzIGJlZW4gdGVybWluYXRlZCwgdGhlIHRocmVhZCBtdXN0IGJlCisgKiBzdG9wcGVkIGFuZCB0aGUgcmVzb3VyY2VzIGZyZWVkLiBTdG9wcGluZyB0aGUgdGhyZWFkIGlzIGRvbmUgdXNpbmcKKyAqIHBhX3RocmVhZGVkX21haW5sb29wX3N0b3AoKSwgd2hpY2ggbXVzdCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgbG9jayAoc2VlCisgKiBiZWxvdykgaGVsZC4gV2hlbiB0aGF0IGZ1bmN0aW9uIHJldHVybnMsIHRoZSB0aHJlYWQgaXMgc3RvcHBlZCBhbmQgdGhlCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcCBvYmplY3QgY2FuIGJlIGZyZWVkIHVzaW5nIHBhX3RocmVhZGVkX21haW5sb29wX2ZyZWUoKS4KKyAqCisgKiBcc2VjdGlvbiBsb2NrX3NlYyBMb2NraW5nCisgKgorICogU2luY2UgdGhlIFB1bHNlQXVkaW8gQVBJIGRvZXNuJ3QgYWxsb3cgY29uY3VycmVudCBhY2Nlc3NlcyB0byBvYmplY3RzLAorICogYSBsb2NraW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgdG8gZ3VhcmFudGVlIHNhZmUgdXNhZ2UuIFRoZSB0aHJlYWRlZCBtYWluCisgKiBsb29wIEFQSSBwcm92aWRlcyBzdWNoIGEgc2NoZW1lIHRocm91Z2ggdGhlIGZ1bmN0aW9ucworICogcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jaygpIGFuZCBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2soKS4KKyAqCisgKiBUaGUgbG9jayBpcyByZWN1cnNpdmUsIHNvIGl0J3Mgc2FmZSB0byB1c2UgaXQgbXVsdGlwbGUgdGltZXMgZnJvbSB0aGUgc2FtZQorICogdGhyZWFkLiBKdXN0IG1ha2Ugc3VyZSB5b3UgY2FsbCBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2soKSB0aGUgc2FtZQorICogbnVtYmVyIG9mIHRpbWVzIHlvdSBjYWxsZWQgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jaygpLgorICoKKyAqIFRoZSBsb2NrIG5lZWRzIHRvIGJlIGhlbGQgd2hlbmV2ZXIgeW91IGNhbGwgYW55IFB1bHNlQXVkaW8gZnVuY3Rpb24gdGhhdAorICogdXNlcyBhbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFpbiBsb29wLiBNYWtlIHN1cmUgeW91IGRvIG5vdCBob2xkCisgKiBvbiB0byB0aGUgbG9jayBtb3JlIHRoYW4gbmVjZXNzYXJ5IHRob3VnaCwgYXMgdGhlIHRocmVhZGVkIG1haW4gbG9vcCBzdG9wcworICogd2hpbGUgdGhlIGxvY2sgaXMgaGVsZC4KKyAqCisgKiBFeGFtcGxlOgorICoKKyAqIFxjb2RlCisgKiB2b2lkIG15X2NoZWNrX3N0cmVhbV9mdW5jKHBhX3RocmVhZGVkX21haW5sb29wICptLCBwYV9zdHJlYW0gKnMpIHsKKyAqICAgICBwYV9zdHJlYW1fc3RhdGVfdCBzdGF0ZTsKKyAqCisgKiAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayhtKTsKKyAqCisgKiAgICAgc3RhdGUgPSBwYV9zdHJlYW1fZ2V0X3N0YXRlKHMpOworICoKKyAqICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sobSk7CisgKgorICogICAgIGlmIChzdGF0ZSA9PSBQQV9TVFJFQU1fUkVBRFkpCisgKiAgICAgICAgIHByaW50ZigiU3RyZWFtIGlzIHJlYWR5ISIpOworICogICAgIGVsc2UKKyAqICAgICAgICAgcHJpbnRmKCJTdHJlYW0gaXMgbm90IHJlYWR5ISIpOworICogfQorICogXGVuZGNvZGUKKyAqCisgKiBcc2VjdGlvbiBjYl9zZWMgQ2FsbGJhY2tzCisgKgorICogQ2FsbGJhY2tzIGluIFB1bHNlQXVkaW8gYXJlIGFzeW5jaHJvbm91cywgc28gdGhleSByZXF1aXJlIGV4dHJhIGNhcmUgd2hlbgorICogdXNpbmcgdGhlbSB0b2dldGhlciB3aXRoIGEgdGhyZWFkZWQgbWFpbiBsb29wLgorICoKKyAqIFRoZSBlYXNpZXN0IHdheSB0byB0dXJuIHRoZSBjYWxsYmFjayBiYXNlZCBvcGVyYXRpb25zIGludG8gc3luY2hyb25vdXMKKyAqIG9uZXMsIGlzIHRvIHNpbXBseSB3YWl0IGZvciB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFuZCBjb250aW51ZSBmcm9tCisgKiB0aGVyZS4gVGhpcyBpcyB0aGUgYXBwcm9hY2ggY2hvc2VuIGluIFB1bHNlQXVkaW8ncyB0aHJlYWRlZCBBUEkuCisgKgorICogXHN1YnNlY3Rpb24gYmFzaWNfc3Vic2VjIEJhc2ljIGNhbGxiYWNrcworICoKKyAqIEZvciB0aGUgYmFzaWMgY2FzZSwgd2hlcmUgYWxsIHRoYXQgaXMgcmVxdWlyZWQgaXMgdG8gd2FpdCBmb3IgdGhlIGNhbGxiYWNrCisgKiB0byBiZSBpbnZva2VkLCB0aGUgY29kZSBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgorICoKKyAqIEV4YW1wbGU6CisgKgorICogXGNvZGUKKyAqIHN0YXRpYyB2b2lkIG15X2RyYWluX2NhbGxiYWNrKHBhX3N0cmVhbSAqcywgaW50IHN1Y2Nlc3MsIHZvaWQgKnVzZXJkYXRhKSB7CisgKiAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3AgKm07CisgKgorICogICAgIG0gPSB1c2VyZGF0YTsKKyAqICAgICBhc3NlcnQobSk7CisgKgorICogICAgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbChtLCAwKTsKKyAqIH0KKyAqCisgKiB2b2lkIG15X2RyYWluX3N0cmVhbV9mdW5jKHBhX3RocmVhZGVkX21haW5sb29wICptLCBwYV9zdHJlYW0gKnMpIHsKKyAqICAgICBwYV9vcGVyYXRpb24gKm87CisgKgorICogICAgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sobSk7CisgKgorICogICAgIG8gPSBwYV9zdHJlYW1fZHJhaW4ocywgbXlfZHJhaW5fY2FsbGJhY2ssIG0pOworICogICAgIGFzc2VydChvKTsKKyAqCisgKiAgICAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUobykgPT0gUEFfT1BFUkFUSU9OX1JVTk5JTkcpCisgKiAgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQobSk7CisgKgorICogICAgIHBhX29wZXJhdGlvbl91bnJlZihvKTsKKyAqCisgKiAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKG0pOworICogfQorICogXGVuZGNvZGUKKyAqCisgKiBUaGUgbWFpbiBmdW5jdGlvbiwgbXlfZHJhaW5fc3RyZWFtX2Z1bmMoKSwgd2lsbCB3YWl0IGZvciB0aGUgY2FsbGJhY2sgdG8KKyAqIGJlIGNhbGxlZCB1c2luZyBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KCkuCisgKgorICogSWYgeW91ciBhcHBsaWNhdGlvbiBpcyBtdWx0aS10aHJlYWRlZCwgdGhlbiB0aGlzIHdhaXRpbmcgbXVzdCBiZQorICogZG9uZSBpbnNpZGUgYSB3aGlsZSBsb29wLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgbXVsdGlwbGUKKyAqIHRocmVhZHMgbWlnaHQgYmUgdXNpbmcgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCgpIGF0IHRoZSBzYW1lCisgKiB0aW1lLiBFYWNoIHRocmVhZCBtdXN0IHRoZXJlZm9yZSB2ZXJpZnkgdGhhdCBpdCB3YXMgaXRzIGNhbGxiYWNrCisgKiB0aGF0IHdhcyBpbnZva2VkLiBBbHNvIHRoZSB1bmRlcmx5aW5nIE9TIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzCisgKiBhcmUgdXN1YWxseSBub3QgZnJlZSBvZiBzcHVyaW91cyB3YWtlLXVwcywgc28gYQorICogcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCgpIG11c3QgYmUgY2FsbGVkIHdpdGhpbiBhIGxvb3AgZXZlbiBpZgorICogeW91IGhhdmUgb25seSBvbmUgdGhyZWFkIHdhaXRpbmcuCisgKgorICogVGhlIGNhbGxiYWNrLCBteV9kcmFpbl9jYWxsYmFjaygpLCBpbmRpY2F0ZXMgdG8gdGhlIG1haW4gZnVuY3Rpb24gdGhhdCBpdAorICogaGFzIGJlZW4gY2FsbGVkIHVzaW5nIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCgpLgorICoKKyAqIEFzIHlvdSBjYW4gc2VlLCBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KCkgbWF5IG9ubHkgYmUgY2FsbGVkIHdpdGgKKyAqIHRoZSBsb2NrIGhlbGQuIFRoZSBzYW1lIHRoaW5nIGlzIHRydWUgZm9yIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCgpLAorICogYnV0IGFzIHRoZSBsb2NrIGlzIGhlbGQgYmVmb3JlIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLCB5b3UgZG8gbm90IGhhdmUgdG8KKyAqIGRlYWwgd2l0aCB0aGF0LgorICoKKyAqIFRoZSBmdW5jdGlvbnMgd2lsbCBub3QgZGVhZCBsb2NrIGJlY2F1c2UgdGhlIHdhaXQgZnVuY3Rpb24gd2lsbCByZWxlYXNlCisgKiB0aGUgbG9jayBiZWZvcmUgd2FpdGluZyBhbmQgdGhlbiByZWdyYWIgaXQgb25jZSBpdCBoYXMgYmVlbiBzaWduYWxlZC4KKyAqIEZvciB0aG9zZSBvZiB5b3UgZmFtaWxpYXIgd2l0aCB0aHJlYWRzLCB0aGUgYmVoYXZpb3VyIGlzIHRoYXQgb2YgYQorICogY29uZGl0aW9uIHZhcmlhYmxlLgorICoKKyAqIFxzdWJzZWN0aW9uIGRhdGFfc3Vic2VjIERhdGEgY2FsbGJhY2tzCisgKgorICogRm9yIG1hbnkgY2FsbGJhY2tzLCBzaW1wbHkga25vd2luZyB0aGF0IHRoZXkgaGF2ZSBiZWVuIGNhbGxlZCBpcworICogaW5zdWZmaWNpZW50LiBUaGUgY2FsbGJhY2sgYWxzbyByZWNlaXZlcyBzb21lIGRhdGEgdGhhdCBpcyBkZXNpcmVkLiBUbworICogYWNjZXNzIHRoaXMgZGF0YSBzYWZlbHksIHdlIG11c3QgZXh0ZW5kIG91ciBleGFtcGxlIGEgYml0OgorICoKKyAqIFxjb2RlCisgKiBzdGF0aWMgaW50ICpkcmFpbl9yZXN1bHQ7CisgKgorICogc3RhdGljIHZvaWQgbXlfZHJhaW5fY2FsbGJhY2socGFfc3RyZWFtKnMsIGludCBzdWNjZXNzLCB2b2lkICp1c2VyZGF0YSkgeworICogICAgIHBhX3RocmVhZGVkX21haW5sb29wICptOworICoKKyAqICAgICBtID0gdXNlcmRhdGE7CisgKiAgICAgYXNzZXJ0KG0pOworICoKKyAqICAgICBkcmFpbl9yZXN1bHQgPSAmc3VjY2VzczsKKyAqCisgKiAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsKG0sIDEpOworICogfQorICoKKyAqIHZvaWQgbXlfZHJhaW5fc3RyZWFtX2Z1bmMocGFfdGhyZWFkZWRfbWFpbmxvb3AgKm0sIHBhX3N0cmVhbSAqcykgeworICogICAgIHBhX29wZXJhdGlvbiAqbzsKKyAqCisgKiAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayhtKTsKKyAqCisgKiAgICAgbyA9IHBhX3N0cmVhbV9kcmFpbihzLCBteV9kcmFpbl9jYWxsYmFjaywgbSk7CisgKiAgICAgYXNzZXJ0KG8pOworICoKKyAqICAgICB3aGlsZSAocGFfb3BlcmF0aW9uX2dldF9zdGF0ZShvKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykKKyAqICAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdChtKTsKKyAqCisgKiAgICAgcGFfb3BlcmF0aW9uX3VucmVmKG8pOworICoKKyAqICAgICBpZiAoKmRyYWluX3Jlc3VsdCkKKyAqICAgICAgICAgcHJpbnRmKCJTdWNjZXNzISIpOworICogICAgIGVsc2UKKyAqICAgICAgICAgcHJpbnRmKCJCaXR0ZXIgZGVmZWF0Li4uIik7CisgKgorICogICAgIHBhX3RocmVhZGVkX21haW5sb29wX2FjY2VwdChtKTsKKyAqCisgKiAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKG0pOworICogfQorICogXGVuZGNvZGUKKyAqCisgKiBUaGUgZXhhbXBsZSBpcyBhIGJpdCBzaWxseSBhcyBpdCB3b3VsZCBwcm9iYWJseSBoYXZlIGJlZW4gZWFzaWVyIHRvIGp1c3QKKyAqIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHN1Y2Nlc3MsIGJ1dCBmb3IgbGFyZ2VyIGRhdGEgc3RydWN0dXJlcyB0aGlzIGNhbiBiZQorICogd2FzdGVmdWwuCisgKgorICogVGhlIGRpZmZlcmVuY2UgaGVyZSBjb21wYXJlZCB0byB0aGUgYmFzaWMgY2FsbGJhY2sgaXMgdGhlIDEgc2VudCB0bworICogcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsKCkgYW5kIHRoZSBjYWxsIHRvCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF9hY2NlcHQoKS4gV2hhdCB3aWxsIGhhcHBlbiBpcyB0aGF0CisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwoKSB3aWxsIHNpZ25hbCB0aGUgbWFpbiBmdW5jdGlvbiBhbmQgdGhlbiBzdG9wLgorICogVGhlIG1haW4gZnVuY3Rpb24gaXMgdGhlbiBmcmVlIHRvIHVzZSB0aGUgZGF0YSBpbiB0aGUgY2FsbGJhY2sgdW50aWwKKyAqIHBhX3RocmVhZGVkX21haW5sb29wX2FjY2VwdCgpIGlzIGNhbGxlZCwgd2hpY2ggd2lsbCBhbGxvdyB0aGUgY2FsbGJhY2sKKyAqIHRvIGNvbnRpbnVlLgorICoKKyAqIE5vdGUgdGhhdCBwYV90aHJlYWRlZF9tYWlubG9vcF9hY2NlcHQoKSBtdXN0IGJlIGNhbGxlZCBzb21lIHRpbWUgYmV0d2VlbgorICogZXhpdGluZyB0aGUgd2hpbGUgbG9vcCBhbmQgdW5sb2NraW5nIHRoZSBtYWluIGxvb3AhIEZhaWx1cmUgdG8gZG8gc28gd2lsbAorICogcmVzdWx0IGluIGEgcmFjZSBjb25kaXRpb24uIEkuZS4gaXQgaXMgbm90IG9rIHRvIHJlbGVhc2UgdGhlIGxvY2sgYW5kCisgKiByZWdyYWIgaXQgYmVmb3JlIGNhbGxpbmcgcGFfdGhyZWFkZWRfbWFpbmxvb3BfYWNjZXB0KCkuCisgKgorICogXHN1YnNlY3Rpb24gYXN5bmNfc3Vic2VjIEFzeW5jaHJvbm91cyBjYWxsYmFja3MKKyAqCisgKiBQdWxzZUF1ZGlvIGFsc28gaGFzIGNhbGxiYWNrcyB0aGF0IGFyZSBjb21wbGV0ZWx5IGFzeW5jaHJvbm91cywgbWVhbmluZworICogdGhhdCB0aGV5IGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUuIFRoZSB0aHJlYWRpbmcgbWFpbiBsb29wIEFQSSBwcm92aWRlcworICogdGhlIGxvY2tpbmcgbWVjaGFuaXNtIHRvIGhhbmRsZSBjb25jdXJyZW50IGFjY2Vzc2VzLCBidXQgbm90aGluZyBlbHNlLgorICogQXBwbGljYXRpb25zIHdpbGwgaGF2ZSB0byBoYW5kbGUgY29tbXVuaWNhdGlvbiBmcm9tIHRoZSBjYWxsYmFjayB0byB0aGUKKyAqIG1haW4gcHJvZ3JhbSB0aHJvdWdoIHNvbWUgb3duIHN5c3RlbS4KKyAqCisgKiBUaGUgY2FsbGJhY2tzIHRoYXQgYXJlIGNvbXBsZXRlbHkgYXN5bmNocm9ub3VzIGFyZToKKyAqCisgKiBcbGkgU3RhdGUgY2FsbGJhY2tzIGZvciBjb250ZXh0cywgc3RyZWFtcywgZXRjLgorICogXGxpIFN1YnNjcmlwdGlvbiBub3RpZmljYXRpb25zCisgKi8KKworLyoqIFxmaWxlCisgKgorICogQSB0aHJlYWQgYmFzZWQgZXZlbnQgbG9vcCBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBwYV9tYWlubG9vcC4gVGhlCisgKiBldmVudCBsb29wIGlzIHJ1biBpbiBhIGhlbHBlciB0aHJlYWQgaW4gdGhlIGJhY2tncm91bmQuIEEgZmV3CisgKiBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBhcmUgYXZhaWxhYmxlIHRvIGFjY2VzcyB0aGUgb2JqZWN0cworICogYXR0YWNoZWQgdG8gdGhlIGV2ZW50IGxvb3Agc2FmZWx5LgorICoKKyAqIFNlZSBhbHNvIFxzdWJwYWdlIHRocmVhZGVkX21haW5sb29wCisgKi8KKworLyoqIEFuIG9wYXF1ZSB0aHJlYWRlZCBtYWluIGxvb3Agb2JqZWN0ICovCit0eXBlZGVmIHN0cnVjdCBwYV90aHJlYWRlZF9tYWlubG9vcCBwYV90aHJlYWRlZF9tYWlubG9vcDsKKworLyoqIEFsbG9jYXRlIGEgbmV3IHRocmVhZGVkIG1haW4gbG9vcCBvYmplY3QuIFlvdSBoYXZlIHRvIGNhbGwKKyAqIHBhX3RocmVhZGVkX21haW5sb29wX3N0YXJ0KCkgYmVmb3JlIHRoZSBldmVudCBsb29wIHRocmVhZCBzdGFydHMKKyAqIHJ1bm5pbmcuICovCitwYV90aHJlYWRlZF9tYWlubG9vcCAqcGFfdGhyZWFkZWRfbWFpbmxvb3BfbmV3KHZvaWQpOworCisvKiogRnJlZSBhIHRocmVhZGVkIG1haW4gbG9vcCBvYmplY3QuIElmIHRoZSBldmVudCBsb29wIHRocmVhZCBpcworICogc3RpbGwgcnVubmluZywgdGVybWluYXRlIGl0IHdpdGggcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RvcCgpCisgKiBmaXJzdC4gKi8KK3ZvaWQgcGFfdGhyZWFkZWRfbWFpbmxvb3BfZnJlZShwYV90aHJlYWRlZF9tYWlubG9vcCogbSk7CisKKy8qKiBTdGFydCB0aGUgZXZlbnQgbG9vcCB0aHJlYWQuICovCitpbnQgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RhcnQocGFfdGhyZWFkZWRfbWFpbmxvb3AgKm0pOworCisvKiogVGVybWluYXRlIHRoZSBldmVudCBsb29wIHRocmVhZCBjbGVhbmx5LiBNYWtlIHN1cmUgdG8gdW5sb2NrIHRoZQorICogbWFpbmxvb3Agb2JqZWN0IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICovCit2b2lkIHBhX3RocmVhZGVkX21haW5sb29wX3N0b3AocGFfdGhyZWFkZWRfbWFpbmxvb3AgKm0pOworCisvKiogTG9jayB0aGUgZXZlbnQgbG9vcCBvYmplY3QsIGVmZmVjdGl2ZWx5IGJsb2NraW5nIHRoZSBldmVudCBsb29wCisgKiB0aHJlYWQgZnJvbSBwcm9jZXNzaW5nIGV2ZW50cy4gWW91IGNhbiB1c2UgdGhpcyB0byBlbmZvcmNlCisgKiBleGNsdXNpdmUgYWNjZXNzIHRvIGFsbCBvYmplY3RzIGF0dGFjaGVkIHRvIHRoZSBldmVudCBsb29wLiBUaGlzCisgKiBsb2NrIGlzIHJlY3Vyc2l2ZS4gVGhpcyBmdW5jdGlvbiBtYXkgbm90IGJlIGNhbGxlZCBpbnNpZGUgdGhlIGV2ZW50CisgKiBsb29wIHRocmVhZC4gRXZlbnRzIHRoYXQgYXJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgZXZlbnQgbG9vcCB0aHJlYWQKKyAqIGFyZSBleGVjdXRlZCB3aXRoIHRoaXMgbG9jayBoZWxkLiAqLwordm9pZCBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKHBhX3RocmVhZGVkX21haW5sb29wICptKTsKKworLyoqIFVubG9jayB0aGUgZXZlbnQgbG9vcCBvYmplY3QsIGludmVyc2Ugb2YgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jaygpICovCit2b2lkIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayhwYV90aHJlYWRlZF9tYWlubG9vcCAqbSk7CisKKy8qKiBXYWl0IGZvciBhbiBldmVudCB0byBiZSBzaWduYWxsZWQgYnkgdGhlIGV2ZW50IGxvb3AgdGhyZWFkLiBZb3UKKyAqIGNhbiB1c2UgdGhpcyB0byBwYXNzIGRhdGEgZnJvbSB0aGUgZXZlbnQgbG9vcCB0aHJlYWQgdG8gdGhlIG1haW4KKyAqIHRocmVhZCBpbiBzeW5jaHJvbml6ZWQgZmFzaGlvbi4gVGhpcyBmdW5jdGlvbiBtYXkgbm90IGJlIGNhbGxlZAorICogaW5zaWRlIHRoZSBldmVudCBsb29wIHRocmVhZC4gUHJpb3IgdG8gdGhpcyBjYWxsIHRoZSBldmVudCBsb29wCisgKiBvYmplY3QgbmVlZHMgdG8gYmUgbG9ja2VkIHVzaW5nIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2soKS4gV2hpbGUKKyAqIHdhaXRpbmcgdGhlIGxvY2sgd2lsbCBiZSByZWxlYXNlZCwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHVybmluZyBpdAorICogd2lsbCBiZSBhY3F1aXJlZCBhZ2Fpbi4gVGhpcyBmdW5jdGlvbiBtYXkgc3B1cmlvdXNseSB3YWtlIHVwIGV2ZW4KKyAqIHdpdGhvdXQgX3NpZ25hbCgpIGJlaW5nIGNhbGxlZC4gWW91IG5lZWQgdG8gbWFrZSBzdXJlIHRvIGhhbmRsZQorICogdGhhdCEgKi8KK3ZvaWQgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdChwYV90aHJlYWRlZF9tYWlubG9vcCAqbSk7CisKKy8qKiBTaWduYWwgYWxsIHRocmVhZHMgd2FpdGluZyBmb3IgYSBzaWduYWxsaW5nIGV2ZW50IGluCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KCkuIElmIHdhaXRfZm9yX3JlbGVhc2UgaXMgbm9uLXplcm8sIGRvCisgKiBub3QgcmV0dXJuIGJlZm9yZSB0aGUgc2lnbmFsIHdhcyBhY2NlcHRlZCBieSBhCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF9hY2NlcHQoKSBjYWxsLiBXaGlsZSB3YWl0aW5nIGZvciB0aGF0IGNvbmRpdGlvbgorICogdGhlIGV2ZW50IGxvb3Agb2JqZWN0IGlzIHVubG9ja2VkLiAqLwordm9pZCBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwocGFfdGhyZWFkZWRfbWFpbmxvb3AgKm0sIGludCB3YWl0X2Zvcl9hY2NlcHQpOworCisvKiogQWNjZXB0IGEgc2lnbmFsIGZyb20gdGhlIGV2ZW50IHRocmVhZCBpc3N1ZWQgd2l0aAorICogcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsKCkuIFRoaXMgY2FsbCBzaG91bGQgb25seSBiZSB1c2VkIGluCisgKiBjb25qdW5jdGlvbiB3aXRoIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCgpIHdpdGggYSBub24temVybworICogd2FpdF9mb3JfYWNjZXB0IHZhbHVlLiAgKi8KK3ZvaWQgcGFfdGhyZWFkZWRfbWFpbmxvb3BfYWNjZXB0KHBhX3RocmVhZGVkX21haW5sb29wICptKTsKKworLyoqIFJldHVybiB0aGUgcmV0dXJuIHZhbHVlIGFzIHNwZWNpZmllZCB3aXRoIHRoZSBtYWluIGxvb3AncyBxdWl0KCkgcm91dGluZS4gKi8KK2ludCBwYV90aHJlYWRlZF9tYWlubG9vcF9nZXRfcmV0dmFsKHBhX3RocmVhZGVkX21haW5sb29wICptKTsKKworLyoqIFJldHVybiB0aGUgYWJzdHJhY3QgbWFpbiBsb29wIGFic3RyYWN0aW9uIGxheWVyIHZ0YWJsZSBmb3IgdGhpcworICAgIG1haW4gbG9vcC4gTm8gbmVlZCB0byBmcmVlIHRoZSBBUEkgYXMgaXQgaXMgb3duZWQgYnkgdGhlIGxvb3AKKyAgICBhbmQgaXMgZGVzdHJveWVkIHdoZW4gdGhlIGxvb3AgaXMgZnJlZWQuICovCitwYV9tYWlubG9vcF9hcGkqIHBhX3RocmVhZGVkX21haW5sb29wX2dldF9hcGkocGFfdGhyZWFkZWRfbWFpbmxvb3AqbSk7CisKKy8qKiBSZXR1cm5zIG5vbi16ZXJvIHdoZW4gY2FsbGVkIGZyb20gd2l0aGluZyB0aGUgZXZlbnQgbG9vcCB0aHJlYWQuIFxzaW5jZSAwLjkuNyAqLworaW50IHBhX3RocmVhZGVkX21haW5sb29wX2luX3RocmVhZChwYV90aHJlYWRlZF9tYWlubG9vcCAqbSk7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3RpbWV2YWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdGltZXZhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMjU1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3RpbWV2YWwuaApAQCAtMCwwICsxLDg5IEBACisjaWZuZGVmIGZvb3RpbWV2YWxoZm9vCisjZGVmaW5lIGZvb3RpbWV2YWxoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICBMaWNlbnNlIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvZ2NjbWFjcm8uaD4KKyNpbmNsdWRlIDxwdWxzZS9zYW1wbGUuaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBcZmlsZQorICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHRpbWV2YWwgY2FsY3VsYXRpb25zICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYSBzZWNvbmQgKi8KKyNkZWZpbmUgUEFfTVNFQ19QRVJfU0VDICgocGFfdXNlY190KSAxMDAwVUxMKQorCisvKiogVGhlIG51bWJlciBvZiBtaWNyb3NlY29uZHMgaW4gYSBzZWNvbmQgKi8KKyNkZWZpbmUgUEFfVVNFQ19QRVJfU0VDICgocGFfdXNlY190KSAxMDAwMDAwVUxMKQorCisvKiogVGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyBpbiBhIHNlY29uZCAqLworI2RlZmluZSBQQV9OU0VDX1BFUl9TRUMgKCh1bnNpZ25lZCBsb25nIGxvbmcpIDEwMDAwMDAwMDBVTEwpCisKKy8qKiBUaGUgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIFBBX1VTRUNfUEVSX01TRUMgKChwYV91c2VjX3QpIDEwMDBVTEwpCisKKy8qKiBUaGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIGluIGEgbWlsbGlzZWNvbmQgKi8KKyNkZWZpbmUgUEFfTlNFQ19QRVJfTVNFQyAoKHVuc2lnbmVkIGxvbmcgbG9uZykgMTAwMDAwMFVMTCkKKworLyoqIFRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgaW4gYSBtaWNyb3NlY29uZCAqLworI2RlZmluZSBQQV9OU0VDX1BFUl9VU0VDICgodW5zaWduZWQgbG9uZyBsb25nKSAxMDAwVUxMKQorCisvKiogSW52YWxpZCB0aW1lIGluIHVzZWMuIFxzaW5jZSAwLjkuMTUgKi8KKyNkZWZpbmUgUEFfVVNFQ19JTlZBTElEICgocGFfdXNlY190KSAtMSkKKworLyoqIEJpZ2dlc3QgdGltZSBpbiB1c2VjLiBcc2luY2UgMC45LjE4ICovCisjZGVmaW5lIFBBX1VTRUNfTUFYICgocGFfdXNlY190KSAtMikKKworc3RydWN0IHRpbWV2YWw7CisKKy8qKiBSZXR1cm4gdGhlIGN1cnJlbnQgd2FsbGNsb2NrIHRpbWVzdGFtcCwganVzdCBsaWtlIFVOSVggZ2V0dGltZW9mZGF5KCkuICovCitzdHJ1Y3QgdGltZXZhbCAqcGFfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dik7CisKKy8qKiBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHNwZWNpZmllZCB0aW1ldmFsCisgKiBzdHJ1Y3RzLiAqLworcGFfdXNlY190IHBhX3RpbWV2YWxfZGlmZihjb25zdCBzdHJ1Y3QgdGltZXZhbCAqYSwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKmIpIFBBX0dDQ19QVVJFOworCisvKiogQ29tcGFyZSB0aGUgdHdvIHRpbWV2YWwgc3RydWN0cyBhbmQgcmV0dXJuIDAgd2hlbiBlcXVhbCwgbmVnYXRpdmUgd2hlbiBhIDwgYiwgcG9zaXRpdmUgb3RoZXJ3aXNlICovCitpbnQgcGFfdGltZXZhbF9jbXAoY29uc3Qgc3RydWN0IHRpbWV2YWwgKmEsIGNvbnN0IHN0cnVjdCB0aW1ldmFsICpiKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiB0aGUgdGltZSBkaWZmZXJlbmNlIGJldHdlZW4gbm93IGFuZCB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcCAqLworcGFfdXNlY190IHBhX3RpbWV2YWxfYWdlKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0dik7CisKKy8qKiBBZGQgdGhlIHNwZWNpZmllZCB0aW1lIGluIG1pY3Jvc2Vjb25kcyB0byB0aGUgc3BlY2lmaWVkIHRpbWV2YWwgc3RydWN0dXJlICovCitzdHJ1Y3QgdGltZXZhbCogcGFfdGltZXZhbF9hZGQoc3RydWN0IHRpbWV2YWwgKnR2LCBwYV91c2VjX3Qgdik7CisKKy8qKiBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIHRpbWUgaW4gbWljcm9zZWNvbmRzIHRvIHRoZSBzcGVjaWZpZWQgdGltZXZhbCBzdHJ1Y3R1cmUuIFxzaW5jZSAwLjkuMTEgKi8KK3N0cnVjdCB0aW1ldmFsKiBwYV90aW1ldmFsX3N1YihzdHJ1Y3QgdGltZXZhbCAqdHYsIHBhX3VzZWNfdCB2KTsKKworLyoqIFN0b3JlIHRoZSBzcGVjaWZpZWQgdXNlYyB2YWx1ZSBpbiB0aGUgdGltZXZhbCBzdHJ1Y3QuIFxzaW5jZSAwLjkuNyAqLworc3RydWN0IHRpbWV2YWwqIHBhX3RpbWV2YWxfc3RvcmUoc3RydWN0IHRpbWV2YWwgKnR2LCBwYV91c2VjX3Qgdik7CisKKy8qKiBMb2FkIHRoZSBzcGVjaWZpZWQgdHYgdmFsdWUgYW5kIHJldHVybiBpdCBpbiB1c2VjLiBcc2luY2UgMC45LjcgKi8KK3BhX3VzZWNfdCBwYV90aW1ldmFsX2xvYWQoY29uc3Qgc3RydWN0IHRpbWV2YWwgKnR2KTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdXRmOC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS91dGY4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmNzQ5NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdXRmOC5oCkBAIC0wLDAgKzEsNTYgQEAKKyNpZm5kZWYgZm9vdXRmOGhmb28KKyNkZWZpbmUgZm9vdXRmOGhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICBMaWNlbnNlIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvZ2NjbWFjcm8uaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBcZmlsZQorICogVVRGOCBWYWxpZGF0aW9uIGZ1bmN0aW9ucworICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogVGVzdCBpZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgcXVhbGlmaWVzIGFzIHZhbGlkIFVURjguIFJldHVybiB0aGUgc3RyaW5nIGlmIHNvLCBvdGhlcndpc2UgTlVMTCAqLworY2hhciAqcGFfdXRmOF92YWxpZChjb25zdCBjaGFyICpzdHIpIFBBX0dDQ19QVVJFOworCisvKiogVGVzdCBpZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgcXVhbGlmaWVzIGFzIHZhbGlkIDctYml0IEFTQ0lJLiBSZXR1cm4gdGhlIHN0cmluZyBpZiBzbywgb3RoZXJ3aXNlIE5VTEwuIFxzaW5jZSAwLjkuMTUgKi8KK2NoYXIgKnBhX2FzY2lpX3ZhbGlkKGNvbnN0IGNoYXIgKnN0cikgUEFfR0NDX1BVUkU7CisKKy8qKiBGaWx0ZXIgYWxsIGludmFsaWQgVVRGOCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIHJldHVybmluZyBhIG5ldyBmdWxseSBVVEY4IHZhbGlkIHN0cmluZy4gRG9uJ3QgZm9yZ2V0IHRvIGZyZWUgdGhlIHJldHVybmVkIHN0cmluZyB3aXRoIHBhX3hmcmVlKCkgKi8KK2NoYXIgKnBhX3V0ZjhfZmlsdGVyKGNvbnN0IGNoYXIgKnN0cik7CisKKy8qKiBGaWx0ZXIgYWxsIGludmFsaWQgQVNDSUkgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZXR1cm5pbmcgYSBuZXcgZnVsbHkgQVNDSUkgdmFsaWQgc3RyaW5nLiBEb24ndCBmb3JnZXQgdG8gZnJlZSB0aGUgcmV0dXJuZWQgc3RyaW5nIHdpdGggcGFfeGZyZWUoKS4gXHNpbmNlIDAuOS4xNSAqLworY2hhciAqcGFfYXNjaWlfZmlsdGVyKGNvbnN0IGNoYXIgKnN0cik7CisKKy8qKiBDb252ZXJ0IGEgVVRGLTggc3RyaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4gRnJlZSB0aGUgc3RyaW5nIHVzaW5nIHBhX3hmcmVlKCkuICovCitjaGFyKiBwYV91dGY4X3RvX2xvY2FsZSAoY29uc3QgY2hhciAqc3RyKTsKKworLyoqIENvbnZlcnQgYSBzdHJpbmcgaW4gdGhlIGN1cnJlbnQgbG9jYWxlIHRvIFVURi04LiBGcmVlIHRoZSBzdHJpbmcgdXNpbmcgcGFfeGZyZWUoKS4gKi8KK2NoYXIqIHBhX2xvY2FsZV90b191dGY4IChjb25zdCBjaGFyICpzdHIpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS91dGlsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDkwZDU2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS91dGlsLmgKQEAgLTAsMCArMSw2MSBAQAorI2lmbmRlZiBmb291dGlsaGZvbworI2RlZmluZSBmb291dGlsaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgTGljZW5zZSBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXGZpbGUKKyAqIEFzc29ydGVkIHV0aWxpdHkgZnVuY3Rpb25zICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogUmV0dXJuIHRoZSBjdXJyZW50IHVzZXJuYW1lIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4gKi8KK2NoYXIgKnBhX2dldF91c2VyX25hbWUoY2hhciAqcywgc2l6ZV90IGwpOworCisvKiogUmV0dXJuIHRoZSBjdXJyZW50IGhvc3RuYW1lIGluIHRoZSBzcGVjaWZpZWQgYnVmZmVyLiAqLworY2hhciAqcGFfZ2V0X2hvc3RfbmFtZShjaGFyICpzLCBzaXplX3QgbCk7CisKKy8qKiBSZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZSBpbiBzICovCitjaGFyICpwYV9nZXRfZnFkbihjaGFyICpzLCBzaXplX3QgbCk7CisKKy8qKiBSZXR1cm4gdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50IHVzZXIgKi8KK2NoYXIgKnBhX2dldF9ob21lX2RpcihjaGFyICpzLCBzaXplX3QgbCk7CisKKy8qKiBSZXR1cm4gdGhlIGJpbmFyeSBmaWxlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzcy4gVGhpcyBpcyBub3QKKyAqIHN1cHBvcnRlZCBvbiBhbGwgYXJjaGl0ZWN0dXJlcywgaW4gd2hpY2ggY2FzZSBOVUxMIGlzIHJldHVybmVkLiAqLworY2hhciAqcGFfZ2V0X2JpbmFyeV9uYW1lKGNoYXIgKnMsIHNpemVfdCBsKTsKKworLyoqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpbGVuYW1lIGluc2lkZSBhIHBhdGggKHdoaWNoIGlzIHRoZSBsYXN0CisgKiBjb21wb25lbnQpLiBJZiBwYXNzZWQgTlVMTCB3aWxsIHJldHVybiBOVUxMLiAqLworY2hhciAqcGFfcGF0aF9nZXRfZmlsZW5hbWUoY29uc3QgY2hhciAqcCk7CisKKy8qKiBXYWl0IHQgbWlsbGlzZWNvbmRzICovCitpbnQgcGFfbXNsZWVwKHVuc2lnbmVkIGxvbmcgdCk7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3ZlcnNpb24uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOTA1MzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3ZlcnNpb24uaApAQCAtMCwwICsxLDcyIEBACisjaWZuZGVmIGZvb3ZlcnNpb25oZm9vIC8qLSotQy0qLSovCisjZGVmaW5lIGZvb3ZlcnNpb25oZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworLyogV0FSTklORzogTWFrZSBzdXJlIHRvIGVkaXQgdGhlIHJlYWwgc291cmNlIGZpbGUgdmVyc2lvbi5oLmluISAqLworCisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKworLyoqIFxmaWxlCisgKiBEZWZpbmUgaGVhZGVyIHZlcnNpb24gKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlciBmaWxlcy4gS2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBpcworYSBtYWNybyBhbmQgbm90IGEgZnVuY3Rpb24sIHNvIGl0IGlzIGltcG9zc2libGUgdG8gZ2V0IHRoZSBwb2ludGVyIG9mCitpdC4gKi8KKyNkZWZpbmUgcGFfZ2V0X2hlYWRlcnNfdmVyc2lvbigpICgiMS4xLjAiKQorCisvKiogUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIGlzCisgKiBsaW5rZWQgdG8uICovCitjb25zdCBjaGFyKiBwYV9nZXRfbGlicmFyeV92ZXJzaW9uKHZvaWQpOworCisvKiogVGhlIGN1cnJlbnQgQVBJIHZlcnNpb24uIFZlcnNpb24gNiByZWxhdGVzIHRvIFBvbHlwYXVkaW8KKyAqIDAuNi4gUHJpb3IgdmVyc2lvbnMgKGkuZS4gUG9seXBhdWRpbyAwLjUuMSBhbmQgb2xkZXIpIGhhdmUKKyAqIFBBX0FQSV9WRVJTSU9OIHVuZGVmaW5lZC4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgZXZlcgorICogaW5jcmVhc2VkIG9uIGluY29tcGF0aWJsZSBBUEkgY2hhbmdlcyEgICovCisjZGVmaW5lIFBBX0FQSV9WRVJTSU9OIDEyCisKKy8qKiBUaGUgY3VycmVudCBwcm90b2NvbCB2ZXJzaW9uLiBWZXJzaW9uIDggcmVsYXRlcyB0byBQb2x5cGF1ZGlvCisgKiAwLjgvUHVsc2VBdWRpbyAwLjkuICovCisjZGVmaW5lIFBBX1BST1RPQ09MX1ZFUlNJT04gMjYKKworLyoqIFRoZSBtYWpvciB2ZXJzaW9uIG9mIFBBLiBcc2luY2UgMC45LjE1ICovCisjZGVmaW5lIFBBX01BSk9SIDEKKworLyoqIFRoZSBtaW5vciB2ZXJzaW9uIG9mIFBBLiBcc2luY2UgMC45LjE1ICovCisjZGVmaW5lIFBBX01JTk9SIDEKKworLyoqIFRoZSBtaWNybyB2ZXJzaW9uIG9mIFBBICh3aWxsIGFsd2F5cyBiZSAwIGZyb20gdjEuMCBvbndhcmRzKS4gXHNpbmNlIDAuOS4xNSAqLworI2RlZmluZSBQQV9NSUNSTyAwCisKKy8qKiBFdmFsdWF0ZXMgdG8gVFJVRSBpZiB0aGUgUHVsc2VBdWRpbyBsaWJyYXJ5IHZlcnNpb24gaXMgZXF1YWwgb3IKKyAqIG5ld2VyIHRoYW4gdGhlIHNwZWNpZmllZC4gXHNpbmNlIDAuOS4xNiAqLworI2RlZmluZSBQQV9DSEVDS19WRVJTSU9OKG1ham9yLG1pbm9yLG1pY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoUEFfTUFKT1IgPiAobWFqb3IpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoUEFfTUFKT1IgPT0gKG1ham9yKSAmJiBQQV9NSU5PUiA+IChtaW5vcikpIHx8ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoUEFfTUFKT1IgPT0gKG1ham9yKSAmJiBQQV9NSU5PUiA9PSAobWlub3IpICYmIFBBX01JQ1JPID49IChtaWNybykpKQorCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS92b2x1bWUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvdm9sdW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4NDM2MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvdm9sdW1lLmgKQEAgLTAsMCArMSwzODIgQEAKKyNpZm5kZWYgZm9vdm9sdW1laGZvbworI2RlZmluZSBmb292b2x1bWVoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvZ2NjbWFjcm8uaD4KKyNpbmNsdWRlIDxwdWxzZS9zYW1wbGUuaD4KKyNpbmNsdWRlIDxwdWxzZS9jaGFubmVsbWFwLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXHBhZ2Ugdm9sdW1lIFZvbHVtZSBDb250cm9sCisgKgorICogXHNlY3Rpb24gb3ZlcnZfc2VjIE92ZXJ2aWV3CisgKgorICogU2lua3MsIHNvdXJjZXMsIHNpbmsgaW5wdXRzIGFuZCBzYW1wbGVzIGNhbiBhbGwgaGF2ZSB0aGVpciBvd24gdm9sdW1lcy4KKyAqIFRvIGRlYWwgd2l0aCB0aGVzZSwgVGhlIFB1bHNlQXVkaW8gbGlicmFyeSBjb250YWlucyBhIG51bWJlciBvZiBmdW5jdGlvbnMKKyAqIHRoYXQgZWFzZSBoYW5kbGluZy4KKyAqCisgKiBUaGUgYmFzaWMgdm9sdW1lIHR5cGUgaW4gUHVsc2VBdWRpbyBpcyB0aGUgXHJlZiBwYV92b2x1bWVfdCB0eXBlLiBNb3N0IG9mCisgKiB0aGUgdGltZSwgYXBwbGljYXRpb25zIHdpbGwgdXNlIHRoZSBhZ2dyZWdhdGVkIHBhX2N2b2x1bWUgc3RydWN0dXJlIHRoYXQKKyAqIGNhbiBzdG9yZSB0aGUgdm9sdW1lIG9mIGFsbCBjaGFubmVscyBhdCBvbmNlLgorICoKKyAqIFZvbHVtZXMgY29tbW9ubHkgc3BhbiBiZXR3ZWVuIG11dGVkICgwJSksIGFuZCBub3JtYWwgKDEwMCUpLiBJdCBpcyBwb3NzaWJsZQorICogdG8gc2V0IHZvbHVtZXMgdG8gaGlnaGVyIHRoYW4gMTAwJSwgYnV0IGNsaXBwaW5nIG1pZ2h0IG9jY3VyLgorICoKKyAqIFxzZWN0aW9uIGNhbGNfc2VjIENhbGN1bGF0aW9ucworICoKKyAqIFRoZSB2b2x1bWVzIGluIFB1bHNlQXVkaW8gYXJlIGxvZ2FyaXRobWljIGluIG5hdHVyZSBhbmQgYXBwbGljYXRpb25zCisgKiBzaG91bGRuJ3QgcGVyZm9ybSBjYWxjdWxhdGlvbnMgd2l0aCB0aGVtIGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZAorICogYmUgY29udmVydGVkIHRvIGFuZCBmcm9tIGVpdGhlciBkQiBvciBhIGxpbmVhciBzY2FsZToKKyAqCisgKiBcbGkgZEIgLSBwYV9zd192b2x1bWVfZnJvbV9kQigpIC8gcGFfc3dfdm9sdW1lX3RvX2RCKCkKKyAqIFxsaSBMaW5lYXIgLSBwYV9zd192b2x1bWVfZnJvbV9saW5lYXIoKSAvIHBhX3N3X3ZvbHVtZV90b19saW5lYXIoKQorICoKKyAqIEZvciBzaW1wbGUgbXVsdGlwbGljYXRpb24sIHBhX3N3X3ZvbHVtZV9tdWx0aXBseSgpIGFuZAorICogcGFfc3dfY3ZvbHVtZV9tdWx0aXBseSgpIGNhbiBiZSB1c2VkLgorICoKKyAqIENhbGN1bGF0aW9ucyBjYW4gb25seSBiZSByZWxpYWJseSBwZXJmb3JtZWQgb24gc29mdHdhcmUgdm9sdW1lcworICogYXMgaXQgaXMgY29tbW9ubHkgdW5rbm93biB3aGF0IHNjYWxlIGhhcmR3YXJlIHZvbHVtZXMgcmVsYXRlIHRvLgorICoKKyAqIFRoZSBmdW5jdGlvbnMgZGVzY3JpYmVkIGFib3ZlIGFyZSBvbmx5IHZhbGlkIHdoZW4gdXNlZCB3aXRoCisgKiBzb2Z0d2FyZSB2b2x1bWVzLiBIZW5jZSBpdCBpcyB1c3VhbGx5IGEgYmV0dGVyIGlkZWEgdG8gdHJlYXQgYWxsCisgKiB2b2x1bWUgdmFsdWVzIGFzIG9wYXF1ZSB3aXRoIGEgcmFuZ2UgZnJvbSBQQV9WT0xVTUVfTVVURUQgKDAlKSB0bworICogUEFfVk9MVU1FX05PUk0gKDEwMCUpIGFuZCB0byByZWZyYWluIGZyb20gYW55IGNhbGN1bGF0aW9ucyB3aXRoCisgKiB0aGVtLgorICoKKyAqIFxzZWN0aW9uIGNvbnZfc2VjIENvbnZlbmllbmNlIEZ1bmN0aW9ucworICoKKyAqIFRvIGhhbmRsZSB0aGUgcGFfY3ZvbHVtZSBzdHJ1Y3R1cmUsIHRoZSBQdWxzZUF1ZGlvIGxpYnJhcnkgcHJvdmlkZXMgYQorICogbnVtYmVyIG9mIGNvbnZlbmllbmNlIGZ1bmN0aW9uczoKKyAqCisgKiBcbGkgcGFfY3ZvbHVtZV92YWxpZCgpIC0gVGVzdHMgaWYgYSBwYV9jdm9sdW1lIHN0cnVjdHVyZSBpcyB2YWxpZC4KKyAqIFxsaSBwYV9jdm9sdW1lX2VxdWFsKCkgLSBUZXN0cyBpZiB0d28gcGFfY3ZvbHVtZSBzdHJ1Y3R1cmVzIGFyZSBpZGVudGljYWwuCisgKiBcbGkgcGFfY3ZvbHVtZV9jaGFubmVsc19lcXVhbF90bygpIC0gVGVzdHMgaWYgYWxsIGNoYW5uZWxzIG9mIGEgcGFfY3ZvbHVtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBoYXZlIGEgZ2l2ZW4gdm9sdW1lLgorICogXGxpIHBhX2N2b2x1bWVfaXNfbXV0ZWQoKSAtIFRlc3RzIGlmIGFsbCBjaGFubmVscyBvZiBhIHBhX2N2b2x1bWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgYXJlIG11dGVkLgorICogXGxpIHBhX2N2b2x1bWVfaXNfbm9ybSgpIC0gVGVzdHMgaWYgYWxsIGNoYW5uZWxzIG9mIGEgcGFfY3ZvbHVtZSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdCBhIG5vcm1hbCB2b2x1bWUuCisgKiBcbGkgcGFfY3ZvbHVtZV9zZXQoKSAtIFNldCB0aGUgZmlyc3QgbiBjaGFubmVscyBvZiBhIHBhX2N2b2x1bWUgc3RydWN0dXJlIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGEgY2VydGFpbiB2b2x1bWUuCisgKiBcbGkgcGFfY3ZvbHVtZV9yZXNldCgpIC0gU2V0IHRoZSBmaXJzdCBuIGNoYW5uZWxzIG9mIGEgcGFfY3ZvbHVtZSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhIG5vcm1hbCB2b2x1bWUuCisgKiBcbGkgcGFfY3ZvbHVtZV9tdXRlKCkgLSBTZXQgdGhlIGZpcnN0IG4gY2hhbm5lbHMgb2YgYSBwYV9jdm9sdW1lIHN0cnVjdHVyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSBtdXRlZCB2b2x1bWUuCisgKiBcbGkgcGFfY3ZvbHVtZV9hdmcoKSAtIFJldHVybiB0aGUgYXZlcmFnZSB2b2x1bWUgb2YgYWxsIGNoYW5uZWxzLgorICogXGxpIHBhX2N2b2x1bWVfc25wcmludCgpIC0gUHJldHR5IHByaW50IGEgcGFfY3ZvbHVtZSBzdHJ1Y3R1cmUuCisgKi8KKworLyoqIFxmaWxlCisgKiBDb25zdGFudHMgYW5kIHJvdXRpbmVzIGZvciB2b2x1bWUgaGFuZGxpbmcKKyAqCisgKiBTZWUgYWxzbyBcc3VicGFnZSB2b2x1bWUKKyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFZvbHVtZSBzcGVjaWZpY2F0aW9uOgorICogIFBBX1ZPTFVNRV9NVVRFRDogc2lsZW5jZTsKKyAqIDwgUEFfVk9MVU1FX05PUk06IGRlY3JlYXNlZCB2b2x1bWU7CisgKiAgIFBBX1ZPTFVNRV9OT1JNOiBub3JtYWwgdm9sdW1lOworICogPiBQQV9WT0xVTUVfTk9STTogaW5jcmVhc2VkIHZvbHVtZSAqLwordHlwZWRlZiB1aW50MzJfdCBwYV92b2x1bWVfdDsKKworLyoqIE5vcm1hbCB2b2x1bWUgKDEwMCUsIDAgZEIpICovCisjZGVmaW5lIFBBX1ZPTFVNRV9OT1JNICgocGFfdm9sdW1lX3QpIDB4MTAwMDBVKQorCisvKiogTXV0ZWQgKG1pbmltYWwgdmFsaWQpIHZvbHVtZSAoMCUsIC1pbmYgZEIpICovCisjZGVmaW5lIFBBX1ZPTFVNRV9NVVRFRCAoKHBhX3ZvbHVtZV90KSAwVSkKKworLyoqIE1heGltdW0gdmFsaWQgdm9sdW1lIHdlIGNhbiBzdG9yZS4gXHNpbmNlIDAuOS4xNSAqLworI2RlZmluZSBQQV9WT0xVTUVfTUFYICgocGFfdm9sdW1lX3QpIFVJTlQzMl9NQVgvMikKKworLyoqIFJlY29tbWVuZGVkIG1heGltdW0gdm9sdW1lIHRvIHNob3cgaW4gdXNlciBmYWNpbmcgVUlzLgorICogTm90ZTogVUlzIHNob3VsZCBkZWFsIGdyYWNlZnVsbHkgd2l0aCB2b2x1bWVzIGdyZWF0ZXIgdGhhbiB0aGlzIHZhbHVlCisgKiBhbmQgbm90IGNhdXNlIGZlZWRiYWNrIGxvb3BzIGV0Yy4gLSBpLmUuIGlmIHRoZSB2b2x1bWUgaXMgbW9yZSB0aGFuCisgKiB0aGlzLCB0aGUgVUkgc2hvdWxkIG5vdCBsaW1pdCBpdCBhbmQgcHVzaCB0aGUgbGltaXRlZCB2YWx1ZSBiYWNrIHRvCisgKiB0aGUgc2VydmVyLiBcc2luY2UgMC45LjIzICovCisjZGVmaW5lIFBBX1ZPTFVNRV9VSV9NQVggKHBhX3N3X3ZvbHVtZV9mcm9tX2RCKCsxMS4wKSkKKworLyoqIFNwZWNpYWwgJ2ludmFsaWQnIHZvbHVtZS4gXHNpbmNlIDAuOS4xNiAqLworI2RlZmluZSBQQV9WT0xVTUVfSU5WQUxJRCAoKHBhX3ZvbHVtZV90KSBVSU5UMzJfTUFYKQorCisvKiogQ2hlY2sgaWYgdm9sdW1lIGlzIHZhbGlkLiBcc2luY2UgMS4wICovCisjZGVmaW5lIFBBX1ZPTFVNRV9JU19WQUxJRCh2KSAoKHYpIDw9IFBBX1ZPTFVNRV9NQVgpCisKKy8qKiBDbGFtcCB2b2x1bWUgdG8gdGhlIHBlcm1pdHRlZCByYW5nZS4gXHNpbmNlIDEuMCAqLworI2RlZmluZSBQQV9DTEFNUF9WT0xVTUUodikgKFBBX0NMQU1QX1VOTElLRUxZKCh2KSwgUEFfVk9MVU1FX01VVEVELCBQQV9WT0xVTUVfTUFYKSkKKworLyoqIEEgc3RydWN0dXJlIGVuY2Fwc3VsYXRpbmcgYSBwZXItY2hhbm5lbCB2b2x1bWUgKi8KK3R5cGVkZWYgc3RydWN0IHBhX2N2b2x1bWUgeworICAgIHVpbnQ4X3QgY2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBwYV92b2x1bWVfdCB2YWx1ZXNbUEFfQ0hBTk5FTFNfTUFYXTsgIC8qKjwgUGVyLWNoYW5uZWwgdm9sdW1lICovCit9IHBhX2N2b2x1bWU7CisKKy8qKiBSZXR1cm4gbm9uLXplcm8gd2hlbiAqYSA9PSAqYiAqLworaW50IHBhX2N2b2x1bWVfZXF1YWwoY29uc3QgcGFfY3ZvbHVtZSAqYSwgY29uc3QgcGFfY3ZvbHVtZSAqYikgUEFfR0NDX1BVUkU7CisKKy8qKiBJbml0aWFsaXplIHRoZSBzcGVjaWZpZWQgdm9sdW1lIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvCisgKiBpdC4gVGhlIHNhbXBsZSBzcGVjIHdpbGwgaGF2ZSBhIGRlZmluZWQgc3RhdGUgYnV0CisgKiBwYV9jdm9sdW1lX3ZhbGlkKCkgd2lsbCBmYWlsIGZvciBpdC4gXHNpbmNlIDAuOS4xMyAqLworcGFfY3ZvbHVtZSogcGFfY3ZvbHVtZV9pbml0KHBhX2N2b2x1bWUgKmEpOworCisvKiogU2V0IHRoZSB2b2x1bWUgb2YgdGhlIGZpcnN0IG4gY2hhbm5lbHMgdG8gUEFfVk9MVU1FX05PUk0gKi8KKyNkZWZpbmUgcGFfY3ZvbHVtZV9yZXNldChhLCBuKSBwYV9jdm9sdW1lX3NldCgoYSksIChuKSwgUEFfVk9MVU1FX05PUk0pCisKKy8qKiBTZXQgdGhlIHZvbHVtZSBvZiB0aGUgZmlyc3QgbiBjaGFubmVscyB0byBQQV9WT0xVTUVfTVVURUQgKi8KKyNkZWZpbmUgcGFfY3ZvbHVtZV9tdXRlKGEsIG4pIHBhX2N2b2x1bWVfc2V0KChhKSwgKG4pLCBQQV9WT0xVTUVfTVVURUQpCisKKy8qKiBTZXQgdGhlIHZvbHVtZSBvZiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFubmVscyB0byB0aGUgdm9sdW1lIHYgKi8KK3BhX2N2b2x1bWUqIHBhX2N2b2x1bWVfc2V0KHBhX2N2b2x1bWUgKmEsIHVuc2lnbmVkIGNoYW5uZWxzLCBwYV92b2x1bWVfdCB2KTsKKworLyoqIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBzdHJpbmdzIHJldHVybmVkIGJ5CisgKiBwYV9jdm9sdW1lX3NucHJpbnQoKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHZhbHVlIGNhbiBjaGFuZ2Ugd2l0aAorICogYW55IHJlbGVhc2Ugd2l0aG91dCB3YXJuaW5nIGFuZCB3aXRob3V0IGJlaW5nIGNvbnNpZGVyZWQgQVBJIG9yIEFCSQorICogYnJlYWthZ2UuIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGRlZmluaXRpb24gYW55d2hlcmUgd2hlcmUgaXQKKyAqIG1pZ2h0IGJlY29tZSBwYXJ0IG9mIGFuIEFCSS4qLworI2RlZmluZSBQQV9DVk9MVU1FX1NOUFJJTlRfTUFYIDMyMAorCisvKiogUHJldHR5IHByaW50IGEgdm9sdW1lIHN0cnVjdHVyZSAqLworY2hhciAqcGFfY3ZvbHVtZV9zbnByaW50KGNoYXIgKnMsIHNpemVfdCBsLCBjb25zdCBwYV9jdm9sdW1lICpjKTsKKworLyoqIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBzdHJpbmdzIHJldHVybmVkIGJ5CisgKiBwYV9zd19jdm9sdW1lX3NucHJpbnRfZEIoKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHZhbHVlIGNhbiBjaGFuZ2Ugd2l0aAorICogYW55IHJlbGVhc2Ugd2l0aG91dCB3YXJuaW5nIGFuZCB3aXRob3V0IGJlaW5nIGNvbnNpZGVyZWQgQVBJIG9yIEFCSQorICogYnJlYWthZ2UuIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGRlZmluaXRpb24gYW55d2hlcmUgd2hlcmUgaXQKKyAqIG1pZ2h0IGJlY29tZSBwYXJ0IG9mIGFuIEFCSS4gXHNpbmNlIDAuOS4xMyAqLworI2RlZmluZSBQQV9TV19DVk9MVU1FX1NOUFJJTlRfREJfTUFYIDQ0OAorCisvKiogUHJldHR5IHByaW50IGEgdm9sdW1lIHN0cnVjdHVyZSBidXQgc2hvdyBkQiB2YWx1ZXMuIFxzaW5jZSAwLjkuMTMgKi8KK2NoYXIgKnBhX3N3X2N2b2x1bWVfc25wcmludF9kQihjaGFyICpzLCBzaXplX3QgbCwgY29uc3QgcGFfY3ZvbHVtZSAqYyk7CisKKy8qKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgc3RyaW5ncyByZXR1cm5lZCBieQorICogcGFfdm9sdW1lX3NucHJpbnQoKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHZhbHVlIGNhbiBjaGFuZ2Ugd2l0aAorICogYW55IHJlbGVhc2Ugd2l0aG91dCB3YXJuaW5nIGFuZCB3aXRob3V0IGJlaW5nIGNvbnNpZGVyZWQgQVBJIG9yIEFCSQorICogYnJlYWthZ2UuIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGRlZmluaXRpb24gYW55d2hlcmUgd2hlcmUgaXQKKyAqIG1pZ2h0IGJlY29tZSBwYXJ0IG9mIGFuIEFCSS4gXHNpbmNlIDAuOS4xNSAqLworI2RlZmluZSBQQV9WT0xVTUVfU05QUklOVF9NQVggMTAKKworLyoqIFByZXR0eSBwcmludCBhIHZvbHVtZSBcc2luY2UgMC45LjE1ICovCitjaGFyICpwYV92b2x1bWVfc25wcmludChjaGFyICpzLCBzaXplX3QgbCwgcGFfdm9sdW1lX3Qgdik7CisKKy8qKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgc3RyaW5ncyByZXR1cm5lZCBieQorICogcGFfc3dfdm9sdW1lX3NucHJpbnRfZEIoKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHZhbHVlIGNhbiBjaGFuZ2Ugd2l0aAorICogYW55IHJlbGVhc2Ugd2l0aG91dCB3YXJuaW5nIGFuZCB3aXRob3V0IGJlaW5nIGNvbnNpZGVyZWQgQVBJIG9yIEFCSQorICogYnJlYWthZ2UuIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGRlZmluaXRpb24gYW55d2hlcmUgd2hlcmUgaXQKKyAqIG1pZ2h0IGJlY29tZSBwYXJ0IG9mIGFuIEFCSS4gXHNpbmNlIDAuOS4xNSAqLworI2RlZmluZSBQQV9TV19WT0xVTUVfU05QUklOVF9EQl9NQVggMTAKKworLyoqIFByZXR0eSBwcmludCBhIHZvbHVtZSBidXQgc2hvdyBkQiB2YWx1ZXMuIFxzaW5jZSAwLjkuMTUgKi8KK2NoYXIgKnBhX3N3X3ZvbHVtZV9zbnByaW50X2RCKGNoYXIgKnMsIHNpemVfdCBsLCBwYV92b2x1bWVfdCB2KTsKKworLyoqIFJldHVybiB0aGUgYXZlcmFnZSB2b2x1bWUgb2YgYWxsIGNoYW5uZWxzICovCitwYV92b2x1bWVfdCBwYV9jdm9sdW1lX2F2Zyhjb25zdCBwYV9jdm9sdW1lICphKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiB0aGUgYXZlcmFnZSB2b2x1bWUgb2YgYWxsIGNoYW5uZWxzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZQorICogc3BlY2lmaWVkIGNoYW5uZWwgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBjaGFubmVsIHBvc2l0aW9uIG1hc2suIElmCisgKiBjbSBpcyBOVUxMIHRoaXMgY2FsbCBpcyBpZGVudGljYWwgdG8gcGFfY3ZvbHVtZV9hdmcoKS4gSWYgbm8KKyAqIGNoYW5uZWwgaXMgc2VsZWN0ZWQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUKKyAqIFBBX1ZPTFVNRV9NVVRFRC4gXHNpbmNlIDAuOS4xNiAqLworcGFfdm9sdW1lX3QgcGFfY3ZvbHVtZV9hdmdfbWFzayhjb25zdCBwYV9jdm9sdW1lICphLCBjb25zdCBwYV9jaGFubmVsX21hcCAqY20sIHBhX2NoYW5uZWxfcG9zaXRpb25fbWFza190IG1hc2spIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIHRoZSBtYXhpbXVtIHZvbHVtZSBvZiBhbGwgY2hhbm5lbHMuIFxzaW5jZSAwLjkuMTIgKi8KK3BhX3ZvbHVtZV90IHBhX2N2b2x1bWVfbWF4KGNvbnN0IHBhX2N2b2x1bWUgKmEpIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIHRoZSBtYXhpbXVtIHZvbHVtZSBvZiBhbGwgY2hhbm5lbHMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlCisgKiBzcGVjaWZpZWQgY2hhbm5lbCBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgcG9zaXRpb24gbWFzay4gSWYKKyAqIGNtIGlzIE5VTEwgdGhpcyBjYWxsIGlzIGlkZW50aWNhbCB0byBwYV9jdm9sdW1lX21heCgpLiBJZiBubworICogY2hhbm5lbCBpcyBzZWxlY3RlZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBQQV9WT0xVTUVfTVVURUQuCisgKiBcc2luY2UgMC45LjE2ICovCitwYV92b2x1bWVfdCBwYV9jdm9sdW1lX21heF9tYXNrKGNvbnN0IHBhX2N2b2x1bWUgKmEsIGNvbnN0IHBhX2NoYW5uZWxfbWFwICpjbSwgcGFfY2hhbm5lbF9wb3NpdGlvbl9tYXNrX3QgbWFzaykgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gdGhlIG1pbmltdW0gdm9sdW1lIG9mIGFsbCBjaGFubmVscy4gXHNpbmNlIDAuOS4xNiAqLworcGFfdm9sdW1lX3QgcGFfY3ZvbHVtZV9taW4oY29uc3QgcGFfY3ZvbHVtZSAqYSkgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gdGhlIG1pbmltdW0gdm9sdW1lIG9mIGFsbCBjaGFubmVscyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUKKyAqIHNwZWNpZmllZCBjaGFubmVsIG1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBwb3NpdGlvbiBtYXNrLiBJZgorICogY20gaXMgTlVMTCB0aGlzIGNhbGwgaXMgaWRlbnRpY2FsIHRvIHBhX2N2b2x1bWVfbWluKCkuIElmIG5vCisgKiBjaGFubmVsIGlzIHNlbGVjdGVkIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIFBBX1ZPTFVNRV9NVVRFRC4KKyAqIFxzaW5jZSAwLjkuMTYgKi8KK3BhX3ZvbHVtZV90IHBhX2N2b2x1bWVfbWluX21hc2soY29uc3QgcGFfY3ZvbHVtZSAqYSwgY29uc3QgcGFfY2hhbm5lbF9tYXAgKmNtLCBwYV9jaGFubmVsX3Bvc2l0aW9uX21hc2tfdCBtYXNrKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiBUUlVFIHdoZW4gdGhlIHBhc3NlZCBjdm9sdW1lIHN0cnVjdHVyZSBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlICovCitpbnQgcGFfY3ZvbHVtZV92YWxpZChjb25zdCBwYV9jdm9sdW1lICp2KSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiBub24temVybyBpZiB0aGUgdm9sdW1lIG9mIGFsbCBjaGFubmVscyBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlICovCitpbnQgcGFfY3ZvbHVtZV9jaGFubmVsc19lcXVhbF90byhjb25zdCBwYV9jdm9sdW1lICphLCBwYV92b2x1bWVfdCB2KSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiAxIGlmIHRoZSBzcGVjaWZpZWQgdm9sdW1lIGhhcyBhbGwgY2hhbm5lbHMgbXV0ZWQgKi8KKyNkZWZpbmUgcGFfY3ZvbHVtZV9pc19tdXRlZChhKSBwYV9jdm9sdW1lX2NoYW5uZWxzX2VxdWFsX3RvKChhKSwgUEFfVk9MVU1FX01VVEVEKQorCisvKiogUmV0dXJuIDEgaWYgdGhlIHNwZWNpZmllZCB2b2x1bWUgaGFzIGFsbCBjaGFubmVscyBvbiBub3JtYWwgbGV2ZWwgKi8KKyNkZWZpbmUgcGFfY3ZvbHVtZV9pc19ub3JtKGEpIHBhX2N2b2x1bWVfY2hhbm5lbHNfZXF1YWxfdG8oKGEpLCBQQV9WT0xVTUVfTk9STSkKKworLyoqIE11bHRpcGx5IHR3byB2b2x1bWUgc3BlY2lmaWNhdGlvbnMsIHJldHVybiB0aGUgcmVzdWx0LiBUaGlzIHVzZXMKKyAqIFBBX1ZPTFVNRV9OT1JNIGFzIG5ldXRyYWwgZWxlbWVudCBvZiBtdWx0aXBsaWNhdGlvbi4gVGhpcyBpcyBvbmx5CisgKiB2YWxpZCBmb3Igc29mdHdhcmUgdm9sdW1lcyEgKi8KK3BhX3ZvbHVtZV90IHBhX3N3X3ZvbHVtZV9tdWx0aXBseShwYV92b2x1bWVfdCBhLCBwYV92b2x1bWVfdCBiKSBQQV9HQ0NfQ09OU1Q7CisKKy8qKiBNdWx0aXBseSB0d28gcGVyLWNoYW5uZWwgdm9sdW1lcyBhbmQgcmV0dXJuIHRoZSByZXN1bHQgaW4KKyAqICpkZXN0LiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIHNvZnR3YXJlIHZvbHVtZXMhIGEsIGIgYW5kIGRlc3QgbWF5CisgKiBwb2ludCB0byB0aGUgc2FtZSBzdHJ1Y3R1cmUuICovCitwYV9jdm9sdW1lICpwYV9zd19jdm9sdW1lX211bHRpcGx5KHBhX2N2b2x1bWUgKmRlc3QsIGNvbnN0IHBhX2N2b2x1bWUgKmEsIGNvbnN0IHBhX2N2b2x1bWUgKmIpOworCisvKiogTXVsdGlwbHkgYSBwZXItY2hhbm5lbCB2b2x1bWUgd2l0aCBhIHNjYWxhciB2b2x1bWUgYW5kIHJldHVybiB0aGUKKyAqIHJlc3VsdCBpbiAqZGVzdC4gVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBzb2Z0d2FyZSB2b2x1bWVzISBhCisgKiBhbmQgZGVzdCBtYXkgcG9pbnQgdG8gdGhlIHNhbWUgc3RydWN0dXJlLiBcc2luY2UKKyAqIDAuOS4xNiAqLworcGFfY3ZvbHVtZSAqcGFfc3dfY3ZvbHVtZV9tdWx0aXBseV9zY2FsYXIocGFfY3ZvbHVtZSAqZGVzdCwgY29uc3QgcGFfY3ZvbHVtZSAqYSwgcGFfdm9sdW1lX3QgYik7CisKKy8qKiBEaXZpZGUgdHdvIHZvbHVtZSBzcGVjaWZpY2F0aW9ucywgcmV0dXJuIHRoZSByZXN1bHQuIFRoaXMgdXNlcworICogUEFfVk9MVU1FX05PUk0gYXMgbmV1dHJhbCBlbGVtZW50IG9mIGRpdmlzaW9uLiBUaGlzIGlzIG9ubHkgdmFsaWQKKyAqIGZvciBzb2Z0d2FyZSB2b2x1bWVzISBJZiBhIGRpdmlzaW9uIGJ5IHplcm8gaXMgdHJpZWQgdGhlIHJlc3VsdAorICogd2lsbCBiZSAwLiBcc2luY2UgMC45LjEzICovCitwYV92b2x1bWVfdCBwYV9zd192b2x1bWVfZGl2aWRlKHBhX3ZvbHVtZV90IGEsIHBhX3ZvbHVtZV90IGIpIFBBX0dDQ19DT05TVDsKKworLyoqIERpdmlkZSB0d28gcGVyLWNoYW5uZWwgdm9sdW1lcyBhbmQgcmV0dXJuIHRoZSByZXN1bHQgaW4KKyAqICpkZXN0LiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIHNvZnR3YXJlIHZvbHVtZXMhIGEsIGIKKyAqIGFuZCBkZXN0IG1heSBwb2ludCB0byB0aGUgc2FtZSBzdHJ1Y3R1cmUuIFxzaW5jZSAwLjkuMTMgKi8KK3BhX2N2b2x1bWUgKnBhX3N3X2N2b2x1bWVfZGl2aWRlKHBhX2N2b2x1bWUgKmRlc3QsIGNvbnN0IHBhX2N2b2x1bWUgKmEsIGNvbnN0IHBhX2N2b2x1bWUgKmIpOworCisvKiogRGl2aWRlIGEgcGVyLWNoYW5uZWwgdm9sdW1lIGJ5IGEgc2NhbGFyIHZvbHVtZSBhbmQgcmV0dXJuIHRoZQorICogcmVzdWx0IGluICpkZXN0LiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIHNvZnR3YXJlIHZvbHVtZXMhIGEKKyAqIGFuZCBkZXN0IG1heSBwb2ludCB0byB0aGUgc2FtZSBzdHJ1Y3R1cmUuIFxzaW5jZQorICogMC45LjE2ICovCitwYV9jdm9sdW1lICpwYV9zd19jdm9sdW1lX2RpdmlkZV9zY2FsYXIocGFfY3ZvbHVtZSAqZGVzdCwgY29uc3QgcGFfY3ZvbHVtZSAqYSwgcGFfdm9sdW1lX3QgYik7CisKKy8qKiBDb252ZXJ0IGEgZGVjaWJlbCB2YWx1ZSB0byBhIHZvbHVtZSAoYW1wbGl0dWRlLCBub3QgcG93ZXIpLiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIHNvZnR3YXJlIHZvbHVtZXMhICovCitwYV92b2x1bWVfdCBwYV9zd192b2x1bWVfZnJvbV9kQihkb3VibGUgZikgUEFfR0NDX0NPTlNUOworCisvKiogQ29udmVydCBhIHZvbHVtZSB0byBhIGRlY2liZWwgdmFsdWUgKGFtcGxpdHVkZSwgbm90IHBvd2VyKS4gVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBzb2Z0d2FyZSB2b2x1bWVzISAqLworZG91YmxlIHBhX3N3X3ZvbHVtZV90b19kQihwYV92b2x1bWVfdCB2KSBQQV9HQ0NfQ09OU1Q7CisKKy8qKiBDb252ZXJ0IGEgbGluZWFyIGZhY3RvciB0byBhIHZvbHVtZS4gIDAuMCBhbmQgbGVzcyBpcyBtdXRlZCB3aGlsZQorICogMS4wIGlzIFBBX1ZPTFVNRV9OT1JNLiAgVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBzb2Z0d2FyZSB2b2x1bWVzISAqLworcGFfdm9sdW1lX3QgcGFfc3dfdm9sdW1lX2Zyb21fbGluZWFyKGRvdWJsZSB2KSBQQV9HQ0NfQ09OU1Q7CisKKy8qKiBDb252ZXJ0IGEgdm9sdW1lIHRvIGEgbGluZWFyIGZhY3Rvci4gVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBzb2Z0d2FyZSB2b2x1bWVzISAqLworZG91YmxlIHBhX3N3X3ZvbHVtZV90b19saW5lYXIocGFfdm9sdW1lX3QgdikgUEFfR0NDX0NPTlNUOworCisjaWZkZWYgSU5GSU5JVFkKKyNkZWZpbmUgUEFfREVDSUJFTF9NSU5JTkZUWSAoKGRvdWJsZSkgLUlORklOSVRZKQorI2Vsc2UKKy8qKiBUaGlzIGZsb29yIHZhbHVlIGlzIHVzZWQgYXMgbWludXMgaW5maW5pdHkgd2hlbiB1c2luZyBwYV9zd192b2x1bWVfdG9fZEIoKSAvIHBhX3N3X3ZvbHVtZV9mcm9tX2RCKCkuICovCisjZGVmaW5lIFBBX0RFQ0lCRUxfTUlOSU5GVFkgKChkb3VibGUpIC0yMDAuMCkKKyNlbmRpZgorCisvKiogUmVtYXAgYSB2b2x1bWUgZnJvbSBvbmUgY2hhbm5lbCBtYXBwaW5nIHRvIGEgZGlmZmVyZW50IGNoYW5uZWwgbWFwcGluZy4gXHNpbmNlIDAuOS4xMiAqLworcGFfY3ZvbHVtZSAqcGFfY3ZvbHVtZV9yZW1hcChwYV9jdm9sdW1lICp2LCBjb25zdCBwYV9jaGFubmVsX21hcCAqZnJvbSwgY29uc3QgcGFfY2hhbm5lbF9tYXAgKnRvKTsKKworLyoqIFJldHVybiBub24temVybyBpZiB0aGUgc3BlY2lmaWVkIHZvbHVtZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlCisgKiBzcGVjaWZpZWQgc2FtcGxlIHNwZWMuIFxzaW5jZSAwLjkuMTMgKi8KK2ludCBwYV9jdm9sdW1lX2NvbXBhdGlibGUoY29uc3QgcGFfY3ZvbHVtZSAqdiwgY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNzKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiBub24temVybyBpZiB0aGUgc3BlY2lmaWVkIHZvbHVtZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlCisgKiBzcGVjaWZpZWQgc2FtcGxlIHNwZWMuIFxzaW5jZSAwLjkuMTUgKi8KK2ludCBwYV9jdm9sdW1lX2NvbXBhdGlibGVfd2l0aF9jaGFubmVsX21hcChjb25zdCBwYV9jdm9sdW1lICp2LCBjb25zdCBwYV9jaGFubmVsX21hcCAqY20pIFBBX0dDQ19QVVJFOworCisvKiogQ2FsY3VsYXRlIGEgJ2JhbGFuY2UnIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHZvbHVtZSB3aXRoIHRoZQorICogc3BlY2lmaWVkIGNoYW5uZWwgbWFwLiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgcmFuZ2UgZnJvbSAtMS4wZgorICogKGxlZnQpIHRvICsxLjBmIChyaWdodCkuIElmIG5vIGJhbGFuY2UgdmFsdWUgaXMgYXBwbGljYWJsZSB0byB0aGlzCisgKiBjaGFubmVsIG1hcCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYWx3YXlzIGJlIDAuMGYuIFNlZQorICogcGFfY2hhbm5lbF9tYXBfY2FuX2JhbGFuY2UoKS4gXHNpbmNlIDAuOS4xNSAqLworZmxvYXQgcGFfY3ZvbHVtZV9nZXRfYmFsYW5jZShjb25zdCBwYV9jdm9sdW1lICp2LCBjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwKSBQQV9HQ0NfUFVSRTsKKworLyoqIEFkanVzdCB0aGUgJ2JhbGFuY2UnIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHZvbHVtZSB3aXRoIHRoZQorICogc3BlY2lmaWVkIGNoYW5uZWwgbWFwLiB2IHdpbGwgYmUgbW9kaWZpZWQgaW4gcGxhY2UgYW5kCisgKiByZXR1cm5lZC4gVGhlIGJhbGFuY2UgaXMgYSB2YWx1ZSBiZXR3ZWVuIC0xLjBmIGFuZCArMS4wZi4gVGhpcworICogb3BlcmF0aW9uIG1pZ2h0IG5vdCBiZSByZXZlcnNpYmxlISBBbHNvLCBhZnRlciB0aGlzIGNhbGwKKyAqIHBhX2N2b2x1bWVfZ2V0X2JhbGFuY2UoKSBpcyBub3QgZ3VhcmFudGVlZCB0byBhY3R1YWxseSByZXR1cm4gdGhlCisgKiByZXF1ZXN0ZWQgYmFsYW5jZSB2YWx1ZSAoZS5nLiB3aGVuIHRoZSBpbnB1dCB2b2x1bWUgd2FzIHplcm8gYW55d2F5IGZvcgorICogYWxsIGNoYW5uZWxzKS4gSWYgbm8gYmFsYW5jZSB2YWx1ZSBpcyBhcHBsaWNhYmxlIHRvCisgKiB0aGlzIGNoYW5uZWwgbWFwIHRoZSB2b2x1bWUgd2lsbCBub3QgYmUgbW9kaWZpZWQuIFNlZQorICogcGFfY2hhbm5lbF9tYXBfY2FuX2JhbGFuY2UoKS4gXHNpbmNlIDAuOS4xNSAqLworcGFfY3ZvbHVtZSogcGFfY3ZvbHVtZV9zZXRfYmFsYW5jZShwYV9jdm9sdW1lICp2LCBjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwLCBmbG9hdCBuZXdfYmFsYW5jZSk7CisKKy8qKiBDYWxjdWxhdGUgYSAnZmFkZScgdmFsdWUgKGkuZS4gJ2JhbGFuY2UnIGJldHdlZW4gZnJvbnQgYW5kIHJlYXIpCisgKiBmb3IgdGhlIHNwZWNpZmllZCB2b2x1bWUgd2l0aCB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgbWFwLiBUaGUgcmV0dXJuCisgKiB2YWx1ZSB3aWxsIHJhbmdlIGZyb20gLTEuMGYgKHJlYXIpIHRvICsxLjBmIChsZWZ0KS4gSWYgbm8gZmFkZQorICogdmFsdWUgaXMgYXBwbGljYWJsZSB0byB0aGlzIGNoYW5uZWwgbWFwIHRoZSByZXR1cm4gdmFsdWUgd2lsbAorICogYWx3YXlzIGJlIDAuMGYuIFNlZSBwYV9jaGFubmVsX21hcF9jYW5fZmFkZSgpLiBcc2luY2UgMC45LjE1ICovCitmbG9hdCBwYV9jdm9sdW1lX2dldF9mYWRlKGNvbnN0IHBhX2N2b2x1bWUgKnYsIGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXApIFBBX0dDQ19QVVJFOworCisvKiogQWRqdXN0IHRoZSAnZmFkZScgdmFsdWUgKGkuZS4gJ2JhbGFuY2UnIGJldHdlZW4gZnJvbnQgYW5kIHJlYXIpCisgKiBmb3IgdGhlIHNwZWNpZmllZCB2b2x1bWUgd2l0aCB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgbWFwLiB2IHdpbGwgYmUKKyAqIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZC4gVGhlIGJhbGFuY2UgaXMgYSB2YWx1ZSBiZXR3ZWVuCisgKiAtMS4wZiBhbmQgKzEuMGYuIFRoaXMgb3BlcmF0aW9uIG1pZ2h0IG5vdCBiZSByZXZlcnNpYmxlISBBbHNvLAorICogYWZ0ZXIgdGhpcyBjYWxsIHBhX2N2b2x1bWVfZ2V0X2ZhZGUoKSBpcyBub3QgZ3VhcmFudGVlZCB0byBhY3R1YWxseQorICogcmV0dXJuIHRoZSByZXF1ZXN0ZWQgZmFkZSB2YWx1ZSAoZS5nLiB3aGVuIHRoZSBpbnB1dCB2b2x1bWUgd2FzCisgKiB6ZXJvIGFueXdheSBmb3IgYWxsIGNoYW5uZWxzKS4gSWYgbm8gZmFkZSB2YWx1ZSBpcyBhcHBsaWNhYmxlIHRvCisgKiB0aGlzIGNoYW5uZWwgbWFwIHRoZSB2b2x1bWUgd2lsbCBub3QgYmUgbW9kaWZpZWQuIFNlZQorICogcGFfY2hhbm5lbF9tYXBfY2FuX2ZhZGUoKS4gXHNpbmNlIDAuOS4xNSAqLworcGFfY3ZvbHVtZSogcGFfY3ZvbHVtZV9zZXRfZmFkZShwYV9jdm9sdW1lICp2LCBjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwLCBmbG9hdCBuZXdfZmFkZSk7CisKKy8qKiBTY2FsZSB0aGUgcGFzc2VkIHBhX2N2b2x1bWUgc3RydWN0dXJlIHNvIHRoYXQgdGhlIG1heGltdW0gdm9sdW1lCisgKiBvZiBhbGwgY2hhbm5lbHMgZXF1YWxzIG1heC4gVGhlIHByb3BvcnRpb25zIGJldHdlZW4gdGhlIGNoYW5uZWwKKyAqIHZvbHVtZXMgYXJlIGtlcHQuIFxzaW5jZSAwLjkuMTUgKi8KK3BhX2N2b2x1bWUqIHBhX2N2b2x1bWVfc2NhbGUocGFfY3ZvbHVtZSAqdiwgcGFfdm9sdW1lX3QgbWF4KTsKKworLyoqIFNjYWxlIHRoZSBwYXNzZWQgcGFfY3ZvbHVtZSBzdHJ1Y3R1cmUgc28gdGhhdCB0aGUgbWF4aW11bSB2b2x1bWUKKyAqIG9mIGFsbCBjaGFubmVscyBzZWxlY3RlZCB2aWEgY20vbWFzayBlcXVhbHMgbWF4LiBUaGlzIGFsc28gbW9kaWZpZXMKKyAqIHRoZSB2b2x1bWUgb2YgdGhvc2UgY2hhbm5lbHMgdGhhdCBhcmUgdW5tYXNrZWQuIFRoZSBwcm9wb3J0aW9ucworICogYmV0d2VlbiB0aGUgY2hhbm5lbCB2b2x1bWVzIGFyZSBrZXB0LiBcc2luY2UgMC45LjE2ICovCitwYV9jdm9sdW1lKiBwYV9jdm9sdW1lX3NjYWxlX21hc2socGFfY3ZvbHVtZSAqdiwgcGFfdm9sdW1lX3QgbWF4LCBwYV9jaGFubmVsX21hcCAqY20sIHBhX2NoYW5uZWxfcG9zaXRpb25fbWFza190IG1hc2spOworCisvKiogU2V0IHRoZSBwYXNzZWQgdm9sdW1lIHRvIGFsbCBjaGFubmVscyBhdCB0aGUgc3BlY2lmaWVkIGNoYW5uZWwKKyAqIHBvc2l0aW9uLiBXaWxsIHJldHVybiB0aGUgdXBkYXRlZCB2b2x1bWUgc3RydWN0LCBvciBOVUxMIGlmIHRoZXJlCisgKiBpcyBubyBjaGFubmVsIGF0IHRoZSBwb3NpdGlvbiBzcGVjaWZpZWQuIFlvdSBjYW4gY2hlY2sgaWYgYSBjaGFubmVsCisgKiBtYXAgaW5jbHVkZXMgYSBzcGVjaWZpYyBwb3NpdGlvbiBieSBjYWxsaW5nCisgKiBwYV9jaGFubmVsX21hcF9oYXNfcG9zaXRpb24oKS4gXHNpbmNlIDAuOS4xNiAqLworcGFfY3ZvbHVtZSogcGFfY3ZvbHVtZV9zZXRfcG9zaXRpb24ocGFfY3ZvbHVtZSAqY3YsIGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXAsIHBhX2NoYW5uZWxfcG9zaXRpb25fdCB0LCBwYV92b2x1bWVfdCB2KTsKKworLyoqIEdldCB0aGUgbWF4aW11bSB2b2x1bWUgb2YgYWxsIGNoYW5uZWxzIGF0IHRoZSBzcGVjaWZpZWQgY2hhbm5lbAorICogcG9zaXRpb24uIFdpbGwgcmV0dXJuIDAgaWYgdGhlcmUgaXMgbm8gY2hhbm5lbCBhdCB0aGUgcG9zaXRpb24KKyAqIHNwZWNpZmllZC4gWW91IGNhbiBjaGVjayBpZiBhIGNoYW5uZWwgbWFwIGluY2x1ZGVzIGEgc3BlY2lmaWMKKyAqIHBvc2l0aW9uIGJ5IGNhbGxpbmcgcGFfY2hhbm5lbF9tYXBfaGFzX3Bvc2l0aW9uKCkuIFxzaW5jZSAwLjkuMTYgKi8KK3BhX3ZvbHVtZV90IHBhX2N2b2x1bWVfZ2V0X3Bvc2l0aW9uKHBhX2N2b2x1bWUgKmN2LCBjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwLCBwYV9jaGFubmVsX3Bvc2l0aW9uX3QgdCkgUEFfR0NDX1BVUkU7CisKKy8qKiBUaGlzIGdvZXMgdGhyb3VnaCBhbGwgY2hhbm5lbHMgaW4gYSBhbmQgYiBhbmQgc2V0cyB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBpbiBkZXN0IHRvIHRoZSBncmVhdGVyIHZvbHVtZSBvZiBib3RoLiBhLCBiCisgKiBhbmQgZGVzdCBtYXkgcG9pbnQgdG8gdGhlIHNhbWUgc3RydWN0dXJlLiBcc2luY2UgMC45LjE2ICovCitwYV9jdm9sdW1lKiBwYV9jdm9sdW1lX21lcmdlKHBhX2N2b2x1bWUgKmRlc3QsIGNvbnN0IHBhX2N2b2x1bWUgKmEsIGNvbnN0IHBhX2N2b2x1bWUgKmIpOworCisvKiogSW5jcmVhc2UgdGhlIHZvbHVtZSBwYXNzZWQgaW4gYnkgJ2luYycsIGJ1dCBub3QgZXhjZWVkaW5nICdsaW1pdCcuCisgKiBUaGUgcHJvcG9ydGlvbnMgYmV0d2VlbiB0aGUgY2hhbm5lbHMgYXJlIGtlcHQuIFxzaW5jZSAwLjkuMTkgKi8KK3BhX2N2b2x1bWUqIHBhX2N2b2x1bWVfaW5jX2NsYW1wKHBhX2N2b2x1bWUgKnYsIHBhX3ZvbHVtZV90IGluYywgcGFfdm9sdW1lX3QgbGltaXQpOworCisvKiogSW5jcmVhc2UgdGhlIHZvbHVtZSBwYXNzZWQgaW4gYnkgJ2luYycuIFRoZSBwcm9wb3J0aW9ucyBiZXR3ZWVuCisgKiB0aGUgY2hhbm5lbHMgYXJlIGtlcHQuIFxzaW5jZSAwLjkuMTYgKi8KK3BhX2N2b2x1bWUqIHBhX2N2b2x1bWVfaW5jKHBhX2N2b2x1bWUgKnYsIHBhX3ZvbHVtZV90IGluYyk7CisKKy8qKiBJbmNyZWFzZSB0aGUgdm9sdW1lIHBhc3NlZCBpbiBieSAnaW5jJy4gVGhlIHByb3BvcnRpb25zIGJldHdlZW4KKyAqIHRoZSBjaGFubmVscyBhcmUga2VwdC4gXHNpbmNlIDAuOS4xNiAqLworcGFfY3ZvbHVtZSogcGFfY3ZvbHVtZV9kZWMocGFfY3ZvbHVtZSAqdiwgcGFfdm9sdW1lX3QgZGVjKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UveG1hbGxvYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS94bWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyMGQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UveG1hbGxvYy5oCkBAIC0wLDAgKzEsMTA3IEBACisjaWZuZGVmIGZvb21lbW9yeWhmb28KKyNkZWZpbmUgZm9vbWVtb3J5aGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvZ2NjbWFjcm8uaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBcZmlsZQorICogTWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zLgorICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogQWxsb2NhdGUgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMsIGp1c3QgbGlrZSBtYWxsb2MoKSBkb2VzLiBIb3dldmVyLCBpbiBjYXNlIG9mIE9PTSwgdGVybWluYXRlICovCit2b2lkKiBwYV94bWFsbG9jKHNpemVfdCBsKSBQQV9HQ0NfTUFMTE9DIFBBX0dDQ19BTExPQ19TSVpFKDEpOworCisvKiogU2FtZSBhcyBwYV94bWFsbG9jKCksIGJ1dCBpbml0aWFsaXplIGFsbG9jYXRlZCBtZW1vcnkgdG8gMCAqLwordm9pZCAqcGFfeG1hbGxvYzAoc2l6ZV90IGwpIFBBX0dDQ19NQUxMT0MgUEFfR0NDX0FMTE9DX1NJWkUoMSk7CisKKy8qKiAgVGhlIGNvbWJpbmF0aW9uIG9mIHBhX3htYWxsb2MoKSBhbmQgcmVhbGxvYygpICovCit2b2lkICpwYV94cmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKSBQQV9HQ0NfQUxMT0NfU0laRSgyKTsKKworLyoqIEZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLwordm9pZCBwYV94ZnJlZSh2b2lkICpwKTsKKworLyoqIER1cGxpY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZywgYWxsb2NhdGluZyBtZW1vcnkgd2l0aCBwYV94bWFsbG9jKCkgKi8KK2NoYXIgKnBhX3hzdHJkdXAoY29uc3QgY2hhciAqcykgUEFfR0NDX01BTExPQzsKKworLyoqIER1cGxpY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZywgYnV0IHRydW5jYXRlIGFmdGVyIGwgY2hhcmFjdGVycyAqLworY2hhciAqcGFfeHN0cm5kdXAoY29uc3QgY2hhciAqcywgc2l6ZV90IGwpIFBBX0dDQ19NQUxMT0M7CisKKy8qKiBEdXBsaWNhdGUgdGhlIHNwZWNpZmllZCBtZW1vcnkgYmxvY2sgKi8KK3ZvaWQqIHBhX3htZW1kdXAoY29uc3Qgdm9pZCAqcCwgc2l6ZV90IGwpIFBBX0dDQ19NQUxMT0MgUEFfR0NDX0FMTE9DX1NJWkUoMik7CisKKy8qKiBJbnRlcm5hbCBoZWxwZXIgZm9yIHBhX3huZXcoKSAqLworc3RhdGljIHZvaWQqIF9wYV94bmV3X2ludGVybmFsKHNpemVfdCBuLCBzaXplX3QgaykgUEFfR0NDX01BTExPQyBQQV9HQ0NfQUxMT0NfU0laRTIoMSwyKTsKKworc3RhdGljIGlubGluZSB2b2lkKiBfcGFfeG5ld19pbnRlcm5hbChzaXplX3Qgbiwgc2l6ZV90IGspIHsKKyAgICBhc3NlcnQobiA8IElOVF9NQVgvayk7CisgICAgcmV0dXJuIHBhX3htYWxsb2MobiprKTsKK30KKworLyoqIEFsbG9jYXRlIG4gbmV3IHN0cnVjdHVyZXMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLiAqLworI2RlZmluZSBwYV94bmV3KHR5cGUsIG4pICgodHlwZSopIF9wYV94bmV3X2ludGVybmFsKChuKSwgc2l6ZW9mKHR5cGUpKSkKKworLyoqIEludGVybmFsIGhlbHBlciBmb3IgcGFfeG5ldzAoKSAqLworc3RhdGljIHZvaWQqIF9wYV94bmV3MF9pbnRlcm5hbChzaXplX3Qgbiwgc2l6ZV90IGspIFBBX0dDQ19NQUxMT0MgUEFfR0NDX0FMTE9DX1NJWkUyKDEsMik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCogX3BhX3huZXcwX2ludGVybmFsKHNpemVfdCBuLCBzaXplX3QgaykgeworICAgIGFzc2VydChuIDwgSU5UX01BWC9rKTsKKyAgICByZXR1cm4gcGFfeG1hbGxvYzAobiprKTsKK30KKworLyoqIFNhbWUgYXMgcGFfeG5ldygpIGJ1dCBzZXQgdGhlIG1lbW9yeSB0byB6ZXJvICovCisjZGVmaW5lIHBhX3huZXcwKHR5cGUsIG4pICgodHlwZSopIF9wYV94bmV3MF9pbnRlcm5hbCgobiksIHNpemVvZih0eXBlKSkpCisKKy8qKiBJbnRlcm5hbCBoZWxwZXIgZm9yIHBhX3huZXcwKCkgKi8KK3N0YXRpYyB2b2lkKiBfcGFfeG5ld2R1cF9pbnRlcm5hbChjb25zdCB2b2lkICpwLCBzaXplX3Qgbiwgc2l6ZV90IGspIFBBX0dDQ19NQUxMT0MgUEFfR0NDX0FMTE9DX1NJWkUyKDIsMyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCogX3BhX3huZXdkdXBfaW50ZXJuYWwoY29uc3Qgdm9pZCAqcCwgc2l6ZV90IG4sIHNpemVfdCBrKSB7CisgICAgYXNzZXJ0KG4gPCBJTlRfTUFYL2spOworICAgIHJldHVybiBwYV94bWVtZHVwKHAsIG4qayk7Cit9CisKKy8qKiBTYW1lIGFzIHBhX3huZXcoKSBidXQgZHVwbGljYXRlIHRoZSBzcGVjaWZpZWQgZGF0YSAqLworI2RlZmluZSBwYV94bmV3ZHVwKHR5cGUsIHAsIG4pICgodHlwZSopIF9wYV94bmV3ZHVwX2ludGVybmFsKChwKSwgKG4pLCBzaXplb2YodHlwZSkpKQorCisvKiogSW50ZXJuYWwgaGVscGVyIGZvciBwYV94cmVuZXcoKSAqLworc3RhdGljIHZvaWQqIF9wYV94cmVuZXdfaW50ZXJuYWwodm9pZCAqcCwgc2l6ZV90IG4sIHNpemVfdCBrKSBQQV9HQ0NfTUFMTE9DIFBBX0dDQ19BTExPQ19TSVpFMigyLDMpOworCitzdGF0aWMgaW5saW5lIHZvaWQqIF9wYV94cmVuZXdfaW50ZXJuYWwodm9pZCAqcCwgc2l6ZV90IG4sIHNpemVfdCBrKSB7CisgICAgYXNzZXJ0KG4gPCBJTlRfTUFYL2spOworICAgIHJldHVybiBwYV94cmVhbGxvYyhwLCBuKmspOworfQorCisvKiogUmVhbGxvY2F0ZSBuIG5ldyBzdHJ1Y3R1cmVzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4gKi8KKyNkZWZpbmUgcGFfeHJlbmV3KHR5cGUsIHAsIG4pICgodHlwZSopIF9wYV94cmVuZXdfaW50ZXJuYWwocCwgKG4pLCBzaXplb2YodHlwZSkpKQorCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9wd2QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHdkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3NDEzMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHdkLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwxOTkyLDE5OTUtMjAwMSwyMDAzLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogOS4yLjIgVXNlciBEYXRhYmFzZSBBY2Nlc3MJPHB3ZC5oPgorICovCisKKyNpZm5kZWYJX1BXRF9ICisjZGVmaW5lCV9QV0RfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIFRoZSBTaW5nbGUgVW5peCBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCBzb21lIG1vcmUgdHlwZXMgYXJlCisgICBhdmFpbGFibGUgaGVyZS4gICovCisjIGlmbmRlZiBfX2dpZF90X2RlZmluZWQKK3R5cGVkZWYgX19naWRfdCBnaWRfdDsKKyMgIGRlZmluZSBfX2dpZF90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX191aWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fdWlkX3QgdWlkX3Q7CisjICBkZWZpbmUgX191aWRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworLyogVGhlIHBhc3N3ZCBzdHJ1Y3R1cmUuICAqLworc3RydWN0IHBhc3N3ZAoreworICBjaGFyICpwd19uYW1lOwkJLyogVXNlcm5hbWUuICAqLworICBjaGFyICpwd19wYXNzd2Q7CQkvKiBQYXNzd29yZC4gICovCisgIF9fdWlkX3QgcHdfdWlkOwkJLyogVXNlciBJRC4gICovCisgIF9fZ2lkX3QgcHdfZ2lkOwkJLyogR3JvdXAgSUQuICAqLworICBjaGFyICpwd19nZWNvczsJCS8qIFJlYWwgbmFtZS4gICovCisgIGNoYXIgKnB3X2RpcjsJCQkvKiBIb21lIGRpcmVjdG9yeS4gICovCisgIGNoYXIgKnB3X3NoZWxsOwkJLyogU2hlbGwgcHJvZ3JhbS4gICovCit9OworCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKyMgZGVmaW5lIF9fbmVlZF9GSUxFCisjIGluY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBSZXdpbmQgdGhlIHBhc3N3b3JkLWZpbGUgc3RyZWFtLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHNldHB3ZW50ICh2b2lkKTsKKworLyogQ2xvc2UgdGhlIHBhc3N3b3JkLWZpbGUgc3RyZWFtLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGVuZHB3ZW50ICh2b2lkKTsKKworLyogUmVhZCBhbiBlbnRyeSBmcm9tIHRoZSBwYXNzd29yZC1maWxlIHN0cmVhbSwgb3BlbmluZyBpdCBpZiBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBwYXNzd2QgKmdldHB3ZW50ICh2b2lkKTsKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfU1ZJRAorLyogUmVhZCBhbiBlbnRyeSBmcm9tIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBwYXNzd2QgKmZnZXRwd2VudCAoRklMRSAqX19zdHJlYW0pOworCisvKiBXcml0ZSB0aGUgZ2l2ZW4gZW50cnkgb250byB0aGUgZ2l2ZW4gc3RyZWFtLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHB1dHB3ZW50IChfX2NvbnN0IHN0cnVjdCBwYXNzd2QgKl9fcmVzdHJpY3QgX19wLAorCQkgICAgIEZJTEUgKl9fcmVzdHJpY3QgX19mKTsKKyNlbmRpZgorCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IHdpdGggYSBtYXRjaGluZyB1c2VyIElELgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgcGFzc3dkICpnZXRwd3VpZCAoX191aWRfdCBfX3VpZCk7CisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIHVzZXJuYW1lLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgcGFzc3dkICpnZXRwd25hbSAoX19jb25zdCBjaGFyICpfX25hbWUpOworCisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKworIyBpZmRlZiBfX1VTRV9NSVNDCisvKiBSZWFzb25hYmxlIHZhbHVlIGZvciB0aGUgYnVmZmVyIHNpemVkIHVzZWQgaW4gdGhlIHJlZW50cmFudAorICAgZnVuY3Rpb25zIGJlbG93LiAgQnV0IGJldHRlciB1c2UgYHN5c2NvbmYnLiAgKi8KKyMgIGRlZmluZSBOU1NfQlVGTEVOX1BBU1NXRAkxMDI0CisjIGVuZGlmCisKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiBzb21lIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUuCisKKyAgIFBMRUFTRSBOT1RFOiB0aGUgYGdldHB3ZW50X3InIGZ1bmN0aW9uIGlzIG5vdCAoeWV0KSBzdGFuZGFyZGl6ZWQuCisgICBUaGUgaW50ZXJmYWNlIG1heSBjaGFuZ2UgaW4gbGF0ZXIgdmVyc2lvbnMgb2YgdGhpcyBsaWJyYXJ5LiAgQnV0CisgICB0aGUgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIGZvbGxvd2luZyB0aGUgcHJpbmNpcGFscyB1c2VkIGZvciB0aGUKKyAgIG90aGVyIHJlZW50cmFudCBmdW5jdGlvbnMgc28gdGhlIGNoYW5jZXMgYXJlIGdvb2QgdGhpcyBpcyB3aGF0IHRoZQorICAgUE9TSVggcGVvcGxlIHdvdWxkIGNob29zZS4gICovCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfTUlTQworLyogVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRwd2VudF9yIChzdHJ1Y3QgcGFzc3dkICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IHBhc3N3ZCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworIyBlbmRpZgorCitleHRlcm4gaW50IGdldHB3dWlkX3IgKF9fdWlkX3QgX191aWQsCisJCSAgICAgICBzdHJ1Y3QgcGFzc3dkICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IHBhc3N3ZCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworCitleHRlcm4gaW50IGdldHB3bmFtX3IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCSAgICAgICBzdHJ1Y3QgcGFzc3dkICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IHBhc3N3ZCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworCisKKyMgaWZkZWYJX19VU0VfU1ZJRAorLyogUmVhZCBhbiBlbnRyeSBmcm9tIFNUUkVBTS4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN0YW5kYXJkaXplZCBhbmQKKyAgIHByb2JhYmx5IG5ldmVyIHdpbGwuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmdldHB3ZW50X3IgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCQlzdHJ1Y3QgcGFzc3dkICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkJY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkJc3RydWN0IHBhc3N3ZCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworIyBlbmRpZgorCisjZW5kaWYJLyogUE9TSVggb3IgcmVlbnRyYW50ICovCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFJlLWNvbnN0cnVjdCB0aGUgcGFzc3dvcmQtZmlsZSBsaW5lIGZvciB0aGUgZ2l2ZW4gdWlkCisgICBpbiB0aGUgZ2l2ZW4gYnVmZmVyLiAgVGhpcyBrbm93cyB0aGUgZm9ybWF0IHRoYXQgdGhlIGNhbGxlcgorICAgd2lsbCBleHBlY3QsIGJ1dCB0aGlzIG5lZWQgbm90IGJlIHRoZSBmb3JtYXQgb2YgdGhlIHBhc3N3b3JkIGZpbGUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0cHcgKF9fdWlkX3QgX191aWQsIGNoYXIgKl9fYnVmZmVyKTsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcHdkLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JkbWEvaWJfdXNlcl9jbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9yZG1hL2liX3VzZXJfY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzkwMTRhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9yZG1hL2liX3VzZXJfY20uaApAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIElCX1VTRVJfQ01fSAorI2RlZmluZSBJQl9VU0VSX0NNX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8cmRtYS9pYl91c2VyX3NhLmg+CisKKyNkZWZpbmUgSUJfVVNFUl9DTV9BQklfVkVSU0lPTiA1CisKK2VudW0geworCUlCX1VTRVJfQ01fQ01EX0NSRUFURV9JRCwKKwlJQl9VU0VSX0NNX0NNRF9ERVNUUk9ZX0lELAorCUlCX1VTRVJfQ01fQ01EX0FUVFJfSUQsCisKKwlJQl9VU0VSX0NNX0NNRF9MSVNURU4sCisJSUJfVVNFUl9DTV9DTURfTk9USUZZLAorCisJSUJfVVNFUl9DTV9DTURfU0VORF9SRVEsCisJSUJfVVNFUl9DTV9DTURfU0VORF9SRVAsCisJSUJfVVNFUl9DTV9DTURfU0VORF9SVFUsCisJSUJfVVNFUl9DTV9DTURfU0VORF9EUkVRLAorCUlCX1VTRVJfQ01fQ01EX1NFTkRfRFJFUCwKKwlJQl9VU0VSX0NNX0NNRF9TRU5EX1JFSiwKKwlJQl9VU0VSX0NNX0NNRF9TRU5EX01SQSwKKwlJQl9VU0VSX0NNX0NNRF9TRU5EX0xBUCwKKwlJQl9VU0VSX0NNX0NNRF9TRU5EX0FQUiwKKwlJQl9VU0VSX0NNX0NNRF9TRU5EX1NJRFJfUkVRLAorCUlCX1VTRVJfQ01fQ01EX1NFTkRfU0lEUl9SRVAsCisKKwlJQl9VU0VSX0NNX0NNRF9FVkVOVCwKKwlJQl9VU0VSX0NNX0NNRF9JTklUX1FQX0FUVFIsCit9OworLyoKKyAqIGNvbW1hbmQgQUJJIHN0cnVjdHVyZXMuCisgKi8KK3N0cnVjdCBpYl91Y21fY21kX2hkciB7CisJX191MzIgY21kOworCV9fdTE2IGluOworCV9fdTE2IG91dDsKK307CisKK3N0cnVjdCBpYl91Y21fY3JlYXRlX2lkIHsKKwlfX3U2NCB1aWQ7CisJX191NjQgcmVzcG9uc2U7Cit9OworCitzdHJ1Y3QgaWJfdWNtX2NyZWF0ZV9pZF9yZXNwIHsKKwlfX3UzMiBpZDsKK307CisKK3N0cnVjdCBpYl91Y21fZGVzdHJveV9pZCB7CisJX191NjQgcmVzcG9uc2U7CisJX191MzIgaWQ7CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdWNtX2Rlc3Ryb3lfaWRfcmVzcCB7CisJX191MzIgZXZlbnRzX3JlcG9ydGVkOworfTsKKworc3RydWN0IGliX3VjbV9hdHRyX2lkIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBpZDsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91Y21fYXR0cl9pZF9yZXNwIHsKKwlfX2JlNjQgc2VydmljZV9pZDsKKwlfX2JlNjQgc2VydmljZV9tYXNrOworCV9fYmUzMiBsb2NhbF9pZDsKKwlfX2JlMzIgcmVtb3RlX2lkOworfTsKKworc3RydWN0IGliX3VjbV9pbml0X3FwX2F0dHIgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIGlkOworCV9fdTMyIHFwX3N0YXRlOworfTsKKworc3RydWN0IGliX3VjbV9saXN0ZW4geworCV9fYmU2NCBzZXJ2aWNlX2lkOworCV9fYmU2NCBzZXJ2aWNlX21hc2s7CisJX191MzIgaWQ7CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdWNtX25vdGlmeSB7CisJX191MzIgaWQ7CisJX191MzIgZXZlbnQ7Cit9OworCitzdHJ1Y3QgaWJfdWNtX3ByaXZhdGVfZGF0YSB7CisJX191NjQgZGF0YTsKKwlfX3UzMiBpZDsKKwlfX3U4ICBsZW47CisJX191OCAgcmVzZXJ2ZWRbM107Cit9OworCitzdHJ1Y3QgaWJfdWNtX3JlcSB7CisJX191MzIgaWQ7CisJX191MzIgcXBuOworCV9fdTMyIHFwX3R5cGU7CisJX191MzIgcHNuOworCV9fYmU2NCBzaWQ7CisJX191NjQgZGF0YTsKKwlfX3U2NCBwcmltYXJ5X3BhdGg7CisJX191NjQgYWx0ZXJuYXRlX3BhdGg7CisJX191OCAgbGVuOworCV9fdTggIHBlZXJfdG9fcGVlcjsKKwlfX3U4ICByZXNwb25kZXJfcmVzb3VyY2VzOworCV9fdTggIGluaXRpYXRvcl9kZXB0aDsKKwlfX3U4ICByZW1vdGVfY21fcmVzcG9uc2VfdGltZW91dDsKKwlfX3U4ICBmbG93X2NvbnRyb2w7CisJX191OCAgbG9jYWxfY21fcmVzcG9uc2VfdGltZW91dDsKKwlfX3U4ICByZXRyeV9jb3VudDsKKwlfX3U4ICBybnJfcmV0cnlfY291bnQ7CisJX191OCAgbWF4X2NtX3JldHJpZXM7CisJX191OCAgc3JxOworCV9fdTggIHJlc2VydmVkWzVdOworfTsKKworc3RydWN0IGliX3VjbV9yZXAgeworCV9fdTY0IHVpZDsKKwlfX3U2NCBkYXRhOworCV9fdTMyIGlkOworCV9fdTMyIHFwbjsKKwlfX3UzMiBwc247CisJX191OCAgbGVuOworCV9fdTggIHJlc3BvbmRlcl9yZXNvdXJjZXM7CisJX191OCAgaW5pdGlhdG9yX2RlcHRoOworCV9fdTggIHRhcmdldF9hY2tfZGVsYXk7CisJX191OCAgZmFpbG92ZXJfYWNjZXB0ZWQ7CisJX191OCAgZmxvd19jb250cm9sOworCV9fdTggIHJucl9yZXRyeV9jb3VudDsKKwlfX3U4ICBzcnE7CisJX191OCAgcmVzZXJ2ZWRbNF07Cit9OworCitzdHJ1Y3QgaWJfdWNtX2luZm8geworCV9fdTMyIGlkOworCV9fdTMyIHN0YXR1czsKKwlfX3U2NCBpbmZvOworCV9fdTY0IGRhdGE7CisJX191OCAgaW5mb19sZW47CisJX191OCAgZGF0YV9sZW47CisJX191OCAgcmVzZXJ2ZWRbNl07Cit9OworCitzdHJ1Y3QgaWJfdWNtX21yYSB7CisJX191NjQgZGF0YTsKKwlfX3UzMiBpZDsKKwlfX3U4ICBsZW47CisJX191OCAgdGltZW91dDsKKwlfX3U4ICByZXNlcnZlZFsyXTsKK307CisKK3N0cnVjdCBpYl91Y21fbGFwIHsKKwlfX3U2NCBwYXRoOworCV9fdTY0IGRhdGE7CisJX191MzIgaWQ7CisJX191OCAgbGVuOworCV9fdTggIHJlc2VydmVkWzNdOworfTsKKworc3RydWN0IGliX3VjbV9zaWRyX3JlcSB7CisJX191MzIgaWQ7CisJX191MzIgdGltZW91dDsKKwlfX2JlNjQgc2lkOworCV9fdTY0IGRhdGE7CisJX191NjQgcGF0aDsKKwlfX3UxNiByZXNlcnZlZF9wa2V5OworCV9fdTggIGxlbjsKKwlfX3U4ICBtYXhfY21fcmV0cmllczsKKwlfX3U4ICByZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCBpYl91Y21fc2lkcl9yZXAgeworCV9fdTMyIGlkOworCV9fdTMyIHFwbjsKKwlfX3UzMiBxa2V5OworCV9fdTMyIHN0YXR1czsKKwlfX3U2NCBpbmZvOworCV9fdTY0IGRhdGE7CisJX191OCAgaW5mb19sZW47CisJX191OCAgZGF0YV9sZW47CisJX191OCAgcmVzZXJ2ZWRbNl07Cit9OworLyoKKyAqIGV2ZW50IG5vdGlmaWNhdGlvbiBBQkkgc3RydWN0dXJlcy4KKyAqLworc3RydWN0IGliX3VjbV9ldmVudF9nZXQgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTY0IGRhdGE7CisJX191NjQgaW5mbzsKKwlfX3U4ICBkYXRhX2xlbjsKKwlfX3U4ICBpbmZvX2xlbjsKKwlfX3U4ICByZXNlcnZlZFs2XTsKK307CisKK3N0cnVjdCBpYl91Y21fcmVxX2V2ZW50X3Jlc3AgeworCXN0cnVjdCBpYl91c2VyX3BhdGhfcmVjIHByaW1hcnlfcGF0aDsKKwlzdHJ1Y3QgaWJfdXNlcl9wYXRoX3JlYyBhbHRlcm5hdGVfcGF0aDsKKwlfX2JlNjQgICAgICAgICAgICAgICAgIHJlbW90ZV9jYV9ndWlkOworCV9fdTMyICAgICAgICAgICAgICAgICAgcmVtb3RlX3FrZXk7CisJX191MzIgICAgICAgICAgICAgICAgICByZW1vdGVfcXBuOworCV9fdTMyICAgICAgICAgICAgICAgICAgcXBfdHlwZTsKKwlfX3UzMiAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nX3BzbjsKKwlfX3U4ICByZXNwb25kZXJfcmVzb3VyY2VzOworCV9fdTggIGluaXRpYXRvcl9kZXB0aDsKKwlfX3U4ICBsb2NhbF9jbV9yZXNwb25zZV90aW1lb3V0OworCV9fdTggIGZsb3dfY29udHJvbDsKKwlfX3U4ICByZW1vdGVfY21fcmVzcG9uc2VfdGltZW91dDsKKwlfX3U4ICByZXRyeV9jb3VudDsKKwlfX3U4ICBybnJfcmV0cnlfY291bnQ7CisJX191OCAgc3JxOworCV9fdTggIHBvcnQ7CisJX191OCAgcmVzZXJ2ZWRbN107Cit9OworCitzdHJ1Y3QgaWJfdWNtX3JlcF9ldmVudF9yZXNwIHsKKwlfX2JlNjQgcmVtb3RlX2NhX2d1aWQ7CisJX191MzIgcmVtb3RlX3FrZXk7CisJX191MzIgcmVtb3RlX3FwbjsKKwlfX3UzMiBzdGFydGluZ19wc247CisJX191OCAgcmVzcG9uZGVyX3Jlc291cmNlczsKKwlfX3U4ICBpbml0aWF0b3JfZGVwdGg7CisJX191OCAgdGFyZ2V0X2Fja19kZWxheTsKKwlfX3U4ICBmYWlsb3Zlcl9hY2NlcHRlZDsKKwlfX3U4ICBmbG93X2NvbnRyb2w7CisJX191OCAgcm5yX3JldHJ5X2NvdW50OworCV9fdTggIHNycTsKKwlfX3U4ICByZXNlcnZlZFs1XTsKK307CisKK3N0cnVjdCBpYl91Y21fcmVqX2V2ZW50X3Jlc3AgeworCV9fdTMyIHJlYXNvbjsKKwkvKiBhcmkgaW4gaWJfdWNtX2V2ZW50X2dldCBpbmZvIGZpZWxkLiAqLworfTsKKworc3RydWN0IGliX3VjbV9tcmFfZXZlbnRfcmVzcCB7CisJX191OCAgdGltZW91dDsKKwlfX3U4ICByZXNlcnZlZFszXTsKK307CisKK3N0cnVjdCBpYl91Y21fbGFwX2V2ZW50X3Jlc3AgeworCXN0cnVjdCBpYl91c2VyX3BhdGhfcmVjIHBhdGg7Cit9OworCitzdHJ1Y3QgaWJfdWNtX2Fwcl9ldmVudF9yZXNwIHsKKwlfX3UzMiBzdGF0dXM7CisJLyogYXByIGluZm8gaW4gaWJfdWNtX2V2ZW50X2dldCBpbmZvIGZpZWxkLiAqLworfTsKKworc3RydWN0IGliX3VjbV9zaWRyX3JlcV9ldmVudF9yZXNwIHsKKwlfX3UxNiBwa2V5OworCV9fdTggIHBvcnQ7CisJX191OCAgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdWNtX3NpZHJfcmVwX2V2ZW50X3Jlc3AgeworCV9fdTMyIHN0YXR1czsKKwlfX3UzMiBxa2V5OworCV9fdTMyIHFwbjsKKwkvKiBpbmZvIGluIGliX3VjbV9ldmVudF9nZXQgaW5mbyBmaWVsZC4gKi8KK307CisKKyNkZWZpbmUgSUJfVUNNX1BSRVNfREFUQSAgICAgIDB4MDEKKyNkZWZpbmUgSUJfVUNNX1BSRVNfSU5GTyAgICAgIDB4MDIKKyNkZWZpbmUgSUJfVUNNX1BSRVNfUFJJTUFSWSAgIDB4MDQKKyNkZWZpbmUgSUJfVUNNX1BSRVNfQUxURVJOQVRFIDB4MDgKKworc3RydWN0IGliX3VjbV9ldmVudF9yZXNwIHsKKwlfX3U2NCB1aWQ7CisJX191MzIgaWQ7CisJX191MzIgZXZlbnQ7CisJX191MzIgcHJlc2VudDsKKwlfX3UzMiByZXNlcnZlZDsKKwl1bmlvbiB7CisJCXN0cnVjdCBpYl91Y21fcmVxX2V2ZW50X3Jlc3AgcmVxX3Jlc3A7CisJCXN0cnVjdCBpYl91Y21fcmVwX2V2ZW50X3Jlc3AgcmVwX3Jlc3A7CisJCXN0cnVjdCBpYl91Y21fcmVqX2V2ZW50X3Jlc3AgcmVqX3Jlc3A7CisJCXN0cnVjdCBpYl91Y21fbXJhX2V2ZW50X3Jlc3AgbXJhX3Jlc3A7CisJCXN0cnVjdCBpYl91Y21fbGFwX2V2ZW50X3Jlc3AgbGFwX3Jlc3A7CisJCXN0cnVjdCBpYl91Y21fYXByX2V2ZW50X3Jlc3AgYXByX3Jlc3A7CisKKwkJc3RydWN0IGliX3VjbV9zaWRyX3JlcV9ldmVudF9yZXNwIHNpZHJfcmVxX3Jlc3A7CisJCXN0cnVjdCBpYl91Y21fc2lkcl9yZXBfZXZlbnRfcmVzcCBzaWRyX3JlcF9yZXNwOworCisJCV9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3N0YXR1czsKKwl9IHU7Cit9OworCisjZW5kaWYgLyogSUJfVVNFUl9DTV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JkbWEvaWJfdXNlcl9tYWQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9pYl91c2VyX21hZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZmNlMWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JkbWEvaWJfdXNlcl9tYWQuaApAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBWb2x0YWlyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBJQl9VU0VSX01BRF9ICisjZGVmaW5lIElCX1VTRVJfTUFEX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworLyoKKyAqIEluY3JlbWVudCB0aGlzIHZhbHVlIGlmIGFueSBjaGFuZ2VzIHRoYXQgYnJlYWsgdXNlcnNwYWNlIEFCSQorICogY29tcGF0aWJpbGl0eSBhcmUgbWFkZS4KKyAqLworI2RlZmluZSBJQl9VU0VSX01BRF9BQklfVkVSU0lPTgk1CisKKy8qCisgKiBNYWtlIHN1cmUgdGhhdCBhbGwgc3RydWN0cyBkZWZpbmVkIGluIHRoaXMgZmlsZSByZW1haW4gbGFpZCBvdXQgc28KKyAqIHRoYXQgdGhleSBwYWNrIHRoZSBzYW1lIHdheSBvbiAzMi1iaXQgYW5kIDY0LWJpdCBhcmNoaXRlY3R1cmVzICh0bworICogYXZvaWQgaW5jb21wYXRpYmlsaXR5IGJldHdlZW4gMzItYml0IHVzZXJzcGFjZSBhbmQgNjQtYml0IGtlcm5lbHMpLgorICovCisKKy8qKgorICogaWJfdXNlcl9tYWRfaGRyX29sZCAtIE9sZCB2ZXJzaW9uIG9mIE1BRCBwYWNrZXQgaGVhZGVyIHdpdGhvdXQgcGtleV9pbmRleAorICogQGlkIC0gSUQgb2YgYWdlbnQgTUFEIHJlY2VpdmVkIHdpdGgvdG8gYmUgc2VudCB3aXRoCisgKiBAc3RhdHVzIC0gMCBvbiBzdWNjZXNzZnVsIHJlY2VpdmUsIEVUSU1FRE9VVCBpZiBubyByZXNwb25zZQorICogICByZWNlaXZlZCAodHJhbnNhY3Rpb24gSUQgaW4gZGF0YVtdIHdpbGwgYmUgc2V0IHRvIFRJRCBvZiBvcmlnaW5hbAorICogICByZXF1ZXN0KSAoaWdub3JlZCBvbiBzZW5kKQorICogQHRpbWVvdXRfbXMgLSBNaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgcmVzcG9uc2UgKHVuc2V0IG9uIHJlY2VpdmUpCisgKiBAcmV0cmllcyAtIE51bWJlciBvZiBhdXRvbWF0aWMgcmV0cmllcyB0byBhdHRlbXB0CisgKiBAcXBuIC0gUmVtb3RlIFFQIG51bWJlciByZWNlaXZlZCBmcm9tL3RvIGJlIHNlbnQgdG8KKyAqIEBxa2V5IC0gUmVtb3RlIFFfS2V5IHRvIGJlIHNlbnQgd2l0aCAodW5zZXQgb24gcmVjZWl2ZSkKKyAqIEBsaWQgLSBSZW1vdGUgbGlkIHJlY2VpdmVkIGZyb20vdG8gYmUgc2VudCB0bworICogQHNsIC0gU2VydmljZSBsZXZlbCByZWNlaXZlZCB3aXRoL3RvIGJlIHNlbnQgd2l0aAorICogQHBhdGhfYml0cyAtIExvY2FsIHBhdGggYml0cyByZWNlaXZlZCB3aXRoL3RvIGJlIHNlbnQgd2l0aAorICogQGdyaF9wcmVzZW50IC0gSWYgc2V0LCBHUkggd2FzIHJlY2VpdmVkL3Nob3VsZCBiZSBzZW50CisgKiBAZ2lkX2luZGV4IC0gTG9jYWwgR0lEIGluZGV4IHRvIHNlbmQgd2l0aCAodW5zZXQgb24gcmVjZWl2ZSkKKyAqIEBob3BfbGltaXQgLSBIb3AgbGltaXQgaW4gR1JICisgKiBAdHJhZmZpY19jbGFzcyAtIFRyYWZmaWMgY2xhc3MgaW4gR1JICisgKiBAZ2lkIC0gUmVtb3RlIEdJRCBpbiBHUkgKKyAqIEBmbG93X2xhYmVsIC0gRmxvdyBsYWJlbCBpbiBHUkgKKyAqLworc3RydWN0IGliX3VzZXJfbWFkX2hkcl9vbGQgeworCV9fdTMyCWlkOworCV9fdTMyCXN0YXR1czsKKwlfX3UzMgl0aW1lb3V0X21zOworCV9fdTMyCXJldHJpZXM7CisJX191MzIJbGVuZ3RoOworCV9fYmUzMglxcG47CisJX19iZTMyICBxa2V5OworCV9fYmUxNglsaWQ7CisJX191OAlzbDsKKwlfX3U4CXBhdGhfYml0czsKKwlfX3U4CWdyaF9wcmVzZW50OworCV9fdTgJZ2lkX2luZGV4OworCV9fdTgJaG9wX2xpbWl0OworCV9fdTgJdHJhZmZpY19jbGFzczsKKwlfX3U4CWdpZFsxNl07CisJX19iZTMyCWZsb3dfbGFiZWw7Cit9OworCisvKioKKyAqIGliX3VzZXJfbWFkX2hkciAtIE1BRCBwYWNrZXQgaGVhZGVyCisgKiAgIFRoaXMgbGF5b3V0IGFsbG93cyBzcGVjaWZ5aW5nL3JlY2VpdmluZyB0aGUgUF9LZXkgaW5kZXguICBUbyB1c2UKKyAqICAgdGhpcyBjYXBhYmlsaXR5LCBhbiBhcHBsaWNhdGlvbiBtdXN0IGNhbGwgdGhlCisgKiAgIElCX1VTRVJfTUFEX0VOQUJMRV9QS0VZIGlvY3RsIG9uIHRoZSB1c2VyIE1BRCBmaWxlIGhhbmRsZSBiZWZvcmUKKyAqICAgYW55IG90aGVyIGFjdGlvbnMgd2l0aCB0aGUgZmlsZSBoYW5kbGUuCisgKiBAaWQgLSBJRCBvZiBhZ2VudCBNQUQgcmVjZWl2ZWQgd2l0aC90byBiZSBzZW50IHdpdGgKKyAqIEBzdGF0dXMgLSAwIG9uIHN1Y2Nlc3NmdWwgcmVjZWl2ZSwgRVRJTUVET1VUIGlmIG5vIHJlc3BvbnNlCisgKiAgIHJlY2VpdmVkICh0cmFuc2FjdGlvbiBJRCBpbiBkYXRhW10gd2lsbCBiZSBzZXQgdG8gVElEIG9mIG9yaWdpbmFsCisgKiAgIHJlcXVlc3QpIChpZ25vcmVkIG9uIHNlbmQpCisgKiBAdGltZW91dF9tcyAtIE1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciByZXNwb25zZSAodW5zZXQgb24gcmVjZWl2ZSkKKyAqIEByZXRyaWVzIC0gTnVtYmVyIG9mIGF1dG9tYXRpYyByZXRyaWVzIHRvIGF0dGVtcHQKKyAqIEBxcG4gLSBSZW1vdGUgUVAgbnVtYmVyIHJlY2VpdmVkIGZyb20vdG8gYmUgc2VudCB0bworICogQHFrZXkgLSBSZW1vdGUgUV9LZXkgdG8gYmUgc2VudCB3aXRoICh1bnNldCBvbiByZWNlaXZlKQorICogQGxpZCAtIFJlbW90ZSBsaWQgcmVjZWl2ZWQgZnJvbS90byBiZSBzZW50IHRvCisgKiBAc2wgLSBTZXJ2aWNlIGxldmVsIHJlY2VpdmVkIHdpdGgvdG8gYmUgc2VudCB3aXRoCisgKiBAcGF0aF9iaXRzIC0gTG9jYWwgcGF0aCBiaXRzIHJlY2VpdmVkIHdpdGgvdG8gYmUgc2VudCB3aXRoCisgKiBAZ3JoX3ByZXNlbnQgLSBJZiBzZXQsIEdSSCB3YXMgcmVjZWl2ZWQvc2hvdWxkIGJlIHNlbnQKKyAqIEBnaWRfaW5kZXggLSBMb2NhbCBHSUQgaW5kZXggdG8gc2VuZCB3aXRoICh1bnNldCBvbiByZWNlaXZlKQorICogQGhvcF9saW1pdCAtIEhvcCBsaW1pdCBpbiBHUkgKKyAqIEB0cmFmZmljX2NsYXNzIC0gVHJhZmZpYyBjbGFzcyBpbiBHUkgKKyAqIEBnaWQgLSBSZW1vdGUgR0lEIGluIEdSSAorICogQGZsb3dfbGFiZWwgLSBGbG93IGxhYmVsIGluIEdSSAorICogQHBrZXlfaW5kZXggLSBQX0tleSBpbmRleAorICovCitzdHJ1Y3QgaWJfdXNlcl9tYWRfaGRyIHsKKwlfX3UzMglpZDsKKwlfX3UzMglzdGF0dXM7CisJX191MzIJdGltZW91dF9tczsKKwlfX3UzMglyZXRyaWVzOworCV9fdTMyCWxlbmd0aDsKKwlfX2JlMzIJcXBuOworCV9fYmUzMiAgcWtleTsKKwlfX2JlMTYJbGlkOworCV9fdTgJc2w7CisJX191OAlwYXRoX2JpdHM7CisJX191OAlncmhfcHJlc2VudDsKKwlfX3U4CWdpZF9pbmRleDsKKwlfX3U4CWhvcF9saW1pdDsKKwlfX3U4CXRyYWZmaWNfY2xhc3M7CisJX191OAlnaWRbMTZdOworCV9fYmUzMglmbG93X2xhYmVsOworCV9fdTE2CXBrZXlfaW5kZXg7CisJX191OAlyZXNlcnZlZFs2XTsKK307CisKKy8qKgorICogaWJfdXNlcl9tYWQgLSBNQUQgcGFja2V0CisgKiBAaGRyIC0gTUFEIHBhY2tldCBoZWFkZXIKKyAqIEBkYXRhIC0gQ29udGVudHMgb2YgTUFECisgKgorICovCitzdHJ1Y3QgaWJfdXNlcl9tYWQgeworCXN0cnVjdCBpYl91c2VyX21hZF9oZHIgaGRyOworCV9fdTY0CWRhdGFbMF07Cit9OworCisvKgorICogRWFybGllciB2ZXJzaW9ucyBvZiB0aGlzIGludGVyZmFjZSBkZWZpbml0aW9uIGRlY2xhcmVkIHRoZQorICogbWV0aG9kX21hc2tbXSBtZW1iZXIgYXMgYW4gYXJyYXkgb2YgX191MzIgYnV0IHRyZWF0ZWQgaXQgYXMgYQorICogYml0bWFwIG1hZGUgdXAgb2YgbG9uZ3MgaW4gdGhlIGtlcm5lbC4gIFRoaXMgYW1iaWd1aXR5IG1lYW50IHRoYXQKKyAqIDMyLWJpdCBiaWctZW5kaWFuIGFwcGxpY2F0aW9ucyB0aGF0IGNhbiBydW4gb24gYm90aCAzMi1iaXQgYW5kCisgKiA2NC1iaXQga2VybmVscyBoYWQgbm8gY29uc2lzdGVudCBBQkkgdG8gcmVseSBvbiwgYW5kIDY0LWJpdAorICogYmlnLWVuZGlhbiBhcHBsaWNhdGlvbnMgdGhhdCB0cmVhdGVkIG1ldGhvZF9tYXNrIGFzIGJlaW5nIG1hZGUgdXAKKyAqIG9mIDMyLWJpdCB3b3JkcyB3b3VsZCBoYXZlIHRoZWlyIGJpdG1hcCBtaXNpbnRlcnByZXRlZC4KKyAqCisgKiBUbyBjbGVhciB1cCB0aGlzIGNvbmZ1c2lvbiwgd2UgY2hhbmdlIHRoZSBkZWNsYXJhdGlvbiBvZgorICogbWV0aG9kX21hc2tbXSB0byB1c2UgdW5zaWduZWQgbG9uZyBhbmQgaGFuZGxlIHRoZSBjb252ZXJzaW9uIGZyb20KKyAqIDMyLWJpdCB1c2Vyc3BhY2UgdG8gNjQtYml0IGtlcm5lbCBmb3IgYmlnLWVuZGlhbiBzeXN0ZW1zIGluIHRoZQorICogY29tcGF0X2lvY3RsIG1ldGhvZC4gIFVuZm9ydHVuYXRlbHksIHRvIGtlZXAgdGhlIHN0cnVjdHVyZSBsYXlvdXQKKyAqIHRoZSBzYW1lLCB3ZSBuZWVkIHRoZSBtZXRob2RfbWFza1tdIGFycmF5IHRvIGJlIGFsaWduZWQgb25seSB0byA0CisgKiBieXRlcyBldmVuIHdoZW4gbG9uZyBpcyA2NCBiaXRzLCB3aGljaCBmb3JjZXMgdXMgaW50byB0aGlzIHVnbHkKKyAqIHR5cGVkZWYuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkgcGFja2VkX3Vsb25nOworI2RlZmluZSBJQl9VU0VSX01BRF9MT05HU19QRVJfTUVUSE9EX01BU0sgKDEyOCAvICg4ICogc2l6ZW9mIChsb25nKSkpCisKKy8qKgorICogaWJfdXNlcl9tYWRfcmVnX3JlcSAtIE1BRCByZWdpc3RyYXRpb24gcmVxdWVzdAorICogQGlkIC0gU2V0IGJ5IHRoZSBrZXJuZWw7IHVzZWQgdG8gaWRlbnRpZnkgYWdlbnQgaW4gZnV0dXJlIHJlcXVlc3RzLgorICogQHFwbiAtIFF1ZXVlIHBhaXIgbnVtYmVyOyBtdXN0IGJlIDAgb3IgMS4KKyAqIEBtZXRob2RfbWFzayAtIFRoZSBjYWxsZXIgd2lsbCByZWNlaXZlIHVuc29saWNpdGVkIE1BRHMgZm9yIGFueSBtZXRob2QKKyAqICAgd2hlcmUgQG1ldGhvZF9tYXNrID0gMS4KKyAqIEBtZ210X2NsYXNzIC0gSW5kaWNhdGVzIHdoaWNoIG1hbmFnZW1lbnQgY2xhc3Mgb2YgTUFEcyBzaG91bGQgYmUgcmVjZWl2ZQorICogICBieSB0aGUgY2FsbGVyLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHJlcXVpcmVkIGlmIHRoZSB1c2VyIHdpc2hlcyB0bworICogICByZWNlaXZlIHVuc29saWNpdGVkIE1BRHMsIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgMC4KKyAqIEBtZ210X2NsYXNzX3ZlcnNpb24gLSBJbmRpY2F0ZXMgd2hpY2ggdmVyc2lvbiBvZiBNQURzIGZvciB0aGUgZ2l2ZW4KKyAqICAgbWFuYWdlbWVudCBjbGFzcyB0byByZWNlaXZlLgorICogQG91aTogSW5kaWNhdGVzIElFRUUgT1VJIHdoZW4gbWdtdF9jbGFzcyBpcyBhIHZlbmRvciBjbGFzcworICogICBpbiB0aGUgcmFuZ2UgZnJvbSAweDMwIHRvIDB4NGYuIE90aGVyd2lzZSBub3QgdXNlZC4KKyAqIEBybXBwX3ZlcnNpb246IElmIHNldCwgaW5kaWNhdGVzIHRoZSBSTVBQIHZlcnNpb24gdXNlZC4KKyAqCisgKi8KK3N0cnVjdCBpYl91c2VyX21hZF9yZWdfcmVxIHsKKwlfX3UzMglpZDsKKwlwYWNrZWRfdWxvbmcgbWV0aG9kX21hc2tbSUJfVVNFUl9NQURfTE9OR1NfUEVSX01FVEhPRF9NQVNLXTsKKwlfX3U4CXFwbjsKKwlfX3U4CW1nbXRfY2xhc3M7CisJX191OAltZ210X2NsYXNzX3ZlcnNpb247CisJX191OCAgICBvdWlbM107CisJX191OAlybXBwX3ZlcnNpb247Cit9OworCisjZGVmaW5lIElCX0lPQ1RMX01BR0lDCQkweDFiCisKKyNkZWZpbmUgSUJfVVNFUl9NQURfUkVHSVNURVJfQUdFTlQJX0lPV1IoSUJfSU9DVExfTUFHSUMsIDEsIFwKKwkJCQkJICAgICAgc3RydWN0IGliX3VzZXJfbWFkX3JlZ19yZXEpCisKKyNkZWZpbmUgSUJfVVNFUl9NQURfVU5SRUdJU1RFUl9BR0VOVAlfSU9XKElCX0lPQ1RMX01BR0lDLCAyLCBfX3UzMikKKworI2RlZmluZSBJQl9VU0VSX01BRF9FTkFCTEVfUEtFWQkJX0lPKElCX0lPQ1RMX01BR0lDLCAzKQorCisjZW5kaWYgLyogSUJfVVNFUl9NQURfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9yZG1hL2liX3VzZXJfc2EuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9pYl91c2VyX3NhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjN2M5YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9pYl91c2VyX3NhLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIElCX1VTRVJfU0FfSAorI2RlZmluZSBJQl9VU0VSX1NBX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geworCUlCX1BBVEhfR01QCQk9IDEsCisJSUJfUEFUSF9QUklNQVJZCQk9ICgxPDwxKSwKKwlJQl9QQVRIX0FMVEVSTkFURQk9ICgxPDwyKSwKKwlJQl9QQVRIX09VVEJPVU5ECT0gKDE8PDMpLAorCUlCX1BBVEhfSU5CT1VORAkJPSAoMTw8NCksCisJSUJfUEFUSF9JTkJPVU5EX1JFVkVSU0UgPSAoMTw8NSksCisJSUJfUEFUSF9CSURJUkVDVElPTkFMCT0gSUJfUEFUSF9PVVRCT1VORCB8IElCX1BBVEhfSU5CT1VORF9SRVZFUlNFCit9OworCitzdHJ1Y3QgaWJfcGF0aF9yZWNfZGF0YSB7CisJX191MzIJZmxhZ3M7CisJX191MzIJcmVzZXJ2ZWQ7CisJX191MzIJcGF0aF9yZWNbMTZdOworfTsKKworc3RydWN0IGliX3VzZXJfcGF0aF9yZWMgeworCV9fdTgJZGdpZFsxNl07CisJX191OAlzZ2lkWzE2XTsKKwlfX2JlMTYJZGxpZDsKKwlfX2JlMTYJc2xpZDsKKwlfX3UzMglyYXdfdHJhZmZpYzsKKwlfX2JlMzIJZmxvd19sYWJlbDsKKwlfX3UzMglyZXZlcnNpYmxlOworCV9fdTMyCW10dTsKKwlfX2JlMTYJcGtleTsKKwlfX3U4CWhvcF9saW1pdDsKKwlfX3U4CXRyYWZmaWNfY2xhc3M7CisJX191OAludW1iX3BhdGg7CisJX191OAlzbDsKKwlfX3U4CW10dV9zZWxlY3RvcjsKKwlfX3U4CXJhdGVfc2VsZWN0b3I7CisJX191OAlyYXRlOworCV9fdTgJcGFja2V0X2xpZmVfdGltZV9zZWxlY3RvcjsKKwlfX3U4CXBhY2tldF9saWZlX3RpbWU7CisJX191OAlwcmVmZXJlbmNlOworfTsKKworI2VuZGlmIC8qIElCX1VTRVJfU0FfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9yZG1hL2liX3VzZXJfdmVyYnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9pYl91c2VyX3ZlcmJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhYmEzYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9pYl91c2VyX3ZlcmJzLmgKQEAgLTAsMCArMSw3MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgUGF0aFNjYWxlLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2IE1lbGxhbm94IFRlY2hub2xvZ2llcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIElCX1VTRVJfVkVSQlNfSAorI2RlZmluZSBJQl9VU0VSX1ZFUkJTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBJbmNyZW1lbnQgdGhpcyB2YWx1ZSBpZiBhbnkgY2hhbmdlcyB0aGF0IGJyZWFrIHVzZXJzcGFjZSBBQkkKKyAqIGNvbXBhdGliaWxpdHkgYXJlIG1hZGUuCisgKi8KKyNkZWZpbmUgSUJfVVNFUl9WRVJCU19BQklfVkVSU0lPTgk2CisKK2VudW0geworCUlCX1VTRVJfVkVSQlNfQ01EX0dFVF9DT05URVhULAorCUlCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX0RFVklDRSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9QT1JULAorCUlCX1VTRVJfVkVSQlNfQ01EX0FMTE9DX1BELAorCUlCX1VTRVJfVkVSQlNfQ01EX0RFQUxMT0NfUEQsCisJSUJfVVNFUl9WRVJCU19DTURfQ1JFQVRFX0FILAorCUlCX1VTRVJfVkVSQlNfQ01EX01PRElGWV9BSCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9BSCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERVNUUk9ZX0FILAorCUlCX1VTRVJfVkVSQlNfQ01EX1JFR19NUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9SRUdfU01SLAorCUlCX1VTRVJfVkVSQlNfQ01EX1JFUkVHX01SLAorCUlCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX01SLAorCUlCX1VTRVJfVkVSQlNfQ01EX0RFUkVHX01SLAorCUlCX1VTRVJfVkVSQlNfQ01EX0FMTE9DX01XLAorCUlCX1VTRVJfVkVSQlNfQ01EX0JJTkRfTVcsCisJSUJfVVNFUl9WRVJCU19DTURfREVBTExPQ19NVywKKwlJQl9VU0VSX1ZFUkJTX0NNRF9DUkVBVEVfQ09NUF9DSEFOTkVMLAorCUlCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9DUSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9SRVNJWkVfQ1EsCisJSUJfVVNFUl9WRVJCU19DTURfREVTVFJPWV9DUSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9QT0xMX0NRLAorCUlCX1VTRVJfVkVSQlNfQ01EX1BFRUtfQ1EsCisJSUJfVVNFUl9WRVJCU19DTURfUkVRX05PVElGWV9DUSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9DUkVBVEVfUVAsCisJSUJfVVNFUl9WRVJCU19DTURfUVVFUllfUVAsCisJSUJfVVNFUl9WRVJCU19DTURfTU9ESUZZX1FQLAorCUlCX1VTRVJfVkVSQlNfQ01EX0RFU1RST1lfUVAsCisJSUJfVVNFUl9WRVJCU19DTURfUE9TVF9TRU5ELAorCUlCX1VTRVJfVkVSQlNfQ01EX1BPU1RfUkVDViwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9BVFRBQ0hfTUNBU1QsCisJSUJfVVNFUl9WRVJCU19DTURfREVUQUNIX01DQVNULAorCUlCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9TUlEsCisJSUJfVVNFUl9WRVJCU19DTURfTU9ESUZZX1NSUSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9TUlEsCisJSUJfVVNFUl9WRVJCU19DTURfREVTVFJPWV9TUlEsCisJSUJfVVNFUl9WRVJCU19DTURfUE9TVF9TUlFfUkVDViwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9PUEVOX1hSQ0QsCisJSUJfVVNFUl9WRVJCU19DTURfQ0xPU0VfWFJDRCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9DUkVBVEVfWFNSUSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9PUEVOX1FQCit9OworCisvKgorICogTWFrZSBzdXJlIHRoYXQgYWxsIHN0cnVjdHMgZGVmaW5lZCBpbiB0aGlzIGZpbGUgcmVtYWluIGxhaWQgb3V0IHNvCisgKiB0aGF0IHRoZXkgcGFjayB0aGUgc2FtZSB3YXkgb24gMzItYml0IGFuZCA2NC1iaXQgYXJjaGl0ZWN0dXJlcyAodG8KKyAqIGF2b2lkIGluY29tcGF0aWJpbGl0eSBiZXR3ZWVuIDMyLWJpdCB1c2Vyc3BhY2UgYW5kIDY0LWJpdCBrZXJuZWxzKS4KKyAqIFNwZWNpZmljYWxseToKKyAqICAtIERvIG5vdCB1c2UgcG9pbnRlciB0eXBlcyAtLSBwYXNzIHBvaW50ZXJzIGluIF9fdTY0IGluc3RlYWQuCisgKiAgLSBNYWtlIHN1cmUgdGhhdCBhbnkgc3RydWN0dXJlIGxhcmdlciB0aGFuIDQgYnl0ZXMgaXMgcGFkZGVkIHRvIGEKKyAqICAgIG11bHRpcGxlIG9mIDggYnl0ZXMuICBPdGhlcndpc2UgdGhlIHN0cnVjdHVyZSBzaXplIHdpbGwgYmUKKyAqICAgIGRpZmZlcmVudCBiZXR3ZWVuIDMyLWJpdCBhbmQgNjQtYml0IGFyY2hpdGVjdHVyZXMuCisgKi8KKworc3RydWN0IGliX3V2ZXJic19hc3luY19ldmVudF9kZXNjIHsKKwlfX3U2NCBlbGVtZW50OworCV9fdTMyIGV2ZW50X3R5cGU7CS8qIGVudW0gaWJfZXZlbnRfdHlwZSAqLworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IGliX3V2ZXJic19jb21wX2V2ZW50X2Rlc2MgeworCV9fdTY0IGNxX2hhbmRsZTsKK307CisKKy8qCisgKiBBbGwgY29tbWFuZHMgZnJvbSB1c2Vyc3BhY2Ugc2hvdWxkIHN0YXJ0IHdpdGggYSBfX3UzMiBjb21tYW5kIGZpZWxkCisgKiBmb2xsb3dlZCBieSBfX3UxNiBpbl93b3JkcyBhbmQgb3V0X3dvcmRzIGZpZWxkcyAod2hpY2ggZ2l2ZSB0aGUKKyAqIGxlbmd0aCBvZiB0aGUgY29tbWFuZCBibG9jayBhbmQgcmVzcG9uc2UgYnVmZmVyIGlmIGFueSBpbiAzMi1iaXQKKyAqIHdvcmRzKS4gIFRoZSBrZXJuZWwgZHJpdmVyIHdpbGwgcmVhZCB0aGVzZSBmaWVsZHMgZmlyc3QgYW5kIHJlYWQKKyAqIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kIHN0cnVjdCBiYXNlZCBvbiB0aGVzZSB2YWx1ZS4KKyAqLworCitzdHJ1Y3QgaWJfdXZlcmJzX2NtZF9oZHIgeworCV9fdTMyIGNvbW1hbmQ7CisJX191MTYgaW5fd29yZHM7CisJX191MTYgb3V0X3dvcmRzOworfTsKKworc3RydWN0IGliX3V2ZXJic19nZXRfY29udGV4dCB7CisJX191NjQgcmVzcG9uc2U7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2dldF9jb250ZXh0X3Jlc3AgeworCV9fdTMyIGFzeW5jX2ZkOworCV9fdTMyIG51bV9jb21wX3ZlY3RvcnM7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X2RldmljZSB7CisJX191NjQgcmVzcG9uc2U7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X2RldmljZV9yZXNwIHsKKwlfX3U2NCBmd192ZXI7CisJX19iZTY0IG5vZGVfZ3VpZDsKKwlfX2JlNjQgc3lzX2ltYWdlX2d1aWQ7CisJX191NjQgbWF4X21yX3NpemU7CisJX191NjQgcGFnZV9zaXplX2NhcDsKKwlfX3UzMiB2ZW5kb3JfaWQ7CisJX191MzIgdmVuZG9yX3BhcnRfaWQ7CisJX191MzIgaHdfdmVyOworCV9fdTMyIG1heF9xcDsKKwlfX3UzMiBtYXhfcXBfd3I7CisJX191MzIgZGV2aWNlX2NhcF9mbGFnczsKKwlfX3UzMiBtYXhfc2dlOworCV9fdTMyIG1heF9zZ2VfcmQ7CisJX191MzIgbWF4X2NxOworCV9fdTMyIG1heF9jcWU7CisJX191MzIgbWF4X21yOworCV9fdTMyIG1heF9wZDsKKwlfX3UzMiBtYXhfcXBfcmRfYXRvbTsKKwlfX3UzMiBtYXhfZWVfcmRfYXRvbTsKKwlfX3UzMiBtYXhfcmVzX3JkX2F0b207CisJX191MzIgbWF4X3FwX2luaXRfcmRfYXRvbTsKKwlfX3UzMiBtYXhfZWVfaW5pdF9yZF9hdG9tOworCV9fdTMyIGF0b21pY19jYXA7CisJX191MzIgbWF4X2VlOworCV9fdTMyIG1heF9yZGQ7CisJX191MzIgbWF4X213OworCV9fdTMyIG1heF9yYXdfaXB2Nl9xcDsKKwlfX3UzMiBtYXhfcmF3X2V0aHlfcXA7CisJX191MzIgbWF4X21jYXN0X2dycDsKKwlfX3UzMiBtYXhfbWNhc3RfcXBfYXR0YWNoOworCV9fdTMyIG1heF90b3RhbF9tY2FzdF9xcF9hdHRhY2g7CisJX191MzIgbWF4X2FoOworCV9fdTMyIG1heF9mbXI7CisJX191MzIgbWF4X21hcF9wZXJfZm1yOworCV9fdTMyIG1heF9zcnE7CisJX191MzIgbWF4X3NycV93cjsKKwlfX3UzMiBtYXhfc3JxX3NnZTsKKwlfX3UxNiBtYXhfcGtleXM7CisJX191OCAgbG9jYWxfY2FfYWNrX2RlbGF5OworCV9fdTggIHBoeXNfcG9ydF9jbnQ7CisJX191OCAgcmVzZXJ2ZWRbNF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BvcnQgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTggIHBvcnRfbnVtOworCV9fdTggIHJlc2VydmVkWzddOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9wb3J0X3Jlc3AgeworCV9fdTMyIHBvcnRfY2FwX2ZsYWdzOworCV9fdTMyIG1heF9tc2dfc3o7CisJX191MzIgYmFkX3BrZXlfY250cjsKKwlfX3UzMiBxa2V5X3Zpb2xfY250cjsKKwlfX3UzMiBnaWRfdGJsX2xlbjsKKwlfX3UxNiBwa2V5X3RibF9sZW47CisJX191MTYgbGlkOworCV9fdTE2IHNtX2xpZDsKKwlfX3U4ICBzdGF0ZTsKKwlfX3U4ICBtYXhfbXR1OworCV9fdTggIGFjdGl2ZV9tdHU7CisJX191OCAgbG1jOworCV9fdTggIG1heF92bF9udW07CisJX191OCAgc21fc2w7CisJX191OCAgc3VibmV0X3RpbWVvdXQ7CisJX191OCAgaW5pdF90eXBlX3JlcGx5OworCV9fdTggIGFjdGl2ZV93aWR0aDsKKwlfX3U4ICBhY3RpdmVfc3BlZWQ7CisJX191OCAgcGh5c19zdGF0ZTsKKwlfX3U4ICBsaW5rX2xheWVyOworCV9fdTggIHJlc2VydmVkWzJdOworfTsKKworc3RydWN0IGliX3V2ZXJic19hbGxvY19wZCB7CisJX191NjQgcmVzcG9uc2U7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2FsbG9jX3BkX3Jlc3AgeworCV9fdTMyIHBkX2hhbmRsZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGVhbGxvY19wZCB7CisJX191MzIgcGRfaGFuZGxlOworfTsKKworc3RydWN0IGliX3V2ZXJic19vcGVuX3hyY2QgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIGZkOworCV9fdTMyIG9mbGFnczsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfb3Blbl94cmNkX3Jlc3AgeworCV9fdTMyIHhyY2RfaGFuZGxlOworfTsKKworc3RydWN0IGliX3V2ZXJic19jbG9zZV94cmNkIHsKKwlfX3UzMiB4cmNkX2hhbmRsZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcmVnX21yIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCBzdGFydDsKKwlfX3U2NCBsZW5ndGg7CisJX191NjQgaGNhX3ZhOworCV9fdTMyIHBkX2hhbmRsZTsKKwlfX3UzMiBhY2Nlc3NfZmxhZ3M7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3JlZ19tcl9yZXNwIHsKKwlfX3UzMiBtcl9oYW5kbGU7CisJX191MzIgbGtleTsKKwlfX3UzMiBya2V5OworfTsKKworc3RydWN0IGliX3V2ZXJic19kZXJlZ19tciB7CisJX191MzIgbXJfaGFuZGxlOworfTsKKworc3RydWN0IGliX3V2ZXJic19jcmVhdGVfY29tcF9jaGFubmVsIHsKKwlfX3U2NCByZXNwb25zZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX2NvbXBfY2hhbm5lbF9yZXNwIHsKKwlfX3UzMiBmZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX2NxIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCB1c2VyX2hhbmRsZTsKKwlfX3UzMiBjcWU7CisJX191MzIgY29tcF92ZWN0b3I7CisJX19zMzIgY29tcF9jaGFubmVsOworCV9fdTMyIHJlc2VydmVkOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19jcmVhdGVfY3FfcmVzcCB7CisJX191MzIgY3FfaGFuZGxlOworCV9fdTMyIGNxZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcmVzaXplX2NxIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBjcV9oYW5kbGU7CisJX191MzIgY3FlOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19yZXNpemVfY3FfcmVzcCB7CisJX191MzIgY3FlOworCV9fdTMyIHJlc2VydmVkOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19wb2xsX2NxIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBjcV9oYW5kbGU7CisJX191MzIgbmU7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3djIHsKKwlfX3U2NCB3cl9pZDsKKwlfX3UzMiBzdGF0dXM7CisJX191MzIgb3Bjb2RlOworCV9fdTMyIHZlbmRvcl9lcnI7CisJX191MzIgYnl0ZV9sZW47CisJdW5pb24geworCQlfX3UzMiBpbW1fZGF0YTsKKwkJX191MzIgaW52YWxpZGF0ZV9ya2V5OworCX0gZXg7CisJX191MzIgcXBfbnVtOworCV9fdTMyIHNyY19xcDsKKwlfX3UzMiB3Y19mbGFnczsKKwlfX3UxNiBwa2V5X2luZGV4OworCV9fdTE2IHNsaWQ7CisJX191OCBzbDsKKwlfX3U4IGRsaWRfcGF0aF9iaXRzOworCV9fdTggcG9ydF9udW07CisJX191OCByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcG9sbF9jcV9yZXNwIHsKKwlfX3UzMiBjb3VudDsKKwlfX3UzMiByZXNlcnZlZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX3djIHdjWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19yZXFfbm90aWZ5X2NxIHsKKwlfX3UzMiBjcV9oYW5kbGU7CisJX191MzIgc29saWNpdGVkX29ubHk7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfY3EgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIGNxX2hhbmRsZTsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9jcV9yZXNwIHsKKwlfX3UzMiBjb21wX2V2ZW50c19yZXBvcnRlZDsKKwlfX3UzMiBhc3luY19ldmVudHNfcmVwb3J0ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2dsb2JhbF9yb3V0ZSB7CisJX191OCAgZGdpZFsxNl07CisJX191MzIgZmxvd19sYWJlbDsKKwlfX3U4ICBzZ2lkX2luZGV4OworCV9fdTggIGhvcF9saW1pdDsKKwlfX3U4ICB0cmFmZmljX2NsYXNzOworCV9fdTggIHJlc2VydmVkOworfTsKKworc3RydWN0IGliX3V2ZXJic19haF9hdHRyIHsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2dsb2JhbF9yb3V0ZSBncmg7CisJX191MTYgZGxpZDsKKwlfX3U4ICBzbDsKKwlfX3U4ICBzcmNfcGF0aF9iaXRzOworCV9fdTggIHN0YXRpY19yYXRlOworCV9fdTggIGlzX2dsb2JhbDsKKwlfX3U4ICBwb3J0X251bTsKKwlfX3U4ICByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXBfYXR0ciB7CisJX191MzIJcXBfYXR0cl9tYXNrOworCV9fdTMyCXFwX3N0YXRlOworCV9fdTMyCWN1cl9xcF9zdGF0ZTsKKwlfX3UzMglwYXRoX210dTsKKwlfX3UzMglwYXRoX21pZ19zdGF0ZTsKKwlfX3UzMglxa2V5OworCV9fdTMyCXJxX3BzbjsKKwlfX3UzMglzcV9wc247CisJX191MzIJZGVzdF9xcF9udW07CisJX191MzIJcXBfYWNjZXNzX2ZsYWdzOworCisJc3RydWN0IGliX3V2ZXJic19haF9hdHRyIGFoX2F0dHI7CisJc3RydWN0IGliX3V2ZXJic19haF9hdHRyIGFsdF9haF9hdHRyOworCisJLyogaWJfcXBfY2FwICovCisJX191MzIJbWF4X3NlbmRfd3I7CisJX191MzIJbWF4X3JlY3Zfd3I7CisJX191MzIJbWF4X3NlbmRfc2dlOworCV9fdTMyCW1heF9yZWN2X3NnZTsKKwlfX3UzMgltYXhfaW5saW5lX2RhdGE7CisKKwlfX3UxNglwa2V5X2luZGV4OworCV9fdTE2CWFsdF9wa2V5X2luZGV4OworCV9fdTgJZW5fc3FkX2FzeW5jX25vdGlmeTsKKwlfX3U4CXNxX2RyYWluaW5nOworCV9fdTgJbWF4X3JkX2F0b21pYzsKKwlfX3U4CW1heF9kZXN0X3JkX2F0b21pYzsKKwlfX3U4CW1pbl9ybnJfdGltZXI7CisJX191OAlwb3J0X251bTsKKwlfX3U4CXRpbWVvdXQ7CisJX191OAlyZXRyeV9jbnQ7CisJX191OAlybnJfcmV0cnk7CisJX191OAlhbHRfcG9ydF9udW07CisJX191OAlhbHRfdGltZW91dDsKKwlfX3U4CXJlc2VydmVkWzVdOworfTsKKworc3RydWN0IGliX3V2ZXJic19jcmVhdGVfcXAgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTY0IHVzZXJfaGFuZGxlOworCV9fdTMyIHBkX2hhbmRsZTsKKwlfX3UzMiBzZW5kX2NxX2hhbmRsZTsKKwlfX3UzMiByZWN2X2NxX2hhbmRsZTsKKwlfX3UzMiBzcnFfaGFuZGxlOworCV9fdTMyIG1heF9zZW5kX3dyOworCV9fdTMyIG1heF9yZWN2X3dyOworCV9fdTMyIG1heF9zZW5kX3NnZTsKKwlfX3UzMiBtYXhfcmVjdl9zZ2U7CisJX191MzIgbWF4X2lubGluZV9kYXRhOworCV9fdTggIHNxX3NpZ19hbGw7CisJX191OCAgcXBfdHlwZTsKKwlfX3U4ICBpc19zcnE7CisJX191OCAgcmVzZXJ2ZWQ7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX29wZW5fcXAgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTY0IHVzZXJfaGFuZGxlOworCV9fdTMyIHBkX2hhbmRsZTsKKwlfX3UzMiBxcG47CisJX191OCAgcXBfdHlwZTsKKwlfX3U4ICByZXNlcnZlZFs3XTsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKKy8qIGFsc28gdXNlZCBmb3Igb3BlbiByZXNwb25zZSAqLworc3RydWN0IGliX3V2ZXJic19jcmVhdGVfcXBfcmVzcCB7CisJX191MzIgcXBfaGFuZGxlOworCV9fdTMyIHFwbjsKKwlfX3UzMiBtYXhfc2VuZF93cjsKKwlfX3UzMiBtYXhfcmVjdl93cjsKKwlfX3UzMiBtYXhfc2VuZF9zZ2U7CisJX191MzIgbWF4X3JlY3Zfc2dlOworCV9fdTMyIG1heF9pbmxpbmVfZGF0YTsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKKy8qCisgKiBUaGlzIHN0cnVjdCBuZWVkcyB0byByZW1haW4gYSBtdWx0aXBsZSBvZiA4IGJ5dGVzIHRvIGtlZXAgdGhlCisgKiBhbGlnbm1lbnQgb2YgdGhlIG1vZGlmeSBRUCBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgaWJfdXZlcmJzX3FwX2Rlc3QgeworCV9fdTggIGRnaWRbMTZdOworCV9fdTMyIGZsb3dfbGFiZWw7CisJX191MTYgZGxpZDsKKwlfX3UxNiByZXNlcnZlZDsKKwlfX3U4ICBzZ2lkX2luZGV4OworCV9fdTggIGhvcF9saW1pdDsKKwlfX3U4ICB0cmFmZmljX2NsYXNzOworCV9fdTggIHNsOworCV9fdTggIHNyY19wYXRoX2JpdHM7CisJX191OCAgc3RhdGljX3JhdGU7CisJX191OCAgaXNfZ2xvYmFsOworCV9fdTggIHBvcnRfbnVtOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9xcCB7CisJX191NjQgcmVzcG9uc2U7CisJX191MzIgcXBfaGFuZGxlOworCV9fdTMyIGF0dHJfbWFzazsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfcXBfcmVzcCB7CisJc3RydWN0IGliX3V2ZXJic19xcF9kZXN0IGRlc3Q7CisJc3RydWN0IGliX3V2ZXJic19xcF9kZXN0IGFsdF9kZXN0OworCV9fdTMyIG1heF9zZW5kX3dyOworCV9fdTMyIG1heF9yZWN2X3dyOworCV9fdTMyIG1heF9zZW5kX3NnZTsKKwlfX3UzMiBtYXhfcmVjdl9zZ2U7CisJX191MzIgbWF4X2lubGluZV9kYXRhOworCV9fdTMyIHFrZXk7CisJX191MzIgcnFfcHNuOworCV9fdTMyIHNxX3BzbjsKKwlfX3UzMiBkZXN0X3FwX251bTsKKwlfX3UzMiBxcF9hY2Nlc3NfZmxhZ3M7CisJX191MTYgcGtleV9pbmRleDsKKwlfX3UxNiBhbHRfcGtleV9pbmRleDsKKwlfX3U4ICBxcF9zdGF0ZTsKKwlfX3U4ICBjdXJfcXBfc3RhdGU7CisJX191OCAgcGF0aF9tdHU7CisJX191OCAgcGF0aF9taWdfc3RhdGU7CisJX191OCAgc3FfZHJhaW5pbmc7CisJX191OCAgbWF4X3JkX2F0b21pYzsKKwlfX3U4ICBtYXhfZGVzdF9yZF9hdG9taWM7CisJX191OCAgbWluX3Jucl90aW1lcjsKKwlfX3U4ICBwb3J0X251bTsKKwlfX3U4ICB0aW1lb3V0OworCV9fdTggIHJldHJ5X2NudDsKKwlfX3U4ICBybnJfcmV0cnk7CisJX191OCAgYWx0X3BvcnRfbnVtOworCV9fdTggIGFsdF90aW1lb3V0OworCV9fdTggIHNxX3NpZ19hbGw7CisJX191OCAgcmVzZXJ2ZWRbNV07CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX21vZGlmeV9xcCB7CisJc3RydWN0IGliX3V2ZXJic19xcF9kZXN0IGRlc3Q7CisJc3RydWN0IGliX3V2ZXJic19xcF9kZXN0IGFsdF9kZXN0OworCV9fdTMyIHFwX2hhbmRsZTsKKwlfX3UzMiBhdHRyX21hc2s7CisJX191MzIgcWtleTsKKwlfX3UzMiBycV9wc247CisJX191MzIgc3FfcHNuOworCV9fdTMyIGRlc3RfcXBfbnVtOworCV9fdTMyIHFwX2FjY2Vzc19mbGFnczsKKwlfX3UxNiBwa2V5X2luZGV4OworCV9fdTE2IGFsdF9wa2V5X2luZGV4OworCV9fdTggIHFwX3N0YXRlOworCV9fdTggIGN1cl9xcF9zdGF0ZTsKKwlfX3U4ICBwYXRoX210dTsKKwlfX3U4ICBwYXRoX21pZ19zdGF0ZTsKKwlfX3U4ICBlbl9zcWRfYXN5bmNfbm90aWZ5OworCV9fdTggIG1heF9yZF9hdG9taWM7CisJX191OCAgbWF4X2Rlc3RfcmRfYXRvbWljOworCV9fdTggIG1pbl9ybnJfdGltZXI7CisJX191OCAgcG9ydF9udW07CisJX191OCAgdGltZW91dDsKKwlfX3U4ICByZXRyeV9jbnQ7CisJX191OCAgcm5yX3JldHJ5OworCV9fdTggIGFsdF9wb3J0X251bTsKKwlfX3U4ICBhbHRfdGltZW91dDsKKwlfX3U4ICByZXNlcnZlZFsyXTsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfbW9kaWZ5X3FwX3Jlc3AgeworfTsKKworc3RydWN0IGliX3V2ZXJic19kZXN0cm95X3FwIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBxcF9oYW5kbGU7CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfcXBfcmVzcCB7CisJX191MzIgZXZlbnRzX3JlcG9ydGVkOworfTsKKworLyoKKyAqIFRoZSBpYl91dmVyYnNfc2dlIHN0cnVjdHVyZSBpc24ndCB1c2VkIGFueXdoZXJlLCBzaW5jZSB3ZSBhc3N1bWUKKyAqIHRoZSBpYl9zZ2Ugc3RydWN0dXJlIGlzIHBhY2tlZCB0aGUgc2FtZSB3YXkgb24gMzItYml0IGFuZCA2NC1iaXQKKyAqIGFyY2hpdGVjdHVyZXMgaW4gYm90aCBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuICBJdCdzIGp1c3QgaGVyZSB0bworICogZG9jdW1lbnQgdGhlIEFCSS4KKyAqLworc3RydWN0IGliX3V2ZXJic19zZ2UgeworCV9fdTY0IGFkZHI7CisJX191MzIgbGVuZ3RoOworCV9fdTMyIGxrZXk7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3NlbmRfd3IgeworCV9fdTY0IHdyX2lkOworCV9fdTMyIG51bV9zZ2U7CisJX191MzIgb3Bjb2RlOworCV9fdTMyIHNlbmRfZmxhZ3M7CisJdW5pb24geworCQlfX3UzMiBpbW1fZGF0YTsKKwkJX191MzIgaW52YWxpZGF0ZV9ya2V5OworCX0gZXg7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191NjQgcmVtb3RlX2FkZHI7CisJCQlfX3UzMiBya2V5OworCQkJX191MzIgcmVzZXJ2ZWQ7CisJCX0gcmRtYTsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IHJlbW90ZV9hZGRyOworCQkJX191NjQgY29tcGFyZV9hZGQ7CisJCQlfX3U2NCBzd2FwOworCQkJX191MzIgcmtleTsKKwkJCV9fdTMyIHJlc2VydmVkOworCQl9IGF0b21pYzsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIGFoOworCQkJX191MzIgcmVtb3RlX3FwbjsKKwkJCV9fdTMyIHJlbW90ZV9xa2V5OworCQkJX191MzIgcmVzZXJ2ZWQ7CisJCX0gdWQ7CisJfSB3cjsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcG9zdF9zZW5kIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBxcF9oYW5kbGU7CisJX191MzIgd3JfY291bnQ7CisJX191MzIgc2dlX2NvdW50OworCV9fdTMyIHdxZV9zaXplOworCXN0cnVjdCBpYl91dmVyYnNfc2VuZF93ciBzZW5kX3dyWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19wb3N0X3NlbmRfcmVzcCB7CisJX191MzIgYmFkX3dyOworfTsKKworc3RydWN0IGliX3V2ZXJic19yZWN2X3dyIHsKKwlfX3U2NCB3cl9pZDsKKwlfX3UzMiBudW1fc2dlOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IGliX3V2ZXJic19wb3N0X3JlY3YgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIHFwX2hhbmRsZTsKKwlfX3UzMiB3cl9jb3VudDsKKwlfX3UzMiBzZ2VfY291bnQ7CisJX191MzIgd3FlX3NpemU7CisJc3RydWN0IGliX3V2ZXJic19yZWN2X3dyIHJlY3Zfd3JbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3Bvc3RfcmVjdl9yZXNwIHsKKwlfX3UzMiBiYWRfd3I7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3Bvc3Rfc3JxX3JlY3YgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIHNycV9oYW5kbGU7CisJX191MzIgd3JfY291bnQ7CisJX191MzIgc2dlX2NvdW50OworCV9fdTMyIHdxZV9zaXplOworCXN0cnVjdCBpYl91dmVyYnNfcmVjdl93ciByZWN2WzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19wb3N0X3NycV9yZWN2X3Jlc3AgeworCV9fdTMyIGJhZF93cjsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX2FoIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCB1c2VyX2hhbmRsZTsKKwlfX3UzMiBwZF9oYW5kbGU7CisJX191MzIgcmVzZXJ2ZWQ7CisJc3RydWN0IGliX3V2ZXJic19haF9hdHRyIGF0dHI7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9haF9yZXNwIHsKKwlfX3UzMiBhaF9oYW5kbGU7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfYWggeworCV9fdTMyIGFoX2hhbmRsZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfYXR0YWNoX21jYXN0IHsKKwlfX3U4ICBnaWRbMTZdOworCV9fdTMyIHFwX2hhbmRsZTsKKwlfX3UxNiBtbGlkOworCV9fdTE2IHJlc2VydmVkOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19kZXRhY2hfbWNhc3QgeworCV9fdTggIGdpZFsxNl07CisJX191MzIgcXBfaGFuZGxlOworCV9fdTE2IG1saWQ7CisJX191MTYgcmVzZXJ2ZWQ7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9zcnEgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTY0IHVzZXJfaGFuZGxlOworCV9fdTMyIHBkX2hhbmRsZTsKKwlfX3UzMiBtYXhfd3I7CisJX191MzIgbWF4X3NnZTsKKwlfX3UzMiBzcnFfbGltaXQ7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV94c3JxIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCB1c2VyX2hhbmRsZTsKKwlfX3UzMiBzcnFfdHlwZTsKKwlfX3UzMiBwZF9oYW5kbGU7CisJX191MzIgbWF4X3dyOworCV9fdTMyIG1heF9zZ2U7CisJX191MzIgc3JxX2xpbWl0OworCV9fdTMyIHJlc2VydmVkOworCV9fdTMyIHhyY2RfaGFuZGxlOworCV9fdTMyIGNxX2hhbmRsZTsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3NycV9yZXNwIHsKKwlfX3UzMiBzcnFfaGFuZGxlOworCV9fdTMyIG1heF93cjsKKwlfX3UzMiBtYXhfc2dlOworCV9fdTMyIHNycW47Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX21vZGlmeV9zcnEgeworCV9fdTMyIHNycV9oYW5kbGU7CisJX191MzIgYXR0cl9tYXNrOworCV9fdTMyIG1heF93cjsKKwlfX3UzMiBzcnFfbGltaXQ7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3NycSB7CisJX191NjQgcmVzcG9uc2U7CisJX191MzIgc3JxX2hhbmRsZTsKKwlfX3UzMiByZXNlcnZlZDsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfc3JxX3Jlc3AgeworCV9fdTMyIG1heF93cjsKKwlfX3UzMiBtYXhfc2dlOworCV9fdTMyIHNycV9saW1pdDsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9zcnEgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIHNycV9oYW5kbGU7CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfc3JxX3Jlc3AgeworCV9fdTMyIGV2ZW50c19yZXBvcnRlZDsKK307CisKKyNlbmRpZiAvKiBJQl9VU0VSX1ZFUkJTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9yZG1hX25ldGxpbmsuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9yZG1hX25ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTc5ZWE4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9yZG1hL3JkbWFfbmV0bGluay5oCkBAIC0wLDAgKzEsMzcgQEAKKyNpZm5kZWYgX1JETUFfTkVUTElOS19ICisjZGVmaW5lIF9SRE1BX05FVExJTktfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB7CisJUkRNQV9OTF9SRE1BX0NNID0gMQorfTsKKworI2RlZmluZSBSRE1BX05MX0dFVF9DTElFTlQodHlwZSkgKCh0eXBlICYgKCgoMSA8PCA2KSAtIDEpIDw8IDEwKSkgPj4gMTApCisjZGVmaW5lIFJETUFfTkxfR0VUX09QKHR5cGUpICh0eXBlICYgKCgxIDw8IDEwKSAtIDEpKQorI2RlZmluZSBSRE1BX05MX0dFVF9UWVBFKGNsaWVudCwgb3ApICgoY2xpZW50IDw8IDEwKSArIG9wKQorCitlbnVtIHsKKwlSRE1BX05MX1JETUFfQ01fSURfU1RBVFMgPSAwLAorCVJETUFfTkxfUkRNQV9DTV9OVU1fT1BTCit9OworCitlbnVtIHsKKwlSRE1BX05MX1JETUFfQ01fQVRUUl9TUkNfQUREUiA9IDEsCisJUkRNQV9OTF9SRE1BX0NNX0FUVFJfRFNUX0FERFIsCisJUkRNQV9OTF9SRE1BX0NNX05VTV9BVFRSLAorfTsKKworc3RydWN0IHJkbWFfY21faWRfc3RhdHMgeworCV9fdTMyCXFwX251bTsKKwlfX3UzMglib3VuZF9kZXZfaWY7CisJX191MzIJcG9ydF9zcGFjZTsKKwlfX3MzMglwaWQ7CisJX191OAljbV9zdGF0ZTsKKwlfX3U4CW5vZGVfdHlwZTsKKwlfX3U4CXBvcnRfbnVtOworCV9fdTgJcXBfdHlwZTsKK307CisKKworI2VuZGlmIC8qIF9SRE1BX05FVExJTktfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9yZG1hL3JkbWFfdXNlcl9jbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9yZG1hL3JkbWFfdXNlcl9jbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDhhMDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JkbWEvcmRtYV91c2VyX2NtLmgKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFJETUFfVVNFUl9DTV9ICisjZGVmaW5lIFJETUFfVVNFUl9DTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPHJkbWEvaWJfdXNlcl92ZXJicy5oPgorI2luY2x1ZGUgPHJkbWEvaWJfdXNlcl9zYS5oPgorCisjZGVmaW5lIFJETUFfVVNFUl9DTV9BQklfVkVSU0lPTgk0CisKKyNkZWZpbmUgUkRNQV9NQVhfUFJJVkFURV9EQVRBCQkyNTYKKworZW51bSB7CisJUkRNQV9VU0VSX0NNX0NNRF9DUkVBVEVfSUQsCisJUkRNQV9VU0VSX0NNX0NNRF9ERVNUUk9ZX0lELAorCVJETUFfVVNFUl9DTV9DTURfQklORF9BRERSLAorCVJETUFfVVNFUl9DTV9DTURfUkVTT0xWRV9BRERSLAorCVJETUFfVVNFUl9DTV9DTURfUkVTT0xWRV9ST1VURSwKKwlSRE1BX1VTRVJfQ01fQ01EX1FVRVJZX1JPVVRFLAorCVJETUFfVVNFUl9DTV9DTURfQ09OTkVDVCwKKwlSRE1BX1VTRVJfQ01fQ01EX0xJU1RFTiwKKwlSRE1BX1VTRVJfQ01fQ01EX0FDQ0VQVCwKKwlSRE1BX1VTRVJfQ01fQ01EX1JFSkVDVCwKKwlSRE1BX1VTRVJfQ01fQ01EX0RJU0NPTk5FQ1QsCisJUkRNQV9VU0VSX0NNX0NNRF9JTklUX1FQX0FUVFIsCisJUkRNQV9VU0VSX0NNX0NNRF9HRVRfRVZFTlQsCisJUkRNQV9VU0VSX0NNX0NNRF9HRVRfT1BUSU9OLAorCVJETUFfVVNFUl9DTV9DTURfU0VUX09QVElPTiwKKwlSRE1BX1VTRVJfQ01fQ01EX05PVElGWSwKKwlSRE1BX1VTRVJfQ01fQ01EX0pPSU5fTUNBU1QsCisJUkRNQV9VU0VSX0NNX0NNRF9MRUFWRV9NQ0FTVCwKKwlSRE1BX1VTRVJfQ01fQ01EX01JR1JBVEVfSUQKK307CisKKy8qCisgKiBjb21tYW5kIEFCSSBzdHJ1Y3R1cmVzLgorICovCitzdHJ1Y3QgcmRtYV91Y21fY21kX2hkciB7CisJX191MzIgY21kOworCV9fdTE2IGluOworCV9fdTE2IG91dDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9jcmVhdGVfaWQgeworCV9fdTY0IHVpZDsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UxNiBwczsKKwlfX3U4ICBxcF90eXBlOworCV9fdTggIHJlc2VydmVkWzVdOworfTsKKworc3RydWN0IHJkbWFfdWNtX2NyZWF0ZV9pZF9yZXNwIHsKKwlfX3UzMiBpZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9kZXN0cm95X2lkIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBpZDsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9kZXN0cm95X2lkX3Jlc3AgeworCV9fdTMyIGV2ZW50c19yZXBvcnRlZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9iaW5kX2FkZHIgeworCV9fdTY0IHJlc3BvbnNlOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgYWRkcjsKKwlfX3UzMiBpZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9yZXNvbHZlX2FkZHIgeworCXN0cnVjdCBzb2NrYWRkcl9pbjYgc3JjX2FkZHI7CisJc3RydWN0IHNvY2thZGRyX2luNiBkc3RfYWRkcjsKKwlfX3UzMiBpZDsKKwlfX3UzMiB0aW1lb3V0X21zOworfTsKKworc3RydWN0IHJkbWFfdWNtX3Jlc29sdmVfcm91dGUgeworCV9fdTMyIGlkOworCV9fdTMyIHRpbWVvdXRfbXM7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fcXVlcnlfcm91dGUgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIGlkOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IHJkbWFfdWNtX3F1ZXJ5X3JvdXRlX3Jlc3AgeworCV9fdTY0IG5vZGVfZ3VpZDsKKwlzdHJ1Y3QgaWJfdXNlcl9wYXRoX3JlYyBpYl9yb3V0ZVsyXTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNyY19hZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgZHN0X2FkZHI7CisJX191MzIgbnVtX3BhdGhzOworCV9fdTggcG9ydF9udW07CisJX191OCByZXNlcnZlZFszXTsKK307CisKK3N0cnVjdCByZG1hX3VjbV9jb25uX3BhcmFtIHsKKwlfX3UzMiBxcF9udW07CisJX191MzIgcmVzZXJ2ZWQ7CisJX191OCAgcHJpdmF0ZV9kYXRhW1JETUFfTUFYX1BSSVZBVEVfREFUQV07CisJX191OCAgcHJpdmF0ZV9kYXRhX2xlbjsKKwlfX3U4ICBzcnE7CisJX191OCAgcmVzcG9uZGVyX3Jlc291cmNlczsKKwlfX3U4ICBpbml0aWF0b3JfZGVwdGg7CisJX191OCAgZmxvd19jb250cm9sOworCV9fdTggIHJldHJ5X2NvdW50OworCV9fdTggIHJucl9yZXRyeV9jb3VudDsKKwlfX3U4ICB2YWxpZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV91ZF9wYXJhbSB7CisJX191MzIgcXBfbnVtOworCV9fdTMyIHFrZXk7CisJc3RydWN0IGliX3V2ZXJic19haF9hdHRyIGFoX2F0dHI7CisJX191OCAgcHJpdmF0ZV9kYXRhW1JETUFfTUFYX1BSSVZBVEVfREFUQV07CisJX191OCAgcHJpdmF0ZV9kYXRhX2xlbjsKKwlfX3U4ICByZXNlcnZlZFs3XTsKK307CisKK3N0cnVjdCByZG1hX3VjbV9jb25uZWN0IHsKKwlzdHJ1Y3QgcmRtYV91Y21fY29ubl9wYXJhbSBjb25uX3BhcmFtOworCV9fdTMyIGlkOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IHJkbWFfdWNtX2xpc3RlbiB7CisJX191MzIgaWQ7CisJX191MzIgYmFja2xvZzsKK307CisKK3N0cnVjdCByZG1hX3VjbV9hY2NlcHQgeworCV9fdTY0IHVpZDsKKwlzdHJ1Y3QgcmRtYV91Y21fY29ubl9wYXJhbSBjb25uX3BhcmFtOworCV9fdTMyIGlkOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IHJkbWFfdWNtX3JlamVjdCB7CisJX191MzIgaWQ7CisJX191OCAgcHJpdmF0ZV9kYXRhX2xlbjsKKwlfX3U4ICByZXNlcnZlZFszXTsKKwlfX3U4ICBwcml2YXRlX2RhdGFbUkRNQV9NQVhfUFJJVkFURV9EQVRBXTsKK307CisKK3N0cnVjdCByZG1hX3VjbV9kaXNjb25uZWN0IHsKKwlfX3UzMiBpZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9pbml0X3FwX2F0dHIgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIGlkOworCV9fdTMyIHFwX3N0YXRlOworfTsKKworc3RydWN0IHJkbWFfdWNtX25vdGlmeSB7CisJX191MzIgaWQ7CisJX191MzIgZXZlbnQ7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fam9pbl9tY2FzdCB7CisJX191NjQgcmVzcG9uc2U7CQkvKiByZG1hX3VjbV9jcmVhdGVfaWRfcmVzcCAqLworCV9fdTY0IHVpZDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IGFkZHI7CisJX191MzIgaWQ7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fZ2V0X2V2ZW50IHsKKwlfX3U2NCByZXNwb25zZTsKK307CisKK3N0cnVjdCByZG1hX3VjbV9ldmVudF9yZXNwIHsKKwlfX3U2NCB1aWQ7CisJX191MzIgaWQ7CisJX191MzIgZXZlbnQ7CisJX191MzIgc3RhdHVzOworCXVuaW9uIHsKKwkJc3RydWN0IHJkbWFfdWNtX2Nvbm5fcGFyYW0gY29ubjsKKwkJc3RydWN0IHJkbWFfdWNtX3VkX3BhcmFtICAgdWQ7CisJfSBwYXJhbTsKK307CisKKy8qIE9wdGlvbiBsZXZlbHMgKi8KK2VudW0geworCVJETUFfT1BUSU9OX0lECQk9IDAsCisJUkRNQV9PUFRJT05fSUIJCT0gMQorfTsKKworLyogT3B0aW9uIGRldGFpbHMgKi8KK2VudW0geworCVJETUFfT1BUSU9OX0lEX1RPUwkgPSAwLAorCVJETUFfT1BUSU9OX0lEX1JFVVNFQUREUiA9IDEsCisJUkRNQV9PUFRJT05fSUJfUEFUSAkgPSAxCit9OworCitzdHJ1Y3QgcmRtYV91Y21fc2V0X29wdGlvbiB7CisJX191NjQgb3B0dmFsOworCV9fdTMyIGlkOworCV9fdTMyIGxldmVsOworCV9fdTMyIG9wdG5hbWU7CisJX191MzIgb3B0bGVuOworfTsKKworc3RydWN0IHJkbWFfdWNtX21pZ3JhdGVfaWQgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIGlkOworCV9fdTMyIGZkOworfTsKKworc3RydWN0IHJkbWFfdWNtX21pZ3JhdGVfcmVzcCB7CisJX191MzIgZXZlbnRzX3JlcG9ydGVkOworfTsKKworI2VuZGlmIC8qIFJETUFfVVNFUl9DTV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JlX2NvbXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmVfY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTE0NDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JlX2NvbXAuaApAQCAtMCwwICsxLDI2IEBACisvKiAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9SRV9DT01QX0gKKyNkZWZpbmUgX1JFX0NPTVBfSAkxCisKKy8qIFRoaXMgaXMgb25seSBhIHdyYXBwZXIgYXJvdW5kIHRoZSA8cmVnZXguaD4gZmlsZS4gIFhQRzQuMiBtZW50aW9ucworICAgdGhpcyBuYW1lLiAgKi8KKyNpbmNsdWRlIDxyZWdleC5oPgorCisjZW5kaWYgLyogcmVfY29tcC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JlZ2V4LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JlZ2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmZGUzMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmVnZXguaApAQCAtMCwwICsxLDU5NCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIGRhdGEgc3RydWN0dXJlcyBhbmQgcm91dGluZXMgZm9yIHRoZSByZWd1bGFyCisgICBleHByZXNzaW9uIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDE5ODUsMTk4OS05MywxOTk1LTk4LDIwMDAsMjAwMSwyMDAyLDIwMDMsMjAwNSwyMDA2LDIwMDgsMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1JFR0VYX0gKKyNkZWZpbmUgX1JFR0VYX0ggMQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8Z251L29wdGlvbi1ncm91cHMuaD4KKworLyogQWxsb3cgdGhlIHVzZSBpbiBDKysgY29kZS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgdHdvIHR5cGVzIGhhdmUgdG8gYmUgc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUKKyAgIHdpZGUgZW5vdWdoIHRvIGhvbGQgYSB2YWx1ZSBvZiBhIHBvaW50ZXIuICBGb3IgbW9zdCBBTlNJIGNvbXBpbGVycworICAgcHRyZGlmZl90IGFuZCBzaXplX3Qgc2hvdWxkIGJlIGxpa2VseSBPSy4gIFN0aWxsIHNpemUgb2YgdGhlc2UgdHdvCisgICB0eXBlcyBpcyAyIGZvciBNaWNyb3NvZnQgQy4gIFVnaC4uLiAqLwordHlwZWRlZiBsb25nIGludCBzX3JlZ190OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBhY3RpdmVfcmVnX3Q7CisKKy8qIFRoZSBmb2xsb3dpbmcgYml0cyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHJlZ2V4cCBzeW50YXggd2UKKyAgIHJlY29nbml6ZS4gIFRoZSBzZXQvbm90LXNldCBtZWFuaW5ncyBhcmUgY2hvc2VuIHNvIHRoYXQgRW1hY3Mgc3ludGF4CisgICByZW1haW5zIHRoZSB2YWx1ZSAwLiAgVGhlIGJpdHMgYXJlIGdpdmVuIGluIGFscGhhYmV0aWNhbCBvcmRlciwgYW5kCisgICB0aGUgZGVmaW5pdGlvbnMgc2hpZnRlZCBieSBvbmUgZnJvbSB0aGUgcHJldmlvdXMgYml0OyB0aHVzLCB3aGVuIHdlCisgICBhZGQgb3IgcmVtb3ZlIGEgYml0LCBvbmx5IG9uZSBvdGhlciBkZWZpbml0aW9uIG5lZWQgY2hhbmdlLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgcmVnX3N5bnRheF90OworCisjaWZkZWYgX19VU0VfR05VCisvKiBJZiB0aGlzIGJpdCBpcyBub3Qgc2V0LCB0aGVuIFwgaW5zaWRlIGEgYnJhY2tldCBleHByZXNzaW9uIGlzIGxpdGVyYWwuCisgICBJZiBzZXQsIHRoZW4gc3VjaCBhIFwgcXVvdGVzIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyLiAgKi8KKyMgZGVmaW5lIFJFX0JBQ0tTTEFTSF9FU0NBUEVfSU5fTElTVFMgKCh1bnNpZ25lZCBsb25nIGludCkgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgbm90IHNldCwgdGhlbiArIGFuZCA/IGFyZSBvcGVyYXRvcnMsIGFuZCBcKyBhbmQgXD8gYXJlCisgICAgIGxpdGVyYWxzLgorICAgSWYgc2V0LCB0aGVuIFwrIGFuZCBcPyBhcmUgb3BlcmF0b3JzIGFuZCArIGFuZCA/IGFyZSBsaXRlcmFscy4gICovCisjIGRlZmluZSBSRV9CS19QTFVTX1FNIChSRV9CQUNLU0xBU0hfRVNDQVBFX0lOX0xJU1RTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBjaGFyYWN0ZXIgY2xhc3NlcyBhcmUgc3VwcG9ydGVkLiAgVGhleSBhcmU6CisgICAgIFs6YWxwaGE6XSwgWzp1cHBlcjpdLCBbOmxvd2VyOl0sICBbOmRpZ2l0Ol0sIFs6YWxudW06XSwgWzp4ZGlnaXQ6XSwKKyAgICAgWzpzcGFjZTpdLCBbOnByaW50Ol0sIFs6cHVuY3Q6XSwgWzpncmFwaDpdLCBhbmQgWzpjbnRybDpdLgorICAgSWYgbm90IHNldCwgdGhlbiBjaGFyYWN0ZXIgY2xhc3NlcyBhcmUgbm90IHN1cHBvcnRlZC4gICovCisjIGRlZmluZSBSRV9DSEFSX0NMQVNTRVMgKFJFX0JLX1BMVVNfUU0gPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIF4gYW5kICQgYXJlIGFsd2F5cyBhbmNob3JzIChvdXRzaWRlIGJyYWNrZXQKKyAgICAgZXhwcmVzc2lvbnMsIG9mIGNvdXJzZSkuCisgICBJZiB0aGlzIGJpdCBpcyBub3Qgc2V0LCB0aGVuIGl0IGRlcGVuZHM6CisJXiAgaXMgYW4gYW5jaG9yIGlmIGl0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSByZWd1bGFyCisJICAgZXhwcmVzc2lvbiBvciBhZnRlciBhbiBvcGVuLWdyb3VwIG9yIGFuIGFsdGVybmF0aW9uIG9wZXJhdG9yOworCSQgIGlzIGFuIGFuY2hvciBpZiBpdCBpcyBhdCB0aGUgZW5kIG9mIGEgcmVndWxhciBleHByZXNzaW9uLCBvcgorCSAgIGJlZm9yZSBhIGNsb3NlLWdyb3VwIG9yIGFuIGFsdGVybmF0aW9uIG9wZXJhdG9yLgorCisgICBUaGlzIGJpdCBjb3VsZCBiZSAocmUpY29tYmluZWQgd2l0aCBSRV9DT05URVhUX0lOREVQX09QUywgYmVjYXVzZQorICAgUE9TSVggZHJhZnQgMTEuMiBzYXlzIHRoYXQgKiBldGMuIGluIGxlYWRpbmcgcG9zaXRpb25zIGlzIHVuZGVmaW5lZC4KKyAgIFdlIGFscmVhZHkgaW1wbGVtZW50ZWQgYSBwcmV2aW91cyBkcmFmdCB3aGljaCBtYWRlIHRob3NlIGNvbnN0cnVjdHMKKyAgIGludmFsaWQsIHRob3VnaCwgc28gd2UgaGF2ZW4ndCBjaGFuZ2VkIHRoZSBjb2RlIGJhY2suICAqLworIyBkZWZpbmUgUkVfQ09OVEVYVF9JTkRFUF9BTkNIT1JTIChSRV9DSEFSX0NMQVNTRVMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUgYWx3YXlzIHNwZWNpYWwKKyAgICAgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGV5IGFyZSBpbiB0aGUgcGF0dGVybi4KKyAgIElmIHRoaXMgYml0IGlzIG5vdCBzZXQsIHRoZW4gc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBzcGVjaWFsIG9ubHkgaW4KKyAgICAgc29tZSBjb250ZXh0czsgb3RoZXJ3aXNlIHRoZXkgYXJlIG9yZGluYXJ5LiAgU3BlY2lmaWNhbGx5LAorICAgICAqICsgPyBhbmQgaW50ZXJ2YWxzIGFyZSBvbmx5IHNwZWNpYWwgd2hlbiBub3QgYWZ0ZXIgdGhlIGJlZ2lubmluZywKKyAgICAgb3Blbi1ncm91cCwgb3IgYWx0ZXJuYXRpb24gb3BlcmF0b3IuICAqLworIyBkZWZpbmUgUkVfQ09OVEVYVF9JTkRFUF9PUFMgKFJFX0NPTlRFWFRfSU5ERVBfQU5DSE9SUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gKiwgKywgPywgYW5kIHsgY2Fubm90IGJlIGZpcnN0IGluIGFuIHJlIG9yCisgICAgIGltbWVkaWF0ZWx5IGFmdGVyIGFuIGFsdGVybmF0aW9uIG9yIGJlZ2luLWdyb3VwIG9wZXJhdG9yLiAgKi8KKyMgZGVmaW5lIFJFX0NPTlRFWFRfSU5WQUxJRF9PUFMgKFJFX0NPTlRFWFRfSU5ERVBfT1BTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiAuIG1hdGNoZXMgbmV3bGluZS4KKyAgIElmIG5vdCBzZXQsIHRoZW4gaXQgZG9lc24ndC4gICovCisjIGRlZmluZSBSRV9ET1RfTkVXTElORSAoUkVfQ09OVEVYVF9JTlZBTElEX09QUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gLiBkb2Vzbid0IG1hdGNoIE5VTC4KKyAgIElmIG5vdCBzZXQsIHRoZW4gaXQgZG9lcy4gICovCisjIGRlZmluZSBSRV9ET1RfTk9UX05VTEwgKFJFX0RPVF9ORVdMSU5FIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgbm9ubWF0Y2hpbmcgbGlzdHMgW14uLi5dIGRvIG5vdCBtYXRjaCBuZXdsaW5lLgorICAgSWYgbm90IHNldCwgdGhleSBkby4gICovCisjIGRlZmluZSBSRV9IQVRfTElTVFNfTk9UX05FV0xJTkUgKFJFX0RPVF9OT1RfTlVMTCA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIGVpdGhlciBcey4uLlx9IG9yIHsuLi59IGRlZmluZXMgYW4KKyAgICAgaW50ZXJ2YWwsIGRlcGVuZGluZyBvbiBSRV9OT19CS19CUkFDRVMuCisgICBJZiBub3Qgc2V0LCBceywgXH0sIHssIGFuZCB9IGFyZSBsaXRlcmFscy4gICovCisjIGRlZmluZSBSRV9JTlRFUlZBTFMgKFJFX0hBVF9MSVNUU19OT1RfTkVXTElORSA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsICssID8gYW5kIHwgYXJlbid0IHJlY29nbml6ZWQgYXMgb3BlcmF0b3JzLgorICAgSWYgbm90IHNldCwgdGhleSBhcmUuICAqLworIyBkZWZpbmUgUkVfTElNSVRFRF9PUFMgKFJFX0lOVEVSVkFMUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIG5ld2xpbmUgaXMgYW4gYWx0ZXJuYXRpb24gb3BlcmF0b3IuCisgICBJZiBub3Qgc2V0LCBuZXdsaW5lIGlzIGxpdGVyYWwuICAqLworIyBkZWZpbmUgUkVfTkVXTElORV9BTFQgKFJFX0xJTUlURURfT1BTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBgey4uLn0nIGRlZmluZXMgYW4gaW50ZXJ2YWwsIGFuZCBceyBhbmQgXH0KKyAgICAgYXJlIGxpdGVyYWxzLgorICBJZiBub3Qgc2V0LCB0aGVuIGBcey4uLlx9JyBkZWZpbmVzIGFuIGludGVydmFsLiAgKi8KKyMgZGVmaW5lIFJFX05PX0JLX0JSQUNFUyAoUkVfTkVXTElORV9BTFQgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCAoLi4uKSBkZWZpbmVzIGEgZ3JvdXAsIGFuZCBcKCBhbmQgXCkgYXJlIGxpdGVyYWxzLgorICAgSWYgbm90IHNldCwgXCguLi5cKSBkZWZpbmVzIGEgZ3JvdXAsIGFuZCAoIGFuZCApIGFyZSBsaXRlcmFscy4gICovCisjIGRlZmluZSBSRV9OT19CS19QQVJFTlMgKFJFX05PX0JLX0JSQUNFUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gXDxkaWdpdD4gbWF0Y2hlcyA8ZGlnaXQ+LgorICAgSWYgbm90IHNldCwgdGhlbiBcPGRpZ2l0PiBpcyBhIGJhY2stcmVmZXJlbmNlLiAgKi8KKyMgZGVmaW5lIFJFX05PX0JLX1JFRlMgKFJFX05PX0JLX1BBUkVOUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gfCBpcyBhbiBhbHRlcm5hdGlvbiBvcGVyYXRvciwgYW5kIFx8IGlzIGxpdGVyYWwuCisgICBJZiBub3Qgc2V0LCB0aGVuIFx8IGlzIGFuIGFsdGVybmF0aW9uIG9wZXJhdG9yLCBhbmQgfCBpcyBsaXRlcmFsLiAgKi8KKyMgZGVmaW5lIFJFX05PX0JLX1ZCQVIgKFJFX05PX0JLX1JFRlMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIGFuIGVuZGluZyByYW5nZSBwb2ludCBjb2xsYXRpbmcgaGlnaGVyCisgICAgIHRoYW4gdGhlIHN0YXJ0aW5nIHJhbmdlIHBvaW50LCBhcyBpbiBbei1hXSwgaXMgaW52YWxpZC4KKyAgIElmIG5vdCBzZXQsIHRoZW4gd2hlbiBlbmRpbmcgcmFuZ2UgcG9pbnQgY29sbGF0ZXMgaGlnaGVyIHRoYW4gdGhlCisgICAgIHN0YXJ0aW5nIHJhbmdlIHBvaW50LCB0aGUgcmFuZ2UgaXMgaWdub3JlZC4gICovCisjIGRlZmluZSBSRV9OT19FTVBUWV9SQU5HRVMgKFJFX05PX0JLX1ZCQVIgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIGFuIHVubWF0Y2hlZCApIGlzIG9yZGluYXJ5LgorICAgSWYgbm90IHNldCwgdGhlbiBhbiB1bm1hdGNoZWQgKSBpcyBpbnZhbGlkLiAgKi8KKyMgZGVmaW5lIFJFX1VOTUFUQ0hFRF9SSUdIVF9QQVJFTl9PUkQgKFJFX05PX0VNUFRZX1JBTkdFUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHN1Y2NlZWQgYXMgc29vbiBhcyB3ZSBtYXRjaCB0aGUgd2hvbGUgcGF0dGVybiwKKyAgIHdpdGhvdXQgZnVydGhlciBiYWNrdHJhY2tpbmcuICAqLworIyBkZWZpbmUgUkVfTk9fUE9TSVhfQkFDS1RSQUNLSU5HIChSRV9VTk1BVENIRURfUklHSFRfUEFSRU5fT1JEIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgZG8gbm90IHByb2Nlc3MgdGhlIEdOVSByZWdleCBvcGVyYXRvcnMuCisgICBJZiBub3Qgc2V0LCB0aGVuIHRoZSBHTlUgcmVnZXggb3BlcmF0b3JzIGFyZSByZWNvZ25pemVkLiAqLworIyBkZWZpbmUgUkVfTk9fR05VX09QUyAoUkVfTk9fUE9TSVhfQkFDS1RSQUNLSU5HIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdHVybiBvbiBpbnRlcm5hbCByZWdleCBkZWJ1Z2dpbmcuCisgICBJZiBub3Qgc2V0LCBhbmQgZGVidWdnaW5nIHdhcyBvbiwgdHVybiBpdCBvZmYuCisgICBUaGlzIG9ubHkgd29ya3MgaWYgcmVnZXguYyBpcyBjb21waWxlZCAtRERFQlVHLgorICAgV2UgZGVmaW5lIHRoaXMgYml0IGFsd2F5cywgc28gdGhhdCBhbGwgdGhhdCdzIG5lZWRlZCB0byB0dXJuIG9uCisgICBkZWJ1Z2dpbmcgaXMgdG8gcmVjb21waWxlIHJlZ2V4LmM7IHRoZSBjYWxsaW5nIGNvZGUgY2FuIGFsd2F5cyBoYXZlCisgICB0aGlzIGJpdCBzZXQsIGFuZCBpdCB3b24ndCBhZmZlY3QgYW55dGhpbmcgaW4gdGhlIG5vcm1hbCBjYXNlLiAqLworIyBkZWZpbmUgUkVfREVCVUcgKFJFX05PX0dOVV9PUFMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCBhIHN5bnRhY3RpY2FsbHkgaW52YWxpZCBpbnRlcnZhbCBpcyB0cmVhdGVkIGFzCisgICBhIHN0cmluZyBvZiBvcmRpbmFyeSBjaGFyYWN0ZXJzLiAgRm9yIGV4YW1wbGUsIHRoZSBFUkUgJ2F7MScgaXMKKyAgIHRyZWF0ZWQgYXMgJ2FcezEnLiAgKi8KKyMgZGVmaW5lIFJFX0lOVkFMSURfSU5URVJWQUxfT1JEIChSRV9ERUJVRyA8PCAxKQorCisvKiBFR0xJQkM6IE9sZCByZWdleCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZXNlLiAgKi8KKyMgaWZkZWYgX19PUFRJT05fUE9TSVhfUkVHRVhQX0dMSUJDCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gaWdub3JlIGNhc2Ugd2hlbiBtYXRjaGluZy4KKyAgIElmIG5vdCBzZXQsIHRoZW4gY2FzZSBpcyBzaWduaWZpY2FudC4gICovCisjIGRlZmluZSBSRV9JQ0FTRSAoUkVfSU5WQUxJRF9JTlRFUlZBTF9PUkQgPDwgMSkKKworLyogVGhpcyBiaXQgaXMgdXNlZCBpbnRlcm5hbGx5IGxpa2UgUkVfQ09OVEVYVF9JTkRFUF9BTkNIT1JTIGJ1dCBvbmx5CisgICBmb3IgXiwgYmVjYXVzZSBpdCBpcyBkaWZmaWN1bHQgdG8gc2NhbiB0aGUgcmVnZXggYmFja3dhcmRzIHRvIGZpbmQKKyAgIHdoZXRoZXIgXiBzaG91bGQgYmUgc3BlY2lhbC4gICovCisjIGRlZmluZSBSRV9DQVJFVF9BTkNIT1JTX0hFUkUgKFJFX0lDQVNFIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBceyBjYW5ub3QgYmUgZmlyc3QgaW4gYW4gYnJlIG9yCisgICBpbW1lZGlhdGVseSBhZnRlciBhbiBhbHRlcm5hdGlvbiBvciBiZWdpbi1ncm91cCBvcGVyYXRvci4gICovCisjIGRlZmluZSBSRV9DT05URVhUX0lOVkFMSURfRFVQIChSRV9DQVJFVF9BTkNIT1JTX0hFUkUgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIG5vX3N1YiB3aWxsIGJlIHNldCB0byAxIGR1cmluZworICAgcmVfY29tcGlsZV9wYXR0ZXJuLiAgKi8KKyMgZGVmaW5lIFJFX05PX1NVQiAoUkVfQ09OVEVYVF9JTlZBTElEX0RVUCA8PCAxKQorIyBlbmRpZiAvKiBfX09QVElPTl9QT1NJWF9SRUdFWFBfR0xJQkMgKi8KKyNlbmRpZgorCisvKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBkZWZpbmVzIHRoZSBwYXJ0aWN1bGFyIHJlZ2V4cCBzeW50YXggdG8gdXNlIChmb3IKKyAgIHNvbWUgaW50ZXJmYWNlcykuICBXaGVuIGEgcmVnZXhwIGlzIGNvbXBpbGVkLCB0aGUgc3ludGF4IHVzZWQgaXMKKyAgIHN0b3JlZCBpbiB0aGUgcGF0dGVybiBidWZmZXIsIHNvIGNoYW5naW5nIHRoaXMgZG9lcyBub3QgYWZmZWN0CisgICBhbHJlYWR5LWNvbXBpbGVkIHJlZ2V4cHMuICAqLworZXh0ZXJuIHJlZ19zeW50YXhfdCByZV9zeW50YXhfb3B0aW9uczsKKwwKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIERlZmluZSBjb21iaW5hdGlvbnMgb2YgdGhlIGFib3ZlIGJpdHMgZm9yIHRoZSBzdGFuZGFyZCBwb3NzaWJpbGl0aWVzLgorICAgKFRoZSBbW1sgY29tbWVudHMgZGVsaW1pdCB3aGF0IGdldHMgcHV0IGludG8gdGhlIFRleGluZm8gZmlsZSwgc28KKyAgIGRvbid0IGRlbGV0ZSB0aGVtISkgICovCisvKiBbW1tiZWdpbiBzeW50YXhlc11dXSAqLworI2RlZmluZSBSRV9TWU5UQVhfRU1BQ1MgMAorCisjZGVmaW5lIFJFX1NZTlRBWF9BV0sJCQkJCQkJXAorICAoUkVfQkFDS1NMQVNIX0VTQ0FQRV9JTl9MSVNUUyAgIHwgUkVfRE9UX05PVF9OVUxMCQkJXAorICAgfCBSRV9OT19CS19QQVJFTlMgICAgICAgICAgICAgIHwgUkVfTk9fQktfUkVGUwkJCVwKKyAgIHwgUkVfTk9fQktfVkJBUiAgICAgICAgICAgICAgICB8IFJFX05PX0VNUFRZX1JBTkdFUwkJCVwKKyAgIHwgUkVfRE9UX05FV0xJTkUJCSAgfCBSRV9DT05URVhUX0lOREVQX0FOQ0hPUlMJCVwKKyAgIHwgUkVfQ0hBUl9DTEFTU0VTCQkJCQkJCVwKKyAgIHwgUkVfVU5NQVRDSEVEX1JJR0hUX1BBUkVOX09SRCB8IFJFX05PX0dOVV9PUFMpCisKKyNkZWZpbmUgUkVfU1lOVEFYX0dOVV9BV0sJCQkJCQlcCisgICgoUkVfU1lOVEFYX1BPU0lYX0VYVEVOREVEIHwgUkVfQkFDS1NMQVNIX0VTQ0FQRV9JTl9MSVNUUwkJXAorICAgIHwgUkVfSU5WQUxJRF9JTlRFUlZBTF9PUkQpCQkJCQkJXAorICAgJiB+KFJFX0RPVF9OT1RfTlVMTCB8IFJFX0NPTlRFWFRfSU5ERVBfT1BTCQkJCVwKKyAgICAgIHwgUkVfQ09OVEVYVF9JTlZBTElEX09QUyApKQorCisjZGVmaW5lIFJFX1NZTlRBWF9QT1NJWF9BV0sJCQkJCQlcCisgIChSRV9TWU5UQVhfUE9TSVhfRVhURU5ERUQgfCBSRV9CQUNLU0xBU0hfRVNDQVBFX0lOX0xJU1RTCQlcCisgICB8IFJFX0lOVEVSVkFMUwkgICAgfCBSRV9OT19HTlVfT1BTCQkJCVwKKyAgIHwgUkVfSU5WQUxJRF9JTlRFUlZBTF9PUkQpCisKKyNkZWZpbmUgUkVfU1lOVEFYX0dSRVAJCQkJCQkJXAorICAoUkVfQktfUExVU19RTSAgICAgICAgICAgICAgfCBSRV9DSEFSX0NMQVNTRVMJCQkJXAorICAgfCBSRV9IQVRfTElTVFNfTk9UX05FV0xJTkUgfCBSRV9JTlRFUlZBTFMJCQkJXAorICAgfCBSRV9ORVdMSU5FX0FMVCkKKworI2RlZmluZSBSRV9TWU5UQVhfRUdSRVAJCQkJCQkJXAorICAoUkVfQ0hBUl9DTEFTU0VTICAgICAgICB8IFJFX0NPTlRFWFRfSU5ERVBfQU5DSE9SUwkJCVwKKyAgIHwgUkVfQ09OVEVYVF9JTkRFUF9PUFMgfCBSRV9IQVRfTElTVFNfTk9UX05FV0xJTkUJCQlcCisgICB8IFJFX05FV0xJTkVfQUxUICAgICAgIHwgUkVfTk9fQktfUEFSRU5TCQkJCVwKKyAgIHwgUkVfTk9fQktfVkJBUikKKworI2RlZmluZSBSRV9TWU5UQVhfUE9TSVhfRUdSRVAJCQkJCQlcCisgIChSRV9TWU5UQVhfRUdSRVAgfCBSRV9JTlRFUlZBTFMgfCBSRV9OT19CS19CUkFDRVMJCQlcCisgICB8IFJFX0lOVkFMSURfSU5URVJWQUxfT1JEKQorCisvKiBQMTAwMy4yL0QxMS4yLCBzZWN0aW9uIDQuMjAuNy4xLCBsaW5lcyA1MDc4ZmYuICAqLworI2RlZmluZSBSRV9TWU5UQVhfRUQgUkVfU1lOVEFYX1BPU0lYX0JBU0lDCisKKyNkZWZpbmUgUkVfU1lOVEFYX1NFRCBSRV9TWU5UQVhfUE9TSVhfQkFTSUMKKworLyogU3ludGF4IGJpdHMgY29tbW9uIHRvIGJvdGggYmFzaWMgYW5kIGV4dGVuZGVkIFBPU0lYIHJlZ2V4IHN5bnRheC4gICovCisjZGVmaW5lIF9SRV9TWU5UQVhfUE9TSVhfQ09NTU9OCQkJCQkJXAorICAoUkVfQ0hBUl9DTEFTU0VTIHwgUkVfRE9UX05FV0xJTkUgICAgICB8IFJFX0RPVF9OT1RfTlVMTAkJXAorICAgfCBSRV9JTlRFUlZBTFMgIHwgUkVfTk9fRU1QVFlfUkFOR0VTKQorCisjaWZkZWYgX19PUFRJT05fUE9TSVhfUkVHRVhQX0dMSUJDCisjZGVmaW5lIFJFX1NZTlRBWF9QT1NJWF9CQVNJQwkJCQkJCVwKKyAgKF9SRV9TWU5UQVhfUE9TSVhfQ09NTU9OIHwgUkVfQktfUExVU19RTSB8IFJFX0NPTlRFWFRfSU5WQUxJRF9EVVApCisjZWxzZQorI2RlZmluZSBSRV9TWU5UQVhfUE9TSVhfQkFTSUMJCQkJCQlcCisgIChfUkVfU1lOVEFYX1BPU0lYX0NPTU1PTiB8IFJFX0JLX1BMVVNfUU0pCisjZW5kaWYKKworLyogRGlmZmVycyBmcm9tIC4uLl9QT1NJWF9CQVNJQyBvbmx5IGluIHRoYXQgUkVfQktfUExVU19RTSBiZWNvbWVzCisgICBSRV9MSU1JVEVEX09QUywgaS5lLiwgXD8gXCsgXHwgYXJlIG5vdCByZWNvZ25pemVkLiAgQWN0dWFsbHksIHRoaXMKKyAgIGlzbid0IG1pbmltYWwsIHNpbmNlIG90aGVyIG9wZXJhdG9ycywgc3VjaCBhcyBcYCwgYXJlbid0IGRpc2FibGVkLiAgKi8KKyNkZWZpbmUgUkVfU1lOVEFYX1BPU0lYX01JTklNQUxfQkFTSUMJCQkJCVwKKyAgKF9SRV9TWU5UQVhfUE9TSVhfQ09NTU9OIHwgUkVfTElNSVRFRF9PUFMpCisKKyNkZWZpbmUgUkVfU1lOVEFYX1BPU0lYX0VYVEVOREVECQkJCQlcCisgIChfUkVfU1lOVEFYX1BPU0lYX0NPTU1PTiAgfCBSRV9DT05URVhUX0lOREVQX0FOQ0hPUlMJCQlcCisgICB8IFJFX0NPTlRFWFRfSU5ERVBfT1BTICAgfCBSRV9OT19CS19CUkFDRVMJCQkJXAorICAgfCBSRV9OT19CS19QQVJFTlMgICAgICAgIHwgUkVfTk9fQktfVkJBUgkJCQlcCisgICB8IFJFX0NPTlRFWFRfSU5WQUxJRF9PUFMgfCBSRV9VTk1BVENIRURfUklHSFRfUEFSRU5fT1JEKQorCisvKiBEaWZmZXJzIGZyb20gLi4uX1BPU0lYX0VYVEVOREVEIGluIHRoYXQgUkVfQ09OVEVYVF9JTkRFUF9PUFMgaXMKKyAgIHJlbW92ZWQgYW5kIFJFX05PX0JLX1JFRlMgaXMgYWRkZWQuICAqLworI2RlZmluZSBSRV9TWU5UQVhfUE9TSVhfTUlOSU1BTF9FWFRFTkRFRAkJCQlcCisgIChfUkVfU1lOVEFYX1BPU0lYX0NPTU1PTiAgfCBSRV9DT05URVhUX0lOREVQX0FOQ0hPUlMJCQlcCisgICB8IFJFX0NPTlRFWFRfSU5WQUxJRF9PUFMgfCBSRV9OT19CS19CUkFDRVMJCQkJXAorICAgfCBSRV9OT19CS19QQVJFTlMgICAgICAgIHwgUkVfTk9fQktfUkVGUwkJCQlcCisgICB8IFJFX05PX0JLX1ZCQVIJICAgIHwgUkVfVU5NQVRDSEVEX1JJR0hUX1BBUkVOX09SRCkKKy8qIFtbW2VuZCBzeW50YXhlc11dXSAqLworDAorLyogTWF4aW11bSBudW1iZXIgb2YgZHVwbGljYXRlcyBhbiBpbnRlcnZhbCBjYW4gYWxsb3cuICBTb21lIHN5c3RlbXMKKyAgIChlcnJvbmVvdXNseSkgZGVmaW5lIHRoaXMgaW4gb3RoZXIgaGVhZGVyIGZpbGVzLCBidXQgd2Ugd2FudCBvdXIKKyAgIHZhbHVlLCBzbyByZW1vdmUgYW55IHByZXZpb3VzIGRlZmluZS4gICovCisjIGlmZGVmIFJFX0RVUF9NQVgKKyMgIHVuZGVmIFJFX0RVUF9NQVgKKyMgZW5kaWYKKy8qIElmIHNpemVvZihpbnQpID09IDIsIHRoZW4gKCgxIDw8IDE1KSAtIDEpIG92ZXJmbG93cy4gICovCisjIGRlZmluZSBSRV9EVVBfTUFYICgweDdmZmYpCisjZW5kaWYKKworCisvKiBQT1NJWCBgY2ZsYWdzJyBiaXRzIChpLmUuLCBpbmZvcm1hdGlvbiBmb3IgYHJlZ2NvbXAnKS4gICovCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiB1c2UgZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9uIHN5bnRheC4KKyAgIElmIG5vdCBzZXQsIHRoZW4gdXNlIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbiBzeW50YXguICAqLworI2RlZmluZSBSRUdfRVhURU5ERUQgMQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gaWdub3JlIGNhc2Ugd2hlbiBtYXRjaGluZy4KKyAgIElmIG5vdCBzZXQsIHRoZW4gY2FzZSBpcyBzaWduaWZpY2FudC4gICovCisjZGVmaW5lIFJFR19JQ0FTRSAoUkVHX0VYVEVOREVEIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBhbmNob3JzIGRvIG5vdCBtYXRjaCBhdCBuZXdsaW5lCisgICAgIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZy4KKyAgIElmIG5vdCBzZXQsIHRoZW4gYW5jaG9ycyBkbyBtYXRjaCBhdCBuZXdsaW5lcy4gICovCisjZGVmaW5lIFJFR19ORVdMSU5FIChSRUdfSUNBU0UgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIHJlcG9ydCBvbmx5IHN1Y2Nlc3Mgb3IgZmFpbCBpbiByZWdleGVjLgorICAgSWYgbm90IHNldCwgdGhlbiByZXR1cm5zIGRpZmZlciBiZXR3ZWVuIG5vdCBtYXRjaGluZyBhbmQgZXJyb3JzLiAgKi8KKyNkZWZpbmUgUkVHX05PU1VCIChSRUdfTkVXTElORSA8PCAxKQorCisKKy8qIFBPU0lYIGBlZmxhZ3MnIGJpdHMgKGkuZS4sIGluZm9ybWF0aW9uIGZvciByZWdleGVjKS4gICovCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiB0aGUgYmVnaW5uaW5nLW9mLWxpbmUgb3BlcmF0b3IgZG9lc24ndCBtYXRjaAorICAgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcgKHByZXN1bWFibHkgYmVjYXVzZSBpdCdzIG5vdCB0aGUKKyAgICAgYmVnaW5uaW5nIG9mIGEgbGluZSkuCisgICBJZiBub3Qgc2V0LCB0aGVuIHRoZSBiZWdpbm5pbmctb2YtbGluZSBvcGVyYXRvciBkb2VzIG1hdGNoIHRoZQorICAgICBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4gICovCisjZGVmaW5lIFJFR19OT1RCT0wgMQorCisvKiBMaWtlIFJFR19OT1RCT0wsIGV4Y2VwdCBmb3IgdGhlIGVuZC1vZi1saW5lLiAgKi8KKyNkZWZpbmUgUkVHX05PVEVPTCAoMSA8PCAxKQorCisjaWZkZWYgX19PUFRJT05fUE9TSVhfUkVHRVhQX0dMSUJDCisvKiBVc2UgUE1BVENIWzBdIHRvIGRlbGltaXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNlYXJjaCBpbiB0aGUKKyAgIGJ1ZmZlci4gICovCisjZGVmaW5lIFJFR19TVEFSVEVORCAoMSA8PCAyKQorI2VuZGlmCisKKworLyogSWYgYW55IGVycm9yIGNvZGVzIGFyZSByZW1vdmVkLCBjaGFuZ2VkLCBvciBhZGRlZCwgdXBkYXRlIHRoZQorICAgYHJlX2Vycm9yX21zZycgdGFibGUgaW4gcmVnZXguYy4gICovCit0eXBlZGVmIGVudW0KK3sKKyNpZiBkZWZpbmVkIF9YT1BFTl9TT1VSQ0UgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisgIFJFR19FTk9TWVMgPSAtMSwJLyogVGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbi4gICovCisjZW5kaWYKKworICBSRUdfTk9FUlJPUiA9IDAsCS8qIFN1Y2Nlc3MuICAqLworICBSRUdfTk9NQVRDSCwJCS8qIERpZG4ndCBmaW5kIGEgbWF0Y2ggKGZvciByZWdleGVjKS4gICovCisKKyAgLyogUE9TSVggcmVnY29tcCByZXR1cm4gZXJyb3IgY29kZXMuICAoSW4gdGhlIG9yZGVyIGxpc3RlZCBpbiB0aGUKKyAgICAgc3RhbmRhcmQuKSAgKi8KKyAgUkVHX0JBRFBBVCwJCS8qIEludmFsaWQgcGF0dGVybi4gICovCisgIFJFR19FQ09MTEFURSwJCS8qIEluYWxpZCBjb2xsYXRpbmcgZWxlbWVudC4gICovCisgIFJFR19FQ1RZUEUsCQkvKiBJbnZhbGlkIGNoYXJhY3RlciBjbGFzcyBuYW1lLiAgKi8KKyAgUkVHX0VFU0NBUEUsCQkvKiBUcmFpbGluZyBiYWNrc2xhc2guICAqLworICBSRUdfRVNVQlJFRywJCS8qIEludmFsaWQgYmFjayByZWZlcmVuY2UuICAqLworICBSRUdfRUJSQUNLLAkJLyogVW5tYXRjaGVkIGxlZnQgYnJhY2tldC4gICovCisgIFJFR19FUEFSRU4sCQkvKiBQYXJlbnRoZXNpcyBpbWJhbGFuY2UuICAqLworICBSRUdfRUJSQUNFLAkJLyogVW5tYXRjaGVkIFx7LiAgKi8KKyAgUkVHX0JBREJSLAkJLyogSW52YWxpZCBjb250ZW50cyBvZiBce1x9LiAgKi8KKyAgUkVHX0VSQU5HRSwJCS8qIEludmFsaWQgcmFuZ2UgZW5kLiAgKi8KKyAgUkVHX0VTUEFDRSwJCS8qIFJhbiBvdXQgb2YgbWVtb3J5LiAgKi8KKyAgUkVHX0JBRFJQVCwJCS8qIE5vIHByZWNlZGluZyByZSBmb3IgcmVwZXRpdGlvbiBvcC4gICovCisKKyAgLyogRXJyb3IgY29kZXMgd2UndmUgYWRkZWQuICAqLworICBSRUdfRUVORCwJCS8qIFByZW1hdHVyZSBlbmQuICAqLworICBSRUdfRVNJWkUsCQkvKiBDb21waWxlZCBwYXR0ZXJuIGJpZ2dlciB0aGFuIDJeMTYgYnl0ZXMuICAqLworICBSRUdfRVJQQVJFTgkJLyogVW5tYXRjaGVkICkgb3IgXCk7IG5vdCByZXR1cm5lZCBmcm9tIHJlZ2NvbXAuICAqLworfSByZWdfZXJyY29kZV90OworDAorLyogVGhpcyBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgY29tcGlsZWQgcGF0dGVybi4gIEJlZm9yZSBjYWxsaW5nCisgICB0aGUgcGF0dGVybiBjb21waWxlciwgdGhlIGZpZWxkcyBgYnVmZmVyJywgYGFsbG9jYXRlZCcsIGBmYXN0bWFwJywKKyAgIGFuZCBgdHJhbnNsYXRlJyBjYW4gYmUgc2V0LiAgQWZ0ZXIgdGhlIHBhdHRlcm4gaGFzIGJlZW4gY29tcGlsZWQsCisgICB0aGUgZmllbGRzIGByZV9uc3ViJywgYG5vdF9ib2wnIGFuZCBgbm90X2VvbCcgYXJlIGF2YWlsYWJsZS4gIEFsbAorICAgb3RoZXIgZmllbGRzIGFyZSBwcml2YXRlIHRvIHRoZSByZWdleCByb3V0aW5lcy4gICovCisKKyNpZm5kZWYgUkVfVFJBTlNMQVRFX1RZUEUKKyMgZGVmaW5lIF9fUkVfVFJBTlNMQVRFX1RZUEUgdW5zaWduZWQgY2hhciAqCisjIGlmZGVmIF9fVVNFX0dOVQorIyAgZGVmaW5lIFJFX1RSQU5TTEFURV9UWVBFIF9fUkVfVFJBTlNMQVRFX1RZUEUKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBfX1JFUEJfUFJFRklYKG5hbWUpIG5hbWUKKyNlbHNlCisjIGRlZmluZSBfX1JFUEJfUFJFRklYKG5hbWUpIF9fIyNuYW1lCisjZW5kaWYKKworc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyCit7CisgIC8qIFNwYWNlIHRoYXQgaG9sZHMgdGhlIGNvbXBpbGVkIHBhdHRlcm4uICBJdCBpcyBkZWNsYXJlZCBhcworICAgICBgdW5zaWduZWQgY2hhciAqJyBiZWNhdXNlIGl0cyBlbGVtZW50cyBhcmUgc29tZXRpbWVzIHVzZWQgYXMKKyAgICAgYXJyYXkgaW5kZXhlcy4gICovCisgIHVuc2lnbmVkIGNoYXIgKl9fUkVQQl9QUkVGSVgoYnVmZmVyKTsKKworICAvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gd2hpY2ggYGJ1ZmZlcicgcG9pbnRzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgX19SRVBCX1BSRUZJWChhbGxvY2F0ZWQpOworCisgIC8qIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSB1c2VkIGluIGBidWZmZXInLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgX19SRVBCX1BSRUZJWCh1c2VkKTsKKworICAvKiBTeW50YXggc2V0dGluZyB3aXRoIHdoaWNoIHRoZSBwYXR0ZXJuIHdhcyBjb21waWxlZC4gICovCisgIHJlZ19zeW50YXhfdCBfX1JFUEJfUFJFRklYKHN5bnRheCk7CisKKyAgLyogUG9pbnRlciB0byBhIGZhc3RtYXAsIGlmIGFueSwgb3RoZXJ3aXNlIHplcm8uICByZV9zZWFyY2ggdXNlcyB0aGUKKyAgICAgZmFzdG1hcCwgaWYgdGhlcmUgaXMgb25lLCB0byBza2lwIG92ZXIgaW1wb3NzaWJsZSBzdGFydGluZyBwb2ludHMKKyAgICAgZm9yIG1hdGNoZXMuICAqLworICBjaGFyICpfX1JFUEJfUFJFRklYKGZhc3RtYXApOworCisgIC8qIEVpdGhlciBhIHRyYW5zbGF0ZSB0YWJsZSB0byBhcHBseSB0byBhbGwgY2hhcmFjdGVycyBiZWZvcmUKKyAgICAgY29tcGFyaW5nIHRoZW0sIG9yIHplcm8gZm9yIG5vIHRyYW5zbGF0aW9uLiAgVGhlIHRyYW5zbGF0aW9uIGlzCisgICAgIGFwcGxpZWQgdG8gYSBwYXR0ZXJuIHdoZW4gaXQgaXMgY29tcGlsZWQgYW5kIHRvIGEgc3RyaW5nIHdoZW4gaXQKKyAgICAgaXMgbWF0Y2hlZC4gICovCisgIF9fUkVfVFJBTlNMQVRFX1RZUEUgX19SRVBCX1BSRUZJWCh0cmFuc2xhdGUpOworCisgIC8qIE51bWJlciBvZiBzdWJleHByZXNzaW9ucyBmb3VuZCBieSB0aGUgY29tcGlsZXIuICAqLworICBzaXplX3QgcmVfbnN1YjsKKworICAvKiBaZXJvIGlmIHRoaXMgcGF0dGVybiBjYW5ub3QgbWF0Y2ggdGhlIGVtcHR5IHN0cmluZywgb25lIGVsc2UuCisgICAgIFdlbGwsIGluIHRydXRoIGl0J3MgdXNlZCBvbmx5IGluIGByZV9zZWFyY2hfMicsIHRvIHNlZSB3aGV0aGVyIG9yCisgICAgIG5vdCB3ZSBzaG91bGQgdXNlIHRoZSBmYXN0bWFwLCBzbyB3ZSBkb24ndCBzZXQgdGhpcyBhYnNvbHV0ZWx5CisgICAgIHBlcmZlY3RseTsgc2VlIGByZV9jb21waWxlX2Zhc3RtYXAnICh0aGUgYGR1cGxpY2F0ZScgY2FzZSkuICAqLworICB1bnNpZ25lZCBfX1JFUEJfUFJFRklYKGNhbl9iZV9udWxsKSA6IDE7CisKKyAgLyogSWYgUkVHU19VTkFMTE9DQVRFRCwgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGByZWdzJyBzdHJ1Y3R1cmUKKyAgICAgZm9yIGBtYXggKFJFX05SRUdTLCByZV9uc3ViICsgMSknIGdyb3Vwcy4KKyAgICAgSWYgUkVHU19SRUFMTE9DQVRFLCByZWFsbG9jYXRlIHNwYWNlIGlmIG5lY2Vzc2FyeS4KKyAgICAgSWYgUkVHU19GSVhFRCwgdXNlIHdoYXQncyB0aGVyZS4gICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBSRUdTX1VOQUxMT0NBVEVEIDAKKyMgZGVmaW5lIFJFR1NfUkVBTExPQ0FURSAxCisjIGRlZmluZSBSRUdTX0ZJWEVEIDIKKyNlbmRpZgorICB1bnNpZ25lZCBfX1JFUEJfUFJFRklYKHJlZ3NfYWxsb2NhdGVkKSA6IDI7CisKKyAgLyogU2V0IHRvIHplcm8gd2hlbiBgcmVnZXhfY29tcGlsZScgY29tcGlsZXMgYSBwYXR0ZXJuOyBzZXQgdG8gb25lCisgICAgIGJ5IGByZV9jb21waWxlX2Zhc3RtYXAnIGlmIGl0IHVwZGF0ZXMgdGhlIGZhc3RtYXAuICAqLworICB1bnNpZ25lZCBfX1JFUEJfUFJFRklYKGZhc3RtYXBfYWNjdXJhdGUpIDogMTsKKworICAvKiBJZiBzZXQsIGByZV9tYXRjaF8yJyBkb2VzIG5vdCByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgc3ViZXhwcmVzc2lvbnMuICAqLworICB1bnNpZ25lZCBfX1JFUEJfUFJFRklYKG5vX3N1YikgOiAxOworCisgIC8qIElmIHNldCwgYSBiZWdpbm5pbmctb2YtbGluZSBhbmNob3IgZG9lc24ndCBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzdHJpbmcuICAqLworICB1bnNpZ25lZCBfX1JFUEJfUFJFRklYKG5vdF9ib2wpIDogMTsKKworICAvKiBTaW1pbGFybHkgZm9yIGFuIGVuZC1vZi1saW5lIGFuY2hvci4gICovCisgIHVuc2lnbmVkIF9fUkVQQl9QUkVGSVgobm90X2VvbCkgOiAxOworCisgIC8qIElmIHRydWUsIGFuIGFuY2hvciBhdCBhIG5ld2xpbmUgbWF0Y2hlcy4gICovCisgIHVuc2lnbmVkIF9fUkVQQl9QUkVGSVgobmV3bGluZV9hbmNob3IpIDogMTsKK307CisKK3R5cGVkZWYgc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyIHJlZ2V4X3Q7CisMCisvKiBUeXBlIGZvciBieXRlIG9mZnNldHMgd2l0aGluIHRoZSBzdHJpbmcuICBQT1NJWCBtYW5kYXRlcyB0aGlzLiAgKi8KK3R5cGVkZWYgaW50IHJlZ29mZl90OworCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3ZSBzdG9yZSByZWdpc3RlciBtYXRjaCBkYXRhIGluLiAgU2VlCisgICByZWdleC50ZXhpbmZvIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2Ygd2hhdCByZWdpc3RlcnMgbWF0Y2guICAqLworc3RydWN0IHJlX3JlZ2lzdGVycworeworICB1bnNpZ25lZCBudW1fcmVnczsKKyAgcmVnb2ZmX3QgKnN0YXJ0OworICByZWdvZmZfdCAqZW5kOworfTsKKworCisvKiBJZiBgcmVnc19hbGxvY2F0ZWQnIGlzIFJFR1NfVU5BTExPQ0FURUQgaW4gdGhlIHBhdHRlcm4gYnVmZmVyLAorICAgYHJlX21hdGNoXzInIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYXQgbGVhc3QgdGhpcyBtYW55IHJlZ2lzdGVycworICAgdGhlIGZpcnN0IHRpbWUgYSBgcmVncycgc3RydWN0dXJlIGlzIHBhc3NlZC4gICovCisjIGlmbmRlZiBSRV9OUkVHUworIyAgZGVmaW5lIFJFX05SRUdTIDMwCisjIGVuZGlmCisjZW5kaWYKKworCisvKiBQT1NJWCBzcGVjaWZpY2F0aW9uIGZvciByZWdpc3RlcnMuICBBc2lkZSBmcm9tIHRoZSBkaWZmZXJlbnQgbmFtZXMgdGhhbgorICAgYHJlX3JlZ2lzdGVycycsIFBPU0lYIHVzZXMgYW4gYXJyYXkgb2Ygc3RydWN0dXJlcywgaW5zdGVhZCBvZiBhCisgICBzdHJ1Y3R1cmUgb2YgYXJyYXlzLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHJlZ29mZl90IHJtX3NvOyAgLyogQnl0ZSBvZmZzZXQgZnJvbSBzdHJpbmcncyBzdGFydCB0byBzdWJzdHJpbmcncyBzdGFydC4gICovCisgIHJlZ29mZl90IHJtX2VvOyAgLyogQnl0ZSBvZmZzZXQgZnJvbSBzdHJpbmcncyBzdGFydCB0byBzdWJzdHJpbmcncyBlbmQuICAqLworfSByZWdtYXRjaF90OworDAorLyogRGVjbGFyYXRpb25zIGZvciByb3V0aW5lcy4gICovCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFNldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBzeW50YXggdG8gU1lOVEFYLCBhbmQgcmV0dXJuIHRoZSBvbGQgc3ludGF4LgorICAgWW91IGNhbiBhbHNvIHNpbXBseSBhc3NpZ24gdG8gdGhlIGByZV9zeW50YXhfb3B0aW9ucycgdmFyaWFibGUuICAqLworZXh0ZXJuIHJlZ19zeW50YXhfdCByZV9zZXRfc3ludGF4IChyZWdfc3ludGF4X3QgX19zeW50YXgpOworCisvKiBDb21waWxlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gUEFUVEVSTiwgd2l0aCBsZW5ndGggTEVOR1RICisgICBhbmQgc3ludGF4IGdpdmVuIGJ5IHRoZSBnbG9iYWwgYHJlX3N5bnRheF9vcHRpb25zJywgaW50byB0aGUgYnVmZmVyCisgICBCVUZGRVIuICBSZXR1cm4gTlVMTCBpZiBzdWNjZXNzZnVsLCBhbmQgYW4gZXJyb3Igc3RyaW5nIGlmIG5vdC4KKworICAgVG8gZnJlZSB0aGUgYWxsb2NhdGVkIHN0b3JhZ2UsIHlvdSBtdXN0IGNhbGwgYHJlZ2ZyZWUnIG9uIEJVRkZFUi4KKyAgIE5vdGUgdGhhdCB0aGUgdHJhbnNsYXRlIHRhYmxlIG11c3QgZWl0aGVyIGhhdmUgYmVlbiBpbml0aWFsaXNlZCBieQorICAgYHJlZ2NvbXAnLCB3aXRoIGEgbWFsbG9jJ2VkIHZhbHVlLCBvciBzZXQgdG8gTlVMTCBiZWZvcmUgY2FsbGluZworICAgYHJlZ2ZyZWUnLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpyZV9jb21waWxlX3BhdHRlcm4gKGNvbnN0IGNoYXIgKl9fcGF0dGVybiwgc2l6ZV90IF9fbGVuZ3RoLAorCQkJCSAgICAgICBzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKl9fYnVmZmVyKTsKKworCisvKiBDb21waWxlIGEgZmFzdG1hcCBmb3IgdGhlIGNvbXBpbGVkIHBhdHRlcm4gaW4gQlVGRkVSOyB1c2VkIHRvCisgICBhY2NlbGVyYXRlIHNlYXJjaGVzLiAgUmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCBhbmQgLTIgaWYgd2FzIGFuCisgICBpbnRlcm5hbCBlcnJvci4gICovCitleHRlcm4gaW50IHJlX2NvbXBpbGVfZmFzdG1hcCAoc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpfX2J1ZmZlcik7CisKKworLyogU2VhcmNoIGluIHRoZSBzdHJpbmcgU1RSSU5HICh3aXRoIGxlbmd0aCBMRU5HVEgpIGZvciB0aGUgcGF0dGVybgorICAgY29tcGlsZWQgaW50byBCVUZGRVIuICBTdGFydCBzZWFyY2hpbmcgYXQgcG9zaXRpb24gU1RBUlQsIGZvciBSQU5HRQorICAgY2hhcmFjdGVycy4gIFJldHVybiB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1hdGNoLCAtMSBmb3Igbm8KKyAgIG1hdGNoLCBvciAtMiBmb3IgYW4gaW50ZXJuYWwgZXJyb3IuICBBbHNvIHJldHVybiByZWdpc3RlcgorICAgaW5mb3JtYXRpb24gaW4gUkVHUyAoaWYgUkVHUyBhbmQgQlVGRkVSLT5ub19zdWIgYXJlIG5vbnplcm8pLiAgKi8KK2V4dGVybiBpbnQgcmVfc2VhcmNoIChzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKl9fYnVmZmVyLCBjb25zdCBjaGFyICpfX3N0cmluZywKKwkJICAgICAgaW50IF9fbGVuZ3RoLCBpbnQgX19zdGFydCwgaW50IF9fcmFuZ2UsCisJCSAgICAgIHN0cnVjdCByZV9yZWdpc3RlcnMgKl9fcmVncyk7CisKKworLyogTGlrZSBgcmVfc2VhcmNoJywgYnV0IHNlYXJjaCBpbiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBTVFJJTkcxIGFuZAorICAgU1RSSU5HMi4gIEFsc28sIHN0b3Agc2VhcmNoaW5nIGF0IGluZGV4IFNUQVJUICsgU1RPUC4gICovCitleHRlcm4gaW50IHJlX3NlYXJjaF8yIChzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKl9fYnVmZmVyLAorCQkJY29uc3QgY2hhciAqX19zdHJpbmcxLCBpbnQgX19sZW5ndGgxLAorCQkJY29uc3QgY2hhciAqX19zdHJpbmcyLCBpbnQgX19sZW5ndGgyLCBpbnQgX19zdGFydCwKKwkJCWludCBfX3JhbmdlLCBzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpfX3JlZ3MsIGludCBfX3N0b3ApOworCisKKy8qIExpa2UgYHJlX3NlYXJjaCcsIGJ1dCByZXR1cm4gaG93IG1hbnkgY2hhcmFjdGVycyBpbiBTVFJJTkcgdGhlIHJlZ2V4cAorICAgaW4gQlVGRkVSIG1hdGNoZWQsIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIFNUQVJULiAgKi8KK2V4dGVybiBpbnQgcmVfbWF0Y2ggKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqX19idWZmZXIsIGNvbnN0IGNoYXIgKl9fc3RyaW5nLAorCQkgICAgIGludCBfX2xlbmd0aCwgaW50IF9fc3RhcnQsIHN0cnVjdCByZV9yZWdpc3RlcnMgKl9fcmVncyk7CisKKworLyogUmVsYXRlcyB0byBgcmVfbWF0Y2gnIGFzIGByZV9zZWFyY2hfMicgcmVsYXRlcyB0byBgcmVfc2VhcmNoJy4gICovCitleHRlcm4gaW50IHJlX21hdGNoXzIgKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqX19idWZmZXIsCisJCSAgICAgICBjb25zdCBjaGFyICpfX3N0cmluZzEsIGludCBfX2xlbmd0aDEsCisJCSAgICAgICBjb25zdCBjaGFyICpfX3N0cmluZzIsIGludCBfX2xlbmd0aDIsIGludCBfX3N0YXJ0LAorCQkgICAgICAgc3RydWN0IHJlX3JlZ2lzdGVycyAqX19yZWdzLCBpbnQgX19zdG9wKTsKKworCisvKiBTZXQgUkVHUyB0byBob2xkIE5VTV9SRUdTIHJlZ2lzdGVycywgc3RvcmluZyB0aGVtIGluIFNUQVJUUyBhbmQKKyAgIEVORFMuICBTdWJzZXF1ZW50IG1hdGNoZXMgdXNpbmcgQlVGRkVSIGFuZCBSRUdTIHdpbGwgdXNlIHRoaXMgbWVtb3J5CisgICBmb3IgcmVjb3JkaW5nIHJlZ2lzdGVyIGluZm9ybWF0aW9uLiAgU1RBUlRTIGFuZCBFTkRTIG11c3QgYmUKKyAgIGFsbG9jYXRlZCB3aXRoIG1hbGxvYywgYW5kIG11c3QgZWFjaCBiZSBhdCBsZWFzdCBgTlVNX1JFR1MgKiBzaXplb2YKKyAgIChyZWdvZmZfdCknIGJ5dGVzIGxvbmcuCisKKyAgIElmIE5VTV9SRUdTID09IDAsIHRoZW4gc3Vic2VxdWVudCBtYXRjaGVzIHNob3VsZCBhbGxvY2F0ZSB0aGVpciBvd24KKyAgIHJlZ2lzdGVyIGRhdGEuCisKKyAgIFVubGVzcyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIGZpcnN0IHNlYXJjaCBvciBtYXRjaCB1c2luZworICAgUEFUVEVSTl9CVUZGRVIgd2lsbCBhbGxvY2F0ZSBpdHMgb3duIHJlZ2lzdGVyIGRhdGEsIHdpdGhvdXQKKyAgIGZyZWVpbmcgdGhlIG9sZCBkYXRhLiAgKi8KK2V4dGVybiB2b2lkIHJlX3NldF9yZWdpc3RlcnMgKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqX19idWZmZXIsCisJCQkgICAgICBzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpfX3JlZ3MsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgX19udW1fcmVncywKKwkJCSAgICAgIHJlZ29mZl90ICpfX3N0YXJ0cywgcmVnb2ZmX3QgKl9fZW5kcyk7CisjZW5kaWYJLyogVXNlIEdOVSAqLworCisjaWYgZGVmaW5lZCBfUkVHRVhfUkVfQ09NUCB8fCAoZGVmaW5lZCBfTElCQyAmJiBkZWZpbmVkIF9fVVNFX0JTRCkKKyMgaWZuZGVmIF9DUkFZCisvKiA0LjIgYnNkIGNvbXBhdGliaWxpdHkuICAqLworZXh0ZXJuIGNoYXIgKnJlX2NvbXAgKGNvbnN0IGNoYXIgKik7CitleHRlcm4gaW50IHJlX2V4ZWMgKGNvbnN0IGNoYXIgKik7CisjIGVuZGlmCisjZW5kaWYKKworLyogR0NDIDIuOTUgYW5kIGxhdGVyIGhhdmUgIl9fcmVzdHJpY3QiOyBDOTkgY29tcGlsZXJzIGhhdmUKKyAgICJyZXN0cmljdCIsIGFuZCAiY29uZmlndXJlIiBtYXkgaGF2ZSBkZWZpbmVkICJyZXN0cmljdCIuICAqLworI2lmbmRlZiBfX3Jlc3RyaWN0CisjIGlmICEgKDIgPCBfX0dOVUNfXyB8fCAoMiA9PSBfX0dOVUNfXyAmJiA5NSA8PSBfX0dOVUNfTUlOT1JfXykpCisjICBpZiBkZWZpbmVkIHJlc3RyaWN0IHx8IDE5OTkwMUwgPD0gX19TVERDX1ZFUlNJT05fXworIyAgIGRlZmluZSBfX3Jlc3RyaWN0IHJlc3RyaWN0CisjICBlbHNlCisjICAgZGVmaW5lIF9fcmVzdHJpY3QKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKy8qIGdjYyAzLjEgYW5kIHVwIHN1cHBvcnQgdGhlIFtyZXN0cmljdF0gc3ludGF4LiAgKi8KKyNpZm5kZWYgX19yZXN0cmljdF9hcnIKKyMgaWYgKF9fR05VQ19fID4gMyB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSAxKSkgXAorICAgICAmJiAhZGVmaW5lZCBfX0dOVUdfXworIyAgZGVmaW5lIF9fcmVzdHJpY3RfYXJyIF9fcmVzdHJpY3QKKyMgZWxzZQorIyAgZGVmaW5lIF9fcmVzdHJpY3RfYXJyCisjIGVuZGlmCisjZW5kaWYKKworLyogUE9TSVggY29tcGF0aWJpbGl0eS4gICovCitleHRlcm4gaW50IHJlZ2NvbXAgKHJlZ2V4X3QgKl9fcmVzdHJpY3QgX19wcmVnLAorCQkgICAgY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdHRlcm4sCisJCSAgICBpbnQgX19jZmxhZ3MpOworCitleHRlcm4gaW50IHJlZ2V4ZWMgKGNvbnN0IHJlZ2V4X3QgKl9fcmVzdHJpY3QgX19wcmVnLAorCQkgICAgY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cmluZywgc2l6ZV90IF9fbm1hdGNoLAorCQkgICAgcmVnbWF0Y2hfdCBfX3BtYXRjaFtfX3Jlc3RyaWN0X2Fycl0sCisJCSAgICBpbnQgX19lZmxhZ3MpOworCitleHRlcm4gc2l6ZV90IHJlZ2Vycm9yIChpbnQgX19lcnJjb2RlLCBjb25zdCByZWdleF90ICpfX3Jlc3RyaWN0IF9fcHJlZywKKwkJCWNoYXIgKl9fcmVzdHJpY3QgX19lcnJidWYsIHNpemVfdCBfX2VycmJ1Zl9zaXplKTsKKworZXh0ZXJuIHZvaWQgcmVnZnJlZSAocmVnZXhfdCAqX19wcmVnKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgkvKiBDKysgKi8KKworI2VuZGlmIC8qIHJlZ2V4LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmVnZXhwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JlZ2V4cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOTc5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JlZ2V4cC5oCkBAIC0wLDAgKzEsMjI4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDQsIDIwMDgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1JFR0VYUF9ICisjZGVmaW5lIF9SRUdFWFBfSAkxCisKKy8qIFRoZSBjb250ZW50cyBvZiB0aGlzIGhlYWRlciBmaWxlIHdhcyBmaXJzdCBzdGFuZGFyZGl6ZWQgaW4gWC9PcGVuCisgICBTeXN0ZW0gSW50ZXJmYWNlIGFuZCBIZWFkZXJzIElzc3VlIDIsIG9yaWdpbmFsbHkgY29taW5nIGZyb20gU3lzVi4KKyAgIEluIGlzc3VlIDQsIHZlcnNpb24gMiwgaXQgaXMgbWFya2VkIGFzIFRPIEJFIFdJVERSQVdOLCBhbmQgaXQgaGFzCisgICBiZWVuIHdpdGhkcmF3biBpbiBTVVN2My4KKworICAgVGhpcyBjb2RlIHNob3VsZG4ndCBiZSB1c2VkIGluIGFueSBuZXdseSB3cml0dGVuIGNvZGUuICBJdCBpcworICAgaW5jbHVkZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLiAgVXNlIHRoZSBQT1NJWCBkZWZpbml0aW9uCisgICBpbiA8cmVnZXguaD4gZm9yIHBvcnRhYmxlIGFwcGxpY2F0aW9ucyBhbmQgYSByZWFzb25hYmxlIGludGVyZmFjZS4gICovCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIFRoZSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBoZXJlIGVtdWxhdGVzIHRoZSBuZWVkZWQgZnVuY3Rpb25hbGl0eQorICAgYnkgbWFwcGluZyB0byB0aGUgUE9TSVggcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXIuICBUaGUgaW50ZXJmYWNlCisgICBmb3IgdGhlIGhlcmUgaW5jbHVkZWQgZnVuY3Rpb24gaXMgd2VpcmQgKHRoaXMgcmVhbGx5IGlzIGEgaGFybWxlc3MKKyAgIHdvcmQpLgorCisgICBUaGUgdXNlciBoYXMgdG8gcHJvdmlkZSBzaXggbWFjcm9zIGJlZm9yZSB0aGlzIGhlYWRlciBmaWxlIGNhbiBiZQorICAgaW5jbHVkZWQ6CisKKyAgIElOSVQJCURlY2xhcmF0aW9ucyB2b3IgdmFyaWFibGVzIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IHRoZQorCQlvdGhlciBtYWNyb3MuCisKKyAgIEdFVEMoKQlSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgcmVndWxhcgorCQlleHByZXNzaW9uIHBhdHRlcm4uICBTdWNjZXNzaXZlIGNhbGxzIHNob3VsZCByZXR1cm4KKwkJc3VjY2Vzc2l2ZSBjaGFyYWN0ZXJzLgorCisgICBQRUVLQygpCVJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSByZWd1bGFyCisJCWV4cHJlc3Npb24gcGF0dGVybi4gIEltbWVkaWF0ZWx5IHN1Y2Nlc3NpdmUgY2FsbHMgdG8KKwkJUEVFS0MoKSBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIGNoYXJhY3RlciB3aGljaCBzaG91bGQKKwkJYWxzbyBiZSB0aGUgbmV4dCBjaGFyYWN0ZXIgcmV0dXJuZWQgYnkgR0VUQygpLgorCisgICBVTkdFVEMoYykJQ2F1c2UgYGMnIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBuZXh0IGNhbGwgdG8gR0VUQygpIGFuZAorCQlQRUVLQygpLgorCisgICBSRVRVUk4ocHRyKQlVc2VkIGZvciBub3JtYWwgZXhpdCBvZiB0aGUgYGNvbXBpbGUnIGZ1bmN0aW9uLiAgYHB0cicKKwkJaXMgYSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGxhc3QgY2hhcmFjdGVyIG9mCisJCXRoZSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24uCisKKyAgIEVSUk9SKHZhbCkJVXNlZCBmb3IgYWJub3JtYWwgcmV0dXJuIGZyb20gYGNvbXBpbGUnLiAgYHZhbCcgaXMgdGhlCisJCWVycm9yIG51bWJlci4gIFRoZSBlcnJvciBjb2RlcyBhcmU6CisJCTExCVJhbmdlIGVuZHBvaW50IHRvbyBsYXJnZS4KKwkJMTYJQmFkIG51bWJlci4KKwkJMjUJXGRpZ2l0IG91dCBvZiByYW5nZS4KKwkJMzYJSWxsZWdhbCBvciBtaXNzaW5nIGRlbGltaXRlci4KKwkJNDEJTm8gcmVtZW1iZXJlZCBzZWFyY2ggc3RyaW5nLgorCQk0MglcKCBcKSBpbWJhbGFuY2UuCisJCTQzCVRvbyBtYW55IFwoLgorCQk0NAlNb3JlIHRhbiB0d28gbnVtYmVycyBnaXZlbiBpbiBceyBcfS4KKwkJNDUJfSBleHBlY3RlZCBhZnRlciBcLgorCQk0NglGaXJzdCBudW1iZXIgZXhjZWVkcyBzZWNvbmQgaW4gXHsgXH0uCisJCTQ5CVsgXSBpbWJhbGFuY2UuCisJCTUwCVJlZ3VsYXIgZXhwcmVzc2lvbiBvdmVyZmxvdy4KKworICAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIEludGVyZmFjZSB2YXJpYWJsZXMuICBUaGV5IGNvbnRhaW4gdGhlIHJlc3VsdHMgb2YgdGhlIHN1Y2Nlc3NmdWwKKyAgIGNhbGxzIHRvIGBzZXRwJyBhbmQgYGFkdmFuY2UnLiAgKi8KK2V4dGVybiBjaGFyICpsb2MxOworZXh0ZXJuIGNoYXIgKmxvYzI7CisKKy8qIFRoZSB1c2Ugb2YgdGhpcyB2YXJpYWJsZSBpbiB0aGUgYGFkdmFuY2UnIGZ1bmN0aW9uIGlzIG5vdAorICAgc3VwcG9ydGVkLiAgKi8KK2V4dGVybiBjaGFyICpsb2NzOworCisKKyNpZm5kZWYgX19ET19OT1RfREVGSU5FX0NPTVBJTEUKKy8qIEdldCBhbmQgY29tcGlsZSB0aGUgdXNlciBzdXBwbGllZCBwYXR0ZXJuIHVwIHRvIGVuZCBvZiBsaW5lIG9yCisgICBzdHJpbmcgb3IgdW50aWwgRU9GIGlzIHNlZW4sIHdoYXRldmVyIGhhcHBlbnMgZmlyc3QuICBUaGUgcmVzdWx0IGlzCisgICBwbGFjZWQgaW4gdGhlIGJ1ZmZlciBzdGFydGluZyBhdCBFWFBCVUYgYW5kIGRlbGltaXRlZCBieSBFTkRCVUYuCisKKyAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGRlZmluZWQgaW4gdGhlIGxpYmMgaXRzZWxmIHNpbmNlIGl0IGRlcGVuZHMKKyAgIG9uIHRoZSBtYWNyb3MuICAqLworY2hhciAqCitjb21waWxlIChjaGFyICpfX3Jlc3RyaWN0IGluc3RyaW5nLCBjaGFyICpfX3Jlc3RyaWN0IGV4cGJ1ZiwKKwkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IGVuZGJ1ZiwgaW50IGVvZikKK3sKKyAgY2hhciAqX19pbnB1dF9idWZmZXIgPSBOVUxMOworICBzaXplX3QgX19pbnB1dF9zaXplID0gMDsKKyAgc2l6ZV90IF9fY3VycmVudF9zaXplID0gMDsKKyAgaW50IF9fY2g7CisgIGludCBfX2Vycm9yOworICBJTklUCisKKyAgLyogQWxpZ24gdGhlIGV4cHJlc3Npb24gYnVmZmVyIGFjY29yZGluZyB0byB0aGUgbmVlZHMgZm9yIGFuIG9iamVjdAorICAgICBvZiB0eXBlIGByZWdleF90Jy4gIFRoZW4gY2hlY2sgZm9yIG1pbmltdW0gc2l6ZSBvZiB0aGUgYnVmZmVyIGZvcgorICAgICB0aGUgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uLiAgKi8KKyAgcmVnZXhfdCAqX19leHByX3B0cjsKKyMgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisgIGNvbnN0IHNpemVfdCBfX3JlcSA9IF9fYWxpZ25vZl9fIChyZWdleF90ICopOworIyBlbHNlCisgIC8qIEhvdyBzaGFsbCB3ZSBmaW5kIG91dD8gIFdlIHNpbXBseSBndWVzcyBpdCBhbmQgY2FuIGNoYW5nZSBpdCBpcworICAgICB0aGlzIHJlYWxseSBwcm9vZnMgdG8gYmUgd3JvbmcuICAqLworICBjb25zdCBzaXplX3QgX19yZXEgPSA4OworIyBlbmRpZgorICBleHBidWYgKz0gX19yZXE7CisgIGV4cGJ1ZiAtPSAoZXhwYnVmIC0gKChjaGFyICopIDApKSAlIF9fcmVxOworICBpZiAoZW5kYnVmIDwgZXhwYnVmICsgc2l6ZW9mIChyZWdleF90KSkKKyAgICB7CisgICAgICBFUlJPUiAoNTApOworICAgIH0KKyAgX19leHByX3B0ciA9IChyZWdleF90ICopIGV4cGJ1ZjsKKyAgLyogVGhlIHJlbWFpbmluZyBzcGFjZSBpbiB0aGUgYnVmZmVyIGNhbiBiZSB1c2VkIGZvciB0aGUgY29tcGlsZWQKKyAgICAgcGF0dGVybi4gICovCisgIF9fZXhwcl9wdHItPl9fUkVQQl9QUkVGSVggKGJ1ZmZlcikgPSBleHBidWYgKyBzaXplb2YgKHJlZ2V4X3QpOworICBfX2V4cHJfcHRyLT5fX1JFUEJfUFJFRklYIChhbGxvY2F0ZWQpCisgICAgPSBlbmRidWYgLSAoY2hhciAqKSBfX2V4cHJfcHRyLT5fX1JFUEJfUFJFRklYIChidWZmZXIpOworCisgIHdoaWxlICgoX19jaCA9IChHRVRDICgpKSkgIT0gZW9mKQorICAgIHsKKyAgICAgIGlmIChfX2NoID09ICdcMCcgfHwgX19jaCA9PSAnXG4nKQorCXsKKwkgIFVOR0VUQyAoX19jaCk7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChfX2N1cnJlbnRfc2l6ZSArIDEgPj0gX19pbnB1dF9zaXplKQorCXsKKwkgIHNpemVfdCBfX25ld19zaXplID0gX19pbnB1dF9zaXplID8gMiAqIF9faW5wdXRfc2l6ZSA6IDEyODsKKwkgIGNoYXIgKl9fbmV3X3Jvb20gPSAoY2hhciAqKSBhbGxvY2EgKF9fbmV3X3NpemUpOworCSAgLyogU2VlIHdoZXRoZXIgd2UgY2FuIHVzZSB0aGUgb2xkIGJ1ZmZlci4gICovCisJICBpZiAoX19uZXdfcm9vbSArIF9fbmV3X3NpemUgPT0gX19pbnB1dF9idWZmZXIpCisJICAgIHsKKwkgICAgICBfX2lucHV0X3NpemUgKz0gX19uZXdfc2l6ZTsKKwkgICAgICBfX2lucHV0X2J1ZmZlciA9IChjaGFyICopIG1lbWNweSAoX19uZXdfcm9vbSwgX19pbnB1dF9idWZmZXIsCisJCQkJCSAgICAgICBfX2N1cnJlbnRfc2l6ZSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKF9faW5wdXRfYnVmZmVyICsgX19pbnB1dF9zaXplID09IF9fbmV3X3Jvb20pCisJICAgIF9faW5wdXRfc2l6ZSArPSBfX25ld19zaXplOworCSAgZWxzZQorCSAgICB7CisJICAgICAgX19pbnB1dF9zaXplID0gX19uZXdfc2l6ZTsKKwkgICAgICBfX2lucHV0X2J1ZmZlciA9IChjaGFyICopIG1lbWNweSAoX19uZXdfcm9vbSwgX19pbnB1dF9idWZmZXIsCisJCQkJCQlfX2N1cnJlbnRfc2l6ZSk7CisJICAgIH0KKwl9CisgICAgICBfX2lucHV0X2J1ZmZlcltfX2N1cnJlbnRfc2l6ZSsrXSA9IF9fY2g7CisgICAgfQorICBpZiAoX19jdXJyZW50X3NpemUpCisgICAgX19pbnB1dF9idWZmZXJbX19jdXJyZW50X3NpemUrK10gPSAnXDAnOworICBlbHNlCisgICAgX19pbnB1dF9idWZmZXIgPSAiIjsKKworICAvKiBOb3cgY29tcGlsZSB0aGUgcGF0dGVybi4gICovCisgIF9fZXJyb3IgPSByZWdjb21wIChfX2V4cHJfcHRyLCBfX2lucHV0X2J1ZmZlciwgUkVHX05FV0xJTkUpOworICBpZiAoX19lcnJvciAhPSAwKQorICAgIC8qIE9oIHdlbGwsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIFBPU0lYIGVycm9yIGNvZGVzLiAgKi8KKyAgICBzd2l0Y2ggKF9fZXJyb3IpCisgICAgICB7CisgICAgICBjYXNlIFJFR19CQURQQVQ6CisgICAgICBjYXNlIFJFR19FQ09MTEFURToKKyAgICAgIGNhc2UgUkVHX0VDVFlQRToKKyAgICAgIGNhc2UgUkVHX0VFU0NBUEU6CisgICAgICBjYXNlIFJFR19CQURSUFQ6CisgICAgICBjYXNlIFJFR19FRU5EOgorICAgICAgY2FzZSBSRUdfRVJQQVJFTjoKKyAgICAgIGRlZmF1bHQ6CisJLyogVGhlcmUgaXMgbm8gbWF0Y2hpbmcgZXJyb3IgY29kZS4gICovCisJUkVUVVJOICgzNik7CisgICAgICBjYXNlIFJFR19FU1VCUkVHOgorCVJFVFVSTiAoMjUpOworICAgICAgY2FzZSBSRUdfRUJSQUNLOgorCVJFVFVSTiAoNDkpOworICAgICAgY2FzZSBSRUdfRVBBUkVOOgorCVJFVFVSTiAoNDIpOworICAgICAgY2FzZSBSRUdfRUJSQUNFOgorCVJFVFVSTiAoNDQpOworICAgICAgY2FzZSBSRUdfQkFEQlI6CisJUkVUVVJOICg0Nik7CisgICAgICBjYXNlIFJFR19FUkFOR0U6CisJUkVUVVJOICgxMSk7CisgICAgICBjYXNlIFJFR19FU1BBQ0U6CisgICAgICBjYXNlIFJFR19FU0laRToKKwlFUlJPUiAoNTApOworICAgICAgfQorCisgIC8qIEV2ZXJ5dGhpbmcgaXMgb2suICAqLworICBSRVRVUk4gKChjaGFyICopIChfX2V4cHJfcHRyLT5fX1JFUEJfUFJFRklYIChidWZmZXIpCisJCSAgICArIF9fZXhwcl9wdHItPl9fUkVQQl9QUkVGSVggKHVzZWQpKSk7Cit9CisjZW5kaWYKKworCisvKiBGaW5kIHRoZSBuZXh0IG1hdGNoIGluIFNUUklORy4gIFRoZSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24gaXMKKyAgIGZvdW5kIGluIHRoZSBidWZmZXIgc3RhcnRpbmcgYXQgRVhQQlVGLiAgYGxvYzEnIHdpbGwgcmV0dXJuIHRoZQorICAgZmlyc3QgY2hhcmFjdGVyIG1hdGNoZWQgYW5kIGBsb2MyJyBwb2ludHMgdG8gdGhlIG5leHQgdW5tYXRjaGVkCisgICBjaGFyYWN0ZXIuICAqLworZXh0ZXJuIGludCBzdGVwIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zdHJpbmcsCisJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19leHBidWYpIF9fVEhST1c7CisKKy8qIE1hdGNoIHRoZSBiZWdpbm5pbmcgb2YgU1RSSU5HIHdpdGggdGhlIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgaW4gRVhQQlVGLiAgSWYgdGhlIG1hdGNoIGlzIHN1Y2Nlc3NmdWwgYGxvYzInIHdpbGwgY29udGFpbiB0aGUKKyAgIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCB1bm1hdGNoZWQgY2hhcmFjdGVyLiAgKi8KK2V4dGVybiBpbnQgYWR2YW5jZSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3RyaW5nLAorCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZXhwYnVmKSBfX1RIUk9XOworCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiByZWdleHAuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9yZXNvbHYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmVzb2x2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxNWE3MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmVzb2x2LmgKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5ODcsIDE5ODkKKyAqICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bS4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElOVEVSTkVUIFNPRlRXQVJFIENPTlNPUlRJVU0gRElTQ0xBSU1TCisgKiBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIElOVEVSTkVUIFNPRlRXQVJFCisgKiBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKKyAqIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworICogU09GVFdBUkUuCisgKi8KKworLyoKKyAqCUAoIylyZXNvbHYuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqCSRCSU5ESWQ6IHJlc29sdi5oLHYgOC4zMSAyMDAwLzAzLzMwIDIwOjE2OjUwIHZpeGllIEV4cCAkCisgKi8KKworI2lmbmRlZiBfUkVTT0xWX0hfCisKKy8qIFRoZXNlIGhlYWRlcnMgYXJlIG5lZWRlZCBmb3IgdHlwZXMgdXNlZCBpbiB0aGUgYHN0cnVjdCByZXNfc3RhdGUnCisgICBkZWNsYXJhdGlvbi4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaWZuZGVmIF9fbmVlZF9yZXNfc3RhdGUKKyMgZGVmaW5lIF9SRVNPTFZfSF8KKworIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjIGluY2x1ZGUgPHN0ZGlvLmg+CisjIGluY2x1ZGUgPGFycGEvbmFtZXNlci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX19yZXNfc3RhdGVfZGVmaW5lZAorIyBkZWZpbmUgX19yZXNfc3RhdGVfZGVmaW5lZAorCit0eXBlZGVmIGVudW0geyByZXNfZ29haGVhZCwgcmVzX25leHRucywgcmVzX21vZGlmaWVkLCByZXNfZG9uZSwgcmVzX2Vycm9yIH0KKwlyZXNfc2VuZGhvb2thY3Q7CisKK3R5cGVkZWYgcmVzX3NlbmRob29rYWN0ICgqcmVzX3NlbmRfcWhvb2spIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKiBjb25zdCAqX19ucywKKwkJCQkJICAgY29uc3QgdV9jaGFyICoqX19xdWVyeSwKKwkJCQkJICAgaW50ICpfX3F1ZXJ5bGVuLAorCQkJCQkgICB1X2NoYXIgKl9fYW5zLAorCQkJCQkgICBpbnQgX19hbnNzaXosCisJCQkJCSAgIGludCAqX19yZXNwbGVuKTsKKwordHlwZWRlZiByZXNfc2VuZGhvb2thY3QgKCpyZXNfc2VuZF9yaG9vaykgKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqX19ucywKKwkJCQkJICAgY29uc3QgdV9jaGFyICpfX3F1ZXJ5LAorCQkJCQkgICBpbnQgX19xdWVyeWxlbiwKKwkJCQkJICAgdV9jaGFyICpfX2FucywKKwkJCQkJICAgaW50IF9fYW5zc2l6LAorCQkJCQkgICBpbnQgKl9fcmVzcGxlbik7CisKKy8qCisgKiBHbG9iYWwgZGVmaW5lcyBhbmQgdmFyaWFibGVzIGZvciByZXNvbHZlciBzdHViLgorICovCisjIGRlZmluZSBNQVhOUwkJCTMJLyogbWF4ICMgbmFtZSBzZXJ2ZXJzIHdlJ2xsIHRyYWNrICovCisjIGRlZmluZSBNQVhERkxTUkNICQkzCS8qICMgZGVmYXVsdCBkb21haW4gbGV2ZWxzIHRvIHRyeSAqLworIyBkZWZpbmUgTUFYRE5TUkNICQk2CS8qIG1heCAjIGRvbWFpbnMgaW4gc2VhcmNoIHBhdGggKi8KKyMgZGVmaW5lIExPQ0FMRE9NQUlOUEFSVFMJMgkvKiBtaW4gbGV2ZWxzIGluIG5hbWUgdGhhdCBpcyAibG9jYWwiICovCisKKyMgZGVmaW5lIFJFU19USU1FT1VUCQk1CS8qIG1pbi4gc2Vjb25kcyBiZXR3ZWVuIHJldHJpZXMgKi8KKyMgZGVmaW5lIE1BWFJFU09MVlNPUlQJCTEwCS8qIG51bWJlciBvZiBuZXQgdG8gc29ydCBvbiAqLworIyBkZWZpbmUgUkVTX01BWE5ET1RTCQkxNQkvKiBzaG91bGQgcmVmbGVjdCBiaXQgZmllbGQgc2l6ZSAqLworIyBkZWZpbmUgUkVTX01BWFJFVFJBTlMJCTMwCS8qIG9ubHkgZm9yIHJlc29sdi5jb25mL1JFU19PUFRJT05TICovCisjIGRlZmluZSBSRVNfTUFYUkVUUlkJCTUJLyogb25seSBmb3IgcmVzb2x2LmNvbmYvUkVTX09QVElPTlMgKi8KKyMgZGVmaW5lIFJFU19ERkxSRVRSWQkJMgkvKiBEZWZhdWx0ICMvdHJpZXMuICovCisjIGRlZmluZSBSRVNfTUFYVElNRQkJNjU1MzUJLyogSW5maW5pdHksIGluIG1pbGxpc2Vjb25kcy4gKi8KKworc3RydWN0IF9fcmVzX3N0YXRlIHsKKwlpbnQJcmV0cmFuczsJCS8qIHJldHJhbnNtaXRpb24gdGltZSBpbnRlcnZhbCAqLworCWludAlyZXRyeTsJCQkvKiBudW1iZXIgb2YgdGltZXMgdG8gcmV0cmFuc21pdCAqLworCXVfbG9uZwlvcHRpb25zOwkJLyogb3B0aW9uIGZsYWdzIC0gc2VlIGJlbG93LiAqLworCWludAluc2NvdW50OwkJLyogbnVtYmVyIG9mIG5hbWUgc2VydmVycyAqLworCXN0cnVjdCBzb2NrYWRkcl9pbgorCQluc2FkZHJfbGlzdFtNQVhOU107CS8qIGFkZHJlc3Mgb2YgbmFtZSBzZXJ2ZXIgKi8KKyMgZGVmaW5lIG5zYWRkcgluc2FkZHJfbGlzdFswXQkJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKwl1X3Nob3J0CWlkOwkJCS8qIGN1cnJlbnQgbWVzc2FnZSBpZCAqLworCS8qIDIgYnl0ZSBob2xlIGhlcmUuICAqLworCWNoYXIJKmRuc3JjaFtNQVhETlNSQ0grMV07CS8qIGNvbXBvbmVudHMgb2YgZG9tYWluIHRvIHNlYXJjaCAqLworCWNoYXIJZGVmZG5hbWVbMjU2XTsJCS8qIGRlZmF1bHQgZG9tYWluIChkZXByZWNhdGVkKSAqLworCXVfbG9uZwlwZmNvZGU7CQkJLyogUkVTX1BSRl8gZmxhZ3MgLSBzZWUgYmVsb3cuICovCisJdW5zaWduZWQgbmRvdHM6NDsJCS8qIHRocmVzaG9sZCBmb3IgaW5pdGlhbCBhYnMuIHF1ZXJ5ICovCisJdW5zaWduZWQgbnNvcnQ6NDsJCS8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBzb3J0X2xpc3RbXSAqLworCXVuc2lnbmVkIGlwdjZfdW5hdmFpbDoxOwkvKiBjb25uZWN0aW5nIHRvIElQdjYgc2VydmVyIGZhaWxlZCAqLworCXVuc2lnbmVkIHVudXNlZDoyMzsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaW5fYWRkcglhZGRyOworCQl1X2ludDMyX3QJbWFzazsKKwl9IHNvcnRfbGlzdFtNQVhSRVNPTFZTT1JUXTsKKwkvKiA0IGJ5dGUgaG9sZSBoZXJlIG9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzLiAgKi8KKwlyZXNfc2VuZF9xaG9vayBxaG9vazsJCS8qIHF1ZXJ5IGhvb2sgKi8KKwlyZXNfc2VuZF9yaG9vayByaG9vazsJCS8qIHJlc3BvbnNlIGhvb2sgKi8KKwlpbnQJcmVzX2hfZXJybm87CQkvKiBsYXN0IG9uZSBzZXQgZm9yIHRoaXMgY29udGV4dCAqLworCWludAlfdmNzb2NrOwkJLyogUFJJVkFURTogZm9yIHJlc19zZW5kIFZDIGkvbyAqLworCXVfaW50CV9mbGFnczsJCQkvKiBQUklWQVRFOiBzZWUgYmVsb3cgKi8KKwkvKiA0IGJ5dGUgaG9sZSBoZXJlIG9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzLiAgKi8KKwl1bmlvbiB7CisJCWNoYXIJcGFkWzUyXTsJLyogT24gYW4gaTM4NiB0aGlzIG1lYW5zIDUxMmIgdG90YWwuICovCisJCXN0cnVjdCB7CisJCQl1X2ludDE2X3QJCW5zY291bnQ7CisJCQl1X2ludDE2X3QJCW5zbWFwW01BWE5TXTsKKwkJCWludAkJCW5zc29ja3NbTUFYTlNdOworCQkJdV9pbnQxNl90CQluc2NvdW50NjsKKwkJCXVfaW50MTZfdAkJbnNpbml0OworCQkJc3RydWN0IHNvY2thZGRyX2luNgkqbnNhZGRyc1tNQVhOU107CisjaWZkZWYgX0xJQkMKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJaW5pdHN0YW1wCisJCQkgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworI2Vsc2UKKwkJCXVuc2lnbmVkIGludAkJX2luaXRzdGFtcFsyXTsKKyNlbmRpZgorCQl9IF9leHQ7CisJfSBfdTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fcmVzX3N0YXRlICpyZXNfc3RhdGU7CisjIHVuZGVmIF9fbmVlZF9yZXNfc3RhdGUKKyNlbmRpZgorCisjaWZkZWYgX1JFU09MVl9IXworLyoKKyAqIFJldmlzaW9uIGluZm9ybWF0aW9uLiAgVGhpcyBpcyB0aGUgcmVsZWFzZSBkYXRlIGluIFlZWVlNTUREIGZvcm1hdC4KKyAqIEl0IGNhbiBjaGFuZ2UgZXZlcnkgZGF5IHNvIHRoZSByaWdodCB0aGluZyB0byBkbyB3aXRoIGl0IGlzIHVzZSBpdAorICogaW4gcHJlcHJvY2Vzc29yIGNvbW1hbmRzIHN1Y2ggYXMgIiNpZiAoX19SRVMgPiAxOTkzMTEwNCkiLiAgRG8gbm90CisgKiBjb21wYXJlIGZvciBlcXVhbGl0eTsgcmF0aGVyLCB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgeW91ciByZXNvbHZlcgorICogaXMgbmV3IGVub3VnaCB0byBjb250YWluIGEgY2VydGFpbiBmZWF0dXJlLgorICovCisKKyNkZWZpbmUJX19SRVMJMTk5OTEwMDYKKworLyoKKyAqIFJlc29sdmVyIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqIE5vcm1hbGx5IG5vdCBwcmVzZW50LCBidXQgbWF5IGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2YgdGhlCisgKiBpbml0YWwgbmFtZSBzZXJ2ZXIocykgdG8gcXVlcnkgYW5kIHRoZSBkb21haW4gc2VhcmNoIGxpc3QuCisgKi8KKworI2lmbmRlZiBfUEFUSF9SRVNDT05GCisjZGVmaW5lIF9QQVRIX1JFU0NPTkYgICAgICAgICIvZXRjL3Jlc29sdi5jb25mIgorI2VuZGlmCisKK3N0cnVjdCByZXNfc3ltIHsKKwlpbnQJbnVtYmVyOwkJLyogSWRlbnRpZnlpbmcgbnVtYmVyLCBsaWtlIFRfTVggKi8KKwljaGFyICoJbmFtZTsJCS8qIEl0cyBzeW1ib2xpYyBuYW1lLCBsaWtlICJNWCIgKi8KKwljaGFyICoJaHVtYW5uYW1lOwkvKiBJdHMgZnVuIG5hbWUsIGxpa2UgIm1haWwgZXhjaGFuZ2VyIiAqLworfTsKKworLyoKKyAqIFJlc29sdmVyIGZsYWdzICh1c2VkIHRvIGJlIGRpc2NyZXRlIHBlci1tb2R1bGUgc3RhdGljcyBpbnRzKS4KKyAqLworI2RlZmluZQlSRVNfRl9WQwkweDAwMDAwMDAxCS8qIHNvY2tldCBpcyBUQ1AgKi8KKyNkZWZpbmUJUkVTX0ZfQ09OTgkweDAwMDAwMDAyCS8qIHNvY2tldCBpcyBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgUkVTX0ZfRUROUzBFUlIJMHgwMDAwMDAwNAkvKiBFRE5TMCBjYXVzZWQgZXJyb3JzICovCisKKy8qIHJlc19maW5kem9uZWN1dCgpIG9wdGlvbnMgKi8KKyNkZWZpbmUJUkVTX0VYSEFVU1RJVkUJMHgwMDAwMDAwMQkvKiBhbHdheXMgZG8gYWxsIHF1ZXJpZXMgKi8KKworLyoKKyAqIFJlc29sdmVyIG9wdGlvbnMgKGtlZXAgdGhlc2UgaW4gc3luY2ggd2l0aCByZXNfZGVidWcuYywgcGxlYXNlKQorICovCisjZGVmaW5lIFJFU19JTklUCTB4MDAwMDAwMDEJLyogYWRkcmVzcyBpbml0aWFsaXplZCAqLworI2RlZmluZSBSRVNfREVCVUcJMHgwMDAwMDAwMgkvKiBwcmludCBkZWJ1ZyBtZXNzYWdlcyAqLworI2RlZmluZSBSRVNfQUFPTkxZCTB4MDAwMDAwMDQJLyogYXV0aG9yaXRhdGl2ZSBhbnN3ZXJzIG9ubHkgKCFJTVBMKSovCisjZGVmaW5lIFJFU19VU0VWQwkweDAwMDAwMDA4CS8qIHVzZSB2aXJ0dWFsIGNpcmN1aXQgKi8KKyNkZWZpbmUgUkVTX1BSSU1BUlkJMHgwMDAwMDAxMAkvKiBxdWVyeSBwcmltYXJ5IHNlcnZlciBvbmx5ICghSU1QTCkgKi8KKyNkZWZpbmUgUkVTX0lHTlRDCTB4MDAwMDAwMjAJLyogaWdub3JlIHRydWNhdGlvbiBlcnJvcnMgKi8KKyNkZWZpbmUgUkVTX1JFQ1VSU0UJMHgwMDAwMDA0MAkvKiByZWN1cnNpb24gZGVzaXJlZCAqLworI2RlZmluZSBSRVNfREVGTkFNRVMJMHgwMDAwMDA4MAkvKiB1c2UgZGVmYXVsdCBkb21haW4gbmFtZSAqLworI2RlZmluZSBSRVNfU1RBWU9QRU4JMHgwMDAwMDEwMAkvKiBLZWVwIFRDUCBzb2NrZXQgb3BlbiAqLworI2RlZmluZSBSRVNfRE5TUkNICTB4MDAwMDAyMDAJLyogc2VhcmNoIHVwIGxvY2FsIGRvbWFpbiB0cmVlICovCisjZGVmaW5lCVJFU19JTlNFQ1VSRTEJMHgwMDAwMDQwMAkvKiB0eXBlIDEgc2VjdXJpdHkgZGlzYWJsZWQgKi8KKyNkZWZpbmUJUkVTX0lOU0VDVVJFMgkweDAwMDAwODAwCS8qIHR5cGUgMiBzZWN1cml0eSBkaXNhYmxlZCAqLworI2RlZmluZQlSRVNfTk9BTElBU0VTCTB4MDAwMDEwMDAJLyogc2h1dHMgb2ZmIEhPU1RBTElBU0VTIGZlYXR1cmUgKi8KKyNkZWZpbmUJUkVTX1VTRV9JTkVUNgkweDAwMDAyMDAwCS8qIHVzZS9tYXAgSVB2NiBpbiBnZXRob3N0YnluYW1lKCkgKi8KKyNkZWZpbmUgUkVTX1JPVEFURQkweDAwMDA0MDAwCS8qIHJvdGF0ZSBucyBsaXN0IGFmdGVyIGVhY2ggcXVlcnkgKi8KKyNkZWZpbmUJUkVTX05PQ0hFQ0tOQU1FCTB4MDAwMDgwMDAJLyogZG8gbm90IGNoZWNrIG5hbWVzIGZvciBzYW5pdHkuICovCisjZGVmaW5lCVJFU19LRUVQVFNJRwkweDAwMDEwMDAwCS8qIGRvIG5vdCBzdHJpcCBUU0lHIHJlY29yZHMgKi8KKyNkZWZpbmUJUkVTX0JMQVNUCTB4MDAwMjAwMDAJLyogYmxhc3QgYWxsIHJlY3Vyc2l2ZSBzZXJ2ZXJzICovCisjZGVmaW5lIFJFU19VU0VCU1RSSU5HCTB4MDAwNDAwMDAJLyogSVB2NiByZXZlcnNlIGxvb2t1cCB3aXRoIGJ5dGUKKwkJCQkJICAgc3RyaW5ncyAqLworI2RlZmluZSBSRVNfTk9JUDZET1RJTlQJMHgwMDA4MDAwMAkvKiBEbyBub3QgdXNlIC5pcDYuaW50IGluIElQdjYKKwkJCQkJICAgcmV2ZXJzZSBsb29rdXAgKi8KKyNkZWZpbmUgUkVTX1VTRV9FRE5TMAkweDAwMTAwMDAwCS8qIFVzZSBFRE5TMC4gICovCisjZGVmaW5lIFJFU19TTkdMS1VQCTB4MDAyMDAwMDAJLyogb25lIG91dHN0YW5kaW5nIHJlcXVlc3QgYXQgYSB0aW1lICovCisjZGVmaW5lIFJFU19TTkdMS1VQUkVPUAkweDAwNDAwMDAwCS8qIC0iLSwgYnV0IG9wZW4gbmV3IHNvY2tldCBmb3IgZWFjaAorCQkJCQkgICByZXF1ZXN0ICovCisjZGVmaW5lIFJFU19VU0VfRE5TU0VDCTB4MDA4MDAwMDAJLyogdXNlIEROU1NFQyB1c2luZyBPSyBiaXQgaW4gT1BUICovCisjZGVmaW5lIFJFU19OT1RMRFFVRVJZCTB4MDEwMDAwMDAJLyogRG8gbm90IGxvb2sgdXAgdW5xdWFsaWZpZWQgbmFtZQorCQkJCQkgICBhcyBhIFRMRC4gICovCisKKyNkZWZpbmUgUkVTX0RFRkFVTFQJKFJFU19SRUNVUlNFfFJFU19ERUZOQU1FU3xSRVNfRE5TUkNIfFJFU19OT0lQNkRPVElOVCkKKworLyoKKyAqIFJlc29sdmVyICJwZmNvZGUiIHZhbHVlcy4gIFVzZWQgYnkgZGlnLgorICovCisjZGVmaW5lIFJFU19QUkZfU1RBVFMJMHgwMDAwMDAwMQorI2RlZmluZSBSRVNfUFJGX1VQREFURQkweDAwMDAwMDAyCisjZGVmaW5lIFJFU19QUkZfQ0xBU1MgICAweDAwMDAwMDA0CisjZGVmaW5lIFJFU19QUkZfQ01ECTB4MDAwMDAwMDgKKyNkZWZpbmUgUkVTX1BSRl9RVUVTCTB4MDAwMDAwMTAKKyNkZWZpbmUgUkVTX1BSRl9BTlMJMHgwMDAwMDAyMAorI2RlZmluZSBSRVNfUFJGX0FVVEgJMHgwMDAwMDA0MAorI2RlZmluZSBSRVNfUFJGX0FERAkweDAwMDAwMDgwCisjZGVmaW5lIFJFU19QUkZfSEVBRDEJMHgwMDAwMDEwMAorI2RlZmluZSBSRVNfUFJGX0hFQUQyCTB4MDAwMDAyMDAKKyNkZWZpbmUgUkVTX1BSRl9UVExJRAkweDAwMDAwNDAwCisjZGVmaW5lIFJFU19QUkZfSEVBRFgJMHgwMDAwMDgwMAorI2RlZmluZSBSRVNfUFJGX1FVRVJZCTB4MDAwMDEwMDAKKyNkZWZpbmUgUkVTX1BSRl9SRVBMWQkweDAwMDAyMDAwCisjZGVmaW5lIFJFU19QUkZfSU5JVAkweDAwMDA0MDAwCisvKgkJCTB4MDAwMDgwMDAJKi8KKworLyogVGhpbmdzIGludm9sdmluZyBhbiBpbnRlcm5hbCAoc3RhdGljKSByZXNvbHZlciBjb250ZXh0LiAqLworX19CRUdJTl9ERUNMUworZXh0ZXJuIHN0cnVjdCBfX3Jlc19zdGF0ZSAqX19yZXNfc3RhdGUodm9pZCkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworX19FTkRfREVDTFMKKyNkZWZpbmUgX3JlcyAoKl9fcmVzX3N0YXRlKCkpCisKKyNpZm5kZWYgX19CSU5EX05PU1RBVElDCisjZGVmaW5lIGZwX25xdWVyeQkJX19mcF9ucXVlcnkKKyNkZWZpbmUgZnBfcXVlcnkJCV9fZnBfcXVlcnkKKyNkZWZpbmUgaG9zdGFsaWFzCQlfX2hvc3RhbGlhcworI2RlZmluZSBwX3F1ZXJ5CQkJX19wX3F1ZXJ5CisjZGVmaW5lIHJlc19jbG9zZQkJX19yZXNfY2xvc2UKKyNkZWZpbmUgcmVzX2luaXQJCV9fcmVzX2luaXQKKyNkZWZpbmUgcmVzX2lzb3Vyc2VydmVyCQlfX3Jlc19pc291cnNlcnZlcgorI2RlZmluZSByZXNfbWtxdWVyeQkJX19yZXNfbWtxdWVyeQorI2RlZmluZSByZXNfcXVlcnkJCV9fcmVzX3F1ZXJ5CisjZGVmaW5lIHJlc19xdWVyeWRvbWFpbgkJX19yZXNfcXVlcnlkb21haW4KKyNkZWZpbmUgcmVzX3NlYXJjaAkJX19yZXNfc2VhcmNoCisjZGVmaW5lIHJlc19zZW5kCQlfX3Jlc19zZW5kCisKK19fQkVHSU5fREVDTFMKK3ZvaWQJCWZwX25xdWVyeSAoY29uc3QgdV9jaGFyICosIGludCwgRklMRSAqKSBfX1RIUk9XOwordm9pZAkJZnBfcXVlcnkgKGNvbnN0IHVfY2hhciAqLCBGSUxFICopIF9fVEhST1c7Citjb25zdCBjaGFyICoJaG9zdGFsaWFzIChjb25zdCBjaGFyICopIF9fVEhST1c7Cit2b2lkCQlwX3F1ZXJ5IChjb25zdCB1X2NoYXIgKikgX19USFJPVzsKK3ZvaWQJCXJlc19jbG9zZSAodm9pZCkgX19USFJPVzsKK2ludAkJcmVzX2luaXQgKHZvaWQpIF9fVEhST1c7CitpbnQJCXJlc19pc291cnNlcnZlciAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopIF9fVEhST1c7CitpbnQJCXJlc19ta3F1ZXJ5IChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGNvbnN0IHVfY2hhciAqLAorCQkJICAgICBpbnQsIGNvbnN0IHVfY2hhciAqLCB1X2NoYXIgKiwgaW50KSBfX1RIUk9XOworaW50CQlyZXNfcXVlcnkgKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIHVfY2hhciAqLCBpbnQpIF9fVEhST1c7CitpbnQJCXJlc19xdWVyeWRvbWFpbiAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgaW50LAorCQkJCSB1X2NoYXIgKiwgaW50KSBfX1RIUk9XOworaW50CQlyZXNfc2VhcmNoIChjb25zdCBjaGFyICosIGludCwgaW50LCB1X2NoYXIgKiwgaW50KSBfX1RIUk9XOworaW50CQlyZXNfc2VuZCAoY29uc3QgdV9jaGFyICosIGludCwgdV9jaGFyICosIGludCkgX19USFJPVzsKK19fRU5EX0RFQ0xTCisjZW5kaWYKKworI2RlZmluZSBiNjRfbnRvcAkJX19iNjRfbnRvcAorI2RlZmluZSBiNjRfcHRvbgkJX19iNjRfcHRvbgorI2RlZmluZSBkbl9jb21wCQkJX19kbl9jb21wCisjZGVmaW5lIGRuX2NvdW50X2xhYmVscwkJX19kbl9jb3VudF9sYWJlbHMKKyNkZWZpbmUgZG5fZXhwYW5kCQlfX2RuX2V4cGFuZAorI2RlZmluZSBkbl9za2lwbmFtZQkJX19kbl9za2lwbmFtZQorI2RlZmluZSBmcF9yZXNzdGF0CQlfX2ZwX3Jlc3N0YXQKKyNkZWZpbmUgbG9jX2F0b24JCV9fbG9jX2F0b24KKyNkZWZpbmUgbG9jX250b2EJCV9fbG9jX250b2EKKyNkZWZpbmUgcF9jZG5hbWUJCV9fcF9jZG5hbWUKKyNkZWZpbmUgcF9jZG5uYW1lCQlfX3BfY2RubmFtZQorI2RlZmluZSBwX2NsYXNzCQkJX19wX2NsYXNzCisjZGVmaW5lIHBfZnFuYW1lCQlfX3BfZnFuYW1lCisjZGVmaW5lIHBfZnFubmFtZQkJX19wX2Zxbm5hbWUKKyNkZWZpbmUgcF9vcHRpb24JCV9fcF9vcHRpb24KKyNkZWZpbmUgcF9zZWNzdG9kYXRlCQlfX3Bfc2Vjc3RvZGF0ZQorI2RlZmluZSBwX3NlY3Rpb24JCV9fcF9zZWN0aW9uCisjZGVmaW5lIHBfdGltZQkJCV9fcF90aW1lCisjZGVmaW5lIHBfdHlwZQkJCV9fcF90eXBlCisjZGVmaW5lIHBfcmNvZGUJCQlfX3BfcmNvZGUKKyNkZWZpbmUgcHV0bG9uZwkJCV9fcHV0bG9uZworI2RlZmluZSBwdXRzaG9ydAkJX19wdXRzaG9ydAorI2RlZmluZSByZXNfZG5vawkJX19yZXNfZG5vaworI2RlZmluZSByZXNfaG5vawkJX19yZXNfaG5vaworI2RlZmluZSByZXNfaG9zdGFsaWFzCQlfX3Jlc19ob3N0YWxpYXMKKyNkZWZpbmUgcmVzX21haWxvawkJX19yZXNfbWFpbG9rCisjZGVmaW5lIHJlc19uYW1laW5xdWVyeQkJX19yZXNfbmFtZWlucXVlcnkKKyNkZWZpbmUgcmVzX25jbG9zZQkJX19yZXNfbmNsb3NlCisjZGVmaW5lIHJlc19uaW5pdAkJX19yZXNfbmluaXQKKyNkZWZpbmUgcmVzX25ta3F1ZXJ5CQlfX3Jlc19ubWtxdWVyeQorI2RlZmluZSByZXNfbnBxdWVyeQkJX19yZXNfbnBxdWVyeQorI2RlZmluZSByZXNfbnF1ZXJ5CQlfX3Jlc19ucXVlcnkKKyNkZWZpbmUgcmVzX25xdWVyeWRvbWFpbglfX3Jlc19ucXVlcnlkb21haW4KKyNkZWZpbmUgcmVzX25zZWFyY2gJCV9fcmVzX25zZWFyY2gKKyNkZWZpbmUgcmVzX25zZW5kCQlfX3Jlc19uc2VuZAorI2RlZmluZSByZXNfbmlzb3Vyc2VydmVyCV9fcmVzX25pc291cnNlcnZlcgorI2RlZmluZSByZXNfb3dub2sJCV9fcmVzX293bm9rCisjZGVmaW5lIHJlc19xdWVyaWVzbWF0Y2gJX19yZXNfcXVlcmllc21hdGNoCisjZGVmaW5lIHJlc19yYW5kb21pZAkJX19yZXNfcmFuZG9taWQKKyNkZWZpbmUgc3ltX250b3AJCV9fc3ltX250b3AKKyNkZWZpbmUgc3ltX250b3MJCV9fc3ltX250b3MKKyNkZWZpbmUgc3ltX3N0b24JCV9fc3ltX3N0b24KK19fQkVHSU5fREVDTFMKK2ludAkJcmVzX2hub2sgKGNvbnN0IGNoYXIgKikgX19USFJPVzsKK2ludAkJcmVzX293bm9rIChjb25zdCBjaGFyICopIF9fVEhST1c7CitpbnQJCXJlc19tYWlsb2sgKGNvbnN0IGNoYXIgKikgX19USFJPVzsKK2ludAkJcmVzX2Rub2sgKGNvbnN0IGNoYXIgKikgX19USFJPVzsKK2ludAkJc3ltX3N0b24gKGNvbnN0IHN0cnVjdCByZXNfc3ltICosIGNvbnN0IGNoYXIgKiwgaW50ICopIF9fVEhST1c7Citjb25zdCBjaGFyICoJc3ltX250b3MgKGNvbnN0IHN0cnVjdCByZXNfc3ltICosIGludCwgaW50ICopIF9fVEhST1c7Citjb25zdCBjaGFyICoJc3ltX250b3AgKGNvbnN0IHN0cnVjdCByZXNfc3ltICosIGludCwgaW50ICopIF9fVEhST1c7CitpbnQJCWI2NF9udG9wICh1X2NoYXIgY29uc3QgKiwgc2l6ZV90LCBjaGFyICosIHNpemVfdCkgX19USFJPVzsKK2ludAkJYjY0X3B0b24gKGNoYXIgY29uc3QgKiwgdV9jaGFyICosIHNpemVfdCkgX19USFJPVzsKK2ludAkJbG9jX2F0b24gKGNvbnN0IGNoYXIgKl9fYXNjaWksIHVfY2hhciAqX19iaW5hcnkpIF9fVEhST1c7Citjb25zdCBjaGFyICoJbG9jX250b2EgKGNvbnN0IHVfY2hhciAqX19iaW5hcnksIGNoYXIgKl9fYXNjaWkpIF9fVEhST1c7CitpbnQJCWRuX3NraXBuYW1lIChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICopIF9fVEhST1c7Cit2b2lkCQlwdXRsb25nICh1X2ludDMyX3QsIHVfY2hhciAqKSBfX1RIUk9XOwordm9pZAkJcHV0c2hvcnQgKHVfaW50MTZfdCwgdV9jaGFyICopIF9fVEhST1c7Citjb25zdCBjaGFyICoJcF9jbGFzcyAoaW50KSBfX1RIUk9XOworY29uc3QgY2hhciAqCXBfdGltZSAodV9pbnQzMl90KSBfX1RIUk9XOworY29uc3QgY2hhciAqCXBfdHlwZSAoaW50KSBfX1RIUk9XOworY29uc3QgY2hhciAqCXBfcmNvZGUgKGludCkgX19USFJPVzsKK2NvbnN0IHVfY2hhciAqCXBfY2RubmFtZSAoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLCBpbnQsIEZJTEUgKikKKyAgICAgX19USFJPVzsKK2NvbnN0IHVfY2hhciAqCXBfY2RuYW1lIChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosIEZJTEUgKikgX19USFJPVzsKK2NvbnN0IHVfY2hhciAqCXBfZnFubmFtZSAoY29uc3QgdV9jaGFyICpfX2NwLCBjb25zdCB1X2NoYXIgKl9fbXNnLAorCQkJICAgaW50LCBjaGFyICosIGludCkgX19USFJPVzsKK2NvbnN0IHVfY2hhciAqCXBfZnFuYW1lIChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosIEZJTEUgKikgX19USFJPVzsKK2NvbnN0IGNoYXIgKglwX29wdGlvbiAodV9sb25nIF9fb3B0aW9uKSBfX1RIUk9XOworY2hhciAqCQlwX3NlY3N0b2RhdGUgKHVfbG9uZykgX19USFJPVzsKK2ludAkJZG5fY291bnRfbGFiZWxzIChjb25zdCBjaGFyICopIF9fVEhST1c7CitpbnQJCWRuX2NvbXAgKGNvbnN0IGNoYXIgKiwgdV9jaGFyICosIGludCwgdV9jaGFyICoqLCB1X2NoYXIgKiopCisgICAgIF9fVEhST1c7CitpbnQJCWRuX2V4cGFuZCAoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwKKwkJCSAgIGNoYXIgKiwgaW50KSBfX1RIUk9XOwordV9pbnQJCXJlc19yYW5kb21pZCAodm9pZCkgX19USFJPVzsKK2ludAkJcmVzX25hbWVpbnF1ZXJ5IChjb25zdCBjaGFyICosIGludCwgaW50LAorCQkJCSBjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICopIF9fVEhST1c7CitpbnQJCXJlc19xdWVyaWVzbWF0Y2ggKGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwKKwkJCQkgIGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKikgX19USFJPVzsKK2NvbnN0IGNoYXIgKglwX3NlY3Rpb24gKGludCBfX3NlY3Rpb24sIGludCBfX29wY29kZSkgX19USFJPVzsKKy8qIFRoaW5ncyBpbnZvbHZpbmcgYSByZXNvbHZlciBjb250ZXh0LiAqLworaW50CQlyZXNfbmluaXQgKHJlc19zdGF0ZSkgX19USFJPVzsKK2ludAkJcmVzX25pc291cnNlcnZlciAoY29uc3QgcmVzX3N0YXRlLAorCQkJCSAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopIF9fVEhST1c7Cit2b2lkCQlmcF9yZXNzdGF0IChjb25zdCByZXNfc3RhdGUsIEZJTEUgKikgX19USFJPVzsKK3ZvaWQJCXJlc19ucHF1ZXJ5IChjb25zdCByZXNfc3RhdGUsIGNvbnN0IHVfY2hhciAqLCBpbnQsIEZJTEUgKikKKyAgICAgX19USFJPVzsKK2NvbnN0IGNoYXIgKglyZXNfaG9zdGFsaWFzIChjb25zdCByZXNfc3RhdGUsIGNvbnN0IGNoYXIgKiwgY2hhciAqLCBzaXplX3QpCisgICAgIF9fVEhST1c7CitpbnQJCXJlc19ucXVlcnkgKHJlc19zdGF0ZSwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgdV9jaGFyICosIGludCkKKyAgICAgX19USFJPVzsKK2ludAkJcmVzX25zZWFyY2ggKHJlc19zdGF0ZSwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgdV9jaGFyICosIGludCkKKyAgICAgX19USFJPVzsKK2ludAkJcmVzX25xdWVyeWRvbWFpbiAocmVzX3N0YXRlLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LAorCQkJCSAgaW50LCB1X2NoYXIgKiwgaW50KSBfX1RIUk9XOworaW50CQlyZXNfbm1rcXVlcnkgKHJlc19zdGF0ZSwgaW50LCBjb25zdCBjaGFyICosIGludCwgaW50LAorCQkJICAgICAgY29uc3QgdV9jaGFyICosIGludCwgY29uc3QgdV9jaGFyICosIHVfY2hhciAqLAorCQkJICAgICAgaW50KSBfX1RIUk9XOworaW50CQlyZXNfbnNlbmQgKHJlc19zdGF0ZSwgY29uc3QgdV9jaGFyICosIGludCwgdV9jaGFyICosIGludCkKKyAgICAgX19USFJPVzsKK3ZvaWQJCXJlc19uY2xvc2UgKHJlc19zdGF0ZSkgX19USFJPVzsKK19fRU5EX0RFQ0xTCisjZW5kaWYKKworI2VuZGlmIC8qICFfUkVTT0xWX0hfICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9hdXRoLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9hdXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiZWU1MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2F1dGguaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIGF1dGguaCwgQXV0aGVudGljYXRpb24gaW50ZXJmYWNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGNvbXBsZXRlbHkgb3BhcXVlIHRvIHRoZSBjbGllbnQuICBUaGUgY2xpZW50CisgKiBpcyByZXF1aXJlZCB0byBwYXNzIGEgQVVUSCAqIHRvIHJvdXRpbmVzIHRoYXQgY3JlYXRlIHJwYworICogInNlc3Npb25zIi4KKyAqLworCisjaWZuZGVmIF9SUENfQVVUSF9ICisKKyNkZWZpbmUgX1JQQ19BVVRIX0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8cnBjL3hkci5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgTUFYX0FVVEhfQllURVMJNDAwCisjZGVmaW5lIE1BWE5FVE5BTUVMRU4JMjU1CS8qIG1heGltdW0gbGVuZ3RoIG9mIG5ldHdvcmsgdXNlcidzIG5hbWUgKi8KKworLyoKKyAqIFN0YXR1cyByZXR1cm5lZCBmcm9tIGF1dGhlbnRpY2F0aW9uIGNoZWNrCisgKi8KK2VudW0gYXV0aF9zdGF0IHsKKwlBVVRIX09LPTAsCisJLyoKKwkgKiBmYWlsZWQgYXQgcmVtb3RlIGVuZAorCSAqLworCUFVVEhfQkFEQ1JFRD0xLAkJCS8qIGJvZ3VzIGNyZWRlbnRpYWxzIChzZWFsIGJyb2tlbikgKi8KKwlBVVRIX1JFSkVDVEVEQ1JFRD0yLAkJLyogY2xpZW50IHNob3VsZCBiZWdpbiBuZXcgc2Vzc2lvbiAqLworCUFVVEhfQkFEVkVSRj0zLAkJCS8qIGJvZ3VzIHZlcmlmaWVyIChzZWFsIGJyb2tlbikgKi8KKwlBVVRIX1JFSkVDVEVEVkVSRj00LAkJLyogdmVyaWZpZXIgZXhwaXJlZCBvciB3YXMgcmVwbGF5ZWQgKi8KKwlBVVRIX1RPT1dFQUs9NSwJCQkvKiByZWplY3RlZCBkdWUgdG8gc2VjdXJpdHkgcmVhc29ucyAqLworCS8qCisJICogZmFpbGVkIGxvY2FsbHkKKwkqLworCUFVVEhfSU5WQUxJRFJFU1A9NiwJCS8qIGJvZ3VzIHJlc3BvbnNlIHZlcmlmaWVyICovCisJQVVUSF9GQUlMRUQ9NwkJCS8qIHNvbWUgdW5rbm93biByZWFzb24gKi8KK307CisKK3VuaW9uIGRlc19ibG9jayB7CisJc3RydWN0IHsKKwkJdV9pbnQzMl90IGhpZ2g7CisJCXVfaW50MzJfdCBsb3c7CisJfSBrZXk7CisJY2hhciBjWzhdOworfTsKK3R5cGVkZWYgdW5pb24gZGVzX2Jsb2NrIGRlc19ibG9jazsKK2V4dGVybiBib29sX3QgeGRyX2Rlc19ibG9jayAoWERSICpfX3hkcnMsIGRlc19ibG9jayAqX19ibGtwKSBfX1RIUk9XOworCisvKgorICogQXV0aGVudGljYXRpb24gaW5mby4gIE9wYXF1ZSB0byBjbGllbnQuCisgKi8KK3N0cnVjdCBvcGFxdWVfYXV0aCB7CisJZW51bV90CW9hX2ZsYXZvcjsJCS8qIGZsYXZvciBvZiBhdXRoICovCisJY2FkZHJfdAlvYV9iYXNlOwkJLyogYWRkcmVzcyBvZiBtb3JlIGF1dGggc3R1ZmYgKi8KKwl1X2ludAlvYV9sZW5ndGg7CQkvKiBub3QgdG8gZXhjZWVkIE1BWF9BVVRIX0JZVEVTICovCit9OworCisvKgorICogQXV0aCBoYW5kbGUsIGludGVyZmFjZSB0byBjbGllbnQgc2lkZSBhdXRoZW50aWNhdG9ycy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVVUSCBBVVRIOworc3RydWN0IEFVVEggeworICBzdHJ1Y3Qgb3BhcXVlX2F1dGggYWhfY3JlZDsKKyAgc3RydWN0IG9wYXF1ZV9hdXRoIGFoX3ZlcmY7CisgIHVuaW9uIGRlc19ibG9jayBhaF9rZXk7CisgIHN0cnVjdCBhdXRoX29wcyB7CisgICAgdm9pZCAoKmFoX25leHR2ZXJmKSAoQVVUSCAqKTsKKyAgICBpbnQgICgqYWhfbWFyc2hhbCkgKEFVVEggKiwgWERSICopOwkJLyogbmV4dHZlcmYgJiBzZXJpYWxpemUgKi8KKyAgICBpbnQgICgqYWhfdmFsaWRhdGUpIChBVVRIICosIHN0cnVjdCBvcGFxdWVfYXV0aCAqKTsKKwkJCQkJCS8qIHZhbGlkYXRlIHZlcmlmaWVyICovCisgICAgaW50ICAoKmFoX3JlZnJlc2gpIChBVVRIICopOwkJLyogcmVmcmVzaCBjcmVkZW50aWFscyAqLworICAgIHZvaWQgKCphaF9kZXN0cm95KSAoQVVUSCAqKTsgCSAgICAJLyogZGVzdHJveSB0aGlzIHN0cnVjdHVyZSAqLworICB9ICphaF9vcHM7CisgIGNhZGRyX3QgYWhfcHJpdmF0ZTsKK307CisKKworLyoKKyAqIEF1dGhlbnRpY2F0aW9uIG9wcy4KKyAqIFRoZSBvcHMgYW5kIHRoZSBhdXRoIGhhbmRsZSBwcm92aWRlIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGF1dGhlbnRpY2F0b3JzLgorICoKKyAqIEFVVEgJKmF1dGg7CisgKiBYRFIJKnhkcnM7CisgKiBzdHJ1Y3Qgb3BhcXVlX2F1dGggdmVyZjsKKyAqLworI2RlZmluZSBBVVRIX05FWFRWRVJGKGF1dGgpCQlcCisJCSgoKigoYXV0aCktPmFoX29wcy0+YWhfbmV4dHZlcmYpKShhdXRoKSkKKyNkZWZpbmUgYXV0aF9uZXh0dmVyZihhdXRoKQkJXAorCQkoKCooKGF1dGgpLT5haF9vcHMtPmFoX25leHR2ZXJmKSkoYXV0aCkpCisKKyNkZWZpbmUgQVVUSF9NQVJTSEFMTChhdXRoLCB4ZHJzKQlcCisJCSgoKigoYXV0aCktPmFoX29wcy0+YWhfbWFyc2hhbCkpKGF1dGgsIHhkcnMpKQorI2RlZmluZSBhdXRoX21hcnNoYWxsKGF1dGgsIHhkcnMpCVwKKwkJKCgqKChhdXRoKS0+YWhfb3BzLT5haF9tYXJzaGFsKSkoYXV0aCwgeGRycykpCisKKyNkZWZpbmUgQVVUSF9WQUxJREFURShhdXRoLCB2ZXJmcCkJXAorCQkoKCooKGF1dGgpLT5haF9vcHMtPmFoX3ZhbGlkYXRlKSkoKGF1dGgpLCB2ZXJmcCkpCisjZGVmaW5lIGF1dGhfdmFsaWRhdGUoYXV0aCwgdmVyZnApCVwKKwkJKCgqKChhdXRoKS0+YWhfb3BzLT5haF92YWxpZGF0ZSkpKChhdXRoKSwgdmVyZnApKQorCisjZGVmaW5lIEFVVEhfUkVGUkVTSChhdXRoKQkJXAorCQkoKCooKGF1dGgpLT5haF9vcHMtPmFoX3JlZnJlc2gpKShhdXRoKSkKKyNkZWZpbmUgYXV0aF9yZWZyZXNoKGF1dGgpCQlcCisJCSgoKigoYXV0aCktPmFoX29wcy0+YWhfcmVmcmVzaCkpKGF1dGgpKQorCisjZGVmaW5lIEFVVEhfREVTVFJPWShhdXRoKQkJXAorCQkoKCooKGF1dGgpLT5haF9vcHMtPmFoX2Rlc3Ryb3kpKShhdXRoKSkKKyNkZWZpbmUgYXV0aF9kZXN0cm95KGF1dGgpCQlcCisJCSgoKigoYXV0aCktPmFoX29wcy0+YWhfZGVzdHJveSkpKGF1dGgpKQorCisKK2V4dGVybiBzdHJ1Y3Qgb3BhcXVlX2F1dGggX251bGxfYXV0aDsKKworCisvKgorICogVGhlc2UgYXJlIHRoZSB2YXJpb3VzIGltcGxlbWVudGF0aW9ucyBvZiBjbGllbnQgc2lkZSBhdXRoZW50aWNhdG9ycy4KKyAqLworCisvKgorICogVW5peCBzdHlsZSBhdXRoZW50aWNhdGlvbgorICogQVVUSCAqYXV0aHVuaXhfY3JlYXRlKG1hY2huYW1lLCB1aWQsIGdpZCwgbGVuLCBhdXBfZ2lkcykKKyAqCWNoYXIgKm1hY2huYW1lOworICoJaW50IHVpZDsKKyAqCWludCBnaWQ7CisgKglpbnQgbGVuOworICoJaW50ICphdXBfZ2lkczsKKyAqLworZXh0ZXJuIEFVVEggKmF1dGh1bml4X2NyZWF0ZSAoY2hhciAqX19tYWNobmFtZSwgX191aWRfdCBfX3VpZCwgX19naWRfdCBfX2dpZCwKKwkJCSAgICAgIGludCBfX2xlbiwgX19naWRfdCAqX19hdXBfZ2lkcyk7CitleHRlcm4gQVVUSCAqYXV0aHVuaXhfY3JlYXRlX2RlZmF1bHQgKHZvaWQpOworZXh0ZXJuIEFVVEggKmF1dGhub25lX2NyZWF0ZSAodm9pZCkgX19USFJPVzsKK2V4dGVybiBBVVRIICphdXRoZGVzX2NyZWF0ZSAoY29uc3QgY2hhciAqX19zZXJ2ZXJuYW1lLCB1X2ludCBfX3dpbmRvdywKKwkJCSAgICAgc3RydWN0IHNvY2thZGRyICpfX3N5bmNhZGRyLCBkZXNfYmxvY2sgKl9fY2tleSkKKyAgICAgX19USFJPVzsKK2V4dGVybiBBVVRIICphdXRoZGVzX3BrX2NyZWF0ZSAoY29uc3QgY2hhciAqLCBuZXRvYmogKiwgdV9pbnQsCisJCQkJc3RydWN0IHNvY2thZGRyICosIGRlc19ibG9jayAqKSBfX1RIUk9XOworCisKKyNkZWZpbmUgQVVUSF9OT05FCTAJCS8qIG5vIGF1dGhlbnRpY2F0aW9uICovCisjZGVmaW5lCUFVVEhfTlVMTAkwCQkvKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCUFVVEhfU1lTCTEJCS8qIHVuaXggc3R5bGUgKHVpZCwgZ2lkcykgKi8KKyNkZWZpbmUJQVVUSF9VTklYCUFVVEhfU1lTCisjZGVmaW5lCUFVVEhfU0hPUlQJMgkJLyogc2hvcnQgaGFuZCB1bml4IHN0eWxlICovCisjZGVmaW5lIEFVVEhfREVTCTMJCS8qIGRlcyBzdHlsZSAoZW5jcnlwdGVkIHRpbWVzdGFtcHMpICovCisjZGVmaW5lIEFVVEhfREgJCUFVVEhfREVTCS8qIERpZmZpZS1IZWxsbWFuICh0aGlzIGlzIERFUykgKi8KKyNkZWZpbmUgQVVUSF9LRVJCICAgICAgIDQgICAgICAgICAgICAgICAvKiBrZXJiZXJvcyBzdHlsZSAqLworCisvKgorICogIE5ldG5hbWUgbWFuaXB1bGF0aW5nIGZ1bmN0aW9ucworICoKKyAqLworZXh0ZXJuIGludCBnZXRuZXRuYW1lIChjaGFyICopIF9fVEhST1c7CitleHRlcm4gaW50IGhvc3QybmV0bmFtZSAoY2hhciAqLCBfX2NvbnN0IGNoYXIgKiwgX19jb25zdCBjaGFyICopIF9fVEhST1c7CitleHRlcm4gaW50IHVzZXIybmV0bmFtZSAoY2hhciAqLCBfX2NvbnN0IHVpZF90LCBfX2NvbnN0IGNoYXIgKikgX19USFJPVzsKK2V4dGVybiBpbnQgbmV0bmFtZTJ1c2VyIChfX2NvbnN0IGNoYXIgKiwgdWlkX3QgKiwgZ2lkX3QgKiwgaW50ICosIGdpZF90ICopCisgICAgIF9fVEhST1c7CitleHRlcm4gaW50IG5ldG5hbWUyaG9zdCAoX19jb25zdCBjaGFyICosIGNoYXIgKiwgX19jb25zdCBpbnQpIF9fVEhST1c7CisKKy8qCisgKgorICogVGhlc2Ugcm91dGluZXMgaW50ZXJmYWNlIHRvIHRoZSBrZXlzZXJ2IGRhZW1vbgorICoKKyAqLworZXh0ZXJuIGludCBrZXlfZGVjcnlwdHNlc3Npb24gKGNoYXIgKiwgZGVzX2Jsb2NrICopOworZXh0ZXJuIGludCBrZXlfZGVjcnlwdHNlc3Npb25fcGsgKGNoYXIgKiwgbmV0b2JqICosIGRlc19ibG9jayAqKTsKK2V4dGVybiBpbnQga2V5X2VuY3J5cHRzZXNzaW9uIChjaGFyICosIGRlc19ibG9jayAqKTsKK2V4dGVybiBpbnQga2V5X2VuY3J5cHRzZXNzaW9uX3BrIChjaGFyICosIG5ldG9iaiAqLCBkZXNfYmxvY2sgKik7CitleHRlcm4gaW50IGtleV9nZW5kZXMgKGRlc19ibG9jayAqKTsKK2V4dGVybiBpbnQga2V5X3NldHNlY3JldCAoY2hhciAqKTsKK2V4dGVybiBpbnQga2V5X3NlY3JldGtleV9pc19zZXQgKHZvaWQpOworZXh0ZXJuIGludCBrZXlfZ2V0X2NvbnYgKGNoYXIgKiwgZGVzX2Jsb2NrICopOworCisvKgorICogWERSIGFuIG9wYXF1ZSBhdXRoZW50aWNhdGlvbiBzdHJ1Y3QuCisgKi8KK2V4dGVybiBib29sX3QgeGRyX29wYXF1ZV9hdXRoIChYRFIgKiwgc3RydWN0IG9wYXF1ZV9hdXRoICopIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBycGMvYXV0aC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9hdXRoX2Rlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvYXV0aF9kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmFkYTg0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvYXV0aF9kZXMuaApAQCAtMCwwICsxLDExMiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9SUENfQVVUSF9ERVNfSAorI2RlZmluZSBfUlBDX0FVVEhfREVTX0gJMQorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8cnBjL2F1dGguaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mICJuYW1lcyI6IGZ1bGxuYW1lcyBhbmQgbmlja25hbWVzICovCitlbnVtIGF1dGhkZXNfbmFtZWtpbmQKKyAgeworICAgIEFETl9GVUxMTkFNRSwKKyAgICBBRE5fTklDS05BTUUKKyAgfTsKKworLyogQSBmdWxsbmFtZSBjb250YWlucyB0aGUgbmV0d29yayBuYW1lIG9mIHRoZSBjbGllbnQsCisgICBhIGNvbnZlcnNhdGlvbiBrZXkgYW5kIHRoZSB3aW5kb3cgKi8KK3N0cnVjdCBhdXRoZGVzX2Z1bGxuYW1lCisgIHsKKyAgICBjaGFyICpuYW1lOwkJLyogbmV0d29yayBuYW1lIG9mIGNsaWVudCwgdXAgdG8gTUFYTkVUTkFNRUxFTiAqLworICAgIGRlc19ibG9jayBrZXk7CS8qIGNvbnZlcnNhdGlvbiBrZXkgKi8KKyAgICB1aW50MzJfdCB3aW5kb3c7CS8qIGFzc29jaWF0ZWQgd2luZG93ICovCisgIH07CisKKy8qIEEgY3JlZGVudGlhbCAqLworc3RydWN0IGF1dGhkZXNfY3JlZAorICB7CisgICAgZW51bSBhdXRoZGVzX25hbWVraW5kIGFkY19uYW1la2luZDsKKyAgICBzdHJ1Y3QgYXV0aGRlc19mdWxsbmFtZSBhZGNfZnVsbG5hbWU7CisgICAgdWludDMyX3QgYWRjX25pY2tuYW1lOworICB9OworCisvKiBBIHRpbWV2YWwgcmVwbGFjZW1lbnQgZm9yICEzMmJpdCBwbGF0Zm9ybXMgKi8KK3N0cnVjdCBycGNfdGltZXZhbAorICB7CisgICAgdWludDMyX3QgdHZfc2VjOyAgICAgICAgICAgIC8qIFNlY29uZHMuICAqLworICAgIHVpbnQzMl90IHR2X3VzZWM7ICAgICAgICAgICAvKiBNaWNyb3NlY29uZHMuICAqLworICB9OworCisvKiBBIGRlcyBhdXRoZW50aWNhdGlvbiB2ZXJpZmllciAqLworc3RydWN0IGF1dGhkZXNfdmVyZgorICB7CisgICAgdW5pb24KKyAgICAgIHsKKwlzdHJ1Y3QgcnBjX3RpbWV2YWwgYWR2X2N0aW1lOwkvKiBjbGVhciB0aW1lICovCisJZGVzX2Jsb2NrIGFkdl94dGltZTsJCS8qIGNyeXB0IHRpbWUgKi8KKyAgICAgIH0KKyAgICBhZHZfdGltZV91OworICAgIHVpbnQzMl90IGFkdl9pbnRfdTsKKyAgfTsKKworLyogZGVzIGF1dGhlbnRpY2F0aW9uIHZlcmlmaWVyOiBjbGllbnQgdmFyaWV0eQorCisgICBhZHZfdGltZXN0YW1wIGlzIHRoZSBjdXJyZW50IHRpbWUuCisgICBhZHZfd2ludmVyZiBpcyB0aGUgY3JlZGVudGlhbCB3aW5kb3cgKyAxLgorICAgQm90aCBhcmUgZW5jcnlwdGVkIHVzaW5nIHRoZSBjb252ZXJzYXRpb24ga2V5LiAqLworI2RlZmluZSBhZHZfdGltZXN0YW1wICBhZHZfdGltZV91LmFkdl9jdGltZQorI2RlZmluZSBhZHZfeHRpbWVzdGFtcCBhZHZfdGltZV91LmFkdl94dGltZQorI2RlZmluZSBhZHZfd2ludmVyZiAgICBhZHZfaW50X3UKKworLyogZGVzIGF1dGhlbnRpY2F0aW9uIHZlcmlmaWVyOiBzZXJ2ZXIgdmFyaWV0eQorCisgICBhZHZfdGltZXZlcmYgaXMgdGhlIGNsaWVudCdzIHRpbWVzdGFtcCArIGNsaWVudCdzIHdpbmRvdworICAgYWR2X25pY2tuYW1lIGlzIHRoZSBzZXJ2ZXIncyBuaWNrbmFtZSBmb3IgdGhlIGNsaWVudC4KKyAgIGFkdl90aW1ldmVyZiBpcyBlbmNyeXB0ZWQgdXNpbmcgdGhlIGNvbnZlcnNhdGlvbiBrZXkuICovCisjZGVmaW5lIGFkdl90aW1ldmVyZiAgIGFkdl90aW1lX3UuYWR2X2N0aW1lCisjZGVmaW5lIGFkdl94dGltZXZlcmYgIGFkdl90aW1lX3UuYWR2X3h0aW1lCisjZGVmaW5lIGFkdl9uaWNrbmFtZSAgIGFkdl9pbnRfdQorCisvKiBNYXAgYSBkZXMgY3JlZGVudGlhbCBpbnRvIGEgdW5peCBjcmVkLiAqLworZXh0ZXJuIGludCBhdXRoZGVzX2dldHVjcmVkIChfX2NvbnN0IHN0cnVjdCBhdXRoZGVzX2NyZWQgKiBfX2FkYywKKwkJCSAgICAgdWlkX3QgKiBfX3VpZCwgZ2lkX3QgKiBfX2dpZCwKKwkJCSAgICAgc2hvcnQgKl9fZ3JvdXBsZW4sIGdpZF90ICogX19ncm91cHMpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgcHVibGljIGtleSBmb3IgTkFNRSBhbmQgcGxhY2UgaXQgaW4gS0VZLiAgTkFNRSBjYW4gb25seSBiZQorICAgdXAgdG8gTUFYTkVUTkFNRUxFTiBieXRlcyBsb25nIGFuZCB0aGUgZGVzdGluYXRpb24gYnVmZmVyIEtFWSBzaG91bGQKKyAgIGhhdmUgSEVYS0VZQllURVMgKyAxIGJ5dGVzIGxvbmcgdG8gZml0IGFsbCBjaGFyYWN0ZXJzIGZyb20gdGhlIGtleS4gICovCitleHRlcm4gaW50IGdldHB1YmxpY2tleSAoX19jb25zdCBjaGFyICpfX25hbWUsIGNoYXIgKl9fa2V5KSBfX1RIUk9XOworCisvKiBHZXQgdGhlIHNlY3JldCBrZXkgZm9yIE5BTUUgYW5kIHBsYWNlIGl0IGluIEtFWS4gIFBBU1NXRCBpcyB1c2VkIHRvCisgICBkZWNyeXB0IHRoZSBlbmNyeXB0ZWQga2V5IHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuICBOQU1FIGNhbiBvbmx5IGJlCisgICB1cCB0byBNQVhORVROQU1FTEVOIGJ5dGVzIGxvbmcgYW5kIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgS0VZCisgICBzaG91bGQgaGF2ZSBIRVhLRVlCWVRFUyArIDEgYnl0ZXMgbG9uZyB0byBmaXQgYWxsIGNoYXJhY3RlcnMgZnJvbQorICAgdGhlIGtleS4gICovCitleHRlcm4gaW50IGdldHNlY3JldGtleSAoX19jb25zdCBjaGFyICpfX25hbWUsIGNoYXIgKl9fa2V5LAorCQkJIF9fY29uc3QgY2hhciAqX19wYXNzd2QpIF9fVEhST1c7CisKK2V4dGVybiBpbnQgcnRpbWUgKHN0cnVjdCBzb2NrYWRkcl9pbiAqX19hZGRycCwgc3RydWN0IHJwY190aW1ldmFsICpfX3RpbWVwLAorCQkgIHN0cnVjdCBycGNfdGltZXZhbCAqX190aW1lb3V0KSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBycGMvYXV0aF9kZXMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvYXV0aF91bml4LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9hdXRoX3VuaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjRlZTFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvYXV0aF91bml4LmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIGF1dGhfdW5peC5oLCBQcm90b2NvbCBmb3IgVU5JWCBzdHlsZSBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzIGZvciBSUEMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVGhlIHN5c3RlbSBpcyB2ZXJ5IHdlYWsuICBUaGUgY2xpZW50IHVzZXMgbm8gZW5jcnlwdGlvbiBmb3IgIGl0CisgKiBjcmVkZW50aWFscyBhbmQgb25seSBzZW5kcyBudWxsIHZlcmlmaWVycy4gIFRoZSBzZXJ2ZXIgc2VuZHMgYmFja3MKKyAqIG51bGwgdmVyaWZpZXJzIG9yIG9wdGlvbmFsbHkgYSB2ZXJpZmllciB0aGF0IHN1Z2dlc3RzIGEgbmV3IHNob3J0IGhhbmQKKyAqIGZvciB0aGUgY3JlZGVudGlhbHMuCisgKi8KKworI2lmbmRlZiBfUlBDX0FVVEhfVU5JWF9ICisjZGVmaW5lIF9SUENfQVVUSF9VTklYX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxycGMvdHlwZXMuaD4KKyNpbmNsdWRlIDxycGMvYXV0aC5oPgorI2luY2x1ZGUgPHJwYy94ZHIuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUaGUgbWFjaGluZSBuYW1lIGlzIHBhcnQgb2YgYSBjcmVkZW50aWFsOyBpdCBtYXkgbm90IGV4Y2VlZCAyNTUgYnl0ZXMgKi8KKyNkZWZpbmUgTUFYX01BQ0hJTkVfTkFNRSAyNTUKKworLyogZ2lkcyBjb21wb3NlIHBhcnQgb2YgYSBjcmVkZW50aWFsOyB0aGVyZSBtYXkgbm90IGJlIG1vcmUgdGhhbiAxNiBvZiB0aGVtICovCisjZGVmaW5lIE5HUlBTIDE2CisKKy8qCisgKiBVbml4IHN0eWxlIGNyZWRlbnRpYWxzLgorICovCitzdHJ1Y3QgYXV0aHVuaXhfcGFybXMKKyAgeworICAgIHVfbG9uZyBhdXBfdGltZTsKKyAgICBjaGFyICphdXBfbWFjaG5hbWU7CisgICAgX191aWRfdCBhdXBfdWlkOworICAgIF9fZ2lkX3QgYXVwX2dpZDsKKyAgICB1X2ludCBhdXBfbGVuOworICAgIF9fZ2lkX3QgKmF1cF9naWRzOworICB9OworCitleHRlcm4gYm9vbF90IHhkcl9hdXRodW5peF9wYXJtcyAoWERSICpfX3hkcnMsIHN0cnVjdCBhdXRodW5peF9wYXJtcyAqX19wKQorICAgICBfX1RIUk9XOworCisvKgorICogSWYgYSByZXNwb25zZSB2ZXJpZmllciBoYXMgZmxhdm9yIEFVVEhfU0hPUlQsCisgKiB0aGVuIHRoZSBib2R5IG9mIHRoZSByZXNwb25zZSB2ZXJpZmllciBlbmNhcHN1bGF0ZXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU7CisgKiBhZ2FpbiBpdCBpcyBzZXJpYWxpemVkIGluIHRoZSBvYnZpb3VzIGZhc2hpb24uCisgKi8KK3N0cnVjdCBzaG9ydF9oYW5kX3ZlcmYKKyAgeworICAgIHN0cnVjdCBvcGFxdWVfYXV0aCBuZXdfY3JlZDsKKyAgfTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHJwYy9hdXRoX3VuaXguaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvY2xudC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvY2xudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDIyOGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9jbG50LmgKQEAgLTAsMCArMSw0MTggQEAKKy8qCisgKiBjbG50LmggLSBDbGllbnQgc2lkZSByZW1vdGUgcHJvY2VkdXJlIGNhbGwgaW50ZXJmYWNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1JQQ19DTE5UX0gKKyNkZWZpbmUgX1JQQ19DTE5UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxycGMvdHlwZXMuaD4KKyNpbmNsdWRlIDxycGMvYXV0aC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qCisgKiBScGMgY2FsbHMgcmV0dXJuIGFuIGVudW0gY2xudF9zdGF0LiAgVGhpcyBzaG91bGQgYmUgbG9va2VkIGF0IG1vcmUsCisgKiBzaW5jZSBlYWNoIGltcGxlbWVudGF0aW9uIGlzIHJlcXVpcmVkIHRvIGxpdmUgd2l0aCB0aGlzIChpbXBsZW1lbnRhdGlvbgorICogaW5kZXBlbmRlbnQpIGxpc3Qgb2YgZXJyb3JzLgorICovCitlbnVtIGNsbnRfc3RhdCB7CisJUlBDX1NVQ0NFU1M9MCwJCQkvKiBjYWxsIHN1Y2NlZWRlZCAqLworCS8qCisJICogbG9jYWwgZXJyb3JzCisJICovCisJUlBDX0NBTlRFTkNPREVBUkdTPTEsCQkvKiBjYW4ndCBlbmNvZGUgYXJndW1lbnRzICovCisJUlBDX0NBTlRERUNPREVSRVM9MiwJCS8qIGNhbid0IGRlY29kZSByZXN1bHRzICovCisJUlBDX0NBTlRTRU5EPTMsCQkJLyogZmFpbHVyZSBpbiBzZW5kaW5nIGNhbGwgKi8KKwlSUENfQ0FOVFJFQ1Y9NCwJCQkvKiBmYWlsdXJlIGluIHJlY2VpdmluZyByZXN1bHQgKi8KKwlSUENfVElNRURPVVQ9NSwJCQkvKiBjYWxsIHRpbWVkIG91dCAqLworCS8qCisJICogcmVtb3RlIGVycm9ycworCSAqLworCVJQQ19WRVJTTUlTTUFUQ0g9NiwJCS8qIHJwYyB2ZXJzaW9ucyBub3QgY29tcGF0aWJsZSAqLworCVJQQ19BVVRIRVJST1I9NywJCS8qIGF1dGhlbnRpY2F0aW9uIGVycm9yICovCisJUlBDX1BST0dVTkFWQUlMPTgsCQkvKiBwcm9ncmFtIG5vdCBhdmFpbGFibGUgKi8KKwlSUENfUFJPR1ZFUlNNSVNNQVRDSD05LAkJLyogcHJvZ3JhbSB2ZXJzaW9uIG1pc21hdGNoZWQgKi8KKwlSUENfUFJPQ1VOQVZBSUw9MTAsCQkvKiBwcm9jZWR1cmUgdW5hdmFpbGFibGUgKi8KKwlSUENfQ0FOVERFQ09ERUFSR1M9MTEsCQkvKiBkZWNvZGUgYXJndW1lbnRzIGVycm9yICovCisJUlBDX1NZU1RFTUVSUk9SPTEyLAkJLyogZ2VuZXJpYyAib3RoZXIgcHJvYmxlbSIgKi8KKwlSUENfTk9CUk9BRENBU1QgPSAyMSwJCS8qIEJyb2FkY2FzdGluZyBub3Qgc3VwcG9ydGVkICovCisJLyoKKwkgKiBjYWxscnBjICYgY2xudF9jcmVhdGUgZXJyb3JzCisJICovCisJUlBDX1VOS05PV05IT1NUPTEzLAkJLyogdW5rbm93biBob3N0IG5hbWUgKi8KKwlSUENfVU5LTk9XTlBST1RPPTE3LAkJLyogdW5rbm93biBwcm90b2NvbCAqLworCVJQQ19VTktOT1dOQUREUiA9IDE5LAkJLyogUmVtb3RlIGFkZHJlc3MgdW5rbm93biAqLworCisJLyoKKwkgKiBycGNiaW5kIGVycm9ycworCSAqLworCVJQQ19SUENCRkFJTFVSRT0xNCwJCS8qIHBvcnRtYXBwZXIgZmFpbGVkIGluIGl0cyBjYWxsICovCisjZGVmaW5lIFJQQ19QTUFQRkFJTFVSRSBSUENfUlBDQkZBSUxVUkUKKwlSUENfUFJPR05PVFJFR0lTVEVSRUQ9MTUsCS8qIHJlbW90ZSBwcm9ncmFtIGlzIG5vdCByZWdpc3RlcmVkICovCisJUlBDX04yQVhMQVRFRkFJTFVSRSA9IDIyLAkvKiBOYW1lIHRvIGFkZHIgdHJhbnNsYXRpb24gZmFpbGVkICovCisJLyoKKwkgKiB1bnNwZWNpZmllZCBlcnJvcgorCSAqLworCVJQQ19GQUlMRUQ9MTYsCisJUlBDX0lOVFI9MTgsCisJUlBDX1RMSUVSUk9SPTIwLAorCVJQQ19VREVSUk9SPTIzLAorICAgICAgICAvKgorICAgICAgICAgKiBhc3luY2hyb25vdXMgZXJyb3JzCisgICAgICAgICAqLworICAgICAgICBSUENfSU5QUk9HUkVTUyA9IDI0LAorICAgICAgICBSUENfU1RBTEVSQUNIQU5ETEUgPSAyNQorfTsKKworCisvKgorICogRXJyb3IgaW5mby4KKyAqLworc3RydWN0IHJwY19lcnIgeworICBlbnVtIGNsbnRfc3RhdCByZV9zdGF0dXM7CisgIHVuaW9uIHsKKyAgICBpbnQgUkVfZXJybm87CQkvKiByZWxhdGVkIHN5c3RlbSBlcnJvciAqLworICAgIGVudW0gYXV0aF9zdGF0IFJFX3doeTsJLyogd2h5IHRoZSBhdXRoIGVycm9yIG9jY3VycmVkICovCisgICAgc3RydWN0IHsKKyAgICAgIHVfbG9uZyBsb3c7CQkvKiBsb3dlc3QgdmVyaW9uIHN1cHBvcnRlZCAqLworICAgICAgdV9sb25nIGhpZ2g7CQkvKiBoaWdoZXN0IHZlcmlvbiBzdXBwb3J0ZWQgKi8KKyAgICB9IFJFX3ZlcnM7CisgICAgc3RydWN0IHsJCQkvKiBtYXliZSBtZWFuaW5nZnVsIGlmIFJQQ19GQUlMRUQgKi8KKyAgICAgIGxvbmcgczE7CisgICAgICBsb25nIHMyOworICAgIH0gUkVfbGI7CQkJLyogbGlmZSBib290ICYgZGVidWdnaW5nIG9ubHkgKi8KKyAgfSBydTsKKyNkZWZpbmUJcmVfZXJybm8JcnUuUkVfZXJybm8KKyNkZWZpbmUJcmVfd2h5CQlydS5SRV93aHkKKyNkZWZpbmUJcmVfdmVycwkJcnUuUkVfdmVycworI2RlZmluZQlyZV9sYgkJcnUuUkVfbGIKK307CisKKworLyoKKyAqIENsaWVudCBycGMgaGFuZGxlLgorICogQ3JlYXRlZCBieSBpbmRpdmlkdWFsIGltcGxlbWVudGF0aW9ucywgc2VlIGUuZy4gcnBjX3VkcC5jLgorICogQ2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgYXV0aCwgc2VlIGUuZy4gYXV0aF9ub25lLmMuCisgKi8KK3R5cGVkZWYgc3RydWN0IENMSUVOVCBDTElFTlQ7CitzdHJ1Y3QgQ0xJRU5UIHsKKyAgQVVUSAkqY2xfYXV0aDsJCSAvKiBhdXRoZW50aWNhdG9yICovCisgIHN0cnVjdCBjbG50X29wcyB7CisgICAgZW51bSBjbG50X3N0YXQgKCpjbF9jYWxsKSAoQ0xJRU5UICosIHVfbG9uZywgeGRycHJvY190LCBjYWRkcl90LCB4ZHJwcm9jX3QsCisJCQkgICAgICAgY2FkZHJfdCwgc3RydWN0IHRpbWV2YWwpOworCQkJICAgICAgIAkvKiBjYWxsIHJlbW90ZSBwcm9jZWR1cmUgKi8KKyAgICB2b2lkICgqY2xfYWJvcnQpICh2b2lkKTsJLyogYWJvcnQgYSBjYWxsICovCisgICAgdm9pZCAoKmNsX2dldGVycikgKENMSUVOVCAqLCBzdHJ1Y3QgcnBjX2VyciAqKTsKKwkJCQkvKiBnZXQgc3BlY2lmaWMgZXJyb3IgY29kZSAqLworICAgIGJvb2xfdCAoKmNsX2ZyZWVyZXMpIChDTElFTlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKwkJCQkvKiBmcmVlcyByZXN1bHRzICovCisgICAgdm9pZCAoKmNsX2Rlc3Ryb3kpIChDTElFTlQgKik7IC8qIGRlc3Ryb3kgdGhpcyBzdHJ1Y3R1cmUgKi8KKyAgICBib29sX3QgKCpjbF9jb250cm9sKSAoQ0xJRU5UICosIGludCwgY2hhciAqKTsKKwkJCQkvKiB0aGUgaW9jdGwoKSBvZiBycGMgKi8KKyAgfSAqY2xfb3BzOworICBjYWRkcl90IGNsX3ByaXZhdGU7CQkvKiBwcml2YXRlIHN0dWZmICovCit9OworCisKKy8qCisgKiBjbGllbnQgc2lkZSBycGMgaW50ZXJmYWNlIG9wcworICoKKyAqIFBhcmFtZXRlciB0eXBlcyBhcmU6CisgKgorICovCisKKy8qCisgKiBlbnVtIGNsbnRfc3RhdAorICogQ0xOVF9DQUxMKHJoLCBwcm9jLCB4YXJncywgYXJnc3AsIHhyZXMsIHJlc3AsIHRpbWVvdXQpCisgKiAJQ0xJRU5UICpyaDsKKyAqCXVfbG9uZyBwcm9jOworICoJeGRycHJvY190IHhhcmdzOworICoJY2FkZHJfdCBhcmdzcDsKKyAqCXhkcnByb2NfdCB4cmVzOworICoJY2FkZHJfdCByZXNwOworICoJc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAqLworI2RlZmluZQlDTE5UX0NBTEwocmgsIHByb2MsIHhhcmdzLCBhcmdzcCwgeHJlcywgcmVzcCwgc2VjcykJXAorCSgoKihyaCktPmNsX29wcy0+Y2xfY2FsbCkocmgsIHByb2MsIHhhcmdzLCBhcmdzcCwgeHJlcywgcmVzcCwgc2VjcykpCisjZGVmaW5lCWNsbnRfY2FsbChyaCwgcHJvYywgeGFyZ3MsIGFyZ3NwLCB4cmVzLCByZXNwLCBzZWNzKQlcCisJKCgqKHJoKS0+Y2xfb3BzLT5jbF9jYWxsKShyaCwgcHJvYywgeGFyZ3MsIGFyZ3NwLCB4cmVzLCByZXNwLCBzZWNzKSkKKworLyoKKyAqIHZvaWQKKyAqIENMTlRfQUJPUlQocmgpOworICogCUNMSUVOVCAqcmg7CisgKi8KKyNkZWZpbmUJQ0xOVF9BQk9SVChyaCkJKCgqKHJoKS0+Y2xfb3BzLT5jbF9hYm9ydCkocmgpKQorI2RlZmluZQljbG50X2Fib3J0KHJoKQkoKCoocmgpLT5jbF9vcHMtPmNsX2Fib3J0KShyaCkpCisKKy8qCisgKiBzdHJ1Y3QgcnBjX2VycgorICogQ0xOVF9HRVRFUlIocmgpOworICogCUNMSUVOVCAqcmg7CisgKi8KKyNkZWZpbmUJQ0xOVF9HRVRFUlIocmgsZXJycCkJKCgqKHJoKS0+Y2xfb3BzLT5jbF9nZXRlcnIpKHJoLCBlcnJwKSkKKyNkZWZpbmUJY2xudF9nZXRlcnIocmgsZXJycCkJKCgqKHJoKS0+Y2xfb3BzLT5jbF9nZXRlcnIpKHJoLCBlcnJwKSkKKworCisvKgorICogYm9vbF90CisgKiBDTE5UX0ZSRUVSRVMocmgsIHhyZXMsIHJlc3ApOworICogCUNMSUVOVCAqcmg7CisgKgl4ZHJwcm9jX3QgeHJlczsKKyAqCWNhZGRyX3QgcmVzcDsKKyAqLworI2RlZmluZQlDTE5UX0ZSRUVSRVMocmgseHJlcyxyZXNwKSAoKCoocmgpLT5jbF9vcHMtPmNsX2ZyZWVyZXMpKHJoLHhyZXMscmVzcCkpCisjZGVmaW5lCWNsbnRfZnJlZXJlcyhyaCx4cmVzLHJlc3ApICgoKihyaCktPmNsX29wcy0+Y2xfZnJlZXJlcykocmgseHJlcyxyZXNwKSkKKworLyoKKyAqIGJvb2xfdAorICogQ0xOVF9DT05UUk9MKGNsLCByZXF1ZXN0LCBpbmZvKQorICogICAgICBDTElFTlQgKmNsOworICogICAgICB1X2ludCByZXF1ZXN0OworICogICAgICBjaGFyICppbmZvOworICovCisjZGVmaW5lCUNMTlRfQ09OVFJPTChjbCxycSxpbikgKCgqKGNsKS0+Y2xfb3BzLT5jbF9jb250cm9sKShjbCxycSxpbikpCisjZGVmaW5lCWNsbnRfY29udHJvbChjbCxycSxpbikgKCgqKGNsKS0+Y2xfb3BzLT5jbF9jb250cm9sKShjbCxycSxpbikpCisKKy8qCisgKiBjb250cm9sIG9wZXJhdGlvbnMgdGhhdCBhcHBseSB0byBhbGwgdHJhbnNwb3J0cworICoKKyAqIE5vdGU6IG9wdGlvbnMgbWFya2VkIFhYWCBhcmUgbm8tb3BzIGluIHRoaXMgaW1wbGVtZW50YXRpb24gb2YgUlBDLgorICogVGhlIGFyZSBwcmVzZW50IGluIFRJLVJQQyBidXQgY2FuJ3QgYmUgaW1wbGVtZW50ZWQgaGVyZSBzaW5jZSB0aGV5CisgKiBkZXBlbmQgb24gdGhlIHByZXNlbmNlIG9mIFNUUkVBTVMvVExJLCB3aGljaCB3ZSBkb24ndCBoYXZlLgorICovCisjZGVmaW5lIENMU0VUX1RJTUVPVVQgICAgICAgIDEgICAgLyogc2V0IHRpbWVvdXQgKHRpbWV2YWwpICovCisjZGVmaW5lIENMR0VUX1RJTUVPVVQgICAgICAgIDIgICAgLyogZ2V0IHRpbWVvdXQgKHRpbWV2YWwpICovCisjZGVmaW5lIENMR0VUX1NFUlZFUl9BRERSICAgIDMgICAgLyogZ2V0IHNlcnZlcidzIGFkZHJlc3MgKHNvY2thZGRyKSAqLworI2RlZmluZSBDTEdFVF9GRCAgICAgICAgICAgICA2ICAgIC8qIGdldCBjb25uZWN0aW9ucyBmaWxlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgQ0xHRVRfU1ZDX0FERFIgICAgICAgNyAgICAvKiBnZXQgc2VydmVyJ3MgYWRkcmVzcyAobmV0YnVmKSAgICAgIFhYWCAqLworI2RlZmluZSBDTFNFVF9GRF9DTE9TRSAgICAgICA4ICAgIC8qIGNsb3NlIGZkIHdoaWxlIGNsbnRfZGVzdHJveSAqLworI2RlZmluZSBDTFNFVF9GRF9OQ0xPU0UgICAgICA5ICAgIC8qIERvIG5vdCBjbG9zZSBmZCB3aGlsZSBjbG50X2Rlc3Ryb3kqLworI2RlZmluZSBDTEdFVF9YSUQgICAgICAgICAgICAxMCAgIC8qIEdldCB4aWQgKi8KKyNkZWZpbmUgQ0xTRVRfWElEICAgICAgICAgICAgMTEgICAvKiBTZXQgeGlkICovCisjZGVmaW5lIENMR0VUX1ZFUlMgICAgICAgICAgIDEyICAgLyogR2V0IHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIENMU0VUX1ZFUlMgICAgICAgICAgIDEzICAgLyogU2V0IHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIENMR0VUX1BST0cgICAgICAgICAgIDE0ICAgLyogR2V0IHByb2dyYW0gbnVtYmVyICovCisjZGVmaW5lIENMU0VUX1BST0cgICAgICAgICAgIDE1ICAgLyogU2V0IHByb2dyYW0gbnVtYmVyICovCisjZGVmaW5lIENMU0VUX1NWQ19BRERSICAgICAgIDE2ICAgLyogZ2V0IHNlcnZlcidzIGFkZHJlc3MgKG5ldGJ1ZikgICAgICBYWFggKi8KKyNkZWZpbmUgQ0xTRVRfUFVTSF9USU1PRCAgICAgMTcgICAvKiBwdXNoIHRpbW9kIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQgIFhYWCAqLworI2RlZmluZSBDTFNFVF9QT1BfVElNT0QgICAgICAxOCAgIC8qIHBvcCB0aW1vZCAgICAgICAgICAgICAgICAgICAgICAgICAgWFhYICovCisvKgorICogQ29ubmVjdGlvbmxlc3Mgb25seSBjb250cm9sIG9wZXJhdGlvbnMKKyAqLworI2RlZmluZSBDTFNFVF9SRVRSWV9USU1FT1VUCTQJLyogc2V0IHJldHJ5IHRpbWVvdXQgKHRpbWV2YWwpICovCisjZGVmaW5lIENMR0VUX1JFVFJZX1RJTUVPVVQJNQkvKiBnZXQgcmV0cnkgdGltZW91dCAodGltZXZhbCkgKi8KKworLyoKKyAqIHZvaWQKKyAqIENMTlRfREVTVFJPWShyaCk7CisgKiAJQ0xJRU5UICpyaDsKKyAqLworI2RlZmluZQlDTE5UX0RFU1RST1kocmgpCSgoKihyaCktPmNsX29wcy0+Y2xfZGVzdHJveSkocmgpKQorI2RlZmluZQljbG50X2Rlc3Ryb3kocmgpCSgoKihyaCktPmNsX29wcy0+Y2xfZGVzdHJveSkocmgpKQorCisKKy8qCisgKiBSUENURVNUIGlzIGEgdGVzdCBwcm9ncmFtIHdoaWNoIGlzIGFjY2Vzc2libGUgb24gZXZlcnkgcnBjCisgKiB0cmFuc3BvcnQvcG9ydC4gIEl0IGlzIHVzZWQgZm9yIHRlc3RpbmcsIHBlcmZvcm1hbmNlIGV2YWx1YXRpb24sCisgKiBhbmQgbmV0d29yayBhZG1pbmlzdHJhdGlvbi4KKyAqLworCisjZGVmaW5lIFJQQ1RFU1RfUFJPR1JBTQkJKCh1X2xvbmcpMSkKKyNkZWZpbmUgUlBDVEVTVF9WRVJTSU9OCQkoKHVfbG9uZykxKQorI2RlZmluZSBSUENURVNUX05VTExfUFJPQwkoKHVfbG9uZykyKQorI2RlZmluZSBSUENURVNUX05VTExfQkFUQ0hfUFJPQwkoKHVfbG9uZykzKQorCisvKgorICogQnkgY29udmVudGlvbiwgcHJvY2VkdXJlIDAgdGFrZXMgbnVsbCBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlbQorICovCisKKyNkZWZpbmUgTlVMTFBST0MgKCh1X2xvbmcpMCkKKworLyoKKyAqIEJlbG93IGFyZSB0aGUgY2xpZW50IGhhbmRsZSBjcmVhdGlvbiByb3V0aW5lcyBmb3IgdGhlIHZhcmlvdXMKKyAqIGltcGxlbWVudGF0aW9ucyBvZiBjbGllbnQgc2lkZSBycGMuICBUaGV5IGNhbiByZXR1cm4gTlVMTCBpZiBhCisgKiBjcmVhdGlvbiBmYWlsdXJlIG9jY3Vycy4KKyAqLworCisvKgorICogTWVtb3J5IGJhc2VkIHJwYyAoZm9yIHNwZWVkIGNoZWNrIGFuZCB0ZXN0aW5nKQorICogQ0xJRU5UICoKKyAqIGNsbnRyYXdfY3JlYXRlKHByb2csIHZlcnMpCisgKgl1X2xvbmcgcHJvZzsKKyAqCXVfbG9uZyB2ZXJzOworICovCitleHRlcm4gQ0xJRU5UICpjbG50cmF3X2NyZWF0ZSAoX19jb25zdCB1X2xvbmcgX19wcm9nLCBfX2NvbnN0IHVfbG9uZyBfX3ZlcnMpCisgICAgIF9fVEhST1c7CisKKworLyoKKyAqIEdlbmVyaWMgY2xpZW50IGNyZWF0aW9uIHJvdXRpbmUuIFN1cHBvcnRlZCBwcm90b2NvbHMgYXJlICJ1ZHAiLCAidGNwIiBhbmQKKyAqICJ1bml4IgorICogQ0xJRU5UICoKKyAqIGNsbnRfY3JlYXRlKGhvc3QsIHByb2csIHZlcnMsIHByb3QpCisgKgljaGFyICpob3N0OyAJLS0gaG9zdG5hbWUKKyAqCXVfbG9uZyBwcm9nOwktLSBwcm9ncmFtIG51bWJlcgorICoJdV9vbmcgdmVyczsJLS0gdmVyc2lvbiBudW1iZXIKKyAqCWNoYXIgKnByb3Q7CS0tIHByb3RvY29sCisgKi8KK2V4dGVybiBDTElFTlQgKmNsbnRfY3JlYXRlIChfX2NvbnN0IGNoYXIgKl9faG9zdCwgX19jb25zdCB1X2xvbmcgX19wcm9nLAorCQkJICAgIF9fY29uc3QgdV9sb25nIF9fdmVycywgX19jb25zdCBjaGFyICpfX3Byb3QpCisgICAgIF9fVEhST1c7CisKKworLyoKKyAqIFRDUCBiYXNlZCBycGMKKyAqIENMSUVOVCAqCisgKiBjbG50dGNwX2NyZWF0ZShyYWRkciwgcHJvZywgdmVycywgc29ja3AsIHNlbmRzeiwgcmVjdnN6KQorICoJc3RydWN0IHNvY2thZGRyX2luICpyYWRkcjsKKyAqCXVfbG9uZyBwcm9nOworICoJdV9sb25nIHZlcnNpb247CisgKglyZWdpc3RlciBpbnQgKnNvY2twOworICoJdV9pbnQgc2VuZHN6OworICoJdV9pbnQgcmVjdnN6OworICovCitleHRlcm4gQ0xJRU5UICpjbG50dGNwX2NyZWF0ZSAoc3RydWN0IHNvY2thZGRyX2luICpfX3JhZGRyLCB1X2xvbmcgX19wcm9nLAorCQkJICAgICAgIHVfbG9uZyBfX3ZlcnNpb24sIGludCAqX19zb2NrcCwgdV9pbnQgX19zZW5kc3osCisJCQkgICAgICAgdV9pbnQgX19yZWN2c3opIF9fVEhST1c7CisKKy8qCisgKiBVRFAgYmFzZWQgcnBjLgorICogQ0xJRU5UICoKKyAqIGNsbnR1ZHBfY3JlYXRlKHJhZGRyLCBwcm9ncmFtLCB2ZXJzaW9uLCB3YWl0LCBzb2NrcCkKKyAqCXN0cnVjdCBzb2NrYWRkcl9pbiAqcmFkZHI7CisgKgl1X2xvbmcgcHJvZ3JhbTsKKyAqCXVfbG9uZyB2ZXJzaW9uOworICoJc3RydWN0IHRpbWV2YWwgd2FpdF9yZXNlbmQ7CisgKglpbnQgKnNvY2twOworICoKKyAqIFNhbWUgYXMgYWJvdmUsIGJ1dCB5b3Ugc3BlY2lmeSBtYXggcGFja2V0IHNpemVzLgorICogQ0xJRU5UICoKKyAqIGNsbnR1ZHBfYnVmY3JlYXRlKHJhZGRyLCBwcm9ncmFtLCB2ZXJzaW9uLCB3YWl0LCBzb2NrcCwgc2VuZHN6LCByZWN2c3opCisgKglzdHJ1Y3Qgc29ja2FkZHJfaW4gKnJhZGRyOworICoJdV9sb25nIHByb2dyYW07CisgKgl1X2xvbmcgdmVyc2lvbjsKKyAqCXN0cnVjdCB0aW1ldmFsIHdhaXRfcmVzZW5kOworICoJaW50ICpzb2NrcDsKKyAqCXVfaW50IHNlbmRzejsKKyAqCXVfaW50IHJlY3ZzejsKKyAqLworZXh0ZXJuIENMSUVOVCAqY2xudHVkcF9jcmVhdGUgKHN0cnVjdCBzb2NrYWRkcl9pbiAqX19yYWRkciwgdV9sb25nIF9fcHJvZ3JhbSwKKwkJCSAgICAgICB1X2xvbmcgX192ZXJzaW9uLCBzdHJ1Y3QgdGltZXZhbCBfX3dhaXRfcmVzZW5kLAorCQkJICAgICAgIGludCAqX19zb2NrcCkgX19USFJPVzsKK2V4dGVybiBDTElFTlQgKmNsbnR1ZHBfYnVmY3JlYXRlIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKl9fcmFkZHIsCisJCQkJICB1X2xvbmcgX19wcm9ncmFtLCB1X2xvbmcgX192ZXJzaW9uLAorCQkJCSAgc3RydWN0IHRpbWV2YWwgX193YWl0X3Jlc2VuZCwgaW50ICpfX3NvY2twLAorCQkJCSAgdV9pbnQgX19zZW5kc3osIHVfaW50IF9fcmVjdnN6KSBfX1RIUk9XOworCisKKworCisvKgorICogQUZfVU5JWCBiYXNlZCBycGMKKyAqIENMSUVOVCAqCisgKiBjbG50dW5peF9jcmVhdGUocmFkZHIsIHByb2csIHZlcnMsIHNvY2twLCBzZW5kc3osIHJlY3ZzeikKKyAqICAgICAgc3RydWN0IHNvY2thZGRyX3VuICpyYWRkcjsKKyAqICAgICAgdV9sb25nIHByb2c7CisgKiAgICAgIHVfbG9uZyB2ZXJzaW9uOworICogICAgICByZWdpc3RlciBpbnQgKnNvY2twOworICogICAgICB1X2ludCBzZW5kc3o7CisgKiAgICAgIHVfaW50IHJlY3ZzejsKKyAqLworZXh0ZXJuIENMSUVOVCAqY2xudHVuaXhfY3JlYXRlICAoc3RydWN0IHNvY2thZGRyX3VuICpfX3JhZGRyLCB1X2xvbmcgX19wcm9ncmFtLAorCQkJCSB1X2xvbmcgX192ZXJzaW9uLCBpbnQgKl9fc29ja3AsCisJCQkJIHVfaW50IF9fc2VuZHN6LCB1X2ludCBfX3JlY3ZzeikgX19USFJPVzsKKworCitleHRlcm4gaW50IGNhbGxycGMgKF9fY29uc3QgY2hhciAqX19ob3N0LCBfX2NvbnN0IHVfbG9uZyBfX3Byb2dudW0sCisJCSAgICBfX2NvbnN0IHVfbG9uZyBfX3ZlcnNudW0sIF9fY29uc3QgdV9sb25nIF9fcHJvY251bSwKKwkJICAgIF9fY29uc3QgeGRycHJvY190IF9faW5wcm9jLCBfX2NvbnN0IGNoYXIgKl9faW4sCisJCSAgICBfX2NvbnN0IHhkcnByb2NfdCBfX291dHByb2MsIGNoYXIgKl9fb3V0KSBfX1RIUk9XOworZXh0ZXJuIGludCBfcnBjX2R0YWJsZXNpemUgKHZvaWQpIF9fVEhST1c7CisKKy8qCisgKiBQcmludCB3aHkgY3JlYXRpb24gZmFpbGVkCisgKi8KK2V4dGVybiB2b2lkIGNsbnRfcGNyZWF0ZWVycm9yIChfX2NvbnN0IGNoYXIgKl9fbXNnKTsJLyogc3RkZXJyICovCitleHRlcm4gY2hhciAqY2xudF9zcGNyZWF0ZWVycm9yKF9fY29uc3QgY2hhciAqX19tc2cpIF9fVEhST1c7CS8qIHN0cmluZyAqLworCisvKgorICogTGlrZSBjbG50X3BlcnJvcigpLCBidXQgaXMgbW9yZSB2ZXJib3NlIGluIGl0cyBvdXRwdXQKKyAqLworZXh0ZXJuIHZvaWQgY2xudF9wZXJybm8gKGVudW0gY2xudF9zdGF0IF9fbnVtKTsJCS8qIHN0ZGVyciAqLworCisvKgorICogUHJpbnQgYW4gRW5nbGlzaCBlcnJvciBtZXNzYWdlLCBnaXZlbiB0aGUgY2xpZW50IGVycm9yIGNvZGUKKyAqLworZXh0ZXJuIHZvaWQgY2xudF9wZXJyb3IgKENMSUVOVCAqX19jbG50LCBfX2NvbnN0IGNoYXIgKl9fbXNnKTsKKwkJCQkJCQkvKiBzdGRlcnIgKi8KK2V4dGVybiBjaGFyICpjbG50X3NwZXJyb3IgKENMSUVOVCAqX19jbG50LCBfX2NvbnN0IGNoYXIgKl9fbXNnKSBfX1RIUk9XOworCQkJCQkJCS8qIHN0cmluZyAqLworCisvKgorICogSWYgYSBjcmVhdGlvbiBmYWlscywgdGhlIGZvbGxvd2luZyBhbGxvd3MgdGhlIHVzZXIgdG8gZmlndXJlIG91dCB3aHkuCisgKi8KK3N0cnVjdCBycGNfY3JlYXRlZXJyIHsKKwllbnVtIGNsbnRfc3RhdCBjZl9zdGF0OworCXN0cnVjdCBycGNfZXJyIGNmX2Vycm9yOyAvKiB1c2VmdWwgd2hlbiBjZl9zdGF0ID09IFJQQ19QTUFQRkFJTFVSRSAqLworfTsKKworZXh0ZXJuIHN0cnVjdCBycGNfY3JlYXRlZXJyIHJwY19jcmVhdGVlcnI7CisKKworCisvKgorICogQ29weSBlcnJvciBtZXNzYWdlIHRvIGJ1ZmZlci4KKyAqLworZXh0ZXJuIGNoYXIgKmNsbnRfc3BlcnJubyAoZW51bSBjbG50X3N0YXQgX19udW0pIF9fVEhST1c7CS8qIHN0cmluZyAqLworCisvKgorICogZ2V0IHRoZSBwb3J0IG51bWJlciBvbiB0aGUgaG9zdCBmb3IgdGhlIHJwYyBwcm9ncmFtLHZlcnNpb24gYW5kIHByb3RvCisgKi8KK2V4dGVybiBpbnQgZ2V0cnBjcG9ydCAoX19jb25zdCBjaGFyICogX19ob3N0LCB1X2xvbmcgX19wcm9nbnVtLAorCQkgICAgICAgdV9sb25nIF9fdmVyc251bSwgdV9pbnQgX19wcm90bykgX19USFJPVzsKKworLyoKKyAqIGdldCB0aGUgbG9jYWwgaG9zdCdzIElQIGFkZHJlc3Mgd2l0aG91dCBjb25zdWx0aW5nCisgKiBuYW1lIHNlcnZpY2UgbGlicmFyeSBmdW5jdGlvbnMKKyAqLworZXh0ZXJuIHZvaWQgZ2V0X215YWRkcmVzcyAoc3RydWN0IHNvY2thZGRyX2luICopIF9fVEhST1c7CisKKyNkZWZpbmUgVURQTVNHU0laRQk4ODAwCS8qIHJwYyBpbXBvc2VkIGxpbWl0IG9uIHVkcCBtc2cgc2l6ZSAqLworI2RlZmluZSBSUENTTUFMTE1TR1NJWkUJNDAwCS8qIGEgbW9yZSByZWFzb25hYmxlIHBhY2tldCBzaXplICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBycGMvY2xudC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9kZXNfY3J5cHQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2Rlc19jcnlwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Y2NhM2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9kZXNfY3J5cHQuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQCgjKWRlc19jcnlwdC5oCTIuMSA4OC8wOC8xMSA0LjAgUlBDU1JDCisgKgorICogZGVzX2NyeXB0LmgsIGRlcyBsaWJyYXJ5IHJvdXRpbmUgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fREVTX0NSWVBUX0hfXworI2RlZmluZSBfX0RFU19DUllQVF9IX18gMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjZGVmaW5lIERFU19NQVhEQVRBIDgxOTIJLyogbWF4IGJ5dGVzIGVuY3J5cHRlZCBpbiBvbmUgY2FsbCAqLworI2RlZmluZSBERVNfRElSTUFTSyAoMSA8PCAwKQorI2RlZmluZSBERVNfRU5DUllQVCAoMCpERVNfRElSTUFTSykJLyogRW5jcnlwdCAqLworI2RlZmluZSBERVNfREVDUllQVCAoMSpERVNfRElSTUFTSykJLyogRGVjcnlwdCAqLworCisKKyNkZWZpbmUgREVTX0RFVk1BU0sgKDEgPDwgMSkKKyNkZWZpbmUJREVTX0hXICgwKkRFU19ERVZNQVNLKQkvKiBVc2UgaGFyZHdhcmUgZGV2aWNlICovCisjZGVmaW5lIERFU19TVyAoMSpERVNfREVWTUFTSykJLyogVXNlIHNvZnR3YXJlIGRldmljZSAqLworCisKKyNkZWZpbmUgREVTRVJSX05PTkUgMAkvKiBzdWNjZWVkZWQgKi8KKyNkZWZpbmUgREVTRVJSX05PSFdERVZJQ0UgMQkvKiBzdWNjZWVkZWQsIGJ1dCBodyBkZXZpY2Ugbm90IGF2YWlsYWJsZSAqLworI2RlZmluZSBERVNFUlJfSFdFUlJPUiAyCS8qIGZhaWxlZCwgaGFyZHdhcmUvZHJpdmVyIGVycm9yICovCisjZGVmaW5lIERFU0VSUl9CQURQQVJBTSAzCS8qIGZhaWxlZCwgYmFkIHBhcmFtZXRlciB0byBjYWxsICovCisKKyNkZWZpbmUgREVTX0ZBSUxFRChlcnIpIFwKKwkoKGVycikgPiBERVNFUlJfTk9IV0RFVklDRSkKKworLyoKKyAqIGNiY19jcnlwdCgpCisgKiBlY2JfY3J5cHQoKQorICoKKyAqIEVuY3J5cHQgKG9yIGRlY3J5cHQpIGxlbiBieXRlcyBvZiBhIGJ1ZmZlciBidWYuCisgKiBUaGUgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBlaWdodC4KKyAqIFRoZSBrZXkgc2hvdWxkIGhhdmUgb2RkIHBhcml0eSBpbiB0aGUgbG93IGJpdCBvZiBlYWNoIGJ5dGUuCisgKiBpdmVjIGlzIHRoZSBpbnB1dCB2ZWN0b3IsIGFuZCBpcyB1cGRhdGVkIHRvIHRoZSBuZXcgb25lIChjYmMgb25seSkuCisgKiBUaGUgbW9kZSBpcyBjcmVhdGVkIGJ5IG9yaW5nIHRvZ2V0aGVyIHRoZSBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzLgorICogREVTRVJSX05PSFdERVZJQ0UgaXMgcmV0dXJuZWQgaWYgREVTX0hXIHdhcyBzcGVjaWZpZWQgYnV0CisgKiB0aGVyZSB3YXMgbm8gaGFyZHdhcmUgdG8gZG8gaXQgb24gKHRoZSBkYXRhIHdpbGwgc3RpbGwgYmUKKyAqIGVuY3J5cHRlZCB0aG91Z2gsIGluIHNvZnR3YXJlKS4KKyAqLworCisKKy8qCisgKiBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgbW9kZQorICovCitleHRlcm4gaW50IGNiY19jcnlwdCAoY2hhciAqX19rZXksIGNoYXIgKl9fYnVmLCB1bnNpZ25lZCBfX2xlbiwKKwkJICAgICAgdW5zaWduZWQgX19tb2RlLCBjaGFyICpfX2l2ZWMpIF9fVEhST1c7CisKKy8qCisgKiBFbGVjdHJvbmljIENvZGUgQm9vayBtb2RlCisgKi8KK2V4dGVybiBpbnQgZWNiX2NyeXB0IChjaGFyICpfX2tleSwgY2hhciAqX19idWYsIHVuc2lnbmVkIF9fbGVuLAorCQkgICAgICB1bnNpZ25lZCBfX21vZGUpIF9fVEhST1c7CisKKy8qCisgKiBTZXQgZGVzIHBhcml0eSBmb3IgYSBrZXkuCisgKiBERVMgcGFyaXR5IGlzIG9kZCBhbmQgaW4gdGhlIGxvdyBiaXQgb2YgZWFjaCBieXRlCisgKi8KK2V4dGVybiB2b2lkIGRlc19zZXRwYXJpdHkgKGNoYXIgKl9fa2V5KSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2tleV9wcm90LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9rZXlfcHJvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NjI3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9rZXlfcHJvdC5oCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KKyAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgorICovCisKKyNpZm5kZWYgX0tFWV9QUk9UX0hfUlBDR0VOCisjZGVmaW5lIF9LRVlfUFJPVF9IX1JQQ0dFTgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisvKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogQ29tcGlsZWQgZnJvbSBrZXlfcHJvdC54IHVzaW5nIHJwY2dlbi4KKyAqIERPIE5PVCBFRElUIFRISVMgRklMRSEKKyAqIFRoaXMgaXMgTk9UIHNvdXJjZSBjb2RlIQorICovCisjZGVmaW5lIFBST09UIDMKKyNkZWZpbmUgSEVYTU9EVUxVUyAiZDRhMGJhMDI1MGI2ZmQyZWM2MjZlN2VmZDYzN2RmNzZjNzE2ZTIyZDA5NDRiODhiIgorI2RlZmluZSBIRVhLRVlCWVRFUyA0OAorI2RlZmluZSBLRVlTSVpFIDE5MgorI2RlZmluZSBLRVlCWVRFUyAyNAorI2RlZmluZSBLRVlDSEVDS1NVTVNJWkUgMTYKKworZW51bSBrZXlzdGF0dXMgeworCUtFWV9TVUNDRVNTID0gMCwKKwlLRVlfTk9TRUNSRVQgPSAxLAorCUtFWV9VTktOT1dOID0gMiwKKwlLRVlfU1lTVEVNRVJSID0gMywKK307Cit0eXBlZGVmIGVudW0ga2V5c3RhdHVzIGtleXN0YXR1czsKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBib29sX3QgeGRyX2tleXN0YXR1cyhYRFIgKiwga2V5c3RhdHVzKik7CisjZWxpZiBfX1NURENfXworZXh0ZXJuICBib29sX3QgeGRyX2tleXN0YXR1cyhYRFIgKiwga2V5c3RhdHVzKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLworYm9vbF90IHhkcl9rZXlzdGF0dXMoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLworCisKK3R5cGVkZWYgY2hhciBrZXlidWZbSEVYS0VZQllURVNdOworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIGJvb2xfdCB4ZHJfa2V5YnVmKFhEUiAqLCBrZXlidWYpOworI2VsaWYgX19TVERDX18KK2V4dGVybiAgYm9vbF90IHhkcl9rZXlidWYoWERSICosIGtleWJ1Zik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLworYm9vbF90IHhkcl9rZXlidWYoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLworCisKK3R5cGVkZWYgY2hhciAqbmV0bmFtZXN0cjsKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBib29sX3QgeGRyX25ldG5hbWVzdHIoWERSICosIG5ldG5hbWVzdHIqKTsKKyNlbGlmIF9fU1REQ19fCitleHRlcm4gIGJvb2xfdCB4ZHJfbmV0bmFtZXN0cihYRFIgKiwgbmV0bmFtZXN0ciopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8KK2Jvb2xfdCB4ZHJfbmV0bmFtZXN0cigpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovCisKKworc3RydWN0IGNyeXB0a2V5YXJnIHsKKwluZXRuYW1lc3RyIHJlbW90ZW5hbWU7CisJZGVzX2Jsb2NrIGRlc2tleTsKK307Cit0eXBlZGVmIHN0cnVjdCBjcnlwdGtleWFyZyBjcnlwdGtleWFyZzsKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBib29sX3QgeGRyX2NyeXB0a2V5YXJnKFhEUiAqLCBjcnlwdGtleWFyZyopOworI2VsaWYgX19TVERDX18KK2V4dGVybiAgYm9vbF90IHhkcl9jcnlwdGtleWFyZyhYRFIgKiwgY3J5cHRrZXlhcmcqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovCitib29sX3QgeGRyX2NyeXB0a2V5YXJnKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8KKworCitzdHJ1Y3QgY3J5cHRrZXlhcmcyIHsKKwluZXRuYW1lc3RyIHJlbW90ZW5hbWU7CisJbmV0b2JqIHJlbW90ZWtleTsKKwlkZXNfYmxvY2sgZGVza2V5OworfTsKK3R5cGVkZWYgc3RydWN0IGNyeXB0a2V5YXJnMiBjcnlwdGtleWFyZzI7CisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9jcnlwdGtleWFyZzIoWERSICosIGNyeXB0a2V5YXJnMiopOworI2VsaWYgX19TVERDX18KK2V4dGVybiAgYm9vbF90IHhkcl9jcnlwdGtleWFyZzIoWERSICosIGNyeXB0a2V5YXJnMiopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8KK2Jvb2xfdCB4ZHJfY3J5cHRrZXlhcmcyKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8KKworCitzdHJ1Y3QgY3J5cHRrZXlyZXMgeworCWtleXN0YXR1cyBzdGF0dXM7CisJdW5pb24geworCQlkZXNfYmxvY2sgZGVza2V5OworCX0gY3J5cHRrZXlyZXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBjcnlwdGtleXJlcyBjcnlwdGtleXJlczsKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBib29sX3QgeGRyX2NyeXB0a2V5cmVzKFhEUiAqLCBjcnlwdGtleXJlcyopOworI2VsaWYgX19TVERDX18KK2V4dGVybiAgYm9vbF90IHhkcl9jcnlwdGtleXJlcyhYRFIgKiwgY3J5cHRrZXlyZXMqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovCitib29sX3QgeGRyX2NyeXB0a2V5cmVzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8KKworI2RlZmluZSBNQVhHSURTIDE2CisKK3N0cnVjdCB1bml4Y3JlZCB7CisJdV9pbnQgdWlkOworCXVfaW50IGdpZDsKKwlzdHJ1Y3QgeworCQl1X2ludCBnaWRzX2xlbjsKKwkJdV9pbnQgKmdpZHNfdmFsOworCX0gZ2lkczsKK307Cit0eXBlZGVmIHN0cnVjdCB1bml4Y3JlZCB1bml4Y3JlZDsKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBib29sX3QgeGRyX3VuaXhjcmVkKFhEUiAqLCB1bml4Y3JlZCopOworI2VsaWYgX19TVERDX18KK2V4dGVybiAgYm9vbF90IHhkcl91bml4Y3JlZChYRFIgKiwgdW5peGNyZWQqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovCitib29sX3QgeGRyX3VuaXhjcmVkKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8KKworCitzdHJ1Y3QgZ2V0Y3JlZHJlcyB7CisJa2V5c3RhdHVzIHN0YXR1czsKKwl1bmlvbiB7CisJCXVuaXhjcmVkIGNyZWQ7CisJfSBnZXRjcmVkcmVzX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZ2V0Y3JlZHJlcyBnZXRjcmVkcmVzOworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIGJvb2xfdCB4ZHJfZ2V0Y3JlZHJlcyhYRFIgKiwgZ2V0Y3JlZHJlcyopOworI2VsaWYgX19TVERDX18KK2V4dGVybiAgYm9vbF90IHhkcl9nZXRjcmVkcmVzKFhEUiAqLCBnZXRjcmVkcmVzKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLworYm9vbF90IHhkcl9nZXRjcmVkcmVzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8KKworCitzdHJ1Y3Qga2V5X25ldHN0YXJnIHsKKwlrZXlidWYgc3RfcHJpdl9rZXk7CisJa2V5YnVmIHN0X3B1Yl9rZXk7CisJbmV0bmFtZXN0ciBzdF9uZXRuYW1lOworfTsKK3R5cGVkZWYgc3RydWN0IGtleV9uZXRzdGFyZyBrZXlfbmV0c3Rhcmc7CisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9rZXlfbmV0c3RhcmcoWERSICosIGtleV9uZXRzdGFyZyopOworI2VsaWYgX19TVERDX18KK2V4dGVybiAgYm9vbF90IHhkcl9rZXlfbmV0c3RhcmcoWERSICosIGtleV9uZXRzdGFyZyopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8KK2Jvb2xfdCB4ZHJfa2V5X25ldHN0YXJnKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8KKworCitzdHJ1Y3Qga2V5X25ldHN0cmVzIHsKKwlrZXlzdGF0dXMgc3RhdHVzOworCXVuaW9uIHsKKwkJa2V5X25ldHN0YXJnIGtuZXQ7CisJfSBrZXlfbmV0c3RyZXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBrZXlfbmV0c3RyZXMga2V5X25ldHN0cmVzOworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIGJvb2xfdCB4ZHJfa2V5X25ldHN0cmVzKFhEUiAqLCBrZXlfbmV0c3RyZXMqKTsKKyNlbGlmIF9fU1REQ19fCitleHRlcm4gIGJvb2xfdCB4ZHJfa2V5X25ldHN0cmVzKFhEUiAqLCBrZXlfbmV0c3RyZXMqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovCitib29sX3QgeGRyX2tleV9uZXRzdHJlcygpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovCisKKworI2lmbmRlZiBvcGFxdWUKKyNkZWZpbmUgb3BhcXVlIGNoYXIKKyNlbmRpZgorCisKKyNkZWZpbmUgS0VZX1BST0cgKCh1X2xvbmcpMTAwMDI5KQorI2RlZmluZSBLRVlfVkVSUyAoKHVfbG9uZykxKQorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgS0VZX1NFVCAoKHVfbG9uZykxKQorZXh0ZXJuICJDIiBrZXlzdGF0dXMgKiBrZXlfc2V0XzEob3BhcXVlICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIga2V5c3RhdHVzICoga2V5X3NldF8xX3N2YyhvcGFxdWUgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9FTkNSWVBUICgodV9sb25nKTIpCitleHRlcm4gIkMiIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMShjcnlwdGtleWFyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMV9zdmMoY3J5cHRrZXlhcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9ERUNSWVBUICgodV9sb25nKTMpCitleHRlcm4gIkMiIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMShjcnlwdGtleWFyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMV9zdmMoY3J5cHRrZXlhcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9HRU4gKCh1X2xvbmcpNCkKK2V4dGVybiAiQyIgZGVzX2Jsb2NrICoga2V5X2dlbl8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBkZXNfYmxvY2sgKiBrZXlfZ2VuXzFfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9HRVRDUkVEICgodV9sb25nKTUpCitleHRlcm4gIkMiIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8xKG5ldG5hbWVzdHIgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMV9zdmMobmV0bmFtZXN0ciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKworI2VsaWYgX19TVERDX18KKyNkZWZpbmUgS0VZX1NFVCAoKHVfbG9uZykxKQorZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzEob3BhcXVlICosIENMSUVOVCAqKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8xX3N2YyhvcGFxdWUgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9FTkNSWVBUICgodV9sb25nKTIpCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMShjcnlwdGtleWFyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMV9zdmMoY3J5cHRrZXlhcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9ERUNSWVBUICgodV9sb25nKTMpCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMShjcnlwdGtleWFyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMV9zdmMoY3J5cHRrZXlhcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9HRU4gKCh1X2xvbmcpNCkKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzFfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9HRVRDUkVEICgodV9sb25nKTUpCitleHRlcm4gIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8xKG5ldG5hbWVzdHIgKiwgQ0xJRU5UICopOworZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMV9zdmMobmV0bmFtZXN0ciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8KKyNkZWZpbmUgS0VZX1NFVCAoKHVfbG9uZykxKQorZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzEoKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8xX3N2YygpOworI2RlZmluZSBLRVlfRU5DUllQVCAoKHVfbG9uZykyKQorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzEoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8xX3N2YygpOworI2RlZmluZSBLRVlfREVDUllQVCAoKHVfbG9uZykzKQorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzEoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8xX3N2YygpOworI2RlZmluZSBLRVlfR0VOICgodV9sb25nKTQpCitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMSgpOworZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzFfc3ZjKCk7CisjZGVmaW5lIEtFWV9HRVRDUkVEICgodV9sb25nKTUpCitleHRlcm4gIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8xKCk7CitleHRlcm4gIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8xX3N2YygpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovCisjZGVmaW5lIEtFWV9WRVJTMiAoKHVfbG9uZykyKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIga2V5c3RhdHVzICoga2V5X3NldF8yKG9wYXF1ZSAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGtleXN0YXR1cyAqIGtleV9zZXRfMl9zdmMob3BhcXVlICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzIoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzJfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzIoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzJfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuICJDIiBkZXNfYmxvY2sgKiBrZXlfZ2VuXzIodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGRlc19ibG9jayAqIGtleV9nZW5fMl9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAiQyIgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzIobmV0bmFtZXN0ciAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8yX3N2YyhuZXRuYW1lc3RyICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfRU5DUllQVF9QSyAoKHVfbG9uZyk2KQorZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0X3BrXzIoY3J5cHRrZXlhcmcyICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF9wa18yX3N2YyhjcnlwdGtleWFyZzIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9ERUNSWVBUX1BLICgodV9sb25nKTcpCitleHRlcm4gIkMiIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfcGtfMihjcnlwdGtleWFyZzIgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0X3BrXzJfc3ZjKGNyeXB0a2V5YXJnMiAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX05FVF9QVVQgKCh1X2xvbmcpOCkKK2V4dGVybiAiQyIga2V5c3RhdHVzICoga2V5X25ldF9wdXRfMihrZXlfbmV0c3RhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBrZXlzdGF0dXMgKiBrZXlfbmV0X3B1dF8yX3N2YyhrZXlfbmV0c3RhcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9ORVRfR0VUICgodV9sb25nKTkpCitleHRlcm4gIkMiIGtleV9uZXRzdHJlcyAqIGtleV9uZXRfZ2V0XzIodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGtleV9uZXRzdHJlcyAqIGtleV9uZXRfZ2V0XzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9HRVRfQ09OViAoKHVfbG9uZykxMCkKK2V4dGVybiAiQyIgY3J5cHRrZXlyZXMgKiBrZXlfZ2V0X2NvbnZfMihvcGFxdWUgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9nZXRfY29udl8yX3N2YyhvcGFxdWUgKiwgc3RydWN0IHN2Y19yZXEgKik7CisKKyNlbGlmIF9fU1REQ19fCitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMihvcGFxdWUgKiwgQ0xJRU5UICopOworZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzJfc3ZjKG9wYXF1ZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8yKGNyeXB0a2V5YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8yX3N2YyhjcnlwdGtleWFyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8yKGNyeXB0a2V5YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8yX3N2YyhjcnlwdGtleWFyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8yKG5ldG5hbWVzdHIgKiwgQ0xJRU5UICopOworZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMl9zdmMobmV0bmFtZXN0ciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX0VOQ1JZUFRfUEsgKCh1X2xvbmcpNikKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF9wa18yKGNyeXB0a2V5YXJnMiAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfcGtfMl9zdmMoY3J5cHRrZXlhcmcyICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfREVDUllQVF9QSyAoKHVfbG9uZyk3KQorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0X3BrXzIoY3J5cHRrZXlhcmcyICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF9wa18yX3N2YyhjcnlwdGtleWFyZzIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9ORVRfUFVUICgodV9sb25nKTgpCitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9uZXRfcHV0XzIoa2V5X25ldHN0YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X25ldF9wdXRfMl9zdmMoa2V5X25ldHN0YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfTkVUX0dFVCAoKHVfbG9uZyk5KQorZXh0ZXJuICBrZXlfbmV0c3RyZXMgKiBrZXlfbmV0X2dldF8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBrZXlfbmV0c3RyZXMgKiBrZXlfbmV0X2dldF8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VUX0NPTlYgKCh1X2xvbmcpMTApCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2dldF9jb252XzIob3BhcXVlICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZ2V0X2NvbnZfMl9zdmMob3BhcXVlICosIHN0cnVjdCBzdmNfcmVxICopOworCisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLworZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzIoKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8yX3N2YygpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzIoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8yX3N2YygpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzIoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8yX3N2YygpOworZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzIoKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8yX3N2YygpOworZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMigpOworZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMl9zdmMoKTsKKyNkZWZpbmUgS0VZX0VOQ1JZUFRfUEsgKCh1X2xvbmcpNikKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF9wa18yKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfcGtfMl9zdmMoKTsKKyNkZWZpbmUgS0VZX0RFQ1JZUFRfUEsgKCh1X2xvbmcpNykKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF9wa18yKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfcGtfMl9zdmMoKTsKKyNkZWZpbmUgS0VZX05FVF9QVVQgKCh1X2xvbmcpOCkKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X25ldF9wdXRfMigpOworZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfbmV0X3B1dF8yX3N2YygpOworI2RlZmluZSBLRVlfTkVUX0dFVCAoKHVfbG9uZyk5KQorZXh0ZXJuICBrZXlfbmV0c3RyZXMgKiBrZXlfbmV0X2dldF8yKCk7CitleHRlcm4gIGtleV9uZXRzdHJlcyAqIGtleV9uZXRfZ2V0XzJfc3ZjKCk7CisjZGVmaW5lIEtFWV9HRVRfQ09OViAoKHVfbG9uZykxMCkKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZ2V0X2NvbnZfMigpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9nZXRfY29udl8yX3N2YygpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovCisKKyNlbmRpZiAvKiAhX0tFWV9QUk9UX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9uZXRkYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvbmV0ZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzAzNDk2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvbmV0ZGIuaApAQCAtMCwwICsxLDc0IEBACisvKiBAKCMpbmV0ZGIuaAkyLjEgODgvMDcvMjkgMy45IFJQQ1NSQyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyogQ2xlYW5lZCB1cCBmb3IgR05VIEMgbGlicmFyeSByb2xhbmRAZ251LmFpLm1pdC5lZHU6CisgICBhZGRlZCBtdWx0aXBsZSBpbmNsdXNpb24gcHJvdGVjdGlvbiBhbmQgdXNlIG9mIDxzeXMvY2RlZnMuaD4uCisgICBJbiBHTlUgdGhpcyBmaWxlIGlzICNpbmNsdWRlJ2QgYnkgPG5ldGRiLmg+LiAgKi8KKworI2lmbmRlZiBfUlBDX05FVERCX0gKKyNkZWZpbmUgX1JQQ19ORVREQl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitfX0JFR0lOX0RFQ0xTCisKK3N0cnVjdCBycGNlbnQKK3sKKyAgY2hhciAqcl9uYW1lOwkJLyogTmFtZSBvZiBzZXJ2ZXIgZm9yIHRoaXMgcnBjIHByb2dyYW0uICAqLworICBjaGFyICoqcl9hbGlhc2VzOwkvKiBBbGlhcyBsaXN0LiAgKi8KKyAgaW50IHJfbnVtYmVyOwkJLyogUlBDIHByb2dyYW0gbnVtYmVyLiAgKi8KK307CisKK2V4dGVybiB2b2lkIHNldHJwY2VudCAoaW50IF9fc3RheW9wZW4pIF9fVEhST1c7CitleHRlcm4gdm9pZCBlbmRycGNlbnQgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gc3RydWN0IHJwY2VudCAqZ2V0cnBjYnluYW1lIChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKK2V4dGVybiBzdHJ1Y3QgcnBjZW50ICpnZXRycGNieW51bWJlciAoaW50IF9fbnVtYmVyKSBfX1RIUk9XOworZXh0ZXJuIHN0cnVjdCBycGNlbnQgKmdldHJwY2VudCAodm9pZCkgX19USFJPVzsKKworI2lmZGVmIF9fVVNFX01JU0MKK2V4dGVybiBpbnQgZ2V0cnBjYnluYW1lX3IgKF9fY29uc3QgY2hhciAqX19uYW1lLCBzdHJ1Y3QgcnBjZW50ICpfX3Jlc3VsdF9idWYsCisJCQkgICBjaGFyICpfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgc3RydWN0IHJwY2VudCAqKl9fcmVzdWx0KSBfX1RIUk9XOworCitleHRlcm4gaW50IGdldHJwY2J5bnVtYmVyX3IgKGludCBfX251bWJlciwgc3RydWN0IHJwY2VudCAqX19yZXN1bHRfYnVmLAorCQkJICAgICBjaGFyICpfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgICBzdHJ1Y3QgcnBjZW50ICoqX19yZXN1bHQpIF9fVEhST1c7CisKK2V4dGVybiBpbnQgZ2V0cnBjZW50X3IgKHN0cnVjdCBycGNlbnQgKl9fcmVzdWx0X2J1ZiwgY2hhciAqX19idWZmZXIsCisJCQlzaXplX3QgX19idWZsZW4sIHN0cnVjdCBycGNlbnQgKipfX3Jlc3VsdCkgX19USFJPVzsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL25ldGRiLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3BtYXBfY2xudC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcG1hcF9jbG50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1ODdjNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3BtYXBfY2xudC5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBwbWFwX2NsbnQuaAorICogU3VwcGxpZXMgQyByb3V0aW5lcyB0byBnZXQgdG8gcG9ydG1hcCBzZXJ2aWNlcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9SUENfUE1BUF9DTE5UX0gKKyNkZWZpbmUgX1JQQ19QTUFQX0NMTlRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHJwYy90eXBlcy5oPgorI2luY2x1ZGUgPHJwYy94ZHIuaD4KKyNpbmNsdWRlIDxycGMvY2xudC5oPgorCitfX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgYm9vbF90ICgqcmVzdWx0cHJvY190KSAoY2FkZHJfdCBfX3Jlc3AsIHN0cnVjdCBzb2NrYWRkcl9pbiAqX19yYWRkcik7CisKKy8qCisgKiBVc2FnZToKKyAqCXN1Y2Nlc3MgPSBwbWFwX3NldChwcm9ncmFtLCB2ZXJzaW9uLCBwcm90b2NvbCwgcG9ydCk7CisgKglzdWNjZXNzID0gcG1hcF91bnNldChwcm9ncmFtLCB2ZXJzaW9uKTsKKyAqCXBvcnQgPSBwbWFwX2dldHBvcnQoYWRkcmVzcywgcHJvZ3JhbSwgdmVyc2lvbiwgcHJvdG9jb2wpOworICoJaGVhZCA9IHBtYXBfZ2V0bWFwcyhhZGRyZXNzKTsKKyAqCWNsbnRfc3RhdCA9IHBtYXBfcm10Y2FsbChhZGRyZXNzLCBwcm9ncmFtLCB2ZXJzaW9uLCBwcm9jZWR1cmUsCisgKgkJeGRyYXJncywgYXJnc3AsIHhkcnJlcywgcmVzcCwgdG91dCwgcG9ydF9wdHIpCisgKgkJKHdvcmtzIGZvciB1ZHAgb25seS4pCisgKiAJY2xudF9zdGF0ID0gY2xudF9icm9hZGNhc3QocHJvZ3JhbSwgdmVyc2lvbiwgcHJvY2VkdXJlLAorICoJCXhkcmFyZ3MsIGFyZ3NwLAl4ZHJyZXMsIHJlc3AsIGVhY2hyZXN1bHQpCisgKgkJKGxpa2UgcG1hcF9ybXRjYWxsLCBleGNlcHQgdGhlIGNhbGwgaXMgYnJvYWRjYXN0ZWQgdG8gYWxsCisgKgkJbG9jYWxseSBjb25uZWN0ZWQgbmV0cy4gIEZvciBlYWNoIHZhbGlkIHJlc3BvbnNlIHJlY2VpdmVkLAorICoJCXRoZSBwcm9jZWR1cmUgZWFjaHJlc3VsdCBpcyBjYWxsZWQuICBJdHMgZm9ybSBpczoKKyAqCWRvbmUgPSBlYWNocmVzdWx0KHJlc3AsIHJhZGRyKQorICoJCWJvb2xfdCBkb25lOworICoJCWNhZGRyX3QgcmVzcDsKKyAqCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gcmFkZHI7CisgKgkJd2hlcmUgcmVzcCBwb2ludHMgdG8gdGhlIHJlc3VsdHMgb2YgdGhlIGNhbGwgYW5kIHJhZGRyIGlzIHRoZQorICoJCWFkZHJlc3MgaWYgdGhlIHJlc3BvbmRlciB0byB0aGUgYnJvYWRjYXN0LgorICovCisKK2V4dGVybiBib29sX3QgcG1hcF9zZXQgKF9fY29uc3QgdV9sb25nIF9fcHJvZ3JhbSwgX19jb25zdCB1X2xvbmcgX192ZXJzLAorCQkJaW50IF9fcHJvdG9jb2wsIHVfc2hvcnQgX19wb3J0KSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCBwbWFwX3Vuc2V0IChfX2NvbnN0IHVfbG9uZyBfX3Byb2dyYW0sIF9fY29uc3QgdV9sb25nIF9fdmVycykKKyAgICAgX19USFJPVzsKK2V4dGVybiBzdHJ1Y3QgcG1hcGxpc3QgKnBtYXBfZ2V0bWFwcyAoc3RydWN0IHNvY2thZGRyX2luICpfX2FkZHJlc3MpIF9fVEhST1c7CitleHRlcm4gZW51bSBjbG50X3N0YXQgcG1hcF9ybXRjYWxsIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKl9fYWRkciwKKwkJCQkgICAgX19jb25zdCB1X2xvbmcgX19wcm9nLAorCQkJCSAgICBfX2NvbnN0IHVfbG9uZyBfX3ZlcnMsCisJCQkJICAgIF9fY29uc3QgdV9sb25nIF9fcHJvYywKKwkJCQkgICAgeGRycHJvY190IF9feGRyYXJncywKKwkJCQkgICAgY2FkZHJfdCBfX2FyZ3NwLCB4ZHJwcm9jX3QgX194ZHJyZXMsCisJCQkJICAgIGNhZGRyX3QgX19yZXNwLCBzdHJ1Y3QgdGltZXZhbCBfX3RvdXQsCisJCQkJICAgIHVfbG9uZyAqX19wb3J0X3B0cikgX19USFJPVzsKK2V4dGVybiBlbnVtIGNsbnRfc3RhdCBjbG50X2Jyb2FkY2FzdCAoX19jb25zdCB1X2xvbmcgX19wcm9nLAorCQkJCSAgICAgIF9fY29uc3QgdV9sb25nIF9fdmVycywKKwkJCQkgICAgICBfX2NvbnN0IHVfbG9uZyBfX3Byb2MsIHhkcnByb2NfdCBfX3hhcmdzLAorCQkJCSAgICAgIGNhZGRyX3QgX19hcmdzcCwgeGRycHJvY190IF9feHJlc3VsdHMsCisJCQkJICAgICAgY2FkZHJfdCBfX3Jlc3VsdHNwLAorCQkJCSAgICAgIHJlc3VsdHByb2NfdCBfX2VhY2hyZXN1bHQpIF9fVEhST1c7CitleHRlcm4gdV9zaG9ydCBwbWFwX2dldHBvcnQgKHN0cnVjdCBzb2NrYWRkcl9pbiAqX19hZGRyZXNzLAorCQkJICAgICBfX2NvbnN0IHVfbG9uZyBfX3Byb2dyYW0sCisJCQkgICAgIF9fY29uc3QgdV9sb25nIF9fdmVyc2lvbiwgdV9pbnQgX19wcm90b2NvbCkKKyAgICAgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHJwYy9wbWFwX2NsbnQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcG1hcF9wcm90LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9wbWFwX3Byb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWZkN2NiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcG1hcF9wcm90LmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBwbWFwX3Byb3QuaAorICogUHJvdG9jb2wgZm9yIHRoZSBsb2NhbCBiaW5kZXIgc2VydmljZSwgb3IgcG1hcC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9SUENfUE1BUF9QUk9UX0gKKyNkZWZpbmUgX1JQQ19QTUFQX1BST1RfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8cnBjL3hkci5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBwcm90b2NvbDoKKyAqCisgKiBQTUFQUFJPQ19OVUxMKCkgcmV0dXJucyAoKQorICoJdGFrZXMgbm90aGluZywgcmV0dXJucyBub3RoaW5nCisgKgorICogUE1BUFBST0NfU0VUKHN0cnVjdCBwbWFwKSByZXR1cm5zIChib29sX3QpCisgKglUUlVFIGlzIHN1Y2Nlc3MsIEZBTFNFIGlzIGZhaWx1cmUuICBSZWdpc3RlcnMgdGhlIHR1cGxlCisgKglbcHJvZywgdmVycywgcHJvdCwgcG9ydF0uCisgKgorICogUE1BUFBST0NfVU5TRVQoc3RydWN0IHBtYXApIHJldHVybnMgKGJvb2xfdCkKKyAqCVRSVUUgaXMgc3VjY2VzcywgRkFMU0UgaXMgZmFpbHVyZS4gIFVuLXJlZ2lzdGVycyBwYWlyCisgKglbcHJvZywgdmVyc10uICBwcm90IGFuZCBwb3J0IGFyZSBpZ25vcmVkLgorICoKKyAqIFBNQVBQUk9DX0dFVFBPUlQoc3RydWN0IHBtYXApIHJldHVybnMgKGxvbmcgdW5zaWduZWQpLgorICoJMCBpcyBmYWlsdXJlLiAgT3RoZXJ3aXNlIHJldHVybnMgdGhlIHBvcnQgbnVtYmVyIHdoZXJlIHRoZSBwYWlyCisgKglbcHJvZywgdmVyc10gaXMgcmVnaXN0ZXJlZC4gIEl0IG1heSBsaWUhCisgKgorICogUE1BUFBST0NfRFVNUCgpIFJFVFVSTlMgKHN0cnVjdCBwbWFwbGlzdCAqKQorICoKKyAqIFBNQVBQUk9DX0NBTExJVCh1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkLCBzdHJpbmc8PikKKyAqCVJFVFVSTlMgKHBvcnQsIHN0cmluZzw+KTsKKyAqIHVzYWdlOiBlbmNhcHN1bGF0ZWRyZXN1bHRzID0gUE1BUFBST0NfQ0FMTElUKHByb2csIHZlcnMsIHByb2MsIGVuY2Fwc3VsYXRlZGFyZ3MpOworICoJQ2FsbHMgdGhlIHByb2NlZHVyZSBvbiB0aGUgbG9jYWwgbWFjaGluZS4gIElmIGl0IGlzIG5vdCByZWdpc3RlcmVkLAorICoJdGhpcyBwcm9jZWR1cmUgaXMgcXVpdGU7IGllIGl0IGRvZXMgbm90IHJldHVybiBlcnJvciBpbmZvcm1hdGlvbiEhIQorICoJVGhpcyBwcm9jZWR1cmUgb25seSBpcyBzdXBwb3J0ZWQgb24gcnBjL3VkcCBhbmQgY2FsbHMgdmlhCisgKglycGMvdWRwLiAgVGhpcyByb3V0aW5lIG9ubHkgcGFzc2VzIG51bGwgYXV0aGVudGljYXRpb24gcGFyYW1ldGVycy4KKyAqCVRoaXMgZmlsZSBoYXMgbm8gaW50ZXJmYWNlIHRvIHhkciByb3V0aW5lcyBmb3IgUE1BUFBST0NfQ0FMTElULgorICoKKyAqIFRoZSBzZXJ2aWNlIHN1cHBvcnRzIHJlbW90ZSBwcm9jZWR1cmUgY2FsbHMgb24gdWRwL2lwIG9yIHRjcC9pcCBzb2NrZXQgMTExLgorICovCisKKyNkZWZpbmUgUE1BUFBPUlQJCSgodV9zaG9ydCkxMTEpCisjZGVmaW5lIFBNQVBQUk9HCQkoKHVfbG9uZykxMDAwMDApCisjZGVmaW5lIFBNQVBWRVJTCQkoKHVfbG9uZykyKQorI2RlZmluZSBQTUFQVkVSU19QUk9UTwkJKCh1X2xvbmcpMikKKyNkZWZpbmUgUE1BUFZFUlNfT1JJRwkJKCh1X2xvbmcpMSkKKyNkZWZpbmUgUE1BUFBST0NfTlVMTAkJKCh1X2xvbmcpMCkKKyNkZWZpbmUgUE1BUFBST0NfU0VUCQkoKHVfbG9uZykxKQorI2RlZmluZSBQTUFQUFJPQ19VTlNFVAkJKCh1X2xvbmcpMikKKyNkZWZpbmUgUE1BUFBST0NfR0VUUE9SVAkoKHVfbG9uZykzKQorI2RlZmluZSBQTUFQUFJPQ19EVU1QCQkoKHVfbG9uZyk0KQorI2RlZmluZSBQTUFQUFJPQ19DQUxMSVQJCSgodV9sb25nKTUpCisKK3N0cnVjdCBwbWFwIHsKKwlsb25nIHVuc2lnbmVkIHBtX3Byb2c7CisJbG9uZyB1bnNpZ25lZCBwbV92ZXJzOworCWxvbmcgdW5zaWduZWQgcG1fcHJvdDsKKwlsb25nIHVuc2lnbmVkIHBtX3BvcnQ7Cit9OworCitleHRlcm4gYm9vbF90IHhkcl9wbWFwIChYRFIgKl9feGRycywgc3RydWN0IHBtYXAgKl9fcmVncykgX19USFJPVzsKKworc3RydWN0IHBtYXBsaXN0IHsKKwlzdHJ1Y3QgcG1hcAlwbWxfbWFwOworCXN0cnVjdCBwbWFwbGlzdCAqcG1sX25leHQ7Cit9OworCitleHRlcm4gYm9vbF90IHhkcl9wbWFwbGlzdCAoWERSICpfX3hkcnMsIHN0cnVjdCBwbWFwbGlzdCAqKl9fcnApIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBycGMvcG1hcF9wcm90LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3BtYXBfcm10LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9wbWFwX3JtdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NjgwMTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9wbWFwX3JtdC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBTdHJ1Y3R1cmVzIGFuZCBYRFIgcm91dGluZXMgZm9yIHBhcmFtZXRlcnMgdG8gYW5kIHJlcGxpZXMgZnJvbQorICogdGhlIHBvcnRtYXBwZXIgcmVtb3RlLWNhbGwtc2VydmljZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9SUENfUE1BUF9STVRfSAorI2RlZmluZSBfUlBDX1BNQVBfUk1UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxycGMvdHlwZXMuaD4KKyNpbmNsdWRlIDxycGMveGRyLmg+CisKK19fQkVHSU5fREVDTFMKKworc3RydWN0IHJtdGNhbGxhcmdzIHsKKwl1X2xvbmcgcHJvZywgdmVycywgcHJvYywgYXJnbGVuOworCWNhZGRyX3QgYXJnc19wdHI7CisJeGRycHJvY190IHhkcl9hcmdzOworfTsKKworZXh0ZXJuIGJvb2xfdCB4ZHJfcm10Y2FsbF9hcmdzIChYRFIgKl9feGRycywgc3RydWN0IHJtdGNhbGxhcmdzICpfX2NycCkKKyAgICAgX19USFJPVzsKKworc3RydWN0IHJtdGNhbGxyZXMgeworCXVfbG9uZyAqcG9ydF9wdHI7CisJdV9sb25nIHJlc3VsdHNsZW47CisJY2FkZHJfdCByZXN1bHRzX3B0cjsKKwl4ZHJwcm9jX3QgeGRyX3Jlc3VsdHM7Cit9OworCitleHRlcm4gYm9vbF90IHhkcl9ybXRjYWxscmVzIChYRFIgKl9feGRycywgc3RydWN0IHJtdGNhbGxyZXMgKl9fY3JwKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL3BtYXBfcm10LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3JwYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcnBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTczYTRlMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3JwYy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBycGMuaCwgSnVzdCBpbmNsdWRlcyB0aGUgYmlsbGlvbnMgb2YgcnBjIGhlYWRlciBmaWxlcyBuZWNlc3NhcnkgdG8KKyAqIGRvIHJlbW90ZSBwcm9jZWR1cmUgY2FsbGluZy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9SUENfUlBDX0gKKyNkZWZpbmUgX1JQQ19SUENfSCAxCisKKyNpbmNsdWRlIDxycGMvdHlwZXMuaD4JCS8qIHNvbWUgdHlwZWRlZnMgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKy8qIGV4dGVybmFsIGRhdGEgcmVwcmVzZW50YXRpb24gaW50ZXJmYWNlcyAqLworI2luY2x1ZGUgPHJwYy94ZHIuaD4JCS8qIGdlbmVyaWMgKGRlKXNlcmlhbGl6ZXIgKi8KKworLyogQ2xpZW50IHNpZGUgb25seSBhdXRoZW50aWNhdGlvbiAqLworI2luY2x1ZGUgPHJwYy9hdXRoLmg+CQkvKiBnZW5lcmljIGF1dGhlbnRpY2F0b3IgKGNsaWVudCBzaWRlKSAqLworCisvKiBDbGllbnQgc2lkZSAobW9zdGx5KSByZW1vdGUgcHJvY2VkdXJlIGNhbGwgKi8KKyNpbmNsdWRlIDxycGMvY2xudC5oPgkJLyogZ2VuZXJpYyBycGMgc3R1ZmYgKi8KKworLyogc2VtaS1wcml2YXRlIHByb3RvY29sIGhlYWRlcnMgKi8KKyNpbmNsdWRlIDxycGMvcnBjX21zZy5oPgkvKiBwcm90b2NvbCBmb3IgcnBjIG1lc3NhZ2VzICovCisjaW5jbHVkZSA8cnBjL2F1dGhfdW5peC5oPgkvKiBwcm90b2NvbCBmb3IgdW5peCBzdHlsZSBjcmVkICovCisjaW5jbHVkZSA8cnBjL2F1dGhfZGVzLmg+CS8qIHByb3RvY29sIGZvciBkZXMgc3R5bGUgY3JlZCAqLworCisvKiBTZXJ2ZXIgc2lkZSBvbmx5IHJlbW90ZSBwcm9jZWR1cmUgY2FsbGVlICovCisjaW5jbHVkZSA8cnBjL3N2Yy5oPgkJLyogc2VydmljZSBtYW5hZ2VyIGFuZCBtdWx0aXBsZXhlciAqLworI2luY2x1ZGUgPHJwYy9zdmNfYXV0aC5oPgkvKiBzZXJ2aWNlIHNpZGUgYXV0aGVudGljYXRvciAqLworCisvKgorICogQ09NTUVOVCBPVVQgVEhFIE5FWFQgSU5DTFVERSBJRiBSVU5OSU5HIE9OIFNVTiBPUyBPUiBPTiBBIFZFUlNJT04KKyAqIE9GIFVOSVggQkFTRUQgT04gTkZTU1JDLiAgVGhlc2Ugc3lzdGVtcyB3aWxsIGFscmVhZHkgaGF2ZSB0aGUgc3RydWN0dXJlcworICogZGVmaW5lZCBieSA8cnBjL25ldGRiLmg+IGluY2x1ZGVkIGluIDxuZXRkYi5oPi4KKyAqLworLyogcm91dGluZXMgZm9yIHBhcnNpbmcgL2V0Yy9ycGMgKi8KKyNpbmNsdWRlIDxycGMvbmV0ZGIuaD4JCS8qIHN0cnVjdHVyZXMgYW5kIHJvdXRpbmVzIHRvIHBhcnNlIC9ldGMvcnBjICovCisKK19fQkVHSU5fREVDTFMKKworLyogR2xvYmFsIHZhcmlhYmxlcywgcHJvdGVjdGVkIGZvciBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLworZXh0ZXJuIGZkX3NldCAqX19ycGNfdGhyZWFkX3N2Y19mZHNldCAodm9pZCkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworI2RlZmluZSBzdmNfZmRzZXQgKCpfX3JwY190aHJlYWRfc3ZjX2Zkc2V0ICgpKQorCitleHRlcm4gc3RydWN0IHJwY19jcmVhdGVlcnIgKl9fcnBjX3RocmVhZF9jcmVhdGVlcnIgKHZvaWQpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKyNkZWZpbmUgZ2V0X3JwY19jcmVhdGVlcnIoKSAoKl9fcnBjX3RocmVhZF9jcmVhdGVlcnIgKCkpCisvKiBUaGUgcGVvcGxlIHdobyAiZW5naW5lZXJlZCIgUlBDIHNob3VsZCBiZWUgcHVuaXNoZWQgZm9yIG5hbWluZyB0aGUKKyAgIGRhdGEgc3RydWN0dXJlIGFuZCB0aGUgdmFyaWFibGUgdGhlIHNhbWUuICBXZSBjYW5ub3QgYWx3YXlzIGRlZmluZSB0aGUKKyAgIG1hY3JvICdycGNfY3JlYXRlZXJyJyBiZWNhdXNlIHRoaXMgd291bGQgcHJldmVudCBwZW9wbGUgZnJvbSBkZWZpbmluZworICAgb2JqZWN0IG9mIHR5cGUgJ3N0cnVjdCBycGNfY3JlYXRlZXJyJy4gIFNvIHdlIGxlYXZlIGl0IHVwIHRvIHRoZSB1c2VyCisgICB0byBzZWxlY3QgdHJhbnNwYXJlbnQgcmVwbGFjZW1lbnQgYWxzbyBvZiB0aGlzIHZhcmlhYmxlLiAgKi8KKyNpZmRlZiBfUlBDX01UX1ZBUlMKKyMgZGVmaW5lIHJwY19jcmVhdGVlcnIgKCpfX3JwY190aHJlYWRfY3JlYXRlZXJyICgpKQorI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QgcG9sbGZkICoqX19ycGNfdGhyZWFkX3N2Y19wb2xsZmQgKHZvaWQpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKyNkZWZpbmUgc3ZjX3BvbGxmZCAoKl9fcnBjX3RocmVhZF9zdmNfcG9sbGZkICgpKQorCitleHRlcm4gaW50ICpfX3JwY190aHJlYWRfc3ZjX21heF9wb2xsZmQgKHZvaWQpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKyNkZWZpbmUgc3ZjX21heF9wb2xsZmQgKCpfX3JwY190aHJlYWRfc3ZjX21heF9wb2xsZmQgKCkpCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBycGMvcnBjLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3JwY19kZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3JwY19kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjNjNDI2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcnBjX2Rlcy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBHZW5lcmljIERFUyBkcml2ZXIgaW50ZXJmYWNlCisgKiBLZWVwIHRoaXMgZmlsZSBoYXJkd2FyZSBpbmRlcGVuZGVudCEKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0RFU19ICisjZGVmaW5lIF9ERVNfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNkZWZpbmUgREVTX01BWExFTgk2NTUzNgkvKiBtYXhpbXVtICMgb2YgYnl0ZXMgdG8gZW5jcnlwdCAgKi8KKyNkZWZpbmUgREVTX1FVSUNLTEVOCTE2CS8qIG1heGltdW0gIyBvZiBieXRlcyB0byBlbmNyeXB0IHF1aWNrbHkgKi8KKworZW51bSBkZXNkaXIKKyAgeworICAgIEVOQ1JZUFQsIERFQ1JZUFQKKyAgfTsKK2VudW0gZGVzbW9kZQorICB7CisgICAgQ0JDLCBFQ0IKKyAgfTsKKworLyoKKyAqIHBhcmFtZXRlcnMgdG8gaW9jdGwgY2FsbAorICovCitzdHJ1Y3QgZGVzcGFyYW1zCisgIHsKKyAgICB1X2NoYXIgZGVzX2tleVs4XTsJCS8qIGtleSAod2l0aCBsb3cgYml0IHBhcml0eSkgKi8KKyAgICBlbnVtIGRlc2RpciBkZXNfZGlyOwkvKiBkaXJlY3Rpb24gKi8KKyAgICBlbnVtIGRlc21vZGUgZGVzX21vZGU7CS8qIG1vZGUgKi8KKyAgICB1X2NoYXIgZGVzX2l2ZWNbOF07CQkvKiBpbnB1dCB2ZWN0b3IgKi8KKyAgICB1bnNpZ25lZCBkZXNfbGVuOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGNyeXB0ICovCisgICAgdW5pb24KKyAgICAgIHsKKwl1X2NoYXIgVURFU19kYXRhW0RFU19RVUlDS0xFTl07CisJdV9jaGFyICpVREVTX2J1ZjsKKyAgICAgIH0KKyAgICBVREVTOworI2RlZmluZSBkZXNfZGF0YSBVREVTLlVERVNfZGF0YQkvKiBkaXJlY3QgZGF0YSBoZXJlIGlmIHF1aWNrICovCisjZGVmaW5lIGRlc19idWYJVURFUy5VREVTX2J1ZgkvKiBvdGhlcndpc2UsIHBvaW50ZXIgdG8gZGF0YSAqLworICB9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3JwY19tc2cuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3JwY19tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzNiMTg3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcnBjX21zZy5oCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogcnBjX21zZy5oCisgKiBycGMgbWVzc2FnZSBkZWZpbml0aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfUlBDX01TR19ICisjZGVmaW5lIF9SUENfTVNHX0ggMQorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKKyNpbmNsdWRlIDxycGMveGRyLmg+CisjaW5jbHVkZSA8cnBjL2NsbnQuaD4KKworI2RlZmluZSBSUENfTVNHX1ZFUlNJT04JCSgodV9sb25nKSAyKQorI2RlZmluZSBSUENfU0VSVklDRV9QT1JUCSgodV9zaG9ydCkgMjA0OCkKKworX19CRUdJTl9ERUNMUworCisvKgorICogQm90dG9tIHVwIGRlZmluaXRpb24gb2YgYW4gcnBjIG1lc3NhZ2UuCisgKiBOT1RFOiBjYWxsIGFuZCByZXBseSB1c2UgdGhlIHNhbWUgb3ZlcmFsbCBzdHJ1Y3QgYnV0CisgKiBkaWZmZXJlbnQgcGFydHMgb2YgdW5pb25zIHdpdGhpbiBpdC4KKyAqLworCitlbnVtIG1zZ190eXBlIHsKKwlDQUxMPTAsCisJUkVQTFk9MQorfTsKKworZW51bSByZXBseV9zdGF0IHsKKwlNU0dfQUNDRVBURUQ9MCwKKwlNU0dfREVOSUVEPTEKK307CisKK2VudW0gYWNjZXB0X3N0YXQgeworCVNVQ0NFU1M9MCwKKwlQUk9HX1VOQVZBSUw9MSwKKwlQUk9HX01JU01BVENIPTIsCisJUFJPQ19VTkFWQUlMPTMsCisJR0FSQkFHRV9BUkdTPTQsCisJU1lTVEVNX0VSUj01Cit9OworCitlbnVtIHJlamVjdF9zdGF0IHsKKwlSUENfTUlTTUFUQ0g9MCwKKwlBVVRIX0VSUk9SPTEKK307CisKKy8qCisgKiBSZXBseSBwYXJ0IG9mIGFuIHJwYyBleGNoYW5nZQorICovCisKKy8qCisgKiBSZXBseSB0byBhbiBycGMgcmVxdWVzdCB0aGF0IHdhcyBhY2NlcHRlZCBieSB0aGUgc2VydmVyLgorICogTm90ZTogdGhlcmUgY291bGQgYmUgYW4gZXJyb3IgZXZlbiB0aG91Z2ggdGhlIHJlcXVlc3Qgd2FzCisgKiBhY2NlcHRlZC4KKyAqLworc3RydWN0IGFjY2VwdGVkX3JlcGx5IHsKKwlzdHJ1Y3Qgb3BhcXVlX2F1dGgJYXJfdmVyZjsKKwllbnVtIGFjY2VwdF9zdGF0CWFyX3N0YXQ7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9sb25nCWxvdzsKKwkJCXVfbG9uZwloaWdoOworCQl9IEFSX3ZlcnNpb25zOworCQlzdHJ1Y3QgeworCQkJY2FkZHJfdAl3aGVyZTsKKwkJCXhkcnByb2NfdCBwcm9jOworCQl9IEFSX3Jlc3VsdHM7CisJCS8qIGFuZCBtYW55IG90aGVyIG51bGwgY2FzZXMgKi8KKwl9IHJ1OworI2RlZmluZQlhcl9yZXN1bHRzCXJ1LkFSX3Jlc3VsdHMKKyNkZWZpbmUJYXJfdmVycwkJcnUuQVJfdmVyc2lvbnMKK307CisKKy8qCisgKiBSZXBseSB0byBhbiBycGMgcmVxdWVzdCB0aGF0IHdhcyByZWplY3RlZCBieSB0aGUgc2VydmVyLgorICovCitzdHJ1Y3QgcmVqZWN0ZWRfcmVwbHkgeworCWVudW0gcmVqZWN0X3N0YXQgcmpfc3RhdDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1X2xvbmcgbG93OworCQkJdV9sb25nIGhpZ2g7CisJCX0gUkpfdmVyc2lvbnM7CisJCWVudW0gYXV0aF9zdGF0IFJKX3doeTsgIC8qIHdoeSBhdXRoZW50aWNhdGlvbiBkaWQgbm90IHdvcmsgKi8KKwl9IHJ1OworI2RlZmluZQlyal92ZXJzCXJ1LlJKX3ZlcnNpb25zCisjZGVmaW5lCXJqX3doeQlydS5SSl93aHkKK307CisKKy8qCisgKiBCb2R5IG9mIGEgcmVwbHkgdG8gYW4gcnBjIHJlcXVlc3QuCisgKi8KK3N0cnVjdCByZXBseV9ib2R5IHsKKwllbnVtIHJlcGx5X3N0YXQgcnBfc3RhdDsKKwl1bmlvbiB7CisJCXN0cnVjdCBhY2NlcHRlZF9yZXBseSBSUF9hcjsKKwkJc3RydWN0IHJlamVjdGVkX3JlcGx5IFJQX2RyOworCX0gcnU7CisjZGVmaW5lCXJwX2FjcHQJcnUuUlBfYXIKKyNkZWZpbmUJcnBfcmpjdAlydS5SUF9kcgorfTsKKworLyoKKyAqIEJvZHkgb2YgYW4gcnBjIHJlcXVlc3QgY2FsbC4KKyAqLworc3RydWN0IGNhbGxfYm9keSB7CisJdV9sb25nIGNiX3JwY3ZlcnM7CS8qIG11c3QgYmUgZXF1YWwgdG8gdHdvICovCisJdV9sb25nIGNiX3Byb2c7CisJdV9sb25nIGNiX3ZlcnM7CisJdV9sb25nIGNiX3Byb2M7CisJc3RydWN0IG9wYXF1ZV9hdXRoIGNiX2NyZWQ7CisJc3RydWN0IG9wYXF1ZV9hdXRoIGNiX3ZlcmY7IC8qIHByb3RvY29sIHNwZWNpZmljIC0gcHJvdmlkZWQgYnkgY2xpZW50ICovCit9OworCisvKgorICogVGhlIHJwYyBtZXNzYWdlCisgKi8KK3N0cnVjdCBycGNfbXNnIHsKKwl1X2xvbmcJCQlybV94aWQ7CisJZW51bSBtc2dfdHlwZQkJcm1fZGlyZWN0aW9uOworCXVuaW9uIHsKKwkJc3RydWN0IGNhbGxfYm9keSBSTV9jbWI7CisJCXN0cnVjdCByZXBseV9ib2R5IFJNX3JtYjsKKwl9IHJ1OworI2RlZmluZQlybV9jYWxsCQlydS5STV9jbWIKKyNkZWZpbmUJcm1fcmVwbHkJcnUuUk1fcm1iCit9OworI2RlZmluZQlhY3B0ZWRfcnBseQlydS5STV9ybWIucnUuUlBfYXIKKyNkZWZpbmUJcmpjdGVkX3JwbHkJcnUuUk1fcm1iLnJ1LlJQX2RyCisKKworLyoKKyAqIFhEUiByb3V0aW5lIHRvIGhhbmRsZSBhIHJwYyBtZXNzYWdlLgorICogeGRyX2NhbGxtc2coeGRycywgY21zZykKKyAqIAlYRFIgKnhkcnM7CisgKiAJc3RydWN0IHJwY19tc2cgKmNtc2c7CisgKi8KK2V4dGVybiBib29sX3QJeGRyX2NhbGxtc2cgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgcnBjX21zZyAqX19jbXNnKSBfX1RIUk9XOworCisvKgorICogWERSIHJvdXRpbmUgdG8gcHJlLXNlcmlhbGl6ZSB0aGUgc3RhdGljIHBhcnQgb2YgYSBycGMgbWVzc2FnZS4KKyAqIHhkcl9jYWxsaGRyKHhkcnMsIGNtc2cpCisgKiAJWERSICp4ZHJzOworICogCXN0cnVjdCBycGNfbXNnICpjbXNnOworICovCitleHRlcm4gYm9vbF90CXhkcl9jYWxsaGRyIChYRFIgKl9feGRycywgc3RydWN0IHJwY19tc2cgKl9fY21zZykgX19USFJPVzsKKworLyoKKyAqIFhEUiByb3V0aW5lIHRvIGhhbmRsZSBhIHJwYyByZXBseS4KKyAqIHhkcl9yZXBseW1zZyh4ZHJzLCBybXNnKQorICogCVhEUiAqeGRyczsKKyAqIAlzdHJ1Y3QgcnBjX21zZyAqcm1zZzsKKyAqLworZXh0ZXJuIGJvb2xfdAl4ZHJfcmVwbHltc2cgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgcnBjX21zZyAqX19ybXNnKSBfX1RIUk9XOworCisvKgorICogRmlsbHMgaW4gdGhlIGVycm9yIHBhcnQgb2YgYSByZXBseSBtZXNzYWdlLgorICogX3NldGVycl9yZXBseShtc2csIGVycm9yKQorICogCXN0cnVjdCBycGNfbXNnICptc2c7CisgKiAJc3RydWN0IHJwY19lcnIgKmVycm9yOworICovCitleHRlcm4gdm9pZAlfc2V0ZXJyX3JlcGx5IChzdHJ1Y3QgcnBjX21zZyAqX19tc2csIHN0cnVjdCBycGNfZXJyICpfX2Vycm9yKQorICAgICBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL3JwY19tc2cuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvc3ZjLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9zdmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGQxYWMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvc3ZjLmgKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBzdmMuaCwgU2VydmVyLXNpZGUgcmVtb3RlIHByb2NlZHVyZSBjYWxsIGludGVyZmFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9SUENfU1ZDX0gKKyNkZWZpbmUgX1JQQ19TVkNfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHJwYy9ycGNfbXNnLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIFRoaXMgaW50ZXJmYWNlIG11c3QgbWFuYWdlIHR3byBpdGVtcyBjb25jZXJuaW5nIHJlbW90ZSBwcm9jZWR1cmUgY2FsbGluZzoKKyAqCisgKiAxKSBBbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHRyYW5zcG9ydCBjb25uZWN0aW9ucyB1cG9uIHdoaWNoIHJwYyByZXF1ZXN0cworICogYXJlIHJlY2VpdmVkLiAgVGhlIHR3byBtb3N0IG5vdGFibGUgdHJhbnNwb3J0cyBhcmUgVENQIGFuZCBVRFA7ICB0aGV5IGFyZQorICogY3JlYXRlZCBhbmQgcmVnaXN0ZXJlZCBieSByb3V0aW5lcyBpbiBzdmNfdGNwLmMgYW5kIHN2Y191ZHAuYywgcmVzcGVjdGl2ZWx5OworICogdGhleSBpbiB0dXJuIGNhbGwgeHBydF9yZWdpc3RlciBhbmQgeHBydF91bnJlZ2lzdGVyLgorICoKKyAqIDIpIEFuIGFyYml0cmFyeSBudW1iZXIgb2YgbG9jYWxseSByZWdpc3RlcmVkIHNlcnZpY2VzLiAgU2VydmljZXMgYXJlCisgKiBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBmb3VyIGRhdGE6IHByb2dyYW0gbnVtYmVyLCB2ZXJzaW9uIG51bWJlciwKKyAqICJzZXJ2aWNlIGRpc3BhdGNoIiBmdW5jdGlvbiwgYSB0cmFuc3BvcnQgaGFuZGxlLCBhbmQgYSBib29sZWFuIHRoYXQKKyAqIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgZXhwb3J0ZWQgcHJvZ3JhbSBzaG91bGQgYmUgcmVnaXN0ZXJlZCB3aXRoIGEKKyAqIGxvY2FsIGJpbmRlciBzZXJ2aWNlOyAgaWYgdHJ1ZSB0aGUgcHJvZ3JhbSdzIG51bWJlciBhbmQgdmVyc2lvbiBhbmQgdGhlCisgKiBwb3J0IG51bWJlciBmcm9tIHRoZSB0cmFuc3BvcnQgaGFuZGxlIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIGJpbmRlci4KKyAqIFRoZXNlIGRhdGEgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcnBjIHN2YyBzeXN0ZW0gdmlhIHN2Y19yZWdpc3Rlci4KKyAqCisgKiBBIHNlcnZpY2UncyBkaXNwYXRjaCBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gcnBjIHJlcXVlc3QgY29tZXMgaW4KKyAqIG9uIGEgdHJhbnNwb3J0LiAgVGhlIHJlcXVlc3QncyBwcm9ncmFtIGFuZCB2ZXJzaW9uIG51bWJlcnMgbXVzdCBtYXRjaAorICogdGhvc2Ugb2YgdGhlIHJlZ2lzdGVyZWQgc2VydmljZS4gIFRoZSBkaXNwYXRjaCBmdW5jdGlvbiBpcyBwYXNzZWQgdHdvCisgKiBwYXJhbWV0ZXJzLCBzdHJ1Y3Qgc3ZjX3JlcSAqIGFuZCBTVkNYUFJUICosIGRlZmluZWQgYmVsb3cuCisgKi8KKworZW51bSB4cHJ0X3N0YXQgeworCVhQUlRfRElFRCwKKwlYUFJUX01PUkVSRVFTLAorCVhQUlRfSURMRQorfTsKKworLyoKKyAqIFNlcnZlciBzaWRlIHRyYW5zcG9ydCBoYW5kbGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgU1ZDWFBSVCBTVkNYUFJUOworc3RydWN0IFNWQ1hQUlQgeworICBpbnQgeHBfc29jazsKKyAgdV9zaG9ydCB4cF9wb3J0OwkJLyogYXNzb2NpYXRlZCBwb3J0IG51bWJlciAqLworICBjb25zdCBzdHJ1Y3QgeHBfb3BzIHsKKyAgICBib29sX3QJKCp4cF9yZWN2KSAoU1ZDWFBSVCAqX194cHJ0LCBzdHJ1Y3QgcnBjX21zZyAqX19tc2cpOworCQkJCS8qIHJlY2VpdmUgaW5jb21pbmcgcmVxdWVzdHMgKi8KKyAgICBlbnVtIHhwcnRfc3RhdCAoKnhwX3N0YXQpIChTVkNYUFJUICpfX3hwcnQpOworCQkJCS8qIGdldCB0cmFuc3BvcnQgc3RhdHVzICovCisgICAgYm9vbF90CSgqeHBfZ2V0YXJncykgKFNWQ1hQUlQgKl9feHBydCwgeGRycHJvY190IF9feGRyX2FyZ3MsCisJCQkgICAgICAgY2FkZHJfdCBfX2FyZ3NfcHRyKTsgLyogZ2V0IGFyZ3VtZW50cyAqLworICAgIGJvb2xfdAkoKnhwX3JlcGx5KSAoU1ZDWFBSVCAqX194cHJ0LCBzdHJ1Y3QgcnBjX21zZyAqX19tc2cpOworCQkJCS8qIHNlbmQgcmVwbHkgKi8KKyAgICBib29sX3QJKCp4cF9mcmVlYXJncykgKFNWQ1hQUlQgKl9feHBydCwgeGRycHJvY190IF9feGRyX2FyZ3MsCisJCQkJY2FkZHJfdCBfX2FyZ3NfcHRyKTsKKwkJCQkvKiBmcmVlIG1lbSBhbGxvY2F0ZWQgZm9yIGFyZ3MgKi8KKyAgICB2b2lkCSgqeHBfZGVzdHJveSkgKFNWQ1hQUlQgKl9feHBydCk7CisJCQkJLyogZGVzdHJveSB0aGlzIHN0cnVjdCAqLworICB9ICp4cF9vcHM7CisgIGludAkJeHBfYWRkcmxlbjsJIC8qIGxlbmd0aCBvZiByZW1vdGUgYWRkcmVzcyAqLworICBzdHJ1Y3Qgc29ja2FkZHJfaW4geHBfcmFkZHI7CSAvKiByZW1vdGUgYWRkcmVzcyAqLworICBzdHJ1Y3Qgb3BhcXVlX2F1dGggeHBfdmVyZjsJIC8qIHJhdyByZXNwb25zZSB2ZXJpZmllciAqLworICBjYWRkcl90CQl4cF9wMTsJCSAvKiBwcml2YXRlICovCisgIGNhZGRyX3QJCXhwX3AyOwkJIC8qIHByaXZhdGUgKi8KKyAgY2hhcgkJeHBfcGFkIFsyNTZdOwkvKiBwYWRkaW5nLCBpbnRlcm5hbCB1c2UgKi8KK307CisKKy8qCisgKiAgQXBwcm92ZWQgd2F5IG9mIGdldHRpbmcgYWRkcmVzcyBvZiBjYWxsZXIKKyAqLworI2RlZmluZSBzdmNfZ2V0Y2FsbGVyKHgpICgmKHgpLT54cF9yYWRkcikKKworLyoKKyAqIE9wZXJhdGlvbnMgZGVmaW5lZCBvbiBhbiBTVkNYUFJUIGhhbmRsZQorICoKKyAqIFNWQ1hQUlQJCSp4cHJ0OworICogc3RydWN0IHJwY19tc2cJKm1zZzsKKyAqIHhkcnByb2NfdAkJIHhhcmdzOworICogY2FkZHJfdAkJIGFyZ3NwOworICovCisjZGVmaW5lIFNWQ19SRUNWKHhwcnQsIG1zZykJCQkJXAorCSgqKHhwcnQpLT54cF9vcHMtPnhwX3JlY3YpKCh4cHJ0KSwgKG1zZykpCisjZGVmaW5lIHN2Y19yZWN2KHhwcnQsIG1zZykJCQkJXAorCSgqKHhwcnQpLT54cF9vcHMtPnhwX3JlY3YpKCh4cHJ0KSwgKG1zZykpCisKKyNkZWZpbmUgU1ZDX1NUQVQoeHBydCkJCQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9zdGF0KSh4cHJ0KQorI2RlZmluZSBzdmNfc3RhdCh4cHJ0KQkJCQkJXAorCSgqKHhwcnQpLT54cF9vcHMtPnhwX3N0YXQpKHhwcnQpCisKKyNkZWZpbmUgU1ZDX0dFVEFSR1MoeHBydCwgeGFyZ3MsIGFyZ3NwKQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9nZXRhcmdzKSgoeHBydCksICh4YXJncyksIChhcmdzcCkpCisjZGVmaW5lIHN2Y19nZXRhcmdzKHhwcnQsIHhhcmdzLCBhcmdzcCkJCQlcCisJKCooeHBydCktPnhwX29wcy0+eHBfZ2V0YXJncykoKHhwcnQpLCAoeGFyZ3MpLCAoYXJnc3ApKQorCisjZGVmaW5lIFNWQ19SRVBMWSh4cHJ0LCBtc2cpCQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9yZXBseSkgKCh4cHJ0KSwgKG1zZykpCisjZGVmaW5lIHN2Y19yZXBseSh4cHJ0LCBtc2cpCQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9yZXBseSkgKCh4cHJ0KSwgKG1zZykpCisKKyNkZWZpbmUgU1ZDX0ZSRUVBUkdTKHhwcnQsIHhhcmdzLCBhcmdzcCkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9mcmVlYXJncykoKHhwcnQpLCAoeGFyZ3MpLCAoYXJnc3ApKQorI2RlZmluZSBzdmNfZnJlZWFyZ3MoeHBydCwgeGFyZ3MsIGFyZ3NwKQkJXAorCSgqKHhwcnQpLT54cF9vcHMtPnhwX2ZyZWVhcmdzKSgoeHBydCksICh4YXJncyksIChhcmdzcCkpCisKKyNkZWZpbmUgU1ZDX0RFU1RST1koeHBydCkJCQkJXAorCSgqKHhwcnQpLT54cF9vcHMtPnhwX2Rlc3Ryb3kpKHhwcnQpCisjZGVmaW5lIHN2Y19kZXN0cm95KHhwcnQpCQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9kZXN0cm95KSh4cHJ0KQorCisKKy8qCisgKiBTZXJ2aWNlIHJlcXVlc3QKKyAqLworc3RydWN0IHN2Y19yZXEgeworICBycGNwcm9nX3QgcnFfcHJvZzsgICAgICAgICAgICAvKiBzZXJ2aWNlIHByb2dyYW0gbnVtYmVyICovCisgIHJwY3ZlcnNfdCBycV92ZXJzOyAgICAgICAgICAgIC8qIHNlcnZpY2UgcHJvdG9jb2wgdmVyc2lvbiAqLworICBycGNwcm9jX3QgcnFfcHJvYzsgICAgICAgICAgICAvKiB0aGUgZGVzaXJlZCBwcm9jZWR1cmUgKi8KKyAgc3RydWN0IG9wYXF1ZV9hdXRoIHJxX2NyZWQ7ICAgLyogcmF3IGNyZWRzIGZyb20gdGhlIHdpcmUgKi8KKyAgY2FkZHJfdCBycV9jbG50Y3JlZDsgICAgICAgICAgLyogcmVhZCBvbmx5IGNvb2tlZCBjcmVkICovCisgIFNWQ1hQUlQgKnJxX3hwcnQ7ICAgICAgICAgICAgIC8qIGFzc29jaWF0ZWQgdHJhbnNwb3J0ICovCit9OworCisjaWZuZGVmIF9fRElTUEFUQ0hfRk5fVAorI2RlZmluZSBfX0RJU1BBVENIX0ZOX1QKK3R5cGVkZWYgdm9pZCAoKl9fZGlzcGF0Y2hfZm5fdCkgKHN0cnVjdCBzdmNfcmVxKiwgU1ZDWFBSVCopOworI2VuZGlmCisKKy8qCisgKiBTZXJ2aWNlIHJlZ2lzdHJhdGlvbgorICoKKyAqIHN2Y19yZWdpc3Rlcih4cHJ0LCBwcm9nLCB2ZXJzLCBkaXNwYXRjaCwgcHJvdG9jb2wpCisgKglTVkNYUFJUICp4cHJ0OworICoJcnBjcHJvZ190IHByb2c7CisgKglycGN2ZXJzX3QgdmVyczsKKyAqCXZvaWQgKCpkaXNwYXRjaCkoc3RydWN0IHN2Y19yZXEqLCBTVkNYUFJUKik7CisgKglycGNwcm90X3QgcHJvdG9jb2w7ICBsaWtlIFRDUCBvciBVRFAsIHplcm8gbWVhbnMgZG8gbm90IHJlZ2lzdGVyCisgKi8KK2V4dGVybiBib29sX3Qgc3ZjX3JlZ2lzdGVyIChTVkNYUFJUICpfX3hwcnQsIHJwY3Byb2dfdCBfX3Byb2csCisJCQkgICAgcnBjdmVyc190IF9fdmVycywgX19kaXNwYXRjaF9mbl90IF9fZGlzcGF0Y2gsCisJCQkgICAgcnBjcHJvdF90IF9fcHJvdG9jb2wpIF9fVEhST1c7CisKKy8qCisgKiBTZXJ2aWNlIHVuLXJlZ2lzdHJhdGlvbgorICoKKyAqIHN2Y191bnJlZ2lzdGVyKHByb2csIHZlcnMpCisgKglycGNwcm9nX3QgcHJvZzsKKyAqCXJwY3ZlcnNfdCB2ZXJzOworICovCitleHRlcm4gdm9pZCBzdmNfdW5yZWdpc3RlciAocnBjcHJvZ190IF9fcHJvZywgcnBjdmVyc190IF9fdmVycykgX19USFJPVzsKKworLyoKKyAqIFRyYW5zcG9ydCByZWdpc3RyYXRpb24uCisgKgorICogeHBydF9yZWdpc3Rlcih4cHJ0KQorICoJU1ZDWFBSVCAqeHBydDsKKyAqLworZXh0ZXJuIHZvaWQgeHBydF9yZWdpc3RlciAoU1ZDWFBSVCAqX194cHJ0KSBfX1RIUk9XOworCisvKgorICogVHJhbnNwb3J0IHVuLXJlZ2lzdGVyCisgKgorICogeHBydF91bnJlZ2lzdGVyKHhwcnQpCisgKglTVkNYUFJUICp4cHJ0OworICovCitleHRlcm4gdm9pZCB4cHJ0X3VucmVnaXN0ZXIgKFNWQ1hQUlQgKl9feHBydCkgX19USFJPVzsKKworCisvKgorICogV2hlbiB0aGUgc2VydmljZSByb3V0aW5lIGlzIGNhbGxlZCwgaXQgbXVzdCBmaXJzdCBjaGVjayB0byBzZWUgaWYgaXQKKyAqIGtub3dzIGFib3V0IHRoZSBwcm9jZWR1cmU7ICBpZiBub3QsIGl0IHNob3VsZCBjYWxsIHN2Y2Vycl9ub3Byb2MKKyAqIGFuZCByZXR1cm4uICBJZiBzbywgaXQgc2hvdWxkIGRlc2VyaWFsaXplIGl0cyBhcmd1bWVudHMgdmlhCisgKiBTVkNfR0VUQVJHUyAoZGVmaW5lZCBhYm92ZSkuICBJZiB0aGUgZGVzZXJpYWxpemF0aW9uIGRvZXMgbm90IHdvcmssCisgKiBzdmNlcnJfZGVjb2RlIHNob3VsZCBiZSBjYWxsZWQgZm9sbG93ZWQgYnkgYSByZXR1cm4uICBTdWNjZXNzZnVsCisgKiBkZWNvZGluZyBvZiB0aGUgYXJndW1lbnRzIHNob3VsZCBiZSBmb2xsb3dlZCB0aGUgZXhlY3V0aW9uIG9mIHRoZQorICogcHJvY2VkdXJlJ3MgY29kZSBhbmQgYSBjYWxsIHRvIHN2Y19zZW5kcmVwbHkuCisgKgorICogQWxzbywgaWYgdGhlIHNlcnZpY2UgcmVmdXNlcyB0byBleGVjdXRlIHRoZSBwcm9jZWR1cmUgZHVlIHRvIHRvby0KKyAqIHdlYWsgYXV0aGVudGljYXRpb24gcGFyYW1ldGVycywgc3ZjZXJyX3dlYWthdXRoIHNob3VsZCBiZSBjYWxsZWQuCisgKiBOb3RlOiBkbyBub3QgY29uZnVzZSBhY2Nlc3MtY29udHJvbCBmYWlsdXJlIHdpdGggd2VhayBhdXRoZW50aWNhdGlvbiEKKyAqCisgKiBOQjogSW4gcHVyZSBpbXBsZW1lbnRhdGlvbnMgb2YgcnBjLCB0aGUgY2FsbGVyIGFsd2F5cyB3YWl0cyBmb3IgYSByZXBseQorICogbXNnLiAgVGhpcyBtZXNzYWdlIGlzIHNlbnQgd2hlbiBzdmNfc2VuZHJlcGx5IGlzIGNhbGxlZC4KKyAqIFRoZXJlZm9yZSBwdXJlIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zIHNob3VsZCBhbHdheXMgY2FsbAorICogc3ZjX3NlbmRyZXBseSBldmVuIGlmIHRoZSBmdW5jdGlvbiBsb2dpY2FsbHkgcmV0dXJucyB2b2lkOyAgdXNlCisgKiB4ZHIuaCAtIHhkcl92b2lkIGZvciB0aGUgeGRyIHJvdXRpbmUuICBIT1dFVkVSLCB0Y3AgYmFzZWQgcnBjIGFsbG93cworICogZm9yIHRoZSBhYnVzZSBvZiBwdXJlIHJwYyB2aWEgYmF0Y2hlZCBjYWxsaW5nIG9yIHBpcGVsaW5pbmcuICBJbiB0aGUKKyAqIGNhc2Ugb2YgYSBiYXRjaGVkIGNhbGwsIHN2Y19zZW5kcmVwbHkgc2hvdWxkIE5PVCBiZSBjYWxsZWQgc2luY2UKKyAqIHRoaXMgd291bGQgc2VuZCBhIHJldHVybiBtZXNzYWdlLCB3aGljaCBpcyB3aGF0IGJhdGNoaW5nIHRyaWVzIHRvIGF2b2lkLgorICogSXQgaXMgdGhlIHNlcnZpY2UvcHJvdG9jb2wgd3JpdGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8ga25vdyB3aGljaCBjYWxscyBhcmUKKyAqIGJhdGNoZWQgYW5kIHdoaWNoIGFyZSBub3QuICBXYXJuaW5nOiByZXNwb25kaW5nIHRvIGJhdGNoIGNhbGxzIG1heQorICogZGVhZGxvY2sgdGhlIGNhbGxlciBhbmQgc2VydmVyIHByb2Nlc3NlcyEKKyAqLworCitleHRlcm4gYm9vbF90CXN2Y19zZW5kcmVwbHkgKFNWQ1hQUlQgKl9feHBydCwgeGRycHJvY190IF9feGRyX3Jlc3VsdHMsCisJCQkgICAgICAgY2FkZHJfdCBfX3hkcl9sb2NhdGlvbikgX19USFJPVzsKKworZXh0ZXJuIHZvaWQJc3ZjZXJyX2RlY29kZSAoU1ZDWFBSVCAqX194cHJ0KSBfX1RIUk9XOworCitleHRlcm4gdm9pZAlzdmNlcnJfd2Vha2F1dGggKFNWQ1hQUlQgKl9feHBydCkgX19USFJPVzsKKworZXh0ZXJuIHZvaWQJc3ZjZXJyX25vcHJvYyAoU1ZDWFBSVCAqX194cHJ0KSBfX1RIUk9XOworCitleHRlcm4gdm9pZAlzdmNlcnJfcHJvZ3ZlcnMgKFNWQ1hQUlQgKl9feHBydCwgcnBjdmVyc190IF9fbG93X3ZlcnMsCisJCQkJIHJwY3ZlcnNfdCBfX2hpZ2hfdmVycykgX19USFJPVzsKKworZXh0ZXJuIHZvaWQJc3ZjZXJyX2F1dGggKFNWQ1hQUlQgKl9feHBydCwgZW51bSBhdXRoX3N0YXQgX193aHkpIF9fVEhST1c7CisKK2V4dGVybiB2b2lkCXN2Y2Vycl9ub3Byb2cgKFNWQ1hQUlQgKl9feHBydCkgX19USFJPVzsKKworZXh0ZXJuIHZvaWQJc3ZjZXJyX3N5c3RlbWVyciAoU1ZDWFBSVCAqX194cHJ0KSBfX1RIUk9XOworCisvKgorICogTG93ZXN0IGxldmVsIGRpc3BhdGNoaW5nIC1PUi0gd2hvIG93bnMgdGhpcyBwcm9jZXNzIGFueXdheS4KKyAqIFNvbWVib2R5IGhhcyB0byB3YWl0IGZvciBpbmNvbWluZyByZXF1ZXN0cyBhbmQgdGhlbiBjYWxsIHRoZSBjb3JyZWN0CisgKiBzZXJ2aWNlIHJvdXRpbmUuICBUaGUgcm91dGluZSBzdmNfcnVuIGRvZXMgaW5maW5pdGUgd2FpdGluZzsgaS5lLiwKKyAqIHN2Y19ydW4gbmV2ZXIgcmV0dXJucy4KKyAqIFNpbmNlIGFub3RoZXIgKGNvZXhpc3RlbnQpIHBhY2thZ2UgbWF5IHdpc2ggdG8gc2VsZWN0aXZlbHkgd2FpdCBmb3IKKyAqIGluY29taW5nIGNhbGxzIG9yIG90aGVyIGV2ZW50cyBvdXRzaWRlIG9mIHRoZSBycGMgYXJjaGl0ZWN0dXJlLCB0aGUKKyAqIHJvdXRpbmUgc3ZjX2dldHJlcSBpcyBwcm92aWRlZC4gIEl0IG11c3QgYmUgcGFzc2VkIHJlYWRmZHMsIHRoZQorICogImluLXBsYWNlIiByZXN1bHRzIG9mIGEgc2VsZWN0IHN5c3RlbSBjYWxsIChzZWUgc2VsZWN0LCBzZWN0aW9uIDIpLgorICovCisKKy8qCisgKiBHbG9iYWwga2VlcGVyIG9mIHJwYyBzZXJ2aWNlIGRlc2NyaXB0b3JzIGluIHVzZQorICogZHluYW1pYzsgbXVzdCBiZSBpbnNwZWN0ZWQgYmVmb3JlIGVhY2ggY2FsbCB0byBzZWxlY3QKKyAqLworCitleHRlcm4gc3RydWN0IHBvbGxmZCAqc3ZjX3BvbGxmZDsKK2V4dGVybiBpbnQgc3ZjX21heF9wb2xsZmQ7CitleHRlcm4gZmRfc2V0IHN2Y19mZHNldDsKKyNkZWZpbmUgc3ZjX2ZkcyBzdmNfZmRzZXQuZmRzX2JpdHNbMF0JLyogY29tcGF0aWJpbGl0eSAqLworCisvKgorICogYSBzbWFsbCBwcm9ncmFtIGltcGxlbWVudGVkIGJ5IHRoZSBzdmNfcnBjIGltcGxlbWVudGF0aW9uIGl0c2VsZjsKKyAqIGFsc28gc2VlIGNsbnQuaCBmb3IgcHJvdG9jb2wgbnVtYmVycy4KKyAqLworZXh0ZXJuIHZvaWQgc3ZjX2dldHJlcSAoaW50IF9fcmRmZHMpIF9fVEhST1c7CitleHRlcm4gdm9pZCBzdmNfZ2V0cmVxX2NvbW1vbiAoY29uc3QgaW50IF9fZmQpIF9fVEhST1c7CitleHRlcm4gdm9pZCBzdmNfZ2V0cmVxc2V0IChmZF9zZXQgKl9fcmVhZGZkcykgX19USFJPVzsKK2V4dGVybiB2b2lkIHN2Y19nZXRyZXFfcG9sbCAoc3RydWN0IHBvbGxmZCAqLCBjb25zdCBpbnQpIF9fVEhST1c7CitleHRlcm4gdm9pZCBzdmNfZXhpdCAodm9pZCkgX19USFJPVzsKK2V4dGVybiB2b2lkIHN2Y19ydW4gKHZvaWQpIF9fVEhST1c7CisKKy8qCisgKiBTb2NrZXQgdG8gdXNlIG9uIHN2Y3h4eF9jcmVhdGUgY2FsbCB0byBnZXQgZGVmYXVsdCBzb2NrZXQKKyAqLworI2RlZmluZQlSUENfQU5ZU09DSwktMQorCisvKgorICogVGhlc2UgYXJlIHRoZSBleGlzdGluZyBzZXJ2aWNlIHNpZGUgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucworICovCisKKy8qCisgKiBNZW1vcnkgYmFzZWQgcnBjIGZvciB0ZXN0aW5nIGFuZCB0aW1pbmcuCisgKi8KK2V4dGVybiBTVkNYUFJUICpzdmNyYXdfY3JlYXRlICh2b2lkKSBfX1RIUk9XOworCisvKgorICogVWRwIGJhc2VkIHJwYy4KKyAqLworZXh0ZXJuIFNWQ1hQUlQgKnN2Y3VkcF9jcmVhdGUgKGludCBfX3NvY2spIF9fVEhST1c7CitleHRlcm4gU1ZDWFBSVCAqc3ZjdWRwX2J1ZmNyZWF0ZSAoaW50IF9fc29jaywgdV9pbnQgX19zZW5kc3osIHVfaW50IF9fcmVjdnN6KQorICAgICBfX1RIUk9XOworCisvKgorICogVGNwIGJhc2VkIHJwYy4KKyAqLworZXh0ZXJuIFNWQ1hQUlQgKnN2Y3RjcF9jcmVhdGUgKGludCBfX3NvY2ssIHVfaW50IF9fc2VuZHNpemUsIHVfaW50IF9fcmVjdnNpemUpCisgICAgIF9fVEhST1c7CisKKy8qCisgKiBGRCBiYXNlZCBycGMuCisgKi8KK2V4dGVybiBTVkNYUFJUICpzdmNmZF9jcmVhdGUgKGludCBfX3NvY2ssIHVfaW50IF9fc2VuZHNpemUsIHVfaW50IF9fcmVjdnNpemUpCisgICAgIF9fVEhST1c7CisKKy8qCisgKiBVbml4IGJhc2VkIHJwYy4KKyAqLworZXh0ZXJuIFNWQ1hQUlQgKnN2Y3VuaXhfY3JlYXRlIChpbnQgX19zb2NrLCB1X2ludCBfX3NlbmRzaXplLCB1X2ludCBfX3JlY3ZzaXplLAorCQkJCWNoYXIgKl9fcGF0aCkgX19USFJPVzsKKworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL3N2Yy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9zdmNfYXV0aC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvc3ZjX2F1dGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmEyNzQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvc3ZjX2F1dGguaApAQCAtMCwwICsxLDUwIEBACisvKgorICogc3ZjX2F1dGguaCwgU2VydmljZSBzaWRlIG9mIHJwYyBhdXRoZW50aWNhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9SUENfU1ZDX0FVVEhfSAorI2RlZmluZSBfUlBDX1NWQ19BVVRIX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxycGMvc3ZjLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIFNlcnZlciBzaWRlIGF1dGhlbnRpY2F0b3IKKyAqLworZXh0ZXJuIGVudW0gYXV0aF9zdGF0IF9hdXRoZW50aWNhdGUgKHN0cnVjdCBzdmNfcmVxICpfX3Jxc3QsCisJCQkJICAgICBzdHJ1Y3QgcnBjX21zZyAqX19tc2cpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBycGMvc3ZjX2F1dGguaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvdHlwZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjYTVjNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3R5cGVzLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisvKiBmaXhpbmNsdWRlcyBzaG91bGQgbm90IGFkZCBleHRlcm4gIkMiIHRvIHRoaXMgZmlsZSAqLworLyoKKyAqIFJwYyBhZGRpdGlvbnMgdG8gPHN5cy90eXBlcy5oPgorICovCisjaWZuZGVmIF9SUENfVFlQRVNfSAorI2RlZmluZSBfUlBDX1RZUEVTX0ggMQorCit0eXBlZGVmIGludCBib29sX3Q7Cit0eXBlZGVmIGludCBlbnVtX3Q7CisvKiBUaGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gdWludDMyX3QgaW4gdGhlIGZ1dHVyZSAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHJwY3Byb2dfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBycGN2ZXJzX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcnBjcHJvY190OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHJwY3Byb3RfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBycGNwb3J0X3Q7CisKKyNkZWZpbmUgICAgICAgIF9fZG9udGNhcmVfXyAgICAtMQorCisjaWZuZGVmIEZBTFNFCisjICAgICAgZGVmaW5lICBGQUxTRSAgICgwKQorI2VuZGlmCisKKyNpZm5kZWYgVFJVRQorIyAgICAgIGRlZmluZSAgVFJVRSAgICAoMSkKKyNlbmRpZgorCisjaWZuZGVmIE5VTEwKKyMgICAgICBkZWZpbmUgIE5VTEwgMAorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIEZvciBtYWxsb2MgZGVjbC4gICovCisjZGVmaW5lIG1lbV9hbGxvYyhic2l6ZSkJbWFsbG9jKGJzaXplKQorLyoKKyAqIFhYWDogVGhpcyBtdXN0IG5vdCB1c2UgdGhlIHNlY29uZCBhcmd1bWVudCwgb3IgY29kZSBpbiB4ZHJfYXJyYXkuYyBuZWVkcworICogdG8gYmUgbW9kaWZpZWQuCisgKi8KKyNkZWZpbmUgbWVtX2ZyZWUocHRyLCBic2l6ZSkJZnJlZShwdHIpCisKKyNpZm5kZWYgbWFrZWRldiAvKiBpZSwgd2UgaGF2ZW4ndCBhbHJlYWR5IGluY2x1ZGVkIGl0ICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2lmbmRlZiBfX3VfY2hhcl9kZWZpbmVkCit0eXBlZGVmIF9fdV9jaGFyIHVfY2hhcjsKK3R5cGVkZWYgX191X3Nob3J0IHVfc2hvcnQ7Cit0eXBlZGVmIF9fdV9pbnQgdV9pbnQ7Cit0eXBlZGVmIF9fdV9sb25nIHVfbG9uZzsKK3R5cGVkZWYgX19xdWFkX3QgcXVhZF90OwordHlwZWRlZiBfX3VfcXVhZF90IHVfcXVhZF90OwordHlwZWRlZiBfX2ZzaWRfdCBmc2lkX3Q7CisjIGRlZmluZSBfX3VfY2hhcl9kZWZpbmVkCisjZW5kaWYKKyNpZm5kZWYgX19kYWRkcl90X2RlZmluZWQKK3R5cGVkZWYgX19kYWRkcl90IGRhZGRyX3Q7Cit0eXBlZGVmIF9fY2FkZHJfdCBjYWRkcl90OworIyBkZWZpbmUgX19kYWRkcl90X2RlZmluZWQKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2lmbmRlZiBJTkFERFJfTE9PUEJBQ0sKKyNkZWZpbmUgICAgICAgSU5BRERSX0xPT1BCQUNLICAgICAgICAgKHVfbG9uZykweDdGMDAwMDAxCisjZW5kaWYKKyNpZm5kZWYgTUFYSE9TVE5BTUVMRU4KKyNkZWZpbmUgICAgICAgIE1BWEhPU1ROQU1FTEVOICA2NAorI2VuZGlmCisKKyNlbmRpZiAvKiBycGMvdHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMveGRyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy94ZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGYwMzNhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMveGRyLmgKQEAgLTAsMCArMSwzNzcgQEAKKy8qCisgKiB4ZHIuaCwgRXh0ZXJuYWwgRGF0YSBSZXByZXNlbnRhdGlvbiBTZXJpYWxpemF0aW9uIFJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1JQQ19YRFJfSAorI2RlZmluZSBfUlBDX1hEUl9IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cnBjL3R5cGVzLmg+CisKKy8qIFdlIG5lZWQgRklMRS4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKworX19CRUdJTl9ERUNMUworCisvKgorICogWERSIHByb3ZpZGVzIGEgY29udmVudGlvbmFsIHdheSBmb3IgY29udmVydGluZyBiZXR3ZWVuIEMgZGF0YQorICogdHlwZXMgYW5kIGFuIGV4dGVybmFsIGJpdC1zdHJpbmcgcmVwcmVzZW50YXRpb24uICBMaWJyYXJ5IHN1cHBsaWVkCisgKiByb3V0aW5lcyBwcm92aWRlIGZvciB0aGUgY29udmVyc2lvbiBvbiBidWlsdC1pbiBDIGRhdGEgdHlwZXMuICBUaGVzZQorICogcm91dGluZXMgYW5kIHV0aWxpdHkgcm91dGluZXMgZGVmaW5lZCBoZXJlIGFyZSB1c2VkIHRvIGhlbHAgaW1wbGVtZW50CisgKiBhIHR5cGUgZW5jb2RlL2RlY29kZSByb3V0aW5lIGZvciBlYWNoIHVzZXItZGVmaW5lZCB0eXBlLgorICoKKyAqIEVhY2ggZGF0YSB0eXBlIHByb3ZpZGVzIGEgc2luZ2xlIHByb2NlZHVyZSB3aGljaCB0YWtlcyB0d28gYXJndW1lbnRzOgorICoKKyAqICAgICAgYm9vbF90CisgKiAgICAgIHhkcnByb2MoeGRycywgYXJncmVzcCkKKyAqICAgICAgICAgICAgICBYRFIgKnhkcnM7CisgKiAgICAgICAgICAgICAgPHR5cGU+ICphcmdyZXNwOworICoKKyAqIHhkcnMgaXMgYW4gaW5zdGFuY2Ugb2YgYSBYRFIgaGFuZGxlLCB0byB3aGljaCBvciBmcm9tIHdoaWNoIHRoZSBkYXRhCisgKiB0eXBlIGlzIHRvIGJlIGNvbnZlcnRlZC4gIGFyZ3Jlc3AgaXMgYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgdG8gYmUKKyAqIGNvbnZlcnRlZC4gIFRoZSBYRFIgaGFuZGxlIGNvbnRhaW5zIGFuIG9wZXJhdGlvbiBmaWVsZCB3aGljaCBpbmRpY2F0ZXMKKyAqIHdoaWNoIG9mIHRoZSBvcGVyYXRpb25zIChFTkNPREUsIERFQ09ERSAqIG9yIEZSRUUpIGlzIHRvIGJlIHBlcmZvcm1lZC4KKyAqCisgKiBYRFJfREVDT0RFIG1heSBhbGxvY2F0ZSBzcGFjZSBpZiB0aGUgcG9pbnRlciBhcmdyZXNwIGlzIG51bGwuICBUaGlzCisgKiBkYXRhIGNhbiBiZSBmcmVlZCB3aXRoIHRoZSBYRFJfRlJFRSBvcGVyYXRpb24uCisgKgorICogV2Ugd3JpdGUgb25seSBvbmUgcHJvY2VkdXJlIHBlciBkYXRhIHR5cGUgdG8gbWFrZSBpdCBlYXN5CisgKiB0byBrZWVwIHRoZSBlbmNvZGUgYW5kIGRlY29kZSBwcm9jZWR1cmVzIGZvciBhIGRhdGEgdHlwZSBjb25zaXN0ZW50LgorICogSW4gbWFueSBjYXNlcyB0aGUgc2FtZSBjb2RlIHBlcmZvcm1zIGFsbCBvcGVyYXRpb25zIG9uIGEgdXNlciBkZWZpbmVkIHR5cGUsCisgKiBiZWNhdXNlIGFsbCB0aGUgaGFyZCB3b3JrIGlzIGRvbmUgaW4gdGhlIGNvbXBvbmVudCB0eXBlIHJvdXRpbmVzLgorICogZGVjb2RlIGFzIGEgc2VyaWVzIG9mIGNhbGxzIG9uIHRoZSBuZXN0ZWQgZGF0YSB0eXBlcy4KKyAqLworCisvKgorICogWGRyIG9wZXJhdGlvbnMuICBYRFJfRU5DT0RFIGNhdXNlcyB0aGUgdHlwZSB0byBiZSBlbmNvZGVkIGludG8gdGhlCisgKiBzdHJlYW0uICBYRFJfREVDT0RFIGNhdXNlcyB0aGUgdHlwZSB0byBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgc3RyZWFtLgorICogWERSX0ZSRUUgY2FuIGJlIHVzZWQgdG8gcmVsZWFzZSB0aGUgc3BhY2UgYWxsb2NhdGVkIGJ5IGFuIFhEUl9ERUNPREUKKyAqIHJlcXVlc3QuCisgKi8KK2VudW0geGRyX29wIHsKKyAgWERSX0VOQ09ERSA9IDAsCisgIFhEUl9ERUNPREUgPSAxLAorICBYRFJfRlJFRSA9IDIKK307CisKKy8qCisgKiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHVuaXQgb2YgZXh0ZXJuYWwgZGF0YS4KKyAqLworI2RlZmluZSBCWVRFU19QRVJfWERSX1VOSVQJKDQpCisvKgorICogVGhpcyBvbmx5IHdvcmtzIGlmIHRoZSBhYm92ZSBpcyBhIHBvd2VyIG9mIDIuICBCdXQgaXQncyBkZWZpbmVkIHRvIGJlCisgKiA0IGJ5IHRoZSBhcHByb3ByaWF0ZSBSRkNzLiAgU28gaXQgd2lsbCB3b3JrLiAgQW5kIGl0J3Mgbm9ybWFsbHkgcXVpY2tlcgorICogdGhhbiB0aGUgb2xkIHJvdXRpbmUuCisgKi8KKyNpZiAxCisjZGVmaW5lIFJORFVQKHgpICAoKCh4KSArIEJZVEVTX1BFUl9YRFJfVU5JVCAtIDEpICYgfihCWVRFU19QRVJfWERSX1VOSVQgLSAxKSkKKyNlbHNlIC8qIHRoaXMgaXMgdGhlIG9sZCByb3V0aW5lICovCisjZGVmaW5lIFJORFVQKHgpICAoKCgoeCkgKyBCWVRFU19QRVJfWERSX1VOSVQgLSAxKSAvIEJZVEVTX1BFUl9YRFJfVU5JVCkgXAorCQkgICAgKiBCWVRFU19QRVJfWERSX1VOSVQpCisjZW5kaWYKKworLyoKKyAqIFRoZSBYRFIgaGFuZGxlLgorICogQ29udGFpbnMgb3BlcmF0aW9uIHdoaWNoIGlzIGJlaW5nIGFwcGxpZWQgdG8gdGhlIHN0cmVhbSwKKyAqIGFuIG9wZXJhdGlvbnMgdmVjdG9yIGZvciB0aGUgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiAoZS5nLiBzZWUgeGRyX21lbS5jKSwKKyAqIGFuZCB0d28gcHJpdmF0ZSBmaWVsZHMgZm9yIHRoZSB1c2Ugb2YgdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IFhEUiBYRFI7CitzdHJ1Y3QgWERSCisgIHsKKyAgICBlbnVtIHhkcl9vcCB4X29wOwkJLyogb3BlcmF0aW9uOyBmYXN0IGFkZGl0aW9uYWwgcGFyYW0gKi8KKyAgICBzdHJ1Y3QgeGRyX29wcworICAgICAgeworCWJvb2xfdCAoKnhfZ2V0bG9uZykgKFhEUiAqX194ZHJzLCBsb25nICpfX2xwKTsKKwkvKiBnZXQgYSBsb25nIGZyb20gdW5kZXJseWluZyBzdHJlYW0gKi8KKwlib29sX3QgKCp4X3B1dGxvbmcpIChYRFIgKl9feGRycywgX19jb25zdCBsb25nICpfX2xwKTsKKwkvKiBwdXQgYSBsb25nIHRvICIgKi8KKwlib29sX3QgKCp4X2dldGJ5dGVzKSAoWERSICpfX3hkcnMsIGNhZGRyX3QgX19hZGRyLCB1X2ludCBfX2xlbik7CisJLyogZ2V0IHNvbWUgYnl0ZXMgZnJvbSAiICovCisJYm9vbF90ICgqeF9wdXRieXRlcykgKFhEUiAqX194ZHJzLCBfX2NvbnN0IGNoYXIgKl9fYWRkciwgdV9pbnQgX19sZW4pOworCS8qIHB1dCBzb21lIGJ5dGVzIHRvICIgKi8KKwl1X2ludCAoKnhfZ2V0cG9zdG4pIChfX2NvbnN0IFhEUiAqX194ZHJzKTsKKwkvKiByZXR1cm5zIGJ5dGVzIG9mZiBmcm9tIGJlZ2lubmluZyAqLworCWJvb2xfdCAoKnhfc2V0cG9zdG4pIChYRFIgKl9feGRycywgdV9pbnQgX19wb3MpOworCS8qIGxldHMgeW91IHJlcG9zaXRpb24gdGhlIHN0cmVhbSAqLworCWludDMyX3QgKigqeF9pbmxpbmUpIChYRFIgKl9feGRycywgdV9pbnQgX19sZW4pOworCS8qIGJ1ZiBxdWljayBwdHIgdG8gYnVmZmVyZWQgZGF0YSAqLworCXZvaWQgKCp4X2Rlc3Ryb3kpIChYRFIgKl9feGRycyk7CisJLyogZnJlZSBwcml2YXRlcyBvZiB0aGlzIHhkcl9zdHJlYW0gKi8KKwlib29sX3QgKCp4X2dldGludDMyKSAoWERSICpfX3hkcnMsIGludDMyX3QgKl9faXApOworCS8qIGdldCBhIGludCBmcm9tIHVuZGVybHlpbmcgc3RyZWFtICovCisJYm9vbF90ICgqeF9wdXRpbnQzMikgKFhEUiAqX194ZHJzLCBfX2NvbnN0IGludDMyX3QgKl9faXApOworCS8qIHB1dCBhIGludCB0byAiICovCisgICAgICB9CisgICAgICp4X29wczsKKyAgICBjYWRkcl90IHhfcHVibGljOwkJLyogdXNlcnMnIGRhdGEgKi8KKyAgICBjYWRkcl90IHhfcHJpdmF0ZTsJCS8qIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhICovCisgICAgY2FkZHJfdCB4X2Jhc2U7CQkvKiBwcml2YXRlIHVzZWQgZm9yIHBvc2l0aW9uIGluZm8gKi8KKyAgICB1X2ludCB4X2hhbmR5OwkJLyogZXh0cmEgcHJpdmF0ZSB3b3JkICovCisgIH07CisKKy8qCisgKiBBIHhkcnByb2NfdCBleGlzdHMgZm9yIGVhY2ggZGF0YSB0eXBlIHdoaWNoIGlzIHRvIGJlIGVuY29kZWQgb3IgZGVjb2RlZC4KKyAqCisgKiBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSB4ZHJwcm9jX3QgaXMgYSBwb2ludGVyIHRvIGFuIG9wYXF1ZSBwb2ludGVyLgorICogVGhlIG9wYXF1ZSBwb2ludGVyIGdlbmVyYWxseSBwb2ludHMgdG8gYSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGEgdHlwZQorICogdG8gYmUgZGVjb2RlZC4gIElmIHRoaXMgcG9pbnRlciBpcyAwLCB0aGVuIHRoZSB0eXBlIHJvdXRpbmVzIHNob3VsZAorICogYWxsb2NhdGUgZHluYW1pYyBzdG9yYWdlIG9mIHRoZSBhcHByb3ByaWF0ZSBzaXplIGFuZCByZXR1cm4gaXQuCisgKiBib29sX3QgICAgICAgKCp4ZHJwcm9jX3QpKFhEUiAqLCBjYWRkcl90ICopOworICovCit0eXBlZGVmIGJvb2xfdCAoKnhkcnByb2NfdCkgKFhEUiAqLCB2b2lkICosLi4uKTsKKworCisvKgorICogT3BlcmF0aW9ucyBkZWZpbmVkIG9uIGEgWERSIGhhbmRsZQorICoKKyAqIFhEUiAgICAgICAgICAqeGRyczsKKyAqIGludDMyX3QgICAgICAqaW50MzJwOworICogbG9uZyAgICAgICAgICpsb25ncDsKKyAqIGNhZGRyX3QgICAgICAgYWRkcjsKKyAqIHVfaW50ICAgICAgICAgbGVuOworICogdV9pbnQgICAgICAgICBwb3M7CisgKi8KKyNkZWZpbmUgWERSX0dFVElOVDMyKHhkcnMsIGludDMycCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKih4ZHJzKS0+eF9vcHMtPnhfZ2V0aW50MzIpKHhkcnMsIGludDMycCkKKyNkZWZpbmUgeGRyX2dldGludDMyKHhkcnMsIGludDMycCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKih4ZHJzKS0+eF9vcHMtPnhfZ2V0aW50MzIpKHhkcnMsIGludDMycCkKKworI2RlZmluZSBYRFJfUFVUSU5UMzIoeGRycywgaW50MzJwKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqKHhkcnMpLT54X29wcy0+eF9wdXRpbnQzMikoeGRycywgaW50MzJwKQorI2RlZmluZSB4ZHJfcHV0aW50MzIoeGRycywgaW50MzJwKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqKHhkcnMpLT54X29wcy0+eF9wdXRpbnQzMikoeGRycywgaW50MzJwKQorCisjZGVmaW5lIFhEUl9HRVRMT05HKHhkcnMsIGxvbmdwKQkJCVwKKwkoKih4ZHJzKS0+eF9vcHMtPnhfZ2V0bG9uZykoeGRycywgbG9uZ3ApCisjZGVmaW5lIHhkcl9nZXRsb25nKHhkcnMsIGxvbmdwKQkJCVwKKwkoKih4ZHJzKS0+eF9vcHMtPnhfZ2V0bG9uZykoeGRycywgbG9uZ3ApCisKKyNkZWZpbmUgWERSX1BVVExPTkcoeGRycywgbG9uZ3ApCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9wdXRsb25nKSh4ZHJzLCBsb25ncCkKKyNkZWZpbmUgeGRyX3B1dGxvbmcoeGRycywgbG9uZ3ApCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9wdXRsb25nKSh4ZHJzLCBsb25ncCkKKworI2RlZmluZSBYRFJfR0VUQllURVMoeGRycywgYWRkciwgbGVuKQkJCVwKKwkoKih4ZHJzKS0+eF9vcHMtPnhfZ2V0Ynl0ZXMpKHhkcnMsIGFkZHIsIGxlbikKKyNkZWZpbmUgeGRyX2dldGJ5dGVzKHhkcnMsIGFkZHIsIGxlbikJCQlcCisJKCooeGRycyktPnhfb3BzLT54X2dldGJ5dGVzKSh4ZHJzLCBhZGRyLCBsZW4pCisKKyNkZWZpbmUgWERSX1BVVEJZVEVTKHhkcnMsIGFkZHIsIGxlbikJCQlcCisJKCooeGRycyktPnhfb3BzLT54X3B1dGJ5dGVzKSh4ZHJzLCBhZGRyLCBsZW4pCisjZGVmaW5lIHhkcl9wdXRieXRlcyh4ZHJzLCBhZGRyLCBsZW4pCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9wdXRieXRlcykoeGRycywgYWRkciwgbGVuKQorCisjZGVmaW5lIFhEUl9HRVRQT1MoeGRycykJCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9nZXRwb3N0bikoeGRycykKKyNkZWZpbmUgeGRyX2dldHBvcyh4ZHJzKQkJCQlcCisJKCooeGRycyktPnhfb3BzLT54X2dldHBvc3RuKSh4ZHJzKQorCisjZGVmaW5lIFhEUl9TRVRQT1MoeGRycywgcG9zKQkJCQlcCisJKCooeGRycyktPnhfb3BzLT54X3NldHBvc3RuKSh4ZHJzLCBwb3MpCisjZGVmaW5lIHhkcl9zZXRwb3MoeGRycywgcG9zKQkJCQlcCisJKCooeGRycyktPnhfb3BzLT54X3NldHBvc3RuKSh4ZHJzLCBwb3MpCisKKyNkZWZpbmUJWERSX0lOTElORSh4ZHJzLCBsZW4pCQkJCVwKKwkoKih4ZHJzKS0+eF9vcHMtPnhfaW5saW5lKSh4ZHJzLCBsZW4pCisjZGVmaW5lCXhkcl9pbmxpbmUoeGRycywgbGVuKQkJCQlcCisJKCooeGRycyktPnhfb3BzLT54X2lubGluZSkoeGRycywgbGVuKQorCisjZGVmaW5lCVhEUl9ERVNUUk9ZKHhkcnMpCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmICgoeGRycyktPnhfb3BzLT54X2Rlc3Ryb3kpCQkJXAorCQkJKCooeGRycyktPnhfb3BzLT54X2Rlc3Ryb3kpKHhkcnMpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUJeGRyX2Rlc3Ryb3koeGRycykJCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaWYgKCh4ZHJzKS0+eF9vcHMtPnhfZGVzdHJveSkJCQlcCisJCQkoKih4ZHJzKS0+eF9vcHMtPnhfZGVzdHJveSkoeGRycyk7CVwKKwl9IHdoaWxlICgwKQorCisvKgorICogU3VwcG9ydCBzdHJ1Y3QgZm9yIGRpc2NyaW1pbmF0ZWQgdW5pb25zLgorICogWW91IGNyZWF0ZSBhbiBhcnJheSBvZiB4ZHJkaXNjcmltIHN0cnVjdHVyZXMsIHRlcm1pbmF0ZWQgd2l0aAorICogYSBlbnRyeSB3aXRoIGEgbnVsbCBwcm9jZWR1cmUgcG9pbnRlci4gIFRoZSB4ZHJfdW5pb24gcm91dGluZSBnZXRzCisgKiB0aGUgZGlzY3JpbWluYW50IHZhbHVlIGFuZCB0aGVuIHNlYXJjaGVzIHRoZSBhcnJheSBvZiBzdHJ1Y3R1cmVzCisgKiBmb3IgYSBtYXRjaGluZyB2YWx1ZS4gIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhlIGFzc29jaWF0ZWQgeGRyIHJvdXRpbmUKKyAqIGlzIGNhbGxlZCB0byBoYW5kbGUgdGhhdCBwYXJ0IG9mIHRoZSB1bmlvbi4gIElmIHRoZXJlIGlzCisgKiBubyBtYXRjaCwgdGhlbiBhIGRlZmF1bHQgcm91dGluZSBtYXkgYmUgY2FsbGVkLgorICogSWYgdGhlcmUgaXMgbm8gbWF0Y2ggYW5kIG5vIGRlZmF1bHQgcm91dGluZSBpdCBpcyBhbiBlcnJvci4KKyAqLworI2RlZmluZSBOVUxMX3hkcnByb2NfdCAoKHhkcnByb2NfdCkwKQorc3RydWN0IHhkcl9kaXNjcmltCit7CisgIGludCB2YWx1ZTsKKyAgeGRycHJvY190IHByb2M7Cit9OworCisvKgorICogSW5saW5lIHJvdXRpbmVzIGZvciBmYXN0IGVuY29kZS9kZWNvZGUgb2YgcHJpbWl0aXZlIGRhdGEgdHlwZXMuCisgKiBDYXZlYXQgZW1wdG9yOiB0aGVzZSB1c2Ugc2luZ2xlIG1lbW9yeSBjeWNsZXMgdG8gZ2V0IHRoZQorICogZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciwgYW5kIHdpbGwgZmFpbCB0byBvcGVyYXRlCisgKiBwcm9wZXJseSBpZiB0aGUgZGF0YSBpcyBub3QgYWxpZ25lZC4gIFRoZSBzdGFuZGFyZCB3YXkgdG8gdXNlIHRoZXNlCisgKiBpcyB0byBzYXk6CisgKiAgICAgIGlmICgoYnVmID0gWERSX0lOTElORSh4ZHJzLCBjb3VudCkpID09IE5VTEwpCisgKiAgICAgICAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgKiAgICAgIDw8PCBtYWNybyBjYWxscyA+Pj4KKyAqIHdoZXJlIGBgY291bnQnJyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgb2NjdXBpZWQKKyAqIGJ5IHRoZSBwcmltaXRpdmUgZGF0YSB0eXBlcy4KKyAqCisgKiBOLkIuIGFuZCBmcm96ZW4gZm9yIGFsbCB0aW1lOiBlYWNoIGRhdGEgdHlwZSBoZXJlIHVzZXMgNCBieXRlcworICogb2YgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24uCisgKi8KKworI2RlZmluZSBJWERSX0dFVF9JTlQzMihidWYpICAgICAgICAgICAoKGludDMyX3QpbnRvaGwoKHVpbnQzMl90KSooYnVmKSsrKSkKKyNkZWZpbmUgSVhEUl9QVVRfSU5UMzIoYnVmLCB2KSAgICAgICAgKCooYnVmKSsrID0gKGludDMyX3QpaHRvbmwoKHVpbnQzMl90KSh2KSkpCisjZGVmaW5lIElYRFJfR0VUX1VfSU5UMzIoYnVmKSAgICAgICAgICgodWludDMyX3QpSVhEUl9HRVRfSU5UMzIoYnVmKSkKKyNkZWZpbmUgSVhEUl9QVVRfVV9JTlQzMihidWYsIHYpICAgICAgSVhEUl9QVVRfSU5UMzIoYnVmLCAoaW50MzJfdCkodikpCisKKy8qIFdBUk5JTkc6IFRoZSBJWERSXypfTE9ORyBkZWZpbmVzIGFyZSByZW1vdmVkIGJ5IFN1biBmb3IgbmV3IHBsYXRmb3JtcworICogYW5kIHNob3VsZG4ndCBiZSB1c2VkIGFueSBsb25nZXIuIENvZGUgd2hpY2ggdXNlIHRoaXMgZGVmaW5lcyBvciBsb25ncworICogaW4gdGhlIFJQQyBjb2RlIHdpbGwgbm90IHdvcmsgb24gNjRiaXQgU29sYXJpcyBwbGF0Zm9ybXMgIQorICovCisjZGVmaW5lIElYRFJfR0VUX0xPTkcoYnVmKSAoKGxvbmcpSVhEUl9HRVRfVV9JTlQzMihidWYpKQorI2RlZmluZSBJWERSX1BVVF9MT05HKGJ1ZiwgdikgKChsb25nKUlYRFJfUFVUX0lOVDMyKGJ1ZiwgKGxvbmcpKHYpKSkKKyNkZWZpbmUgSVhEUl9HRVRfVV9MT05HKGJ1ZikJICAgICAgKCh1X2xvbmcpSVhEUl9HRVRfTE9ORyhidWYpKQorI2RlZmluZSBJWERSX1BVVF9VX0xPTkcoYnVmLCB2KQkgICAgICBJWERSX1BVVF9MT05HKGJ1ZiwgKGxvbmcpKHYpKQorCisKKyNkZWZpbmUgSVhEUl9HRVRfQk9PTChidWYpICAgICAgICAgICAgKChib29sX3QpSVhEUl9HRVRfTE9ORyhidWYpKQorI2RlZmluZSBJWERSX0dFVF9FTlVNKGJ1ZiwgdCkgICAgICAgICAoKHQpSVhEUl9HRVRfTE9ORyhidWYpKQorI2RlZmluZSBJWERSX0dFVF9TSE9SVChidWYpICAgICAgICAgICAoKHNob3J0KUlYRFJfR0VUX0xPTkcoYnVmKSkKKyNkZWZpbmUgSVhEUl9HRVRfVV9TSE9SVChidWYpICAgICAgICAgKCh1X3Nob3J0KUlYRFJfR0VUX0xPTkcoYnVmKSkKKworI2RlZmluZSBJWERSX1BVVF9CT09MKGJ1ZiwgdikgICAgICAgICBJWERSX1BVVF9MT05HKGJ1ZiwgKGxvbmcpKHYpKQorI2RlZmluZSBJWERSX1BVVF9FTlVNKGJ1ZiwgdikgICAgICAgICBJWERSX1BVVF9MT05HKGJ1ZiwgKGxvbmcpKHYpKQorI2RlZmluZSBJWERSX1BVVF9TSE9SVChidWYsIHYpICAgICAgICBJWERSX1BVVF9MT05HKGJ1ZiwgKGxvbmcpKHYpKQorI2RlZmluZSBJWERSX1BVVF9VX1NIT1JUKGJ1ZiwgdikgICAgICBJWERSX1BVVF9MT05HKGJ1ZiwgKGxvbmcpKHYpKQorCisvKgorICogVGhlc2UgYXJlIHRoZSAiZ2VuZXJpYyIgeGRyIHJvdXRpbmVzLgorICogTm9uZSBvZiB0aGVzZSBjYW4gaGF2ZSBjb25zdCBhcHBsaWVkIGJlY2F1c2UgaXQncyBub3QgcG9zc2libGUgdG8KKyAqIGtub3cgd2hldGhlciB0aGUgY2FsbCBpcyBhIHJlYWQgb3IgYSB3cml0ZSB0byB0aGUgcGFzc2VkIHBhcmFtZXRlcgorICogYWxzbywgdGhlIFhEUiBzdHJ1Y3R1cmUgaXMgYWx3YXlzIHVwZGF0ZWQgYnkgc29tZSBvZiB0aGVzZSBjYWxscy4KKyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfdm9pZCAodm9pZCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3Nob3J0IChYRFIgKl9feGRycywgc2hvcnQgKl9fc3ApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl91X3Nob3J0IChYRFIgKl9feGRycywgdV9zaG9ydCAqX191c3ApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9pbnQgKFhEUiAqX194ZHJzLCBpbnQgKl9faXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl91X2ludCAoWERSICpfX3hkcnMsIHVfaW50ICpfX3VwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfbG9uZyAoWERSICpfX3hkcnMsIGxvbmcgKl9fbHApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl91X2xvbmcgKFhEUiAqX194ZHJzLCB1X2xvbmcgKl9fdWxwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfaHlwZXIgKFhEUiAqX194ZHJzLCBxdWFkX3QgKl9fbGxwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdV9oeXBlciAoWERSICpfX3hkcnMsIHVfcXVhZF90ICpfX3VsbHApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9sb25nbG9uZ190IChYRFIgKl9feGRycywgcXVhZF90ICpfX2xscCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3VfbG9uZ2xvbmdfdCAoWERSICpfX3hkcnMsIHVfcXVhZF90ICpfX3VsbHApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9pbnQ4X3QgKFhEUiAqX194ZHJzLCBpbnQ4X3QgKl9faXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl91aW50OF90IChYRFIgKl9feGRycywgdWludDhfdCAqX191cCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2ludDE2X3QgKFhEUiAqX194ZHJzLCBpbnQxNl90ICpfX2lwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdWludDE2X3QgKFhEUiAqX194ZHJzLCB1aW50MTZfdCAqX191cCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2ludDMyX3QgKFhEUiAqX194ZHJzLCBpbnQzMl90ICpfX2lwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdWludDMyX3QgKFhEUiAqX194ZHJzLCB1aW50MzJfdCAqX191cCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2ludDY0X3QgKFhEUiAqX194ZHJzLCBpbnQ2NF90ICpfX2lwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdWludDY0X3QgKFhEUiAqX194ZHJzLCB1aW50NjRfdCAqX191cCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3F1YWRfdCAoWERSICpfX3hkcnMsIHF1YWRfdCAqX19pcCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3VfcXVhZF90IChYRFIgKl9feGRycywgdV9xdWFkX3QgKl9fdXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9ib29sIChYRFIgKl9feGRycywgYm9vbF90ICpfX2JwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfZW51bSAoWERSICpfX3hkcnMsIGVudW1fdCAqX19lcCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2FycmF5IChYRFIgKiBfeGRycywgY2FkZHJfdCAqX19hZGRycCwgdV9pbnQgKl9fc2l6ZXAsCisJCQkgdV9pbnQgX19tYXhzaXplLCB1X2ludCBfX2Vsc2l6ZSwgeGRycHJvY190IF9fZWxwcm9jKQorICAgICBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfYnl0ZXMgKFhEUiAqX194ZHJzLCBjaGFyICoqX19jcHAsIHVfaW50ICpfX3NpemVwLAorCQkJIHVfaW50IF9fbWF4c2l6ZSkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX29wYXF1ZSAoWERSICpfX3hkcnMsIGNhZGRyX3QgX19jcCwgdV9pbnQgX19jbnQpIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9zdHJpbmcgKFhEUiAqX194ZHJzLCBjaGFyICoqX19jcHAsIHVfaW50IF9fbWF4c2l6ZSkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3VuaW9uIChYRFIgKl9feGRycywgZW51bV90ICpfX2RzY21wLCBjaGFyICpfX3VucCwKKwkJCSBfX2NvbnN0IHN0cnVjdCB4ZHJfZGlzY3JpbSAqX19jaG9pY2VzLAorCQkJIHhkcnByb2NfdCBfX2RmYXVsdCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2NoYXIgKFhEUiAqX194ZHJzLCBjaGFyICpfX2NwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdV9jaGFyIChYRFIgKl9feGRycywgdV9jaGFyICpfX2NwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdmVjdG9yIChYRFIgKl9feGRycywgY2hhciAqX19iYXNlcCwgdV9pbnQgX19uZWxlbSwKKwkJCSAgdV9pbnQgX19lbGVtc2l6ZSwgeGRycHJvY190IF9feGRyX2VsZW0pIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9mbG9hdCAoWERSICpfX3hkcnMsIGZsb2F0ICpfX2ZwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfZG91YmxlIChYRFIgKl9feGRycywgZG91YmxlICpfX2RwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmVmZXJlbmNlIChYRFIgKl9feGRycywgY2FkZHJfdCAqX194cHAsIHVfaW50IF9fc2l6ZSwKKwkJCSAgICAgeGRycHJvY190IF9fcHJvYykgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3BvaW50ZXIgKFhEUiAqX194ZHJzLCBjaGFyICoqX19vYmpwcCwKKwkJCSAgIHVfaW50IF9fb2JqX3NpemUsIHhkcnByb2NfdCBfX3hkcl9vYmopIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl93cmFwc3RyaW5nIChYRFIgKl9feGRycywgY2hhciAqKl9fY3BwKSBfX1RIUk9XOworZXh0ZXJuIHVfbG9uZyB4ZHJfc2l6ZW9mICh4ZHJwcm9jX3QsIHZvaWQgKikgX19USFJPVzsKKworLyoKKyAqIENvbW1vbiBvcGFxdWUgYnl0ZXMgb2JqZWN0cyB1c2VkIGJ5IG1hbnkgcnBjIHByb3RvY29sczsKKyAqIGRlY2xhcmVkIGhlcmUgZHVlIHRvIGNvbW1vbmFsaXR5LgorICovCisjZGVmaW5lIE1BWF9ORVRPQkpfU1ogMTAyNAorc3RydWN0IG5ldG9iagoreworICB1X2ludCBuX2xlbjsKKyAgY2hhciAqbl9ieXRlczsKK307Cit0eXBlZGVmIHN0cnVjdCBuZXRvYmogbmV0b2JqOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmV0b2JqIChYRFIgKl9feGRycywgc3RydWN0IG5ldG9iaiAqX19ucCkgX19USFJPVzsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgcHVibGljIHJvdXRpbmVzIGZvciB0aGUgdmFyaW91cyBpbXBsZW1lbnRhdGlvbnMgb2YKKyAqIHhkciBzdHJlYW1zLgorICovCisKKy8qIFhEUiB1c2luZyBtZW1vcnkgYnVmZmVycyAqLworZXh0ZXJuIHZvaWQgeGRybWVtX2NyZWF0ZSAoWERSICpfX3hkcnMsIF9fY29uc3QgY2FkZHJfdCBfX2FkZHIsCisJCQkgICB1X2ludCBfX3NpemUsIGVudW0geGRyX29wIF9feG9wKSBfX1RIUk9XOworCisvKiBYRFIgdXNpbmcgc3RkaW8gbGlicmFyeSAqLworZXh0ZXJuIHZvaWQgeGRyc3RkaW9fY3JlYXRlIChYRFIgKl9feGRycywgRklMRSAqX19maWxlLCBlbnVtIHhkcl9vcCBfX3hvcCkKKyAgICAgX19USFJPVzsKKworLyogWERSIHBzZXVkbyByZWNvcmRzIGZvciB0Y3AgKi8KK2V4dGVybiB2b2lkIHhkcnJlY19jcmVhdGUgKFhEUiAqX194ZHJzLCB1X2ludCBfX3NlbmRzaXplLAorCQkJICAgdV9pbnQgX19yZWN2c2l6ZSwgY2FkZHJfdCBfX3RjcF9oYW5kbGUsCisJCQkgICBpbnQgKCpfX3JlYWRpdCkgKGNoYXIgKiwgY2hhciAqLCBpbnQpLAorCQkJICAgaW50ICgqX193cml0ZWl0KSAoY2hhciAqLCBjaGFyICosIGludCkpIF9fVEhST1c7CisKKy8qIG1ha2UgZW5kIG9mIHhkciByZWNvcmQgKi8KK2V4dGVybiBib29sX3QgeGRycmVjX2VuZG9mcmVjb3JkIChYRFIgKl9feGRycywgYm9vbF90IF9fc2VuZG5vdykgX19USFJPVzsKKworLyogbW92ZSB0byBiZWdpbm5pbmcgb2YgbmV4dCByZWNvcmQgKi8KK2V4dGVybiBib29sX3QgeGRycmVjX3NraXByZWNvcmQgKFhEUiAqX194ZHJzKSBfX1RIUk9XOworCisvKiB0cnVlIGlmIG5vIG1vcmUgaW5wdXQgKi8KK2V4dGVybiBib29sX3QgeGRycmVjX2VvZiAoWERSICpfX3hkcnMpIF9fVEhST1c7CisKKy8qIGZyZWUgbWVtb3J5IGJ1ZmZlcnMgZm9yIHhkciAqLworZXh0ZXJuIHZvaWQgeGRyX2ZyZWUgKHhkcnByb2NfdCBfX3Byb2MsIGNoYXIgKl9fb2JqcCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHJwYy94ZHIuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvYm9vdHBhcmFtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ib290cGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzBmYThkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvYm9vdHBhcmFtLmgKQEAgLTAsMCArMSwyNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9SUENTVkNfQk9PVFBBUkFNX0gKKyNkZWZpbmUgX1JQQ1NWQ19CT09UUEFSQU1fSAorCisjaW5jbHVkZSA8cnBjc3ZjL2Jvb3RwYXJhbV9wcm90Lmg+CisKKyNlbmRpZiAgLyogX1JQQ1NWQ19CT09UUEFSQU1fSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ib290cGFyYW1fcHJvdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvYm9vdHBhcmFtX3Byb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmVkNDQ2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvYm9vdHBhcmFtX3Byb3QuaApAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9CT09UUEFSQU1fUFJPVF9IX1JQQ0dFTgorI2RlZmluZSBfQk9PVFBBUkFNX1BST1RfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxycGMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9lcnJuby5oPgorI2luY2x1ZGUgPG5mcy9uZnMuaD4KKyNkZWZpbmUgTUFYX01BQ0hJTkVfTkFNRSAyNTUKKyNkZWZpbmUgTUFYX1BBVEhfTEVOIDEwMjQKKyNkZWZpbmUgTUFYX0ZJTEVJRCAzMgorI2RlZmluZSBJUF9BRERSX1RZUEUgMQorCit0eXBlZGVmIGNoYXIgKmJwX21hY2hpbmVfbmFtZV90OworCit0eXBlZGVmIGNoYXIgKmJwX3BhdGhfdDsKKwordHlwZWRlZiBjaGFyICpicF9maWxlaWRfdDsKKworc3RydWN0IGlwX2FkZHJfdCB7CisJY2hhciBuZXQ7CisJY2hhciBob3N0OworCWNoYXIgbGg7CisJY2hhciBpbXBubzsKK307Cit0eXBlZGVmIHN0cnVjdCBpcF9hZGRyX3QgaXBfYWRkcl90OworCitzdHJ1Y3QgYnBfYWRkcmVzcyB7CisJaW50IGFkZHJlc3NfdHlwZTsKKwl1bmlvbiB7CisJCWlwX2FkZHJfdCBpcF9hZGRyOworCX0gYnBfYWRkcmVzc191OworfTsKK3R5cGVkZWYgc3RydWN0IGJwX2FkZHJlc3MgYnBfYWRkcmVzczsKKworc3RydWN0IGJwX3dob2FtaV9hcmcgeworCWJwX2FkZHJlc3MgY2xpZW50X2FkZHJlc3M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgYnBfd2hvYW1pX2FyZyBicF93aG9hbWlfYXJnOworCitzdHJ1Y3QgYnBfd2hvYW1pX3JlcyB7CisJYnBfbWFjaGluZV9uYW1lX3QgY2xpZW50X25hbWU7CisJYnBfbWFjaGluZV9uYW1lX3QgZG9tYWluX25hbWU7CisJYnBfYWRkcmVzcyByb3V0ZXJfYWRkcmVzczsKK307Cit0eXBlZGVmIHN0cnVjdCBicF93aG9hbWlfcmVzIGJwX3dob2FtaV9yZXM7CisKK3N0cnVjdCBicF9nZXRmaWxlX2FyZyB7CisJYnBfbWFjaGluZV9uYW1lX3QgY2xpZW50X25hbWU7CisJYnBfZmlsZWlkX3QgZmlsZV9pZDsKK307Cit0eXBlZGVmIHN0cnVjdCBicF9nZXRmaWxlX2FyZyBicF9nZXRmaWxlX2FyZzsKKworc3RydWN0IGJwX2dldGZpbGVfcmVzIHsKKwlicF9tYWNoaW5lX25hbWVfdCBzZXJ2ZXJfbmFtZTsKKwlicF9hZGRyZXNzIHNlcnZlcl9hZGRyZXNzOworCWJwX3BhdGhfdCBzZXJ2ZXJfcGF0aDsKK307Cit0eXBlZGVmIHN0cnVjdCBicF9nZXRmaWxlX3JlcyBicF9nZXRmaWxlX3JlczsKKworI2RlZmluZSBCT09UUEFSQU1QUk9HIDEwMDAyNgorI2RlZmluZSBCT09UUEFSQU1WRVJTIDEKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIEJPT1RQQVJBTVBST0NfV0hPQU1JIDEKK2V4dGVybiAgYnBfd2hvYW1pX3JlcyAqIGJvb3RwYXJhbXByb2Nfd2hvYW1pXzEoYnBfd2hvYW1pX2FyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIGJwX3dob2FtaV9yZXMgKiBib290cGFyYW1wcm9jX3dob2FtaV8xX3N2YyhicF93aG9hbWlfYXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBCT09UUEFSQU1QUk9DX0dFVEZJTEUgMgorZXh0ZXJuICBicF9nZXRmaWxlX3JlcyAqIGJvb3RwYXJhbXByb2NfZ2V0ZmlsZV8xKGJwX2dldGZpbGVfYXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAgYnBfZ2V0ZmlsZV9yZXMgKiBib290cGFyYW1wcm9jX2dldGZpbGVfMV9zdmMoYnBfZ2V0ZmlsZV9hcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IGJvb3RwYXJhbXByb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIEJPT1RQQVJBTVBST0NfV0hPQU1JIDEKK2V4dGVybiAgYnBfd2hvYW1pX3JlcyAqIGJvb3RwYXJhbXByb2Nfd2hvYW1pXzEoKTsKK2V4dGVybiAgYnBfd2hvYW1pX3JlcyAqIGJvb3RwYXJhbXByb2Nfd2hvYW1pXzFfc3ZjKCk7CisjZGVmaW5lIEJPT1RQQVJBTVBST0NfR0VURklMRSAyCitleHRlcm4gIGJwX2dldGZpbGVfcmVzICogYm9vdHBhcmFtcHJvY19nZXRmaWxlXzEoKTsKK2V4dGVybiAgYnBfZ2V0ZmlsZV9yZXMgKiBib290cGFyYW1wcm9jX2dldGZpbGVfMV9zdmMoKTsKK2V4dGVybiBpbnQgYm9vdHBhcmFtcHJvZ18xX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKworLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGJvb2xfdCB4ZHJfYnBfbWFjaGluZV9uYW1lX3QgKFhEUiAqLCBicF9tYWNoaW5lX25hbWVfdCopOworZXh0ZXJuICBib29sX3QgeGRyX2JwX3BhdGhfdCAoWERSICosIGJwX3BhdGhfdCopOworZXh0ZXJuICBib29sX3QgeGRyX2JwX2ZpbGVpZF90IChYRFIgKiwgYnBfZmlsZWlkX3QqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9pcF9hZGRyX3QgKFhEUiAqLCBpcF9hZGRyX3QqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9icF9hZGRyZXNzIChYRFIgKiwgYnBfYWRkcmVzcyopOworZXh0ZXJuICBib29sX3QgeGRyX2JwX3dob2FtaV9hcmcgKFhEUiAqLCBicF93aG9hbWlfYXJnKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfYnBfd2hvYW1pX3JlcyAoWERSICosIGJwX3dob2FtaV9yZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9icF9nZXRmaWxlX2FyZyAoWERSICosIGJwX2dldGZpbGVfYXJnKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfYnBfZ2V0ZmlsZV9yZXMgKFhEUiAqLCBicF9nZXRmaWxlX3JlcyopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfYnBfbWFjaGluZV9uYW1lX3QgKCk7CitleHRlcm4gYm9vbF90IHhkcl9icF9wYXRoX3QgKCk7CitleHRlcm4gYm9vbF90IHhkcl9icF9maWxlaWRfdCAoKTsKK2V4dGVybiBib29sX3QgeGRyX2lwX2FkZHJfdCAoKTsKK2V4dGVybiBib29sX3QgeGRyX2JwX2FkZHJlc3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9icF93aG9hbWlfYXJnICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfYnBfd2hvYW1pX3JlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2JwX2dldGZpbGVfYXJnICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfYnBfZ2V0ZmlsZV9yZXMgKCk7CisKKyNlbmRpZiAvKiBLJlIgQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9CT09UUEFSQU1fUFJPVF9IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvYm9vdHBhcmFtX3Byb3QueCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2Jvb3RwYXJhbV9wcm90LngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3ZTQyOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2Jvb3RwYXJhbV9wcm90LngKQEAgLTAsMCArMSw5NyBAQAorLyogQCgjKWJvb3RwYXJhbV9wcm90LngJMi4xIDg4LzA4LzAxIDQuMCBSUENTUkMgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFJQQyBmb3IgYm9vdHBhcm1zIHNlcnZpY2UuCisgKiBUaGVyZSBhcmUgdHdvIHByb2NlZHVyZXM6CisgKiAgIFdIT0FNSSB0YWtlcyBhIG5ldCBhZGRyZXNzIGFuZCByZXR1cm5zIGEgY2xpZW50IG5hbWUgYW5kIGFsc28gYQorICoJbGlrZWx5IG5ldCBhZGRyZXNzIGZvciByb3V0aW5nCisgKiAgIEdFVEZJTEUgdGFrZXMgYSBjbGllbnQgbmFtZSBhbmQgZmlsZSBpZGVudGlmaWVyIGFuZCByZXR1cm5zIHRoZQorICoJc2VydmVyIG5hbWUsIHNlcnZlciBuZXQgYWRkcmVzcyBhbmQgcGF0aG5hbWUgZm9yIHRoZSBmaWxlLgorICogICBmaWxlIGlkZW50aWZpZXJzIHR5cGljYWxseSBpbmNsdWRlIHJvb3QsIHN3YXAsIHB1YiBhbmQgZHVtcAorICovCisKKyNpZmRlZiBSUENfSERSCislI2luY2x1ZGUgPHJwYy90eXBlcy5oPgorJSNpbmNsdWRlIDxzeXMvdGltZS5oPgorJSNpbmNsdWRlIDxzeXMvZXJybm8uaD4KKyUjaW5jbHVkZSA8bmZzL25mcy5oPgorI2VuZGlmCisKK2NvbnN0IE1BWF9NQUNISU5FX05BTUUgID0gMjU1OworY29uc3QgTUFYX1BBVEhfTEVOCT0gMTAyNDsKK2NvbnN0IE1BWF9GSUxFSUQJPSAzMjsKK2NvbnN0IElQX0FERFJfVFlQRQk9IDE7CisKK3R5cGVkZWYJc3RyaW5nCWJwX21hY2hpbmVfbmFtZV90PE1BWF9NQUNISU5FX05BTUU+OwordHlwZWRlZglzdHJpbmcJYnBfcGF0aF90PE1BWF9QQVRIX0xFTj47Cit0eXBlZGVmCXN0cmluZwlicF9maWxlaWRfdDxNQVhfRklMRUlEPjsKKworc3RydWN0CWlwX2FkZHJfdCB7CisJY2hhcgluZXQ7CisJY2hhcglob3N0OworCWNoYXIJbGg7CisJY2hhcglpbXBubzsKK307CisKK3VuaW9uIGJwX2FkZHJlc3Mgc3dpdGNoIChpbnQgYWRkcmVzc190eXBlKSB7CisJY2FzZSBJUF9BRERSX1RZUEU6CisJCWlwX2FkZHJfdAlpcF9hZGRyOworfTsKKworc3RydWN0IGJwX3dob2FtaV9hcmcgeworCWJwX2FkZHJlc3MJCWNsaWVudF9hZGRyZXNzOworfTsKKworc3RydWN0IGJwX3dob2FtaV9yZXMgeworCWJwX21hY2hpbmVfbmFtZV90CWNsaWVudF9uYW1lOworCWJwX21hY2hpbmVfbmFtZV90CWRvbWFpbl9uYW1lOworCWJwX2FkZHJlc3MJCXJvdXRlcl9hZGRyZXNzOworfTsKKworc3RydWN0IGJwX2dldGZpbGVfYXJnIHsKKwlicF9tYWNoaW5lX25hbWVfdAljbGllbnRfbmFtZTsKKwlicF9maWxlaWRfdAkJZmlsZV9pZDsKK307CisKK3N0cnVjdCBicF9nZXRmaWxlX3JlcyB7CisJYnBfbWFjaGluZV9uYW1lX3QJc2VydmVyX25hbWU7CisJYnBfYWRkcmVzcwkJc2VydmVyX2FkZHJlc3M7CisJYnBfcGF0aF90CQlzZXJ2ZXJfcGF0aDsKK307CisKK3Byb2dyYW0gQk9PVFBBUkFNUFJPRyB7CisJdmVyc2lvbiBCT09UUEFSQU1WRVJTIHsKKwkJYnBfd2hvYW1pX3JlcwlCT09UUEFSQU1QUk9DX1dIT0FNSShicF93aG9hbWlfYXJnKSA9IDE7CisJCWJwX2dldGZpbGVfcmVzCUJPT1RQQVJBTVBST0NfR0VURklMRShicF9nZXRmaWxlX2FyZykgPSAyOworCX0gPSAxOworfSA9IDEwMDAyNjsKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2tleV9wcm90LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9rZXlfcHJvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYmRiZjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9rZXlfcHJvdC5oCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KKyAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgorICovCisKKyNpZm5kZWYgX0tFWV9QUk9UX0hfUlBDR0VOCisjZGVmaW5lIF9LRVlfUFJPVF9IX1JQQ0dFTgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIDAKKyNwcmFnbWEgaWRlbnQgIkAoIylrZXlfcHJvdC54CTEuNwk5NC8wNC8yOSBTTUkiCisjZW5kaWYKKworLyogQ29weXJpZ2h0IChjKSAgMTk5MCwgMTk5MSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICovCisKKy8qCisgKiBDb21waWxlZCBmcm9tIGtleV9wcm90LnggdXNpbmcgcnBjZ2VuLgorICogRE8gTk9UIEVESVQgVEhJUyBGSUxFIQorICogVGhpcyBpcyBOT1Qgc291cmNlIGNvZGUhCisgKi8KKyNkZWZpbmUgUFJPT1QgMworI2RlZmluZSBIRVhNT0RVTFVTICJkNGEwYmEwMjUwYjZmZDJlYzYyNmU3ZWZkNjM3ZGY3NmM3MTZlMjJkMDk0NGI4OGIiCisjZGVmaW5lIEhFWEtFWUJZVEVTIDQ4CisjZGVmaW5lIEtFWVNJWkUgMTkyCisjZGVmaW5lIEtFWUJZVEVTIDI0CisjZGVmaW5lIEtFWUNIRUNLU1VNU0laRSAxNgorCitlbnVtIGtleXN0YXR1cyB7CisJS0VZX1NVQ0NFU1MgPSAwLAorCUtFWV9OT1NFQ1JFVCA9IDEsCisJS0VZX1VOS05PV04gPSAyLAorCUtFWV9TWVNURU1FUlIgPSAzLAorfTsKK3R5cGVkZWYgZW51bSBrZXlzdGF0dXMga2V5c3RhdHVzOworCit0eXBlZGVmIGNoYXIga2V5YnVmW0hFWEtFWUJZVEVTXTsKKwordHlwZWRlZiBjaGFyICpuZXRuYW1lc3RyOworCitzdHJ1Y3QgY3J5cHRrZXlhcmcgeworCW5ldG5hbWVzdHIgcmVtb3RlbmFtZTsKKwlkZXNfYmxvY2sgZGVza2V5OworfTsKK3R5cGVkZWYgc3RydWN0IGNyeXB0a2V5YXJnIGNyeXB0a2V5YXJnOworCitzdHJ1Y3QgY3J5cHRrZXlhcmcyIHsKKwluZXRuYW1lc3RyIHJlbW90ZW5hbWU7CisJbmV0b2JqIHJlbW90ZWtleTsKKwlkZXNfYmxvY2sgZGVza2V5OworfTsKK3R5cGVkZWYgc3RydWN0IGNyeXB0a2V5YXJnMiBjcnlwdGtleWFyZzI7CisKK3N0cnVjdCBjcnlwdGtleXJlcyB7CisJa2V5c3RhdHVzIHN0YXR1czsKKwl1bmlvbiB7CisJCWRlc19ibG9jayBkZXNrZXk7CisJfSBjcnlwdGtleXJlc191OworfTsKK3R5cGVkZWYgc3RydWN0IGNyeXB0a2V5cmVzIGNyeXB0a2V5cmVzOworI2RlZmluZSBNQVhHSURTIDE2CisKK3N0cnVjdCB1bml4Y3JlZCB7CisJdV9pbnQgdWlkOworCXVfaW50IGdpZDsKKwlzdHJ1Y3QgeworCQl1X2ludCBnaWRzX2xlbjsKKwkJdV9pbnQgKmdpZHNfdmFsOworCX0gZ2lkczsKK307Cit0eXBlZGVmIHN0cnVjdCB1bml4Y3JlZCB1bml4Y3JlZDsKKworc3RydWN0IGdldGNyZWRyZXMgeworCWtleXN0YXR1cyBzdGF0dXM7CisJdW5pb24geworCQl1bml4Y3JlZCBjcmVkOworCX0gZ2V0Y3JlZHJlc191OworfTsKK3R5cGVkZWYgc3RydWN0IGdldGNyZWRyZXMgZ2V0Y3JlZHJlczsKKworc3RydWN0IGtleV9uZXRzdGFyZyB7CisJa2V5YnVmIHN0X3ByaXZfa2V5OworCWtleWJ1ZiBzdF9wdWJfa2V5OworCW5ldG5hbWVzdHIgc3RfbmV0bmFtZTsKK307Cit0eXBlZGVmIHN0cnVjdCBrZXlfbmV0c3Rhcmcga2V5X25ldHN0YXJnOworCitzdHJ1Y3Qga2V5X25ldHN0cmVzIHsKKwlrZXlzdGF0dXMgc3RhdHVzOworCXVuaW9uIHsKKwkJa2V5X25ldHN0YXJnIGtuZXQ7CisJfSBrZXlfbmV0c3RyZXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBrZXlfbmV0c3RyZXMga2V5X25ldHN0cmVzOworCisjaWZuZGVmIG9wYXF1ZQorI2RlZmluZSBvcGFxdWUgY2hhcgorI2VuZGlmCisKKworI2RlZmluZSBLRVlfUFJPRyAxMDAwMjkKKyNkZWZpbmUgS0VZX1ZFUlMgMQorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgS0VZX1NFVCAxCitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMShjaGFyICosIENMSUVOVCAqKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8xX3N2YyhjaGFyICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfRU5DUllQVCAyCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMShjcnlwdGtleWFyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMV9zdmMoY3J5cHRrZXlhcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9ERUNSWVBUIDMKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8xKGNyeXB0a2V5YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8xX3N2YyhjcnlwdGtleWFyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX0dFTiA0CitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMSh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VUQ1JFRCA1CitleHRlcm4gIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8xKG5ldG5hbWVzdHIgKiwgQ0xJRU5UICopOworZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMV9zdmMobmV0bmFtZXN0ciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQga2V5X3Byb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIEtFWV9TRVQgMQorZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzEoKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8xX3N2YygpOworI2RlZmluZSBLRVlfRU5DUllQVCAyCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMSgpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzFfc3ZjKCk7CisjZGVmaW5lIEtFWV9ERUNSWVBUIDMKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8xKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMV9zdmMoKTsKKyNkZWZpbmUgS0VZX0dFTiA0CitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMSgpOworZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzFfc3ZjKCk7CisjZGVmaW5lIEtFWV9HRVRDUkVEIDUKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzEoKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzFfc3ZjKCk7CitleHRlcm4gaW50IGtleV9wcm9nXzFfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworI2RlZmluZSBLRVlfVkVSUzIgMgorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8yKGNoYXIgKiwgQ0xJRU5UICopOworZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzJfc3ZjKGNoYXIgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMihjcnlwdGtleWFyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMl9zdmMoY3J5cHRrZXlhcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMihjcnlwdGtleWFyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMl9zdmMoY3J5cHRrZXlhcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMihuZXRuYW1lc3RyICosIENMSUVOVCAqKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzJfc3ZjKG5ldG5hbWVzdHIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9FTkNSWVBUX1BLIDYKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF9wa18yKGNyeXB0a2V5YXJnMiAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfcGtfMl9zdmMoY3J5cHRrZXlhcmcyICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfREVDUllQVF9QSyA3CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfcGtfMihjcnlwdGtleWFyZzIgKiwgQ0xJRU5UICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0X3BrXzJfc3ZjKGNyeXB0a2V5YXJnMiAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX05FVF9QVVQgOAorZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfbmV0X3B1dF8yKGtleV9uZXRzdGFyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9uZXRfcHV0XzJfc3ZjKGtleV9uZXRzdGFyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX05FVF9HRVQgOQorZXh0ZXJuICBrZXlfbmV0c3RyZXMgKiBrZXlfbmV0X2dldF8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBrZXlfbmV0c3RyZXMgKiBrZXlfbmV0X2dldF8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VUX0NPTlYgMTAKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZ2V0X2NvbnZfMihjaGFyICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZ2V0X2NvbnZfMl9zdmMoY2hhciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQga2V5X3Byb2dfMl9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMigpOworZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzJfc3ZjKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMigpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzJfc3ZjKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMigpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzJfc3ZjKCk7CitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMigpOworZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzJfc3ZjKCk7CitleHRlcm4gIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8yKCk7CitleHRlcm4gIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8yX3N2YygpOworI2RlZmluZSBLRVlfRU5DUllQVF9QSyA2CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfcGtfMigpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0X3BrXzJfc3ZjKCk7CisjZGVmaW5lIEtFWV9ERUNSWVBUX1BLIDcKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF9wa18yKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfcGtfMl9zdmMoKTsKKyNkZWZpbmUgS0VZX05FVF9QVVQgOAorZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfbmV0X3B1dF8yKCk7CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9uZXRfcHV0XzJfc3ZjKCk7CisjZGVmaW5lIEtFWV9ORVRfR0VUIDkKK2V4dGVybiAga2V5X25ldHN0cmVzICoga2V5X25ldF9nZXRfMigpOworZXh0ZXJuICBrZXlfbmV0c3RyZXMgKiBrZXlfbmV0X2dldF8yX3N2YygpOworI2RlZmluZSBLRVlfR0VUX0NPTlYgMTAKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZ2V0X2NvbnZfMigpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9nZXRfY29udl8yX3N2YygpOworZXh0ZXJuIGludCBrZXlfcHJvZ18yX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKworLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGJvb2xfdCB4ZHJfa2V5c3RhdHVzIChYRFIgKiwga2V5c3RhdHVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfa2V5YnVmIChYRFIgKiwga2V5YnVmKTsKK2V4dGVybiAgYm9vbF90IHhkcl9uZXRuYW1lc3RyIChYRFIgKiwgbmV0bmFtZXN0ciopOworZXh0ZXJuICBib29sX3QgeGRyX2NyeXB0a2V5YXJnIChYRFIgKiwgY3J5cHRrZXlhcmcqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9jcnlwdGtleWFyZzIgKFhEUiAqLCBjcnlwdGtleWFyZzIqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9jcnlwdGtleXJlcyAoWERSICosIGNyeXB0a2V5cmVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfdW5peGNyZWQgKFhEUiAqLCB1bml4Y3JlZCopOworZXh0ZXJuICBib29sX3QgeGRyX2dldGNyZWRyZXMgKFhEUiAqLCBnZXRjcmVkcmVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfa2V5X25ldHN0YXJnIChYRFIgKiwga2V5X25ldHN0YXJnKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfa2V5X25ldHN0cmVzIChYRFIgKiwga2V5X25ldHN0cmVzKik7CisKKyNlbHNlIC8qIEsmUiBDICovCitleHRlcm4gYm9vbF90IHhkcl9rZXlzdGF0dXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9rZXlidWYgKCk7CitleHRlcm4gYm9vbF90IHhkcl9uZXRuYW1lc3RyICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfY3J5cHRrZXlhcmcgKCk7CitleHRlcm4gYm9vbF90IHhkcl9jcnlwdGtleWFyZzIgKCk7CitleHRlcm4gYm9vbF90IHhkcl9jcnlwdGtleXJlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3VuaXhjcmVkICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZ2V0Y3JlZHJlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2tleV9uZXRzdGFyZyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2tleV9uZXRzdHJlcyAoKTsKKworI2VuZGlmIC8qIEsmUiBDICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhX0tFWV9QUk9UX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9rZXlfcHJvdC54IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMva2V5X3Byb3QueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmFmOTQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMva2V5X3Byb3QueApAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIEtleSBzZXJ2ZXIgcHJvdG9jb2wgZGVmaW5pdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGtleXNlcnZlciBpcyBhIHB1YmxpYyBrZXkgc3RvcmFnZS9lbmNyeXB0aW9uL2RlY3J5cHRpb24gc2VydmljZQorICogVGhlIGVuY3J5cHRpb24gbWV0aG9kIHVzZWQgaXMgYmFzZWQgb24gdGhlIERpZmZpZS1IZWxsbWFuIGV4cG9uZW50aWFsCisgKiBrZXkgZXhjaGFuZ2UgdGVjaG5vbG9neS4KKyAqCisgKiBUaGUga2V5IHNlcnZlciBpcyBsb2NhbCB0byBlYWNoIG1hY2hpbmUsIGFraW4gdG8gdGhlIHBvcnRtYXBwZXIuCisgKiBVbmRlciBUSS1SUEMsIGNvbW11bmljYXRpb24gd2l0aCB0aGUga2V5c2VydmVyIGlzIHRocm91Z2ggdGhlCisgKiBsb29wYmFjayB0cmFuc3BvcnQuCisgKgorICogTk9URTogVGhpcyAueCBmaWxlIGdlbmVyYXRlcyB0aGUgVVNFUiBsZXZlbCBoZWFkZXJzIGZvciB0aGUga2V5c2VydmVyLgorICogdGhlIEtFUk5FTCBsZXZlbCBoZWFkZXJzIGFyZSBjcmVhdGVkIGJ5IGhhbmQgYXMgdGhleSBrZXJuZWwgaGFzIHNwZWNpYWwKKyAqIHJlcXVpcmVtZW50cy4KKyAqLworCislI2lmIDAKKyUjcHJhZ21hIGlkZW50CSJAKCMpa2V5X3Byb3QueAkxLjcJOTQvMDQvMjkgU01JIgorJSNlbmRpZgorJQorJS8qIENvcHlyaWdodCAoYykgIDE5OTAsIDE5OTEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAqLworJQorJS8qCislICogQ29tcGlsZWQgZnJvbSBrZXlfcHJvdC54IHVzaW5nIHJwY2dlbi4KKyUgKiBETyBOT1QgRURJVCBUSElTIEZJTEUhCislICogVGhpcyBpcyBOT1Qgc291cmNlIGNvZGUhCislICovCisKKy8qCisgKiBQUk9PVCBhbmQgTU9EVUxVUyBkZWZpbmUgdGhlIHdheSB0aGUgRGlmZmllLUhlbGxtYW4ga2V5IGlzIGdlbmVyYXRlZC4KKyAqCisgKiBNT0RVTFVTIHNob3VsZCBiZSBjaG9zZW4gYXMgYSBwcmltZSBvZiB0aGUgZm9ybTogTU9EVUxVUyA9PSAyKnAgKyAxLAorICogd2hlcmUgcCBpcyBhbHNvIHByaW1lLgorICoKKyAqIFBST09UIHNhdGlzZmllcyB0aGUgZm9sbG93aW5nIHR3byBjb25kaXRpb25zOgorICogKDEpIChQUk9PVCAqKiAyKSAlIE1PRFVMVVMgIT0gMQorICogKDIpIChQUk9PVCAqKiBwKSAlIE1PRFVMVVMgIT0gMQorICoKKyAqLworCitjb25zdCBQUk9PVCA9IDM7Citjb25zdCBIRVhNT0RVTFVTID0gImQ0YTBiYTAyNTBiNmZkMmVjNjI2ZTdlZmQ2MzdkZjc2YzcxNmUyMmQwOTQ0Yjg4YiI7CisKK2NvbnN0IEhFWEtFWUJZVEVTID0gNDg7CQkvKiBIRVhLRVlCWVRFUyA9PSBzdHJsZW4oSEVYTU9EVUxVUykgKi8KK2NvbnN0IEtFWVNJWkUgPSAxOTI7CQkvKiBLRVlTSVpFID09IGJpdCBsZW5ndGggb2Yga2V5ICovCitjb25zdCBLRVlCWVRFUyA9IDI0OwkJLyogYnl0ZSBsZW5ndGggb2Yga2V5ICovCisKKy8qCisgKiBUaGUgZmlyc3QgMTYgaGV4IGRpZ2l0cyBvZiB0aGUgZW5jcnlwdGVkIHNlY3JldCBrZXkgYXJlIHVzZWQgYXMKKyAqIGEgY2hlY2tzdW0gaW4gdGhlIGRhdGFiYXNlLgorICovCitjb25zdCBLRVlDSEVDS1NVTVNJWkUgPSAxNjsKKworLyoKKyAqIHN0YXR1cyBvZiBvcGVyYXRpb24KKyAqLworZW51bSBrZXlzdGF0dXMgeworCUtFWV9TVUNDRVNTLAkvKiBubyBwcm9ibGVtcyAqLworCUtFWV9OT1NFQ1JFVCwJLyogbm8gc2VjcmV0IGtleSBzdG9yZWQgKi8KKwlLRVlfVU5LTk9XTiwJLyogdW5rbm93biBuZXRuYW1lICovCisJS0VZX1NZU1RFTUVSUiAJLyogc3lzdGVtIGVycm9yIChvdXQgb2YgbWVtb3J5LCBlbmNyeXB0aW9uIGZhaWx1cmUpICovCit9OworCit0eXBlZGVmIG9wYXF1ZSBrZXlidWZbSEVYS0VZQllURVNdOwkvKiBzdG9yZSBrZXkgaW4gaGV4ICovCisKK3R5cGVkZWYgc3RyaW5nIG5ldG5hbWVzdHI8TUFYTkVUTkFNRUxFTj47CisKKy8qCisgKiBBcmd1bWVudCB0byBFTkNSWVBUIG9yIERFQ1JZUFQKKyAqLworc3RydWN0IGNyeXB0a2V5YXJnIHsKKwluZXRuYW1lc3RyIHJlbW90ZW5hbWU7CisJZGVzX2Jsb2NrIGRlc2tleTsKK307CisKKy8qCisgKiBBcmd1bWVudCB0byBFTkNSWVBUX1BLIG9yIERFQ1JZUFRfUEsKKyAqLworc3RydWN0IGNyeXB0a2V5YXJnMiB7CisJbmV0bmFtZXN0ciByZW1vdGVuYW1lOworCW5ldG9iaglyZW1vdGVrZXk7CS8qIENvbnRhaW5zIGEgbGVuZ3RoIHVwIHRvIDEwMjQgYnl0ZXMgKi8KKwlkZXNfYmxvY2sgZGVza2V5OworfTsKKworCisvKgorICogUmVzdWx0IG9mIEVOQ1JZUFQsIERFQ1JZUFQsIEVOQ1JZUFRfUEssIGFuZCBERUNSWVBUX1BLCisgKi8KK3VuaW9uIGNyeXB0a2V5cmVzIHN3aXRjaCAoa2V5c3RhdHVzIHN0YXR1cykgeworY2FzZSBLRVlfU1VDQ0VTUzoKKwlkZXNfYmxvY2sgZGVza2V5OworZGVmYXVsdDoKKwl2b2lkOworfTsKKworY29uc3QgTUFYR0lEUyAgPSAxNjsJLyogbWF4IG51bWJlciBvZiBnaWRzIGluIGdpZCBsaXN0ICovCisKKy8qCisgKiBVbml4IGNyZWRlbnRpYWwKKyAqLworc3RydWN0IHVuaXhjcmVkIHsKKwl1X2ludCB1aWQ7CisJdV9pbnQgZ2lkOworCXVfaW50IGdpZHM8TUFYR0lEUz47Cit9OworCisvKgorICogUmVzdWx0IHJldHVybmVkIGZyb20gR0VUQ1JFRAorICovCit1bmlvbiBnZXRjcmVkcmVzIHN3aXRjaCAoa2V5c3RhdHVzIHN0YXR1cykgeworY2FzZSBLRVlfU1VDQ0VTUzoKKwl1bml4Y3JlZCBjcmVkOworZGVmYXVsdDoKKwl2b2lkOworfTsKKy8qCisgKiBrZXlfbmV0c3Rhcmc7CisgKi8KKworc3RydWN0IGtleV9uZXRzdGFyZyB7CisJa2V5YnVmIHN0X3ByaXZfa2V5OworCWtleWJ1ZiBzdF9wdWJfa2V5OworCW5ldG5hbWVzdHIgc3RfbmV0bmFtZTsKK307CisKK3VuaW9uIGtleV9uZXRzdHJlcyBzd2l0Y2ggKGtleXN0YXR1cyBzdGF0dXMpeworY2FzZSBLRVlfU1VDQ0VTUzoKKwlrZXlfbmV0c3Rhcmcga25ldDsKK2RlZmF1bHQ6CisJdm9pZDsKK307CisKKyNpZmRlZiBSUENfSERSCislCislI2lmbmRlZiBvcGFxdWUKKyUjZGVmaW5lIG9wYXF1ZSBjaGFyCislI2VuZGlmCislCisjZW5kaWYKK3Byb2dyYW0gS0VZX1BST0cgeworCXZlcnNpb24gS0VZX1ZFUlMgeworCisJCS8qCisJCSAqIFRoaXMgaXMgbXkgc2VjcmV0IGtleS4KKwkgCSAqIFN0b3JlIGl0IGZvciBtZS4KKwkJICovCisJCWtleXN0YXR1cworCQlLRVlfU0VUKGtleWJ1ZikgPSAxOworCisJCS8qCisJCSAqIEkgd2FudCB0byB0YWxrIHRvIFguCisJCSAqIEVuY3J5cHQgYSBjb252ZXJzYXRpb24ga2V5IGZvciBtZS4KKwkgCSAqLworCQljcnlwdGtleXJlcworCQlLRVlfRU5DUllQVChjcnlwdGtleWFyZykgPSAyOworCisJCS8qCisJCSAqIFgganVzdCBzZW50IG1lIGEgbWVzc2FnZS4KKwkJICogRGVjcnlwdCB0aGUgY29udmVyc2F0aW9uIGtleSBmb3IgbWUuCisJCSAqLworCQljcnlwdGtleXJlcworCQlLRVlfREVDUllQVChjcnlwdGtleWFyZykgPSAzOworCisJCS8qCisJCSAqIEdlbmVyYXRlIGEgc2VjdXJlIGNvbnZlcnNhdGlvbiBrZXkgZm9yIG1lCisJCSAqLworCQlkZXNfYmxvY2sKKwkJS0VZX0dFTih2b2lkKSA9IDQ7CisKKwkJLyoKKwkJICogR2V0IG1lIHRoZSB1aWQsIGdpZCBhbmQgZ3JvdXAtYWNjZXNzLWxpc3QgYXNzb2NpYXRlZAorCQkgKiB3aXRoIHRoaXMgbmV0bmFtZSAoZm9yIGtlcm5lbCB3aGljaCBjYW5ub3QgdXNlIE5JUykKKwkJICovCisJCWdldGNyZWRyZXMKKwkJS0VZX0dFVENSRUQobmV0bmFtZXN0cikgPSA1OworCX0gPSAxOworCXZlcnNpb24gS0VZX1ZFUlMyIHsKKworCQkvKgorCQkgKiAjIyMjIyMjCisJCSAqIFByb2NlZHVyZXMgMS01IGFyZSBpZGVudGljYWwgdG8gdmVyc2lvbiAxCisJCSAqICMjIyMjIyMKKwkJICovCisKKwkJLyoKKwkJICogVGhpcyBpcyBteSBzZWNyZXQga2V5LgorCSAJICogU3RvcmUgaXQgZm9yIG1lLgorCQkgKi8KKwkJa2V5c3RhdHVzCisJCUtFWV9TRVQoa2V5YnVmKSA9IDE7CisKKwkJLyoKKwkJICogSSB3YW50IHRvIHRhbGsgdG8gWC4KKwkJICogRW5jcnlwdCBhIGNvbnZlcnNhdGlvbiBrZXkgZm9yIG1lLgorCSAJICovCisJCWNyeXB0a2V5cmVzCisJCUtFWV9FTkNSWVBUKGNyeXB0a2V5YXJnKSA9IDI7CisKKwkJLyoKKwkJICogWCBqdXN0IHNlbnQgbWUgYSBtZXNzYWdlLgorCQkgKiBEZWNyeXB0IHRoZSBjb252ZXJzYXRpb24ga2V5IGZvciBtZS4KKwkJICovCisJCWNyeXB0a2V5cmVzCisJCUtFWV9ERUNSWVBUKGNyeXB0a2V5YXJnKSA9IDM7CisKKwkJLyoKKwkJICogR2VuZXJhdGUgYSBzZWN1cmUgY29udmVyc2F0aW9uIGtleSBmb3IgbWUKKwkJICovCisJCWRlc19ibG9jaworCQlLRVlfR0VOKHZvaWQpID0gNDsKKworCQkvKgorCQkgKiBHZXQgbWUgdGhlIHVpZCwgZ2lkIGFuZCBncm91cC1hY2Nlc3MtbGlzdCBhc3NvY2lhdGVkCisJCSAqIHdpdGggdGhpcyBuZXRuYW1lIChmb3Iga2VybmVsIHdoaWNoIGNhbm5vdCB1c2UgTklTKQorCQkgKi8KKwkJZ2V0Y3JlZHJlcworCQlLRVlfR0VUQ1JFRChuZXRuYW1lc3RyKSA9IDU7CisKKwkJLyoKKwkJICogSSB3YW50IHRvIHRhbGsgdG8gWC4gYW5kIEkga25vdyBYJ3MgcHVibGljIGtleQorCQkgKiBFbmNyeXB0IGEgY29udmVyc2F0aW9uIGtleSBmb3IgbWUuCisJIAkgKi8KKwkJY3J5cHRrZXlyZXMKKwkJS0VZX0VOQ1JZUFRfUEsoY3J5cHRrZXlhcmcyKSA9IDY7CisKKwkJLyoKKwkJICogWCBqdXN0IHNlbnQgbWUgYSBtZXNzYWdlLiBhbmQgSSBrbm93IFgncyBwdWJsaWMga2V5CisJCSAqIERlY3J5cHQgdGhlIGNvbnZlcnNhdGlvbiBrZXkgZm9yIG1lLgorCQkgKi8KKwkJY3J5cHRrZXlyZXMKKwkJS0VZX0RFQ1JZUFRfUEsoY3J5cHRrZXlhcmcyKSA9IDc7CisKKwkJLyoKKwkJICogU3RvcmUgbXkgcHVibGljIGtleSwgbmV0bmFtZSBhbmQgcHJpdmF0ZSBrZXkuCisJCSAqLworCQlrZXlzdGF0dXMKKwkJS0VZX05FVF9QVVQoa2V5X25ldHN0YXJnKSA9IDg7CisKKwkJLyoKKwkJICogUmV0cmlldmUgbXkgcHVibGljIGtleSwgbmV0bmFtZSBhbmQgcHJpdmF0ZSBrZXkuCisJCSAqLworIAkJa2V5X25ldHN0cmVzCisJCUtFWV9ORVRfR0VUKHZvaWQpID0gOTsKKworCQkvKgorCQkgKiBSZXR1cm4gbWUgdGhlIGNvbnZlcnNhdGlvbiBrZXkgdGhhdCBpcyBjb25zdHJ1Y3RlZAorCQkgKiBmcm9tIG15IHNlY3JldCBrZXkgYW5kIHRoaXMgcHVibGlja2V5LgorCQkgKi8KKworCQljcnlwdGtleXJlcworCQlLRVlfR0VUX0NPTlYoa2V5YnVmKSA9IDEwOworCisKKwl9ID0gMjsKK30gPSAxMDAwMjk7CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9rbG1fcHJvdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMva2xtX3Byb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWMyODFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMva2xtX3Byb3QuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9LTE1fUFJPVF9IX1JQQ0dFTgorI2RlZmluZSBfS0xNX1BST1RfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgTE1fTUFYU1RSTEVOIDEwMjQKKworZW51bSBrbG1fc3RhdHMgeworCWtsbV9ncmFudGVkID0gMCwKKwlrbG1fZGVuaWVkID0gMSwKKwlrbG1fZGVuaWVkX25vbG9ja3MgPSAyLAorCWtsbV93b3JraW5nID0gMywKK307Cit0eXBlZGVmIGVudW0ga2xtX3N0YXRzIGtsbV9zdGF0czsKKworc3RydWN0IGtsbV9sb2NrIHsKKwljaGFyICpzZXJ2ZXJfbmFtZTsKKwluZXRvYmogZmg7CisJaW50IHBpZDsKKwl1X2ludCBsX29mZnNldDsKKwl1X2ludCBsX2xlbjsKK307Cit0eXBlZGVmIHN0cnVjdCBrbG1fbG9jayBrbG1fbG9jazsKKworc3RydWN0IGtsbV9ob2xkZXIgeworCWJvb2xfdCBleGNsdXNpdmU7CisJaW50IHN2aWQ7CisJdV9pbnQgbF9vZmZzZXQ7CisJdV9pbnQgbF9sZW47Cit9OwordHlwZWRlZiBzdHJ1Y3Qga2xtX2hvbGRlciBrbG1faG9sZGVyOworCitzdHJ1Y3Qga2xtX3N0YXQgeworCWtsbV9zdGF0cyBzdGF0OworfTsKK3R5cGVkZWYgc3RydWN0IGtsbV9zdGF0IGtsbV9zdGF0OworCitzdHJ1Y3Qga2xtX3Rlc3RycGx5IHsKKwlrbG1fc3RhdHMgc3RhdDsKKwl1bmlvbiB7CisJCXN0cnVjdCBrbG1faG9sZGVyIGhvbGRlcjsKKwl9IGtsbV90ZXN0cnBseV91OworfTsKK3R5cGVkZWYgc3RydWN0IGtsbV90ZXN0cnBseSBrbG1fdGVzdHJwbHk7CisKK3N0cnVjdCBrbG1fbG9ja2FyZ3MgeworCWJvb2xfdCBibG9jazsKKwlib29sX3QgZXhjbHVzaXZlOworCXN0cnVjdCBrbG1fbG9jayBhbG9jazsKK307Cit0eXBlZGVmIHN0cnVjdCBrbG1fbG9ja2FyZ3Mga2xtX2xvY2thcmdzOworCitzdHJ1Y3Qga2xtX3Rlc3RhcmdzIHsKKwlib29sX3QgZXhjbHVzaXZlOworCXN0cnVjdCBrbG1fbG9jayBhbG9jazsKK307Cit0eXBlZGVmIHN0cnVjdCBrbG1fdGVzdGFyZ3Mga2xtX3Rlc3RhcmdzOworCitzdHJ1Y3Qga2xtX3VubG9ja2FyZ3MgeworCXN0cnVjdCBrbG1fbG9jayBhbG9jazsKK307Cit0eXBlZGVmIHN0cnVjdCBrbG1fdW5sb2NrYXJncyBrbG1fdW5sb2NrYXJnczsKKworI2RlZmluZSBLTE1fUFJPRyAxMDAwMjAKKyNkZWZpbmUgS0xNX1ZFUlMgMQorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgS0xNX1RFU1QgMQorZXh0ZXJuICBrbG1fdGVzdHJwbHkgKiBrbG1fdGVzdF8xKHN0cnVjdCBrbG1fdGVzdGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBrbG1fdGVzdHJwbHkgKiBrbG1fdGVzdF8xX3N2YyhzdHJ1Y3Qga2xtX3Rlc3RhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLTE1fTE9DSyAyCitleHRlcm4gIGtsbV9zdGF0ICoga2xtX2xvY2tfMShzdHJ1Y3Qga2xtX2xvY2thcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAga2xtX3N0YXQgKiBrbG1fbG9ja18xX3N2YyhzdHJ1Y3Qga2xtX2xvY2thcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLTE1fQ0FOQ0VMIDMKK2V4dGVybiAga2xtX3N0YXQgKiBrbG1fY2FuY2VsXzEoc3RydWN0IGtsbV9sb2NrYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIGtsbV9zdGF0ICoga2xtX2NhbmNlbF8xX3N2YyhzdHJ1Y3Qga2xtX2xvY2thcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLTE1fVU5MT0NLIDQKK2V4dGVybiAga2xtX3N0YXQgKiBrbG1fdW5sb2NrXzEoc3RydWN0IGtsbV91bmxvY2thcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAga2xtX3N0YXQgKiBrbG1fdW5sb2NrXzFfc3ZjKHN0cnVjdCBrbG1fdW5sb2NrYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQga2xtX3Byb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIEtMTV9URVNUIDEKK2V4dGVybiAga2xtX3Rlc3RycGx5ICoga2xtX3Rlc3RfMSgpOworZXh0ZXJuICBrbG1fdGVzdHJwbHkgKiBrbG1fdGVzdF8xX3N2YygpOworI2RlZmluZSBLTE1fTE9DSyAyCitleHRlcm4gIGtsbV9zdGF0ICoga2xtX2xvY2tfMSgpOworZXh0ZXJuICBrbG1fc3RhdCAqIGtsbV9sb2NrXzFfc3ZjKCk7CisjZGVmaW5lIEtMTV9DQU5DRUwgMworZXh0ZXJuICBrbG1fc3RhdCAqIGtsbV9jYW5jZWxfMSgpOworZXh0ZXJuICBrbG1fc3RhdCAqIGtsbV9jYW5jZWxfMV9zdmMoKTsKKyNkZWZpbmUgS0xNX1VOTE9DSyA0CitleHRlcm4gIGtsbV9zdGF0ICoga2xtX3VubG9ja18xKCk7CitleHRlcm4gIGtsbV9zdGF0ICoga2xtX3VubG9ja18xX3N2YygpOworZXh0ZXJuIGludCBrbG1fcHJvZ18xX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKworLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGJvb2xfdCB4ZHJfa2xtX3N0YXRzIChYRFIgKiwga2xtX3N0YXRzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfa2xtX2xvY2sgKFhEUiAqLCBrbG1fbG9jayopOworZXh0ZXJuICBib29sX3QgeGRyX2tsbV9ob2xkZXIgKFhEUiAqLCBrbG1faG9sZGVyKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfa2xtX3N0YXQgKFhEUiAqLCBrbG1fc3RhdCopOworZXh0ZXJuICBib29sX3QgeGRyX2tsbV90ZXN0cnBseSAoWERSICosIGtsbV90ZXN0cnBseSopOworZXh0ZXJuICBib29sX3QgeGRyX2tsbV9sb2NrYXJncyAoWERSICosIGtsbV9sb2NrYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX2tsbV90ZXN0YXJncyAoWERSICosIGtsbV90ZXN0YXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX2tsbV91bmxvY2thcmdzIChYRFIgKiwga2xtX3VubG9ja2FyZ3MqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX2tsbV9zdGF0cyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2tsbV9sb2NrICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfa2xtX2hvbGRlciAoKTsKK2V4dGVybiBib29sX3QgeGRyX2tsbV9zdGF0ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfa2xtX3Rlc3RycGx5ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfa2xtX2xvY2thcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfa2xtX3Rlc3RhcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfa2xtX3VubG9ja2FyZ3MgKCk7CisKKyNlbmRpZiAvKiBLJlIgQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9LTE1fUFJPVF9IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMva2xtX3Byb3QueCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2tsbV9wcm90LngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlNWIxYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2tsbV9wcm90LngKQEAgLTAsMCArMSwxMzAgQEAKKy8qIEAoIylrbG1fcHJvdC54CTIuMSA4OC8wOC8wMSA0LjAgUlBDU1JDICovCisKKy8qCisgKiBLZXJuZWwvbG9jayBtYW5hZ2VyIHByb3RvY29sIGRlZmluaXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIHByb3RvY29sIHVzZWQgYmV0d2VlbiB0aGUgVU5JWCBrZXJuZWwgKHRoZSAiY2xpZW50IikgYW5kIHRoZQorICogbG9jYWwgbG9jayBtYW5hZ2VyLiAgVGhlIGxvY2FsIGxvY2sgbWFuYWdlciBpcyBhIGRlYW1vbiBydW5uaW5nCisgKiBhYm92ZSB0aGUga2VybmVsLgorICovCisKK2NvbnN0CUxNX01BWFNUUkxFTiA9IDEwMjQ7CisKKy8qCisgKiBsb2NrIG1hbmFnZXIgc3RhdHVzIHJldHVybnMKKyAqLworZW51bSBrbG1fc3RhdHMgeworCWtsbV9ncmFudGVkID0gMCwJLyogbG9jayBpcyBncmFudGVkICovCisJa2xtX2RlbmllZCA9IDEsCQkvKiBsb2NrIGlzIGRlbmllZCAqLworCWtsbV9kZW5pZWRfbm9sb2NrcyA9IDIsIC8qIG5vIGxvY2sgZW50cnkgYXZhaWxhYmxlICovCisJa2xtX3dvcmtpbmcgPSAzCQkvKiBsb2NrIGlzIGJlaW5nIHByb2Nlc3NlZCAqLworfTsKKworLyoKKyAqIGxvY2sgbWFuYWdlciBsb2NrIGlkZW50aWZpZXIKKyAqLworc3RydWN0IGtsbV9sb2NrIHsKKwlzdHJpbmcgc2VydmVyX25hbWU8TE1fTUFYU1RSTEVOPjsKKwluZXRvYmogZmg7CQkvKiBhIGNvdW50ZWQgZmlsZSBoYW5kbGUgKi8KKwlpbnQgcGlkOwkJLyogaG9sZGVyIG9mIHRoZSBsb2NrICovCisJdW5zaWduZWQgbF9vZmZzZXQ7CS8qIGJlZ2lubmluZyBvZmZzZXQgb2YgdGhlIGxvY2sgKi8KKwl1bnNpZ25lZCBsX2xlbjsJCS8qIGJ5dGUgbGVuZ3RoIG9mIHRoZSBsb2NrOworCQkJCSAqIHplcm8gbWVhbnMgdGhyb3VnaCBlbmQgb2YgZmlsZSAqLworfTsKKworLyoKKyAqIGxvY2sgaG9sZGVyIGlkZW50aWZpZXIKKyAqLworc3RydWN0IGtsbV9ob2xkZXIgeworCWJvb2wgZXhjbHVzaXZlOwkJLyogRkFMU0UgaWYgc2hhcmVkIGxvY2sgKi8KKwlpbnQgc3ZpZDsJCS8qIGhvbGRlciBvZiB0aGUgbG9jayAocGlkKSAqLworCXVuc2lnbmVkIGxfb2Zmc2V0OwkvKiBiZWdpbm5pbmcgb2Zmc2V0IG9mIHRoZSBsb2NrICovCisJdW5zaWduZWQgbF9sZW47CQkvKiBieXRlIGxlbmd0aCBvZiB0aGUgbG9jazsKKwkJCQkgKiB6ZXJvIG1lYW5zIHRocm91Z2ggZW5kIG9mIGZpbGUgKi8KK307CisKKy8qCisgKiByZXBseSB0byBLTE1fTE9DSyAvIEtMTV9VTkxPQ0sgLyBLTE1fQ0FOQ0VMCisgKi8KK3N0cnVjdCBrbG1fc3RhdCB7CisJa2xtX3N0YXRzIHN0YXQ7Cit9OworCisvKgorICogcmVwbHkgdG8gYSBLTE1fVEVTVCBjYWxsCisgKi8KK3VuaW9uIGtsbV90ZXN0cnBseSBzd2l0Y2ggKGtsbV9zdGF0cyBzdGF0KSB7CisJY2FzZSBrbG1fZGVuaWVkOgorCQlzdHJ1Y3Qga2xtX2hvbGRlciBob2xkZXI7CisJZGVmYXVsdDogLyogQWxsIG90aGVyIGNhc2VzIHJldHVybiBubyBhcmd1bWVudHMgKi8KKwkJdm9pZDsKK307CisKKworLyoKKyAqIGFyZ3VtZW50cyB0byBLTE1fTE9DSworICovCitzdHJ1Y3Qga2xtX2xvY2thcmdzIHsKKwlib29sIGJsb2NrOworCWJvb2wgZXhjbHVzaXZlOworCXN0cnVjdCBrbG1fbG9jayBhbG9jazsKK307CisKKy8qCisgKiBhcmd1bWVudHMgdG8gS0xNX1RFU1QKKyAqLworc3RydWN0IGtsbV90ZXN0YXJncyB7CisJYm9vbCBleGNsdXNpdmU7CisJc3RydWN0IGtsbV9sb2NrIGFsb2NrOworfTsKKworLyoKKyAqIGFyZ3VtZW50cyB0byBLTE1fVU5MT0NLCisgKi8KK3N0cnVjdCBrbG1fdW5sb2NrYXJncyB7CisJc3RydWN0IGtsbV9sb2NrIGFsb2NrOworfTsKKworcHJvZ3JhbSBLTE1fUFJPRyB7CisJdmVyc2lvbiBLTE1fVkVSUyB7CisKKwkJa2xtX3Rlc3RycGx5CUtMTV9URVNUIChzdHJ1Y3Qga2xtX3Rlc3RhcmdzKSA9CTE7CisKKwkJa2xtX3N0YXQJS0xNX0xPQ0sgKHN0cnVjdCBrbG1fbG9ja2FyZ3MpID0JMjsKKworCQlrbG1fc3RhdAlLTE1fQ0FOQ0VMIChzdHJ1Y3Qga2xtX2xvY2thcmdzKSA9CTM7CisJCS8qIGtsbV9ncmFudGVkPT4gdGhlIGNhbmNlbCByZXF1ZXN0IGZhaWxzIGR1ZSB0byBsb2NrIGlzIGFscmVhZHkgZ3JhbnRlZCAqLworCQkvKiBrbG1fZGVuaWVkPT4gdGhlIGNhbmNlbCByZXF1ZXN0IHN1Y2Nlc3NmdWxseSBhYm9ydHMKK2xvY2sgcmVxdWVzdCAgKi8KKworCQlrbG1fc3RhdAlLTE1fVU5MT0NLIChzdHJ1Y3Qga2xtX3VubG9ja2FyZ3MpID0JNDsKKwl9ID0gMTsKK30gPSAxMDAwMjA7CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9tb3VudC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbW91bnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTIyZjI5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbW91bnQuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9NT1VOVF9IX1JQQ0dFTgorI2RlZmluZSBfTU9VTlRfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgTU5UUEFUSExFTiAxMDI0CisjZGVmaW5lIE1OVE5BTUxFTiAyNTUKKyNkZWZpbmUgRkhTSVpFIDMyCisKK3R5cGVkZWYgY2hhciBmaGFuZGxlW0ZIU0laRV07CisKK3N0cnVjdCBmaHN0YXR1cyB7CisJdV9pbnQgZmhzX3N0YXR1czsKKwl1bmlvbiB7CisJCWZoYW5kbGUgZmhzX2ZoYW5kbGU7CisJfSBmaHN0YXR1c191OworfTsKK3R5cGVkZWYgc3RydWN0IGZoc3RhdHVzIGZoc3RhdHVzOworCit0eXBlZGVmIGNoYXIgKmRpcnBhdGg7CisKK3R5cGVkZWYgY2hhciAqbmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgbW91bnRib2R5ICptb3VudGxpc3Q7CisKK3N0cnVjdCBtb3VudGJvZHkgeworCW5hbWUgbWxfaG9zdG5hbWU7CisJZGlycGF0aCBtbF9kaXJlY3Rvcnk7CisJbW91bnRsaXN0IG1sX25leHQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbW91bnRib2R5IG1vdW50Ym9keTsKKwordHlwZWRlZiBzdHJ1Y3QgZ3JvdXBub2RlICpncm91cHM7CisKK3N0cnVjdCBncm91cG5vZGUgeworCW5hbWUgZ3JfbmFtZTsKKwlncm91cHMgZ3JfbmV4dDsKK307Cit0eXBlZGVmIHN0cnVjdCBncm91cG5vZGUgZ3JvdXBub2RlOworCit0eXBlZGVmIHN0cnVjdCBleHBvcnRub2RlICpleHBvcnRzOworCitzdHJ1Y3QgZXhwb3J0bm9kZSB7CisJZGlycGF0aCBleF9kaXI7CisJZ3JvdXBzIGV4X2dyb3VwczsKKwlleHBvcnRzIGV4X25leHQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZXhwb3J0bm9kZSBleHBvcnRub2RlOworCisjZGVmaW5lIE1PVU5UUFJPRyAxMDAwMDUKKyNkZWZpbmUgTU9VTlRWRVJTIDEKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIE1PVU5UUFJPQ19OVUxMIDAKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY19udWxsXzEodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfbnVsbF8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBNT1VOVFBST0NfTU5UIDEKK2V4dGVybiAgZmhzdGF0dXMgKiBtb3VudHByb2NfbW50XzEoZGlycGF0aCAqLCBDTElFTlQgKik7CitleHRlcm4gIGZoc3RhdHVzICogbW91bnRwcm9jX21udF8xX3N2YyhkaXJwYXRoICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBNT1VOVFBST0NfRFVNUCAyCitleHRlcm4gIG1vdW50bGlzdCAqIG1vdW50cHJvY19kdW1wXzEodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIG1vdW50bGlzdCAqIG1vdW50cHJvY19kdW1wXzFfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE1PVU5UUFJPQ19VTU5UIDMKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY191bW50XzEoZGlycGF0aCAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfdW1udF8xX3N2YyhkaXJwYXRoICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBNT1VOVFBST0NfVU1OVEFMTCA0CitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfdW1udGFsbF8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbW91bnRwcm9jX3VtbnRhbGxfMV9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTU9VTlRQUk9DX0VYUE9SVCA1CitleHRlcm4gIGV4cG9ydHMgKiBtb3VudHByb2NfZXhwb3J0XzEodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIGV4cG9ydHMgKiBtb3VudHByb2NfZXhwb3J0XzFfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE1PVU5UUFJPQ19FWFBPUlRBTEwgNgorZXh0ZXJuICBleHBvcnRzICogbW91bnRwcm9jX2V4cG9ydGFsbF8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBleHBvcnRzICogbW91bnRwcm9jX2V4cG9ydGFsbF8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBtb3VudHByb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIE1PVU5UUFJPQ19OVUxMIDAKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY19udWxsXzEoKTsKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY19udWxsXzFfc3ZjKCk7CisjZGVmaW5lIE1PVU5UUFJPQ19NTlQgMQorZXh0ZXJuICBmaHN0YXR1cyAqIG1vdW50cHJvY19tbnRfMSgpOworZXh0ZXJuICBmaHN0YXR1cyAqIG1vdW50cHJvY19tbnRfMV9zdmMoKTsKKyNkZWZpbmUgTU9VTlRQUk9DX0RVTVAgMgorZXh0ZXJuICBtb3VudGxpc3QgKiBtb3VudHByb2NfZHVtcF8xKCk7CitleHRlcm4gIG1vdW50bGlzdCAqIG1vdW50cHJvY19kdW1wXzFfc3ZjKCk7CisjZGVmaW5lIE1PVU5UUFJPQ19VTU5UIDMKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY191bW50XzEoKTsKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY191bW50XzFfc3ZjKCk7CisjZGVmaW5lIE1PVU5UUFJPQ19VTU5UQUxMIDQKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY191bW50YWxsXzEoKTsKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY191bW50YWxsXzFfc3ZjKCk7CisjZGVmaW5lIE1PVU5UUFJPQ19FWFBPUlQgNQorZXh0ZXJuICBleHBvcnRzICogbW91bnRwcm9jX2V4cG9ydF8xKCk7CitleHRlcm4gIGV4cG9ydHMgKiBtb3VudHByb2NfZXhwb3J0XzFfc3ZjKCk7CisjZGVmaW5lIE1PVU5UUFJPQ19FWFBPUlRBTEwgNgorZXh0ZXJuICBleHBvcnRzICogbW91bnRwcm9jX2V4cG9ydGFsbF8xKCk7CitleHRlcm4gIGV4cG9ydHMgKiBtb3VudHByb2NfZXhwb3J0YWxsXzFfc3ZjKCk7CitleHRlcm4gaW50IG1vdW50cHJvZ18xX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKworLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGJvb2xfdCB4ZHJfZmhhbmRsZSAoWERSICosIGZoYW5kbGUpOworZXh0ZXJuICBib29sX3QgeGRyX2Zoc3RhdHVzIChYRFIgKiwgZmhzdGF0dXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9kaXJwYXRoIChYRFIgKiwgZGlycGF0aCopOworZXh0ZXJuICBib29sX3QgeGRyX25hbWUgKFhEUiAqLCBuYW1lKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbW91bnRsaXN0IChYRFIgKiwgbW91bnRsaXN0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbW91bnRib2R5IChYRFIgKiwgbW91bnRib2R5Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZ3JvdXBzIChYRFIgKiwgZ3JvdXBzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZ3JvdXBub2RlIChYRFIgKiwgZ3JvdXBub2RlKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZXhwb3J0cyAoWERSICosIGV4cG9ydHMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9leHBvcnRub2RlIChYRFIgKiwgZXhwb3J0bm9kZSopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfZmhhbmRsZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX2Zoc3RhdHVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZGlycGF0aCAoKTsKK2V4dGVybiBib29sX3QgeGRyX25hbWUgKCk7CitleHRlcm4gYm9vbF90IHhkcl9tb3VudGxpc3QgKCk7CitleHRlcm4gYm9vbF90IHhkcl9tb3VudGJvZHkgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ncm91cHMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ncm91cG5vZGUgKCk7CitleHRlcm4gYm9vbF90IHhkcl9leHBvcnRzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZXhwb3J0bm9kZSAoKTsKKworI2VuZGlmIC8qIEsmUiBDICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhX01PVU5UX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9tb3VudC54IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbW91bnQueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDNiMzM5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbW91bnQueApAQCAtMCwwICsxLDE2MSBAQAorLyogQCgjKW1vdW50LngJMi4xIDg4LzA4LzAxIDQuMCBSUENTUkMgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFByb3RvY29sIGRlc2NyaXB0aW9uIGZvciB0aGUgbW91bnQgcHJvZ3JhbQorICovCisKKworY29uc3QgTU5UUEFUSExFTiA9IDEwMjQ7CS8qIG1heGltdW0gYnl0ZXMgaW4gYSBwYXRobmFtZSBhcmd1bWVudCAqLworY29uc3QgTU5UTkFNTEVOID0gMjU1OwkJLyogbWF4aW11bSBieXRlcyBpbiBhIG5hbWUgYXJndW1lbnQgKi8KK2NvbnN0IEZIU0laRSA9IDMyOwkJLyogc2l6ZSBpbiBieXRlcyBvZiBhIGZpbGUgaGFuZGxlICovCisKKy8qCisgKiBUaGUgZmhhbmRsZSBpcyB0aGUgZmlsZSBoYW5kbGUgdGhhdCB0aGUgc2VydmVyIHBhc3NlcyB0byB0aGUgY2xpZW50LgorICogQWxsIGZpbGUgb3BlcmF0aW9ucyBhcmUgZG9uZSB1c2luZyB0aGUgZmlsZSBoYW5kbGVzIHRvIHJlZmVyIHRvIGEgZmlsZQorICogb3IgYSBkaXJlY3RvcnkuIFRoZSBmaWxlIGhhbmRsZSBjYW4gY29udGFpbiB3aGF0ZXZlciBpbmZvcm1hdGlvbiB0aGUKKyAqIHNlcnZlciBuZWVkcyB0byBkaXN0aW5ndWlzaCBhbiBpbmRpdmlkdWFsIGZpbGUuCisgKi8KK3R5cGVkZWYgb3BhcXVlIGZoYW5kbGVbRkhTSVpFXTsKKworLyoKKyAqIElmIGEgc3RhdHVzIG9mIHplcm8gaXMgcmV0dXJuZWQsIHRoZSBjYWxsIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGFuZAorICogYSBmaWxlIGhhbmRsZSBmb3IgdGhlIGRpcmVjdG9yeSBmb2xsb3dzLiBBIG5vbi16ZXJvIHN0YXR1cyBpbmRpY2F0ZXMKKyAqIHNvbWUgc29ydCBvZiBlcnJvci4gVGhlIHN0YXR1cyBjb3JyZXNwb25kcyB3aXRoIFVOSVggZXJyb3IgbnVtYmVycy4KKyAqLwordW5pb24gZmhzdGF0dXMgc3dpdGNoICh1bnNpZ25lZCBmaHNfc3RhdHVzKSB7CitjYXNlIDA6CisJZmhhbmRsZSBmaHNfZmhhbmRsZTsKK2RlZmF1bHQ6CisJdm9pZDsKK307CisKKy8qCisgKiBUaGUgdHlwZSBkaXJwYXRoIGlzIHRoZSBwYXRobmFtZSBvZiBhIGRpcmVjdG9yeQorICovCit0eXBlZGVmIHN0cmluZyBkaXJwYXRoPE1OVFBBVEhMRU4+OworCisvKgorICogVGhlIHR5cGUgbmFtZSBpcyB1c2VkIGZvciBhcmJpdHJhcnkgbmFtZXMgKGhvc3RuYW1lcywgZ3JvdXBuYW1lcykKKyAqLwordHlwZWRlZiBzdHJpbmcgbmFtZTxNTlROQU1MRU4+OworCisvKgorICogQSBsaXN0IG9mIHdobyBoYXMgd2hhdCBtb3VudGVkCisgKi8KK3R5cGVkZWYgc3RydWN0IG1vdW50Ym9keSAqbW91bnRsaXN0Oworc3RydWN0IG1vdW50Ym9keSB7CisJbmFtZSBtbF9ob3N0bmFtZTsKKwlkaXJwYXRoIG1sX2RpcmVjdG9yeTsKKwltb3VudGxpc3QgbWxfbmV4dDsKK307CisKKy8qCisgKiBBIGxpc3Qgb2YgbmV0Z3JvdXBzCisgKi8KK3R5cGVkZWYgc3RydWN0IGdyb3Vwbm9kZSAqZ3JvdXBzOworc3RydWN0IGdyb3Vwbm9kZSB7CisJbmFtZSBncl9uYW1lOworCWdyb3VwcyBncl9uZXh0OworfTsKKworLyoKKyAqIEEgbGlzdCBvZiB3aGF0IGlzIGV4cG9ydGVkIGFuZCB0byB3aG9tCisgKi8KK3R5cGVkZWYgc3RydWN0IGV4cG9ydG5vZGUgKmV4cG9ydHM7CitzdHJ1Y3QgZXhwb3J0bm9kZSB7CisJZGlycGF0aCBleF9kaXI7CisJZ3JvdXBzIGV4X2dyb3VwczsKKwlleHBvcnRzIGV4X25leHQ7Cit9OworCitwcm9ncmFtIE1PVU5UUFJPRyB7CisJLyoKKwkgKiBWZXJzaW9uIG9uZSBvZiB0aGUgbW91bnQgcHJvdG9jb2wgY29tbXVuaWNhdGVzIHdpdGggdmVyc2lvbiB0d28KKwkgKiBvZiB0aGUgTkZTIHByb3RvY29sLiBUaGUgb25seSBjb25uZWN0aW5nIHBvaW50IGlzIHRoZSBmaGFuZGxlCisJICogc3RydWN0dXJlLCB3aGljaCBpcyB0aGUgc2FtZSBmb3IgYm90aCBwcm90b2NvbHMuCisJICovCisJdmVyc2lvbiBNT1VOVFZFUlMgeworCQkvKgorCQkgKiBEb2VzIG5vIHdvcmsuIEl0IGlzIG1hZGUgYXZhaWxhYmxlIGluIGFsbCBSUEMgc2VydmljZXMKKwkJICogdG8gYWxsb3cgc2VydmVyIHJlc3BvbnNlIHRlc3RpbmcgYW5kIHRpbWluZworCQkgKi8KKwkJdm9pZAorCQlNT1VOVFBST0NfTlVMTCh2b2lkKSA9IDA7CisKKwkJLyoKKwkJICogSWYgZmhzX3N0YXR1cyBpcyAwLCB0aGVuIGZoc19maGFuZGxlIGNvbnRhaW5zIHRoZQorCQkgKiBmaWxlIGhhbmRsZSBmb3IgdGhlIGRpcmVjdG9yeS4gVGhpcyBmaWxlIGhhbmRsZSBtYXkKKwkJICogYmUgdXNlZCBpbiB0aGUgTkZTIHByb3RvY29sLiBUaGlzIHByb2NlZHVyZSBhbHNvIGFkZHMKKwkJICogYSBuZXcgZW50cnkgdG8gdGhlIG1vdW50IGxpc3QgZm9yIHRoaXMgY2xpZW50IG1vdW50aW5nCisJCSAqIHRoZSBkaXJlY3RvcnkuCisJCSAqIFVuaXggYXV0aGVudGljYXRpb24gcmVxdWlyZWQuCisJCSAqLworCQlmaHN0YXR1cworCQlNT1VOVFBST0NfTU5UKGRpcnBhdGgpID0gMTsKKworCQkvKgorCQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJlbW90ZWx5IG1vdW50ZWQgZmlsZXN5c3RlbXMuIFRoZQorCQkgKiBtb3VudGxpc3QgY29udGFpbnMgb25lIGVudHJ5IGZvciBlYWNoIGhvc3RuYW1lIGFuZAorCQkgKiBkaXJlY3RvcnkgcGFpci4KKwkJICovCisJCW1vdW50bGlzdAorCQlNT1VOVFBST0NfRFVNUCh2b2lkKSA9IDI7CisKKwkJLyoKKwkJICogUmVtb3ZlcyB0aGUgbW91bnQgbGlzdCBlbnRyeSBmb3IgdGhlIGRpcmVjdG9yeQorCQkgKiBVbml4IGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkLgorCQkgKi8KKwkJdm9pZAorCQlNT1VOVFBST0NfVU1OVChkaXJwYXRoKSA9IDM7CisKKwkJLyoKKwkJICogUmVtb3ZlcyBhbGwgb2YgdGhlIG1vdW50IGxpc3QgZW50cmllcyBmb3IgdGhpcyBjbGllbnQKKwkJICogVW5peCBhdXRoZW50aWNhdGlvbiByZXF1aXJlZC4KKwkJICovCisJCXZvaWQKKwkJTU9VTlRQUk9DX1VNTlRBTEwodm9pZCkgPSA0OworCisJCS8qCisJCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgZXhwb3J0ZWQgZmlsZXN5c3RlbXMsIGFuZCB3aGljaAorCQkgKiBtYWNoaW5lcyBhcmUgYWxsb3dlZCB0byBpbXBvcnQgaXQuCisJCSAqLworCQlleHBvcnRzCisJCU1PVU5UUFJPQ19FWFBPUlQodm9pZCkgID0gNTsKKworCQkvKgorCQkgKiBJZGVudGljYWwgdG8gTU9VTlRQUk9DX0VYUE9SVCBhYm92ZQorCQkgKi8KKwkJZXhwb3J0cworCQlNT1VOVFBST0NfRVhQT1JUQUxMKHZvaWQpID0gNjsKKwl9ID0gMTsKK30gPSAxMDAwMDU7CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uZnNfcHJvdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmZzX3Byb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2Y2MjZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmZzX3Byb3QuaApAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9ORlNfUFJPVF9IX1JQQ0dFTgorI2RlZmluZSBfTkZTX1BST1RfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgTkZTX1BPUlQgMjA0OQorI2RlZmluZSBORlNfTUFYREFUQSA4MTkyCisjZGVmaW5lIE5GU19NQVhQQVRITEVOIDEwMjQKKyNkZWZpbmUgTkZTX01BWE5BTUxFTiAyNTUKKyNkZWZpbmUgTkZTX0ZIU0laRSAzMgorI2RlZmluZSBORlNfQ09PS0lFU0laRSA0CisjZGVmaW5lIE5GU19GSUZPX0RFViAtMQorI2RlZmluZSBORlNNT0RFX0ZNVCAwMTcwMDAwCisjZGVmaW5lIE5GU01PREVfRElSIDAwNDAwMDAKKyNkZWZpbmUgTkZTTU9ERV9DSFIgMDAyMDAwMAorI2RlZmluZSBORlNNT0RFX0JMSyAwMDYwMDAwCisjZGVmaW5lIE5GU01PREVfUkVHIDAxMDAwMDAKKyNkZWZpbmUgTkZTTU9ERV9MTksgMDEyMDAwMAorI2RlZmluZSBORlNNT0RFX1NPQ0sgMDE0MDAwMAorI2RlZmluZSBORlNNT0RFX0ZJRk8gMDAxMDAwMAorCitlbnVtIG5mc3N0YXQgeworCU5GU19PSyA9IDAsCisJTkZTRVJSX1BFUk0gPSAxLAorCU5GU0VSUl9OT0VOVCA9IDIsCisJTkZTRVJSX0lPID0gNSwKKwlORlNFUlJfTlhJTyA9IDYsCisJTkZTRVJSX0FDQ0VTID0gMTMsCisJTkZTRVJSX0VYSVNUID0gMTcsCisJTkZTRVJSX05PREVWID0gMTksCisJTkZTRVJSX05PVERJUiA9IDIwLAorCU5GU0VSUl9JU0RJUiA9IDIxLAorCU5GU0VSUl9GQklHID0gMjcsCisJTkZTRVJSX05PU1BDID0gMjgsCisJTkZTRVJSX1JPRlMgPSAzMCwKKwlORlNFUlJfTkFNRVRPT0xPTkcgPSA2MywKKwlORlNFUlJfTk9URU1QVFkgPSA2NiwKKwlORlNFUlJfRFFVT1QgPSA2OSwKKwlORlNFUlJfU1RBTEUgPSA3MCwKKwlORlNFUlJfV0ZMVVNIID0gOTksCit9OwordHlwZWRlZiBlbnVtIG5mc3N0YXQgbmZzc3RhdDsKKworZW51bSBmdHlwZSB7CisJTkZOT04gPSAwLAorCU5GUkVHID0gMSwKKwlORkRJUiA9IDIsCisJTkZCTEsgPSAzLAorCU5GQ0hSID0gNCwKKwlORkxOSyA9IDUsCisJTkZTT0NLID0gNiwKKwlORkJBRCA9IDcsCisJTkZGSUZPID0gOCwKK307Cit0eXBlZGVmIGVudW0gZnR5cGUgZnR5cGU7CisKK3N0cnVjdCBuZnNfZmggeworCWNoYXIgZGF0YVtORlNfRkhTSVpFXTsKK307Cit0eXBlZGVmIHN0cnVjdCBuZnNfZmggbmZzX2ZoOworCitzdHJ1Y3QgbmZzdGltZSB7CisJdV9pbnQgc2Vjb25kczsKKwl1X2ludCB1c2Vjb25kczsKK307Cit0eXBlZGVmIHN0cnVjdCBuZnN0aW1lIG5mc3RpbWU7CisKK3N0cnVjdCBmYXR0ciB7CisJZnR5cGUgdHlwZTsKKwl1X2ludCBtb2RlOworCXVfaW50IG5saW5rOworCXVfaW50IHVpZDsKKwl1X2ludCBnaWQ7CisJdV9pbnQgc2l6ZTsKKwl1X2ludCBibG9ja3NpemU7CisJdV9pbnQgcmRldjsKKwl1X2ludCBibG9ja3M7CisJdV9pbnQgZnNpZDsKKwl1X2ludCBmaWxlaWQ7CisJbmZzdGltZSBhdGltZTsKKwluZnN0aW1lIG10aW1lOworCW5mc3RpbWUgY3RpbWU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZmF0dHIgZmF0dHI7CisKK3N0cnVjdCBzYXR0ciB7CisJdV9pbnQgbW9kZTsKKwl1X2ludCB1aWQ7CisJdV9pbnQgZ2lkOworCXVfaW50IHNpemU7CisJbmZzdGltZSBhdGltZTsKKwluZnN0aW1lIG10aW1lOworfTsKK3R5cGVkZWYgc3RydWN0IHNhdHRyIHNhdHRyOworCit0eXBlZGVmIGNoYXIgKmZpbGVuYW1lOworCit0eXBlZGVmIGNoYXIgKm5mc3BhdGg7CisKK3N0cnVjdCBhdHRyc3RhdCB7CisJbmZzc3RhdCBzdGF0dXM7CisJdW5pb24geworCQlmYXR0ciBhdHRyaWJ1dGVzOworCX0gYXR0cnN0YXRfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBhdHRyc3RhdCBhdHRyc3RhdDsKKworc3RydWN0IHNhdHRyYXJncyB7CisJbmZzX2ZoIGZpbGU7CisJc2F0dHIgYXR0cmlidXRlczsKK307Cit0eXBlZGVmIHN0cnVjdCBzYXR0cmFyZ3Mgc2F0dHJhcmdzOworCitzdHJ1Y3QgZGlyb3BhcmdzIHsKKwluZnNfZmggZGlyOworCWZpbGVuYW1lIG5hbWU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZGlyb3BhcmdzIGRpcm9wYXJnczsKKworc3RydWN0IGRpcm9wb2tyZXMgeworCW5mc19maCBmaWxlOworCWZhdHRyIGF0dHJpYnV0ZXM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZGlyb3Bva3JlcyBkaXJvcG9rcmVzOworCitzdHJ1Y3QgZGlyb3ByZXMgeworCW5mc3N0YXQgc3RhdHVzOworCXVuaW9uIHsKKwkJZGlyb3Bva3JlcyBkaXJvcHJlczsKKwl9IGRpcm9wcmVzX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZGlyb3ByZXMgZGlyb3ByZXM7CisKK3N0cnVjdCByZWFkbGlua3JlcyB7CisJbmZzc3RhdCBzdGF0dXM7CisJdW5pb24geworCQluZnNwYXRoIGRhdGE7CisJfSByZWFkbGlua3Jlc191OworfTsKK3R5cGVkZWYgc3RydWN0IHJlYWRsaW5rcmVzIHJlYWRsaW5rcmVzOworCitzdHJ1Y3QgcmVhZGFyZ3MgeworCW5mc19maCBmaWxlOworCXVfaW50IG9mZnNldDsKKwl1X2ludCBjb3VudDsKKwl1X2ludCB0b3RhbGNvdW50OworfTsKK3R5cGVkZWYgc3RydWN0IHJlYWRhcmdzIHJlYWRhcmdzOworCitzdHJ1Y3QgcmVhZG9rcmVzIHsKKwlmYXR0ciBhdHRyaWJ1dGVzOworCXN0cnVjdCB7CisJCXVfaW50IGRhdGFfbGVuOworCQljaGFyICpkYXRhX3ZhbDsKKwl9IGRhdGE7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcmVhZG9rcmVzIHJlYWRva3JlczsKKworc3RydWN0IHJlYWRyZXMgeworCW5mc3N0YXQgc3RhdHVzOworCXVuaW9uIHsKKwkJcmVhZG9rcmVzIHJlcGx5OworCX0gcmVhZHJlc191OworfTsKK3R5cGVkZWYgc3RydWN0IHJlYWRyZXMgcmVhZHJlczsKKworc3RydWN0IHdyaXRlYXJncyB7CisJbmZzX2ZoIGZpbGU7CisJdV9pbnQgYmVnaW5vZmZzZXQ7CisJdV9pbnQgb2Zmc2V0OworCXVfaW50IHRvdGFsY291bnQ7CisJc3RydWN0IHsKKwkJdV9pbnQgZGF0YV9sZW47CisJCWNoYXIgKmRhdGFfdmFsOworCX0gZGF0YTsKK307Cit0eXBlZGVmIHN0cnVjdCB3cml0ZWFyZ3Mgd3JpdGVhcmdzOworCitzdHJ1Y3QgY3JlYXRlYXJncyB7CisJZGlyb3BhcmdzIHdoZXJlOworCXNhdHRyIGF0dHJpYnV0ZXM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgY3JlYXRlYXJncyBjcmVhdGVhcmdzOworCitzdHJ1Y3QgcmVuYW1lYXJncyB7CisJZGlyb3BhcmdzIGZyb207CisJZGlyb3BhcmdzIHRvOworfTsKK3R5cGVkZWYgc3RydWN0IHJlbmFtZWFyZ3MgcmVuYW1lYXJnczsKKworc3RydWN0IGxpbmthcmdzIHsKKwluZnNfZmggZnJvbTsKKwlkaXJvcGFyZ3MgdG87Cit9OwordHlwZWRlZiBzdHJ1Y3QgbGlua2FyZ3MgbGlua2FyZ3M7CisKK3N0cnVjdCBzeW1saW5rYXJncyB7CisJZGlyb3BhcmdzIGZyb207CisJbmZzcGF0aCB0bzsKKwlzYXR0ciBhdHRyaWJ1dGVzOworfTsKK3R5cGVkZWYgc3RydWN0IHN5bWxpbmthcmdzIHN5bWxpbmthcmdzOworCit0eXBlZGVmIGNoYXIgbmZzY29va2llW05GU19DT09LSUVTSVpFXTsKKworc3RydWN0IHJlYWRkaXJhcmdzIHsKKwluZnNfZmggZGlyOworCW5mc2Nvb2tpZSBjb29raWU7CisJdV9pbnQgY291bnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcmVhZGRpcmFyZ3MgcmVhZGRpcmFyZ3M7CisKK3N0cnVjdCBlbnRyeSB7CisJdV9pbnQgZmlsZWlkOworCWZpbGVuYW1lIG5hbWU7CisJbmZzY29va2llIGNvb2tpZTsKKwlzdHJ1Y3QgZW50cnkgKm5leHRlbnRyeTsKK307Cit0eXBlZGVmIHN0cnVjdCBlbnRyeSBlbnRyeTsKKworc3RydWN0IGRpcmxpc3QgeworCWVudHJ5ICplbnRyaWVzOworCWJvb2xfdCBlb2Y7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZGlybGlzdCBkaXJsaXN0OworCitzdHJ1Y3QgcmVhZGRpcnJlcyB7CisJbmZzc3RhdCBzdGF0dXM7CisJdW5pb24geworCQlkaXJsaXN0IHJlcGx5OworCX0gcmVhZGRpcnJlc191OworfTsKK3R5cGVkZWYgc3RydWN0IHJlYWRkaXJyZXMgcmVhZGRpcnJlczsKKworc3RydWN0IHN0YXRmc29rcmVzIHsKKwl1X2ludCB0c2l6ZTsKKwl1X2ludCBic2l6ZTsKKwl1X2ludCBibG9ja3M7CisJdV9pbnQgYmZyZWU7CisJdV9pbnQgYmF2YWlsOworfTsKK3R5cGVkZWYgc3RydWN0IHN0YXRmc29rcmVzIHN0YXRmc29rcmVzOworCitzdHJ1Y3Qgc3RhdGZzcmVzIHsKKwluZnNzdGF0IHN0YXR1czsKKwl1bmlvbiB7CisJCXN0YXRmc29rcmVzIHJlcGx5OworCX0gc3RhdGZzcmVzX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc3RhdGZzcmVzIHN0YXRmc3JlczsKKworI2RlZmluZSBORlNfUFJPR1JBTSAxMDAwMDMKKyNkZWZpbmUgTkZTX1ZFUlNJT04gMgorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgTkZTUFJPQ19OVUxMIDAKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2NfbnVsbF8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmZzcHJvY19udWxsXzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfR0VUQVRUUiAxCitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY19nZXRhdHRyXzIobmZzX2ZoICosIENMSUVOVCAqKTsKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX2dldGF0dHJfMl9zdmMobmZzX2ZoICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1NFVEFUVFIgMgorZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2Nfc2V0YXR0cl8yKHNhdHRyYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY19zZXRhdHRyXzJfc3ZjKHNhdHRyYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19ST09UIDMKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2Nfcm9vdF8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmZzcHJvY19yb290XzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfTE9PS1VQIDQKK2V4dGVybiAgZGlyb3ByZXMgKiBuZnNwcm9jX2xvb2t1cF8yKGRpcm9wYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19sb29rdXBfMl9zdmMoZGlyb3BhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1JFQURMSU5LIDUKK2V4dGVybiAgcmVhZGxpbmtyZXMgKiBuZnNwcm9jX3JlYWRsaW5rXzIobmZzX2ZoICosIENMSUVOVCAqKTsKK2V4dGVybiAgcmVhZGxpbmtyZXMgKiBuZnNwcm9jX3JlYWRsaW5rXzJfc3ZjKG5mc19maCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19SRUFEIDYKK2V4dGVybiAgcmVhZHJlcyAqIG5mc3Byb2NfcmVhZF8yKHJlYWRhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgcmVhZHJlcyAqIG5mc3Byb2NfcmVhZF8yX3N2YyhyZWFkYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19XUklURUNBQ0hFIDcKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2Nfd3JpdGVjYWNoZV8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmZzcHJvY193cml0ZWNhY2hlXzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfV1JJVEUgOAorZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2Nfd3JpdGVfMih3cml0ZWFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2Nfd3JpdGVfMl9zdmMod3JpdGVhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX0NSRUFURSA5CitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19jcmVhdGVfMihjcmVhdGVhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgZGlyb3ByZXMgKiBuZnNwcm9jX2NyZWF0ZV8yX3N2YyhjcmVhdGVhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1JFTU9WRSAxMAorZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19yZW1vdmVfMihkaXJvcGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19yZW1vdmVfMl9zdmMoZGlyb3BhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1JFTkFNRSAxMQorZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19yZW5hbWVfMihyZW5hbWVhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfcmVuYW1lXzJfc3ZjKHJlbmFtZWFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfTElOSyAxMgorZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19saW5rXzIobGlua2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19saW5rXzJfc3ZjKGxpbmthcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1NZTUxJTksgMTMKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2Nfc3ltbGlua18yKHN5bWxpbmthcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2Nfc3ltbGlua18yX3N2YyhzeW1saW5rYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19NS0RJUiAxNAorZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfbWtkaXJfMihjcmVhdGVhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgZGlyb3ByZXMgKiBuZnNwcm9jX21rZGlyXzJfc3ZjKGNyZWF0ZWFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfUk1ESVIgMTUKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2Nfcm1kaXJfMihkaXJvcGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19ybWRpcl8yX3N2YyhkaXJvcGFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfUkVBRERJUiAxNgorZXh0ZXJuICByZWFkZGlycmVzICogbmZzcHJvY19yZWFkZGlyXzIocmVhZGRpcmFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICByZWFkZGlycmVzICogbmZzcHJvY19yZWFkZGlyXzJfc3ZjKHJlYWRkaXJhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1NUQVRGUyAxNworZXh0ZXJuICBzdGF0ZnNyZXMgKiBuZnNwcm9jX3N0YXRmc18yKG5mc19maCAqLCBDTElFTlQgKik7CitleHRlcm4gIHN0YXRmc3JlcyAqIG5mc3Byb2Nfc3RhdGZzXzJfc3ZjKG5mc19maCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgbmZzX3Byb2dyYW1fMl9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIE5GU1BST0NfTlVMTCAwCitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX251bGxfMigpOworZXh0ZXJuICB2b2lkICogbmZzcHJvY19udWxsXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfR0VUQVRUUiAxCitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY19nZXRhdHRyXzIoKTsKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX2dldGF0dHJfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19TRVRBVFRSIDIKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX3NldGF0dHJfMigpOworZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2Nfc2V0YXR0cl8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1JPT1QgMworZXh0ZXJuICB2b2lkICogbmZzcHJvY19yb290XzIoKTsKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2Nfcm9vdF8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX0xPT0tVUCA0CitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19sb29rdXBfMigpOworZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfbG9va3VwXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfUkVBRExJTksgNQorZXh0ZXJuICByZWFkbGlua3JlcyAqIG5mc3Byb2NfcmVhZGxpbmtfMigpOworZXh0ZXJuICByZWFkbGlua3JlcyAqIG5mc3Byb2NfcmVhZGxpbmtfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19SRUFEIDYKK2V4dGVybiAgcmVhZHJlcyAqIG5mc3Byb2NfcmVhZF8yKCk7CitleHRlcm4gIHJlYWRyZXMgKiBuZnNwcm9jX3JlYWRfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19XUklURUNBQ0hFIDcKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2Nfd3JpdGVjYWNoZV8yKCk7CitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX3dyaXRlY2FjaGVfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19XUklURSA4CitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY193cml0ZV8yKCk7CitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY193cml0ZV8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX0NSRUFURSA5CitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19jcmVhdGVfMigpOworZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfY3JlYXRlXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfUkVNT1ZFIDEwCitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3JlbW92ZV8yKCk7CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3JlbW92ZV8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1JFTkFNRSAxMQorZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19yZW5hbWVfMigpOworZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19yZW5hbWVfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19MSU5LIDEyCitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX2xpbmtfMigpOworZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19saW5rXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfU1lNTElOSyAxMworZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19zeW1saW5rXzIoKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2Nfc3ltbGlua18yX3N2YygpOworI2RlZmluZSBORlNQUk9DX01LRElSIDE0CitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19ta2Rpcl8yKCk7CitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19ta2Rpcl8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1JNRElSIDE1CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3JtZGlyXzIoKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2Nfcm1kaXJfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19SRUFERElSIDE2CitleHRlcm4gIHJlYWRkaXJyZXMgKiBuZnNwcm9jX3JlYWRkaXJfMigpOworZXh0ZXJuICByZWFkZGlycmVzICogbmZzcHJvY19yZWFkZGlyXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfU1RBVEZTIDE3CitleHRlcm4gIHN0YXRmc3JlcyAqIG5mc3Byb2Nfc3RhdGZzXzIoKTsKK2V4dGVybiAgc3RhdGZzcmVzICogbmZzcHJvY19zdGF0ZnNfMl9zdmMoKTsKK2V4dGVybiBpbnQgbmZzX3Byb2dyYW1fMl9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX25mc3N0YXQgKFhEUiAqLCBuZnNzdGF0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZnR5cGUgKFhEUiAqLCBmdHlwZSopOworZXh0ZXJuICBib29sX3QgeGRyX25mc19maCAoWERSICosIG5mc19maCopOworZXh0ZXJuICBib29sX3QgeGRyX25mc3RpbWUgKFhEUiAqLCBuZnN0aW1lKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZmF0dHIgKFhEUiAqLCBmYXR0ciopOworZXh0ZXJuICBib29sX3QgeGRyX3NhdHRyIChYRFIgKiwgc2F0dHIqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9maWxlbmFtZSAoWERSICosIGZpbGVuYW1lKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmZzcGF0aCAoWERSICosIG5mc3BhdGgqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9hdHRyc3RhdCAoWERSICosIGF0dHJzdGF0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfc2F0dHJhcmdzIChYRFIgKiwgc2F0dHJhcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZGlyb3BhcmdzIChYRFIgKiwgZGlyb3BhcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZGlyb3Bva3JlcyAoWERSICosIGRpcm9wb2tyZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9kaXJvcHJlcyAoWERSICosIGRpcm9wcmVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfcmVhZGxpbmtyZXMgKFhEUiAqLCByZWFkbGlua3JlcyopOworZXh0ZXJuICBib29sX3QgeGRyX3JlYWRhcmdzIChYRFIgKiwgcmVhZGFyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9yZWFkb2tyZXMgKFhEUiAqLCByZWFkb2tyZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9yZWFkcmVzIChYRFIgKiwgcmVhZHJlcyopOworZXh0ZXJuICBib29sX3QgeGRyX3dyaXRlYXJncyAoWERSICosIHdyaXRlYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX2NyZWF0ZWFyZ3MgKFhEUiAqLCBjcmVhdGVhcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfcmVuYW1lYXJncyAoWERSICosIHJlbmFtZWFyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9saW5rYXJncyAoWERSICosIGxpbmthcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfc3ltbGlua2FyZ3MgKFhEUiAqLCBzeW1saW5rYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX25mc2Nvb2tpZSAoWERSICosIG5mc2Nvb2tpZSk7CitleHRlcm4gIGJvb2xfdCB4ZHJfcmVhZGRpcmFyZ3MgKFhEUiAqLCByZWFkZGlyYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX2VudHJ5IChYRFIgKiwgZW50cnkqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9kaXJsaXN0IChYRFIgKiwgZGlybGlzdCopOworZXh0ZXJuICBib29sX3QgeGRyX3JlYWRkaXJyZXMgKFhEUiAqLCByZWFkZGlycmVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfc3RhdGZzb2tyZXMgKFhEUiAqLCBzdGF0ZnNva3JlcyopOworZXh0ZXJuICBib29sX3QgeGRyX3N0YXRmc3JlcyAoWERSICosIHN0YXRmc3JlcyopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfbmZzc3RhdCAoKTsKK2V4dGVybiBib29sX3QgeGRyX2Z0eXBlICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmZzX2ZoICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmZzdGltZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX2ZhdHRyICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfc2F0dHIgKCk7CitleHRlcm4gYm9vbF90IHhkcl9maWxlbmFtZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX25mc3BhdGggKCk7CitleHRlcm4gYm9vbF90IHhkcl9hdHRyc3RhdCAoKTsKK2V4dGVybiBib29sX3QgeGRyX3NhdHRyYXJncyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2Rpcm9wYXJncyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2Rpcm9wb2tyZXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9kaXJvcHJlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3JlYWRsaW5rcmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmVhZGFyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9yZWFkb2tyZXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9yZWFkcmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfd3JpdGVhcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfY3JlYXRlYXJncyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3JlbmFtZWFyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9saW5rYXJncyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3N5bWxpbmthcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmZzY29va2llICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmVhZGRpcmFyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9lbnRyeSAoKTsKK2V4dGVybiBib29sX3QgeGRyX2Rpcmxpc3QgKCk7CitleHRlcm4gYm9vbF90IHhkcl9yZWFkZGlycmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfc3RhdGZzb2tyZXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9zdGF0ZnNyZXMgKCk7CisKKyNlbmRpZiAvKiBLJlIgQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9ORlNfUFJPVF9IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmZzX3Byb3QueCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25mc19wcm90LngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ5OTJlMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25mc19wcm90LngKQEAgLTAsMCArMSwzNTIgQEAKKy8qIEAoIyluZnNfcHJvdC54CTIuMSA4OC8wOC8wMSA0LjAgUlBDU1JDICovCisKKy8qCisgKiBuZnNfcHJvdC54IDEuMiA4Ny8xMC8xMgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK2NvbnN0IE5GU19QT1JUICAgICAgICAgID0gMjA0OTsKK2NvbnN0IE5GU19NQVhEQVRBICAgICAgID0gODE5MjsKK2NvbnN0IE5GU19NQVhQQVRITEVOICAgID0gMTAyNDsKK2NvbnN0IE5GU19NQVhOQU1MRU4JPSAyNTU7Citjb25zdCBORlNfRkhTSVpFCT0gMzI7Citjb25zdCBORlNfQ09PS0lFU0laRQk9IDQ7Citjb25zdCBORlNfRklGT19ERVYJPSAtMTsJLyogc2l6ZSBrbHVkZ2UgZm9yIG5hbWVkIHBpcGVzICovCisKKy8qCisgKiBGaWxlIHR5cGVzCisgKi8KK2NvbnN0IE5GU01PREVfRk1UICA9IDAxNzAwMDA7CS8qIHR5cGUgb2YgZmlsZSAqLworY29uc3QgTkZTTU9ERV9ESVIgID0gMDA0MDAwMDsJLyogZGlyZWN0b3J5ICovCitjb25zdCBORlNNT0RFX0NIUiAgPSAwMDIwMDAwOwkvKiBjaGFyYWN0ZXIgc3BlY2lhbCAqLworY29uc3QgTkZTTU9ERV9CTEsgID0gMDA2MDAwMDsJLyogYmxvY2sgc3BlY2lhbCAqLworY29uc3QgTkZTTU9ERV9SRUcgID0gMDEwMDAwMDsJLyogcmVndWxhciAqLworY29uc3QgTkZTTU9ERV9MTksgID0gMDEyMDAwMDsJLyogc3ltYm9saWMgbGluayAqLworY29uc3QgTkZTTU9ERV9TT0NLID0gMDE0MDAwMDsJLyogc29ja2V0ICovCitjb25zdCBORlNNT0RFX0ZJRk8gPSAwMDEwMDAwOwkvKiBmaWZvICovCisKKy8qCisgKiBFcnJvciBzdGF0dXMKKyAqLworZW51bSBuZnNzdGF0IHsKKwlORlNfT0s9IDAsCQkvKiBubyBlcnJvciAqLworCU5GU0VSUl9QRVJNPTEsCQkvKiBOb3Qgb3duZXIgKi8KKwlORlNFUlJfTk9FTlQ9MiwJCS8qIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgKi8KKwlORlNFUlJfSU89NSwJCS8qIEkvTyBlcnJvciAqLworCU5GU0VSUl9OWElPPTYsCQkvKiBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzICovCisJTkZTRVJSX0FDQ0VTPTEzLAkvKiBQZXJtaXNzaW9uIGRlbmllZCAqLworCU5GU0VSUl9FWElTVD0xNywJLyogRmlsZSBleGlzdHMgKi8KKwlORlNFUlJfTk9ERVY9MTksCS8qIE5vIHN1Y2ggZGV2aWNlICovCisJTkZTRVJSX05PVERJUj0yMCwJLyogTm90IGEgZGlyZWN0b3J5Ki8KKwlORlNFUlJfSVNESVI9MjEsCS8qIElzIGEgZGlyZWN0b3J5ICovCisJTkZTRVJSX0ZCSUc9MjcsCQkvKiBGaWxlIHRvbyBsYXJnZSAqLworCU5GU0VSUl9OT1NQQz0yOCwJLyogTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UgKi8KKwlORlNFUlJfUk9GUz0zMCwJCS8qIFJlYWQtb25seSBmaWxlIHN5c3RlbSAqLworCU5GU0VSUl9OQU1FVE9PTE9ORz02MywJLyogRmlsZSBuYW1lIHRvbyBsb25nICovCisJTkZTRVJSX05PVEVNUFRZPTY2LAkvKiBEaXJlY3Rvcnkgbm90IGVtcHR5ICovCisJTkZTRVJSX0RRVU9UPTY5LAkvKiBEaXNjIHF1b3RhIGV4Y2VlZGVkICovCisJTkZTRVJSX1NUQUxFPTcwLAkvKiBTdGFsZSBORlMgZmlsZSBoYW5kbGUgKi8KKwlORlNFUlJfV0ZMVVNIPTk5CS8qIHdyaXRlIGNhY2hlIGZsdXNoZWQgKi8KK307CisKKy8qCisgKiBGaWxlIHR5cGVzCisgKi8KK2VudW0gZnR5cGUgeworCU5GTk9OID0gMCwJLyogbm9uLWZpbGUgKi8KKwlORlJFRyA9IDEsCS8qIHJlZ3VsYXIgZmlsZSAqLworCU5GRElSID0gMiwJLyogZGlyZWN0b3J5ICovCisJTkZCTEsgPSAzLAkvKiBibG9jayBzcGVjaWFsICovCisJTkZDSFIgPSA0LAkvKiBjaGFyYWN0ZXIgc3BlY2lhbCAqLworCU5GTE5LID0gNSwJLyogc3ltYm9saWMgbGluayAqLworCU5GU09DSyA9IDYsCS8qIHVuaXggZG9tYWluIHNvY2tldHMgKi8KKwlORkJBRCA9IDcsCS8qIHVudXNlZCAqLworCU5GRklGTyA9IDggCS8qIG5hbWVkIHBpcGUgKi8KK307CisKKy8qCisgKiBGaWxlIGFjY2VzcyBoYW5kbGUKKyAqLworc3RydWN0IG5mc19maCB7CisJb3BhcXVlIGRhdGFbTkZTX0ZIU0laRV07Cit9OworCisvKgorICogVGltZXZhbAorICovCitzdHJ1Y3QgbmZzdGltZSB7CisJdW5zaWduZWQgc2Vjb25kczsKKwl1bnNpZ25lZCB1c2Vjb25kczsKK307CisKKworLyoKKyAqIEZpbGUgYXR0cmlidXRlcworICovCitzdHJ1Y3QgZmF0dHIgeworCWZ0eXBlIHR5cGU7CQkvKiBmaWxlIHR5cGUgKi8KKwl1bnNpZ25lZCBtb2RlOwkJLyogcHJvdGVjdGlvbiBtb2RlIGJpdHMgKi8KKwl1bnNpZ25lZCBubGluazsJCS8qICMgaGFyZCBsaW5rcyAqLworCXVuc2lnbmVkIHVpZDsJCS8qIG93bmVyIHVzZXIgaWQgKi8KKwl1bnNpZ25lZCBnaWQ7CQkvKiBvd25lciBncm91cCBpZCAqLworCXVuc2lnbmVkIHNpemU7CQkvKiBmaWxlIHNpemUgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBibG9ja3NpemU7CS8qIHByZWZlcnJlZCBibG9jayBzaXplICovCisJdW5zaWduZWQgcmRldjsJCS8qIHNwZWNpYWwgZGV2aWNlICMgKi8KKwl1bnNpZ25lZCBibG9ja3M7CS8qIEtiIG9mIGRpc2sgdXNlZCBieSBmaWxlICovCisJdW5zaWduZWQgZnNpZDsJCS8qIGRldmljZSAjICovCisJdW5zaWduZWQgZmlsZWlkOwkvKiBpbm9kZSAjICovCisJbmZzdGltZQlhdGltZTsJCS8qIHRpbWUgb2YgbGFzdCBhY2Nlc3MgKi8KKwluZnN0aW1lCW10aW1lOwkJLyogdGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiAqLworCW5mc3RpbWUJY3RpbWU7CQkvKiB0aW1lIG9mIGxhc3QgY2hhbmdlICovCit9OworCisvKgorICogRmlsZSBhdHRyaWJ1dGVzIHdoaWNoIGNhbiBiZSBzZXQKKyAqLworc3RydWN0IHNhdHRyIHsKKwl1bnNpZ25lZCBtb2RlOwkvKiBwcm90ZWN0aW9uIG1vZGUgYml0cyAqLworCXVuc2lnbmVkIHVpZDsJLyogb3duZXIgdXNlciBpZCAqLworCXVuc2lnbmVkIGdpZDsJLyogb3duZXIgZ3JvdXAgaWQgKi8KKwl1bnNpZ25lZCBzaXplOwkvKiBmaWxlIHNpemUgaW4gYnl0ZXMgKi8KKwluZnN0aW1lCWF0aW1lOwkvKiB0aW1lIG9mIGxhc3QgYWNjZXNzICovCisJbmZzdGltZQltdGltZTsJLyogdGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiAqLworfTsKKworCit0eXBlZGVmIHN0cmluZyBmaWxlbmFtZTxORlNfTUFYTkFNTEVOPjsKK3R5cGVkZWYgc3RyaW5nIG5mc3BhdGg8TkZTX01BWFBBVEhMRU4+OworCisvKgorICogUmVwbHkgc3RhdHVzIHdpdGggZmlsZSBhdHRyaWJ1dGVzCisgKi8KK3VuaW9uIGF0dHJzdGF0IHN3aXRjaCAobmZzc3RhdCBzdGF0dXMpIHsKK2Nhc2UgTkZTX09LOgorCWZhdHRyIGF0dHJpYnV0ZXM7CitkZWZhdWx0OgorCXZvaWQ7Cit9OworCitzdHJ1Y3Qgc2F0dHJhcmdzIHsKKwluZnNfZmggZmlsZTsKKwlzYXR0ciBhdHRyaWJ1dGVzOworfTsKKworLyoKKyAqIEFyZ3VtZW50cyBmb3IgZGlyZWN0b3J5IG9wZXJhdGlvbnMKKyAqLworc3RydWN0IGRpcm9wYXJncyB7CisJbmZzX2ZoCWRpcjsJLyogZGlyZWN0b3J5IGZpbGUgaGFuZGxlICovCisJZmlsZW5hbWUgbmFtZTsJCS8qIG5hbWUgKHVwIHRvIE5GU19NQVhOQU1MRU4gYnl0ZXMpICovCit9OworCitzdHJ1Y3QgZGlyb3Bva3JlcyB7CisJbmZzX2ZoIGZpbGU7CisJZmF0dHIgYXR0cmlidXRlczsKK307CisKKy8qCisgKiBSZXN1bHRzIGZyb20gZGlyZWN0b3J5IG9wZXJhdGlvbgorICovCit1bmlvbiBkaXJvcHJlcyBzd2l0Y2ggKG5mc3N0YXQgc3RhdHVzKSB7CitjYXNlIE5GU19PSzoKKwlkaXJvcG9rcmVzIGRpcm9wcmVzOworZGVmYXVsdDoKKwl2b2lkOworfTsKKwordW5pb24gcmVhZGxpbmtyZXMgc3dpdGNoIChuZnNzdGF0IHN0YXR1cykgeworY2FzZSBORlNfT0s6CisJbmZzcGF0aCBkYXRhOworZGVmYXVsdDoKKwl2b2lkOworfTsKKworLyoKKyAqIEFyZ3VtZW50cyB0byByZW1vdGUgcmVhZAorICovCitzdHJ1Y3QgcmVhZGFyZ3MgeworCW5mc19maCBmaWxlOwkJLyogaGFuZGxlIGZvciBmaWxlICovCisJdW5zaWduZWQgb2Zmc2V0OwkvKiBieXRlIG9mZnNldCBpbiBmaWxlICovCisJdW5zaWduZWQgY291bnQ7CQkvKiBpbW1lZGlhdGUgcmVhZCBjb3VudCAqLworCXVuc2lnbmVkIHRvdGFsY291bnQ7CS8qIHRvdGFsIHJlYWQgY291bnQgKGZyb20gdGhpcyBvZmZzZXQpKi8KK307CisKKy8qCisgKiBTdGF0dXMgT0sgcG9ydGlvbiBvZiByZW1vdGUgcmVhZCByZXBseQorICovCitzdHJ1Y3QgcmVhZG9rcmVzIHsKKwlmYXR0cglhdHRyaWJ1dGVzOwkvKiBhdHRyaWJ1dGVzLCBuZWVkIGZvciBwYWdpbiovCisJb3BhcXVlIGRhdGE8TkZTX01BWERBVEE+OworfTsKKwordW5pb24gcmVhZHJlcyBzd2l0Y2ggKG5mc3N0YXQgc3RhdHVzKSB7CitjYXNlIE5GU19PSzoKKwlyZWFkb2tyZXMgcmVwbHk7CitkZWZhdWx0OgorCXZvaWQ7Cit9OworCisvKgorICogQXJndW1lbnRzIHRvIHJlbW90ZSB3cml0ZQorICovCitzdHJ1Y3Qgd3JpdGVhcmdzIHsKKwluZnNfZmgJZmlsZTsJCS8qIGhhbmRsZSBmb3IgZmlsZSAqLworCXVuc2lnbmVkIGJlZ2lub2Zmc2V0OwkvKiBiZWdpbm5pbmcgYnl0ZSBvZmZzZXQgaW4gZmlsZSAqLworCXVuc2lnbmVkIG9mZnNldDsJLyogY3VycmVudCBieXRlIG9mZnNldCBpbiBmaWxlICovCisJdW5zaWduZWQgdG90YWxjb3VudDsJLyogdG90YWwgd3JpdGUgY291bnQgKHRvIHRoaXMgb2Zmc2V0KSovCisJb3BhcXVlIGRhdGE8TkZTX01BWERBVEE+OworfTsKKworc3RydWN0IGNyZWF0ZWFyZ3MgeworCWRpcm9wYXJncyB3aGVyZTsKKwlzYXR0ciBhdHRyaWJ1dGVzOworfTsKKworc3RydWN0IHJlbmFtZWFyZ3MgeworCWRpcm9wYXJncyBmcm9tOworCWRpcm9wYXJncyB0bzsKK307CisKK3N0cnVjdCBsaW5rYXJncyB7CisJbmZzX2ZoIGZyb207CisJZGlyb3BhcmdzIHRvOworfTsKKworc3RydWN0IHN5bWxpbmthcmdzIHsKKwlkaXJvcGFyZ3MgZnJvbTsKKwluZnNwYXRoIHRvOworCXNhdHRyIGF0dHJpYnV0ZXM7Cit9OworCisKK3R5cGVkZWYgb3BhcXVlIG5mc2Nvb2tpZVtORlNfQ09PS0lFU0laRV07CisKKy8qCisgKiBBcmd1bWVudHMgdG8gcmVhZGRpcgorICovCitzdHJ1Y3QgcmVhZGRpcmFyZ3MgeworCW5mc19maCBkaXI7CQkvKiBkaXJlY3RvcnkgaGFuZGxlICovCisJbmZzY29va2llIGNvb2tpZTsKKwl1bnNpZ25lZCBjb3VudDsJCS8qIG51bWJlciBvZiBkaXJlY3RvcnkgYnl0ZXMgdG8gcmVhZCAqLworfTsKKworc3RydWN0IGVudHJ5IHsKKwl1bnNpZ25lZCBmaWxlaWQ7CisJZmlsZW5hbWUgbmFtZTsKKwluZnNjb29raWUgY29va2llOworCWVudHJ5ICpuZXh0ZW50cnk7Cit9OworCitzdHJ1Y3QgZGlybGlzdCB7CisJZW50cnkgKmVudHJpZXM7CisJYm9vbCBlb2Y7Cit9OworCit1bmlvbiByZWFkZGlycmVzIHN3aXRjaCAobmZzc3RhdCBzdGF0dXMpIHsKK2Nhc2UgTkZTX09LOgorCWRpcmxpc3QgcmVwbHk7CitkZWZhdWx0OgorCXZvaWQ7Cit9OworCitzdHJ1Y3Qgc3RhdGZzb2tyZXMgeworCXVuc2lnbmVkIHRzaXplOwkvKiBwcmVmZXJyZWQgdHJhbnNmZXIgc2l6ZSBpbiBieXRlcyAqLworCXVuc2lnbmVkIGJzaXplOwkvKiBmdW5kYW1lbnRhbCBmaWxlIHN5c3RlbSBibG9jayBzaXplICovCisJdW5zaWduZWQgYmxvY2tzOwkvKiB0b3RhbCBibG9ja3MgaW4gZmlsZSBzeXN0ZW0gKi8KKwl1bnNpZ25lZCBiZnJlZTsJLyogZnJlZSBibG9ja3MgaW4gZnMgKi8KKwl1bnNpZ25lZCBiYXZhaWw7CS8qIGZyZWUgYmxvY2tzIGF2YWlsIHRvIG5vbi1zdXBlcnVzZXIgKi8KK307CisKK3VuaW9uIHN0YXRmc3JlcyBzd2l0Y2ggKG5mc3N0YXQgc3RhdHVzKSB7CitjYXNlIE5GU19PSzoKKwlzdGF0ZnNva3JlcyByZXBseTsKK2RlZmF1bHQ6CisJdm9pZDsKK307CisKKy8qCisgKiBSZW1vdGUgZmlsZSBzZXJ2aWNlIHJvdXRpbmVzCisgKi8KK3Byb2dyYW0gTkZTX1BST0dSQU0geworCXZlcnNpb24gTkZTX1ZFUlNJT04geworCQl2b2lkCisJCU5GU1BST0NfTlVMTCh2b2lkKSA9IDA7CisKKwkJYXR0cnN0YXQKKwkJTkZTUFJPQ19HRVRBVFRSKG5mc19maCkgPQkxOworCisJCWF0dHJzdGF0CisJCU5GU1BST0NfU0VUQVRUUihzYXR0cmFyZ3MpID0gMjsKKworCQl2b2lkCisJCU5GU1BST0NfUk9PVCh2b2lkKSA9IDM7CisKKwkJZGlyb3ByZXMKKwkJTkZTUFJPQ19MT09LVVAoZGlyb3BhcmdzKSA9IDQ7CisKKwkJcmVhZGxpbmtyZXMKKwkJTkZTUFJPQ19SRUFETElOSyhuZnNfZmgpID0gNTsKKworCQlyZWFkcmVzCisJCU5GU1BST0NfUkVBRChyZWFkYXJncykgPSA2OworCisJCXZvaWQKKwkJTkZTUFJPQ19XUklURUNBQ0hFKHZvaWQpID0gNzsKKworCQlhdHRyc3RhdAorCQlORlNQUk9DX1dSSVRFKHdyaXRlYXJncykgPSA4OworCisJCWRpcm9wcmVzCisJCU5GU1BST0NfQ1JFQVRFKGNyZWF0ZWFyZ3MpID0gOTsKKworCQluZnNzdGF0CisJCU5GU1BST0NfUkVNT1ZFKGRpcm9wYXJncykgPSAxMDsKKworCQluZnNzdGF0CisJCU5GU1BST0NfUkVOQU1FKHJlbmFtZWFyZ3MpID0gMTE7CisKKwkJbmZzc3RhdAorCQlORlNQUk9DX0xJTksobGlua2FyZ3MpID0gMTI7CisKKwkJbmZzc3RhdAorCQlORlNQUk9DX1NZTUxJTksoc3ltbGlua2FyZ3MpID0gMTM7CisKKwkJZGlyb3ByZXMKKwkJTkZTUFJPQ19NS0RJUihjcmVhdGVhcmdzKSA9IDE0OworCisJCW5mc3N0YXQKKwkJTkZTUFJPQ19STURJUihkaXJvcGFyZ3MpID0gMTU7CisKKwkJcmVhZGRpcnJlcworCQlORlNQUk9DX1JFQURESVIocmVhZGRpcmFyZ3MpID0gMTY7CisKKwkJc3RhdGZzcmVzCisJCU5GU1BST0NfU1RBVEZTKG5mc19maCkgPSAxNzsKKwl9ID0gMjsKK30gPSAxMDAwMDM7CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNWM3YmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXMuaApAQCAtMCwwICsxLDYxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1JQQ1NWQ19OSVNfSAorI2RlZmluZSBfUlBDU1ZDX05JU19IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8cnBjL3JwYy5oPgorI2luY2x1ZGUgPHJwY3N2Yy9uaXNfdGFncy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qCisgKgluaXMuaAorICoKKyAqCVRoaXMgZmlsZSBpcyB0aGUgbWFpbiBpbmNsdWRlIGZpbGUgZm9yIE5JUyBjbGllbnRzLiBJdCBjb250YWlucworICoJYm90aCB0aGUgY2xpZW50IGxpYnJhcnkgZnVuY3Rpb24gZGVmaW5lcyBhbmQgdGhlIHZhcmlvdXMgZGF0YQorICoJc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBOSVMgc2VydmljZS4gSXQgaW5jbHVkZXMgdGhlIGZpbGUgbmlzX3RhZ3MuaAorICoJd2hpY2ggZGVmaW5lcyB0aGUgdGFnIHZhbHVlcy4gVGhpcyBhbGxvd3MgdGhlIHRhZ3MgdG8gY2hhbmdlIHdpdGhvdXQKKyAqCWhhdmluZyB0byBjaGFuZ2UgdGhlIG5pcy54IGZpbGUuCisgKgorICoJTk9URSA6IFRISVMgRklMRSBJUyBOT1QgR0VORVJBVEVEIFdJVEggUlBDR0VOICEgU08gWU9VIEhBVkUgVE8KKyAqICAgICAgICAgICAgIEFERCBBTEwgVEhFIENIQU5HRVMgT04gbmlzXyoueCBGSUxFUyBIRVJFIEFHQUlOICEKKyAqCisgKiAgICAgIEkgaGF2ZSByZW1vdmVkIGFsbCB0aGUgU29sYXJpcyBpbnRlcm5hbCBzdHJ1Y3RzIGFuZCB2YXJpYWJsZXMsCisgKiAgICAgIGJlY2F1c2UgdGhleSBhcmUgbm90IHN1cHBvcnRlZCwgU3VuIGNoYW5nZWQgdGhlbSBiZXR3ZWVuIHZhcmlvdXMKKyAqICAgICAgcmVsZWFzZXMgYW5kIHRoZXkgc2hvdWxkbid0IGJlIHVzZWQgaW4gdXNlciBwcm9ncmFtcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxrdWt1a0BzdXNlLmRlPgorICovCisKKworI2lmbmRlZiBfX25pc19vYmplY3RfaAorI2RlZmluZSBfX25pc19vYmplY3RfaAorCisjZGVmaW5lIE5JU19NQVhTVFJJTkdMRU4gMjU1CisjZGVmaW5lIE5JU19NQVhOQU1FTEVOIDEwMjQKKyNkZWZpbmUgTklTX01BWEFUVFJOQU1FIDMyCisjZGVmaW5lIE5JU19NQVhBVFRSVkFMIDIwNDgKKyNkZWZpbmUgTklTX01BWENPTFVNTlMgNjQKKyNkZWZpbmUgTklTX01BWEFUVFIgMTYKKyNkZWZpbmUgTklTX01BWFBBVEggMTAyNAorI2RlZmluZSBOSVNfTUFYUkVQTElDQVMgMTI4CisjZGVmaW5lIE5JU19NQVhMSU5LUyAxNgorI2RlZmluZSBOSVNfUEtfTk9ORSAwCisjZGVmaW5lIE5JU19QS19ESCAxCisjZGVmaW5lIE5JU19QS19SU0EgMgorI2RlZmluZSBOSVNfUEtfS0VSQiAzCisjZGVmaW5lIE5JU19QS19ESEVYVCA0CisKK3N0cnVjdCBuaXNfYXR0ciB7CisJY2hhciAqemF0dHJfbmR4OworCXN0cnVjdCB7CisJCXVfaW50IHphdHRyX3ZhbF9sZW47CisJCWNoYXIgKnphdHRyX3ZhbF92YWw7CisJfSB6YXR0cl92YWw7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmlzX2F0dHIgbmlzX2F0dHI7CisKK3R5cGVkZWYgY2hhciAqbmlzX25hbWU7CisKK2VudW0gem90eXBlcyB7CisJQk9HVVNfT0JKID0gMCwKKwlOT19PQkogPSAxLAorCURJUkVDVE9SWV9PQkogPSAyLAorCUdST1VQX09CSiA9IDMsCisJVEFCTEVfT0JKID0gNCwKKwlFTlRSWV9PQkogPSA1LAorCUxJTktfT0JKID0gNiwKKwlQUklWQVRFX09CSiA9IDcsCisJTklTX0JPR1VTX09CSiA9IDAsCisJTklTX05PX09CSiA9IDEsCisJTklTX0RJUkVDVE9SWV9PQkogPSAyLAorCU5JU19HUk9VUF9PQkogPSAzLAorCU5JU19UQUJMRV9PQkogPSA0LAorCU5JU19FTlRSWV9PQkogPSA1LAorCU5JU19MSU5LX09CSiA9IDYsCisJTklTX1BSSVZBVEVfT0JKID0gNworfTsKK3R5cGVkZWYgZW51bSB6b3R5cGVzIHpvdHlwZXM7CisKK2VudW0gbnN0eXBlIHsKKwlVTktOT1dOID0gMCwKKwlOSVMgPSAxLAorCVNVTllQID0gMiwKKwlJVlkgPSAzLAorCUROUyA9IDQsCisJWDUwMCA9IDUsCisJRE5BTlMgPSA2LAorCVhDSFMgPSA3LAorCUNEUyA9IDgsCit9OwordHlwZWRlZiBlbnVtIG5zdHlwZSBuc3R5cGU7CisKK3N0cnVjdCBvYXJfbWFzayB7CisJdWludDMyX3Qgb2FfcmlnaHRzOworCXpvdHlwZXMgb2Ffb3R5cGU7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgb2FyX21hc2sgb2FyX21hc2s7CisKK3N0cnVjdCBlbmRwb2ludCB7CisJY2hhciAqdWFkZHI7CisJY2hhciAqZmFtaWx5OworCWNoYXIgKnByb3RvOworfTsKK3R5cGVkZWYgc3RydWN0IGVuZHBvaW50IGVuZHBvaW50OworCitzdHJ1Y3QgbmlzX3NlcnZlciB7CisJbmlzX25hbWUgbmFtZTsKKwlzdHJ1Y3QgeworCQl1X2ludCBlcF9sZW47CisJCWVuZHBvaW50ICplcF92YWw7CisJfSBlcDsKKwl1aW50MzJfdCBrZXlfdHlwZTsKKwluZXRvYmogcGtleTsKK307Cit0eXBlZGVmIHN0cnVjdCBuaXNfc2VydmVyIG5pc19zZXJ2ZXI7CisKK3N0cnVjdCBkaXJlY3Rvcnlfb2JqIHsKKwluaXNfbmFtZSBkb19uYW1lOworCW5zdHlwZSBkb190eXBlOworCXN0cnVjdCB7CisJCXVfaW50IGRvX3NlcnZlcnNfbGVuOworCQluaXNfc2VydmVyICpkb19zZXJ2ZXJzX3ZhbDsKKwl9IGRvX3NlcnZlcnM7CisJdWludDMyX3QgZG9fdHRsOworCXN0cnVjdCB7CisJCXVfaW50IGRvX2FybWFza19sZW47CisJCW9hcl9tYXNrICpkb19hcm1hc2tfdmFsOworCX0gZG9fYXJtYXNrOworfTsKK3R5cGVkZWYgc3RydWN0IGRpcmVjdG9yeV9vYmogZGlyZWN0b3J5X29iajsKKworI2RlZmluZSBFTl9CSU5BUlkgMQorI2RlZmluZSBFTl9DUllQVCAyCisjZGVmaW5lIEVOX1hEUiA0CisjZGVmaW5lIEVOX01PRElGSUVEIDgKKyNkZWZpbmUgRU5fQVNOMSA2NAorCitzdHJ1Y3QgZW50cnlfY29sIHsKKwl1aW50MzJfdCBlY19mbGFnczsKKwlzdHJ1Y3QgeworCQl1X2ludCBlY192YWx1ZV9sZW47CisJCWNoYXIgKmVjX3ZhbHVlX3ZhbDsKKwl9IGVjX3ZhbHVlOworfTsKK3R5cGVkZWYgc3RydWN0IGVudHJ5X2NvbCBlbnRyeV9jb2w7CisKK3N0cnVjdCBlbnRyeV9vYmogeworCWNoYXIgKmVuX3R5cGU7CisJc3RydWN0IHsKKwkJdV9pbnQgZW5fY29sc19sZW47CisJCWVudHJ5X2NvbCAqZW5fY29sc192YWw7CisJfSBlbl9jb2xzOworfTsKK3R5cGVkZWYgc3RydWN0IGVudHJ5X29iaiBlbnRyeV9vYmo7CisKK3N0cnVjdCBncm91cF9vYmogeworCXVpbnQzMl90IGdyX2ZsYWdzOworCXN0cnVjdCB7CisJCXVfaW50IGdyX21lbWJlcnNfbGVuOworCQluaXNfbmFtZSAqZ3JfbWVtYmVyc192YWw7CisJfSBncl9tZW1iZXJzOworfTsKK3R5cGVkZWYgc3RydWN0IGdyb3VwX29iaiBncm91cF9vYmo7CisKK3N0cnVjdCBsaW5rX29iaiB7CisJem90eXBlcyBsaV9ydHlwZTsKKwlzdHJ1Y3QgeworCQl1X2ludCBsaV9hdHRyc19sZW47CisJCW5pc19hdHRyICpsaV9hdHRyc192YWw7CisJfSBsaV9hdHRyczsKKwluaXNfbmFtZSBsaV9uYW1lOworfTsKK3R5cGVkZWYgc3RydWN0IGxpbmtfb2JqIGxpbmtfb2JqOworCisjZGVmaW5lIFRBX0JJTkFSWSAxCisjZGVmaW5lIFRBX0NSWVBUIDIKKyNkZWZpbmUgVEFfWERSIDQKKyNkZWZpbmUgVEFfU0VBUkNIQUJMRSA4CisjZGVmaW5lIFRBX0NBU0UgMTYKKyNkZWZpbmUgVEFfTU9ESUZJRUQgMzIKKyNkZWZpbmUgVEFfQVNOMSA2NAorCitzdHJ1Y3QgdGFibGVfY29sIHsKKwljaGFyICp0Y19uYW1lOworCXVpbnQzMl90IHRjX2ZsYWdzOworCXVpbnQzMl90IHRjX3JpZ2h0czsKK307Cit0eXBlZGVmIHN0cnVjdCB0YWJsZV9jb2wgdGFibGVfY29sOworCitzdHJ1Y3QgdGFibGVfb2JqIHsKKwljaGFyICp0YV90eXBlOworCWludCB0YV9tYXhjb2w7CisJdV9jaGFyIHRhX3NlcDsKKwlzdHJ1Y3QgeworCQl1X2ludCB0YV9jb2xzX2xlbjsKKwkJdGFibGVfY29sICp0YV9jb2xzX3ZhbDsKKwl9IHRhX2NvbHM7CisJY2hhciAqdGFfcGF0aDsKK307Cit0eXBlZGVmIHN0cnVjdCB0YWJsZV9vYmogdGFibGVfb2JqOworCitzdHJ1Y3Qgb2JqZGF0YSB7CisJem90eXBlcyB6b190eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IGRpcmVjdG9yeV9vYmogZGlfZGF0YTsKKwkJc3RydWN0IGdyb3VwX29iaiBncl9kYXRhOworCQlzdHJ1Y3QgdGFibGVfb2JqIHRhX2RhdGE7CisJCXN0cnVjdCBlbnRyeV9vYmogZW5fZGF0YTsKKwkJc3RydWN0IGxpbmtfb2JqIGxpX2RhdGE7CisJCXN0cnVjdCB7CisJCQl1X2ludCBwb19kYXRhX2xlbjsKKwkJCWNoYXIgKnBvX2RhdGFfdmFsOworCQl9IHBvX2RhdGE7CisJfSBvYmpkYXRhX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgb2JqZGF0YSBvYmpkYXRhOworCitzdHJ1Y3QgbmlzX29pZCB7CisJdWludDMyX3QgY3RpbWU7CisJdWludDMyX3QgbXRpbWU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmlzX29pZCBuaXNfb2lkOworCitzdHJ1Y3QgbmlzX29iamVjdCB7CisJbmlzX29pZCB6b19vaWQ7CisJbmlzX25hbWUgem9fbmFtZTsKKwluaXNfbmFtZSB6b19vd25lcjsKKwluaXNfbmFtZSB6b19ncm91cDsKKwluaXNfbmFtZSB6b19kb21haW47CisJdWludDMyX3Qgem9fYWNjZXNzOworCXVpbnQzMl90IHpvX3R0bDsKKwlvYmpkYXRhIHpvX2RhdGE7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmlzX29iamVjdCBuaXNfb2JqZWN0OworCisjZW5kaWYgLyogaWYgX19uaXNfb2JqZWN0X2ggKi8KKworZW51bSBuaXNfZXJyb3IgeworCU5JU19TVUNDRVNTID0gMCwKKwlOSVNfU19TVUNDRVNTID0gMSwKKwlOSVNfTk9URk9VTkQgPSAyLAorCU5JU19TX05PVEZPVU5EID0gMywKKwlOSVNfQ0FDSEVFWFBJUkVEID0gNCwKKwlOSVNfTkFNRVVOUkVBQ0hBQkxFID0gNSwKKwlOSVNfVU5LTk9XTk9CSiA9IDYsCisJTklTX1RSWUFHQUlOID0gNywKKwlOSVNfU1lTVEVNRVJST1IgPSA4LAorCU5JU19DSEFJTkJST0tFTiA9IDksCisJTklTX1BFUk1JU1NJT04gPSAxMCwKKwlOSVNfTk9UT1dORVIgPSAxMSwKKwlOSVNfTk9UX01FID0gMTIsCisJTklTX05PTUVNT1JZID0gMTMsCisJTklTX05BTUVFWElTVFMgPSAxNCwKKwlOSVNfTk9UTUFTVEVSID0gMTUsCisJTklTX0lOVkFMSURPQkogPSAxNiwKKwlOSVNfQkFETkFNRSA9IDE3LAorCU5JU19OT0NBTExCQUNLID0gMTgsCisJTklTX0NCUkVTVUxUUyA9IDE5LAorCU5JU19OT1NVQ0hOQU1FID0gMjAsCisJTklTX05PVFVOSVFVRSA9IDIxLAorCU5JU19JQk1PREVSUk9SID0gMjIsCisJTklTX05PU1VDSFRBQkxFID0gMjMsCisJTklTX1RZUEVNSVNNQVRDSCA9IDI0LAorCU5JU19MSU5LTkFNRUVSUk9SID0gMjUsCisJTklTX1BBUlRJQUwgPSAyNiwKKwlOSVNfVE9PTUFOWUFUVFJTID0gMjcsCisJTklTX1JQQ0VSUk9SID0gMjgsCisJTklTX0JBREFUVFJJQlVURSA9IDI5LAorCU5JU19OT1RTRUFSQ0hBQkxFID0gMzAsCisJTklTX0NCRVJST1IgPSAzMSwKKwlOSVNfRk9SRUlHTk5TID0gMzIsCisJTklTX0JBRE9CSkVDVCA9IDMzLAorCU5JU19OT1RTQU1FT0JKID0gMzQsCisJTklTX01PREZBSUwgPSAzNSwKKwlOSVNfQkFEUkVRVUVTVCA9IDM2LAorCU5JU19OT1RFTVBUWSA9IDM3LAorCU5JU19DT0xEU1RBUlRfRVJSID0gMzgsCisJTklTX1JFU1lOQyA9IDM5LAorCU5JU19GQUlMID0gNDAsCisJTklTX1VOQVZBSUwgPSA0MSwKKwlOSVNfUkVTMkJJRyA9IDQyLAorCU5JU19TUlZBVVRIID0gNDMsCisJTklTX0NMTlRBVVRIID0gNDQsCisJTklTX05PRklMRVNQQUNFID0gNDUsCisJTklTX05PUFJPQyA9IDQ2LAorCU5JU19EVU1QTEFURVIgPSA0NywKK307Cit0eXBlZGVmIGVudW0gbmlzX2Vycm9yIG5pc19lcnJvcjsKKworc3RydWN0IG5pc19yZXN1bHQgeworCW5pc19lcnJvciBzdGF0dXM7CisJc3RydWN0IHsKKwkJdV9pbnQgb2JqZWN0c19sZW47CisJCW5pc19vYmplY3QgKm9iamVjdHNfdmFsOworCX0gb2JqZWN0czsKKwluZXRvYmogY29va2llOworCXVpbnQzMl90IHp0aWNrczsKKwl1aW50MzJfdCBkdGlja3M7CisJdWludDMyX3QgYXRpY2tzOworCXVpbnQzMl90IGN0aWNrczsKK307Cit0eXBlZGVmIHN0cnVjdCBuaXNfcmVzdWx0IG5pc19yZXN1bHQ7CisKK3N0cnVjdCBuc19yZXF1ZXN0IHsKKwluaXNfbmFtZSBuc19uYW1lOworCXN0cnVjdCB7CisJCXVfaW50IG5zX29iamVjdF9sZW47CisJCW5pc19vYmplY3QgKm5zX29iamVjdF92YWw7CisJfSBuc19vYmplY3Q7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbnNfcmVxdWVzdCBuc19yZXF1ZXN0OworCitzdHJ1Y3QgaWJfcmVxdWVzdCB7CisJbmlzX25hbWUgaWJyX25hbWU7CisJc3RydWN0IHsKKwkJdV9pbnQgaWJyX3NyY2hfbGVuOworCQluaXNfYXR0ciAqaWJyX3NyY2hfdmFsOworCX0gaWJyX3NyY2g7CisJdWludDMyX3QgaWJyX2ZsYWdzOworCXN0cnVjdCB7CisJCXVfaW50IGlicl9vYmpfbGVuOworCQluaXNfb2JqZWN0ICppYnJfb2JqX3ZhbDsKKwl9IGlicl9vYmo7CisJc3RydWN0IHsKKwkJdV9pbnQgaWJyX2NiaG9zdF9sZW47CisJCW5pc19zZXJ2ZXIgKmlicl9jYmhvc3RfdmFsOworCX0gaWJyX2NiaG9zdDsKKwl1X2ludCBpYnJfYnVmc2l6ZTsKKwluZXRvYmogaWJyX2Nvb2tpZTsKK307Cit0eXBlZGVmIHN0cnVjdCBpYl9yZXF1ZXN0IGliX3JlcXVlc3Q7CisKK3N0cnVjdCBwaW5nX2FyZ3MgeworCW5pc19uYW1lIGRpcjsKKwl1aW50MzJfdCBzdGFtcDsKK307Cit0eXBlZGVmIHN0cnVjdCBwaW5nX2FyZ3MgcGluZ19hcmdzOworCitlbnVtIGxvZ19lbnRyeV90IHsKKwlMT0dfTk9QID0gMCwKKwlBRERfTkFNRSA9IDEsCisJUkVNX05BTUUgPSAyLAorCU1PRF9OQU1FX09MRCA9IDMsCisJTU9EX05BTUVfTkVXID0gNCwKKwlBRERfSUJBU0UgPSA1LAorCVJFTV9JQkFTRSA9IDYsCisJTU9EX0lCQVNFID0gNywKKwlVUERfU1RBTVAgPSA4LAorfTsKK3R5cGVkZWYgZW51bSBsb2dfZW50cnlfdCBsb2dfZW50cnlfdDsKKworc3RydWN0IGxvZ19lbnRyeSB7CisJdWludDMyX3QgbGVfdGltZTsKKwlsb2dfZW50cnlfdCBsZV90eXBlOworCW5pc19uYW1lIGxlX3ByaW5jcDsKKwluaXNfbmFtZSBsZV9uYW1lOworCXN0cnVjdCB7CisJCXVfaW50IGxlX2F0dHJzX2xlbjsKKwkJbmlzX2F0dHIgKmxlX2F0dHJzX3ZhbDsKKwl9IGxlX2F0dHJzOworCW5pc19vYmplY3QgbGVfb2JqZWN0OworfTsKK3R5cGVkZWYgc3RydWN0IGxvZ19lbnRyeSBsb2dfZW50cnk7CisKK3N0cnVjdCBsb2dfcmVzdWx0IHsKKwluaXNfZXJyb3IgbHJfc3RhdHVzOworCW5ldG9iaiBscl9jb29raWU7CisJc3RydWN0IHsKKwkJdV9pbnQgbHJfZW50cmllc19sZW47CisJCWxvZ19lbnRyeSAqbHJfZW50cmllc192YWw7CisJfSBscl9lbnRyaWVzOworfTsKK3R5cGVkZWYgc3RydWN0IGxvZ19yZXN1bHQgbG9nX3Jlc3VsdDsKKworc3RydWN0IGNwX3Jlc3VsdCB7CisJbmlzX2Vycm9yIGNwX3N0YXR1czsKKwl1aW50MzJfdCBjcF96dGlja3M7CisJdWludDMyX3QgY3BfZHRpY2tzOworfTsKK3R5cGVkZWYgc3RydWN0IGNwX3Jlc3VsdCBjcF9yZXN1bHQ7CisKK3N0cnVjdCBuaXNfdGFnIHsKKwl1aW50MzJfdCB0YWdfdHlwZTsKKwljaGFyICp0YWdfdmFsOworfTsKK3R5cGVkZWYgc3RydWN0IG5pc190YWcgbmlzX3RhZzsKKworc3RydWN0IG5pc190YWdsaXN0IHsKKwlzdHJ1Y3QgeworCQl1X2ludCB0YWdzX2xlbjsKKwkJbmlzX3RhZyAqdGFnc192YWw7CisJfSB0YWdzOworfTsKK3R5cGVkZWYgc3RydWN0IG5pc190YWdsaXN0IG5pc190YWdsaXN0OworCitzdHJ1Y3QgZHVtcF9hcmdzIHsKKwluaXNfbmFtZSBkYV9kaXI7CisJdWludDMyX3QgZGFfdGltZTsKKwlzdHJ1Y3QgeworCQl1X2ludCBkYV9jYmhvc3RfbGVuOworCQluaXNfc2VydmVyICpkYV9jYmhvc3RfdmFsOworCX0gZGFfY2Job3N0OworfTsKK3R5cGVkZWYgc3RydWN0IGR1bXBfYXJncyBkdW1wX2FyZ3M7CisKK3N0cnVjdCBmZF9hcmdzIHsKKwluaXNfbmFtZSBkaXJfbmFtZTsKKwluaXNfbmFtZSByZXF1ZXN0ZXI7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZmRfYXJncyBmZF9hcmdzOworCitzdHJ1Y3QgZmRfcmVzdWx0IHsKKwluaXNfZXJyb3Igc3RhdHVzOworCW5pc19uYW1lIHNvdXJjZTsKKwlzdHJ1Y3QgeworCQl1X2ludCBkaXJfZGF0YV9sZW47CisJCWNoYXIgKmRpcl9kYXRhX3ZhbDsKKwl9IGRpcl9kYXRhOworCXN0cnVjdCB7CisJCXVfaW50IHNpZ25hdHVyZV9sZW47CisJCWNoYXIgKnNpZ25hdHVyZV92YWw7CisJfSBzaWduYXR1cmU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZmRfcmVzdWx0IGZkX3Jlc3VsdDsKKworLyogR2VuZXJpYyBjbGllbnQgY3JlYXRpbmcgZmxhZ3MgKi8KKyNkZWZpbmUgWk1IX1ZDCQkxCisjZGVmaW5lIFpNSF9ERwkJMgorI2RlZmluZSBaTUhfQVVUSAk0CisKKy8qIFRlc3RpbmcgQWNjZXNzIHJpZ2h0cyBmb3Igb2JqZWN0cyAqLworCisjZGVmaW5lIE5JU19SRUFEX0FDQwkJMQorI2RlZmluZSBOSVNfTU9ESUZZX0FDQwkJMgorI2RlZmluZSBOSVNfQ1JFQVRFX0FDQwkJNAorI2RlZmluZSBOSVNfREVTVFJPWV9BQ0MJOAorLyogVGVzdCBtYWNyb3MuIGEgPT0gYWNjZXNzIHJpZ2h0cywgbSA9PSBkZXNpcmVkIHJpZ2h0cy4gKi8KKyNkZWZpbmUgTklTX1dPUkxEKGEsIG0pICAgICAgICAoKChhKSAmIChtKSkgIT0gMCkKKyNkZWZpbmUgTklTX0dST1VQKGEsIG0pICAgICAgICAoKChhKSAmICgobSkgPDwgOCkpICE9IDApCisjZGVmaW5lIE5JU19PV05FUihhLCBtKSAgICAgICAgKCgoYSkgJiAoKG0pIDw8IDE2KSkgIT0gMCkKKyNkZWZpbmUgTklTX05PQk9EWShhLCBtKSAgICAgICAoKChhKSAmICgobSkgPDwgMjQpKSAhPSAwKQorLyoKKyAqIEVPTCBBbGVydCAtIFRoZSBmb2xsb3dpbmcgbm9uLXByZWZpeGVkIHRlc3QgbWFjcm9zIGFyZQorICogaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eSwgYW5kIHdpbGwgYmUgbm90IGJlIHByZXNlbnQKKyAqIGluIGZ1dHVyZSByZWxlYXNlcyAtIHVzZSB0aGUgTklTXyooKSBtYWNyb3MgYWJvdmUuCisgKi8KKyNkZWZpbmUgV09STEQoYSwgbSkJKCgoYSkgJiAobSkpICE9IDApCisjZGVmaW5lIEdST1VQKGEsIG0pCSgoKGEpICYgKChtKSA8PCA4KSkgIT0gMCkKKyNkZWZpbmUgT1dORVIoYSwgbSkJKCgoYSkgJiAoKG0pIDw8IDE2KSkgIT0gMCkKKyNkZWZpbmUgTk9CT0RZKGEsIG0pCSgoKGEpICYgKChtKSA8PCAyNCkpICE9IDApCisKKyNkZWZpbmUgT0FUWVBFKGQsIG4pICgoKGQpLT5kb19hcm1hc2suZG9fYXJtYXNrX3ZhbCtuKS0+b2Ffb3R5cGUpCisjZGVmaW5lIE9BUklHSFRTKGQsIG4pICgoKGQpLT5kb19hcm1hc2suZG9fYXJtYXNrX3ZhbCtuKS0+b2FfcmlnaHRzKQorI2RlZmluZSBXT1JMRF9ERUZBVUxUIChOSVNfUkVBRF9BQ0MpCisjZGVmaW5lIEdST1VQX0RFRkFVTFQgKE5JU19SRUFEX0FDQyA8PCA4KQorI2RlZmluZSBPV05FUl9ERUZBVUxUICgoTklTX1JFQURfQUNDICsgTklTX01PRElGWV9BQ0MgKyBOSVNfQ1JFQVRFX0FDQyArXAorCQkJTklTX0RFU1RST1lfQUNDKSA8PCAxNikKKyNkZWZpbmUgREVGQVVMVF9SSUdIVFMgKFdPUkxEX0RFRkFVTFQgfCBHUk9VUF9ERUZBVUxUIHwgT1dORVJfREVGQVVMVCkKKworLyogUmVzdWx0IG1hbmlwdWxhdGlvbiBkZWZpbmVzIC4uLiAqLworI2RlZmluZSBOSVNfUkVTX05VTU9CSih4KQkoKHgpLT5vYmplY3RzLm9iamVjdHNfbGVuKQorI2RlZmluZSBOSVNfUkVTX09CSkVDVCh4KQkoKHgpLT5vYmplY3RzLm9iamVjdHNfdmFsKQorI2RlZmluZSBOSVNfUkVTX0NPT0tJRSh4KQkoKHgpLT5jb29raWUpCisjZGVmaW5lIE5JU19SRVNfU1RBVFVTKHgpCSgoeCktPnN0YXR1cykKKworLyogVGhlc2UgZGVmaW5lcyBtYWtlIGdldHRpbmcgYXQgdGhlIHZhcmlhbnQgcGFydCBvZiB0aGUgb2JqZWN0IGVhc2llci4gKi8KKyNkZWZpbmUgVEFfZGF0YSB6b19kYXRhLm9iamRhdGFfdS50YV9kYXRhCisjZGVmaW5lIEVOX2RhdGEgem9fZGF0YS5vYmpkYXRhX3UuZW5fZGF0YQorI2RlZmluZSBESV9kYXRhIHpvX2RhdGEub2JqZGF0YV91LmRpX2RhdGEKKyNkZWZpbmUgTElfZGF0YSB6b19kYXRhLm9iamRhdGFfdS5saV9kYXRhCisjZGVmaW5lIEdSX2RhdGEgem9fZGF0YS5vYmpkYXRhX3UuZ3JfZGF0YQorCisjZGVmaW5lIF9fdHlwZV9vZihvKSAoKG8pLT56b19kYXRhLnpvX3R5cGUpCisKKy8qIERlY2xhcmF0aW9ucyBmb3IgdGhlIGludGVybmFsIHN1YnJvdXRpbmVzIGluIG5pc2xpYi5jICovCitlbnVtIG5hbWVfcG9zIHtTQU1FX05BTUUsIEhJR0hFUl9OQU1FLCBMT1dFUl9OQU1FLCBOT1RfU0VRVUVOVElBTCwgQkFEX05BTUV9OwordHlwZWRlZiBlbnVtIG5hbWVfcG9zIG5hbWVfcG9zOworCisvKgorICogRGVmaW5lcyBmb3IgZ2V0dGluZyBhdCBjb2x1bW4gZGF0YSBpbiBlbnRyeSBvYmplY3RzLiBCZWNhdXNlIFJQQ0dFTgorICogZ2VuZXJhdGVzIHNvbWUgcmF0aGVyIHdvcmR5IHN0cnVjdHVyZXMsIHdlIGNyZWF0ZSBzb21lIGRlZmluZXMgdGhhdAorICogY29sbGFwc2UgdGhlIG5lZWRlZCBrZXlzdHJva2VzIHRvIGFjY2VzcyBhIHBhcnRpY3VsYXIgdmFsdWUgdXNpbmcKKyAqIHRoZXNlIGRlZmluaXRpb25zIHRoZXkgdGFrZSBhbiBuaXNfb2JqZWN0ICosIGFuZCBhbiBpbnQgYW5kIHJldHVybgorICogYSB1X2NoYXIgKiBmb3IgVmFsdWUsIGFuZCBhbiBpbnQgZm9yIGxlbmd0aC4KKyAqLworI2RlZmluZSBFTlRSWV9WQUwob2JqLCBjb2wpIChvYmopLT5FTl9kYXRhLmVuX2NvbHMuZW5fY29sc192YWxbY29sXS5lY192YWx1ZS5lY192YWx1ZV92YWwKKyNkZWZpbmUgRU5UUllfTEVOKG9iaiwgY29sKSAob2JqKS0+RU5fZGF0YS5lbl9jb2xzLmVuX2NvbHNfdmFsW2NvbF0uZWNfdmFsdWUuZWNfdmFsdWVfbGVuCisKKworLyogUHJvdG90eXBlcywgYW5kIGV4dGVybiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBOSVMgbGlicmFyeSBmdW5jdGlvbnMuICovCisjaW5jbHVkZSA8cnBjc3ZjL25pc2xpYi5oPgorI2VuZGlmCisKKy8qCisgKiBuaXNfMy5oCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIHRoYXQgYXJlIG9ubHkgb2YgaW50ZXJlc3QgdG8gdGhlIGFjdHVhbAorICogc2VydmljZSBkYWVtb24gYW5kIGNsaWVudCBzdHVicy4gTm9ybWFsIHVzZXJzIG9mIE5JUyB3aWxsIG5vdCBpbmNsdWRlCisgKiB0aGlzIGZpbGUuCisgKgorICogTk9URSA6IFRoaXMgaW5jbHVkZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBhIGNvbWJpbmF0aW9uCisgKiBvZiBycGNnZW4gYW5kIHNlZC4gRE8gTk9UIEVESVQgSVQsIGNoYW5nZSB0aGUgbmlzLnggZmlsZSBpbnN0ZWFkCisgKiBhbmQgdGhlbiByZW1ha2UgdGhpcyBmaWxlLgorICovCisjaWZuZGVmIF9fbmlzXzNfaAorI2RlZmluZSBfX25pc18zX2gKKworI2RlZmluZSBOSVNfUFJPRyAxMDAzMDAKKyNkZWZpbmUgTklTX1ZFUlNJT04gMworCisjZGVmaW5lIE5JU19MT09LVVAgMQorZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2xvb2t1cF8zIChuc19yZXF1ZXN0ICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2xvb2t1cF8zX3N2YyAobnNfcmVxdWVzdCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfQUREIDIKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19hZGRfMyAobnNfcmVxdWVzdCAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19hZGRfM19zdmMgKG5zX3JlcXVlc3QgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX01PRElGWSAzCitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfbW9kaWZ5XzMgKG5zX3JlcXVlc3QgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfbW9kaWZ5XzNfc3ZjIChuc19yZXF1ZXN0ICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19SRU1PVkUgNAorZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX3JlbW92ZV8zIChuc19yZXF1ZXN0ICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX3JlbW92ZV8zX3N2YyAobnNfcmVxdWVzdCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfSUJMSVNUIDUKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19pYmxpc3RfMyAoaWJfcmVxdWVzdCAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19pYmxpc3RfM19zdmMgKGliX3JlcXVlc3QgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX0lCQUREIDYKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19pYmFkZF8zIChpYl9yZXF1ZXN0ICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2liYWRkXzNfc3ZjIChpYl9yZXF1ZXN0ICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19JQk1PRElGWSA3CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfaWJtb2RpZnlfMyAoaWJfcmVxdWVzdCAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19pYm1vZGlmeV8zX3N2YyAoaWJfcmVxdWVzdCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKQorICAgICBfX1RIUk9XOworI2RlZmluZSBOSVNfSUJSRU1PVkUgOAorZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2licmVtb3ZlXzMgKGliX3JlcXVlc3QgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfaWJyZW1vdmVfM19zdmMgKGliX3JlcXVlc3QgKiwgc3RydWN0IHN2Y19yZXEgKikKKyAgICAgX19USFJPVzsKKyNkZWZpbmUgTklTX0lCRklSU1QgOQorZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2liZmlyc3RfMyAoaWJfcmVxdWVzdCAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19pYmZpcnN0XzNfc3ZjIChpYl9yZXF1ZXN0ICosIHN0cnVjdCBzdmNfcmVxICopCisgICAgIF9fVEhST1c7CisjZGVmaW5lIE5JU19JQk5FWFQgMTAKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19pYm5leHRfMyAoaWJfcmVxdWVzdCAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19pYm5leHRfM19zdmMgKGliX3JlcXVlc3QgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX0ZJTkRESVJFQ1RPUlkgMTIKK2V4dGVybiAgZmRfcmVzdWx0ICogbmlzX2ZpbmRkaXJlY3RvcnlfMyAoZmRfYXJncyAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgZmRfcmVzdWx0ICogbmlzX2ZpbmRkaXJlY3RvcnlfM19zdmMgKGZkX2FyZ3MgKiwKKwkJCQkJICAgICBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfU1RBVFVTIDE0CitleHRlcm4gIG5pc190YWdsaXN0ICogbmlzX3N0YXR1c18zIChuaXNfdGFnbGlzdCAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX3RhZ2xpc3QgKiBuaXNfc3RhdHVzXzNfc3ZjIChuaXNfdGFnbGlzdCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKQorICAgICBfX1RIUk9XOworI2RlZmluZSBOSVNfRFVNUExPRyAxNQorZXh0ZXJuICBsb2dfcmVzdWx0ICogbmlzX2R1bXBsb2dfMyAoZHVtcF9hcmdzICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBsb2dfcmVzdWx0ICogbmlzX2R1bXBsb2dfM19zdmMgKGR1bXBfYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfRFVNUCAxNgorZXh0ZXJuICBsb2dfcmVzdWx0ICogbmlzX2R1bXBfMyAoZHVtcF9hcmdzICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBsb2dfcmVzdWx0ICogbmlzX2R1bXBfM19zdmMgKGR1bXBfYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfQ0FMTEJBQ0sgMTcKK2V4dGVybiAgYm9vbF90ICogbmlzX2NhbGxiYWNrXzMgKG5ldG9iaiAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgYm9vbF90ICogbmlzX2NhbGxiYWNrXzNfc3ZjIChuZXRvYmogKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX0NQVElNRSAxOAorZXh0ZXJuICB1aW50MzJfdCAqIG5pc19jcHRpbWVfMyAobmlzX25hbWUgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIHVpbnQzMl90ICogbmlzX2NwdGltZV8zX3N2YyAobmlzX25hbWUgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX0NIRUNLUE9JTlQgMTkKK2V4dGVybiAgY3BfcmVzdWx0ICogbmlzX2NoZWNrcG9pbnRfMyAobmlzX25hbWUgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIGNwX3Jlc3VsdCAqIG5pc19jaGVja3BvaW50XzNfc3ZjIChuaXNfbmFtZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKQorICAgICBfX1RIUk9XOworI2RlZmluZSBOSVNfUElORyAyMAorZXh0ZXJuICB2b2lkICogbmlzX3BpbmdfMyAocGluZ19hcmdzICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICB2b2lkICogbmlzX3BpbmdfM19zdmMgKHBpbmdfYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfU0VSVlNUQVRFIDIxCitleHRlcm4gIG5pc190YWdsaXN0ICogbmlzX3NlcnZzdGF0ZV8zIChuaXNfdGFnbGlzdCAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX3RhZ2xpc3QgKiBuaXNfc2VydnN0YXRlXzNfc3ZjIChuaXNfdGFnbGlzdCAqLAorCQkJCQkgICBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfTUtESVIgMjIKK2V4dGVybiAgbmlzX2Vycm9yICogbmlzX21rZGlyXzMgKG5pc19uYW1lICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfZXJyb3IgKiBuaXNfbWtkaXJfM19zdmMgKG5pc19uYW1lICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19STURJUiAyMworZXh0ZXJuICBuaXNfZXJyb3IgKiBuaXNfcm1kaXJfMyAobmlzX25hbWUgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc19lcnJvciAqIG5pc19ybWRpcl8zX3N2YyAobmlzX25hbWUgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX1VQREtFWVMgMjQKK2V4dGVybiAgbmlzX2Vycm9yICogbmlzX3VwZGtleXNfMyAobmlzX25hbWUgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc19lcnJvciAqIG5pc191cGRrZXlzXzNfc3ZjIChuaXNfbmFtZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogISBfUlBDU1ZDX05JU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXMueCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pcy54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMThhZjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXMueApAQCAtMCwwICsxLDQ3NCBAQAorJS8qCislICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorJSAqCislICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CislICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorJSAqIG1ldDoKKyUgKgorJSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CislICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorJSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyUgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworJSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworJSAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyUgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCislICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCislICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorJSAqCislICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCislICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorJSAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyUgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCislICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCislICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCislICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorJSAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworJSAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCislICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyUgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyUgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCislICovCisKKyNpZmRlZiBSUENfSERSCislLyoKKyUgKgluaXMuaAorJSAqCislICoJVGhpcyBmaWxlIGlzIHRoZSBtYWluIGluY2x1ZGUgZmlsZSBmb3IgTklTIGNsaWVudHMuIEl0IGNvbnRhaW5zCislICoJYm90aCB0aGUgY2xpZW50IGxpYnJhcnkgZnVuY3Rpb24gZGVmaW5lcyBhbmQgdGhlIHZhcmlvdXMgZGF0YQorJSAqCXN0cnVjdHVyZXMgdXNlZCBieSB0aGUgTklTIHNlcnZpY2UuIEl0IGluY2x1ZGVzIHRoZSBmaWxlIG5pc190YWdzLmgKKyUgKgl3aGljaCBkZWZpbmVzIHRoZSB0YWcgdmFsdWVzLiBUaGlzIGFsbG93cyB0aGUgdGFncyB0byBjaGFuZ2Ugd2l0aG91dAorJSAqCWhhdmluZyB0byBjaGFuZ2UgdGhlIG5pcy54IGZpbGUuCislICoKKyUgKglOT1RFIDogRE8gTk9UIEVESVQgVEhJUyBGSUxFISBJdCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB3aGVuCislICoJICAgICAgIHJwY2dlbiBpcyBydW4gb24gdGhlIG5pcy54IGZpbGUuIE5vdGUgdGhhdCB0aGVyZSBpcyBhCislICoJICAgICAgIHNpbXBsZSBzZWQgc2NyaXB0IHRvIHJlbW92ZSBzb21lIHVubmVlZGVkIGxpbmVzLiAoU2VlIHRoZQorJSAqCSAgICAgICBNYWtlZmlsZSB0YXJnZXQgbmlzLmgpCislICoKKyUgKi8KKyUjaW5jbHVkZSA8cnBjc3ZjL25pc190YWdzLmg+CisjZW5kaWYKKworLyogVGhpcyBnZXRzIHN0dWZmZWQgaW50byB0aGUgc291cmNlIGZpbGVzLiAqLworI2lmIFJQQ19IRFIKKyUjaW5jbHVkZSA8cnBjL3hkci5oPgorI2VuZGlmCisKKy8qIEluY2x1ZGUgdGhlIFJQQyBMYW5ndWFnZSBkZXNjcmlwdGlvbiBvZiBOSVMgb2JqZWN0cyAqLworI2luY2x1ZGUgIm5pc19vYmplY3QueCIKKworLyogRXJyb3JzICB0aGF0IGNhbiBiZSByZXR1cm5lZCBieSB0aGUgc2VydmljZSAqLworZW51bSBuaXNfZXJyb3IgeworCU5JU19TVUNDRVNTID0gMCwJLyogQS1vaywgbGV0J3Mgcm9jayBuIHJvbGwJKi8KKwlOSVNfU19TVUNDRVNTID0gMSwJLyogTmFtZSBmb3VuZCAobWF5YmUpCQkqLworCU5JU19OT1RGT1VORCA9IDIsCS8qIE5hbWUgZGVmaW5pdGVseSBub3QgZm91bmQJKi8KKwlOSVNfU19OT1RGT1VORCA9IDMsCS8qIE5hbWUgbWF5YmUgbm90IGZvdW5kCQkqLworCU5JU19DQUNIRUVYUElSRUQgPSA0LAkvKiBOYW1lIGV4aXN0cyBidXQgY2FjaGUgb3V0IG9mIGRhdGUgKi8KKwlOSVNfTkFNRVVOUkVBQ0hBQkxFID0gNSwgLyogQ2FuJ3QgZ2V0IHRoZXJlIGZyb20gaGVyZSAqLworCU5JU19VTktOT1dOT0JKID0gNiwJLyogT2JqZWN0IHR5cGUgaXMgYm9ndXMgKi8KKwlOSVNfVFJZQUdBSU4gPSA3LAkvKiBJJ20gYnVzeSwgY2FsbCBiYWNrICovCisJTklTX1NZU1RFTUVSUk9SID0gOCwJLyogR2VuZXJpYyBzeXN0ZW0gZXJyb3IgKi8KKwlOSVNfQ0hBSU5CUk9LRU4gPSA5LAkvKiBGaXJzdC9OZXh0IHdhcm5pbmcgKi8KKwlOSVNfUEVSTUlTU0lPTiA9IDEwLAkvKiBOb3QgZW5vdWdoIHBlcm1pc3Npb24gdG8gYWNjZXNzICovCisJTklTX05PVE9XTkVSID0gMTEsCS8qIFlvdSBkb24ndCBvd24gaXQsIHNvcnJ5ICovCisJTklTX05PVF9NRSA9IDEyLAkvKiBJIGRvbid0IHNlcnZlIHRoaXMgbmFtZSAqLworCU5JU19OT01FTU9SWSA9IDEzLAkvKiBPdXR0YSBWTSEgSGVscCEgKi8KKwlOSVNfTkFNRUVYSVNUUyA9IDE0LAkvKiBDYW4ndCBjcmVhdGUgb3ZlciBhbm90aGVyIG5hbWUgKi8KKwlOSVNfTk9UTUFTVEVSID0gMTUsCS8qIEknbSBqdXN0YSBzZWNvbmRhcmF5LCBkb24ndCBhc2sgbWUgKi8KKwlOSVNfSU5WQUxJRE9CSiA9IDE2LAkvKiBPYmplY3QgaXMgYnJva2VuIHNvbWVob3cgKi8KKwlOSVNfQkFETkFNRSA9IDE3LAkvKiBVbnBhcnNhYmxlIG5hbWUgKi8KKwlOSVNfTk9DQUxMQkFDSyA9IDE4LAkvKiBDb3VsZG4ndCB0YWxrIHRvIGNhbGwgYmFjayBwcm9jICovCisJTklTX0NCUkVTVUxUUyA9IDE5LAkvKiBSZXN1bHRzIGJlaW5nIGNhbGxlZCBiYWNrIHRvIHlvdSAqLworCU5JU19OT1NVQ0hOQU1FID0gMjAsCS8qIE5hbWUgdW5rbm93biAqLworCU5JU19OT1RVTklRVUUgPSAyMSwJLyogVmFsdWUgaXMgbm90IHVuaXF1ZXMgKGVudHJ5KSAqLworCU5JU19JQk1PREVSUk9SID0gMjIsCS8qIEluZi4gQmFzZS4gTW9kaWZ5IGVycm9yLiAqLworCU5JU19OT1NVQ0hUQUJMRSA9IDIzLAkvKiBOYW1lIGZvciB0YWJsZSB3YXMgd3JvbmcgKi8KKwlOSVNfVFlQRU1JU01BVENIID0gMjQsCS8qIEVudHJ5IGFuZCB0YWJsZSB0eXBlIG1pc21hdGNoICovCisJTklTX0xJTktOQU1FRVJST1IgPSAyNSwJLyogTGluayBwb2ludHMgdG8gYm9ndXMgbmFtZSAqLworCU5JU19QQVJUSUFMID0gMjYsCS8qIFBhcnRpYWwgc3VjY2VzcywgZm91bmQgdGFibGUgKi8KKwlOSVNfVE9PTUFOWUFUVFJTID0gMjcsCS8qIFRvbyBtYW55IGF0dHJpYnV0ZXMgKi8KKwlOSVNfUlBDRVJST1IgPSAyOCwJLyogUlBDIGVycm9yIGVuY291bnRlcmVkICovCisJTklTX0JBREFUVFJJQlVURSA9IDI5LAkvKiBCYWQgb3IgaW52YWxpZCBhdHRyaWJ1dGUgKi8KKwlOSVNfTk9UU0VBUkNIQUJMRSA9IDMwLAkvKiBOb24tc2VhcmNoYWJsZSBvYmplY3Qgc2VhcmNoZWQgKi8KKwlOSVNfQ0JFUlJPUiA9IDMxLAkvKiBFcnJvciBkdXJpbmcgY2FsbGJhY2sgKHN2YyBjcmFzaCkgKi8KKwlOSVNfRk9SRUlHTk5TID0gMzIsCS8qIEZvcmVpZ24gTmFtZXNwYWNlICovCisJTklTX0JBRE9CSkVDVCA9IDMzLAkvKiBNYWxmb3JtZWQgb2JqZWN0IHN0cnVjdHVyZSAqLworCU5JU19OT1RTQU1FT0JKID0gMzQsCS8qIE9iamVjdCBzd2FwcGVkIGR1cmluZyBkZWxldGlvbiAqLworCU5JU19NT0RGQUlMID0gMzUsCS8qIEZhaWx1cmUgZHVyaW5nIGEgTW9kaWZ5LiAqLworCU5JU19CQURSRVFVRVNUID0gMzYsCS8qIElsbGVnYWwgcXVlcnkgZm9yIHRhYmxlICovCisJTklTX05PVEVNUFRZID0gMzcsCS8qIEF0dGVtcHQgdG8gcmVtb3ZlIGEgbm9uLWVtcHR5IHRibCAqLworCU5JU19DT0xEU1RBUlRfRVJSID0gMzgsIC8qIEVycm9yIGFjY2VzaW5nIHRoZSBjb2xkIHN0YXJ0IGZpbGUgKi8KKwlOSVNfUkVTWU5DID0gMzksCS8qIFRyYW5zYWN0aW9uIGxvZyB0b28gZmFyIG91dCBvZiBkYXRlICovCisJTklTX0ZBSUwgPSA0MCwJCS8qIE5JUyBvcGVyYXRpb24gZmFpbGVkLiAqLworCU5JU19VTkFWQUlMID0gNDEsCS8qIE5JUysgc2VydmljZSBpcyB1bmF2YWlsYWJsZSAoY2xpZW50KSAqLworCU5JU19SRVMyQklHID0gNDIsCS8qIE5JUysgcmVzdWx0IHRvbyBiaWcgZm9yIGRhdGFncmFtICovCisJTklTX1NSVkFVVEggPSA0MywJLyogTklTKyBzZXJ2ZXIgd2Fzbid0IGF1dGhlbnRpY2F0ZWQuICovCisJTklTX0NMTlRBVVRIID0gNDQsCS8qIE5JUysgQ2xpZW50IHdhc24ndCBhdXRoZW50aWNhdGVkLiAqLworCU5JU19OT0ZJTEVTUEFDRSA9IDQ1LAkvKiBOSVMrIHNlcnZlciByYW4gb3V0IG9mIGRpc2sgc3BhY2UgKi8KKwlOSVNfTk9QUk9DID0gNDYsCS8qIE5JUysgc2VydmVyIGNvdWxkbid0IGNyZWF0ZSBuZXcgcHJvYyAqLworCU5JU19EVU1QTEFURVIgPSA0NwkvKiBOSVMrIHNlcnZlciBhbHJlYWR5IGhhcyBkdW1wIGNoaWxkICovCit9OworCisKKy8qCisgKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIHRoZSBwYXJhbWV0ZXJzIGFuZCByZXN1bHRzIG9mIHRoZSBhY3R1YWwKKyAqIE5JUyBSUEMgY2FsbHMuCisgKgorICogVGhpcyBpcyB0aGUgc3RhbmRhcmQgcmVzdWx0IChpbiB0aGUgcHJvdG9jb2wpIG9mIG1vc3Qgb2YgdGhlIG5pcworICogcmVxdWVzdHMuCisgKi8KKworc3RydWN0IG5pc19yZXN1bHQgeworCW5pc19lcnJvcglzdGF0dXM7CQkvKiBTdGF0dXMgb2YgdGhlIHJlc3BvbnNlICovCisJbmlzX29iamVjdAlvYmplY3RzPD47CS8qIG9iamVjdHMgZm91bmQJICAqLworCW5ldG9iagkJY29va2llOwkJLyogQ29va2llIERhdGEJCSAgKi8KKwl1aW50MzJfdAl6dGlja3M7CQkvKiBzZXJ2ZXIgdGlja3MJCSAgKi8KKwl1aW50MzJfdAlkdGlja3M7CQkvKiBEQk0gdGlja3MuCQkgICovCisJdWludDMyX3QJYXRpY2tzOwkJLyogQ2FjaGUgKGFjY2VsKSB0aWNrcwkgICovCisJdWludDMyX3QJY3RpY2tzOwkJLyogQ2xpZW50IHRpY2tzCQkgICovCit9OworCisvKgorICogQSBOYW1lIFNlcnZpY2UgcmVxdWVzdAorICogVGhpcyByZXF1ZXN0IGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBuYW1lIHNwYWNlLCBuc19uYW1lIGlzIHRoZSBuYW1lCisgKiBvZiB0aGUgb2JqZWN0IHdpdGhpbiB0aGUgbmFtZXNwYWNlIGFuZCB0aGUgb2JqZWN0IGlzIGl0J3MgdmFsdWUsIGZvcgorICogYWRkL21vZGlmeSwgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBmb3IgcmVtb3ZlLgorICovCisKK3N0cnVjdCBuc19yZXF1ZXN0IHsKKwluaXNfbmFtZQluc19uYW1lOwkvKiBOYW1lIGluIHRoZSBOSVMgbmFtZSBzcGFjZQkqLworCW5pc19vYmplY3QJbnNfb2JqZWN0PDE+OwkvKiBPcHRpb25hbCBPYmplY3QgKGFkZC9yZW1vdmUpCSovCit9OworCisvKgorICogQW4gaW5mb3JtYXRpb24gYmFzZSByZXF1ZXN0CisgKiBUaGlzIHJlcXVlc3QgaW5jbHVkZXMgdGhlIE5JUyBuYW1lIG9mIHRoZSB0YWJsZSB3ZSB3aXNoIHRvIHNlYXJjaCwgdGhlCisgKiBzZWFyY2ggY3JpdGVyaWEgaW4gdGhlIGZvcm0gb2YgYXR0cmlidXRlL3ZhbHVlIHBhaXJzIGFuZCBhbiBvcHRpb25hbAorICogY2FsbGJhY2sgcHJvZ3JhbSBudW1iZXIuIElmIHRoZSBjYWxsYmFjayBwcm9ncmFtIG51bWJlciBpcyBwcm92aWRlZAorICogdGhlIHNlcnZlciB3aWxsIHNlbmQgYmFjayBvYmplY3RzIG9uZSBhdCBhIHRpbWUsIG90aGVyd2lzZSBpdCB3aWxsCisgKiByZXR1cm4gdGhlbSBhbGwgaW4gdGhlIHJlc3BvbnNlLgorICovCisKK3N0cnVjdCBpYl9yZXF1ZXN0IHsKKwluaXNfbmFtZQlpYnJfbmFtZTsJLyogVGhlIG5hbWUgb2YgdGhlIFRhYmxlCSovCisJbmlzX2F0dHIJaWJyX3NyY2g8PjsJLyogVGhlIHNlYXJjaCBjcml0ZXJlaWEJCSovCisJdWludDMyX3QJaWJyX2ZsYWdzOwkvKiBPcHRpb25hbCBmbGFncwkJKi8KKwluaXNfb2JqZWN0CWlicl9vYmo8MT47CS8qIG9wdGlvbmFsIG9iamVjdCAoYWRkL21vZGlmeSkgKi8KKwluaXNfc2VydmVyCWlicl9jYmhvc3Q8MT47CS8qIE9wdGlvbmFsIGNhbGxiYWNrIGluZm8JKi8KKwl1X2ludAkJaWJyX2J1ZnNpemU7CS8qIE9wdGlvbmFsIGZpcnN0L25leHQgYnVmc2l6ZQkqLworCW5ldG9iagkJaWJyX2Nvb2tpZTsJLyogVGhlIGZpcnN0L25leHQgY29va2llCSovCit9OworCisvKgorICogVGhpcyBhcmd1bWVudCB0byB0aGUgUElORyBjYWxsIG5vdGlmaWVzIHRoZSByZXBsaWNhcyB0aGF0IHNvbWV0aGluZyBpbgorICogYSBkaXJlY3RvcnkgaGFzIGNoYW5nZWQgYW5kIHRoaXMgaXMgaXQncyB0aW1lc3RhbXAuIFRoZSByZXBsaWNhIHdpbGwgdXNlCisgKiB0aGUgdGltZXN0YW1wIHRvIGRldGVybWluZSBpZiBpdHMgcmVzeW5jIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworc3RydWN0IHBpbmdfYXJncyB7CisJbmlzX25hbWUJZGlyOwkvKiBEaXJlY3RvcnkgdGhhdCBoYWQgdGhlIGNoYW5nZSAqLworCXVpbnQzMl90CXN0YW1wOwkvKiB0aW1lc3RhbXAgb2YgdGhlIHRyYW5zYWN0aW9uICAqLworfTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgdHlwZSBvZiBlbnRyaWVzIHRoYXQgYXJlIHN0b3JlZCBpbiB0aGUgdHJhbnNhY3Rpb24gbG9nLAorICogbm90ZSB0aGF0IG1vZGlmaWNhdGlvbnMgd2lsbCBhcHBlYXIgYXMgdHdvIGVudHJpZXMsIGZvciBuYW1lcywgdGhleSBoYXZlCisgKiBhICJPTEQiIGVudHJ5IGZvbGxvd2VkIGJ5IGEgIk5FVyIgZW50cnkuIEZvciBlbnRyaWVzIGluIHRhYmxlcywgdGhlcmUKKyAqIGlzIGEgcmVtb3ZlIGZvbGxvd2VkIGJ5IGFuIGFkZC4gSXQgaXMgZG9uZSB0aGlzIHdheSBzbyB0aGF0IHdlIGNhbiByZWFkCisgKiB0aGUgbG9nIGJhY2t3YXJkcyB0byBiYWNrIG91dCB0cmFuc2FjdGlvbnMgYW5kIGZvcndhcmRzIHRvIHByb3BvZ2F0ZQorICogdXBkYXRlZC4KKyAqLworZW51bSBsb2dfZW50cnlfdCB7CisJTE9HX05PUCA9IDAsCisJQUREX05BTUUgPSAxLAkJLyogTmFtZSBBZGRlZCB0byBuYW1lIHNwYWNlCQkgICovCisJUkVNX05BTUUgPSAyLAkJLyogTmFtZSByZW1vdmVkIGZyb20gbmFtZSBzcGFjZQkJICAqLworCU1PRF9OQU1FX09MRCA9IDMsCS8qIE5hbWUgd2FzIG1vZGlmaWVkIGluIHRoZSBuYW1lIHNwYWNlCSAgKi8KKwlNT0RfTkFNRV9ORVcgPSA0LAkvKiBOYW1lIHdhcyBtb2RpZmllZCBpbiB0aGUgbmFtZSBzcGFjZQkgICovCisJQUREX0lCQVNFID0gNSwJCS8qIEVudHJ5IGFkZGVkIHRvIGluZm9ybWF0aW9uIGJhc2UJICAqLworCVJFTV9JQkFTRSA9IDYsCQkvKiBFbnRyeSByZW1vdmVkIGZyb20gaW5mb3JtYXRpb24gYmFzZSAgICAqLworCU1PRF9JQkFTRSA9IDcsCQkvKiBFbnRyeSB3YXMgbW9kaWZpZWQgaW4gaW5mb3JtYXRpb24gYmFzZSAqLworCVVQRF9TVEFNUCA9IDgJCS8qIFVwZGF0ZSB0aW1lc3RhbXAgKHVzZWQgYXMgZmVuY2Vwb3N0cykgICovCit9OworCisvKgorICogVGhpcyByZXN1bHQgaXMgcmV0dXJuZWQgZnJvbSB0aGUgbmFtZSBzZXJ2aWNlIHdoZW4gaXQgaXMgcmVxdWVzdGVkIHRvCisgKiBkdW1wIGxvZ2dlZCBlbnRyaWVzIGZyb20gaXRzIHRyYW5zYWN0aW9uIGxvZy4gSW5mb3JtYXRpb24gYmFzZSB1cGRhdGVzCisgKiB3aWxsIGhhdmUgdGhlIG5hbWUgb2YgdGhlIGluZm9ybWF0aW9uIGJhc2UgaW4gdGhlIGxlX25hbWUgZmllbGQgYW5kCisgKiBhIGNhbm9uaWNhbCBzZXQgb2YgYXR0cmlidXRlL3ZhbHVlIHBhaXJzIHRvIGZ1bGx5IHNwZWNpZnkgdGhlIGVudHJ5J3MKKyAqICduYW1lJy4KKyAqLworc3RydWN0IGxvZ19lbnRyeSB7CisJdWludDMyX3QJbGVfdGltZTsJLyogVGltZSBpbiBzZWNvbmRzCQkqLworCWxvZ19lbnRyeV90CWxlX3R5cGU7CS8qIFR5cGUgb2YgbG9nIGVudHJ5CQkqLworCW5pc19uYW1lCWxlX3ByaW5jcDsJLyogUHJpbmNpcGFsIG1ha2luZyB0aGUgY2hhbmdlCSovCisJbmlzX25hbWUJbGVfbmFtZTsJLyogTmFtZSBvZiB0YWJsZS9kaXIgaW52b2x2ZWQJKi8KKwluaXNfYXR0cglsZV9hdHRyczw+OwkvKiBMaXN0IG9mIEFWIHBhaXJzLgkJKi8KKwluaXNfb2JqZWN0CWxlX29iamVjdDsJLyogQWN0dWFsIG9iamVjdCB2YWx1ZQkJKi8KK307CisKK3N0cnVjdCBsb2dfcmVzdWx0IHsKKwluaXNfZXJyb3IJbHJfc3RhdHVzOwkvKiBUaGUgc3RhdHVzIGl0c2VsZgkJKi8KKwluZXRvYmoJCWxyX2Nvb2tpZTsJLyogVXNlZCBieSB0aGUgZHVtcCBjYWxsYmFjawkqLworCWxvZ19lbnRyeQlscl9lbnRyaWVzPD47CS8qIHplcm8gb3IgbW9yZSBlbnRyaWVzCSovCit9OworCitzdHJ1Y3QgY3BfcmVzdWx0IHsKKwluaXNfZXJyb3IJY3Bfc3RhdHVzOwkvKiBTdGF0dXMgb2YgdGhlIGNoZWNrcG9pbnQJKi8KKwl1aW50MzJfdAljcF96dGlja3M7CS8qIFNlcnZpY2UgJ3RpY2tzJwkJKi8KKwl1aW50MzJfdAljcF9kdGlja3M7CS8qIERhdGFiYXNlICd0aWNrcycJCSovCit9OworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIGdlbmVyaWMgTklTIHRhZyBsaXN0LiBUaGUgdGFnbGlzdCBjb250YWlucworICogemVybyBvciB0YWdzLCBlYWNoIG9mIHdoaWNoIGlzIGEgdHlwZSBhbmQgYSB2YWx1ZS4gKHVfaW50KS4KKyAqIFRoZXNlIGFyZSB1c2VkIHRvIHJlcG9ydCBzdGF0aXN0aWNzIChzZWUgdGFnIGRlZmluaXRpb25zIGJlbG93KQorICogYW5kIHRvIHNldCBvciByZXNldCBzdGF0ZSB2YXJpYWJsZXMuCisgKi8KK3N0cnVjdCBuaXNfdGFnIHsKKwl1aW50MzJfdAl0YWdfdHlwZTsJLyogU3RhdGlzdGljIHRhZyAobWF5IHZhcnkpCSAqLworCXN0cmluZwkJdGFnX3ZhbDw+OwkvKiBTdGF0aXN0aWMgdmFsdWUgbWF5IGFsc28gdmFyeSAqLworfTsKKworc3RydWN0IG5pc190YWdsaXN0IHsKKwluaXNfdGFnIHRhZ3M8PjsJCQkvKiBMaXN0IG9mIHRhZ3MgKi8KK307CisKK3N0cnVjdCBkdW1wX2FyZ3MgeworCW5pc19uYW1lCWRhX2RpcjsJCS8qIERpcmVjdG9yeSB0byBkdW1wCSovCisJdWludDMyX3QJZGFfdGltZTsJLyogRnJvbSB0aGlzIHRpbWVzdGFtcAkqLworCW5pc19zZXJ2ZXIJZGFfY2Job3N0PDE+OwkvKiBDYWxsYmFjayB0byB1c2UuCSovCit9OworCitzdHJ1Y3QgZmRfYXJncyB7CisJbmlzX25hbWUJZGlyX25hbWU7ICAvKiBUaGUgZGlyZWN0b3J5IHdlJ3JlIGxvb2tpbmcgZm9yICovCisJbmlzX25hbWUJcmVxdWVzdGVyOyAvKiBIb3N0IHByaW5jaXBhbCBuYW1lIGZvciBzaWduYXR1cmUgKi8KK307CisKK3N0cnVjdCBmZF9yZXN1bHQgeworCW5pc19lcnJvcglzdGF0dXM7CQkvKiBTdGF0dXMgcmV0dXJuZWQgYnkgZnVuY3Rpb24JKi8KKwluaXNfbmFtZQlzb3VyY2U7CQkvKiBTb3VyY2Ugb2YgdGhpcyBhbnN3ZXIJKi8KKwlvcGFxdWUJCWRpcl9kYXRhPD47CS8qIERpcmVjdG9yeSBEYXRhIChYRFInZWQpCSovCisJb3BhcXVlCQlzaWduYXR1cmU8PjsJLyogU2lnbmF0dXJlIG9mIHRoZSBzb3VyY2UJKi8KK307CisKKyUvKgorJSAqIFN0cnVjdHVyZXMgdXNlZCBmb3Igc2VydmVyIGJpbmRpbmcuCislICovCitzdHJ1Y3QgbmlzX2JvdW5kX2VuZHBvaW50IHsKKwllbmRwb2ludCBlcDsKKwlpbnQgZ2VuZXJhdGlvbjsKKwlpbnQgcmFuazsKKwl1aW50MzJfdCBmbGFnczsKKwlpbnQgaG9zdG51bTsKKwlpbnQgZXBudW07CisJbmlzX25hbWUgdWFkZHI7CisJZW5kcG9pbnQgY2JlcDsKK307Cit0eXBlZGVmIHN0cnVjdCBuaXNfYm91bmRfZW5kcG9pbnQgbmlzX2JvdW5kX2VuZHBvaW50OworCitzdHJ1Y3QgbmlzX2JvdW5kX2RpcmVjdG9yeSB7CisJaW50IGdlbmVyYXRpb247CisJaW50IG1pbl9yYW5rOyAgICAgICAgICAgLyogbWluaW11bSByYW5rIG9mIGJvdW5kIGVuZHBvaW50cyAqLworCWludCBvcHRpbWFsX3Jhbms7ICAgICAgIC8qIGJlc3QgcG9zc2libGUgcmFuayBvZiBhbGwgZW5kcG9pbnRzICovCisJZGlyZWN0b3J5X29iaiBkb2JqOworCW5pc19ib3VuZF9lbmRwb2ludCBCRVA8PjsKK307Cit0eXBlZGVmIHN0cnVjdCBuaXNfYm91bmRfZGlyZWN0b3J5IG5pc19ib3VuZF9kaXJlY3Rvcnk7CislI2RlZmluZSBiZXBfbGVuIEJFUC5CRVBfbGVuCislI2RlZmluZSBiZXBfdmFsIEJFUC5CRVBfdmFsCisKK3N0cnVjdCBuaXNfYWN0aXZlX2VuZHBvaW50IHsKKwllbmRwb2ludCBlcDsKKwluaXNfbmFtZSBob3N0bmFtZTsKKwlpbnQgcmFuazsKKwlpbnQgdWFkZHJfZ2VuZXJhdGlvbjsKKwluaXNfbmFtZSB1YWRkcjsKKwlpbnQgY2JlcF9nZW5lcmF0aW9uOworCWVuZHBvaW50IGNiZXA7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmlzX2FjdGl2ZV9lbmRwb2ludCBuaXNfYWN0aXZlX2VuZHBvaW50OworCislLyogZGVmaW5lcyBmb3IgbmlzX2JvdW5kX2VuZHBvaW50LmZsYWdzICovCislI2RlZmluZSBOSVNfQk9VTkQgMHgxCislI2RlZmluZSBOSVNfVFJBTlNJRU5UX0VSUk9SUyAweDIKKworcHJvZ3JhbSAgTklTX1BST0cgeworCisJLyogUlBDIExhbmd1YWdlIGRlc2NyaXB0aW9uIG9mIHRoZSBOSVMrIHByb3RvY29sICovCisJdmVyc2lvbiBOSVNfVkVSU0lPTiB7CisJCS8qIFRoZSBuYW1lIHNlcnZpY2UgZnVuY3Rpb25zICovCisJCW5pc19yZXN1bHQgIE5JU19MT09LVVAobnNfcmVxdWVzdCkgPSAxOworCQluaXNfcmVzdWx0ICBOSVNfQUREKG5zX3JlcXVlc3QpID0gMjsKKwkJbmlzX3Jlc3VsdCAgTklTX01PRElGWShuc19yZXF1ZXN0KSA9IDM7CisJCW5pc19yZXN1bHQgIE5JU19SRU1PVkUobnNfcmVxdWVzdCkgPSA0OworCisJCS8qIFRoZSBpbmZvcm1hdGlvbiBiYXNlIGZ1bmN0aW9ucyAqLworCQluaXNfcmVzdWx0ICBOSVNfSUJMSVNUKGliX3JlcXVlc3QpID0gNTsKKwkJbmlzX3Jlc3VsdCAgTklTX0lCQUREKGliX3JlcXVlc3QpID0gNjsKKwkJbmlzX3Jlc3VsdCAgTklTX0lCTU9ESUZZKGliX3JlcXVlc3QpID0gNzsKKwkJbmlzX3Jlc3VsdCAgTklTX0lCUkVNT1ZFKGliX3JlcXVlc3QpID0gODsKKwkJbmlzX3Jlc3VsdCAgTklTX0lCRklSU1QoaWJfcmVxdWVzdCkgPSA5OworCQluaXNfcmVzdWx0ICBOSVNfSUJORVhUKGliX3JlcXVlc3QpID0gMTA7CisKKwkJLyogTklTIEFkbWluaXN0cmF0aXZlIGZ1bmN0aW9ucyAqLworCQlmZF9yZXN1bHQgICBOSVNfRklORERJUkVDVE9SWShmZF9hcmdzKSA9IDEyOworCisJCS8qIElmIGZldGNoIGFuZCBvcHRpb25hbGx5IHJlc2V0IHN0YXRpc3RpY3MgKi8KKwkJbmlzX3RhZ2xpc3QgIE5JU19TVEFUVVMobmlzX3RhZ2xpc3QpID0gMTQ7CisKKwkJLyogRHVtcCBjaGFuZ2VzIHRvIGRpcmVjdG9yeSBzaW5jZSB0aW1lIGluIGRhX3RpbWUgKi8KKwkJbG9nX3Jlc3VsdCAgTklTX0RVTVBMT0coZHVtcF9hcmdzKSA9IDE1OworCisJCS8qIER1bXAgY29udGVudHMgb2YgZGlyZWN0b3J5IG5hbWVkICovCisJCWxvZ19yZXN1bHQgIE5JU19EVU1QKGR1bXBfYXJncykgPSAxNjsKKworCQkvKiBDaGVjayBzdGF0dXMgb2YgY2FsbGJhY2sgdGhyZWFkICovCisJCWJvb2wJICAgIE5JU19DQUxMQkFDSyhuZXRvYmopID0gMTc7CisKKwkJLyogUmV0dXJuIGxhc3QgdXBkYXRlIHRpbWUgZm9yIG5hbWVkIGRpciAqLworCQl1aW50MzJfdCAgICBOSVNfQ1BUSU1FKG5pc19uYW1lKSA9IDE4OworCisJCS8qIENoZWNrcG9pbnQgZGlyZWN0b3J5IG9yIHRhYmxlIG5hbWVkICovCisJCWNwX3Jlc3VsdCAgIE5JU19DSEVDS1BPSU5UKG5pc19uYW1lKSA9IDE5OworCisJCS8qIFNlbmQgJ3N0YXR1cyBjaGFuZ2VkJyBwaW5nIHRvIHJlcGxpY2F0ZXMgKi8KKwkJdm9pZAkgICAgTklTX1BJTkcocGluZ19hcmdzKSA9IDIwOworCisJCS8qIE1vZGlmeSBzZXJ2ZXIgYmVoYXZpb3VyIChzdWNoIGFzIGRlYnVnZ2luZykgKi8KKwkJbmlzX3RhZ2xpc3QgTklTX1NFUlZTVEFURShuaXNfdGFnbGlzdCkgPSAyMTsKKworCQkvKiBDcmVhdGUgYSBEaXJlY3RvcnkgKi8KKwkJbmlzX2Vycm9yICAgTklTX01LRElSKG5pc19uYW1lKSA9IDIyOworCisJCS8qIFJlbW92ZSBhIERpcmVjdG9yeSAqLworCQluaXNfZXJyb3IgICBOSVNfUk1ESVIobmlzX25hbWUpID0gMjM7CisKKwkJLyogVXBkYXRlIHB1YmxpYyBrZXlzIG9mIGEgZGlyZWN0b3J5IG9iamVjdCAqLworCQluaXNfZXJyb3IgICBOSVNfVVBES0VZUyhuaXNfbmFtZSkgPSAyNDsKKwl9ID0gMzsKK30gPSAxMDAzMDA7CisKKy8qCisgKiBJbmNsdWRlZCBiZWxvdyBhcmUgdGhlIGRlZmluZXMgdGhhdCBiZWNvbWUgcGFydCBvZiBuaXMuaCwKKyAqIHRoZXkgYXJlIHRlY2huaWNhbGx5IG5vdCBwYXJ0IG9mIHRoZSBwcm90b2NvbCwgYnV0IGRvIGRlZmluZQorICoga2V5IGFzcGVjdHMgb2YgdGhlIGltcGxlbWVudGF0aW9uIGFuZCBhcmUgdGhlcmVmb3JlIHVzZWZ1bAorICogaW4gYnVpbGRpbmcgYSBjb25mb3JtaW5nIHNlcnZlciBvciBjbGllbnQuCisgKi8KKyNpZiBSUENfSERSCislLyoKKyUgKiBHZW5lcmljICJoYXNoIiBkYXRhc3RydWN0dXJlcywgdXNlZCBieSBhbGwgdHlwZXMgb2YgaGFzaGVkIGRhdGEuCislICovCislc3RydWN0IG5pc19oYXNoX2RhdGEgeworJQluaXNfbmFtZQkJbmFtZTsJICAgLyogTklTIG5hbWUgb2YgaGFzaGVkIGl0ZW0gICAgICAqLworJQlpbnQJCQlrZXljaGFpbjsgIC8qIEl0J3MgaGFzaCBrZXkgKGZvciBwb3ApICAgICAgKi8KKyUJc3RydWN0IG5pc19oYXNoX2RhdGEJKm5leHQ7CSAgIC8qIEhhc2ggY29sbGlzaW9uIHBvaW50ZXIgICAgICAgKi8KKyUJc3RydWN0IG5pc19oYXNoX2RhdGEJKnBydl9pdGVtOyAvKiBBIHNlcmlhbCwgZG91Ymx5IGxpbmtlZCBsaXN0ICovCislCXN0cnVjdCBuaXNfaGFzaF9kYXRhCSpueHRfaXRlbTsgLyogb2YgaXRlbXMgaW4gdGhlIGhhc2ggdGFibGUgICAqLworJX07CisldHlwZWRlZiBzdHJ1Y3QgbmlzX2hhc2hfZGF0YSBOSVNfSEFTSF9JVEVNOworJQorJXN0cnVjdCBuaXNfaGFzaF90YWJsZSB7CislCU5JU19IQVNIX0lURU0JKmtleXNbNjRdOwkvKiBBIGhhc2ggdGFibGUgb2YgaXRlbXMgICAgICAgICAgICovCislCU5JU19IQVNIX0lURU0JKmZpcnN0OwkJLyogVGhlIGZpcnN0ICJpdGVtIiBpbiBzZXJpYWwgbGlzdCAqLworJX07CisldHlwZWRlZiBzdHJ1Y3QgbmlzX2hhc2hfdGFibGUgTklTX0hBU0hfVEFCTEU7CislCislLyogU3RydWN0dXJlIGZvciBzdG9yaW5nIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdGF0aWMgZGF0YSAqLworJXN0cnVjdCBuaXNfc2RhdGEgeworJQl2b2lkCSpidWY7CS8qIE1lbW9yeSBhbGxvY2F0aW9uIHBvaW50ZXIJKi8KKyUJdV9pbnQJc2l6ZTsJLyogQnVmZmVyIHNpemUJCQkqLworJX07CislCislLyogR2VuZXJpYyBjbGllbnQgY3JlYXRpbmcgZmxhZ3MgKi8KKyUjZGVmaW5lIFpNSF9WQwkJMQorJSNkZWZpbmUgWk1IX0RHCQkyCislI2RlZmluZSBaTUhfQVVUSAk0CislCislLyogVGVzdGluZyBBY2Nlc3MgcmlnaHRzIGZvciBvYmplY3RzICovCislCislI2RlZmluZSBOSVNfUkVBRF9BQ0MJCTEKKyUjZGVmaW5lIE5JU19NT0RJRllfQUNDCQkyCislI2RlZmluZSBOSVNfQ1JFQVRFX0FDQwkJNAorJSNkZWZpbmUgTklTX0RFU1RST1lfQUNDCTgKKyUvKiBUZXN0IG1hY3Jvcy4gYSA9PSBhY2Nlc3MgcmlnaHRzLCBtID09IGRlc2lyZWQgcmlnaHRzLiAqLworJSNkZWZpbmUgTklTX1dPUkxEKGEsIG0pCSgoKGEpICYgKG0pKSAhPSAwKQorJSNkZWZpbmUgTklTX0dST1VQKGEsIG0pCSgoKGEpICYgKChtKSA8PCA4KSkgIT0gMCkKKyUjZGVmaW5lIE5JU19PV05FUihhLCBtKQkoKChhKSAmICgobSkgPDwgMTYpKSAhPSAwKQorJSNkZWZpbmUgTklTX05PQk9EWShhLCBtKQkoKChhKSAmICgobSkgPDwgMjQpKSAhPSAwKQorJS8qCislICogRU9MIEFsZXJ0IC0gVGhlIGZvbGxvd2luZyBub24tcHJlZml4ZWQgdGVzdCBtYWNyb3MgYXJlCislICogaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eSwgYW5kIHdpbGwgYmUgbm90IGJlIHByZXNlbnQKKyUgKiBpbiBmdXR1cmUgcmVsZWFzZXMgLSB1c2UgdGhlIE5JU18qKCkgbWFjcm9zIGFib3ZlLgorJSAqLworJSNkZWZpbmUgV09STEQoYSwgbSkJKCgoYSkgJiAobSkpICE9IDApCislI2RlZmluZSBHUk9VUChhLCBtKQkoKChhKSAmICgobSkgPDwgOCkpICE9IDApCislI2RlZmluZSBPV05FUihhLCBtKQkoKChhKSAmICgobSkgPDwgMTYpKSAhPSAwKQorJSNkZWZpbmUgTk9CT0RZKGEsIG0pCSgoKGEpICYgKChtKSA8PCAyNCkpICE9IDApCislCislI2RlZmluZSBPQVRZUEUoZCwgbikgKCgoZCktPmRvX2FybWFzay5kb19hcm1hc2tfdmFsK24pLT5vYV9vdHlwZSkKKyUjZGVmaW5lIE9BUklHSFRTKGQsIG4pICgoKGQpLT5kb19hcm1hc2suZG9fYXJtYXNrX3ZhbCtuKS0+b2FfcmlnaHRzKQorJSNkZWZpbmUgV09STERfREVGQVVMVCAoTklTX1JFQURfQUNDKQorJSNkZWZpbmUgR1JPVVBfREVGQVVMVCAoTklTX1JFQURfQUNDIDw8IDgpCislI2RlZmluZSBPV05FUl9ERUZBVUxUICgoTklTX1JFQURfQUNDICtcCisJCQkgTklTX01PRElGWV9BQ0MgK1wKKwkJCSBOSVNfQ1JFQVRFX0FDQyArXAorCQkJIE5JU19ERVNUUk9ZX0FDQykgPDwgMTYpCislI2RlZmluZSBERUZBVUxUX1JJR0hUUyAoV09STERfREVGQVVMVCB8IEdST1VQX0RFRkFVTFQgfCBPV05FUl9ERUZBVUxUKQorJQorJS8qIFJlc3VsdCBtYW5pcHVsYXRpb24gZGVmaW5lcyAuLi4gKi8KKyUjZGVmaW5lIE5JU19SRVNfTlVNT0JKKHgpCSgoeCktPm9iamVjdHMub2JqZWN0c19sZW4pCislI2RlZmluZSBOSVNfUkVTX09CSkVDVCh4KQkoKHgpLT5vYmplY3RzLm9iamVjdHNfdmFsKQorJSNkZWZpbmUgTklTX1JFU19DT09LSUUoeCkJKCh4KS0+Y29va2llKQorJSNkZWZpbmUgTklTX1JFU19TVEFUVVMoeCkJKCh4KS0+c3RhdHVzKQorJQorJS8qIFRoZXNlIGRlZmluZXMgbWFrZSBnZXR0aW5nIGF0IHRoZSB2YXJpYW50IHBhcnQgb2YgdGhlIG9iamVjdCBlYXNpZXIuICovCislI2RlZmluZSBUQV9kYXRhIHpvX2RhdGEub2JqZGF0YV91LnRhX2RhdGEKKyUjZGVmaW5lIEVOX2RhdGEgem9fZGF0YS5vYmpkYXRhX3UuZW5fZGF0YQorJSNkZWZpbmUgRElfZGF0YSB6b19kYXRhLm9iamRhdGFfdS5kaV9kYXRhCislI2RlZmluZSBMSV9kYXRhIHpvX2RhdGEub2JqZGF0YV91LmxpX2RhdGEKKyUjZGVmaW5lIEdSX2RhdGEgem9fZGF0YS5vYmpkYXRhX3UuZ3JfZGF0YQorJQorJSNkZWZpbmUgX190eXBlX29mKG8pICgobyktPnpvX2RhdGEuem9fdHlwZSkKKyUKKyUvKiBEZWNsYXJhdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCBzdWJyb3V0aW5lcyBpbiBuaXNsaWIuYyAqLworJWVudW0gbmFtZV9wb3Mge1NBTUVfTkFNRSwgSElHSEVSX05BTUUsIExPV0VSX05BTUUsIE5PVF9TRVFVRU5USUFMLCBCQURfTkFNRX07CisldHlwZWRlZiBlbnVtIG5hbWVfcG9zIG5hbWVfcG9zOworJQorJS8qCislICogRGVmaW5lcyBmb3IgZ2V0dGluZyBhdCBjb2x1bW4gZGF0YSBpbiBlbnRyeSBvYmplY3RzLiBCZWNhdXNlIFJQQ0dFTgorJSAqIGdlbmVyYXRlcyBzb21lIHJhdGhlciB3b3JkeSBzdHJ1Y3R1cmVzLCB3ZSBjcmVhdGUgc29tZSBkZWZpbmVzIHRoYXQKKyUgKiBjb2xsYXBzZSB0aGUgbmVlZGVkIGtleXN0cm9rZXMgdG8gYWNjZXNzIGEgcGFydGljdWxhciB2YWx1ZSB1c2luZworJSAqIHRoZXNlIGRlZmluaXRpb25zIHRoZXkgdGFrZSBhbiBuaXNfb2JqZWN0ICosIGFuZCBhbiBpbnQgYW5kIHJldHVybgorJSAqIGEgdV9jaGFyICogZm9yIFZhbHVlLCBhbmQgYW4gaW50IGZvciBsZW5ndGguCislICovCislI2RlZmluZSBFTlRSWV9WQUwob2JqLCBjb2wpIFwKKyUJKG9iaiktPkVOX2RhdGEuZW5fY29scy5lbl9jb2xzX3ZhbFtjb2xdLmVjX3ZhbHVlLmVjX3ZhbHVlX3ZhbAorJSNkZWZpbmUgRU5UUllfTEVOKG9iaiwgY29sKSBcCislCShvYmopLT5FTl9kYXRhLmVuX2NvbHMuZW5fY29sc192YWxbY29sXS5lY192YWx1ZS5lY192YWx1ZV9sZW4KKyUKKyUKKyUKKyUjaWZkZWYgX19jcGx1c3BsdXMKKyV9CislI2VuZGlmCislCislLyogUHJvdG90eXBlcywgYW5kIGV4dGVybiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBOSVMgbGlicmFyeSBmdW5jdGlvbnMuICovCislI2luY2x1ZGUgPHJwY3N2Yy9uaXNsaWIuaD4KKyUjZW5kaWYgLyogX19OSVNfUlBDR0VOX0ggKi8KKyUvKiBFRElUX1NUQVJUICovCislCislLyoKKyUgKiBuaXNfMy5oCislICoKKyUgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgdGhhdCBhcmUgb25seSBvZiBpbnRlcmVzdCB0byB0aGUgYWN0dWFsCislICogc2VydmljZSBkYWVtb24gYW5kIGNsaWVudCBzdHVicy4gTm9ybWFsIHVzZXJzIG9mIE5JUyB3aWxsIG5vdCBpbmNsdWRlCislICogdGhpcyBmaWxlLgorJSAqCislICogTk9URSA6IFRoaXMgaW5jbHVkZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBhIGNvbWJpbmF0aW9uCislICogb2YgcnBjZ2VuIGFuZCBzZWQuIERPIE5PVCBFRElUIElULCBjaGFuZ2UgdGhlIG5pcy54IGZpbGUgaW5zdGVhZAorJSAqIGFuZCB0aGVuIHJlbWFrZSB0aGlzIGZpbGUuCislICovCislI2lmbmRlZiBfX25pc18zX2gKKyUjZGVmaW5lIF9fbmlzXzNfaAorJSNpZmRlZiBfX2NwbHVzcGx1cworJWV4dGVybiAiQyIgeworJSNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXNfY2FsbGJhY2suaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc19jYWxsYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMDU3MjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXNfY2FsbGJhY2suaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX1JQQ1NWQ19OSVNfQ0FMTEJBQ0tfSAorI2RlZmluZSBfUlBDU1ZDX05JU19DQUxMQkFDS19IIDEKKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxycGNzdmMvbmlzLmg+CisKK19fQkVHSU5fREVDTFMKKwordHlwZWRlZiBuaXNfb2JqZWN0ICpvYmpfcDsKKworc3RydWN0IGNiYWNrX2RhdGEgeworCXN0cnVjdCB7CisJCXVfaW50IGVudHJpZXNfbGVuOworCQlvYmpfcCAqZW50cmllc192YWw7CisJfSBlbnRyaWVzOworfTsKK3R5cGVkZWYgc3RydWN0IGNiYWNrX2RhdGEgY2JhY2tfZGF0YTsKKworI2RlZmluZSBDQl9QUk9HIDEwMDMwMgorI2RlZmluZSBDQl9WRVJTIDEKKworI2RlZmluZSBDQlBST0NfUkVDRUlWRSAxCitleHRlcm4gIGJvb2xfdCAqIGNicHJvY19yZWNlaXZlXzEgKGNiYWNrX2RhdGEgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIGJvb2xfdCAqIGNicHJvY19yZWNlaXZlXzFfc3ZjIChjYmFja19kYXRhICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisKKyNkZWZpbmUgQ0JQUk9DX0ZJTklTSCAyCitleHRlcm4gIHZvaWQgKiBjYnByb2NfZmluaXNoXzEgKHZvaWQgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIHZvaWQgKiBjYnByb2NfZmluaXNoXzFfc3ZjICh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisKKyNkZWZpbmUgQ0JQUk9DX0VSUk9SIDMKK2V4dGVybiAgdm9pZCAqIGNicHJvY19lcnJvcl8xIChuaXNfZXJyb3IgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIHZvaWQgKiBjYnByb2NfZXJyb3JfMV9zdmMgKG5pc19lcnJvciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworZXh0ZXJuIGludCBjYl9wcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpIF9fVEhST1c7CisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKK2V4dGVybiAgYm9vbF90IHhkcl9vYmpfcCAoWERSICosIG9ial9wKikgX19USFJPVzsKK2V4dGVybiAgYm9vbF90IHhkcl9jYmFja19kYXRhIChYRFIgKiwgY2JhY2tfZGF0YSopIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiAhX1JQQ1ZTQ19OSVNfQ0FMTEJBQ0tfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX2NhbGxiYWNrLnggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXNfY2FsbGJhY2sueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmRjYTllCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX2NhbGxiYWNrLngKQEAgLTAsMCArMSw2MyBAQAorJS8qCislICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorJSAqCislICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CislICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorJSAqIG1ldDoKKyUgKgorJSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CislICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorJSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyUgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworJSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworJSAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyUgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCislICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCislICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorJSAqCislICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCislICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorJSAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyUgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCislICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCislICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCislICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorJSAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworJSAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCislICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyUgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyUgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCislICovCisKKy8qCisgKgluaXNfY2FsbGJhY2sueAorICovCisKKyUjcHJhZ21hIGlkZW50CSJAKCMpbmlzX2NhbGxiYWNrLngJMS43CTk0LzA1LzAzIgorCisvKgorICogIkAoIyl6bnNfY2JhY2sueCAxLjIgOTAvMDkvMTAiCisgKgorICogUlBDTCBkZXNjcmlwdGlvbiBvZiB0aGUgQ2FsbGJhY2sgU2VydmljZS4KKyAqLworCisjaWZkZWYgUlBDX0hEUgorJSNpbmNsdWRlIDxycGNzdmMvbmlzLmg+CisjZW5kaWYKKyNpZmRlZiBSUENfWERSCislI2luY2x1ZGUgIm5pc19jbG50LmgiCisjZW5kaWYKKwordHlwZWRlZiBuaXNfb2JqZWN0CSpvYmpfcDsKKworc3RydWN0IGNiYWNrX2RhdGEgeworCW9ial9wCQllbnRyaWVzPD47CS8qIExpc3Qgb2Ygb2JqZWN0cyAqLworfTsKKworcHJvZ3JhbSBDQl9QUk9HIHsKKwl2ZXJzaW9uIENCX1ZFUlMgeworCQlib29sCUNCUFJPQ19SRUNFSVZFKGNiYWNrX2RhdGEpID0gMTsKKwkJdm9pZAlDQlBST0NfRklOSVNIKHZvaWQpID0gMjsKKwkJdm9pZAlDQlBST0NfRVJST1IobmlzX2Vycm9yKSA9IDM7CisJfSA9IDE7Cit9ID0gMTAwMzAyOwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX29iamVjdC54IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX29iamVjdC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NGIzOGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXNfb2JqZWN0LngKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKgluaXNfb2JqZWN0LngKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCislI3ByYWdtYSBpZGVudAkiQCgjKW5pc19vYmplY3QueAkxLjEyCTk3LzExLzE5IgorCisjaWYgUlBDX0hEUgorJQorJSNpZm5kZWYgX19uaXNfb2JqZWN0X2gKKyUjZGVmaW5lIF9fbmlzX29iamVjdF9oCislCisjZW5kaWYKKy8qCisgKglUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZm9ybWF0IGZvciBhIE5JUyBvYmplY3QgaW4gUlBDIGxhbmd1YWdlLgorICogSXQgaXMgaW5jbHVkZWQgYnkgdGhlIG1haW4gLnggZmlsZSBhbmQgdGhlIGRhdGFiYXNlIGFjY2VzcyBwcm90b2NvbAorICogZmlsZS4gSXQgaXMgY29tbW9uIGJlY2F1c2UgYm90aCBvZiB0aGVtIG5lZWQgdG8gZGVhbCB3aXRoIHRoZSBzYW1lCisgKiB0eXBlIG9mIG9iamVjdC4gR2VuZXJhdGluZyB0aGUgYWN0dWFsIGNvZGUgdGhvdWdoIGlzIGEgYml0IG1lc3N5IGJlY2F1c2UKKyAqIHRoZSBuaXMueCBmaWxlIGFuZCB0aGUgbmlzX2RiYS54IGZpbGUgd2lsbCBnZW5lcmF0ZSB4ZHIgcm91dGluZXMgdG8KKyAqIGVuY29kZS9kZWNvZGUgb2JqZWN0cyB3aGVuIG9ubHkgb25lIHNldCBpcyBuZWVkZWQuIFN1Y2ggaXMgbGlmZSB3aGVuCisgKiBvbmUgaXMgdXNpbmcgcnBjZ2VuLgorICoKKyAqIE5vdGUsIHRoZSBwcm90b2NvbCBkb2Vzbid0IHNwZWNpZnkgYW55IGxpbWl0cyBvbiBzdWNoIHRoaW5ncyBhcworICogbWF4aW11bSBuYW1lIGxlbmd0aCwgbnVtYmVyIG9mIGF0dHJpYnV0ZXMsIGV0Yy4gVGhlc2UgYXJlIGVuZm9yY2VkCisgKiBieSB0aGUgZGF0YWJhc2UgYmFja2VuZC4gV2hlbiB5b3UgaGl0IHRoZW0geW91IHdpbGwgbm8uIEFsc28gc2VlCisgKiB0aGUgZGJfZ2V0bGltaXRzKCkgZnVuY3Rpb24gZm9yIGZldGNoaW5nIHRoZSBsaW1pdCB2YWx1ZXMuCisgKgorICovCisKKy8qIFNvbWUgbWFuaWZlc3QgY29uc3RhbnRzLCBjaG9zZW4gdG8gbWF4aW1pemUgZmxleGliaWxpdHkgd2l0aG91dAorICogcGx1Z2dpbmcgdGhlIHdpcmUgZnVsbCBvZiBkYXRhLgorICovCitjb25zdCBOSVNfTUFYU1RSSU5HTEVOID0gMjU1OworY29uc3QgTklTX01BWE5BTUVMRU4gICA9IDEwMjQ7Citjb25zdCBOSVNfTUFYQVRUUk5BTUUgID0gMzI7Citjb25zdCBOSVNfTUFYQVRUUlZBTCAgID0gMjA0ODsKK2NvbnN0IE5JU19NQVhDT0xVTU5TICAgPSA2NDsKK2NvbnN0IE5JU19NQVhBVFRSICAgICAgPSAxNjsKK2NvbnN0IE5JU19NQVhQQVRIICAgICAgPSAxMDI0OworY29uc3QgTklTX01BWFJFUExJQ0FTICA9IDEyODsKK2NvbnN0IE5JU19NQVhMSU5LUyAgICAgPSAxNjsKKworY29uc3QgTklTX1BLX05PTkUgICAgICA9IDA7CS8qIG5vIHB1YmxpYyBrZXkgKHVuaXgvc3lzIGF1dGgpICovCitjb25zdCBOSVNfUEtfREgJICAgICAgID0gMTsJLyogUHVibGljIGtleSBpcyBEaWZmaWUtSGVsbG1hbiB0eXBlICovCitjb25zdCBOSVNfUEtfUlNBICAgICAgID0gMjsJLyogUHVibGljIGtleSBpZiBSU0EgdHlwZSAqLworY29uc3QgTklTX1BLX0tFUkIgICAgICA9IDM7CS8qIFVzZSBrZXJiZXJvcyBzdHlsZSBhdXRoZW50aWNhdGlvbiAqLworY29uc3QgTklTX1BLX0RIRVhUICAgICA9IDQ7CS8qIEV4dGVuZGVkIERpZmZpZS1IZWxsbWFuIGZvciBSUEMtR1NTICovCisKKy8qCisgKiBUaGUgZnVuZGFtZW50YWwgbmFtZSB0eXBlIG9mIE5JUy4gVGhlIG5hbWUgbWF5IGNvbnNpc3Qgb2YgdHdvIHBhcnRzLAorICogdGhlIGZpcnN0IGJlaW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYW5kIHRoZSBzZWNvbmQgYmVpbmcgYW4KKyAqIG9wdGlvbmFsIHNldCBvZiBhdHRyaWJ1dGUvdmFsdWUgcGFpcnMuCisgKi8KK3N0cnVjdCBuaXNfYXR0ciB7CisJc3RyaW5nCXphdHRyX25keDw+OwkvKiBuYW1lIG9mIHRoZSBpbmRleAkJKi8KKwlvcGFxdWUJemF0dHJfdmFsPD47CS8qIFZhbHVlIGZvciB0aGUgYXR0cmlidXRlLgkqLworfTsKKwordHlwZWRlZiBzdHJpbmcgbmlzX25hbWU8PjsJLyogVGhlIE5JUyBuYW1lIGl0c2VsZi4gKi8KKworLyogTklTIG9iamVjdCB0eXBlcyBhcmUgZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nIGVudW1lcmF0aW9uLiBUaGUgbnVtYmVycworICogdGhleSB1c2UgYXJlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgc2NoZW1lIDoKKyAqCQkgICAgIDAgLSAxMDIzIGFyZSByZXNlcnZlZCBmb3IgU3VuLAorICoJCTEwMjQgLSAyMDQ3IGFyZSBkZWZpbmVkIHRvIGJlIHByaXZhdGUgdG8gYSBwYXJ0aWN1bGFyIHRyZWUuCisgKgkJMjA0OCAtIDQwOTUgYXJlIGRlZmluZWQgdG8gYmUgdXNlciBkZWZpbmVkLgorICoJCTQwOTYgLSAuLi4gIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKyAqCisgKiBFT0wgQWxlcnQgLSBUaGUgbm9uLXByZWZpeGVkIG5hbWVzIGFyZSBwcmVzZW50IGZvciBiYWNrd2FyZAorICogY29tcGF0YWJpbGl0eSBvbmx5LCBhbmQgd2lsbCBub3QgZXhpc3QgaW4gZnV0dXJlIHJlbGVhc2VzLiBVc2UKKyAqIHRoZSBOSVNfKiBuYW1lcyBmb3IgZnV0dXJlIGNvbXBhdGFiaWxpdHkuCisgKi8KKworZW51bSB6b3R5cGVzIHsKKworCUJPR1VTX09CSgk9IDAsCS8qIFVuaW5pdGlhbGl6ZWQgb2JqZWN0IHN0cnVjdHVyZQkqLworCU5PX09CSgkJPSAxLAkvKiBOVUxMIG9iamVjdCAobm8gZGF0YSkJCSovCisJRElSRUNUT1JZX09CSgk9IDIsCS8qIERpcmVjdG9yeSBvYmplY3QgZGVzY3JpYmluZyBkb21haW4JKi8KKwlHUk9VUF9PQkoJPSAzLAkvKiBHcm91cCBvYmplY3QgKGEgbGlzdCBvZiBuYW1lcykJKi8KKwlUQUJMRV9PQkoJPSA0LAkvKiBUYWJsZSBvYmplY3QgKGEgZGF0YWJhc2Ugc2NoZW1hKQkqLworCUVOVFJZX09CSgk9IDUsCS8qIEVudHJ5IG9iamVjdCAoYSBkYXRhYmFzZSByZWNvcmQpCSovCisJTElOS19PQkoJPSA2LAkvKiBBIG5hbWUgbGluay4JCQkJKi8KKwlQUklWQVRFX09CSgk9IDcsCS8qIFByaXZhdGUgb2JqZWN0IChhbGwgb3BhcXVlIGRhdGEpCSovCisKKwlOSVNfQk9HVVNfT0JKCT0gMCwJLyogVW5pbml0aWFsaXplZCBvYmplY3Qgc3RydWN0dXJlCSovCisJTklTX05PX09CSgk9IDEsCS8qIE5VTEwgb2JqZWN0IChubyBkYXRhKQkJKi8KKwlOSVNfRElSRUNUT1JZX09CSiA9IDIsIC8qIERpcmVjdG9yeSBvYmplY3QgZGVzY3JpYmluZyBkb21haW4JKi8KKwlOSVNfR1JPVVBfT0JKCT0gMywJLyogR3JvdXAgb2JqZWN0IChhIGxpc3Qgb2YgbmFtZXMpCSovCisJTklTX1RBQkxFX09CSgk9IDQsCS8qIFRhYmxlIG9iamVjdCAoYSBkYXRhYmFzZSBzY2hlbWEpCSovCisJTklTX0VOVFJZX09CSgk9IDUsCS8qIEVudHJ5IG9iamVjdCAoYSBkYXRhYmFzZSByZWNvcmQpCSovCisJTklTX0xJTktfT0JKCT0gNiwJLyogQSBuYW1lIGxpbmsuCQkJCSovCisJTklTX1BSSVZBVEVfT0JKICA9IDcgLyogUHJpdmF0ZSBvYmplY3QgKGFsbCBvcGFxdWUgZGF0YSkgKi8KK307CisKKy8qCisgKiBUaGUgdHlwZXMgb2YgTmFtZSBzZXJ2aWNlcyBOSVMga25vd3MgYWJvdXQuIFRoZXkgYXJlIGVudW1lcmF0ZWQKKyAqIGhlcmUuIFRoZSBCaW5kZXIgY29kZSB3aWxsIHVzZSB0aGlzIHR5cGUgdG8gZGV0ZXJtaW5lIGlmIGl0IGhhcworICogYSBzZXQgb2YgbGlicmFyeSByb3V0aW5lcyB0aGF0IHdpbGwgYWNjZXNzIHRoZSBpbmRpY2F0ZWQgbmFtZSBzZXJ2aWNlLgorICovCitlbnVtIG5zdHlwZSB7CisJVU5LTk9XTiA9IDAsCisJTklTID0gMSwJLyogTmlzIFBsdXMgU2VydmljZQkJKi8KKwlTVU5ZUCA9IDIsCS8qIE9sZCBOSVMgU2VydmljZQkJKi8KKwlJVlkgPSAzLAkvKiBOaXMgUGx1cyBQbHVzIFNlcnZpY2UJKi8KKwlETlMgPSA0LAkvKiBEb21haW4gTmFtZSBTZXJ2aWNlCQkqLworCVg1MDAgPSA1LAkvKiBJU08vQ0NDSVQgWC41MDAgU2VydmljZQkqLworCUROQU5TID0gNiwJLyogRGlnaXRhbCBERUNOZXQgTmFtZSBTZXJ2aWNlCSovCisJWENIUyA9IDcsCS8qIFhlcm94IENsZWFyaW5nSG91c2UgU2VydmljZQkqLworCUNEUz0gOAorfTsKKworLyoKKyAqIERJUkVDVE9SWSAtIFRoZSBuYW1lIHNlcnZpY2Ugb2JqZWN0LiBUaGVzZSBvYmplY3RzIGlkZW50aWZ5IG90aGVyIG5hbWUKKyAqIHNlcnZlcnMgdGhhdCBhcmUgc2VydmluZyBzb21lIHBvcnRpb24gb2YgdGhlIG5hbWUgc3BhY2UuIEVhY2ggaGFzIGEKKyAqIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0LiBUaGUgcmVzb2x2ZXIgbGlicmFyeSB3aWxsIG5vdGUgd2hldGhlciBvciBub3QKKyAqIGlzIGhhcyB0aGUgbmVlZGVkIHJvdXRpbmVzIHRvIGFjY2VzcyB0aGF0IHR5cGUgb2Ygc2VydmljZS4KKyAqIFRoZSBvYXJtYXNrIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGFjY2VzcyByaWdodHMgbWFzayBvbiBhIHBlciBvYmplY3QKKyAqIHR5cGUgYmFzaXMgZm9yIHRoZSBuYW1lIHNwYWNlcy4gVGhlIG9ubHkgYml0cyBjdXJyZW50bHkgdXNlZCBhcmUKKyAqIGNyZWF0ZSBhbmQgZGVzdHJveS4gQnkgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIHRoZXNlIGFjY2VzcyByaWdodHMgZm9yCisgKiBhIHNwZWNpZmljIG9iamVjdCB0eXBlIGZvciBhIG9uZSBvZiB0aGUgYWNjZXNzb3IgZW50aXRpZXMgKG93bmVyLAorICogZ3JvdXAsIHdvcmxkKSB0aGUgYWRtaW5pc3RyYXRvciBjYW4gY29udHJvbCB3aGF0IHR5cGVzIG9mIG9iamVjdHMKKyAqIG1heSBiZSBmcmVlbHkgYWRkZWQgdG8gdGhlIG5hbWUgc3BhY2UgYW5kIHdoaWNoIHJlcXVpcmUgdGhlCisgKiBhZG1pbmlzdHJhdG9yJ3MgYXBwcm92YWwuCisgKi8KK3N0cnVjdCBvYXJfbWFzayB7CisJdWludDMyX3QJb2FfcmlnaHRzOwkvKiBBY2Nlc3MgcmlnaHRzIG1hc2sJKi8KKwl6b3R5cGVzCQlvYV9vdHlwZTsJLyogT2JqZWN0IHR5cGUJCSovCit9OworCitzdHJ1Y3QgZW5kcG9pbnQgeworCXN0cmluZwkJdWFkZHI8PjsKKwlzdHJpbmcJCWZhbWlseTw+OyAgIC8qIFRyYW5zcG9ydCBmYW1pbHkgKElORVQsIE9TSSwgZXRjKSAqLworCXN0cmluZwkJcHJvdG88PjsgICAgLyogUHJvdG9jb2wgKFRDUCwgVURQLCBDTE5QLCAgZXRjKSAgICovCit9OworCisvKgorICogTm90ZTogcGtleSBpcyBhIG5ldG9iaiB3aGljaCBpcyBsaW1pdGVkIHRvIDEwMjQgYnl0ZXMgd2hpY2ggbGltaXRzIHRoZQorICoga2V5c2l6ZSB0byA4MTkyIGJpdHMuIFRoaXMgaXMgY29uc2lkZXIgdG8gYmUgYSByZWFzb25hYmxlIGxpbWl0IGZvcgorICogdGhlIGV4cGVjdGVkIGxpZmV0aW1lIG9mIHRoaXMgc2VydmljZS4KKyAqLworc3RydWN0IG5pc19zZXJ2ZXIgeworCW5pc19uYW1lCW5hbWU7CQkvKiBQcmluY2lwYWwgbmFtZSBvZiB0aGUgc2VydmVyICAqLworCWVuZHBvaW50CWVwPD47CQkvKiBVbml2ZXJzYWwgYWRkcihzKSBmb3Igc2VydmVyICAqLworCXVpbnQzMl90CWtleV90eXBlOwkvKiBQdWJsaWMga2V5IHR5cGUJCSAqLworCW5ldG9iagkJcGtleTsJCS8qIHNlcnZlcidzIHB1YmxpYyBrZXkJCSAqLworfTsKKworc3RydWN0IGRpcmVjdG9yeV9vYmogeworCW5pc19uYW1lICAgZG9fbmFtZTsJIC8qIE5hbWUgb2YgdGhlIGRpcmVjdG9yeSBiZWluZyBzZXJ2ZWQgICAqLworCW5zdHlwZQkgICBkb190eXBlOwkgLyogb25lIG9mIE5JUywgRE5TLCBJVlksIFlQLCBvciBYLjUwMAkgKi8KKwluaXNfc2VydmVyIGRvX3NlcnZlcnM8PjsgLyogPDA+ID09IFByaW1hcnkgbmFtZSBzZXJ2ZXIJCSAqLworCXVpbnQzMl90ICAgZG9fdHRsOwkgLyogVGltZSBUbyBMaXZlIChmb3IgY2FjaGVzKQkJICovCisJb2FyX21hc2sgICBkb19hcm1hc2s8PjsgIC8qIENyZWF0ZS9EZXN0cm95IHJpZ2h0cyBieSBvYmplY3QgdHlwZSAqLworfTsKKworLyoKKyAqIEVOVFJZIC0gVGhpcyBpcyBvbmUgcm93IG9mIGRhdGEgZnJvbSBhbiBpbmZvcm1hdGlvbiBiYXNlLgorICogVGhlIHR5cGUgdmFsdWUgaXMgdXNlZCBieSB0aGUgY2xpZW50IGxpYnJhcnkgdG8gY29udmVydCB0aGUgZW50cnkgdG8KKyAqIGl0J3MgaW50ZXJuYWwgc3RydWN0dXJlIHJlcHJlc2VudGF0aW9uLiBUaGUgVGFibGUgbmFtZSBpcyBhIGJhY2sgcG9pbnRlcgorICogdG8gdGhlIHRhYmxlIHdoZXJlIHRoZSBlbnRyeSBpcyBzdG9yZWQuIFRoaXMgYWxsb3dzIHRoZSBjbGllbnQgbGlicmFyeQorICogdG8gZGV0ZXJtaW5lIHdoZXJlIHRvIHNlbmQgYSByZXF1ZXN0IGlmIHRoZSBjbGllbnQgd2lzaGVzIHRvIGNoYW5nZSB0aGlzCisgKiBlbnRyeSBidXQgZ290IHRvIGl0IHRocm91Z2ggYSBMSU5LIHJhdGhlciB0aGFuIGRpcmVjdGx5LgorICogSWYgdGhlIGVudHJ5IGlzIGEgInN0YW5kYWxvbmUiIGVudHJ5IHRoZW4gdGhpcyBmaWVsZCBpcyB2b2lkLgorICovCitjb25zdCBFTl9CSU5BUlkgICA9IDE7CS8qIEluZGljYXRlcyB2YWx1ZSBpcyBiaW5hcnkgZGF0YQkqLworY29uc3QgRU5fQ1JZUFQgICAgPSAyOwkvKiBJbmRpY2F0ZXMgdGhlIHZhbHVlIGlzIGVuY3J5cHRlZAkqLworY29uc3QgRU5fWERSICAgICAgPSA0OwkvKiBJbmRpY2F0ZXMgdGhlIHZhbHVlIGlzIFhEUiBlbmNvZGVkCSovCitjb25zdCBFTl9NT0RJRklFRCA9IDg7CS8qIEluZGljYXRlcyBlbnRyeSBpcyBtb2RpZmllZC4JKi8KK2NvbnN0IEVOX0FTTjEgICAgID0gNjQ7CS8qIE1lYW5zIGNvbnRlbnRzIHVzZSBBU04uMSBlbmNvZGluZyAgICAqLworCitzdHJ1Y3QgZW50cnlfY29sIHsKKwl1aW50MzJfdAllY19mbGFnczsJLyogRmxhZ3MgZm9yIHRoaXMgdmFsdWUgKi8KKwlvcGFxdWUJCWVjX3ZhbHVlPD47CS8qIEl0J3MgdGV4dHVhbCB2YWx1ZQkqLworfTsKKworc3RydWN0IGVudHJ5X29iaiB7CisJc3RyaW5nCWVuX3R5cGU8PjsJLyogVHlwZSBvZiBlbnRyeSBzdWNoIGFzICJwYXNzd2QiICovCisJZW50cnlfY29sIGVuX2NvbHM8PjsJLyogVmFsdWUgZm9yIHRoZSBlbnRyeQkJICAqLworfTsKKworLyoKKyAqIEdST1VQIC0gVGhlIGdyb3VwIG9iamVjdCBjb250YWlucyBhIGxpc3Qgb2YgTklTIHByaW5jaXBhbCBuYW1lcy4gR3JvdXBzCisgKiBhcmUgdXNlZCB0byBhdXRob3JpemUgcHJpbmNpcGFscy4gRWFjaCBvYmplY3QgaGFzIGEgc2V0IG9mIGFjY2VzcyByaWdodHMKKyAqIGZvciBtZW1iZXJzIG9mIGl0cyBncm91cC4gUHJpbmNpcGFsIG5hbWVzIGluIGdyb3VwcyBhcmUgaW4gdGhlIGZvcm0KKyAqIG5hbWUuZGlyZWN0b3J5IGFuZCByZWN1cnNpdmUgZ3JvdXBzIGFyZSBleHByZXNzZWQgYXMgQGdyb3VwbmFtZS5kaXJlY3RvcnkKKyAqLworc3RydWN0IGdyb3VwX29iaiB7CisJdWludDMyX3QJZ3JfZmxhZ3M7CS8qIEZsYWdzIGNvbnRyb2xsaW5nIGdyb3VwCSovCisJbmlzX25hbWUJZ3JfbWVtYmVyczw+OwkvKiBMaXN0IG9mIG5hbWVzIGluIGdyb3VwCSovCit9OworCisvKgorICogTElOSyAtIFRoaXMgaXMgdGhlIExJTksgb2JqZWN0LiBJdCBpcyBxdWl0ZSBzaW1pbGFyIHRvIGEgc3ltYm9saWMgbGluaworICogaW4gdGhlIFVOSVggZmlsZXN5c3RlbS4gVGhlIGF0dHJpYnV0ZXMgaW4gdGhlIG1haW4gb2JqZWN0IHN0cnVjdHVyZSBhcmUKKyAqIHJlbGF0aXZlIHRvIHRoZSBMSU5LIGRhdGEgYW5kIG5vdCB3aGF0IGl0IHBvaW50cyB0byAobGlrZSB0aGUgZmlsZSBzeXN0ZW0pCisgKiAibW9kaWZ5IiBwcml2bGVnZXMgaGVyZSBpbmRpY2F0ZSB0aGUgcmlnaHQgdG8gbW9kaWZ5IHdoYXQgdGhlIGxpbmsgcG9pbnRzCisgKiBhdCBhbmQgbm90IHRvIG1vZGlmeSB0aGF0IGFjdHVhbCBvYmplY3QgcG9pbnRlZCB0byBieSB0aGUgbGluay4KKyAqLworc3RydWN0IGxpbmtfb2JqIHsKKwl6b3R5cGVzCSBsaV9ydHlwZTsJLyogUmVhbCB0eXBlIG9mIHRoZSBvYmplY3QJKi8KKwluaXNfYXR0ciBsaV9hdHRyczw+OwkvKiBBdHRyaWJ1dGUvVmFsdWVzIGZvciB0YWJsZXMJKi8KKwluaXNfbmFtZSBsaV9uYW1lOwkvKiBUaGUgb2JqZWN0J3MgcmVhbCBOSVMgbmFtZQkqLworfTsKKworLyoKKyAqIFRBQkxFIC0gVGhpcyBpcyB0aGUgdGFibGUgb2JqZWN0LiBJdCBpbXBsZW1lbnRzIGEgc2ltcGxlCisgKiBkYXRhIGJhc2UgdGhhdCBhcHBsaWNhdGlvbnMgYW5kIHVzZSBmb3IgY29uZmlndXJhdGlvbiBvcgorICogYWRtaW5pc3RyYXRpb24gcHVycG9zZXMuIFRoZSByb2xlIG9mIHRoZSB0YWJsZSBpcyB0byBncm91cCB0b2dldGhlcgorICogYSBzZXQgb2YgcmVsYXRlZCBlbnRyaWVzLiBUYWJsZXMgYXJlIHRoZSBzaW1wbGUgZGF0YWJhc2UgY29tcG9uZW50CisgKiBvZiBOSVMuIExpa2UgbWFueSBkYXRhYmFzZXMsIHRhYmxlcyBhcmUgbG9naWNhbGx5IGRpdmlkZWQgaW50byBjb2x1bW5zCisgKiBhbmQgcm93cy4gVGhlIGNvbHVtbnMgYXJlIGxhYmVsZWQgd2l0aCBpbmRleGVzIGFuZCBlYWNoIEVOVFJZIG1ha2VzCisgKiB1cCBhIHJvdy4gUm93cyBtYXkgYmUgYWRkcmVzc2VkIHdpdGhpbiB0aGUgdGFibGUgYnkgc2VsZWN0aW5nIG9uZQorICogb3IgbW9yZSBpbmRleGVzLCBhbmQgdmFsdWVzIGZvciB0aG9zZSBpbmRleGVzLiBFYWNoIHJvdyB3aGljaCBoYXMKKyAqIGEgdmFsdWUgZm9yIHRoZSBnaXZlbiBpbmRleCB0aGF0IG1hdGNoZXMgdGhlIGRlc2lyZWQgdmFsdWUgaXMgcmV0dXJuZWQuCisgKiBXaXRoaW4gdGhlIGRlZmluaXRpb24gb2YgZWFjaCBjb2x1bW4gdGhlcmUgaXMgYSBmbGFncyB2YXJpYWJsZSwgdGhpcworICogdmFyaWFibGUgY29udGFpbnMgZmxhZ3Mgd2hpY2ggZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBjb2x1bW4gaXMKKyAqIHNlYXJjaGFibGUsIGNvbnRhaW5zIGJpbmFyeSBkYXRhLCBhbmQgYWNjZXNzIHJpZ2h0cyBmb3IgdGhlIGVudHJ5IG9iamVjdHMKKyAqIGNvbHVtbiB2YWx1ZS4KKyAqLworCitjb25zdCBUQV9CSU5BUlkgICAgID0gMTsJLyogTWVhbnMgdGFibGUgZGF0YSBpcyBiaW5hcnkJCSovCitjb25zdCBUQV9DUllQVCAgICAgID0gMjsJLyogTWVhbnMgdmFsdWUgc2hvdWxkIGJlIGVuY3J5cHRlZAkqLworY29uc3QgVEFfWERSICAgICAgICA9IDQ7CS8qIE1lYW5zIHZhbHVlIGlzIFhEUiBlbmNvZGVkCQkqLworY29uc3QgVEFfU0VBUkNIQUJMRSA9IDg7CS8qIE1lYW5zIHRoaXMgY29sdW1uIGlzIHNlYXJjaGFibGUJKi8KK2NvbnN0IFRBX0NBU0UgICAgICAgPSAxNjsJLyogTWVhbnMgdGhpcyBjb2x1bW4gaXMgQ2FzZSBTZW5zaXRpdmUJKi8KK2NvbnN0IFRBX01PRElGSUVEICAgPSAzMjsJLyogTWVhbnMgdGhpcyBjb2x1bW5zIGF0dHJzIGFyZSBtb2RpZmllZCovCitjb25zdCBUQV9BU04xICAgICAgID0gNjQ7CS8qIE1lYW5zIGNvbnRlbnRzIHVzZSBBU04uMSBlbmNvZGluZyAgICAgKi8KKworc3RydWN0IHRhYmxlX2NvbCB7CisJc3RyaW5nCQl0Y19uYW1lPDY0PjsJLyogQ29sdW1uIE5hbWUJCSAgICovCisJdWludDMyX3QJdGNfZmxhZ3M7CS8qIGNvbnRyb2wgZmxhZ3MJICAgKi8KKwl1aW50MzJfdAl0Y19yaWdodHM7CS8qIEFjY2VzcyByaWdodHMgbWFzawkgICAqLworfTsKKworc3RydWN0IHRhYmxlX29iaiB7CisJc3RyaW5nCSAgdGFfdHlwZTw2ND47CSAvKiBUYWJsZSB0eXBlIHN1Y2ggYXMgInBhc3N3ZCIJKi8KKwlpbnQJICB0YV9tYXhjb2w7CSAvKiBUb3RhbCBudW1iZXIgb2YgY29sdW1ucwkqLworCXVfY2hhcgkgIHRhX3NlcDsJIC8qIFNlcGFyYXRvciBjaGFyYWN0ZXIJCSovCisJdGFibGVfY29sIHRhX2NvbHM8PjsJIC8qIFRoZSBudW1iZXIgb2YgdGFibGUgaW5kZXhlcyAqLworCXN0cmluZwkgIHRhX3BhdGg8PjsJIC8qIEEgc2VhcmNoIHBhdGggZm9yIHRoaXMgdGFibGUgKi8KK307CisKKy8qCisgKiBUaGlzIHVuaW9uIGpvaW5zIHRvZ2V0aGVyIGFsbCBvZiB0aGUgY3VycmVudGx5IGtub3duIG9iamVjdHMuCisgKi8KK3VuaW9uIG9iamRhdGEgc3dpdGNoICh6b3R5cGVzIHpvX3R5cGUpIHsKKwljYXNlIE5JU19ESVJFQ1RPUllfT0JKIDoKKwkJc3RydWN0IGRpcmVjdG9yeV9vYmogZGlfZGF0YTsKKwljYXNlIE5JU19HUk9VUF9PQkogOgorCQlzdHJ1Y3QgZ3JvdXBfb2JqIGdyX2RhdGE7CisJY2FzZSBOSVNfVEFCTEVfT0JKIDoKKwkJc3RydWN0IHRhYmxlX29iaiB0YV9kYXRhOworCWNhc2UgTklTX0VOVFJZX09CSjoKKwkJc3RydWN0IGVudHJ5X29iaiBlbl9kYXRhOworCWNhc2UgTklTX0xJTktfT0JKIDoKKwkJc3RydWN0IGxpbmtfb2JqIGxpX2RhdGE7CisJY2FzZSBOSVNfUFJJVkFURV9PQkogOgorCQlvcGFxdWUJcG9fZGF0YTw+OworCWNhc2UgTklTX05PX09CSiA6CisJCXZvaWQ7CisJY2FzZSBOSVNfQk9HVVNfT0JKIDoKKwkJdm9pZDsKKwlkZWZhdWx0IDoKKwkJdm9pZDsKK307CisKKy8qCisgKiBUaGlzIGlzIHRoZSBiYXNpYyBOSVMgb2JqZWN0IGRhdGEgdHlwZS4gSXQgY29uc2lzdHMgb2YgYSBnZW5lcmljIHBhcnQKKyAqIHdoaWNoIGFsbCBvYmplY3RzIGNvbnRhaW4sIGFuZCBhIHNwZWNpYWxpemVkIHBhcnQgd2hpY2ggdmFyaWVzIGRlcGVuZGluZworICogb24gdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4gQWxsIG9mIHRoZSBzcGVjaWFsaXplZCBzZWN0aW9ucyBoYXZlIGJlZW4KKyAqIGRlc2NyaWJlZCBhYm92ZS4gWW91IG1pZ2h0IGhhdmUgd29uZGVyZWQgd2h5IHRoZXkgYWxsIHN0YXJ0IHdpdGggYW4KKyAqIGludGVnZXIgc2l6ZSwgZm9sbG93ZWQgYnkgdGhlIHVzZWZ1bCBkYXRhLiBUaGUgYW5zd2VyIGlzLCB3aGVuIHRoZQorICogc2VydmVyIGRvZXNuJ3QgcmVjb2duaXplIHRoZSB0eXBlIHJldHVybmVkIGl0IHRyZWF0cyBpdCBhcyBvcGFxdWUgZGF0YS4KKyAqIEFuZCB0aGUgZGVmaW5pdGlvbiBmb3Igb3BhcXVlIGRhdGEgaXMge2ludCBzaXplOyBjaGFyICpkYXRhO30uIEluIHRoaXMKKyAqIHdheSwgc2VydmVycyBhbmQgdXRpbGl0eSByb3V0aW5lcyB0aGF0IGRvIG5vdCB1bmRlcnN0YW5kIGEgZ2l2ZW4gdHlwZQorICogbWF5IHN0aWxsIHBhc3MgaXQgYXJvdW5kLiBPbmUgaGFzIHRvIGJlIGNhcmVmdWwgaW4gc2V0dGluZworICogdGhpcyB2YXJpYWJsZSBhY2N1cmF0ZWx5LCBpdCBtdXN0IHRha2UgaW50byBhY2NvdW50IHN1Y2ggdGhpbmdzIGFzCisgKiBYRFIgcGFkZGluZyBvZiBzdHJ1Y3R1cmVzIGV0Yy4gVGhlIGJlc3Qgd2F5IHRvIHNldCBpdCBpcyB0byBub3RlIG9uZSdzCisgKiBwb3NpdGlvbiBpbiB0aGUgWERSIGVuY29kaW5nIHN0cmVhbSwgZW5jb2RlIHRoZSBzdHJ1Y3R1cmUsIGxvb2sgYXQgdGhlCisgKiBuZXcgcG9zaXRpb24gYW5kIGNhbGN1bGF0ZSB0aGUgc2l6ZS4KKyAqLworc3RydWN0IG5pc19vaWQgeworCXVpbnQzMl90IGN0aW1lOwkJLyogVGltZSBvZiBvYmplY3RzIGNyZWF0aW9uCSovCisJdWludDMyX3QgbXRpbWU7CQkvKiBUaW1lIG9mIG9iamVjdHMgbW9kaWZpY2F0aW9uICovCit9OworCitzdHJ1Y3QgbmlzX29iamVjdCB7CisJbmlzX29pZAkgem9fb2lkOwkvKiBvYmplY3QgaWRlbnRpdHkgdmVyaWZpZXIuCQkqLworCW5pc19uYW1lIHpvX25hbWU7CS8qIFRoZSBOSVMgbmFtZSBmb3IgdGhpcyBvYmplY3QJCSovCisJbmlzX25hbWUgem9fb3duZXI7CS8qIE5JUyBuYW1lIG9mIG9iamVjdCBvd25lci4JCSovCisJbmlzX25hbWUgem9fZ3JvdXA7CS8qIE5JUyBuYW1lIG9mIGFjY2VzcyBncm91cC4JCSovCisJbmlzX25hbWUgem9fZG9tYWluOwkvKiBUaGUgYWRtaW5pc3RyYXRvciBmb3IgdGhlIG9iamVjdAkqLworCXVpbnQzMl90IHpvX2FjY2VzczsJLyogQWNjZXNzIHJpZ2h0cyAob3duZXIsIGdyb3VwLCB3b3JsZCkJKi8KKwl1aW50MzJfdCB6b190dGw7CS8qIE9iamVjdCdzIHRpbWUgdG8gbGl2ZSBpbiBzZWNvbmRzLgkqLworCW9iamRhdGEJIHpvX2RhdGE7CS8qIERhdGEgc3RydWN0dXJlIGZvciB0aGlzIHR5cGUJCSovCit9OworI2lmIFJQQ19IRFIKKyUKKyUjZW5kaWYgLyogaWYgX19uaXNfb2JqZWN0X2ggKi8KKyUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX3RhZ3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc190YWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkYzdmZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc190YWdzLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICoJbmlzX3RhZ3MuaAorICoKKyAqCVRoaXMgZmlsZSBjb250YWlucyB0aGUgdGFncyBhbmQgc3RhdGlzdGljcyBkZWZpbml0aW9ucy4gSXQgaXMKKyAqCWF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYnkgbmlzLmgKKyAqLworCisjaWZuZGVmCV9SUENTVkNfTklTX1RBR1NfSAorI2RlZmluZQlfUlBDU1ZDX05JU19UQUdTX0gKKworI2lmIDAKKyNwcmFnbWEgaWRlbnQJIkAoIyluaXNfdGFncy5oCTEuMTYJOTYvMTAvMjUiCisjZW5kaWYKKy8qIGZyb20gZmlsZTogem5zX3RhZ3MuaAkxLjcgKi8KKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNkZWZpbmUJTklTX0RJUgkiZGF0YSIKKworLyogTG9va3VwIGFuZCBMaXN0IGZ1bmN0aW9uIGZsYWdzICovCisjZGVmaW5lCUZPTExPV19MSU5LUwkoMTw8MCkJLyogRm9sbG93IGxpbmsgb2JqZWN0cwkJCSovCisjZGVmaW5lCUZPTExPV19QQVRICSgxPDwxKQkvKiBGb2xsb3cgdGhlIHBhdGggaW4gYSB0YWJsZQkJKi8KKyNkZWZpbmUJSEFSRF9MT09LVVAJKDE8PDIpCS8qIEJsb2NrIHVudGlsIHN1Y2Nlc3NmdWwJCSovCisjZGVmaW5lCUFMTF9SRVNVTFRTCSgxPDwzKQkvKiBSZXRyaWV2ZSBhbGwgcmVzdWx0cwkJCSovCisjZGVmaW5lCU5PX0NBQ0hFCSgxPDw0KQkvKiBEbyBub3QgcmV0dXJuICdjYWNoZWQnIHJlc3VsdHMJKi8KKyNkZWZpbmUJTUFTVEVSX09OTFkJKDE8PDUpCS8qIEdldCB2YWx1ZSBvbmx5IGZyb20gbWFzdGVyIHNlcnZlcgkqLworI2RlZmluZQlFWFBBTkRfTkFNRQkoMTw8NikJLyogRXhwYW5kIHBhcnRpdGlhbGx5IHF1YWxpZmllZCBuYW1lcwkqLworCisvKiBTZW1hbnRpYyBtb2RpZmljYXRpb24gZm9yIHRhYmxlIG9wZXJhdGlvbnMgZmxhZ3MgKi8KKyNkZWZpbmUJUkVUVVJOX1JFU1VMVAkoMTw8NykJLyogUmV0dXJuIHJlc3VsdGluZyBvYmplY3QgdG8gY2xpZW50ICAgICovCisjZGVmaW5lCUFERF9PVkVSV1JJVEUJKDE8PDgpCS8qIEFsbG93IG92ZXJ3cml0ZXMgb24gQURECQkqLworI2RlZmluZQlSRU1fTVVMVElQTEUJKDE8PDkpCS8qIEFsbG93IHdpbGRjYXJkIGRlbGV0ZXMJCSovCisjZGVmaW5lCU1PRF9TQU1FT0JKCSgxPDwxMCkJLyogQ2hlY2sgbW9kaWZpZWQgb2JqZWN0IGJlZm9yZSB3cml0ZQkqLworI2RlZmluZQlBRERfUkVTRVJWRUQJKDE8PDExKQkvKiBTcGFyZSBBREQgc2VtYW50aWMJCQkqLworI2RlZmluZQlSRU1fUkVTRVJWRUQJKDE8PDEyKQkvKiBTcGFyZSBSRU0gc2VtYW50aWMJCQkqLworI2RlZmluZQlNT0RfRVhDTFVTSVZFCSgxPDwxMykJLyogTW9kaWZ5IG5vIG92ZXJ3cml0ZSBvbiBtb2RpZmllZCBrZXlzICovCisKKy8qIExvb2t1cCBhbmQgTGlzdCBmdW5jdGlvbiBmbGFncyAoY29udGludWVkKSAqLworI2RlZmluZQlTT0ZUX0xPT0tVUAkoMTw8MTQpCS8qIFRoZSAib2xkIGRlZmF1bHQiIHJldHVybiBvbiBmYWlsdXJlICAqLworCisvKiBUcmFuc3BvcnQgc3BlY2lmaWMgbW9kaWZpY2F0aW9ucyB0byB0aGUgb3BlcmF0aW9uICovCisjZGVmaW5lCVVTRV9ER1JBTQkoMTw8MTYpIC8qIFVzZSBhIGRhdGFncmFtIHRyYW5zcG9ydAkJKi8KKyNkZWZpbmUJTk9fQVVUSElORk8JKDE8PDE3KSAvKiBEb24ndCBib3RoZXIgYXR0YWNoaW5nIGF1dGggaW5mbwkqLworCisvKgorICogRGVjbGFyYXRpb25zIGZvciAic3RhbmRhcmQiIE5JUysgdGFncworICogU3RhdGUgdmFyaWFibGUgdGFncyBoYXZlIHZhbHVlcwkwIC0gMjA0NworICogU3RhdGlzdGljIHRhZ3MgaGF2ZSB2YWx1ZXMJCTIwNDggLSA2NTUzNQorICogVXNlciBUYWdzIGhhdmUgdmFsdWVzCQk+Ml4xNgorICovCisjZGVmaW5lCVRBR19ERUJVRwkxCS8qIHNldCBkZWJ1ZyBsZXZlbAkJKi8KKyNkZWZpbmUJVEFHX1NUQVRTCTIJLyogRW5hYmxlL2Rpc2FibGUgc3RhdGlzdGljcwkqLworI2RlZmluZQlUQUdfR0NBQ0hFCTMJLyogRmx1c2ggdGhlIEdyb3VwIENhY2hlCSovCisjZGVmaW5lCVRBR19HQ0FDSEVfQUxMCVRBR19HQ0FDSEUKKyNkZWZpbmUJVEFHX0RDQUNIRQk0CS8qIEZsdXNoIHRoZSBkaXJlY3RvcnkgY2FjaGUJKi8KKyNkZWZpbmUJVEFHX0RDQUNIRV9PTkUJVEFHX0RDQUNIRQorI2RlZmluZQlUQUdfT0NBQ0hFCTUJLyogRmx1c2ggdGhlIE9iamVjdCBDYWNoZQkqLworI2RlZmluZQlUQUdfU0VDVVJFCTYJLyogU2V0IHRoZSBzZWN1cml0eSBsZXZlbAkqLworI2RlZmluZQlUQUdfVENBQ0hFX09ORQk3CS8qIEZsdXNoIHRoZSB0YWJsZSBjYWNoZQkqLworI2RlZmluZQlUQUdfRENBQ0hFX0FMTAk4CS8qIEZsdXNoIGVudGlyZSBkaXJlY3RvcnkgY2FjaGUJKi8KKyNkZWZpbmUJVEFHX1RDQUNIRV9BTEwJOQkvKiBGbHVzaCBlbnRpcmUgdGFibGUgY2FjaGUJKi8KKyNkZWZpbmUJVEFHX0dDQUNIRV9PTkUJMTAJLyogRmx1c2ggb25lIGdyb3VwIG9iamVjdAkqLworI2RlZmluZQlUQUdfRENBQ0hFX09ORV9SRUZSRVNIIDExIC8qIEZsdXNoIGFuZCByZWZyZXNoIG9uZSBETwkqLworI2RlZmluZQlUQUdfUkVBRE9OTFkJMTIJLyogU2V0IHJlYWQgb25seSBtb2RlCQkqLworI2RlZmluZQlUQUdfUkVBRFdSSVRFCTE0CS8qIFJlc2V0IHJlYWQtd3JpdGUgbW9kZQkqLworCisjZGVmaW5lCVRBR19PUFNUQVRTCTIwNDgJLyogTklTKyBvcGVyYXRpb25zIHN0YXRpc3RpY3MgICAqLworI2RlZmluZQlUQUdfVEhSRUFEUwkyMDQ5CS8qIENoaWxkIHByb2Nlc3MvdGhyZWFkIHN0YXR1cyAgKi8KKyNkZWZpbmUJVEFHX0hFQVAJMjA1MAkvKiBIZWFwIHVzYWdlIHN0YXRpc3RpY3MJKi8KKyNkZWZpbmUJVEFHX1VQREFURVMJMjA1MQkvKiBVcGRhdGVzIHRvIHRoaXMgc2VydmljZQkqLworI2RlZmluZQlUQUdfVklTSUJMRQkyMDUyCS8qIEZpcnN0IHVwZGF0ZSB0aGF0IGlzbid0IHJlcGxpY2F0ZWQgKi8KKyNkZWZpbmUJVEFHX1NfRENBQ0hFCTIwNTMJLyogRGlyZWN0b3J5IGNhY2hlIHN0YXRpc3RpY3MJKi8KKyNkZWZpbmUJVEFHX1NfT0NBQ0hFCTIwNTQJLyogT2JqZWN0IGNhY2hlIHN0YXRpc3RpY3MJKi8KKyNkZWZpbmUJVEFHX1NfR0NBQ0hFCTIwNTUJLyogR3JvdXAgY2FjaGUgc3RhdGlzdGljcwkqLworI2RlZmluZQlUQUdfU19TVE9SQUdFCTIwNTYJLyogR3JvdXAgY2FjaGUgc3RhdGlzdGljcwkqLworI2RlZmluZQlUQUdfVVBUSU1FCTIwNTcJLyogVGltZSB0aGF0IHNlcnZlciBoYXMgYmVlbiB1cCAqLworI2RlZmluZQlUQUdfRElSTElTVAkyMDU4CS8qIERpciBzZXJ2ZWQgYnkgdGhpcyBzZXJ2ZXIgICAgKi8KKyNkZWZpbmUJVEFHX05JU0NPTVBBVAkyMDU5CS8qIFdoZXRoZXIgc3VwcG9ydHMgTklTIGNvbXBhdCBtb2RlICovCisjZGVmaW5lCVRBR19ETlNGT1JXQVJESU5HIDIwNjAJLyogV2hldGhlciBETlMgZm9yd2FyZGluZyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUJVEFHX1NFQ1VSSVRZX0xFVkVMIDIwNjEJLyogU2VjdXJpdHkgbGV2ZWwgb2YgdGhlIHNlcnZlcgkqLworI2RlZmluZQlUQUdfUk9PVFNFUlZFUgkyMDYyCS8qIFdoZXRoZXIgcm9vdCBzZXJ2ZXIJCSovCisKKy8qCisgKiBEZWNsYXJhdGlvbnMgZm9yIHRoZSBHcm91cCBvYmplY3QgZmxhZ3MuIEN1cnJlbnRseQorICogdGhlcmUgYXJlIG9ubHkgMy4KKyAqLworI2RlZmluZQlJTVBNRU1fR1JPVVBTICAxCS8qIEltcGxpY2l0IE1lbWJlcnNoaXAgYWxsb3dlZAkqLworI2RlZmluZQlSRUNVUlNfR1JPVVBTICAyCS8qIFJlY3Vyc2l2ZSBHcm91cHMgYWxsb3dlZAkqLworI2RlZmluZQlORUdNRU1fR1JPVVBTICA0CS8qIE5lZ2F0aXZlIEdyb3VwcyBhbGxvd2VkCSovCisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgkvKiBfUlBDU1ZDX05JU19UQUdTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc2xpYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjYzJjNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc2xpYi5oCkBAIC0wLDAgKzEsMjg4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDYsIDIwMDcsIDIwMDkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBUaG9yc3RlbiBLdWt1ayA8a3VrdWtAc3VzZS5kZT4sIDE5OTcuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9fUlBDU1ZDX05JU0xJQl9IX18KKyNkZWZpbmUJX19SUENTVkNfTklTTElCX0hfXworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCit0eXBlZGVmIGNvbnN0IGNoYXIgKmNvbnN0X25pc19uYW1lOworCisvKiBuaXNfbmFtZXM6IFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBsb2NhdGUgYW5kIG1hbmlwdWxhdGUgYWxsIE5JUysKKyAqIG9iamVjdHMgZXhjZXB0IHRoZSBOSVMrIGVudHJ5IG9iamVjdHMuCisgKgorICogbmlzX2xvb2t1cCAobmFtZSwgZmxhZ3MpIHJlc29sdmVzIGEgTklTKyBuYW1lIGFuZCByZXR1cm5zIGEgY29weSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgb2JqZWN0ICBmcm9tIGEgTklTKyBzZXJ2ZXIuCisgKiAgICBjb25zdCBuaXNfbmFtZSBuYW1lOiBuYW1lIG9mIHRoZSBvYmplY3QgdG8gYmUgcmVzb2x2ZWQKKyAqICAgIHVuc2lnbmVkIGludCBmbGFnczogbG9naWNhbGx5IE9SaW5nIHplcm8gb3IgbW9yZSBmbGFncyAoRk9MTE9XX0xJTktTLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIEhBUkRfTE9PS1VQLCBbTk9fQ0FDSEVdLCBNQVNURVJfT05MWSwgRVhQQU5EX05BTUUpCisgKgorICogbmlzX2FkZCAobmFtZSwgb2JqKSBhZGRzIG9iamVjdHMgdG8gdGhlIE5JUysgbmFtZXNwYWNlLgorICogICAgY29uc3QgbmlzX25hbWUgbmFtZTogZnVsbHkgcXVhbGlmaWVkIE5JUysgbmFtZS4KKyAqICAgIGNvbnN0IG5pc19vYmplY3QgKm9iajogb2JqZWN0IG1lbWJlcnMgem9fbmFtZSBhbmQgem9fZG9tYWluIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0ZWQgZnJvbSBuYW1lLgorICoKKyAqIG5pc19yZW1vdmUgKG5hbWUsIG9iaikgcmVtb3ZlcyBvYmplY3RzIGZyb20gdGhlIE5JUysgbmFtZXNwYWNlLgorICogICAgY29uc3QgbmlzX25hbWUgbmFtZTogZnVsbHkgcXVhbGlmaWVkIE5JUysgbmFtZS4KKyAqICAgIGNvbnN0IG5pc19vYmplY3QgKm9iajogaWYgbm90IE5VTEwsIGl0IGlzIGFzc3VtZWQgdG8gcG9pbnQgdG8gYSBjb3B5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBvYmplY3QgYmVpbmcgcmVtb3ZlZC4gSW4gdGhpcyBjYXNlLCBpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb2JqZWN0IG9uIHRoZSBzZXJ2ZXIgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgaWRlbnRpZmllciBhcyB0aGUgIG9iamVjdCAgYmVpbmcgIHBhc3NlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgd2l0aCB0aGUgTklTX05PVFNBTUVPQkoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuCisgKgorICogbmlzX21vZGlmeSAobmFtZSwgb2JqKSBjYW4gY2hhbmdlIHNwZWNpZmljIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG5hbWVzcGFjZS4KKyAqLworZXh0ZXJuIG5pc19yZXN1bHQgKm5pc19sb29rdXAgKGNvbnN0X25pc19uYW1lIG5hbWUsIHVuc2lnbmVkIGludCBmbGFncykKKyAgICAgX19USFJPVzsKK2V4dGVybiBuaXNfcmVzdWx0ICpuaXNfYWRkIChjb25zdF9uaXNfbmFtZSBuYW1lLCBjb25zdCBuaXNfb2JqZWN0ICpvYmopCisgICAgIF9fVEhST1c7CitleHRlcm4gbmlzX3Jlc3VsdCAqbmlzX3JlbW92ZSAoY29uc3RfbmlzX25hbWUgbmFtZSwKKwkJCSAgICAgICBjb25zdCBuaXNfb2JqZWN0ICpvYmopIF9fVEhST1c7CitleHRlcm4gbmlzX3Jlc3VsdCAqbmlzX21vZGlmeSAoY29uc3RfbmlzX25hbWUgbmFtZSwKKwkJCSAgICAgICBjb25zdCBuaXNfb2JqZWN0ICpvYmopIF9fVEhST1c7CisKKy8qIG5pc190YWJsZXM6IFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBzZWFyY2ggYW5kIG1vZGlmeSBOSVMrIHRhYmxlcy4KKyAqCisgKiBuaXNfbGlzdCAodGFibGVfbmFtZSwgZmxhZ3MsIGNhbGxiYWNrKHRhYmxlX25hbWUsIG9iaiwgdXNlcmRhdGEpLCB1c2VyZGF0YSkKKyAqICAgICAgICAgICBzZWFyY2ggYSB0YWJsZSBpbiB0aGUgTklTKyBuYW1lc3BhY2UuCisgKiAgICBjb25zdCBuaXNfbmFtZSB0YWJsZV9uYW1lOiBpbmRleGVkIG5hbWUgKFt4eD15eV0sdGFibGUuZGlyKQorICogICAgdW5zaWduZWQgaW50IGZsYWdzOiBsb2dpY2FsbHkgT1Jpbmcgb25lIG9yIG1vcmUgZmxhZ3MgKEZPTExPV19MSU5LUywKKyAqICAgICAgICAgICAgICAgICAgICAgIFtGT0xMT1dfUEFUSF0sIEhBUkRfTE9PS1VQLCBbQUxMX1JFU1VMVFNdLCBbTk9fQ0FDSEVdLAorICogICAgICAgICAgICAgICAgICAgICAgTUFTVEVSX09OTFksIEVYUEFORF9OQU1FLCBSRVRVUk5fUkVTVUxUKQorICogICAgY2FsbGJhY2soKTogY2FsbGJhY2sgaXMgYW4gb3B0aW9uYWwgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgd2lsbAorICogICAgICAgICAgICAgICAgcHJvY2VzcyB0aGUgRU5UUlkgdHlwZSBvYmplY3RzIHRoYXQgYXJlIHJldHVybmVkIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgICBzZWFyY2guIElmIHRoaXMgcG9pbnRlciBpcyBOVUxMLCB0aGVuIGFsbCBlbnRyaWVzIHRoYXQgbWF0Y2gKKyAqICAgICAgICAgICAgICAgIHRoZSBzZWFyY2ggY3JpdGVyaWEgYXJlIHJldHVybmVkIGluIHRoZSBuaXNfcmVzdWx0IHN0cnVjdHVyZSwKKyAqICAgICAgICAgICAgICAgIG90aGVyd2lzZSAgdGhpcyAgZnVuY3Rpb24gIHdpbGwgIGJlICBjYWxsZWQgb25jZSBmb3IgZWFjaAorICogICAgICAgICAgICAgICAgZW50cnkgcmV0dXJuZWQuCisgKiAgICB2b2lkICp1c2VyZGF0YTogcGFzc2VkIHRvIGNhbGxiYWNrIGZ1bmN0aW9uIGFsb25nIHdpdGggdGhlIHJldHVybmVkCisgKiAgICAgICAgICAgICAgICAgICAgZW50cnkgb2JqZWN0LgorICoKKyAqIG5pc19hZGRfZW50cnkgKHRhYmxlX25hbWUsIG9iaiwgZmxhZ3MpIHdpbGwgYWRkIHRoZSBOSVMrIG9iamVjdCB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JUysgdGFibGVfbmFtZS4KKyAqICAgIGNvbnN0IG5pc19uYW1lIHRhYmxlX25hbWUKKyAqICAgIGNvbnN0IG5pc19vYmplY3QgKm9iagorICogICAgdW5zaWduZWQgaW50IGZsYWdzOiAwLCBBRERfT1ZFUldSSVRFLCBSRVRVUk5fUkVTVUxUCisgKgorICogbmlzX21vZGlmeV9lbnRyeSAobmFtZSwgb2JqLCBmbGFncykgbW9kaWZpZXMgYW4gb2JqZWN0IGlkZW50aWZpZWQgYnkgbmFtZS4KKyAqICAgIGNvbnN0IG5pc19uYW1lIG5hbWU6IG9iamVjdCBpZGVudGlmaWVyCisgKiAgICBjb25zdCBuaXNfb2JqZWN0ICpvYmo6IHNob3VsZCBwb2ludCB0byBhbiBlbnRyeSB3aXRoIHRoZSBFTl9NT0RJRklFRAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnIHNldCBpbiBlYWNoIGNvbHVtbiB0aGF0IGNvbnRhaW5zIG5ldworICogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbi4KKyAqICAgIHVuc2lnbmVkIGludCBmbGFnczogMCwgTU9EX1NBTUVPQkosIFJFVFVSTl9SRVNVTFQKKyAqCisgKiBuaXNfcmVtb3ZlX2VudHJ5ICh0YWJsZV9uYW1lLCBvYmosIGZsYWdzKSByZW1vdmVzIGEgc2V0IG9mIGVudHJpZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllZCBieSB0YWJsZV9uYW1lIGZyb20gdGhlIHRhYmxlLgorICogICAgY29uc3QgbmlzX25hbWUgdGFibGVfbmFtZTogaW5kZXhlZCBOSVMrIG5hbWUKKyAqICAgIGNvbnN0IG5pc19vYmplY3QgKm9iajogaWYgb2JqIGlzIG5vbi1udWxsLCBpdCBpcyBwcmVzdW1lZCB0byBwb2ludCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICBhIGNhY2hlZCBjb3B5IG9mIHRoZSBlbnRyeS4gV2hlbiB0aGUgcmVtb3ZhbCBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0ZWQsIGFuZCB0aGUgb2JqZWN0IHRoYXQgd291bGQgYmUgcmVtb3ZlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGNhY2hlZCBvYmplY3QgcG9pbnRlZCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICBieSBvYmplY3QgdGhlbiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCB3aXRoIGFuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JU19OT1RTQU1FT0JKIGVycm9yCisgKiAgICB1bnNpZ25lZCBpbnQgZmxhZ3M6IDAsIFJFTV9NVUxUSVBMRQorICoKKyAqIG5pc19maXJzdF9lbnRyeSAodGFibGVfbmFtZSkgZmV0Y2hlcyBlbnRyaWVzIGZyb20gYSB0YWJsZSBvbmUgYXQgYSB0aW1lLgorICogICAgY29uc3QgbmlzX25hbWUgdGFibGVfbmFtZQorICoKKyAqIG5pc19uZXh0X2VudHJ5ICh0YWJsZV9uYW1lLCBjb29raWUpIHJldHJpZXZlcyB0aGUgIm5leHQiIGVudHJ5IGZyb20gYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgc3BlY2lmaWVkIGJ5IHRhYmxlX25hbWUuCisgKiAgICBjb25zdCBuaXNfbmFtZSB0YWJsZV9uYW1lOgorICogICAgY29uc3QgbmV0b2JqICpjb29raWU6IFRoZSB2YWx1ZSBvZiBjb29raWUgZnJvbSB0aGUgbmlzX3Jlc3VsdCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtIHRoZSBwcmV2aW91cyBjYWxsLgorICovCitleHRlcm4gbmlzX3Jlc3VsdCAqbmlzX2xpc3QgKGNvbnN0X25pc19uYW1lIF9fbmFtZSwgdW5zaWduZWQgaW50IF9fZmxhZ3MsCisJCQkgICAgIGludCAoKl9fY2FsbGJhY2spKGNvbnN0X25pc19uYW1lIF9fdGFibGVfbmFtZSwKKwkJCQkJICAgICAgIGNvbnN0IG5pc19vYmplY3QgKl9fb2JqLAorCQkJCQkgICAgICAgY29uc3Qgdm9pZCAqX191c2VyZGF0YSksCisJCQkgICAgIGNvbnN0IHZvaWQgKl9fdXNlcmRhdGEpIF9fVEhST1c7CitleHRlcm4gbmlzX3Jlc3VsdCAqbmlzX2FkZF9lbnRyeSAoY29uc3RfbmlzX25hbWUgX190YWJsZV9uYW1lLAorCQkJCSAgY29uc3QgbmlzX29iamVjdCAqX19vYmosCisJCQkJICB1bnNpZ25lZCBpbnQgX19mbGFncykgX19USFJPVzsKK2V4dGVybiBuaXNfcmVzdWx0ICpuaXNfbW9kaWZ5X2VudHJ5IChjb25zdF9uaXNfbmFtZSBfX25hbWUsCisJCQkJICAgICBjb25zdCBuaXNfb2JqZWN0ICpfX29iaiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBfX2ZsYWdzKSBfX1RIUk9XOworZXh0ZXJuIG5pc19yZXN1bHQgKm5pc19yZW1vdmVfZW50cnkgKGNvbnN0X25pc19uYW1lIF9fdGFibGVfbmFtZSwKKwkJCQkgICAgIGNvbnN0IG5pc19vYmplY3QgKl9fb2JqLAorCQkJCSAgICAgdW5zaWduZWQgaW50IF9fZmxhZ3MpIF9fVEhST1c7CitleHRlcm4gbmlzX3Jlc3VsdCAqbmlzX2ZpcnN0X2VudHJ5IChjb25zdF9uaXNfbmFtZSBfX3RhYmxlX25hbWUpIF9fVEhST1c7CitleHRlcm4gbmlzX3Jlc3VsdCAqbmlzX25leHRfZW50cnkgKGNvbnN0X25pc19uYW1lIF9fdGFibGVfbmFtZSwKKwkJCQkgICBjb25zdCBuZXRvYmogKl9fY29va2llKSBfX1RIUk9XOworLyoKKyoqIG5pc19zZXJ2ZXIKKyovCitleHRlcm4gbmlzX2Vycm9yIG5pc19ta2RpciAoY29uc3RfbmlzX25hbWUgX19kaXJuYW1lLAorCQkJICAgIGNvbnN0IG5pc19zZXJ2ZXIgKl9fbWFjaGluZSkgX19USFJPVzsKK2V4dGVybiBuaXNfZXJyb3IgbmlzX3JtZGlyIChjb25zdF9uaXNfbmFtZSBfX2Rpcm5hbWUsCisJCQkgICAgY29uc3QgbmlzX3NlcnZlciAqX19tYWNoaW5lKSBfX1RIUk9XOworZXh0ZXJuIG5pc19lcnJvciBuaXNfc2VydnN0YXRlIChjb25zdCBuaXNfc2VydmVyICpfX21hY2hpbmUsCisJCQkJY29uc3QgbmlzX3RhZyAqX190YWdzLCBpbnQgX19udW10YWdzLAorCQkJCW5pc190YWcgKipfX3Jlc3VsdCkgX19USFJPVzsKK2V4dGVybiBuaXNfZXJyb3IgbmlzX3N0YXRzIChjb25zdCBuaXNfc2VydmVyICpfX21hY2hpbmUsCisJCQkgICAgY29uc3QgbmlzX3RhZyAqX190YWdzLCBpbnQgX19udW10YWdzLAorCQkJICAgIG5pc190YWcgKipfX3Jlc3VsdCkgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19mcmVldGFncyAobmlzX3RhZyAqX190YWdzLCBpbnQgX19udW10YWdzKSBfX1RIUk9XOworZXh0ZXJuIG5pc19zZXJ2ZXIgKipuaXNfZ2V0c2Vydmxpc3QgKGNvbnN0X25pc19uYW1lIF9fZGlybmFtZSkgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19mcmVlc2Vydmxpc3QgKG5pc19zZXJ2ZXIgKipfX21hY2hpbmVzKSBfX1RIUk9XOworCisvKgorKiogbmlzX3N1YnIKKyovCitleHRlcm4gbmlzX25hbWUgbmlzX2xlYWZfb2YgKGNvbnN0X25pc19uYW1lIF9fbmFtZSkgX19USFJPVzsKK2V4dGVybiBuaXNfbmFtZSBuaXNfbGVhZl9vZl9yIChjb25zdF9uaXNfbmFtZSBfX25hbWUsIGNoYXIgKl9fYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBfX2J1ZmxlbikgX19USFJPVzsKK2V4dGVybiBuaXNfbmFtZSBuaXNfbmFtZV9vZiAoY29uc3RfbmlzX25hbWUgX19uYW1lKSBfX1RIUk9XOworZXh0ZXJuIG5pc19uYW1lIG5pc19uYW1lX29mX3IgKGNvbnN0X25pc19uYW1lIF9fbmFtZSwgY2hhciAqX19idWZmZXIsCisJCQkgICAgICAgc2l6ZV90IF9fYnVmbGVuKSBfX1RIUk9XOworZXh0ZXJuIG5pc19uYW1lIG5pc19kb21haW5fb2YgKGNvbnN0X25pc19uYW1lIF9fbmFtZSkgX19USFJPVzsKK2V4dGVybiBuaXNfbmFtZSBuaXNfZG9tYWluX29mX3IgKGNvbnN0X25pc19uYW1lIF9fbmFtZSwgY2hhciAqX19idWZmZXIsCisJCQkJIHNpemVfdCBfX2J1ZmxlbikgX19USFJPVzsKK2V4dGVybiBuaXNfbmFtZSAqbmlzX2dldG5hbWVzIChjb25zdF9uaXNfbmFtZSBfX25hbWUpIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfZnJlZW5hbWVzIChuaXNfbmFtZSAqX19uYW1lbGlzdCkgX19USFJPVzsKK2V4dGVybiBuYW1lX3BvcyBuaXNfZGlyX2NtcCAoY29uc3RfbmlzX25hbWUgX19uMSwgY29uc3RfbmlzX25hbWUgX19uMikgX19USFJPVzsKK2V4dGVybiBuaXNfb2JqZWN0ICpuaXNfY2xvbmVfb2JqZWN0IChjb25zdCBuaXNfb2JqZWN0ICpfX3NyYywKKwkJCQkgICAgIG5pc19vYmplY3QgKl9fZGVzdCkgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19kZXN0cm95X29iamVjdCAobmlzX29iamVjdCAqX19vYmopIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfcHJpbnRfb2JqZWN0IChjb25zdCBuaXNfb2JqZWN0ICpfX29iaikgX19USFJPVzsKKworLyoKKyoqIG5pc19sb2NhbF9uYW1lcworKi8KK2V4dGVybiBuaXNfbmFtZSBuaXNfbG9jYWxfZ3JvdXAgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gbmlzX25hbWUgbmlzX2xvY2FsX2RpcmVjdG9yeSAodm9pZCkgX19USFJPVzsKK2V4dGVybiBuaXNfbmFtZSBuaXNfbG9jYWxfcHJpbmNpcGFsICh2b2lkKSBfX1RIUk9XOworZXh0ZXJuIG5pc19uYW1lIG5pc19sb2NhbF9ob3N0ICh2b2lkKSBfX1RIUk9XOworCisvKgorKiogbmlzX2Vycm9yCisqLworZXh0ZXJuIGNvbnN0IGNoYXIgKm5pc19zcGVycm5vIChjb25zdCBuaXNfZXJyb3IgX19zdGF0dXMpIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfcGVycm9yIChjb25zdCBuaXNfZXJyb3IgX19zdGF0dXMsIGNvbnN0IGNoYXIgKl9fbGFiZWwpIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfbGVycm9yIChjb25zdCBuaXNfZXJyb3IgX19zdGF0dXMsIGNvbnN0IGNoYXIgKl9fbGFiZWwpIF9fVEhST1c7CitleHRlcm4gY2hhciAqbmlzX3NwZXJyb3IgKGNvbnN0IG5pc19lcnJvciBzdGF0dXMsIGNvbnN0IGNoYXIgKl9fbGFiZWwpIF9fVEhST1c7CitleHRlcm4gY2hhciAqbmlzX3NwZXJyb3JfciAoY29uc3QgbmlzX2Vycm9yIF9fc3RhdHVzLCBjb25zdCBjaGFyICpfX2xhYmVsLAorCQkJICAgIGNoYXIgKl9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4pIF9fVEhST1c7CisvKgorKiogbmlzX2dyb3VwcworKi8KK2V4dGVybiBib29sX3QgbmlzX2lzbWVtYmVyIChjb25zdF9uaXNfbmFtZSBfX3ByaW5jaXBhbCwKKwkJCSAgICBjb25zdF9uaXNfbmFtZSBfX2dyb3VwKSBfX1RIUk9XOworZXh0ZXJuIG5pc19lcnJvciBuaXNfYWRkbWVtYmVyIChjb25zdF9uaXNfbmFtZSBfX21lbWJlciwKKwkJCQljb25zdF9uaXNfbmFtZSBfX2dyb3VwKSBfX1RIUk9XOworZXh0ZXJuIG5pc19lcnJvciBuaXNfcmVtb3ZlbWVtYmVyIChjb25zdF9uaXNfbmFtZSBfX21lbWJlciwKKwkJCQkgICBjb25zdF9uaXNfbmFtZSBfX2dyb3VwKSBfX1RIUk9XOworZXh0ZXJuIG5pc19lcnJvciBuaXNfY3JlYXRlZ3JvdXAgKGNvbnN0X25pc19uYW1lIF9fZ3JvdXAsCisJCQkJICB1bnNpZ25lZCBpbnQgX19mbGFncykgX19USFJPVzsKK2V4dGVybiBuaXNfZXJyb3IgbmlzX2Rlc3Ryb3lncm91cCAoY29uc3RfbmlzX25hbWUgX19ncm91cCkgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19wcmludF9ncm91cF9lbnRyeSAoY29uc3RfbmlzX25hbWUgX19ncm91cCkgX19USFJPVzsKK2V4dGVybiBuaXNfZXJyb3IgbmlzX3ZlcmlmeWdyb3VwIChjb25zdF9uaXNfbmFtZSBfX2dyb3VwKSBfX1RIUk9XOworCisvKgorKiogbmlzX3BpbmcKKyovCitleHRlcm4gdm9pZCBuaXNfcGluZyAoY29uc3RfbmlzX25hbWUgX19kaXJuYW1lLCB1aW50MzJfdCBfX3V0aW1lLAorCQkgICAgICBjb25zdCBuaXNfb2JqZWN0ICpfX2Rpcm9iaikgX19USFJPVzsKK2V4dGVybiBuaXNfcmVzdWx0ICpuaXNfY2hlY2twb2ludCAoY29uc3RfbmlzX25hbWUgX19kaXJuYW1lKSBfX1RIUk9XOworCisvKgorKiogbmlzX3ByaW50IChYWFggSU5URVJOQUwgRlVOQ1RJT05TLCBTSE9VTEQgTk9UIEJFIFVTRUQgISEpCisqLworZXh0ZXJuIHZvaWQgbmlzX3ByaW50X3Jlc3VsdCAoY29uc3QgbmlzX3Jlc3VsdCAqX19yZXN1bHQpIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfcHJpbnRfcmlnaHRzICh1bnNpZ25lZCBpbnQgX19yaWdodHMpIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfcHJpbnRfZGlyZWN0b3J5IChjb25zdCBkaXJlY3Rvcnlfb2JqICpfX2Rpcm9iaikgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19wcmludF9ncm91cCAoY29uc3QgZ3JvdXBfb2JqICpfX2dycG9iaikgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19wcmludF90YWJsZSAoY29uc3QgdGFibGVfb2JqICpfX3RibG9iaikgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19wcmludF9saW5rIChjb25zdCBsaW5rX29iaiAqX19sbmtvYmopIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfcHJpbnRfZW50cnkgKGNvbnN0IGVudHJ5X29iaiAqX19lbm9iaikgX19USFJPVzsKKworLyoKKyoqIG5pc19maWxlIChYWFggSU5URVJOQUwgRlVOQ1RJT05TLCBTSE9VTEQgTk9UIEJFIFVTRUQgISEpCisqLworZXh0ZXJuIGRpcmVjdG9yeV9vYmogKnJlYWRDb2xkU3RhcnRGaWxlICh2b2lkKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB3cml0ZUNvbGRTdGFydEZpbGUgKGNvbnN0IGRpcmVjdG9yeV9vYmogKl9fZGlyb2JqKSBfX1RIUk9XOworZXh0ZXJuIG5pc19vYmplY3QgKm5pc19yZWFkX29iaiAoY29uc3QgY2hhciAqX19vYmopIF9fVEhST1c7CitleHRlcm4gYm9vbF90IG5pc193cml0ZV9vYmogKGNvbnN0IGNoYXIgKl9fZmlsZSwgY29uc3QgbmlzX29iamVjdCAqX19vYmopIF9fVEhST1c7CisKKy8qCisqKiBuaXNfY2xvbmUgLSAoWFhYIElOVEVSTkFMIEZVTkNUSU9OUywgU0hPVUxEIE5PVCBCRSBVU0VEICEhKQorKi8KK2V4dGVybiBkaXJlY3Rvcnlfb2JqICpuaXNfY2xvbmVfZGlyZWN0b3J5IChjb25zdCBkaXJlY3Rvcnlfb2JqICpfX3NyYywKKwkJCQkJICAgZGlyZWN0b3J5X29iaiAqX19kZXN0KSBfX1RIUk9XOworZXh0ZXJuIG5pc19yZXN1bHQgKm5pc19jbG9uZV9yZXN1bHQgKGNvbnN0IG5pc19yZXN1bHQgKl9fc3JjLAorCQkJCSAgICAgbmlzX3Jlc3VsdCAqX19kZXN0KSBfX1RIUk9XOworCisvKiBuaXNfZnJlZSAtIG5pc19mcmVlcmVzdWx0ICovCitleHRlcm4gdm9pZCBuaXNfZnJlZXJlc3VsdCAobmlzX3Jlc3VsdCAqX19yZXN1bHQpIF9fVEhST1c7CisvKiAoWFhYIFRIRSBGT0xMT1dJTkcgQVJFIElOVEVSTkFMIEZVTkNUSU9OUywgU0hPVUxEIE5PVCBCRSBVU0VEICEhKSAqLworZXh0ZXJuIHZvaWQgbmlzX2ZyZWVfcmVxdWVzdCAoaWJfcmVxdWVzdCAqX19yZXEpIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfZnJlZV9kaXJlY3RvcnkgKGRpcmVjdG9yeV9vYmogKl9fZGlyb2JqKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX2ZyZWVfb2JqZWN0IChuaXNfb2JqZWN0ICpfX29iaikgX19USFJPVzsKKworLyogKFhYWCBJTlRFUk5BTCBGVU5DVElPTlMsIFNIT1VMRCBOT1QgQkUgVVNFRCAhISkgKi8KK2V4dGVybiBuaXNfbmFtZSBfX25pc19kZWZhdWx0X293bmVyIChjaGFyICopIF9fVEhST1c7CitleHRlcm4gbmlzX25hbWUgX19uaXNfZGVmYXVsdF9ncm91cCAoY2hhciAqKSBfX1RIUk9XOworZXh0ZXJuIHVpbnQzMl90IF9fbmlzX2RlZmF1bHRfdHRsIChjaGFyICopIF9fVEhST1c7CitleHRlcm4gdW5zaWduZWQgaW50IF9fbmlzX2RlZmF1bHRfYWNjZXNzIChjaGFyICosIHVuc2lnbmVkIGludCkgX19USFJPVzsKK2V4dGVybiBmZF9yZXN1bHQgKl9fbmlzX2ZpbmRkaXJlY3RvcnkgKGRpcmVjdG9yeV9vYmogKiwgY29uc3RfbmlzX25hbWUpIF9fVEhST1c7CitleHRlcm4gdm9pZCBfX2ZyZWVfZmRyZXN1bHQgKGZkX3Jlc3VsdCAqKSBfX1RIUk9XOworZXh0ZXJuIHVpbnQzMl90IF9fbmlzX2hhc2ggKGNvbnN0IHZvaWQgKl9fa2V5YXJnLCBzaXplX3QgX19sZW4pIF9fVEhST1c7CisKKy8qIE5JUysgY2FjaGUgbG9ja2luZyAqLworZXh0ZXJuIGludCBfX25pc19sb2NrX2NhY2hlICh2b2lkKSBfX1RIUk9XOworZXh0ZXJuIGludCBfX25pc191bmxvY2tfY2FjaGUgKHZvaWQpIF9fVEhST1c7CisKKy8qIChYWFggSU5URVJOQUwgRlVOQ1RJT05TLCBPTkxZIEZPUiBycGMubmlzZCBBTkQgZ2xpYmMgISEpICovCisjaWYgZGVmaW5lZCAoTklTX0lOVEVSTkFMKSB8fCBkZWZpbmVkIChfTElCQykKKworc3RydWN0IGRpcl9iaW5kaW5nCit7CisgIENMSUVOVCAqY2xudDsgICAgICAgICAgICAgICAgICAvKiBSUEMgQ0xJRU5UIGhhbmRsZSAqLworICBuaXNfc2VydmVyICpzZXJ2ZXJfdmFsOyAgICAgICAgLyogTGlzdCBvZiBzZXJ2ZXJzICovCisgIHVuc2lnbmVkIGludCBzZXJ2ZXJfbGVuOyAgICAgICAvKiAjIG9mIHNlcnZlcnMgKi8KKyAgdW5zaWduZWQgaW50IHNlcnZlcl91c2VkOyAgICAgIC8qIFdoaWNoIHNlcnZlciB3ZSBhcmUgYmluZCBpbiB0aGUgbW9tZW50ID8gKi8KKyAgdW5zaWduZWQgaW50IGN1cnJlbnRfZXA7ICAgICAgIC8qIFdoaWNoIGVuZHBvaW50IG9mIHRoZSBzZXJ2ZXIgYXJlIGluIHVzZT8gKi8KKyAgdW5zaWduZWQgaW50IHRyeXM7ICAgICAgICAgICAgIC8qIEhvdyBtYW55IHNlcnZlciBoYXZlIHdlIHRyaWVkID8gKi8KKyAgdW5zaWduZWQgaW50IGNsYXNzOyAgICAgICAgICAgIC8qIEZyb20gd2hpY2ggY2xhc3MgaXMgc2VydmVyX3ZhbCA/ICovCisgIGJvb2xfdCBtYXN0ZXJfb25seTsgICAgICAgICAgICAvKiBJcyBvbmx5IGJpbmRlZCB0byB0aGUgbWFzdGVyICovCisgIGJvb2xfdCB1c2VfYXV0aDsgICAgICAgICAgICAgICAvKiBEbyB3ZSB1c2UgQVVUSCA/ICovCisgIGJvb2xfdCB1c2VfdWRwOyAgICAgICAgICAgICAgICAvKiBEbyB3ZSB1c2UgVURQID8gKi8KKyAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7ICAgICAgIC8qIFNlcnZlcidzIElQIGFkZHJlc3MgKi8KKyAgaW50IHNvY2tldDsgICAgICAgICAgICAgICAgICAgIC8qIFNlcnZlcidzIGxvY2FsIHNvY2tldCAqLworfTsKK3R5cGVkZWYgc3RydWN0IGRpcl9iaW5kaW5nIGRpcl9iaW5kaW5nOworCitleHRlcm4gbmlzX2Vycm9yIF9fbmlzYmluZF9jcmVhdGUgKGRpcl9iaW5kaW5nICosIGNvbnN0IG5pc19zZXJ2ZXIgKiwKKwkJCQkgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAorCQkJCSAgIHVuc2lnbmVkIGludCkgX19USFJPVzsKK2V4dGVybiBuaXNfZXJyb3IgX19uaXNiaW5kX2Nvbm5lY3QgKGRpcl9iaW5kaW5nICopIF9fVEhST1c7CitleHRlcm4gbmlzX2Vycm9yIF9fbmlzYmluZF9uZXh0IChkaXJfYmluZGluZyAqKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgX19uaXNiaW5kX2Rlc3Ryb3kgKGRpcl9iaW5kaW5nICopIF9fVEhST1c7CitleHRlcm4gbmlzX2Vycm9yIF9fbmlzZmluZF9zZXJ2ZXIgKGNvbnN0X25pc19uYW1lLCBpbnQsIGRpcmVjdG9yeV9vYmogKiosCisJCQkJICAgZGlyX2JpbmRpbmcgKiwgdW5zaWduZWQgaW50KSBfX1RIUk9XOworCisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIF9fUlBDU1ZDX05JU0xJQl9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25sbV9wcm90LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ubG1fcHJvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MjBhNmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ubG1fcHJvdC5oCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KKyAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgorICovCisKKyNpZm5kZWYgX05MTV9QUk9UX0hfUlBDR0VOCisjZGVmaW5lIF9OTE1fUFJPVF9IX1JQQ0dFTgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBMTV9NQVhTVFJMRU4gMTAyNAorI2RlZmluZSBNQVhOQU1FTEVOIExNX01BWFNUUkxFTisxCisKK2VudW0gbmxtX3N0YXRzIHsKKwlubG1fZ3JhbnRlZCA9IDAsCisJbmxtX2RlbmllZCA9IDEsCisJbmxtX2RlbmllZF9ub2xvY2tzID0gMiwKKwlubG1fYmxvY2tlZCA9IDMsCisJbmxtX2RlbmllZF9ncmFjZV9wZXJpb2QgPSA0LAorfTsKK3R5cGVkZWYgZW51bSBubG1fc3RhdHMgbmxtX3N0YXRzOworCitzdHJ1Y3QgbmxtX2hvbGRlciB7CisJYm9vbF90IGV4Y2x1c2l2ZTsKKwlpbnQgc3ZpZDsKKwluZXRvYmogb2g7CisJdV9pbnQgbF9vZmZzZXQ7CisJdV9pbnQgbF9sZW47Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX2hvbGRlciBubG1faG9sZGVyOworCitzdHJ1Y3QgbmxtX3Rlc3RycGx5IHsKKwlubG1fc3RhdHMgc3RhdDsKKwl1bmlvbiB7CisJCXN0cnVjdCBubG1faG9sZGVyIGhvbGRlcjsKKwl9IG5sbV90ZXN0cnBseV91OworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV90ZXN0cnBseSBubG1fdGVzdHJwbHk7CisKK3N0cnVjdCBubG1fc3RhdCB7CisJbmxtX3N0YXRzIHN0YXQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX3N0YXQgbmxtX3N0YXQ7CisKK3N0cnVjdCBubG1fcmVzIHsKKwluZXRvYmogY29va2llOworCW5sbV9zdGF0IHN0YXQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX3JlcyBubG1fcmVzOworCitzdHJ1Y3QgbmxtX3Rlc3RyZXMgeworCW5ldG9iaiBjb29raWU7CisJbmxtX3Rlc3RycGx5IHN0YXQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX3Rlc3RyZXMgbmxtX3Rlc3RyZXM7CisKK3N0cnVjdCBubG1fbG9jayB7CisJY2hhciAqY2FsbGVyX25hbWU7CisJbmV0b2JqIGZoOworCW5ldG9iaiBvaDsKKwlpbnQgc3ZpZDsKKwl1X2ludCBsX29mZnNldDsKKwl1X2ludCBsX2xlbjsKK307Cit0eXBlZGVmIHN0cnVjdCBubG1fbG9jayBubG1fbG9jazsKKworc3RydWN0IG5sbV9sb2NrYXJncyB7CisJbmV0b2JqIGNvb2tpZTsKKwlib29sX3QgYmxvY2s7CisJYm9vbF90IGV4Y2x1c2l2ZTsKKwlzdHJ1Y3QgbmxtX2xvY2sgYWxvY2s7CisJYm9vbF90IHJlY2xhaW07CisJaW50IHN0YXRlOworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV9sb2NrYXJncyBubG1fbG9ja2FyZ3M7CisKK3N0cnVjdCBubG1fY2FuY2FyZ3MgeworCW5ldG9iaiBjb29raWU7CisJYm9vbF90IGJsb2NrOworCWJvb2xfdCBleGNsdXNpdmU7CisJc3RydWN0IG5sbV9sb2NrIGFsb2NrOworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV9jYW5jYXJncyBubG1fY2FuY2FyZ3M7CisKK3N0cnVjdCBubG1fdGVzdGFyZ3MgeworCW5ldG9iaiBjb29raWU7CisJYm9vbF90IGV4Y2x1c2l2ZTsKKwlzdHJ1Y3QgbmxtX2xvY2sgYWxvY2s7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX3Rlc3RhcmdzIG5sbV90ZXN0YXJnczsKKworc3RydWN0IG5sbV91bmxvY2thcmdzIHsKKwluZXRvYmogY29va2llOworCXN0cnVjdCBubG1fbG9jayBhbG9jazsKK307Cit0eXBlZGVmIHN0cnVjdCBubG1fdW5sb2NrYXJncyBubG1fdW5sb2NrYXJnczsKKy8qCisgKiBUaGUgZm9sbG93aW5nIGVudW1zIGFyZSBhY3R1YWxseSBiaXQgZW5jb2RlZCBmb3IgZWZmaWNpZW50CisgKiBib29sZWFuIGFsZ2VicmEuLi4uIERPTidUIGNoYW5nZSB0aGVtLi4uLi4KKyAqLworCitlbnVtIGZzaF9tb2RlIHsKKwlmc21fRE4gPSAwLAorCWZzbV9EUiA9IDEsCisJZnNtX0RXID0gMiwKKwlmc21fRFJXID0gMywKK307Cit0eXBlZGVmIGVudW0gZnNoX21vZGUgZnNoX21vZGU7CisKK2VudW0gZnNoX2FjY2VzcyB7CisJZnNhX05PTkUgPSAwLAorCWZzYV9SID0gMSwKKwlmc2FfVyA9IDIsCisJZnNhX1JXID0gMywKK307Cit0eXBlZGVmIGVudW0gZnNoX2FjY2VzcyBmc2hfYWNjZXNzOworCitzdHJ1Y3QgbmxtX3NoYXJlIHsKKwljaGFyICpjYWxsZXJfbmFtZTsKKwluZXRvYmogZmg7CisJbmV0b2JqIG9oOworCWZzaF9tb2RlIG1vZGU7CisJZnNoX2FjY2VzcyBhY2Nlc3M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX3NoYXJlIG5sbV9zaGFyZTsKKworc3RydWN0IG5sbV9zaGFyZWFyZ3MgeworCW5ldG9iaiBjb29raWU7CisJbmxtX3NoYXJlIHNoYXJlOworCWJvb2xfdCByZWNsYWltOworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV9zaGFyZWFyZ3MgbmxtX3NoYXJlYXJnczsKKworc3RydWN0IG5sbV9zaGFyZXJlcyB7CisJbmV0b2JqIGNvb2tpZTsKKwlubG1fc3RhdHMgc3RhdDsKKwlpbnQgc2VxdWVuY2U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX3NoYXJlcmVzIG5sbV9zaGFyZXJlczsKKworc3RydWN0IG5sbV9ub3RpZnkgeworCWNoYXIgKm5hbWU7CisJbG9uZyBzdGF0ZTsKK307Cit0eXBlZGVmIHN0cnVjdCBubG1fbm90aWZ5IG5sbV9ub3RpZnk7CisKKyNkZWZpbmUgTkxNX1BST0cgMTAwMDIxCisjZGVmaW5lIE5MTV9WRVJTIDEKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIE5MTV9URVNUIDEKK2V4dGVybiAgbmxtX3Rlc3RyZXMgKiBubG1fdGVzdF8xKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBubG1fdGVzdHJlcyAqIG5sbV90ZXN0XzFfc3ZjKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9MT0NLIDIKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9sb2NrXzEoc3RydWN0IG5sbV9sb2NrYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIG5sbV9yZXMgKiBubG1fbG9ja18xX3N2YyhzdHJ1Y3QgbmxtX2xvY2thcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fQ0FOQ0VMIDMKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9jYW5jZWxfMShzdHJ1Y3QgbmxtX2NhbmNhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9jYW5jZWxfMV9zdmMoc3RydWN0IG5sbV9jYW5jYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX1VOTE9DSyA0CitleHRlcm4gIG5sbV9yZXMgKiBubG1fdW5sb2NrXzEoc3RydWN0IG5sbV91bmxvY2thcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV91bmxvY2tfMV9zdmMoc3RydWN0IG5sbV91bmxvY2thcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fR1JBTlRFRCA1CitleHRlcm4gIG5sbV9yZXMgKiBubG1fZ3JhbnRlZF8xKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBubG1fcmVzICogbmxtX2dyYW50ZWRfMV9zdmMoc3RydWN0IG5sbV90ZXN0YXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX1RFU1RfTVNHIDYKK2V4dGVybiAgdm9pZCAqIG5sbV90ZXN0X21zZ18xKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX3Rlc3RfbXNnXzFfc3ZjKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9MT0NLX01TRyA3CitleHRlcm4gIHZvaWQgKiBubG1fbG9ja19tc2dfMShzdHJ1Y3QgbmxtX2xvY2thcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9sb2NrX21zZ18xX3N2YyhzdHJ1Y3QgbmxtX2xvY2thcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fQ0FOQ0VMX01TRyA4CitleHRlcm4gIHZvaWQgKiBubG1fY2FuY2VsX21zZ18xKHN0cnVjdCBubG1fY2FuY2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX2NhbmNlbF9tc2dfMV9zdmMoc3RydWN0IG5sbV9jYW5jYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX1VOTE9DS19NU0cgOQorZXh0ZXJuICB2b2lkICogbmxtX3VubG9ja19tc2dfMShzdHJ1Y3QgbmxtX3VubG9ja2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX3VubG9ja19tc2dfMV9zdmMoc3RydWN0IG5sbV91bmxvY2thcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fR1JBTlRFRF9NU0cgMTAKK2V4dGVybiAgdm9pZCAqIG5sbV9ncmFudGVkX21zZ18xKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX2dyYW50ZWRfbXNnXzFfc3ZjKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9URVNUX1JFUyAxMQorZXh0ZXJuICB2b2lkICogbmxtX3Rlc3RfcmVzXzEobmxtX3Rlc3RyZXMgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX3Rlc3RfcmVzXzFfc3ZjKG5sbV90ZXN0cmVzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fTE9DS19SRVMgMTIKK2V4dGVybiAgdm9pZCAqIG5sbV9sb2NrX3Jlc18xKG5sbV9yZXMgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX2xvY2tfcmVzXzFfc3ZjKG5sbV9yZXMgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9DQU5DRUxfUkVTIDEzCitleHRlcm4gIHZvaWQgKiBubG1fY2FuY2VsX3Jlc18xKG5sbV9yZXMgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX2NhbmNlbF9yZXNfMV9zdmMobmxtX3JlcyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX1VOTE9DS19SRVMgMTQKK2V4dGVybiAgdm9pZCAqIG5sbV91bmxvY2tfcmVzXzEobmxtX3JlcyAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiBubG1fdW5sb2NrX3Jlc18xX3N2YyhubG1fcmVzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fR1JBTlRFRF9SRVMgMTUKK2V4dGVybiAgdm9pZCAqIG5sbV9ncmFudGVkX3Jlc18xKG5sbV9yZXMgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX2dyYW50ZWRfcmVzXzFfc3ZjKG5sbV9yZXMgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IG5sbV9wcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBOTE1fVEVTVCAxCitleHRlcm4gIG5sbV90ZXN0cmVzICogbmxtX3Rlc3RfMSgpOworZXh0ZXJuICBubG1fdGVzdHJlcyAqIG5sbV90ZXN0XzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9MT0NLIDIKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9sb2NrXzEoKTsKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9sb2NrXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9DQU5DRUwgMworZXh0ZXJuICBubG1fcmVzICogbmxtX2NhbmNlbF8xKCk7CitleHRlcm4gIG5sbV9yZXMgKiBubG1fY2FuY2VsXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9VTkxPQ0sgNAorZXh0ZXJuICBubG1fcmVzICogbmxtX3VubG9ja18xKCk7CitleHRlcm4gIG5sbV9yZXMgKiBubG1fdW5sb2NrXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9HUkFOVEVEIDUKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9ncmFudGVkXzEoKTsKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9ncmFudGVkXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9URVNUX01TRyA2CitleHRlcm4gIHZvaWQgKiBubG1fdGVzdF9tc2dfMSgpOworZXh0ZXJuICB2b2lkICogbmxtX3Rlc3RfbXNnXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9MT0NLX01TRyA3CitleHRlcm4gIHZvaWQgKiBubG1fbG9ja19tc2dfMSgpOworZXh0ZXJuICB2b2lkICogbmxtX2xvY2tfbXNnXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9DQU5DRUxfTVNHIDgKK2V4dGVybiAgdm9pZCAqIG5sbV9jYW5jZWxfbXNnXzEoKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9jYW5jZWxfbXNnXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9VTkxPQ0tfTVNHIDkKK2V4dGVybiAgdm9pZCAqIG5sbV91bmxvY2tfbXNnXzEoKTsKK2V4dGVybiAgdm9pZCAqIG5sbV91bmxvY2tfbXNnXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9HUkFOVEVEX01TRyAxMAorZXh0ZXJuICB2b2lkICogbmxtX2dyYW50ZWRfbXNnXzEoKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9ncmFudGVkX21zZ18xX3N2YygpOworI2RlZmluZSBOTE1fVEVTVF9SRVMgMTEKK2V4dGVybiAgdm9pZCAqIG5sbV90ZXN0X3Jlc18xKCk7CitleHRlcm4gIHZvaWQgKiBubG1fdGVzdF9yZXNfMV9zdmMoKTsKKyNkZWZpbmUgTkxNX0xPQ0tfUkVTIDEyCitleHRlcm4gIHZvaWQgKiBubG1fbG9ja19yZXNfMSgpOworZXh0ZXJuICB2b2lkICogbmxtX2xvY2tfcmVzXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9DQU5DRUxfUkVTIDEzCitleHRlcm4gIHZvaWQgKiBubG1fY2FuY2VsX3Jlc18xKCk7CitleHRlcm4gIHZvaWQgKiBubG1fY2FuY2VsX3Jlc18xX3N2YygpOworI2RlZmluZSBOTE1fVU5MT0NLX1JFUyAxNAorZXh0ZXJuICB2b2lkICogbmxtX3VubG9ja19yZXNfMSgpOworZXh0ZXJuICB2b2lkICogbmxtX3VubG9ja19yZXNfMV9zdmMoKTsKKyNkZWZpbmUgTkxNX0dSQU5URURfUkVTIDE1CitleHRlcm4gIHZvaWQgKiBubG1fZ3JhbnRlZF9yZXNfMSgpOworZXh0ZXJuICB2b2lkICogbmxtX2dyYW50ZWRfcmVzXzFfc3ZjKCk7CitleHRlcm4gaW50IG5sbV9wcm9nXzFfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworI2RlZmluZSBOTE1fVkVSU1ggMworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgTkxNX1NIQVJFIDIwCitleHRlcm4gIG5sbV9zaGFyZXJlcyAqIG5sbV9zaGFyZV8zKG5sbV9zaGFyZWFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBubG1fc2hhcmVyZXMgKiBubG1fc2hhcmVfM19zdmMobmxtX3NoYXJlYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX1VOU0hBUkUgMjEKK2V4dGVybiAgbmxtX3NoYXJlcmVzICogbmxtX3Vuc2hhcmVfMyhubG1fc2hhcmVhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmxtX3NoYXJlcmVzICogbmxtX3Vuc2hhcmVfM19zdmMobmxtX3NoYXJlYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX05NX0xPQ0sgMjIKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9ubV9sb2NrXzMobmxtX2xvY2thcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9ubV9sb2NrXzNfc3ZjKG5sbV9sb2NrYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX0ZSRUVfQUxMIDIzCitleHRlcm4gIHZvaWQgKiBubG1fZnJlZV9hbGxfMyhubG1fbm90aWZ5ICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9mcmVlX2FsbF8zX3N2YyhubG1fbm90aWZ5ICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBubG1fcHJvZ18zX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworI2Vsc2UgLyogSyZSIEMgKi8KKyNkZWZpbmUgTkxNX1NIQVJFIDIwCitleHRlcm4gIG5sbV9zaGFyZXJlcyAqIG5sbV9zaGFyZV8zKCk7CitleHRlcm4gIG5sbV9zaGFyZXJlcyAqIG5sbV9zaGFyZV8zX3N2YygpOworI2RlZmluZSBOTE1fVU5TSEFSRSAyMQorZXh0ZXJuICBubG1fc2hhcmVyZXMgKiBubG1fdW5zaGFyZV8zKCk7CitleHRlcm4gIG5sbV9zaGFyZXJlcyAqIG5sbV91bnNoYXJlXzNfc3ZjKCk7CisjZGVmaW5lIE5MTV9OTV9MT0NLIDIyCitleHRlcm4gIG5sbV9yZXMgKiBubG1fbm1fbG9ja18zKCk7CitleHRlcm4gIG5sbV9yZXMgKiBubG1fbm1fbG9ja18zX3N2YygpOworI2RlZmluZSBOTE1fRlJFRV9BTEwgMjMKK2V4dGVybiAgdm9pZCAqIG5sbV9mcmVlX2FsbF8zKCk7CitleHRlcm4gIHZvaWQgKiBubG1fZnJlZV9hbGxfM19zdmMoKTsKK2V4dGVybiBpbnQgbmxtX3Byb2dfM19mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX25sbV9zdGF0cyAoWERSICosIG5sbV9zdGF0cyopOworZXh0ZXJuICBib29sX3QgeGRyX25sbV9ob2xkZXIgKFhEUiAqLCBubG1faG9sZGVyKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX3Rlc3RycGx5IChYRFIgKiwgbmxtX3Rlc3RycGx5Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX3N0YXQgKFhEUiAqLCBubG1fc3RhdCopOworZXh0ZXJuICBib29sX3QgeGRyX25sbV9yZXMgKFhEUiAqLCBubG1fcmVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX3Rlc3RyZXMgKFhEUiAqLCBubG1fdGVzdHJlcyopOworZXh0ZXJuICBib29sX3QgeGRyX25sbV9sb2NrIChYRFIgKiwgbmxtX2xvY2sqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fbG9ja2FyZ3MgKFhEUiAqLCBubG1fbG9ja2FyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fY2FuY2FyZ3MgKFhEUiAqLCBubG1fY2FuY2FyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fdGVzdGFyZ3MgKFhEUiAqLCBubG1fdGVzdGFyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fdW5sb2NrYXJncyAoWERSICosIG5sbV91bmxvY2thcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZnNoX21vZGUgKFhEUiAqLCBmc2hfbW9kZSopOworZXh0ZXJuICBib29sX3QgeGRyX2ZzaF9hY2Nlc3MgKFhEUiAqLCBmc2hfYWNjZXNzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX3NoYXJlIChYRFIgKiwgbmxtX3NoYXJlKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX3NoYXJlYXJncyAoWERSICosIG5sbV9zaGFyZWFyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fc2hhcmVyZXMgKFhEUiAqLCBubG1fc2hhcmVyZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fbm90aWZ5IChYRFIgKiwgbmxtX25vdGlmeSopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX3N0YXRzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX2hvbGRlciAoKTsKK2V4dGVybiBib29sX3QgeGRyX25sbV90ZXN0cnBseSAoKTsKK2V4dGVybiBib29sX3QgeGRyX25sbV9zdGF0ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX3JlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX25sbV90ZXN0cmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX2xvY2sgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fbG9ja2FyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fY2FuY2FyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fdGVzdGFyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fdW5sb2NrYXJncyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2ZzaF9tb2RlICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZnNoX2FjY2VzcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX25sbV9zaGFyZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX25sbV9zaGFyZWFyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fc2hhcmVyZXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fbm90aWZ5ICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfTkxNX1BST1RfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25sbV9wcm90LnggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ubG1fcHJvdC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZmYxMzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ubG1fcHJvdC54CkBAIC0wLDAgKzEsMjAzIEBACisvKiBAKCMpbmxtX3Byb3QueAkyLjEgODgvMDgvMDEgNC4wIFJQQ1NSQyAqLworCisvKgorICogTmV0d29yayBsb2NrIG1hbmFnZXIgcHJvdG9jb2wgZGVmaW5pdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBwcm90b2NvbCB1c2VkIGJldHdlZW4gbG9jYWwgbG9jayBtYW5hZ2VyIGFuZCByZW1vdGUgbG9jayBtYW5hZ2VyCisgKi8KKworI2lmZGVmIFJQQ19IRFIKKyUjZGVmaW5lIExNX01BWFNUUkxFTgkxMDI0CislI2RlZmluZSBNQVhOQU1FTEVOCUxNX01BWFNUUkxFTisxCisjZW5kaWYKKworLyoKKyAqIHN0YXR1cyBvZiBhIGNhbGwgdG8gdGhlIGxvY2sgbWFuYWdlcgorICovCitlbnVtIG5sbV9zdGF0cyB7CisJbmxtX2dyYW50ZWQgPSAwLAorCW5sbV9kZW5pZWQgPSAxLAorCW5sbV9kZW5pZWRfbm9sb2NrcyA9IDIsCisJbmxtX2Jsb2NrZWQgPSAzLAorCW5sbV9kZW5pZWRfZ3JhY2VfcGVyaW9kID0gNAorfTsKKworc3RydWN0IG5sbV9ob2xkZXIgeworCWJvb2wgZXhjbHVzaXZlOworCWludCBzdmlkOworCW5ldG9iaiBvaDsKKwl1bnNpZ25lZCBsX29mZnNldDsKKwl1bnNpZ25lZCBsX2xlbjsKK307CisKK3VuaW9uIG5sbV90ZXN0cnBseSBzd2l0Y2ggKG5sbV9zdGF0cyBzdGF0KSB7CisJY2FzZSBubG1fZGVuaWVkOgorCQlzdHJ1Y3QgbmxtX2hvbGRlciBob2xkZXI7CisJZGVmYXVsdDoKKwkJdm9pZDsKK307CisKK3N0cnVjdCBubG1fc3RhdCB7CisJbmxtX3N0YXRzIHN0YXQ7Cit9OworCitzdHJ1Y3QgbmxtX3JlcyB7CisJbmV0b2JqIGNvb2tpZTsKKwlubG1fc3RhdCBzdGF0OworfTsKKworc3RydWN0IG5sbV90ZXN0cmVzIHsKKwluZXRvYmogY29va2llOworCW5sbV90ZXN0cnBseSBzdGF0OworfTsKKworc3RydWN0IG5sbV9sb2NrIHsKKwlzdHJpbmcgY2FsbGVyX25hbWU8TE1fTUFYU1RSTEVOPjsKKwluZXRvYmogZmg7CQkvKiBpZGVudGlmeSBhIGZpbGUgKi8KKwluZXRvYmogb2g7CQkvKiBpZGVudGlmeSBvd25lciBvZiBhIGxvY2sgKi8KKwlpbnQgc3ZpZDsJCS8qIGdlbmVyYXRlZCBmcm9tIHBpZCBmb3Igc3ZpZCAqLworCXVuc2lnbmVkIGxfb2Zmc2V0OworCXVuc2lnbmVkIGxfbGVuOworfTsKKworc3RydWN0IG5sbV9sb2NrYXJncyB7CisJbmV0b2JqIGNvb2tpZTsKKwlib29sIGJsb2NrOworCWJvb2wgZXhjbHVzaXZlOworCXN0cnVjdCBubG1fbG9jayBhbG9jazsKKwlib29sIHJlY2xhaW07CQkvKiB1c2VkIGZvciByZWNvdmVyaW5nIGxvY2tzICovCisJaW50IHN0YXRlOwkJLyogc3BlY2lmeSBsb2NhbCBzdGF0dXMgbW9uaXRvciBzdGF0ZSAqLworfTsKKworc3RydWN0IG5sbV9jYW5jYXJncyB7CisJbmV0b2JqIGNvb2tpZTsKKwlib29sIGJsb2NrOworCWJvb2wgZXhjbHVzaXZlOworCXN0cnVjdCBubG1fbG9jayBhbG9jazsKK307CisKK3N0cnVjdCBubG1fdGVzdGFyZ3MgeworCW5ldG9iaiBjb29raWU7CisJYm9vbCBleGNsdXNpdmU7CisJc3RydWN0IG5sbV9sb2NrIGFsb2NrOworfTsKKworc3RydWN0IG5sbV91bmxvY2thcmdzIHsKKwluZXRvYmogY29va2llOworCXN0cnVjdCBubG1fbG9jayBhbG9jazsKK307CisKKworI2lmZGVmIFJQQ19IRFIKKyUvKgorJSAqIFRoZSBmb2xsb3dpbmcgZW51bXMgYXJlIGFjdHVhbGx5IGJpdCBlbmNvZGVkIGZvciBlZmZpY2llbnQKKyUgKiBib29sZWFuIGFsZ2VicmEuLi4uIERPTidUIGNoYW5nZSB0aGVtLi4uLi4KKyUgKi8KKyNlbmRpZgorZW51bQlmc2hfbW9kZSB7CisJZnNtX0ROICA9IDAsCS8qIGRlbnkgbm9uZSAqLworCWZzbV9EUiAgPSAxLAkvKiBkZW55IHJlYWQgKi8KKwlmc21fRFcgID0gMiwJLyogZGVueSB3cml0ZSAqLworCWZzbV9EUlcgPSAzCS8qIGRlbnkgcmVhZC93cml0ZSAqLworfTsKKworZW51bQlmc2hfYWNjZXNzIHsKKwlmc2FfTk9ORSA9IDAsCS8qIGZvciBjb21wbGV0ZW5lc3MgKi8KKwlmc2FfUiAgICA9IDEsCS8qIHJlYWQgb25seSAqLworCWZzYV9XICAgID0gMiwJLyogd3JpdGUgb25seSAqLworCWZzYV9SVyAgID0gMwkvKiByZWFkL3dyaXRlICovCit9OworCitzdHJ1Y3QJbmxtX3NoYXJlIHsKKwlzdHJpbmcgY2FsbGVyX25hbWU8TE1fTUFYU1RSTEVOPjsKKwluZXRvYmoJZmg7CisJbmV0b2JqCW9oOworCWZzaF9tb2RlCW1vZGU7CisJZnNoX2FjY2VzcwlhY2Nlc3M7Cit9OworCitzdHJ1Y3QJbmxtX3NoYXJlYXJncyB7CisJbmV0b2JqCWNvb2tpZTsKKwlubG1fc2hhcmUJc2hhcmU7CisJYm9vbAlyZWNsYWltOworfTsKKworc3RydWN0CW5sbV9zaGFyZXJlcyB7CisJbmV0b2JqCWNvb2tpZTsKKwlubG1fc3RhdHMJc3RhdDsKKwlpbnQJc2VxdWVuY2U7Cit9OworCitzdHJ1Y3QJbmxtX25vdGlmeSB7CisJc3RyaW5nIG5hbWU8TUFYTkFNRUxFTj47CisJbG9uZyBzdGF0ZTsKK307CisKKy8qCisgKiBPdmVyLXRoZS13aXJlIHByb3RvY29sIHVzZWQgYmV0d2VlbiB0aGUgbmV0d29yayBsb2NrIG1hbmFnZXJzCisgKi8KKworcHJvZ3JhbSBOTE1fUFJPRyB7CisJdmVyc2lvbiBOTE1fVkVSUyB7CisKKwkJbmxtX3Rlc3RyZXMJTkxNX1RFU1Qoc3RydWN0IG5sbV90ZXN0YXJncykgPQkxOworCisJCW5sbV9yZXMJCU5MTV9MT0NLKHN0cnVjdCBubG1fbG9ja2FyZ3MpID0JMjsKKworCQlubG1fcmVzCQlOTE1fQ0FOQ0VMKHN0cnVjdCBubG1fY2FuY2FyZ3MpID0gMzsKKwkJbmxtX3JlcwkJTkxNX1VOTE9DSyhzdHJ1Y3QgbmxtX3VubG9ja2FyZ3MpID0JNDsKKworCQkvKgorCQkgKiByZW1vdGUgbG9jayBtYW5hZ2VyIGNhbGwtYmFjayB0byBncmFudCBsb2NrCisJCSAqLworCQlubG1fcmVzCQlOTE1fR1JBTlRFRChzdHJ1Y3QgbmxtX3Rlc3RhcmdzKT0gNTsKKwkJLyoKKwkJICogbWVzc2FnZSBwYXNzaW5nIHN0eWxlIG9mIHJlcXVlc3RpbmcgbG9jaworCQkgKi8KKwkJdm9pZAkJTkxNX1RFU1RfTVNHKHN0cnVjdCBubG1fdGVzdGFyZ3MpID0gNjsKKwkJdm9pZAkJTkxNX0xPQ0tfTVNHKHN0cnVjdCBubG1fbG9ja2FyZ3MpID0gNzsKKwkJdm9pZAkJTkxNX0NBTkNFTF9NU0coc3RydWN0IG5sbV9jYW5jYXJncykgPTg7CisJCXZvaWQJCU5MTV9VTkxPQ0tfTVNHKHN0cnVjdCBubG1fdW5sb2NrYXJncykgPSA5OworCQl2b2lkCQlOTE1fR1JBTlRFRF9NU0coc3RydWN0IG5sbV90ZXN0YXJncykgPSAxMDsKKwkJdm9pZAkJTkxNX1RFU1RfUkVTKG5sbV90ZXN0cmVzKSA9IDExOworCQl2b2lkCQlOTE1fTE9DS19SRVMobmxtX3JlcykgPSAxMjsKKwkJdm9pZAkJTkxNX0NBTkNFTF9SRVMobmxtX3JlcykgPSAxMzsKKwkJdm9pZAkJTkxNX1VOTE9DS19SRVMobmxtX3JlcykgPSAxNDsKKwkJdm9pZAkJTkxNX0dSQU5URURfUkVTKG5sbV9yZXMpID0gMTU7CisJfSA9IDE7CisKKwl2ZXJzaW9uIE5MTV9WRVJTWCB7CisJCW5sbV9zaGFyZXJlcwlOTE1fU0hBUkUobmxtX3NoYXJlYXJncykgPSAyMDsKKwkJbmxtX3NoYXJlcmVzCU5MTV9VTlNIQVJFKG5sbV9zaGFyZWFyZ3MpID0gMjE7CisJCW5sbV9yZXMJCU5MTV9OTV9MT0NLKG5sbV9sb2NrYXJncykgPSAyMjsKKwkJdm9pZAkJTkxNX0ZSRUVfQUxMKG5sbV9ub3RpZnkpID0gMjM7CisJfSA9IDM7CisKK30gPSAxMDAwMjE7CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yZXguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjODBjZTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yZXguaApAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9SRVhfSF9SUENHRU4KKyNkZWZpbmUgX1JFWF9IX1JQQ0dFTgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBTVFJJTkdTSVpFIDEwMjQKKwordHlwZWRlZiBjaGFyICpyZXhzdHJpbmc7CisjZGVmaW5lIFNJR0lOVCAyCisjZGVmaW5lIFJFWF9JTlRFUkFDVElWRSAxCisKK3N0cnVjdCByZXhfc3RhcnQgeworCXN0cnVjdCB7CisJCXVfaW50IHJzdF9jbWRfbGVuOworCQlyZXhzdHJpbmcgKnJzdF9jbWRfdmFsOworCX0gcnN0X2NtZDsKKwlyZXhzdHJpbmcgcnN0X2hvc3Q7CisJcmV4c3RyaW5nIHJzdF9mc25hbWU7CisJcmV4c3RyaW5nIHJzdF9kaXJ3aXRoaW47CisJc3RydWN0IHsKKwkJdV9pbnQgcnN0X2Vudl9sZW47CisJCXJleHN0cmluZyAqcnN0X2Vudl92YWw7CisJfSByc3RfZW52OworCXVfaW50IHJzdF9wb3J0MDsKKwl1X2ludCByc3RfcG9ydDE7CisJdV9pbnQgcnN0X3BvcnQyOworCXVfaW50IHJzdF9mbGFnczsKK307Cit0eXBlZGVmIHN0cnVjdCByZXhfc3RhcnQgcmV4X3N0YXJ0OworCitzdHJ1Y3QgcmV4X3Jlc3VsdCB7CisJaW50IHJsdF9zdGF0OworCXJleHN0cmluZyBybHRfbWVzc2FnZTsKK307Cit0eXBlZGVmIHN0cnVjdCByZXhfcmVzdWx0IHJleF9yZXN1bHQ7CisKK3N0cnVjdCBzZ3R0eWIgeworCXVfaW50IGZvdXI7CisJY2hhciBjaGFyc1s0XTsKKwl1X2ludCBmbGFnczsKK307Cit0eXBlZGVmIHN0cnVjdCBzZ3R0eWIgc2d0dHliOworI2RlZmluZSBCMCAwCisjZGVmaW5lIEI1MCAxCisjZGVmaW5lIEI3NSAyCisjZGVmaW5lIEIxMTAgMworI2RlZmluZSBCMTM0IDQKKyNkZWZpbmUgQjE1MCA1CisjZGVmaW5lIEIyMDAgNgorI2RlZmluZSBCMzAwIDcKKyNkZWZpbmUgQjYwMCA4CisjZGVmaW5lIEIxMjAwIDkKKyNkZWZpbmUgQjE4MDAgMTAKKyNkZWZpbmUgQjI0MDAgMTEKKyNkZWZpbmUgQjQ4MDAgMTIKKyNkZWZpbmUgQjk2MDAgMTMKKyNkZWZpbmUgQjE5MjAwIDE0CisjZGVmaW5lIEIzODQwMCAxNQorI2RlZmluZSBUQU5ERU0gMHgwMDAwMDAwMQorI2RlZmluZSBDQlJFQUsgMHgwMDAwMDAwMgorI2RlZmluZSBMQ0FTRSAweDAwMDAwMDA0CisjZGVmaW5lIEVDSE8gMHgwMDAwMDAwOAorI2RlZmluZSBDUk1PRCAweDAwMDAwMDEwCisjZGVmaW5lIFJBVyAweDAwMDAwMDIwCisjZGVmaW5lIE9ERFAgMHgwMDAwMDA0MAorI2RlZmluZSBFVkVOUCAweDAwMDAwMDgwCisjZGVmaW5lIEFOWVAgMHgwMDAwMDBjMAorI2RlZmluZSBOTERFTEFZIDB4MDAwMDAzMDAKKyNkZWZpbmUgTkwwIDB4MDAwMDAwMDAKKyNkZWZpbmUgTkwxIDB4MDAwMDAxMDAKKyNkZWZpbmUgTkwyIDB4MDAwMDAyMDAKKyNkZWZpbmUgTkwzIDB4MDAwMDAzMDAKKyNkZWZpbmUgVEJERUxBWSAweDAwMDAwYzAwCisjZGVmaW5lIFRBQjAgMHgwMDAwMDAwMAorI2RlZmluZSBUQUIxIDB4MDAwMDA0MDAKKyNkZWZpbmUgVEFCMiAweDAwMDAwODAwCisjZGVmaW5lIFhUQUJTIDB4MDAwMDBjMDAKKyNkZWZpbmUgQ1JERUxBWSAweDAwMDAzMDAwCisjZGVmaW5lIENSMCAweDAwMDAwMDAwCisjZGVmaW5lIENSMSAweDAwMDAxMDAwCisjZGVmaW5lIENSMiAweDAwMDAyMDAwCisjZGVmaW5lIENSMyAweDAwMDAzMDAwCisjZGVmaW5lIFZUREVMQVkgMHgwMDAwNDAwMAorI2RlZmluZSBGRjAgMHgwMDAwMDAwMAorI2RlZmluZSBGRjEgMHgwMDAwNDAwMAorI2RlZmluZSBCU0RFTEFZIDB4MDAwMDgwMDAKKyNkZWZpbmUgQlMwIDB4MDAwMDAwMDAKKyNkZWZpbmUgQlMxIDB4MDAwMDgwMDAKKyNkZWZpbmUgQ1JUQlMgMHgwMDAxMDAwMAorI2RlZmluZSBQUlRFUkEgMHgwMDAyMDAwMAorI2RlZmluZSBDUlRFUkEgMHgwMDA0MDAwMAorI2RlZmluZSBUSUxERSAweDAwMDgwMDAwCisjZGVmaW5lIE1ETUJVRiAweDAwMTAwMDAwCisjZGVmaW5lIExJVE9VVCAweDAwMjAwMDAwCisjZGVmaW5lIFRPU1RPUCAweDAwNDAwMDAwCisjZGVmaW5lIEZMVVNITyAweDAwODAwMDAwCisjZGVmaW5lIE5PSEFORyAweDAxMDAwMDAwCisjZGVmaW5lIEwwMDEwMDAgMHgwMjAwMDAwMAorI2RlZmluZSBDUlRLSUwgMHgwNDAwMDAwMAorI2RlZmluZSBQQVNTOCAweDA4MDAwMDAwCisjZGVmaW5lIENUTEVDSCAweDEwMDAwMDAwCisjZGVmaW5lIFBFTkRJTiAweDIwMDAwMDAwCisjZGVmaW5lIERFQ0NUUSAweDQwMDAwMDAwCisjZGVmaW5lIE5PRkxTSCAweDgwMDAwMDAwCisKK3N0cnVjdCB0Y2hhcnMgeworCXVfaW50IHNpeDsKKwljaGFyIGNoYXJzWzZdOworfTsKK3R5cGVkZWYgc3RydWN0IHRjaGFycyB0Y2hhcnM7CisKK3N0cnVjdCBsdGNoYXJzIHsKKwl1X2ludCBzaXg7CisJY2hhciBjaGFyc1s2XTsKKwl1X2ludCBtb2RlOworfTsKK3R5cGVkZWYgc3RydWN0IGx0Y2hhcnMgbHRjaGFyczsKKworc3RydWN0IHJleF90dHlzaXplIHsKKwlpbnQgdHNfbGluZXM7CisJaW50IHRzX2NvbHM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcmV4X3R0eXNpemUgcmV4X3R0eXNpemU7CisKK3N0cnVjdCByZXhfdHR5bW9kZSB7CisJc2d0dHliIGJhc2ljOworCXRjaGFycyBtb3JlOworCWx0Y2hhcnMgeWV0bW9yZTsKKwl1X2ludCBhbmRtb3JlOworfTsKK3R5cGVkZWYgc3RydWN0IHJleF90dHltb2RlIHJleF90dHltb2RlOworI2RlZmluZSBMQ1JUQlMgMHgwMDAxCisjZGVmaW5lIExQUlRFUkEgMHgwMDAyCisjZGVmaW5lIExDUlRFUkEgMHgwMDA0CisjZGVmaW5lIExUSUxERSAweDAwMDgKKyNkZWZpbmUgTE1ETUJVRiAweDAwMTAKKyNkZWZpbmUgTExJVE9VVCAweDAwMjAKKyNkZWZpbmUgTFRPU1RPUCAweDAwNDAKKyNkZWZpbmUgTEZMVVNITyAweDAwODAKKyNkZWZpbmUgTE5PSEFORyAweDAxMDAKKyNkZWZpbmUgTEwwMDEwMDAgMHgwMjAwCisjZGVmaW5lIExDUlRLSUwgMHgwNDAwCisjZGVmaW5lIExQQVNTOCAweDA4MDAKKyNkZWZpbmUgTENUTEVDSCAweDEwMDAKKyNkZWZpbmUgTFBFTkRJTiAweDIwMDAKKyNkZWZpbmUgTERFQ0NUUSAweDQwMDAKKyNkZWZpbmUgTE5PRkxTSCAweDgwMDAKKworI2RlZmluZSBSRVhQUk9HIDEwMDAxNworI2RlZmluZSBSRVhWRVJTIDEKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIFJFWFBST0NfU1RBUlQgMQorZXh0ZXJuICByZXhfcmVzdWx0ICogcmV4cHJvY19zdGFydF8xKHJleF9zdGFydCAqLCBDTElFTlQgKik7CitleHRlcm4gIHJleF9yZXN1bHQgKiByZXhwcm9jX3N0YXJ0XzFfc3ZjKHJleF9zdGFydCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgUkVYUFJPQ19XQUlUIDIKK2V4dGVybiAgcmV4X3Jlc3VsdCAqIHJleHByb2Nfd2FpdF8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICByZXhfcmVzdWx0ICogcmV4cHJvY193YWl0XzFfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFJFWFBST0NfTU9ERVMgMworZXh0ZXJuICB2b2lkICogcmV4cHJvY19tb2Rlc18xKHJleF90dHltb2RlICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIHJleHByb2NfbW9kZXNfMV9zdmMocmV4X3R0eW1vZGUgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFJFWFBST0NfV0lOQ0ggNAorZXh0ZXJuICB2b2lkICogcmV4cHJvY193aW5jaF8xKHJleF90dHlzaXplICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIHJleHByb2Nfd2luY2hfMV9zdmMocmV4X3R0eXNpemUgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFJFWFBST0NfU0lHTkFMIDUKK2V4dGVybiAgdm9pZCAqIHJleHByb2Nfc2lnbmFsXzEoaW50ICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIHJleHByb2Nfc2lnbmFsXzFfc3ZjKGludCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgcmV4cHJvZ18xX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworI2Vsc2UgLyogSyZSIEMgKi8KKyNkZWZpbmUgUkVYUFJPQ19TVEFSVCAxCitleHRlcm4gIHJleF9yZXN1bHQgKiByZXhwcm9jX3N0YXJ0XzEoKTsKK2V4dGVybiAgcmV4X3Jlc3VsdCAqIHJleHByb2Nfc3RhcnRfMV9zdmMoKTsKKyNkZWZpbmUgUkVYUFJPQ19XQUlUIDIKK2V4dGVybiAgcmV4X3Jlc3VsdCAqIHJleHByb2Nfd2FpdF8xKCk7CitleHRlcm4gIHJleF9yZXN1bHQgKiByZXhwcm9jX3dhaXRfMV9zdmMoKTsKKyNkZWZpbmUgUkVYUFJPQ19NT0RFUyAzCitleHRlcm4gIHZvaWQgKiByZXhwcm9jX21vZGVzXzEoKTsKK2V4dGVybiAgdm9pZCAqIHJleHByb2NfbW9kZXNfMV9zdmMoKTsKKyNkZWZpbmUgUkVYUFJPQ19XSU5DSCA0CitleHRlcm4gIHZvaWQgKiByZXhwcm9jX3dpbmNoXzEoKTsKK2V4dGVybiAgdm9pZCAqIHJleHByb2Nfd2luY2hfMV9zdmMoKTsKKyNkZWZpbmUgUkVYUFJPQ19TSUdOQUwgNQorZXh0ZXJuICB2b2lkICogcmV4cHJvY19zaWduYWxfMSgpOworZXh0ZXJuICB2b2lkICogcmV4cHJvY19zaWduYWxfMV9zdmMoKTsKK2V4dGVybiBpbnQgcmV4cHJvZ18xX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKworLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGJvb2xfdCB4ZHJfcmV4c3RyaW5nIChYRFIgKiwgcmV4c3RyaW5nKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfcmV4X3N0YXJ0IChYRFIgKiwgcmV4X3N0YXJ0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfcmV4X3Jlc3VsdCAoWERSICosIHJleF9yZXN1bHQqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9zZ3R0eWIgKFhEUiAqLCBzZ3R0eWIqKTsKK2V4dGVybiAgYm9vbF90IHhkcl90Y2hhcnMgKFhEUiAqLCB0Y2hhcnMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9sdGNoYXJzIChYRFIgKiwgbHRjaGFycyopOworZXh0ZXJuICBib29sX3QgeGRyX3JleF90dHlzaXplIChYRFIgKiwgcmV4X3R0eXNpemUqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9yZXhfdHR5bW9kZSAoWERSICosIHJleF90dHltb2RlKik7CisKKyNlbHNlIC8qIEsmUiBDICovCitleHRlcm4gYm9vbF90IHhkcl9yZXhzdHJpbmcgKCk7CitleHRlcm4gYm9vbF90IHhkcl9yZXhfc3RhcnQgKCk7CitleHRlcm4gYm9vbF90IHhkcl9yZXhfcmVzdWx0ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfc2d0dHliICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfdGNoYXJzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbHRjaGFycyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3JleF90dHlzaXplICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmV4X3R0eW1vZGUgKCk7CisKKyNlbmRpZiAvKiBLJlIgQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9SRVhfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JleC54IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcmV4LngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViYWYxNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JleC54CkBAIC0wLDAgKzEsMjI5IEBACisvKiBAKCMpcmV4LngJMi4xIDg4LzA4LzAxIDQuMCBSUENTUkMgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFJlbW90ZSBleGVjdXRpb24gKHJleCkgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbgorICovCisKK2NvbnN0IFNUUklOR1NJWkUgPSAxMDI0OwordHlwZWRlZiBzdHJpbmcgcmV4c3RyaW5nPDEwMjQ+OworCisvKgorICogdmFsdWVzIHRvIHBhc3MgdG8gUkVYUFJPQ19TSUdOQUwKKyAqLworY29uc3QgU0lHSU5UID0gMjsJLyogaW50ZXJydXB0ICovCisKKy8qCisgKiBWYWx1ZXMgZm9yIHJzdF9mbGFncywgYmVsb3cKKyAqLworY29uc3QgUkVYX0lOVEVSQUNUSVZFID0gMTsJLyogaW50ZXJhY3RpdmUgbW9kZSAqLworCitzdHJ1Y3QgcmV4X3N0YXJ0IHsKKwlyZXhzdHJpbmcgcnN0X2NtZDw+OwkvKiBsaXN0IG9mIGNvbW1hbmQgYW5kIGFyZ3MgKi8KKwlyZXhzdHJpbmcgcnN0X2hvc3Q7CS8qIHdvcmtpbmcgZGlyZWN0b3J5IGhvc3QgbmFtZSAqLworCXJleHN0cmluZyByc3RfZnNuYW1lOwkvKiB3b3JraW5nIGRpcmVjdG9yeSBmaWxlIHN5c3RlbSBuYW1lICovCisJcmV4c3RyaW5nIHJzdF9kaXJ3aXRoaW47Lyogd29ya2luZyBkaXJlY3Rvcnkgd2l0aGluIGZpbGUgc3lzdGVtICovCisJcmV4c3RyaW5nIHJzdF9lbnY8PjsJLyogbGlzdCBvZiBlbnZpcm9ubWVudCAqLworCXVuc2lnbmVkIGludCByc3RfcG9ydDA7CS8qIHBvcnQgZm9yIHN0ZGluICovCisJdW5zaWduZWQgaW50IHJzdF9wb3J0MTsJLyogcG9ydCBmb3Igc3Rkb3V0ICovCisJdW5zaWduZWQgaW50IHJzdF9wb3J0MjsJLyogcG9ydCBmb3Igc3RkZXJyICovCisJdW5zaWduZWQgaW50IHJzdF9mbGFnczsJLyogb3B0aW9ucyAtIHNlZSBjb25zdCBhYm92ZSAqLworfTsKKworc3RydWN0IHJleF9yZXN1bHQgeworICAgCWludCBybHRfc3RhdDsJCS8qIGludGVnZXIgc3RhdHVzIGNvZGUgKi8KKwlyZXhzdHJpbmcgcmx0X21lc3NhZ2U7CS8qIHN0cmluZyBtZXNzYWdlIGZvciBodW1hbiBjb25zdW1wdGlvbiAqLworfTsKKworCitzdHJ1Y3Qgc2d0dHliIHsKKwl1bnNpZ25lZCBmb3VyOwkvKiBhbHdheXMgZXF1YWxzIDQgKi8KKwlvcGFxdWUgY2hhcnNbNF07CisJLyogY2hhcnNbMF0gPT0gaW5wdXQgc3BlZWQgKi8KKwkvKiBjaGFyc1sxXSA9PSBvdXRwdXQgc3BlZWQgKi8KKwkvKiBjaGFyc1syXSA9PSBraWxsIGNoYXJhY3RlciAqLworCS8qIGNoYXJzWzNdID09IGVyYXNlIGNoYXJhY3RlciAqLworCXVuc2lnbmVkIGZsYWdzOworfTsKKy8qIHZhbHVlcyBmb3Igc3BlZWRzIGFib3ZlIChiYXVkIHJhdGVzKSAgKi8KK2NvbnN0IEIwICA9IDA7Citjb25zdCBCNTAgPSAxOworY29uc3QgQjc1ID0gMjsKK2NvbnN0IEIxMTAgPSAzOworY29uc3QgQjEzNCA9IDQ7Citjb25zdCBCMTUwID0gNTsKK2NvbnN0IEIyMDAgPSA2OworY29uc3QgQjMwMCA9IDc7Citjb25zdCBCNjAwID0gODsKK2NvbnN0IEIxMjAwID0gOTsKK2NvbnN0IEIxODAwID0gMTA7Citjb25zdCBCMjQwMCA9IDExOworY29uc3QgQjQ4MDAgPSAxMjsKK2NvbnN0IEI5NjAwID0gMTM7Citjb25zdCBCMTkyMDAgPSAxNDsKK2NvbnN0IEIzODQwMCA9IDE1OworCisvKiB2YWx1ZXMgZm9yIGZsYWdzIGFib3ZlICovCitjb25zdCBUQU5ERU0gPSAweDAwMDAwMDAxOyAvKiBzZW5kIHN0b3BjIG9uIG91dCBxIGZ1bGwgKi8KK2NvbnN0IENCUkVBSyA9IDB4MDAwMDAwMDI7IC8qIGhhbGYtY29va2VkIG1vZGUgKi8KK2NvbnN0IExDQVNFID0gMHgwMDAwMDAwNDsgLyogc2ltdWxhdGUgbG93ZXIgY2FzZSAqLworY29uc3QgRUNITyA9IDB4MDAwMDAwMDg7IC8qIGVjaG8gaW5wdXQgKi8KK2NvbnN0IENSTU9EID0gMHgwMDAwMDAxMDsgLyogbWFwIFxyIHRvIFxyXG4gb24gb3V0cHV0ICovCitjb25zdCBSQVcgPSAweDAwMDAwMDIwOyAvKiBubyBpL28gcHJvY2Vzc2luZyAqLworY29uc3QgT0REUCA9IDB4MDAwMDAwNDA7IC8qIGdldC9zZW5kIG9kZCBwYXJpdHkgKi8KK2NvbnN0IEVWRU5QID0gMHgwMDAwMDA4MDsgLyogZ2V0L3NlbmQgZXZlbiBwYXJpdHkgKi8KK2NvbnN0IEFOWVAgPSAweDAwMDAwMGMwOyAvKiBnZXQgYW55IHBhcml0eS9zZW5kIG5vbmUgKi8KK2NvbnN0IE5MREVMQVkgPSAweDAwMDAwMzAwOyAvKiBcbiBkZWxheSAqLworY29uc3QgIE5MMCA9IDB4MDAwMDAwMDA7Citjb25zdCAgTkwxID0gMHgwMDAwMDEwMDsgLyogdHR5IDM3ICovCitjb25zdCAgTkwyID0gMHgwMDAwMDIwMDsgLyogdnQwNSAqLworY29uc3QgIE5MMyA9IDB4MDAwMDAzMDA7Citjb25zdCBUQkRFTEFZID0gMHgwMDAwMGMwMDsgLyogaG9yaXpvbnRhbCB0YWIgZGVsYXkgKi8KK2NvbnN0ICBUQUIwID0gMHgwMDAwMDAwMDsKK2NvbnN0ICBUQUIxID0gMHgwMDAwMDQwMDsgLyogdHR5IDM3ICovCitjb25zdCAgVEFCMiA9IDB4MDAwMDA4MDA7Citjb25zdCBYVEFCUyA9IDB4MDAwMDBjMDA7IC8qIGV4cGFuZCB0YWJzIG9uIG91dHB1dCAqLworY29uc3QgQ1JERUxBWSA9IDB4MDAwMDMwMDA7IC8qIFxyIGRlbGF5ICovCitjb25zdCAgQ1IwID0gMHgwMDAwMDAwMDsKK2NvbnN0ICBDUjEgPSAweDAwMDAxMDAwOyAvKiB0biAzMDAgKi8KK2NvbnN0ICBDUjIgPSAweDAwMDAyMDAwOyAvKiB0dHkgMzcgKi8KK2NvbnN0ICBDUjMgPSAweDAwMDAzMDAwOyAvKiBjb25jZXB0IDEwMCAqLworY29uc3QgVlRERUxBWSA9IDB4MDAwMDQwMDA7IC8qIHZlcnRpY2FsIHRhYiBkZWxheSAqLworY29uc3QgIEZGMCA9IDB4MDAwMDAwMDA7Citjb25zdCAgRkYxID0gMHgwMDAwNDAwMDsgLyogdHR5IDM3ICovCitjb25zdCBCU0RFTEFZID0gMHgwMDAwODAwMDsgLyogXGIgZGVsYXkgKi8KK2NvbnN0ICBCUzAgPSAweDAwMDAwMDAwOworY29uc3QgIEJTMSA9IDB4MDAwMDgwMDA7Citjb25zdCBDUlRCUyA9IDB4MDAwMTAwMDA7IC8qIGRvIGJhY2tzcGFjaW5nIGZvciBjcnQgKi8KK2NvbnN0IFBSVEVSQSA9IDB4MDAwMjAwMDA7IC8qIFwgLi4uIC8gZXJhc2UgKi8KK2NvbnN0IENSVEVSQSA9IDB4MDAwNDAwMDA7IC8qICIgXGIgIiB0byB3aXBlIG91dCBjaGFyICovCitjb25zdCBUSUxERSA9IDB4MDAwODAwMDA7IC8qIGhhemVsdGluZSB0aWxkZSBrbHVkZ2UgKi8KK2NvbnN0IE1ETUJVRiA9IDB4MDAxMDAwMDA7IC8qIHN0YXJ0L3N0b3Agb3V0cHV0IG9uIGNhcnJpZXIgaW50ciAqLworY29uc3QgTElUT1VUID0gMHgwMDIwMDAwMDsgLyogbGl0ZXJhbCBvdXRwdXQgKi8KK2NvbnN0IFRPU1RPUCA9IDB4MDA0MDAwMDA7IC8qIFNJR1RUT1Ugb24gYmFja2dyb3VuZCBvdXRwdXQgKi8KK2NvbnN0IEZMVVNITyA9IDB4MDA4MDAwMDA7IC8qIGZsdXNoIG91dHB1dCB0byB0ZXJtaW5hbCAqLworY29uc3QgTk9IQU5HID0gMHgwMTAwMDAwMDsgLyogbm8gU0lHSFVQIG9uIGNhcnJpZXIgZHJvcCAqLworY29uc3QgTDAwMTAwMCA9IDB4MDIwMDAwMDA7Citjb25zdCBDUlRLSUwgPSAweDA0MDAwMDAwOyAvKiBraWxsIGxpbmUgd2l0aCAiIFxiICIgKi8KK2NvbnN0IFBBU1M4ID0gMHgwODAwMDAwMDsKK2NvbnN0IENUTEVDSCA9IDB4MTAwMDAwMDA7IC8qIGVjaG8gY29udHJvbCBjaGFycyBhcyBeWCAqLworY29uc3QgUEVORElOID0gMHgyMDAwMDAwMDsgLyogdHAtPnRfcmF3cSBuZWVkcyByZXJlYWQgKi8KK2NvbnN0IERFQ0NUUSA9IDB4NDAwMDAwMDA7IC8qIG9ubHkgXlEgc3RhcnRzIGFmdGVyIF5TICovCitjb25zdCBOT0ZMU0ggPSAweDgwMDAwMDAwOyAvKiBubyBvdXRwdXQgZmx1c2ggb24gc2lnbmFsICovCisKK3N0cnVjdCB0Y2hhcnMgeworCXVuc2lnbmVkIHNpeDsJLyogYWx3YXlzIGVxdWFscyA2ICovCisJb3BhcXVlIGNoYXJzWzZdOworCS8qIGNoYXJzWzBdID09IGludGVycnVwdCBjaGFyICovCisJLyogY2hhcnNbMV0gPT0gcXVpdCBjaGFyICovCisJLyogY2hhcnNbMl0gPT0gc3RhcnQgb3V0cHV0IGNoYXIgKi8KKwkvKiBjaGFyc1szXSA9PSBzdG9wIG91dHB1dCBjaGFyICovCisJLyogY2hhcnNbNF0gPT0gZW5kLW9mLWZpbGUgY2hhciAqLworCS8qIGNoYXJzWzVdID09IGlucHV0IGRlbGltaXRlciAobGlrZSBubCkgKi8KK307CisKK3N0cnVjdCBsdGNoYXJzIHsKKwl1bnNpZ25lZCBzaXg7CS8qIGFsd2F5cyBlcXVhbHMgNiAqLworCW9wYXF1ZSBjaGFyc1s2XTsKKwkvKiBjaGFyc1swXSA9PSBzdG9wIHByb2Nlc3Mgc2lnbmFsICovCisJLyogY2hhcnNbMV0gPT0gZGVsYXllZCBzdG9wIHByb2Nlc3Mgc2lnbmFsICovCisJLyogY2hhcnNbMl0gPT0gcmVwcmludCBsaW5lICovCisJLyogY2hhcnNbM10gPT0gZmx1c2ggb3V0cHV0ICovCisJLyogY2hhcnNbNF0gPT0gd29yZCBlcmFzZSAqLworCS8qIGNoYXJzWzVdID09IGxpdGVyYWwgbmV4dCBjaGFyYWN0ZXIgKi8KKwl1bnNpZ25lZCBtb2RlOworfTsKKworc3RydWN0IHJleF90dHlzaXplIHsKKwlpbnQgdHNfbGluZXM7CisJaW50IHRzX2NvbHM7Cit9OworCitzdHJ1Y3QgcmV4X3R0eW1vZGUgeworICAgIHNndHR5YiBiYXNpYzsgICAgLyogc3RhbmRhcmQgdW5peCB0dHkgZmxhZ3MgKi8KKyAgICB0Y2hhcnMgbW9yZTsgLyogaW50ZXJydXB0LCBraWxsIGNoYXJhY3RlcnMsIGV0Yy4gKi8KKyAgICBsdGNoYXJzIHlldG1vcmU7IC8qIHNwZWNpYWwgQmVya2VsZXkgY2hhcmFjdGVycyAqLworICAgIHVuc2lnbmVkIGFuZG1vcmU7ICAgICAvKiBhbmQgQmVya2VsZXkgbW9kZXMgKi8KK307CisKKy8qIHZhbHVlcyBmb3IgYW5kbW9yZSBhYm92ZSAqLworY29uc3QgTENSVEJTID0gMHgwMDAxOwkvKiBkbyBiYWNrc3BhY2luZyBmb3IgY3J0ICovCitjb25zdCBMUFJURVJBID0gMHgwMDAyOwkvKiBcIC4uLiAvIGVyYXNlICovCitjb25zdCBMQ1JURVJBID0gMHgwMDA0OwkvKiAiIFxiICIgdG8gd2lwZSBvdXQgY2hhciAqLworY29uc3QgTFRJTERFID0gMHgwMDA4OwkvKiBoYXplbHRpbmUgdGlsZGUga2x1ZGdlICovCitjb25zdCBMTURNQlVGID0gMHgwMDEwOwkvKiBzdGFydC9zdG9wIG91dHB1dCBvbiBjYXJyaWVyIGludHIgKi8KK2NvbnN0IExMSVRPVVQgPSAweDAwMjA7CS8qIGxpdGVyYWwgb3V0cHV0ICovCitjb25zdCBMVE9TVE9QID0gMHgwMDQwOwkvKiBTSUdUVE9VIG9uIGJhY2tncm91bmQgb3V0cHV0ICovCitjb25zdCBMRkxVU0hPID0gMHgwMDgwOwkvKiBmbHVzaCBvdXRwdXQgdG8gdGVybWluYWwgKi8KK2NvbnN0IExOT0hBTkcgPSAweDAxMDA7CS8qIG5vIFNJR0hVUCBvbiBjYXJyaWVyIGRyb3AgKi8KK2NvbnN0IExMMDAxMDAwID0gMHgwMjAwOworY29uc3QgTENSVEtJTCA9IDB4MDQwMDsJLyoga2lsbCBsaW5lIHdpdGggIiBcYiAiICovCitjb25zdCBMUEFTUzggPSAweDA4MDA7Citjb25zdCBMQ1RMRUNIID0gMHgxMDAwOwkvKiBlY2hvIGNvbnRyb2wgY2hhcnMgYXMgXlggKi8KK2NvbnN0IExQRU5ESU4gPSAweDIwMDA7CS8qIG5lZWRzIHJlcmVhZCAqLworY29uc3QgTERFQ0NUUSA9IDB4NDAwMDsJLyogb25seSBeUSBzdGFydHMgYWZ0ZXIgXlMgKi8KK2NvbnN0IExOT0ZMU0ggPSAweDgwMDA7CS8qIG5vIG91dHB1dCBmbHVzaCBvbiBzaWduYWwgKi8KKworcHJvZ3JhbSBSRVhQUk9HIHsKKwl2ZXJzaW9uIFJFWFZFUlMgeworCisJCS8qCisJCSAqIFN0YXJ0IHJlbW90ZSBleGVjdXRpb24KKwkJICovCisJCXJleF9yZXN1bHQKKwkJUkVYUFJPQ19TVEFSVChyZXhfc3RhcnQpID0gMTsKKworCQkvKgorCQkgKiBXYWl0IGZvciByZW1vdGUgZXhlY3V0aW9uIHRvIHRlcm1pbmF0ZQorCQkgKi8KKwkJcmV4X3Jlc3VsdAorCQlSRVhQUk9DX1dBSVQodm9pZCkgPSAyOworCisJCS8qCisJCSAqIFNlbmQgdHR5IG1vZGVzCisJCSAqLworCQl2b2lkCisJCVJFWFBST0NfTU9ERVMocmV4X3R0eW1vZGUpID0gMzsKKworCQkvKgorCQkgKiBTZW5kIHdpbmRvdyBzaXplIGNoYW5nZQorCQkgKi8KKwkJdm9pZAorCQlSRVhQUk9DX1dJTkNIKHJleF90dHlzaXplKSA9IDQ7CisKKwkJLyoKKwkJICogU2VuZCBvdGhlciBzaWduYWwKKwkJICovCisJCXZvaWQKKwkJUkVYUFJPQ19TSUdOQUwoaW50KSA9IDU7CisJfSA9IDE7Cit9ID0gMTAwMDE3OwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnF1b3RhLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ycXVvdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTA2NDYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnF1b3RhLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9SUVVPVEFfSF9SUENHRU4KKyNkZWZpbmUgX1JRVU9UQV9IX1JQQ0dFTgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBSUV9QQVRITEVOIDEwMjQKKworc3RydWN0IGdldHF1b3RhX2FyZ3MgeworCWNoYXIgKmdxYV9wYXRocDsKKwlpbnQgZ3FhX3VpZDsKK307Cit0eXBlZGVmIHN0cnVjdCBnZXRxdW90YV9hcmdzIGdldHF1b3RhX2FyZ3M7CisKK3N0cnVjdCBycXVvdGEgeworCWludCBycV9ic2l6ZTsKKwlib29sX3QgcnFfYWN0aXZlOworCXVfaW50IHJxX2JoYXJkbGltaXQ7CisJdV9pbnQgcnFfYnNvZnRsaW1pdDsKKwl1X2ludCBycV9jdXJibG9ja3M7CisJdV9pbnQgcnFfZmhhcmRsaW1pdDsKKwl1X2ludCBycV9mc29mdGxpbWl0OworCXVfaW50IHJxX2N1cmZpbGVzOworCXVfaW50IHJxX2J0aW1lbGVmdDsKKwl1X2ludCBycV9mdGltZWxlZnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcnF1b3RhIHJxdW90YTsKKworZW51bSBncXJfc3RhdHVzIHsKKwlRX09LID0gMSwKKwlRX05PUVVPVEEgPSAyLAorCVFfRVBFUk0gPSAzLAorfTsKK3R5cGVkZWYgZW51bSBncXJfc3RhdHVzIGdxcl9zdGF0dXM7CisKK3N0cnVjdCBnZXRxdW90YV9yc2x0IHsKKwlncXJfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiB7CisJCXJxdW90YSBncXJfcnF1b3RhOworCX0gZ2V0cXVvdGFfcnNsdF91OworfTsKK3R5cGVkZWYgc3RydWN0IGdldHF1b3RhX3JzbHQgZ2V0cXVvdGFfcnNsdDsKKworI2RlZmluZSBSUVVPVEFQUk9HIDEwMDAxMQorI2RlZmluZSBSUVVPVEFWRVJTIDEKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIFJRVU9UQVBST0NfR0VUUVVPVEEgMQorZXh0ZXJuICBnZXRxdW90YV9yc2x0ICogcnF1b3RhcHJvY19nZXRxdW90YV8xKGdldHF1b3RhX2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBnZXRxdW90YV9yc2x0ICogcnF1b3RhcHJvY19nZXRxdW90YV8xX3N2YyhnZXRxdW90YV9hcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBSUVVPVEFQUk9DX0dFVEFDVElWRVFVT1RBIDIKK2V4dGVybiAgZ2V0cXVvdGFfcnNsdCAqIHJxdW90YXByb2NfZ2V0YWN0aXZlcXVvdGFfMShnZXRxdW90YV9hcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgZ2V0cXVvdGFfcnNsdCAqIHJxdW90YXByb2NfZ2V0YWN0aXZlcXVvdGFfMV9zdmMoZ2V0cXVvdGFfYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgcnF1b3RhcHJvZ18xX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworI2Vsc2UgLyogSyZSIEMgKi8KKyNkZWZpbmUgUlFVT1RBUFJPQ19HRVRRVU9UQSAxCitleHRlcm4gIGdldHF1b3RhX3JzbHQgKiBycXVvdGFwcm9jX2dldHF1b3RhXzEoKTsKK2V4dGVybiAgZ2V0cXVvdGFfcnNsdCAqIHJxdW90YXByb2NfZ2V0cXVvdGFfMV9zdmMoKTsKKyNkZWZpbmUgUlFVT1RBUFJPQ19HRVRBQ1RJVkVRVU9UQSAyCitleHRlcm4gIGdldHF1b3RhX3JzbHQgKiBycXVvdGFwcm9jX2dldGFjdGl2ZXF1b3RhXzEoKTsKK2V4dGVybiAgZ2V0cXVvdGFfcnNsdCAqIHJxdW90YXByb2NfZ2V0YWN0aXZlcXVvdGFfMV9zdmMoKTsKK2V4dGVybiBpbnQgcnF1b3RhcHJvZ18xX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKworLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGJvb2xfdCB4ZHJfZ2V0cXVvdGFfYXJncyAoWERSICosIGdldHF1b3RhX2FyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ycXVvdGEgKFhEUiAqLCBycXVvdGEqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ncXJfc3RhdHVzIChYRFIgKiwgZ3FyX3N0YXR1cyopOworZXh0ZXJuICBib29sX3QgeGRyX2dldHF1b3RhX3JzbHQgKFhEUiAqLCBnZXRxdW90YV9yc2x0Kik7CisKKyNlbHNlIC8qIEsmUiBDICovCitleHRlcm4gYm9vbF90IHhkcl9nZXRxdW90YV9hcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcnF1b3RhICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZ3FyX3N0YXR1cyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2dldHF1b3RhX3JzbHQgKCk7CisKKyNlbmRpZiAvKiBLJlIgQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9SUVVPVEFfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JxdW90YS54IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnF1b3RhLngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4ODhmNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JxdW90YS54CkBAIC0wLDAgKzEsNjEgQEAKKy8qIEAoIylycXVvdGEueAkyLjEgODgvMDgvMDEgNC4wIFJQQ1NSQyAqLworLyogQCgjKXJxdW90YS54IDEuMiA4Ny8wOS8yMCBDb3B5ciAxOTg3IFN1biBNaWNybyAqLworCisvKgorICogUmVtb3RlIHF1b3RhIHByb3RvY29sCisgKiBSZXF1aXJlcyB1bml4IGF1dGhlbnRpY2F0aW9uCisgKi8KKworY29uc3QgUlFfUEFUSExFTiA9IDEwMjQ7CisKK3N0cnVjdCBnZXRxdW90YV9hcmdzIHsKKwlzdHJpbmcgZ3FhX3BhdGhwPFJRX1BBVEhMRU4+OyAgCS8qIHBhdGggdG8gZmlsZXN5c3RlbSBvZiBpbnRlcmVzdCAqLworCWludCBncWFfdWlkOwkgICAgICAgIAkvKiBpbnF1aXJlIGFib3V0IHF1b3RhIGZvciB1aWQgKi8KK307CisKKy8qCisgKiByZW1vdGUgcXVvdGEgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBycXVvdGEgeworCWludCBycV9ic2l6ZTsJCQkvKiBibG9jayBzaXplIGZvciBibG9jayBjb3VudHMgKi8KKwlib29sIHJxX2FjdGl2ZTsgIAkJLyogaW5kaWNhdGVzIHdoZXRoZXIgcXVvdGEgaXMgYWN0aXZlICovCisJdW5zaWduZWQgaW50IHJxX2JoYXJkbGltaXQ7CS8qIGFic29sdXRlIGxpbWl0IG9uIGRpc2sgYmxrcyBhbGxvYyAqLworCXVuc2lnbmVkIGludCBycV9ic29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgbGltaXQgb24gZGlzayBibGtzICovCisJdW5zaWduZWQgaW50IHJxX2N1cmJsb2NrczsJLyogY3VycmVudCBibG9jayBjb3VudCAqLworCXVuc2lnbmVkIGludCBycV9maGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBhbGxvY2F0ZWQgZmlsZXMgKi8KKwl1bnNpZ25lZCBpbnQgcnFfZnNvZnRsaW1pdDsJLyogcHJlZmVycmVkIGZpbGUgbGltaXQgKi8KKwl1bnNpZ25lZCBpbnQgcnFfY3VyZmlsZXM7CS8qIGN1cnJlbnQgIyBhbGxvY2F0ZWQgZmlsZXMgKi8KKwl1bnNpZ25lZCBpbnQgcnFfYnRpbWVsZWZ0OwkvKiB0aW1lIGxlZnQgZm9yIGV4Y2Vzc2l2ZSBkaXNrIHVzZSAqLworCXVuc2lnbmVkIGludCBycV9mdGltZWxlZnQ7CS8qIHRpbWUgbGVmdCBmb3IgZXhjZXNzaXZlIGZpbGVzICovCit9OwkKKworZW51bSBncXJfc3RhdHVzIHsKKwlRX09LID0gMSwJCS8qIHF1b3RhIHJldHVybmVkICovCisJUV9OT1FVT1RBID0gMiwgIAkvKiBub3F1b3RhIGZvciB1aWQgKi8KKwlRX0VQRVJNID0gMwkJLyogbm8gcGVybWlzc2lvbiB0byBhY2Nlc3MgcXVvdGEgKi8KK307CisKK3VuaW9uIGdldHF1b3RhX3JzbHQgc3dpdGNoIChncXJfc3RhdHVzIHN0YXR1cykgeworY2FzZSBRX09LOgorCXJxdW90YSBncXJfcnF1b3RhOwkvKiB2YWxpZCBpZiBzdGF0dXMgPT0gUV9PSyAqLworY2FzZSBRX05PUVVPVEE6CisJdm9pZDsKK2Nhc2UgUV9FUEVSTToKKwl2b2lkOworfTsKKworcHJvZ3JhbSBSUVVPVEFQUk9HIHsKKwl2ZXJzaW9uIFJRVU9UQVZFUlMgeworCQkvKgorCQkgKiBHZXQgYWxsIHF1b3RhcworCQkgKi8KKwkJZ2V0cXVvdGFfcnNsdAorCQlSUVVPVEFQUk9DX0dFVFFVT1RBKGdldHF1b3RhX2FyZ3MpID0gMTsKKworCQkvKgorCSAJICogR2V0IGFjdGl2ZSBxdW90YXMgb25seQorCQkgKi8KKwkJZ2V0cXVvdGFfcnNsdAorCQlSUVVPVEFQUk9DX0dFVEFDVElWRVFVT1RBKGdldHF1b3RhX2FyZ3MpID0gMjsKKwl9ID0gMTsKK30gPSAxMDAwMTE7CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yc3RhdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmMwYmE4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnN0YXQuaApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9SU1RBVF9IX1JQQ0dFTgorI2RlZmluZSBfUlNUQVRfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgRlNDQUxFCisvKgorICogU2NhbGUgZmFjdG9yIGZvciBzY2FsZWQgaW50ZWdlcnMgdXNlZCB0byBjb3VudCBsb2FkIGF2ZXJhZ2VzLgorICovCisjZGVmaW5lIEZTSElGVCA4IC8qIGJpdHMgdG8gcmlnaHQgb2YgZml4ZWQgYmluYXJ5IHBvaW50ICovCisjZGVmaW5lIEZTQ0FMRSAoMTw8RlNISUZUKQorCisjZW5kaWYgLyogbmRlZiBGU0NBTEUgKi8KKyNkZWZpbmUgQ1BVU1RBVEVTIDQKKyNkZWZpbmUgREtfTkRSSVZFIDQKKworc3RydWN0IHJzdGF0X3RpbWV2YWwgeworCXVfaW50IHR2X3NlYzsKKwl1X2ludCB0dl91c2VjOworfTsKK3R5cGVkZWYgc3RydWN0IHJzdGF0X3RpbWV2YWwgcnN0YXRfdGltZXZhbDsKKworc3RydWN0IHN0YXRzdGltZSB7CisJaW50IGNwX3RpbWVbQ1BVU1RBVEVTXTsKKwlpbnQgZGtfeGZlcltES19ORFJJVkVdOworCXVfaW50IHZfcGdwZ2luOworCXVfaW50IHZfcGdwZ291dDsKKwl1X2ludCB2X3Bzd3BpbjsKKwl1X2ludCB2X3Bzd3BvdXQ7CisJdV9pbnQgdl9pbnRyOworCWludCBpZl9pcGFja2V0czsKKwlpbnQgaWZfaWVycm9yczsKKwlpbnQgaWZfb2Vycm9yczsKKwlpbnQgaWZfY29sbGlzaW9uczsKKwl1X2ludCB2X3N3dGNoOworCWludCBhdmVucnVuWzNdOworCXJzdGF0X3RpbWV2YWwgYm9vdHRpbWU7CisJcnN0YXRfdGltZXZhbCBjdXJ0aW1lOworCWludCBpZl9vcGFja2V0czsKK307Cit0eXBlZGVmIHN0cnVjdCBzdGF0c3RpbWUgc3RhdHN0aW1lOworCitzdHJ1Y3Qgc3RhdHNzd3RjaCB7CisJaW50IGNwX3RpbWVbQ1BVU1RBVEVTXTsKKwlpbnQgZGtfeGZlcltES19ORFJJVkVdOworCXVfaW50IHZfcGdwZ2luOworCXVfaW50IHZfcGdwZ291dDsKKwl1X2ludCB2X3Bzd3BpbjsKKwl1X2ludCB2X3Bzd3BvdXQ7CisJdV9pbnQgdl9pbnRyOworCWludCBpZl9pcGFja2V0czsKKwlpbnQgaWZfaWVycm9yczsKKwlpbnQgaWZfb2Vycm9yczsKKwlpbnQgaWZfY29sbGlzaW9uczsKKwl1X2ludCB2X3N3dGNoOworCXVfaW50IGF2ZW5ydW5bM107CisJcnN0YXRfdGltZXZhbCBib290dGltZTsKKwlpbnQgaWZfb3BhY2tldHM7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc3RhdHNzd3RjaCBzdGF0c3N3dGNoOworCitzdHJ1Y3Qgc3RhdHMgeworCWludCBjcF90aW1lW0NQVVNUQVRFU107CisJaW50IGRrX3hmZXJbREtfTkRSSVZFXTsKKwl1X2ludCB2X3BncGdpbjsKKwl1X2ludCB2X3BncGdvdXQ7CisJdV9pbnQgdl9wc3dwaW47CisJdV9pbnQgdl9wc3dwb3V0OworCXVfaW50IHZfaW50cjsKKwlpbnQgaWZfaXBhY2tldHM7CisJaW50IGlmX2llcnJvcnM7CisJaW50IGlmX29lcnJvcnM7CisJaW50IGlmX2NvbGxpc2lvbnM7CisJaW50IGlmX29wYWNrZXRzOworfTsKK3R5cGVkZWYgc3RydWN0IHN0YXRzIHN0YXRzOworCisjZGVmaW5lIFJTVEFUUFJPRyAxMDAwMDEKKyNkZWZpbmUgUlNUQVRWRVJTX1RJTUUgMworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgUlNUQVRQUk9DX1NUQVRTIDEKK2V4dGVybiAgc3RhdHN0aW1lICogcnN0YXRwcm9jX3N0YXRzXzModm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHN0YXRzdGltZSAqIHJzdGF0cHJvY19zdGF0c18zX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBSU1RBVFBST0NfSEFWRURJU0sgMgorZXh0ZXJuICB1X2ludCAqIHJzdGF0cHJvY19oYXZlZGlza18zKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB1X2ludCAqIHJzdGF0cHJvY19oYXZlZGlza18zX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCByc3RhdHByb2dfM19mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIFJTVEFUUFJPQ19TVEFUUyAxCitleHRlcm4gIHN0YXRzdGltZSAqIHJzdGF0cHJvY19zdGF0c18zKCk7CitleHRlcm4gIHN0YXRzdGltZSAqIHJzdGF0cHJvY19zdGF0c18zX3N2YygpOworI2RlZmluZSBSU1RBVFBST0NfSEFWRURJU0sgMgorZXh0ZXJuICB1X2ludCAqIHJzdGF0cHJvY19oYXZlZGlza18zKCk7CitleHRlcm4gIHVfaW50ICogcnN0YXRwcm9jX2hhdmVkaXNrXzNfc3ZjKCk7CitleHRlcm4gaW50IHJzdGF0cHJvZ18zX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKyNkZWZpbmUgUlNUQVRWRVJTX1NXVENIIDIKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIHN0YXRzc3d0Y2ggKiByc3RhdHByb2Nfc3RhdHNfMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgc3RhdHNzd3RjaCAqIHJzdGF0cHJvY19zdGF0c18yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuICB1X2ludCAqIHJzdGF0cHJvY19oYXZlZGlza18yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB1X2ludCAqIHJzdGF0cHJvY19oYXZlZGlza18yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCByc3RhdHByb2dfMl9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCitleHRlcm4gIHN0YXRzc3d0Y2ggKiByc3RhdHByb2Nfc3RhdHNfMigpOworZXh0ZXJuICBzdGF0c3N3dGNoICogcnN0YXRwcm9jX3N0YXRzXzJfc3ZjKCk7CitleHRlcm4gIHVfaW50ICogcnN0YXRwcm9jX2hhdmVkaXNrXzIoKTsKK2V4dGVybiAgdV9pbnQgKiByc3RhdHByb2NfaGF2ZWRpc2tfMl9zdmMoKTsKK2V4dGVybiBpbnQgcnN0YXRwcm9nXzJfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworI2RlZmluZSBSU1RBVFZFUlNfT1JJRyAxCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBzdGF0cyAqIHJzdGF0cHJvY19zdGF0c18xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBzdGF0cyAqIHJzdGF0cHJvY19zdGF0c18xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuICB1X2ludCAqIHJzdGF0cHJvY19oYXZlZGlza18xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB1X2ludCAqIHJzdGF0cHJvY19oYXZlZGlza18xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCByc3RhdHByb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCitleHRlcm4gIHN0YXRzICogcnN0YXRwcm9jX3N0YXRzXzEoKTsKK2V4dGVybiAgc3RhdHMgKiByc3RhdHByb2Nfc3RhdHNfMV9zdmMoKTsKK2V4dGVybiAgdV9pbnQgKiByc3RhdHByb2NfaGF2ZWRpc2tfMSgpOworZXh0ZXJuICB1X2ludCAqIHJzdGF0cHJvY19oYXZlZGlza18xX3N2YygpOworZXh0ZXJuIGludCByc3RhdHByb2dfMV9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX3JzdGF0X3RpbWV2YWwgKFhEUiAqLCByc3RhdF90aW1ldmFsKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfc3RhdHN0aW1lIChYRFIgKiwgc3RhdHN0aW1lKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfc3RhdHNzd3RjaCAoWERSICosIHN0YXRzc3d0Y2gqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9zdGF0cyAoWERSICosIHN0YXRzKik7CisKKyNlbHNlIC8qIEsmUiBDICovCitleHRlcm4gYm9vbF90IHhkcl9yc3RhdF90aW1ldmFsICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfc3RhdHN0aW1lICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfc3RhdHNzd3RjaCAoKTsKK2V4dGVybiBib29sX3QgeGRyX3N0YXRzICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfUlNUQVRfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JzdGF0LnggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yc3RhdC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2IxMDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yc3RhdC54CkBAIC0wLDAgKzEsMTQ1IEBACisvKiBAKCMpcnN0YXQueAkyLjIgODgvMDgvMDEgNC4wIFJQQ1NSQyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogR2F0aGVyIHN0YXRpc3RpY3Mgb24gcmVtb3RlIG1hY2hpbmVzCisgKi8KKworI2lmZGVmIFJQQ19IRFIKKworJSNpZm5kZWYgRlNDQUxFCislLyoKKyUgKiBTY2FsZSBmYWN0b3IgZm9yIHNjYWxlZCBpbnRlZ2VycyB1c2VkIHRvIGNvdW50IGxvYWQgYXZlcmFnZXMuCislICovCislI2RlZmluZSBGU0hJRlQgIDggICAgICAgICAgICAgICAvKiBiaXRzIHRvIHJpZ2h0IG9mIGZpeGVkIGJpbmFyeSBwb2ludCAqLworJSNkZWZpbmUgRlNDQUxFICAoMTw8RlNISUZUKQorJQorJSNlbmRpZiAvKiBuZGVmIEZTQ0FMRSAqLworCisjZW5kaWYgLyogZGVmIFJQQ19IRFIgKi8KKworY29uc3QgQ1BVU1RBVEVTID0gNDsKK2NvbnN0IERLX05EUklWRSA9IDQ7CisKKy8qCisgKiBHTVQgc2luY2UgMDowMCwgSmFudWFyeSAxLCAxOTcwCisgKi8KK3N0cnVjdCByc3RhdF90aW1ldmFsIHsKKwl1bnNpZ25lZCBpbnQgdHZfc2VjOwkvKiBzZWNvbmRzICovCisJdW5zaWduZWQgaW50IHR2X3VzZWM7CS8qIGFuZCBtaWNyb3NlY29uZHMgKi8KK307CisKK3N0cnVjdCBzdGF0c3RpbWUgewkJCQkvKiBSU1RBVFZFUlNfVElNRSAqLworCWludCBjcF90aW1lW0NQVVNUQVRFU107CisJaW50IGRrX3hmZXJbREtfTkRSSVZFXTsKKwl1bnNpZ25lZCBpbnQgdl9wZ3BnaW47CS8qIHRoZXNlIGFyZSBjdW11bGF0aXZlIHN1bSAqLworCXVuc2lnbmVkIGludCB2X3BncGdvdXQ7CisJdW5zaWduZWQgaW50IHZfcHN3cGluOworCXVuc2lnbmVkIGludCB2X3Bzd3BvdXQ7CisJdW5zaWduZWQgaW50IHZfaW50cjsKKwlpbnQgaWZfaXBhY2tldHM7CisJaW50IGlmX2llcnJvcnM7CisJaW50IGlmX29lcnJvcnM7CisJaW50IGlmX2NvbGxpc2lvbnM7CisJdW5zaWduZWQgaW50IHZfc3d0Y2g7CisJaW50IGF2ZW5ydW5bM107ICAgICAgICAgLyogc2NhbGVkIGJ5IEZTQ0FMRSAqLworCXJzdGF0X3RpbWV2YWwgYm9vdHRpbWU7CisJcnN0YXRfdGltZXZhbCBjdXJ0aW1lOworCWludCBpZl9vcGFja2V0czsKK307CisKK3N0cnVjdCBzdGF0c3N3dGNoIHsJCQkvKiBSU1RBVFZFUlNfU1dUQ0ggKi8KKwlpbnQgY3BfdGltZVtDUFVTVEFURVNdOworCWludCBka194ZmVyW0RLX05EUklWRV07CisJdW5zaWduZWQgaW50IHZfcGdwZ2luOwkvKiB0aGVzZSBhcmUgY3VtdWxhdGl2ZSBzdW0gKi8KKwl1bnNpZ25lZCBpbnQgdl9wZ3Bnb3V0OworCXVuc2lnbmVkIGludCB2X3Bzd3BpbjsKKwl1bnNpZ25lZCBpbnQgdl9wc3dwb3V0OworCXVuc2lnbmVkIGludCB2X2ludHI7CisJaW50IGlmX2lwYWNrZXRzOworCWludCBpZl9pZXJyb3JzOworCWludCBpZl9vZXJyb3JzOworCWludCBpZl9jb2xsaXNpb25zOworCXVuc2lnbmVkIGludCB2X3N3dGNoOworCXVuc2lnbmVkIGludCBhdmVucnVuWzNdOy8qIHNjYWxlZCBieSBGU0NBTEUgKi8KKwlyc3RhdF90aW1ldmFsIGJvb3R0aW1lOworCWludCBpZl9vcGFja2V0czsKK307CisKK3N0cnVjdCBzdGF0cyB7CQkJCS8qIFJTVEFUVkVSU19PUklHICovCisJaW50IGNwX3RpbWVbQ1BVU1RBVEVTXTsKKwlpbnQgZGtfeGZlcltES19ORFJJVkVdOworCXVuc2lnbmVkIGludCB2X3BncGdpbjsJLyogdGhlc2UgYXJlIGN1bXVsYXRpdmUgc3VtICovCisJdW5zaWduZWQgaW50IHZfcGdwZ291dDsKKwl1bnNpZ25lZCBpbnQgdl9wc3dwaW47CisJdW5zaWduZWQgaW50IHZfcHN3cG91dDsKKwl1bnNpZ25lZCBpbnQgdl9pbnRyOworCWludCBpZl9pcGFja2V0czsKKwlpbnQgaWZfaWVycm9yczsKKwlpbnQgaWZfb2Vycm9yczsKKwlpbnQgaWZfY29sbGlzaW9uczsKKwlpbnQgaWZfb3BhY2tldHM7Cit9OworCisKK3Byb2dyYW0gUlNUQVRQUk9HIHsKKwkvKgorCSAqIE5ld2VzdCB2ZXJzaW9uIGluY2x1ZGVzIGN1cnJlbnQgdGltZSBhbmQgY29udGV4dCBzd2l0Y2hpbmcgaW5mbworCSAqLworCXZlcnNpb24gUlNUQVRWRVJTX1RJTUUgeworCQlzdGF0c3RpbWUKKwkJUlNUQVRQUk9DX1NUQVRTKHZvaWQpID0gMTsKKworCQl1bnNpZ25lZCBpbnQKKwkJUlNUQVRQUk9DX0hBVkVESVNLKHZvaWQpID0gMjsKKwl9ID0gMzsKKwkvKgorCSAqIERvZXMgbm90IGhhdmUgY3VycmVudCB0aW1lCisJICovCisJdmVyc2lvbiBSU1RBVFZFUlNfU1dUQ0ggeworCQlzdGF0c3N3dGNoCisJCVJTVEFUUFJPQ19TVEFUUyh2b2lkKSA9IDE7CisKKwkJdW5zaWduZWQgaW50CisJCVJTVEFUUFJPQ19IQVZFRElTSyh2b2lkKSA9IDI7CisJfSA9IDI7CisJLyoKKwkgKiBPbGQgdmVyc2lvbiBoYXMgbm8gaW5mbyBhYm91dCBjdXJyZW50IHRpbWUgb3IgY29udGV4dCBzd2l0Y2hpbmcKKwkgKi8KKwl2ZXJzaW9uIFJTVEFUVkVSU19PUklHIHsKKwkJc3RhdHMKKwkJUlNUQVRQUk9DX1NUQVRTKHZvaWQpID0gMTsKKworCQl1bnNpZ25lZCBpbnQKKwkJUlNUQVRQUk9DX0hBVkVESVNLKHZvaWQpID0gMjsKKwl9ID0gMTsKK30gPSAxMDAwMDE7CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ydXNlcnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3J1c2Vycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMmQzYjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ydXNlcnMuaApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9SVVNFUlNfSF9SUENHRU4KKyNkZWZpbmUgX1JVU0VSU19IX1JQQ0dFTgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyAqIEZpbmQgb3V0IGFib3V0IHJlbW90ZSB1c2VycworICovCisjZGVmaW5lIFJVU0VSU19NQVhVU0VSTEVOIDMyCisjZGVmaW5lIFJVU0VSU19NQVhMSU5FTEVOIDMyCisjZGVmaW5lIFJVU0VSU19NQVhIT1NUTEVOIDI1NworCitzdHJ1Y3QgcnVzZXJzX3V0bXAgeworCWNoYXIgKnV0X3VzZXI7CisJY2hhciAqdXRfbGluZTsKKwljaGFyICp1dF9ob3N0OworCWludCB1dF90eXBlOworCWludCB1dF90aW1lOworCXVfaW50IHV0X2lkbGU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcnVzZXJzX3V0bXAgcnVzZXJzX3V0bXA7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1X2ludCB1dG1wX2FycmF5X2xlbjsKKwlydXNlcnNfdXRtcCAqdXRtcF9hcnJheV92YWw7Cit9IHV0bXBfYXJyYXk7CisKKy8qCisgKiBWYWx1ZXMgZm9yIHV0X3R5cGUgZmllbGQgYWJvdmUuCisgKi8KKyNkZWZpbmUgUlVTRVJTX0VNUFRZIDAKKyNkZWZpbmUgUlVTRVJTX1JVTl9MVkwgMQorI2RlZmluZSBSVVNFUlNfQk9PVF9USU1FIDIKKyNkZWZpbmUgUlVTRVJTX09MRF9USU1FIDMKKyNkZWZpbmUgUlVTRVJTX05FV19USU1FIDQKKyNkZWZpbmUgUlVTRVJTX0lOSVRfUFJPQ0VTUyA1CisjZGVmaW5lIFJVU0VSU19MT0dJTl9QUk9DRVNTIDYKKyNkZWZpbmUgUlVTRVJTX1VTRVJfUFJPQ0VTUyA3CisjZGVmaW5lIFJVU0VSU19ERUFEX1BST0NFU1MgOAorI2RlZmluZSBSVVNFUlNfQUNDT1VOVElORyA5CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8cnBjL3hkci5oPgorCisvKgorICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGJ5IHZlcnNpb24gMiBvZiB0aGUgcnVzZXJzZCBwcm90b2NvbC4KKyAqIFRoZXkgd2VyZSBub3QgZGV2ZWxvcGVkIHdpdGggcnBjZ2VuLCBzbyB0aGV5IGRvIG5vdCBhcHBlYXIgYXMgUlBDTC4KKyAqLworCisjZGVmaW5lIFJVU0VSU1ZFUlNfSURMRSAyCisjZGVmaW5lIFJVU0VSU1ZFUlMgMyAvKiBjdXJyZW50IHZlcnNpb24gKi8KKyNkZWZpbmUgTUFYVVNFUlMgMTAwCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgdXNlZCBpbiB2ZXJzaW9uIDIgb2YgdGhlIHJ1c2Vyc2QgUlBDIHNlcnZpY2UuCisgKiBJdCBjb3JyZXNwb25kcyB0byB0aGUgdXRtcCBzdHJ1Y3R1cmUgZm9yIEJTRCBzeXN0ZW1zLgorICovCitzdHJ1Y3QgcnVfdXRtcCB7CisgY2hhciB1dF9saW5lWzhdOyAvKiB0dHkgbmFtZSAqLworIGNoYXIgdXRfbmFtZVs4XTsgLyogdXNlciBpZCAqLworIGNoYXIgdXRfaG9zdFsxNl07IC8qIGhvc3QgbmFtZSwgaWYgcmVtb3RlICovCisgbG9uZyBpbnQgdXRfdGltZTsgLyogdGltZSBvbiAqLworfTsKKworc3RydWN0IHV0bXBhcnIgeworIHN0cnVjdCBydV91dG1wICoqdXRhX2FycjsKKyBpbnQgdXRhX2NudDsKK307Cit0eXBlZGVmIHN0cnVjdCB1dG1wYXJyIHV0bXBhcnI7CisKK2V4dGVybiBib29sX3QgeGRyX3V0bXBhcnIgKFhEUiAqeGRycywgc3RydWN0IHV0bXBhcnIgKm9ianApIF9fVEhST1c7CisKK3N0cnVjdCB1dG1waWRsZSB7Cisgc3RydWN0IHJ1X3V0bXAgdWlfdXRtcDsKKyB1bnNpZ25lZCBpbnQgdWlfaWRsZTsKK307CisKK3N0cnVjdCB1dG1waWRsZWFyciB7Cisgc3RydWN0IHV0bXBpZGxlICoqdWlhX2FycjsKKyBpbnQgdWlhX2NudDsKK307CisKK2V4dGVybiBib29sX3QgeGRyX3V0bXBpZGxlYXJyIChYRFIgKnhkcnMsIHN0cnVjdCB1dG1waWRsZWFyciAqb2JqcCkgX19USFJPVzsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2RlZmluZSBSVVNFUlNQUk9HIDEwMDAwMgorI2RlZmluZSBSVVNFUlNWRVJTXzMgMworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgUlVTRVJTUFJPQ19OVU0gMQorZXh0ZXJuICBpbnQgKiBydXNlcnNwcm9jX251bV8zKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBpbnQgKiBydXNlcnNwcm9jX251bV8zX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBSVVNFUlNQUk9DX05BTUVTIDIKK2V4dGVybiAgdXRtcF9hcnJheSAqIHJ1c2Vyc3Byb2NfbmFtZXNfMyh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdXRtcF9hcnJheSAqIHJ1c2Vyc3Byb2NfbmFtZXNfM19zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgUlVTRVJTUFJPQ19BTExOQU1FUyAzCitleHRlcm4gIHV0bXBfYXJyYXkgKiBydXNlcnNwcm9jX2FsbG5hbWVzXzModm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHV0bXBfYXJyYXkgKiBydXNlcnNwcm9jX2FsbG5hbWVzXzNfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IHJ1c2Vyc3Byb2dfM19mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIFJVU0VSU1BST0NfTlVNIDEKK2V4dGVybiAgaW50ICogcnVzZXJzcHJvY19udW1fMygpOworZXh0ZXJuICBpbnQgKiBydXNlcnNwcm9jX251bV8zX3N2YygpOworI2RlZmluZSBSVVNFUlNQUk9DX05BTUVTIDIKK2V4dGVybiAgdXRtcF9hcnJheSAqIHJ1c2Vyc3Byb2NfbmFtZXNfMygpOworZXh0ZXJuICB1dG1wX2FycmF5ICogcnVzZXJzcHJvY19uYW1lc18zX3N2YygpOworI2RlZmluZSBSVVNFUlNQUk9DX0FMTE5BTUVTIDMKK2V4dGVybiAgdXRtcF9hcnJheSAqIHJ1c2Vyc3Byb2NfYWxsbmFtZXNfMygpOworZXh0ZXJuICB1dG1wX2FycmF5ICogcnVzZXJzcHJvY19hbGxuYW1lc18zX3N2YygpOworZXh0ZXJuIGludCBydXNlcnNwcm9nXzNfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworCisvKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAgYm9vbF90IHhkcl9ydXNlcnNfdXRtcCAoWERSICosIHJ1c2Vyc191dG1wKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfdXRtcF9hcnJheSAoWERSICosIHV0bXBfYXJyYXkqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX3J1c2Vyc191dG1wICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfdXRtcF9hcnJheSAoKTsKKworI2VuZGlmIC8qIEsmUiBDICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhX1JVU0VSU19IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnVzZXJzLnggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ydXNlcnMueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzZlZDc0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnVzZXJzLngKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCislLyoKKyUgKiBGaW5kIG91dCBhYm91dCByZW1vdGUgdXNlcnMKKyUgKi8KKworY29uc3QgUlVTRVJTX01BWFVTRVJMRU4gPSAzMjsKK2NvbnN0IFJVU0VSU19NQVhMSU5FTEVOID0gMzI7Citjb25zdCBSVVNFUlNfTUFYSE9TVExFTiA9IDI1NzsKKworc3RydWN0IHJ1c2Vyc191dG1wIHsKKwlzdHJpbmcgdXRfdXNlcjxSVVNFUlNfTUFYVVNFUkxFTj47CS8qIGFrYSB1dF9uYW1lICovCisJc3RyaW5nIHV0X2xpbmU8UlVTRVJTX01BWExJTkVMRU4+OwkvKiBkZXZpY2UgKi8KKwlzdHJpbmcgdXRfaG9zdDxSVVNFUlNfTUFYSE9TVExFTj47CS8qIGhvc3QgdXNlciBsb2dnZWQgb24gZnJvbSAqLworCWludCB1dF90eXBlOwkJCQkvKiB0eXBlIG9mIGVudHJ5ICovCisJaW50IHV0X3RpbWU7CQkJCS8qIHRpbWUgZW50cnkgd2FzIG1hZGUgKi8KKwl1bnNpZ25lZCBpbnQgdXRfaWRsZTsJCQkvKiBtaW51dGVzIGlkbGUgKi8KK307CisKK3R5cGVkZWYgcnVzZXJzX3V0bXAgdXRtcF9hcnJheTw+OworCisjaWZkZWYgUlBDX0hEUgorJQorJS8qCislICogVmFsdWVzIGZvciB1dF90eXBlIGZpZWxkIGFib3ZlLgorJSAqLworI2VuZGlmCitjb25zdAlSVVNFUlNfRU1QVFkgPSAwOworY29uc3QJUlVTRVJTX1JVTl9MVkwgPSAxOworY29uc3QJUlVTRVJTX0JPT1RfVElNRSA9IDI7Citjb25zdAlSVVNFUlNfT0xEX1RJTUUgPSAzOworY29uc3QJUlVTRVJTX05FV19USU1FID0gNDsKK2NvbnN0CVJVU0VSU19JTklUX1BST0NFU1MgPSA1OworY29uc3QJUlVTRVJTX0xPR0lOX1BST0NFU1MgPSA2OworY29uc3QJUlVTRVJTX1VTRVJfUFJPQ0VTUyA9IDc7Citjb25zdAlSVVNFUlNfREVBRF9QUk9DRVNTID0gODsKK2NvbnN0CVJVU0VSU19BQ0NPVU5USU5HID0gOTsKKworcHJvZ3JhbSBSVVNFUlNQUk9HIHsKKworCXZlcnNpb24gUlVTRVJTVkVSU18zIHsKKwkJaW50CisJCVJVU0VSU1BST0NfTlVNKHZvaWQpID0gMTsKKworCQl1dG1wX2FycmF5CisJCVJVU0VSU1BST0NfTkFNRVModm9pZCkgPSAyOworCisJCXV0bXBfYXJyYXkKKwkJUlVTRVJTUFJPQ19BTExOQU1FUyh2b2lkKSA9IDM7CisJfSA9IDM7CisKK30gPSAxMDAwMDI7CisKKyNpZmRlZiBSUENfSERSCislCislCislI2lmZGVmCV9fY3BsdXNwbHVzCislZXh0ZXJuICJDIiB7CislI2VuZGlmCislCislI2luY2x1ZGUgPHJwYy94ZHIuaD4KKyUKKyUvKgorJSAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyBhcmUgdXNlZCBieSB2ZXJzaW9uIDIgb2YgdGhlIHJ1c2Vyc2QgcHJvdG9jb2wuCislICogVGhleSB3ZXJlIG5vdCBkZXZlbG9wZWQgd2l0aCBycGNnZW4sIHNvIHRoZXkgZG8gbm90IGFwcGVhciBhcyBSUENMLgorJSAqLworJQorJSNkZWZpbmUJUlVTRVJTVkVSU19JRExFIDIKKyUjZGVmaW5lCVJVU0VSU1ZFUlMgMwkJLyogY3VycmVudCB2ZXJzaW9uICovCislI2RlZmluZQlNQVhVU0VSUyAxMDAKKyUKKyUvKgorJSAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB1c2VkIGluIHZlcnNpb24gMiBvZiB0aGUgcnVzZXJzZCBSUEMgc2VydmljZS4KKyUgKiBJdCBjb3JyZXNwb25kcyB0byB0aGUgdXRtcCBzdHJ1Y3R1cmUgZm9yIEJTRCBzeXN0ZW1zLgorJSAqLworJXN0cnVjdCBydV91dG1wIHsKKyUJY2hhcgl1dF9saW5lWzhdOwkJLyogdHR5IG5hbWUgKi8KKyUJY2hhcgl1dF9uYW1lWzhdOwkJLyogdXNlciBpZCAqLworJQljaGFyCXV0X2hvc3RbMTZdOwkJLyogaG9zdCBuYW1lLCBpZiByZW1vdGUgKi8KKyUJbG9uZyBpbnQgdXRfdGltZTsJCS8qIHRpbWUgb24gKi8KKyV9OworJQorJXN0cnVjdCB1dG1wYXJyIHsKKyUgICAgICAgc3RydWN0IHJ1X3V0bXAgKip1dGFfYXJyOworJSAgICAgICBpbnQgdXRhX2NudDsKKyV9OworJXR5cGVkZWYgc3RydWN0IHV0bXBhcnIgdXRtcGFycjsKKyUKKyVleHRlcm4gYm9vbF90IHhkcl91dG1wYXJyIChYRFIgKnhkcnMsIHN0cnVjdCB1dG1wYXJyICpvYmpwKSBfX1RIUk9XOworJQorJXN0cnVjdCB1dG1waWRsZSB7CislCXN0cnVjdCBydV91dG1wIHVpX3V0bXA7CislCXVuc2lnbmVkIGludCB1aV9pZGxlOworJX07CislCislc3RydWN0IHV0bXBpZGxlYXJyIHsKKyUJc3RydWN0IHV0bXBpZGxlICoqdWlhX2FycjsKKyUJaW50IHVpYV9jbnQ7CislfTsKKyUKKyVleHRlcm4gYm9vbF90IHhkcl91dG1waWRsZWFyciAoWERSICp4ZHJzLCBzdHJ1Y3QgdXRtcGlkbGVhcnIgKm9ianApIF9fVEhST1c7CislCislI2lmZGVmCV9fY3BsdXNwbHVzCislfQorJSNlbmRpZgorI2VuZGlmCisKKworI2lmZGVmCVJQQ19YRFIKKyVib29sX3QgeGRyX3V0bXAgKFhEUiAqeGRycywgc3RydWN0IHJ1X3V0bXAgKm9ianApOworJQorJWJvb2xfdAorJXhkcl91dG1wKHhkcnMsIG9ianApCislCVhEUiAqeGRyczsKKyUJc3RydWN0IHJ1X3V0bXAgKm9ianA7CisleworJQkvKiBTaW5jZSB0aGUgZmllbGRzIGFyZSBjaGFyIGZvbyBbeHh4XSwgd2Ugc2hvdWxkIG5vdCBmcmVlIHRoZW0uICovCislCWlmICh4ZHJzLT54X29wICE9IFhEUl9GUkVFKQorJQl7CislCQljaGFyICpwdHI7CislCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKyUJCXB0ciA9IG9ianAtPnV0X2xpbmU7CislCQlzaXplID0gc2l6ZW9mIChvYmpwLT51dF9saW5lKTsKKyUJCWlmICgheGRyX2J5dGVzICh4ZHJzLCAmcHRyLCAmc2l6ZSwgc2l6ZSkpIHsKKyUJCQlyZXR1cm4gKEZBTFNFKTsKKyUJCX0KKyUJCXB0ciA9IG9ianAtPnV0X25hbWU7CislCQlzaXplID0gc2l6ZW9mIChvYmpwLT51dF9uYW1lKTsKKyUJCWlmICgheGRyX2J5dGVzICh4ZHJzLCAmcHRyLCAmc2l6ZSwgc2l6ZSkpIHsKKyUJCQlyZXR1cm4gKEZBTFNFKTsKKyUJCX0KKyUJCXB0ciA9IG9ianAtPnV0X2hvc3Q7CislCQlzaXplID0gc2l6ZW9mIChvYmpwLT51dF9ob3N0KTsKKyUJCWlmICgheGRyX2J5dGVzICh4ZHJzLCAmcHRyLCAmc2l6ZSwgc2l6ZSkpIHsKKyUJCQlyZXR1cm4gKEZBTFNFKTsKKyUJCX0KKyUJfQorJQlpZiAoIXhkcl9sb25nKHhkcnMsICZvYmpwLT51dF90aW1lKSkgeworJQkJcmV0dXJuIChGQUxTRSk7CislCX0KKyUJcmV0dXJuIChUUlVFKTsKKyV9CislCislYm9vbF90IHhkcl91dG1wcHRyKFhEUiAqeGRycywgc3RydWN0IHJ1X3V0bXAgKipvYmpwcCk7CislCislYm9vbF90CisleGRyX3V0bXBwdHIoeGRycywgb2JqcHApCislCVhEUiAqeGRyczsKKyUJc3RydWN0IHJ1X3V0bXAgKipvYmpwcDsKKyV7CislCWlmICgheGRyX3JlZmVyZW5jZSh4ZHJzLCAoY2hhciAqKikgb2JqcHAsIHNpemVvZiAoc3RydWN0IHJ1X3V0bXApLAorJQkJCSAgICh4ZHJwcm9jX3QpIHhkcl91dG1wKSkgeworJQkJcmV0dXJuIChGQUxTRSk7CislCX0KKyUJcmV0dXJuIChUUlVFKTsKKyV9CislCislYm9vbF90CisleGRyX3V0bXBhcnIoeGRycywgb2JqcCkKKyUJWERSICp4ZHJzOworJQlzdHJ1Y3QgdXRtcGFyciAqb2JqcDsKKyV7CislCWlmICgheGRyX2FycmF5KHhkcnMsIChjaGFyICoqKSZvYmpwLT51dGFfYXJyLCAodV9pbnQgKikmb2JqcC0+dXRhX2NudCwKKyUJCSAgICAgICBNQVhVU0VSUywgc2l6ZW9mKHN0cnVjdCBydV91dG1wICopLAorJQkJICAgICAgICh4ZHJwcm9jX3QpIHhkcl91dG1wcHRyKSkgeworJQkJcmV0dXJuIChGQUxTRSk7CislCX0KKyUJcmV0dXJuIChUUlVFKTsKKyV9CislCislYm9vbF90IHhkcl91dG1waWRsZShYRFIgKnhkcnMsIHN0cnVjdCB1dG1waWRsZSAqb2JqcCk7CislCislYm9vbF90CisleGRyX3V0bXBpZGxlKHhkcnMsIG9ianApCislCVhEUiAqeGRyczsKKyUJc3RydWN0IHV0bXBpZGxlICpvYmpwOworJXsKKyUJaWYgKCF4ZHJfdXRtcCh4ZHJzLCAmb2JqcC0+dWlfdXRtcCkpIHsKKyUJCXJldHVybiAoRkFMU0UpOworJQl9CislCWlmICgheGRyX3VfaW50KHhkcnMsICZvYmpwLT51aV9pZGxlKSkgeworJQkJcmV0dXJuIChGQUxTRSk7CislCX0KKyUJcmV0dXJuIChUUlVFKTsKKyV9CislCislYm9vbF90IHhkcl91dG1waWRsZXB0cihYRFIgKnhkcnMsIHN0cnVjdCB1dG1waWRsZSAqKm9ianApOworJQorJWJvb2xfdAorJXhkcl91dG1waWRsZXB0cih4ZHJzLCBvYmpwcCkKKyUJWERSICp4ZHJzOworJQlzdHJ1Y3QgdXRtcGlkbGUgKipvYmpwcDsKKyV7CislCWlmICgheGRyX3JlZmVyZW5jZSh4ZHJzLCAoY2hhciAqKikgb2JqcHAsIHNpemVvZiAoc3RydWN0IHV0bXBpZGxlKSwKKyUJCQkgICAoeGRycHJvY190KSB4ZHJfdXRtcGlkbGUpKSB7CislCQlyZXR1cm4gKEZBTFNFKTsKKyUJfQorJQlyZXR1cm4gKFRSVUUpOworJX0KKyUKKyVib29sX3QKKyV4ZHJfdXRtcGlkbGVhcnIoeGRycywgb2JqcCkKKyUJWERSICp4ZHJzOworJQlzdHJ1Y3QgdXRtcGlkbGVhcnIgKm9ianA7CisleworJQlpZiAoIXhkcl9hcnJheSh4ZHJzLCAoY2hhciAqKikmb2JqcC0+dWlhX2FyciwgKHVfaW50ICopJm9ianAtPnVpYV9jbnQsCislCQkgICAgICAgTUFYVVNFUlMsIHNpemVvZihzdHJ1Y3QgdXRtcGlkbGUgKiksCislCQkgICAgICAgKHhkcnByb2NfdCkgeGRyX3V0bXBpZGxlcHRyKSkgeworJQkJcmV0dXJuIChGQUxTRSk7CislCX0KKyUJcmV0dXJuIChUUlVFKTsKKyV9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3NtX2ludGVyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zbV9pbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YmMzZTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zbV9pbnRlci5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KKyAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgorICovCisKKyNpZm5kZWYgX1NNX0lOVEVSX0hfUlBDR0VOCisjZGVmaW5lIF9TTV9JTlRFUl9IX1JQQ0dFTgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBTTV9NQVhTVFJMRU4gMTAyNAorCitzdHJ1Y3Qgc21fbmFtZSB7CisJY2hhciAqbW9uX25hbWU7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc21fbmFtZSBzbV9uYW1lOworCitzdHJ1Y3QgbXlfaWQgeworCWNoYXIgKm15X25hbWU7CisJaW50IG15X3Byb2c7CisJaW50IG15X3ZlcnM7CisJaW50IG15X3Byb2M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbXlfaWQgbXlfaWQ7CisKK3N0cnVjdCBtb25faWQgeworCWNoYXIgKm1vbl9uYW1lOworCXN0cnVjdCBteV9pZCBteV9pZDsKK307Cit0eXBlZGVmIHN0cnVjdCBtb25faWQgbW9uX2lkOworCitzdHJ1Y3QgbW9uIHsKKwlzdHJ1Y3QgbW9uX2lkIG1vbl9pZDsKKwljaGFyIHByaXZbMTZdOworfTsKK3R5cGVkZWYgc3RydWN0IG1vbiBtb247CisKK3N0cnVjdCBzbV9zdGF0IHsKKwlpbnQgc3RhdGU7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc21fc3RhdCBzbV9zdGF0OworCitlbnVtIHJlcyB7CisJc3RhdF9zdWNjID0gMCwKKwlzdGF0X2ZhaWwgPSAxLAorfTsKK3R5cGVkZWYgZW51bSByZXMgcmVzOworCitzdHJ1Y3Qgc21fc3RhdF9yZXMgeworCXJlcyByZXNfc3RhdDsKKwlpbnQgc3RhdGU7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc21fc3RhdF9yZXMgc21fc3RhdF9yZXM7CisKK3N0cnVjdCBzdGF0dXMgeworCWNoYXIgKm1vbl9uYW1lOworCWludCBzdGF0ZTsKKwljaGFyIHByaXZbMTZdOworfTsKK3R5cGVkZWYgc3RydWN0IHN0YXR1cyBzdGF0dXM7CisKKyNkZWZpbmUgU01fUFJPRyAxMDAwMjQKKyNkZWZpbmUgU01fVkVSUyAxCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBTTV9TVEFUIDEKK2V4dGVybiAgc3RydWN0IHNtX3N0YXRfcmVzICogc21fc3RhdF8xKHN0cnVjdCBzbV9uYW1lICosIENMSUVOVCAqKTsKK2V4dGVybiAgc3RydWN0IHNtX3N0YXRfcmVzICogc21fc3RhdF8xX3N2YyhzdHJ1Y3Qgc21fbmFtZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgU01fTU9OIDIKK2V4dGVybiAgc3RydWN0IHNtX3N0YXRfcmVzICogc21fbW9uXzEoc3RydWN0IG1vbiAqLCBDTElFTlQgKik7CitleHRlcm4gIHN0cnVjdCBzbV9zdGF0X3JlcyAqIHNtX21vbl8xX3N2YyhzdHJ1Y3QgbW9uICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBTTV9VTk1PTiAzCitleHRlcm4gIHN0cnVjdCBzbV9zdGF0ICogc21fdW5tb25fMShzdHJ1Y3QgbW9uX2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgc3RydWN0IHNtX3N0YXQgKiBzbV91bm1vbl8xX3N2YyhzdHJ1Y3QgbW9uX2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBTTV9VTk1PTl9BTEwgNAorZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdCAqIHNtX3VubW9uX2FsbF8xKHN0cnVjdCBteV9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHN0cnVjdCBzbV9zdGF0ICogc21fdW5tb25fYWxsXzFfc3ZjKHN0cnVjdCBteV9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgU01fU0lNVV9DUkFTSCA1CitleHRlcm4gIHZvaWQgKiBzbV9zaW11X2NyYXNoXzEodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiBzbV9zaW11X2NyYXNoXzFfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IHNtX3Byb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIFNNX1NUQVQgMQorZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdF9yZXMgKiBzbV9zdGF0XzEoKTsKK2V4dGVybiAgc3RydWN0IHNtX3N0YXRfcmVzICogc21fc3RhdF8xX3N2YygpOworI2RlZmluZSBTTV9NT04gMgorZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdF9yZXMgKiBzbV9tb25fMSgpOworZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdF9yZXMgKiBzbV9tb25fMV9zdmMoKTsKKyNkZWZpbmUgU01fVU5NT04gMworZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdCAqIHNtX3VubW9uXzEoKTsKK2V4dGVybiAgc3RydWN0IHNtX3N0YXQgKiBzbV91bm1vbl8xX3N2YygpOworI2RlZmluZSBTTV9VTk1PTl9BTEwgNAorZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdCAqIHNtX3VubW9uX2FsbF8xKCk7CitleHRlcm4gIHN0cnVjdCBzbV9zdGF0ICogc21fdW5tb25fYWxsXzFfc3ZjKCk7CisjZGVmaW5lIFNNX1NJTVVfQ1JBU0ggNQorZXh0ZXJuICB2b2lkICogc21fc2ltdV9jcmFzaF8xKCk7CitleHRlcm4gIHZvaWQgKiBzbV9zaW11X2NyYXNoXzFfc3ZjKCk7CitleHRlcm4gaW50IHNtX3Byb2dfMV9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX3NtX25hbWUgKFhEUiAqLCBzbV9uYW1lKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbXlfaWQgKFhEUiAqLCBteV9pZCopOworZXh0ZXJuICBib29sX3QgeGRyX21vbl9pZCAoWERSICosIG1vbl9pZCopOworZXh0ZXJuICBib29sX3QgeGRyX21vbiAoWERSICosIG1vbiopOworZXh0ZXJuICBib29sX3QgeGRyX3NtX3N0YXQgKFhEUiAqLCBzbV9zdGF0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfcmVzIChYRFIgKiwgcmVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfc21fc3RhdF9yZXMgKFhEUiAqLCBzbV9zdGF0X3JlcyopOworZXh0ZXJuICBib29sX3QgeGRyX3N0YXR1cyAoWERSICosIHN0YXR1cyopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfc21fbmFtZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX215X2lkICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbW9uX2lkICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbW9uICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfc21fc3RhdCAoKTsKK2V4dGVybiBib29sX3QgeGRyX3JlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3NtX3N0YXRfcmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfc3RhdHVzICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfU01fSU5URVJfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3NtX2ludGVyLnggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zbV9pbnRlci54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2N2YwZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zbV9pbnRlci54CkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogU3RhdHVzIG1vbml0b3IgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCitwcm9ncmFtIFNNX1BST0cgeworCXZlcnNpb24gU01fVkVSUyAgeworCQkvKiByZXNfc3RhdCA9IHN0YXRfc3VjYyBpZiBzdGF0dXMgbW9uaXRvciBhZ3JlZXMgdG8gbW9uaXRvciAqLworCQkvKiByZXNfc3RhdCA9IHN0YXRfZmFpbCBpZiBzdGF0dXMgbW9uaXRvciBjYW5ub3QgbW9uaXRvciAqLworCQkvKiBpZiByZXNfc3RhdCA9PSBzdGF0X3N1Y2MsIHN0YXRlID0gc3RhdGUgbnVtYmVyIG9mIHNpdGUgc21fbmFtZSAqLworCQlzdHJ1Y3Qgc21fc3RhdF9yZXMJCQkgU01fU1RBVChzdHJ1Y3Qgc21fbmFtZSkgPSAxOworCisJCS8qIHJlc19zdGF0ID0gc3RhdF9zdWNjIGlmIHN0YXR1cyBtb25pdG9yIGFncmVlcyB0byBtb25pdG9yICovCisJCS8qIHJlc19zdGF0ID0gc3RhdF9mYWlsIGlmIHN0YXR1cyBtb25pdG9yIGNhbm5vdCBtb25pdG9yICovCisJCS8qIHN0YXQgY29uc2lzdHMgb2Ygc3RhdGUgbnVtYmVyIG9mIGxvY2FsIHNpdGUgKi8KKwkJc3RydWN0IHNtX3N0YXRfcmVzCQkJIFNNX01PTihzdHJ1Y3QgbW9uKSA9IDI7CisKKwkJLyogc3RhdCBjb25zaXN0cyBvZiBzdGF0ZSBudW1iZXIgb2YgbG9jYWwgc2l0ZSAqLworCQlzdHJ1Y3Qgc21fc3RhdAkJCQkgU01fVU5NT04oc3RydWN0IG1vbl9pZCkgPSAzOworCisJCS8qIHN0YXQgY29uc2lzdHMgb2Ygc3RhdGUgbnVtYmVyIG9mIGxvY2FsIHNpdGUgKi8KKwkJc3RydWN0IHNtX3N0YXQJCQkJIFNNX1VOTU9OX0FMTChzdHJ1Y3QgbXlfaWQpID0gNDsKKworCQl2b2lkCQkJCQkgU01fU0lNVV9DUkFTSCh2b2lkKSA9IDU7CisKKwl9ID0gMTsKK30gPSAxMDAwMjQ7CisKK2NvbnN0CVNNX01BWFNUUkxFTiA9IDEwMjQ7CisKK3N0cnVjdCBzbV9uYW1lIHsKKwlzdHJpbmcgbW9uX25hbWU8U01fTUFYU1RSTEVOPjsKK307CisKK3N0cnVjdCBteV9pZCB7CisJc3RyaW5nCSBteV9uYW1lPFNNX01BWFNUUkxFTj47CQkvKiBuYW1lIG9mIHRoZSBzaXRlIGluaXRpYXRpbmcgdGhlIG1vbml0b3JpbmcgcmVxdWVzdCovCisJaW50CW15X3Byb2c7CQkJLyogcnBjIHByb2dyYW0gIyBvZiB0aGUgcmVxdWVzdGluZyBwcm9jZXNzICovCisJaW50CW15X3ZlcnM7CQkJLyogcnBjIHZlcnNpb24gIyBvZiB0aGUgcmVxdWVzdGluZyBwcm9jZXNzICovCisJaW50CW15X3Byb2M7CQkJLyogcnBjIHByb2NlZHVyZSAjIG9mIHRoZSByZXF1ZXN0aW5nIHByb2Nlc3MgKi8KK307CisKK3N0cnVjdCBtb25faWQgeworCXN0cmluZwltb25fbmFtZTxTTV9NQVhTVFJMRU4+OwkJLyogbmFtZSBvZiB0aGUgc2l0ZSB0byBiZSBtb25pdG9yZWQgKi8KKwlzdHJ1Y3QgbXlfaWQgbXlfaWQ7Cit9OworCisKK3N0cnVjdCBtb257CisJc3RydWN0IG1vbl9pZCBtb25faWQ7CisJb3BhcXVlIHByaXZbMTZdOyAJCS8qIHByaXZhdGUgaW5mb3JtYXRpb24gdG8gc3RvcmUgYXQgbW9uaXRvciBmb3IgcmVxdWVzdGluZyBwcm9jZXNzICovCit9OworCisKKy8qCisgKiBzdGF0ZSAjIG9mIHN0YXR1cyBtb25pdG9yIG1vbm90b25pY2FsbHkgaW5jcmVhc2VzIGVhY2ggdGltZQorICogc3RhdHVzIG9mIHRoZSBzaXRlIGNoYW5nZXM6CisgKiBhbiBldmVuIG51bWJlciAoPj0gMCkgaW5kaWNhdGVzIHRoZSBzaXRlIGlzIGRvd24gYW5kCisgKiBhbiBvZGQgbnVtYmVyICg+IDApIGluZGljYXRlcyB0aGUgc2l0ZSBpcyB1cDsKKyAqLworc3RydWN0IHNtX3N0YXQgeworCWludCBzdGF0ZTsJCS8qIHN0YXRlICMgb2Ygc3RhdHVzIG1vbml0b3IgKi8KK307CisKK2VudW0gcmVzIHsKKwlzdGF0X3N1Y2MgPSAwLAkJLyogc3RhdHVzIG1vbml0b3IgYWdyZWVzIHRvIG1vbml0b3IgKi8KKwlzdGF0X2ZhaWwgPSAxCQkvKiBzdGF0dXMgbW9uaXRvciBjYW5ub3QgbW9uaXRvciAqLworfTsKKworc3RydWN0IHNtX3N0YXRfcmVzIHsKKwlyZXMgcmVzX3N0YXQ7CisJaW50IHN0YXRlOworfTsKKworLyoKKyAqIHN0cnVjdHVyZSBvZiB0aGUgc3RhdHVzIG1lc3NhZ2Ugc2VudCBiYWNrIGJ5IHRoZSBzdGF0dXMgbW9uaXRvcgorICogd2hlbiBtb25pdG9yIHNpdGUgc3RhdHVzIGNoYW5nZXMKKyAqLworc3RydWN0IHN0YXR1cyB7CisJc3RyaW5nIG1vbl9uYW1lPFNNX01BWFNUUkxFTj47CisJaW50IHN0YXRlOworCW9wYXF1ZSBwcml2WzE2XTsJCS8qIHN0b3JlZCBwcml2YXRlIGluZm9ybWF0aW9uICovCit9OwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvc3ByYXkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3NwcmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5ZTQwMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3NwcmF5LmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9TUFJBWV9IX1JQQ0dFTgorI2RlZmluZSBfU1BSQVlfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgU1BSQVlNQVggODg0NQorCitzdHJ1Y3Qgc3ByYXl0aW1ldmFsIHsKKwl1X2ludCBzZWM7CisJdV9pbnQgdXNlYzsKK307Cit0eXBlZGVmIHN0cnVjdCBzcHJheXRpbWV2YWwgc3ByYXl0aW1ldmFsOworCitzdHJ1Y3Qgc3ByYXljdW11bCB7CisJdV9pbnQgY291bnRlcjsKKwlzcHJheXRpbWV2YWwgY2xvY2s7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc3ByYXljdW11bCBzcHJheWN1bXVsOworCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQgc3ByYXlhcnJfbGVuOworCWNoYXIgKnNwcmF5YXJyX3ZhbDsKK30gc3ByYXlhcnI7CisKKyNkZWZpbmUgU1BSQVlQUk9HIDEwMDAxMgorI2RlZmluZSBTUFJBWVZFUlMgMQorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgU1BSQVlQUk9DX1NQUkFZIDEKK2V4dGVybiAgdm9pZCAqIHNwcmF5cHJvY19zcHJheV8xKHNwcmF5YXJyICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIHNwcmF5cHJvY19zcHJheV8xX3N2YyhzcHJheWFyciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgU1BSQVlQUk9DX0dFVCAyCitleHRlcm4gIHNwcmF5Y3VtdWwgKiBzcHJheXByb2NfZ2V0XzEodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHNwcmF5Y3VtdWwgKiBzcHJheXByb2NfZ2V0XzFfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFNQUkFZUFJPQ19DTEVBUiAzCitleHRlcm4gIHZvaWQgKiBzcHJheXByb2NfY2xlYXJfMSh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIHNwcmF5cHJvY19jbGVhcl8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBzcHJheXByb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIFNQUkFZUFJPQ19TUFJBWSAxCitleHRlcm4gIHZvaWQgKiBzcHJheXByb2Nfc3ByYXlfMSgpOworZXh0ZXJuICB2b2lkICogc3ByYXlwcm9jX3NwcmF5XzFfc3ZjKCk7CisjZGVmaW5lIFNQUkFZUFJPQ19HRVQgMgorZXh0ZXJuICBzcHJheWN1bXVsICogc3ByYXlwcm9jX2dldF8xKCk7CitleHRlcm4gIHNwcmF5Y3VtdWwgKiBzcHJheXByb2NfZ2V0XzFfc3ZjKCk7CisjZGVmaW5lIFNQUkFZUFJPQ19DTEVBUiAzCitleHRlcm4gIHZvaWQgKiBzcHJheXByb2NfY2xlYXJfMSgpOworZXh0ZXJuICB2b2lkICogc3ByYXlwcm9jX2NsZWFyXzFfc3ZjKCk7CitleHRlcm4gaW50IHNwcmF5cHJvZ18xX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKworLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGJvb2xfdCB4ZHJfc3ByYXl0aW1ldmFsIChYRFIgKiwgc3ByYXl0aW1ldmFsKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfc3ByYXljdW11bCAoWERSICosIHNwcmF5Y3VtdWwqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9zcHJheWFyciAoWERSICosIHNwcmF5YXJyKik7CisKKyNlbHNlIC8qIEsmUiBDICovCitleHRlcm4gYm9vbF90IHhkcl9zcHJheXRpbWV2YWwgKCk7CitleHRlcm4gYm9vbF90IHhkcl9zcHJheWN1bXVsICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfc3ByYXlhcnIgKCk7CisKKyNlbmRpZiAvKiBLJlIgQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9TUFJBWV9IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvc3ByYXkueCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3NwcmF5LngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiN2M0OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3NwcmF5LngKQEAgLTAsMCArMSw4NCBAQAorLyogQCgjKXNwcmF5LngJMi4xIDg4LzA4LzAxIDQuMCBSUENTUkMgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFNwcmF5IGEgc2VydmVyIHdpdGggcGFja2V0cworICogVXNlZnVsIGZvciB0ZXN0aW5nIGZsYWtpbmVzcyBvZiBuZXR3b3JrIGludGVyZmFjZXMKKyAqLworCitjb25zdCBTUFJBWU1BWCA9IDg4NDU7CS8qIG1heCBhbW91bnQgY2FuIHNwcmF5ICovCisKKy8qCisgKiBHTVQgc2luY2UgMDowMCwgMSBKYW51YXJ5IDE5NzAKKyAqLworc3RydWN0IHNwcmF5dGltZXZhbCB7CisJdW5zaWduZWQgaW50IHNlYzsKKwl1bnNpZ25lZCBpbnQgdXNlYzsKK307CisKKy8qCisgKiBzcHJheSBzdGF0aXN0aWNzCisgKi8KK3N0cnVjdCBzcHJheWN1bXVsIHsKKwl1bnNpZ25lZCBpbnQgY291bnRlcjsKKwlzcHJheXRpbWV2YWwgY2xvY2s7Cit9OworCisvKgorICogc3ByYXkgZGF0YQorICovCit0eXBlZGVmIG9wYXF1ZSBzcHJheWFycjxTUFJBWU1BWD47CisKK3Byb2dyYW0gU1BSQVlQUk9HIHsKKwl2ZXJzaW9uIFNQUkFZVkVSUyB7CisJCS8qCisJCSAqIEp1c3QgdGhyb3cgYXdheSB0aGUgZGF0YSBhbmQgaW5jcmVtZW50IHRoZSBjb3VudGVyCisJCSAqIFRoaXMgY2FsbCBuZXZlciByZXR1cm5zLCBzbyB0aGUgY2xpZW50IHNob3VsZCBhbHdheXMKKwkJICogdGltZSBpdCBvdXQuCisJCSAqLworCQl2b2lkCisJCVNQUkFZUFJPQ19TUFJBWShzcHJheWFycikgPSAxOworCisJCS8qCisJCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIgYW5kIGVsYXBzZWQgdGltZSAgc2luY2UKKwkJICogbGFzdCBDTEVBUi4KKwkJICovCisJCXNwcmF5Y3VtdWwKKwkJU1BSQVlQUk9DX0dFVCh2b2lkKSA9IDI7CisKKwkJLyoKKwkJICogQ2xlYXIgdGhlIGNvdW50ZXIgYW5kIHJlc2V0IHRoZSBlbGFwc2VkIHRpbWUKKwkJICovCisJCXZvaWQKKwkJU1BSQVlQUk9DX0NMRUFSKHZvaWQpID0gMzsKKwl9ID0gMTsKK30gPSAxMDAwMTI7CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjhiNzRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXAuaApAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19SUENTVkNfWVBfSF9fCisjZGVmaW5lIF9fUlBDU1ZDX1lQX0hfXworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKyNkZWZpbmUgWVBNQVhSRUNPUkQgMTAyNAorI2RlZmluZSBZUE1BWERPTUFJTiA2NAorI2RlZmluZSBZUE1BWE1BUCA2NAorI2RlZmluZSBZUE1BWFBFRVIgNjQKKworZW51bSB5cHN0YXQgeworCVlQX1RSVUUgPSAxLAorCVlQX05PTU9SRSA9IDIsCisJWVBfRkFMU0UgPSAwLAorCVlQX05PTUFQID0gLTEsCisJWVBfTk9ET00gPSAtMiwKKwlZUF9OT0tFWSA9IC0zLAorCVlQX0JBRE9QID0gLTQsCisJWVBfQkFEREIgPSAtNSwKKwlZUF9ZUEVSUiA9IC02LAorCVlQX0JBREFSR1MgPSAtNywKKwlZUF9WRVJTID0gLTgsCit9OwordHlwZWRlZiBlbnVtIHlwc3RhdCB5cHN0YXQ7CisKK2VudW0geXB4ZnJzdGF0IHsKKwlZUFhGUl9TVUNDID0gMSwKKwlZUFhGUl9BR0UgPSAyLAorCVlQWEZSX05PTUFQID0gLTEsCisJWVBYRlJfTk9ET00gPSAtMiwKKwlZUFhGUl9SU1JDID0gLTMsCisJWVBYRlJfUlBDID0gLTQsCisJWVBYRlJfTUFERFIgPSAtNSwKKwlZUFhGUl9ZUEVSUiA9IC02LAorCVlQWEZSX0JBREFSR1MgPSAtNywKKwlZUFhGUl9EQk0gPSAtOCwKKwlZUFhGUl9GSUxFID0gLTksCisJWVBYRlJfU0tFVyA9IC0xMCwKKwlZUFhGUl9DTEVBUiA9IC0xMSwKKwlZUFhGUl9GT1JDRSA9IC0xMiwKKwlZUFhGUl9YRlJFUlIgPSAtMTMsCisJWVBYRlJfUkVGVVNFRCA9IC0xNCwKK307Cit0eXBlZGVmIGVudW0geXB4ZnJzdGF0IHlweGZyc3RhdDsKKwordHlwZWRlZiBjaGFyICpkb21haW5uYW1lOwordHlwZWRlZiBjaGFyICptYXBuYW1lOwordHlwZWRlZiBjaGFyICpwZWVybmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1X2ludCBrZXlkYXRfbGVuOworICBjaGFyICprZXlkYXRfdmFsOworfSBrZXlkYXQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdV9pbnQgdmFsZGF0X2xlbjsKKyAgY2hhciAqdmFsZGF0X3ZhbDsKK30gdmFsZGF0OworCitzdHJ1Y3QgeXBtYXBfcGFybXMgeworICBkb21haW5uYW1lIGRvbWFpbjsKKyAgbWFwbmFtZSBtYXA7CisgIHVfaW50IG9yZGVybnVtOworICBwZWVybmFtZSBwZWVyOworfTsKK3R5cGVkZWYgc3RydWN0IHlwbWFwX3Bhcm1zIHlwbWFwX3Bhcm1zOworCitzdHJ1Y3QgeXByZXFfa2V5IHsKKyAgZG9tYWlubmFtZSBkb21haW47CisgIG1hcG5hbWUgbWFwOworICBrZXlkYXQga2V5OworfTsKK3R5cGVkZWYgc3RydWN0IHlwcmVxX2tleSB5cHJlcV9rZXk7CisKK3N0cnVjdCB5cHJlcV9ub2tleSB7CisgIGRvbWFpbm5hbWUgZG9tYWluOworICBtYXBuYW1lIG1hcDsKK307Cit0eXBlZGVmIHN0cnVjdCB5cHJlcV9ub2tleSB5cHJlcV9ub2tleTsKKworc3RydWN0IHlwcmVxX3hmciB7CisgIHlwbWFwX3Bhcm1zIG1hcF9wYXJtczsKKyAgdV9pbnQgdHJhbnNpZDsKKyAgdV9pbnQgcHJvZzsKKyAgdV9pbnQgcG9ydDsKK307Cit0eXBlZGVmIHN0cnVjdCB5cHJlcV94ZnIgeXByZXFfeGZyOworCitzdHJ1Y3QgeXByZXNwX3ZhbCB7CisgIHlwc3RhdCBzdGF0OworICB2YWxkYXQgdmFsOworfTsKK3R5cGVkZWYgc3RydWN0IHlwcmVzcF92YWwgeXByZXNwX3ZhbDsKKworc3RydWN0IHlwcmVzcF9rZXlfdmFsIHsKKyAgeXBzdGF0IHN0YXQ7CisjaWZkZWYgU1RVUElEX1NVTl9CVUcKKyAgLyogVGhpcyBpcyB0aGUgZm9ybSBhcyBkaXN0cmlidXRlZCBieSBTdW4uICBCdXQgZXZlbiB0aGUgU3VuIE5JUworICAgICBzZXJ2ZXJzIGV4cGVjdCB0aGUgdmFsdWVzIGluIHRoZSBvdGhlciBvcmRlci4gIFNvIHRoZWlyCisgICAgIGltcGxlbWVudGF0aW9uIHNvbWVob3cgbXVzdCBjaGFuZ2UgdGhlIG9yZGVyIGludGVybmFsbHkuICBXZQorICAgICBkb24ndCB3YW50IHRvIGZvbGxvdyB0aGlzIGJhZCBleGFtcGxlIHNpbmNlIHRoZSB1c2VyIHNob3VsZCBiZQorICAgICBhYmxlIHRvIHVzZSBycGNnZW4gb24gdGhpcyBmaWxlLiAgKi8KKyAga2V5ZGF0IGtleTsKKyAgdmFsZGF0IHZhbDsKKyNlbHNlCisgIHZhbGRhdCB2YWw7CisgIGtleWRhdCBrZXk7CisjZW5kaWYKK307Cit0eXBlZGVmIHN0cnVjdCB5cHJlc3Bfa2V5X3ZhbCB5cHJlc3Bfa2V5X3ZhbDsKKworc3RydWN0IHlwcmVzcF9tYXN0ZXIgeworICB5cHN0YXQgc3RhdDsKKyAgcGVlcm5hbWUgcGVlcjsKK307Cit0eXBlZGVmIHN0cnVjdCB5cHJlc3BfbWFzdGVyIHlwcmVzcF9tYXN0ZXI7CisKK3N0cnVjdCB5cHJlc3Bfb3JkZXIgeworICB5cHN0YXQgc3RhdDsKKyAgdV9pbnQgb3JkZXJudW07Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXByZXNwX29yZGVyIHlwcmVzcF9vcmRlcjsKKworc3RydWN0IHlwcmVzcF9hbGwgeworICBib29sX3QgbW9yZTsKKyAgdW5pb24geworICAgIHlwcmVzcF9rZXlfdmFsIHZhbDsKKyAgfSB5cHJlc3BfYWxsX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXByZXNwX2FsbCB5cHJlc3BfYWxsOworCitzdHJ1Y3QgeXByZXNwX3hmciB7CisgIHVfaW50IHRyYW5zaWQ7CisgIHlweGZyc3RhdCB4ZnJzdGF0OworfTsKK3R5cGVkZWYgc3RydWN0IHlwcmVzcF94ZnIgeXByZXNwX3hmcjsKKworc3RydWN0IHlwbWFwbGlzdCB7CisgIG1hcG5hbWUgbWFwOworICBzdHJ1Y3QgeXBtYXBsaXN0ICpuZXh0OworfTsKK3R5cGVkZWYgc3RydWN0IHlwbWFwbGlzdCB5cG1hcGxpc3Q7CisKK3N0cnVjdCB5cHJlc3BfbWFwbGlzdCB7CisgIHlwc3RhdCBzdGF0OworICB5cG1hcGxpc3QgKm1hcHM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXByZXNwX21hcGxpc3QgeXByZXNwX21hcGxpc3Q7CisKK2VudW0geXBwdXNoX3N0YXR1cyB7CisgIFlQUFVTSF9TVUNDID0gMSwKKyAgWVBQVVNIX0FHRSA9IDIsCisgIFlQUFVTSF9OT01BUCA9IC0xLAorICBZUFBVU0hfTk9ET00gPSAtMiwKKyAgWVBQVVNIX1JTUkMgPSAtMywKKyAgWVBQVVNIX1JQQyA9IC00LAorICBZUFBVU0hfTUFERFIgPSAtNSwKKyAgWVBQVVNIX1lQRVJSID0gLTYsCisgIFlQUFVTSF9CQURBUkdTID0gLTcsCisgIFlQUFVTSF9EQk0gPSAtOCwKKyAgWVBQVVNIX0ZJTEUgPSAtOSwKKyAgWVBQVVNIX1NLRVcgPSAtMTAsCisgIFlQUFVTSF9DTEVBUiA9IC0xMSwKKyAgWVBQVVNIX0ZPUkNFID0gLTEyLAorICBZUFBVU0hfWEZSRVJSID0gLTEzLAorICBZUFBVU0hfUkVGVVNFRCA9IC0xNCwKK307Cit0eXBlZGVmIGVudW0geXBwdXNoX3N0YXR1cyB5cHB1c2hfc3RhdHVzOworCitzdHJ1Y3QgeXBwdXNocmVzcF94ZnIgeworICB1X2ludCB0cmFuc2lkOworICB5cHB1c2hfc3RhdHVzIHN0YXR1czsKK307Cit0eXBlZGVmIHN0cnVjdCB5cHB1c2hyZXNwX3hmciB5cHB1c2hyZXNwX3hmcjsKKworZW51bSB5cGJpbmRfcmVzcHR5cGUgeworICBZUEJJTkRfU1VDQ19WQUwgPSAxLAorICBZUEJJTkRfRkFJTF9WQUwgPSAyLAorfTsKK3R5cGVkZWYgZW51bSB5cGJpbmRfcmVzcHR5cGUgeXBiaW5kX3Jlc3B0eXBlOworCitzdHJ1Y3QgeXBiaW5kX2JpbmRpbmcgeworICBjaGFyIHlwYmluZF9iaW5kaW5nX2FkZHJbNF07CisgIGNoYXIgeXBiaW5kX2JpbmRpbmdfcG9ydFsyXTsKK307Cit0eXBlZGVmIHN0cnVjdCB5cGJpbmRfYmluZGluZyB5cGJpbmRfYmluZGluZzsKKworc3RydWN0IHlwYmluZF9yZXNwIHsKKyAgeXBiaW5kX3Jlc3B0eXBlIHlwYmluZF9zdGF0dXM7CisgIHVuaW9uIHsKKyAgICB1X2ludCB5cGJpbmRfZXJyb3I7CisgICAgeXBiaW5kX2JpbmRpbmcgeXBiaW5kX2JpbmRpbmZvOworICB9IHlwYmluZF9yZXNwX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXBiaW5kX3Jlc3AgeXBiaW5kX3Jlc3A7CisKKyNkZWZpbmUgWVBCSU5EX0VSUl9FUlIgMQorI2RlZmluZSBZUEJJTkRfRVJSX05PU0VSViAyCisjZGVmaW5lIFlQQklORF9FUlJfUkVTQyAzCisKK3N0cnVjdCB5cGJpbmRfc2V0ZG9tIHsKKyAgZG9tYWlubmFtZSB5cHNldGRvbV9kb21haW47CisgIHlwYmluZF9iaW5kaW5nIHlwc2V0ZG9tX2JpbmRpbmc7CisgIHVfaW50IHlwc2V0ZG9tX3ZlcnM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXBiaW5kX3NldGRvbSB5cGJpbmRfc2V0ZG9tOworCitfX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgWVBQUk9HIDEwMDAwNAorI2RlZmluZSBZUFZFUlMgMgorCisjZGVmaW5lIFlQUFJPQ19OVUxMIDAKK2V4dGVybiAgdm9pZCAqeXBwcm9jX251bGxfMiAodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKnlwcHJvY19udWxsXzJfc3ZjICh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFBST0NfRE9NQUlOIDEKK2V4dGVybiAgYm9vbF90ICp5cHByb2NfZG9tYWluXzIgKGRvbWFpbm5hbWUgKiwgQ0xJRU5UICopOworZXh0ZXJuICBib29sX3QgKnlwcHJvY19kb21haW5fMl9zdmMgKGRvbWFpbm5hbWUgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQUFJPQ19ET01BSU5fTk9OQUNLIDIKK2V4dGVybiAgYm9vbF90ICp5cHByb2NfZG9tYWluX25vbmFja18yIChkb21haW5uYW1lICosIENMSUVOVCAqKTsKK2V4dGVybiAgYm9vbF90ICp5cHByb2NfZG9tYWluX25vbmFja18yX3N2YyAoZG9tYWlubmFtZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBQUk9DX01BVENIIDMKK2V4dGVybiAgeXByZXNwX3ZhbCAqeXBwcm9jX21hdGNoXzIgKHlwcmVxX2tleSAqLCBDTElFTlQgKik7CitleHRlcm4gIHlwcmVzcF92YWwgKnlwcHJvY19tYXRjaF8yX3N2YyAoeXByZXFfa2V5ICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFBST0NfRklSU1QgNAorZXh0ZXJuICB5cHJlc3Bfa2V5X3ZhbCAqeXBwcm9jX2ZpcnN0XzIgKHlwcmVxX2tleSAqLCBDTElFTlQgKik7CitleHRlcm4gIHlwcmVzcF9rZXlfdmFsICp5cHByb2NfZmlyc3RfMl9zdmMgKHlwcmVxX2tleSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBQUk9DX05FWFQgNQorZXh0ZXJuICB5cHJlc3Bfa2V5X3ZhbCAqeXBwcm9jX25leHRfMiAoeXByZXFfa2V5ICosIENMSUVOVCAqKTsKK2V4dGVybiAgeXByZXNwX2tleV92YWwgKnlwcHJvY19uZXh0XzJfc3ZjICh5cHJlcV9rZXkgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQUFJPQ19YRlIgNgorZXh0ZXJuICB5cHJlc3BfeGZyICp5cHByb2NfeGZyXzIgKHlwcmVxX3hmciAqLCBDTElFTlQgKik7CitleHRlcm4gIHlwcmVzcF94ZnIgKnlwcHJvY194ZnJfMl9zdmMgKHlwcmVxX3hmciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBQUk9DX0NMRUFSIDcKK2V4dGVybiAgdm9pZCAqeXBwcm9jX2NsZWFyXzIgKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICp5cHByb2NfY2xlYXJfMl9zdmMgKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQUFJPQ19BTEwgOAorZXh0ZXJuICB5cHJlc3BfYWxsICp5cHByb2NfYWxsXzIgKHlwcmVxX25va2V5ICosIENMSUVOVCAqKTsKK2V4dGVybiAgeXByZXNwX2FsbCAqeXBwcm9jX2FsbF8yX3N2YyAoeXByZXFfbm9rZXkgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQUFJPQ19NQVNURVIgOQorZXh0ZXJuICB5cHJlc3BfbWFzdGVyICp5cHByb2NfbWFzdGVyXzIgKHlwcmVxX25va2V5ICosIENMSUVOVCAqKTsKK2V4dGVybiAgeXByZXNwX21hc3RlciAqeXBwcm9jX21hc3Rlcl8yX3N2YyAoeXByZXFfbm9rZXkgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQUFJPQ19PUkRFUiAxMAorZXh0ZXJuICB5cHJlc3Bfb3JkZXIgKnlwcHJvY19vcmRlcl8yICh5cHJlcV9ub2tleSAqLCBDTElFTlQgKik7CitleHRlcm4gIHlwcmVzcF9vcmRlciAqeXBwcm9jX29yZGVyXzJfc3ZjICh5cHJlcV9ub2tleSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBQUk9DX01BUExJU1QgMTEKK2V4dGVybiAgeXByZXNwX21hcGxpc3QgKnlwcHJvY19tYXBsaXN0XzIgKGRvbWFpbm5hbWUgKiwgQ0xJRU5UICopOworZXh0ZXJuICB5cHJlc3BfbWFwbGlzdCAqeXBwcm9jX21hcGxpc3RfMl9zdmMgKGRvbWFpbm5hbWUgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IHlwcHJvZ18yX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworCisjZGVmaW5lIFlQUFVTSF9YRlJSRVNQUFJPRyAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgWVBQVVNIX1hGUlJFU1BWRVJTIDEKKworI2RlZmluZSBZUFBVU0hQUk9DX05VTEwgMAorZXh0ZXJuICB2b2lkICp5cHB1c2hwcm9jX251bGxfMSAodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKnlwcHVzaHByb2NfbnVsbF8xX3N2YyAodm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBQVVNIUFJPQ19YRlJSRVNQIDEKK2V4dGVybiAgdm9pZCAqeXBwdXNocHJvY194ZnJyZXNwXzEgKHlwcHVzaHJlc3BfeGZyICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqeXBwdXNocHJvY194ZnJyZXNwXzFfc3ZjICh5cHB1c2hyZXNwX3hmciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgeXBwdXNoX3hmcnJlc3Bwcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisKKyNkZWZpbmUgWVBCSU5EUFJPRyAxMDAwMDcKKyNkZWZpbmUgWVBCSU5EVkVSUyAyCisKKyNkZWZpbmUgWVBCSU5EUFJPQ19OVUxMIDAKK2V4dGVybiAgdm9pZCAqeXBiaW5kcHJvY19udWxsXzIgKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICp5cGJpbmRwcm9jX251bGxfMl9zdmMgKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQQklORFBST0NfRE9NQUlOIDEKK2V4dGVybiAgeXBiaW5kX3Jlc3AgKnlwYmluZHByb2NfZG9tYWluXzIgKGRvbWFpbm5hbWUgKiwgQ0xJRU5UICopOworZXh0ZXJuICB5cGJpbmRfcmVzcCAqeXBiaW5kcHJvY19kb21haW5fMl9zdmMgKGRvbWFpbm5hbWUgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQQklORFBST0NfU0VURE9NIDIKK2V4dGVybiAgdm9pZCAqeXBiaW5kcHJvY19zZXRkb21fMiAoeXBiaW5kX3NldGRvbSAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKnlwYmluZHByb2Nfc2V0ZG9tXzJfc3ZjICh5cGJpbmRfc2V0ZG9tICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCB5cGJpbmRwcm9nXzJfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisKK2V4dGVybiAgYm9vbF90IHhkcl95cHN0YXQgKFhEUiAqLCB5cHN0YXQqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHhmcnN0YXQgKFhEUiAqLCB5cHhmcnN0YXQqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9kb21haW5uYW1lIChYRFIgKiwgZG9tYWlubmFtZSopOworZXh0ZXJuICBib29sX3QgeGRyX21hcG5hbWUgKFhEUiAqLCBtYXBuYW1lKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfcGVlcm5hbWUgKFhEUiAqLCBwZWVybmFtZSopOworZXh0ZXJuICBib29sX3QgeGRyX2tleWRhdCAoWERSICosIGtleWRhdCopOworZXh0ZXJuICBib29sX3QgeGRyX3ZhbGRhdCAoWERSICosIHZhbGRhdCopOworZXh0ZXJuICBib29sX3QgeGRyX3lwbWFwX3Bhcm1zIChYRFIgKiwgeXBtYXBfcGFybXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHJlcV9rZXkgKFhEUiAqLCB5cHJlcV9rZXkqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHJlcV9ub2tleSAoWERSICosIHlwcmVxX25va2V5Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXByZXFfeGZyIChYRFIgKiwgeXByZXFfeGZyKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXByZXNwX3ZhbCAoWERSICosIHlwcmVzcF92YWwqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHJlc3Bfa2V5X3ZhbCAoWERSICosIHlwcmVzcF9rZXlfdmFsKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXByZXNwX21hc3RlciAoWERSICosIHlwcmVzcF9tYXN0ZXIqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHJlc3Bfb3JkZXIgKFhEUiAqLCB5cHJlc3Bfb3JkZXIqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHJlc3BfYWxsIChYRFIgKiwgeXByZXNwX2FsbCopOworZXh0ZXJuICBib29sX3QgeGRyX3lwcmVzcF94ZnIgKFhEUiAqLCB5cHJlc3BfeGZyKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXBtYXBsaXN0IChYRFIgKiwgeXBtYXBsaXN0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXByZXNwX21hcGxpc3QgKFhEUiAqLCB5cHJlc3BfbWFwbGlzdCopOworZXh0ZXJuICBib29sX3QgeGRyX3lwcHVzaF9zdGF0dXMgKFhEUiAqLCB5cHB1c2hfc3RhdHVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXBwdXNocmVzcF94ZnIgKFhEUiAqLCB5cHB1c2hyZXNwX3hmciopOworZXh0ZXJuICBib29sX3QgeGRyX3lwYmluZF9yZXNwdHlwZSAoWERSICosIHlwYmluZF9yZXNwdHlwZSopOworZXh0ZXJuICBib29sX3QgeGRyX3lwYmluZF9iaW5kaW5nIChYRFIgKiwgeXBiaW5kX2JpbmRpbmcqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cGJpbmRfcmVzcCAoWERSICosIHlwYmluZF9yZXNwKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXBiaW5kX3NldGRvbSAoWERSICosIHlwYmluZF9zZXRkb20qKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qICFfX1JQQ1NWQ19ZUF9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwLnggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OWFlNmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cC54CkBAIC0wLDAgKzEsMzExIEBACisvKiBAKCMpeXAueAkyLjEgODgvMDgvMDEgNC4wIFJQQ1NSQyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFByb3RvY29sIGRlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSBZZWxsb3cgUGFnZXMgU2VydmljZQorICovCisKK2NvbnN0IFlQTUFYUkVDT1JEID0gMTAyNDsKK2NvbnN0IFlQTUFYRE9NQUlOID0gNjQ7Citjb25zdCBZUE1BWE1BUCA9IDY0OworY29uc3QgWVBNQVhQRUVSID0gNjQ7CisKKworZW51bSB5cHN0YXQgeworCVlQX1RSVUUJCT0gIDEsCisJWVBfTk9NT1JFCT0gIDIsCisJWVBfRkFMU0UJPSAgMCwKKwlZUF9OT01BUAk9IC0xLAorCVlQX05PRE9NCT0gLTIsCisJWVBfTk9LRVkJPSAtMywKKwlZUF9CQURPUAk9IC00LAorCVlQX0JBRERCCT0gLTUsCisJWVBfWVBFUlIJPSAtNiwKKwlZUF9CQURBUkdTCT0gLTcsCisJWVBfVkVSUwkJPSAtOAorfTsKKworCitlbnVtIHlweGZyc3RhdCB7CisJWVBYRlJfU1VDQwk9ICAxLAorCVlQWEZSX0FHRQk9ICAyLAorCVlQWEZSX05PTUFQCT0gLTEsCisJWVBYRlJfTk9ET00JPSAtMiwKKwlZUFhGUl9SU1JDCT0gLTMsCisJWVBYRlJfUlBDCT0gLTQsCisJWVBYRlJfTUFERFIJPSAtNSwKKwlZUFhGUl9ZUEVSUgk9IC02LAorCVlQWEZSX0JBREFSR1MJPSAtNywKKwlZUFhGUl9EQk0JPSAtOCwKKwlZUFhGUl9GSUxFCT0gLTksCisJWVBYRlJfU0tFVwk9IC0xMCwKKwlZUFhGUl9DTEVBUgk9IC0xMSwKKwlZUFhGUl9GT1JDRQk9IC0xMiwKKwlZUFhGUl9YRlJFUlIJPSAtMTMsCisJWVBYRlJfUkVGVVNFRAk9IC0xNAorfTsKKworCit0eXBlZGVmIHN0cmluZyBkb21haW5uYW1lPFlQTUFYRE9NQUlOPjsKK3R5cGVkZWYgc3RyaW5nIG1hcG5hbWU8WVBNQVhNQVA+OwordHlwZWRlZiBzdHJpbmcgcGVlcm5hbWU8WVBNQVhQRUVSPjsKK3R5cGVkZWYgb3BhcXVlIGtleWRhdDxZUE1BWFJFQ09SRD47Cit0eXBlZGVmIG9wYXF1ZSB2YWxkYXQ8WVBNQVhSRUNPUkQ+OworCisKK3N0cnVjdCB5cG1hcF9wYXJtcyB7CisJZG9tYWlubmFtZSBkb21haW47CisJbWFwbmFtZSBtYXA7CisJdW5zaWduZWQgaW50IG9yZGVybnVtOworCXBlZXJuYW1lIHBlZXI7Cit9OworCitzdHJ1Y3QgeXByZXFfa2V5IHsKKwlkb21haW5uYW1lIGRvbWFpbjsKKwltYXBuYW1lIG1hcDsKKwlrZXlkYXQga2V5OworfTsKKworc3RydWN0IHlwcmVxX25va2V5IHsKKwlkb21haW5uYW1lIGRvbWFpbjsKKwltYXBuYW1lIG1hcDsKK307CisKK3N0cnVjdCB5cHJlcV94ZnIgeworCXlwbWFwX3Bhcm1zIG1hcF9wYXJtczsKKwl1bnNpZ25lZCBpbnQgdHJhbnNpZDsKKwl1bnNpZ25lZCBpbnQgcHJvZzsKKwl1bnNpZ25lZCBpbnQgcG9ydDsKK307CisKKworc3RydWN0IHlwcmVzcF92YWwgeworCXlwc3RhdCBzdGF0OworCXZhbGRhdCB2YWw7Cit9OworCitzdHJ1Y3QgeXByZXNwX2tleV92YWwgeworCXlwc3RhdCBzdGF0OworI2lmZGVmIFNUVVBJRF9TVU5fQlVHCisJLyogVGhpcyBpcyB0aGUgZm9ybSBhcyBkaXN0cmlidXRlZCBieSBTdW4uICBCdXQgZXZlbiB0aGUgU3VuIE5JUworCSAgIHNlcnZlcnMgZXhwZWN0IHRoZSB2YWx1ZXMgaW4gdGhlIG90aGVyIG9yZGVyLiAgU28gdGhlaXIKKwkgICBpbXBsZW1lbnRhdGlvbiBzb21laG93IG11c3QgY2hhbmdlIHRoZSBvcmRlciBpbnRlcm5hbGx5LiAgV2UKKwkgICBkb24ndCB3YW50IHRvIGZvbGxvdyB0aGlzIGJhZCBleGFtcGxlIHNpbmNlIHRoZSB1c2VyIHNob3VsZCBiZQorCSAgIGFibGUgdG8gdXNlIHJwY2dlbiBvbiB0aGlzIGZpbGUuICAqLworCWtleWRhdCBrZXk7CisJdmFsZGF0IHZhbDsKKyNlbHNlCisJdmFsZGF0IHZhbDsKKwlrZXlkYXQga2V5OworI2VuZGlmCit9OworCisKK3N0cnVjdCB5cHJlc3BfbWFzdGVyIHsKKwl5cHN0YXQgc3RhdDsKKwlwZWVybmFtZSBwZWVyOworfTsKKworc3RydWN0IHlwcmVzcF9vcmRlciB7CisJeXBzdGF0IHN0YXQ7CisJdW5zaWduZWQgaW50IG9yZGVybnVtOworfTsKKwordW5pb24geXByZXNwX2FsbCBzd2l0Y2ggKGJvb2wgbW9yZSkgeworY2FzZSBUUlVFOgorCXlwcmVzcF9rZXlfdmFsIHZhbDsKK2Nhc2UgRkFMU0U6CisJdm9pZDsKK307CisKK3N0cnVjdCB5cHJlc3BfeGZyIHsKKwl1bnNpZ25lZCBpbnQgdHJhbnNpZDsKKwl5cHhmcnN0YXQgeGZyc3RhdDsKK307CisKK3N0cnVjdCB5cG1hcGxpc3QgeworCW1hcG5hbWUgbWFwOworCXlwbWFwbGlzdCAqbmV4dDsKK307CisKK3N0cnVjdCB5cHJlc3BfbWFwbGlzdCB7CisJeXBzdGF0IHN0YXQ7CisJeXBtYXBsaXN0ICptYXBzOworfTsKKworZW51bSB5cHB1c2hfc3RhdHVzIHsKKwlZUFBVU0hfU1VDQwk9ICAxLAkvKiBTdWNjZXNzICovCisJWVBQVVNIX0FHRQk9ICAyLAkvKiBNYXN0ZXIncyB2ZXJzaW9uIG5vdCBuZXdlciAqLworCVlQUFVTSF9OT01BUAk9IC0xLAkvKiBDYW4ndCBmaW5kIHNlcnZlciBmb3IgbWFwICovCisJWVBQVVNIX05PRE9NCT0gLTIsCS8qIERvbWFpbiBub3Qgc3VwcG9ydGVkICovCisJWVBQVVNIX1JTUkMJPSAtMywJLyogTG9jYWwgcmVzb3VyY2UgYWxsb2MgZmFpbHVyZSAqLworCVlQUFVTSF9SUEMJPSAtNCwJLyogUlBDIGZhaWx1cmUgdGFsa2luZyB0byBzZXJ2ZXIgKi8KKwlZUFBVU0hfTUFERFIJPSAtNSwJLyogQ2FuJ3QgZ2V0IG1hc3RlciBhZGRyZXNzICovCisJWVBQVVNIX1lQRVJSCT0gLTYsCS8qIFlQIHNlcnZlci9tYXAgZGIgZXJyb3IgKi8KKwlZUFBVU0hfQkFEQVJHUwk9IC03LAkvKiBSZXF1ZXN0IGFyZ3VtZW50cyBiYWQgKi8KKwlZUFBVU0hfREJNCT0gLTgsCS8qIExvY2FsIGRibSBvcGVyYXRpb24gZmFpbGVkICovCisJWVBQVVNIX0ZJTEUJPSAtOSwJLyogTG9jYWwgZmlsZSBJL08gb3BlcmF0aW9uIGZhaWxlZCAqLworCVlQUFVTSF9TS0VXCT0gLTEwLAkvKiBNYXAgdmVyc2lvbiBza2V3IGR1cmluZyB0cmFuc2ZlciAqLworCVlQUFVTSF9DTEVBUgk9IC0xMSwJLyogQ2FuJ3Qgc2VuZCAiQ2xlYXIiIHJlcSB0byBsb2NhbCB5cHNlcnYgKi8KKwlZUFBVU0hfRk9SQ0UJPSAtMTIsCS8qIE5vIGxvY2FsIG9yZGVyIG51bWJlciBpbiBtYXAgIHVzZSAtZiBmbGFnLiAqLworCVlQUFVTSF9YRlJFUlIJPSAtMTMsCS8qIHlweGZyIGVycm9yICovCisJWVBQVVNIX1JFRlVTRUQJPSAtMTQJLyogVHJhbnNmZXIgcmVxdWVzdCByZWZ1c2VkIGJ5IHlwc2VydiAqLworfTsKKworc3RydWN0IHlwcHVzaHJlc3BfeGZyIHsKKwl1bnNpZ25lZCB0cmFuc2lkOworCXlwcHVzaF9zdGF0dXMgc3RhdHVzOworfTsKKworLyoKKyAqIFJlc3BvbnNlIHN0cnVjdHVyZSBhbmQgb3ZlcmFsbCByZXN1bHQgc3RhdHVzIGNvZGVzLiAgU3VjY2VzcyBhbmQgZmFpbHVyZQorICogcmVwcmVzZW50IHR3byBzZXBhcmF0ZSByZXNwb25zZSBtZXNzYWdlIHR5cGVzLgorICovCisKK2VudW0geXBiaW5kX3Jlc3B0eXBlIHsKKwlZUEJJTkRfU1VDQ19WQUwgPSAxLAorCVlQQklORF9GQUlMX1ZBTCA9IDIKK307CisKK3N0cnVjdCB5cGJpbmRfYmluZGluZyB7CisgICAgb3BhcXVlIHlwYmluZF9iaW5kaW5nX2FkZHJbNF07IC8qIEluIG5ldHdvcmsgb3JkZXIgKi8KKyAgICBvcGFxdWUgeXBiaW5kX2JpbmRpbmdfcG9ydFsyXTsgLyogSW4gbmV0d29yayBvcmRlciAqLworfTsKKwordW5pb24geXBiaW5kX3Jlc3Agc3dpdGNoICh5cGJpbmRfcmVzcHR5cGUgeXBiaW5kX3N0YXR1cykgeworY2FzZSBZUEJJTkRfRkFJTF9WQUw6CisJdW5zaWduZWQgeXBiaW5kX2Vycm9yOworY2FzZSBZUEJJTkRfU1VDQ19WQUw6CisJeXBiaW5kX2JpbmRpbmcgeXBiaW5kX2JpbmRpbmZvOworfTsKKworLyogRGV0YWlsZWQgZmFpbHVyZSByZWFzb24gY29kZXMgZm9yIHJlc3BvbnNlIGZpZWxkIHlwYmluZF9lcnJvciovCisKK2NvbnN0IFlQQklORF9FUlJfRVJSICAgID0gMTsJLyogSW50ZXJuYWwgZXJyb3IgKi8KK2NvbnN0IFlQQklORF9FUlJfTk9TRVJWID0gMjsJLyogTm8gYm91bmQgc2VydmVyIGZvciBwYXNzZWQgZG9tYWluICovCitjb25zdCBZUEJJTkRfRVJSX1JFU0MgICA9IDM7CS8qIFN5c3RlbSByZXNvdXJjZSBhbGxvY2F0aW9uIGZhaWx1cmUgKi8KKworCisvKgorICogUmVxdWVzdCBkYXRhIHN0cnVjdHVyZSBmb3IgeXBiaW5kICJTZXQgZG9tYWluIiBwcm9jZWR1cmUuCisgKi8KK3N0cnVjdCB5cGJpbmRfc2V0ZG9tIHsKKwlkb21haW5uYW1lIHlwc2V0ZG9tX2RvbWFpbjsKKwl5cGJpbmRfYmluZGluZyB5cHNldGRvbV9iaW5kaW5nOworCXVuc2lnbmVkIHlwc2V0ZG9tX3ZlcnM7Cit9OworCisKKy8qCisgKiBZUCBhY2Nlc3MgcHJvdG9jb2wKKyAqLworcHJvZ3JhbSBZUFBST0cgeworCXZlcnNpb24gWVBWRVJTIHsKKwkJdm9pZAorCQlZUFBST0NfTlVMTCh2b2lkKSA9IDA7CisKKwkJYm9vbAorCQlZUFBST0NfRE9NQUlOKGRvbWFpbm5hbWUpID0gMTsKKworCQlib29sCisJCVlQUFJPQ19ET01BSU5fTk9OQUNLKGRvbWFpbm5hbWUpID0gMjsKKworCQl5cHJlc3BfdmFsCisJCVlQUFJPQ19NQVRDSCh5cHJlcV9rZXkpID0gMzsKKworCQl5cHJlc3Bfa2V5X3ZhbAorCQlZUFBST0NfRklSU1QoeXByZXFfa2V5KSA9IDQ7CisKKwkJeXByZXNwX2tleV92YWwKKwkJWVBQUk9DX05FWFQoeXByZXFfa2V5KSA9IDU7CisKKwkJeXByZXNwX3hmcgorCQlZUFBST0NfWEZSKHlwcmVxX3hmcikgPSA2OworCisJCXZvaWQKKwkJWVBQUk9DX0NMRUFSKHZvaWQpID0gNzsKKworCQl5cHJlc3BfYWxsCisJCVlQUFJPQ19BTEwoeXByZXFfbm9rZXkpID0gODsKKworCQl5cHJlc3BfbWFzdGVyCisJCVlQUFJPQ19NQVNURVIoeXByZXFfbm9rZXkpID0gOTsKKworCQl5cHJlc3Bfb3JkZXIKKwkJWVBQUk9DX09SREVSKHlwcmVxX25va2V5KSA9IDEwOworCisJCXlwcmVzcF9tYXBsaXN0CisJCVlQUFJPQ19NQVBMSVNUKGRvbWFpbm5hbWUpID0gMTE7CisJfSA9IDI7Cit9ID0gMTAwMDA0OworCisKKy8qCisgKiBZUFBVU0hQUk9DX1hGUlJFU1AgaXMgdGhlIGNhbGxiYWNrIHJvdXRpbmUgZm9yIHJlc3VsdCBvZiBZUFBST0NfWEZSCisgKi8KK3Byb2dyYW0gWVBQVVNIX1hGUlJFU1BQUk9HIHsKKwl2ZXJzaW9uIFlQUFVTSF9YRlJSRVNQVkVSUyB7CisJCXZvaWQKKwkJWVBQVVNIUFJPQ19OVUxMKHZvaWQpID0gMDsKKworI2lmZGVmIFNUVVBJRF9TVU5fQlVHCisJCS8qIFRoaXMgaXMgdGhlIGZvcm0gYXMgZGlzdHJpYnV0ZWQgYnkgU3VuLiAgQnV0IGV2ZW4KKwkJICAgdGhlIFN1biBOSVMgc2VydmVycyBleHBlY3QgdGhlIHZhbHVlcyBpbiB0aGUgb3RoZXIKKwkJICAgb3JkZXIuICBTbyB0aGVpciBpbXBsZW1lbnRhdGlvbiBzb21laG93IG11c3QgY2hhbmdlCisJCSAgIHRoZSBvcmRlciBpbnRlcm5hbGx5LiAgV2UgZG9uJ3Qgd2FudCB0byBmb2xsb3cgdGhpcworCQkgICBiYWQgZXhhbXBsZSBzaW5jZSB0aGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byB1c2UKKwkJICAgcnBjZ2VuIG9uIHRoaXMgZmlsZS4gICovCisJCXlwcHVzaHJlc3BfeGZyCisJCVlQUFVTSFBST0NfWEZSUkVTUCh2b2lkKSA9IDE7CisjZWxzZQorCQl2b2lkCisJCVlQUFVTSFBST0NfWEZSUkVTUCh5cHB1c2hyZXNwX3hmcikgPSAxOworI2VuZGlmCisJfSA9IDE7Cit9ID0gMHg0MDAwMDAwMDsJLyogdHJhbnNpZW50OiBjb3VsZCBiZSBhbnl0aGluZyB1cCB0byAweDVmZmZmZmZmICovCisKKy8qCisgKiBZUCBiaW5kaW5nIHByb3RvY29sCisgKi8KK3Byb2dyYW0gWVBCSU5EUFJPRyB7CisJdmVyc2lvbiBZUEJJTkRWRVJTIHsKKwkJdm9pZAorCQlZUEJJTkRQUk9DX05VTEwodm9pZCkgPSAwOworCisJCXlwYmluZF9yZXNwCisJCVlQQklORFBST0NfRE9NQUlOKGRvbWFpbm5hbWUpID0gMTsKKworCQl2b2lkCisJCVlQQklORFBST0NfU0VURE9NKHlwYmluZF9zZXRkb20pID0gMjsKKwl9ID0gMjsKK30gPSAxMDAwMDc7CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cF9wcm90LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cF9wcm90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwZGIzNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwX3Byb3QuaApAQCAtMCwwICsxLDM2NiBAQAorLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBzeW1ib2xzIGFuZCBzdHJ1Y3R1cmVzIGRlZmluaW5nIHRoZSBycGMgcHJvdG9jb2wKKyAqIGJldHdlZW4gdGhlIE5JUyBjbGllbnRzIGFuZCB0aGUgTklTIHNlcnZlcnMuICBUaGUgc2VydmVycworICogYXJlIHRoZSBOSVMgZGF0YWJhc2Ugc2VydmVycywgYW5kIHRoZSBOSVMgYmluZGVycy4KKyAqLworCisjaWZuZGVmIF9SUENTVkNfWVBfUFJPVF9ICisjZGVmaW5lIF9SUENTVkNfWVBfUFJPVF9ICisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorI2luY2x1ZGUgPHJwY3N2Yy95cGNsbnQuaD4KKworX19CRUdJTl9ERUNMUworCisvKgorICogVGhlIGZvbGxvd2luZyBwcm9jZWR1cmVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIHByb3RvY29sOgorICoKKyAqIFlQUFJPQ19OVUxMKCkgcmV0dXJucyAoKSB0YWtlcyBub3RoaW5nLCByZXR1cm5zIG5vdGhpbmcuICBUaGlzIGluZGljYXRlcworICogdGhhdCB0aGUgTklTIHNlcnZlciBpcyBhbGl2ZS4KKyAqCisgKiBZUFBST0NfRE9NQUlOIChjaGFyICopIHJldHVybnMgKGJvb2xfdCkgVFJVRS4gIEluZGljYXRlcyB0aGF0IHRoZQorICogcmVzcG9uZGluZyBOSVMgc2VydmVyIGRvZXMgc2VydmUgdGhlIG5hbWVkIGRvbWFpbjsgRkFMU0UgaW5kaWNhdGVzIG5vCisgKiBzdXBwb3J0LgorICoKKyAqIFlQUFJPQ19ET01BSU5fTk9OQUNLIChjaGFyICopIHJldHVybnMgKFRSVUUpIGlmIHRoZSBOSVMgc2VydmVyIGRvZXMgc2VydmUKKyAqIHRoZSBuYW1lZCBkb21haW4sIG90aGVyd2lzZSBkb2VzIG5vdCByZXR1cm4uICBVc2VkIGluIHRoZSBicm9hZGNhc3QgY2FzZS4KKyAqCisgKiBZUFBST0NfTUFUQ0ggKHN0cnVjdCB5cHJlcV9rZXkpIHJldHVybnMgKHN0cnVjdCB5cHJlc3BfdmFsKS4gIFJldHVybnMgdGhlCisgKiByaWdodC1oYW5kIHZhbHVlIGZvciBhIHBhc3NlZCBsZWZ0LWhhbmQga2V5LCB3aXRoaW4gYSBuYW1lZCBtYXAgYW5kCisgKiBkb21haW4uCisgKgorICogWVBQUk9DX0ZJUlNUIChzdHJ1Y3QgeXByZXFfbm9rZXkpIHJldHVybnMgKHN0cnVjdCB5cHJlc3Bfa2V5X3ZhbCkuCisgKiBSZXR1cm5zIHRoZSBmaXJzdCBrZXktdmFsdWUgcGFpciBmcm9tIGEgbmFtZWQgZG9tYWluIGFuZCBtYXAuCisgKgorICogWVBQUk9DX05FWFQgKHN0cnVjdCB5cHJlcV9rZXkpIHJldHVybnMgKHN0cnVjdCB5cHJlc3Bfa2V5X3ZhbCkuICBSZXR1cm5zCisgKiB0aGUga2V5LXZhbHVlIHBhaXIgZm9sbG93aW5nIGEgcGFzc2VkIGtleS12YWx1ZSBwYWlyIHdpdGhpbiBhIG5hbWVkCisgKiBkb21haW4gYW5kIG1hcC4KKyAqCisgKiBZUFBST0NfWEZSIChzdHJ1Y3QgeXByZXFfeGZyKSByZXR1cm5zIG5vdGhpbmcuICBJbmRpY2F0ZXMgdG8gYSBzZXJ2ZXIgdGhhdAorICogYSBtYXAgc2hvdWxkIGJlIHVwZGF0ZWQuCisgKgorICogWVBQUk9DX0NMRUFSCXRha2VzIG5vdGhpbmcsIHJldHVybnMgbm90aGluZy4gIEluc3RydWN0cyBhIE5JUyBzZXJ2ZXIgdG8KKyAqIGNsb3NlIHRoZSBjdXJyZW50IG1hcCwgc28gdGhhdCBvbGQgdmVyc2lvbnMgb2YgdGhlIGRpc2sgZmlsZSBkb24ndCBnZXQKKyAqIGhlbGQgb3Blbi4KKyAqCisgKiBZUFBST0NfQUxMIChzdHJ1Y3QgeXByZXFfbm9rZXkpLCByZXR1cm5zCisgKiAJdW5pb24gc3dpdGNoIChib29sX3QgbW9yZSkgeworICoJCVRSVUU6CShzdHJ1Y3QgeXByZXNwX2tleV92YWwpOworICoJCUZBTFNFOgkoc3RydWN0KSB7fTsKKyAqCX0KKyAqCisgKiBZUFBST0NfTUFTVEVSIChzdHJ1Y3QgeXByZXFfbm9rZXkpLCByZXR1cm5zICh5cHJlc3BfbWFzdGVyKQorICoKKyAqIFlQUFJPQ19PUkRFUiAoc3RydWN0IHlwcmVxX25va2V5KSwgcmV0dXJucyAoeXByZXNwX29yZGVyKQorICoKKyAqIFlQUFJPQ19NQVBMSVNUIChjaGFyICopLCByZXR1cm5zIChzdHJ1Y3QgeXBtYXBsaXN0ICopCisgKi8KKworLyogUHJvZ3JhbSBhbmQgdmVyc2lvbiBzeW1ib2xzLCBtYWdpYyBudW1iZXJzICovCisKKyNkZWZpbmUgWVBQUk9HCQkxMDAwMDQKKyNkZWZpbmUgWVBWRVJTCQkyCisjZGVmaW5lIFlQVkVSU19PUklHCTEKKyNkZWZpbmUgWVBNQVhSRUNPUkQJMTAyNAorI2RlZmluZSBZUE1BWERPTUFJTgk2NCAvKiBYWFggb3JpZy4geXBfcHJvdC5oIGRlZmluZXMgMjU2ICovCisjZGVmaW5lIFlQTUFYTUFQCTY0CisjZGVmaW5lIFlQTUFYUEVFUgk2NCAvKiBYWFggb3JpZy4geXBfcHJvdC5oIGRlZmluZXMgMjU2ICovCisKKy8qIGJ5dGUgc2l6ZSBvZiBhIGxhcmdlIE5JUyBwYWNrZXQgKi8KKyNkZWZpbmUgWVBNU0dTWgkJMTYwMAorCit0eXBlZGVmIHN0cnVjdCB7CisgIHVfaW50IGtleWRhdF9sZW47CisgIGNoYXIgKmtleWRhdF92YWw7Cit9IGtleWRhdF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVfaW50IHZhbGRhdF9sZW47CisgIGNoYXIgKnZhbGRhdF92YWw7Cit9IHZhbGRhdF90OworCitzdHJ1Y3QgeXBtYXBfcGFybXMgeworICBjaGFyICpkb21haW47CQkJLyogTnVsbCBzdHJpbmcgbWVhbnMgbm90IGF2YWlsYWJsZSAqLworICBjaGFyICptYXA7CQkJLyogTnVsbCBzdHJpbmcgbWVhbnMgbm90IGF2YWlsYWJsZSAqLworICB1bnNpZ25lZCBpbnQgb3JkZXJudW07CS8qIDAgbWVhbnMgbm90IGF2YWlsYWJsZSAqLworICBjaGFyICpvd25lcjsJCQkvKiBOdWxsIHN0cmluZyBtZWFucyBub3QgYXZhaWxhYmxlICovCit9OworCisvKgorICogUmVxdWVzdCBwYXJhbWV0ZXIgc3RydWN0dXJlcworICovCisKK3N0cnVjdCB5cHJlcV9rZXkgeworICBjb25zdCBjaGFyICpkb21haW47CisgIGNvbnN0IGNoYXIgKm1hcDsKKyAga2V5ZGF0X3Qga2V5ZGF0OworfTsKKworc3RydWN0IHlwcmVxX25va2V5IHsKKyAgY2hhciAqZG9tYWluOworICBjaGFyICptYXA7Cit9OworCitzdHJ1Y3QgeXByZXFfeGZyIHsKKyAgc3RydWN0IHlwbWFwX3Bhcm1zIG1hcF9wYXJtczsKKyAgdV9pbnQgdHJhbnNpZDsKKyAgdV9pbnQgcHJvdG87CisgIHVfaW50IHBvcnQ7Cit9OworCisjZGVmaW5lIHlweGZyX2RvbWFpbiBtYXBfcGFybXMuZG9tYWluCisjZGVmaW5lIHlweGZyX21hcCBtYXBfcGFybXMubWFwCisjZGVmaW5lIHlweGZyX29yZGVybnVtIG1hcF9wYXJtcy5vcmRlcm51bQorI2RlZmluZSB5cHhmcl9vd25lciBtYXBfcGFybXMub3duZXIKKworLyogUmV0dXJuIHN0YXR1cyB2YWx1ZXMgKi8KKworZW51bSB5cHN0YXQgeworICBZUF9UUlVFID0gMSwJCS8qIEdlbmVyYWwgcHVycG9zZSBzdWNjZXNzIGNvZGUgKi8KKyNkZWZpbmUgWVBfVFJVRSBZUF9UUlVFCisgIFlQX05PTU9SRSA9IDIsCS8qIE5vIG1vcmUgZW50cmllcyBpbiBtYXAgKi8KKyNkZWZpbmUgWVBfTk9NT1JFIFlQX05PTU9SRQorICBZUF9GQUxTRSA9IDAsCQkvKiBHZW5lcmFsIHB1cnBvc2UgZmFpbHVyZSBjb2RlICovCisjZGVmaW5lIFlQX0ZBTFNFIFlQX0ZBTFNFCisgIFlQX05PTUFQID0gLTEsCS8qIE5vIHN1Y2ggbWFwIGluIGRvbWFpbiAqLworI2RlZmluZSBZUF9OT01BUCBZUF9OT01BUAorICBZUF9OT0RPTSA9IC0yLAkvKiBEb21haW4gbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBZUF9OT0RPTSBZUF9OT0RPTQorICBZUF9OT0tFWSA9IC0zLAkvKiBObyBzdWNoIGtleSBpbiBtYXAgKi8KKyNkZWZpbmUgWVBfTk9LRVkgWVBfTk9LRVkKKyAgWVBfQkFET1AgPSAtNCwJLyogSW52YWxpZCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgWVBfQkFET1AgWVBfQkFET1AKKyAgWVBfQkFEREIgPSAtNSwJLyogU2VydmVyIGRhdGEgYmFzZSBpcyBiYWQgKi8KKyNkZWZpbmUgWVBfQkFEREIgWVBfQkFEREIKKyAgWVBfWVBFUlIgPSAtNiwJLyogTklTIHNlcnZlciBlcnJvciAqLworI2RlZmluZSBZUF9ZUEVSUiBZUF9ZUEVSUgorICBZUF9CQURBUkdTID0gLTcsCS8qIFJlcXVlc3QgYXJndW1lbnRzIGJhZCAqLworI2RlZmluZSBZUF9CQURBUkdTIFlQX0JBREFSR1MKKyAgWVBfVkVSUyA9IC04LAkJLyogTklTIHNlcnZlciB2ZXJzaW9uIG1pc21hdGNoIC0gc2VydmVyIGNhbid0IHN1cHBseQorCQkJICAgcmVxdWVzdGVkIHNlcnZpY2UuICovCisjZGVmaW5lIFlQX1ZFUlMgWVBfVkVSUworfTsKKworLyoKKyAqIFJlc3BvbnNlIHBhcmFtZXRlciBzdHJ1Y3R1cmVzCisgKi8KKwordHlwZWRlZiBlbnVtIHlwc3RhdCB5cHN0YXQ7CisKK3N0cnVjdCB5cHJlc3BfdmFsIHsKKyAgeXBzdGF0IHN0YXR1czsKKyAgdmFsZGF0X3QgdmFsZGF0OworfTsKKworc3RydWN0IHlwcmVzcF9rZXlfdmFsIHsKKyAgeXBzdGF0IHN0YXR1czsKKyNpZmRlZiBTVFVQSURfU1VOX0JVRworICAvKiBUaGlzIGlzIHRoZSBmb3JtIGFzIGRpc3RyaWJ1dGVkIGJ5IFN1bi4gIEJ1dCBldmVuIHRoZSBTdW4gTklTCisgICAgIHNlcnZlcnMgZXhwZWN0IHRoZSB2YWx1ZXMgaW4gdGhlIG90aGVyIG9yZGVyLiAgU28gdGhlaXIKKyAgICAgaW1wbGVtZW50YXRpb24gc29tZWhvdyBtdXN0IGNoYW5nZSB0aGUgb3JkZXIgaW50ZXJuYWxseS4gIFdlCisgICAgIGRvbid0IHdhbnQgdG8gZm9sbG93IHRoaXMgYmFkIGV4YW1wbGUgc2luY2UgdGhlIHVzZXIgc2hvdWxkIGJlCisgICAgIGFibGUgdG8gdXNlIHJwY2dlbiBvbiB0aGlzIGZpbGUuICAqLworICBrZXlkYXRfdCBrZXlkYXQ7CisgIHZhbGRhdF90IHZhbGRhdDsKKyNlbHNlCisgIHZhbGRhdF90IHZhbGRhdDsKKyAga2V5ZGF0X3Qga2V5ZGF0OworI2VuZGlmCit9OworCitzdHJ1Y3QgeXByZXNwX21hc3RlciB7CisgIHlwc3RhdCBzdGF0dXM7CisgIGNoYXIgKm1hc3RlcjsKK307CisKK3N0cnVjdCB5cHJlc3Bfb3JkZXIgeworICB5cHN0YXQgc3RhdHVzOworICB1X2ludCBvcmRlcm51bTsKK307CisKK3N0cnVjdCB5cG1hcGxpc3QgeworICBjaGFyICptYXA7CisjZGVmaW5lIHlwbWxfbmFtZSBtYXAKKyAgc3RydWN0IHlwbWFwbGlzdCAqbmV4dDsKKyNkZWZpbmUgeXBtbF9uZXh0IG5leHQKK307CisKK3N0cnVjdCB5cHJlc3BfbWFwbGlzdCB7CisgIHlwc3RhdCBzdGF0dXM7CisgIHN0cnVjdCB5cG1hcGxpc3QgKmxpc3Q7Cit9OworCisvKgorICogUHJvY2VkdXJlIHN5bWJvbHMuICBZUFBST0NfTlVMTCwgWVBQUk9DX0RPTUFJTiwgYW5kIFlQUFJPQ19ET01BSU5fTk9OQUNLCisgKiBtdXN0IGtlZXAgdGhlIHNhbWUgdmFsdWVzICgwLCAxLCBhbmQgMikgdGhhdCB0aGV5IGhhZCBpbiB0aGUgZmlyc3QgdmVyc2lvbgorICogb2YgdGhlIHByb3RvY29sLgorICovCisKKyNkZWZpbmUgWVBQUk9DX05VTEwJMAorI2RlZmluZSBZUFBST0NfRE9NQUlOCTEKKyNkZWZpbmUgWVBQUk9DX0RPTUFJTl9OT05BQ0sgMgorI2RlZmluZSBZUFBST0NfTUFUQ0gJMworI2RlZmluZSBZUFBST0NfRklSU1QJNAorI2RlZmluZSBZUFBST0NfTkVYVAk1CisjZGVmaW5lIFlQUFJPQ19YRlIJNgorI2RlZmluZSBZUFBST0NfQ0xFQVIJNworI2RlZmluZSBZUFBST0NfQUxMCTgKKyNkZWZpbmUgWVBQUk9DX01BU1RFUgk5CisjZGVmaW5lIFlQUFJPQ19PUkRFUgkxMAorI2RlZmluZSBZUFBST0NfTUFQTElTVAkxMQorI2RlZmluZQlZUFBST0NfTkVXWEZSCTEyCisKKy8qCisgKgkJUHJvdG9jb2wgYmV0d2VlbiBjbGllbnRzIGFuZCBOSVMgYmluZGVyIHNlcnZlcnMKKyAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBwcm9jZWR1cmVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIHByb3RvY29sOgorICoKKyAqIFlQQklORFBST0NfTlVMTCgpIHJldHVybnMgKCkKKyAqIAl0YWtlcyBub3RoaW5nLCByZXR1cm5zIG5vdGhpbmcKKyAqCisgKiBZUEJJTkRQUk9DX0RPTUFJTiB0YWtlcyAoY2hhciAqKSByZXR1cm5zIChzdHJ1Y3QgeXBiaW5kX3Jlc3ApCisgKgorICogWVBCSU5EUFJPQ19TRVRET00gdGFrZXMgKHN0cnVjdCB5cGJpbmRfc2V0ZG9tKSByZXR1cm5zIG5vdGhpbmcKKyAqLworCisvKiBQcm9ncmFtIGFuZCB2ZXJzaW9uIHN5bWJvbHMsIG1hZ2ljIG51bWJlcnMgKi8KKworI2RlZmluZSBZUEJJTkRQUk9HCQkxMDAwMDcKKyNkZWZpbmUgWVBCSU5EVkVSUwkJMgorI2RlZmluZSBZUEJJTkRWRVJTX09SSUcJCTEKKworLyogUHJvY2VkdXJlIHN5bWJvbHMgKi8KKworI2RlZmluZSBZUEJJTkRQUk9DX05VTEwJCTAKKyNkZWZpbmUgWVBCSU5EUFJPQ19ET01BSU4JMQorI2RlZmluZSBZUEJJTkRQUk9DX1NFVERPTQkyCisvKgorICogUmVzcG9uc2Ugc3RydWN0dXJlIGFuZCBvdmVyYWxsIHJlc3VsdCBzdGF0dXMgY29kZXMuICBTdWNjZXNzIGFuZCBmYWlsdXJlCisgKiByZXByZXNlbnQgdHdvIHNlcGFyYXRlIHJlc3BvbnNlIG1lc3NhZ2UgdHlwZXMuCisgKi8KKworZW51bSB5cGJpbmRfcmVzcHR5cGUge1lQQklORF9TVUNDX1ZBTCA9IDEsIFlQQklORF9GQUlMX1ZBTCA9IDJ9OworCitzdHJ1Y3QgeXBiaW5kX2JpbmRpbmcgeworICBzdHJ1Y3QgaW5fYWRkciB5cGJpbmRfYmluZGluZ19hZGRyOwkgICAgICAgIC8qIEluIG5ldHdvcmsgb3JkZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgaW50IHlwYmluZF9iaW5kaW5nX3BvcnQ7CS8qIEluIG5ldHdvcmsgb3JkZXIgKi8KK307CisKK3N0cnVjdCB5cGJpbmRfcmVzcCB7CisgIGVudW0geXBiaW5kX3Jlc3B0eXBlIHlwYmluZF9zdGF0dXM7CisgIHVuaW9uIHsKKyAgICB1X2ludCB5cGJpbmRfZXJyb3I7CisgICAgc3RydWN0IHlwYmluZF9iaW5kaW5nIHlwYmluZF9iaW5kaW5mbzsKKyAgfSB5cGJpbmRfcmVzcGJvZHk7Cit9OworCisKKy8qIERldGFpbGVkIGZhaWx1cmUgcmVhc29uIGNvZGVzIGZvciByZXNwb25zZSBmaWVsZCB5cGJpbmRfZXJyb3IqLworCisjZGVmaW5lIFlQQklORF9FUlJfRVJSIDEJCS8qIEludGVybmFsIGVycm9yICovCisjZGVmaW5lIFlQQklORF9FUlJfTk9TRVJWIDIJCS8qIE5vIGJvdW5kIHNlcnZlciBmb3IgcGFzc2VkIGRvbWFpbiAqLworI2RlZmluZSBZUEJJTkRfRVJSX1JFU0MgMwkJLyogU3lzdGVtIHJlc291cmNlIGFsbG9jYXRpb24gZmFpbHVyZSAqLworCisvKgorICogUmVxdWVzdCBkYXRhIHN0cnVjdHVyZSBmb3IgeXBiaW5kICJTZXQgZG9tYWluIiBwcm9jZWR1cmUuCisgKi8KK3N0cnVjdCB5cGJpbmRfc2V0ZG9tIHsKKyAgY2hhciAqeXBzZXRkb21fZG9tYWluOworICBzdHJ1Y3QgeXBiaW5kX2JpbmRpbmcgeXBzZXRkb21fYmluZGluZzsKKyAgdV9pbnQgeXBzZXRkb21fdmVyczsKK307CisjZGVmaW5lIHlwc2V0ZG9tX2FkZHIgeXBzZXRkb21fYmluZGluZy55cGJpbmRfYmluZGluZ19hZGRyCisjZGVmaW5lIHlwc2V0ZG9tX3BvcnQgeXBzZXRkb21fYmluZGluZy55cGJpbmRfYmluZGluZ19wb3J0CisKKy8qCisgKgkJUHJvdG9jb2wgYmV0d2VlbiBjbGllbnRzICh5cHhmciwgb25seSkgYW5kIHlwcHVzaAorICoJCXlwcHVzaCBzcGVha3MgYSBwcm90b2NvbCBpbiB0aGUgdHJhbnNpZW50IHJhbmdlLCB3aGljaAorICoJCWlzIHN1cHBsaWVkIHRvIHlweGZyIGFzIGEgY29tbWFuZC1saW5lIHBhcmFtZXRlciB3aGVuIGl0CisgKgkJaXMgYWN0aXZhdGVkIGJ5IHlwc2Vydi4KKyAqLworI2RlZmluZSBZUFBVU0hWRVJTCQkxCisjZGVmaW5lIFlQUFVTSFZFUlNfT1JJRwkJMQorCisvKiBQcm9jZWR1cmUgc3ltYm9scyAqLworCisjZGVmaW5lIFlQUFVTSFBST0NfTlVMTAkJMAorI2RlZmluZSBZUFBVU0hQUk9DX1hGUlJFU1AJMQorCisvKiBTdGF0dXMgdmFsdWVzIGZvciB5cHB1c2hyZXNwX3hmci5zdGF0dXMgKi8KKworZW51bSB5cHB1c2hfc3RhdHVzIHsKKyAgWVBQVVNIX1NVQ0MgPSAxLAkJLyogU3VjY2VzcyAqLworI2RlZmluZSBZUFBVU0hfU1VDQwlZUFBVU0hfU1VDQworICBZUFBVU0hfQUdFID0gMiwJCS8qIE1hc3RlcidzIHZlcnNpb24gbm90IG5ld2VyICovCisjZGVmaW5lIFlQUFVTSF9BR0UJWVBQVVNIX0FHRQorICBZUFBVU0hfTk9NQVAgPSAtMSwJCS8qIENhbid0IGZpbmQgc2VydmVyIGZvciBtYXAgKi8KKyNkZWZpbmUgWVBQVVNIX05PTUFQIAlZUFBVU0hfTk9NQVAKKyAgWVBQVVNIX05PRE9NID0gLTIsCQkvKiBEb21haW4gbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBZUFBVU0hfTk9ET00gCVlQUFVTSF9OT0RPTQorICBZUFBVU0hfUlNSQyA9IC0zLAkJLyogTG9jYWwgcmVzb3VjZSBhbGxvYyBmYWlsdXJlICovCisjZGVmaW5lIFlQUFVTSF9SU1JDIAlZUFBVU0hfUlNSQworICBZUFBVU0hfUlBDID0gLTQsCQkvKiBSUEMgZmFpbHVyZSB0YWxraW5nIHRvIHNlcnZlciAqLworI2RlZmluZSBZUFBVU0hfUlBDIAlZUFBVU0hfUlBDCisgIFlQUFVTSF9NQUREUiA9IC01LAkJLyogQ2FuJ3QgZ2V0IG1hc3RlciBhZGRyZXNzICovCisjZGVmaW5lIFlQUFVTSF9NQUREUglZUFBVU0hfTUFERFIKKyAgWVBQVVNIX1lQRVJSID0gLTYsCQkvKiBOSVMgc2VydmVyL21hcCBkYiBlcnJvciAqLworI2RlZmluZSBZUFBVU0hfWVBFUlIgCVlQUFVTSF9ZUEVSUgorICBZUFBVU0hfQkFEQVJHUyA9IC03LAkJLyogUmVxdWVzdCBhcmd1bWVudHMgYmFkICovCisjZGVmaW5lIFlQUFVTSF9CQURBUkdTIAlZUFBVU0hfQkFEQVJHUworICBZUFBVU0hfREJNID0gLTgsCQkvKiBMb2NhbCBkYm0gb3BlcmF0aW9uIGZhaWxlZCAqLworI2RlZmluZSBZUFBVU0hfREJNCVlQUFVTSF9EQk0KKyAgWVBQVVNIX0ZJTEUgPSAtOSwJCS8qIExvY2FsIGZpbGUgSS9PIG9wZXJhdGlvbiBmYWlsZWQgKi8KKyNkZWZpbmUgWVBQVVNIX0ZJTEUJWVBQVVNIX0ZJTEUKKyAgWVBQVVNIX1NLRVcgPSAtMTAsCQkvKiBNYXAgdmVyc2lvbiBza2V3IGR1cmluZyB0cmFuc2ZlciAqLworI2RlZmluZSBZUFBVU0hfU0tFVwlZUFBVU0hfU0tFVworICBZUFBVU0hfQ0xFQVIgPSAtMTEsCQkvKiBDYW4ndCBzZW5kICJDbGVhciIgcmVxIHRvIGxvY2FsIHlwc2VydiAqLworI2RlZmluZSBZUFBVU0hfQ0xFQVIJWVBQVVNIX0NMRUFSCisgIFlQUFVTSF9GT1JDRSA9IC0xMiwJCS8qIE5vIGxvY2FsIG9yZGVyIG51bWJlciBpbiBtYXAgLSB1c2UgLWYgZmxhZyovCisjZGVmaW5lIFlQUFVTSF9GT1JDRQlZUFBVU0hfRk9SQ0UKKyAgWVBQVVNIX1hGUkVSUiA9IC0xMywJCS8qIHlweGZyIGVycm9yICovCisjZGVmaW5lIFlQUFVTSF9YRlJFUlIJWVBQVVNIX1hGUkVSUgorICBZUFBVU0hfUkVGVVNFRCA9IC0xNCwJCS8qIFRyYW5zZmVyIHJlcXVlc3QgcmVmdXNlZCBieSB5cHNlcnYgKi8KKyNkZWZpbmUgWVBQVVNIX1JFRlVTRUQJWVBQVVNIX1JFRlVTRUQKKyAgWVBQVVNIX05PQUxJQVMgPSAtMTUJCS8qIEFsaWFzIG5vdCBmb3VuZCBmb3IgbWFwIG9yIGRvbWFpbiAqLworI2RlZmluZQlZUFBVU0hfTk9BTElBUwlZUFBVU0hfTk9BTElBUworfTsKK3R5cGVkZWYgZW51bSB5cHB1c2hfc3RhdHVzIHlwcHVzaF9zdGF0dXM7CisKK3N0cnVjdCB5cHB1c2hyZXNwX3hmciB7CisgIHVfaW50IHRyYW5zaWQ7CisgIHlwcHVzaF9zdGF0dXMgc3RhdHVzOworfTsKKworc3RydWN0IHlwcmVzcF9hbGwgeworICBib29sX3QgbW9yZTsKKyAgdW5pb24geworICAgIHN0cnVjdCB5cHJlc3Bfa2V5X3ZhbCB2YWw7CisgIH0geXByZXNwX2FsbF91OworfTsKKworZXh0ZXJuIGJvb2xfdCB4ZHJfeXByZXFfa2V5IChYRFIgKl9feGRycywgc3RydWN0IHlwcmVxX2tleSAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cHJlcV9ub2tleSAoWERSICpfX3hkcnMsIHN0cnVjdCB5cHJlcV9ub2tleSAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cHJlcV94ZnIgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXByZXFfeGZyICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwcmVzcF92YWwgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXByZXNwX3ZhbCAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cHJlc3Bfa2V5X3ZhbCAoWERSICpfX3hkcnMsIHN0cnVjdCB5cHJlc3Bfa2V5X3ZhbCAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cGJpbmRfcmVzcCAoWERSICpfX3hkcnMsIHN0cnVjdCB5cGJpbmRfcmVzcCAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cGJpbmRfc2V0ZG9tIChYRFIgKl9feGRycywgc3RydWN0IHlwYmluZF9zZXRkb20gKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXBtYXBfcGFybXMgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXBtYXBfcGFybXMgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXBwdXNocmVzcF94ZnIgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXBwdXNocmVzcF94ZnIgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXByZXNwX29yZGVyIChYRFIgKl9feGRycywgc3RydWN0IHlwcmVzcF9vcmRlciAgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXByZXNwX21hc3RlciAoWERSICpfX3hkcnMsIHN0cnVjdCB5cHJlc3BfbWFzdGVyICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwYWxsIChYRFIgKl9feGRycywgc3RydWN0IHlwYWxsX2NhbGxiYWNrICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwcmVzcF9tYXBsaXN0IChYRFIgKl9feGRycywgc3RydWN0IHlwcmVzcF9tYXBsaXN0ICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwYmluZF9iaW5kaW5nIChYRFIgKl9feGRycywgc3RydWN0IHlwYmluZF9iaW5kaW5nICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwYmluZF9yZXNwdHlwZSAoWERSICpfX3hkcnMsIGVudW0geXBiaW5kX3Jlc3B0eXBlICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwc3RhdCAoWERSICpfX3hkcnMsIGVudW0geXBiaW5kX3Jlc3B0eXBlICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwcmVzcF9hbGwgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXByZXNwX2FsbCAgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfZG9tYWlubmFtZSAoWERSICpfX3hkcnMsIGNoYXIgKiogX19vYmpwKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIF9SUENTVkNfWVBfUFJPVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cGNsbnQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwY2xudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzdhMjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cGNsbnQuaApAQCAtMCwwICsxLDg5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFRob3JzdGVuIEt1a3VrIDxrdWt1a0BzdXNlLmRlPiwgMTk5Ni4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKworI2lmbmRlZglfX1JQQ1NWQ19ZUENMTlRfSF9fCisjZGVmaW5lCV9fUlBDU1ZDX1lQQ0xOVF9IX18KKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIFNvbWUgZGVmaW5lcyAqLworI2RlZmluZSBZUEVSUl9TVUNDRVNTCTAJCS8qIFRoZXJlIGlzIG5vIGVycm9yICovCisjZGVmaW5lCVlQRVJSX0JBREFSR1MJMQkJLyogQXJncyB0byBmdW5jdGlvbiBhcmUgYmFkICovCisjZGVmaW5lCVlQRVJSX1JQQyAJMgkJLyogUlBDIGZhaWx1cmUgKi8KKyNkZWZpbmUJWVBFUlJfRE9NQUlOCTMJCS8qIENhbid0IGJpbmQgdG8gYSBzZXJ2ZXIgd2l0aCB0aGlzIGRvbWFpbiAqLworI2RlZmluZQlZUEVSUl9NQVAJNAkJLyogTm8gc3VjaCBtYXAgaW4gc2VydmVyJ3MgZG9tYWluICovCisjZGVmaW5lCVlQRVJSX0tFWQk1CQkvKiBObyBzdWNoIGtleSBpbiBtYXAgKi8KKyNkZWZpbmUJWVBFUlJfWVBFUlIJNgkJLyogSW50ZXJuYWwgeXAgc2VydmVyIG9yIGNsaWVudCBlcnJvciAqLworI2RlZmluZQlZUEVSUl9SRVNSQwk3CQkvKiBMb2NhbCByZXNvdXJjZSBhbGxvY2F0aW9uIGZhaWx1cmUgKi8KKyNkZWZpbmUJWVBFUlJfTk9NT1JFCTgJCS8qIE5vIG1vcmUgcmVjb3JkcyBpbiBtYXAgZGF0YWJhc2UgKi8KKyNkZWZpbmUJWVBFUlJfUE1BUAk5CQkvKiBDYW4ndCBjb21tdW5pY2F0ZSB3aXRoIHBvcnRtYXBwZXIgKi8KKyNkZWZpbmUJWVBFUlJfWVBCSU5ECTEwCQkvKiBDYW4ndCBjb21tdW5pY2F0ZSB3aXRoIHlwYmluZCAqLworI2RlZmluZQlZUEVSUl9ZUFNFUlYJMTEJCS8qIENhbid0IGNvbW11bmljYXRlIHdpdGggeXBzZXJ2ICovCisjZGVmaW5lCVlQRVJSX05PRE9NCTEyCQkvKiBMb2NhbCBkb21haW4gbmFtZSBub3Qgc2V0ICovCisjZGVmaW5lCVlQRVJSX0JBRERCCTEzCQkvKiB5cCBkYXRhIGJhc2UgaXMgYmFkICovCisjZGVmaW5lCVlQRVJSX1ZFUlMJMTQJCS8qIFlQIHZlcnNpb24gbWlzbWF0Y2ggKi8KKyNkZWZpbmUJWVBFUlJfQUNDRVNTCTE1CQkvKiBBY2Nlc3MgdmlvbGF0aW9uICovCisjZGVmaW5lCVlQRVJSX0JVU1kJMTYJCS8qIERhdGFiYXNlIGlzIGJ1c3kgKi8KKworLyogVHlwZXMgb2YgdXBkYXRlIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUJWVBPUF9DSEFOR0UJMQkJLyogQ2hhbmdlLCBkbyBub3QgYWRkICovCisjZGVmaW5lCVlQT1BfSU5TRVJUCTIJCS8qIEFkZCwgZG8gbm90IGNoYW5nZSAqLworI2RlZmluZQlZUE9QX0RFTEVURQkzCQkvKiBEZWxldGUgdGhpcyBlbnRyeSAqLworI2RlZmluZQlZUE9QX1NUT1JFCTQJCS8qIEFkZCwgb3IgY2hhbmdlICovCisKK19fQkVHSU5fREVDTFMKKworLyogc3RydWN0IHlwYWxsX2NhbGxiYWNrICogaXMgdGhlIGFyZyB3aGljaCBtdXN0IGJlIHBhc3NlZCB0byB5cF9hbGwuICAqLworc3RydWN0IHlwYWxsX2NhbGxiYWNrCisgIHsKKyAgICBpbnQgKCpmb3JlYWNoKSAoaW50IF9fc3RhdHVzLCBjaGFyICpfX2tleSwgaW50IF9fa2V5bGVuLAorCQkgICAgY2hhciAqX192YWwsIGludCBfX3ZhbGxlbiwgY2hhciAqX19kYXRhKTsKKyAgICBjaGFyICpkYXRhOworICB9OworCisvKiBFeHRlcm5hbCBOSVMgY2xpZW50IGZ1bmN0aW9uIHJlZmVyZW5jZXMuICAqLworZXh0ZXJuIGludCB5cF9iaW5kIChfX2NvbnN0IGNoYXIgKikgX19USFJPVzsKK2V4dGVybiB2b2lkIHlwX3VuYmluZCAoX19jb25zdCBjaGFyICopIF9fVEhST1c7CitleHRlcm4gaW50IHlwX2dldF9kZWZhdWx0X2RvbWFpbiAoY2hhciAqKikgX19USFJPVzsKK2V4dGVybiBpbnQgeXBfbWF0Y2ggKF9fY29uc3QgY2hhciAqLCBfX2NvbnN0IGNoYXIgKiwgX19jb25zdCBjaGFyICosCisJCSAgICAgX19jb25zdCBpbnQsIGNoYXIgKiosIGludCAqKSBfX1RIUk9XOworZXh0ZXJuIGludCB5cF9maXJzdCAoX19jb25zdCBjaGFyICosIF9fY29uc3QgY2hhciAqLCBjaGFyICoqLAorCQkgICAgIGludCAqLCBjaGFyICoqLCBpbnQgKikgX19USFJPVzsKK2V4dGVybiBpbnQgeXBfbmV4dCAoX19jb25zdCBjaGFyICosIF9fY29uc3QgY2hhciAqLCBfX2NvbnN0IGNoYXIgKiwKKwkJICAgIF9fY29uc3QgaW50LCBjaGFyICoqLCBpbnQgKiwgY2hhciAqKiwgaW50ICopIF9fVEhST1c7CitleHRlcm4gaW50IHlwX21hc3RlciAoX19jb25zdCBjaGFyICosIF9fY29uc3QgY2hhciAqLCBjaGFyICoqKSBfX1RIUk9XOworZXh0ZXJuIGludCB5cF9vcmRlciAoX19jb25zdCBjaGFyICosIF9fY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQgKikgX19USFJPVzsKK2V4dGVybiBpbnQgeXBfYWxsIChfX2NvbnN0IGNoYXIgKiwgX19jb25zdCBjaGFyICosCisJCSAgIF9fY29uc3Qgc3RydWN0IHlwYWxsX2NhbGxiYWNrICopIF9fVEhST1c7CitleHRlcm4gX19jb25zdCBjaGFyICp5cGVycl9zdHJpbmcgKF9fY29uc3QgaW50KSBfX1RIUk9XOworZXh0ZXJuIF9fY29uc3QgY2hhciAqeXBiaW5kZXJyX3N0cmluZyAoX19jb25zdCBpbnQpIF9fVEhST1c7CitleHRlcm4gaW50IHlwcHJvdF9lcnIgKF9fY29uc3QgaW50KSBfX1RIUk9XOworZXh0ZXJuIGludCB5cF91cGRhdGUgKGNoYXIgKiwgY2hhciAqLCB1bnNpZ25lZCBpbnQsICBjaGFyICosCisJCSAgICAgIGludCwgY2hhciAqLCBpbnQpIF9fVEhST1c7CisjaWYgMAorZXh0ZXJuIGludCB5cF9tYXBsaXN0IChfX2NvbnN0IGNoYXIgKiwgc3RydWN0IHlwbWFwbGlzdCAqKikgX19USFJPVzsKKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9ucyBleGlzdHMgb25seSB1bmRlciBCU0QgYW5kIExpbnV4IHN5c3RlbXMuICAqLworZXh0ZXJuIGludCBfX3lwX2NoZWNrIChjaGFyICoqKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogX19SUENTVkNfWVBDTE5UX0hfXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXBwYXNzd2QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwcGFzc3dkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiZTliMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwcGFzc3dkLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9ZUFBBU1NXRF9IX1JQQ0dFTgorI2RlZmluZSBfWVBQQVNTV0RfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworc3RydWN0IHBhc3N3ZCB7CisJY2hhciAqcHdfbmFtZTsKKwljaGFyICpwd19wYXNzd2Q7CisJaW50IHB3X3VpZDsKKwlpbnQgcHdfZ2lkOworCWNoYXIgKnB3X2dlY29zOworCWNoYXIgKnB3X2RpcjsKKwljaGFyICpwd19zaGVsbDsKK307Cit0eXBlZGVmIHN0cnVjdCBwYXNzd2QgcGFzc3dkOworCitzdHJ1Y3QgeXBwYXNzd2QgeworCWNoYXIgKm9sZHBhc3M7CisJcGFzc3dkIG5ld3B3OworfTsKK3R5cGVkZWYgc3RydWN0IHlwcGFzc3dkIHlwcGFzc3dkOworCisjZGVmaW5lIFlQUEFTU1dEUFJPRyAxMDAwMDkKKyNkZWZpbmUgWVBQQVNTV0RWRVJTIDEKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIFlQUEFTU1dEUFJPQ19VUERBVEUgMQorZXh0ZXJuICBpbnQgKiB5cHBhc3N3ZHByb2NfdXBkYXRlXzEoeXBwYXNzd2QgKiwgQ0xJRU5UICopOworZXh0ZXJuICBpbnQgKiB5cHBhc3N3ZHByb2NfdXBkYXRlXzFfc3ZjKHlwcGFzc3dkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCB5cHBhc3N3ZHByb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIFlQUEFTU1dEUFJPQ19VUERBVEUgMQorZXh0ZXJuICBpbnQgKiB5cHBhc3N3ZHByb2NfdXBkYXRlXzEoKTsKK2V4dGVybiAgaW50ICogeXBwYXNzd2Rwcm9jX3VwZGF0ZV8xX3N2YygpOworZXh0ZXJuIGludCB5cHBhc3N3ZHByb2dfMV9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX3Bhc3N3ZCAoWERSICosIHBhc3N3ZCopOworZXh0ZXJuICBib29sX3QgeGRyX3lwcGFzc3dkIChYRFIgKiwgeXBwYXNzd2QqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX3Bhc3N3ZCAoKTsKK2V4dGVybiBib29sX3QgeGRyX3lwcGFzc3dkICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfWVBQQVNTV0RfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwcGFzc3dkLnggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cHBhc3N3ZC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTNlZmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cHBhc3N3ZC54CkBAIC0wLDAgKzEsNjEgQEAKKy8qIEAoIyl5cHBhc3N3ZC54CTIuMSA4OC8wOC8wMSA0LjAgUlBDU1JDICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBZUCBwYXNzd29yZCB1cGRhdGUgcHJvdG9jb2wKKyAqIFJlcXVpcmVzIHVuaXggYXV0aGVudGljYXRpb24KKyAqLworcHJvZ3JhbSBZUFBBU1NXRFBST0cgeworCXZlcnNpb24gWVBQQVNTV0RWRVJTIHsKKwkJLyoKKwkJICogVXBkYXRlIG15IHBhc3N3ZCBlbnRyeQorCQkgKi8KKwkJaW50CisJCVlQUEFTU1dEUFJPQ19VUERBVEUoeXBwYXNzd2QpID0gMTsKKwl9ID0gMTsKK30gPSAxMDAwMDk7CisKKworc3RydWN0IHBhc3N3ZCB7CisJc3RyaW5nIHB3X25hbWU8PjsJLyogdXNlcm5hbWUgKi8KKwlzdHJpbmcgcHdfcGFzc3dkPD47CS8qIGVuY3J5cHRlZCBwYXNzd29yZCAqLworCWludCBwd191aWQ7CQkvKiB1c2VyIGlkICovCisJaW50IHB3X2dpZDsJCS8qIGdyb3VwIGlkICovCisJc3RyaW5nIHB3X2dlY29zPD47CS8qIGluIHJlYWwgbGlmZSBuYW1lICovCisJc3RyaW5nIHB3X2Rpcjw+OwkvKiBob21lIGRpcmVjdG9yeSAqLworCXN0cmluZyBwd19zaGVsbDw+OwkvKiBkZWZhdWx0IHNoZWxsICovCit9OworCitzdHJ1Y3QgeXBwYXNzd2QgeworCXN0cmluZyBvbGRwYXNzPD47CS8qIHVuZW5jcnlwdGVkIG9sZCBwYXNzd29yZCAqLworCXBhc3N3ZCBuZXdwdzsJCS8qIG5ldyBwYXNzd2QgZW50cnkgKi8KK307CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cHVwZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXB1cGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDdmZDRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXB1cGQuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKy8qIGZyb20gQCgjKXlwdXBkYXRlX3Byb3QueAkxLjMgOTEvMDMvMTEgVElSUEMgMS4wICovCisKKyNpZm5kZWYgX19SUENTVkNfWVBVUERfSF9fCisjZGVmaW5lIF9fUlBDU1ZDX1lQVVBEX0hfXworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworI2RlZmluZSBNQVhNQVBOQU1FTEVOIDI1NQorI2RlZmluZSBNQVhZUERBVEFMRU4gMTAyMworI2RlZmluZSBNQVhFUlJNU0dMRU4gMjU1CisKK19fQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVfaW50IHlwX2J1Zl9sZW47CisJY2hhciAqeXBfYnVmX3ZhbDsKK30geXBfYnVmOworCitleHRlcm4gIGJvb2xfdCB4ZHJfeXBfYnVmIChYRFIgKiwgeXBfYnVmKik7CisKK3N0cnVjdCB5cHVwZGF0ZV9hcmdzIHsKKwljaGFyICptYXBuYW1lOworCXlwX2J1ZiBrZXk7CisJeXBfYnVmIGRhdHVtOworfTsKK3R5cGVkZWYgc3RydWN0IHlwdXBkYXRlX2FyZ3MgeXB1cGRhdGVfYXJnczsKKworZXh0ZXJuICBib29sX3QgeGRyX3lwdXBkYXRlX2FyZ3MgKFhEUiAqLCB5cHVwZGF0ZV9hcmdzKik7CisKK3N0cnVjdCB5cGRlbGV0ZV9hcmdzIHsKKwljaGFyICptYXBuYW1lOworCXlwX2J1ZiBrZXk7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXBkZWxldGVfYXJncyB5cGRlbGV0ZV9hcmdzOworCitleHRlcm4gIGJvb2xfdCB4ZHJfeXBkZWxldGVfYXJncyAoWERSICosIHlwZGVsZXRlX2FyZ3MqKTsKKworI2RlZmluZSBZUFVfUFJPRyAxMDAwMjgKKyNkZWZpbmUgWVBVX1ZFUlMgMQorCisjZGVmaW5lIFlQVV9DSEFOR0UgMQorZXh0ZXJuICB1X2ludCAqIHlwdV9jaGFuZ2VfMSAoeXB1cGRhdGVfYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIHVfaW50ICogeXB1X2NoYW5nZV8xX3N2YyAoeXB1cGRhdGVfYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBVX0lOU0VSVCAyCitleHRlcm4gIHVfaW50ICogeXB1X2luc2VydF8xICh5cHVwZGF0ZV9hcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdV9pbnQgKiB5cHVfaW5zZXJ0XzFfc3ZjICh5cHVwZGF0ZV9hcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFVfREVMRVRFIDMKK2V4dGVybiAgdV9pbnQgKiB5cHVfZGVsZXRlXzEgKHlwZGVsZXRlX2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICB1X2ludCAqIHlwdV9kZWxldGVfMV9zdmMgKHlwZGVsZXRlX2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQVV9TVE9SRSA0CitleHRlcm4gIHVfaW50ICogeXB1X3N0b3JlXzEgKHlwdXBkYXRlX2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICB1X2ludCAqIHlwdV9zdG9yZV8xX3N2YyAoeXB1cGRhdGVfYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qICFfX1JQQ1NWQ19ZUFVQRF9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2NoZWQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2NoZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWJjNDg3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zY2hlZC5oCkBAIC0wLDAgKzEsMTI4IEBACisvKiBEZWZpbml0aW9ucyBmb3IgUE9TSVggMTAwMy4xYi0xOTkzIChha2EgUE9TSVguNCkgc2NoZWR1bGluZyBpbnRlcmZhY2UuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5NywxOTk5LDIwMDEtMjAwNCwyMDA3LDIwMTAKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TQ0hFRF9ICisjZGVmaW5lCV9TQ0hFRF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCB0eXBlIGRlZmluaXRpb25zLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjZGVmaW5lIF9fbmVlZF90aW1lX3QKKyNkZWZpbmUgX19uZWVkX3RpbWVzcGVjCisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZuZGVmIF9fcGlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3BpZF90IHBpZF90OworIyBkZWZpbmUgX19waWRfdF9kZWZpbmVkCisjZW5kaWYKKworCisvKiBHZXQgc3lzdGVtIHNwZWNpZmljIGNvbnN0YW50IGFuZCBkYXRhIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4gICovCisjaW5jbHVkZSA8Yml0cy9zY2hlZC5oPgorLyogRGVmaW5lIHRoZSByZWFsIG5hbWVzIGZvciB0aGUgZWxlbWVudHMgb2YgYHN0cnVjdCBzY2hlZF9wYXJhbScuICAqLworI2RlZmluZSBzY2hlZF9wcmlvcml0eQlfX3NjaGVkX3ByaW9yaXR5CisKKworX19CRUdJTl9ERUNMUworCisvKiBTZXQgc2NoZWR1bGluZyBwYXJhbWV0ZXJzIGZvciBhIHByb2Nlc3MuICAqLworZXh0ZXJuIGludCBzY2hlZF9zZXRwYXJhbSAoX19waWRfdCBfX3BpZCwgX19jb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pCisgICAgIF9fVEhST1c7CisKKy8qIFJldHJpZXZlIHNjaGVkdWxpbmcgcGFyYW1ldGVycyBmb3IgYSBwYXJ0aWN1bGFyIHByb2Nlc3MuICAqLworZXh0ZXJuIGludCBzY2hlZF9nZXRwYXJhbSAoX19waWRfdCBfX3BpZCwgc3RydWN0IHNjaGVkX3BhcmFtICpfX3BhcmFtKSBfX1RIUk9XOworCisvKiBTZXQgc2NoZWR1bGluZyBhbGdvcml0aG0gYW5kL29yIHBhcmFtZXRlcnMgZm9yIGEgcHJvY2Vzcy4gICovCitleHRlcm4gaW50IHNjaGVkX3NldHNjaGVkdWxlciAoX19waWRfdCBfX3BpZCwgaW50IF9fcG9saWN5LAorCQkJICAgICAgIF9fY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICpfX3BhcmFtKSBfX1RIUk9XOworCisvKiBSZXRyaWV2ZSBzY2hlZHVsaW5nIGFsZ29yaXRobSBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICAqLworZXh0ZXJuIGludCBzY2hlZF9nZXRzY2hlZHVsZXIgKF9fcGlkX3QgX19waWQpIF9fVEhST1c7CisKKy8qIFlpZWxkIHRoZSBwcm9jZXNzb3IuICAqLworZXh0ZXJuIGludCBzY2hlZF95aWVsZCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IG1heGltdW0gcHJpb3JpdHkgdmFsdWUgZm9yIGEgc2NoZWR1bGVyLiAgKi8KK2V4dGVybiBpbnQgc2NoZWRfZ2V0X3ByaW9yaXR5X21heCAoaW50IF9fYWxnb3JpdGhtKSBfX1RIUk9XOworCisvKiBHZXQgbWluaW11bSBwcmlvcml0eSB2YWx1ZSBmb3IgYSBzY2hlZHVsZXIuICAqLworZXh0ZXJuIGludCBzY2hlZF9nZXRfcHJpb3JpdHlfbWluIChpbnQgX19hbGdvcml0aG0pIF9fVEhST1c7CisKKy8qIEdldCB0aGUgU0NIRURfUlIgaW50ZXJ2YWwgZm9yIHRoZSBuYW1lZCBwcm9jZXNzLiAgKi8KK2V4dGVybiBpbnQgc2NoZWRfcnJfZ2V0X2ludGVydmFsIChfX3BpZF90IF9fcGlkLCBzdHJ1Y3QgdGltZXNwZWMgKl9fdCkgX19USFJPVzsKKworCisjaWZkZWYgX19VU0VfR05VCisvKiBBY2Nlc3MgbWFjcm9zIGZvciBgY3B1X3NldCcuICAqLworIyBkZWZpbmUgQ1BVX1NFVFNJWkUgX19DUFVfU0VUU0laRQorIyBkZWZpbmUgQ1BVX1NFVChjcHUsIGNwdXNldHApCSBfX0NQVV9TRVRfUyAoY3B1LCBzaXplb2YgKGNwdV9zZXRfdCksIGNwdXNldHApCisjIGRlZmluZSBDUFVfQ0xSKGNwdSwgY3B1c2V0cCkJIF9fQ1BVX0NMUl9TIChjcHUsIHNpemVvZiAoY3B1X3NldF90KSwgY3B1c2V0cCkKKyMgZGVmaW5lIENQVV9JU1NFVChjcHUsIGNwdXNldHApIF9fQ1BVX0lTU0VUX1MgKGNwdSwgc2l6ZW9mIChjcHVfc2V0X3QpLCBcCisJCQkJCQljcHVzZXRwKQorIyBkZWZpbmUgQ1BVX1pFUk8oY3B1c2V0cCkJIF9fQ1BVX1pFUk9fUyAoc2l6ZW9mIChjcHVfc2V0X3QpLCBjcHVzZXRwKQorIyBkZWZpbmUgQ1BVX0NPVU5UKGNwdXNldHApCSBfX0NQVV9DT1VOVF9TIChzaXplb2YgKGNwdV9zZXRfdCksIGNwdXNldHApCisKKyMgZGVmaW5lIENQVV9TRVRfUyhjcHUsIHNldHNpemUsIGNwdXNldHApICAgX19DUFVfU0VUX1MgKGNwdSwgc2V0c2l6ZSwgY3B1c2V0cCkKKyMgZGVmaW5lIENQVV9DTFJfUyhjcHUsIHNldHNpemUsIGNwdXNldHApICAgX19DUFVfQ0xSX1MgKGNwdSwgc2V0c2l6ZSwgY3B1c2V0cCkKKyMgZGVmaW5lIENQVV9JU1NFVF9TKGNwdSwgc2V0c2l6ZSwgY3B1c2V0cCkgX19DUFVfSVNTRVRfUyAoY3B1LCBzZXRzaXplLCBcCisJCQkJCQkJICAgY3B1c2V0cCkKKyMgZGVmaW5lIENQVV9aRVJPX1Moc2V0c2l6ZSwgY3B1c2V0cCkJICAgIF9fQ1BVX1pFUk9fUyAoc2V0c2l6ZSwgY3B1c2V0cCkKKyMgZGVmaW5lIENQVV9DT1VOVF9TKHNldHNpemUsIGNwdXNldHApCSAgICBfX0NQVV9DT1VOVF9TIChzZXRzaXplLCBjcHVzZXRwKQorCisjIGRlZmluZSBDUFVfRVFVQUwoY3B1c2V0cDEsIGNwdXNldHAyKSBcCisgIF9fQ1BVX0VRVUFMX1MgKHNpemVvZiAoY3B1X3NldF90KSwgY3B1c2V0cDEsIGNwdXNldHAyKQorIyBkZWZpbmUgQ1BVX0VRVUFMX1Moc2V0c2l6ZSwgY3B1c2V0cDEsIGNwdXNldHAyKSBcCisgIF9fQ1BVX0VRVUFMX1MgKHNldHNpemUsIGNwdXNldHAxLCBjcHVzZXRwMikKKworIyBkZWZpbmUgQ1BVX0FORChkZXN0c2V0LCBzcmNzZXQxLCBzcmNzZXQyKSBcCisgIF9fQ1BVX09QX1MgKHNpemVvZiAoY3B1X3NldF90KSwgZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MiwgJikKKyMgZGVmaW5lIENQVV9PUihkZXN0c2V0LCBzcmNzZXQxLCBzcmNzZXQyKSBcCisgIF9fQ1BVX09QX1MgKHNpemVvZiAoY3B1X3NldF90KSwgZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MiwgfCkKKyMgZGVmaW5lIENQVV9YT1IoZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MikgXAorICBfX0NQVV9PUF9TIChzaXplb2YgKGNwdV9zZXRfdCksIGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIsIF4pCisjIGRlZmluZSBDUFVfQU5EX1Moc2V0c2l6ZSwgZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MikgXAorICBfX0NQVV9PUF9TIChzZXRzaXplLCBkZXN0c2V0LCBzcmNzZXQxLCBzcmNzZXQyLCAmKQorIyBkZWZpbmUgQ1BVX09SX1Moc2V0c2l6ZSwgZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MikgXAorICBfX0NQVV9PUF9TIChzZXRzaXplLCBkZXN0c2V0LCBzcmNzZXQxLCBzcmNzZXQyLCB8KQorIyBkZWZpbmUgQ1BVX1hPUl9TKHNldHNpemUsIGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIpIFwKKyAgX19DUFVfT1BfUyAoc2V0c2l6ZSwgZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MiwgXikKKworIyBkZWZpbmUgQ1BVX0FMTE9DX1NJWkUoY291bnQpIF9fQ1BVX0FMTE9DX1NJWkUgKGNvdW50KQorIyBkZWZpbmUgQ1BVX0FMTE9DKGNvdW50KSBfX0NQVV9BTExPQyAoY291bnQpCisjIGRlZmluZSBDUFVfRlJFRShjcHVzZXQpIF9fQ1BVX0ZSRUUgKGNwdXNldCkKKworCisvKiBTZXQgdGhlIENQVSBhZmZpbml0eSBmb3IgYSB0YXNrICovCitleHRlcm4gaW50IHNjaGVkX3NldGFmZmluaXR5IChfX3BpZF90IF9fcGlkLCBzaXplX3QgX19jcHVzZXRzaXplLAorCQkJICAgICAgX19jb25zdCBjcHVfc2V0X3QgKl9fY3B1c2V0KSBfX1RIUk9XOworCisvKiBHZXQgdGhlIENQVSBhZmZpbml0eSBmb3IgYSB0YXNrICovCitleHRlcm4gaW50IHNjaGVkX2dldGFmZmluaXR5IChfX3BpZF90IF9fcGlkLCBzaXplX3QgX19jcHVzZXRzaXplLAorCQkJICAgICAgY3B1X3NldF90ICpfX2NwdXNldCkgX19USFJPVzsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc2NoZWQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zY3NpL3Njc2kuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2NzaS9zY3NpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhYjc1OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2NzaS9zY3NpLmgKQEAgLTAsMCArMSwyMjYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgcHVibGljIGNvbnN0YW50cyBhbmQgc3RydWN0dXJlcyB1c2VkIGJ5CisgKiB0aGUgc2NzaSBjb2RlIGZvciBsaW51eC4KKyAqLworCisjaWZuZGVmIF9TQ1NJX1NDU0lfSAorI2RlZmluZSBfU0NTSV9TQ1NJX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyoKKyAqICAgICAgU0NTSSBvcGNvZGVzCisgKi8KKworI2RlZmluZSBURVNUX1VOSVRfUkVBRFkgICAgICAgMHgwMAorI2RlZmluZSBSRVpFUk9fVU5JVCAgICAgICAgICAgMHgwMQorI2RlZmluZSBSRVFVRVNUX1NFTlNFICAgICAgICAgMHgwMworI2RlZmluZSBGT1JNQVRfVU5JVCAgICAgICAgICAgMHgwNAorI2RlZmluZSBSRUFEX0JMT0NLX0xJTUlUUyAgICAgMHgwNQorI2RlZmluZSBSRUFTU0lHTl9CTE9DS1MgICAgICAgMHgwNworI2RlZmluZSBSRUFEXzYgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBXUklURV82ICAgICAgICAgICAgICAgMHgwYQorI2RlZmluZSBTRUVLXzYgICAgICAgICAgICAgICAgMHgwYgorI2RlZmluZSBSRUFEX1JFVkVSU0UgICAgICAgICAgMHgwZgorI2RlZmluZSBXUklURV9GSUxFTUFSS1MgICAgICAgMHgxMAorI2RlZmluZSBTUEFDRSAgICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBJTlFVSVJZICAgICAgICAgICAgICAgMHgxMgorI2RlZmluZSBSRUNPVkVSX0JVRkZFUkVEX0RBVEEgMHgxNAorI2RlZmluZSBNT0RFX1NFTEVDVCAgICAgICAgICAgMHgxNQorI2RlZmluZSBSRVNFUlZFICAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBSRUxFQVNFICAgICAgICAgICAgICAgMHgxNworI2RlZmluZSBDT1BZICAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBFUkFTRSAgICAgICAgICAgICAgICAgMHgxOQorI2RlZmluZSBNT0RFX1NFTlNFICAgICAgICAgICAgMHgxYQorI2RlZmluZSBTVEFSVF9TVE9QICAgICAgICAgICAgMHgxYgorI2RlZmluZSBSRUNFSVZFX0RJQUdOT1NUSUMgICAgMHgxYworI2RlZmluZSBTRU5EX0RJQUdOT1NUSUMgICAgICAgMHgxZAorI2RlZmluZSBBTExPV19NRURJVU1fUkVNT1ZBTCAgMHgxZQorCisjZGVmaW5lIFNFVF9XSU5ET1cgICAgICAgICAgICAweDI0CisjZGVmaW5lIFJFQURfQ0FQQUNJVFkgICAgICAgICAweDI1CisjZGVmaW5lIFJFQURfMTAgICAgICAgICAgICAgICAweDI4CisjZGVmaW5lIFdSSVRFXzEwICAgICAgICAgICAgICAweDJhCisjZGVmaW5lIFNFRUtfMTAgICAgICAgICAgICAgICAweDJiCisjZGVmaW5lIFdSSVRFX1ZFUklGWSAgICAgICAgICAweDJlCisjZGVmaW5lIFZFUklGWSAgICAgICAgICAgICAgICAweDJmCisjZGVmaW5lIFNFQVJDSF9ISUdIICAgICAgICAgICAweDMwCisjZGVmaW5lIFNFQVJDSF9FUVVBTCAgICAgICAgICAweDMxCisjZGVmaW5lIFNFQVJDSF9MT1cgICAgICAgICAgICAweDMyCisjZGVmaW5lIFNFVF9MSU1JVFMgICAgICAgICAgICAweDMzCisjZGVmaW5lIFBSRV9GRVRDSCAgICAgICAgICAgICAweDM0CisjZGVmaW5lIFJFQURfUE9TSVRJT04gICAgICAgICAweDM0CisjZGVmaW5lIFNZTkNIUk9OSVpFX0NBQ0hFICAgICAweDM1CisjZGVmaW5lIExPQ0tfVU5MT0NLX0NBQ0hFICAgICAweDM2CisjZGVmaW5lIFJFQURfREVGRUNUX0RBVEEgICAgICAweDM3CisjZGVmaW5lIE1FRElVTV9TQ0FOICAgICAgICAgICAweDM4CisjZGVmaW5lIENPTVBBUkUgICAgICAgICAgICAgICAweDM5CisjZGVmaW5lIENPUFlfVkVSSUZZICAgICAgICAgICAweDNhCisjZGVmaW5lIFdSSVRFX0JVRkZFUiAgICAgICAgICAweDNiCisjZGVmaW5lIFJFQURfQlVGRkVSICAgICAgICAgICAweDNjCisjZGVmaW5lIFVQREFURV9CTE9DSyAgICAgICAgICAweDNkCisjZGVmaW5lIFJFQURfTE9ORyAgICAgICAgICAgICAweDNlCisjZGVmaW5lIFdSSVRFX0xPTkcgICAgICAgICAgICAweDNmCisjZGVmaW5lIENIQU5HRV9ERUZJTklUSU9OICAgICAweDQwCisjZGVmaW5lIFdSSVRFX1NBTUUgICAgICAgICAgICAweDQxCisjZGVmaW5lIFJFQURfVE9DICAgICAgICAgICAgICAweDQzCisjZGVmaW5lIExPR19TRUxFQ1QgICAgICAgICAgICAweDRjCisjZGVmaW5lIExPR19TRU5TRSAgICAgICAgICAgICAweDRkCisjZGVmaW5lIE1PREVfU0VMRUNUXzEwICAgICAgICAweDU1CisjZGVmaW5lIFJFU0VSVkVfMTAgICAgICAgICAgICAweDU2CisjZGVmaW5lIFJFTEVBU0VfMTAgICAgICAgICAgICAweDU3CisjZGVmaW5lIE1PREVfU0VOU0VfMTAgICAgICAgICAweDVhCisjZGVmaW5lIFBFUlNJU1RFTlRfUkVTRVJWRV9JTiAweDVlCisjZGVmaW5lIFBFUlNJU1RFTlRfUkVTRVJWRV9PVVQgMHg1ZgorI2RlZmluZSBNT1ZFX01FRElVTSAgICAgICAgICAgMHhhNQorI2RlZmluZSBSRUFEXzEyICAgICAgICAgICAgICAgMHhhOAorI2RlZmluZSBXUklURV8xMiAgICAgICAgICAgICAgMHhhYQorI2RlZmluZSBXUklURV9WRVJJRllfMTIgICAgICAgMHhhZQorI2RlZmluZSBTRUFSQ0hfSElHSF8xMiAgICAgICAgMHhiMAorI2RlZmluZSBTRUFSQ0hfRVFVQUxfMTIgICAgICAgMHhiMQorI2RlZmluZSBTRUFSQ0hfTE9XXzEyICAgICAgICAgMHhiMgorI2RlZmluZSBSRUFEX0VMRU1FTlRfU1RBVFVTICAgMHhiOAorI2RlZmluZSBTRU5EX1ZPTFVNRV9UQUcgICAgICAgMHhiNgorI2RlZmluZSBXUklURV9MT05HXzIgICAgICAgICAgMHhlYQorCisvKgorICogIFN0YXR1cyBjb2RlcworICovCisKKyNkZWZpbmUgR09PRCAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBDSEVDS19DT05ESVRJT04gICAgICAweDAxCisjZGVmaW5lIENPTkRJVElPTl9HT09EICAgICAgIDB4MDIKKyNkZWZpbmUgQlVTWSAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBJTlRFUk1FRElBVEVfR09PRCAgICAweDA4CisjZGVmaW5lIElOVEVSTUVESUFURV9DX0dPT0QgIDB4MGEKKyNkZWZpbmUgUkVTRVJWQVRJT05fQ09ORkxJQ1QgMHgwYworI2RlZmluZSBDT01NQU5EX1RFUk1JTkFURUQgICAweDExCisjZGVmaW5lIFFVRVVFX0ZVTEwgICAgICAgICAgIDB4MTQKKworI2RlZmluZSBTVEFUVVNfTUFTSyAgICAgICAgICAweDNlCisKKy8qCisgKiAgU0VOU0UgS0VZUworICovCisKKyNkZWZpbmUgTk9fU0VOU0UgICAgICAgICAgICAweDAwCisjZGVmaW5lIFJFQ09WRVJFRF9FUlJPUiAgICAgMHgwMQorI2RlZmluZSBOT1RfUkVBRFkgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUVESVVNX0VSUk9SICAgICAgICAweDAzCisjZGVmaW5lIEhBUkRXQVJFX0VSUk9SICAgICAgMHgwNAorI2RlZmluZSBJTExFR0FMX1JFUVVFU1QgICAgIDB4MDUKKyNkZWZpbmUgVU5JVF9BVFRFTlRJT04gICAgICAweDA2CisjZGVmaW5lIERBVEFfUFJPVEVDVCAgICAgICAgMHgwNworI2RlZmluZSBCTEFOS19DSEVDSyAgICAgICAgIDB4MDgKKyNkZWZpbmUgQ09QWV9BQk9SVEVEICAgICAgICAweDBhCisjZGVmaW5lIEFCT1JURURfQ09NTUFORCAgICAgMHgwYgorI2RlZmluZSBWT0xVTUVfT1ZFUkZMT1cgICAgIDB4MGQKKyNkZWZpbmUgTUlTQ09NUEFSRSAgICAgICAgICAweDBlCisKKworLyoKKyAqICBERVZJQ0UgVFlQRVMKKyAqLworCisjZGVmaW5lIFRZUEVfRElTSyAgICAgICAgICAgMHgwMAorI2RlZmluZSBUWVBFX1RBUEUgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgVFlQRV9QUk9DRVNTT1IgICAgICAweDAzICAgIC8qIEhQIHNjYW5uZXJzIHVzZSB0aGlzICovCisjZGVmaW5lIFRZUEVfV09STSAgICAgICAgICAgMHgwNCAgICAvKiBUcmVhdGVkIGFzIFJPTSBieSBvdXIgc3lzdGVtICovCisjZGVmaW5lIFRZUEVfUk9NICAgICAgICAgICAgMHgwNQorI2RlZmluZSBUWVBFX1NDQU5ORVIgICAgICAgIDB4MDYKKyNkZWZpbmUgVFlQRV9NT0QgICAgICAgICAgICAweDA3ICAgIC8qIE1hZ25ldG8tb3B0aWNhbCBkaXNrIC0KKwkJCQkgICAgICogLSB0cmVhdGVkIGFzIFRZUEVfRElTSyAqLworI2RlZmluZSBUWVBFX01FRElVTV9DSEFOR0VSIDB4MDgKKyNkZWZpbmUgVFlQRV9FTkNMT1NVUkUJICAgIDB4MGQgICAgLyogRW5jbG9zdXJlIFNlcnZpY2VzIERldmljZSAqLworI2RlZmluZSBUWVBFX05PX0xVTiAgICAgICAgIDB4N2YKKworLyoKKyAqIHN0YW5kYXJkIG1vZGUtc2VsZWN0IGhlYWRlciBwcmVwZW5kZWQgdG8gYWxsIG1vZGUtc2VsZWN0IGNvbW1hbmRzCisgKgorICogbW92ZWQgaGVyZSBmcm9tIGNkcm9tLmggLS0ga3JheGVsCisgKi8KKworc3RydWN0IGNjc19tb2Rlc2VsX2hlYWQKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgX3IxOwkJCS8qIHJlc2VydmVkLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG1lZGl1bTsJCS8qIGRldmljZS1zcGVjaWZpYyBtZWRpdW0gdHlwZS4gICovCisgICAgdW5zaWduZWQgY2hhciBfcjI7CQkJLyogcmVzZXJ2ZWQuICAqLworICAgIHVuc2lnbmVkIGNoYXIgYmxvY2tfZGVzY19sZW5ndGg7CS8qIGJsb2NrIGRlc2NyaXB0b3IgbGVuZ3RoLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGRlbnNpdHk7CQkvKiBkZXZpY2Utc3BlY2lmaWMgZGVuc2l0eSBjb2RlLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG51bWJlcl9ibG9ja3NfaGk7CS8qIG51bWJlciBvZiBibG9ja3MgaW4gdGhpcyBibG9jaworCQkJCQkgICBkZXNjLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG51bWJlcl9ibG9ja3NfbWVkOworICAgIHVuc2lnbmVkIGNoYXIgbnVtYmVyX2Jsb2Nrc19sbzsKKyAgICB1bnNpZ25lZCBjaGFyIF9yMzsKKyAgICB1bnNpZ25lZCBjaGFyIGJsb2NrX2xlbmd0aF9oaTsJLyogYmxvY2sgbGVuZ3RoIGZvciBibG9ja3MgaW4gdGhpcworCQkJCQkgICBkZXNjLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJsb2NrX2xlbmd0aF9tZWQ7CisgICAgdW5zaWduZWQgY2hhciBibG9ja19sZW5ndGhfbG87CisgIH07CisKKy8qCisgKiAgTUVTU0FHRSBDT0RFUworICovCisKKyNkZWZpbmUgQ09NTUFORF9DT01QTEVURSAgICAweDAwCisjZGVmaW5lIEVYVEVOREVEX01FU1NBR0UgICAgMHgwMQorI2RlZmluZSAgICAgRVhURU5ERURfTU9ESUZZX0RBVEFfUE9JTlRFUiAgICAweDAwCisjZGVmaW5lICAgICBFWFRFTkRFRF9TRFRSICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgICAgIEVYVEVOREVEX0VYVEVOREVEX0lERU5USUZZICAgICAgMHgwMiAgICAvKiBTQ1NJLUkgb25seSAqLworI2RlZmluZSAgICAgRVhURU5ERURfV0RUUiAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIFNBVkVfUE9JTlRFUlMgICAgICAgMHgwMgorI2RlZmluZSBSRVNUT1JFX1BPSU5URVJTICAgIDB4MDMKKyNkZWZpbmUgRElTQ09OTkVDVCAgICAgICAgICAweDA0CisjZGVmaW5lIElOSVRJQVRPUl9FUlJPUiAgICAgMHgwNQorI2RlZmluZSBBQk9SVCAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgTUVTU0FHRV9SRUpFQ1QgICAgICAweDA3CisjZGVmaW5lIE5PUCAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBNU0dfUEFSSVRZX0VSUk9SICAgIDB4MDkKKyNkZWZpbmUgTElOS0VEX0NNRF9DT01QTEVURSAweDBhCisjZGVmaW5lIExJTktFRF9GTEdfQ01EX0NPTVBMRVRFIDB4MGIKKyNkZWZpbmUgQlVTX0RFVklDRV9SRVNFVCAgICAweDBjCisKKyNkZWZpbmUgSU5JVElBVEVfUkVDT1ZFUlkgICAweDBmICAgICAgICAgICAgLyogU0NTSS1JSSBvbmx5ICovCisjZGVmaW5lIFJFTEVBU0VfUkVDT1ZFUlkgICAgMHgxMCAgICAgICAgICAgIC8qIFNDU0ktSUkgb25seSAqLworCisjZGVmaW5lIFNJTVBMRV9RVUVVRV9UQUcgICAgMHgyMAorI2RlZmluZSBIRUFEX09GX1FVRVVFX1RBRyAgIDB4MjEKKyNkZWZpbmUgT1JERVJFRF9RVUVVRV9UQUcgICAweDIyCisKKy8qCisgKiBIZXJlIGFyZSBzb21lIHNjc2kgc3BlY2lmaWMgaW9jdGwgY29tbWFuZHMgd2hpY2ggYXJlIHNvbWV0aW1lcyB1c2VmdWwuCisgKi8KKy8qIFRoZXNlIGFyZSBhIGZldyBvdGhlciBjb25zdGFudHMgb25seSB1c2VkIGJ5IHNjc2kgZGV2aWNlcy4gICovCisKKyNkZWZpbmUgU0NTSV9JT0NUTF9HRVRfSURMVU4gMHg1MzgyCisKKy8qIFVzZWQgdG8gdHVybiBvbiBhbmQgb2ZmIHRhZ2dlZCBxdWV1aW5nIGZvciBzY3NpIGRldmljZXMuICAqLworCisjZGVmaW5lIFNDU0lfSU9DVExfVEFHR0VEX0VOQUJMRSAweDUzODMKKyNkZWZpbmUgU0NTSV9JT0NUTF9UQUdHRURfRElTQUJMRSAweDUzODQKKworLyogVXNlZCB0byBvYnRhaW4gdGhlIGhvc3QgbnVtYmVyIG9mIGEgZGV2aWNlLiAgKi8KKyNkZWZpbmUgU0NTSV9JT0NUTF9QUk9CRV9IT1NUIDB4NTM4NQorCisvKiBVc2VkIHRvIGdldCB0aGUgYnVzIG51bWJlciBmb3IgYSBkZXZpY2UuICAqLworI2RlZmluZSBTQ1NJX0lPQ1RMX0dFVF9CVVNfTlVNQkVSIDB4NTM4NgorCisjZW5kaWYgLyogc2NzaS9zY3NpLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2NzaS9zY3NpX2lvY3RsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Njc2kvc2NzaV9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjAxNjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Njc2kvc2NzaV9pb2N0bC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU0NTSV9JT0NUTF9ICisjZGVmaW5lIF9TQ1NJX0lPQ1RMX0ggCisKKy8qIElPQ1RMcyBmb3IgU0NTSS4gICovCisjZGVmaW5lIFNDU0lfSU9DVExfU0VORF9DT01NQU5ECQkxCS8qIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBTQ1NJIGhvc3QuICAqLworI2RlZmluZSBTQ1NJX0lPQ1RMX1RFU1RfVU5JVF9SRUFEWQkyCS8qIFRlc3QgaWYgdW5pdCBpcyByZWFkeS4gICovCisjZGVmaW5lIFNDU0lfSU9DVExfQkVOQ0hNQVJLX0NPTU1BTkQJMworI2RlZmluZSBTQ1NJX0lPQ1RMX1NZTkMJCQk0CS8qIFJlcXVlc3Qgc3luY2hyb25vdXMgcGFyYW1ldGVycy4gICovCisjZGVmaW5lIFNDU0lfSU9DVExfU1RBUlRfVU5JVAkJNQorI2RlZmluZSBTQ1NJX0lPQ1RMX1NUT1BfVU5JVAkJNgorI2RlZmluZSBTQ1NJX0lPQ1RMX0RPT1JMT0NLCQkweDUzODAJLyogTG9jayB0aGUgZWplY3QgbWVjaGFuaXNtLiAgKi8KKyNkZWZpbmUgU0NTSV9JT0NUTF9ET09SVU5MT0NLCQkweDUzODEJLyogVW5sb2NrIHRoZSBtZWNoYW5pc20uICAqLworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Njc2kvc2cuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2NzaS9zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZGMwYWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Njc2kvc2cuaApAQCAtMCwwICsxLDI3NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAgIEhpc3Rvcnk6CisgICAgU3RhcnRlZDogQXVnIDkgYnkgTGF3cmVuY2UgRm9hcmQgKGVudHJvcHlAd29ybGQuc3RkLmNvbSksIHRvIGFsbG93IHVzZXIKKyAgICAgcHJvY2VzcyBjb250cm9sIG9mIFNDU0kgZGV2aWNlcy4KKyAgICBEZXZlbG9wbWVudCBTcG9uc29yZWQgYnkgS2lsbHkgQ29ycC4gTlkgTlkKKyovCisKKyNpZm5kZWYgX1NDU0lfU0dfSAorI2RlZmluZSBfU0NTSV9TR19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKworLyogTmV3IGludGVyZmFjZSBpbnRyb2R1Y2VkIGluIHRoZSAzLnggU0cgZHJpdmVycyBmb2xsb3dzICovCisKKy8qIFNhbWUgc3RydWN0dXJlIGFzIHVzZWQgYnkgcmVhZHYoKSBMaW51eCBzeXN0ZW0gY2FsbC4gSXQgZGVmaW5lcyBvbmUKKyAgIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnQuICovCit0eXBlZGVmIHN0cnVjdCBzZ19pb3ZlYworeworICB2b2lkICogaW92X2Jhc2U7ICAgICAgICAgICAgLyogU3RhcnRpbmcgYWRkcmVzcyAgKi8KKyAgc2l6ZV90IGlvdl9sZW47ICAgICAgICAgICAgIC8qIExlbmd0aCBpbiBieXRlcyAgKi8KK30gc2dfaW92ZWNfdDsKKworCit0eXBlZGVmIHN0cnVjdCBzZ19pb19oZHIKK3sKKyAgaW50IGludGVyZmFjZV9pZDsgICAgICAgICAgIC8qIFtpXSAnUycgZm9yIFNDU0kgZ2VuZXJpYyAocmVxdWlyZWQpICovCisgIGludCBkeGZlcl9kaXJlY3Rpb247ICAgICAgICAvKiBbaV0gZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gICovCisgIHVuc2lnbmVkIGNoYXIgY21kX2xlbjsgICAgICAvKiBbaV0gU0NTSSBjb21tYW5kIGxlbmd0aCAoIDw9IDE2IGJ5dGVzKSAqLworICB1bnNpZ25lZCBjaGFyIG14X3NiX2xlbjsgICAgLyogW2ldIG1heCBsZW5ndGggdG8gd3JpdGUgdG8gc2JwICovCisgIHVuc2lnbmVkIHNob3J0IGludCBpb3ZlY19jb3VudDsgLyogW2ldIDAgaW1wbGllcyBubyBzY2F0dGVyIGdhdGhlciAqLworICB1bnNpZ25lZCBpbnQgZHhmZXJfbGVuOyAgICAgLyogW2ldIGJ5dGUgY291bnQgb2YgZGF0YSB0cmFuc2ZlciAqLworICB2b2lkICogZHhmZXJwOyAgICAgICAgICAgICAgLyogW2ldLCBbKmlvXSBwb2ludHMgdG8gZGF0YSB0cmFuc2ZlciBtZW1vcnkKKwkJCQkgb3Igc2NhdHRlciBnYXRoZXIgbGlzdCAqLworICB1bnNpZ25lZCBjaGFyICogY21kcDsgICAgICAgLyogW2ldLCBbKmldIHBvaW50cyB0byBjb21tYW5kIHRvIHBlcmZvcm0gKi8KKyAgdW5zaWduZWQgY2hhciAqIHNicDsgICAgICAgIC8qIFtpXSwgWypvXSBwb2ludHMgdG8gc2Vuc2VfYnVmZmVyIG1lbW9yeSAqLworICB1bnNpZ25lZCBpbnQgdGltZW91dDsgICAgICAgLyogW2ldIE1BWF9VSU5ULT5ubyB0aW1lb3V0ICh1bml0OiBtaWxsaXNlYykgKi8KKyAgdW5zaWduZWQgaW50IGZsYWdzOyAgICAgICAgIC8qIFtpXSAwIC0+IGRlZmF1bHQsIHNlZSBTR19GTEFHLi4uICovCisgIGludCBwYWNrX2lkOyAgICAgICAgICAgICAgICAvKiBbaS0+b10gdW51c2VkIGludGVybmFsbHkgKG5vcm1hbGx5KSAqLworICB2b2lkICogdXNyX3B0cjsgICAgICAgICAgICAgLyogW2ktPm9dIHVudXNlZCBpbnRlcm5hbGx5ICovCisgIHVuc2lnbmVkIGNoYXIgc3RhdHVzOyAgICAgICAvKiBbb10gc2NzaSBzdGF0dXMgKi8KKyAgdW5zaWduZWQgY2hhciBtYXNrZWRfc3RhdHVzOy8qIFtvXSBzaGlmdGVkLCBtYXNrZWQgc2NzaSBzdGF0dXMgKi8KKyAgdW5zaWduZWQgY2hhciBtc2dfc3RhdHVzOyAgIC8qIFtvXSBtZXNzYWdpbmcgbGV2ZWwgZGF0YSAob3B0aW9uYWwpICovCisgIHVuc2lnbmVkIGNoYXIgc2JfbGVuX3dyOyAgICAvKiBbb10gYnl0ZSBjb3VudCBhY3R1YWxseSB3cml0dGVuIHRvIHNicCAqLworICB1bnNpZ25lZCBzaG9ydCBpbnQgaG9zdF9zdGF0dXM7IC8qIFtvXSBlcnJvcnMgZnJvbSBob3N0IGFkYXB0ZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgaW50IGRyaXZlcl9zdGF0dXM7LyogW29dIGVycm9ycyBmcm9tIHNvZnR3YXJlIGRyaXZlciAqLworICBpbnQgcmVzaWQ7ICAgICAgICAgICAgICAgICAgLyogW29dIGR4ZmVyX2xlbiAtIGFjdHVhbF90cmFuc2ZlcnJlZCAqLworICB1bnNpZ25lZCBpbnQgZHVyYXRpb247ICAgICAgLyogW29dIHRpbWUgdGFrZW4gYnkgY21kICh1bml0OiBtaWxsaXNlYykgKi8KKyAgdW5zaWduZWQgaW50IGluZm87ICAgICAgICAgIC8qIFtvXSBhdXhpbGlhcnkgaW5mb3JtYXRpb24gKi8KK30gc2dfaW9faGRyX3Q7CisKKworLyogVXNlIG5lZ2F0aXZlIHZhbHVlcyB0byBmbGFnIGRpZmZlcmVuY2UgZnJvbSBvcmlnaW5hbCBzZ19oZWFkZXIgc3RydWN0dXJlLiAgKi8KKyNkZWZpbmUgU0dfRFhGRVJfTk9ORSAtMSAgICAgICAgLyogZS5nLiBhIFNDU0kgVGVzdCBVbml0IFJlYWR5IGNvbW1hbmQgKi8KKyNkZWZpbmUgU0dfRFhGRVJfVE9fREVWIC0yICAgICAgLyogZS5nLiBhIFNDU0kgV1JJVEUgY29tbWFuZCAqLworI2RlZmluZSBTR19EWEZFUl9GUk9NX0RFViAtMyAgICAvKiBlLmcuIGEgU0NTSSBSRUFEIGNvbW1hbmQgKi8KKyNkZWZpbmUgU0dfRFhGRVJfVE9fRlJPTV9ERVYgLTQgLyogdHJlYXRlZCBsaWtlIFNHX0RYRkVSX0ZST01fREVWIHdpdGggdGhlCisJCQkJICAgYWRkaXRpb25hbCBwcm9wZXJ0eSB0aGFuIGR1cmluZyBpbmRpcmVjdAorCQkJCSAgIElPIHRoZSB1c2VyIGJ1ZmZlciBpcyBjb3BpZWQgaW50byB0aGUKKwkJCQkgICBrZXJuZWwgYnVmZmVycyBiZWZvcmUgdGhlIHRyYW5zZmVyICovCisKKworLyogZm9sbG93aW5nIGZsYWcgdmFsdWVzIGNhbiBiZSAib3IiLWVkIHRvZ2V0aGVyICovCisjZGVmaW5lIFNHX0ZMQUdfRElSRUNUX0lPIDEgICAgIC8qIGRlZmF1bHQgaXMgaW5kaXJlY3QgSU8gKi8KKyNkZWZpbmUgU0dfRkxBR19MVU5fSU5ISUJJVCAyICAgLyogZGVmYXVsdCBpcyB0byBwdXQgZGV2aWNlJ3MgbHVuIGludG8gKi8KKwkJCQkvKiB0aGUgMm5kIGJ5dGUgb2YgU0NTSSBjb21tYW5kICovCisjZGVmaW5lIFNHX0ZMQUdfTk9fRFhGRVIgMHgxMDAwMCAvKiBubyB0cmFuc2ZlciBvZiBrZXJuZWwgYnVmZmVycyB0by9mcm9tICovCisJCQkJLyogdXNlciBzcGFjZSAoZGVidWcgaW5kaXJlY3QgSU8pICovCisKKy8qIFRoZSBmb2xsb3dpbmcgJ2luZm8nIHZhbHVlcyBhcmUgIm9yIi1lZCB0b2dldGhlci4gICovCisjZGVmaW5lIFNHX0lORk9fT0tfTUFTSwkweDEKKyNkZWZpbmUgU0dfSU5GT19PSwkweDAJLyogbm8gc2Vuc2UsIGhvc3Qgbm9yIGRyaXZlciAibm9pc2UiICovCisjZGVmaW5lIFNHX0lORk9fQ0hFQ0sJMHgxICAgICAvKiBzb21ldGhpbmcgYWJub3JtYWwgaGFwcGVuZWQgKi8KKworI2RlZmluZSBTR19JTkZPX0RJUkVDVF9JT19NQVNLCTB4NgorI2RlZmluZSBTR19JTkZPX0lORElSRUNUX0lPIAkweDAJLyogZGF0YSB4ZmVyIHZpYSBrZXJuZWwgYnVmZmVycyAob3Igbm8geGZlcikgKi8KKyNkZWZpbmUgU0dfSU5GT19ESVJFQ1RfSU8gCTB4MgkvKiBkaXJlY3QgSU8gcmVxdWVzdGVkIGFuZCBwZXJmb3JtZWQgKi8KKyNkZWZpbmUgU0dfSU5GT19NSVhFRF9JTyAJMHg0CS8qIHBhcnQgZGlyZWN0LCBwYXJ0IGluZGlyZWN0IElPICovCisKKworLyogUmVxdWVzdCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIFNHIGRldmljZSwgdXNlZCBieQorICAgU0dfR0VUX1NDU0lfSUQgaW9jdGwgKCkuICAqLworc3RydWN0IHNnX3Njc2lfaWQgeworICAvKiBIb3N0IG51bWJlciBhcyBpbiAic2NzaTxuPiIgd2hlcmUgJ24nIGlzIG9uZSBvZiAwLCAxLCAyIGV0Yy4gICovCisgIGludCBob3N0X25vOworICBpbnQgY2hhbm5lbDsKKyAgLyogU0NTSSBpZCBvZiB0YXJnZXQgZGV2aWNlLiAgKi8KKyAgaW50IHNjc2lfaWQ7CisgIGludCBsdW47CisgIC8qIFRZUEVfLi4uIGRlZmluZWQgaW4gPHNjc2kvc2NzaS5oPi4gICovCisgIGludCBzY3NpX3R5cGU7CisgIC8qIEhvc3QgKGFkYXB0ZXIpIG1heGltdW0gY29tbWFuZHMgcGVyIGx1bi4gICovCisgIHNob3J0IGludCBoX2NtZF9wZXJfbHVuOworICAvKiBEZXZpY2UgKG9yIGFkYXB0ZXIpIG1heGltdW0gcXVldWUgbGVuZ3RoLiAgKi8KKyAgc2hvcnQgaW50IGRfcXVldWVfZGVwdGg7CisgIC8qIFVudXNlZCwgc2V0IHRvIDAgZm9yIG5vdy4gICovCisgIGludCB1bnVzZWRbMl07Cit9OworCisvKiBVc2VkIGJ5IFNHX0dFVF9SRVFVRVNUX1RBQkxFIGlvY3RsKCkuICAqLwordHlwZWRlZiBzdHJ1Y3Qgc2dfcmVxX2luZm8geworICAgIGNoYXIgcmVxX3N0YXRlOyAgICAgLyogMCAtPiBub3QgdXNlZCwgMSAtPiB3cml0dGVuLCAyIC0+IHJlYWR5IHRvIHJlYWQgKi8KKyAgICBjaGFyIG9ycGhhbjsgICAgICAgIC8qIDAgLT4gbm9ybWFsIHJlcXVlc3QsIDEgLT4gZnJvbSBpbnRlcnJ1cGVkIFNHX0lPICovCisgICAgY2hhciBzZ19pb19vd25lZDsgICAvKiAwIC0+IGNvbXBsZXRlIHdpdGggcmVhZCgpLCAxIC0+IG93bmVkIGJ5IFNHX0lPICovCisgICAgY2hhciBwcm9ibGVtOyAgICAgICAvKiAwIC0+IG5vIHByb2JsZW0gZGV0ZWN0ZWQsIDEgLT4gZXJyb3IgdG8gcmVwb3J0ICovCisgICAgaW50IHBhY2tfaWQ7ICAgICAgICAvKiBwYWNrX2lkIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0ICovCisgICAgdm9pZCAqIHVzcl9wdHI7ICAgICAvKiB1c2VyIHByb3ZpZGVkIHBvaW50ZXIgKGluIG5ldyBpbnRlcmZhY2UpICovCisgICAgdW5zaWduZWQgaW50IGR1cmF0aW9uOyAvKiBtaWxsaXNlY3MgZWxhcHNlZCBzaW5jZSB3cml0dGVuIChyZXFfc3RhdGU9PTEpCisJCQkgICAgICBvciByZXF1ZXN0IGR1cmF0aW9uIChyZXFfc3RhdGU9PTIpICovCisgICAgaW50IHVudXNlZDsKK30gc2dfcmVxX2luZm9fdDsKKworCisvKiBJT0NUTHM6IFRob3NlIGlvY3RscyB0aGF0IGFyZSByZWxldmFudCB0byB0aGUgU0cgMy54IGRyaXZlcnMgZm9sbG93LgorIFtUaG9zZSB0aGF0IG9ubHkgYXBwbHkgdG8gdGhlIFNHIDIueCBkcml2ZXJzIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLl0KKyAoX0dFVF9zIHlpZWxkIHJlc3VsdCB2aWEgJ2ludCAqJyAzcmQgYXJndW1lbnQgdW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQpICovCisKKyNkZWZpbmUgU0dfRU1VTEFURURfSE9TVCAweDIyMDMgLyogdHJ1ZSBmb3IgZW11bGF0ZWQgaG9zdCBhZGFwdGVyIChBVEFQSSkgKi8KKworLyogVXNlZCB0byBjb25maWd1cmUgU0NTSSBjb21tYW5kIHRyYW5zZm9ybWF0aW9uIGxheWVyIGZvciBBVEFQSSBkZXZpY2VzICovCisvKiBPbmx5IHN1cHBvcnRlZCBieSB0aGUgaWRlLXNjc2kgZHJpdmVyICovCisjZGVmaW5lIFNHX1NFVF9UUkFOU0ZPUk0gMHgyMjA0IC8qIE4uQi4gM3JkIGFyZyBpcyBub3QgcG9pbnRlciBidXQgdmFsdWU6ICovCisJCSAgICAgIC8qIDNyZCBhcmcgPSAwIHRvIGRpc2FibGUgdHJhbnNmb3JtLCAxIHRvIGVuYWJsZSBpdCAqLworI2RlZmluZSBTR19HRVRfVFJBTlNGT1JNIDB4MjIwNQorCisjZGVmaW5lIFNHX1NFVF9SRVNFUlZFRF9TSVpFIDB4MjI3NSAgLyogcmVxdWVzdCBhIG5ldyByZXNlcnZlZCBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBTR19HRVRfUkVTRVJWRURfU0laRSAweDIyNzIgIC8qIGFjdHVhbCBzaXplIG9mIHJlc2VydmVkIGJ1ZmZlciAqLworCisvKiBUaGUgZm9sbG93aW5nIGlvY3RsIGhhcyBhICdzZ19zY3NpX2lkX3QgKicgb2JqZWN0IGFzIGl0cyAzcmQgYXJndW1lbnQuICovCisjZGVmaW5lIFNHX0dFVF9TQ1NJX0lEIDB4MjI3NiAgIC8qIFlpZWxkcyBmZCdzIGJ1cywgY2hhbiwgZGV2LCBsdW4gKyB0eXBlICovCisvKiBTQ1NJIGlkIGluZm9ybWF0aW9uIGNhbiBhbHNvIGJlIG9idGFpbmVkIGZyb20gU0NTSV9JT0NUTF9HRVRfSURMVU4gKi8KKworLyogT3ZlcnJpZGUgaG9zdCBzZXR0aW5nIGFuZCBhbHdheXMgRE1BIHVzaW5nIGxvdyBtZW1vcnkgKCA8MTZNQiBvbiBpMzg2KSAqLworI2RlZmluZSBTR19TRVRfRk9SQ0VfTE9XX0RNQSAweDIyNzkgIC8qIDAtPiB1c2UgYWRhcHRlciBzZXR0aW5nLCAxLT4gZm9yY2UgKi8KKyNkZWZpbmUgU0dfR0VUX0xPV19ETUEgMHgyMjdhICAgLyogMC0+IHVzZSBhbGwgcmFtIGZvciBkbWE7IDEtPiBsb3cgZG1hIHJhbSAqLworCisvKiBXaGVuIFNHX1NFVF9GT1JDRV9QQUNLX0lEIHNldCB0byAxLCBwYWNrX2lkIGlzIGlucHV0IHRvIHJlYWQoKSB3aGljaAorICAgdHJpZXMgdG8gZmV0Y2ggYSBwYWNrZXQgd2l0aCBhIG1hdGNoaW5nIHBhY2tfaWQsIHdhaXRzLCBvciByZXR1cm5zIEVBR0FJTi4KKyAgIElmIHBhY2tfaWQgaXMgLTEgdGhlbiByZWFkIG9sZGVzdCB3YWl0aW5nLiBXaGVuIC4uLkZPUkNFX1BBQ0tfSUQgc2V0IHRvIDAKKyAgIHRoZW4gcGFja19pZCBpZ25vcmVkIGJ5IHJlYWQoKSBhbmQgb2xkZXN0IHJlYWRhYmxlIGZldGNoZWQuICovCisjZGVmaW5lIFNHX1NFVF9GT1JDRV9QQUNLX0lEIDB4MjI3YgorI2RlZmluZSBTR19HRVRfUEFDS19JRCAweDIyN2MgLyogWWllbGRzIG9sZGVzdCByZWFkYWJsZSBwYWNrX2lkIChvciAtMSkgKi8KKworI2RlZmluZSBTR19HRVRfTlVNX1dBSVRJTkcgMHgyMjdkIC8qIE51bWJlciBvZiBjb21tYW5kcyBhd2FpdGluZyByZWFkKCkgKi8KKworLyogWWllbGRzIG1heCBzY2F0dGVyIGdhdGhlciB0YWJsZXNpemUgYWxsb3dlZCBieSBjdXJyZW50IGhvc3QgYWRhcHRlciAqLworI2RlZmluZSBTR19HRVRfU0dfVEFCTEVTSVpFIDB4MjI3RiAgLyogMCBpbXBsaWVzIGNhbid0IGRvIHNjYXR0ZXIgZ2F0aGVyICovCisKKyNkZWZpbmUgU0dfR0VUX1ZFUlNJT05fTlVNIDB4MjI4MiAvKiBFeGFtcGxlOiB2ZXJzaW9uIDIuMS4zNCB5aWVsZHMgMjAxMzQgKi8KKworLyogUmV0dXJucyAtRUJVU1kgaWYgb2NjdXBpZWQuIDNyZCBhcmd1bWVudCBwb2ludGVyIHRvIGludCAoc2VlIG5leHQpICovCisjZGVmaW5lIFNHX1NDU0lfUkVTRVQgMHgyMjg0CisvKiBBc3NvY2lhdGVkIHZhbHVlcyB0aGF0IGNhbiBiZSBnaXZlbiB0byBTR19TQ1NJX1JFU0VUIGZvbGxvdyAqLworI2RlZmluZSBTR19TQ1NJX1JFU0VUX05PVEhJTkcJMAorI2RlZmluZSBTR19TQ1NJX1JFU0VUX0RFVklDRQkxCisjZGVmaW5lIFNHX1NDU0lfUkVTRVRfQlVTCTIKKyNkZWZpbmUgU0dfU0NTSV9SRVNFVF9IT1NUCTMKKworLyogc3luY2hyb25vdXMgU0NTSSBjb21tYW5kIGlvY3RsLCAob25seSBpbiB2ZXJzaW9uIDMgaW50ZXJmYWNlKSAqLworI2RlZmluZSBTR19JTyAweDIyODUgICAvKiBzaW1pbGFyIGVmZmVjdCBhcyB3cml0ZSgpIGZvbGxvd2VkIGJ5IHJlYWQoKSAqLworCisjZGVmaW5lIFNHX0dFVF9SRVFVRVNUX1RBQkxFIDB4MjI4NiAgIC8qIHlpZWxkcyB0YWJsZSBvZiBhY3RpdmUgcmVxdWVzdHMgKi8KKworLyogSG93IHRvIHRyZWF0IEVJTlRSIGR1cmluZyBTR19JTyBpb2N0bCgpLCBvbmx5IGluIFNHIDMueCBzZXJpZXMgKi8KKyNkZWZpbmUgU0dfU0VUX0tFRVBfT1JQSEFOIDB4MjI4NyAvKiAxIC0+IGhvbGQgZm9yIHJlYWQoKSwgMCAtPiBkcm9wIChkZWYpICovCisjZGVmaW5lIFNHX0dFVF9LRUVQX09SUEhBTiAweDIyODgKKworCisjZGVmaW5lIFNHX1NDQVRURVJfU1ogKDggKiA0MDk2KSAgLyogUEFHRV9TSVpFIG5vdCBhdmFpbGFibGUgdG8gdXNlciAqLworLyogTGFyZ2VzdCBzaXplIChpbiBieXRlcykgYSBzaW5nbGUgc2NhdHRlci1nYXRoZXIgbGlzdCBlbGVtZW50IGNhbiBoYXZlLgorICAgVGhlIHZhbHVlIG11c3QgYmUgYSBwb3dlciBvZiAyIGFuZCA8PSAoUEFHRV9TSVpFICogMzIpIFsxMzEwNzIgYnl0ZXMgb24KKyAgIGkzODZdLiBUaGUgbWluaW11bSB2YWx1ZSBpcyBQQUdFX1NJWkUuIElmIHNjYXR0ZXItZ2F0aGVyIG5vdCBzdXBwb3J0ZWQKKyAgIGJ5IGFkYXB0ZXIgdGhlbiB0aGlzIHZhbHVlIGlzIHRoZSBsYXJnZXN0IGRhdGEgYmxvY2sgdGhhdCBjYW4gYmUKKyAgIHJlYWQvd3JpdHRlbiBieSBhIHNpbmdsZSBzY3NpIGNvbW1hbmQuIFRoZSB1c2VyIGNhbiBmaW5kIHRoZSB2YWx1ZSBvZgorICAgUEFHRV9TSVpFIGJ5IGNhbGxpbmcgZ2V0cGFnZXNpemUoKSBkZWZpbmVkIGluIHVuaXN0ZC5oIC4gKi8KKworI2RlZmluZSBTR19ERUZBVUxUX1JFVFJJRVMgMQorCisvKiBEZWZhdWx0cywgY29tbWVudGVkIGlmIHRoZXkgZGlmZmVyIGZyb20gb3JpZ2luYWwgc2cgZHJpdmVyICovCisjZGVmaW5lIFNHX0RFRl9GT1JDRV9MT1dfRE1BIDAgIC8qIHdhcyAxIC0+IG1lbW9yeSBiZWxvdyAxNk1CIG9uIGkzODYgKi8KKyNkZWZpbmUgU0dfREVGX0ZPUkNFX1BBQ0tfSUQgMAorI2RlZmluZSBTR19ERUZfS0VFUF9PUlBIQU4gMAorI2RlZmluZSBTR19ERUZfUkVTRVJWRURfU0laRSBTR19TQ0FUVEVSX1NaIC8qIGxvYWQgdGltZSBvcHRpb24gKi8KKworLyogbWF4aW11bSBvdXRzdGFuZGluZyByZXF1ZXN0cywgd3JpdGUoKSB5aWVsZHMgRURPTSBpZiBleGNlZWRlZCAqLworI2RlZmluZSBTR19NQVhfUVVFVUUgMTYKKworI2RlZmluZSBTR19CSUdfQlVGRiBTR19ERUZfUkVTRVJWRURfU0laRSAgICAvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworCisvKiBBbHRlcm5hdGUgc3R5bGUgdHlwZSBuYW1lcywgIi4uLl90IiB2YXJpYW50cyBwcmVmZXJyZWQgKi8KK3R5cGVkZWYgc3RydWN0IHNnX2lvX2hkciBTZ19pb19oZHI7Cit0eXBlZGVmIHN0cnVjdCBzZ19pb192ZWMgU2dfaW9fdmVjOwordHlwZWRlZiBzdHJ1Y3Qgc2dfc2NzaV9pZCBTZ19zY3NpX2lkOwordHlwZWRlZiBzdHJ1Y3Qgc2dfcmVxX2luZm8gU2dfcmVxX2luZm87CisKKworLyogdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diAqLworLyogICBUaGUgb2xkZXIgU0cgaW50ZXJmYWNlIGJhc2VkIG9uIHRoZSAnc2dfaGVhZGVyJyBzdHJ1Y3R1cmUgZm9sbG93cy4gICAqLworLyogXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiAqLworCisjZGVmaW5lIFNHX01BWF9TRU5TRSAxNiAgIC8qIHRoaXMgb25seSBhcHBsaWVzIHRvIHRoZSBzZ19oZWFkZXIgaW50ZXJmYWNlICovCisKK3N0cnVjdCBzZ19oZWFkZXIKKyB7CisgICAvKiBMZW5ndGggb2YgaW5jb21pbmcgcGFja2V0IChpbmNsdWRpbmcgaGVhZGVyKS4gICovCisgICBpbnQgcGFja19sZW47CisgICAvKiBNYXhpbWFsIGxlbmd0aCBvZiBleHBlY3RlZCByZXBseS4gICovCisgICBpbnQgcmVwbHlfbGVuOworICAgLyogSWQgbnVtYmVyIG9mIHBhY2tldC4gICovCisgICBpbnQgcGFja19pZDsKKyAgIC8qIDA9PW9rLCBvdGhlcndpc2UgZXJyb3IgbnVtYmVyLiAgKi8KKyAgIGludCByZXN1bHQ7CisgICAvKiBGb3JjZSAxMiBieXRlIGNvbW1hbmQgbGVuZ3RoIGZvciBncm91cCA2ICYgNyBjb21tYW5kcy4gICovCisgICB1bnNpZ25lZCBpbnQgdHdlbHZlX2J5dGU6MTsKKyAgIC8qIFNDU0kgc3RhdHVzIGZyb20gdGFyZ2V0LiAgKi8KKyAgIHVuc2lnbmVkIGludCB0YXJnZXRfc3RhdHVzOjU7CisgICAvKiBIb3N0IHN0YXR1cyAoc2VlICJESUQiIGNvZGVzKS4gICovCisgICB1bnNpZ25lZCBpbnQgaG9zdF9zdGF0dXM6ODsKKyAgIC8qIERyaXZlciBzdGF0dXMrc3VnZ2VzdGlvbi4gICovCisgICB1bnNpZ25lZCBpbnQgZHJpdmVyX3N0YXR1czo4OworICAgLyogVW51c2VkLiAgKi8KKyAgIHVuc2lnbmVkIGludCBvdGhlcl9mbGFnczoxMDsKKyAgIC8qIE91dHB1dCBpbiAzIGNhc2VzOgorICAgICAgd2hlbiB0YXJnZXRfc3RhdHVzIGlzIENIRUNLX0NPTkRJVElPTiBvcgorICAgICAgd2hlbiB0YXJnZXRfc3RhdHVzIGlzIENPTU1BTkRfVEVSTUlOQVRFRCBvcgorICAgICAgd2hlbiAoZHJpdmVyX3N0YXR1cyAmIERSSVZFUl9TRU5TRSkgaXMgdHJ1ZS4gICovCisgICB1bnNpZ25lZCBjaGFyIHNlbnNlX2J1ZmZlcltTR19NQVhfU0VOU0VdOworIH07CisKKworLyogSU9DVExzOiBUaGUgZm9sbG93aW5nIGFyZSBub3QgcmVxdWlyZWQgKG9yIGlnbm9yZWQpIHdoZW4gdGhlIHNnX2lvX2hkcl90CisJICAgaW50ZXJmYWNlIGlzIHVzZWQuIFRoZXkgYXJlIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aAorCSAgIHRoZSBvcmlnaW5hbCBhbmQgdmVyc2lvbiAyIGRyaXZlcnMuICovCisKKyNkZWZpbmUgU0dfU0VUX1RJTUVPVVQJCTB4MjIwMQkvKiBTZXQgdGltZW91dDsgKihpbnQgKilhcmc9PXRpbWVvdXQuICAqLworI2RlZmluZSBTR19HRVRfVElNRU9VVAkJMHgyMjAyCS8qIEdldCB0aW1lb3V0OyByZXR1cm4gdGltZW91dC4gICovCisKKy8qIEdldC9zZXQgY29tbWFuZCBxdWV1aW5nIHN0YXRlIHBlciBmZCAoZGVmYXVsdCBpcyBTR19ERUZfQ09NTUFORF9RKS4gKi8KKyNkZWZpbmUgU0dfR0VUX0NPTU1BTkRfUQkweDIyNzAJLyogWWllbGRzIDAgKHF1ZXVpbmcgb2ZmKSBvciAxIChvbikuICAqLworI2RlZmluZSBTR19TRVRfQ09NTUFORF9RIAkweDIyNzEJLyogQ2hhbmdlIHF1ZXVpbmcgc3RhdGUgd2l0aCAwIG9yIDEuICAqLworCisvKiBUdXJuIG9uIGVycm9yIHNlbnNlIHRyYWNlICgxLi44KSwgZHVtcCB0aGlzIGRldmljZSB0byBsb2cvY29uc29sZSAoOSkKKyAgIG9yIGR1bXAgYWxsIHNnIGRldmljZSBzdGF0ZXMgKCA+OSApIHRvIGxvZy9jb25zb2xlLiAgKi8KKyNkZWZpbmUgU0dfU0VUX0RFQlVHCQkweDIyN2UJLyogMCAtPiB0dXJuIG9mZiBkZWJ1ZyAqLworCisjZGVmaW5lIFNHX05FWFRfQ01EX0xFTgkJMHgyMjgzCS8qIE92ZXJyaWRlIFNDU0kgY29tbWFuZCBsZW5ndGggd2l0aCBnaXZlbgorCQkJCQkgICBudW1iZXIgb24gdGhlIG5leHQgd3JpdGUoKSBvbiB0aGlzIGZpbGUKKwkJCQkJICAgZGVzY3JpcHRvci4gICovCisKKy8qIERlZmF1bHRzLCBjb21tZW50ZWQgaWYgdGhleSBkaWZmZXIgZnJvbSBvcmlnaW5hbCBzZyBkcml2ZXIgKi8KKyNkZWZpbmUgU0dfREVGQVVMVF9USU1FT1VUICg2MCpIWikgLyogSFogPT0gJ2ppZmZpZXMgaW4gMSBzZWNvbmQnICovCisjZGVmaW5lIFNHX0RFRl9DT01NQU5EX1EgMCAgICAgLyogY29tbWFuZCBxdWV1aW5nIGlzIGFsd2F5cyBvbiB3aGVuCisJCQkJICB0aGUgbmV3IGludGVyZmFjZSBpcyB1c2VkICovCisjZGVmaW5lIFNHX0RFRl9VTkRFUlJVTl9GTEFHIDAKKworCisjZW5kaWYJLyogc2NzaS9zZy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NlYXJjaC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zZWFyY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmZiYTY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zZWFyY2guaApAQCAtMCwwICsxLDE3NSBAQAorLyogRGVjbGFyYXRpb25zIGZvciBTeXN0ZW0gViBzdHlsZSBzZWFyY2hpbmcgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NFQVJDSF9ICisjZGVmaW5lCV9TRUFSQ0hfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworX19CRUdJTl9ERUNMUworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFByb3RvdHlwZSBzdHJ1Y3R1cmUgZm9yIGEgbGlua2VkLWxpc3QgZGF0YSBzdHJ1Y3R1cmUuCisgICBUaGlzIGlzIHRoZSB0eXBlIHVzZWQgYnkgdGhlIGBpbnNxdWUnIGFuZCBgcmVtcXVlJyBmdW5jdGlvbnMuICAqLworCisjIGlmZGVmIF9fVVNFX0dOVQorc3RydWN0IHFlbGVtCisgIHsKKyAgICBzdHJ1Y3QgcWVsZW0gKnFfZm9ydzsKKyAgICBzdHJ1Y3QgcWVsZW0gKnFfYmFjazsKKyAgICBjaGFyIHFfZGF0YVsxXTsKKyAgfTsKKyMgZW5kaWYKKworCisvKiBJbnNlcnQgRUxFTSBpbnRvIGEgZG91Ymx5LWxpbmtlZCBsaXN0LCBhZnRlciBQUkVWLiAgKi8KK2V4dGVybiB2b2lkIGluc3F1ZSAodm9pZCAqX19lbGVtLCB2b2lkICpfX3ByZXYpIF9fVEhST1c7CisKKy8qIFVubGluayBFTEVNIGZyb20gdGhlIGRvdWJseS1saW5rZWQgbGlzdCB0aGF0IGl0IGlzIGluLiAgKi8KK2V4dGVybiB2b2lkIHJlbXF1ZSAodm9pZCAqX19lbGVtKSBfX1RIUk9XOworI2VuZGlmCisKKworLyogRm9yIHVzZSB3aXRoIGhzZWFyY2goMykuICAqLworI2lmbmRlZiBfX0NPTVBBUl9GTl9UCisjIGRlZmluZSBfX0NPTVBBUl9GTl9UCit0eXBlZGVmIGludCAoKl9fY29tcGFyX2ZuX3QpIChfX2NvbnN0IHZvaWQgKiwgX19jb25zdCB2b2lkICopOworCisjIGlmZGVmCV9fVVNFX0dOVQordHlwZWRlZiBfX2NvbXBhcl9mbl90IGNvbXBhcmlzb25fZm5fdDsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBBY3Rpb24gd2hpY2ggc2hhbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBjYWxsIHRoZSBoc2VhcmNoLiAgKi8KK3R5cGVkZWYgZW51bQorICB7CisgICAgRklORCwKKyAgICBFTlRFUgorICB9CitBQ1RJT047CisKK3R5cGVkZWYgc3RydWN0IGVudHJ5CisgIHsKKyAgICBjaGFyICprZXk7CisgICAgdm9pZCAqZGF0YTsKKyAgfQorRU5UUlk7CisKKy8qIE9wYXF1ZSB0eXBlIGZvciBpbnRlcm5hbCB1c2UuICAqLworc3RydWN0IF9FTlRSWTsKKworLyogRmFtaWx5IG9mIGhhc2ggdGFibGUgaGFuZGxpbmcgZnVuY3Rpb25zLiAgVGhlIGZ1bmN0aW9ucyBhbHNvCisgICBoYXZlIHJlZW50cmFudCBjb3VudGVycGFydHMgZW5kaW5nIHdpdGggX3IuICBUaGUgbm9uLXJlZW50cmFudAorICAgZnVuY3Rpb25zIGFsbCB3b3JrIG9uIGEgc2lnbmxlIGludGVybmFsIGhhc2hpbmcgdGFibGUuICAqLworCisvKiBTZWFyY2ggZm9yIGVudHJ5IG1hdGNoaW5nIElURU0ua2V5IGluIGludGVybmFsIGhhc2ggdGFibGUuICBJZgorICAgQUNUSU9OIGlzIGBGSU5EJyByZXR1cm4gZm91bmQgZW50cnkgb3Igc2lnbmFsIGVycm9yIGJ5IHJldHVybmluZworICAgTlVMTC4gIElmIEFDVElPTiBpcyBgRU5URVInIHJlcGxhY2UgZXhpc3RpbmcgZGF0YSAoaWYgYW55KSB3aXRoCisgICBJVEVNLmRhdGEuICAqLworZXh0ZXJuIEVOVFJZICpoc2VhcmNoIChFTlRSWSBfX2l0ZW0sIEFDVElPTiBfX2FjdGlvbikgX19USFJPVzsKKworLyogQ3JlYXRlIGEgbmV3IGhhc2hpbmcgdGFibGUgd2hpY2ggd2lsbCBhdCBtb3N0IGNvbnRhaW4gTkVMIGVsZW1lbnRzLiAgKi8KK2V4dGVybiBpbnQgaGNyZWF0ZSAoc2l6ZV90IF9fbmVsKSBfX1RIUk9XOworCisvKiBEZXN0cm95IGN1cnJlbnQgaW50ZXJuYWwgaGFzaGluZyB0YWJsZS4gICovCitleHRlcm4gdm9pZCBoZGVzdHJveSAodm9pZCkgX19USFJPVzsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogRGF0YSB0eXBlIGZvciByZWVudHJhbnQgZnVuY3Rpb25zLiAgKi8KK3N0cnVjdCBoc2VhcmNoX2RhdGEKKyAgeworICAgIHN0cnVjdCBfRU5UUlkgKnRhYmxlOworICAgIHVuc2lnbmVkIGludCBzaXplOworICAgIHVuc2lnbmVkIGludCBmaWxsZWQ7CisgIH07CisKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyB3aGljaCBjYW4gaGFuZGxlIG11bHRpcGxlIGhhc2hpbmcgdGFibGVzIGF0IHRoZQorICAgc2FtZSB0aW1lLiAgKi8KK2V4dGVybiBpbnQgaHNlYXJjaF9yIChFTlRSWSBfX2l0ZW0sIEFDVElPTiBfX2FjdGlvbiwgRU5UUlkgKipfX3JldHZhbCwKKwkJICAgICAgc3RydWN0IGhzZWFyY2hfZGF0YSAqX19odGFiKSBfX1RIUk9XOworZXh0ZXJuIGludCBoY3JlYXRlX3IgKHNpemVfdCBfX25lbCwgc3RydWN0IGhzZWFyY2hfZGF0YSAqX19odGFiKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgaGRlc3Ryb3lfciAoc3RydWN0IGhzZWFyY2hfZGF0YSAqX19odGFiKSBfX1RIUk9XOworI2VuZGlmCisKKworLyogVGhlIHRzZWFyY2ggcm91dGluZXMgYXJlIHZlcnkgaW50ZXJlc3RpbmcuIFRoZXkgbWFrZSBtYW55CisgICBhc3N1bXB0aW9ucyBhYm91dCB0aGUgY29tcGlsZXIuICBJdCBhc3N1bWVzIHRoYXQgdGhlIGZpcnN0IGZpZWxkCisgICBpbiBub2RlIG11c3QgYmUgdGhlICJrZXkiIGZpZWxkLCB3aGljaCBwb2ludHMgdG8gdGhlIGRhdHVtLgorICAgRXZlcnl0aGluZyBkZXBlbmRzIG9uIHRoYXQuICAqLworLyogRm9yIHRzZWFyY2ggKi8KK3R5cGVkZWYgZW51bQoreworICBwcmVvcmRlciwKKyAgcG9zdG9yZGVyLAorICBlbmRvcmRlciwKKyAgbGVhZgorfQorVklTSVQ7CisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgbWF0Y2hpbmcgdGhlIGdpdmVuIEtFWSBpbiB0aGUgdHJlZSBwb2ludGVkIHRvCisgICBieSAqUk9PVFAgYW5kIGluc2VydCBhIG5ldyBlbGVtZW50IGlmIG5vdCBmb3VuZC4gICovCitleHRlcm4gdm9pZCAqdHNlYXJjaCAoX19jb25zdCB2b2lkICpfX2tleSwgdm9pZCAqKl9fcm9vdHAsCisJCSAgICAgIF9fY29tcGFyX2ZuX3QgX19jb21wYXIpOworCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IG1hdGNoaW5nIHRoZSBnaXZlbiBLRVkgaW4gdGhlIHRyZWUgcG9pbnRlZCB0bworICAgYnkgKlJPT1RQLiAgSWYgbm8gbWF0Y2hpbmcgZW50cnkgaXMgYXZhaWxhYmxlIHJldHVybiBOVUxMLiAgKi8KK2V4dGVybiB2b2lkICp0ZmluZCAoX19jb25zdCB2b2lkICpfX2tleSwgdm9pZCAqX19jb25zdCAqX19yb290cCwKKwkJICAgIF9fY29tcGFyX2ZuX3QgX19jb21wYXIpOworCisvKiBSZW1vdmUgdGhlIGVsZW1lbnQgbWF0Y2hpbmcgS0VZIGZyb20gdGhlIHRyZWUgcG9pbnRlZCB0byBieSAqUk9PVFAuICAqLworZXh0ZXJuIHZvaWQgKnRkZWxldGUgKF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX2tleSwKKwkJICAgICAgdm9pZCAqKl9fcmVzdHJpY3QgX19yb290cCwKKwkJICAgICAgX19jb21wYXJfZm5fdCBfX2NvbXBhcik7CisKKyNpZm5kZWYgX19BQ1RJT05fRk5fVAorIyBkZWZpbmUgX19BQ1RJT05fRk5fVAordHlwZWRlZiB2b2lkICgqX19hY3Rpb25fZm5fdCkgKF9fY29uc3Qgdm9pZCAqX19ub2RlcCwgVklTSVQgX192YWx1ZSwKKwkJCSAgICAgICBpbnQgX19sZXZlbCk7CisjZW5kaWYKKworLyogV2FsayB0aHJvdWdoIHRoZSB3aG9sZSB0cmVlIGFuZCBjYWxsIHRoZSBBQ1RJT04gY2FsbGJhY2sgZm9yIGV2ZXJ5IG5vZGUKKyAgIG9yIGxlYWYuICAqLworZXh0ZXJuIHZvaWQgdHdhbGsgKF9fY29uc3Qgdm9pZCAqX19yb290LCBfX2FjdGlvbl9mbl90IF9fYWN0aW9uKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQ2FsbGJhY2sgdHlwZSBmb3IgZnVuY3Rpb24gdG8gZnJlZSBhIHRyZWUgbm9kZS4gIElmIHRoZSBrZXlzIGFyZSBhdG9taWMKKyAgIGRhdGEgdGhpcyBmdW5jdGlvbiBzaG91bGQgZG8gbm90aGluZy4gICovCit0eXBlZGVmIHZvaWQgKCpfX2ZyZWVfZm5fdCkgKHZvaWQgKl9fbm9kZXApOworCisvKiBEZXN0cm95IHRoZSB3aG9sZSB0cmVlLCBjYWxsIEZSRUVGQ1QgZm9yIGVhY2ggbm9kZSBvciBsZWFmLiAgKi8KK2V4dGVybiB2b2lkIHRkZXN0cm95ICh2b2lkICpfX3Jvb3QsIF9fZnJlZV9mbl90IF9fZnJlZWZjdCk7CisjZW5kaWYKKworCisvKiBQZXJmb3JtIGxpbmVhciBzZWFyY2ggZm9yIEtFWSBieSBjb21wYXJpbmcgYnkgQ09NUEFSIGluIGFuIGFycmF5CisgICBbQkFTRSxCQVNFK05NRU1CKlNJWkUpLiAgKi8KK2V4dGVybiB2b2lkICpsZmluZCAoX19jb25zdCB2b2lkICpfX2tleSwgX19jb25zdCB2b2lkICpfX2Jhc2UsCisJCSAgICBzaXplX3QgKl9fbm1lbWIsIHNpemVfdCBfX3NpemUsIF9fY29tcGFyX2ZuX3QgX19jb21wYXIpOworCisvKiBQZXJmb3JtIGxpbmVhciBzZWFyY2ggZm9yIEtFWSBieSBjb21wYXJpbmcgYnkgQ09NUEFSIGZ1bmN0aW9uIGluCisgICBhcnJheSBbQkFTRSxCQVNFK05NRU1CKlNJWkUpIGFuZCBpbnNlcnQgZW50cnkgaWYgbm90IGZvdW5kLiAgKi8KK2V4dGVybiB2b2lkICpsc2VhcmNoIChfX2NvbnN0IHZvaWQgKl9fa2V5LCB2b2lkICpfX2Jhc2UsCisJCSAgICAgIHNpemVfdCAqX19ubWVtYiwgc2l6ZV90IF9fc2l6ZSwgX19jb21wYXJfZm5fdCBfX2NvbXBhcik7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzZWFyY2guaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zZW1hcGhvcmUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2VtYXBob3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjYWY2NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2VtYXBob3JlLmgKQEAgLTAsMCArMSw3OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TRU1BUEhPUkVfSAorI2RlZmluZSBfU0VNQVBIT1JFX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisjIGRlZmluZSBfX25lZWRfdGltZXNwZWMKKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisKKy8qIEdldCB0aGUgZGVmaW5pdGlvbiBmb3Igc2VtX3QuICAqLworI2luY2x1ZGUgPGJpdHMvc2VtYXBob3JlLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBJbml0aWFsaXplIHNlbWFwaG9yZSBvYmplY3QgU0VNIHRvIFZBTFVFLiAgSWYgUFNIQVJFRCB0aGVuIHNoYXJlIGl0CisgICB3aXRoIG90aGVyIHByb2Nlc3Nlcy4gICovCitleHRlcm4gaW50IHNlbV9pbml0IChzZW1fdCAqX19zZW0sIGludCBfX3BzaGFyZWQsIHVuc2lnbmVkIGludCBfX3ZhbHVlKQorICAgICBfX1RIUk9XOworLyogRnJlZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHNlbWFwaG9yZSBvYmplY3QgU0VNLiAgKi8KK2V4dGVybiBpbnQgc2VtX2Rlc3Ryb3kgKHNlbV90ICpfX3NlbSkgX19USFJPVzsKKworLyogT3BlbiBhIG5hbWVkIHNlbWFwaG9yZSBOQU1FIHdpdGggb3BlbiBmbGFncyBPRkxBRy4gICovCitleHRlcm4gc2VtX3QgKnNlbV9vcGVuIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fb2ZsYWcsIC4uLikgX19USFJPVzsKKworLyogQ2xvc2UgZGVzY3JpcHRvciBmb3IgbmFtZWQgc2VtYXBob3JlIFNFTS4gICovCitleHRlcm4gaW50IHNlbV9jbG9zZSAoc2VtX3QgKl9fc2VtKSBfX1RIUk9XOworCisvKiBSZW1vdmUgbmFtZWQgc2VtYXBob3JlIE5BTUUuICAqLworZXh0ZXJuIGludCBzZW1fdW5saW5rIChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKKworLyogV2FpdCBmb3IgU0VNIGJlaW5nIHBvc3RlZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHNlbV93YWl0IChzZW1fdCAqX19zZW0pOworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogU2ltaWxhciB0byBgc2VtX3dhaXQnIGJ1dCB3YWl0IG9ubHkgdW50aWwgQUJTVElNRS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHNlbV90aW1lZHdhaXQgKHNlbV90ICpfX3Jlc3RyaWN0IF9fc2VtLAorCQkJICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXN0cmljdCBfX2Fic3RpbWUpOworI2VuZGlmCisKKy8qIFRlc3Qgd2hldGhlciBTRU0gaXMgcG9zdGVkLiAgKi8KK2V4dGVybiBpbnQgc2VtX3RyeXdhaXQgKHNlbV90ICpfX3NlbSkgX19USFJPV05MOworCisvKiBQb3N0IFNFTS4gICovCitleHRlcm4gaW50IHNlbV9wb3N0IChzZW1fdCAqX19zZW0pIF9fVEhST1dOTDsKKworLyogR2V0IGN1cnJlbnQgdmFsdWUgb2YgU0VNIGFuZCBzdG9yZSBpdCBpbiAqU1ZBTC4gICovCitleHRlcm4gaW50IHNlbV9nZXR2YWx1ZSAoc2VtX3QgKl9fcmVzdHJpY3QgX19zZW0sIGludCAqX19yZXN0cmljdCBfX3N2YWwpCisgICAgIF9fVEhST1c7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHNlbWFwaG9yZS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NldGptcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDU3YWI2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zZXRqbXAuaApAQCAtMCwwICsxLDEyMiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTksMjAwMSwyMDAyLDIwMDcsMjAwOSwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4xMyBOb25sb2NhbCBqdW1wcwk8c2V0am1wLmg+CisgKi8KKworI2lmbmRlZglfU0VUSk1QX0gKKyNkZWZpbmUJX1NFVEpNUF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGJpdHMvc2V0am1wLmg+CQkvKiBHZXQgYF9fam1wX2J1ZicuICAqLworI2luY2x1ZGUgPGJpdHMvc2lnc2V0Lmg+CQkvKiBHZXQgYF9fc2lnc2V0X3QnLiAgKi8KKworCisvKiBDYWxsaW5nIGVudmlyb25tZW50LCBwbHVzIHBvc3NpYmx5IGEgc2F2ZWQgc2lnbmFsIG1hc2suICAqLworc3RydWN0IF9fam1wX2J1Zl90YWcKKyAgeworICAgIC8qIE5PVEU6IFRoZSBtYWNoaW5lLWRlcGVuZGVudCBkZWZpbml0aW9ucyBvZiBgX19zaWdzZXRqbXAnCisgICAgICAgYXNzdW1lIHRoYXQgYSBgam1wX2J1ZicgYmVnaW5zIHdpdGggYSBgX19qbXBfYnVmJyBhbmQgdGhhdAorICAgICAgIGBfX21hc2tfd2FzX3NhdmVkJyBmb2xsb3dzIGl0LiAgRG8gbm90IG1vdmUgdGhlc2UgbWVtYmVycworICAgICAgIG9yIGFkZCBvdGhlcnMgYmVmb3JlIGl0LiAgKi8KKyAgICBfX2ptcF9idWYgX19qbXBidWY7CQkvKiBDYWxsaW5nIGVudmlyb25tZW50LiAgKi8KKyAgICBpbnQgX19tYXNrX3dhc19zYXZlZDsJLyogU2F2ZWQgdGhlIHNpZ25hbCBtYXNrPyAgKi8KKyAgICBfX3NpZ3NldF90IF9fc2F2ZWRfbWFzazsJLyogU2F2ZWQgc2lnbmFsIG1hc2suICAqLworICB9OworCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorCit0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWZfdGFnIGptcF9idWZbMV07CisKKy8qIFN0b3JlIHRoZSBjYWxsaW5nIGVudmlyb25tZW50IGluIEVOViwgYWxzbyBzYXZpbmcgdGhlIHNpZ25hbCBtYXNrLgorICAgUmV0dXJuIDAuICAqLworZXh0ZXJuIGludCBzZXRqbXAgKGptcF9idWYgX19lbnYpIF9fVEhST1dOTDsKKworX19FTkRfTkFNRVNQQUNFX1NURAorCisvKiBTdG9yZSB0aGUgY2FsbGluZyBlbnZpcm9ubWVudCBpbiBFTlYsIGFsc28gc2F2aW5nIHRoZQorICAgc2lnbmFsIG1hc2sgaWYgU0FWRU1BU0sgaXMgbm9uemVyby4gIFJldHVybiAwLgorICAgVGhpcyBpcyB0aGUgaW50ZXJuYWwgbmFtZSBmb3IgYHNpZ3NldGptcCcuICAqLworZXh0ZXJuIGludCBfX3NpZ3NldGptcCAoc3RydWN0IF9fam1wX2J1Zl90YWcgX19lbnZbMV0sIGludCBfX3NhdmVtYXNrKSBfX1RIUk9XTkw7CisKKyNpZm5kZWYJX19GQVZPUl9CU0QKKy8qIFN0b3JlIHRoZSBjYWxsaW5nIGVudmlyb25tZW50IGluIEVOViwgbm90IHNhdmluZyB0aGUgc2lnbmFsIG1hc2suCisgICBSZXR1cm4gMC4gICovCitleHRlcm4gaW50IF9zZXRqbXAgKHN0cnVjdCBfX2ptcF9idWZfdGFnIF9fZW52WzFdKSBfX1RIUk9XTkw7CisKKy8qIERvIG5vdCBzYXZlIHRoZSBzaWduYWwgbWFzay4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgYF9zZXRqbXAnCisgICBCU0QgZnVuY3Rpb24uICAqLworIyBkZWZpbmUgc2V0am1wKGVudikJX3NldGptcCAoZW52KQorI2Vsc2UKKy8qIFdlIGFyZSBpbiA0LjMgQlNELWNvbXBhdGliaWxpdHkgbW9kZSBpbiB3aGljaCBgc2V0am1wJworICAgc2F2ZXMgdGhlIHNpZ25hbCBtYXNrIGxpa2UgYHNpZ3NldGptcCAoRU5WLCAxKScuICBXZSBoYXZlIHRvCisgICBkZWZpbmUgYSBtYWNybyBzaW5jZSBJU08gQyBzYXlzIGBzZXRqbXAnIGlzIG9uZS4gICovCisjIGRlZmluZSBzZXRqbXAoZW52KQlzZXRqbXAgKGVudikKKyNlbmRpZiAvKiBGYXZvciBCU0QuICAqLworCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorCisvKiBKdW1wIHRvIHRoZSBlbnZpcm9ubWVudCBzYXZlZCBpbiBFTlYsIG1ha2luZyB0aGUKKyAgIGBzZXRqbXAnIGNhbGwgdGhlcmUgcmV0dXJuIFZBTCwgb3IgMSBpZiBWQUwgaXMgMC4gICovCitleHRlcm4gdm9pZCBsb25nam1wIChzdHJ1Y3QgX19qbXBfYnVmX3RhZyBfX2VudlsxXSwgaW50IF9fdmFsKQorICAgICBfX1RIUk9XTkwgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBTYW1lLiAgVXN1YWxseSBgX2xvbmdqbXAnIGlzIHVzZWQgd2l0aCBgX3NldGptcCcsIHdoaWNoIGRvZXMgbm90IHNhdmUKKyAgIHRoZSBzaWduYWwgbWFzay4gIEJ1dCBpdCBpcyBob3cgRU5WIHdhcyBzYXZlZCB0aGF0IGRldGVybWluZXMgd2hldGhlcgorICAgYGxvbmdqbXAnIHJlc3RvcmVzIHRoZSBtYXNrOyBgX2xvbmdqbXAnIGlzIGp1c3QgYW4gYWxpYXMuICAqLworZXh0ZXJuIHZvaWQgX2xvbmdqbXAgKHN0cnVjdCBfX2ptcF9idWZfdGFnIF9fZW52WzFdLCBpbnQgX192YWwpCisgICAgIF9fVEhST1dOTCBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisjZW5kaWYKKworCisjaWZkZWYJX19VU0VfUE9TSVgKKy8qIFVzZSB0aGUgc2FtZSB0eXBlIGZvciBgam1wX2J1ZicgYW5kIGBzaWdqbXBfYnVmJy4KKyAgIFRoZSBgX19tYXNrX3dhc19zYXZlZCcgZmxhZyBkZXRlcm1pbmVzIHdoZXRoZXIKKyAgIG9yIG5vdCBgbG9uZ2ptcCcgd2lsbCByZXN0b3JlIHRoZSBzaWduYWwgbWFzay4gICovCit0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWZfdGFnIHNpZ2ptcF9idWZbMV07CisKKy8qIFN0b3JlIHRoZSBjYWxsaW5nIGVudmlyb25tZW50IGluIEVOViwgYWxzbyBzYXZpbmcgdGhlCisgICBzaWduYWwgbWFzayBpZiBTQVZFTUFTSyBpcyBub256ZXJvLiAgUmV0dXJuIDAuICAqLworIyBkZWZpbmUgc2lnc2V0am1wKGVudiwgc2F2ZW1hc2spCV9fc2lnc2V0am1wIChlbnYsIHNhdmVtYXNrKQorCisvKiBKdW1wIHRvIHRoZSBlbnZpcm9ubWVudCBzYXZlZCBpbiBFTlYsIG1ha2luZyB0aGUKKyAgIHNpZ3NldGptcCBjYWxsIHRoZXJlIHJldHVybiBWQUwsIG9yIDEgaWYgVkFMIGlzIDAuCisgICBSZXN0b3JlIHRoZSBzaWduYWwgbWFzayBpZiB0aGF0IHNpZ3NldGptcCBjYWxsIHNhdmVkIGl0LgorICAgVGhpcyBpcyBqdXN0IGFuIGFsaWFzIGBsb25nam1wJy4gICovCitleHRlcm4gdm9pZCBzaWdsb25nam1wIChzaWdqbXBfYnVmIF9fZW52LCBpbnQgX192YWwpCisgICAgIF9fVEhST1dOTCBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisjZW5kaWYgLyogVXNlIFBPU0lYLiAgKi8KKworCisvKiBEZWZpbmUgaGVscGVyIGZ1bmN0aW9ucyB0byBjYXRjaCB1bnNhZmUgY29kZS4gICovCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAKKyMgaW5jbHVkZSA8Yml0cy9zZXRqbXAyLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHNldGptcC5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zZ3R0eS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zZ3R0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMmJjNDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NndHR5LmgKQEAgLTAsMCArMSw0MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TR1RUWV9ICisjZGVmaW5lCV9TR1RUWV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworLyogT24gc29tZSBzeXN0ZW1zIHRoaXMgdHlwZSBpcyBub3QgZGVmaW5lZCBieSA8Yml0cy9pb2N0bC10eXBlcy5oPjsKKyAgIGluIHRoYXQgY2FzZSwgdGhlIGZ1bmN0aW9ucyBhcmUganVzdCBzdHVicyB0aGF0IHJldHVybiBFTk9TWVMuICAqLworc3RydWN0IHNndHR5YjsKKworX19CRUdJTl9ERUNMUworCisvKiBGaWxsIGluICpQQVJBTVMgd2l0aCB0ZXJtaW5hbCBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCBGRC4gICovCitleHRlcm4gaW50IGd0dHkgKGludCBfX2ZkLCBzdHJ1Y3Qgc2d0dHliICpfX3BhcmFtcykgX19USFJPVzsKKworLyogU2V0IHRoZSB0ZXJtaW5hbCBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCBGRCB0byAqUEFSQU1TLiAgKi8KK2V4dGVybiBpbnQgc3R0eSAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IHNndHR5YiAqX19wYXJhbXMpIF9fVEhST1c7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHNndHR5LmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NoYWRvdy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zaGFkb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzhkZjUyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zaGFkb3cuaApAQCAtMCwwICsxLDE0OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBEZWNsYXJhdGlvbiBvZiB0eXBlcyBhbmQgZnVuY3Rpb25zIGZvciBzaGFkb3cgcGFzc3dvcmQgc3VpdGUuICAqLworCisjaWZuZGVmIF9TSEFET1dfSAorI2RlZmluZSBfU0hBRE9XX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHBhdGhzLmg+CisKKyNkZWZpbmUJX19uZWVkX0ZJTEUKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIFBhdGhzIHRvIHRoZSB1c2VyIGRhdGFiYXNlIGZpbGVzLiAgKi8KKyNkZWZpbmUJU0hBRE9XIF9QQVRIX1NIQURPVworCisKK19fQkVHSU5fREVDTFMKKworLyogU3RydWN0dXJlIG9mIHRoZSBwYXNzd29yZCBmaWxlLiAgKi8KK3N0cnVjdCBzcHdkCisgIHsKKyAgICBjaGFyICpzcF9uYW1wOwkJLyogTG9naW4gbmFtZS4gICovCisgICAgY2hhciAqc3BfcHdkcDsJCS8qIEVuY3J5cHRlZCBwYXNzd29yZC4gICovCisgICAgbG9uZyBpbnQgc3BfbHN0Y2hnOwkJLyogRGF0ZSBvZiBsYXN0IGNoYW5nZS4gICovCisgICAgbG9uZyBpbnQgc3BfbWluOwkJLyogTWluaW11bSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIGNoYW5nZXMuICAqLworICAgIGxvbmcgaW50IHNwX21heDsJCS8qIE1heGltdW0gbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBjaGFuZ2VzLiAgKi8KKyAgICBsb25nIGludCBzcF93YXJuOwkJLyogTnVtYmVyIG9mIGRheXMgdG8gd2FybiB1c2VyIHRvIGNoYW5nZQorCQkJCSAgIHRoZSBwYXNzd29yZC4gICovCisgICAgbG9uZyBpbnQgc3BfaW5hY3Q7CQkvKiBOdW1iZXIgb2YgZGF5cyB0aGUgYWNjb3VudCBtYXkgYmUKKwkJCQkgICBpbmFjdGl2ZS4gICovCisgICAgbG9uZyBpbnQgc3BfZXhwaXJlOwkJLyogTnVtYmVyIG9mIGRheXMgc2luY2UgMTk3MC0wMS0wMSB1bnRpbAorCQkJCSAgIGFjY291bnQgZXhwaXJlcy4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3BfZmxhZzsJLyogUmVzZXJ2ZWQuICAqLworICB9OworCisKKy8qIE9wZW4gZGF0YWJhc2UgZm9yIHJlYWRpbmcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHNldHNwZW50ICh2b2lkKTsKKworLyogQ2xvc2UgZGF0YWJhc2UuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGVuZHNwZW50ICh2b2lkKTsKKworLyogR2V0IG5leHQgZW50cnkgZnJvbSBkYXRhYmFzZSwgcGVyaGFwcyBhZnRlciBvcGVuaW5nIHRoZSBmaWxlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHNwd2QgKmdldHNwZW50ICh2b2lkKTsKKworLyogR2V0IHNoYWRvdyBlbnRyeSBtYXRjaGluZyBOQU1FLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHNwd2QgKmdldHNwbmFtIChfX2NvbnN0IGNoYXIgKl9fbmFtZSk7CisKKy8qIFJlYWQgc2hhZG93IGVudHJ5IGZyb20gU1RSSU5HLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHNwd2QgKnNnZXRzcGVudCAoX19jb25zdCBjaGFyICpfX3N0cmluZyk7CisKKy8qIFJlYWQgbmV4dCBzaGFkb3cgZW50cnkgZnJvbSBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgc3B3ZCAqZmdldHNwZW50IChGSUxFICpfX3N0cmVhbSk7CisKKy8qIFdyaXRlIGxpbmUgY29udGFpbmluZyBzaGFkb3cgcGFzc3dvcmQgZW50cnkgdG8gc3RyZWFtLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHB1dHNwZW50IChfX2NvbnN0IHN0cnVjdCBzcHdkICpfX3AsIEZJTEUgKl9fc3RyZWFtKTsKKworCisjaWZkZWYgX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb25zIG9mIHNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZS4KKworICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gdGhleSBhcmUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldHNwZW50X3IgKHN0cnVjdCBzcHdkICpfX3Jlc3VsdF9idWYsIGNoYXIgKl9fYnVmZmVyLAorCQkgICAgICAgc2l6ZV90IF9fYnVmbGVuLCBzdHJ1Y3Qgc3B3ZCAqKl9fcmVzdWx0KTsKKworZXh0ZXJuIGludCBnZXRzcG5hbV9yIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgc3RydWN0IHNwd2QgKl9fcmVzdWx0X2J1ZiwKKwkJICAgICAgIGNoYXIgKl9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCSAgICAgICBzdHJ1Y3Qgc3B3ZCAqKl9fcmVzdWx0KTsKKworZXh0ZXJuIGludCBzZ2V0c3BlbnRfciAoX19jb25zdCBjaGFyICpfX3N0cmluZywgc3RydWN0IHNwd2QgKl9fcmVzdWx0X2J1ZiwKKwkJCWNoYXIgKl9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCQlzdHJ1Y3Qgc3B3ZCAqKl9fcmVzdWx0KTsKKworZXh0ZXJuIGludCBmZ2V0c3BlbnRfciAoRklMRSAqX19zdHJlYW0sIHN0cnVjdCBzcHdkICpfX3Jlc3VsdF9idWYsCisJCQljaGFyICpfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkJc3RydWN0IHNwd2QgKipfX3Jlc3VsdCk7CisjZW5kaWYJLyogbWlzYyAqLworCisKKy8qIFRoZSBzaW1wbGUgbG9ja2luZyBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGhlcmUgaXMgbm90IHN1aXRhYmxlIGZvcgorICAgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgKi8KKworLyogUHJvdGVjdCBwYXNzd29yZCBmaWxlIGFnYWluc3QgbXVsdGkgd3JpdGVycy4gICovCitleHRlcm4gaW50IGxja3B3ZGYgKHZvaWQpIF9fVEhST1c7CisKKy8qIFVubG9jayBwYXNzd29yZCBmaWxlLiAgKi8KK2V4dGVybiBpbnQgdWxja3B3ZGYgKHZvaWQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzaGFkb3cuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zaWduYWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkZjY0OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2lnbmFsLmgKQEAgLTAsMCArMSw0MTAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0yMDA0LCAyMDA3LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4xNCBTaWduYWwgaGFuZGxpbmcgPHNpZ25hbC5oPgorICovCisKKyNpZm5kZWYJX1NJR05BTF9ICisKKyNpZiAhZGVmaW5lZCBfX25lZWRfc2lnX2F0b21pY190ICYmICFkZWZpbmVkIF9fbmVlZF9zaWdzZXRfdAorIyBkZWZpbmUgX1NJR05BTF9ICisjZW5kaWYKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGJpdHMvc2lnc2V0Lmg+CQkvKiBfX3NpZ3NldF90LCBfX3NpZ19hdG9taWNfdC4gICovCisKKy8qIEFuIGludGVncmFsIHR5cGUgdGhhdCBjYW4gYmUgbW9kaWZpZWQgYXRvbWljYWxseSwgd2l0aG91dCB0aGUKKyAgIHBvc3NpYmlsaXR5IG9mIGEgc2lnbmFsIGFycml2aW5nIGluIHRoZSBtaWRkbGUgb2YgdGhlIG9wZXJhdGlvbi4gICovCisjaWYgZGVmaW5lZCBfX25lZWRfc2lnX2F0b21pY190IHx8IGRlZmluZWQgX1NJR05BTF9ICisjIGlmbmRlZiBfX3NpZ19hdG9taWNfdF9kZWZpbmVkCisjICBkZWZpbmUgX19zaWdfYXRvbWljX3RfZGVmaW5lZAorX19CRUdJTl9OQU1FU1BBQ0VfU1RECit0eXBlZGVmIF9fc2lnX2F0b21pY190IHNpZ19hdG9taWNfdDsKK19fRU5EX05BTUVTUEFDRV9TVEQKKyMgZW5kaWYKKyMgdW5kZWYgX19uZWVkX3NpZ19hdG9taWNfdAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fbmVlZF9zaWdzZXRfdCB8fCAoZGVmaW5lZCBfU0lHTkFMX0ggJiYgZGVmaW5lZCBfX1VTRV9QT1NJWCkKKyMgaWZuZGVmIF9fc2lnc2V0X3RfZGVmaW5lZAorIyAgZGVmaW5lIF9fc2lnc2V0X3RfZGVmaW5lZAordHlwZWRlZiBfX3NpZ3NldF90IHNpZ3NldF90OworIyBlbmRpZgorIyB1bmRlZiBfX25lZWRfc2lnc2V0X3QKKyNlbmRpZgorCisjaWZkZWYgX1NJR05BTF9ICisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy9zaWdudW0uaD4KKworI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisjIGlmbmRlZiBfX3BpZF90X2RlZmluZWQKK3R5cGVkZWYgX19waWRfdCBwaWRfdDsKKyMgIGRlZmluZSBfX3BpZF90X2RlZmluZWQKKyNlbmRpZgorI2lmZGVmIF9fVVNFX1hPUEVOCisjIGVuZGlmCisjIGlmbmRlZiBfX3VpZF90X2RlZmluZWQKK3R5cGVkZWYgX191aWRfdCB1aWRfdDsKKyMgIGRlZmluZSBfX3VpZF90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgkvKiBVbml4OTggKi8KKworI2lmZGVmIF9fVVNFX1BPU0lYMTk5MzA5CisvKiBXZSBuZWVkIGBzdHJ1Y3QgdGltZXNwZWMnIGxhdGVyIG9uLiAgKi8KKyMgZGVmaW5lIF9fbmVlZF90aW1lc3BlYworIyBpbmNsdWRlIDx0aW1lLmg+CisKKy8qIEdldCB0aGUgYHNpZ2luZm9fdCcgdHlwZSBwbHVzIHRoZSBuZWVkZWQgc3ltYm9scy4gICovCisjIGluY2x1ZGUgPGJpdHMvc2lnaW5mby5oPgorI2VuZGlmCisKKworLyogVHlwZSBvZiBhIHNpZ25hbCBoYW5kbGVyLiAgKi8KK3R5cGVkZWYgdm9pZCAoKl9fc2lnaGFuZGxlcl90KSAoaW50KTsKKworLyogVGhlIFgvT3BlbiBkZWZpbml0aW9uIG9mIGBzaWduYWwnIHNwZWNpZmllcyB0aGUgU1ZJRCBzZW1hbnRpYy4gIFVzZQorICAgdGhlIGFkZGl0aW9uYWwgZnVuY3Rpb24gYHN5c3Zfc2lnbmFsJyB3aGVuIFgvT3BlbiBjb21wYXRpYmlsaXR5IGlzCisgICByZXF1ZXN0ZWQuICAqLworZXh0ZXJuIF9fc2lnaGFuZGxlcl90IF9fc3lzdl9zaWduYWwgKGludCBfX3NpZywgX19zaWdoYW5kbGVyX3QgX19oYW5kbGVyKQorICAgICBfX1RIUk9XOworI2lmZGVmIF9fVVNFX0dOVQorZXh0ZXJuIF9fc2lnaGFuZGxlcl90IHN5c3Zfc2lnbmFsIChpbnQgX19zaWcsIF9fc2lnaGFuZGxlcl90IF9faGFuZGxlcikKKyAgICAgX19USFJPVzsKKyNlbmRpZgorCisvKiBTZXQgdGhlIGhhbmRsZXIgZm9yIHRoZSBzaWduYWwgU0lHIHRvIEhBTkRMRVIsIHJldHVybmluZyB0aGUgb2xkCisgICBoYW5kbGVyLCBvciBTSUdfRVJSIG9uIGVycm9yLgorICAgQnkgZGVmYXVsdCBgc2lnbmFsJyBoYXMgdGhlIEJTRCBzZW1hbnRpYy4gICovCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKyNpZmRlZiBfX1VTRV9CU0QKK2V4dGVybiBfX3NpZ2hhbmRsZXJfdCBzaWduYWwgKGludCBfX3NpZywgX19zaWdoYW5kbGVyX3QgX19oYW5kbGVyKQorICAgICBfX1RIUk9XOworI2Vsc2UKKy8qIE1ha2Ugc3VyZSB0aGUgdXNlZCBgc2lnbmFsJyBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgU1ZJRCB2ZXJzaW9uLiAqLworIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIF9fc2lnaGFuZGxlcl90IF9fUkVESVJFQ1RfTlRIIChzaWduYWwsCisJCQkJICAgICAgKGludCBfX3NpZywgX19zaWdoYW5kbGVyX3QgX19oYW5kbGVyKSwKKwkJCQkgICAgICBfX3N5c3Zfc2lnbmFsKTsKKyMgZWxzZQorIyAgZGVmaW5lIHNpZ25hbCBfX3N5c3Zfc2lnbmFsCisjIGVuZGlmCisjZW5kaWYKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX1hPUEVOCisvKiBUaGUgWC9PcGVuIGRlZmluaXRpb24gb2YgYHNpZ25hbCcgY29uZmxpY3RzIHdpdGggdGhlIEJTRCB2ZXJzaW9uLgorICAgU28gdGhleSBkZWZpbmVkIGFub3RoZXIgZnVuY3Rpb24gYGJzZF9zaWduYWwnLiAgKi8KK2V4dGVybiBfX3NpZ2hhbmRsZXJfdCBic2Rfc2lnbmFsIChpbnQgX19zaWcsIF9fc2lnaGFuZGxlcl90IF9faGFuZGxlcikKKyAgICAgX19USFJPVzsKKyNlbmRpZgorCisvKiBTZW5kIHNpZ25hbCBTSUcgdG8gcHJvY2VzcyBudW1iZXIgUElELiAgSWYgUElEIGlzIHplcm8sCisgICBzZW5kIFNJRyB0byBhbGwgcHJvY2Vzc2VzIGluIHRoZSBjdXJyZW50IHByb2Nlc3MncyBwcm9jZXNzIGdyb3VwLgorICAgSWYgUElEIGlzIDwgLTEsIHNlbmQgU0lHIHRvIGFsbCBwcm9jZXNzZXMgaW4gcHJvY2VzcyBncm91cCAtIFBJRC4gICovCisjaWZkZWYgX19VU0VfUE9TSVgKK2V4dGVybiBpbnQga2lsbCAoX19waWRfdCBfX3BpZCwgaW50IF9fc2lnKSBfX1RIUk9XOworI2VuZGlmIC8qIFVzZSBQT1NJWC4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBTZW5kIFNJRyB0byBhbGwgcHJvY2Vzc2VzIGluIHByb2Nlc3MgZ3JvdXAgUEdSUC4KKyAgIElmIFBHUlAgaXMgemVybywgc2VuZCBTSUcgdG8gYWxsIHByb2Nlc3NlcyBpbgorICAgdGhlIGN1cnJlbnQgcHJvY2VzcydzIHByb2Nlc3MgZ3JvdXAuICAqLworZXh0ZXJuIGludCBraWxscGcgKF9fcGlkX3QgX19wZ3JwLCBpbnQgX19zaWcpIF9fVEhST1c7CisjZW5kaWYgLyogVXNlIEJTRCB8fCBYL09wZW4gVW5peC4gICovCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmFpc2Ugc2lnbmFsIFNJRywgaS5lLiwgc2VuZCBTSUcgdG8geW91cnNlbGYuICAqLworZXh0ZXJuIGludCByYWlzZSAoaW50IF9fc2lnKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfU1ZJRAorLyogU1ZJRCBuYW1lcyBmb3IgdGhlIHNhbWUgdGhpbmdzLiAgKi8KK2V4dGVybiBfX3NpZ2hhbmRsZXJfdCBzc2lnbmFsIChpbnQgX19zaWcsIF9fc2lnaGFuZGxlcl90IF9faGFuZGxlcikKKyAgICAgX19USFJPVzsKK2V4dGVybiBpbnQgZ3NpZ25hbCAoaW50IF9fc2lnKSBfX1RIUk9XOworI2VuZGlmIC8qIFVzZSBTVklELiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIFByaW50IGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBtZWFuaW5nIG9mIHRoZSBnaXZlbiBzaWduYWwgbnVtYmVyLiAgKi8KK2V4dGVybiB2b2lkIHBzaWduYWwgKGludCBfX3NpZywgX19jb25zdCBjaGFyICpfX3MpOworI2VuZGlmIC8qIFVzZSBtaXNjIG9yIFBPU0lYIDIwMDguICAqLworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogUHJpbnQgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIG1lYW5pbmcgb2YgdGhlIGdpdmVuIHNpZ25hbCBpbmZvcm1hdGlvbi4gICovCitleHRlcm4gdm9pZCBwc2lnaW5mbyAoX19jb25zdCBzaWdpbmZvX3QgKl9fcGluZm8sIF9fY29uc3QgY2hhciAqX19zKTsKKyNlbmRpZiAvKiBQT1NJWCAyMDA4LiAgKi8KKworCisKKy8qIFRoZSBgc2lncGF1c2UnIGZ1bmN0aW9uIGhhcyB0d28gZGlmZmVyZW50IGludGVyZmFjZXMuICBUaGUgb3JpZ2luYWwKKyAgIEJTRCBkZWZpbml0aW9uIGRlZmluZXMgdGhlIGFyZ3VtZW50IGFzIGEgbWFzayBvZiB0aGUgc2lnbmFsLCB3aGlsZQorICAgdGhlIG1vcmUgbW9kZXJuIGludGVyZmFjZSBpbiBYL09wZW4gZGVmaW5lcyBpdCBhcyB0aGUgc2lnbmFsCisgICBudW1iZXIuICBXZSBnbyB3aXRoIHRoZSBCU0QgdmVyc2lvbiB1bmxlc3MgdGhlIHVzZXIgZXhwbGljaXRseQorICAgc2VsZWN0cyB0aGUgWC9PcGVuIHZlcnNpb24uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBfX3NpZ3BhdXNlIChpbnQgX19zaWdfb3JfbWFzaywgaW50IF9faXNfc2lnKTsKKworI2lmZGVmIF9fRkFWT1JfQlNECisvKiBTZXQgdGhlIG1hc2sgb2YgYmxvY2tlZCBzaWduYWxzIHRvIE1BU0ssCisgICB3YWl0IGZvciBhIHNpZ25hbCB0byBhcnJpdmUsIGFuZCB0aGVuIHJlc3RvcmUgdGhlIG1hc2suICAqLworZXh0ZXJuIGludCBzaWdwYXVzZSAoaW50IF9fbWFzaykgX19USFJPVyBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX187CisjZWxzZQorIyBpZmRlZiBfX1VTRV9YT1BFTgorIyAgaWZkZWYgX19HTlVDX18KK2V4dGVybiBpbnQgc2lncGF1c2UgKGludCBfX3NpZykgX19hc21fXyAoIl9feHBnX3NpZ3BhdXNlIik7CisjICBlbHNlCisvKiBSZW1vdmUgYSBzaWduYWwgZnJvbSB0aGUgc2lnbmFsIG1hc2sgYW5kIHN1c3BlbmQgdGhlIHByb2Nlc3MuICAqLworIyAgIGRlZmluZSBzaWdwYXVzZShzaWcpIF9fc2lncGF1c2UgKChzaWcpLCAxKQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIE5vbmUgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgYW55bW9yZS4gIFRoZXkgYXJlIGhlcmUKKyAgIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkuICBBIHNpbmdsZSB3b3JkIChgaW50JykgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUKKyAgIGVub3VnaCB0byBob2xkIGEgY29tcGxldGUgc2lnbmFsIG1hc2sgYW5kIHRoZXJlZm9yZSB0aGVzZSBmdW5jdGlvbnMKKyAgIHNpbXBseSBkbyBub3Qgd29yayBpbiBtYW55IHNpdHVhdGlvbnMuICBVc2UgYHNpZ3Byb2NtYXNrJyBpbnN0ZWFkLiAgKi8KKworLyogQ29tcHV0ZSBtYXNrIGZvciBzaWduYWwgU0lHLiAgKi8KKyMgZGVmaW5lIHNpZ21hc2soc2lnKQlfX3NpZ21hc2soc2lnKQorCisvKiBCbG9jayBzaWduYWxzIGluIE1BU0ssIHJldHVybmluZyB0aGUgb2xkIG1hc2suICAqLworZXh0ZXJuIGludCBzaWdibG9jayAoaW50IF9fbWFzaykgX19USFJPVyBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX187CisKKy8qIFNldCB0aGUgbWFzayBvZiBibG9ja2VkIHNpZ25hbHMgdG8gTUFTSywgcmV0dXJuaW5nIHRoZSBvbGQgbWFzay4gICovCitleHRlcm4gaW50IHNpZ3NldG1hc2sgKGludCBfX21hc2spIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworCisvKiBSZXR1cm4gY3VycmVudGx5IHNlbGVjdGVkIHNpZ25hbCBtYXNrLiAgKi8KK2V4dGVybiBpbnQgc2lnZ2V0bWFzayAodm9pZCkgX19USFJPVyBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX187CisjZW5kaWYgLyogVXNlIEJTRC4gICovCisKKworI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIE5TSUcJX05TSUcKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCit0eXBlZGVmIF9fc2lnaGFuZGxlcl90IHNpZ2hhbmRsZXJfdDsKKyNlbmRpZgorCisvKiA0LjQgQlNEIHVzZXMgdGhlIG5hbWUgYHNpZ190JyBmb3IgdGhpcy4gICovCisjaWZkZWYgX19VU0VfQlNECit0eXBlZGVmIF9fc2lnaGFuZGxlcl90IHNpZ190OworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9QT1NJWAorCisvKiBDbGVhciBhbGwgc2lnbmFscyBmcm9tIFNFVC4gICovCitleHRlcm4gaW50IHNpZ2VtcHR5c2V0IChzaWdzZXRfdCAqX19zZXQpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBTZXQgYWxsIHNpZ25hbHMgaW4gU0VULiAgKi8KK2V4dGVybiBpbnQgc2lnZmlsbHNldCAoc2lnc2V0X3QgKl9fc2V0KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogQWRkIFNJR05PIHRvIFNFVC4gICovCitleHRlcm4gaW50IHNpZ2FkZHNldCAoc2lnc2V0X3QgKl9fc2V0LCBpbnQgX19zaWdubykgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJlbW92ZSBTSUdOTyBmcm9tIFNFVC4gICovCitleHRlcm4gaW50IHNpZ2RlbHNldCAoc2lnc2V0X3QgKl9fc2V0LCBpbnQgX19zaWdubykgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJldHVybiAxIGlmIFNJR05PIGlzIGluIFNFVCwgMCBpZiBub3QuICAqLworZXh0ZXJuIGludCBzaWdpc21lbWJlciAoX19jb25zdCBzaWdzZXRfdCAqX19zZXQsIGludCBfX3NpZ25vKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworIyBpZmRlZiBfX1VTRV9HTlUKKy8qIFJldHVybiBub24tZW1wdHkgdmFsdWUgaXMgU0VUIGlzIG5vdCBlbXB0eS4gICovCitleHRlcm4gaW50IHNpZ2lzZW1wdHlzZXQgKF9fY29uc3Qgc2lnc2V0X3QgKl9fc2V0KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogQnVpbGQgbmV3IHNpZ25hbCBzZXQgYnkgY29tYmluaW5nIHRoZSB0d28gaW5wdXRzIHNldCB1c2luZyBsb2dpY2FsIEFORC4gICovCitleHRlcm4gaW50IHNpZ2FuZHNldCAoc2lnc2V0X3QgKl9fc2V0LCBfX2NvbnN0IHNpZ3NldF90ICpfX2xlZnQsCisJCSAgICAgIF9fY29uc3Qgc2lnc2V0X3QgKl9fcmlnaHQpIF9fVEhST1cgX19ub25udWxsICgoMSwgMiwgMykpOworCisvKiBCdWlsZCBuZXcgc2lnbmFsIHNldCBieSBjb21iaW5pbmcgdGhlIHR3byBpbnB1dHMgc2V0IHVzaW5nIGxvZ2ljYWwgT1IuICAqLworZXh0ZXJuIGludCBzaWdvcnNldCAoc2lnc2V0X3QgKl9fc2V0LCBfX2NvbnN0IHNpZ3NldF90ICpfX2xlZnQsCisJCSAgICAgX19jb25zdCBzaWdzZXRfdCAqX19yaWdodCkgX19USFJPVyBfX25vbm51bGwgKCgxLCAyLCAzKSk7CisjIGVuZGlmIC8qIEdOVSAqLworCisvKiBHZXQgdGhlIHN5c3RlbS1zcGVjaWZpYyBkZWZpbml0aW9ucyBvZiBgc3RydWN0IHNpZ2FjdGlvbicKKyAgIGFuZCB0aGUgYFNBXyonIGFuZCBgU0lHXyonLiBjb25zdGFudHMuICAqLworIyBpbmNsdWRlIDxiaXRzL3NpZ2FjdGlvbi5oPgorCisvKiBHZXQgYW5kL29yIGNoYW5nZSB0aGUgc2V0IG9mIGJsb2NrZWQgc2lnbmFscy4gICovCitleHRlcm4gaW50IHNpZ3Byb2NtYXNrIChpbnQgX19ob3csIF9fY29uc3Qgc2lnc2V0X3QgKl9fcmVzdHJpY3QgX19zZXQsCisJCQlzaWdzZXRfdCAqX19yZXN0cmljdCBfX29zZXQpIF9fVEhST1c7CisKKy8qIENoYW5nZSB0aGUgc2V0IG9mIGJsb2NrZWQgc2lnbmFscyB0byBTRVQsCisgICB3YWl0IHVudGlsIGEgc2lnbmFsIGFycml2ZXMsIGFuZCByZXN0b3JlIHRoZSBzZXQgb2YgYmxvY2tlZCBzaWduYWxzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgc2lnc3VzcGVuZCAoX19jb25zdCBzaWdzZXRfdCAqX19zZXQpIF9fbm9ubnVsbCAoKDEpKTsKKworLyogR2V0IGFuZC9vciBzZXQgdGhlIGFjdGlvbiBmb3Igc2lnbmFsIFNJRy4gICovCitleHRlcm4gaW50IHNpZ2FjdGlvbiAoaW50IF9fc2lnLCBfX2NvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKl9fcmVzdHJpY3QgX19hY3QsCisJCSAgICAgIHN0cnVjdCBzaWdhY3Rpb24gKl9fcmVzdHJpY3QgX19vYWN0KSBfX1RIUk9XOworCisvKiBQdXQgaW4gU0VUIGFsbCBzaWduYWxzIHRoYXQgYXJlIGJsb2NrZWQgYW5kIHdhaXRpbmcgdG8gYmUgZGVsaXZlcmVkLiAgKi8KK2V4dGVybiBpbnQgc2lncGVuZGluZyAoc2lnc2V0X3QgKl9fc2V0KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworCisvKiBTZWxlY3QgYW55IG9mIHBlbmRpbmcgc2lnbmFscyBmcm9tIFNFVCBvciB3YWl0IGZvciBhbnkgdG8gYXJyaXZlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgc2lnd2FpdCAoX19jb25zdCBzaWdzZXRfdCAqX19yZXN0cmljdCBfX3NldCwgaW50ICpfX3Jlc3RyaWN0IF9fc2lnKQorICAgICBfX25vbm51bGwgKCgxLCAyKSk7CisKKyMgaWZkZWYgX19VU0VfUE9TSVgxOTkzMDkKKy8qIFNlbGVjdCBhbnkgb2YgcGVuZGluZyBzaWduYWxzIGZyb20gU0VUIGFuZCBwbGFjZSBpbmZvcm1hdGlvbiBpbiBJTkZPLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgc2lnd2FpdGluZm8gKF9fY29uc3Qgc2lnc2V0X3QgKl9fcmVzdHJpY3QgX19zZXQsCisJCQlzaWdpbmZvX3QgKl9fcmVzdHJpY3QgX19pbmZvKSBfX25vbm51bGwgKCgxKSk7CisKKy8qIFNlbGVjdCBhbnkgb2YgcGVuZGluZyBzaWduYWxzIGZyb20gU0VUIGFuZCBwbGFjZSBpbmZvcm1hdGlvbiBpbiBJTkZPLgorICAgV2FpdCB0aGUgdGltZSBzcGVjaWZpZWQgYnkgVElNRU9VVCBpZiBubyBzaWduYWwgaXMgcGVuZGluZy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHNpZ3RpbWVkd2FpdCAoX19jb25zdCBzaWdzZXRfdCAqX19yZXN0cmljdCBfX3NldCwKKwkJCSBzaWdpbmZvX3QgKl9fcmVzdHJpY3QgX19pbmZvLAorCQkJIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3Jlc3RyaWN0IF9fdGltZW91dCkKKyAgICAgX19ub25udWxsICgoMSkpOworCisvKiBTZW5kIHNpZ25hbCBTSUcgdG8gdGhlIHByb2Nlc3MgUElELiAgQXNzb2NpYXRlIGRhdGEgaW4gVkFMIHdpdGggdGhlCisgICBzaWduYWwuICAqLworZXh0ZXJuIGludCBzaWdxdWV1ZSAoX19waWRfdCBfX3BpZCwgaW50IF9fc2lnLCBfX2NvbnN0IHVuaW9uIHNpZ3ZhbCBfX3ZhbCkKKyAgICAgX19USFJPVzsKKyMgZW5kaWYJLyogVXNlIFBPU0lYIDE5OTMwNi4gICovCisKKyNlbmRpZiAvKiBVc2UgUE9TSVguICAqLworCisjaWZkZWYgX19VU0VfQlNECisKKy8qIE5hbWVzIG9mIHRoZSBzaWduYWxzLiAgVGhpcyB2YXJpYWJsZSBleGlzdHMgb25seSBmb3IgY29tcGF0aWJpbGl0eS4KKyAgIFVzZSBgc3Ryc2lnbmFsJyBpbnN0ZWFkIChzZWUgPHN0cmluZy5oPikuICAqLworZXh0ZXJuIF9fY29uc3QgY2hhciAqX19jb25zdCBfc3lzX3NpZ2xpc3RbX05TSUddOworZXh0ZXJuIF9fY29uc3QgY2hhciAqX19jb25zdCBzeXNfc2lnbGlzdFtfTlNJR107CisKKy8qIFN0cnVjdHVyZSBwYXNzZWQgdG8gYHNpZ3ZlYycuICAqLworc3RydWN0IHNpZ3ZlYworICB7CisgICAgX19zaWdoYW5kbGVyX3Qgc3ZfaGFuZGxlcjsJLyogU2lnbmFsIGhhbmRsZXIuICAqLworICAgIGludCBzdl9tYXNrOwkJLyogTWFzayBvZiBzaWduYWxzIHRvIGJlIGJsb2NrZWQuICAqLworCisgICAgaW50IHN2X2ZsYWdzOwkJLyogRmxhZ3MgKHNlZSBiZWxvdykuICAqLworIyBkZWZpbmUgc3Zfb25zdGFjawlzdl9mbGFncyAvKiA0LjIgQlNEIGNvbXBhdGliaWxpdHkuICAqLworICB9OworCisvKiBCaXRzIGluIGBzdl9mbGFncycuICAqLworIyBkZWZpbmUgU1ZfT05TVEFDSwkoMSA8PCAwKS8qIFRha2UgdGhlIHNpZ25hbCBvbiB0aGUgc2lnbmFsIHN0YWNrLiAgKi8KKyMgZGVmaW5lIFNWX0lOVEVSUlVQVAkoMSA8PCAxKS8qIERvIG5vdCByZXN0YXJ0IHN5c3RlbSBjYWxscy4gICovCisjIGRlZmluZSBTVl9SRVNFVEhBTkQJKDEgPDwgMikvKiBSZXNldCBoYW5kbGVyIHRvIFNJR19ERkwgb24gcmVjZWlwdC4gICovCisKKworLyogSWYgVkVDIGlzIG5vbi1OVUxMLCBzZXQgdGhlIGhhbmRsZXIgZm9yIFNJRyB0byB0aGUgYHN2X2hhbmRsZXInIG1lbWJlcgorICAgb2YgVkVDLiAgVGhlIHNpZ25hbHMgaW4gYHN2X21hc2snIHdpbGwgYmUgYmxvY2tlZCB3aGlsZSB0aGUgaGFuZGxlciBydW5zLgorICAgSWYgdGhlIFNWX1JFU0VUSEFORCBiaXQgaXMgc2V0IGluIGBzdl9mbGFncycsIHRoZSBoYW5kbGVyIGZvciBTSUcgd2lsbCBiZQorICAgcmVzZXQgdG8gU0lHX0RGTCBiZWZvcmUgYHN2X2hhbmRsZXInIGlzIGVudGVyZWQuICBJZiBPVkVDIGlzIG5vbi1OVUxMLAorICAgaXQgaXMgZmlsbGVkIGluIHdpdGggdGhlIG9sZCBpbmZvcm1hdGlvbiBmb3IgU0lHLiAgKi8KK2V4dGVybiBpbnQgc2lndmVjIChpbnQgX19zaWcsIF9fY29uc3Qgc3RydWN0IHNpZ3ZlYyAqX192ZWMsCisJCSAgIHN0cnVjdCBzaWd2ZWMgKl9fb3ZlYykgX19USFJPVzsKKworCisvKiBHZXQgbWFjaGluZS1kZXBlbmRlbnQgYHN0cnVjdCBzaWdjb250ZXh0JyBhbmQgc2lnbmFsIHN1YmNvZGVzLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9zaWdjb250ZXh0Lmg+CisKKy8qIFJlc3RvcmUgdGhlIHN0YXRlIHNhdmVkIGluIFNDUC4gICovCitleHRlcm4gaW50IHNpZ3JldHVybiAoc3RydWN0IHNpZ2NvbnRleHQgKl9fc2NwKSBfX1RIUk9XOworCisjZW5kaWYgLyogIHVzZSBCU0QuICAqLworCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKyMgZGVmaW5lIF9fbmVlZF9zaXplX3QKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIElmIElOVEVSUlVQVCBpcyBub256ZXJvLCBtYWtlIHNpZ25hbCBTSUcgaW50ZXJydXB0IHN5c3RlbSBjYWxscworICAgKGNhdXNpbmcgdGhlbSB0byBmYWlsIHdpdGggRUlOVFIpOyBpZiBJTlRFUlJVUFQgaXMgemVybywgbWFrZSBzeXN0ZW0KKyAgIGNhbGxzIGJlIHJlc3RhcnRlZCBhZnRlciBzaWduYWwgU0lHLiAgKi8KK2V4dGVybiBpbnQgc2lnaW50ZXJydXB0IChpbnQgX19zaWcsIGludCBfX2ludGVycnVwdCkgX19USFJPVzsKKworIyBpbmNsdWRlIDxiaXRzL3NpZ3N0YWNrLmg+CisjIGlmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorLyogVGhpcyB3aWxsIGRlZmluZSBgdWNvbnRleHRfdCcgYW5kIGBtY29udGV4dF90Jy4gICovCisjICBpbmNsdWRlIDxzeXMvdWNvbnRleHQuaD4KKyMgZW5kaWYKKworLyogUnVuIHNpZ25hbHMgaGFuZGxlcnMgb24gdGhlIHN0YWNrIHNwZWNpZmllZCBieSBTUyAoaWYgbm90IE5VTEwpLgorICAgSWYgT1NTIGlzIG5vdCBOVUxMLCBpdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgb2xkIHNpZ25hbCBzdGFjayBzdGF0dXMuCisgICBUaGlzIGludGVyZmFjZSBpcyBvYnNvbGV0ZSBhbmQgb24gbWFueSBwbGF0Zm9ybSBub3QgaW1wbGVtZW50ZWQuICAqLworZXh0ZXJuIGludCBzaWdzdGFjayAoc3RydWN0IHNpZ3N0YWNrICpfX3NzLCBzdHJ1Y3Qgc2lnc3RhY2sgKl9fb3NzKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKKworLyogQWx0ZXJuYXRlIHNpZ25hbCBoYW5kbGVyIHN0YWNrIGludGVyZmFjZS4KKyAgIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBhbHdheXMgYmUgcHJlZmVycmVkIG92ZXIgYHNpZ3N0YWNrJy4gICovCitleHRlcm4gaW50IHNpZ2FsdHN0YWNrIChfX2NvbnN0IHN0cnVjdCBzaWdhbHRzdGFjayAqX19yZXN0cmljdCBfX3NzLAorCQkJc3RydWN0IHNpZ2FsdHN0YWNrICpfX3Jlc3RyaWN0IF9fb3NzKSBfX1RIUk9XOworCisjZW5kaWYgLyogdXNlIEJTRCBvciBYL09wZW4gVW5peC4gICovCisKKyNpZmRlZiBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogU2ltcGxpZmllZCBpbnRlcmZhY2UgZm9yIHNpZ25hbCBtYW5hZ2VtZW50LiAgKi8KKworLyogQWRkIFNJRyB0byB0aGUgY2FsbGluZyBwcm9jZXNzJyBzaWduYWwgbWFzay4gICovCitleHRlcm4gaW50IHNpZ2hvbGQgKGludCBfX3NpZykgX19USFJPVzsKKworLyogUmVtb3ZlIFNJRyBmcm9tIHRoZSBjYWxsaW5nIHByb2Nlc3MnIHNpZ25hbCBtYXNrLiAgKi8KK2V4dGVybiBpbnQgc2lncmVsc2UgKGludCBfX3NpZykgX19USFJPVzsKKworLyogU2V0IHRoZSBkaXNwb3NpdGlvbiBvZiBTSUcgdG8gU0lHX0lHTi4gICovCitleHRlcm4gaW50IHNpZ2lnbm9yZSAoaW50IF9fc2lnKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIGRpc3Bvc2l0aW9uIG9mIFNJRy4gICovCitleHRlcm4gX19zaWdoYW5kbGVyX3Qgc2lnc2V0IChpbnQgX19zaWcsIF9fc2lnaGFuZGxlcl90IF9fZGlzcCkgX19USFJPVzsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTUwNiB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorLyogU29tZSBvZiB0aGUgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBzaWduYWxzIGluIHRocmVhZGVkIHByb2dyYW1zIG11c3QKKyAgIGJlIGRlZmluZWQgaGVyZS4gICovCisjIGluY2x1ZGUgPGJpdHMvcHRocmVhZHR5cGVzLmg+CisjIGluY2x1ZGUgPGJpdHMvc2lndGhyZWFkLmg+CisjZW5kaWYgLyogdXNlIFVuaXg5OCAqLworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCBpbnRlcm5hbGx5IGluIHRoZSBDIGxpYnJhcnkgYW5kIGluCisgICBvdGhlciBjb2RlIHdoaWNoIG5lZWQgZGVlcCBpbnNpZ2h0cy4gICovCisKKy8qIFJldHVybiBudW1iZXIgb2YgYXZhaWxhYmxlIHJlYWwtdGltZSBzaWduYWwgd2l0aCBoaWdoZXN0IHByaW9yaXR5LiAgKi8KK2V4dGVybiBpbnQgX19saWJjX2N1cnJlbnRfc2lncnRtaW4gKHZvaWQpIF9fVEhST1c7CisvKiBSZXR1cm4gbnVtYmVyIG9mIGF2YWlsYWJsZSByZWFsLXRpbWUgc2lnbmFsIHdpdGggbG93ZXN0IHByaW9yaXR5LiAgKi8KK2V4dGVybiBpbnQgX19saWJjX2N1cnJlbnRfc2lncnRtYXggKHZvaWQpIF9fVEhST1c7CisKKyNlbmRpZiAvKiBzaWduYWwuaCAgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG5vdCBzaWduYWwuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9hc2VxdWVuY2VyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL2FzZXF1ZW5jZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmU0ZGE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9hc2VxdWVuY2VyLmgKQEAgLTAsMCArMSw2MTQgQEAKKy8qCisgKiAgTWFpbiBoZWFkZXIgZmlsZSBmb3IgdGhlIEFMU0Egc2VxdWVuY2VyCisgKiAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgYnkgRnJhbmsgdmFuIGRlIFBvbCA8ZnZkcG9sQGNvaWwuZGVtb24ubmw+CisgKiAgICAgICAgICAgIChjKSAxOTk4LTE5OTkgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworI2lmbmRlZiBfX1NPVU5EX0FTRVFVRU5DRVJfSAorI2RlZmluZSBfX1NPVU5EX0FTRVFVRU5DRVJfSAorCisKKy8qKiB2ZXJzaW9uIG9mIHRoZSBzZXF1ZW5jZXIgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1ZFUlNJT04gU05EUlZfUFJPVE9DT0xfVkVSU0lPTiAoMSwgMCwgMSkKKworLyoqCisgKiBkZWZpbml0aW9uIG9mIHNlcXVlbmNlciBldmVudCB0eXBlcworICovCisKKy8qKiBzeXN0ZW0gbWVzc2FnZXMKKyAqIGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX3Jlc3VsdAorICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9TWVNURU0JCTAKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1JFU1VMVAkJMQorCisvKiogbm90ZSBtZXNzYWdlcyAoY2hhbm5lbCBzcGVjaWZpYykKKyAqIGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X25vdGUKKyAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfTk9URQkJNQorI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfTk9URU9OCQk2CisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9OT1RFT0ZGCQk3CisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9LRVlQUkVTUwk4CisJCisvKiogY29udHJvbCBtZXNzYWdlcyAoY2hhbm5lbCBzcGVjaWZpYykKKyAqIGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmwKKyAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfQ09OVFJPTExFUgkxMAorI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfUEdNQ0hBTkdFCTExCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9DSEFOUFJFU1MJMTIKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1BJVENIQkVORAkxMwkvKio8IGZyb20gLTgxOTIgdG8gODE5MSAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfQ09OVFJPTDE0CTE0CS8qKjwgMTQgYml0IGNvbnRyb2xsZXIgdmFsdWUgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX05PTlJFR1BBUkFNCTE1CS8qKjwgMTQgYml0IE5SUE4gYWRkcmVzcyArIDE0IGJpdCB1bnNpZ25lZCB2YWx1ZSAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfUkVHUEFSQU0JMTYJLyoqPCAxNCBiaXQgUlBOIGFkZHJlc3MgKyAxNCBiaXQgdW5zaWduZWQgdmFsdWUgKi8KKworLyoqIHN5bmNocm9uaXNhdGlvbiBtZXNzYWdlcworICogZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfY3RybAorICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9TT05HUE9TCQkyMAkvKiBTb25nIFBvc2l0aW9uIFBvaW50ZXIgd2l0aCBMU0IgYW5kIE1TQiB2YWx1ZXMgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1NPTkdTRUwJCTIxCS8qIFNvbmcgU2VsZWN0IHdpdGggc29uZyBJRCBudW1iZXIgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1FGUkFNRQkJMjIJLyogbWlkaSB0aW1lIGNvZGUgcXVhcnRlciBmcmFtZSAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVElNRVNJR04JMjMJLyogU01GIFRpbWUgU2lnbmF0dXJlIGV2ZW50ICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9LRVlTSUdOCQkyNAkvKiBTTUYgS2V5IFNpZ25hdHVyZSBldmVudCAqLworCSAgICAgICAgCisvKiogdGltZXIgbWVzc2FnZXMKKyAqIGV2ZW50IGRhdGEgdHlwZSA9IHNuZF9zZXFfZXZfcXVldWVfY29udHJvbAorICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9TVEFSVAkJMzAJLyogbWlkaSBSZWFsIFRpbWUgU3RhcnQgbWVzc2FnZSAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfQ09OVElOVUUJMzEJLyogbWlkaSBSZWFsIFRpbWUgQ29udGludWUgbWVzc2FnZSAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfU1RPUAkJMzIJLyogbWlkaSBSZWFsIFRpbWUgU3RvcCBtZXNzYWdlICovCQorI2RlZmluZQlTTkRSVl9TRVFfRVZFTlRfU0VUUE9TX1RJQ0sJMzMJLyogc2V0IHRpY2sgcXVldWUgcG9zaXRpb24gKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1NFVFBPU19USU1FCTM0CS8qIHNldCByZWFsdGltZSBxdWV1ZSBwb3NpdGlvbiAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVEVNUE8JCTM1CS8qIChTTUYpIFRlbXBvIGV2ZW50ICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9DTE9DSwkJMzYJLyogbWlkaSBSZWFsIFRpbWUgQ2xvY2sgbWVzc2FnZSAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVElDSwkJMzcJLyogbWlkaSBSZWFsIFRpbWUgVGljayBtZXNzYWdlICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9RVUVVRV9TS0VXCTM4CS8qIHNrZXcgcXVldWUgdGVtcG8gKi8KKworLyoqIG90aGVycworICogZXZlbnQgZGF0YSB0eXBlID0gbm9uZQorICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9UVU5FX1JFUVVFU1QJNDAJLyogdHVuZSByZXF1ZXN0ICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9SRVNFVAkJNDEJLyogcmVzZXQgdG8gcG93ZXItb24gc3RhdGUgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1NFTlNJTkcJCTQyCS8qICJhY3RpdmUgc2Vuc2luZyIgZXZlbnQgKi8KKworLyoqIGVjaG8gYmFjaywga2VybmVsIHByaXZhdGUgbWVzc2FnZXMKKyAqIGV2ZW50IGRhdGEgdHlwZSA9IGFueSB0eXBlCisgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX0VDSE8JCTUwCS8qIGVjaG8gZXZlbnQgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX09TUwkJNTEJLyogT1NTIHJhdyBldmVudCAqLworCisvKiogc3lzdGVtIHN0YXR1cyBtZXNzYWdlcyAoYnJvYWRjYXN0IGZvciBzdWJzY3JpYmVycykKKyAqIGV2ZW50IGRhdGEgdHlwZSA9IHNuZF9zZXFfYWRkcgorICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9DTElFTlRfU1RBUlQJNjAJLyogbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9DTElFTlRfRVhJVAk2MQkvKiBjbGllbnQgaGFzIGxlZnQgdGhlIHN5c3RlbSAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfQ0xJRU5UX0NIQU5HRQk2MgkvKiBjbGllbnQgc3RhdHVzL2luZm8gaGFzIGNoYW5nZWQgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1BPUlRfU1RBUlQJNjMJLyogbmV3IHBvcnQgd2FzIGNyZWF0ZWQgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1BPUlRfRVhJVAk2NAkvKiBwb3J0IHdhcyBkZWxldGVkIGZyb20gc3lzdGVtICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9QT1JUX0NIQU5HRQk2NQkvKiBwb3J0IHN0YXR1cy9pbmZvIGhhcyBjaGFuZ2VkICovCisKKy8qKiBwb3J0IGNvbm5lY3Rpb24gY2hhbmdlcworICogZXZlbnQgZGF0YSB0eXBlID0gc25kX3NlcV9jb25uZWN0CisgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1BPUlRfU1VCU0NSSUJFRAk2NgkvKiBwb3J0cyBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1BPUlRfVU5TVUJTQ1JJQkVEIDY3CS8qIHBvcnRzIGRpc2Nvbm5lY3RlZCAqLworCisvKiA3MC04OTogIHN5bnRoZXNpemVyIGV2ZW50cyAtIG9ic29sZXRlZCAqLworCisvKiogdXNlci1kZWZpbmVkIGV2ZW50cyB3aXRoIGZpeGVkIGxlbmd0aAorICogZXZlbnQgZGF0YSB0eXBlID0gYW55CisgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1VTUjAJCTkwCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9VU1IxCQk5MQorI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVVNSMgkJOTIKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1VTUjMJCTkzCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9VU1I0CQk5NAorI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVVNSNQkJOTUKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1VTUjYJCTk2CisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9VU1I3CQk5NworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVVNSOAkJOTgKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1VTUjkJCTk5CisKKy8qIDEwMC0xMTg6IGluc3RydW1lbnQgbGF5ZXIgLSBvYnNvbGV0ZWQgKi8KKy8qIDExOS0xMjk6IHJlc2VydmVkICovCisKKy8qIDEzMC0xMzk6IHZhcmlhYmxlIGxlbmd0aCBldmVudHMKKyAqIGV2ZW50IGRhdGEgdHlwZSA9IHNuZF9zZXFfZXZfZXh0CisgKiAoU05EUlZfU0VRX0VWRU5UX0xFTkdUSF9WQVJJQUJMRSBtdXN0IGJlIHNldCkKKyAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfU1lTRVgJCTEzMAkvKiBzeXN0ZW0gZXhjbHVzaXZlIGRhdGEgKHZhcmlhYmxlIGxlbmd0aCkgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX0JPVU5DRQkJMTMxCS8qIGVycm9yIGV2ZW50ICovCisvKiAxMzItMTM0OiByZXNlcnZlZCAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVVNSX1ZBUjAJMTM1CisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9VU1JfVkFSMQkxMzYKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1VTUl9WQVIyCTEzNworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVVNSX1ZBUjMJMTM4CisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9VU1JfVkFSNAkxMzkKKworLyogMTUwLTE1MToga2VybmVsIGV2ZW50cyB3aXRoIHF1b3RlIC0gRE8gTk9UIHVzZSBpbiB1c2VyIGNsaWVudHMgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX0tFUk5FTF9FUlJPUgkxNTAKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX0tFUk5FTF9RVU9URQkxNTEJLyogb2Jzb2xldGUgKi8KKworLyogMTUyLTE5MTogcmVzZXJ2ZWQgKi8KKworLyogMTkyLTI1NDogaGFyZHdhcmUgc3BlY2lmaWMgZXZlbnRzICovCisKKy8qIDI1NTogc3BlY2lhbCBldmVudCAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfTk9ORQkJMjU1CisKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHNuZF9zZXFfZXZlbnRfdHlwZV90OworCisvKiogZXZlbnQgYWRkcmVzcyAqLworc3RydWN0IHNuZF9zZXFfYWRkciB7CisJdW5zaWduZWQgY2hhciBjbGllbnQ7CS8qKjwgQ2xpZW50IG51bWJlcjogICAgICAgICAwLi4yNTUsIDI1NSA9IGJyb2FkY2FzdCB0byBhbGwgY2xpZW50cyAqLworCXVuc2lnbmVkIGNoYXIgcG9ydDsJLyoqPCBQb3J0IHdpdGhpbiBjbGllbnQ6ICAgIDAuLjI1NSwgMjU1ID0gYnJvYWRjYXN0IHRvIGFsbCBwb3J0cyAqLworfTsKKworLyoqIHBvcnQgY29ubmVjdGlvbiAqLworc3RydWN0IHNuZF9zZXFfY29ubmVjdCB7CisJc3RydWN0IHNuZF9zZXFfYWRkciBzZW5kZXI7CisJc3RydWN0IHNuZF9zZXFfYWRkciBkZXN0OworfTsKKworCisjZGVmaW5lIFNORFJWX1NFUV9BRERSRVNTX1VOS05PV04JMjUzCS8qIHVua25vd24gc291cmNlICovCisjZGVmaW5lIFNORFJWX1NFUV9BRERSRVNTX1NVQlNDUklCRVJTCTI1NAkvKiBzZW5kIGV2ZW50IHRvIGFsbCBzdWJzY3JpYmVkIHBvcnRzICovCisjZGVmaW5lIFNORFJWX1NFUV9BRERSRVNTX0JST0FEQ0FTVAkyNTUJLyogc2VuZCBldmVudCB0byBhbGwgcXVldWVzL2NsaWVudHMvcG9ydHMvY2hhbm5lbHMgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1FVRVVFX0RJUkVDVAkJMjUzCS8qIGRpcmVjdCBkaXNwYXRjaCAqLworCisJLyogZXZlbnQgbW9kZSBmbGFnIC0gTk9URTogb25seSA4IGJpdHMgYXZhaWxhYmxlISAqLworI2RlZmluZSBTTkRSVl9TRVFfVElNRV9TVEFNUF9USUNLCSgwPDwwKSAvKiB0aW1lc3RhbXAgaW4gY2xvY2sgdGlja3MgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1RJTUVfU1RBTVBfUkVBTAkoMTw8MCkgLyogdGltZXN0YW1wIGluIHJlYWwgdGltZSAqLworI2RlZmluZSBTTkRSVl9TRVFfVElNRV9TVEFNUF9NQVNLCSgxPDwwKQorCisjZGVmaW5lIFNORFJWX1NFUV9USU1FX01PREVfQUJTCQkoMDw8MSkJLyogYWJzb2x1dGUgdGltZXN0YW1wICovCisjZGVmaW5lIFNORFJWX1NFUV9USU1FX01PREVfUkVMCQkoMTw8MSkJLyogcmVsYXRpdmUgdG8gY3VycmVudCB0aW1lICovCisjZGVmaW5lIFNORFJWX1NFUV9USU1FX01PREVfTUFTSwkoMTw8MSkKKworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfTEVOR1RIX0ZJWEVECSgwPDwyKQkvKiBmaXhlZCBldmVudCBzaXplICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9MRU5HVEhfVkFSSUFCTEUJKDE8PDIpCS8qIHZhcmlhYmxlIGV2ZW50IHNpemUgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX0xFTkdUSF9WQVJVU1IJKDI8PDIpCS8qIHZhcmlhYmxlIGV2ZW50IHNpemUgLSB1c2VyIG1lbW9yeSBzcGFjZSAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfTEVOR1RIX01BU0sJKDM8PDIpCisKKyNkZWZpbmUgU05EUlZfU0VRX1BSSU9SSVRZX05PUk1BTAkoMDw8NCkJLyogbm9ybWFsIHByaW9yaXR5ICovCisjZGVmaW5lIFNORFJWX1NFUV9QUklPUklUWV9ISUdICQkoMTw8NCkJLyogZXZlbnQgc2hvdWxkIGJlIHByb2Nlc3NlZCBiZWZvcmUgb3RoZXJzICovCisjZGVmaW5lIFNORFJWX1NFUV9QUklPUklUWV9NQVNLCQkoMTw8NCkKKworCisJLyogbm90ZSBldmVudCAqLworc3RydWN0IHNuZF9zZXFfZXZfbm90ZSB7CisJdW5zaWduZWQgY2hhciBjaGFubmVsOworCXVuc2lnbmVkIGNoYXIgbm90ZTsKKwl1bnNpZ25lZCBjaGFyIHZlbG9jaXR5OworCXVuc2lnbmVkIGNoYXIgb2ZmX3ZlbG9jaXR5OwkvKiBvbmx5IGZvciBTTkRSVl9TRVFfRVZFTlRfTk9URSAqLworCXVuc2lnbmVkIGludCBkdXJhdGlvbjsJCS8qIG9ubHkgZm9yIFNORFJWX1NFUV9FVkVOVF9OT1RFICovCit9OworCisJLyogY29udHJvbGxlciBldmVudCAqLworc3RydWN0IHNuZF9zZXFfZXZfY3RybCB7CisJdW5zaWduZWQgY2hhciBjaGFubmVsOworCXVuc2lnbmVkIGNoYXIgdW51c2VkMSwgdW51c2VkMiwgdW51c2VkMzsJLyogcGFkICovCisJdW5zaWduZWQgaW50IHBhcmFtOworCXNpZ25lZCBpbnQgdmFsdWU7Cit9OworCisJLyogZ2VuZXJpYyBzZXQgb2YgYnl0ZXMgKDEyeDggYml0KSAqLworc3RydWN0IHNuZF9zZXFfZXZfcmF3OCB7CisJdW5zaWduZWQgY2hhciBkWzEyXTsJLyogOCBiaXQgdmFsdWUgKi8KK307CisKKwkvKiBnZW5lcmljIHNldCBvZiBpbnRlZ2VycyAoM3gzMiBiaXQpICovCitzdHJ1Y3Qgc25kX3NlcV9ldl9yYXczMiB7CisJdW5zaWduZWQgaW50IGRbM107CS8qIDMyIGJpdCB2YWx1ZSAqLworfTsKKworCS8qIGV4dGVybmFsIHN0b3JlZCBkYXRhICovCitzdHJ1Y3Qgc25kX3NlcV9ldl9leHQgeworCXVuc2lnbmVkIGludCBsZW47CS8qIGxlbmd0aCBvZiBkYXRhICovCisJdm9pZCAqcHRyOwkJLyogcG9pbnRlciB0byBkYXRhIChub3RlOiBtYXliZSA2NC1iaXQpICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc25kX3NlcV9yZXN1bHQgeworCWludCBldmVudDsJCS8qIHByb2Nlc3NlZCBldmVudCB0eXBlICovCisJaW50IHJlc3VsdDsKK307CisKKworc3RydWN0IHNuZF9zZXFfcmVhbF90aW1lIHsKKwl1bnNpZ25lZCBpbnQgdHZfc2VjOwkvKiBzZWNvbmRzICovCisJdW5zaWduZWQgaW50IHR2X25zZWM7CS8qIG5hbm9zZWNvbmRzICovCit9OworCit0eXBlZGVmIHVuc2lnbmVkIGludCBzbmRfc2VxX3RpY2tfdGltZV90OwkvKiBtaWRpIHRpY2tzICovCisKK3VuaW9uIHNuZF9zZXFfdGltZXN0YW1wIHsKKwlzbmRfc2VxX3RpY2tfdGltZV90IHRpY2s7CisJc3RydWN0IHNuZF9zZXFfcmVhbF90aW1lIHRpbWU7Cit9OworCitzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9za2V3IHsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJdW5zaWduZWQgaW50IGJhc2U7Cit9OworCisJLyogcXVldWUgdGltZXIgY29udHJvbCAqLworc3RydWN0IHNuZF9zZXFfZXZfcXVldWVfY29udHJvbCB7CisJdW5zaWduZWQgY2hhciBxdWV1ZTsJCQkvKiBhZmZlY3RlZCBxdWV1ZSAqLworCXVuc2lnbmVkIGNoYXIgcGFkWzNdOwkJCS8qIHJlc2VydmVkICovCisJdW5pb24geworCQlzaWduZWQgaW50IHZhbHVlOwkJLyogYWZmZWN0ZWQgdmFsdWUgKGUuZy4gdGVtcG8pICovCisJCXVuaW9uIHNuZF9zZXFfdGltZXN0YW1wIHRpbWU7CS8qIHRpbWUgKi8KKwkJdW5zaWduZWQgaW50IHBvc2l0aW9uOwkJLyogc3luYyBwb3NpdGlvbiAqLworCQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9za2V3IHNrZXc7CisJCXVuc2lnbmVkIGludCBkMzJbMl07CisJCXVuc2lnbmVkIGNoYXIgZDhbOF07CisJfSBwYXJhbTsKK307CisKKwkvKiBxdW90ZWQgZXZlbnQgLSBpbnNpZGUgdGhlIGtlcm5lbCBvbmx5ICovCitzdHJ1Y3Qgc25kX3NlcV9ldl9xdW90ZSB7CisJc3RydWN0IHNuZF9zZXFfYWRkciBvcmlnaW47CQkvKiBvcmlnaW5hbCBzZW5kZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCB2YWx1ZTsJCS8qIG9wdGlvbmFsIGRhdGEgKi8KKwlzdHJ1Y3Qgc25kX3NlcV9ldmVudCAqZXZlbnQ7CQkvKiBxdW90ZWQgZXZlbnQgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworCS8qIHNlcXVlbmNlciBldmVudCAqLworc3RydWN0IHNuZF9zZXFfZXZlbnQgeworCXNuZF9zZXFfZXZlbnRfdHlwZV90IHR5cGU7CS8qIGV2ZW50IHR5cGUgKi8KKwl1bnNpZ25lZCBjaGFyIGZsYWdzOwkJLyogZXZlbnQgZmxhZ3MgKi8KKwljaGFyIHRhZzsKKwkKKwl1bnNpZ25lZCBjaGFyIHF1ZXVlOwkJLyogc2NoZWR1bGUgcXVldWUgKi8KKwl1bmlvbiBzbmRfc2VxX3RpbWVzdGFtcCB0aW1lOwkvKiBzY2hlZHVsZSB0aW1lICovCisKKworCXN0cnVjdCBzbmRfc2VxX2FkZHIgc291cmNlOwkvKiBzb3VyY2UgYWRkcmVzcyAqLworCXN0cnVjdCBzbmRfc2VxX2FkZHIgZGVzdDsJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCisJdW5pb24gewkJCQkvKiBldmVudCBkYXRhLi4uICovCisJCXN0cnVjdCBzbmRfc2VxX2V2X25vdGUgbm90ZTsKKwkJc3RydWN0IHNuZF9zZXFfZXZfY3RybCBjb250cm9sOworCQlzdHJ1Y3Qgc25kX3NlcV9ldl9yYXc4IHJhdzg7CisJCXN0cnVjdCBzbmRfc2VxX2V2X3JhdzMyIHJhdzMyOworCQlzdHJ1Y3Qgc25kX3NlcV9ldl9leHQgZXh0OworCQlzdHJ1Y3Qgc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sIHF1ZXVlOworCQl1bmlvbiBzbmRfc2VxX3RpbWVzdGFtcCB0aW1lOworCQlzdHJ1Y3Qgc25kX3NlcV9hZGRyIGFkZHI7CisJCXN0cnVjdCBzbmRfc2VxX2Nvbm5lY3QgY29ubmVjdDsKKwkJc3RydWN0IHNuZF9zZXFfcmVzdWx0IHJlc3VsdDsKKwkJc3RydWN0IHNuZF9zZXFfZXZfcXVvdGUgcXVvdGU7CisJfSBkYXRhOworfTsKKworCisvKgorICogYm91bmNlIGV2ZW50IC0gc3RvcmVkIGFzIHZhcmlhYmxlIHNpemUgZGF0YQorICovCitzdHJ1Y3Qgc25kX3NlcV9ldmVudF9ib3VuY2UgeworCWludCBlcnI7CisJc3RydWN0IHNuZF9zZXFfZXZlbnQgZXZlbnQ7CisJLyogZXh0ZXJuYWwgZGF0YSBmb2xsb3dzIGhlcmUuICovCit9OworCisKKwkvKiBzeXN0ZW0gaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBzbmRfc2VxX3N5c3RlbV9pbmZvIHsKKwlpbnQgcXVldWVzOwkJCS8qIG1heGltdW0gcXVldWVzIGNvdW50ICovCisJaW50IGNsaWVudHM7CQkJLyogbWF4aW11bSBjbGllbnRzIGNvdW50ICovCisJaW50IHBvcnRzOwkJCS8qIG1heGltdW0gcG9ydHMgcGVyIGNsaWVudCAqLworCWludCBjaGFubmVsczsJCQkvKiBtYXhpbXVtIGNoYW5uZWxzIHBlciBwb3J0ICovCisJaW50IGN1cl9jbGllbnRzOwkJLyogY3VycmVudCBjbGllbnRzICovCisJaW50IGN1cl9xdWV1ZXM7CQkJLyogY3VycmVudCBxdWV1ZXMgKi8KKwljaGFyIHJlc2VydmVkWzI0XTsKK307CisKKworCS8qIHN5c3RlbSBydW5uaW5nIGluZm9ybWF0aW9uICovCitzdHJ1Y3Qgc25kX3NlcV9ydW5uaW5nX2luZm8geworCXVuc2lnbmVkIGNoYXIgY2xpZW50OwkJLyogY2xpZW50IGlkICovCisJdW5zaWduZWQgY2hhciBiaWdfZW5kaWFuOwkvKiAxID0gYmlnLWVuZGlhbiAqLworCXVuc2lnbmVkIGNoYXIgY3B1X21vZGU7CQkvKiA0ID0gMzJiaXQsIDggPSA2NGJpdCAqLworCXVuc2lnbmVkIGNoYXIgcGFkOwkJLyogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzEyXTsKK307CisKKworCS8qIGtub3duIGNsaWVudCBudW1iZXJzICovCisjZGVmaW5lIFNORFJWX1NFUV9DTElFTlRfU1lTVEVNCQkwCisJLyogaW50ZXJuYWwgY2xpZW50IG51bWJlcnMgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0NMSUVOVF9EVU1NWQkJMTQJLyogbWlkaSB0aHJvdWdoICovCisjZGVmaW5lIFNORFJWX1NFUV9DTElFTlRfT1NTCQkxNQkvKiBvc3Mgc2VxdWVuY2VyIGVtdWxhdG9yICovCisKKworCS8qIGNsaWVudCB0eXBlcyAqLwordHlwZWRlZiBpbnQgX19iaXR3aXNlIHNuZF9zZXFfY2xpZW50X3R5cGVfdDsKKyNkZWZpbmUJTk9fQ0xJRU5UCSgoc25kX3NlcV9jbGllbnRfdHlwZV90KSAwKQorI2RlZmluZQlVU0VSX0NMSUVOVAkoKHNuZF9zZXFfY2xpZW50X3R5cGVfdCkgMSkKKyNkZWZpbmUJS0VSTkVMX0NMSUVOVAkoKHNuZF9zZXFfY2xpZW50X3R5cGVfdCkgMikKKyAgICAgICAgICAgICAgICAgICAgICAgIAorCS8qIGV2ZW50IGZpbHRlciBmbGFncyAqLworI2RlZmluZSBTTkRSVl9TRVFfRklMVEVSX0JST0FEQ0FTVAkoMTw8MCkJLyogYWNjZXB0IGJyb2FkY2FzdCBtZXNzYWdlcyAqLworI2RlZmluZSBTTkRSVl9TRVFfRklMVEVSX01VTFRJQ0FTVAkoMTw8MSkJLyogYWNjZXB0IG11bHRpY2FzdCBtZXNzYWdlcyAqLworI2RlZmluZSBTTkRSVl9TRVFfRklMVEVSX0JPVU5DRQkJKDE8PDIpCS8qIGFjY2VwdCBib3VuY2UgZXZlbnQgaW4gZXJyb3IgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0ZJTFRFUl9VU0VfRVZFTlQJKDE8PDMxKQkvKiB1c2UgZXZlbnQgZmlsdGVyICovCisKK3N0cnVjdCBzbmRfc2VxX2NsaWVudF9pbmZvIHsKKwlpbnQgY2xpZW50OwkJCS8qIGNsaWVudCBudW1iZXIgdG8gaW5xdWlyZSAqLworCXNuZF9zZXFfY2xpZW50X3R5cGVfdCB0eXBlOwkvKiBjbGllbnQgdHlwZSAqLworCWNoYXIgbmFtZVs2NF07CQkJLyogY2xpZW50IG5hbWUgKi8KKwl1bnNpZ25lZCBpbnQgZmlsdGVyOwkJLyogZmlsdGVyIGZsYWdzICovCisJdW5zaWduZWQgY2hhciBtdWx0aWNhc3RfZmlsdGVyWzhdOyAvKiBtdWx0aWNhc3QgZmlsdGVyIGJpdG1hcCAqLworCXVuc2lnbmVkIGNoYXIgZXZlbnRfZmlsdGVyWzMyXTsJLyogZXZlbnQgZmlsdGVyIGJpdG1hcCAqLworCWludCBudW1fcG9ydHM7CQkJLyogUk86IG51bWJlciBvZiBwb3J0cyAqLworCWludCBldmVudF9sb3N0OwkJCS8qIG51bWJlciBvZiBsb3N0IGV2ZW50cyAqLworCWNoYXIgcmVzZXJ2ZWRbNjRdOwkJLyogZm9yIGZ1dHVyZSB1c2UgKi8KK307CisKKworLyogY2xpZW50IHBvb2wgc2l6ZSAqLworc3RydWN0IHNuZF9zZXFfY2xpZW50X3Bvb2wgeworCWludCBjbGllbnQ7CQkJLyogY2xpZW50IG51bWJlciB0byBpbnF1aXJlICovCisJaW50IG91dHB1dF9wb29sOwkJLyogb3V0Z29pbmcgKHdyaXRlKSBwb29sIHNpemUgKi8KKwlpbnQgaW5wdXRfcG9vbDsJCQkvKiBpbmNvbWluZyAocmVhZCkgcG9vbCBzaXplICovCisJaW50IG91dHB1dF9yb29tOwkJLyogbWluaW11bSBmcmVlIHBvb2wgc2l6ZSBmb3Igc2VsZWN0L2Jsb2NraW5nIG1vZGUgKi8KKwlpbnQgb3V0cHV0X2ZyZWU7CQkvKiB1bnVzZWQgc2l6ZSAqLworCWludCBpbnB1dF9mcmVlOwkJCS8qIHVudXNlZCBzaXplICovCisJY2hhciByZXNlcnZlZFs2NF07Cit9OworCisKKy8qIFJlbW92ZSBldmVudHMgYnkgc3BlY2lmaWVkIGNyaXRlcmlhICovCisKKyNkZWZpbmUgU05EUlZfU0VRX1JFTU9WRV9JTlBVVAkJKDE8PDApCS8qIEZsdXNoIGlucHV0IHF1ZXVlcyAqLworI2RlZmluZSBTTkRSVl9TRVFfUkVNT1ZFX09VVFBVVAkJKDE8PDEpCS8qIEZsdXNoIG91dHB1dCBxdWV1ZXMgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1JFTU9WRV9ERVNUCQkoMTw8MikJLyogUmVzdHJpY3QgYnkgZGVzdGluYXRpb24gcTpjbGllbnQ6cG9ydCAqLworI2RlZmluZSBTTkRSVl9TRVFfUkVNT1ZFX0RFU1RfQ0hBTk5FTAkoMTw8MykJLyogUmVzdHJpY3QgYnkgY2hhbm5lbCAqLworI2RlZmluZSBTTkRSVl9TRVFfUkVNT1ZFX1RJTUVfQkVGT1JFCSgxPDw0KQkvKiBSZXN0cmljdCB0byBiZWZvcmUgdGltZSAqLworI2RlZmluZSBTTkRSVl9TRVFfUkVNT1ZFX1RJTUVfQUZURVIJKDE8PDUpCS8qIFJlc3RyaWN0IHRvIHRpbWUgb3IgYWZ0ZXIgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1JFTU9WRV9USU1FX1RJQ0sJKDE8PDYpCS8qIFRpbWUgaXMgaW4gdGlja3MgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1JFTU9WRV9FVkVOVF9UWVBFCSgxPDw3KQkvKiBSZXN0cmljdCB0byBldmVudCB0eXBlICovCisjZGVmaW5lIFNORFJWX1NFUV9SRU1PVkVfSUdOT1JFX09GRiAJKDE8PDgpCS8qIERvIG5vdCBmbHVzaCBvZmYgZXZlbnRzICovCisjZGVmaW5lIFNORFJWX1NFUV9SRU1PVkVfVEFHX01BVENIIAkoMTw8OSkJLyogUmVzdHJpY3QgdG8gZXZlbnRzIHdpdGggZ2l2ZW4gdGFnICovCisKK3N0cnVjdCBzbmRfc2VxX3JlbW92ZV9ldmVudHMgeworCXVuc2lnbmVkIGludCAgcmVtb3ZlX21vZGU7CS8qIEZsYWdzIHRoYXQgZGV0ZXJtaW5lIHdoYXQgZ2V0cyByZW1vdmVkICovCisKKwl1bmlvbiBzbmRfc2VxX3RpbWVzdGFtcCB0aW1lOworCisJdW5zaWduZWQgY2hhciBxdWV1ZTsJLyogUXVldWUgZm9yIFJFTU9WRV9ERVNUICovCisJc3RydWN0IHNuZF9zZXFfYWRkciBkZXN0OwkvKiBBZGRyZXNzIGZvciBSRU1PVkVfREVTVCAqLworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbDsJLyogQ2hhbm5lbCBmb3IgUkVNT1ZFX0RFU1QgKi8KKworCWludCAgdHlwZTsJLyogRm9yIFJFTU9WRV9FVkVOVF9UWVBFICovCisJY2hhciAgdGFnOwkvKiBUYWcgZm9yIFJFTU9WRV9UQUcgKi8KKworCWludCAgcmVzZXJ2ZWRbMTBdOwkvKiBUbyBhbGxvdyBmb3IgZnV0dXJlIGJpbmFyeSBjb21wYXRpYmlsaXR5ICovCisKK307CisKKworCS8qIGtub3duIHBvcnQgbnVtYmVycyAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9TWVNURU1fVElNRVIJMAorI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9TWVNURU1fQU5OT1VOQ0UJMQorCisJLyogcG9ydCBjYXBhYmlsaXRpZXMgKDMyIGJpdHMpICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX0NBUF9SRUFECQkoMTw8MCkJLyogcmVhZGFibGUgZnJvbSB0aGlzIHBvcnQgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfQ0FQX1dSSVRFCSgxPDwxKQkvKiB3cml0YWJsZSB0byB0aGlzIHBvcnQgKi8KKworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9DQVBfU1lOQ19SRUFECSgxPDwyKQorI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9DQVBfU1lOQ19XUklURQkoMTw8MykKKworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9DQVBfRFVQTEVYCSgxPDw0KQorCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX0NBUF9TVUJTX1JFQUQJKDE8PDUpCS8qIGFsbG93IHJlYWQgc3Vic2NyaXB0aW9uICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX0NBUF9TVUJTX1dSSVRFCSgxPDw2KQkvKiBhbGxvdyB3cml0ZSBzdWJzY3JpcHRpb24gKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfQ0FQX05PX0VYUE9SVAkoMTw8NykJLyogcm91dGluZyBub3QgYWxsb3dlZCAqLworCisJLyogcG9ydCB0eXBlICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfU1BFQ0lGSUMJKDE8PDApCS8qIGhhcmR3YXJlIHNwZWNpZmljICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9HRU5FUklDICgxPDwxKQkvKiBnZW5lcmljIE1JREkgZGV2aWNlICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9HTQkoMTw8MikJLyogR2VuZXJhbCBNSURJIGNvbXBhdGlibGUgZGV2aWNlICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9HUwkoMTw8MykJLyogR1MgY29tcGF0aWJsZSBkZXZpY2UgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfVFlQRV9NSURJX1hHCSgxPDw0KQkvKiBYRyBjb21wYXRpYmxlIGRldmljZSAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfTVQzMgkoMTw8NSkJLyogTVQtMzIgY29tcGF0aWJsZSBkZXZpY2UgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfVFlQRV9NSURJX0dNMgkoMTw8NikJLyogR2VuZXJhbCBNSURJIDIgY29tcGF0aWJsZSBkZXZpY2UgKi8KKworLyogb3RoZXIgc3RhbmRhcmRzLi4uKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfVFlQRV9TWU5USAkoMTw8MTApCS8qIFN5bnRoIGRldmljZSAobm8gTUlESSBjb21wYXRpYmxlIC0gZGlyZWN0IHdhdmV0YWJsZSkgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfVFlQRV9ESVJFQ1RfU0FNUExFICgxPDwxMSkJLyogU2FtcGxpbmcgZGV2aWNlIChzdXBwb3J0IHNhbXBsZSBkb3dubG9hZCkgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfVFlQRV9TQU1QTEUJKDE8PDEyKQkvKiBTYW1wbGluZyBkZXZpY2UgKHNhbXBsZSBjYW4gYmUgZG93bmxvYWRlZCBhdCBhbnkgdGltZSkgKi8KKy8qLi4uKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfVFlQRV9IQVJEV0FSRQkoMTw8MTYpCS8qIGRyaXZlciBmb3IgYSBoYXJkd2FyZSBkZXZpY2UgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfVFlQRV9TT0ZUV0FSRQkoMTw8MTcpCS8qIGltcGxlbWVudGVkIGluIHNvZnR3YXJlICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfU1lOVEhFU0laRVIJKDE8PDE4KQkvKiBnZW5lcmF0ZXMgc291bmQgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfVFlQRV9QT1JUCSgxPDwxOSkJLyogY29ubmVjdHMgdG8gb3RoZXIgZGV2aWNlKHMpICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfQVBQTElDQVRJT04JKDE8PDIwKQkvKiBhcHBsaWNhdGlvbiAoc2VxdWVuY2VyL2VkaXRvcikgKi8KKworLyogbWlzYy4gY29uZGl0aW9uaW5nIGZsYWdzICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX0ZMR19HSVZFTl9QT1JUCSgxPDwwKQorI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9GTEdfVElNRVNUQU1QCSgxPDwxKQorI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9GTEdfVElNRV9SRUFMCSgxPDwyKQorCitzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8geworCXN0cnVjdCBzbmRfc2VxX2FkZHIgYWRkcjsJLyogY2xpZW50L3BvcnQgbnVtYmVycyAqLworCWNoYXIgbmFtZVs2NF07CQkJLyogcG9ydCBuYW1lICovCisKKwl1bnNpZ25lZCBpbnQgY2FwYWJpbGl0eTsJLyogcG9ydCBjYXBhYmlsaXR5IGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQgdHlwZTsJCS8qIHBvcnQgdHlwZSBiaXRzICovCisJaW50IG1pZGlfY2hhbm5lbHM7CQkvKiBjaGFubmVscyBwZXIgTUlESSBwb3J0ICovCisJaW50IG1pZGlfdm9pY2VzOwkJLyogdm9pY2VzIHBlciBNSURJIHBvcnQgKi8KKwlpbnQgc3ludGhfdm9pY2VzOwkJLyogdm9pY2VzIHBlciBTWU5USCBwb3J0ICovCisKKwlpbnQgcmVhZF91c2U7CQkJLyogUi9POiBzdWJzY3JpYmVycyBmb3Igb3V0cHV0IChmcm9tIHRoaXMgcG9ydCkgKi8KKwlpbnQgd3JpdGVfdXNlOwkJCS8qIFIvTzogc3Vic2NyaWJlcnMgZm9yIGlucHV0ICh0byB0aGlzIHBvcnQpICovCisKKwl2b2lkICprZXJuZWw7CQkJLyogcmVzZXJ2ZWQgZm9yIGtlcm5lbCB1c2UgKG11c3QgYmUgTlVMTCkgKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CQkvKiBtaXNjLiBjb25kaXRpb25pbmcgKi8KKwl1bnNpZ25lZCBjaGFyIHRpbWVfcXVldWU7CS8qIHF1ZXVlICMgZm9yIHRpbWVzdGFtcGluZyAqLworCWNoYXIgcmVzZXJ2ZWRbNTldOwkJLyogZm9yIGZ1dHVyZSB1c2UgKi8KK307CisKKworLyogcXVldWUgZmxhZ3MgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1FVRVVFX0ZMR19TWU5DCSgxPDwwKQkvKiBzeW5jIGVuYWJsZWQgKi8KKworLyogcXVldWUgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8geworCWludCBxdWV1ZTsJCS8qIHF1ZXVlIGlkICovCisKKwkvKgorCSAqICBzZWN1cml0eSBzZXR0aW5ncywgb25seSBvd25lciBvZiB0aGlzIHF1ZXVlIGNhbiBzdGFydC9zdG9wIHRpbWVyCisJICogIGV0Yy4gaWYgdGhlIHF1ZXVlIGlzIGxvY2tlZCBmb3Igb3RoZXIgY2xpZW50cworCSAqLworCWludCBvd25lcjsJCS8qIGNsaWVudCBpZCBmb3Igb3duZXIgb2YgdGhlIHF1ZXVlICovCisJdW5zaWduZWQgbG9ja2VkOjE7CS8qIHRpbWluZyBxdWV1ZSBsb2NrZWQgZm9yIG90aGVyIHF1ZXVlcyAqLworCWNoYXIgbmFtZVs2NF07CQkvKiBuYW1lIG9mIHRoaXMgcXVldWUgKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CS8qIGZsYWdzICovCisJY2hhciByZXNlcnZlZFs2MF07CS8qIGZvciBmdXR1cmUgdXNlICovCisKK307CisKKy8qIHF1ZXVlIGluZm8vc3RhdHVzICovCitzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9zdGF0dXMgeworCWludCBxdWV1ZTsJCQkvKiBxdWV1ZSBpZCAqLworCWludCBldmVudHM7CQkJLyogcmVhZC1vbmx5IC0gcXVldWUgc2l6ZSAqLworCXNuZF9zZXFfdGlja190aW1lX3QgdGljazsJLyogY3VycmVudCB0aWNrICovCisJc3RydWN0IHNuZF9zZXFfcmVhbF90aW1lIHRpbWU7CS8qIGN1cnJlbnQgdGltZSAqLworCWludCBydW5uaW5nOwkJCS8qIHJ1bm5pbmcgc3RhdGUgb2YgcXVldWUgKi8KKwlpbnQgZmxhZ3M7CQkJLyogdmFyaW91cyBmbGFncyAqLworCWNoYXIgcmVzZXJ2ZWRbNjRdOwkJLyogZm9yIHRoZSBmdXR1cmUgKi8KK307CisKKworLyogcXVldWUgdGVtcG8gKi8KK3N0cnVjdCBzbmRfc2VxX3F1ZXVlX3RlbXBvIHsKKwlpbnQgcXVldWU7CQkJLyogc2VxdWVuY2VyIHF1ZXVlICovCisJdW5zaWduZWQgaW50IHRlbXBvOwkJLyogY3VycmVudCB0ZW1wbywgdXMvdGljayAqLworCWludCBwcHE7CQkJLyogdGltZSByZXNvbHV0aW9uLCB0aWNrcy9xdWFydGVyICovCisJdW5zaWduZWQgaW50IHNrZXdfdmFsdWU7CS8qIHF1ZXVlIHNrZXcgKi8KKwl1bnNpZ25lZCBpbnQgc2tld19iYXNlOwkJLyogcXVldWUgc2tldyBiYXNlICovCisJY2hhciByZXNlcnZlZFsyNF07CQkvKiBmb3IgdGhlIGZ1dHVyZSAqLworfTsKKworCisvKiBzZXF1ZW5jZXIgdGltZXIgc291cmNlcyAqLworI2RlZmluZSBTTkRSVl9TRVFfVElNRVJfQUxTQQkJMAkvKiBBTFNBIHRpbWVyICovCisjZGVmaW5lIFNORFJWX1NFUV9USU1FUl9NSURJX0NMT0NLCTEJLyogTWlkaSBDbG9jayAoQ0xPQ0sgZXZlbnQpICovCisjZGVmaW5lIFNORFJWX1NFUV9USU1FUl9NSURJX1RJQ0sJMgkvKiBNaWRpIFRpbWVyIFRpY2sgKFRJQ0sgZXZlbnQpICovCisKKy8qIHF1ZXVlIHRpbWVyIGluZm8gKi8KK3N0cnVjdCBzbmRfc2VxX3F1ZXVlX3RpbWVyIHsKKwlpbnQgcXVldWU7CQkJLyogc2VxdWVuY2VyIHF1ZXVlICovCisJaW50IHR5cGU7CQkJLyogc291cmNlIHRpbWVyIHR5cGUgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3Qgc25kX3RpbWVyX2lkIGlkOwkvKiBBTFNBJ3MgdGltZXIgSUQgKi8KKwkJCXVuc2lnbmVkIGludCByZXNvbHV0aW9uOwkvKiByZXNvbHV0aW9uIGluIEh6ICovCisJCX0gYWxzYTsKKwl9IHU7CisJY2hhciByZXNlcnZlZFs2NF07CQkvKiBmb3IgdGhlIGZ1dHVyZSB1c2UgKi8KK307CisKKworc3RydWN0IHNuZF9zZXFfcXVldWVfY2xpZW50IHsKKwlpbnQgcXVldWU7CQkvKiBzZXF1ZW5jZXIgcXVldWUgKi8KKwlpbnQgY2xpZW50OwkJLyogc2VxdWVuY2VyIGNsaWVudCAqLworCWludCB1c2VkOwkJLyogcXVldWUgaXMgdXNlZCB3aXRoIHRoaXMgY2xpZW50CisJCQkJICAgKG11c3QgYmUgc2V0IGZvciBhY2NlcHRpbmcgZXZlbnRzKSAqLworCS8qIHBlciBjbGllbnQgd2F0ZXJtYXJrcyAqLworCWNoYXIgcmVzZXJ2ZWRbNjRdOwkvKiBmb3IgZnV0dXJlIHVzZSAqLworfTsKKworCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1NVQlNfRVhDTFVTSVZFCSgxPDwwKQkvKiBleGNsdXNpdmUgY29ubmVjdGlvbiAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9TVUJTX1RJTUVTVEFNUAkoMTw8MSkKKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfU1VCU19USU1FX1JFQUwJKDE8PDIpCisKK3N0cnVjdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlIHsKKwlzdHJ1Y3Qgc25kX3NlcV9hZGRyIHNlbmRlcjsJLyogc2VuZGVyIGFkZHJlc3MgKi8KKwlzdHJ1Y3Qgc25kX3NlcV9hZGRyIGRlc3Q7CS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgdm9pY2VzOwkJLyogbnVtYmVyIG9mIHZvaWNlcyB0byBiZSBhbGxvY2F0ZWQgKDAgPSBkb24ndCBjYXJlKSAqLworCXVuc2lnbmVkIGludCBmbGFnczsJCS8qIG1vZGVzICovCisJdW5zaWduZWQgY2hhciBxdWV1ZTsJCS8qIGlucHV0IHRpbWUtc3RhbXAgcXVldWUgKG9wdGlvbmFsKSAqLworCXVuc2lnbmVkIGNoYXIgcGFkWzNdOwkJLyogcmVzZXJ2ZWQgKi8KKwljaGFyIHJlc2VydmVkWzY0XTsKK307CisKKy8qIHR5cGUgb2YgcXVlcnkgc3Vic2NyaXB0aW9uICovCisjZGVmaW5lIFNORFJWX1NFUV9RVUVSWV9TVUJTX1JFQUQJMAorI2RlZmluZSBTTkRSVl9TRVFfUVVFUllfU1VCU19XUklURQkxCisKK3N0cnVjdCBzbmRfc2VxX3F1ZXJ5X3N1YnMgeworCXN0cnVjdCBzbmRfc2VxX2FkZHIgcm9vdDsJLyogY2xpZW50L3BvcnQgaWQgdG8gYmUgc2VhcmNoZWQgKi8KKwlpbnQgdHlwZTsJCS8qIFJFQUQgb3IgV1JJVEUgKi8KKwlpbnQgaW5kZXg7CQkvKiAwLi5OLTEgKi8KKwlpbnQgbnVtX3N1YnM7CQkvKiBSL086IG51bWJlciBvZiBzdWJzY3JpcHRpb25zIG9uIHRoaXMgcG9ydCAqLworCXN0cnVjdCBzbmRfc2VxX2FkZHIgYWRkcjsJLyogUi9POiByZXN1bHQgKi8KKwl1bnNpZ25lZCBjaGFyIHF1ZXVlOwkvKiBSL086IHJlc3VsdCAqLworCXVuc2lnbmVkIGludCBmbGFnczsJLyogUi9POiByZXN1bHQgKi8KKwljaGFyIHJlc2VydmVkWzY0XTsJLyogZm9yIGZ1dHVyZSB1c2UgKi8KK307CisKKworLyoKKyAqICBJT0NUTCBjb21tYW5kcworICovCisKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX1BWRVJTSU9OCV9JT1IgKCdTJywgMHgwMCwgaW50KQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfQ0xJRU5UX0lECV9JT1IgKCdTJywgMHgwMSwgaW50KQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfU1lTVEVNX0lORk8JX0lPV1IoJ1MnLCAweDAyLCBzdHJ1Y3Qgc25kX3NlcV9zeXN0ZW1faW5mbykKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX1JVTk5JTkdfTU9ERQlfSU9XUignUycsIDB4MDMsIHN0cnVjdCBzbmRfc2VxX3J1bm5pbmdfaW5mbykKKworI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfR0VUX0NMSUVOVF9JTkZPCV9JT1dSKCdTJywgMHgxMCwgc3RydWN0IHNuZF9zZXFfY2xpZW50X2luZm8pCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9TRVRfQ0xJRU5UX0lORk8JX0lPVyAoJ1MnLCAweDExLCBzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfaW5mbykKKworI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfQ1JFQVRFX1BPUlQJX0lPV1IoJ1MnLCAweDIwLCBzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8pCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9ERUxFVEVfUE9SVAlfSU9XICgnUycsIDB4MjEsIHN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbykKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX0dFVF9QT1JUX0lORk8JX0lPV1IoJ1MnLCAweDIyLCBzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8pCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9TRVRfUE9SVF9JTkZPCV9JT1cgKCdTJywgMHgyMywgc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvKQorCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9TVUJTQ1JJQkVfUE9SVAlfSU9XICgnUycsIDB4MzAsIHN0cnVjdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfVU5TVUJTQ1JJQkVfUE9SVCBfSU9XICgnUycsIDB4MzEsIHN0cnVjdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlKQorCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9DUkVBVEVfUVVFVUUJX0lPV1IoJ1MnLCAweDMyLCBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfREVMRVRFX1FVRVVFCV9JT1cgKCdTJywgMHgzMywgc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbykKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX0dFVF9RVUVVRV9JTkZPCV9JT1dSKCdTJywgMHgzNCwgc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbykKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX1NFVF9RVUVVRV9JTkZPCV9JT1dSKCdTJywgMHgzNSwgc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbykKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX0dFVF9OQU1FRF9RVUVVRQlfSU9XUignUycsIDB4MzYsIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8pCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9HRVRfUVVFVUVfU1RBVFVTIF9JT1dSKCdTJywgMHg0MCwgc3RydWN0IHNuZF9zZXFfcXVldWVfc3RhdHVzKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfR0VUX1FVRVVFX1RFTVBPCV9JT1dSKCdTJywgMHg0MSwgc3RydWN0IHNuZF9zZXFfcXVldWVfdGVtcG8pCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9TRVRfUVVFVUVfVEVNUE8JX0lPVyAoJ1MnLCAweDQyLCBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90ZW1wbykKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX0dFVF9RVUVVRV9PV05FUglfSU9XUignUycsIDB4NDMsIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX293bmVyKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfU0VUX1FVRVVFX09XTkVSCV9JT1cgKCdTJywgMHg0NCwgc3RydWN0IHNuZF9zZXFfcXVldWVfb3duZXIpCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9HRVRfUVVFVUVfVElNRVIJX0lPV1IoJ1MnLCAweDQ1LCBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90aW1lcikKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX1NFVF9RVUVVRV9USU1FUglfSU9XICgnUycsIDB4NDYsIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX3RpbWVyKQorLyogWFhYCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9HRVRfUVVFVUVfU1lOQwlfSU9XUignUycsIDB4NTMsIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX3N5bmMpCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9TRVRfUVVFVUVfU1lOQwlfSU9XICgnUycsIDB4NTQsIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX3N5bmMpCisqLworI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfR0VUX1FVRVVFX0NMSUVOVAlfSU9XUignUycsIDB4NDksIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX2NsaWVudCkKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX1NFVF9RVUVVRV9DTElFTlQJX0lPVyAoJ1MnLCAweDRhLCBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9jbGllbnQpCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9HRVRfQ0xJRU5UX1BPT0wJX0lPV1IoJ1MnLCAweDRiLCBzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9vbCkKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX1NFVF9DTElFTlRfUE9PTAlfSU9XICgnUycsIDB4NGMsIHN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb29sKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfUkVNT1ZFX0VWRU5UUwlfSU9XICgnUycsIDB4NGUsIHN0cnVjdCBzbmRfc2VxX3JlbW92ZV9ldmVudHMpCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9RVUVSWV9TVUJTCV9JT1dSKCdTJywgMHg0Ziwgc3RydWN0IHNuZF9zZXFfcXVlcnlfc3VicykKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX0dFVF9TVUJTQ1JJUFRJT04JX0lPV1IoJ1MnLCAweDUwLCBzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZSkKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX1FVRVJZX05FWFRfQ0xJRU5UCV9JT1dSKCdTJywgMHg1MSwgc3RydWN0IHNuZF9zZXFfY2xpZW50X2luZm8pCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9RVUVSWV9ORVhUX1BPUlQJX0lPV1IoJ1MnLCAweDUyLCBzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8pCisKKyNlbmRpZiAvKiBfX1NPVU5EX0FTRVFVRU5DRVJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9hc291bmQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvYXNvdW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkOTNhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvYXNvdW5kLmgKQEAgLTAsMCArMSw5MDQgQEAKKy8qCisgKiAgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlIC0gQUxTQSAtIERyaXZlcgorICogIENvcHlyaWdodCAoYykgMTk5NC0yMDAzIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fU09VTkRfQVNPVU5EX0gKKyNkZWZpbmUgX19TT1VORF9BU09VTkRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisvKgorICogIHByb3RvY29sIHZlcnNpb24KKyAqLworCisjZGVmaW5lIFNORFJWX1BST1RPQ09MX1ZFUlNJT04obWFqb3IsIG1pbm9yLCBzdWJtaW5vcikgKCgobWFqb3IpPDwxNil8KChtaW5vcik8PDgpfChzdWJtaW5vcikpCisjZGVmaW5lIFNORFJWX1BST1RPQ09MX01BSk9SKHZlcnNpb24pICgoKHZlcnNpb24pPj4xNikmMHhmZmZmKQorI2RlZmluZSBTTkRSVl9QUk9UT0NPTF9NSU5PUih2ZXJzaW9uKSAoKCh2ZXJzaW9uKT4+OCkmMHhmZikKKyNkZWZpbmUgU05EUlZfUFJPVE9DT0xfTUlDUk8odmVyc2lvbikgKCh2ZXJzaW9uKSYweGZmKQorI2RlZmluZSBTTkRSVl9QUk9UT0NPTF9JTkNPTVBBVElCTEUoa3ZlcnNpb24sIHV2ZXJzaW9uKSBcCisJKFNORFJWX1BST1RPQ09MX01BSk9SKGt2ZXJzaW9uKSAhPSBTTkRSVl9QUk9UT0NPTF9NQUpPUih1dmVyc2lvbikgfHwgXAorCSAoU05EUlZfUFJPVE9DT0xfTUFKT1Ioa3ZlcnNpb24pID09IFNORFJWX1BST1RPQ09MX01BSk9SKHV2ZXJzaW9uKSAmJiBcCisJICAgU05EUlZfUFJPVE9DT0xfTUlOT1Ioa3ZlcnNpb24pICE9IFNORFJWX1BST1RPQ09MX01JTk9SKHV2ZXJzaW9uKSkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgIERpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlCQkJCQkgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgc25kX2Flc19pZWM5NTggeworCXVuc2lnbmVkIGNoYXIgc3RhdHVzWzI0XTsJLyogQUVTL0lFQzk1OCBjaGFubmVsIHN0YXR1cyBiaXRzICovCisJdW5zaWduZWQgY2hhciBzdWJjb2RlWzE0N107CS8qIEFFUy9JRUM5NTggc3ViY29kZSBiaXRzICovCisJdW5zaWduZWQgY2hhciBwYWQ7CQkvKiBub3RoaW5nICovCisJdW5zaWduZWQgY2hhciBkaWdfc3ViZnJhbWVbNF07CS8qIEFFUy9JRUM5NTggc3ViZnJhbWUgYml0cyAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgIFNlY3Rpb24gZm9yIGRyaXZlciBoYXJkd2FyZSBkZXBlbmRlbnQgaW50ZXJmYWNlIC0gL2Rldi9zbmQvaHc/ICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNORFJWX0hXREVQX1ZFUlNJT04JCVNORFJWX1BST1RPQ09MX1ZFUlNJT04oMSwgMCwgMSkKKworZW51bSB7CisJU05EUlZfSFdERVBfSUZBQ0VfT1BMMiA9IDAsCisJU05EUlZfSFdERVBfSUZBQ0VfT1BMMywKKwlTTkRSVl9IV0RFUF9JRkFDRV9PUEw0LAorCVNORFJWX0hXREVQX0lGQUNFX1NCMTZDU1AsCS8qIENyZWF0aXZlIFNpZ25hbCBQcm9jZXNzb3IgKi8KKwlTTkRSVl9IV0RFUF9JRkFDRV9FTVUxMEsxLAkvKiBGWDgwMTAgcHJvY2Vzc29yIGluIEVNVTEwSzEgY2hpcCAqLworCVNORFJWX0hXREVQX0lGQUNFX1lTUzIyNSwJLyogWWFtYWhhIEZYIHByb2Nlc3NvciAqLworCVNORFJWX0hXREVQX0lGQUNFX0lDUzIxMTUsCS8qIFdhdmV0YWJsZSBzeW50aCAqLworCVNORFJWX0hXREVQX0lGQUNFX1NTQ0FQRSwJLyogRW5zb25pcSBTb3VuZFNjYXBlIElTQSBjYXJkIChNQzY4RUMwMDApICovCisJU05EUlZfSFdERVBfSUZBQ0VfVlgsCQkvKiBEaWdpZ3JhbSBWWCBjYXJkcyAqLworCVNORFJWX0hXREVQX0lGQUNFX01JWEFSVCwJLyogRGlnaWdyYW0gbWlYYXJ0IGNhcmRzICovCisJU05EUlZfSFdERVBfSUZBQ0VfVVNYMlksCS8qIFRhc2NhbSBVUzEyMiwgVVMyMjQgJiBVUzQyOCB1c2IgKi8KKwlTTkRSVl9IV0RFUF9JRkFDRV9FTVVYX1dBVkVUQUJMRSwgLyogRW11WCB3YXZldGFibGUgKi8JCisJU05EUlZfSFdERVBfSUZBQ0VfQkxVRVRPT1RILAkvKiBCbHVldG9vdGggYXVkaW8gKi8KKwlTTkRSVl9IV0RFUF9JRkFDRV9VU1gyWV9QQ00sCS8qIFRhc2NhbSBVUzEyMiwgVVMyMjQgJiBVUzQyOCByYXd1c2IgcGNtICovCisJU05EUlZfSFdERVBfSUZBQ0VfUENYSFIsCS8qIERpZ2lncmFtIFBDWEhSICovCisJU05EUlZfSFdERVBfSUZBQ0VfU0JfUkMsCS8qIFNCIEV4dGlneS9BdWRpZ3kyTlggcmVtb3RlIGNvbnRyb2wgKi8KKwlTTkRSVl9IV0RFUF9JRkFDRV9IREEsCQkvKiBIRC1hdWRpbyAqLworCVNORFJWX0hXREVQX0lGQUNFX1VTQl9TVFJFQU0sCS8qIGRpcmVjdCBhY2Nlc3MgdG8gdXNiIHN0cmVhbSAqLworCisJLyogRG9uJ3QgZm9yZ2V0IHRvIGNoYW5nZSB0aGUgZm9sbG93aW5nOiAqLworCVNORFJWX0hXREVQX0lGQUNFX0xBU1QgPSBTTkRSVl9IV0RFUF9JRkFDRV9VU0JfU1RSRUFNCit9OworCitzdHJ1Y3Qgc25kX2h3ZGVwX2luZm8geworCXVuc2lnbmVkIGludCBkZXZpY2U7CQkvKiBXUjogZGV2aWNlIG51bWJlciAqLworCWludCBjYXJkOwkJCS8qIFI6IGNhcmQgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciBpZFs2NF07CQkvKiBJRCAodXNlciBzZWxlY3RhYmxlKSAqLworCXVuc2lnbmVkIGNoYXIgbmFtZVs4MF07CQkvKiBod2RlcCBuYW1lICovCisJaW50IGlmYWNlOwkJCS8qIGh3ZGVwIGludGVyZmFjZSAqLworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbNjRdOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlICovCit9OworCisvKiBnZW5lcmljIERTUCBsb2FkZXIgKi8KK3N0cnVjdCBzbmRfaHdkZXBfZHNwX3N0YXR1cyB7CisJdW5zaWduZWQgaW50IHZlcnNpb247CQkvKiBSOiBkcml2ZXItc3BlY2lmaWMgdmVyc2lvbiAqLworCXVuc2lnbmVkIGNoYXIgaWRbMzJdOwkJLyogUjogZHJpdmVyLXNwZWNpZmljIElEIHN0cmluZyAqLworCXVuc2lnbmVkIGludCBudW1fZHNwczsJCS8qIFI6IG51bWJlciBvZiBEU1AgaW1hZ2VzIHRvIHRyYW5zZmVyICovCisJdW5zaWduZWQgaW50IGRzcF9sb2FkZWQ7CS8qIFI6IGJpdCBmbGFncyBpbmRpY2F0aW5nIHRoZSBsb2FkZWQgRFNQcyAqLworCXVuc2lnbmVkIGludCBjaGlwX3JlYWR5OwkvKiBSOiAxID0gaW5pdGlhbGl6YXRpb24gZmluaXNoZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzE2XTsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KK307CisKK3N0cnVjdCBzbmRfaHdkZXBfZHNwX2ltYWdlIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CQkvKiBXOiBEU1AgaW5kZXggKi8KKwl1bnNpZ25lZCBjaGFyIG5hbWVbNjRdOwkJLyogVzogSUQgKGUuZy4gZmlsZSBuYW1lKSAqLworCXVuc2lnbmVkIGNoYXIgKmltYWdlOwkvKiBXOiBiaW5hcnkgaW1hZ2UgKi8KKwlzaXplX3QgbGVuZ3RoOwkJCS8qIFc6IHNpemUgb2YgaW1hZ2UgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIGRyaXZlcl9kYXRhOwkvKiBXOiBkcml2ZXItc3BlY2lmaWMgZGF0YSAqLworfTsKKworI2RlZmluZSBTTkRSVl9IV0RFUF9JT0NUTF9QVkVSU0lPTglfSU9SICgnSCcsIDB4MDAsIGludCkKKyNkZWZpbmUgU05EUlZfSFdERVBfSU9DVExfSU5GTwkJX0lPUiAoJ0gnLCAweDAxLCBzdHJ1Y3Qgc25kX2h3ZGVwX2luZm8pCisjZGVmaW5lIFNORFJWX0hXREVQX0lPQ1RMX0RTUF9TVEFUVVMJX0lPUignSCcsIDB4MDIsIHN0cnVjdCBzbmRfaHdkZXBfZHNwX3N0YXR1cykKKyNkZWZpbmUgU05EUlZfSFdERVBfSU9DVExfRFNQX0xPQUQJX0lPVygnSCcsIDB4MDMsIHN0cnVjdCBzbmRfaHdkZXBfZHNwX2ltYWdlKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgRGlnaXRhbCBBdWRpbyAoUENNKSBpbnRlcmZhY2UgLSAvZGV2L3NuZC9wY20/PyAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTTkRSVl9QQ01fVkVSU0lPTgkJU05EUlZfUFJPVE9DT0xfVkVSU0lPTigyLCAwLCAxMCkKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHNuZF9wY21fdWZyYW1lc190OwordHlwZWRlZiBzaWduZWQgbG9uZyBzbmRfcGNtX3NmcmFtZXNfdDsKKworZW51bSB7CisJU05EUlZfUENNX0NMQVNTX0dFTkVSSUMgPSAwLAkvKiBzdGFuZGFyZCBtb25vIG9yIHN0ZXJlbyBkZXZpY2UgKi8KKwlTTkRSVl9QQ01fQ0xBU1NfTVVMVEksCQkvKiBtdWx0aWNoYW5uZWwgZGV2aWNlICovCisJU05EUlZfUENNX0NMQVNTX01PREVNLAkJLyogc29mdHdhcmUgbW9kZW0gY2xhc3MgKi8KKwlTTkRSVl9QQ01fQ0xBU1NfRElHSVRJWkVSLAkvKiBkaWdpdGl6ZXIgY2xhc3MgKi8KKwkvKiBEb24ndCBmb3JnZXQgdG8gY2hhbmdlIHRoZSBmb2xsb3dpbmc6ICovCisJU05EUlZfUENNX0NMQVNTX0xBU1QgPSBTTkRSVl9QQ01fQ0xBU1NfRElHSVRJWkVSLAorfTsKKworZW51bSB7CisJU05EUlZfUENNX1NVQkNMQVNTX0dFTkVSSUNfTUlYID0gMCwgLyogbW9ubyBvciBzdGVyZW8gc3ViZGV2aWNlcyBhcmUgbWl4ZWQgdG9nZXRoZXIgKi8KKwlTTkRSVl9QQ01fU1VCQ0xBU1NfTVVMVElfTUlYLAkvKiBtdWx0aWNoYW5uZWwgc3ViZGV2aWNlcyBhcmUgbWl4ZWQgdG9nZXRoZXIgKi8KKwkvKiBEb24ndCBmb3JnZXQgdG8gY2hhbmdlIHRoZSBmb2xsb3dpbmc6ICovCisJU05EUlZfUENNX1NVQkNMQVNTX0xBU1QgPSBTTkRSVl9QQ01fU1VCQ0xBU1NfTVVMVElfTUlYLAorfTsKKworZW51bSB7CisJU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA9IDAsCisJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLAorCVNORFJWX1BDTV9TVFJFQU1fTEFTVCA9IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwKK307CisKK3R5cGVkZWYgaW50IF9fYml0d2lzZSBzbmRfcGNtX2FjY2Vzc190OworI2RlZmluZQlTTkRSVl9QQ01fQUNDRVNTX01NQVBfSU5URVJMRUFWRUQJKChzbmRfcGNtX2FjY2Vzc190KSAwKSAvKiBpbnRlcmxlYXZlZCBtbWFwICovCisjZGVmaW5lCVNORFJWX1BDTV9BQ0NFU1NfTU1BUF9OT05JTlRFUkxFQVZFRAkoKHNuZF9wY21fYWNjZXNzX3QpIDEpIC8qIG5vbmludGVybGVhdmVkIG1tYXAgKi8KKyNkZWZpbmUJU05EUlZfUENNX0FDQ0VTU19NTUFQX0NPTVBMRVgJCSgoc25kX3BjbV9hY2Nlc3NfdCkgMikgLyogY29tcGxleCBtbWFwICovCisjZGVmaW5lCVNORFJWX1BDTV9BQ0NFU1NfUldfSU5URVJMRUFWRUQJCSgoc25kX3BjbV9hY2Nlc3NfdCkgMykgLyogcmVhZGkvd3JpdGVpICovCisjZGVmaW5lCVNORFJWX1BDTV9BQ0NFU1NfUldfTk9OSU5URVJMRUFWRUQJKChzbmRfcGNtX2FjY2Vzc190KSA0KSAvKiByZWFkbi93cml0ZW4gKi8KKyNkZWZpbmUJU05EUlZfUENNX0FDQ0VTU19MQVNUCQlTTkRSVl9QQ01fQUNDRVNTX1JXX05PTklOVEVSTEVBVkVECisKK3R5cGVkZWYgaW50IF9fYml0d2lzZSBzbmRfcGNtX2Zvcm1hdF90OworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1M4CSgoc25kX3BjbV9mb3JtYXRfdCkgMCkKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VOAkoKHNuZF9wY21fZm9ybWF0X3QpIDEpCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzE2X0xFCSgoc25kX3BjbV9mb3JtYXRfdCkgMikKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TMTZfQkUJKChzbmRfcGNtX2Zvcm1hdF90KSAzKQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1UxNl9MRQkoKHNuZF9wY21fZm9ybWF0X3QpIDQpCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTE2X0JFCSgoc25kX3BjbV9mb3JtYXRfdCkgNSkKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUJKChzbmRfcGNtX2Zvcm1hdF90KSA2KSAvKiBsb3cgdGhyZWUgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TMjRfQkUJKChzbmRfcGNtX2Zvcm1hdF90KSA3KSAvKiBsb3cgdGhyZWUgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VMjRfTEUJKChzbmRfcGNtX2Zvcm1hdF90KSA4KSAvKiBsb3cgdGhyZWUgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VMjRfQkUJKChzbmRfcGNtX2Zvcm1hdF90KSA5KSAvKiBsb3cgdGhyZWUgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TMzJfTEUJKChzbmRfcGNtX2Zvcm1hdF90KSAxMCkKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TMzJfQkUJKChzbmRfcGNtX2Zvcm1hdF90KSAxMSkKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VMzJfTEUJKChzbmRfcGNtX2Zvcm1hdF90KSAxMikKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VMzJfQkUJKChzbmRfcGNtX2Zvcm1hdF90KSAxMykKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9GTE9BVF9MRQkoKHNuZF9wY21fZm9ybWF0X3QpIDE0KSAvKiA0LWJ5dGUgZmxvYXQsIElFRUUtNzU0IDMyLWJpdCwgcmFuZ2UgLTEuMCB0byAxLjAgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9GTE9BVF9CRQkoKHNuZF9wY21fZm9ybWF0X3QpIDE1KSAvKiA0LWJ5dGUgZmxvYXQsIElFRUUtNzU0IDMyLWJpdCwgcmFuZ2UgLTEuMCB0byAxLjAgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9GTE9BVDY0X0xFCSgoc25kX3BjbV9mb3JtYXRfdCkgMTYpIC8qIDgtYnl0ZSBmbG9hdCwgSUVFRS03NTQgNjQtYml0LCByYW5nZSAtMS4wIHRvIDEuMCAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX0ZMT0FUNjRfQkUJKChzbmRfcGNtX2Zvcm1hdF90KSAxNykgLyogOC1ieXRlIGZsb2F0LCBJRUVFLTc1NCA2NC1iaXQsIHJhbmdlIC0xLjAgdG8gMS4wICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfSUVDOTU4X1NVQkZSQU1FX0xFICgoc25kX3BjbV9mb3JtYXRfdCkgMTgpIC8qIElFQy05NTggc3ViZnJhbWUsIExpdHRsZSBFbmRpYW4gKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9JRUM5NThfU1VCRlJBTUVfQkUgKChzbmRfcGNtX2Zvcm1hdF90KSAxOSkgLyogSUVDLTk1OCBzdWJmcmFtZSwgQmlnIEVuZGlhbiAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX01VX0xBVwkJKChzbmRfcGNtX2Zvcm1hdF90KSAyMCkKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9BX0xBVwkJKChzbmRfcGNtX2Zvcm1hdF90KSAyMSkKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9JTUFfQURQQ00JKChzbmRfcGNtX2Zvcm1hdF90KSAyMikKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9NUEVHCQkoKHNuZF9wY21fZm9ybWF0X3QpIDIzKQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX0dTTQkJKChzbmRfcGNtX2Zvcm1hdF90KSAyNCkKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TUEVDSUFMCSgoc25kX3BjbV9mb3JtYXRfdCkgMzEpCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRQkoKHNuZF9wY21fZm9ybWF0X3QpIDMyKQkvKiBpbiB0aHJlZSBieXRlcyAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1MyNF8zQkUJKChzbmRfcGNtX2Zvcm1hdF90KSAzMykJLyogaW4gdGhyZWUgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VMjRfM0xFCSgoc25kX3BjbV9mb3JtYXRfdCkgMzQpCS8qIGluIHRocmVlIGJ5dGVzICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTI0XzNCRQkoKHNuZF9wY21fZm9ybWF0X3QpIDM1KQkvKiBpbiB0aHJlZSBieXRlcyAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1MyMF8zTEUJKChzbmRfcGNtX2Zvcm1hdF90KSAzNikJLyogaW4gdGhyZWUgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TMjBfM0JFCSgoc25kX3BjbV9mb3JtYXRfdCkgMzcpCS8qIGluIHRocmVlIGJ5dGVzICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTIwXzNMRQkoKHNuZF9wY21fZm9ybWF0X3QpIDM4KQkvKiBpbiB0aHJlZSBieXRlcyAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1UyMF8zQkUJKChzbmRfcGNtX2Zvcm1hdF90KSAzOSkJLyogaW4gdGhyZWUgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TMThfM0xFCSgoc25kX3BjbV9mb3JtYXRfdCkgNDApCS8qIGluIHRocmVlIGJ5dGVzICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzE4XzNCRQkoKHNuZF9wY21fZm9ybWF0X3QpIDQxKQkvKiBpbiB0aHJlZSBieXRlcyAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1UxOF8zTEUJKChzbmRfcGNtX2Zvcm1hdF90KSA0MikJLyogaW4gdGhyZWUgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VMThfM0JFCSgoc25kX3BjbV9mb3JtYXRfdCkgNDMpCS8qIGluIHRocmVlIGJ5dGVzICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfRzcyM18yNAkoKHNuZF9wY21fZm9ybWF0X3QpIDQ0KSAvKiA4IHNhbXBsZXMgaW4gMyBieXRlcyAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX0c3MjNfMjRfMUIJKChzbmRfcGNtX2Zvcm1hdF90KSA0NSkgLyogMSBzYW1wbGUgaW4gMSBieXRlICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfRzcyM180MAkoKHNuZF9wY21fZm9ybWF0X3QpIDQ2KSAvKiA4IFNhbXBsZXMgaW4gNSBieXRlcyAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX0c3MjNfNDBfMUIJKChzbmRfcGNtX2Zvcm1hdF90KSA0NykgLyogMSBzYW1wbGUgaW4gMSBieXRlICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfTEFTVAkJU05EUlZfUENNX0ZPUk1BVF9HNzIzXzQwXzFCCisKKyNpZmRlZiBTTkRSVl9MSVRUTEVfRU5ESUFOCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzE2CQlTTkRSVl9QQ01fRk9STUFUX1MxNl9MRQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1UxNgkJU05EUlZfUENNX0ZPUk1BVF9VMTZfTEUKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TMjQJCVNORFJWX1BDTV9GT1JNQVRfUzI0X0xFCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTI0CQlTTkRSVl9QQ01fRk9STUFUX1UyNF9MRQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1MzMgkJU05EUlZfUENNX0ZPUk1BVF9TMzJfTEUKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VMzIJCVNORFJWX1BDTV9GT1JNQVRfVTMyX0xFCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfRkxPQVQJCVNORFJWX1BDTV9GT1JNQVRfRkxPQVRfTEUKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9GTE9BVDY0CVNORFJWX1BDTV9GT1JNQVRfRkxPQVQ2NF9MRQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX0lFQzk1OF9TVUJGUkFNRSBTTkRSVl9QQ01fRk9STUFUX0lFQzk1OF9TVUJGUkFNRV9MRQorI2VuZGlmCisjaWZkZWYgU05EUlZfQklHX0VORElBTgorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1MxNgkJU05EUlZfUENNX0ZPUk1BVF9TMTZfQkUKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VMTYJCVNORFJWX1BDTV9GT1JNQVRfVTE2X0JFCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzI0CQlTTkRSVl9QQ01fRk9STUFUX1MyNF9CRQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1UyNAkJU05EUlZfUENNX0ZPUk1BVF9VMjRfQkUKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TMzIJCVNORFJWX1BDTV9GT1JNQVRfUzMyX0JFCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTMyCQlTTkRSVl9QQ01fRk9STUFUX1UzMl9CRQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX0ZMT0FUCQlTTkRSVl9QQ01fRk9STUFUX0ZMT0FUX0JFCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfRkxPQVQ2NAlTTkRSVl9QQ01fRk9STUFUX0ZMT0FUNjRfQkUKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9JRUM5NThfU1VCRlJBTUUgU05EUlZfUENNX0ZPUk1BVF9JRUM5NThfU1VCRlJBTUVfQkUKKyNlbmRpZgorCit0eXBlZGVmIGludCBfX2JpdHdpc2Ugc25kX3BjbV9zdWJmb3JtYXRfdDsKKyNkZWZpbmUJU05EUlZfUENNX1NVQkZPUk1BVF9TVEQJCSgoc25kX3BjbV9zdWJmb3JtYXRfdCkgMCkKKyNkZWZpbmUJU05EUlZfUENNX1NVQkZPUk1BVF9MQVNUCVNORFJWX1BDTV9TVUJGT1JNQVRfU1RECisKKyNkZWZpbmUgU05EUlZfUENNX0lORk9fTU1BUAkJMHgwMDAwMDAwMQkvKiBoYXJkd2FyZSBzdXBwb3J0cyBtbWFwICovCisjZGVmaW5lIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQJMHgwMDAwMDAwMgkvKiBwZXJpb2QgZGF0YSBhcmUgdmFsaWQgZHVyaW5nIHRyYW5zZmVyICovCisjZGVmaW5lIFNORFJWX1BDTV9JTkZPX0RPVUJMRQkJMHgwMDAwMDAwNAkvKiBEb3VibGUgYnVmZmVyaW5nIG5lZWRlZCBmb3IgUENNIHN0YXJ0L3N0b3AgKi8KKyNkZWZpbmUgU05EUlZfUENNX0lORk9fQkFUQ0gJCTB4MDAwMDAwMTAJLyogZG91YmxlIGJ1ZmZlcmluZyAqLworI2RlZmluZSBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRAkweDAwMDAwMTAwCS8qIGNoYW5uZWxzIGFyZSBpbnRlcmxlYXZlZCAqLworI2RlZmluZSBTTkRSVl9QQ01fSU5GT19OT05JTlRFUkxFQVZFRAkweDAwMDAwMjAwCS8qIGNoYW5uZWxzIGFyZSBub3QgaW50ZXJsZWF2ZWQgKi8KKyNkZWZpbmUgU05EUlZfUENNX0lORk9fQ09NUExFWAkJMHgwMDAwMDQwMAkvKiBjb21wbGV4IGZyYW1lIG9yZ2FuaXphdGlvbiAobW1hcCBvbmx5KSAqLworI2RlZmluZSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUgkweDAwMDEwMDAwCS8qIGhhcmR3YXJlIHRyYW5zZmVyIGJsb2NrIG9mIHNhbXBsZXMgKi8KKyNkZWZpbmUgU05EUlZfUENNX0lORk9fT1ZFUlJBTkdFCTB4MDAwMjAwMDAJLyogaGFyZHdhcmUgc3VwcG9ydHMgQURDIChjYXB0dXJlKSBvdmVycmFuZ2UgZGV0ZWN0aW9uICovCisjZGVmaW5lIFNORFJWX1BDTV9JTkZPX1JFU1VNRQkJMHgwMDA0MDAwMAkvKiBoYXJkd2FyZSBzdXBwb3J0cyBzdHJlYW0gcmVzdW1lIGFmdGVyIHN1c3BlbmQgKi8KKyNkZWZpbmUgU05EUlZfUENNX0lORk9fUEFVU0UJCTB4MDAwODAwMDAJLyogcGF1c2UgaW9jdGwgaXMgc3VwcG9ydGVkICovCisjZGVmaW5lIFNORFJWX1BDTV9JTkZPX0hBTEZfRFVQTEVYCTB4MDAxMDAwMDAJLyogb25seSBoYWxmIGR1cGxleCAqLworI2RlZmluZSBTTkRSVl9QQ01fSU5GT19KT0lOVF9EVVBMRVgJMHgwMDIwMDAwMAkvKiBwbGF5YmFjayBhbmQgY2FwdHVyZSBzdHJlYW0gYXJlIHNvbWV3aGF0IGNvcnJlbGF0ZWQgKi8KKyNkZWZpbmUgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVAkweDAwNDAwMDAwCS8qIHBjbSBzdXBwb3J0IHNvbWUga2luZCBvZiBzeW5jIGdvICovCisjZGVmaW5lIFNORFJWX1BDTV9JTkZPX05PX1BFUklPRF9XQUtFVVAJMHgwMDgwMDAwMAkvKiBwZXJpb2Qgd2FrZXVwIGNhbiBiZSBkaXNhYmxlZCAqLworI2RlZmluZSBTTkRSVl9QQ01fSU5GT19GSUZPX0lOX0ZSQU1FUwkweDgwMDAwMDAwCS8qIGludGVybmFsIGtlcm5lbCBmbGFnIC0gRklGTyBzaXplIGlzIGluIGZyYW1lcyAqLworCit0eXBlZGVmIGludCBfX2JpdHdpc2Ugc25kX3BjbV9zdGF0ZV90OworI2RlZmluZQlTTkRSVl9QQ01fU1RBVEVfT1BFTgkJKChzbmRfcGNtX3N0YXRlX3QpIDApIC8qIHN0cmVhbSBpcyBvcGVuICovCisjZGVmaW5lCVNORFJWX1BDTV9TVEFURV9TRVRVUAkJKChzbmRfcGNtX3N0YXRlX3QpIDEpIC8qIHN0cmVhbSBoYXMgYSBzZXR1cCAqLworI2RlZmluZQlTTkRSVl9QQ01fU1RBVEVfUFJFUEFSRUQJKChzbmRfcGNtX3N0YXRlX3QpIDIpIC8qIHN0cmVhbSBpcyByZWFkeSB0byBzdGFydCAqLworI2RlZmluZQlTTkRSVl9QQ01fU1RBVEVfUlVOTklORwkJKChzbmRfcGNtX3N0YXRlX3QpIDMpIC8qIHN0cmVhbSBpcyBydW5uaW5nICovCisjZGVmaW5lCVNORFJWX1BDTV9TVEFURV9YUlVOCQkoKHNuZF9wY21fc3RhdGVfdCkgNCkgLyogc3RyZWFtIHJlYWNoZWQgYW4geHJ1biAqLworI2RlZmluZQlTTkRSVl9QQ01fU1RBVEVfRFJBSU5JTkcJKChzbmRfcGNtX3N0YXRlX3QpIDUpIC8qIHN0cmVhbSBpcyBkcmFpbmluZyAqLworI2RlZmluZQlTTkRSVl9QQ01fU1RBVEVfUEFVU0VECQkoKHNuZF9wY21fc3RhdGVfdCkgNikgLyogc3RyZWFtIGlzIHBhdXNlZCAqLworI2RlZmluZQlTTkRSVl9QQ01fU1RBVEVfU1VTUEVOREVECSgoc25kX3BjbV9zdGF0ZV90KSA3KSAvKiBoYXJkd2FyZSBpcyBzdXNwZW5kZWQgKi8KKyNkZWZpbmUJU05EUlZfUENNX1NUQVRFX0RJU0NPTk5FQ1RFRAkoKHNuZF9wY21fc3RhdGVfdCkgOCkgLyogaGFyZHdhcmUgaXMgZGlzY29ubmVjdGVkICovCisjZGVmaW5lCVNORFJWX1BDTV9TVEFURV9MQVNUCQlTTkRSVl9QQ01fU1RBVEVfRElTQ09OTkVDVEVECisKK2VudW0geworCVNORFJWX1BDTV9NTUFQX09GRlNFVF9EQVRBID0gMHgwMDAwMDAwMCwKKwlTTkRSVl9QQ01fTU1BUF9PRkZTRVRfU1RBVFVTID0gMHg4MDAwMDAwMCwKKwlTTkRSVl9QQ01fTU1BUF9PRkZTRVRfQ09OVFJPTCA9IDB4ODEwMDAwMDAsCit9OworCit1bmlvbiBzbmRfcGNtX3N5bmNfaWQgeworCXVuc2lnbmVkIGNoYXIgaWRbMTZdOworCXVuc2lnbmVkIHNob3J0IGlkMTZbOF07CisJdW5zaWduZWQgaW50IGlkMzJbNF07Cit9OworCitzdHJ1Y3Qgc25kX3BjbV9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgZGV2aWNlOwkJLyogUk8vV1IgKGNvbnRyb2wpOiBkZXZpY2UgbnVtYmVyICovCisJdW5zaWduZWQgaW50IHN1YmRldmljZTsJCS8qIFJPL1dSIChjb250cm9sKTogc3ViZGV2aWNlIG51bWJlciAqLworCWludCBzdHJlYW07CQkJLyogUk8vV1IgKGNvbnRyb2wpOiBzdHJlYW0gZGlyZWN0aW9uICovCisJaW50IGNhcmQ7CQkJLyogUjogY2FyZCBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIGlkWzY0XTsJCS8qIElEICh1c2VyIHNlbGVjdGFibGUpICovCisJdW5zaWduZWQgY2hhciBuYW1lWzgwXTsJCS8qIG5hbWUgb2YgdGhpcyBkZXZpY2UgKi8KKwl1bnNpZ25lZCBjaGFyIHN1Ym5hbWVbMzJdOwkvKiBzdWJkZXZpY2UgbmFtZSAqLworCWludCBkZXZfY2xhc3M7CQkJLyogU05EUlZfUENNX0NMQVNTXyogKi8KKwlpbnQgZGV2X3N1YmNsYXNzOwkJLyogU05EUlZfUENNX1NVQkNMQVNTXyogKi8KKwl1bnNpZ25lZCBpbnQgc3ViZGV2aWNlc19jb3VudDsKKwl1bnNpZ25lZCBpbnQgc3ViZGV2aWNlc19hdmFpbDsKKwl1bmlvbiBzbmRfcGNtX3N5bmNfaWQgc3luYzsJLyogaGFyZHdhcmUgc3luY2hyb25pemF0aW9uIElEICovCisJdW5zaWduZWQgY2hhciByZXNlcnZlZFs2NF07CS8qIHJlc2VydmVkIGZvciBmdXR1cmUuLi4gKi8KK307CisKK3R5cGVkZWYgaW50IHNuZF9wY21faHdfcGFyYW1fdDsKKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX0FDQ0VTUwkwCS8qIEFjY2VzcyB0eXBlICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQJMQkvKiBGb3JtYXQgKi8KKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX1NVQkZPUk1BVAkyCS8qIFN1YmZvcm1hdCAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfTUFTSwlTTkRSVl9QQ01fSFdfUEFSQU1fQUNDRVNTCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9MQVNUX01BU0sJU05EUlZfUENNX0hXX1BBUkFNX1NVQkZPUk1BVAorCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9TQU1QTEVfQklUUwk4CS8qIEJpdHMgcGVyIHNhbXBsZSAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fRlJBTUVfQklUUwk5CS8qIEJpdHMgcGVyIGZyYW1lICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUwkxMAkvKiBDaGFubmVscyAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURQkJMTEJLyogQXBwcm94IHJhdGUgKi8KKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9USU1FCTEyCS8qIEFwcHJveCBkaXN0YW5jZSBiZXR3ZWVuCisJCQkJCQkgKiBpbnRlcnJ1cHRzIGluIHVzCisJCQkJCQkgKi8KKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFCTEzCS8qIEFwcHJveCBmcmFtZXMgYmV0d2VlbgorCQkJCQkJICogaW50ZXJydXB0cworCQkJCQkJICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMJMTQJLyogQXBwcm94IGJ5dGVzIGJldHdlZW4KKwkJCQkJCSAqIGludGVycnVwdHMKKwkJCQkJCSAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUwkxNQkvKiBBcHByb3ggaW50ZXJydXB0cyBwZXIKKwkJCQkJCSAqIGJ1ZmZlcgorCQkJCQkJICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfVElNRQkxNgkvKiBBcHByb3ggZHVyYXRpb24gb2YgYnVmZmVyCisJCQkJCQkgKiBpbiB1cworCQkJCQkJICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRQkxNwkvKiBTaXplIG9mIGJ1ZmZlciBpbiBmcmFtZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUwkxOAkvKiBTaXplIG9mIGJ1ZmZlciBpbiBieXRlcyAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fVElDS19USU1FCTE5CS8qIEFwcHJveCB0aWNrIGR1cmF0aW9uIGluIHVzICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9JTlRFUlZBTAlTTkRSVl9QQ01fSFdfUEFSQU1fU0FNUExFX0JJVFMKKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX0xBU1RfSU5URVJWQUwJU05EUlZfUENNX0hXX1BBUkFNX1RJQ0tfVElNRQorCisjZGVmaW5lIFNORFJWX1BDTV9IV19QQVJBTVNfTk9SRVNBTVBMRQkoMTw8MCkJLyogYXZvaWQgcmF0ZSByZXNhbXBsaW5nICovCisjZGVmaW5lIFNORFJWX1BDTV9IV19QQVJBTVNfRVhQT1JUX0JVRkZFUgkoMTw8MSkJLyogZXhwb3J0IGJ1ZmZlciAqLworI2RlZmluZSBTTkRSVl9QQ01fSFdfUEFSQU1TX05PX1BFUklPRF9XQUtFVVAJKDE8PDIpCS8qIGRpc2FibGUgcGVyaW9kIHdha2V1cHMgKi8KKworc3RydWN0IHNuZF9pbnRlcnZhbCB7CisJdW5zaWduZWQgaW50IG1pbiwgbWF4OworCXVuc2lnbmVkIGludCBvcGVubWluOjEsCisJCSAgICAgb3Blbm1heDoxLAorCQkgICAgIGludGVnZXI6MSwKKwkJICAgICBlbXB0eToxOworfTsKKworI2RlZmluZSBTTkRSVl9NQVNLX01BWAkyNTYKKworc3RydWN0IHNuZF9tYXNrIHsKKwlfX3UzMiBiaXRzWyhTTkRSVl9NQVNLX01BWCszMSkvMzJdOworfTsKKworc3RydWN0IHNuZF9wY21faHdfcGFyYW1zIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJc3RydWN0IHNuZF9tYXNrIG1hc2tzW1NORFJWX1BDTV9IV19QQVJBTV9MQVNUX01BU0sgLSAKKwkJCSAgICAgICBTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfTUFTSyArIDFdOworCXN0cnVjdCBzbmRfbWFzayBtcmVzWzVdOwkvKiByZXNlcnZlZCBtYXNrcyAqLworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgaW50ZXJ2YWxzW1NORFJWX1BDTV9IV19QQVJBTV9MQVNUX0lOVEVSVkFMIC0KKwkJCQkgICAgICAgIFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9JTlRFUlZBTCArIDFdOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgaXJlc1s5XTsJLyogcmVzZXJ2ZWQgaW50ZXJ2YWxzICovCisJdW5zaWduZWQgaW50IHJtYXNrOwkJLyogVzogcmVxdWVzdGVkIG1hc2tzICovCisJdW5zaWduZWQgaW50IGNtYXNrOwkJLyogUjogY2hhbmdlZCBtYXNrcyAqLworCXVuc2lnbmVkIGludCBpbmZvOwkJLyogUjogSW5mbyBmbGFncyBmb3IgcmV0dXJuZWQgc2V0dXAgKi8KKwl1bnNpZ25lZCBpbnQgbXNiaXRzOwkJLyogUjogdXNlZCBtb3N0IHNpZ25pZmljYW50IGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQgcmF0ZV9udW07CQkvKiBSOiByYXRlIG51bWVyYXRvciAqLworCXVuc2lnbmVkIGludCByYXRlX2RlbjsJCS8qIFI6IHJhdGUgZGVub21pbmF0b3IgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBmaWZvX3NpemU7CS8qIFI6IGNoaXAgRklGTyBzaXplIGluIGZyYW1lcyAqLworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbNjRdOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlICovCit9OworCitlbnVtIHsKKwlTTkRSVl9QQ01fVFNUQU1QX05PTkUgPSAwLAorCVNORFJWX1BDTV9UU1RBTVBfRU5BQkxFLAorCVNORFJWX1BDTV9UU1RBTVBfTEFTVCA9IFNORFJWX1BDTV9UU1RBTVBfRU5BQkxFLAorfTsKKworc3RydWN0IHNuZF9wY21fc3dfcGFyYW1zIHsKKwlpbnQgdHN0YW1wX21vZGU7CQkJLyogdGltZXN0YW1wIG1vZGUgKi8KKwl1bnNpZ25lZCBpbnQgcGVyaW9kX3N0ZXA7CisJdW5zaWduZWQgaW50IHNsZWVwX21pbjsJCQkvKiBtaW4gdGlja3MgdG8gc2xlZXAgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBhdmFpbF9taW47CQkvKiBtaW4gYXZhaWwgZnJhbWVzIGZvciB3YWtldXAgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCB4ZmVyX2FsaWduOwkJLyogb2Jzb2xldGU6IHhmZXIgc2l6ZSBuZWVkIHRvIGJlIGEgbXVsdGlwbGUgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBzdGFydF90aHJlc2hvbGQ7CS8qIG1pbiBod19hdmFpbCBmcmFtZXMgZm9yIGF1dG9tYXRpYyBzdGFydCAqLworCXNuZF9wY21fdWZyYW1lc190IHN0b3BfdGhyZXNob2xkOwkvKiBtaW4gYXZhaWwgZnJhbWVzIGZvciBhdXRvbWF0aWMgc3RvcCAqLworCXNuZF9wY21fdWZyYW1lc190IHNpbGVuY2VfdGhyZXNob2xkOwkvKiBtaW4gZGlzdGFuY2UgZnJvbSBub2lzZSBmb3Igc2lsZW5jZSBmaWxsaW5nICovCisJc25kX3BjbV91ZnJhbWVzX3Qgc2lsZW5jZV9zaXplOwkJLyogc2lsZW5jZSBibG9jayBzaXplICovCisJc25kX3BjbV91ZnJhbWVzX3QgYm91bmRhcnk7CQkvKiBwb2ludGVycyB3cmFwIHBvaW50ICovCisJdW5zaWduZWQgY2hhciByZXNlcnZlZFs2NF07CQkvKiByZXNlcnZlZCBmb3IgZnV0dXJlICovCit9OworCitzdHJ1Y3Qgc25kX3BjbV9jaGFubmVsX2luZm8geworCXVuc2lnbmVkIGludCBjaGFubmVsOworCV9fa2VybmVsX29mZl90IG9mZnNldDsJCS8qIG1tYXAgb2Zmc2V0ICovCisJdW5zaWduZWQgaW50IGZpcnN0OwkJLyogb2Zmc2V0IHRvIGZpcnN0IHNhbXBsZSBpbiBiaXRzICovCisJdW5zaWduZWQgaW50IHN0ZXA7CQkvKiBzYW1wbGVzIGRpc3RhbmNlIGluIGJpdHMgKi8KK307CisKK3N0cnVjdCBzbmRfcGNtX3N0YXR1cyB7CisJc25kX3BjbV9zdGF0ZV90IHN0YXRlOwkJLyogc3RyZWFtIHN0YXRlICovCisJc3RydWN0IHRpbWVzcGVjIHRyaWdnZXJfdHN0YW1wOwkvKiB0aW1lIHdoZW4gc3RyZWFtIHdhcyBzdGFydGVkL3N0b3BwZWQvcGF1c2VkICovCisJc3RydWN0IHRpbWVzcGVjIHRzdGFtcDsJCS8qIHJlZmVyZW5jZSB0aW1lc3RhbXAgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBhcHBsX3B0cjsJLyogYXBwbCBwdHIgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBod19wdHI7CS8qIGh3IHB0ciAqLworCXNuZF9wY21fc2ZyYW1lc190IGRlbGF5OwkvKiBjdXJyZW50IGRlbGF5IGluIGZyYW1lcyAqLworCXNuZF9wY21fdWZyYW1lc190IGF2YWlsOwkvKiBudW1iZXIgb2YgZnJhbWVzIGF2YWlsYWJsZSAqLworCXNuZF9wY21fdWZyYW1lc190IGF2YWlsX21heDsJLyogbWF4IGZyYW1lcyBhdmFpbGFibGUgb24gaHcgc2luY2UgbGFzdCBzdGF0dXMgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBvdmVycmFuZ2U7CS8qIGNvdW50IG9mIEFEQyAoY2FwdHVyZSkgb3ZlcnJhbmdlIGRldGVjdGlvbnMgZnJvbSBsYXN0IHN0YXR1cyAqLworCXNuZF9wY21fc3RhdGVfdCBzdXNwZW5kZWRfc3RhdGU7IC8qIHN1c3BlbmRlZCBzdHJlYW0gc3RhdGUgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzYwXTsJLyogbXVzdCBiZSBmaWxsZWQgd2l0aCB6ZXJvICovCit9OworCitzdHJ1Y3Qgc25kX3BjbV9tbWFwX3N0YXR1cyB7CisJc25kX3BjbV9zdGF0ZV90IHN0YXRlOwkJLyogUk86IHN0YXRlIC0gU05EUlZfUENNX1NUQVRFX1hYWFggKi8KKwlpbnQgcGFkMTsJCQkvKiBOZWVkZWQgZm9yIDY0IGJpdCBhbGlnbm1lbnQgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBod19wdHI7CS8qIFJPOiBodyBwdHIgKDAuLi5ib3VuZGFyeS0xKSAqLworCXN0cnVjdCB0aW1lc3BlYyB0c3RhbXA7CQkvKiBUaW1lc3RhbXAgKi8KKwlzbmRfcGNtX3N0YXRlX3Qgc3VzcGVuZGVkX3N0YXRlOyAvKiBSTzogc3VzcGVuZGVkIHN0cmVhbSBzdGF0ZSAqLworfTsKKworc3RydWN0IHNuZF9wY21fbW1hcF9jb250cm9sIHsKKwlzbmRfcGNtX3VmcmFtZXNfdCBhcHBsX3B0cjsJLyogUlc6IGFwcGwgcHRyICgwLi4uYm91bmRhcnktMSkgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBhdmFpbF9taW47CS8qIFJXOiBtaW4gYXZhaWxhYmxlIGZyYW1lcyBmb3Igd2FrZXVwICovCit9OworCisjZGVmaW5lIFNORFJWX1BDTV9TWU5DX1BUUl9IV1NZTkMJKDE8PDApCS8qIGV4ZWN1dGUgaHdzeW5jICovCisjZGVmaW5lIFNORFJWX1BDTV9TWU5DX1BUUl9BUFBMCQkoMTw8MSkJLyogZ2V0IGFwcGxfcHRyIGZyb20gZHJpdmVyIChyL3cgb3ApICovCisjZGVmaW5lIFNORFJWX1BDTV9TWU5DX1BUUl9BVkFJTF9NSU4JKDE8PDIpCS8qIGdldCBhdmFpbF9taW4gZnJvbSBkcml2ZXIgKi8KKworc3RydWN0IHNuZF9wY21fc3luY19wdHIgeworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCBzbmRfcGNtX21tYXBfc3RhdHVzIHN0YXR1czsKKwkJdW5zaWduZWQgY2hhciByZXNlcnZlZFs2NF07CisJfSBzOworCXVuaW9uIHsKKwkJc3RydWN0IHNuZF9wY21fbW1hcF9jb250cm9sIGNvbnRyb2w7CisJCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbNjRdOworCX0gYzsKK307CisKK3N0cnVjdCBzbmRfeGZlcmkgeworCXNuZF9wY21fc2ZyYW1lc190IHJlc3VsdDsKKwl2b2lkICpidWY7CisJc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzOworfTsKKworc3RydWN0IHNuZF94ZmVybiB7CisJc25kX3BjbV9zZnJhbWVzX3QgcmVzdWx0OworCXZvaWQgKiAqYnVmczsKKwlzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXM7Cit9OworCitlbnVtIHsKKwlTTkRSVl9QQ01fVFNUQU1QX1RZUEVfR0VUVElNRU9GREFZID0gMCwJLyogZ2V0dGltZW9mZGF5IGVxdWl2YWxlbnQgKi8KKwlTTkRSVl9QQ01fVFNUQU1QX1RZUEVfTU9OT1RPTklDLAkvKiBwb3NpeF9jbG9ja19tb25vdG9uaWMgZXF1aXZhbGVudCAqLworCVNORFJWX1BDTV9UU1RBTVBfVFlQRV9MQVNUID0gU05EUlZfUENNX1RTVEFNUF9UWVBFX01PTk9UT05JQywKK307CisKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1BWRVJTSU9OCV9JT1IoJ0EnLCAweDAwLCBpbnQpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9JTkZPCQlfSU9SKCdBJywgMHgwMSwgc3RydWN0IHNuZF9wY21faW5mbykKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1RTVEFNUAkJX0lPVygnQScsIDB4MDIsIGludCkKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1RUU1RBTVAJCV9JT1coJ0EnLCAweDAzLCBpbnQpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9IV19SRUZJTkUJX0lPV1IoJ0EnLCAweDEwLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9IV19QQVJBTVMJX0lPV1IoJ0EnLCAweDExLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9IV19GUkVFCQlfSU8oJ0EnLCAweDEyKQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfU1dfUEFSQU1TCV9JT1dSKCdBJywgMHgxMywgc3RydWN0IHNuZF9wY21fc3dfcGFyYW1zKQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfU1RBVFVTCQlfSU9SKCdBJywgMHgyMCwgc3RydWN0IHNuZF9wY21fc3RhdHVzKQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfREVMQVkJCV9JT1IoJ0EnLCAweDIxLCBzbmRfcGNtX3NmcmFtZXNfdCkKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX0hXU1lOQwkJX0lPKCdBJywgMHgyMikKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1NZTkNfUFRSCV9JT1dSKCdBJywgMHgyMywgc3RydWN0IHNuZF9wY21fc3luY19wdHIpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9DSEFOTkVMX0lORk8JX0lPUignQScsIDB4MzIsIHN0cnVjdCBzbmRfcGNtX2NoYW5uZWxfaW5mbykKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1BSRVBBUkUJCV9JTygnQScsIDB4NDApCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9SRVNFVAkJX0lPKCdBJywgMHg0MSkKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1NUQVJUCQlfSU8oJ0EnLCAweDQyKQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfRFJPUAkJX0lPKCdBJywgMHg0MykKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX0RSQUlOCQlfSU8oJ0EnLCAweDQ0KQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfUEFVU0UJCV9JT1coJ0EnLCAweDQ1LCBpbnQpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9SRVdJTkQJCV9JT1coJ0EnLCAweDQ2LCBzbmRfcGNtX3VmcmFtZXNfdCkKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1JFU1VNRQkJX0lPKCdBJywgMHg0NykKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1hSVU4JCV9JTygnQScsIDB4NDgpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9GT1JXQVJECQlfSU9XKCdBJywgMHg0OSwgc25kX3BjbV91ZnJhbWVzX3QpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9XUklURUlfRlJBTUVTCV9JT1coJ0EnLCAweDUwLCBzdHJ1Y3Qgc25kX3hmZXJpKQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfUkVBRElfRlJBTUVTCV9JT1IoJ0EnLCAweDUxLCBzdHJ1Y3Qgc25kX3hmZXJpKQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfV1JJVEVOX0ZSQU1FUwlfSU9XKCdBJywgMHg1Miwgc3RydWN0IHNuZF94ZmVybikKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1JFQUROX0ZSQU1FUwlfSU9SKCdBJywgMHg1Mywgc3RydWN0IHNuZF94ZmVybikKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX0xJTksJCV9JT1coJ0EnLCAweDYwLCBpbnQpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9VTkxJTksJCV9JTygnQScsIDB4NjEpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJIHYxLjAgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogIFJhdyBNSURJIHNlY3Rpb24gLSAvZGV2L3NuZC9taWRpPz8KKyAqLworCisjZGVmaW5lIFNORFJWX1JBV01JRElfVkVSU0lPTgkJU05EUlZfUFJPVE9DT0xfVkVSU0lPTigyLCAwLCAwKQorCitlbnVtIHsKKwlTTkRSVl9SQVdNSURJX1NUUkVBTV9PVVRQVVQgPSAwLAorCVNORFJWX1JBV01JRElfU1RSRUFNX0lOUFVULAorCVNORFJWX1JBV01JRElfU1RSRUFNX0xBU1QgPSBTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVCwKK307CisKKyNkZWZpbmUgU05EUlZfUkFXTUlESV9JTkZPX09VVFBVVAkJMHgwMDAwMDAwMQorI2RlZmluZSBTTkRSVl9SQVdNSURJX0lORk9fSU5QVVQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU05EUlZfUkFXTUlESV9JTkZPX0RVUExFWAkJMHgwMDAwMDAwNAorCitzdHJ1Y3Qgc25kX3Jhd21pZGlfaW5mbyB7CisJdW5zaWduZWQgaW50IGRldmljZTsJCS8qIFJPL1dSIChjb250cm9sKTogZGV2aWNlIG51bWJlciAqLworCXVuc2lnbmVkIGludCBzdWJkZXZpY2U7CQkvKiBSTy9XUiAoY29udHJvbCk6IHN1YmRldmljZSBudW1iZXIgKi8KKwlpbnQgc3RyZWFtOwkJCS8qIFdSOiBzdHJlYW0gKi8KKwlpbnQgY2FyZDsJCQkvKiBSOiBjYXJkIG51bWJlciAqLworCXVuc2lnbmVkIGludCBmbGFnczsJCS8qIFNORFJWX1JBV01JRElfSU5GT19YWFhYICovCisJdW5zaWduZWQgY2hhciBpZFs2NF07CQkvKiBJRCAodXNlciBzZWxlY3RhYmxlKSAqLworCXVuc2lnbmVkIGNoYXIgbmFtZVs4MF07CQkvKiBuYW1lIG9mIGRldmljZSAqLworCXVuc2lnbmVkIGNoYXIgc3VibmFtZVszMl07CS8qIG5hbWUgb2YgYWN0aXZlIG9yIHNlbGVjdGVkIHN1YmRldmljZSAqLworCXVuc2lnbmVkIGludCBzdWJkZXZpY2VzX2NvdW50OworCXVuc2lnbmVkIGludCBzdWJkZXZpY2VzX2F2YWlsOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbNjRdOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworfTsKKworc3RydWN0IHNuZF9yYXdtaWRpX3BhcmFtcyB7CisJaW50IHN0cmVhbTsKKwlzaXplX3QgYnVmZmVyX3NpemU7CQkvKiBxdWV1ZSBzaXplIGluIGJ5dGVzICovCisJc2l6ZV90IGF2YWlsX21pbjsJCS8qIG1pbmltdW0gYXZhaWwgYnl0ZXMgZm9yIHdha2V1cCAqLworCXVuc2lnbmVkIGludCBub19hY3RpdmVfc2Vuc2luZzogMTsgLyogZG8gbm90IHNlbmQgYWN0aXZlIHNlbnNpbmcgYnl0ZSBpbiBjbG9zZSgpICovCisJdW5zaWduZWQgY2hhciByZXNlcnZlZFsxNl07CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCit9OworCitzdHJ1Y3Qgc25kX3Jhd21pZGlfc3RhdHVzIHsKKwlpbnQgc3RyZWFtOworCXN0cnVjdCB0aW1lc3BlYyB0c3RhbXA7CQkvKiBUaW1lc3RhbXAgKi8KKwlzaXplX3QgYXZhaWw7CQkJLyogYXZhaWxhYmxlIGJ5dGVzICovCisJc2l6ZV90IHhydW5zOwkJCS8qIGNvdW50IG9mIG92ZXJydW5zIHNpbmNlIGxhc3Qgc3RhdHVzIChpbiBieXRlcykgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzE2XTsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KK307CisKKyNkZWZpbmUgU05EUlZfUkFXTUlESV9JT0NUTF9QVkVSU0lPTglfSU9SKCdXJywgMHgwMCwgaW50KQorI2RlZmluZSBTTkRSVl9SQVdNSURJX0lPQ1RMX0lORk8JX0lPUignVycsIDB4MDEsIHN0cnVjdCBzbmRfcmF3bWlkaV9pbmZvKQorI2RlZmluZSBTTkRSVl9SQVdNSURJX0lPQ1RMX1BBUkFNUwlfSU9XUignVycsIDB4MTAsIHN0cnVjdCBzbmRfcmF3bWlkaV9wYXJhbXMpCisjZGVmaW5lIFNORFJWX1JBV01JRElfSU9DVExfU1RBVFVTCV9JT1dSKCdXJywgMHgyMCwgc3RydWN0IHNuZF9yYXdtaWRpX3N0YXR1cykKKyNkZWZpbmUgU05EUlZfUkFXTUlESV9JT0NUTF9EUk9QCV9JT1coJ1cnLCAweDMwLCBpbnQpCisjZGVmaW5lIFNORFJWX1JBV01JRElfSU9DVExfRFJBSU4JX0lPVygnVycsIDB4MzEsIGludCkKKworLyoKKyAqICBUaW1lciBzZWN0aW9uIC0gL2Rldi9zbmQvdGltZXIKKyAqLworCisjZGVmaW5lIFNORFJWX1RJTUVSX1ZFUlNJT04JCVNORFJWX1BST1RPQ09MX1ZFUlNJT04oMiwgMCwgNikKKworZW51bSB7CisJU05EUlZfVElNRVJfQ0xBU1NfTk9ORSA9IC0xLAorCVNORFJWX1RJTUVSX0NMQVNTX1NMQVZFID0gMCwKKwlTTkRSVl9USU1FUl9DTEFTU19HTE9CQUwsCisJU05EUlZfVElNRVJfQ0xBU1NfQ0FSRCwKKwlTTkRSVl9USU1FUl9DTEFTU19QQ00sCisJU05EUlZfVElNRVJfQ0xBU1NfTEFTVCA9IFNORFJWX1RJTUVSX0NMQVNTX1BDTSwKK307CisKKy8qIHNsYXZlIHRpbWVyIGNsYXNzZXMgKi8KK2VudW0geworCVNORFJWX1RJTUVSX1NDTEFTU19OT05FID0gMCwKKwlTTkRSVl9USU1FUl9TQ0xBU1NfQVBQTElDQVRJT04sCisJU05EUlZfVElNRVJfU0NMQVNTX1NFUVVFTkNFUiwJCS8qIGFsaWFzICovCisJU05EUlZfVElNRVJfU0NMQVNTX09TU19TRVFVRU5DRVIsCS8qIGFsaWFzICovCisJU05EUlZfVElNRVJfU0NMQVNTX0xBU1QgPSBTTkRSVl9USU1FUl9TQ0xBU1NfT1NTX1NFUVVFTkNFUiwKK307CisKKy8qIGdsb2JhbCB0aW1lcnMgKGRldmljZSBtZW1iZXIpICovCisjZGVmaW5lIFNORFJWX1RJTUVSX0dMT0JBTF9TWVNURU0JMAorI2RlZmluZSBTTkRSVl9USU1FUl9HTE9CQUxfUlRDCQkxCisjZGVmaW5lIFNORFJWX1RJTUVSX0dMT0JBTF9IUEVUCQkyCisjZGVmaW5lIFNORFJWX1RJTUVSX0dMT0JBTF9IUlRJTUVSCTMKKworLyogaW5mbyBmbGFncyAqLworI2RlZmluZSBTTkRSVl9USU1FUl9GTEdfU0xBVkUJCSgxPDwwKQkvKiBjYW5ub3QgYmUgY29udHJvbGxlZCAqLworCitzdHJ1Y3Qgc25kX3RpbWVyX2lkIHsKKwlpbnQgZGV2X2NsYXNzOworCWludCBkZXZfc2NsYXNzOworCWludCBjYXJkOworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKK307CisKK3N0cnVjdCBzbmRfdGltZXJfZ2luZm8geworCXN0cnVjdCBzbmRfdGltZXJfaWQgdGlkOwkvKiByZXF1ZXN0ZWQgdGltZXIgSUQgKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CQkvKiB0aW1lciBmbGFncyAtIFNORFJWX1RJTUVSX0ZMR18qICovCisJaW50IGNhcmQ7CQkJLyogY2FyZCBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIGlkWzY0XTsJCS8qIHRpbWVyIGlkZW50aWZpY2F0aW9uICovCisJdW5zaWduZWQgY2hhciBuYW1lWzgwXTsJCS8qIHRpbWVyIG5hbWUgKi8KKwl1bnNpZ25lZCBsb25nIHJlc2VydmVkMDsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKwl1bnNpZ25lZCBsb25nIHJlc29sdXRpb247CS8qIGF2ZXJhZ2UgcGVyaW9kIHJlc29sdXRpb24gaW4gbnMgKi8KKwl1bnNpZ25lZCBsb25nIHJlc29sdXRpb25fbWluOwkvKiBtaW5pbWFsIHBlcmlvZCByZXNvbHV0aW9uIGluIG5zICovCisJdW5zaWduZWQgbG9uZyByZXNvbHV0aW9uX21heDsJLyogbWF4aW1hbCBwZXJpb2QgcmVzb2x1dGlvbiBpbiBucyAqLworCXVuc2lnbmVkIGludCBjbGllbnRzOwkJLyogYWN0aXZlIHRpbWVyIGNsaWVudHMgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzMyXTsKK307CisKK3N0cnVjdCBzbmRfdGltZXJfZ3BhcmFtcyB7CisJc3RydWN0IHNuZF90aW1lcl9pZCB0aWQ7CS8qIHJlcXVlc3RlZCB0aW1lciBJRCAqLworCXVuc2lnbmVkIGxvbmcgcGVyaW9kX251bTsJLyogcmVxdWVzdGVkIHByZWNpc2UgcGVyaW9kIGR1cmF0aW9uIChpbiBzZWNvbmRzKSAtIG51bWVyYXRvciAqLworCXVuc2lnbmVkIGxvbmcgcGVyaW9kX2RlbjsJLyogcmVxdWVzdGVkIHByZWNpc2UgcGVyaW9kIGR1cmF0aW9uIChpbiBzZWNvbmRzKSAtIGRlbm9taW5hdG9yICovCisJdW5zaWduZWQgY2hhciByZXNlcnZlZFszMl07Cit9OworCitzdHJ1Y3Qgc25kX3RpbWVyX2dzdGF0dXMgeworCXN0cnVjdCBzbmRfdGltZXJfaWQgdGlkOwkvKiByZXF1ZXN0ZWQgdGltZXIgSUQgKi8KKwl1bnNpZ25lZCBsb25nIHJlc29sdXRpb247CS8qIGN1cnJlbnQgcGVyaW9kIHJlc29sdXRpb24gaW4gbnMgKi8KKwl1bnNpZ25lZCBsb25nIHJlc29sdXRpb25fbnVtOwkvKiBwcmVjaXNlIGN1cnJlbnQgcGVyaW9kIHJlc29sdXRpb24gKGluIHNlY29uZHMpIC0gbnVtZXJhdG9yICovCisJdW5zaWduZWQgbG9uZyByZXNvbHV0aW9uX2RlbjsJLyogcHJlY2lzZSBjdXJyZW50IHBlcmlvZCByZXNvbHV0aW9uIChpbiBzZWNvbmRzKSAtIGRlbm9taW5hdG9yICovCisJdW5zaWduZWQgY2hhciByZXNlcnZlZFszMl07Cit9OworCitzdHJ1Y3Qgc25kX3RpbWVyX3NlbGVjdCB7CisJc3RydWN0IHNuZF90aW1lcl9pZCBpZDsJLyogYmluZCB0byB0aW1lciBJRCAqLworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbMzJdOwkvKiByZXNlcnZlZCAqLworfTsKKworc3RydWN0IHNuZF90aW1lcl9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CQkvKiB0aW1lciBmbGFncyAtIFNORFJWX1RJTUVSX0ZMR18qICovCisJaW50IGNhcmQ7CQkJLyogY2FyZCBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIGlkWzY0XTsJCS8qIHRpbWVyIGlkZW50aWZpY2F0b3IgKi8KKwl1bnNpZ25lZCBjaGFyIG5hbWVbODBdOwkJLyogdGltZXIgbmFtZSAqLworCXVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQwOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCXVuc2lnbmVkIGxvbmcgcmVzb2x1dGlvbjsJLyogYXZlcmFnZSBwZXJpb2QgcmVzb2x1dGlvbiBpbiBucyAqLworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbNjRdOwkvKiByZXNlcnZlZCAqLworfTsKKworI2RlZmluZSBTTkRSVl9USU1FUl9QU0ZMR19BVVRPCQkoMTw8MCkJLyogYXV0byBzdGFydCwgb3RoZXJ3aXNlIG9uZS1zaG90ICovCisjZGVmaW5lIFNORFJWX1RJTUVSX1BTRkxHX0VYQ0xVU0lWRQkoMTw8MSkJLyogZXhjbHVzaXZlIHVzZSwgcHJlY2lzZSBzdGFydC9zdG9wL3BhdXNlL2NvbnRpbnVlICovCisjZGVmaW5lIFNORFJWX1RJTUVSX1BTRkxHX0VBUkxZX0VWRU5UCSgxPDwyKQkvKiB3cml0ZSBlYXJseSBldmVudCB0byB0aGUgcG9sbCBxdWV1ZSAqLworCitzdHJ1Y3Qgc25kX3RpbWVyX3BhcmFtcyB7CisJdW5zaWduZWQgaW50IGZsYWdzOwkJLyogZmxhZ3MgLSBTTkRSVl9NSVhFUl9QU0ZMR18qICovCisJdW5zaWduZWQgaW50IHRpY2tzOwkJLyogcmVxdWVzdGVkIHJlc29sdXRpb24gaW4gdGlja3MgKi8KKwl1bnNpZ25lZCBpbnQgcXVldWVfc2l6ZTsJLyogdG90YWwgc2l6ZSBvZiBxdWV1ZSAoMzItMTAyNCkgKi8KKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQwOwkJLyogcmVzZXJ2ZWQsIHdhczogZmFpbHVyZSBsb2NhdGlvbnMgKi8KKwl1bnNpZ25lZCBpbnQgZmlsdGVyOwkJLyogZXZlbnQgZmlsdGVyIChiaXRtYXNrIG9mIFNORFJWX1RJTUVSX0VWRU5UXyopICovCisJdW5zaWduZWQgY2hhciByZXNlcnZlZFs2MF07CS8qIHJlc2VydmVkICovCit9OworCitzdHJ1Y3Qgc25kX3RpbWVyX3N0YXR1cyB7CisJc3RydWN0IHRpbWVzcGVjIHRzdGFtcDsJCS8qIFRpbWVzdGFtcCAtIGxhc3QgdXBkYXRlICovCisJdW5zaWduZWQgaW50IHJlc29sdXRpb247CS8qIGN1cnJlbnQgcGVyaW9kIHJlc29sdXRpb24gaW4gbnMgKi8KKwl1bnNpZ25lZCBpbnQgbG9zdDsJCS8qIGNvdW50ZXIgb2YgbWFzdGVyIHRpY2sgbG9zdCAqLworCXVuc2lnbmVkIGludCBvdmVycnVuOwkJLyogY291bnQgb2YgcmVhZCBxdWV1ZSBvdmVycnVucyAqLworCXVuc2lnbmVkIGludCBxdWV1ZTsJCS8qIHVzZWQgcXVldWUgc2l6ZSAqLworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbNjRdOwkvKiByZXNlcnZlZCAqLworfTsKKworI2RlZmluZSBTTkRSVl9USU1FUl9JT0NUTF9QVkVSU0lPTglfSU9SKCdUJywgMHgwMCwgaW50KQorI2RlZmluZSBTTkRSVl9USU1FUl9JT0NUTF9ORVhUX0RFVklDRQlfSU9XUignVCcsIDB4MDEsIHN0cnVjdCBzbmRfdGltZXJfaWQpCisjZGVmaW5lIFNORFJWX1RJTUVSX0lPQ1RMX1RSRUFECQlfSU9XKCdUJywgMHgwMiwgaW50KQorI2RlZmluZSBTTkRSVl9USU1FUl9JT0NUTF9HSU5GTwkJX0lPV1IoJ1QnLCAweDAzLCBzdHJ1Y3Qgc25kX3RpbWVyX2dpbmZvKQorI2RlZmluZSBTTkRSVl9USU1FUl9JT0NUTF9HUEFSQU1TCV9JT1coJ1QnLCAweDA0LCBzdHJ1Y3Qgc25kX3RpbWVyX2dwYXJhbXMpCisjZGVmaW5lIFNORFJWX1RJTUVSX0lPQ1RMX0dTVEFUVVMJX0lPV1IoJ1QnLCAweDA1LCBzdHJ1Y3Qgc25kX3RpbWVyX2dzdGF0dXMpCisjZGVmaW5lIFNORFJWX1RJTUVSX0lPQ1RMX1NFTEVDVAlfSU9XKCdUJywgMHgxMCwgc3RydWN0IHNuZF90aW1lcl9zZWxlY3QpCisjZGVmaW5lIFNORFJWX1RJTUVSX0lPQ1RMX0lORk8JCV9JT1IoJ1QnLCAweDExLCBzdHJ1Y3Qgc25kX3RpbWVyX2luZm8pCisjZGVmaW5lIFNORFJWX1RJTUVSX0lPQ1RMX1BBUkFNUwlfSU9XKCdUJywgMHgxMiwgc3RydWN0IHNuZF90aW1lcl9wYXJhbXMpCisjZGVmaW5lIFNORFJWX1RJTUVSX0lPQ1RMX1NUQVRVUwlfSU9SKCdUJywgMHgxNCwgc3RydWN0IHNuZF90aW1lcl9zdGF0dXMpCisvKiBUaGUgZm9sbG93aW5nIGZvdXIgaW9jdGxzIGFyZSBjaGFuZ2VkIHNpbmNlIDEuMC45IGR1ZSB0byBjb25mbGljdGlvbiAqLworI2RlZmluZSBTTkRSVl9USU1FUl9JT0NUTF9TVEFSVAkJX0lPKCdUJywgMHhhMCkKKyNkZWZpbmUgU05EUlZfVElNRVJfSU9DVExfU1RPUAkJX0lPKCdUJywgMHhhMSkKKyNkZWZpbmUgU05EUlZfVElNRVJfSU9DVExfQ09OVElOVUUJX0lPKCdUJywgMHhhMikKKyNkZWZpbmUgU05EUlZfVElNRVJfSU9DVExfUEFVU0UJCV9JTygnVCcsIDB4YTMpCisKK3N0cnVjdCBzbmRfdGltZXJfcmVhZCB7CisJdW5zaWduZWQgaW50IHJlc29sdXRpb247CisJdW5zaWduZWQgaW50IHRpY2tzOworfTsKKworZW51bSB7CisJU05EUlZfVElNRVJfRVZFTlRfUkVTT0xVVElPTiA9IDAsCS8qIHZhbCA9IHJlc29sdXRpb24gaW4gbnMgKi8KKwlTTkRSVl9USU1FUl9FVkVOVF9USUNLLAkJCS8qIHZhbCA9IHRpY2tzICovCisJU05EUlZfVElNRVJfRVZFTlRfU1RBUlQsCQkvKiB2YWwgPSByZXNvbHV0aW9uIGluIG5zICovCisJU05EUlZfVElNRVJfRVZFTlRfU1RPUCwJCQkvKiB2YWwgPSAwICovCisJU05EUlZfVElNRVJfRVZFTlRfQ09OVElOVUUsCQkvKiB2YWwgPSByZXNvbHV0aW9uIGluIG5zICovCisJU05EUlZfVElNRVJfRVZFTlRfUEFVU0UsCQkvKiB2YWwgPSAwICovCisJU05EUlZfVElNRVJfRVZFTlRfRUFSTFksCQkvKiB2YWwgPSAwLCBlYXJseSBldmVudCAqLworCVNORFJWX1RJTUVSX0VWRU5UX1NVU1BFTkQsCQkvKiB2YWwgPSAwICovCisJU05EUlZfVElNRVJfRVZFTlRfUkVTVU1FLAkJLyogdmFsID0gcmVzb2x1dGlvbiBpbiBucyAqLworCS8qIG1hc3RlciB0aW1lciBldmVudHMgZm9yIHNsYXZlIHRpbWVyIGluc3RhbmNlcyAqLworCVNORFJWX1RJTUVSX0VWRU5UX01TVEFSVCA9IFNORFJWX1RJTUVSX0VWRU5UX1NUQVJUICsgMTAsCisJU05EUlZfVElNRVJfRVZFTlRfTVNUT1AgPSBTTkRSVl9USU1FUl9FVkVOVF9TVE9QICsgMTAsCisJU05EUlZfVElNRVJfRVZFTlRfTUNPTlRJTlVFID0gU05EUlZfVElNRVJfRVZFTlRfQ09OVElOVUUgKyAxMCwKKwlTTkRSVl9USU1FUl9FVkVOVF9NUEFVU0UgPSBTTkRSVl9USU1FUl9FVkVOVF9QQVVTRSArIDEwLAorCVNORFJWX1RJTUVSX0VWRU5UX01TVVNQRU5EID0gU05EUlZfVElNRVJfRVZFTlRfU1VTUEVORCArIDEwLAorCVNORFJWX1RJTUVSX0VWRU5UX01SRVNVTUUgPSBTTkRSVl9USU1FUl9FVkVOVF9SRVNVTUUgKyAxMCwKK307CisKK3N0cnVjdCBzbmRfdGltZXJfdHJlYWQgeworCWludCBldmVudDsKKwlzdHJ1Y3QgdGltZXNwZWMgdHN0YW1wOworCXVuc2lnbmVkIGludCB2YWw7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICBTZWN0aW9uIGZvciBkcml2ZXIgY29udHJvbCBpbnRlcmZhY2UgLSAvZGV2L3NuZC9jb250cm9sPyAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU05EUlZfQ1RMX1ZFUlNJT04JCVNORFJWX1BST1RPQ09MX1ZFUlNJT04oMiwgMCwgNykKKworc3RydWN0IHNuZF9jdGxfY2FyZF9pbmZvIHsKKwlpbnQgY2FyZDsJCQkvKiBjYXJkIG51bWJlciAqLworCWludCBwYWQ7CQkJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAod2FzIHR5cGUpICovCisJdW5zaWduZWQgY2hhciBpZFsxNl07CQkvKiBJRCBvZiBjYXJkICh1c2VyIHNlbGVjdGFibGUpICovCisJdW5zaWduZWQgY2hhciBkcml2ZXJbMTZdOwkvKiBEcml2ZXIgbmFtZSAqLworCXVuc2lnbmVkIGNoYXIgbmFtZVszMl07CQkvKiBTaG9ydCBuYW1lIG9mIHNvdW5kY2FyZCAqLworCXVuc2lnbmVkIGNoYXIgbG9uZ25hbWVbODBdOwkvKiBuYW1lICsgaW5mbyB0ZXh0IGFib3V0IHNvdW5kY2FyZCAqLworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfWzE2XTsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAod2FzIElEIG9mIG1peGVyKSAqLworCXVuc2lnbmVkIGNoYXIgbWl4ZXJuYW1lWzgwXTsJLyogdmlzdWFsIG1peGVyIGlkZW50aWZpY2F0aW9uICovCisJdW5zaWduZWQgY2hhciBjb21wb25lbnRzWzEyOF07CS8qIGNhcmQgY29tcG9uZW50cyAvIGZpbmUgaWRlbnRpZmljYXRpb24sIGRlbGltaXRlZCB3aXRoIG9uZSBzcGFjZSAoQUM5NyBldGMuLikgKi8KK307CisKK3R5cGVkZWYgaW50IF9fYml0d2lzZSBzbmRfY3RsX2VsZW1fdHlwZV90OworI2RlZmluZQlTTkRSVl9DVExfRUxFTV9UWVBFX05PTkUJKChzbmRfY3RsX2VsZW1fdHlwZV90KSAwKSAvKiBpbnZhbGlkICovCisjZGVmaW5lCVNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTgkoKHNuZF9jdGxfZWxlbV90eXBlX3QpIDEpIC8qIGJvb2xlYW4gdHlwZSAqLworI2RlZmluZQlTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVIJKChzbmRfY3RsX2VsZW1fdHlwZV90KSAyKSAvKiBpbnRlZ2VyIHR5cGUgKi8KKyNkZWZpbmUJU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVECSgoc25kX2N0bF9lbGVtX3R5cGVfdCkgMykgLyogZW51bWVyYXRlZCB0eXBlICovCisjZGVmaW5lCVNORFJWX0NUTF9FTEVNX1RZUEVfQllURVMJKChzbmRfY3RsX2VsZW1fdHlwZV90KSA0KSAvKiBieXRlIGFycmF5ICovCisjZGVmaW5lCVNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4CSgoc25kX2N0bF9lbGVtX3R5cGVfdCkgNSkgLyogSUVDOTU4IChTL1BESUYpIHNldHVwICovCisjZGVmaW5lCVNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0CSgoc25kX2N0bF9lbGVtX3R5cGVfdCkgNikgLyogNjQtYml0IGludGVnZXIgdHlwZSAqLworI2RlZmluZQlTTkRSVl9DVExfRUxFTV9UWVBFX0xBU1QJU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSNjQKKwordHlwZWRlZiBpbnQgX19iaXR3aXNlIHNuZF9jdGxfZWxlbV9pZmFjZV90OworI2RlZmluZQlTTkRSVl9DVExfRUxFTV9JRkFDRV9DQVJECSgoc25kX2N0bF9lbGVtX2lmYWNlX3QpIDApIC8qIGdsb2JhbCBjb250cm9sICovCisjZGVmaW5lCVNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQCSgoc25kX2N0bF9lbGVtX2lmYWNlX3QpIDEpIC8qIGhhcmR3YXJlIGRlcGVuZGVudCBkZXZpY2UgKi8KKyNkZWZpbmUJU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIJKChzbmRfY3RsX2VsZW1faWZhY2VfdCkgMikgLyogdmlydHVhbCBtaXhlciBkZXZpY2UgKi8KKyNkZWZpbmUJU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNCSgoc25kX2N0bF9lbGVtX2lmYWNlX3QpIDMpIC8qIFBDTSBkZXZpY2UgKi8KKyNkZWZpbmUJU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUkFXTUlESQkoKHNuZF9jdGxfZWxlbV9pZmFjZV90KSA0KSAvKiBSYXdNaWRpIGRldmljZSAqLworI2RlZmluZQlTTkRSVl9DVExfRUxFTV9JRkFDRV9USU1FUgkoKHNuZF9jdGxfZWxlbV9pZmFjZV90KSA1KSAvKiB0aW1lciBkZXZpY2UgKi8KKyNkZWZpbmUJU05EUlZfQ1RMX0VMRU1fSUZBQ0VfU0VRVUVOQ0VSCSgoc25kX2N0bF9lbGVtX2lmYWNlX3QpIDYpIC8qIHNlcXVlbmNlciBjbGllbnQgKi8KKyNkZWZpbmUJU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTEFTVAlTTkRSVl9DVExfRUxFTV9JRkFDRV9TRVFVRU5DRVIKKworI2RlZmluZSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRAkJKDE8PDApCisjZGVmaW5lIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURQkJKDE8PDEpCisjZGVmaW5lIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUJCShTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRHxTTkRSVl9DVExfRUxFTV9BQ0NFU1NfV1JJVEUpCisjZGVmaW5lIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRQkJKDE8PDIpCS8qIGNvbnRyb2wgdmFsdWUgbWF5IGJlIGNoYW5nZWQgd2l0aG91dCBhIG5vdGlmaWNhdGlvbiAqLworI2RlZmluZSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVElNRVNUQU1QCQkoMTw8MykJLyogd2hlbiB3YXMgY29udHJvbCBjaGFuZ2VkICovCisjZGVmaW5lIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRAkJKDE8PDQpCS8qIFRMViByZWFkIGlzIHBvc3NpYmxlICovCisjZGVmaW5lIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfV1JJVEUJCSgxPDw1KQkvKiBUTFYgd3JpdGUgaXMgcG9zc2libGUgKi8KKyNkZWZpbmUgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEV1JJVEUJKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRHxTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1dSSVRFKQorI2RlZmluZSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX0NPTU1BTkQJKDE8PDYpCS8qIFRMViBjb21tYW5kIGlzIHBvc3NpYmxlICovCisjZGVmaW5lIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRQkJKDE8PDgpCS8qIGNvbnRyb2wgZG9lcyBhY3R1YWxseSBub3RoaW5nLCBidXQgbWF5IGJlIHVwZGF0ZWQgKi8KKyNkZWZpbmUgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0xPQ0sJCSgxPDw5KQkvKiB3cml0ZSBsb2NrICovCisjZGVmaW5lIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19PV05FUgkJKDE8PDEwKQkvKiB3cml0ZSBsb2NrIG93bmVyICovCisjZGVmaW5lIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfQ0FMTEJBQ0sJKDE8PDI4KQkvKiBrZXJuZWwgdXNlIGEgVExWIGNhbGxiYWNrICovIAorI2RlZmluZSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVVNFUgkJKDE8PDI5KSAvKiB1c2VyIHNwYWNlIGVsZW1lbnQgKi8KKy8qIGJpdHMgMzAgYW5kIDMxIGFyZSBvYnNvbGV0ZWQgKGZvciBpbmRpcmVjdCBhY2Nlc3MpICovCisKKy8qIGZvciBmdXJ0aGVyIGRldGFpbHMgc2VlIHRoZSBBQ1BJIGFuZCBQQ0kgcG93ZXIgbWFuYWdlbWVudCBzcGVjaWZpY2F0aW9uICovCisjZGVmaW5lIFNORFJWX0NUTF9QT1dFUl9EMAkJMHgwMDAwCS8qIGZ1bGwgT24gKi8KKyNkZWZpbmUgU05EUlZfQ1RMX1BPV0VSX0QxCQkweDAxMDAJLyogcGFydGlhbCBPbiAqLworI2RlZmluZSBTTkRSVl9DVExfUE9XRVJfRDIJCTB4MDIwMAkvKiBwYXJ0aWFsIE9uICovCisjZGVmaW5lIFNORFJWX0NUTF9QT1dFUl9EMwkJMHgwMzAwCS8qIE9mZiAqLworI2RlZmluZSBTTkRSVl9DVExfUE9XRVJfRDNob3QJCShTTkRSVl9DVExfUE9XRVJfRDN8MHgwMDAwKQkvKiBPZmYsIHdpdGggcG93ZXIgKi8KKyNkZWZpbmUgU05EUlZfQ1RMX1BPV0VSX0QzY29sZAkJKFNORFJWX0NUTF9QT1dFUl9EM3wweDAwMDEpCS8qIE9mZiwgd2l0aG91dCBwb3dlciAqLworCitzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIHsKKwl1bnNpZ25lZCBpbnQgbnVtaWQ7CQkvKiBudW1lcmljIGlkZW50aWZpZXIsIHplcm8gPSBpbnZhbGlkICovCisJc25kX2N0bF9lbGVtX2lmYWNlX3QgaWZhY2U7CS8qIGludGVyZmFjZSBpZGVudGlmaWVyICovCisJdW5zaWduZWQgaW50IGRldmljZTsJCS8qIGRldmljZS9jbGllbnQgbnVtYmVyICovCisJdW5zaWduZWQgaW50IHN1YmRldmljZTsJCS8qIHN1YmRldmljZSAoc3Vic3RyZWFtKSBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIG5hbWVbNDRdOwkJLyogQVNDSUkgbmFtZSBvZiBpdGVtICovCisJdW5zaWduZWQgaW50IGluZGV4OwkJLyogaW5kZXggb2YgaXRlbSAqLworfTsKKworc3RydWN0IHNuZF9jdGxfZWxlbV9saXN0IHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OwkJLyogVzogZmlyc3QgZWxlbWVudCBJRCB0byBnZXQgKi8KKwl1bnNpZ25lZCBpbnQgc3BhY2U7CQkvKiBXOiBjb3VudCBvZiBlbGVtZW50IElEcyB0byBnZXQgKi8KKwl1bnNpZ25lZCBpbnQgdXNlZDsJCS8qIFI6IGNvdW50IG9mIGVsZW1lbnQgSURzIHNldCAqLworCXVuc2lnbmVkIGludCBjb3VudDsJCS8qIFI6IGNvdW50IG9mIGFsbCBlbGVtZW50cyAqLworCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgKnBpZHM7IC8qIFI6IElEcyAqLworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbNTBdOworfTsKKworc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvIHsKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIGlkOwkvKiBXOiBlbGVtZW50IElEICovCisJc25kX2N0bF9lbGVtX3R5cGVfdCB0eXBlOwkvKiBSOiB2YWx1ZSB0eXBlIC0gU05EUlZfQ1RMX0VMRU1fVFlQRV8qICovCisJdW5zaWduZWQgaW50IGFjY2VzczsJCS8qIFI6IHZhbHVlIGFjY2VzcyAoYml0bWFzaykgLSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfKiAqLworCXVuc2lnbmVkIGludCBjb3VudDsJCS8qIGNvdW50IG9mIHZhbHVlcyAqLworCV9fa2VybmVsX3BpZF90IG93bmVyOwkJLyogb3duZXIncyBQSUQgb2YgdGhpcyBjb250cm9sICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJbG9uZyBtaW47CQkvKiBSOiBtaW5pbXVtIHZhbHVlICovCisJCQlsb25nIG1heDsJCS8qIFI6IG1heGltdW0gdmFsdWUgKi8KKwkJCWxvbmcgc3RlcDsJCS8qIFI6IHN0ZXAgKDAgdmFyaWFibGUpICovCisJCX0gaW50ZWdlcjsKKwkJc3RydWN0IHsKKwkJCWxvbmcgbG9uZyBtaW47CQkvKiBSOiBtaW5pbXVtIHZhbHVlICovCisJCQlsb25nIGxvbmcgbWF4OwkJLyogUjogbWF4aW11bSB2YWx1ZSAqLworCQkJbG9uZyBsb25nIHN0ZXA7CQkvKiBSOiBzdGVwICgwIHZhcmlhYmxlKSAqLworCQl9IGludGVnZXI2NDsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGludCBpdGVtczsJLyogUjogbnVtYmVyIG9mIGl0ZW1zICovCisJCQl1bnNpZ25lZCBpbnQgaXRlbTsJLyogVzogaXRlbSBudW1iZXIgKi8KKwkJCWNoYXIgbmFtZVs2NF07CQkvKiBSOiB2YWx1ZSBuYW1lICovCisJCQlfX3U2NCBuYW1lc19wdHI7CS8qIFc6IG5hbWVzIGxpc3QgKEVMRU1fQUREIG9ubHkpICovCisJCQl1bnNpZ25lZCBpbnQgbmFtZXNfbGVuZ3RoOworCQl9IGVudW1lcmF0ZWQ7CisJCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbMTI4XTsKKwl9IHZhbHVlOworCXVuaW9uIHsKKwkJdW5zaWduZWQgc2hvcnQgZFs0XTsJCS8qIGRpbWVuc2lvbnMgKi8KKwkJdW5zaWduZWQgc2hvcnQgKmRfcHRyOwkJLyogaW5kaXJlY3QgLSBvYnNvbGV0ZWQgKi8KKwl9IGRpbWVuOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbNjQtNCpzaXplb2YodW5zaWduZWQgc2hvcnQpXTsKK307CisKK3N0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgeworCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgaWQ7CS8qIFc6IGVsZW1lbnQgSUQgKi8KKwl1bnNpZ25lZCBpbnQgaW5kaXJlY3Q6IDE7CS8qIFc6IGluZGlyZWN0IGFjY2VzcyAtIG9ic29sZXRlZCAqLworCXVuaW9uIHsKKwkJdW5pb24geworCQkJbG9uZyB2YWx1ZVsxMjhdOworCQkJbG9uZyAqdmFsdWVfcHRyOwkvKiBvYnNvbGV0ZWQgKi8KKwkJfSBpbnRlZ2VyOworCQl1bmlvbiB7CisJCQlsb25nIGxvbmcgdmFsdWVbNjRdOworCQkJbG9uZyBsb25nICp2YWx1ZV9wdHI7CS8qIG9ic29sZXRlZCAqLworCQl9IGludGVnZXI2NDsKKwkJdW5pb24geworCQkJdW5zaWduZWQgaW50IGl0ZW1bMTI4XTsKKwkJCXVuc2lnbmVkIGludCAqaXRlbV9wdHI7CS8qIG9ic29sZXRlZCAqLworCQl9IGVudW1lcmF0ZWQ7CisJCXVuaW9uIHsKKwkJCXVuc2lnbmVkIGNoYXIgZGF0YVs1MTJdOworCQkJdW5zaWduZWQgY2hhciAqZGF0YV9wdHI7CS8qIG9ic29sZXRlZCAqLworCQl9IGJ5dGVzOworCQlzdHJ1Y3Qgc25kX2Flc19pZWM5NTggaWVjOTU4OworCX0gdmFsdWU7CQkvKiBSTyAqLworCXN0cnVjdCB0aW1lc3BlYyB0c3RhbXA7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZFsxMjgtc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYyldOworfTsKKworc3RydWN0IHNuZF9jdGxfdGx2IHsKKwl1bnNpZ25lZCBpbnQgbnVtaWQ7CS8qIGNvbnRyb2wgZWxlbWVudCBudW1lcmljIGlkZW50aWZpY2F0aW9uICovCisJdW5zaWduZWQgaW50IGxlbmd0aDsJLyogaW4gYnl0ZXMgYWxpZ25lZCB0byA0ICovCisJdW5zaWduZWQgaW50IHRsdlswXTsJLyogZmlyc3QgVExWICovCit9OworCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9QVkVSU0lPTglfSU9SKCdVJywgMHgwMCwgaW50KQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfQ0FSRF9JTkZPCV9JT1IoJ1UnLCAweDAxLCBzdHJ1Y3Qgc25kX2N0bF9jYXJkX2luZm8pCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9FTEVNX0xJU1QJX0lPV1IoJ1UnLCAweDEwLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2xpc3QpCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9FTEVNX0lORk8JX0lPV1IoJ1UnLCAweDExLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8pCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9FTEVNX1JFQUQJX0lPV1IoJ1UnLCAweDEyLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlKQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfRUxFTV9XUklURQlfSU9XUignVScsIDB4MTMsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUpCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9FTEVNX0xPQ0sJX0lPVygnVScsIDB4MTQsIHN0cnVjdCBzbmRfY3RsX2VsZW1faWQpCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9FTEVNX1VOTE9DSwlfSU9XKCdVJywgMHgxNSwgc3RydWN0IHNuZF9jdGxfZWxlbV9pZCkKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX1NVQlNDUklCRV9FVkVOVFMgX0lPV1IoJ1UnLCAweDE2LCBpbnQpCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9FTEVNX0FERAlfSU9XUignVScsIDB4MTcsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbykKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX0VMRU1fUkVQTEFDRQlfSU9XUignVScsIDB4MTgsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbykKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX0VMRU1fUkVNT1ZFCV9JT1dSKCdVJywgMHgxOSwgc3RydWN0IHNuZF9jdGxfZWxlbV9pZCkKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX1RMVl9SRUFECV9JT1dSKCdVJywgMHgxYSwgc3RydWN0IHNuZF9jdGxfdGx2KQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfVExWX1dSSVRFCV9JT1dSKCdVJywgMHgxYiwgc3RydWN0IHNuZF9jdGxfdGx2KQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfVExWX0NPTU1BTkQJX0lPV1IoJ1UnLCAweDFjLCBzdHJ1Y3Qgc25kX2N0bF90bHYpCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9IV0RFUF9ORVhUX0RFVklDRSBfSU9XUignVScsIDB4MjAsIGludCkKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX0hXREVQX0lORk8JX0lPUignVScsIDB4MjEsIHN0cnVjdCBzbmRfaHdkZXBfaW5mbykKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX1BDTV9ORVhUX0RFVklDRQlfSU9SKCdVJywgMHgzMCwgaW50KQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfUENNX0lORk8JX0lPV1IoJ1UnLCAweDMxLCBzdHJ1Y3Qgc25kX3BjbV9pbmZvKQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfUENNX1BSRUZFUl9TVUJERVZJQ0UgX0lPVygnVScsIDB4MzIsIGludCkKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX1JBV01JRElfTkVYVF9ERVZJQ0UgX0lPV1IoJ1UnLCAweDQwLCBpbnQpCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9SQVdNSURJX0lORk8JX0lPV1IoJ1UnLCAweDQxLCBzdHJ1Y3Qgc25kX3Jhd21pZGlfaW5mbykKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX1JBV01JRElfUFJFRkVSX1NVQkRFVklDRSBfSU9XKCdVJywgMHg0MiwgaW50KQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfUE9XRVIJCV9JT1dSKCdVJywgMHhkMCwgaW50KQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfUE9XRVJfU1RBVEUJX0lPUignVScsIDB4ZDEsIGludCkKKworLyoKKyAqICBSZWFkIGludGVyZmFjZS4KKyAqLworCitlbnVtIHNuZHJ2X2N0bF9ldmVudF90eXBlIHsKKwlTTkRSVl9DVExfRVZFTlRfRUxFTSA9IDAsCisJU05EUlZfQ1RMX0VWRU5UX0xBU1QgPSBTTkRSVl9DVExfRVZFTlRfRUxFTSwKK307CisKKyNkZWZpbmUgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUJKDE8PDApCS8qIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgKi8KKyNkZWZpbmUgU05EUlZfQ1RMX0VWRU5UX01BU0tfSU5GTwkoMTw8MSkJLyogZWxlbWVudCBpbmZvIHdhcyBjaGFuZ2VkICovCisjZGVmaW5lIFNORFJWX0NUTF9FVkVOVF9NQVNLX0FERAkoMTw8MikJLyogZWxlbWVudCB3YXMgYWRkZWQgKi8KKyNkZWZpbmUgU05EUlZfQ1RMX0VWRU5UX01BU0tfVExWCSgxPDwzKQkvKiBlbGVtZW50IFRMViB0cmVlIHdhcyBjaGFuZ2VkICovCisjZGVmaW5lIFNORFJWX0NUTF9FVkVOVF9NQVNLX1JFTU9WRQkofjBVKQkvKiBlbGVtZW50IHdhcyByZW1vdmVkICovCisKK3N0cnVjdCBzbmRfY3RsX2V2ZW50IHsKKwlpbnQgdHlwZTsJLyogZXZlbnQgdHlwZSAtIFNORFJWX0NUTF9FVkVOVF8qICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgaW50IG1hc2s7CisJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIGlkOworCQl9IGVsZW07CisJCXVuc2lnbmVkIGNoYXIgZGF0YThbNjBdOworCX0gZGF0YTsKK307CisKKy8qCisgKiAgQ29udHJvbCBuYW1lcworICovCisKKyNkZWZpbmUgU05EUlZfQ1RMX05BTUVfTk9ORQkJCQkiIgorI2RlZmluZSBTTkRSVl9DVExfTkFNRV9QTEFZQkFDSwkJCQkiUGxheWJhY2sgIgorI2RlZmluZSBTTkRSVl9DVExfTkFNRV9DQVBUVVJFCQkJCSJDYXB0dXJlICIKKworI2RlZmluZSBTTkRSVl9DVExfTkFNRV9JRUM5NThfTk9ORQkJCSIiCisjZGVmaW5lIFNORFJWX0NUTF9OQU1FX0lFQzk1OF9TV0lUQ0gJCQkiU3dpdGNoIgorI2RlZmluZSBTTkRSVl9DVExfTkFNRV9JRUM5NThfVk9MVU1FCQkJIlZvbHVtZSIKKyNkZWZpbmUgU05EUlZfQ1RMX05BTUVfSUVDOTU4X0RFRkFVTFQJCQkiRGVmYXVsdCIKKyNkZWZpbmUgU05EUlZfQ1RMX05BTUVfSUVDOTU4X01BU0sJCQkiTWFzayIKKyNkZWZpbmUgU05EUlZfQ1RMX05BTUVfSUVDOTU4X0NPTl9NQVNLCQkJIkNvbiBNYXNrIgorI2RlZmluZSBTTkRSVl9DVExfTkFNRV9JRUM5NThfUFJPX01BU0sJCQkiUHJvIE1hc2siCisjZGVmaW5lIFNORFJWX0NUTF9OQU1FX0lFQzk1OF9QQ01fU1RSRUFNCQkiUENNIFN0cmVhbSIKKyNkZWZpbmUgU05EUlZfQ1RMX05BTUVfSUVDOTU4KGV4cGwsZGlyZWN0aW9uLHdoYXQpCSJJRUM5NTggIiBleHBsIFNORFJWX0NUTF9OQU1FXyMjZGlyZWN0aW9uIFNORFJWX0NUTF9OQU1FX0lFQzk1OF8jI3doYXQKKworI2VuZGlmIC8qIF9fU09VTkRfQVNPVU5EX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvYXNvdW5kX2ZtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL2Fzb3VuZF9mbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYTRiOTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL2Fzb3VuZF9mbS5oCkBAIC0wLDAgKzEsMTM0IEBACisjaWZuZGVmIF9fU09VTkRfQVNPVU5EX0ZNX0gKKyNkZWZpbmUgX19TT1VORF9BU09VTkRfRk1fSAorCisvKgorICogIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZSAtIEFMU0EKKyAqCisgKiAgSW50ZXJmYWNlIGZpbGUgYmV0d2VlbiBBTFNBIGRyaXZlciAmIHVzZXIgc3BhY2UKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTQtOTggYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDRGcm9udCBUZWNobm9sb2dpZXMKKyAqCisgKiAgRGlyZWN0IEZNIGNvbnRyb2wKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNkZWZpbmUgU05EUlZfRE1fRk1fTU9ERV9PUEwyCTB4MDAKKyNkZWZpbmUgU05EUlZfRE1fRk1fTU9ERV9PUEwzCTB4MDEKKworc3RydWN0IHNuZF9kbV9mbV9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIGZtX21vZGU7CQkvKiBPUEwgbW9kZSwgc2VlIFNORFJWX0RNX0ZNX01PREVfWFhYICovCisJdW5zaWduZWQgY2hhciByaHl0aG07CQkvKiBwZXJjdXNzaW9uIG1vZGUgZmxhZyAqLworfTsKKworLyoKKyAqICBEYXRhIHN0cnVjdHVyZSBjb21wb3NpbmcgYW4gRk0gIm5vdGUiIG9yIHNvdW5kIGV2ZW50LgorICovCisKK3N0cnVjdCBzbmRfZG1fZm1fdm9pY2UgeworCXVuc2lnbmVkIGNoYXIgb3A7CQkvKiBvcGVyYXRvciBjZWxsICgwIG9yIDEpICovCisJdW5zaWduZWQgY2hhciB2b2ljZTsJCS8qIEZNIHZvaWNlICgwIHRvIDE3KSAqLworCisJdW5zaWduZWQgY2hhciBhbTsJCS8qIGFtcGxpdHVkZSBtb2R1bGF0aW9uICovCisJdW5zaWduZWQgY2hhciB2aWJyYXRvOwkJLyogdmlicmF0byBlZmZlY3QgKi8KKwl1bnNpZ25lZCBjaGFyIGRvX3N1c3RhaW47CS8qIHN1c3RhaW4gcGhhc2UgKi8KKwl1bnNpZ25lZCBjaGFyIGtiZF9zY2FsZTsJLyoga2V5Ym9hcmQgc2NhbGluZyAqLworCXVuc2lnbmVkIGNoYXIgaGFybW9uaWM7CQkvKiA0IGJpdHM6IGhhcm1vbmljIGFuZCBtdWx0aXBsaWVyICovCisJdW5zaWduZWQgY2hhciBzY2FsZV9sZXZlbDsJLyogMiBiaXRzOiBkZWNyZWFzZSBvdXRwdXQgZnJlcSByaXNlcyAqLworCXVuc2lnbmVkIGNoYXIgdm9sdW1lOwkJLyogNiBiaXRzOiB2b2x1bWUgKi8KKworCXVuc2lnbmVkIGNoYXIgYXR0YWNrOwkJLyogNCBiaXRzOiBhdHRhY2sgcmF0ZSAqLworCXVuc2lnbmVkIGNoYXIgZGVjYXk7CQkvKiA0IGJpdHM6IGRlY2F5IHJhdGUgKi8KKwl1bnNpZ25lZCBjaGFyIHN1c3RhaW47CQkvKiA0IGJpdHM6IHN1c3RhaW4gbGV2ZWwgKi8KKwl1bnNpZ25lZCBjaGFyIHJlbGVhc2U7CQkvKiA0IGJpdHM6IHJlbGVhc2UgcmF0ZSAqLworCisJdW5zaWduZWQgY2hhciBmZWVkYmFjazsJCS8qIDMgYml0czogZmVlZGJhY2sgZm9yIG9wMCAqLworCXVuc2lnbmVkIGNoYXIgY29ubmVjdGlvbjsJLyogMCBmb3Igc2VyaWFsLCAxIGZvciBwYXJhbGxlbCAqLworCXVuc2lnbmVkIGNoYXIgbGVmdDsJCS8qIHN0ZXJlbyBsZWZ0ICovCisJdW5zaWduZWQgY2hhciByaWdodDsJCS8qIHN0ZXJlbyByaWdodCAqLworCXVuc2lnbmVkIGNoYXIgd2F2ZWZvcm07CQkvKiAzIGJpdHM6IHdhdmVmb3JtIHNoYXBlICovCit9OworCisvKgorICogIFRoaXMgZGVzY3JpYmVzIGFuIEZNIG5vdGUgYnkgaXRzIHZvaWNlLCBvY3RhdmUsIGZyZXF1ZW5jeSBudW1iZXIgKDEwYml0KQorICogIGFuZCBrZXkgb24vb2ZmLgorICovCisKK3N0cnVjdCBzbmRfZG1fZm1fbm90ZSB7CisJdW5zaWduZWQgY2hhciB2b2ljZTsJLyogMC0xNyB2b2ljZSBjaGFubmVsICovCisJdW5zaWduZWQgY2hhciBvY3RhdmU7CS8qIDMgYml0czogd2hhdCBvY3RhdmUgdG8gcGxheSAqLworCXVuc2lnbmVkIGludCBmbnVtOwkvKiAxMCBiaXRzOiBmcmVxdWVuY3kgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciBrZXlfb247CS8qIHNldCBmb3IgYWN0aXZlLCBjbGVhciBmb3Igc2lsZW50ICovCit9OworCisvKgorICogIEZNIHBhcmFtZXRlcnMgdGhhdCBhcHBseSBnbG9iYWxseSB0byBhbGwgdm9pY2VzLCBhbmQgdGh1cyBhcmUgbm90ICJub3RlcyIKKyAqLworCitzdHJ1Y3Qgc25kX2RtX2ZtX3BhcmFtcyB7CisJdW5zaWduZWQgY2hhciBhbV9kZXB0aDsJCS8qIGFtcGxpdHVkZSBtb2R1bGF0aW9uIGRlcHRoICgxPWhpKSAqLworCXVuc2lnbmVkIGNoYXIgdmliX2RlcHRoOwkvKiB2aWJyYXRvIGRlcHRoICgxPWhpKSAqLworCXVuc2lnbmVkIGNoYXIga2JkX3NwbGl0OwkvKiBrZXlib2FyZCBzcGxpdCAqLworCXVuc2lnbmVkIGNoYXIgcmh5dGhtOwkJLyogcGVyY3Vzc2lvbiBtb2RlIHNlbGVjdCAqLworCisJLyogVGhpcyBibG9jayBpcyB0aGUgcGVyY3Vzc2lvbiBpbnN0cnVtZW50IGRhdGEgKi8KKwl1bnNpZ25lZCBjaGFyIGJhc3M7CisJdW5zaWduZWQgY2hhciBzbmFyZTsKKwl1bnNpZ25lZCBjaGFyIHRvbXRvbTsKKwl1bnNpZ25lZCBjaGFyIGN5bWJhbDsKKwl1bnNpZ25lZCBjaGFyIGhpaGF0OworfTsKKworLyoKKyAqICBGTSBtb2RlIGlvY3RsIHNldHRpbmdzCisgKi8KKworI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9JTkZPCQlfSU9SKCdIJywgMHgyMCwgc3RydWN0IHNuZF9kbV9mbV9pbmZvKQorI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9SRVNFVAkJX0lPICgnSCcsIDB4MjEpCisjZGVmaW5lIFNORFJWX0RNX0ZNX0lPQ1RMX1BMQVlfTk9URQlfSU9XKCdIJywgMHgyMiwgc3RydWN0IHNuZF9kbV9mbV9ub3RlKQorI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9TRVRfVk9JQ0UJX0lPVygnSCcsIDB4MjMsIHN0cnVjdCBzbmRfZG1fZm1fdm9pY2UpCisjZGVmaW5lIFNORFJWX0RNX0ZNX0lPQ1RMX1NFVF9QQVJBTVMJX0lPVygnSCcsIDB4MjQsIHN0cnVjdCBzbmRfZG1fZm1fcGFyYW1zKQorI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9TRVRfTU9ERQlfSU9XKCdIJywgMHgyNSwgaW50KQorLyogZm9yIE9QTDMgb25seSAqLworI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9TRVRfQ09OTkVDVElPTglfSU9XKCdIJywgMHgyNiwgaW50KQorLyogU0JJIHBhdGNoIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU05EUlZfRE1fRk1fSU9DVExfQ0xFQVJfUEFUQ0hFUwlfSU8gKCdIJywgMHg0MCkKKworI2RlZmluZSBTTkRSVl9ETV9GTV9PU1NfSU9DVExfUkVTRVQJCTB4MjAKKyNkZWZpbmUgU05EUlZfRE1fRk1fT1NTX0lPQ1RMX1BMQVlfTk9URQkJMHgyMQorI2RlZmluZSBTTkRSVl9ETV9GTV9PU1NfSU9DVExfU0VUX1ZPSUNFCQkweDIyCisjZGVmaW5lIFNORFJWX0RNX0ZNX09TU19JT0NUTF9TRVRfUEFSQU1TCTB4MjMKKyNkZWZpbmUgU05EUlZfRE1fRk1fT1NTX0lPQ1RMX1NFVF9NT0RFCQkweDI0CisjZGVmaW5lIFNORFJWX0RNX0ZNX09TU19JT0NUTF9TRVRfT1BMCQkweDI1CisKKy8qCisgKiBQYXRjaCBSZWNvcmQgLSBmaXhlZCBzaXplIGZvciB3cml0ZQorICovCisKKyNkZWZpbmUgRk1fS0VZX1NCSQkiU0JJXDAzMiIKKyNkZWZpbmUgRk1fS0VZXzJPUAkiMk9QXDAzMiIKKyNkZWZpbmUgRk1fS0VZXzRPUAkiNE9QXDAzMiIKKworc3RydWN0IHNiaV9wYXRjaCB7CisJdW5zaWduZWQgY2hhciBwcm9nOworCXVuc2lnbmVkIGNoYXIgYmFuazsKKwljaGFyIGtleVs0XTsKKwljaGFyIG5hbWVbMjVdOworCWNoYXIgZXh0ZW5zaW9uWzddOworCXVuc2lnbmVkIGNoYXIgZGF0YVszMl07Cit9OworCisjZW5kaWYgLyogX19TT1VORF9BU09VTkRfRk1fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9lbXUxMGsxLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL2VtdTEwazEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTI0YTg0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9lbXUxMGsxLmgKQEAgLTAsMCArMSwzNzEgQEAKKyNpZm5kZWYgX19TT1VORF9FTVUxMEsxX0gKKyNkZWZpbmUgX19TT1VORF9FTVUxMEsxX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiwKKyAqCQkgICAgIENyZWF0aXZlIExhYnMsIEluYy4KKyAqICBEZWZpbml0aW9ucyBmb3IgRU1VMTBLMSAoU0IgTGl2ZSEpIGNoaXBzCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworCisvKgorICogLS0tLSBGWDgwMTAgLS0tLQorICovCisKKyNkZWZpbmUgRU1VMTBLMV9DQVJEX0NSRUFUSVZFCQkJMHgwMDAwMDAwMAorI2RlZmluZSBFTVUxMEsxX0NBUkRfRU1VQVBTCQkJMHgwMDAwMDAwMQorCisjZGVmaW5lIEVNVTEwSzFfRlg4MDEwX1BDTV9DT1VOVAkJOAorCisvKiBpbnN0cnVjdGlvbiBzZXQgKi8KKyNkZWZpbmUgaU1BQzAJIDB4MDAJLyogUiA9IEEgKyAoWCAqIFkgPj4gMzEpICAgOyBzYXR1cmF0aW9uICovCisjZGVmaW5lIGlNQUMxCSAweDAxCS8qIFIgPSBBICsgKC1YICogWSA+PiAzMSkgIDsgc2F0dXJhdGlvbiAqLworI2RlZmluZSBpTUFDMgkgMHgwMgkvKiBSID0gQSArIChYICogWSA+PiAzMSkgICA7IHdyYXBhcm91bmQgKi8KKyNkZWZpbmUgaU1BQzMJIDB4MDMJLyogUiA9IEEgKyAoLVggKiBZID4+IDMxKSAgOyB3cmFwYXJvdW5kICovCisjZGVmaW5lIGlNQUNJTlQwIDB4MDQJLyogUiA9IEEgKyBYICogWQkgICA7IHNhdHVyYXRpb24gKi8KKyNkZWZpbmUgaU1BQ0lOVDEgMHgwNQkvKiBSID0gQSArIFggKiBZCSAgIDsgd3JhcGFyb3VuZCAoMzEtYml0KSAqLworI2RlZmluZSBpQUNDMwkgMHgwNgkvKiBSID0gQSArIFggKyBZCSAgIDsgc2F0dXJhdGlvbiAqLworI2RlZmluZSBpTUFDTVYgICAweDA3CS8qIFIgPSBBLCBhY2MgKz0gWCAqIFkgPj4gMzEgKi8KKyNkZWZpbmUgaUFORFhPUiAgMHgwOAkvKiBSID0gKEEgJiBYKSBeIFkgKi8KKyNkZWZpbmUgaVRTVE5FRyAgMHgwOQkvKiBSID0gKEEgPj0gWSkgPyBYIDogflggKi8KKyNkZWZpbmUgaUxJTUlUR0UgMHgwYQkvKiBSID0gKEEgPj0gWSkgPyBYIDogWSAqLworI2RlZmluZSBpTElNSVRMVCAweDBiCS8qIFIgPSAoQSA8IFkpID8gWCA6IFkgKi8KKyNkZWZpbmUgaUxPRwkgMHgwYwkvKiBSID0gbGluZWFyX2RhdGEsIEEgKGxvZ19kYXRhKSwgWCAobWF4X2V4cCksIFkgKGZvcm1hdF93b3JkKSAqLworI2RlZmluZSBpRVhQCSAweDBkCS8qIFIgPSBsb2dfZGF0YSwgQSAobGluZWFyX2RhdGEpLCBYIChtYXhfZXhwKSwgWSAoZm9ybWF0X3dvcmQpICovCisjZGVmaW5lIGlJTlRFUlAgIDB4MGUJLyogUiA9IEEgKyAoWCAqIChZIC0gQSkgPj4gMzEpICA7IHNhdHVyYXRpb24gKi8KKyNkZWZpbmUgaVNLSVAgICAgMHgwZgkvKiBSID0gQSAoY2NfcmVnKSwgWCAoY291bnQpLCBZIChjY190ZXN0KSAqLworCisvKiBHUFJzICovCisjZGVmaW5lIEZYQlVTKHgpCSgweDAwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MGYgKi8KKyNkZWZpbmUgRVhUSU4oeCkJKDB4MTAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgwZiAqLworI2RlZmluZSBFWFRPVVQoeCkJKDB4MjAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgwZiBwaHlzaWNhbCBvdXRzIC0+IEZYV0MgbG93IDE2IGJpdHMgKi8KKyNkZWZpbmUgRlhCVVMyKHgpCSgweDMwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MGYgY29waWVzIG9mIGZ4IGJ1c2VzIGZvciBjYXB0dXJlIC0+IEZYV0MgaGlnaCAxNiBiaXRzICovCisJCQkJCS8qIE5COiAweDMxIGFuZCAweDMyIGFyZSBzaGFyZWQgd2l0aCBDZW50ZXIvTEZFIG9uIFNCIGxpdmUgNS4xICovCisKKyNkZWZpbmUgQ18wMDAwMDAwMAkweDQwCisjZGVmaW5lIENfMDAwMDAwMDEJMHg0MQorI2RlZmluZSBDXzAwMDAwMDAyCTB4NDIKKyNkZWZpbmUgQ18wMDAwMDAwMwkweDQzCisjZGVmaW5lIENfMDAwMDAwMDQJMHg0NAorI2RlZmluZSBDXzAwMDAwMDA4CTB4NDUKKyNkZWZpbmUgQ18wMDAwMDAxMAkweDQ2CisjZGVmaW5lIENfMDAwMDAwMjAJMHg0NworI2RlZmluZSBDXzAwMDAwMTAwCTB4NDgKKyNkZWZpbmUgQ18wMDAxMDAwMAkweDQ5CisjZGVmaW5lIENfMDAwODAwMDAJMHg0YQorI2RlZmluZSBDXzEwMDAwMDAwCTB4NGIKKyNkZWZpbmUgQ18yMDAwMDAwMAkweDRjCisjZGVmaW5lIENfNDAwMDAwMDAJMHg0ZAorI2RlZmluZSBDXzgwMDAwMDAwCTB4NGUKKyNkZWZpbmUgQ183ZmZmZmZmZgkweDRmCisjZGVmaW5lIENfZmZmZmZmZmYJMHg1MAorI2RlZmluZSBDX2ZmZmZmZmZlCTB4NTEKKyNkZWZpbmUgQ19jMDAwMDAwMAkweDUyCisjZGVmaW5lIENfNGYxYmJjZGMJMHg1MworI2RlZmluZSBDXzVhN2VmOWRiCTB4NTQKKyNkZWZpbmUgQ18wMDEwMDAwMAkweDU1CQkvKiA/PyAqLworI2RlZmluZSBHUFJfQUNDVQkweDU2CQkvKiBBQ0NVTSwgYWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgR1BSX0NPTkQJMHg1NwkJLyogQ0NSLCBjb25kaXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgR1BSX05PSVNFMAkweDU4CQkvKiBub2lzZSBzb3VyY2UgKi8KKyNkZWZpbmUgR1BSX05PSVNFMQkweDU5CQkvKiBub2lzZSBzb3VyY2UgKi8KKyNkZWZpbmUgR1BSX0lSUQkJMHg1YQkJLyogSVJRIHJlZ2lzdGVyICovCisjZGVmaW5lIEdQUl9EQkFDCTB4NWIJCS8qIFRSQU0gRGVsYXkgQmFzZSBBZGRyZXNzIENvdW50ZXIgKi8KKyNkZWZpbmUgR1BSKHgpCQkoRlhHUFJFR0JBU0UgKyAoeCkpIC8qIGZyZWUgR1BSczogeCA9IDB4MDAgLSAweGZmICovCisjZGVmaW5lIElUUkFNX0RBVEEoeCkJKFRBTktNRU1EQVRBUkVHQkFTRSArIDB4MDAgKyAoeCkpIC8qIHggPSAweDAwIC0gMHg3ZiAqLworI2RlZmluZSBFVFJBTV9EQVRBKHgpCShUQU5LTUVNREFUQVJFR0JBU0UgKyAweDgwICsgKHgpKSAvKiB4ID0gMHgwMCAtIDB4MWYgKi8KKyNkZWZpbmUgSVRSQU1fQUREUih4KQkoVEFOS01FTUFERFJSRUdCQVNFICsgMHgwMCArICh4KSkgLyogeCA9IDB4MDAgLSAweDdmICovCisjZGVmaW5lIEVUUkFNX0FERFIoeCkJKFRBTktNRU1BRERSUkVHQkFTRSArIDB4ODAgKyAoeCkpIC8qIHggPSAweDAwIC0gMHgxZiAqLworCisjZGVmaW5lIEFfSVRSQU1fREFUQSh4KQkoVEFOS01FTURBVEFSRUdCQVNFICsgMHgwMCArICh4KSkgLyogeCA9IDB4MDAgLSAweGJmICovCisjZGVmaW5lIEFfRVRSQU1fREFUQSh4KQkoVEFOS01FTURBVEFSRUdCQVNFICsgMHhjMCArICh4KSkgLyogeCA9IDB4MDAgLSAweDNmICovCisjZGVmaW5lIEFfSVRSQU1fQUREUih4KQkoVEFOS01FTUFERFJSRUdCQVNFICsgMHgwMCArICh4KSkgLyogeCA9IDB4MDAgLSAweGJmICovCisjZGVmaW5lIEFfRVRSQU1fQUREUih4KQkoVEFOS01FTUFERFJSRUdCQVNFICsgMHhjMCArICh4KSkgLyogeCA9IDB4MDAgLSAweDNmICovCisjZGVmaW5lIEFfSVRSQU1fQ1RMKHgpCShBX1RBTktNRU1DVExSRUdCQVNFICsgMHgwMCArICh4KSkgLyogeCA9IDB4MDAgLSAweGJmICovCisjZGVmaW5lIEFfRVRSQU1fQ1RMKHgpCShBX1RBTktNRU1DVExSRUdCQVNFICsgMHhjMCArICh4KSkgLyogeCA9IDB4MDAgLSAweDNmICovCisKKyNkZWZpbmUgQV9GWEJVUyh4KQkoMHgwMCArICh4KSkJLyogeCA9IDB4MDAgLSAweDNmIEZYIGJ1c2VzICovCisjZGVmaW5lIEFfRVhUSU4oeCkJKDB4NDAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgwZiBwaHlzaWNhbCBpbnMgKi8KKyNkZWZpbmUgQV9QMTZWSU4oeCkJKDB4NTAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgwZiBwMTZ2IGlucyAoQTIgb25seSkgIkVNVTMyIGlucHV0cyIgKi8KKyNkZWZpbmUgQV9FWFRPVVQoeCkJKDB4NjAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgxZiBwaHlzaWNhbCBvdXRzIC0+IEFfRlhXQzEgMHg3OS03ZiB1bmtub3duICAgKi8KKyNkZWZpbmUgQV9GWEJVUzIoeCkJKDB4ODAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgxZiBleHRyYSBvdXRzIHVzZWQgZm9yIEVGWCBjYXB0dXJlIC0+IEFfRlhXQzIgKi8KKyNkZWZpbmUgQV9FTVUzMk9VVEgoeCkJKDB4YTAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgwZiAiRU1VMzJfT1VUXzEwIC0gXzFGIiAtID8/PyAqLworI2RlZmluZSBBX0VNVTMyT1VUTCh4KQkoMHhiMCArICh4KSkJLyogeCA9IDB4MDAgLSAweDBmICJFTVUzMl9PVVRfMSAtIF9GIiAtID8/PyAqLworI2RlZmluZSBBM19FTVUzMklOKHgpCSgweDE2MCArICh4KSkJLyogeCA9IDB4MDAgLSAweDNmICJFTVUzMl9JTl8wMCAtIF8zRiIgLSBPbmx5IHdoZW4gLmRldmljZSA9IDB4MDAwOCAqLworI2RlZmluZSBBM19FTVUzMk9VVCh4KQkoMHgxRTAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgwZiAiRU1VMzJfT1VUXzAwIC0gXzNGIiAtIE9ubHkgd2hlbiAuZGV2aWNlID0gMHgwMDA4ICovCisjZGVmaW5lIEFfR1BSKHgpCShBX0ZYR1BSRUdCQVNFICsgKHgpKQorCisvKiBjY19yZWcgY29uc3RhbnRzICovCisjZGVmaW5lIENDX1JFR19OT1JNQUxJWkVEIENfMDAwMDAwMDEKKyNkZWZpbmUgQ0NfUkVHX0JPUlJPVwlDXzAwMDAwMDAyCisjZGVmaW5lIENDX1JFR19NSU5VUwlDXzAwMDAwMDA0CisjZGVmaW5lIENDX1JFR19aRVJPCUNfMDAwMDAwMDgKKyNkZWZpbmUgQ0NfUkVHX1NBVFVSQVRFCUNfMDAwMDAwMTAKKyNkZWZpbmUgQ0NfUkVHX05PTlpFUk8JQ18wMDAwMDEwMAorCisvKiBGWCBidXNlcyAqLworI2RlZmluZSBGWEJVU19QQ01fTEVGVAkJMHgwMAorI2RlZmluZSBGWEJVU19QQ01fUklHSFQJCTB4MDEKKyNkZWZpbmUgRlhCVVNfUENNX0xFRlRfUkVBUgkweDAyCisjZGVmaW5lIEZYQlVTX1BDTV9SSUdIVF9SRUFSCTB4MDMKKyNkZWZpbmUgRlhCVVNfTUlESV9MRUZUCQkweDA0CisjZGVmaW5lIEZYQlVTX01JRElfUklHSFQJMHgwNQorI2RlZmluZSBGWEJVU19QQ01fQ0VOVEVSCTB4MDYKKyNkZWZpbmUgRlhCVVNfUENNX0xGRQkJMHgwNworI2RlZmluZSBGWEJVU19QQ01fTEVGVF9GUk9OVAkweDA4CisjZGVmaW5lIEZYQlVTX1BDTV9SSUdIVF9GUk9OVAkweDA5CisjZGVmaW5lIEZYQlVTX01JRElfUkVWRVJCCTB4MGMKKyNkZWZpbmUgRlhCVVNfTUlESV9DSE9SVVMJMHgwZAorI2RlZmluZSBGWEJVU19QQ01fTEVGVF9TSURFCTB4MGUKKyNkZWZpbmUgRlhCVVNfUENNX1JJR0hUX1NJREUJMHgwZgorI2RlZmluZSBGWEJVU19QVF9MRUZUCQkweDE0CisjZGVmaW5lIEZYQlVTX1BUX1JJR0hUCQkweDE1CisKKy8qIElucHV0cyAqLworI2RlZmluZSBFWFRJTl9BQzk3X0wJICAgMHgwMAkvKiBBQyc5NyBjYXB0dXJlIGNoYW5uZWwgLSBsZWZ0ICovCisjZGVmaW5lIEVYVElOX0FDOTdfUgkgICAweDAxCS8qIEFDJzk3IGNhcHR1cmUgY2hhbm5lbCAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVElOX1NQRElGX0NEX0wgICAweDAyCS8qIGludGVybmFsIFMvUERJRiBDRCAtIG9uYm9hcmQgLSBsZWZ0ICovCisjZGVmaW5lIEVYVElOX1NQRElGX0NEX1IgICAweDAzCS8qIGludGVybmFsIFMvUERJRiBDRCAtIG9uYm9hcmQgLSByaWdodCAqLworI2RlZmluZSBFWFRJTl9aT09NX0wJICAgMHgwNAkvKiBab29tIFZpZGVvIEkyUyAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUSU5fWk9PTV9SCSAgIDB4MDUJLyogWm9vbSBWaWRlbyBJMlMgLSByaWdodCAqLworI2RlZmluZSBFWFRJTl9UT1NMSU5LX0wJICAgMHgwNgkvKiBMaXZlRHJpdmUgLSBUT1NMaW5rIE9wdGljYWwgLSBsZWZ0ICovCisjZGVmaW5lIEVYVElOX1RPU0xJTktfUiAgICAweDA3CS8qIExpdmVEcml2ZSAtIFRPU0xpbmsgT3B0aWNhbCAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVElOX0xJTkUxX0wJICAgMHgwOAkvKiBMaXZlRHJpdmUgLSBMaW5lL01pYyAxIC0gbGVmdCAqLworI2RlZmluZSBFWFRJTl9MSU5FMV9SCSAgIDB4MDkJLyogTGl2ZURyaXZlIC0gTGluZS9NaWMgMSAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVElOX0NPQVhfU1BESUZfTCAweDBhCS8qIExpdmVEcml2ZSAtIENvYXhpYWwgUy9QRElGIC0gbGVmdCAqLworI2RlZmluZSBFWFRJTl9DT0FYX1NQRElGX1IgMHgwYiAvKiBMaXZlRHJpdmUgLSBDb2F4aWFsIFMvUERJRiAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVElOX0xJTkUyX0wJICAgMHgwYwkvKiBMaXZlRHJpdmUgLSBMaW5lL01pYyAyIC0gbGVmdCAqLworI2RlZmluZSBFWFRJTl9MSU5FMl9SCSAgIDB4MGQJLyogTGl2ZURyaXZlIC0gTGluZS9NaWMgMiAtIHJpZ2h0ICovCisKKy8qIE91dHB1dHMgKi8KKyNkZWZpbmUgRVhUT1VUX0FDOTdfTAkgICAweDAwCS8qIEFDJzk3IHBsYXliYWNrIGNoYW5uZWwgLSBsZWZ0ICovCisjZGVmaW5lIEVYVE9VVF9BQzk3X1IJICAgMHgwMQkvKiBBQyc5NyBwbGF5YmFjayBjaGFubmVsIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUT1VUX1RPU0xJTktfTCAgIDB4MDIJLyogTGl2ZURyaXZlIC0gVE9TTGluayBPcHRpY2FsIC0gbGVmdCAqLworI2RlZmluZSBFWFRPVVRfVE9TTElOS19SICAgMHgwMwkvKiBMaXZlRHJpdmUgLSBUT1NMaW5rIE9wdGljYWwgLSByaWdodCAqLworI2RlZmluZSBFWFRPVVRfQUM5N19DRU5URVIgMHgwNAkvKiBTQiBMaXZlIDUuMSAtIGNlbnRlciAqLworI2RlZmluZSBFWFRPVVRfQUM5N19MRkUJICAgMHgwNSAvKiBTQiBMaXZlIDUuMSAtIExGRSAqLworI2RlZmluZSBFWFRPVVRfSEVBRFBIT05FX0wgMHgwNgkvKiBMaXZlRHJpdmUgLSBIZWFkcGhvbmUgLSBsZWZ0ICovCisjZGVmaW5lIEVYVE9VVF9IRUFEUEhPTkVfUiAweDA3CS8qIExpdmVEcml2ZSAtIEhlYWRwaG9uZSAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVE9VVF9SRUFSX0wJICAgMHgwOAkvKiBSZWFyIGNoYW5uZWwgLSBsZWZ0ICovCisjZGVmaW5lIEVYVE9VVF9SRUFSX1IJICAgMHgwOQkvKiBSZWFyIGNoYW5uZWwgLSByaWdodCAqLworI2RlZmluZSBFWFRPVVRfQURDX0NBUF9MICAgMHgwYQkvKiBBREMgQ2FwdHVyZSBidWZmZXIgLSBsZWZ0ICovCisjZGVmaW5lIEVYVE9VVF9BRENfQ0FQX1IgICAweDBiCS8qIEFEQyBDYXB0dXJlIGJ1ZmZlciAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVE9VVF9NSUNfQ0FQCSAgIDB4MGMJLyogTUlDIENhcHR1cmUgYnVmZmVyICovCisjZGVmaW5lIEVYVE9VVF9BQzk3X1JFQVJfTCAweDBkCS8qIFNCIExpdmUgNS4xIChjKSAyMDAzIC0gUmVhciBMZWZ0ICovCisjZGVmaW5lIEVYVE9VVF9BQzk3X1JFQVJfUiAweDBlCS8qIFNCIExpdmUgNS4xIChjKSAyMDAzIC0gUmVhciBSaWdodCAqLworI2RlZmluZSBFWFRPVVRfQUNFTlRFUgkgICAweDExIC8qIEFuYWxvZyBDZW50ZXIgKi8KKyNkZWZpbmUgRVhUT1VUX0FMRkUJICAgMHgxMiAvKiBBbmFsb2cgTEZFICovCisKKy8qIEF1ZGlneSBJbnB1dHMgKi8KKyNkZWZpbmUgQV9FWFRJTl9BQzk3X0wJCTB4MDAJLyogQUMnOTcgY2FwdHVyZSBjaGFubmVsIC0gbGVmdCAqLworI2RlZmluZSBBX0VYVElOX0FDOTdfUgkJMHgwMQkvKiBBQyc5NyBjYXB0dXJlIGNoYW5uZWwgLSByaWdodCAqLworI2RlZmluZSBBX0VYVElOX1NQRElGX0NEX0wJMHgwMgkvKiBkaWdpdGFsIENEIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRJTl9TUERJRl9DRF9SCTB4MDMJLyogZGlnaXRhbCBDRCBsZWZ0ICovCisjZGVmaW5lIEFfRVhUSU5fT1BUX1NQRElGX0wgICAgIDB4MDQgICAgLyogYXVkaWd5IGRyaXZlIE9wdGljYWwgU1BESUYgLSBsZWZ0ICovCisjZGVmaW5lIEFfRVhUSU5fT1BUX1NQRElGX1IgICAgIDB4MDUgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAqLyAKKyNkZWZpbmUgQV9FWFRJTl9MSU5FMl9MCQkweDA4CS8qIGF1ZGlneSBkcml2ZSBsaW5lMi9taWMyIC0gbGVmdCAqLworI2RlZmluZSBBX0VYVElOX0xJTkUyX1IJCTB4MDkJLyogICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAqLworI2RlZmluZSBBX0VYVElOX0FEQ19MCQkweDBhICAgIC8qIFBoaWxpcHMgQURDIC0gbGVmdCAqLworI2RlZmluZSBBX0VYVElOX0FEQ19SCQkweDBiICAgIC8qICAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRJTl9BVVgyX0wJCTB4MGMJLyogYXVkaWd5IGRyaXZlIGF1eDIgLSBsZWZ0ICovCisjZGVmaW5lIEFfRVhUSU5fQVVYMl9SCQkweDBkCS8qICAgICAgICAgICAgICAgICAgIC0gcmlnaHQgKi8KKworLyogQXVkaWdpeSBPdXRwdXRzICovCisjZGVmaW5lIEFfRVhUT1VUX0ZST05UX0wJMHgwMAkvKiBkaWdpdGFsIGZyb250IGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfRlJPTlRfUgkweDAxCS8qICAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQ0VOVEVSCQkweDAyCS8qIGRpZ2l0YWwgZnJvbnQgY2VudGVyICovCisjZGVmaW5lIEFfRVhUT1VUX0xGRQkJMHgwMwkvKiBkaWdpdGFsIGZyb250IGxmZSAqLworI2RlZmluZSBBX0VYVE9VVF9IRUFEUEhPTkVfTAkweDA0CS8qIGhlYWRwaG9uZSBhdWRpZ3kgZHJpdmUgbGVmdCAqLworI2RlZmluZSBBX0VYVE9VVF9IRUFEUEhPTkVfUgkweDA1CS8qICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfUkVBUl9MCQkweDA2CS8qIGRpZ2l0YWwgcmVhciBsZWZ0ICovCisjZGVmaW5lIEFfRVhUT1VUX1JFQVJfUgkJMHgwNwkvKiAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQUZST05UX0wJMHgwOAkvKiBhbmFsb2cgZnJvbnQgbGVmdCAqLworI2RlZmluZSBBX0VYVE9VVF9BRlJPTlRfUgkweDA5CS8qICAgICAgICAgICAgICByaWdodCAqLworI2RlZmluZSBBX0VYVE9VVF9BQ0VOVEVSCTB4MGEJLyogYW5hbG9nIGNlbnRlciAqLworI2RlZmluZSBBX0VYVE9VVF9BTEZFCQkweDBiCS8qIGFuYWxvZyBMRkUgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQVNJREVfTAkweDBjCS8qIGFuYWxvZyBzaWRlIGxlZnQgIC0gQXVkaWd5IDIgWlMgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQVNJREVfUgkweDBkCS8qICAgICAgICAgICAgIHJpZ2h0IC0gQXVkaWd5IDIgWlMgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQVJFQVJfTAkweDBlCS8qIGFuYWxvZyByZWFyIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQVJFQVJfUgkweDBmCS8qICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUT1VUX0FDOTdfTAkJMHgxMAkvKiBBQzk3IGxlZnQgKGZyb250KSAqLworI2RlZmluZSBBX0VYVE9VVF9BQzk3X1IJCTB4MTEJLyogICAgICByaWdodCAqLworI2RlZmluZSBBX0VYVE9VVF9BRENfQ0FQX0wJMHgxNgkvKiBBREMgY2FwdHVyZSBidWZmZXIgbGVmdCAqLworI2RlZmluZSBBX0VYVE9VVF9BRENfQ0FQX1IJMHgxNwkvKiAgICAgICAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfTUlDX0NBUAkweDE4CS8qIE1pYyBjYXB0dXJlIGJ1ZmZlciAqLworCisvKiBBdWRpZ3kgY29uc3RhbnRzICovCisjZGVmaW5lIEFfQ18wMDAwMDAwMAkweGMwCisjZGVmaW5lIEFfQ18wMDAwMDAwMQkweGMxCisjZGVmaW5lIEFfQ18wMDAwMDAwMgkweGMyCisjZGVmaW5lIEFfQ18wMDAwMDAwMwkweGMzCisjZGVmaW5lIEFfQ18wMDAwMDAwNAkweGM0CisjZGVmaW5lIEFfQ18wMDAwMDAwOAkweGM1CisjZGVmaW5lIEFfQ18wMDAwMDAxMAkweGM2CisjZGVmaW5lIEFfQ18wMDAwMDAyMAkweGM3CisjZGVmaW5lIEFfQ18wMDAwMDEwMAkweGM4CisjZGVmaW5lIEFfQ18wMDAxMDAwMAkweGM5CisjZGVmaW5lIEFfQ18wMDAwMDgwMAkweGNhCisjZGVmaW5lIEFfQ18xMDAwMDAwMAkweGNiCisjZGVmaW5lIEFfQ18yMDAwMDAwMAkweGNjCisjZGVmaW5lIEFfQ180MDAwMDAwMAkweGNkCisjZGVmaW5lIEFfQ184MDAwMDAwMAkweGNlCisjZGVmaW5lIEFfQ183ZmZmZmZmZgkweGNmCisjZGVmaW5lIEFfQ19mZmZmZmZmZgkweGQwCisjZGVmaW5lIEFfQ19mZmZmZmZmZQkweGQxCisjZGVmaW5lIEFfQ19jMDAwMDAwMAkweGQyCisjZGVmaW5lIEFfQ180ZjFiYmNkYwkweGQzCisjZGVmaW5lIEFfQ181YTdlZjlkYgkweGQ0CisjZGVmaW5lIEFfQ18wMDEwMDAwMAkweGQ1CisjZGVmaW5lIEFfR1BSX0FDQ1UJMHhkNgkJLyogQUNDVU0sIGFjY3VtdWxhdG9yICovCisjZGVmaW5lIEFfR1BSX0NPTkQJMHhkNwkJLyogQ0NSLCBjb25kaXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQV9HUFJfTk9JU0UwCTB4ZDgJCS8qIG5vaXNlIHNvdXJjZSAqLworI2RlZmluZSBBX0dQUl9OT0lTRTEJMHhkOQkJLyogbm9pc2Ugc291cmNlICovCisjZGVmaW5lIEFfR1BSX0lSUQkweGRhCQkvKiBJUlEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQV9HUFJfREJBQwkweGRiCQkvKiBUUkFNIERlbGF5IEJhc2UgQWRkcmVzcyBDb3VudGVyIC0gaW50ZXJuYWwgKi8KKyNkZWZpbmUgQV9HUFJfREJBQ0UJMHhkZQkJLyogVFJBTSBEZWxheSBCYXNlIEFkZHJlc3MgQ291bnRlciAtIGV4dGVybmFsICovCisKKy8qIGRlZmluaXRpb25zIGZvciBkZWJ1ZyByZWdpc3RlciAqLworI2RlZmluZSBFTVUxMEsxX0RCR19aQwkJCTB4ODAwMDAwMDAJLyogemVybyB0cmFtIGNvdW50ZXIgKi8KKyNkZWZpbmUgRU1VMTBLMV9EQkdfU0FUVVJBVElPTl9PQ0NVUkVECTB4MDIwMDAwMDAJLyogc2F0dXJhdGlvbiBjb250cm9sICovCisjZGVmaW5lIEVNVTEwSzFfREJHX1NBVFVSQVRJT05fQUREUgkweDAxZmYwMDAwCS8qIHNhdHVyYXRpb24gYWRkcmVzcyAqLworI2RlZmluZSBFTVUxMEsxX0RCR19TSU5HTEVfU1RFUAkJMHgwMDAwODAwMAkvKiBzaW5nbGUgc3RlcCBtb2RlICovCisjZGVmaW5lIEVNVTEwSzFfREJHX1NURVAJCTB4MDAwMDQwMDAJLyogc3RhcnQgc2luZ2xlIHN0ZXAgKi8KKyNkZWZpbmUgRU1VMTBLMV9EQkdfQ09ORElUSU9OX0NPREUJMHgwMDAwM2UwMAkvKiBjb25kaXRpb24gY29kZSAqLworI2RlZmluZSBFTVUxMEsxX0RCR19TSU5HTEVfU1RFUF9BRERSCTB4MDAwMDAxZmYJLyogc2luZ2xlIHN0ZXAgYWRkcmVzcyAqLworCisvKiB0YW5rIG1lbW9yeSBhZGRyZXNzIGxpbmUgKi8KKyNkZWZpbmUgVEFOS01FTUFERFJSRUdfQUREUl9NQVNLIDB4MDAwZmZmZmYJLyogMjAgYml0IHRhbmsgYWRkcmVzcyBmaWVsZAkJCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX0NMRUFSCSAweDAwODAwMDAwCS8qIENsZWFyIHRhbmsgbWVtb3J5CQkJCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX0FMSUdOCSAweDAwNDAwMDAwCS8qIEFsaWduIHJlYWQgb3Igd3JpdGUgcmVsYXRpdmUgdG8gdGFuayBhY2Nlc3MJKi8KKyNkZWZpbmUgVEFOS01FTUFERFJSRUdfV1JJVEUJIDB4MDAyMDAwMDAJLyogV3JpdGUgdG8gdGFuayBtZW1vcnkJCQkJKi8KKyNkZWZpbmUgVEFOS01FTUFERFJSRUdfUkVBRAkgMHgwMDEwMDAwMAkvKiBSZWFkIGZyb20gdGFuayBtZW1vcnkJCQkqLworCitzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2luZm8geworCXVuc2lnbmVkIGludCBpbnRlcm5hbF90cmFtX3NpemU7CS8qIGluIHNhbXBsZXMgKi8KKwl1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfdHJhbV9zaXplOwkvKiBpbiBzYW1wbGVzICovCisJY2hhciBmeGJ1c19uYW1lc1sxNl1bMzJdOwkJLyogbmFtZXMgb2YgRlhCVVNlcyAqLworCWNoYXIgZXh0aW5fbmFtZXNbMTZdWzMyXTsJCS8qIG5hbWVzIG9mIGV4dGVybmFsIGlucHV0cyAqLworCWNoYXIgZXh0b3V0X25hbWVzWzMyXVszMl07CQkvKiBuYW1lcyBvZiBleHRlcm5hbCBvdXRwdXRzICovCisJdW5zaWduZWQgaW50IGdwcl9jb250cm9sczsJCS8qIGNvdW50IG9mIEdQUiBjb250cm9scyAqLworfTsKKworI2RlZmluZSBFTVUxMEsxX0dQUl9UUkFOU0xBVElPTl9OT05FCQkwCisjZGVmaW5lIEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX1RBQkxFMTAwCTEKKyNkZWZpbmUgRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fQkFTUwkJMgorI2RlZmluZSBFTVUxMEsxX0dQUl9UUkFOU0xBVElPTl9UUkVCTEUJCTMKKyNkZWZpbmUgRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fT05PRkYJCTQKKworc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwciB7CisJc3RydWN0IHNuZF9jdGxfZWxlbV9pZCBpZDsJCS8qIGZ1bGwgY29udHJvbCBJRCBkZWZpbml0aW9uICovCisJdW5zaWduZWQgaW50IHZjb3VudDsJCS8qIHZpc2libGUgY291bnQgKi8KKwl1bnNpZ25lZCBpbnQgY291bnQ7CQkvKiBjb3VudCBvZiBHUFIgKDEuLjE2KSAqLworCXVuc2lnbmVkIHNob3J0IGdwclszMl07CQkvKiBHUFIgbnVtYmVyKHMpICovCisJdW5zaWduZWQgaW50IHZhbHVlWzMyXTsJCS8qIGluaXRpYWwgdmFsdWVzICovCisJdW5zaWduZWQgaW50IG1pbjsJCS8qIG1pbmltdW0gcmFuZ2UgKi8KKwl1bnNpZ25lZCBpbnQgbWF4OwkJLyogbWF4aW11bSByYW5nZSAqLworCXVuc2lnbmVkIGludCB0cmFuc2xhdGlvbjsJLyogdHJhbnNsYXRpb24gdHlwZSAoRU1VMTBLMV9HUFJfVFJBTlNMQVRJT04qKSAqLworCWNvbnN0IHVuc2lnbmVkIGludCAqdGx2OworfTsKKworLyogb2xkIEFCSSB3aXRob3V0IFRMViBzdXBwb3J0ICovCitzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfb2xkX2dwciB7CisJc3RydWN0IHNuZF9jdGxfZWxlbV9pZCBpZDsKKwl1bnNpZ25lZCBpbnQgdmNvdW50OworCXVuc2lnbmVkIGludCBjb3VudDsKKwl1bnNpZ25lZCBzaG9ydCBncHJbMzJdOworCXVuc2lnbmVkIGludCB2YWx1ZVszMl07CisJdW5zaWduZWQgaW50IG1pbjsKKwl1bnNpZ25lZCBpbnQgbWF4OworCXVuc2lnbmVkIGludCB0cmFuc2xhdGlvbjsKK307CisKK3N0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29kZSB7CisJY2hhciBuYW1lWzEyOF07CisKKwlERUNMQVJFX0JJVE1BUChncHJfdmFsaWQsIDB4MjAwKTsgLyogYml0bWFzayBvZiB2YWxpZCBpbml0aWFsaXplcnMgKi8KKwlfX3UzMiAqZ3ByX21hcDsJCS8qIGluaXRpYWxpemVycyAqLworCisJdW5zaWduZWQgaW50IGdwcl9hZGRfY29udHJvbF9jb3VudDsgLyogY291bnQgb2YgR1BSIGNvbnRyb2xzIHRvIGFkZC9yZXBsYWNlICovCisJc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwciAqZ3ByX2FkZF9jb250cm9sczsgLyogR1BSIGNvbnRyb2xzIHRvIGFkZC9yZXBsYWNlICovCisKKwl1bnNpZ25lZCBpbnQgZ3ByX2RlbF9jb250cm9sX2NvdW50OyAvKiBjb3VudCBvZiBHUFIgY29udHJvbHMgdG8gcmVtb3ZlICovCisJc3RydWN0IHNuZF9jdGxfZWxlbV9pZCAqZ3ByX2RlbF9jb250cm9sczsgLyogSURzIG9mIEdQUiBjb250cm9scyB0byByZW1vdmUgKi8KKworCXVuc2lnbmVkIGludCBncHJfbGlzdF9jb250cm9sX2NvdW50OyAvKiBjb3VudCBvZiBHUFIgY29udHJvbHMgdG8gbGlzdCAqLworCXVuc2lnbmVkIGludCBncHJfbGlzdF9jb250cm9sX3RvdGFsOyAvKiB0b3RhbCBjb3VudCBvZiBHUFIgY29udHJvbHMgKi8KKwlzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByICpncHJfbGlzdF9jb250cm9sczsgLyogbGlzdGVkIEdQUiBjb250cm9scyAqLworCisJREVDTEFSRV9CSVRNQVAodHJhbV92YWxpZCwgMHgxMDApOyAvKiBiaXRtYXNrIG9mIHZhbGlkIGluaXRpYWxpemVycyAqLworCV9fdTMyICp0cmFtX2RhdGFfbWFwOwkgIC8qIGRhdGEgaW5pdGlhbGl6ZXJzICovCisJX191MzIgKnRyYW1fYWRkcl9tYXA7CSAgLyogbWFwIGluaXRpYWxpemVycyAqLworCisJREVDTEFSRV9CSVRNQVAoY29kZV92YWxpZCwgMTAyNCk7IC8qIGJpdG1hc2sgb2YgdmFsaWQgaW5zdHJ1Y3Rpb25zICovCisJX191MzIgKmNvZGU7CQkgIC8qIG9uZSBpbnN0cnVjdGlvbiAtIDY0IGJpdHMgKi8KK307CisKK3N0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfdHJhbSB7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CQkvKiAzMS5iaXQgPT0gMSAtPiBleHRlcm5hbCBUUkFNICovCisJdW5zaWduZWQgaW50IHNpemU7CQkvKiBzaXplIGluIHNhbXBsZXMgKDQgYnl0ZXMpICovCisJdW5zaWduZWQgaW50ICpzYW1wbGVzOwkJLyogcG9pbnRlciB0byBzYW1wbGVzICgyMC1iaXQpICovCisJCQkJCS8qIE5VTEwtPmNsZWFyIG1lbW9yeSAqLworfTsKKworc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9wY21fcmVjIHsKKwl1bnNpZ25lZCBpbnQgc3Vic3RyZWFtOwkJLyogc3Vic3RyZWFtIG51bWJlciAqLworCXVuc2lnbmVkIGludCByZXMxOwkJLyogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBpbnQgY2hhbm5lbHM7CQkvKiAxNi1iaXQgY2hhbm5lbHMgY291bnQsIHplcm8gPSByZW1vdmUgdGhpcyBzdWJzdHJlYW0gKi8KKwl1bnNpZ25lZCBpbnQgdHJhbV9zdGFydDsJLyogcmluZyBidWZmZXIgcG9zaXRpb24gaW4gVFJBTSAoaW4gc2FtcGxlcykgKi8KKwl1bnNpZ25lZCBpbnQgYnVmZmVyX3NpemU7CS8qIGNvdW50IG9mIGJ1ZmZlcmVkIHNhbXBsZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJfc2l6ZTsJCS8qIEdQUiBjb250YWluaW5nIHNpemUgb2YgcmluZ2J1ZmZlciBpbiBzYW1wbGVzIChob3N0KSAqLworCXVuc2lnbmVkIHNob3J0IGdwcl9wdHI7CQkvKiBHUFIgY29udGFpbmluZyBjdXJyZW50IHBvaW50ZXIgaW4gdGhlIHJpbmcgYnVmZmVyIChob3N0ID0gcmVzZXQsIEZYODAxMCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJfY291bnQ7CS8qIEdQUiBjb250YWluaW5nIGNvdW50IG9mIHNhbXBsZXMgYmV0d2VlbiB0d28gaW50ZXJydXB0cyAoaG9zdCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJfdG1wY291bnQ7CS8qIEdQUiBjb250YWluaW5nIGN1cnJlbnQgY291bnQgb2Ygc2FtcGxlcyB0byBpbnRlcnJ1cHQgKGhvc3QgPSBzZXQsIEZYODAxMCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJfdHJpZ2dlcjsJLyogR1BSIGNvbnRhaW5pbmcgdHJpZ2dlciAoYWN0aXZhdGUpIGluZm9ybWF0aW9uIChob3N0KSAqLworCXVuc2lnbmVkIHNob3J0IGdwcl9ydW5uaW5nOwkvKiBHUFIgY29udGFpbmluZyBpbmZvIGlmIFBDTSBpcyBydW5uaW5nIChGWDgwMTApICovCisJdW5zaWduZWQgY2hhciBwYWQ7CQkvKiByZXNlcnZlZCAqLworCXVuc2lnbmVkIGNoYXIgZXRyYW1bMzJdOwkvKiBleHRlcm5hbCBUUkFNIGFkZHJlc3MgJiBkYXRhIChvbmUgcGVyIGNoYW5uZWwpICovCisJdW5zaWduZWQgaW50IHJlczI7CQkvKiByZXNlcnZlZCAqLworfTsKKworI2RlZmluZSBTTkRSVl9FTVUxMEsxX1ZFUlNJT04JCVNORFJWX1BST1RPQ09MX1ZFUlNJT04oMSwgMCwgMSkKKworI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0lORk8JX0lPUiAoJ0gnLCAweDEwLCBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2luZm8pCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfQ09ERV9QT0tFCV9JT1cgKCdIJywgMHgxMSwgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb2RlKQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0NPREVfUEVFSwlfSU9XUignSCcsIDB4MTIsIHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29kZSkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9UUkFNX1NFVFVQCV9JT1cgKCdIJywgMHgyMCwgaW50KQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1RSQU1fUE9LRQlfSU9XICgnSCcsIDB4MjEsIHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfdHJhbSkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9UUkFNX1BFRUsJX0lPV1IoJ0gnLCAweDIyLCBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX3RyYW0pCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfUENNX1BPS0UJX0lPVyAoJ0gnLCAweDMwLCBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX3BjbV9yZWMpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfUENNX1BFRUsJX0lPV1IoJ0gnLCAweDMxLCBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX3BjbV9yZWMpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfUFZFUlNJT04JX0lPUiAoJ0gnLCAweDQwLCBpbnQpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfU1RPUAlfSU8gICgnSCcsIDB4ODApCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfQ09OVElOVUUJX0lPICAoJ0gnLCAweDgxKQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1pFUk9fVFJBTV9DT1VOVEVSIF9JTyAoJ0gnLCAweDgyKQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1NJTkdMRV9TVEVQCV9JT1cgKCdIJywgMHg4MywgaW50KQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0RCR19SRUFECV9JT1IgKCdIJywgMHg4NCwgaW50KQorCisvKiB0eXBlZGVmcyBmb3IgY29tcGF0aWJpbGl0eSB0byB1c2VyLXNwYWNlICovCit0eXBlZGVmIHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfaW5mbyBlbXUxMGsxX2Z4ODAxMF9pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHIgZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHJfdDsKK3R5cGVkZWYgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb2RlIGVtdTEwazFfZng4MDEwX2NvZGVfdDsKK3R5cGVkZWYgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF90cmFtIGVtdTEwazFfZng4MDEwX3RyYW1fdDsKK3R5cGVkZWYgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9wY21fcmVjIGVtdTEwazFfZng4MDEwX3BjbV90OworCisjZW5kaWYJLyogX19TT1VORF9FTVUxMEsxX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvaGRzcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9oZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiMTFhNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvaGRzcC5oCkBAIC0wLDAgKzEsMTEwIEBACisjaWZuZGVmIF9fU09VTkRfSERTUF9ICisjZGVmaW5lIF9fU09VTkRfSERTUF9ICisKKy8qCisgKiAgIENvcHlyaWdodCAoQykgMjAwMyBUaG9tYXMgQ2hhcmJvbm5lbCAodGhvbWFzQHVuZGF0YS5vcmcpCisgKiAgICAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBIRFNQX01BVFJJWF9NSVhFUl9TSVpFIDIwNDgKKworZW51bSBIRFNQX0lPX1R5cGUgeworCURpZ2lmYWNlLAorCU11bHRpZmFjZSwKKwlIOTY1MiwKKwlIOTYzMiwKKwlSUE0sCisJVW5kZWZpbmVkLAorfTsKKworc3RydWN0IGhkc3BfcGVha19ybXMgeworCV9fdTMyIGlucHV0X3BlYWtzWzI2XTsKKwlfX3UzMiBwbGF5YmFja19wZWFrc1syNl07CisJX191MzIgb3V0cHV0X3BlYWtzWzI4XTsKKwlfX3U2NCBpbnB1dF9ybXNbMjZdOworCV9fdTY0IHBsYXliYWNrX3Jtc1syNl07CisJLyogVGhlc2UgYXJlIG9ubHkgdXNlZCBmb3IgSDk2eHggY2FyZHMgKi8KKwlfX3U2NCBvdXRwdXRfcm1zWzI2XTsKK307CisKKyNkZWZpbmUgU05EUlZfSERTUF9JT0NUTF9HRVRfUEVBS19STVMgX0lPUignSCcsIDB4NDAsIHN0cnVjdCBoZHNwX3BlYWtfcm1zKQorCitzdHJ1Y3QgaGRzcF9jb25maWdfaW5mbyB7CisJdW5zaWduZWQgY2hhciBwcmVmX3N5bmNfcmVmOworCXVuc2lnbmVkIGNoYXIgd29yZGNsb2NrX3N5bmNfY2hlY2s7CisJdW5zaWduZWQgY2hhciBzcGRpZl9zeW5jX2NoZWNrOworCXVuc2lnbmVkIGNoYXIgYWRhdHN5bmNfc3luY19jaGVjazsKKwl1bnNpZ25lZCBjaGFyIGFkYXRfc3luY19jaGVja1szXTsKKwl1bnNpZ25lZCBjaGFyIHNwZGlmX2luOworCXVuc2lnbmVkIGNoYXIgc3BkaWZfb3V0OworCXVuc2lnbmVkIGNoYXIgc3BkaWZfcHJvZmVzc2lvbmFsOworCXVuc2lnbmVkIGNoYXIgc3BkaWZfZW1waGFzaXM7CisJdW5zaWduZWQgY2hhciBzcGRpZl9ub25hdWRpbzsKKwl1bnNpZ25lZCBpbnQgc3BkaWZfc2FtcGxlX3JhdGU7CisJdW5zaWduZWQgaW50IHN5c3RlbV9zYW1wbGVfcmF0ZTsKKwl1bnNpZ25lZCBpbnQgYXV0b3N5bmNfc2FtcGxlX3JhdGU7CisJdW5zaWduZWQgY2hhciBzeXN0ZW1fY2xvY2tfbW9kZTsKKwl1bnNpZ25lZCBjaGFyIGNsb2NrX3NvdXJjZTsKKwl1bnNpZ25lZCBjaGFyIGF1dG9zeW5jX3JlZjsKKwl1bnNpZ25lZCBjaGFyIGxpbmVfb3V0OworCXVuc2lnbmVkIGNoYXIgcGFzc3RocnU7IAorCXVuc2lnbmVkIGNoYXIgZGFfZ2FpbjsKKwl1bnNpZ25lZCBjaGFyIGFkX2dhaW47CisJdW5zaWduZWQgY2hhciBwaG9uZV9nYWluOworCXVuc2lnbmVkIGNoYXIgeGxyX2JyZWFrb3V0X2NhYmxlOworCXVuc2lnbmVkIGNoYXIgYW5hbG9nX2V4dGVuc2lvbl9ib2FyZDsKK307CisKKyNkZWZpbmUgU05EUlZfSERTUF9JT0NUTF9HRVRfQ09ORklHX0lORk8gX0lPUignSCcsIDB4NDEsIHN0cnVjdCBoZHNwX2NvbmZpZ19pbmZvKQorCitzdHJ1Y3QgaGRzcF9maXJtd2FyZSB7CisJdm9pZCAqZmlybXdhcmVfZGF0YTsJLyogMjQ0MTMgeCA0IGJ5dGVzICovCit9OworCisjZGVmaW5lIFNORFJWX0hEU1BfSU9DVExfVVBMT0FEX0ZJUk1XQVJFIF9JT1coJ0gnLCAweDQyLCBzdHJ1Y3QgaGRzcF9maXJtd2FyZSkKKworc3RydWN0IGhkc3BfdmVyc2lvbiB7CisJZW51bSBIRFNQX0lPX1R5cGUgaW9fdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBmaXJtd2FyZV9yZXY7Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BfSU9DVExfR0VUX1ZFUlNJT04gX0lPUignSCcsIDB4NDMsIHN0cnVjdCBoZHNwX3ZlcnNpb24pCisKK3N0cnVjdCBoZHNwX21peGVyIHsKKwl1bnNpZ25lZCBzaG9ydCBtYXRyaXhbSERTUF9NQVRSSVhfTUlYRVJfU0laRV07Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BfSU9DVExfR0VUX01JWEVSIF9JT1IoJ0gnLCAweDQ0LCBzdHJ1Y3QgaGRzcF9taXhlcikKKworc3RydWN0IGhkc3BfOTYzMl9hZWIgeworCWludCBhZWJpOworCWludCBhZWJvOworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF85NjMyX0FFQiBfSU9SKCdIJywgMHg0NSwgc3RydWN0IGhkc3BfOTYzMl9hZWIpCisKKy8qIHR5cGVkZWZzIGZvciBjb21wYXRpYmlsaXR5IHRvIHVzZXItc3BhY2UgKi8KK3R5cGVkZWYgZW51bSBIRFNQX0lPX1R5cGUgSERTUF9JT19UeXBlOwordHlwZWRlZiBzdHJ1Y3QgaGRzcF9wZWFrX3JtcyBoZHNwX3BlYWtfcm1zX3Q7Cit0eXBlZGVmIHN0cnVjdCBoZHNwX2NvbmZpZ19pbmZvIGhkc3BfY29uZmlnX2luZm9fdDsKK3R5cGVkZWYgc3RydWN0IGhkc3BfZmlybXdhcmUgaGRzcF9maXJtd2FyZV90OwordHlwZWRlZiBzdHJ1Y3QgaGRzcF92ZXJzaW9uIGhkc3BfdmVyc2lvbl90OwordHlwZWRlZiBzdHJ1Y3QgaGRzcF9taXhlciBoZHNwX21peGVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBoZHNwXzk2MzJfYWViIGhkc3BfOTYzMl9hZWJfdDsKKworI2VuZGlmIC8qIF9fU09VTkRfSERTUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL2hkc3BtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL2hkc3BtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1OWVhMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvaGRzcG0uaApAQCAtMCwwICsxLDIyOSBAQAorI2lmbmRlZiBfX1NPVU5EX0hEU1BNX0gKKyNkZWZpbmUgX19TT1VORF9IRFNQTV9ICisvKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDMgV2luZnJpZWQgUml0c2NoIChJRU0pCisgKiAgIGJhc2VkIG9uIGhkc3AuaCBmcm9tIFRob21hcyBDaGFyYm9ubmVsICh0aG9tYXNAdW5kYXRhLm9yZykKKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qIE1heGltdW0gY2hhbm5lbHMgaXMgNjQgZXZlbiBvbiA1Nk1vZGUgeW91IGhhdmUgNjRwbGF5YmFja3MgdG8gbWF0cml4ICovCisjZGVmaW5lIEhEU1BNX01BWF9DSEFOTkVMUyAgICAgIDY0CisKK2VudW0gaGRzcG1faW9fdHlwZSB7CisJTUFESSwKKwlNQURJZmFjZSwKKwlBSU8sCisJQUVTMzIsCisJUmF5REFUCit9OworCitlbnVtIGhkc3BtX3NwZWVkIHsKKwlzcywKKwlkcywKKwlxcworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU9DVEwgUGVhay9STVMgTWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBoZHNwbV9wZWFrX3JtcyB7CisJdWludDMyX3QgaW5wdXRfcGVha3NbNjRdOworCXVpbnQzMl90IHBsYXliYWNrX3BlYWtzWzY0XTsKKwl1aW50MzJfdCBvdXRwdXRfcGVha3NbNjRdOworCisJdWludDY0X3QgaW5wdXRfcm1zWzY0XTsKKwl1aW50NjRfdCBwbGF5YmFja19ybXNbNjRdOworCXVpbnQ2NF90IG91dHB1dF9ybXNbNjRdOworCisJdWludDhfdCBzcGVlZDsgLyogZW51bSB7c3MsIGRzLCBxc30gKi8KKwlpbnQgc3RhdHVzMjsKK307CisKKyNkZWZpbmUgU05EUlZfSERTUE1fSU9DVExfR0VUX1BFQUtfUk1TIFwKKwlfSU9SKCdIJywgMHg0Miwgc3RydWN0IGhkc3BtX3BlYWtfcm1zKQorCisvKiAtLS0tLS0tLS0tLS0gQ09ORklHIGJsb2NrIElPQ1RMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGhkc3BtX2NvbmZpZyB7CisJdW5zaWduZWQgY2hhciBwcmVmX3N5bmNfcmVmOworCXVuc2lnbmVkIGNoYXIgd29yZGNsb2NrX3N5bmNfY2hlY2s7CisJdW5zaWduZWQgY2hhciBtYWRpX3N5bmNfY2hlY2s7CisJdW5zaWduZWQgaW50IHN5c3RlbV9zYW1wbGVfcmF0ZTsKKwl1bnNpZ25lZCBpbnQgYXV0b3N5bmNfc2FtcGxlX3JhdGU7CisJdW5zaWduZWQgY2hhciBzeXN0ZW1fY2xvY2tfbW9kZTsKKwl1bnNpZ25lZCBjaGFyIGNsb2NrX3NvdXJjZTsKKwl1bnNpZ25lZCBjaGFyIGF1dG9zeW5jX3JlZjsKKwl1bnNpZ25lZCBjaGFyIGxpbmVfb3V0OworCXVuc2lnbmVkIGludCBwYXNzdGhydTsKKwl1bnNpZ25lZCBpbnQgYW5hbG9nX291dDsKK307CisKKyNkZWZpbmUgU05EUlZfSERTUE1fSU9DVExfR0VUX0NPTkZJRyBcCisJX0lPUignSCcsIDB4NDEsIHN0cnVjdCBoZHNwbV9jb25maWcpCisKKy8qKgorICogSWYgdGhlcmUncyBhIFRDTyAoVGltZUNvZGUgT3B0aW9uKSBib2FyZCBpbnN0YWxsZWQsCisgKiB0aGVyZSBhcmUgZnVydGhlciBvcHRpb25zIGFuZCBzdGF0dXMgZGF0YSBhdmFpbGFibGUuCisgKiBUaGUgaGRzcG1fbHRjIHN0cnVjdHVyZSBjb250YWlucyB0aGUgY3VycmVudCBTTVBURQorICogdGltZWNvZGUgYW5kIHNvbWUgc3RhdHVzIGluZm9ybWF0aW9uIGFuZCBjYW4gYmUKKyAqIG9idGFpbmVkIHZpYSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfTFRDIG9yIGluIHRoZQorICogaGRzcG1fc3RhdHVzIHN0cnVjdC4KKyAqKi8KKworZW51bSBoZHNwbV9sdGNfZm9ybWF0IHsKKwlmb3JtYXRfaW52YWxpZCwKKwlmcHNfMjQsCisJZnBzXzI1LAorCWZwc18yOTk3LAorCWZwc18zMAorfTsKKworZW51bSBoZHNwbV9sdGNfZnJhbWUgeworCWZyYW1lX2ludmFsaWQsCisJZHJvcF9mcmFtZSwKKwlmdWxsX2ZyYW1lCit9OworCitlbnVtIGhkc3BtX2x0Y19pbnB1dF9mb3JtYXQgeworCW50c2MsCisJcGFsLAorCW5vX3ZpZGVvCit9OworCitzdHJ1Y3QgaGRzcG1fbHRjIHsKKwl1bnNpZ25lZCBpbnQgbHRjOworCisJZW51bSBoZHNwbV9sdGNfZm9ybWF0IGZvcm1hdDsKKwllbnVtIGhkc3BtX2x0Y19mcmFtZSBmcmFtZTsKKwllbnVtIGhkc3BtX2x0Y19pbnB1dF9mb3JtYXQgaW5wdXRfZm9ybWF0OworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfTFRDIF9JT1IoJ0gnLCAweDQ2LCBzdHJ1Y3QgaGRzcG1fbWl4ZXJfaW9jdGwpCisKKy8qKgorICogVGhlIHN0YXR1cyBkYXRhIHJlZmxlY3RzIHRoZSBkZXZpY2UncyBjdXJyZW50IHN0YXRlCisgKiBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBjYXJkJ3MgY29uZmlndXJhdGlvbiBhbmQKKyAqIGNvbm5lY3Rpb24gc3RhdHVzLgorICoqLworCitlbnVtIGhkc3BtX3N5bmMgeworCWhkc3BtX3N5bmNfbm9fbG9jayA9IDAsCisJaGRzcG1fc3luY19sb2NrID0gMSwKKwloZHNwbV9zeW5jX3N5bmMgPSAyCit9OworCitlbnVtIGhkc3BtX21hZGlfaW5wdXQgeworCWhkc3BtX2lucHV0X29wdGljYWwgPSAwLAorCWhkc3BtX2lucHV0X2NvYXggPSAxCit9OworCitlbnVtIGhkc3BtX21hZGlfY2hhbm5lbF9mb3JtYXQgeworCWhkc3BtX2Zvcm1hdF9jaF82NCA9IDAsCisJaGRzcG1fZm9ybWF0X2NoXzU2ID0gMQorfTsKKworZW51bSBoZHNwbV9tYWRpX2ZyYW1lX2Zvcm1hdCB7CisJaGRzcG1fZnJhbWVfNDggPSAwLAorCWhkc3BtX2ZyYW1lXzk2ID0gMQorfTsKKworZW51bSBoZHNwbV9zeW5jc291cmNlIHsKKwlzeW5jc291cmNlX3djID0gMCwKKwlzeW5jc291cmNlX21hZGkgPSAxLAorCXN5bmNzb3VyY2VfdGNvID0gMiwKKwlzeW5jc291cmNlX3N5bmMgPSAzLAorCXN5bmNzb3VyY2Vfbm9uZSA9IDQKK307CisKK3N0cnVjdCBoZHNwbV9zdGF0dXMgeworCXVpbnQ4X3QgY2FyZF90eXBlOyAvKiBlbnVtIGhkc3BtX2lvX3R5cGUgKi8KKwllbnVtIGhkc3BtX3N5bmNzb3VyY2UgYXV0b3N5bmNfc291cmNlOworCisJdWludDY0X3QgY2FyZF9jbG9jazsKKwl1aW50MzJfdCBtYXN0ZXJfcGVyaW9kOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBzeW5jX3djOyAvKiBlbnVtIGhkc3BtX3N5bmMgKi8KKwkJCXVpbnQ4X3Qgc3luY19tYWRpOyAvKiBlbnVtIGhkc3BtX3N5bmMgKi8KKwkJCXVpbnQ4X3Qgc3luY190Y287IC8qIGVudW0gaGRzcG1fc3luYyAqLworCQkJdWludDhfdCBzeW5jX2luOyAvKiBlbnVtIGhkc3BtX3N5bmMgKi8KKwkJCXVpbnQ4X3QgbWFkaV9pbnB1dDsgLyogZW51bSBoZHNwbV9tYWRpX2lucHV0ICovCisJCQl1aW50OF90IGNoYW5uZWxfZm9ybWF0OyAvKiBlbnVtIGhkc3BtX21hZGlfY2hhbm5lbF9mb3JtYXQgKi8KKwkJCXVpbnQ4X3QgZnJhbWVfZm9ybWF0OyAvKiBlbnVtIGhkc3BtX21hZGlfZnJhbWVfZm9ybWF0ICovCisJCX0gbWFkaTsKKwl9IGNhcmRfc3BlY2lmaWM7Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BNX0lPQ1RMX0dFVF9TVEFUVVMgXAorCV9JT1IoJ0gnLCAweDQ3LCBzdHJ1Y3QgaGRzcG1fc3RhdHVzKQorCisvKioKKyAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FyZCBhbmQgaXRzIGFkZC1vbnMuCisgKiovCisKKyNkZWZpbmUgSERTUE1fQURET05fVENPIDEKKworc3RydWN0IGhkc3BtX3ZlcnNpb24geworCXVpbnQ4X3QgY2FyZF90eXBlOyAvKiBlbnVtIGhkc3BtX2lvX3R5cGUgKi8KKwljaGFyIGNhcmRuYW1lWzIwXTsKKwl1bnNpZ25lZCBpbnQgc2VyaWFsOworCXVuc2lnbmVkIHNob3J0IGZpcm13YXJlX3JldjsKKwlpbnQgYWRkb25zOworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfVkVSU0lPTiBfSU9SKCdIJywgMHg0OCwgc3RydWN0IGhkc3BtX3ZlcnNpb24pCisKKy8qIC0tLS0tLS0tLS0tLS0gZ2V0IE1hdHJpeCBNaXhlciBJT0NUTCAtLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTUFESSBtaXhlcjogNjRpbnB1dHMrNjRwbGF5YmFjayBpbiA2NG91dHB1dHMgPSA4MTkyID0+ICo0Qnl0ZSA9CisgKiAzMjc2OCBCeXRlcworICovCisKKy8qIG9yZ2FuaXNhdGlvbiBpcyA2NCBjaGFubmVsZmFkZXIgaW4gYSBjb250aW51b3VzIG1lbW9yeSBibG9jayAqLworLyogZXF1aXZhbGVudCB0byBoYXJkd2FyZSBkZWZpbml0aW9uLCBtYXliZSBmb3IgZnV0dXJlIGZlYXR1cmUgb2YgbW1hcCBvZgorICogdGhlbQorICovCisvKiBlYWNoIG9mIDY0IG91dHB1dHMgaGFzIDY0IGluZmFkZXIgYW5kIDY0IG91dGZhZGVyOgorICAgSW5zIHRvIE91dHMgbWl4ZXJbb3V0XS5pbltpbl0sIE91dHN0cmVhbXMgdG8gT3V0cyBtaXhlcltvdXRdLnBiW3BiXSAqLworCisjZGVmaW5lIEhEU1BNX01JWEVSX0NIQU5ORUxTIEhEU1BNX01BWF9DSEFOTkVMUworCitzdHJ1Y3QgaGRzcG1fY2hhbm5lbGZhZGVyIHsKKwl1bnNpZ25lZCBpbnQgaW5bSERTUE1fTUlYRVJfQ0hBTk5FTFNdOworCXVuc2lnbmVkIGludCBwYltIRFNQTV9NSVhFUl9DSEFOTkVMU107Cit9OworCitzdHJ1Y3QgaGRzcG1fbWl4ZXIgeworCXN0cnVjdCBoZHNwbV9jaGFubmVsZmFkZXIgY2hbSERTUE1fTUlYRVJfQ0hBTk5FTFNdOworfTsKKworc3RydWN0IGhkc3BtX21peGVyX2lvY3RsIHsKKwlzdHJ1Y3QgaGRzcG1fbWl4ZXIgKm1peGVyOworfTsKKworLyogdXNlIGluZGlyZWN0IGFjY2VzcyBkdWUgdG8gdGhlIGxpbWl0IG9mIGlvY3RsIGJpdCBzaXplICovCisjZGVmaW5lIFNORFJWX0hEU1BNX0lPQ1RMX0dFVF9NSVhFUiBfSU9SKCdIJywgMHg0NCwgc3RydWN0IGhkc3BtX21peGVyX2lvY3RsKQorCisvKiB0eXBlZGVmcyBmb3IgY29tcGF0aWJpbGl0eSB0byB1c2VyLXNwYWNlICovCit0eXBlZGVmIHN0cnVjdCBoZHNwbV9wZWFrX3JtcyBoZHNwbV9wZWFrX3Jtc190OwordHlwZWRlZiBzdHJ1Y3QgaGRzcG1fY29uZmlnX2luZm8gaGRzcG1fY29uZmlnX2luZm9fdDsKK3R5cGVkZWYgc3RydWN0IGhkc3BtX3ZlcnNpb24gaGRzcG1fdmVyc2lvbl90OwordHlwZWRlZiBzdHJ1Y3QgaGRzcG1fY2hhbm5lbGZhZGVyIHNuZF9oZHNwbV9jaGFubmVsZmFkZXJfdDsKK3R5cGVkZWYgc3RydWN0IGhkc3BtX21peGVyIGhkc3BtX21peGVyX3Q7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL3NiMTZfY3NwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL3NiMTZfY3NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0MmViOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvc2IxNl9jc3AuaApAQCAtMCwwICsxLDEyMiBAQAorI2lmbmRlZiBfX1NPVU5EX1NCMTZfQ1NQX0gKKyNkZWZpbmUgX19TT1VORF9TQjE2X0NTUF9ICisKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IGJ5IFVyb3MgQml6amFrIDx1cm9zQGtzcy1sb2thLnNpPgorICogICAgICAgICAgICAgICAgICAgICAgICBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogIFNCMTZBU1AvQVdFMzIgQ1NQIGNvbnRyb2wKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IAorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisvKiBDU1AgbW9kZXMgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX01PREVfTk9ORQkJMHgwMAorI2RlZmluZSBTTkRSVl9TQl9DU1BfTU9ERV9EU1BfUkVBRAkweDAxCS8qIFJlY29yZCBmcm9tIERTUCAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfTU9ERV9EU1BfV1JJVEUJMHgwMgkvKiBQbGF5IHRvIERTUCAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfTU9ERV9RU09VTkQJCTB4MDQJLyogUVNvdW5kICovCisKKy8qIENTUCBsb2FkIGZsYWdzICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9MT0FEX0ZST01VU0VSCTB4MDEKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0xPQURfSU5JVEJMT0NLCTB4MDIKKworLyogQ1NQIHNhbXBsZSB3aWR0aCAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfU0FNUExFXzhCSVQJCTB4MDEKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NBTVBMRV8xNkJJVAkJMHgwMgorCisvKiBDU1AgY2hhbm5lbHMgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX01PTk8JCQkweDAxCisjZGVmaW5lIFNORFJWX1NCX0NTUF9TVEVSRU8JCTB4MDIKKworLyogQ1NQIHJhdGVzICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9SQVRFXzgwMDAJCTB4MDEKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1JBVEVfMTEwMjUJCTB4MDIKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1JBVEVfMjIwNTAJCTB4MDQKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1JBVEVfNDQxMDAJCTB4MDgKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1JBVEVfQUxMCQkweDBmCisKKy8qIENTUCBydW5uaW5nIHN0YXRlICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9TVF9JRExFCQkweDAwCisjZGVmaW5lIFNORFJWX1NCX0NTUF9TVF9MT0FERUQJCTB4MDEKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NUX1JVTk5JTkcJCTB4MDIKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NUX1BBVVNFRAkJMHgwNAorI2RlZmluZSBTTkRSVl9TQl9DU1BfU1RfQVVUTwkJMHgwOAorI2RlZmluZSBTTkRSVl9TQl9DU1BfU1RfUVNPVU5ECQkweDEwCisKKy8qIG1heGltdW0gUVNvdW5kIHZhbHVlICgxODAgZGVncmVlcyByaWdodCkgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1FTT1VORF9NQVhfUklHSFQJMHgyMAorCisvKiBtYXhpbXVtIG1pY3JvY29kZSBSSUZGIGZpbGUgc2l6ZSAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfTUFYX01JQ1JPQ09ERV9GSUxFX1NJWkUJMHgzMDAwCisKKy8qIG1pY3JvY29kZSBoZWFkZXIgKi8KK3N0cnVjdCBzbmRfc2JfY3NwX21jX2hlYWRlciB7CisJY2hhciBjb2RlY19uYW1lWzE2XTsJCS8qIGlkIG5hbWUgb2YgY29kZWMgKi8KKwl1bnNpZ25lZCBzaG9ydCBmdW5jX3JlcTsJLyogcmVxdWVzdGVkIGZ1bmN0aW9uICovCit9OworCisvKiBtaWNyb2NvZGUgdG8gYmUgbG9hZGVkICovCitzdHJ1Y3Qgc25kX3NiX2NzcF9taWNyb2NvZGUgeworCXN0cnVjdCBzbmRfc2JfY3NwX21jX2hlYWRlciBpbmZvOworCXVuc2lnbmVkIGNoYXIgZGF0YVtTTkRSVl9TQl9DU1BfTUFYX01JQ1JPQ09ERV9GSUxFX1NJWkVdOworfTsKKworLyogc3RhcnQgQ1NQIHdpdGggc2FtcGxlX3dpZHRoIGluIG1vbm8vc3RlcmVvICovCitzdHJ1Y3Qgc25kX3NiX2NzcF9zdGFydCB7CisJaW50IHNhbXBsZV93aWR0aDsJLyogc2FtcGxlIHdpZHRoLCBsb29rIGFib3ZlICovCisJaW50IGNoYW5uZWxzOwkJLyogY2hhbm5lbHMsIGxvb2sgYWJvdmUgKi8KK307CisKKy8qIENTUCBpbmZvcm1hdGlvbiAqLworc3RydWN0IHNuZF9zYl9jc3BfaW5mbyB7CisJY2hhciBjb2RlY19uYW1lWzE2XTsJCS8qIGlkIG5hbWUgb2YgY29kZWMgKi8KKwl1bnNpZ25lZCBzaG9ydCBmdW5jX25yOwkJLyogZnVuY3Rpb24gbnVtYmVyICovCisJdW5zaWduZWQgaW50IGFjY19mb3JtYXQ7CS8qIGFjY2VwdGVkIFBDTSBmb3JtYXRzICovCisJdW5zaWduZWQgc2hvcnQgYWNjX2NoYW5uZWxzOwkvKiBhY2NlcHRlZCBjaGFubmVscyAqLworCXVuc2lnbmVkIHNob3J0IGFjY193aWR0aDsJLyogYWNjZXB0ZWQgc2FtcGxlIHdpZHRoICovCisJdW5zaWduZWQgc2hvcnQgYWNjX3JhdGVzOwkvKiBhY2NlcHRlZCBzYW1wbGUgcmF0ZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBjc3BfbW9kZTsJLyogQ1NQIG1vZGUsIHNlZSBhYm92ZSAqLworCXVuc2lnbmVkIHNob3J0IHJ1bl9jaGFubmVsczsJLyogY3VycmVudCBjaGFubmVscyAgKi8KKwl1bnNpZ25lZCBzaG9ydCBydW5fd2lkdGg7CS8qIGN1cnJlbnQgc2FtcGxlIHdpZHRoICovCisJdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsJCS8qIHZlcnNpb24gaWQ6IDB4MTAgLSAweDFmICovCisJdW5zaWduZWQgc2hvcnQgc3RhdGU7CQkvKiBzdGF0ZSBiaXRzICovCit9OworCisvKiBIV0RFUCBjb250cm9scyAqLworLyogZ2V0IENTUCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfSU5GTwkJX0lPUignSCcsIDB4MTAsIHN0cnVjdCBzbmRfc2JfY3NwX2luZm8pCisvKiBsb2FkIG1pY3JvY29kZSB0byBDU1AgKi8KKy8qIE5PVEU6IHN0cnVjdCBzbmRfc2JfY3NwX21pY3JvY29kZSBvdmVyZmxvd3MgdGhlIG1heCBzaXplICgxMyBiaXRzKQorICogZGVmaW5lZCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIGxpa2UgTUlQUywgYW5kIGl0IGxlYWRzIHRvIGJ1aWxkIGVycm9ycy4KKyAqICh4ODYgYW5kIGNvIGhhdmUgMTQtYml0IHNpemUsIHRodXMgaXQncyB2YWxpZCwgdGhvdWdoLikKKyAqIEFzIGEgd29ya2Fyb3VuZCBmb3Igc2tpcHBpbmcgdGhlIHNpemUtbGltaXQgY2hlY2ssIGhlcmUgd2UgZG9uJ3QgdXNlIHRoZQorICogbm9ybWFsIF9JT1coKSBtYWNybyBidXQgX0lPQygpIHdpdGggdGhlIG1hbnVhbCBhcmd1bWVudC4KKyAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfTE9BRF9DT0RFCVwKKwlfSU9DKF9JT0NfV1JJVEUsICdIJywgMHgxMSwgc2l6ZW9mKHN0cnVjdCBzbmRfc2JfY3NwX21pY3JvY29kZSkpCisvKiB1bmxvYWQgbWljcm9jb2RlIGZyb20gQ1NQICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9VTkxPQURfQ09ERQlfSU8oJ0gnLCAweDEyKQorLyogc3RhcnQgQ1NQICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9TVEFSVAkJX0lPVygnSCcsIDB4MTMsIHN0cnVjdCBzbmRfc2JfY3NwX3N0YXJ0KQorLyogc3RvcCBDU1AgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX1NUT1AJCV9JTygnSCcsIDB4MTQpCisvKiBwYXVzZSBDU1AgYW5kIERNQSB0cmFuc2ZlciAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfUEFVU0UJCV9JTygnSCcsIDB4MTUpCisvKiByZXN0YXJ0IENTUCBhbmQgRE1BIHRyYW5zZmVyICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9SRVNUQVJUCV9JTygnSCcsIDB4MTYpCisKKworI2VuZGlmIC8qIF9fU09VTkRfU0IxNl9DU1AgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvc2ZudF9pbmZvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL3NmbnRfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiY2U3ZmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL3NmbnRfaW5mby5oCkBAIC0wLDAgKzEsMjEyIEBACisjaWZuZGVmIF9fU09VTkRfU0ZOVF9JTkZPX0gKKyNkZWZpbmUgX19TT1VORF9TRk5UX0lORk9fSAorCisvKgorICogIFBhdGNoIHJlY29yZCBjb21wYXRpYmxlIHdpdGggQVdFIGRyaXZlciBvbiBPU1MKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDAgVGFrYXNoaSBJd2FpCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c291bmQvYXNvdW5kLmg+CisKKy8qCisgKiBwYXRjaCBpbmZvcm1hdGlvbiByZWNvcmQKKyAqLworCisjaWZkZWYgU05EUlZfQklHX0VORElBTgorI2RlZmluZSBTTkRSVl9PU1NfUEFUQ0hLRVkoaWQpICgweGZkMDB8aWQpCisjZWxzZQorI2RlZmluZSBTTkRSVl9PU1NfUEFUQ0hLRVkoaWQpICgoaWQ8PDgpfDB4ZmQpCisjZW5kaWYKKworLyogcGF0Y2ggaW50ZXJmYWNlIGhlYWRlcjogMTYgYnl0ZXMgKi8KK3N0cnVjdCBzb3VuZGZvbnRfcGF0Y2hfaW5mbyB7CisJdW5zaWduZWQgc2hvcnQga2V5OwkJLyogdXNlIHRoZSBrZXkgYmVsb3cgKi8KKyNkZWZpbmUgU05EUlZfT1NTX1NPVU5ERk9OVF9QQVRDSAkJU05EUlZfT1NTX1BBVENIS0VZKDB4MDcpCisKKwlzaG9ydCBkZXZpY2Vfbm87CQkvKiBzeW50aGVzaXplciBudW1iZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCBzZl9pZDsJCS8qIGZpbGUgaWQgKHNob3VsZCBiZSB6ZXJvKSAqLworCXNob3J0IG9wdGFyZzsJCQkvKiBvcHRpb25hbCBhcmd1bWVudCAqLworCWludCBsZW47CQkJLyogZGF0YSBsZW5ndGggKHdpdGhvdXQgdGhpcyBoZWFkZXIpICovCisKKwlzaG9ydCB0eXBlOwkJCS8qIHBhdGNoIG9wZXJhdGlvbiB0eXBlICovCisjZGVmaW5lIFNORFJWX1NGTlRfTE9BRF9JTkZPCQkwCS8qIGF3ZV92b2ljZV9yZWMgKi8KKyNkZWZpbmUgU05EUlZfU0ZOVF9MT0FEX0RBVEEJCTEJLyogYXdlX3NhbXBsZV9pbmZvICovCisjZGVmaW5lIFNORFJWX1NGTlRfT1BFTl9QQVRDSAkyCS8qIGF3ZV9vcGVuX3Bhcm0gKi8KKyNkZWZpbmUgU05EUlZfU0ZOVF9DTE9TRV9QQVRDSAkzCS8qIG5vbmUgKi8KKwkvKiA0IGlzIG9ic29sZXRlICovCisjZGVmaW5lIFNORFJWX1NGTlRfUkVQTEFDRV9EQVRBCTUJLyogYXdlX3NhbXBsZV9pbmZvIChvcHRhcmc9I2NoYW5uZWxzKSovCisjZGVmaW5lIFNORFJWX1NGTlRfTUFQX1BSRVNFVAk2CS8qIGF3ZV92b2ljZV9tYXAgKi8KKwkvKiA3IGlzIG5vdCB1c2VkICovCisjZGVmaW5lIFNORFJWX1NGTlRfUFJPQkVfREFUQQkJOAkvKiBvcHRhcmc9c2FtcGxlICovCisjZGVmaW5lIFNORFJWX1NGTlRfUkVNT1ZFX0lORk8JCTkJLyogb3B0YXJnPShiYW5rPDw4KXxpbnN0ciAqLworCisJc2hvcnQgcmVzZXJ2ZWQ7CQkJLyogd29yZCBhbGlnbm1lbnQgZGF0YSAqLworCisJLyogdGhlIGFjdHVhbCBwYXRjaCBkYXRhIGJlZ2lucyBhZnRlciB0aGlzICovCit9OworCisKKy8qCisgKiBvcGVuIHBhdGNoCisgKi8KKworI2RlZmluZSBTTkRSVl9TRk5UX1BBVENIX05BTUVfTEVOCTMyCisKK3N0cnVjdCBzb3VuZGZvbnRfb3Blbl9wYXJtIHsKKwl1bnNpZ25lZCBzaG9ydCB0eXBlOwkJLyogc2FtcGxlIHR5cGUgKi8KKyNkZWZpbmUgU05EUlZfU0ZOVF9QQVRfVFlQRV9NSVNDCTAKKyNkZWZpbmUgU05EUlZfU0ZOVF9QQVRfVFlQRV9HVVMJNgorI2RlZmluZSBTTkRSVl9TRk5UX1BBVF9UWVBFX01BUAk3CisjZGVmaW5lIFNORFJWX1NGTlRfUEFUX0xPQ0tFRAkweDEwMAkvKiBsb2NrIHRoZSBzYW1wbGVzICovCisjZGVmaW5lIFNORFJWX1NGTlRfUEFUX1NIQVJFRAkweDIwMAkvKiBzYW1wbGUgaXMgc2hhcmVkICovCisKKwlzaG9ydCByZXNlcnZlZDsKKwljaGFyIG5hbWVbU05EUlZfU0ZOVF9QQVRDSF9OQU1FX0xFTl07Cit9OworCisKKy8qCisgKiByYXcgdm9pY2UgaW5mb3JtYXRpb24gcmVjb3JkCisgKi8KKworLyogd2F2ZSB0YWJsZSBlbnZlbG9wZSAmIGVmZmVjdCBwYXJhbWV0ZXJzIHRvIGNvbnRyb2wgRU1VODAwMCAqLworc3RydWN0IHNvdW5kZm9udF92b2ljZV9wYXJtIHsKKwl1bnNpZ25lZCBzaG9ydCBtb2RkZWxheTsJLyogbW9kdWxhdGlvbiBkZWxheSAoMHg4MDAwKSAqLworCXVuc2lnbmVkIHNob3J0IG1vZGF0a2hsZDsJLyogbW9kdWxhdGlvbiBhdHRhY2sgJiBob2xkIHRpbWUgKDB4N2Y3ZikgKi8KKwl1bnNpZ25lZCBzaG9ydCBtb2RkY3lzdXM7CS8qIG1vZHVsYXRpb24gZGVjYXkgJiBzdXN0YWluICgweDdmN2YpICovCisJdW5zaWduZWQgc2hvcnQgbW9kcmVsZWFzZTsJLyogbW9kdWxhdGlvbiByZWxlYXNlIHRpbWUgKDB4ODA3ZikgKi8KKwlzaG9ydCBtb2RrZXlob2xkLCBtb2RrZXlkZWNheTsJLyogZW52ZWxvcGUgY2hhbmdlIHBlciBrZXkgKG5vdCB1c2VkKSAqLworCXVuc2lnbmVkIHNob3J0IHZvbGRlbGF5OwkvKiB2b2x1bWUgZGVsYXkgKDB4ODAwMCkgKi8KKwl1bnNpZ25lZCBzaG9ydCB2b2xhdGtobGQ7CS8qIHZvbHVtZSBhdHRhY2sgJiBob2xkIHRpbWUgKDB4N2Y3ZikgKi8KKwl1bnNpZ25lZCBzaG9ydCB2b2xkY3lzdXM7CS8qIHZvbHVtZSBkZWNheSAmIHN1c3RhaW4gKDB4N2Y3ZikgKi8KKwl1bnNpZ25lZCBzaG9ydCB2b2xyZWxlYXNlOwkvKiB2b2x1bWUgcmVsZWFzZSB0aW1lICgweDgwN2YpICovCisJc2hvcnQgdm9sa2V5aG9sZCwgdm9sa2V5ZGVjYXk7CS8qIGVudmVsb3BlIGNoYW5nZSBwZXIga2V5IChub3QgdXNlZCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBsZm8xZGVsYXk7CS8qIExGTzEgZGVsYXkgKDB4ODAwMCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBsZm8yZGVsYXk7CS8qIExGTzIgZGVsYXkgKDB4ODAwMCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBwZWZlOwkJLyogbW9kdWxhdGlvbiBwaXRjaCAmIGN1dG9mZiAoMHgwMDAwKSAqLworCXVuc2lnbmVkIHNob3J0IGZtbW9kOwkJLyogTEZPMSBwaXRjaCAmIGN1dG9mZiAoMHgwMDAwKSAqLworCXVuc2lnbmVkIHNob3J0IHRyZW1mcnE7CQkvKiBMRk8xIHZvbHVtZSAmIGZyZXEgKDB4MDAwMCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBmbTJmcnEyOwkJLyogTEZPMiBwaXRjaCAmIGZyZXEgKDB4MDAwMCkgKi8KKwl1bnNpZ25lZCBjaGFyIGN1dG9mZjsJCS8qIGluaXRpYWwgY3V0b2ZmICgweGZmKSAqLworCXVuc2lnbmVkIGNoYXIgZmlsdGVyUTsJCS8qIGluaXRpYWwgZmlsdGVyIFEgWzAtMTVdICgweDApICovCisJdW5zaWduZWQgY2hhciBjaG9ydXM7CQkvKiBjaG9ydXMgc2VuZCAoMHgwMCkgKi8KKwl1bnNpZ25lZCBjaGFyIHJldmVyYjsJCS8qIHJldmVyYiBzZW5kICgweDAwKSAqLworCXVuc2lnbmVkIHNob3J0IHJlc2VydmVkWzRdOwkvKiBub3QgdXNlZCAqLworfTsKKworCisvKiB3YXZlIHRhYmxlIHBhcmFtZXRlcnM6IDkyIGJ5dGVzICovCitzdHJ1Y3Qgc291bmRmb250X3ZvaWNlX2luZm8geworCXVuc2lnbmVkIHNob3J0IHNmX2lkOwkJLyogZmlsZSBpZCAoc2hvdWxkIGJlIHplcm8pICovCisJdW5zaWduZWQgc2hvcnQgc2FtcGxlOwkJLyogc2FtcGxlIGlkICovCisJaW50IHN0YXJ0LCBlbmQ7CQkJLyogc2FtcGxlIG9mZnNldCBjb3JyZWN0aW9uICovCisJaW50IGxvb3BzdGFydCwgbG9vcGVuZDsJCS8qIGxvb3Agb2Zmc2V0IGNvcnJlY3Rpb24gKi8KKwlzaG9ydCByYXRlX29mZnNldDsJCS8qIHNhbXBsZSByYXRlIHBpdGNoIG9mZnNldCAqLworCXVuc2lnbmVkIHNob3J0IG1vZGU7CQkvKiBzYW1wbGUgbW9kZSAqLworI2RlZmluZSBTTkRSVl9TRk5UX01PREVfUk9NU09VTkQJCTB4ODAwMAorI2RlZmluZSBTTkRSVl9TRk5UX01PREVfU1RFUkVPCQkxCisjZGVmaW5lIFNORFJWX1NGTlRfTU9ERV9MT09QSU5HCQkyCisjZGVmaW5lIFNORFJWX1NGTlRfTU9ERV9OT1JFTEVBU0UJCTQJLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgU05EUlZfU0ZOVF9NT0RFX0lOSVRfUEFSTQkJOAorCisJc2hvcnQgcm9vdDsJCQkvKiBtaWRpIHJvb3Qga2V5ICovCisJc2hvcnQgdHVuZTsJCQkvKiBwaXRjaCB0dW5pbmcgKGluIGNlbnRzKSAqLworCXVuc2lnbmVkIGNoYXIgbG93LCBoaWdoOwkvKiBrZXkgbm90ZSByYW5nZSAqLworCXVuc2lnbmVkIGNoYXIgdmVsbG93LCB2ZWxoaWdoOwkvKiB2ZWxvY2l0eSByYW5nZSAqLworCXNpZ25lZCBjaGFyIGZpeGtleSwgZml4dmVsOwkvKiBmaXhlZCBrZXksIHZlbG9jaXR5ICovCisJc2lnbmVkIGNoYXIgcGFuLCBmaXhwYW47CS8qIHBhbm5pbmcsIGZpeGVkIHBhbm5pbmcgKi8KKwlzaG9ydCBleGNsdXNpdmVDbGFzczsJCS8qIGV4Y2x1c2l2ZSBjbGFzcyAoMCA9IG5vbmUpICovCisJdW5zaWduZWQgY2hhciBhbXBsaXR1ZGU7CS8qIHNhbXBsZSB2b2x1bWUgKDEyNyBtYXgpICovCisJdW5zaWduZWQgY2hhciBhdHRlbnVhdGlvbjsJLyogYXR0ZW51YXRpb24gKDAuMzc1ZEIpICovCisJc2hvcnQgc2NhbGVUdW5pbmc7CQkvKiBwaXRjaCBzY2FsZSB0dW5pbmcoJSksIG5vcm1hbGx5IDEwMCAqLworCXN0cnVjdCBzb3VuZGZvbnRfdm9pY2VfcGFybSBwYXJtOwkvKiB2b2ljZSBlbnZlbG9wZSBwYXJhbWV0ZXJzICovCisJdW5zaWduZWQgc2hvcnQgc2FtcGxlX21vZGU7CS8qIHNhbXBsZSBtb2RlX2ZsYWcgKHNldCBieSBkcml2ZXIpICovCit9OworCisKKy8qIGluc3RydW1lbnQgaW5mbyBoZWFkZXI6IDQgYnl0ZXMgKi8KK3N0cnVjdCBzb3VuZGZvbnRfdm9pY2VfcmVjX2hkciB7CisJdW5zaWduZWQgY2hhciBiYW5rOwkJLyogbWlkaSBiYW5rIG51bWJlciAqLworCXVuc2lnbmVkIGNoYXIgaW5zdHI7CQkvKiBtaWRpIHByZXNldCBudW1iZXIgKi8KKwljaGFyIG52b2ljZXM7CQkJLyogbnVtYmVyIG9mIHZvaWNlcyAqLworCWNoYXIgd3JpdGVfbW9kZTsJCS8qIHdyaXRlIG1vZGU7IG5vcm1hbGx5IDAgKi8KKyNkZWZpbmUgU05EUlZfU0ZOVF9XUl9BUFBFTkQJCTAJLyogYXBwZW5kIGFueXdheSAqLworI2RlZmluZSBTTkRSVl9TRk5UX1dSX0VYQ0xVU0lWRQkJMQkvKiBza2lwIGlmIGFscmVhZHkgZXhpc3RzICovCisjZGVmaW5lIFNORFJWX1NGTlRfV1JfUkVQTEFDRQkJMgkvKiByZXBsYWNlIGlmIGFscmVhZHkgZXhpc3RzICovCit9OworCisKKy8qCisgKiBzYW1wbGUgd2F2ZSBpbmZvcm1hdGlvbgorICovCisKKy8qIHdhdmUgdGFibGUgc2FtcGxlIGhlYWRlcjogMzIgYnl0ZXMgKi8KK3N0cnVjdCBzb3VuZGZvbnRfc2FtcGxlX2luZm8geworCXVuc2lnbmVkIHNob3J0IHNmX2lkOwkJLyogZmlsZSBpZCAoc2hvdWxkIGJlIHplcm8pICovCisJdW5zaWduZWQgc2hvcnQgc2FtcGxlOwkJLyogc2FtcGxlIGlkICovCisJaW50IHN0YXJ0LCBlbmQ7CQkJLyogc3RhcnQgJiBlbmQgb2Zmc2V0ICovCisJaW50IGxvb3BzdGFydCwgbG9vcGVuZDsJCS8qIGxvb3Agc3RhcnQgJiBlbmQgb2Zmc2V0ICovCisJaW50IHNpemU7CQkJLyogc2l6ZSAoMCA9IFJPTSkgKi8KKwlzaG9ydCBkdW1teTsJCQkvKiBub3QgdXNlZCAqLworCXVuc2lnbmVkIHNob3J0IG1vZGVfZmxhZ3M7CS8qIG1vZGUgZmxhZ3MgKi8KKyNkZWZpbmUgU05EUlZfU0ZOVF9TQU1QTEVfOEJJVFMJCTEJLyogd2F2ZSBkYXRhIGlzIDhiaXRzICovCisjZGVmaW5lIFNORFJWX1NGTlRfU0FNUExFX1VOU0lHTkVECTIJLyogd2F2ZSBkYXRhIGlzIHVuc2lnbmVkICovCisjZGVmaW5lIFNORFJWX1NGTlRfU0FNUExFX05PX0JMQU5LCTQJLyogbm8gYmxhbmsgbG9vcCBpcyBhdHRhY2hlZCAqLworI2RlZmluZSBTTkRSVl9TRk5UX1NBTVBMRV9TSU5HTEVTSE9UCTgJLyogc2luZ2xlLXNob3Qgdy9vIGxvb3AgKi8KKyNkZWZpbmUgU05EUlZfU0ZOVF9TQU1QTEVfQklESVJfTE9PUAkxNgkvKiBiaWRpcmVjdGlvbmFsIGxvb3BpbmcgKi8KKyNkZWZpbmUgU05EUlZfU0ZOVF9TQU1QTEVfU1RFUkVPX0xFRlQJMzIJLyogc3RlcmVvIGxlZnQgc291bmQgKi8KKyNkZWZpbmUgU05EUlZfU0ZOVF9TQU1QTEVfU1RFUkVPX1JJR0hUCTY0CS8qIHN0ZXJlbyByaWdodCBzb3VuZCAqLworI2RlZmluZSBTTkRSVl9TRk5UX1NBTVBMRV9SRVZFUlNFX0xPT1AJMTI4CS8qIHJldmVyc2UgbG9vcGluZyAqLworCXVuc2lnbmVkIGludCB0cnVlc2l6ZTsJCS8qIHVzZWQgbWVtb3J5IHNpemUgKHNldCBieSBkcml2ZXIpICovCit9OworCisKKy8qCisgKiB2b2ljZSBwcmVzZXQgbWFwcGluZyAoYWxpYXNpbmcpCisgKi8KKworc3RydWN0IHNvdW5kZm9udF92b2ljZV9tYXAgeworCWludCBtYXBfYmFuaywgbWFwX2luc3RyLCBtYXBfa2V5OwkvKiBrZXkgPSAtMSBtZWFucyBhbGwga2V5cyAqLworCWludCBzcmNfYmFuaywgc3JjX2luc3RyLCBzcmNfa2V5OworfTsKKworCisvKgorICogaW9jdGxzIGZvciBod2RlcAorICovCisKKyNkZWZpbmUgU05EUlZfRU1VWF9IV0RFUF9OQU1FCSJFbXV4IFdhdmVUYWJsZSIKKworI2RlZmluZSBTTkRSVl9FTVVYX1ZFUlNJT04JKCgxIDw8IDE2KSB8ICgwIDw8IDgpIHwgMCkJLyogMS4wLjAgKi8KKworc3RydWN0IHNuZF9lbXV4X21pc2NfbW9kZSB7CisJaW50IHBvcnQ7CS8qIC0xID0gYWxsICovCisJaW50IG1vZGU7CisJaW50IHZhbHVlOworCWludCB2YWx1ZTI7CS8qIHJlc2VydmVkICovCit9OworCisjZGVmaW5lIFNORFJWX0VNVVhfSU9DVExfVkVSU0lPTglfSU9SKCdIJywgMHg4MCwgdW5zaWduZWQgaW50KQorI2RlZmluZSBTTkRSVl9FTVVYX0lPQ1RMX0xPQURfUEFUQ0gJX0lPV1IoJ0gnLCAweDgxLCBzdHJ1Y3Qgc291bmRmb250X3BhdGNoX2luZm8pCisjZGVmaW5lIFNORFJWX0VNVVhfSU9DVExfUkVTRVRfU0FNUExFUwlfSU8oJ0gnLCAweDgyKQorI2RlZmluZSBTTkRSVl9FTVVYX0lPQ1RMX1JFTU9WRV9MQVNUX1NBTVBMRVMgX0lPKCdIJywgMHg4MykKKyNkZWZpbmUgU05EUlZfRU1VWF9JT0NUTF9NRU1fQVZBSUwJX0lPVygnSCcsIDB4ODQsIGludCkKKyNkZWZpbmUgU05EUlZfRU1VWF9JT0NUTF9NSVNDX01PREUJX0lPV1IoJ0gnLCAweDg0LCBzdHJ1Y3Qgc25kX2VtdXhfbWlzY19tb2RlKQorCisjZW5kaWYgLyogX19TT1VORF9TRk5UX0lORk9fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zcGF3bi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zcGF3bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZWZhMGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3NwYXduLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qIERlZmluaXRpb25zIGZvciBQT1NJWCBzcGF3biBpbnRlcmZhY2UuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDksIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NQQVdOX0gKKyNkZWZpbmUJX1NQQVdOX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisKKy8qIERhdGEgc3RydWN0dXJlIHRvIGNvbnRhaW4gYXR0cmlidXRlcyBmb3IgdGhyZWFkIGNyZWF0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHNob3J0IGludCBfX2ZsYWdzOworICBwaWRfdCBfX3BncnA7CisgIHNpZ3NldF90IF9fc2Q7CisgIHNpZ3NldF90IF9fc3M7CisgIHN0cnVjdCBzY2hlZF9wYXJhbSBfX3NwOworICBpbnQgX19wb2xpY3k7CisgIGludCBfX3BhZFsxNl07Cit9IHBvc2l4X3NwYXduYXR0cl90OworCisKKy8qIERhdGEgc3RydWN0dXJlIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjdGlvbnMgdG8gYmUKKyAgIHBlcmZvcm1lZCBpbiB0aGUgbmV3IHByb2Nlc3Mgd2l0aCByZXNwZWN0IHRvIGZpbGUgZGVzY3JpcHRvcnMuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IF9fYWxsb2NhdGVkOworICBpbnQgX191c2VkOworICBzdHJ1Y3QgX19zcGF3bl9hY3Rpb24gKl9fYWN0aW9uczsKKyAgaW50IF9fcGFkWzE2XTsKK30gcG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX3Q7CisKKworLyogRmxhZ3MgdG8gYmUgc2V0IGluIHRoZSBgcG9zaXhfc3Bhd25hdHRyX3QnLiAgKi8KKyNkZWZpbmUgUE9TSVhfU1BBV05fUkVTRVRJRFMJCTB4MDEKKyNkZWZpbmUgUE9TSVhfU1BBV05fU0VUUEdST1VQCQkweDAyCisjZGVmaW5lIFBPU0lYX1NQQVdOX1NFVFNJR0RFRgkJMHgwNAorI2RlZmluZSBQT1NJWF9TUEFXTl9TRVRTSUdNQVNLCQkweDA4CisjZGVmaW5lIFBPU0lYX1NQQVdOX1NFVFNDSEVEUEFSQU0JMHgxMAorI2RlZmluZSBQT1NJWF9TUEFXTl9TRVRTQ0hFRFVMRVIJMHgyMAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgUE9TSVhfU1BBV05fVVNFVkZPUksJCTB4NDAKKyNlbmRpZgorCisKK19fQkVHSU5fREVDTFMKKworLyogU3Bhd24gYSBuZXcgcHJvY2VzcyBleGVjdXRpbmcgUEFUSCB3aXRoIHRoZSBhdHRyaWJ1dGVzIGRlc2NyaWJlcyBpbiAqQVRUUlAuCisgICBCZWZvcmUgcnVubmluZyB0aGUgcHJvY2VzcyBwZXJmb3JtIHRoZSBhY3Rpb25zIGRlc2NyaWJlZCBpbiBGSUxFLUFDVElPTlMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduIChwaWRfdCAqX19yZXN0cmljdCBfX3BpZCwKKwkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQlfX2NvbnN0IHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc190ICpfX3Jlc3RyaWN0CisJCQlfX2ZpbGVfYWN0aW9ucywKKwkJCV9fY29uc3QgcG9zaXhfc3Bhd25hdHRyX3QgKl9fcmVzdHJpY3QgX19hdHRycCwKKwkJCWNoYXIgKl9fY29uc3QgX19hcmd2W19fcmVzdHJpY3RfYXJyXSwKKwkJCWNoYXIgKl9fY29uc3QgX19lbnZwW19fcmVzdHJpY3RfYXJyXSk7CisKKy8qIFNpbWlsYXIgdG8gYHBvc2l4X3NwYXduJyBidXQgc2VhcmNoIGZvciBGSUxFIGluIHRoZSBQQVRILgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25wIChwaWRfdCAqX19waWQsIF9fY29uc3QgY2hhciAqX19maWxlLAorCQkJIF9fY29uc3QgcG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX3QgKl9fZmlsZV9hY3Rpb25zLAorCQkJIF9fY29uc3QgcG9zaXhfc3Bhd25hdHRyX3QgKl9fYXR0cnAsCisJCQkgY2hhciAqX19jb25zdCBfX2FyZ3ZbXSwgY2hhciAqX19jb25zdCBfX2VudnBbXSk7CisKKworLyogSW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZSB3aXRoIGF0dHJpYnV0ZXMgZm9yIGBzcGF3bicgdG8gZGVmYXVsdCB2YWx1ZXMuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfaW5pdCAocG9zaXhfc3Bhd25hdHRyX3QgKl9fYXR0cikgX19USFJPVzsKKworLyogRnJlZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIEFUVFIuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfZGVzdHJveSAocG9zaXhfc3Bhd25hdHRyX3QgKl9fYXR0cikgX19USFJPVzsKKworLyogU3RvcmUgc2lnbmFsIG1hc2sgZm9yIHNpZ25hbHMgd2l0aCBkZWZhdWx0IGhhbmRsaW5nIGZyb20gQVRUUiBpbgorICAgU0lHREVGQVVMVC4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9nZXRzaWdkZWZhdWx0IChfX2NvbnN0IHBvc2l4X3NwYXduYXR0cl90ICoKKwkJCQkJICBfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkJICBzaWdzZXRfdCAqX19yZXN0cmljdCBfX3NpZ2RlZmF1bHQpCisgICAgIF9fVEhST1c7CisKKy8qIFNldCBzaWduYWwgbWFzayBmb3Igc2lnbmFscyB3aXRoIGRlZmF1bHQgaGFuZGxpbmcgaW4gQVRUUiB0byBTSUdERUZBVUxULiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX3NldHNpZ2RlZmF1bHQgKHBvc2l4X3NwYXduYXR0cl90ICpfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkJICBfX2NvbnN0IHNpZ3NldF90ICpfX3Jlc3RyaWN0CisJCQkJCSAgX19zaWdkZWZhdWx0KQorICAgICBfX1RIUk9XOworCisvKiBTdG9yZSBzaWduYWwgbWFzayBmb3IgdGhlIG5ldyBwcm9jZXNzIGZyb20gQVRUUiBpbiBTSUdNQVNLLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX2dldHNpZ21hc2sgKF9fY29uc3QgcG9zaXhfc3Bhd25hdHRyX3QgKl9fcmVzdHJpY3QKKwkJCQkgICAgICAgX19hdHRyLAorCQkJCSAgICAgICBzaWdzZXRfdCAqX19yZXN0cmljdCBfX3NpZ21hc2spIF9fVEhST1c7CisKKy8qIFNldCBzaWduYWwgbWFzayBmb3IgdGhlIG5ldyBwcm9jZXNzIGluIEFUVFIgdG8gU0lHTUFTSy4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9zZXRzaWdtYXNrIChwb3NpeF9zcGF3bmF0dHJfdCAqX19yZXN0cmljdCBfX2F0dHIsCisJCQkJICAgICAgIF9fY29uc3Qgc2lnc2V0X3QgKl9fcmVzdHJpY3QgX19zaWdtYXNrKQorICAgICBfX1RIUk9XOworCisvKiBHZXQgZmxhZyB3b3JkIGZyb20gdGhlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfZ2V0ZmxhZ3MgKF9fY29uc3QgcG9zaXhfc3Bhd25hdHRyX3QgKl9fcmVzdHJpY3QKKwkJCQkgICAgIF9fYXR0ciwKKwkJCQkgICAgIHNob3J0IGludCAqX19yZXN0cmljdCBfX2ZsYWdzKSBfX1RIUk9XOworCisvKiBTdG9yZSBmbGFncyBpbiB0aGUgYXR0cmlidXRlIHN0cnVjdHVyZS4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9zZXRmbGFncyAocG9zaXhfc3Bhd25hdHRyX3QgKl9hdHRyLAorCQkJCSAgICAgc2hvcnQgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIEdldCBwcm9jZXNzIGdyb3VwIElEIGZyb20gdGhlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfZ2V0cGdyb3VwIChfX2NvbnN0IHBvc2l4X3NwYXduYXR0cl90ICpfX3Jlc3RyaWN0CisJCQkJICAgICAgX19hdHRyLCBwaWRfdCAqX19yZXN0cmljdCBfX3Bncm91cCkKKyAgICAgX19USFJPVzsKKworLyogU3RvcmUgcHJvY2VzcyBncm91cCBJRCBpbiB0aGUgYXR0cmlidXRlIHN0cnVjdHVyZS4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9zZXRwZ3JvdXAgKHBvc2l4X3NwYXduYXR0cl90ICpfX2F0dHIsCisJCQkJICAgICAgcGlkX3QgX19wZ3JvdXApIF9fVEhST1c7CisKKy8qIEdldCBzY2hlZHVsaW5nIHBvbGljeSBmcm9tIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX2dldHNjaGVkcG9saWN5IChfX2NvbnN0IHBvc2l4X3NwYXduYXR0cl90ICoKKwkJCQkJICAgX19yZXN0cmljdCBfX2F0dHIsCisJCQkJCSAgIGludCAqX19yZXN0cmljdCBfX3NjaGVkcG9saWN5KQorICAgICBfX1RIUk9XOworCisvKiBTdG9yZSBzY2hlZHVsaW5nIHBvbGljeSBpbiB0aGUgYXR0cmlidXRlIHN0cnVjdHVyZS4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9zZXRzY2hlZHBvbGljeSAocG9zaXhfc3Bhd25hdHRyX3QgKl9fYXR0ciwKKwkJCQkJICAgaW50IF9fc2NoZWRwb2xpY3kpIF9fVEhST1c7CisKKy8qIEdldCBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgZnJvbSB0aGUgYXR0cmlidXRlIHN0cnVjdHVyZS4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9nZXRzY2hlZHBhcmFtIChfX2NvbnN0IHBvc2l4X3NwYXduYXR0cl90ICoKKwkJCQkJICBfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkJICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcmVzdHJpY3QKKwkJCQkJICBfX3NjaGVkcGFyYW0pIF9fVEhST1c7CisKKy8qIFN0b3JlIHNjaGVkdWxpbmcgcGFyYW1ldGVycyBpbiB0aGUgYXR0cmlidXRlIHN0cnVjdHVyZS4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9zZXRzY2hlZHBhcmFtIChwb3NpeF9zcGF3bmF0dHJfdCAqX19yZXN0cmljdCBfX2F0dHIsCisJCQkJCSAgY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICoKKwkJCQkJICBfX3Jlc3RyaWN0IF9fc2NoZWRwYXJhbSkgX19USFJPVzsKKworCisvKiBJbml0aWFsaXplIGRhdGEgc3RydWN0dXJlIGZvciBmaWxlIGF0dHJpYnV0ZSBmb3IgYHNwYXduJyBjYWxsLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX2luaXQgKHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc190ICoKKwkJCQkJICBfX2ZpbGVfYWN0aW9ucykgX19USFJPVzsKKworLyogRnJlZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIEZJTEUtQUNUSU9OUy4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc19kZXN0cm95IChwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfdCAqCisJCQkJCSAgICAgX19maWxlX2FjdGlvbnMpIF9fVEhST1c7CisKKy8qIEFkZCBhbiBhY3Rpb24gdG8gRklMRS1BQ1RJT05TIHdoaWNoIHRlbGxzIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBjYWxsCisgICBgb3BlbicgZm9yIHRoZSBnaXZlbiBmaWxlIGR1cmluZyB0aGUgYHNwYXduJyBjYWxsLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX2FkZG9wZW4gKHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc190ICoKKwkJCQkJICAgICBfX3Jlc3RyaWN0IF9fZmlsZV9hY3Rpb25zLAorCQkJCQkgICAgIGludCBfX2ZkLAorCQkJCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkJCSAgICAgaW50IF9fb2ZsYWcsIG1vZGVfdCBfX21vZGUpCisgICAgIF9fVEhST1c7CisKKy8qIEFkZCBhbiBhY3Rpb24gdG8gRklMRS1BQ1RJT05TIHdoaWNoIHRlbGxzIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBjYWxsCisgICBgY2xvc2UnIGZvciB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIGR1cmluZyB0aGUgYHNwYXduJyBjYWxsLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX2FkZGNsb3NlIChwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfdCAqCisJCQkJCSAgICAgIF9fZmlsZV9hY3Rpb25zLCBpbnQgX19mZCkKKyAgICAgX19USFJPVzsKKworLyogQWRkIGFuIGFjdGlvbiB0byBGSUxFLUFDVElPTlMgd2hpY2ggdGVsbHMgdGhlIGltcGxlbWVudGF0aW9uIHRvIGNhbGwKKyAgIGBkdXAyJyBmb3IgdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcnMgZHVyaW5nIHRoZSBgc3Bhd24nIGNhbGwuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfYWRkZHVwMiAocG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX3QgKgorCQkJCQkgICAgIF9fZmlsZV9hY3Rpb25zLAorCQkJCQkgICAgIGludCBfX2ZkLCBpbnQgX19uZXdmZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHNwYXduLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RhYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGFiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjM2MzMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RhYi5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX19HTlVfU1RBQl9fCisKKy8qIEluZGljYXRlIHRoZSBHTlUgc3RhYi5oIGlzIGluIHVzZS4gICovCisKKyNkZWZpbmUgX19HTlVfU1RBQl9fCisKKyNkZWZpbmUgX19kZWZpbmVfc3RhYihOQU1FLCBDT0RFLCBTVFJJTkcpIE5BTUU9Q09ERSwKKworZW51bSBfX3N0YWJfZGVidWdfY29kZQoreworI2luY2x1ZGUgPGJpdHMvc3RhYi5kZWY+CitMQVNUX1VOVVNFRF9TVEFCX0NPREUKK307CisKKyN1bmRlZiBfX2RlZmluZV9zdGFiCisKKyNlbmRpZiAvKiBfX0dOVV9TVEFCXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRhdG9taWMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RkYXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjc5ZmJmZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RkYXRvbWljLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYmlvbmljL2xpYmMvaW5jbHVkZS9zdGRhdG9taWMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RkaW50LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzI5YWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGludC5oCkBAIC0wLDAgKzEsMzIwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSwyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OTogNy4xOCBJbnRlZ2VyIHR5cGVzIDxzdGRpbnQuaD4KKyAqLworCisjaWZuZGVmIF9TVERJTlRfSAorI2RlZmluZSBfU1RESU5UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3djaGFyLmg+CisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisvKiBFeGFjdCBpbnRlZ3JhbCB0eXBlcy4gICovCisKKy8qIFNpZ25lZC4gICovCisKKy8qIFRoZXJlIGlzIHNvbWUgYW1vdW50IG9mIG92ZXJsYXAgd2l0aCA8c3lzL3R5cGVzLmg+IGFzIGtub3duIGJ5IGluZXQgY29kZSAqLworI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjIGRlZmluZSBfX2ludDhfdF9kZWZpbmVkCit0eXBlZGVmIHNpZ25lZCBjaGFyCQlpbnQ4X3Q7Cit0eXBlZGVmIHNob3J0IGludAkJaW50MTZfdDsKK3R5cGVkZWYgaW50CQkJaW50MzJfdDsKKyMgaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBsb25nIGludAkJaW50NjRfdDsKKyMgZWxzZQorX19leHRlbnNpb25fXwordHlwZWRlZiBsb25nIGxvbmcgaW50CQlpbnQ2NF90OworIyBlbmRpZgorI2VuZGlmCisKKy8qIFVuc2lnbmVkLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50CXVpbnQxNl90OworI2lmbmRlZiBfX3VpbnQzMl90X2RlZmluZWQKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1aW50MzJfdDsKKyMgZGVmaW5lIF9fdWludDMyX3RfZGVmaW5lZAorI2VuZGlmCisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAl1aW50NjRfdDsKKyNlbHNlCitfX2V4dGVuc2lvbl9fCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJdWludDY0X3Q7CisjZW5kaWYKKworCisvKiBTbWFsbCB0eXBlcy4gICovCisKKy8qIFNpZ25lZC4gICovCit0eXBlZGVmIHNpZ25lZCBjaGFyCQlpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIHNob3J0IGludAkJaW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgaW50CQkJaW50X2xlYXN0MzJfdDsKKyNpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIGxvbmcgaW50CQlpbnRfbGVhc3Q2NF90OworI2Vsc2UKK19fZXh0ZW5zaW9uX18KK3R5cGVkZWYgbG9uZyBsb25nIGludAkJaW50X2xlYXN0NjRfdDsKKyNlbmRpZgorCisvKiBVbnNpZ25lZC4gICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCXVpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludAl1aW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1aW50X2xlYXN0MzJfdDsKKyNpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CXVpbnRfbGVhc3Q2NF90OworI2Vsc2UKK19fZXh0ZW5zaW9uX18KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludAl1aW50X2xlYXN0NjRfdDsKKyNlbmRpZgorCisKKy8qIEZhc3QgdHlwZXMuICAqLworCisvKiBTaWduZWQuICAqLwordHlwZWRlZiBzaWduZWQgY2hhcgkJaW50X2Zhc3Q4X3Q7CisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBsb25nIGludAkJaW50X2Zhc3QxNl90OwordHlwZWRlZiBsb25nIGludAkJaW50X2Zhc3QzMl90OwordHlwZWRlZiBsb25nIGludAkJaW50X2Zhc3Q2NF90OworI2Vsc2UKK3R5cGVkZWYgaW50CQkJaW50X2Zhc3QxNl90OwordHlwZWRlZiBpbnQJCQlpbnRfZmFzdDMyX3Q7CitfX2V4dGVuc2lvbl9fCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQJCWludF9mYXN0NjRfdDsKKyNlbmRpZgorCisvKiBVbnNpZ25lZC4gICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCXVpbnRfZmFzdDhfdDsKKyNpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CXVpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CXVpbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CXVpbnRfZmFzdDY0X3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludF9mYXN0MzJfdDsKK19fZXh0ZW5zaW9uX18KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludAl1aW50X2Zhc3Q2NF90OworI2VuZGlmCisKKworLyogVHlwZXMgZm9yIGB2b2lkIConIHBvaW50ZXJzLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDY0CisjIGlmbmRlZiBfX2ludHB0cl90X2RlZmluZWQKK3R5cGVkZWYgbG9uZyBpbnQJCWludHB0cl90OworIyAgZGVmaW5lIF9faW50cHRyX3RfZGVmaW5lZAorIyBlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAl1aW50cHRyX3Q7CisjZWxzZQorIyBpZm5kZWYgX19pbnRwdHJfdF9kZWZpbmVkCit0eXBlZGVmIGludAkJCWludHB0cl90OworIyAgZGVmaW5lIF9faW50cHRyX3RfZGVmaW5lZAorIyBlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVpbnRwdHJfdDsKKyNlbmRpZgorCisKKy8qIExhcmdlc3QgaW50ZWdyYWwgdHlwZXMuICAqLworI2lmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgbG9uZyBpbnQJCWludG1heF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAl1aW50bWF4X3Q7CisjZWxzZQorX19leHRlbnNpb25fXwordHlwZWRlZiBsb25nIGxvbmcgaW50CQlpbnRtYXhfdDsKK19fZXh0ZW5zaW9uX18KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludAl1aW50bWF4X3Q7CisjZW5kaWYKKworCisvKiBUaGUgSVNPIEM5OSBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCBpbiBDKysgaW1wbGVtZW50YXRpb25zIHRoZXNlCisgICBtYWNyb3Mgc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC4gICovCisjaWYgIWRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfX1NURENfTElNSVRfTUFDUk9TCisKKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIF9fSU5UNjRfQyhjKQljICMjIEwKKyMgIGRlZmluZSBfX1VJTlQ2NF9DKGMpCWMgIyMgVUwKKyMgZWxzZQorIyAgZGVmaW5lIF9fSU5UNjRfQyhjKQljICMjIExMCisjICBkZWZpbmUgX19VSU5UNjRfQyhjKQljICMjIFVMTAorIyBlbmRpZgorCisvKiBMaW1pdHMgb2YgaW50ZWdyYWwgdHlwZXMuICAqLworCisvKiBNaW5pbXVtIG9mIHNpZ25lZCBpbnRlZ3JhbCB0eXBlcy4gICovCisjIGRlZmluZSBJTlQ4X01JTgkJKC0xMjgpCisjIGRlZmluZSBJTlQxNl9NSU4JCSgtMzI3NjctMSkKKyMgZGVmaW5lIElOVDMyX01JTgkJKC0yMTQ3NDgzNjQ3LTEpCisjIGRlZmluZSBJTlQ2NF9NSU4JCSgtX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCisvKiBNYXhpbXVtIG9mIHNpZ25lZCBpbnRlZ3JhbCB0eXBlcy4gICovCisjIGRlZmluZSBJTlQ4X01BWAkJKDEyNykKKyMgZGVmaW5lIElOVDE2X01BWAkJKDMyNzY3KQorIyBkZWZpbmUgSU5UMzJfTUFYCQkoMjE0NzQ4MzY0NykKKyMgZGVmaW5lIElOVDY0X01BWAkJKF9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKKworLyogTWF4aW11bSBvZiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcy4gICovCisjIGRlZmluZSBVSU5UOF9NQVgJCSgyNTUpCisjIGRlZmluZSBVSU5UMTZfTUFYCQkoNjU1MzUpCisjIGRlZmluZSBVSU5UMzJfTUFYCQkoNDI5NDk2NzI5NVUpCisjIGRlZmluZSBVSU5UNjRfTUFYCQkoX19VSU5UNjRfQygxODQ0Njc0NDA3MzcwOTU1MTYxNSkpCisKKworLyogTWluaW11bSBvZiBzaWduZWQgaW50ZWdyYWwgdHlwZXMgaGF2aW5nIGEgbWluaW11bSBzaXplLiAgKi8KKyMgZGVmaW5lIElOVF9MRUFTVDhfTUlOCQkoLTEyOCkKKyMgZGVmaW5lIElOVF9MRUFTVDE2X01JTgkoLTMyNzY3LTEpCisjIGRlZmluZSBJTlRfTEVBU1QzMl9NSU4JKC0yMTQ3NDgzNjQ3LTEpCisjIGRlZmluZSBJTlRfTEVBU1Q2NF9NSU4JKC1fX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNyktMSkKKy8qIE1heGltdW0gb2Ygc2lnbmVkIGludGVncmFsIHR5cGVzIGhhdmluZyBhIG1pbmltdW0gc2l6ZS4gICovCisjIGRlZmluZSBJTlRfTEVBU1Q4X01BWAkJKDEyNykKKyMgZGVmaW5lIElOVF9MRUFTVDE2X01BWAkoMzI3NjcpCisjIGRlZmluZSBJTlRfTEVBU1QzMl9NQVgJKDIxNDc0ODM2NDcpCisjIGRlZmluZSBJTlRfTEVBU1Q2NF9NQVgJKF9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKKworLyogTWF4aW11bSBvZiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBoYXZpbmcgYSBtaW5pbXVtIHNpemUuICAqLworIyBkZWZpbmUgVUlOVF9MRUFTVDhfTUFYCSgyNTUpCisjIGRlZmluZSBVSU5UX0xFQVNUMTZfTUFYCSg2NTUzNSkKKyMgZGVmaW5lIFVJTlRfTEVBU1QzMl9NQVgJKDQyOTQ5NjcyOTVVKQorIyBkZWZpbmUgVUlOVF9MRUFTVDY0X01BWAkoX19VSU5UNjRfQygxODQ0Njc0NDA3MzcwOTU1MTYxNSkpCisKKworLyogTWluaW11bSBvZiBmYXN0IHNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBoYXZpbmcgYSBtaW5pbXVtIHNpemUuICAqLworIyBkZWZpbmUgSU5UX0ZBU1Q4X01JTgkJKC0xMjgpCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBJTlRfRkFTVDE2X01JTgkoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMLTEpCisjICBkZWZpbmUgSU5UX0ZBU1QzMl9NSU4JKC05MjIzMzcyMDM2ODU0Nzc1ODA3TC0xKQorIyBlbHNlCisjICBkZWZpbmUgSU5UX0ZBU1QxNl9NSU4JKC0yMTQ3NDgzNjQ3LTEpCisjICBkZWZpbmUgSU5UX0ZBU1QzMl9NSU4JKC0yMTQ3NDgzNjQ3LTEpCisjIGVuZGlmCisjIGRlZmluZSBJTlRfRkFTVDY0X01JTgkJKC1fX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNyktMSkKKy8qIE1heGltdW0gb2YgZmFzdCBzaWduZWQgaW50ZWdyYWwgdHlwZXMgaGF2aW5nIGEgbWluaW11bSBzaXplLiAgKi8KKyMgZGVmaW5lIElOVF9GQVNUOF9NQVgJCSgxMjcpCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBJTlRfRkFTVDE2X01BWAkoOTIyMzM3MjAzNjg1NDc3NTgwN0wpCisjICBkZWZpbmUgSU5UX0ZBU1QzMl9NQVgJKDkyMjMzNzIwMzY4NTQ3NzU4MDdMKQorIyBlbHNlCisjICBkZWZpbmUgSU5UX0ZBU1QxNl9NQVgJKDIxNDc0ODM2NDcpCisjICBkZWZpbmUgSU5UX0ZBU1QzMl9NQVgJKDIxNDc0ODM2NDcpCisjIGVuZGlmCisjIGRlZmluZSBJTlRfRkFTVDY0X01BWAkJKF9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKKworLyogTWF4aW11bSBvZiBmYXN0IHVuc2lnbmVkIGludGVncmFsIHR5cGVzIGhhdmluZyBhIG1pbmltdW0gc2l6ZS4gICovCisjIGRlZmluZSBVSU5UX0ZBU1Q4X01BWAkJKDI1NSkKKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIFVJTlRfRkFTVDE2X01BWAkoMTg0NDY3NDQwNzM3MDk1NTE2MTVVTCkKKyMgIGRlZmluZSBVSU5UX0ZBU1QzMl9NQVgJKDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwpCisjIGVsc2UKKyMgIGRlZmluZSBVSU5UX0ZBU1QxNl9NQVgJKDQyOTQ5NjcyOTVVKQorIyAgZGVmaW5lIFVJTlRfRkFTVDMyX01BWAkoNDI5NDk2NzI5NVUpCisjIGVuZGlmCisjIGRlZmluZSBVSU5UX0ZBU1Q2NF9NQVgJKF9fVUlOVDY0X0MoMTg0NDY3NDQwNzM3MDk1NTE2MTUpKQorCisKKy8qIFZhbHVlcyB0byB0ZXN0IGZvciBpbnRlZ3JhbCB0eXBlcyBob2xkaW5nIGB2b2lkIConIHBvaW50ZXIuICAqLworIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgSU5UUFRSX01JTgkJKC05MjIzMzcyMDM2ODU0Nzc1ODA3TC0xKQorIyAgZGVmaW5lIElOVFBUUl9NQVgJCSg5MjIzMzcyMDM2ODU0Nzc1ODA3TCkKKyMgIGRlZmluZSBVSU5UUFRSX01BWAkJKDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwpCisjIGVsc2UKKyMgIGRlZmluZSBJTlRQVFJfTUlOCQkoLTIxNDc0ODM2NDctMSkKKyMgIGRlZmluZSBJTlRQVFJfTUFYCQkoMjE0NzQ4MzY0NykKKyMgIGRlZmluZSBVSU5UUFRSX01BWAkJKDQyOTQ5NjcyOTVVKQorIyBlbmRpZgorCisKKy8qIE1pbmltdW0gZm9yIGxhcmdlc3Qgc2lnbmVkIGludGVncmFsIHR5cGUuICAqLworIyBkZWZpbmUgSU5UTUFYX01JTgkJKC1fX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNyktMSkKKy8qIE1heGltdW0gZm9yIGxhcmdlc3Qgc2lnbmVkIGludGVncmFsIHR5cGUuICAqLworIyBkZWZpbmUgSU5UTUFYX01BWAkJKF9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKKworLyogTWF4aW11bSBmb3IgbGFyZ2VzdCB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlLiAgKi8KKyMgZGVmaW5lIFVJTlRNQVhfTUFYCQkoX19VSU5UNjRfQygxODQ0Njc0NDA3MzcwOTU1MTYxNSkpCisKKworLyogTGltaXRzIG9mIG90aGVyIGludGVnZXIgdHlwZXMuICAqLworCisvKiBMaW1pdHMgb2YgYHB0cmRpZmZfdCcgdHlwZS4gICovCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBQVFJESUZGX01JTgkJKC05MjIzMzcyMDM2ODU0Nzc1ODA3TC0xKQorIyAgZGVmaW5lIFBUUkRJRkZfTUFYCQkoOTIyMzM3MjAzNjg1NDc3NTgwN0wpCisjIGVsc2UKKyMgIGRlZmluZSBQVFJESUZGX01JTgkJKC0yMTQ3NDgzNjQ3LTEpCisjICBkZWZpbmUgUFRSRElGRl9NQVgJCSgyMTQ3NDgzNjQ3KQorIyBlbmRpZgorCisvKiBMaW1pdHMgb2YgYHNpZ19hdG9taWNfdCcuICAqLworIyBkZWZpbmUgU0lHX0FUT01JQ19NSU4JCSgtMjE0NzQ4MzY0Ny0xKQorIyBkZWZpbmUgU0lHX0FUT01JQ19NQVgJCSgyMTQ3NDgzNjQ3KQorCisvKiBMaW1pdCBvZiBgc2l6ZV90JyB0eXBlLiAgKi8KKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIFNJWkVfTUFYCQkoMTg0NDY3NDQwNzM3MDk1NTE2MTVVTCkKKyMgZWxzZQorIyAgZGVmaW5lIFNJWkVfTUFYCQkoNDI5NDk2NzI5NVUpCisjIGVuZGlmCisKKy8qIExpbWl0cyBvZiBgd2NoYXJfdCcuICAqLworIyBpZm5kZWYgV0NIQVJfTUlOCisvKiBUaGVzZSBjb25zdGFudHMgbWlnaHQgYWxzbyBiZSBkZWZpbmVkIGluIDx3Y2hhci5oPi4gICovCisjICBkZWZpbmUgV0NIQVJfTUlOCQlfX1dDSEFSX01JTgorIyAgZGVmaW5lIFdDSEFSX01BWAkJX19XQ0hBUl9NQVgKKyMgZW5kaWYKKworLyogTGltaXRzIG9mIGB3aW50X3QnLiAgKi8KKyMgZGVmaW5lIFdJTlRfTUlOCQkoMHUpCisjIGRlZmluZSBXSU5UX01BWAkJKDQyOTQ5NjcyOTV1KQorCisjZW5kaWYJLyogQysrICYmIGxpbWl0IG1hY3JvcyAqLworCisKKy8qIFRoZSBJU08gQzk5IHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IGluIEMrKyBpbXBsZW1lbnRhdGlvbnMgdGhlc2UKKyAgIHNob3VsZCBvbmx5IGJlIGRlZmluZWQgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQuICAqLworI2lmICFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX19TVERDX0NPTlNUQU5UX01BQ1JPUworCisvKiBTaWduZWQuICAqLworIyBkZWZpbmUgSU5UOF9DKGMpCWMKKyMgZGVmaW5lIElOVDE2X0MoYykJYworIyBkZWZpbmUgSU5UMzJfQyhjKQljCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBJTlQ2NF9DKGMpCWMgIyMgTAorIyBlbHNlCisjICBkZWZpbmUgSU5UNjRfQyhjKQljICMjIExMCisjIGVuZGlmCisKKy8qIFVuc2lnbmVkLiAgKi8KKyMgZGVmaW5lIFVJTlQ4X0MoYykJYworIyBkZWZpbmUgVUlOVDE2X0MoYykJYworIyBkZWZpbmUgVUlOVDMyX0MoYykJYyAjIyBVCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBVSU5UNjRfQyhjKQljICMjIFVMCisjIGVsc2UKKyMgIGRlZmluZSBVSU5UNjRfQyhjKQljICMjIFVMTAorIyBlbmRpZgorCisvKiBNYXhpbWFsIHR5cGUuICAqLworIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgSU5UTUFYX0MoYykJYyAjIyBMCisjICBkZWZpbmUgVUlOVE1BWF9DKGMpCWMgIyMgVUwKKyMgZWxzZQorIyAgZGVmaW5lIElOVE1BWF9DKGMpCWMgIyMgTEwKKyMgIGRlZmluZSBVSU5UTUFYX0MoYykJYyAjIyBVTEwKKyMgZW5kaWYKKworI2VuZGlmCS8qIEMrKyAmJiBjb25zdGFudCBtYWNyb3MgKi8KKworI2VuZGlmIC8qIHN0ZGludC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGlvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0MTJhMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RkaW8uaApAQCAtMCwwICsxLDk0NCBAQAorLyogRGVmaW5lIElTTyBDIHN0ZGlvIG9uIHRvcCBvZiBDKysgaW9zdHJlYW1zLgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk0LTIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjE5IElucHV0L291dHB1dAk8c3RkaW8uaD4KKyAqLworCisjaWZuZGVmIF9TVERJT19ICisKKyNpZiAhZGVmaW5lZCBfX25lZWRfRklMRSAmJiAhZGVmaW5lZCBfX25lZWRfX19GSUxFCisjIGRlZmluZSBfU1RESU9fSAkxCisjIGluY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworIyBkZWZpbmUgX19uZWVkX3NpemVfdAorIyBkZWZpbmUgX19uZWVkX05VTEwKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisKKyMgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorIyBkZWZpbmUgX19uZWVkX0ZJTEUKKyMgZGVmaW5lIF9fbmVlZF9fX0ZJTEUKKyNlbmRpZiAvKiBEb24ndCBuZWVkIEZJTEUuICAqLworCisKKyNpZiAhZGVmaW5lZCBfX0ZJTEVfZGVmaW5lZCAmJiBkZWZpbmVkIF9fbmVlZF9GSUxFCisKKy8qIERlZmluZSBvdXRzaWRlIG9mIG5hbWVzcGFjZSBzbyB0aGUgQysrIGlzIGhhcHB5LiAgKi8KK3N0cnVjdCBfSU9fRklMRTsKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBUaGUgb3BhcXVlIHR5cGUgb2Ygc3RyZWFtcy4gIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gdXNlZCBlbHNld2hlcmUuICAqLwordHlwZWRlZiBzdHJ1Y3QgX0lPX0ZJTEUgRklMRTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKyNpZiBkZWZpbmVkIF9fVVNFX0xBUkdFRklMRTY0IHx8IGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1BPU0lYIFwKKyAgICB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OSB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOIFwKKyAgICB8fCBkZWZpbmVkIF9fVVNFX1BPU0lYMgorX19VU0lOR19OQU1FU1BBQ0VfU1REKEZJTEUpCisjZW5kaWYKKworIyBkZWZpbmUgX19GSUxFX2RlZmluZWQJMQorI2VuZGlmIC8qIEZJTEUgbm90IGRlZmluZWQuICAqLworI3VuZGVmCV9fbmVlZF9GSUxFCisKKworI2lmICFkZWZpbmVkIF9fX19GSUxFX2RlZmluZWQgJiYgZGVmaW5lZCBfX25lZWRfX19GSUxFCisKKy8qIFRoZSBvcGFxdWUgdHlwZSBvZiBzdHJlYW1zLiAgVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiB1c2VkIGVsc2V3aGVyZS4gICovCit0eXBlZGVmIHN0cnVjdCBfSU9fRklMRSBfX0ZJTEU7CisKKyMgZGVmaW5lIF9fX19GSUxFX2RlZmluZWQJMQorI2VuZGlmIC8qIF9fRklMRSBub3QgZGVmaW5lZC4gICovCisjdW5kZWYJX19uZWVkX19fRklMRQorCisKKyNpZmRlZglfU1RESU9fSAorI2RlZmluZSBfU1RESU9fVVNFU19JT1NUUkVBTQorCisjaW5jbHVkZSA8bGliaW8uaD4KKworI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorIyBpZmRlZiBfX0dOVUNfXworIyAgaWZuZGVmIF9WQV9MSVNUX0RFRklORUQKK3R5cGVkZWYgX0dfdmFfbGlzdCB2YV9saXN0OworIyAgIGRlZmluZSBfVkFfTElTVF9ERUZJTkVECisjICBlbmRpZgorIyBlbHNlCisjICBpbmNsdWRlIDxzdGRhcmcuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKyMgaWZuZGVmIF9fb2ZmX3RfZGVmaW5lZAorIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAordHlwZWRlZiBfX29mZl90IG9mZl90OworIyBlbHNlCit0eXBlZGVmIF9fb2ZmNjRfdCBvZmZfdDsKKyMgZW5kaWYKKyMgZGVmaW5lIF9fb2ZmX3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZiBkZWZpbmVkIF9fVVNFX0xBUkdFRklMRTY0ICYmICFkZWZpbmVkIF9fb2ZmNjRfdF9kZWZpbmVkCit0eXBlZGVmIF9fb2ZmNjRfdCBvZmY2NF90OworIyBkZWZpbmUgX19vZmY2NF90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19zc2l6ZV90X2RlZmluZWQKK3R5cGVkZWYgX19zc2l6ZV90IHNzaXplX3Q7CisjIGRlZmluZSBfX3NzaXplX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGZnZXRwb3MnIGFuZCBgZnNldHBvcycuICAqLworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX0dfZnBvc190IGZwb3NfdDsKKyNlbHNlCit0eXBlZGVmIF9HX2Zwb3M2NF90IGZwb3NfdDsKKyNlbmRpZgorX19FTkRfTkFNRVNQQUNFX1NURAorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0Cit0eXBlZGVmIF9HX2Zwb3M2NF90IGZwb3M2NF90OworI2VuZGlmCisKKy8qIFRoZSBwb3NzaWJpbGl0aWVzIGZvciB0aGUgdGhpcmQgYXJndW1lbnQgdG8gYHNldHZidWYnLiAgKi8KKyNkZWZpbmUgX0lPRkJGIDAJCS8qIEZ1bGx5IGJ1ZmZlcmVkLiAgKi8KKyNkZWZpbmUgX0lPTEJGIDEJCS8qIExpbmUgYnVmZmVyZWQuICAqLworI2RlZmluZSBfSU9OQkYgMgkJLyogTm8gYnVmZmVyaW5nLiAgKi8KKworCisvKiBEZWZhdWx0IGJ1ZmZlciBzaXplLiAgKi8KKyNpZm5kZWYgQlVGU0laCisjIGRlZmluZSBCVUZTSVogX0lPX0JVRlNJWgorI2VuZGlmCisKKworLyogRW5kIG9mIGZpbGUgY2hhcmFjdGVyLgorICAgU29tZSB0aGluZ3MgdGhyb3VnaG91dCB0aGUgbGlicmFyeSByZWx5IG9uIHRoaXMgYmVpbmcgLTEuICAqLworI2lmbmRlZiBFT0YKKyMgZGVmaW5lIEVPRiAoLTEpCisjZW5kaWYKKworCisvKiBUaGUgcG9zc2liaWxpdGllcyBmb3IgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIGBmc2VlaycuCisgICBUaGVzZSB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLiAgKi8KKyNkZWZpbmUgU0VFS19TRVQJMAkvKiBTZWVrIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUuICAqLworI2RlZmluZSBTRUVLX0NVUgkxCS8qIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KKyNkZWZpbmUgU0VFS19FTkQJMgkvKiBTZWVrIGZyb20gZW5kIG9mIGZpbGUuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgU0VFS19EQVRBCTMJLyogU2VlayB0byBuZXh0IGRhdGEuICAqLworIyBkZWZpbmUgU0VFS19IT0xFCTQJLyogU2VlayB0byBuZXh0IGhvbGUuICAqLworI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBEZWZhdWx0IHBhdGggcHJlZml4IGZvciBgdGVtcG5hbScgYW5kIGB0bXBuYW0nLiAgKi8KKyMgZGVmaW5lIFBfdG1wZGlyCSIvdG1wIgorI2VuZGlmCisKKworLyogR2V0IHRoZSB2YWx1ZXM6CisgICBMX3RtcG5hbQlIb3cgbG9uZyBhbiBhcnJheSBvZiBjaGFycyBtdXN0IGJlIHRvIGJlIHBhc3NlZCB0byBgdG1wbmFtJy4KKyAgIFRNUF9NQVgJVGhlIG1pbmltdW0gbnVtYmVyIG9mIHVuaXF1ZSBmaWxlbmFtZXMgZ2VuZXJhdGVkIGJ5IHRtcG5hbQorCQkoYW5kIHRlbXBuYW0gd2hlbiBpdCB1c2VzIHRtcG5hbSdzIG5hbWUgc3BhY2UpLAorCQlvciB0ZW1wbmFtICh0aGUgdHdvIGFyZSBzZXBhcmF0ZSkuCisgICBMX2N0ZXJtaWQJSG93IGxvbmcgYW4gYXJyYXkgdG8gcGFzcyB0byBgY3Rlcm1pZCcuCisgICBMX2N1c2VyaWQJSG93IGxvbmcgYW4gYXJyYXkgdG8gcGFzcyB0byBgY3VzZXJpZCcuCisgICBGT1BFTl9NQVgJTWluaW11bSBudW1iZXIgb2YgZmlsZXMgdGhhdCBjYW4gYmUgb3BlbiBhdCBvbmNlLgorICAgRklMRU5BTUVfTUFYCU1heGltdW0gbGVuZ3RoIG9mIGEgZmlsZW5hbWUuICAqLworI2luY2x1ZGUgPGJpdHMvc3RkaW9fbGltLmg+CisKKworLyogU3RhbmRhcmQgc3RyZWFtcy4gICovCitleHRlcm4gc3RydWN0IF9JT19GSUxFICpzdGRpbjsJCS8qIFN0YW5kYXJkIGlucHV0IHN0cmVhbS4gICovCitleHRlcm4gc3RydWN0IF9JT19GSUxFICpzdGRvdXQ7CQkvKiBTdGFuZGFyZCBvdXRwdXQgc3RyZWFtLiAgKi8KK2V4dGVybiBzdHJ1Y3QgX0lPX0ZJTEUgKnN0ZGVycjsJCS8qIFN0YW5kYXJkIGVycm9yIG91dHB1dCBzdHJlYW0uICAqLworLyogQzg5L0M5OSBzYXkgdGhleSdyZSBtYWNyb3MuICBNYWtlIHRoZW0gaGFwcHkuICAqLworI2RlZmluZSBzdGRpbiBzdGRpbgorI2RlZmluZSBzdGRvdXQgc3Rkb3V0CisjZGVmaW5lIHN0ZGVyciBzdGRlcnIKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZW1vdmUgZmlsZSBGSUxFTkFNRS4gICovCitleHRlcm4gaW50IHJlbW92ZSAoX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lKSBfX1RIUk9XOworLyogUmVuYW1lIGZpbGUgT0xEIHRvIE5FVy4gICovCitleHRlcm4gaW50IHJlbmFtZSAoX19jb25zdCBjaGFyICpfX29sZCwgX19jb25zdCBjaGFyICpfX25ldykgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogUmVuYW1lIGZpbGUgT0xEIHJlbGF0aXZlIHRvIE9MREZEIHRvIE5FVyByZWxhdGl2ZSB0byBORVdGRC4gICovCitleHRlcm4gaW50IHJlbmFtZWF0IChpbnQgX19vbGRmZCwgX19jb25zdCBjaGFyICpfX29sZCwgaW50IF9fbmV3ZmQsCisJCSAgICAgX19jb25zdCBjaGFyICpfX25ldykgX19USFJPVzsKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGFuZCBvcGVuIGl0IHJlYWQvd3JpdGUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gRklMRSAqdG1wZmlsZSAodm9pZCkgX193dXI7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gRklMRSAqX19SRURJUkVDVCAodG1wZmlsZSwgKHZvaWQpLCB0bXBmaWxlNjQpIF9fd3VyOworIyBlbHNlCisjICBkZWZpbmUgdG1wZmlsZSB0bXBmaWxlNjQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBGSUxFICp0bXBmaWxlNjQgKHZvaWQpIF9fd3VyOworI2VuZGlmCisKKy8qIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGZpbGVuYW1lLiAgKi8KK2V4dGVybiBjaGFyICp0bXBuYW0gKGNoYXIgKl9fcykgX19USFJPVyBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFRoaXMgaXMgdGhlIHJlZW50cmFudCB2YXJpYW50IG9mIGB0bXBuYW0nLiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBpcworICAgdGhhdCBpdCBkb2VzIG5vdCBhbGxvdyBTIHRvIGJlIE5VTEwuICAqLworZXh0ZXJuIGNoYXIgKnRtcG5hbV9yIChjaGFyICpfX3MpIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIEdlbmVyYXRlIGEgdW5pcXVlIHRlbXBvcmFyeSBmaWxlbmFtZSB1c2luZyB1cCB0byBmaXZlIGNoYXJhY3RlcnMgb2YgUEZYCisgICBpZiBpdCBpcyBub3QgTlVMTC4gIFRoZSBkaXJlY3RvcnkgdG8gcHV0IHRoaXMgZmlsZSBpbiBpcyBzZWFyY2hlZCBmb3IKKyAgIGFzIGZvbGxvd3M6IEZpcnN0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAiVE1QRElSIiBpcyBjaGVja2VkLgorICAgSWYgaXQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSB3cml0YWJsZSBkaXJlY3RvcnksIHRoYXQgZGlyZWN0b3J5IGlzIHVzZWQuCisgICBJZiBub3QgYW5kIGlmIERJUiBpcyBub3QgTlVMTCwgdGhhdCB2YWx1ZSBpcyBjaGVja2VkLiAgSWYgdGhhdCBmYWlscywKKyAgIFBfdG1wZGlyIGlzIHRyaWVkIGFuZCBmaW5hbGx5ICIvdG1wIi4gIFRoZSBzdG9yYWdlIGZvciB0aGUgZmlsZW5hbWUKKyAgIGlzIGFsbG9jYXRlZCBieSBgbWFsbG9jJy4gICovCitleHRlcm4gY2hhciAqdGVtcG5hbSAoX19jb25zdCBjaGFyICpfX2RpciwgX19jb25zdCBjaGFyICpfX3BmeCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX3d1cjsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQ2xvc2UgU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmNsb3NlIChGSUxFICpfX3N0cmVhbSk7CisvKiBGbHVzaCBTVFJFQU0sIG9yIGFsbCBzdHJlYW1zIGlmIFNUUkVBTSBpcyBOVUxMLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmZsdXNoIChGSUxFICpfX3N0cmVhbSk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBGYXN0ZXIgdmVyc2lvbnMgd2hlbiBsb2NraW5nIGlzIG5vdCByZXF1aXJlZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmZmx1c2hfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBDbG9zZSBhbGwgc3RyZWFtcy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmY2xvc2VhbGwgKHZvaWQpOworI2VuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKy8qIE9wZW4gYSBmaWxlIGFuZCBjcmVhdGUgYSBuZXcgc3RyZWFtIGZvciBpdC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gRklMRSAqZm9wZW4gKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZpbGVuYW1lLAorCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbW9kZXMpIF9fd3VyOworLyogT3BlbiBhIGZpbGUsIHJlcGxhY2luZyBhbiBleGlzdGluZyBzdHJlYW0gd2l0aCBpdC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gRklMRSAqZnJlb3BlbiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZW5hbWUsCisJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX21vZGVzLAorCQkgICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBGSUxFICpfX1JFRElSRUNUIChmb3BlbiwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZpbGVuYW1lLAorCQkJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19tb2RlcyksIGZvcGVuNjQpCisgIF9fd3VyOworZXh0ZXJuIEZJTEUgKl9fUkVESVJFQ1QgKGZyZW9wZW4sIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFtZSwKKwkJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19tb2RlcywKKwkJCQkgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwgZnJlb3BlbjY0KQorICBfX3d1cjsKKyMgZWxzZQorIyAgZGVmaW5lIGZvcGVuIGZvcGVuNjQKKyMgIGRlZmluZSBmcmVvcGVuIGZyZW9wZW42NAorIyBlbmRpZgorI2VuZGlmCitfX0VORF9OQU1FU1BBQ0VfU1RECisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBGSUxFICpmb3BlbjY0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFtZSwKKwkJICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbW9kZXMpIF9fd3VyOworZXh0ZXJuIEZJTEUgKmZyZW9wZW42NCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZW5hbWUsCisJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19tb2RlcywKKwkJCUZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworI2VuZGlmCisKKyNpZmRlZglfX1VTRV9QT1NJWAorLyogQ3JlYXRlIGEgbmV3IHN0cmVhbSB0aGF0IHJlZmVycyB0byBhbiBleGlzdGluZyBzeXN0ZW0gZmlsZSBkZXNjcmlwdG9yLiAgKi8KK2V4dGVybiBGSUxFICpmZG9wZW4gKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fbW9kZXMpIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworI2lmZGVmCV9fVVNFX0dOVQorLyogQ3JlYXRlIGEgbmV3IHN0cmVhbSB0aGF0IHJlZmVycyB0byB0aGUgZ2l2ZW4gbWFnaWMgY29va2llLAorICAgYW5kIHVzZXMgdGhlIGdpdmVuIGZ1bmN0aW9ucyBmb3IgaW5wdXQgYW5kIG91dHB1dC4gICovCitleHRlcm4gRklMRSAqZm9wZW5jb29raWUgKHZvaWQgKl9fcmVzdHJpY3QgX19tYWdpY19jb29raWUsCisJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX21vZGVzLAorCQkJICBfSU9fY29va2llX2lvX2Z1bmN0aW9uc190IF9faW9fZnVuY3MpIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBDcmVhdGUgYSBuZXcgc3RyZWFtIHRoYXQgcmVmZXJzIHRvIGEgbWVtb3J5IGJ1ZmZlci4gICovCitleHRlcm4gRklMRSAqZm1lbW9wZW4gKHZvaWQgKl9fcywgc2l6ZV90IF9fbGVuLCBfX2NvbnN0IGNoYXIgKl9fbW9kZXMpCisgIF9fVEhST1cgX193dXI7CisKKy8qIE9wZW4gYSBzdHJlYW0gdGhhdCB3cml0ZXMgaW50byBhIG1hbGxvYydkIGJ1ZmZlciB0aGF0IGlzIGV4cGFuZGVkIGFzCisgICBuZWNlc3NhcnkuICAqQlVGTE9DIGFuZCAqU0laRUxPQyBhcmUgdXBkYXRlZCB3aXRoIHRoZSBidWZmZXIncyBsb2NhdGlvbgorICAgYW5kIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuIG9uIGZmbHVzaCBvciBmY2xvc2UuICAqLworZXh0ZXJuIEZJTEUgKm9wZW5fbWVtc3RyZWFtIChjaGFyICoqX19idWZsb2MsIHNpemVfdCAqX19zaXplbG9jKSBfX1RIUk9XIF9fd3VyOworI2VuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBJZiBCVUYgaXMgTlVMTCwgbWFrZSBTVFJFQU0gdW5idWZmZXJlZC4KKyAgIEVsc2UgbWFrZSBpdCB1c2UgYnVmZmVyIEJVRiwgb2Ygc2l6ZSBCVUZTSVouICAqLworZXh0ZXJuIHZvaWQgc2V0YnVmIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmKSBfX1RIUk9XOworLyogTWFrZSBTVFJFQU0gdXNlIGJ1ZmZlcmluZyBtb2RlIE1PREUuCisgICBJZiBCVUYgaXMgbm90IE5VTEwsIHVzZSBOIGJ5dGVzIG9mIGl0IGZvciBidWZmZXJpbmc7CisgICBlbHNlIGFsbG9jYXRlIGFuIGludGVybmFsIGJ1ZmZlciBOIGJ5dGVzIGxvbmcuICAqLworZXh0ZXJuIGludCBzZXR2YnVmIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLAorCQkgICAgaW50IF9fbW9kZXMsIHNpemVfdCBfX24pIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZglfX1VTRV9CU0QKKy8qIElmIEJVRiBpcyBOVUxMLCBtYWtlIFNUUkVBTSB1bmJ1ZmZlcmVkLgorICAgRWxzZSBtYWtlIGl0IHVzZSBTSVpFIGJ5dGVzIG9mIEJVRiBmb3IgYnVmZmVyaW5nLiAgKi8KK2V4dGVybiB2b2lkIHNldGJ1ZmZlciAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgY2hhciAqX19yZXN0cmljdCBfX2J1ZiwKKwkJICAgICAgIHNpemVfdCBfX3NpemUpIF9fVEhST1c7CisKKy8qIE1ha2UgU1RSRUFNIGxpbmUtYnVmZmVyZWQuICAqLworZXh0ZXJuIHZvaWQgc2V0bGluZWJ1ZiAoRklMRSAqX19zdHJlYW0pIF9fVEhST1c7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZnByaW50ZiAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKTsKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gc3Rkb3V0LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcHJpbnRmIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLik7CisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIFMuICAqLworZXh0ZXJuIGludCBzcHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywKKwkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSBfX1RIUk9XTkw7CisKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gUyBmcm9tIGFyZ3VtZW50IGxpc3QgQVJHLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdmZwcmludGYgKEZJTEUgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCSAgICAgX0dfdmFfbGlzdCBfX2FyZyk7CisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIHN0ZG91dCBmcm9tIGFyZ3VtZW50IGxpc3QgQVJHLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdnByaW50ZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCBfR192YV9saXN0IF9fYXJnKTsKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gUyBmcm9tIGFyZ3VtZW50IGxpc3QgQVJHLiAgKi8KK2V4dGVybiBpbnQgdnNwcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCSAgICAgX0dfdmFfbGlzdCBfX2FyZykgX19USFJPV05MOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogTWF4aW11bSBjaGFycyBvZiBvdXRwdXQgdG8gd3JpdGUgaW4gTUFYTEVOLiAgKi8KK2V4dGVybiBpbnQgc25wcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhsZW4sCisJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIF9fVEhST1dOTCBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKKworZXh0ZXJuIGludCB2c25wcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhsZW4sCisJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgX0dfdmFfbGlzdCBfX2FyZykKKyAgICAgX19USFJPV05MIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYSBzdHJpbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHdpdGggYG1hbGxvYycuCisgICBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nIGluICpQVFIuICAqLworZXh0ZXJuIGludCB2YXNwcmludGYgKGNoYXIgKipfX3Jlc3RyaWN0IF9fcHRyLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mLAorCQkgICAgICBfR192YV9saXN0IF9fYXJnKQorICAgICBfX1RIUk9XTkwgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDApKSkgX193dXI7CitleHRlcm4gaW50IF9fYXNwcmludGYgKGNoYXIgKipfX3Jlc3RyaWN0IF9fcHRyLAorCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCisgICAgIF9fVEhST1dOTCBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMykpKSBfX3d1cjsKK2V4dGVybiBpbnQgYXNwcmludGYgKGNoYXIgKipfX3Jlc3RyaWN0IF9fcHRyLAorCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQorICAgICBfX1RIUk9XTkwgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDMpKSkgX193dXI7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIGEgZmlsZSBkZXNjcmlwdG9yLgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGV5IGFyZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdmRwcmludGYgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsCisJCSAgICAgX0dfdmFfbGlzdCBfX2FyZykKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDApKSk7CitleHRlcm4gaW50IGRwcmludGYgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDMpKSk7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZnNjYW5mIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgX193dXI7CisvKiBSZWFkIGZvcm1hdHRlZCBpbnB1dCBmcm9tIHN0ZGluLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgc2NhbmYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSBfX3d1cjsKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gUy4gICovCitleHRlcm4gaW50IHNzY2FuZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKKwkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIF9fVEhST1c7CisKKyNpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSAmJiAhZGVmaW5lZCBfX1VTRV9HTlUgXAorICAgICYmICghZGVmaW5lZCBfX0xEQkxfQ09NUEFUIHx8ICFkZWZpbmVkIF9fUkVESVJFQ1QpIFwKKyAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorIyBpZmRlZiBfX1JFRElSRUNUCisvKiBGb3Igc3RyaWN0IElTTyBDOTkgb3IgUE9TSVggY29tcGxpYW5jZSBkaXNhbGxvdyAlYXMsICVhUyBhbmQgJWFbCisgICBHTlUgZXh0ZW5zaW9uIHdoaWNoIGNvbmZsaWN0cyB3aXRoIHZhbGlkICVhIGZvbGxvd2VkIGJ5IGxldHRlcgorICAgcywgUyBvciBbLiAgKi8KK2V4dGVybiBpbnQgX19SRURJUkVDVCAoZnNjYW5mLCAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLiksCisJCSAgICAgICBfX2lzb2M5OV9mc2NhbmYpIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChzY2FuZiwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSwKKwkJICAgICAgIF9faXNvYzk5X3NjYW5mKSBfX3d1cjsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHNzY2FuZiwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsCisJCQkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSwKKwkJCSAgIF9faXNvYzk5X3NzY2FuZik7CisjIGVsc2UKK2V4dGVybiBpbnQgX19pc29jOTlfZnNjYW5mIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSBfX3d1cjsKK2V4dGVybiBpbnQgX19pc29jOTlfc2NhbmYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSBfX3d1cjsKK2V4dGVybiBpbnQgX19pc29jOTlfc3NjYW5mIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLAorCQkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSBfX1RIUk9XOworIyAgZGVmaW5lIGZzY2FuZiBfX2lzb2M5OV9mc2NhbmYKKyMgIGRlZmluZSBzY2FuZiBfX2lzb2M5OV9zY2FuZgorIyAgZGVmaW5lIHNzY2FuZiBfX2lzb2M5OV9zc2NhbmYKKyMgZW5kaWYKKyNlbmRpZgorCitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZglfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogUmVhZCBmb3JtYXR0ZWQgaW5wdXQgZnJvbSBTIGludG8gYXJndW1lbnQgbGlzdCBBUkcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCB2ZnNjYW5mIChGSUxFICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkgICAgX0dfdmFfbGlzdCBfX2FyZykKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fc2NhbmZfXywgMiwgMCkpKSBfX3d1cjsKKworLyogUmVhZCBmb3JtYXR0ZWQgaW5wdXQgZnJvbSBzdGRpbiBpbnRvIGFyZ3VtZW50IGxpc3QgQVJHLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdnNjYW5mIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIF9HX3ZhX2xpc3QgX19hcmcpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3NjYW5mX18sIDEsIDApKSkgX193dXI7CisKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gUyBpbnRvIGFyZ3VtZW50IGxpc3QgQVJHLiAgKi8KK2V4dGVybiBpbnQgdnNzY2FuZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKKwkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgX0dfdmFfbGlzdCBfX2FyZykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19zY2FuZl9fLCAyLCAwKSkpOworCisjIGlmICFkZWZpbmVkIF9fVVNFX0dOVSBcCisgICAgICYmICghZGVmaW5lZCBfX0xEQkxfQ09NUEFUIHx8ICFkZWZpbmVkIF9fUkVESVJFQ1QpIFwKKyAgICAgJiYgKGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykKKyMgIGlmZGVmIF9fUkVESVJFQ1QKKy8qIEZvciBzdHJpY3QgSVNPIEM5OSBvciBQT1NJWCBjb21wbGlhbmNlIGRpc2FsbG93ICVhcywgJWFTIGFuZCAlYVsKKyAgIEdOVSBleHRlbnNpb24gd2hpY2ggY29uZmxpY3RzIHdpdGggdmFsaWQgJWEgZm9sbG93ZWQgYnkgbGV0dGVyCisgICBzLCBTIG9yIFsuICAqLworZXh0ZXJuIGludCBfX1JFRElSRUNUICh2ZnNjYW5mLAorCQkgICAgICAgKEZJTEUgKl9fcmVzdHJpY3QgX19zLAorCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCBfR192YV9saXN0IF9fYXJnKSwKKwkJICAgICAgIF9faXNvYzk5X3Zmc2NhbmYpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3NjYW5mX18sIDIsIDApKSkgX193dXI7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKHZzY2FuZiwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCQlfR192YV9saXN0IF9fYXJnKSwgX19pc29jOTlfdnNjYW5mKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19zY2FuZl9fLCAxLCAwKSkpIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAodnNzY2FuZiwKKwkJCSAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLAorCQkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgICBfR192YV9saXN0IF9fYXJnKSwgX19pc29jOTlfdnNzY2FuZikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fc2NhbmZfXywgMiwgMCkpKTsKKyMgIGVsc2UKK2V4dGVybiBpbnQgX19pc29jOTlfdmZzY2FuZiAoRklMRSAqX19yZXN0cmljdCBfX3MsCisJCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgICAgX0dfdmFfbGlzdCBfX2FyZykgX193dXI7CitleHRlcm4gaW50IF9faXNvYzk5X3ZzY2FuZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgIF9HX3ZhX2xpc3QgX19hcmcpIF9fd3VyOworZXh0ZXJuIGludCBfX2lzb2M5OV92c3NjYW5mIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLAorCQkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICAgIF9HX3ZhX2xpc3QgX19hcmcpIF9fVEhST1c7CisjICAgZGVmaW5lIHZmc2NhbmYgX19pc29jOTlfdmZzY2FuZgorIyAgIGRlZmluZSB2c2NhbmYgX19pc29jOTlfdnNjYW5mCisjICAgZGVmaW5lIHZzc2NhbmYgX19pc29jOTlfdnNzY2FuZgorIyAgZW5kaWYKKyMgZW5kaWYKKworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmIC8qIFVzZSBJU08gQzl4LiAgKi8KKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSBTVFJFQU0uCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZnZXRjIChGSUxFICpfX3N0cmVhbSk7CitleHRlcm4gaW50IGdldGMgKEZJTEUgKl9fc3RyZWFtKTsKKworLyogUmVhZCBhIGNoYXJhY3RlciBmcm9tIHN0ZGluLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0Y2hhciAodm9pZCk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKy8qIFRoZSBDIHN0YW5kYXJkIGV4cGxpY2l0bHkgc2F5cyB0aGlzIGlzIGEgbWFjcm8sIHNvIHdlIGFsd2F5cyBkbyB0aGUKKyAgIG9wdGltaXphdGlvbiBmb3IgaXQuICAqLworI2RlZmluZSBnZXRjKF9mcCkgX0lPX2dldGMgKF9mcCkKKworI2lmIGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisvKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiBQT1NJWC4xOjE5OTYuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldGNfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKTsKK2V4dGVybiBpbnQgZ2V0Y2hhcl91bmxvY2tlZCAodm9pZCk7CisjZW5kaWYgLyogVXNlIFBPU0lYIG9yIE1JU0MuICAqLworCisjaWZkZWYgX19VU0VfTUlTQworLyogRmFzdGVyIHZlcnNpb24gd2hlbiBsb2NraW5nIGlzIG5vdCBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmdldGNfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKTsKKyNlbmRpZiAvKiBVc2UgTUlTQy4gICovCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBXcml0ZSBhIGNoYXJhY3RlciB0byBTVFJFQU0uCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4KKworICAgVGhlc2UgZnVuY3Rpb25zIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZnB1dGMgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKTsKK2V4dGVybiBpbnQgcHV0YyAoaW50IF9fYywgRklMRSAqX19zdHJlYW0pOworCisvKiBXcml0ZSBhIGNoYXJhY3RlciB0byBzdGRvdXQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdXRjaGFyIChpbnQgX19jKTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworLyogVGhlIEMgc3RhbmRhcmQgZXhwbGljaXRseSBzYXlzIHRoaXMgY2FuIGJlIGEgbWFjcm8sCisgICBzbyB3ZSBhbHdheXMgZG8gdGhlIG9wdGltaXphdGlvbiBmb3IgaXQuICAqLworI2RlZmluZSBwdXRjKF9jaCwgX2ZwKSBfSU9fcHV0YyAoX2NoLCBfZnApCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBGYXN0ZXIgdmVyc2lvbiB3aGVuIGxvY2tpbmcgaXMgbm90IG5lY2Vzc2FyeS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmcHV0Y191bmxvY2tlZCAoaW50IF9fYywgRklMRSAqX19zdHJlYW0pOworI2VuZGlmIC8qIFVzZSBNSVNDLiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisvKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiBQT1NJWC4xOjE5OTYuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHB1dGNfdW5sb2NrZWQgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKTsKK2V4dGVybiBpbnQgcHV0Y2hhcl91bmxvY2tlZCAoaW50IF9fYyk7CisjZW5kaWYgLyogVXNlIFBPU0lYIG9yIE1JU0MuICAqLworCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9NSVNDIFwKKyAgICB8fCAoZGVmaW5lZCBfX1VTRV9YT1BFTiAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorLyogR2V0IGEgd29yZCAoaW50KSBmcm9tIFNUUkVBTS4gICovCitleHRlcm4gaW50IGdldHcgKEZJTEUgKl9fc3RyZWFtKTsKKworLyogV3JpdGUgYSB3b3JkIChpbnQpIHRvIFNUUkVBTS4gICovCitleHRlcm4gaW50IHB1dHcgKGludCBfX3csIEZJTEUgKl9fc3RyZWFtKTsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogR2V0IGEgbmV3bGluZS10ZXJtaW5hdGVkIHN0cmluZyBvZiBmaW5pdGUgbGVuZ3RoIGZyb20gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBjaGFyICpmZ2V0cyAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pCisgICAgIF9fd3VyOworCisvKiBHZXQgYSBuZXdsaW5lLXRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gc3RkaW4sIHJlbW92aW5nIHRoZSBuZXdsaW5lLgorICAgRE8gTk9UIFVTRSBUSElTIEZVTkNUSU9OISEgIFRoZXJlIGlzIG5vIGxpbWl0IG9uIGhvdyBtdWNoIGl0IHdpbGwgcmVhZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gY2hhciAqZ2V0cyAoY2hhciAqX19zKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzYW1lIGFzIGBmZ2V0cycgYnV0IGRvZXMgbm90IGxvY2sgdGhlIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGNoYXIgKmZnZXRzX3VubG9ja2VkIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwKKwkJCSAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CisjZW5kaWYKKworCisjaWZkZWYJX19VU0VfWE9QRU4ySzgKKy8qIFJlYWQgdXAgdG8gKGFuZCBpbmNsdWRpbmcpIGEgREVMSU1JVEVSIGZyb20gU1RSRUFNIGludG8gKkxJTkVQVFIKKyAgIChhbmQgbnVsbC10ZXJtaW5hdGUgaXQpLiAqTElORVBUUiBpcyBhIHBvaW50ZXIgcmV0dXJuZWQgZnJvbSBtYWxsb2MgKG9yCisgICBOVUxMKSwgcG9pbnRpbmcgdG8gKk4gY2hhcmFjdGVycyBvZiBzcGFjZS4gIEl0IGlzIHJlYWxsb2MnZCBhcworICAgbmVjZXNzYXJ5LiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCAobm90IGluY2x1ZGluZyB0aGUKKyAgIG51bGwgdGVybWluYXRvciksIG9yIC0xIG9uIGVycm9yIG9yIEVPRi4KKworICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gdGhleSBhcmUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gX0lPX3NzaXplX3QgX19nZXRkZWxpbSAoY2hhciAqKl9fcmVzdHJpY3QgX19saW5lcHRyLAorCQkJICAgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX24sIGludCBfX2RlbGltaXRlciwKKwkJCSAgICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKK2V4dGVybiBfSU9fc3NpemVfdCBnZXRkZWxpbSAoY2hhciAqKl9fcmVzdHJpY3QgX19saW5lcHRyLAorCQkJICAgICBzaXplX3QgKl9fcmVzdHJpY3QgX19uLCBpbnQgX19kZWxpbWl0ZXIsCisJCQkgICAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworCisvKiBMaWtlIGBnZXRkZWxpbScsIGJ1dCByZWFkcyB1cCB0byBhIG5ld2xpbmUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBfSU9fc3NpemVfdCBnZXRsaW5lIChjaGFyICoqX19yZXN0cmljdCBfX2xpbmVwdHIsCisJCQkgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fbiwKKwkJCSAgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogV3JpdGUgYSBzdHJpbmcgdG8gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZnB1dHMgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pOworCisvKiBXcml0ZSBhIHN0cmluZywgZm9sbG93ZWQgYnkgYSBuZXdsaW5lLCB0byBzdGRvdXQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdXRzIChfX2NvbnN0IGNoYXIgKl9fcyk7CisKKworLyogUHVzaCBhIGNoYXJhY3RlciBiYWNrIG9udG8gdGhlIGlucHV0IGJ1ZmZlciBvZiBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCB1bmdldGMgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKTsKKworCisvKiBSZWFkIGNodW5rcyBvZiBnZW5lcmljIGRhdGEgZnJvbSBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHNpemVfdCBmcmVhZCAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKKwkJICAgICBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKKy8qIFdyaXRlIGNodW5rcyBvZiBnZW5lcmljIGRhdGEgdG8gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzaXplX3QgZndyaXRlIChfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUsCisJCSAgICAgIHNpemVfdCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zKTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzYW1lIGFzIGBmcHV0cycgYnV0IGRvZXMgbm90IGxvY2sgdGhlIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmcHV0c191bmxvY2tlZCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKKwkJCSAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBGYXN0ZXIgdmVyc2lvbnMgd2hlbiBsb2NraW5nIGlzIG5vdCBuZWNlc3NhcnkuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRoZXkgYXJlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHNpemVfdCBmcmVhZF91bmxvY2tlZCAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKKwkJCSAgICAgIHNpemVfdCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworZXh0ZXJuIHNpemVfdCBmd3JpdGVfdW5sb2NrZWQgKF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKKwkJCSAgICAgICBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKTsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogU2VlayB0byBhIGNlcnRhaW4gcG9zaXRpb24gb24gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZnNlZWsgKEZJTEUgKl9fc3RyZWFtLCBsb25nIGludCBfX29mZiwgaW50IF9fd2hlbmNlKTsKKy8qIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGxvbmcgaW50IGZ0ZWxsIChGSUxFICpfX3N0cmVhbSkgX193dXI7CisvKiBSZXdpbmQgdG8gdGhlIGJlZ2lubmluZyBvZiBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgcmV3aW5kIChGSUxFICpfX3N0cmVhbSk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKy8qIFRoZSBTaW5nbGUgVW5peCBTcGVjaWZpY2F0aW9uLCBWZXJzaW9uIDIsIHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSwKKyAgIG1vcmUgYWRlcXVhdGUgaW50ZXJmYWNlIGZvciB0aGUgdHdvIGZ1bmN0aW9ucyBhYm92ZSB3aGljaCBkZWFsIHdpdGgKKyAgIGZpbGUgb2Zmc2V0LiAgYGxvbmcgaW50JyBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuICBUaGVzZSBkZWZpbml0aW9ucworICAgYXJlIG9yaWdpbmFsbHkgZGVmaW5lZCBpbiB0aGUgTGFyZ2UgRmlsZSBTdXBwb3J0IEFQSS4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX0xBUkdFRklMRSB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKy8qIFNlZWsgdG8gYSBjZXJ0YWluIHBvc2l0aW9uIG9uIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZzZWVrbyAoRklMRSAqX19zdHJlYW0sIF9fb2ZmX3QgX19vZmYsIGludCBfX3doZW5jZSk7CisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBfX29mZl90IGZ0ZWxsbyAoRklMRSAqX19zdHJlYW0pIF9fd3VyOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKGZzZWVrbywKKwkJICAgICAgIChGSUxFICpfX3N0cmVhbSwgX19vZmY2NF90IF9fb2ZmLCBpbnQgX193aGVuY2UpLAorCQkgICAgICAgZnNlZWtvNjQpOworZXh0ZXJuIF9fb2ZmNjRfdCBfX1JFRElSRUNUIChmdGVsbG8sIChGSUxFICpfX3N0cmVhbSksIGZ0ZWxsbzY0KTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgZnNlZWtvIGZzZWVrbzY0CisjICAgZGVmaW5lIGZ0ZWxsbyBmdGVsbG82NAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorLyogR2V0IFNUUkVBTSdzIHBvc2l0aW9uLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmdldHBvcyAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgZnBvc190ICpfX3Jlc3RyaWN0IF9fcG9zKTsKKy8qIFNldCBTVFJFQU0ncyBwb3NpdGlvbi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZzZXRwb3MgKEZJTEUgKl9fc3RyZWFtLCBfX2NvbnN0IGZwb3NfdCAqX19wb3MpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChmZ2V0cG9zLCAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJCQkgZnBvc190ICpfX3Jlc3RyaWN0IF9fcG9zKSwgZmdldHBvczY0KTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoZnNldHBvcywKKwkJICAgICAgIChGSUxFICpfX3N0cmVhbSwgX19jb25zdCBmcG9zX3QgKl9fcG9zKSwgZnNldHBvczY0KTsKKyMgZWxzZQorIyAgZGVmaW5lIGZnZXRwb3MgZmdldHBvczY0CisjICBkZWZpbmUgZnNldHBvcyBmc2V0cG9zNjQKKyMgZW5kaWYKKyNlbmRpZgorX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZnNlZWtvNjQgKEZJTEUgKl9fc3RyZWFtLCBfX29mZjY0X3QgX19vZmYsIGludCBfX3doZW5jZSk7CitleHRlcm4gX19vZmY2NF90IGZ0ZWxsbzY0IChGSUxFICpfX3N0cmVhbSkgX193dXI7CitleHRlcm4gaW50IGZnZXRwb3M2NCAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgZnBvczY0X3QgKl9fcmVzdHJpY3QgX19wb3MpOworZXh0ZXJuIGludCBmc2V0cG9zNjQgKEZJTEUgKl9fc3RyZWFtLCBfX2NvbnN0IGZwb3M2NF90ICpfX3Bvcyk7CisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDbGVhciB0aGUgZXJyb3IgYW5kIEVPRiBpbmRpY2F0b3JzIGZvciBTVFJFQU0uICAqLworZXh0ZXJuIHZvaWQgY2xlYXJlcnIgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XOworLyogUmV0dXJuIHRoZSBFT0YgaW5kaWNhdG9yIGZvciBTVFJFQU0uICAqLworZXh0ZXJuIGludCBmZW9mIChGSUxFICpfX3N0cmVhbSkgX19USFJPVyBfX3d1cjsKKy8qIFJldHVybiB0aGUgZXJyb3IgaW5kaWNhdG9yIGZvciBTVFJFQU0uICAqLworZXh0ZXJuIGludCBmZXJyb3IgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XIF9fd3VyOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfTUlTQworLyogRmFzdGVyIHZlcnNpb25zIHdoZW4gbG9ja2luZyBpcyBub3QgcmVxdWlyZWQuICAqLworZXh0ZXJuIHZvaWQgY2xlYXJlcnJfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XOworZXh0ZXJuIGludCBmZW9mX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkgX19USFJPVyBfX3d1cjsKK2V4dGVybiBpbnQgZmVycm9yX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkgX19USFJPVyBfX3d1cjsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUHJpbnQgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhbHVlIG9mIGVycm5vLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHBlcnJvciAoX19jb25zdCBjaGFyICpfX3MpOworX19FTkRfTkFNRVNQQUNFX1NURAorCisvKiBQcm92aWRlIHRoZSBkZWNsYXJhdGlvbnMgZm9yIGBzeXNfZXJybGlzdCcgYW5kIGBzeXNfbmVycicgaWYgdGhleQorICAgYXJlIGF2YWlsYWJsZSBvbiB0aGlzIHN5c3RlbS4gIEV2ZW4gaWYgYXZhaWxhYmxlLCB0aGVzZSB2YXJpYWJsZXMKKyAgIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS4gIFRoZSBgc3RyZXJyb3InIGZ1bmN0aW9uIHByb3ZpZGVzCisgICBhbGwgdGhlIG5lY2Vzc2FyeSBmdW5jdGlvbmFsaXR5LiAgKi8KKyNpbmNsdWRlIDxiaXRzL3N5c19lcnJsaXN0Lmg+CisKKworI2lmZGVmCV9fVVNFX1BPU0lYCisvKiBSZXR1cm4gdGhlIHN5c3RlbSBmaWxlIGRlc2NyaXB0b3IgZm9yIFNUUkVBTS4gICovCitleHRlcm4gaW50IGZpbGVubyAoRklMRSAqX19zdHJlYW0pIF9fVEhST1cgX193dXI7CisjZW5kaWYgLyogVXNlIFBPU0lYLiAgKi8KKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIEZhc3RlciB2ZXJzaW9uIHdoZW4gbG9ja2luZyBpcyBub3QgcmVxdWlyZWQuICAqLworZXh0ZXJuIGludCBmaWxlbm9fdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XIF9fd3VyOworI2VuZGlmCisKKworI2lmIChkZWZpbmVkIF9fVVNFX1BPU0lYMiB8fCBkZWZpbmVkIF9fVVNFX1NWSUQgIHx8IGRlZmluZWQgX19VU0VfQlNEIHx8IFwKKyAgICAgZGVmaW5lZCBfX1VTRV9NSVNDKQorLyogQ3JlYXRlIGEgbmV3IHN0cmVhbSBjb25uZWN0ZWQgdG8gYSBwaXBlIHJ1bm5pbmcgdGhlIGdpdmVuIGNvbW1hbmQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIEZJTEUgKnBvcGVuIChfX2NvbnN0IGNoYXIgKl9fY29tbWFuZCwgX19jb25zdCBjaGFyICpfX21vZGVzKSBfX3d1cjsKKworLyogQ2xvc2UgYSBzdHJlYW0gb3BlbmVkIGJ5IHBvcGVuIGFuZCByZXR1cm4gdGhlIHN0YXR1cyBvZiBpdHMgY2hpbGQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwY2xvc2UgKEZJTEUgKl9fc3RyZWFtKTsKKyNlbmRpZgorCisKKyNpZmRlZglfX1VTRV9QT1NJWAorLyogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbC4gICovCitleHRlcm4gY2hhciAqY3Rlcm1pZCAoY2hhciAqX19zKSBfX1RIUk9XOworI2VuZGlmIC8qIFVzZSBQT1NJWC4gICovCisKKworI2lmZGVmIF9fVVNFX1hPUEVOCisvKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdXNlci4gICovCitleHRlcm4gY2hhciAqY3VzZXJpZCAoY2hhciAqX19zKTsKKyNlbmRpZiAvKiBVc2UgWC9PcGVuLCBidXQgbm90IGlzc3VlIDYuICAqLworCisKKyNpZmRlZglfX1VTRV9HTlUKK3N0cnVjdCBvYnN0YWNrOwkJCS8qIFNlZSA8b2JzdGFjay5oPi4gICovCisKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYW4gb2JzdGFjay4gICovCitleHRlcm4gaW50IG9ic3RhY2tfcHJpbnRmIChzdHJ1Y3Qgb2JzdGFjayAqX19yZXN0cmljdCBfX29ic3RhY2ssCisJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKKyAgICAgX19USFJPV05MIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAzKSkpOworZXh0ZXJuIGludCBvYnN0YWNrX3ZwcmludGYgKHN0cnVjdCBvYnN0YWNrICpfX3Jlc3RyaWN0IF9fb2JzdGFjaywKKwkJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICAgX0dfdmFfbGlzdCBfX2FyZ3MpCisgICAgIF9fVEhST1dOTCBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMCkpKTsKKyNlbmRpZiAvKiBVc2UgR05VLiAgKi8KKworCisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKy8qIFRoZXNlIGFyZSBkZWZpbmVkIGluIFBPU0lYLjE6MTk5Ni4gICovCisKKy8qIEFjcXVpcmUgb3duZXJzaGlwIG9mIFNUUkVBTS4gICovCitleHRlcm4gdm9pZCBmbG9ja2ZpbGUgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XOworCisvKiBUcnkgdG8gYWNxdWlyZSBvd25lcnNoaXAgb2YgU1RSRUFNIGJ1dCBkbyBub3QgYmxvY2sgaWYgaXQgaXMgbm90CisgICBwb3NzaWJsZS4gICovCitleHRlcm4gaW50IGZ0cnlsb2NrZmlsZSAoRklMRSAqX19zdHJlYW0pIF9fVEhST1cgX193dXI7CisKKy8qIFJlbGlucXVpc2ggdGhlIG93bmVyc2hpcCBncmFudGVkIGZvciBTVFJFQU0uICAqLworZXh0ZXJuIHZvaWQgZnVubG9ja2ZpbGUgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XOworI2VuZGlmIC8qIFBPU0lYIHx8IG1pc2MgKi8KKworI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySyAmJiAhZGVmaW5lZCBfX1VTRV9HTlUKKy8qIFRoZSBYL09wZW4gc3RhbmRhcmQgcmVxdWlyZXMgc29tZSBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyB0byBiZQorICAgZGVjbGFyZWQgaGVyZSB3aGljaCBkbyBub3QgYmVsb25nIGludG8gdGhpcyBoZWFkZXIuICBCdXQgd2UgaGF2ZSB0bworICAgZm9sbG93LiAgSW4gR05VIG1vZGUgd2UgZG9uJ3QgZG8gdGhpcyBub25zZW5zZS4gICovCisjIGRlZmluZSBfX25lZWRfZ2V0b3B0CisjIGluY2x1ZGUgPGdldG9wdC5oPgorI2VuZGlmCS8qIFgvT3BlbiwgYnV0IG5vdCBpc3N1ZSA2IGFuZCBub3QgZm9yIEdOVS4gICovCisKKy8qIElmIHdlIGFyZSBjb21waWxpbmcgd2l0aCBvcHRpbWl6aW5nIHJlYWQgdGhpcyBmaWxlLiAgSXQgY29udGFpbnMKKyAgIHNldmVyYWwgb3B0aW1pemluZyBpbmxpbmUgZnVuY3Rpb25zIGFuZCBtYWNyb3MuICAqLworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisjIGluY2x1ZGUgPGJpdHMvc3RkaW8uaD4KKyNlbmRpZgorI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZQorIyBpbmNsdWRlIDxiaXRzL3N0ZGlvMi5oPgorI2VuZGlmCisjaWZkZWYgX19MREJMX0NPTVBBVAorIyBpbmNsdWRlIDxiaXRzL3N0ZGlvLWxkYmwuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogPHN0ZGlvLmg+IGluY2x1ZGVkLiAgKi8KKworI2VuZGlmIC8qICFfU1RESU9fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRpb19leHQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RkaW9fZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkMTJlMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RkaW9fZXh0LmgKQEAgLTAsMCArMSw4NyBAQAorLyogRnVuY3Rpb25zIHRvIGFjY2VzcyBGSUxFIHN0cnVjdHVyZSBpbnRlcm5hbHMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFRoaXMgaGVhZGVyIGNvbnRhaW5zIHRoZSBzYW1lIGRlZmluaXRpb25zIGFzIHRoZSBoZWFkZXIgb2YgdGhlIHNhbWUgbmFtZQorICAgb24gU3VuJ3MgU29sYXJpcyBPUy4gICovCisKKyNpZm5kZWYgX1NURElPX0VYVF9ICisjZGVmaW5lIF9TVERJT19FWFRfSAkxCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitlbnVtCit7CisgIC8qIFF1ZXJ5IGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxvY2tpbmcgc3RhdHVzLiAgKi8KKyAgRlNFVExPQ0tJTkdfUVVFUlkgPSAwLAorI2RlZmluZSBGU0VUTE9DS0lOR19RVUVSWQlGU0VUTE9DS0lOR19RVUVSWQorICAvKiBUaGUgbGlicmFyeSBwcm90ZWN0cyBhbGwgdXNlcyBvZiB0aGUgc3RyZWFtIGZ1bmN0aW9ucywgZXhjZXB0IGZvcgorICAgICB1c2VzIG9mIHRoZSAqX3VubG9ja2VkIGZ1bmN0aW9ucywgYnkgY2FsbHMgZXF1aXZhbGVudCB0byBmbG9ja2ZpbGUoKS4gICovCisgIEZTRVRMT0NLSU5HX0lOVEVSTkFMLAorI2RlZmluZSBGU0VUTE9DS0lOR19JTlRFUk5BTAlGU0VUTE9DS0lOR19JTlRFUk5BTAorICAvKiBUaGUgdXNlciB3aWxsIHRha2UgY2FyZSBvZiBsb2NraW5nLiAgKi8KKyAgRlNFVExPQ0tJTkdfQllDQUxMRVIKKyNkZWZpbmUgRlNFVExPQ0tJTkdfQllDQUxMRVIJRlNFVExPQ0tJTkdfQllDQUxMRVIKK307CisKKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBvZiBGUCBpbiBieXRlcyBjdXJyZW50bHkgaW4gdXNlIGJ5CisgICB0aGUgZ2l2ZW4gc3RyZWFtLiAgKi8KK2V4dGVybiBzaXplX3QgX19mYnVmc2l6ZSAoRklMRSAqX19mcCkgX19USFJPVzsKKworCisvKiBSZXR1cm4gbm9uLXplcm8gdmFsdWUgaWZmIHRoZSBzdHJlYW0gRlAgaXMgb3BlbmVkIHJlYWRvbmx5LCBvciBpZiB0aGUKKyAgIGxhc3Qgb3BlcmF0aW9uIG9uIHRoZSBzdHJlYW0gd2FzIGEgcmVhZCBvcGVyYXRpb24uICAqLworZXh0ZXJuIGludCBfX2ZyZWFkaW5nIChGSUxFICpfX2ZwKSBfX1RIUk9XOworCisvKiBSZXR1cm4gbm9uLXplcm8gdmFsdWUgaWZmIHRoZSBzdHJlYW0gRlAgaXMgb3BlbmVkIHdyaXRlLW9ubHkgb3IKKyAgIGFwcGVuZC1vbmx5LCBvciBpZiB0aGUgbGFzdCBvcGVyYXRpb24gb24gdGhlIHN0cmVhbSB3YXMgYSB3cml0ZQorICAgb3BlcmF0aW9uLiAgKi8KK2V4dGVybiBpbnQgX19md3JpdGluZyAoRklMRSAqX19mcCkgX19USFJPVzsKKworCisvKiBSZXR1cm4gbm9uLXplcm8gdmFsdWUgaWZmIHN0cmVhbSBGUCBpcyBub3Qgb3BlbmVkIHdyaXRlLW9ubHkgb3IKKyAgIGFwcGVuZC1vbmx5LiAgKi8KK2V4dGVybiBpbnQgX19mcmVhZGFibGUgKEZJTEUgKl9fZnApIF9fVEhST1c7CisKKy8qIFJldHVybiBub24temVybyB2YWx1ZSBpZmYgc3RyZWFtIEZQIGlzIG5vdCBvcGVuZWQgcmVhZC1vbmx5LiAgKi8KK2V4dGVybiBpbnQgX19md3JpdGFibGUgKEZJTEUgKl9fZnApIF9fVEhST1c7CisKKworLyogUmV0dXJuIG5vbi16ZXJvIHZhbHVlIGlmZiB0aGUgc3RyZWFtIEZQIGlzIGxpbmUtYnVmZmVyZWQuICAqLworZXh0ZXJuIGludCBfX2ZsYmYgKEZJTEUgKl9fZnApIF9fVEhST1c7CisKKworLyogRGlzY2FyZCBhbGwgcGVuZGluZyBidWZmZXJlZCBJL08gb24gdGhlIHN0cmVhbSBGUC4gICovCitleHRlcm4gdm9pZCBfX2ZwdXJnZSAoRklMRSAqX19mcCkgX19USFJPVzsKKworLyogUmV0dXJuIGFtb3VudCBvZiBvdXRwdXQgaW4gYnl0ZXMgcGVuZGluZyBvbiBhIHN0cmVhbSBGUC4gICovCitleHRlcm4gc2l6ZV90IF9fZnBlbmRpbmcgKEZJTEUgKl9fZnApIF9fVEhST1c7CisKKy8qIEZsdXNoIGFsbCBsaW5lLWJ1ZmZlcmVkIGZpbGVzLiAgKi8KK2V4dGVybiB2b2lkIF9mbHVzaGxiZiAodm9pZCk7CisKKworLyogU2V0IGxvY2tpbmcgc3RhdHVzIG9mIHN0cmVhbSBGUCB0byBUWVBFLiAgKi8KK2V4dGVybiBpbnQgX19mc2V0bG9ja2luZyAoRklMRSAqX19mcCwgaW50IF9fdHlwZSkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN0ZGlvX2V4dC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGxpYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2QxMjhjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRsaWIuaApAQCAtMCwwICsxLDk2NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTIwMDcsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjIwIEdlbmVyYWwgdXRpbGl0aWVzCTxzdGRsaWIuaD4KKyAqLworCisjaWZuZGVmCV9TVERMSUJfSAorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IHNpemVfdCwgd2NoYXJfdCBhbmQgTlVMTCBmcm9tIDxzdGRkZWYuaD4uICAqLworI2RlZmluZQkJX19uZWVkX3NpemVfdAorI2lmbmRlZiBfX25lZWRfbWFsbG9jX2FuZF9jYWxsb2MKKyMgZGVmaW5lCV9fbmVlZF93Y2hhcl90CisjIGRlZmluZQlfX25lZWRfTlVMTAorI2VuZGlmCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK19fQkVHSU5fREVDTFMKKworI2lmbmRlZiBfX25lZWRfbWFsbG9jX2FuZF9jYWxsb2MKKyNkZWZpbmUJX1NURExJQl9ICTEKKworI2lmIChkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgpICYmICFkZWZpbmVkIF9TWVNfV0FJVF9ICisvKiBYUEcgcmVxdWlyZXMgYSBmZXcgc3ltYm9scyBmcm9tIDxzeXMvd2FpdC5oPiBiZWluZyBkZWZpbmVkLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy93YWl0ZmxhZ3MuaD4KKyMgaW5jbHVkZSA8Yml0cy93YWl0c3RhdHVzLmg+CisKKyMgaWZkZWYgX19VU0VfQlNECisKKy8qIExvdHMgb2YgaGFpciB0byBhbGxvdyB0cmFkaXRpb25hbCBCU0QgdXNlIG9mIGB1bmlvbiB3YWl0JworICAgYXMgd2VsbCBhcyBQT1NJWC4xIHVzZSBvZiBgaW50JyBmb3IgdGhlIHN0YXR1cyB3b3JkLiAgKi8KKworIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBfX1dBSVRfSU5UKHN0YXR1cykgXAorICAoX19leHRlbnNpb25fXyAoKCh1bmlvbiB7IF9fdHlwZW9mKHN0YXR1cykgX19pbjsgaW50IF9faTsgfSkgXAorCQkgICB7IC5fX2luID0gKHN0YXR1cykgfSkuX19pKSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19XQUlUX0lOVChzdGF0dXMpCSgqKGludCAqKSAmKHN0YXR1cykpCisjICBlbmRpZgorCisvKiBUaGlzIGlzIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudCB0byBgd2FpdCcuICBUaGUgZnVua3kgdW5pb24KKyAgIGNhdXNlcyByZWRlY2xhcmF0aW9ucyB3aXRoIGVpdGhlciBgaW50IConIG9yIGB1bmlvbiB3YWl0IConIHRvIGJlCisgICBhbGxvd2VkIHdpdGhvdXQgY29tcGxhaW50LiAgX19XQUlUX1NUQVRVU19ERUZOIGlzIHRoZSB0eXBlIHVzZWQgaW4KKyAgIHRoZSBhY3R1YWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICAqLworCisjICBpZiAhZGVmaW5lZCBfX0dOVUNfXyB8fCBfX0dOVUNfXyA8IDIgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBfX1dBSVRfU1RBVFVTCXZvaWQgKgorIyAgIGRlZmluZSBfX1dBSVRfU1RBVFVTX0RFRk4Jdm9pZCAqCisjICBlbHNlCisvKiBUaGlzIHdvcmtzIGluIEdDQyAyLjYuMSBhbmQgbGF0ZXIuICAqLwordHlwZWRlZiB1bmlvbgorICB7CisgICAgdW5pb24gd2FpdCAqX191cHRyOworICAgIGludCAqX19pcHRyOworICB9IF9fV0FJVF9TVEFUVVMgX19hdHRyaWJ1dGVfXyAoKF9fdHJhbnNwYXJlbnRfdW5pb25fXykpOworIyAgIGRlZmluZSBfX1dBSVRfU1RBVFVTX0RFRk4JaW50ICoKKyMgIGVuZGlmCisKKyMgZWxzZSAvKiBEb24ndCB1c2UgQlNELiAgKi8KKworIyAgZGVmaW5lIF9fV0FJVF9JTlQoc3RhdHVzKQkoc3RhdHVzKQorIyAgZGVmaW5lIF9fV0FJVF9TVEFUVVMJCWludCAqCisjICBkZWZpbmUgX19XQUlUX1NUQVRVU19ERUZOCWludCAqCisKKyMgZW5kaWYgLyogVXNlIEJTRC4gICovCisKKy8qIERlZmluZSB0aGUgbWFjcm9zIDxzeXMvd2FpdC5oPiBhbHNvIHdvdWxkIGRlZmluZSB0aGlzIHdheS4gICovCisjIGRlZmluZSBXRVhJVFNUQVRVUyhzdGF0dXMpCV9fV0VYSVRTVEFUVVMgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXVEVSTVNJRyhzdGF0dXMpCV9fV1RFUk1TSUcgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXU1RPUFNJRyhzdGF0dXMpCV9fV1NUT1BTSUcgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXSUZFWElURUQoc3RhdHVzKQlfX1dJRkVYSVRFRCAoX19XQUlUX0lOVCAoc3RhdHVzKSkKKyMgZGVmaW5lIFdJRlNJR05BTEVEKHN0YXR1cykJX19XSUZTSUdOQUxFRCAoX19XQUlUX0lOVCAoc3RhdHVzKSkKKyMgZGVmaW5lIFdJRlNUT1BQRUQoc3RhdHVzKQlfX1dJRlNUT1BQRUQgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGlmZGVmIF9fV0lGQ09OVElOVUVECisjICBkZWZpbmUgV0lGQ09OVElOVUVEKHN0YXR1cykJX19XSUZDT05USU5VRUQgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGVuZGlmCisjZW5kaWYJLyogWC9PcGVuIG9yIFhQRzcgYW5kIDxzeXMvd2FpdC5oPiBub3QgaW5jbHVkZWQuICAqLworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJldHVybmVkIGJ5IGBkaXYnLiAgKi8KK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBpbnQgcXVvdDsJCQkvKiBRdW90aWVudC4gICovCisgICAgaW50IHJlbTsJCQkvKiBSZW1haW5kZXIuICAqLworICB9IGRpdl90OworCisvKiBSZXR1cm5lZCBieSBgbGRpdicuICAqLworI2lmbmRlZiBfX2xkaXZfdF9kZWZpbmVkCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgbG9uZyBpbnQgcXVvdDsJCS8qIFF1b3RpZW50LiAgKi8KKyAgICBsb25nIGludCByZW07CQkvKiBSZW1haW5kZXIuICAqLworICB9IGxkaXZfdDsKKyMgZGVmaW5lIF9fbGRpdl90X2RlZmluZWQJMQorI2VuZGlmCitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSAmJiAhZGVmaW5lZCBfX2xsZGl2X3RfZGVmaW5lZAorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZXR1cm5lZCBieSBgbGxkaXYnLiAgKi8KK19fZXh0ZW5zaW9uX18gdHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIGxvbmcgbG9uZyBpbnQgcXVvdDsJCS8qIFF1b3RpZW50LiAgKi8KKyAgICBsb25nIGxvbmcgaW50IHJlbTsJCS8qIFJlbWFpbmRlci4gICovCisgIH0gbGxkaXZfdDsKKyMgZGVmaW5lIF9fbGxkaXZfdF9kZWZpbmVkCTEKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisKKy8qIFRoZSBsYXJnZXN0IG51bWJlciByYW5kIHdpbGwgcmV0dXJuIChzYW1lIGFzIElOVF9NQVgpLiAgKi8KKyNkZWZpbmUJUkFORF9NQVgJMjE0NzQ4MzY0NworCisKKy8qIFdlIGRlZmluZSB0aGVzZSB0aGUgc2FtZSBmb3IgYWxsIG1hY2hpbmVzLgorICAgQ2hhbmdlcyBmcm9tIHRoaXMgdG8gdGhlIG91dHNpZGUgd29ybGQgc2hvdWxkIGJlIGRvbmUgaW4gYF9leGl0Jy4gICovCisjZGVmaW5lCUVYSVRfRkFJTFVSRQkxCS8qIEZhaWxpbmcgZXhpdCBzdGF0dXMuICAqLworI2RlZmluZQlFWElUX1NVQ0NFU1MJMAkvKiBTdWNjZXNzZnVsIGV4aXQgc3RhdHVzLiAgKi8KKworCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBhIG11bHRpYnl0ZSBjaGFyYWN0ZXIgaW4gdGhlIGN1cnJlbnQgbG9jYWxlLiAgKi8KKyNkZWZpbmUJTUJfQ1VSX01BWAkoX19jdHlwZV9nZXRfbWJfY3VyX21heCAoKSkKK2V4dGVybiBzaXplX3QgX19jdHlwZV9nZXRfbWJfY3VyX21heCAodm9pZCkgX19USFJPVyBfX3d1cjsKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBmbG9hdGluZy1wb2ludCBudW1iZXIuICAqLworZXh0ZXJuIGRvdWJsZSBhdG9mIChfX2NvbnN0IGNoYXIgKl9fbnB0cikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpIF9fd3VyOworLyogQ29udmVydCBhIHN0cmluZyB0byBhbiBpbnRlZ2VyLiAgKi8KK2V4dGVybiBpbnQgYXRvaSAoX19jb25zdCBjaGFyICpfX25wdHIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKy8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBsb25nIGludGVnZXIuICAqLworZXh0ZXJuIGxvbmcgaW50IGF0b2wgKF9fY29uc3QgY2hhciAqX19ucHRyKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSkgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSB8fCAoZGVmaW5lZCBfX0dMSUJDX0hBVkVfTE9OR19MT05HICYmIGRlZmluZWQgX19VU0VfTUlTQykKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogQ29udmVydCBhIHN0cmluZyB0byBhIGxvbmcgbG9uZyBpbnRlZ2VyLiAgKi8KK19fZXh0ZW5zaW9uX18gZXh0ZXJuIGxvbmcgbG9uZyBpbnQgYXRvbGwgKF9fY29uc3QgY2hhciAqX19ucHRyKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSkgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLiAgKi8KK2V4dGVybiBkb3VibGUgc3RydG9kIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkgICAgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZglfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogTGlrZXdpc2UgZm9yIGBmbG9hdCcgYW5kIGBsb25nIGRvdWJsZScgc2l6ZXMgb2YgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4gICovCitleHRlcm4gZmxvYXQgc3RydG9mIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKworZXh0ZXJuIGxvbmcgZG91YmxlIHN0cnRvbGQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQ29udmVydCBhIHN0cmluZyB0byBhIGxvbmcgaW50ZWdlci4gICovCitleHRlcm4gbG9uZyBpbnQgc3RydG9sIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworLyogQ29udmVydCBhIHN0cmluZyB0byBhbiB1bnNpZ25lZCBsb25nIGludGVnZXIuICAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IHN0cnRvdWwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZiBkZWZpbmVkIF9fR0xJQkNfSEFWRV9MT05HX0xPTkcgJiYgZGVmaW5lZCBfX1VTRV9CU0QKKy8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBxdWFkd29yZCBpbnRlZ2VyLiAgKi8KK19fZXh0ZW5zaW9uX18KK2V4dGVybiBsb25nIGxvbmcgaW50IHN0cnRvcSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworLyogQ29udmVydCBhIHN0cmluZyB0byBhbiB1bnNpZ25lZCBxdWFkd29yZCBpbnRlZ2VyLiAgKi8KK19fZXh0ZW5zaW9uX18KK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHN0cnRvdXEgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJICAgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyNlbmRpZiAvKiBHQ0MgYW5kIHVzZSBCU0QuICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgfHwgKGRlZmluZWQgX19HTElCQ19IQVZFX0xPTkdfTE9ORyAmJiBkZWZpbmVkIF9fVVNFX01JU0MpCitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBxdWFkd29yZCBpbnRlZ2VyLiAgKi8KK19fZXh0ZW5zaW9uX18KK2V4dGVybiBsb25nIGxvbmcgaW50IHN0cnRvbGwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgICAgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisvKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIHF1YWR3b3JkIGludGVnZXIuICAqLworX19leHRlbnNpb25fXworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgc3RydG91bGwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJCWNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZiAvKiBJU08gQzk5IG9yIEdDQyBhbmQgdXNlIE1JU0MuICAqLworCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoZSBjb25jZXB0IG9mIG9uZSBzdGF0aWMgbG9jYWxlIHBlciBjYXRlZ29yeSBpcyBub3QgdmVyeSB3ZWxsCisgICB0aG91Z2h0IG91dC4gIE1hbnkgYXBwbGljYXRpb25zIHdpbGwgbmVlZCB0byBwcm9jZXNzIGl0cyBkYXRhIHVzaW5nCisgICBpbmZvcm1hdGlvbiBmcm9tIHNldmVyYWwgZGlmZmVyZW50IGxvY2FsZXMuICBBbm90aGVyIHByb2JsZW0gaXMKKyAgIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYXRpb25hbGl6YXRpb24gaGFuZGxpbmcgaW4gdGhlCisgICBJU08gQysrIHN0YW5kYXJkIGxpYnJhcnkuICBUbyBzdXBwb3J0IHRoaXMgYW5vdGhlciBzZXQgb2YKKyAgIHRoZSBmdW5jdGlvbnMgdXNpbmcgbG9jYWxlIGRhdGEgZXhpc3Qgd2hpY2ggdGFrZSBhbiBhZGRpdGlvbmFsCisgICBhcmd1bWVudC4KKworICAgQXR0ZW50aW9uOiBldmVuIHRob3VnaCBzZXZlcmFsICpfbCBpbnRlcmZhY2VzIGFyZSBwYXJ0IG9mIFBPU0lYOjIwMDgsCisgICB0aGVzZSBhcmUgbm90LiAgKi8KKworLyogU3RydWN0dXJlIGZvciByZWVudHJhbnQgbG9jYWxlIHVzaW5nIGZ1bmN0aW9ucy4gIFRoaXMgaXMgYW4KKyAgIChhbG1vc3QpIG9wYXF1ZSB0eXBlIGZvciB0aGUgdXNlciBsZXZlbCBwcm9ncmFtcy4gICovCisjIGluY2x1ZGUgPHhsb2NhbGUuaD4KKworLyogU3BlY2lhbCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoaWNoIHRha2UgdGhlIGxvY2FsZSB0bworICAgdXNlIGFzIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyLiAgKi8KK2V4dGVybiBsb25nIGludCBzdHJ0b2xfbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UsCisJCQkgIF9fbG9jYWxlX3QgX19sb2MpIF9fVEhST1cgX19ub25udWxsICgoMSwgNCkpIF9fd3VyOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgc3RydG91bF9sIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJCSAgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkgICAgaW50IF9fYmFzZSwgX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCA0KSkgX193dXI7CisKK19fZXh0ZW5zaW9uX18KK2V4dGVybiBsb25nIGxvbmcgaW50IHN0cnRvbGxfbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQljaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSwKKwkJCQlfX2xvY2FsZV90IF9fbG9jKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDQpKSBfX3d1cjsKKworX19leHRlbnNpb25fXworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgc3RydG91bGxfbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkJICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkJICBpbnQgX19iYXNlLCBfX2xvY2FsZV90IF9fbG9jKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDQpKSBfX3d1cjsKKworZXh0ZXJuIGRvdWJsZSBzdHJ0b2RfbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCWNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBfX2xvY2FsZV90IF9fbG9jKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDMpKSBfX3d1cjsKKworZXh0ZXJuIGZsb2F0IHN0cnRvZl9sIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkgICAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIF9fbG9jYWxlX3QgX19sb2MpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMykpIF9fd3VyOworCitleHRlcm4gbG9uZyBkb3VibGUgc3RydG9sZF9sIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJICAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkgICAgICBfX2xvY2FsZV90IF9fbG9jKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDMpKSBfX3d1cjsKKyNlbmRpZiAvKiBHTlUgKi8KKworCisjaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorX19leHRlcm5faW5saW5lIGRvdWJsZQorX19OVEggKGF0b2YgKF9fY29uc3QgY2hhciAqX19ucHRyKSkKK3sKKyAgcmV0dXJuIHN0cnRvZCAoX19ucHRyLCAoY2hhciAqKikgTlVMTCk7Cit9CitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAoYXRvaSAoX19jb25zdCBjaGFyICpfX25wdHIpKQoreworICByZXR1cm4gKGludCkgc3RydG9sIChfX25wdHIsIChjaGFyICoqKSBOVUxMLCAxMCk7Cit9CitfX2V4dGVybl9pbmxpbmUgbG9uZyBpbnQKK19fTlRIIChhdG9sIChfX2NvbnN0IGNoYXIgKl9fbnB0cikpCit7CisgIHJldHVybiBzdHJ0b2wgKF9fbnB0ciwgKGNoYXIgKiopIE5VTEwsIDEwKTsKK30KK19fRU5EX05BTUVTUEFDRV9TVEQKKworIyBpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorX19leHRlbnNpb25fXyBfX2V4dGVybl9pbmxpbmUgbG9uZyBsb25nIGludAorX19OVEggKGF0b2xsIChfX2NvbnN0IGNoYXIgKl9fbnB0cikpCit7CisgIHJldHVybiBzdHJ0b2xsIChfX25wdHIsIChjaGFyICoqKSBOVUxMLCAxMCk7Cit9CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjIGVuZGlmCisjZW5kaWYgLyogT3B0aW1pemluZyBhbmQgSW5saW5pbmcuICAqLworCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogQ29udmVydCBOIHRvIGJhc2UgNjQgdXNpbmcgdGhlIGRpZ2l0cyAiLi8wLTlBLVphLXoiLCBsZWFzdC1zaWduaWZpY2FudAorICAgZGlnaXQgZmlyc3QuICBSZXR1cm5zIGEgcG9pbnRlciB0byBzdGF0aWMgc3RvcmFnZSBvdmVyd3JpdHRlbiBieSB0aGUKKyAgIG5leHQgY2FsbC4gICovCitleHRlcm4gY2hhciAqbDY0YSAobG9uZyBpbnQgX19uKSBfX1RIUk9XIF9fd3VyOworCisvKiBSZWFkIGEgbnVtYmVyIGZyb20gYSBzdHJpbmcgUyBpbiBiYXNlIDY0IGFzIGFib3ZlLiAgKi8KK2V4dGVybiBsb25nIGludCBhNjRsIChfX2NvbnN0IGNoYXIgKl9fcykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpIF9fd3VyOworCisjZW5kaWYJLyogVXNlIFNWSUQgfHwgZXh0ZW5kZWQgWC9PcGVuLiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfQlNECisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgkvKiB3ZSBuZWVkIGludDMyX3QuLi4gKi8KKworLyogVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCBhY3R1YWxseSBkbyB0aGluZ3MuICBUaGUgYHJhbmRvbScsIGBzcmFuZG9tJywKKyAgIGBpbml0c3RhdGUnIGFuZCBgc2V0c3RhdGUnIGZ1bmN0aW9ucyBhcmUgdGhvc2UgZnJvbSBCU0QgVW5pY2VzLgorICAgVGhlIGByYW5kJyBhbmQgYHNyYW5kJyBmdW5jdGlvbnMgYXJlIHJlcXVpcmVkIGJ5IHRoZSBBTlNJIHN0YW5kYXJkLgorICAgV2UgcHJvdmlkZSBib3RoIGludGVyZmFjZXMgdG8gdGhlIHNhbWUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICAqLworLyogUmV0dXJuIGEgcmFuZG9tIGxvbmcgaW50ZWdlciBiZXR3ZWVuIDAgYW5kIFJBTkRfTUFYIGluY2x1c2l2ZS4gICovCitleHRlcm4gbG9uZyBpbnQgcmFuZG9tICh2b2lkKSBfX1RIUk9XOworCisvKiBTZWVkIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB3aXRoIHRoZSBnaXZlbiBudW1iZXIuICAqLworZXh0ZXJuIHZvaWQgc3JhbmRvbSAodW5zaWduZWQgaW50IF9fc2VlZCkgX19USFJPVzsKKworLyogSW5pdGlhbGl6ZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdG8gdXNlIHN0YXRlIGJ1ZmZlciBTVEFURUJVRiwKKyAgIG9mIGxlbmd0aCBTVEFURUxFTiwgYW5kIHNlZWQgaXQgd2l0aCBTRUVELiAgT3B0aW1hbCBsZW5ndGhzIGFyZSA4LCAxNiwKKyAgIDMyLCA2NCwgMTI4IGFuZCAyNTYsIHRoZSBiaWdnZXIgdGhlIGJldHRlcjsgdmFsdWVzIGxlc3MgdGhhbiA4IHdpbGwKKyAgIGNhdXNlIGFuIGVycm9yIGFuZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDI1NiB3aWxsIGJlIHJvdW5kZWQgZG93bi4gICovCitleHRlcm4gY2hhciAqaW5pdHN0YXRlICh1bnNpZ25lZCBpbnQgX19zZWVkLCBjaGFyICpfX3N0YXRlYnVmLAorCQkJc2l6ZV90IF9fc3RhdGVsZW4pIF9fVEhST1cgX19ub25udWxsICgoMikpOworCisvKiBTd2l0Y2ggdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIHN0YXRlIGJ1ZmZlciBTVEFURUJVRiwKKyAgIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gcHJldmlvdXNseSBpbml0aWFsaXplZCBieSBgaW5pdHN0YXRlJy4gICovCitleHRlcm4gY2hhciAqc2V0c3RhdGUgKGNoYXIgKl9fc3RhdGVidWYpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisKKyMgaWZkZWYgX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb25zIG9mIHRoZSBgcmFuZG9tJyBmYW1pbHkgb2YgZnVuY3Rpb25zLgorICAgVGhlc2UgZnVuY3Rpb25zIGFsbCB1c2UgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZSB0byBjb250YWluCisgICBzdGF0ZSwgcmF0aGVyIHRoYW4gZ2xvYmFsIHN0YXRlIHZhcmlhYmxlcy4gICovCisKK3N0cnVjdCByYW5kb21fZGF0YQorICB7CisgICAgaW50MzJfdCAqZnB0cjsJCS8qIEZyb250IHBvaW50ZXIuICAqLworICAgIGludDMyX3QgKnJwdHI7CQkvKiBSZWFyIHBvaW50ZXIuICAqLworICAgIGludDMyX3QgKnN0YXRlOwkJLyogQXJyYXkgb2Ygc3RhdGUgdmFsdWVzLiAgKi8KKyAgICBpbnQgcmFuZF90eXBlOwkJLyogVHlwZSBvZiByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gICovCisgICAgaW50IHJhbmRfZGVnOwkJLyogRGVncmVlIG9mIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiAgKi8KKyAgICBpbnQgcmFuZF9zZXA7CQkvKiBEaXN0YW5jZSBiZXR3ZWVuIGZyb250IGFuZCByZWFyLiAgKi8KKyAgICBpbnQzMl90ICplbmRfcHRyOwkJLyogUG9pbnRlciBiZWhpbmQgc3RhdGUgdGFibGUuICAqLworICB9OworCitleHRlcm4gaW50IHJhbmRvbV9yIChzdHJ1Y3QgcmFuZG9tX2RhdGEgKl9fcmVzdHJpY3QgX19idWYsCisJCSAgICAgaW50MzJfdCAqX19yZXN0cmljdCBfX3Jlc3VsdCkgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKK2V4dGVybiBpbnQgc3JhbmRvbV9yICh1bnNpZ25lZCBpbnQgX19zZWVkLCBzdHJ1Y3QgcmFuZG9tX2RhdGEgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworZXh0ZXJuIGludCBpbml0c3RhdGVfciAodW5zaWduZWQgaW50IF9fc2VlZCwgY2hhciAqX19yZXN0cmljdCBfX3N0YXRlYnVmLAorCQkJc2l6ZV90IF9fc3RhdGVsZW4sCisJCQlzdHJ1Y3QgcmFuZG9tX2RhdGEgKl9fcmVzdHJpY3QgX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMiwgNCkpOworCitleHRlcm4gaW50IHNldHN0YXRlX3IgKGNoYXIgKl9fcmVzdHJpY3QgX19zdGF0ZWJ1ZiwKKwkJICAgICAgIHN0cnVjdCByYW5kb21fZGF0YSAqX19yZXN0cmljdCBfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVuZGlmCS8qIFVzZSBtaXNjLiAgKi8KKyNlbmRpZgkvKiBVc2UgU1ZJRCB8fCBleHRlbmRlZCBYL09wZW4gfHwgQlNELiAqLworCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiAwIGFuZCBSQU5EX01BWCBpbmNsdXNpdmUuICAqLworZXh0ZXJuIGludCByYW5kICh2b2lkKSBfX1RIUk9XOworLyogU2VlZCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLiAgKi8KK2V4dGVybiB2b2lkIHNyYW5kICh1bnNpZ25lZCBpbnQgX19zZWVkKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfUE9TSVgKKy8qIFJlZW50cmFudCBpbnRlcmZhY2UgYWNjb3JkaW5nIHRvIFBPU0lYLjEuICAqLworZXh0ZXJuIGludCByYW5kX3IgKHVuc2lnbmVkIGludCAqX19zZWVkKSBfX1RIUk9XOworI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBTeXN0ZW0gViBzdHlsZSA0OC1iaXQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZnVuY3Rpb25zLiAgKi8KKworLyogUmV0dXJuIG5vbi1uZWdhdGl2ZSwgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBpbiBbMC4wLDEuMCkuICAqLworZXh0ZXJuIGRvdWJsZSBkcmFuZDQ4ICh2b2lkKSBfX1RIUk9XOworZXh0ZXJuIGRvdWJsZSBlcmFuZDQ4ICh1bnNpZ25lZCBzaG9ydCBpbnQgX194c3ViaVszXSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJldHVybiBub24tbmVnYXRpdmUsIGxvbmcgaW50ZWdlciBpbiBbMCwyXjMxKS4gICovCitleHRlcm4gbG9uZyBpbnQgbHJhbmQ0OCAodm9pZCkgX19USFJPVzsKK2V4dGVybiBsb25nIGludCBucmFuZDQ4ICh1bnNpZ25lZCBzaG9ydCBpbnQgX194c3ViaVszXSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJldHVybiBzaWduZWQsIGxvbmcgaW50ZWdlcnMgaW4gWy0yXjMxLDJeMzEpLiAgKi8KK2V4dGVybiBsb25nIGludCBtcmFuZDQ4ICh2b2lkKSBfX1RIUk9XOworZXh0ZXJuIGxvbmcgaW50IGpyYW5kNDggKHVuc2lnbmVkIHNob3J0IGludCBfX3hzdWJpWzNdKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogU2VlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gICovCitleHRlcm4gdm9pZCBzcmFuZDQ4IChsb25nIGludCBfX3NlZWR2YWwpIF9fVEhST1c7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgaW50ICpzZWVkNDggKHVuc2lnbmVkIHNob3J0IGludCBfX3NlZWQxNnZbM10pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworZXh0ZXJuIHZvaWQgbGNvbmc0OCAodW5zaWduZWQgc2hvcnQgaW50IF9fcGFyYW1bN10pIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjIGlmZGVmIF9fVVNFX01JU0MKKy8qIERhdGEgc3RydWN0dXJlIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhyZWFkIHNhZmUgdmVyc2lvbnMuICBUaGlzCisgICB0eXBlIGlzIHRvIGJlIHJlZ2FyZGVkIGFzIG9wYXF1ZS4gIEl0J3Mgb25seSBleHBvcnRlZCBiZWNhdXNlIHVzZXJzCisgICBoYXZlIHRvIGFsbG9jYXRlIG9iamVjdHMgb2YgdGhpcyB0eXBlLiAgKi8KK3N0cnVjdCBkcmFuZDQ4X2RhdGEKKyAgeworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3hbM107CS8qIEN1cnJlbnQgc3RhdGUuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX29sZF94WzNdOyAvKiBPbGQgc3RhdGUuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX2M7CS8qIEFkZGl0aXZlIGNvbnN0LiBpbiBjb25ncnVlbnRpYWwgZm9ybXVsYS4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9faW5pdDsJLyogRmxhZyBmb3IgaW5pdGlhbGl6aW5nLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fYTsJLyogRmFjdG9yIGluIGNvbmdydWVudGlhbCBmb3JtdWxhLiAgKi8KKyAgfTsKKworLyogUmV0dXJuIG5vbi1uZWdhdGl2ZSwgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBpbiBbMC4wLDEuMCkuICAqLworZXh0ZXJuIGludCBkcmFuZDQ4X3IgKHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fcmVzdHJpY3QgX19idWZmZXIsCisJCSAgICAgIGRvdWJsZSAqX19yZXN0cmljdCBfX3Jlc3VsdCkgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gaW50IGVyYW5kNDhfciAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10sCisJCSAgICAgIHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fcmVzdHJpY3QgX19idWZmZXIsCisJCSAgICAgIGRvdWJsZSAqX19yZXN0cmljdCBfX3Jlc3VsdCkgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFJldHVybiBub24tbmVnYXRpdmUsIGxvbmcgaW50ZWdlciBpbiBbMCwyXjMxKS4gICovCitleHRlcm4gaW50IGxyYW5kNDhfciAoc3RydWN0IGRyYW5kNDhfZGF0YSAqX19yZXN0cmljdCBfX2J1ZmZlciwKKwkJICAgICAgbG9uZyBpbnQgKl9fcmVzdHJpY3QgX19yZXN1bHQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworZXh0ZXJuIGludCBucmFuZDQ4X3IgKHVuc2lnbmVkIHNob3J0IGludCBfX3hzdWJpWzNdLAorCQkgICAgICBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAorCQkgICAgICBsb25nIGludCAqX19yZXN0cmljdCBfX3Jlc3VsdCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFJldHVybiBzaWduZWQsIGxvbmcgaW50ZWdlcnMgaW4gWy0yXjMxLDJeMzEpLiAgKi8KK2V4dGVybiBpbnQgbXJhbmQ0OF9yIChzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAorCQkgICAgICBsb25nIGludCAqX19yZXN0cmljdCBfX3Jlc3VsdCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gaW50IGpyYW5kNDhfciAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10sCisJCSAgICAgIHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fcmVzdHJpY3QgX19idWZmZXIsCisJCSAgICAgIGxvbmcgaW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2VlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gICovCitleHRlcm4gaW50IHNyYW5kNDhfciAobG9uZyBpbnQgX19zZWVkdmFsLCBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX2J1ZmZlcikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKK2V4dGVybiBpbnQgc2VlZDQ4X3IgKHVuc2lnbmVkIHNob3J0IGludCBfX3NlZWQxNnZbM10sCisJCSAgICAgc3RydWN0IGRyYW5kNDhfZGF0YSAqX19idWZmZXIpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCitleHRlcm4gaW50IGxjb25nNDhfciAodW5zaWduZWQgc2hvcnQgaW50IF9fcGFyYW1bN10sCisJCSAgICAgIHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fYnVmZmVyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZW5kaWYJLyogVXNlIG1pc2MuICAqLworI2VuZGlmCS8qIFVzZSBTVklEIG9yIFgvT3Blbi4gICovCisKKyNlbmRpZiAvKiBkb24ndCBqdXN0IG5lZWQgbWFsbG9jIGFuZCBjYWxsb2MgKi8KKworI2lmbmRlZiBfX21hbGxvY19hbmRfY2FsbG9jX2RlZmluZWQKKyMgZGVmaW5lIF9fbWFsbG9jX2FuZF9jYWxsb2NfZGVmaW5lZAorX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBBbGxvY2F0ZSBTSVpFIGJ5dGVzIG9mIG1lbW9yeS4gICovCitleHRlcm4gdm9pZCAqbWFsbG9jIChzaXplX3QgX19zaXplKSBfX1RIUk9XIF9fYXR0cmlidXRlX21hbGxvY19fIF9fd3VyOworLyogQWxsb2NhdGUgTk1FTUIgZWxlbWVudHMgb2YgU0laRSBieXRlcyBlYWNoLCBhbGwgaW5pdGlhbGl6ZWQgdG8gMC4gICovCitleHRlcm4gdm9pZCAqY2FsbG9jIChzaXplX3QgX19ubWVtYiwgc2l6ZV90IF9fc2l6ZSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKyNlbmRpZgorCisjaWZuZGVmIF9fbmVlZF9tYWxsb2NfYW5kX2NhbGxvYworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZS1hbGxvY2F0ZSB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgYmxvY2sKKyAgIGluIFBUUiwgbWFraW5nIHRoZSBuZXcgYmxvY2sgU0laRSBieXRlcyBsb25nLiAgKi8KKy8qIF9fYXR0cmlidXRlX21hbGxvY19fIGlzIG5vdCB1c2VkLCBiZWNhdXNlIGlmIHJlYWxsb2MgcmV0dXJucworICAgdGhlIHNhbWUgcG9pbnRlciB0aGF0IHdhcyBwYXNzZWQgdG8gaXQsIGFsaWFzaW5nIG5lZWRzIHRvIGJlIGFsbG93ZWQKKyAgIGJldHdlZW4gb2JqZWN0cyBwb2ludGVkIGJ5IHRoZSBvbGQgYW5kIG5ldyBwb2ludGVycy4gICovCitleHRlcm4gdm9pZCAqcmVhbGxvYyAodm9pZCAqX19wdHIsIHNpemVfdCBfX3NpemUpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfd2Fybl91bnVzZWRfcmVzdWx0X187CisvKiBGcmVlIGEgYmxvY2sgYWxsb2NhdGVkIGJ5IGBtYWxsb2MnLCBgcmVhbGxvYycgb3IgYGNhbGxvYycuICAqLworZXh0ZXJuIHZvaWQgZnJlZSAodm9pZCAqX19wdHIpIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZglfX1VTRV9NSVNDCisvKiBGcmVlIGEgYmxvY2suICBBbiBhbGlhcyBmb3IgYGZyZWUnLgkoU3VuIFVuaWNlcykuICAqLworZXh0ZXJuIHZvaWQgY2ZyZWUgKHZvaWQgKl9fcHRyKSBfX1RIUk9XOworI2VuZGlmIC8qIFVzZSBtaXNjLiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfR05VIHx8IGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfTUlTQworIyBpbmNsdWRlIDxhbGxvY2EuaD4KKyNlbmRpZiAvKiBVc2UgR05VLCBCU0QsIG9yIG1pc2MuICAqLworCisjaWYgKGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySykgXAorICAgIHx8IGRlZmluZWQgX19VU0VfQlNECisvKiBBbGxvY2F0ZSBTSVpFIGJ5dGVzIG9uIGEgcGFnZSBib3VuZGFyeS4gIFRoZSBzdG9yYWdlIGNhbm5vdCBiZSBmcmVlZC4gICovCitleHRlcm4gdm9pZCAqdmFsbG9jIChzaXplX3QgX19zaXplKSBfX1RIUk9XIF9fYXR0cmlidXRlX21hbGxvY19fIF9fd3VyOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBBbGxvY2F0ZSBtZW1vcnkgb2YgU0laRSBieXRlcyB3aXRoIGFuIGFsaWdubWVudCBvZiBBTElHTk1FTlQuICAqLworZXh0ZXJuIGludCBwb3NpeF9tZW1hbGlnbiAodm9pZCAqKl9fbWVtcHRyLCBzaXplX3QgX19hbGlnbm1lbnQsIHNpemVfdCBfX3NpemUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworI2VuZGlmCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQWJvcnQgZXhlY3V0aW9uIGFuZCBnZW5lcmF0ZSBhIGNvcmUtZHVtcC4gICovCitleHRlcm4gdm9pZCBhYm9ydCAodm9pZCkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisKKworLyogUmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBgZXhpdCcgaXMgY2FsbGVkLiAgKi8KK2V4dGVybiBpbnQgYXRleGl0ICh2b2lkICgqX19mdW5jKSAodm9pZCkpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfR05VCisvLyBYWFggVGhlcmUgc2hvdWxkIGJlIGEgbWFjcm8gdG8gc2lnbmFsIHdpdGggQysrIHJldmlzaW9uIGlzIHVzZWQuCisvLyBYWFggVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgQysrMXggcmV2aXNpb24uCisvKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGBxdWlja19leGl0JyBpcyBjYWxsZWQuICAqLworIyBpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDKysiIGludCBhdF9xdWlja19leGl0ICh2b2lkICgqX19mdW5jKSAodm9pZCkpCisgICAgIF9fVEhST1cgX19hc20gKCJhdF9xdWlja19leGl0IikgX19ub25udWxsICgoMSkpOworIyBlbHNlCitleHRlcm4gaW50IGF0X3F1aWNrX2V4aXQgKHZvaWQgKCpfX2Z1bmMpICh2b2lkKSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjIGVuZGlmCisjZW5kaWYKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmCV9fVVNFX01JU0MKKy8qIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdpdGggdGhlIHN0YXR1cworICAgZ2l2ZW4gdG8gYGV4aXQnIGFuZCB0aGUgZ2l2ZW4gYXJndW1lbnQuICAqLworZXh0ZXJuIGludCBvbl9leGl0ICh2b2lkICgqX19mdW5jKSAoaW50IF9fc3RhdHVzLCB2b2lkICpfX2FyZyksIHZvaWQgKl9fYXJnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENhbGwgYWxsIGZ1bmN0aW9ucyByZWdpc3RlcmVkIHdpdGggYGF0ZXhpdCcgYW5kIGBvbl9leGl0JywKKyAgIGluIHRoZSByZXZlcnNlIG9mIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgcmVnaXN0ZXJlZCwKKyAgIHBlcmZvcm0gc3RkaW8gY2xlYW51cCwgYW5kIHRlcm1pbmF0ZSBwcm9ncmFtIGV4ZWN1dGlvbiB3aXRoIFNUQVRVUy4gICovCitleHRlcm4gdm9pZCBleGl0IChpbnQgX19zdGF0dXMpIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCisjaWZkZWYgX19VU0VfR05VCisvLyBYWFggVGhlcmUgc2hvdWxkIGJlIGEgbWFjcm8gdG8gc2lnbmFsIHdpdGggQysrIHJldmlzaW9uIGlzIHVzZWQuCisvLyBYWFggVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgQysrMXggcmV2aXNpb24uCisvKiBDYWxsIGFsbCBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIGBhdF9xdWlja19leGl0JyBpbiB0aGUgcmV2ZXJzZQorICAgb2YgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSByZWdpc3RlcmVkIGFuZCB0ZXJtaW5hdGUgcHJvZ3JhbQorICAgZXhlY3V0aW9uIHdpdGggU1RBVFVTLiAgKi8KK2V4dGVybiB2b2lkIHF1aWNrX2V4aXQgKGludCBfX3N0YXR1cykgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisjZW5kaWYKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBUZXJtaW5hdGUgdGhlIHByb2dyYW0gd2l0aCBTVEFUVVMgd2l0aG91dCBjYWxsaW5nIGFueSBvZiB0aGUKKyAgIGZ1bmN0aW9ucyByZWdpc3RlcmVkIHdpdGggYGF0ZXhpdCcgb3IgYG9uX2V4aXQnLiAgKi8KK2V4dGVybiB2b2lkIF9FeGl0IChpbnQgX19zdGF0dXMpIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGVudmFyaWFibGUgTkFNRSwgb3IgTlVMTCBpZiBpdCBkb2Vzbid0IGV4aXN0LiAgKi8KK2V4dGVybiBjaGFyICpnZXRlbnYgKF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworLyogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSBhYm92ZSBidXQgcmV0dXJucyBOVUxMIGlmIHRoZQorICAgcHJvZ3JhbXMgaXMgcnVubmluZyB3aXRoIFNVSUQgb3IgU0dJRCBlbmFibGVkLiAgKi8KK2V4dGVybiBjaGFyICpfX3NlY3VyZV9nZXRlbnYgKF9fY29uc3QgY2hhciAqX19uYW1lKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBUaGUgU1ZJRCBzYXlzIHRoaXMgaXMgaW4gPHN0ZGlvLmg+LCBidXQgdGhpcyBzZWVtcyBhIGJldHRlciBwbGFjZS4JKi8KKy8qIFB1dCBTVFJJTkcsIHdoaWNoIGlzIG9mIHRoZSBmb3JtICJOQU1FPVZBTFVFIiwgaW4gdGhlIGVudmlyb25tZW50LgorICAgSWYgdGhlcmUgaXMgbm8gYD0nLCByZW1vdmUgTkFNRSBmcm9tIHRoZSBlbnZpcm9ubWVudC4gICovCitleHRlcm4gaW50IHB1dGVudiAoY2hhciAqX19zdHJpbmcpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIFNldCBOQU1FIHRvIFZBTFVFIGluIHRoZSBlbnZpcm9ubWVudC4KKyAgIElmIFJFUExBQ0UgaXMgbm9uemVybywgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHZhbHVlLiAgKi8KK2V4dGVybiBpbnQgc2V0ZW52IChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgX19jb25zdCBjaGFyICpfX3ZhbHVlLCBpbnQgX19yZXBsYWNlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworLyogUmVtb3ZlIHRoZSB2YXJpYWJsZSBOQU1FIGZyb20gdGhlIGVudmlyb25tZW50LiAgKi8KK2V4dGVybiBpbnQgdW5zZXRlbnYgKF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfTUlTQworLyogVGhlIGBjbGVhcmVudicgd2FzIHBsYW5uZWQgdG8gYmUgYWRkZWQgdG8gUE9TSVguMSBidXQgcHJvYmFibHkKKyAgIG5ldmVyIG1hZGUgaXQuICBOZXZlcnRoZWxlc3MgdGhlIFBPU0lYLjkgc3RhbmRhcmQgKFBPU0lYIGJpbmRpbmdzCisgICBmb3IgRm9ydHJhbiA3NykgcmVxdWlyZXMgdGhpcyBmdW5jdGlvbi4gICovCitleHRlcm4gaW50IGNsZWFyZW52ICh2b2lkKSBfX1RIUk9XOworI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyBcCisgICAgfHwgKGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySykKKy8qIEdlbmVyYXRlIGEgdW5pcXVlIHRlbXBvcmFyeSBmaWxlIG5hbWUgZnJvbSBURU1QTEFURS4KKyAgIFRoZSBsYXN0IHNpeCBjaGFyYWN0ZXJzIG9mIFRFTVBMQVRFIG11c3QgYmUgIlhYWFhYWCI7CisgICB0aGV5IGFyZSByZXBsYWNlZCB3aXRoIGEgc3RyaW5nIHRoYXQgbWFrZXMgdGhlIGZpbGUgbmFtZSB1bmlxdWUuCisgICBSZXR1cm5zIFRFTVBMQVRFLCBvciBhIG51bGwgcG9pbnRlciBpZiBpdCBjYW5ub3QgZ2V0IGEgdW5pcXVlIGZpbGUgbmFtZS4gICovCitleHRlcm4gY2hhciAqbWt0ZW1wIChjaGFyICpfX3RlbXBsYXRlKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgXAorICAgIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKy8qIEdlbmVyYXRlIGEgdW5pcXVlIHRlbXBvcmFyeSBmaWxlIG5hbWUgZnJvbSBURU1QTEFURS4KKyAgIFRoZSBsYXN0IHNpeCBjaGFyYWN0ZXJzIG9mIFRFTVBMQVRFIG11c3QgYmUgIlhYWFhYWCI7CisgICB0aGV5IGFyZSByZXBsYWNlZCB3aXRoIGEgc3RyaW5nIHRoYXQgbWFrZXMgdGhlIGZpbGVuYW1lIHVuaXF1ZS4KKyAgIFJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3Igb3BlbiBvbiB0aGUgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZywKKyAgIG9yIC0xIGlmIGl0IGNhbm5vdCBjcmVhdGUgYSB1bmlxdWVseS1uYW1lZCBmaWxlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgbWtzdGVtcCAoY2hhciAqX190ZW1wbGF0ZSkgX19ub25udWxsICgoMSkpIF9fd3VyOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKG1rc3RlbXAsIChjaGFyICpfX3RlbXBsYXRlKSwgbWtzdGVtcDY0KQorICAgICBfX25vbm51bGwgKCgxKSkgX193dXI7CisjICBlbHNlCisjICAgZGVmaW5lIG1rc3RlbXAgbWtzdGVtcDY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBta3N0ZW1wNjQgKGNoYXIgKl9fdGVtcGxhdGUpIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTUlTQworLyogU2ltaWxhciB0byBta3N0ZW1wLCBidXQgdGhlIHRlbXBsYXRlIGNhbiBoYXZlIGEgc3VmZml4IGFmdGVyIHRoZQorICAgWFhYWFhYLiAgVGhlIGxlbmd0aCBvZiB0aGUgc3VmZml4IGlzIHNwZWNpZmllZCBpbiB0aGUgc2Vjb25kCisgICBwYXJhbWV0ZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBta3N0ZW1wcyAoY2hhciAqX190ZW1wbGF0ZSwgaW50IF9fc3VmZml4bGVuKSBfX25vbm51bGwgKCgxKSkgX193dXI7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAobWtzdGVtcHMsIChjaGFyICpfX3RlbXBsYXRlLCBpbnQgX19zdWZmaXhsZW4pLAorCQkgICAgICAgbWtzdGVtcHM2NCkgX19ub25udWxsICgoMSkpIF9fd3VyOworIyAgZWxzZQorIyAgIGRlZmluZSBta3N0ZW1wcyBta3N0ZW1wczY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBta3N0ZW1wczY0IChjaGFyICpfX3RlbXBsYXRlLCBpbnQgX19zdWZmaXhsZW4pCisgICAgIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorLyogQ3JlYXRlIGEgdW5pcXVlIHRlbXBvcmFyeSBkaXJlY3RvcnkgZnJvbSBURU1QTEFURS4KKyAgIFRoZSBsYXN0IHNpeCBjaGFyYWN0ZXJzIG9mIFRFTVBMQVRFIG11c3QgYmUgIlhYWFhYWCI7CisgICB0aGV5IGFyZSByZXBsYWNlZCB3aXRoIGEgc3RyaW5nIHRoYXQgbWFrZXMgdGhlIGRpcmVjdG9yeSBuYW1lIHVuaXF1ZS4KKyAgIFJldHVybnMgVEVNUExBVEUsIG9yIGEgbnVsbCBwb2ludGVyIGlmIGl0IGNhbm5vdCBnZXQgYSB1bmlxdWUgbmFtZS4KKyAgIFRoZSBkaXJlY3RvcnkgaXMgY3JlYXRlZCBtb2RlIDcwMC4gICovCitleHRlcm4gY2hhciAqbWtkdGVtcCAoY2hhciAqX190ZW1wbGF0ZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogR2VuZXJhdGUgYSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBmcm9tIFRFTVBMQVRFIHNpbWlsYXIgdG8KKyAgIG1rc3RlbXAuICBCdXQgYWxsb3cgdGhlIGNhbGxlciB0byBwYXNzIGFkZGl0aW9uYWwgZmxhZ3Mgd2hpY2ggYXJlCisgICB1c2VkIGluIHRoZSBvcGVuIGNhbGwgdG8gY3JlYXRlIHRoZSBmaWxlLi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IG1rb3N0ZW1wIChjaGFyICpfX3RlbXBsYXRlLCBpbnQgX19mbGFncykgX19ub25udWxsICgoMSkpIF9fd3VyOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKG1rb3N0ZW1wLCAoY2hhciAqX190ZW1wbGF0ZSwgaW50IF9fZmxhZ3MpLCBta29zdGVtcDY0KQorICAgICBfX25vbm51bGwgKCgxKSkgX193dXI7CisjICBlbHNlCisjICAgZGVmaW5lIG1rb3N0ZW1wIG1rb3N0ZW1wNjQKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IG1rb3N0ZW1wNjQgKGNoYXIgKl9fdGVtcGxhdGUsIGludCBfX2ZsYWdzKSBfX25vbm51bGwgKCgxKSkgX193dXI7CisjIGVuZGlmCisKKy8qIFNpbWlsYXIgdG8gbWtvc3RlbXAsIGJ1dCB0aGUgdGVtcGxhdGUgY2FuIGhhdmUgYSBzdWZmaXggYWZ0ZXIgdGhlCisgICBYWFhYWFguICBUaGUgbGVuZ3RoIG9mIHRoZSBzdWZmaXggaXMgc3BlY2lmaWVkIGluIHRoZSBzZWNvbmQKKyAgIHBhcmFtZXRlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IG1rb3N0ZW1wcyAoY2hhciAqX190ZW1wbGF0ZSwgaW50IF9fc3VmZml4bGVuLCBpbnQgX19mbGFncykKKyAgICAgX19ub25udWxsICgoMSkpIF9fd3VyOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKG1rb3N0ZW1wcywgKGNoYXIgKl9fdGVtcGxhdGUsIGludCBfX3N1ZmZpeGxlbiwKKwkJCQkgICBpbnQgX19mbGFncyksIG1rb3N0ZW1wczY0KQorICAgICBfX25vbm51bGwgKCgxKSkgX193dXI7CisjICBlbHNlCisjICAgZGVmaW5lIG1rb3N0ZW1wcyBta29zdGVtcHM2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgbWtvc3RlbXBzNjQgKGNoYXIgKl9fdGVtcGxhdGUsIGludCBfX3N1ZmZpeGxlbiwgaW50IF9fZmxhZ3MpCisgICAgIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgZW5kaWYKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogRXhlY3V0ZSB0aGUgZ2l2ZW4gbGluZSBhcyBhIHNoZWxsIGNvbW1hbmQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzeXN0ZW0gKF9fY29uc3QgY2hhciAqX19jb21tYW5kKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworCisjaWZkZWYJX19VU0VfR05VCisvKiBSZXR1cm4gYSBtYWxsb2MnZCBzdHJpbmcgY29udGFpbmluZyB0aGUgY2Fub25pY2FsIGFic29sdXRlIG5hbWUgb2YgdGhlCisgICBleGlzdGluZyBuYW1lZCBmaWxlLiAgKi8KK2V4dGVybiBjaGFyICpjYW5vbmljYWxpemVfZmlsZV9uYW1lIChfX2NvbnN0IGNoYXIgKl9fbmFtZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFJldHVybiB0aGUgY2Fub25pY2FsIGFic29sdXRlIG5hbWUgb2YgZmlsZSBOQU1FLiAgSWYgUkVTT0xWRUQgaXMKKyAgIG51bGwsIHRoZSByZXN1bHQgaXMgbWFsbG9jJ2Q7IG90aGVyd2lzZSwgaWYgdGhlIGNhbm9uaWNhbCBuYW1lIGlzCisgICBQQVRIX01BWCBjaGFycyBvciBtb3JlLCByZXR1cm5zIG51bGwgd2l0aCBgZXJybm8nIHNldCB0bworICAgRU5BTUVUT09MT05HOyBpZiB0aGUgbmFtZSBmaXRzIGluIGZld2VyIHRoYW4gUEFUSF9NQVggY2hhcnMsCisgICByZXR1cm5zIHRoZSBuYW1lIGluIFJFU09MVkVELiAgKi8KK2V4dGVybiBjaGFyICpyZWFscGF0aCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19yZXNvbHZlZCkgX19USFJPVyBfX3d1cjsKKyNlbmRpZgorCisKKy8qIFNob3J0aGFuZCBmb3IgdHlwZSBvZiBjb21wYXJpc29uIGZ1bmN0aW9ucy4gICovCisjaWZuZGVmIF9fQ09NUEFSX0ZOX1QKKyMgZGVmaW5lIF9fQ09NUEFSX0ZOX1QKK3R5cGVkZWYgaW50ICgqX19jb21wYXJfZm5fdCkgKF9fY29uc3Qgdm9pZCAqLCBfX2NvbnN0IHZvaWQgKik7CisKKyMgaWZkZWYJX19VU0VfR05VCit0eXBlZGVmIF9fY29tcGFyX2ZuX3QgY29tcGFyaXNvbl9mbl90OworIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfR05VCit0eXBlZGVmIGludCAoKl9fY29tcGFyX2RfZm5fdCkgKF9fY29uc3Qgdm9pZCAqLCBfX2NvbnN0IHZvaWQgKiwgdm9pZCAqKTsKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIERvIGEgYmluYXJ5IHNlYXJjaCBmb3IgS0VZIGluIEJBU0UsIHdoaWNoIGNvbnNpc3RzIG9mIE5NRU1CIGVsZW1lbnRzCisgICBvZiBTSVpFIGJ5dGVzIGVhY2gsIHVzaW5nIENPTVBBUiB0byBwZXJmb3JtIHRoZSBjb21wYXJpc29ucy4gICovCitleHRlcm4gdm9pZCAqYnNlYXJjaCAoX19jb25zdCB2b2lkICpfX2tleSwgX19jb25zdCB2b2lkICpfX2Jhc2UsCisJCSAgICAgIHNpemVfdCBfX25tZW1iLCBzaXplX3QgX19zaXplLCBfX2NvbXBhcl9mbl90IF9fY29tcGFyKQorICAgICBfX25vbm51bGwgKCgxLCAyLCA1KSkgX193dXI7CisKKy8qIFNvcnQgTk1FTUIgZWxlbWVudHMgb2YgQkFTRSwgb2YgU0laRSBieXRlcyBlYWNoLAorICAgdXNpbmcgQ09NUEFSIHRvIHBlcmZvcm0gdGhlIGNvbXBhcmlzb25zLiAgKi8KK2V4dGVybiB2b2lkIHFzb3J0ICh2b2lkICpfX2Jhc2UsIHNpemVfdCBfX25tZW1iLCBzaXplX3QgX19zaXplLAorCQkgICBfX2NvbXBhcl9mbl90IF9fY29tcGFyKSBfX25vbm51bGwgKCgxLCA0KSk7CisjaWZkZWYgX19VU0VfR05VCitleHRlcm4gdm9pZCBxc29ydF9yICh2b2lkICpfX2Jhc2UsIHNpemVfdCBfX25tZW1iLCBzaXplX3QgX19zaXplLAorCQkgICAgIF9fY29tcGFyX2RfZm5fdCBfX2NvbXBhciwgdm9pZCAqX19hcmcpCisgIF9fbm9ubnVsbCAoKDEsIDQpKTsKKyNlbmRpZgorCisKKy8qIFJldHVybiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgWC4gICovCitleHRlcm4gaW50IGFicyAoaW50IF9feCkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSkgX193dXI7CitleHRlcm4gbG9uZyBpbnQgbGFicyAobG9uZyBpbnQgX194KSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorX19leHRlbnNpb25fXyBleHRlcm4gbG9uZyBsb25nIGludCBsbGFicyAobG9uZyBsb25nIGludCBfX3gpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpIF9fd3VyOworI2VuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZXR1cm4gdGhlIGBkaXZfdCcsIGBsZGl2X3QnIG9yIGBsbGRpdl90JyByZXByZXNlbnRhdGlvbgorICAgb2YgdGhlIHZhbHVlIG9mIE5VTUVSIG92ZXIgREVOT00uICovCisvKiBHQ0MgbWF5IGhhdmUgYnVpbHQtaW5zIGZvciB0aGVzZSBzb21lZGF5LiAgKi8KK2V4dGVybiBkaXZfdCBkaXYgKGludCBfX251bWVyLCBpbnQgX19kZW5vbSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSkgX193dXI7CitleHRlcm4gbGRpdl90IGxkaXYgKGxvbmcgaW50IF9fbnVtZXIsIGxvbmcgaW50IF9fZGVub20pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpIF9fd3VyOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIGxsZGl2X3QgbGxkaXYgKGxvbmcgbG9uZyBpbnQgX19udW1lciwKKwkJCQkgICAgbG9uZyBsb25nIGludCBfX2Rlbm9tKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisKKyNpZiAoZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLKSBcCisgICAgfHwgZGVmaW5lZCBfX1VTRV9TVklECisvKiBDb252ZXJ0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgdG8gc3RyaW5ncy4gIFRoZSByZXR1cm5lZCB2YWx1ZXMgYXJlCisgICB2YWxpZCBvbmx5IHVudGlsIGFub3RoZXIgY2FsbCB0byB0aGUgc2FtZSBmdW5jdGlvbi4gICovCisKKy8qIENvbnZlcnQgVkFMVUUgdG8gYSBzdHJpbmcgd2l0aCBORElHSVQgZGlnaXRzIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvCisgICB0aGlzLiAgU2V0ICpERUNQVCB3aXRoIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVjaW1hbCBjaGFyYWN0ZXIgYW5kICpTSUdOCisgICB3aXRoIHRoZSBzaWduIG9mIHRoZSBudW1iZXIuICAqLworZXh0ZXJuIGNoYXIgKmVjdnQgKGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LAorCQkgICBpbnQgKl9fcmVzdHJpY3QgX19zaWduKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDMsIDQpKSBfX3d1cjsKKworLyogQ29udmVydCBWQUxVRSB0byBhIHN0cmluZyByb3VuZGVkIHRvIE5ESUdJVCBkZWNpbWFsIGRpZ2l0cy4gIFNldCAqREVDUFQKKyAgIHdpdGggdGhlIHBvc2l0aW9uIG9mIHRoZSBkZWNpbWFsIGNoYXJhY3RlciBhbmQgKlNJR04gd2l0aCB0aGUgc2lnbiBvZgorICAgdGhlIG51bWJlci4gICovCitleHRlcm4gY2hhciAqZmN2dCAoZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwgaW50ICpfX3Jlc3RyaWN0IF9fZGVjcHQsCisJCSAgIGludCAqX19yZXN0cmljdCBfX3NpZ24pIF9fVEhST1cgX19ub25udWxsICgoMywgNCkpIF9fd3VyOworCisvKiBJZiBwb3NzaWJsZSBjb252ZXJ0IFZBTFVFIHRvIGEgc3RyaW5nIHdpdGggTkRJR0lUIHNpZ25pZmljYW50IGRpZ2l0cy4KKyAgIE90aGVyd2lzZSB1c2UgZXhwb25lbnRpYWwgcmVwcmVzZW50YXRpb24uICBUaGUgcmVzdWx0aW5nIHN0cmluZyB3aWxsCisgICBiZSB3cml0dGVuIHRvIEJVRi4gICovCitleHRlcm4gY2hhciAqZ2N2dCAoZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwgY2hhciAqX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMykpIF9fd3VyOworCisKKyMgaWZkZWYgX19VU0VfTUlTQworLyogTG9uZyBkb3VibGUgdmVyc2lvbnMgb2YgYWJvdmUgZnVuY3Rpb25zLiAgKi8KK2V4dGVybiBjaGFyICpxZWN2dCAobG9uZyBkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LAorCQkgICAgaW50ICpfX3Jlc3RyaWN0IF9fZGVjcHQsIGludCAqX19yZXN0cmljdCBfX3NpZ24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMywgNCkpIF9fd3VyOworZXh0ZXJuIGNoYXIgKnFmY3Z0IChsb25nIGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsCisJCSAgICBpbnQgKl9fcmVzdHJpY3QgX19kZWNwdCwgaW50ICpfX3Jlc3RyaWN0IF9fc2lnbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzLCA0KSkgX193dXI7CitleHRlcm4gY2hhciAqcWdjdnQgKGxvbmcgZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwgY2hhciAqX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMykpIF9fd3VyOworCisKKy8qIFJlZW50cmFudCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUgd2hpY2ggcHJvdmlkZSB0aGVpciBvd24KKyAgIGJ1ZmZlcnMuICAqLworZXh0ZXJuIGludCBlY3Z0X3IgKGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LAorCQkgICBpbnQgKl9fcmVzdHJpY3QgX19zaWduLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLAorCQkgICBzaXplX3QgX19sZW4pIF9fVEhST1cgX19ub25udWxsICgoMywgNCwgNSkpOworZXh0ZXJuIGludCBmY3Z0X3IgKGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LAorCQkgICBpbnQgKl9fcmVzdHJpY3QgX19zaWduLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLAorCQkgICBzaXplX3QgX19sZW4pIF9fVEhST1cgX19ub25udWxsICgoMywgNCwgNSkpOworCitleHRlcm4gaW50IHFlY3Z0X3IgKGxvbmcgZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwKKwkJICAgIGludCAqX19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduLAorCQkgICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDMsIDQsIDUpKTsKK2V4dGVybiBpbnQgcWZjdnRfciAobG9uZyBkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LAorCQkgICAgaW50ICpfX3Jlc3RyaWN0IF9fZGVjcHQsIGludCAqX19yZXN0cmljdCBfX3NpZ24sCisJCSAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMywgNCwgNSkpOworIyBlbmRpZgkvKiBtaXNjICovCisjZW5kaWYJLyogdXNlIE1JU0MgfHwgdXNlIFgvT3BlbiBVbml4ICovCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgbXVsdGlieXRlIGNoYXJhY3RlcgorICAgaW4gUywgd2hpY2ggaXMgbm8gbG9uZ2VyIHRoYW4gTi4gICovCitleHRlcm4gaW50IG1ibGVuIChfX2NvbnN0IGNoYXIgKl9fcywgc2l6ZV90IF9fbikgX19USFJPVyBfX3d1cjsKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBtdWx0aWJ5dGUgY2hhcmFjdGVyLAorICAgcHV0dGluZyBpdHMgYHdjaGFyX3QnIHJlcHJlc2VudGF0aW9uIGluICpQV0MuICAqLworZXh0ZXJuIGludCBtYnRvd2MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19wd2MsCisJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24pIF9fVEhST1cgX193dXI7CisvKiBQdXQgdGhlIG11bHRpYnl0ZSBjaGFyYWN0ZXIgcmVwcmVzZW50ZWQKKyAgIGJ5IFdDSEFSIGluIFMsIHJldHVybmluZyBpdHMgbGVuZ3RoLiAgKi8KK2V4dGVybiBpbnQgd2N0b21iIChjaGFyICpfX3MsIHdjaGFyX3QgX193Y2hhcikgX19USFJPVyBfX3d1cjsKKworCisvKiBDb252ZXJ0IGEgbXVsdGlieXRlIHN0cmluZyB0byBhIHdpZGUgY2hhciBzdHJpbmcuICAqLworZXh0ZXJuIHNpemVfdCBtYnN0b3djcyAod2NoYXJfdCAqX19yZXN0cmljdCAgX19wd2NzLAorCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbikgX19USFJPVzsKKy8qIENvbnZlcnQgYSB3aWRlIGNoYXIgc3RyaW5nIHRvIG11bHRpYnl0ZSBzdHJpbmcuICAqLworZXh0ZXJuIHNpemVfdCB3Y3N0b21icyAoY2hhciAqX19yZXN0cmljdCBfX3MsCisJCQlfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19wd2NzLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisKKyNpZmRlZiBfX1VTRV9TVklECisvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3RyaW5nIHZhbHVlIG9mIFJFU1BPTlNFIG1hdGNoZXMgdGhlIGFmZmlybWF0aW9uCisgICBvciBuZWdhdGl2ZSByZXNwb25zZSBleHByZXNzaW9uIGFzIHNwZWNpZmllZCBieSB0aGUgTENfTUVTU0FHRVMgY2F0ZWdvcnkKKyAgIGluIHRoZSBwcm9ncmFtJ3MgY3VycmVudCBsb2NhbGUuICBSZXR1cm5zIDEgaWYgYWZmaXJtYXRpdmUsIDAgaWYKKyAgIG5lZ2F0aXZlLCBhbmQgLTEgaWYgbm90IG1hdGNoaW5nLiAgKi8KK2V4dGVybiBpbnQgcnBtYXRjaCAoX19jb25zdCBjaGFyICpfX3Jlc3BvbnNlKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKy8qIFBhcnNlIGNvbW1hIHNlcGFyYXRlZCBzdWJvcHRpb24gZnJvbSAqT1BUSU9OUCBhbmQgbWF0Y2ggYWdhaW5zdAorICAgc3RyaW5ncyBpbiBUT0tFTlMuICBJZiBmb3VuZCByZXR1cm4gaW5kZXggYW5kIHNldCAqVkFMVUVQIHRvCisgICBvcHRpb25hbCB2YWx1ZSBpbnRyb2R1Y2VkIGJ5IGFuIGVxdWFsIHNpZ24uICBJZiB0aGUgc3Vib3B0aW9uIGlzCisgICBub3QgcGFydCBvZiBUT0tFTlMgcmV0dXJuIGluICpWQUxVRVAgYmVnaW5uaW5nIG9mIHVua25vd24KKyAgIHN1Ym9wdGlvbi4gIE9uIGV4aXQgKk9QVElPTlAgaXMgc2V0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQKKyAgIHRva2VuIG9yIGF0IHRoZSB0ZXJtaW5hdGluZyBOVUwgY2hhcmFjdGVyLiAgKi8KK2V4dGVybiBpbnQgZ2V0c3Vib3B0IChjaGFyICoqX19yZXN0cmljdCBfX29wdGlvbnAsCisJCSAgICAgIGNoYXIgKl9fY29uc3QgKl9fcmVzdHJpY3QgX190b2tlbnMsCisJCSAgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fdmFsdWVwKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIsIDMpKSBfX3d1cjsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9YT1BFTgorLyogU2V0dXAgREVTIHRhYmxlcyBhY2NvcmRpbmcgS0VZLiAgKi8KK2V4dGVybiB2b2lkIHNldGtleSAoX19jb25zdCBjaGFyICpfX2tleSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworCisvKiBYL09wZW4gcHNldWRvIHRlcm1pbmFsIGhhbmRsaW5nLiAgKi8KKworI2lmZGVmIF9fVVNFX1hPUEVOMktYU0kKKy8qIFJldHVybiBhIG1hc3RlciBwc2V1ZG8tdGVybWluYWwgaGFuZGxlLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfb3BlbnB0IChpbnQgX19vZmxhZykgX193dXI7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX1hPUEVOCisvKiBUaGUgbmV4dCBmb3VyIGZ1bmN0aW9ucyBhbGwgdGFrZSBhIG1hc3RlciBwc2V1ZG8tdHR5IGZkIGFuZAorICAgcGVyZm9ybSBhbiBvcGVyYXRpb24gb24gdGhlIGFzc29jaWF0ZWQgc2xhdmU6ICAqLworCisvKiBDaG93biB0aGUgc2xhdmUgdG8gdGhlIGNhbGxpbmcgdXNlci4gICovCitleHRlcm4gaW50IGdyYW50cHQgKGludCBfX2ZkKSBfX1RIUk9XOworCisvKiBSZWxlYXNlIGFuIGludGVybmFsIGxvY2sgc28gdGhlIHNsYXZlIGNhbiBiZSBvcGVuZWQuCisgICBDYWxsIGFmdGVyIGdyYW50cHQoKS4gICovCitleHRlcm4gaW50IHVubG9ja3B0IChpbnQgX19mZCkgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBwYXRobmFtZSBvZiB0aGUgcHNldWRvIHRlcm1pbmFsIHNsYXZlIGFzc29pY2F0ZWQgd2l0aAorICAgdGhlIG1hc3RlciBGRCBpcyBvcGVuIG9uLCBvciBOVUxMIG9uIGVycm9ycy4KKyAgIFRoZSByZXR1cm5lZCBzdG9yYWdlIGlzIGdvb2QgdW50aWwgdGhlIG5leHQgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiBjaGFyICpwdHNuYW1lIChpbnQgX19mZCkgX19USFJPVyBfX3d1cjsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBTdG9yZSBhdCBtb3N0IEJVRkxFTiBjaGFyYWN0ZXJzIG9mIHRoZSBwYXRobmFtZSBvZiB0aGUgc2xhdmUgcHNldWRvCisgICB0ZXJtaW5hbCBhc3NvY2lhdGVkIHdpdGggdGhlIG1hc3RlciBGRCBpcyBvcGVuIG9uIGluIEJVRi4KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIuICAqLworZXh0ZXJuIGludCBwdHNuYW1lX3IgKGludCBfX2ZkLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworLyogT3BlbiBhIG1hc3RlciBwc2V1ZG8gdGVybWluYWwgYW5kIHJldHVybiBpdHMgZmlsZSBkZXNjcmlwdG9yLiAgKi8KK2V4dGVybiBpbnQgZ2V0cHQgKHZvaWQpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIFB1dCB0aGUgMSBtaW51dGUsIDUgbWludXRlIGFuZCAxNSBtaW51dGUgbG9hZCBhdmVyYWdlcyBpbnRvIHRoZSBmaXJzdAorICAgTkVMRU0gZWxlbWVudHMgb2YgTE9BREFWRy4gIFJldHVybiB0aGUgbnVtYmVyIHdyaXR0ZW4gKG5ldmVyIG1vcmUgdGhhbgorICAgdGhyZWUsIGJ1dCBtYXkgYmUgbGVzcyB0aGFuIE5FTEVNKSwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuICAqLworZXh0ZXJuIGludCBnZXRsb2FkYXZnIChkb3VibGUgX19sb2FkYXZnW10sIGludCBfX25lbGVtKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisKKy8qIERlZmluZSBzb21lIG1hY3JvcyBoZWxwaW5nIHRvIGNhdGNoIGJ1ZmZlciBvdmVyZmxvd3MuICAqLworI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZQorIyBpbmNsdWRlIDxiaXRzL3N0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgX19MREJMX0NPTVBBVAorIyBpbmNsdWRlIDxiaXRzL3N0ZGxpYi1sZGJsLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIGRvbid0IGp1c3QgbmVlZCBtYWxsb2MgYW5kIGNhbGxvYyAqLworI3VuZGVmIF9fbmVlZF9tYWxsb2NfYW5kX2NhbGxvYworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3RkbGliLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N0cmluZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODg0MDIxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zdHJpbmcuaApAQCAtMCwwICsxLDY0OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTMsMTk5NS0yMDA0LDIwMDcsMjAwOSwyMDEwCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTkgU3RhbmRhcmQ6IDcuMjEgU3RyaW5nIGhhbmRsaW5nCTxzdHJpbmcuaD4KKyAqLworCisjaWZuZGVmCV9TVFJJTkdfSAorI2RlZmluZQlfU1RSSU5HX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBHZXQgc2l6ZV90IGFuZCBOVUxMIGZyb20gPHN0ZGRlZi5oPi4gICovCisjZGVmaW5lCV9fbmVlZF9zaXplX3QKKyNkZWZpbmUJX19uZWVkX05VTEwKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogVGVsbCB0aGUgY2FsbGVyIHRoYXQgd2UgcHJvdmlkZSBjb3JyZWN0IEMrKyBwcm90b3R5cGVzLiAgKi8KKyNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fR05VQ19QUkVSRVEgKDQsIDQpCisjIGRlZmluZSBfX0NPUlJFQ1RfSVNPX0NQUF9TVFJJTkdfSF9QUk9UTworI2VuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDb3B5IE4gYnl0ZXMgb2YgU1JDIHRvIERFU1QuICAqLworZXh0ZXJuIHZvaWQgKm1lbWNweSAodm9pZCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCSAgICAgX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKy8qIENvcHkgTiBieXRlcyBvZiBTUkMgdG8gREVTVCwgZ3VhcmFudGVlaW5nCisgICBjb3JyZWN0IGJlaGF2aW9yIGZvciBvdmVybGFwcGluZyBzdHJpbmdzLiAgKi8KK2V4dGVybiB2b2lkICptZW1tb3ZlICh2b2lkICpfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19zcmMsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworX19FTkRfTkFNRVNQQUNFX1NURAorCisvKiBDb3B5IG5vIG1vcmUgdGhhbiBOIGJ5dGVzIG9mIFNSQyB0byBERVNULCBzdG9wcGluZyB3aGVuIEMgaXMgZm91bmQuCisgICBSZXR1cm4gdGhlIHBvc2l0aW9uIGluIERFU1Qgb25lIGJ5dGUgcGFzdCB3aGVyZSBDIHdhcyBjb3BpZWQsCisgICBvciBOVUxMIGlmIEMgd2FzIG5vdCBmb3VuZCBpbiB0aGUgZmlyc3QgTiBieXRlcyBvZiBTUkMuICAqLworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCitleHRlcm4gdm9pZCAqbWVtY2NweSAodm9pZCAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3NyYywKKwkJICAgICAgaW50IF9fYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjZW5kaWYgLyogU1ZJRC4gICovCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBTZXQgTiBieXRlcyBvZiBTIHRvIEMuICAqLworZXh0ZXJuIHZvaWQgKm1lbXNldCAodm9pZCAqX19zLCBpbnQgX19jLCBzaXplX3QgX19uKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogQ29tcGFyZSBOIGJ5dGVzIG9mIFMxIGFuZCBTMi4gICovCitleHRlcm4gaW50IG1lbWNtcCAoX19jb25zdCB2b2lkICpfX3MxLCBfX2NvbnN0IHZvaWQgKl9fczIsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2VhcmNoIE4gYnl0ZXMgb2YgUyBmb3IgQy4gICovCisjaWZkZWYgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HX0hfUFJPVE8KK2V4dGVybiAiQysrIgoreworZXh0ZXJuIHZvaWQgKm1lbWNociAodm9pZCAqX19zLCBpbnQgX19jLCBzaXplX3QgX19uKQorICAgICAgX19USFJPVyBfX2FzbSAoIm1lbWNociIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gX19jb25zdCB2b2lkICptZW1jaHIgKF9fY29uc3Qgdm9pZCAqX19zLCBpbnQgX19jLCBzaXplX3QgX19uKQorICAgICAgX19USFJPVyBfX2FzbSAoIm1lbWNociIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisKKyMgaWZkZWYgX19PUFRJTUlaRV9fCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQgKgorbWVtY2hyICh2b2lkICpfX3MsIGludCBfX2MsIHNpemVfdCBfX24pIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9tZW1jaHIgKF9fcywgX19jLCBfX24pOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fY29uc3Qgdm9pZCAqCittZW1jaHIgKF9fY29uc3Qgdm9pZCAqX19zLCBpbnQgX19jLCBzaXplX3QgX19uKSBfX1RIUk9XCit7CisgIHJldHVybiBfX2J1aWx0aW5fbWVtY2hyIChfX3MsIF9fYywgX19uKTsKK30KKyMgZW5kaWYKK30KKyNlbHNlCitleHRlcm4gdm9pZCAqbWVtY2hyIChfX2NvbnN0IHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikKKyAgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfR05VCisvKiBTZWFyY2ggaW4gUyBmb3IgQy4gIFRoaXMgaXMgc2ltaWxhciB0byBgbWVtY2hyJyBidXQgdGhlcmUgaXMgbm8KKyAgIGxlbmd0aCBsaW1pdC4gICovCisjIGlmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR19IX1BST1RPCitleHRlcm4gIkMrKyIgdm9pZCAqcmF3bWVtY2hyICh2b2lkICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hc20gKCJyYXdtZW1jaHIiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworZXh0ZXJuICJDKysiIF9fY29uc3Qgdm9pZCAqcmF3bWVtY2hyIChfX2NvbnN0IHZvaWQgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2FzbSAoInJhd21lbWNociIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjIGVsc2UKK2V4dGVybiB2b2lkICpyYXdtZW1jaHIgKF9fY29uc3Qgdm9pZCAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjIGVuZGlmCisKKy8qIFNlYXJjaCBOIGJ5dGVzIG9mIFMgZm9yIHRoZSBmaW5hbCBvY2N1cnJlbmNlIG9mIEMuICAqLworIyBpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9TVFJJTkdfSF9QUk9UTworZXh0ZXJuICJDKysiIHZvaWQgKm1lbXJjaHIgKHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikKKyAgICAgIF9fVEhST1cgX19hc20gKCJtZW1yY2hyIikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiAiQysrIiBfX2NvbnN0IHZvaWQgKm1lbXJjaHIgKF9fY29uc3Qgdm9pZCAqX19zLCBpbnQgX19jLCBzaXplX3QgX19uKQorICAgICAgX19USFJPVyBfX2FzbSAoIm1lbXJjaHIiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworIyBlbHNlCitleHRlcm4gdm9pZCAqbWVtcmNociAoX19jb25zdCB2b2lkICpfX3MsIGludCBfX2MsIHNpemVfdCBfX24pCisgICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjIGVuZGlmCisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENvcHkgU1JDIHRvIERFU1QuICAqLworZXh0ZXJuIGNoYXIgKnN0cmNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisvKiBDb3B5IG5vIG1vcmUgdGhhbiBOIGNoYXJhY3RlcnMgb2YgU1JDIHRvIERFU1QuICAqLworZXh0ZXJuIGNoYXIgKnN0cm5jcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBBcHBlbmQgU1JDIG9udG8gREVTVC4gICovCitleHRlcm4gY2hhciAqc3RyY2F0IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKy8qIEFwcGVuZCBubyBtb3JlIHRoYW4gTiBjaGFyYWN0ZXJzIGZyb20gU1JDIG9udG8gREVTVC4gICovCitleHRlcm4gY2hhciAqc3RybmNhdCAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJICAgICAgc2l6ZV90IF9fbikgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIENvbXBhcmUgUzEgYW5kIFMyLiAgKi8KK2V4dGVybiBpbnQgc3RyY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworLyogQ29tcGFyZSBOIGNoYXJhY3RlcnMgb2YgUzEgYW5kIFMyLiAgKi8KK2V4dGVybiBpbnQgc3RybmNtcCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogQ29tcGFyZSB0aGUgY29sbGF0ZWQgZm9ybXMgb2YgUzEgYW5kIFMyLiAgKi8KK2V4dGVybiBpbnQgc3RyY29sbCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKy8qIFB1dCBhIHRyYW5zZm9ybWF0aW9uIG9mIFNSQyBpbnRvIG5vIG1vcmUgdGhhbiBOIGJ5dGVzIG9mIERFU1QuICAqLworZXh0ZXJuIHNpemVfdCBzdHJ4ZnJtIChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGJvdGggYWJvdmUgYnV0IHRoZXkKKyAgIHRha2UgdGhlIGxvY2FsZSB0aGV5IHVzZSBmb3IgdGhlIGNvbGxhdGlvbiBhcyBhbiBleHRyYSBhcmd1bWVudC4KKyAgIFRoaXMgaXMgbm90IHN0YW5kYXJkc2l6ZWQgYnV0IHNvbWV0aGluZyBsaWtlIHdpbGwgY29tZS4gICovCisjIGluY2x1ZGUgPHhsb2NhbGUuaD4KKworLyogQ29tcGFyZSB0aGUgY29sbGF0ZWQgZm9ybXMgb2YgUzEgYW5kIFMyIHVzaW5nIHJ1bGVzIGZyb20gTC4gICovCitleHRlcm4gaW50IHN0cmNvbGxfbCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsIF9fbG9jYWxlX3QgX19sKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyLCAzKSk7CisvKiBQdXQgYSB0cmFuc2Zvcm1hdGlvbiBvZiBTUkMgaW50byBubyBtb3JlIHRoYW4gTiBieXRlcyBvZiBERVNULiAgKi8KK2V4dGVybiBzaXplX3Qgc3RyeGZybV9sIChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19zcmMsIHNpemVfdCBfX24sCisJCQkgX19sb2NhbGVfdCBfX2wpIF9fVEhST1cgX19ub25udWxsICgoMiwgNCkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCBcCisgICAgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorLyogRHVwbGljYXRlIFMsIHJldHVybmluZyBhbiBpZGVudGljYWwgbWFsbG9jJ2Qgc3RyaW5nLiAgKi8KK2V4dGVybiBjaGFyICpzdHJkdXAgKF9fY29uc3QgY2hhciAqX19zKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX21hbGxvY19fIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisvKiBSZXR1cm4gYSBtYWxsb2MnZCBjb3B5IG9mIGF0IG1vc3QgTiBieXRlcyBvZiBTVFJJTkcuICBUaGUKKyAgIHJlc3VsdGFudCBzdHJpbmcgaXMgdGVybWluYXRlZCBldmVuIGlmIG5vIG51bGwgdGVybWluYXRvcgorICAgYXBwZWFycyBiZWZvcmUgU1RSSU5HW05dLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CitleHRlcm4gY2hhciAqc3RybmR1cCAoX19jb25zdCBjaGFyICpfX3N0cmluZywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfR05VICYmIGRlZmluZWQgX19HTlVDX18KKy8qIER1cGxpY2F0ZSBTLCByZXR1cm5pbmcgYW4gaWRlbnRpY2FsIGFsbG9jYSdkIHN0cmluZy4gICovCisjIGRlZmluZSBzdHJkdXBhKHMpCQkJCQkJCSAgICAgIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgICh7CQkJCQkJCQkJICAgICAgXAorICAgICAgX19jb25zdCBjaGFyICpfX29sZCA9IChzKTsJCQkJCSAgICAgIFwKKyAgICAgIHNpemVfdCBfX2xlbiA9IHN0cmxlbiAoX19vbGQpICsgMTsJCQkJICAgICAgXAorICAgICAgY2hhciAqX19uZXcgPSAoY2hhciAqKSBfX2J1aWx0aW5fYWxsb2NhIChfX2xlbik7CQkJICAgICAgXAorICAgICAgKGNoYXIgKikgbWVtY3B5IChfX25ldywgX19vbGQsIF9fbGVuKTsJCQkJICAgICAgXAorICAgIH0pKQorCisvKiBSZXR1cm4gYW4gYWxsb2NhJ2QgY29weSBvZiBhdCBtb3N0IE4gYnl0ZXMgb2Ygc3RyaW5nLiAgKi8KKyMgZGVmaW5lIHN0cm5kdXBhKHMsIG4pCQkJCQkJCSAgICAgIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgICh7CQkJCQkJCQkJICAgICAgXAorICAgICAgX19jb25zdCBjaGFyICpfX29sZCA9IChzKTsJCQkJCSAgICAgIFwKKyAgICAgIHNpemVfdCBfX2xlbiA9IHN0cm5sZW4gKF9fb2xkLCAobikpOwkJCQkgICAgICBcCisgICAgICBjaGFyICpfX25ldyA9IChjaGFyICopIF9fYnVpbHRpbl9hbGxvY2EgKF9fbGVuICsgMSk7CQkgICAgICBcCisgICAgICBfX25ld1tfX2xlbl0gPSAnXDAnOwkJCQkJCSAgICAgIFwKKyAgICAgIChjaGFyICopIG1lbWNweSAoX19uZXcsIF9fb2xkLCBfX2xlbik7CQkJCSAgICAgIFwKKyAgICB9KSkKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQyBpbiBTLiAgKi8KKyNpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9TVFJJTkdfSF9QUk9UTworZXh0ZXJuICJDKysiCit7CitleHRlcm4gY2hhciAqc3RyY2hyIChjaGFyICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hc20gKCJzdHJjaHIiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworZXh0ZXJuIF9fY29uc3QgY2hhciAqc3RyY2hyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2FzbSAoInN0cmNociIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisKKyMgaWZkZWYgX19PUFRJTUlaRV9fCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorc3RyY2hyIChjaGFyICpfX3MsIGludCBfX2MpIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zdHJjaHIgKF9fcywgX19jKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX2NvbnN0IGNoYXIgKgorc3RyY2hyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX3N0cmNociAoX19zLCBfX2MpOworfQorIyBlbmRpZgorfQorI2Vsc2UKK2V4dGVybiBjaGFyICpzdHJjaHIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKy8qIEZpbmQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBDIGluIFMuICAqLworI2lmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR19IX1BST1RPCitleHRlcm4gIkMrKyIKK3sKK2V4dGVybiBjaGFyICpzdHJyY2hyIChjaGFyICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hc20gKCJzdHJyY2hyIikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBfX2NvbnN0IGNoYXIgKnN0cnJjaHIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXNtICgic3RycmNociIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisKKyMgaWZkZWYgX19PUFRJTUlaRV9fCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorc3RycmNociAoY2hhciAqX19zLCBpbnQgX19jKSBfX1RIUk9XCit7CisgIHJldHVybiBfX2J1aWx0aW5fc3RycmNociAoX19zLCBfX2MpOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fY29uc3QgY2hhciAqCitzdHJyY2hyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX3N0cnJjaHIgKF9fcywgX19jKTsKK30KKyMgZW5kaWYKK30KKyNlbHNlCitleHRlcm4gY2hhciAqc3RycmNociAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfR05VCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gYHN0cmNocicuICBCdXQgaXQgcmV0dXJucyBhIHBvaW50ZXIgdG8KKyAgIHRoZSBjbG9zaW5nIE5VTCBieXRlIGluIGNhc2UgQyBpcyBub3QgZm91bmQgaW4gUy4gICovCisjIGlmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR19IX1BST1RPCitleHRlcm4gIkMrKyIgY2hhciAqc3RyY2hybnVsIChjaGFyICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hc20gKCJzdHJjaHJudWwiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworZXh0ZXJuICJDKysiIF9fY29uc3QgY2hhciAqc3RyY2hybnVsIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2FzbSAoInN0cmNocm51bCIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjIGVsc2UKK2V4dGVybiBjaGFyICpzdHJjaHJudWwgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjIGVuZGlmCisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCBzZWdtZW50IG9mIFMgd2hpY2gKKyAgIGNvbnNpc3RzIGVudGlyZWx5IG9mIGNoYXJhY3RlcnMgbm90IGluIFJFSkVDVC4gICovCitleHRlcm4gc2l6ZV90IHN0cmNzcG4gKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVqZWN0KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCBzZWdtZW50IG9mIFMgd2hpY2gKKyAgIGNvbnNpc3RzIGVudGlyZWx5IG9mIGNoYXJhY3RlcnMgaW4gQUNDRVBULiAgKi8KK2V4dGVybiBzaXplX3Qgc3Ryc3BuIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiBTIG9mIGFueSBjaGFyYWN0ZXIgaW4gQUNDRVBULiAgKi8KKyNpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9TVFJJTkdfSF9QUk9UTworZXh0ZXJuICJDKysiCit7CitleHRlcm4gY2hhciAqc3RycGJyayAoY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fYWNjZXB0KQorICAgICBfX1RIUk9XIF9fYXNtICgic3RycGJyayIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gX19jb25zdCBjaGFyICpzdHJwYnJrIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkKKyAgICAgX19USFJPVyBfX2FzbSAoInN0cnBicmsiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworCisjIGlmZGVmIF9fT1BUSU1JWkVfXworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK3N0cnBicmsgKGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX3N0cnBicmsgKF9fcywgX19hY2NlcHQpOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fY29uc3QgY2hhciAqCitzdHJwYnJrIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX3N0cnBicmsgKF9fcywgX19hY2NlcHQpOworfQorIyBlbmRpZgorfQorI2Vsc2UKK2V4dGVybiBjaGFyICpzdHJwYnJrIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworI2VuZGlmCisvKiBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIE5FRURMRSBpbiBIQVlTVEFDSy4gICovCisjaWZkZWYgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HX0hfUFJPVE8KK2V4dGVybiAiQysrIgoreworZXh0ZXJuIGNoYXIgKnN0cnN0ciAoY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFyICpfX25lZWRsZSkKKyAgICAgX19USFJPVyBfX2FzbSAoInN0cnN0ciIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gX19jb25zdCBjaGFyICpzdHJzdHIgKF9fY29uc3QgY2hhciAqX19oYXlzdGFjaywKKwkJCSAgICAgX19jb25zdCBjaGFyICpfX25lZWRsZSkKKyAgICAgX19USFJPVyBfX2FzbSAoInN0cnN0ciIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisKKyMgaWZkZWYgX19PUFRJTUlaRV9fCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorc3Ryc3RyIChjaGFyICpfX2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKSBfX1RIUk9XCit7CisgIHJldHVybiBfX2J1aWx0aW5fc3Ryc3RyIChfX2hheXN0YWNrLCBfX25lZWRsZSk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX19jb25zdCBjaGFyICoKK3N0cnN0ciAoX19jb25zdCBjaGFyICpfX2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKSBfX1RIUk9XCit7CisgIHJldHVybiBfX2J1aWx0aW5fc3Ryc3RyIChfX2hheXN0YWNrLCBfX25lZWRsZSk7Cit9CisjIGVuZGlmCit9CisjZWxzZQorZXh0ZXJuIGNoYXIgKnN0cnN0ciAoX19jb25zdCBjaGFyICpfX2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisjZW5kaWYKKworCisvKiBEaXZpZGUgUyBpbnRvIHRva2VucyBzZXBhcmF0ZWQgYnkgY2hhcmFjdGVycyBpbiBERUxJTS4gICovCitleHRlcm4gY2hhciAqc3RydG9rIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGVsaW0pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworX19FTkRfTkFNRVNQQUNFX1NURAorCisvKiBEaXZpZGUgUyBpbnRvIHRva2VucyBzZXBhcmF0ZWQgYnkgY2hhcmFjdGVycyBpbiBERUxJTS4gIEluZm9ybWF0aW9uCisgICBwYXNzZWQgYmV0d2VlbiBjYWxscyBhcmUgc3RvcmVkIGluIFNBVkVfUFRSLiAgKi8KK2V4dGVybiBjaGFyICpfX3N0cnRva19yIChjaGFyICpfX3Jlc3RyaWN0IF9fcywKKwkJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19kZWxpbSwKKwkJCSBjaGFyICoqX19yZXN0cmljdCBfX3NhdmVfcHRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworZXh0ZXJuIGNoYXIgKnN0cnRva19yIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGVsaW0sCisJCSAgICAgICBjaGFyICoqX19yZXN0cmljdCBfX3NhdmVfcHRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBTaW1pbGFyIHRvIGBzdHJzdHInIGJ1dCB0aGlzIGZ1bmN0aW9uIGlnbm9yZXMgdGhlIGNhc2Ugb2YgYm90aCBzdHJpbmdzLiAgKi8KKyMgaWZkZWYgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HX0hfUFJPVE8KK2V4dGVybiAiQysrIiBjaGFyICpzdHJjYXNlc3RyIChjaGFyICpfX2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKQorICAgICBfX1RIUk9XIF9fYXNtICgic3RyY2FzZXN0ciIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gIkMrKyIgX19jb25zdCBjaGFyICpzdHJjYXNlc3RyIChfX2NvbnN0IGNoYXIgKl9faGF5c3RhY2ssCisJCQkJICAgICAgIF9fY29uc3QgY2hhciAqX19uZWVkbGUpCisgICAgIF9fVEhST1cgX19hc20gKCJzdHJjYXNlc3RyIikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZWxzZQorZXh0ZXJuIGNoYXIgKnN0cmNhc2VzdHIgKF9fY29uc3QgY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFyICpfX25lZWRsZSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgTkVFRExFIGluIEhBWVNUQUNLLgorICAgTkVFRExFIGlzIE5FRURMRUxFTiBieXRlcyBsb25nOworICAgSEFZU1RBQ0sgaXMgSEFZU1RBQ0tMRU4gYnl0ZXMgbG9uZy4gICovCitleHRlcm4gdm9pZCAqbWVtbWVtIChfX2NvbnN0IHZvaWQgKl9faGF5c3RhY2ssIHNpemVfdCBfX2hheXN0YWNrbGVuLAorCQkgICAgIF9fY29uc3Qgdm9pZCAqX19uZWVkbGUsIHNpemVfdCBfX25lZWRsZWxlbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMykpOworCisvKiBDb3B5IE4gYnl0ZXMgb2YgU1JDIHRvIERFU1QsIHJldHVybiBwb2ludGVyIHRvIGJ5dGVzIGFmdGVyIHRoZQorICAgbGFzdCB3cml0dGVuIGJ5dGUuICAqLworZXh0ZXJuIHZvaWQgKl9fbWVtcGNweSAodm9pZCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQlfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworZXh0ZXJuIHZvaWQgKm1lbXBjcHkgKHZvaWQgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkgICAgICBfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworI2VuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiBTLiAgKi8KK2V4dGVybiBzaXplX3Qgc3RybGVuIChfX2NvbnN0IGNoYXIgKl9fcykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYJX19VU0VfWE9QRU4ySzgKKy8qIEZpbmQgdGhlIGxlbmd0aCBvZiBTVFJJTkcsIGJ1dCBzY2FuIGF0IG1vc3QgTUFYTEVOIGNoYXJhY3RlcnMuCisgICBJZiBubyAnXDAnIHRlcm1pbmF0b3IgaXMgZm91bmQgaW4gdGhhdCBtYW55IGNoYXJhY3RlcnMsIHJldHVybiBNQVhMRU4uICAqLworZXh0ZXJuIHNpemVfdCBzdHJubGVuIChfX2NvbnN0IGNoYXIgKl9fc3RyaW5nLCBzaXplX3QgX19tYXhsZW4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIG1lYW5pbmcgb2YgdGhlIGBlcnJubycgY29kZSBpbiBFUlJOVU0uICAqLworZXh0ZXJuIGNoYXIgKnN0cmVycm9yIChpbnQgX19lcnJudW0pIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTjJLIHx8IGRlZmluZWQgX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb24gb2YgYHN0cmVycm9yJy4KKyAgIFRoZXJlIGFyZSAyIGZsYXZvcnMgb2YgYHN0cmVycm9yX3InLCBHTlUgd2hpY2ggcmV0dXJucyB0aGUgc3RyaW5nCisgICBhbmQgbWF5IG9yIG1heSBub3QgdXNlIHRoZSBzdXBwbGllZCB0ZW1wb3JhcnkgYnVmZmVyIGFuZCBQT1NJWCBvbmUKKyAgIHdoaWNoIGZpbGxzIHRoZSBzdHJpbmcgaW50byB0aGUgYnVmZmVyLgorICAgVG8gdXNlIHRoZSBQT1NJWCB2ZXJzaW9uLCAtRF9YT1BFTl9TT1VSQ0U9NjAwIG9yIC1EX1BPU0lYX0NfU09VUkNFPTIwMDExMkwKKyAgIHdpdGhvdXQgLURfR05VX1NPVVJDRSBpcyBuZWVkZWQsIG90aGVyd2lzZSB0aGUgR05VIHZlcnNpb24gaXMKKyAgIHByZWZlcnJlZC4gICovCisjIGlmIGRlZmluZWQgX19VU0VfWE9QRU4ySyAmJiAhZGVmaW5lZCBfX1VTRV9HTlUKKy8qIEZpbGwgQlVGIHdpdGggYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbWVhbmluZyBvZiB0aGUgYGVycm5vJyBjb2RlIGluCisgICBFUlJOVU0uICAqLworIyAgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHN0cmVycm9yX3IsCisJCQkgICAoaW50IF9fZXJybnVtLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSwKKwkJCSAgIF9feHBnX3N0cmVycm9yX3IpIF9fbm9ubnVsbCAoKDIpKTsKKyMgIGVsc2UKK2V4dGVybiBpbnQgX194cGdfc3RyZXJyb3JfciAoaW50IF9fZXJybnVtLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyMgICBkZWZpbmUgc3RyZXJyb3JfciBfX3hwZ19zdHJlcnJvcl9yCisjICBlbmRpZgorIyBlbHNlCisvKiBJZiBhIHRlbXBvcmFyeSBidWZmZXIgaXMgcmVxdWlyZWQsIGF0IG1vc3QgQlVGTEVOIGJ5dGVzIG9mIEJVRiB3aWxsIGJlCisgICB1c2VkLiAgKi8KK2V4dGVybiBjaGFyICpzdHJlcnJvcl9yIChpbnQgX19lcnJudW0sIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogVHJhbnNsYXRlIGVycm9yIG51bWJlciB0byBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGUgTC4gICovCitleHRlcm4gY2hhciAqc3RyZXJyb3JfbCAoaW50IF9fZXJybnVtLCBfX2xvY2FsZV90IF9fbCkgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIFdlIGRlZmluZSB0aGlzIGZ1bmN0aW9uIGFsd2F5cyBzaW5jZSBgYnplcm8nIGlzIHNvbWV0aW1lcyBuZWVkZWQgd2hlbgorICAgdGhlIG5hbWVzcGFjZSBydWxlcyBkb2VzIG5vdCBhbGxvdyB0aGlzLiAgKi8KK2V4dGVybiB2b2lkIF9fYnplcm8gKHZvaWQgKl9fcywgc2l6ZV90IF9fbikgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIENvcHkgTiBieXRlcyBvZiBTUkMgdG8gREVTVCAobGlrZSBtZW1tb3ZlLCBidXQgYXJncyByZXZlcnNlZCkuICAqLworZXh0ZXJuIHZvaWQgYmNvcHkgKF9fY29uc3Qgdm9pZCAqX19zcmMsIHZvaWQgKl9fZGVzdCwgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCBOIGJ5dGVzIG9mIFMgdG8gMC4gICovCitleHRlcm4gdm9pZCBiemVybyAodm9pZCAqX19zLCBzaXplX3QgX19uKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogQ29tcGFyZSBOIGJ5dGVzIG9mIFMxIGFuZCBTMiAoc2FtZSBhcyBtZW1jbXApLiAgKi8KK2V4dGVybiBpbnQgYmNtcCAoX19jb25zdCB2b2lkICpfX3MxLCBfX2NvbnN0IHZvaWQgKl9fczIsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBDIGluIFMgKHNhbWUgYXMgc3RyY2hyKS4gICovCisjIGlmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR19IX1BST1RPCitleHRlcm4gIkMrKyIKK3sKK2V4dGVybiBjaGFyICppbmRleCAoY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXNtICgiaW5kZXgiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworZXh0ZXJuIF9fY29uc3QgY2hhciAqaW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXNtICgiaW5kZXgiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworCisjICBpZiBkZWZpbmVkIF9fT1BUSU1JWkVfXyAmJiAhZGVmaW5lZCBfX0NPUlJFQ1RfSVNPX0NQUF9TVFJJTkdTX0hfUFJPVE8KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgY2hhciAqCitpbmRleCAoY2hhciAqX19zLCBpbnQgX19jKSBfX1RIUk9XCit7CisgIHJldHVybiBfX2J1aWx0aW5faW5kZXggKF9fcywgX19jKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX2NvbnN0IGNoYXIgKgoraW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKSBfX1RIUk9XCit7CisgIHJldHVybiBfX2J1aWx0aW5faW5kZXggKF9fcywgX19jKTsKK30KKyMgIGVuZGlmCit9CisjIGVsc2UKK2V4dGVybiBjaGFyICppbmRleCAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKKyMgZW5kaWYKKworLyogRmluZCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIEMgaW4gUyAoc2FtZSBhcyBzdHJyY2hyKS4gICovCisjIGlmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR19IX1BST1RPCitleHRlcm4gIkMrKyIKK3sKK2V4dGVybiBjaGFyICpyaW5kZXggKGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2FzbSAoInJpbmRleCIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gX19jb25zdCBjaGFyICpyaW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXNtICgicmluZGV4IikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKKworIyAgaWYgZGVmaW5lZCBfX09QVElNSVpFX18gJiYgIWRlZmluZWQgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HU19IX1BST1RPCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorcmluZGV4IChjaGFyICpfX3MsIGludCBfX2MpIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9yaW5kZXggKF9fcywgX19jKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX2NvbnN0IGNoYXIgKgorcmluZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX3JpbmRleCAoX19zLCBfX2MpOworfQorI2VuZGlmCit9CisjIGVsc2UKK2V4dGVybiBjaGFyICpyaW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjIGVuZGlmCisKKy8qIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJpdCBzZXQgaW4gSSwgb3IgMCBpZiBub25lIGFyZSBzZXQuCisgICBUaGUgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IGlzIHBvc2l0aW9uIDEsIHRoZSBtb3N0LXNpZ25pZmljYW50IDMyLiAgKi8KK2V4dGVybiBpbnQgZmZzIChpbnQgX19pKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworLyogVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBub24tc3RhbmRhcmQgYnV0IG5lY2Vzc2FyeSBmb3Igbm9uLTMyIGJpdAorICAgcGxhdGZvcm1zLiAgKi8KKyMgaWZkZWYJX19VU0VfR05VCitleHRlcm4gaW50IGZmc2wgKGxvbmcgaW50IF9fbCkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisjICBpZmRlZiBfX0dOVUNfXworX19leHRlbnNpb25fXyBleHRlcm4gaW50IGZmc2xsIChsb25nIGxvbmcgaW50IF9fbGwpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworIyAgZW5kaWYKKyMgZW5kaWYKKworLyogQ29tcGFyZSBTMSBhbmQgUzIsIGlnbm9yaW5nIGNhc2UuICAqLworZXh0ZXJuIGludCBzdHJjYXNlY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworCisvKiBDb21wYXJlIG5vIG1vcmUgdGhhbiBOIGNoYXJzIG9mIFMxIGFuZCBTMiwgaWdub3JpbmcgY2FzZS4gICovCitleHRlcm4gaW50IHN0cm5jYXNlY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworI2VuZGlmIC8qIFVzZSBCU0QuICAqLworCisjaWZkZWYJX19VU0VfR05VCisvKiBBZ2FpbiB2ZXJzaW9ucyBvZiBhIGZldyBmdW5jdGlvbnMgd2hpY2ggdXNlIHRoZSBnaXZlbiBsb2NhbGUgaW5zdGVhZAorICAgb2YgdGhlIGdsb2JhbCBvbmUuICAqLworZXh0ZXJuIGludCBzdHJjYXNlY21wX2wgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLAorCQkJIF9fbG9jYWxlX3QgX19sb2MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIsIDMpKTsKKworZXh0ZXJuIGludCBzdHJuY2FzZWNtcF9sIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwKKwkJCSAgc2l6ZV90IF9fbiwgX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMiwgNCkpOworI2VuZGlmCisKKyNpZmRlZglfX1VTRV9CU0QKKy8qIFJldHVybiB0aGUgbmV4dCBERUxJTS1kZWxpbWl0ZWQgdG9rZW4gZnJvbSAqU1RSSU5HUCwKKyAgIHRlcm1pbmF0aW5nIGl0IHdpdGggYSAnXDAnLCBhbmQgdXBkYXRlICpTVFJJTkdQIHRvIHBvaW50IHBhc3QgaXQuICAqLworZXh0ZXJuIGNoYXIgKnN0cnNlcCAoY2hhciAqKl9fcmVzdHJpY3QgX19zdHJpbmdwLAorCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfWE9QRU4ySzgKKy8qIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBtZWFuaW5nIG9mIHRoZSBzaWduYWwgbnVtYmVyIGluIFNJRy4gICovCitleHRlcm4gY2hhciAqc3Ryc2lnbmFsIChpbnQgX19zaWcpIF9fVEhST1c7CisKKy8qIENvcHkgU1JDIHRvIERFU1QsIHJldHVybmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgdGVybWluYXRpbmcgJ1wwJyBpbiBERVNULiAgKi8KK2V4dGVybiBjaGFyICpfX3N0cGNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gY2hhciAqc3RwY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogQ29weSBubyBtb3JlIHRoYW4gTiBjaGFyYWN0ZXJzIG9mIFNSQyB0byBERVNULCByZXR1cm5pbmcgdGhlIGFkZHJlc3Mgb2YKKyAgIHRoZSBsYXN0IGNoYXJhY3RlciB3cml0dGVuIGludG8gREVTVC4gICovCitleHRlcm4gY2hhciAqX19zdHBuY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gY2hhciAqc3RwbmNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsCisJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjZW5kaWYKKworI2lmZGVmCV9fVVNFX0dOVQorLyogQ29tcGFyZSBTMSBhbmQgUzIgYXMgc3RyaW5ncyBob2xkaW5nIG5hbWUgJiBpbmRpY2VzL3ZlcnNpb24gbnVtYmVycy4gICovCitleHRlcm4gaW50IHN0cnZlcnNjbXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNhdXRlZSBTVFJJTkcgYnJpc2tseS4gICovCitleHRlcm4gY2hhciAqc3RyZnJ5IChjaGFyICpfX3N0cmluZykgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEZyb2JuaWNhdGUgTiBieXRlcyBvZiBTLiAgKi8KK2V4dGVybiB2b2lkICptZW1mcm9iICh2b2lkICpfX3MsIHNpemVfdCBfX24pIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjIGlmbmRlZiBiYXNlbmFtZQorLyogUmV0dXJuIHRoZSBmaWxlIG5hbWUgd2l0aGluIGRpcmVjdG9yeSBvZiBGSUxFTkFNRS4gIFdlIGRvbid0CisgICBkZWNsYXJlIHRoZSBmdW5jdGlvbiBpZiB0aGUgYGJhc2VuYW1lJyBtYWNybyBpcyBhdmFpbGFibGUgKGRlZmluZWQKKyAgIGluIDxsaWJnZW4uaD4pIHdoaWNoIG1ha2VzIHRoZSBYUEcgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uCisgICBhdmFpbGFibGUuICAqLworIyAgaWZkZWYgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HX0hfUFJPVE8KK2V4dGVybiAiQysrIiBjaGFyICpiYXNlbmFtZSAoY2hhciAqX19maWxlbmFtZSkKKyAgICAgX19USFJPVyBfX2FzbSAoImJhc2VuYW1lIikgX19ub25udWxsICgoMSkpOworZXh0ZXJuICJDKysiIF9fY29uc3QgY2hhciAqYmFzZW5hbWUgKF9fY29uc3QgY2hhciAqX19maWxlbmFtZSkKKyAgICAgX19USFJPVyBfX2FzbSAoImJhc2VuYW1lIikgX19ub25udWxsICgoMSkpOworIyAgZWxzZQorZXh0ZXJuIGNoYXIgKmJhc2VuYW1lIChfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKyMgaWYgZGVmaW5lZCBfX09QVElNSVpFX18gJiYgIWRlZmluZWQgX19PUFRJTUlaRV9TSVpFX18gXAorICAgICAmJiAhZGVmaW5lZCBfX05PX0lOTElORV9fICYmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisvKiBXaGVuIHVzaW5nIEdOVSBDQyB3ZSBwcm92aWRlIHNvbWUgb3B0aW1pemVkIHZlcnNpb25zIG9mIHNlbGVjdGVkCisgICBmdW5jdGlvbnMgZnJvbSB0aGlzIGhlYWRlci4gIFRoZXJlIGFyZSB0d28ga2luZHMgb2Ygb3B0aW1pemF0aW9uczoKKworICAgLSBtYWNoaW5lLWRlcGVuZGVudCBvcHRpbWl6YXRpb25zLCBtb3N0IHByb2JhYmx5IHVzaW5nIGlubGluZQorICAgICBhc3NlbWJsZXIgY29kZTsgdGhlc2UgbWlnaHQgYmUgcXVpdGUgZXhwZW5zaXZlIHNpbmNlIHRoZSBjb2RlCisgICAgIHNpemUgY2FuIGluY3JlYXNlIHNpZ25pZmljYW50bHkuCisgICAgIFRoZXNlIG9wdGltaXphdGlvbnMgYXJlIG5vdCB1c2VkIHVubGVzcyB0aGUgc3ltYm9sCisJX19VU0VfU1RSSU5HX0lOTElORVMKKyAgICAgaXMgZGVmaW5lZCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyLgorCisgICAtIG1hY2hpbmUtaW5kZXBlbmRlbnQgb3B0aW1pemF0aW9ucyB3aGljaCBkbyBub3QgaW5jcmVhc2UgdGhlCisgICAgIGNvZGUgc2l6ZSBzaWduaWZpY2FudGx5IGFuZCB3aGljaCBvcHRpbWl6ZSBtYWlubHkgc2l0dWF0aW9ucworICAgICB3aGVyZSBvbmUgb3IgbW9yZSBhcmd1bWVudHMgYXJlIGNvbXBpbGUtdGltZSBjb25zdGFudHMuCisgICAgIFRoZXNlIG9wdGltaXphdGlvbnMgYXJlIHVzZWQgYWx3YXlzIHdoZW4gdGhlIGNvbXBpbGVyIGlzCisgICAgIHRhdWdodCB0byBvcHRpbWl6ZS4KKworICAgT25lIGNhbiBpbmhpYml0IGFsbCBvcHRpbWl6YXRpb25zIGJ5IGRlZmluaW5nIF9fTk9fU1RSSU5HX0lOTElORVMuICAqLworCisvKiBHZXQgdGhlIG1hY2hpbmUtZGVwZW5kZW50IG9wdGltaXphdGlvbnMgKGlmIGFueSkuICAqLworIyAgaW5jbHVkZSA8Yml0cy9zdHJpbmcuaD4KKworLyogVGhlc2UgYXJlIGdlbmVyaWMgb3B0aW1pemF0aW9ucyB3aGljaCBkbyBub3QgYWRkIHRvbyBtdWNoIGlubGluZSBjb2RlLiAgKi8KKyMgIGluY2x1ZGUgPGJpdHMvc3RyaW5nMi5oPgorIyBlbmRpZgorCisjIGlmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZQorLyogRnVuY3Rpb25zIHdpdGggc2VjdXJpdHkgY2hlY2tzLiAgKi8KKyMgIGluY2x1ZGUgPGJpdHMvc3RyaW5nMy5oPgorIyBlbmRpZgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzdHJpbmcuaCAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RyaW5ncy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zdHJpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiODNjYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RyaW5ncy5oCkBAIC0wLDAgKzEsMTQyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsMTk5MiwxOTk2LDE5OTcsMTk5OSwyMDAwLDIwMDEsMjAwOSwyMDEwCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1RSSU5HU19ICisjZGVmaW5lCV9TVFJJTkdTX0gJMQorCisvKiBXZSBkb24ndCBuZWVkIGFuZCBzaG91bGQgbm90IHJlYWQgdGhpcyBmaWxlIGlmIDxzdHJpbmcuaD4gd2FzIGFscmVhZHkKKyAgIHJlYWQuIFRoZSBvbmUgZXhjZXB0aW9uIGJlaW5nIHRoYXQgaWYgX19VU0VfQlNEIGlzbid0IGRlZmluZWQsIHRoZW4KKyAgIHRoZXNlIGFyZW4ndCBkZWZpbmVkIGluIHN0cmluZy5oLCBzbyB3ZSBuZWVkIHRvIGRlZmluZSB0aGVtIGhlcmUuICAqLworI2lmICFkZWZpbmVkIF9TVFJJTkdfSCB8fCAhZGVmaW5lZCBfX1VTRV9CU0QKKworIyBpbmNsdWRlIDxmZWF0dXJlcy5oPgorIyBkZWZpbmUgX19uZWVkX3NpemVfdAorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogVGVsbCB0aGUgY2FsbGVyIHRoYXQgd2UgcHJvdmlkZSBjb3JyZWN0IEMrKyBwcm90b3R5cGVzLiAgKi8KKyMgaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiBfX0dOVUNfUFJFUkVRICg0LCA0KQorIyAgZGVmaW5lIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR1NfSF9QUk9UTworIyBlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8ICFkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisvKiBDb21wYXJlIE4gYnl0ZXMgb2YgUzEgYW5kIFMyIChzYW1lIGFzIG1lbWNtcCkuICAqLworZXh0ZXJuIGludCBiY21wIChfX2NvbnN0IHZvaWQgKl9fczEsIF9fY29uc3Qgdm9pZCAqX19zMiwgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisKKy8qIENvcHkgTiBieXRlcyBvZiBTUkMgdG8gREVTVCAobGlrZSBtZW1tb3ZlLCBidXQgYXJncyByZXZlcnNlZCkuICAqLworZXh0ZXJuIHZvaWQgYmNvcHkgKF9fY29uc3Qgdm9pZCAqX19zcmMsIHZvaWQgKl9fZGVzdCwgc2l6ZV90IF9fbikgX19USFJPVzsKKworLyogU2V0IE4gYnl0ZXMgb2YgUyB0byAwLiAgKi8KK2V4dGVybiB2b2lkIGJ6ZXJvICh2b2lkICpfX3MsIHNpemVfdCBfX24pIF9fVEhST1c7CisKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQyBpbiBTIChzYW1lIGFzIHN0cmNocikuICAqLworIyAgaWZkZWYgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HU19IX1BST1RPCitleHRlcm4gIkMrKyIKK3sKK2V4dGVybiBjaGFyICppbmRleCAoY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXNtICgiaW5kZXgiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworZXh0ZXJuIF9fY29uc3QgY2hhciAqaW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXNtICgiaW5kZXgiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworCisjICAgaWYgZGVmaW5lZCBfX09QVElNSVpFX18gJiYgIWRlZmluZWQgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HX0hfUFJPVE8KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgY2hhciAqCitpbmRleCAoY2hhciAqX19zLCBpbnQgX19jKSBfX1RIUk9XCit7CisgIHJldHVybiBfX2J1aWx0aW5faW5kZXggKF9fcywgX19jKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX2NvbnN0IGNoYXIgKgoraW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKSBfX1RIUk9XCit7CisgIHJldHVybiBfX2J1aWx0aW5faW5kZXggKF9fcywgX19jKTsKK30KKyMgICBlbmRpZgorfQorIyAgZWxzZQorZXh0ZXJuIGNoYXIgKmluZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworIyAgZW5kaWYKKworLyogRmluZCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIEMgaW4gUyAoc2FtZSBhcyBzdHJyY2hyKS4gICovCisjICBpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9TVFJJTkdTX0hfUFJPVE8KK2V4dGVybiAiQysrIgoreworZXh0ZXJuIGNoYXIgKnJpbmRleCAoY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXNtICgicmluZGV4IikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBfX2NvbnN0IGNoYXIgKnJpbmRleCAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hc20gKCJyaW5kZXgiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworCisjICAgaWYgZGVmaW5lZCBfX09QVElNSVpFX18gJiYgIWRlZmluZWQgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HX0hfUFJPVE8KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgY2hhciAqCityaW5kZXggKGNoYXIgKl9fcywgaW50IF9fYykgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX3JpbmRleCAoX19zLCBfX2MpOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fY29uc3QgY2hhciAqCityaW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKSBfX1RIUk9XCit7CisgIHJldHVybiBfX2J1aWx0aW5fcmluZGV4IChfX3MsIF9fYyk7Cit9CisjICAgZW5kaWYKK30KKyMgIGVsc2UKK2V4dGVybiBjaGFyICpyaW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjICBlbmRpZgorIyBlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8ICFkZWZpbmVkIF9fVVNFX1hPUEVOMks4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzhYU0kKKy8qIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJpdCBzZXQgaW4gSSwgb3IgMCBpZiBub25lIGFyZSBzZXQuCisgICBUaGUgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IGlzIHBvc2l0aW9uIDEsIHRoZSBtb3N0LXNpZ25pZmljYW50IDMyLiAgKi8KK2V4dGVybiBpbnQgZmZzIChpbnQgX19pKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChjb25zdCkpOworI2VuZGlmCisKKy8qIENvbXBhcmUgUzEgYW5kIFMyLCBpZ25vcmluZyBjYXNlLiAgKi8KK2V4dGVybiBpbnQgc3RyY2FzZWNtcCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworCisvKiBDb21wYXJlIG5vIG1vcmUgdGhhbiBOIGNoYXJzIG9mIFMxIGFuZCBTMiwgaWdub3JpbmcgY2FzZS4gICovCitleHRlcm4gaW50IHN0cm5jYXNlY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisKKyNpZmRlZglfX1VTRV9YT1BFTjJLOAorLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGJvdGggYWJvdmUgYnV0IHRoZXkKKyAgIHRha2UgdGhlIGxvY2FsZSB0aGV5IHVzZSBmb3IgdGhlIGNvbGxhdGlvbiBhcyBhbiBleHRyYSBhcmd1bWVudC4KKyAgIFRoaXMgaXMgbm90IHN0YW5kYXJkc2l6ZWQgYnV0IHNvbWV0aGluZyBsaWtlIHdpbGwgY29tZS4gICovCisjIGluY2x1ZGUgPHhsb2NhbGUuaD4KKworLyogQWdhaW4gdmVyc2lvbnMgb2YgYSBmZXcgZnVuY3Rpb25zIHdoaWNoIHVzZSB0aGUgZ2l2ZW4gbG9jYWxlIGluc3RlYWQKKyAgIG9mIHRoZSBnbG9iYWwgb25lLiAgKi8KK2V4dGVybiBpbnQgc3RyY2FzZWNtcF9sIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwKKwkJCSBfX2xvY2FsZV90IF9fbG9jKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyLCAzKSk7CisKK2V4dGVybiBpbnQgc3RybmNhc2VjbXBfbCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsCisJCQkgIHNpemVfdCBfX24sIF9fbG9jYWxlX3QgX19sb2MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIsIDQpKTsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3RyaW5nLmggICovCisKKyNlbmRpZgkvKiBzdHJpbmdzLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N0cm9wdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3Ryb3B0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MmMwOWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N0cm9wdHMuaApAQCAtMCwwICsxLDkyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NUUk9QVFNfSAorI2RlZmluZSBfU1RST1BUU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMveHRpdHlwZXMuaD4KKworI2lmbmRlZiBfX2dpZF90X2RlZmluZWQKK3R5cGVkZWYgX19naWRfdCBnaWRfdDsKKyMgZGVmaW5lIF9fZ2lkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX191aWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fdWlkX3QgdWlkX3Q7CisjIGRlZmluZSBfX3VpZF90X2RlZmluZWQKKyNlbmRpZgorCit0eXBlZGVmIF9fdF91c2NhbGFyX3QgdF91c2NhbGFyX3Q7CisKKy8qIEdldCBzeXN0ZW0gc3BlY2lmaWMgY29udGFudHMuICAqLworI2luY2x1ZGUgPGJpdHMvc3Ryb3B0cy5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogVGVzdCB3aGV0aGVyIEZJTERFUyBpcyBhc3NvY2lhdGVkIHdpdGggYSBTVFJFQU0tYmFzZWQgZmlsZS4gICovCitleHRlcm4gaW50IGlzYXN0cmVhbSAoaW50IF9fZmlsZGVzKSBfX1RIUk9XOworCisvKiBSZWNlaXZlIG5leHQgbWVzc2FnZSBmcm9tIGEgU1RSRUFNUyBmaWxlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0bXNnIChpbnQgX19maWxkZXMsIHN0cnVjdCBzdHJidWYgKl9fcmVzdHJpY3QgX19jdGxwdHIsCisJCSAgIHN0cnVjdCBzdHJidWYgKl9fcmVzdHJpY3QgX19kYXRhcHRyLAorCQkgICBpbnQgKl9fcmVzdHJpY3QgX19mbGFnc3ApOworCisvKiBSZWNlaXZlIG5leHQgbWVzc2FnZSBmcm9tIGEgU1RSRUFNUyBmaWxlLCB3aXRoICpGTEFHU1AgYWxsb3dpbmcgdG8KKyAgIGNvbnRyb2wgd2hpY2ggbWVzc2FnZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGdldHBtc2cgKGludCBfX2ZpbGRlcywgc3RydWN0IHN0cmJ1ZiAqX19yZXN0cmljdCBfX2N0bHB0ciwKKwkJICAgIHN0cnVjdCBzdHJidWYgKl9fcmVzdHJpY3QgX19kYXRhcHRyLAorCQkgICAgaW50ICpfX3Jlc3RyaWN0IF9fYmFuZHAsIGludCAqX19yZXN0cmljdCBfX2ZsYWdzcCk7CisKKy8qIFBlcmZvcm0gdGhlIEkvTyBjb250cm9sIG9wZXJhdGlvbiBzcGVjaWZpZWQgYnkgUkVRVUVTVCBvbiBGRC4KKyAgIE9uZSBhcmd1bWVudCBtYXkgZm9sbG93OyBpdHMgcHJlc2VuY2UgYW5kIHR5cGUgZGVwZW5kIG9uIFJFUVVFU1QuCisgICBSZXR1cm4gdmFsdWUgZGVwZW5kcyBvbiBSRVFVRVNULiAgVXN1YWxseSAtMSBpbmRpY2F0ZXMgZXJyb3IuICAqLworZXh0ZXJuIGludCBpb2N0bCAoaW50IF9fZmQsIHVuc2lnbmVkIGxvbmcgaW50IF9fcmVxdWVzdCwgLi4uKSBfX1RIUk9XOworCisvKiBTZW5kIGEgbWVzc2FnZSBvbiBhIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHB1dG1zZyAoaW50IF9fZmlsZGVzLCBfX2NvbnN0IHN0cnVjdCBzdHJidWYgKl9fY3RscHRyLAorCQkgICBfX2NvbnN0IHN0cnVjdCBzdHJidWYgKl9fZGF0YXB0ciwgaW50IF9fZmxhZ3MpOworCisvKiBTZW5kIGEgbWVzc2FnZSBvbiBhIFNUUkVBTSB0byB0aGUgQkFORC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHB1dHBtc2cgKGludCBfX2ZpbGRlcywgX19jb25zdCBzdHJ1Y3Qgc3RyYnVmICpfX2N0bHB0ciwKKwkJICAgIF9fY29uc3Qgc3RydWN0IHN0cmJ1ZiAqX19kYXRhcHRyLCBpbnQgX19iYW5kLCBpbnQgX19mbGFncyk7CisKKy8qIEF0dGFjaCBhIFNUUkVBTVMtYmFzZWQgZmlsZSBkZXNjcmlwdG9yIEZJTERFUyB0byBhIGZpbGUgUEFUSCBpbiB0aGUKKyAgIGZpbGUgc3lzdGVtIG5hbWUgc3BhY2UuICAqLworZXh0ZXJuIGludCBmYXR0YWNoIChpbnQgX19maWxkZXMsIF9fY29uc3QgY2hhciAqX19wYXRoKSBfX1RIUk9XOworCisvKiBEZXRhY2ggYSBuYW1lIFBBVEggZnJvbSBhIFNUUkVBTVMtYmFzZWQgZmlsZSBkZXNjcmlwdG9yLiAgKi8KK2V4dGVybiBpbnQgZmRldGFjaCAoX19jb25zdCBjaGFyICpfX3BhdGgpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzdHJvcHRzLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2FjbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvYWNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzNDdlMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2FjbC5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICBGaWxlOiBzeXMvYWNsLmgKKworICAoQykgMTk5OSBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgIHRoZSBHTlUKKyAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyovCisKKyNpZm5kZWYgX19TWVNfQUNMX0gKKyNkZWZpbmUgX19TWVNfQUNMX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qPT09IERhdGEgdHlwZXMgPT09Ki8KKworc3RydWN0IF9fYWNsX2V4dDsKK3N0cnVjdCBfX2FjbF9lbnRyeV9leHQ7CitzdHJ1Y3QgX19hY2xfcGVybXNldF9leHQ7CisKK3R5cGVkZWYgdW5zaWduZWQgaW50CQlhY2xfdHlwZV90OwordHlwZWRlZiBpbnQJCQlhY2xfdGFnX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJYWNsX3Blcm1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgX19hY2xfZXh0CSphY2xfdDsKK3R5cGVkZWYgc3RydWN0IF9fYWNsX2VudHJ5X2V4dAkqYWNsX2VudHJ5X3Q7Cit0eXBlZGVmIHN0cnVjdCBfX2FjbF9wZXJtc2V0X2V4dCAqYWNsX3Blcm1zZXRfdDsKKworLyo9PT0gQ29uc3RhbnRzID09PSovCisKKy8qIDIzLjIuMiBhY2xfcGVybV90IHZhbHVlcyAqLworCisjZGVmaW5lIEFDTF9SRUFECQkoMHgwNCkKKyNkZWZpbmUgQUNMX1dSSVRFCQkoMHgwMikKKyNkZWZpbmUgQUNMX0VYRUNVVEUJCSgweDAxKQorLy8jZGVmaW5lIEFDTF9BREQJCSgweDA4KQorLy8jZGVmaW5lIEFDTF9ERUxFVEUJCSgweDEwKQorCisvKiAyMy4yLjUgYWNsX3RhZ190IHZhbHVlcyAqLworCisjZGVmaW5lIEFDTF9VTkRFRklORURfVEFHCSgweDAwKQorI2RlZmluZSBBQ0xfVVNFUl9PQkoJCSgweDAxKQorI2RlZmluZSBBQ0xfVVNFUgkJKDB4MDIpCisjZGVmaW5lIEFDTF9HUk9VUF9PQkoJCSgweDA0KQorI2RlZmluZSBBQ0xfR1JPVVAJCSgweDA4KQorI2RlZmluZSBBQ0xfTUFTSwkJKDB4MTApCisjZGVmaW5lIEFDTF9PVEhFUgkJKDB4MjApCisKKy8qIDIzLjMuNiBhY2xfdHlwZV90IHZhbHVlcyAqLworCisjZGVmaW5lIEFDTF9UWVBFX0FDQ0VTUwkJKDB4ODAwMCkKKyNkZWZpbmUgQUNMX1RZUEVfREVGQVVMVAkoMHg0MDAwKQorCisvKiAyMy4yLjcgQUNMIHF1YWxpZmllciBjb25zdGFudHMgKi8KKworI2RlZmluZSBBQ0xfVU5ERUZJTkVEX0lECSgoaWRfdCktMSkKKworLyogMjMuMi44IEFDTCBFbnRyeSBDb25zdGFudHMgKi8KKworI2RlZmluZSBBQ0xfRklSU1RfRU5UUlkJCTAKKyNkZWZpbmUgQUNMX05FWFRfRU5UUlkJCTEKKworLyo9PT0gQUNMIG1hbmlwdWxhdGlvbiA9PT0qLworCitleHRlcm4gYWNsX3QgYWNsX2luaXQoaW50IGNvdW50KTsKK2V4dGVybiBhY2xfdCBhY2xfZHVwKGFjbF90IGFjbCk7CitleHRlcm4gaW50IGFjbF9mcmVlKHZvaWQgKm9ial9wKTsKK2V4dGVybiBpbnQgYWNsX3ZhbGlkKGFjbF90IGFjbCk7CisKKy8qPT09IEVudHJ5IG1hbmlwdWxhdGlvbiA9PT0qLworCitleHRlcm4gaW50CithY2xfY29weV9lbnRyeShhY2xfZW50cnlfdCBkZXN0X2QsIGFjbF9lbnRyeV90IHNyY19kKTsKK2V4dGVybiBpbnQgYWNsX2NyZWF0ZV9lbnRyeShhY2xfdCAqYWNsX3AsIGFjbF9lbnRyeV90ICplbnRyeV9wKTsKK2V4dGVybiBpbnQgYWNsX2RlbGV0ZV9lbnRyeShhY2xfdCBhY2wsIGFjbF9lbnRyeV90IGVudHJ5X2QpOworZXh0ZXJuIGludCBhY2xfZ2V0X2VudHJ5KGFjbF90IGFjbCwgaW50IGVudHJ5X2lkLCBhY2xfZW50cnlfdCAqZW50cnlfcCk7CisKKy8qIE1hbmlwdWxhdGUgQUNMIGVudHJ5IHBlcm1pc3Npb25zICovCisKK2V4dGVybiBpbnQgYWNsX2FkZF9wZXJtKGFjbF9wZXJtc2V0X3QgcGVybXNldF9kLCBhY2xfcGVybV90IHBlcm0pOworZXh0ZXJuIGludCBhY2xfY2FsY19tYXNrKGFjbF90ICphY2xfcCk7CitleHRlcm4gaW50IGFjbF9jbGVhcl9wZXJtcyhhY2xfcGVybXNldF90IHBlcm1zZXRfZCk7CitleHRlcm4gaW50IGFjbF9kZWxldGVfcGVybShhY2xfcGVybXNldF90IHBlcm1zZXRfZCwgYWNsX3Blcm1fdCBwZXJtKTsKK2V4dGVybiBpbnQgYWNsX2dldF9wZXJtc2V0KGFjbF9lbnRyeV90IGVudHJ5X2QsIGFjbF9wZXJtc2V0X3QgKnBlcm1zZXRfcCk7CitleHRlcm4gaW50IGFjbF9zZXRfcGVybXNldChhY2xfZW50cnlfdCBlbnRyeV9kLCBhY2xfcGVybXNldF90IHBlcm1zZXRfZCk7CisKKy8qIE1hbmlwdWxhdGUgQUNMIGVudHJ5IHRhZyB0eXBlIGFuZCBxdWFsaWZpZXIgKi8KKworZXh0ZXJuIHZvaWQgKiBhY2xfZ2V0X3F1YWxpZmllcihhY2xfZW50cnlfdCBlbnRyeV9kKTsKK2V4dGVybiBpbnQgYWNsX2dldF90YWdfdHlwZShhY2xfZW50cnlfdCBlbnRyeV9kLCBhY2xfdGFnX3QgKnRhZ190eXBlX3ApOworZXh0ZXJuIGludCBhY2xfc2V0X3F1YWxpZmllcihhY2xfZW50cnlfdCBlbnRyeV9kLCBjb25zdCB2b2lkICp0YWdfcXVhbGlmaWVyX3ApOworZXh0ZXJuIGludCBhY2xfc2V0X3RhZ190eXBlKGFjbF9lbnRyeV90IGVudHJ5X2QsIGFjbF90YWdfdCB0YWdfdHlwZSk7CisKKy8qPT09IEZvcm1hdCB0cmFuc2xhdGlvbiA9PT0qLworCitleHRlcm4gc3NpemVfdCBhY2xfY29weV9leHQodm9pZCAqYnVmX3AsIGFjbF90IGFjbCwgc3NpemVfdCBzaXplKTsKK2V4dGVybiBhY2xfdCBhY2xfY29weV9pbnQoY29uc3Qgdm9pZCAqYnVmX3ApOworZXh0ZXJuIGFjbF90IGFjbF9mcm9tX3RleHQoY29uc3QgY2hhciAqYnVmX3ApOworZXh0ZXJuIHNzaXplX3QgYWNsX3NpemUoYWNsX3QgYWNsKTsKK2V4dGVybiBjaGFyICphY2xfdG9fdGV4dChhY2xfdCBhY2wsIHNzaXplX3QgKmxlbl9wKTsKKworLyo9PT0gT2JqZWN0IG1hbmlwdWxhdGlvbiA9PT0qLworCitleHRlcm4gaW50IGFjbF9kZWxldGVfZGVmX2ZpbGUoY29uc3QgY2hhciAqcGF0aF9wKTsKK2V4dGVybiBhY2xfdCBhY2xfZ2V0X2ZkKGludCBmZCk7CitleHRlcm4gYWNsX3QgYWNsX2dldF9maWxlKGNvbnN0IGNoYXIgKnBhdGhfcCwgYWNsX3R5cGVfdCB0eXBlKTsKK2V4dGVybiBpbnQgYWNsX3NldF9mZChpbnQgZmQsIGFjbF90IGFjbCk7CitleHRlcm4gaW50IGFjbF9zZXRfZmlsZShjb25zdCBjaGFyICpwYXRoX3AsIGFjbF90eXBlX3QgdHlwZSwgYWNsX3QgYWNsKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvKiBfX1NZU19BQ0xfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9hc291bmRsaWIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2Fzb3VuZGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZjU4N2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9hc291bmRsaWIuaApAQCAtMCwwICsxLDIgQEAKKyN3YXJuaW5nIFRoaXMgaGVhZGVyIGlzIGRlcHJlY2F0ZWQsIHVzZSA8YWxzYS9hc291bmRsaWIuaD4gaW5zdGVhZC4KKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvY2FwYWJpbGl0eS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvY2FwYWJpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNTRhY2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9jYXBhYmlsaXR5LmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiA8c3lzL2NhcGFiaWxpdHkuaD4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgICBBbGVwaCBPbmUKKyAqIENvcHlyaWdodCAoQykgMTk5Ny04LDIwMDggQW5kcmV3IEcuIE1vcmdhbiA8bW9yZ2FuQGtlcm5lbC5vcmc+CisgKgorICogZGVmdW5jdCBQT1NJWC4xZSBTdGFuZGFyZDogMjUuMiBDYXBhYmlsaXRpZXMgICAgICAgICAgIDxzeXMvY2FwYWJpbGl0eS5oPgorICovCisKKyNpZm5kZWYgX1NZU19DQVBBQklMSVRZX0gKKyNkZWZpbmUgX1NZU19DQVBBQklMSVRZX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogVGhpcyBmaWxlIGNvbXBsZW1lbnRzIHRoZSBrZXJuZWwgZmlsZSBieSBwcm92aWRpbmcgcHJvdG90eXBlCisgKiBpbmZvcm1hdGlvbiBmb3IgdGhlIHVzZXIgbGlicmFyeS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIFJlcXVpcmVkIHRvIGxpbWl0IHdoYXQgZ2V0cyBkZWZpbmVkIGluIHRoZSBrZXJuZWwgaGVhZGVyIGZpbGUuCisgKi8KKyNpZm5kZWYgX191c2VyCisjZGVmaW5lIF9fdXNlcgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorCisvKgorICogUE9TSVggY2FwYWJpbGl0eSB0eXBlcworICovCisKKy8qCisgKiBPcGFxdWUgY2FwYWJpbGl0eSBoYW5kbGUgKGRlZmluZWQgaW50ZXJuYWxseSBieSBsaWJjYXApCisgKiBpbnRlcm5hbCBjYXBhYmlsaXR5IHJlcHJlc2VudGF0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9jYXBfc3RydWN0ICpjYXBfdDsKKworLyogImV4dGVybmFsIiBjYXBhYmlsaXR5IHJlcHJlc2VudGF0aW9uIGlzIGEgKHZvaWQgKikgKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIHR5cGUgdXNlZCB0byBpZGVudGlmeSBjYXBhYmlsaXRpZXMKKyAqLworCit0eXBlZGVmIGludCBjYXBfdmFsdWVfdDsKKworLyoKKyAqIFNldCBpZGVudGlmaWVycworICovCit0eXBlZGVmIGVudW0geworICAgIENBUF9FRkZFQ1RJVkU9MCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIGVmZmVjdGl2ZSBmbGFnICovCisgICAgQ0FQX1BFUk1JVFRFRD0xLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgcGVybWl0dGVkIGZsYWcgKi8KKyAgICBDQVBfSU5IRVJJVEFCTEU9MiAgICAgICAgICAgICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgaW5oZXJpdGFibGUgZmxhZyAqLworfSBjYXBfZmxhZ190OworCisvKgorICogVGhlc2UgYXJlIHRoZSBzdGF0ZXMgYXZhaWxhYmxlIHRvIGVhY2ggY2FwYWJpbGl0eQorICovCit0eXBlZGVmIGVudW0geworICAgIENBUF9DTEVBUj0wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZmxhZyBpcyBjbGVhcmVkL2Rpc2FibGVkICovCisgICAgQ0FQX1NFVD0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZsYWcgaXMgc2V0L2VuYWJsZWQgKi8KK30gY2FwX2ZsYWdfdmFsdWVfdDsKKworLyoKKyAqIFVzZXItc3BhY2UgY2FwYWJpbGl0eSBtYW5pcHVsYXRpb24gcm91dGluZXMKKyAqLworCisvKiBsaWJjYXAvY2FwX2FsbG9jLmMgKi8KK2V4dGVybiBjYXBfdCAgIGNhcF9kdXAoY2FwX3QpOworZXh0ZXJuIGludCAgICAgY2FwX2ZyZWUodm9pZCAqKTsKK2V4dGVybiBjYXBfdCAgIGNhcF9pbml0KHZvaWQpOworCisvKiBsaWJjYXAvY2FwX2ZsYWcuYyAqLworZXh0ZXJuIGludCAgICAgY2FwX2dldF9mbGFnKGNhcF90LCBjYXBfdmFsdWVfdCwgY2FwX2ZsYWdfdCwgY2FwX2ZsYWdfdmFsdWVfdCAqKTsKK2V4dGVybiBpbnQgICAgIGNhcF9zZXRfZmxhZyhjYXBfdCwgY2FwX2ZsYWdfdCwgaW50LCBjb25zdCBjYXBfdmFsdWVfdCAqLAorCQkJICAgIGNhcF9mbGFnX3ZhbHVlX3QpOworZXh0ZXJuIGludCAgICAgY2FwX2NsZWFyKGNhcF90KTsKK2V4dGVybiBpbnQgICAgIGNhcF9jbGVhcl9mbGFnKGNhcF90LCBjYXBfZmxhZ190KTsKKworLyogbGliY2FwL2NhcF9maWxlLmMgKi8KK2V4dGVybiBjYXBfdCAgIGNhcF9nZXRfZmQoaW50KTsKK2V4dGVybiBjYXBfdCAgIGNhcF9nZXRfZmlsZShjb25zdCBjaGFyICopOworZXh0ZXJuIGludCAgICAgY2FwX3NldF9mZChpbnQsIGNhcF90KTsKK2V4dGVybiBpbnQgICAgIGNhcF9zZXRfZmlsZShjb25zdCBjaGFyICosIGNhcF90KTsKKworLyogbGliY2FwL2NhcF9wcm9jLmMgKi8KK2V4dGVybiBjYXBfdCAgIGNhcF9nZXRfcHJvYyh2b2lkKTsKK2V4dGVybiBjYXBfdCAgIGNhcF9nZXRfcGlkKHBpZF90KTsKK2V4dGVybiBpbnQgICAgIGNhcF9zZXRfcHJvYyhjYXBfdCk7CisKK2V4dGVybiBpbnQgICAgIGNhcF9nZXRfYm91bmQoY2FwX3ZhbHVlX3QpOworZXh0ZXJuIGludCAgICAgY2FwX2Ryb3BfYm91bmQoY2FwX3ZhbHVlX3QpOworCisjZGVmaW5lIENBUF9JU19TVVBQT1JURUQoY2FwKSAgKGNhcF9nZXRfYm91bmQoY2FwKSA+PSAwKQorCisvKiBsaWJjYXAvY2FwX2V4dGludC5jICovCitleHRlcm4gc3NpemVfdCBjYXBfc2l6ZShjYXBfdCk7CitleHRlcm4gc3NpemVfdCBjYXBfY29weV9leHQodm9pZCAqLCBjYXBfdCwgc3NpemVfdCk7CitleHRlcm4gY2FwX3QgICBjYXBfY29weV9pbnQoY29uc3Qgdm9pZCAqKTsKKworLyogbGliY2FwL2NhcF90ZXh0LmMgKi8KK2V4dGVybiBjYXBfdCAgIGNhcF9mcm9tX3RleHQoY29uc3QgY2hhciAqKTsKK2V4dGVybiBjaGFyICogIGNhcF90b190ZXh0KGNhcF90LCBzc2l6ZV90ICopOworZXh0ZXJuIGludCAgICAgY2FwX2Zyb21fbmFtZShjb25zdCBjaGFyICosIGNhcF92YWx1ZV90ICopOworZXh0ZXJuIGNoYXIgKiAgY2FwX3RvX25hbWUoY2FwX3ZhbHVlX3QpOworCisjZGVmaW5lIENBUF9ESUZGRVJTKHJlc3VsdCwgZmxhZykgICgoKHJlc3VsdCkgJiAoMSA8PCAoZmxhZykpKSAhPSAwKQorZXh0ZXJuIGludCAgICAgY2FwX2NvbXBhcmUoY2FwX3QsIGNhcF90KTsKKworLyogc3lzdGVtIGNhbGxzIC0gbG9vayB0byBsaWJjIGZvciBmdW5jdGlvbiB0byBzeXN0ZW0gY2FsbCBtYXBwaW5nICovCitleHRlcm4gaW50IGNhcHNldChjYXBfdXNlcl9oZWFkZXJfdCBoZWFkZXIsIGNhcF91c2VyX2RhdGFfdCBkYXRhKTsKK2V4dGVybiBpbnQgY2FwZ2V0KGNhcF91c2VyX2hlYWRlcl90IGhlYWRlciwgY29uc3QgY2FwX3VzZXJfZGF0YV90IGRhdGEpOworCisvKiBkZXByZWNhdGVkIC0gdXNlIGNhcF9nZXRfcGlkKCkgKi8KK2V4dGVybiBpbnQgY2FwZ2V0cChwaWRfdCBwaWQsIGNhcF90IGNhcF9kKTsKKworLyogbm90IHZhbGlkIHdpdGggZmlsZXN5c3RlbSBjYXBhYmlsaXR5IHN1cHBvcnQgLSB1c2UgY2FwX3NldF9wcm9jKCkgKi8KK2V4dGVybiBpbnQgY2Fwc2V0cChwaWRfdCBwaWQsIGNhcF90IGNhcF9kKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9TWVNfQ0FQQUJJTElUWV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N5c2NhbGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzY2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMzA1NzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N5c2NhbGwuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzZXhpdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzZXhpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzI0NmI2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXNleGl0cy5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg3LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXN5c2V4aXRzLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZglfU1lTRVhJVFNfSAorI2RlZmluZQlfU1lTRVhJVFNfSCAxCisKKy8qCisgKiAgU1lTRVhJVFMuSCAtLSBFeGl0IHN0YXR1cyBjb2RlcyBmb3Igc3lzdGVtIHByb2dyYW1zLgorICoKKyAqCVRoaXMgaW5jbHVkZSBmaWxlIGF0dGVtcHRzIHRvIGNhdGVnb3JpemUgcG9zc2libGUgZXJyb3IKKyAqCWV4aXQgc3RhdHVzZXMgZm9yIHN5c3RlbSBwcm9ncmFtcywgbm90YWJseSBkZWxpdmVybWFpbAorICoJYW5kIHRoZSBCZXJrZWxleSBuZXR3b3JrLgorICoKKyAqCUVycm9yIG51bWJlcnMgYmVnaW4gYXQgRVhfX0JBU0UgdG8gcmVkdWNlIHRoZSBwb3NzaWJpbGl0eSBvZgorICoJY2xhc2hpbmcgd2l0aCBvdGhlciBleGl0IHN0YXR1c2VzIHRoYXQgcmFuZG9tIHByb2dyYW1zIG1heQorICoJYWxyZWFkeSByZXR1cm4uICBUaGUgbWVhbmluZyBvZiB0aGUgY29kZXMgaXMgYXBwcm94aW1hdGVseQorICoJYXMgZm9sbG93czoKKyAqCisgKglFWF9VU0FHRSAtLSBUaGUgY29tbWFuZCB3YXMgdXNlZCBpbmNvcnJlY3RseSwgZS5nLiwgd2l0aAorICoJCXRoZSB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLCBhIGJhZCBmbGFnLCBhIGJhZAorICoJCXN5bnRheCBpbiBhIHBhcmFtZXRlciwgb3Igd2hhdGV2ZXIuCisgKglFWF9EQVRBRVJSIC0tIFRoZSBpbnB1dCBkYXRhIHdhcyBpbmNvcnJlY3QgaW4gc29tZSB3YXkuCisgKgkJVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciB1c2VyJ3MgZGF0YSAmIG5vdAorICoJCXN5c3RlbSBmaWxlcy4KKyAqCUVYX05PSU5QVVQgLS0gQW4gaW5wdXQgZmlsZSAobm90IGEgc3lzdGVtIGZpbGUpIGRpZCBub3QKKyAqCQlleGlzdCBvciB3YXMgbm90IHJlYWRhYmxlLiAgVGhpcyBjb3VsZCBhbHNvIGluY2x1ZGUKKyAqCQllcnJvcnMgbGlrZSAiTm8gbWVzc2FnZSIgdG8gYSBtYWlsZXIgKGlmIGl0IGNhcmVkCisgKgkJdG8gY2F0Y2ggaXQpLgorICoJRVhfTk9VU0VSIC0tIFRoZSB1c2VyIHNwZWNpZmllZCBkaWQgbm90IGV4aXN0LiAgVGhpcyBtaWdodAorICoJCWJlIHVzZWQgZm9yIG1haWwgYWRkcmVzc2VzIG9yIHJlbW90ZSBsb2dpbnMuCisgKglFWF9OT0hPU1QgLS0gVGhlIGhvc3Qgc3BlY2lmaWVkIGRpZCBub3QgZXhpc3QuICBUaGlzIGlzIHVzZWQKKyAqCQlpbiBtYWlsIGFkZHJlc3NlcyBvciBuZXR3b3JrIHJlcXVlc3RzLgorICoJRVhfVU5BVkFJTEFCTEUgLS0gQSBzZXJ2aWNlIGlzIHVuYXZhaWxhYmxlLiAgVGhpcyBjYW4gb2NjdXIKKyAqCQlpZiBhIHN1cHBvcnQgcHJvZ3JhbSBvciBmaWxlIGRvZXMgbm90IGV4aXN0LiAgVGhpcworICoJCWNhbiBhbHNvIGJlIHVzZWQgYXMgYSBjYXRjaGFsbCBtZXNzYWdlIHdoZW4gc29tZXRoaW5nCisgKgkJeW91IHdhbnRlZCB0byBkbyBkb2Vzbid0IHdvcmssIGJ1dCB5b3UgZG9uJ3Qga25vdworICoJCXdoeS4KKyAqCUVYX1NPRlRXQVJFIC0tIEFuIGludGVybmFsIHNvZnR3YXJlIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkLgorICoJCVRoaXMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gbm9uLW9wZXJhdGluZyBzeXN0ZW0gcmVsYXRlZAorICoJCWVycm9ycyBhcyBwb3NzaWJsZS4KKyAqCUVYX09TRVJSIC0tIEFuIG9wZXJhdGluZyBzeXN0ZW0gZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQuCisgKgkJVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBzdWNoIHRoaW5ncyBhcyAiY2Fubm90CisgKgkJZm9yayIsICJjYW5ub3QgY3JlYXRlIHBpcGUiLCBvciB0aGUgbGlrZS4gIEl0IGluY2x1ZGVzCisgKgkJdGhpbmdzIGxpa2UgZ2V0dWlkIHJldHVybmluZyBhIHVzZXIgdGhhdCBkb2VzIG5vdAorICoJCWV4aXN0IGluIHRoZSBwYXNzd2QgZmlsZS4KKyAqCUVYX09TRklMRSAtLSBTb21lIHN5c3RlbSBmaWxlIChlLmcuLCAvZXRjL3Bhc3N3ZCwgL2V0Yy91dG1wLAorICoJCWV0Yy4pIGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgYmUgb3BlbmVkLCBvciBoYXMgc29tZQorICoJCXNvcnQgb2YgZXJyb3IgKGUuZy4sIHN5bnRheCBlcnJvcikuCisgKglFWF9DQU5UQ1JFQVQgLS0gQSAodXNlciBzcGVjaWZpZWQpIG91dHB1dCBmaWxlIGNhbm5vdCBiZQorICoJCWNyZWF0ZWQuCisgKglFWF9JT0VSUiAtLSBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBkb2luZyBJL08gb24gc29tZSBmaWxlLgorICoJRVhfVEVNUEZBSUwgLS0gdGVtcG9yYXJ5IGZhaWx1cmUsIGluZGljYXRpbmcgc29tZXRoaW5nIHRoYXQKKyAqCQlpcyBub3QgcmVhbGx5IGFuIGVycm9yLiAgSW4gc2VuZG1haWwsIHRoaXMgbWVhbnMKKyAqCQl0aGF0IGEgbWFpbGVyIChlLmcuKSBjb3VsZCBub3QgY3JlYXRlIGEgY29ubmVjdGlvbiwKKyAqCQlhbmQgdGhlIHJlcXVlc3Qgc2hvdWxkIGJlIHJlYXR0ZW1wdGVkIGxhdGVyLgorICoJRVhfUFJPVE9DT0wgLS0gdGhlIHJlbW90ZSBzeXN0ZW0gcmV0dXJuZWQgc29tZXRoaW5nIHRoYXQKKyAqCQl3YXMgIm5vdCBwb3NzaWJsZSIgZHVyaW5nIGEgcHJvdG9jb2wgZXhjaGFuZ2UuCisgKglFWF9OT1BFUk0gLS0gWW91IGRpZCBub3QgaGF2ZSBzdWZmaWNpZW50IHBlcm1pc3Npb24gdG8KKyAqCQlwZXJmb3JtIHRoZSBvcGVyYXRpb24uICBUaGlzIGlzIG5vdCBpbnRlbmRlZCBmb3IKKyAqCQlmaWxlIHN5c3RlbSBwcm9ibGVtcywgd2hpY2ggc2hvdWxkIHVzZSBOT0lOUFVUIG9yCisgKgkJQ0FOVENSRUFULCBidXQgcmF0aGVyIGZvciBoaWdoZXIgbGV2ZWwgcGVybWlzc2lvbnMuCisgKi8KKworI2RlZmluZSBFWF9PSwkJMAkvKiBzdWNjZXNzZnVsIHRlcm1pbmF0aW9uICovCisKKyNkZWZpbmUgRVhfX0JBU0UJNjQJLyogYmFzZSB2YWx1ZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KKworI2RlZmluZSBFWF9VU0FHRQk2NAkvKiBjb21tYW5kIGxpbmUgdXNhZ2UgZXJyb3IgKi8KKyNkZWZpbmUgRVhfREFUQUVSUgk2NQkvKiBkYXRhIGZvcm1hdCBlcnJvciAqLworI2RlZmluZSBFWF9OT0lOUFVUCTY2CS8qIGNhbm5vdCBvcGVuIGlucHV0ICovCisjZGVmaW5lIEVYX05PVVNFUgk2NwkvKiBhZGRyZXNzZWUgdW5rbm93biAqLworI2RlZmluZSBFWF9OT0hPU1QJNjgJLyogaG9zdCBuYW1lIHVua25vd24gKi8KKyNkZWZpbmUgRVhfVU5BVkFJTEFCTEUJNjkJLyogc2VydmljZSB1bmF2YWlsYWJsZSAqLworI2RlZmluZSBFWF9TT0ZUV0FSRQk3MAkvKiBpbnRlcm5hbCBzb2Z0d2FyZSBlcnJvciAqLworI2RlZmluZSBFWF9PU0VSUgk3MQkvKiBzeXN0ZW0gZXJyb3IgKGUuZy4sIGNhbid0IGZvcmspICovCisjZGVmaW5lIEVYX09TRklMRQk3MgkvKiBjcml0aWNhbCBPUyBmaWxlIG1pc3NpbmcgKi8KKyNkZWZpbmUgRVhfQ0FOVENSRUFUCTczCS8qIGNhbid0IGNyZWF0ZSAodXNlcikgb3V0cHV0IGZpbGUgKi8KKyNkZWZpbmUgRVhfSU9FUlIJNzQJLyogaW5wdXQvb3V0cHV0IGVycm9yICovCisjZGVmaW5lIEVYX1RFTVBGQUlMCTc1CS8qIHRlbXAgZmFpbHVyZTsgdXNlciBpcyBpbnZpdGVkIHRvIHJldHJ5ICovCisjZGVmaW5lIEVYX1BST1RPQ09MCTc2CS8qIHJlbW90ZSBlcnJvciBpbiBwcm90b2NvbCAqLworI2RlZmluZSBFWF9OT1BFUk0JNzcJLyogcGVybWlzc2lvbiBkZW5pZWQgKi8KKyNkZWZpbmUgRVhfQ09ORklHCTc4CS8qIGNvbmZpZ3VyYXRpb24gZXJyb3IgKi8KKworI2RlZmluZSBFWF9fTUFYCTc4CS8qIG1heGltdW0gbGlzdGVkIHZhbHVlICovCisKKyNlbmRpZiAvKiBzeXNleGl0cy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3N5c2xvZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXNsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzBiNDkyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXNsb2cuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8c3lzL3N5c2xvZy5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS90YXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRmZWY3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGFyLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qIEV4dGVuZGVkIHRhciBmb3JtYXQgZnJvbSBQT1NJWC4xLgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBXcml0dGVuIGJ5IERhdmlkIEouIE1hY0tlbnppZS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1RBUl9ICisjZGVmaW5lCV9UQVJfSAkxCisKKy8qIEEgdGFyIGFyY2hpdmUgY29uc2lzdHMgb2YgNTEyLWJ5dGUgYmxvY2tzLgorICAgRWFjaCBmaWxlIGluIHRoZSBhcmNoaXZlIGhhcyBhIGhlYWRlciBibG9jayBmb2xsb3dlZCBieSAwKyBkYXRhIGJsb2Nrcy4KKyAgIFR3byBibG9ja3Mgb2YgTlVMIGJ5dGVzIGluZGljYXRlIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUuICAqLworCisvKiBUaGUgZmllbGRzIG9mIGhlYWRlciBibG9ja3M6CisgICBBbGwgc3RyaW5ncyBhcmUgc3RvcmVkIGFzIElTTyA2NDYgKGFwcHJveGltYXRlbHkgQVNDSUkpIHN0cmluZ3MuCisKKyAgIEZpZWxkcyBhcmUgbnVtZXJpYyB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkIGJlbG93OyBudW1iZXJzIGFyZSBJU08gNjQ2CisgICByZXByZXNlbnRhdGlvbnMgb2Ygb2N0YWwgbnVtYmVycywgd2l0aCBsZWFkaW5nIHplcm9zIGFzIG5lZWRlZC4KKworICAgbGlua25hbWUgaXMgb25seSB2YWxpZCB3aGVuIHR5cGVmbGFnPT1MTktUWVBFLiAgSXQgZG9lc24ndCB1c2UgcHJlZml4OworICAgZmlsZXMgdGhhdCBhcmUgbGlua3MgdG8gcGF0aG5hbWVzID4xMDAgY2hhcnMgbG9uZyBjYW4gbm90IGJlIHN0b3JlZAorICAgaW4gYSB0YXIgYXJjaGl2ZS4KKworICAgSWYgdHlwZWZsYWc9PXtMTktUWVBFLFNZTVRZUEUsRElSVFlQRX0gdGhlbiBzaXplIG11c3QgYmUgMC4KKworICAgZGV2bWFqb3IgYW5kIGRldm1pbm9yIGFyZSBvbmx5IHZhbGlkIGZvciB0eXBlZmxhZz09e0JMS1RZUEUsQ0hSVFlQRX0uCisKKyAgIGNoa3N1bSBjb250YWlucyB0aGUgc3VtIG9mIGFsbCA1MTIgYnl0ZXMgaW4gdGhlIGhlYWRlciBibG9jaywKKyAgIHRyZWF0aW5nIGVhY2ggYnl0ZSBhcyBhbiA4LWJpdCB1bnNpZ25lZCB2YWx1ZSBhbmQgdHJlYXRpbmcgdGhlCisgICA4IGJ5dGVzIG9mIGNoa3N1bSBhcyBibGFuayBjaGFyYWN0ZXJzLgorCisgICB1bmFtZSBhbmQgZ25hbWUgYXJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0byB1aWQgYW5kIGdpZCwgaWYgdGhvc2UKKyAgIG5hbWVzIGV4aXN0IGxvY2FsbHkuCisKKyAgIEZpZWxkIE5hbWUJQnl0ZSBPZmZzZXQJTGVuZ3RoIGluIEJ5dGVzCUZpZWxkIFR5cGUKKyAgIG5hbWUJCTAJCTEwMAkJTlVMLXRlcm1pbmF0ZWQgaWYgTlVMIGZpdHMKKyAgIG1vZGUJCTEwMAkJOAorICAgdWlkCQkxMDgJCTgKKyAgIGdpZAkJMTE2CQk4CisgICBzaXplCQkxMjQJCTEyCisgICBtdGltZQkxMzYJCTEyCisgICBjaGtzdW0JMTQ4CQk4CisgICB0eXBlZmxhZwkxNTYJCTEJCXNlZSBiZWxvdworICAgbGlua25hbWUJMTU3CQkxMDAJCU5VTC10ZXJtaW5hdGVkIGlmIE5VTCBmaXRzCisgICBtYWdpYwkyNTcJCTYJCW11c3QgYmUgVE1BR0lDIChOVUwgdGVybS4pCisgICB2ZXJzaW9uCTI2MwkJMgkJbXVzdCBiZSBUVkVSU0lPTgorICAgdW5hbWUJMjY1CQkzMgkJTlVMLXRlcm1pbmF0ZWQKKyAgIGduYW1lCTI5NwkJMzIJCU5VTC10ZXJtaW5hdGVkCisgICBkZXZtYWpvcgkzMjkJCTgKKyAgIGRldm1pbm9yCTMzNwkJOAorICAgcHJlZml4CTM0NQkJMTU1CQlOVUwtdGVybWluYXRlZCBpZiBOVUwgZml0cworCisgICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHByZWZpeCBpcyAnXDAnLCB0aGUgZmlsZSBuYW1lIGlzIG5hbWU7CisgICBvdGhlcndpc2UsIGl0IGlzIHByZWZpeC9uYW1lLiAgRmlsZXMgd2hvc2UgcGF0aG5hbWVzIGRvbid0IGZpdCBpbiB0aGF0CisgICBsZW5ndGggY2FuIG5vdCBiZSBzdG9yZWQgaW4gYSB0YXIgYXJjaGl2ZS4gICovCisKKy8qIFRoZSBiaXRzIGluIG1vZGU6ICovCisjZGVmaW5lIFRTVUlECTA0MDAwCisjZGVmaW5lIFRTR0lECTAyMDAwCisjZGVmaW5lIFRTVlRYCTAxMDAwCisjZGVmaW5lIFRVUkVBRAkwMDQwMAorI2RlZmluZSBUVVdSSVRFCTAwMjAwCisjZGVmaW5lIFRVRVhFQwkwMDEwMAorI2RlZmluZSBUR1JFQUQJMDAwNDAKKyNkZWZpbmUgVEdXUklURQkwMDAyMAorI2RlZmluZSBUR0VYRUMJMDAwMTAKKyNkZWZpbmUgVE9SRUFECTAwMDA0CisjZGVmaW5lIFRPV1JJVEUJMDAwMDIKKyNkZWZpbmUgVE9FWEVDCTAwMDAxCisKKy8qIFRoZSB2YWx1ZXMgZm9yIHR5cGVmbGFnOgorICAgVmFsdWVzICdBJy0nWicgYXJlIHJlc2VydmVkIGZvciBjdXN0b20gaW1wbGVtZW50YXRpb25zLgorICAgQWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBQT1NJWC4xIHJldmlzaW9ucy4gICovCisKKyNkZWZpbmUgUkVHVFlQRQkJJzAnCS8qIFJlZ3VsYXIgZmlsZSAocHJlZmVycmVkIGNvZGUpLiAgKi8KKyNkZWZpbmUgQVJFR1RZUEUJJ1wwJwkvKiBSZWd1bGFyIGZpbGUgKGFsdGVybmF0ZSBjb2RlKS4gICovCisjZGVmaW5lIExOS1RZUEUJCScxJwkvKiBIYXJkIGxpbmsuICAqLworI2RlZmluZSBTWU1UWVBFCQknMicJLyogU3ltYm9saWMgbGluayAoaGFyZCBpZiBub3Qgc3VwcG9ydGVkKS4gICovCisjZGVmaW5lIENIUlRZUEUJCSczJwkvKiBDaGFyYWN0ZXIgc3BlY2lhbC4gICovCisjZGVmaW5lIEJMS1RZUEUJCSc0JwkvKiBCbG9jayBzcGVjaWFsLiAgKi8KKyNkZWZpbmUgRElSVFlQRQkJJzUnCS8qIERpcmVjdG9yeS4gICovCisjZGVmaW5lIEZJRk9UWVBFCSc2JwkvKiBOYW1lZCBwaXBlLiAgKi8KKyNkZWZpbmUgQ09OVFRZUEUJJzcnCS8qIENvbnRpZ3VvdXMgZmlsZSAqLworIC8qIChyZWd1bGFyIGZpbGUgaWYgbm90IHN1cHBvcnRlZCkuICAqLworCisvKiBDb250ZW50cyBvZiBtYWdpYyBmaWVsZCBhbmQgaXRzIGxlbmd0aC4gICovCisjZGVmaW5lIFRNQUdJQwkidXN0YXIiCisjZGVmaW5lIFRNQUdMRU4JNgorCisvKiBDb250ZW50cyBvZiB0aGUgdmVyc2lvbiBmaWVsZCBhbmQgaXRzIGxlbmd0aC4gICovCisjZGVmaW5lIFRWRVJTSU9OCSIwMCIKKyNkZWZpbmUgVFZFUlNMRU4JMgorCisjZW5kaWYgLyogdGFyLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwNmQzOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybS5oCkBAIC0wLDAgKzEsODM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDksMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEF1dGhvcjogWmV5ZCBNLiBCZW4tSGFsaW0gPHptYmVuaGFsQG5ldGNvbS5jb20+IDE5OTIsMTk5NSAgICAgICAgICAgICAgICAqLworLyogICAgYW5kOiBFcmljIFMuIFJheW1vbmQgPGVzckBzbmFyay50aHlyc3VzLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBhbmQ6IFRob21hcyBFLiBEaWNrZXkgICAgICAgICAgICAgICAgICAgICAgICAxOTk1LW9uICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAkSWQ6IE1LdGVybS5oLmF3ay5pbix2IDEuNTggMjAxMC8wMS8wOSAxOTo1MzoyNiB0b20gRXhwICQgKi8KKworLyoKKyoqCXRlcm0uaCAtLSBEZWZpbml0aW9uIG9mIHN0cnVjdCB0ZXJtCisqLworCisjaWZuZGVmIE5DVVJTRVNfVEVSTV9IX2luY2wKKyNkZWZpbmUgTkNVUlNFU19URVJNX0hfaW5jbCAxCisKKyN1bmRlZiAgTkNVUlNFU19WRVJTSU9OCisjZGVmaW5lIE5DVVJTRVNfVkVSU0lPTiAiNS45IgorCisjaW5jbHVkZSA8bmN1cnNlc19kbGwuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBNYWtlIHRoaXMgZmlsZSBzZWxmLWNvbnRhaW5lZCBieSBwcm92aWRpbmcgZGVmYXVsdHMgZm9yIHRoZSBIQVZFX1RFUk1JT1tTXV9ICisgKiBkZWZpbml0aW9uIChiYXNlZCBvbiB0aGUgc3lzdGVtIGZvciB3aGljaCB0aGlzIHdhcyBjb25maWd1cmVkKS4KKyAqLworCisjdW5kZWYgIE5DVVJTRVNfQ09OU1QKKyNkZWZpbmUgTkNVUlNFU19DT05TVCBjb25zdAorCisjdW5kZWYgIE5DVVJTRVNfU0JPT0wKKyNkZWZpbmUgTkNVUlNFU19TQk9PTCBjaGFyCisKKyN1bmRlZiAgTkNVUlNFU19YTkFNRVMKKyNkZWZpbmUgTkNVUlNFU19YTkFNRVMgMQorCisvKiBXZSB3aWxsIHVzZSB0aGVzZSBzeW1ib2xzIHRvIGhpZGUgZGlmZmVyZW5jZXMgYmV0d2VlbgorICogdGVybWlvcy90ZXJtaW8vc2d0dHliIGludGVyZmFjZXMuCisgKi8KKyN1bmRlZiAgVFRZCisjdW5kZWYgIFNFVF9UVFkKKyN1bmRlZiAgR0VUX1RUWQorCisvKiBBc3N1bWUgUE9TSVggdGVybWlvIGlmIHdlIGhhdmUgdGhlIGhlYWRlciBhbmQgZnVuY3Rpb24gKi8KKy8qICNpZiBIQVZFX1RFUk1JT1NfSCAmJiBIQVZFX1RDR0VUQVRUUiAqLworI2lmIDEgJiYgMQorCisjdW5kZWYgIFRFUk1JT1MKKyNkZWZpbmUgVEVSTUlPUyAxCisKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjZGVmaW5lIFRUWSBzdHJ1Y3QgdGVybWlvcworCisjZWxzZSAvKiAhSEFWRV9URVJNSU9TX0ggKi8KKworLyogI2lmIEhBVkVfVEVSTUlPX0ggKi8KKyNpZiAxCisKKyN1bmRlZiAgVEVSTUlPUworI2RlZmluZSBURVJNSU9TIDEKKworI2luY2x1ZGUgPHRlcm1pby5oPgorI2RlZmluZSBUVFkgc3RydWN0IHRlcm1pbworCisvKiBBZGQgZGVmaW5pdGlvbnMgdG8gbWFrZSB0ZXJtaW8gbG9vayBsaWtlIHRlcm1pb3MuCisgKiBCdXQgaWZkZWYgaXQsIHNpbmNlIHRoZXJlIGFyZSBzb21lIGltcGxlbWVudGF0aW9ucworICogdGhhdCB0cnkgdG8gZG8gdGhpcyBmb3IgdXMgaW4gYSBmYWtlIDx0ZXJtaW8uaD4uCisgKi8KKyNpZm5kZWYgVENTQU5PVworI2RlZmluZSBUQ1NBTk9XIFRDU0VUQQorI2VuZGlmCisjaWZuZGVmIFRDU0FEUkFJTgorI2RlZmluZSBUQ1NBRFJBSU4gVENTRVRBVworI2VuZGlmCisjaWZuZGVmIFRDU0FGTFVTSAorI2RlZmluZSBUQ1NBRkxVU0ggVENTRVRBRgorI2VuZGlmCisjaWZuZGVmIHRjc2V0YXR0cgorI2RlZmluZSB0Y3NldGF0dHIoZmQsIGNtZCwgYXJnKSBpb2N0bChmZCwgY21kLCBhcmcpCisjZW5kaWYKKyNpZm5kZWYgdGNnZXRhdHRyCisjZGVmaW5lIHRjZ2V0YXR0cihmZCwgYXJnKSBpb2N0bChmZCwgVENHRVRBLCBhcmcpCisjZW5kaWYKKyNpZm5kZWYgY2ZnZXRvc3BlZWQKKyNkZWZpbmUgY2ZnZXRvc3BlZWQodCkgKCh0KS0+Y19jZmxhZyAmIENCQVVEKQorI2VuZGlmCisjaWZuZGVmIFRDSUZMVVNIIAorI2RlZmluZSBUQ0lGTFVTSCAwCisjZW5kaWYKKyNpZm5kZWYgVENPRkxVU0ggCisjZGVmaW5lIFRDT0ZMVVNIIDEKKyNlbmRpZgorI2lmbmRlZiBUQ0lPRkxVU0ggCisjZGVmaW5lIFRDSU9GTFVTSCAyCisjZW5kaWYKKyNpZm5kZWYgdGNmbHVzaAorI2RlZmluZSB0Y2ZsdXNoKGZkLCBhcmcpIGlvY3RsKGZkLCBUQ0ZMU0gsIGFyZykKKyNlbmRpZgorCisjZWxzZSAvKiAhSEFWRV9URVJNSU9fSCAqLworCisjaWYgX19NSU5HVzMyX18KKyMgIGluY2x1ZGUgPG5jdXJzZXNfbWluZ3cuaD4KKyMgIGRlZmluZSBUVFkgc3RydWN0IHRlcm1pb3MKKyNlbHNlCisjdW5kZWYgVEVSTUlPUworI2luY2x1ZGUgPHNndHR5Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZGVmaW5lIFRUWSBzdHJ1Y3Qgc2d0dHliCisjZW5kaWYgLyogTUlOR1czMiAqLworI2VuZGlmIC8qIEhBVkVfVEVSTUlPX0ggKi8KKworI2VuZGlmIC8qIEhBVkVfVEVSTUlPU19IICovCisKKyNpZmRlZiBURVJNSU9TCisjZGVmaW5lIEdFVF9UVFkoZmQsIGJ1ZikgdGNnZXRhdHRyKGZkLCBidWYpCisjZGVmaW5lIFNFVF9UVFkoZmQsIGJ1ZikgdGNzZXRhdHRyKGZkLCBUQ1NBRFJBSU4sIGJ1ZikKKyNlbHNlCisjZGVmaW5lIEdFVF9UVFkoZmQsIGJ1ZikgZ3R0eShmZCwgYnVmKQorI2RlZmluZSBTRVRfVFRZKGZkLCBidWYpIHN0dHkoZmQsIGJ1ZikKKyNlbmRpZgorCisjZGVmaW5lIE5BTUVTSVpFIDI1NgorCisjZGVmaW5lIENVUiBjdXJfdGVybS0+dHlwZS4KKworI2RlZmluZSBhdXRvX2xlZnRfbWFyZ2luICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzBdCisjZGVmaW5lIGF1dG9fcmlnaHRfbWFyZ2luICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMV0KKyNkZWZpbmUgbm9fZXNjX2N0bGMgICAgICAgICAgICAgICAgICAgIENVUiBCb29sZWFuc1syXQorI2RlZmluZSBjZW9sX3N0YW5kb3V0X2dsaXRjaCAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzNdCisjZGVmaW5lIGVhdF9uZXdsaW5lX2dsaXRjaCAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbNF0KKyNkZWZpbmUgZXJhc2Vfb3ZlcnN0cmlrZSAgICAgICAgICAgICAgIENVUiBCb29sZWFuc1s1XQorI2RlZmluZSBnZW5lcmljX3R5cGUgICAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzZdCisjZGVmaW5lIGhhcmRfY29weSAgICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbN10KKyNkZWZpbmUgaGFzX21ldGFfa2V5ICAgICAgICAgICAgICAgICAgIENVUiBCb29sZWFuc1s4XQorI2RlZmluZSBoYXNfc3RhdHVzX2xpbmUgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzldCisjZGVmaW5lIGluc2VydF9udWxsX2dsaXRjaCAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTBdCisjZGVmaW5lIG1lbW9yeV9hYm92ZSAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTFdCisjZGVmaW5lIG1lbW9yeV9iZWxvdyAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTJdCisjZGVmaW5lIG1vdmVfaW5zZXJ0X21vZGUgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTNdCisjZGVmaW5lIG1vdmVfc3RhbmRvdXRfbW9kZSAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTRdCisjZGVmaW5lIG92ZXJfc3RyaWtlICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTVdCisjZGVmaW5lIHN0YXR1c19saW5lX2VzY19vayAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTZdCisjZGVmaW5lIGRlc3RfdGFic19tYWdpY19zbXNvICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTddCisjZGVmaW5lIHRpbGRlX2dsaXRjaCAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMThdCisjZGVmaW5lIHRyYW5zcGFyZW50X3VuZGVybGluZSAgICAgICAgICBDVVIgQm9vbGVhbnNbMTldCisjZGVmaW5lIHhvbl94b2ZmICAgICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjBdCisjZGVmaW5lIG5lZWRzX3hvbl94b2ZmICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjFdCisjZGVmaW5lIHBydHJfc2lsZW50ICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjJdCisjZGVmaW5lIGhhcmRfY3Vyc29yICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjNdCisjZGVmaW5lIG5vbl9yZXZfcm1jdXAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjRdCisjZGVmaW5lIG5vX3BhZF9jaGFyICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjVdCisjZGVmaW5lIG5vbl9kZXN0X3Njcm9sbF9yZWdpb24gICAgICAgICBDVVIgQm9vbGVhbnNbMjZdCisjZGVmaW5lIGNhbl9jaGFuZ2UgICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjddCisjZGVmaW5lIGJhY2tfY29sb3JfZXJhc2UgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjhdCisjZGVmaW5lIGh1ZV9saWdodG5lc3Nfc2F0dXJhdGlvbiAgICAgICBDVVIgQm9vbGVhbnNbMjldCisjZGVmaW5lIGNvbF9hZGRyX2dsaXRjaCAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMzBdCisjZGVmaW5lIGNyX2NhbmNlbHNfbWljcm9fbW9kZSAgICAgICAgICBDVVIgQm9vbGVhbnNbMzFdCisjZGVmaW5lIGhhc19wcmludF93aGVlbCAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMzJdCisjZGVmaW5lIHJvd19hZGRyX2dsaXRjaCAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMzNdCisjZGVmaW5lIHNlbWlfYXV0b19yaWdodF9tYXJnaW4gICAgICAgICBDVVIgQm9vbGVhbnNbMzRdCisjZGVmaW5lIGNwaV9jaGFuZ2VzX3JlcyAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMzVdCisjZGVmaW5lIGxwaV9jaGFuZ2VzX3JlcyAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMzZdCisjZGVmaW5lIGNvbHVtbnMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1swXQorI2RlZmluZSBpbml0X3RhYnMgICAgICAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMV0KKyNkZWZpbmUgbGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzJdCisjZGVmaW5lIGxpbmVzX29mX21lbW9yeSAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1szXQorI2RlZmluZSBtYWdpY19jb29raWVfZ2xpdGNoICAgICAgICAgICAgQ1VSIE51bWJlcnNbNF0KKyNkZWZpbmUgcGFkZGluZ19iYXVkX3JhdGUgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzVdCisjZGVmaW5lIHZpcnR1YWxfdGVybWluYWwgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1s2XQorI2RlZmluZSB3aWR0aF9zdGF0dXNfbGluZSAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbN10KKyNkZWZpbmUgbnVtX2xhYmVscyAgICAgICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzhdCisjZGVmaW5lIGxhYmVsX2hlaWdodCAgICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1s5XQorI2RlZmluZSBsYWJlbF93aWR0aCAgICAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMTBdCisjZGVmaW5lIG1heF9hdHRyaWJ1dGVzICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1sxMV0KKyNkZWZpbmUgbWF4aW11bV93aW5kb3dzICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzEyXQorI2RlZmluZSBtYXhfY29sb3JzICAgICAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMTNdCisjZGVmaW5lIG1heF9wYWlycyAgICAgICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1sxNF0KKyNkZWZpbmUgbm9fY29sb3JfdmlkZW8gICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzE1XQorI2RlZmluZSBidWZmZXJfY2FwYWNpdHkgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMTZdCisjZGVmaW5lIGRvdF92ZXJ0X3NwYWNpbmcgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1sxN10KKyNkZWZpbmUgZG90X2hvcnpfc3BhY2luZyAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzE4XQorI2RlZmluZSBtYXhfbWljcm9fYWRkcmVzcyAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMTldCisjZGVmaW5lIG1heF9taWNyb19qdW1wICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1syMF0KKyNkZWZpbmUgbWljcm9fY29sX3NpemUgICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzIxXQorI2RlZmluZSBtaWNyb19saW5lX3NpemUgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMjJdCisjZGVmaW5lIG51bWJlcl9vZl9waW5zICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1syM10KKyNkZWZpbmUgb3V0cHV0X3Jlc19jaGFyICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzI0XQorI2RlZmluZSBvdXRwdXRfcmVzX2xpbmUgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMjVdCisjZGVmaW5lIG91dHB1dF9yZXNfaG9yel9pbmNoICAgICAgICAgICBDVVIgTnVtYmVyc1syNl0KKyNkZWZpbmUgb3V0cHV0X3Jlc192ZXJ0X2luY2ggICAgICAgICAgIENVUiBOdW1iZXJzWzI3XQorI2RlZmluZSBwcmludF9yYXRlICAgICAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMjhdCisjZGVmaW5lIHdpZGVfY2hhcl9zaXplICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1syOV0KKyNkZWZpbmUgYnV0dG9ucyAgICAgICAgICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzMwXQorI2RlZmluZSBiaXRfaW1hZ2VfZW50d2luaW5nICAgICAgICAgICAgQ1VSIE51bWJlcnNbMzFdCisjZGVmaW5lIGJpdF9pbWFnZV90eXBlICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1szMl0KKyNkZWZpbmUgYmFja190YWIgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzBdCisjZGVmaW5lIGJlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxXQorI2RlZmluZSBjYXJyaWFnZV9yZXR1cm4gICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMl0KKyNkZWZpbmUgY2hhbmdlX3Njcm9sbF9yZWdpb24gICAgICAgICAgIENVUiBTdHJpbmdzWzNdCisjZGVmaW5lIGNsZWFyX2FsbF90YWJzICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0XQorI2RlZmluZSBjbGVhcl9zY3JlZW4gICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNV0KKyNkZWZpbmUgY2xyX2VvbCAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzZdCisjZGVmaW5lIGNscl9lb3MgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s3XQorI2RlZmluZSBjb2x1bW5fYWRkcmVzcyAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbOF0KKyNkZWZpbmUgY29tbWFuZF9jaGFyYWN0ZXIgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzldCisjZGVmaW5lIGN1cnNvcl9hZGRyZXNzICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMF0KKyNkZWZpbmUgY3Vyc29yX2Rvd24gICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzExXQorI2RlZmluZSBjdXJzb3JfaG9tZSAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTJdCisjZGVmaW5lIGN1cnNvcl9pbnZpc2libGUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxM10KKyNkZWZpbmUgY3Vyc29yX2xlZnQgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzE0XQorI2RlZmluZSBjdXJzb3JfbWVtX2FkZHJlc3MgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTVdCisjZGVmaW5lIGN1cnNvcl9ub3JtYWwgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNl0KKyNkZWZpbmUgY3Vyc29yX3JpZ2h0ICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzE3XQorI2RlZmluZSBjdXJzb3JfdG9fbGwgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMThdCisjZGVmaW5lIGN1cnNvcl91cCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOV0KKyNkZWZpbmUgY3Vyc29yX3Zpc2libGUgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzIwXQorI2RlZmluZSBkZWxldGVfY2hhcmFjdGVyICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjFdCisjZGVmaW5lIGRlbGV0ZV9saW5lICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMl0KKyNkZWZpbmUgZGlzX3N0YXR1c19saW5lICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzIzXQorI2RlZmluZSBkb3duX2hhbGZfbGluZSAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjRdCisjZGVmaW5lIGVudGVyX2FsdF9jaGFyc2V0X21vZGUgICAgICAgICBDVVIgU3RyaW5nc1syNV0KKyNkZWZpbmUgZW50ZXJfYmxpbmtfbW9kZSAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzI2XQorI2RlZmluZSBlbnRlcl9ib2xkX21vZGUgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjddCisjZGVmaW5lIGVudGVyX2NhX21vZGUgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOF0KKyNkZWZpbmUgZW50ZXJfZGVsZXRlX21vZGUgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzI5XQorI2RlZmluZSBlbnRlcl9kaW1fbW9kZSAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzBdCisjZGVmaW5lIGVudGVyX2luc2VydF9tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMV0KKyNkZWZpbmUgZW50ZXJfc2VjdXJlX21vZGUgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzMyXQorI2RlZmluZSBlbnRlcl9wcm90ZWN0ZWRfbW9kZSAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzNdCisjZGVmaW5lIGVudGVyX3JldmVyc2VfbW9kZSAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNF0KKyNkZWZpbmUgZW50ZXJfc3RhbmRvdXRfbW9kZSAgICAgICAgICAgIENVUiBTdHJpbmdzWzM1XQorI2RlZmluZSBlbnRlcl91bmRlcmxpbmVfbW9kZSAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzZdCisjZGVmaW5lIGVyYXNlX2NoYXJzICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szN10KKyNkZWZpbmUgZXhpdF9hbHRfY2hhcnNldF9tb2RlICAgICAgICAgIENVUiBTdHJpbmdzWzM4XQorI2RlZmluZSBleGl0X2F0dHJpYnV0ZV9tb2RlICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzldCisjZGVmaW5lIGV4aXRfY2FfbW9kZSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MF0KKyNkZWZpbmUgZXhpdF9kZWxldGVfbW9kZSAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzQxXQorI2RlZmluZSBleGl0X2luc2VydF9tb2RlICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDJdCisjZGVmaW5lIGV4aXRfc3RhbmRvdXRfbW9kZSAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0M10KKyNkZWZpbmUgZXhpdF91bmRlcmxpbmVfbW9kZSAgICAgICAgICAgIENVUiBTdHJpbmdzWzQ0XQorI2RlZmluZSBmbGFzaF9zY3JlZW4gICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDVdCisjZGVmaW5lIGZvcm1fZmVlZCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0Nl0KKyNkZWZpbmUgZnJvbV9zdGF0dXNfbGluZSAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzQ3XQorI2RlZmluZSBpbml0XzFzdHJpbmcgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDhdCisjZGVmaW5lIGluaXRfMnN0cmluZyAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0OV0KKyNkZWZpbmUgaW5pdF8zc3RyaW5nICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzUwXQorI2RlZmluZSBpbml0X2ZpbGUgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNTFdCisjZGVmaW5lIGluc2VydF9jaGFyYWN0ZXIgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s1Ml0KKyNkZWZpbmUgaW5zZXJ0X2xpbmUgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzUzXQorI2RlZmluZSBpbnNlcnRfcGFkZGluZyAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNTRdCisjZGVmaW5lIGtleV9iYWNrc3BhY2UgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s1NV0KKyNkZWZpbmUga2V5X2NhdGFiICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzU2XQorI2RlZmluZSBrZXlfY2xlYXIgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNTddCisjZGVmaW5lIGtleV9jdGFiICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s1OF0KKyNkZWZpbmUga2V5X2RjICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzU5XQorI2RlZmluZSBrZXlfZGwgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNjBdCisjZGVmaW5lIGtleV9kb3duICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s2MV0KKyNkZWZpbmUga2V5X2VpYyAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzYyXQorI2RlZmluZSBrZXlfZW9sICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNjNdCisjZGVmaW5lIGtleV9lb3MgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s2NF0KKyNkZWZpbmUga2V5X2YwICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzY1XQorI2RlZmluZSBrZXlfZjEgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNjZdCisjZGVmaW5lIGtleV9mMTAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s2N10KKyNkZWZpbmUga2V5X2YyICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzY4XQorI2RlZmluZSBrZXlfZjMgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNjldCisjZGVmaW5lIGtleV9mNCAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s3MF0KKyNkZWZpbmUga2V5X2Y1ICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzcxXQorI2RlZmluZSBrZXlfZjYgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNzJdCisjZGVmaW5lIGtleV9mNyAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s3M10KKyNkZWZpbmUga2V5X2Y4ICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzc0XQorI2RlZmluZSBrZXlfZjkgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNzVdCisjZGVmaW5lIGtleV9ob21lICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s3Nl0KKyNkZWZpbmUga2V5X2ljICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzc3XQorI2RlZmluZSBrZXlfaWwgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNzhdCisjZGVmaW5lIGtleV9sZWZ0ICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s3OV0KKyNkZWZpbmUga2V5X2xsICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzgwXQorI2RlZmluZSBrZXlfbnBhZ2UgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbODFdCisjZGVmaW5lIGtleV9wcGFnZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s4Ml0KKyNkZWZpbmUga2V5X3JpZ2h0ICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzgzXQorI2RlZmluZSBrZXlfc2YgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbODRdCisjZGVmaW5lIGtleV9zciAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s4NV0KKyNkZWZpbmUga2V5X3N0YWIgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzg2XQorI2RlZmluZSBrZXlfdXAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbODddCisjZGVmaW5lIGtleXBhZF9sb2NhbCAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s4OF0KKyNkZWZpbmUga2V5cGFkX3htaXQgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzg5XQorI2RlZmluZSBsYWJfZjAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbOTBdCisjZGVmaW5lIGxhYl9mMSAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s5MV0KKyNkZWZpbmUgbGFiX2YxMCAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzkyXQorI2RlZmluZSBsYWJfZjIgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbOTNdCisjZGVmaW5lIGxhYl9mMyAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s5NF0KKyNkZWZpbmUgbGFiX2Y0ICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzk1XQorI2RlZmluZSBsYWJfZjUgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbOTZdCisjZGVmaW5lIGxhYl9mNiAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s5N10KKyNkZWZpbmUgbGFiX2Y3ICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzk4XQorI2RlZmluZSBsYWJfZjggICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbOTldCisjZGVmaW5lIGxhYl9mOSAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDBdCisjZGVmaW5lIG1ldGFfb2ZmICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDFdCisjZGVmaW5lIG1ldGFfb24gICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDJdCisjZGVmaW5lIG5ld2xpbmUgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDNdCisjZGVmaW5lIHBhZF9jaGFyICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDRdCisjZGVmaW5lIHBhcm1fZGNoICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDVdCisjZGVmaW5lIHBhcm1fZGVsZXRlX2xpbmUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDZdCisjZGVmaW5lIHBhcm1fZG93bl9jdXJzb3IgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDddCisjZGVmaW5lIHBhcm1faWNoICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDhdCisjZGVmaW5lIHBhcm1faW5kZXggICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDldCisjZGVmaW5lIHBhcm1faW5zZXJ0X2xpbmUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTBdCisjZGVmaW5lIHBhcm1fbGVmdF9jdXJzb3IgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTFdCisjZGVmaW5lIHBhcm1fcmlnaHRfY3Vyc29yICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTJdCisjZGVmaW5lIHBhcm1fcmluZGV4ICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTNdCisjZGVmaW5lIHBhcm1fdXBfY3Vyc29yICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTRdCisjZGVmaW5lIHBrZXlfa2V5ICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTVdCisjZGVmaW5lIHBrZXlfbG9jYWwgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTZdCisjZGVmaW5lIHBrZXlfeG1pdCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTddCisjZGVmaW5lIHByaW50X3NjcmVlbiAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMThdCisjZGVmaW5lIHBydHJfb2ZmICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTldCisjZGVmaW5lIHBydHJfb24gICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjBdCisjZGVmaW5lIHJlcGVhdF9jaGFyICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjFdCisjZGVmaW5lIHJlc2V0XzFzdHJpbmcgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjJdCisjZGVmaW5lIHJlc2V0XzJzdHJpbmcgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjNdCisjZGVmaW5lIHJlc2V0XzNzdHJpbmcgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjRdCisjZGVmaW5lIHJlc2V0X2ZpbGUgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjVdCisjZGVmaW5lIHJlc3RvcmVfY3Vyc29yICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjZdCisjZGVmaW5lIHJvd19hZGRyZXNzICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjddCisjZGVmaW5lIHNhdmVfY3Vyc29yICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjhdCisjZGVmaW5lIHNjcm9sbF9mb3J3YXJkICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjldCisjZGVmaW5lIHNjcm9sbF9yZXZlcnNlICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzBdCisjZGVmaW5lIHNldF9hdHRyaWJ1dGVzICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzFdCisjZGVmaW5lIHNldF90YWIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzJdCisjZGVmaW5lIHNldF93aW5kb3cgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzNdCisjZGVmaW5lIHRhYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzRdCisjZGVmaW5lIHRvX3N0YXR1c19saW5lICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzVdCisjZGVmaW5lIHVuZGVybGluZV9jaGFyICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzZdCisjZGVmaW5lIHVwX2hhbGZfbGluZSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzddCisjZGVmaW5lIGluaXRfcHJvZyAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzhdCisjZGVmaW5lIGtleV9hMSAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzldCisjZGVmaW5lIGtleV9hMyAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDBdCisjZGVmaW5lIGtleV9iMiAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDFdCisjZGVmaW5lIGtleV9jMSAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDJdCisjZGVmaW5lIGtleV9jMyAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDNdCisjZGVmaW5lIHBydHJfbm9uICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDRdCisjZGVmaW5lIGNoYXJfcGFkZGluZyAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDVdCisjZGVmaW5lIGFjc19jaGFycyAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDZdCisjZGVmaW5lIHBsYWJfbm9ybSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDddCisjZGVmaW5lIGtleV9idGFiICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDhdCisjZGVmaW5lIGVudGVyX3hvbl9tb2RlICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDldCisjZGVmaW5lIGV4aXRfeG9uX21vZGUgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTBdCisjZGVmaW5lIGVudGVyX2FtX21vZGUgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTFdCisjZGVmaW5lIGV4aXRfYW1fbW9kZSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTJdCisjZGVmaW5lIHhvbl9jaGFyYWN0ZXIgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTNdCisjZGVmaW5lIHhvZmZfY2hhcmFjdGVyICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTRdCisjZGVmaW5lIGVuYV9hY3MgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTVdCisjZGVmaW5lIGxhYmVsX29uICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTZdCisjZGVmaW5lIGxhYmVsX29mZiAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTddCisjZGVmaW5lIGtleV9iZWcgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNThdCisjZGVmaW5lIGtleV9jYW5jZWwgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTldCisjZGVmaW5lIGtleV9jbG9zZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjBdCisjZGVmaW5lIGtleV9jb21tYW5kICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjFdCisjZGVmaW5lIGtleV9jb3B5ICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjJdCisjZGVmaW5lIGtleV9jcmVhdGUgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjNdCisjZGVmaW5lIGtleV9lbmQgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjRdCisjZGVmaW5lIGtleV9lbnRlciAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjVdCisjZGVmaW5lIGtleV9leGl0ICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjZdCisjZGVmaW5lIGtleV9maW5kICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjddCisjZGVmaW5lIGtleV9oZWxwICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjhdCisjZGVmaW5lIGtleV9tYXJrICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjldCisjZGVmaW5lIGtleV9tZXNzYWdlICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzBdCisjZGVmaW5lIGtleV9tb3ZlICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzFdCisjZGVmaW5lIGtleV9uZXh0ICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzJdCisjZGVmaW5lIGtleV9vcGVuICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzNdCisjZGVmaW5lIGtleV9vcHRpb25zICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzRdCisjZGVmaW5lIGtleV9wcmV2aW91cyAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzVdCisjZGVmaW5lIGtleV9wcmludCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzZdCisjZGVmaW5lIGtleV9yZWRvICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzddCisjZGVmaW5lIGtleV9yZWZlcmVuY2UgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzhdCisjZGVmaW5lIGtleV9yZWZyZXNoICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzldCisjZGVmaW5lIGtleV9yZXBsYWNlICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODBdCisjZGVmaW5lIGtleV9yZXN0YXJ0ICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODFdCisjZGVmaW5lIGtleV9yZXN1bWUgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODJdCisjZGVmaW5lIGtleV9zYXZlICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODNdCisjZGVmaW5lIGtleV9zdXNwZW5kICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODRdCisjZGVmaW5lIGtleV91bmRvICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODVdCisjZGVmaW5lIGtleV9zYmVnICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODZdCisjZGVmaW5lIGtleV9zY2FuY2VsICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODddCisjZGVmaW5lIGtleV9zY29tbWFuZCAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODhdCisjZGVmaW5lIGtleV9zY29weSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODldCisjZGVmaW5lIGtleV9zY3JlYXRlICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTBdCisjZGVmaW5lIGtleV9zZGMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTFdCisjZGVmaW5lIGtleV9zZGwgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTJdCisjZGVmaW5lIGtleV9zZWxlY3QgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTNdCisjZGVmaW5lIGtleV9zZW5kICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTRdCisjZGVmaW5lIGtleV9zZW9sICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTVdCisjZGVmaW5lIGtleV9zZXhpdCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTZdCisjZGVmaW5lIGtleV9zZmluZCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTddCisjZGVmaW5lIGtleV9zaGVscCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOThdCisjZGVmaW5lIGtleV9zaG9tZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTldCisjZGVmaW5lIGtleV9zaWMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDBdCisjZGVmaW5lIGtleV9zbGVmdCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDFdCisjZGVmaW5lIGtleV9zbWVzc2FnZSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDJdCisjZGVmaW5lIGtleV9zbW92ZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDNdCisjZGVmaW5lIGtleV9zbmV4dCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDRdCisjZGVmaW5lIGtleV9zb3B0aW9ucyAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDVdCisjZGVmaW5lIGtleV9zcHJldmlvdXMgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDZdCisjZGVmaW5lIGtleV9zcHJpbnQgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDddCisjZGVmaW5lIGtleV9zcmVkbyAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDhdCisjZGVmaW5lIGtleV9zcmVwbGFjZSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDldCisjZGVmaW5lIGtleV9zcmlnaHQgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTBdCisjZGVmaW5lIGtleV9zcnN1bWUgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTFdCisjZGVmaW5lIGtleV9zc2F2ZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTJdCisjZGVmaW5lIGtleV9zc3VzcGVuZCAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTNdCisjZGVmaW5lIGtleV9zdW5kbyAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTRdCisjZGVmaW5lIHJlcV9mb3JfaW5wdXQgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTVdCisjZGVmaW5lIGtleV9mMTEgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTZdCisjZGVmaW5lIGtleV9mMTIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTddCisjZGVmaW5lIGtleV9mMTMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMThdCisjZGVmaW5lIGtleV9mMTQgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTldCisjZGVmaW5lIGtleV9mMTUgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjBdCisjZGVmaW5lIGtleV9mMTYgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjFdCisjZGVmaW5lIGtleV9mMTcgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjJdCisjZGVmaW5lIGtleV9mMTggICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjNdCisjZGVmaW5lIGtleV9mMTkgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjRdCisjZGVmaW5lIGtleV9mMjAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjVdCisjZGVmaW5lIGtleV9mMjEgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjZdCisjZGVmaW5lIGtleV9mMjIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjddCisjZGVmaW5lIGtleV9mMjMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjhdCisjZGVmaW5lIGtleV9mMjQgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjldCisjZGVmaW5lIGtleV9mMjUgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzBdCisjZGVmaW5lIGtleV9mMjYgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzFdCisjZGVmaW5lIGtleV9mMjcgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzJdCisjZGVmaW5lIGtleV9mMjggICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzNdCisjZGVmaW5lIGtleV9mMjkgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzRdCisjZGVmaW5lIGtleV9mMzAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzVdCisjZGVmaW5lIGtleV9mMzEgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzZdCisjZGVmaW5lIGtleV9mMzIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzddCisjZGVmaW5lIGtleV9mMzMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzhdCisjZGVmaW5lIGtleV9mMzQgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzldCisjZGVmaW5lIGtleV9mMzUgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDBdCisjZGVmaW5lIGtleV9mMzYgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDFdCisjZGVmaW5lIGtleV9mMzcgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDJdCisjZGVmaW5lIGtleV9mMzggICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDNdCisjZGVmaW5lIGtleV9mMzkgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDRdCisjZGVmaW5lIGtleV9mNDAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDVdCisjZGVmaW5lIGtleV9mNDEgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDZdCisjZGVmaW5lIGtleV9mNDIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDddCisjZGVmaW5lIGtleV9mNDMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDhdCisjZGVmaW5lIGtleV9mNDQgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDldCisjZGVmaW5lIGtleV9mNDUgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTBdCisjZGVmaW5lIGtleV9mNDYgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTFdCisjZGVmaW5lIGtleV9mNDcgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTJdCisjZGVmaW5lIGtleV9mNDggICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTNdCisjZGVmaW5lIGtleV9mNDkgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTRdCisjZGVmaW5lIGtleV9mNTAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTVdCisjZGVmaW5lIGtleV9mNTEgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTZdCisjZGVmaW5lIGtleV9mNTIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTddCisjZGVmaW5lIGtleV9mNTMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNThdCisjZGVmaW5lIGtleV9mNTQgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTldCisjZGVmaW5lIGtleV9mNTUgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjBdCisjZGVmaW5lIGtleV9mNTYgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjFdCisjZGVmaW5lIGtleV9mNTcgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjJdCisjZGVmaW5lIGtleV9mNTggICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjNdCisjZGVmaW5lIGtleV9mNTkgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjRdCisjZGVmaW5lIGtleV9mNjAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjVdCisjZGVmaW5lIGtleV9mNjEgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjZdCisjZGVmaW5lIGtleV9mNjIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjddCisjZGVmaW5lIGtleV9mNjMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjhdCisjZGVmaW5lIGNscl9ib2wgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjldCisjZGVmaW5lIGNsZWFyX21hcmdpbnMgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzBdCisjZGVmaW5lIHNldF9sZWZ0X21hcmdpbiAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzFdCisjZGVmaW5lIHNldF9yaWdodF9tYXJnaW4gICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzJdCisjZGVmaW5lIGxhYmVsX2Zvcm1hdCAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzNdCisjZGVmaW5lIHNldF9jbG9jayAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzRdCisjZGVmaW5lIGRpc3BsYXlfY2xvY2sgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzVdCisjZGVmaW5lIHJlbW92ZV9jbG9jayAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzZdCisjZGVmaW5lIGNyZWF0ZV93aW5kb3cgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzddCisjZGVmaW5lIGdvdG9fd2luZG93ICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzhdCisjZGVmaW5lIGhhbmd1cCAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzldCisjZGVmaW5lIGRpYWxfcGhvbmUgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODBdCisjZGVmaW5lIHF1aWNrX2RpYWwgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODFdCisjZGVmaW5lIHRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODJdCisjZGVmaW5lIHB1bHNlICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODNdCisjZGVmaW5lIGZsYXNoX2hvb2sgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODRdCisjZGVmaW5lIGZpeGVkX3BhdXNlICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODVdCisjZGVmaW5lIHdhaXRfdG9uZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODZdCisjZGVmaW5lIHVzZXIwICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODddCisjZGVmaW5lIHVzZXIxICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODhdCisjZGVmaW5lIHVzZXIyICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODldCisjZGVmaW5lIHVzZXIzICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTBdCisjZGVmaW5lIHVzZXI0ICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTFdCisjZGVmaW5lIHVzZXI1ICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTJdCisjZGVmaW5lIHVzZXI2ICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTNdCisjZGVmaW5lIHVzZXI3ICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTRdCisjZGVmaW5lIHVzZXI4ICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTVdCisjZGVmaW5lIHVzZXI5ICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTZdCisjZGVmaW5lIG9yaWdfcGFpciAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTddCisjZGVmaW5lIG9yaWdfY29sb3JzICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOThdCisjZGVmaW5lIGluaXRpYWxpemVfY29sb3IgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTldCisjZGVmaW5lIGluaXRpYWxpemVfcGFpciAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDBdCisjZGVmaW5lIHNldF9jb2xvcl9wYWlyICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDFdCisjZGVmaW5lIHNldF9mb3JlZ3JvdW5kICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDJdCisjZGVmaW5lIHNldF9iYWNrZ3JvdW5kICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDNdCisjZGVmaW5lIGNoYW5nZV9jaGFyX3BpdGNoICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDRdCisjZGVmaW5lIGNoYW5nZV9saW5lX3BpdGNoICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDVdCisjZGVmaW5lIGNoYW5nZV9yZXNfaG9yeiAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDZdCisjZGVmaW5lIGNoYW5nZV9yZXNfdmVydCAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDddCisjZGVmaW5lIGRlZmluZV9jaGFyICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDhdCisjZGVmaW5lIGVudGVyX2RvdWJsZXdpZGVfbW9kZSAgICAgICAgICBDVVIgU3RyaW5nc1szMDldCisjZGVmaW5lIGVudGVyX2RyYWZ0X3F1YWxpdHkgICAgICAgICAgICBDVVIgU3RyaW5nc1szMTBdCisjZGVmaW5lIGVudGVyX2l0YWxpY3NfbW9kZSAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMTFdCisjZGVmaW5lIGVudGVyX2xlZnR3YXJkX21vZGUgICAgICAgICAgICBDVVIgU3RyaW5nc1szMTJdCisjZGVmaW5lIGVudGVyX21pY3JvX21vZGUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMTNdCisjZGVmaW5lIGVudGVyX25lYXJfbGV0dGVyX3F1YWxpdHkgICAgICBDVVIgU3RyaW5nc1szMTRdCisjZGVmaW5lIGVudGVyX25vcm1hbF9xdWFsaXR5ICAgICAgICAgICBDVVIgU3RyaW5nc1szMTVdCisjZGVmaW5lIGVudGVyX3NoYWRvd19tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMTZdCisjZGVmaW5lIGVudGVyX3N1YnNjcmlwdF9tb2RlICAgICAgICAgICBDVVIgU3RyaW5nc1szMTddCisjZGVmaW5lIGVudGVyX3N1cGVyc2NyaXB0X21vZGUgICAgICAgICBDVVIgU3RyaW5nc1szMThdCisjZGVmaW5lIGVudGVyX3Vwd2FyZF9tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMTldCisjZGVmaW5lIGV4aXRfZG91Ymxld2lkZV9tb2RlICAgICAgICAgICBDVVIgU3RyaW5nc1szMjBdCisjZGVmaW5lIGV4aXRfaXRhbGljc19tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjFdCisjZGVmaW5lIGV4aXRfbGVmdHdhcmRfbW9kZSAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjJdCisjZGVmaW5lIGV4aXRfbWljcm9fbW9kZSAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjNdCisjZGVmaW5lIGV4aXRfc2hhZG93X21vZGUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjRdCisjZGVmaW5lIGV4aXRfc3Vic2NyaXB0X21vZGUgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjVdCisjZGVmaW5lIGV4aXRfc3VwZXJzY3JpcHRfbW9kZSAgICAgICAgICBDVVIgU3RyaW5nc1szMjZdCisjZGVmaW5lIGV4aXRfdXB3YXJkX21vZGUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjddCisjZGVmaW5lIG1pY3JvX2NvbHVtbl9hZGRyZXNzICAgICAgICAgICBDVVIgU3RyaW5nc1szMjhdCisjZGVmaW5lIG1pY3JvX2Rvd24gICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjldCisjZGVmaW5lIG1pY3JvX2xlZnQgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzBdCisjZGVmaW5lIG1pY3JvX3JpZ2h0ICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzFdCisjZGVmaW5lIG1pY3JvX3Jvd19hZGRyZXNzICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzJdCisjZGVmaW5lIG1pY3JvX3VwICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzNdCisjZGVmaW5lIG9yZGVyX29mX3BpbnMgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzRdCisjZGVmaW5lIHBhcm1fZG93bl9taWNybyAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzVdCisjZGVmaW5lIHBhcm1fbGVmdF9taWNybyAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzZdCisjZGVmaW5lIHBhcm1fcmlnaHRfbWljcm8gICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzddCisjZGVmaW5lIHBhcm1fdXBfbWljcm8gICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzhdCisjZGVmaW5lIHNlbGVjdF9jaGFyX3NldCAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzldCisjZGVmaW5lIHNldF9ib3R0b21fbWFyZ2luICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNDBdCisjZGVmaW5lIHNldF9ib3R0b21fbWFyZ2luX3Bhcm0gICAgICAgICBDVVIgU3RyaW5nc1szNDFdCisjZGVmaW5lIHNldF9sZWZ0X21hcmdpbl9wYXJtICAgICAgICAgICBDVVIgU3RyaW5nc1szNDJdCisjZGVmaW5lIHNldF9yaWdodF9tYXJnaW5fcGFybSAgICAgICAgICBDVVIgU3RyaW5nc1szNDNdCisjZGVmaW5lIHNldF90b3BfbWFyZ2luICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNDRdCisjZGVmaW5lIHNldF90b3BfbWFyZ2luX3Bhcm0gICAgICAgICAgICBDVVIgU3RyaW5nc1szNDVdCisjZGVmaW5lIHN0YXJ0X2JpdF9pbWFnZSAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNDZdCisjZGVmaW5lIHN0YXJ0X2NoYXJfc2V0X2RlZiAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNDddCisjZGVmaW5lIHN0b3BfYml0X2ltYWdlICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNDhdCisjZGVmaW5lIHN0b3BfY2hhcl9zZXRfZGVmICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNDldCisjZGVmaW5lIHN1YnNjcmlwdF9jaGFyYWN0ZXJzICAgICAgICAgICBDVVIgU3RyaW5nc1szNTBdCisjZGVmaW5lIHN1cGVyc2NyaXB0X2NoYXJhY3RlcnMgICAgICAgICBDVVIgU3RyaW5nc1szNTFdCisjZGVmaW5lIHRoZXNlX2NhdXNlX2NyICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTJdCisjZGVmaW5lIHplcm9fbW90aW9uICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTNdCisjZGVmaW5lIGNoYXJfc2V0X25hbWVzICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTRdCisjZGVmaW5lIGtleV9tb3VzZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTVdCisjZGVmaW5lIG1vdXNlX2luZm8gICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTZdCisjZGVmaW5lIHJlcV9tb3VzZV9wb3MgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTddCisjZGVmaW5lIGdldF9tb3VzZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNThdCisjZGVmaW5lIHNldF9hX2ZvcmVncm91bmQgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTldCisjZGVmaW5lIHNldF9hX2JhY2tncm91bmQgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjBdCisjZGVmaW5lIHBrZXlfcGxhYiAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjFdCisjZGVmaW5lIGRldmljZV90eXBlICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjJdCisjZGVmaW5lIGNvZGVfc2V0X2luaXQgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjNdCisjZGVmaW5lIHNldDBfZGVzX3NlcSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjRdCisjZGVmaW5lIHNldDFfZGVzX3NlcSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjVdCisjZGVmaW5lIHNldDJfZGVzX3NlcSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjZdCisjZGVmaW5lIHNldDNfZGVzX3NlcSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjddCisjZGVmaW5lIHNldF9scl9tYXJnaW4gICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjhdCisjZGVmaW5lIHNldF90Yl9tYXJnaW4gICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjldCisjZGVmaW5lIGJpdF9pbWFnZV9yZXBlYXQgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNzBdCisjZGVmaW5lIGJpdF9pbWFnZV9uZXdsaW5lICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNzFdCisjZGVmaW5lIGJpdF9pbWFnZV9jYXJyaWFnZV9yZXR1cm4gICAgICBDVVIgU3RyaW5nc1szNzJdCisjZGVmaW5lIGNvbG9yX25hbWVzICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNzNdCisjZGVmaW5lIGRlZmluZV9iaXRfaW1hZ2VfcmVnaW9uICAgICAgICBDVVIgU3RyaW5nc1szNzRdCisjZGVmaW5lIGVuZF9iaXRfaW1hZ2VfcmVnaW9uICAgICAgICAgICBDVVIgU3RyaW5nc1szNzVdCisjZGVmaW5lIHNldF9jb2xvcl9iYW5kICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNzZdCisjZGVmaW5lIHNldF9wYWdlX2xlbmd0aCAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNzddCisjZGVmaW5lIGRpc3BsYXlfcGNfY2hhciAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNzhdCisjZGVmaW5lIGVudGVyX3BjX2NoYXJzZXRfbW9kZSAgICAgICAgICBDVVIgU3RyaW5nc1szNzldCisjZGVmaW5lIGV4aXRfcGNfY2hhcnNldF9tb2RlICAgICAgICAgICBDVVIgU3RyaW5nc1szODBdCisjZGVmaW5lIGVudGVyX3NjYW5jb2RlX21vZGUgICAgICAgICAgICBDVVIgU3RyaW5nc1szODFdCisjZGVmaW5lIGV4aXRfc2NhbmNvZGVfbW9kZSAgICAgICAgICAgICBDVVIgU3RyaW5nc1szODJdCisjZGVmaW5lIHBjX3Rlcm1fb3B0aW9ucyAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szODNdCisjZGVmaW5lIHNjYW5jb2RlX2VzY2FwZSAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szODRdCisjZGVmaW5lIGFsdF9zY2FuY29kZV9lc2MgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szODVdCisjZGVmaW5lIGVudGVyX2hvcml6b250YWxfaGxfbW9kZSAgICAgICBDVVIgU3RyaW5nc1szODZdCisjZGVmaW5lIGVudGVyX2xlZnRfaGxfbW9kZSAgICAgICAgICAgICBDVVIgU3RyaW5nc1szODddCisjZGVmaW5lIGVudGVyX2xvd19obF9tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szODhdCisjZGVmaW5lIGVudGVyX3JpZ2h0X2hsX21vZGUgICAgICAgICAgICBDVVIgU3RyaW5nc1szODldCisjZGVmaW5lIGVudGVyX3RvcF9obF9tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTBdCisjZGVmaW5lIGVudGVyX3ZlcnRpY2FsX2hsX21vZGUgICAgICAgICBDVVIgU3RyaW5nc1szOTFdCisjZGVmaW5lIHNldF9hX2F0dHJpYnV0ZXMgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTJdCisjZGVmaW5lIHNldF9wZ2xlbl9pbmNoICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTNdCisKKyNkZWZpbmUgQk9PTFdSSVRFIDM3CisjZGVmaW5lIE5VTVdSSVRFICAzMworI2RlZmluZSBTVFJXUklURSAgMzk0CisKKy8qIG9sZGVyIHN5bm9ueW1zIGZvciBzb21lIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBiZWVoaXZlX2dsaXRjaAlub19lc2NfY3RsYworI2RlZmluZSB0ZWxlcmF5X2dsaXRjaAlkZXN0X3RhYnNfbWFnaWNfc21zbworI2RlZmluZSBtaWNyb19jaGFyX3NpemUgbWljcm9fY29sX3NpemUKKworI2lmZGVmIF9fSU5URVJOQUxfQ0FQU19WSVNJQkxFCisjZGVmaW5lIHRlcm1jYXBfaW5pdDIgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTRdCisjZGVmaW5lIHRlcm1jYXBfcmVzZXQgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTVdCisjZGVmaW5lIG1hZ2ljX2Nvb2tpZV9nbGl0Y2hfdWwgICAgICAgICBDVVIgTnVtYmVyc1szM10KKyNkZWZpbmUgYmFja3NwYWNlc193aXRoX2JzICAgICAgICAgICAgIENVUiBCb29sZWFuc1szN10KKyNkZWZpbmUgY3J0X25vX3Njcm9sbGluZyAgICAgICAgICAgICAgIENVUiBCb29sZWFuc1szOF0KKyNkZWZpbmUgbm9fY29ycmVjdGx5X3dvcmtpbmdfY3IgICAgICAgIENVUiBCb29sZWFuc1szOV0KKyNkZWZpbmUgY2FycmlhZ2VfcmV0dXJuX2RlbGF5ICAgICAgICAgIENVUiBOdW1iZXJzWzM0XQorI2RlZmluZSBuZXdfbGluZV9kZWxheSAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMzVdCisjZGVmaW5lIGxpbmVmZWVkX2lmX25vdF9sZiAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTZdCisjZGVmaW5lIGJhY2tzcGFjZV9pZl9ub3RfYnMgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTddCisjZGVmaW5lIGdudV9oYXNfbWV0YV9rZXkgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbNDBdCisjZGVmaW5lIGxpbmVmZWVkX2lzX25ld2xpbmUgICAgICAgICAgICBDVVIgQm9vbGVhbnNbNDFdCisjZGVmaW5lIGJhY2tzcGFjZV9kZWxheSAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1szNl0KKyNkZWZpbmUgaG9yaXpvbnRhbF90YWJfZGVsYXkgICAgICAgICAgIENVUiBOdW1iZXJzWzM3XQorI2RlZmluZSBudW1iZXJfb2ZfZnVuY3Rpb25fa2V5cyAgICAgICAgQ1VSIE51bWJlcnNbMzhdCisjZGVmaW5lIG90aGVyX25vbl9mdW5jdGlvbl9rZXlzICAgICAgICBDVVIgU3RyaW5nc1szOThdCisjZGVmaW5lIGFycm93X2tleV9tYXAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTldCisjZGVmaW5lIGhhc19oYXJkd2FyZV90YWJzICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbNDJdCisjZGVmaW5lIHJldHVybl9kb2VzX2Nscl9lb2wgICAgICAgICAgICBDVVIgQm9vbGVhbnNbNDNdCisjZGVmaW5lIGFjc191bGNvcm5lciAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDBdCisjZGVmaW5lIGFjc19sbGNvcm5lciAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDFdCisjZGVmaW5lIGFjc191cmNvcm5lciAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDJdCisjZGVmaW5lIGFjc19scmNvcm5lciAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDNdCisjZGVmaW5lIGFjc19sdGVlICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDRdCisjZGVmaW5lIGFjc19ydGVlICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDVdCisjZGVmaW5lIGFjc19idGVlICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDZdCisjZGVmaW5lIGFjc190dGVlICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDddCisjZGVmaW5lIGFjc19obGluZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDhdCisjZGVmaW5lIGFjc192bGluZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDldCisjZGVmaW5lIGFjc19wbHVzICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MTBdCisjZGVmaW5lIG1lbW9yeV9sb2NrICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MTFdCisjZGVmaW5lIG1lbW9yeV91bmxvY2sgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MTJdCisjZGVmaW5lIGJveF9jaGFyc18xICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MTNdCisjZW5kaWYgLyogX19JTlRFUk5BTF9DQVBTX1ZJU0lCTEUgKi8KKworCisvKgorICogUHJlZGVmaW5lZCB0ZXJtaW5mbyBhcnJheSBzaXplcworICovCisjZGVmaW5lIEJPT0xDT1VOVCA0NAorI2RlZmluZSBOVU1DT1VOVCAgMzkKKyNkZWZpbmUgU1RSQ09VTlQgIDQxNAorCisvKiB1c2VkIGJ5IGNvZGUgZm9yIGNvbXBhcmluZyBlbnRyaWVzICovCisjZGVmaW5lIGFjc19jaGFyc19pbmRleAkgMTQ2CisKK3R5cGVkZWYgc3RydWN0IHRlcm10eXBlIHsJLyogaW4tY29yZSBmb3JtIG9mIHRlcm1pbmZvIGRhdGEgKi8KKyAgICBjaGFyICAqdGVybV9uYW1lczsJCS8qIHN0cl90YWJsZSBvZmZzZXQgb2YgdGVybSBuYW1lcyAqLworICAgIGNoYXIgICpzdHJfdGFibGU7CQkvKiBwb2ludGVyIHRvIHN0cmluZyB0YWJsZSAqLworICAgIE5DVVJTRVNfU0JPT0wgICpCb29sZWFuczsJLyogYXJyYXkgb2YgYm9vbGVhbiB2YWx1ZXMgKi8KKyAgICBzaG9ydCAqTnVtYmVyczsJCS8qIGFycmF5IG9mIGludGVnZXIgdmFsdWVzICovCisgICAgY2hhciAgKipTdHJpbmdzOwkJLyogYXJyYXkgb2Ygc3RyaW5nIG9mZnNldHMgKi8KKworI2lmIE5DVVJTRVNfWE5BTUVTCisgICAgY2hhciAgKmV4dF9zdHJfdGFibGU7CS8qIHBvaW50ZXIgdG8gZXh0ZW5kZWQgc3RyaW5nIHRhYmxlICovCisgICAgY2hhciAgKipleHRfTmFtZXM7CQkvKiBjb3JyZXNwb25kaW5nIG5hbWVzICovCisKKyAgICB1bnNpZ25lZCBzaG9ydCBudW1fQm9vbGVhbnM7LyogY291bnQgdG90YWwgQm9vbGVhbnMgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBudW1fTnVtYmVyczsJLyogY291bnQgdG90YWwgTnVtYmVycyAqLworICAgIHVuc2lnbmVkIHNob3J0IG51bV9TdHJpbmdzOwkvKiBjb3VudCB0b3RhbCBTdHJpbmdzICovCisKKyAgICB1bnNpZ25lZCBzaG9ydCBleHRfQm9vbGVhbnM7LyogY291bnQgZXh0ZW5zaW9ucyB0byBCb29sZWFucyAqLworICAgIHVuc2lnbmVkIHNob3J0IGV4dF9OdW1iZXJzOwkvKiBjb3VudCBleHRlbnNpb25zIHRvIE51bWJlcnMgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBleHRfU3RyaW5nczsJLyogY291bnQgZXh0ZW5zaW9ucyB0byBTdHJpbmdzICovCisjZW5kaWYgLyogTkNVUlNFU19YTkFNRVMgKi8KKworfSBURVJNVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgdGVybSB7CQkvKiBkZXNjcmliZSBhbiBhY3R1YWwgdGVybWluYWwgKi8KKyAgICBURVJNVFlQRQl0eXBlOwkJLyogdGVybWluYWwgdHlwZSBkZXNjcmlwdGlvbiAqLworICAgIHNob3J0CUZpbGVkZXM7CS8qIGZpbGUgZGVzY3JpcHRpb24gYmVpbmcgd3JpdHRlbiB0byAqLworICAgIFRUWQkJT3R0eWIsCQkvKiBvcmlnaW5hbCBzdGF0ZSBvZiB0aGUgdGVybWluYWwgKi8KKwkJTnR0eWI7CQkvKiBjdXJyZW50IHN0YXRlIG9mIHRoZSB0ZXJtaW5hbCAqLworICAgIGludAkJX2JhdWRyYXRlOwkvKiB1c2VkIHRvIGNvbXB1dGUgcGFkZGluZyAqLworICAgIGNoYXIgKiAgICAgIF90ZXJtbmFtZTsgICAgICAvKiB1c2VkIGZvciB0ZXJtbmFtZSgpICovCit9IFRFUk1JTkFMOworCisjaWYgMCAmJiAhMAorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihURVJNSU5BTCAqKSBjdXJfdGVybTsKKyNlbGlmIDAKK05DVVJTRVNfV1JBUFBFRF9WQVIoVEVSTUlOQUwgKiwgY3VyX3Rlcm0pOworI2RlZmluZSBjdXJfdGVybSAgIE5DVVJTRVNfUFVCTElDX1ZBUihjdXJfdGVybSgpKQorI2Vsc2UKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoVEVSTUlOQUwgKikgY3VyX3Rlcm07CisjZW5kaWYKKworI2lmIDAgfHwgMAorTkNVUlNFU19XUkFQUEVEX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCAqLCBib29sbmFtZXMpOworTkNVUlNFU19XUkFQUEVEX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCAqLCBib29sY29kZXMpOworTkNVUlNFU19XUkFQUEVEX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCAqLCBib29sZm5hbWVzKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKiwgbnVtbmFtZXMpOworTkNVUlNFU19XUkFQUEVEX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCAqLCBudW1jb2Rlcyk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICosIG51bWZuYW1lcyk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICosIHN0cm5hbWVzKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKiwgc3RyY29kZXMpOworTkNVUlNFU19XUkFQUEVEX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCAqLCBzdHJmbmFtZXMpOworCisjZGVmaW5lIGJvb2xuYW1lcyAgTkNVUlNFU19QVUJMSUNfVkFSKGJvb2xuYW1lcygpKQorI2RlZmluZSBib29sY29kZXMgIE5DVVJTRVNfUFVCTElDX1ZBUihib29sY29kZXMoKSkKKyNkZWZpbmUgYm9vbGZuYW1lcyBOQ1VSU0VTX1BVQkxJQ19WQVIoYm9vbGZuYW1lcygpKQorI2RlZmluZSBudW1uYW1lcyAgIE5DVVJTRVNfUFVCTElDX1ZBUihudW1uYW1lcygpKQorI2RlZmluZSBudW1jb2RlcyAgIE5DVVJTRVNfUFVCTElDX1ZBUihudW1jb2RlcygpKQorI2RlZmluZSBudW1mbmFtZXMgIE5DVVJTRVNfUFVCTElDX1ZBUihudW1mbmFtZXMoKSkKKyNkZWZpbmUgc3RybmFtZXMgICBOQ1VSU0VTX1BVQkxJQ19WQVIoc3RybmFtZXMoKSkKKyNkZWZpbmUgc3RyY29kZXMgICBOQ1VSU0VTX1BVQkxJQ19WQVIoc3RyY29kZXMoKSkKKyNkZWZpbmUgc3RyZm5hbWVzICBOQ1VSU0VTX1BVQkxJQ19WQVIoc3RyZm5hbWVzKCkpCisKKyNlbHNlCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKSBib29sbmFtZXNbXTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKSBib29sY29kZXNbXTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKSBib29sZm5hbWVzW107CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICkgbnVtbmFtZXNbXTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKSBudW1jb2Rlc1tdOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCApIG51bWZuYW1lc1tdOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCApIHN0cm5hbWVzW107CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICkgc3RyY29kZXNbXTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKSBzdHJmbmFtZXNbXTsKKworI2VuZGlmCisKKy8qIGludGVybmFscyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgX25jX3NldF90dHlfbW9kZSAoVFRZICpidWYpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgX25jX2dldF90dHlfbW9kZSAoVFRZICpidWYpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgX25jX3JlYWRfZW50cnkgKGNvbnN0IGNoYXIgKiBjb25zdCwgY2hhciAqIGNvbnN0LCBURVJNVFlQRSAqY29uc3QpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgX25jX3JlYWRfZmlsZV9lbnRyeSAoY29uc3QgY2hhciAqY29uc3QsIFRFUk1UWVBFICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgX25jX3JlYWRfdGVybXR5cGUgKFRFUk1UWVBFICosIGNoYXIgKiwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF9uY19maXJzdF9uYW1lIChjb25zdCBjaGFyICpjb25zdCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBfbmNfbmFtZV9tYXRjaCAoY29uc3QgY2hhciAqY29uc3QsIGNvbnN0IGNoYXIgKmNvbnN0LCBjb25zdCBjaGFyICpjb25zdCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgVEVSTVRZUEUgKikgX25jX2ZhbGxiYWNrIChjb25zdCBjaGFyICopOworCisvKiBlbnRyeSBwb2ludHMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChURVJNSU5BTCAqKSBzZXRfY3VydGVybSAoVEVSTUlOQUwgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBkZWxfY3VydGVybSAoVEVSTUlOQUwgKik7CisKKy8qIG1pc2NlbGxhbmVvdXMgZW50cnkgcG9pbnRzICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSByZXN0YXJ0dGVybSAoTkNVUlNFU19DT05TVCBjaGFyICosIGludCwgaW50ICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2V0dXB0ZXJtIChOQ1VSU0VTX0NPTlNUIGNoYXIgKixpbnQsaW50ICopOworCisvKiB0ZXJtaW5mbyBlbnRyeSBwb2ludHMsIGFsc28gZGVjbGFyZWQgaW4gY3Vyc2VzLmggKi8KKyNpZiAhZGVmaW5lZChfX05DVVJTRVNfSCkKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRpZ2V0c3RyIChOQ1VSU0VTX0NPTlNUIGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGNoYXIpIHR0eXR5cGVbXTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHB1dHAgKGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0aWdldGZsYWcgKE5DVVJTRVNfQ09OU1QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHRpZ2V0bnVtIChOQ1VSU0VTX0NPTlNUIGNoYXIgKik7CisKKyNpZiAxIC8qIE5DVVJTRVNfVFBBUk1fVkFSQVJHUyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdHBhcm0gKE5DVVJTRVNfQ09OU1QgY2hhciAqLCAuLi4pOwkvKiBzcGVjaWFsICovCisjZWxzZQorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdHBhcm0gKE5DVVJTRVNfQ09OU1QgY2hhciAqLCBsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcsbG9uZyk7CS8qIHNwZWNpYWwgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRwYXJtX3ZhcmFyZ3MgKE5DVVJTRVNfQ09OU1QgY2hhciAqLCAuLi4pOwkvKiBzcGVjaWFsICovCisjZW5kaWYKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdGlwYXJtIChjb25zdCBjaGFyICosIC4uLik7CQkvKiBzcGVjaWFsICovCisKKyNlbmRpZiAvKiBfX05DVVJTRVNfSCAqLworCisvKiB0ZXJtY2FwIGRhdGFiYXNlIGVtdWxhdGlvbiAoWFBHNCB1c2VzIGNvbnN0IG9ubHkgZm9yIDJuZCBwYXJhbSBvZiB0Z2V0ZW50KSAqLworI2lmICFkZWZpbmVkKE5DVVJTRVNfVEVSTUNBUF9IX2luY2wpCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSB0Z2V0c3RyIChOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgY2hhciAqKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSB0Z290byAoY29uc3QgY2hhciAqLCBpbnQsIGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0Z2V0ZW50IChjaGFyICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0Z2V0ZmxhZyAoTkNVUlNFU19DT05TVCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdGdldG51bSAoTkNVUlNFU19DT05TVCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdHB1dHMgKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQgKCopKGludCkpOworI2VuZGlmIC8qIE5DVVJTRVNfVEVSTUNBUF9IX2luY2wgKi8KKworLyoKKyAqIEluY2x1ZGUgY3Vyc2VzLmggYmVmb3JlIHRlcm0uaCB0byBlbmFibGUgdGhlc2UgZXh0ZW5zaW9ucy4KKyAqLworI2lmIGRlZmluZWQoTkNVUlNFU19TUF9GVU5DUykgJiYgKE5DVVJTRVNfU1BfRlVOQ1MgIT0gMCkKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgIE5DVVJTRVNfU1BfTkFNRSh0aWdldHN0cikgKFNDUkVFTiosIE5DVVJTRVNfQ09OU1QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBOQ1VSU0VTX1NQX05BTUUocHV0cCkgKFNDUkVFTiosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgTkNVUlNFU19TUF9OQU1FKHRpZ2V0ZmxhZykgKFNDUkVFTiosIE5DVVJTRVNfQ09OU1QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBOQ1VSU0VTX1NQX05BTUUodGlnZXRudW0pIChTQ1JFRU4qLCBOQ1VSU0VTX0NPTlNUIGNoYXIgKik7CisKKyNpZiAxIC8qIE5DVVJTRVNfVFBBUk1fVkFSQVJHUyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgIE5DVVJTRVNfU1BfTkFNRSh0cGFybSkgKFNDUkVFTiosIE5DVVJTRVNfQ09OU1QgY2hhciAqLCAuLi4pOwkvKiBzcGVjaWFsICovCisjZWxzZQorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgIE5DVVJTRVNfU1BfTkFNRSh0cGFybSkgKFNDUkVFTiosIE5DVVJTRVNfQ09OU1QgY2hhciAqLCBsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcsbG9uZyk7CS8qIHNwZWNpYWwgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopICBOQ1VSU0VTX1NQX05BTUUodHBhcm1fdmFyYXJncykgKFNDUkVFTiosIE5DVVJTRVNfQ09OU1QgY2hhciAqLCAuLi4pOwkvKiBzcGVjaWFsICovCisjZW5kaWYKKworLyogdGVybWNhcCBkYXRhYmFzZSBlbXVsYXRpb24gKFhQRzQgdXNlcyBjb25zdCBvbmx5IGZvciAybmQgcGFyYW0gb2YgdGdldGVudCkgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopICBOQ1VSU0VTX1NQX05BTUUodGdldHN0cikgKFNDUkVFTiosIE5DVVJTRVNfQ09OU1QgY2hhciAqLCBjaGFyICoqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopICBOQ1VSU0VTX1NQX05BTUUodGdvdG8pIChTQ1JFRU4qLCBjb25zdCBjaGFyICosIGludCwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBOQ1VSU0VTX1NQX05BTUUodGdldGVudCkgKFNDUkVFTiosIGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBOQ1VSU0VTX1NQX05BTUUodGdldGZsYWcpIChTQ1JFRU4qLCBOQ1VSU0VTX0NPTlNUIGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgTkNVUlNFU19TUF9OQU1FKHRnZXRudW0pIChTQ1JFRU4qLCBOQ1VSU0VTX0NPTlNUIGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgTkNVUlNFU19TUF9OQU1FKHRwdXRzKSAoU0NSRUVOKiwgY29uc3QgY2hhciAqLCBpbnQsIE5DVVJTRVNfU1BfT1VUQyk7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChURVJNSU5BTCAqKSBOQ1VSU0VTX1NQX05BTUUoc2V0X2N1cnRlcm0pIChTQ1JFRU4qLCBURVJNSU5BTCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBOQ1VSU0VTX1NQX05BTUUoZGVsX2N1cnRlcm0pIChTQ1JFRU4qLCBURVJNSU5BTCAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIE5DVVJTRVNfU1BfTkFNRShyZXN0YXJ0dGVybSkgKFNDUkVFTiosIE5DVVJTRVNfQ09OU1QgY2hhciAqLCBpbnQsIGludCAqKTsKKyNlbmRpZiAvKiBOQ1VSU0VTX1NQX0ZVTkNTICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBOQ1VSU0VTX1RFUk1fSF9pbmNsICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1fZW50cnkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybV9lbnRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzBmODYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1fZW50cnkuaApAQCAtMCwwICsxLDE3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA4LDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBBdXRob3I6IFpleWQgTS4gQmVuLUhhbGltIDx6bWJlbmhhbEBuZXRjb20uY29tPiAxOTkyLDE5OTUgICAgICAgICAgICAgICAqCisgKiAgICAgYW5kOiBFcmljIFMuIFJheW1vbmQgPGVzckBzbmFyay50aHlyc3VzLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgIGFuZDogVGhvbWFzIEUuIERpY2tleSAgICAgICAgICAgICAgICAgICAgICAgIDE5OTgtb24gICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAkSWQ6IHRlcm1fZW50cnkuaCx2IDEuMzcgMjAwOS8wNy8xMSAxNjo1MjoyOSB0b20gRXhwICQgKi8KKworLyoKKyAqCXRlcm1fZW50cnkuaCAtLSBpbnRlcmZhY2UgdG8gZW50cnktbWFuaXB1bGF0aW9uIGNvZGUKKyAqLworCisjaWZuZGVmIE5DVVJTRVNfVEVSTV9FTlRSWV9IX2luY2wKKyNkZWZpbmUgTkNVUlNFU19URVJNX0VOVFJZX0hfaW5jbCAxCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHRlcm0uaD4KKworI2RlZmluZSBNQVhfVVNFUwkzMgorI2RlZmluZSBNQVhfQ1JPU1NMSU5LUwkxNgorCit0eXBlZGVmIHN0cnVjdCBlbnRyeSB7CisJVEVSTVRZUEUJdHRlcm07CisJdW5zaWduZWQJbnVzZXM7CisJc3RydWN0CisgICAgICAgIHsKKwkgICAgY2hhcgkJKm5hbWU7CisJICAgIHN0cnVjdCBlbnRyeQkqbGluazsKKwkgICAgbG9uZwkJbGluZTsKKyAgICAgICAgfQorCXVzZXNbTUFYX1VTRVNdOworCWludAkJbmNyb3NzbGlua3M7CisJc3RydWN0IGVudHJ5CSpjcm9zc2xpbmtzW01BWF9DUk9TU0xJTktTXTsKKwlsb25nCQljc3RhcnQsIGNlbmQ7CisJbG9uZwkJc3RhcnRsaW5lOworCXN0cnVjdCBlbnRyeQkqbmV4dDsKKwlzdHJ1Y3QgZW50cnkJKmxhc3Q7Cit9CitFTlRSWTsKKworI2lmIE5DVVJTRVNfWE5BTUVTCisjZGVmaW5lIE5VTV9CT09MRUFOUyh0cCkgKHRwKS0+bnVtX0Jvb2xlYW5zCisjZGVmaW5lIE5VTV9OVU1CRVJTKHRwKSAgKHRwKS0+bnVtX051bWJlcnMKKyNkZWZpbmUgTlVNX1NUUklOR1ModHApICAodHApLT5udW1fU3RyaW5ncworI2RlZmluZSBFWFRfTkFNRVModHAsaSxsaW1pdCxpbmRleCx0YWJsZSkgKGkgPj0gbGltaXQpID8gdHAtPmV4dF9OYW1lc1tpbmRleF0gOiB0YWJsZVtpXQorI2Vsc2UKKyNkZWZpbmUgTlVNX0JPT0xFQU5TKHRwKSBCT09MQ09VTlQKKyNkZWZpbmUgTlVNX05VTUJFUlModHApICBOVU1DT1VOVAorI2RlZmluZSBOVU1fU1RSSU5HUyh0cCkgIFNUUkNPVU5UCisjZGVmaW5lIEVYVF9OQU1FUyh0cCxpLGxpbWl0LGluZGV4LHRhYmxlKSB0YWJsZVtpXQorI2VuZGlmCisKKyNkZWZpbmUgTlVNX0VYVF9OQU1FUyh0cCkgKHVuc2lnbmVkKSAoKHRwKS0+ZXh0X0Jvb2xlYW5zICsgKHRwKS0+ZXh0X051bWJlcnMgKyAodHApLT5leHRfU3RyaW5ncykKKworI2RlZmluZSBmb3JfZWFjaF9ib29sZWFuKG4sdHApIGZvcihuID0gMDsgbiA8IE5VTV9CT09MRUFOUyh0cCk7IG4rKykKKyNkZWZpbmUgZm9yX2VhY2hfbnVtYmVyKG4sdHApICBmb3IobiA9IDA7IG4gPCBOVU1fTlVNQkVSUyh0cCk7ICBuKyspCisjZGVmaW5lIGZvcl9lYWNoX3N0cmluZyhuLHRwKSAgZm9yKG4gPSAwOyBuIDwgTlVNX1NUUklOR1ModHApOyAgbisrKQorCisjaWYgTkNVUlNFU19YTkFNRVMKKyNkZWZpbmUgZm9yX2VhY2hfZXh0X2Jvb2xlYW4obix0cCkgZm9yKG4gPSBCT09MQ09VTlQ7IG4gPCBOVU1fQk9PTEVBTlModHApOyBuKyspCisjZGVmaW5lIGZvcl9lYWNoX2V4dF9udW1iZXIobix0cCkgIGZvcihuID0gTlVNQ09VTlQ7IG4gPCBOVU1fTlVNQkVSUyh0cCk7ICBuKyspCisjZGVmaW5lIGZvcl9lYWNoX2V4dF9zdHJpbmcobix0cCkgIGZvcihuID0gU1RSQ09VTlQ7IG4gPCBOVU1fU1RSSU5HUyh0cCk7ICBuKyspCisjZW5kaWYKKworI2RlZmluZSBFeHRCb29sbmFtZSh0cCxpLG5hbWVzKSBFWFRfTkFNRVModHAsIGksIEJPT0xDT1VOVCwgKGkgLSAodHAtPm51bV9Cb29sZWFucyAtIHRwLT5leHRfQm9vbGVhbnMpKSwgbmFtZXMpCisjZGVmaW5lIEV4dE51bW5hbWUodHAsaSxuYW1lcykgIEVYVF9OQU1FUyh0cCwgaSwgTlVNQ09VTlQsIChpIC0gKHRwLT5udW1fTnVtYmVycyAtIHRwLT5leHRfTnVtYmVycykpICsgdHAtPmV4dF9Cb29sZWFucywgbmFtZXMpCisjZGVmaW5lIEV4dFN0cm5hbWUodHAsaSxuYW1lcykgIEVYVF9OQU1FUyh0cCwgaSwgU1RSQ09VTlQsIChpIC0gKHRwLT5udW1fU3RyaW5ncyAtIHRwLT5leHRfU3RyaW5ncykpICsgKHRwLT5leHRfTnVtYmVycyArIHRwLT5leHRfQm9vbGVhbnMpLCBuYW1lcykKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihFTlRSWSAqKSBfbmNfaGVhZDsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoRU5UUlkgKikgX25jX3RhaWw7CisjZGVmaW5lIGZvcl9lbnRyeV9saXN0KHFwKQlmb3IgKHFwID0gX25jX2hlYWQ7IHFwOyBxcCA9IHFwLT5uZXh0KQorCisjZGVmaW5lIE1BWF9MSU5FCTEzMgorCisjZGVmaW5lIE5VTExIT09LICAgICAgICAoYm9vbCgqKShFTlRSWSAqKSkwCisKKy8qCisgKiBOb3RlIHRoYXQgV0FOVEVEIGFuZCBQUkVTRU5UIGFyZSBub3Qgc2ltcGxlIGludmVyc2VzISAgSWYgYSBjYXBhYmlsaXR5CisgKiBoYXMgYmVlbiBleHBsaWNpdGx5IGNhbmNlbGxlZCwgaXQncyBub3QgY29uc2lkZXJlZCBXQU5URUQuCisgKi8KKyNkZWZpbmUgV0FOVEVEKHMpCSgocykgPT0gQUJTRU5UX1NUUklORykKKyNkZWZpbmUgUFJFU0VOVChzKQkoKChzKSAhPSBBQlNFTlRfU1RSSU5HKSAmJiAoKHMpICE9IENBTkNFTExFRF9TVFJJTkcpKQorCisjZGVmaW5lIEFORE1JU1NJTkcocCxxKSBcCisJCXtpZiAoUFJFU0VOVChwKSAmJiAhUFJFU0VOVChxKSkgX25jX3dhcm5pbmcoI3AgIiBidXQgbm8gIiAjcSk7fQorCisjZGVmaW5lIFBBSVJFRChwLHEpIFwKKwkJeyBcCisJCWlmIChQUkVTRU5UKHEpICYmICFQUkVTRU5UKHApKSBcCisJCQlfbmNfd2FybmluZygjcSAiIGJ1dCBubyAiICNwKTsgXAorCQlpZiAoUFJFU0VOVChwKSAmJiAhUFJFU0VOVChxKSkgXAorCQkJX25jX3dhcm5pbmcoI3AgIiBidXQgbm8gIiAjcSk7IFwKKwkJfQorCisvKiBhbGxvY19lbnRyeS5jOiBlbGVtZW50YXJ5IGFsbG9jYXRpb24gY29kZSAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEVOVFJZICopIF9uY19jb3B5X2VudHJ5IChFTlRSWSAqb2xkcCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfbmNfc2F2ZV9zdHIgKGNvbnN0IGNoYXIgKmNvbnN0KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfaW5pdF9lbnRyeSAoVEVSTVRZUEUgKmNvbnN0KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfbWVyZ2VfZW50cnkgKFRFUk1UWVBFICpjb25zdCwgVEVSTVRZUEUgKmNvbnN0KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfd3JhcF9lbnRyeSAoRU5UUlkgKmNvbnN0LCBib29sKTsKKworLyogYWxsb2NfdHR5cGUuYzogZWxlbWVudGFyeSBhbGxvY2F0aW9uIGNvZGUgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfYWxpZ25fdGVybXR5cGUgKFRFUk1UWVBFICosIFRFUk1UWVBFICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19jb3B5X3Rlcm10eXBlIChURVJNVFlQRSAqLCBURVJNVFlQRSAqKTsKKworLyogZnJlZV90dHlwZS5jOiBlbGVtZW50YXJ5IGFsbG9jYXRpb24gY29kZSAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19mcmVlX3Rlcm10eXBlIChURVJNVFlQRSAqKTsKKworLyogbGliX2Fjcy5jICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX2luaXRfYWNzICh2b2lkKTsJLyogY29ycmVzcG9uZHMgdG8gdHJhZGl0aW9uYWwgJ2luaXRfYWNzKCknICovCisKKy8qIGxpYl90ZXJtY2FwLmM6IHRyaW0gc2dyMCBzdHJpbmcgZm9yIHRlcm1jYXAgdXNlcnMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF9uY190cmltX3NncjAgKFRFUk1UWVBFICopOworCisvKiBwYXJzZV9lbnRyeS5jOiBlbnRyeS1wYXJzaW5nIGNvZGUgKi8KKyNpZiBOQ1VSU0VTX1hOQU1FUworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihib29sKSBfbmNfdXNlcl9kZWZpbmFibGU7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGJvb2wpIF9uY19kaXNhYmxlX3BlcmlvZDsKKyNlbmRpZgorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgX25jX3BhcnNlX2VudHJ5IChFTlRSWSAqLCBpbnQsIGJvb2wpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgX25jX2NhcGNtcCAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisvKiB3cml0ZV9lbnRyeS5jOiB3cml0aW5nIGFuIGVudHJ5IHRvIHRoZSBmaWxlIHN5c3RlbSAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19zZXRfd3JpdGVkaXIgKGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX3dyaXRlX2VudHJ5IChURVJNVFlQRSAqY29uc3QpOworCisvKiBjb21wX3BhcnNlLmM6IGVudHJ5IGxpc3QgaGFuZGxpbmcgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfcmVhZF9lbnRyeV9zb3VyY2UgKEZJTEUqLCBjaGFyKiwgaW50LCBib29sLCBib29sICgqKShFTlRSWSopKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBfbmNfZW50cnlfbWF0Y2ggKGNoYXIgKiwgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIF9uY19yZXNvbHZlX3VzZXMgKGJvb2wpOyAvKiBvYnMgMjAwNDA3MDUgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIF9uY19yZXNvbHZlX3VzZXMyIChib29sLCBib29sKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfZnJlZV9lbnRyaWVzIChFTlRSWSAqKTsKK2V4dGVybiBOQ1VSU0VTX0lNUEVYUCB2b2lkIE5DVVJTRVNfQVBJICgqX25jX2NoZWNrX3Rlcm10eXBlKShURVJNVFlQRSAqKTsgLyogb2JzIDIwMDQwNzA1ICovCitleHRlcm4gTkNVUlNFU19JTVBFWFAgdm9pZCBOQ1VSU0VTX0FQSSAoKl9uY19jaGVja190ZXJtdHlwZTIpKFRFUk1UWVBFICosIGJvb2wpOworCisvKiB0cmFjZV94bmFtZXMuYyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY190cmFjZV94bmFtZXMgKFRFUk1UWVBFICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTkNVUlNFU19URVJNX0VOVFJZX0hfaW5jbCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtY2FwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1jYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjc0NTFmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtY2FwLmgKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OCwyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBBdXRob3I6IFpleWQgTS4gQmVuLUhhbGltIDx6bWJlbmhhbEBuZXRjb20uY29tPiAxOTkyLDE5OTUgICAgICAgICAgICAgICAqCisgKiAgICAgYW5kOiBFcmljIFMuIFJheW1vbmQgPGVzckBzbmFyay50aHlyc3VzLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICRJZDogdGVybWNhcC5oLmluLHYgMS4xNiAyMDAxLzAzLzI0IDIxOjUzOjI3IHRvbSBFeHAgJCAqLworCisjaWZuZGVmIE5DVVJTRVNfVEVSTUNBUF9IX2luY2wKKyNkZWZpbmUgTkNVUlNFU19URVJNQ0FQX0hfaW5jbAkxCisKKyN1bmRlZiAgTkNVUlNFU19WRVJTSU9OCisjZGVmaW5lIE5DVVJTRVNfVkVSU0lPTiAiNS45IgorCisjaW5jbHVkZSA8bmN1cnNlc19kbGwuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjdW5kZWYgIE5DVVJTRVNfQ09OU1QgCisjZGVmaW5lIE5DVVJTRVNfQ09OU1QgY29uc3QgCisKKyN1bmRlZiAgTkNVUlNFU19PU1BFRUQgCisjZGVmaW5lIE5DVVJTRVNfT1NQRUVEIHNob3J0IAorCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGNoYXIpIFBDOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihjaGFyICopIFVQOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihjaGFyICopIEJDOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihOQ1VSU0VTX09TUEVFRCkgb3NwZWVkOyAKKworI2lmICFkZWZpbmVkKE5DVVJTRVNfVEVSTV9IX2luY2wpCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSB0Z2V0c3RyIChOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgY2hhciAqKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSB0Z290byAoY29uc3QgY2hhciAqLCBpbnQsIGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0Z2V0ZW50IChjaGFyICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0Z2V0ZmxhZyAoTkNVUlNFU19DT05TVCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdGdldG51bSAoTkNVUlNFU19DT05TVCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdHB1dHMgKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQgKCopKGludCkpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBOQ1VSU0VTX1RFUk1DQVBfSF9pbmNsICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1pby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTYxMGYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtaW8uaApAQCAtMCwwICsxLDYgQEAKKy8qIENvbXBhdGlibGUgPHRlcm1pby5oPiBmb3Igb2xkIGBzdHJ1Y3QgdGVybWlvJyBpb2N0bCBpbnRlcmZhY2UuCisgICBUaGlzIGlzIG9ic29sZXRlOyB1c2UgdGhlIFBPU0lYLjEgYHN0cnVjdCB0ZXJtaW9zJyBpbnRlcmZhY2UKKyAgIGRlZmluZWQgaW4gPHRlcm1pb3MuaD4gaW5zdGVhZC4gICovCisKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1pb3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybWlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZGU2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1pb3MuaApAQCAtMCwwICsxLDExMCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTQsMTk5Ni0xOTk5LDIwMDMsMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVBPU0lYIFN0YW5kYXJkOiA3LjEtMiBHZW5lcmFsIFRlcm1pbmFsIEludGVyZmFjZQk8dGVybWlvcy5oPgorICovCisKKyNpZm5kZWYJX1RFUk1JT1NfSAorI2RlZmluZQlfVEVSTUlPU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaWYgZGVmaW5lZCBfX1VTRV9VTklYOTggfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorLyogV2UgbmVlZCBgcGlkX3QnLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorIyBpZm5kZWYgX19waWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fcGlkX3QgcGlkX3Q7CisjICBkZWZpbmUgX19waWRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisvKiBHZXQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgb2YgYHN0cnVjdCB0ZXJtaW9zJywgYHRjZmxhZ190JywKKyAgIGBjY190JywgYHNwZWVkX3QnLCBhbmQgYWxsIHRoZSBtYWNyb3Mgc3BlY2lmeWluZyB0aGUgZmxhZyBiaXRzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3Rlcm1pb3MuaD4KKworI2lmZGVmIF9fVVNFX0JTRAorLyogQ29tcGFyZSBhIGNoYXJhY3RlciBDIHRvIGEgdmFsdWUgVkFMIGZyb20gdGhlIGBjX2NjJyBhcnJheSBpbiBhCisgICBgc3RydWN0IHRlcm1pb3MnLiAgSWYgVkFMIGlzIF9QT1NJWF9WRElTQUJMRSwgbm8gY2hhcmFjdGVyIGNhbiBtYXRjaCBpdC4gICovCisjIGRlZmluZSBDQ0VRKHZhbCwgYykJKChjKSA9PSAodmFsKSAmJiAodmFsKSAhPSBfUE9TSVhfVkRJU0FCTEUpCisjZW5kaWYKKworLyogUmV0dXJuIHRoZSBvdXRwdXQgYmF1ZCByYXRlIHN0b3JlZCBpbiAqVEVSTUlPU19QLiAgKi8KK2V4dGVybiBzcGVlZF90IGNmZ2V0b3NwZWVkIChfX2NvbnN0IHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1pb3NfcCkgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBpbnB1dCBiYXVkIHJhdGUgc3RvcmVkIGluICpURVJNSU9TX1AuICAqLworZXh0ZXJuIHNwZWVkX3QgY2ZnZXRpc3BlZWQgKF9fY29uc3Qgc3RydWN0IHRlcm1pb3MgKl9fdGVybWlvc19wKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIG91dHB1dCBiYXVkIHJhdGUgc3RvcmVkIGluICpURVJNSU9TX1AgdG8gU1BFRUQuICAqLworZXh0ZXJuIGludCBjZnNldG9zcGVlZCAoc3RydWN0IHRlcm1pb3MgKl9fdGVybWlvc19wLCBzcGVlZF90IF9fc3BlZWQpIF9fVEhST1c7CisKKy8qIFNldCB0aGUgaW5wdXQgYmF1ZCByYXRlIHN0b3JlZCBpbiAqVEVSTUlPU19QIHRvIFNQRUVELiAgKi8KK2V4dGVybiBpbnQgY2ZzZXRpc3BlZWQgKHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1pb3NfcCwgc3BlZWRfdCBfX3NwZWVkKSBfX1RIUk9XOworCisjaWZkZWYJX19VU0VfQlNECisvKiBTZXQgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBiYXVkIHJhdGVzIGluICpURVJNSU9TX09QIHRvIFNQRUVELiAgKi8KK2V4dGVybiBpbnQgY2ZzZXRzcGVlZCAoc3RydWN0IHRlcm1pb3MgKl9fdGVybWlvc19wLCBzcGVlZF90IF9fc3BlZWQpIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBQdXQgdGhlIHN0YXRlIG9mIEZEIGludG8gKlRFUk1JT1NfUC4gICovCitleHRlcm4gaW50IHRjZ2V0YXR0ciAoaW50IF9fZmQsIHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1pb3NfcCkgX19USFJPVzsKKworLyogU2V0IHRoZSBzdGF0ZSBvZiBGRCB0byAqVEVSTUlPU19QLgorICAgVmFsdWVzIGZvciBPUFRJT05BTF9BQ1RJT05TIChUQ1NBKikgYXJlIGluIDxiaXRzL3Rlcm1pb3MuaD4uICAqLworZXh0ZXJuIGludCB0Y3NldGF0dHIgKGludCBfX2ZkLCBpbnQgX19vcHRpb25hbF9hY3Rpb25zLAorCQkgICAgICBfX2NvbnN0IHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1pb3NfcCkgX19USFJPVzsKKworCisjaWZkZWYJX19VU0VfQlNECisvKiBTZXQgKlRFUk1JT1NfUCB0byBpbmRpY2F0ZSByYXcgbW9kZS4gICovCitleHRlcm4gdm9pZCBjZm1ha2VyYXcgKHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1pb3NfcCkgX19USFJPVzsKKyNlbmRpZgorCisvKiBTZW5kIHplcm8gYml0cyBvbiBGRC4gICovCitleHRlcm4gaW50IHRjc2VuZGJyZWFrIChpbnQgX19mZCwgaW50IF9fZHVyYXRpb24pIF9fVEhST1c7CisKKy8qIFdhaXQgZm9yIHBlbmRpbmcgb3V0cHV0IHRvIGJlIHdyaXR0ZW4gb24gRkQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCB0Y2RyYWluIChpbnQgX19mZCk7CisKKy8qIEZsdXNoIHBlbmRpbmcgZGF0YSBvbiBGRC4KKyAgIFZhbHVlcyBmb3IgUVVFVUVfU0VMRUNUT1IgKFRDe0ksTyxJT31GTFVTSCkgYXJlIGluIDxiaXRzL3Rlcm1pb3MuaD4uICAqLworZXh0ZXJuIGludCB0Y2ZsdXNoIChpbnQgX19mZCwgaW50IF9fcXVldWVfc2VsZWN0b3IpIF9fVEhST1c7CisKKy8qIFN1c3BlbmQgb3IgcmVzdGFydCB0cmFuc21pc3Npb24gb24gRkQuCisgICBWYWx1ZXMgZm9yIEFDVElPTiAoVENbSU9de09GRixPTn0pIGFyZSBpbiA8Yml0cy90ZXJtaW9zLmg+LiAgKi8KK2V4dGVybiBpbnQgdGNmbG93IChpbnQgX19mZCwgaW50IF9fYWN0aW9uKSBfX1RIUk9XOworCisKKyNpZmRlZiBfX1VTRV9VTklYOTgKKy8qIEdldCBwcm9jZXNzIGdyb3VwIElEIGZvciBzZXNzaW9uIGxlYWRlciBmb3IgY29udHJvbGxpbmcgdGVybWluYWwgRkQuICAqLworZXh0ZXJuIF9fcGlkX3QgdGNnZXRzaWQgKGludCBfX2ZkKSBfX1RIUk9XOworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0JTRAorIyBpbmNsdWRlIDxzeXMvdHR5ZGVmYXVsdHMuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogdGVybWlvcy5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS90Z21hdGguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGdtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmZGQyNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGdtYXRoLmgKQEAgLTAsMCArMSw0NTYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjIyIFR5cGUtZ2VuZXJpYyBtYXRoCTx0Z21hdGguaD4KKyAqLworCisjaWZuZGVmIF9UR01BVEhfSAorI2RlZmluZSBfVEdNQVRIX0gJMQorCisvKiBJbmNsdWRlIHRoZSBuZWVkZWQgaGVhZGVycy4gICovCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGNvbXBsZXguaD4KKworCisvKiBTaW5jZSBgY29tcGxleCcgaXMgY3VycmVudGx5IG5vdCByZWFsbHkgaW1wbGVtZW50ZWQgaW4gbW9zdCBDIGNvbXBpbGVycworICAgYW5kIGlmIGl0IGlzIGltcGxlbWVudGVkLCB0aGUgaW1wbGVtZW50YXRpb25zIGRpZmZlci4gIFRoaXMgbWFrZXMgaXQKKyAgIHF1aXRlIGRpZmZpY3VsdCB0byB3cml0ZSBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBoZWFkZXIuICBXZQorICAgZG8gbm90IHRyeSB0aGlzIGZvciBub3cgYW5kIGluc3RlYWQgY29uY2VudHJhdGUgb25seSBvbiBHTlUgQ0MuICBPbmNlCisgICB3ZSBoYXZlIG1vcmUgaW5mb3JtYXRpb24gc3VwcG9ydCBmb3Igb3RoZXIgY29tcGlsZXJzIG1pZ2h0IGZvbGxvdy4gICovCisKKyNpZiBfX0dOVUNfUFJFUkVRICgyLCA3KQorCisjIGlmZGVmIF9fTk9fTE9OR19ET1VCTEVfTUFUSAorIyAgZGVmaW5lIF9fdGdtbChmY3QpIGZjdAorIyBlbHNlCisjICBkZWZpbmUgX190Z21sKGZjdCkgZmN0ICMjIGwKKyMgZW5kaWYKKworLyogVGhpcyBpcyB1Z2x5IGJ1dCB1bmxlc3MgZ2NjIGdldHMgYXBwcm9wcmlhdGUgYnVpbHRpbnMgd2UgaGF2ZSB0byBkbworICAgc29tZXRoaW5nIGxpa2UgdGhpcy4gIERvbid0IGFzayBob3cgaXQgd29ya3MuICAqLworCisvKiAxIGlmICd0eXBlJyBpcyBhIGZsb2F0aW5nIHR5cGUsIDAgaWYgJ3R5cGUnIGlzIGFuIGludGVnZXIgdHlwZS4KKyAgIEFsbG93cyBmb3IgX0Jvb2wuICBFeHBhbmRzIHRvIGFuIGludGVnZXIgY29uc3RhbnQgZXhwcmVzc2lvbi4gICovCisjIGlmIF9fR05VQ19QUkVSRVEgKDMsIDEpCisjICBkZWZpbmUgX19mbG9hdGluZ190eXBlKHR5cGUpIFwKKyAgKF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlICgodHlwZSkgMCkgPT0gOCBcCisgICB8fCAoX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKCh0eXBlKSAwKSA9PSA5IFwKKyAgICAgICAmJiBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoX19yZWFsX18gKCh0eXBlKSAwKSkgPT0gOCkpCisjIGVsc2UKKyMgIGRlZmluZSBfX2Zsb2F0aW5nX3R5cGUodHlwZSkgKCgodHlwZSkgMC4yNSkgJiYgKCh0eXBlKSAwLjI1IC0gMSkpCisjIGVuZGlmCisKKy8qIFRoZSB0Z21hdGggcmVhbCB0eXBlIGZvciBULCB3aGVyZSBFIGlzIDAgaWYgVCBpcyBhbiBpbnRlZ2VyIHR5cGUgYW5kCisgICAxIGZvciBhIGZsb2F0aW5nIHR5cGUuICAqLworIyBkZWZpbmUgX190Z21hdGhfcmVhbF90eXBlX3N1YihULCBFKSBcCisgIF9fdHlwZW9mX18gKCooMCA/IChfX3R5cGVvZl9fICgwID8gKGRvdWJsZSAqKSAwIDogKHZvaWQgKikgKEUpKSkgMAkgICAgICBcCisJCSAgOiAoX190eXBlb2ZfXyAoMCA/IChUICopIDAgOiAodm9pZCAqKSAoIShFKSkpKSAwKSkKKworLyogVGhlIHRnbWF0aCByZWFsIHR5cGUgb2YgRVhQUi4gICovCisjIGRlZmluZSBfX3RnbWF0aF9yZWFsX3R5cGUoZXhwcikgXAorICBfX3RnbWF0aF9yZWFsX3R5cGVfc3ViIChfX3R5cGVvZl9fICgoX190eXBlb2ZfXyAoZXhwcikpIDApLAkJICAgICAgXAorCQkJICBfX2Zsb2F0aW5nX3R5cGUgKF9fdHlwZW9mX18gKGV4cHIpKSkKKworCisvKiBXZSBoYXZlIHR3byBraW5kcyBvZiBnZW5lcmljIG1hY3JvczogdG8gc3VwcG9ydCBmdW5jdGlvbnMgd2hpY2ggYXJlCisgICBvbmx5IGRlZmluZWQgb24gcmVhbCB2YWx1ZWQgcGFyYW1ldGVycyBhbmQgdGhvc2Ugd2hpY2ggYXJlIGRlZmluZWQKKyAgIGZvciBjb21wbGV4IGZ1bmN0aW9ucyBhcyB3ZWxsLiAgKi8KKyMgZGVmaW5lIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWShWYWwsIEZjdCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKHNpemVvZiAoVmFsKSA9PSBzaXplb2YgKGRvdWJsZSkJCQkgICAgICBcCisJCSAgICAgIHx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChWYWwpICE9IDgpCQkgICAgICBcCisJCSAgICAgPyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSBGY3QgKFZhbCkJCSAgICAgIFwKKwkJICAgICA6IChzaXplb2YgKFZhbCkgPT0gc2l6ZW9mIChmbG9hdCkpCQkJICAgICAgXAorCQkgICAgID8gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgRmN0IyNmIChWYWwpCQkgICAgICBcCisJCSAgICAgOiAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSBfX3RnbWwoRmN0KSAoVmFsKSkpCisKKyMgZGVmaW5lIF9fVEdNQVRIX1VOQVJZX1JFQUxfUkVUX09OTFkoVmFsLCBSZXRUeXBlLCBGY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKChzaXplb2YgKFZhbCkgPT0gc2l6ZW9mIChkb3VibGUpCQkJICAgICAgXAorCQkgICAgICB8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoVmFsKSAhPSA4KQkJICAgICAgXAorCQkgICAgID8gKFJldFR5cGUpIEZjdCAoVmFsKQkJCQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChWYWwpID09IHNpemVvZiAoZmxvYXQpKQkJCSAgICAgIFwKKwkJICAgICA/IChSZXRUeXBlKSBGY3QjI2YgKFZhbCkJCQkJICAgICAgXAorCQkgICAgIDogKFJldFR5cGUpIF9fdGdtbChGY3QpIChWYWwpKSkKKworIyBkZWZpbmUgX19UR01BVEhfQklOQVJZX0ZJUlNUX1JFQUxfT05MWShWYWwxLCBWYWwyLCBGY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKChzaXplb2YgKFZhbDEpID09IHNpemVvZiAoZG91YmxlKQkJCSAgICAgIFwKKwkJICAgICAgfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDEpICE9IDgpCQkgICAgICBcCisJCSAgICAgPyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgRmN0IChWYWwxLCBWYWwyKQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChWYWwxKSA9PSBzaXplb2YgKGZsb2F0KSkJCSAgICAgIFwKKwkJICAgICA/IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSBGY3QjI2YgKFZhbDEsIFZhbDIpCSAgICAgIFwKKwkJICAgICA6IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSBfX3RnbWwoRmN0KSAoVmFsMSwgVmFsMikpKQorCisjIGRlZmluZSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZKFZhbDEsIFZhbDIsIEZjdCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKChzaXplb2YgKFZhbDEpID4gc2l6ZW9mIChkb3VibGUpCQkJICAgICAgXAorCQkgICAgICAgfHwgc2l6ZW9mIChWYWwyKSA+IHNpemVvZiAoZG91YmxlKSkJCSAgICAgIFwKKwkJICAgICAgJiYgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKChWYWwxKSArIChWYWwyKSkgPT0gOCkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCQkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJICAgICAgIF9fdGdtbChGY3QpIChWYWwxLCBWYWwyKQkJCQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChWYWwxKSA9PSBzaXplb2YgKGRvdWJsZSkJCSAgICAgIFwKKwkJCXx8IHNpemVvZiAoVmFsMikgPT0gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCQl8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoVmFsMSkgIT0gOAkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDIpICE9IDgpCQkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCQkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJICAgICAgIEZjdCAoVmFsMSwgVmFsMikJCQkJCSAgICAgIFwKKwkJICAgICA6IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwKSkJICAgICAgXAorCQkgICAgICAgRmN0IyNmIChWYWwxLCBWYWwyKSkpCisKKyMgZGVmaW5lIF9fVEdNQVRIX1RFUk5BUllfRklSU1RfU0VDT05EX1JFQUxfT05MWShWYWwxLCBWYWwyLCBWYWwzLCBGY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKCgoc2l6ZW9mIChWYWwxKSA+IHNpemVvZiAoZG91YmxlKQkJCSAgICAgIFwKKwkJICAgICAgIHx8IHNpemVvZiAoVmFsMikgPiBzaXplb2YgKGRvdWJsZSkpCQkgICAgICBcCisJCSAgICAgICYmIF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlICgoVmFsMSkgKyAoVmFsMikpID09IDgpICAgICAgXAorCQkgICAgID8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCSAgICAgICBfX3RnbWwoRmN0KSAoVmFsMSwgVmFsMiwgVmFsMykJCQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChWYWwxKSA9PSBzaXplb2YgKGRvdWJsZSkJCSAgICAgIFwKKwkJCXx8IHNpemVvZiAoVmFsMikgPT0gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCQl8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoVmFsMSkgIT0gOAkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDIpICE9IDgpCQkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCQkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJICAgICAgIEZjdCAoVmFsMSwgVmFsMiwgVmFsMykJCQkJICAgICAgXAorCQkgICAgIDogKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCSAgICAgICBGY3QjI2YgKFZhbDEsIFZhbDIsIFZhbDMpKSkKKworIyBkZWZpbmUgX19UR01BVEhfVEVSTkFSWV9SRUFMX09OTFkoVmFsMSwgVmFsMiwgVmFsMywgRmN0KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICgoKHNpemVvZiAoVmFsMSkgPiBzaXplb2YgKGRvdWJsZSkJCQkgICAgICBcCisJCSAgICAgICB8fCBzaXplb2YgKFZhbDIpID4gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCSAgICAgICB8fCBzaXplb2YgKFZhbDMpID4gc2l6ZW9mIChkb3VibGUpKQkJICAgICAgXAorCQkgICAgICAmJiBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoKFZhbDEpICsgKFZhbDIpICsgKFZhbDMpKSAgIFwKKwkJCSA9PSA4KQkJCQkJCSAgICAgIFwKKwkJICAgICA/IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDMpKSAwKSkJICAgICAgXAorCQkgICAgICAgX190Z21sKEZjdCkgKFZhbDEsIFZhbDIsIFZhbDMpCQkJICAgICAgXAorCQkgICAgIDogKHNpemVvZiAoVmFsMSkgPT0gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCQl8fCBzaXplb2YgKFZhbDIpID09IHNpemVvZiAoZG91YmxlKQkJICAgICAgXAorCQkJfHwgc2l6ZW9mIChWYWwzKSA9PSBzaXplb2YgKGRvdWJsZSkJCSAgICAgIFwKKwkJCXx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChWYWwxKSAhPSA4CQkgICAgICBcCisJCQl8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoVmFsMikgIT0gOAkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDMpICE9IDgpCQkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCQkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwzKSkgMCkpCSAgICAgIFwKKwkJICAgICAgIEZjdCAoVmFsMSwgVmFsMiwgVmFsMykJCQkJICAgICAgXAorCQkgICAgIDogKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDAJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMykpIDApKQkgICAgICBcCisJCSAgICAgICBGY3QjI2YgKFZhbDEsIFZhbDIsIFZhbDMpKSkKKworLyogWFhYIFRoaXMgZGVmaW5pdGlvbiBoYXMgdG8gYmUgY2hhbmdlZCBhcyBzb29uIGFzIHRoZSBjb21waWxlciB1bmRlcnN0YW5kcworICAgdGhlIGltYWdpbmFyeSBrZXl3b3JkLiAgKi8KKyMgZGVmaW5lIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyhWYWwsIEZjdCwgQ2ZjdCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKHNpemVvZiAoX19yZWFsX18gKFZhbCkpID09IHNpemVvZiAoZG91YmxlKQkgICAgICBcCisJCSAgICAgIHx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChfX3JlYWxfXyAoVmFsKSkgIT0gOCkJICAgICAgXAorCQkgICAgID8gKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKFZhbCkpCSAgICAgIFwKKwkJCT8gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgRmN0IChWYWwpCQkgICAgICBcCisJCQk6IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIENmY3QgKFZhbCkpCSAgICAgIFwKKwkJICAgICA6IChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKGZsb2F0KSkJICAgICAgXAorCQkgICAgID8gKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKFZhbCkpCSAgICAgIFwKKwkJCT8gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgRmN0IyNmIChWYWwpCSAgICAgIFwKKwkJCTogKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgQ2ZjdCMjZiAoVmFsKSkJICAgICAgXAorCQkgICAgIDogKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKFZhbCkpCSAgICAgIFwKKwkJCT8gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgX190Z21sKEZjdCkgKFZhbCkJICAgICAgXAorCQkJOiAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSBfX3RnbWwoQ2ZjdCkgKFZhbCkpKSkKKworIyBkZWZpbmUgX19UR01BVEhfVU5BUllfSU1BRyhWYWwsIENmY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKGRvdWJsZSkJICAgICAgXAorCQkgICAgICB8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoX19yZWFsX18gKFZhbCkpICE9IDgpCSAgICAgIFwKKwkJICAgICA/IChfX3R5cGVvZl9fICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwCSAgICAgIFwKKwkJCQkgICAgKyBfQ29tcGxleF9JKSkgQ2ZjdCAoVmFsKQkJICAgICAgXAorCQkgICAgIDogKHNpemVvZiAoX19yZWFsX18gKFZhbCkpID09IHNpemVvZiAoZmxvYXQpKQkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2ZfXyAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgMAkgICAgICBcCisJCQkJICAgICsgX0NvbXBsZXhfSSkpIENmY3QjI2YgKFZhbCkJICAgICAgXAorCQkgICAgIDogKF9fdHlwZW9mX18gKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIDAJICAgICAgXAorCQkJCSAgICArIF9Db21wbGV4X0kpKSBfX3RnbWwoQ2ZjdCkgKFZhbCkpKQorCisvKiBYWFggVGhpcyBkZWZpbml0aW9uIGhhcyB0byBiZSBjaGFuZ2VkIGFzIHNvb24gYXMgdGhlIGNvbXBpbGVyIHVuZGVyc3RhbmRzCisgICB0aGUgaW1hZ2luYXJ5IGtleXdvcmQuICAqLworIyBkZWZpbmUgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHX1JFVF9SRUFMKFZhbCwgRmN0LCBDZmN0KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChkb3VibGUpCSAgICAgIFwKKwkJICAgICAgfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKF9fcmVhbF9fIChWYWwpKSAhPSA4KQkgICAgICBcCisJCSAgICAgPyAoKHNpemVvZiAoX19yZWFsX18gKFZhbCkpID09IHNpemVvZiAoVmFsKSkJICAgICAgXAorCQkJPyAoX190eXBlb2ZfXyAoX19yZWFsX18gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgMCkpXAorCQkJICBGY3QgKFZhbCkJCQkJCSAgICAgIFwKKwkJCTogKF9fdHlwZW9mX18gKF9fcmVhbF9fIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIDApKVwKKwkJCSAgQ2ZjdCAoVmFsKSkJCQkJCSAgICAgIFwKKwkJICAgICA6IChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKGZsb2F0KSkJICAgICAgXAorCQkgICAgID8gKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKFZhbCkpCSAgICAgIFwKKwkJCT8gKF9fdHlwZW9mX18gKF9fcmVhbF9fIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIDApKVwKKwkJCSAgRmN0IyNmIChWYWwpCQkJCQkgICAgICBcCisJCQk6IChfX3R5cGVvZl9fIChfX3JlYWxfXyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwKSlcCisJCQkgIENmY3QjI2YgKFZhbCkpCQkJCSAgICAgIFwKKwkJICAgICA6ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChWYWwpKQkgICAgICBcCisJCQk/IChfX3R5cGVvZl9fIChfX3JlYWxfXyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwKSlcCisJCQkgIF9fdGdtbChGY3QpIChWYWwpCQkJCSAgICAgIFwKKwkJCTogKF9fdHlwZW9mX18gKF9fcmVhbF9fIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIDApKVwKKwkJCSAgX190Z21sKENmY3QpIChWYWwpKSkpCisKKy8qIFhYWCBUaGlzIGRlZmluaXRpb24gaGFzIHRvIGJlIGNoYW5nZWQgYXMgc29vbiBhcyB0aGUgY29tcGlsZXIgdW5kZXJzdGFuZHMKKyAgIHRoZSBpbWFnaW5hcnkga2V5d29yZC4gICovCisjIGRlZmluZSBfX1RHTUFUSF9CSU5BUllfUkVBTF9JTUFHKFZhbDEsIFZhbDIsIEZjdCwgQ2ZjdCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKChzaXplb2YgKF9fcmVhbF9fIChWYWwxKSkgPiBzaXplb2YgKGRvdWJsZSkJICAgICAgXAorCQkgICAgICAgfHwgc2l6ZW9mIChfX3JlYWxfXyAoVmFsMikpID4gc2l6ZW9mIChkb3VibGUpKQkgICAgICBcCisJCSAgICAgICYmIF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChfX3JlYWxfXyAoVmFsMSkJICAgICAgXAorCQkJCQkJICArIF9fcmVhbF9fIChWYWwyKSkgPT0gOCkgICAgXAorCQkgICAgID8gKChzaXplb2YgKF9fcmVhbF9fIChWYWwxKSkgPT0gc2l6ZW9mIChWYWwxKQkgICAgICBcCisJCQkgJiYgc2l6ZW9mIChfX3JlYWxfXyAoVmFsMikpID09IHNpemVvZiAoVmFsMikpCSAgICAgIFwKKwkJCT8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJCSAgX190Z21sKEZjdCkgKFZhbDEsIFZhbDIpCQkJICAgICAgXAorCQkJOiAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwKSkJICAgICAgXAorCQkJICBfX3RnbWwoQ2ZjdCkgKFZhbDEsIFZhbDIpKQkJCSAgICAgIFwKKwkJICAgICA6IChzaXplb2YgKF9fcmVhbF9fIChWYWwxKSkgPT0gc2l6ZW9mIChkb3VibGUpCSAgICAgIFwKKwkJCXx8IHNpemVvZiAoX19yZWFsX18gKFZhbDIpKSA9PSBzaXplb2YgKGRvdWJsZSkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKF9fcmVhbF9fIChWYWwxKSkgIT0gOCAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKF9fcmVhbF9fIChWYWwyKSkgIT0gOCkgICAgXAorCQkgICAgID8gKChzaXplb2YgKF9fcmVhbF9fIChWYWwxKSkgPT0gc2l6ZW9mIChWYWwxKQkgICAgICBcCisJCQkgJiYgc2l6ZW9mIChfX3JlYWxfXyAoVmFsMikpID09IHNpemVvZiAoVmFsMikpCSAgICAgIFwKKwkJCT8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJCSAgRmN0IChWYWwxLCBWYWwyKQkJCQkgICAgICBcCisJCQk6IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCQkgIENmY3QgKFZhbDEsIFZhbDIpKQkJCQkgICAgICBcCisJCSAgICAgOiAoKHNpemVvZiAoX19yZWFsX18gKFZhbDEpKSA9PSBzaXplb2YgKFZhbDEpCSAgICAgIFwKKwkJCSAmJiBzaXplb2YgKF9fcmVhbF9fIChWYWwyKSkgPT0gc2l6ZW9mIChWYWwyKSkJICAgICAgXAorCQkJPyAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwKSkJICAgICAgXAorCQkJICBGY3QjI2YgKFZhbDEsIFZhbDIpCQkJCSAgICAgIFwKKwkJCTogKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJCSAgQ2ZjdCMjZiAoVmFsMSwgVmFsMikpKSkKKyNlbHNlCisjIGVycm9yICJVbnN1cHBvcnRlZCBjb21waWxlcjsgeW91IGNhbm5vdCB1c2UgPHRnbWF0aC5oPiIKKyNlbmRpZgorCisKKy8qIFVuYXJ5IGZ1bmN0aW9ucyBkZWZpbmVkIGZvciByZWFsIGFuZCBjb21wbGV4IHZhbHVlcy4gICovCisKKworLyogVHJpZ29ub21ldHJpYyBmdW5jdGlvbnMuICAqLworCisvKiBBcmMgY29zaW5lIG9mIFguICAqLworI2RlZmluZSBhY29zKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIGFjb3MsIGNhY29zKQorLyogQXJjIHNpbmUgb2YgWC4gICovCisjZGVmaW5lIGFzaW4oVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgYXNpbiwgY2FzaW4pCisvKiBBcmMgdGFuZ2VudCBvZiBYLiAgKi8KKyNkZWZpbmUgYXRhbihWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBhdGFuLCBjYXRhbikKKy8qIEFyYyB0YW5nZW50IG9mIFkvWC4gICovCisjZGVmaW5lIGF0YW4yKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGF0YW4yKQorCisvKiBDb3NpbmUgb2YgWC4gICovCisjZGVmaW5lIGNvcyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBjb3MsIGNjb3MpCisvKiBTaW5lIG9mIFguICAqLworI2RlZmluZSBzaW4oVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgc2luLCBjc2luKQorLyogVGFuZ2VudCBvZiBYLiAgKi8KKyNkZWZpbmUgdGFuKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIHRhbiwgY3RhbikKKworCisvKiBIeXBlcmJvbGljIGZ1bmN0aW9ucy4gICovCisKKy8qIEh5cGVyYm9saWMgYXJjIGNvc2luZSBvZiBYLiAgKi8KKyNkZWZpbmUgYWNvc2goVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgYWNvc2gsIGNhY29zaCkKKy8qIEh5cGVyYm9saWMgYXJjIHNpbmUgb2YgWC4gICovCisjZGVmaW5lIGFzaW5oKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIGFzaW5oLCBjYXNpbmgpCisvKiBIeXBlcmJvbGljIGFyYyB0YW5nZW50IG9mIFguICAqLworI2RlZmluZSBhdGFuaChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBhdGFuaCwgY2F0YW5oKQorCisvKiBIeXBlcmJvbGljIGNvc2luZSBvZiBYLiAgKi8KKyNkZWZpbmUgY29zaChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBjb3NoLCBjY29zaCkKKy8qIEh5cGVyYm9saWMgc2luZSBvZiBYLiAgKi8KKyNkZWZpbmUgc2luaChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBzaW5oLCBjc2luaCkKKy8qIEh5cGVyYm9saWMgdGFuZ2VudCBvZiBYLiAgKi8KKyNkZWZpbmUgdGFuaChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCB0YW5oLCBjdGFuaCkKKworCisvKiBFeHBvbmVudGlhbCBhbmQgbG9nYXJpdGhtaWMgZnVuY3Rpb25zLiAgKi8KKworLyogRXhwb25lbnRpYWwgZnVuY3Rpb24gb2YgWC4gICovCisjZGVmaW5lIGV4cChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBleHAsIGNleHApCisKKy8qIEJyZWFrIFZBTFVFIGludG8gYSBub3JtYWxpemVkIGZyYWN0aW9uIGFuZCBhbiBpbnRlZ3JhbCBwb3dlciBvZiAyLiAgKi8KKyNkZWZpbmUgZnJleHAoVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX0ZJUlNUX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgZnJleHApCisKKy8qIFggdGltZXMgKHR3byB0byB0aGUgRVhQIHBvd2VyKS4gICovCisjZGVmaW5lIGxkZXhwKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9GSVJTVF9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGxkZXhwKQorCisvKiBOYXR1cmFsIGxvZ2FyaXRobSBvZiBYLiAgKi8KKyNkZWZpbmUgbG9nKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIGxvZywgY2xvZykKKworLyogQmFzZS10ZW4gbG9nYXJpdGhtIG9mIFguICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgbG9nMTAoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgbG9nMTAsIF9fY2xvZzEwKQorI2Vsc2UKKyMgZGVmaW5lIGxvZzEwKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGxvZzEwKQorI2VuZGlmCisKKy8qIFJldHVybiBleHAoWCkgLSAxLiAgKi8KKyNkZWZpbmUgZXhwbTEoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgZXhwbTEpCisKKy8qIFJldHVybiBsb2coMSArIFgpLiAgKi8KKyNkZWZpbmUgbG9nMXAoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgbG9nMXApCisKKy8qIFJldHVybiB0aGUgYmFzZSAyIHNpZ25lZCBpbnRlZ3JhbCBleHBvbmVudCBvZiBYLiAgKi8KKyNkZWZpbmUgbG9nYihWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBsb2diKQorCisvKiBDb21wdXRlIGJhc2UtMiBleHBvbmVudGlhbCBvZiBYLiAgKi8KKyNkZWZpbmUgZXhwMihWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBleHAyKQorCisvKiBDb21wdXRlIGJhc2UtMiBsb2dhcml0aG0gb2YgWC4gICovCisjZGVmaW5lIGxvZzIoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgbG9nMikKKworCisvKiBQb3dlciBmdW5jdGlvbnMuICAqLworCisvKiBSZXR1cm4gWCB0byB0aGUgWSBwb3dlci4gICovCisjZGVmaW5lIHBvdyhWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9JTUFHIChWYWwxLCBWYWwyLCBwb3csIGNwb3cpCisKKy8qIFJldHVybiB0aGUgc3F1YXJlIHJvb3Qgb2YgWC4gICovCisjZGVmaW5lIHNxcnQoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgc3FydCwgY3NxcnQpCisKKy8qIFJldHVybiBgc3FydChYKlggKyBZKlkpJy4gICovCisjZGVmaW5lIGh5cG90KFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGh5cG90KQorCisvKiBSZXR1cm4gdGhlIGN1YmUgcm9vdCBvZiBYLiAgKi8KKyNkZWZpbmUgY2JydChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBjYnJ0KQorCisKKy8qIE5lYXJlc3QgaW50ZWdlciwgYWJzb2x1dGUgdmFsdWUsIGFuZCByZW1haW5kZXIgZnVuY3Rpb25zLiAgKi8KKworLyogU21hbGxlc3QgaW50ZWdyYWwgdmFsdWUgbm90IGxlc3MgdGhhbiBYLiAgKi8KKyNkZWZpbmUgY2VpbChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBjZWlsKQorCisvKiBBYnNvbHV0ZSB2YWx1ZSBvZiBYLiAgKi8KKyNkZWZpbmUgZmFicyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BR19SRVRfUkVBTCAoVmFsLCBmYWJzLCBjYWJzKQorCisvKiBMYXJnZXN0IGludGVnZXIgbm90IGdyZWF0ZXIgdGhhbiBYLiAgKi8KKyNkZWZpbmUgZmxvb3IoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgZmxvb3IpCisKKy8qIEZsb2F0aW5nLXBvaW50IG1vZHVsbyByZW1haW5kZXIgb2YgWC9ZLiAgKi8KKyNkZWZpbmUgZm1vZChWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBmbW9kKQorCisvKiBSb3VuZCBYIHRvIGludGVncmFsIHZhbHVlaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IHVzaW5nIGN1cnJlbnQKKyAgIHJvdW5kaW5nIGRpcmVjdGlvbiwgYnV0IGRvIG5vdCByYWlzZSBpbmV4YWN0IGV4Y2VwdGlvbi4gICovCisjZGVmaW5lIG5lYXJieWludChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBuZWFyYnlpbnQpCisKKy8qIFJvdW5kIFggdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZSwgcm91bmRpbmcgaGFsZndheSBjYXNlcyBhd2F5IGZyb20KKyAgIHplcm8uICAqLworI2RlZmluZSByb3VuZChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCByb3VuZCkKKworLyogUm91bmQgWCB0byB0aGUgaW50ZWdyYWwgdmFsdWUgaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IG5lYXJlc3QgYnV0CisgICBub3QgbGFyZ2VyIGluIG1hZ25pdHVkZS4gICovCisjZGVmaW5lIHRydW5jKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIHRydW5jKQorCisvKiBDb21wdXRlIHJlbWFpbmRlciBvZiBYIGFuZCBZIGFuZCBwdXQgaW4gKlFVTyBhIHZhbHVlIHdpdGggc2lnbiBvZiB4L3kKKyAgIGFuZCBtYWduaXR1ZGUgY29uZ3J1ZW50IGBtb2QgMl5uJyB0byB0aGUgbWFnbml0dWRlIG9mIHRoZSBpbnRlZ3JhbAorICAgcXVvdGllbnQgeC95LCB3aXRoIG4gPj0gMy4gICovCisjZGVmaW5lIHJlbXF1byhWYWwxLCBWYWwyLCBWYWwzKSBcCisgICAgIF9fVEdNQVRIX1RFUk5BUllfRklSU1RfU0VDT05EX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgVmFsMywgcmVtcXVvKQorCisvKiBSb3VuZCBYIHRvIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUgYWNjb3JkaW5nIHRvIGN1cnJlbnQgcm91bmRpbmcKKyAgIGRpcmVjdGlvbi4gICovCisjZGVmaW5lIGxyaW50KFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9SRVRfT05MWSAoVmFsLCBsb25nIGludCwgbHJpbnQpCisjZGVmaW5lIGxscmludChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfUkVUX09OTFkgKFZhbCwgbG9uZyBsb25nIGludCwgbGxyaW50KQorCisvKiBSb3VuZCBYIHRvIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUsIHJvdW5kaW5nIGhhbGZ3YXkgY2FzZXMgYXdheSBmcm9tCisgICB6ZXJvLiAgKi8KKyNkZWZpbmUgbHJvdW5kKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9SRVRfT05MWSAoVmFsLCBsb25nIGludCwgbHJvdW5kKQorI2RlZmluZSBsbHJvdW5kKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9SRVRfT05MWSAoVmFsLCBsb25nIGxvbmcgaW50LCBsbHJvdW5kKQorCisKKy8qIFJldHVybiBYIHdpdGggaXRzIHNpZ25lZCBjaGFuZ2VkIHRvIFkncy4gICovCisjZGVmaW5lIGNvcHlzaWduKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGNvcHlzaWduKQorCisvKiBFcnJvciBhbmQgZ2FtbWEgZnVuY3Rpb25zLiAgKi8KKyNkZWZpbmUgZXJmKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGVyZikKKyNkZWZpbmUgZXJmYyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBlcmZjKQorI2RlZmluZSB0Z2FtbWEoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgdGdhbW1hKQorI2RlZmluZSBsZ2FtbWEoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgbGdhbW1hKQorCisKKy8qIFJldHVybiB0aGUgaW50ZWdlciBuZWFyZXN0IFggaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUKKyAgIHByZXZhaWxpbmcgcm91bmRpbmcgbW9kZS4gICovCisjZGVmaW5lIHJpbnQoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgcmludCkKKworLyogUmV0dXJuIFggKyBlcHNpbG9uIGlmIFggPCBZLCBYIC0gZXBzaWxvbiBpZiBYID4gWS4gICovCisjZGVmaW5lIG5leHRhZnRlcihWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBuZXh0YWZ0ZXIpCisjZGVmaW5lIG5leHR0b3dhcmQoVmFsMSwgVmFsMikgXAorICAgICBfX1RHTUFUSF9CSU5BUllfRklSU1RfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBuZXh0dG93YXJkKQorCisvKiBSZXR1cm4gdGhlIHJlbWFpbmRlciBvZiBpbnRlZ2VyIGRpdmlzb24gWCAvIFkgd2l0aCBpbmZpbml0ZSBwcmVjaXNpb24uICAqLworI2RlZmluZSByZW1haW5kZXIoVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgcmVtYWluZGVyKQorCisvKiBSZXR1cm4gWCB0aW1lcyAoMiB0byB0aGUgTnRoIHBvd2VyKS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKyMgZGVmaW5lIHNjYWxiKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIHNjYWxiKQorI2VuZGlmCisKKy8qIFJldHVybiBYIHRpbWVzICgyIHRvIHRoZSBOdGggcG93ZXIpLiAgKi8KKyNkZWZpbmUgc2NhbGJuKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9GSVJTVF9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIHNjYWxibikKKworLyogUmV0dXJuIFggdGltZXMgKDIgdG8gdGhlIE50aCBwb3dlcikuICAqLworI2RlZmluZSBzY2FsYmxuKFZhbDEsIFZhbDIpIFwKKyAgICAgX19UR01BVEhfQklOQVJZX0ZJUlNUX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgc2NhbGJsbikKKworLyogUmV0dXJuIHRoZSBiaW5hcnkgZXhwb25lbnQgb2YgWCwgd2hpY2ggbXVzdCBiZSBub256ZXJvLiAgKi8KKyNkZWZpbmUgaWxvZ2IoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX1JFVF9PTkxZIChWYWwsIGludCwgaWxvZ2IpCisKKworLyogUmV0dXJuIHBvc2l0aXZlIGRpZmZlcmVuY2UgYmV0d2VlbiBYIGFuZCBZLiAgKi8KKyNkZWZpbmUgZmRpbShWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBmZGltKQorCisvKiBSZXR1cm4gbWF4aW11bSBudW1lcmljIHZhbHVlIGZyb20gWCBhbmQgWS4gICovCisjZGVmaW5lIGZtYXgoVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgZm1heCkKKworLyogUmV0dXJuIG1pbmltdW0gbnVtZXJpYyB2YWx1ZSBmcm9tIFggYW5kIFkuICAqLworI2RlZmluZSBmbWluKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGZtaW4pCisKKworLyogTXVsdGlwbHktYWRkIGZ1bmN0aW9uIGNvbXB1dGVkIGFzIGEgdGVybmFyeSBvcGVyYXRpb24uICAqLworI2RlZmluZSBmbWEoVmFsMSwgVmFsMiwgVmFsMykgXAorICAgICBfX1RHTUFUSF9URVJOQVJZX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgVmFsMywgZm1hKQorCisKKy8qIEFic29sdXRlIHZhbHVlLCBjb25qdWdhdGVzLCBhbmQgcHJvamVjdGlvbi4gICovCisKKy8qIEFyZ3VtZW50IHZhbHVlIG9mIFouICAqLworI2RlZmluZSBjYXJnKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHX1JFVF9SRUFMIChWYWwsIGNhcmcsIGNhcmcpCisKKy8qIENvbXBsZXggY29uanVnYXRlIG9mIFouICAqLworI2RlZmluZSBjb25qKFZhbCkgX19UR01BVEhfVU5BUllfSU1BRyAoVmFsLCBjb25qKQorCisvKiBQcm9qZWN0aW9uIG9mIFogb250byB0aGUgUmllbWFubiBzcGhlcmUuICAqLworI2RlZmluZSBjcHJvaihWYWwpIF9fVEdNQVRIX1VOQVJZX0lNQUcgKFZhbCwgY3Byb2opCisKKworLyogRGVjb21wb3NpbmcgY29tcGxleCB2YWx1ZXMuICAqLworCisvKiBJbWFnaW5hcnkgcGFydCBvZiBaLiAgKi8KKyNkZWZpbmUgY2ltYWcoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUdfUkVUX1JFQUwgKFZhbCwgY2ltYWcsIGNpbWFnKQorCisvKiBSZWFsIHBhcnQgb2YgWi4gICovCisjZGVmaW5lIGNyZWFsKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHX1JFVF9SRUFMIChWYWwsIGNyZWFsLCBjcmVhbCkKKworI2VuZGlmIC8qIHRnbWF0aC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3RocmVhZF9kYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS90aHJlYWRfZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzNiNTRmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS90aHJlYWRfZGIuaApAQCAtMCwwICsxLDQ1OSBAQAorLyogdGhyZWFkX2RiLmggLS0gaW50ZXJmYWNlIHRvIGxpYnRocmVhZF9kYi5zbyBsaWJyYXJ5IGZvciBkZWJ1Z2dpbmcgLWxwdGhyZWFkCisgICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMSwyMDAyLDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1RIUkVBRF9EQl9ICisjZGVmaW5lIF9USFJFQURfREJfSAkxCisKKy8qIFRoaXMgaXMgdGhlIGRlYnVnZ2VyIGludGVyZmFjZSBmb3IgdGhlIE5QVEwgbGlicmFyeS4gIEl0IGlzCisgICBtb2RlbGxlZCBjbG9zZWx5IGFmdGVyIHRoZSBpbnRlcmZhY2Ugd2l0aCBzYW1lIG5hbWVzIGluIFNvbGFyaXMKKyAgIHdpdGggdGhlIGdvYWwgdG8gc2hhcmUgdGhlIHNhbWUgY29kZSBpbiB0aGUgZGVidWdnZXIuICAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CisKKworLyogRXJyb3IgY29kZXMgb2YgdGhlIGxpYnJhcnkuICAqLwordHlwZWRlZiBlbnVtCit7CisgIFREX09LLAkgIC8qIE5vIGVycm9yLiAgKi8KKyAgVERfRVJSLAkgIC8qIE5vIGZ1cnRoZXIgc3BlY2lmaWVkIGVycm9yLiAgKi8KKyAgVERfTk9USFIsCSAgLyogTm8gbWF0Y2hpbmcgdGhyZWFkIGZvdW5kLiAgKi8KKyAgVERfTk9TViwJICAvKiBObyBtYXRjaGluZyBzeW5jaHJvbml6YXRpb24gaGFuZGxlIGZvdW5kLiAgKi8KKyAgVERfTk9MV1AsCSAgLyogTm8gbWF0Y2hpbmcgbGlnaHQtd2VpZ2h0ZWQgcHJvY2VzcyBmb3VuZC4gICovCisgIFREX0JBRFBILAkgIC8qIEludmFsaWQgcHJvY2VzcyBoYW5kbGUuICAqLworICBURF9CQURUSCwJICAvKiBJbnZhbGlkIHRocmVhZCBoYW5kbGUuICAqLworICBURF9CQURTSCwJICAvKiBJbnZhbGlkIHN5bmNocm9uaXphdGlvbiBoYW5kbGUuICAqLworICBURF9CQURUQSwJICAvKiBJbnZhbGlkIHRocmVhZCBhZ2VudC4gICovCisgIFREX0JBREtFWSwJICAvKiBJbnZhbGlkIGtleS4gICovCisgIFREX05PTVNHLAkgIC8qIE5vIGV2ZW50IGF2YWlsYWJsZS4gICovCisgIFREX05PRlBSRUdTLAkgIC8qIE5vIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIGNvbnRlbnQgYXZhaWxhYmxlLiAgKi8KKyAgVERfTk9MSUJUSFJFQUQsIC8qIEFwcGxpY2F0aW9uIG5vdCBsaW5rZWQgd2l0aCB0aHJlYWQgbGlicmFyeS4gICovCisgIFREX05PRVZFTlQsCSAgLyogUmVxdWVzdGVkIGV2ZW50IGlzIG5vdCBzdXBwb3J0ZWQuICAqLworICBURF9OT0NBUEFCLAkgIC8qIENhcGFiaWxpdHkgbm90IGF2YWlsYWJsZS4gICovCisgIFREX0RCRVJSLAkgIC8qIEludGVybmFsIGRlYnVnIGxpYnJhcnkgZXJyb3IuICAqLworICBURF9OT0FQTElDLAkgIC8qIE9wZXJhdGlvbiBpcyBub3QgYXBwbGljYWJsZS4gICovCisgIFREX05PVFNELAkgIC8qIE5vIHRocmVhZC1zcGVjaWZpYyBkYXRhIGF2YWlsYWJsZS4gICovCisgIFREX01BTExPQywJICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8KKyAgVERfUEFSVElBTFJFRywgIC8qIE5vdCBlbnRpcmUgcmVnaXN0ZXIgc2V0IHdhcyByZWFkIG9yIHdyaXR0ZW4uICAqLworICBURF9OT1hSRUdTLAkgIC8qIFggcmVnaXN0ZXIgc2V0IG5vdCBhdmFpbGFibGUgZm9yIGdpdmVuIHRocmVhZC4gICovCisgIFREX1RMU0RFRkVSLAkgIC8qIFRocmVhZCBoYXMgbm90IHlldCBhbGxvY2F0ZWQgVExTIGZvciBnaXZlbiBtb2R1bGUuICAqLworICBURF9OT1RBTExPQyA9IFREX1RMU0RFRkVSLAorICBURF9WRVJTSU9OLAkgIC8qIFZlcnNpb24gaWYgbGlicHRocmVhZCBhbmQgbGlidGhyZWFkX2RiIGRvIG5vdCBtYXRjaC4gICovCisgIFREX05PVExTCSAgLyogVGhlcmUgaXMgbm8gVExTIHNlZ21lbnQgaW4gdGhlIGdpdmVuIG1vZHVsZS4gICovCit9IHRkX2Vycl9lOworCisKKy8qIFBvc3NpYmxlIHRocmVhZCBzdGF0ZXMuICBURF9USFJfQU5ZX1NUQVRFIGlzIGEgcHNldWRvLXN0YXRlIHVzZWQgdG8KKyAgIHNlbGVjdCB0aHJlYWRzIHJlZ2FyZGxlc3Mgb2Ygc3RhdGUgaW4gdGRfdGFfdGhyX2l0ZXIoKS4gICovCit0eXBlZGVmIGVudW0KK3sKKyAgVERfVEhSX0FOWV9TVEFURSwKKyAgVERfVEhSX1VOS05PV04sCisgIFREX1RIUl9TVE9QUEVELAorICBURF9USFJfUlVOLAorICBURF9USFJfQUNUSVZFLAorICBURF9USFJfWk9NQklFLAorICBURF9USFJfU0xFRVAsCisgIFREX1RIUl9TVE9QUEVEX0FTTEVFUAorfSB0ZF90aHJfc3RhdGVfZTsKKworLyogVGhyZWFkIHR5cGU6IHVzZXIgb3Igc3lzdGVtLiAgVERfVEhSX0FOWV9UWVBFIGlzIGEgcHNldWRvLXR5cGUgdXNlZAorICAgdG8gc2VsZWN0IHRocmVhZHMgcmVnYXJkbGVzcyBvZiB0eXBlIGluIHRkX3RhX3Rocl9pdGVyKCkuICAqLwordHlwZWRlZiBlbnVtCit7CisgIFREX1RIUl9BTllfVFlQRSwKKyAgVERfVEhSX1VTRVIsCisgIFREX1RIUl9TWVNURU0KK30gdGRfdGhyX3R5cGVfZTsKKworCisvKiBUeXBlcyBvZiB0aGUgZGVidWdnaW5nIGxpYnJhcnkuICAqLworCisvKiBIYW5kbGUgZm9yIGEgcHJvY2Vzcy4gIFRoaXMgdHlwZSBpcyBvcGFxdWUuICAqLwordHlwZWRlZiBzdHJ1Y3QgdGRfdGhyYWdlbnQgdGRfdGhyYWdlbnRfdDsKKworLyogVGhlIGFjdHVhbCB0aHJlYWQgaGFuZGxlIHR5cGUuICBUaGlzIGlzIGFsc28gb3BhcXVlLiAgKi8KK3R5cGVkZWYgc3RydWN0IHRkX3RocmhhbmRsZQoreworICB0ZF90aHJhZ2VudF90ICp0aF90YV9wOworICBwc2FkZHJfdCB0aF91bmlxdWU7Cit9IHRkX3RocmhhbmRsZV90OworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgYSB0eXBlIGRlZmluZWQgYnkgYW5kIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLworc3RydWN0IGxpbmtfbWFwOworCisKKy8qIEZsYWdzIGZvciBgdGRfdGFfdGhyX2l0ZXInLiAgKi8KKyNkZWZpbmUgVERfVEhSX0FOWV9VU0VSX0ZMQUdTCTB4ZmZmZmZmZmYKKyNkZWZpbmUgVERfVEhSX0xPV0VTVF9QUklPUklUWQktMjAKKyNkZWZpbmUgVERfU0lHTk9fTUFTSwkJTlVMTAorCisKKyNkZWZpbmUgVERfRVZFTlRTSVpFCTIKKyNkZWZpbmUgQlRfVUlTSElGVAk1IC8qIGxvZyBiYXNlIDIgb2YgQlRfTkJJUFVJLCB0byBleHRyYWN0IHdvcmQgaW5kZXggKi8KKyNkZWZpbmUgQlRfTkJJUFVJCSgxIDw8IEJUX1VJU0hJRlQpICAgICAgIC8qIG4gYml0cyBwZXIgdWludCAqLworI2RlZmluZSBCVF9VSU1BU0sJKEJUX05CSVBVSSAtIDEpICAgICAgICAgLyogdG8gZXh0cmFjdCBiaXQgaW5kZXggKi8KKworLyogQml0bWFzayBvZiBlbmFibGVkIGV2ZW50cy4gKi8KK3R5cGVkZWYgc3RydWN0IHRkX3Rocl9ldmVudHMKK3sKKyAgdWludDMyX3QgZXZlbnRfYml0c1tURF9FVkVOVFNJWkVdOworfSB0ZF90aHJfZXZlbnRzX3Q7CisKKy8qIEV2ZW50IHNldCBtYW5pcHVsYXRpb24gbWFjcm9zLiAqLworI2RlZmluZSBfX3RkX2V2ZW50bWFzayhuKSBcCisgIChVSU5UMzJfQyAoMSkgPDwgKCgobikgLSAxKSAmIEJUX1VJTUFTSykpCisjZGVmaW5lIF9fdGRfZXZlbnR3b3JkKG4pIFwKKyAgKChVSU5UMzJfQyAoKG4pIC0gMSkpID4+IEJUX1VJU0hJRlQpCisKKyNkZWZpbmUgdGRfZXZlbnRfZW1wdHlzZXQoc2V0cCkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGludCBfX2k7CQkJCQkJCQkgICAgICBcCisgICAgZm9yIChfX2kgPSBURF9FVkVOVFNJWkU7IF9faSA+IDA7IC0tX19pKQkJCQkgICAgICBcCisgICAgICAoc2V0cCktPmV2ZW50X2JpdHNbX19pIC0gMV0gPSAwOwkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIHRkX2V2ZW50X2ZpbGxzZXQoc2V0cCkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGludCBfX2k7CQkJCQkJCQkgICAgICBcCisgICAgZm9yIChfX2kgPSBURF9FVkVOVFNJWkU7IF9faSA+IDA7IC0tX19pKQkJCQkgICAgICBcCisgICAgICAoc2V0cCktPmV2ZW50X2JpdHNbX19pIC0gMV0gPSBVSU5UMzJfQyAoMHhmZmZmZmZmZik7CQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgdGRfZXZlbnRfYWRkc2V0KHNldHAsIG4pIFwKKyAgKCgoc2V0cCktPmV2ZW50X2JpdHNbX190ZF9ldmVudHdvcmQgKG4pXSkgfD0gX190ZF9ldmVudG1hc2sgKG4pKQorI2RlZmluZSB0ZF9ldmVudF9kZWxzZXQoc2V0cCwgbikgXAorICAoKChzZXRwKS0+ZXZlbnRfYml0c1tfX3RkX2V2ZW50d29yZCAobildKSAmPSB+X190ZF9ldmVudG1hc2sgKG4pKQorI2RlZmluZSB0ZF9ldmVudGlzbWVtYmVyKHNldHAsIG4pIFwKKyAgKF9fdGRfZXZlbnRtYXNrIChuKSAmICgoc2V0cCktPmV2ZW50X2JpdHNbX190ZF9ldmVudHdvcmQgKG4pXSkpCisjaWYgVERfRVZFTlRTSVpFID09IDIKKyMgZGVmaW5lIHRkX2V2ZW50aXNlbXB0eShzZXRwKSBcCisgICghKChzZXRwKS0+ZXZlbnRfYml0c1swXSkgJiYgISgoc2V0cCktPmV2ZW50X2JpdHNbMV0pKQorI2Vsc2UKKyMgZXJyb3IgInRkX2V2ZW50aXNlbXB0eSBtdXN0IGJlIGNoYW5nZWQgdG8gbWF0Y2ggVERfRVZFTlRTSVpFIgorI2VuZGlmCisKKy8qIEV2ZW50cyByZXBvcnRhYmxlIGJ5IHRoZSB0aHJlYWQgaW1wbGVtZW50YXRpb24uICAqLwordHlwZWRlZiBlbnVtCit7CisgIFREX0FMTF9FVkVOVFMsCQkgLyogUHNldWRvLWV2ZW50IG51bWJlci4gICovCisgIFREX0VWRU5UX05PTkUgPSBURF9BTExfRVZFTlRTLCAvKiBEZXBlbmRzIG9uIGNvbnRleHQuICAqLworICBURF9SRUFEWSwJCQkgLyogSXMgZXhlY3V0YWJsZSBub3cuICovCisgIFREX1NMRUVQLAkJCSAvKiBCbG9ja2VkIGluIGEgc3luY2hyb25pemF0aW9uIG9iai4gICovCisgIFREX1NXSVRDSFRPLAkJCSAvKiBOb3cgYXNzaWduZWQgdG8gYSBwcm9jZXNzLiAgKi8KKyAgVERfU1dJVENIRlJPTSwJCSAvKiBOb3QgYW55bW9yZSBhc3NpZ25lZCB0byBhIHByb2Nlc3MuICAqLworICBURF9MT0NLX1RSWSwJCQkgLyogVHJ5aW5nIHRvIGdldCBhbiB1bmF2YWlsYWJsZSBsb2NrLiAgKi8KKyAgVERfQ0FUQ0hTSUcsCQkJIC8qIFNpZ25hbCBwb3N0ZWQgdG8gdGhlIHRocmVhZC4gICovCisgIFREX0lETEUsCQkJIC8qIFByb2Nlc3MgZ2V0dGluZyBpZGxlLiAgKi8KKyAgVERfQ1JFQVRFLAkJCSAvKiBOZXcgdGhyZWFkIGNyZWF0ZWQuICAqLworICBURF9ERUFUSCwJCQkgLyogVGhyZWFkIHRlcm1pbmF0ZWQuICAqLworICBURF9QUkVFTVBULAkJCSAvKiBQcmVlbXB0ZWQuICAqLworICBURF9QUklfSU5IRVJJVCwJCSAvKiBJbmhlcml0ZWQgZWxldmF0ZWQgcHJpb3JpdHkuICAqLworICBURF9SRUFQLAkJCSAvKiBSZWFwZWQuICAqLworICBURF9DT05DVVJSRU5DWSwJCSAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VzIGNoYW5naW5nLiAgKi8KKyAgVERfVElNRU9VVCwJCQkgLyogQ29uZGl0aW9uYWwgdmFyaWFibGUgd2FpdCB0aW1lZCBvdXQuICAqLworICBURF9NSU5fRVZFTlRfTlVNID0gVERfUkVBRFksCisgIFREX01BWF9FVkVOVF9OVU0gPSBURF9USU1FT1VULAorICBURF9FVkVOVFNfRU5BQkxFID0gMzEJCS8qIEV2ZW50IHJlcG9ydGluZyBlbmFibGVkLiAgKi8KK30gdGRfZXZlbnRfZTsKKworLyogVmFsdWVzIHJlcHJlc2VudGluZyB0aGUgZGlmZmVyZW50IHdheXMgZXZlbnRzIGFyZSByZXBvcnRlZC4gICovCit0eXBlZGVmIGVudW0KK3sKKyAgTk9USUZZX0JQVCwJCQkvKiBVc2VyIG11c3QgaW5zZXJ0IGJyZWFrcG9pbnQgYXQgdS5icHRhZGRyLiAqLworICBOT1RJRllfQVVUT0JQVCwJCS8qIEJyZWFrcG9pbnQgYXQgdS5icHRhZGRyIGlzIGF1dG9tYXRpY2FsbHkKKwkJCQkgICBpbnNlcnRlZC4gICovCisgIE5PVElGWV9TWVNDQUxMCQkvKiBTeXN0ZW0gY2FsbCB1LnN5c2NhbGxubyB3aWxsIGJlIGludm9rZWQuICAqLworfSB0ZF9ub3RpZnlfZTsKKworLyogRGVzY3JpcHRpb24gaG93IGV2ZW50IHR5cGUgaXMgcmVwb3J0ZWQuICAqLwordHlwZWRlZiBzdHJ1Y3QgdGRfbm90aWZ5Cit7CisgIHRkX25vdGlmeV9lIHR5cGU7CQkvKiBXYXkgdGhlIGV2ZW50IGlzIHJlcG9ydGVkLiAgKi8KKyAgdW5pb24KKyAgeworICAgIHBzYWRkcl90IGJwdGFkZHI7CQkvKiBBZGRyZXNzIG9mIGJyZWFrcG9pbnQuICAqLworICAgIGludCBzeXNjYWxsbm87CQkvKiBOdW1iZXIgb2Ygc3lzdGVtIGNhbGwgdXNlZC4gICovCisgIH0gdTsKK30gdGRfbm90aWZ5X3Q7CisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIHJlcG9ydCBldmVudC4gICovCit0eXBlZGVmIHN0cnVjdCB0ZF9ldmVudF9tc2cKK3sKKyAgdGRfZXZlbnRfZSBldmVudDsJCS8qIEV2ZW50IHR5cGUgYmVpbmcgcmVwb3J0ZWQuICAqLworICBjb25zdCB0ZF90aHJoYW5kbGVfdCAqdGhfcDsJLyogVGhyZWFkIHJlcG9ydGluZyB0aGUgZXZlbnQuICAqLworICB1bmlvbgorICB7CisjIGlmIDAKKyAgICB0ZF9zeW5jaGFuZGxlX3QgKnNoOwkvKiBIYW5kbGUgb2Ygc3luY2hyb25pemF0aW9uIG9iamVjdC4gICovCisjZW5kaWYKKyAgICB1aW50cHRyX3QgZGF0YTsJCS8qIEV2ZW50IHNwZWNpZmljIGRhdGEuICAqLworICB9IG1zZzsKK30gdGRfZXZlbnRfbXNnX3Q7CisKKy8qIFN0cnVjdHVyZSBjb250YWluaW5nIGV2ZW50IGRhdGEgYXZhaWxhYmxlIGluIGVhY2ggdGhyZWFkIHN0cnVjdHVyZS4gICovCit0eXBlZGVmIHN0cnVjdAoreworICB0ZF90aHJfZXZlbnRzX3QgZXZlbnRtYXNrOwkvKiBNYXNrIG9mIGVuYWJsZWQgZXZlbnRzLiAgKi8KKyAgdGRfZXZlbnRfZSBldmVudG51bTsJCS8qIE51bWJlciBvZiBsYXN0IGV2ZW50LiAgKi8KKyAgdm9pZCAqZXZlbnRkYXRhOwkJLyogRGF0YSBhc3NvY2lhdGVkIHdpdGggZXZlbnQuICAqLworfSB0ZF9ldmVudGJ1Zl90OworCisKKy8qIEdhdGhlcmVkIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHByb2Nlc3MuICAqLwordHlwZWRlZiBzdHJ1Y3QgdGRfdGFfc3RhdHMKK3sKKyAgaW50IG50aHJlYWRzOyAgICAgICAJCS8qIFRvdGFsIG51bWJlciBvZiB0aHJlYWRzIGluIHVzZS4gICovCisgIGludCByX2NvbmN1cnJlbmN5OwkJLyogQ29uY3VycmVuY3kgbGV2ZWwgcmVxdWVzdGVkIGJ5IHVzZXIuICAqLworICBpbnQgbnJ1bm5hYmxlX251bTsJCS8qIEF2ZXJhZ2UgcnVubmFibGUgdGhyZWFkcywgbnVtZXJhdG9yLiAgKi8KKyAgaW50IG5ydW5uYWJsZV9kZW47CQkvKiBBdmVyYWdlIHJ1bm5hYmxlIHRocmVhZHMsIGRlbm9taW5hdG9yLiAgKi8KKyAgaW50IGFfY29uY3VycmVuY3lfbnVtOwkvKiBBY2hpZXZlZCBjb25jdXJyZW5jeSBsZXZlbCwgbnVtZXJhdG9yLiAgKi8KKyAgaW50IGFfY29uY3VycmVuY3lfZGVuOwkvKiBBY2hpZXZlZCBjb25jdXJyZW5jeSBsZXZlbCwgZGVub21pbmF0b3IuICAqLworICBpbnQgbmx3cHNfbnVtOwkJLyogQXZlcmFnZSBudW1iZXIgb2YgcHJvY2Vzc2VzIGluIHVzZSwKKwkJCQkgICBudW1lcmF0b3IuICAqLworICBpbnQgbmx3cHNfZGVuOwkJLyogQXZlcmFnZSBudW1iZXIgb2YgcHJvY2Vzc2VzIGluIHVzZSwKKwkJCQkgICBkZW5vbWluYXRvci4gICovCisgIGludCBuaWRsZV9udW07CQkvKiBBdmVyYWdlIG51bWJlciBvZiBpZGxpbmcgcHJvY2Vzc2VzLAorCQkJCSAgIG51bWVyYXRvci4gICovCisgIGludCBuaWRsZV9kZW47CQkvKiBBdmVyYWdlIG51bWJlciBvZiBpZGxpbmcgcHJvY2Vzc2VzLAorCQkJCSAgIGRlbm9taW5hdG9yLiAgKi8KK30gdGRfdGFfc3RhdHNfdDsKKworCisvKiBTaW5jZSBTdW4ncyBsaWJyYXJ5IGlzIGJhc2VkIG9uIFNvbGFyaXMgdGhyZWFkcyB3ZSBoYXZlIHRvIGRlZmluZSBhIGZldworICAgdHlwZXMgdG8gbWFwIHRoZW0gdG8gUE9TSVggdGhyZWFkcy4gICovCit0eXBlZGVmIHB0aHJlYWRfdCB0aHJlYWRfdDsKK3R5cGVkZWYgcHRocmVhZF9rZXlfdCB0aHJlYWRfa2V5X3Q7CisKKworLyogQ2FsbGJhY2sgZm9yIGl0ZXJhdGlvbiBvdmVyIHRocmVhZHMuICAqLwordHlwZWRlZiBpbnQgdGRfdGhyX2l0ZXJfZiAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKiwgdm9pZCAqKTsKKworLyogQ2FsbGJhY2sgZm9yIGl0ZXJhdGlvbiBvdmVyIHRocmVhZCBsb2NhbCBkYXRhLiAgKi8KK3R5cGVkZWYgaW50IHRkX2tleV9pdGVyX2YgKHRocmVhZF9rZXlfdCwgdm9pZCAoKikgKHZvaWQgKiksIHZvaWQgKik7CisKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uLiAgVGhpcyBoYXMgdG8gYmUgZGVmaW5lZCBieSB0aGUgdXNlci4gICovCitzdHJ1Y3QgcHNfcHJvY2hhbmRsZTsKKworCisvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgdGhyZWFkLiAgKi8KK3R5cGVkZWYgc3RydWN0IHRkX3RocmluZm8KK3sKKyAgdGRfdGhyYWdlbnRfdCAqdGlfdGFfcDsJCS8qIFByb2Nlc3MgaGFuZGxlLiAgKi8KKyAgdW5zaWduZWQgaW50IHRpX3VzZXJfZmxhZ3M7CQkvKiBVbnVzZWQuICAqLworICB0aHJlYWRfdCB0aV90aWQ7CQkJLyogVGhyZWFkIElEIHJldHVybmVkIGJ5CisJCQkJCSAgIHB0aHJlYWRfY3JlYXRlKCkuICAqLworICBjaGFyICp0aV90bHM7CQkJCS8qIFBvaW50ZXIgdG8gdGhyZWFkLWxvY2FsIGRhdGEuICAqLworICBwc2FkZHJfdCB0aV9zdGFydGZ1bmM7CQkvKiBTdGFydCBmdW5jdGlvbiBwYXNzZWQgdG8KKwkJCQkJICAgcHRocmVhZF9jcmVhdGUoKS4gICovCisgIHBzYWRkcl90IHRpX3N0a2Jhc2U7CQkJLyogQmFzZSBvZiB0aHJlYWQncyBzdGFjay4gICovCisgIGxvbmcgaW50IHRpX3N0a3NpemU7CQkJLyogU2l6ZSBvZiB0aHJlYWQncyBzdGFjay4gICovCisgIHBzYWRkcl90IHRpX3JvX2FyZWE7CQkJLyogVW51c2VkLiAgKi8KKyAgaW50IHRpX3JvX3NpemU7CQkJLyogVW51c2VkLiAgKi8KKyAgdGRfdGhyX3N0YXRlX2UgdGlfc3RhdGU7CQkvKiBUaHJlYWQgc3RhdGUuICAqLworICB1bnNpZ25lZCBjaGFyIHRpX2RiX3N1c3BlbmRlZDsJLyogTm9uemVybyBpZiBzdXNwZW5kZWQgYnkgZGVidWdnZXIuICovCisgIHRkX3Rocl90eXBlX2UgdGlfdHlwZTsJCS8qIFR5cGUgb2YgdGhlIHRocmVhZCAoc3lzdGVtIHZzCisJCQkJCSAgIHVzZXIgdGhyZWFkKS4gICovCisgIGludHB0cl90IHRpX3BjOwkJCS8qIFVudXNlZC4gICovCisgIGludHB0cl90IHRpX3NwOwkJCS8qIFVudXNlZC4gICovCisgIHNob3J0IGludCB0aV9mbGFnczsJCQkvKiBVbnVzZWQuICAqLworICBpbnQgdGlfcHJpOwkJCQkvKiBUaHJlYWQgcHJpb3JpdHkuICAqLworICBsd3BpZF90IHRpX2xpZDsJCQkvKiBLZXJuZWwgUElEIGZvciB0aGlzIHRocmVhZC4gICovCisgIHNpZ3NldF90IHRpX3NpZ21hc2s7CQkJLyogU2lnbmFsIG1hc2suICAqLworICB1bnNpZ25lZCBjaGFyIHRpX3RyYWNlbWU7CQkvKiBOb256ZXJvIGlmIGV2ZW50IHJlcG9ydGluZworCQkJCQkgICBlbmFibGVkLiAgKi8KKyAgdW5zaWduZWQgY2hhciB0aV9wcmVlbXB0ZmxhZzsJCS8qIFVudXNlZC4gICovCisgIHVuc2lnbmVkIGNoYXIgdGlfcGlyZWNmbGFnOwkJLyogVW51c2VkLiAgKi8KKyAgc2lnc2V0X3QgdGlfcGVuZGluZzsJCQkvKiBTZXQgb2YgcGVuZGluZyBzaWduYWxzLiAgKi8KKyAgdGRfdGhyX2V2ZW50c190IHRpX2V2ZW50czsJCS8qIFNldCBvZiBlbmFibGVkIGV2ZW50cy4gICovCit9IHRkX3RocmluZm9fdDsKKworCisKKy8qIFByb3RvdHlwZXMgZm9yIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zLiAgKi8KKworLyogSW5pdGlhbGl6ZSB0aGUgdGhyZWFkIGRlYnVnIHN1cHBvcnQgbGlicmFyeS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfaW5pdCAodm9pZCk7CisKKy8qIEhpc3RvcmljYWwgcmVsaWN0LiAgU2hvdWxkIG5vdCBiZSB1c2VkIGFueW1vcmUuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX2xvZyAodm9pZCk7CisKKy8qIFJldHVybiBsaXN0IG9mIHN5bWJvbHMgdGhlIGxpYnJhcnkgY2FuIHJlcXVlc3QuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKip0ZF9zeW1ib2xfbGlzdCAodm9pZCk7CisKKy8qIEdlbmVyYXRlIG5ldyB0aHJlYWQgZGVidWcgbGlicmFyeSBoYW5kbGUgZm9yIHByb2Nlc3MgUFMuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX25ldyAoc3RydWN0IHBzX3Byb2NoYW5kbGUgKl9fcHMsIHRkX3RocmFnZW50X3QgKipfX3RhKTsKKworLyogRnJlZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBUQS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfZGVsZXRlICh0ZF90aHJhZ2VudF90ICpfX3RhKTsKKworLyogR2V0IG51bWJlciBvZiBjdXJyZW50bHkgcnVubmluZyB0aHJlYWRzIGluIHByb2Nlc3MgYXNzb2NpYXRlZCB3aXRoIFRBLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9nZXRfbnRocmVhZHMgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsIGludCAqX19ucCk7CisKKy8qIFJldHVybiBwcm9jZXNzIGhhbmRsZSBwYXNzZWQgaW4gYHRkX3RhX25ldycgZm9yIHByb2Nlc3MgYXNzb2NpYXRlZCB3aXRoCisgICBUQS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfZ2V0X3BoIChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhLAorCQkJICAgICAgc3RydWN0IHBzX3Byb2NoYW5kbGUgKipfX3BoKTsKKworLyogTWFwIHRocmVhZCBsaWJyYXJ5IGhhbmRsZSBQVCB0byB0aHJlYWQgZGVidWcgbGlicmFyeSBoYW5kbGUgZm9yIHByb2Nlc3MKKyAgIGFzc29jaWF0ZWQgd2l0aCBUQSBhbmQgc3RvcmUgcmVzdWx0IGluICpUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfbWFwX2lkMnRociAoY29uc3QgdGRfdGhyYWdlbnRfdCAqX190YSwgcHRocmVhZF90IF9fcHQsCisJCQkJICB0ZF90aHJoYW5kbGVfdCAqX190aCk7CisKKy8qIE1hcCBwcm9jZXNzIElEIExXUElEIHRvIHRocmVhZCBkZWJ1ZyBsaWJyYXJ5IGhhbmRsZSBmb3IgcHJvY2VzcworICAgYXNzb2NpYXRlZCB3aXRoIFRBIGFuZCBzdG9yZSByZXN1bHQgaW4gKlRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9tYXBfbHdwMnRociAoY29uc3QgdGRfdGhyYWdlbnRfdCAqX190YSwgbHdwaWRfdCBfX2x3cGlkLAorCQkJCSAgIHRkX3RocmhhbmRsZV90ICpfX3RoKTsKKworCisvKiBDYWxsIGZvciBlYWNoIHRocmVhZCBpbiBhIHByb2Nlc3MgYXNzb2NpYXRlZCB3aXRoIFRBIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICAgQ0FMTEJBQ0suICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX3Rocl9pdGVyIChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhLAorCQkJCXRkX3Rocl9pdGVyX2YgKl9fY2FsbGJhY2ssIHZvaWQgKl9fY2JkYXRhX3AsCisJCQkJdGRfdGhyX3N0YXRlX2UgX19zdGF0ZSwgaW50IF9fdGlfcHJpLAorCQkJCXNpZ3NldF90ICpfX3RpX3NpZ21hc2tfcCwKKwkJCQl1bnNpZ25lZCBpbnQgX190aV91c2VyX2ZsYWdzKTsKKworLyogQ2FsbCBmb3IgZWFjaCBkZWZpbmVkIHRocmVhZCBsb2NhbCBkYXRhIGVudHJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbiBLSS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfdHNkX2l0ZXIgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsIHRkX2tleV9pdGVyX2YgKl9fa2ksCisJCQkJdm9pZCAqX19wKTsKKworCisvKiBHZXQgZXZlbnQgYWRkcmVzcyBmb3IgRVZFTlQuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX2V2ZW50X2FkZHIgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsCisJCQkJICB0ZF9ldmVudF9lIF9fZXZlbnQsIHRkX25vdGlmeV90ICpfX3B0cik7CisKKy8qIEVuYWJsZSBFVkVOVCBpbiBnbG9iYWwgbWFzay4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfc2V0X2V2ZW50IChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhLAorCQkJCSB0ZF90aHJfZXZlbnRzX3QgKl9fZXZlbnQpOworCisvKiBEaXNhYmxlIEVWRU5UIGluIGdsb2JhbCBtYXNrLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9jbGVhcl9ldmVudCAoY29uc3QgdGRfdGhyYWdlbnRfdCAqX190YSwKKwkJCQkgICB0ZF90aHJfZXZlbnRzX3QgKl9fZXZlbnQpOworCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgbGFzdCBldmVudC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfZXZlbnRfZ2V0bXNnIChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhLAorCQkJCSAgICB0ZF9ldmVudF9tc2dfdCAqX19tc2cpOworCisKKy8qIFNldCBzdWdnZXN0ZWQgY29uY3VycmVuY3kgbGV2ZWwgZm9yIHByb2Nlc3MgYXNzb2NpYXRlZCB3aXRoIFRBLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9zZXRjb25jdXJyZW5jeSAoY29uc3QgdGRfdGhyYWdlbnRfdCAqX190YSwgaW50IF9fbGV2ZWwpOworCisKKy8qIEVuYWJsZSBjb2xsZWN0aW5nIHN0YXRpc3RpY3MgZm9yIHByb2Nlc3MgYXNzb2NpYXRlZCB3aXRoIFRBLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9lbmFibGVfc3RhdHMgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsIGludCBfX2VuYWJsZSk7CisKKy8qIFJlc2V0IHN0YXRpc3RpY3MuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX3Jlc2V0X3N0YXRzIChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhKTsKKworLyogUmV0cmlldmUgc3RhdGlzdGljcyBmcm9tIHByb2Nlc3MgYXNzb2NpYXRlZCB3aXRoIFRBLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9nZXRfc3RhdHMgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsCisJCQkJIHRkX3RhX3N0YXRzX3QgKl9fc3RhdHNwKTsKKworCisvKiBWYWxpZGF0ZSB0aGF0IFRIIGlzIGEgdGhyZWFkIGhhbmRsZS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3ZhbGlkYXRlIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCk7CisKKy8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9nZXRfaW5mbyAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJIHRkX3RocmluZm9fdCAqX19pbmZvcCk7CisKKy8qIFJldHJpZXZlIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIGNvbnRlbnRzIG9mIHByb2Nlc3MgcnVubmluZyB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9nZXRmcHJlZ3MgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSAgcHJmcHJlZ3NldF90ICpfX3JlZ3NldCk7CisKKy8qIFJldHJpZXZlIGdlbmVyYWwgcmVnaXN0ZXIgY29udGVudHMgb2YgcHJvY2VzcyBydW5uaW5nIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX2dldGdyZWdzIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCwKKwkJCQkgcHJncmVnc2V0X3QgX19ncmVncyk7CisKKy8qIFJldHJpZXZlIGV4dGVuZGVkIHJlZ2lzdGVyIGNvbnRlbnRzIG9mIHByb2Nlc3MgcnVubmluZyB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9nZXR4cmVncyAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsIHZvaWQgKl9feHJlZ3MpOworCisvKiBHZXQgc2l6ZSBvZiBleHRlbmRlZCByZWdpc3RlciBzZXQgb2YgcHJvY2VzcyBydW5uaW5nIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX2dldHhyZWdzaXplIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCwgaW50ICpfX3NpemVwKTsKKworLyogU2V0IGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIGNvbnRlbnRzIG9mIHByb2Nlc3MgcnVubmluZyB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9zZXRmcHJlZ3MgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSAgY29uc3QgcHJmcHJlZ3NldF90ICpfX2ZwcmVncyk7CisKKy8qIFNldCBnZW5lcmFsIHJlZ2lzdGVyIGNvbnRlbnRzIG9mIHByb2Nlc3MgcnVubmluZyB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9zZXRncmVncyAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJIHByZ3JlZ3NldF90IF9fZ3JlZ3MpOworCisvKiBTZXQgZXh0ZW5kZWQgcmVnaXN0ZXIgY29udGVudHMgb2YgcHJvY2VzcyBydW5uaW5nIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3NldHhyZWdzIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCwKKwkJCQkgY29uc3Qgdm9pZCAqX19hZGRyKTsKKworCisvKiBHZXQgYWRkcmVzcyBvZiB0aGUgZ2l2ZW4gbW9kdWxlJ3MgVExTIHN0b3JhZ2UgYXJlYSBmb3IgdGhlIGdpdmVuIHRocmVhZC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3Rsc2Jhc2UgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCXVuc2lnbmVkIGxvbmcgaW50IF9fbW9kaWQsCisJCQkJcHNhZGRyX3QgKl9fYmFzZSk7CisKKy8qIEdldCBhZGRyZXNzIG9mIHRocmVhZCBsb2NhbCB2YXJpYWJsZS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3Rsc19nZXRfYWRkciAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJICAgICBwc2FkZHJfdCBfX21hcF9hZGRyZXNzLCBzaXplX3QgX19vZmZzZXQsCisJCQkJICAgICBwc2FkZHJfdCAqX19hZGRyZXNzKTsKKworCisvKiBFbmFibGUgcmVwb3J0aW5nIGZvciBFVkVOVCBmb3IgdGhyZWFkIFRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90aHJfZXZlbnRfZW5hYmxlIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCwgaW50IF9fZXZlbnQpOworCisvKiBFbmFibGUgRVZFTlQgZm9yIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3NldF9ldmVudCAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJICB0ZF90aHJfZXZlbnRzX3QgKl9fZXZlbnQpOworCisvKiBEaXNhYmxlIEVWRU5UIGZvciB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9jbGVhcl9ldmVudCAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJICAgIHRkX3Rocl9ldmVudHNfdCAqX19ldmVudCk7CisKKy8qIEdldCBldmVudCBtZXNzYWdlIGZvciB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9ldmVudF9nZXRtc2cgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSAgICAgdGRfZXZlbnRfbXNnX3QgKl9fbXNnKTsKKworCisvKiBTZXQgcHJpb3JpdHkgb2YgdGhyZWFkIFRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90aHJfc2V0cHJpbyAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsIGludCBfX3ByaW8pOworCisKKy8qIFNldCBwZW5kaW5nIHNpZ25hbHMgZm9yIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3NldHNpZ3BlbmRpbmcgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgX19uLCBjb25zdCBzaWdzZXRfdCAqX19zcyk7CisKKy8qIFNldCBzaWduYWwgbWFzayBmb3IgdGhyZWFkIFRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90aHJfc2lnc2V0bWFzayAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJICAgY29uc3Qgc2lnc2V0X3QgKl9fc3MpOworCisKKy8qIFJldHVybiB0aHJlYWQgbG9jYWwgZGF0YSBhc3NvY2lhdGVkIHdpdGgga2V5IFRLIGluIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3RzZCAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkgICAgY29uc3QgdGhyZWFkX2tleV90IF9fdGssIHZvaWQgKipfX2RhdGEpOworCisKKy8qIFN1c3BlbmQgZXhlY3V0aW9uIG9mIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX2Ric3VzcGVuZCAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgpOworCisvKiBSZXN1bWUgZXhlY3V0aW9uIG9mIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX2RicmVzdW1lIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCk7CisKKyNlbmRpZgkvKiB0aHJlYWRfZGIuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS90aWMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzYTIxYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGljLmgKQEAgLTAsMCArMSwzNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNywyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQXV0aG9yOiBaZXlkIE0uIEJlbi1IYWxpbSA8em1iZW5oYWxAbmV0Y29tLmNvbT4gMTk5MiwxOTk1ICAgICAgICAgICAgICAgKgorICogICAgIGFuZDogRXJpYyBTLiBSYXltb25kIDxlc3JAc25hcmsudGh5cnN1cy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICBhbmQ6IFRob21hcyBFLiBEaWNrZXkgMTk5NiBvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICRJZDogdGljLmgsdiAxLjY1IDIwMDkvMDgvMDggMTc6NTI6NDYgdG9tIEV4cCAkCisgKgl0aWMuaCAtIEdsb2JhbCB2YXJpYWJsZXMgYW5kIHN0cnVjdHVyZXMgZm9yIHRoZSB0ZXJtaW5mbworICoJCQljb21waWxlci4KKyAqLworCisjaWZuZGVmIF9fVElDX0gKKyNkZWZpbmUgX19USUNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxjdXJzZXMuaD4JLyogZm9yIHRoZSBfdHJhY2VmKCkgcHJvdG90eXBlLCBFUlIvT0ssIGJvb2wgZGVmcyAqLworCisvKgorKiogVGhlIGZvcm1hdCBvZiBjb21waWxlZCB0ZXJtaW5mbyBmaWxlcyBpcyBhcyBmb2xsb3dzOgorKioKKyoqCQlIZWFkZXIgKDEyIGJ5dGVzKSwgY29udGFpbmluZyBpbmZvcm1hdGlvbiBnaXZlbiBiZWxvdworKioJCU5hbWVzIFNlY3Rpb24sIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSB0ZXJtaW5hbAorKioJCUJvb2xlYW4gU2VjdGlvbiwgY29udGFpbmluZyB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUKKyoqCQkJCWJvb2xlYW4gY2FwYWJpbGl0aWVzCisqKgkJCQlBIG51bGwgYnl0ZSBtYXkgYmUgaW5zZXJ0ZWQgaGVyZSB0byBtYWtlCisqKgkJCQlzdXJlIHRoYXQgdGhlIE51bWJlciBTZWN0aW9uIGJlZ2lucyBvbiBhbgorKioJCQkJZXZlbiB3b3JkIGJvdW5kYXJ5LgorKioJCU51bWJlciBTZWN0aW9uLCBjb250YWluaW5nIHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBudW1lcmljCisqKgkJCQljYXBhYmlsaXRpZXMsIGVhY2ggYXMgYSBzaG9ydCBpbnRlZ2VyCisqKgkJU3RyaW5nIFNlY3Rpb24sIGNvbnRhaW5pbmcgc2hvcnQgaW50ZWdlciBvZmZzZXRzIGludG8gdGhlCisqKgkJCQlTdHJpbmcgVGFibGUsIG9uZSBwZXIgc3RyaW5nIGNhcGFiaWxpdHkKKyoqCQlTdHJpbmcgVGFibGUsIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCBjaGFyYWN0ZXJzIG9mIHRoZSBzdHJpbmcKKyoqCQkJCWNhcGFiaWxpdGllcy4KKyoqCisqKglOT1RFIHRoYXQgYWxsIHNob3J0IGludGVnZXJzIGluIHRoZSBmaWxlIGFyZSBzdG9yZWQgdXNpbmcgVkFYL1BEUC1zdHlsZQorKioJYnl0ZS1vcmRlciwgaS5lLiwgbGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdC4KKyoqCisqKglUaGVyZSBpcyBubyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBoZXJlIGJlY2F1c2UgaXQgd291bGQgb25seSBjb25mdXNlCisqKgltYXR0ZXJzLiAgVGVybWluZm8gZm9ybWF0IGlzIGEgcmF3IGJ5dGUgbGF5b3V0LCBub3QgYSBzdHJ1Y3R1cmUKKyoqCWR1bXAuICBJZiB5b3UgaGFwcGVuIHRvIGJlIG9uIGEgbGl0dGxlLWVuZGlhbiBtYWNoaW5lIHdpdGggMTYtYml0CisqKglzaG9ydHMgdGhhdCByZXF1aXJlcyBubyBwYWRkaW5nIGJldHdlZW4gc2hvcnQgbWVtYmVycyBpbiBhIHN0cnVjdCwKKyoqCXRoZW4gdGhlcmUgaXMgYSBuYXR1cmFsIEMgc3RydWN0dXJlIHRoYXQgY2FwdHVyZXMgdGhlIGhlYWRlciwgYnV0CisqKglub3QgdmVyeSBoZWxwZnVsbHkuCisqLworCisjZGVmaW5lIE1BR0lDCQkwNDMyCS8qIGZpcnN0IHR3byBieXRlcyBvZiBhIGNvbXBpbGVkIGVudHJ5ICovCisKKyN1bmRlZiAgQllURQorI2RlZmluZSBCWVRFKHAsbikJKHVuc2lnbmVkIGNoYXIpKChwKVtuXSkKKworI2RlZmluZSBJU19ORUcxKHApCSgoQllURShwLDApID09IDAzNzcpICYmIChCWVRFKHAsMSkgPT0gMDM3NykpCisjZGVmaW5lIElTX05FRzIocCkJKChCWVRFKHAsMCkgPT0gMDM3NikgJiYgKEJZVEUocCwxKSA9PSAwMzc3KSkKKyNkZWZpbmUgTE9XX01TQihwKQkoQllURShwLDApICsgMjU2KkJZVEUocCwxKSkKKworI2RlZmluZSBJU19USUNfTUFHSUMocCkJKExPV19NU0IocCkgPT0gTUFHSUMpCisKKy8qCisgKiBUaGUgIm1heGltdW0iIGhlcmUgaXMgbWlzbGVhZGluZzsgWFNJIGd1YXJhbnRlZXMgbWluaW11bSB2YWx1ZXMsIHdoaWNoIGEKKyAqIGdpdmVuIGltcGxlbWVudGF0aW9uIG1heSBleGNlZWQuCisgKi8KKyNkZWZpbmUgTUFYX05BTUVfU0laRQk1MTIJLyogbWF4aW11bSBsZWdhbCBuYW1lIGZpZWxkIHNpemUgKFhTSToxMjcpICovCisjZGVmaW5lIE1BWF9FTlRSWV9TSVpFCTQwOTYJLyogbWF4aW11bSBsZWdhbCBlbnRyeSBzaXplICovCisKKy8qCisgKiBUaGUgbWF4aW11bSBzaXplIG9mIGluZGl2aWR1YWwgbmFtZSBvciBhbGlhcyBpcyBndWFyYW50ZWVkIGluIFhTSSB0byBiZSBhdAorICogbGVhc3QgMTQsIHNpbmNlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG9sZGVyIGZpbGVuYW1lIGxlbmd0aHMuICBOZXdlcgorICogc3lzdGVtcyBhbGxvdyBsb25nZXIgYWxpYXNlcywgdGhvdWdoIG5vdCBtYW55IHRlcm1pbmFsIGRlc2NyaXB0aW9ucyBhcmUKKyAqIHdyaXR0ZW4gdG8gdXNlIHRoZW0uICBUaGUgTUFYX0FMSUFTIHN5bWJvbCBpcyB1c2VkIGZvciB3YXJuaW5ncy4KKyAqLworI2lmIEhBVkVfTE9OR19GSUxFX05BTUVTCisjZGVmaW5lIE1BWF9BTElBUwkzMgkvKiBzbWFsbGVyIHRoYW4gUE9TSVggbWluaW11bSBmb3IgUEFUSF9NQVggKi8KKyNlbHNlCisjZGVmaW5lIE1BWF9BTElBUwkxNAkvKiBTVnIzIGZpbGVuYW1lIGxlbmd0aCAqLworI2VuZGlmCisKKy8qIGxvY2F0aW9uIG9mIHVzZXIncyBwZXJzb25hbCBpbmZvIGRpcmVjdG9yeSAqLworI2RlZmluZSBQUklWQVRFX0lORk8JIiVzLy50ZXJtaW5mbyIJLyogcGx1ZyBnZXRlbnYoIkhPTUUiKSBpbnRvICVzICovCisKKy8qCisgKiBTb21lIHRyYWNlcyBhcmUgZGVzaWduZWQgdG8gYmUgdXNlZCB2aWEgdGljJ3MgdmVyYm9zZSBvcHRpb24gKGFuZCBzaW1pbGFyIGluCisgKiBpbmZvY21wIGFuZCB0b2UpIHJhdGhlciB0aGFuIHRoZSAndHJhY2UoKScgZnVuY3Rpb24uICBTbyB3ZSB1c2UgdGhlIGJpdHMKKyAqIGFib3ZlIHRoZSBub3JtYWwgdHJhY2UoKSBwYXJhbWV0ZXIgYXMgYSBkZWJ1Zy1sZXZlbC4KKyAqLworCisjZGVmaW5lIE1BWF9ERUJVR19MRVZFTCAxNQorI2RlZmluZSBERUJVR19MRVZFTChuKQkoKG4pIDw8IFRSQUNFX1NISUZUKQorCisjZGVmaW5lIHNldF90cmFjZV9sZXZlbChuKSBcCisJX25jX3RyYWNpbmcgJj0gREVCVUdfTEVWRUwoTUFYX0RFQlVHX0xFVkVMKSwgXAorCV9uY190cmFjaW5nIHw9IERFQlVHX0xFVkVMKG4pCisKKyNpZmRlZiBUUkFDRQorI2RlZmluZSBERUJVRyhuLCBhKQlpZiAoX25jX3RyYWNpbmcgPj0gREVCVUdfTEVWRUwobikpIF90cmFjZWYgYQorI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYSkJLypub3RoaW5nKi8KKyNlbmRpZgorCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKHVuc2lnbmVkKSBfbmNfdHJhY2luZzsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfdHJhY2VmIChjaGFyICosIC4uLikgR0NDX1BSSU5URkxJS0UoMSwyKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopIF9uY192aXNidWYgKGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgY2hhciAqKSBfbmNfdmlzYnVmMiAoaW50LCBjb25zdCBjaGFyICopOworCisvKgorICogVGhlc2UgYXJlIHRoZSB0eXBlcyBvZiB0b2tlbnMgcmV0dXJuZWQgYnkgdGhlIHNjYW5uZXIuICBUaGUgZmlyc3QKKyAqIHRocmVlIGFyZSBhbHNvIHVzZWQgaW4gdGhlIGhhc2ggdGFibGUgb2YgY2FwYWJpbGl0eSBuYW1lcy4gIFRoZSBzY2FubmVyCisgKiByZXR1cm5zIG9uZSBvZiB0aGVzZSB2YWx1ZXMgYWZ0ZXIgbG9hZGluZyB0aGUgc3BlY2lmaWNzIGludG8gdGhlIGdsb2JhbAorICogc3RydWN0dXJlIGN1cnJfdG9rZW4uCisgKi8KKworI2RlZmluZSBCT09MRUFOIDAJCS8qIEJvb2xlYW4gY2FwYWJpbGl0eSAqLworI2RlZmluZSBOVU1CRVIgMQkJLyogTnVtZXJpYyBjYXBhYmlsaXR5ICovCisjZGVmaW5lIFNUUklORyAyCQkvKiBTdHJpbmctdmFsdWVkIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgQ0FOQ0VMIDMJCS8qIENhcGFiaWxpdHkgdG8gYmUgY2FuY2VsbGVkIGluIGZvbGxvd2luZyB0YydzICovCisjZGVmaW5lIE5BTUVTICA0CQkvKiBUaGUgbmFtZXMgZm9yIGEgdGVybWluYWwgdHlwZSAqLworI2RlZmluZSBVTkRFRiAgNQkJLyogVW5kZWZpbmVkICovCisKKyNkZWZpbmUgTk9fUFVTSEJBQ0sJLTEJLyogdXNlZCBpbiBwdXNodHlwZSB0byBpbmRpY2F0ZSBubyBwdXNoYmFjayAqLworCisJLyoKKwkgKglUaGUgZ2xvYmFsIHN0cnVjdHVyZSBpbiB3aGljaCB0aGUgc3BlY2lmaWMgcGFydHMgb2YgYQorCSAqCXNjYW5uZWQgdG9rZW4gYXJlIHJldHVybmVkLgorCSAqCisJICovCisKK3N0cnVjdCB0b2tlbgoreworCWNoYXIJKnRrX25hbWU7CQkvKiBuYW1lIG9mIGNhcGFiaWxpdHkgKi8KKwlpbnQJdGtfdmFsbnVtYmVyOwkvKiB2YWx1ZSBvZiBjYXBhYmlsaXR5IChpZiBhIG51bWJlcikgKi8KKwljaGFyCSp0a192YWxzdHJpbmc7CS8qIHZhbHVlIG9mIGNhcGFiaWxpdHkgKGlmIGEgc3RyaW5nKSAqLworfTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihzdHJ1Y3QgdG9rZW4pCV9uY19jdXJyX3Rva2VuOworCisJLyoKKwkgKiBPZmZzZXRzIHRvIHN0cmluZyBjYXBhYmlsaXRpZXMsIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25rZXkKKwkgKiBjb2Rlcy4KKwkgKi8KK3N0cnVjdCB0aW5mb19ma2V5cyB7CisJdW5zaWduZWQgb2Zmc2V0OworCWNodHlwZSBjb2RlOworCX07CisKKyNpZglCUk9LRU5fTElOS0VSCisKKyNkZWZpbmUJX25jX3RpbmZvX2ZrZXlzCV9uY190aW5mb19ma2V5c2YoKQorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IHN0cnVjdCB0aW5mb19ma2V5cyAqKSBfbmNfdGluZm9fZmtleXNmICh2b2lkKTsKKworI2Vsc2UKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihjb25zdCBzdHJ1Y3QgdGluZm9fZmtleXMpIF9uY190aW5mb19ma2V5c1tdOworCisjZW5kaWYKKwordHlwZWRlZiBzaG9ydCBIYXNoVmFsdWU7CisKKwkvKgorCSAqIFRoZSBmaWxlIGNvbXBfY2FwdGFiLmMgY29udGFpbnMgYW4gYXJyYXkgb2YgdGhlc2Ugc3RydWN0dXJlcywgb25lCisJICogcGVyIHBvc3NpYmxlIGNhcGFiaWxpdHkuICBUaGVzZSBhcmUgaW5kZXhlZCBieSBhIGhhc2ggdGFibGUgYXJyYXkgb2YKKwkgKiBwb2ludGVycyB0byB0aGUgc2FtZSBzdHJ1Y3R1cmVzIGZvciB1c2UgYnkgdGhlIHBhcnNlci4KKwkgKi8KKworc3RydWN0IG5hbWVfdGFibGVfZW50cnkKK3sKKwljb25zdCBjaGFyICpudGVfbmFtZTsJLyogbmFtZSB0byBoYXNoIG9uICovCisJaW50CW50ZV90eXBlOwkvKiBCT09MRUFOLCBOVU1CRVIgb3IgU1RSSU5HICovCisJSGFzaFZhbHVlIG50ZV9pbmRleDsJLyogaW5kZXggb2YgYXNzb2NpYXRlZCB2YXJpYWJsZSBpbiBpdHMgYXJyYXkgKi8KKwlIYXNoVmFsdWUgbnRlX2xpbms7CS8qIGluZGV4IGluIHRhYmxlIG9mIG5leHQgaGFzaCwgb3IgLTEgKi8KK307CisKKwkvKgorCSAqIFVzZSB0aGlzIHN0cnVjdHVyZSB0byBoaWRlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGVybWluZm8gYW5kIHRlcm1jYXAKKwkgKiB0YWJsZXMuCisJICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgdGFibGVfc2l6ZTsKKwljb25zdCBIYXNoVmFsdWUgKnRhYmxlX2RhdGE7CisJSGFzaFZhbHVlICgqaGFzaF9vZikoY29uc3QgY2hhciAqKTsKKwlpbnQgKCpjb21wYXJlX25hbWVzKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Cit9IEhhc2hEYXRhOworCitzdHJ1Y3QgYWxpYXMKK3sKKwljb25zdCBjaGFyCSpmcm9tOworCWNvbnN0IGNoYXIJKnRvOworCWNvbnN0IGNoYXIJKnNvdXJjZTsKK307CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBzdHJ1Y3QgbmFtZV90YWJsZV9lbnRyeSAqKSBfbmNfZ2V0X3RhYmxlIChib29sKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBIYXNoRGF0YSAqKSBfbmNfZ2V0X2hhc2hfaW5mbyAoYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgSGFzaFZhbHVlICopIF9uY19nZXRfaGFzaF90YWJsZSAoYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3Qgc3RydWN0IGFsaWFzICopIF9uY19nZXRfYWxpYXNfdGFibGUgKGJvb2wpOworCisjZGVmaW5lIE5PVEZPVU5ECSgoc3RydWN0IG5hbWVfdGFibGVfZW50cnkgKikgMCkKKworLyogb3V0LW9mLWJhbmQgdmFsdWVzIGZvciByZXByZXNlbnRpbmcgYWJzZW50IGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBBQlNFTlRfQk9PTEVBTgkJKChzaWduZWQgY2hhciktMSkJLyogMjU1ICovCisjZGVmaW5lIEFCU0VOVF9OVU1FUklDCQkoLTEpCisjZGVmaW5lIEFCU0VOVF9TVFJJTkcJCShjaGFyICopMAorCisvKiBvdXQtb2YtYmFuZCB2YWx1ZXMgZm9yIHJlcHJlc2VudGluZyBjYW5jZWxzICovCisjZGVmaW5lIENBTkNFTExFRF9CT09MRUFOCSgoc2lnbmVkIGNoYXIpLTIpCS8qIDI1NCAqLworI2RlZmluZSBDQU5DRUxMRURfTlVNRVJJQwkoLTIpCisjZGVmaW5lIENBTkNFTExFRF9TVFJJTkcJKGNoYXIgKikoLTEpCisKKyNkZWZpbmUgVkFMSURfQk9PTEVBTihzKSAoKHVuc2lnbmVkIGNoYXIpKHMpIDw9IDEpIC8qIHJlamVjdCAiLTEiICovCisjZGVmaW5lIFZBTElEX05VTUVSSUMocykgKChzKSA+PSAwKQorI2RlZmluZSBWQUxJRF9TVFJJTkcocykgICgocykgIT0gQ0FOQ0VMTEVEX1NUUklORyAmJiAocykgIT0gQUJTRU5UX1NUUklORykKKworLyogdGVybWNhcCBlbnRyaWVzIGxvbmdlciB0aGFuIHRoaXMgbWF5IGJyZWFrIG9sZCBiaW5hcmllcyAqLworI2RlZmluZSBNQVhfVEVSTUNBUF9MRU5HVEgJMTAyMworCisvKiB0aGlzIGlzIGEgZG9jdW1lbnRlZCBsaW1pdGF0aW9uIG9mIHRlcm1pbmZvICovCisjZGVmaW5lIE1BWF9URVJNSU5GT19MRU5HVEgJNDA5NgorCisjaWZuZGVmIFRFUk1JTkZPCisjZGVmaW5lIFRFUk1JTkZPICIvdXNyL3NoYXJlL3Rlcm1pbmZvIgorI2VuZGlmCisKKy8qIGFjY2Vzcy5jICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodW5zaWduZWQpIF9uY19wYXRobGFzdCAoY29uc3QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBfbmNfaXNfYWJzX3BhdGggKGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgX25jX2lzX2Rpcl9wYXRoIChjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIF9uY19pc19maWxlX3BhdGggKGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfbmNfYmFzZW5hbWUgKGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfbmNfcm9vdG5hbWUgKGNoYXIgKik7CisKKy8qIGNvbXBfaGFzaC5jOiBuYW1lIGxvb2t1cCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHN0cnVjdCBuYW1lX3RhYmxlX2VudHJ5IGNvbnN0ICopIF9uY19maW5kX2VudHJ5CisJKGNvbnN0IGNoYXIgKiwgY29uc3QgSGFzaFZhbHVlICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHN0cnVjdCBuYW1lX3RhYmxlX2VudHJ5IGNvbnN0ICopIF9uY19maW5kX3R5cGVfZW50cnkKKwkoY29uc3QgY2hhciAqLCBpbnQsIGJvb2wpOworCisvKiBjb21wX3NjYW4uYzogbGV4aWNhbCBhbmFseXNpcyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgIF9uY19nZXRfdG9rZW4gKGJvb2wpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19wYW5pY19tb2RlIChjaGFyKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfcHVzaF90b2tlbiAoaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfcmVzZXRfaW5wdXQgKEZJTEUgKiwgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoaW50KSBfbmNfY3Vycl9jb2w7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGludCkgX25jX2N1cnJfbGluZTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoaW50KSBfbmNfc3ludGF4OworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihsb25nKSBfbmNfY29tbWVudF9lbmQ7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGxvbmcpIF9uY19jb21tZW50X3N0YXJ0OworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihsb25nKSBfbmNfY3Vycl9maWxlX3BvczsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIobG9uZykgX25jX3N0YXJ0X2xpbmU7CisjZGVmaW5lIFNZTl9URVJNSU5GTwkwCisjZGVmaW5lIFNZTl9URVJNQ0FQCTEKKworLyogY29tcF9lcnJvci5jOiB3YXJuaW5nICYgYWJvcnQgbWVzc2FnZXMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopIF9uY19nZXRfc291cmNlICh2b2lkKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfZXJyX2Fib3J0IChjb25zdCBjaGFyICpjb25zdCwuLi4pIEdDQ19QUklOVEZMSUtFKDEsMikgR0NDX05PUkVUVVJOOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19nZXRfdHlwZSAoY2hhciAqbmFtZSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX3NldF9zb3VyY2UgKGNvbnN0IGNoYXIgKmNvbnN0KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfc2V0X3R5cGUgKGNvbnN0IGNoYXIgKmNvbnN0KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfc3lzZXJyX2Fib3J0IChjb25zdCBjaGFyICpjb25zdCwuLi4pIEdDQ19QUklOVEZMSUtFKDEsMikgR0NDX05PUkVUVVJOOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY193YXJuaW5nIChjb25zdCBjaGFyICpjb25zdCwuLi4pIEdDQ19QUklOVEZMSUtFKDEsMik7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGJvb2wpIF9uY19zdXBwcmVzc193YXJuaW5nczsKKworLyogY29tcF9leHBhbmQuYzogZXhwYW5kIHN0cmluZyBpbnRvIHJlYWRhYmxlIGZvcm0gKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF9uY190aWNfZXhwYW5kIChjb25zdCBjaGFyICosIGJvb2wsIGludCk7CisKKy8qIGNvbXBfc2Nhbi5jOiBkZWNvZGUgc3RyaW5nIGZyb20gcmVhZGFibGUgZm9ybSAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgX25jX3RyYW5zX3N0cmluZyAoY2hhciAqLCBjaGFyICopOworCisvKiBjYXB0b2luZm8uYzogY2FwYWJpbGl0eSBjb252ZXJzaW9uICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfbmNfY2FwdG9pbmZvIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50IGNvbnN0KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF9uY19pbmZvdG9jYXAgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgY29uc3QpOworCisvKiBob21lX3Rlcm1pbmZvLmMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF9uY19ob21lX3Rlcm1pbmZvICh2b2lkKTsKKworLyogbGliX3RwYXJtLmMgKi8KKyNkZWZpbmUgTlVNX1BBUk0gOQorCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGludCkgX25jX3RwYXJtX2VycjsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgX25jX3RwYXJtX2FuYWx5emUoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQgKik7CisKKy8qIGxpYl90cHV0cy5jICovCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGludCkgX25jX251bGxzX3NlbnQ7CQkvKiBBZGQgb25lIGZvciBldmVyeSBudWxsIHNlbnQgKi8KKworLyogY29tcF9tYWluLmM6IGNvbXBpbGVyIG1haW4gKi8KK2V4dGVybiBjb25zdCBjaGFyICogX25jX3Byb2duYW1lOworCisvKiBkYl9pdGVyYXRvci5jICovCit0eXBlZGVmIGVudW0geworICAgIGRiZFRJQyA9IDAsCisjaWYgVVNFX0RBVEFCQVNFCisgICAgZGJkRW52T25jZSwKKyAgICBkYmRIb21lLAorICAgIGRiZEVudkxpc3QsCisgICAgZGJkQ2ZnTGlzdCwKKyAgICBkYmRDZmdPbmNlLAorI2VuZGlmCisjaWYgVVNFX1RFUk1DQVAKKyAgICBkYmRFbnZPbmNlMiwKKyAgICBkYmRFbnZMaXN0MiwKKyAgICBkYmRDZmdMaXN0MiwKKyNlbmRpZgorICAgIGRiZExBU1QKK30gREJESVJTOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgY2hhciAqKSBfbmNfbmV4dF9kYihEQkRJUlMgKiwgaW50ICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IGNoYXIgKikgX25jX3RpY19kaXIgKGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX2ZpcnN0X2RiKERCRElSUyAqLCBpbnQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX2xhc3RfZGIodm9pZCk7CisKKy8qIHdyaXRlX2VudHJ5LmMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIF9uY190aWNfd3JpdHRlbiAodm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1RJQ19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3RpbWUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZThkMjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3RpbWUuaApAQCAtMCwwICsxLDQyMSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTIwMDMsMjAwNiwyMDA5LDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjIzIERhdGUgYW5kIHRpbWUJPHRpbWUuaD4KKyAqLworCisjaWZuZGVmCV9USU1FX0gKKworI2lmICghIGRlZmluZWQgX19uZWVkX3RpbWVfdCAmJiAhZGVmaW5lZCBfX25lZWRfY2xvY2tfdCAmJiBcCisgICAgICEgZGVmaW5lZCBfX25lZWRfdGltZXNwZWMpCisjIGRlZmluZSBfVElNRV9ICTEKKyMgaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjZW5kaWYKKworI2lmZGVmCV9USU1FX0gKKy8qIEdldCBzaXplX3QgYW5kIE5VTEwgZnJvbSA8c3RkZGVmLmg+LiAgKi8KKyMgZGVmaW5lIF9fbmVlZF9zaXplX3QKKyMgZGVmaW5lIF9fbmVlZF9OVUxMCisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBUaGlzIGRlZmluZXMgQ0xPQ0tTX1BFUl9TRUMsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29yIGNsb2NrCisgICB0aWNrcyBwZXIgc2Vjb25kLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy90aW1lLmg+CisKKy8qIFRoaXMgaXMgdGhlIG9ic29sZXRlIFBPU0lYLjEtMTk4OCBuYW1lIGZvciB0aGUgc2FtZSBjb25zdGFudC4gICovCisjIGlmICFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXyAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisjICBpZm5kZWYgQ0xLX1RDSworIyAgIGRlZmluZSBDTEtfVENLCUNMT0NLU19QRVJfU0VDCisjICBlbmRpZgorIyBlbmRpZgorCisjZW5kaWYgLyogPHRpbWUuaD4gaW5jbHVkZWQuICAqLworCisjaWYgIWRlZmluZWQgX19jbG9ja190X2RlZmluZWQgJiYgKGRlZmluZWQgX1RJTUVfSCB8fCBkZWZpbmVkIF9fbmVlZF9jbG9ja190KQorIyBkZWZpbmUgX19jbG9ja190X2RlZmluZWQJMQorCisjIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZXR1cm5lZCBieSBgY2xvY2snLiAgKi8KK3R5cGVkZWYgX19jbG9ja190IGNsb2NrX3Q7CitfX0VORF9OQU1FU1BBQ0VfU1RECisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworX19VU0lOR19OQU1FU1BBQ0VfU1REKGNsb2NrX3QpCisjZW5kaWYKKworI2VuZGlmIC8qIGNsb2NrX3Qgbm90IGRlZmluZWQgYW5kIDx0aW1lLmg+IG9yIG5lZWQgY2xvY2tfdC4gICovCisjdW5kZWYJX19uZWVkX2Nsb2NrX3QKKworI2lmICFkZWZpbmVkIF9fdGltZV90X2RlZmluZWQgJiYgKGRlZmluZWQgX1RJTUVfSCB8fCBkZWZpbmVkIF9fbmVlZF90aW1lX3QpCisjIGRlZmluZSBfX3RpbWVfdF9kZWZpbmVkCTEKKworIyBpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuZWQgYnkgYHRpbWUnLiAgKi8KK3R5cGVkZWYgX190aW1lX3QgdGltZV90OworX19FTkRfTkFNRVNQQUNFX1NURAorI2lmIGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfU1ZJRAorX19VU0lOR19OQU1FU1BBQ0VfU1REKHRpbWVfdCkKKyNlbmRpZgorCisjZW5kaWYgLyogdGltZV90IG5vdCBkZWZpbmVkIGFuZCA8dGltZS5oPiBvciBuZWVkIHRpbWVfdC4gICovCisjdW5kZWYJX19uZWVkX3RpbWVfdAorCisjaWYgIWRlZmluZWQgX19jbG9ja2lkX3RfZGVmaW5lZCAmJiBcCisgICAoKGRlZmluZWQgX1RJTUVfSCAmJiBkZWZpbmVkIF9fVVNFX1BPU0lYMTk5MzA5KSB8fCBkZWZpbmVkIF9fbmVlZF9jbG9ja2lkX3QpCisjIGRlZmluZSBfX2Nsb2NraWRfdF9kZWZpbmVkCTEKKworIyBpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIENsb2NrIElEIHVzZWQgaW4gY2xvY2sgYW5kIHRpbWVyIGZ1bmN0aW9ucy4gICovCit0eXBlZGVmIF9fY2xvY2tpZF90IGNsb2NraWRfdDsKKworI2VuZGlmIC8qIGNsb2NraWRfdCBub3QgZGVmaW5lZCBhbmQgPHRpbWUuaD4gb3IgbmVlZCBjbG9ja2lkX3QuICAqLworI3VuZGVmCV9fY2xvY2tpZF90aW1lX3QKKworI2lmICFkZWZpbmVkIF9fdGltZXJfdF9kZWZpbmVkICYmIFwKKyAgICAoKGRlZmluZWQgX1RJTUVfSCAmJiBkZWZpbmVkIF9fVVNFX1BPU0lYMTk5MzA5KSB8fCBkZWZpbmVkIF9fbmVlZF90aW1lcl90KQorIyBkZWZpbmUgX190aW1lcl90X2RlZmluZWQJMQorCisjIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogVGltZXIgSUQgcmV0dXJuZWQgYnkgYHRpbWVyX2NyZWF0ZScuICAqLwordHlwZWRlZiBfX3RpbWVyX3QgdGltZXJfdDsKKworI2VuZGlmIC8qIHRpbWVyX3Qgbm90IGRlZmluZWQgYW5kIDx0aW1lLmg+IG9yIG5lZWQgdGltZXJfdC4gICovCisjdW5kZWYJX19uZWVkX3RpbWVyX3QKKworCisjaWYgIWRlZmluZWQgX190aW1lc3BlY19kZWZpbmVkICYmCQkJCVwKKyAgICAoKGRlZmluZWQgX1RJTUVfSCAmJgkJCQkJXAorICAgICAgKGRlZmluZWQgX19VU0VfUE9TSVgxOTkzMDkgfHwgZGVmaW5lZCBfX1VTRV9NSVNDKSkgfHwJXAorICAgICAgZGVmaW5lZCBfX25lZWRfdGltZXNwZWMpCisjIGRlZmluZSBfX3RpbWVzcGVjX2RlZmluZWQJMQorCisjIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4JLyogVGhpcyBkZWZpbmVzIF9fdGltZV90IGZvciB1cy4gICovCisKKy8qIFBPU0lYLjFiIHN0cnVjdHVyZSBmb3IgYSB0aW1lIHZhbHVlLiAgVGhpcyBpcyBsaWtlIGEgYHN0cnVjdCB0aW1ldmFsJyBidXQKKyAgIGhhcyBuYW5vc2Vjb25kcyBpbnN0ZWFkIG9mIG1pY3Jvc2Vjb25kcy4gICovCitzdHJ1Y3QgdGltZXNwZWMKKyAgeworICAgIF9fdGltZV90IHR2X3NlYzsJCS8qIFNlY29uZHMuICAqLworICAgIGxvbmcgaW50IHR2X25zZWM7CQkvKiBOYW5vc2Vjb25kcy4gICovCisgIH07CisKKyNlbmRpZiAvKiB0aW1lc3BlYyBub3QgZGVmaW5lZCBhbmQgPHRpbWUuaD4gb3IgbmVlZCB0aW1lc3BlYy4gICovCisjdW5kZWYJX19uZWVkX3RpbWVzcGVjCisKKworI2lmZGVmCV9USU1FX0gKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogVXNlZCBieSBvdGhlciB0aW1lIGZ1bmN0aW9ucy4gICovCitzdHJ1Y3QgdG0KK3sKKyAgaW50IHRtX3NlYzsJCQkvKiBTZWNvbmRzLglbMC02MF0gKDEgbGVhcCBzZWNvbmQpICovCisgIGludCB0bV9taW47CQkJLyogTWludXRlcy4JWzAtNTldICovCisgIGludCB0bV9ob3VyOwkJCS8qIEhvdXJzLglbMC0yM10gKi8KKyAgaW50IHRtX21kYXk7CQkJLyogRGF5LgkJWzEtMzFdICovCisgIGludCB0bV9tb247CQkJLyogTW9udGguCVswLTExXSAqLworICBpbnQgdG1feWVhcjsJCQkvKiBZZWFyCS0gMTkwMC4gICovCisgIGludCB0bV93ZGF5OwkJCS8qIERheSBvZiB3ZWVrLglbMC02XSAqLworICBpbnQgdG1feWRheTsJCQkvKiBEYXlzIGluIHllYXIuWzAtMzY1XQkqLworICBpbnQgdG1faXNkc3Q7CQkJLyogRFNULgkJWy0xLzAvMV0qLworCisjaWZkZWYJX19VU0VfQlNECisgIGxvbmcgaW50IHRtX2dtdG9mZjsJCS8qIFNlY29uZHMgZWFzdCBvZiBVVEMuICAqLworICBfX2NvbnN0IGNoYXIgKnRtX3pvbmU7CS8qIFRpbWV6b25lIGFiYnJldmlhdGlvbi4gICovCisjZWxzZQorICBsb25nIGludCBfX3RtX2dtdG9mZjsJCS8qIFNlY29uZHMgZWFzdCBvZiBVVEMuICAqLworICBfX2NvbnN0IGNoYXIgKl9fdG1fem9uZTsJLyogVGltZXpvbmUgYWJicmV2aWF0aW9uLiAgKi8KKyNlbmRpZgorfTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCitfX1VTSU5HX05BTUVTUEFDRV9TVEQodG0pCisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfUE9TSVgxOTkzMDkKKy8qIFBPU0lYLjFiIHN0cnVjdHVyZSBmb3IgdGltZXIgc3RhcnQgdmFsdWVzIGFuZCBpbnRlcnZhbHMuICAqLworc3RydWN0IGl0aW1lcnNwZWMKKyAgeworICAgIHN0cnVjdCB0aW1lc3BlYyBpdF9pbnRlcnZhbDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgaXRfdmFsdWU7CisgIH07CisKKy8qIFdlIGNhbiB1c2UgYSBzaW1wbGUgZm9yd2FyZCBkZWNsYXJhdGlvbi4gICovCitzdHJ1Y3Qgc2lnZXZlbnQ7CisKKyNlbmRpZgkvKiBQT1NJWC4xYiAqLworCisjaWZkZWYgX19VU0VfWE9QRU4ySworIyBpZm5kZWYgX19waWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fcGlkX3QgcGlkX3Q7CisjICBkZWZpbmUgX19waWRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFRpbWUgdXNlZCBieSB0aGUgcHJvZ3JhbSBzbyBmYXIgKHVzZXIgdGltZSArIHN5c3RlbSB0aW1lKS4KKyAgIFRoZSByZXN1bHQgLyBDTE9DS1NfUEVSX1NFQ09ORCBpcyBwcm9ncmFtIHRpbWUgaW4gc2Vjb25kcy4gICovCitleHRlcm4gY2xvY2tfdCBjbG9jayAodm9pZCkgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgYW5kIHB1dCBpdCBpbiAqVElNRVIgaWYgVElNRVIgaXMgbm90IE5VTEwuICAqLworZXh0ZXJuIHRpbWVfdCB0aW1lICh0aW1lX3QgKl9fdGltZXIpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFRJTUUxIGFuZCBUSU1FMC4gICovCitleHRlcm4gZG91YmxlIGRpZmZ0aW1lICh0aW1lX3QgX190aW1lMSwgdGltZV90IF9fdGltZTApCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisvKiBSZXR1cm4gdGhlIGB0aW1lX3QnIHJlcHJlc2VudGF0aW9uIG9mIFRQIGFuZCBub3JtYWxpemUgVFAuICAqLworZXh0ZXJuIHRpbWVfdCBta3RpbWUgKHN0cnVjdCB0bSAqX190cCkgX19USFJPVzsKKworCisvKiBGb3JtYXQgVFAgaW50byBTIGFjY29yZGluZyB0byBGT1JNQVQuCisgICBXcml0ZSBubyBtb3JlIHRoYW4gTUFYU0laRSBjaGFyYWN0ZXJzIGFuZCByZXR1cm4gdGhlIG51bWJlcgorICAgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAwIGlmIGl0IHdvdWxkIGV4Y2VlZCBNQVhTSVpFLiAgKi8KK2V4dGVybiBzaXplX3Qgc3RyZnRpbWUgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhzaXplLAorCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJX19jb25zdCBzdHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCkgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworIyBpZmRlZiBfX1VTRV9YT1BFTgorLyogUGFyc2UgUyBhY2NvcmRpbmcgdG8gRk9STUFUIGFuZCBzdG9yZSBiaW5hcnkgdGltZSBpbmZvcm1hdGlvbiBpbiBUUC4KKyAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCB1bnBhcnNlZCBjaGFyYWN0ZXIgaW4gUy4gICovCitleHRlcm4gY2hhciAqc3RycHRpbWUgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsCisJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIHN0cnVjdCB0bSAqX190cCkKKyAgICAgX19USFJPVzsKKyMgZW5kaWYKKworIyBpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogU2ltaWxhciB0byB0aGUgdHdvIGZ1bmN0aW9ucyBhYm92ZSBidXQgdGFrZSB0aGUgaW5mb3JtYXRpb24gZnJvbQorICAgdGhlIHByb3ZpZGVkIGxvY2FsZSBhbmQgbm90IHRoZSBnbG9iYWwgbG9jYWxlLiAgKi8KKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorCitleHRlcm4gc2l6ZV90IHN0cmZ0aW1lX2wgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhzaXplLAorCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgIF9fY29uc3Qgc3RydWN0IHRtICpfX3Jlc3RyaWN0IF9fdHAsCisJCQkgIF9fbG9jYWxlX3QgX19sb2MpIF9fVEhST1c7CisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfR05VCitleHRlcm4gY2hhciAqc3RycHRpbWVfbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKKwkJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIHN0cnVjdCB0bSAqX190cCwKKwkJCSBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XOworIyBlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuIHRoZSBgc3RydWN0IHRtJyByZXByZXNlbnRhdGlvbiBvZiAqVElNRVIKKyAgIGluIFVuaXZlcnNhbCBDb29yZGluYXRlZCBUaW1lIChha2EgR3JlZW53aWNoIE1lYW4gVGltZSkuICAqLworZXh0ZXJuIHN0cnVjdCB0bSAqZ210aW1lIChfX2NvbnN0IHRpbWVfdCAqX190aW1lcikgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBgc3RydWN0IHRtJyByZXByZXNlbnRhdGlvbgorICAgb2YgKlRJTUVSIGluIHRoZSBsb2NhbCB0aW1lem9uZS4gICovCitleHRlcm4gc3RydWN0IHRtICpsb2NhbHRpbWUgKF9fY29uc3QgdGltZV90ICpfX3RpbWVyKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjIGlmIGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisvKiBSZXR1cm4gdGhlIGBzdHJ1Y3QgdG0nIHJlcHJlc2VudGF0aW9uIG9mICpUSU1FUiBpbiBVVEMsCisgICB1c2luZyAqVFAgdG8gc3RvcmUgdGhlIHJlc3VsdC4gICovCitleHRlcm4gc3RydWN0IHRtICpnbXRpbWVfciAoX19jb25zdCB0aW1lX3QgKl9fcmVzdHJpY3QgX190aW1lciwKKwkJCSAgICBzdHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCkgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBgc3RydWN0IHRtJyByZXByZXNlbnRhdGlvbiBvZiAqVElNRVIgaW4gbG9jYWwgdGltZSwKKyAgIHVzaW5nICpUUCB0byBzdG9yZSB0aGUgcmVzdWx0LiAgKi8KK2V4dGVybiBzdHJ1Y3QgdG0gKmxvY2FsdGltZV9yIChfX2NvbnN0IHRpbWVfdCAqX19yZXN0cmljdCBfX3RpbWVyLAorCQkJICAgICAgIHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3RwKSBfX1RIUk9XOworIyBlbmRpZgkvKiBQT1NJWCBvciBtaXNjICovCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuIGEgc3RyaW5nIG9mIHRoZSBmb3JtICJEYXkgTW9uIGRkIGhoOm1tOnNzIHl5eXlcbiIKKyAgIHRoYXQgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIFRQIGluIHRoaXMgZm9ybWF0LiAgKi8KK2V4dGVybiBjaGFyICphc2N0aW1lIChfX2NvbnN0IHN0cnVjdCB0bSAqX190cCkgX19USFJPVzsKKworLyogRXF1aXZhbGVudCB0byBgYXNjdGltZSAobG9jYWx0aW1lICh0aW1lcikpJy4gICovCitleHRlcm4gY2hhciAqY3RpbWUgKF9fY29uc3QgdGltZV90ICpfX3RpbWVyKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjIGlmIGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2YgdGhlIGFib3ZlIGZ1bmN0aW9ucy4gICovCisKKy8qIFJldHVybiBpbiBCVUYgYSBzdHJpbmcgb2YgdGhlIGZvcm0gIkRheSBNb24gZGQgaGg6bW06c3MgeXl5eVxuIgorICAgdGhhdCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgVFAgaW4gdGhpcyBmb3JtYXQuICAqLworZXh0ZXJuIGNoYXIgKmFzY3RpbWVfciAoX19jb25zdCBzdHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCwKKwkJCWNoYXIgKl9fcmVzdHJpY3QgX19idWYpIF9fVEhST1c7CisKKy8qIEVxdWl2YWxlbnQgdG8gYGFzY3RpbWVfciAobG9jYWx0aW1lX3IgKHRpbWVyLCAqVE1QKiksIGJ1ZiknLiAgKi8KK2V4dGVybiBjaGFyICpjdGltZV9yIChfX2NvbnN0IHRpbWVfdCAqX19yZXN0cmljdCBfX3RpbWVyLAorCQkgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmKSBfX1RIUk9XOworIyBlbmRpZgkvKiBQT1NJWCBvciBtaXNjICovCisKKworLyogRGVmaW5lZCBpbiBsb2NhbHRpbWUuYy4gICovCitleHRlcm4gY2hhciAqX190em5hbWVbMl07CS8qIEN1cnJlbnQgdGltZXpvbmUgbmFtZXMuICAqLworZXh0ZXJuIGludCBfX2RheWxpZ2h0OwkJLyogSWYgZGF5bGlnaHQtc2F2aW5nIHRpbWUgaXMgZXZlciBpbiB1c2UuICAqLworZXh0ZXJuIGxvbmcgaW50IF9fdGltZXpvbmU7CS8qIFNlY29uZHMgd2VzdCBvZiBVVEMuICAqLworCisKKyMgaWZkZWYJX19VU0VfUE9TSVgKKy8qIFNhbWUgYXMgYWJvdmUuICAqLworZXh0ZXJuIGNoYXIgKnR6bmFtZVsyXTsKKworLyogU2V0IHRpbWUgY29udmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgIElmIFRaIGlzIG5vdCBkZWZpbmVkLCBhIGxvY2FsZS1kZXBlbmRlbnQgZGVmYXVsdCBpcyB1c2VkLiAgKi8KK2V4dGVybiB2b2lkIHR6c2V0ICh2b2lkKSBfX1RIUk9XOworIyBlbmRpZgorCisjIGlmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCitleHRlcm4gaW50IGRheWxpZ2h0OworZXh0ZXJuIGxvbmcgaW50IHRpbWV6b25lOworIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX1NWSUQKKy8qIFNldCB0aGUgc3lzdGVtIHRpbWUgdG8gKldIRU4uCisgICBUaGlzIGNhbGwgaXMgcmVzdHJpY3RlZCB0byB0aGUgc3VwZXJ1c2VyLiAgKi8KK2V4dGVybiBpbnQgc3RpbWUgKF9fY29uc3QgdGltZV90ICpfX3doZW4pIF9fVEhST1c7CisjIGVuZGlmCisKKworLyogTm9uemVybyBpZiBZRUFSIGlzIGEgbGVhcCB5ZWFyIChldmVyeSA0IHllYXJzLAorICAgZXhjZXB0IGV2ZXJ5IDEwMHRoIGlzbid0LCBhbmQgZXZlcnkgNDAwdGggaXMpLiAgKi8KKyMgZGVmaW5lIF9faXNsZWFwKHllYXIpCVwKKyAgKCh5ZWFyKSAlIDQgPT0gMCAmJiAoKHllYXIpICUgMTAwICE9IDAgfHwgKHllYXIpICUgNDAwID09IDApKQorCisKKyMgaWZkZWYgX19VU0VfTUlTQworLyogTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgbWFueSBVbmljZXMgaW5oZXJpdGVkIGZyb20gdGhlIHB1YmxpYyBkb21haW4KKyAgIGxvY2FsdGltZSBwYWNrYWdlLiAgVGhlc2UgYXJlIGluY2x1ZGVkIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkuICAqLworCisvKiBMaWtlIGBta3RpbWUnLCBidXQgZm9yIFRQIHJlcHJlc2VudHMgVW5pdmVyc2FsIFRpbWUsIG5vdCBsb2NhbCB0aW1lLiAgKi8KK2V4dGVybiB0aW1lX3QgdGltZWdtIChzdHJ1Y3QgdG0gKl9fdHApIF9fVEhST1c7CisKKy8qIEFub3RoZXIgbmFtZSBmb3IgYG1rdGltZScuICAqLworZXh0ZXJuIHRpbWVfdCB0aW1lbG9jYWwgKHN0cnVjdCB0bSAqX190cCkgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGF5cyBpbiBZRUFSLiAgKi8KK2V4dGVybiBpbnQgZHlzaXplIChpbnQgX195ZWFyKSBfX1RIUk9XICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisjIGVuZGlmCisKKworIyBpZmRlZiBfX1VTRV9QT1NJWDE5OTMwOQorLyogUGF1c2UgZXhlY3V0aW9uIGZvciBhIG51bWJlciBvZiBuYW5vc2Vjb25kcy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IG5hbm9zbGVlcCAoX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVxdWVzdGVkX3RpbWUsCisJCSAgICAgIHN0cnVjdCB0aW1lc3BlYyAqX19yZW1haW5pbmcpOworCisKKy8qIEdldCByZXNvbHV0aW9uIG9mIGNsb2NrIENMT0NLX0lELiAgKi8KK2V4dGVybiBpbnQgY2xvY2tfZ2V0cmVzIChjbG9ja2lkX3QgX19jbG9ja19pZCwgc3RydWN0IHRpbWVzcGVjICpfX3JlcykgX19USFJPVzsKKworLyogR2V0IGN1cnJlbnQgdmFsdWUgb2YgY2xvY2sgQ0xPQ0tfSUQgYW5kIHN0b3JlIGl0IGluIFRQLiAgKi8KK2V4dGVybiBpbnQgY2xvY2tfZ2V0dGltZSAoY2xvY2tpZF90IF9fY2xvY2tfaWQsIHN0cnVjdCB0aW1lc3BlYyAqX190cCkgX19USFJPVzsKKworLyogU2V0IGNsb2NrIENMT0NLX0lEIHRvIHZhbHVlIFRQLiAgKi8KK2V4dGVybiBpbnQgY2xvY2tfc2V0dGltZSAoY2xvY2tpZF90IF9fY2xvY2tfaWQsIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3RwKQorICAgICBfX1RIUk9XOworCisjICBpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBIaWdoLXJlc29sdXRpb24gc2xlZXAgd2l0aCB0aGUgc3BlY2lmaWVkIGNsb2NrLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgY2xvY2tfbmFub3NsZWVwIChjbG9ja2lkX3QgX19jbG9ja19pZCwgaW50IF9fZmxhZ3MsCisJCQkgICAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVxLAorCQkJICAgIHN0cnVjdCB0aW1lc3BlYyAqX19yZW0pOworCisvKiBSZXR1cm4gY2xvY2sgSUQgZm9yIENQVS10aW1lIGNsb2NrLiAgKi8KK2V4dGVybiBpbnQgY2xvY2tfZ2V0Y3B1Y2xvY2tpZCAocGlkX3QgX19waWQsIGNsb2NraWRfdCAqX19jbG9ja19pZCkgX19USFJPVzsKKyMgIGVuZGlmCisKKworLyogQ3JlYXRlIG5ldyBwZXItcHJvY2VzcyB0aW1lciB1c2luZyBDTE9DS19JRC4gICovCitleHRlcm4gaW50IHRpbWVyX2NyZWF0ZSAoY2xvY2tpZF90IF9fY2xvY2tfaWQsCisJCQkgc3RydWN0IHNpZ2V2ZW50ICpfX3Jlc3RyaWN0IF9fZXZwLAorCQkJIHRpbWVyX3QgKl9fcmVzdHJpY3QgX190aW1lcmlkKSBfX1RIUk9XOworCisvKiBEZWxldGUgdGltZXIgVElNRVJJRC4gICovCitleHRlcm4gaW50IHRpbWVyX2RlbGV0ZSAodGltZXJfdCBfX3RpbWVyaWQpIF9fVEhST1c7CisKKy8qIFNldCB0aW1lciBUSU1FUklEIHRvIFZBTFVFLCByZXR1cm5pbmcgb2xkIHZhbHVlIGluIE9WTEFVRS4gICovCitleHRlcm4gaW50IHRpbWVyX3NldHRpbWUgKHRpbWVyX3QgX190aW1lcmlkLCBpbnQgX19mbGFncywKKwkJCSAgX19jb25zdCBzdHJ1Y3QgaXRpbWVyc3BlYyAqX19yZXN0cmljdCBfX3ZhbHVlLAorCQkJICBzdHJ1Y3QgaXRpbWVyc3BlYyAqX19yZXN0cmljdCBfX292YWx1ZSkgX19USFJPVzsKKworLyogR2V0IGN1cnJlbnQgdmFsdWUgb2YgdGltZXIgVElNRVJJRCBhbmQgc3RvcmUgaXQgaW4gVkxBVUUuICAqLworZXh0ZXJuIGludCB0aW1lcl9nZXR0aW1lICh0aW1lcl90IF9fdGltZXJpZCwgc3RydWN0IGl0aW1lcnNwZWMgKl9fdmFsdWUpCisgICAgIF9fVEhST1c7CisKKy8qIEdldCBleHBpcmF0aW9uIG92ZXJydW4gZm9yIHRpbWVyIFRJTUVSSUQuICAqLworZXh0ZXJuIGludCB0aW1lcl9nZXRvdmVycnVuICh0aW1lcl90IF9fdGltZXJpZCkgX19USFJPVzsKKyMgZW5kaWYKKworCisjIGlmZGVmIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBTZXQgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIHRvIGluZGljYXRlIGFuIGVycm9yLgorICAgICAxICB0aGUgREFURU1TSyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBudWxsIG9yIHVuZGVmaW5lZCwKKyAgICAgMiAgdGhlIHRlbXBsYXRlIGZpbGUgY2Fubm90IGJlIG9wZW5lZCBmb3IgcmVhZGluZywKKyAgICAgMyAgZmFpbGVkIHRvIGdldCBmaWxlIHN0YXR1cyBpbmZvcm1hdGlvbiwKKyAgICAgNCAgdGhlIHRlbXBsYXRlIGZpbGUgaXMgbm90IGEgcmVndWxhciBmaWxlLAorICAgICA1ICBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCB3aGlsZSByZWFkaW5nIHRoZSB0ZW1wbGF0ZSBmaWxlLAorICAgICA2ICBtZW1vcnkgYWxsaWNhdGlvbiBmYWlsZWQgKG5vdCBlbm91Z2ggbWVtb3J5IGF2YWlsYWJsZSksCisgICAgIDcgIHRoZXJlIGlzIG5vIGxpbmUgaW4gdGhlIHRlbXBsYXRlIHRoYXQgbWF0Y2hlcyB0aGUgaW5wdXQsCisgICAgIDggIGludmFsaWQgaW5wdXQgc3BlY2lmaWNhdGlvbiBFeGFtcGxlOiBGZWJydWFyeSAzMSBvciBhIHRpbWUgaXMKKwlzcGVjaWZpZWQgdGhhdCBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGluIGEgdGltZV90IChyZXByZXNlbnRpbmcKKwl0aGUgdGltZSBpbiBzZWNvbmRzIHNpbmNlIDAwOjAwOjAwIFVUQywgSmFudWFyeSAxLCAxOTcwKSAqLworZXh0ZXJuIGludCBnZXRkYXRlX2VycjsKKworLyogUGFyc2UgdGhlIGdpdmVuIHN0cmluZyBhcyBhIGRhdGUgc3BlY2lmaWNhdGlvbiBhbmQgcmV0dXJuIGEgdmFsdWUKKyAgIHJlcHJlc2VudGluZyB0aGUgdmFsdWUuICBUaGUgdGVtcGxhdGVzIGZyb20gdGhlIGZpbGUgaWRlbnRpZmllZCBieQorICAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIERBVEVNU0sgYXJlIHVzZWQuICBJbiBjYXNlIG9mIGFuIGVycm9yCisgICBgZ2V0ZGF0ZV9lcnInIGlzIHNldC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHRtICpnZXRkYXRlIChfX2NvbnN0IGNoYXIgKl9fc3RyaW5nKTsKKyMgZW5kaWYKKworIyBpZmRlZiBfX1VTRV9HTlUKKy8qIFNpbmNlIGBnZXRkYXRlJyBpcyBub3QgcmVlbnRyYW50IGJlY2F1c2Ugb2YgdGhlIHVzZSBvZiBgZ2V0ZGF0ZV9lcnInCisgICBhbmQgdGhlIHN0YXRpYyBidWZmZXIgdG8gcmV0dXJuIHRoZSByZXN1bHQgaW4sIHdlIHByb3ZpZGUgYSB0aHJlYWQtc2FmZQorICAgdmFyaWFudC4gIFRoZSBmdW5jdGlvbmFsaXR5IGlzIHRoZSBzYW1lLiAgVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBpbgorICAgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IFJFU0JVRlAgYW5kIGluIGNhc2Ugb2YgYW4gZXJyb3IgdGhlIHJldHVybgorICAgdmFsdWUgaXMgIT0gMCB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhcyBnaXZlbiBhYm92ZSBmb3IgYGdldGRhdGVfZXJyJy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRkYXRlX3IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cmluZywKKwkJICAgICAgc3RydWN0IHRtICpfX3Jlc3RyaWN0IF9fcmVzYnVmcCk7CisjIGVuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiA8dGltZS5oPiBpbmNsdWRlZC4gICovCisKKyNlbmRpZiAvKiA8dGltZS5oPiBub3QgYWxyZWFkeSBpbmNsdWRlZC4gICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3R0eWVudC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS90dHllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjIyMWJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS90dHllbnQuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXR0eWVudC5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICovCisKKyNpZm5kZWYJX1RUWUVOVF9ICisjZGVmaW5lCV9UVFlFTlRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lCV9QQVRIX1RUWVMJIi9ldGMvdHR5cyIKKworI2RlZmluZQlfVFRZU19PRkYJIm9mZiIKKyNkZWZpbmUJX1RUWVNfT04JIm9uIgorI2RlZmluZQlfVFRZU19TRUNVUkUJInNlY3VyZSIKKyNkZWZpbmUJX1RUWVNfV0lORE9XCSJ3aW5kb3ciCisKK3N0cnVjdCB0dHllbnQgeworCWNoYXIJKnR5X25hbWU7CS8qIHRlcm1pbmFsIGRldmljZSBuYW1lICovCisJY2hhcgkqdHlfZ2V0dHk7CS8qIGNvbW1hbmQgdG8gZXhlY3V0ZSwgdXN1YWxseSBnZXR0eSAqLworCWNoYXIJKnR5X3R5cGU7CS8qIHRlcm1pbmFsIHR5cGUgZm9yIHRlcm1jYXAgKi8KKyNkZWZpbmUJVFRZX09OCQkweDAxCS8qIGVuYWJsZSBsb2dpbnMgKHN0YXJ0IHR5X2dldHR5IHByb2dyYW0pICovCisjZGVmaW5lCVRUWV9TRUNVUkUJMHgwMgkvKiBhbGxvdyB1aWQgb2YgMCB0byBsb2dpbiAqLworCWludAl0eV9zdGF0dXM7CS8qIHN0YXR1cyBmbGFncyAqLworCWNoYXIgCSp0eV93aW5kb3c7CS8qIGNvbW1hbmQgdG8gc3RhcnQgdXAgd2luZG93IG1hbmFnZXIgKi8KKwljaGFyCSp0eV9jb21tZW50OwkvKiBjb21tZW50IGZpZWxkICovCit9OworCisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIHN0cnVjdCB0dHllbnQgKmdldHR0eWVudCAodm9pZCkgX19USFJPVzsKK2V4dGVybiBzdHJ1Y3QgdHR5ZW50ICpnZXR0dHluYW0gKF9fY29uc3QgY2hhciAqX190dHkpIF9fVEhST1c7CitleHRlcm4gaW50IHNldHR0eWVudCAodm9pZCkgX19USFJPVzsKK2V4dGVybiBpbnQgZW5kdHR5ZW50ICh2b2lkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogdHR5ZW50LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdWNvbnRleHQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdWNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmViNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS91Y29udGV4dC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogU3lzdGVtIFYgQUJJIGNvbXBsaWFudCB1c2VyLWxldmVsIGNvbnRleHQgc3dpdGNoaW5nIHN1cHBvcnQuICAqLworCisjaWZuZGVmIF9VQ09OVEVYVF9ICisjZGVmaW5lIF9VQ09OVEVYVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCBtYWNoaW5lIGRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGRhdGEgc3RydWN0dXJlcy4gICovCisjaW5jbHVkZSA8c3lzL3Vjb250ZXh0Lmg+CisKK19fQkVHSU5fREVDTFMKKworLyogR2V0IHVzZXIgY29udGV4dCBhbmQgc3RvcmUgaXQgaW4gdmFyaWFibGUgcG9pbnRlZCB0byBieSBVQ1AuICAqLworZXh0ZXJuIGludCBnZXRjb250ZXh0ICh1Y29udGV4dF90ICpfX3VjcCkgX19USFJPV05MOworCisvKiBTZXQgdXNlciBjb250ZXh0IGZyb20gaW5mb3JtYXRpb24gb2YgdmFyaWFibGUgcG9pbnRlZCB0byBieSBVQ1AuICAqLworZXh0ZXJuIGludCBzZXRjb250ZXh0IChfX2NvbnN0IHVjb250ZXh0X3QgKl9fdWNwKSBfX1RIUk9XTkw7CisKKy8qIFNhdmUgY3VycmVudCBjb250ZXh0IGluIGNvbnRleHQgdmFyaWFibGUgcG9pbnRlZCB0byBieSBPVUNQIGFuZCBzZXQKKyAgIGNvbnRleHQgZnJvbSB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5IFVDUC4gICovCitleHRlcm4gaW50IHN3YXBjb250ZXh0ICh1Y29udGV4dF90ICpfX3Jlc3RyaWN0IF9fb3VjcCwKKwkJCV9fY29uc3QgdWNvbnRleHRfdCAqX19yZXN0cmljdCBfX3VjcCkgX19USFJPV05MOworCisvKiBNYW5pcHVsYXRlIHVzZXIgY29udGV4dCBVQ1AgdG8gY29udGludWUgd2l0aCBjYWxsaW5nIGZ1bmN0aW9ucyBGVU5DCisgICBhbmQgdGhlIEFSR0MtMSBwYXJhbWV0ZXJzIGZvbGxvd2luZyBBUkdDIHdoZW4gdGhlIGNvbnRleHQgaXMgdXNlZAorICAgdGhlIG5leHQgdGltZSBpbiBgc2V0Y29udGV4dCcgb3IgYHN3YXBjb250ZXh0Jy4KKworICAgV2UgY2Fubm90IHNheSBhbnl0aGluZyBhYm91dCB0aGUgcGFyYW1ldGVycyBGVU5DIHRha2VzOyBgdm9pZCcKKyAgIGlzIGFzIGdvb2QgYXMgYW55IG90aGVyIGNob2ljZS4gICovCitleHRlcm4gdm9pZCBtYWtlY29udGV4dCAodWNvbnRleHRfdCAqX191Y3AsIHZvaWQgKCpfX2Z1bmMpICh2b2lkKSwKKwkJCSBpbnQgX19hcmdjLCAuLi4pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiB1Y29udGV4dC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3VsaW1pdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS91bGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2I1ZjM3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS91bGltaXQuaApAQCAtMCwwICsxLDQ4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1VMSU1JVF9ICisjZGVmaW5lIF9VTElNSVRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBDb25zdGFudHMgdXNlZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIGZvciBgdWxpbWl0Jy4gIFRoZXkgZGVub3RlIGxpbWl0cworICAgd2hpY2ggY2FuIGJlIHNldCBvciByZXRyaWV2ZWQgdXNpbmcgdGhpcyBmdW5jdGlvbi4gICovCitlbnVtCit7CisgIFVMX0dFVEZTSVpFID0gMSwJCQkvKiBSZXR1cm4gbGltaXQgb24gdGhlIHNpemUgb2YgYSBmaWxlLAorCQkJCQkgICBpbiB1bml0cyBvZiA1MTIgYnl0ZXMuICAqLworI2RlZmluZSBVTF9HRVRGU0laRQlVTF9HRVRGU0laRQorICBVTF9TRVRGU0laRSwJCQkJLyogU2V0IGxpbWl0IG9uIHRoZSBzaXplIG9mIGEgZmlsZSB0bworCQkJCQkgICBzZWNvbmQgYXJndW1lbnQuICAqLworI2RlZmluZSBVTF9TRVRGU0laRQlVTF9TRVRGU0laRQorICBfX1VMX0dFVE1BWEJSSywJCQkvKiBSZXR1cm4gdGhlIG1heGltdW0gcG9zc2libGUgYWRkcmVzcworCQkJCQkgICBvZiB0aGUgZGF0YSBzZWdtZW50LiAgKi8KKyAgX19VTF9HRVRPUEVOTUFYCQkJLyogUmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcworCQkJCQkgICB0aGF0IHRoZSBjYWxsaW5nIHByb2Nlc3MgY2FuIG9wZW4uKi8KK307CisKKworX19CRUdJTl9ERUNMUworCisvKiBDb250cm9sIHByb2Nlc3MgbGltaXRzIGFjY29yZGluZyB0byBDTUQuICAqLworZXh0ZXJuIGxvbmcgaW50IHVsaW1pdCAoaW50IF9fY21kLCAuLi4pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiB1bGltaXQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS91bmN0cmwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdW5jdHJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4NDRkNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdW5jdHJsLmgKQEAgLTAsMCArMSw2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA4LDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBBdXRob3I6IFpleWQgTS4gQmVuLUhhbGltIDx6bWJlbmhhbEBuZXRjb20uY29tPiAxOTkyLDE5OTUgICAgICAgICAgICAgICAqCisgKiAgICAgYW5kOiBFcmljIFMuIFJheW1vbmQgPGVzckBzbmFyay50aHlyc3VzLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiB1bmN0cmwuaAorICoKKyAqIERpc3BsYXkgYSBwcmludGFibGUgdmVyc2lvbiBvZiBhIGNvbnRyb2wgY2hhcmFjdGVyLgorICogQ29udHJvbCBjaGFyYWN0ZXJzIGFyZSBkaXNwbGF5ZWQgaW4gY2FyZXQgbm90YXRpb24gKF54KSwgREVMRVRFIGlzIGRpc3BsYXllZAorICogYXMgXj8uIFByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSBkaXNwbGF5ZWQgYXMgaXMuCisgKi8KKworLyogJElkOiB1bmN0cmwuaC5pbix2IDEuMTEgMjAwOS8wNC8xOCAyMTowMDo1MiB0b20gRXhwICQgKi8KKworI2lmbmRlZiBOQ1VSU0VTX1VOQ1RSTF9IX2luY2wKKyNkZWZpbmUgTkNVUlNFU19VTkNUUkxfSF9pbmNsCTEKKworI3VuZGVmICBOQ1VSU0VTX1ZFUlNJT04KKyNkZWZpbmUgTkNVUlNFU19WRVJTSU9OICI1LjkiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPGN1cnNlcy5oPgorCisjdW5kZWYgdW5jdHJsCitOQ1VSU0VTX0VYUE9SVChOQ1VSU0VTX0NPTlNUIGNoYXIgKikgdW5jdHJsIChjaHR5cGUpOworCisjaWYgMAorTkNVUlNFU19FWFBPUlQoTkNVUlNFU19DT05TVCBjaGFyICopIE5DVVJTRVNfU1BfTkFNRSh1bmN0cmwpIChTQ1JFRU4qLCBjaHR5cGUpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBOQ1VSU0VTX1VOQ1RSTF9IX2luY2wgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdW5pc3RkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3VuaXN0ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OTliNzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3VuaXN0ZC5oCkBAIC0wLDAgKzEsMTE3NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogMi4xMCBTeW1ib2xpYyBDb25zdGFudHMJCTx1bmlzdGQuaD4KKyAqLworCisjaWZuZGVmCV9VTklTVERfSAorI2RlZmluZQlfVU5JU1REX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUaGVzZSBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBmYWNpbGl0aWVzIGFyZSBwcmVzZW50IGF0IGNvbXBpbGUgdGltZS4KKyAgIFRoZWlyIHZhbHVlcyBjYW4gYmUgb2J0YWluZWQgYXQgcnVuIHRpbWUgZnJvbSBgc3lzY29uZicuICAqLworCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKy8qIFBPU0lYIFN0YW5kYXJkIGFwcHJvdmVkIGFzIElTTy9JRUMgOTk0NS0xIGFzIG9mIFNlcHRlbWJlciAyMDA4LiAgKi8KKyMgZGVmaW5lIF9QT1NJWF9WRVJTSU9OCTIwMDgwOUwKKyNlbGlmIGRlZmluZWQgX19VU0VfWE9QRU4ySworLyogUE9TSVggU3RhbmRhcmQgYXBwcm92ZWQgYXMgSVNPL0lFQyA5OTQ1LTEgYXMgb2YgRGVjZW1iZXIgMjAwMS4gICovCisjIGRlZmluZSBfUE9TSVhfVkVSU0lPTgkyMDAxMTJMCisjZWxpZiBkZWZpbmVkIF9fVVNFX1BPU0lYMTk5NTA2CisvKiBQT1NJWCBTdGFuZGFyZCBhcHByb3ZlZCBhcyBJU08vSUVDIDk5NDUtMSBhcyBvZiBKdW5lIDE5OTUuICAqLworIyBkZWZpbmUgX1BPU0lYX1ZFUlNJT04JMTk5NTA2TAorI2VsaWYgZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTMwOQorLyogUE9TSVggU3RhbmRhcmQgYXBwcm92ZWQgYXMgSVNPL0lFQyA5OTQ1LTEgYXMgb2YgU2VwdGVtYmVyIDE5OTMuICAqLworIyBkZWZpbmUgX1BPU0lYX1ZFUlNJT04JMTk5MzA5TAorI2Vsc2UKKy8qIFBPU0lYIFN0YW5kYXJkIGFwcHJvdmVkIGFzIElTTy9JRUMgOTk0NS0xIGFzIG9mIFNlcHRlbWJlciAxOTkwLiAgKi8KKyMgZGVmaW5lIF9QT1NJWF9WRVJTSU9OCTE5OTAwOUwKKyNlbmRpZgorCisvKiBUaGVzZSBhcmUgbm90ICNpZmRlZiBfX1VTRV9QT1NJWDIgYmVjYXVzZSB0aGV5IGFyZQorICAgaW4gdGhlIHRoZW9yZXRpY2FsbHkgYXBwbGljYXRpb24tb3duZWQgbmFtZXNwYWNlLiAgKi8KKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisjIGRlZmluZSBfX1BPU0lYMl9USElTX1ZFUlNJT04JMjAwODA5TAorLyogVGhlIHV0aWxpdGllcyBvbiBHTlUgc3lzdGVtcyBhbHNvIGNvcnJlc3BvbmQgdG8gdGhpcyB2ZXJzaW9uLiAgKi8KKyNlbGlmIGRlZmluZWQgX19VU0VfWE9QRU4ySworLyogVGhlIHV0aWxpdGllcyBvbiBHTlUgc3lzdGVtcyBhbHNvIGNvcnJlc3BvbmQgdG8gdGhpcyB2ZXJzaW9uLiAgKi8KKyMgZGVmaW5lIF9fUE9TSVgyX1RISVNfVkVSU0lPTgkyMDAxMTJMCisjZWxpZiBkZWZpbmVkIF9fVVNFX1BPU0lYMTk5NTA2CisvKiBUaGUgdXRpbGl0aWVzIG9uIEdOVSBzeXN0ZW1zIGFsc28gY29ycmVzcG9uZCB0byB0aGlzIHZlcnNpb24uICAqLworIyBkZWZpbmUgX19QT1NJWDJfVEhJU19WRVJTSU9OCTE5OTUwNkwKKyNlbHNlCisvKiBUaGUgdXRpbGl0aWVzIG9uIEdOVSBzeXN0ZW1zIGFsc28gY29ycmVzcG9uZCB0byB0aGlzIHZlcnNpb24uICAqLworIyBkZWZpbmUgX19QT1NJWDJfVEhJU19WRVJTSU9OCTE5OTIwOUwKKyNlbmRpZgorCisvKiBUaGUgdXRpbGl0aWVzIG9uIEdOVSBzeXN0ZW1zIGFsc28gY29ycmVzcG9uZCB0byB0aGlzIHZlcnNpb24uICAqLworI2RlZmluZSBfUE9TSVgyX1ZFUlNJT04JX19QT1NJWDJfVEhJU19WRVJTSU9OCisKKy8qIElmIGRlZmluZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUKKyAgIEMgTGFuZ3VhZ2UgQmluZGluZ3MgT3B0aW9uLiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9DX0JJTkQJX19QT1NJWDJfVEhJU19WRVJTSU9OCisKKy8qIElmIGRlZmluZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUKKyAgIEMgTGFuZ3VhZ2UgRGV2ZWxvcG1lbnQgVXRpbGl0aWVzIE9wdGlvbi4gICovCisjZGVmaW5lCV9QT1NJWDJfQ19ERVYJX19QT1NJWDJfVEhJU19WRVJTSU9OCisKKy8qIElmIGRlZmluZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUKKyAgIFNvZnR3YXJlIERldmVsb3BtZW50IFV0aWxpdGllcyBPcHRpb24uICAqLworI2RlZmluZQlfUE9TSVgyX1NXX0RFVglfX1BPU0lYMl9USElTX1ZFUlNJT04KKworLyogSWYgZGVmaW5lZCwgdGhlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHRoZQorICAgY3JlYXRpb24gb2YgbG9jYWxlcyB3aXRoIHRoZSBsb2NhbGVkZWYgdXRpbGl0eS4gICovCisjZGVmaW5lIF9QT1NJWDJfTE9DQUxFREVGICAgICAgIF9fUE9TSVgyX1RISVNfVkVSU0lPTgorCisvKiBYL09wZW4gdmVyc2lvbiBudW1iZXIgdG8gd2hpY2ggdGhlIGxpYnJhcnkgY29uZm9ybXMuICBJdCBpcyBzZWxlY3RhYmxlLiAgKi8KKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorIyBkZWZpbmUgX1hPUEVOX1ZFUlNJT04JNzAwCisjZWxpZiBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIF9YT1BFTl9WRVJTSU9OCTYwMAorI2VsaWYgZGVmaW5lZCBfX1VTRV9VTklYOTgKKyMgZGVmaW5lIF9YT1BFTl9WRVJTSU9OCTUwMAorI2Vsc2UKKyMgZGVmaW5lIF9YT1BFTl9WRVJTSU9OCTQKKyNlbmRpZgorCisvKiBDb21tYW5kcyBhbmQgdXRpbGl0aWVzIGZyb20gWFBHNCBhcmUgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1hPUEVOX1hDVV9WRVJTSU9OCTQKKworLyogV2UgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIHB1Ymxpc2hlZCBzdGFuZGFyZHMgYXMgd2VsbC4gICovCisjZGVmaW5lIF9YT1BFTl9YUEcyCTEKKyNkZWZpbmUgX1hPUEVOX1hQRzMJMQorI2RlZmluZSBfWE9QRU5fWFBHNAkxCisKKy8qIFRoZSBYL09wZW4gVW5peCBleHRlbnNpb25zIGFyZSBhdmFpbGFibGUuICAqLworI2RlZmluZSBfWE9QRU5fVU5JWAkxCisKKy8qIEVuY3J5cHRpb24gaXMgcHJlc2VudC4gICovCisjZGVmaW5lCV9YT1BFTl9DUllQVAkxCisKKy8qIFRoZSBlbmhhbmNlZCBpbnRlcm5hdGlvbmFsaXphdGlvbiBjYXBhYmlsaXRpZXMgYWNjb3JkaW5nIHRvIFhQRzQuMgorICAgYXJlIHByZXNlbnQuICAqLworI2RlZmluZQlfWE9QRU5fRU5IX0kxOE4JMQorCisvKiBUaGUgbGVnYWN5IGludGVyZmFjZXMgYXJlIGFsc28gYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1hPUEVOX0xFR0FDWQkxCisKKworLyogR2V0IHZhbHVlcyBvZiBQT1NJWCBvcHRpb25zOgorCisgICBJZiB0aGVzZSBzeW1ib2xzIGFyZSBkZWZpbmVkLCB0aGUgY29ycmVzcG9uZGluZyBmZWF0dXJlcyBhcmUKKyAgIGFsd2F5cyBhdmFpbGFibGUuICBJZiBub3QsIHRoZXkgbWF5IGJlIGF2YWlsYWJsZSBzb21ldGltZXMuCisgICBUaGUgY3VycmVudCB2YWx1ZXMgY2FuIGJlIG9idGFpbmVkIHdpdGggYHN5c2NvbmYnLgorCisgICBfUE9TSVhfSk9CX0NPTlRST0wJCUpvYiBjb250cm9sIGlzIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9TQVZFRF9JRFMJCVByb2Nlc3NlcyBoYXZlIGEgc2F2ZWQgc2V0LXVzZXItSUQKKwkJCQlhbmQgYSBzYXZlZCBzZXQtZ3JvdXAtSUQuCisgICBfUE9TSVhfUkVBTFRJTUVfU0lHTkFMUwlSZWFsLXRpbWUsIHF1ZXVlZCBzaWduYWxzIGFyZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORwlQcmlvcml0eSBzY2hlZHVsaW5nIGlzIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9USU1FUlMJCVBPU0lYLjQgY2xvY2tzIGFuZCB0aW1lcnMgYXJlIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9BU1lOQ0hST05PVVNfSU8JQXN5bmNocm9ub3VzIEkvTyBpcyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUFJJT1JJVElaRURfSU8JUHJpb3JpdGl6ZWQgYXN5bmNocm9ub3VzIEkvTyBpcyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfU1lOQ0hST05JWkVEX0lPCVN5bmNocm9uaXppbmcgZmlsZSBkYXRhIGlzIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9GU1lOQwkJCVRoZSBmc3luYyBmdW5jdGlvbiBpcyBwcmVzZW50LgorICAgX1BPU0lYX01BUFBFRF9GSUxFUwkJTWFwcGluZyBvZiBmaWxlcyB0byBtZW1vcnkgaXMgc3VwcG9ydGVkLgorICAgX1BPU0lYX01FTUxPQ0sJCUxvY2tpbmcgb2YgYWxsIG1lbW9yeSBpcyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfTUVNTE9DS19SQU5HRQkJTG9ja2luZyBvZiByYW5nZXMgb2YgbWVtb3J5IGlzIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9NRU1PUllfUFJPVEVDVElPTglTZXR0aW5nIG9mIG1lbW9yeSBwcm90ZWN0aW9ucyBpcyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfTUVTU0FHRV9QQVNTSU5HCVBPU0lYLjQgbWVzc2FnZSBxdWV1ZXMgYXJlIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9TRU1BUEhPUkVTCQlQT1NJWC40IGNvdW50aW5nIHNlbWFwaG9yZXMgYXJlIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9TSEFSRURfTUVNT1JZX09CSkVDVFMJUE9TSVguNCBzaGFyZWQgbWVtb3J5IG9iamVjdHMgYXJlIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9USFJFQURTCQlQT1NJWC4xYyBwdGhyZWFkcyBhcmUgc3VwcG9ydGVkLgorICAgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLQUREUglUaHJlYWQgc3RhY2sgYWRkcmVzcyBhdHRyaWJ1dGUgb3B0aW9uIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUJVGhyZWFkIHN0YWNrIHNpemUgYXR0cmlidXRlIG9wdGlvbiBzdXBwb3J0ZWQuCisgICBfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TCVRocmVhZC1zYWZlIGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCisJCQkJUE9TSVguMWMgdGhyZWFkIGV4ZWN1dGlvbiBzY2hlZHVsaW5nIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9USFJFQURfUFJJT19JTkhFUklUCVRocmVhZCBwcmlvcml0eSBpbmhlcml0YW5jZSBvcHRpb24gc3VwcG9ydGVkLgorICAgX1BPU0lYX1RIUkVBRF9QUklPX1BST1RFQ1QJVGhyZWFkIHByaW9yaXR5IHByb3RlY3Rpb24gb3B0aW9uIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9USFJFQURfUFJPQ0VTU19TSEFSRUQJUHJvY2Vzcy1zaGFyZWQgc3luY2hyb25pemF0aW9uIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9QSUkJCQlQcm90b2NvbC1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIGFyZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUElJX1hUSQkJWFRJIHByb3RvY29sLWluZGVwLiBpbnRlcmZhY2VzIGFyZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUElJX1NPQ0tFVAkJU29ja2V0IHByb3RvY29sLWluZGVwLiBpbnRlcmZhY2VzIGFyZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUElJX0lOVEVSTkVUCQlJbnRlcm5ldCBmYW1pbHkgb2YgcHJvdG9jb2xzIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9QSUlfSU5URVJORVRfU1RSRUFNCUNvbm5lY3Rpb24tbW9kZSBJbnRlcm5ldCBwcm90b2NvbCBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUElJX0lOVEVSTkVUX0RHUkFNCUNvbm5lY3Rpb25sZXNzIEludGVybmV0IHByb3RvY29sIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9QSUlfT1NJCQlJU08vT1NJIGZhbWlseSBvZiBwcm90b2NvbHMgc3VwcG9ydGVkLgorICAgX1BPU0lYX1BJSV9PU0lfQ09UUwkJQ29ubmVjdGlvbi1tb2RlIElTTy9PU0kgc2VydmljZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUElJX09TSV9DTFRTCQlDb25uZWN0aW9ubGVzcyBJU08vT1NJIHNlcnZpY2Ugc3VwcG9ydGVkLgorICAgX1BPU0lYX1BPTEwJCQlJbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBgcG9sbCcgZnVuY3Rpb24uCisgICBfUE9TSVhfU0VMRUNUCQlJbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBgc2VsZWN0JyBhbmQgYHBzZWxlY3QnLgorCisgICBfWE9QRU5fUkVBTFRJTUUJCVgvT3BlbiByZWFsdGltZSBzdXBwb3J0IGlzIGF2YWlsYWJsZS4KKyAgIF9YT1BFTl9SRUFMVElNRV9USFJFQURTCVgvT3BlbiByZWFsdGltZSB0aHJlYWQgc3VwcG9ydCBpcyBhdmFpbGFibGUuCisgICBfWE9QRU5fU0hNCQkJU2hhcmVkIG1lbW9yeSBpbnRlcmZhY2UgYWNjb3JkaW5nIHRvIFhQRzQuMi4KKworICAgX1hCUzVfSUxQMzJfT0ZGMzIJCUltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGVudmlyb25tZW50IHdpdGggMzItYml0CisJCQkJaW50LCBsb25nLCBwb2ludGVyLCBhbmQgb2ZmX3QgdHlwZXMuCisgICBfWEJTNV9JTFAzMl9PRkZCSUcJCUltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGVudmlyb25tZW50IHdpdGggMzItYml0CisJCQkJaW50LCBsb25nLCBhbmQgcG9pbnRlciBhbmQgb2ZmX3Qgd2l0aCBhdCBsZWFzdAorCQkJCTY0IGJpdHMuCisgICBfWEJTNV9MUDY0X09GRjY0CQlJbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBlbnZpcm9ubWVudCB3aXRoIDMyLWJpdAorCQkJCWludCwgYW5kIDY0LWJpdCBsb25nLCBwb2ludGVyLCBhbmQgb2ZmX3QgdHlwZXMuCisgICBfWEJTNV9MUEJJR19PRkZCSUcJCUltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGVudmlyb25tZW50IHdpdGggYXQKKwkJCQlsZWFzdCAzMiBiaXRzIGludCBhbmQgbG9uZywgcG9pbnRlciwgYW5kIG9mZl90CisJCQkJd2l0aCBhdCBsZWFzdCA2NCBiaXRzLgorCisgICBJZiBhbnkgb2YgdGhlc2Ugc3ltYm9scyBpcyBkZWZpbmVkIGFzIC0xLCB0aGUgY29ycmVzcG9uZGluZyBvcHRpb24gaXMgbm90CisgICB0cnVlIGZvciBhbnkgZmlsZS4gIElmIGFueSBpcyBkZWZpbmVkIGFzIG90aGVyIHRoYW4gLTEsIHRoZSBjb3JyZXNwb25kaW5nCisgICBvcHRpb24gaXMgdHJ1ZSBmb3IgYWxsIGZpbGVzLiAgSWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgYXQgYWxsLCB0aGUgdmFsdWUKKyAgIGZvciBhIHNwZWNpZmljIGZpbGUgY2FuIGJlIG9idGFpbmVkIGZyb20gYHBhdGhjb25mJyBhbmQgYGZwYXRoY29uZicuCisKKyAgIF9QT1NJWF9DSE9XTl9SRVNUUklDVEVECU9ubHkgdGhlIHN1cGVyIHVzZXIgY2FuIHVzZSBgY2hvd24nIHRvIGNoYW5nZQorCQkJCXRoZSBvd25lciBvZiBhIGZpbGUuICBgY2hvd24nIGNhbiBvbmx5IGJlIHVzZWQKKwkJCQl0byBjaGFuZ2UgdGhlIGdyb3VwIElEIG9mIGEgZmlsZSB0byBhIGdyb3VwIG9mCisJCQkJd2hpY2ggdGhlIGNhbGxpbmcgcHJvY2VzcyBpcyBhIG1lbWJlci4KKyAgIF9QT1NJWF9OT19UUlVOQwkJUGF0aG5hbWUgY29tcG9uZW50cyBsb25nZXIgdGhhbgorCQkJCU5BTUVfTUFYIGdlbmVyYXRlIGFuIGVycm9yLgorICAgX1BPU0lYX1ZESVNBQkxFCQlJZiBkZWZpbmVkLCBpZiB0aGUgdmFsdWUgb2YgYW4gZWxlbWVudCBvZiB0aGUKKwkJCQlgY19jYycgbWVtYmVyIG9mIGBzdHJ1Y3QgdGVybWlvcycgaXMKKwkJCQlfUE9TSVhfVkRJU0FCTEUsIG5vIGNoYXJhY3RlciB3aWxsIGhhdmUgdGhlCisJCQkJZWZmZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGF0IGVsZW1lbnQuCisgICBfUE9TSVhfU1lOQ19JTwkJU3luY2hyb25vdXMgSS9PIG1heSBiZSBwZXJmb3JtZWQuCisgICBfUE9TSVhfQVNZTkNfSU8JCUFzeW5jaHJvbm91cyBJL08gbWF5IGJlIHBlcmZvcm1lZC4KKyAgIF9QT1NJWF9QUklPX0lPCQlQcmlvcml0aXplZCBBc3luY2hyb25vdXMgSS9PIG1heSBiZSBwZXJmb3JtZWQuCisKKyAgIFN1cHBvcnQgZm9yIHRoZSBMYXJnZSBGaWxlIFN1cHBvcnQgaW50ZXJmYWNlIGlzIG5vdCBnZW5lcmFsbHkgYXZhaWxhYmxlLgorICAgSWYgaXQgaXMgYXZhaWxhYmxlIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSBkZWZpbmVkIHRvIG9uZS4KKyAgIF9MRlM2NF9MQVJHRUZJTEUJCUxvdy1sZXZlbCBJL08gc3VwcG9ydHMgbGFyZ2UgZmlsZXMuCisgICBfTEZTNjRfU1RESU8JCQlTdGFuZGFyZCBJL08gc3VwcG9ydHMgbGFyZ2UgZmlsZXMuCisgICAqLworCisjaW5jbHVkZSA8Yml0cy9wb3NpeF9vcHQuaD4KKworLyogR2V0IHRoZSBlbnZpcm9ubWVudCBkZWZpbml0aW9ucyBmcm9tIFVuaXg5OC4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9VTklYOTggfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisjIGluY2x1ZGUgPGJpdHMvZW52aXJvbm1lbnRzLmg+CisjZW5kaWYKKworLyogU3RhbmRhcmQgZmlsZSBkZXNjcmlwdG9ycy4gICovCisjZGVmaW5lCVNURElOX0ZJTEVOTwkwCS8qIFN0YW5kYXJkIGlucHV0LiAgKi8KKyNkZWZpbmUJU1RET1VUX0ZJTEVOTwkxCS8qIFN0YW5kYXJkIG91dHB1dC4gICovCisjZGVmaW5lCVNUREVSUl9GSUxFTk8JMgkvKiBTdGFuZGFyZCBlcnJvciBvdXRwdXQuICAqLworCisKKy8qIEFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgbm90IGRlY2xhcmVkIGFueXdoZXJlIGVsc2UuICAqLworCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisjaWZuZGVmCV9fc3NpemVfdF9kZWZpbmVkCit0eXBlZGVmIF9fc3NpemVfdCBzc2l6ZV90OworIyBkZWZpbmUgX19zc2l6ZV90X2RlZmluZWQKKyNlbmRpZgorCisjZGVmaW5lCV9fbmVlZF9zaXplX3QKKyNkZWZpbmUgX19uZWVkX05VTEwKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisvKiBUaGUgU2luZ2xlIFVuaXggc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgc29tZSBtb3JlIHR5cGVzIGFyZQorICAgYXZhaWxhYmxlIGhlcmUuICAqLworIyBpZm5kZWYgX19naWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZ2lkX3QgZ2lkX3Q7CisjICBkZWZpbmUgX19naWRfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fdWlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3VpZF90IHVpZF90OworIyAgZGVmaW5lIF9fdWlkX3RfZGVmaW5lZAorIyBlbmRpZgorCisjIGlmbmRlZiBfX29mZl90X2RlZmluZWQKKyMgIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9fb2ZmX3Qgb2ZmX3Q7CisjICBlbHNlCit0eXBlZGVmIF9fb2ZmNjRfdCBvZmZfdDsKKyMgIGVuZGlmCisjICBkZWZpbmUgX19vZmZfdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmIGRlZmluZWQgX19VU0VfTEFSR0VGSUxFNjQgJiYgIWRlZmluZWQgX19vZmY2NF90X2RlZmluZWQKK3R5cGVkZWYgX19vZmY2NF90IG9mZjY0X3Q7CisjICBkZWZpbmUgX19vZmY2NF90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX191c2Vjb25kc190X2RlZmluZWQKK3R5cGVkZWYgX191c2Vjb25kc190IHVzZWNvbmRzX3Q7CisjICBkZWZpbmUgX191c2Vjb25kc190X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19waWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fcGlkX3QgcGlkX3Q7CisjICBkZWZpbmUgX19waWRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYJLyogWC9PcGVuICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgaWZuZGVmIF9faW50cHRyX3RfZGVmaW5lZAordHlwZWRlZiBfX2ludHB0cl90IGludHB0cl90OworIyAgZGVmaW5lIF9faW50cHRyX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisjIGlmbmRlZiBfX3NvY2tsZW5fdF9kZWZpbmVkCit0eXBlZGVmIF9fc29ja2xlbl90IHNvY2tsZW5fdDsKKyMgIGRlZmluZSBfX3NvY2tsZW5fdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworLyogVmFsdWVzIGZvciB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGFjY2Vzcy4KKyAgIFRoZXNlIG1heSBiZSBPUidkIHRvZ2V0aGVyLiAgKi8KKyNkZWZpbmUJUl9PSwk0CQkvKiBUZXN0IGZvciByZWFkIHBlcm1pc3Npb24uICAqLworI2RlZmluZQlXX09LCTIJCS8qIFRlc3QgZm9yIHdyaXRlIHBlcm1pc3Npb24uICAqLworI2RlZmluZQlYX09LCTEJCS8qIFRlc3QgZm9yIGV4ZWN1dGUgcGVybWlzc2lvbi4gICovCisjZGVmaW5lCUZfT0sJMAkJLyogVGVzdCBmb3IgZXhpc3RlbmNlLiAgKi8KKworLyogVGVzdCBmb3IgYWNjZXNzIHRvIE5BTUUgdXNpbmcgdGhlIHJlYWwgVUlEIGFuZCByZWFsIEdJRC4gICovCitleHRlcm4gaW50IGFjY2VzcyAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX3R5cGUpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfR05VCisvKiBUZXN0IGZvciBhY2Nlc3MgdG8gTkFNRSB1c2luZyB0aGUgZWZmZWN0aXZlIFVJRCBhbmQgR0lECisgICAoYXMgbm9ybWFsIGZpbGUgb3BlcmF0aW9ucyB1c2UpLiAgKi8KK2V4dGVybiBpbnQgZXVpZGFjY2VzcyAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX3R5cGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBBbiBhbGlhcyBmb3IgYGV1aWRhY2Nlc3MnLCB1c2VkIGJ5IHNvbWUgb3RoZXIgc3lzdGVtcy4gICovCitleHRlcm4gaW50IGVhY2Nlc3MgKF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQgX190eXBlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBUZXN0IGZvciBhY2Nlc3MgdG8gRklMRSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IEZEIGlzIG9wZW4gb24uCisgICBJZiBBVF9FQUNDRVNTIGlzIHNldCBpbiBGTEFHLCB0aGVuIHVzZSBlZmZlY3RpdmUgSURzIGxpa2UgYGVhY2Nlc3MnLAorICAgb3RoZXJ3aXNlIHVzZSByZWFsIElEcyBsaWtlIGBhY2Nlc3MnLiAgKi8KK2V4dGVybiBpbnQgZmFjY2Vzc2F0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX2ZpbGUsIGludCBfX3R5cGUsIGludCBfX2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpIF9fd3VyOworI2VuZGlmIC8qIFVzZSBHTlUuICAqLworCisKKy8qIFZhbHVlcyBmb3IgdGhlIFdIRU5DRSBhcmd1bWVudCB0byBsc2Vlay4gICovCisjaWZuZGVmCV9TVERJT19ICQkvKiA8c3RkaW8uaD4gaGFzIHRoZSBzYW1lIGRlZmluaXRpb25zLiAgKi8KKyMgZGVmaW5lIFNFRUtfU0VUCTAJLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyMgZGVmaW5lIFNFRUtfQ1VSCTEJLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLworIyBkZWZpbmUgU0VFS19FTkQJMgkvKiBTZWVrIGZyb20gZW5kIG9mIGZpbGUuICAqLworIyBpZmRlZiBfX1VTRV9HTlUKKyMgIGRlZmluZSBTRUVLX0RBVEEJMwkvKiBTZWVrIHRvIG5leHQgZGF0YS4gICovCisjICBkZWZpbmUgU0VFS19IT0xFCTQJLyogU2VlayB0byBuZXh0IGhvbGUuICAqLworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCAmJiAhZGVmaW5lZCBMX1NFVAorLyogT2xkIEJTRCBuYW1lcyBmb3IgdGhlIHNhbWUgY29uc3RhbnRzOyBqdXN0IGZvciBjb21wYXRpYmlsaXR5LiAgKi8KKyMgZGVmaW5lIExfU0VUCQlTRUVLX1NFVAorIyBkZWZpbmUgTF9JTkNSCQlTRUVLX0NVUgorIyBkZWZpbmUgTF9YVE5ECQlTRUVLX0VORAorI2VuZGlmCisKKworLyogTW92ZSBGRCdzIGZpbGUgcG9zaXRpb24gdG8gT0ZGU0VUIGJ5dGVzIGZyb20gdGhlCisgICBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKGlmIFdIRU5DRSBpcyBTRUVLX1NFVCksCisgICB0aGUgY3VycmVudCBwb3NpdGlvbiAoaWYgV0hFTkNFIGlzIFNFRUtfQ1VSKSwKKyAgIG9yIHRoZSBlbmQgb2YgdGhlIGZpbGUgKGlmIFdIRU5DRSBpcyBTRUVLX0VORCkuCisgICBSZXR1cm4gdGhlIG5ldyBmaWxlIHBvc2l0aW9uLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIF9fb2ZmX3QgbHNlZWsgKGludCBfX2ZkLCBfX29mZl90IF9fb2Zmc2V0LCBpbnQgX193aGVuY2UpIF9fVEhST1c7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIF9fb2ZmNjRfdCBfX1JFRElSRUNUX05USCAobHNlZWssCisJCQkJIChpbnQgX19mZCwgX19vZmY2NF90IF9fb2Zmc2V0LCBpbnQgX193aGVuY2UpLAorCQkJCSBsc2VlazY0KTsKKyMgZWxzZQorIyAgZGVmaW5lIGxzZWVrIGxzZWVrNjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gX19vZmY2NF90IGxzZWVrNjQgKGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQsIGludCBfX3doZW5jZSkKKyAgICAgX19USFJPVzsKKyNlbmRpZgorCisvKiBDbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yIEZELgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgY2xvc2UgKGludCBfX2ZkKTsKKworLyogUmVhZCBOQllURVMgaW50byBCVUYgZnJvbSBGRC4gIFJldHVybiB0aGUKKyAgIG51bWJlciByZWFkLCAtMSBmb3IgZXJyb3JzIG9yIDAgZm9yIEVPRi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCByZWFkIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcykgX193dXI7CisKKy8qIFdyaXRlIE4gYnl0ZXMgb2YgQlVGIHRvIEZELiAgUmV0dXJuIHRoZSBudW1iZXIgd3JpdHRlbiwgb3IgLTEuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3Qgd3JpdGUgKGludCBfX2ZkLCBfX2NvbnN0IHZvaWQgKl9fYnVmLCBzaXplX3QgX19uKSBfX3d1cjsKKworI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKy8qIFJlYWQgTkJZVEVTIGludG8gQlVGIGZyb20gRkQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIE9GRlNFVCB3aXRob3V0CisgICBjaGFuZ2luZyB0aGUgZmlsZSBwb2ludGVyLiAgUmV0dXJuIHRoZSBudW1iZXIgcmVhZCwgLTEgZm9yIGVycm9ycworICAgb3IgMCBmb3IgRU9GLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHByZWFkIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJICAgICAgX19vZmZfdCBfX29mZnNldCkgX193dXI7CisKKy8qIFdyaXRlIE4gYnl0ZXMgb2YgQlVGIHRvIEZEIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBPRkZTRVQgd2l0aG91dAorICAgY2hhbmdpbmcgdGhlIGZpbGUgcG9pbnRlci4gIFJldHVybiB0aGUgbnVtYmVyIHdyaXR0ZW4sIG9yIC0xLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHB3cml0ZSAoaW50IF9fZmQsIF9fY29uc3Qgdm9pZCAqX19idWYsIHNpemVfdCBfX24sCisJCSAgICAgICBfX29mZl90IF9fb2Zmc2V0KSBfX3d1cjsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAocHJlYWQsIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCQkgICBfX29mZjY0X3QgX19vZmZzZXQpLAorCQkJICAgcHJlYWQ2NCkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChwd3JpdGUsIChpbnQgX19mZCwgX19jb25zdCB2b2lkICpfX2J1ZiwKKwkJCQkgICAgc2l6ZV90IF9fbmJ5dGVzLCBfX29mZjY0X3QgX19vZmZzZXQpLAorCQkJICAgcHdyaXRlNjQpIF9fd3VyOworIyAgZWxzZQorIyAgIGRlZmluZSBwcmVhZCBwcmVhZDY0CisjICAgZGVmaW5lIHB3cml0ZSBwd3JpdGU2NAorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorLyogUmVhZCBOQllURVMgaW50byBCVUYgZnJvbSBGRCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gT0ZGU0VUIHdpdGhvdXQKKyAgIGNoYW5naW5nIHRoZSBmaWxlIHBvaW50ZXIuICBSZXR1cm4gdGhlIG51bWJlciByZWFkLCAtMSBmb3IgZXJyb3JzCisgICBvciAwIGZvciBFT0YuICAqLworZXh0ZXJuIHNzaXplX3QgcHJlYWQ2NCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQlfX29mZjY0X3QgX19vZmZzZXQpIF9fd3VyOworLyogV3JpdGUgTiBieXRlcyBvZiBCVUYgdG8gRkQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIE9GRlNFVCB3aXRob3V0CisgICBjaGFuZ2luZyB0aGUgZmlsZSBwb2ludGVyLiAgUmV0dXJuIHRoZSBudW1iZXIgd3JpdHRlbiwgb3IgLTEuICAqLworZXh0ZXJuIHNzaXplX3QgcHdyaXRlNjQgKGludCBfX2ZkLCBfX2NvbnN0IHZvaWQgKl9fYnVmLCBzaXplX3QgX19uLAorCQkJIF9fb2ZmNjRfdCBfX29mZnNldCkgX193dXI7CisjIGVuZGlmCisjZW5kaWYKKworLyogQ3JlYXRlIGEgb25lLXdheSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgKHBpcGUpLgorICAgSWYgc3VjY2Vzc2Z1bCwgdHdvIGZpbGUgZGVzY3JpcHRvcnMgYXJlIHN0b3JlZCBpbiBQSVBFREVTOworICAgYnl0ZXMgd3JpdHRlbiBvbiBQSVBFREVTWzFdIGNhbiBiZSByZWFkIGZyb20gUElQRURFU1swXS4KKyAgIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAtMSBpZiBub3QuICAqLworZXh0ZXJuIGludCBwaXBlIChpbnQgX19waXBlZGVzWzJdKSBfX1RIUk9XIF9fd3VyOworCisjaWZkZWYgX19VU0VfR05VCisvKiBTYW1lIGFzIHBpcGUgYnV0IGFwcGx5IGZsYWdzIHBhc3NlZCBpbiBGTEFHUyB0byB0aGUgbmV3IGZpbGUKKyAgIGRlc2NyaXB0b3JzLiAgKi8KK2V4dGVybiBpbnQgcGlwZTIgKGludCBfX3BpcGVkZXNbMl0sIGludCBfX2ZsYWdzKSBfX1RIUk9XIF9fd3VyOworI2VuZGlmCisKKy8qIFNjaGVkdWxlIGFuIGFsYXJtLiAgSW4gU0VDT05EUyBzZWNvbmRzLCB0aGUgcHJvY2VzcyB3aWxsIGdldCBhIFNJR0FMUk0uCisgICBJZiBTRUNPTkRTIGlzIHplcm8sIGFueSBjdXJyZW50bHkgc2NoZWR1bGVkIGFsYXJtIHdpbGwgYmUgY2FuY2VsbGVkLgorICAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHJlbWFpbmluZyB1bnRpbCB0aGUgbGFzdAorICAgYWxhcm0gc2NoZWR1bGVkIHdvdWxkIGhhdmUgc2lnbmFsZWQsIG9yIHplcm8gaWYgdGhlcmUgd2Fzbid0IG9uZS4KKyAgIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZSB0byBpbmRpY2F0ZSBhbiBlcnJvciwgYnV0IHlvdSBjYW4gc2V0IGBlcnJubycKKyAgIHRvIDAgYW5kIGNoZWNrIGl0cyB2YWx1ZSBhZnRlciBjYWxsaW5nIGBhbGFybScsIGFuZCB0aGlzIG1pZ2h0IHRlbGwgeW91LgorICAgVGhlIHNpZ25hbCBtYXkgY29tZSBsYXRlIGR1ZSB0byBwcm9jZXNzb3Igc2NoZWR1bGluZy4gICovCitleHRlcm4gdW5zaWduZWQgaW50IGFsYXJtICh1bnNpZ25lZCBpbnQgX19zZWNvbmRzKSBfX1RIUk9XOworCisvKiBNYWtlIHRoZSBwcm9jZXNzIHNsZWVwIGZvciBTRUNPTkRTIHNlY29uZHMsIG9yIHVudGlsIGEgc2lnbmFsIGFycml2ZXMKKyAgIGFuZCBpcyBub3QgaWdub3JlZC4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBsZXNzCisgICB0aGFuIFNFQ09ORFMgd2hpY2ggaXQgYWN0dWFsbHkgc2xlcHQgKHRodXMgemVybyBpZiBpdCBzbGVwdCB0aGUgZnVsbCB0aW1lKS4KKyAgIElmIGEgc2lnbmFsIGhhbmRsZXIgZG9lcyBhIGBsb25nam1wJyBvciBtb2RpZmllcyB0aGUgaGFuZGxpbmcgb2YgdGhlCisgICBTSUdBTFJNIHNpZ25hbCB3aGlsZSBpbnNpZGUgYHNsZWVwJyBjYWxsLCB0aGUgaGFuZGxpbmcgb2YgdGhlIFNJR0FMUk0KKyAgIHNpZ25hbCBhZnRlcndhcmRzIGlzIHVuZGVmaW5lZC4gIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZSB0byBpbmRpY2F0ZQorICAgZXJyb3IsIGJ1dCBpZiBgc2xlZXAnIHJldHVybnMgU0VDT05EUywgaXQgcHJvYmFibHkgZGlkbid0IHdvcmsuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBzbGVlcCAodW5zaWduZWQgaW50IF9fc2Vjb25kcyk7CisKKyNpZiAoZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLOCkgXAorICAgIHx8IGRlZmluZWQgX19VU0VfQlNECisvKiBTZXQgYW4gYWxhcm0gdG8gZ28gb2ZmIChnZW5lcmF0aW5nIGEgU0lHQUxSTSBzaWduYWwpIGluIFZBTFVFCisgICBtaWNyb3NlY29uZHMuICBJZiBJTlRFUlZBTCBpcyBub256ZXJvLCB3aGVuIHRoZSBhbGFybSBnb2VzIG9mZiwgdGhlCisgICB0aW1lciBpcyByZXNldCB0byBnbyBvZmYgZXZlcnkgSU5URVJWQUwgbWljcm9zZWNvbmRzIHRoZXJlYWZ0ZXIuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHJlbWFpbmluZyBiZWZvcmUgdGhlIGFsYXJtLiAgKi8KK2V4dGVybiBfX3VzZWNvbmRzX3QgdWFsYXJtIChfX3VzZWNvbmRzX3QgX192YWx1ZSwgX191c2Vjb25kc190IF9faW50ZXJ2YWwpCisgICAgIF9fVEhST1c7CisKKy8qIFNsZWVwIFVTRUNPTkRTIG1pY3Jvc2Vjb25kcywgb3IgdW50aWwgYSBzaWduYWwgYXJyaXZlcyB0aGF0IGlzIG5vdCBibG9ja2VkCisgICBvciBpZ25vcmVkLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdXNsZWVwIChfX3VzZWNvbmRzX3QgX191c2Vjb25kcyk7CisjZW5kaWYKKworCisvKiBTdXNwZW5kIHRoZSBwcm9jZXNzIHVudGlsIGEgc2lnbmFsIGFycml2ZXMuCisgICBUaGlzIGFsd2F5cyByZXR1cm5zIC0xIGFuZCBzZXRzIGBlcnJubycgdG8gRUlOVFIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwYXVzZSAodm9pZCk7CisKKworLyogQ2hhbmdlIHRoZSBvd25lciBhbmQgZ3JvdXAgb2YgRklMRS4gICovCitleHRlcm4gaW50IGNob3duIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX191aWRfdCBfX293bmVyLCBfX2dpZF90IF9fZ3JvdXApCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisvKiBDaGFuZ2UgdGhlIG93bmVyIGFuZCBncm91cCBvZiB0aGUgZmlsZSB0aGF0IEZEIGlzIG9wZW4gb24uICAqLworZXh0ZXJuIGludCBmY2hvd24gKGludCBfX2ZkLCBfX3VpZF90IF9fb3duZXIsIF9fZ2lkX3QgX19ncm91cCkgX19USFJPVyBfX3d1cjsKKworCisvKiBDaGFuZ2Ugb3duZXIgYW5kIGdyb3VwIG9mIEZJTEUsIGlmIGl0IGlzIGEgc3ltYm9saWMKKyAgIGxpbmsgdGhlIG93bmVyc2hpcCBvZiB0aGUgc3ltYm9saWMgbGluayBpcyBjaGFuZ2VkLiAgKi8KK2V4dGVybiBpbnQgbGNob3duIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX191aWRfdCBfX293bmVyLCBfX2dpZF90IF9fZ3JvdXApCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworCisjZW5kaWYgLyogVXNlIEJTRCB8fCBYL09wZW4gVW5peC4gICovCisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIENoYW5nZSB0aGUgb3duZXIgYW5kIGdyb3VwIG9mIEZJTEUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBGRCBpcyBvcGVuCisgICBvbi4gICovCitleHRlcm4gaW50IGZjaG93bmF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fdWlkX3QgX19vd25lciwKKwkJICAgICBfX2dpZF90IF9fZ3JvdXAsIGludCBfX2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpIF9fd3VyOworI2VuZGlmIC8qIFVzZSBHTlUuICAqLworCisvKiBDaGFuZ2UgdGhlIHByb2Nlc3MncyB3b3JraW5nIGRpcmVjdG9yeSB0byBQQVRILiAgKi8KK2V4dGVybiBpbnQgY2hkaXIgKF9fY29uc3QgY2hhciAqX19wYXRoKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorLyogQ2hhbmdlIHRoZSBwcm9jZXNzJ3Mgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIG9uZSBGRCBpcyBvcGVuIG9uLiAgKi8KK2V4dGVybiBpbnQgZmNoZGlyIChpbnQgX19mZCkgX19USFJPVyBfX3d1cjsKKyNlbmRpZgorCisvKiBHZXQgdGhlIHBhdGhuYW1lIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LAorICAgYW5kIHB1dCBpdCBpbiBTSVpFIGJ5dGVzIG9mIEJVRi4gIFJldHVybnMgTlVMTCBpZiB0aGUKKyAgIGRpcmVjdG9yeSBjb3VsZG4ndCBiZSBkZXRlcm1pbmVkIG9yIFNJWkUgd2FzIHRvbyBzbWFsbC4KKyAgIElmIHN1Y2Nlc3NmdWwsIHJldHVybnMgQlVGLiAgSW4gR05VLCBpZiBCVUYgaXMgTlVMTCwKKyAgIGFuIGFycmF5IGlzIGFsbG9jYXRlZCB3aXRoIGBtYWxsb2MnOyB0aGUgYXJyYXkgaXMgU0laRQorICAgYnl0ZXMgbG9uZywgdW5sZXNzIFNJWkUgPT0gMCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhcworICAgYmlnIGFzIG5lY2Vzc2FyeS4gICovCitleHRlcm4gY2hhciAqZ2V0Y3dkIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fc2l6ZSkgX19USFJPVyBfX3d1cjsKKworI2lmZGVmCV9fVVNFX0dOVQorLyogUmV0dXJuIGEgbWFsbG9jJ2Qgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG5hbWUuCisgICBJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYFBXRCcgaXMgc2V0LCBhbmQgaXRzIHZhbHVlIGlzIGNvcnJlY3QsCisgICB0aGF0IHZhbHVlIGlzIHVzZWQuICAqLworZXh0ZXJuIGNoYXIgKmdldF9jdXJyZW50X2Rpcl9uYW1lICh2b2lkKSBfX1RIUk9XOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLOCkgXAorICAgIHx8IGRlZmluZWQgX19VU0VfQlNECisvKiBQdXQgdGhlIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGluIEJVRi4KKyAgIElmIHN1Y2Nlc3NmdWwsIHJldHVybiBCVUYuICBJZiBub3QsIHB1dCBhbiBlcnJvciBtZXNzYWdlIGluCisgICBCVUYgYW5kIHJldHVybiBOVUxMLiAgQlVGIHNob3VsZCBiZSBhdCBsZWFzdCBQQVRIX01BWCBieXRlcyBsb25nLiAgKi8KK2V4dGVybiBjaGFyICpnZXR3ZCAoY2hhciAqX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXyBfX3d1cjsKKyNlbmRpZgorCisKKy8qIER1cGxpY2F0ZSBGRCwgcmV0dXJuaW5nIGEgbmV3IGZpbGUgZGVzY3JpcHRvciBvbiB0aGUgc2FtZSBmaWxlLiAgKi8KK2V4dGVybiBpbnQgZHVwIChpbnQgX19mZCkgX19USFJPVyBfX3d1cjsKKworLyogRHVwbGljYXRlIEZEIHRvIEZEMiwgY2xvc2luZyBGRDIgYW5kIG1ha2luZyBpdCBvcGVuIG9uIHRoZSBzYW1lIGZpbGUuICAqLworZXh0ZXJuIGludCBkdXAyIChpbnQgX19mZCwgaW50IF9fZmQyKSBfX1RIUk9XOworCisjaWZkZWYgX19VU0VfR05VCisvKiBEdXBsaWNhdGUgRkQgdG8gRkQyLCBjbG9zaW5nIEZEMiBhbmQgbWFraW5nIGl0IG9wZW4gb24gdGhlIHNhbWUKKyAgIGZpbGUgd2hpbGUgc2V0dGluZyBmbGFncyBhY2NvcmRpbmcgdG8gRkxBR1MuICAqLworZXh0ZXJuIGludCBkdXAzIChpbnQgX19mZCwgaW50IF9fZmQyLCBpbnQgX19mbGFncykgX19USFJPVzsKKyNlbmRpZgorCisvKiBOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgIk5BTUU9VkFMVUUiIGVudmlyb25tZW50IHZhcmlhYmxlcy4gICovCitleHRlcm4gY2hhciAqKl9fZW52aXJvbjsKKyNpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKyNlbmRpZgorCisKKy8qIFJlcGxhY2UgdGhlIGN1cnJlbnQgcHJvY2VzcywgZXhlY3V0aW5nIFBBVEggd2l0aCBhcmd1bWVudHMgQVJHViBhbmQKKyAgIGVudmlyb25tZW50IEVOVlAuICBBUkdWIGFuZCBFTlZQIGFyZSB0ZXJtaW5hdGVkIGJ5IE5VTEwgcG9pbnRlcnMuICAqLworZXh0ZXJuIGludCBleGVjdmUgKF9fY29uc3QgY2hhciAqX19wYXRoLCBjaGFyICpfX2NvbnN0IF9fYXJndltdLAorCQkgICBjaGFyICpfX2NvbnN0IF9fZW52cFtdKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBFeGVjdXRlIHRoZSBmaWxlIEZEIHJlZmVycyB0bywgb3ZlcmxheWluZyB0aGUgcnVubmluZyBwcm9ncmFtIGltYWdlLgorICAgQVJHViBhbmQgRU5WUCBhcmUgcGFzc2VkIHRvIHRoZSBuZXcgcHJvZ3JhbSwgYXMgZm9yIGBleGVjdmUnLiAgKi8KK2V4dGVybiBpbnQgZmV4ZWN2ZSAoaW50IF9fZmQsIGNoYXIgKl9fY29uc3QgX19hcmd2W10sIGNoYXIgKl9fY29uc3QgX19lbnZwW10pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisKKworLyogRXhlY3V0ZSBQQVRIIHdpdGggYXJndW1lbnRzIEFSR1YgYW5kIGVudmlyb25tZW50IGZyb20gYGVudmlyb24nLiAgKi8KK2V4dGVybiBpbnQgZXhlY3YgKF9fY29uc3QgY2hhciAqX19wYXRoLCBjaGFyICpfX2NvbnN0IF9fYXJndltdKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogRXhlY3V0ZSBQQVRIIHdpdGggYWxsIGFyZ3VtZW50cyBhZnRlciBQQVRIIHVudGlsIGEgTlVMTCBwb2ludGVyLAorICAgYW5kIHRoZSBhcmd1bWVudCBhZnRlciB0aGF0IGZvciBlbnZpcm9ubWVudC4gICovCitleHRlcm4gaW50IGV4ZWNsZSAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fY29uc3QgY2hhciAqX19hcmcsIC4uLikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIEV4ZWN1dGUgUEFUSCB3aXRoIGFsbCBhcmd1bWVudHMgYWZ0ZXIgUEFUSCB1bnRpbAorICAgYSBOVUxMIHBvaW50ZXIgYW5kIGVudmlyb25tZW50IGZyb20gYGVudmlyb24nLiAgKi8KK2V4dGVybiBpbnQgZXhlY2wgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX2NvbnN0IGNoYXIgKl9fYXJnLCAuLi4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBFeGVjdXRlIEZJTEUsIHNlYXJjaGluZyBpbiB0aGUgYFBBVEgnIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0IGNvbnRhaW5zCisgICBubyBzbGFzaGVzLCB3aXRoIGFyZ3VtZW50cyBBUkdWIGFuZCBlbnZpcm9ubWVudCBmcm9tIGBlbnZpcm9uJy4gICovCitleHRlcm4gaW50IGV4ZWN2cCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIGNoYXIgKl9fY29uc3QgX19hcmd2W10pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBFeGVjdXRlIEZJTEUsIHNlYXJjaGluZyBpbiB0aGUgYFBBVEgnIGVudmlyb25tZW50IHZhcmlhYmxlIGlmCisgICBpdCBjb250YWlucyBubyBzbGFzaGVzLCB3aXRoIGFsbCBhcmd1bWVudHMgYWZ0ZXIgRklMRSB1bnRpbCBhCisgICBOVUxMIHBvaW50ZXIgYW5kIGVudmlyb25tZW50IGZyb20gYGVudmlyb24nLiAgKi8KK2V4dGVybiBpbnQgZXhlY2xwIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19jb25zdCBjaGFyICpfX2FyZywgLi4uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogRXhlY3V0ZSBGSUxFLCBzZWFyY2hpbmcgaW4gdGhlIGBQQVRIJyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBpdCBjb250YWlucworICAgbm8gc2xhc2hlcywgd2l0aCBhcmd1bWVudHMgQVJHViBhbmQgZW52aXJvbm1lbnQgZnJvbSBgZW52aXJvbicuICAqLworZXh0ZXJuIGludCBleGVjdnBlIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgY2hhciAqX19jb25zdCBfX2FyZ3ZbXSwKKwkJICAgIGNoYXIgKl9fY29uc3QgX19lbnZwW10pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBBZGQgSU5DIHRvIHByaW9yaXR5IG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuICAqLworZXh0ZXJuIGludCBuaWNlIChpbnQgX19pbmMpIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworCisvKiBUZXJtaW5hdGUgcHJvZ3JhbSBleGVjdXRpb24gd2l0aCB0aGUgbG93LW9yZGVyIDggYml0cyBvZiBTVEFUVVMuICAqLworZXh0ZXJuIHZvaWQgX2V4aXQgKGludCBfX3N0YXR1cykgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCisKKy8qIEdldCB0aGUgYF9QQ18qJyBzeW1ib2xzIGZvciB0aGUgTkFNRSBhcmd1bWVudCB0byBgcGF0aGNvbmYnIGFuZCBgZnBhdGhjb25mJzsKKyAgIHRoZSBgX1NDXyonIHN5bWJvbHMgZm9yIHRoZSBOQU1FIGFyZ3VtZW50IHRvIGBzeXNjb25mJzsKKyAgIGFuZCB0aGUgYF9DU18qJyBzeW1ib2xzIGZvciB0aGUgTkFNRSBhcmd1bWVudCB0byBgY29uZnN0cicuICAqLworI2luY2x1ZGUgPGJpdHMvY29uZm5hbWUuaD4KKworLyogR2V0IGZpbGUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBQQVRILiAgKi8KK2V4dGVybiBsb25nIGludCBwYXRoY29uZiAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX25hbWUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBHZXQgZmlsZS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGFib3V0IGRlc2NyaXB0b3IgRkQuICAqLworZXh0ZXJuIGxvbmcgaW50IGZwYXRoY29uZiAoaW50IF9fZmQsIGludCBfX25hbWUpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5c3RlbSB2YXJpYWJsZSBOQU1FLiAgKi8KK2V4dGVybiBsb25nIGludCBzeXNjb25mIChpbnQgX19uYW1lKSBfX1RIUk9XOworCisjaWZkZWYJX19VU0VfUE9TSVgyCisvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzdHJpbmctdmFsdWVkIHN5c3RlbSB2YXJpYWJsZSBOQU1FLiAgKi8KK2V4dGVybiBzaXplX3QgY29uZnN0ciAoaW50IF9fbmFtZSwgY2hhciAqX19idWYsIHNpemVfdCBfX2xlbikgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIEdldCB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiAgKi8KK2V4dGVybiBfX3BpZF90IGdldHBpZCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IHRoZSBwcm9jZXNzIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MncyBwYXJlbnQuICAqLworZXh0ZXJuIF9fcGlkX3QgZ2V0cHBpZCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IHRoZSBwcm9jZXNzIGdyb3VwIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgICBUaGlzIGZ1bmN0aW9uIGlzIGRpZmZlcmVudCBvbiBvbGQgQlNELiAqLworI2lmbmRlZiBfX0ZBVk9SX0JTRAorZXh0ZXJuIF9fcGlkX3QgZ2V0cGdycCAodm9pZCkgX19USFJPVzsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gX19waWRfdCBfX1JFRElSRUNUX05USCAoZ2V0cGdycCwgKF9fcGlkX3QgX19waWQpLCBfX2dldHBnaWQpOworIyBlbHNlCisjICBkZWZpbmUgZ2V0cGdycCBfX2dldHBnaWQKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBHZXQgdGhlIHByb2Nlc3MgZ3JvdXAgSUQgb2YgcHJvY2VzcyBQSUQuICAqLworZXh0ZXJuIF9fcGlkX3QgX19nZXRwZ2lkIChfX3BpZF90IF9fcGlkKSBfX1RIUk9XOworI2lmIGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorZXh0ZXJuIF9fcGlkX3QgZ2V0cGdpZCAoX19waWRfdCBfX3BpZCkgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIFNldCB0aGUgcHJvY2VzcyBncm91cCBJRCBvZiB0aGUgcHJvY2VzcyBtYXRjaGluZyBQSUQgdG8gUEdJRC4KKyAgIElmIFBJRCBpcyB6ZXJvLCB0aGUgY3VycmVudCBwcm9jZXNzJ3MgcHJvY2VzcyBncm91cCBJRCBpcyBzZXQuCisgICBJZiBQR0lEIGlzIHplcm8sIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBwcm9jZXNzIGlzIHVzZWQuICAqLworZXh0ZXJuIGludCBzZXRwZ2lkIChfX3BpZF90IF9fcGlkLCBfX3BpZF90IF9fcGdpZCkgX19USFJPVzsKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBCb3RoIFN5c3RlbSBWIGFuZCBCU0QgaGF2ZSBgc2V0cGdycCcgZnVuY3Rpb25zLCBidXQgd2l0aCBkaWZmZXJlbnQKKyAgIGNhbGxpbmcgY29udmVudGlvbnMuICBUaGUgQlNEIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzIFBPU0lYLjEgYHNldHBnaWQnCisgICAoYWJvdmUpLiAgVGhlIFN5c3RlbSBWIGZ1bmN0aW9uIHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcHV0cyB0aGUgY2FsbGluZworICAgcHJvY2VzcyBpbiBpdHMgb24gZ3JvdXAgbGlrZSBgc2V0cGdpZCAoMCwgMCknLgorCisgICBOZXcgcHJvZ3JhbXMgc2hvdWxkIGFsd2F5cyB1c2UgYHNldHBnaWQnIGluc3RlYWQuCisKKyAgIFRoZSBkZWZhdWx0IGluIEdOVSBpcyB0byBwcm92aWRlIHRoZSBTeXN0ZW0gViBmdW5jdGlvbi4gIFRoZSBCU0QKKyAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB1bmRlciAtRF9CU0RfU09VUkNFLiAgKi8KKworIyBpZm5kZWYgX19GQVZPUl9CU0QKKworLyogU2V0IHRoZSBwcm9jZXNzIGdyb3VwIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gaXRzIG93biBQSUQuCisgICBUaGlzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgYHNldHBnaWQgKDAsIDApJy4gICovCitleHRlcm4gaW50IHNldHBncnAgKHZvaWQpIF9fVEhST1c7CisKKyMgZWxzZQorCisvKiBBbm90aGVyIG5hbWUgZm9yIGBzZXRwZ2lkJyAoYWJvdmUpLiAgKi8KKyMgIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChzZXRwZ3JwLCAoX19waWRfdCBfX3BpZCwgX19waWRfdCBfX3BncnApLCBzZXRwZ2lkKTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgc2V0cGdycCBzZXRwZ2lkCisjICBlbmRpZgorCisjIGVuZGlmCS8qIEZhdm9yIEJTRC4gICovCisjZW5kaWYJLyogVXNlIFNWSUQgb3IgQlNELiAgKi8KKworLyogQ3JlYXRlIGEgbmV3IHNlc3Npb24gd2l0aCB0aGUgY2FsbGluZyBwcm9jZXNzIGFzIGl0cyBsZWFkZXIuCisgICBUaGUgcHJvY2VzcyBncm91cCBJRHMgb2YgdGhlIHNlc3Npb24gYW5kIHRoZSBjYWxsaW5nIHByb2Nlc3MKKyAgIGFyZSBzZXQgdG8gdGhlIHByb2Nlc3MgSUQgb2YgdGhlIGNhbGxpbmcgcHJvY2Vzcywgd2hpY2ggaXMgcmV0dXJuZWQuICAqLworZXh0ZXJuIF9fcGlkX3Qgc2V0c2lkICh2b2lkKSBfX1RIUk9XOworCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgdGhlIGdpdmVuIHByb2Nlc3MuICAqLworZXh0ZXJuIF9fcGlkX3QgZ2V0c2lkIChfX3BpZF90IF9fcGlkKSBfX1RIUk9XOworI2VuZGlmCisKKy8qIEdldCB0aGUgcmVhbCB1c2VyIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuICAqLworZXh0ZXJuIF9fdWlkX3QgZ2V0dWlkICh2b2lkKSBfX1RIUk9XOworCisvKiBHZXQgdGhlIGVmZmVjdGl2ZSB1c2VyIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuICAqLworZXh0ZXJuIF9fdWlkX3QgZ2V0ZXVpZCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IHRoZSByZWFsIGdyb3VwIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuICAqLworZXh0ZXJuIF9fZ2lkX3QgZ2V0Z2lkICh2b2lkKSBfX1RIUk9XOworCisvKiBHZXQgdGhlIGVmZmVjdGl2ZSBncm91cCBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiAgKi8KK2V4dGVybiBfX2dpZF90IGdldGVnaWQgKHZvaWQpIF9fVEhST1c7CisKKy8qIElmIFNJWkUgaXMgemVybywgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc3VwcGxlbWVudGFyeSBncm91cHMKKyAgIHRoZSBjYWxsaW5nIHByb2Nlc3MgaXMgaW4uICBPdGhlcndpc2UsIGZpbGwgaW4gdGhlIGdyb3VwIElEcworICAgb2YgaXRzIHN1cHBsZW1lbnRhcnkgZ3JvdXBzIGluIExJU1QgYW5kIHJldHVybiB0aGUgbnVtYmVyIHdyaXR0ZW4uICAqLworZXh0ZXJuIGludCBnZXRncm91cHMgKGludCBfX3NpemUsIF9fZ2lkX3QgX19saXN0W10pIF9fVEhST1cgX193dXI7CisKKyNpZmRlZglfX1VTRV9HTlUKKy8qIFJldHVybiBub256ZXJvIGlmZiB0aGUgY2FsbGluZyBwcm9jZXNzIGlzIGluIGdyb3VwIEdJRC4gICovCitleHRlcm4gaW50IGdyb3VwX21lbWJlciAoX19naWRfdCBfX2dpZCkgX19USFJPVzsKKyNlbmRpZgorCisvKiBTZXQgdGhlIHVzZXIgSUQgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcyB0byBVSUQuCisgICBJZiB0aGUgY2FsbGluZyBwcm9jZXNzIGlzIHRoZSBzdXBlci11c2VyLCBzZXQgdGhlIHJlYWwKKyAgIGFuZCBlZmZlY3RpdmUgdXNlciBJRHMsIGFuZCB0aGUgc2F2ZWQgc2V0LXVzZXItSUQgdG8gVUlEOworICAgaWYgbm90LCB0aGUgZWZmZWN0aXZlIHVzZXIgSUQgaXMgc2V0IHRvIFVJRC4gICovCitleHRlcm4gaW50IHNldHVpZCAoX191aWRfdCBfX3VpZCkgX19USFJPVzsKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFNldCB0aGUgcmVhbCB1c2VyIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gUlVJRCwKKyAgIGFuZCB0aGUgZWZmZWN0aXZlIHVzZXIgSUQgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcyB0byBFVUlELiAgKi8KK2V4dGVybiBpbnQgc2V0cmV1aWQgKF9fdWlkX3QgX19ydWlkLCBfX3VpZF90IF9fZXVpZCkgX19USFJPVzsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisvKiBTZXQgdGhlIGVmZmVjdGl2ZSB1c2VyIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gVUlELiAgKi8KK2V4dGVybiBpbnQgc2V0ZXVpZCAoX191aWRfdCBfX3VpZCkgX19USFJPVzsKKyNlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworLyogU2V0IHRoZSBncm91cCBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIEdJRC4KKyAgIElmIHRoZSBjYWxsaW5nIHByb2Nlc3MgaXMgdGhlIHN1cGVyLXVzZXIsIHNldCB0aGUgcmVhbAorICAgYW5kIGVmZmVjdGl2ZSBncm91cCBJRHMsIGFuZCB0aGUgc2F2ZWQgc2V0LWdyb3VwLUlEIHRvIEdJRDsKKyAgIGlmIG5vdCwgdGhlIGVmZmVjdGl2ZSBncm91cCBJRCBpcyBzZXQgdG8gR0lELiAgKi8KK2V4dGVybiBpbnQgc2V0Z2lkIChfX2dpZF90IF9fZ2lkKSBfX1RIUk9XOworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogU2V0IHRoZSByZWFsIGdyb3VwIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gUkdJRCwKKyAgIGFuZCB0aGUgZWZmZWN0aXZlIGdyb3VwIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gRUdJRC4gICovCitleHRlcm4gaW50IHNldHJlZ2lkIChfX2dpZF90IF9fcmdpZCwgX19naWRfdCBfX2VnaWQpIF9fVEhST1c7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworLyogU2V0IHRoZSBlZmZlY3RpdmUgZ3JvdXAgSUQgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcyB0byBHSUQuICAqLworZXh0ZXJuIGludCBzZXRlZ2lkIChfX2dpZF90IF9fZ2lkKSBfX1RIUk9XOworI2VuZGlmIC8qIFVzZSBCU0QuICAqLworCisjaWZkZWYgX19VU0VfR05VCisvKiBGZXRjaCB0aGUgcmVhbCB1c2VyIElELCBlZmZlY3RpdmUgdXNlciBJRCwgYW5kIHNhdmVkLXNldCB1c2VyIElELAorICAgb2YgdGhlIGNhbGxpbmcgcHJvY2Vzcy4gICovCitleHRlcm4gaW50IGdldHJlc3VpZCAoX191aWRfdCAqX19ydWlkLCBfX3VpZF90ICpfX2V1aWQsIF9fdWlkX3QgKl9fc3VpZCkKKyAgICAgX19USFJPVzsKKworLyogRmV0Y2ggdGhlIHJlYWwgZ3JvdXAgSUQsIGVmZmVjdGl2ZSBncm91cCBJRCwgYW5kIHNhdmVkLXNldCBncm91cCBJRCwKKyAgIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuICAqLworZXh0ZXJuIGludCBnZXRyZXNnaWQgKF9fZ2lkX3QgKl9fcmdpZCwgX19naWRfdCAqX19lZ2lkLCBfX2dpZF90ICpfX3NnaWQpCisgICAgIF9fVEhST1c7CisKKy8qIFNldCB0aGUgcmVhbCB1c2VyIElELCBlZmZlY3RpdmUgdXNlciBJRCwgYW5kIHNhdmVkLXNldCB1c2VyIElELAorICAgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcyB0byBSVUlELCBFVUlELCBhbmQgU1VJRCwgcmVzcGVjdGl2ZWx5LiAgKi8KK2V4dGVybiBpbnQgc2V0cmVzdWlkIChfX3VpZF90IF9fcnVpZCwgX191aWRfdCBfX2V1aWQsIF9fdWlkX3QgX19zdWlkKQorICAgICBfX1RIUk9XOworCisvKiBTZXQgdGhlIHJlYWwgZ3JvdXAgSUQsIGVmZmVjdGl2ZSBncm91cCBJRCwgYW5kIHNhdmVkLXNldCBncm91cCBJRCwKKyAgIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gUkdJRCwgRUdJRCwgYW5kIFNHSUQsIHJlc3BlY3RpdmVseS4gICovCitleHRlcm4gaW50IHNldHJlc2dpZCAoX19naWRfdCBfX3JnaWQsIF9fZ2lkX3QgX19lZ2lkLCBfX2dpZF90IF9fc2dpZCkKKyAgICAgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIENsb25lIHRoZSBjYWxsaW5nIHByb2Nlc3MsIGNyZWF0aW5nIGFuIGV4YWN0IGNvcHkuCisgICBSZXR1cm4gLTEgZm9yIGVycm9ycywgMCB0byB0aGUgbmV3IHByb2Nlc3MsCisgICBhbmQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIG5ldyBwcm9jZXNzIHRvIHRoZSBvbGQgcHJvY2Vzcy4gICovCitleHRlcm4gX19waWRfdCBmb3JrICh2b2lkKSBfX1RIUk9XTkw7CisKKyNpZiAoZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLOCkgXAorICAgIHx8IGRlZmluZWQgX19VU0VfQlNECisvKiBDbG9uZSB0aGUgY2FsbGluZyBwcm9jZXNzLCBidXQgd2l0aG91dCBjb3B5aW5nIHRoZSB3aG9sZSBhZGRyZXNzIHNwYWNlLgorICAgVGhlIGNhbGxpbmcgcHJvY2VzcyBpcyBzdXNwZW5kZWQgdW50aWwgdGhlIG5ldyBwcm9jZXNzIGV4aXRzIG9yIGlzCisgICByZXBsYWNlZCBieSBhIGNhbGwgdG8gYGV4ZWN2ZScuICBSZXR1cm4gLTEgZm9yIGVycm9ycywgMCB0byB0aGUgbmV3IHByb2Nlc3MsCisgICBhbmQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIG5ldyBwcm9jZXNzIHRvIHRoZSBvbGQgcHJvY2Vzcy4gICovCitleHRlcm4gX19waWRfdCB2Zm9yayAodm9pZCkgX19USFJPVzsKKyNlbmRpZiAvKiBVc2UgQlNEIG9yIFhQRyA8IDcuICovCisKKworLyogUmV0dXJuIHRoZSBwYXRobmFtZSBvZiB0aGUgdGVybWluYWwgRkQgaXMgb3BlbiBvbiwgb3IgTlVMTCBvbiBlcnJvcnMuCisgICBUaGUgcmV0dXJuZWQgc3RvcmFnZSBpcyBnb29kIG9ubHkgdW50aWwgdGhlIG5leHQgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiBjaGFyICp0dHluYW1lIChpbnQgX19mZCkgX19USFJPVzsKKworLyogU3RvcmUgYXQgbW9zdCBCVUZMRU4gY2hhcmFjdGVycyBvZiB0aGUgcGF0aG5hbWUgb2YgdGhlIHRlcm1pbmFsIEZEIGlzCisgICBvcGVuIG9uIGluIEJVRi4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIuICAqLworZXh0ZXJuIGludCB0dHluYW1lX3IgKGludCBfX2ZkLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKSBfX3d1cjsKKworLyogUmV0dXJuIDEgaWYgRkQgaXMgYSB2YWxpZCBkZXNjcmlwdG9yIGFzc29jaWF0ZWQKKyAgIHdpdGggYSB0ZXJtaW5hbCwgemVybyBpZiBub3QuICAqLworZXh0ZXJuIGludCBpc2F0dHkgKGludCBfX2ZkKSBfX1RIUk9XOworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgXAorICAgIHx8IChkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEICYmICFkZWZpbmVkIF9fVVNFX1VOSVg5OCkKKy8qIFJldHVybiB0aGUgaW5kZXggaW50byB0aGUgYWN0aXZlLWxvZ2lucyBmaWxlICh1dG1wKSBmb3IKKyAgIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbC4gICovCitleHRlcm4gaW50IHR0eXNsb3QgKHZvaWQpIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBNYWtlIGEgbGluayB0byBGUk9NIG5hbWVkIFRPLiAgKi8KK2V4dGVybiBpbnQgbGluayAoX19jb25zdCBjaGFyICpfX2Zyb20sIF9fY29uc3QgY2hhciAqX190bykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSkgX193dXI7CisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIExpa2UgbGluayBidXQgcmVsYXRpdmUgcGF0aHMgaW4gVE8gYW5kIEZST00gYXJlIGludGVycHJldGVkIHJlbGF0aXZlCisgICB0byBGUk9NRkQgYW5kIFRPRkQgcmVzcGVjdGl2ZWx5LiAgKi8KK2V4dGVybiBpbnQgbGlua2F0IChpbnQgX19mcm9tZmQsIF9fY29uc3QgY2hhciAqX19mcm9tLCBpbnQgX190b2ZkLAorCQkgICBfX2NvbnN0IGNoYXIgKl9fdG8sIGludCBfX2ZsYWdzKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDQpKSBfX3d1cjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIE1ha2UgYSBzeW1ib2xpYyBsaW5rIHRvIEZST00gbmFtZWQgVE8uICAqLworZXh0ZXJuIGludCBzeW1saW5rIChfX2NvbnN0IGNoYXIgKl9fZnJvbSwgX19jb25zdCBjaGFyICpfX3RvKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKSBfX3d1cjsKKworLyogUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHN5bWJvbGljIGxpbmsgUEFUSCBpbnRvIG5vIG1vcmUgdGhhbgorICAgTEVOIGJ5dGVzIG9mIEJVRi4gIFRoZSBjb250ZW50cyBhcmUgbm90IG51bGwtdGVybWluYXRlZC4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIHNzaXplX3QgcmVhZGxpbmsgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKSBfX3d1cjsKKyNlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogTGlrZSBzeW1saW5rIGJ1dCBhIHJlbGF0aXZlIHBhdGggaW4gVE8gaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gVE9GRC4gICovCitleHRlcm4gaW50IHN5bWxpbmthdCAoX19jb25zdCBjaGFyICpfX2Zyb20sIGludCBfX3RvZmQsCisJCSAgICAgIF9fY29uc3QgY2hhciAqX190bykgX19USFJPVyBfX25vbm51bGwgKCgxLCAzKSkgX193dXI7CisKKy8qIExpa2UgcmVhZGxpbmsgYnV0IGEgcmVsYXRpdmUgUEFUSCBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byBGRC4gICovCitleHRlcm4gc3NpemVfdCByZWFkbGlua2F0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwKKwkJCSAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCAzKSkgX193dXI7CisjZW5kaWYKKworLyogUmVtb3ZlIHRoZSBsaW5rIE5BTUUuICAqLworZXh0ZXJuIGludCB1bmxpbmsgKF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogUmVtb3ZlIHRoZSBsaW5rIE5BTUUgcmVsYXRpdmUgdG8gRkQuICAqLworZXh0ZXJuIGludCB1bmxpbmthdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQgX19mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCisvKiBSZW1vdmUgdGhlIGRpcmVjdG9yeSBQQVRILiAgKi8KK2V4dGVybiBpbnQgcm1kaXIgKF9fY29uc3QgY2hhciAqX19wYXRoKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworCisvKiBSZXR1cm4gdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCBJRCBvZiBGRC4gICovCitleHRlcm4gX19waWRfdCB0Y2dldHBncnAgKGludCBfX2ZkKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCBJRCBvZiBGRCBzZXQgUEdSUF9JRC4gICovCitleHRlcm4gaW50IHRjc2V0cGdycCAoaW50IF9fZmQsIF9fcGlkX3QgX19wZ3JwX2lkKSBfX1RIUk9XOworCisKKy8qIFJldHVybiB0aGUgbG9naW4gbmFtZSBvZiB0aGUgdXNlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gY2hhciAqZ2V0bG9naW4gKHZvaWQpOworI2lmIGRlZmluZWQgX19VU0VfUkVFTlRSQU5UIHx8IGRlZmluZWQgX19VU0VfUE9TSVgxOTk1MDYKKy8qIFJldHVybiBhdCBtb3N0IE5BTUVfTEVOIGNoYXJhY3RlcnMgb2YgdGhlIGxvZ2luIG5hbWUgb2YgdGhlIHVzZXIgaW4gTkFNRS4KKyAgIElmIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIG9yIHNvbWUgb3RoZXIgZXJyb3Igb2NjdXJyZWQsIHJldHVybiB0aGUgZXJyb3IKKyAgIGNvZGUuICBPdGhlcndpc2UgcmV0dXJuIDAuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRsb2dpbl9yIChjaGFyICpfX25hbWUsIHNpemVfdCBfX25hbWVfbGVuKSBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworI2lmZGVmCV9fVVNFX0JTRAorLyogU2V0IHRoZSBsb2dpbiBuYW1lIHJldHVybmVkIGJ5IGBnZXRsb2dpbicuICAqLworZXh0ZXJuIGludCBzZXRsb2dpbiAoX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKworI2lmZGVmCV9fVVNFX1BPU0lYMgorLyogR2V0IGRlZmluaXRpb25zIGFuZCBwcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgdG8gcHJvY2VzcyB0aGUKKyAgIGFyZ3VtZW50cyBpbiBBUkdWIChBUkdDIG9mIHRoZW0sIG1pbnVzIHRoZSBwcm9ncmFtIG5hbWUpIGZvcgorICAgb3B0aW9ucyBnaXZlbiBpbiBPUFRTLiAgKi8KKyMgZGVmaW5lIF9fbmVlZF9nZXRvcHQKKyMgaW5jbHVkZSA8Z2V0b3B0Lmg+CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTggfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisvKiBQdXQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgaG9zdCBpbiBubyBtb3JlIHRoYW4gTEVOIGJ5dGVzIG9mIE5BTUUuCisgICBUaGUgcmVzdWx0IGlzIG51bGwtdGVybWluYXRlZCBpZiBMRU4gaXMgbGFyZ2UgZW5vdWdoIGZvciB0aGUgZnVsbAorICAgbmFtZSBhbmQgdGhlIHRlcm1pbmF0b3IuICAqLworZXh0ZXJuIGludCBnZXRob3N0bmFtZSAoY2hhciAqX19uYW1lLCBzaXplX3QgX19sZW4pIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IChkZWZpbmVkIF9fVVNFX1hPUEVOICYmICFkZWZpbmVkIF9fVVNFX1VOSVg5OCkKKy8qIFNldCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBob3N0IHRvIE5BTUUsIHdoaWNoIGlzIExFTiBieXRlcyBsb25nLgorICAgVGhpcyBjYWxsIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHN1cGVyLXVzZXIuICAqLworZXh0ZXJuIGludCBzZXRob3N0bmFtZSAoX19jb25zdCBjaGFyICpfX25hbWUsIHNpemVfdCBfX2xlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisKKy8qIFNldCB0aGUgY3VycmVudCBtYWNoaW5lJ3MgSW50ZXJuZXQgbnVtYmVyIHRvIElELgorICAgVGhpcyBjYWxsIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHN1cGVyLXVzZXIuICAqLworZXh0ZXJuIGludCBzZXRob3N0aWQgKGxvbmcgaW50IF9faWQpIF9fVEhST1cgX193dXI7CisKKworLyogR2V0IGFuZCBzZXQgdGhlIE5JUyAoYWthIFlQKSBkb21haW4gbmFtZSwgaWYgYW55LgorICAgQ2FsbGVkIGp1c3QgbGlrZSBgZ2V0aG9zdG5hbWUnIGFuZCBgc2V0aG9zdG5hbWUnLgorICAgVGhlIE5JUyBkb21haW4gbmFtZSBpcyB1c3VhbGx5IHRoZSBlbXB0eSBzdHJpbmcgd2hlbiBub3QgdXNpbmcgTklTLiAgKi8KK2V4dGVybiBpbnQgZ2V0ZG9tYWlubmFtZSAoY2hhciAqX19uYW1lLCBzaXplX3QgX19sZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworZXh0ZXJuIGludCBzZXRkb21haW5uYW1lIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgc2l6ZV90IF9fbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKworCisvKiBSZXZva2UgYWNjZXNzIHBlcm1pc3Npb25zIHRvIGFsbCBwcm9jZXNzZXMgY3VycmVudGx5IGNvbW11bmljYXRpbmcKKyAgIHdpdGggdGhlIGNvbnRyb2wgdGVybWluYWwsIGFuZCB0aGVuIHNlbmQgYSBTSUdIVVAgc2lnbmFsIHRvIHRoZSBwcm9jZXNzCisgICBncm91cCBvZiB0aGUgY29udHJvbCB0ZXJtaW5hbC4gICovCitleHRlcm4gaW50IHZoYW5ndXAgKHZvaWQpIF9fVEhST1c7CisKKy8qIFJldm9rZSB0aGUgYWNjZXNzIG9mIGFsbCBkZXNjcmlwdG9ycyBjdXJyZW50bHkgb3BlbiBvbiBGSUxFLiAgKi8KK2V4dGVybiBpbnQgcmV2b2tlIChfX2NvbnN0IGNoYXIgKl9fZmlsZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisKKworLyogRW5hYmxlIHN0YXRpc3RpY2FsIHByb2ZpbGluZywgd3JpdGluZyBzYW1wbGVzIG9mIHRoZSBQQyBpbnRvIGF0IG1vc3QKKyAgIFNJWkUgYnl0ZXMgb2YgU0FNUExFX0JVRkZFUjsgZXZlcnkgcHJvY2Vzc29yIGNsb2NrIHRpY2sgd2hpbGUgcHJvZmlsaW5nCisgICBpcyBlbmFibGVkLCB0aGUgc3lzdGVtIGV4YW1pbmVzIHRoZSB1c2VyIFBDIGFuZCBpbmNyZW1lbnRzCisgICBTQU1QTEVfQlVGRkVSWygoUEMgLSBPRkZTRVQpIC8gMikgKiBTQ0FMRSAvIDY1NTM2XS4gIElmIFNDQUxFIGlzIHplcm8sCisgICBkaXNhYmxlIHByb2ZpbGluZy4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4gICovCitleHRlcm4gaW50IHByb2ZpbCAodW5zaWduZWQgc2hvcnQgaW50ICpfX3NhbXBsZV9idWZmZXIsIHNpemVfdCBfX3NpemUsCisJCSAgIHNpemVfdCBfX29mZnNldCwgdW5zaWduZWQgaW50IF9fc2NhbGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisKKy8qIFR1cm4gYWNjb3VudGluZyBvbiBpZiBOQU1FIGlzIGFuIGV4aXN0aW5nIGZpbGUuICBUaGUgc3lzdGVtIHdpbGwgdGhlbiB3cml0ZQorICAgYSByZWNvcmQgZm9yIGVhY2ggcHJvY2VzcyBhcyBpdCB0ZXJtaW5hdGVzLCB0byB0aGlzIGZpbGUuICBJZiBOQU1FIGlzIE5VTEwsCisgICB0dXJuIGFjY291bnRpbmcgb2ZmLiAgVGhpcyBjYWxsIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHN1cGVyLXVzZXIuICAqLworZXh0ZXJuIGludCBhY2N0IChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKKworCisvKiBTdWNjZXNzaXZlIGNhbGxzIHJldHVybiB0aGUgc2hlbGxzIGxpc3RlZCBpbiBgL2V0Yy9zaGVsbHMnLiAgKi8KK2V4dGVybiBjaGFyICpnZXR1c2Vyc2hlbGwgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gdm9pZCBlbmR1c2Vyc2hlbGwgKHZvaWQpIF9fVEhST1c7IC8qIERpc2NhcmQgY2FjaGVkIGluZm8uICAqLworZXh0ZXJuIHZvaWQgc2V0dXNlcnNoZWxsICh2b2lkKSBfX1RIUk9XOyAvKiBSZXdpbmQgYW5kIHJlLXJlYWQgdGhlIGZpbGUuICAqLworCisKKy8qIFB1dCB0aGUgcHJvZ3JhbSBpbiB0aGUgYmFja2dyb3VuZCwgYW5kIGRpc3NvY2lhdGUgZnJvbSB0aGUgY29udHJvbGxpbmcKKyAgIHRlcm1pbmFsLiAgSWYgTk9DSERJUiBpcyB6ZXJvLCBkbyBgY2hkaXIgKCIvIiknLiAgSWYgTk9DTE9TRSBpcyB6ZXJvLAorICAgcmVkaXJlY3RzIHN0ZGluLCBzdGRvdXQsIGFuZCBzdGRlcnIgdG8gL2Rldi9udWxsLiAgKi8KK2V4dGVybiBpbnQgZGFlbW9uIChpbnQgX19ub2NoZGlyLCBpbnQgX19ub2Nsb3NlKSBfX1RIUk9XIF9fd3VyOworI2VuZGlmIC8qIFVzZSBCU0QgfHwgWC9PcGVuLiAgKi8KKworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgKGRlZmluZWQgX19VU0VfWE9QRU4gJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySykKKy8qIE1ha2UgUEFUSCBiZSB0aGUgcm9vdCBkaXJlY3RvcnkgKHRoZSBzdGFydGluZyBwb2ludCBmb3IgYWJzb2x1dGUgcGF0aHMpLgorICAgVGhpcyBjYWxsIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHN1cGVyLXVzZXIuICAqLworZXh0ZXJuIGludCBjaHJvb3QgKF9fY29uc3QgY2hhciAqX19wYXRoKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKworLyogUHJvbXB0IHdpdGggUFJPTVBUIGFuZCByZWFkIGEgc3RyaW5nIGZyb20gdGhlIHRlcm1pbmFsIHdpdGhvdXQgZWNob2luZy4KKyAgIFVzZXMgL2Rldi90dHkgaWYgcG9zc2libGU7IG90aGVyd2lzZSBzdGRlcnIgYW5kIHN0ZGluLiAgKi8KK2V4dGVybiBjaGFyICpnZXRwYXNzIChfX2NvbnN0IGNoYXIgKl9fcHJvbXB0KSBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYgLyogVXNlIEJTRCB8fCBYL09wZW4uICAqLworCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworLyogTWFrZSBhbGwgY2hhbmdlcyBkb25lIHRvIEZEIGFjdHVhbGx5IGFwcGVhciBvbiBkaXNrLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZnN5bmMgKGludCBfX2ZkKTsKKyNlbmRpZiAvKiBVc2UgQlNEIHx8IFgvT3BlbiB8fCBVbml4OTguICAqLworCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIE1ha2UgYWxsIGNoYW5nZXMgZG9uZSB0byBhbGwgZmlsZXMgb24gdGhlIGZpbGUgc3lzdGVtIGFzc29jaWF0ZWQKKyAgIHdpdGggRkQgYWN0dWFsbHkgYXBwZWFyIG9uIGRpc2suICAqLworZXh0ZXJuIGludCBzeW5jZnMgKGludCBfX2ZkKSBfX1RIUk9XOworI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKworLyogUmV0dXJuIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IGhvc3QuICAqLworZXh0ZXJuIGxvbmcgaW50IGdldGhvc3RpZCAodm9pZCk7CisKKy8qIE1ha2UgYWxsIGNoYW5nZXMgZG9uZSB0byBhbGwgZmlsZXMgYWN0dWFsbHkgYXBwZWFyIG9uIGRpc2suICAqLworZXh0ZXJuIHZvaWQgc3luYyAodm9pZCkgX19USFJPVzsKKworCisjIGlmIGRlZmluZWQgX19VU0VfQlNEIHx8ICFkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgcGFnZS4gIFRoaXMgaXMgdGhlIHN5c3RlbSdzIHBhZ2Ugc2l6ZSwKKyAgIHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgaGFyZHdhcmUgcGFnZSBzaXplLiAgKi8KK2V4dGVybiBpbnQgZ2V0cGFnZXNpemUgKHZvaWQpICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworCisvKiBSZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMKKyAgIHRoZSBjdXJyZW50IHByb2Nlc3MgY291bGQgcG9zc2libHkgaGF2ZS4gICovCitleHRlcm4gaW50IGdldGR0YWJsZXNpemUgKHZvaWQpIF9fVEhST1c7CisjIGVuZGlmCisKKyNlbmRpZiAvKiBVc2UgQlNEIHx8IFgvT3BlbiBVbml4LiAgKi8KKworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisKKy8qIFRydW5jYXRlIEZJTEUgdG8gTEVOR1RIIGJ5dGVzLiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgdHJ1bmNhdGUgKF9fY29uc3QgY2hhciAqX19maWxlLCBfX29mZl90IF9fbGVuZ3RoKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHRydW5jYXRlLAorCQkJICAgKF9fY29uc3QgY2hhciAqX19maWxlLCBfX29mZjY0X3QgX19sZW5ndGgpLAorCQkJICAgdHJ1bmNhdGU2NCkgX19ub25udWxsICgoMSkpIF9fd3VyOworIyAgZWxzZQorIyAgIGRlZmluZSB0cnVuY2F0ZSB0cnVuY2F0ZTY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCB0cnVuY2F0ZTY0IChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19vZmY2NF90IF9fbGVuZ3RoKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgZW5kaWYKKworI2VuZGlmIC8qIFVzZSBCU0QgfHwgWC9PcGVuIFVuaXggfHwgUE9TSVggMjAwOC4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworCisvKiBUcnVuY2F0ZSB0aGUgZmlsZSBGRCBpcyBvcGVuIG9uIHRvIExFTkdUSCBieXRlcy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGZ0cnVuY2F0ZSAoaW50IF9fZmQsIF9fb2ZmX3QgX19sZW5ndGgpIF9fVEhST1cgX193dXI7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChmdHJ1bmNhdGUsIChpbnQgX19mZCwgX19vZmY2NF90IF9fbGVuZ3RoKSwKKwkJCSAgIGZ0cnVuY2F0ZTY0KSBfX3d1cjsKKyMgIGVsc2UKKyMgICBkZWZpbmUgZnRydW5jYXRlIGZ0cnVuY2F0ZTY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBmdHJ1bmNhdGU2NCAoaW50IF9fZmQsIF9fb2ZmNjRfdCBfX2xlbmd0aCkgX19USFJPVyBfX3d1cjsKKyMgZW5kaWYKKworI2VuZGlmIC8qIFVzZSBCU0QgfHwgWC9PcGVuIFVuaXggfHwgUE9TSVggMjAwMy4gICovCisKKworI2lmIChkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOMkspIFwKKyAgICB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKworLyogU2V0IHRoZSBlbmQgb2YgYWNjZXNzaWJsZSBkYXRhIHNwYWNlIChha2EgInRoZSBicmVhayIpIHRvIEFERFIuCisgICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBhbmQgLTEgZm9yIGVycm9ycyAod2l0aCBlcnJubyBzZXQpLiAgKi8KK2V4dGVybiBpbnQgYnJrICh2b2lkICpfX2FkZHIpIF9fVEhST1cgX193dXI7CisKKy8qIEluY3JlYXNlIG9yIGRlY3JlYXNlIHRoZSBlbmQgb2YgYWNjZXNzaWJsZSBkYXRhIHNwYWNlIGJ5IERFTFRBIGJ5dGVzLgorICAgSWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyB0aGUgYWRkcmVzcyB0aGUgcHJldmlvdXMgZW5kIG9mIGRhdGEgc3BhY2UKKyAgIChpLmUuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5ldyBzcGFjZSwgaWYgREVMVEEgPiAwKTsKKyAgIHJldHVybnMgKHZvaWQgKikgLTEgZm9yIGVycm9ycyAod2l0aCBlcnJubyBzZXQpLiAgKi8KK2V4dGVybiB2b2lkICpzYnJrIChpbnRwdHJfdCBfX2RlbHRhKSBfX1RIUk9XOworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIEludm9rZSBgc3lzdGVtIGNhbGwnIG51bWJlciBTWVNOTywgcGFzc2luZyBpdCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cy4KKyAgIFRoaXMgaXMgY29tcGxldGVseSBzeXN0ZW0tZGVwZW5kZW50LCBhbmQgbm90IG9mdGVuIHVzZWZ1bC4KKworICAgSW4gVW5peCwgYHN5c2NhbGwnIHNldHMgYGVycm5vJyBmb3IgYWxsIGVycm9ycyBhbmQgbW9zdCBjYWxscyByZXR1cm4gLTEKKyAgIGZvciBlcnJvcnM7IGluIG1hbnkgc3lzdGVtcyB5b3UgY2Fubm90IHBhc3MgYXJndW1lbnRzIG9yIGdldCByZXR1cm4KKyAgIHZhbHVlcyBmb3IgYWxsIHN5c3RlbSBjYWxscyAoYHBpcGUnLCBgZm9yaycsIGFuZCBgZ2V0cHBpZCcgdHlwaWNhbGx5CisgICBhbW9uZyB0aGVtKS4KKworICAgSW4gTWFjaCwgYWxsIHN5c3RlbSBjYWxscyB0YWtlIG5vcm1hbCBhcmd1bWVudHMgYW5kIGFsd2F5cyByZXR1cm4gYW4KKyAgIGVycm9yIGNvZGUgKHplcm8gZm9yIHN1Y2Nlc3MpLiAgKi8KK2V4dGVybiBsb25nIGludCBzeXNjYWxsIChsb25nIGludCBfX3N5c25vLCAuLi4pIF9fVEhST1c7CisKKyNlbmRpZgkvKiBVc2UgbWlzYy4gICovCisKKworI2lmIChkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCkgJiYgIWRlZmluZWQgRl9MT0NLCisvKiBOT1RFOiBUaGVzZSBkZWNsYXJhdGlvbnMgYWxzbyBhcHBlYXIgaW4gPGZjbnRsLmg+OyBiZSBzdXJlIHRvIGtlZXAgYm90aAorICAgZmlsZXMgY29uc2lzdGVudC4gIFNvbWUgc3lzdGVtcyBoYXZlIHRoZW0gdGhlcmUgYW5kIHNvbWUgaGVyZSwgYW5kIHNvbWUKKyAgIHNvZnR3YXJlIGRlcGVuZHMgb24gdGhlIG1hY3JvcyBiZWluZyBkZWZpbmVkIHdpdGhvdXQgaW5jbHVkaW5nIGJvdGguICAqLworCisvKiBgbG9ja2YnIGlzIGEgc2ltcGxlciBpbnRlcmZhY2UgdG8gdGhlIGxvY2tpbmcgZmFjaWxpdGllcyBvZiBgZmNudGwnLgorICAgTEVOIGlzIGFsd2F5cyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLgorICAgVGhlIENNRCBhcmd1bWVudCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCisKKyMgZGVmaW5lIEZfVUxPQ0sgMAkvKiBVbmxvY2sgYSBwcmV2aW91c2x5IGxvY2tlZCByZWdpb24uICAqLworIyBkZWZpbmUgRl9MT0NLICAxCS8qIExvY2sgYSByZWdpb24gZm9yIGV4Y2x1c2l2ZSB1c2UuICAqLworIyBkZWZpbmUgRl9UTE9DSyAyCS8qIFRlc3QgYW5kIGxvY2sgYSByZWdpb24gZm9yIGV4Y2x1c2l2ZSB1c2UuICAqLworIyBkZWZpbmUgRl9URVNUICAzCS8qIFRlc3QgYSByZWdpb24gZm9yIG90aGVyIHByb2Nlc3NlcyBsb2Nrcy4gICovCisKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgbG9ja2YgKGludCBfX2ZkLCBpbnQgX19jbWQsIF9fb2ZmX3QgX19sZW4pIF9fd3VyOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKGxvY2tmLCAoaW50IF9fZmQsIGludCBfX2NtZCwgX19vZmY2NF90IF9fbGVuKSwKKwkJICAgICAgIGxvY2tmNjQpIF9fd3VyOworIyAgZWxzZQorIyAgIGRlZmluZSBsb2NrZiBsb2NrZjY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBsb2NrZjY0IChpbnQgX19mZCwgaW50IF9fY21kLCBfX29mZjY0X3QgX19sZW4pIF9fd3VyOworIyBlbmRpZgorI2VuZGlmIC8qIFVzZSBtaXNjIGFuZCBGX0xPQ0sgbm90IGFscmVhZHkgZGVmaW5lZC4gICovCisKKworI2lmZGVmIF9fVVNFX0dOVQorCisvKiBFdmFsdWF0ZSBFWFBSRVNTSU9OLCBhbmQgcmVwZWF0IGFzIGxvbmcgYXMgaXQgcmV0dXJucyAtMSB3aXRoIGBlcnJubycKKyAgIHNldCB0byBFSU5UUi4gICovCisKKyMgZGVmaW5lIFRFTVBfRkFJTFVSRV9SRVRSWShleHByZXNzaW9uKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICAoeyBsb25nIGludCBfX3Jlc3VsdDsJCQkJCQkgICAgICBcCisgICAgICAgZG8gX19yZXN1bHQgPSAobG9uZyBpbnQpIChleHByZXNzaW9uKTsJCQkJICAgICAgXAorICAgICAgIHdoaWxlIChfX3Jlc3VsdCA9PSAtMUwgJiYgZXJybm8gPT0gRUlOVFIpOwkJCSAgICAgIFwKKyAgICAgICBfX3Jlc3VsdDsgfSkpCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfUE9TSVgxOTkzMDkgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKKy8qIFN5bmNocm9uaXplIGF0IGxlYXN0IHRoZSBkYXRhIHBhcnQgb2YgYSBmaWxlIHdpdGggdGhlIHVuZGVybHlpbmcKKyAgIG1lZGlhLiAgKi8KK2V4dGVybiBpbnQgZmRhdGFzeW5jIChpbnQgX19maWxkZXMpOworI2VuZGlmIC8qIFVzZSBQT1NJWDE5OTMwOSAqLworCisKKy8qIFhQRzQuMiBzcGVjaWZpZXMgdGhhdCBwcm90b3R5cGVzIGZvciB0aGUgZW5jcnlwdGlvbiBmdW5jdGlvbnMgbXVzdAorICAgYmUgZGVmaW5lZCBoZXJlLiAgKi8KKyNpZmRlZglfX1VTRV9YT1BFTgorLyogRW5jcnlwdCBhdCBtb3N0IDggY2hhcmFjdGVycyBmcm9tIEtFWSB1c2luZyBzYWx0IHRvIHBlcnR1cmIgREVTLiAgKi8KK2V4dGVybiBjaGFyICpjcnlwdCAoX19jb25zdCBjaGFyICpfX2tleSwgX19jb25zdCBjaGFyICpfX3NhbHQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBFbmNyeXB0IGRhdGEgaW4gQkxPQ0sgaW4gcGxhY2UgaWYgRURGTEFHIGlzIHplcm87IG90aGVyd2lzZSBkZWNyeXB0CisgICBibG9jayBpbiBwbGFjZS4gICovCitleHRlcm4gdm9pZCBlbmNyeXB0IChjaGFyICpfX2xpYmNfYmxvY2ssIGludCBfX2VkZmxhZykgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKworLyogU3dhYiBwYWlycyBieXRlcyBpbiB0aGUgZmlyc3QgTiBieXRlcyBvZiB0aGUgYXJlYSBwb2ludGVkIHRvIGJ5CisgICBGUk9NIGFuZCBjb3B5IHRoZSByZXN1bHQgdG8gVE8uICBUaGUgdmFsdWUgb2YgVE8gbXVzdCBub3QgYmUgaW4gdGhlCisgICByYW5nZSBbRlJPTSAtIE4gKyAxLCBGUk9NIC0gMV0uICBJZiBOIGlzIG9kZCB0aGUgZmlyc3QgYnl0ZSBpbiBGUk9NCisgICBpcyB3aXRob3V0IHBhcnRuZXIuICAqLworZXh0ZXJuIHZvaWQgc3dhYiAoX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fZnJvbSwgdm9pZCAqX19yZXN0cmljdCBfX3RvLAorCQkgIHNzaXplX3QgX19uKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZgorCisKKy8qIFRoZSBTaW5nbGUgVW5peCBzcGVjaWZpY2F0aW9uIGRlbWFuZHMgdGhpcyBwcm90b3R5cGUgdG8gYmUgaGVyZS4KKyAgIEl0IGlzIGFsc28gZm91bmQgaW4gPHN0ZGlvLmg+LiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKy8qIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29udHJvbGxpbmcgdGVybWluYWwuICAqLworZXh0ZXJuIGNoYXIgKmN0ZXJtaWQgKGNoYXIgKl9fcykgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIERlZmluZSBzb21lIG1hY3JvcyBoZWxwaW5nIHRvIGNhdGNoIGJ1ZmZlciBvdmVyZmxvd3MuICAqLworI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZQorIyBpbmNsdWRlIDxiaXRzL3VuaXN0ZC5oPgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiB1bmlzdGQuaCAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdXN0YXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdXN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmExNTBlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS91c3RhdC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxzeXMvdXN0YXQuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdXRpbWUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdXRpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDVkMjY1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS91dGltZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDk2LCA5NywgOTgsIDk5LCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDUuNi42IFNldCBGaWxlIEFjY2VzcyBhbmQgTW9kaWZpY2F0aW9uIFRpbWVzICA8dXRpbWUuaD4KKyAqLworCisjaWZuZGVmCV9VVElNRV9ICisjZGVmaW5lCV9VVElNRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisjIGRlZmluZSBfX25lZWRfdGltZV90CisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBmaWxlIHRpbWVzLiAgKi8KK3N0cnVjdCB1dGltYnVmCisgIHsKKyAgICBfX3RpbWVfdCBhY3RpbWU7CQkvKiBBY2Nlc3MgdGltZS4gICovCisgICAgX190aW1lX3QgbW9kdGltZTsJCS8qIE1vZGlmaWNhdGlvbiB0aW1lLiAgKi8KKyAgfTsKKworLyogU2V0IHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0aW1lcyBvZiBGSUxFIHRvIHRob3NlIGdpdmVuIGluCisgICAqRklMRV9USU1FUy4gIElmIEZJTEVfVElNRVMgaXMgTlVMTCwgc2V0IHRoZW0gdG8gdGhlIGN1cnJlbnQgdGltZS4gICovCitleHRlcm4gaW50IHV0aW1lIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwKKwkJICBfX2NvbnN0IHN0cnVjdCB1dGltYnVmICpfX2ZpbGVfdGltZXMpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogdXRpbWUuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS91dG1wLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3V0bXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGIxMDg4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS91dG1wLmgKQEAgLTAsMCArMSw5NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9VVE1QX0gKKyNkZWZpbmUJX1VUTVBfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBHZXQgc3lzdGVtIGRlcGVuZGVudCB2YWx1ZXMgYW5kIGRhdGEgc3RydWN0dXJlcy4gICovCisjaW5jbHVkZSA8Yml0cy91dG1wLmg+CisKKy8qIENvbXBhdGliaWxpdHkgbmFtZXMgZm9yIHRoZSBzdHJpbmdzIG9mIHRoZSBjYW5vbmljYWwgZmlsZSBuYW1lcy4gICovCisjZGVmaW5lIFVUTVBfRklMRQlfUEFUSF9VVE1QCisjZGVmaW5lIFVUTVBfRklMRU5BTUUJX1BBVEhfVVRNUAorI2RlZmluZSBXVE1QX0ZJTEUJX1BBVEhfV1RNUAorI2RlZmluZSBXVE1QX0ZJTEVOQU1FCV9QQVRIX1dUTVAKKworCisKKy8qIE1ha2UgRkQgYmUgdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsLCBzdGRpbiwgc3Rkb3V0LCBhbmQgc3RkZXJyOworICAgdGhlbiBjbG9zZSBGRC4gIFJldHVybnMgMCBvbiBzdWNjZXNzLCBub256ZXJvIG9uIGVycm9yLiAgKi8KK2V4dGVybiBpbnQgbG9naW5fdHR5IChpbnQgX19mZCkgX19USFJPVzsKKworCisvKiBXcml0ZSB0aGUgZ2l2ZW4gZW50cnkgaW50byB1dG1wIGFuZCB3dG1wLiAgKi8KK2V4dGVybiB2b2lkIGxvZ2luIChfX2NvbnN0IHN0cnVjdCB1dG1wICpfX2VudHJ5KSBfX1RIUk9XOworCisvKiBXcml0ZSB0aGUgdXRtcCBlbnRyeSB0byBzYXkgdGhlIHVzZXIgb24gVVRfTElORSBoYXMgbG9nZ2VkIG91dC4gICovCitleHRlcm4gaW50IGxvZ291dCAoX19jb25zdCBjaGFyICpfX3V0X2xpbmUpIF9fVEhST1c7CisKKy8qIEFwcGVuZCB0byB3dG1wIGFuIGVudHJ5IGZvciB0aGUgY3VycmVudCB0aW1lIGFuZCB0aGUgZ2l2ZW4gaW5mby4gICovCitleHRlcm4gdm9pZCBsb2d3dG1wIChfX2NvbnN0IGNoYXIgKl9fdXRfbGluZSwgX19jb25zdCBjaGFyICpfX3V0X25hbWUsCisJCSAgICAgX19jb25zdCBjaGFyICpfX3V0X2hvc3QpIF9fVEhST1c7CisKKy8qIEFwcGVuZCBlbnRyeSBVVE1QIHRvIHRoZSB3dG1wLWxpa2UgZmlsZSBXVE1QX0ZJTEUuICAqLworZXh0ZXJuIHZvaWQgdXBkd3RtcCAoX19jb25zdCBjaGFyICpfX3d0bXBfZmlsZSwgX19jb25zdCBzdHJ1Y3QgdXRtcCAqX191dG1wKQorICAgICBfX1RIUk9XOworCisvKiBDaGFuZ2UgbmFtZSBvZiB0aGUgdXRtcCBmaWxlIHRvIGJlIGV4YW1pbmVkLiAgKi8KK2V4dGVybiBpbnQgdXRtcG5hbWUgKF9fY29uc3QgY2hhciAqX19maWxlKSBfX1RIUk9XOworCisvKiBSZWFkIG5leHQgZW50cnkgZnJvbSBhIHV0bXAtbGlrZSBmaWxlLiAgKi8KK2V4dGVybiBzdHJ1Y3QgdXRtcCAqZ2V0dXRlbnQgKHZvaWQpIF9fVEhST1c7CisKKy8qIFJlc2V0IHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gICovCitleHRlcm4gdm9pZCBzZXR1dGVudCAodm9pZCkgX19USFJPVzsKKworLyogQ2xvc2UgdGhlIGN1cnJlbnQgb3BlbiBmaWxlLiAgKi8KK2V4dGVybiB2b2lkIGVuZHV0ZW50ICh2b2lkKSBfX1RIUk9XOworCisvKiBTZWFyY2ggZm9yd2FyZCBmcm9tIHRoZSBjdXJyZW50IHBvaW50IGluIHRoZSB1dG1wIGZpbGUgdW50aWwgdGhlCisgICBuZXh0IGVudHJ5IHdpdGggYSB1dF90eXBlIG1hdGNoaW5nIElELT51dF90eXBlLiAgKi8KK2V4dGVybiBzdHJ1Y3QgdXRtcCAqZ2V0dXRpZCAoX19jb25zdCBzdHJ1Y3QgdXRtcCAqX19pZCkgX19USFJPVzsKKworLyogU2VhcmNoIGZvcndhcmQgZnJvbSB0aGUgY3VycmVudCBwb2ludCBpbiB0aGUgdXRtcCBmaWxlIHVudGlsIHRoZQorICAgbmV4dCBlbnRyeSB3aXRoIGEgdXRfbGluZSBtYXRjaGluZyBMSU5FLT51dF9saW5lLiAgKi8KK2V4dGVybiBzdHJ1Y3QgdXRtcCAqZ2V0dXRsaW5lIChfX2NvbnN0IHN0cnVjdCB1dG1wICpfX2xpbmUpIF9fVEhST1c7CisKKy8qIFdyaXRlIG91dCBlbnRyeSBwb2ludGVkIHRvIGJ5IFVUTVBfUFRSIGludG8gdGhlIHV0bXAgZmlsZS4gICovCitleHRlcm4gc3RydWN0IHV0bXAgKnB1dHV0bGluZSAoX19jb25zdCBzdHJ1Y3QgdXRtcCAqX191dG1wX3B0cikgX19USFJPVzsKKworCisjaWZkZWYJX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb25zIG9mIHRoZSBmaWxlIGZvciBoYW5kbGluZyB1dG1wIGZpbGVzLiAgKi8KK2V4dGVybiBpbnQgZ2V0dXRlbnRfciAoc3RydWN0IHV0bXAgKl9fYnVmZmVyLCBzdHJ1Y3QgdXRtcCAqKl9fcmVzdWx0KSBfX1RIUk9XOworCitleHRlcm4gaW50IGdldHV0aWRfciAoX19jb25zdCBzdHJ1Y3QgdXRtcCAqX19pZCwgc3RydWN0IHV0bXAgKl9fYnVmZmVyLAorCQkgICAgICBzdHJ1Y3QgdXRtcCAqKl9fcmVzdWx0KSBfX1RIUk9XOworCitleHRlcm4gaW50IGdldHV0bGluZV9yIChfX2NvbnN0IHN0cnVjdCB1dG1wICpfX2xpbmUsCisJCQlzdHJ1Y3QgdXRtcCAqX19idWZmZXIsIHN0cnVjdCB1dG1wICoqX19yZXN1bHQpIF9fVEhST1c7CisKKyNlbmRpZgkvKiBVc2UgbWlzYy4gICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiB1dG1wLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3V0bXB4LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3V0bXB4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyMjkxNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdXRtcHguaApAQCAtMCwwICsxLDEyNyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9VVE1QWF9ICisjZGVmaW5lCV9VVE1QWF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworLyogUmVxdWlyZWQgYWNjb3JkaW5nIHRvIFVuaXg5OC4gICovCisjaWZuZGVmIF9fcGlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3BpZF90IHBpZF90OworIyBkZWZpbmUgX19waWRfdF9kZWZpbmVkCisjZW5kaWYKKworLyogR2V0IHN5c3RlbSBkZXBlbmRlbnQgdmFsdWVzIGFuZCBkYXRhIHN0cnVjdHVyZXMuICAqLworI2luY2x1ZGUgPGJpdHMvdXRtcHguaD4KKworI2lmZGVmIF9fVVNFX0dOVQorLyogQ29tcGF0aWJpbGl0eSBuYW1lcyBmb3IgdGhlIHN0cmluZ3Mgb2YgdGhlIGNhbm9uaWNhbCBmaWxlIG5hbWVzLiAgKi8KKyMgZGVmaW5lIFVUTVBYX0ZJTEUJX1BBVEhfVVRNUFgKKyMgZGVmaW5lIFVUTVBYX0ZJTEVOQU1FCV9QQVRIX1VUTVBYCisjIGRlZmluZSBXVE1QWF9GSUxFCV9QQVRIX1dUTVBYCisjIGRlZmluZSBXVE1QWF9GSUxFTkFNRQlfUEFUSF9XVE1QWAorI2VuZGlmCisKKy8qIEZvciB0aGUgZ2V0dXRtcHsseH0gZnVuY3Rpb25zIHdlIG5lZWQgdGhlIGBzdHJ1Y3QgdXRtcCcuICAqLworI2lmZGVmIF9fVVNFX0dOVQorc3RydWN0IHV0bXA7CisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIE9wZW4gdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHNldHV0eGVudCAodm9pZCk7CisKKy8qIENsb3NlIHVzZXIgYWNjb3VudGluZyBkYXRhYmFzZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBlbmR1dHhlbnQgKHZvaWQpOworCisvKiBHZXQgdGhlIG5leHQgZW50cnkgZnJvbSB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgdXRtcHggKmdldHV0eGVudCAodm9pZCk7CisKKy8qIEdldCB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gSUQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCB1dG1weCAqZ2V0dXR4aWQgKF9fY29uc3Qgc3RydWN0IHV0bXB4ICpfX2lkKTsKKworLyogR2V0IHRoZSB1c2VyIGFjY291bnRpbmcgZGF0YWJhc2UgZW50cnkgY29ycmVzcG9uZGluZyB0byBMSU5FLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgdXRtcHggKmdldHV0eGxpbmUgKF9fY29uc3Qgc3RydWN0IHV0bXB4ICpfX2xpbmUpOworCisvKiBXcml0ZSB0aGUgZW50cnkgVVRNUFggaW50byB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgdXRtcHggKnB1dHV0eGxpbmUgKF9fY29uc3Qgc3RydWN0IHV0bXB4ICpfX3V0bXB4KTsKKworCisjaWZkZWYgX19VU0VfR05VCisvKiBDaGFuZ2UgbmFtZSBvZiB0aGUgdXRtcHggZmlsZSB0byBiZSBleGFtaW5lZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCB1dG1weG5hbWUgKF9fY29uc3QgY2hhciAqX19maWxlKTsKKworLyogQXBwZW5kIGVudHJ5IFVUTVAgdG8gdGhlIHd0bXB4LWxpa2UgZmlsZSBXVE1QWF9GSUxFLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCB1cGR3dG1weCAoX19jb25zdCBjaGFyICpfX3d0bXB4X2ZpbGUsCisJCSAgICAgIF9fY29uc3Qgc3RydWN0IHV0bXB4ICpfX3V0bXB4KTsKKworCisvKiBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbiBVVE1QWCB0byBVVE1QLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBnZXR1dG1wIChfX2NvbnN0IHN0cnVjdCB1dG1weCAqX191dG1weCwKKwkJICAgICBzdHJ1Y3QgdXRtcCAqX191dG1wKTsKKworLyogQ29weSB0aGUgaW5mb3JtYXRpb24gaW4gVVRNUCB0byBVVE1QWC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgZ2V0dXRtcHggKF9fY29uc3Qgc3RydWN0IHV0bXAgKl9fdXRtcCwKKwkJICAgICAgc3RydWN0IHV0bXB4ICpfX3V0bXB4KTsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogdXRtcHguaCAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdmFsdWVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3ZhbHVlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjM3NmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3ZhbHVlcy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIE9sZCBjb21wYXRpYmlsaXR5IG5hbWVzIGZvciA8bGltaXRzLmg+IGFuZCA8ZmxvYXQuaD4gY29uc3RhbnRzLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBUaGlzIGludGVyZmFjZSBpcyBvYnNvbGV0ZS4gIE5ldyBwcm9ncmFtcyBzaG91bGQgdXNlCisgICA8bGltaXRzLmg+IGFuZC9vciA8ZmxvYXQuaD4gaW5zdGVhZCBvZiA8dmFsdWVzLmg+LiAgKi8KKworI2lmbmRlZglfVkFMVUVTX0gKKyNkZWZpbmUJX1ZBTFVFU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2RlZmluZSBfVFlQRUJJVFModHlwZSkJKHNpemVvZiAodHlwZSkgKiBDSEFSX0JJVCkKKworI2RlZmluZSBDSEFSQklUUwlfVFlQRUJJVFMgKGNoYXIpCisjZGVmaW5lIFNIT1JUQklUUwlfVFlQRUJJVFMgKHNob3J0IGludCkKKyNkZWZpbmUgSU5UQklUUwkJX1RZUEVCSVRTIChpbnQpCisjZGVmaW5lIExPTkdCSVRTCV9UWVBFQklUUyAobG9uZyBpbnQpCisjZGVmaW5lIFBUUkJJVFMJCV9UWVBFQklUUyAoY2hhciAqKQorI2RlZmluZSBET1VCTEVCSVRTCV9UWVBFQklUUyAoZG91YmxlKQorI2RlZmluZSBGTE9BVEJJVFMJX1RZUEVCSVRTIChmbG9hdCkKKworI2RlZmluZSBNSU5TSE9SVAlTSFJUX01JTgorI2RlZmluZQlNSU5JTlQJCUlOVF9NSU4KKyNkZWZpbmUJTUlOTE9ORwkJTE9OR19NSU4KKworI2RlZmluZQlNQVhTSE9SVAlTSFJUX01BWAorI2RlZmluZQlNQVhJTlQJCUlOVF9NQVgKKyNkZWZpbmUJTUFYTE9ORwkJTE9OR19NQVgKKworI2RlZmluZSBISUJJVFMJCU1JTlNIT1JUCisjZGVmaW5lIEhJQklUTAkJTUlOTE9ORworCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjZGVmaW5lCU1BWERPVUJMRQlEQkxfTUFYCisjZGVmaW5lCU1BWEZMT0FUCUZMVF9NQVgKKyNkZWZpbmUJTUlORE9VQkxFCURCTF9NSU4KKyNkZWZpbmUJTUlORkxPQVQJRkxUX01JTgorI2RlZmluZQlETUlORVhQCQlEQkxfTUlOX0VYUAorI2RlZmluZQlGTUlORVhQCQlGTFRfTUlOX0VYUAorI2RlZmluZQlETUFYRVhQCQlEQkxfTUFYX0VYUAorI2RlZmluZQlGTUFYRVhQCQlGTFRfTUFYX0VYUAorCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBTb21lIHN5c3RlbXMgZGVmaW5lIHRoaXMgbmFtZSBpbnN0ZWFkIG9mIENIQVJfQklUIG9yIENIQVJCSVRTLiAgKi8KKyMgZGVmaW5lIEJJVFNQRVJCWVRFCUNIQVJfQklUCisjZW5kaWYKKworI2VuZGlmCS8qIHZhbHVlcy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3ZpZGVvL2VkaWQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdmlkZW8vZWRpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTExYTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3ZpZGVvL2VkaWQuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9fbGludXhfdmlkZW9fZWRpZF9oX18KKyNkZWZpbmUgX19saW51eF92aWRlb19lZGlkX2hfXworCisKK3N0cnVjdCBlZGlkX2luZm8geworCXVuc2lnbmVkIGNoYXIgZHVtbXlbMTI4XTsKK307CisKKworCisjZW5kaWYgLyogX19saW51eF92aWRlb19lZGlkX2hfXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS92aWRlby9zaXNmYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS92aWRlby9zaXNmYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYjdiM2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3ZpZGVvL3Npc2ZiLmgKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBzaXNmYi5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBTaVMgZnJhbWVidWZmZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgbmFtZWQgTGljZW5zZSwKKyAqIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX1NJU0ZCX0hfCisjZGVmaW5lIF9MSU5VWF9TSVNGQl9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGwuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICBQVUJMSUMgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB2YmZsYWdzLCBwdWJsaWMgKG90aGVycyBpbiBzaXMuaCkgKi8KKyNkZWZpbmUgQ1JUMl9ERUZBVUxUCQkweDAwMDAwMDAxCisjZGVmaW5lIENSVDJfTENECQkweDAwMDAwMDAyCisjZGVmaW5lIENSVDJfVFYJCQkweDAwMDAwMDA0CisjZGVmaW5lIENSVDJfVkdBCQkweDAwMDAwMDA4CisjZGVmaW5lIFRWX05UU0MJCQkweDAwMDAwMDEwCisjZGVmaW5lIFRWX1BBTAkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgVFZfSElWSVNJT04JCTB4MDAwMDAwNDAKKyNkZWZpbmUgVFZfWVBCUFIJCTB4MDAwMDAwODAKKyNkZWZpbmUgVFZfQVZJREVPCQkweDAwMDAwMTAwCisjZGVmaW5lIFRWX1NWSURFTwkJMHgwMDAwMDIwMAorI2RlZmluZSBUVl9TQ0FSVAkJMHgwMDAwMDQwMAorI2RlZmluZSBUVl9QQUxNCQkJMHgwMDAwMTAwMAorI2RlZmluZSBUVl9QQUxOCQkJMHgwMDAwMjAwMAorI2RlZmluZSBUVl9OVFNDSgkJMHgwMDAwMTAwMAorI2RlZmluZSBUVl9DSFNDQVJUCQkweDAwMDA4MDAwCisjZGVmaW5lIFRWX0NIWVBCUFI1MjVJCQkweDAwMDEwMDAwCisjZGVmaW5lIENSVDFfVkdBCQkweDAwMDAwMDAwCisjZGVmaW5lIENSVDFfTENEQQkJMHgwMDAyMDAwMAorI2RlZmluZSBWR0EyX0NPTk5FQ1RFRCAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIFZCX0RJU1BUWVBFX0NSVDEJMHgwMDA4MDAwMAkvKiBDUlQxIGNvbm5lY3RlZCBhbmQgdXNlZCAqLworI2RlZmluZSBWQl9TSU5HTEVfTU9ERQkJMHgyMDAwMDAwMAkvKiBDUlQxIG9yIENSVDI7IGRldGVybWluZWQgYnkgRElTUFRZUEVfQ1JUeCAqLworI2RlZmluZSBWQl9NSVJST1JfTU9ERQkJMHg0MDAwMDAwMAkvKiBDUlQxICsgQ1JUMiBpZGVudGljYWwgKG1pcnJvciBtb2RlKSAqLworI2RlZmluZSBWQl9EVUFMVklFV19NT0RFCTB4ODAwMDAwMDAJLyogQ1JUMSArIENSVDIgaW5kZXBlbmRlbnQgKGR1YWwgaGVhZCBtb2RlKSAqLworCisvKiBBbGlhc2VzOiAqLworI2RlZmluZSBDUlQyX0VOQUJMRQkJKENSVDJfTENEIHwgQ1JUMl9UViB8IENSVDJfVkdBKQorI2RlZmluZSBUVl9TVEFOREFSRAkJKFRWX05UU0MgfCBUVl9QQUwgfCBUVl9QQUxNIHwgVFZfUEFMTiB8IFRWX05UU0NKKQorI2RlZmluZSBUVl9JTlRFUkZBQ0UJCShUVl9BVklERU98VFZfU1ZJREVPfFRWX1NDQVJUfFRWX0hJVklTSU9OfFRWX1lQQlBSfFRWX0NIU0NBUlR8VFZfQ0hZUEJQUjUyNUkpCisKKy8qIE9ubHkgaWYgVFZfWVBCUFIgaXMgc2V0OiAqLworI2RlZmluZSBUVl9ZUEJQUjUyNUkJCVRWX05UU0MKKyNkZWZpbmUgVFZfWVBCUFI1MjVQCQlUVl9QQUwKKyNkZWZpbmUgVFZfWVBCUFI3NTBQCQlUVl9QQUxNCisjZGVmaW5lIFRWX1lQQlBSMTA4MEkJCVRWX1BBTE4KKyNkZWZpbmUgVFZfWVBCUFJBTEwgCQkoVFZfWVBCUFI1MjVJIHwgVFZfWVBCUFI1MjVQIHwgVFZfWVBCUFI3NTBQIHwgVFZfWVBCUFIxMDgwSSkKKworI2RlZmluZSBWQl9ESVNQVFlQRV9ESVNQMglDUlQyX0VOQUJMRQorI2RlZmluZSBWQl9ESVNQVFlQRV9DUlQyCUNSVDJfRU5BQkxFCisjZGVmaW5lIFZCX0RJU1BUWVBFX0RJU1AxCVZCX0RJU1BUWVBFX0NSVDEKKyNkZWZpbmUgVkJfRElTUE1PREVfU0lOR0xFCVZCX1NJTkdMRV9NT0RFCisjZGVmaW5lIFZCX0RJU1BNT0RFX01JUlJPUglWQl9NSVJST1JfTU9ERQorI2RlZmluZSBWQl9ESVNQTU9ERV9EVUFMCVZCX0RVQUxWSUVXX01PREUKKyNkZWZpbmUgVkJfRElTUExBWV9NT0RFCQkoU0lOR0xFX01PREUgfCBNSVJST1JfTU9ERSB8IERVQUxWSUVXX01PREUpCisKKy8qIFN0cnVjdHVyZSBhcmd1bWVudCBmb3IgU0lTRkJfR0VUX0lORk8gaW9jdGwgICovCitzdHJ1Y3Qgc2lzZmJfaW5mbyB7CisJX191MzIJc2lzZmJfaWQ7CQkvKiBmb3IgaWRlbnRpZnlpbmcgc2lzZmIgKi8KKyNpZm5kZWYgU0lTRkJfSUQKKyNkZWZpbmUgU0lTRkJfSUQJICAweDUzNDk1MzQ2ICAgIC8qIElkZW50aWZ5IG15c2VsZiB3aXRoICdTSVNGJyAqLworI2VuZGlmCisJX191MzIgICBjaGlwX2lkOwkJLyogUENJLUlEIG9mIGRldGVjdGVkIGNoaXAgKi8KKwlfX3UzMiAgIG1lbW9yeTsJCQkvKiB0b3RhbCB2aWRlbyBtZW1vcnkgaW4gS0IgKi8KKwlfX3UzMiAgIGhlYXBzdGFydDsJCS8qIGhlYXAgc3RhcnQgb2Zmc2V0IGluIEtCICovCisJX191OCAgICBmYnZpZG1vZGU7CQkvKiBjdXJyZW50IHNpc2ZiIG1vZGUgKi8KKworCV9fdTgJc2lzZmJfdmVyc2lvbjsKKwlfX3U4CXNpc2ZiX3JldmlzaW9uOworCV9fdTgJc2lzZmJfcGF0Y2hsZXZlbDsKKworCV9fdTgJc2lzZmJfY2FwczsJCS8qIHNpc2ZiIGNhcGFiaWxpdGllcyAqLworCisJX191MzIJc2lzZmJfdHFsZW47CQkvKiB0dXJibyBxdWV1ZSBsZW5ndGggKGluIEtCKSAqLworCisJX191MzIJc2lzZmJfcGNpYnVzOwkJLyogVGhlIGNhcmQncyBQQ0kgSUQgKi8KKwlfX3UzMglzaXNmYl9wY2lzbG90OworCV9fdTMyCXNpc2ZiX3BjaWZ1bmM7CisKKwlfX3U4CXNpc2ZiX2xjZHBkYzsJCS8qIFBhbmVsRGVsYXlDb21wZW5zYXRpb24gKi8KKworCV9fdTgJc2lzZmJfbGNkYTsJCS8qIERldGVjdGVkIHN0YXR1cyBvZiBMQ0RBIGZvciBsb3cgcmVzL3RleHQgbW9kZXMgKi8KKworCV9fdTMyCXNpc2ZiX3ZiZmxhZ3M7CisJX191MzIJc2lzZmJfY3VycmVudHZiZmxhZ3M7CisKKwlfX3UzMglzaXNmYl9zY2FsZWxjZDsKKwlfX3UzMglzaXNmYl9zcGVjaWFsdGltaW5nOworCisJX191OAlzaXNmYl9oYXZlZW1pOworCV9fdTgJc2lzZmJfZW1pMzAsc2lzZmJfZW1pMzEsc2lzZmJfZW1pMzIsc2lzZmJfZW1pMzM7CisJX191OAlzaXNmYl9oYXZlZW1pbGNkOworCisJX191OAlzaXNmYl9sY2RwZGNhOwkJLyogUGFuZWxEZWxheUNvbXBlbnNhdGlvbiBmb3IgTENELXZpYS1DUlQxICovCisKKwlfX3UxNglzaXNmYl90dnhwb3MsIHNpc2ZiX3R2eXBvczsJLyogV2FybmluZzogVmFsdWVzICsgMzIgISAqLworCisJX191MzIJc2lzZmJfaGVhcHNpemU7CQkvKiBoZWFwIHNpemUgKGluIEtCKSAqLworCV9fdTMyCXNpc2ZiX3ZpZGVvb2Zmc2V0OwkvKiBPZmZzZXQgb2Ygdmlld3BvcnQgaW4gdmlkZW8gbWVtb3J5IChpbiBieXRlcykgKi8KKworCV9fdTMyCXNpc2ZiX2N1cmZzdG47CQkvKiBjdXJyZW50bHkgcnVubmluZyBGU1ROL0RTVE4gbW9kZSAqLworCV9fdTMyCXNpc2ZiX2N1cmRzdG47CisKKwlfX3UxNglzaXNmYl9wY2lfdmVuZG9yOwkvKiBQQ0kgdmVuZG9yIChTaVMgb3IgWEdJKSAqLworCisJX191MzIJc2lzZmJfdmJmbGFnczI7CQkvKiBpdmlkZW8tPnZiZmxhZ3MyICovCisKKwlfX3U4CXNpc2ZiX2Nhbl9wb3N0OwkJLyogc2lzZmIgY2FuIFBPU1QgdGhpcyBjYXJkICovCisJX191OAlzaXNmYl9jYXJkX3Bvc3RlZDsJLyogY2FyZCBpcyBQT1NURUQgKi8KKwlfX3U4CXNpc2ZiX3dhc19ib290X2RldmljZTsJLyogVGhpcyBjYXJkIHdhcyB0aGUgYm9vdCB2aWRlbyBkZXZpY2UgKGllIGlzIHByaW1hcnkpICovCisKKwlfX3U4CXJlc2VydmVkWzE4M107CQkvKiBmb3IgZnV0dXJlIHVzZSAqLworfTsKKworI2RlZmluZSBTSVNGQl9DTURfR0VUVkJGTEFHUwkweDU1QUEwMDAxCS8qIG5vIGFyZzsgcmVzdWx0WzFdID0gdmJmbGFncyAqLworI2RlZmluZSBTSVNGQl9DTURfU1dJVENIQ1JUMQkweDU1QUEwMDEwCS8qIGFyZ1swXTogOTkgPSBxdWVyeSwgMCA9IG9mZiwgMSA9IG9uICovCisvKiBtb3JlIHRvIGNvbWUgKi8KKworI2RlZmluZSBTSVNGQl9DTURfRVJSX09LCTB4ODAwMDAwMDAJLyogY29tbWFuZCBzdWNjZWVkZWQgKi8KKyNkZWZpbmUgU0lTRkJfQ01EX0VSUl9MT0NLRUQJMHg4MDAwMDAwMQkvKiBzaXNmYiBpcyBsb2NrZWQgKi8KKyNkZWZpbmUgU0lTRkJfQ01EX0VSUl9FQVJMWQkweDgwMDAwMDAyCS8qIHJlcXVlc3QgYmVmb3JlIHNpc2ZiIHRvb2sgb3ZlciBnZnggc3lzdGVtICovCisjZGVmaW5lIFNJU0ZCX0NNRF9FUlJfTk9WQgkweDgwMDAwMDAzCS8qIE5vIHZpZGVvIGJyaWRnZSAqLworI2RlZmluZSBTSVNGQl9DTURfRVJSX05PQ1JUMgkweDgwMDAwMDA0CS8qIGNhbid0IGNoYW5nZSBDUlQxIHN0YXR1cywgQ1JUMiBkaXNhYmxlZCAqLworLyogbW9yZSB0byBjb21lICovCisjZGVmaW5lIFNJU0ZCX0NNRF9FUlJfVU5LTk9XTiAgIDB4ODAwMGZmZmYJLyogVW5rbm93biBjb21tYW5kICovCisjZGVmaW5lIFNJU0ZCX0NNRF9FUlJfT1RIRVIJMHg4MDAxMDAwMAkvKiBPdGhlciBlcnJvciAqLworCisvKiBBcmd1bWVudCBmb3IgU0lTRkJfQ01EIGlvY3RsICovCitzdHJ1Y3Qgc2lzZmJfY21kIHsKKwlfX3UzMiAgc2lzZmJfY21kOworCV9fdTMyICBzaXNmYl9hcmdbMTZdOworCV9fdTMyICBzaXNmYl9yZXN1bHRbNF07Cit9OworCisvKiBBZGRpdGlvbmFsIElPQ1RMcyBmb3IgY29tbXVuaWNhdGlvbiBzaXNmYiA8PiBYIGRyaXZlciAgICAgICAgICAgICAgICAqLworLyogSWYgY2hhbmdpbmcgdGhpcywgdmdhdHlwZXMuaCBtdXN0IGFsc28gYmUgY2hhbmdlZCAoZm9yIFggZHJpdmVyKSAgICAqLworCisvKiBpb2N0bCBmb3IgaWRlbnRpZnlpbmcgYW5kIGdpdmluZyBzb21lIGluZm8gKGVzcC4gbWVtb3J5IGhlYXAgc3RhcnQpICovCisjZGVmaW5lIFNJU0ZCX0dFVF9JTkZPX1NJWkUJX0lPUigweEYzLDB4MDAsX191MzIpCisjZGVmaW5lIFNJU0ZCX0dFVF9JTkZPCQlfSU9SKDB4RjMsMHgwMSxzdHJ1Y3Qgc2lzZmJfaW5mbykKKworLyogaW9jdHJsIHRvIGdldCBjdXJyZW50IHZlcnRpY2FsIHJldHJhY2Ugc3RhdHVzICovCisjZGVmaW5lIFNJU0ZCX0dFVF9WQlJTVEFUVVMJX0lPUigweEYzLDB4MDIsX191MzIpCisKKy8qIGlvY3RsIHRvIGVuYWJsZS9kaXNhYmxlIHBhbm5pbmcgYXV0by1tYXhpbWl6ZSAobGlrZSBub21heCBwYXJhbWV0ZXIpICovCisjZGVmaW5lIFNJU0ZCX0dFVF9BVVRPTUFYSU1JWkUJX0lPUigweEYzLDB4MDMsX191MzIpCisjZGVmaW5lIFNJU0ZCX1NFVF9BVVRPTUFYSU1JWkUJX0lPVygweEYzLDB4MDMsX191MzIpCisKKy8qIGlvY3RscyB0byByZWxvY2F0ZSBUViBvdXRwdXQgKHg9RFszMToxNl0sIHk9RFsxNTowXSwgKyAzMikqLworI2RlZmluZSBTSVNGQl9HRVRfVFZQT1NPRkZTRVQJX0lPUigweEYzLDB4MDQsX191MzIpCisjZGVmaW5lIFNJU0ZCX1NFVF9UVlBPU09GRlNFVAlfSU9XKDB4RjMsMHgwNCxfX3UzMikKKworLyogaW9jdGwgZm9yIGludGVybmFsIHNpc2ZiIGNvbW1hbmRzIChzaXNmYmN0cmwpICovCisjZGVmaW5lIFNJU0ZCX0NPTU1BTkQJCV9JT1dSKDB4RjMsMHgwNSxzdHJ1Y3Qgc2lzZmJfY21kKQorCisvKiBpb2N0bCBmb3IgbG9ja2luZyBzaXNmYiAobm8gcmVnaXN0ZXIgYWNjZXNzIGR1cmluZyBsb2NrKSAqLworLyogQXMgb2Ygbm93LCBvbmx5IHVzZWQgdG8gYXZvaWQgcmVnaXN0ZXIgYWNjZXNzIGR1cmluZworICogdGhlIGlvY3RscyBsaXN0ZWQgYWJvdmUuCisgKi8KKyNkZWZpbmUgU0lTRkJfU0VUX0xPQ0sJCV9JT1coMHhGMywweDA2LF9fdTMyKQorCisvKiBpb2N0bHMgMHhGMyB1cCB0byAweDNGIHJlc2VydmVkIGZvciBzaXNmYiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBhbnltb3JlOiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBpb2N0bCBmb3IgaWRlbnRpZnlpbmcgYW5kIGdpdmluZyBzb21lIGluZm8gKGVzcC4gbWVtb3J5IGhlYXAgc3RhcnQpICovCisjZGVmaW5lIFNJU0ZCX0dFVF9JTkZPX09MRAkgICBfSU9SKCduJywweEY4LF9fdTMyKQorLyogaW9jdHJsIHRvIGdldCBjdXJyZW50IHZlcnRpY2FsIHJldHJhY2Ugc3RhdHVzICovCisjZGVmaW5lIFNJU0ZCX0dFVF9WQlJTVEFUVVNfT0xECSAgIF9JT1IoJ24nLDB4RjksX191MzIpCisvKiBpb2N0bCB0byBlbmFibGUvZGlzYWJsZSBwYW5uaW5nIGF1dG8tbWF4aW1pemUgKGxpa2Ugbm9tYXggcGFyYW1ldGVyKSAqLworI2RlZmluZSBTSVNGQl9HRVRfQVVUT01BWElNSVpFX09MRCBfSU9SKCduJywweEZBLF9fdTMyKQorI2RlZmluZSBTSVNGQl9TRVRfQVVUT01BWElNSVpFX09MRCBfSU9XKCduJywweEZBLF9fdTMyKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgIEVuZCBvZiBkZXByZWNhdGVkIGlvY3RsIG51bWJlcnMgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGb3IgZmIgbWVtb3J5IG1hbmFnZXIgKEZCSU9fQUxMT0MsIEZCSU9fRlJFRSkgKi8KK3N0cnVjdCBzaXNfbWVtcmVxIHsKKwlfX3UzMglvZmZzZXQ7CisJX191MzIJc2l6ZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICBQUklWQVRFICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIChmb3IgSU4tS0VSTkVMIHVzYWdlIG9ubHkpICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS92aWRlby91dmVzYWZiLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3ZpZGVvL3V2ZXNhZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWUyODFiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS92aWRlby91dmVzYWZiLmgKQEAgLTAsMCArMSw2MCBAQAorI2lmbmRlZiBfVVZFU0FGQl9ICisjZGVmaW5lIF9VVkVTQUZCX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB2ODZfcmVncyB7CisJX191MzIgZWJ4OworCV9fdTMyIGVjeDsKKwlfX3UzMiBlZHg7CisJX191MzIgZXNpOworCV9fdTMyIGVkaTsKKwlfX3UzMiBlYnA7CisJX191MzIgZWF4OworCV9fdTMyIGVpcDsKKwlfX3UzMiBlZmxhZ3M7CisJX191MzIgZXNwOworCV9fdTE2IGNzOworCV9fdTE2IHNzOworCV9fdTE2IGVzOworCV9fdTE2IGRzOworCV9fdTE2IGZzOworCV9fdTE2IGdzOworfTsKKworLyogVGFzayBmbGFncyAqLworI2RlZmluZSBURl9WQkVJQgkweDAxCisjZGVmaW5lIFRGX0JVRl9FU0RJCTB4MDIKKyNkZWZpbmUgVEZfQlVGX0VTQlgJMHgwNAorI2RlZmluZSBURl9CVUZfUkVUCTB4MDgKKyNkZWZpbmUgVEZfRVhJVAkJMHgxMAorCitzdHJ1Y3QgdXZlc2FmYl90YXNrIHsKKwlfX3U4IGZsYWdzOworCWludCBidWZfbGVuOworCXN0cnVjdCB2ODZfcmVncyByZWdzOworfTsKKworLyogQ29uc3RhbnRzIGZvciB0aGUgY2FwYWJpbGl0aWVzIGZpZWxkCisgKiBpbiB2YmVfaWIgKi8KKyNkZWZpbmUgVkJFX0NBUF9DQU5fU1dJVENIX0RBQwkweDAxCisjZGVmaW5lIFZCRV9DQVBfVkdBQ09NUEFUCTB4MDIKKworLyogVGhlIFZCRSBJbmZvIEJsb2NrICovCitzdHJ1Y3QgdmJlX2liIHsKKwljaGFyICB2YmVfc2lnbmF0dXJlWzRdOworCV9fdTE2IHZiZV92ZXJzaW9uOworCV9fdTMyIG9lbV9zdHJpbmdfcHRyOworCV9fdTMyIGNhcGFiaWxpdGllczsKKwlfX3UzMiBtb2RlX2xpc3RfcHRyOworCV9fdTE2IHRvdGFsX21lbW9yeTsKKwlfX3UxNiBvZW1fc29mdHdhcmVfcmV2OworCV9fdTMyIG9lbV92ZW5kb3JfbmFtZV9wdHI7CisJX191MzIgb2VtX3Byb2R1Y3RfbmFtZV9wdHI7CisJX191MzIgb2VtX3Byb2R1Y3RfcmV2X3B0cjsKKwlfX3U4ICByZXNlcnZlZFsyMjJdOworCWNoYXIgIG9lbV9kYXRhWzI1Nl07CisJY2hhciAgbWlzY19kYXRhWzUxMl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2VuZGlmIC8qIF9VVkVTQUZCX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvd2FpdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS93YWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxYjgxMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvd2FpdC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS93Y2hhci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS93Y2hhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZDdhZTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3djaGFyLmgKQEAgLTAsMCArMSw4OTcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0yMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogICAgICBJU08gQzk5IFN0YW5kYXJkOiA3LjI0CisgKglFeHRlbmRlZCBtdWx0aWJ5dGUgYW5kIHdpZGUgY2hhcmFjdGVyIHV0aWxpdGllcwk8d2NoYXIuaD4KKyAqLworCisjaWZuZGVmIF9XQ0hBUl9ICisKKyNpZiAhZGVmaW5lZCBfX25lZWRfbWJzdGF0ZV90ICYmICFkZWZpbmVkIF9fbmVlZF93aW50X3QKKyMgZGVmaW5lIF9XQ0hBUl9IIDEKKyMgaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgX1dDSEFSX0gKKy8qIEdldCBGSUxFIGRlZmluaXRpb24uICAqLworIyBkZWZpbmUgX19uZWVkX19fRklMRQorIyBpZiBkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgIGRlZmluZSBfX25lZWRfRklMRQorIyBlbmRpZgorIyBpbmNsdWRlIDxzdGRpby5oPgorLyogR2V0IHZhX2xpc3QgZGVmaW5pdGlvbi4gICovCisjIGRlZmluZSBfX25lZWRfX192YV9saXN0CisjIGluY2x1ZGUgPHN0ZGFyZy5oPgorCisjIGluY2x1ZGUgPGJpdHMvd2NoYXIuaD4KKworLyogR2V0IHNpemVfdCwgd2NoYXJfdCwgd2ludF90IGFuZCBOVUxMIGZyb20gPHN0ZGRlZi5oPi4gICovCisjIGRlZmluZSBfX25lZWRfc2l6ZV90CisjIGRlZmluZSBfX25lZWRfd2NoYXJfdAorIyBkZWZpbmUgX19uZWVkX05VTEwKKyNlbmRpZgorI2lmIGRlZmluZWQgX1dDSEFSX0ggfHwgZGVmaW5lZCBfX25lZWRfd2ludF90IHx8ICFkZWZpbmVkIF9fV0lOVF9UWVBFX18KKyMgdW5kZWYgX19uZWVkX3dpbnRfdAorIyBkZWZpbmUgX19uZWVkX3dpbnRfdAorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogV2UgdHJ5IHRvIGdldCB3aW50X3QgZnJvbSA8c3RkZGVmLmg+LCBidXQgbm90IGFsbCBHQ0MgdmVyc2lvbnMgZGVmaW5lIGl0CisgICB0aGVyZS4gIFNvIGRlZmluZSBpdCBvdXJzZWx2ZXMgaWYgaXQgcmVtYWlucyB1bmRlZmluZWQuICAqLworIyBpZm5kZWYgX1dJTlRfVAorLyogSW50ZWdyYWwgdHlwZSB1bmNoYW5nZWQgYnkgZGVmYXVsdCBhcmd1bWVudCBwcm9tb3Rpb25zIHRoYXQgY2FuCisgICBob2xkIGFueSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIG1lbWJlcnMgb2YgdGhlIGV4dGVuZGVkIGNoYXJhY3RlcgorICAgc2V0LCBhcyB3ZWxsIGFzIGF0IGxlYXN0IG9uZSB2YWx1ZSB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55CisgICBtZW1iZXIgb2YgdGhlIGV4dGVuZGVkIGNoYXJhY3RlciBzZXQuICAqLworIyAgZGVmaW5lIF9XSU5UX1QKK3R5cGVkZWYgdW5zaWduZWQgaW50IHdpbnRfdDsKKyMgZWxzZQorLyogV29yayBhcm91bmQgcHJvYmxlbXMgd2l0aCB0aGUgPHN0ZGRlZi5oPiBmaWxlIHdoaWNoIGRvZXNuJ3QgcHV0CisgICB3aW50X3QgaW4gdGhlIHN0ZCBuYW1lc3BhY2UuICAqLworIyAgaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiBkZWZpbmVkIF9HTElCQ1BQX1VTRV9OQU1FU1BBQ0VTIFwKKyAgICAgICYmIGRlZmluZWQgX19XSU5UX1RZUEVfXworX19CRUdJTl9OQU1FU1BBQ0VfU1RECit0eXBlZGVmIF9fV0lOVF9UWVBFX18gd2ludF90OworX19FTkRfTkFNRVNQQUNFX1NURAorIyAgZW5kaWYKKyMgZW5kaWYKKworLyogVGVsbCB0aGUgY2FsbGVyIHRoYXQgd2UgcHJvdmlkZSBjb3JyZWN0IEMrKyBwcm90b3R5cGVzLiAgKi8KKyMgaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiBfX0dOVUNfUFJFUkVRICg0LCA0KQorIyAgZGVmaW5lIF9fQ09SUkVDVF9JU09fQ1BQX1dDSEFSX0hfUFJPVE8KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX1dDSEFSX0ggfHwgZGVmaW5lZCBfX25lZWRfbWJzdGF0ZV90KSAmJiAhZGVmaW5lZCBfX21ic3RhdGVfdF9kZWZpbmVkCisjIGRlZmluZSBfX21ic3RhdGVfdF9kZWZpbmVkCTEKKy8qIENvbnZlcnNpb24gc3RhdGUgaW5mb3JtYXRpb24uICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IF9fY291bnQ7CisgIHVuaW9uCisgIHsKKyMgaWZkZWYgX19XSU5UX1RZUEVfXworICAgIF9fV0lOVF9UWVBFX18gX193Y2g7CisjIGVsc2UKKyAgICB3aW50X3QgX193Y2g7CisjIGVuZGlmCisgICAgY2hhciBfX3djaGJbNF07CisgIH0gX192YWx1ZTsJCS8qIFZhbHVlIHNvIGZhci4gICovCit9IF9fbWJzdGF0ZV90OworI2VuZGlmCisjdW5kZWYgX19uZWVkX21ic3RhdGVfdAorCisKKy8qIFRoZSByZXN0IG9mIHRoZSBmaWxlIGlzIG9ubHkgdXNlZCBpZiB1c2VkIGlmIF9fbmVlZF9tYnN0YXRlX3QgaXMgbm90CisgICBkZWZpbmVkLiAgKi8KKyNpZmRlZiBfV0NIQVJfSAorCitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFB1YmxpYyB0eXBlLiAgKi8KK3R5cGVkZWYgX19tYnN0YXRlX3QgbWJzdGF0ZV90OworX19FTkRfTkFNRVNQQUNFX0M5OQorI2lmZGVmIF9fVVNFX0dOVQorX19VU0lOR19OQU1FU1BBQ0VfQzk5KG1ic3RhdGVfdCkKKyNlbmRpZgorCisjaWZuZGVmIFdDSEFSX01JTgorLyogVGhlc2UgY29uc3RhbnRzIG1pZ2h0IGFsc28gYmUgZGVmaW5lZCBpbiA8aW50dHlwZXMuaD4uICAqLworIyBkZWZpbmUgV0NIQVJfTUlOIF9fV0NIQVJfTUlOCisjIGRlZmluZSBXQ0hBUl9NQVggX19XQ0hBUl9NQVgKKyNlbmRpZgorCisjaWZuZGVmIFdFT0YKKyMgZGVmaW5lIFdFT0YgKDB4ZmZmZmZmZmZ1KQorI2VuZGlmCisKKy8qIEZvciBYUEc0IGNvbXBsaWFuY2Ugd2UgaGF2ZSB0byBkZWZpbmUgdGhlIHN0dWZmIGZyb20gPHdjdHlwZS5oPiBoZXJlCisgICBhcyB3ZWxsLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOICYmICFkZWZpbmVkIF9fVVNFX1VOSVg5OAorIyBpbmNsdWRlIDx3Y3R5cGUuaD4KKyNlbmRpZgorCisKK19fQkVHSU5fREVDTFMKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBUaGlzIGluY29tcGxldGUgdHlwZSBpcyBkZWZpbmVkIGluIDx0aW1lLmg+IGJ1dCBuZWVkZWQgaGVyZSBiZWNhdXNlCisgICBvZiBgd2NzZnRpbWUnLiAgKi8KK3N0cnVjdCB0bTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKy8qIFhYWCBXZSBoYXZlIHRvIGNsZWFuIHRoaXMgdXAgYXQgc29tZSBwb2ludC4gIFNpbmNlIHRtIGlzIGluIHRoZSBzdGQKKyAgIG5hbWVzcGFjZSBidXQgd2NzZnRpbWUgaXMgaW4gX19jOTkgdGhlIHR5cGUgd291bGRuJ3QgYmUgZm91bmQKKyAgIHdpdGhvdXQgaW5zZXJ0aW5nIGl0IGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAgKi8KK19fVVNJTkdfTkFNRVNQQUNFX1NURCh0bSkKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENvcHkgU1JDIHRvIERFU1QuICAqLworZXh0ZXJuIHdjaGFyX3QgKndjc2NweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQlfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpIF9fVEhST1c7CisvKiBDb3B5IG5vIG1vcmUgdGhhbiBOIHdpZGUtY2hhcmFjdGVycyBvZiBTUkMgdG8gREVTVC4gICovCitleHRlcm4gd2NoYXJfdCAqd2NzbmNweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XOworCisvKiBBcHBlbmQgU1JDIG9udG8gREVTVC4gICovCitleHRlcm4gd2NoYXJfdCAqd2NzY2F0ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCV9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYykgX19USFJPVzsKKy8qIEFwcGVuZCBubyBtb3JlIHRoYW4gTiB3aWRlLWNoYXJhY3RlcnMgb2YgU1JDIG9udG8gREVTVC4gICovCitleHRlcm4gd2NoYXJfdCAqd2NzbmNhdCAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XOworCisvKiBDb21wYXJlIFMxIGFuZCBTMi4gICovCitleHRlcm4gaW50IHdjc2NtcCAoX19jb25zdCB3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworLyogQ29tcGFyZSBOIHdpZGUtY2hhcmFjdGVycyBvZiBTMSBhbmQgUzIuICAqLworZXh0ZXJuIGludCB3Y3NuY21wIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogQ29tcGFyZSBTMSBhbmQgUzIsIGlnbm9yaW5nIGNhc2UuICAqLworZXh0ZXJuIGludCB3Y3NjYXNlY21wIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMikgX19USFJPVzsKKworLyogQ29tcGFyZSBubyBtb3JlIHRoYW4gTiBjaGFycyBvZiBTMSBhbmQgUzIsIGlnbm9yaW5nIGNhc2UuICAqLworZXh0ZXJuIGludCB3Y3NuY2FzZWNtcCAoX19jb25zdCB3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIsCisJCQlzaXplX3QgX19uKSBfX1RIUk9XOworCisvKiBTaW1pbGFyIHRvIHRoZSB0d28gZnVuY3Rpb25zIGFib3ZlIGJ1dCB0YWtlIHRoZSBpbmZvcm1hdGlvbiBmcm9tCisgICB0aGUgcHJvdmlkZWQgbG9jYWxlIGFuZCBub3QgdGhlIGdsb2JhbCBsb2NhbGUuICAqLworIyBpbmNsdWRlIDx4bG9jYWxlLmg+CisKK2V4dGVybiBpbnQgd2NzY2FzZWNtcF9sIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwKKwkJCSBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XOworCitleHRlcm4gaW50IHdjc25jYXNlY21wX2wgKF9fY29uc3Qgd2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLAorCQkJICBzaXplX3QgX19uLCBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XOworI2VuZGlmCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQ29tcGFyZSBTMSBhbmQgUzIsIGJvdGggaW50ZXJwcmV0ZWQgYXMgYXBwcm9wcmlhdGUgdG8gdGhlCisgICBMQ19DT0xMQVRFIGNhdGVnb3J5IG9mIHRoZSBjdXJyZW50IGxvY2FsZS4gICovCitleHRlcm4gaW50IHdjc2NvbGwgKF9fY29uc3Qgd2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyKSBfX1RIUk9XOworLyogVHJhbnNmb3JtIFMyIGludG8gYXJyYXkgcG9pbnRlZCB0byBieSBTMSBzdWNoIHRoYXQgaWYgd2NzY21wIGlzCisgICBhcHBsaWVkIHRvIHR3byB0cmFuc2Zvcm1lZCBzdHJpbmdzIHRoZSByZXN1bHQgaXMgdGhlIGFzIGFwcGx5aW5nCisgICBgd2NzY29sbCcgdG8gdGhlIG9yaWdpbmFsIHN0cmluZ3MuICAqLworZXh0ZXJuIHNpemVfdCB3Y3N4ZnJtICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczEsCisJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbikgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBTaW1pbGFyIHRvIHRoZSB0d28gZnVuY3Rpb25zIGFib3ZlIGJ1dCB0YWtlIHRoZSBpbmZvcm1hdGlvbiBmcm9tCisgICB0aGUgcHJvdmlkZWQgbG9jYWxlIGFuZCBub3QgdGhlIGdsb2JhbCBsb2NhbGUuICAqLworCisvKiBDb21wYXJlIFMxIGFuZCBTMiwgYm90aCBpbnRlcnByZXRlZCBhcyBhcHByb3ByaWF0ZSB0byB0aGUKKyAgIExDX0NPTExBVEUgY2F0ZWdvcnkgb2YgdGhlIGdpdmVuIGxvY2FsZS4gICovCitleHRlcm4gaW50IHdjc2NvbGxfbCAoX19jb25zdCB3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIsCisJCSAgICAgIF9fbG9jYWxlX3QgX19sb2MpIF9fVEhST1c7CisKKy8qIFRyYW5zZm9ybSBTMiBpbnRvIGFycmF5IHBvaW50ZWQgdG8gYnkgUzEgc3VjaCB0aGF0IGlmIHdjc2NtcCBpcworICAgYXBwbGllZCB0byB0d28gdHJhbnNmb3JtZWQgc3RyaW5ncyB0aGUgcmVzdWx0IGlzIHRoZSBhcyBhcHBseWluZworICAgYHdjc2NvbGwnIHRvIHRoZSBvcmlnaW5hbCBzdHJpbmdzLiAgKi8KK2V4dGVybiBzaXplX3Qgd2NzeGZybV9sICh3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIsCisJCQkgc2l6ZV90IF9fbiwgX19sb2NhbGVfdCBfX2xvYykgX19USFJPVzsKKworLyogRHVwbGljYXRlIFMsIHJldHVybmluZyBhbiBpZGVudGljYWwgbWFsbG9jJ2Qgc3RyaW5nLiAgKi8KK2V4dGVybiB3Y2hhcl90ICp3Y3NkdXAgKF9fY29uc3Qgd2NoYXJfdCAqX19zKSBfX1RIUk9XIF9fYXR0cmlidXRlX21hbGxvY19fOworI2VuZGlmCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBXQyBpbiBXQ1MuICAqLworI2lmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1dDSEFSX0hfUFJPVE8KK2V4dGVybiAiQysrIiB3Y2hhcl90ICp3Y3NjaHIgKHdjaGFyX3QgKl9fd2NzLCB3Y2hhcl90IF9fd2MpCisgICAgIF9fVEhST1cgX19hc20gKCJ3Y3NjaHIiKSBfX2F0dHJpYnV0ZV9wdXJlX187CitleHRlcm4gIkMrKyIgX19jb25zdCB3Y2hhcl90ICp3Y3NjaHIgKF9fY29uc3Qgd2NoYXJfdCAqX193Y3MsIHdjaGFyX3QgX193YykKKyAgICAgX19USFJPVyBfX2FzbSAoIndjc2NociIpIF9fYXR0cmlidXRlX3B1cmVfXzsKKyNlbHNlCitleHRlcm4gd2NoYXJfdCAqd2NzY2hyIChfX2NvbnN0IHdjaGFyX3QgKl9fd2NzLCB3Y2hhcl90IF9fd2MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworI2VuZGlmCisvKiBGaW5kIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgV0MgaW4gV0NTLiAgKi8KKyNpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9XQ0hBUl9IX1BST1RPCitleHRlcm4gIkMrKyIgd2NoYXJfdCAqd2NzcmNociAod2NoYXJfdCAqX193Y3MsIHdjaGFyX3QgX193YykKKyAgICAgX19USFJPVyBfX2FzbSAoIndjc3JjaHIiKSBfX2F0dHJpYnV0ZV9wdXJlX187CitleHRlcm4gIkMrKyIgX19jb25zdCB3Y2hhcl90ICp3Y3NyY2hyIChfX2NvbnN0IHdjaGFyX3QgKl9fd2NzLCB3Y2hhcl90IF9fd2MpCisgICAgIF9fVEhST1cgX19hc20gKCJ3Y3NyY2hyIikgX19hdHRyaWJ1dGVfcHVyZV9fOworI2Vsc2UKK2V4dGVybiB3Y2hhcl90ICp3Y3NyY2hyIChfX2NvbnN0IHdjaGFyX3QgKl9fd2NzLCB3Y2hhcl90IF9fd2MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworI2VuZGlmCitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBgd2NzY2hyJy4gIEJ1dCBpdCByZXR1cm5zIGEgcG9pbnRlciB0bworICAgdGhlIGNsb3NpbmcgTlVMIHdpZGUgY2hhcmFjdGVyIGluIGNhc2UgQyBpcyBub3QgZm91bmQgaW4gUy4gICovCitleHRlcm4gd2NoYXJfdCAqd2NzY2hybnVsIChfX2NvbnN0IHdjaGFyX3QgKl9fcywgd2NoYXJfdCBfX3djKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbml0aWFsIHNlZ21ldCBvZiBXQ1Mgd2hpY2gKKyAgIGNvbnNpc3RzIGVudGlyZWx5IG9mIHdpZGUgY2hhcmFjdGVycyBub3QgaW4gUkVKRUNULiAgKi8KK2V4dGVybiBzaXplX3Qgd2NzY3NwbiAoX19jb25zdCB3Y2hhcl90ICpfX3djcywgX19jb25zdCB3Y2hhcl90ICpfX3JlamVjdCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCBzZWdtZXQgb2YgV0NTIHdoaWNoCisgICBjb25zaXN0cyBlbnRpcmVseSBvZiB3aWRlIGNoYXJhY3RlcnMgaW4gIEFDQ0VQVC4gICovCitleHRlcm4gc2l6ZV90IHdjc3NwbiAoX19jb25zdCB3Y2hhcl90ICpfX3djcywgX19jb25zdCB3Y2hhcl90ICpfX2FjY2VwdCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisvKiBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIGluIFdDUyBvZiBhbnkgY2hhcmFjdGVyIGluIEFDQ0VQVC4gICovCisjaWZkZWYgX19DT1JSRUNUX0lTT19DUFBfV0NIQVJfSF9QUk9UTworZXh0ZXJuICJDKysiIHdjaGFyX3QgKndjc3BicmsgKHdjaGFyX3QgKl9fd2NzLCBfX2NvbnN0IHdjaGFyX3QgKl9fYWNjZXB0KQorICAgICBfX1RIUk9XIF9fYXNtICgid2NzcGJyayIpIF9fYXR0cmlidXRlX3B1cmVfXzsKK2V4dGVybiAiQysrIiBfX2NvbnN0IHdjaGFyX3QgKndjc3BicmsgKF9fY29uc3Qgd2NoYXJfdCAqX193Y3MsCisJCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19hY2NlcHQpCisgICAgIF9fVEhST1cgX19hc20gKCJ3Y3NwYnJrIikgX19hdHRyaWJ1dGVfcHVyZV9fOworI2Vsc2UKK2V4dGVybiB3Y2hhcl90ICp3Y3NwYnJrIChfX2NvbnN0IHdjaGFyX3QgKl9fd2NzLCBfX2NvbnN0IHdjaGFyX3QgKl9fYWNjZXB0KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKyNlbmRpZgorLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBORUVETEUgaW4gSEFZU1RBQ0suICAqLworI2lmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1dDSEFSX0hfUFJPVE8KK2V4dGVybiAiQysrIiB3Y2hhcl90ICp3Y3NzdHIgKHdjaGFyX3QgKl9faGF5c3RhY2ssIF9fY29uc3Qgd2NoYXJfdCAqX19uZWVkbGUpCisgICAgIF9fVEhST1cgX19hc20gKCJ3Y3NzdHIiKSBfX2F0dHJpYnV0ZV9wdXJlX187CitleHRlcm4gIkMrKyIgX19jb25zdCB3Y2hhcl90ICp3Y3NzdHIgKF9fY29uc3Qgd2NoYXJfdCAqX19oYXlzdGFjaywKKwkJCQkgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fbmVlZGxlKQorICAgICBfX1RIUk9XIF9fYXNtICgid2Nzc3RyIikgX19hdHRyaWJ1dGVfcHVyZV9fOworI2Vsc2UKK2V4dGVybiB3Y2hhcl90ICp3Y3NzdHIgKF9fY29uc3Qgd2NoYXJfdCAqX19oYXlzdGFjaywgX19jb25zdCB3Y2hhcl90ICpfX25lZWRsZSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisjZW5kaWYKKworLyogRGl2aWRlIFdDUyBpbnRvIHRva2VucyBzZXBhcmF0ZWQgYnkgY2hhcmFjdGVycyBpbiBERUxJTS4gICovCitleHRlcm4gd2NoYXJfdCAqd2NzdG9rICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywKKwkJCV9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2RlbGltLAorCQkJd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19wdHIpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIHdpZGUgY2hhcmFjdGVycyBpbiBTLiAgKi8KK2V4dGVybiBzaXplX3Qgd2NzbGVuIChfX2NvbnN0IHdjaGFyX3QgKl9fcykgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9YT1BFTgorLyogQW5vdGhlciBuYW1lIGZvciBgd2Nzc3RyJyBmcm9tIFhQRzQuICAqLworIyBpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9XQ0hBUl9IX1BST1RPCitleHRlcm4gIkMrKyIgd2NoYXJfdCAqd2Nzd2NzICh3Y2hhcl90ICpfX2hheXN0YWNrLCBfX2NvbnN0IHdjaGFyX3QgKl9fbmVlZGxlKQorICAgICBfX1RIUk9XIF9fYXNtICgid2Nzd2NzIikgX19hdHRyaWJ1dGVfcHVyZV9fOworZXh0ZXJuICJDKysiIF9fY29uc3Qgd2NoYXJfdCAqd2Nzd2NzIChfX2NvbnN0IHdjaGFyX3QgKl9faGF5c3RhY2ssCisJCQkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX25lZWRsZSkKKyAgICAgX19USFJPVyBfX2FzbSAoIndjc3djcyIpIF9fYXR0cmlidXRlX3B1cmVfXzsKKyMgZWxzZQorZXh0ZXJuIHdjaGFyX3QgKndjc3djcyAoX19jb25zdCB3Y2hhcl90ICpfX2hheXN0YWNrLCBfX2NvbnN0IHdjaGFyX3QgKl9fbmVlZGxlKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIHdpZGUgY2hhcmFjdGVycyBpbiBTLCBidXQgYXQgbW9zdCBNQVhMRU4uICAqLworZXh0ZXJuIHNpemVfdCB3Y3NubGVuIChfX2NvbnN0IHdjaGFyX3QgKl9fcywgc2l6ZV90IF9fbWF4bGVuKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogU2VhcmNoIE4gd2lkZSBjaGFyYWN0ZXJzIG9mIFMgZm9yIEMuICAqLworI2lmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1dDSEFSX0hfUFJPVE8KK2V4dGVybiAiQysrIiB3Y2hhcl90ICp3bWVtY2hyICh3Y2hhcl90ICpfX3MsIHdjaGFyX3QgX19jLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fYXNtICgid21lbWNociIpIF9fYXR0cmlidXRlX3B1cmVfXzsKK2V4dGVybiAiQysrIiBfX2NvbnN0IHdjaGFyX3QgKndtZW1jaHIgKF9fY29uc3Qgd2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fYywKKwkJCQkgICAgICAgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX2FzbSAoIndtZW1jaHIiKSBfX2F0dHJpYnV0ZV9wdXJlX187CisjZWxzZQorZXh0ZXJuIHdjaGFyX3QgKndtZW1jaHIgKF9fY29uc3Qgd2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisjZW5kaWYKKworLyogQ29tcGFyZSBOIHdpZGUgY2hhcmFjdGVycyBvZiBTMSBhbmQgUzIuICAqLworZXh0ZXJuIGludCB3bWVtY21wIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisKKy8qIENvcHkgTiB3aWRlIGNoYXJhY3RlcnMgb2YgU1JDIHRvIERFU1QuICAqLworZXh0ZXJuIHdjaGFyX3QgKndtZW1jcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwKKwkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbikgX19USFJPVzsKKworLyogQ29weSBOIHdpZGUgY2hhcmFjdGVycyBvZiBTUkMgdG8gREVTVCwgZ3VhcmFudGVlaW5nCisgICBjb3JyZWN0IGJlaGF2aW9yIGZvciBvdmVybGFwcGluZyBzdHJpbmdzLiAgKi8KK2V4dGVybiB3Y2hhcl90ICp3bWVtbW92ZSAod2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XOworCisvKiBTZXQgTiB3aWRlIGNoYXJhY3RlcnMgb2YgUyB0byBDLiAgKi8KK2V4dGVybiB3Y2hhcl90ICp3bWVtc2V0ICh3Y2hhcl90ICpfX3MsIHdjaGFyX3QgX19jLCBzaXplX3QgX19uKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfR05VCisvKiBDb3B5IE4gd2lkZSBjaGFyYWN0ZXJzIG9mIFNSQyB0byBERVNUIGFuZCByZXR1cm4gcG9pbnRlciB0byBmb2xsb3dpbmcKKyAgIHdpZGUgY2hhcmFjdGVyLiAgKi8KK2V4dGVybiB3Y2hhcl90ICp3bWVtcGNweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVzsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogRGV0ZXJtaW5lIHdoZXRoZXIgQyBjb25zdGl0dXRlcyBhIHZhbGlkIChvbmUtYnl0ZSkgbXVsdGlieXRlCisgICBjaGFyYWN0ZXIuICAqLworZXh0ZXJuIHdpbnRfdCBidG93YyAoaW50IF9fYykgX19USFJPVzsKKworLyogRGV0ZXJtaW5lIHdoZXRoZXIgQyBjb3JyZXNwb25kcyB0byBhIG1lbWJlciBvZiB0aGUgZXh0ZW5kZWQKKyAgIGNoYXJhY3RlciBzZXQgd2hvc2UgbXVsdGlieXRlIHJlcHJlc2VudGF0aW9uIGlzIGEgc2luZ2xlIGJ5dGUuICAqLworZXh0ZXJuIGludCB3Y3RvYiAod2ludF90IF9fYykgX19USFJPVzsKKworLyogRGV0ZXJtaW5lIHdoZXRoZXIgUFMgcG9pbnRzIHRvIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGluaXRpYWwKKyAgIHN0YXRlLiAgKi8KK2V4dGVybiBpbnQgbWJzaW5pdCAoX19jb25zdCBtYnN0YXRlX3QgKl9fcHMpIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworCisvKiBXcml0ZSB3aWRlIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiBvZiBtdWx0aWJ5dGUgY2hhcmFjdGVyIHBvaW50ZWQKKyAgIHRvIGJ5IFMgdG8gUFdDLiAgKi8KK2V4dGVybiBzaXplX3QgbWJydG93YyAod2NoYXJfdCAqX19yZXN0cmljdCBfX3B3YywKKwkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCSAgICAgICBtYnN0YXRlX3QgKl9fcCkgX19USFJPVzsKKworLyogV3JpdGUgbXVsdGlieXRlIHJlcHJlc2VudGF0aW9uIG9mIHdpZGUgY2hhcmFjdGVyIFdDIHRvIFMuICAqLworZXh0ZXJuIHNpemVfdCB3Y3J0b21iIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgd2NoYXJfdCBfX3djLAorCQkgICAgICAgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpIF9fVEhST1c7CisKKy8qIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgaW4gbXVsdGlieXRlIGNoYXJhY3RlciBwb2ludGVkIHRvIGJ5IFMuICAqLworZXh0ZXJuIHNpemVfdCBfX21icmxlbiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJCW1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBtYnJsZW4gKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCSAgICAgIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKKy8qIERlZmluZSBpbmxpbmUgZnVuY3Rpb24gYXMgb3B0aW1pemF0aW9uLiAgKi8KKworLyogV2UgY2FuIHVzZSB0aGUgQlRPV0MgYW5kIFdDVE9CIG9wdGltaXphdGlvbnMgc2luY2Ugd2Uga25vdyB0aGF0IGFsbAorICAgbG9jYWxlcyBtdXN0IHVzZSBBU0NJSSBlbmNvZGluZyBmb3IgdGhlIHZhbHVlcyBpbiB0aGUgQVNDSUkgcmFuZ2UKKyAgIGFuZCBiZWNhdXNlIHRoZSB3Y2hhcl90IGVuY29kaW5nIGlzIGFsd2F5cyBJU08gMTA2NDYuICAqLworZXh0ZXJuIHdpbnRfdCBfX2J0b3djX2FsaWFzIChpbnQgX19jKSBfX2FzbSAoImJ0b3djIik7CitfX2V4dGVybl9pbmxpbmUgd2ludF90CitfX05USCAoYnRvd2MgKGludCBfX2MpKQoreyByZXR1cm4gKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX2MpICYmIF9fYyA+PSAnXDAnICYmIF9fYyA8PSAnXHg3ZicKKwkgID8gKHdpbnRfdCkgX19jIDogX19idG93Y19hbGlhcyAoX19jKSk7IH0KKworZXh0ZXJuIGludCBfX3djdG9iX2FsaWFzICh3aW50X3QgX19jKSBfX2FzbSAoIndjdG9iIik7CitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAod2N0b2IgKHdpbnRfdCBfX3djKSkKK3sgcmV0dXJuIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX193YykgJiYgX193YyA+PSBMJ1wwJyAmJiBfX3djIDw9IEwnXHg3ZicKKwkgID8gKGludCkgX193YyA6IF9fd2N0b2JfYWxpYXMgKF9fd2MpKTsgfQorCitfX2V4dGVybl9pbmxpbmUgc2l6ZV90CitfX05USCAobWJybGVuIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCSAgICAgICBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykpCit7IHJldHVybiAoX19wcyAhPSBOVUxMCisJICA/IG1icnRvd2MgKE5VTEwsIF9fcywgX19uLCBfX3BzKSA6IF9fbWJybGVuIChfX3MsIF9fbiwgTlVMTCkpOyB9CisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBXcml0ZSB3aWRlIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiBvZiBtdWx0aWJ5dGUgY2hhcmFjdGVyIHN0cmluZworICAgU1JDIHRvIERTVC4gICovCitleHRlcm4gc2l6ZV90IG1ic3J0b3djcyAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19sZW4sCisJCQkgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpIF9fVEhST1c7CisKKy8qIFdyaXRlIG11bHRpYnl0ZSBjaGFyYWN0ZXIgcmVwcmVzZW50YXRpb24gb2Ygd2lkZSBjaGFyYWN0ZXIgc3RyaW5nCisgICBTUkMgdG8gRFNULiAgKi8KK2V4dGVybiBzaXplX3Qgd2NzcnRvbWJzIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX2xlbiwKKwkJCSBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworCisjaWZkZWYJX19VU0VfWE9QRU4ySzgKKy8qIFdyaXRlIHdpZGUgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIG9mIGF0IG1vc3QgTk1DIGJ5dGVzIG9mIHRoZQorICAgbXVsdGlieXRlIGNoYXJhY3RlciBzdHJpbmcgU1JDIHRvIERTVC4gICovCitleHRlcm4gc2l6ZV90IG1ic25ydG93Y3MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX25tYywKKwkJCSAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykgX19USFJPVzsKKworLyogV3JpdGUgbXVsdGlieXRlIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiBvZiBhdCBtb3N0IE5XQyBjaGFyYWN0ZXJzCisgICBmcm9tIHRoZSB3aWRlIGNoYXJhY3RlciBzdHJpbmcgU1JDIHRvIERTVC4gICovCitleHRlcm4gc2l6ZV90IHdjc25ydG9tYnMgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgIHNpemVfdCBfX253Yywgc2l6ZV90IF9fbGVuLAorCQkJICBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykgX19USFJPVzsKKyNlbmRpZgkvKiB1c2UgUE9TSVggMjAwOCAqLworCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBleHRlbnNpb25zIGZvdW5kIGluIFgvT3BlbiBDQUUuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOCisvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIGNvbHVtbiBwb3NpdGlvbnMgcmVxdWlyZWQgZm9yIEMuICAqLworZXh0ZXJuIGludCB3Y3dpZHRoICh3Y2hhcl90IF9fYykgX19USFJPVzsKKworLyogRGV0ZXJtaW5lIG51bWJlciBvZiBjb2x1bW4gcG9zaXRpb25zIHJlcXVpcmVkIGZvciBmaXJzdCBOIHdpZGUKKyAgIGNoYXJhY3RlcnMgKG9yIGZld2VyIGlmIFMgZW5kcyBiZWZvcmUgdGhpcykgaW4gUy4gICovCitleHRlcm4gaW50IHdjc3dpZHRoIChfX2NvbnN0IHdjaGFyX3QgKl9fcywgc2l6ZV90IF9fbikgX19USFJPVzsKKyNlbmRpZgkvKiBVc2UgWC9PcGVuLiAgKi8KKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENvbnZlcnQgaW5pdGlhbCBwb3J0aW9uIG9mIHRoZSB3aWRlIHN0cmluZyBOUFRSIHRvIGBkb3VibGUnCisgICByZXByZXNlbnRhdGlvbi4gICovCitleHRlcm4gZG91YmxlIHdjc3RvZCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJICAgICAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIpIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogTGlrZXdpc2UgZm9yIGBmbG9hdCcgYW5kIGBsb25nIGRvdWJsZScgc2l6ZXMgb2YgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4gICovCitleHRlcm4gZmxvYXQgd2NzdG9mIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkgICAgIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyKSBfX1RIUk9XOworZXh0ZXJuIGxvbmcgZG91YmxlIHdjc3RvbGQgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgICAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIpIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYgLyogQzk5ICovCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDb252ZXJ0IGluaXRpYWwgcG9ydGlvbiBvZiB3aWRlIHN0cmluZyBOUFRSIHRvIGBsb25nIGludCcKKyAgIHJlcHJlc2VudGF0aW9uLiAgKi8KK2V4dGVybiBsb25nIGludCB3Y3N0b2wgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQl3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkgX19USFJPVzsKKworLyogQ29udmVydCBpbml0aWFsIHBvcnRpb24gb2Ygd2lkZSBzdHJpbmcgTlBUUiB0byBgdW5zaWduZWQgbG9uZyBpbnQnCisgICByZXByZXNlbnRhdGlvbi4gICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgd2NzdG91bCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkgIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKQorICAgICBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgfHwgKGRlZmluZWQgX19HTlVDX18gJiYgZGVmaW5lZCBfX1VTRV9HTlUpCitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIENvbnZlcnQgaW5pdGlhbCBwb3J0aW9uIG9mIHdpZGUgc3RyaW5nIE5QVFIgdG8gYGxvbmcgbG9uZyBpbnQnCisgICByZXByZXNlbnRhdGlvbi4gICovCitfX2V4dGVuc2lvbl9fCitleHRlcm4gbG9uZyBsb25nIGludCB3Y3N0b2xsIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJICAgICAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpCisgICAgIF9fVEhST1c7CisKKy8qIENvbnZlcnQgaW5pdGlhbCBwb3J0aW9uIG9mIHdpZGUgc3RyaW5nIE5QVFIgdG8gYHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQnCisgICByZXByZXNlbnRhdGlvbi4gICovCitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGludCB3Y3N0b3VsbCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkJd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJCWludCBfX2Jhc2UpIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYgLyogSVNPIEM5OSBvciBHQ0MgYW5kIEdOVS4gICovCisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIGRlZmluZWQgX19VU0VfR05VCisvKiBDb252ZXJ0IGluaXRpYWwgcG9ydGlvbiBvZiB3aWRlIHN0cmluZyBOUFRSIHRvIGBsb25nIGxvbmcgaW50JworICAgcmVwcmVzZW50YXRpb24uICAqLworX19leHRlbnNpb25fXworZXh0ZXJuIGxvbmcgbG9uZyBpbnQgd2NzdG9xIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJICAgICB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkKKyAgICAgX19USFJPVzsKKworLyogQ29udmVydCBpbml0aWFsIHBvcnRpb24gb2Ygd2lkZSBzdHJpbmcgTlBUUiB0byBgdW5zaWduZWQgbG9uZyBsb25nIGludCcKKyAgIHJlcHJlc2VudGF0aW9uLiAgKi8KK19fZXh0ZW5zaW9uX18KK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHdjc3RvdXEgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJICAgICAgIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJCSAgICAgICBpbnQgX19iYXNlKSBfX1RIUk9XOworI2VuZGlmIC8qIEdDQyBhbmQgdXNlIEdOVS4gICovCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoZSBjb25jZXB0IG9mIG9uZSBzdGF0aWMgbG9jYWxlIHBlciBjYXRlZ29yeSBpcyBub3QgdmVyeSB3ZWxsCisgICB0aG91Z2h0IG91dC4gIE1hbnkgYXBwbGljYXRpb25zIHdpbGwgbmVlZCB0byBwcm9jZXNzIGl0cyBkYXRhIHVzaW5nCisgICBpbmZvcm1hdGlvbiBmcm9tIHNldmVyYWwgZGlmZmVyZW50IGxvY2FsZXMuICBBbm90aGVyIGFwcGxpY2F0aW9uIGlzCisgICB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmF0aW9uYWxpemF0aW9uIGhhbmRsaW5nIGluIHRoZQorICAgdXBjb21pbmcgSVNPIEMrKyBzdGFuZGFyZCBsaWJyYXJ5LiAgVG8gc3VwcG9ydCB0aGlzIGFub3RoZXIgc2V0IG9mCisgICB0aGUgZnVuY3Rpb25zIHVzaW5nIGxvY2FsZSBkYXRhIGV4aXN0IHdoaWNoIGhhdmUgYW4gYWRkaXRpb25hbAorICAgYXJndW1lbnQuCisKKyAgIEF0dGVudGlvbjogYWxsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgKm5vdCogc3RhbmRhcmRpemVkIGluIGFueSBmb3JtLgorICAgVGhpcyBpcyBhIHByb29mLW9mLWNvbmNlcHQgaW1wbGVtZW50YXRpb24uICAqLworCisvKiBTdHJ1Y3R1cmUgZm9yIHJlZW50cmFudCBsb2NhbGUgdXNpbmcgZnVuY3Rpb25zLiAgVGhpcyBpcyBhbgorICAgKGFsbW9zdCkgb3BhcXVlIHR5cGUgZm9yIHRoZSB1c2VyIGxldmVsIHByb2dyYW1zLiAgKi8KKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorCisvKiBTcGVjaWFsIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUgd2hpY2ggdGFrZSB0aGUgbG9jYWxlIHRvCisgICB1c2UgYXMgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIuICAqLworZXh0ZXJuIGxvbmcgaW50IHdjc3RvbF9sIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJICB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSwKKwkJCSAgX19sb2NhbGVfdCBfX2xvYykgX19USFJPVzsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IHdjc3RvdWxfbCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkgICAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJICAgIGludCBfX2Jhc2UsIF9fbG9jYWxlX3QgX19sb2MpIF9fVEhST1c7CisKK19fZXh0ZW5zaW9uX18KK2V4dGVybiBsb25nIGxvbmcgaW50IHdjc3RvbGxfbCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQl3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQlpbnQgX19iYXNlLCBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XOworCitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGludCB3Y3N0b3VsbF9sIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJCQkgIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJCQkgIGludCBfX2Jhc2UsIF9fbG9jYWxlX3QgX19sb2MpCisgICAgIF9fVEhST1c7CisKK2V4dGVybiBkb3VibGUgd2NzdG9kX2wgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQl3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVzsKKworZXh0ZXJuIGZsb2F0IHdjc3RvZl9sIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkgICAgICAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIF9fbG9jYWxlX3QgX19sb2MpCisgICAgIF9fVEhST1c7CisKK2V4dGVybiBsb25nIGRvdWJsZSB3Y3N0b2xkX2wgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgICAgICB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCSAgICAgIF9fbG9jYWxlX3QgX19sb2MpIF9fVEhST1c7CisjZW5kaWYJLyogdXNlIEdOVSAqLworCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogQ29weSBTUkMgdG8gREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSB0ZXJtaW5hdGluZyBMJ1wwJyBpbgorICAgREVTVC4gICovCitleHRlcm4gd2NoYXJfdCAqd2NwY3B5ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCV9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYykgX19USFJPVzsKKworLyogQ29weSBubyBtb3JlIHRoYW4gTiBjaGFyYWN0ZXJzIG9mIFNSQyB0byBERVNULCByZXR1cm5pbmcgdGhlIGFkZHJlc3Mgb2YKKyAgIHRoZSBsYXN0IGNoYXJhY3RlciB3cml0dGVuIGludG8gREVTVC4gICovCitleHRlcm4gd2NoYXJfdCAqd2NwbmNweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XOworCisKKy8qIFdpZGUgY2hhcmFjdGVyIEkvTyBmdW5jdGlvbnMuICAqLworCisvKiBMaWtlIE9QRU5fTUVNU1RSRUFNLCBidXQgdGhlIHN0cmVhbSBpcyB3aWRlIG9yaWVudGVkIGFuZCBwcm9kdWNlcworICAgYSB3aWRlIGNoYXJhY3RlciBzdHJpbmcuICAqLworZXh0ZXJuIF9fRklMRSAqb3Blbl93bWVtc3RyZWFtICh3Y2hhcl90ICoqX19idWZsb2MsIHNpemVfdCAqX19zaXplbG9jKSBfX1RIUk9XOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0lTT0M5NSB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorX19CRUdJTl9OQU1FU1BBQ0VfU1RECisKKy8qIFNlbGVjdCBvcmllbnRhdGlvbiBmb3Igc3RyZWFtLiAgKi8KK2V4dGVybiBpbnQgZndpZGUgKF9fRklMRSAqX19mcCwgaW50IF9fbW9kZSkgX19USFJPVzsKKworCisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZ3cHJpbnRmIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCSAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dwcmludGZfXywgMiwgMykpKSAqLzsKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gc3Rkb3V0LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgd3ByaW50ZiAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dwcmludGZfXywgMSwgMikpKSAqLzsKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgb2YgYXQgbW9zdCBOIGNoYXJhY3RlcnMgdG8gUy4gICovCitleHRlcm4gaW50IHN3cHJpbnRmICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKKyAgICAgX19USFJPVyAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193cHJpbnRmX18sIDMsIDQpKSkgKi87CisKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gUyBmcm9tIGFyZ3VtZW50IGxpc3QgQVJHLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdmZ3cHJpbnRmIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zLAorCQkgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCSAgICAgIF9fZ251Y192YV9saXN0IF9fYXJnKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193cHJpbnRmX18sIDIsIDApKSkgKi87CisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIHN0ZG91dCBmcm9tIGFyZ3VtZW50IGxpc3QgQVJHLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdndwcmludGYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJICAgICBfX2dudWNfdmFfbGlzdCBfX2FyZykKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3ByaW50Zl9fLCAxLCAwKSkpICovOworLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCBvZiBhdCBtb3N0IE4gY2hhcmFjdGVyIHRvIFMgZnJvbSBhcmd1bWVudAorICAgbGlzdCBBUkcuICAqLworZXh0ZXJuIGludCB2c3dwcmludGYgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCSAgICAgIF9fZ251Y192YV9saXN0IF9fYXJnKQorICAgICBfX1RIUk9XIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dwcmludGZfXywgMywgMCkpKSAqLzsKKworCisvKiBSZWFkIGZvcm1hdHRlZCBpbnB1dCBmcm9tIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZ3c2NhbmYgKF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193c2NhbmZfXywgMiwgMykpKSAqLzsKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gc3RkaW4uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCB3c2NhbmYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193c2NhbmZfXywgMSwgMikpKSAqLzsKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gUy4gICovCitleHRlcm4gaW50IHN3c2NhbmYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MsCisJCSAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKKyAgICAgX19USFJPVyAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193c2NhbmZfXywgMiwgMykpKSAqLzsKKworIyBpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSAmJiAhZGVmaW5lZCBfX1VTRV9HTlUgXAorICAgICAmJiAoIWRlZmluZWQgX19MREJMX0NPTVBBVCB8fCAhZGVmaW5lZCBfX1JFRElSRUNUKSBcCisgICAgICYmIChkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMkspCisjICBpZmRlZiBfX1JFRElSRUNUCisvKiBGb3Igc3RyaWN0IElTTyBDOTkgb3IgUE9TSVggY29tcGxpYW5jZSBkaXNhbGxvdyAlYXMsICVhUyBhbmQgJWFbCisgICBHTlUgZXh0ZW5zaW9uIHdoaWNoIGNvbmZsaWN0cyB3aXRoIHZhbGlkICVhIGZvbGxvd2VkIGJ5IGxldHRlcgorICAgcywgUyBvciBbLiAgKi8KK2V4dGVybiBpbnQgX19SRURJUkVDVCAoZndzY2FuZiwgKF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pLAorCQkgICAgICAgX19pc29jOTlfZndzY2FuZikKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDIsIDMpKSkgKi87CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKHdzY2FuZiwgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSwKKwkJICAgICAgIF9faXNvYzk5X3dzY2FuZikKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDEsIDIpKSkgKi87CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChzd3NjYW5mLCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywKKwkJCQkgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCQkgICAgIC4uLiksIF9faXNvYzk5X3N3c2NhbmYpCisgICAgIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dzY2FuZl9fLCAyLCAzKSkpICovOworIyAgZWxzZQorZXh0ZXJuIGludCBfX2lzb2M5OV9md3NjYW5mIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCQkgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKTsKK2V4dGVybiBpbnQgX19pc29jOTlfd3NjYW5mIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLik7CitleHRlcm4gaW50IF9faXNvYzk5X3N3c2NhbmYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MsCisJCQkgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKQorICAgICBfX1RIUk9XOworIyAgIGRlZmluZSBmd3NjYW5mIF9faXNvYzk5X2Z3c2NhbmYKKyMgICBkZWZpbmUgd3NjYW5mIF9faXNvYzk5X3dzY2FuZgorIyAgIGRlZmluZSBzd3NjYW5mIF9faXNvYzk5X3N3c2NhbmYKKyMgIGVuZGlmCisjIGVuZGlmCisKK19fRU5EX05BTUVTUEFDRV9TVEQKKyNlbmRpZiAvKiBVc2UgSVNPIEM5NSwgQzk5IGFuZCBVbml4OTguICovCisKKyNpZmRlZiBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogUmVhZCBmb3JtYXR0ZWQgaW5wdXQgZnJvbSBTIGludG8gYXJndW1lbnQgbGlzdCBBUkcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCB2ZndzY2FuZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fcywKKwkJICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCSAgICAgX19nbnVjX3ZhX2xpc3QgX19hcmcpCisgICAgIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dzY2FuZl9fLCAyLCAwKSkpICovOworLyogUmVhZCBmb3JtYXR0ZWQgaW5wdXQgZnJvbSBzdGRpbiBpbnRvIGFyZ3VtZW50IGxpc3QgQVJHLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdndzY2FuZiAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkgICAgX19nbnVjX3ZhX2xpc3QgX19hcmcpCisgICAgIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dzY2FuZl9fLCAxLCAwKSkpICovOworLyogUmVhZCBmb3JtYXR0ZWQgaW5wdXQgZnJvbSBTIGludG8gYXJndW1lbnQgbGlzdCBBUkcuICAqLworZXh0ZXJuIGludCB2c3dzY2FuZiAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywKKwkJICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCSAgICAgX19nbnVjX3ZhX2xpc3QgX19hcmcpCisgICAgIF9fVEhST1cgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDIsIDApKSkgKi87CisKKyMgaWYgIWRlZmluZWQgX19VU0VfR05VIFwKKyAgICAgJiYgKCFkZWZpbmVkIF9fTERCTF9DT01QQVQgfHwgIWRlZmluZWQgX19SRURJUkVDVCkgXAorICAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUICh2ZndzY2FuZiwgKF9fRklMRSAqX19yZXN0cmljdCBfX3MsCisJCQkJICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkJICBfX2dudWNfdmFfbGlzdCBfX2FyZyksIF9faXNvYzk5X3Zmd3NjYW5mKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193c2NhbmZfXywgMiwgMCkpKSAqLzsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAodndzY2FuZiwgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCQkgX19nbnVjX3ZhX2xpc3QgX19hcmcpLCBfX2lzb2M5OV92d3NjYW5mKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193c2NhbmZfXywgMSwgMCkpKSAqLzsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHZzd3NjYW5mLCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywKKwkJCQkgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkJICAgICAgX19nbnVjX3ZhX2xpc3QgX19hcmcpLCBfX2lzb2M5OV92c3dzY2FuZikKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDIsIDApKSkgKi87CisjICBlbHNlCitleHRlcm4gaW50IF9faXNvYzk5X3Zmd3NjYW5mIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zLAorCQkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgICAgX19nbnVjX3ZhX2xpc3QgX19hcmcpOworZXh0ZXJuIGludCBfX2lzb2M5OV92d3NjYW5mIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICAgIF9fZ251Y192YV9saXN0IF9fYXJnKTsKK2V4dGVybiBpbnQgX19pc29jOTlfdnN3c2NhbmYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MsCisJCQkgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICAgICBfX2dudWNfdmFfbGlzdCBfX2FyZykgX19USFJPVzsKKyMgICBkZWZpbmUgdmZ3c2NhbmYgX19pc29jOTlfdmZ3c2NhbmYKKyMgICBkZWZpbmUgdndzY2FuZiBfX2lzb2M5OV92d3NjYW5mCisjICAgZGVmaW5lIHZzd3NjYW5mIF9faXNvYzk5X3Zzd3NjYW5mCisjICBlbmRpZgorIyBlbmRpZgorCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYgLyogVXNlIElTTyBDOTkuICovCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZWFkIGEgY2hhcmFjdGVyIGZyb20gU1RSRUFNLgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdpbnRfdCBmZ2V0d2MgKF9fRklMRSAqX19zdHJlYW0pOworZXh0ZXJuIHdpbnRfdCBnZXR3YyAoX19GSUxFICpfX3N0cmVhbSk7CisKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSBzdGRpbi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gd2ludF90IGdldHdjaGFyICh2b2lkKTsKKworCisvKiBXcml0ZSBhIGNoYXJhY3RlciB0byBTVFJFQU0uCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gd2ludF90IGZwdXR3YyAod2NoYXJfdCBfX3djLCBfX0ZJTEUgKl9fc3RyZWFtKTsKK2V4dGVybiB3aW50X3QgcHV0d2MgKHdjaGFyX3QgX193YywgX19GSUxFICpfX3N0cmVhbSk7CisKKy8qIFdyaXRlIGEgY2hhcmFjdGVyIHRvIHN0ZG91dC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gd2ludF90IHB1dHdjaGFyICh3Y2hhcl90IF9fd2MpOworCisKKy8qIEdldCBhIG5ld2xpbmUtdGVybWluYXRlZCB3aWRlIGNoYXJhY3RlciBzdHJpbmcgb2YgZmluaXRlIGxlbmd0aAorICAgZnJvbSBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdjaGFyX3QgKmZnZXR3cyAod2NoYXJfdCAqX19yZXN0cmljdCBfX3dzLCBpbnQgX19uLAorCQkJX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKTsKKworLyogV3JpdGUgYSBzdHJpbmcgdG8gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZnB1dHdzIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX193cywKKwkJICAgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKTsKKworCisvKiBQdXNoIGEgY2hhcmFjdGVyIGJhY2sgb250byB0aGUgaW5wdXQgYnVmZmVyIG9mIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gd2ludF90IHVuZ2V0d2MgKHdpbnRfdCBfX3djLCBfX0ZJTEUgKl9fc3RyZWFtKTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworCisjaWZkZWYgX19VU0VfR05VCisvKiBUaGVzZSBhcmUgZGVmaW5lZCB0byBiZSBlcXVpdmFsZW50IHRvIHRoZSBgY2hhcicgZnVuY3Rpb25zIGRlZmluZWQKKyAgIGluIFBPU0lYLjE6MTk5Ni4KKworICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gdGhleSBhcmUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gd2ludF90IGdldHdjX3VubG9ja2VkIChfX0ZJTEUgKl9fc3RyZWFtKTsKK2V4dGVybiB3aW50X3QgZ2V0d2NoYXJfdW5sb2NrZWQgKHZvaWQpOworCisvKiBUaGlzIGlzIHRoZSB3aWRlIGNoYXJhY3RlciB2ZXJzaW9uIG9mIGEgR05VIGV4dGVuc2lvbi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdpbnRfdCBmZ2V0d2NfdW5sb2NrZWQgKF9fRklMRSAqX19zdHJlYW0pOworCisvKiBGYXN0ZXIgdmVyc2lvbiB3aGVuIGxvY2tpbmcgaXMgbm90IG5lY2Vzc2FyeS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdpbnRfdCBmcHV0d2NfdW5sb2NrZWQgKHdjaGFyX3QgX193YywgX19GSUxFICpfX3N0cmVhbSk7CisKKy8qIFRoZXNlIGFyZSBkZWZpbmVkIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhlIGBjaGFyJyBmdW5jdGlvbnMgZGVmaW5lZAorICAgaW4gUE9TSVguMToxOTk2LgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGV5IGFyZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB3aW50X3QgcHV0d2NfdW5sb2NrZWQgKHdjaGFyX3QgX193YywgX19GSUxFICpfX3N0cmVhbSk7CitleHRlcm4gd2ludF90IHB1dHdjaGFyX3VubG9ja2VkICh3Y2hhcl90IF9fd2MpOworCisKKy8qIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc2FtZSBhcyBgZmdldHdzJyBidXQgZG9lcyBub3QgbG9jayB0aGUgc3RyZWFtLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gd2NoYXJfdCAqZmdldHdzX3VubG9ja2VkICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fd3MsIGludCBfX24sCisJCQkJIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSk7CisKKy8qIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc2FtZSBhcyBgZnB1dHdzJyBidXQgZG9lcyBub3QgbG9jayB0aGUgc3RyZWFtLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZwdXR3c191bmxvY2tlZCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fd3MsCisJCQkgICAgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKTsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogRm9ybWF0IFRQIGludG8gUyBhY2NvcmRpbmcgdG8gRk9STUFULgorICAgV3JpdGUgbm8gbW9yZSB0aGFuIE1BWFNJWkUgd2lkZSBjaGFyYWN0ZXJzIGFuZCByZXR1cm4gdGhlIG51bWJlcgorICAgb2Ygd2lkZSBjaGFyYWN0ZXJzIHdyaXR0ZW4sIG9yIDAgaWYgaXQgd291bGQgZXhjZWVkIE1BWFNJWkUuICAqLworZXh0ZXJuIHNpemVfdCB3Y3NmdGltZSAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX21heHNpemUsCisJCQlfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQlfX2NvbnN0IHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3RwKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX0M5OQorCisjIGlmZGVmIF9fVVNFX0dOVQorIyBpbmNsdWRlIDx4bG9jYWxlLmg+CisKKy8qIFNpbWlsYXIgdG8gYHdjc2Z0aW1lJyBidXQgdGFrZXMgdGhlIGluZm9ybWF0aW9uIGZyb20KKyAgIHRoZSBwcm92aWRlZCBsb2NhbGUgYW5kIG5vdCB0aGUgZ2xvYmFsIGxvY2FsZS4gICovCitleHRlcm4gc2l6ZV90IHdjc2Z0aW1lX2wgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhzaXplLAorCQkJICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgIF9fY29uc3Qgc3RydWN0IHRtICpfX3Jlc3RyaWN0IF9fdHAsCisJCQkgIF9fbG9jYWxlX3QgX19sb2MpIF9fVEhST1c7CisjIGVuZGlmCisKKy8qIFRoZSBYL09wZW4gc3RhbmRhcmQgZGVtYW5kcyB0aGF0IG1vc3Qgb2YgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGluCisgICB0aGUgPHdjdHlwZS5oPiBoZWFkZXIgbXVzdCBhbHNvIGFwcGVhciBoZXJlLiAgVGhpcyBpcyBwcm9iYWJseQorICAgYmVjYXVzZSBzb21lIFgvT3BlbiBtZW1iZXJzIHdyb3RlIHRoZWlyIGltcGxlbWVudGF0aW9uIGJlZm9yZSB0aGUKKyAgIElTTyBDIHN0YW5kYXJkIHdhcyBwdWJsaXNoZWQgYW5kIGludHJvZHVjZWQgdGhlIGJldHRlciBzb2x1dGlvbi4KKyAgIFdlIGhhdmUgdG8gcHJvdmlkZSB0aGVzZSBkZWZpbml0aW9ucyBmb3IgY29tcGxpYW5jZSByZWFzb25zIGJ1dCB3ZQorICAgZG8gdGhpcyBub25zZW5zZSBvbmx5IGlmIHJlYWxseSBuZWNlc3NhcnkuICAqLworI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4ICYmICFkZWZpbmVkIF9fVVNFX0dOVQorIyBkZWZpbmUgX19uZWVkX2lzd3h4eAorIyBpbmNsdWRlIDx3Y3R5cGUuaD4KKyNlbmRpZgorCisvKiBEZWZpbmUgc29tZSBtYWNyb3MgaGVscGluZyB0byBjYXRjaCBidWZmZXIgb3ZlcmZsb3dzLiAgKi8KKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKKyMgaW5jbHVkZSA8Yml0cy93Y2hhcjIuaD4KKyNlbmRpZgorCisjaWZkZWYgX19MREJMX0NPTVBBVAorIyBpbmNsdWRlIDxiaXRzL3djaGFyLWxkYmwuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogX1dDSEFSX0ggZGVmaW5lZCAqLworCisjZW5kaWYgLyogd2NoYXIuaCAgKi8KKworLyogVW5kZWZpbmUgYWxsIF9fbmVlZF8qIGNvbnN0YW50cyBpbiBjYXNlIHdlIGFyZSBpbmNsdWRlZCB0byBnZXQgdGhvc2UKKyAgIGNvbnN0YW50cyBidXQgdGhlIHdob2xlIGZpbGUgd2FzIGFscmVhZHkgcmVhZC4gICovCisjdW5kZWYgX19uZWVkX21ic3RhdGVfdAorI3VuZGVmIF9fbmVlZF93aW50X3QKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvd2N0eXBlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3djdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmZiZjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3djdHlwZS5oCkBAIC0wLDAgKzEsMzE5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMiwyMDA1LDIwMDctMjAwOSwyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4yNQorICoJV2lkZSBjaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24gYW5kIG1hcHBpbmcgdXRpbGl0aWVzICA8d2N0eXBlLmg+CisgKi8KKworI2lmbmRlZiBfV0NUWVBFX0gKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisjaWZuZGVmIF9fbmVlZF9pc3d4eHgKKyMgZGVmaW5lIF9XQ1RZUEVfSAkxCisKKy8qIEdldCB3aW50X3QgZnJvbSA8d2NoYXIuaD4uICAqLworIyBkZWZpbmUgX19uZWVkX3dpbnRfdAorIyBpbmNsdWRlIDx3Y2hhci5oPgorCisvKiBDb25zdGFudCBleHByZXNzaW9uIG9mIHR5cGUgYHdpbnRfdCcgd2hvc2UgdmFsdWUgZG9lcyBub3QgY29ycmVzcG9uZAorICAgdG8gYW55IG1lbWJlciBvZiB0aGUgZXh0ZW5kZWQgY2hhcmFjdGVyIHNldC4gICovCisjIGlmbmRlZiBXRU9GCisjICBkZWZpbmUgV0VPRiAoMHhmZmZmZmZmZnUpCisjIGVuZGlmCisjZW5kaWYKKyN1bmRlZiBfX25lZWRfaXN3eHh4CisKKworLyogVGhlIGZvbGxvd2luZyBwYXJ0IGlzIGFsc28gdXNlZCBpbiB0aGUgPHdjc21icy5oPiBoZWFkZXIgd2hlbiBjb21waWxlZAorICAgaW4gdGhlIFVuaXg5OCBjb21wYXRpYmlsaXR5IG1vZGUuICAqLworI2lmbmRlZiBfX2lzd3h4eF9kZWZpbmVkCisjIGRlZmluZSBfX2lzd3h4eF9kZWZpbmVkCTEKKworX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBTY2FsYXIgdHlwZSB0aGF0IGNhbiBob2xkIHZhbHVlcyB3aGljaCByZXByZXNlbnQgbG9jYWxlLXNwZWNpZmljCisgICBjaGFyYWN0ZXIgY2xhc3NpZmljYXRpb25zLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgd2N0eXBlX3Q7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisKKyMgaWZuZGVmIF9JU3diaXQKKy8qIFRoZSBjaGFyYWN0ZXJpc3RpY3MgYXJlIHN0b3JlZCBhbHdheXMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWcKKyAgIGVuZGlhbikuICBXZSBkZWZpbmUgdGhlIGJpdCB2YWx1ZSBpbnRlcnByZXRhdGlvbnMgaGVyZSBkZXBlbmRlbnQgb24gdGhlCisgICBtYWNoaW5lJ3MgYnl0ZSBvcmRlci4gICovCisKKyMgIGluY2x1ZGUgPGVuZGlhbi5oPgorIyAgaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyAgIGRlZmluZSBfSVN3Yml0KGJpdCkJKDEgPDwgKGJpdCkpCisjICBlbHNlIC8qIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4gKi8KKyMgICBkZWZpbmUgX0lTd2JpdChiaXQpCVwKKwkoKGJpdCkgPCA4ID8gKGludCkgKCgxVUwgPDwgKGJpdCkpIDw8IDI0KQkJCSAgICAgIFwKKwkgOiAoKGJpdCkgPCAxNiA/IChpbnQpICgoMVVMIDw8IChiaXQpKSA8PCA4KQkJCSAgICAgIFwKKwkgICAgOiAoKGJpdCkgPCAyNCA/IChpbnQpICgoMVVMIDw8IChiaXQpKSA+PiA4KQkJCSAgICAgIFwKKwkgICAgICAgOiAoaW50KSAoKDFVTCA8PCAoYml0KSkgPj4gMjQpKSkpCisjICBlbmRpZgorCitlbnVtCit7CisgIF9fSVN3dXBwZXIgPSAwLAkJCS8qIFVQUEVSQ0FTRS4gICovCisgIF9fSVN3bG93ZXIgPSAxLAkJCS8qIGxvd2VyY2FzZS4gICovCisgIF9fSVN3YWxwaGEgPSAyLAkJCS8qIEFscGhhYmV0aWMuICAqLworICBfX0lTd2RpZ2l0ID0gMywJCQkvKiBOdW1lcmljLiAgKi8KKyAgX19JU3d4ZGlnaXQgPSA0LAkJCS8qIEhleGFkZWNpbWFsIG51bWVyaWMuICAqLworICBfX0lTd3NwYWNlID0gNSwJCQkvKiBXaGl0ZXNwYWNlLiAgKi8KKyAgX19JU3dwcmludCA9IDYsCQkJLyogUHJpbnRpbmcuICAqLworICBfX0lTd2dyYXBoID0gNywJCQkvKiBHcmFwaGljYWwuICAqLworICBfX0lTd2JsYW5rID0gOCwJCQkvKiBCbGFuayAodXN1YWxseSBTUEMgYW5kIFRBQikuICAqLworICBfX0lTd2NudHJsID0gOSwJCQkvKiBDb250cm9sIGNoYXJhY3Rlci4gICovCisgIF9fSVN3cHVuY3QgPSAxMCwJCQkvKiBQdW5jdHVhdGlvbi4gICovCisgIF9fSVN3YWxudW0gPSAxMSwJCQkvKiBBbHBoYW51bWVyaWMuICAqLworCisgIF9JU3d1cHBlciA9IF9JU3diaXQgKF9fSVN3dXBwZXIpLAkvKiBVUFBFUkNBU0UuICAqLworICBfSVN3bG93ZXIgPSBfSVN3Yml0IChfX0lTd2xvd2VyKSwJLyogbG93ZXJjYXNlLiAgKi8KKyAgX0lTd2FscGhhID0gX0lTd2JpdCAoX19JU3dhbHBoYSksCS8qIEFscGhhYmV0aWMuICAqLworICBfSVN3ZGlnaXQgPSBfSVN3Yml0IChfX0lTd2RpZ2l0KSwJLyogTnVtZXJpYy4gICovCisgIF9JU3d4ZGlnaXQgPSBfSVN3Yml0IChfX0lTd3hkaWdpdCksCS8qIEhleGFkZWNpbWFsIG51bWVyaWMuICAqLworICBfSVN3c3BhY2UgPSBfSVN3Yml0IChfX0lTd3NwYWNlKSwJLyogV2hpdGVzcGFjZS4gICovCisgIF9JU3dwcmludCA9IF9JU3diaXQgKF9fSVN3cHJpbnQpLAkvKiBQcmludGluZy4gICovCisgIF9JU3dncmFwaCA9IF9JU3diaXQgKF9fSVN3Z3JhcGgpLAkvKiBHcmFwaGljYWwuICAqLworICBfSVN3YmxhbmsgPSBfSVN3Yml0IChfX0lTd2JsYW5rKSwJLyogQmxhbmsgKHVzdWFsbHkgU1BDIGFuZCBUQUIpLiAgKi8KKyAgX0lTd2NudHJsID0gX0lTd2JpdCAoX19JU3djbnRybCksCS8qIENvbnRyb2wgY2hhcmFjdGVyLiAgKi8KKyAgX0lTd3B1bmN0ID0gX0lTd2JpdCAoX19JU3dwdW5jdCksCS8qIFB1bmN0dWF0aW9uLiAgKi8KKyAgX0lTd2FsbnVtID0gX0lTd2JpdCAoX19JU3dhbG51bSkJLyogQWxwaGFudW1lcmljLiAgKi8KK307CisjIGVuZGlmIC8qIE5vdCBfSVN3Yml0ICAqLworCisKK19fQkVHSU5fREVDTFMKKworX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKgorICogV2lkZS1jaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24gZnVuY3Rpb25zOiA3LjE1LjIuMS4KKyAqLworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgZm9yIHdoaWNoIGBpc3dhbHBoYScgb3IgYGlzd2RpZ2l0JyBpcworICAgdHJ1ZS4gICovCitleHRlcm4gaW50IGlzd2FsbnVtICh3aW50X3QgX193YykgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIGZvciB3aGljaCBgaXN3dXBwZXInIG9yICdpc3dsb3dlcicgaXMKKyAgIHRydWUsIG9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGlzIG9uZSBvZiBhIGxvY2FsZS1zcGVjaWZpYyBzZXQgb2YKKyAgIHdpZGUtY2hhcmFjdGVycyBmb3Igd2hpY2ggbm9uZSBvZiBgaXN3Y250cmwnLCBgaXN3ZGlnaXQnLAorICAgYGlzd3B1bmN0Jywgb3IgYGlzd3NwYWNlJyBpcyB0cnVlLiAgKi8KK2V4dGVybiBpbnQgaXN3YWxwaGEgKHdpbnRfdCBfX3djKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgY29udHJvbCB3aWRlIGNoYXJhY3Rlci4gICovCitleHRlcm4gaW50IGlzd2NudHJsICh3aW50X3QgX193YykgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBkZWNpbWFsLWRpZ2l0CisgICBjaGFyYWN0ZXIuICAqLworZXh0ZXJuIGludCBpc3dkaWdpdCAod2ludF90IF9fd2MpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciBmb3Igd2hpY2ggYGlzd3ByaW50JyBpcyB0cnVlIGFuZAorICAgYGlzd3NwYWNlJyBpcyBmYWxzZS4gICovCitleHRlcm4gaW50IGlzd2dyYXBoICh3aW50X3QgX193YykgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBsb3dlcmNhc2UgbGV0dGVyCisgICBvciBpcyBvbmUgb2YgYSBsb2NhbGUtc3BlY2lmaWMgc2V0IG9mIHdpZGUgY2hhcmFjdGVycyBmb3Igd2hpY2gKKyAgIG5vbmUgb2YgYGlzd2NudHJsJywgYGlzd2RpZ2l0JywgYGlzd3B1bmN0Jywgb3IgYGlzd3NwYWNlJyBpcyB0cnVlLiAgKi8KK2V4dGVybiBpbnQgaXN3bG93ZXIgKHdpbnRfdCBfX3djKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgcHJpbnRpbmcgd2lkZSBjaGFyYWN0ZXIuICAqLworZXh0ZXJuIGludCBpc3dwcmludCAod2ludF90IF9fd2MpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSBwcmludGluZyB3aWRlIGNoYXJhY3RlciB0aGF0IGlzIG9uZSBvZiBhCisgICBsb2NhbGUtc3BlY2lmaWMgZXQgb2Ygd2lkZSBjaGFyYWN0ZXJzIGZvciB3aGljaCBuZWl0aGVyIGBpc3dzcGFjZScKKyAgIG5vciBgaXN3YWxudW0nIGlzIHRydWUuICAqLworZXh0ZXJuIGludCBpc3dwdW5jdCAod2ludF90IF9fd2MpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgbG9jYWxlLXNwZWNpZmljCisgICBzZXQgb2Ygd2lkZSBjaGFyYWN0ZXJzIGZvciB3aGljaCBub25lIG9mIGBpc3dhbG51bScsIGBpc3dncmFwaCcsIG9yCisgICBgaXN3cHVuY3QnIGlzIHRydWUuICAqLworZXh0ZXJuIGludCBpc3dzcGFjZSAod2ludF90IF9fd2MpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGFuIHVwcGVyY2FzZSBsZXR0ZXIKKyAgIG9yIGlzIG9uZSBvZiBhIGxvY2FsZS1zcGVjaWZpYyBzZXQgb2Ygd2lkZSBjaGFyYWN0ZXIgZm9yIHdoaWNoIG5vbmUKKyAgIG9mIGBpc3djbnRybCcsIGBpc3dkaWdpdCcsIGBpc3dwdW5jdCcsIG9yIGBpc3dzcGFjZScgaXMgdHJ1ZS4gICovCitleHRlcm4gaW50IGlzd3VwcGVyICh3aW50X3QgX193YykgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBoZXhhZGVjaW1hbC1kaWdpdAorICAgY2hhcmFjdGVyIGVxdWl2YWxlbnQgdG8gdGhhdCBwZXJmb3JtZWQgYmUgdGhlIGZ1bmN0aW9ucyBkZXNjcmliZWQKKyAgIGluIHRoZSBwcmV2aW91cyBzdWJjbGF1c2UuICAqLworZXh0ZXJuIGludCBpc3d4ZGlnaXQgKHdpbnRfdCBfX3djKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhIHN0YW5kYXJkIGJsYW5rCisgICB3aWRlIGNoYXJhY3RlciBvciBhIGxvY2FsZS1zcGVjaWZpYyBzZXQgb2Ygd2lkZSBjaGFyYWN0ZXJzIGZvcgorICAgd2hpY2ggYGlzd2FsbnVtJyBpcyBmYWxzZS4gICovCisjIGlmZGVmIF9fVVNFX0lTT0M5OQorZXh0ZXJuIGludCBpc3dibGFuayAod2ludF90IF9fd2MpIF9fVEhST1c7CisjIGVuZGlmCisKKy8qCisgKiBFeHRlbnNpYmxlIHdpZGUtY2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9uIGZ1bmN0aW9uczogNy4xNS4yLjIuCisgKi8KKworLyogQ29uc3RydWN0IHZhbHVlIHRoYXQgZGVzY3JpYmVzIGEgY2xhc3Mgb2Ygd2lkZSBjaGFyYWN0ZXJzIGlkZW50aWZpZWQKKyAgIGJ5IHRoZSBzdHJpbmcgYXJndW1lbnQgUFJPUEVSVFkuICAqLworZXh0ZXJuIHdjdHlwZV90IHdjdHlwZSAoX19jb25zdCBjaGFyICpfX3Byb3BlcnR5KSBfX1RIUk9XOworCisvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgd2lkZS1jaGFyYWN0ZXIgV0MgaGFzIHRoZSBwcm9wZXJ0eSBkZXNjcmliZWQgYnkKKyAgIERFU0MuICAqLworZXh0ZXJuIGludCBpc3djdHlwZSAod2ludF90IF9fd2MsIHdjdHlwZV90IF9fZGVzYykgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9DOTkKKworCisvKgorICogV2lkZS1jaGFyYWN0ZXIgY2FzZS1tYXBwaW5nIGZ1bmN0aW9uczogNy4xNS4zLjEuCisgKi8KKworX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBTY2FsYXIgdHlwZSB0aGF0IGNhbiBob2xkIHZhbHVlcyB3aGljaCByZXByZXNlbnQgbG9jYWxlLXNwZWNpZmljCisgICBjaGFyYWN0ZXIgbWFwcGluZ3MuICAqLwordHlwZWRlZiBfX2NvbnN0IF9faW50MzJfdCAqd2N0cmFuc190OworX19FTkRfTkFNRVNQQUNFX0M5OQorI2lmZGVmIF9fVVNFX0dOVQorX19VU0lOR19OQU1FU1BBQ0VfQzk5KHdjdHJhbnNfdCkKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIENvbnZlcnRzIGFuIHVwcGVyY2FzZSBsZXR0ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbG93ZXJjYXNlIGxldHRlci4gICovCitleHRlcm4gd2ludF90IHRvd2xvd2VyICh3aW50X3QgX193YykgX19USFJPVzsKKworLyogQ29udmVydHMgYW4gbG93ZXJjYXNlIGxldHRlciB0byB0aGUgY29ycmVzcG9uZGluZyB1cHBlcmNhc2UgbGV0dGVyLiAgKi8KK2V4dGVybiB3aW50X3QgdG93dXBwZXIgKHdpbnRfdCBfX3djKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX0M5OQorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogbmVlZCBpc3d4eHguICAqLworCisKKy8qIFRoZSByZW1haW5pbmcgZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBtdXN0IG5vdCBhcHBlYXIgaW4gdGhlCisgICA8d2NoYXIuaD4gaGVhZGVyLiAgKi8KKyNpZmRlZiBfV0NUWVBFX0gKKworLyoKKyAqIEV4dGVuc2libGUgd2lkZS1jaGFyYWN0ZXIgbWFwcGluZyBmdW5jdGlvbnM6IDcuMTUuMy4yLgorICovCisKK19fQkVHSU5fREVDTFMKKworX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBDb25zdHJ1Y3QgdmFsdWUgdGhhdCBkZXNjcmliZXMgYSBtYXBwaW5nIGJldHdlZW4gd2lkZSBjaGFyYWN0ZXJzCisgICBpZGVudGlmaWVkIGJ5IHRoZSBzdHJpbmcgYXJndW1lbnQgUFJPUEVSVFkuICAqLworZXh0ZXJuIHdjdHJhbnNfdCB3Y3RyYW5zIChfX2NvbnN0IGNoYXIgKl9fcHJvcGVydHkpIF9fVEhST1c7CisKKy8qIE1hcCB0aGUgd2lkZSBjaGFyYWN0ZXIgV0MgdXNpbmcgdGhlIG1hcHBpbmcgZGVzY3JpYmVkIGJ5IERFU0MuICAqLworZXh0ZXJuIHdpbnRfdCB0b3djdHJhbnMgKHdpbnRfdCBfX3djLCB3Y3RyYW5zX3QgX19kZXNjKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX0M5OQorCisjIGlmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBEZWNsYXJlIHRoZSBpbnRlcmZhY2UgdG8gZXh0ZW5kZWQgbG9jYWxlIG1vZGVsLiAgKi8KKyMgIGluY2x1ZGUgPHhsb2NhbGUuaD4KKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIGZvciB3aGljaCBgaXN3YWxwaGEnIG9yIGBpc3dkaWdpdCcgaXMKKyAgIHRydWUuICAqLworZXh0ZXJuIGludCBpc3dhbG51bV9sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIGZvciB3aGljaCBgaXN3dXBwZXInIG9yICdpc3dsb3dlcicgaXMKKyAgIHRydWUsIG9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGlzIG9uZSBvZiBhIGxvY2FsZS1zcGVjaWZpYyBzZXQgb2YKKyAgIHdpZGUtY2hhcmFjdGVycyBmb3Igd2hpY2ggbm9uZSBvZiBgaXN3Y250cmwnLCBgaXN3ZGlnaXQnLAorICAgYGlzd3B1bmN0Jywgb3IgYGlzd3NwYWNlJyBpcyB0cnVlLiAgKi8KK2V4dGVybiBpbnQgaXN3YWxwaGFfbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSBjb250cm9sIHdpZGUgY2hhcmFjdGVyLiAgKi8KK2V4dGVybiBpbnQgaXN3Y250cmxfbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZGVjaW1hbC1kaWdpdAorICAgY2hhcmFjdGVyLiAgKi8KK2V4dGVybiBpbnQgaXN3ZGlnaXRfbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciBmb3Igd2hpY2ggYGlzd3ByaW50JyBpcyB0cnVlIGFuZAorICAgYGlzd3NwYWNlJyBpcyBmYWxzZS4gICovCitleHRlcm4gaW50IGlzd2dyYXBoX2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhIGxvd2VyY2FzZSBsZXR0ZXIKKyAgIG9yIGlzIG9uZSBvZiBhIGxvY2FsZS1zcGVjaWZpYyBzZXQgb2Ygd2lkZSBjaGFyYWN0ZXJzIGZvciB3aGljaAorICAgbm9uZSBvZiBgaXN3Y250cmwnLCBgaXN3ZGlnaXQnLCBgaXN3cHVuY3QnLCBvciBgaXN3c3BhY2UnIGlzIHRydWUuICAqLworZXh0ZXJuIGludCBpc3dsb3dlcl9sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHByaW50aW5nIHdpZGUgY2hhcmFjdGVyLiAgKi8KK2V4dGVybiBpbnQgaXN3cHJpbnRfbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSBwcmludGluZyB3aWRlIGNoYXJhY3RlciB0aGF0IGlzIG9uZSBvZiBhCisgICBsb2NhbGUtc3BlY2lmaWMgZXQgb2Ygd2lkZSBjaGFyYWN0ZXJzIGZvciB3aGljaCBuZWl0aGVyIGBpc3dzcGFjZScKKyAgIG5vciBgaXN3YWxudW0nIGlzIHRydWUuICAqLworZXh0ZXJuIGludCBpc3dwdW5jdF9sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBsb2NhbGUtc3BlY2lmaWMKKyAgIHNldCBvZiB3aWRlIGNoYXJhY3RlcnMgZm9yIHdoaWNoIG5vbmUgb2YgYGlzd2FsbnVtJywgYGlzd2dyYXBoJywgb3IKKyAgIGBpc3dwdW5jdCcgaXMgdHJ1ZS4gICovCitleHRlcm4gaW50IGlzd3NwYWNlX2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhbiB1cHBlcmNhc2UgbGV0dGVyCisgICBvciBpcyBvbmUgb2YgYSBsb2NhbGUtc3BlY2lmaWMgc2V0IG9mIHdpZGUgY2hhcmFjdGVyIGZvciB3aGljaCBub25lCisgICBvZiBgaXN3Y250cmwnLCBgaXN3ZGlnaXQnLCBgaXN3cHVuY3QnLCBvciBgaXN3c3BhY2UnIGlzIHRydWUuICAqLworZXh0ZXJuIGludCBpc3d1cHBlcl9sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBoZXhhZGVjaW1hbC1kaWdpdAorICAgY2hhcmFjdGVyIGVxdWl2YWxlbnQgdG8gdGhhdCBwZXJmb3JtZWQgYmUgdGhlIGZ1bmN0aW9ucyBkZXNjcmliZWQKKyAgIGluIHRoZSBwcmV2aW91cyBzdWJjbGF1c2UuICAqLworZXh0ZXJuIGludCBpc3d4ZGlnaXRfbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc3RhbmRhcmQgYmxhbmsKKyAgIHdpZGUgY2hhcmFjdGVyIG9yIGEgbG9jYWxlLXNwZWNpZmljIHNldCBvZiB3aWRlIGNoYXJhY3RlcnMgZm9yCisgICB3aGljaCBgaXN3YWxudW0nIGlzIGZhbHNlLiAgKi8KK2V4dGVybiBpbnQgaXN3YmxhbmtfbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIENvbnN0cnVjdCB2YWx1ZSB0aGF0IGRlc2NyaWJlcyBhIGNsYXNzIG9mIHdpZGUgY2hhcmFjdGVycyBpZGVudGlmaWVkCisgICBieSB0aGUgc3RyaW5nIGFyZ3VtZW50IFBST1BFUlRZLiAgKi8KK2V4dGVybiB3Y3R5cGVfdCB3Y3R5cGVfbCAoX19jb25zdCBjaGFyICpfX3Byb3BlcnR5LCBfX2xvY2FsZV90IF9fbG9jYWxlKQorICAgICBfX1RIUk9XOworCisvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgd2lkZS1jaGFyYWN0ZXIgV0MgaGFzIHRoZSBwcm9wZXJ0eSBkZXNjcmliZWQgYnkKKyAgIERFU0MuICAqLworZXh0ZXJuIGludCBpc3djdHlwZV9sICh3aW50X3QgX193Yywgd2N0eXBlX3QgX19kZXNjLCBfX2xvY2FsZV90IF9fbG9jYWxlKQorICAgICBfX1RIUk9XOworCisKKy8qCisgKiBXaWRlLWNoYXJhY3RlciBjYXNlLW1hcHBpbmcgZnVuY3Rpb25zLgorICovCisKKy8qIENvbnZlcnRzIGFuIHVwcGVyY2FzZSBsZXR0ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbG93ZXJjYXNlIGxldHRlci4gICovCitleHRlcm4gd2ludF90IHRvd2xvd2VyX2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBDb252ZXJ0cyBhbiBsb3dlcmNhc2UgbGV0dGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIHVwcGVyY2FzZSBsZXR0ZXIuICAqLworZXh0ZXJuIHdpbnRfdCB0b3d1cHBlcl9sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogQ29uc3RydWN0IHZhbHVlIHRoYXQgZGVzY3JpYmVzIGEgbWFwcGluZyBiZXR3ZWVuIHdpZGUgY2hhcmFjdGVycworICAgaWRlbnRpZmllZCBieSB0aGUgc3RyaW5nIGFyZ3VtZW50IFBST1BFUlRZLiAgKi8KK2V4dGVybiB3Y3RyYW5zX3Qgd2N0cmFuc19sIChfX2NvbnN0IGNoYXIgKl9fcHJvcGVydHksIF9fbG9jYWxlX3QgX19sb2NhbGUpCisgICAgIF9fVEhST1c7CisKKy8qIE1hcCB0aGUgd2lkZSBjaGFyYWN0ZXIgV0MgdXNpbmcgdGhlIG1hcHBpbmcgZGVzY3JpYmVkIGJ5IERFU0MuICAqLworZXh0ZXJuIHdpbnRfdCB0b3djdHJhbnNfbCAod2ludF90IF9fd2MsIHdjdHJhbnNfdCBfX2Rlc2MsCisJCQkgICBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisjIGVuZGlmIC8qIFVzZSBQT1NJWCAyMDA4LiAgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIF9fV0NUWVBFX0ggZGVmaW5lZC4gICovCisKKyNlbmRpZiAvKiB3Y3R5cGUuaCAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvd29yZGV4cC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS93b3JkZXhwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0MGU2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvd29yZGV4cC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDE5OTYtMTk5OSwgMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfV09SREVYUF9ICisjZGVmaW5lCV9XT1JERVhQX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIEJpdHMgc2V0IGluIHRoZSBGTEFHUyBhcmd1bWVudCB0byBgd29yZGV4cCcuICAqLworZW51bQorICB7CisgICAgV1JERV9ET09GRlMgPSAoMSA8PCAwKSwJLyogSW5zZXJ0IFBXT1JERVhQLT53ZV9vZmZzIE5VTExzLiAgKi8KKyAgICBXUkRFX0FQUEVORCA9ICgxIDw8IDEpLAkvKiBBcHBlbmQgdG8gcmVzdWx0cyBvZiBhIHByZXZpb3VzIGNhbGwuICAqLworICAgIFdSREVfTk9DTUQgPSAoMSA8PCAyKSwJLyogRG9uJ3QgZG8gY29tbWFuZCBzdWJzdGl0dXRpb24uICAqLworICAgIFdSREVfUkVVU0UgPSAoMSA8PCAzKSwJLyogUmV1c2Ugc3RvcmFnZSBpbiBQV09SREVYUC4gICovCisgICAgV1JERV9TSE9XRVJSID0gKDEgPDwgNCksCS8qIERvbid0IHJlZGlyZWN0IHN0ZGVyciB0byAvZGV2L251bGwuICAqLworICAgIFdSREVfVU5ERUYgPSAoMSA8PCA1KSwJLyogRXJyb3IgZm9yIGV4cGFuZGluZyB1bmRlZmluZWQgdmFyaWFibGVzLiAgKi8KKyAgICBfX1dSREVfRkxBR1MgPSAoV1JERV9ET09GRlMgfCBXUkRFX0FQUEVORCB8IFdSREVfTk9DTUQgfAorCQkgICAgV1JERV9SRVVTRSB8IFdSREVfU0hPV0VSUiB8IFdSREVfVU5ERUYpCisgIH07CisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGEgd29yZC1leHBhbnNpb24gcnVuLiAgKi8KK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBzaXplX3Qgd2Vfd29yZGM7CQkvKiBDb3VudCBvZiB3b3JkcyBtYXRjaGVkLiAgKi8KKyAgICBjaGFyICoqd2Vfd29yZHY7CQkvKiBMaXN0IG9mIGV4cGFuZGVkIHdvcmRzLiAgKi8KKyAgICBzaXplX3Qgd2Vfb2ZmczsJCS8qIFNsb3RzIHRvIHJlc2VydmUgaW4gYHdlX3dvcmR2Jy4gICovCisgIH0gd29yZGV4cF90OworCisvKiBQb3NzaWJsZSBub256ZXJvIHJldHVybiB2YWx1ZXMgZnJvbSBgd29yZGV4cCcuICAqLworZW51bQorICB7CisjaWZkZWYgX19VU0VfWE9QRU4KKyAgICBXUkRFX05PU1lTID0gLTEsCQkvKiBOZXZlciB1c2VkIHNpbmNlIHdlIHN1cHBvcnQgYHdvcmRleHAnLiAgKi8KKyNlbmRpZgorICAgIFdSREVfTk9TUEFDRSA9IDEsCQkvKiBSYW4gb3V0IG9mIG1lbW9yeS4gICovCisgICAgV1JERV9CQURDSEFSLAkJLyogQSBtZXRhY2hhciBhcHBlYXJzIGluIHRoZSB3cm9uZyBwbGFjZS4gICovCisgICAgV1JERV9CQURWQUwsCQkvKiBVbmRlZmluZWQgdmFyIHJlZmVyZW5jZSB3aXRoIFdSREVfVU5ERUYuICAqLworICAgIFdSREVfQ01EU1VCLAkJLyogQ29tbWFuZCBzdWJzdGl0dXRpb24gd2l0aCBXUkRFX05PQ01ELiAgKi8KKyAgICBXUkRFX1NZTlRBWAkJCS8qIFNoZWxsIHN5bnRheCBlcnJvci4gICovCisgIH07CisKKy8qIERvIHdvcmQgZXhwYW5zaW9uIG9mIFdPUkRTIGludG8gUFdPUkRFWFAuICAqLworZXh0ZXJuIGludCB3b3JkZXhwIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX193b3JkcywKKwkJICAgIHdvcmRleHBfdCAqX19yZXN0cmljdCBfX3B3b3JkZXhwLCBpbnQgX19mbGFncyk7CisKKy8qIEZyZWUgdGhlIHN0b3JhZ2UgYWxsb2NhdGVkIGJ5IGEgYHdvcmRleHAnIGNhbGwuICAqLworZXh0ZXJuIHZvaWQgd29yZGZyZWUgKHdvcmRleHBfdCAqX193b3JkZXhwKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogd29yZGV4cC5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9hLm91dC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9hLm91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ODRmOTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2Eub3V0LmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9BX09VVF9ICisjZGVmaW5lIF9BU01fWDg2X0FfT1VUX0gKKworc3RydWN0IGV4ZWMKK3sKKwl1bnNpZ25lZCBpbnQgYV9pbmZvOwkvKiBVc2UgbWFjcm9zIE5fTUFHSUMsIGV0YyBmb3IgYWNjZXNzICovCisJdW5zaWduZWQgYV90ZXh0OwkvKiBsZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBhX2RhdGE7CS8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGFfYnNzOwkJLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGZvciBmaWxlLCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGFfc3ltczsJLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUsIGluIGJ5dGVzICovCisJdW5zaWduZWQgYV9lbnRyeTsJLyogc3RhcnQgYWRkcmVzcyAqLworCXVuc2lnbmVkIGFfdHJzaXplOwkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGFfZHJzaXplOwkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLworfTsKKworI2RlZmluZSBOX1RSU0laRShhKQkoKGEpLmFfdHJzaXplKQorI2RlZmluZSBOX0RSU0laRShhKQkoKGEpLmFfZHJzaXplKQorI2RlZmluZSBOX1NZTVNJWkUoYSkJKChhKS5hX3N5bXMpCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9BX09VVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2F1eHZlYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzE2YjRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9hdXh2ZWMuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fWDg2X0FVWFZFQ19ICisjZGVmaW5lIF9BU01fWDg2X0FVWFZFQ19ICisvKgorICogQXJjaGl0ZWN0dXJlLW5ldXRyYWwgQVRfIHZhbHVlcyBpbiAwLTE3LCBsZWF2ZSBzb21lIHJvb20KKyAqIGZvciBtb3JlIG9mIHRoZW0sIHN0YXJ0IHRoZSB4ODYtc3BlY2lmaWMgb25lcyBhdCAzMi4KKyAqLworI2lmZGVmIF9faTM4Nl9fCisjZGVmaW5lIEFUX1NZU0lORk8JCTMyCisjZW5kaWYKKyNkZWZpbmUgQVRfU1lTSU5GT19FSERSCQkzMworCisjZW5kaWYgLyogX0FTTV9YODZfQVVYVkVDX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYml0c3BlcmxvbmcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYml0c3BlcmxvbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGFlMWM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9iaXRzcGVybG9uZy5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX19BU01fWDg2X0JJVFNQRVJMT05HX0gKKyNkZWZpbmUgX19BU01fWDg2X0JJVFNQRVJMT05HX0gKKworI2lmZGVmIF9feDg2XzY0X18KKyMgZGVmaW5lIF9fQklUU19QRVJfTE9ORyA2NAorI2Vsc2UKKyMgZGVmaW5lIF9fQklUU19QRVJfTE9ORyAzMgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRzcGVybG9uZy5oPgorCisjZW5kaWYgLyogX19BU01fWDg2X0JJVFNQRVJMT05HX0ggKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9ib290LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2Jvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjIwMGFjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9ib290LmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9CT09UX0gKKyNkZWZpbmUgX0FTTV9YODZfQk9PVF9ICisKKy8qIEludGVybmFsIHN2Z2Egc3RhcnR1cCBjb25zdGFudHMgKi8KKyNkZWZpbmUgTk9STUFMX1ZHQQkweGZmZmYJCS8qIDgweDI1IG1vZGUgKi8KKyNkZWZpbmUgRVhURU5ERURfVkdBCTB4ZmZmZQkJLyogODB4NTAgbW9kZSAqLworI2RlZmluZSBBU0tfVkdBCQkweGZmZmQJCS8qIGFzayBmb3IgaXQgYXQgYm9vdHVwICovCisKKworI2VuZGlmIC8qIF9BU01fWDg2X0JPT1RfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9ib290cGFyYW0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYm9vdHBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyMGQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYm9vdHBhcmFtLmgKQEAgLTAsMCArMSwxMzQgQEAKKyNpZm5kZWYgX0FTTV9YODZfQk9PVFBBUkFNX0gKKyNkZWZpbmUgX0FTTV9YODZfQk9PVFBBUkFNX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9hcG1fYmlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2VkZC5oPgorI2luY2x1ZGUgPGFzbS9lODIwLmg+CisjaW5jbHVkZSA8YXNtL2lzdC5oPgorI2luY2x1ZGUgPHZpZGVvL2VkaWQuaD4KKworLyogc2V0dXAgZGF0YSB0eXBlcyAqLworI2RlZmluZSBTRVRVUF9OT05FCQkJMAorI2RlZmluZSBTRVRVUF9FODIwX0VYVAkJCTEKKyNkZWZpbmUgU0VUVVBfRFRCCQkJMgorCisvKiBleHRlbnNpYmxlIHNldHVwIGRhdGEgbGlzdCBub2RlICovCitzdHJ1Y3Qgc2V0dXBfZGF0YSB7CisJX191NjQgbmV4dDsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGxlbjsKKwlfX3U4IGRhdGFbMF07Cit9OworCitzdHJ1Y3Qgc2V0dXBfaGVhZGVyIHsKKwlfX3U4CXNldHVwX3NlY3RzOworCV9fdTE2CXJvb3RfZmxhZ3M7CisJX191MzIJc3lzc2l6ZTsKKwlfX3UxNglyYW1fc2l6ZTsKKyNkZWZpbmUgUkFNRElTS19JTUFHRV9TVEFSVF9NQVNLCTB4MDdGRgorI2RlZmluZSBSQU1ESVNLX1BST01QVF9GTEFHCQkweDgwMDAKKyNkZWZpbmUgUkFNRElTS19MT0FEX0ZMQUcJCTB4NDAwMAorCV9fdTE2CXZpZF9tb2RlOworCV9fdTE2CXJvb3RfZGV2OworCV9fdTE2CWJvb3RfZmxhZzsKKwlfX3UxNglqdW1wOworCV9fdTMyCWhlYWRlcjsKKwlfX3UxNgl2ZXJzaW9uOworCV9fdTMyCXJlYWxtb2RlX3N3dGNoOworCV9fdTE2CXN0YXJ0X3N5czsKKwlfX3UxNglrZXJuZWxfdmVyc2lvbjsKKwlfX3U4CXR5cGVfb2ZfbG9hZGVyOworCV9fdTgJbG9hZGZsYWdzOworI2RlZmluZSBMT0FERURfSElHSAkoMTw8MCkKKyNkZWZpbmUgUVVJRVRfRkxBRwkoMTw8NSkKKyNkZWZpbmUgS0VFUF9TRUdNRU5UUwkoMTw8NikKKyNkZWZpbmUgQ0FOX1VTRV9IRUFQCSgxPDw3KQorCV9fdTE2CXNldHVwX21vdmVfc2l6ZTsKKwlfX3UzMgljb2RlMzJfc3RhcnQ7CisJX191MzIJcmFtZGlza19pbWFnZTsKKwlfX3UzMglyYW1kaXNrX3NpemU7CisJX191MzIJYm9vdHNlY3Rfa2x1ZGdlOworCV9fdTE2CWhlYXBfZW5kX3B0cjsKKwlfX3U4CWV4dF9sb2FkZXJfdmVyOworCV9fdTgJZXh0X2xvYWRlcl90eXBlOworCV9fdTMyCWNtZF9saW5lX3B0cjsKKwlfX3UzMglpbml0cmRfYWRkcl9tYXg7CisJX191MzIJa2VybmVsX2FsaWdubWVudDsKKwlfX3U4CXJlbG9jYXRhYmxlX2tlcm5lbDsKKwlfX3U4CV9wYWQyWzNdOworCV9fdTMyCWNtZGxpbmVfc2l6ZTsKKwlfX3UzMgloYXJkd2FyZV9zdWJhcmNoOworCV9fdTY0CWhhcmR3YXJlX3N1YmFyY2hfZGF0YTsKKwlfX3UzMglwYXlsb2FkX29mZnNldDsKKwlfX3UzMglwYXlsb2FkX2xlbmd0aDsKKwlfX3U2NAlzZXR1cF9kYXRhOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHN5c19kZXNjX3RhYmxlIHsKKwlfX3UxNiBsZW5ndGg7CisJX191OCAgdGFibGVbMTRdOworfTsKKworLyogR2xlYW5lZCBmcm9tIE9GVydzIHNldC1wYXJhbWV0ZXJzIGluIGNwdS94ODYvcGMvbGludXguZnRoICovCitzdHJ1Y3Qgb2xwY19vZndfaGVhZGVyIHsKKwlfX3UzMiBvZndfbWFnaWM7CS8qIE9GVyBzaWduYXR1cmUgKi8KKwlfX3UzMiBvZndfdmVyc2lvbjsKKwlfX3UzMiBjaWZfaGFuZGxlcjsJLyogY2FsbGJhY2sgaW50byBPRlcgKi8KKwlfX3UzMiBpcnFfZGVzY190YWJsZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBlZmlfaW5mbyB7CisJX191MzIgZWZpX2xvYWRlcl9zaWduYXR1cmU7CisJX191MzIgZWZpX3N5c3RhYjsKKwlfX3UzMiBlZmlfbWVtZGVzY19zaXplOworCV9fdTMyIGVmaV9tZW1kZXNjX3ZlcnNpb247CisJX191MzIgZWZpX21lbW1hcDsKKwlfX3UzMiBlZmlfbWVtbWFwX3NpemU7CisJX191MzIgZWZpX3N5c3RhYl9oaTsKKwlfX3UzMiBlZmlfbWVtbWFwX2hpOworfTsKKworLyogVGhlIHNvLWNhbGxlZCAiemVyb3BhZ2UiICovCitzdHJ1Y3QgYm9vdF9wYXJhbXMgeworCXN0cnVjdCBzY3JlZW5faW5mbyBzY3JlZW5faW5mbzsJCQkvKiAweDAwMCAqLworCXN0cnVjdCBhcG1fYmlvc19pbmZvIGFwbV9iaW9zX2luZm87CQkvKiAweDA0MCAqLworCV9fdTggIF9wYWQyWzRdOwkJCQkJLyogMHgwNTQgKi8KKwlfX3U2NCAgdGJvb3RfYWRkcjsJCQkJLyogMHgwNTggKi8KKwlzdHJ1Y3QgaXN0X2luZm8gaXN0X2luZm87CQkJLyogMHgwNjAgKi8KKwlfX3U4ICBfcGFkM1sxNl07CQkJCS8qIDB4MDcwICovCisJX191OCAgaGQwX2luZm9bMTZdOwkvKiBvYnNvbGV0ZSEgKi8JCS8qIDB4MDgwICovCisJX191OCAgaGQxX2luZm9bMTZdOwkvKiBvYnNvbGV0ZSEgKi8JCS8qIDB4MDkwICovCisJc3RydWN0IHN5c19kZXNjX3RhYmxlIHN5c19kZXNjX3RhYmxlOwkJLyogMHgwYTAgKi8KKwlzdHJ1Y3Qgb2xwY19vZndfaGVhZGVyIG9scGNfb2Z3X2hlYWRlcjsJCS8qIDB4MGIwICovCisJX191OCAgX3BhZDRbMTI4XTsJCQkJLyogMHgwYzAgKi8KKwlzdHJ1Y3QgZWRpZF9pbmZvIGVkaWRfaW5mbzsJCQkvKiAweDE0MCAqLworCXN0cnVjdCBlZmlfaW5mbyBlZmlfaW5mbzsJCQkvKiAweDFjMCAqLworCV9fdTMyIGFsdF9tZW1fazsJCQkJLyogMHgxZTAgKi8KKwlfX3UzMiBzY3JhdGNoOwkJLyogU2NyYXRjaCBmaWVsZCEgKi8JLyogMHgxZTQgKi8KKwlfX3U4ICBlODIwX2VudHJpZXM7CQkJCS8qIDB4MWU4ICovCisJX191OCAgZWRkYnVmX2VudHJpZXM7CQkJCS8qIDB4MWU5ICovCisJX191OCAgZWRkX21icl9zaWdfYnVmX2VudHJpZXM7CQkJLyogMHgxZWEgKi8KKwlfX3U4ICBfcGFkNls2XTsJCQkJCS8qIDB4MWViICovCisJc3RydWN0IHNldHVwX2hlYWRlciBoZHI7ICAgIC8qIHNldHVwIGhlYWRlciAqLwkvKiAweDFmMSAqLworCV9fdTggIF9wYWQ3WzB4MjkwLTB4MWYxLXNpemVvZihzdHJ1Y3Qgc2V0dXBfaGVhZGVyKV07CisJX191MzIgZWRkX21icl9zaWdfYnVmZmVyW0VERF9NQlJfU0lHX01BWF07CS8qIDB4MjkwICovCisJc3RydWN0IGU4MjBlbnRyeSBlODIwX21hcFtFODIwTUFYXTsJCS8qIDB4MmQwICovCisJX191OCAgX3BhZDhbNDhdOwkJCQkvKiAweGNkMCAqLworCXN0cnVjdCBlZGRfaW5mbyBlZGRidWZbRURETUFYTlJdOwkJLyogMHhkMDAgKi8KKwlfX3U4ICBfcGFkOVsyNzZdOwkJCQkvKiAweGVlYyAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZW51bSB7CisJWDg2X1NVQkFSQ0hfUEMgPSAwLAorCVg4Nl9TVUJBUkNIX0xHVUVTVCwKKwlYODZfU1VCQVJDSF9YRU4sCisJWDg2X1NVQkFSQ0hfTVJTVCwKKwlYODZfU1VCQVJDSF9DRTQxMDAsCisJWDg2X05SX1NVQkFSQ0hTLAorfTsKKworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9CT09UUEFSQU1fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9ieXRlb3JkZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYnl0ZW9yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzYTdhOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYnl0ZW9yZGVyLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9BU01fWDg2X0JZVEVPUkRFUl9ICisjZGVmaW5lIF9BU01fWDg2X0JZVEVPUkRFUl9ICisKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgorCisjZW5kaWYgLyogX0FTTV9YODZfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vZGVidWdyZWcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vZGVidWdyZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q5YmQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9kZWJ1Z3JlZy5oCkBAIC0wLDAgKzEsODAgQEAKKyNpZm5kZWYgX0FTTV9YODZfREVCVUdSRUdfSAorI2RlZmluZSBfQVNNX1g4Nl9ERUJVR1JFR19ICisKKworLyogSW5kaWNhdGUgdGhlIHJlZ2lzdGVyIG51bWJlcnMgZm9yIGEgbnVtYmVyIG9mIHRoZSBzcGVjaWZpYworICAgZGVidWcgcmVnaXN0ZXJzLiAgUmVnaXN0ZXJzIDAtMyBjb250YWluIHRoZSBhZGRyZXNzZXMgd2Ugd2lzaCB0byB0cmFwIG9uICovCisjZGVmaW5lIERSX0ZJUlNUQUREUiAwICAgICAgICAvKiB1X2RlYnVncmVnW0RSX0ZJUlNUQUREUl0gKi8KKyNkZWZpbmUgRFJfTEFTVEFERFIgMyAgICAgICAgIC8qIHVfZGVidWdyZWdbRFJfTEFTVEFERFJdICAqLworCisjZGVmaW5lIERSX1NUQVRVUyA2ICAgICAgICAgICAvKiB1X2RlYnVncmVnW0RSX1NUQVRVU10gICAgICovCisjZGVmaW5lIERSX0NPTlRST0wgNyAgICAgICAgICAvKiB1X2RlYnVncmVnW0RSX0NPTlRST0xdICovCisKKy8qIERlZmluZSBhIGZldyB0aGluZ3MgZm9yIHRoZSBzdGF0dXMgcmVnaXN0ZXIuICBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lCisgICB3aGljaCBkZWJ1Z2dpbmcgcmVnaXN0ZXIgd2FzIHJlc3BvbnNpYmxlIGZvciB0aGUgdHJhcC4gIFRoZSBvdGhlciBiaXRzCisgICBhcmUgZWl0aGVyIHJlc2VydmVkIG9yIG5vdCBvZiBpbnRlcmVzdCB0byB1cy4gKi8KKworLyogRGVmaW5lIHJlc2VydmVkIGJpdHMgaW4gRFI2IHdoaWNoIGFyZSBhbHdheXMgc2V0IHRvIDEgKi8KKyNkZWZpbmUgRFI2X1JFU0VSVkVECSgweEZGRkYwRkYwKQorCisjZGVmaW5lIERSX1RSQVAwCSgweDEpCQkvKiBkYjAgKi8KKyNkZWZpbmUgRFJfVFJBUDEJKDB4MikJCS8qIGRiMSAqLworI2RlZmluZSBEUl9UUkFQMgkoMHg0KQkJLyogZGIyICovCisjZGVmaW5lIERSX1RSQVAzCSgweDgpCQkvKiBkYjMgKi8KKyNkZWZpbmUgRFJfVFJBUF9CSVRTCShEUl9UUkFQMHxEUl9UUkFQMXxEUl9UUkFQMnxEUl9UUkFQMykKKworI2RlZmluZSBEUl9TVEVQCQkoMHg0MDAwKQkvKiBzaW5nbGUtc3RlcCAqLworI2RlZmluZSBEUl9TV0lUQ0gJKDB4ODAwMCkJLyogdGFzayBzd2l0Y2ggKi8KKworLyogTm93IGRlZmluZSBhIGJ1bmNoIG9mIHRoaW5ncyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorICAgVGhlIHRvcCB0d28gYnl0ZXMgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgY29uc2lzdCBvZiA0IGZpZWxkcyBvZiA0CisgICBiaXRzIC0gZWFjaCBmaWVsZCBjb3JyZXNwb25kcyB0byBvbmUgb2YgdGhlIGZvdXIgZGVidWcgcmVnaXN0ZXJzLAorICAgYW5kIGluZGljYXRlcyB3aGF0IHR5cGVzIG9mIGFjY2VzcyB3ZSB0cmFwIG9uLCBhbmQgaG93IGxhcmdlIHRoZSBkYXRhCisgICBmaWVsZCBpcyB0aGF0IHdlIGFyZSBsb29raW5nIGF0ICovCisKKyNkZWZpbmUgRFJfQ09OVFJPTF9TSElGVCAxNiAvKiBTa2lwIHRoaXMgbWFueSBiaXRzIGluIGN0bCByZWdpc3RlciAqLworI2RlZmluZSBEUl9DT05UUk9MX1NJWkUgNCAgIC8qIDQgY29udHJvbCBiaXRzIHBlciByZWdpc3RlciAqLworCisjZGVmaW5lIERSX1JXX0VYRUNVVEUgKDB4MCkgICAvKiBTZXR0aW5ncyBmb3IgdGhlIGFjY2VzcyB0eXBlcyB0byB0cmFwIG9uICovCisjZGVmaW5lIERSX1JXX1dSSVRFICgweDEpCisjZGVmaW5lIERSX1JXX1JFQUQgKDB4MykKKworI2RlZmluZSBEUl9MRU5fMSAoMHgwKSAvKiBTZXR0aW5ncyBmb3IgZGF0YSBsZW5ndGggdG8gdHJhcCBvbiAqLworI2RlZmluZSBEUl9MRU5fMiAoMHg0KQorI2RlZmluZSBEUl9MRU5fNCAoMHhDKQorI2RlZmluZSBEUl9MRU5fOCAoMHg4KQorCisvKiBUaGUgbG93IGJ5dGUgdG8gdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZGV0ZXJtaW5lIHdoaWNoIHJlZ2lzdGVycyBhcmUKKyAgIGVuYWJsZWQuICBUaGVyZSBhcmUgNCBmaWVsZHMgb2YgdHdvIGJpdHMuICBPbmUgYml0IGlzICJsb2NhbCIsIG1lYW5pbmcKKyAgIHRoYXQgdGhlIHByb2Nlc3NvciB3aWxsIHJlc2V0IHRoZSBiaXQgYWZ0ZXIgYSB0YXNrIHN3aXRjaCBhbmQgdGhlIG90aGVyCisgICBpcyBnbG9iYWwgbWVhbmluZyB0aGF0IHdlIGhhdmUgdG8gZXhwbGljaXRseSByZXNldCB0aGUgYml0LiAgV2l0aCBsaW51eCwKKyAgIHlvdSBjYW4gdXNlIGVpdGhlciBvbmUsIHNpbmNlIHdlIGV4cGxpY2l0bHkgemVybyB0aGUgcmVnaXN0ZXIgd2hlbiB3ZSBlbnRlcgorICAga2VybmVsIG1vZGUuICovCisKKyNkZWZpbmUgRFJfTE9DQUxfRU5BQkxFX1NISUZUIDAgICAgLyogRXh0cmEgc2hpZnQgdG8gdGhlIGxvY2FsIGVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgRFJfR0xPQkFMX0VOQUJMRV9TSElGVCAxICAgLyogRXh0cmEgc2hpZnQgdG8gdGhlIGdsb2JhbCBlbmFibGUgYml0ICovCisjZGVmaW5lIERSX0xPQ0FMX0VOQUJMRSAoMHgxKSAgICAgIC8qIExvY2FsIGVuYWJsZSBmb3IgcmVnIDAgKi8KKyNkZWZpbmUgRFJfR0xPQkFMX0VOQUJMRSAoMHgyKSAgICAgLyogR2xvYmFsIGVuYWJsZSBmb3IgcmVnIDAgKi8KKyNkZWZpbmUgRFJfRU5BQkxFX1NJWkUgMiAgICAgICAgICAgLyogMiBlbmFibGUgYml0cyBwZXIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBEUl9MT0NBTF9FTkFCTEVfTUFTSyAoMHg1NSkgIC8qIFNldCAgbG9jYWwgYml0cyBmb3IgYWxsIDQgcmVncyAqLworI2RlZmluZSBEUl9HTE9CQUxfRU5BQkxFX01BU0sgKDB4QUEpIC8qIFNldCBnbG9iYWwgYml0cyBmb3IgYWxsIDQgcmVncyAqLworCisvKiBUaGUgc2Vjb25kIGJ5dGUgdG8gdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaGFzIGEgZmV3IHNwZWNpYWwgdGhpbmdzLgorICAgV2UgY2FuIHNsb3cgdGhlIGluc3RydWN0aW9uIHBpcGVsaW5lIGZvciBpbnN0cnVjdGlvbnMgY29taW5nIHZpYSB0aGUKKyAgIGdkdCBvciB0aGUgbGR0IGlmIHdlIHdhbnQgdG8uICBJIGFtIG5vdCBzdXJlIHdoeSB0aGlzIGlzIGFuIGFkdmFudGFnZSAqLworCisjaWZkZWYgX19pMzg2X18KKyNkZWZpbmUgRFJfQ09OVFJPTF9SRVNFUlZFRCAoMHhGQzAwKSAvKiBSZXNlcnZlZCBieSBJbnRlbCAqLworI2Vsc2UKKyNkZWZpbmUgRFJfQ09OVFJPTF9SRVNFUlZFRCAoMHhGRkZGRkZGRjAwMDBGQzAwVUwpIC8qIFJlc2VydmVkICovCisjZW5kaWYKKworI2RlZmluZSBEUl9MT0NBTF9TTE9XRE9XTiAoMHgxMDApICAgLyogTG9jYWwgc2xvdyB0aGUgcGlwZWxpbmUgKi8KKyNkZWZpbmUgRFJfR0xPQkFMX1NMT1dET1dOICgweDIwMCkgIC8qIEdsb2JhbCBzbG93IHRoZSBwaXBlbGluZSAqLworCisvKgorICogSFcgYnJlYWtwb2ludCBhZGRpdGlvbnMKKyAqLworCisjZW5kaWYgLyogX0FTTV9YODZfREVCVUdSRUdfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9lODIwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2U4MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmVlNTU4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9lODIwLmgKQEAgLTAsMCArMSw3MiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9FODIwX0gKKyNkZWZpbmUgX0FTTV9YODZfRTgyMF9ICisjZGVmaW5lIEU4MjBNQVAJMHgyZDAJCS8qIG91ciBtYXAgKi8KKyNkZWZpbmUgRTgyME1BWAkxMjgJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIEU4MjBNQVAgKi8KKworLyoKKyAqIExlZ2FjeSBFODIwIEJJT1MgbGltaXRzIHVzIHRvIDEyOCAoRTgyME1BWCkgbm9kZXMgZHVlIHRvIHRoZQorICogY29uc3RyYWluZWQgc3BhY2UgaW4gdGhlIHplcm9wYWdlLiAgSWYgd2UgaGF2ZSBtb3JlIG5vZGVzIHRoYW4KKyAqIHRoYXQsIGFuZCBpZiB3ZSd2ZSBib290ZWQgb2ZmIEVGSSBmaXJtd2FyZSwgdGhlbiB0aGUgRUZJIHRhYmxlcworICogcGFzc2VkIHVzIGZyb20gdGhlIEVGSSBmaXJtd2FyZSBjYW4gbGlzdCBtb3JlIG5vZGVzLiAgU2l6ZSBvdXIKKyAqIGludGVybmFsIG1lbW9yeSBtYXAgdGFibGVzIHRvIGhhdmUgcm9vbSBmb3IgdGhlc2UgYWRkaXRpb25hbAorICogbm9kZXMsIGJhc2VkIG9uIHVwIHRvIHRocmVlIGVudHJpZXMgcGVyIG5vZGUgZm9yIHdoaWNoIHRoZQorICoga2VybmVsIHdhcyBidWlsdDogTUFYX05VTU5PREVTID09ICgxIDw8IENPTkZJR19OT0RFU19TSElGVCksCisgKiBwbHVzIEU4MjBNQVgsIGFsbG93aW5nIHNwYWNlIGZvciB0aGUgcG9zc2libGUgZHVwbGljYXRlIEU4MjAKKyAqIGVudHJpZXMgdGhhdCBtaWdodCBuZWVkIHJvb20gaW4gdGhlIHNhbWUgYXJyYXlzLCBwcmlvciB0byB0aGUKKyAqIGNhbGwgdG8gc2FuaXRpemVfZTgyMF9tYXAoKSB0byByZW1vdmUgZHVwbGljYXRlcy4gIFRoZSBhbGxvd2FuY2UKKyAqIG9mIHRocmVlIG1lbW9yeSBtYXAgZW50cmllcyBwZXIgbm9kZSBpcyAiZW5vdWdoIiBlbnRyaWVzIGZvcgorICogdGhlIGluaXRpYWwgaGFyZHdhcmUgcGxhdGZvcm0gbW90aXZhdGluZyB0aGlzIG1lY2hhbmlzbSB0byBtYWtlCisgKiB1c2Ugb2YgYWRkaXRpb25hbCBFRkkgbWFwIGVudHJpZXMuICBGdXR1cmUgcGxhdGZvcm1zIG1heSB3YW50CisgKiB0byBhbGxvdyBtb3JlIHRoYW4gdGhyZWUgZW50cmllcyBwZXIgbm9kZSBvciBvdGhlcndpc2UgcmVmaW5lCisgKiB0aGlzIHNpemUuCisgKi8KKworLyoKKyAqIE9kZDogJ21ha2UgaGVhZGVyc19jaGVjaycgY29tcGxhaW5zIGFib3V0IG51bWEuaCBpZiBJIHRyeQorICogdG8gY29sbGFwc2UgdGhlIG5leHQgdHdvICNpZmRlZiBsaW5lcyB0byBhIHNpbmdsZSBsaW5lOgorICoJI2lmIGRlZmluZWQoX19LRVJORUxfXykgJiYgZGVmaW5lZChDT05GSUdfRUZJKQorICovCisjZGVmaW5lIEU4MjBfWF9NQVggRTgyME1BWAorCisjZGVmaW5lIEU4MjBOUgkweDFlOAkJLyogIyBlbnRyaWVzIGluIEU4MjBNQVAgKi8KKworI2RlZmluZSBFODIwX1JBTQkxCisjZGVmaW5lIEU4MjBfUkVTRVJWRUQJMgorI2RlZmluZSBFODIwX0FDUEkJMworI2RlZmluZSBFODIwX05WUwk0CisjZGVmaW5lIEU4MjBfVU5VU0FCTEUJNQorCisvKgorICogcmVzZXJ2ZWQgUkFNIHVzZWQgYnkga2VybmVsIGl0c2VsZgorICogaWYgQ09ORklHX0lOVEVMX1RYVCBpcyBlbmFibGVkLCBtZW1vcnkgb2YgdGhpcyB0eXBlIHdpbGwgYmUKKyAqIGluY2x1ZGVkIGluIHRoZSBTMyBpbnRlZ3JpdHkgY2FsY3VsYXRpb24gYW5kIHNvIHNob3VsZCBub3QgaW5jbHVkZQorICogYW55IG1lbW9yeSB0aGF0IEJJT1MgbWlnaHQgYWx0ZXIgb3ZlciB0aGUgUzMgdHJhbnNpdGlvbgorICovCisjZGVmaW5lIEU4MjBfUkVTRVJWRURfS0VSTiAgICAgICAgMTI4CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KK3N0cnVjdCBlODIwZW50cnkgeworCV9fdTY0IGFkZHI7CS8qIHN0YXJ0IG9mIG1lbW9yeSBzZWdtZW50ICovCisJX191NjQgc2l6ZTsJLyogc2l6ZSBvZiBtZW1vcnkgc2VnbWVudCAqLworCV9fdTMyIHR5cGU7CS8qIHR5cGUgb2YgbWVtb3J5IHNlZ21lbnQgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBlODIwbWFwIHsKKwlfX3UzMiBucl9tYXA7CisJc3RydWN0IGU4MjBlbnRyeSBtYXBbRTgyMF9YX01BWF07Cit9OworCisjZGVmaW5lIElTQV9TVEFSVF9BRERSRVNTCTB4YTAwMDAKKyNkZWZpbmUgSVNBX0VORF9BRERSRVNTCQkweDEwMDAwMAorCisjZGVmaW5lIEJJT1NfQkVHSU4JCTB4MDAwYTAwMDAKKyNkZWZpbmUgQklPU19FTkQJCTB4MDAxMDAwMDAKKworI2RlZmluZSBCSU9TX1JPTV9CQVNFCQkweGZmZTAwMDAwCisjZGVmaW5lIEJJT1NfUk9NX0VORAkJMHhmZmZmZmZmZgorCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKworI2VuZGlmIC8qIF9BU01fWDg2X0U4MjBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9lcnJuby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODJiNTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2Vycm5vLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Vycm5vLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2ZjbnRsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2ZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhYjEyZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vZmNudGwuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZmNudGwuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaHdfYnJlYWtwb2ludC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9od19icmVha3BvaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2NGU5YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaHdfYnJlYWtwb2ludC5oCkBAIC0wLDAgKzEsNSBAQAorI2lmbmRlZglfSTM4Nl9IV19CUkVBS1BPSU5UX0gKKyNkZWZpbmUJX0kzODZfSFdfQlJFQUtQT0lOVF9ICisKKyNlbmRpZgkvKiBfSTM4Nl9IV19CUkVBS1BPSU5UX0ggKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9oeXBlcnYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaHlwZXJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwNDIwYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaHlwZXJ2LmgKQEAgLTAsMCArMSwxOTQgQEAKKyNpZm5kZWYgX0FTTV9YODZfSFlQRVJWX0gKKyNkZWZpbmUgX0FTTV9YODZfSFlQRVJWX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBUaGUgYmVsb3cgQ1BVSUQgbGVhdmVzIGFyZSBwcmVzZW50IGlmIFZlcnNpb25BbmRGZWF0dXJlcy5IeXBlcnZpc29yUHJlc2VudAorICogaXMgc2V0IGJ5IENQVUlEKEh2Q3B1SWRGdW5jdGlvblZlcnNpb25BbmRGZWF0dXJlcykuCisgKi8KKyNkZWZpbmUgSFlQRVJWX0NQVUlEX1ZFTkRPUl9BTkRfTUFYX0ZVTkNUSU9OUwkweDQwMDAwMDAwCisjZGVmaW5lIEhZUEVSVl9DUFVJRF9JTlRFUkZBQ0UJCQkweDQwMDAwMDAxCisjZGVmaW5lIEhZUEVSVl9DUFVJRF9WRVJTSU9OCQkJMHg0MDAwMDAwMgorI2RlZmluZSBIWVBFUlZfQ1BVSURfRkVBVFVSRVMJCQkweDQwMDAwMDAzCisjZGVmaW5lIEhZUEVSVl9DUFVJRF9FTkxJR0hUTUVOVF9JTkZPCQkweDQwMDAwMDA0CisjZGVmaW5lIEhZUEVSVl9DUFVJRF9JTVBMRU1FTlRfTElNSVRTCQkweDQwMDAwMDA1CisKKyNkZWZpbmUgSFlQRVJWX0hZUEVSVklTT1JfUFJFU0VOVF9CSVQJCTB4ODAwMDAwMDAKKyNkZWZpbmUgSFlQRVJWX0NQVUlEX01JTgkJCTB4NDAwMDAwMDUKKyNkZWZpbmUgSFlQRVJWX0NQVUlEX01BWAkJCTB4NDAwMGZmZmYKKworLyoKKyAqIEZlYXR1cmUgaWRlbnRpZmljYXRpb24uIEVBWCBpbmRpY2F0ZXMgd2hpY2ggZmVhdHVyZXMgYXJlIGF2YWlsYWJsZQorICogdG8gdGhlIHBhcnRpdGlvbiBiYXNlZCB1cG9uIHRoZSBjdXJyZW50IHBhcnRpdGlvbiBwcml2aWxlZ2VzLgorICovCisKKy8qIFZQIFJ1bnRpbWUgKEhWX1g2NF9NU1JfVlBfUlVOVElNRSkgYXZhaWxhYmxlICovCisjZGVmaW5lIEhWX1g2NF9NU1JfVlBfUlVOVElNRV9BVkFJTEFCTEUJCSgxIDw8IDApCisvKiBQYXJ0aXRpb24gUmVmZXJlbmNlIENvdW50ZXIgKEhWX1g2NF9NU1JfVElNRV9SRUZfQ09VTlQpIGF2YWlsYWJsZSovCisjZGVmaW5lIEhWX1g2NF9NU1JfVElNRV9SRUZfQ09VTlRfQVZBSUxBQkxFCSgxIDw8IDEpCisvKgorICogQmFzaWMgU3luSUMgTVNScyAoSFZfWDY0X01TUl9TQ09OVFJPTCB0aHJvdWdoIEhWX1g2NF9NU1JfRU9NCisgKiBhbmQgSFZfWDY0X01TUl9TSU5UMCB0aHJvdWdoIEhWX1g2NF9NU1JfU0lOVDE1KSBhdmFpbGFibGUKKyAqLworI2RlZmluZSBIVl9YNjRfTVNSX1NZTklDX0FWQUlMQUJMRQkJKDEgPDwgMikKKy8qCisgKiBTeW50aGV0aWMgVGltZXIgTVNScyAoSFZfWDY0X01TUl9TVElNRVIwX0NPTkZJRyB0aHJvdWdoCisgKiBIVl9YNjRfTVNSX1NUSU1FUjNfQ09VTlQpIGF2YWlsYWJsZQorICovCisjZGVmaW5lIEhWX1g2NF9NU1JfU1lOVElNRVJfQVZBSUxBQkxFCQkoMSA8PCAzKQorLyoKKyAqIEFQSUMgYWNjZXNzIE1TUnMgKEhWX1g2NF9NU1JfRU9JLCBIVl9YNjRfTVNSX0lDUiBhbmQgSFZfWDY0X01TUl9UUFIpCisgKiBhcmUgYXZhaWxhYmxlCisgKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9BUElDX0FDQ0VTU19BVkFJTEFCTEUJKDEgPDwgNCkKKy8qIEh5cGVyY2FsbCBNU1JzIChIVl9YNjRfTVNSX0dVRVNUX09TX0lEIGFuZCBIVl9YNjRfTVNSX0hZUEVSQ0FMTCkgYXZhaWxhYmxlKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9IWVBFUkNBTExfQVZBSUxBQkxFCQkoMSA8PCA1KQorLyogQWNjZXNzIHZpcnR1YWwgcHJvY2Vzc29yIGluZGV4IE1TUiAoSFZfWDY0X01TUl9WUF9JTkRFWCkgYXZhaWxhYmxlKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9WUF9JTkRFWF9BVkFJTEFCTEUJCSgxIDw8IDYpCisvKiBWaXJ0dWFsIHN5c3RlbSByZXNldCBNU1IgKEhWX1g2NF9NU1JfUkVTRVQpIGlzIGF2YWlsYWJsZSovCisjZGVmaW5lIEhWX1g2NF9NU1JfUkVTRVRfQVZBSUxBQkxFCQkoMSA8PCA3KQorIC8qCisgICogQWNjZXNzIHN0YXRpc3RpY3MgcGFnZXMgTVNScyAoSFZfWDY0X01TUl9TVEFUU19QQVJUSVRJT05fUkVUQUlMX1BBR0UsCisgICogSFZfWDY0X01TUl9TVEFUU19QQVJUSVRJT05fSU5URVJOQUxfUEFHRSwgSFZfWDY0X01TUl9TVEFUU19WUF9SRVRBSUxfUEFHRSwKKyAgKiBIVl9YNjRfTVNSX1NUQVRTX1ZQX0lOVEVSTkFMX1BBR0UpIGF2YWlsYWJsZQorICAqLworI2RlZmluZSBIVl9YNjRfTVNSX1NUQVRfUEFHRVNfQVZBSUxBQkxFCQkoMSA8PCA4KQorCisvKgorICogRmVhdHVyZSBpZGVudGlmaWNhdGlvbjogRUJYIGluZGljYXRlcyB3aGljaCBmbGFncyB3ZXJlIHNwZWNpZmllZCBhdAorICogcGFydGl0aW9uIGNyZWF0aW9uLiBUaGUgZm9ybWF0IGlzIHRoZSBzYW1lIGFzIHRoZSBwYXJ0aXRpb24gY3JlYXRpb24KKyAqIGZsYWcgc3RydWN0dXJlIGRlZmluZWQgaW4gc2VjdGlvbiBQYXJ0aXRpb24gQ3JlYXRpb24gRmxhZ3MuCisgKi8KKyNkZWZpbmUgSFZfWDY0X0NSRUFURV9QQVJUSVRJT05TCQkoMSA8PCAwKQorI2RlZmluZSBIVl9YNjRfQUNDRVNTX1BBUlRJVElPTl9JRAkJKDEgPDwgMSkKKyNkZWZpbmUgSFZfWDY0X0FDQ0VTU19NRU1PUllfUE9PTAkJKDEgPDwgMikKKyNkZWZpbmUgSFZfWDY0X0FESlVTVF9NRVNTQUdFX0JVRkZFUlMJCSgxIDw8IDMpCisjZGVmaW5lIEhWX1g2NF9QT1NUX01FU1NBR0VTCQkJKDEgPDwgNCkKKyNkZWZpbmUgSFZfWDY0X1NJR05BTF9FVkVOVFMJCQkoMSA8PCA1KQorI2RlZmluZSBIVl9YNjRfQ1JFQVRFX1BPUlQJCQkoMSA8PCA2KQorI2RlZmluZSBIVl9YNjRfQ09OTkVDVF9QT1JUCQkJKDEgPDwgNykKKyNkZWZpbmUgSFZfWDY0X0FDQ0VTU19TVEFUUwkJCSgxIDw8IDgpCisjZGVmaW5lIEhWX1g2NF9ERUJVR0dJTkcJCQkoMSA8PCAxMSkKKyNkZWZpbmUgSFZfWDY0X0NQVV9QT1dFUl9NQU5BR0VNRU5UCQkoMSA8PCAxMikKKyNkZWZpbmUgSFZfWDY0X0NPTkZJR1VSRV9QUk9GSUxFUgkJKDEgPDwgMTMpCisKKy8qCisgKiBGZWF0dXJlIGlkZW50aWZpY2F0aW9uLiBFRFggaW5kaWNhdGVzIHdoaWNoIG1pc2NlbGxhbmVvdXMgZmVhdHVyZXMKKyAqIGFyZSBhdmFpbGFibGUgdG8gdGhlIHBhcnRpdGlvbi4KKyAqLworLyogVGhlIE1XQUlUIGluc3RydWN0aW9uIGlzIGF2YWlsYWJsZSAocGVyIHNlY3Rpb24gTU9OSVRPUiAvIE1XQUlUKSAqLworI2RlZmluZSBIVl9YNjRfTVdBSVRfQVZBSUxBQkxFCQkJCSgxIDw8IDApCisvKiBHdWVzdCBkZWJ1Z2dpbmcgc3VwcG9ydCBpcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgSFZfWDY0X0dVRVNUX0RFQlVHR0lOR19BVkFJTEFCTEUJCSgxIDw8IDEpCisvKiBQZXJmb3JtYW5jZSBNb25pdG9yIHN1cHBvcnQgaXMgYXZhaWxhYmxlKi8KKyNkZWZpbmUgSFZfWDY0X1BFUkZfTU9OSVRPUl9BVkFJTEFCTEUJCQkoMSA8PCAyKQorLyogU3VwcG9ydCBmb3IgcGh5c2ljYWwgQ1BVIGR5bmFtaWMgcGFydGl0aW9uaW5nIGV2ZW50cyBpcyBhdmFpbGFibGUqLworI2RlZmluZSBIVl9YNjRfQ1BVX0RZTkFNSUNfUEFSVElUSU9OSU5HX0FWQUlMQUJMRQkoMSA8PCAzKQorLyoKKyAqIFN1cHBvcnQgZm9yIHBhc3NpbmcgaHlwZXJjYWxsIGlucHV0IHBhcmFtZXRlciBibG9jayB2aWEgWE1NCisgKiByZWdpc3RlcnMgaXMgYXZhaWxhYmxlCisgKi8KKyNkZWZpbmUgSFZfWDY0X0hZUEVSQ0FMTF9QQVJBTVNfWE1NX0FWQUlMQUJMRQkJKDEgPDwgNCkKKy8qIFN1cHBvcnQgZm9yIGEgdmlydHVhbCBndWVzdCBpZGxlIHN0YXRlIGlzIGF2YWlsYWJsZSAqLworI2RlZmluZSBIVl9YNjRfR1VFU1RfSURMRV9TVEFURV9BVkFJTEFCTEUJCSgxIDw8IDUpCisKKy8qCisgKiBJbXBsZW1lbnRhdGlvbiByZWNvbW1lbmRhdGlvbnMuIEluZGljYXRlcyB3aGljaCBiZWhhdmlvcnMgdGhlIGh5cGVydmlzb3IKKyAqIHJlY29tbWVuZHMgdGhlIE9TIGltcGxlbWVudCBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZS4KKyAqLworIC8qCisgICogUmVjb21tZW5kIHVzaW5nIGh5cGVyY2FsbCBmb3IgYWRkcmVzcyBzcGFjZSBzd2l0Y2hlcyByYXRoZXIKKyAgKiB0aGFuIE1PViB0byBDUjMgaW5zdHJ1Y3Rpb24KKyAgKi8KKyNkZWZpbmUgSFZfWDY0X01XQUlUX1JFQ09NTUVOREVECQkoMSA8PCAwKQorLyogUmVjb21tZW5kIHVzaW5nIGh5cGVyY2FsbCBmb3IgbG9jYWwgVExCIGZsdXNoZXMgcmF0aGVyCisgKiB0aGFuIElOVkxQRyBvciBNT1YgdG8gQ1IzIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBIVl9YNjRfTE9DQUxfVExCX0ZMVVNIX1JFQ09NTUVOREVECSgxIDw8IDEpCisvKgorICogUmVjb21tZW5kIHVzaW5nIGh5cGVyY2FsbCBmb3IgcmVtb3RlIFRMQiBmbHVzaGVzIHJhdGhlcgorICogdGhhbiBpbnRlci1wcm9jZXNzb3IgaW50ZXJydXB0cworICovCisjZGVmaW5lIEhWX1g2NF9SRU1PVEVfVExCX0ZMVVNIX1JFQ09NTUVOREVECSgxIDw8IDIpCisvKgorICogUmVjb21tZW5kIHVzaW5nIE1TUnMgZm9yIGFjY2Vzc2luZyBBUElDIHJlZ2lzdGVycworICogRU9JLCBJQ1IgYW5kIFRQUiByYXRoZXIgdGhhbiB0aGVpciBtZW1vcnktbWFwcGVkIGNvdW50ZXJwYXJ0cworICovCisjZGVmaW5lIEhWX1g2NF9BUElDX0FDQ0VTU19SRUNPTU1FTkRFRAkJKDEgPDwgMykKKy8qIFJlY29tbWVuZCB1c2luZyB0aGUgaHlwZXJ2aXNvci1wcm92aWRlZCBNU1IgdG8gaW5pdGlhdGUgYSBzeXN0ZW0gUkVTRVQgKi8KKyNkZWZpbmUgSFZfWDY0X1NZU1RFTV9SRVNFVF9SRUNPTU1FTkRFRAkJKDEgPDwgNCkKKy8qCisgKiBSZWNvbW1lbmQgdXNpbmcgcmVsYXhlZCB0aW1pbmcgZm9yIHRoaXMgcGFydGl0aW9uLiBJZiB1c2VkLAorICogdGhlIFZNIHNob3VsZCBkaXNhYmxlIGFueSB3YXRjaGRvZyB0aW1lb3V0cyB0aGF0IHJlbHkgb24gdGhlCisgKiB0aW1lbHkgZGVsaXZlcnkgb2YgZXh0ZXJuYWwgaW50ZXJydXB0cworICovCisjZGVmaW5lIEhWX1g2NF9SRUxBWEVEX1RJTUlOR19SRUNPTU1FTkRFRAkoMSA8PCA1KQorCisvKiBNU1IgdXNlZCB0byBpZGVudGlmeSB0aGUgZ3Vlc3QgT1MuICovCisjZGVmaW5lIEhWX1g2NF9NU1JfR1VFU1RfT1NfSUQJCQkweDQwMDAwMDAwCisKKy8qIE1TUiB1c2VkIHRvIHNldHVwIHBhZ2VzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgaHlwZXJ2aXNvci4gKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9IWVBFUkNBTEwJCQkweDQwMDAwMDAxCisKKy8qIE1TUiB1c2VkIHRvIHByb3ZpZGUgdmNwdSBpbmRleCAqLworI2RlZmluZSBIVl9YNjRfTVNSX1ZQX0lOREVYCQkJMHg0MDAwMDAwMgorCisvKiBNU1IgdXNlZCB0byByZWFkIHRoZSBwZXItcGFydGl0aW9uIHRpbWUgcmVmZXJlbmNlIGNvdW50ZXIgKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9USU1FX1JFRl9DT1VOVAkJMHg0MDAwMDAyMAorCisvKiBEZWZpbmUgdGhlIHZpcnR1YWwgQVBJQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9FT0kJCQkJMHg0MDAwMDA3MAorI2RlZmluZSBIVl9YNjRfTVNSX0lDUgkJCQkweDQwMDAwMDcxCisjZGVmaW5lIEhWX1g2NF9NU1JfVFBSCQkJCTB4NDAwMDAwNzIKKyNkZWZpbmUgSFZfWDY0X01TUl9BUElDX0FTU0lTVF9QQUdFCQkweDQwMDAwMDczCisKKy8qIERlZmluZSBzeW50aGV0aWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgbW9kZWwgc3BlY2lmaWMgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBIVl9YNjRfTVNSX1NDT05UUk9MCQkJMHg0MDAwMDA4MAorI2RlZmluZSBIVl9YNjRfTVNSX1NWRVJTSU9OCQkJMHg0MDAwMDA4MQorI2RlZmluZSBIVl9YNjRfTVNSX1NJRUZQCQkJMHg0MDAwMDA4MgorI2RlZmluZSBIVl9YNjRfTVNSX1NJTVAJCQkJMHg0MDAwMDA4MworI2RlZmluZSBIVl9YNjRfTVNSX0VPTQkJCQkweDQwMDAwMDg0CisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDAJCQkweDQwMDAwMDkwCisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDEJCQkweDQwMDAwMDkxCisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDIJCQkweDQwMDAwMDkyCisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDMJCQkweDQwMDAwMDkzCisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDQJCQkweDQwMDAwMDk0CisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDUJCQkweDQwMDAwMDk1CisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDYJCQkweDQwMDAwMDk2CisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDcJCQkweDQwMDAwMDk3CisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDgJCQkweDQwMDAwMDk4CisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDkJCQkweDQwMDAwMDk5CisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDEwCQkJMHg0MDAwMDA5QQorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQxMQkJCTB4NDAwMDAwOUIKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UMTIJCQkweDQwMDAwMDlDCisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDEzCQkJMHg0MDAwMDA5RAorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQxNAkJCTB4NDAwMDAwOUUKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UMTUJCQkweDQwMDAwMDlGCisKKworI2RlZmluZSBIVl9YNjRfTVNSX0hZUEVSQ0FMTF9FTkFCTEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgSFZfWDY0X01TUl9IWVBFUkNBTExfUEFHRV9BRERSRVNTX1NISUZUCTEyCisjZGVmaW5lIEhWX1g2NF9NU1JfSFlQRVJDQUxMX1BBR0VfQUREUkVTU19NQVNLCVwKKwkJKH4oKDF1bGwgPDwgSFZfWDY0X01TUl9IWVBFUkNBTExfUEFHRV9BRERSRVNTX1NISUZUKSAtIDEpKQorCisvKiBEZWNsYXJlIHRoZSB2YXJpb3VzIGh5cGVyY2FsbCBvcGVyYXRpb25zLiAqLworI2RlZmluZSBIVl9YNjRfSFZfTk9USUZZX0xPTkdfU1BJTl9XQUlUCQkweDAwMDgKKworI2RlZmluZSBIVl9YNjRfTVNSX0FQSUNfQVNTSVNUX1BBR0VfRU5BQkxFCQkweDAwMDAwMDAxCisjZGVmaW5lIEhWX1g2NF9NU1JfQVBJQ19BU1NJU1RfUEFHRV9BRERSRVNTX1NISUZUCTEyCisjZGVmaW5lIEhWX1g2NF9NU1JfQVBJQ19BU1NJU1RfUEFHRV9BRERSRVNTX01BU0sJXAorCQkofigoMXVsbCA8PCBIVl9YNjRfTVNSX0FQSUNfQVNTSVNUX1BBR0VfQUREUkVTU19TSElGVCkgLSAxKSkKKworI2RlZmluZSBIVl9QUk9DRVNTT1JfUE9XRVJfU1RBVEVfQzAJCTAKKyNkZWZpbmUgSFZfUFJPQ0VTU09SX1BPV0VSX1NUQVRFX0MxCQkxCisjZGVmaW5lIEhWX1BST0NFU1NPUl9QT1dFUl9TVEFURV9DMgkJMgorI2RlZmluZSBIVl9QUk9DRVNTT1JfUE9XRVJfU1RBVEVfQzMJCTMKKworLyogaHlwZXJjYWxsIHN0YXR1cyBjb2RlICovCisjZGVmaW5lIEhWX1NUQVRVU19TVUNDRVNTCQkJMAorI2RlZmluZSBIVl9TVEFUVVNfSU5WQUxJRF9IWVBFUkNBTExfQ09ERQkyCisjZGVmaW5lIEhWX1NUQVRVU19JTlZBTElEX0hZUEVSQ0FMTF9JTlBVVAkzCisjZGVmaW5lIEhWX1NUQVRVU19JTlZBTElEX0FMSUdOTUVOVAkJNAorI2RlZmluZSBIVl9TVEFUVVNfSU5TVUZGSUNJRU5UX0JVRkZFUlMJCTE5CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9pb2N0bC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNzlmZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2lvY3RsLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lvY3RsLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2lvY3Rscy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9pb2N0bHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzM0Yzc2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9pb2N0bHMuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW9jdGxzLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2lwY2J1Zi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9pcGNidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGM3ZTUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9pcGNidWYuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaXBjYnVmLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2lzdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9pc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTE1NjRiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9pc3QuaApAQCAtMCwwICsxLDI5IEBACisjaWZuZGVmIF9BU01fWDg2X0lTVF9ICisjZGVmaW5lIF9BU01fWDg2X0lTVF9ICisKKy8qCisgKiBJbmNsdWRlIGZpbGUgZm9yIHRoZSBpbnRlcmZhY2UgdG8gSVNUIEJJT1MKKyAqIENvcHlyaWdodCAyMDAyIEFuZHkgR3JvdmVyIDxhbmRyZXcuZ3JvdmVyQGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGlzdF9pbmZvIHsKKwlfX3UzMiBzaWduYXR1cmU7CisJX191MzIgY29tbWFuZDsKKwlfX3UzMiBldmVudDsKKwlfX3UzMiBwZXJmX2xldmVsOworfTsKKworI2VuZGlmIC8qIF9BU01fWDg2X0lTVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2t2bS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9rdm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDhkY2JkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9rdm0uaApAQCAtMCwwICsxLDMyNCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9LVk1fSAorI2RlZmluZSBfQVNNX1g4Nl9LVk1fSAorCisvKgorICogS1ZNIHg4NiBzcGVjaWZpYyBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisvKiBTZWxlY3QgeDg2IHNwZWNpZmljIGZlYXR1cmVzIGluIDxsaW51eC9rdm0uaD4gKi8KKyNkZWZpbmUgX19LVk1fSEFWRV9QSVQKKyNkZWZpbmUgX19LVk1fSEFWRV9JT0FQSUMKKyNkZWZpbmUgX19LVk1fSEFWRV9ERVZJQ0VfQVNTSUdOTUVOVAorI2RlZmluZSBfX0tWTV9IQVZFX01TSQorI2RlZmluZSBfX0tWTV9IQVZFX1VTRVJfTk1JCisjZGVmaW5lIF9fS1ZNX0hBVkVfR1VFU1RfREVCVUcKKyNkZWZpbmUgX19LVk1fSEFWRV9NU0lYCisjZGVmaW5lIF9fS1ZNX0hBVkVfTUNFCisjZGVmaW5lIF9fS1ZNX0hBVkVfUElUX1NUQVRFMgorI2RlZmluZSBfX0tWTV9IQVZFX1hFTl9IVk0KKyNkZWZpbmUgX19LVk1fSEFWRV9WQ1BVX0VWRU5UUworI2RlZmluZSBfX0tWTV9IQVZFX0RFQlVHUkVHUworI2RlZmluZSBfX0tWTV9IQVZFX1hTQVZFCisjZGVmaW5lIF9fS1ZNX0hBVkVfWENSUworCisvKiBBcmNoaXRlY3R1cmFsIGludGVycnVwdCBsaW5lIGNvdW50LiAqLworI2RlZmluZSBLVk1fTlJfSU5URVJSVVBUUyAyNTYKKworc3RydWN0IGt2bV9tZW1vcnlfYWxpYXMgeworCV9fdTMyIHNsb3Q7ICAvKiB0aGlzIGhhcyBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbiBtZW1vcnkgc2xvdHMgKi8KKwlfX3UzMiBmbGFnczsKKwlfX3U2NCBndWVzdF9waHlzX2FkZHI7CisJX191NjQgbWVtb3J5X3NpemU7CisJX191NjQgdGFyZ2V0X3BoeXNfYWRkcjsKK307CisKKy8qIGZvciBLVk1fR0VUX0lSUUNISVAgYW5kIEtWTV9TRVRfSVJRQ0hJUCAqLworc3RydWN0IGt2bV9waWNfc3RhdGUgeworCV9fdTggbGFzdF9pcnI7CS8qIGVkZ2UgZGV0ZWN0aW9uICovCisJX191OCBpcnI7CQkvKiBpbnRlcnJ1cHQgcmVxdWVzdCByZWdpc3RlciAqLworCV9fdTggaW1yOwkJLyogaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKwlfX3U4IGlzcjsJCS8qIGludGVycnVwdCBzZXJ2aWNlIHJlZ2lzdGVyICovCisJX191OCBwcmlvcml0eV9hZGQ7CS8qIGhpZ2hlc3QgaXJxIHByaW9yaXR5ICovCisJX191OCBpcnFfYmFzZTsKKwlfX3U4IHJlYWRfcmVnX3NlbGVjdDsKKwlfX3U4IHBvbGw7CisJX191OCBzcGVjaWFsX21hc2s7CisJX191OCBpbml0X3N0YXRlOworCV9fdTggYXV0b19lb2k7CisJX191OCByb3RhdGVfb25fYXV0b19lb2k7CisJX191OCBzcGVjaWFsX2Z1bGx5X25lc3RlZF9tb2RlOworCV9fdTggaW5pdDQ7CQkvKiB0cnVlIGlmIDQgYnl0ZSBpbml0ICovCisJX191OCBlbGNyOwkJLyogUElJWCBlZGdlL3RyaWdnZXIgc2VsZWN0aW9uICovCisJX191OCBlbGNyX21hc2s7Cit9OworCisjZGVmaW5lIEtWTV9JT0FQSUNfTlVNX1BJTlMgIDI0CitzdHJ1Y3Qga3ZtX2lvYXBpY19zdGF0ZSB7CisJX191NjQgYmFzZV9hZGRyZXNzOworCV9fdTMyIGlvcmVnc2VsOworCV9fdTMyIGlkOworCV9fdTMyIGlycjsKKwlfX3UzMiBwYWQ7CisJdW5pb24geworCQlfX3U2NCBiaXRzOworCQlzdHJ1Y3QgeworCQkJX191OCB2ZWN0b3I7CisJCQlfX3U4IGRlbGl2ZXJ5X21vZGU6MzsKKwkJCV9fdTggZGVzdF9tb2RlOjE7CisJCQlfX3U4IGRlbGl2ZXJ5X3N0YXR1czoxOworCQkJX191OCBwb2xhcml0eToxOworCQkJX191OCByZW1vdGVfaXJyOjE7CisJCQlfX3U4IHRyaWdfbW9kZToxOworCQkJX191OCBtYXNrOjE7CisJCQlfX3U4IHJlc2VydmU6NzsKKwkJCV9fdTggcmVzZXJ2ZWRbNF07CisJCQlfX3U4IGRlc3RfaWQ7CisJCX0gZmllbGRzOworCX0gcmVkaXJ0YmxbS1ZNX0lPQVBJQ19OVU1fUElOU107Cit9OworCisjZGVmaW5lIEtWTV9JUlFDSElQX1BJQ19NQVNURVIgICAwCisjZGVmaW5lIEtWTV9JUlFDSElQX1BJQ19TTEFWRSAgICAxCisjZGVmaW5lIEtWTV9JUlFDSElQX0lPQVBJQyAgICAgICAyCisjZGVmaW5lIEtWTV9OUl9JUlFDSElQUyAgICAgICAgICAzCisKKy8qIGZvciBLVk1fR0VUX1JFR1MgYW5kIEtWTV9TRVRfUkVHUyAqLworc3RydWN0IGt2bV9yZWdzIHsKKwkvKiBvdXQgKEtWTV9HRVRfUkVHUykgLyBpbiAoS1ZNX1NFVF9SRUdTKSAqLworCV9fdTY0IHJheCwgcmJ4LCByY3gsIHJkeDsKKwlfX3U2NCByc2ksIHJkaSwgcnNwLCByYnA7CisJX191NjQgcjgsICByOSwgIHIxMCwgcjExOworCV9fdTY0IHIxMiwgcjEzLCByMTQsIHIxNTsKKwlfX3U2NCByaXAsIHJmbGFnczsKK307CisKKy8qIGZvciBLVk1fR0VUX0xBUElDIGFuZCBLVk1fU0VUX0xBUElDICovCisjZGVmaW5lIEtWTV9BUElDX1JFR19TSVpFIDB4NDAwCitzdHJ1Y3Qga3ZtX2xhcGljX3N0YXRlIHsKKwljaGFyIHJlZ3NbS1ZNX0FQSUNfUkVHX1NJWkVdOworfTsKKworc3RydWN0IGt2bV9zZWdtZW50IHsKKwlfX3U2NCBiYXNlOworCV9fdTMyIGxpbWl0OworCV9fdTE2IHNlbGVjdG9yOworCV9fdTggIHR5cGU7CisJX191OCAgcHJlc2VudCwgZHBsLCBkYiwgcywgbCwgZywgYXZsOworCV9fdTggIHVudXNhYmxlOworCV9fdTggIHBhZGRpbmc7Cit9OworCitzdHJ1Y3Qga3ZtX2R0YWJsZSB7CisJX191NjQgYmFzZTsKKwlfX3UxNiBsaW1pdDsKKwlfX3UxNiBwYWRkaW5nWzNdOworfTsKKworCisvKiBmb3IgS1ZNX0dFVF9TUkVHUyBhbmQgS1ZNX1NFVF9TUkVHUyAqLworc3RydWN0IGt2bV9zcmVncyB7CisJLyogb3V0IChLVk1fR0VUX1NSRUdTKSAvIGluIChLVk1fU0VUX1NSRUdTKSAqLworCXN0cnVjdCBrdm1fc2VnbWVudCBjcywgZHMsIGVzLCBmcywgZ3MsIHNzOworCXN0cnVjdCBrdm1fc2VnbWVudCB0ciwgbGR0OworCXN0cnVjdCBrdm1fZHRhYmxlIGdkdCwgaWR0OworCV9fdTY0IGNyMCwgY3IyLCBjcjMsIGNyNCwgY3I4OworCV9fdTY0IGVmZXI7CisJX191NjQgYXBpY19iYXNlOworCV9fdTY0IGludGVycnVwdF9iaXRtYXBbKEtWTV9OUl9JTlRFUlJVUFRTICsgNjMpIC8gNjRdOworfTsKKworLyogZm9yIEtWTV9HRVRfRlBVIGFuZCBLVk1fU0VUX0ZQVSAqLworc3RydWN0IGt2bV9mcHUgeworCV9fdTggIGZwcls4XVsxNl07CisJX191MTYgZmN3OworCV9fdTE2IGZzdzsKKwlfX3U4ICBmdHd4OyAgLyogaW4gZnhzYXZlIGZvcm1hdCAqLworCV9fdTggIHBhZDE7CisJX191MTYgbGFzdF9vcGNvZGU7CisJX191NjQgbGFzdF9pcDsKKwlfX3U2NCBsYXN0X2RwOworCV9fdTggIHhtbVsxNl1bMTZdOworCV9fdTMyIG14Y3NyOworCV9fdTMyIHBhZDI7Cit9OworCitzdHJ1Y3Qga3ZtX21zcl9lbnRyeSB7CisJX191MzIgaW5kZXg7CisJX191MzIgcmVzZXJ2ZWQ7CisJX191NjQgZGF0YTsKK307CisKKy8qIGZvciBLVk1fR0VUX01TUlMgYW5kIEtWTV9TRVRfTVNSUyAqLworc3RydWN0IGt2bV9tc3JzIHsKKwlfX3UzMiBubXNyczsgLyogbnVtYmVyIG9mIG1zcnMgaW4gZW50cmllcyAqLworCV9fdTMyIHBhZDsKKworCXN0cnVjdCBrdm1fbXNyX2VudHJ5IGVudHJpZXNbMF07Cit9OworCisvKiBmb3IgS1ZNX0dFVF9NU1JfSU5ERVhfTElTVCAqLworc3RydWN0IGt2bV9tc3JfbGlzdCB7CisJX191MzIgbm1zcnM7IC8qIG51bWJlciBvZiBtc3JzIGluIGVudHJpZXMgKi8KKwlfX3UzMiBpbmRpY2VzWzBdOworfTsKKworCitzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5IHsKKwlfX3UzMiBmdW5jdGlvbjsKKwlfX3UzMiBlYXg7CisJX191MzIgZWJ4OworCV9fdTMyIGVjeDsKKwlfX3UzMiBlZHg7CisJX191MzIgcGFkZGluZzsKK307CisKKy8qIGZvciBLVk1fU0VUX0NQVUlEICovCitzdHJ1Y3Qga3ZtX2NwdWlkIHsKKwlfX3UzMiBuZW50OworCV9fdTMyIHBhZGRpbmc7CisJc3RydWN0IGt2bV9jcHVpZF9lbnRyeSBlbnRyaWVzWzBdOworfTsKKworc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgeworCV9fdTMyIGZ1bmN0aW9uOworCV9fdTMyIGluZGV4OworCV9fdTMyIGZsYWdzOworCV9fdTMyIGVheDsKKwlfX3UzMiBlYng7CisJX191MzIgZWN4OworCV9fdTMyIGVkeDsKKwlfX3UzMiBwYWRkaW5nWzNdOworfTsKKworI2RlZmluZSBLVk1fQ1BVSURfRkxBR19TSUdOSUZDQU5UX0lOREVYIDEKKyNkZWZpbmUgS1ZNX0NQVUlEX0ZMQUdfU1RBVEVGVUxfRlVOQyAgICAyCisjZGVmaW5lIEtWTV9DUFVJRF9GTEFHX1NUQVRFX1JFQURfTkVYVCAgNAorCisvKiBmb3IgS1ZNX1NFVF9DUFVJRDIgKi8KK3N0cnVjdCBrdm1fY3B1aWQyIHsKKwlfX3UzMiBuZW50OworCV9fdTMyIHBhZGRpbmc7CisJc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgZW50cmllc1swXTsKK307CisKKy8qIGZvciBLVk1fR0VUX1BJVCBhbmQgS1ZNX1NFVF9QSVQgKi8KK3N0cnVjdCBrdm1fcGl0X2NoYW5uZWxfc3RhdGUgeworCV9fdTMyIGNvdW50OyAvKiBjYW4gYmUgNjU1MzYgKi8KKwlfX3UxNiBsYXRjaGVkX2NvdW50OworCV9fdTggY291bnRfbGF0Y2hlZDsKKwlfX3U4IHN0YXR1c19sYXRjaGVkOworCV9fdTggc3RhdHVzOworCV9fdTggcmVhZF9zdGF0ZTsKKwlfX3U4IHdyaXRlX3N0YXRlOworCV9fdTggd3JpdGVfbGF0Y2g7CisJX191OCByd19tb2RlOworCV9fdTggbW9kZTsKKwlfX3U4IGJjZDsKKwlfX3U4IGdhdGU7CisJX19zNjQgY291bnRfbG9hZF90aW1lOworfTsKKworc3RydWN0IGt2bV9kZWJ1Z19leGl0X2FyY2ggeworCV9fdTMyIGV4Y2VwdGlvbjsKKwlfX3UzMiBwYWQ7CisJX191NjQgcGM7CisJX191NjQgZHI2OworCV9fdTY0IGRyNzsKK307CisKKyNkZWZpbmUgS1ZNX0dVRVNUREJHX1VTRV9TV19CUAkJMHgwMDAxMDAwMAorI2RlZmluZSBLVk1fR1VFU1REQkdfVVNFX0hXX0JQCQkweDAwMDIwMDAwCisjZGVmaW5lIEtWTV9HVUVTVERCR19JTkpFQ1RfREIJCTB4MDAwNDAwMDAKKyNkZWZpbmUgS1ZNX0dVRVNUREJHX0lOSkVDVF9CUAkJMHgwMDA4MDAwMAorCisvKiBmb3IgS1ZNX1NFVF9HVUVTVF9ERUJVRyAqLworc3RydWN0IGt2bV9ndWVzdF9kZWJ1Z19hcmNoIHsKKwlfX3U2NCBkZWJ1Z3JlZ1s4XTsKK307CisKK3N0cnVjdCBrdm1fcGl0X3N0YXRlIHsKKwlzdHJ1Y3Qga3ZtX3BpdF9jaGFubmVsX3N0YXRlIGNoYW5uZWxzWzNdOworfTsKKworI2RlZmluZSBLVk1fUElUX0ZMQUdTX0hQRVRfTEVHQUNZICAweDAwMDAwMDAxCisKK3N0cnVjdCBrdm1fcGl0X3N0YXRlMiB7CisJc3RydWN0IGt2bV9waXRfY2hhbm5lbF9zdGF0ZSBjaGFubmVsc1szXTsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiByZXNlcnZlZFs5XTsKK307CisKK3N0cnVjdCBrdm1fcmVpbmplY3RfY29udHJvbCB7CisJX191OCBwaXRfcmVpbmplY3Q7CisJX191OCByZXNlcnZlZFszMV07Cit9OworCisvKiBXaGVuIHNldCBpbiBmbGFncywgaW5jbHVkZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBvbiBLVk1fU0VUX1ZDUFVfRVZFTlRTICovCisjZGVmaW5lIEtWTV9WQ1BVRVZFTlRfVkFMSURfTk1JX1BFTkRJTkcJMHgwMDAwMDAwMQorI2RlZmluZSBLVk1fVkNQVUVWRU5UX1ZBTElEX1NJUElfVkVDVE9SCTB4MDAwMDAwMDIKKyNkZWZpbmUgS1ZNX1ZDUFVFVkVOVF9WQUxJRF9TSEFET1cJMHgwMDAwMDAwNAorCisvKiBJbnRlcnJ1cHQgc2hhZG93IHN0YXRlcyAqLworI2RlZmluZSBLVk1fWDg2X1NIQURPV19JTlRfTU9WX1NTCTB4MDEKKyNkZWZpbmUgS1ZNX1g4Nl9TSEFET1dfSU5UX1NUSQkJMHgwMgorCisvKiBmb3IgS1ZNX0dFVC9TRVRfVkNQVV9FVkVOVFMgKi8KK3N0cnVjdCBrdm1fdmNwdV9ldmVudHMgeworCXN0cnVjdCB7CisJCV9fdTggaW5qZWN0ZWQ7CisJCV9fdTggbnI7CisJCV9fdTggaGFzX2Vycm9yX2NvZGU7CisJCV9fdTggcGFkOworCQlfX3UzMiBlcnJvcl9jb2RlOworCX0gZXhjZXB0aW9uOworCXN0cnVjdCB7CisJCV9fdTggaW5qZWN0ZWQ7CisJCV9fdTggbnI7CisJCV9fdTggc29mdDsKKwkJX191OCBzaGFkb3c7CisJfSBpbnRlcnJ1cHQ7CisJc3RydWN0IHsKKwkJX191OCBpbmplY3RlZDsKKwkJX191OCBwZW5kaW5nOworCQlfX3U4IG1hc2tlZDsKKwkJX191OCBwYWQ7CisJfSBubWk7CisJX191MzIgc2lwaV92ZWN0b3I7CisJX191MzIgZmxhZ3M7CisJX191MzIgcmVzZXJ2ZWRbMTBdOworfTsKKworLyogZm9yIEtWTV9HRVQvU0VUX0RFQlVHUkVHUyAqLworc3RydWN0IGt2bV9kZWJ1Z3JlZ3MgeworCV9fdTY0IGRiWzRdOworCV9fdTY0IGRyNjsKKwlfX3U2NCBkcjc7CisJX191NjQgZmxhZ3M7CisJX191NjQgcmVzZXJ2ZWRbOV07Cit9OworCisvKiBmb3IgS1ZNX0NBUF9YU0FWRSAqLworc3RydWN0IGt2bV94c2F2ZSB7CisJX191MzIgcmVnaW9uWzEwMjRdOworfTsKKworI2RlZmluZSBLVk1fTUFYX1hDUlMJMTYKKworc3RydWN0IGt2bV94Y3IgeworCV9fdTMyIHhjcjsKKwlfX3UzMiByZXNlcnZlZDsKKwlfX3U2NCB2YWx1ZTsKK307CisKK3N0cnVjdCBrdm1feGNycyB7CisJX191MzIgbnJfeGNyczsKKwlfX3UzMiBmbGFnczsKKwlzdHJ1Y3Qga3ZtX3hjciB4Y3JzW0tWTV9NQVhfWENSU107CisJX191NjQgcGFkZGluZ1sxNl07Cit9OworCisjZW5kaWYgLyogX0FTTV9YODZfS1ZNX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20va3ZtX3BhcmEuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20va3ZtX3BhcmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmFjNDZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9rdm1fcGFyYS5oCkBAIC0wLDAgKzEsOTMgQEAKKyNpZm5kZWYgX0FTTV9YODZfS1ZNX1BBUkFfSAorI2RlZmluZSBfQVNNX1g4Nl9LVk1fUEFSQV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9oeXBlcnYuaD4KKworLyogVGhpcyBDUFVJRCByZXR1cm5zIHRoZSBzaWduYXR1cmUgJ0tWTUtWTUtWTScgaW4gZWJ4LCBlY3gsIGFuZCBlZHguICBJdAorICogc2hvdWxkIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoYXQgYSBWTSBpcyBydW5uaW5nIHVuZGVyIEtWTS4KKyAqLworI2RlZmluZSBLVk1fQ1BVSURfU0lHTkFUVVJFCTB4NDAwMDAwMDAKKworLyogVGhpcyBDUFVJRCByZXR1cm5zIGEgZmVhdHVyZSBiaXRtYXAgaW4gZWF4LiAgQmVmb3JlIGVuYWJsaW5nIGEgcGFydGljdWxhcgorICogcGFyYXZpcnR1YWxpemF0aW9uLCB0aGUgYXBwcm9wcmlhdGUgZmVhdHVyZSBiaXQgc2hvdWxkIGJlIGNoZWNrZWQuCisgKi8KKyNkZWZpbmUgS1ZNX0NQVUlEX0ZFQVRVUkVTCTB4NDAwMDAwMDEKKyNkZWZpbmUgS1ZNX0ZFQVRVUkVfQ0xPQ0tTT1VSQ0UJCTAKKyNkZWZpbmUgS1ZNX0ZFQVRVUkVfTk9QX0lPX0RFTEFZCTEKKyNkZWZpbmUgS1ZNX0ZFQVRVUkVfTU1VX09QCQkyCisvKiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBuZXcgc2V0IG9mIGt2bWNsb2NrIG1zcnMKKyAqIGFyZSBhdmFpbGFibGUuIFRoZSB1c2Ugb2YgMHgxMSBhbmQgMHgxMiBpcyBkZXByZWNhdGVkCisgKi8KKyNkZWZpbmUgS1ZNX0ZFQVRVUkVfQ0xPQ0tTT1VSQ0UyICAgICAgICAzCisjZGVmaW5lIEtWTV9GRUFUVVJFX0FTWU5DX1BGCQk0CisjZGVmaW5lIEtWTV9GRUFUVVJFX1NURUFMX1RJTUUJCTUKKworLyogVGhlIGxhc3QgOCBiaXRzIGFyZSB1c2VkIHRvIGluZGljYXRlIGhvdyB0byBpbnRlcnByZXQgdGhlIGZsYWdzIGZpZWxkCisgKiBpbiBwdmNsb2NrIHN0cnVjdHVyZS4gSWYgbm8gYml0cyBhcmUgc2V0LCBhbGwgZmxhZ3MgYXJlIGlnbm9yZWQuCisgKi8KKyNkZWZpbmUgS1ZNX0ZFQVRVUkVfQ0xPQ0tTT1VSQ0VfU1RBQkxFX0JJVAkyNAorCisjZGVmaW5lIE1TUl9LVk1fV0FMTF9DTE9DSyAgMHgxMQorI2RlZmluZSBNU1JfS1ZNX1NZU1RFTV9USU1FIDB4MTIKKworI2RlZmluZSBLVk1fTVNSX0VOQUJMRUQgMQorLyogQ3VzdG9tIE1TUnMgZmFsbHMgaW4gdGhlIHJhbmdlIDB4NGI1NjRkMDAtMHg0YjU2NGRmZiAqLworI2RlZmluZSBNU1JfS1ZNX1dBTExfQ0xPQ0tfTkVXICAweDRiNTY0ZDAwCisjZGVmaW5lIE1TUl9LVk1fU1lTVEVNX1RJTUVfTkVXIDB4NGI1NjRkMDEKKyNkZWZpbmUgTVNSX0tWTV9BU1lOQ19QRl9FTiAweDRiNTY0ZDAyCisjZGVmaW5lIE1TUl9LVk1fU1RFQUxfVElNRSAgMHg0YjU2NGQwMworCitzdHJ1Y3Qga3ZtX3N0ZWFsX3RpbWUgeworCV9fdTY0IHN0ZWFsOworCV9fdTMyIHZlcnNpb247CisJX191MzIgZmxhZ3M7CisJX191MzIgcGFkWzEyXTsKK307CisKKyNkZWZpbmUgS1ZNX1NURUFMX0FMSUdOTUVOVF9CSVRTIDUKKyNkZWZpbmUgS1ZNX1NURUFMX1ZBTElEX0JJVFMgKCgtMVVMTCA8PCAoS1ZNX1NURUFMX0FMSUdOTUVOVF9CSVRTICsgMSkpKQorI2RlZmluZSBLVk1fU1RFQUxfUkVTRVJWRURfTUFTSyAoKCgxIDw8IEtWTV9TVEVBTF9BTElHTk1FTlRfQklUUykgLSAxICkgPDwgMSkKKworI2RlZmluZSBLVk1fTUFYX01NVV9PUF9CQVRDSCAgICAgICAgICAgMzIKKworI2RlZmluZSBLVk1fQVNZTkNfUEZfRU5BQkxFRAkJCSgxIDw8IDApCisjZGVmaW5lIEtWTV9BU1lOQ19QRl9TRU5EX0FMV0FZUwkJKDEgPDwgMSkKKworLyogT3BlcmF0aW9ucyBmb3IgS1ZNX0hDX01NVV9PUCAqLworI2RlZmluZSBLVk1fTU1VX09QX1dSSVRFX1BURSAgICAgICAgICAgIDEKKyNkZWZpbmUgS1ZNX01NVV9PUF9GTFVTSF9UTEIJICAgICAgICAyCisjZGVmaW5lIEtWTV9NTVVfT1BfUkVMRUFTRV9QVAkgICAgICAgIDMKKworLyogUGF5bG9hZCBmb3IgS1ZNX0hDX01NVV9PUCAqLworc3RydWN0IGt2bV9tbXVfb3BfaGVhZGVyIHsKKwlfX3UzMiBvcDsKKwlfX3UzMiBwYWQ7Cit9OworCitzdHJ1Y3Qga3ZtX21tdV9vcF93cml0ZV9wdGUgeworCXN0cnVjdCBrdm1fbW11X29wX2hlYWRlciBoZWFkZXI7CisJX191NjQgcHRlX3BoeXM7CisJX191NjQgcHRlX3ZhbDsKK307CisKK3N0cnVjdCBrdm1fbW11X29wX2ZsdXNoX3RsYiB7CisJc3RydWN0IGt2bV9tbXVfb3BfaGVhZGVyIGhlYWRlcjsKK307CisKK3N0cnVjdCBrdm1fbW11X29wX3JlbGVhc2VfcHQgeworCXN0cnVjdCBrdm1fbW11X29wX2hlYWRlciBoZWFkZXI7CisJX191NjQgcHRfcGh5czsKK307CisKKyNkZWZpbmUgS1ZNX1BWX1JFQVNPTl9QQUdFX05PVF9QUkVTRU5UIDEKKyNkZWZpbmUgS1ZNX1BWX1JFQVNPTl9QQUdFX1JFQURZIDIKKworc3RydWN0IGt2bV92Y3B1X3B2X2FwZl9kYXRhIHsKKwlfX3UzMiByZWFzb247CisJX191OCBwYWRbNjBdOworCV9fdTMyIGVuYWJsZWQ7Cit9OworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9LVk1fUEFSQV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2xkdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9sZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjcyN2ViCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9sZHQuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogbGR0LmgKKyAqCisgKiBEZWZpbml0aW9ucyBvZiBzdHJ1Y3R1cmVzIHVzZWQgd2l0aCB0aGUgbW9kaWZ5X2xkdCBzeXN0ZW0gY2FsbC4KKyAqLworI2lmbmRlZiBfQVNNX1g4Nl9MRFRfSAorI2RlZmluZSBfQVNNX1g4Nl9MRFRfSAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBMRFQgZW50cmllcyBzdXBwb3J0ZWQuICovCisjZGVmaW5lIExEVF9FTlRSSUVTCTgxOTIKKy8qIFRoZSBzaXplIG9mIGVhY2ggTERUIGVudHJ5LiAqLworI2RlZmluZSBMRFRfRU5UUllfU0laRQk4CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisvKgorICogTm90ZSBvbiA2NGJpdCBiYXNlIGFuZCBsaW1pdCBpcyBpZ25vcmVkIGFuZCB5b3UgY2Fubm90IHNldCBEUy9FUy9DUworICogbm90IHRvIHRoZSBkZWZhdWx0IHZhbHVlcyBpZiB5b3Ugc3RpbGwgd2FudCB0byBkbyBzeXNjYWxscy4gVGhpcworICogY2FsbCBpcyBtb3JlIGZvciAzMmJpdCBtb2RlIHRoZXJlZm9yZS4KKyAqLworc3RydWN0IHVzZXJfZGVzYyB7CisJdW5zaWduZWQgaW50ICBlbnRyeV9udW1iZXI7CisJdW5zaWduZWQgaW50ICBiYXNlX2FkZHI7CisJdW5zaWduZWQgaW50ICBsaW1pdDsKKwl1bnNpZ25lZCBpbnQgIHNlZ18zMmJpdDoxOworCXVuc2lnbmVkIGludCAgY29udGVudHM6MjsKKwl1bnNpZ25lZCBpbnQgIHJlYWRfZXhlY19vbmx5OjE7CisJdW5zaWduZWQgaW50ICBsaW1pdF9pbl9wYWdlczoxOworCXVuc2lnbmVkIGludCAgc2VnX25vdF9wcmVzZW50OjE7CisJdW5zaWduZWQgaW50ICB1c2VhYmxlOjE7CisjaWZkZWYgX194ODZfNjRfXworCXVuc2lnbmVkIGludCAgbG06MTsKKyNlbmRpZgorfTsKKworI2RlZmluZSBNT0RJRllfTERUX0NPTlRFTlRTX0RBVEEJMAorI2RlZmluZSBNT0RJRllfTERUX0NPTlRFTlRTX1NUQUNLCTEKKyNkZWZpbmUgTU9ESUZZX0xEVF9DT05URU5UU19DT0RFCTIKKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBfQVNNX1g4Nl9MRFRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9tY2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwYjJmYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbWNlLmgKQEAgLTAsMCArMSwxMjMgQEAKKyNpZm5kZWYgX0FTTV9YODZfTUNFX0gKKyNkZWZpbmUgX0FTTV9YODZfTUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCisvKgorICogTWFjaGluZSBDaGVjayBzdXBwb3J0IGZvciB4ODYKKyAqLworCisvKiBNQ0dfQ0FQIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgTUNHX0JBTktDTlRfTUFTSwkweGZmICAgICAgICAgLyogTnVtYmVyIG9mIEJhbmtzICovCisjZGVmaW5lIE1DR19DVExfUAkJKDFVTEw8PDgpICAgIC8qIE1DR19DVEwgcmVnaXN0ZXIgYXZhaWxhYmxlICovCisjZGVmaW5lIE1DR19FWFRfUAkJKDFVTEw8PDkpICAgIC8qIEV4dGVuZGVkIHJlZ2lzdGVycyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTUNHX0NNQ0lfUAkJKDFVTEw8PDEwKSAgIC8qIENNQ0kgc3VwcG9ydGVkICovCisjZGVmaW5lIE1DR19FWFRfQ05UX01BU0sJMHhmZjAwMDAgICAgIC8qIE51bWJlciBvZiBFeHRlbmRlZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUNHX0VYVF9DTlRfU0hJRlQJMTYKKyNkZWZpbmUgTUNHX0VYVF9DTlQoYykJCSgoKGMpICYgTUNHX0VYVF9DTlRfTUFTSykgPj4gTUNHX0VYVF9DTlRfU0hJRlQpCisjZGVmaW5lIE1DR19TRVJfUAkgCSgxVUxMPDwyNCkgICAvKiBNQ0EgcmVjb3ZlcnkvbmV3IHN0YXR1cyBiaXRzICovCisKKy8qIE1DR19TVEFUVVMgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBNQ0dfU1RBVFVTX1JJUFYgICgxVUxMPDwwKSAgIC8qIHJlc3RhcnQgaXAgdmFsaWQgKi8KKyNkZWZpbmUgTUNHX1NUQVRVU19FSVBWICAoMVVMTDw8MSkgICAvKiBpcCBwb2ludHMgdG8gY29ycmVjdCBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBNQ0dfU1RBVFVTX01DSVAgICgxVUxMPDwyKSAgIC8qIG1hY2hpbmUgY2hlY2sgaW4gcHJvZ3Jlc3MgKi8KKworLyogTUNpX1NUQVRVUyByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIE1DSV9TVEFUVVNfVkFMICAgKDFVTEw8PDYzKSAgLyogdmFsaWQgZXJyb3IgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19PVkVSICAoMVVMTDw8NjIpICAvKiBwcmV2aW91cyBlcnJvcnMgbG9zdCAqLworI2RlZmluZSBNQ0lfU1RBVFVTX1VDICAgICgxVUxMPDw2MSkgIC8qIHVuY29ycmVjdGVkIGVycm9yICovCisjZGVmaW5lIE1DSV9TVEFUVVNfRU4gICAgKDFVTEw8PDYwKSAgLyogZXJyb3IgZW5hYmxlZCAqLworI2RlZmluZSBNQ0lfU1RBVFVTX01JU0NWICgxVUxMPDw1OSkgIC8qIG1pc2MgZXJyb3IgcmVnLiB2YWxpZCAqLworI2RlZmluZSBNQ0lfU1RBVFVTX0FERFJWICgxVUxMPDw1OCkgIC8qIGFkZHIgcmVnLiB2YWxpZCAqLworI2RlZmluZSBNQ0lfU1RBVFVTX1BDQyAgICgxVUxMPDw1NykgIC8qIHByb2Nlc3NvciBjb250ZXh0IGNvcnJ1cHQgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19TCSAoMVVMTDw8NTYpICAvKiBTaWduYWxlZCBtYWNoaW5lIGNoZWNrICovCisjZGVmaW5lIE1DSV9TVEFUVVNfQVIJICgxVUxMPDw1NSkgIC8qIEFjdGlvbiByZXF1aXJlZCAqLworCisvKiBNQ2lfTUlTQyByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIE1DSV9NSVNDX0FERFJfTFNCKG0pCSgobSkgJiAweDNmKQorI2RlZmluZSBNQ0lfTUlTQ19BRERSX01PREUobSkJKCgobSkgPj4gNikgJiA3KQorI2RlZmluZSAgTUNJX01JU0NfQUREUl9TRUdPRkYJMAkvKiBzZWdtZW50IG9mZnNldCAqLworI2RlZmluZSAgTUNJX01JU0NfQUREUl9MSU5FQVIJMQkvKiBsaW5lYXIgYWRkcmVzcyAqLworI2RlZmluZSAgTUNJX01JU0NfQUREUl9QSFlTCTIJLyogcGh5c2ljYWwgYWRkcmVzcyAqLworI2RlZmluZSAgTUNJX01JU0NfQUREUl9NRU0JMwkvKiBtZW1vcnkgYWRkcmVzcyAqLworI2RlZmluZSAgTUNJX01JU0NfQUREUl9HRU5FUklDCTcJLyogZ2VuZXJpYyAqLworCisvKiBDVEwyIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgTUNJX0NUTDJfQ01DSV9FTgkJKDFVTEwgPDwgMzApCisjZGVmaW5lIE1DSV9DVEwyX0NNQ0lfVEhSRVNIT0xEX01BU0sJMHg3ZmZmVUxMCisKKyNkZWZpbmUgTUNKX0NUWF9NQVNLCQkzCisjZGVmaW5lIE1DSl9DVFgoZmxhZ3MpCQkoKGZsYWdzKSAmIE1DSl9DVFhfTUFTSykKKyNkZWZpbmUgTUNKX0NUWF9SQU5ET00JCTAgICAgLyogaW5qZWN0IGNvbnRleHQ6IHJhbmRvbSAqLworI2RlZmluZSBNQ0pfQ1RYX1BST0NFU1MJCTEgICAgLyogaW5qZWN0IGNvbnRleHQ6IHByb2Nlc3MgKi8KKyNkZWZpbmUgTUNKX0NUWF9JUlEJCTIgICAgLyogaW5qZWN0IGNvbnRleHQ6IElSUSAqLworI2RlZmluZSBNQ0pfTk1JX0JST0FEQ0FTVAk0ICAgIC8qIGRvIE5NSSBicm9hZGNhc3RpbmcgKi8KKyNkZWZpbmUgTUNKX0VYQ0VQVElPTgkJOCAgICAvKiByYWlzZSBhcyBleGNlcHRpb24gKi8KKworLyogRmllbGRzIGFyZSB6ZXJvIHdoZW4gbm90IGF2YWlsYWJsZSAqLworc3RydWN0IG1jZSB7CisJX191NjQgc3RhdHVzOworCV9fdTY0IG1pc2M7CisJX191NjQgYWRkcjsKKwlfX3U2NCBtY2dzdGF0dXM7CisJX191NjQgaXA7CisJX191NjQgdHNjOwkvKiBjcHUgdGltZSBzdGFtcCBjb3VudGVyICovCisJX191NjQgdGltZTsJLyogd2FsbCB0aW1lX3Qgd2hlbiBlcnJvciB3YXMgZGV0ZWN0ZWQgKi8KKwlfX3U4ICBjcHV2ZW5kb3I7CS8qIGNwdSB2ZW5kb3IgYXMgZW5jb2RlZCBpbiBzeXN0ZW0uaCAqLworCV9fdTggIGluamVjdF9mbGFnczsJLyogc29mdHdhcmUgaW5qZWN0IGZsYWdzICovCisJX191MTYgIHBhZDsKKwlfX3UzMiBjcHVpZDsJLyogQ1BVSUQgMSBFQVggKi8KKwlfX3U4ICBjczsJCS8qIGNvZGUgc2VnbWVudCAqLworCV9fdTggIGJhbms7CS8qIG1hY2hpbmUgY2hlY2sgYmFuayAqLworCV9fdTggIGNwdTsJLyogY3B1IG51bWJlcjsgb2Jzb2xldGU7IHVzZSBleHRjcHUgbm93ICovCisJX191OCAgZmluaXNoZWQ7ICAgLyogZW50cnkgaXMgdmFsaWQgKi8KKwlfX3UzMiBleHRjcHU7CS8qIGxpbnV4IGNwdSBudW1iZXIgdGhhdCBkZXRlY3RlZCB0aGUgZXJyb3IgKi8KKwlfX3UzMiBzb2NrZXRpZDsJLyogQ1BVIHNvY2tldCBJRCAqLworCV9fdTMyIGFwaWNpZDsJLyogQ1BVIGluaXRpYWwgYXBpYyBJRCAqLworCV9fdTY0IG1jZ2NhcDsJLyogTUNHQ0FQIE1TUjogbWFjaGluZSBjaGVjayBjYXBhYmlsaXRpZXMgb2YgQ1BVICovCisJX191NjQgYXV4MDsJLyogbW9kZWwgc3BlY2lmaWMgKi8KKwlfX3U2NCBhdXgxOwkvKiBtb2RlbCBzcGVjaWZpYyAqLworfTsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBkYXRhIHJlbGF0ZWQgdG8gdGhlIE1DRSBsb2cuICBBbHNvCisgKiBjYXJyaWVzIGEgc2lnbmF0dXJlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGZpbmQgZnJvbSBleHRlcm5hbAorICogZGVidWdnaW5nIHRvb2xzLiAgRWFjaCBlbnRyeSBpcyBvbmx5IHZhbGlkIHdoZW4gaXRzIGZpbmlzaGVkIGZsYWcKKyAqIGlzIHNldC4KKyAqLworCisjZGVmaW5lIE1DRV9MT0dfTEVOIDMyCisKK3N0cnVjdCBtY2VfbG9nIHsKKwljaGFyIHNpZ25hdHVyZVsxMl07IC8qICJNQUNISU5FQ0hFQ0siICovCisJdW5zaWduZWQgbGVuOwkgICAgLyogPSBNQ0VfTE9HX0xFTiAqLworCXVuc2lnbmVkIG5leHQ7CisJdW5zaWduZWQgZmxhZ3M7CisJdW5zaWduZWQgcmVjb3JkbGVuOwkvKiBsZW5ndGggb2Ygc3RydWN0IG1jZSAqLworCXN0cnVjdCBtY2UgZW50cnlbTUNFX0xPR19MRU5dOworfTsKKworI2RlZmluZSBNQ0VfT1ZFUkZMT1cgMAkJLyogYml0IDAgaW4gZmxhZ3MgbWVhbnMgb3ZlcmZsb3cgKi8KKworI2RlZmluZSBNQ0VfTE9HX1NJR05BVFVSRQkiTUFDSElORUNIRUNLIgorCisjZGVmaW5lIE1DRV9HRVRfUkVDT1JEX0xFTiAgIF9JT1IoJ00nLCAxLCBpbnQpCisjZGVmaW5lIE1DRV9HRVRfTE9HX0xFTiAgICAgIF9JT1IoJ00nLCAyLCBpbnQpCisjZGVmaW5lIE1DRV9HRVRDTEVBUl9GTEFHUyAgIF9JT1IoJ00nLCAzLCBpbnQpCisKKy8qIFNvZnR3YXJlIGRlZmluZWQgYmFua3MgKi8KKyNkZWZpbmUgTUNFX0VYVEVOREVEX0JBTksJMTI4CisjZGVmaW5lIE1DRV9USEVSTUFMX0JBTksJTUNFX0VYVEVOREVEX0JBTksgKyAwCisKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQVNFICAgICAgKE1DRV9FWFRFTkRFRF9CQU5LICsgMSkgICAgICAvKiBNQ0VfQU1EICovCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFOS18wICAgIChNQ0VfVEhSRVNIT0xEX0JBU0UgKyAwICogOSkKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQU5LXzEgICAgKE1DRV9USFJFU0hPTERfQkFTRSArIDEgKiA5KQorI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBTktfMiAgICAoTUNFX1RIUkVTSE9MRF9CQVNFICsgMiAqIDkpCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFOS18zICAgIChNQ0VfVEhSRVNIT0xEX0JBU0UgKyAzICogOSkKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQU5LXzQgICAgKE1DRV9USFJFU0hPTERfQkFTRSArIDQgKiA5KQorI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBTktfNSAgICAoTUNFX1RIUkVTSE9MRF9CQVNFICsgNSAqIDkpCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfRFJBTV9FQ0MgIChNQ0VfVEhSRVNIT0xEX0JBTktfNCArIDApCisKKworI2VuZGlmIC8qIF9BU01fWDg2X01DRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL21tYW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5M2U1MWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL21tYW4uaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX0FTTV9YODZfTU1BTl9ICisjZGVmaW5lIF9BU01fWDg2X01NQU5fSAorCisjZGVmaW5lIE1BUF8zMkJJVAkweDQwCQkvKiBvbmx5IGdpdmUgb3V0IDMyYml0IGFkZHJlc3NlcyAqLworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW1hbi5oPgorCisjZW5kaWYgLyogX0FTTV9YODZfTU1BTl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL21zZ2J1Zi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9tc2didWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDkxMzRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9tc2didWYuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbXNnYnVmLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL21zci1pbmRleC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9tc3ItaW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjk2MmQ5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9tc3ItaW5kZXguaApAQCAtMCwwICsxLDQ2NSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9NU1JfSU5ERVhfSAorI2RlZmluZSBfQVNNX1g4Nl9NU1JfSU5ERVhfSAorCisvKiBDUFUgbW9kZWwgc3BlY2lmaWMgcmVnaXN0ZXIgKE1TUikgbnVtYmVycyAqLworCisvKiB4ODYtNjQgc3BlY2lmaWMgTVNScyAqLworI2RlZmluZSBNU1JfRUZFUgkJMHhjMDAwMDA4MCAvKiBleHRlbmRlZCBmZWF0dXJlIHJlZ2lzdGVyICovCisjZGVmaW5lIE1TUl9TVEFSCQkweGMwMDAwMDgxIC8qIGxlZ2FjeSBtb2RlIFNZU0NBTEwgdGFyZ2V0ICovCisjZGVmaW5lIE1TUl9MU1RBUgkJMHhjMDAwMDA4MiAvKiBsb25nIG1vZGUgU1lTQ0FMTCB0YXJnZXQgKi8KKyNkZWZpbmUgTVNSX0NTVEFSCQkweGMwMDAwMDgzIC8qIGNvbXBhdCBtb2RlIFNZU0NBTEwgdGFyZ2V0ICovCisjZGVmaW5lIE1TUl9TWVNDQUxMX01BU0sJMHhjMDAwMDA4NCAvKiBFRkxBR1MgbWFzayBmb3Igc3lzY2FsbCAqLworI2RlZmluZSBNU1JfRlNfQkFTRQkJMHhjMDAwMDEwMCAvKiA2NGJpdCBGUyBiYXNlICovCisjZGVmaW5lIE1TUl9HU19CQVNFCQkweGMwMDAwMTAxIC8qIDY0Yml0IEdTIGJhc2UgKi8KKyNkZWZpbmUgTVNSX0tFUk5FTF9HU19CQVNFCTB4YzAwMDAxMDIgLyogU3dhcEdTIEdTIHNoYWRvdyAqLworI2RlZmluZSBNU1JfVFNDX0FVWAkJMHhjMDAwMDEwMyAvKiBBdXhpbGlhcnkgVFNDICovCisKKy8qIEVGRVIgYml0czogKi8KKyNkZWZpbmUgX0VGRVJfU0NFCQkwICAvKiBTWVNDQUxML1NZU1JFVCAqLworI2RlZmluZSBfRUZFUl9MTUUJCTggIC8qIExvbmcgbW9kZSBlbmFibGUgKi8KKyNkZWZpbmUgX0VGRVJfTE1BCQkxMCAvKiBMb25nIG1vZGUgYWN0aXZlIChyZWFkLW9ubHkpICovCisjZGVmaW5lIF9FRkVSX05YCQkxMSAvKiBObyBleGVjdXRlIGVuYWJsZSAqLworI2RlZmluZSBfRUZFUl9TVk1FCQkxMiAvKiBFbmFibGUgdmlydHVhbGl6YXRpb24gKi8KKyNkZWZpbmUgX0VGRVJfTE1TTEUJCTEzIC8qIExvbmcgTW9kZSBTZWdtZW50IExpbWl0IEVuYWJsZSAqLworI2RlZmluZSBfRUZFUl9GRlhTUgkJMTQgLyogRW5hYmxlIEZhc3QgRlhTQVZFL0ZYUlNUT1IgKi8KKworI2RlZmluZSBFRkVSX1NDRQkJKDE8PF9FRkVSX1NDRSkKKyNkZWZpbmUgRUZFUl9MTUUJCSgxPDxfRUZFUl9MTUUpCisjZGVmaW5lIEVGRVJfTE1BCQkoMTw8X0VGRVJfTE1BKQorI2RlZmluZSBFRkVSX05YCQkJKDE8PF9FRkVSX05YKQorI2RlZmluZSBFRkVSX1NWTUUJCSgxPDxfRUZFUl9TVk1FKQorI2RlZmluZSBFRkVSX0xNU0xFCQkoMTw8X0VGRVJfTE1TTEUpCisjZGVmaW5lIEVGRVJfRkZYU1IJCSgxPDxfRUZFUl9GRlhTUikKKworLyogSW50ZWwgTVNScy4gU29tZSBhbHNvIGF2YWlsYWJsZSBvbiBvdGhlciBDUFVzICovCisjZGVmaW5lIE1TUl9JQTMyX1BFUkZDVFIwCQkweDAwMDAwMGMxCisjZGVmaW5lIE1TUl9JQTMyX1BFUkZDVFIxCQkweDAwMDAwMGMyCisjZGVmaW5lIE1TUl9GU0JfRlJFUQkJCTB4MDAwMDAwY2QKKworI2RlZmluZSBNU1JfTkhNX1NOQl9QS0dfQ1NUX0NGR19DVEwJMHgwMDAwMDBlMgorI2RlZmluZSBOSE1fQzNfQVVUT19ERU1PVEUJCSgxVUwgPDwgMjUpCisjZGVmaW5lIE5ITV9DMV9BVVRPX0RFTU9URQkJKDFVTCA8PCAyNikKKyNkZWZpbmUgQVRNX0xOQ19DNl9BVVRPX0RFTU9URQkJKDFVTCA8PCAyNSkKKworI2RlZmluZSBNU1JfTVRSUmNhcAkJCTB4MDAwMDAwZmUKKyNkZWZpbmUgTVNSX0lBMzJfQkJMX0NSX0NUTAkJMHgwMDAwMDExOQorI2RlZmluZSBNU1JfSUEzMl9CQkxfQ1JfQ1RMMwkJMHgwMDAwMDExZQorCisjZGVmaW5lIE1TUl9JQTMyX1NZU0VOVEVSX0NTCQkweDAwMDAwMTc0CisjZGVmaW5lIE1TUl9JQTMyX1NZU0VOVEVSX0VTUAkJMHgwMDAwMDE3NQorI2RlZmluZSBNU1JfSUEzMl9TWVNFTlRFUl9FSVAJCTB4MDAwMDAxNzYKKworI2RlZmluZSBNU1JfSUEzMl9NQ0dfQ0FQCQkweDAwMDAwMTc5CisjZGVmaW5lIE1TUl9JQTMyX01DR19TVEFUVVMJCTB4MDAwMDAxN2EKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0NUTAkJMHgwMDAwMDE3YgorCisjZGVmaW5lIE1TUl9PRkZDT1JFX1JTUF8wCQkweDAwMDAwMWE2CisjZGVmaW5lIE1TUl9PRkZDT1JFX1JTUF8xCQkweDAwMDAwMWE3CisKKyNkZWZpbmUgTVNSX0lBMzJfUEVCU19FTkFCTEUJCTB4MDAwMDAzZjEKKyNkZWZpbmUgTVNSX0lBMzJfRFNfQVJFQQkJMHgwMDAwMDYwMAorI2RlZmluZSBNU1JfSUEzMl9QRVJGX0NBUEFCSUxJVElFUwkweDAwMDAwMzQ1CisKKyNkZWZpbmUgTVNSX01UUlJmaXg2NEtfMDAwMDAJCTB4MDAwMDAyNTAKKyNkZWZpbmUgTVNSX01UUlJmaXgxNktfODAwMDAJCTB4MDAwMDAyNTgKKyNkZWZpbmUgTVNSX01UUlJmaXgxNktfQTAwMDAJCTB4MDAwMDAyNTkKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19DMDAwMAkJMHgwMDAwMDI2OAorI2RlZmluZSBNU1JfTVRSUmZpeDRLX0M4MDAwCQkweDAwMDAwMjY5CisjZGVmaW5lIE1TUl9NVFJSZml4NEtfRDAwMDAJCTB4MDAwMDAyNmEKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19EODAwMAkJMHgwMDAwMDI2YgorI2RlZmluZSBNU1JfTVRSUmZpeDRLX0UwMDAwCQkweDAwMDAwMjZjCisjZGVmaW5lIE1TUl9NVFJSZml4NEtfRTgwMDAJCTB4MDAwMDAyNmQKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19GMDAwMAkJMHgwMDAwMDI2ZQorI2RlZmluZSBNU1JfTVRSUmZpeDRLX0Y4MDAwCQkweDAwMDAwMjZmCisjZGVmaW5lIE1TUl9NVFJSZGVmVHlwZQkJCTB4MDAwMDAyZmYKKworI2RlZmluZSBNU1JfSUEzMl9DUl9QQVQJCQkweDAwMDAwMjc3CisKKyNkZWZpbmUgTVNSX0lBMzJfREVCVUdDVExNU1IJCTB4MDAwMDAxZDkKKyNkZWZpbmUgTVNSX0lBMzJfTEFTVEJSQU5DSEZST01JUAkweDAwMDAwMWRiCisjZGVmaW5lIE1TUl9JQTMyX0xBU1RCUkFOQ0hUT0lQCQkweDAwMDAwMWRjCisjZGVmaW5lIE1TUl9JQTMyX0xBU1RJTlRGUk9NSVAJCTB4MDAwMDAxZGQKKyNkZWZpbmUgTVNSX0lBMzJfTEFTVElOVFRPSVAJCTB4MDAwMDAxZGUKKworLyogREVCVUdDVExNU1IgYml0cyAob3RoZXJzIHZhcnkgYnkgbW9kZWwpOiAqLworI2RlZmluZSBERUJVR0NUTE1TUl9MQlIJCQkoMVVMIDw8ICAwKSAvKiBsYXN0IGJyYW5jaCByZWNvcmRpbmcgKi8KKyNkZWZpbmUgREVCVUdDVExNU1JfQlRGCQkJKDFVTCA8PCAgMSkgLyogc2luZ2xlLXN0ZXAgb24gYnJhbmNoZXMgKi8KKyNkZWZpbmUgREVCVUdDVExNU1JfVFIJCQkoMVVMIDw8ICA2KQorI2RlZmluZSBERUJVR0NUTE1TUl9CVFMJCQkoMVVMIDw8ICA3KQorI2RlZmluZSBERUJVR0NUTE1TUl9CVElOVAkJKDFVTCA8PCAgOCkKKyNkZWZpbmUgREVCVUdDVExNU1JfQlRTX09GRl9PUwkJKDFVTCA8PCAgOSkKKyNkZWZpbmUgREVCVUdDVExNU1JfQlRTX09GRl9VU1IJCSgxVUwgPDwgMTApCisjZGVmaW5lIERFQlVHQ1RMTVNSX0ZSRUVaRV9MQlJTX09OX1BNSQkoMVVMIDw8IDExKQorCisjZGVmaW5lIE1TUl9JQTMyX01DMF9DVEwJCTB4MDAwMDA0MDAKKyNkZWZpbmUgTVNSX0lBMzJfTUMwX1NUQVRVUwkJMHgwMDAwMDQwMQorI2RlZmluZSBNU1JfSUEzMl9NQzBfQUREUgkJMHgwMDAwMDQwMgorI2RlZmluZSBNU1JfSUEzMl9NQzBfTUlTQwkJMHgwMDAwMDQwMworCisjZGVmaW5lIE1TUl9BTUQ2NF9NQzBfTUFTSwkJMHhjMDAxMDA0NAorCisjZGVmaW5lIE1TUl9JQTMyX01DeF9DVEwoeCkJCShNU1JfSUEzMl9NQzBfQ1RMICsgNCooeCkpCisjZGVmaW5lIE1TUl9JQTMyX01DeF9TVEFUVVMoeCkJCShNU1JfSUEzMl9NQzBfU1RBVFVTICsgNCooeCkpCisjZGVmaW5lIE1TUl9JQTMyX01DeF9BRERSKHgpCQkoTVNSX0lBMzJfTUMwX0FERFIgKyA0Kih4KSkKKyNkZWZpbmUgTVNSX0lBMzJfTUN4X01JU0MoeCkJCShNU1JfSUEzMl9NQzBfTUlTQyArIDQqKHgpKQorCisjZGVmaW5lIE1TUl9BTUQ2NF9NQ3hfTUFTSyh4KQkJKE1TUl9BTUQ2NF9NQzBfTUFTSyArICh4KSkKKworLyogVGhlc2UgYXJlIGNvbnNlY3V0aXZlIGFuZCBub3QgaW4gdGhlIG5vcm1hbCA0ZXIgTUNFIGJhbmsgYmxvY2sgKi8KKyNkZWZpbmUgTVNSX0lBMzJfTUMwX0NUTDIJCTB4MDAwMDAyODAKKyNkZWZpbmUgTVNSX0lBMzJfTUN4X0NUTDIoeCkJCShNU1JfSUEzMl9NQzBfQ1RMMiArICh4KSkKKworI2RlZmluZSBNU1JfUDZfUEVSRkNUUjAJCQkweDAwMDAwMGMxCisjZGVmaW5lIE1TUl9QNl9QRVJGQ1RSMQkJCTB4MDAwMDAwYzIKKyNkZWZpbmUgTVNSX1A2X0VWTlRTRUwwCQkJMHgwMDAwMDE4NgorI2RlZmluZSBNU1JfUDZfRVZOVFNFTDEJCQkweDAwMDAwMTg3CisKKy8qIEFNRDY0IE1TUnMuIE5vdCBjb21wbGV0ZS4gU2VlIHRoZSBhcmNoaXRlY3R1cmUgbWFudWFsIGZvciBhIG1vcmUKKyAgIGNvbXBsZXRlIGxpc3QuICovCisKKyNkZWZpbmUgTVNSX0FNRDY0X1BBVENIX0xFVkVMCQkweDAwMDAwMDhiCisjZGVmaW5lIE1TUl9BTUQ2NF9UU0NfUkFUSU8JCTB4YzAwMDAxMDQKKyNkZWZpbmUgTVNSX0FNRDY0X05CX0NGRwkJMHhjMDAxMDAxZgorI2RlZmluZSBNU1JfQU1ENjRfUEFUQ0hfTE9BREVSCQkweGMwMDEwMDIwCisjZGVmaW5lIE1TUl9BTUQ2NF9PU1ZXX0lEX0xFTkdUSAkweGMwMDEwMTQwCisjZGVmaW5lIE1TUl9BTUQ2NF9PU1ZXX1NUQVRVUwkJMHhjMDAxMDE0MQorI2RlZmluZSBNU1JfQU1ENjRfRENfQ0ZHCQkweGMwMDExMDIyCisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNGRVRDSENUTAkJMHhjMDAxMTAzMAorI2RlZmluZSBNU1JfQU1ENjRfSUJTRkVUQ0hMSU5BRAkJMHhjMDAxMTAzMQorI2RlZmluZSBNU1JfQU1ENjRfSUJTRkVUQ0hQSFlTQUQJMHhjMDAxMTAzMgorI2RlZmluZSBNU1JfQU1ENjRfSUJTT1BDVEwJCTB4YzAwMTEwMzMKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU09QUklQCQkweGMwMDExMDM0CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNPUERBVEEJCTB4YzAwMTEwMzUKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU09QREFUQTIJCTB4YzAwMTEwMzYKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU09QREFUQTMJCTB4YzAwMTEwMzcKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU0RDTElOQUQJCTB4YzAwMTEwMzgKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU0RDUEhZU0FECQkweGMwMDExMDM5CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNDVEwJCTB4YzAwMTEwM2EKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU0JSVEFSR0VUCQkweGMwMDExMDNiCisKKy8qIEZhbSAxNWggTVNScyAqLworI2RlZmluZSBNU1JfRjE1SF9QRVJGX0NUTAkJMHhjMDAxMDIwMAorI2RlZmluZSBNU1JfRjE1SF9QRVJGX0NUUgkJMHhjMDAxMDIwMQorCisvKiBGYW0gMTBoIE1TUnMgKi8KKyNkZWZpbmUgTVNSX0ZBTTEwSF9NTUlPX0NPTkZfQkFTRQkweGMwMDEwMDU4CisjZGVmaW5lIEZBTTEwSF9NTUlPX0NPTkZfRU5BQkxFCQkoMTw8MCkKKyNkZWZpbmUgRkFNMTBIX01NSU9fQ09ORl9CVVNSQU5HRV9NQVNLCTB4ZgorI2RlZmluZSBGQU0xMEhfTU1JT19DT05GX0JVU1JBTkdFX1NISUZUIDIKKyNkZWZpbmUgRkFNMTBIX01NSU9fQ09ORl9CQVNFX01BU0sJMHhmZmZmZmZmVUxMCisjZGVmaW5lIEZBTTEwSF9NTUlPX0NPTkZfQkFTRV9TSElGVAkyMAorI2RlZmluZSBNU1JfRkFNMTBIX05PREVfSUQJCTB4YzAwMTEwMGMKKworLyogSzggTVNScyAqLworI2RlZmluZSBNU1JfSzhfVE9QX01FTTEJCQkweGMwMDEwMDFhCisjZGVmaW5lIE1TUl9LOF9UT1BfTUVNMgkJCTB4YzAwMTAwMWQKKyNkZWZpbmUgTVNSX0s4X1NZU0NGRwkJCTB4YzAwMTAwMTAKKyNkZWZpbmUgTVNSX0s4X0lOVF9QRU5ESU5HX01TRwkJMHhjMDAxMDA1NQorLyogQzFFIGFjdGl2ZSBiaXRzIGluIGludCBwZW5kaW5nIG1lc3NhZ2UgKi8KKyNkZWZpbmUgSzhfSU5UUF9DMUVfQUNUSVZFX01BU0sJCTB4MTgwMDAwMDAKKyNkZWZpbmUgTVNSX0s4X1RTRUdfQUREUgkJMHhjMDAxMDExMgorI2RlZmluZSBLOF9NVFJSRklYUkFOR0VfRFJBTV9FTkFCTEUJMHgwMDA0MDAwMCAvKiBNdHJyRml4RHJhbUVuIGJpdCAgICAqLworI2RlZmluZSBLOF9NVFJSRklYUkFOR0VfRFJBTV9NT0RJRlkJMHgwMDA4MDAwMCAvKiBNdHJyRml4RHJhbU1vZEVuIGJpdCAqLworI2RlZmluZSBLOF9NVFJSX1JETUVNX1dSTUVNX01BU0sJMHgxODE4MTgxOCAvKiBNYXNrOiBSZE1lbXxXck1lbSAgICAqLworCisvKiBLNyBNU1JzICovCisjZGVmaW5lIE1TUl9LN19FVk5UU0VMMAkJCTB4YzAwMTAwMDAKKyNkZWZpbmUgTVNSX0s3X1BFUkZDVFIwCQkJMHhjMDAxMDAwNAorI2RlZmluZSBNU1JfSzdfRVZOVFNFTDEJCQkweGMwMDEwMDAxCisjZGVmaW5lIE1TUl9LN19QRVJGQ1RSMQkJCTB4YzAwMTAwMDUKKyNkZWZpbmUgTVNSX0s3X0VWTlRTRUwyCQkJMHhjMDAxMDAwMgorI2RlZmluZSBNU1JfSzdfUEVSRkNUUjIJCQkweGMwMDEwMDA2CisjZGVmaW5lIE1TUl9LN19FVk5UU0VMMwkJCTB4YzAwMTAwMDMKKyNkZWZpbmUgTVNSX0s3X1BFUkZDVFIzCQkJMHhjMDAxMDAwNworI2RlZmluZSBNU1JfSzdfQ0xLX0NUTAkJCTB4YzAwMTAwMWIKKyNkZWZpbmUgTVNSX0s3X0hXQ1IJCQkweGMwMDEwMDE1CisjZGVmaW5lIE1TUl9LN19GSURfVklEX0NUTAkJMHhjMDAxMDA0MQorI2RlZmluZSBNU1JfSzdfRklEX1ZJRF9TVEFUVVMJCTB4YzAwMTAwNDIKKworLyogSzYgTVNScyAqLworI2RlZmluZSBNU1JfSzZfV0hDUgkJCTB4YzAwMDAwODIKKyNkZWZpbmUgTVNSX0s2X1VXQ0NSCQkJMHhjMDAwMDA4NQorI2RlZmluZSBNU1JfSzZfRVBNUgkJCTB4YzAwMDAwODYKKyNkZWZpbmUgTVNSX0s2X1BTT1IJCQkweGMwMDAwMDg3CisjZGVmaW5lIE1TUl9LNl9QRklSCQkJMHhjMDAwMDA4OAorCisvKiBDZW50YXVyLUhhdWxzL0lEVCBkZWZpbmVkIE1TUnMuICovCisjZGVmaW5lIE1TUl9JRFRfRkNSMQkJCTB4MDAwMDAxMDcKKyNkZWZpbmUgTVNSX0lEVF9GQ1IyCQkJMHgwMDAwMDEwOAorI2RlZmluZSBNU1JfSURUX0ZDUjMJCQkweDAwMDAwMTA5CisjZGVmaW5lIE1TUl9JRFRfRkNSNAkJCTB4MDAwMDAxMGEKKworI2RlZmluZSBNU1JfSURUX01DUjAJCQkweDAwMDAwMTEwCisjZGVmaW5lIE1TUl9JRFRfTUNSMQkJCTB4MDAwMDAxMTEKKyNkZWZpbmUgTVNSX0lEVF9NQ1IyCQkJMHgwMDAwMDExMgorI2RlZmluZSBNU1JfSURUX01DUjMJCQkweDAwMDAwMTEzCisjZGVmaW5lIE1TUl9JRFRfTUNSNAkJCTB4MDAwMDAxMTQKKyNkZWZpbmUgTVNSX0lEVF9NQ1I1CQkJMHgwMDAwMDExNQorI2RlZmluZSBNU1JfSURUX01DUjYJCQkweDAwMDAwMTE2CisjZGVmaW5lIE1TUl9JRFRfTUNSNwkJCTB4MDAwMDAxMTcKKyNkZWZpbmUgTVNSX0lEVF9NQ1JfQ1RSTAkJMHgwMDAwMDEyMAorCisvKiBWSUEgQ3lyaXggZGVmaW5lZCBNU1JzKi8KKyNkZWZpbmUgTVNSX1ZJQV9GQ1IJCQkweDAwMDAxMTA3CisjZGVmaW5lIE1TUl9WSUFfTE9OR0hBVUwJCTB4MDAwMDExMGEKKyNkZWZpbmUgTVNSX1ZJQV9STkcJCQkweDAwMDAxMTBiCisjZGVmaW5lIE1TUl9WSUFfQkNSMgkJCTB4MDAwMDExNDcKKworLyogVHJhbnNtZXRhIGRlZmluZWQgTVNScyAqLworI2RlZmluZSBNU1JfVE1UQV9MT05HUlVOX0NUUkwJCTB4ODA4NjgwMTAKKyNkZWZpbmUgTVNSX1RNVEFfTE9OR1JVTl9GTEFHUwkJMHg4MDg2ODAxMQorI2RlZmluZSBNU1JfVE1UQV9MUlRJX1JFQURPVVQJCTB4ODA4NjgwMTgKKyNkZWZpbmUgTVNSX1RNVEFfTFJUSV9WT0xUX01IWgkJMHg4MDg2ODAxYQorCisvKiBJbnRlbCBkZWZpbmVkIE1TUnMuICovCisjZGVmaW5lIE1TUl9JQTMyX1A1X01DX0FERFIJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTVNSX0lBMzJfUDVfTUNfVFlQRQkJMHgwMDAwMDAwMQorI2RlZmluZSBNU1JfSUEzMl9UU0MJCQkweDAwMDAwMDEwCisjZGVmaW5lIE1TUl9JQTMyX1BMQVRGT1JNX0lECQkweDAwMDAwMDE3CisjZGVmaW5lIE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OCQkweDAwMDAwMDJhCisjZGVmaW5lIE1TUl9FQkNfRlJFUVVFTkNZX0lECQkweDAwMDAwMDJjCisjZGVmaW5lIE1TUl9JQTMyX0ZFQVRVUkVfQ09OVFJPTCAgICAgICAgMHgwMDAwMDAzYQorCisjZGVmaW5lIEZFQVRVUkVfQ09OVFJPTF9MT0NLRUQJCQkJKDE8PDApCisjZGVmaW5lIEZFQVRVUkVfQ09OVFJPTF9WTVhPTl9FTkFCTEVEX0lOU0lERV9TTVgJKDE8PDEpCisjZGVmaW5lIEZFQVRVUkVfQ09OVFJPTF9WTVhPTl9FTkFCTEVEX09VVFNJREVfU01YCSgxPDwyKQorCisjZGVmaW5lIE1TUl9JQTMyX0FQSUNCQVNFCQkweDAwMDAwMDFiCisjZGVmaW5lIE1TUl9JQTMyX0FQSUNCQVNFX0JTUAkJKDE8PDgpCisjZGVmaW5lIE1TUl9JQTMyX0FQSUNCQVNFX0VOQUJMRQkoMTw8MTEpCisjZGVmaW5lIE1TUl9JQTMyX0FQSUNCQVNFX0JBU0UJCSgweGZmZmZmPDwxMikKKworI2RlZmluZSBNU1JfSUEzMl9UU0NERUFETElORQkJMHgwMDAwMDZlMAorCisjZGVmaW5lIE1TUl9JQTMyX1VDT0RFX1dSSVRFCQkweDAwMDAwMDc5CisjZGVmaW5lIE1TUl9JQTMyX1VDT0RFX1JFVgkJMHgwMDAwMDA4YgorCisjZGVmaW5lIE1TUl9JQTMyX1BFUkZfU1RBVFVTCQkweDAwMDAwMTk4CisjZGVmaW5lIE1TUl9JQTMyX1BFUkZfQ1RMCQkweDAwMDAwMTk5CisKKyNkZWZpbmUgTVNSX0lBMzJfTVBFUkYJCQkweDAwMDAwMGU3CisjZGVmaW5lIE1TUl9JQTMyX0FQRVJGCQkJMHgwMDAwMDBlOAorCisjZGVmaW5lIE1TUl9JQTMyX1RIRVJNX0NPTlRST0wJCTB4MDAwMDAxOWEKKyNkZWZpbmUgTVNSX0lBMzJfVEhFUk1fSU5URVJSVVBUCTB4MDAwMDAxOWIKKworI2RlZmluZSBUSEVSTV9JTlRfSElHSF9FTkFCTEUJCSgxIDw8IDApCisjZGVmaW5lIFRIRVJNX0lOVF9MT1dfRU5BQkxFCQkoMSA8PCAxKQorI2RlZmluZSBUSEVSTV9JTlRfUExOX0VOQUJMRQkJKDEgPDwgMjQpCisKKyNkZWZpbmUgTVNSX0lBMzJfVEhFUk1fU1RBVFVTCQkweDAwMDAwMTljCisKKyNkZWZpbmUgVEhFUk1fU1RBVFVTX1BST0NIT1QJCSgxIDw8IDApCisjZGVmaW5lIFRIRVJNX1NUQVRVU19QT1dFUl9MSU1JVAkoMSA8PCAxMCkKKworI2RlZmluZSBNU1JfVEhFUk0yX0NUTAkJCTB4MDAwMDAxOWQKKworI2RlZmluZSBNU1JfVEhFUk0yX0NUTF9UTV9TRUxFQ1QJKDFVTEwgPDwgMTYpCisKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEUJCTB4MDAwMDAxYTAKKworI2RlZmluZSBNU1JfSUEzMl9URU1QRVJBVFVSRV9UQVJHRVQJMHgwMDAwMDFhMgorCisjZGVmaW5lIE1TUl9JQTMyX0VORVJHWV9QRVJGX0JJQVMJMHgwMDAwMDFiMAorI2RlZmluZSBFTkVSR1lfUEVSRl9CSUFTX1BFUkZPUk1BTkNFCTAKKyNkZWZpbmUgRU5FUkdZX1BFUkZfQklBU19OT1JNQUwJCTYKKyNkZWZpbmUgRU5FUkdZX1BFUkZfQklBU19QT1dFUlNBVkUJMTUKKworI2RlZmluZSBNU1JfSUEzMl9QQUNLQUdFX1RIRVJNX1NUQVRVUwkJMHgwMDAwMDFiMQorCisjZGVmaW5lIFBBQ0tBR0VfVEhFUk1fU1RBVFVTX1BST0NIT1QJCSgxIDw8IDApCisjZGVmaW5lIFBBQ0tBR0VfVEhFUk1fU1RBVFVTX1BPV0VSX0xJTUlUCSgxIDw8IDEwKQorCisjZGVmaW5lIE1TUl9JQTMyX1BBQ0tBR0VfVEhFUk1fSU5URVJSVVBUCTB4MDAwMDAxYjIKKworI2RlZmluZSBQQUNLQUdFX1RIRVJNX0lOVF9ISUdIX0VOQUJMRQkJKDEgPDwgMCkKKyNkZWZpbmUgUEFDS0FHRV9USEVSTV9JTlRfTE9XX0VOQUJMRQkJKDEgPDwgMSkKKyNkZWZpbmUgUEFDS0FHRV9USEVSTV9JTlRfUExOX0VOQUJMRQkJKDEgPDwgMjQpCisKKy8qIFRoZXJtYWwgVGhyZXNob2xkcyBTdXBwb3J0ICovCisjZGVmaW5lIFRIRVJNX0lOVF9USFJFU0hPTEQwX0VOQUJMRSAgICAoMSA8PCAxNSkKKyNkZWZpbmUgVEhFUk1fU0hJRlRfVEhSRVNIT0xEMCAgICAgICAgOAorI2RlZmluZSBUSEVSTV9NQVNLX1RIUkVTSE9MRDAgICAgICAgICAgKDB4N2YgPDwgVEhFUk1fU0hJRlRfVEhSRVNIT0xEMCkKKyNkZWZpbmUgVEhFUk1fSU5UX1RIUkVTSE9MRDFfRU5BQkxFICAgICgxIDw8IDIzKQorI2RlZmluZSBUSEVSTV9TSElGVF9USFJFU0hPTEQxICAgICAgICAxNgorI2RlZmluZSBUSEVSTV9NQVNLX1RIUkVTSE9MRDEgICAgICAgICAgKDB4N2YgPDwgVEhFUk1fU0hJRlRfVEhSRVNIT0xEMSkKKyNkZWZpbmUgVEhFUk1fU1RBVFVTX1RIUkVTSE9MRDAgICAgICAgICgxIDw8IDYpCisjZGVmaW5lIFRIRVJNX0xPR19USFJFU0hPTEQwICAgICAgICAgICAoMSA8PCA3KQorI2RlZmluZSBUSEVSTV9TVEFUVVNfVEhSRVNIT0xEMSAgICAgICAgKDEgPDwgOCkKKyNkZWZpbmUgVEhFUk1fTE9HX1RIUkVTSE9MRDEgICAgICAgICAgICgxIDw8IDkpCisKKy8qIE1JU0NfRU5BQkxFIGJpdHM6IGFyY2hpdGVjdHVyYWwgKi8KKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRkFTVF9TVFJJTkcJKDFVTEwgPDwgMCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVENDCQkoMVVMTCA8PCAxKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9FTU9OCQkoMVVMTCA8PCA3KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9CVFNfVU5BVkFJTAkoMVVMTCA8PCAxMSkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfUEVCU19VTkFWQUlMCSgxVUxMIDw8IDEyKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9FTkhBTkNFRF9TUEVFRFNURVAJKDFVTEwgPDwgMTYpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX01XQUlUCQkoMVVMTCA8PCAxOCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTElNSVRfQ1BVSUQJKDFVTEwgPDwgMjIpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1hUUFJfRElTQUJMRQkoMVVMTCA8PCAyMykKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfWERfRElTQUJMRQkJKDFVTEwgPDwgMzQpCisKKy8qIE1JU0NfRU5BQkxFIGJpdHM6IG1vZGVsLXNwZWNpZmljLCBtZWFuaW5nIG1heSB2YXJ5IGZyb20gY29yZSB0byBjb3JlICovCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1g4N19DT01QQVQJCSgxVUxMIDw8IDIpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RNMQkJKDFVTEwgPDwgMykKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1BMSVRfTE9DS19ESVNBQkxFCSgxVUxMIDw8IDQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0wzQ0FDSEVfRElTQUJMRQkoMVVMTCA8PCA2KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9TVVBQUkVTU19MT0NLCSgxVUxMIDw8IDgpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1BSRUZFVENIX0RJU0FCTEUJKDFVTEwgPDwgOSkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRkVSUgkJKDFVTEwgPDwgMTApCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZFUlJfTVVMVElQTEVYCSgxVUxMIDw8IDEwKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9UTTIJCSgxVUxMIDw8IDEzKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9BREpfUFJFRl9ESVNBQkxFCSgxVUxMIDw8IDE5KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9TUEVFRFNURVBfTE9DSwkoMVVMTCA8PCAyMCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTDFEX0NPTlRFWFQJKDFVTEwgPDwgMjQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0RDVV9QUkVGX0RJU0FCTEUJKDFVTEwgPDwgMzcpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RVUkJPX0RJU0FCTEUJKDFVTEwgPDwgMzgpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0lQX1BSRUZfRElTQUJMRQkoMVVMTCA8PCAzOSkKKworLyogUDQvWGVvbisgc3BlY2lmaWMgKi8KKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VBWAkJMHgwMDAwMDE4MAorI2RlZmluZSBNU1JfSUEzMl9NQ0dfRUJYCQkweDAwMDAwMTgxCisjZGVmaW5lIE1TUl9JQTMyX01DR19FQ1gJCTB4MDAwMDAxODIKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VEWAkJMHgwMDAwMDE4MworI2RlZmluZSBNU1JfSUEzMl9NQ0dfRVNJCQkweDAwMDAwMTg0CisjZGVmaW5lIE1TUl9JQTMyX01DR19FREkJCTB4MDAwMDAxODUKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VCUAkJMHgwMDAwMDE4NgorI2RlZmluZSBNU1JfSUEzMl9NQ0dfRVNQCQkweDAwMDAwMTg3CisjZGVmaW5lIE1TUl9JQTMyX01DR19FRkxBR1MJCTB4MDAwMDAxODgKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VJUAkJMHgwMDAwMDE4OQorI2RlZmluZSBNU1JfSUEzMl9NQ0dfUkVTRVJWRUQJCTB4MDAwMDAxOGEKKworLyogUGVudGl1bSBJViBwZXJmb3JtYW5jZSBjb3VudGVyIE1TUnMgKi8KKyNkZWZpbmUgTVNSX1A0X0JQVV9QRVJGQ1RSMAkJMHgwMDAwMDMwMAorI2RlZmluZSBNU1JfUDRfQlBVX1BFUkZDVFIxCQkweDAwMDAwMzAxCisjZGVmaW5lIE1TUl9QNF9CUFVfUEVSRkNUUjIJCTB4MDAwMDAzMDIKKyNkZWZpbmUgTVNSX1A0X0JQVV9QRVJGQ1RSMwkJMHgwMDAwMDMwMworI2RlZmluZSBNU1JfUDRfTVNfUEVSRkNUUjAJCTB4MDAwMDAzMDQKKyNkZWZpbmUgTVNSX1A0X01TX1BFUkZDVFIxCQkweDAwMDAwMzA1CisjZGVmaW5lIE1TUl9QNF9NU19QRVJGQ1RSMgkJMHgwMDAwMDMwNgorI2RlZmluZSBNU1JfUDRfTVNfUEVSRkNUUjMJCTB4MDAwMDAzMDcKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX1BFUkZDVFIwCQkweDAwMDAwMzA4CisjZGVmaW5lIE1TUl9QNF9GTEFNRV9QRVJGQ1RSMQkJMHgwMDAwMDMwOQorI2RlZmluZSBNU1JfUDRfRkxBTUVfUEVSRkNUUjIJCTB4MDAwMDAzMGEKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX1BFUkZDVFIzCQkweDAwMDAwMzBiCisjZGVmaW5lIE1TUl9QNF9JUV9QRVJGQ1RSMAkJMHgwMDAwMDMwYworI2RlZmluZSBNU1JfUDRfSVFfUEVSRkNUUjEJCTB4MDAwMDAzMGQKKyNkZWZpbmUgTVNSX1A0X0lRX1BFUkZDVFIyCQkweDAwMDAwMzBlCisjZGVmaW5lIE1TUl9QNF9JUV9QRVJGQ1RSMwkJMHgwMDAwMDMwZgorI2RlZmluZSBNU1JfUDRfSVFfUEVSRkNUUjQJCTB4MDAwMDAzMTAKKyNkZWZpbmUgTVNSX1A0X0lRX1BFUkZDVFI1CQkweDAwMDAwMzExCisjZGVmaW5lIE1TUl9QNF9CUFVfQ0NDUjAJCTB4MDAwMDAzNjAKKyNkZWZpbmUgTVNSX1A0X0JQVV9DQ0NSMQkJMHgwMDAwMDM2MQorI2RlZmluZSBNU1JfUDRfQlBVX0NDQ1IyCQkweDAwMDAwMzYyCisjZGVmaW5lIE1TUl9QNF9CUFVfQ0NDUjMJCTB4MDAwMDAzNjMKKyNkZWZpbmUgTVNSX1A0X01TX0NDQ1IwCQkJMHgwMDAwMDM2NAorI2RlZmluZSBNU1JfUDRfTVNfQ0NDUjEJCQkweDAwMDAwMzY1CisjZGVmaW5lIE1TUl9QNF9NU19DQ0NSMgkJCTB4MDAwMDAzNjYKKyNkZWZpbmUgTVNSX1A0X01TX0NDQ1IzCQkJMHgwMDAwMDM2NworI2RlZmluZSBNU1JfUDRfRkxBTUVfQ0NDUjAJCTB4MDAwMDAzNjgKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX0NDQ1IxCQkweDAwMDAwMzY5CisjZGVmaW5lIE1TUl9QNF9GTEFNRV9DQ0NSMgkJMHgwMDAwMDM2YQorI2RlZmluZSBNU1JfUDRfRkxBTUVfQ0NDUjMJCTB4MDAwMDAzNmIKKyNkZWZpbmUgTVNSX1A0X0lRX0NDQ1IwCQkJMHgwMDAwMDM2YworI2RlZmluZSBNU1JfUDRfSVFfQ0NDUjEJCQkweDAwMDAwMzZkCisjZGVmaW5lIE1TUl9QNF9JUV9DQ0NSMgkJCTB4MDAwMDAzNmUKKyNkZWZpbmUgTVNSX1A0X0lRX0NDQ1IzCQkJMHgwMDAwMDM2ZgorI2RlZmluZSBNU1JfUDRfSVFfQ0NDUjQJCQkweDAwMDAwMzcwCisjZGVmaW5lIE1TUl9QNF9JUV9DQ0NSNQkJCTB4MDAwMDAzNzEKKyNkZWZpbmUgTVNSX1A0X0FMRl9FU0NSMAkJMHgwMDAwMDNjYQorI2RlZmluZSBNU1JfUDRfQUxGX0VTQ1IxCQkweDAwMDAwM2NiCisjZGVmaW5lIE1TUl9QNF9CUFVfRVNDUjAJCTB4MDAwMDAzYjIKKyNkZWZpbmUgTVNSX1A0X0JQVV9FU0NSMQkJMHgwMDAwMDNiMworI2RlZmluZSBNU1JfUDRfQlNVX0VTQ1IwCQkweDAwMDAwM2EwCisjZGVmaW5lIE1TUl9QNF9CU1VfRVNDUjEJCTB4MDAwMDAzYTEKKyNkZWZpbmUgTVNSX1A0X0NSVV9FU0NSMAkJMHgwMDAwMDNiOAorI2RlZmluZSBNU1JfUDRfQ1JVX0VTQ1IxCQkweDAwMDAwM2I5CisjZGVmaW5lIE1TUl9QNF9DUlVfRVNDUjIJCTB4MDAwMDAzY2MKKyNkZWZpbmUgTVNSX1A0X0NSVV9FU0NSMwkJMHgwMDAwMDNjZAorI2RlZmluZSBNU1JfUDRfQ1JVX0VTQ1I0CQkweDAwMDAwM2UwCisjZGVmaW5lIE1TUl9QNF9DUlVfRVNDUjUJCTB4MDAwMDAzZTEKKyNkZWZpbmUgTVNSX1A0X0RBQ19FU0NSMAkJMHgwMDAwMDNhOAorI2RlZmluZSBNU1JfUDRfREFDX0VTQ1IxCQkweDAwMDAwM2E5CisjZGVmaW5lIE1TUl9QNF9GSVJNX0VTQ1IwCQkweDAwMDAwM2E0CisjZGVmaW5lIE1TUl9QNF9GSVJNX0VTQ1IxCQkweDAwMDAwM2E1CisjZGVmaW5lIE1TUl9QNF9GTEFNRV9FU0NSMAkJMHgwMDAwMDNhNgorI2RlZmluZSBNU1JfUDRfRkxBTUVfRVNDUjEJCTB4MDAwMDAzYTcKKyNkZWZpbmUgTVNSX1A0X0ZTQl9FU0NSMAkJMHgwMDAwMDNhMgorI2RlZmluZSBNU1JfUDRfRlNCX0VTQ1IxCQkweDAwMDAwM2EzCisjZGVmaW5lIE1TUl9QNF9JUV9FU0NSMAkJCTB4MDAwMDAzYmEKKyNkZWZpbmUgTVNSX1A0X0lRX0VTQ1IxCQkJMHgwMDAwMDNiYgorI2RlZmluZSBNU1JfUDRfSVNfRVNDUjAJCQkweDAwMDAwM2I0CisjZGVmaW5lIE1TUl9QNF9JU19FU0NSMQkJCTB4MDAwMDAzYjUKKyNkZWZpbmUgTVNSX1A0X0lUTEJfRVNDUjAJCTB4MDAwMDAzYjYKKyNkZWZpbmUgTVNSX1A0X0lUTEJfRVNDUjEJCTB4MDAwMDAzYjcKKyNkZWZpbmUgTVNSX1A0X0lYX0VTQ1IwCQkJMHgwMDAwMDNjOAorI2RlZmluZSBNU1JfUDRfSVhfRVNDUjEJCQkweDAwMDAwM2M5CisjZGVmaW5lIE1TUl9QNF9NT0JfRVNDUjAJCTB4MDAwMDAzYWEKKyNkZWZpbmUgTVNSX1A0X01PQl9FU0NSMQkJMHgwMDAwMDNhYgorI2RlZmluZSBNU1JfUDRfTVNfRVNDUjAJCQkweDAwMDAwM2MwCisjZGVmaW5lIE1TUl9QNF9NU19FU0NSMQkJCTB4MDAwMDAzYzEKKyNkZWZpbmUgTVNSX1A0X1BNSF9FU0NSMAkJMHgwMDAwMDNhYworI2RlZmluZSBNU1JfUDRfUE1IX0VTQ1IxCQkweDAwMDAwM2FkCisjZGVmaW5lIE1TUl9QNF9SQVRfRVNDUjAJCTB4MDAwMDAzYmMKKyNkZWZpbmUgTVNSX1A0X1JBVF9FU0NSMQkJMHgwMDAwMDNiZAorI2RlZmluZSBNU1JfUDRfU0FBVF9FU0NSMAkJMHgwMDAwMDNhZQorI2RlZmluZSBNU1JfUDRfU0FBVF9FU0NSMQkJMHgwMDAwMDNhZgorI2RlZmluZSBNU1JfUDRfU1NVX0VTQ1IwCQkweDAwMDAwM2JlCisjZGVmaW5lIE1TUl9QNF9TU1VfRVNDUjEJCTB4MDAwMDAzYmYgLyogZ3Vlc3M6IG5vdCBpbiBtYW51YWwgKi8KKworI2RlZmluZSBNU1JfUDRfVEJQVV9FU0NSMAkJMHgwMDAwMDNjMgorI2RlZmluZSBNU1JfUDRfVEJQVV9FU0NSMQkJMHgwMDAwMDNjMworI2RlZmluZSBNU1JfUDRfVENfRVNDUjAJCQkweDAwMDAwM2M0CisjZGVmaW5lIE1TUl9QNF9UQ19FU0NSMQkJCTB4MDAwMDAzYzUKKyNkZWZpbmUgTVNSX1A0X1UyTF9FU0NSMAkJMHgwMDAwMDNiMAorI2RlZmluZSBNU1JfUDRfVTJMX0VTQ1IxCQkweDAwMDAwM2IxCisKKyNkZWZpbmUgTVNSX1A0X1BFQlNfTUFUUklYX1ZFUlQJCTB4MDAwMDAzZjIKKworLyogSW50ZWwgQ29yZS1iYXNlZCBDUFUgcGVyZm9ybWFuY2UgY291bnRlcnMgKi8KKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9GSVhFRF9DVFIwCTB4MDAwMDAzMDkKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9GSVhFRF9DVFIxCTB4MDAwMDAzMGEKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9GSVhFRF9DVFIyCTB4MDAwMDAzMGIKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9GSVhFRF9DVFJfQ1RSTAkweDAwMDAwMzhkCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfR0xPQkFMX1NUQVRVUwkweDAwMDAwMzhlCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfR0xPQkFMX0NUUkwJMHgwMDAwMDM4ZgorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0dMT0JBTF9PVkZfQ1RSTAkweDAwMDAwMzkwCisKKy8qIEdlb2RlIGRlZmluZWQgTVNScyAqLworI2RlZmluZSBNU1JfR0VPREVfQlVTQ09OVF9DT05GMAkJMHgwMDAwMTkwMAorCisvKiBJbnRlbCBWVCBNU1JzICovCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9CQVNJQyAgICAgICAgICAgICAgMHgwMDAwMDQ4MAorI2RlZmluZSBNU1JfSUEzMl9WTVhfUElOQkFTRURfQ1RMUyAgICAgIDB4MDAwMDA0ODEKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX1BST0NCQVNFRF9DVExTICAgICAweDAwMDAwNDgyCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9FWElUX0NUTFMgICAgICAgICAgMHgwMDAwMDQ4MworI2RlZmluZSBNU1JfSUEzMl9WTVhfRU5UUllfQ1RMUyAgICAgICAgIDB4MDAwMDA0ODQKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX01JU0MgICAgICAgICAgICAgICAweDAwMDAwNDg1CisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9DUjBfRklYRUQwICAgICAgICAgMHgwMDAwMDQ4NgorI2RlZmluZSBNU1JfSUEzMl9WTVhfQ1IwX0ZJWEVEMSAgICAgICAgIDB4MDAwMDA0ODcKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0NSNF9GSVhFRDAgICAgICAgICAweDAwMDAwNDg4CisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9DUjRfRklYRUQxICAgICAgICAgMHgwMDAwMDQ4OQorI2RlZmluZSBNU1JfSUEzMl9WTVhfVk1DU19FTlVNICAgICAgICAgIDB4MDAwMDA0OGEKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX1BST0NCQVNFRF9DVExTMiAgICAweDAwMDAwNDhiCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9FUFRfVlBJRF9DQVAgICAgICAgMHgwMDAwMDQ4YworI2RlZmluZSBNU1JfSUEzMl9WTVhfVFJVRV9QSU5CQVNFRF9DVExTICAweDAwMDAwNDhkCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9UUlVFX1BST0NCQVNFRF9DVExTIDB4MDAwMDA0OGUKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX1RSVUVfRVhJVF9DVExTICAgICAgMHgwMDAwMDQ4ZgorI2RlZmluZSBNU1JfSUEzMl9WTVhfVFJVRV9FTlRSWV9DVExTICAgICAweDAwMDAwNDkwCisKKy8qIFZNWF9CQVNJQyBiaXRzIGFuZCBiaXRtYXNrcyAqLworI2RlZmluZSBWTVhfQkFTSUNfVk1DU19TSVpFX1NISUZUCTMyCisjZGVmaW5lIFZNWF9CQVNJQ182NAkJMHgwMDAxMDAwMDAwMDAwMDAwTExVCisjZGVmaW5lIFZNWF9CQVNJQ19NRU1fVFlQRV9TSElGVAk1MAorI2RlZmluZSBWTVhfQkFTSUNfTUVNX1RZUEVfTUFTSwkweDAwM2MwMDAwMDAwMDAwMDBMTFUKKyNkZWZpbmUgVk1YX0JBU0lDX01FTV9UWVBFX1dCCTZMTFUKKyNkZWZpbmUgVk1YX0JBU0lDX0lOT1VUCQkweDAwNDAwMDAwMDAwMDAwMDBMTFUKKworLyogQU1ELVYgTVNScyAqLworCisjZGVmaW5lIE1TUl9WTV9DUiAgICAgICAgICAgICAgICAgICAgICAgMHhjMDAxMDExNAorI2RlZmluZSBNU1JfVk1fSUdOTkUgICAgICAgICAgICAgICAgICAgIDB4YzAwMTAxMTUKKyNkZWZpbmUgTVNSX1ZNX0hTQVZFX1BBICAgICAgICAgICAgICAgICAweGMwMDEwMTE3CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9NU1JfSU5ERVhfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9tc3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbXNyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhZWFmNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbXNyLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9NU1JfSAorI2RlZmluZSBfQVNNX1g4Nl9NU1JfSAorCisjaW5jbHVkZSA8YXNtL21zci1pbmRleC5oPgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIFg4Nl9JT0NfUkRNU1JfUkVHUwlfSU9XUignYycsIDB4QTAsIF9fdTMyWzhdKQorI2RlZmluZSBYODZfSU9DX1dSTVNSX1JFR1MJX0lPV1IoJ2MnLCAweEExLCBfX3UzMls4XSkKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworI2VuZGlmIC8qIF9BU01fWDg2X01TUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL210cnIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbXRyci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZjhmMmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL210cnIuaApAQCAtMCwwICsxLDEwOSBAQAorLyogIEdlbmVyaWMgTVRSUiAoTWVtb3J5IFR5cGUgUmFuZ2UgUmVnaXN0ZXIpIGlvY3Rscy4KKworICAgIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5ICBSaWNoYXJkIEdvb2NoCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICAgIFJpY2hhcmQgR29vY2ggbWF5IGJlIHJlYWNoZWQgYnkgZW1haWwgYXQgIHJnb29jaEBhdG5mLmNzaXJvLmF1CisgICAgVGhlIHBvc3RhbCBhZGRyZXNzIGlzOgorICAgICAgUmljaGFyZCBHb29jaCwgYy9vIEFUTkYsIFAuIE8uIEJveCA3NiwgRXBwaW5nLCBOLlMuVy4sIDIxMjEsIEF1c3RyYWxpYS4KKyovCisjaWZuZGVmIF9BU01fWDg2X01UUlJfSAorI2RlZmluZSBfQVNNX1g4Nl9NVFJSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjZGVmaW5lCU1UUlJfSU9DVExfQkFTRQknTScKKworc3RydWN0IG10cnJfc2VudHJ5IHsKKyAgICB1bnNpZ25lZCBsb25nIGJhc2U7ICAgIC8qICBCYXNlIGFkZHJlc3MgICAgICovCisgICAgdW5zaWduZWQgaW50IHNpemU7ICAgIC8qICBTaXplIG9mIHJlZ2lvbiAgICovCisgICAgdW5zaWduZWQgaW50IHR5cGU7ICAgICAvKiAgVHlwZSBvZiByZWdpb24gICAqLworfTsKKworLyogV2FybmluZzogdGhpcyBzdHJ1Y3R1cmUgaGFzIGEgZGlmZmVyZW50IG9yZGVyIGZyb20gaTM4NgorICAgb24geDg2LTY0LiBUaGUgMzJiaXQgZW11bGF0aW9uIGNvZGUgdGFrZXMgY2FyZSBvZiB0aGF0LgorICAgQnV0IHlvdSBuZWVkIHRvIHVzZSB0aGlzIGZvciA2NGJpdCwgb3RoZXJ3aXNlIHlvdXIgWCBzZXJ2ZXIKKyAgIHdpbGwgYnJlYWsuICovCisKKyNpZmRlZiBfX2kzODZfXworc3RydWN0IG10cnJfZ2VudHJ5IHsKKyAgICB1bnNpZ25lZCBpbnQgcmVnbnVtOyAgIC8qICBSZWdpc3RlciBudW1iZXIgICovCisgICAgdW5zaWduZWQgbG9uZyBiYXNlOyAgICAvKiAgQmFzZSBhZGRyZXNzICAgICAqLworICAgIHVuc2lnbmVkIGludCBzaXplOyAgICAvKiAgU2l6ZSBvZiByZWdpb24gICAqLworICAgIHVuc2lnbmVkIGludCB0eXBlOyAgICAgLyogIFR5cGUgb2YgcmVnaW9uICAgKi8KK307CisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKK3N0cnVjdCBtdHJyX2dlbnRyeSB7CisgICAgdW5zaWduZWQgbG9uZyBiYXNlOyAgICAvKiAgQmFzZSBhZGRyZXNzICAgICAqLworICAgIHVuc2lnbmVkIGludCBzaXplOyAgICAvKiAgU2l6ZSBvZiByZWdpb24gICAqLworICAgIHVuc2lnbmVkIGludCByZWdudW07ICAgLyogIFJlZ2lzdGVyIG51bWJlciAgKi8KKyAgICB1bnNpZ25lZCBpbnQgdHlwZTsgICAgIC8qICBUeXBlIG9mIHJlZ2lvbiAgICovCit9OworI2VuZGlmIC8qICFfX2kzODZfXyAqLworCitzdHJ1Y3QgbXRycl92YXJfcmFuZ2UgeworCV9fdTMyIGJhc2VfbG87CisJX191MzIgYmFzZV9oaTsKKwlfX3UzMiBtYXNrX2xvOworCV9fdTMyIG1hc2tfaGk7Cit9OworCisvKiBJbiB0aGUgSW50ZWwgcHJvY2Vzc29yJ3MgTVRSUiBpbnRlcmZhY2UsIHRoZSBNVFJSIHR5cGUgaXMgYWx3YXlzIGhlbGQgaW4KKyAgIGFuIDggYml0IGZpZWxkOiAqLwordHlwZWRlZiBfX3U4IG10cnJfdHlwZTsKKworI2RlZmluZSBNVFJSX05VTV9GSVhFRF9SQU5HRVMgODgKKyNkZWZpbmUgTVRSUl9NQVhfVkFSX1JBTkdFUyAyNTYKKworc3RydWN0IG10cnJfc3RhdGVfdHlwZSB7CisJc3RydWN0IG10cnJfdmFyX3JhbmdlIHZhcl9yYW5nZXNbTVRSUl9NQVhfVkFSX1JBTkdFU107CisJbXRycl90eXBlIGZpeGVkX3Jhbmdlc1tNVFJSX05VTV9GSVhFRF9SQU5HRVNdOworCXVuc2lnbmVkIGNoYXIgZW5hYmxlZDsKKwl1bnNpZ25lZCBjaGFyIGhhdmVfZml4ZWQ7CisJbXRycl90eXBlIGRlZl90eXBlOworfTsKKworI2RlZmluZSBNVFJScGh5c0Jhc2VfTVNSKHJlZykgKDB4MjAwICsgMiAqIChyZWcpKQorI2RlZmluZSBNVFJScGh5c01hc2tfTVNSKHJlZykgKDB4MjAwICsgMiAqIChyZWcpICsgMSkKKworLyogIFRoZXNlIGFyZSB0aGUgdmFyaW91cyBpb2N0bHMgICovCisjZGVmaW5lIE1UUlJJT0NfQUREX0VOVFJZICAgICAgICBfSU9XKE1UUlJfSU9DVExfQkFTRSwgIDAsIHN0cnVjdCBtdHJyX3NlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19TRVRfRU5UUlkgICAgICAgIF9JT1coTVRSUl9JT0NUTF9CQVNFLCAgMSwgc3RydWN0IG10cnJfc2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX0RFTF9FTlRSWSAgICAgICAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICAyLCBzdHJ1Y3QgbXRycl9zZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfR0VUX0VOVFJZICAgICAgICBfSU9XUihNVFJSX0lPQ1RMX0JBU0UsIDMsIHN0cnVjdCBtdHJyX2dlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19LSUxMX0VOVFJZICAgICAgIF9JT1coTVRSUl9JT0NUTF9CQVNFLCAgNCwgc3RydWN0IG10cnJfc2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX0FERF9QQUdFX0VOVFJZICAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICA1LCBzdHJ1Y3QgbXRycl9zZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfU0VUX1BBR0VfRU5UUlkgICBfSU9XKE1UUlJfSU9DVExfQkFTRSwgIDYsIHN0cnVjdCBtdHJyX3NlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19ERUxfUEFHRV9FTlRSWSAgIF9JT1coTVRSUl9JT0NUTF9CQVNFLCAgNywgc3RydWN0IG10cnJfc2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX0dFVF9QQUdFX0VOVFJZICAgX0lPV1IoTVRSUl9JT0NUTF9CQVNFLCA4LCBzdHJ1Y3QgbXRycl9nZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfS0lMTF9QQUdFX0VOVFJZICBfSU9XKE1UUlJfSU9DVExfQkFTRSwgIDksIHN0cnVjdCBtdHJyX3NlbnRyeSkKKworLyogIFRoZXNlIGFyZSB0aGUgcmVnaW9uIHR5cGVzICAqLworI2RlZmluZSBNVFJSX1RZUEVfVU5DQUNIQUJMRSAwCisjZGVmaW5lIE1UUlJfVFlQRV9XUkNPTUIgICAgIDEKKy8qI2RlZmluZSBNVFJSX1RZUEVfICAgICAgICAgMiovCisvKiNkZWZpbmUgTVRSUl9UWVBFXyAgICAgICAgIDMqLworI2RlZmluZSBNVFJSX1RZUEVfV1JUSFJPVUdIICA0CisjZGVmaW5lIE1UUlJfVFlQRV9XUlBST1QgICAgIDUKKyNkZWZpbmUgTVRSUl9UWVBFX1dSQkFDSyAgICAgNgorI2RlZmluZSBNVFJSX05VTV9UWVBFUyAgICAgICA3CisKKworI2VuZGlmIC8qIF9BU01fWDg2X01UUlJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wYXJhbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NWQ0NTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3BhcmFtLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhcmFtLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3BvbGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcG9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ODUwOWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3BvbGwuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcG9sbC5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wb3NpeF90eXBlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wb3NpeF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZGNmZjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzLmgKQEAgLTAsMCArMSw1IEBACisjIGlmZGVmIF9faTM4Nl9fCisjICBpbmNsdWRlIDxhc20vcG9zaXhfdHlwZXNfMzIuaD4KKyMgZWxzZQorIyAgaW5jbHVkZSA8YXNtL3Bvc2l4X3R5cGVzXzY0Lmg+CisjIGVuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzXzMyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzXzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllNDU2MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcG9zaXhfdHlwZXNfMzIuaApAQCAtMCwwICsxLDQ2IEBACisjaWZuZGVmIF9BU01fWDg2X1BPU0lYX1RZUEVTXzMyX0gKKyNkZWZpbmUgX0FTTV9YODZfUE9TSVhfVFlQRVNfMzJfSAorCisvKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYWxseSB1c2VkIGJ5IHVzZXItbGV2ZWwgc29mdHdhcmUsIHNvIHlvdSBuZWVkIHRvCisgKiBiZSBhIGxpdHRsZSBjYXJlZnVsIGFib3V0IG5hbWVzcGFjZSBwb2xsdXRpb24gZXRjLiAgQWxzbywgd2UgY2Fubm90CisgKiBhc3N1bWUgR0NDIGlzIGJlaW5nIHVzZWQuCisgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX2lub190OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9tb2RlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX25saW5rX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX29mZl90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3BpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9pcGNfcGlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9naWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX3NpemVfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9zc2l6ZV90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3B0cmRpZmZfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfdGltZV90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9zdXNlY29uZHNfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfY2xvY2tfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF90aW1lcl90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX2Nsb2NraWRfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9kYWRkcl90OwordHlwZWRlZiBjaGFyICoJCV9fa2VybmVsX2NhZGRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX3VpZDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX2dpZDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF91aWQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfZ2lkMzJfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9vbGRfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX29sZF9naWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfb2xkX2Rldl90OworCisjaWZkZWYgX19HTlVDX18KK3R5cGVkZWYgbG9uZyBsb25nCV9fa2VybmVsX2xvZmZfdDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CXZhbFsyXTsKK30gX19rZXJuZWxfZnNpZF90OworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9QT1NJWF9UWVBFU18zMl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzXzY0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzXzY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3NjNjMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcG9zaXhfdHlwZXNfNjQuaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIF9BU01fWDg2X1BPU0lYX1RZUEVTXzY0X0gKKyNkZWZpbmUgX0FTTV9YODZfUE9TSVhfVFlQRVNfNjRfSAorCisvKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYWxseSB1c2VkIGJ5IHVzZXItbGV2ZWwgc29mdHdhcmUsIHNvIHlvdSBuZWVkIHRvCisgKiBiZSBhIGxpdHRsZSBjYXJlZnVsIGFib3V0IG5hbWVzcGFjZSBwb2xsdXRpb24gZXRjLiAgQWxzbywgd2UgY2Fubm90CisgKiBhc3N1bWUgR0NDIGlzIGJlaW5nIHVzZWQuCisgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX2lub190OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfbW9kZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX25saW5rX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX29mZl90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3BpZF90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX2lwY19waWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfZ2lkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJX19rZXJuZWxfc2l6ZV90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9zc2l6ZV90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9wdHJkaWZmX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3RpbWVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfc3VzZWNvbmRzX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX2Nsb2NrX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfdGltZXJfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9jbG9ja2lkX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfZGFkZHJfdDsKK3R5cGVkZWYgY2hhciAqCQlfX2tlcm5lbF9jYWRkcl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF91aWQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9naWQxNl90OworCisjaWZkZWYgX19HTlVDX18KK3R5cGVkZWYgbG9uZyBsb25nCV9fa2VybmVsX2xvZmZfdDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CXZhbFsyXTsKK30gX19rZXJuZWxfZnNpZF90OworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fa2VybmVsX29sZF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgX19rZXJuZWxfb2xkX2dpZF90OwordHlwZWRlZiBfX2tlcm5lbF91aWRfdCBfX2tlcm5lbF91aWQzMl90OwordHlwZWRlZiBfX2tlcm5lbF9naWRfdCBfX2tlcm5lbF9naWQzMl90OworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJX19rZXJuZWxfb2xkX2Rldl90OworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9QT1NJWF9UWVBFU182NF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3ByY3RsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3ByY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjNTAzMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcHJjdGwuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX0FTTV9YODZfUFJDVExfSAorI2RlZmluZSBfQVNNX1g4Nl9QUkNUTF9ICisKKyNkZWZpbmUgQVJDSF9TRVRfR1MgMHgxMDAxCisjZGVmaW5lIEFSQ0hfU0VUX0ZTIDB4MTAwMgorI2RlZmluZSBBUkNIX0dFVF9GUyAweDEwMDMKKyNkZWZpbmUgQVJDSF9HRVRfR1MgMHgxMDA0CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9QUkNUTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Byb2Nlc3Nvci1mbGFncy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wcm9jZXNzb3ItZmxhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmUxMzlhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wcm9jZXNzb3ItZmxhZ3MuaApAQCAtMCwwICsxLDk1IEBACisjaWZuZGVmIF9BU01fWDg2X1BST0NFU1NPUl9GTEFHU19ICisjZGVmaW5lIF9BU01fWDg2X1BST0NFU1NPUl9GTEFHU19ICisvKiBWYXJpb3VzIGZsYWdzIGRlZmluZWQ6IGNhbiBiZSBpbmNsdWRlZCBmcm9tIGFzc2VtYmxlci4gKi8KKworLyoKKyAqIEVGTEFHUyBiaXRzCisgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19DRgkweDAwMDAwMDAxIC8qIENhcnJ5IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19QRgkweDAwMDAwMDA0IC8qIFBhcml0eSBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfQUYJMHgwMDAwMDAxMCAvKiBBdXhpbGlhcnkgY2FycnkgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1pGCTB4MDAwMDAwNDAgLyogWmVybyBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfU0YJMHgwMDAwMDA4MCAvKiBTaWduIEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19URgkweDAwMDAwMTAwIC8qIFRyYXAgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0lGCTB4MDAwMDAyMDAgLyogSW50ZXJydXB0IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19ERgkweDAwMDAwNDAwIC8qIERpcmVjdGlvbiBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfT0YJMHgwMDAwMDgwMCAvKiBPdmVyZmxvdyBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfSU9QTAkweDAwMDAzMDAwIC8qIElPUEwgbWFzayAqLworI2RlZmluZSBYODZfRUZMQUdTX05UCTB4MDAwMDQwMDAgLyogTmVzdGVkIFRhc2sgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19SRgkweDAwMDEwMDAwIC8qIFJlc3VtZSBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfVk0JMHgwMDAyMDAwMCAvKiBWaXJ0dWFsIE1vZGUgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19BQwkweDAwMDQwMDAwIC8qIEFsaWdubWVudCBDaGVjayAqLworI2RlZmluZSBYODZfRUZMQUdTX1ZJRgkweDAwMDgwMDAwIC8qIFZpcnR1YWwgSW50ZXJydXB0IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19WSVAJMHgwMDEwMDAwMCAvKiBWaXJ0dWFsIEludGVycnVwdCBQZW5kaW5nICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfSUQJMHgwMDIwMDAwMCAvKiBDUFVJRCBkZXRlY3Rpb24gZmxhZyAqLworCisvKgorICogQmFzaWMgQ1BVIGNvbnRyb2wgaW4gQ1IwCisgKi8KKyNkZWZpbmUgWDg2X0NSMF9QRQkweDAwMDAwMDAxIC8qIFByb3RlY3Rpb24gRW5hYmxlICovCisjZGVmaW5lIFg4Nl9DUjBfTVAJMHgwMDAwMDAwMiAvKiBNb25pdG9yIENvcHJvY2Vzc29yICovCisjZGVmaW5lIFg4Nl9DUjBfRU0JMHgwMDAwMDAwNCAvKiBFbXVsYXRpb24gKi8KKyNkZWZpbmUgWDg2X0NSMF9UUwkweDAwMDAwMDA4IC8qIFRhc2sgU3dpdGNoZWQgKi8KKyNkZWZpbmUgWDg2X0NSMF9FVAkweDAwMDAwMDEwIC8qIEV4dGVuc2lvbiBUeXBlICovCisjZGVmaW5lIFg4Nl9DUjBfTkUJMHgwMDAwMDAyMCAvKiBOdW1lcmljIEVycm9yICovCisjZGVmaW5lIFg4Nl9DUjBfV1AJMHgwMDAxMDAwMCAvKiBXcml0ZSBQcm90ZWN0ICovCisjZGVmaW5lIFg4Nl9DUjBfQU0JMHgwMDA0MDAwMCAvKiBBbGlnbm1lbnQgTWFzayAqLworI2RlZmluZSBYODZfQ1IwX05XCTB4MjAwMDAwMDAgLyogTm90IFdyaXRlLXRocm91Z2ggKi8KKyNkZWZpbmUgWDg2X0NSMF9DRAkweDQwMDAwMDAwIC8qIENhY2hlIERpc2FibGUgKi8KKyNkZWZpbmUgWDg2X0NSMF9QRwkweDgwMDAwMDAwIC8qIFBhZ2luZyAqLworCisvKgorICogUGFnaW5nIG9wdGlvbnMgaW4gQ1IzCisgKi8KKyNkZWZpbmUgWDg2X0NSM19QV1QJMHgwMDAwMDAwOCAvKiBQYWdlIFdyaXRlIFRocm91Z2ggKi8KKyNkZWZpbmUgWDg2X0NSM19QQ0QJMHgwMDAwMDAxMCAvKiBQYWdlIENhY2hlIERpc2FibGUgKi8KKworLyoKKyAqIEludGVsIENQVSBmZWF0dXJlcyBpbiBDUjQKKyAqLworI2RlZmluZSBYODZfQ1I0X1ZNRQkweDAwMDAwMDAxIC8qIGVuYWJsZSB2bTg2IGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0NSNF9QVkkJMHgwMDAwMDAwMiAvKiB2aXJ0dWFsIGludGVycnVwdHMgZmxhZyBlbmFibGUgKi8KKyNkZWZpbmUgWDg2X0NSNF9UU0QJMHgwMDAwMDAwNCAvKiBkaXNhYmxlIHRpbWUgc3RhbXAgYXQgaXBsIDMgKi8KKyNkZWZpbmUgWDg2X0NSNF9ERQkweDAwMDAwMDA4IC8qIGVuYWJsZSBkZWJ1Z2dpbmcgZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfQ1I0X1BTRQkweDAwMDAwMDEwIC8qIGVuYWJsZSBwYWdlIHNpemUgZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfQ1I0X1BBRQkweDAwMDAwMDIwIC8qIGVuYWJsZSBwaHlzaWNhbCBhZGRyZXNzIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0NSNF9NQ0UJMHgwMDAwMDA0MCAvKiBNYWNoaW5lIGNoZWNrIGVuYWJsZSAqLworI2RlZmluZSBYODZfQ1I0X1BHRQkweDAwMDAwMDgwIC8qIGVuYWJsZSBnbG9iYWwgcGFnZXMgKi8KKyNkZWZpbmUgWDg2X0NSNF9QQ0UJMHgwMDAwMDEwMCAvKiBlbmFibGUgcGVyZm9ybWFuY2UgY291bnRlcnMgYXQgaXBsIDMgKi8KKyNkZWZpbmUgWDg2X0NSNF9PU0ZYU1IJMHgwMDAwMDIwMCAvKiBlbmFibGUgZmFzdCBGUFUgc2F2ZSBhbmQgcmVzdG9yZSAqLworI2RlZmluZSBYODZfQ1I0X09TWE1NRVhDUFQgMHgwMDAwMDQwMCAvKiBlbmFibGUgdW5tYXNrZWQgU1NFIGV4Y2VwdGlvbnMgKi8KKyNkZWZpbmUgWDg2X0NSNF9WTVhFCTB4MDAwMDIwMDAgLyogZW5hYmxlIFZNWCB2aXJ0dWFsaXphdGlvbiAqLworI2RlZmluZSBYODZfQ1I0X1JEV1JHU0ZTIDB4MDAwMTAwMDAgLyogZW5hYmxlIFJEV1JHU0ZTIHN1cHBvcnQgKi8KKyNkZWZpbmUgWDg2X0NSNF9PU1hTQVZFIDB4MDAwNDAwMDAgLyogZW5hYmxlIHhzYXZlIGFuZCB4cmVzdG9yZSAqLworI2RlZmluZSBYODZfQ1I0X1NNRVAJMHgwMDEwMDAwMCAvKiBlbmFibGUgU01FUCBzdXBwb3J0ICovCisKKy8qCisgKiB4ODYtNjQgVGFzayBQcmlvcml0eSBSZWdpc3RlciwgQ1I4CisgKi8KKyNkZWZpbmUgWDg2X0NSOF9UUFIJMHgwMDAwMDAwRiAvKiB0YXNrIHByaW9yaXR5IHJlZ2lzdGVyICovCisKKy8qCisgKiBBTUQgYW5kIFRyYW5zbWV0YSB1c2UgTVNScyBmb3IgY29uZmlndXJhdGlvbjsgc2VlIDxhc20vbXNyLWluZGV4Lmg+CisgKi8KKworLyoKKyAqICAgICAgTlNDL0N5cml4IENQVSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGluZGV4ZXMKKyAqLworI2RlZmluZSBDWDg2X1BDUjAJMHgyMAorI2RlZmluZSBDWDg2X0dDUgkweGI4CisjZGVmaW5lIENYODZfQ0NSMAkweGMwCisjZGVmaW5lIENYODZfQ0NSMQkweGMxCisjZGVmaW5lIENYODZfQ0NSMgkweGMyCisjZGVmaW5lIENYODZfQ0NSMwkweGMzCisjZGVmaW5lIENYODZfQ0NSNAkweGU4CisjZGVmaW5lIENYODZfQ0NSNQkweGU5CisjZGVmaW5lIENYODZfQ0NSNgkweGVhCisjZGVmaW5lIENYODZfQ0NSNwkweGViCisjZGVmaW5lIENYODZfUENSMQkweGYwCisjZGVmaW5lIENYODZfRElSMAkweGZlCisjZGVmaW5lIENYODZfRElSMQkweGZmCisjZGVmaW5lIENYODZfQVJSX0JBU0UJMHhjNAorI2RlZmluZSBDWDg2X1JDUl9CQVNFCTB4ZGMKKworCisjZW5kaWYgLyogX0FTTV9YODZfUFJPQ0VTU09SX0ZMQUdTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcHRyYWNlLWFiaS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wdHJhY2UtYWJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwYTU1YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcHRyYWNlLWFiaS5oCkBAIC0wLDAgKzEsODcgQEAKKyNpZm5kZWYgX0FTTV9YODZfUFRSQUNFX0FCSV9ICisjZGVmaW5lIF9BU01fWDg2X1BUUkFDRV9BQklfSAorCisjaWZkZWYgX19pMzg2X18KKworI2RlZmluZSBFQlggMAorI2RlZmluZSBFQ1ggMQorI2RlZmluZSBFRFggMgorI2RlZmluZSBFU0kgMworI2RlZmluZSBFREkgNAorI2RlZmluZSBFQlAgNQorI2RlZmluZSBFQVggNgorI2RlZmluZSBEUyA3CisjZGVmaW5lIEVTIDgKKyNkZWZpbmUgRlMgOQorI2RlZmluZSBHUyAxMAorI2RlZmluZSBPUklHX0VBWCAxMQorI2RlZmluZSBFSVAgMTIKKyNkZWZpbmUgQ1MgIDEzCisjZGVmaW5lIEVGTCAxNAorI2RlZmluZSBVRVNQIDE1CisjZGVmaW5lIFNTICAgMTYKKyNkZWZpbmUgRlJBTUVfU0laRSAxNworCisjZWxzZSAvKiBfX2kzODZfXyAqLworCisjaWYgZGVmaW5lZChfX0FTU0VNQkxZX18pIHx8IGRlZmluZWQoX19GUkFNRV9PRkZTRVRTKQorI2RlZmluZSBSMTUgMAorI2RlZmluZSBSMTQgOAorI2RlZmluZSBSMTMgMTYKKyNkZWZpbmUgUjEyIDI0CisjZGVmaW5lIFJCUCAzMgorI2RlZmluZSBSQlggNDAKKy8qIGFyZ3VtZW50czogaW50ZXJydXB0cy9ub24gdHJhY2luZyBzeXNjYWxscyBvbmx5IHNhdmUgdXAgdG8gaGVyZSovCisjZGVmaW5lIFIxMSA0OAorI2RlZmluZSBSMTAgNTYKKyNkZWZpbmUgUjkgNjQKKyNkZWZpbmUgUjggNzIKKyNkZWZpbmUgUkFYIDgwCisjZGVmaW5lIFJDWCA4OAorI2RlZmluZSBSRFggOTYKKyNkZWZpbmUgUlNJIDEwNAorI2RlZmluZSBSREkgMTEyCisjZGVmaW5lIE9SSUdfUkFYIDEyMCAgICAgICAvKiA9IEVSUk9SICovCisvKiBlbmQgb2YgYXJndW1lbnRzICovCisvKiBjcHUgZXhjZXB0aW9uIGZyYW1lIG9yIHVuZGVmaW5lZCBpbiBjYXNlIG9mIGZhc3Qgc3lzY2FsbC4gKi8KKyNkZWZpbmUgUklQIDEyOAorI2RlZmluZSBDUyAxMzYKKyNkZWZpbmUgRUZMQUdTIDE0NAorI2RlZmluZSBSU1AgMTUyCisjZGVmaW5lIFNTIDE2MAorI2RlZmluZSBBUkdPRkZTRVQgUjExCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKy8qIHRvcCBvZiBzdGFjayBwYWdlICovCisjZGVmaW5lIEZSQU1FX1NJWkUgMTY4CisKKyNlbmRpZiAvKiAhX19pMzg2X18gKi8KKworLyogQXJiaXRyYXJpbHkgY2hvb3NlIHRoZSBzYW1lIHB0cmFjZSBudW1iZXJzIGFzIHVzZWQgYnkgdGhlIFNwYXJjIGNvZGUuICovCisjZGVmaW5lIFBUUkFDRV9HRVRSRUdTICAgICAgICAgICAgMTIKKyNkZWZpbmUgUFRSQUNFX1NFVFJFR1MgICAgICAgICAgICAxMworI2RlZmluZSBQVFJBQ0VfR0VURlBSRUdTICAgICAgICAgIDE0CisjZGVmaW5lIFBUUkFDRV9TRVRGUFJFR1MgICAgICAgICAgMTUKKyNkZWZpbmUgUFRSQUNFX0dFVEZQWFJFR1MgICAgICAgICAxOAorI2RlZmluZSBQVFJBQ0VfU0VURlBYUkVHUyAgICAgICAgIDE5CisKKyNkZWZpbmUgUFRSQUNFX09MRFNFVE9QVElPTlMgICAgICAyMQorCisvKiBvbmx5IHVzZWZ1bCBmb3IgYWNjZXNzIDMyYml0IHByb2dyYW1zIC8ga2VybmVscyAqLworI2RlZmluZSBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBICAgIDI1CisjZGVmaW5lIFBUUkFDRV9TRVRfVEhSRUFEX0FSRUEgICAgMjYKKworI2lmZGVmIF9feDg2XzY0X18KKyMgZGVmaW5lIFBUUkFDRV9BUkNIX1BSQ1RMCSAgMzAKKyNlbmRpZgorCisjZGVmaW5lIFBUUkFDRV9TWVNFTVUJCSAgMzEKKyNkZWZpbmUgUFRSQUNFX1NZU0VNVV9TSU5HTEVTVEVQICAzMgorCisjZGVmaW5lIFBUUkFDRV9TSU5HTEVCTE9DSwkzMwkvKiByZXN1bWUgZXhlY3V0aW9uIHVudGlsIG5leHQgYnJhbmNoICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9YODZfUFRSQUNFX0FCSV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3B0cmFjZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGMxOGU5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wdHJhY2UuaApAQCAtMCwwICsxLDc0IEBACisjaWZuZGVmIF9BU01fWDg2X1BUUkFDRV9ICisjZGVmaW5lIF9BU01fWDg2X1BUUkFDRV9ICisKKwkvKiBGb3IgKi8KKyNpbmNsdWRlIDxhc20vcHRyYWNlLWFiaS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZmxhZ3MuaD4KKworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaWZkZWYgX19pMzg2X18KKy8qIHRoaXMgc3RydWN0IGRlZmluZXMgdGhlIHdheSB0aGUgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgb24gdGhlCisgICBzdGFjayBkdXJpbmcgYSBzeXN0ZW0gY2FsbC4gKi8KKworCitzdHJ1Y3QgcHRfcmVncyB7CisJbG9uZyBlYng7CisJbG9uZyBlY3g7CisJbG9uZyBlZHg7CisJbG9uZyBlc2k7CisJbG9uZyBlZGk7CisJbG9uZyBlYnA7CisJbG9uZyBlYXg7CisJaW50ICB4ZHM7CisJaW50ICB4ZXM7CisJaW50ICB4ZnM7CisJaW50ICB4Z3M7CisJbG9uZyBvcmlnX2VheDsKKwlsb25nIGVpcDsKKwlpbnQgIHhjczsKKwlsb25nIGVmbGFnczsKKwlsb25nIGVzcDsKKwlpbnQgIHhzczsKK307CisKKworI2Vsc2UgLyogX19pMzg2X18gKi8KKworCitzdHJ1Y3QgcHRfcmVncyB7CisJdW5zaWduZWQgbG9uZyByMTU7CisJdW5zaWduZWQgbG9uZyByMTQ7CisJdW5zaWduZWQgbG9uZyByMTM7CisJdW5zaWduZWQgbG9uZyByMTI7CisJdW5zaWduZWQgbG9uZyByYnA7CisJdW5zaWduZWQgbG9uZyByYng7CisvKiBhcmd1bWVudHM6IG5vbiBpbnRlcnJ1cHRzL25vbiB0cmFjaW5nIHN5c2NhbGxzIG9ubHkgc2F2ZSB1cCB0byBoZXJlKi8KKwl1bnNpZ25lZCBsb25nIHIxMTsKKwl1bnNpZ25lZCBsb25nIHIxMDsKKwl1bnNpZ25lZCBsb25nIHI5OworCXVuc2lnbmVkIGxvbmcgcjg7CisJdW5zaWduZWQgbG9uZyByYXg7CisJdW5zaWduZWQgbG9uZyByY3g7CisJdW5zaWduZWQgbG9uZyByZHg7CisJdW5zaWduZWQgbG9uZyByc2k7CisJdW5zaWduZWQgbG9uZyByZGk7CisJdW5zaWduZWQgbG9uZyBvcmlnX3JheDsKKy8qIGVuZCBvZiBhcmd1bWVudHMgKi8KKy8qIGNwdSBleGNlcHRpb24gZnJhbWUgb3IgdW5kZWZpbmVkICovCisJdW5zaWduZWQgbG9uZyByaXA7CisJdW5zaWduZWQgbG9uZyBjczsKKwl1bnNpZ25lZCBsb25nIGVmbGFnczsKKwl1bnNpZ25lZCBsb25nIHJzcDsKKwl1bnNpZ25lZCBsb25nIHNzOworLyogdG9wIG9mIHN0YWNrIHBhZ2UgKi8KK307CisKKyNlbmRpZiAvKiAhX19pMzg2X18gKi8KKworCisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9QVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9yZXNvdXJjZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YmM0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Jlc291cmNlLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Jlc291cmNlLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NlbWJ1Zi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zZW1idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTUwYzgwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zZW1idWYuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9BU01fWDg2X1NFTUJVRl9ICisjZGVmaW5lIF9BU01fWDg2X1NFTUJVRl9ICisKKy8qCisgKiBUaGUgc2VtaWQ2NF9kcyBzdHJ1Y3R1cmUgZm9yIHg4NiBhcmNoaXRlY3R1cmUuCisgKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKKyAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgorICoKKyAqIFBhZCBzcGFjZSBpcyBsZWZ0IGZvcjoKKyAqIC0gNjQtYml0IHRpbWVfdCB0byBzb2x2ZSB5MjAzOCBwcm9ibGVtCisgKiAtIDIgbWlzY2VsbGFuZW91cyAzMi1iaXQgdmFsdWVzCisgKi8KK3N0cnVjdCBzZW1pZDY0X2RzIHsKKwlzdHJ1Y3QgaXBjNjRfcGVybSBzZW1fcGVybTsJLyogcGVybWlzc2lvbnMgLi4gc2VlIGlwYy5oICovCisJX19rZXJuZWxfdGltZV90CXNlbV9vdGltZTsJLyogbGFzdCBzZW1vcCB0aW1lICovCisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDE7CisJX19rZXJuZWxfdGltZV90CXNlbV9jdGltZTsJLyogbGFzdCBjaGFuZ2UgdGltZSAqLworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQyOworCXVuc2lnbmVkIGxvbmcJc2VtX25zZW1zOwkvKiBuby4gb2Ygc2VtYXBob3JlcyBpbiBhcnJheSAqLworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQzOworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQ0OworfTsKKworI2VuZGlmIC8qIF9BU01fWDg2X1NFTUJVRl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NldHVwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NldHVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhZWY2MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc2V0dXAuaApAQCAtMCwwICsxLDUgQEAKKyNpZm5kZWYgX0FTTV9YODZfU0VUVVBfSAorI2RlZmluZSBfQVNNX1g4Nl9TRVRVUF9ICisKKworI2VuZGlmIC8qIF9BU01fWDg2X1NFVFVQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc2htYnVmLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NobWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzA1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NobWJ1Zi5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zaG1idWYuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc2lnY29udGV4dC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zaWdjb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4YzhjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc2lnY29udGV4dC5oCkBAIC0wLDAgKzEsMjE0IEBACisjaWZuZGVmIF9BU01fWDg2X1NJR0NPTlRFWFRfSAorI2RlZmluZSBfQVNNX1g4Nl9TSUdDT05URVhUX0gKKworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBGUF9YU1RBVEVfTUFHSUMxCTB4NDY1MDU4NTNVCisjZGVmaW5lIEZQX1hTVEFURV9NQUdJQzIJMHg0NjUwNTg0NVUKKyNkZWZpbmUgRlBfWFNUQVRFX01BR0lDMl9TSVpFCXNpemVvZihGUF9YU1RBVEVfTUFHSUMyKQorCisvKgorICogYnl0ZXMgNDY0Li41MTEgaW4gdGhlIGN1cnJlbnQgNTEyYnl0ZSBsYXlvdXQgb2YgZnhzYXZlL2Z4cnN0b3IgZnJhbWUKKyAqIGFyZSByZXNlcnZlZCBmb3IgU1cgdXNhZ2UuIE9uIGNwdSdzIHN1cHBvcnRpbmcgeHNhdmUveHJzdG9yLCB0aGVzZSBieXRlcworICogYXJlIHVzZWQgdG8gZXh0ZW5kZWQgdGhlIGZwc3RhdGUgcG9pbnRlciBpbiB0aGUgc2lnY29udGV4dCwgd2hpY2ggbm93CisgKiBpbmNsdWRlcyB0aGUgZXh0ZW5kZWQgc3RhdGUgaW5mb3JtYXRpb24gYWxvbmcgd2l0aCBmcHN0YXRlIGluZm9ybWF0aW9uLgorICoKKyAqIFByZXNlbmNlIG9mIEZQX1hTVEFURV9NQUdJQzEgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzIFNXIHJlc2VydmVkCisgKiBhcmVhIGFuZCBGUF9YU1RBVEVfTUFHSUMyIGF0IHRoZSBlbmQgb2YgbWVtb3J5IGxheW91dAorICogKGV4dGVuZGVkX3NpemUgLSBGUF9YU1RBVEVfTUFHSUMyX1NJWkUpIGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YgdGhlCisgKiBleHRlbmRlZCBzdGF0ZSBpbmZvcm1hdGlvbiBpbiB0aGUgbWVtb3J5IGxheW91dCBwb2ludGVkIGJ5IHRoZSBmcHN0YXRlCisgKiBwb2ludGVyIGluIHNpZ2NvbnRleHQuCisgKi8KK3N0cnVjdCBfZnB4X3N3X2J5dGVzIHsKKwlfX3UzMiBtYWdpYzE7CQkvKiBGUF9YU1RBVEVfTUFHSUMxICovCisJX191MzIgZXh0ZW5kZWRfc2l6ZTsJLyogdG90YWwgc2l6ZSBvZiB0aGUgbGF5b3V0IHJlZmVycmVkIGJ5CisJCQkJICogZnBzdGF0ZSBwb2ludGVyIGluIHRoZSBzaWdjb250ZXh0LgorCQkJCSAqLworCV9fdTY0IHhzdGF0ZV9idjsKKwkJCQkvKiBmZWF0dXJlIGJpdCBtYXNrIChpbmNsdWRpbmcgZnAvc3NlL2V4dGVuZGVkCisJCQkJICogc3RhdGUpIHRoYXQgaXMgcHJlc2VudCBpbiB0aGUgbWVtb3J5CisJCQkJICogbGF5b3V0LgorCQkJCSAqLworCV9fdTMyIHhzdGF0ZV9zaXplOwkvKiBhY3R1YWwgeHNhdmUgc3RhdGUgc2l6ZSwgYmFzZWQgb24gdGhlCisJCQkJICogZmVhdHVyZXMgc2F2ZWQgaW4gdGhlIGxheW91dC4KKwkJCQkgKiAnZXh0ZW5kZWRfc2l6ZScgd2lsbCBiZSBncmVhdGVyIHRoYW4KKwkJCQkgKiAneHN0YXRlX3NpemUnLgorCQkJCSAqLworCV9fdTMyIHBhZGRpbmdbN107CS8qICBmb3IgZnV0dXJlIHVzZS4gKi8KK307CisKKyNpZmRlZiBfX2kzODZfXworLyoKKyAqIEFzIGRvY3VtZW50ZWQgaW4gdGhlIGlCQ1MyIHN0YW5kYXJkLi4KKyAqCisgKiBUaGUgZmlyc3QgcGFydCBvZiAic3RydWN0IF9mcHN0YXRlIiBpcyBqdXN0IHRoZSBub3JtYWwgaTM4NworICogaGFyZHdhcmUgc2V0dXAsIHRoZSBleHRyYSAic3RhdHVzIiB3b3JkIGlzIHVzZWQgdG8gc2F2ZSB0aGUKKyAqIGNvcHJvY2Vzc29yIHN0YXR1cyB3b3JkIGJlZm9yZSBlbnRlcmluZyB0aGUgaGFuZGxlci4KKyAqCisgKiBQZW50aXVtIElJSSBGWFNSLCBTU0Ugc3VwcG9ydAorICoJR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPiwgTWF5IDIwMDAKKyAqCisgKiBUaGUgRlBVIHN0YXRlIGRhdGEgc3RydWN0dXJlIGhhcyBoYWQgdG8gZ3JvdyB0byBhY2NvbW1vZGF0ZSB0aGUKKyAqIGV4dGVuZGVkIEZQVSBzdGF0ZSByZXF1aXJlZCBieSB0aGUgU3RyZWFtaW5nIFNJTUQgRXh0ZW5zaW9ucy4KKyAqIFRoZXJlIGlzIG5vIGRvY3VtZW50ZWQgc3RhbmRhcmQgdG8gYWNjb21wbGlzaCB0aGlzIGF0IHRoZSBtb21lbnQuCisgKi8KK3N0cnVjdCBfZnByZWcgeworCXVuc2lnbmVkIHNob3J0IHNpZ25pZmljYW5kWzRdOworCXVuc2lnbmVkIHNob3J0IGV4cG9uZW50OworfTsKKworc3RydWN0IF9mcHhyZWcgeworCXVuc2lnbmVkIHNob3J0IHNpZ25pZmljYW5kWzRdOworCXVuc2lnbmVkIHNob3J0IGV4cG9uZW50OworCXVuc2lnbmVkIHNob3J0IHBhZGRpbmdbM107Cit9OworCitzdHJ1Y3QgX3htbXJlZyB7CisJdW5zaWduZWQgbG9uZyBlbGVtZW50WzRdOworfTsKKworc3RydWN0IF9mcHN0YXRlIHsKKwkvKiBSZWd1bGFyIEZQVSBlbnZpcm9ubWVudCAqLworCXVuc2lnbmVkIGxvbmcJY3c7CisJdW5zaWduZWQgbG9uZwlzdzsKKwl1bnNpZ25lZCBsb25nCXRhZzsKKwl1bnNpZ25lZCBsb25nCWlwb2ZmOworCXVuc2lnbmVkIGxvbmcJY3NzZWw7CisJdW5zaWduZWQgbG9uZwlkYXRhb2ZmOworCXVuc2lnbmVkIGxvbmcJZGF0YXNlbDsKKwlzdHJ1Y3QgX2ZwcmVnCV9zdFs4XTsKKwl1bnNpZ25lZCBzaG9ydAlzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQJbWFnaWM7CQkvKiAweGZmZmYgPSByZWd1bGFyIEZQVSBkYXRhIG9ubHkgKi8KKworCS8qIEZYU1IgRlBVIGVudmlyb25tZW50ICovCisJdW5zaWduZWQgbG9uZwlfZnhzcl9lbnZbNl07CS8qIEZYU1IgRlBVIGVudiBpcyBpZ25vcmVkICovCisJdW5zaWduZWQgbG9uZwlteGNzcjsKKwl1bnNpZ25lZCBsb25nCXJlc2VydmVkOworCXN0cnVjdCBfZnB4cmVnCV9meHNyX3N0WzhdOwkvKiBGWFNSIEZQVSByZWcgZGF0YSBpcyBpZ25vcmVkICovCisJc3RydWN0IF94bW1yZWcJX3htbVs4XTsKKwl1bnNpZ25lZCBsb25nCXBhZGRpbmcxWzQ0XTsKKworCXVuaW9uIHsKKwkJdW5zaWduZWQgbG9uZwlwYWRkaW5nMlsxMl07CisJCXN0cnVjdCBfZnB4X3N3X2J5dGVzIHN3X3Jlc2VydmVkOyAvKiByZXByZXNlbnRzIHRoZSBleHRlbmRlZAorCQkJCQkJICAgKiBzdGF0ZSBpbmZvICovCisJfTsKK307CisKKyNkZWZpbmUgWDg2X0ZYU1JfTUFHSUMJCTB4MDAwMAorCisvKgorICogVXNlci1zcGFjZSBtaWdodCBzdGlsbCByZWx5IG9uIHRoZSBvbGQgZGVmaW5pdGlvbjoKKyAqLworc3RydWN0IHNpZ2NvbnRleHQgeworCXVuc2lnbmVkIHNob3J0IGdzLCBfX2dzaDsKKwl1bnNpZ25lZCBzaG9ydCBmcywgX19mc2g7CisJdW5zaWduZWQgc2hvcnQgZXMsIF9fZXNoOworCXVuc2lnbmVkIHNob3J0IGRzLCBfX2RzaDsKKwl1bnNpZ25lZCBsb25nIGVkaTsKKwl1bnNpZ25lZCBsb25nIGVzaTsKKwl1bnNpZ25lZCBsb25nIGVicDsKKwl1bnNpZ25lZCBsb25nIGVzcDsKKwl1bnNpZ25lZCBsb25nIGVieDsKKwl1bnNpZ25lZCBsb25nIGVkeDsKKwl1bnNpZ25lZCBsb25nIGVjeDsKKwl1bnNpZ25lZCBsb25nIGVheDsKKwl1bnNpZ25lZCBsb25nIHRyYXBubzsKKwl1bnNpZ25lZCBsb25nIGVycjsKKwl1bnNpZ25lZCBsb25nIGVpcDsKKwl1bnNpZ25lZCBzaG9ydCBjcywgX19jc2g7CisJdW5zaWduZWQgbG9uZyBlZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBlc3BfYXRfc2lnbmFsOworCXVuc2lnbmVkIHNob3J0IHNzLCBfX3NzaDsKKwlzdHJ1Y3QgX2Zwc3RhdGUgKmZwc3RhdGU7CisJdW5zaWduZWQgbG9uZyBvbGRtYXNrOworCXVuc2lnbmVkIGxvbmcgY3IyOworfTsKKworI2Vsc2UgLyogX19pMzg2X18gKi8KKworLyogRlhTQVZFIGZyYW1lICovCisvKiBOb3RlOiByZXNlcnZlZDEvMiBtYXkgc29tZWRheSBjb250YWluIHZhbHVhYmxlIGRhdGEuIEFsd2F5cyBzYXZlL3Jlc3RvcmUKKyAgIHRoZW0gd2hlbiB5b3UgY2hhbmdlIHNpZ25hbCBmcmFtZXMuICovCitzdHJ1Y3QgX2Zwc3RhdGUgeworCV9fdTE2CWN3ZDsKKwlfX3UxNglzd2Q7CisJX191MTYJdHdkOwkJLyogTm90ZSB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUKKwkJCQkgICAzMmJpdC94ODcvRlNBVkUgdHdkICovCisJX191MTYJZm9wOworCV9fdTY0CXJpcDsKKwlfX3U2NAlyZHA7CisJX191MzIJbXhjc3I7CisJX191MzIJbXhjc3JfbWFzazsKKwlfX3UzMglzdF9zcGFjZVszMl07CS8qIDgqMTYgYnl0ZXMgZm9yIGVhY2ggRlAtcmVnICovCisJX191MzIJeG1tX3NwYWNlWzY0XTsJLyogMTYqMTYgYnl0ZXMgZm9yIGVhY2ggWE1NLXJlZyAgKi8KKwlfX3UzMglyZXNlcnZlZDJbMTJdOworCXVuaW9uIHsKKwkJX191MzIJcmVzZXJ2ZWQzWzEyXTsKKwkJc3RydWN0IF9mcHhfc3dfYnl0ZXMgc3dfcmVzZXJ2ZWQ7IC8qIHJlcHJlc2VudHMgdGhlIGV4dGVuZGVkCisJCQkJCQkgICAqIHN0YXRlIGluZm9ybWF0aW9uICovCisJfTsKK307CisKKy8qCisgKiBVc2VyLXNwYWNlIG1pZ2h0IHN0aWxsIHJlbHkgb24gdGhlIG9sZCBkZWZpbml0aW9uOgorICovCitzdHJ1Y3Qgc2lnY29udGV4dCB7CisJdW5zaWduZWQgbG9uZyByODsKKwl1bnNpZ25lZCBsb25nIHI5OworCXVuc2lnbmVkIGxvbmcgcjEwOworCXVuc2lnbmVkIGxvbmcgcjExOworCXVuc2lnbmVkIGxvbmcgcjEyOworCXVuc2lnbmVkIGxvbmcgcjEzOworCXVuc2lnbmVkIGxvbmcgcjE0OworCXVuc2lnbmVkIGxvbmcgcjE1OworCXVuc2lnbmVkIGxvbmcgcmRpOworCXVuc2lnbmVkIGxvbmcgcnNpOworCXVuc2lnbmVkIGxvbmcgcmJwOworCXVuc2lnbmVkIGxvbmcgcmJ4OworCXVuc2lnbmVkIGxvbmcgcmR4OworCXVuc2lnbmVkIGxvbmcgcmF4OworCXVuc2lnbmVkIGxvbmcgcmN4OworCXVuc2lnbmVkIGxvbmcgcnNwOworCXVuc2lnbmVkIGxvbmcgcmlwOworCXVuc2lnbmVkIGxvbmcgZWZsYWdzOwkJLyogUkZMQUdTICovCisJdW5zaWduZWQgc2hvcnQgY3M7CisJdW5zaWduZWQgc2hvcnQgZ3M7CisJdW5zaWduZWQgc2hvcnQgZnM7CisJdW5zaWduZWQgc2hvcnQgX19wYWQwOworCXVuc2lnbmVkIGxvbmcgZXJyOworCXVuc2lnbmVkIGxvbmcgdHJhcG5vOworCXVuc2lnbmVkIGxvbmcgb2xkbWFzazsKKwl1bnNpZ25lZCBsb25nIGNyMjsKKwlzdHJ1Y3QgX2Zwc3RhdGUgKmZwc3RhdGU7CS8qIHplcm8gd2hlbiBubyBGUFUgY29udGV4dCAqLworCXVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQxWzhdOworfTsKKworI2VuZGlmIC8qICFfX2kzODZfXyAqLworCitzdHJ1Y3QgX3hzYXZlX2hkciB7CisJX191NjQgeHN0YXRlX2J2OworCV9fdTY0IHJlc2VydmVkMVsyXTsKKwlfX3U2NCByZXNlcnZlZDJbNV07Cit9OworCitzdHJ1Y3QgX3ltbWhfc3RhdGUgeworCS8qIDE2ICogMTYgYnl0ZXMgZm9yIGVhY2ggWU1NSC1yZWcgKi8KKwlfX3UzMiB5bW1oX3NwYWNlWzY0XTsKK307CisKKy8qCisgKiBFeHRlbmRlZCBzdGF0ZSBwb2ludGVkIGJ5IHRoZSBmcHN0YXRlIHBvaW50ZXIgaW4gdGhlIHNpZ2NvbnRleHQuCisgKiBJbiBhZGRpdGlvbiB0byB0aGUgZnBzdGF0ZSwgaW5mb3JtYXRpb24gZW5jb2RlZCBpbiB0aGUgeHN0YXRlX2hkcgorICogaW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBvZiBvdGhlciBleHRlbmRlZCBzdGF0ZSBpbmZvcm1hdGlvbgorICogc3VwcG9ydGVkIGJ5IHRoZSBwcm9jZXNzb3IgYW5kIE9TLgorICovCitzdHJ1Y3QgX3hzdGF0ZSB7CisJc3RydWN0IF9mcHN0YXRlIGZwc3RhdGU7CisJc3RydWN0IF94c2F2ZV9oZHIgeHN0YXRlX2hkcjsKKwlzdHJ1Y3QgX3ltbWhfc3RhdGUgeW1taDsKKwkvKiBuZXcgcHJvY2Vzc29yIHN0YXRlIGV4dGVuc2lvbnMgZ28gaGVyZSAqLworfTsKKworI2VuZGlmIC8qIF9BU01fWDg2X1NJR0NPTlRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zaWdjb250ZXh0MzIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc2lnY29udGV4dDMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxNDc4YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc2lnY29udGV4dDMyLmgKQEAgLTAsMCArMSw3NyBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TSUdDT05URVhUMzJfSAorI2RlZmluZSBfQVNNX1g4Nl9TSUdDT05URVhUMzJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogc2lnbmFsIGNvbnRleHQgZm9yIDMyYml0IHByb2dyYW1zLiAqLworCisjZGVmaW5lIFg4Nl9GWFNSX01BR0lDCQkweDAwMDAKKworc3RydWN0IF9mcHJlZyB7CisJdW5zaWduZWQgc2hvcnQgc2lnbmlmaWNhbmRbNF07CisJdW5zaWduZWQgc2hvcnQgZXhwb25lbnQ7Cit9OworCitzdHJ1Y3QgX2ZweHJlZyB7CisJdW5zaWduZWQgc2hvcnQgc2lnbmlmaWNhbmRbNF07CisJdW5zaWduZWQgc2hvcnQgZXhwb25lbnQ7CisJdW5zaWduZWQgc2hvcnQgcGFkZGluZ1szXTsKK307CisKK3N0cnVjdCBfeG1tcmVnIHsKKwlfX3UzMgllbGVtZW50WzRdOworfTsKKworLyogRlNBVkUgZnJhbWUgd2l0aCBleHRlbnNpb25zICovCitzdHJ1Y3QgX2Zwc3RhdGVfaWEzMiB7CisJLyogUmVndWxhciBGUFUgZW52aXJvbm1lbnQgKi8KKwlfX3UzMiAJY3c7CisJX191MzIJc3c7CisJX191MzIJdGFnOwkvKiBub3QgY29tcGF0aWJsZSB0byA2NGJpdCB0d2QgKi8KKwlfX3UzMglpcG9mZjsKKwlfX3UzMgljc3NlbDsKKwlfX3UzMglkYXRhb2ZmOworCV9fdTMyCWRhdGFzZWw7CisJc3RydWN0IF9mcHJlZwlfc3RbOF07CisJdW5zaWduZWQgc2hvcnQJc3RhdHVzOworCXVuc2lnbmVkIHNob3J0CW1hZ2ljOwkJLyogMHhmZmZmID0gcmVndWxhciBGUFUgZGF0YSBvbmx5ICovCisKKwkvKiBGWFNSIEZQVSBlbnZpcm9ubWVudCAqLworCV9fdTMyCV9meHNyX2Vudls2XTsKKwlfX3UzMglteGNzcjsKKwlfX3UzMglyZXNlcnZlZDsKKwlzdHJ1Y3QgX2ZweHJlZwlfZnhzcl9zdFs4XTsKKwlzdHJ1Y3QgX3htbXJlZwlfeG1tWzhdOwkvKiBJdCdzIGFjdHVhbGx5IDE2ICovCisJX191MzIJcGFkZGluZ1s0NF07CisJdW5pb24geworCQlfX3UzMiBwYWRkaW5nMlsxMl07CisJCXN0cnVjdCBfZnB4X3N3X2J5dGVzIHN3X3Jlc2VydmVkOworCX07Cit9OworCitzdHJ1Y3Qgc2lnY29udGV4dF9pYTMyIHsKKyAgICAgICB1bnNpZ25lZCBzaG9ydCBncywgX19nc2g7CisgICAgICAgdW5zaWduZWQgc2hvcnQgZnMsIF9fZnNoOworICAgICAgIHVuc2lnbmVkIHNob3J0IGVzLCBfX2VzaDsKKyAgICAgICB1bnNpZ25lZCBzaG9ydCBkcywgX19kc2g7CisgICAgICAgdW5zaWduZWQgaW50IGRpOworICAgICAgIHVuc2lnbmVkIGludCBzaTsKKyAgICAgICB1bnNpZ25lZCBpbnQgYnA7CisgICAgICAgdW5zaWduZWQgaW50IHNwOworICAgICAgIHVuc2lnbmVkIGludCBieDsKKyAgICAgICB1bnNpZ25lZCBpbnQgZHg7CisgICAgICAgdW5zaWduZWQgaW50IGN4OworICAgICAgIHVuc2lnbmVkIGludCBheDsKKyAgICAgICB1bnNpZ25lZCBpbnQgdHJhcG5vOworICAgICAgIHVuc2lnbmVkIGludCBlcnI7CisgICAgICAgdW5zaWduZWQgaW50IGlwOworICAgICAgIHVuc2lnbmVkIHNob3J0IGNzLCBfX2NzaDsKKyAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7CisgICAgICAgdW5zaWduZWQgaW50IHNwX2F0X3NpZ25hbDsKKyAgICAgICB1bnNpZ25lZCBzaG9ydCBzcywgX19zc2g7CisgICAgICAgdW5zaWduZWQgaW50IGZwc3RhdGU7CQkvKiByZWFsbHkgKHN0cnVjdCBfZnBzdGF0ZV9pYTMyICopICovCisgICAgICAgdW5zaWduZWQgaW50IG9sZG1hc2s7CisgICAgICAgdW5zaWduZWQgaW50IGNyMjsKK307CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TSUdDT05URVhUMzJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zaWdpbmZvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NpZ2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzFhYTU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zaWdpbmZvLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TSUdJTkZPX0gKKyNkZWZpbmUgX0FTTV9YODZfU0lHSU5GT19ICisKKyNpZmRlZiBfX3g4Nl82NF9fCisjIGRlZmluZSBfX0FSQ0hfU0lfUFJFQU1CTEVfU0laRQkoNCAqIHNpemVvZihpbnQpKQorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zaWdpbmZvLmg+CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TSUdJTkZPX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc2lnbmFsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjM2ExZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NpZ25hbC5oCkBAIC0wLDAgKzEsMTQwIEBACisjaWZuZGVmIF9BU01fWDg2X1NJR05BTF9ICisjZGVmaW5lIF9BU01fWDg2X1NJR05BTF9ICisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKworLyogQXZvaWQgdG9vIG1hbnkgaGVhZGVyIG9yZGVyaW5nIHByb2JsZW1zLiAgKi8KK3N0cnVjdCBzaWdpbmZvOworCisvKiBIZXJlIHdlIG11c3QgY2F0ZXIgdG8gbGliY3MgdGhhdCBwb2tlIGFib3V0IGluIGtlcm5lbCBoZWFkZXJzLiAgKi8KKworI2RlZmluZSBOU0lHCQkzMgordHlwZWRlZiB1bnNpZ25lZCBsb25nIHNpZ3NldF90OworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNkZWZpbmUgU0lHSFVQCQkgMQorI2RlZmluZSBTSUdJTlQJCSAyCisjZGVmaW5lIFNJR1FVSVQJCSAzCisjZGVmaW5lIFNJR0lMTAkJIDQKKyNkZWZpbmUgU0lHVFJBUAkJIDUKKyNkZWZpbmUgU0lHQUJSVAkJIDYKKyNkZWZpbmUgU0lHSU9UCQkgNgorI2RlZmluZSBTSUdCVVMJCSA3CisjZGVmaW5lIFNJR0ZQRQkJIDgKKyNkZWZpbmUgU0lHS0lMTAkJIDkKKyNkZWZpbmUgU0lHVVNSMQkJMTAKKyNkZWZpbmUgU0lHU0VHVgkJMTEKKyNkZWZpbmUgU0lHVVNSMgkJMTIKKyNkZWZpbmUgU0lHUElQRQkJMTMKKyNkZWZpbmUgU0lHQUxSTQkJMTQKKyNkZWZpbmUgU0lHVEVSTQkJMTUKKyNkZWZpbmUgU0lHU1RLRkxUCTE2CisjZGVmaW5lIFNJR0NITEQJCTE3CisjZGVmaW5lIFNJR0NPTlQJCTE4CisjZGVmaW5lIFNJR1NUT1AJCTE5CisjZGVmaW5lIFNJR1RTVFAJCTIwCisjZGVmaW5lIFNJR1RUSU4JCTIxCisjZGVmaW5lIFNJR1RUT1UJCTIyCisjZGVmaW5lIFNJR1VSRwkJMjMKKyNkZWZpbmUgU0lHWENQVQkJMjQKKyNkZWZpbmUgU0lHWEZTWgkJMjUKKyNkZWZpbmUgU0lHVlRBTFJNCTI2CisjZGVmaW5lIFNJR1BST0YJCTI3CisjZGVmaW5lIFNJR1dJTkNICTI4CisjZGVmaW5lIFNJR0lPCQkyOQorI2RlZmluZSBTSUdQT0xMCQlTSUdJTworLyoKKyNkZWZpbmUgU0lHTE9TVAkJMjkKKyovCisjZGVmaW5lIFNJR1BXUgkJMzAKKyNkZWZpbmUgU0lHU1lTCQkzMQorI2RlZmluZQlTSUdVTlVTRUQJMzEKKworLyogVGhlc2Ugc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGNvbnN0YW50cyBmcm9tIHVzZXJsYW5kLiAgKi8KKyNkZWZpbmUgU0lHUlRNSU4JMzIKKyNkZWZpbmUgU0lHUlRNQVgJX05TSUcKKworLyoKKyAqIFNBX0ZMQUdTIHZhbHVlczoKKyAqCisgKiBTQV9PTlNUQUNLIGluZGljYXRlcyB0aGF0IGEgcmVnaXN0ZXJlZCBzdGFja190IHdpbGwgYmUgdXNlZC4KKyAqIFNBX1JFU1RBUlQgZmxhZyB0byBnZXQgcmVzdGFydGluZyBzaWduYWxzICh3aGljaCB3ZXJlIHRoZSBkZWZhdWx0IGxvbmcgYWdvKQorICogU0FfTk9DTERTVE9QIGZsYWcgdG8gdHVybiBvZmYgU0lHQ0hMRCB3aGVuIGNoaWxkcmVuIHN0b3AuCisgKiBTQV9SRVNFVEhBTkQgY2xlYXJzIHRoZSBoYW5kbGVyIHdoZW4gdGhlIHNpZ25hbCBpcyBkZWxpdmVyZWQuCisgKiBTQV9OT0NMRFdBSVQgZmxhZyBvbiBTSUdDSExEIHRvIGluaGliaXQgem9tYmllcy4KKyAqIFNBX05PREVGRVIgcHJldmVudHMgdGhlIGN1cnJlbnQgc2lnbmFsIGZyb20gYmVpbmcgbWFza2VkIGluIHRoZSBoYW5kbGVyLgorICoKKyAqIFNBX09ORVNIT1QgYW5kIFNBX05PTUFTSyBhcmUgdGhlIGhpc3RvcmljYWwgTGludXggbmFtZXMgZm9yIHRoZSBTaW5nbGUKKyAqIFVuaXggbmFtZXMgUkVTRVRIQU5EIGFuZCBOT0RFRkVSIHJlc3BlY3RpdmVseS4KKyAqLworI2RlZmluZSBTQV9OT0NMRFNUT1AJMHgwMDAwMDAwMXUKKyNkZWZpbmUgU0FfTk9DTERXQUlUCTB4MDAwMDAwMDJ1CisjZGVmaW5lIFNBX1NJR0lORk8JMHgwMDAwMDAwNHUKKyNkZWZpbmUgU0FfT05TVEFDSwkweDA4MDAwMDAwdQorI2RlZmluZSBTQV9SRVNUQVJUCTB4MTAwMDAwMDB1CisjZGVmaW5lIFNBX05PREVGRVIJMHg0MDAwMDAwMHUKKyNkZWZpbmUgU0FfUkVTRVRIQU5ECTB4ODAwMDAwMDB1CisKKyNkZWZpbmUgU0FfTk9NQVNLCVNBX05PREVGRVIKKyNkZWZpbmUgU0FfT05FU0hPVAlTQV9SRVNFVEhBTkQKKworI2RlZmluZSBTQV9SRVNUT1JFUgkweDA0MDAwMDAwCisKKy8qCisgKiBzaWdhbHRzdGFjayBjb250cm9scworICovCisjZGVmaW5lIFNTX09OU1RBQ0sJMQorI2RlZmluZSBTU19ESVNBQkxFCTIKKworI2RlZmluZSBNSU5TSUdTVEtTWgkyMDQ4CisjZGVmaW5lIFNJR1NUS1NaCTgxOTIKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ25hbC1kZWZzLmg+CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKworI2lmZGVmIF9faTM4Nl9fCisvKiBIZXJlIHdlIG11c3QgY2F0ZXIgdG8gbGliY3MgdGhhdCBwb2tlIGFib3V0IGluIGtlcm5lbCBoZWFkZXJzLiAgKi8KKworc3RydWN0IHNpZ2FjdGlvbiB7CisJdW5pb24geworCSAgX19zaWdoYW5kbGVyX3QgX3NhX2hhbmRsZXI7CisJICB2b2lkICgqX3NhX3NpZ2FjdGlvbikoaW50LCBzdHJ1Y3Qgc2lnaW5mbyAqLCB2b2lkICopOworCX0gX3U7CisJc2lnc2V0X3Qgc2FfbWFzazsKKwl1bnNpZ25lZCBsb25nIHNhX2ZsYWdzOworCXZvaWQgKCpzYV9yZXN0b3Jlcikodm9pZCk7Cit9OworCisjZGVmaW5lIHNhX2hhbmRsZXIJX3UuX3NhX2hhbmRsZXIKKyNkZWZpbmUgc2Ffc2lnYWN0aW9uCV91Ll9zYV9zaWdhY3Rpb24KKworI2Vsc2UgLyogX19pMzg2X18gKi8KKworc3RydWN0IHNpZ2FjdGlvbiB7CisJX19zaWdoYW5kbGVyX3Qgc2FfaGFuZGxlcjsKKwl1bnNpZ25lZCBsb25nIHNhX2ZsYWdzOworCV9fc2lncmVzdG9yZV90IHNhX3Jlc3RvcmVyOworCXNpZ3NldF90IHNhX21hc2s7CQkvKiBtYXNrIGxhc3QgZm9yIGV4dGVuc2liaWxpdHkgKi8KK307CisKK3N0cnVjdCBrX3NpZ2FjdGlvbiB7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKK307CisKKyNlbmRpZiAvKiAhX19pMzg2X18gKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc2lnYWx0c3RhY2sgeworCXZvaWQgKnNzX3NwOworCWludCBzc19mbGFnczsKKwlzaXplX3Qgc3Nfc2l6ZTsKK30gc3RhY2tfdDsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX0FTTV9YODZfU0lHTkFMX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc29ja2V0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNzEzODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NvY2tldC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zb2NrZXQuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc29ja2lvcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zb2NraW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmNmQ0NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc29ja2lvcy5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zb2NraW9zLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3N0YXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjFkOWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3N0YXQuaApAQCAtMCwwICsxLDExNCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TVEFUX0gKKyNkZWZpbmUgX0FTTV9YODZfU1RBVF9ICisKKyNkZWZpbmUgU1RBVF9IQVZFX05TRUMgMQorCisjaWZkZWYgX19pMzg2X18KK3N0cnVjdCBzdGF0IHsKKwl1bnNpZ25lZCBsb25nICBzdF9kZXY7CisJdW5zaWduZWQgbG9uZyAgc3RfaW5vOworCXVuc2lnbmVkIHNob3J0IHN0X21vZGU7CisJdW5zaWduZWQgc2hvcnQgc3Rfbmxpbms7CisJdW5zaWduZWQgc2hvcnQgc3RfdWlkOworCXVuc2lnbmVkIHNob3J0IHN0X2dpZDsKKwl1bnNpZ25lZCBsb25nICBzdF9yZGV2OworCXVuc2lnbmVkIGxvbmcgIHN0X3NpemU7CisJdW5zaWduZWQgbG9uZyAgc3RfYmxrc2l6ZTsKKwl1bnNpZ25lZCBsb25nICBzdF9ibG9ja3M7CisJdW5zaWduZWQgbG9uZyAgc3RfYXRpbWU7CisJdW5zaWduZWQgbG9uZyAgc3RfYXRpbWVfbnNlYzsKKwl1bnNpZ25lZCBsb25nICBzdF9tdGltZTsKKwl1bnNpZ25lZCBsb25nICBzdF9tdGltZV9uc2VjOworCXVuc2lnbmVkIGxvbmcgIHN0X2N0aW1lOworCXVuc2lnbmVkIGxvbmcgIHN0X2N0aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZyAgX191bnVzZWQ0OworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNTsKK307CisKKyNkZWZpbmUgU1RBVDY0X0hBU19CUk9LRU5fU1RfSU5PCTEKKworLyogVGhpcyBtYXRjaGVzIHN0cnVjdCBzdGF0NjQgaW4gZ2xpYmMyLjEsIGhlbmNlIHRoZSBhYnNvbHV0ZWx5CisgKiBpbnNhbmUgYW1vdW50cyBvZiBwYWRkaW5nIGFyb3VuZCBkZXZfdCdzLgorICovCitzdHJ1Y3Qgc3RhdDY0IHsKKwl1bnNpZ25lZCBsb25nIGxvbmcJc3RfZGV2OworCXVuc2lnbmVkIGNoYXIJX19wYWQwWzRdOworCisJdW5zaWduZWQgbG9uZwlfX3N0X2lubzsKKworCXVuc2lnbmVkIGludAlzdF9tb2RlOworCXVuc2lnbmVkIGludAlzdF9ubGluazsKKworCXVuc2lnbmVkIGxvbmcJc3RfdWlkOworCXVuc2lnbmVkIGxvbmcJc3RfZ2lkOworCisJdW5zaWduZWQgbG9uZyBsb25nCXN0X3JkZXY7CisJdW5zaWduZWQgY2hhcglfX3BhZDNbNF07CisKKwlsb25nIGxvbmcJc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nCXN0X2Jsa3NpemU7CisKKwkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcJc3RfYmxvY2tzOworCisJdW5zaWduZWQgbG9uZwlzdF9hdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X2F0aW1lX25zZWM7CisKKwl1bnNpZ25lZCBsb25nCXN0X210aW1lOworCXVuc2lnbmVkIGludAlzdF9tdGltZV9uc2VjOworCisJdW5zaWduZWQgbG9uZwlzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X2N0aW1lX25zZWM7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcJc3RfaW5vOworfTsKKworI2Vsc2UgLyogX19pMzg2X18gKi8KKworc3RydWN0IHN0YXQgeworCXVuc2lnbmVkIGxvbmcJc3RfZGV2OworCXVuc2lnbmVkIGxvbmcJc3RfaW5vOworCXVuc2lnbmVkIGxvbmcJc3Rfbmxpbms7CisKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3RfdWlkOworCXVuc2lnbmVkIGludAlzdF9naWQ7CisJdW5zaWduZWQgaW50CV9fcGFkMDsKKwl1bnNpZ25lZCBsb25nCXN0X3JkZXY7CisJbG9uZwkJc3Rfc2l6ZTsKKwlsb25nCQlzdF9ibGtzaXplOworCWxvbmcJCXN0X2Jsb2NrczsJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisKKwl1bnNpZ25lZCBsb25nCXN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWVfbnNlYzsKKwl1bnNpZ25lZCBsb25nCXN0X210aW1lOworCXVuc2lnbmVkIGxvbmcJc3RfbXRpbWVfbnNlYzsKKwl1bnNpZ25lZCBsb25nCXN0X2N0aW1lOworCXVuc2lnbmVkIGxvbmcgICBzdF9jdGltZV9uc2VjOworCWxvbmcJCV9fdW51c2VkWzNdOworfTsKKyNlbmRpZgorCisvKiBmb3IgMzJiaXQgZW11bGF0aW9uIGFuZCAzMiBiaXQga2VybmVscyAqLworc3RydWN0IF9fb2xkX2tlcm5lbF9zdGF0IHsKKwl1bnNpZ25lZCBzaG9ydCBzdF9kZXY7CisJdW5zaWduZWQgc2hvcnQgc3RfaW5vOworCXVuc2lnbmVkIHNob3J0IHN0X21vZGU7CisJdW5zaWduZWQgc2hvcnQgc3Rfbmxpbms7CisJdW5zaWduZWQgc2hvcnQgc3RfdWlkOworCXVuc2lnbmVkIHNob3J0IHN0X2dpZDsKKwl1bnNpZ25lZCBzaG9ydCBzdF9yZGV2OworI2lmZGVmIF9faTM4Nl9fCisJdW5zaWduZWQgbG9uZyAgc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nICBzdF9hdGltZTsKKwl1bnNpZ25lZCBsb25nICBzdF9tdGltZTsKKwl1bnNpZ25lZCBsb25nICBzdF9jdGltZTsKKyNlbHNlCisJdW5zaWduZWQgaW50ICBzdF9zaXplOworCXVuc2lnbmVkIGludCAgc3RfYXRpbWU7CisJdW5zaWduZWQgaW50ICBzdF9tdGltZTsKKwl1bnNpZ25lZCBpbnQgIHN0X2N0aW1lOworI2VuZGlmCit9OworCisjZW5kaWYgLyogX0FTTV9YODZfU1RBVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3N0YXRmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zdGF0ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDBhZGJmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zdGF0ZnMuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fWDg2X1NUQVRGU19ICisjZGVmaW5lIF9BU01fWDg2X1NUQVRGU19ICisKKy8qCisgKiBXZSBuZWVkIGNvbXBhdF9zdGF0ZnM2NCB0byBiZSBwYWNrZWQsIGJlY2F1c2UgdGhlIGkzODYgQUJJIHdvbid0CisgKiBhZGQgcGFkZGluZyBhdCB0aGUgZW5kIHRvIGJyaW5nIGl0IHRvIGEgbXVsdGlwbGUgb2YgOCBieXRlcywgYnV0CisgKiB0aGUgeDg2XzY0IEFCSSB3aWxsLgorICovCisjZGVmaW5lIEFSQ0hfUEFDS19DT01QQVRfU1RBVEZTNjQgX19hdHRyaWJ1dGVfXygocGFja2VkLGFsaWduZWQoNCkpKQorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc3RhdGZzLmg+CisjZW5kaWYgLyogX0FTTV9YODZfU1RBVEZTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc3dhYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczNjVkZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsNjEgQEAKKyNpZm5kZWYgX0FTTV9YODZfU1dBQl9ICisjZGVmaW5lIF9BU01fWDg2X1NXQUJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX2FyY2hfc3dhYjMyKF9fdTMyIHZhbCkKK3sKKyNpZmRlZiBfX2kzODZfXworIyBpZmRlZiBDT05GSUdfWDg2X0JTV0FQCisJX19hc21fXygiYnN3YXAgJTAiIDogIj1yIiAodmFsKSA6ICIwIiAodmFsKSk7CisjIGVsc2UKKwlfX2FzbV9fKCJ4Y2hnYiAlYjAsJWgwXG5cdCIJLyogc3dhcCBsb3dlciBieXRlcwkqLworCSAgICAicm9ybCAkMTYsJTBcblx0IgkvKiBzd2FwIHdvcmRzCQkqLworCSAgICAieGNoZ2IgJWIwLCVoMCIJLyogc3dhcCBoaWdoZXIgYnl0ZXMJKi8KKwkgICAgOiAiPXEiICh2YWwpCisJICAgIDogIjAiICh2YWwpKTsKKyMgZW5kaWYKKworI2Vsc2UgLyogX19pMzg2X18gKi8KKwlfX2FzbV9fKCJic3dhcGwgJTAiCisJICAgIDogIj1yIiAodmFsKQorCSAgICA6ICIwIiAodmFsKSk7CisjZW5kaWYKKwlyZXR1cm4gdmFsOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworc3RhdGljIF9faW5saW5lX18gX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB2YWwpCit7CisjaWZkZWYgX19pMzg2X18KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3UzMiBhOworCQkJX191MzIgYjsKKwkJfSBzOworCQlfX3U2NCB1OworCX0gdjsKKwl2LnUgPSB2YWw7CisjIGlmZGVmIENPTkZJR19YODZfQlNXQVAKKwlfX2FzbV9fKCJic3dhcGwgJTAgOyBic3dhcGwgJTEgOyB4Y2hnbCAlMCwlMSIKKwkgICAgOiAiPXIiICh2LnMuYSksICI9ciIgKHYucy5iKQorCSAgICA6ICIwIiAodi5zLmEpLCAiMSIgKHYucy5iKSk7CisjIGVsc2UKKwl2LnMuYSA9IF9fYXJjaF9zd2FiMzIodi5zLmEpOworCXYucy5iID0gX19hcmNoX3N3YWIzMih2LnMuYik7CisJX19hc21fXygieGNoZ2wgJTAsJTEiCisJICAgIDogIj1yIiAodi5zLmEpLCAiPXIiICh2LnMuYikKKwkgICAgOiAiMCIgKHYucy5hKSwgIjEiICh2LnMuYikpOworIyBlbmRpZgorCXJldHVybiB2LnU7CisjZWxzZSAvKiBfX2kzODZfXyAqLworCV9fYXNtX18oImJzd2FwcSAlMCIKKwkgICAgOiAiPXIiICh2YWwpCisJICAgIDogIjAiICh2YWwpKTsKKwlyZXR1cm4gdmFsOworI2VuZGlmCit9CisjZGVmaW5lIF9fYXJjaF9zd2FiNjQgX19hcmNoX3N3YWI2NAorCisjZW5kaWYgLyogX0FTTV9YODZfU1dBQl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Rlcm1iaXRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Rlcm1iaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkzNWIxMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdGVybWJpdHMuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdGVybWJpdHMuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdGVybWlvcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS90ZXJtaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwZDc4YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdGVybWlvcy5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy90ZXJtaW9zLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3R5cGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4YzIzZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdHlwZXMuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX0FTTV9YODZfVFlQRVNfSAorI2RlZmluZSBfQVNNX1g4Nl9UWVBFU19ICisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy90eXBlcy5oPgorCisjZW5kaWYgLyogX0FTTV9YODZfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS91Y29udGV4dC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS91Y29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzI5YzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Vjb250ZXh0LmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9VQ09OVEVYVF9ICisjZGVmaW5lIF9BU01fWDg2X1VDT05URVhUX0gKKworI2RlZmluZSBVQ19GUF9YU1RBVEUJMHgxCS8qIGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YgZXh0ZW5kZWQgc3RhdGUKKwkJCQkgKiBpbmZvcm1hdGlvbiBpbiB0aGUgbWVtb3J5IGxheW91dCBwb2ludGVkCisJCQkJICogYnkgdGhlIGZwc3RhdGUgcG9pbnRlciBpbiB0aGUgdWNvbnRleHQncworCQkJCSAqIHNpZ2NvbnRleHQgc3RydWN0ICh1Y19tY29udGV4dCkuCisJCQkJICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy91Y29udGV4dC5oPgorCisjZW5kaWYgLyogX0FTTV9YODZfVUNPTlRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS91bmlzdGQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlZDkxMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdW5pc3RkLmgKQEAgLTAsMCArMSw1IEBACisjIGlmZGVmIF9faTM4Nl9fCisjICBpbmNsdWRlIDxhc20vdW5pc3RkXzMyLmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPGFzbS91bmlzdGRfNjQuaD4KKyMgZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdW5pc3RkXzMyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3VuaXN0ZF8zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTc5ODAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3VuaXN0ZF8zMi5oCkBAIC0wLDAgKzEsMzU4IEBACisjaWZuZGVmIF9BU01fWDg2X1VOSVNURF8zMl9ICisjZGVmaW5lIF9BU01fWDg2X1VOSVNURF8zMl9ICisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN5c3RlbSBjYWxsIG51bWJlcnMuCisgKi8KKworI2RlZmluZSBfX05SX3Jlc3RhcnRfc3lzY2FsbCAgICAgIDAKKyNkZWZpbmUgX19OUl9leGl0CQkgIDEKKyNkZWZpbmUgX19OUl9mb3JrCQkgIDIKKyNkZWZpbmUgX19OUl9yZWFkCQkgIDMKKyNkZWZpbmUgX19OUl93cml0ZQkJICA0CisjZGVmaW5lIF9fTlJfb3BlbgkJICA1CisjZGVmaW5lIF9fTlJfY2xvc2UJCSAgNgorI2RlZmluZSBfX05SX3dhaXRwaWQJCSAgNworI2RlZmluZSBfX05SX2NyZWF0CQkgIDgKKyNkZWZpbmUgX19OUl9saW5rCQkgIDkKKyNkZWZpbmUgX19OUl91bmxpbmsJCSAxMAorI2RlZmluZSBfX05SX2V4ZWN2ZQkJIDExCisjZGVmaW5lIF9fTlJfY2hkaXIJCSAxMgorI2RlZmluZSBfX05SX3RpbWUJCSAxMworI2RlZmluZSBfX05SX21rbm9kCQkgMTQKKyNkZWZpbmUgX19OUl9jaG1vZAkJIDE1CisjZGVmaW5lIF9fTlJfbGNob3duCQkgMTYKKyNkZWZpbmUgX19OUl9icmVhawkJIDE3CisjZGVmaW5lIF9fTlJfb2xkc3RhdAkJIDE4CisjZGVmaW5lIF9fTlJfbHNlZWsJCSAxOQorI2RlZmluZSBfX05SX2dldHBpZAkJIDIwCisjZGVmaW5lIF9fTlJfbW91bnQJCSAyMQorI2RlZmluZSBfX05SX3Vtb3VudAkJIDIyCisjZGVmaW5lIF9fTlJfc2V0dWlkCQkgMjMKKyNkZWZpbmUgX19OUl9nZXR1aWQJCSAyNAorI2RlZmluZSBfX05SX3N0aW1lCQkgMjUKKyNkZWZpbmUgX19OUl9wdHJhY2UJCSAyNgorI2RlZmluZSBfX05SX2FsYXJtCQkgMjcKKyNkZWZpbmUgX19OUl9vbGRmc3RhdAkJIDI4CisjZGVmaW5lIF9fTlJfcGF1c2UJCSAyOQorI2RlZmluZSBfX05SX3V0aW1lCQkgMzAKKyNkZWZpbmUgX19OUl9zdHR5CQkgMzEKKyNkZWZpbmUgX19OUl9ndHR5CQkgMzIKKyNkZWZpbmUgX19OUl9hY2Nlc3MJCSAzMworI2RlZmluZSBfX05SX25pY2UJCSAzNAorI2RlZmluZSBfX05SX2Z0aW1lCQkgMzUKKyNkZWZpbmUgX19OUl9zeW5jCQkgMzYKKyNkZWZpbmUgX19OUl9raWxsCQkgMzcKKyNkZWZpbmUgX19OUl9yZW5hbWUJCSAzOAorI2RlZmluZSBfX05SX21rZGlyCQkgMzkKKyNkZWZpbmUgX19OUl9ybWRpcgkJIDQwCisjZGVmaW5lIF9fTlJfZHVwCQkgNDEKKyNkZWZpbmUgX19OUl9waXBlCQkgNDIKKyNkZWZpbmUgX19OUl90aW1lcwkJIDQzCisjZGVmaW5lIF9fTlJfcHJvZgkJIDQ0CisjZGVmaW5lIF9fTlJfYnJrCQkgNDUKKyNkZWZpbmUgX19OUl9zZXRnaWQJCSA0NgorI2RlZmluZSBfX05SX2dldGdpZAkJIDQ3CisjZGVmaW5lIF9fTlJfc2lnbmFsCQkgNDgKKyNkZWZpbmUgX19OUl9nZXRldWlkCQkgNDkKKyNkZWZpbmUgX19OUl9nZXRlZ2lkCQkgNTAKKyNkZWZpbmUgX19OUl9hY2N0CQkgNTEKKyNkZWZpbmUgX19OUl91bW91bnQyCQkgNTIKKyNkZWZpbmUgX19OUl9sb2NrCQkgNTMKKyNkZWZpbmUgX19OUl9pb2N0bAkJIDU0CisjZGVmaW5lIF9fTlJfZmNudGwJCSA1NQorI2RlZmluZSBfX05SX21weAkJIDU2CisjZGVmaW5lIF9fTlJfc2V0cGdpZAkJIDU3CisjZGVmaW5lIF9fTlJfdWxpbWl0CQkgNTgKKyNkZWZpbmUgX19OUl9vbGRvbGR1bmFtZQkgNTkKKyNkZWZpbmUgX19OUl91bWFzawkJIDYwCisjZGVmaW5lIF9fTlJfY2hyb290CQkgNjEKKyNkZWZpbmUgX19OUl91c3RhdAkJIDYyCisjZGVmaW5lIF9fTlJfZHVwMgkJIDYzCisjZGVmaW5lIF9fTlJfZ2V0cHBpZAkJIDY0CisjZGVmaW5lIF9fTlJfZ2V0cGdycAkJIDY1CisjZGVmaW5lIF9fTlJfc2V0c2lkCQkgNjYKKyNkZWZpbmUgX19OUl9zaWdhY3Rpb24JCSA2NworI2RlZmluZSBfX05SX3NnZXRtYXNrCQkgNjgKKyNkZWZpbmUgX19OUl9zc2V0bWFzawkJIDY5CisjZGVmaW5lIF9fTlJfc2V0cmV1aWQJCSA3MAorI2RlZmluZSBfX05SX3NldHJlZ2lkCQkgNzEKKyNkZWZpbmUgX19OUl9zaWdzdXNwZW5kCQkgNzIKKyNkZWZpbmUgX19OUl9zaWdwZW5kaW5nCQkgNzMKKyNkZWZpbmUgX19OUl9zZXRob3N0bmFtZQkgNzQKKyNkZWZpbmUgX19OUl9zZXRybGltaXQJCSA3NQorI2RlZmluZSBfX05SX2dldHJsaW1pdAkJIDc2ICAgLyogQmFjayBjb21wYXRpYmxlIDJHaWcgbGltaXRlZCBybGltaXQgKi8KKyNkZWZpbmUgX19OUl9nZXRydXNhZ2UJCSA3NworI2RlZmluZSBfX05SX2dldHRpbWVvZmRheQkgNzgKKyNkZWZpbmUgX19OUl9zZXR0aW1lb2ZkYXkJIDc5CisjZGVmaW5lIF9fTlJfZ2V0Z3JvdXBzCQkgODAKKyNkZWZpbmUgX19OUl9zZXRncm91cHMJCSA4MQorI2RlZmluZSBfX05SX3NlbGVjdAkJIDgyCisjZGVmaW5lIF9fTlJfc3ltbGluawkJIDgzCisjZGVmaW5lIF9fTlJfb2xkbHN0YXQJCSA4NAorI2RlZmluZSBfX05SX3JlYWRsaW5rCQkgODUKKyNkZWZpbmUgX19OUl91c2VsaWIJCSA4NgorI2RlZmluZSBfX05SX3N3YXBvbgkJIDg3CisjZGVmaW5lIF9fTlJfcmVib290CQkgODgKKyNkZWZpbmUgX19OUl9yZWFkZGlyCQkgODkKKyNkZWZpbmUgX19OUl9tbWFwCQkgOTAKKyNkZWZpbmUgX19OUl9tdW5tYXAJCSA5MQorI2RlZmluZSBfX05SX3RydW5jYXRlCQkgOTIKKyNkZWZpbmUgX19OUl9mdHJ1bmNhdGUJCSA5MworI2RlZmluZSBfX05SX2ZjaG1vZAkJIDk0CisjZGVmaW5lIF9fTlJfZmNob3duCQkgOTUKKyNkZWZpbmUgX19OUl9nZXRwcmlvcml0eQkgOTYKKyNkZWZpbmUgX19OUl9zZXRwcmlvcml0eQkgOTcKKyNkZWZpbmUgX19OUl9wcm9maWwJCSA5OAorI2RlZmluZSBfX05SX3N0YXRmcwkJIDk5CisjZGVmaW5lIF9fTlJfZnN0YXRmcwkJMTAwCisjZGVmaW5lIF9fTlJfaW9wZXJtCQkxMDEKKyNkZWZpbmUgX19OUl9zb2NrZXRjYWxsCQkxMDIKKyNkZWZpbmUgX19OUl9zeXNsb2cJCTEwMworI2RlZmluZSBfX05SX3NldGl0aW1lcgkJMTA0CisjZGVmaW5lIF9fTlJfZ2V0aXRpbWVyCQkxMDUKKyNkZWZpbmUgX19OUl9zdGF0CQkxMDYKKyNkZWZpbmUgX19OUl9sc3RhdAkJMTA3CisjZGVmaW5lIF9fTlJfZnN0YXQJCTEwOAorI2RlZmluZSBfX05SX29sZHVuYW1lCQkxMDkKKyNkZWZpbmUgX19OUl9pb3BsCQkxMTAKKyNkZWZpbmUgX19OUl92aGFuZ3VwCQkxMTEKKyNkZWZpbmUgX19OUl9pZGxlCQkxMTIKKyNkZWZpbmUgX19OUl92bTg2b2xkCQkxMTMKKyNkZWZpbmUgX19OUl93YWl0NAkJMTE0CisjZGVmaW5lIF9fTlJfc3dhcG9mZgkJMTE1CisjZGVmaW5lIF9fTlJfc3lzaW5mbwkJMTE2CisjZGVmaW5lIF9fTlJfaXBjCQkxMTcKKyNkZWZpbmUgX19OUl9mc3luYwkJMTE4CisjZGVmaW5lIF9fTlJfc2lncmV0dXJuCQkxMTkKKyNkZWZpbmUgX19OUl9jbG9uZQkJMTIwCisjZGVmaW5lIF9fTlJfc2V0ZG9tYWlubmFtZQkxMjEKKyNkZWZpbmUgX19OUl91bmFtZQkJMTIyCisjZGVmaW5lIF9fTlJfbW9kaWZ5X2xkdAkJMTIzCisjZGVmaW5lIF9fTlJfYWRqdGltZXgJCTEyNAorI2RlZmluZSBfX05SX21wcm90ZWN0CQkxMjUKKyNkZWZpbmUgX19OUl9zaWdwcm9jbWFzawkxMjYKKyNkZWZpbmUgX19OUl9jcmVhdGVfbW9kdWxlCTEyNworI2RlZmluZSBfX05SX2luaXRfbW9kdWxlCTEyOAorI2RlZmluZSBfX05SX2RlbGV0ZV9tb2R1bGUJMTI5CisjZGVmaW5lIF9fTlJfZ2V0X2tlcm5lbF9zeW1zCTEzMAorI2RlZmluZSBfX05SX3F1b3RhY3RsCQkxMzEKKyNkZWZpbmUgX19OUl9nZXRwZ2lkCQkxMzIKKyNkZWZpbmUgX19OUl9mY2hkaXIJCTEzMworI2RlZmluZSBfX05SX2JkZmx1c2gJCTEzNAorI2RlZmluZSBfX05SX3N5c2ZzCQkxMzUKKyNkZWZpbmUgX19OUl9wZXJzb25hbGl0eQkxMzYKKyNkZWZpbmUgX19OUl9hZnNfc3lzY2FsbAkxMzcgLyogU3lzY2FsbCBmb3IgQW5kcmV3IEZpbGUgU3lzdGVtICovCisjZGVmaW5lIF9fTlJfc2V0ZnN1aWQJCTEzOAorI2RlZmluZSBfX05SX3NldGZzZ2lkCQkxMzkKKyNkZWZpbmUgX19OUl9fbGxzZWVrCQkxNDAKKyNkZWZpbmUgX19OUl9nZXRkZW50cwkJMTQxCisjZGVmaW5lIF9fTlJfX25ld3NlbGVjdAkJMTQyCisjZGVmaW5lIF9fTlJfZmxvY2sJCTE0MworI2RlZmluZSBfX05SX21zeW5jCQkxNDQKKyNkZWZpbmUgX19OUl9yZWFkdgkJMTQ1CisjZGVmaW5lIF9fTlJfd3JpdGV2CQkxNDYKKyNkZWZpbmUgX19OUl9nZXRzaWQJCTE0NworI2RlZmluZSBfX05SX2ZkYXRhc3luYwkJMTQ4CisjZGVmaW5lIF9fTlJfX3N5c2N0bAkJMTQ5CisjZGVmaW5lIF9fTlJfbWxvY2sJCTE1MAorI2RlZmluZSBfX05SX211bmxvY2sJCTE1MQorI2RlZmluZSBfX05SX21sb2NrYWxsCQkxNTIKKyNkZWZpbmUgX19OUl9tdW5sb2NrYWxsCQkxNTMKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRwYXJhbQkJMTU0CisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0cGFyYW0JCTE1NQorI2RlZmluZSBfX05SX3NjaGVkX3NldHNjaGVkdWxlcgkJMTU2CisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0c2NoZWR1bGVyCQkxNTcKKyNkZWZpbmUgX19OUl9zY2hlZF95aWVsZAkJMTU4CisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heAkxNTkKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWluCTE2MAorI2RlZmluZSBfX05SX3NjaGVkX3JyX2dldF9pbnRlcnZhbAkxNjEKKyNkZWZpbmUgX19OUl9uYW5vc2xlZXAJCTE2MgorI2RlZmluZSBfX05SX21yZW1hcAkJMTYzCisjZGVmaW5lIF9fTlJfc2V0cmVzdWlkCQkxNjQKKyNkZWZpbmUgX19OUl9nZXRyZXN1aWQJCTE2NQorI2RlZmluZSBfX05SX3ZtODYJCTE2NgorI2RlZmluZSBfX05SX3F1ZXJ5X21vZHVsZQkxNjcKKyNkZWZpbmUgX19OUl9wb2xsCQkxNjgKKyNkZWZpbmUgX19OUl9uZnNzZXJ2Y3RsCQkxNjkKKyNkZWZpbmUgX19OUl9zZXRyZXNnaWQJCTE3MAorI2RlZmluZSBfX05SX2dldHJlc2dpZAkJMTcxCisjZGVmaW5lIF9fTlJfcHJjdGwgICAgICAgICAgICAgIDE3MgorI2RlZmluZSBfX05SX3J0X3NpZ3JldHVybgkxNzMKKyNkZWZpbmUgX19OUl9ydF9zaWdhY3Rpb24JMTc0CisjZGVmaW5lIF9fTlJfcnRfc2lncHJvY21hc2sJMTc1CisjZGVmaW5lIF9fTlJfcnRfc2lncGVuZGluZwkxNzYKKyNkZWZpbmUgX19OUl9ydF9zaWd0aW1lZHdhaXQJMTc3CisjZGVmaW5lIF9fTlJfcnRfc2lncXVldWVpbmZvCTE3OAorI2RlZmluZSBfX05SX3J0X3NpZ3N1c3BlbmQJMTc5CisjZGVmaW5lIF9fTlJfcHJlYWQ2NAkJMTgwCisjZGVmaW5lIF9fTlJfcHdyaXRlNjQJCTE4MQorI2RlZmluZSBfX05SX2Nob3duCQkxODIKKyNkZWZpbmUgX19OUl9nZXRjd2QJCTE4MworI2RlZmluZSBfX05SX2NhcGdldAkJMTg0CisjZGVmaW5lIF9fTlJfY2Fwc2V0CQkxODUKKyNkZWZpbmUgX19OUl9zaWdhbHRzdGFjawkxODYKKyNkZWZpbmUgX19OUl9zZW5kZmlsZQkJMTg3CisjZGVmaW5lIF9fTlJfZ2V0cG1zZwkJMTg4CS8qIHNvbWUgcGVvcGxlIGFjdHVhbGx5IHdhbnQgc3RyZWFtcyAqLworI2RlZmluZSBfX05SX3B1dHBtc2cJCTE4OQkvKiBzb21lIHBlb3BsZSBhY3R1YWxseSB3YW50IHN0cmVhbXMgKi8KKyNkZWZpbmUgX19OUl92Zm9yawkJMTkwCisjZGVmaW5lIF9fTlJfdWdldHJsaW1pdAkJMTkxCS8qIFN1UyBjb21wbGlhbnQgZ2V0cmxpbWl0ICovCisjZGVmaW5lIF9fTlJfbW1hcDIJCTE5MgorI2RlZmluZSBfX05SX3RydW5jYXRlNjQJCTE5MworI2RlZmluZSBfX05SX2Z0cnVuY2F0ZTY0CTE5NAorI2RlZmluZSBfX05SX3N0YXQ2NAkJMTk1CisjZGVmaW5lIF9fTlJfbHN0YXQ2NAkJMTk2CisjZGVmaW5lIF9fTlJfZnN0YXQ2NAkJMTk3CisjZGVmaW5lIF9fTlJfbGNob3duMzIJCTE5OAorI2RlZmluZSBfX05SX2dldHVpZDMyCQkxOTkKKyNkZWZpbmUgX19OUl9nZXRnaWQzMgkJMjAwCisjZGVmaW5lIF9fTlJfZ2V0ZXVpZDMyCQkyMDEKKyNkZWZpbmUgX19OUl9nZXRlZ2lkMzIJCTIwMgorI2RlZmluZSBfX05SX3NldHJldWlkMzIJCTIwMworI2RlZmluZSBfX05SX3NldHJlZ2lkMzIJCTIwNAorI2RlZmluZSBfX05SX2dldGdyb3VwczMyCTIwNQorI2RlZmluZSBfX05SX3NldGdyb3VwczMyCTIwNgorI2RlZmluZSBfX05SX2ZjaG93bjMyCQkyMDcKKyNkZWZpbmUgX19OUl9zZXRyZXN1aWQzMgkyMDgKKyNkZWZpbmUgX19OUl9nZXRyZXN1aWQzMgkyMDkKKyNkZWZpbmUgX19OUl9zZXRyZXNnaWQzMgkyMTAKKyNkZWZpbmUgX19OUl9nZXRyZXNnaWQzMgkyMTEKKyNkZWZpbmUgX19OUl9jaG93bjMyCQkyMTIKKyNkZWZpbmUgX19OUl9zZXR1aWQzMgkJMjEzCisjZGVmaW5lIF9fTlJfc2V0Z2lkMzIJCTIxNAorI2RlZmluZSBfX05SX3NldGZzdWlkMzIJCTIxNQorI2RlZmluZSBfX05SX3NldGZzZ2lkMzIJCTIxNgorI2RlZmluZSBfX05SX3Bpdm90X3Jvb3QJCTIxNworI2RlZmluZSBfX05SX21pbmNvcmUJCTIxOAorI2RlZmluZSBfX05SX21hZHZpc2UJCTIxOQorI2RlZmluZSBfX05SX21hZHZpc2UxCQkyMTkJLyogZGVsZXRlIHdoZW4gQyBsaWIgc3R1YiBpcyByZW1vdmVkICovCisjZGVmaW5lIF9fTlJfZ2V0ZGVudHM2NAkJMjIwCisjZGVmaW5lIF9fTlJfZmNudGw2NAkJMjIxCisvKiAyMjMgaXMgdW51c2VkICovCisjZGVmaW5lIF9fTlJfZ2V0dGlkCQkyMjQKKyNkZWZpbmUgX19OUl9yZWFkYWhlYWQJCTIyNQorI2RlZmluZSBfX05SX3NldHhhdHRyCQkyMjYKKyNkZWZpbmUgX19OUl9sc2V0eGF0dHIJCTIyNworI2RlZmluZSBfX05SX2ZzZXR4YXR0cgkJMjI4CisjZGVmaW5lIF9fTlJfZ2V0eGF0dHIJCTIyOQorI2RlZmluZSBfX05SX2xnZXR4YXR0cgkJMjMwCisjZGVmaW5lIF9fTlJfZmdldHhhdHRyCQkyMzEKKyNkZWZpbmUgX19OUl9saXN0eGF0dHIJCTIzMgorI2RlZmluZSBfX05SX2xsaXN0eGF0dHIJCTIzMworI2RlZmluZSBfX05SX2ZsaXN0eGF0dHIJCTIzNAorI2RlZmluZSBfX05SX3JlbW92ZXhhdHRyCTIzNQorI2RlZmluZSBfX05SX2xyZW1vdmV4YXR0cgkyMzYKKyNkZWZpbmUgX19OUl9mcmVtb3ZleGF0dHIJMjM3CisjZGVmaW5lIF9fTlJfdGtpbGwJCTIzOAorI2RlZmluZSBfX05SX3NlbmRmaWxlNjQJCTIzOQorI2RlZmluZSBfX05SX2Z1dGV4CQkyNDAKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRhZmZpbml0eQkyNDEKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eQkyNDIKKyNkZWZpbmUgX19OUl9zZXRfdGhyZWFkX2FyZWEJMjQzCisjZGVmaW5lIF9fTlJfZ2V0X3RocmVhZF9hcmVhCTI0NAorI2RlZmluZSBfX05SX2lvX3NldHVwCQkyNDUKKyNkZWZpbmUgX19OUl9pb19kZXN0cm95CQkyNDYKKyNkZWZpbmUgX19OUl9pb19nZXRldmVudHMJMjQ3CisjZGVmaW5lIF9fTlJfaW9fc3VibWl0CQkyNDgKKyNkZWZpbmUgX19OUl9pb19jYW5jZWwJCTI0OQorI2RlZmluZSBfX05SX2ZhZHZpc2U2NAkJMjUwCisvKiAyNTEgaXMgYXZhaWxhYmxlIGZvciByZXVzZSAod2FzIGJyaWVmbHkgc3lzX3NldF96b25lX3JlY2xhaW0pICovCisjZGVmaW5lIF9fTlJfZXhpdF9ncm91cAkJMjUyCisjZGVmaW5lIF9fTlJfbG9va3VwX2Rjb29raWUJMjUzCisjZGVmaW5lIF9fTlJfZXBvbGxfY3JlYXRlCTI1NAorI2RlZmluZSBfX05SX2Vwb2xsX2N0bAkJMjU1CisjZGVmaW5lIF9fTlJfZXBvbGxfd2FpdAkJMjU2CisjZGVmaW5lIF9fTlJfcmVtYXBfZmlsZV9wYWdlcwkyNTcKKyNkZWZpbmUgX19OUl9zZXRfdGlkX2FkZHJlc3MJMjU4CisjZGVmaW5lIF9fTlJfdGltZXJfY3JlYXRlCTI1OQorI2RlZmluZSBfX05SX3RpbWVyX3NldHRpbWUJKF9fTlJfdGltZXJfY3JlYXRlKzEpCisjZGVmaW5lIF9fTlJfdGltZXJfZ2V0dGltZQkoX19OUl90aW1lcl9jcmVhdGUrMikKKyNkZWZpbmUgX19OUl90aW1lcl9nZXRvdmVycnVuCShfX05SX3RpbWVyX2NyZWF0ZSszKQorI2RlZmluZSBfX05SX3RpbWVyX2RlbGV0ZQkoX19OUl90aW1lcl9jcmVhdGUrNCkKKyNkZWZpbmUgX19OUl9jbG9ja19zZXR0aW1lCShfX05SX3RpbWVyX2NyZWF0ZSs1KQorI2RlZmluZSBfX05SX2Nsb2NrX2dldHRpbWUJKF9fTlJfdGltZXJfY3JlYXRlKzYpCisjZGVmaW5lIF9fTlJfY2xvY2tfZ2V0cmVzCShfX05SX3RpbWVyX2NyZWF0ZSs3KQorI2RlZmluZSBfX05SX2Nsb2NrX25hbm9zbGVlcAkoX19OUl90aW1lcl9jcmVhdGUrOCkKKyNkZWZpbmUgX19OUl9zdGF0ZnM2NAkJMjY4CisjZGVmaW5lIF9fTlJfZnN0YXRmczY0CQkyNjkKKyNkZWZpbmUgX19OUl90Z2tpbGwJCTI3MAorI2RlZmluZSBfX05SX3V0aW1lcwkJMjcxCisjZGVmaW5lIF9fTlJfZmFkdmlzZTY0XzY0CTI3MgorI2RlZmluZSBfX05SX3ZzZXJ2ZXIJCTI3MworI2RlZmluZSBfX05SX21iaW5kCQkyNzQKKyNkZWZpbmUgX19OUl9nZXRfbWVtcG9saWN5CTI3NQorI2RlZmluZSBfX05SX3NldF9tZW1wb2xpY3kJMjc2CisjZGVmaW5lIF9fTlJfbXFfb3BlbiAJCTI3NworI2RlZmluZSBfX05SX21xX3VubGluawkJKF9fTlJfbXFfb3BlbisxKQorI2RlZmluZSBfX05SX21xX3RpbWVkc2VuZAkoX19OUl9tcV9vcGVuKzIpCisjZGVmaW5lIF9fTlJfbXFfdGltZWRyZWNlaXZlCShfX05SX21xX29wZW4rMykKKyNkZWZpbmUgX19OUl9tcV9ub3RpZnkJCShfX05SX21xX29wZW4rNCkKKyNkZWZpbmUgX19OUl9tcV9nZXRzZXRhdHRyCShfX05SX21xX29wZW4rNSkKKyNkZWZpbmUgX19OUl9rZXhlY19sb2FkCQkyODMKKyNkZWZpbmUgX19OUl93YWl0aWQJCTI4NAorLyogI2RlZmluZSBfX05SX3N5c19zZXRhbHRyb290CTI4NSAqLworI2RlZmluZSBfX05SX2FkZF9rZXkJCTI4NgorI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CTI4NworI2RlZmluZSBfX05SX2tleWN0bAkJMjg4CisjZGVmaW5lIF9fTlJfaW9wcmlvX3NldAkJMjg5CisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJMjkwCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0CTI5MQorI2RlZmluZSBfX05SX2lub3RpZnlfYWRkX3dhdGNoCTI5MgorI2RlZmluZSBfX05SX2lub3RpZnlfcm1fd2F0Y2gJMjkzCisjZGVmaW5lIF9fTlJfbWlncmF0ZV9wYWdlcwkyOTQKKyNkZWZpbmUgX19OUl9vcGVuYXQJCTI5NQorI2RlZmluZSBfX05SX21rZGlyYXQJCTI5NgorI2RlZmluZSBfX05SX21rbm9kYXQJCTI5NworI2RlZmluZSBfX05SX2ZjaG93bmF0CQkyOTgKKyNkZWZpbmUgX19OUl9mdXRpbWVzYXQJCTI5OQorI2RlZmluZSBfX05SX2ZzdGF0YXQ2NAkJMzAwCisjZGVmaW5lIF9fTlJfdW5saW5rYXQJCTMwMQorI2RlZmluZSBfX05SX3JlbmFtZWF0CQkzMDIKKyNkZWZpbmUgX19OUl9saW5rYXQJCTMwMworI2RlZmluZSBfX05SX3N5bWxpbmthdAkJMzA0CisjZGVmaW5lIF9fTlJfcmVhZGxpbmthdAkJMzA1CisjZGVmaW5lIF9fTlJfZmNobW9kYXQJCTMwNgorI2RlZmluZSBfX05SX2ZhY2Nlc3NhdAkJMzA3CisjZGVmaW5lIF9fTlJfcHNlbGVjdDYJCTMwOAorI2RlZmluZSBfX05SX3Bwb2xsCQkzMDkKKyNkZWZpbmUgX19OUl91bnNoYXJlCQkzMTAKKyNkZWZpbmUgX19OUl9zZXRfcm9idXN0X2xpc3QJMzExCisjZGVmaW5lIF9fTlJfZ2V0X3JvYnVzdF9saXN0CTMxMgorI2RlZmluZSBfX05SX3NwbGljZQkJMzEzCisjZGVmaW5lIF9fTlJfc3luY19maWxlX3JhbmdlCTMxNAorI2RlZmluZSBfX05SX3RlZQkJMzE1CisjZGVmaW5lIF9fTlJfdm1zcGxpY2UJCTMxNgorI2RlZmluZSBfX05SX21vdmVfcGFnZXMJCTMxNworI2RlZmluZSBfX05SX2dldGNwdQkJMzE4CisjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJMzE5CisjZGVmaW5lIF9fTlJfdXRpbWVuc2F0CQkzMjAKKyNkZWZpbmUgX19OUl9zaWduYWxmZAkJMzIxCisjZGVmaW5lIF9fTlJfdGltZXJmZF9jcmVhdGUJMzIyCisjZGVmaW5lIF9fTlJfZXZlbnRmZAkJMzIzCisjZGVmaW5lIF9fTlJfZmFsbG9jYXRlCQkzMjQKKyNkZWZpbmUgX19OUl90aW1lcmZkX3NldHRpbWUJMzI1CisjZGVmaW5lIF9fTlJfdGltZXJmZF9nZXR0aW1lCTMyNgorI2RlZmluZSBfX05SX3NpZ25hbGZkNAkJMzI3CisjZGVmaW5lIF9fTlJfZXZlbnRmZDIJCTMyOAorI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZTEJMzI5CisjZGVmaW5lIF9fTlJfZHVwMwkJMzMwCisjZGVmaW5lIF9fTlJfcGlwZTIJCTMzMQorI2RlZmluZSBfX05SX2lub3RpZnlfaW5pdDEJMzMyCisjZGVmaW5lIF9fTlJfcHJlYWR2CQkzMzMKKyNkZWZpbmUgX19OUl9wd3JpdGV2CQkzMzQKKyNkZWZpbmUgX19OUl9ydF90Z3NpZ3F1ZXVlaW5mbwkzMzUKKyNkZWZpbmUgX19OUl9wZXJmX2V2ZW50X29wZW4JMzM2CisjZGVmaW5lIF9fTlJfcmVjdm1tc2cJCTMzNworI2RlZmluZSBfX05SX2Zhbm90aWZ5X2luaXQJMzM4CisjZGVmaW5lIF9fTlJfZmFub3RpZnlfbWFyawkzMzkKKyNkZWZpbmUgX19OUl9wcmxpbWl0NjQJCTM0MAorI2RlZmluZSBfX05SX25hbWVfdG9faGFuZGxlX2F0CTM0MQorI2RlZmluZSBfX05SX29wZW5fYnlfaGFuZGxlX2F0ICAzNDIKKyNkZWZpbmUgX19OUl9jbG9ja19hZGp0aW1lCTM0MworI2RlZmluZSBfX05SX3N5bmNmcyAgICAgICAgICAgICAzNDQKKyNkZWZpbmUgX19OUl9zZW5kbW1zZwkJMzQ1CisjZGVmaW5lIF9fTlJfc2V0bnMJCTM0NgorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYJMzQ3CisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYJMzQ4CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9VTklTVERfMzJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS91bmlzdGRfNjQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdW5pc3RkXzY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlMGNlNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdW5pc3RkXzY0LmgKQEAgLTAsMCArMSw3MTcgQEAKKyNpZm5kZWYgX0FTTV9YODZfVU5JU1REXzY0X0gKKyNkZWZpbmUgX0FTTV9YODZfVU5JU1REXzY0X0gKKworI2lmbmRlZiBfX1NZU0NBTEwKKyNkZWZpbmUgX19TWVNDQUxMKGEsIGIpCisjZW5kaWYKKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3lzdGVtIGNhbGwgbnVtYmVycy4KKyAqCisgKiBOb3RlOiBob2xlcyBhcmUgbm90IGFsbG93ZWQuCisgKi8KKworLyogYXQgbGVhc3QgOCBzeXNjYWxsIHBlciBjYWNoZWxpbmUgKi8KKyNkZWZpbmUgX19OUl9yZWFkCQkJCTAKK19fU1lTQ0FMTChfX05SX3JlYWQsIHN5c19yZWFkKQorI2RlZmluZSBfX05SX3dyaXRlCQkJCTEKK19fU1lTQ0FMTChfX05SX3dyaXRlLCBzeXNfd3JpdGUpCisjZGVmaW5lIF9fTlJfb3BlbgkJCQkyCitfX1NZU0NBTEwoX19OUl9vcGVuLCBzeXNfb3BlbikKKyNkZWZpbmUgX19OUl9jbG9zZQkJCQkzCitfX1NZU0NBTEwoX19OUl9jbG9zZSwgc3lzX2Nsb3NlKQorI2RlZmluZSBfX05SX3N0YXQJCQkJNAorX19TWVNDQUxMKF9fTlJfc3RhdCwgc3lzX25ld3N0YXQpCisjZGVmaW5lIF9fTlJfZnN0YXQJCQkJNQorX19TWVNDQUxMKF9fTlJfZnN0YXQsIHN5c19uZXdmc3RhdCkKKyNkZWZpbmUgX19OUl9sc3RhdAkJCQk2CitfX1NZU0NBTEwoX19OUl9sc3RhdCwgc3lzX25ld2xzdGF0KQorI2RlZmluZSBfX05SX3BvbGwJCQkJNworX19TWVNDQUxMKF9fTlJfcG9sbCwgc3lzX3BvbGwpCisKKyNkZWZpbmUgX19OUl9sc2VlawkJCQk4CitfX1NZU0NBTEwoX19OUl9sc2Vlaywgc3lzX2xzZWVrKQorI2RlZmluZSBfX05SX21tYXAJCQkJOQorX19TWVNDQUxMKF9fTlJfbW1hcCwgc3lzX21tYXApCisjZGVmaW5lIF9fTlJfbXByb3RlY3QJCQkJMTAKK19fU1lTQ0FMTChfX05SX21wcm90ZWN0LCBzeXNfbXByb3RlY3QpCisjZGVmaW5lIF9fTlJfbXVubWFwCQkJCTExCitfX1NZU0NBTEwoX19OUl9tdW5tYXAsIHN5c19tdW5tYXApCisjZGVmaW5lIF9fTlJfYnJrCQkJCTEyCitfX1NZU0NBTEwoX19OUl9icmssIHN5c19icmspCisjZGVmaW5lIF9fTlJfcnRfc2lnYWN0aW9uCQkJMTMKK19fU1lTQ0FMTChfX05SX3J0X3NpZ2FjdGlvbiwgc3lzX3J0X3NpZ2FjdGlvbikKKyNkZWZpbmUgX19OUl9ydF9zaWdwcm9jbWFzawkJCTE0CitfX1NZU0NBTEwoX19OUl9ydF9zaWdwcm9jbWFzaywgc3lzX3J0X3NpZ3Byb2NtYXNrKQorI2RlZmluZSBfX05SX3J0X3NpZ3JldHVybgkJCTE1CitfX1NZU0NBTEwoX19OUl9ydF9zaWdyZXR1cm4sIHN0dWJfcnRfc2lncmV0dXJuKQorCisjZGVmaW5lIF9fTlJfaW9jdGwJCQkJMTYKK19fU1lTQ0FMTChfX05SX2lvY3RsLCBzeXNfaW9jdGwpCisjZGVmaW5lIF9fTlJfcHJlYWQ2NAkJCQkxNworX19TWVNDQUxMKF9fTlJfcHJlYWQ2NCwgc3lzX3ByZWFkNjQpCisjZGVmaW5lIF9fTlJfcHdyaXRlNjQJCQkJMTgKK19fU1lTQ0FMTChfX05SX3B3cml0ZTY0LCBzeXNfcHdyaXRlNjQpCisjZGVmaW5lIF9fTlJfcmVhZHYJCQkJMTkKK19fU1lTQ0FMTChfX05SX3JlYWR2LCBzeXNfcmVhZHYpCisjZGVmaW5lIF9fTlJfd3JpdGV2CQkJCTIwCitfX1NZU0NBTEwoX19OUl93cml0ZXYsIHN5c193cml0ZXYpCisjZGVmaW5lIF9fTlJfYWNjZXNzCQkJCTIxCitfX1NZU0NBTEwoX19OUl9hY2Nlc3MsIHN5c19hY2Nlc3MpCisjZGVmaW5lIF9fTlJfcGlwZQkJCQkyMgorX19TWVNDQUxMKF9fTlJfcGlwZSwgc3lzX3BpcGUpCisjZGVmaW5lIF9fTlJfc2VsZWN0CQkJCTIzCitfX1NZU0NBTEwoX19OUl9zZWxlY3QsIHN5c19zZWxlY3QpCisKKyNkZWZpbmUgX19OUl9zY2hlZF95aWVsZAkJCTI0CitfX1NZU0NBTEwoX19OUl9zY2hlZF95aWVsZCwgc3lzX3NjaGVkX3lpZWxkKQorI2RlZmluZSBfX05SX21yZW1hcAkJCQkyNQorX19TWVNDQUxMKF9fTlJfbXJlbWFwLCBzeXNfbXJlbWFwKQorI2RlZmluZSBfX05SX21zeW5jCQkJCTI2CitfX1NZU0NBTEwoX19OUl9tc3luYywgc3lzX21zeW5jKQorI2RlZmluZSBfX05SX21pbmNvcmUJCQkJMjcKK19fU1lTQ0FMTChfX05SX21pbmNvcmUsIHN5c19taW5jb3JlKQorI2RlZmluZSBfX05SX21hZHZpc2UJCQkJMjgKK19fU1lTQ0FMTChfX05SX21hZHZpc2UsIHN5c19tYWR2aXNlKQorI2RlZmluZSBfX05SX3NobWdldAkJCQkyOQorX19TWVNDQUxMKF9fTlJfc2htZ2V0LCBzeXNfc2htZ2V0KQorI2RlZmluZSBfX05SX3NobWF0CQkJCTMwCitfX1NZU0NBTEwoX19OUl9zaG1hdCwgc3lzX3NobWF0KQorI2RlZmluZSBfX05SX3NobWN0bAkJCQkzMQorX19TWVNDQUxMKF9fTlJfc2htY3RsLCBzeXNfc2htY3RsKQorCisjZGVmaW5lIF9fTlJfZHVwCQkJCTMyCitfX1NZU0NBTEwoX19OUl9kdXAsIHN5c19kdXApCisjZGVmaW5lIF9fTlJfZHVwMgkJCQkzMworX19TWVNDQUxMKF9fTlJfZHVwMiwgc3lzX2R1cDIpCisjZGVmaW5lIF9fTlJfcGF1c2UJCQkJMzQKK19fU1lTQ0FMTChfX05SX3BhdXNlLCBzeXNfcGF1c2UpCisjZGVmaW5lIF9fTlJfbmFub3NsZWVwCQkJCTM1CitfX1NZU0NBTEwoX19OUl9uYW5vc2xlZXAsIHN5c19uYW5vc2xlZXApCisjZGVmaW5lIF9fTlJfZ2V0aXRpbWVyCQkJCTM2CitfX1NZU0NBTEwoX19OUl9nZXRpdGltZXIsIHN5c19nZXRpdGltZXIpCisjZGVmaW5lIF9fTlJfYWxhcm0JCQkJMzcKK19fU1lTQ0FMTChfX05SX2FsYXJtLCBzeXNfYWxhcm0pCisjZGVmaW5lIF9fTlJfc2V0aXRpbWVyCQkJCTM4CitfX1NZU0NBTEwoX19OUl9zZXRpdGltZXIsIHN5c19zZXRpdGltZXIpCisjZGVmaW5lIF9fTlJfZ2V0cGlkCQkJCTM5CitfX1NZU0NBTEwoX19OUl9nZXRwaWQsIHN5c19nZXRwaWQpCisKKyNkZWZpbmUgX19OUl9zZW5kZmlsZQkJCQk0MAorX19TWVNDQUxMKF9fTlJfc2VuZGZpbGUsIHN5c19zZW5kZmlsZTY0KQorI2RlZmluZSBfX05SX3NvY2tldAkJCQk0MQorX19TWVNDQUxMKF9fTlJfc29ja2V0LCBzeXNfc29ja2V0KQorI2RlZmluZSBfX05SX2Nvbm5lY3QJCQkJNDIKK19fU1lTQ0FMTChfX05SX2Nvbm5lY3QsIHN5c19jb25uZWN0KQorI2RlZmluZSBfX05SX2FjY2VwdAkJCQk0MworX19TWVNDQUxMKF9fTlJfYWNjZXB0LCBzeXNfYWNjZXB0KQorI2RlZmluZSBfX05SX3NlbmR0bwkJCQk0NAorX19TWVNDQUxMKF9fTlJfc2VuZHRvLCBzeXNfc2VuZHRvKQorI2RlZmluZSBfX05SX3JlY3Zmcm9tCQkJCTQ1CitfX1NZU0NBTEwoX19OUl9yZWN2ZnJvbSwgc3lzX3JlY3Zmcm9tKQorI2RlZmluZSBfX05SX3NlbmRtc2cJCQkJNDYKK19fU1lTQ0FMTChfX05SX3NlbmRtc2csIHN5c19zZW5kbXNnKQorI2RlZmluZSBfX05SX3JlY3Ztc2cJCQkJNDcKK19fU1lTQ0FMTChfX05SX3JlY3Ztc2csIHN5c19yZWN2bXNnKQorCisjZGVmaW5lIF9fTlJfc2h1dGRvd24JCQkJNDgKK19fU1lTQ0FMTChfX05SX3NodXRkb3duLCBzeXNfc2h1dGRvd24pCisjZGVmaW5lIF9fTlJfYmluZAkJCQk0OQorX19TWVNDQUxMKF9fTlJfYmluZCwgc3lzX2JpbmQpCisjZGVmaW5lIF9fTlJfbGlzdGVuCQkJCTUwCitfX1NZU0NBTEwoX19OUl9saXN0ZW4sIHN5c19saXN0ZW4pCisjZGVmaW5lIF9fTlJfZ2V0c29ja25hbWUJCQk1MQorX19TWVNDQUxMKF9fTlJfZ2V0c29ja25hbWUsIHN5c19nZXRzb2NrbmFtZSkKKyNkZWZpbmUgX19OUl9nZXRwZWVybmFtZQkJCTUyCitfX1NZU0NBTEwoX19OUl9nZXRwZWVybmFtZSwgc3lzX2dldHBlZXJuYW1lKQorI2RlZmluZSBfX05SX3NvY2tldHBhaXIJCQkJNTMKK19fU1lTQ0FMTChfX05SX3NvY2tldHBhaXIsIHN5c19zb2NrZXRwYWlyKQorI2RlZmluZSBfX05SX3NldHNvY2tvcHQJCQkJNTQKK19fU1lTQ0FMTChfX05SX3NldHNvY2tvcHQsIHN5c19zZXRzb2Nrb3B0KQorI2RlZmluZSBfX05SX2dldHNvY2tvcHQJCQkJNTUKK19fU1lTQ0FMTChfX05SX2dldHNvY2tvcHQsIHN5c19nZXRzb2Nrb3B0KQorCisjZGVmaW5lIF9fTlJfY2xvbmUJCQkJNTYKK19fU1lTQ0FMTChfX05SX2Nsb25lLCBzdHViX2Nsb25lKQorI2RlZmluZSBfX05SX2ZvcmsJCQkJNTcKK19fU1lTQ0FMTChfX05SX2ZvcmssIHN0dWJfZm9yaykKKyNkZWZpbmUgX19OUl92Zm9yawkJCQk1OAorX19TWVNDQUxMKF9fTlJfdmZvcmssIHN0dWJfdmZvcmspCisjZGVmaW5lIF9fTlJfZXhlY3ZlCQkJCTU5CitfX1NZU0NBTEwoX19OUl9leGVjdmUsIHN0dWJfZXhlY3ZlKQorI2RlZmluZSBfX05SX2V4aXQJCQkJNjAKK19fU1lTQ0FMTChfX05SX2V4aXQsIHN5c19leGl0KQorI2RlZmluZSBfX05SX3dhaXQ0CQkJCTYxCitfX1NZU0NBTEwoX19OUl93YWl0NCwgc3lzX3dhaXQ0KQorI2RlZmluZSBfX05SX2tpbGwJCQkJNjIKK19fU1lTQ0FMTChfX05SX2tpbGwsIHN5c19raWxsKQorI2RlZmluZSBfX05SX3VuYW1lCQkJCTYzCitfX1NZU0NBTEwoX19OUl91bmFtZSwgc3lzX25ld3VuYW1lKQorCisjZGVmaW5lIF9fTlJfc2VtZ2V0CQkJCTY0CitfX1NZU0NBTEwoX19OUl9zZW1nZXQsIHN5c19zZW1nZXQpCisjZGVmaW5lIF9fTlJfc2Vtb3AJCQkJNjUKK19fU1lTQ0FMTChfX05SX3NlbW9wLCBzeXNfc2Vtb3ApCisjZGVmaW5lIF9fTlJfc2VtY3RsCQkJCTY2CitfX1NZU0NBTEwoX19OUl9zZW1jdGwsIHN5c19zZW1jdGwpCisjZGVmaW5lIF9fTlJfc2htZHQJCQkJNjcKK19fU1lTQ0FMTChfX05SX3NobWR0LCBzeXNfc2htZHQpCisjZGVmaW5lIF9fTlJfbXNnZ2V0CQkJCTY4CitfX1NZU0NBTEwoX19OUl9tc2dnZXQsIHN5c19tc2dnZXQpCisjZGVmaW5lIF9fTlJfbXNnc25kCQkJCTY5CitfX1NZU0NBTEwoX19OUl9tc2dzbmQsIHN5c19tc2dzbmQpCisjZGVmaW5lIF9fTlJfbXNncmN2CQkJCTcwCitfX1NZU0NBTEwoX19OUl9tc2dyY3YsIHN5c19tc2dyY3YpCisjZGVmaW5lIF9fTlJfbXNnY3RsCQkJCTcxCitfX1NZU0NBTEwoX19OUl9tc2djdGwsIHN5c19tc2djdGwpCisKKyNkZWZpbmUgX19OUl9mY250bAkJCQk3MgorX19TWVNDQUxMKF9fTlJfZmNudGwsIHN5c19mY250bCkKKyNkZWZpbmUgX19OUl9mbG9jawkJCQk3MworX19TWVNDQUxMKF9fTlJfZmxvY2ssIHN5c19mbG9jaykKKyNkZWZpbmUgX19OUl9mc3luYwkJCQk3NAorX19TWVNDQUxMKF9fTlJfZnN5bmMsIHN5c19mc3luYykKKyNkZWZpbmUgX19OUl9mZGF0YXN5bmMJCQkJNzUKK19fU1lTQ0FMTChfX05SX2ZkYXRhc3luYywgc3lzX2ZkYXRhc3luYykKKyNkZWZpbmUgX19OUl90cnVuY2F0ZQkJCQk3NgorX19TWVNDQUxMKF9fTlJfdHJ1bmNhdGUsIHN5c190cnVuY2F0ZSkKKyNkZWZpbmUgX19OUl9mdHJ1bmNhdGUJCQkJNzcKK19fU1lTQ0FMTChfX05SX2Z0cnVuY2F0ZSwgc3lzX2Z0cnVuY2F0ZSkKKyNkZWZpbmUgX19OUl9nZXRkZW50cwkJCQk3OAorX19TWVNDQUxMKF9fTlJfZ2V0ZGVudHMsIHN5c19nZXRkZW50cykKKyNkZWZpbmUgX19OUl9nZXRjd2QJCQkJNzkKK19fU1lTQ0FMTChfX05SX2dldGN3ZCwgc3lzX2dldGN3ZCkKKworI2RlZmluZSBfX05SX2NoZGlyCQkJCTgwCitfX1NZU0NBTEwoX19OUl9jaGRpciwgc3lzX2NoZGlyKQorI2RlZmluZSBfX05SX2ZjaGRpcgkJCQk4MQorX19TWVNDQUxMKF9fTlJfZmNoZGlyLCBzeXNfZmNoZGlyKQorI2RlZmluZSBfX05SX3JlbmFtZQkJCQk4MgorX19TWVNDQUxMKF9fTlJfcmVuYW1lLCBzeXNfcmVuYW1lKQorI2RlZmluZSBfX05SX21rZGlyCQkJCTgzCitfX1NZU0NBTEwoX19OUl9ta2Rpciwgc3lzX21rZGlyKQorI2RlZmluZSBfX05SX3JtZGlyCQkJCTg0CitfX1NZU0NBTEwoX19OUl9ybWRpciwgc3lzX3JtZGlyKQorI2RlZmluZSBfX05SX2NyZWF0CQkJCTg1CitfX1NZU0NBTEwoX19OUl9jcmVhdCwgc3lzX2NyZWF0KQorI2RlZmluZSBfX05SX2xpbmsJCQkJODYKK19fU1lTQ0FMTChfX05SX2xpbmssIHN5c19saW5rKQorI2RlZmluZSBfX05SX3VubGluawkJCQk4NworX19TWVNDQUxMKF9fTlJfdW5saW5rLCBzeXNfdW5saW5rKQorCisjZGVmaW5lIF9fTlJfc3ltbGluawkJCQk4OAorX19TWVNDQUxMKF9fTlJfc3ltbGluaywgc3lzX3N5bWxpbmspCisjZGVmaW5lIF9fTlJfcmVhZGxpbmsJCQkJODkKK19fU1lTQ0FMTChfX05SX3JlYWRsaW5rLCBzeXNfcmVhZGxpbmspCisjZGVmaW5lIF9fTlJfY2htb2QJCQkJOTAKK19fU1lTQ0FMTChfX05SX2NobW9kLCBzeXNfY2htb2QpCisjZGVmaW5lIF9fTlJfZmNobW9kCQkJCTkxCitfX1NZU0NBTEwoX19OUl9mY2htb2QsIHN5c19mY2htb2QpCisjZGVmaW5lIF9fTlJfY2hvd24JCQkJOTIKK19fU1lTQ0FMTChfX05SX2Nob3duLCBzeXNfY2hvd24pCisjZGVmaW5lIF9fTlJfZmNob3duCQkJCTkzCitfX1NZU0NBTEwoX19OUl9mY2hvd24sIHN5c19mY2hvd24pCisjZGVmaW5lIF9fTlJfbGNob3duCQkJCTk0CitfX1NZU0NBTEwoX19OUl9sY2hvd24sIHN5c19sY2hvd24pCisjZGVmaW5lIF9fTlJfdW1hc2sJCQkJOTUKK19fU1lTQ0FMTChfX05SX3VtYXNrLCBzeXNfdW1hc2spCisKKyNkZWZpbmUgX19OUl9nZXR0aW1lb2ZkYXkJCQk5NgorX19TWVNDQUxMKF9fTlJfZ2V0dGltZW9mZGF5LCBzeXNfZ2V0dGltZW9mZGF5KQorI2RlZmluZSBfX05SX2dldHJsaW1pdAkJCQk5NworX19TWVNDQUxMKF9fTlJfZ2V0cmxpbWl0LCBzeXNfZ2V0cmxpbWl0KQorI2RlZmluZSBfX05SX2dldHJ1c2FnZQkJCQk5OAorX19TWVNDQUxMKF9fTlJfZ2V0cnVzYWdlLCBzeXNfZ2V0cnVzYWdlKQorI2RlZmluZSBfX05SX3N5c2luZm8JCQkJOTkKK19fU1lTQ0FMTChfX05SX3N5c2luZm8sIHN5c19zeXNpbmZvKQorI2RlZmluZSBfX05SX3RpbWVzCQkJCTEwMAorX19TWVNDQUxMKF9fTlJfdGltZXMsIHN5c190aW1lcykKKyNkZWZpbmUgX19OUl9wdHJhY2UJCQkJMTAxCitfX1NZU0NBTEwoX19OUl9wdHJhY2UsIHN5c19wdHJhY2UpCisjZGVmaW5lIF9fTlJfZ2V0dWlkCQkJCTEwMgorX19TWVNDQUxMKF9fTlJfZ2V0dWlkLCBzeXNfZ2V0dWlkKQorI2RlZmluZSBfX05SX3N5c2xvZwkJCQkxMDMKK19fU1lTQ0FMTChfX05SX3N5c2xvZywgc3lzX3N5c2xvZykKKworLyogYXQgdGhlIHZlcnkgZW5kIHRoZSBzdHVmZiB0aGF0IG5ldmVyIHJ1bnMgZHVyaW5nIHRoZSBiZW5jaG1hcmtzICovCisjZGVmaW5lIF9fTlJfZ2V0Z2lkCQkJCTEwNAorX19TWVNDQUxMKF9fTlJfZ2V0Z2lkLCBzeXNfZ2V0Z2lkKQorI2RlZmluZSBfX05SX3NldHVpZAkJCQkxMDUKK19fU1lTQ0FMTChfX05SX3NldHVpZCwgc3lzX3NldHVpZCkKKyNkZWZpbmUgX19OUl9zZXRnaWQJCQkJMTA2CitfX1NZU0NBTEwoX19OUl9zZXRnaWQsIHN5c19zZXRnaWQpCisjZGVmaW5lIF9fTlJfZ2V0ZXVpZAkJCQkxMDcKK19fU1lTQ0FMTChfX05SX2dldGV1aWQsIHN5c19nZXRldWlkKQorI2RlZmluZSBfX05SX2dldGVnaWQJCQkJMTA4CitfX1NZU0NBTEwoX19OUl9nZXRlZ2lkLCBzeXNfZ2V0ZWdpZCkKKyNkZWZpbmUgX19OUl9zZXRwZ2lkCQkJCTEwOQorX19TWVNDQUxMKF9fTlJfc2V0cGdpZCwgc3lzX3NldHBnaWQpCisjZGVmaW5lIF9fTlJfZ2V0cHBpZAkJCQkxMTAKK19fU1lTQ0FMTChfX05SX2dldHBwaWQsIHN5c19nZXRwcGlkKQorI2RlZmluZSBfX05SX2dldHBncnAJCQkJMTExCitfX1NZU0NBTEwoX19OUl9nZXRwZ3JwLCBzeXNfZ2V0cGdycCkKKworI2RlZmluZSBfX05SX3NldHNpZAkJCQkxMTIKK19fU1lTQ0FMTChfX05SX3NldHNpZCwgc3lzX3NldHNpZCkKKyNkZWZpbmUgX19OUl9zZXRyZXVpZAkJCQkxMTMKK19fU1lTQ0FMTChfX05SX3NldHJldWlkLCBzeXNfc2V0cmV1aWQpCisjZGVmaW5lIF9fTlJfc2V0cmVnaWQJCQkJMTE0CitfX1NZU0NBTEwoX19OUl9zZXRyZWdpZCwgc3lzX3NldHJlZ2lkKQorI2RlZmluZSBfX05SX2dldGdyb3VwcwkJCQkxMTUKK19fU1lTQ0FMTChfX05SX2dldGdyb3Vwcywgc3lzX2dldGdyb3VwcykKKyNkZWZpbmUgX19OUl9zZXRncm91cHMJCQkJMTE2CitfX1NZU0NBTEwoX19OUl9zZXRncm91cHMsIHN5c19zZXRncm91cHMpCisjZGVmaW5lIF9fTlJfc2V0cmVzdWlkCQkJCTExNworX19TWVNDQUxMKF9fTlJfc2V0cmVzdWlkLCBzeXNfc2V0cmVzdWlkKQorI2RlZmluZSBfX05SX2dldHJlc3VpZAkJCQkxMTgKK19fU1lTQ0FMTChfX05SX2dldHJlc3VpZCwgc3lzX2dldHJlc3VpZCkKKyNkZWZpbmUgX19OUl9zZXRyZXNnaWQJCQkJMTE5CitfX1NZU0NBTEwoX19OUl9zZXRyZXNnaWQsIHN5c19zZXRyZXNnaWQpCisKKyNkZWZpbmUgX19OUl9nZXRyZXNnaWQJCQkJMTIwCitfX1NZU0NBTEwoX19OUl9nZXRyZXNnaWQsIHN5c19nZXRyZXNnaWQpCisjZGVmaW5lIF9fTlJfZ2V0cGdpZAkJCQkxMjEKK19fU1lTQ0FMTChfX05SX2dldHBnaWQsIHN5c19nZXRwZ2lkKQorI2RlZmluZSBfX05SX3NldGZzdWlkCQkJCTEyMgorX19TWVNDQUxMKF9fTlJfc2V0ZnN1aWQsIHN5c19zZXRmc3VpZCkKKyNkZWZpbmUgX19OUl9zZXRmc2dpZAkJCQkxMjMKK19fU1lTQ0FMTChfX05SX3NldGZzZ2lkLCBzeXNfc2V0ZnNnaWQpCisjZGVmaW5lIF9fTlJfZ2V0c2lkCQkJCTEyNAorX19TWVNDQUxMKF9fTlJfZ2V0c2lkLCBzeXNfZ2V0c2lkKQorI2RlZmluZSBfX05SX2NhcGdldAkJCQkxMjUKK19fU1lTQ0FMTChfX05SX2NhcGdldCwgc3lzX2NhcGdldCkKKyNkZWZpbmUgX19OUl9jYXBzZXQJCQkJMTI2CitfX1NZU0NBTEwoX19OUl9jYXBzZXQsIHN5c19jYXBzZXQpCisKKyNkZWZpbmUgX19OUl9ydF9zaWdwZW5kaW5nCQkJMTI3CitfX1NZU0NBTEwoX19OUl9ydF9zaWdwZW5kaW5nLCBzeXNfcnRfc2lncGVuZGluZykKKyNkZWZpbmUgX19OUl9ydF9zaWd0aW1lZHdhaXQJCQkxMjgKK19fU1lTQ0FMTChfX05SX3J0X3NpZ3RpbWVkd2FpdCwgc3lzX3J0X3NpZ3RpbWVkd2FpdCkKKyNkZWZpbmUgX19OUl9ydF9zaWdxdWV1ZWluZm8JCQkxMjkKK19fU1lTQ0FMTChfX05SX3J0X3NpZ3F1ZXVlaW5mbywgc3lzX3J0X3NpZ3F1ZXVlaW5mbykKKyNkZWZpbmUgX19OUl9ydF9zaWdzdXNwZW5kCQkJMTMwCitfX1NZU0NBTEwoX19OUl9ydF9zaWdzdXNwZW5kLCBzeXNfcnRfc2lnc3VzcGVuZCkKKyNkZWZpbmUgX19OUl9zaWdhbHRzdGFjawkJCTEzMQorX19TWVNDQUxMKF9fTlJfc2lnYWx0c3RhY2ssIHN0dWJfc2lnYWx0c3RhY2spCisjZGVmaW5lIF9fTlJfdXRpbWUJCQkJMTMyCitfX1NZU0NBTEwoX19OUl91dGltZSwgc3lzX3V0aW1lKQorI2RlZmluZSBfX05SX21rbm9kCQkJCTEzMworX19TWVNDQUxMKF9fTlJfbWtub2QsIHN5c19ta25vZCkKKworLyogT25seSBuZWVkZWQgZm9yIGEub3V0ICovCisjZGVmaW5lIF9fTlJfdXNlbGliCQkJCTEzNAorX19TWVNDQUxMKF9fTlJfdXNlbGliLCBzeXNfbmlfc3lzY2FsbCkKKyNkZWZpbmUgX19OUl9wZXJzb25hbGl0eQkJCTEzNQorX19TWVNDQUxMKF9fTlJfcGVyc29uYWxpdHksIHN5c19wZXJzb25hbGl0eSkKKworI2RlZmluZSBfX05SX3VzdGF0CQkJCTEzNgorX19TWVNDQUxMKF9fTlJfdXN0YXQsIHN5c191c3RhdCkKKyNkZWZpbmUgX19OUl9zdGF0ZnMJCQkJMTM3CitfX1NZU0NBTEwoX19OUl9zdGF0ZnMsIHN5c19zdGF0ZnMpCisjZGVmaW5lIF9fTlJfZnN0YXRmcwkJCQkxMzgKK19fU1lTQ0FMTChfX05SX2ZzdGF0ZnMsIHN5c19mc3RhdGZzKQorI2RlZmluZSBfX05SX3N5c2ZzCQkJCTEzOQorX19TWVNDQUxMKF9fTlJfc3lzZnMsIHN5c19zeXNmcykKKworI2RlZmluZSBfX05SX2dldHByaW9yaXR5CQkJMTQwCitfX1NZU0NBTEwoX19OUl9nZXRwcmlvcml0eSwgc3lzX2dldHByaW9yaXR5KQorI2RlZmluZSBfX05SX3NldHByaW9yaXR5CQkJMTQxCitfX1NZU0NBTEwoX19OUl9zZXRwcmlvcml0eSwgc3lzX3NldHByaW9yaXR5KQorI2RlZmluZSBfX05SX3NjaGVkX3NldHBhcmFtCQkJMTQyCitfX1NZU0NBTEwoX19OUl9zY2hlZF9zZXRwYXJhbSwgc3lzX3NjaGVkX3NldHBhcmFtKQorI2RlZmluZSBfX05SX3NjaGVkX2dldHBhcmFtCQkJMTQzCitfX1NZU0NBTEwoX19OUl9zY2hlZF9nZXRwYXJhbSwgc3lzX3NjaGVkX2dldHBhcmFtKQorI2RlZmluZSBfX05SX3NjaGVkX3NldHNjaGVkdWxlcgkJCTE0NAorX19TWVNDQUxMKF9fTlJfc2NoZWRfc2V0c2NoZWR1bGVyLCBzeXNfc2NoZWRfc2V0c2NoZWR1bGVyKQorI2RlZmluZSBfX05SX3NjaGVkX2dldHNjaGVkdWxlcgkJCTE0NQorX19TWVNDQUxMKF9fTlJfc2NoZWRfZ2V0c2NoZWR1bGVyLCBzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyKQorI2RlZmluZSBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9tYXgJCTE0NgorX19TWVNDQUxMKF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCwgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbgkJMTQ3CitfX1NZU0NBTEwoX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWluLCBzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbikKKyNkZWZpbmUgX19OUl9zY2hlZF9ycl9nZXRfaW50ZXJ2YWwJCTE0OAorX19TWVNDQUxMKF9fTlJfc2NoZWRfcnJfZ2V0X2ludGVydmFsLCBzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsKQorCisjZGVmaW5lIF9fTlJfbWxvY2sJCQkJMTQ5CitfX1NZU0NBTEwoX19OUl9tbG9jaywgc3lzX21sb2NrKQorI2RlZmluZSBfX05SX211bmxvY2sJCQkJMTUwCitfX1NZU0NBTEwoX19OUl9tdW5sb2NrLCBzeXNfbXVubG9jaykKKyNkZWZpbmUgX19OUl9tbG9ja2FsbAkJCQkxNTEKK19fU1lTQ0FMTChfX05SX21sb2NrYWxsLCBzeXNfbWxvY2thbGwpCisjZGVmaW5lIF9fTlJfbXVubG9ja2FsbAkJCQkxNTIKK19fU1lTQ0FMTChfX05SX211bmxvY2thbGwsIHN5c19tdW5sb2NrYWxsKQorCisjZGVmaW5lIF9fTlJfdmhhbmd1cAkJCQkxNTMKK19fU1lTQ0FMTChfX05SX3ZoYW5ndXAsIHN5c192aGFuZ3VwKQorCisjZGVmaW5lIF9fTlJfbW9kaWZ5X2xkdAkJCQkxNTQKK19fU1lTQ0FMTChfX05SX21vZGlmeV9sZHQsIHN5c19tb2RpZnlfbGR0KQorCisjZGVmaW5lIF9fTlJfcGl2b3Rfcm9vdAkJCQkxNTUKK19fU1lTQ0FMTChfX05SX3Bpdm90X3Jvb3QsIHN5c19waXZvdF9yb290KQorCisjZGVmaW5lIF9fTlJfX3N5c2N0bAkJCQkxNTYKK19fU1lTQ0FMTChfX05SX19zeXNjdGwsIHN5c19zeXNjdGwpCisKKyNkZWZpbmUgX19OUl9wcmN0bAkJCQkxNTcKK19fU1lTQ0FMTChfX05SX3ByY3RsLCBzeXNfcHJjdGwpCisjZGVmaW5lIF9fTlJfYXJjaF9wcmN0bAkJCQkxNTgKK19fU1lTQ0FMTChfX05SX2FyY2hfcHJjdGwsIHN5c19hcmNoX3ByY3RsKQorCisjZGVmaW5lIF9fTlJfYWRqdGltZXgJCQkJMTU5CitfX1NZU0NBTEwoX19OUl9hZGp0aW1leCwgc3lzX2FkanRpbWV4KQorCisjZGVmaW5lIF9fTlJfc2V0cmxpbWl0CQkJCTE2MAorX19TWVNDQUxMKF9fTlJfc2V0cmxpbWl0LCBzeXNfc2V0cmxpbWl0KQorCisjZGVmaW5lIF9fTlJfY2hyb290CQkJCTE2MQorX19TWVNDQUxMKF9fTlJfY2hyb290LCBzeXNfY2hyb290KQorCisjZGVmaW5lIF9fTlJfc3luYwkJCQkxNjIKK19fU1lTQ0FMTChfX05SX3N5bmMsIHN5c19zeW5jKQorCisjZGVmaW5lIF9fTlJfYWNjdAkJCQkxNjMKK19fU1lTQ0FMTChfX05SX2FjY3QsIHN5c19hY2N0KQorCisjZGVmaW5lIF9fTlJfc2V0dGltZW9mZGF5CQkJMTY0CitfX1NZU0NBTEwoX19OUl9zZXR0aW1lb2ZkYXksIHN5c19zZXR0aW1lb2ZkYXkpCisKKyNkZWZpbmUgX19OUl9tb3VudAkJCQkxNjUKK19fU1lTQ0FMTChfX05SX21vdW50LCBzeXNfbW91bnQpCisjZGVmaW5lIF9fTlJfdW1vdW50MgkJCQkxNjYKK19fU1lTQ0FMTChfX05SX3Vtb3VudDIsIHN5c191bW91bnQpCisKKyNkZWZpbmUgX19OUl9zd2Fwb24JCQkJMTY3CitfX1NZU0NBTEwoX19OUl9zd2Fwb24sIHN5c19zd2Fwb24pCisjZGVmaW5lIF9fTlJfc3dhcG9mZgkJCQkxNjgKK19fU1lTQ0FMTChfX05SX3N3YXBvZmYsIHN5c19zd2Fwb2ZmKQorCisjZGVmaW5lIF9fTlJfcmVib290CQkJCTE2OQorX19TWVNDQUxMKF9fTlJfcmVib290LCBzeXNfcmVib290KQorCisjZGVmaW5lIF9fTlJfc2V0aG9zdG5hbWUJCQkxNzAKK19fU1lTQ0FMTChfX05SX3NldGhvc3RuYW1lLCBzeXNfc2V0aG9zdG5hbWUpCisjZGVmaW5lIF9fTlJfc2V0ZG9tYWlubmFtZQkJCTE3MQorX19TWVNDQUxMKF9fTlJfc2V0ZG9tYWlubmFtZSwgc3lzX3NldGRvbWFpbm5hbWUpCisKKyNkZWZpbmUgX19OUl9pb3BsCQkJCTE3MgorX19TWVNDQUxMKF9fTlJfaW9wbCwgc3R1Yl9pb3BsKQorI2RlZmluZSBfX05SX2lvcGVybQkJCQkxNzMKK19fU1lTQ0FMTChfX05SX2lvcGVybSwgc3lzX2lvcGVybSkKKworI2RlZmluZSBfX05SX2NyZWF0ZV9tb2R1bGUJCQkxNzQKK19fU1lTQ0FMTChfX05SX2NyZWF0ZV9tb2R1bGUsIHN5c19uaV9zeXNjYWxsKQorI2RlZmluZSBfX05SX2luaXRfbW9kdWxlCQkJMTc1CitfX1NZU0NBTEwoX19OUl9pbml0X21vZHVsZSwgc3lzX2luaXRfbW9kdWxlKQorI2RlZmluZSBfX05SX2RlbGV0ZV9tb2R1bGUJCQkxNzYKK19fU1lTQ0FMTChfX05SX2RlbGV0ZV9tb2R1bGUsIHN5c19kZWxldGVfbW9kdWxlKQorI2RlZmluZSBfX05SX2dldF9rZXJuZWxfc3ltcwkJCTE3NworX19TWVNDQUxMKF9fTlJfZ2V0X2tlcm5lbF9zeW1zLCBzeXNfbmlfc3lzY2FsbCkKKyNkZWZpbmUgX19OUl9xdWVyeV9tb2R1bGUJCQkxNzgKK19fU1lTQ0FMTChfX05SX3F1ZXJ5X21vZHVsZSwgc3lzX25pX3N5c2NhbGwpCisKKyNkZWZpbmUgX19OUl9xdW90YWN0bAkJCQkxNzkKK19fU1lTQ0FMTChfX05SX3F1b3RhY3RsLCBzeXNfcXVvdGFjdGwpCisKKyNkZWZpbmUgX19OUl9uZnNzZXJ2Y3RsCQkJCTE4MAorX19TWVNDQUxMKF9fTlJfbmZzc2VydmN0bCwgc3lzX25pX3N5c2NhbGwpCisKKy8qIHJlc2VydmVkIGZvciBMaVMvU1RSRUFNUyAqLworI2RlZmluZSBfX05SX2dldHBtc2cJCQkJMTgxCitfX1NZU0NBTEwoX19OUl9nZXRwbXNnLCBzeXNfbmlfc3lzY2FsbCkKKyNkZWZpbmUgX19OUl9wdXRwbXNnCQkJCTE4MgorX19TWVNDQUxMKF9fTlJfcHV0cG1zZywgc3lzX25pX3N5c2NhbGwpCisKKy8qIHJlc2VydmVkIGZvciBBRlMgKi8KKyNkZWZpbmUgX19OUl9hZnNfc3lzY2FsbAkJCTE4MworX19TWVNDQUxMKF9fTlJfYWZzX3N5c2NhbGwsIHN5c19uaV9zeXNjYWxsKQorCisvKiByZXNlcnZlZCBmb3IgdHV4ICovCisjZGVmaW5lIF9fTlJfdHV4Y2FsbAkJCQkxODQKK19fU1lTQ0FMTChfX05SX3R1eGNhbGwsIHN5c19uaV9zeXNjYWxsKQorCisjZGVmaW5lIF9fTlJfc2VjdXJpdHkJCQkJMTg1CitfX1NZU0NBTEwoX19OUl9zZWN1cml0eSwgc3lzX25pX3N5c2NhbGwpCisKKyNkZWZpbmUgX19OUl9nZXR0aWQJCQkJMTg2CitfX1NZU0NBTEwoX19OUl9nZXR0aWQsIHN5c19nZXR0aWQpCisKKyNkZWZpbmUgX19OUl9yZWFkYWhlYWQJCQkJMTg3CitfX1NZU0NBTEwoX19OUl9yZWFkYWhlYWQsIHN5c19yZWFkYWhlYWQpCisjZGVmaW5lIF9fTlJfc2V0eGF0dHIJCQkJMTg4CitfX1NZU0NBTEwoX19OUl9zZXR4YXR0ciwgc3lzX3NldHhhdHRyKQorI2RlZmluZSBfX05SX2xzZXR4YXR0cgkJCQkxODkKK19fU1lTQ0FMTChfX05SX2xzZXR4YXR0ciwgc3lzX2xzZXR4YXR0cikKKyNkZWZpbmUgX19OUl9mc2V0eGF0dHIJCQkJMTkwCitfX1NZU0NBTEwoX19OUl9mc2V0eGF0dHIsIHN5c19mc2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfZ2V0eGF0dHIJCQkJMTkxCitfX1NZU0NBTEwoX19OUl9nZXR4YXR0ciwgc3lzX2dldHhhdHRyKQorI2RlZmluZSBfX05SX2xnZXR4YXR0cgkJCQkxOTIKK19fU1lTQ0FMTChfX05SX2xnZXR4YXR0ciwgc3lzX2xnZXR4YXR0cikKKyNkZWZpbmUgX19OUl9mZ2V0eGF0dHIJCQkJMTkzCitfX1NZU0NBTEwoX19OUl9mZ2V0eGF0dHIsIHN5c19mZ2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfbGlzdHhhdHRyCQkJCTE5NAorX19TWVNDQUxMKF9fTlJfbGlzdHhhdHRyLCBzeXNfbGlzdHhhdHRyKQorI2RlZmluZSBfX05SX2xsaXN0eGF0dHIJCQkJMTk1CitfX1NZU0NBTEwoX19OUl9sbGlzdHhhdHRyLCBzeXNfbGxpc3R4YXR0cikKKyNkZWZpbmUgX19OUl9mbGlzdHhhdHRyCQkJCTE5NgorX19TWVNDQUxMKF9fTlJfZmxpc3R4YXR0ciwgc3lzX2ZsaXN0eGF0dHIpCisjZGVmaW5lIF9fTlJfcmVtb3ZleGF0dHIJCQkxOTcKK19fU1lTQ0FMTChfX05SX3JlbW92ZXhhdHRyLCBzeXNfcmVtb3ZleGF0dHIpCisjZGVmaW5lIF9fTlJfbHJlbW92ZXhhdHRyCQkJMTk4CitfX1NZU0NBTEwoX19OUl9scmVtb3ZleGF0dHIsIHN5c19scmVtb3ZleGF0dHIpCisjZGVmaW5lIF9fTlJfZnJlbW92ZXhhdHRyCQkJMTk5CitfX1NZU0NBTEwoX19OUl9mcmVtb3ZleGF0dHIsIHN5c19mcmVtb3ZleGF0dHIpCisjZGVmaW5lIF9fTlJfdGtpbGwJCQkJMjAwCitfX1NZU0NBTEwoX19OUl90a2lsbCwgc3lzX3RraWxsKQorI2RlZmluZSBfX05SX3RpbWUJCQkJMjAxCitfX1NZU0NBTEwoX19OUl90aW1lLCBzeXNfdGltZSkKKyNkZWZpbmUgX19OUl9mdXRleAkJCQkyMDIKK19fU1lTQ0FMTChfX05SX2Z1dGV4LCBzeXNfZnV0ZXgpCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkJCQkyMDMKK19fU1lTQ0FMTChfX05SX3NjaGVkX3NldGFmZmluaXR5LCBzeXNfc2NoZWRfc2V0YWZmaW5pdHkpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkJCQkyMDQKK19fU1lTQ0FMTChfX05SX3NjaGVkX2dldGFmZmluaXR5LCBzeXNfc2NoZWRfZ2V0YWZmaW5pdHkpCisjZGVmaW5lIF9fTlJfc2V0X3RocmVhZF9hcmVhCQkJMjA1CitfX1NZU0NBTEwoX19OUl9zZXRfdGhyZWFkX2FyZWEsIHN5c19uaV9zeXNjYWxsKQkvKiB1c2UgYXJjaF9wcmN0bCAqLworI2RlZmluZSBfX05SX2lvX3NldHVwCQkJCTIwNgorX19TWVNDQUxMKF9fTlJfaW9fc2V0dXAsIHN5c19pb19zZXR1cCkKKyNkZWZpbmUgX19OUl9pb19kZXN0cm95CQkJCTIwNworX19TWVNDQUxMKF9fTlJfaW9fZGVzdHJveSwgc3lzX2lvX2Rlc3Ryb3kpCisjZGVmaW5lIF9fTlJfaW9fZ2V0ZXZlbnRzCQkJMjA4CitfX1NZU0NBTEwoX19OUl9pb19nZXRldmVudHMsIHN5c19pb19nZXRldmVudHMpCisjZGVmaW5lIF9fTlJfaW9fc3VibWl0CQkJCTIwOQorX19TWVNDQUxMKF9fTlJfaW9fc3VibWl0LCBzeXNfaW9fc3VibWl0KQorI2RlZmluZSBfX05SX2lvX2NhbmNlbAkJCQkyMTAKK19fU1lTQ0FMTChfX05SX2lvX2NhbmNlbCwgc3lzX2lvX2NhbmNlbCkKKyNkZWZpbmUgX19OUl9nZXRfdGhyZWFkX2FyZWEJCQkyMTEKK19fU1lTQ0FMTChfX05SX2dldF90aHJlYWRfYXJlYSwgc3lzX25pX3N5c2NhbGwpCS8qIHVzZSBhcmNoX3ByY3RsICovCisjZGVmaW5lIF9fTlJfbG9va3VwX2Rjb29raWUJCQkyMTIKK19fU1lTQ0FMTChfX05SX2xvb2t1cF9kY29va2llLCBzeXNfbG9va3VwX2Rjb29raWUpCisjZGVmaW5lIF9fTlJfZXBvbGxfY3JlYXRlCQkJMjEzCitfX1NZU0NBTEwoX19OUl9lcG9sbF9jcmVhdGUsIHN5c19lcG9sbF9jcmVhdGUpCisjZGVmaW5lIF9fTlJfZXBvbGxfY3RsX29sZAkJCTIxNAorX19TWVNDQUxMKF9fTlJfZXBvbGxfY3RsX29sZCwgc3lzX25pX3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfZXBvbGxfd2FpdF9vbGQJCQkyMTUKK19fU1lTQ0FMTChfX05SX2Vwb2xsX3dhaXRfb2xkLCBzeXNfbmlfc3lzY2FsbCkKKyNkZWZpbmUgX19OUl9yZW1hcF9maWxlX3BhZ2VzCQkJMjE2CitfX1NZU0NBTEwoX19OUl9yZW1hcF9maWxlX3BhZ2VzLCBzeXNfcmVtYXBfZmlsZV9wYWdlcykKKyNkZWZpbmUgX19OUl9nZXRkZW50czY0CQkJCTIxNworX19TWVNDQUxMKF9fTlJfZ2V0ZGVudHM2NCwgc3lzX2dldGRlbnRzNjQpCisjZGVmaW5lIF9fTlJfc2V0X3RpZF9hZGRyZXNzCQkJMjE4CitfX1NZU0NBTEwoX19OUl9zZXRfdGlkX2FkZHJlc3MsIHN5c19zZXRfdGlkX2FkZHJlc3MpCisjZGVmaW5lIF9fTlJfcmVzdGFydF9zeXNjYWxsCQkJMjE5CitfX1NZU0NBTEwoX19OUl9yZXN0YXJ0X3N5c2NhbGwsIHN5c19yZXN0YXJ0X3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfc2VtdGltZWRvcAkJCQkyMjAKK19fU1lTQ0FMTChfX05SX3NlbXRpbWVkb3AsIHN5c19zZW10aW1lZG9wKQorI2RlZmluZSBfX05SX2ZhZHZpc2U2NAkJCQkyMjEKK19fU1lTQ0FMTChfX05SX2ZhZHZpc2U2NCwgc3lzX2ZhZHZpc2U2NCkKKyNkZWZpbmUgX19OUl90aW1lcl9jcmVhdGUJCQkyMjIKK19fU1lTQ0FMTChfX05SX3RpbWVyX2NyZWF0ZSwgc3lzX3RpbWVyX2NyZWF0ZSkKKyNkZWZpbmUgX19OUl90aW1lcl9zZXR0aW1lCQkJMjIzCitfX1NZU0NBTEwoX19OUl90aW1lcl9zZXR0aW1lLCBzeXNfdGltZXJfc2V0dGltZSkKKyNkZWZpbmUgX19OUl90aW1lcl9nZXR0aW1lCQkJMjI0CitfX1NZU0NBTEwoX19OUl90aW1lcl9nZXR0aW1lLCBzeXNfdGltZXJfZ2V0dGltZSkKKyNkZWZpbmUgX19OUl90aW1lcl9nZXRvdmVycnVuCQkJMjI1CitfX1NZU0NBTEwoX19OUl90aW1lcl9nZXRvdmVycnVuLCBzeXNfdGltZXJfZ2V0b3ZlcnJ1bikKKyNkZWZpbmUgX19OUl90aW1lcl9kZWxldGUJCQkyMjYKK19fU1lTQ0FMTChfX05SX3RpbWVyX2RlbGV0ZSwgc3lzX3RpbWVyX2RlbGV0ZSkKKyNkZWZpbmUgX19OUl9jbG9ja19zZXR0aW1lCQkJMjI3CitfX1NZU0NBTEwoX19OUl9jbG9ja19zZXR0aW1lLCBzeXNfY2xvY2tfc2V0dGltZSkKKyNkZWZpbmUgX19OUl9jbG9ja19nZXR0aW1lCQkJMjI4CitfX1NZU0NBTEwoX19OUl9jbG9ja19nZXR0aW1lLCBzeXNfY2xvY2tfZ2V0dGltZSkKKyNkZWZpbmUgX19OUl9jbG9ja19nZXRyZXMJCQkyMjkKK19fU1lTQ0FMTChfX05SX2Nsb2NrX2dldHJlcywgc3lzX2Nsb2NrX2dldHJlcykKKyNkZWZpbmUgX19OUl9jbG9ja19uYW5vc2xlZXAJCQkyMzAKK19fU1lTQ0FMTChfX05SX2Nsb2NrX25hbm9zbGVlcCwgc3lzX2Nsb2NrX25hbm9zbGVlcCkKKyNkZWZpbmUgX19OUl9leGl0X2dyb3VwCQkJCTIzMQorX19TWVNDQUxMKF9fTlJfZXhpdF9ncm91cCwgc3lzX2V4aXRfZ3JvdXApCisjZGVmaW5lIF9fTlJfZXBvbGxfd2FpdAkJCQkyMzIKK19fU1lTQ0FMTChfX05SX2Vwb2xsX3dhaXQsIHN5c19lcG9sbF93YWl0KQorI2RlZmluZSBfX05SX2Vwb2xsX2N0bAkJCQkyMzMKK19fU1lTQ0FMTChfX05SX2Vwb2xsX2N0bCwgc3lzX2Vwb2xsX2N0bCkKKyNkZWZpbmUgX19OUl90Z2tpbGwJCQkJMjM0CitfX1NZU0NBTEwoX19OUl90Z2tpbGwsIHN5c190Z2tpbGwpCisjZGVmaW5lIF9fTlJfdXRpbWVzCQkJCTIzNQorX19TWVNDQUxMKF9fTlJfdXRpbWVzLCBzeXNfdXRpbWVzKQorI2RlZmluZSBfX05SX3ZzZXJ2ZXIJCQkJMjM2CitfX1NZU0NBTEwoX19OUl92c2VydmVyLCBzeXNfbmlfc3lzY2FsbCkKKyNkZWZpbmUgX19OUl9tYmluZAkJCQkyMzcKK19fU1lTQ0FMTChfX05SX21iaW5kLCBzeXNfbWJpbmQpCisjZGVmaW5lIF9fTlJfc2V0X21lbXBvbGljeQkJCTIzOAorX19TWVNDQUxMKF9fTlJfc2V0X21lbXBvbGljeSwgc3lzX3NldF9tZW1wb2xpY3kpCisjZGVmaW5lIF9fTlJfZ2V0X21lbXBvbGljeQkJCTIzOQorX19TWVNDQUxMKF9fTlJfZ2V0X21lbXBvbGljeSwgc3lzX2dldF9tZW1wb2xpY3kpCisjZGVmaW5lIF9fTlJfbXFfb3BlbgkJCQkyNDAKK19fU1lTQ0FMTChfX05SX21xX29wZW4sIHN5c19tcV9vcGVuKQorI2RlZmluZSBfX05SX21xX3VubGluawkJCQkyNDEKK19fU1lTQ0FMTChfX05SX21xX3VubGluaywgc3lzX21xX3VubGluaykKKyNkZWZpbmUgX19OUl9tcV90aW1lZHNlbmQJCQkyNDIKK19fU1lTQ0FMTChfX05SX21xX3RpbWVkc2VuZCwgc3lzX21xX3RpbWVkc2VuZCkKKyNkZWZpbmUgX19OUl9tcV90aW1lZHJlY2VpdmUJCQkyNDMKK19fU1lTQ0FMTChfX05SX21xX3RpbWVkcmVjZWl2ZSwgc3lzX21xX3RpbWVkcmVjZWl2ZSkKKyNkZWZpbmUgX19OUl9tcV9ub3RpZnkJCQkJMjQ0CitfX1NZU0NBTEwoX19OUl9tcV9ub3RpZnksIHN5c19tcV9ub3RpZnkpCisjZGVmaW5lIF9fTlJfbXFfZ2V0c2V0YXR0cgkJCTI0NQorX19TWVNDQUxMKF9fTlJfbXFfZ2V0c2V0YXR0ciwgc3lzX21xX2dldHNldGF0dHIpCisjZGVmaW5lIF9fTlJfa2V4ZWNfbG9hZAkJCQkyNDYKK19fU1lTQ0FMTChfX05SX2tleGVjX2xvYWQsIHN5c19rZXhlY19sb2FkKQorI2RlZmluZSBfX05SX3dhaXRpZAkJCQkyNDcKK19fU1lTQ0FMTChfX05SX3dhaXRpZCwgc3lzX3dhaXRpZCkKKyNkZWZpbmUgX19OUl9hZGRfa2V5CQkJCTI0OAorX19TWVNDQUxMKF9fTlJfYWRkX2tleSwgc3lzX2FkZF9rZXkpCisjZGVmaW5lIF9fTlJfcmVxdWVzdF9rZXkJCQkyNDkKK19fU1lTQ0FMTChfX05SX3JlcXVlc3Rfa2V5LCBzeXNfcmVxdWVzdF9rZXkpCisjZGVmaW5lIF9fTlJfa2V5Y3RsCQkJCTI1MAorX19TWVNDQUxMKF9fTlJfa2V5Y3RsLCBzeXNfa2V5Y3RsKQorI2RlZmluZSBfX05SX2lvcHJpb19zZXQJCQkJMjUxCitfX1NZU0NBTEwoX19OUl9pb3ByaW9fc2V0LCBzeXNfaW9wcmlvX3NldCkKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0CQkJCTI1MgorX19TWVNDQUxMKF9fTlJfaW9wcmlvX2dldCwgc3lzX2lvcHJpb19nZXQpCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0CQkJMjUzCitfX1NZU0NBTEwoX19OUl9pbm90aWZ5X2luaXQsIHN5c19pbm90aWZ5X2luaXQpCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2gJCQkyNTQKK19fU1lTQ0FMTChfX05SX2lub3RpZnlfYWRkX3dhdGNoLCBzeXNfaW5vdGlmeV9hZGRfd2F0Y2gpCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9ybV93YXRjaAkJCTI1NQorX19TWVNDQUxMKF9fTlJfaW5vdGlmeV9ybV93YXRjaCwgc3lzX2lub3RpZnlfcm1fd2F0Y2gpCisjZGVmaW5lIF9fTlJfbWlncmF0ZV9wYWdlcwkJCTI1NgorX19TWVNDQUxMKF9fTlJfbWlncmF0ZV9wYWdlcywgc3lzX21pZ3JhdGVfcGFnZXMpCisjZGVmaW5lIF9fTlJfb3BlbmF0CQkJCTI1NworX19TWVNDQUxMKF9fTlJfb3BlbmF0LCBzeXNfb3BlbmF0KQorI2RlZmluZSBfX05SX21rZGlyYXQJCQkJMjU4CitfX1NZU0NBTEwoX19OUl9ta2RpcmF0LCBzeXNfbWtkaXJhdCkKKyNkZWZpbmUgX19OUl9ta25vZGF0CQkJCTI1OQorX19TWVNDQUxMKF9fTlJfbWtub2RhdCwgc3lzX21rbm9kYXQpCisjZGVmaW5lIF9fTlJfZmNob3duYXQJCQkJMjYwCitfX1NZU0NBTEwoX19OUl9mY2hvd25hdCwgc3lzX2ZjaG93bmF0KQorI2RlZmluZSBfX05SX2Z1dGltZXNhdAkJCQkyNjEKK19fU1lTQ0FMTChfX05SX2Z1dGltZXNhdCwgc3lzX2Z1dGltZXNhdCkKKyNkZWZpbmUgX19OUl9uZXdmc3RhdGF0CQkJCTI2MgorX19TWVNDQUxMKF9fTlJfbmV3ZnN0YXRhdCwgc3lzX25ld2ZzdGF0YXQpCisjZGVmaW5lIF9fTlJfdW5saW5rYXQJCQkJMjYzCitfX1NZU0NBTEwoX19OUl91bmxpbmthdCwgc3lzX3VubGlua2F0KQorI2RlZmluZSBfX05SX3JlbmFtZWF0CQkJCTI2NAorX19TWVNDQUxMKF9fTlJfcmVuYW1lYXQsIHN5c19yZW5hbWVhdCkKKyNkZWZpbmUgX19OUl9saW5rYXQJCQkJMjY1CitfX1NZU0NBTEwoX19OUl9saW5rYXQsIHN5c19saW5rYXQpCisjZGVmaW5lIF9fTlJfc3ltbGlua2F0CQkJCTI2NgorX19TWVNDQUxMKF9fTlJfc3ltbGlua2F0LCBzeXNfc3ltbGlua2F0KQorI2RlZmluZSBfX05SX3JlYWRsaW5rYXQJCQkJMjY3CitfX1NZU0NBTEwoX19OUl9yZWFkbGlua2F0LCBzeXNfcmVhZGxpbmthdCkKKyNkZWZpbmUgX19OUl9mY2htb2RhdAkJCQkyNjgKK19fU1lTQ0FMTChfX05SX2ZjaG1vZGF0LCBzeXNfZmNobW9kYXQpCisjZGVmaW5lIF9fTlJfZmFjY2Vzc2F0CQkJCTI2OQorX19TWVNDQUxMKF9fTlJfZmFjY2Vzc2F0LCBzeXNfZmFjY2Vzc2F0KQorI2RlZmluZSBfX05SX3BzZWxlY3Q2CQkJCTI3MAorX19TWVNDQUxMKF9fTlJfcHNlbGVjdDYsIHN5c19wc2VsZWN0NikKKyNkZWZpbmUgX19OUl9wcG9sbAkJCQkyNzEKK19fU1lTQ0FMTChfX05SX3Bwb2xsLAlzeXNfcHBvbGwpCisjZGVmaW5lIF9fTlJfdW5zaGFyZQkJCQkyNzIKK19fU1lTQ0FMTChfX05SX3Vuc2hhcmUsCXN5c191bnNoYXJlKQorI2RlZmluZSBfX05SX3NldF9yb2J1c3RfbGlzdAkJCTI3MworX19TWVNDQUxMKF9fTlJfc2V0X3JvYnVzdF9saXN0LCBzeXNfc2V0X3JvYnVzdF9saXN0KQorI2RlZmluZSBfX05SX2dldF9yb2J1c3RfbGlzdAkJCTI3NAorX19TWVNDQUxMKF9fTlJfZ2V0X3JvYnVzdF9saXN0LCBzeXNfZ2V0X3JvYnVzdF9saXN0KQorI2RlZmluZSBfX05SX3NwbGljZQkJCQkyNzUKK19fU1lTQ0FMTChfX05SX3NwbGljZSwgc3lzX3NwbGljZSkKKyNkZWZpbmUgX19OUl90ZWUJCQkJMjc2CitfX1NZU0NBTEwoX19OUl90ZWUsIHN5c190ZWUpCisjZGVmaW5lIF9fTlJfc3luY19maWxlX3JhbmdlCQkJMjc3CitfX1NZU0NBTEwoX19OUl9zeW5jX2ZpbGVfcmFuZ2UsIHN5c19zeW5jX2ZpbGVfcmFuZ2UpCisjZGVmaW5lIF9fTlJfdm1zcGxpY2UJCQkJMjc4CitfX1NZU0NBTEwoX19OUl92bXNwbGljZSwgc3lzX3Ztc3BsaWNlKQorI2RlZmluZSBfX05SX21vdmVfcGFnZXMJCQkJMjc5CitfX1NZU0NBTEwoX19OUl9tb3ZlX3BhZ2VzLCBzeXNfbW92ZV9wYWdlcykKKyNkZWZpbmUgX19OUl91dGltZW5zYXQJCQkJMjgwCitfX1NZU0NBTEwoX19OUl91dGltZW5zYXQsIHN5c191dGltZW5zYXQpCisjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJCQkyODEKK19fU1lTQ0FMTChfX05SX2Vwb2xsX3B3YWl0LCBzeXNfZXBvbGxfcHdhaXQpCisjZGVmaW5lIF9fTlJfc2lnbmFsZmQJCQkJMjgyCitfX1NZU0NBTEwoX19OUl9zaWduYWxmZCwgc3lzX3NpZ25hbGZkKQorI2RlZmluZSBfX05SX3RpbWVyZmRfY3JlYXRlCQkJMjgzCitfX1NZU0NBTEwoX19OUl90aW1lcmZkX2NyZWF0ZSwgc3lzX3RpbWVyZmRfY3JlYXRlKQorI2RlZmluZSBfX05SX2V2ZW50ZmQJCQkJMjg0CitfX1NZU0NBTEwoX19OUl9ldmVudGZkLCBzeXNfZXZlbnRmZCkKKyNkZWZpbmUgX19OUl9mYWxsb2NhdGUJCQkJMjg1CitfX1NZU0NBTEwoX19OUl9mYWxsb2NhdGUsIHN5c19mYWxsb2NhdGUpCisjZGVmaW5lIF9fTlJfdGltZXJmZF9zZXR0aW1lCQkJMjg2CitfX1NZU0NBTEwoX19OUl90aW1lcmZkX3NldHRpbWUsIHN5c190aW1lcmZkX3NldHRpbWUpCisjZGVmaW5lIF9fTlJfdGltZXJmZF9nZXR0aW1lCQkJMjg3CitfX1NZU0NBTEwoX19OUl90aW1lcmZkX2dldHRpbWUsIHN5c190aW1lcmZkX2dldHRpbWUpCisjZGVmaW5lIF9fTlJfYWNjZXB0NAkJCQkyODgKK19fU1lTQ0FMTChfX05SX2FjY2VwdDQsIHN5c19hY2NlcHQ0KQorI2RlZmluZSBfX05SX3NpZ25hbGZkNAkJCQkyODkKK19fU1lTQ0FMTChfX05SX3NpZ25hbGZkNCwgc3lzX3NpZ25hbGZkNCkKKyNkZWZpbmUgX19OUl9ldmVudGZkMgkJCQkyOTAKK19fU1lTQ0FMTChfX05SX2V2ZW50ZmQyLCBzeXNfZXZlbnRmZDIpCisjZGVmaW5lIF9fTlJfZXBvbGxfY3JlYXRlMQkJCTI5MQorX19TWVNDQUxMKF9fTlJfZXBvbGxfY3JlYXRlMSwgc3lzX2Vwb2xsX2NyZWF0ZTEpCisjZGVmaW5lIF9fTlJfZHVwMwkJCQkyOTIKK19fU1lTQ0FMTChfX05SX2R1cDMsIHN5c19kdXAzKQorI2RlZmluZSBfX05SX3BpcGUyCQkJCTI5MworX19TWVNDQUxMKF9fTlJfcGlwZTIsIHN5c19waXBlMikKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQxCQkJMjk0CitfX1NZU0NBTEwoX19OUl9pbm90aWZ5X2luaXQxLCBzeXNfaW5vdGlmeV9pbml0MSkKKyNkZWZpbmUgX19OUl9wcmVhZHYJCQkJMjk1CitfX1NZU0NBTEwoX19OUl9wcmVhZHYsIHN5c19wcmVhZHYpCisjZGVmaW5lIF9fTlJfcHdyaXRldgkJCQkyOTYKK19fU1lTQ0FMTChfX05SX3B3cml0ZXYsIHN5c19wd3JpdGV2KQorI2RlZmluZSBfX05SX3J0X3Rnc2lncXVldWVpbmZvCQkJMjk3CitfX1NZU0NBTEwoX19OUl9ydF90Z3NpZ3F1ZXVlaW5mbywgc3lzX3J0X3Rnc2lncXVldWVpbmZvKQorI2RlZmluZSBfX05SX3BlcmZfZXZlbnRfb3BlbgkJCTI5OAorX19TWVNDQUxMKF9fTlJfcGVyZl9ldmVudF9vcGVuLCBzeXNfcGVyZl9ldmVudF9vcGVuKQorI2RlZmluZSBfX05SX3JlY3ZtbXNnCQkJCTI5OQorX19TWVNDQUxMKF9fTlJfcmVjdm1tc2csIHN5c19yZWN2bW1zZykKKyNkZWZpbmUgX19OUl9mYW5vdGlmeV9pbml0CQkJMzAwCitfX1NZU0NBTEwoX19OUl9mYW5vdGlmeV9pbml0LCBzeXNfZmFub3RpZnlfaW5pdCkKKyNkZWZpbmUgX19OUl9mYW5vdGlmeV9tYXJrCQkJMzAxCitfX1NZU0NBTEwoX19OUl9mYW5vdGlmeV9tYXJrLCBzeXNfZmFub3RpZnlfbWFyaykKKyNkZWZpbmUgX19OUl9wcmxpbWl0NjQJCQkJMzAyCitfX1NZU0NBTEwoX19OUl9wcmxpbWl0NjQsIHN5c19wcmxpbWl0NjQpCisjZGVmaW5lIF9fTlJfbmFtZV90b19oYW5kbGVfYXQJCQkzMDMKK19fU1lTQ0FMTChfX05SX25hbWVfdG9faGFuZGxlX2F0LCBzeXNfbmFtZV90b19oYW5kbGVfYXQpCisjZGVmaW5lIF9fTlJfb3Blbl9ieV9oYW5kbGVfYXQJCQkzMDQKK19fU1lTQ0FMTChfX05SX29wZW5fYnlfaGFuZGxlX2F0LCBzeXNfb3Blbl9ieV9oYW5kbGVfYXQpCisjZGVmaW5lIF9fTlJfY2xvY2tfYWRqdGltZQkJCTMwNQorX19TWVNDQUxMKF9fTlJfY2xvY2tfYWRqdGltZSwgc3lzX2Nsb2NrX2FkanRpbWUpCisjZGVmaW5lIF9fTlJfc3luY2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDYKK19fU1lTQ0FMTChfX05SX3N5bmNmcywgc3lzX3N5bmNmcykKKyNkZWZpbmUgX19OUl9zZW5kbW1zZwkJCQkzMDcKK19fU1lTQ0FMTChfX05SX3NlbmRtbXNnLCBzeXNfc2VuZG1tc2cpCisjZGVmaW5lIF9fTlJfc2V0bnMJCQkJMzA4CitfX1NZU0NBTEwoX19OUl9zZXRucywgc3lzX3NldG5zKQorI2RlZmluZSBfX05SX2dldGNwdQkJCQkzMDkKK19fU1lTQ0FMTChfX05SX2dldGNwdSwgc3lzX2dldGNwdSkKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3JlYWR2CQkJMzEwCitfX1NZU0NBTEwoX19OUl9wcm9jZXNzX3ZtX3JlYWR2LCBzeXNfcHJvY2Vzc192bV9yZWFkdikKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3dyaXRldgkJCTMxMQorX19TWVNDQUxMKF9fTlJfcHJvY2Vzc192bV93cml0ZXYsIHN5c19wcm9jZXNzX3ZtX3dyaXRldikKKworI2lmbmRlZiBfX05PX1NUVUJTCisjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSCisjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9TVEFUCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19BTEFSTQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUSE9TVE5BTUUKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1BBVVNFCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TR0VUTUFTSworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHTkFMCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19VVElNRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfV0FJVFBJRAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU09DS0VUQ0FMTAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfRkFEVklTRTY0CisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19HRVRQR1JQCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19MTFNFRUsKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX05JQ0UKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX09MRF9HRVRSTElNSVQKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX09MRF9VTkFNRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfT0xEVU1PVU5UCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQRU5ESU5HCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQUk9DTUFTSworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHQUNUSU9OCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdTVVNQRU5ECisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19USU1FCisjZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfVElNRQorI2VuZGlmCS8qIF9fTk9fU1RVQlMgKi8KKworCisjZW5kaWYgLyogX0FTTV9YODZfVU5JU1REXzY0X0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdm04Ni5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS92bTg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExZGExMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdm04Ni5oCkBAIC0wLDAgKzEsMTI5IEBACisjaWZuZGVmIF9BU01fWDg2X1ZNODZfSAorI2RlZmluZSBfQVNNX1g4Nl9WTTg2X0gKKworLyoKKyAqIEknbSBndWVzc2luZyBhdCB0aGUgVklGL1ZJUCBmbGFnIHVzYWdlLCBidXQgaG9wZSB0aGF0IHRoaXMgaXMgaG93CisgKiB0aGUgUGVudGl1bSB1c2VzIHRoZW0uIExpbnV4IHdpbGwgcmV0dXJuIGZyb20gdm04NiBtb2RlIHdoZW4gYm90aAorICogVklGIGFuZCBWSVAgaXMgc2V0LgorICoKKyAqIE9uIGEgUGVudGl1bSwgd2UgY291bGQgcHJvYmFibHkgb3B0aW1pemUgdGhlIHZpcnR1YWwgZmxhZ3MgZGlyZWN0bHkKKyAqIGluIHRoZSBlZmxhZ3MgcmVnaXN0ZXIgaW5zdGVhZCBvZiBkb2luZyBpdCAiYnkgaGFuZCIgaW4gdmZsYWdzLi4uCisgKgorICogTGludXMKKyAqLworCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci1mbGFncy5oPgorCisjZGVmaW5lIEJJT1NTRUcJCTB4MGYwMDAKKworI2RlZmluZSBDUFVfMDg2CQkwCisjZGVmaW5lIENQVV8xODYJCTEKKyNkZWZpbmUgQ1BVXzI4NgkJMgorI2RlZmluZSBDUFVfMzg2CQkzCisjZGVmaW5lIENQVV80ODYJCTQKKyNkZWZpbmUgQ1BVXzU4NgkJNQorCisvKgorICogUmV0dXJuIHZhbHVlcyBmb3IgdGhlICd2bTg2KCknIHN5c3RlbSBjYWxsCisgKi8KKyNkZWZpbmUgVk04Nl9UWVBFKHJldHZhbCkJKChyZXR2YWwpICYgMHhmZikKKyNkZWZpbmUgVk04Nl9BUkcocmV0dmFsKQkoKHJldHZhbCkgPj4gOCkKKworI2RlZmluZSBWTTg2X1NJR05BTAkwCS8qIHJldHVybiBkdWUgdG8gc2lnbmFsICovCisjZGVmaW5lIFZNODZfVU5LTk9XTgkxCS8qIHVuaGFuZGxlZCBHUCBmYXVsdAorCQkJCSAgIC0gSU8taW5zdHJ1Y3Rpb24gb3Igc2ltaWxhciAqLworI2RlZmluZSBWTTg2X0lOVHgJMgkvKiBpbnQzL2ludCB4IGluc3RydWN0aW9uIChBUkcgPSB4KSAqLworI2RlZmluZSBWTTg2X1NUSQkzCS8qIHN0aS9wb3BmL2lyZXQgaW5zdHJ1Y3Rpb24gZW5hYmxlZAorCQkJCSAgIHZpcnR1YWwgaW50ZXJydXB0cyAqLworCisvKgorICogQWRkaXRpb25hbCByZXR1cm4gdmFsdWVzIHdoZW4gaW52b2tpbmcgbmV3IHZtODYoKQorICovCisjZGVmaW5lIFZNODZfUElDUkVUVVJOCTQJLyogcmV0dXJuIGR1ZSB0byBwZW5kaW5nIFBJQyByZXF1ZXN0ICovCisjZGVmaW5lIFZNODZfVFJBUAk2CS8qIHJldHVybiBkdWUgdG8gRE9TLWRlYnVnZ2VyIHJlcXVlc3QgKi8KKworLyoKKyAqIGZ1bmN0aW9uIGNvZGVzIHdoZW4gaW52b2tpbmcgbmV3IHZtODYoKQorICovCisjZGVmaW5lIFZNODZfUExVU19JTlNUQUxMX0NIRUNLCTAKKyNkZWZpbmUgVk04Nl9FTlRFUgkJMQorI2RlZmluZSBWTTg2X0VOVEVSX05PX0JZUEFTUwkyCisjZGVmaW5lCVZNODZfUkVRVUVTVF9JUlEJMworI2RlZmluZSBWTTg2X0ZSRUVfSVJRCQk0CisjZGVmaW5lIFZNODZfR0VUX0lSUV9CSVRTCTUKKyNkZWZpbmUgVk04Nl9HRVRfQU5EX1JFU0VUX0lSUQk2CisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdGFjay1sYXlvdXQgc2VlbiBieSB0aGUgdXNlciBzcGFjZSBwcm9ncmFtIHdoZW4gd2UgaGF2ZQorICogZG9uZSBhIHRyYW5zbGF0aW9uIG9mICJTQVZFX0FMTCIgZnJvbSB2bTg2IG1vZGUuIFRoZSByZWFsIGtlcm5lbCBsYXlvdXQKKyAqIGlzICdrZXJuZWxfdm04Nl9yZWdzJyAoc2VlIGJlbG93KS4KKyAqLworCitzdHJ1Y3Qgdm04Nl9yZWdzIHsKKy8qCisgKiBub3JtYWwgcmVncywgd2l0aCBzcGVjaWFsIG1lYW5pbmcgZm9yIHRoZSBzZWdtZW50IGRlc2NyaXB0b3JzLi4KKyAqLworCWxvbmcgZWJ4OworCWxvbmcgZWN4OworCWxvbmcgZWR4OworCWxvbmcgZXNpOworCWxvbmcgZWRpOworCWxvbmcgZWJwOworCWxvbmcgZWF4OworCWxvbmcgX19udWxsX2RzOworCWxvbmcgX19udWxsX2VzOworCWxvbmcgX19udWxsX2ZzOworCWxvbmcgX19udWxsX2dzOworCWxvbmcgb3JpZ19lYXg7CisJbG9uZyBlaXA7CisJdW5zaWduZWQgc2hvcnQgY3MsIF9fY3NoOworCWxvbmcgZWZsYWdzOworCWxvbmcgZXNwOworCXVuc2lnbmVkIHNob3J0IHNzLCBfX3NzaDsKKy8qCisgKiB0aGVzZSBhcmUgc3BlY2lmaWMgdG8gdjg2IG1vZGU6CisgKi8KKwl1bnNpZ25lZCBzaG9ydCBlcywgX19lc2g7CisJdW5zaWduZWQgc2hvcnQgZHMsIF9fZHNoOworCXVuc2lnbmVkIHNob3J0IGZzLCBfX2ZzaDsKKwl1bnNpZ25lZCBzaG9ydCBncywgX19nc2g7Cit9OworCitzdHJ1Y3QgcmV2ZWN0b3JlZF9zdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgX19tYXBbOF07CQkJLyogMjU2IGJpdHMgKi8KK307CisKK3N0cnVjdCB2bTg2X3N0cnVjdCB7CisJc3RydWN0IHZtODZfcmVncyByZWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBzY3JlZW5fYml0bWFwOworCXVuc2lnbmVkIGxvbmcgY3B1X3R5cGU7CisJc3RydWN0IHJldmVjdG9yZWRfc3RydWN0IGludF9yZXZlY3RvcmVkOworCXN0cnVjdCByZXZlY3RvcmVkX3N0cnVjdCBpbnQyMV9yZXZlY3RvcmVkOworfTsKKworLyoKKyAqIGZsYWdzIG1hc2tzCisgKi8KKyNkZWZpbmUgVk04Nl9TQ1JFRU5fQklUTUFQCTB4MDAwMQorCitzdHJ1Y3Qgdm04NnBsdXNfaW5mb19zdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgZm9yY2VfcmV0dXJuX2Zvcl9waWM6MTsKKwl1bnNpZ25lZCBsb25nIHZtODZkYmdfYWN0aXZlOjE7ICAgICAgIC8qIGZvciBkZWJ1Z2dlciAqLworCXVuc2lnbmVkIGxvbmcgdm04NmRiZ19URnBlbmRpZzoxOyAgICAgLyogZm9yIGRlYnVnZ2VyICovCisJdW5zaWduZWQgbG9uZyB1bnVzZWQ6Mjg7CisJdW5zaWduZWQgbG9uZyBpc192bTg2cHVzOjE7CSAgICAgIC8qIGZvciB2bTg2IGludGVybmFsIHVzZSAqLworCXVuc2lnbmVkIGNoYXIgdm04NmRiZ19pbnR4eHRhYlszMl07ICAgLyogZm9yIGRlYnVnZ2VyICovCit9Oworc3RydWN0IHZtODZwbHVzX3N0cnVjdCB7CisJc3RydWN0IHZtODZfcmVncyByZWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBzY3JlZW5fYml0bWFwOworCXVuc2lnbmVkIGxvbmcgY3B1X3R5cGU7CisJc3RydWN0IHJldmVjdG9yZWRfc3RydWN0IGludF9yZXZlY3RvcmVkOworCXN0cnVjdCByZXZlY3RvcmVkX3N0cnVjdCBpbnQyMV9yZXZlY3RvcmVkOworCXN0cnVjdCB2bTg2cGx1c19pbmZvX3N0cnVjdCB2bTg2cGx1czsKK307CisKKworI2VuZGlmIC8qIF9BU01fWDg2X1ZNODZfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS92c3lzY2FsbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS92c3lzY2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjViYjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3ZzeXNjYWxsLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBfQVNNX1g4Nl9WU1lTQ0FMTF9ICisjZGVmaW5lIF9BU01fWDg2X1ZTWVNDQUxMX0gKKworZW51bSB2c3lzY2FsbF9udW0geworCV9fTlJfdmdldHRpbWVvZmRheSwKKwlfX05SX3Z0aW1lLAorCV9fTlJfdmdldGNwdSwKK307CisKKyNkZWZpbmUgVlNZU0NBTExfU1RBUlQgKC0xMFVMIDw8IDIwKQorI2RlZmluZSBWU1lTQ0FMTF9TSVpFIDEwMjQKKyNkZWZpbmUgVlNZU0NBTExfRU5EICgtMlVMIDw8IDIwKQorI2RlZmluZSBWU1lTQ0FMTF9NQVBQRURfUEFHRVMgMQorI2RlZmluZSBWU1lTQ0FMTF9BRERSKHZzeXNjYWxsX25yKSAoVlNZU0NBTExfU1RBUlQrVlNZU0NBTExfU0laRSoodnN5c2NhbGxfbnIpKQorCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9WU1lTQ0FMTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9hLm91dC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvYS5vdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhhOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvYS5vdXQuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9fQV9PVVRfR05VX0hfXworIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2Eub3V0Lmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxhLm91dC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgX19XT1JEU0laRSA9PSA2NAorCisvKiBTaWduYWwgdG8gdXNlcnMgb2YgdGhpcyBoZWFkZXIgdGhhdCB0aGlzIGFyY2hpdGVjdHVyZSByZWFsbHkgZG9lc24ndAorICAgc3VwcG9ydCBhLm91dCBiaW5hcnkgZm9ybWF0LiAgKi8KKyNkZWZpbmUgX19OT19BX09VVF9TVVBQT1JUIDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9ieXRlc3dhcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvYnl0ZXN3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmRiOTNjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvYnl0ZXN3YXAuaApAQCAtMCwwICsxLDEzNyBAQAorLyogTWFjcm9zIHRvIHN3YXAgdGhlIG9yZGVyIG9mIGJ5dGVzIGluIGludGVnZXIgdmFsdWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAyMDAwLCAyMDAyLCAyMDAzLCAyMDA3LCAyMDA4LCAyMDEwLCAyMDExCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9CWVRFU1dBUF9IICYmICFkZWZpbmVkIF9ORVRJTkVUX0lOX0ggJiYgIWRlZmluZWQgX0VORElBTl9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvYnl0ZXN3YXAuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGJ5dGVzd2FwLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX0JJVFNfQllURVNXQVBfSAorI2RlZmluZSBfQklUU19CWVRFU1dBUF9IIDEKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworLyogU3dhcCBieXRlcyBpbiAxNiBiaXQgdmFsdWUuICAqLworI2RlZmluZSBfX2Jzd2FwX2NvbnN0YW50XzE2KHgpIFwKKyAgICAgKCh1bnNpZ25lZCBzaG9ydCBpbnQpICgoKCh4KSA+PiA4KSAmIDB4ZmYpIHwgKCgoeCkgJiAweGZmKSA8PCA4KSkpCisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKyMgZGVmaW5lIF9fYnN3YXBfMTYoeCkgXAorICAgICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgICAoeyByZWdpc3RlciB1bnNpZ25lZCBzaG9ydCBpbnQgX192LCBfX3ggPSAodW5zaWduZWQgc2hvcnQgaW50KSAoeCk7ICAgICBcCisJIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX194KSkJCQkJICAgICAgXAorCSAgIF9fdiA9IF9fYnN3YXBfY29uc3RhbnRfMTYgKF9feCk7CQkJCSAgICAgIFwKKwkgZWxzZQkJCQkJCQkJICAgICAgXAorCSAgIF9fYXNtX18gKCJyb3J3ICQ4LCAldzAiCQkJCQkgICAgICBcCisJCSAgICA6ICI9ciIgKF9fdikJCQkJCSAgICAgIFwKKwkJICAgIDogIjAiIChfX3gpCQkJCQkJICAgICAgXAorCQkgICAgOiAiY2MiKTsJCQkJCQkgICAgICBcCisJIF9fdjsgfSkpCisjZWxzZQorLyogVGhpcyBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nLiAgKi8KKyMgZGVmaW5lIF9fYnN3YXBfMTYoeCkgXAorICAgICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgICAoeyByZWdpc3RlciB1bnNpZ25lZCBzaG9ydCBpbnQgX194ID0gKHVuc2lnbmVkIHNob3J0IGludCkgKHgpOyAgICAgICAgICBcCisJIF9fYnN3YXBfY29uc3RhbnRfMTYgKF9feCk7IH0pKQorI2VuZGlmCisKKworLyogU3dhcCBieXRlcyBpbiAzMiBiaXQgdmFsdWUuICAqLworI2RlZmluZSBfX2Jzd2FwX2NvbnN0YW50XzMyKHgpIFwKKyAgICAgKCgoKHgpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgoeCkgJiAweDAwZmYwMDAwKSA+PiAgOCkgfAkJICAgICAgXAorICAgICAgKCgoeCkgJiAweDAwMDBmZjAwKSA8PCAgOCkgfCAoKCh4KSAmIDB4MDAwMDAwZmYpIDw8IDI0KSkKKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgorIyBpZiBfX1dPUkRTSVpFID09IDY0IHx8IChkZWZpbmVkIF9faTQ4Nl9fIHx8IGRlZmluZWQgX19wZW50aXVtX18JICAgICAgXAorCQkJICB8fCBkZWZpbmVkIF9fcGVudGl1bXByb19fIHx8IGRlZmluZWQgX19wZW50aXVtNF9fICAgXAorCQkJICB8fCBkZWZpbmVkIF9fazhfXyB8fCBkZWZpbmVkIF9fYXRobG9uX18JICAgICAgXAorCQkJICB8fCBkZWZpbmVkIF9fazZfXyB8fCBkZWZpbmVkIF9fbm9jb25hX18JICAgICAgXAorCQkJICB8fCBkZWZpbmVkIF9fY29yZTJfXyB8fCBkZWZpbmVkIF9fZ2VvZGVfXwkgICAgICBcCisJCQkgIHx8IGRlZmluZWQgX19hbWRmYW0xMF9fKQorLyogVG8gc3dhcCB0aGUgYnl0ZXMgaW4gYSB3b3JkIHRoZSBpNDg2IHByb2Nlc3NvcnMgYW5kIHVwIHByb3ZpZGUgdGhlCisgICBgYnN3YXAnIG9wY29kZS4gIE9uIGkzODYgd2UgaGF2ZSB0byB1c2UgdGhyZWUgaW5zdHJ1Y3Rpb25zLiAgKi8KKyMgIGRlZmluZSBfX2Jzd2FwXzMyKHgpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgICAgKHsgcmVnaXN0ZXIgdW5zaWduZWQgaW50IF9fdiwgX194ID0gKHgpOwkJCQkgICAgICBcCisJIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX194KSkJCQkJICAgICAgXAorCSAgIF9fdiA9IF9fYnN3YXBfY29uc3RhbnRfMzIgKF9feCk7CQkJCSAgICAgIFwKKwkgZWxzZQkJCQkJCQkJICAgICAgXAorCSAgIF9fYXNtX18gKCJic3dhcCAlMCIgOiAiPXIiIChfX3YpIDogIjAiIChfX3gpKTsJCSAgICAgIFwKKwkgX192OyB9KSkKKyMgZWxzZQorIyAgZGVmaW5lIF9fYnN3YXBfMzIoeCkJCQkJCQkJICAgICAgXAorICAgICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgICAoeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgX192LCBfX3ggPSAoeCk7CQkJCSAgICAgIFwKKwkgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX3gpKQkJCQkgICAgICBcCisJICAgX192ID0gX19ic3dhcF9jb25zdGFudF8zMiAoX194KTsJCQkJICAgICAgXAorCSBlbHNlCQkJCQkJCQkgICAgICBcCisJICAgX19hc21fXyAoInJvcncgJDgsICV3MDsiCQkJCQkgICAgICBcCisJCSAgICAicm9ybCAkMTYsICUwOyIJCQkJCSAgICAgIFwKKwkJICAgICJyb3J3ICQ4LCAldzAiCQkJCQkgICAgICBcCisJCSAgICA6ICI9ciIgKF9fdikJCQkJCSAgICAgIFwKKwkJICAgIDogIjAiIChfX3gpCQkJCQkJICAgICAgXAorCQkgICAgOiAiY2MiKTsJCQkJCQkgICAgICBcCisJIF9fdjsgfSkpCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgX19ic3dhcF8zMih4KSBcCisgICAgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICAgICh7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCBfX3ggPSAoeCk7IF9fYnN3YXBfY29uc3RhbnRfMzIgKF9feCk7IH0pKQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgorLyogU3dhcCBieXRlcyBpbiA2NCBiaXQgdmFsdWUuICAqLworIyBkZWZpbmUgX19ic3dhcF9jb25zdGFudF82NCh4KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICgoKCh4KSAmIDB4ZmYwMDAwMDAwMDAwMDAwMHVsbCkgPj4gNTYpCQkgICAgICBcCisJCSAgICAgfCAoKCh4KSAmIDB4MDBmZjAwMDAwMDAwMDAwMHVsbCkgPj4gNDApCQkgICAgICBcCisJCSAgICAgfCAoKCh4KSAmIDB4MDAwMGZmMDAwMDAwMDAwMHVsbCkgPj4gMjQpCQkgICAgICBcCisJCSAgICAgfCAoKCh4KSAmIDB4MDAwMDAwZmYwMDAwMDAwMHVsbCkgPj4gOCkJCSAgICAgIFwKKwkJICAgICB8ICgoKHgpICYgMHgwMDAwMDAwMGZmMDAwMDAwdWxsKSA8PCA4KQkJICAgICAgXAorCQkgICAgIHwgKCgoeCkgJiAweDAwMDAwMDAwMDBmZjAwMDB1bGwpIDw8IDI0KQkJICAgICAgXAorCQkgICAgIHwgKCgoeCkgJiAweDAwMDAwMDAwMDAwMGZmMDB1bGwpIDw8IDQwKQkJICAgICAgXAorCQkgICAgIHwgKCgoeCkgJiAweDAwMDAwMDAwMDAwMDAwZmZ1bGwpIDw8IDU2KSkpCisKKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIF9fYnN3YXBfNjQoeCkgXAorICAgICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgICAoeyByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fdiwgX194ID0gKHgpOwkJCQkgICAgICBcCisJIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX194KSkJCQkJICAgICAgXAorCSAgIF9fdiA9IF9fYnN3YXBfY29uc3RhbnRfNjQgKF9feCk7CQkJCSAgICAgIFwKKwkgZWxzZQkJCQkJCQkJICAgICAgXAorCSAgIF9fYXNtX18gKCJic3dhcCAlcTAiIDogIj1yIiAoX192KSA6ICIwIiAoX194KSk7CQkgICAgICBcCisJIF9fdjsgfSkpCisjIGVsc2UKKyMgIGRlZmluZSBfX2Jzd2FwXzY0KHgpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICh7IHVuaW9uIHsgX19leHRlbnNpb25fXyB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fbGw7ICAgICAgICAgICAgICAgICAgIFwKKwkJIHVuc2lnbmVkIGludCBfX2xbMl07IH0gX193LCBfX3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoeCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICBfX3IuX19sbCA9IF9fYnN3YXBfY29uc3RhbnRfNjQgKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIF9fdy5fX2xsID0gKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgX19yLl9fbFswXSA9IF9fYnN3YXBfMzIgKF9fdy5fX2xbMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICBfX3IuX19sWzFdID0gX19ic3dhcF8zMiAoX193Ll9fbFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSBfX3IuX19sbDsgfSkpCisjIGVuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIF9CSVRTX0JZVEVTV0FQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2NtYXRoY2FsbHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2NtYXRoY2FsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzdmZGJlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvY21hdGhjYWxscy5oCkBAIC0wLDAgKzEsMTU5IEBACisvKiBQcm90b3R5cGUgZGVjbGFyYXRpb25zIGZvciBjb21wbGV4IG1hdGggZnVuY3Rpb25zOworICAgaGVscGVyIGZpbGUgZm9yIDxjb21wbGV4Lmg+LgorICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAyMDAxLCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBOT1RFOiBCZWNhdXNlIG9mIHRoZSBzcGVjaWFsIHdheSB0aGlzIGZpbGUgaXMgdXNlZCBieSA8Y29tcGxleC5oPiwgdGhpcworICAgZmlsZSBtdXN0IE5PVCBiZSBwcm90ZWN0ZWQgZnJvbSBtdWx0aXBsZSBpbmNsdXNpb24gYXMgaGVhZGVyIGZpbGVzCisgICB1c3VhbGx5IGFyZS4KKworICAgVGhpcyBmaWxlIHByb3ZpZGVzIHByb3RvdHlwZSBkZWNsYXJhdGlvbnMgZm9yIHRoZSBtYXRoIGZ1bmN0aW9ucy4KKyAgIE1vc3QgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCB1c2luZyB0aGUgbWFjcm86CisKKyAgIF9fTUFUSENBTEwgKE5BTUUsIChBUkdTLi4uKSk7CisKKyAgIFRoaXMgbWVhbnMgdGhlcmUgaXMgYSBmdW5jdGlvbiBgTkFNRScgcmV0dXJuaW5nIGBkb3VibGUnIGFuZCBhIGZ1bmN0aW9uCisgICBgTkFNRWYnIHJldHVybmluZyBgZmxvYXQnLiAgRWFjaCBwbGFjZSBgX01kb3VibGVfJyBhcHBlYXJzIGluIHRoZQorICAgcHJvdG90eXBlLCB0aGF0IGlzIGFjdHVhbGx5IGBkb3VibGUnIGluIHRoZSBwcm90b3R5cGUgZm9yIGBOQU1FJyBhbmQKKyAgIGBmbG9hdCcgaW4gdGhlIHByb3RvdHlwZSBmb3IgYE5BTUVmJy4gIFJlZW50cmFudCB2YXJpYW50IGZ1bmN0aW9ucyBhcmUKKyAgIGNhbGxlZCBgTkFNRV9yJyBhbmQgYE5BTUVmX3InLgorCisgICBGdW5jdGlvbnMgcmV0dXJuaW5nIG90aGVyIHR5cGVzIGxpa2UgYGludCcgYXJlIGRlY2xhcmVkIHVzaW5nIHRoZSBtYWNybzoKKworICAgX19NQVRIREVDTCAoVFlQRSwgTkFNRSwgKEFSR1MuLi4pKTsKKworICAgVGhpcyBpcyBqdXN0IGxpa2UgX19NQVRIQ0FMTCBidXQgZm9yIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGBUWVBFJworICAgaW5zdGVhZCBvZiBgX01kb3VibGVfJy4gIEluIGFsbCBvZiB0aGVzZSBjYXNlcywgdGhlcmUgaXMgc3RpbGwKKyAgIGJvdGggYSBgTkFNRScgYW5kIGEgYE5BTUVmJyB0aGF0IHRha2VzIGBmbG9hdCcgYXJndW1lbnRzLiAgKi8KKworI2lmbmRlZiBfQ09NUExFWF9ICisjZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9jbWF0aGNhbGxzLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxjb21wbGV4Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNkZWZpbmUgX01kb3VibGVfY29tcGxleF8gX01kb3VibGVfIF9Db21wbGV4CisKKworLyogVHJpZ29ub21ldHJpYyBmdW5jdGlvbnMuICAqLworCisvKiBBcmMgY29zaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2Fjb3MsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIEFyYyBzaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2FzaW4sIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIEFyYyB0YW5nZW50IG9mIFouICAqLworX19NQVRIQ0FMTCAoY2F0YW4sIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogQ29zaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2NvcywgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworLyogU2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNzaW4sIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIFRhbmdlbnQgb2YgWi4gICovCitfX01BVEhDQUxMIChjdGFuLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKworLyogSHlwZXJib2xpYyBmdW5jdGlvbnMuICAqLworCisvKiBIeXBlcmJvbGljIGFyYyBjb3NpbmUgb2YgWi4gICovCitfX01BVEhDQUxMIChjYWNvc2gsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIEh5cGVyYm9saWMgYXJjIHNpbmUgb2YgWi4gICovCitfX01BVEhDQUxMIChjYXNpbmgsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIEh5cGVyYm9saWMgYXJjIHRhbmdlbnQgb2YgWi4gICovCitfX01BVEhDQUxMIChjYXRhbmgsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogSHlwZXJib2xpYyBjb3NpbmUgb2YgWi4gICovCitfX01BVEhDQUxMIChjY29zaCwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworLyogSHlwZXJib2xpYyBzaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY3NpbmgsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIEh5cGVyYm9saWMgdGFuZ2VudCBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGN0YW5oLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKworLyogRXhwb25lbnRpYWwgYW5kIGxvZ2FyaXRobWljIGZ1bmN0aW9ucy4gICovCisKKy8qIEV4cG9uZW50aWFsIGZ1bmN0aW9uIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2V4cCwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisvKiBOYXR1cmFsIGxvZ2FyaXRobSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNsb2csIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhlIGJhc2UgMTAgbG9nYXJpdGhtIGlzIG5vdCBkZWZpbmVkIGJ5IHRoZSBzdGFuZGFyZCBidXQgdG8gaW1wbGVtZW50CisgICB0aGUgc3RhbmRhcmQgQysrIGxpYnJhcnkgaXQgaXMgaGFuZHkuICAqLworX19NQVRIQ0FMTCAoY2xvZzEwLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisjZW5kaWYKKworLyogUG93ZXIgZnVuY3Rpb25zLiAgKi8KKworLyogUmV0dXJuIFggdG8gdGhlIFkgcG93ZXIuICAqLworX19NQVRIQ0FMTCAoY3BvdywgKF9NZG91YmxlX2NvbXBsZXhfIF9feCwgX01kb3VibGVfY29tcGxleF8gX195KSk7CisKKy8qIFJldHVybiB0aGUgc3F1YXJlIHJvb3Qgb2YgWi4gICovCitfX01BVEhDQUxMIChjc3FydCwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisKKy8qIEFic29sdXRlIHZhbHVlLCBjb25qdWdhdGVzLCBhbmQgcHJvamVjdGlvbi4gICovCisKKy8qIEFic29sdXRlIHZhbHVlIG9mIFouICAqLworX19NQVRIREVDTCAoX01kb3VibGVfLGNhYnMsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogQXJndW1lbnQgdmFsdWUgb2YgWi4gICovCitfX01BVEhERUNMIChfTWRvdWJsZV8sY2FyZywgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisvKiBDb21wbGV4IGNvbmp1Z2F0ZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNvbmosIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogUHJvamVjdGlvbiBvZiBaIG9udG8gdGhlIFJpZW1hbm4gc3BoZXJlLiAgKi8KK19fTUFUSENBTEwgKGNwcm9qLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKworLyogRGVjb21wb3NpbmcgY29tcGxleCB2YWx1ZXMuICAqLworCisvKiBJbWFnaW5hcnkgcGFydCBvZiBaLiAgKi8KK19fTUFUSERFQ0wgKF9NZG91YmxlXyxjaW1hZywgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisvKiBSZWFsIHBhcnQgb2YgWi4gICovCitfX01BVEhERUNMIChfTWRvdWJsZV8sY3JlYWwsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworCisvKiBOb3cgc29tZSBvcHRpbWl6ZWQgdmVyc2lvbnMuICBHQ0MgaGFzIGhhbmR5IG5vdGF0aW9ucyBmb3IgdGhlc2UKKyAgIGZ1bmN0aW9ucy4gIFJlY2VudCBHQ0MgaGFuZGxlcyB0aGVzZSBhcyBidWlsdGluIGZ1bmN0aW9ucyBzbyBkb2VzCisgICBub3QgbmVlZCBpbmxpbmVzLiAgKi8KKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmICFfX0dOVUNfUFJFUkVRICgyLCA5NykgJiYgZGVmaW5lZCBfX09QVElNSVpFX18gXAorICAgICYmIGRlZmluZWQgX19leHRlcm5faW5saW5lCisKKy8qIEltYWdpbmFyeSBwYXJ0IG9mIFouICAqLworX19leHRlcm5faW5saW5lIF9NZG91YmxlXworX19NQVRIX1BSRUNOQU1FKGNpbWFnKSAoX01kb3VibGVfY29tcGxleF8gX196KSBfX1RIUk9XCit7CisgIHJldHVybiBfX2ltYWdfXyBfX3o7Cit9CisKKy8qIFJlYWwgcGFydCBvZiBaLiAgKi8KK19fZXh0ZXJuX2lubGluZSBfTWRvdWJsZV8KK19fTUFUSF9QUkVDTkFNRShjcmVhbCkgKF9NZG91YmxlX2NvbXBsZXhfIF9feikgX19USFJPVworeworICByZXR1cm4gX19yZWFsX18gX196OworfQorCisvKiBDb21wbGV4IGNvbmp1Z2F0ZSBvZiBaLiAgKi8KK19fZXh0ZXJuX2lubGluZSBfTWRvdWJsZV9jb21wbGV4XworX19NQVRIX1BSRUNOQU1FKGNvbmopIChfTWRvdWJsZV9jb21wbGV4XyBfX3opIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gfl9fejsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9jb25mbmFtZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvY29uZm5hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWZjYWZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvY29uZm5hbWUuaApAQCAtMCwwICsxLDY3NyBAQAorLyogYHN5c2NvbmYnLCBgcGF0aGNvbmYnLCBhbmQgYGNvbmZzdHInIE5BTUUgdmFsdWVzLiAgR2VuZXJpYyB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLDE5OTUtMTk5OCwyMDAwLDIwMDEsMjAwMywyMDA0LDIwMDcsMjAwOSwyMDEwCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfVU5JU1REX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9jb25mbmFtZS5oPiBkaXJlY3RseTsgaW5jbHVkZSA8dW5pc3RkLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFZhbHVlcyBmb3IgdGhlIE5BTUUgYXJndW1lbnQgdG8gYHBhdGhjb25mJyBhbmQgYGZwYXRoY29uZicuICAqLworZW51bQorICB7CisgICAgX1BDX0xJTktfTUFYLAorI2RlZmluZQlfUENfTElOS19NQVgJCQlfUENfTElOS19NQVgKKyAgICBfUENfTUFYX0NBTk9OLAorI2RlZmluZQlfUENfTUFYX0NBTk9OCQkJX1BDX01BWF9DQU5PTgorICAgIF9QQ19NQVhfSU5QVVQsCisjZGVmaW5lCV9QQ19NQVhfSU5QVVQJCQlfUENfTUFYX0lOUFVUCisgICAgX1BDX05BTUVfTUFYLAorI2RlZmluZQlfUENfTkFNRV9NQVgJCQlfUENfTkFNRV9NQVgKKyAgICBfUENfUEFUSF9NQVgsCisjZGVmaW5lCV9QQ19QQVRIX01BWAkJCV9QQ19QQVRIX01BWAorICAgIF9QQ19QSVBFX0JVRiwKKyNkZWZpbmUJX1BDX1BJUEVfQlVGCQkJX1BDX1BJUEVfQlVGCisgICAgX1BDX0NIT1dOX1JFU1RSSUNURUQsCisjZGVmaW5lCV9QQ19DSE9XTl9SRVNUUklDVEVECQlfUENfQ0hPV05fUkVTVFJJQ1RFRAorICAgIF9QQ19OT19UUlVOQywKKyNkZWZpbmUJX1BDX05PX1RSVU5DCQkJX1BDX05PX1RSVU5DCisgICAgX1BDX1ZESVNBQkxFLAorI2RlZmluZSBfUENfVkRJU0FCTEUJCQlfUENfVkRJU0FCTEUKKyAgICBfUENfU1lOQ19JTywKKyNkZWZpbmUJX1BDX1NZTkNfSU8JCQlfUENfU1lOQ19JTworICAgIF9QQ19BU1lOQ19JTywKKyNkZWZpbmUJX1BDX0FTWU5DX0lPCQkJX1BDX0FTWU5DX0lPCisgICAgX1BDX1BSSU9fSU8sCisjZGVmaW5lCV9QQ19QUklPX0lPCQkJX1BDX1BSSU9fSU8KKyAgICBfUENfU09DS19NQVhCVUYsCisjZGVmaW5lCV9QQ19TT0NLX01BWEJVRgkJCV9QQ19TT0NLX01BWEJVRgorICAgIF9QQ19GSUxFU0laRUJJVFMsCisjZGVmaW5lIF9QQ19GSUxFU0laRUJJVFMJCV9QQ19GSUxFU0laRUJJVFMKKyAgICBfUENfUkVDX0lOQ1JfWEZFUl9TSVpFLAorI2RlZmluZSBfUENfUkVDX0lOQ1JfWEZFUl9TSVpFCQlfUENfUkVDX0lOQ1JfWEZFUl9TSVpFCisgICAgX1BDX1JFQ19NQVhfWEZFUl9TSVpFLAorI2RlZmluZSBfUENfUkVDX01BWF9YRkVSX1NJWkUJCV9QQ19SRUNfTUFYX1hGRVJfU0laRQorICAgIF9QQ19SRUNfTUlOX1hGRVJfU0laRSwKKyNkZWZpbmUgX1BDX1JFQ19NSU5fWEZFUl9TSVpFCQlfUENfUkVDX01JTl9YRkVSX1NJWkUKKyAgICBfUENfUkVDX1hGRVJfQUxJR04sCisjZGVmaW5lIF9QQ19SRUNfWEZFUl9BTElHTgkJX1BDX1JFQ19YRkVSX0FMSUdOCisgICAgX1BDX0FMTE9DX1NJWkVfTUlOLAorI2RlZmluZSBfUENfQUxMT0NfU0laRV9NSU4JCV9QQ19BTExPQ19TSVpFX01JTgorICAgIF9QQ19TWU1MSU5LX01BWCwKKyNkZWZpbmUgX1BDX1NZTUxJTktfTUFYCQkJX1BDX1NZTUxJTktfTUFYCisgICAgX1BDXzJfU1lNTElOS1MKKyNkZWZpbmUgX1BDXzJfU1lNTElOS1MJCQlfUENfMl9TWU1MSU5LUworICB9OworCisvKiBWYWx1ZXMgZm9yIHRoZSBhcmd1bWVudCB0byBgc3lzY29uZicuICAqLworZW51bQorICB7CisgICAgX1NDX0FSR19NQVgsCisjZGVmaW5lCV9TQ19BUkdfTUFYCQkJX1NDX0FSR19NQVgKKyAgICBfU0NfQ0hJTERfTUFYLAorI2RlZmluZQlfU0NfQ0hJTERfTUFYCQkJX1NDX0NISUxEX01BWAorICAgIF9TQ19DTEtfVENLLAorI2RlZmluZQlfU0NfQ0xLX1RDSwkJCV9TQ19DTEtfVENLCisgICAgX1NDX05HUk9VUFNfTUFYLAorI2RlZmluZQlfU0NfTkdST1VQU19NQVgJCQlfU0NfTkdST1VQU19NQVgKKyAgICBfU0NfT1BFTl9NQVgsCisjZGVmaW5lCV9TQ19PUEVOX01BWAkJCV9TQ19PUEVOX01BWAorICAgIF9TQ19TVFJFQU1fTUFYLAorI2RlZmluZQlfU0NfU1RSRUFNX01BWAkJCV9TQ19TVFJFQU1fTUFYCisgICAgX1NDX1RaTkFNRV9NQVgsCisjZGVmaW5lCV9TQ19UWk5BTUVfTUFYCQkJX1NDX1RaTkFNRV9NQVgKKyAgICBfU0NfSk9CX0NPTlRST0wsCisjZGVmaW5lCV9TQ19KT0JfQ09OVFJPTAkJCV9TQ19KT0JfQ09OVFJPTAorICAgIF9TQ19TQVZFRF9JRFMsCisjZGVmaW5lCV9TQ19TQVZFRF9JRFMJCQlfU0NfU0FWRURfSURTCisgICAgX1NDX1JFQUxUSU1FX1NJR05BTFMsCisjZGVmaW5lCV9TQ19SRUFMVElNRV9TSUdOQUxTCQlfU0NfUkVBTFRJTUVfU0lHTkFMUworICAgIF9TQ19QUklPUklUWV9TQ0hFRFVMSU5HLAorI2RlZmluZQlfU0NfUFJJT1JJVFlfU0NIRURVTElORwkJX1NDX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyAgICBfU0NfVElNRVJTLAorI2RlZmluZQlfU0NfVElNRVJTCQkJX1NDX1RJTUVSUworICAgIF9TQ19BU1lOQ0hST05PVVNfSU8sCisjZGVmaW5lCV9TQ19BU1lOQ0hST05PVVNfSU8JCV9TQ19BU1lOQ0hST05PVVNfSU8KKyAgICBfU0NfUFJJT1JJVElaRURfSU8sCisjZGVmaW5lCV9TQ19QUklPUklUSVpFRF9JTwkJX1NDX1BSSU9SSVRJWkVEX0lPCisgICAgX1NDX1NZTkNIUk9OSVpFRF9JTywKKyNkZWZpbmUJX1NDX1NZTkNIUk9OSVpFRF9JTwkJX1NDX1NZTkNIUk9OSVpFRF9JTworICAgIF9TQ19GU1lOQywKKyNkZWZpbmUJX1NDX0ZTWU5DCQkJX1NDX0ZTWU5DCisgICAgX1NDX01BUFBFRF9GSUxFUywKKyNkZWZpbmUJX1NDX01BUFBFRF9GSUxFUwkJX1NDX01BUFBFRF9GSUxFUworICAgIF9TQ19NRU1MT0NLLAorI2RlZmluZQlfU0NfTUVNTE9DSwkJCV9TQ19NRU1MT0NLCisgICAgX1NDX01FTUxPQ0tfUkFOR0UsCisjZGVmaW5lCV9TQ19NRU1MT0NLX1JBTkdFCQlfU0NfTUVNTE9DS19SQU5HRQorICAgIF9TQ19NRU1PUllfUFJPVEVDVElPTiwKKyNkZWZpbmUJX1NDX01FTU9SWV9QUk9URUNUSU9OCQlfU0NfTUVNT1JZX1BST1RFQ1RJT04KKyAgICBfU0NfTUVTU0FHRV9QQVNTSU5HLAorI2RlZmluZQlfU0NfTUVTU0FHRV9QQVNTSU5HCQlfU0NfTUVTU0FHRV9QQVNTSU5HCisgICAgX1NDX1NFTUFQSE9SRVMsCisjZGVmaW5lCV9TQ19TRU1BUEhPUkVTCQkJX1NDX1NFTUFQSE9SRVMKKyAgICBfU0NfU0hBUkVEX01FTU9SWV9PQkpFQ1RTLAorI2RlZmluZQlfU0NfU0hBUkVEX01FTU9SWV9PQkpFQ1RTCV9TQ19TSEFSRURfTUVNT1JZX09CSkVDVFMKKyAgICBfU0NfQUlPX0xJU1RJT19NQVgsCisjZGVmaW5lCV9TQ19BSU9fTElTVElPX01BWAkJX1NDX0FJT19MSVNUSU9fTUFYCisgICAgX1NDX0FJT19NQVgsCisjZGVmaW5lCV9TQ19BSU9fTUFYCQkJX1NDX0FJT19NQVgKKyAgICBfU0NfQUlPX1BSSU9fREVMVEFfTUFYLAorI2RlZmluZQlfU0NfQUlPX1BSSU9fREVMVEFfTUFYCQlfU0NfQUlPX1BSSU9fREVMVEFfTUFYCisgICAgX1NDX0RFTEFZVElNRVJfTUFYLAorI2RlZmluZQlfU0NfREVMQVlUSU1FUl9NQVgJCV9TQ19ERUxBWVRJTUVSX01BWAorICAgIF9TQ19NUV9PUEVOX01BWCwKKyNkZWZpbmUJX1NDX01RX09QRU5fTUFYCQkJX1NDX01RX09QRU5fTUFYCisgICAgX1NDX01RX1BSSU9fTUFYLAorI2RlZmluZQlfU0NfTVFfUFJJT19NQVgJCQlfU0NfTVFfUFJJT19NQVgKKyAgICBfU0NfVkVSU0lPTiwKKyNkZWZpbmUJX1NDX1ZFUlNJT04JCQlfU0NfVkVSU0lPTgorICAgIF9TQ19QQUdFU0laRSwKKyNkZWZpbmUJX1NDX1BBR0VTSVpFCQkJX1NDX1BBR0VTSVpFCisjZGVmaW5lCV9TQ19QQUdFX1NJWkUJCQlfU0NfUEFHRVNJWkUKKyAgICBfU0NfUlRTSUdfTUFYLAorI2RlZmluZQlfU0NfUlRTSUdfTUFYCQkJX1NDX1JUU0lHX01BWAorICAgIF9TQ19TRU1fTlNFTVNfTUFYLAorI2RlZmluZQlfU0NfU0VNX05TRU1TX01BWAkJX1NDX1NFTV9OU0VNU19NQVgKKyAgICBfU0NfU0VNX1ZBTFVFX01BWCwKKyNkZWZpbmUJX1NDX1NFTV9WQUxVRV9NQVgJCV9TQ19TRU1fVkFMVUVfTUFYCisgICAgX1NDX1NJR1FVRVVFX01BWCwKKyNkZWZpbmUJX1NDX1NJR1FVRVVFX01BWAkJX1NDX1NJR1FVRVVFX01BWAorICAgIF9TQ19USU1FUl9NQVgsCisjZGVmaW5lCV9TQ19USU1FUl9NQVgJCQlfU0NfVElNRVJfTUFYCisKKyAgICAvKiBWYWx1ZXMgZm9yIHRoZSBhcmd1bWVudCB0byBgc3lzY29uZicKKyAgICAgICBjb3JyZXNwb25kaW5nIHRvIF9QT1NJWDJfKiBzeW1ib2xzLiAgKi8KKyAgICBfU0NfQkNfQkFTRV9NQVgsCisjZGVmaW5lCV9TQ19CQ19CQVNFX01BWAkJCV9TQ19CQ19CQVNFX01BWAorICAgIF9TQ19CQ19ESU1fTUFYLAorI2RlZmluZQlfU0NfQkNfRElNX01BWAkJCV9TQ19CQ19ESU1fTUFYCisgICAgX1NDX0JDX1NDQUxFX01BWCwKKyNkZWZpbmUJX1NDX0JDX1NDQUxFX01BWAkJX1NDX0JDX1NDQUxFX01BWAorICAgIF9TQ19CQ19TVFJJTkdfTUFYLAorI2RlZmluZQlfU0NfQkNfU1RSSU5HX01BWAkJX1NDX0JDX1NUUklOR19NQVgKKyAgICBfU0NfQ09MTF9XRUlHSFRTX01BWCwKKyNkZWZpbmUJX1NDX0NPTExfV0VJR0hUU19NQVgJCV9TQ19DT0xMX1dFSUdIVFNfTUFYCisgICAgX1NDX0VRVUlWX0NMQVNTX01BWCwKKyNkZWZpbmUJX1NDX0VRVUlWX0NMQVNTX01BWAkJX1NDX0VRVUlWX0NMQVNTX01BWAorICAgIF9TQ19FWFBSX05FU1RfTUFYLAorI2RlZmluZQlfU0NfRVhQUl9ORVNUX01BWAkJX1NDX0VYUFJfTkVTVF9NQVgKKyAgICBfU0NfTElORV9NQVgsCisjZGVmaW5lCV9TQ19MSU5FX01BWAkJCV9TQ19MSU5FX01BWAorICAgIF9TQ19SRV9EVVBfTUFYLAorI2RlZmluZQlfU0NfUkVfRFVQX01BWAkJCV9TQ19SRV9EVVBfTUFYCisgICAgX1NDX0NIQVJDTEFTU19OQU1FX01BWCwKKyNkZWZpbmUJX1NDX0NIQVJDTEFTU19OQU1FX01BWAkJX1NDX0NIQVJDTEFTU19OQU1FX01BWAorCisgICAgX1NDXzJfVkVSU0lPTiwKKyNkZWZpbmUJX1NDXzJfVkVSU0lPTgkJCV9TQ18yX1ZFUlNJT04KKyAgICBfU0NfMl9DX0JJTkQsCisjZGVmaW5lCV9TQ18yX0NfQklORAkJCV9TQ18yX0NfQklORAorICAgIF9TQ18yX0NfREVWLAorI2RlZmluZQlfU0NfMl9DX0RFVgkJCV9TQ18yX0NfREVWCisgICAgX1NDXzJfRk9SVF9ERVYsCisjZGVmaW5lCV9TQ18yX0ZPUlRfREVWCQkJX1NDXzJfRk9SVF9ERVYKKyAgICBfU0NfMl9GT1JUX1JVTiwKKyNkZWZpbmUJX1NDXzJfRk9SVF9SVU4JCQlfU0NfMl9GT1JUX1JVTgorICAgIF9TQ18yX1NXX0RFViwKKyNkZWZpbmUJX1NDXzJfU1dfREVWCQkJX1NDXzJfU1dfREVWCisgICAgX1NDXzJfTE9DQUxFREVGLAorI2RlZmluZQlfU0NfMl9MT0NBTEVERUYJCQlfU0NfMl9MT0NBTEVERUYKKworICAgIF9TQ19QSUksCisjZGVmaW5lCV9TQ19QSUkJCQkJX1NDX1BJSQorICAgIF9TQ19QSUlfWFRJLAorI2RlZmluZQlfU0NfUElJX1hUSQkJCV9TQ19QSUlfWFRJCisgICAgX1NDX1BJSV9TT0NLRVQsCisjZGVmaW5lCV9TQ19QSUlfU09DS0VUCQkJX1NDX1BJSV9TT0NLRVQKKyAgICBfU0NfUElJX0lOVEVSTkVULAorI2RlZmluZQlfU0NfUElJX0lOVEVSTkVUCQlfU0NfUElJX0lOVEVSTkVUCisgICAgX1NDX1BJSV9PU0ksCisjZGVmaW5lCV9TQ19QSUlfT1NJCQkJX1NDX1BJSV9PU0kKKyAgICBfU0NfUE9MTCwKKyNkZWZpbmUJX1NDX1BPTEwJCQlfU0NfUE9MTAorICAgIF9TQ19TRUxFQ1QsCisjZGVmaW5lCV9TQ19TRUxFQ1QJCQlfU0NfU0VMRUNUCisgICAgX1NDX1VJT19NQVhJT1YsCisjZGVmaW5lCV9TQ19VSU9fTUFYSU9WCQkJX1NDX1VJT19NQVhJT1YKKyAgICBfU0NfSU9WX01BWCA9IF9TQ19VSU9fTUFYSU9WLAorI2RlZmluZSBfU0NfSU9WX01BWAkJCV9TQ19JT1ZfTUFYCisgICAgX1NDX1BJSV9JTlRFUk5FVF9TVFJFQU0sCisjZGVmaW5lCV9TQ19QSUlfSU5URVJORVRfU1RSRUFNCQlfU0NfUElJX0lOVEVSTkVUX1NUUkVBTQorICAgIF9TQ19QSUlfSU5URVJORVRfREdSQU0sCisjZGVmaW5lCV9TQ19QSUlfSU5URVJORVRfREdSQU0JCV9TQ19QSUlfSU5URVJORVRfREdSQU0KKyAgICBfU0NfUElJX09TSV9DT1RTLAorI2RlZmluZQlfU0NfUElJX09TSV9DT1RTCQlfU0NfUElJX09TSV9DT1RTCisgICAgX1NDX1BJSV9PU0lfQ0xUUywKKyNkZWZpbmUJX1NDX1BJSV9PU0lfQ0xUUwkJX1NDX1BJSV9PU0lfQ0xUUworICAgIF9TQ19QSUlfT1NJX00sCisjZGVmaW5lCV9TQ19QSUlfT1NJX00JCQlfU0NfUElJX09TSV9NCisgICAgX1NDX1RfSU9WX01BWCwKKyNkZWZpbmUJX1NDX1RfSU9WX01BWAkJCV9TQ19UX0lPVl9NQVgKKworICAgIC8qIFZhbHVlcyBhY2NvcmRpbmcgdG8gUE9TSVggMTAwMy4xYyAoUE9TSVggdGhyZWFkcykuICAqLworICAgIF9TQ19USFJFQURTLAorI2RlZmluZQlfU0NfVEhSRUFEUwkJCV9TQ19USFJFQURTCisgICAgX1NDX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUywKKyNkZWZpbmUgX1NDX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUwlfU0NfVEhSRUFEX1NBRkVfRlVOQ1RJT05TCisgICAgX1NDX0dFVEdSX1JfU0laRV9NQVgsCisjZGVmaW5lCV9TQ19HRVRHUl9SX1NJWkVfTUFYCQlfU0NfR0VUR1JfUl9TSVpFX01BWAorICAgIF9TQ19HRVRQV19SX1NJWkVfTUFYLAorI2RlZmluZQlfU0NfR0VUUFdfUl9TSVpFX01BWAkJX1NDX0dFVFBXX1JfU0laRV9NQVgKKyAgICBfU0NfTE9HSU5fTkFNRV9NQVgsCisjZGVmaW5lCV9TQ19MT0dJTl9OQU1FX01BWAkJX1NDX0xPR0lOX05BTUVfTUFYCisgICAgX1NDX1RUWV9OQU1FX01BWCwKKyNkZWZpbmUJX1NDX1RUWV9OQU1FX01BWAkJX1NDX1RUWV9OQU1FX01BWAorICAgIF9TQ19USFJFQURfREVTVFJVQ1RPUl9JVEVSQVRJT05TLAorI2RlZmluZQlfU0NfVEhSRUFEX0RFU1RSVUNUT1JfSVRFUkFUSU9OUyBfU0NfVEhSRUFEX0RFU1RSVUNUT1JfSVRFUkFUSU9OUworICAgIF9TQ19USFJFQURfS0VZU19NQVgsCisjZGVmaW5lCV9TQ19USFJFQURfS0VZU19NQVgJCV9TQ19USFJFQURfS0VZU19NQVgKKyAgICBfU0NfVEhSRUFEX1NUQUNLX01JTiwKKyNkZWZpbmUJX1NDX1RIUkVBRF9TVEFDS19NSU4JCV9TQ19USFJFQURfU1RBQ0tfTUlOCisgICAgX1NDX1RIUkVBRF9USFJFQURTX01BWCwKKyNkZWZpbmUJX1NDX1RIUkVBRF9USFJFQURTX01BWAkJX1NDX1RIUkVBRF9USFJFQURTX01BWAorICAgIF9TQ19USFJFQURfQVRUUl9TVEFDS0FERFIsCisjZGVmaW5lCV9TQ19USFJFQURfQVRUUl9TVEFDS0FERFIJX1NDX1RIUkVBRF9BVFRSX1NUQUNLQUREUgorICAgIF9TQ19USFJFQURfQVRUUl9TVEFDS1NJWkUsCisjZGVmaW5lCV9TQ19USFJFQURfQVRUUl9TVEFDS1NJWkUJX1NDX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgIF9TQ19USFJFQURfUFJJT1JJVFlfU0NIRURVTElORywKKyNkZWZpbmUJX1NDX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCV9TQ19USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworICAgIF9TQ19USFJFQURfUFJJT19JTkhFUklULAorI2RlZmluZQlfU0NfVEhSRUFEX1BSSU9fSU5IRVJJVAkJX1NDX1RIUkVBRF9QUklPX0lOSEVSSVQKKyAgICBfU0NfVEhSRUFEX1BSSU9fUFJPVEVDVCwKKyNkZWZpbmUJX1NDX1RIUkVBRF9QUklPX1BST1RFQ1QJCV9TQ19USFJFQURfUFJJT19QUk9URUNUCisgICAgX1NDX1RIUkVBRF9QUk9DRVNTX1NIQVJFRCwKKyNkZWZpbmUJX1NDX1RIUkVBRF9QUk9DRVNTX1NIQVJFRAlfU0NfVEhSRUFEX1BST0NFU1NfU0hBUkVECisKKyAgICBfU0NfTlBST0NFU1NPUlNfQ09ORiwKKyNkZWZpbmUgX1NDX05QUk9DRVNTT1JTX0NPTkYJCV9TQ19OUFJPQ0VTU09SU19DT05GCisgICAgX1NDX05QUk9DRVNTT1JTX09OTE4sCisjZGVmaW5lIF9TQ19OUFJPQ0VTU09SU19PTkxOCQlfU0NfTlBST0NFU1NPUlNfT05MTgorICAgIF9TQ19QSFlTX1BBR0VTLAorI2RlZmluZSBfU0NfUEhZU19QQUdFUwkJCV9TQ19QSFlTX1BBR0VTCisgICAgX1NDX0FWUEhZU19QQUdFUywKKyNkZWZpbmUgX1NDX0FWUEhZU19QQUdFUwkJX1NDX0FWUEhZU19QQUdFUworICAgIF9TQ19BVEVYSVRfTUFYLAorI2RlZmluZSBfU0NfQVRFWElUX01BWAkJCV9TQ19BVEVYSVRfTUFYCisgICAgX1NDX1BBU1NfTUFYLAorI2RlZmluZSBfU0NfUEFTU19NQVgJCQlfU0NfUEFTU19NQVgKKworICAgIF9TQ19YT1BFTl9WRVJTSU9OLAorI2RlZmluZSBfU0NfWE9QRU5fVkVSU0lPTgkJX1NDX1hPUEVOX1ZFUlNJT04KKyAgICBfU0NfWE9QRU5fWENVX1ZFUlNJT04sCisjZGVmaW5lIF9TQ19YT1BFTl9YQ1VfVkVSU0lPTgkJX1NDX1hPUEVOX1hDVV9WRVJTSU9OCisgICAgX1NDX1hPUEVOX1VOSVgsCisjZGVmaW5lIF9TQ19YT1BFTl9VTklYCQkJX1NDX1hPUEVOX1VOSVgKKyAgICBfU0NfWE9QRU5fQ1JZUFQsCisjZGVmaW5lIF9TQ19YT1BFTl9DUllQVAkJCV9TQ19YT1BFTl9DUllQVAorICAgIF9TQ19YT1BFTl9FTkhfSTE4TiwKKyNkZWZpbmUgX1NDX1hPUEVOX0VOSF9JMThOCQlfU0NfWE9QRU5fRU5IX0kxOE4KKyAgICBfU0NfWE9QRU5fU0hNLAorI2RlZmluZSBfU0NfWE9QRU5fU0hNCQkJX1NDX1hPUEVOX1NITQorCisgICAgX1NDXzJfQ0hBUl9URVJNLAorI2RlZmluZSBfU0NfMl9DSEFSX1RFUk0JCQlfU0NfMl9DSEFSX1RFUk0KKyAgICBfU0NfMl9DX1ZFUlNJT04sCisjZGVmaW5lIF9TQ18yX0NfVkVSU0lPTgkJCV9TQ18yX0NfVkVSU0lPTgorICAgIF9TQ18yX1VQRSwKKyNkZWZpbmUgX1NDXzJfVVBFCQkJX1NDXzJfVVBFCisKKyAgICBfU0NfWE9QRU5fWFBHMiwKKyNkZWZpbmUgX1NDX1hPUEVOX1hQRzIJCQlfU0NfWE9QRU5fWFBHMgorICAgIF9TQ19YT1BFTl9YUEczLAorI2RlZmluZSBfU0NfWE9QRU5fWFBHMwkJCV9TQ19YT1BFTl9YUEczCisgICAgX1NDX1hPUEVOX1hQRzQsCisjZGVmaW5lIF9TQ19YT1BFTl9YUEc0CQkJX1NDX1hPUEVOX1hQRzQKKworICAgIF9TQ19DSEFSX0JJVCwKKyNkZWZpbmUJX1NDX0NIQVJfQklUCQkJX1NDX0NIQVJfQklUCisgICAgX1NDX0NIQVJfTUFYLAorI2RlZmluZQlfU0NfQ0hBUl9NQVgJCQlfU0NfQ0hBUl9NQVgKKyAgICBfU0NfQ0hBUl9NSU4sCisjZGVmaW5lCV9TQ19DSEFSX01JTgkJCV9TQ19DSEFSX01JTgorICAgIF9TQ19JTlRfTUFYLAorI2RlZmluZQlfU0NfSU5UX01BWAkJCV9TQ19JTlRfTUFYCisgICAgX1NDX0lOVF9NSU4sCisjZGVmaW5lCV9TQ19JTlRfTUlOCQkJX1NDX0lOVF9NSU4KKyAgICBfU0NfTE9OR19CSVQsCisjZGVmaW5lCV9TQ19MT05HX0JJVAkJCV9TQ19MT05HX0JJVAorICAgIF9TQ19XT1JEX0JJVCwKKyNkZWZpbmUJX1NDX1dPUkRfQklUCQkJX1NDX1dPUkRfQklUCisgICAgX1NDX01CX0xFTl9NQVgsCisjZGVmaW5lCV9TQ19NQl9MRU5fTUFYCQkJX1NDX01CX0xFTl9NQVgKKyAgICBfU0NfTlpFUk8sCisjZGVmaW5lCV9TQ19OWkVSTwkJCV9TQ19OWkVSTworICAgIF9TQ19TU0laRV9NQVgsCisjZGVmaW5lCV9TQ19TU0laRV9NQVgJCQlfU0NfU1NJWkVfTUFYCisgICAgX1NDX1NDSEFSX01BWCwKKyNkZWZpbmUJX1NDX1NDSEFSX01BWAkJCV9TQ19TQ0hBUl9NQVgKKyAgICBfU0NfU0NIQVJfTUlOLAorI2RlZmluZQlfU0NfU0NIQVJfTUlOCQkJX1NDX1NDSEFSX01JTgorICAgIF9TQ19TSFJUX01BWCwKKyNkZWZpbmUJX1NDX1NIUlRfTUFYCQkJX1NDX1NIUlRfTUFYCisgICAgX1NDX1NIUlRfTUlOLAorI2RlZmluZQlfU0NfU0hSVF9NSU4JCQlfU0NfU0hSVF9NSU4KKyAgICBfU0NfVUNIQVJfTUFYLAorI2RlZmluZQlfU0NfVUNIQVJfTUFYCQkJX1NDX1VDSEFSX01BWAorICAgIF9TQ19VSU5UX01BWCwKKyNkZWZpbmUJX1NDX1VJTlRfTUFYCQkJX1NDX1VJTlRfTUFYCisgICAgX1NDX1VMT05HX01BWCwKKyNkZWZpbmUJX1NDX1VMT05HX01BWAkJCV9TQ19VTE9OR19NQVgKKyAgICBfU0NfVVNIUlRfTUFYLAorI2RlZmluZQlfU0NfVVNIUlRfTUFYCQkJX1NDX1VTSFJUX01BWAorCisgICAgX1NDX05MX0FSR01BWCwKKyNkZWZpbmUJX1NDX05MX0FSR01BWAkJCV9TQ19OTF9BUkdNQVgKKyAgICBfU0NfTkxfTEFOR01BWCwKKyNkZWZpbmUJX1NDX05MX0xBTkdNQVgJCQlfU0NfTkxfTEFOR01BWAorICAgIF9TQ19OTF9NU0dNQVgsCisjZGVmaW5lCV9TQ19OTF9NU0dNQVgJCQlfU0NfTkxfTVNHTUFYCisgICAgX1NDX05MX05NQVgsCisjZGVmaW5lCV9TQ19OTF9OTUFYCQkJX1NDX05MX05NQVgKKyAgICBfU0NfTkxfU0VUTUFYLAorI2RlZmluZQlfU0NfTkxfU0VUTUFYCQkJX1NDX05MX1NFVE1BWAorICAgIF9TQ19OTF9URVhUTUFYLAorI2RlZmluZQlfU0NfTkxfVEVYVE1BWAkJCV9TQ19OTF9URVhUTUFYCisKKyAgICBfU0NfWEJTNV9JTFAzMl9PRkYzMiwKKyNkZWZpbmUgX1NDX1hCUzVfSUxQMzJfT0ZGMzIJCV9TQ19YQlM1X0lMUDMyX09GRjMyCisgICAgX1NDX1hCUzVfSUxQMzJfT0ZGQklHLAorI2RlZmluZSBfU0NfWEJTNV9JTFAzMl9PRkZCSUcJCV9TQ19YQlM1X0lMUDMyX09GRkJJRworICAgIF9TQ19YQlM1X0xQNjRfT0ZGNjQsCisjZGVmaW5lIF9TQ19YQlM1X0xQNjRfT0ZGNjQJCV9TQ19YQlM1X0xQNjRfT0ZGNjQKKyAgICBfU0NfWEJTNV9MUEJJR19PRkZCSUcsCisjZGVmaW5lIF9TQ19YQlM1X0xQQklHX09GRkJJRwkJX1NDX1hCUzVfTFBCSUdfT0ZGQklHCisKKyAgICBfU0NfWE9QRU5fTEVHQUNZLAorI2RlZmluZSBfU0NfWE9QRU5fTEVHQUNZCQlfU0NfWE9QRU5fTEVHQUNZCisgICAgX1NDX1hPUEVOX1JFQUxUSU1FLAorI2RlZmluZSBfU0NfWE9QRU5fUkVBTFRJTUUJCV9TQ19YT1BFTl9SRUFMVElNRQorICAgIF9TQ19YT1BFTl9SRUFMVElNRV9USFJFQURTLAorI2RlZmluZSBfU0NfWE9QRU5fUkVBTFRJTUVfVEhSRUFEUwlfU0NfWE9QRU5fUkVBTFRJTUVfVEhSRUFEUworCisgICAgX1NDX0FEVklTT1JZX0lORk8sCisjZGVmaW5lIF9TQ19BRFZJU09SWV9JTkZPCQlfU0NfQURWSVNPUllfSU5GTworICAgIF9TQ19CQVJSSUVSUywKKyNkZWZpbmUgX1NDX0JBUlJJRVJTCQkJX1NDX0JBUlJJRVJTCisgICAgX1NDX0JBU0UsCisjZGVmaW5lIF9TQ19CQVNFCQkJX1NDX0JBU0UKKyAgICBfU0NfQ19MQU5HX1NVUFBPUlQsCisjZGVmaW5lIF9TQ19DX0xBTkdfU1VQUE9SVAkJX1NDX0NfTEFOR19TVVBQT1JUCisgICAgX1NDX0NfTEFOR19TVVBQT1JUX1IsCisjZGVmaW5lIF9TQ19DX0xBTkdfU1VQUE9SVF9SCQlfU0NfQ19MQU5HX1NVUFBPUlRfUgorICAgIF9TQ19DTE9DS19TRUxFQ1RJT04sCisjZGVmaW5lIF9TQ19DTE9DS19TRUxFQ1RJT04JCV9TQ19DTE9DS19TRUxFQ1RJT04KKyAgICBfU0NfQ1BVVElNRSwKKyNkZWZpbmUgX1NDX0NQVVRJTUUJCQlfU0NfQ1BVVElNRQorICAgIF9TQ19USFJFQURfQ1BVVElNRSwKKyNkZWZpbmUgX1NDX1RIUkVBRF9DUFVUSU1FCQlfU0NfVEhSRUFEX0NQVVRJTUUKKyAgICBfU0NfREVWSUNFX0lPLAorI2RlZmluZSBfU0NfREVWSUNFX0lPCQkJX1NDX0RFVklDRV9JTworICAgIF9TQ19ERVZJQ0VfU1BFQ0lGSUMsCisjZGVmaW5lIF9TQ19ERVZJQ0VfU1BFQ0lGSUMJCV9TQ19ERVZJQ0VfU1BFQ0lGSUMKKyAgICBfU0NfREVWSUNFX1NQRUNJRklDX1IsCisjZGVmaW5lIF9TQ19ERVZJQ0VfU1BFQ0lGSUNfUgkJX1NDX0RFVklDRV9TUEVDSUZJQ19SCisgICAgX1NDX0ZEX01HTVQsCisjZGVmaW5lIF9TQ19GRF9NR01UCQkJX1NDX0ZEX01HTVQKKyAgICBfU0NfRklGTywKKyNkZWZpbmUgX1NDX0ZJRk8JCQlfU0NfRklGTworICAgIF9TQ19QSVBFLAorI2RlZmluZSBfU0NfUElQRQkJCV9TQ19QSVBFCisgICAgX1NDX0ZJTEVfQVRUUklCVVRFUywKKyNkZWZpbmUgX1NDX0ZJTEVfQVRUUklCVVRFUwkJX1NDX0ZJTEVfQVRUUklCVVRFUworICAgIF9TQ19GSUxFX0xPQ0tJTkcsCisjZGVmaW5lIF9TQ19GSUxFX0xPQ0tJTkcJCV9TQ19GSUxFX0xPQ0tJTkcKKyAgICBfU0NfRklMRV9TWVNURU0sCisjZGVmaW5lIF9TQ19GSUxFX1NZU1RFTQkJCV9TQ19GSUxFX1NZU1RFTQorICAgIF9TQ19NT05PVE9OSUNfQ0xPQ0ssCisjZGVmaW5lIF9TQ19NT05PVE9OSUNfQ0xPQ0sJCV9TQ19NT05PVE9OSUNfQ0xPQ0sKKyAgICBfU0NfTVVMVElfUFJPQ0VTUywKKyNkZWZpbmUgX1NDX01VTFRJX1BST0NFU1MJCV9TQ19NVUxUSV9QUk9DRVNTCisgICAgX1NDX1NJTkdMRV9QUk9DRVNTLAorI2RlZmluZSBfU0NfU0lOR0xFX1BST0NFU1MJCV9TQ19TSU5HTEVfUFJPQ0VTUworICAgIF9TQ19ORVRXT1JLSU5HLAorI2RlZmluZSBfU0NfTkVUV09SS0lORwkJCV9TQ19ORVRXT1JLSU5HCisgICAgX1NDX1JFQURFUl9XUklURVJfTE9DS1MsCisjZGVmaW5lIF9TQ19SRUFERVJfV1JJVEVSX0xPQ0tTCQlfU0NfUkVBREVSX1dSSVRFUl9MT0NLUworICAgIF9TQ19TUElOX0xPQ0tTLAorI2RlZmluZSBfU0NfU1BJTl9MT0NLUwkJCV9TQ19TUElOX0xPQ0tTCisgICAgX1NDX1JFR0VYUCwKKyNkZWZpbmUgX1NDX1JFR0VYUAkJCV9TQ19SRUdFWFAKKyAgICBfU0NfUkVHRVhfVkVSU0lPTiwKKyNkZWZpbmUgX1NDX1JFR0VYX1ZFUlNJT04JCV9TQ19SRUdFWF9WRVJTSU9OCisgICAgX1NDX1NIRUxMLAorI2RlZmluZSBfU0NfU0hFTEwJCQlfU0NfU0hFTEwKKyAgICBfU0NfU0lHTkFMUywKKyNkZWZpbmUgX1NDX1NJR05BTFMJCQlfU0NfU0lHTkFMUworICAgIF9TQ19TUEFXTiwKKyNkZWZpbmUgX1NDX1NQQVdOCQkJX1NDX1NQQVdOCisgICAgX1NDX1NQT1JBRElDX1NFUlZFUiwKKyNkZWZpbmUgX1NDX1NQT1JBRElDX1NFUlZFUgkJX1NDX1NQT1JBRElDX1NFUlZFUgorICAgIF9TQ19USFJFQURfU1BPUkFESUNfU0VSVkVSLAorI2RlZmluZSBfU0NfVEhSRUFEX1NQT1JBRElDX1NFUlZFUglfU0NfVEhSRUFEX1NQT1JBRElDX1NFUlZFUgorICAgIF9TQ19TWVNURU1fREFUQUJBU0UsCisjZGVmaW5lIF9TQ19TWVNURU1fREFUQUJBU0UJCV9TQ19TWVNURU1fREFUQUJBU0UKKyAgICBfU0NfU1lTVEVNX0RBVEFCQVNFX1IsCisjZGVmaW5lIF9TQ19TWVNURU1fREFUQUJBU0VfUgkJX1NDX1NZU1RFTV9EQVRBQkFTRV9SCisgICAgX1NDX1RJTUVPVVRTLAorI2RlZmluZSBfU0NfVElNRU9VVFMJCQlfU0NfVElNRU9VVFMKKyAgICBfU0NfVFlQRURfTUVNT1JZX09CSkVDVFMsCisjZGVmaW5lIF9TQ19UWVBFRF9NRU1PUllfT0JKRUNUUwlfU0NfVFlQRURfTUVNT1JZX09CSkVDVFMKKyAgICBfU0NfVVNFUl9HUk9VUFMsCisjZGVmaW5lIF9TQ19VU0VSX0dST1VQUwkJCV9TQ19VU0VSX0dST1VQUworICAgIF9TQ19VU0VSX0dST1VQU19SLAorI2RlZmluZSBfU0NfVVNFUl9HUk9VUFNfUgkJX1NDX1VTRVJfR1JPVVBTX1IKKyAgICBfU0NfMl9QQlMsCisjZGVmaW5lIF9TQ18yX1BCUwkJCV9TQ18yX1BCUworICAgIF9TQ18yX1BCU19BQ0NPVU5USU5HLAorI2RlZmluZSBfU0NfMl9QQlNfQUNDT1VOVElORwkJX1NDXzJfUEJTX0FDQ09VTlRJTkcKKyAgICBfU0NfMl9QQlNfTE9DQVRFLAorI2RlZmluZSBfU0NfMl9QQlNfTE9DQVRFCQlfU0NfMl9QQlNfTE9DQVRFCisgICAgX1NDXzJfUEJTX01FU1NBR0UsCisjZGVmaW5lIF9TQ18yX1BCU19NRVNTQUdFCQlfU0NfMl9QQlNfTUVTU0FHRQorICAgIF9TQ18yX1BCU19UUkFDSywKKyNkZWZpbmUgX1NDXzJfUEJTX1RSQUNLCQkJX1NDXzJfUEJTX1RSQUNLCisgICAgX1NDX1NZTUxPT1BfTUFYLAorI2RlZmluZSBfU0NfU1lNTE9PUF9NQVgJCQlfU0NfU1lNTE9PUF9NQVgKKyAgICBfU0NfU1RSRUFNUywKKyNkZWZpbmUgX1NDX1NUUkVBTVMJCQlfU0NfU1RSRUFNUworICAgIF9TQ18yX1BCU19DSEVDS1BPSU5ULAorI2RlZmluZSBfU0NfMl9QQlNfQ0hFQ0tQT0lOVAkJX1NDXzJfUEJTX0NIRUNLUE9JTlQKKworICAgIF9TQ19WNl9JTFAzMl9PRkYzMiwKKyNkZWZpbmUgX1NDX1Y2X0lMUDMyX09GRjMyCQlfU0NfVjZfSUxQMzJfT0ZGMzIKKyAgICBfU0NfVjZfSUxQMzJfT0ZGQklHLAorI2RlZmluZSBfU0NfVjZfSUxQMzJfT0ZGQklHCQlfU0NfVjZfSUxQMzJfT0ZGQklHCisgICAgX1NDX1Y2X0xQNjRfT0ZGNjQsCisjZGVmaW5lIF9TQ19WNl9MUDY0X09GRjY0CQlfU0NfVjZfTFA2NF9PRkY2NAorICAgIF9TQ19WNl9MUEJJR19PRkZCSUcsCisjZGVmaW5lIF9TQ19WNl9MUEJJR19PRkZCSUcJCV9TQ19WNl9MUEJJR19PRkZCSUcKKworICAgIF9TQ19IT1NUX05BTUVfTUFYLAorI2RlZmluZSBfU0NfSE9TVF9OQU1FX01BWAkJX1NDX0hPU1RfTkFNRV9NQVgKKyAgICBfU0NfVFJBQ0UsCisjZGVmaW5lIF9TQ19UUkFDRQkJCV9TQ19UUkFDRQorICAgIF9TQ19UUkFDRV9FVkVOVF9GSUxURVIsCisjZGVmaW5lIF9TQ19UUkFDRV9FVkVOVF9GSUxURVIJCV9TQ19UUkFDRV9FVkVOVF9GSUxURVIKKyAgICBfU0NfVFJBQ0VfSU5IRVJJVCwKKyNkZWZpbmUgX1NDX1RSQUNFX0lOSEVSSVQJCV9TQ19UUkFDRV9JTkhFUklUCisgICAgX1NDX1RSQUNFX0xPRywKKyNkZWZpbmUgX1NDX1RSQUNFX0xPRwkJCV9TQ19UUkFDRV9MT0cKKworICAgIF9TQ19MRVZFTDFfSUNBQ0hFX1NJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDFfSUNBQ0hFX1NJWkUJCV9TQ19MRVZFTDFfSUNBQ0hFX1NJWkUKKyAgICBfU0NfTEVWRUwxX0lDQUNIRV9BU1NPQywKKyNkZWZpbmUgX1NDX0xFVkVMMV9JQ0FDSEVfQVNTT0MJCV9TQ19MRVZFTDFfSUNBQ0hFX0FTU09DCisgICAgX1NDX0xFVkVMMV9JQ0FDSEVfTElORVNJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDFfSUNBQ0hFX0xJTkVTSVpFCV9TQ19MRVZFTDFfSUNBQ0hFX0xJTkVTSVpFCisgICAgX1NDX0xFVkVMMV9EQ0FDSEVfU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMMV9EQ0FDSEVfU0laRQkJX1NDX0xFVkVMMV9EQ0FDSEVfU0laRQorICAgIF9TQ19MRVZFTDFfRENBQ0hFX0FTU09DLAorI2RlZmluZSBfU0NfTEVWRUwxX0RDQUNIRV9BU1NPQwkJX1NDX0xFVkVMMV9EQ0FDSEVfQVNTT0MKKyAgICBfU0NfTEVWRUwxX0RDQUNIRV9MSU5FU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMMV9EQ0FDSEVfTElORVNJWkUJX1NDX0xFVkVMMV9EQ0FDSEVfTElORVNJWkUKKyAgICBfU0NfTEVWRUwyX0NBQ0hFX1NJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDJfQ0FDSEVfU0laRQkJX1NDX0xFVkVMMl9DQUNIRV9TSVpFCisgICAgX1NDX0xFVkVMMl9DQUNIRV9BU1NPQywKKyNkZWZpbmUgX1NDX0xFVkVMMl9DQUNIRV9BU1NPQwkJX1NDX0xFVkVMMl9DQUNIRV9BU1NPQworICAgIF9TQ19MRVZFTDJfQ0FDSEVfTElORVNJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDJfQ0FDSEVfTElORVNJWkUJX1NDX0xFVkVMMl9DQUNIRV9MSU5FU0laRQorICAgIF9TQ19MRVZFTDNfQ0FDSEVfU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMM19DQUNIRV9TSVpFCQlfU0NfTEVWRUwzX0NBQ0hFX1NJWkUKKyAgICBfU0NfTEVWRUwzX0NBQ0hFX0FTU09DLAorI2RlZmluZSBfU0NfTEVWRUwzX0NBQ0hFX0FTU09DCQlfU0NfTEVWRUwzX0NBQ0hFX0FTU09DCisgICAgX1NDX0xFVkVMM19DQUNIRV9MSU5FU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMM19DQUNIRV9MSU5FU0laRQlfU0NfTEVWRUwzX0NBQ0hFX0xJTkVTSVpFCisgICAgX1NDX0xFVkVMNF9DQUNIRV9TSVpFLAorI2RlZmluZSBfU0NfTEVWRUw0X0NBQ0hFX1NJWkUJCV9TQ19MRVZFTDRfQ0FDSEVfU0laRQorICAgIF9TQ19MRVZFTDRfQ0FDSEVfQVNTT0MsCisjZGVmaW5lIF9TQ19MRVZFTDRfQ0FDSEVfQVNTT0MJCV9TQ19MRVZFTDRfQ0FDSEVfQVNTT0MKKyAgICBfU0NfTEVWRUw0X0NBQ0hFX0xJTkVTSVpFLAorI2RlZmluZSBfU0NfTEVWRUw0X0NBQ0hFX0xJTkVTSVpFCV9TQ19MRVZFTDRfQ0FDSEVfTElORVNJWkUKKyAgICAvKiBMZWF2ZSByb29tIGhlcmUsIG1heWJlIHdlIG5lZWQgYSBmZXcgbW9yZSBjYWNoZSBsZXZlbHMgc29tZSBkYXkuICAqLworCisgICAgX1NDX0lQVjYgPSBfU0NfTEVWRUwxX0lDQUNIRV9TSVpFICsgNTAsCisjZGVmaW5lIF9TQ19JUFY2CQkJX1NDX0lQVjYKKyAgICBfU0NfUkFXX1NPQ0tFVFMsCisjZGVmaW5lIF9TQ19SQVdfU09DS0VUUwkJCV9TQ19SQVdfU09DS0VUUworCisgICAgX1NDX1Y3X0lMUDMyX09GRjMyLAorI2RlZmluZSBfU0NfVjdfSUxQMzJfT0ZGMzIJCV9TQ19WN19JTFAzMl9PRkYzMgorICAgIF9TQ19WN19JTFAzMl9PRkZCSUcsCisjZGVmaW5lIF9TQ19WN19JTFAzMl9PRkZCSUcJCV9TQ19WN19JTFAzMl9PRkZCSUcKKyAgICBfU0NfVjdfTFA2NF9PRkY2NCwKKyNkZWZpbmUgX1NDX1Y3X0xQNjRfT0ZGNjQJCV9TQ19WN19MUDY0X09GRjY0CisgICAgX1NDX1Y3X0xQQklHX09GRkJJRywKKyNkZWZpbmUgX1NDX1Y3X0xQQklHX09GRkJJRwkJX1NDX1Y3X0xQQklHX09GRkJJRworCisgICAgX1NDX1NTX1JFUExfTUFYLAorI2RlZmluZSBfU0NfU1NfUkVQTF9NQVgJCQlfU0NfU1NfUkVQTF9NQVgKKworICAgIF9TQ19UUkFDRV9FVkVOVF9OQU1FX01BWCwKKyNkZWZpbmUgX1NDX1RSQUNFX0VWRU5UX05BTUVfTUFYCV9TQ19UUkFDRV9FVkVOVF9OQU1FX01BWAorICAgIF9TQ19UUkFDRV9OQU1FX01BWCwKKyNkZWZpbmUgX1NDX1RSQUNFX05BTUVfTUFYCQlfU0NfVFJBQ0VfTkFNRV9NQVgKKyAgICBfU0NfVFJBQ0VfU1lTX01BWCwKKyNkZWZpbmUgX1NDX1RSQUNFX1NZU19NQVgJCV9TQ19UUkFDRV9TWVNfTUFYCisgICAgX1NDX1RSQUNFX1VTRVJfRVZFTlRfTUFYLAorI2RlZmluZSBfU0NfVFJBQ0VfVVNFUl9FVkVOVF9NQVgJX1NDX1RSQUNFX1VTRVJfRVZFTlRfTUFYCisKKyAgICBfU0NfWE9QRU5fU1RSRUFNUywKKyNkZWZpbmUgX1NDX1hPUEVOX1NUUkVBTVMJCV9TQ19YT1BFTl9TVFJFQU1TCisKKyAgICBfU0NfVEhSRUFEX1JPQlVTVF9QUklPX0lOSEVSSVQsCisjZGVmaW5lIF9TQ19USFJFQURfUk9CVVNUX1BSSU9fSU5IRVJJVAlfU0NfVEhSRUFEX1JPQlVTVF9QUklPX0lOSEVSSVQKKyAgICBfU0NfVEhSRUFEX1JPQlVTVF9QUklPX1BST1RFQ1QKKyNkZWZpbmUgX1NDX1RIUkVBRF9ST0JVU1RfUFJJT19QUk9URUNUCV9TQ19USFJFQURfUk9CVVNUX1BSSU9fUFJPVEVDVAorICB9OworCisvKiBWYWx1ZXMgZm9yIHRoZSBOQU1FIGFyZ3VtZW50IHRvIGBjb25mc3RyJy4gICovCitlbnVtCisgIHsKKyAgICBfQ1NfUEFUSCwJCQkvKiBUaGUgZGVmYXVsdCBzZWFyY2ggcGF0aC4gICovCisjZGVmaW5lIF9DU19QQVRICQlfQ1NfUEFUSAorCisgICAgX0NTX1Y2X1dJRFRIX1JFU1RSSUNURURfRU5WUywKKyNkZWZpbmUgX0NTX1Y2X1dJRFRIX1JFU1RSSUNURURfRU5WUwlfQ1NfVjZfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCisjZGVmaW5lIF9DU19QT1NJWF9WNl9XSURUSF9SRVNUUklDVEVEX0VOVlMJX0NTX1Y2X1dJRFRIX1JFU1RSSUNURURfRU5WUworCisgICAgX0NTX0dOVV9MSUJDX1ZFUlNJT04sCisjZGVmaW5lIF9DU19HTlVfTElCQ19WRVJTSU9OCV9DU19HTlVfTElCQ19WRVJTSU9OCisgICAgX0NTX0dOVV9MSUJQVEhSRUFEX1ZFUlNJT04sCisjZGVmaW5lIF9DU19HTlVfTElCUFRIUkVBRF9WRVJTSU9OCV9DU19HTlVfTElCUFRIUkVBRF9WRVJTSU9OCisKKyAgICBfQ1NfVjVfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTLAorI2RlZmluZSBfQ1NfVjVfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCV9DU19WNV9XSURUSF9SRVNUUklDVEVEX0VOVlMKKyNkZWZpbmUgX0NTX1BPU0lYX1Y1X1dJRFRIX1JFU1RSSUNURURfRU5WUwlfQ1NfVjVfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCisKKyAgICBfQ1NfVjdfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTLAorI2RlZmluZSBfQ1NfVjdfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCV9DU19WN19XSURUSF9SRVNUUklDVEVEX0VOVlMKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X1dJRFRIX1JFU1RSSUNURURfRU5WUwlfQ1NfVjdfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCisKKyAgICBfQ1NfTEZTX0NGTEFHUyA9IDEwMDAsCisjZGVmaW5lIF9DU19MRlNfQ0ZMQUdTCV9DU19MRlNfQ0ZMQUdTCisgICAgX0NTX0xGU19MREZMQUdTLAorI2RlZmluZSBfQ1NfTEZTX0xERkxBR1MJX0NTX0xGU19MREZMQUdTCisgICAgX0NTX0xGU19MSUJTLAorI2RlZmluZSBfQ1NfTEZTX0xJQlMJCV9DU19MRlNfTElCUworICAgIF9DU19MRlNfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfTEZTX0xJTlRGTEFHUwlfQ1NfTEZTX0xJTlRGTEFHUworICAgIF9DU19MRlM2NF9DRkxBR1MsCisjZGVmaW5lIF9DU19MRlM2NF9DRkxBR1MJX0NTX0xGUzY0X0NGTEFHUworICAgIF9DU19MRlM2NF9MREZMQUdTLAorI2RlZmluZSBfQ1NfTEZTNjRfTERGTEFHUwlfQ1NfTEZTNjRfTERGTEFHUworICAgIF9DU19MRlM2NF9MSUJTLAorI2RlZmluZSBfQ1NfTEZTNjRfTElCUwlfQ1NfTEZTNjRfTElCUworICAgIF9DU19MRlM2NF9MSU5URkxBR1MsCisjZGVmaW5lIF9DU19MRlM2NF9MSU5URkxBR1MJX0NTX0xGUzY0X0xJTlRGTEFHUworCisgICAgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfQ0ZMQUdTID0gMTEwMCwKKyNkZWZpbmUgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfQ0ZMQUdTIF9DU19YQlM1X0lMUDMyX09GRjMyX0NGTEFHUworICAgIF9DU19YQlM1X0lMUDMyX09GRjMyX0xERkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRjMyX0xERkxBR1MgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTERGTEFHUworICAgIF9DU19YQlM1X0lMUDMyX09GRjMyX0xJQlMsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRjMyX0xJQlMgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTElCUworICAgIF9DU19YQlM1X0lMUDMyX09GRjMyX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTElOVEZMQUdTIF9DU19YQlM1X0lMUDMyX09GRjMyX0xJTlRGTEFHUworICAgIF9DU19YQlM1X0lMUDMyX09GRkJJR19DRkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRkJJR19DRkxBR1MgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0NGTEFHUworICAgIF9DU19YQlM1X0lMUDMyX09GRkJJR19MREZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTERGTEFHUyBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTERGTEFHUworICAgIF9DU19YQlM1X0lMUDMyX09GRkJJR19MSUJTLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTElCUyBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTElCUworICAgIF9DU19YQlM1X0lMUDMyX09GRkJJR19MSU5URkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRkJJR19MSU5URkxBR1MgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xJTlRGTEFHUworICAgIF9DU19YQlM1X0xQNjRfT0ZGNjRfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9MUDY0X09GRjY0X0NGTEFHUyBfQ1NfWEJTNV9MUDY0X09GRjY0X0NGTEFHUworICAgIF9DU19YQlM1X0xQNjRfT0ZGNjRfTERGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfTFA2NF9PRkY2NF9MREZMQUdTIF9DU19YQlM1X0xQNjRfT0ZGNjRfTERGTEFHUworICAgIF9DU19YQlM1X0xQNjRfT0ZGNjRfTElCUywKKyNkZWZpbmUgX0NTX1hCUzVfTFA2NF9PRkY2NF9MSUJTIF9DU19YQlM1X0xQNjRfT0ZGNjRfTElCUworICAgIF9DU19YQlM1X0xQNjRfT0ZGNjRfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9MUDY0X09GRjY0X0xJTlRGTEFHUyBfQ1NfWEJTNV9MUDY0X09GRjY0X0xJTlRGTEFHUworICAgIF9DU19YQlM1X0xQQklHX09GRkJJR19DRkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0xQQklHX09GRkJJR19DRkxBR1MgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0NGTEFHUworICAgIF9DU19YQlM1X0xQQklHX09GRkJJR19MREZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTERGTEFHUyBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTERGTEFHUworICAgIF9DU19YQlM1X0xQQklHX09GRkJJR19MSUJTLAorI2RlZmluZSBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTElCUyBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTElCUworICAgIF9DU19YQlM1X0xQQklHX09GRkJJR19MSU5URkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0xQQklHX09GRkJJR19MSU5URkxBR1MgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUworCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0NGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0NGTEFHUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xERkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MREZMQUdTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xJQlMsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MSUJTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MSUJTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xJTlRGTEFHUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTElOVEZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19DRkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfQ0ZMQUdTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MREZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0xERkxBR1MgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MSUJTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0xJQlMgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MSUJTCisgICAgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MSU5URkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTElOVEZMQUdTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTElOVEZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9DRkxBR1MgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTERGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTERGTEFHUyBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTElCUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTElCUyBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9MSUJTCisgICAgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9MSU5URkxBR1MgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTElOVEZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19DRkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfQ0ZMQUdTIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MREZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xERkxBR1MgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MSUJTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xJQlMgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MSUJTCisgICAgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MSU5URkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTElOVEZMQUdTIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTElOVEZMQUdTCisKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfQ0ZMQUdTIF9DU19QT1NJWF9WN19JTFAzMl9PRkYzMl9DRkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfTERGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xERkxBR1MgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xERkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfTElCUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xJQlMgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xJQlMKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfTElOVEZMQUdTIF9DU19QT1NJWF9WN19JTFAzMl9PRkYzMl9MSU5URkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0NGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19DRkxBR1MgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19DRkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xERkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19JTFAzMl9PRkZCSUdfTERGTEFHUyBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xERkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xJQlMsCisjZGVmaW5lIF9DU19QT1NJWF9WN19JTFAzMl9PRkZCSUdfTElCUyBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xJQlMKKyAgICBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MSU5URkxBR1MgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MSU5URkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9DRkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19MUDY0X09GRjY0X0NGTEFHUyBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9DRkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MREZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MREZMQUdTIF9DU19QT1NJWF9WN19MUDY0X09GRjY0X0xERkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MSUJTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MSUJTIF9DU19QT1NJWF9WN19MUDY0X09GRjY0X0xJQlMKKyAgICBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MSU5URkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19MUDY0X09GRjY0X0xJTlRGTEFHUyBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MSU5URkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0NGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19DRkxBR1MgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19DRkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xERkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19MUEJJR19PRkZCSUdfTERGTEFHUyBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xERkxBR1MKKyAgICBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xJQlMsCisjZGVmaW5lIF9DU19QT1NJWF9WN19MUEJJR19PRkZCSUdfTElCUyBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xJQlMKKyAgICBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MSU5URkxBR1MgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MSU5URkxBR1MKKworICAgIF9DU19WNl9FTlYsCisjZGVmaW5lIF9DU19WNl9FTlYJCQlfQ1NfVjZfRU5WCisgICAgX0NTX1Y3X0VOVgorI2RlZmluZSBfQ1NfVjdfRU5WCQkJX0NTX1Y3X0VOVgorICB9OwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZGlyZW50LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9kaXJlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc5NGIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZGlyZW50LmgKQEAgLTAsMCArMSw1MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ESVJFTlRfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2RpcmVudC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8ZGlyZW50Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKK3N0cnVjdCBkaXJlbnQKKyAgeworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19pbm9fdCBkX2lubzsKKyAgICBfX29mZl90IGRfb2ZmOworI2Vsc2UKKyAgICBfX2lubzY0X3QgZF9pbm87CisgICAgX19vZmY2NF90IGRfb2ZmOworI2VuZGlmCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGRfcmVjbGVuOworICAgIHVuc2lnbmVkIGNoYXIgZF90eXBlOworICAgIGNoYXIgZF9uYW1lWzI1Nl07CQkvKiBXZSBtdXN0IG5vdCBpbmNsdWRlIGxpbWl0cy5oISAqLworICB9OworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3N0cnVjdCBkaXJlbnQ2NAorICB7CisgICAgX19pbm82NF90IGRfaW5vOworICAgIF9fb2ZmNjRfdCBkX29mZjsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgZF9yZWNsZW47CisgICAgdW5zaWduZWQgY2hhciBkX3R5cGU7CisgICAgY2hhciBkX25hbWVbMjU2XTsJCS8qIFdlIG11c3Qgbm90IGluY2x1ZGUgbGltaXRzLmghICovCisgIH07CisjZW5kaWYKKworI2RlZmluZSBkX2ZpbGVubwlkX2lubwkvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gICovCisKKyN1bmRlZiAgX0RJUkVOVF9IQVZFX0RfTkFNTEVOCisjZGVmaW5lIF9ESVJFTlRfSEFWRV9EX1JFQ0xFTgorI2RlZmluZSBfRElSRU5UX0hBVkVfRF9PRkYKKyNkZWZpbmUgX0RJUkVOVF9IQVZFX0RfVFlQRQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZGxmY24uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2RsZmNuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmZDk2YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2RsZmNuLmgKQEAgLTAsMCArMSw2NSBAQAorLyogU3lzdGVtIGRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgcnVuLXRpbWUgZHluYW1pYyBsb2FkaW5nLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDEsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0RMRkNOX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9kbGZjbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8ZGxmY24uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogVGhlIE1PREUgYXJndW1lbnQgdG8gYGRsb3BlbicgY29udGFpbnMgb25lIG9mIHRoZSBmb2xsb3dpbmc6ICovCisjZGVmaW5lIFJUTERfTEFaWQkweDAwMDAxCS8qIExhenkgZnVuY3Rpb24gY2FsbCBiaW5kaW5nLiAgKi8KKyNkZWZpbmUgUlRMRF9OT1cJMHgwMDAwMgkvKiBJbW1lZGlhdGUgZnVuY3Rpb24gY2FsbCBiaW5kaW5nLiAgKi8KKyNkZWZpbmUJUlRMRF9CSU5ESU5HX01BU0sgICAweDMJLyogTWFzayBvZiBiaW5kaW5nIHRpbWUgdmFsdWUuICAqLworI2RlZmluZSBSVExEX05PTE9BRAkweDAwMDA0CS8qIERvIG5vdCBsb2FkIHRoZSBvYmplY3QuICAqLworI2RlZmluZSBSVExEX0RFRVBCSU5ECTB4MDAwMDgJLyogVXNlIGRlZXAgYmluZGluZy4gICovCisKKy8qIElmIHRoZSBmb2xsb3dpbmcgYml0IGlzIHNldCBpbiB0aGUgTU9ERSBhcmd1bWVudCB0byBgZGxvcGVuJywKKyAgIHRoZSBzeW1ib2xzIG9mIHRoZSBsb2FkZWQgb2JqZWN0IGFuZCBpdHMgZGVwZW5kZW5jaWVzIGFyZSBtYWRlCisgICB2aXNpYmxlIGFzIGlmIHRoZSBvYmplY3Qgd2VyZSBsaW5rZWQgZGlyZWN0bHkgaW50byB0aGUgcHJvZ3JhbS4gICovCisjZGVmaW5lIFJUTERfR0xPQkFMCTB4MDAxMDAKKworLyogVW5peDk4IGRlbWFuZHMgdGhlIGZvbGxvd2luZyBmbGFnIHdoaWNoIGlzIHRoZSBpbnZlcnNlIHRvIFJUTERfR0xPQkFMLgorICAgVGhlIGltcGxlbWVudGF0aW9uIGRvZXMgdGhpcyBieSBkZWZhdWx0IGFuZCBzbyB3ZSBjYW4gZGVmaW5lIHRoZQorICAgdmFsdWUgdG8gemVyby4gICovCisjZGVmaW5lIFJUTERfTE9DQUwJMAorCisvKiBEbyBub3QgZGVsZXRlIG9iamVjdCB3aGVuIGNsb3NlZC4gICovCisjZGVmaW5lIFJUTERfTk9ERUxFVEUJMHgwMTAwMAorCisjaWZkZWYgX19VU0VfR05VCisvKiBUbyBzdXBwb3J0IHByb2ZpbGluZyBvZiBzaGFyZWQgb2JqZWN0cyBpdCBpcyBhIGdvb2QgaWRlYSB0byBjYWxsCisgICB0aGUgZnVuY3Rpb24gZm91bmQgdXNpbmcgYGRsc3ltJyB1c2luZyB0aGUgZm9sbG93aW5nIG1hY3JvIHNpbmNlCisgICB0aGVzZSBjYWxscyBkbyBub3QgdXNlIHRoZSBQTFQuICBCdXQgdGhpcyB3b3VsZCBtZWFuIHRoZSBkeW5hbWljCisgICBsb2FkZXIgaGFzIG5vIGNoYW5jZSB0byBmaW5kIG91dCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuICBUaGUKKyAgIG1hY3JvIGFwcGxpZXMgdGhlIG5lY2Vzc2FyeSBtYWdpYyBzbyB0aGF0IHByb2ZpbGluZyBpcyBwb3NzaWJsZS4KKyAgIFJld3JpdGUKKwlmb28gPSAoKmZjdHApIChhcmcxLCBhcmcyKTsKKyAgIGludG8KKyAgICAgICAgZm9vID0gRExfQ0FMTF9GQ1QgKGZjdHAsIChhcmcxLCBhcmcyKSk7CisqLworIyBkZWZpbmUgRExfQ0FMTF9GQ1QoZmN0cCwgYXJncykgXAorICAoX2RsX21jb3VudF93cmFwcGVyX2NoZWNrICgodm9pZCAqKSAoZmN0cCkpLCAoKihmY3RwKSkgYXJncykKKworX19CRUdJTl9ERUNMUworCisvKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBwcm9maWxpbmcgZnVuY3Rpb25zLiAgKi8KK2V4dGVybiB2b2lkIF9kbF9tY291bnRfd3JhcHBlcl9jaGVjayAodm9pZCAqX19zZWxmcGMpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZWxmY2xhc3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2VsZmNsYXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwMjI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2VsZmNsYXNzLmgKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBmaWxlIHNwZWNpZmllcyB0aGUgbmF0aXZlIHdvcmQgc2l6ZSBvZiB0aGUgbWFjaGluZSwgd2hpY2ggaW5kaWNhdGVzCisgICB0aGUgRUxGIGZpbGUgY2xhc3MgdXNlZCBmb3IgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZCBvYmplY3RzIG9uIHRoaXMKKyAgIG1hY2hpbmUuICAqLworCisjaWZuZGVmIF9MSU5LX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9lbGZjbGFzcy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bGluay5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjZGVmaW5lIF9fRUxGX05BVElWRV9DTEFTUyBfX1dPUkRTSVpFCisKKy8qIFRoZSBlbnRyaWVzIGluIHRoZSAuaGFzaCB0YWJsZSBhbHdheXMgaGF2ZSBhIHNpemUgb2YgMzIgYml0cy4gICovCit0eXBlZGVmIHVpbnQzMl90IEVsZl9TeW1uZHg7CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9lbmRpYW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNTllYWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9lbmRpYW4uaApAQCAtMCwwICsxLDcgQEAKKy8qIHg4Nl82NCBpcyBsaXR0bGUtZW5kaWFuLiAgKi8KKworI2lmbmRlZiBfRU5ESUFOX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9lbmRpYW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGVuZGlhbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjZGVmaW5lIF9fQllURV9PUkRFUiBfX0xJVFRMRV9FTkRJQU4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2Vudmlyb25tZW50cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZW52aXJvbm1lbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3NWVjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2Vudmlyb25tZW50cy5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMSwgMjAwNCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfVU5JU1REX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiAgVXNlIDx1bmlzdGQuaD4gaW5zdGVhZCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisvKiBUaGlzIGhlYWRlciBzaG91bGQgZGVmaW5lIHRoZSBmb2xsb3dpbmcgc3ltYm9scyB1bmRlciB0aGUgZGVzY3JpYmVkCisgICBzaXR1YXRpb25zLiAgQSB2YWx1ZSBgMScgbWVhbnMgdGhhdCB0aGUgbW9kZWwgaXMgYWx3YXlzIHN1cHBvcnRlZCwKKyAgIGAtMScgbWVhbnMgaXQgaXMgbmV2ZXIgc3VwcG9ydGVkLiAgVW5kZWZpbmVkIG1lYW5zIGl0IGNhbm5vdCBiZQorICAgc3RhdGljYWxseSBkZWNpZGVkLgorCisgICBfUE9TSVhfVjdfSUxQMzJfT0ZGMzIgICAzMmJpdCBpbnQsIGxvbmcsIHBvaW50ZXJzLCBhbmQgb2ZmX3QgdHlwZQorICAgX1BPU0lYX1Y3X0lMUDMyX09GRkJJRyAgMzJiaXQgaW50LCBsb25nLCBhbmQgcG9pbnRlcnMgYW5kIGxhcmdlciBvZmZfdCB0eXBlCisKKyAgIF9QT1NJWF9WN19MUDY0X09GRjMyCSAgIDY0Yml0IGxvbmcgYW5kIHBvaW50ZXJzIGFuZCAzMmJpdCBvZmZfdCB0eXBlCisgICBfUE9TSVhfVjdfTFBCSUdfT0ZGQklHICA2NGJpdCBsb25nIGFuZCBwb2ludGVycyBhbmQgbGFyZ2Ugb2ZmX3QgdHlwZQorCisgICBUaGUgbWFjcm9zIF9QT1NJWF9WNl9JTFAzMl9PRkYzMiwgX1BPU0lYX1Y2X0lMUDMyX09GRkJJRywKKyAgIF9QT1NJWF9WNl9MUDY0X09GRjMyLCBfUE9TSVhfVjZfTFBCSUdfT0ZGQklHLCBfWEJTNV9JTFAzMl9PRkYzMiwKKyAgIF9YQlM1X0lMUDMyX09GRkJJRywgX1hCUzVfTFA2NF9PRkYzMiwgYW5kIF9YQlM1X0xQQklHX09GRkJJRyB3ZXJlCisgICB1c2VkIGluIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBVbml4IHN0YW5kYXJkIGFuZCBhcmUgYXZhaWxhYmxlCisgICBvbmx5IGZvciBjb21wYXRpYmlsaXR5LgorKi8KKworI2lmIF9fV09SRFNJWkUgPT0gNjQKKworLyogRW52aXJvbm1lbnRzIHdpdGggMzItYml0IHdpZGUgcG9pbnRlcnMgYXJlIG9wdGlvbmFsbHkgcHJvdmlkZWQuCisgICBUaGVyZWZvcmUgZm9sbG93aW5nIG1hY3JvcyBhcmVuJ3QgZGVmaW5lZDoKKyAgICMgdW5kZWYgX1BPU0lYX1Y3X0lMUDMyX09GRjMyCisgICAjIHVuZGVmIF9QT1NJWF9WN19JTFAzMl9PRkZCSUcKKyAgICMgdW5kZWYgX1BPU0lYX1Y2X0lMUDMyX09GRjMyCisgICAjIHVuZGVmIF9QT1NJWF9WNl9JTFAzMl9PRkZCSUcKKyAgICMgdW5kZWYgX1hCUzVfSUxQMzJfT0ZGMzIKKyAgICMgdW5kZWYgX1hCUzVfSUxQMzJfT0ZGQklHCisgICBhbmQgdXNlcnMgbmVlZCB0byBjaGVjayBhdCBydW50aW1lLiAgKi8KKworLyogV2UgYWxzbyBoYXZlIG5vIHVzZSAoZm9yIG5vdykgZm9yIGFuIGVudmlyb25tZW50IHdpdGggYmlnZ2VyIHBvaW50ZXJzCisgICBhbmQgb2Zmc2V0cy4gICovCisjIGRlZmluZSBfUE9TSVhfVjdfTFBCSUdfT0ZGQklHCS0xCisjIGRlZmluZSBfUE9TSVhfVjZfTFBCSUdfT0ZGQklHCS0xCisjIGRlZmluZSBfWEJTNV9MUEJJR19PRkZCSUcJLTEKKworLyogQnkgZGVmYXVsdCB3ZSBoYXZlIDY0LWJpdCB3aWRlIGBsb25nIGludCcsIHBvaW50ZXJzIGFuZCBgb2ZmX3QnLiAgKi8KKyMgZGVmaW5lIF9QT1NJWF9WN19MUDY0X09GRjY0CTEKKyMgZGVmaW5lIF9QT1NJWF9WNl9MUDY0X09GRjY0CTEKKyMgZGVmaW5lIF9YQlM1X0xQNjRfT0ZGNjQJMQorCisjZWxzZSAvKiBfX1dPUkRTSVpFID09IDMyICovCisKKy8qIEJ5IGRlZmF1bHQgd2UgaGF2ZSAzMi1iaXQgd2lkZSBgaW50JywgYGxvbmcgaW50JywgcG9pbnRlcnMgYW5kIGBvZmZfdCcKKyAgIGFuZCBhbGwgcGxhdGZvcm1zIHN1cHBvcnQgTEZTLiAgKi8KKyMgZGVmaW5lIF9QT1NJWF9WN19JTFAzMl9PRkYzMgkxCisjIGRlZmluZSBfUE9TSVhfVjdfSUxQMzJfT0ZGQklHCTEKKyMgZGVmaW5lIF9QT1NJWF9WNl9JTFAzMl9PRkYzMgkxCisjIGRlZmluZSBfUE9TSVhfVjZfSUxQMzJfT0ZGQklHCTEKKyMgZGVmaW5lIF9YQlM1X0lMUDMyX09GRjMyCTEKKyMgZGVmaW5lIF9YQlM1X0lMUDMyX09GRkJJRwkxCisKKy8qIFdlIG9wdGlvbmFsbHkgcHJvdmlkZSBhbiBlbnZpcm9ubWVudCB3aXRoIHRoZSBhYm92ZSBzaXplIGJ1dCBhbiA2NC1iaXQKKyAgIHNpZGUgYG9mZl90Jy4gIFRoZXJlZm9yZSB3ZSBkb24ndCBkZWZpbmUgX1BPU0lYX1Y3X0lMUDMyX09GRkJJRy4gICovCisKKy8qIEVudmlyb25tZW50cyB3aXRoIDY0LWJpdCB3aWRlIHBvaW50ZXJzIGNhbiBiZSBwcm92aWRlZCwKKyAgIHNvIHRoZXNlIG1hY3JvcyBhcmVuJ3QgZGVmaW5lZDoKKyAgICMgdW5kZWYgX1BPU0lYX1Y3X0xQNjRfT0ZGNjQKKyAgICMgdW5kZWYgX1BPU0lYX1Y3X0xQQklHX09GRkJJRworICAgIyB1bmRlZiBfUE9TSVhfVjZfTFA2NF9PRkY2NAorICAgIyB1bmRlZiBfUE9TSVhfVjZfTFBCSUdfT0ZGQklHCisgICAjIHVuZGVmIF9YQlM1X0xQNjRfT0ZGNjQKKyAgICMgdW5kZWYgX1hCUzVfTFBCSUdfT0ZGQklHCisgICBhbmQgc3lzY29uZiB0ZXN0cyBmb3IgaXQgYXQgcnVudGltZS4gICovCisKKyNlbmRpZiAvKiBfX1dPUkRTSVpFID09IDMyICovCisKKyNkZWZpbmUgX19JTFAzMl9PRkYzMl9DRkxBR1MJIi1tMzIiCisjZGVmaW5lIF9fSUxQMzJfT0ZGQklHX0NGTEFHUwkiLW0zMiAtRF9MQVJHRUZJTEVfU09VUkNFIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiCisjZGVmaW5lIF9fSUxQMzJfT0ZGMzJfTERGTEFHUwkiLW0zMiIKKyNkZWZpbmUgX19JTFAzMl9PRkZCSUdfTERGTEFHUwkiLW0zMiIKKyNkZWZpbmUgX19MUDY0X09GRjY0X0NGTEFHUwkiLW02NCIKKyNkZWZpbmUgX19MUDY0X09GRjY0X0xERkxBR1MJIi1tNjQiCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9lcnJuby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjNkN2FmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZXJybm8uaApAQCAtMCwwICsxLDYzIEBACisvKiBFcnJvciBjb25zdGFudHMuICBMaW51eCBzcGVjaWZpYyB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTksIDIwMDUsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZmRlZiBfRVJSTk9fSAorCisjIHVuZGVmIEVET00KKyMgdW5kZWYgRUlMU0VRCisjIHVuZGVmIEVSQU5HRQorIyBpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisvKiBMaW51eCBoYXMgbm8gRU5PVFNVUCBlcnJvciBjb2RlLiAgKi8KKyMgZGVmaW5lIEVOT1RTVVAgRU9QTk9UU1VQUAorCisvKiBPbGRlciBMaW51eCB2ZXJzaW9ucyBhbHNvIGhhZCBubyBFQ0FOQ0VMRUQgZXJyb3IgY29kZS4gICovCisjIGlmbmRlZiBFQ0FOQ0VMRUQKKyMgIGRlZmluZSBFQ0FOQ0VMRUQJMTI1CisjIGVuZGlmCisKKy8qIFN1cHBvcnQgZm9yIGVycm9yIGNvZGVzIHRvIHN1cHBvcnQgcm9idXN0IG11dGV4ZXMgd2FzIGFkZGVkIGxhdGVyLCB0b28uICAqLworIyBpZm5kZWYgRU9XTkVSREVBRAorIyAgZGVmaW5lIEVPV05FUkRFQUQJCTEzMAorIyAgZGVmaW5lIEVOT1RSRUNPVkVSQUJMRQkxMzEKKyMgZW5kaWYKKworIyBpZm5kZWYgRVJGS0lMTAorIyAgZGVmaW5lIEVSRktJTEwJCTEzMgorIyBlbmRpZgorCisjIGlmbmRlZiBfX0FTU0VNQkxFUl9fCisvKiBGdW5jdGlvbiB0byBnZXQgYWRkcmVzcyBvZiBnbG9iYWwgYGVycm5vJyB2YXJpYWJsZS4gICovCitleHRlcm4gaW50ICpfX2Vycm5vX2xvY2F0aW9uICh2b2lkKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworIyAgaWYgIWRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBfTElCQ19SRUVOVFJBTlQKKy8qIFdoZW4gdXNpbmcgdGhyZWFkcywgZXJybm8gaXMgYSBwZXItdGhyZWFkIHZhbHVlLiAgKi8KKyMgICBkZWZpbmUgZXJybm8gKCpfX2Vycm5vX2xvY2F0aW9uICgpKQorIyAgZW5kaWYKKyMgZW5kaWYgLyogIV9fQVNTRU1CTEVSX18gKi8KKyNlbmRpZiAvKiBfRVJSTk9fSCAqLworCisjaWYgIWRlZmluZWQgX0VSUk5PX0ggJiYgZGVmaW5lZCBfX25lZWRfRW1hdGgKKy8qIFRoaXMgaXMgdWdseSBidXQgdGhlIGtlcm5lbCBoZWFkZXIgaXMgbm90IGNsZWFuIGVub3VnaC4gIFdlIG11c3QKKyAgIGRlZmluZSBvbmx5IHRoZSB2YWx1ZXMgRURPTSwgRUlMU0VRIGFuZCBFUkFOR0UgaW4gY2FzZSBfX25lZWRfRW1hdGggaXMKKyAgIGRlZmluZWQuICAqLworIyBkZWZpbmUgRURPTQkzMwkvKiBNYXRoIGFyZ3VtZW50IG91dCBvZiBkb21haW4gb2YgZnVuY3Rpb24uICAqLworIyBkZWZpbmUgRUlMU0VRCTg0CS8qIElsbGVnYWwgYnl0ZSBzZXF1ZW5jZS4gICovCisjIGRlZmluZSBFUkFOR0UJMzQJLyogTWF0aCByZXN1bHQgbm90IHJlcHJlc2VudGFibGUuICAqLworI2VuZGlmIC8qICFfRVJSTk9fSCAmJiBfX25lZWRfRW1hdGggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2Vycm9yLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OWEzZjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9lcnJvci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIFNwZWNpYWxpemF0aW9ucyBmb3IgZXJyb3IgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9FUlJPUl9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL2Vycm9yLmg+IGRpcmVjdGx5OyB1c2UgPGVycm9yLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworZXh0ZXJuIHZvaWQgX19SRURJUkVDVCAoX19lcnJvcl9hbGlhcywgKGludCBfX3N0YXR1cywgaW50IF9fZXJybnVtLAorCQkJCQlfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pLAorCQkJZXJyb3IpCisgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOworZXh0ZXJuIHZvaWQgX19SRURJUkVDVCAoX19lcnJvcl9ub3JldHVybiwgKGludCBfX3N0YXR1cywgaW50IF9fZXJybnVtLAorCQkJCQkgICBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pLAorCQkJZXJyb3IpCisgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18sIF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSk7CisKKworLyogSWYgd2Uga25vdyB0aGUgZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gbWFrZSBzdXJlIHRoZSBjb21waWxlcgorICAgcmVhbGl6ZXMgdGhhdCwgdG9vLiAgKi8KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZAorZXJyb3IgKGludCBfX3N0YXR1cywgaW50IF9fZXJybnVtLCBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pCit7CisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zdGF0dXMpICYmIF9fc3RhdHVzICE9IDApCisgICAgX19lcnJvcl9ub3JldHVybiAoX19zdGF0dXMsIF9fZXJybnVtLCBfX2Zvcm1hdCwgX192YV9hcmdfcGFjayAoKSk7CisgIGVsc2UKKyAgICBfX2Vycm9yX2FsaWFzIChfX3N0YXR1cywgX19lcnJudW0sIF9fZm9ybWF0LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworCitleHRlcm4gdm9pZCBfX1JFRElSRUNUIChfX2Vycm9yX2F0X2xpbmVfYWxpYXMsIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCQkJCV9fY29uc3QgY2hhciAqX19mbmFtZSwKKwkJCQkJCXVuc2lnbmVkIGludCBfX2xpbmUsCisJCQkJCQlfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pLAorCQkJZXJyb3JfYXRfbGluZSkKKyAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDUsIDYpKSk7CitleHRlcm4gdm9pZCBfX1JFRElSRUNUIChfX2Vycm9yX2F0X2xpbmVfbm9yZXR1cm4sIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCQkJCSAgIF9fY29uc3QgY2hhciAqX19mbmFtZSwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCBfX2xpbmUsCisJCQkJCQkgICBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LAorCQkJCQkJICAgLi4uKSwKKwkJCWVycm9yX2F0X2xpbmUpCisgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18sIF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDUsIDYpKSk7CisKKworLyogSWYgd2Uga25vdyB0aGUgZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gbWFrZSBzdXJlIHRoZSBjb21waWxlcgorICAgcmVhbGl6ZXMgdGhhdCwgdG9vLiAgKi8KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZAorZXJyb3JfYXRfbGluZSAoaW50IF9fc3RhdHVzLCBpbnQgX19lcnJudW0sIF9fY29uc3QgY2hhciAqX19mbmFtZSwKKwkgICAgICAgdW5zaWduZWQgaW50IF9fbGluZSxfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pCit7CisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zdGF0dXMpICYmIF9fc3RhdHVzICE9IDApCisgICAgX19lcnJvcl9hdF9saW5lX25vcmV0dXJuIChfX3N0YXR1cywgX19lcnJudW0sIF9fZm5hbWUsIF9fbGluZSwgX19mb3JtYXQsCisJCQkgICAgICBfX3ZhX2FyZ19wYWNrICgpKTsKKyAgZWxzZQorICAgIF9fZXJyb3JfYXRfbGluZV9hbGlhcyAoX19zdGF0dXMsIF9fZXJybnVtLCBfX2ZuYW1lLCBfX2xpbmUsCisJCQkgICBfX2Zvcm1hdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9mY250bC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZmNudGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWZjM2M2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZmNudGwuaApAQCAtMCwwICsxLDM1NSBAQAorLyogT18qLCBGXyosIEZEXyogYml0IHZhbHVlcyBmb3IgTGludXgveDg2LTY0LgorICAgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIsMjAwNCwyMDA2LDIwMDcsMjAwOSwyMDEwLDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9GQ05UTF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvZmNudGwuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGZjbnRsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisjaWZkZWYgX19VU0VfR05VCisjIGluY2x1ZGUgPGJpdHMvdWlvLmg+CisjZW5kaWYKKworCisvKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCisgICBsb2NhdGVkIG9uIGEgZmV3IGZpbGUgc3lzdGVtcy4gICovCisjZGVmaW5lIE9fQUNDTU9ERQkgICAwMDAzCisjZGVmaW5lIE9fUkRPTkxZCSAgICAgMDAKKyNkZWZpbmUgT19XUk9OTFkJICAgICAwMQorI2RlZmluZSBPX1JEV1IJCSAgICAgMDIKKyNkZWZpbmUgT19DUkVBVAkJICAgMDEwMAkvKiBub3QgZmNudGwgKi8KKyNkZWZpbmUgT19FWENMCQkgICAwMjAwCS8qIG5vdCBmY250bCAqLworI2RlZmluZSBPX05PQ1RUWQkgICAwNDAwCS8qIG5vdCBmY250bCAqLworI2RlZmluZSBPX1RSVU5DCQkgIDAxMDAwCS8qIG5vdCBmY250bCAqLworI2RlZmluZSBPX0FQUEVORAkgIDAyMDAwCisjZGVmaW5lIE9fTk9OQkxPQ0sJICAwNDAwMAorI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCisjZGVmaW5lIE9fU1lOQwkgICAgICAgMDQwMTAwMDAKKyNkZWZpbmUgT19GU1lOQwkJIE9fU1lOQworI2RlZmluZSBPX0FTWU5DCQkgMDIwMDAwCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorIyBkZWZpbmUgT19ESVJFQ1RPUlkJMDIwMDAwMAkvKiBNdXN0IGJlIGEgZGlyZWN0b3J5LgkgKi8KKyMgZGVmaW5lIE9fTk9GT0xMT1cJMDQwMDAwMAkvKiBEbyBub3QgZm9sbG93IGxpbmtzLgkgKi8KKyMgZGVmaW5lIE9fQ0xPRVhFQyAgICAgMDIwMDAwMDAgLyogU2V0IGNsb3NlX29uX2V4ZWMuICAqLworI2VuZGlmCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBPX0RJUkVDVAkgMDQwMDAwCS8qIERpcmVjdCBkaXNrIGFjY2Vzcy4JKi8KKyMgZGVmaW5lIE9fTk9BVElNRSAgICAgMDEwMDAwMDAgLyogRG8gbm90IHNldCBhdGltZS4gICovCisjIGRlZmluZSBPX1BBVEgJICAgICAgMDEwMDAwMDAwIC8qIFJlc29sdmUgcGF0aG5hbWUgYnV0IGRvIG5vdCBvcGVuIGZpbGUuICAqLworI2VuZGlmCisKKy8qIEZvciBub3cgTGludXggaGFzIHN5bmNocm9uaXNpdHkgb3B0aW9ucyBmb3IgZGF0YSBhbmQgcmVhZCBvcGVyYXRpb25zLgorICAgV2UgZGVmaW5lIHRoZSBzeW1ib2xzIGhlcmUgYnV0IGxldCB0aGVtIGRvIHRoZSBzYW1lIGFzIE9fU1lOQyBzaW5jZQorICAgdGhpcyBpcyBhIHN1cGVyc2V0LgkqLworI2lmIGRlZmluZWQgX19VU0VfUE9TSVgxOTkzMDkgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKKyMgZGVmaW5lIE9fRFNZTkMJMDEwMDAwCS8qIFN5bmNocm9uaXplIGRhdGEuICAqLworIyBkZWZpbmUgT19SU1lOQwlPX1NZTkMJLyogU3luY2hyb25pemUgcmVhZCBvcGVyYXRpb25zLgkgKi8KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIE9fTEFSR0VGSUxFCTAKKyMgZWxzZQorIyAgZGVmaW5lIE9fTEFSR0VGSUxFCTAxMDAwMDAKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBWYWx1ZXMgZm9yIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGZjbnRsJy4gICovCisjZGVmaW5lIEZfRFVQRkQJCTAJLyogRHVwbGljYXRlIGZpbGUgZGVzY3JpcHRvci4gICovCisjZGVmaW5lIEZfR0VURkQJCTEJLyogR2V0IGZpbGUgZGVzY3JpcHRvciBmbGFncy4gICovCisjZGVmaW5lIEZfU0VURkQJCTIJLyogU2V0IGZpbGUgZGVzY3JpcHRvciBmbGFncy4gICovCisjZGVmaW5lIEZfR0VURkwJCTMJLyogR2V0IGZpbGUgc3RhdHVzIGZsYWdzLiAgKi8KKyNkZWZpbmUgRl9TRVRGTAkJNAkvKiBTZXQgZmlsZSBzdGF0dXMgZmxhZ3MuICAqLworI2lmIF9fV09SRFNJWkUgPT0gNjQKKyMgZGVmaW5lIEZfR0VUTEsJNQkvKiBHZXQgcmVjb3JkIGxvY2tpbmcgaW5mby4gICovCisjIGRlZmluZSBGX1NFVExLCTYJLyogU2V0IHJlY29yZCBsb2NraW5nIGluZm8gKG5vbi1ibG9ja2luZykuICAqLworIyBkZWZpbmUgRl9TRVRMS1cJNwkvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAoYmxvY2tpbmcpLgkqLworLyogTm90IG5lY2Vzc2FyeSwgd2UgYWx3YXlzIGhhdmUgNjQtYml0IG9mZnNldHMuICAqLworIyBkZWZpbmUgRl9HRVRMSzY0CTUJLyogR2V0IHJlY29yZCBsb2NraW5nIGluZm8uICAqLworIyBkZWZpbmUgRl9TRVRMSzY0CTYJLyogU2V0IHJlY29yZCBsb2NraW5nIGluZm8gKG5vbi1ibG9ja2luZykuICAqLworIyBkZWZpbmUgRl9TRVRMS1c2NAk3CS8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChibG9ja2luZykuCSovCisjZWxzZQorIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorIyAgZGVmaW5lIEZfR0VUTEsJNQkvKiBHZXQgcmVjb3JkIGxvY2tpbmcgaW5mby4gICovCisjICBkZWZpbmUgRl9TRVRMSwk2CS8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChub24tYmxvY2tpbmcpLiAgKi8KKyMgIGRlZmluZSBGX1NFVExLVwk3CS8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChibG9ja2luZykuCSovCisjIGVsc2UKKyMgIGRlZmluZSBGX0dFVExLCUZfR0VUTEs2NCAgLyogR2V0IHJlY29yZCBsb2NraW5nIGluZm8uCSovCisjICBkZWZpbmUgRl9TRVRMSwlGX1NFVExLNjQgIC8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChub24tYmxvY2tpbmcpLiovCisjICBkZWZpbmUgRl9TRVRMS1cJRl9TRVRMS1c2NCAvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAoYmxvY2tpbmcpLiAgKi8KKyMgZW5kaWYKKyMgZGVmaW5lIEZfR0VUTEs2NAkxMgkvKiBHZXQgcmVjb3JkIGxvY2tpbmcgaW5mby4gICovCisjIGRlZmluZSBGX1NFVExLNjQJMTMJLyogU2V0IHJlY29yZCBsb2NraW5nIGluZm8gKG5vbi1ibG9ja2luZykuICAqLworIyBkZWZpbmUgRl9TRVRMS1c2NAkxNAkvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAoYmxvY2tpbmcpLgkqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisjIGRlZmluZSBGX1NFVE9XTgk4CS8qIEdldCBvd25lciAocHJvY2VzcyByZWNlaXZpbmcgU0lHSU8pLiAgKi8KKyMgZGVmaW5lIEZfR0VUT1dOCTkJLyogU2V0IG93bmVyIChwcm9jZXNzIHJlY2VpdmluZyBTSUdJTykuICAqLworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIEZfU0VUU0lHCTEwCS8qIFNldCBudW1iZXIgb2Ygc2lnbmFsIHRvIGJlIHNlbnQuICAqLworIyBkZWZpbmUgRl9HRVRTSUcJMTEJLyogR2V0IG51bWJlciBvZiBzaWduYWwgdG8gYmUgc2VudC4gICovCisjIGRlZmluZSBGX1NFVE9XTl9FWAkxNQkvKiBHZXQgb3duZXIgKHRocmVhZCByZWNlaXZpbmcgU0lHSU8pLiAgKi8KKyMgZGVmaW5lIEZfR0VUT1dOX0VYCTE2CS8qIFNldCBvd25lciAodGhyZWFkIHJlY2VpdmluZyBTSUdJTykuICAqLworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIEZfU0VUTEVBU0UJMTAyNAkvKiBTZXQgYSBsZWFzZS4JICovCisjIGRlZmluZSBGX0dFVExFQVNFCTEwMjUJLyogRW5xdWlyZSB3aGF0IGxlYXNlIGlzIGFjdGl2ZS4gICovCisjIGRlZmluZSBGX05PVElGWQkxMDI2CS8qIFJlcXVlc3Qgbm90ZmljYXRpb25zIG9uIGEgZGlyZWN0b3J5LgkgKi8KKyMgZGVmaW5lIEZfU0VUUElQRV9TWgkxMDMxCS8qIFNldCBwaXBlIHBhZ2Ugc2l6ZSBhcnJheS4gICovCisjIGRlZmluZSBGX0dFVFBJUEVfU1oJMTAzMgkvKiBTZXQgcGlwZSBwYWdlIHNpemUgYXJyYXkuICAqLworI2VuZGlmCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKyMgZGVmaW5lIEZfRFVQRkRfQ0xPRVhFQyAxMDMwCS8qIER1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3Igd2l0aAorCQkJCSAgIGNsb3NlLW9uLWV4aXQgc2V0LiAgKi8KKyNlbmRpZgorCisvKiBGb3IgRl9bR0VUfFNFVF1GRC4gICovCisjZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KKworLyogRm9yIHBvc2l4IGZjbnRsKCkgYW5kIGBsX3R5cGUnIGZpZWxkIG9mIGEgYHN0cnVjdCBmbG9jaycgZm9yIGxvY2tmKCkuICAqLworI2RlZmluZSBGX1JETENLCQkwCS8qIFJlYWQgbG9jay4gICovCisjZGVmaW5lIEZfV1JMQ0sJCTEJLyogV3JpdGUgbG9jay4JKi8KKyNkZWZpbmUgRl9VTkxDSwkJMgkvKiBSZW1vdmUgbG9jay4JICovCisKKy8qIEZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrKCkuICAqLworI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KKyNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIE9wZXJhdGlvbnMgZm9yIGJzZCBmbG9jaygpLCBhbHNvIHVzZWQgYnkgdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbi4JKi8KKyMgZGVmaW5lIExPQ0tfU0gJMQkvKiBzaGFyZWQgbG9jayAqLworIyBkZWZpbmUgTE9DS19FWAkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCisjIGRlZmluZSBMT0NLX05CCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAorCQkJCSAgIGJsb2NraW5nICovCisjIGRlZmluZSBMT0NLX1VOCTgJLyogcmVtb3ZlIGxvY2sgKi8KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jazoJKi8KKyMgZGVmaW5lIExPQ0tfUkVBRAk2NAkvKiAuLi4gd2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zLgkgKi8KKyMgZGVmaW5lIExPQ0tfV1JJVEUJMTI4CS8qIC4uLiB3aGljaCBhbGxvd3MgY29uY3VycmVudCB3cml0ZSBvcGVyYXRpb25zLiAgKi8KKyMgZGVmaW5lIExPQ0tfUlcJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BlcmF0aW9ucy4JICovCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVHlwZXMgb2YgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbnMgdGhhdCBtYXkgYmUgcmVxdWVzdGVkIHdpdGggRl9OT1RJRlkuICAqLworIyBkZWZpbmUgRE5fQUNDRVNTCTB4MDAwMDAwMDEJLyogRmlsZSBhY2Nlc3NlZC4gICovCisjIGRlZmluZSBETl9NT0RJRlkJMHgwMDAwMDAwMgkvKiBGaWxlIG1vZGlmaWVkLiAgKi8KKyMgZGVmaW5lIEROX0NSRUFURQkweDAwMDAwMDA0CS8qIEZpbGUgY3JlYXRlZC4gICovCisjIGRlZmluZSBETl9ERUxFVEUJMHgwMDAwMDAwOAkvKiBGaWxlIHJlbW92ZWQuICAqLworIyBkZWZpbmUgRE5fUkVOQU1FCTB4MDAwMDAwMTAJLyogRmlsZSByZW5hbWVkLiAgKi8KKyMgZGVmaW5lIEROX0FUVFJJQgkweDAwMDAwMDIwCS8qIEZpbGUgY2hhbmdlZCBhdHRpYnV0ZXMuICAqLworIyBkZWZpbmUgRE5fTVVMVElTSE9UCTB4ODAwMDAwMDAJLyogRG9uJ3QgcmVtb3ZlIG5vdGlmaWVyLiAgKi8KKyNlbmRpZgorCitzdHJ1Y3QgZmxvY2sKKyAgeworICAgIHNob3J0IGludCBsX3R5cGU7CS8qIFR5cGUgb2YgbG9jazogRl9SRExDSywgRl9XUkxDSywgb3IgRl9VTkxDSy4JKi8KKyAgICBzaG9ydCBpbnQgbF93aGVuY2U7CS8qIFdoZXJlIGBsX3N0YXJ0JyBpcyByZWxhdGl2ZSB0byAobGlrZSBgbHNlZWsnKS4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICBfX29mZl90IGxfc3RhcnQ7CS8qIE9mZnNldCB3aGVyZSB0aGUgbG9jayBiZWdpbnMuICAqLworICAgIF9fb2ZmX3QgbF9sZW47CS8qIFNpemUgb2YgdGhlIGxvY2tlZCBhcmVhOyB6ZXJvIG1lYW5zIHVudGlsIEVPRi4gICovCisjZWxzZQorICAgIF9fb2ZmNjRfdCBsX3N0YXJ0OwkvKiBPZmZzZXQgd2hlcmUgdGhlIGxvY2sgYmVnaW5zLiAgKi8KKyAgICBfX29mZjY0X3QgbF9sZW47CS8qIFNpemUgb2YgdGhlIGxvY2tlZCBhcmVhOyB6ZXJvIG1lYW5zIHVudGlsIEVPRi4gICovCisjZW5kaWYKKyAgICBfX3BpZF90IGxfcGlkOwkvKiBQcm9jZXNzIGhvbGRpbmcgdGhlIGxvY2suICAqLworICB9OworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3N0cnVjdCBmbG9jazY0CisgIHsKKyAgICBzaG9ydCBpbnQgbF90eXBlOwkvKiBUeXBlIG9mIGxvY2s6IEZfUkRMQ0ssIEZfV1JMQ0ssIG9yIEZfVU5MQ0suCSovCisgICAgc2hvcnQgaW50IGxfd2hlbmNlOwkvKiBXaGVyZSBgbF9zdGFydCcgaXMgcmVsYXRpdmUgdG8gKGxpa2UgYGxzZWVrJykuICAqLworICAgIF9fb2ZmNjRfdCBsX3N0YXJ0OwkvKiBPZmZzZXQgd2hlcmUgdGhlIGxvY2sgYmVnaW5zLiAgKi8KKyAgICBfX29mZjY0X3QgbF9sZW47CS8qIFNpemUgb2YgdGhlIGxvY2tlZCBhcmVhOyB6ZXJvIG1lYW5zIHVudGlsIEVPRi4gICovCisgICAgX19waWRfdCBsX3BpZDsJLyogUHJvY2VzcyBob2xkaW5nIHRoZSBsb2NrLiAgKi8KKyAgfTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBPd25lciB0eXBlcy4gICovCitlbnVtIF9fcGlkX3R5cGUKKyAgeworICAgIEZfT1dORVJfVElEID0gMCwJCS8qIEtlcm5lbCB0aHJlYWQuICAqLworICAgIEZfT1dORVJfUElELAkJLyogUHJvY2Vzcy4gICovCisgICAgRl9PV05FUl9QR1JQLAkJLyogUHJvY2VzcyBncm91cC4gICovCisgICAgRl9PV05FUl9HSUQgPSBGX09XTkVSX1BHUlAJLyogQWx0ZXJuYXRpdmUsIG9ic29sZXRlIG5hbWUuICAqLworICB9OworCisvKiBTdHJ1Y3R1cmUgdG8gdXNlIHdpdGggRl9HRVRPV05fRVggYW5kIEZfU0VUT1dOX0VYLiAgKi8KK3N0cnVjdCBmX293bmVyX2V4CisgIHsKKyAgICBlbnVtIF9fcGlkX3R5cGUgdHlwZTsJLyogT3duZXIgdHlwZSBvZiBJRC4gICovCisgICAgX19waWRfdCBwaWQ7CQkvKiBJRCBvZiBvd25lci4gICovCisgIH07CisjZW5kaWYKKworLyogRGVmaW5lIHNvbWUgbW9yZSBjb21wYXRpYmlsaXR5IG1hY3JvcyB0byBiZSBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGgKKyAgIEJTRCBzeXN0ZW1zIHdoaWNoIGRpZCBub3QgbWFuYWdlZCB0byBoaWRlIHRoZXNlIGtlcm5lbCBtYWNyb3MuICAqLworI2lmZGVmCV9fVVNFX0JTRAorIyBkZWZpbmUgRkFQUEVORAlPX0FQUEVORAorIyBkZWZpbmUgRkZTWU5DCQlPX0ZTWU5DCisjIGRlZmluZSBGQVNZTkMJCU9fQVNZTkMKKyMgZGVmaW5lIEZOT05CTE9DSwlPX05PTkJMT0NLCisjIGRlZmluZSBGTkRFTEFZCU9fTkRFTEFZCisjZW5kaWYgLyogVXNlIEJTRC4gICovCisKKy8qIEFkdmlzZSB0byBgcG9zaXhfZmFkdmlzZScuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIFBPU0lYX0ZBRFZfTk9STUFMCTAgLyogTm8gZnVydGhlciBzcGVjaWFsIHRyZWF0bWVudC4gICovCisjIGRlZmluZSBQT1NJWF9GQURWX1JBTkRPTQkxIC8qIEV4cGVjdCByYW5kb20gcGFnZSByZWZlcmVuY2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX0ZBRFZfU0VRVUVOVElBTAkyIC8qIEV4cGVjdCBzZXF1ZW50aWFsIHBhZ2UgcmVmZXJlbmNlcy4JICovCisjIGRlZmluZSBQT1NJWF9GQURWX1dJTExORUVECTMgLyogV2lsbCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX0ZBRFZfRE9OVE5FRUQJNCAvKiBEb24ndCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX0ZBRFZfTk9SRVVTRQk1IC8qIERhdGEgd2lsbCBiZSBhY2Nlc3NlZCBvbmNlLiAgKi8KKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEZsYWdzIGZvciBTWU5DX0ZJTEVfUkFOR0UuICAqLworIyBkZWZpbmUgU1lOQ19GSUxFX1JBTkdFX1dBSVRfQkVGT1JFCTEgLyogV2FpdCB1cG9uIHdyaXRlb3V0IG9mIGFsbCBwYWdlcworCQkJCQkgICAgIGluIHRoZSByYW5nZSBiZWZvcmUgcGVyZm9ybWluZyB0aGUKKwkJCQkJICAgICB3cml0ZS4gICovCisjIGRlZmluZSBTWU5DX0ZJTEVfUkFOR0VfV1JJVEUJCTIgLyogSW5pdGlhdGUgd3JpdGVvdXQgb2YgYWxsIHRob3NlCisJCQkJCSAgICAgZGlydHkgcGFnZXMgaW4gdGhlIHJhbmdlIHdoaWNoIGFyZQorCQkJCQkgICAgIG5vdCBwcmVzZW50bHkgdW5kZXIgd3JpdGViYWNrLiAgKi8KKyMgZGVmaW5lIFNZTkNfRklMRV9SQU5HRV9XQUlUX0FGVEVSCTQgLyogV2FpdCB1cG9uIHdyaXRlb3V0IG9mIGFsbCBwYWdlcyBpbgorCQkJCQkgICAgIHRoZSByYW5nZSBhZnRlciBwZXJmb3JtaW5nIHRoZQorCQkJCQkgICAgIHdyaXRlLiAgKi8KKworLyogRmxhZ3MgZm9yIFNQTElDRSBhbmQgVk1TUExJQ0UuICAqLworIyBkZWZpbmUgU1BMSUNFX0ZfTU9WRQkJMQkvKiBNb3ZlIHBhZ2VzIGluc3RlYWQgb2YgY29weWluZy4gICovCisjIGRlZmluZSBTUExJQ0VfRl9OT05CTE9DSwkyCS8qIERvbid0IGJsb2NrIG9uIHRoZSBwaXBlIHNwbGljaW5nCisJCQkJCSAgIChidXQgd2UgbWF5IHN0aWxsIGJsb2NrIG9uIHRoZSBmZAorCQkJCQkgICB3ZSBzcGxpY2UgZnJvbS90bykuICAqLworIyBkZWZpbmUgU1BMSUNFX0ZfTU9SRQkJNAkvKiBFeHBlY3QgbW9yZSBkYXRhLiAgKi8KKyMgZGVmaW5lIFNQTElDRV9GX0dJRlQJCTgJLyogUGFnZXMgcGFzc2VkIGluIGFyZSBhIGdpZnQuICAqLworCisKKy8qIEZpbGUgaGFuZGxlIHN0cnVjdHVyZS4gICovCitzdHJ1Y3QgZmlsZV9oYW5kbGUKK3sKKyAgdW5zaWduZWQgaW50IGhhbmRsZV9ieXRlczsKKyAgaW50IGhhbmRsZV90eXBlOworICAvKiBGaWxlIGlkZW50aWZpZXIuICAqLworICB1bnNpZ25lZCBjaGFyIGZfaGFuZGxlWzBdOworfTsKKworLyogTWF4aW11bSBoYW5kbGUgc2l6ZSAoZm9yIG5vdykuICAqLworIyBkZWZpbmUgTUFYX0hBTkRMRV9TWgkxMjgKKyNlbmRpZgorCisvKiBWYWx1ZXMgZm9yIGAqYXQnIGZ1bmN0aW9ucy4gICovCisjaWZkZWYgX19VU0VfQVRGSUxFCisjIGRlZmluZSBBVF9GRENXRAkJLTEwMAkvKiBTcGVjaWFsIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUKKwkJCQkJICAgdGhlICphdCBmdW5jdGlvbnMgc2hvdWxkIHVzZSB0aGUKKwkJCQkJICAgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gKi8KKyMgZGVmaW5lIEFUX1NZTUxJTktfTk9GT0xMT1cJMHgxMDAJLyogRG8gbm90IGZvbGxvdyBzeW1ib2xpYyBsaW5rcy4gICovCisjIGRlZmluZSBBVF9SRU1PVkVESVIJCTB4MjAwCS8qIFJlbW92ZSBkaXJlY3RvcnkgaW5zdGVhZCBvZgorCQkJCQkgICB1bmxpbmtpbmcgZmlsZS4gICovCisjIGRlZmluZSBBVF9TWU1MSU5LX0ZPTExPVwkweDQwMAkvKiBGb2xsb3cgc3ltYm9saWMgbGlua3MuICAqLworIyBkZWZpbmUgQVRfTk9fQVVUT01PVU5UCTB4ODAwCS8qIFN1cHByZXNzIHRlcm1pbmFsIGF1dG9tb3VudAorCQkJCQkgICB0cmF2ZXJzYWwuICAqLworIyBkZWZpbmUgQVRfRUFDQ0VTUwkJMHgyMDAJLyogVGVzdCBhY2Nlc3MgcGVybWl0dGVkIGZvcgorCQkJCQkgICBlZmZlY3RpdmUgSURzLCBub3QgcmVhbCBJRHMuICAqLworI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworI2lmZGVmIF9fVVNFX0dOVQorCisvKiBQcm92aWRlIGtlcm5lbCBoaW50IHRvIHJlYWQgYWhlYWQuICAqLworZXh0ZXJuIHNzaXplX3QgcmVhZGFoZWFkIChpbnQgX19mZCwgX19vZmY2NF90IF9fb2Zmc2V0LCBzaXplX3QgX19jb3VudCkKKyAgICBfX1RIUk9XOworCisKKy8qIFNlbGVjdGl2ZSBmaWxlIGNvbnRlbnQgc3luY2gnaW5nLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgc3luY19maWxlX3JhbmdlIChpbnQgX19mZCwgX19vZmY2NF90IF9fb2Zmc2V0LCBfX29mZjY0X3QgX19jb3VudCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgX19mbGFncyk7CisKKworLyogU3BsaWNlIGFkZHJlc3MgcmFuZ2UgaW50byBhIHBpcGUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3Qgdm1zcGxpY2UgKGludCBfX2Zkb3V0LCBjb25zdCBzdHJ1Y3QgaW92ZWMgKl9faW92LAorCQkJIHNpemVfdCBfX2NvdW50LCB1bnNpZ25lZCBpbnQgX19mbGFncyk7CisKKy8qIFNwbGljZSB0d28gZmlsZXMgdG9nZXRoZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3Qgc3BsaWNlIChpbnQgX19mZGluLCBfX29mZjY0X3QgKl9fb2ZmaW4sIGludCBfX2Zkb3V0LAorCQkgICAgICAgX19vZmY2NF90ICpfX29mZm91dCwgc2l6ZV90IF9fbGVuLAorCQkgICAgICAgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworCisvKiBJbi1rZXJuZWwgaW1wbGVtZW50YXRpb24gb2YgdGVlIGZvciBwaXBlIGJ1ZmZlcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgdGVlIChpbnQgX19mZGluLCBpbnQgX19mZG91dCwgc2l6ZV90IF9fbGVuLAorCQkgICAgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworCisvKiBSZXNlcnZlIHN0b3JhZ2UgZm9yIHRoZSBkYXRhIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBGRC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGZhbGxvY2F0ZSAoaW50IF9fZmQsIGludCBfX21vZGUsIF9fb2ZmX3QgX19vZmZzZXQsIF9fb2ZmX3QgX19sZW4pOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKGZhbGxvY2F0ZSwgKGludCBfX2ZkLCBpbnQgX19tb2RlLCBfX29mZjY0X3QgX19vZmZzZXQsCisJCQkJICAgX19vZmY2NF90IF9fbGVuKSwKKwkJICAgICAgIGZhbGxvY2F0ZTY0KTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgZmFsbG9jYXRlIGZhbGxvY2F0ZTY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBmYWxsb2NhdGU2NCAoaW50IF9fZmQsIGludCBfX21vZGUsIF9fb2ZmNjRfdCBfX29mZnNldCwKKwkJCV9fb2ZmNjRfdCBfX2xlbik7CisjIGVuZGlmCisKKworLyogTWFwIGZpbGUgbmFtZSB0byBmaWxlIGhhbmRsZS4gICovCitleHRlcm4gaW50IG5hbWVfdG9faGFuZGxlX2F0IChpbnQgX19kZmQsIGNvbnN0IGNoYXIgKl9fbmFtZSwKKwkJCSAgICAgIHN0cnVjdCBmaWxlX2hhbmRsZSAqX19oYW5kbGUsIGludCAqX19tbnRfaWQsCisJCQkgICAgICBpbnQgX19mbGFncykgX19USFJPVzsKKworLyogT3BlbiBmaWxlIHVzaW5nIHRoZSBmaWxlIGhhbmRsZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IG9wZW5fYnlfaGFuZGxlX2F0IChpbnQgX19tb3VudGRpcmZkLCBzdHJ1Y3QgZmlsZV9oYW5kbGUgKl9faGFuZGxlLAorCQkJICAgICAgaW50IF9fZmxhZ3MpOworCisjZW5kaWYJLyogdXNlIEdOVSAqLworCitfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZmNudGwyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9mY250bDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmU4NTg1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZmNudGwyLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qIENoZWNraW5nIG1hY3JvcyBmb3IgZmNudGwgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9GQ05UTF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL2ZjbnRsMi5oPiBkaXJlY3RseTsgdXNlIDxmY250bC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBDaGVjayB0aGF0IGNhbGxzIHRvIG9wZW4gYW5kIG9wZW5hdCB3aXRoIE9fQ1JFQVQgc2V0IGhhdmUgYW4KKyAgIGFwcHJvcHJpYXRlIHRoaXJkL2ZvdXJ0aCBwYXJhbWV0ZXIuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IF9fb3Blbl8yIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcpIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuX2FsaWFzLCAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnLCAuLi4pLAorCQkgICAgICAgb3BlbikgX19ub25udWxsICgoMSkpOworI2Vsc2UKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuXzIsIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcpLAorCQkgICAgICAgX19vcGVuNjRfMikgX19ub25udWxsICgoMSkpOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX29wZW5fYWxpYXMsIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcsIC4uLiksCisJCSAgICAgICBvcGVuNjQpIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorX19lcnJvcmRlY2wgKF9fb3Blbl90b29fbWFueV9hcmdzLAorCSAgICAgIm9wZW4gY2FuIGJlIGNhbGxlZCBlaXRoZXIgd2l0aCAyIG9yIDMgYXJndW1lbnRzLCBub3QgbW9yZSIpOworX19lcnJvcmRlY2wgKF9fb3Blbl9taXNzaW5nX21vZGUsCisJICAgICAib3BlbiB3aXRoIE9fQ1JFQVQgaW4gc2Vjb25kIGFyZ3VtZW50IG5lZWRzIDMgYXJndW1lbnRzIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitvcGVuIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcsIC4uLikKK3sKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpID4gMSkKKyAgICBfX29wZW5fdG9vX21hbnlfYXJncyAoKTsKKworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fb2ZsYWcpKQorICAgIHsKKyAgICAgIGlmICgoX19vZmxhZyAmIE9fQ1JFQVQpICE9IDAgJiYgX192YV9hcmdfcGFja19sZW4gKCkgPCAxKQorCXsKKwkgIF9fb3Blbl9taXNzaW5nX21vZGUgKCk7CisJICByZXR1cm4gX19vcGVuXzIgKF9fcGF0aCwgX19vZmxhZyk7CisJfQorICAgICAgcmV0dXJuIF9fb3Blbl9hbGlhcyAoX19wYXRoLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKKyAgICB9CisKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKyAgICByZXR1cm4gX19vcGVuXzIgKF9fcGF0aCwgX19vZmxhZyk7CisKKyAgcmV0dXJuIF9fb3Blbl9hbGlhcyAoX19wYXRoLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgX19vcGVuNjRfMiAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnKSBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3BlbjY0X2FsaWFzLCAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnLAorCQkJCQkuLi4pLCBvcGVuNjQpIF9fbm9ubnVsbCAoKDEpKTsKK19fZXJyb3JkZWNsIChfX29wZW42NF90b29fbWFueV9hcmdzLAorCSAgICAgIm9wZW42NCBjYW4gYmUgY2FsbGVkIGVpdGhlciB3aXRoIDIgb3IgMyBhcmd1bWVudHMsIG5vdCBtb3JlIik7CitfX2Vycm9yZGVjbCAoX19vcGVuNjRfbWlzc2luZ19tb2RlLAorCSAgICAgIm9wZW42NCB3aXRoIE9fQ1JFQVQgaW4gc2Vjb25kIGFyZ3VtZW50IG5lZWRzIDMgYXJndW1lbnRzIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitvcGVuNjQgKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZywgLi4uKQoreworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPiAxKQorICAgIF9fb3BlbjY0X3Rvb19tYW55X2FyZ3MgKCk7CisKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX29mbGFnKSkKKyAgICB7CisgICAgICBpZiAoKF9fb2ZsYWcgJiBPX0NSRUFUKSAhPSAwICYmIF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKwl7CisJICBfX29wZW42NF9taXNzaW5nX21vZGUgKCk7CisJICByZXR1cm4gX19vcGVuNjRfMiAoX19wYXRoLCBfX29mbGFnKTsKKwl9CisgICAgICByZXR1cm4gX19vcGVuNjRfYWxpYXMgKF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7CisgICAgfQorCisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisgICAgcmV0dXJuIF9fb3BlbjY0XzIgKF9fcGF0aCwgX19vZmxhZyk7CisKKyAgcmV0dXJuIF9fb3BlbjY0X2FsaWFzIChfX3BhdGgsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworfQorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0FURklMRQorIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBfX29wZW5hdF8yIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnKQorICAgICBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3BlbmF0X2FsaWFzLCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLAorCQkJCQlpbnQgX19vZmxhZywgLi4uKSwgb3BlbmF0KQorICAgICBfX25vbm51bGwgKCgyKSk7CisjIGVsc2UKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuYXRfMiwgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwKKwkJCQkgICAgaW50IF9fb2ZsYWcpLCBfX29wZW5hdDY0XzIpCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuYXRfYWxpYXMsIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsCisJCQkJCWludCBfX29mbGFnLCAuLi4pLCBvcGVuYXQ2NCkKKyAgICAgX19ub25udWxsICgoMikpOworIyBlbmRpZgorX19lcnJvcmRlY2wgKF9fb3BlbmF0X3Rvb19tYW55X2FyZ3MsCisJICAgICAib3BlbmF0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIHdpdGggMyBvciA0IGFyZ3VtZW50cywgbm90IG1vcmUiKTsKK19fZXJyb3JkZWNsIChfX29wZW5hdF9taXNzaW5nX21vZGUsCisJICAgICAib3BlbmF0IHdpdGggT19DUkVBVCBpbiB0aGlyZCBhcmd1bWVudCBuZWVkcyA0IGFyZ3VtZW50cyIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorb3BlbmF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnLCAuLi4pCit7CisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA+IDEpCisgICAgX19vcGVuYXRfdG9vX21hbnlfYXJncyAoKTsKKworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fb2ZsYWcpKQorICAgIHsKKyAgICAgIGlmICgoX19vZmxhZyAmIE9fQ1JFQVQpICE9IDAgJiYgX192YV9hcmdfcGFja19sZW4gKCkgPCAxKQorCXsKKwkgIF9fb3BlbmF0X21pc3NpbmdfbW9kZSAoKTsKKwkgIHJldHVybiBfX29wZW5hdF8yIChfX2ZkLCBfX3BhdGgsIF9fb2ZsYWcpOworCX0KKyAgICAgIHJldHVybiBfX29wZW5hdF9hbGlhcyAoX19mZCwgX19wYXRoLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKKyAgICB9CisKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKyAgICByZXR1cm4gX19vcGVuYXRfMiAoX19mZCwgX19wYXRoLCBfX29mbGFnKTsKKworICByZXR1cm4gX19vcGVuYXRfYWxpYXMgKF9fZmQsIF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7Cit9CisKKworIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBfX29wZW5hdDY0XzIgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcpCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuYXQ2NF9hbGlhcywgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwKKwkJCQkJICBpbnQgX19vZmxhZywgLi4uKSwgb3BlbmF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKK19fZXJyb3JkZWNsIChfX29wZW5hdDY0X3Rvb19tYW55X2FyZ3MsCisJICAgICAib3BlbmF0NjQgY2FuIGJlIGNhbGxlZCBlaXRoZXIgd2l0aCAzIG9yIDQgYXJndW1lbnRzLCBub3QgbW9yZSIpOworX19lcnJvcmRlY2wgKF9fb3BlbmF0NjRfbWlzc2luZ19tb2RlLAorCSAgICAgIm9wZW5hdDY0IHdpdGggT19DUkVBVCBpbiB0aGlyZCBhcmd1bWVudCBuZWVkcyA0IGFyZ3VtZW50cyIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorb3BlbmF0NjQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcsIC4uLikKK3sKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpID4gMSkKKyAgICBfX29wZW5hdDY0X3Rvb19tYW55X2FyZ3MgKCk7CisKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX29mbGFnKSkKKyAgICB7CisgICAgICBpZiAoKF9fb2ZsYWcgJiBPX0NSRUFUKSAhPSAwICYmIF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKwl7CisJICBfX29wZW5hdDY0X21pc3NpbmdfbW9kZSAoKTsKKwkgIHJldHVybiBfX29wZW5hdDY0XzIgKF9fZmQsIF9fcGF0aCwgX19vZmxhZyk7CisJfQorICAgICAgcmV0dXJuIF9fb3BlbmF0NjRfYWxpYXMgKF9fZmQsIF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7CisgICAgfQorCisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisgICAgcmV0dXJuIF9fb3BlbmF0NjRfMiAoX19mZCwgX19wYXRoLCBfX29mbGFnKTsKKworICByZXR1cm4gX19vcGVuYXQ2NF9hbGlhcyAoX19mZCwgX19wYXRoLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyMgZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZmVudi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYzI0NTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9mZW52LmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5Ny0yMDAxLDIwMDQsMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfRkVOVl9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvZmVudi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8ZmVudi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisKKy8qIERlZmluZSBiaXRzIHJlcHJlc2VudGluZyB0aGUgZXhjZXB0aW9uLiAgV2UgdXNlIHRoZSBiaXQgcG9zaXRpb25zCisgICBvZiB0aGUgYXBwcm9wcmlhdGUgYml0cyBpbiB0aGUgRlBVIGNvbnRyb2wgd29yZC4gICovCitlbnVtCisgIHsKKyAgICBGRV9JTlZBTElEID0gMHgwMSwKKyNkZWZpbmUgRkVfSU5WQUxJRAlGRV9JTlZBTElECisgICAgX19GRV9ERU5PUk0gPSAweDAyLAorICAgIEZFX0RJVkJZWkVSTyA9IDB4MDQsCisjZGVmaW5lIEZFX0RJVkJZWkVSTwlGRV9ESVZCWVpFUk8KKyAgICBGRV9PVkVSRkxPVyA9IDB4MDgsCisjZGVmaW5lIEZFX09WRVJGTE9XCUZFX09WRVJGTE9XCisgICAgRkVfVU5ERVJGTE9XID0gMHgxMCwKKyNkZWZpbmUgRkVfVU5ERVJGTE9XCUZFX1VOREVSRkxPVworICAgIEZFX0lORVhBQ1QgPSAweDIwCisjZGVmaW5lIEZFX0lORVhBQ1QJRkVfSU5FWEFDVAorICB9OworCisjZGVmaW5lIEZFX0FMTF9FWENFUFQgXAorCShGRV9JTkVYQUNUIHwgRkVfRElWQllaRVJPIHwgRkVfVU5ERVJGTE9XIHwgRkVfT1ZFUkZMT1cgfCBGRV9JTlZBTElEKQorCisvKiBUaGUgaXg4NyBGUFUgc3VwcG9ydHMgYWxsIG9mIHRoZSBmb3VyIGRlZmluZWQgcm91bmRpbmcgbW9kZXMuICBXZQorICAgdXNlIGFnYWluIHRoZSBiaXQgcG9zaXRpb25zIGluIHRoZSBGUFUgY29udHJvbCB3b3JkIGFzIHRoZSB2YWx1ZXMKKyAgIGZvciB0aGUgYXBwcm9wcmlhdGUgbWFjcm9zLiAgKi8KK2VudW0KKyAgeworICAgIEZFX1RPTkVBUkVTVCA9IDAsCisjZGVmaW5lIEZFX1RPTkVBUkVTVAlGRV9UT05FQVJFU1QKKyAgICBGRV9ET1dOV0FSRCA9IDB4NDAwLAorI2RlZmluZSBGRV9ET1dOV0FSRAlGRV9ET1dOV0FSRAorICAgIEZFX1VQV0FSRCA9IDB4ODAwLAorI2RlZmluZSBGRV9VUFdBUkQJRkVfVVBXQVJECisgICAgRkVfVE9XQVJEWkVSTyA9IDB4YzAwCisjZGVmaW5lIEZFX1RPV0FSRFpFUk8JRkVfVE9XQVJEWkVSTworICB9OworCisKKy8qIFR5cGUgcmVwcmVzZW50aW5nIGV4Y2VwdGlvbiBmbGFncy4gICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBmZXhjZXB0X3Q7CisKKworLyogVHlwZSByZXByZXNlbnRpbmcgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQuICBUaGlzIHN0cnVjdHVyZQorICAgY29ycmVzcG9uZHMgdG8gdGhlIGxheW91dCBvZiB0aGUgYmxvY2sgd3JpdHRlbiBieSB0aGUgYGZzdGVudicKKyAgIGluc3RydWN0aW9uIGFuZCBoYXMgYWRkaXRpb25hbCBmaWVsZHMgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgTVhDU1IKKyAgIHJlZ2lzdGVyIGFzIHdyaXR0ZW4gYnkgdGhlIGBzdG14Y3NyJyBpbnN0cnVjdGlvbi4gICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fY29udHJvbF93b3JkOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3VudXNlZDE7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fc3RhdHVzX3dvcmQ7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdW51c2VkMjsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX190YWdzOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3VudXNlZDM7CisgICAgdW5zaWduZWQgaW50IF9fZWlwOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX2NzX3NlbGVjdG9yOworICAgIHVuc2lnbmVkIGludCBfX29wY29kZToxMTsKKyAgICB1bnNpZ25lZCBpbnQgX191bnVzZWQ0OjU7CisgICAgdW5zaWduZWQgaW50IF9fZGF0YV9vZmZzZXQ7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fZGF0YV9zZWxlY3RvcjsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX191bnVzZWQ1OworI2lmIF9fV09SRFNJWkUgPT0gNjQKKyAgICB1bnNpZ25lZCBpbnQgX19teGNzcjsKKyNlbmRpZgorICB9CitmZW52X3Q7CisKKy8qIElmIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGlzIHVzZWQgd2UgdXNlIHRoaXMgdmFsdWUuICAqLworI2RlZmluZSBGRV9ERkxfRU5WCSgoX19jb25zdCBmZW52X3QgKikgLTEpCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50IHdoZXJlIG5vbmUgb2YgdGhlIGV4Y2VwdGlvbiBpcyBtYXNrZWQuICAqLworIyBkZWZpbmUgRkVfTk9NQVNLX0VOVgkoKF9fY29uc3QgZmVudl90ICopIC0yKQorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCitfX0JFR0lOX0RFQ0xTCisKKy8qIE9wdGltaXplZCB2ZXJzaW9ucy4gICovCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2ZlcmFpc2VleGNlcHRfcmVuYW1lZCwgKGludCksIGZlcmFpc2VleGNlcHQpOworX19leHRlcm5faW5saW5lIGludAorX19OVEggKGZlcmFpc2VleGNlcHQgKGludCBfX2V4Y2VwdHMpKQoreworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fZXhjZXB0cykKKyAgICAgICYmIChfX2V4Y2VwdHMgJiB+KEZFX0lOVkFMSUQgfCBGRV9ESVZCWVpFUk8pKSA9PSAwKQorICAgIHsKKyAgICAgIGlmICgoRkVfSU5WQUxJRCAmIF9fZXhjZXB0cykgIT0gMCkKKwl7CisJICAvKiBPbmUgZXhhbXBsZSBvZiBhIGludmFsaWQgb3BlcmF0aW9uIGlzIDAuMCAvIDAuMC4gICovCisJICBmbG9hdCBfX2YgPSAwLjA7CisKKwkgIF9fYXNtX18gX192b2xhdGlsZV9fICgiZGl2c3MgJTAsICUwICIgOiA6ICJ4IiAoX19mKSk7CisJICAodm9pZCkgJl9fZjsKKwl9CisgICAgICBpZiAoKEZFX0RJVkJZWkVSTyAmIF9fZXhjZXB0cykgIT0gMCkKKwl7CisJICBmbG9hdCBfX2YgPSAxLjA7CisJICBmbG9hdCBfX2cgPSAwLjA7CisKKwkgIF9fYXNtX18gX192b2xhdGlsZV9fICgiZGl2c3MgJTEsICUwIiA6IDogIngiIChfX2YpLCAieCIgKF9fZykpOworCSAgKHZvaWQpICZfX2Y7CisJfQorCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIF9fZmVyYWlzZWV4Y2VwdF9yZW5hbWVkIChfX2V4Y2VwdHMpOworfQorCitfX0VORF9ERUNMUworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9mZW52aW5saW5lLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9mZW52aW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmNzdiNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2ZlbnZpbmxpbmUuaApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgZmlsZSBwcm92aWRlcyBpbmxpbmUgdmVyc2lvbnMgb2YgZmxvYXRpbmctcGludCBlbnZpcm9ubWVudAorICAgaGFuZGxpbmcgZnVuY3Rpb25zLiAgSWYgdGhlcmUgd2VyZSBhbnkuICAqLworCisjaWZuZGVmIF9fTk9fTUFUSF9JTkxJTkVTCisKKy8qIEhlcmUgaXMgd2hlcmUgdGhlIGNvZGUgd291bGQgZ28uICAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2h1Z2VfdmFsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9odWdlX3ZhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExY2ExMWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9odWdlX3ZhbC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIGBIVUdFX1ZBTCcgY29uc3RhbnQgZm9yIElFRUUgNzU0IG1hY2hpbmVzICh3aGVyZSBpdCBpcyBpbmZpbml0eSkuCisgICBVc2VkIGJ5IDxzdGRsaWIuaD4gYW5kIDxtYXRoLmg+IGZ1bmN0aW9ucyBmb3Igb3ZlcmZsb3cuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDQKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NQVRIX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9odWdlX3ZhbC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBJRUVFIHBvc2l0aXZlIGluZmluaXR5ICgtSFVHRV9WQUwgaXMgbmVnYXRpdmUgaW5maW5pdHkpLiAgKi8KKworI2lmIF9fR05VQ19QUkVSRVEoMywzKQorIyBkZWZpbmUgSFVHRV9WQUwJKF9fYnVpbHRpbl9odWdlX3ZhbCgpKQorI2VsaWYgX19HTlVDX1BSRVJFUSgyLDk2KQorIyBkZWZpbmUgSFVHRV9WQUwJKF9fZXh0ZW5zaW9uX18gMHgxLjBwMjA0NykKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKworIyBkZWZpbmUgSFVHRV9WQUwgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoKHVuaW9uIHsgdW5zaWduZWQgX19sIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fRElfXykpKTsgZG91YmxlIF9fZDsgfSkgICBcCisgICAgeyBfX2w6IDB4N2ZmMDAwMDAwMDAwMDAwMFVMTCB9KS5fX2QpCisKKyNlbHNlIC8qIG5vdCBHQ0MgKi8KKworIyBpbmNsdWRlIDxlbmRpYW4uaD4KKwordHlwZWRlZiB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgX19jWzhdOyBkb3VibGUgX19kOyB9IF9faHVnZV92YWxfdDsKKworIyBpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjICBkZWZpbmUgX19IVUdFX1ZBTF9ieXRlcwl7IDB4N2YsIDB4ZjAsIDAsIDAsIDAsIDAsIDAsIDAgfQorIyBlbmRpZgorIyBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgX19IVUdFX1ZBTF9ieXRlcwl7IDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4N2YgfQorIyBlbmRpZgorCitzdGF0aWMgX19odWdlX3ZhbF90IF9faHVnZV92YWwgPSB7IF9fSFVHRV9WQUxfYnl0ZXMgfTsKKyMgZGVmaW5lIEhVR0VfVkFMCShfX2h1Z2VfdmFsLl9fZCkKKworI2VuZGlmCS8qIEdDQy4gICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9odWdlX3ZhbGYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2h1Z2VfdmFsZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODUzNDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9odWdlX3ZhbGYuaApAQCAtMCwwICsxLDUzIEBACisvKiBgSFVHRV9WQUxGJyBjb25zdGFudCBmb3IgSUVFRSA3NTQgbWFjaGluZXMgKHdoZXJlIGl0IGlzIGluZmluaXR5KS4KKyAgIFVzZWQgYnkgPHN0ZGxpYi5oPiBhbmQgPG1hdGguaD4gZnVuY3Rpb25zIGZvciBvdmVyZmxvdy4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwNAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2h1Z2VfdmFsZi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBJRUVFIHBvc2l0aXZlIGluZmluaXR5ICgtSFVHRV9WQUwgaXMgbmVnYXRpdmUgaW5maW5pdHkpLiAgKi8KKworI2lmIF9fR05VQ19QUkVSRVEoMywzKQorIyBkZWZpbmUgSFVHRV9WQUxGCShfX2J1aWx0aW5faHVnZV92YWxmKCkpCisjZWxpZiBfX0dOVUNfUFJFUkVRKDIsOTYpCisjIGRlZmluZSBIVUdFX1ZBTEYJKF9fZXh0ZW5zaW9uX18gMHgxLjBwMjU1ZikKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKworIyAgIGRlZmluZSBIVUdFX1ZBTEYgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoKHVuaW9uIHsgdW5zaWduZWQgX19sIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fU0lfXykpKTsgZmxvYXQgX19kOyB9KSAgICBcCisgICAgeyBfX2w6IDB4N2Y4MDAwMDBVTCB9KS5fX2QpCisKKyNlbHNlIC8qIG5vdCBHQ0MgKi8KKwordHlwZWRlZiB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgX19jWzRdOyBmbG9hdCBfX2Y7IH0gX19odWdlX3ZhbGZfdDsKKworIyBpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjICBkZWZpbmUgX19IVUdFX1ZBTEZfYnl0ZXMJeyAweDdmLCAweDgwLCAwLCAwIH0KKyMgZW5kaWYKKyMgaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyAgZGVmaW5lIF9fSFVHRV9WQUxGX2J5dGVzCXsgMCwgMCwgMHg4MCwgMHg3ZiB9CisjIGVuZGlmCisKK3N0YXRpYyBfX2h1Z2VfdmFsZl90IF9faHVnZV92YWxmID0geyBfX0hVR0VfVkFMRl9ieXRlcyB9OworIyBkZWZpbmUgSFVHRV9WQUxGCShfX2h1Z2VfdmFsZi5fX2YpCisKKyNlbmRpZgkvKiBHQ0MuICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaHVnZV92YWxsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9odWdlX3ZhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWU4ZTIyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaHVnZV92YWxsLmgKQEAgLTAsMCArMSwyOSBAQAorLyogRGVmYXVsdCBgSFVHRV9WQUxMJyBjb25zdGFudC4KKyAgIFVzZWQgYnkgPHN0ZGxpYi5oPiBhbmQgPG1hdGguaD4gZnVuY3Rpb25zIGZvciBvdmVyZmxvdy4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NiwgMTk5NywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTUFUSF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaHVnZV92YWxsLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZiBfX0dOVUNfUFJFUkVRKDMsMykKKyMgZGVmaW5lIEhVR0VfVkFMTAkoX19idWlsdGluX2h1Z2VfdmFsbCgpKQorI2Vsc2UKKyMgZGVmaW5lIEhVR0VfVkFMTAkoKGxvbmcgZG91YmxlKSBIVUdFX1ZBTCkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1ZTE0NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2luLmgKQEAgLTAsMCArMSwxODkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0yMDAwLDIwMDQsMjAwOCwyMDEwLDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIExpbnV4IHZlcnNpb24uICAqLworCisjaWZuZGVmIF9ORVRJTkVUX0lOX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9pbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBPcHRpb25zIGZvciB1c2Ugd2l0aCBgZ2V0c29ja29wdCcgYW5kIGBzZXRzb2Nrb3B0JyBhdCB0aGUgSVAgbGV2ZWwuCisgICBUaGUgZmlyc3Qgd29yZCBpbiB0aGUgY29tbWVudCBhdCB0aGUgcmlnaHQgaXMgdGhlIGRhdGEgdHlwZSB1c2VkOworICAgImJvb2wiIG1lYW5zIGEgYm9vbGVhbiB2YWx1ZSBzdG9yZWQgaW4gYW4gYGludCcuICAqLworI2RlZmluZSAgICAgICAgSVBfT1BUSU9OUyAgICAgIDQgICAgICAgLyogaXBfb3B0czsgSVAgcGVyLXBhY2tldCBvcHRpb25zLiAgKi8KKyNkZWZpbmUgICAgICAgIElQX0hEUklOQ0wgICAgICAzICAgICAgIC8qIGludDsgSGVhZGVyIGlzIGluY2x1ZGVkIHdpdGggZGF0YS4gICovCisjZGVmaW5lICAgICAgICBJUF9UT1MgICAgICAgICAgMSAgICAgICAvKiBpbnQ7IElQIHR5cGUgb2Ygc2VydmljZSBhbmQgcHJlY2VkZW5jZS4gICovCisjZGVmaW5lICAgICAgICBJUF9UVEwgICAgICAgICAgMiAgICAgICAvKiBpbnQ7IElQIHRpbWUgdG8gbGl2ZS4gICovCisjZGVmaW5lICAgICAgICBJUF9SRUNWT1BUUyAgICAgNiAgICAgICAvKiBib29sOyBSZWNlaXZlIGFsbCBJUCBvcHRpb25zIHcvZGF0YWdyYW0uICAqLworLyogRm9yIEJTRCBjb21wYXRpYmlsaXR5LiAgKi8KKyNkZWZpbmUgICAgICAgIElQX1JFQ1ZSRVRPUFRTICBJUF9SRVRPUFRTICAgICAgIC8qIGJvb2w7IFJlY2VpdmUgSVAgb3B0aW9ucyBmb3IgcmVzcG9uc2UuICAqLworI2RlZmluZSAgICAgICAgSVBfUkVUT1BUUyAgICAgIDcgICAgICAgLyogaXBfb3B0czsgU2V0L2dldCBJUCBwZXItcGFja2V0IG9wdGlvbnMuICAqLworI2RlZmluZSBJUF9NVUxUSUNBU1RfSUYgMzIJLyogaW5fYWRkcjsgc2V0L2dldCBJUCBtdWx0aWNhc3QgaS9mICovCisjZGVmaW5lIElQX01VTFRJQ0FTVF9UVEwgMzMJLyogdV9jaGFyOyBzZXQvZ2V0IElQIG11bHRpY2FzdCB0dGwgKi8KKyNkZWZpbmUgSVBfTVVMVElDQVNUX0xPT1AgMzQJLyogaV9jaGFyOyBzZXQvZ2V0IElQIG11bHRpY2FzdCBsb29wYmFjayAqLworI2RlZmluZSBJUF9BRERfTUVNQkVSU0hJUCAzNQkvKiBpcF9tcmVxOyBhZGQgYW4gSVAgZ3JvdXAgbWVtYmVyc2hpcCAqLworI2RlZmluZSBJUF9EUk9QX01FTUJFUlNISVAgMzYJLyogaXBfbXJlcTsgZHJvcCBhbiBJUCBncm91cCBtZW1iZXJzaGlwICovCisjZGVmaW5lIElQX1VOQkxPQ0tfU09VUkNFIDM3CS8qIGlwX21yZXFfc291cmNlOiB1bmJsb2NrIGRhdGEgZnJvbSBzb3VyY2UgKi8KKyNkZWZpbmUgSVBfQkxPQ0tfU09VUkNFIDM4CS8qIGlwX21yZXFfc291cmNlOiBibG9jayBkYXRhIGZyb20gc291cmNlICovCisjZGVmaW5lIElQX0FERF9TT1VSQ0VfTUVNQkVSU0hJUCAzOSAvKiBpcF9tcmVxX3NvdXJjZTogam9pbiBzb3VyY2UgZ3JvdXAgKi8KKyNkZWZpbmUgSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUCA0MCAvKiBpcF9tcmVxX3NvdXJjZTogbGVhdmUgc291cmNlIGdyb3VwICovCisjZGVmaW5lIElQX01TRklMVEVSIDQxCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfR05VCisjIGRlZmluZSBNQ0FTVF9KT0lOX0dST1VQIDQyCS8qIGdyb3VwX3JlcTogam9pbiBhbnktc291cmNlIGdyb3VwICovCisjIGRlZmluZSBNQ0FTVF9CTE9DS19TT1VSQ0UgNDMJLyogZ3JvdXBfc291cmNlX3JlcTogYmxvY2sgZnJvbSBnaXZlbiBncm91cCAqLworIyBkZWZpbmUgTUNBU1RfVU5CTE9DS19TT1VSQ0UgNDQgLyogZ3JvdXBfc291cmNlX3JlcTogdW5ibG9jayBmcm9tIGdpdmVuIGdyb3VwKi8KKyMgZGVmaW5lIE1DQVNUX0xFQVZFX0dST1VQIDQ1CS8qIGdyb3VwX3JlcTogbGVhdmUgYW55LXNvdXJjZSBncm91cCAqLworIyBkZWZpbmUgTUNBU1RfSk9JTl9TT1VSQ0VfR1JPVVAgNDYgLyogZ3JvdXBfc291cmNlX3JlcTogam9pbiBzb3VyY2Utc3BlYyBnciAqLworIyBkZWZpbmUgTUNBU1RfTEVBVkVfU09VUkNFX0dST1VQIDQ3IC8qIGdyb3VwX3NvdXJjZV9yZXE6IGxlYXZlIHNvdXJjZS1zcGVjIGdyKi8KKyMgZGVmaW5lIE1DQVNUX01TRklMVEVSIDQ4CisKKyMgZGVmaW5lIE1DQVNUX0VYQ0xVREUgICAwCisjIGRlZmluZSBNQ0FTVF9JTkNMVURFICAgMQorI2VuZGlmCisKKyNkZWZpbmUgSVBfUk9VVEVSX0FMRVJUCTUJLyogYm9vbCAqLworI2RlZmluZSBJUF9QS1RJTkZPCTgJLyogYm9vbCAqLworI2RlZmluZSBJUF9QS1RPUFRJT05TCTkKKyNkZWZpbmUgSVBfUE1UVURJU0MJMTAJLyogb2Jzb2xldGUgbmFtZT8gKi8KKyNkZWZpbmUgSVBfTVRVX0RJU0NPVkVSCTEwCS8qIGludDsgc2VlIGJlbG93ICovCisjZGVmaW5lIElQX1JFQ1ZFUlIJMTEJLyogYm9vbCAqLworI2RlZmluZSBJUF9SRUNWVFRMCTEyCS8qIGJvb2wgKi8KKyNkZWZpbmUgSVBfUkVDVlRPUwkxMwkvKiBib29sICovCisjZGVmaW5lIElQX01UVQkJMTQJLyogaW50ICovCisjZGVmaW5lIElQX0ZSRUVCSU5ECTE1CisjZGVmaW5lIElQX0lQU0VDX1BPTElDWSAxNgorI2RlZmluZSBJUF9YRlJNX1BPTElDWQkxNworI2RlZmluZSBJUF9QQVNTU0VDCTE4CisjZGVmaW5lIElQX1RSQU5TUEFSRU5UCTE5CisjZGVmaW5lIElQX01VTFRJQ0FTVF9BTEwgNDkJLyogYm9vbCAqLworCisvKiBUUHJveHkgb3JpZ2luYWwgYWRkcmVzc2VzICovCisjZGVmaW5lIElQX09SSUdEU1RBRERSICAgICAgIDIwCisjZGVmaW5lIElQX1JFQ1ZPUklHRFNUQUREUiAgIElQX09SSUdEU1RBRERSCisKKyNkZWZpbmUgSVBfTUlOVFRMICAgICAgIDIxCisKKworLyogSVBfTVRVX0RJU0NPVkVSIGFyZ3VtZW50cy4gICovCisjZGVmaW5lIElQX1BNVFVESVNDX0RPTlQgICAwCS8qIE5ldmVyIHNlbmQgREYgZnJhbWVzLiAgKi8KKyNkZWZpbmUgSVBfUE1UVURJU0NfV0FOVCAgIDEJLyogVXNlIHBlciByb3V0ZSBoaW50cy4gICovCisjZGVmaW5lIElQX1BNVFVESVNDX0RPICAgICAyCS8qIEFsd2F5cyBERi4gICovCisjZGVmaW5lIElQX1BNVFVESVNDX1BST0JFICAzCS8qIElnbm9yZSBkc3QgcG10dS4gICovCisKKy8qIFRvIHNlbGVjdCB0aGUgSVAgbGV2ZWwuICAqLworI2RlZmluZSBTT0xfSVAJMAorCisjZGVmaW5lIElQX0RFRkFVTFRfTVVMVElDQVNUX1RUTCAgICAgICAgMQorI2RlZmluZSBJUF9ERUZBVUxUX01VTFRJQ0FTVF9MT09QICAgICAgIDEKKyNkZWZpbmUgSVBfTUFYX01FTUJFUlNISVBTICAgICAgICAgICAgICAyMAorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfR05VCisvKiBTdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBJUCBvcHRpb25zIGZvciBJUF9PUFRJT05TIGFuZCBJUF9SRVRPUFRTLgorICAgVGhlIGBpcF9kc3QnIGZpZWxkIGlzIHVzZWQgZm9yIHRoZSBmaXJzdC1ob3AgZ2F0ZXdheSB3aGVuIHVzaW5nIGEKKyAgIHNvdXJjZSByb3V0ZSAodGhpcyBnZXRzIHB1dCBpbnRvIHRoZSBoZWFkZXIgcHJvcGVyKS4gICovCitzdHJ1Y3QgaXBfb3B0cworICB7CisgICAgc3RydWN0IGluX2FkZHIgaXBfZHN0OwkvKiBGaXJzdCBob3A7IHplcm8gd2l0aG91dCBzb3VyY2Ugcm91dGUuICAqLworICAgIGNoYXIgaXBfb3B0c1s0MF07CQkvKiBBY3R1YWxseSB2YXJpYWJsZSBpbiBzaXplLiAgKi8KKyAgfTsKKworLyogTGlrZSBgc3RydWN0IGlwX21yZXEnIGJ1dCBpbmNsdWRpbmcgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gYnkgaW5kZXguICAqLworc3RydWN0IGlwX21yZXFuCisgIHsKKyAgICBzdHJ1Y3QgaW5fYWRkciBpbXJfbXVsdGlhZGRyOwkvKiBJUCBtdWx0aWNhc3QgYWRkcmVzcyBvZiBncm91cCAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltcl9hZGRyZXNzOwkJLyogbG9jYWwgSVAgYWRkcmVzcyBvZiBpbnRlcmZhY2UgKi8KKyAgICBpbnQJaW1yX2lmaW5kZXg7CQkJLyogSW50ZXJmYWNlIGluZGV4ICovCisgIH07CisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciBJUF9QS1RJTkZPLiAgKi8KK3N0cnVjdCBpbl9wa3RpbmZvCisgIHsKKyAgICBpbnQgaXBpX2lmaW5kZXg7CQkJLyogSW50ZXJmYWNlIGluZGV4ICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGlwaV9zcGVjX2RzdDsJLyogUm91dGluZyBkZXN0aW5hdGlvbiBhZGRyZXNzICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGlwaV9hZGRyOwkJLyogSGVhZGVyIGRlc3RpbmF0aW9uIGFkZHJlc3MgICovCisgIH07CisjZW5kaWYKKworLyogT3B0aW9ucyBmb3IgdXNlIHdpdGggYGdldHNvY2tvcHQnIGFuZCBgc2V0c29ja29wdCcgYXQgdGhlIElQdjYgbGV2ZWwuCisgICBUaGUgZmlyc3Qgd29yZCBpbiB0aGUgY29tbWVudCBhdCB0aGUgcmlnaHQgaXMgdGhlIGRhdGEgdHlwZSB1c2VkOworICAgImJvb2wiIG1lYW5zIGEgYm9vbGVhbiB2YWx1ZSBzdG9yZWQgaW4gYW4gYGludCcuICAqLworI2RlZmluZSBJUFY2X0FERFJGT1JNCQkxCisjZGVmaW5lIElQVjZfMjI5MlBLVElORk8JMgorI2RlZmluZSBJUFY2XzIyOTJIT1BPUFRTCTMKKyNkZWZpbmUgSVBWNl8yMjkyRFNUT1BUUwk0CisjZGVmaW5lIElQVjZfMjI5MlJUSERSCQk1CisjZGVmaW5lIElQVjZfMjI5MlBLVE9QVElPTlMJNgorI2RlZmluZSBJUFY2X0NIRUNLU1VNCQk3CisjZGVmaW5lIElQVjZfMjI5MkhPUExJTUlUCTgKKworI2RlZmluZSBTQ01fU1JDUlQJCUlQVjZfUlhTUkNSVAorCisjZGVmaW5lIElQVjZfTkVYVEhPUAkJOQorI2RlZmluZSBJUFY2X0FVVEhIRFIJCTEwCisjZGVmaW5lIElQVjZfVU5JQ0FTVF9IT1BTCTE2CisjZGVmaW5lIElQVjZfTVVMVElDQVNUX0lGCTE3CisjZGVmaW5lIElQVjZfTVVMVElDQVNUX0hPUFMJMTgKKyNkZWZpbmUgSVBWNl9NVUxUSUNBU1RfTE9PUAkxOQorI2RlZmluZSBJUFY2X0pPSU5fR1JPVVAJCTIwCisjZGVmaW5lIElQVjZfTEVBVkVfR1JPVVAJMjEKKyNkZWZpbmUgSVBWNl9ST1VURVJfQUxFUlQJMjIKKyNkZWZpbmUgSVBWNl9NVFVfRElTQ09WRVIJMjMKKyNkZWZpbmUgSVBWNl9NVFUJCTI0CisjZGVmaW5lIElQVjZfUkVDVkVSUgkJMjUKKyNkZWZpbmUgSVBWNl9WNk9OTFkJCTI2CisjZGVmaW5lIElQVjZfSk9JTl9BTllDQVNUCTI3CisjZGVmaW5lIElQVjZfTEVBVkVfQU5ZQ0FTVAkyOAorI2RlZmluZSBJUFY2X0lQU0VDX1BPTElDWQkzNAorI2RlZmluZSBJUFY2X1hGUk1fUE9MSUNZCTM1CisKKyNkZWZpbmUgSVBWNl9SRUNWUEtUSU5GTwk0OQorI2RlZmluZSBJUFY2X1BLVElORk8JCTUwCisjZGVmaW5lIElQVjZfUkVDVkhPUExJTUlUCTUxCisjZGVmaW5lIElQVjZfSE9QTElNSVQJCTUyCisjZGVmaW5lIElQVjZfUkVDVkhPUE9QVFMJNTMKKyNkZWZpbmUgSVBWNl9IT1BPUFRTCQk1NAorI2RlZmluZSBJUFY2X1JUSERSRFNUT1BUUwk1NQorI2RlZmluZSBJUFY2X1JFQ1ZSVEhEUgkJNTYKKyNkZWZpbmUgSVBWNl9SVEhEUgkJNTcKKyNkZWZpbmUgSVBWNl9SRUNWRFNUT1BUUwk1OAorI2RlZmluZSBJUFY2X0RTVE9QVFMJCTU5CisKKyNkZWZpbmUgSVBWNl9SRUNWVENMQVNTCQk2NgorI2RlZmluZSBJUFY2X1RDTEFTUwkJNjcKKworLyogT2Jzb2xldGUgc3lub255bXMgZm9yIHRoZSBhYm92ZS4gICovCisjZGVmaW5lIElQVjZfQUREX01FTUJFUlNISVAJSVBWNl9KT0lOX0dST1VQCisjZGVmaW5lIElQVjZfRFJPUF9NRU1CRVJTSElQCUlQVjZfTEVBVkVfR1JPVVAKKyNkZWZpbmUgSVBWNl9SWEhPUE9QVFMJCUlQVjZfSE9QT1BUUworI2RlZmluZSBJUFY2X1JYRFNUT1BUUwkJSVBWNl9EU1RPUFRTCisKKy8qIElQVjZfTVRVX0RJU0NPVkVSIHZhbHVlcy4gICovCisjZGVmaW5lIElQVjZfUE1UVURJU0NfRE9OVAkwCS8qIE5ldmVyIHNlbmQgREYgZnJhbWVzLiAgKi8KKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19XQU5UCTEJLyogVXNlIHBlciByb3V0ZSBoaW50cy4gICovCisjZGVmaW5lIElQVjZfUE1UVURJU0NfRE8JMgkvKiBBbHdheXMgREYuICAqLworI2RlZmluZSBJUFY2X1BNVFVESVNDX1BST0JFCTMJLyogSWdub3JlIGRzdCBwbXR1LiAgKi8KKworLyogU29ja2V0IGxldmVsIHZhbHVlcyBmb3IgSVB2Ni4gICovCisjZGVmaW5lIFNPTF9JUFY2ICAgICAgICA0MQorI2RlZmluZSBTT0xfSUNNUFY2ICAgICAgNTgKKworLyogUm91dGluZyBoZWFkZXIgb3B0aW9ucyBmb3IgSVB2Ni4gICovCisjZGVmaW5lIElQVjZfUlRIRFJfTE9PU0UJMAkvKiBIb3AgZG9lc24ndCBuZWVkIHRvIGJlIG5laWdoYm91ci4gKi8KKyNkZWZpbmUgSVBWNl9SVEhEUl9TVFJJQ1QJMQkvKiBIb3AgbXVzdCBiZSBhIG5laWdoYm91ci4gICovCisKKyNkZWZpbmUgSVBWNl9SVEhEUl9UWVBFXzAJMAkvKiBJUHY2IFJvdXRpbmcgaGVhZGVyIHR5cGUgMC4gICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pbmYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2luZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTlmNzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pbmYuaApAQCAtMCwwICsxLDMwIEBACisvKiBgSU5GSU5JVFknIGNvbnN0YW50IGZvciBJRUVFIDc1NCBtYWNoaW5lcy4KKyAgIENvcHlyaWdodCAoQykgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTUFUSF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaW5mLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIElFRUUgcG9zaXRpdmUgaW5maW5pdHkuICAqLworCisjaWYgX19HTlVDX1BSRVJFUSgzLDMpCisjIGRlZmluZSBJTkZJTklUWQkoX19idWlsdGluX2luZmYoKSkKKyNlbHNlCisjIGRlZmluZSBJTkZJTklUWQlIVUdFX1ZBTEYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaW5pdHNwaW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2luaXRzcGluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2ZjE3OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2luaXRzcGluLmgKQEAgLTAsMCArMSBAQAorLyogTm8gdGhyZWFkIHN1cHBvcnQuICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pb2N0bC10eXBlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaW9jdGwtdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODU2YTA0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaW9jdGwtdHlwZXMuaApAQCAtMCwwICsxLDc4IEBACisvKiBTdHJ1Y3R1cmUgdHlwZXMgZm9yIHByZS10ZXJtaW9zIHRlcm1pbmFsIGlvY3Rscy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19JT0NUTF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaW9jdGwtdHlwZXMuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9pb2N0bC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBHZXQgZGVmaW5pdGlvbiBvZiBjb25zdGFudHMgZm9yIHVzZSB3aXRoIGBpb2N0bCcuICAqLworI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworCitzdHJ1Y3Qgd2luc2l6ZQorICB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHdzX3JvdzsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgd3NfY29sOworICAgIHVuc2lnbmVkIHNob3J0IGludCB3c194cGl4ZWw7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHdzX3lwaXhlbDsKKyAgfTsKKworI2RlZmluZSBOQ0MgOAorc3RydWN0IHRlcm1pbworICB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCisgICAgdW5zaWduZWQgY2hhciBjX2xpbmU7CQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGNfY2NbTkNDXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworfTsKKworLyogbW9kZW0gbGluZXMgKi8KKyNkZWZpbmUgVElPQ01fTEUJMHgwMDEKKyNkZWZpbmUgVElPQ01fRFRSCTB4MDAyCisjZGVmaW5lIFRJT0NNX1JUUwkweDAwNAorI2RlZmluZSBUSU9DTV9TVAkweDAwOAorI2RlZmluZSBUSU9DTV9TUgkweDAxMAorI2RlZmluZSBUSU9DTV9DVFMJMHgwMjAKKyNkZWZpbmUgVElPQ01fQ0FSCTB4MDQwCisjZGVmaW5lIFRJT0NNX1JORwkweDA4MAorI2RlZmluZSBUSU9DTV9EU1IJMHgxMDAKKyNkZWZpbmUgVElPQ01fQ0QJVElPQ01fQ0FSCisjZGVmaW5lIFRJT0NNX1JJCVRJT0NNX1JORworCisvKiBpb2N0bCAoZmQsIFRJT0NTRVJHRVRMU1IsICZyZXN1bHQpIHdoZXJlIHJlc3VsdCBtYXkgYmUgYXMgYmVsb3cgKi8KKworLyogbGluZSBkaXNjaXBsaW5lcyAqLworI2RlZmluZSBOX1RUWQkJMAorI2RlZmluZSBOX1NMSVAJCTEKKyNkZWZpbmUgTl9NT1VTRQkJMgorI2RlZmluZSBOX1BQUAkJMworI2RlZmluZSBOX1NUUklQCQk0CisjZGVmaW5lIE5fQVgyNQkJNQorI2RlZmluZSBOX1gyNQkJNgkvKiBYLjI1IGFzeW5jICAqLworI2RlZmluZSBOXzZQQUNLCQk3CisjZGVmaW5lIE5fTUFTQwkJOAkvKiBNb2JpdGV4IG1vZHVsZSAgKi8KKyNkZWZpbmUgTl9SMzk2NAkJOQkvKiBTaW1hdGljIFIzOTY0IG1vZHVsZSAgKi8KKyNkZWZpbmUgTl9QUk9GSUJVU19GREwJMTAJLyogUHJvZmlidXMgICovCisjZGVmaW5lIE5fSVJEQQkJMTEJLyogTGludXggSVIgICovCisjZGVmaW5lIE5fU01TQkxPQ0sJMTIJLyogU01TIGJsb2NrIG1vZGUgICovCisjZGVmaW5lIE5fSERMQwkJMTMJLyogc3luY2hyb25vdXMgSERMQyAgKi8KKyNkZWZpbmUgTl9TWU5DX1BQUAkxNAkvKiBzeW5jaHJvbm91cyBQUFAgICovCisjZGVmaW5lCU5fSENJCQkxNQkvKiBCbHVldG9vdGggSENJIFVBUlQgICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pb2N0bHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2lvY3Rscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmI0YzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pb2N0bHMuaApAQCAtMCwwICsxLDEwOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfSU9DVExfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2lvY3Rscy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3lzL2lvY3RsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFVzZSB0aGUgZGVmaW5pdGlvbnMgZnJvbSB0aGUga2VybmVsIGhlYWRlciBmaWxlcy4gICovCisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCisvKiBSb3V0aW5nIHRhYmxlIGNhbGxzLiAgKi8KKyNkZWZpbmUgU0lPQ0FERFJUCTB4ODkwQgkJLyogYWRkIHJvdXRpbmcgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ0RFTFJUCTB4ODkwQwkJLyogZGVsZXRlIHJvdXRpbmcgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ1JUTVNHCTB4ODkwRAkJLyogY2FsbCB0byByb3V0aW5nIHN5c3RlbQkqLworCisvKiBTb2NrZXQgY29uZmlndXJhdGlvbiBjb250cm9scy4gKi8KKyNkZWZpbmUgU0lPQ0dJRk5BTUUJMHg4OTEwCQkvKiBnZXQgaWZhY2UgbmFtZQkJKi8KKyNkZWZpbmUgU0lPQ1NJRkxJTksJMHg4OTExCQkvKiBzZXQgaWZhY2UgY2hhbm5lbAkJKi8KKyNkZWZpbmUgU0lPQ0dJRkNPTkYJMHg4OTEyCQkvKiBnZXQgaWZhY2UgbGlzdAkJKi8KKyNkZWZpbmUgU0lPQ0dJRkZMQUdTCTB4ODkxMwkJLyogZ2V0IGZsYWdzCQkJKi8KKyNkZWZpbmUgU0lPQ1NJRkZMQUdTCTB4ODkxNAkJLyogc2V0IGZsYWdzCQkJKi8KKyNkZWZpbmUgU0lPQ0dJRkFERFIJMHg4OTE1CQkvKiBnZXQgUEEgYWRkcmVzcwkJKi8KKyNkZWZpbmUgU0lPQ1NJRkFERFIJMHg4OTE2CQkvKiBzZXQgUEEgYWRkcmVzcwkJKi8KKyNkZWZpbmUgU0lPQ0dJRkRTVEFERFIJMHg4OTE3CQkvKiBnZXQgcmVtb3RlIFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ1NJRkRTVEFERFIJMHg4OTE4CQkvKiBzZXQgcmVtb3RlIFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ0dJRkJSREFERFIJMHg4OTE5CQkvKiBnZXQgYnJvYWRjYXN0IFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ1NJRkJSREFERFIJMHg4OTFhCQkvKiBzZXQgYnJvYWRjYXN0IFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ0dJRk5FVE1BU0sJMHg4OTFiCQkvKiBnZXQgbmV0d29yayBQQSBtYXNrCQkqLworI2RlZmluZSBTSU9DU0lGTkVUTUFTSwkweDg5MWMJCS8qIHNldCBuZXR3b3JrIFBBIG1hc2sJCSovCisjZGVmaW5lIFNJT0NHSUZNRVRSSUMJMHg4OTFkCQkvKiBnZXQgbWV0cmljCQkJKi8KKyNkZWZpbmUgU0lPQ1NJRk1FVFJJQwkweDg5MWUJCS8qIHNldCBtZXRyaWMJCQkqLworI2RlZmluZSBTSU9DR0lGTUVNCTB4ODkxZgkJLyogZ2V0IG1lbW9yeSBhZGRyZXNzIChCU0QpCSovCisjZGVmaW5lIFNJT0NTSUZNRU0JMHg4OTIwCQkvKiBzZXQgbWVtb3J5IGFkZHJlc3MgKEJTRCkJKi8KKyNkZWZpbmUgU0lPQ0dJRk1UVQkweDg5MjEJCS8qIGdldCBNVFUgc2l6ZQkJCSovCisjZGVmaW5lIFNJT0NTSUZNVFUJMHg4OTIyCQkvKiBzZXQgTVRVIHNpemUJCQkqLworI2RlZmluZSBTSU9DU0lGTkFNRQkweDg5MjMJCS8qIHNldCBpbnRlcmZhY2UgbmFtZQkJKi8KKyNkZWZpbmUJU0lPQ1NJRkhXQUREUgkweDg5MjQJCS8qIHNldCBoYXJkd2FyZSBhZGRyZXNzIAkqLworI2RlZmluZSBTSU9DR0lGRU5DQVAJMHg4OTI1CQkvKiBnZXQvc2V0IGVuY2Fwc3VsYXRpb25zICAgICAgICovCisjZGVmaW5lIFNJT0NTSUZFTkNBUAkweDg5MjYKKyNkZWZpbmUgU0lPQ0dJRkhXQUREUgkweDg5MjcJCS8qIEdldCBoYXJkd2FyZSBhZGRyZXNzCQkqLworI2RlZmluZSBTSU9DR0lGU0xBVkUJMHg4OTI5CQkvKiBEcml2ZXIgc2xhdmluZyBzdXBwb3J0CSovCisjZGVmaW5lIFNJT0NTSUZTTEFWRQkweDg5MzAKKyNkZWZpbmUgU0lPQ0FERE1VTFRJCTB4ODkzMQkJLyogTXVsdGljYXN0IGFkZHJlc3MgbGlzdHMJKi8KKyNkZWZpbmUgU0lPQ0RFTE1VTFRJCTB4ODkzMgorI2RlZmluZSBTSU9DR0lGSU5ERVgJMHg4OTMzCQkvKiBuYW1lIC0+IGlmX2luZGV4IG1hcHBpbmcJKi8KKyNkZWZpbmUgU0lPR0lGSU5ERVgJU0lPQ0dJRklOREVYCS8qIG1pc3ByaW50IGNvbXBhdGliaWxpdHkgOi0pCSovCisjZGVmaW5lIFNJT0NTSUZQRkxBR1MJMHg4OTM0CQkvKiBzZXQvZ2V0IGV4dGVuZGVkIGZsYWdzIHNldAkqLworI2RlZmluZSBTSU9DR0lGUEZMQUdTCTB4ODkzNQorI2RlZmluZSBTSU9DRElGQUREUgkweDg5MzYJCS8qIGRlbGV0ZSBQQSBhZGRyZXNzCQkqLworI2RlZmluZQlTSU9DU0lGSFdCUk9BRENBU1QJMHg4OTM3CS8qIHNldCBoYXJkd2FyZSBicm9hZGNhc3QgYWRkcgkqLworI2RlZmluZSBTSU9DR0lGQ09VTlQJMHg4OTM4CQkvKiBnZXQgbnVtYmVyIG9mIGRldmljZXMgKi8KKworI2RlZmluZSBTSU9DR0lGQlIJMHg4OTQwCQkvKiBCcmlkZ2luZyBzdXBwb3J0CQkqLworI2RlZmluZSBTSU9DU0lGQlIJMHg4OTQxCQkvKiBTZXQgYnJpZGdpbmcgb3B0aW9ucyAJKi8KKworI2RlZmluZSBTSU9DR0lGVFhRTEVOCTB4ODk0MgkJLyogR2V0IHRoZSB0eCBxdWV1ZSBsZW5ndGgJKi8KKyNkZWZpbmUgU0lPQ1NJRlRYUUxFTgkweDg5NDMJCS8qIFNldCB0aGUgdHggcXVldWUgbGVuZ3RoIAkqLworCisKKy8qIEFSUCBjYWNoZSBjb250cm9sIGNhbGxzLiAqLworCQkgICAgLyogIDB4ODk1MCAtIDB4ODk1MiAgKiBvYnNvbGV0ZSBjYWxscywgZG9uJ3QgcmUtdXNlICovCisjZGVmaW5lIFNJT0NEQVJQCTB4ODk1MwkJLyogZGVsZXRlIEFSUCB0YWJsZSBlbnRyeQkqLworI2RlZmluZSBTSU9DR0FSUAkweDg5NTQJCS8qIGdldCBBUlAgdGFibGUgZW50cnkJCSovCisjZGVmaW5lIFNJT0NTQVJQCTB4ODk1NQkJLyogc2V0IEFSUCB0YWJsZSBlbnRyeQkJKi8KKworLyogUkFSUCBjYWNoZSBjb250cm9sIGNhbGxzLiAqLworI2RlZmluZSBTSU9DRFJBUlAJMHg4OTYwCQkvKiBkZWxldGUgUkFSUCB0YWJsZSBlbnRyeQkqLworI2RlZmluZSBTSU9DR1JBUlAJMHg4OTYxCQkvKiBnZXQgUkFSUCB0YWJsZSBlbnRyeQkJKi8KKyNkZWZpbmUgU0lPQ1NSQVJQCTB4ODk2MgkJLyogc2V0IFJBUlAgdGFibGUgZW50cnkJCSovCisKKy8qIERyaXZlciBjb25maWd1cmF0aW9uIGNhbGxzICovCisKKyNkZWZpbmUgU0lPQ0dJRk1BUAkweDg5NzAJCS8qIEdldCBkZXZpY2UgcGFyYW1ldGVycwkqLworI2RlZmluZSBTSU9DU0lGTUFQCTB4ODk3MQkJLyogU2V0IGRldmljZSBwYXJhbWV0ZXJzCSovCisKKy8qIERMQ0kgY29uZmlndXJhdGlvbiBjYWxscyAqLworCisjZGVmaW5lIFNJT0NBRERETENJCTB4ODk4MAkJLyogQ3JlYXRlIG5ldyBETENJIGRldmljZQkqLworI2RlZmluZSBTSU9DREVMRExDSQkweDg5ODEJCS8qIERlbGV0ZSBETENJIGRldmljZQkJKi8KKworLyogRGV2aWNlIHByaXZhdGUgaW9jdGwgY2FsbHMuICAqLworCisvKiBUaGVzZSAxNiBpb2N0bHMgYXJlIGF2YWlsYWJsZSB0byBkZXZpY2VzIHZpYSB0aGUgZG9faW9jdGwoKSBkZXZpY2UKKyAgIHZlY3Rvci4gIEVhY2ggZGV2aWNlIHNob3VsZCBpbmNsdWRlIHRoaXMgZmlsZSBhbmQgcmVkZWZpbmUgdGhlc2UKKyAgIG5hbWVzIGFzIHRoZWlyIG93bi4gQmVjYXVzZSB0aGVzZSBhcmUgZGV2aWNlIGRlcGVuZGVudCBpdCBpcyBhIGdvb2QKKyAgIGlkZWEgX05PVF8gdG8gaXNzdWUgdGhlbSB0byByYW5kb20gb2JqZWN0cyBhbmQgaG9wZS4gICovCisKKyNkZWZpbmUgU0lPQ0RFVlBSSVZBVEUgCQkweDg5RjAJLyogdG8gODlGRiAqLworCisvKgorICoJVGhlc2UgMTYgaW9jdGwgY2FsbHMgYXJlIHByb3RvY29sIHByaXZhdGUKKyAqLworCisjZGVmaW5lIFNJT0NQUk9UT1BSSVZBVEUgMHg4OUUwIC8qIHRvIDg5RUYgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2lwYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhMDQzZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2lwYy5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfSVBDX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9pcGMuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9pcGMuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogTW9kZSBiaXRzIGZvciBgbXNnZ2V0JywgYHNlbWdldCcsIGFuZCBgc2htZ2V0Jy4gICovCisjZGVmaW5lIElQQ19DUkVBVAkwMTAwMAkJLyogQ3JlYXRlIGtleSBpZiBrZXkgZG9lcyBub3QgZXhpc3QuICovCisjZGVmaW5lIElQQ19FWENMCTAyMDAwCQkvKiBGYWlsIGlmIGtleSBleGlzdHMuICAqLworI2RlZmluZSBJUENfTk9XQUlUCTA0MDAwCQkvKiBSZXR1cm4gZXJyb3Igb24gd2FpdC4gICovCisKKy8qIENvbnRyb2wgY29tbWFuZHMgZm9yIGBtc2djdGwnLCBgc2VtY3RsJywgYW5kIGBzaG1jdGwnLiAgKi8KKyNkZWZpbmUgSVBDX1JNSUQJMAkJLyogUmVtb3ZlIGlkZW50aWZpZXIuICAqLworI2RlZmluZSBJUENfU0VUCQkxCQkvKiBTZXQgYGlwY19wZXJtJyBvcHRpb25zLiAgKi8KKyNkZWZpbmUgSVBDX1NUQVQJMgkJLyogR2V0IGBpcGNfcGVybScgb3B0aW9ucy4gICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBJUENfSU5GTwkzCQkvKiBTZWUgaXBjcy4gICovCisjZW5kaWYKKworLyogU3BlY2lhbCBrZXkgdmFsdWVzLiAgKi8KKyNkZWZpbmUgSVBDX1BSSVZBVEUJKChfX2tleV90KSAwKQkvKiBQcml2YXRlIGtleS4gICovCisKKworLyogRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBwYXNzIHBlcm1pc3Npb24gaW5mb3JtYXRpb24gdG8gSVBDIG9wZXJhdGlvbnMuICAqLworc3RydWN0IGlwY19wZXJtCisgIHsKKyAgICBfX2tleV90IF9fa2V5OwkJCS8qIEtleS4gICovCisgICAgX191aWRfdCB1aWQ7CQkJLyogT3duZXIncyB1c2VyIElELiAgKi8KKyAgICBfX2dpZF90IGdpZDsJCQkvKiBPd25lcidzIGdyb3VwIElELiAgKi8KKyAgICBfX3VpZF90IGN1aWQ7CQkJLyogQ3JlYXRvcidzIHVzZXIgSUQuICAqLworICAgIF9fZ2lkX3QgY2dpZDsJCQkvKiBDcmVhdG9yJ3MgZ3JvdXAgSUQuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBtb2RlOwkJLyogUmVhZC93cml0ZSBwZXJtaXNzaW9uLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19wYWQxOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3NlcTsJCS8qIFNlcXVlbmNlIG51bWJlci4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fcGFkMjsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDE7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQyOworICB9OwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaXBjdHlwZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2lwY3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4Y2ExZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2lwY3R5cGVzLmgKQEAgLTAsMCArMSwzNyBAQAorLyogYml0cy9pcGN0eXBlcy5oIC0tIERlZmluZSBzb21lIHR5cGVzIHVzZWQgYnkgU3lzViBJUEMvTVNHL1NITS4gIEdlbmVyaWMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBOZXZlciBpbmNsdWRlIDxiaXRzL2lwY3R5cGVzLmg+IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX0JJVFNfSVBDVFlQRVNfSAorI2RlZmluZSBfQklUU19JUENUWVBFU19ICTEKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogVXNlZCBpbiBgc3RydWN0IHNobWlkX2RzJy4gICovCisjIGlmIF9fV09SRFNJWkUgPT0gMzIKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IF9faXBjX3BpZF90OworIyBlbHNlCit0eXBlZGVmIGludCBfX2lwY19waWRfdDsKKyMgZW5kaWYKKworCisjZW5kaWYgLyogYml0cy9pcGN0eXBlcy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9saWJjLWxvY2suaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2xpYmMtbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOGY5NTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9saWJjLWxvY2suaApAQCAtMCwwICsxLDY1OSBAQAorLyogbGliYy1pbnRlcm5hbCBpbnRlcmZhY2UgZm9yIG11dGV4IGxvY2tzLiAgTlBUTCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDMsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfQklUU19MSUJDX0xPQ0tfSAorI2RlZmluZSBfQklUU19MSUJDX0xPQ0tfSCAxCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZGVmaW5lIF9fbmVlZF9OVUxMCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKworLyogRm9ydHVuYXRlbHkgTGludXggbm93IGhhcyBhIG1lYW4gdG8gZG8gbG9ja2luZyB3aGljaCBpcyByZWFsdGltZQorICAgc2FmZSB3aXRob3V0IHRoZSBhaWQgb2YgdGhlIHRocmVhZCBsaWJyYXJ5LiAgV2UgYWxzbyBuZWVkIG5vIGZhbmN5CisgICBvcHRpb25zIGxpa2UgZXJyb3IgY2hlY2tpbmcgbXV0ZXhlcyBldGMuICBXZSBvbmx5IG5lZWQgc2ltcGxlCisgICBsb2NrcywgbWF5YmUgcmVjdXJzaXZlLiAgVGhpcyBjYW4gYmUgZWFzaWx5IGFuZCBjaGVhcGx5IGltcGxlbWVudGVkCisgICB1c2luZyBmdXRleGVzLiAgV2Ugd2lsbCB1c2UgdGhlbSBldmVyeXdoZXJlIGV4Y2VwdCBpbiBsZC5zbyBzaW5jZQorICAgbGQuc28gbWlnaHQgYmUgdXNlZCBvbiBvbGQga2VybmVscyB3aXRoIGEgZGlmZmVyZW50IGxpYmMuc28uICAqLworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxvd2xldmVsbG9jay5oPgorIyBpbmNsdWRlIDx0bHMuaD4KKyMgaW5jbHVkZSA8cHRocmVhZC1mdW5jdGlvbnMuaD4KKyMgaW5jbHVkZSA8ZXJybm8uaD4gLyogRm9yIEVCVVNZLiAgKi8KKyMgaW5jbHVkZSA8Z251L29wdGlvbi1ncm91cHMuaD4gLyogRm9yIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TLiAgKi8KKyNlbmRpZgorCisvKiBNdXRleCB0eXBlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgX0lPX01UU0FGRV9JTworIyBpZiAoZGVmaW5lZCBOT1RfSU5fbGliYyAmJiAhZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKSB8fCAhZGVmaW5lZCBfTElCQwordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgX19saWJjX2xvY2tfdDsKK3R5cGVkZWYgc3RydWN0IHsgcHRocmVhZF9tdXRleF90IG11dGV4OyB9IF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90OworIyBlbHNlCit0eXBlZGVmIGludCBfX2xpYmNfbG9ja190OwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQgbG9jazsgaW50IGNudDsgdm9pZCAqb3duZXI7IH0gX19saWJjX2xvY2tfcmVjdXJzaXZlX3Q7CisjIGVuZGlmCit0eXBlZGVmIHN0cnVjdCB7IHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsgfSBfX3J0bGRfbG9ja19yZWN1cnNpdmVfdDsKKyMgaWZkZWYgX19VU0VfVU5JWDk4Cit0eXBlZGVmIHB0aHJlYWRfcndsb2NrX3QgX19saWJjX3J3bG9ja190OworIyBlbHNlCit0eXBlZGVmIHN0cnVjdCBfX2xpYmNfcndsb2NrX29wYXF1ZV9fIF9fbGliY19yd2xvY2tfdDsKKyMgZW5kaWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBfX2xpYmNfbG9ja19vcGFxdWVfXyBfX2xpYmNfbG9ja190OwordHlwZWRlZiBzdHJ1Y3QgX19saWJjX2xvY2tfcmVjdXJzaXZlX29wYXF1ZV9fIF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90OwordHlwZWRlZiBzdHJ1Y3QgX19saWJjX3J3bG9ja19vcGFxdWVfXyBfX2xpYmNfcndsb2NrX3Q7CisjZW5kaWYKKworLyogVHlwZSBmb3Iga2V5IHRvIHRocmVhZC1zcGVjaWZpYyBkYXRhLiAgKi8KK3R5cGVkZWYgcHRocmVhZF9rZXlfdCBfX2xpYmNfa2V5X3Q7CisKKy8qIERlZmluZSBhIGxvY2sgdmFyaWFibGUgTkFNRSB3aXRoIHN0b3JhZ2UgY2xhc3MgQ0xBU1MuICBUaGUgbG9jayBtdXN0IGJlCisgICBpbml0aWFsaXplZCB3aXRoIF9fbGliY19sb2NrX2luaXQgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIChvciBkZWZpbmUgaXQKKyAgIHdpdGggX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkLCBiZWxvdykuICBVc2UgYGV4dGVybicgZm9yIENMQVNTIHRvCisgICBkZWNsYXJlIGEgbG9jayBkZWZpbmVkIGluIGFub3RoZXIgbW9kdWxlLiAgSW4gcHVibGljIHN0cnVjdHVyZQorICAgZGVmaW5pdGlvbnMgeW91IG11c3QgdXNlIGEgcG9pbnRlciB0byB0aGUgbG9jayBzdHJ1Y3R1cmUgKGkuZS4sIE5BTUUKKyAgIGJlZ2lucyB3aXRoIGEgYConKSwgYmVjYXVzZSBpdHMgc3RvcmFnZSBzaXplIHdpbGwgbm90IGJlIGtub3duIG91dHNpZGUKKyAgIG9mIGxpYmMuICAqLworI2RlZmluZSBfX2xpYmNfbG9ja19kZWZpbmUoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja190IE5BTUU7CisjZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX3J3bG9ja190IE5BTUU7CisjZGVmaW5lIF9fbGliY19sb2NrX2RlZmluZV9yZWN1cnNpdmUoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja19yZWN1cnNpdmVfdCBOQU1FOworI2RlZmluZSBfX3J0bGRfbG9ja19kZWZpbmVfcmVjdXJzaXZlKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19ydGxkX2xvY2tfcmVjdXJzaXZlX3QgTkFNRTsKKworLyogRGVmaW5lIGFuIGluaXRpYWxpemVkIGxvY2sgdmFyaWFibGUgTkFNRSB3aXRoIHN0b3JhZ2UgY2xhc3MgQ0xBU1MuCisKKyAgIEZvciB0aGUgQyBsaWJyYXJ5IHdlIHRha2UgYSBkZWVwZXIgbG9vayBhdCB0aGUgaW5pdGlhbGl6ZXIuICBGb3IKKyAgIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVyby4gIFRoZXJlZm9yZQorICAgd2UgZG9uJ3QgaW5pdGlhbGl6ZSB0aGUgdmFyaWFibGUgd2hpY2ggYWxsb3dzIHB1dHRpbmcgaXQgaW50byB0aGUKKyAgIEJTUyBzZWN0aW9uLiAgKEV4Y2VwdCBvbiBQQS1SSVNDIGFuZCBvdGhlciBvZGQgYXJjaGl0ZWN0dXJlcywgd2hlcmUKKyAgIGluaXRpYWxpemVkIGxvY2tzIG11c3QgYmUgc2V0IHRvIG9uZSBkdWUgdG8gdGhlIGxhY2sgb2Ygbm9ybWFsCisgICBhdG9taWMgb3BlcmF0aW9ucy4pICovCisKKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGlmIExMTF9MT0NLX0lOSVRJQUxJWkVSID09IDAKKyMgIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja190IE5BTUU7CisjIGVsc2UKKyMgIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja190IE5BTUUgPSBMTExfTE9DS19JTklUSUFMSVpFUjsKKyMgZW5kaWYKKyNlbHNlCisjIGlmIF9fTFRfU1BJTkxPQ0tfSU5JVCA9PSAwCisjICBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfdCBOQU1FOworIyBlbHNlCisjICBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfdCBOQU1FID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX3J3bG9ja190IE5BTUUgPSBQVEhSRUFEX1JXTE9DS19JTklUSUFMSVpFUjsKKworLyogRGVmaW5lIGFuIGluaXRpYWxpemVkIHJlY3Vyc2l2ZSBsb2NrIHZhcmlhYmxlIE5BTUUgd2l0aCBzdG9yYWdlCisgICBjbGFzcyBDTEFTUy4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBpZiBMTExfTE9DS19JTklUSUFMSVpFUiA9PSAwCisjICBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkX3JlY3Vyc2l2ZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90IE5BTUU7CisjIGVsc2UKKyMgIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWRfcmVjdXJzaXZlKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfcmVjdXJzaXZlX3QgTkFNRSA9IF9MSUJDX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSOworIyBlbmRpZgorIyBkZWZpbmUgX0xJQkNfTE9DS19SRUNVUlNJVkVfSU5JVElBTElaRVIgXAorICB7IExMTF9MT0NLX0lOSVRJQUxJWkVSLCAwLCBOVUxMIH0KKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWRfcmVjdXJzaXZlKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfcmVjdXJzaXZlX3QgTkFNRSA9IF9MSUJDX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSOworIyBkZWZpbmUgX0xJQkNfTE9DS19SRUNVUlNJVkVfSU5JVElBTElaRVIgXAorICB7UFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlB9CisjZW5kaWYKKworI2RlZmluZSBfX3J0bGRfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWRfcmVjdXJzaXZlKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19ydGxkX2xvY2tfcmVjdXJzaXZlX3QgTkFNRSA9IF9SVExEX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSOworI2RlZmluZSBfUlRMRF9MT0NLX1JFQ1VSU0lWRV9JTklUSUFMSVpFUiBcCisgIHtQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUH0KKworI2RlZmluZSBfX3J0bGRfbG9ja19pbml0aWFsaXplKE5BTUUpIFwKKyAgKHZvaWQpICgoTkFNRSkgPSAoX19ydGxkX2xvY2tfcmVjdXJzaXZlX3QpIF9SVExEX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSKQorCisvKiBJZiB3ZSBjaGVjayBmb3IgYSB3ZWFrbHkgcmVmZXJlbmNlZCBzeW1ib2wgYW5kIHRoZW4gcGVyZm9ybSBhCisgICBub3JtYWwganVtcCB0byBpdCB0ZSBjb2RlIGdlbmVyYXRlZCBmb3Igc29tZSBwbGF0Zm9ybXMgaW4gY2FzZSBvZgorICAgUElDIGlzIHVubmVjZXNzYXJpbHkgc2xvdy4gIFdoYXQgd291bGQgaGFwcGVuIGlzIHRoYXQgdGhlIGZ1bmN0aW9uCisgICBpcyBmaXJzdCByZWZlcmVuY2VkIGFzIGRhdGEgYW5kIHRoZW4gaXQgaXMgY2FsbGVkIGluZGlyZWN0bHkKKyAgIHRocm91Z2ggdGhlIFBMVC4gIFdlIGNhbiBtYWtlIHRoaXMgYSBkaXJlY3QganVtcC4gICovCisjaWZkZWYgX19QSUNfXworIyBkZWZpbmUgX19saWJjX21heWJlX2NhbGwoRlVOQywgQVJHUywgRUxTRSkgXAorICAoX19leHRlbnNpb25fXyAoeyBfX3R5cGVvZiAoRlVOQykgKl9mbiA9IChGVU5DKTsgXAorICAgICAgICAgICAgICAgICAgICBfZm4gIT0gTlVMTCA/ICgqX2ZuKSBBUkdTIDogRUxTRTsgfSkpCisjZWxzZQorIyBkZWZpbmUgX19saWJjX21heWJlX2NhbGwoRlVOQywgQVJHUywgRUxTRSkgXAorICAoRlVOQyAhPSBOVUxMID8gRlVOQyBBUkdTIDogRUxTRSkKKyNlbmRpZgorCisvKiBDYWxsIHRocmVhZCBmdW5jdGlvbnMgdGhyb3VnaCB0aGUgZnVuY3Rpb24gcG9pbnRlciB0YWJsZS4gICovCisjaWYgZGVmaW5lZCBTSEFSRUQgJiYgIWRlZmluZWQgTk9UX0lOX2xpYmMKKyMgZGVmaW5lIFBURkFWQUlMKE5BTUUpIF9fbGliY19wdGhyZWFkX2Z1bmN0aW9uc19pbml0CisjIGRlZmluZSBfX2xpYmNfcHRmX2NhbGwoRlVOQywgQVJHUywgRUxTRSkgXAorICAoX19saWJjX3B0aHJlYWRfZnVuY3Rpb25zX2luaXQgPyBQVEhGQ1RfQ0FMTCAocHRyXyMjRlVOQywgQVJHUykgOiBFTFNFKQorIyBkZWZpbmUgX19saWJjX3B0Zl9jYWxsX2Fsd2F5cyhGVU5DLCBBUkdTKSBcCisgIFBUSEZDVF9DQUxMIChwdHJfIyNGVU5DLCBBUkdTKQorI2Vsc2UKKyMgZGVmaW5lIFBURkFWQUlMKE5BTUUpIChOQU1FICE9IE5VTEwpCisjIGRlZmluZSBfX2xpYmNfcHRmX2NhbGwoRlVOQywgQVJHUywgRUxTRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoRlVOQywgQVJHUywgRUxTRSkKKyMgZGVmaW5lIF9fbGliY19wdGZfY2FsbF9hbHdheXMoRlVOQywgQVJHUykgXAorICBGVU5DIEFSR1MKKyNlbmRpZgorCisKKy8qIEluaXRpYWxpemUgdGhlIG5hbWVkIGxvY2sgdmFyaWFibGUsIGxlYXZpbmcgaXQgaW4gYSBjb25zaXN0ZW50LCB1bmxvY2tlZAorICAgc3RhdGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgZGVmaW5lIF9fbGliY19sb2NrX2luaXQoTkFNRSkgKChOQU1FKSA9IExMTF9MT0NLX0lOSVRJQUxJWkVSLCAwKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX2luaXQoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X2luaXQsICgmKE5BTUUpLCBOVUxMKSwgMCkKKyNlbmRpZgorI2lmIGRlZmluZWQgU0hBUkVEICYmICFkZWZpbmVkIE5PVF9JTl9saWJjCisvKiAoKE5BTUUpID0gKF9fbGliY19yd2xvY2tfdCkgUFRIUkVBRF9SV0xPQ0tfSU5JVElBTElaRVIsIDApIGlzCisgICBpbmVmZmljaWVudC4gICovCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX2luaXQoTkFNRSkgXAorICAoX19idWlsdGluX21lbXNldCAoJihOQU1FKSwgJ1wwJywgc2l6ZW9mIChOQU1FKSksIDApCisjZWxzZQorIyBkZWZpbmUgX19saWJjX3J3bG9ja19pbml0KE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9yd2xvY2tfaW5pdCwgKCYoTkFNRSksIE5VTEwpLCAwKQorI2VuZGlmCisKKy8qIFNhbWUgYXMgbGFzdCBidXQgdGhpcyB0aW1lIHdlIGluaXRpYWxpemUgYSByZWN1cnNpdmUgbXV0ZXguICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgZGVmaW5lIF9fbGliY19sb2NrX2luaXRfcmVjdXJzaXZlKE5BTUUpIFwKKyAgKChOQU1FKSA9IChfX2xpYmNfbG9ja19yZWN1cnNpdmVfdCkgX0xJQkNfTE9DS19SRUNVUlNJVkVfSU5JVElBTElaRVIsIDApCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfaW5pdF9yZWN1cnNpdmUoTkFNRSkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGlmIChfX3B0aHJlYWRfbXV0ZXhfaW5pdCAhPSBOVUxMKQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwlwdGhyZWFkX211dGV4YXR0cl90IF9fYXR0cjsJCQkJCSAgICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQgKCZfX2F0dHIpOwkJCQkgICAgICBcCisJX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlICgmX19hdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCk7ICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhfaW5pdCAoJihOQU1FKS5tdXRleCwgJl9fYXR0cik7CQkJICAgICAgXAorCV9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSAoJl9fYXR0cik7CQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBfX3J0bGRfbG9ja19pbml0X3JlY3Vyc2l2ZShOQU1FKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaWYgKF9fcHRocmVhZF9tdXRleF9pbml0ICE9IE5VTEwpCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCXB0aHJlYWRfbXV0ZXhhdHRyX3QgX19hdHRyOwkJCQkJICAgICAgXAorCV9fcHRocmVhZF9tdXRleGF0dHJfaW5pdCAoJl9fYXR0cik7CQkJCSAgICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUgKCZfX2F0dHIsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QKTsgICAgXAorCV9fcHRocmVhZF9tdXRleF9pbml0ICgmKE5BTUUpLm11dGV4LCAmX19hdHRyKTsJCQkgICAgICBcCisJX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95ICgmX19hdHRyKTsJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyogRmluYWxpemUgdGhlIG5hbWVkIGxvY2sgdmFyaWFibGUsIHdoaWNoIG11c3QgYmUgbG9ja2VkLiAgSXQgY2Fubm90IGJlCisgICB1c2VkIGFnYWluIHVudGlsIF9fbGliY19sb2NrX2luaXQgaXMgY2FsbGVkIGFnYWluIG9uIGl0LiAgVGhpcyBtdXN0IGJlCisgICBjYWxsZWQgb24gYSBsb2NrIHZhcmlhYmxlIGJlZm9yZSB0aGUgY29udGFpbmluZyBzdG9yYWdlIGlzIHJldXNlZC4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBkZWZpbmUgX19saWJjX2xvY2tfZmluaShOQU1FKSAoKHZvaWQpIDApCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfZmluaShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSwgKCYoTkFNRSkpLCAwKQorI2VuZGlmCisjaWYgZGVmaW5lZCBTSEFSRUQgJiYgIWRlZmluZWQgTk9UX0lOX2xpYmMKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfZmluaShOQU1FKSAoKHZvaWQpIDApCisjZWxzZQorIyBkZWZpbmUgX19saWJjX3J3bG9ja19maW5pKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveSwgKCYoTkFNRSkpLCAwKQorI2VuZGlmCisKKy8qIEZpbmFsaXplIHJlY3Vyc2l2ZSBuYW1lZCBsb2NrLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGRlZmluZSBfX2xpYmNfbG9ja19maW5pX3JlY3Vyc2l2ZShOQU1FKSAoKHZvaWQpIDApCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfZmluaV9yZWN1cnNpdmUoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X2Rlc3Ryb3ksICgmKE5BTUUpKSwgMCkKKyNlbmRpZgorCisvKiBMb2NrIHRoZSBuYW1lZCBsb2NrIHZhcmlhYmxlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEKKy8qIEVHTElCQzogRGVjbGFyZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBhIGJpZyBtYWNybyBpZiBlaXRoZXIKKyAgICFfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyBvciB3ZSBhcmUgdXNpbmcgYSBiYWNrIGRvb3IgZnJvbQorICAgc21hbGwtbWFjcm9zLWZucy5jIChfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyA9PSAyKS4gICovCitleHRlcm4gdm9pZCBfX2xpYmNfbG9ja19sb2NrX2ZuIChfX2xpYmNfbG9ja190ICopOworbGliY19oaWRkZW5fcHJvdG8gKF9fbGliY19sb2NrX2xvY2tfZm4pOworIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAhPSAxICovCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TCisjIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrKE5BTUUpIFwKKyAgKHsgbGxsX2xvY2sgKE5BTUUsIExMTF9QUklWQVRFKTsgMDsgfSkKKyMgZWxzZQorIyAgZGVmaW5lIF9fbGliY19sb2NrX2xvY2soTkFNRSkJCVwKKyAgX19saWJjX2xvY2tfbG9ja19mbiAoJihOQU1FKSkKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgKi8KKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF9sb2NrLCAoJihOQU1FKSksIDApCisjZW5kaWYKKyNkZWZpbmUgX19saWJjX3J3bG9ja19yZGxvY2soTkFNRSkgXAorICBfX2xpYmNfcHRmX2NhbGwgKF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrLCAoJihOQU1FKSksIDApCisjZGVmaW5lIF9fbGliY19yd2xvY2tfd3Jsb2NrKE5BTUUpIFwKKyAgX19saWJjX3B0Zl9jYWxsIChfX3B0aHJlYWRfcndsb2NrX3dybG9jaywgKCYoTkFNRSkpLCAwKQorCisvKiBMb2NrIHRoZSByZWN1cnNpdmUgbmFtZWQgbG9jayB2YXJpYWJsZS4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAhPSAxCisvKiBFR0xJQkM6IERlY2xhcmUgd3JhcHBlciBmdW5jdGlvbiBmb3IgYSBiaWcgbWFjcm8gaWYgZWl0aGVyCisgICAhX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1Mgb3Igd2UgYXJlIHVzaW5nIGEgYmFjayBkb29yIGZyb20KKyAgIHNtYWxsLW1hY3Jvcy1mbnMuYyAoX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgPT0gMikuICAqLworZXh0ZXJuIHZvaWQgX19saWJjX2xvY2tfbG9ja19yZWN1cnNpdmVfZm4gKF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90ICopOworbGliY19oaWRkZW5fcHJvdG8gKF9fbGliY19sb2NrX2xvY2tfcmVjdXJzaXZlX2ZuKTsKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMSAqLworIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUworIyBkZWZpbmUgX19saWJjX2xvY2tfbG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHZvaWQgKnNlbGYgPSBUSFJFQURfU0VMRjsJCQkJCQkgICAgICBcCisgICAgaWYgKChOQU1FKS5vd25lciAhPSBzZWxmKQkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJbGxsX2xvY2sgKChOQU1FKS5sb2NrLCBMTExfUFJJVkFURSk7CQkJCSAgICAgIFwKKwkoTkFNRSkub3duZXIgPSBzZWxmOwkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgKysoTkFNRSkuY250OwkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjIGVsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX2xvY2tfcmVjdXJzaXZlKE5BTUUpCQkJCVwKKyAgX19saWJjX2xvY2tfbG9ja19yZWN1cnNpdmVfZm4gKCYoTkFNRSkpCisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICovCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfbG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X2xvY2ssICgmKE5BTUUpLm11dGV4KSwgMCkKKyNlbmRpZgorCisvKiBUcnkgdG8gbG9jayB0aGUgbmFtZWQgbG9jayB2YXJpYWJsZS4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAhPSAxCisvKiBFR0xJQkM6IERlY2xhcmUgd3JhcHBlciBmdW5jdGlvbiBmb3IgYSBiaWcgbWFjcm8gaWYgZWl0aGVyCisgICAhX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1Mgb3Igd2UgYXJlIHVzaW5nIGEgYmFjayBkb29yIGZyb20KKyAgIHNtYWxsLW1hY3Jvcy1mbnMuYyAoX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgPT0gMikuICAqLworZXh0ZXJuIGludCBfX2xpYmNfbG9ja190cnlsb2NrX2ZuIChfX2xpYmNfbG9ja190ICopOworbGliY19oaWRkZW5fcHJvdG8gKF9fbGliY19sb2NrX3RyeWxvY2tfZm4pOworIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAhPSAxICovCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TCisjIGRlZmluZSBfX2xpYmNfbG9ja190cnlsb2NrKE5BTUUpIFwKKyAgbGxsX3RyeWxvY2sgKE5BTUUpCisjIGVsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX3RyeWxvY2soTkFNRSkgXAorICBfX2xpYmNfbG9ja190cnlsb2NrX2ZuICgmKE5BTUUpKQorIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAqLworI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX3RyeWxvY2soTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X3RyeWxvY2ssICgmKE5BTUUpKSwgMCkKKyNlbmRpZgorI2RlZmluZSBfX2xpYmNfcndsb2NrX3RyeXJkbG9jayhOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaywgKCYoTkFNRSkpLCAwKQorI2RlZmluZSBfX2xpYmNfcndsb2NrX3RyeXdybG9jayhOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jaywgKCYoTkFNRSkpLCAwKQorCisvKiBUcnkgdG8gbG9jayB0aGUgcmVjdXJzaXZlIG5hbWVkIGxvY2sgdmFyaWFibGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMQorLyogRUdMSUJDOiBEZWNsYXJlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGEgYmlnIG1hY3JvIGlmIGVpdGhlcgorICAgIV9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TIG9yIHdlIGFyZSB1c2luZyBhIGJhY2sgZG9vciBmcm9tCisgICBzbWFsbC1tYWNyb3MtZm5zLmMgKF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TID09IDIpLiAgKi8KK2V4dGVybiBpbnQgX19saWJjX2xvY2tfdHJ5bG9ja19yZWN1cnNpdmVfZm4gKF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90ICopOworbGliY19oaWRkZW5fcHJvdG8gKF9fbGliY19sb2NrX3RyeWxvY2tfcmVjdXJzaXZlX2ZuKTsKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMSAqLworIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUworIyBkZWZpbmUgX19saWJjX2xvY2tfdHJ5bG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICAoewkJCQkJCQkJCSAgICAgIFwKKyAgICBpbnQgcmVzdWx0ID0gMDsJCQkJCQkJICAgICAgXAorICAgIHZvaWQgKnNlbGYgPSBUSFJFQURfU0VMRjsJCQkJCQkgICAgICBcCisgICAgaWYgKChOQU1FKS5vd25lciAhPSBzZWxmKQkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJaWYgKGxsbF90cnlsb2NrICgoTkFNRSkubG9jaykgPT0gMCkJCQkJICAgICAgXAorCSAgewkJCQkJCQkJICAgICAgXAorCSAgICAoTkFNRSkub3duZXIgPSBzZWxmOwkJCQkJICAgICAgXAorCSAgICAoTkFNRSkuY250ID0gMTsJCQkJCQkgICAgICBcCisJICB9CQkJCQkJCQkgICAgICBcCisJZWxzZQkJCQkJCQkJICAgICAgXAorCSAgcmVzdWx0ID0gRUJVU1k7CQkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgICBlbHNlCQkJCQkJCQkgICAgICBcCisgICAgICArKyhOQU1FKS5jbnQ7CQkJCQkJCSAgICAgIFwKKyAgICByZXN1bHQ7CQkJCQkJCQkgICAgICBcCisgIH0pCisjIGVsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX3RyeWxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX2xvY2tfdHJ5bG9ja19yZWN1cnNpdmVfZm4gKCYoTkFNRSkpCisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICovCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfdHJ5bG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X3RyeWxvY2ssICgmKE5BTUUpKSwgMCkKKyNlbmRpZgorCisjZGVmaW5lIF9fcnRsZF9sb2NrX3RyeWxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF90cnlsb2NrLCAoJihOQU1FKS5tdXRleCksIDApCisKKy8qIFVubG9jayB0aGUgbmFtZWQgbG9jayB2YXJpYWJsZS4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAhPSAxCisvKiBFR0xJQkM6IERlY2xhcmUgd3JhcHBlciBmdW5jdGlvbiBmb3IgYSBiaWcgbWFjcm8gaWYgZWl0aGVyCisgICAhX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MsIG9yIHdlIGFyZSB1c2luZyBhIGJhY2sgZG9vciBmcm9tCisgICBzbWFsbC1tYWNyb3MtZm5zLmMgKF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TID09IDIpLiAgKi8KK2V4dGVybiB2b2lkIF9fbGliY19sb2NrX3VubG9ja19mbiAoX19saWJjX2xvY2tfdCAqKTsKK2xpYmNfaGlkZGVuX3Byb3RvIChfX2xpYmNfbG9ja191bmxvY2tfZm4pOworIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAhPSAxICovCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TCisjIGRlZmluZSBfX2xpYmNfbG9ja191bmxvY2soTkFNRSkgXAorICBsbGxfdW5sb2NrIChOQU1FLCBMTExfUFJJVkFURSkKKyMgZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfdW5sb2NrKE5BTUUpIFwKKyAgX19saWJjX2xvY2tfdW5sb2NrX2ZuICgmKE5BTUUpKQorIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAqLworI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX3VubG9jayhOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCAoJihOQU1FKSksIDApCisjZW5kaWYKKyNkZWZpbmUgX19saWJjX3J3bG9ja191bmxvY2soTkFNRSkgXAorICBfX2xpYmNfcHRmX2NhbGwgKF9fcHRocmVhZF9yd2xvY2tfdW5sb2NrLCAoJihOQU1FKSksIDApCisKKy8qIFVubG9jayB0aGUgcmVjdXJzaXZlIG5hbWVkIGxvY2sgdmFyaWFibGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMQorLyogRUdMSUJDOiBEZWNsYXJlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGEgYmlnIG1hY3JvIGlmIGVpdGhlcgorICAgIV9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TLCBvciB3ZSBhcmUgdXNpbmcgYSBiYWNrIGRvb3IgZnJvbQorICAgc21hbGwtbWFjcm9zLWZucy5jIChfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyA9PSAyKS4gICovCitleHRlcm4gdm9pZCBfX2xpYmNfbG9ja191bmxvY2tfcmVjdXJzaXZlX2ZuIChfX2xpYmNfbG9ja19yZWN1cnNpdmVfdCAqKTsKK2xpYmNfaGlkZGVuX3Byb3RvIChfX2xpYmNfbG9ja191bmxvY2tfcmVjdXJzaXZlX2ZuKTsKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMSAqLworIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUworLyogV2UgZG8gbm8gZXJyb3IgY2hlY2tpbmcgaGVyZS4gICovCisjIGRlZmluZSBfX2xpYmNfbG9ja191bmxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBpZiAoLS0oTkFNRSkuY250ID09IDApCQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwkoTkFNRSkub3duZXIgPSBOVUxMOwkJCQkJCSAgICAgIFwKKwlsbGxfdW5sb2NrICgoTkFNRSkubG9jaywgTExMX1BSSVZBVEUpOwkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorIyBlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja191bmxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZV9mbiAoJihOQU1FKSkKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgKi8KKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja191bmxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF91bmxvY2ssICgmKE5BTUUpKSwgMCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfTElCQyAmJiBkZWZpbmVkIFNIQVJFRAorIyBkZWZpbmUgX19ydGxkX2xvY2tfZGVmYXVsdF9sb2NrX3JlY3Vyc2l2ZShsb2NrKSBcCisgICsrKChwdGhyZWFkX211dGV4X3QgKikobG9jaykpLT5fX2RhdGEuX19jb3VudDsKKworIyBkZWZpbmUgX19ydGxkX2xvY2tfZGVmYXVsdF91bmxvY2tfcmVjdXJzaXZlKGxvY2spIFwKKyAgLS0oKHB0aHJlYWRfbXV0ZXhfdCAqKShsb2NrKSktPl9fZGF0YS5fX2NvdW50OworCisjIGRlZmluZSBfX3J0bGRfbG9ja19sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIEdMKGRsX3J0bGRfbG9ja19yZWN1cnNpdmUpICgmKE5BTUUpLm11dGV4KQorCisjIGRlZmluZSBfX3J0bGRfbG9ja191bmxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgR0woZGxfcnRsZF91bmxvY2tfcmVjdXJzaXZlKSAoJihOQU1FKS5tdXRleCkKKyNlbHNlCisjIGRlZmluZSBfX3J0bGRfbG9ja19sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfbG9jaywgKCYoTkFNRSkubXV0ZXgpLCAwKQorCisjIGRlZmluZSBfX3J0bGRfbG9ja191bmxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF91bmxvY2ssICgmKE5BTUUpLm11dGV4KSwgMCkKKyNlbmRpZgorCisvKiBEZWZpbmUgb25jZSBjb250cm9sIHZhcmlhYmxlLiAgKi8KKyNpZiBQVEhSRUFEX09OQ0VfSU5JVCA9PSAwCisvKiBTcGVjaWFsIGNhc2UgZm9yIHN0YXRpYyB2YXJpYWJsZXMgd2hlcmUgd2UgY2FuIGF2b2lkIHRoZSBpbml0aWFsaXphdGlvbgorICAgaWYgaXQgaXMgemVyby4gICovCisjIGRlZmluZSBfX2xpYmNfb25jZV9kZWZpbmUoQ0xBU1MsIE5BTUUpIFwKKyAgQ0xBU1MgcHRocmVhZF9vbmNlX3QgTkFNRQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19vbmNlX2RlZmluZShDTEFTUywgTkFNRSkgXAorICBDTEFTUyBwdGhyZWFkX29uY2VfdCBOQU1FID0gUFRIUkVBRF9PTkNFX0lOSVQKKyNlbmRpZgorCisvKiBDYWxsIGhhbmRsZXIgaWZmIHRoZSBmaXJzdCBjYWxsLiAgKi8KKyNkZWZpbmUgX19saWJjX29uY2UoT05DRV9DT05UUk9MLCBJTklUX0ZVTkNUSU9OKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaWYgKFBURkFWQUlMIChfX3B0aHJlYWRfb25jZSkpCQkJCQkgICAgICBcCisgICAgICBfX2xpYmNfcHRmX2NhbGxfYWx3YXlzIChfX3B0aHJlYWRfb25jZSwgKCYoT05DRV9DT05UUk9MKSwJCSAgICAgIFwKKwkJCQkJICAgICAgIElOSVRfRlVOQ1RJT04pKTsJCSAgICAgIFwKKyAgICBlbHNlIGlmICgoT05DRV9DT05UUk9MKSA9PSBQVEhSRUFEX09OQ0VfSU5JVCkgewkJCSAgICAgIFwKKyAgICAgIElOSVRfRlVOQ1RJT04gKCk7CQkJCQkJCSAgICAgIFwKKyAgICAgIChPTkNFX0NPTlRST0wpIHw9IDI7CQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworLyogTm90ZSB0aGF0IGZvciBJL08gY2xlYW51cCBoYW5kbGluZyB3ZSBhcmUgdXNpbmcgdGhlIG9sZC1zdHlsZQorICAgY2FuY2VsIGhhbmRsaW5nLiAgSXQgZG9lcyBub3QgaGF2ZSB0byBiZSBpbnRlZ3JhdGVkIHdpdGggQysrIHNuY2UKKyAgIG5vIEMrKyBjb2RlIGlzIGNhbGxlZCBpbiB0aGUgbWlkZGxlLiAgVGhlIG9sZC1zdHlsZSBoYW5kbGluZyBpcworICAgZmFzdGVyIGFuZCB0aGUgc3VwcG9ydCBpcyBub3QgZ29pbmcgYXdheS4gICovCitleHRlcm4gdm9pZCBfcHRocmVhZF9jbGVhbnVwX3B1c2ggKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqcm91dGluZSkgKHZvaWQgKiksIHZvaWQgKmFyZyk7CitleHRlcm4gdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcCAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4ZWN1dGUpOworZXh0ZXJuIHZvaWQgX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyIChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnJvdXRpbmUpICh2b2lkICopLCB2b2lkICphcmcpOworZXh0ZXJuIHZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZSAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhlY3V0ZSk7CisKKy8qIFN0YXJ0IGNyaXRpY2FsIHJlZ2lvbiB3aXRoIGNsZWFudXAuICAqLworI2RlZmluZSBfX2xpYmNfY2xlYW51cF9yZWdpb25fc3RhcnQoRE9JVCwgRkNULCBBUkcpIFwKKyAgeyBzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgX2J1ZmZlcjsJCQkJICAgICAgXAorICAgIGludCBfYXZhaWw7CQkJCQkJCQkgICAgICBcCisgICAgaWYgKERPSVQpIHsJCQkJCQkJCSAgICAgIFwKKyAgICAgIF9hdmFpbCA9IFBURkFWQUlMIChfcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIpOwkJCSAgICAgIFwKKyAgICAgIGlmIChfYXZhaWwpIHsJCQkJCQkJICAgICAgXAorCV9fbGliY19wdGZfY2FsbF9hbHdheXMgKF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlciwgKCZfYnVmZmVyLCBGQ1QsICBcCisJCQkJCQkJICAgICAgQVJHKSk7CSAgICAgIFwKKyAgICAgIH0gZWxzZSB7CQkJCQkJCQkgICAgICBcCisJX2J1ZmZlci5fX3JvdXRpbmUgPSAoRkNUKTsJCQkJCSAgICAgIFwKKwlfYnVmZmVyLl9fYXJnID0gKEFSRyk7CQkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgICB9IGVsc2UgewkJCQkJCQkJICAgICAgXAorICAgICAgX2F2YWlsID0gMDsJCQkJCQkJICAgICAgXAorICAgIH0KKworLyogRW5kIGNyaXRpY2FsIHJlZ2lvbiB3aXRoIGNsZWFudXAuICAqLworI2RlZmluZSBfX2xpYmNfY2xlYW51cF9yZWdpb25fZW5kKERPSVQpIFwKKyAgICBpZiAoX2F2YWlsKSB7CQkJCQkJCSAgICAgIFwKKyAgICAgIF9fbGliY19wdGZfY2FsbF9hbHdheXMgKF9wdGhyZWFkX2NsZWFudXBfcG9wX3Jlc3RvcmUsICgmX2J1ZmZlciwgRE9JVCkpO1wKKyAgICB9IGVsc2UgaWYgKERPSVQpCQkJCQkJCSAgICAgIFwKKyAgICAgIF9idWZmZXIuX19yb3V0aW5lIChfYnVmZmVyLl9fYXJnKTsJCQkJICAgICAgXAorICB9CisKKy8qIFNvbWV0aW1lcyB3ZSBoYXZlIHRvIGV4aXQgdGhlIGJsb2NrIGluIHRoZSBtaWRkbGUuICAqLworI2RlZmluZSBfX2xpYmNfY2xlYW51cF9lbmQoRE9JVCkgXAorICAgIGlmIChfYXZhaWwpIHsJCQkJCQkJICAgICAgXAorICAgICAgX19saWJjX3B0Zl9jYWxsX2Fsd2F5cyAoX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZSwgKCZfYnVmZmVyLCBET0lUKSk7XAorICAgIH0gZWxzZSBpZiAoRE9JVCkJCQkJCQkJICAgICAgXAorICAgICAgX2J1ZmZlci5fX3JvdXRpbmUgKF9idWZmZXIuX19hcmcpCisKKworLyogTm9ybWFsIGNsZWFudXAgaGFuZGxpbmcsIGJhc2VkIG9uIEMgY2xlYW51cCBhdHRyaWJ1dGUuICAqLworX19leHRlcm5faW5saW5lIHZvaWQKK19fbGliY19jbGVhbnVwX3JvdXRpbmUgKHN0cnVjdCBfX3B0aHJlYWRfY2xlYW51cF9mcmFtZSAqZikKK3sKKyAgaWYgKGYtPl9fZG9faXQpCisgICAgZi0+X19jYW5jZWxfcm91dGluZSAoZi0+X19jYW5jZWxfYXJnKTsKK30KKworI2RlZmluZSBfX2xpYmNfY2xlYW51cF9wdXNoKGZjdCwgYXJnKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgc3RydWN0IF9fcHRocmVhZF9jbGVhbnVwX2ZyYW1lIF9fY2xmcmFtZQkJCQkgICAgICBcCisgICAgICBfX2F0dHJpYnV0ZV9fICgoX19jbGVhbnVwX18gKF9fbGliY19jbGVhbnVwX3JvdXRpbmUpKSkJCSAgICAgIFwKKyAgICAgID0geyAuX19jYW5jZWxfcm91dGluZSA9IChmY3QpLCAuX19jYW5jZWxfYXJnID0gKGFyZyksCQkgICAgICBcCisgICAgICAgICAgLl9fZG9faXQgPSAxIH07CisKKyNkZWZpbmUgX19saWJjX2NsZWFudXBfcG9wKGV4ZWN1dGUpIFwKKyAgICBfX2NsZnJhbWUuX19kb19pdCA9IChleGVjdXRlKTsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBDcmVhdGUgdGhyZWFkLXNwZWNpZmljIGtleS4gICovCisjZGVmaW5lIF9fbGliY19rZXlfY3JlYXRlKEtFWSwgREVTVFJVQ1RPUikgXAorICBfX2xpYmNfcHRmX2NhbGwgKF9fcHRocmVhZF9rZXlfY3JlYXRlLCAoS0VZLCBERVNUUlVDVE9SKSwgMSkKKworLyogR2V0IHRocmVhZC1zcGVjaWZpYyBkYXRhLiAgKi8KKyNkZWZpbmUgX19saWJjX2dldHNwZWNpZmljKEtFWSkgXAorICBfX2xpYmNfcHRmX2NhbGwgKF9fcHRocmVhZF9nZXRzcGVjaWZpYywgKEtFWSksIE5VTEwpCisKKy8qIFNldCB0aHJlYWQtc3BlY2lmaWMgZGF0YS4gICovCisjZGVmaW5lIF9fbGliY19zZXRzcGVjaWZpYyhLRVksIFZBTFVFKSBcCisgIF9fbGliY19wdGZfY2FsbCAoX19wdGhyZWFkX3NldHNwZWNpZmljLCAoS0VZLCBWQUxVRSksIDApCisKKworLyogUmVnaXN0ZXIgaGFuZGxlcnMgdG8gZXhlY3V0ZSBiZWZvcmUgYW5kIGFmdGVyIGBmb3JrJy4gIE5vdGUgdGhhdCB0aGUKKyAgIGxhc3QgcGFyYW1ldGVyIGlzIE5VTEwuICBUaGUgaGFuZGxlcnMgcmVnaXN0ZXJlZCBieSB0aGUgbGliYyBhcmUKKyAgIG5ldmVyIHJlbW92ZWQgc28gdGhpcyBpcyBPSy4gICovCisjZGVmaW5lIF9fbGliY19hdGZvcmsoUFJFUEFSRSwgUEFSRU5ULCBDSElMRCkgXAorICBfX3JlZ2lzdGVyX2F0Zm9yayAoUFJFUEFSRSwgUEFSRU5ULCBDSElMRCwgTlVMTCkKK2V4dGVybiBpbnQgX19yZWdpc3Rlcl9hdGZvcmsgKHZvaWQgKCpfX3ByZXBhcmUpICh2b2lkKSwKKwkJCSAgICAgIHZvaWQgKCpfX3BhcmVudCkgKHZvaWQpLAorCQkJICAgICAgdm9pZCAoKl9fY2hpbGQpICh2b2lkKSwKKwkJCSAgICAgIHZvaWQgKl9fZHNvX2hhbmRsZSk7CisKKy8qIEZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIGJ5IHRoaXMgZmlsZSBhbmQgYXJlIGludGVybmFsIHRvIHRoZSBHTlUgQworICAgbGlicmFyeS4gICovCisKK2V4dGVybiBpbnQgX19wdGhyZWFkX211dGV4X2luaXQgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCwKKwkJCQkgX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICpfX211dGV4X2F0dHIpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF9kZXN0cm95IChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF90cnlsb2NrIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF9sb2NrIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF91bmxvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX211dGV4YXR0cl9pbml0IChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0ciwKKwkJCQkJaW50IF9fa2luZCk7CisKKyNpZmRlZiBfX1VTRV9VTklYOTgKK2V4dGVybiBpbnQgX19wdGhyZWFkX3J3bG9ja19pbml0IChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jaywKKwkJCQkgIF9fY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKl9fYXR0cik7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX3J3bG9ja19kZXN0cm95IChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jayk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX3J3bG9ja19yZGxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spOworCitleHRlcm4gaW50IF9fcHRocmVhZF9yd2xvY2tfd3Jsb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jayk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX3J3bG9ja190cnl3cmxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfcndsb2NrX3VubG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spOworI2VuZGlmCisKK2V4dGVybiBpbnQgX19wdGhyZWFkX2tleV9jcmVhdGUgKHB0aHJlYWRfa2V5X3QgKl9fa2V5LAorCQkJCSB2b2lkICgqX19kZXN0cl9mdW5jdGlvbikgKHZvaWQgKikpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9zZXRzcGVjaWZpYyAocHRocmVhZF9rZXlfdCBfX2tleSwKKwkJCQkgIF9fY29uc3Qgdm9pZCAqX19wb2ludGVyKTsKKworZXh0ZXJuIHZvaWQgKl9fcHRocmVhZF9nZXRzcGVjaWZpYyAocHRocmVhZF9rZXlfdCBfX2tleSk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX29uY2UgKHB0aHJlYWRfb25jZV90ICpfX29uY2VfY29udHJvbCwKKwkJCSAgIHZvaWQgKCpfX2luaXRfcm91dGluZSkgKHZvaWQpKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfYXRmb3JrICh2b2lkICgqX19wcmVwYXJlKSAodm9pZCksCisJCQkgICAgIHZvaWQgKCpfX3BhcmVudCkgKHZvaWQpLAorCQkJICAgICB2b2lkICgqX19jaGlsZCkgKHZvaWQpKTsKKworCisKKy8qIE1ha2UgdGhlIHB0aHJlYWQgZnVuY3Rpb25zIHdlYWsgc28gdGhhdCB3ZSBjYW4gZWxpZGUgdGhlbSBmcm9tCisgICBzaW5nbGUtdGhyZWFkZWQgcHJvY2Vzc2VzLiAgKi8KKyNpZm5kZWYgX19OT19XRUFLX1BUSFJFQURfQUxJQVNFUworIyBpZmRlZiB3ZWFrX2V4dGVybgorIyAgaWYgX0xJQkMKKyMgICBpbmNsdWRlIDxicC1zeW0uaD4KKyMgIGVsc2UKKyMgICBkZWZpbmUgQlBfU1lNKHN5bSkgc3ltCisjICBlbmRpZgord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX211dGV4X2luaXQpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX211dGV4X2Rlc3Ryb3kpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX211dGV4X2xvY2spKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX211dGV4X3RyeWxvY2spKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX211dGV4X3VubG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX2luaXQpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX3J3bG9ja19kZXN0cm95KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9yd2xvY2tfd3Jsb2NrKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9yd2xvY2tfdW5sb2NrKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9rZXlfY3JlYXRlKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9zZXRzcGVjaWZpYykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfZ2V0c3BlY2lmaWMpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX29uY2UpKQord2Vha19leHRlcm4gKF9fcHRocmVhZF9pbml0aWFsaXplKQord2Vha19leHRlcm4gKF9fcHRocmVhZF9hdGZvcmspCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZSkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChwdGhyZWFkX3NldGNhbmNlbHN0YXRlKSkKKyMgZWxzZQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX211dGV4X2luaXQKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleF9kZXN0cm95CisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhfbG9jaworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX211dGV4X3RyeWxvY2sKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleF91bmxvY2sKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleGF0dHJfaW5pdAorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95CisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX3J3bG9ja19yZGxvY2sKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfcndsb2NrX3dybG9jaworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX3J3bG9ja190cnl3cmxvY2sKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9yd2xvY2tfdW5sb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfa2V5X2NyZWF0ZQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX3NldHNwZWNpZmljCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfZ2V0c3BlY2lmaWMKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9vbmNlCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfaW5pdGlhbGl6ZQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX2F0Zm9yaworIyAgcHJhZ21hIHdlYWsgX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyCisjICBwcmFnbWEgd2VhayBfcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlCisjICBwcmFnbWEgd2VhayBwdGhyZWFkX3NldGNhbmNlbHN0YXRlCisjIGVuZGlmCisjZW5kaWYKKworI2VuZGlmCS8qIGJpdHMvbGliYy1sb2NrLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2xpYmlvLWxkYmwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2xpYmlvLWxkYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njc0YmNiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbGliaW8tbGRibC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBsaWJpbyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0lPX1NURElPX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvbGliaW8tbGRibC5oPiBkaXJlY3RseTsgdXNlIDxsaWJpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitfX0xEQkxfUkVESVJfREVDTCAoX0lPX3Zmc2NhbmYpCitfX0xEQkxfUkVESVJfREVDTCAoX0lPX3ZmcHJpbnRmKQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbGluay5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Y2M5MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9saW5rLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwOSwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfTElOS19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL2xpbmsuaD4gZGlyZWN0bHk7IHVzZSA8bGluay5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKyNpZiBfX0VMRl9OQVRJVkVfQ0xBU1MgPT0gMzIKKy8qIFJlZ2lzdGVycyBmb3IgZW50cnkgaW50byBQTFQgb24gSUEtMzIuICAqLwordHlwZWRlZiBzdHJ1Y3QgTGFfaTg2X3JlZ3MKK3sKKyAgdWludDMyX3QgbHJfZWR4OworICB1aW50MzJfdCBscl9lY3g7CisgIHVpbnQzMl90IGxyX2VheDsKKyAgdWludDMyX3QgbHJfZWJwOworICB1aW50MzJfdCBscl9lc3A7Cit9IExhX2k4Nl9yZWdzOworCisvKiBSZXR1cm4gdmFsdWVzIGZvciBjYWxscyBmcm9tIFBMVCBvbiBJQS0zMi4gICovCit0eXBlZGVmIHN0cnVjdCBMYV9pODZfcmV0dmFsCit7CisgIHVpbnQzMl90IGxydl9lYXg7CisgIHVpbnQzMl90IGxydl9lZHg7CisgIGxvbmcgZG91YmxlIGxydl9zdDA7CisgIGxvbmcgZG91YmxlIGxydl9zdDE7Cit9IExhX2k4Nl9yZXR2YWw7CisKKworX19CRUdJTl9ERUNMUworCitleHRlcm4gRWxmMzJfQWRkciBsYV9pODZfZ251X3BsdGVudGVyIChFbGYzMl9TeW0gKl9fc3ltLCB1bnNpZ25lZCBpbnQgX19uZHgsCisJCQkJICAgICAgIHVpbnRwdHJfdCAqX19yZWZjb29rLAorCQkJCSAgICAgICB1aW50cHRyX3QgKl9fZGVmY29vaywKKwkJCQkgICAgICAgTGFfaTg2X3JlZ3MgKl9fcmVncywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpfX2ZsYWdzLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpfX3N5bW5hbWUsCisJCQkJICAgICAgIGxvbmcgaW50ICpfX2ZyYW1lc2l6ZXApOworZXh0ZXJuIHVuc2lnbmVkIGludCBsYV9pODZfZ251X3BsdGV4aXQgKEVsZjMyX1N5bSAqX19zeW0sIHVuc2lnbmVkIGludCBfX25keCwKKwkJCQkJdWludHB0cl90ICpfX3JlZmNvb2ssCisJCQkJCXVpbnRwdHJfdCAqX19kZWZjb29rLAorCQkJCQljb25zdCBMYV9pODZfcmVncyAqX19pbnJlZ3MsCisJCQkJCUxhX2k4Nl9yZXR2YWwgKl9fb3V0cmVncywKKwkJCQkJY29uc3QgY2hhciAqc3ltbmFtZSk7CisKK19fRU5EX0RFQ0xTCisKKyNlbHNlCisKKy8qIFJlZ2lzdGVycyBmb3IgZW50cnkgaW50byBQTFQgb24geDg2LTY0LiAgKi8KKyMgaWYgX19HTlVDX1BSRVJFUSAoNCwwKQordHlwZWRlZiBmbG9hdCBMYV94ODZfNjRfeG1tIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSkpOwordHlwZWRlZiBmbG9hdCBMYV94ODZfNjRfeW1tCisgICAgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpLCBfX2FsaWduZWRfXyAoMTYpKSk7CisjIGVsc2UKK3R5cGVkZWYgZmxvYXQgTGFfeDg2XzY0X3htbSBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fVjRTRl9fKSkpOworIyBlbmRpZgorCit0eXBlZGVmIHVuaW9uCit7CisjIGlmIF9fR05VQ19QUkVSRVEgKDQsMCkKKyAgTGFfeDg2XzY0X3ltbSB5bW1bMl07CisjIGVuZGlmCisgIExhX3g4Nl82NF94bW0geG1tWzRdOworfSBMYV94ODZfNjRfdmVjdG9yIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXyAoMTYpKSk7CisKK3R5cGVkZWYgc3RydWN0IExhX3g4Nl82NF9yZWdzCit7CisgIHVpbnQ2NF90IGxyX3JkeDsKKyAgdWludDY0X3QgbHJfcjg7CisgIHVpbnQ2NF90IGxyX3I5OworICB1aW50NjRfdCBscl9yY3g7CisgIHVpbnQ2NF90IGxyX3JzaTsKKyAgdWludDY0X3QgbHJfcmRpOworICB1aW50NjRfdCBscl9yYnA7CisgIHVpbnQ2NF90IGxyX3JzcDsKKyAgTGFfeDg2XzY0X3htbSBscl94bW1bOF07CisgIExhX3g4Nl82NF92ZWN0b3IgbHJfdmVjdG9yWzhdOworfSBMYV94ODZfNjRfcmVnczsKKworLyogUmV0dXJuIHZhbHVlcyBmb3IgY2FsbHMgZnJvbSBQTFQgb24geDg2LTY0LiAgKi8KK3R5cGVkZWYgc3RydWN0IExhX3g4Nl82NF9yZXR2YWwKK3sKKyAgdWludDY0X3QgbHJ2X3JheDsKKyAgdWludDY0X3QgbHJ2X3JkeDsKKyAgTGFfeDg2XzY0X3htbSBscnZfeG1tMDsKKyAgTGFfeDg2XzY0X3htbSBscnZfeG1tMTsKKyAgbG9uZyBkb3VibGUgbHJ2X3N0MDsKKyAgbG9uZyBkb3VibGUgbHJ2X3N0MTsKKyAgTGFfeDg2XzY0X3ZlY3RvciBscnZfdmVjdG9yMDsKKyAgTGFfeDg2XzY0X3ZlY3RvciBscnZfdmVjdG9yMTsKK30gTGFfeDg2XzY0X3JldHZhbDsKKworCitfX0JFR0lOX0RFQ0xTCisKK2V4dGVybiBFbGY2NF9BZGRyIGxhX3g4Nl82NF9nbnVfcGx0ZW50ZXIgKEVsZjY0X1N5bSAqX19zeW0sCisJCQkJCSAgdW5zaWduZWQgaW50IF9fbmR4LAorCQkJCQkgIHVpbnRwdHJfdCAqX19yZWZjb29rLAorCQkJCQkgIHVpbnRwdHJfdCAqX19kZWZjb29rLAorCQkJCQkgIExhX3g4Nl82NF9yZWdzICpfX3JlZ3MsCisJCQkJCSAgdW5zaWduZWQgaW50ICpfX2ZsYWdzLAorCQkJCQkgIGNvbnN0IGNoYXIgKl9fc3ltbmFtZSwKKwkJCQkJICBsb25nIGludCAqX19mcmFtZXNpemVwKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbGFfeDg2XzY0X2dudV9wbHRleGl0IChFbGY2NF9TeW0gKl9fc3ltLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgX19uZHgsCisJCQkJCSAgIHVpbnRwdHJfdCAqX19yZWZjb29rLAorCQkJCQkgICB1aW50cHRyX3QgKl9fZGVmY29vaywKKwkJCQkJICAgY29uc3QgTGFfeDg2XzY0X3JlZ3MgKl9faW5yZWdzLAorCQkJCQkgICBMYV94ODZfNjRfcmV0dmFsICpfX291dHJlZ3MsCisJCQkJCSAgIGNvbnN0IGNoYXIgKl9fc3ltbmFtZSk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbG9jYWxfbGltLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9sb2NhbF9saW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjBkZjRmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbG9jYWxfbGltLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qIE1pbmltdW0gZ3VhcmFudGVlZCBtYXhpbXVtIHZhbHVlcyBmb3Igc3lzdGVtIGxpbWl0cy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5OCwyMDAwLDIwMDItMjAwNCwyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCisgICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoZSBrZXJuZWwgaGVhZGVyIHBvbGx1dGVzIHRoZSBuYW1lc3BhY2Ugd2l0aCB0aGUgTlJfT1BFTiBzeW1ib2wKKyAgIGFuZCBkZWZpbmVzIExJTktfTUFYIGFsdGhvdWdoIGZpbGVzeXN0ZW1zIGhhdmUgZGlmZmVyZW50IG1heGltYS4gIEEKKyAgIHNpbWlsYXIgdGhpbmcgaXMgdHJ1ZSBmb3IgT1BFTl9NQVg6IHRoZSBsaW1pdCBjYW4gYmUgY2hhbmdlZCBhdAorICAgcnVudGltZSBhbmQgdGhlcmVmb3JlIHRoZSBtYWNybyBtdXN0IG5vdCBiZSBkZWZpbmVkLiAgUmVtb3ZlIHRoaXMKKyAgIGFmdGVyIGluY2x1ZGluZyB0aGUgaGVhZGVyIGlmIG5lY2Vzc2FyeS4gICovCisjaWZuZGVmIE5SX09QRU4KKyMgZGVmaW5lIF9fdW5kZWZfTlJfT1BFTgorI2VuZGlmCisjaWZuZGVmIExJTktfTUFYCisjIGRlZmluZSBfX3VuZGVmX0xJTktfTUFYCisjZW5kaWYKKyNpZm5kZWYgT1BFTl9NQVgKKyMgZGVmaW5lIF9fdW5kZWZfT1BFTl9NQVgKKyNlbmRpZgorI2lmbmRlZiBBUkdfTUFYCisjIGRlZmluZSBfX3VuZGVmX0FSR19NQVgKKyNlbmRpZgorCisvKiBUaGUga2VybmVsIHNvdXJjZXMgY29udGFpbiBhIGZpbGUgd2l0aCBhbGwgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbi4gICovCisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisKKy8qIEhhdmUgdG8gcmVtb3ZlIE5SX09QRU4/ICAqLworI2lmZGVmIF9fdW5kZWZfTlJfT1BFTgorIyB1bmRlZiBOUl9PUEVOCisjIHVuZGVmIF9fdW5kZWZfTlJfT1BFTgorI2VuZGlmCisvKiBIYXZlIHRvIHJlbW92ZSBMSU5LX01BWD8gICovCisjaWZkZWYgX191bmRlZl9MSU5LX01BWAorIyB1bmRlZiBMSU5LX01BWAorIyB1bmRlZiBfX3VuZGVmX0xJTktfTUFYCisjZW5kaWYKKy8qIEhhdmUgdG8gcmVtb3ZlIE9QRU5fTUFYPyAgKi8KKyNpZmRlZiBfX3VuZGVmX09QRU5fTUFYCisjIHVuZGVmIE9QRU5fTUFYCisjIHVuZGVmIF9fdW5kZWZfT1BFTl9NQVgKKyNlbmRpZgorLyogSGF2ZSB0byByZW1vdmUgQVJHX01BWD8gICovCisjaWZkZWYgX191bmRlZl9BUkdfTUFYCisjIHVuZGVmIEFSR19NQVgKKyMgdW5kZWYgX191bmRlZl9BUkdfTUFYCisjZW5kaWYKKworLyogVGhlIG51bWJlciBvZiBkYXRhIGtleXMgcGVyIHByb2Nlc3MuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX0tFWVNfTUFYCTEyOAorLyogVGhpcyBpcyB0aGUgdmFsdWUgdGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cy4gICovCisjZGVmaW5lIFBUSFJFQURfS0VZU19NQVgJMTAyNAorCisvKiBDb250cm9sbGluZyB0aGUgaXRlcmF0aW9ucyBvZiBkZXN0cnVjdG9ycyBmb3IgdGhyZWFkLXNwZWNpZmljIGRhdGEuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX0RFU1RSVUNUT1JfSVRFUkFUSU9OUwk0CisvKiBOdW1iZXIgb2YgaXRlcmF0aW9ucyB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMuICAqLworI2RlZmluZSBQVEhSRUFEX0RFU1RSVUNUT1JfSVRFUkFUSU9OUwlfUE9TSVhfVEhSRUFEX0RFU1RSVUNUT1JfSVRFUkFUSU9OUworCisvKiBUaGUgbnVtYmVyIG9mIHRocmVhZHMgcGVyIHByb2Nlc3MuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX1RIUkVBRFNfTUFYCTY0CisvKiBXZSBoYXZlIG5vIHByZWRlZmluZWQgbGltaXQgb24gdGhlIG51bWJlciBvZiB0aHJlYWRzLiAgKi8KKyN1bmRlZiBQVEhSRUFEX1RIUkVBRFNfTUFYCisKKy8qIE1heGltdW0gYW1vdW50IGJ5IHdoaWNoIGEgcHJvY2VzcyBjYW4gZGVzY3JlYXNlIGl0cyBhc3luY2hyb25vdXMgSS9PCisgICBwcmlvcml0eSBsZXZlbC4gICovCisjZGVmaW5lIEFJT19QUklPX0RFTFRBX01BWAkyMAorCisvKiBNaW5pbXVtIHNpemUgZm9yIGEgdGhyZWFkLiAgV2UgYXJlIGZyZWUgdG8gY2hvb3NlIGEgcmVhc29uYWJsZSB2YWx1ZS4gICovCisjZGVmaW5lIFBUSFJFQURfU1RBQ0tfTUlOCTE2Mzg0CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHRpbWVyIGV4cGlyYXRpb24gb3ZlcnJ1bnMuICAqLworI2RlZmluZSBERUxBWVRJTUVSX01BWAkyMTQ3NDgzNjQ3CisKKy8qIE1heGltdW0gdHR5IG5hbWUgbGVuZ3RoLiAgKi8KKyNkZWZpbmUgVFRZX05BTUVfTUFYCQkzMgorCisvKiBNYXhpbXVtIGxvZ2luIG5hbWUgbGVuZ3RoLiAgVGhpcyBpcyBhcmJpdHJhcnkuICAqLworI2RlZmluZSBMT0dJTl9OQU1FX01BWAkJMjU2CisKKy8qIE1heGltdW0gaG9zdCBuYW1lIGxlbmd0aC4gICovCisjZGVmaW5lIEhPU1RfTkFNRV9NQVgJCTY0CisKKy8qIE1heGltdW0gbWVzc2FnZSBxdWV1ZSBwcmlvcml0eSBsZXZlbC4gICovCisjZGVmaW5lIE1RX1BSSU9fTUFYCQkzMjc2OAorCisvKiBNYXhpbXVtIHZhbHVlIHRoZSBzZW1hcGhvcmUgY2FuIGhhdmUuICAqLworI2RlZmluZSBTRU1fVkFMVUVfTUFYICAgKDIxNDc0ODM2NDcpCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9sb2NhbGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMDY0YjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9sb2NhbGUuaApAQCAtMCwwICsxLDQ0IEBACisvKiBEZWZpbml0aW9uIG9mIGxvY2FsZSBjYXRlZ29yeSBzeW1ib2wgdmFsdWVzLgorICAgQ29weXJpZ2h0IChDKSAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX0xPQ0FMRV9IICYmICFkZWZpbmVkIF9MQU5HSU5GT19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbG9jYWxlLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxsb2NhbGUuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfQklUU19MT0NBTEVfSAorI2RlZmluZSBfQklUU19MT0NBTEVfSAkxCisKK2VudW0KK3sKKyAgX19MQ19DVFlQRSA9IDAsCisgIF9fTENfTlVNRVJJQyA9IDEsCisgIF9fTENfVElNRSA9IDIsCisgIF9fTENfQ09MTEFURSA9IDMsCisgIF9fTENfTU9ORVRBUlkgPSA0LAorICBfX0xDX01FU1NBR0VTID0gNSwKKyAgX19MQ19BTEwgPSA2LAorICBfX0xDX1BBUEVSID0gNywKKyAgX19MQ19OQU1FID0gOCwKKyAgX19MQ19BRERSRVNTID0gOSwKKyAgX19MQ19URUxFUEhPTkUgPSAxMCwKKyAgX19MQ19NRUFTVVJFTUVOVCA9IDExLAorICBfX0xDX0lERU5USUZJQ0FUSU9OID0gMTIKK307CisKKyNlbmRpZgkvKiBiaXRzL2xvY2FsZS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tYXRoLWZpbml0ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbWF0aC1maW5pdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2Y0MjdjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbWF0aC1maW5pdGUuaApAQCAtMCwwICsxLDMyOSBAQAorLyogRW50cnkgcG9pbnRzIHRvIGZpbml0ZS1tYXRoLW9ubHkgY29tcGlsZXIgcnVucy4KKyAgIENvcHlyaWdodCAoQykgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTUFUSF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbWF0aC1maW5pdGUuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG1hdGguaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogYWNvcy4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChhY29zLCAoZG91YmxlKSwgX19hY29zX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGFjb3NmLCAoZmxvYXQpLCBfX2Fjb3NmX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChhY29zbCwgKGxvbmcgZG91YmxlKSwgX19hY29zbF9maW5pdGUpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorLyogYWNvc2guICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYWNvc2gsIChkb3VibGUpLCBfX2Fjb3NoX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGFjb3NoZiwgKGZsb2F0KSwgX19hY29zaGZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChhY29zaGwsIChsb25nIGRvdWJsZSksIF9fYWNvc2hsX2Zpbml0ZSk7CisjIGVuZGlmCisjZW5kaWYKKworLyogYXNpbi4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChhc2luLCAoZG91YmxlKSwgX19hc2luX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGFzaW5mLCAoZmxvYXQpLCBfX2FzaW5mX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChhc2lubCwgKGxvbmcgZG91YmxlKSwgX19hc2lubF9maW5pdGUpOworI2VuZGlmCisKKy8qIGF0YW4yLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGF0YW4yLCAoZG91YmxlLCBkb3VibGUpLCBfX2F0YW4yX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGF0YW4yZiwgKGZsb2F0LCBmbG9hdCksIF9fYXRhbjJmX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChhdGFuMmwsIChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpLAorCQkJCSAgIF9fYXRhbjJsX2Zpbml0ZSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CisvKiBhdGFuaC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChhdGFuaCwgKGRvdWJsZSksIF9fYXRhbmhfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoYXRhbmhmLCAoZmxvYXQpLCBfX2F0YW5oZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGF0YW5obCwgKGxvbmcgZG91YmxlKSwgX19hdGFuaGxfZmluaXRlKTsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBjb3NoLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGNvc2gsIChkb3VibGUpLCBfX2Nvc2hfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoY29zaGYsIChmbG9hdCksIF9fY29zaGZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGNvc2hsLCAobG9uZyBkb3VibGUpLCBfX2Nvc2hsX2Zpbml0ZSk7CisjZW5kaWYKKworLyogZXhwLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGV4cCwgKGRvdWJsZSksIF9fZXhwX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGV4cGYsIChmbG9hdCksIF9fZXhwZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoZXhwbCwgKGxvbmcgZG91YmxlKSwgX19leHBsX2Zpbml0ZSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogZXhwMTAuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoZXhwMTAsIChkb3VibGUpLCBfX2V4cDEwX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGV4cDEwZiwgKGZsb2F0KSwgX19leHAxMGZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChleHAxMGwsIChsb25nIGRvdWJsZSksIF9fZXhwMTBsX2Zpbml0ZSk7CisjIGVuZGlmCisKKy8qIHBvdzEwLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKHBvdzEwLCAoZG91YmxlKSwgX19leHAxMF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChwb3cxMGYsIChmbG9hdCksIF9fZXhwMTBmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAocG93MTBsLCAobG9uZyBkb3VibGUpLCBfX2V4cDEwbF9maW5pdGUpOworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9JU09DOTkKKy8qIGV4cDIuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoZXhwMiwgKGRvdWJsZSksIF9fZXhwMl9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChleHAyZiwgKGZsb2F0KSwgX19leHAyZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGV4cDJsLCAobG9uZyBkb3VibGUpLCBfX2V4cDJsX2Zpbml0ZSk7CisjIGVuZGlmCisjZW5kaWYKKworLyogZm1vZC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChmbW9kLCAoZG91YmxlLCBkb3VibGUpLCBfX2Ztb2RfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoZm1vZGYsIChmbG9hdCwgZmxvYXQpLCBfX2Ztb2RmX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChmbW9kbCwgKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSksCisJCQkJICAgX19mbW9kbF9maW5pdGUpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9JU09DOTkKKy8qIGh5cG90LiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGh5cG90LCAoZG91YmxlLCBkb3VibGUpLCBfX2h5cG90X2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGh5cG90ZiwgKGZsb2F0LCBmbG9hdCksIF9faHlwb3RmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoaHlwb3RsLCAobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKSwKKwkJCQkgICBfX2h5cG90bF9maW5pdGUpOworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorLyogajAuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoajAsIChkb3VibGUpLCBfX2owX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGowZiwgKGZsb2F0KSwgX19qMGZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChqMGwsIChsb25nIGRvdWJsZSksIF9fajBsX2Zpbml0ZSk7CisjIGVuZGlmCisKKy8qIHkwLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKHkwLCAoZG91YmxlKSwgX195MF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIICh5MGYsIChmbG9hdCksIF9feTBmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoeTBsLCAobG9uZyBkb3VibGUpLCBfX3kwbF9maW5pdGUpOworIyBlbmRpZgorCisvKiBqMS4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChqMSwgKGRvdWJsZSksIF9fajFfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoajFmLCAoZmxvYXQpLCBfX2oxZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGoxbCwgKGxvbmcgZG91YmxlKSwgX19qMWxfZmluaXRlKTsKKyMgZW5kaWYKKworLyogeTEuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoeTEsIChkb3VibGUpLCBfX3kxX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKHkxZiwgKGZsb2F0KSwgX195MWZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIICh5MWwsIChsb25nIGRvdWJsZSksIF9feTFsX2Zpbml0ZSk7CisjIGVuZGlmCisKKy8qIGpuLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGpuLCAoaW50LCBkb3VibGUpLCBfX2puX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGpuZiwgKGludCwgZmxvYXQpLCBfX2puZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGpubCwgKGludCwgbG9uZyBkb3VibGUpLCBfX2pubF9maW5pdGUpOworIyBlbmRpZgorCisvKiB5bi4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIICh5biwgKGludCwgZG91YmxlKSwgX195bl9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIICh5bmYsIChpbnQsIGZsb2F0KSwgX195bmZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIICh5bmwsIChpbnQsIGxvbmcgZG91YmxlKSwgX195bmxfZmluaXRlKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTUlTQworLyogbGdhbW1hX3IuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAobGdhbW1hX3IsIChkb3VibGUsIGludCAqKSwgX19sZ2FtbWFfcl9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChsZ2FtbWFmX3IsIChmbG9hdCwgaW50ICopLCBfX2xnYW1tYWZfcl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGxnYW1tYWxfciwgKGxvbmcgZG91YmxlLCBpbnQgKiksCisJCQkJICAgX19sZ2FtbWFsX3JfZmluaXRlKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKKy8qIGxnYW1tYS4gICovCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGRvdWJsZSBfX05USCAobGdhbW1hIChkb3VibGUgX19kKSkKK3sKKyMgaWZkZWYgX19VU0VfSVNPQzk5CisgIGludCBfX2xvY2FsX3NpZ25nYW0gPSAwOworICByZXR1cm4gbGdhbW1hX3IgKF9fZCwgJl9fbG9jYWxfc2lnbmdhbSk7CisjIGVsc2UKKyAgcmV0dXJuIGxnYW1tYV9yIChfX2QsICZzaWduZ2FtKTsKKyMgZW5kaWYKK30KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgZmxvYXQgX19OVEggKGxnYW1tYWYgKGZsb2F0IF9fZCkpCit7CisjIGlmZGVmIF9fVVNFX0lTT0M5OQorICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgcmV0dXJuIGxnYW1tYWZfciAoX19kLCAmX19sb2NhbF9zaWduZ2FtKTsKKyMgZWxzZQorICByZXR1cm4gbGdhbW1hZl9yIChfX2QsICZzaWduZ2FtKTsKKyMgZW5kaWYKK30KKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorX19leHRlcm5fYWx3YXlzX2lubGluZSBsb25nIGRvdWJsZSBfX05USCAobGdhbW1hbCAobG9uZyBkb3VibGUgX19kKSkKK3sKKyMgaWZkZWYgX19VU0VfSVNPQzk5CisgIGludCBfX2xvY2FsX3NpZ25nYW0gPSAwOworICByZXR1cm4gbGdhbW1hbF9yIChfX2QsICZfX2xvY2FsX3NpZ25nYW0pOworIyBlbHNlCisgIHJldHVybiBsZ2FtbWFsX3IgKF9fZCwgJnNpZ25nYW0pOworIyBlbmRpZgorfQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorLyogZ2FtbWEuICAqLworX19leHRlcm5fYWx3YXlzX2lubGluZSBkb3VibGUgX19OVEggKGdhbW1hIChkb3VibGUgX19kKSkKK3sKKyMgaWZkZWYgX19VU0VfSVNPQzk5CisgIGludCBfX2xvY2FsX3NpZ25nYW0gPSAwOworICByZXR1cm4gbGdhbW1hX3IgKF9fZCwgJl9fbG9jYWxfc2lnbmdhbSk7CisjIGVsc2UKKyAgcmV0dXJuIGxnYW1tYV9yIChfX2QsICZzaWduZ2FtKTsKKyMgZW5kaWYKK30KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgZmxvYXQgX19OVEggKGdhbW1hZiAoZmxvYXQgX19kKSkKK3sKKyMgaWZkZWYgX19VU0VfSVNPQzk5CisgIGludCBfX2xvY2FsX3NpZ25nYW0gPSAwOworICByZXR1cm4gbGdhbW1hZl9yIChfX2QsICZfX2xvY2FsX3NpZ25nYW0pOworIyBlbHNlCisgIHJldHVybiBsZ2FtbWFmX3IgKF9fZCwgJnNpZ25nYW0pOworIyBlbmRpZgorfQorIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGxvbmcgZG91YmxlIF9fTlRIIChnYW1tYWwgKGxvbmcgZG91YmxlIF9fZCkpCit7CisjICBpZmRlZiBfX1VTRV9JU09DOTkKKyAgaW50IF9fbG9jYWxfc2lnbmdhbSA9IDA7CisgIHJldHVybiBsZ2FtbWFsX3IgKF9fZCwgJl9fbG9jYWxfc2lnbmdhbSk7CisjICBlbHNlCisgIHJldHVybiBsZ2FtbWFsX3IgKF9fZCwgJnNpZ25nYW0pOworIyAgZW5kaWYKK30KKyMgZW5kaWYKKyNlbmRpZgorCisvKiBsb2cuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAobG9nLCAoZG91YmxlKSwgX19sb2dfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAobG9nZiwgKGZsb2F0KSwgX19sb2dmX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChsb2dsLCAobG9uZyBkb3VibGUpLCBfX2xvZ2xfZmluaXRlKTsKKyNlbmRpZgorCisvKiBsb2cxMC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChsb2cxMCwgKGRvdWJsZSksIF9fbG9nMTBfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAobG9nMTBmLCAoZmxvYXQpLCBfX2xvZzEwZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAobG9nMTBsLCAobG9uZyBkb3VibGUpLCBfX2xvZzEwbF9maW5pdGUpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9JU09DOTkKKy8qIGxvZzIuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAobG9nMiwgKGRvdWJsZSksIF9fbG9nMl9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChsb2cyZiwgKGZsb2F0KSwgX19sb2cyZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGxvZzJsLCAobG9uZyBkb3VibGUpLCBfX2xvZzJsX2Zpbml0ZSk7CisjIGVuZGlmCisjZW5kaWYKKworLyogcG93LiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKHBvdywgKGRvdWJsZSwgZG91YmxlKSwgX19wb3dfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAocG93ZiwgKGZsb2F0LCBmbG9hdCksIF9fcG93Zl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAocG93bCwgKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSksCisJCQkJICAgX19wb3dsX2Zpbml0ZSk7CisjZW5kaWYKKworLyogcmVtYWluZGVyLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKHJlbWFpbmRlciwgKGRvdWJsZSwgZG91YmxlKSwgX19yZW1haW5kZXJfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAocmVtYWluZGVyZiwgKGZsb2F0LCBmbG9hdCksIF9fcmVtYWluZGVyZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAocmVtYWluZGVybCwgKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSksCisJCQkJICAgX19yZW1haW5kZXJsX2Zpbml0ZSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBzY2FsYi4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChzY2FsYiwgKGRvdWJsZSwgZG91YmxlKSwgX19zY2FsYl9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChzY2FsYmYsIChmbG9hdCwgZmxvYXQpLCBfX3NjYWxiZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKHNjYWxibCwgKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSksCisJCQkJICAgX19zY2FsYmxfZmluaXRlKTsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBzaW5oLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKHNpbmgsIChkb3VibGUpLCBfX3NpbmhfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoc2luaGYsIChmbG9hdCksIF9fc2luaGZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKHNpbmhsLCAobG9uZyBkb3VibGUpLCBfX3NpbmhsX2Zpbml0ZSk7CisjZW5kaWYKKworLyogc3FydC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChzcXJ0LCAoZG91YmxlKSwgX19zcXJ0X2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKHNxcnRmLCAoZmxvYXQpLCBfX3NxcnRmX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChzcXJ0bCwgKGxvbmcgZG91YmxlKSwgX19zcXJ0bF9maW5pdGUpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9JU09DOTkKKy8qIHRnYW1tYS4gICovCitleHRlcm4gZG91YmxlIF9fZ2FtbWFfcl9maW5pdGUgKGRvdWJsZSwgaW50ICopOworX19leHRlcm5fYWx3YXlzX2lubGluZSBkb3VibGUgX19OVEggKHRnYW1tYSAoZG91YmxlIF9fZCkpCit7CisgIGludCBfX2xvY2FsX3NpZ25nYW0gPSAwOworICBkb3VibGUgX19yZXMgPSBfX2dhbW1hX3JfZmluaXRlIChfX2QsICZfX2xvY2FsX3NpZ25nYW0pOworICByZXR1cm4gX19sb2NhbF9zaWduZ2FtIDwgMCA/IC1fX3JlcyA6IF9fcmVzOworfQorZXh0ZXJuIGZsb2F0IF9fZ2FtbWFmX3JfZmluaXRlIChmbG9hdCwgaW50ICopOworX19leHRlcm5fYWx3YXlzX2lubGluZSBmbG9hdCBfX05USCAodGdhbW1hZiAoZmxvYXQgX19kKSkKK3sKKyAgaW50IF9fbG9jYWxfc2lnbmdhbSA9IDA7CisgIGZsb2F0IF9fcmVzID0gX19nYW1tYWZfcl9maW5pdGUgKF9fZCwgJl9fbG9jYWxfc2lnbmdhbSk7CisgIHJldHVybiBfX2xvY2FsX3NpZ25nYW0gPCAwID8gLV9fcmVzIDogX19yZXM7Cit9CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX2dhbW1hbF9yX2Zpbml0ZSAobG9uZyBkb3VibGUsIGludCAqKTsKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgbG9uZyBkb3VibGUgX19OVEggKHRnYW1tYWwgKGxvbmcgZG91YmxlIF9fZCkpCit7CisgIGludCBfX2xvY2FsX3NpZ25nYW0gPSAwOworICBsb25nIGRvdWJsZSBfX3JlcyA9IF9fZ2FtbWFsX3JfZmluaXRlIChfX2QsICZfX2xvY2FsX3NpZ25nYW0pOworICByZXR1cm4gX19sb2NhbF9zaWduZ2FtIDwgMCA/IC1fX3JlcyA6IF9fcmVzOworfQorIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tYXRoY2FsbHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21hdGhjYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMjJhYmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tYXRoY2FsbHMuaApAQCAtMCwwICsxLDM2NiBAQAorLyogUHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgbWF0aCBmdW5jdGlvbnM7IGhlbHBlciBmaWxlIGZvciA8bWF0aC5oPi4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDAyLCAyMDAzLCAyMDA2LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBOT1RFOiBCZWNhdXNlIG9mIHRoZSBzcGVjaWFsIHdheSB0aGlzIGZpbGUgaXMgdXNlZCBieSA8bWF0aC5oPiwgdGhpcworICAgZmlsZSBtdXN0IE5PVCBiZSBwcm90ZWN0ZWQgZnJvbSBtdWx0aXBsZSBpbmNsdXNpb24gYXMgaGVhZGVyIGZpbGVzCisgICB1c3VhbGx5IGFyZS4KKworICAgVGhpcyBmaWxlIHByb3ZpZGVzIHByb3RvdHlwZSBkZWNsYXJhdGlvbnMgZm9yIHRoZSBtYXRoIGZ1bmN0aW9ucy4KKyAgIE1vc3QgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCB1c2luZyB0aGUgbWFjcm86CisKKyAgIF9fTUFUSENBTEwgKE5BTUUsW19yXSwgKEFSR1MuLi4pKTsKKworICAgVGhpcyBtZWFucyB0aGVyZSBpcyBhIGZ1bmN0aW9uIGBOQU1FJyByZXR1cm5pbmcgYGRvdWJsZScgYW5kIGEgZnVuY3Rpb24KKyAgIGBOQU1FZicgcmV0dXJuaW5nIGBmbG9hdCcuICBFYWNoIHBsYWNlIGBfTWRvdWJsZV8nIGFwcGVhcnMgaW4gdGhlCisgICBwcm90b3R5cGUsIHRoYXQgaXMgYWN0dWFsbHkgYGRvdWJsZScgaW4gdGhlIHByb3RvdHlwZSBmb3IgYE5BTUUnIGFuZAorICAgYGZsb2F0JyBpbiB0aGUgcHJvdG90eXBlIGZvciBgTkFNRWYnLiAgUmVlbnRyYW50IHZhcmlhbnQgZnVuY3Rpb25zIGFyZQorICAgY2FsbGVkIGBOQU1FX3InIGFuZCBgTkFNRWZfcicuCisKKyAgIEZ1bmN0aW9ucyByZXR1cm5pbmcgb3RoZXIgdHlwZXMgbGlrZSBgaW50JyBhcmUgZGVjbGFyZWQgdXNpbmcgdGhlIG1hY3JvOgorCisgICBfX01BVEhERUNMIChUWVBFLCBOQU1FLFtfcl0sIChBUkdTLi4uKSk7CisKKyAgIFRoaXMgaXMganVzdCBsaWtlIF9fTUFUSENBTEwgYnV0IGZvciBhIGZ1bmN0aW9uIHJldHVybmluZyBgVFlQRScKKyAgIGluc3RlYWQgb2YgYF9NZG91YmxlXycuICBJbiBhbGwgb2YgdGhlc2UgY2FzZXMsIHRoZXJlIGlzIHN0aWxsCisgICBib3RoIGEgYE5BTUUnIGFuZCBhIGBOQU1FZicgdGhhdCB0YWtlcyBgZmxvYXQnIGFyZ3VtZW50cy4KKworICAgTm90ZSB0aGF0IHRoZXJlIG11c3QgYmUgbm8gd2hpdGVzcGFjZSBiZWZvcmUgdGhlIGFyZ3VtZW50IHBhc3NlZCBmb3IKKyAgIE5BTUUsIHRvIG1ha2UgdG9rZW4gcGFzdGluZyB3b3JrIHdpdGggLXRyYWRpdGlvbmFsLiAgKi8KKworI2lmbmRlZiBfTUFUSF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL21hdGhjYWxscy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKy8qIFRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zLiAgKi8KKworX01kb3VibGVfQkVHSU5fTkFNRVNQQUNFCisvKiBBcmMgY29zaW5lIG9mIFguICAqLworX19NQVRIQ0FMTCAoYWNvcywsIChfTWRvdWJsZV8gX194KSk7CisvKiBBcmMgc2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGFzaW4sLCAoX01kb3VibGVfIF9feCkpOworLyogQXJjIHRhbmdlbnQgb2YgWC4gICovCitfX01BVEhDQUxMIChhdGFuLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIEFyYyB0YW5nZW50IG9mIFkvWC4gICovCitfX01BVEhDQUxMIChhdGFuMiwsIChfTWRvdWJsZV8gX195LCBfTWRvdWJsZV8gX194KSk7CisKKy8qIENvc2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGNvcywsIChfTWRvdWJsZV8gX194KSk7CisvKiBTaW5lIG9mIFguICAqLworX19NQVRIQ0FMTCAoc2luLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIFRhbmdlbnQgb2YgWC4gICovCitfX01BVEhDQUxMICh0YW4sLCAoX01kb3VibGVfIF9feCkpOworCisvKiBIeXBlcmJvbGljIGZ1bmN0aW9ucy4gICovCisKKy8qIEh5cGVyYm9saWMgY29zaW5lIG9mIFguICAqLworX19NQVRIQ0FMTCAoY29zaCwsIChfTWRvdWJsZV8gX194KSk7CisvKiBIeXBlcmJvbGljIHNpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChzaW5oLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIEh5cGVyYm9saWMgdGFuZ2VudCBvZiBYLiAgKi8KK19fTUFUSENBTEwgKHRhbmgsLCAoX01kb3VibGVfIF9feCkpOworX01kb3VibGVfRU5EX05BTUVTUEFDRQorCisjaWZkZWYgX19VU0VfR05VCisvKiBDb3NpbmUgYW5kIHNpbmUgb2YgWC4gICovCitfX01BVEhERUNMICh2b2lkLHNpbmNvcywsCisJICAgIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gKl9fc2lueCwgX01kb3VibGVfICpfX2Nvc3gpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogSHlwZXJib2xpYyBhcmMgY29zaW5lIG9mIFguICAqLworX19NQVRIQ0FMTCAoYWNvc2gsLCAoX01kb3VibGVfIF9feCkpOworLyogSHlwZXJib2xpYyBhcmMgc2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGFzaW5oLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIEh5cGVyYm9saWMgYXJjIHRhbmdlbnQgb2YgWC4gICovCitfX01BVEhDQUxMIChhdGFuaCwsIChfTWRvdWJsZV8gX194KSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworLyogRXhwb25lbnRpYWwgYW5kIGxvZ2FyaXRobWljIGZ1bmN0aW9ucy4gICovCisKK19NZG91YmxlX0JFR0lOX05BTUVTUEFDRQorLyogRXhwb25lbnRpYWwgZnVuY3Rpb24gb2YgWC4gICovCitfX01BVEhDQUxMIChleHAsLCAoX01kb3VibGVfIF9feCkpOworCisvKiBCcmVhayBWQUxVRSBpbnRvIGEgbm9ybWFsaXplZCBmcmFjdGlvbiBhbmQgYW4gaW50ZWdyYWwgcG93ZXIgb2YgMi4gICovCitfX01BVEhDQUxMIChmcmV4cCwsIChfTWRvdWJsZV8gX194LCBpbnQgKl9fZXhwb25lbnQpKTsKKworLyogWCB0aW1lcyAodHdvIHRvIHRoZSBFWFAgcG93ZXIpLiAgKi8KK19fTUFUSENBTEwgKGxkZXhwLCwgKF9NZG91YmxlXyBfX3gsIGludCBfX2V4cG9uZW50KSk7CisKKy8qIE5hdHVyYWwgbG9nYXJpdGhtIG9mIFguICAqLworX19NQVRIQ0FMTCAobG9nLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogQmFzZS10ZW4gbG9nYXJpdGhtIG9mIFguICAqLworX19NQVRIQ0FMTCAobG9nMTAsLCAoX01kb3VibGVfIF9feCkpOworCisvKiBCcmVhayBWQUxVRSBpbnRvIGludGVncmFsIGFuZCBmcmFjdGlvbmFsIHBhcnRzLiAgKi8KK19fTUFUSENBTEwgKG1vZGYsLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfICpfX2lwdHIpKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19ub25udWxsX18gKDIpKSk7CitfTWRvdWJsZV9FTkRfTkFNRVNQQUNFCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEEgZnVuY3Rpb24gbWlzc2luZyBpbiBhbGwgc3RhbmRhcmRzOiBjb21wdXRlIGV4cG9uZW50IHRvIGJhc2UgdGVuLiAgKi8KK19fTUFUSENBTEwgKGV4cDEwLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIEFub3RoZXIgbmFtZSBvY2Nhc2lvbmFsbHkgdXNlZC4gICovCitfX01BVEhDQUxMIChwb3cxMCwsIChfTWRvdWJsZV8gX194KSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJldHVybiBleHAoWCkgLSAxLiAgKi8KK19fTUFUSENBTEwgKGV4cG0xLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogUmV0dXJuIGxvZygxICsgWCkuICAqLworX19NQVRIQ0FMTCAobG9nMXAsLCAoX01kb3VibGVfIF9feCkpOworCisvKiBSZXR1cm4gdGhlIGJhc2UgMiBzaWduZWQgaW50ZWdyYWwgZXhwb25lbnQgb2YgWC4gICovCitfX01BVEhDQUxMIChsb2diLCwgKF9NZG91YmxlXyBfX3gpKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIENvbXB1dGUgYmFzZS0yIGV4cG9uZW50aWFsIG9mIFguICAqLworX19NQVRIQ0FMTCAoZXhwMiwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIENvbXB1dGUgYmFzZS0yIGxvZ2FyaXRobSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGxvZzIsLCAoX01kb3VibGVfIF9feCkpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKworLyogUG93ZXIgZnVuY3Rpb25zLiAgKi8KKworX01kb3VibGVfQkVHSU5fTkFNRVNQQUNFCisvKiBSZXR1cm4gWCB0byB0aGUgWSBwb3dlci4gICovCitfX01BVEhDQUxMIChwb3csLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworCisvKiBSZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIFguICAqLworX19NQVRIQ0FMTCAoc3FydCwsIChfTWRvdWJsZV8gX194KSk7CitfTWRvdWJsZV9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZXR1cm4gYHNxcnQoWCpYICsgWSpZKScuICAqLworX19NQVRIQ0FMTCAoaHlwb3QsLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZXR1cm4gdGhlIGN1YmUgcm9vdCBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGNicnQsLCAoX01kb3VibGVfIF9feCkpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKworLyogTmVhcmVzdCBpbnRlZ2VyLCBhYnNvbHV0ZSB2YWx1ZSwgYW5kIHJlbWFpbmRlciBmdW5jdGlvbnMuICAqLworCitfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UKKy8qIFNtYWxsZXN0IGludGVncmFsIHZhbHVlIG5vdCBsZXNzIHRoYW4gWC4gICovCitfX01BVEhDQUxMWCAoY2VpbCwsIChfTWRvdWJsZV8gX194KSwgKF9fY29uc3RfXykpOworCisvKiBBYnNvbHV0ZSB2YWx1ZSBvZiBYLiAgKi8KK19fTUFUSENBTExYIChmYWJzLCwgKF9NZG91YmxlXyBfX3gpLCAoX19jb25zdF9fKSk7CisKKy8qIExhcmdlc3QgaW50ZWdlciBub3QgZ3JlYXRlciB0aGFuIFguICAqLworX19NQVRIQ0FMTFggKGZsb29yLCwgKF9NZG91YmxlXyBfX3gpLCAoX19jb25zdF9fKSk7CisKKy8qIEZsb2F0aW5nLXBvaW50IG1vZHVsbyByZW1haW5kZXIgb2YgWC9ZLiAgKi8KK19fTUFUSENBTEwgKGZtb2QsLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworCisKKy8qIFJldHVybiAwIGlmIFZBTFVFIGlzIGZpbml0ZSBvciBOYU4sICsxIGlmIGl0CisgICBpcyArSW5maW5pdHksIC0xIGlmIGl0IGlzIC1JbmZpbml0eS4gICovCitfX01BVEhERUNMXzEgKGludCxfX2lzaW5mLCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisvKiBSZXR1cm4gbm9uemVybyBpZiBWQUxVRSBpcyBmaW5pdGUgYW5kIG5vdCBOYU4uICAqLworX19NQVRIREVDTF8xIChpbnQsX19maW5pdGUsLCAoX01kb3VibGVfIF9fdmFsdWUpKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CitfTWRvdWJsZV9FTkRfTkFNRVNQQUNFCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBSZXR1cm4gMCBpZiBWQUxVRSBpcyBmaW5pdGUgb3IgTmFOLCArMSBpZiBpdAorICAgaXMgK0luZmluaXR5LCAtMSBpZiBpdCBpcyAtSW5maW5pdHkuICAqLworX19NQVRIREVDTF8xIChpbnQsaXNpbmYsLCAoX01kb3VibGVfIF9fdmFsdWUpKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIFJldHVybiBub256ZXJvIGlmIFZBTFVFIGlzIGZpbml0ZSBhbmQgbm90IE5hTi4gICovCitfX01BVEhERUNMXzEgKGludCxmaW5pdGUsLCAoX01kb3VibGVfIF9fdmFsdWUpKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIFJldHVybiB0aGUgcmVtYWluZGVyIG9mIFgvWS4gICovCitfX01BVEhDQUxMIChkcmVtLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKKworCisvKiBSZXR1cm4gdGhlIGZyYWN0aW9uYWwgcGFydCBvZiBYIGFmdGVyIGRpdmlkaW5nIG91dCBgaWxvZ2IgKFgpJy4gICovCitfX01BVEhDQUxMIChzaWduaWZpY2FuZCwsIChfTWRvdWJsZV8gX194KSk7CisjZW5kaWYgLyogVXNlIG1pc2MuICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJldHVybiBYIHdpdGggaXRzIHNpZ25lZCBjaGFuZ2VkIHRvIFkncy4gICovCitfX01BVEhDQUxMWCAoY29weXNpZ24sLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSksIChfX2NvbnN0X18pKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJldHVybiByZXByZXNlbnRhdGlvbiBvZiBOYU4gZm9yIGRvdWJsZSB0eXBlLiAgKi8KK19fTUFUSENBTExYIChuYW4sLCAoX19jb25zdCBjaGFyICpfX3RhZ2IpLCAoX19jb25zdF9fKSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworCisvKiBSZXR1cm4gbm9uemVybyBpZiBWQUxVRSBpcyBub3QgYSBudW1iZXIuICAqLworX19NQVRIREVDTF8xIChpbnQsX19pc25hbiwsIChfTWRvdWJsZV8gX192YWx1ZSkpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBSZXR1cm4gbm9uemVybyBpZiBWQUxVRSBpcyBub3QgYSBudW1iZXIuICAqLworX19NQVRIREVDTF8xIChpbnQsaXNuYW4sLCAoX01kb3VibGVfIF9fdmFsdWUpKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIEJlc3NlbCBmdW5jdGlvbnMuICAqLworX19NQVRIQ0FMTCAoajAsLCAoX01kb3VibGVfKSk7CitfX01BVEhDQUxMIChqMSwsIChfTWRvdWJsZV8pKTsKK19fTUFUSENBTEwgKGpuLCwgKGludCwgX01kb3VibGVfKSk7CitfX01BVEhDQUxMICh5MCwsIChfTWRvdWJsZV8pKTsKK19fTUFUSENBTEwgKHkxLCwgKF9NZG91YmxlXykpOworX19NQVRIQ0FMTCAoeW4sLCAoaW50LCBfTWRvdWJsZV8pKTsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBFcnJvciBhbmQgZ2FtbWEgZnVuY3Rpb25zLiAgKi8KK19fTUFUSENBTEwgKGVyZiwsIChfTWRvdWJsZV8pKTsKK19fTUFUSENBTEwgKGVyZmMsLCAoX01kb3VibGVfKSk7CitfX01BVEhDQUxMIChsZ2FtbWEsLCAoX01kb3VibGVfKSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBUcnVlIGdhbW1hIGZ1bmN0aW9uLiAgKi8KK19fTUFUSENBTEwgKHRnYW1tYSwsIChfTWRvdWJsZV8pKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIE9ic29sZXRlIGFsaWFzIGZvciBgbGdhbW1hJy4gICovCitfX01BVEhDQUxMIChnYW1tYSwsIChfTWRvdWJsZV8pKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb24gb2YgbGdhbW1hLiAgVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBnbG9iYWwgdmFyaWFibGUKKyAgIGBzaWduZ2FtJy4gIFRoZSByZWVudHJhbnQgdmVyc2lvbiBpbnN0ZWFkIHRha2VzIGEgcG9pbnRlciBhbmQgc3RvcmVzCisgICB0aGUgdmFsdWUgdGhyb3VnaCBpdC4gICovCitfX01BVEhDQUxMIChsZ2FtbWEsX3IsIChfTWRvdWJsZV8sIGludCAqX19zaWduZ2FtcCkpOworI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJldHVybiB0aGUgaW50ZWdlciBuZWFyZXN0IFggaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUKKyAgIHByZXZhaWxpbmcgcm91bmRpbmcgbW9kZS4gICovCitfX01BVEhDQUxMIChyaW50LCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogUmV0dXJuIFggKyBlcHNpbG9uIGlmIFggPCBZLCBYIC0gZXBzaWxvbiBpZiBYID4gWS4gICovCitfX01BVEhDQUxMWCAobmV4dGFmdGVyLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpLCAoX19jb25zdF9fKSk7CisjIGlmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmICFkZWZpbmVkIF9fTERCTF9DT01QQVQKK19fTUFUSENBTExYIChuZXh0dG93YXJkLCwgKF9NZG91YmxlXyBfX3gsIGxvbmcgZG91YmxlIF9feSksIChfX2NvbnN0X18pKTsKKyMgZW5kaWYKKworLyogUmV0dXJuIHRoZSByZW1haW5kZXIgb2YgaW50ZWdlciBkaXZpc29uIFggLyBZIHdpdGggaW5maW5pdGUgcHJlY2lzaW9uLiAgKi8KK19fTUFUSENBTEwgKHJlbWFpbmRlciwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSk7CisKKyMgaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CisvKiBSZXR1cm4gWCB0aW1lcyAoMiB0byB0aGUgTnRoIHBvd2VyKS4gICovCitfX01BVEhDQUxMIChzY2FsYm4sLCAoX01kb3VibGVfIF9feCwgaW50IF9fbikpOworIyBlbmRpZgorCisvKiBSZXR1cm4gdGhlIGJpbmFyeSBleHBvbmVudCBvZiBYLCB3aGljaCBtdXN0IGJlIG5vbnplcm8uICAqLworX19NQVRIREVDTCAoaW50LGlsb2diLCwgKF9NZG91YmxlXyBfX3gpKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CisvKiBSZXR1cm4gWCB0aW1lcyAoMiB0byB0aGUgTnRoIHBvd2VyKS4gICovCitfX01BVEhDQUxMIChzY2FsYmxuLCwgKF9NZG91YmxlXyBfX3gsIGxvbmcgaW50IF9fbikpOworCisvKiBSb3VuZCBYIHRvIGludGVncmFsIHZhbHVlIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCB1c2luZyBjdXJyZW50CisgICByb3VuZGluZyBkaXJlY3Rpb24sIGJ1dCBkbyBub3QgcmFpc2UgaW5leGFjdCBleGNlcHRpb24uICAqLworX19NQVRIQ0FMTCAobmVhcmJ5aW50LCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogUm91bmQgWCB0byBuZWFyZXN0IGludGVncmFsIHZhbHVlLCByb3VuZGluZyBoYWxmd2F5IGNhc2VzIGF3YXkgZnJvbQorICAgemVyby4gICovCitfX01BVEhDQUxMWCAocm91bmQsLCAoX01kb3VibGVfIF9feCksIChfX2NvbnN0X18pKTsKKworLyogUm91bmQgWCB0byB0aGUgaW50ZWdyYWwgdmFsdWUgaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IG5lYXJlc3QgYnV0CisgICBub3QgbGFyZ2VyIGluIG1hZ25pdHVkZS4gICovCitfX01BVEhDQUxMWCAodHJ1bmMsLCAoX01kb3VibGVfIF9feCksIChfX2NvbnN0X18pKTsKKworLyogQ29tcHV0ZSByZW1haW5kZXIgb2YgWCBhbmQgWSBhbmQgcHV0IGluICpRVU8gYSB2YWx1ZSB3aXRoIHNpZ24gb2YgeC95CisgICBhbmQgbWFnbml0dWRlIGNvbmdydWVudCBgbW9kIDJebicgdG8gdGhlIG1hZ25pdHVkZSBvZiB0aGUgaW50ZWdyYWwKKyAgIHF1b3RpZW50IHgveSwgd2l0aCBuID49IDMuICAqLworX19NQVRIQ0FMTCAocmVtcXVvLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3ksIGludCAqX19xdW8pKTsKKworCisvKiBDb252ZXJzaW9uIGZ1bmN0aW9ucy4gICovCisKKy8qIFJvdW5kIFggdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZSBhY2NvcmRpbmcgdG8gY3VycmVudCByb3VuZGluZworICAgZGlyZWN0aW9uLiAgKi8KK19fTUFUSERFQ0wgKGxvbmcgaW50LGxyaW50LCwgKF9NZG91YmxlXyBfX3gpKTsKK19fTUFUSERFQ0wgKGxvbmcgbG9uZyBpbnQsbGxyaW50LCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogUm91bmQgWCB0byBuZWFyZXN0IGludGVncmFsIHZhbHVlLCByb3VuZGluZyBoYWxmd2F5IGNhc2VzIGF3YXkgZnJvbQorICAgemVyby4gICovCitfX01BVEhERUNMIChsb25nIGludCxscm91bmQsLCAoX01kb3VibGVfIF9feCkpOworX19NQVRIREVDTCAobG9uZyBsb25nIGludCxsbHJvdW5kLCwgKF9NZG91YmxlXyBfX3gpKTsKKworCisvKiBSZXR1cm4gcG9zaXRpdmUgZGlmZmVyZW5jZSBiZXR3ZWVuIFggYW5kIFkuICAqLworX19NQVRIQ0FMTCAoZmRpbSwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSk7CisKKy8qIFJldHVybiBtYXhpbXVtIG51bWVyaWMgdmFsdWUgZnJvbSBYIGFuZCBZLiAgKi8KK19fTUFUSENBTEwgKGZtYXgsLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworCisvKiBSZXR1cm4gbWluaW11bSBudW1lcmljIHZhbHVlIGZyb20gWCBhbmQgWS4gICovCitfX01BVEhDQUxMIChmbWluLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKKworCisvKiBDbGFzc2lmeSBnaXZlbiBudW1iZXIuICAqLworX19NQVRIREVDTF8xIChpbnQsIF9fZnBjbGFzc2lmeSwsIChfTWRvdWJsZV8gX192YWx1ZSkpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworLyogVGVzdCBmb3IgbmVnYXRpdmUgbnVtYmVyLiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LCBfX3NpZ25iaXQsLCAoX01kb3VibGVfIF9fdmFsdWUpKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKworLyogTXVsdGlwbHktYWRkIGZ1bmN0aW9uIGNvbXB1dGVkIGFzIGEgdGVybmFyeSBvcGVyYXRpb24uICAqLworX19NQVRIQ0FMTCAoZm1hLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3ksIF9NZG91YmxlXyBfX3opKTsKKyNlbmRpZiAvKiBVc2UgSVNPIEM5OS4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogUmV0dXJuIFggdGltZXMgKDIgdG8gdGhlIE50aCBwb3dlcikuICAqLworX19NQVRIQ0FMTCAoc2NhbGIsLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9fbikpOworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tYXRoZGVmLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tYXRoZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0NjM5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21hdGhkZWYuaApAQCAtMCwwICsxLDYyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDQsIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfTUFUSF9IICYmICFkZWZpbmVkIF9DT01QTEVYX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9tYXRoZGVmLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQiCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmIGRlZmluZWQgX01BVEhfSCAmJiAhZGVmaW5lZCBfTUFUSF9IX01BVEhERUYKKyMgZGVmaW5lIF9NQVRIX0hfTUFUSERFRgkxCisKKyMgaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjIGlmIF9fV09SRFNJWkUgPT0gNjQgfHwgKGRlZmluZWQgX19GTFRfRVZBTF9NRVRIT0RfXyAmJiBfX0ZMVF9FVkFMX01FVEhPRF9fID09IDApCisvKiBUaGUgeDg2LTY0IGFyY2hpdGVjdHVyZSBjb21wdXRlcyB2YWx1ZXMgd2l0aCB0aGUgcHJlY2lzc2lvbiBvZiB0aGUKKyAgIHVzZWQgdHlwZS4gIFNpbWlsYXJseSBmb3IgLW0zMiAtbWZwbWF0aD1zc2UuICAqLwordHlwZWRlZiBmbG9hdCBmbG9hdF90OwkJLyogYGZsb2F0JyBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGFzIGBmbG9hdCcuICAqLwordHlwZWRlZiBkb3VibGUgZG91YmxlX3Q7CS8qIGBkb3VibGUnIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQKKwkJCQkgICBhcyBgZG91YmxlJy4gICovCisjIGVsc2UKKy8qIFRoZSBpeDg3IEZQVXMgZXZhbHVhdGUgYWxsIHZhbHVlcyBpbiB0aGUgODAgYml0IGZsb2F0aW5nLXBvaW50IGZvcm1hdAorICAgd2hpY2ggaXMgYWxzbyBhdmFpbGFibGUgZm9yIHRoZSB1c2VyIGFzIGBsb25nIGRvdWJsZScuICBUaGVyZWZvcmUgd2UKKyAgIGRlZmluZTogICovCit0eXBlZGVmIGxvbmcgZG91YmxlIGZsb2F0X3Q7CS8qIGBmbG9hdCcgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBhcworCQkJCSAgIGBsb25nIGRvdWJsZScuICAqLwordHlwZWRlZiBsb25nIGRvdWJsZSBkb3VibGVfdDsJLyogYGRvdWJsZScgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBhcworCQkJCSAgIGBsb25nIGRvdWJsZScuICAqLworIyBlbmRpZgorCisvKiBUaGUgdmFsdWVzIHJldHVybmVkIGJ5IGBpbG9nYicgZm9yIDAgYW5kIE5hTiByZXNwZWN0aXZlbHkuICAqLworIyBkZWZpbmUgRlBfSUxPR0IwCSgtMjE0NzQ4MzY0NyAtIDEpCisjIGRlZmluZSBGUF9JTE9HQk5BTgkoLTIxNDc0ODM2NDcgLSAxKQorCisvKiBUaGUgR0NDIDQuNiBjb21waWxlciB3aWxsIGRlZmluZSBfX0ZQX0ZBU1RfRk1BeyxGLEx9IGlmIHRoZSBmbWF7LGYsbH0KKyAgIGJ1aWx0aW5zIGFyZSBzdXBwb3J0ZWQuICAqLworIyBpZiBfX0ZQX0ZBU1RfRk1BCisjICBkZWZpbmUgRlBfRkFTVF9GTUEgMQorIyBlbmRpZgorCisjIGlmIF9fRlBfRkFTVF9GTUFGCisjICBkZWZpbmUgRlBfRkFTVF9GTUFGIDEKKyMgZW5kaWYKKworIyBpZiBfX0ZQX0ZBU1RfRk1BTAorIyAgZGVmaW5lIEZQX0ZBU1RfRk1BTCAxCisjIGVuZGlmCisKKyNlbmRpZgkvKiBJU08gQzk5ICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tYXRoaW5saW5lLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tYXRoaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyYzFlZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21hdGhpbmxpbmUuaApAQCAtMCwwICsxLDIzNCBAQAorLyogSW5saW5lIG1hdGggZnVuY3Rpb25zIGZvciB4ODYtNjQuCisgICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCwgMjAwNywgMjAwOSwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTUFUSF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbWF0aGlubGluZS5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWZuZGVmIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKKyMgZGVmaW5lIF9fTUFUSF9JTkxJTkUgX19pbmxpbmUKKyNlbHNlCisjIGRlZmluZSBfX01BVEhfSU5MSU5FIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKKyNlbmRpZgorCisKKy8qIFRoZSBnY2MsIHZlcnNpb24gMi43IG9yIGJlbG93LCBoYXMgcHJvYmxlbXMgd2l0aCBhbGwgdGhpcyBpbmxpbmluZworICAgY29kZS4gIFNvIGRpc2FibGUgaXQgZm9yIHRoaXMgdmVyc2lvbiBvZiB0aGUgY29tcGlsZXIuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsIDgpICYmIGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKworLyogVGVzdCBmb3IgbmVnYXRpdmUgbnVtYmVyLiAgVXNlZCBpbiB0aGUgc2lnbmJpdCgpIG1hY3JvLiAgKi8KK19fTUFUSF9JTkxJTkUgaW50CitfX05USCAoX19zaWduYml0ZiAoZmxvYXQgX194KSkKK3sKKyMgaWYgX19XT1JEU0laRSA9PSAzMgorICBfX2V4dGVuc2lvbl9fIHVuaW9uIHsgZmxvYXQgX19mOyBpbnQgX19pOyB9IF9fdSA9IHsgX19mOiBfX3ggfTsKKyAgcmV0dXJuIF9fdS5fX2kgPCAwOworIyBlbHNlCisgIGludCBfX207CisgIF9fYXNtICgicG1vdm1za2IgJTEsICUwIiA6ICI9ciIgKF9fbSkgOiAieCIgKF9feCkpOworICByZXR1cm4gX19tICYgMHg4OworIyBlbmRpZgorfQorX19NQVRIX0lOTElORSBpbnQKK19fTlRIIChfX3NpZ25iaXQgKGRvdWJsZSBfX3gpKQoreworIyBpZiBfX1dPUkRTSVpFID09IDMyCisgIF9fZXh0ZW5zaW9uX18gdW5pb24geyBkb3VibGUgX19kOyBpbnQgX19pWzJdOyB9IF9fdSA9IHsgX19kOiBfX3ggfTsKKyAgcmV0dXJuIF9fdS5fX2lbMV0gPCAwOworIyBlbHNlCisgIGludCBfX207CisgIF9fYXNtICgicG1vdm1za2IgJTEsICUwIiA6ICI9ciIgKF9fbSkgOiAieCIgKF9feCkpOworICByZXR1cm4gX19tICYgMHg4MDsKKyMgZW5kaWYKK30KK19fTUFUSF9JTkxJTkUgaW50CitfX05USCAoX19zaWduYml0bCAobG9uZyBkb3VibGUgX194KSkKK3sKKyAgX19leHRlbnNpb25fXyB1bmlvbiB7IGxvbmcgZG91YmxlIF9fbDsgaW50IF9faVszXTsgfSBfX3UgPSB7IF9fbDogX194IH07CisgIHJldHVybiAoX191Ll9faVsyXSAmIDB4ODAwMCkgIT0gMDsKK30KKworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKworI2lmIChfX0dOVUNfUFJFUkVRICgyLCA4KSAmJiAhZGVmaW5lZCBfX05PX01BVEhfSU5MSU5FUyBcCisgICAgICYmIGRlZmluZWQgX19PUFRJTUlaRV9fKQorCisjIGlmZGVmIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisKKy8qIFJvdW5kIHRvIG5lYXJlc3QgaW50ZWdlci4gICovCisjICBpZiBfX1dPUkRTSVpFID09IDY0IHx8IGRlZmluZWQgX19TU0VfTUFUSF9fCitfX01BVEhfSU5MSU5FIGxvbmcgaW50CitfX05USCAobHJpbnRmIChmbG9hdCBfX3gpKQoreworICBsb25nIGludCBfX3JlczsKKyAgX19hc20gKCJjdnRzczJzaSAlMSwgJTAiIDogIj1yIiAoX19yZXMpIDogInhtIiAoX194KSk7CisgIHJldHVybiBfX3JlczsKK30KKyMgIGVuZGlmCisjICBpZiBfX1dPUkRTSVpFID09IDY0IHx8IGRlZmluZWQgX19TU0UyX01BVEhfXworX19NQVRIX0lOTElORSBsb25nIGludAorX19OVEggKGxyaW50IChkb3VibGUgX194KSkKK3sKKyAgbG9uZyBpbnQgX19yZXM7CisgIF9fYXNtICgiY3Z0c2Qyc2kgJTEsICUwIiA6ICI9ciIgKF9fcmVzKSA6ICJ4bSIgKF9feCkpOworICByZXR1cm4gX19yZXM7Cit9CisjICBlbmRpZgorIyAgaWYgX19XT1JEU0laRSA9PSA2NAorX19NQVRIX0lOTElORSBsb25nIGxvbmcgaW50CitfX05USCAobGxyaW50ZiAoZmxvYXQgX194KSkKK3sKKyAgbG9uZyBsb25nIGludCBfX3JlczsKKyAgX19hc20gKCJjdnRzczJzaSAlMSwgJTAiIDogIj1yIiAoX19yZXMpIDogInhtIiAoX194KSk7CisgIHJldHVybiBfX3JlczsKK30KK19fTUFUSF9JTkxJTkUgbG9uZyBsb25nIGludAorX19OVEggKGxscmludCAoZG91YmxlIF9feCkpCit7CisgIGxvbmcgbG9uZyBpbnQgX19yZXM7CisgIF9fYXNtICgiY3Z0c2Qyc2kgJTEsICUwIiA6ICI9ciIgKF9fcmVzKSA6ICJ4bSIgKF9feCkpOworICByZXR1cm4gX19yZXM7Cit9CisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkIF9fRklOSVRFX01BVEhfT05MWV9fICYmIF9fRklOSVRFX01BVEhfT05MWV9fID4gMCBcCisgICAgICAmJiAoX19XT1JEU0laRSA9PSA2NCB8fCBkZWZpbmVkIF9fU1NFMl9NQVRIX18pCisvKiBEZXRlcm1pbmUgbWF4aW11bSBvZiB0d28gdmFsdWVzLiAgKi8KK19fTUFUSF9JTkxJTkUgZmxvYXQKK19fTlRIIChmbWF4ZiAoZmxvYXQgX194LCBmbG9hdCBfX3kpKQoreworICBfX2FzbSAoIm1heHNzICUxLCAlMCIgOiAiK3giIChfX3gpIDogInhtIiAoX195KSk7CisgIHJldHVybiBfX3g7Cit9CitfX01BVEhfSU5MSU5FIGRvdWJsZQorX19OVEggKGZtYXggKGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpKQoreworICBfX2FzbSAoIm1heHNkICUxLCAlMCIgOiAiK3giIChfX3gpIDogInhtIiAoX195KSk7CisgIHJldHVybiBfX3g7Cit9CisKKy8qIERldGVybWluZSBtaW5pbXVtIG9mIHR3byB2YWx1ZXMuICAqLworX19NQVRIX0lOTElORSBmbG9hdAorX19OVEggKGZtaW5mIChmbG9hdCBfX3gsIGZsb2F0IF9feSkpCit7CisgIF9fYXNtICgibWluc3MgJTEsICUwIiA6ICIreCIgKF9feCkgOiAieG0iIChfX3kpKTsKKyAgcmV0dXJuIF9feDsKK30KK19fTUFUSF9JTkxJTkUgZG91YmxlCitfX05USCAoZm1pbiAoZG91YmxlIF9feCwgZG91YmxlIF9feSkpCit7CisgIF9fYXNtICgibWluc2QgJTEsICUwIiA6ICIreCIgKF9feCkgOiAieG0iIChfX3kpKTsKKyAgcmV0dXJuIF9feDsKK30KKyMgIGVuZGlmCisKK19fRU5EX05BTUVTUEFDRV9DOTkKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIF9fU1NFNF8xX18gJiYgKF9fV09SRFNJWkUgPT0gNjQgfHwgZGVmaW5lZCBfX1NTRTJfTUFUSF9fKQorIyAgaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorCisvKiBSb3VuZCB0byBuZWFyZXN0IGludGVnZXIuICAqLworX19NQVRIX0lOTElORSBkb3VibGUKK19fTlRIIChyaW50IChkb3VibGUgX194KSkKK3sKKyAgZG91YmxlIF9fcmVzOworICBfX2FzbSAoInJvdW5kc2QgJDQsICUxLCAlMCIgOiAiPXgiIChfX3JlcykgOiAieG0iIChfX3gpKTsKKyAgcmV0dXJuIF9fcmVzOworfQorX19NQVRIX0lOTElORSBmbG9hdAorX19OVEggKHJpbnRmIChmbG9hdCBfX3gpKQoreworICBmbG9hdCBfX3JlczsKKyAgX19hc20gKCJyb3VuZHNzICQ0LCAlMSwgJTAiIDogIj14IiAoX19yZXMpIDogInhtIiAoX194KSk7CisgIHJldHVybiBfX3JlczsKK30KKworIyAgIGlmZGVmIF9fVVNFX0lTT0M5OQorLyogUm91bmQgdG8gbmVhcmVzdCBpbnRlZ2VyIHdpdGhvdXQgcmFpc2luZyBpbmV4YWN0IGV4Y2VwdGlvbi4gICovCitfX01BVEhfSU5MSU5FIGRvdWJsZQorX19OVEggKG5lYXJieWludCAoZG91YmxlIF9feCkpCit7CisgIGRvdWJsZSBfX3JlczsKKyAgX19hc20gKCJyb3VuZHNkICQweGMsICUxLCAlMCIgOiAiPXgiIChfX3JlcykgOiAieG0iIChfX3gpKTsKKyAgcmV0dXJuIF9fcmVzOworfQorX19NQVRIX0lOTElORSBmbG9hdAorX19OVEggKG5lYXJieWludGYgKGZsb2F0IF9feCkpCit7CisgIGZsb2F0IF9fcmVzOworICBfX2FzbSAoInJvdW5kc3MgJDB4YywgJTEsICUwIiA6ICI9eCIgKF9fcmVzKSA6ICJ4bSIgKF9feCkpOworICByZXR1cm4gX19yZXM7Cit9CisjICAgZW5kaWYKKworX19FTkRfTkFNRVNQQUNFX0M5OQorIyAgZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBTbWFsbGVzdCBpbnRlZ3JhbCB2YWx1ZSBub3QgbGVzcyB0aGFuIFguICAqLworX19NQVRIX0lOTElORSBkb3VibGUKK19fTlRIIChjZWlsIChkb3VibGUgX194KSkKK3sKKyAgZG91YmxlIF9fcmVzOworICBfX2FzbSAoInJvdW5kc2QgJDIsICUxLCAlMCIgOiAiPXgiIChfX3JlcykgOiAieG0iIChfX3gpKTsKKyAgcmV0dXJuIF9fcmVzOworfQorX19FTkRfTkFNRVNQQUNFX1NURAorCitfX0JFR0lOX05BTUVTUEFDRV9DOTkKK19fTUFUSF9JTkxJTkUgZmxvYXQKK19fTlRIIChjZWlsZiAoZmxvYXQgX194KSkKK3sKKyAgZmxvYXQgX19yZXM7CisgIF9fYXNtICgicm91bmRzcyAkMiwgJTEsICUwIiA6ICI9eCIgKF9fcmVzKSA6ICJ4bSIgKF9feCkpOworICByZXR1cm4gX19yZXM7Cit9CitfX0VORF9OQU1FU1BBQ0VfQzk5CisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogTGFyZ2VzdCBpbnRlZ2VyIG5vdCBncmVhdGVyIHRoYW4gWC4gICovCitfX01BVEhfSU5MSU5FIGRvdWJsZQorX19OVEggKGZsb29yIChkb3VibGUgX194KSkKK3sKKyAgZG91YmxlIF9fcmVzOworICBfX2FzbSAoInJvdW5kc2QgJDEsICUxLCAlMCIgOiAiPXgiIChfX3JlcykgOiAieG0iIChfX3gpKTsKKyAgcmV0dXJuIF9fcmVzOworfQorX19FTkRfTkFNRVNQQUNFX1NURAorCitfX0JFR0lOX05BTUVTUEFDRV9DOTkKK19fTUFUSF9JTkxJTkUgZmxvYXQKK19fTlRIIChmbG9vcmYgKGZsb2F0IF9feCkpCit7CisgIGZsb2F0IF9fcmVzOworICBfX2FzbSAoInJvdW5kc3MgJDEsICUxLCAlMCIgOiAiPXgiIChfX3JlcykgOiAieG0iIChfX3gpKTsKKyAgcmV0dXJuIF9fcmVzOworfQorX19FTkRfTkFNRVNQQUNFX0M5OQorIyBlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21tYW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODI5NzEwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbW1hbi5oCkBAIC0wLDAgKzEsMTEyIEBACisvKiBEZWZpbml0aW9ucyBmb3IgUE9TSVggbWVtb3J5IG1hcCBpbnRlcmZhY2UuICBMaW51eC94ODZfNjQgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMSwyMDAzLDIwMDUsMjAwNiwyMDA5LDIwMTAsMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19NTUFOX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9tbWFuLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvbW1hbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGJhc2ljYWxseSBjb21lIGZyb20gdGhlIGtlcm5lbCBoZWFkZXJzLgorICAgQnV0IHRoZSBrZXJuZWwgaGVhZGVyIGlzIG5vdCBuYW1lc3BhY2UgY2xlYW4uICAqLworCisKKy8qIFByb3RlY3Rpb25zIGFyZSBjaG9zZW4gZnJvbSB0aGVzZSBiaXRzLCBPUidkIHRvZ2V0aGVyLiAgVGhlCisgICBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBuZWNlc3NhcmlseSBzdXBwb3J0IFBST1RfRVhFQyBvciBQUk9UX1dSSVRFCisgICB3aXRob3V0IFBST1RfUkVBRC4gIFRoZSBvbmx5IGd1YXJhbnRlZXMgYXJlIHRoYXQgbm8gd3JpdGluZyB3aWxsIGJlCisgICBhbGxvd2VkIHdpdGhvdXQgUFJPVF9XUklURSBhbmQgbm8gYWNjZXNzIHdpbGwgYmUgYWxsb3dlZCBmb3IgUFJPVF9OT05FLiAqLworCisjZGVmaW5lIFBST1RfUkVBRAkweDEJCS8qIFBhZ2UgY2FuIGJlIHJlYWQuICAqLworI2RlZmluZSBQUk9UX1dSSVRFCTB4MgkJLyogUGFnZSBjYW4gYmUgd3JpdHRlbi4gICovCisjZGVmaW5lIFBST1RfRVhFQwkweDQJCS8qIFBhZ2UgY2FuIGJlIGV4ZWN1dGVkLiAgKi8KKyNkZWZpbmUgUFJPVF9OT05FCTB4MAkJLyogUGFnZSBjYW4gbm90IGJlIGFjY2Vzc2VkLiAgKi8KKyNkZWZpbmUgUFJPVF9HUk9XU0RPV04JMHgwMTAwMDAwMAkvKiBFeHRlbmQgY2hhbmdlIHRvIHN0YXJ0IG9mCisJCQkJCSAgIGdyb3dzZG93biB2bWEgKG1wcm90ZWN0IG9ubHkpLiAgKi8KKyNkZWZpbmUgUFJPVF9HUk9XU1VQCTB4MDIwMDAwMDAJLyogRXh0ZW5kIGNoYW5nZSB0byBzdGFydCBvZgorCQkJCQkgICBncm93c3VwIHZtYSAobXByb3RlY3Qgb25seSkuICAqLworCisvKiBTaGFyaW5nIHR5cGVzIChtdXN0IGNob29zZSBvbmUgYW5kIG9ubHkgb25lIG9mIHRoZXNlKS4gICovCisjZGVmaW5lIE1BUF9TSEFSRUQJMHgwMQkJLyogU2hhcmUgY2hhbmdlcy4gICovCisjZGVmaW5lIE1BUF9QUklWQVRFCTB4MDIJCS8qIENoYW5nZXMgYXJlIHByaXZhdGUuICAqLworI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIE1BUF9UWVBFCTB4MGYJCS8qIE1hc2sgZm9yIHR5cGUgb2YgbWFwcGluZy4gICovCisjZW5kaWYKKworLyogT3RoZXIgZmxhZ3MuICAqLworI2RlZmluZSBNQVBfRklYRUQJMHgxMAkJLyogSW50ZXJwcmV0IGFkZHIgZXhhY3RseS4gICovCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgTUFQX0ZJTEUJMAorIyBkZWZpbmUgTUFQX0FOT05ZTU9VUwkweDIwCQkvKiBEb24ndCB1c2UgYSBmaWxlLiAgKi8KKyMgZGVmaW5lIE1BUF9BTk9OCU1BUF9BTk9OWU1PVVMKKyMgZGVmaW5lIE1BUF8zMkJJVAkweDQwCQkvKiBPbmx5IGdpdmUgb3V0IDMyLWJpdCBhZGRyZXNzZXMuICAqLworI2VuZGlmCisKKy8qIFRoZXNlIGFyZSBMaW51eC1zcGVjaWZpYy4gICovCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgTUFQX0dST1dTRE9XTgkweDAwMTAwCQkvKiBTdGFjay1saWtlIHNlZ21lbnQuICAqLworIyBkZWZpbmUgTUFQX0RFTllXUklURQkweDAwODAwCQkvKiBFVFhUQlNZICovCisjIGRlZmluZSBNQVBfRVhFQ1VUQUJMRQkweDAxMDAwCQkvKiBNYXJrIGl0IGFzIGFuIGV4ZWN1dGFibGUuICAqLworIyBkZWZpbmUgTUFQX0xPQ0tFRAkweDAyMDAwCQkvKiBMb2NrIHRoZSBtYXBwaW5nLiAgKi8KKyMgZGVmaW5lIE1BUF9OT1JFU0VSVkUJMHgwNDAwMAkJLyogRG9uJ3QgY2hlY2sgZm9yIHJlc2VydmF0aW9ucy4gICovCisjIGRlZmluZSBNQVBfUE9QVUxBVEUJMHgwODAwMAkJLyogUG9wdWxhdGUgKHByZWZhdWx0KSBwYWdldGFibGVzLiAgKi8KKyMgZGVmaW5lIE1BUF9OT05CTE9DSwkweDEwMDAwCQkvKiBEbyBub3QgYmxvY2sgb24gSU8uICAqLworIyBkZWZpbmUgTUFQX1NUQUNLCTB4MjAwMDAJCS8qIEFsbG9jYXRpb24gaXMgZm9yIGEgc3RhY2suICAqLworIyBkZWZpbmUgTUFQX0hVR0VUTEIJMHg0MDAwMAkJLyogQ3JlYXRlIGh1Z2UgcGFnZSBtYXBwaW5nLiAgKi8KKyNlbmRpZgorCisvKiBGbGFncyB0byBgbXN5bmMnLiAgKi8KKyNkZWZpbmUgTVNfQVNZTkMJMQkJLyogU3luYyBtZW1vcnkgYXN5bmNocm9ub3VzbHkuICAqLworI2RlZmluZSBNU19TWU5DCQk0CQkvKiBTeW5jaHJvbm91cyBtZW1vcnkgc3luYy4gICovCisjZGVmaW5lIE1TX0lOVkFMSURBVEUJMgkJLyogSW52YWxpZGF0ZSB0aGUgY2FjaGVzLiAgKi8KKworLyogRmxhZ3MgZm9yIGBtbG9ja2FsbCcuICAqLworI2RlZmluZSBNQ0xfQ1VSUkVOVAkxCQkvKiBMb2NrIGFsbCBjdXJyZW50bHkgbWFwcGVkIHBhZ2VzLiAgKi8KKyNkZWZpbmUgTUNMX0ZVVFVSRQkyCQkvKiBMb2NrIGFsbCBhZGRpdGlvbnMgdG8gYWRkcmVzcworCQkJCQkgICBzcGFjZS4gICovCisKKy8qIEZsYWdzIGZvciBgbXJlbWFwJy4gICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBNUkVNQVBfTUFZTU9WRQkxCisjIGRlZmluZSBNUkVNQVBfRklYRUQJMgorI2VuZGlmCisKKy8qIEFkdmljZSB0byBgbWFkdmlzZScuICAqLworI2lmZGVmIF9fVVNFX0JTRAorIyBkZWZpbmUgTUFEVl9OT1JNQUwJICAwCS8qIE5vIGZ1cnRoZXIgc3BlY2lhbCB0cmVhdG1lbnQuICAqLworIyBkZWZpbmUgTUFEVl9SQU5ET00JICAxCS8qIEV4cGVjdCByYW5kb20gcGFnZSByZWZlcmVuY2VzLiAgKi8KKyMgZGVmaW5lIE1BRFZfU0VRVUVOVElBTCAgMgkvKiBFeHBlY3Qgc2VxdWVudGlhbCBwYWdlIHJlZmVyZW5jZXMuICAqLworIyBkZWZpbmUgTUFEVl9XSUxMTkVFRAkgIDMJLyogV2lsbCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIE1BRFZfRE9OVE5FRUQJICA0CS8qIERvbid0IG5lZWQgdGhlc2UgcGFnZXMuICAqLworIyBkZWZpbmUgTUFEVl9SRU1PVkUJICA5CS8qIFJlbW92ZSB0aGVzZSBwYWdlcyBhbmQgcmVzb3VyY2VzLiAgKi8KKyMgZGVmaW5lIE1BRFZfRE9OVEZPUksJICAxMAkvKiBEbyBub3QgaW5oZXJpdCBhY3Jvc3MgZm9yay4gICovCisjIGRlZmluZSBNQURWX0RPRk9SSwkgIDExCS8qIERvIGluaGVyaXQgYWNyb3NzIGZvcmsuICAqLworIyBkZWZpbmUgTUFEVl9NRVJHRUFCTEUJICAxMgkvKiBLU00gbWF5IG1lcmdlIGlkZW50aWNhbCBwYWdlcy4gICovCisjIGRlZmluZSBNQURWX1VOTUVSR0VBQkxFIDEzCS8qIEtTTSBtYXkgbm90IG1lcmdlIGlkZW50aWNhbCBwYWdlcy4gICovCisjIGRlZmluZSBNQURWX0hVR0VQQUdFCSAgMTQJLyogV29ydGggYmFja2luZyB3aXRoIGh1Z2VwYWdlcy4gICovCisjIGRlZmluZSBNQURWX05PSFVHRVBBR0UgIDE1CS8qIE5vdCB3b3J0aCBiYWNraW5nIHdpdGggaHVnZXBhZ2VzLiAgKi8KKyMgZGVmaW5lIE1BRFZfSFdQT0lTT04JICAxMDAJLyogUG9pc29uIGEgcGFnZSBmb3IgdGVzdGluZy4gICovCisjZW5kaWYKKworLyogVGhlIFBPU0lYIHBlb3BsZSBoYWQgdG8gaW52ZW50IHNpbWlsYXIgbmFtZXMgZm9yIHRoZSBzYW1lIHRoaW5ncy4gICovCisjaWZkZWYgX19VU0VfWE9QRU4ySworIyBkZWZpbmUgUE9TSVhfTUFEVl9OT1JNQUwJMCAvKiBObyBmdXJ0aGVyIHNwZWNpYWwgdHJlYXRtZW50LiAgKi8KKyMgZGVmaW5lIFBPU0lYX01BRFZfUkFORE9NCTEgLyogRXhwZWN0IHJhbmRvbSBwYWdlIHJlZmVyZW5jZXMuICAqLworIyBkZWZpbmUgUE9TSVhfTUFEVl9TRVFVRU5USUFMCTIgLyogRXhwZWN0IHNlcXVlbnRpYWwgcGFnZSByZWZlcmVuY2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX01BRFZfV0lMTE5FRUQJMyAvKiBXaWxsIG5lZWQgdGhlc2UgcGFnZXMuICAqLworIyBkZWZpbmUgUE9TSVhfTUFEVl9ET05UTkVFRAk0IC8qIERvbid0IG5lZWQgdGhlc2UgcGFnZXMuICAqLworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tb25ldGFyeS1sZGJsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tb25ldGFyeS1sZGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwODBmOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21vbmV0YXJ5LWxkYmwuaApAQCAtMCwwICsxLDI4IEBACisvKiAtbWxvbmctZG91YmxlLTY0IGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgbW9uZXRhcnkgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NT05FVEFSWV9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL21vbmV0YXJ5LWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8bW9uZXRhcnkuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworX19MREJMX1JFRElSX0RFQ0wgKHN0cmZtb24pCisKKyNpZmRlZiBfX1VTRV9HTlUKK19fTERCTF9SRURJUl9ERUNMIChzdHJmbW9uX2wpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21xdWV1ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbXF1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1MjhmOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21xdWV1ZS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTVFVRVVFX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9tcXVldWUuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG1xdWV1ZS5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCit0eXBlZGVmIGludCBtcWRfdDsKKworc3RydWN0IG1xX2F0dHIKK3sKKyAgbG9uZyBpbnQgbXFfZmxhZ3M7CS8qIE1lc3NhZ2UgcXVldWUgZmxhZ3MuICAqLworICBsb25nIGludCBtcV9tYXhtc2c7CS8qIE1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzLiAgKi8KKyAgbG9uZyBpbnQgbXFfbXNnc2l6ZTsJLyogTWF4aW11bSBtZXNzYWdlIHNpemUuICAqLworICBsb25nIGludCBtcV9jdXJtc2dzOwkvKiBOdW1iZXIgb2YgbWVzc2FnZXMgY3VycmVudGx5IHF1ZXVlZC4gICovCisgIGxvbmcgaW50IF9fcGFkWzRdOworfTsKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21xdWV1ZTIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21xdWV1ZTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmQwODE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbXF1ZXVlMi5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIENoZWNraW5nIG1hY3JvcyBmb3IgbXEgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA3LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9GQ05UTF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL21xdWV1ZTIuaD4gZGlyZWN0bHk7IHVzZSA8bXF1ZXVlLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIENoZWNrIHRoYXQgY2FsbHMgdG8gbXFfb3BlbiB3aXRoIE9fQ1JFQVQgc2V0IGhhdmUgYW4gYXBwcm9wcmlhdGUgdGhpcmQgYW5kIGZvdXJ0aAorICAgcGFyYW1ldGVyLiAgKi8KK2V4dGVybiBtcWRfdCBtcV9vcGVuIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fb2ZsYWcsIC4uLikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gbXFkX3QgX19tcV9vcGVuXzIgKF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQgX19vZmxhZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gbXFkX3QgX19SRURJUkVDVF9OVEggKF9fbXFfb3Blbl9hbGlhcywgKF9fY29uc3QgY2hhciAqX19uYW1lLAorCQkJCQkgICAgICAgaW50IF9fb2ZsYWcsIC4uLiksIG1xX29wZW4pCisgICAgIF9fbm9ubnVsbCAoKDEpKTsKK19fZXJyb3JkZWNsIChfX21xX29wZW5fd3JvbmdfbnVtYmVyX29mX2FyZ3MsCisJICAgICAibXFfb3BlbiBjYW4gYmUgY2FsbGVkIGVpdGhlciB3aXRoIDIgb3IgNCBhcmd1bWVudHMiKTsKK19fZXJyb3JkZWNsIChfX21xX29wZW5fbWlzc2luZ19tb2RlX2FuZF9hdHRyLAorCSAgICAgIm1xX29wZW4gd2l0aCBPX0NSRUFUIGluIHNlY29uZCBhcmd1bWVudCBuZWVkcyA0IGFyZ3VtZW50cyIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIG1xZF90CitfX05USCAobXFfb3BlbiAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX29mbGFnLCAuLi4pKQoreworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgIT0gMCAmJiBfX3ZhX2FyZ19wYWNrX2xlbiAoKSAhPSAyKQorICAgIF9fbXFfb3Blbl93cm9uZ19udW1iZXJfb2ZfYXJncyAoKTsKKworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fb2ZsYWcpKQorICAgIHsKKyAgICAgIGlmICgoX19vZmxhZyAmIE9fQ1JFQVQpICE9IDAgJiYgX192YV9hcmdfcGFja19sZW4gKCkgPT0gMCkKKwl7CisJICBfX21xX29wZW5fbWlzc2luZ19tb2RlX2FuZF9hdHRyICgpOworCSAgcmV0dXJuIF9fbXFfb3Blbl8yIChfX25hbWUsIF9fb2ZsYWcpOworCX0KKyAgICAgIHJldHVybiBfX21xX29wZW5fYWxpYXMgKF9fbmFtZSwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7CisgICAgfQorCisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA9PSAwKQorICAgIHJldHVybiBfX21xX29wZW5fMiAoX19uYW1lLCBfX29mbGFnKTsKKworICByZXR1cm4gX19tcV9vcGVuX2FsaWFzIChfX25hbWUsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbXNxLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tc3EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjIyMThhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbXNxLmgKQEAgLTAsMCArMSw4MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfTVNHX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9tc3EuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9tc2cuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKy8qIERlZmluZSBvcHRpb25zIGZvciBtZXNzYWdlIHF1ZXVlIGZ1bmN0aW9ucy4gICovCisjZGVmaW5lIE1TR19OT0VSUk9SCTAxMDAwMAkvKiBubyBlcnJvciBpZiBtZXNzYWdlIGlzIHRvbyBiaWcgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE1TR19FWENFUFQJMDIwMDAwCS8qIHJlY3YgYW55IG1zZyBleGNlcHQgb2Ygc3BlY2lmaWVkIHR5cGUgKi8KKyNlbmRpZgorCisvKiBUeXBlcyB1c2VkIGluIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IG1zZ3FudW1fdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgbXNnbGVuX3Q7CisKKy8qIFN0cnVjdHVyZSBvZiByZWNvcmQgZm9yIG9uZSBtZXNzYWdlIGluc2lkZSB0aGUga2VybmVsLgorICAgVGhlIHR5cGUgYHN0cnVjdCBtc2cnIGlzIG9wYXF1ZS4gICovCitzdHJ1Y3QgbXNxaWRfZHMKK3sKKyAgc3RydWN0IGlwY19wZXJtIG1zZ19wZXJtOwkvKiBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBvcGVyYXRpb24gcGVybWlzc2lvbiAqLworICBfX3RpbWVfdCBtc2dfc3RpbWU7CQkvKiB0aW1lIG9mIGxhc3QgbXNnc25kIGNvbW1hbmQgKi8KKyNpZiBfX1dPUkRTSVpFID09IDMyCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMTsKKyNlbmRpZgorICBfX3RpbWVfdCBtc2dfcnRpbWU7CQkvKiB0aW1lIG9mIGxhc3QgbXNncmN2IGNvbW1hbmQgKi8KKyNpZiBfX1dPUkRTSVpFID09IDMyCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMjsKKyNlbmRpZgorICBfX3RpbWVfdCBtc2dfY3RpbWU7CQkvKiB0aW1lIG9mIGxhc3QgY2hhbmdlICovCisjaWYgX19XT1JEU0laRSA9PSAzMgorICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDM7CisjZW5kaWYKKyAgdW5zaWduZWQgbG9uZyBpbnQgX19tc2dfY2J5dGVzOyAvKiBjdXJyZW50IG51bWJlciBvZiBieXRlcyBvbiBxdWV1ZSAqLworICBtc2dxbnVtX3QgbXNnX3FudW07CQkvKiBudW1iZXIgb2YgbWVzc2FnZXMgY3VycmVudGx5IG9uIHF1ZXVlICovCisgIG1zZ2xlbl90IG1zZ19xYnl0ZXM7CQkvKiBtYXggbnVtYmVyIG9mIGJ5dGVzIGFsbG93ZWQgb24gcXVldWUgKi8KKyAgX19waWRfdCBtc2dfbHNwaWQ7CQkvKiBwaWQgb2YgbGFzdCBtc2dzbmQoKSAqLworICBfX3BpZF90IG1zZ19scnBpZDsJCS8qIHBpZCBvZiBsYXN0IG1zZ3JjdigpICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkNDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ1OworfTsKKworI2lmZGVmIF9fVVNFX01JU0MKKworIyBkZWZpbmUgbXNnX2NieXRlcwlfX21zZ19jYnl0ZXMKKworLyogaXBjcyBjdGwgY29tbWFuZHMgKi8KKyMgZGVmaW5lIE1TR19TVEFUIDExCisjIGRlZmluZSBNU0dfSU5GTyAxMgorCisvKiBidWZmZXIgZm9yIG1zZ2N0bCBjYWxscyBJUENfSU5GTywgTVNHX0lORk8gKi8KK3N0cnVjdCBtc2dpbmZvCisgIHsKKyAgICBpbnQgbXNncG9vbDsKKyAgICBpbnQgbXNnbWFwOworICAgIGludCBtc2dtYXg7CisgICAgaW50IG1zZ21uYjsKKyAgICBpbnQgbXNnbW5pOworICAgIGludCBtc2dzc3o7CisgICAgaW50IG1zZ3RxbDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgbXNnc2VnOworICB9OworCisjZW5kaWYgLyogX19VU0VfTUlTQyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbmFuLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9uYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWU5N2YyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbmFuLmgKQEAgLTAsMCArMSw1MyBAQAorLyogYE5BTicgY29uc3RhbnQgZm9yIElFRUUgNzU0IG1hY2hpbmVzLgorICAgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTYsMTk5NywxOTk5LDIwMDQsMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTUFUSF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbmFuLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworLyogSUVFRSBOb3QgQSBOdW1iZXIuICAqLworCisjaWYgX19HTlVDX1BSRVJFUSgzLDMpCisKKyMgZGVmaW5lIE5BTgkoX19idWlsdGluX25hbmYgKCIiKSkKKworI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworCisjIGRlZmluZSBOQU4gXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoKHVuaW9uIHsgdW5zaWduZWQgX19sIF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19TSV9fKSkpOyBmbG9hdCBfX2Q7IH0pICBcCisgICAgeyBfX2w6IDB4N2ZjMDAwMDBVTCB9KS5fX2QpCisKKyNlbHNlCisKKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisKKyMgaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyAgZGVmaW5lIF9fbmFuX2J5dGVzCQl7IDB4N2YsIDB4YzAsIDAsIDAgfQorIyBlbmRpZgorIyBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgX19uYW5fYnl0ZXMJCXsgMCwgMCwgMHhjMCwgMHg3ZiB9CisjIGVuZGlmCisKK3N0YXRpYyB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgX19jWzRdOyBmbG9hdCBfX2Q7IH0gX19uYW5fdW5pb24KKyAgICBfX2F0dHJpYnV0ZV91c2VkX18gPSB7IF9fbmFuX2J5dGVzIH07CisjIGRlZmluZSBOQU4JKF9fbmFuX3VuaW9uLl9fZCkKKworI2VuZGlmCS8qIEdDQy4gICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9uZXRkYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbmV0ZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWRjNzMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbmV0ZGIuaApAQCAtMCwwICsxLDMzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVERCX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvbmV0ZGIuaD4gZGlyZWN0bHk7IHVzZSA8bmV0ZGIuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBEZXNjcmlwdGlvbiBvZiBkYXRhIGJhc2UgZW50cnkgZm9yIGEgc2luZ2xlIG5ldHdvcmsuICBOT1RFOiBoZXJlIGEKKyAgIHBvb3IgYXNzdW1wdGlvbiBpcyBtYWRlLiAgVGhlIG5ldHdvcmsgbnVtYmVyIGlzIGV4cGVjdGVkIHRvIGZpdAorICAgaW50byBhbiB1bnNpZ25lZCBsb25nIGludCB2YXJpYWJsZS4gICovCitzdHJ1Y3QgbmV0ZW50Cit7CisgIGNoYXIgKm5fbmFtZTsJCQkvKiBPZmZpY2lhbCBuYW1lIG9mIG5ldHdvcmsuICAqLworICBjaGFyICoqbl9hbGlhc2VzOwkJLyogQWxpYXMgbGlzdC4gICovCisgIGludCBuX2FkZHJ0eXBlOwkJLyogTmV0IGFkZHJlc3MgdHlwZS4gICovCisgIHVpbnQzMl90IG5fbmV0OwkJLyogTmV0d29yayBudW1iZXIuICAqLworfTsKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3BvbGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQ3NWNiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcG9sbC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMjAwMSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1BPTExfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3BvbGwuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9wb2xsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIEV2ZW50IHR5cGVzIHRoYXQgY2FuIGJlIHBvbGxlZCBmb3IuICBUaGVzZSBiaXRzIG1heSBiZSBzZXQgaW4gYGV2ZW50cycKKyAgIHRvIGluZGljYXRlIHRoZSBpbnRlcmVzdGluZyBldmVudCB0eXBlczsgdGhleSB3aWxsIGFwcGVhciBpbiBgcmV2ZW50cycKKyAgIHRvIGluZGljYXRlIHRoZSBzdGF0dXMgb2YgdGhlIGZpbGUgZGVzY3JpcHRvci4gICovCisjZGVmaW5lIFBPTExJTgkJMHgwMDEJCS8qIFRoZXJlIGlzIGRhdGEgdG8gcmVhZC4gICovCisjZGVmaW5lIFBPTExQUkkJCTB4MDAyCQkvKiBUaGVyZSBpcyB1cmdlbnQgZGF0YSB0byByZWFkLiAgKi8KKyNkZWZpbmUgUE9MTE9VVAkJMHgwMDQJCS8qIFdyaXRpbmcgbm93IHdpbGwgbm90IGJsb2NrLiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorLyogVGhlc2UgdmFsdWVzIGFyZSBkZWZpbmVkIGluIFhQRzQuMi4gICovCisjIGRlZmluZSBQT0xMUkROT1JNCTB4MDQwCQkvKiBOb3JtYWwgZGF0YSBtYXkgYmUgcmVhZC4gICovCisjIGRlZmluZSBQT0xMUkRCQU5ECTB4MDgwCQkvKiBQcmlvcml0eSBkYXRhIG1heSBiZSByZWFkLiAgKi8KKyMgZGVmaW5lIFBPTExXUk5PUk0JMHgxMDAJCS8qIFdyaXRpbmcgbm93IHdpbGwgbm90IGJsb2NrLiAgKi8KKyMgZGVmaW5lIFBPTExXUkJBTkQJMHgyMDAJCS8qIFByaW9yaXR5IGRhdGEgbWF5IGJlIHdyaXR0ZW4uICAqLworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoZXNlIGFyZSBleHRlbnNpb25zIGZvciBMaW51eC4gICovCisjIGRlZmluZSBQT0xMTVNHCTB4NDAwCisjIGRlZmluZSBQT0xMUkVNT1ZFCTB4MTAwMAorIyBkZWZpbmUgUE9MTFJESFVQCTB4MjAwMAorI2VuZGlmCisKKy8qIEV2ZW50IHR5cGVzIGFsd2F5cyBpbXBsaWNpdGx5IHBvbGxlZCBmb3IuICBUaGVzZSBiaXRzIG5lZWQgbm90IGJlIHNldCBpbgorICAgYGV2ZW50cycsIGJ1dCB0aGV5IHdpbGwgYXBwZWFyIGluIGByZXZlbnRzJyB0byBpbmRpY2F0ZSB0aGUgc3RhdHVzIG9mCisgICB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KKyNkZWZpbmUgUE9MTEVSUgkJMHgwMDgJCS8qIEVycm9yIGNvbmRpdGlvbi4gICovCisjZGVmaW5lIFBPTExIVVAJCTB4MDEwCQkvKiBIdW5nIHVwLiAgKi8KKyNkZWZpbmUgUE9MTE5WQUwJMHgwMjAJCS8qIEludmFsaWQgcG9sbGluZyByZXF1ZXN0LiAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3Bvc2l4MV9saW0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3Bvc2l4MV9saW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGViNDMyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcG9zaXgxX2xpbS5oCkBAIC0wLDAgKzEsMTcyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5Myw5Niw5OCwyMDAwLTIwMDMsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVBPU0lYIFN0YW5kYXJkOiAyLjkuMiBNaW5pbXVtIFZhbHVlcwlBZGRlZCB0byA8bGltaXRzLmg+CisgKgorICoJTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHk7IHVzZSA8bGltaXRzLmg+IGluc3RlYWQuCisgKi8KKworI2lmbmRlZglfQklUU19QT1NJWDFfTElNX0gKKyNkZWZpbmUJX0JJVFNfUE9TSVgxX0xJTV9ICTEKKworCisvKiBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkLW1hbmRhdGVkIG1pbmltdW0gdmFsdWVzLiAgKi8KKworLyogTWluaW11bSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBpbiBvbmUgbGlzdCBJL08gY2FsbC4gICovCisjZGVmaW5lIF9QT1NJWF9BSU9fTElTVElPX01BWAkyCisKKy8qIE1pbmltYWwgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGFzeW5jaHJvbm91cyBJL08gb3BlcmF0aW9ucy4gICovCisjZGVmaW5lIF9QT1NJWF9BSU9fTUFYCQkxCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGFyZ3VtZW50cyB0byBgZXhlY3ZlJywgaW5jbHVkaW5nIGVudmlyb25tZW50LiAgKi8KKyNkZWZpbmUJX1BPU0lYX0FSR19NQVgJCTQwOTYKKworLyogTWF4aW11bSBzaW11bHRhbmVvdXMgcHJvY2Vzc2VzIHBlciByZWFsIHVzZXIgSUQuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIF9QT1NJWF9DSElMRF9NQVgJMjUKKyNlbHNlCisjIGRlZmluZSBfUE9TSVhfQ0hJTERfTUFYCTYKKyNlbmRpZgorCisvKiBNaW5pbWFsIG51bWJlciBvZiB0aW1lciBleHBpcmF0aW9uIG92ZXJydW5zLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0RFTEFZVElNRVJfTUFYCTMyCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGEgaG9zdCBuYW1lIChub3QgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsKQorICAgYXMgcmV0dXJuZWQgZnJvbSB0aGUgR0VUSE9TVE5BTUUgZnVuY3Rpb24uICAqLworI2RlZmluZSBfUE9TSVhfSE9TVF9OQU1FX01BWAkyNTUKKworLyogTWF4aW11bSBsaW5rIGNvdW50IG9mIGEgZmlsZS4gICovCisjZGVmaW5lCV9QT1NJWF9MSU5LX01BWAkJOAorCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBsb2dpbiBuYW1lLiAgKi8KKyNkZWZpbmUJX1BPU0lYX0xPR0lOX05BTUVfTUFYCTkKKworLyogTnVtYmVyIG9mIGJ5dGVzIGluIGEgdGVybWluYWwgY2Fub25pY2FsIGlucHV0IHF1ZXVlLiAgKi8KKyNkZWZpbmUJX1BPU0lYX01BWF9DQU5PTgkyNTUKKworLyogTnVtYmVyIG9mIGJ5dGVzIGZvciB3aGljaCBzcGFjZSB3aWxsIGJlCisgICBhdmFpbGFibGUgaW4gYSB0ZXJtaW5hbCBpbnB1dCBxdWV1ZS4gICovCisjZGVmaW5lCV9QT1NJWF9NQVhfSU5QVVQJMjU1CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2UgcXVldWVzIG9wZW4gZm9yIGEgcHJvY2Vzcy4gICovCisjZGVmaW5lIF9QT1NJWF9NUV9PUEVOX01BWAk4CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBtZXNzYWdlIHByaW9yaXRpZXMuICAqLworI2RlZmluZSBfUE9TSVhfTVFfUFJJT19NQVgJMzIKKworLyogTnVtYmVyIG9mIGJ5dGVzIGluIGEgZmlsZW5hbWUuICAqLworI2RlZmluZQlfUE9TSVhfTkFNRV9NQVgJCTE0CisKKy8qIE51bWJlciBvZiBzaW11bHRhbmVvdXMgc3VwcGxlbWVudGFyeSBncm91cCBJRHMgcGVyIHByb2Nlc3MuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIF9QT1NJWF9OR1JPVVBTX01BWAk4CisjZWxzZQorIyBkZWZpbmUgX1BPU0lYX05HUk9VUFNfTUFYCTAKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgZmlsZXMgb25lIHByb2Nlc3MgY2FuIGhhdmUgb3BlbiBhdCBvbmNlLiAgKi8KKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisjIGRlZmluZSBfUE9TSVhfT1BFTl9NQVgJMjAKKyNlbHNlCisjIGRlZmluZSBfUE9TSVhfT1BFTl9NQVgJMTYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgX19VU0VfWE9QRU4ySyB8fCBkZWZpbmVkIF9fVVNFX0dOVQorLyogTnVtYmVyIG9mIGRlc2NyaXB0b3JzIHRoYXQgYSBwcm9jZXNzIG1heSBleGFtaW5lIHdpdGggYHBzZWxlY3QnIG9yCisgICBgc2VsZWN0Jy4gICovCisjIGRlZmluZSBfUE9TSVhfRkRfU0VUU0laRQlfUE9TSVhfT1BFTl9NQVgKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gYSBwYXRobmFtZS4gICovCisjZGVmaW5lCV9QT1NJWF9QQVRIX01BWAkJMjU2CisKKy8qIE51bWJlciBvZiBieXRlcyB0aGFuIGNhbiBiZSB3cml0dGVuIGF0b21pY2FsbHkgdG8gYSBwaXBlLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1BJUEVfQlVGCQk1MTIKKworLyogVGhlIG51bWJlciBvZiByZXBlYXRlZCBvY2N1cnJlbmNlcyBvZiBhIEJSRSBwZXJtaXR0ZWQgYnkgdGhlCisgICBSRUdFWEVDIGFuZCBSRUdDT01QIGZ1bmN0aW9ucyB3aGVuIHVzaW5nIHRoZSBpbnRlcnZhbCBub3RhdGlvbi4gICovCisjZGVmaW5lIF9QT1NJWF9SRV9EVVBfTUFYCTI1NQorCisvKiBNaW5pbWFsIG51bWJlciBvZiByZWFsdGltZSBzaWduYWxzIHJlc2VydmVkIGZvciB0aGUgYXBwbGljYXRpb24uICAqLworI2RlZmluZSBfUE9TSVhfUlRTSUdfTUFYCTgKKworLyogTnVtYmVyIG9mIHNlbWFwaG9yZXMgYSBwcm9jZXNzIGNhbiBoYXZlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NFTV9OU0VNU19NQVgJMjU2CisKKy8qIE1heGltYWwgdmFsdWUgb2YgYSBzZW1hcGhvcmUuICAqLworI2RlZmluZSBfUE9TSVhfU0VNX1ZBTFVFX01BWAkzMjc2NworCisvKiBOdW1iZXIgb2YgcGVuZGluZyByZWFsdGltZSBzaWduYWxzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NJR1FVRVVFX01BWAkzMgorCisvKiBMYXJnZXN0IHZhbHVlIG9mIGEgYHNzaXplX3QnLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1NTSVpFX01BWAkzMjc2NworCisvKiBOdW1iZXIgb2Ygc3RyZWFtcyBhIHByb2Nlc3MgY2FuIGhhdmUgb3BlbiBhdCBvbmNlLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1NUUkVBTV9NQVgJOAorCisvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgc3ltYm9saWMgbGluay4gICovCisjZGVmaW5lIF9QT1NJWF9TWU1MSU5LX01BWAkyNTUKKworLyogVGhlIG51bWJlciBvZiBzeW1ib2xpYyBsaW5rcyB0aGF0IGNhbiBiZSB0cmF2ZXJzZWQgaW4gdGhlCisgICByZXNvbHV0aW9uIG9mIGEgcGF0aG5hbWUgaW4gdGhlIGFic2VuY2Ugb2YgYSBsb29wLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NZTUxPT1BfTUFYCTgKKworLyogTnVtYmVyIG9mIHRpbWVyIGZvciBhIHByb2Nlc3MuICAqLworI2RlZmluZSBfUE9TSVhfVElNRVJfTUFYCTMyCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSB0dHkgbmFtZS4gICovCisjZGVmaW5lCV9QT1NJWF9UVFlfTkFNRV9NQVgJOQorCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBhIHRpbWV6b25lIG5hbWUgKGVsZW1lbnQgb2YgYHR6bmFtZScpLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1RaTkFNRV9NQVgJNgorCisjaWYgIWRlZmluZWQgX19VU0VfWE9QRU4ySyB8fCBkZWZpbmVkIF9fVVNFX0dOVQorLyogTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBjYW4gYmUgcXVldWVkIG9uIGEgc29ja2V0LiAgKi8KKyMgZGVmaW5lIF9QT1NJWF9RTElNSVQJCTEKKworLyogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgYnVmZmVyZWQgb24gYSBzb2NrZXQgZm9yIHNlbmQKKyAgIG9yIHJlY2VpdmUuICAqLworIyBkZWZpbmUgX1BPU0lYX0hJV0FUCQlfUE9TSVhfUElQRV9CVUYKKworLyogTWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gYGlvdmVjJyBhcnJheS4gICovCisjIGRlZmluZSBfUE9TSVhfVUlPX01BWElPVgkxNgorI2VuZGlmCisKKy8qIE1heGltdW0gY2xvY2sgcmVzb2x1dGlvbiBpbiBuYW5vc2Vjb25kcy4gICovCisjZGVmaW5lIF9QT1NJWF9DTE9DS1JFU19NSU4JMjAwMDAwMDAKKworCisvKiBHZXQgdGhlIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIGFib3ZlLiAgKi8KKyNpbmNsdWRlIDxiaXRzL2xvY2FsX2xpbS5oPgorCisKKyNpZm5kZWYJU1NJWkVfTUFYCisjIGRlZmluZSBTU0laRV9NQVgJTE9OR19NQVgKKyNlbmRpZgorCisKKy8qIFRoaXMgdmFsdWUgaXMgYSBndWFyYW50ZWVkIG1pbmltdW0gbWF4aW11bS4KKyAgIFRoZSBjdXJyZW50IG1heGltdW0gY2FuIGJlIGdvdCBmcm9tIGBzeXNjb25mJy4gICovCisKKyNpZm5kZWYJTkdST1VQU19NQVgKKyMgZGVmaW5lIE5HUk9VUFNfTUFYCTgKKyNlbmRpZgorCisjZW5kaWYJLyogYml0cy9wb3NpeDFfbGltLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wb3NpeDJfbGltLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wb3NpeDJfbGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0ODNhMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3Bvc2l4Ml9saW0uaApAQCAtMCwwICsxLDkxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTYsIDE5OTksIDIwMDAsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseTsgaW5jbHVkZSA8bGltaXRzLmg+IGluc3RlYWQuCisgKi8KKworI2lmbmRlZglfQklUU19QT1NJWDJfTElNX0gKKyNkZWZpbmUJX0JJVFNfUE9TSVgyX0xJTV9ICTEKKworCisvKiBUaGUgbWF4aW11bSBgaWJhc2UnIGFuZCBgb2Jhc2UnIHZhbHVlcyBhbGxvd2VkIGJ5IHRoZSBgYmMnIHV0aWxpdHkuICAqLworI2RlZmluZQlfUE9TSVgyX0JDX0JBU0VfTUFYCQk5OQorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgYWxsb3dlZCBpbiBhbiBhcnJheSBieSB0aGUgYGJjJyB1dGlsaXR5LiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9CQ19ESU1fTUFYCQkyMDQ4CisKKy8qIFRoZSBtYXhpbXVtIGBzY2FsZScgdmFsdWUgYWxsb3dlZCBieSB0aGUgYGJjJyB1dGlsaXR5LiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9CQ19TQ0FMRV9NQVgJCTk5CisKKy8qIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIHN0cmluZyBjb25zdGFudCBhY2NlcHRlZCBieSB0aGUgYGJjJyB1dGlsaXR5LiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9CQ19TVFJJTkdfTUFYCQkxMDAwCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiB3ZWlnaHRzIHRoYXQgY2FuIGJlIGFzc2lnbmVkIHRvIGFuIGVudHJ5IG9mCisgICB0aGUgTENfQ09MTEFURSBgb3JkZXInIGtleXdvcmQgaW4gdGhlIGxvY2FsZSBkZWZpbml0aW9uIGZpbGUuICAqLworI2RlZmluZQlfUE9TSVgyX0NPTExfV0VJR0hUU19NQVgJMgorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZXhwcmVzc2lvbnMgdGhhdCBjYW4gYmUgbmVzdGVkCisgICB3aXRoaW4gcGFyZW50aGVzZXMgYnkgdGhlIGBleHByJyB1dGlsaXR5LiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9FWFBSX05FU1RfTUFYCQkzMgorCisvKiBUaGUgbWF4aW11bSBsZW5ndGgsIGluIGJ5dGVzLCBvZiBhbiBpbnB1dCBsaW5lLiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9MSU5FX01BWAkJMjA0OAorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwZWF0ZWQgb2NjdXJyZW5jZXMgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgIHBlcm1pdHRlZCB3aGVuIHVzaW5nIHRoZSBpbnRlcnZhbCBub3RhdGlvbiBgXHtNLE5cfScuICAqLworI2RlZmluZQlfUE9TSVgyX1JFX0RVUF9NQVgJCTI1NQorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBjaGFyYWN0ZXIgY2xhc3MgbmFtZS4gIFdlIGhhdmUgbm8KKyAgIGZpeGVkIGxpbWl0LCAyMDQ4IGlzIGEgaGlnaCBudW1iZXIuICAqLworI2RlZmluZQlfUE9TSVgyX0NIQVJDTEFTU19OQU1FX01BWAkxNAorCisKKy8qIFRoZXNlIHZhbHVlcyBhcmUgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMsCisgICBhbmQgbWF5IHZhcnkgd2l0aGluIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgIFRoZWlyIHByZWNpc2UgdmFsdWVzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHN5c2NvbmYuICAqLworCisjaWZuZGVmCUJDX0JBU0VfTUFYCisjZGVmaW5lCUJDX0JBU0VfTUFYCQlfUE9TSVgyX0JDX0JBU0VfTUFYCisjZW5kaWYKKyNpZm5kZWYJQkNfRElNX01BWAorI2RlZmluZQlCQ19ESU1fTUFYCQlfUE9TSVgyX0JDX0RJTV9NQVgKKyNlbmRpZgorI2lmbmRlZglCQ19TQ0FMRV9NQVgKKyNkZWZpbmUJQkNfU0NBTEVfTUFYCQlfUE9TSVgyX0JDX1NDQUxFX01BWAorI2VuZGlmCisjaWZuZGVmCUJDX1NUUklOR19NQVgKKyNkZWZpbmUJQkNfU1RSSU5HX01BWAkJX1BPU0lYMl9CQ19TVFJJTkdfTUFYCisjZW5kaWYKKyNpZm5kZWYJQ09MTF9XRUlHSFRTX01BWAorI2RlZmluZQlDT0xMX1dFSUdIVFNfTUFYCTI1NQorI2VuZGlmCisjaWZuZGVmCUVYUFJfTkVTVF9NQVgKKyNkZWZpbmUJRVhQUl9ORVNUX01BWAkJX1BPU0lYMl9FWFBSX05FU1RfTUFYCisjZW5kaWYKKyNpZm5kZWYJTElORV9NQVgKKyNkZWZpbmUJTElORV9NQVgJCV9QT1NJWDJfTElORV9NQVgKKyNlbmRpZgorI2lmbmRlZglDSEFSQ0xBU1NfTkFNRV9NQVgKKyNkZWZpbmUJQ0hBUkNMQVNTX05BTUVfTUFYCTIwNDgKKyNlbmRpZgorCisvKiBUaGlzIHZhbHVlIGlzIGRlZmluZWQgbGlrZSB0aGlzIGluIHJlZ2V4LmguICAqLworI2RlZmluZQlSRV9EVVBfTUFYICgweDdmZmYpCisKKyNlbmRpZgkvKiBiaXRzL3Bvc2l4Ml9saW0uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcG9zaXhfb3B0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wb3NpeF9vcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTUwMzU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcG9zaXhfb3B0LmgKQEAgLTAsMCArMSwxOTIgQEAKKy8qIERlZmluZSBQT1NJWCBvcHRpb25zIGZvciBMaW51eC4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDA0LCAyMDA2LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCisgICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYJX0JJVFNfUE9TSVhfT1BUX0gKKyNkZWZpbmUJX0JJVFNfUE9TSVhfT1BUX0gJMQorCisvKiBKb2IgY29udHJvbCBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfSk9CX0NPTlRST0wJMQorCisvKiBQcm9jZXNzZXMgaGF2ZSBhIHNhdmVkIHNldC11c2VyLUlEIGFuZCBhIHNhdmVkIHNldC1ncm91cC1JRC4gICovCisjZGVmaW5lCV9QT1NJWF9TQVZFRF9JRFMJMQorCisvKiBQcmlvcml0eSBzY2hlZHVsaW5nIGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lCV9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCTIwMDgwOUwKKworLyogU3luY2hyb25pemluZyBmaWxlIGRhdGEgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1NZTkNIUk9OSVpFRF9JTwkyMDA4MDlMCisKKy8qIFRoZSBmc3luYyBmdW5jdGlvbiBpcyBwcmVzZW50LiAgKi8KKyNkZWZpbmUJX1BPU0lYX0ZTWU5DCTIwMDgwOUwKKworLyogTWFwcGluZyBvZiBmaWxlcyB0byBtZW1vcnkgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUJX1BPU0lYX01BUFBFRF9GSUxFUwkyMDA4MDlMCisKKy8qIExvY2tpbmcgb2YgYWxsIG1lbW9yeSBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfTUVNTE9DSwkyMDA4MDlMCisKKy8qIExvY2tpbmcgb2YgcmFuZ2VzIG9mIG1lbW9yeSBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfTUVNTE9DS19SQU5HRQkyMDA4MDlMCisKKy8qIFNldHRpbmcgb2YgbWVtb3J5IHByb3RlY3Rpb25zIGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lCV9QT1NJWF9NRU1PUllfUFJPVEVDVElPTgkyMDA4MDlMCisKKy8qIFNvbWUgZmlsZXN5c3RlbXMgYWxsb3cgYWxsIHVzZXJzIHRvIGNoYW5nZSBmaWxlIG93bmVyc2hpcC4gICovCisjZGVmaW5lCV9QT1NJWF9DSE9XTl9SRVNUUklDVEVECTAKKworLyogYGNfY2MnIG1lbWJlciBvZiAnc3RydWN0IHRlcm1pb3MnIHN0cnVjdHVyZSBjYW4gYmUgZGlzYWJsZWQgYnkKKyAgIHVzaW5nIHRoZSB2YWx1ZSBfUE9TSVhfVkRJU0FCTEUuICAqLworI2RlZmluZQlfUE9TSVhfVkRJU0FCTEUJJ1wwJworCisvKiBGaWxlbmFtZXMgYXJlIG5vdCBzaWxlbnRseSB0cnVuY2F0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfTk9fVFJVTkMJMQorCisvKiBYL09wZW4gcmVhbHRpbWUgc3VwcG9ydCBpcyBhdmFpbGFibGUuICAqLworI2RlZmluZSBfWE9QRU5fUkVBTFRJTUUJMQorCisvKiBYL09wZW4gdGhyZWFkIHJlYWx0aW1lIHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1hPUEVOX1JFQUxUSU1FX1RIUkVBRFMJMQorCisvKiBYUEc0LjIgc2hhcmVkIG1lbW9yeSBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfWE9QRU5fU0hNCTEKKworLyogVGVsbCB3ZSBoYXZlIFBPU0lYIHRocmVhZHMuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEUwkyMDA4MDlMCisKKy8qIFdlIGhhdmUgdGhlIHJlZW50cmFudCBmdW5jdGlvbnMgZGVzY3JpYmVkIGluIFBPU0lYLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1JFRU5UUkFOVF9GVU5DVElPTlMgICAgICAxCisjZGVmaW5lIF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMJMjAwODA5TAorCisvKiBXZSBwcm92aWRlIHByaW9yaXR5IHNjaGVkdWxpbmcgZm9yIHRocmVhZHMuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcJMjAwODA5TAorCisvKiBXZSBzdXBwb3J0IHVzZXItZGVmaW5lZCBzdGFjayBzaXplcy4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUJMjAwODA5TAorCisvKiBXZSBzdXBwb3J0IHVzZXItZGVmaW5lZCBzdGFja3MuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tBRERSCTIwMDgwOUwKKworLyogV2Ugc3VwcG9ydCBwcmlvcml0eSBpbmhlcml0ZW5jZS4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfUFJJT19JTkhFUklUCTIwMDgwOUwKKworLyogV2Ugc3VwcG9ydCBwcmlvcml0eSBwcm90ZWN0aW9uLCB0aG91Z2ggb25seSBmb3Igbm9uLXJvYnVzdAorICAgbXV0ZXhlcy4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfUFJJT19QUk9URUNUCTIwMDgwOUwKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBXZSBzdXBwb3J0IHByaW9yaXR5IGluaGVyaXRlbmNlIGZvciByb2J1c3QgbXV0ZXhlcy4gICovCisjIGRlZmluZSBfUE9TSVhfVEhSRUFEX1JPQlVTVF9QUklPX0lOSEVSSVQJMjAwODA5TAorCisvKiBXZSBkbyBub3Qgc3VwcG9ydCBwcmlvcml0eSBwcm90ZWN0aW9uIGZvciByb2J1c3QgbXV0ZXhlcy4gICovCisjIGRlZmluZSBfUE9TSVhfVEhSRUFEX1JPQlVTVF9QUklPX1BST1RFQ1QJLTEKKyNlbmRpZgorCisvKiBXZSBzdXBwb3J0IFBPU0lYLjFiIHNlbWFwaG9yZXMuICAqLworI2RlZmluZSBfUE9TSVhfU0VNQVBIT1JFUwkyMDA4MDlMCisKKy8qIFJlYWwtdGltZSBzaWduYWxzIGFyZSBzdXBwb3J0ZWQuICAqLworI2RlZmluZSBfUE9TSVhfUkVBTFRJTUVfU0lHTkFMUwkyMDA4MDlMCisKKy8qIFdlIHN1cHBvcnQgYXN5bmNocm9ub3VzIEkvTy4gICovCisjZGVmaW5lIF9QT1NJWF9BU1lOQ0hST05PVVNfSU8JMjAwODA5TAorI2RlZmluZSBfUE9TSVhfQVNZTkNfSU8JCTEKKy8qIEFsdGVybmF0aXZlIG5hbWUgZm9yIFVuaXg5OC4gICovCisjZGVmaW5lIF9MRlNfQVNZTkNIUk9OT1VTX0lPCTEKKy8qIFN1cHBvcnQgZm9yIHByaW9yaXRpemF0aW9uIGlzIGFsc28gYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1BSSU9SSVRJWkVEX0lPCTIwMDgwOUwKKworLyogVGhlIExGUyBzdXBwb3J0IGluIGFzeW5jaHJvbm91cyBJL08gaXMgYWxzbyBhdmFpbGFibGUuICAqLworI2RlZmluZSBfTEZTNjRfQVNZTkNIUk9OT1VTX0lPCTEKKworLyogVGhlIHJlc3Qgb2YgdGhlIExGUyBpcyBhbHNvIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9MRlNfTEFSR0VGSUxFCQkxCisjZGVmaW5lIF9MRlM2NF9MQVJHRUZJTEUJMQorI2RlZmluZSBfTEZTNjRfU1RESU8JCTEKKworLyogUE9TSVggc2hhcmVkIG1lbW9yeSBvYmplY3RzIGFyZSBpbXBsZW1lbnRlZC4gICovCisjZGVmaW5lIF9QT1NJWF9TSEFSRURfTUVNT1JZX09CSkVDVFMJMjAwODA5TAorCisvKiBDUFUtdGltZSBjbG9ja3Mgc3VwcG9ydCBuZWVkcyB0byBiZSBjaGVja2VkIGF0IHJ1bnRpbWUuICAqLworI2RlZmluZSBfUE9TSVhfQ1BVVElNRQkwCisKKy8qIENsb2NrIHN1cHBvcnQgaW4gdGhyZWFkcyBtdXN0IGJlIGFsc28gY2hlY2tlZCBhdCBydW50aW1lLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9DUFVUSU1FCTAKKworLyogR05VIGxpYmMgcHJvdmlkZXMgcmVndWxhciBleHByZXNzaW9uIGhhbmRsaW5nLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1JFR0VYUAkxCisKKy8qIFJlYWRlci9Xcml0ZXIgbG9ja3MgYXJlIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9SRUFERVJfV1JJVEVSX0xPQ0tTCTIwMDgwOUwKKworLyogV2UgaGF2ZSBhIFBPU0lYIHNoZWxsLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NIRUxMCTEKKworLyogV2Ugc3VwcG9ydCB0aGUgVGltZW91dHMgb3B0aW9uLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RJTUVPVVRTCTIwMDgwOUwKKworLyogV2Ugc3VwcG9ydCBzcGlubG9ja3MuICAqLworI2RlZmluZSBfUE9TSVhfU1BJTl9MT0NLUwkyMDA4MDlMCisKKy8qIFRoZSBgc3Bhd24nIGZ1bmN0aW9uIGZhbWlseSBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZSBfUE9TSVhfU1BBV04JMjAwODA5TAorCisvKiBXZSBoYXZlIFBPU0lYIHRpbWVycy4gICovCisjZGVmaW5lIF9QT1NJWF9USU1FUlMJMjAwODA5TAorCisvKiBUaGUgYmFycmllciBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9CQVJSSUVSUwkyMDA4MDlMCisKKy8qIFBPU0lYIG1lc3NhZ2UgcXVldWVzIGFyZSBhdmFpbGFibGUuICAqLworI2RlZmluZQlfUE9TSVhfTUVTU0FHRV9QQVNTSU5HCTIwMDgwOUwKKworLyogVGhyZWFkIHByb2Nlc3Mtc2hhcmVkIHN5bmNocm9uaXphdGlvbiBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX1BST0NFU1NfU0hBUkVECTIwMDgwOUwKKworLyogVGhlIG1vbm90b25pYyBjbG9jayBtaWdodCBiZSBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfTU9OT1RPTklDX0NMT0NLCTAKKworLyogVGhlIGNsb2NrIHNlbGVjdGlvbiBpbnRlcmZhY2VzIGFyZSBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfQ0xPQ0tfU0VMRUNUSU9OCTIwMDgwOUwKKworLyogQWR2aXNvcnkgaW5mb3JtYXRpb24gaW50ZXJmYWNlcyBhcmUgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0FEVklTT1JZX0lORk8JMjAwODA5TAorCisvKiBJUHY2IHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0lQVjYJMjAwODA5TAorCisvKiBSYXcgc29ja2V0IHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1JBV19TT0NLRVRTCTIwMDgwOUwKKworLyogV2UgaGF2ZSBhdCBsZWFzdCBvbmUgdGVybWluYWwuICAqLworI2RlZmluZSBfUE9TSVgyX0NIQVJfVEVSTQkyMDA4MDlMCisKKy8qIE5laXRoZXIgcHJvY2VzcyBub3IgdGhyZWFkIHNwb3JhZGljIHNlcnZlciBpbnRlcmZhY2VzIGlzIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9TUE9SQURJQ19TRVJWRVIJLTEKKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9TUE9SQURJQ19TRVJWRVIJLTEKKworLyogdHJhY2UuaCBpcyBub3QgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RSQUNFCS0xCisjZGVmaW5lIF9QT1NJWF9UUkFDRV9FVkVOVF9GSUxURVIJLTEKKyNkZWZpbmUgX1BPU0lYX1RSQUNFX0lOSEVSSVQJLTEKKyNkZWZpbmUgX1BPU0lYX1RSQUNFX0xPRwktMQorCisvKiBUeXBlZCBtZW1vcnkgb2JqZWN0cyBhcmUgbm90IGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9UWVBFRF9NRU1PUllfT0JKRUNUUwktMQorCisjZW5kaWYgLyogYml0cy9wb3NpeF9vcHQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcHJlZGVmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcHJlZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMDQ4NGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wcmVkZWZzLmgKQEAgLTAsMCArMSwzMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9GRUFUVVJFU19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvcHJlZGVmcy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8ZmVhdHVyZXMuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfUFJFREVGU19ICisjZGVmaW5lIF9QUkVERUZTX0gKKworLyogV2UgZG8gc3VwcG9ydCB0aGUgSUVDIDU1OSBtYXRoIGZ1bmN0aW9uYWxpdHksIHJlYWwgYW5kIGNvbXBsZXguICAqLworI2RlZmluZSBfX1NURENfSUVDXzU1OV9fCQkxCisjZGVmaW5lIF9fU1REQ19JRUNfNTU5X0NPTVBMRVhfXwkxCisKKyNlbmRpZiAvKiBwcmVkZWZzLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3ByaW50Zi1sZGJsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wcmludGYtbGRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZGMzZjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wcmludGYtbGRibC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciA8cHJpbnRmLmg+IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUFJJTlRGX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvcHJpbnRmLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8cHJpbnRmLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK19fTERCTF9SRURJUl9ERUNMIChwcmludGZfc2l6ZSkKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3B0aHJlYWR0eXBlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcHRocmVhZHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwOWM4MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3B0aHJlYWR0eXBlcy5oCkBAIC0wLDAgKzEsMjI1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMywyMDA0LDIwMDUsMjAwNiwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0JJVFNfUFRIUkVBRFRZUEVTX0gKKyNkZWZpbmUgX0JJVFNfUFRIUkVBRFRZUEVTX0gJMQorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgX19XT1JEU0laRSA9PSA2NAorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9BVFRSX1QgNTYKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfTVVURVhfVCA0MAorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9NVVRFWEFUVFJfVCA0CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX0NPTkRfVCA0OAorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9DT05EQVRUUl9UIDQKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfUldMT0NLX1QgNTYKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfUldMT0NLQVRUUl9UIDgKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQkFSUklFUl9UIDMyCisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX0JBUlJJRVJBVFRSX1QgNAorI2Vsc2UKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQVRUUl9UIDM2CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX01VVEVYX1QgMjQKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfTVVURVhBVFRSX1QgNAorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9DT05EX1QgNDgKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQ09OREFUVFJfVCA0CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX1JXTE9DS19UIDMyCisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX1JXTE9DS0FUVFJfVCA4CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX0JBUlJJRVJfVCAyMAorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9CQVJSSUVSQVRUUl9UIDQKKyNlbmRpZgorCisKKy8qIFRocmVhZCBpZGVudGlmaWVycy4gIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlIGlzIG5vdAorICAgZXhwb3NlZCBvbiBwdXJwb3NlLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgcHRocmVhZF90OworCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfUFRIUkVBRF9BVFRSX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX2F0dHJfdDsKKworCisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBzdHJ1Y3QgX19wdGhyZWFkX2ludGVybmFsX2xpc3QKK3sKKyAgc3RydWN0IF9fcHRocmVhZF9pbnRlcm5hbF9saXN0ICpfX3ByZXY7CisgIHN0cnVjdCBfX3B0aHJlYWRfaW50ZXJuYWxfbGlzdCAqX19uZXh0OworfSBfX3B0aHJlYWRfbGlzdF90OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IF9fcHRocmVhZF9pbnRlcm5hbF9zbGlzdAoreworICBzdHJ1Y3QgX19wdGhyZWFkX2ludGVybmFsX3NsaXN0ICpfX25leHQ7Cit9IF9fcHRocmVhZF9zbGlzdF90OworI2VuZGlmCisKKworLyogRGF0YSBzdHJ1Y3R1cmVzIGZvciBtdXRleCBoYW5kbGluZy4gIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGF0dHJpYnV0ZQorICAgdHlwZSBpcyBub3QgZXhwb3NlZCBvbiBwdXJwb3NlLiAgKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgc3RydWN0IF9fcHRocmVhZF9tdXRleF9zCisgIHsKKyAgICBpbnQgX19sb2NrOworICAgIHVuc2lnbmVkIGludCBfX2NvdW50OworICAgIGludCBfX293bmVyOworI2lmIF9fV09SRFNJWkUgPT0gNjQKKyAgICB1bnNpZ25lZCBpbnQgX19udXNlcnM7CisjZW5kaWYKKyAgICAvKiBLSU5EIG11c3Qgc3RheSBhdCB0aGlzIHBvc2l0aW9uIGluIHRoZSBzdHJ1Y3R1cmUgdG8gbWFpbnRhaW4KKyAgICAgICBiaW5hcnkgY29tcGF0aWJpbGl0eS4gICovCisgICAgaW50IF9fa2luZDsKKyNpZiBfX1dPUkRTSVpFID09IDY0CisgICAgaW50IF9fc3BpbnM7CisgICAgX19wdGhyZWFkX2xpc3RfdCBfX2xpc3Q7CisjIGRlZmluZSBfX1BUSFJFQURfTVVURVhfSEFWRV9QUkVWCTEKKyNlbHNlCisgICAgdW5zaWduZWQgaW50IF9fbnVzZXJzOworICAgIF9fZXh0ZW5zaW9uX18gdW5pb24KKyAgICB7CisgICAgICBpbnQgX19zcGluczsKKyAgICAgIF9fcHRocmVhZF9zbGlzdF90IF9fbGlzdDsKKyAgICB9OworI2VuZGlmCisgIH0gX19kYXRhOworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX01VVEVYX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX211dGV4X3Q7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfUFRIUkVBRF9NVVRFWEFUVFJfVF07CisgIGludCBfX2FsaWduOworfSBwdGhyZWFkX211dGV4YXR0cl90OworCisKKy8qIERhdGEgc3RydWN0dXJlIGZvciBjb25kaXRpb25hbCB2YXJpYWJsZSBoYW5kbGluZy4gIFRoZSBzdHJ1Y3R1cmUgb2YKKyAgIHRoZSBhdHRyaWJ1dGUgdHlwZSBpcyBub3QgZXhwb3NlZCBvbiBwdXJwb3NlLiAgKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgc3RydWN0CisgIHsKKyAgICBpbnQgX19sb2NrOworICAgIHVuc2lnbmVkIGludCBfX2Z1dGV4OworICAgIF9fZXh0ZW5zaW9uX18gdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3RvdGFsX3NlcTsKKyAgICBfX2V4dGVuc2lvbl9fIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX193YWtldXBfc2VxOworICAgIF9fZXh0ZW5zaW9uX18gdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3dva2VuX3NlcTsKKyAgICB2b2lkICpfX211dGV4OworICAgIHVuc2lnbmVkIGludCBfX253YWl0ZXJzOworICAgIHVuc2lnbmVkIGludCBfX2Jyb2FkY2FzdF9zZXE7CisgIH0gX19kYXRhOworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX0NPTkRfVF07CisgIF9fZXh0ZW5zaW9uX18gbG9uZyBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX2NvbmRfdDsKKwordHlwZWRlZiB1bmlvbgoreworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX0NPTkRBVFRSX1RdOworICBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9jb25kYXR0cl90OworCisKKy8qIEtleXMgZm9yIHRocmVhZC1zcGVjaWZpYyBkYXRhICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBwdGhyZWFkX2tleV90OworCisKKy8qIE9uY2Utb25seSBleGVjdXRpb24gKi8KK3R5cGVkZWYgaW50IHB0aHJlYWRfb25jZV90OworCisKKyNpZiBkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIERhdGEgc3RydWN0dXJlIGZvciByZWFkLXdyaXRlIGxvY2sgdmFyaWFibGUgaGFuZGxpbmcuICBUaGUKKyAgIHN0cnVjdHVyZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUgaXMgbm90IGV4cG9zZWQgb24gcHVycG9zZS4gICovCit0eXBlZGVmIHVuaW9uCit7CisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyAgc3RydWN0CisgIHsKKyAgICBpbnQgX19sb2NrOworICAgIHVuc2lnbmVkIGludCBfX25yX3JlYWRlcnM7CisgICAgdW5zaWduZWQgaW50IF9fcmVhZGVyc193YWtldXA7CisgICAgdW5zaWduZWQgaW50IF9fd3JpdGVyX3dha2V1cDsKKyAgICB1bnNpZ25lZCBpbnQgX19ucl9yZWFkZXJzX3F1ZXVlZDsKKyAgICB1bnNpZ25lZCBpbnQgX19ucl93cml0ZXJzX3F1ZXVlZDsKKyAgICBpbnQgX193cml0ZXI7CisgICAgaW50IF9fc2hhcmVkOworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fcGFkMTsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3BhZDI7CisgICAgLyogRkxBR1MgbXVzdCBzdGF5IGF0IHRoaXMgcG9zaXRpb24gaW4gdGhlIHN0cnVjdHVyZSB0byBtYWludGFpbgorICAgICAgIGJpbmFyeSBjb21wYXRpYmlsaXR5LiAgKi8KKyAgICB1bnNpZ25lZCBpbnQgX19mbGFnczsKKyAgfSBfX2RhdGE7CisjIGVsc2UKKyAgc3RydWN0CisgIHsKKyAgICBpbnQgX19sb2NrOworICAgIHVuc2lnbmVkIGludCBfX25yX3JlYWRlcnM7CisgICAgdW5zaWduZWQgaW50IF9fcmVhZGVyc193YWtldXA7CisgICAgdW5zaWduZWQgaW50IF9fd3JpdGVyX3dha2V1cDsKKyAgICB1bnNpZ25lZCBpbnQgX19ucl9yZWFkZXJzX3F1ZXVlZDsKKyAgICB1bnNpZ25lZCBpbnQgX19ucl93cml0ZXJzX3F1ZXVlZDsKKyAgICAvKiBGTEFHUyBtdXN0IHN0YXkgYXQgdGhpcyBwb3NpdGlvbiBpbiB0aGUgc3RydWN0dXJlIHRvIG1haW50YWluCisgICAgICAgYmluYXJ5IGNvbXBhdGliaWxpdHkuICAqLworICAgIHVuc2lnbmVkIGNoYXIgX19mbGFnczsKKyAgICB1bnNpZ25lZCBjaGFyIF9fc2hhcmVkOworICAgIHVuc2lnbmVkIGNoYXIgX19wYWQxOworICAgIHVuc2lnbmVkIGNoYXIgX19wYWQyOworICAgIGludCBfX3dyaXRlcjsKKyAgfSBfX2RhdGE7CisjIGVuZGlmCisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfUldMT0NLX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX3J3bG9ja190OworCit0eXBlZGVmIHVuaW9uCit7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfUldMT0NLQVRUUl9UXTsKKyAgbG9uZyBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9yd2xvY2thdHRyX3Q7CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogUE9TSVggc3BpbmxvY2sgZGF0YSB0eXBlLiAgKi8KK3R5cGVkZWYgdm9sYXRpbGUgaW50IHB0aHJlYWRfc3BpbmxvY2tfdDsKKworCisvKiBQT1NJWCBiYXJyaWVycyBkYXRhIHR5cGUuICBUaGUgc3RydWN0dXJlIG9mIHRoZSB0eXBlIGlzCisgICBkZWxpYmVyYXRlbHkgbm90IGV4cG9zZWQuICAqLwordHlwZWRlZiB1bmlvbgoreworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX0JBUlJJRVJfVF07CisgIGxvbmcgaW50IF9fYWxpZ247Cit9IHB0aHJlYWRfYmFycmllcl90OworCit0eXBlZGVmIHVuaW9uCit7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfQkFSUklFUkFUVFJfVF07CisgIGludCBfX2FsaWduOworfSBwdGhyZWFkX2JhcnJpZXJhdHRyX3Q7CisjZW5kaWYKKworCisjaWYgX19XT1JEU0laRSA9PSAzMgorLyogRXh0cmEgYXR0cmlidXRlcyBmb3IgdGhlIGNsZWFudXAgZnVuY3Rpb25zLiAgKi8KKyMgZGVmaW5lIF9fY2xlYW51cF9mY3RfYXR0cmlidXRlIF9fYXR0cmlidXRlX18gKChfX3JlZ3Bhcm1fXyAoMSkpKQorI2VuZGlmCisKKyNlbmRpZgkvKiBiaXRzL3B0aHJlYWR0eXBlcy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9yZXNvdXJjZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzZjMTkyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcmVzb3VyY2UuaApAQCAtMCwwICsxLDI2OCBAQAorLyogQml0IHZhbHVlcyAmIHN0cnVjdHVyZXMgZm9yIHJlc291cmNlIGxpbWl0cy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTYtMjAwMCwgMjAwNCwgMjAwNSwgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19SRVNPVVJDRV9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvcmVzb3VyY2UuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBUcmFuc211dGUgZGVmaW5lcyB0byBlbnVtZXJhdGlvbnMuICBUaGUgbWFjcm8gcmUtZGVmaW5pdGlvbnMgYXJlCisgICBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIHByb2dyYW1zIHdhbnQgdG8gdGVzdCBmb3Igb3BlcmF0aW5nIHN5c3RlbQorICAgZmVhdHVyZXMgd2l0aCAjaWZkZWYgUlVTQUdFX1NFTEYuICBJbiBJU08gQyB0aGUgcmVmbGV4aXZlCisgICBkZWZpbml0aW9uIGlzIGEgbm8tb3AuICAqLworCisvKiBLaW5kcyBvZiByZXNvdXJjZSBsaW1pdC4gICovCitlbnVtIF9fcmxpbWl0X3Jlc291cmNlCit7CisgIC8qIFBlci1wcm9jZXNzIENQVSBsaW1pdCwgaW4gc2Vjb25kcy4gICovCisgIFJMSU1JVF9DUFUgPSAwLAorI2RlZmluZSBSTElNSVRfQ1BVIFJMSU1JVF9DUFUKKworICAvKiBMYXJnZXN0IGZpbGUgdGhhdCBjYW4gYmUgY3JlYXRlZCwgaW4gYnl0ZXMuICAqLworICBSTElNSVRfRlNJWkUgPSAxLAorI2RlZmluZQlSTElNSVRfRlNJWkUgUkxJTUlUX0ZTSVpFCisKKyAgLyogTWF4aW11bSBzaXplIG9mIGRhdGEgc2VnbWVudCwgaW4gYnl0ZXMuICAqLworICBSTElNSVRfREFUQSA9IDIsCisjZGVmaW5lCVJMSU1JVF9EQVRBIFJMSU1JVF9EQVRBCisKKyAgLyogTWF4aW11bSBzaXplIG9mIHN0YWNrIHNlZ21lbnQsIGluIGJ5dGVzLiAgKi8KKyAgUkxJTUlUX1NUQUNLID0gMywKKyNkZWZpbmUJUkxJTUlUX1NUQUNLIFJMSU1JVF9TVEFDSworCisgIC8qIExhcmdlc3QgY29yZSBmaWxlIHRoYXQgY2FuIGJlIGNyZWF0ZWQsIGluIGJ5dGVzLiAgKi8KKyAgUkxJTUlUX0NPUkUgPSA0LAorI2RlZmluZQlSTElNSVRfQ09SRSBSTElNSVRfQ09SRQorCisgIC8qIExhcmdlc3QgcmVzaWRlbnQgc2V0IHNpemUsIGluIGJ5dGVzLgorICAgICBUaGlzIGFmZmVjdHMgc3dhcHBpbmc7IHByb2Nlc3NlcyB0aGF0IGFyZSBleGNlZWRpbmcgdGhlaXIKKyAgICAgcmVzaWRlbnQgc2V0IHNpemUgd2lsbCBiZSBtb3JlIGxpa2VseSB0byBoYXZlIHBoeXNpY2FsIG1lbW9yeQorICAgICB0YWtlbiBmcm9tIHRoZW0uICAqLworICBfX1JMSU1JVF9SU1MgPSA1LAorI2RlZmluZQlSTElNSVRfUlNTIF9fUkxJTUlUX1JTUworCisgIC8qIE51bWJlciBvZiBvcGVuIGZpbGVzLiAgKi8KKyAgUkxJTUlUX05PRklMRSA9IDcsCisgIF9fUkxJTUlUX09GSUxFID0gUkxJTUlUX05PRklMRSwgLyogQlNEIG5hbWUgZm9yIHNhbWUuICAqLworI2RlZmluZSBSTElNSVRfTk9GSUxFIFJMSU1JVF9OT0ZJTEUKKyNkZWZpbmUgUkxJTUlUX09GSUxFIF9fUkxJTUlUX09GSUxFCisKKyAgLyogQWRkcmVzcyBzcGFjZSBsaW1pdC4gICovCisgIFJMSU1JVF9BUyA9IDksCisjZGVmaW5lIFJMSU1JVF9BUyBSTElNSVRfQVMKKworICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VzLiAgKi8KKyAgX19STElNSVRfTlBST0MgPSA2LAorI2RlZmluZSBSTElNSVRfTlBST0MgX19STElNSVRfTlBST0MKKworICAvKiBMb2NrZWQtaW4tbWVtb3J5IGFkZHJlc3Mgc3BhY2UuICAqLworICBfX1JMSU1JVF9NRU1MT0NLID0gOCwKKyNkZWZpbmUgUkxJTUlUX01FTUxPQ0sgX19STElNSVRfTUVNTE9DSworCisgIC8qIE1heGltdW0gbnVtYmVyIG9mIGZpbGUgbG9ja3MuICAqLworICBfX1JMSU1JVF9MT0NLUyA9IDEwLAorI2RlZmluZSBSTElNSVRfTE9DS1MgX19STElNSVRfTE9DS1MKKworICAvKiBNYXhpbXVtIG51bWJlciBvZiBwZW5kaW5nIHNpZ25hbHMuICAqLworICBfX1JMSU1JVF9TSUdQRU5ESU5HID0gMTEsCisjZGVmaW5lIFJMSU1JVF9TSUdQRU5ESU5HIF9fUkxJTUlUX1NJR1BFTkRJTkcKKworICAvKiBNYXhpbXVtIGJ5dGVzIGluIFBPU0lYIG1lc3NhZ2UgcXVldWVzLiAgKi8KKyAgX19STElNSVRfTVNHUVVFVUUgPSAxMiwKKyNkZWZpbmUgUkxJTUlUX01TR1FVRVVFIF9fUkxJTUlUX01TR1FVRVVFCisKKyAgLyogTWF4aW11bSBuaWNlIHByaW9yaXR5IGFsbG93ZWQgdG8gcmFpc2UgdG8uCisgICAgIE5pY2UgbGV2ZWxzIDE5IC4uIC0yMCBjb3JyZXNwb25kIHRvIDAgLi4gMzkKKyAgICAgdmFsdWVzIG9mIHRoaXMgcmVzb3VyY2UgbGltaXQuICAqLworICBfX1JMSU1JVF9OSUNFID0gMTMsCisjZGVmaW5lIFJMSU1JVF9OSUNFIF9fUkxJTUlUX05JQ0UKKworICAvKiBNYXhpbXVtIHJlYWx0aW1lIHByaW9yaXR5IGFsbG93ZWQgZm9yIG5vbi1wcml2aWxlZGdlZAorICAgICBwcm9jZXNzZXMuICAqLworICBfX1JMSU1JVF9SVFBSSU8gPSAxNCwKKyNkZWZpbmUgUkxJTUlUX1JUUFJJTyBfX1JMSU1JVF9SVFBSSU8KKworICAvKiBNYXhpbXVtIENQVSB0aW1lIGluIMK1cyB0aGF0IGEgcHJvY2VzcyBzY2hlZHVsZWQgdW5kZXIgYSByZWFsLXRpbWUKKyAgICAgc2NoZWR1bGluZyBwb2xpY3kgbWF5IGNvbnN1bWUgd2l0aG91dCBtYWtpbmcgYSBibG9ja2luZyBzeXN0ZW0KKyAgICAgY2FsbCBiZWZvcmUgYmVpbmcgZm9yY2libHkgZGVzY2hlZHVsZWQuICAqLworICBfX1JMSU1JVF9SVFRJTUUgPSAxNSwKKyNkZWZpbmUgUkxJTUlUX1JUVElNRSBfX1JMSU1JVF9SVFRJTUUKKworICBfX1JMSU1JVF9OTElNSVRTID0gMTYsCisgIF9fUkxJTV9OTElNSVRTID0gX19STElNSVRfTkxJTUlUUworI2RlZmluZSBSTElNSVRfTkxJTUlUUyBfX1JMSU1JVF9OTElNSVRTCisjZGVmaW5lIFJMSU1fTkxJTUlUUyBfX1JMSU1fTkxJTUlUUworfTsKKworLyogVmFsdWUgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyBsaW1pdC4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyMgZGVmaW5lIFJMSU1fSU5GSU5JVFkgKCh1bnNpZ25lZCBsb25nIGludCkofjBVTCkpCisjZWxzZQorIyBkZWZpbmUgUkxJTV9JTkZJTklUWSAweGZmZmZmZmZmZmZmZmZmZmZ1TEwKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKKyMgZGVmaW5lIFJMSU02NF9JTkZJTklUWSAweGZmZmZmZmZmZmZmZmZmZmZ1TEwKKyNlbmRpZgorCisvKiBXZSBjYW4gcmVwcmVzZW50IGFsbCBsaW1pdHMuICAqLworI2RlZmluZSBSTElNX1NBVkVEX01BWAlSTElNX0lORklOSVRZCisjZGVmaW5lIFJMSU1fU0FWRURfQ1VSCVJMSU1fSU5GSU5JVFkKKworCisvKiBUeXBlIGZvciByZXNvdXJjZSBxdWFudGl0eSBtZWFzdXJlbWVudC4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19ybGltX3QgcmxpbV90OworI2Vsc2UKK3R5cGVkZWYgX19ybGltNjRfdCBybGltX3Q7CisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAordHlwZWRlZiBfX3JsaW02NF90IHJsaW02NF90OworI2VuZGlmCisKK3N0cnVjdCBybGltaXQKKyAgeworICAgIC8qIFRoZSBjdXJyZW50IChzb2Z0KSBsaW1pdC4gICovCisgICAgcmxpbV90IHJsaW1fY3VyOworICAgIC8qIFRoZSBoYXJkIGxpbWl0LiAgKi8KKyAgICBybGltX3QgcmxpbV9tYXg7CisgIH07CisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorc3RydWN0IHJsaW1pdDY0CisgIHsKKyAgICAvKiBUaGUgY3VycmVudCAoc29mdCkgbGltaXQuICAqLworICAgIHJsaW02NF90IHJsaW1fY3VyOworICAgIC8qIFRoZSBoYXJkIGxpbWl0LiAgKi8KKyAgICBybGltNjRfdCBybGltX21heDsKKyB9OworI2VuZGlmCisKKy8qIFdob3NlIHVzYWdlIHN0YXRpc3RpY3MgZG8geW91IHdhbnQ/ICAqLworZW51bSBfX3J1c2FnZV93aG8KK3sKKyAgLyogVGhlIGNhbGxpbmcgcHJvY2Vzcy4gICovCisgIFJVU0FHRV9TRUxGID0gMCwKKyNkZWZpbmUgUlVTQUdFX1NFTEYgUlVTQUdFX1NFTEYKKworICAvKiBBbGwgb2YgaXRzIHRlcm1pbmF0ZWQgY2hpbGQgcHJvY2Vzc2VzLiAgKi8KKyAgUlVTQUdFX0NISUxEUkVOID0gLTEKKyNkZWZpbmUgUlVTQUdFX0NISUxEUkVOIFJVU0FHRV9DSElMRFJFTgorCisjaWZkZWYgX19VU0VfR05VCisgICwKKyAgLyogVGhlIGNhbGxpbmcgdGhyZWFkLiAgKi8KKyAgUlVTQUdFX1RIUkVBRCA9IDEKKyMgZGVmaW5lIFJVU0FHRV9USFJFQUQgUlVTQUdFX1RIUkVBRAorICAvKiBOYW1lIGZvciB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IG9uIFNvbGFyaXMuICAqLworIyBkZWZpbmUgUlVTQUdFX0xXUCBSVVNBR0VfVEhSRUFECisjZW5kaWYKK307CisKKyNkZWZpbmUgX19uZWVkX3RpbWV2YWwKKyNpbmNsdWRlIDxiaXRzL3RpbWUuaD4JCS8qIEZvciBgc3RydWN0IHRpbWV2YWwnLiAgKi8KKworLyogU3RydWN0dXJlIHdoaWNoIHNheXMgaG93IG11Y2ggb2YgZWFjaCByZXNvdXJjZSBoYXMgYmVlbiB1c2VkLiAgKi8KK3N0cnVjdCBydXNhZ2UKKyAgeworICAgIC8qIFRvdGFsIGFtb3VudCBvZiB1c2VyIHRpbWUgdXNlZC4gICovCisgICAgc3RydWN0IHRpbWV2YWwgcnVfdXRpbWU7CisgICAgLyogVG90YWwgYW1vdW50IG9mIHN5c3RlbSB0aW1lIHVzZWQuICAqLworICAgIHN0cnVjdCB0aW1ldmFsIHJ1X3N0aW1lOworICAgIC8qIE1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgKGluIGtpbG9ieXRlcykuICAqLworICAgIGxvbmcgaW50IHJ1X21heHJzczsKKyAgICAvKiBBbW91bnQgb2Ygc2hhcmluZyBvZiB0ZXh0IHNlZ21lbnQgbWVtb3J5CisgICAgICAgd2l0aCBvdGhlciBwcm9jZXNzZXMgKGtpbG9ieXRlLXNlY29uZHMpLiAgKi8KKyAgICBsb25nIGludCBydV9peHJzczsKKyAgICAvKiBBbW91bnQgb2YgZGF0YSBzZWdtZW50IG1lbW9yeSB1c2VkIChraWxvYnl0ZS1zZWNvbmRzKS4gICovCisgICAgbG9uZyBpbnQgcnVfaWRyc3M7CisgICAgLyogQW1vdW50IG9mIHN0YWNrIG1lbW9yeSB1c2VkIChraWxvYnl0ZS1zZWNvbmRzKS4gICovCisgICAgbG9uZyBpbnQgcnVfaXNyc3M7CisgICAgLyogTnVtYmVyIG9mIHNvZnQgcGFnZSBmYXVsdHMgKGkuZS4gdGhvc2Ugc2VydmljZWQgYnkgcmVjbGFpbWluZworICAgICAgIGEgcGFnZSBmcm9tIHRoZSBsaXN0IG9mIHBhZ2VzIGF3YWl0aW5nIHJlYWxsb2NhdGlvbi4gICovCisgICAgbG9uZyBpbnQgcnVfbWluZmx0OworICAgIC8qIE51bWJlciBvZiBoYXJkIHBhZ2UgZmF1bHRzIChpLmUuIHRob3NlIHRoYXQgcmVxdWlyZWQgSS9PKS4gICovCisgICAgbG9uZyBpbnQgcnVfbWFqZmx0OworICAgIC8qIE51bWJlciBvZiB0aW1lcyBhIHByb2Nlc3Mgd2FzIHN3YXBwZWQgb3V0IG9mIHBoeXNpY2FsIG1lbW9yeS4gICovCisgICAgbG9uZyBpbnQgcnVfbnN3YXA7CisgICAgLyogTnVtYmVyIG9mIGlucHV0IG9wZXJhdGlvbnMgdmlhIHRoZSBmaWxlIHN5c3RlbS4gIE5vdGU6IFRoaXMKKyAgICAgICBhbmQgYHJ1X291YmxvY2snIGRvIG5vdCBpbmNsdWRlIG9wZXJhdGlvbnMgd2l0aCB0aGUgY2FjaGUuICAqLworICAgIGxvbmcgaW50IHJ1X2luYmxvY2s7CisgICAgLyogTnVtYmVyIG9mIG91dHB1dCBvcGVyYXRpb25zIHZpYSB0aGUgZmlsZSBzeXN0ZW0uICAqLworICAgIGxvbmcgaW50IHJ1X291YmxvY2s7CisgICAgLyogTnVtYmVyIG9mIElQQyBtZXNzYWdlcyBzZW50LiAgKi8KKyAgICBsb25nIGludCBydV9tc2dzbmQ7CisgICAgLyogTnVtYmVyIG9mIElQQyBtZXNzYWdlcyByZWNlaXZlZC4gICovCisgICAgbG9uZyBpbnQgcnVfbXNncmN2OworICAgIC8qIE51bWJlciBvZiBzaWduYWxzIGRlbGl2ZXJlZC4gICovCisgICAgbG9uZyBpbnQgcnVfbnNpZ25hbHM7CisgICAgLyogTnVtYmVyIG9mIHZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzLCBpLmUuIGJlY2F1c2UgdGhlIHByb2Nlc3MKKyAgICAgICBnYXZlIHVwIHRoZSBwcm9jZXNzIGJlZm9yZSBpdCBoYWQgdG8gKHVzdWFsbHkgdG8gd2FpdCBmb3Igc29tZQorICAgICAgIHJlc291cmNlIHRvIGJlIGF2YWlsYWJsZSkuICAqLworICAgIGxvbmcgaW50IHJ1X252Y3N3OworICAgIC8qIE51bWJlciBvZiBpbnZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzLCBpLmUuIGEgaGlnaGVyIHByaW9yaXR5IHByb2Nlc3MKKyAgICAgICBiZWNhbWUgcnVubmFibGUgb3IgdGhlIGN1cnJlbnQgcHJvY2VzcyB1c2VkIHVwIGl0cyB0aW1lIHNsaWNlLiAgKi8KKyAgICBsb25nIGludCBydV9uaXZjc3c7CisgIH07CisKKy8qIFByaW9yaXR5IGxpbWl0cy4gICovCisjZGVmaW5lIFBSSU9fTUlOCS0yMAkvKiBNaW5pbXVtIHByaW9yaXR5IGEgcHJvY2VzcyBjYW4gaGF2ZS4gICovCisjZGVmaW5lIFBSSU9fTUFYCTIwCS8qIE1heGltdW0gcHJpb3JpdHkgYSBwcm9jZXNzIGNhbiBoYXZlLiAgKi8KKworLyogVGhlIHR5cGUgb2YgdGhlIFdISUNIIGFyZ3VtZW50IHRvIGBnZXRwcmlvcml0eScgYW5kIGBzZXRwcmlvcml0eScsCisgICBpbmRpY2F0aW5nIHdoYXQgZmxhdm9yIG9mIGVudGl0eSB0aGUgV0hPIGFyZ3VtZW50IHNwZWNpZmllcy4gICovCitlbnVtIF9fcHJpb3JpdHlfd2hpY2gKK3sKKyAgUFJJT19QUk9DRVNTID0gMCwJCS8qIFdITyBpcyBhIHByb2Nlc3MgSUQuICAqLworI2RlZmluZSBQUklPX1BST0NFU1MgUFJJT19QUk9DRVNTCisgIFBSSU9fUEdSUCA9IDEsCQkvKiBXSE8gaXMgYSBwcm9jZXNzIGdyb3VwIElELiAgKi8KKyNkZWZpbmUgUFJJT19QR1JQIFBSSU9fUEdSUAorICBQUklPX1VTRVIgPSAyCQkJLyogV0hPIGlzIGEgdXNlciBJRC4gICovCisjZGVmaW5lIFBSSU9fVVNFUiBQUklPX1VTRVIKK307CisKKworX19CRUdJTl9ERUNMUworCisjaWZkZWYgX19VU0VfR05VCisvKiBNb2RpZnkgYW5kIHJldHVybiByZXNvdXJjZSBsaW1pdHMgb2YgYSBwcm9jZXNzIGF0b21pY2FsbHkuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBwcmxpbWl0IChfX3BpZF90IF9fcGlkLCBlbnVtIF9fcmxpbWl0X3Jlc291cmNlIF9fcmVzb3VyY2UsCisJCSAgICBfX2NvbnN0IHN0cnVjdCBybGltaXQgKl9fbmV3X2xpbWl0LAorCQkgICAgc3RydWN0IHJsaW1pdCAqX19vbGRfbGltaXQpIF9fVEhST1c7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChwcmxpbWl0LCAoX19waWRfdCBfX3BpZCwKKwkJCQkgICAgIGVudW0gX19ybGltaXRfcmVzb3VyY2UgX19yZXNvdXJjZSwKKwkJCQkgICAgIF9fY29uc3Qgc3RydWN0IHJsaW1pdCAqX19uZXdfbGltaXQsCisJCQkJICAgICBzdHJ1Y3QgcmxpbWl0ICpfX29sZF9saW1pdCksIHBybGltaXQ2NCk7CisjICBlbHNlCisjICAgZGVmaW5lIHBybGltaXQgcHJsaW1pdDY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBwcmxpbWl0NjQgKF9fcGlkX3QgX19waWQsIGVudW0gX19ybGltaXRfcmVzb3VyY2UgX19yZXNvdXJjZSwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgcmxpbWl0NjQgKl9fbmV3X2xpbWl0LAorCQkgICAgICBzdHJ1Y3QgcmxpbWl0NjQgKl9fb2xkX2xpbWl0KSBfX1RIUk9XOworIyBlbmRpZgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zY2hlZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2NoZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjE0MzFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2NoZWQuaApAQCAtMCwwICsxLDIxMiBAQAorLyogRGVmaW5pdGlvbnMgb2YgY29uc3RhbnRzIGFuZCBkYXRhIHN0cnVjdHVyZSBmb3IgUE9TSVggMTAwMy4xYi0xOTkzCisgICBzY2hlZHVsaW5nIGludGVyZmFjZS4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5LDIwMDEtMjAwMywyMDA1LDIwMDYsMjAwNywyMDA4LDIwMDksMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19uZWVkX3NjaGVkcGFyYW0KKworI2lmbmRlZiBfU0NIRURfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zY2hlZC5oPiBkaXJlY3RseTsgdXNlIDxzY2hlZC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKy8qIFNjaGVkdWxpbmcgYWxnb3JpdGhtcy4gICovCisjZGVmaW5lIFNDSEVEX09USEVSCQkwCisjZGVmaW5lIFNDSEVEX0ZJRk8JCTEKKyNkZWZpbmUgU0NIRURfUlIJCTIKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFNDSEVEX0JBVENICQkzCisjIGRlZmluZSBTQ0hFRF9JRExFCQk1CisKKyMgZGVmaW5lIFNDSEVEX1JFU0VUX09OX0ZPUksJMHg0MDAwMDAwMAorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIENsb25pbmcgZmxhZ3MuICAqLworIyBkZWZpbmUgQ1NJR05BTCAgICAgICAweDAwMDAwMGZmIC8qIFNpZ25hbCBtYXNrIHRvIGJlIHNlbnQgYXQgZXhpdC4gICovCisjIGRlZmluZSBDTE9ORV9WTSAgICAgIDB4MDAwMDAxMDAgLyogU2V0IGlmIFZNIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3Nlcy4gICovCisjIGRlZmluZSBDTE9ORV9GUyAgICAgIDB4MDAwMDAyMDAgLyogU2V0IGlmIGZzIGluZm8gc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzLiAgKi8KKyMgZGVmaW5lIENMT05FX0ZJTEVTICAgMHgwMDAwMDQwMCAvKiBTZXQgaWYgb3BlbiBmaWxlcyBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMuICAqLworIyBkZWZpbmUgQ0xPTkVfU0lHSEFORCAweDAwMDAwODAwIC8qIFNldCBpZiBzaWduYWwgaGFuZGxlcnMgc2hhcmVkLiAgKi8KKyMgZGVmaW5lIENMT05FX1BUUkFDRSAgMHgwMDAwMjAwMCAvKiBTZXQgaWYgdHJhY2luZyBjb250aW51ZXMgb24gdGhlIGNoaWxkLiAgKi8KKyMgZGVmaW5lIENMT05FX1ZGT1JLICAgMHgwMDAwNDAwMCAvKiBTZXQgaWYgdGhlIHBhcmVudCB3YW50cyB0aGUgY2hpbGQgdG8KKwkJCQkgICAgIHdha2UgaXQgdXAgb24gbW1fcmVsZWFzZS4gICovCisjIGRlZmluZSBDTE9ORV9QQVJFTlQgIDB4MDAwMDgwMDAgLyogU2V0IGlmIHdlIHdhbnQgdG8gaGF2ZSB0aGUgc2FtZQorCQkJCSAgICAgcGFyZW50IGFzIHRoZSBjbG9uZXIuICAqLworIyBkZWZpbmUgQ0xPTkVfVEhSRUFEICAweDAwMDEwMDAwIC8qIFNldCB0byBhZGQgdG8gc2FtZSB0aHJlYWQgZ3JvdXAuICAqLworIyBkZWZpbmUgQ0xPTkVfTkVXTlMgICAweDAwMDIwMDAwIC8qIFNldCB0byBjcmVhdGUgbmV3IG5hbWVzcGFjZS4gICovCisjIGRlZmluZSBDTE9ORV9TWVNWU0VNIDB4MDAwNDAwMDAgLyogU2V0IHRvIHNoYXJlZCBTVklEIFNFTV9VTkRPIHNlbWFudGljcy4gICovCisjIGRlZmluZSBDTE9ORV9TRVRUTFMgIDB4MDAwODAwMDAgLyogU2V0IFRMUyBpbmZvLiAgKi8KKyMgZGVmaW5lIENMT05FX1BBUkVOVF9TRVRUSUQgMHgwMDEwMDAwMCAvKiBTdG9yZSBUSUQgaW4gdXNlcmxldmVsIGJ1ZmZlcgorCQkJCQkgICBiZWZvcmUgTU0gY29weS4gICovCisjIGRlZmluZSBDTE9ORV9DSElMRF9DTEVBUlRJRCAweDAwMjAwMDAwIC8qIFJlZ2lzdGVyIGV4aXQgZnV0ZXggYW5kIG1lbW9yeQorCQkJCQkgICAgbG9jYXRpb24gdG8gY2xlYXIuICAqLworIyBkZWZpbmUgQ0xPTkVfREVUQUNIRUQgMHgwMDQwMDAwMCAvKiBDcmVhdGUgY2xvbmUgZGV0YWNoZWQuICAqLworIyBkZWZpbmUgQ0xPTkVfVU5UUkFDRUQgMHgwMDgwMDAwMCAvKiBTZXQgaWYgdGhlIHRyYWNpbmcgcHJvY2VzcyBjYW4ndAorCQkJCSAgICAgIGZvcmNlIENMT05FX1BUUkFDRSBvbiB0aGlzIGNsb25lLiAgKi8KKyMgZGVmaW5lIENMT05FX0NISUxEX1NFVFRJRCAweDAxMDAwMDAwIC8qIFN0b3JlIFRJRCBpbiB1c2VybGV2ZWwgYnVmZmVyIGluCisJCQkJCSAgdGhlIGNoaWxkLiAgKi8KKyMgZGVmaW5lIENMT05FX05FV1VUUwkweDA0MDAwMDAwCS8qIE5ldyB1dHNuYW1lIGdyb3VwLiAgKi8KKyMgZGVmaW5lIENMT05FX05FV0lQQwkweDA4MDAwMDAwCS8qIE5ldyBpcGNzLiAgKi8KKyMgZGVmaW5lIENMT05FX05FV1VTRVIJMHgxMDAwMDAwMAkvKiBOZXcgdXNlciBuYW1lc3BhY2UuICAqLworIyBkZWZpbmUgQ0xPTkVfTkVXUElECTB4MjAwMDAwMDAJLyogTmV3IHBpZCBuYW1lc3BhY2UuICAqLworIyBkZWZpbmUgQ0xPTkVfTkVXTkVUCTB4NDAwMDAwMDAJLyogTmV3IG5ldHdvcmsgbmFtZXNwYWNlLiAgKi8KKyMgZGVmaW5lIENMT05FX0lPCTB4ODAwMDAwMDAJLyogQ2xvbmUgSS9PIGNvbnRleHQuICAqLworI2VuZGlmCisKKy8qIFRoZSBvZmZpY2lhbCBkZWZpbml0aW9uLiAgKi8KK3N0cnVjdCBzY2hlZF9wYXJhbQorICB7CisgICAgaW50IF9fc2NoZWRfcHJpb3JpdHk7CisgIH07CisKK19fQkVHSU5fREVDTFMKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQ2xvbmUgY3VycmVudCBwcm9jZXNzLiAgKi8KK2V4dGVybiBpbnQgY2xvbmUgKGludCAoKl9fZm4pICh2b2lkICpfX2FyZyksIHZvaWQgKl9fY2hpbGRfc3RhY2ssCisJCSAgaW50IF9fZmxhZ3MsIHZvaWQgKl9fYXJnLCAuLi4pIF9fVEhST1c7CisKKy8qIFVuc2hhcmUgdGhlIHNwZWNpZmllZCByZXNvdXJjZXMuICAqLworZXh0ZXJuIGludCB1bnNoYXJlIChpbnQgX19mbGFncykgX19USFJPVzsKKworLyogR2V0IGluZGV4IG9mIGN1cnJlbnRseSB1c2VkIENQVS4gICovCitleHRlcm4gaW50IHNjaGVkX2dldGNwdSAodm9pZCkgX19USFJPVzsKKworLyogU3dpdGNoIHByb2Nlc3MgdG8gbmFtZXNwYWNlIG9mIHR5cGUgTlNUWVBFIGluZGljYXRlZCBieSBGRC4gICovCitleHRlcm4gaW50IHNldG5zIChpbnQgX19mZCwgaW50IF9fbnN0eXBlKSBfX1RIUk9XOworI2VuZGlmCisKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIG5lZWQgc2NoZWRwYXJhbSAqLworCisjaWYgIWRlZmluZWQgX19kZWZpbmVkX3NjaGVkcGFyYW0gXAorICAgICYmIChkZWZpbmVkIF9fbmVlZF9zY2hlZHBhcmFtIHx8IGRlZmluZWQgX1NDSEVEX0gpCisjIGRlZmluZSBfX2RlZmluZWRfc2NoZWRwYXJhbQkxCisvKiBEYXRhIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHByb2Nlc3MnIHNjaGVkdWxhYmlsaXR5LiAgKi8KK3N0cnVjdCBfX3NjaGVkX3BhcmFtCisgIHsKKyAgICBpbnQgX19zY2hlZF9wcmlvcml0eTsKKyAgfTsKKyMgdW5kZWYgX19uZWVkX3NjaGVkcGFyYW0KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9TQ0hFRF9IICYmICFkZWZpbmVkIF9fY3B1X3NldF90X2RlZmluZWQKKyMgZGVmaW5lIF9fY3B1X3NldF90X2RlZmluZWQKKy8qIFNpemUgZGVmaW5pdGlvbiBmb3IgQ1BVIHNldHMuICAqLworIyBkZWZpbmUgX19DUFVfU0VUU0laRQkxMDI0CisjIGRlZmluZSBfX05DUFVCSVRTCSg4ICogc2l6ZW9mIChfX2NwdV9tYXNrKSkKKworLyogVHlwZSBmb3IgYXJyYXkgZWxlbWVudHMgaW4gJ2NwdV9zZXRfdCcuICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX2NwdV9tYXNrOworCisvKiBCYXNpYyBhY2Nlc3MgZnVuY3Rpb25zLiAgKi8KKyMgZGVmaW5lIF9fQ1BVRUxUKGNwdSkJKChjcHUpIC8gX19OQ1BVQklUUykKKyMgZGVmaW5lIF9fQ1BVTUFTSyhjcHUpCSgoX19jcHVfbWFzaykgMSA8PCAoKGNwdSkgJSBfX05DUFVCSVRTKSkKKworLyogRGF0YSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgQ1BVIG1hc2suICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgX19jcHVfbWFzayBfX2JpdHNbX19DUFVfU0VUU0laRSAvIF9fTkNQVUJJVFNdOworfSBjcHVfc2V0X3Q7CisKKy8qIEFjY2VzcyBmdW5jdGlvbnMgZm9yIENQVSBtYXNrcy4gICovCisjIGlmIF9fR05VQ19QUkVSRVEgKDIsIDkxKQorIyAgZGVmaW5lIF9fQ1BVX1pFUk9fUyhzZXRzaXplLCBjcHVzZXRwKSBcCisgIGRvIF9fYnVpbHRpbl9tZW1zZXQgKGNwdXNldHAsICdcMCcsIHNldHNpemUpOyB3aGlsZSAoMCkKKyMgZWxzZQorIyAgZGVmaW5lIF9fQ1BVX1pFUk9fUyhzZXRzaXplLCBjcHVzZXRwKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgc2l6ZV90IF9faTsJCQkJCQkJCSAgICAgIFwKKyAgICBzaXplX3QgX19pbWF4ID0gKHNldHNpemUpIC8gc2l6ZW9mIChfX2NwdV9tYXNrKTsJCQkgICAgICBcCisgICAgX19jcHVfbWFzayAqX19iaXRzID0gKGNwdXNldHApLT5fX2JpdHM7CQkJCSAgICAgIFwKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9faW1heDsgKytfX2kpCQkJCQkgICAgICBcCisgICAgICBfX2JpdHNbX19pXSA9IDA7CQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgZW5kaWYKKyMgZGVmaW5lIF9fQ1BVX1NFVF9TKGNwdSwgc2V0c2l6ZSwgY3B1c2V0cCkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBzaXplX3QgX19jcHUgPSAoY3B1KTsJCQkJCQkgICAgICBcCisgICAgICBfX2NwdSA8IDggKiAoc2V0c2l6ZSkJCQkJCQkgICAgICBcCisgICAgICA/ICgoKF9fY3B1X21hc2sgKikgKChjcHVzZXRwKS0+X19iaXRzKSlbX19DUFVFTFQgKF9fY3B1KV0JCSAgICAgIFwKKwkgfD0gX19DUFVNQVNLIChfX2NwdSkpCQkJCQkJICAgICAgXAorICAgICAgOiAwOyB9KSkKKyMgZGVmaW5lIF9fQ1BVX0NMUl9TKGNwdSwgc2V0c2l6ZSwgY3B1c2V0cCkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBzaXplX3QgX19jcHUgPSAoY3B1KTsJCQkJCQkgICAgICBcCisgICAgICBfX2NwdSA8IDggKiAoc2V0c2l6ZSkJCQkJCQkgICAgICBcCisgICAgICA/ICgoKF9fY3B1X21hc2sgKikgKChjcHVzZXRwKS0+X19iaXRzKSlbX19DUFVFTFQgKF9fY3B1KV0JCSAgICAgIFwKKwkgJj0gfl9fQ1BVTUFTSyAoX19jcHUpKQkJCQkJCSAgICAgIFwKKyAgICAgIDogMDsgfSkpCisjIGRlZmluZSBfX0NQVV9JU1NFVF9TKGNwdSwgc2V0c2l6ZSwgY3B1c2V0cCkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBzaXplX3QgX19jcHUgPSAoY3B1KTsJCQkJCQkgICAgICBcCisgICAgICBfX2NwdSA8IDggKiAoc2V0c2l6ZSkJCQkJCQkgICAgICBcCisgICAgICA/ICgoKChfX2NvbnN0IF9fY3B1X21hc2sgKikgKChjcHVzZXRwKS0+X19iaXRzKSlbX19DUFVFTFQgKF9fY3B1KV0gICAgICBcCisJICAmIF9fQ1BVTUFTSyAoX19jcHUpKSkgIT0gMAkJCQkJICAgICAgXAorICAgICAgOiAwOyB9KSkKKworIyBkZWZpbmUgX19DUFVfQ09VTlRfUyhzZXRzaXplLCBjcHVzZXRwKSBcCisgIF9fc2NoZWRfY3B1Y291bnQgKHNldHNpemUsIGNwdXNldHApCisKKyMgaWYgX19HTlVDX1BSRVJFUSAoMiwgOTEpCisjICBkZWZpbmUgX19DUFVfRVFVQUxfUyhzZXRzaXplLCBjcHVzZXRwMSwgY3B1c2V0cDIpIFwKKyAgKF9fYnVpbHRpbl9tZW1jbXAgKGNwdXNldHAxLCBjcHVzZXRwMiwgc2V0c2l6ZSkgPT0gMCkKKyMgZWxzZQorIyAgZGVmaW5lIF9fQ1BVX0VRVUFMX1Moc2V0c2l6ZSwgY3B1c2V0cDEsIGNwdXNldHAyKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fY29uc3QgX19jcHVfbWFzayAqX19hcnIxID0gKGNwdXNldHAxKS0+X19iaXRzOwkJCSAgICAgIFwKKyAgICAgIF9fY29uc3QgX19jcHVfbWFzayAqX19hcnIyID0gKGNwdXNldHAyKS0+X19iaXRzOwkJCSAgICAgIFwKKyAgICAgIHNpemVfdCBfX2ltYXggPSAoc2V0c2l6ZSkgLyBzaXplb2YgKF9fY3B1X21hc2spOwkJCSAgICAgIFwKKyAgICAgIHNpemVfdCBfX2k7CQkJCQkJCSAgICAgIFwKKyAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19pbWF4OyArK19faSkJCQkJICAgICAgXAorCWlmIChfX2FycjFbX19pXSAhPSBfX2FycjJbX19pXSkJCQkJCSAgICAgIFwKKwkgIGJyZWFrOwkJCQkJCQkgICAgICBcCisgICAgICBfX2kgPT0gX19pbWF4OyB9KSkKKyMgZW5kaWYKKworIyBkZWZpbmUgX19DUFVfT1BfUyhzZXRzaXplLCBkZXN0c2V0LCBzcmNzZXQxLCBzcmNzZXQyLCBvcCkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBjcHVfc2V0X3QgKl9fZGVzdCA9IChkZXN0c2V0KTsJCQkJCSAgICAgIFwKKyAgICAgIF9fY29uc3QgX19jcHVfbWFzayAqX19hcnIxID0gKHNyY3NldDEpLT5fX2JpdHM7CQkJICAgICAgXAorICAgICAgX19jb25zdCBfX2NwdV9tYXNrICpfX2FycjIgPSAoc3Jjc2V0MiktPl9fYml0czsJCQkgICAgICBcCisgICAgICBzaXplX3QgX19pbWF4ID0gKHNldHNpemUpIC8gc2l6ZW9mIChfX2NwdV9tYXNrKTsJCQkgICAgICBcCisgICAgICBzaXplX3QgX19pOwkJCQkJCQkgICAgICBcCisgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9faW1heDsgKytfX2kpCQkJCSAgICAgIFwKKwkoKF9fY3B1X21hc2sgKikgX19kZXN0LT5fX2JpdHMpW19faV0gPSBfX2FycjFbX19pXSBvcCBfX2FycjJbX19pXTsgICAgXAorICAgICAgX19kZXN0OyB9KSkKKworIyBkZWZpbmUgX19DUFVfQUxMT0NfU0laRShjb3VudCkgXAorICAoKCgoY291bnQpICsgX19OQ1BVQklUUyAtIDEpIC8gX19OQ1BVQklUUykgKiBzaXplb2YgKF9fY3B1X21hc2spKQorIyBkZWZpbmUgX19DUFVfQUxMT0MoY291bnQpIF9fc2NoZWRfY3B1YWxsb2MgKGNvdW50KQorIyBkZWZpbmUgX19DUFVfRlJFRShjcHVzZXQpIF9fc2NoZWRfY3B1ZnJlZSAoY3B1c2V0KQorCitfX0JFR0lOX0RFQ0xTCisKK2V4dGVybiBpbnQgX19zY2hlZF9jcHVjb3VudCAoc2l6ZV90IF9fc2V0c2l6ZSwgY29uc3QgY3B1X3NldF90ICpfX3NldHApCisgIF9fVEhST1c7CitleHRlcm4gY3B1X3NldF90ICpfX3NjaGVkX2NwdWFsbG9jIChzaXplX3QgX19jb3VudCkgX19USFJPVyBfX3d1cjsKK2V4dGVybiB2b2lkIF9fc2NoZWRfY3B1ZnJlZSAoY3B1X3NldF90ICpfX3NldCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZWxlY3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYmRkN2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZWxlY3QuaApAQCAtMCwwICsxLDY0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTctMTk5OSwyMDAxLDIwMDgsMjAwOSwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0VMRUNUX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9zZWxlY3QuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9zZWxlY3QuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisKKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIF9fRkRfWkVST19TVE9TICJzdG9zcSIKKyMgZWxzZQorIyAgZGVmaW5lIF9fRkRfWkVST19TVE9TICJzdG9zbCIKKyMgZW5kaWYKKworIyBkZWZpbmUgX19GRF9aRVJPKGZkc3ApIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBpbnQgX19kMCwgX19kMTsJCQkJCQkJICAgICAgXAorICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkOyByZXA7ICIgX19GRF9aRVJPX1NUT1MJCQkgICAgICBcCisJCQkgIDogIj1jIiAoX19kMCksICI9RCIgKF9fZDEpCQkJICAgICAgXAorCQkJICA6ICJhIiAoMCksICIwIiAoc2l6ZW9mIChmZF9zZXQpCQkgICAgICBcCisJCQkJCSAgLyBzaXplb2YgKF9fZmRfbWFzaykpLAkgICAgICBcCisJCQkgICAgIjEiICgmX19GRFNfQklUUyAoZmRzcClbMF0pCQkJICAgICAgXAorCQkJICA6ICJtZW1vcnkiKTsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2Vsc2UJLyogISBHTlUgQ0MgKi8KKworLyogV2UgZG9uJ3QgdXNlIGBtZW1zZXQnIGJlY2F1c2UgdGhpcyB3b3VsZCByZXF1aXJlIGEgcHJvdG90eXBlIGFuZAorICAgdGhlIGFycmF5IGlzbid0IHRvbyBiaWcuICAqLworIyBkZWZpbmUgX19GRF9aRVJPKHNldCkgIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICB1bnNpZ25lZCBpbnQgX19pOwkJCQkJCQkgICAgICBcCisgICAgZmRfc2V0ICpfX2FyciA9IChzZXQpOwkJCQkJCSAgICAgIFwKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IHNpemVvZiAoZmRfc2V0KSAvIHNpemVvZiAoX19mZF9tYXNrKTsgKytfX2kpCSAgICAgIFwKKyAgICAgIF9fRkRTX0JJVFMgKF9fYXJyKVtfX2ldID0gMDsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2VuZGlmCS8qIEdOVSBDQyAqLworCisjZGVmaW5lIF9fRkRfU0VUKGQsIHNldCkgXAorICAoKHZvaWQpIChfX0ZEU19CSVRTIChzZXQpW19fRkRfRUxUIChkKV0gfD0gX19GRF9NQVNLIChkKSkpCisjZGVmaW5lIF9fRkRfQ0xSKGQsIHNldCkgXAorICAoKHZvaWQpIChfX0ZEU19CSVRTIChzZXQpW19fRkRfRUxUIChkKV0gJj0gfl9fRkRfTUFTSyAoZCkpKQorI2RlZmluZSBfX0ZEX0lTU0VUKGQsIHNldCkgXAorICAoKF9fRkRTX0JJVFMgKHNldClbX19GRF9FTFQgKGQpXSAmIF9fRkRfTUFTSyAoZCkpICE9IDApCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZWxlY3QyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZWxlY3QyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjZTFiNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NlbGVjdDIuaApAQCAtMCwwICsxLDM1IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHNlbGVjdCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TRUxFQ1RfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zZWxlY3QyLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zZWxlY3QuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogSGVscGVyIGZ1bmN0aW9ucyB0byBpc3N1ZSB3YXJuaW5ncyBhbmQgZXJyb3JzIHdoZW4gbmVlZGVkLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGludCBfX2ZkZWx0X2NoayAodW5zaWduZWQgbG9uZyBpbnQgX19kKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGludCBfX2ZkZWx0X3dhcm4gKHVuc2lnbmVkIGxvbmcgaW50IF9fZCkKKyAgX193YXJuYXR0ciAoImJpdCBvdXRzaWRlIG9mIGZkX3NldCBzZWxlY3RlZCIpOworI3VuZGVmIF9fRkRfRUxUCisjZGVmaW5lCV9fRkRfRUxUKGQpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgIFwKKyAgKHsgdW5zaWduZWQgbG9uZyBpbnQgX19kID0gKGQpOwkJCQkJICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX2QpCQkJCQkgICAgXAorICAgICAgPyAoX19kID49IF9fRkRfU0VUU0laRQkJCQkJCSAgICBcCisJID8gX19mZGVsdF93YXJuIChfX2QpIDogKF9fZCAvIF9fTkZEQklUUykpCQkJICAgIFwKKyAgICAgIDogX19mZGVsdF9jaGsgKF9fZCkpOyB9KQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2VtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODZjMzU3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2VtLmgKQEAgLTAsMCArMSw4NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0VNX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc2VtLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zZW0uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiBGbGFncyBmb3IgYHNlbW9wJy4gICovCisjZGVmaW5lIFNFTV9VTkRPCTB4MTAwMAkJLyogdW5kbyB0aGUgb3BlcmF0aW9uIG9uIGV4aXQgKi8KKworLyogQ29tbWFuZHMgZm9yIGBzZW1jdGwnLiAgKi8KKyNkZWZpbmUgR0VUUElECQkxMQkJLyogZ2V0IHNlbXBpZCAqLworI2RlZmluZSBHRVRWQUwJCTEyCQkvKiBnZXQgc2VtdmFsICovCisjZGVmaW5lIEdFVEFMTAkJMTMJCS8qIGdldCBhbGwgc2VtdmFsJ3MgKi8KKyNkZWZpbmUgR0VUTkNOVAkJMTQJCS8qIGdldCBzZW1uY250ICovCisjZGVmaW5lIEdFVFpDTlQJCTE1CQkvKiBnZXQgc2VtemNudCAqLworI2RlZmluZSBTRVRWQUwJCTE2CQkvKiBzZXQgc2VtdmFsICovCisjZGVmaW5lIFNFVEFMTAkJMTcJCS8qIHNldCBhbGwgc2VtdmFsJ3MgKi8KKworCisvKiBEYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgc2V0IG9mIHNlbWFwaG9yZXMuICAqLworc3RydWN0IHNlbWlkX2RzCit7CisgIHN0cnVjdCBpcGNfcGVybSBzZW1fcGVybTsJCS8qIG9wZXJhdGlvbiBwZXJtaXNzaW9uIHN0cnVjdCAqLworICBfX3RpbWVfdCBzZW1fb3RpbWU7CQkJLyogbGFzdCBzZW1vcCgpIHRpbWUgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQxOworICBfX3RpbWVfdCBzZW1fY3RpbWU7CQkJLyogbGFzdCB0aW1lIGNoYW5nZWQgYnkgc2VtY3RsKCkgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQyOworICB1bnNpZ25lZCBsb25nIGludCBzZW1fbnNlbXM7CQkvKiBudW1iZXIgb2Ygc2VtYXBob3JlcyBpbiBzZXQgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQzOworICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDQ7Cit9OworCisvKiBUaGUgdXNlciBzaG91bGQgZGVmaW5lIGEgdW5pb24gbGlrZSB0aGUgZm9sbG93aW5nIHRvIHVzZSBpdCBmb3IgYXJndW1lbnRzCisgICBmb3IgYHNlbWN0bCcuCisKKyAgIHVuaW9uIHNlbXVuCisgICB7CisgICAgIGludCB2YWw7CQkJCTw9IHZhbHVlIGZvciBTRVRWQUwKKyAgICAgc3RydWN0IHNlbWlkX2RzICpidWY7CQk8PSBidWZmZXIgZm9yIElQQ19TVEFUICYgSVBDX1NFVAorICAgICB1bnNpZ25lZCBzaG9ydCBpbnQgKmFycmF5OwkJPD0gYXJyYXkgZm9yIEdFVEFMTCAmIFNFVEFMTAorICAgICBzdHJ1Y3Qgc2VtaW5mbyAqX19idWY7CQk8PSBidWZmZXIgZm9yIElQQ19JTkZPCisgICB9OworCisgICBQcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUgdXNlZCB0byBkZWZpbmUgdGhpcyB1bmlvbiBidXQgdGhpcyBpcworICAgaW5jb3JyZWN0LiAgT25lIGNhbiB0ZXN0IHRoZSBtYWNybyBfU0VNX1NFTVVOX1VOREVGSU5FRCB0byBzZWUgd2hldGhlcgorICAgb25lIG11c3QgZGVmaW5lIHRoZSB1bmlvbiBvciBub3QuICAqLworI2RlZmluZSBfU0VNX1NFTVVOX1VOREVGSU5FRAkxCisKKyNpZmRlZiBfX1VTRV9NSVNDCisKKy8qIGlwY3MgY3RsIGNtZHMgKi8KKyMgZGVmaW5lIFNFTV9TVEFUIDE4CisjIGRlZmluZSBTRU1fSU5GTyAxOQorCitzdHJ1Y3QgIHNlbWluZm8KK3sKKyAgaW50IHNlbW1hcDsKKyAgaW50IHNlbW1uaTsKKyAgaW50IHNlbW1uczsKKyAgaW50IHNlbW1udTsKKyAgaW50IHNlbW1zbDsKKyAgaW50IHNlbW9wbTsKKyAgaW50IHNlbXVtZTsKKyAgaW50IHNlbXVzejsKKyAgaW50IHNlbXZteDsKKyAgaW50IHNlbWFlbTsKK307CisKKyNlbmRpZiAvKiBfX1VTRV9NSVNDICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZW1hcGhvcmUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NlbWFwaG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NzNiYzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZW1hcGhvcmUuaApAQCAtMCwwICsxLDQxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU0VNQVBIT1JFX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9zZW1hcGhvcmUuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHNlbWFwaG9yZS5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgX19XT1JEU0laRSA9PSA2NAorIyBkZWZpbmUgX19TSVpFT0ZfU0VNX1QJMzIKKyNlbHNlCisjIGRlZmluZSBfX1NJWkVPRl9TRU1fVAkxNgorI2VuZGlmCisKKworLyogVmFsdWUgcmV0dXJuZWQgaWYgYHNlbV9vcGVuJyBmYWlsZWQuICAqLworI2RlZmluZSBTRU1fRkFJTEVEICAgICAgKChzZW1fdCAqKSAwKQorCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfU0VNX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBzZW1fdDsKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NldGptcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliOThiMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NldGptcC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMSwyMDAyLDIwMDMsMjAwNSwyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBEZWZpbmUgdGhlIG1hY2hpbmUtZGVwZW5kZW50IHR5cGUgYGptcF9idWYnLiAgeDg2LTY0IHZlcnNpb24uICAqLworI2lmbmRlZiBfQklUU19TRVRKTVBfSAorI2RlZmluZSBfQklUU19TRVRKTVBfSCAgMQorCisjaWYgIWRlZmluZWQgX1NFVEpNUF9IICYmICFkZWZpbmVkIF9QVEhSRUFEX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc2V0am1wLmg+IGRpcmVjdGx5OyB1c2UgPHNldGptcC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWZuZGVmIF9BU00KKworIyBpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIGxvbmcgaW50IF9fam1wX2J1Zls4XTsKKyMgZWxzZQordHlwZWRlZiBpbnQgX19qbXBfYnVmWzZdOworIyBlbmRpZgorCisjZW5kaWYKKworI2VuZGlmICAvKiBiaXRzL3NldGptcC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZXRqbXAyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZXRqbXAyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2NWQyNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NldGptcDIuaApAQCAtMCwwICsxLDQxIEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHNldGptcCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NFVEpNUF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NldGptcDIuaD4gZGlyZWN0bHk7IHVzZSA8c2V0am1wLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFZhcmlhbnQgb2YgdGhlIGxvbmdqbXAgZnVuY3Rpb25zIHdoaWNoIHBlcmZvcm0gc29tZSBzYW5pdHkgY2hlY2tpbmcuICAqLworI2lmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gdm9pZCBfX1JFRElSRUNUX05USE5MIChsb25nam1wLAorCQkJICAgICAgKHN0cnVjdCBfX2ptcF9idWZfdGFnIF9fZW52WzFdLCBpbnQgX192YWwpLAorCQkJICAgICAgX19sb25nam1wX2NoaykgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworZXh0ZXJuIHZvaWQgX19SRURJUkVDVF9OVEhOTCAoX2xvbmdqbXAsCisJCQkgICAgICAoc3RydWN0IF9fam1wX2J1Zl90YWcgX19lbnZbMV0sIGludCBfX3ZhbCksCisJCQkgICAgICBfX2xvbmdqbXBfY2hrKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CitleHRlcm4gdm9pZCBfX1JFRElSRUNUX05USE5MIChzaWdsb25nam1wLAorCQkJICAgICAgKHN0cnVjdCBfX2ptcF9idWZfdGFnIF9fZW52WzFdLCBpbnQgX192YWwpLAorCQkJICAgICAgX19sb25nam1wX2NoaykgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworI2Vsc2UKK2V4dGVybiB2b2lkIF9fbG9uZ2ptcF9jaGsgKHN0cnVjdCBfX2ptcF9idWZfdGFnIF9fZW52WzFdLCBpbnQgX192YWwpLAorICAgICBfX1RIUk9XTkwgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworIyBkZWZpbmUgbG9uZ2ptcCBfX2xvbmdqbXBfY2hrCisjIGRlZmluZSBfbG9uZ2ptcCBfX2xvbmdqbXBfY2hrCisjIGRlZmluZSBzaWdsb25nam1wIF9fbG9uZ2ptcF9jaGsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2htLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGY1Y2M1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2htLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMjAwMCwgMjAwMiwgMjAwNCwgMjAwOQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TSE1fSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zaG0uaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3NobS5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBQZXJtaXNzaW9uIGZsYWcgZm9yIHNobWdldC4gICovCisjZGVmaW5lIFNITV9SCQkwNDAwCQkvKiBvciBTX0lSVUdPIGZyb20gPGxpbnV4L3N0YXQuaD4gKi8KKyNkZWZpbmUgU0hNX1cJCTAyMDAJCS8qIG9yIFNfSVdVR08gZnJvbSA8bGludXgvc3RhdC5oPiAqLworCisvKiBGbGFncyBmb3IgYHNobWF0Jy4gICovCisjZGVmaW5lIFNITV9SRE9OTFkJMDEwMDAwCQkvKiBhdHRhY2ggcmVhZC1vbmx5IGVsc2UgcmVhZC13cml0ZSAqLworI2RlZmluZSBTSE1fUk5ECQkwMjAwMDAJCS8qIHJvdW5kIGF0dGFjaCBhZGRyZXNzIHRvIFNITUxCQSAqLworI2RlZmluZSBTSE1fUkVNQVAJMDQwMDAwCQkvKiB0YWtlLW92ZXIgcmVnaW9uIG9uIGF0dGFjaCAqLworI2RlZmluZSBTSE1fRVhFQwkwMTAwMDAwCQkvKiBleGVjdXRpb24gYWNjZXNzICovCisKKy8qIENvbW1hbmRzIGZvciBgc2htY3RsJy4gICovCisjZGVmaW5lIFNITV9MT0NLCTExCQkvKiBsb2NrIHNlZ21lbnQgKHJvb3Qgb25seSkgKi8KKyNkZWZpbmUgU0hNX1VOTE9DSwkxMgkJLyogdW5sb2NrIHNlZ21lbnQgKHJvb3Qgb25seSkgKi8KKworX19CRUdJTl9ERUNMUworCisvKiBTZWdtZW50IGxvdyBib3VuZGFyeSBhZGRyZXNzIG11bHRpcGxlLiAgKi8KKyNkZWZpbmUgU0hNTEJBCQkoX19nZXRwYWdlc2l6ZSAoKSkKK2V4dGVybiBpbnQgX19nZXRwYWdlc2l6ZSAodm9pZCkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKworLyogVHlwZSB0byBjb3VudCBudW1iZXIgb2YgYXR0YWNoZXMuICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBzaG1hdHRfdDsKKworLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gICovCitzdHJ1Y3Qgc2htaWRfZHMKKyAgeworICAgIHN0cnVjdCBpcGNfcGVybSBzaG1fcGVybTsJCS8qIG9wZXJhdGlvbiBwZXJtaXNzaW9uIHN0cnVjdCAqLworICAgIHNpemVfdCBzaG1fc2Vnc3o7CQkJLyogc2l6ZSBvZiBzZWdtZW50IGluIGJ5dGVzICovCisgICAgX190aW1lX3Qgc2htX2F0aW1lOwkJCS8qIHRpbWUgb2YgbGFzdCBzaG1hdCgpICovCisjaWYgX19XT1JEU0laRSA9PSAzMgorICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMTsKKyNlbmRpZgorICAgIF9fdGltZV90IHNobV9kdGltZTsJCQkvKiB0aW1lIG9mIGxhc3Qgc2htZHQoKSAqLworI2lmIF9fV09SRFNJWkUgPT0gMzIKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDI7CisjZW5kaWYKKyAgICBfX3RpbWVfdCBzaG1fY3RpbWU7CQkJLyogdGltZSBvZiBsYXN0IGNoYW5nZSBieSBzaG1jdGwoKSAqLworI2lmIF9fV09SRFNJWkUgPT0gMzIKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDM7CisjZW5kaWYKKyAgICBfX3BpZF90IHNobV9jcGlkOwkJCS8qIHBpZCBvZiBjcmVhdG9yICovCisgICAgX19waWRfdCBzaG1fbHBpZDsJCQkvKiBwaWQgb2YgbGFzdCBzaG1vcCAqLworICAgIHNobWF0dF90IHNobV9uYXR0Y2g7CQkvKiBudW1iZXIgb2YgY3VycmVudCBhdHRhY2hlcyAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkNDsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDU7CisgIH07CisKKyNpZmRlZiBfX1VTRV9NSVNDCisKKy8qIGlwY3MgY3RsIGNvbW1hbmRzICovCisjIGRlZmluZSBTSE1fU1RBVCAJMTMKKyMgZGVmaW5lIFNITV9JTkZPIAkxNAorCisvKiBzaG1fbW9kZSB1cHBlciBieXRlIGZsYWdzICovCisjIGRlZmluZSBTSE1fREVTVAkwMTAwMAkvKiBzZWdtZW50IHdpbGwgYmUgZGVzdHJveWVkIG9uIGxhc3QgZGV0YWNoICovCisjIGRlZmluZSBTSE1fTE9DS0VECTAyMDAwICAgLyogc2VnbWVudCB3aWxsIG5vdCBiZSBzd2FwcGVkICovCisjIGRlZmluZSBTSE1fSFVHRVRMQgkwNDAwMAkvKiBzZWdtZW50IGlzIG1hcHBlZCB2aWEgaHVnZXRsYiAqLworIyBkZWZpbmUgU0hNX05PUkVTRVJWRQkwMTAwMDAJLyogZG9uJ3QgY2hlY2sgZm9yIHJlc2VydmF0aW9ucyAqLworCitzdHJ1Y3QJc2htaW5mbworICB7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgc2htbWF4OworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNobW1pbjsKKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1tbmk7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgc2htc2VnOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNobWFsbDsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDE7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQyOworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMzsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDQ7CisgIH07CisKK3N0cnVjdCBzaG1faW5mbworICB7CisgICAgaW50IHVzZWRfaWRzOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNobV90b3Q7CS8qIHRvdGFsIGFsbG9jYXRlZCBzaG0gKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1fcnNzOwkvKiB0b3RhbCByZXNpZGVudCBzaG0gKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1fc3dwOwkvKiB0b3RhbCBzd2FwcGVkIHNobSAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN3YXBfYXR0ZW1wdHM7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3dhcF9zdWNjZXNzZXM7CisgIH07CisKKyNlbmRpZiAvKiBfX1VTRV9NSVNDICovCisKK19fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWdhY3Rpb24uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ2FjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmUwNjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWdhY3Rpb24uaApAQCAtMCwwICsxLDc5IEBACisvKiBUaGUgcHJvcGVyIGRlZmluaXRpb25zIGZvciBMaW51eCdzIHNpZ2FjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5My0xOTk5LCAyMDAwLCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TSUdOQUxfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zaWdhY3Rpb24uaD4gZGlyZWN0bHk7IHVzZSA8c2lnbmFsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBhY3Rpb24gdG8gYmUgdGFrZW4gd2hlbiBhIHNpZ25hbCBhcnJpdmVzLiAgKi8KK3N0cnVjdCBzaWdhY3Rpb24KKyAgeworICAgIC8qIFNpZ25hbCBoYW5kbGVyLiAgKi8KKyNpZmRlZiBfX1VTRV9QT1NJWDE5OTMwOQorICAgIHVuaW9uCisgICAgICB7CisJLyogVXNlZCBpZiBTQV9TSUdJTkZPIGlzIG5vdCBzZXQuICAqLworCV9fc2lnaGFuZGxlcl90IHNhX2hhbmRsZXI7CisJLyogVXNlZCBpZiBTQV9TSUdJTkZPIGlzIHNldC4gICovCisJdm9pZCAoKnNhX3NpZ2FjdGlvbikgKGludCwgc2lnaW5mb190ICosIHZvaWQgKik7CisgICAgICB9CisgICAgX19zaWdhY3Rpb25faGFuZGxlcjsKKyMgZGVmaW5lIHNhX2hhbmRsZXIJX19zaWdhY3Rpb25faGFuZGxlci5zYV9oYW5kbGVyCisjIGRlZmluZSBzYV9zaWdhY3Rpb24JX19zaWdhY3Rpb25faGFuZGxlci5zYV9zaWdhY3Rpb24KKyNlbHNlCisgICAgX19zaWdoYW5kbGVyX3Qgc2FfaGFuZGxlcjsKKyNlbmRpZgorCisgICAgLyogQWRkaXRpb25hbCBzZXQgb2Ygc2lnbmFscyB0byBiZSBibG9ja2VkLiAgKi8KKyAgICBfX3NpZ3NldF90IHNhX21hc2s7CisKKyAgICAvKiBTcGVjaWFsIGZsYWdzLiAgKi8KKyAgICBpbnQgc2FfZmxhZ3M7CisKKyAgICAvKiBSZXN0b3JlIGhhbmRsZXIuICAqLworICAgIHZvaWQgKCpzYV9yZXN0b3JlcikgKHZvaWQpOworICB9OworCisvKiBCaXRzIGluIGBzYV9mbGFncycuICAqLworI2RlZmluZQlTQV9OT0NMRFNUT1AgIDEJCSAvKiBEb24ndCBzZW5kIFNJR0NITEQgd2hlbiBjaGlsZHJlbiBzdG9wLiAgKi8KKyNkZWZpbmUgU0FfTk9DTERXQUlUICAyCQkgLyogRG9uJ3QgY3JlYXRlIHpvbWJpZSBvbiBjaGlsZCBkZWF0aC4gICovCisjZGVmaW5lIFNBX1NJR0lORk8gICAgNAkJIC8qIEludm9rZSBzaWduYWwtY2F0Y2hpbmcgZnVuY3Rpb24gd2l0aAorCQkJCSAgICB0aHJlZSBhcmd1bWVudHMgaW5zdGVhZCBvZiBvbmUuICAqLworI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfTUlTQworIyBkZWZpbmUgU0FfT05TVEFDSyAgIDB4MDgwMDAwMDAgLyogVXNlIHNpZ25hbCBzdGFjayBieSB1c2luZyBgc2FfcmVzdG9yZXInLiAqLworI2VuZGlmCisjaWYgZGVmaW5lZCBfX1VTRV9VTklYOTggfHwgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKyMgZGVmaW5lIFNBX1JFU1RBUlQgICAweDEwMDAwMDAwIC8qIFJlc3RhcnQgc3lzY2FsbCBvbiBzaWduYWwgcmV0dXJuLiAgKi8KKyMgZGVmaW5lIFNBX05PREVGRVIgICAweDQwMDAwMDAwIC8qIERvbid0IGF1dG9tYXRpY2FsbHkgYmxvY2sgdGhlIHNpZ25hbCB3aGVuCisJCQkJICAgIGl0cyBoYW5kbGVyIGlzIGJlaW5nIGV4ZWN1dGVkLiAgKi8KKyMgZGVmaW5lIFNBX1JFU0VUSEFORCAweDgwMDAwMDAwIC8qIFJlc2V0IHRvIFNJR19ERkwgb24gZW50cnkgdG8gaGFuZGxlci4gICovCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBTQV9JTlRFUlJVUFQgMHgyMDAwMDAwMCAvKiBIaXN0b3JpY2FsIG5vLW9wLiAgKi8KKworLyogU29tZSBhbGlhc2VzIGZvciB0aGUgU0FfIGNvbnN0YW50cy4gICovCisjIGRlZmluZSBTQV9OT01BU0sgICAgU0FfTk9ERUZFUgorIyBkZWZpbmUgU0FfT05FU0hPVCAgIFNBX1JFU0VUSEFORAorIyBkZWZpbmUgU0FfU1RBQ0sgICAgIFNBX09OU1RBQ0sKKyNlbmRpZgorCisvKiBWYWx1ZXMgZm9yIHRoZSBIT1cgYXJndW1lbnQgdG8gYHNpZ3Byb2NtYXNrJy4gICovCisjZGVmaW5lCVNJR19CTE9DSyAgICAgMAkJIC8qIEJsb2NrIHNpZ25hbHMuICAqLworI2RlZmluZQlTSUdfVU5CTE9DSyAgIDEJCSAvKiBVbmJsb2NrIHNpZ25hbHMuICAqLworI2RlZmluZQlTSUdfU0VUTUFTSyAgIDIJCSAvKiBTZXQgdGhlIHNldCBvZiBibG9ja2VkIHNpZ25hbHMuICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2lnY29udGV4dC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2lnY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDVmZTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWdjb250ZXh0LmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfQklUU19TSUdDT05URVhUX0gKKyNkZWZpbmUgX0JJVFNfU0lHQ09OVEVYVF9IICAxCisKKyNpZiAhZGVmaW5lZCBfU0lHTkFMX0ggJiYgIWRlZmluZWQgX1NZU19VQ09OVEVYVF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvc2lnY29udGV4dC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c2lnbmFsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKK3N0cnVjdCBfZnByZWcKK3sKKyAgdW5zaWduZWQgc2hvcnQgc2lnbmlmaWNhbmRbNF07CisgIHVuc2lnbmVkIHNob3J0IGV4cG9uZW50OworfTsKKworc3RydWN0IF9mcHhyZWcKK3sKKyAgdW5zaWduZWQgc2hvcnQgc2lnbmlmaWNhbmRbNF07CisgIHVuc2lnbmVkIHNob3J0IGV4cG9uZW50OworICB1bnNpZ25lZCBzaG9ydCBwYWRkaW5nWzNdOworfTsKKworc3RydWN0IF94bW1yZWcKK3sKKyAgX191aW50MzJfdAllbGVtZW50WzRdOworfTsKKworCisKKyNpZiBfX1dPUkRTSVpFID09IDMyCisKK3N0cnVjdCBfZnBzdGF0ZQoreworICAvKiBSZWd1bGFyIEZQVSBlbnZpcm9ubWVudC4gICovCisgIF9fdWludDMyX3QJY3c7CisgIF9fdWludDMyX3QJCXN3OworICBfX3VpbnQzMl90CQl0YWc7CisgIF9fdWludDMyX3QJCWlwb2ZmOworICBfX3VpbnQzMl90CQljc3NlbDsKKyAgX191aW50MzJfdAkJZGF0YW9mZjsKKyAgX191aW50MzJfdAkJZGF0YXNlbDsKKyAgc3RydWN0IF9mcHJlZwlfc3RbOF07CisgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgbWFnaWM7CisKKyAgLyogRlhTUiBGUFUgZW52aXJvbm1lbnQuICAqLworICBfX3VpbnQzMl90CQlfZnhzcl9lbnZbNl07CisgIF9fdWludDMyX3QJCW14Y3NyOworICBfX3VpbnQzMl90CQlyZXNlcnZlZDsKKyAgc3RydWN0IF9mcHhyZWcJX2Z4c3Jfc3RbOF07CisgIHN0cnVjdCBfeG1tcmVnCV94bW1bOF07CisgIF9fdWludDMyX3QJCXBhZGRpbmdbNTZdOworfTsKKworI2lmbmRlZiBzaWdjb250ZXh0X3N0cnVjdAorLyogS2VybmVsIGhlYWRlcnMgYmVmb3JlIDIuMS4xIGRlZmluZSBhIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCwgYnV0CisgICB3ZSBuZWVkIHNpZ2NvbnRleHQuICBTb21lIHBhY2thZ2VzIGhhdmUgY29tZSB0byByZWx5IG9uCisgICBzaWdjb250ZXh0X3N0cnVjdCBiZWluZyBkZWZpbmVkIG9uIDMyLWJpdCB4ODYsIHNvIGRlZmluZSB0aGlzIGZvcgorICAgdGhlaXIgYmVuZWZpdC4gICovCisjIGRlZmluZSBzaWdjb250ZXh0X3N0cnVjdCBzaWdjb250ZXh0CisjZW5kaWYKKworc3RydWN0IHNpZ2NvbnRleHQKK3sKKyAgdW5zaWduZWQgc2hvcnQgZ3MsIF9fZ3NoOworICB1bnNpZ25lZCBzaG9ydCBmcywgX19mc2g7CisgIHVuc2lnbmVkIHNob3J0IGVzLCBfX2VzaDsKKyAgdW5zaWduZWQgc2hvcnQgZHMsIF9fZHNoOworICB1bnNpZ25lZCBsb25nIGVkaTsKKyAgdW5zaWduZWQgbG9uZyBlc2k7CisgIHVuc2lnbmVkIGxvbmcgZWJwOworICB1bnNpZ25lZCBsb25nIGVzcDsKKyAgdW5zaWduZWQgbG9uZyBlYng7CisgIHVuc2lnbmVkIGxvbmcgZWR4OworICB1bnNpZ25lZCBsb25nIGVjeDsKKyAgdW5zaWduZWQgbG9uZyBlYXg7CisgIHVuc2lnbmVkIGxvbmcgdHJhcG5vOworICB1bnNpZ25lZCBsb25nIGVycjsKKyAgdW5zaWduZWQgbG9uZyBlaXA7CisgIHVuc2lnbmVkIHNob3J0IGNzLCBfX2NzaDsKKyAgdW5zaWduZWQgbG9uZyBlZmxhZ3M7CisgIHVuc2lnbmVkIGxvbmcgZXNwX2F0X3NpZ25hbDsKKyAgdW5zaWduZWQgc2hvcnQgc3MsIF9fc3NoOworICBzdHJ1Y3QgX2Zwc3RhdGUgKiBmcHN0YXRlOworICB1bnNpZ25lZCBsb25nIG9sZG1hc2s7CisgIHVuc2lnbmVkIGxvbmcgY3IyOworfTsKKworI2Vsc2UgLyogX19XT1JEU0laRSA9PSA2NCAqLworCitzdHJ1Y3QgX2Zwc3RhdGUKK3sKKyAgLyogRlBVIGVudmlyb25tZW50IG1hdGNoaW5nIHRoZSA2NC1iaXQgRlhTQVZFIGxheW91dC4gICovCisgIF9fdWludDE2X3QJCWN3ZDsKKyAgX191aW50MTZfdAkJc3dkOworICBfX3VpbnQxNl90CQlmdHc7CisgIF9fdWludDE2X3QJCWZvcDsKKyAgX191aW50NjRfdAkJcmlwOworICBfX3VpbnQ2NF90CQlyZHA7CisgIF9fdWludDMyX3QJCW14Y3NyOworICBfX3VpbnQzMl90CQlteGNyX21hc2s7CisgIHN0cnVjdCBfZnB4cmVnCV9zdFs4XTsKKyAgc3RydWN0IF94bW1yZWcJX3htbVsxNl07CisgIF9fdWludDMyX3QJCXBhZGRpbmdbMjRdOworfTsKKworc3RydWN0IHNpZ2NvbnRleHQKK3sKKyAgdW5zaWduZWQgbG9uZyByODsKKyAgdW5zaWduZWQgbG9uZyByOTsKKyAgdW5zaWduZWQgbG9uZyByMTA7CisgIHVuc2lnbmVkIGxvbmcgcjExOworICB1bnNpZ25lZCBsb25nIHIxMjsKKyAgdW5zaWduZWQgbG9uZyByMTM7CisgIHVuc2lnbmVkIGxvbmcgcjE0OworICB1bnNpZ25lZCBsb25nIHIxNTsKKyAgdW5zaWduZWQgbG9uZyByZGk7CisgIHVuc2lnbmVkIGxvbmcgcnNpOworICB1bnNpZ25lZCBsb25nIHJicDsKKyAgdW5zaWduZWQgbG9uZyByYng7CisgIHVuc2lnbmVkIGxvbmcgcmR4OworICB1bnNpZ25lZCBsb25nIHJheDsKKyAgdW5zaWduZWQgbG9uZyByY3g7CisgIHVuc2lnbmVkIGxvbmcgcnNwOworICB1bnNpZ25lZCBsb25nIHJpcDsKKyAgdW5zaWduZWQgbG9uZyBlZmxhZ3M7CisgIHVuc2lnbmVkIHNob3J0IGNzOworICB1bnNpZ25lZCBzaG9ydCBnczsKKyAgdW5zaWduZWQgc2hvcnQgZnM7CisgIHVuc2lnbmVkIHNob3J0IF9fcGFkMDsKKyAgdW5zaWduZWQgbG9uZyBlcnI7CisgIHVuc2lnbmVkIGxvbmcgdHJhcG5vOworICB1bnNpZ25lZCBsb25nIG9sZG1hc2s7CisgIHVuc2lnbmVkIGxvbmcgY3IyOworICBzdHJ1Y3QgX2Zwc3RhdGUgKiBmcHN0YXRlOworICB1bnNpZ25lZCBsb25nIF9fcmVzZXJ2ZWQxIFs4XTsKK307CisKKyNlbmRpZiAvKiBfX1dPUkRTSVpFID09IDY0ICovCisKKyNlbmRpZiAvKiBfQklUU19TSUdDT05URVhUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ2luZm8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2RkNGMyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2lnaW5mby5oCkBAIC0wLDAgKzEsMzEzIEBACisvKiBzaWdpbmZvX3QsIHNpZ2V2ZW50IGFuZCBjb25zdGFudHMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDIsIDIwMDMsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfU0lHTkFMX0ggJiYgIWRlZmluZWQgX19uZWVkX3NpZ2luZm9fdCBcCisgICAgJiYgIWRlZmluZWQgX19uZWVkX3NpZ2V2ZW50X3QKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiAgVXNlIDxzaWduYWwuaD4gaW5zdGVhZCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgKCFkZWZpbmVkIF9faGF2ZV9zaWd2YWxfdCBcCisgICAgICYmIChkZWZpbmVkIF9TSUdOQUxfSCB8fCBkZWZpbmVkIF9fbmVlZF9zaWdpbmZvX3QgXAorCSB8fCBkZWZpbmVkIF9fbmVlZF9zaWdldmVudF90KSkKKyMgZGVmaW5lIF9faGF2ZV9zaWd2YWxfdAkxCisKKy8qIFR5cGUgZm9yIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgc2lnbmFsLiAgKi8KK3R5cGVkZWYgdW5pb24gc2lndmFsCisgIHsKKyAgICBpbnQgc2l2YWxfaW50OworICAgIHZvaWQgKnNpdmFsX3B0cjsKKyAgfSBzaWd2YWxfdDsKKyNlbmRpZgorCisjaWYgKCFkZWZpbmVkIF9faGF2ZV9zaWdpbmZvX3QgXAorICAgICAmJiAoZGVmaW5lZCBfU0lHTkFMX0ggfHwgZGVmaW5lZCBfX25lZWRfc2lnaW5mb190KSkKKyMgZGVmaW5lIF9faGF2ZV9zaWdpbmZvX3QJMQorCisjIGRlZmluZSBfX1NJX01BWF9TSVpFICAgICAxMjgKKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIF9fU0lfUEFEX1NJWkUgICAgICgoX19TSV9NQVhfU0laRSAvIHNpemVvZiAoaW50KSkgLSA0KQorIyBlbHNlCisjICBkZWZpbmUgX19TSV9QQURfU0laRSAgICAgKChfX1NJX01BWF9TSVpFIC8gc2l6ZW9mIChpbnQpKSAtIDMpCisjIGVuZGlmCisKK3R5cGVkZWYgc3RydWN0IHNpZ2luZm8KKyAgeworICAgIGludCBzaV9zaWdubzsJCS8qIFNpZ25hbCBudW1iZXIuICAqLworICAgIGludCBzaV9lcnJubzsJCS8qIElmIG5vbi16ZXJvLCBhbiBlcnJubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgKKwkJCQkgICB0aGlzIHNpZ25hbCwgYXMgZGVmaW5lZCBpbiA8ZXJybm8uaD4uICAqLworICAgIGludCBzaV9jb2RlOwkJLyogU2lnbmFsIGNvZGUuICAqLworCisgICAgdW5pb24KKyAgICAgIHsKKwlpbnQgX3BhZFtfX1NJX1BBRF9TSVpFXTsKKworCSAvKiBraWxsKCkuICAqLworCXN0cnVjdAorCSAgeworCSAgICBfX3BpZF90IHNpX3BpZDsJLyogU2VuZGluZyBwcm9jZXNzIElELiAgKi8KKwkgICAgX191aWRfdCBzaV91aWQ7CS8qIFJlYWwgdXNlciBJRCBvZiBzZW5kaW5nIHByb2Nlc3MuICAqLworCSAgfSBfa2lsbDsKKworCS8qIFBPU0lYLjFiIHRpbWVycy4gICovCisJc3RydWN0CisJICB7CisJICAgIGludCBzaV90aWQ7CQkvKiBUaW1lciBJRC4gICovCisJICAgIGludCBzaV9vdmVycnVuOwkvKiBPdmVycnVuIGNvdW50LiAgKi8KKwkgICAgc2lndmFsX3Qgc2lfc2lndmFsOwkvKiBTaWduYWwgdmFsdWUuICAqLworCSAgfSBfdGltZXI7CisKKwkvKiBQT1NJWC4xYiBzaWduYWxzLiAgKi8KKwlzdHJ1Y3QKKwkgIHsKKwkgICAgX19waWRfdCBzaV9waWQ7CS8qIFNlbmRpbmcgcHJvY2VzcyBJRC4gICovCisJICAgIF9fdWlkX3Qgc2lfdWlkOwkvKiBSZWFsIHVzZXIgSUQgb2Ygc2VuZGluZyBwcm9jZXNzLiAgKi8KKwkgICAgc2lndmFsX3Qgc2lfc2lndmFsOwkvKiBTaWduYWwgdmFsdWUuICAqLworCSAgfSBfcnQ7CisKKwkvKiBTSUdDSExELiAgKi8KKwlzdHJ1Y3QKKwkgIHsKKwkgICAgX19waWRfdCBzaV9waWQ7CS8qIFdoaWNoIGNoaWxkLiAgKi8KKwkgICAgX191aWRfdCBzaV91aWQ7CS8qIFJlYWwgdXNlciBJRCBvZiBzZW5kaW5nIHByb2Nlc3MuICAqLworCSAgICBpbnQgc2lfc3RhdHVzOwkvKiBFeGl0IHZhbHVlIG9yIHNpZ25hbC4gICovCisJICAgIF9fY2xvY2tfdCBzaV91dGltZTsKKwkgICAgX19jbG9ja190IHNpX3N0aW1lOworCSAgfSBfc2lnY2hsZDsKKworCS8qIFNJR0lMTCwgU0lHRlBFLCBTSUdTRUdWLCBTSUdCVVMuICAqLworCXN0cnVjdAorCSAgeworCSAgICB2b2lkICpzaV9hZGRyOwkvKiBGYXVsdGluZyBpbnNuL21lbW9yeSByZWYuICAqLworCSAgfSBfc2lnZmF1bHQ7CisKKwkvKiBTSUdQT0xMLiAgKi8KKwlzdHJ1Y3QKKwkgIHsKKwkgICAgbG9uZyBpbnQgc2lfYmFuZDsJLyogQmFuZCBldmVudCBmb3IgU0lHUE9MTC4gICovCisJICAgIGludCBzaV9mZDsKKwkgIH0gX3NpZ3BvbGw7CisgICAgICB9IF9zaWZpZWxkczsKKyAgfSBzaWdpbmZvX3Q7CisKKworLyogWC9PcGVuIHJlcXVpcmVzIHNvbWUgbW9yZSBmaWVsZHMgd2l0aCBmaXhlZCBuYW1lcy4gICovCisjIGRlZmluZSBzaV9waWQJCV9zaWZpZWxkcy5fa2lsbC5zaV9waWQKKyMgZGVmaW5lIHNpX3VpZAkJX3NpZmllbGRzLl9raWxsLnNpX3VpZAorIyBkZWZpbmUgc2lfdGltZXJpZAlfc2lmaWVsZHMuX3RpbWVyLnNpX3RpZAorIyBkZWZpbmUgc2lfb3ZlcnJ1bglfc2lmaWVsZHMuX3RpbWVyLnNpX292ZXJydW4KKyMgZGVmaW5lIHNpX3N0YXR1cwlfc2lmaWVsZHMuX3NpZ2NobGQuc2lfc3RhdHVzCisjIGRlZmluZSBzaV91dGltZQlfc2lmaWVsZHMuX3NpZ2NobGQuc2lfdXRpbWUKKyMgZGVmaW5lIHNpX3N0aW1lCV9zaWZpZWxkcy5fc2lnY2hsZC5zaV9zdGltZQorIyBkZWZpbmUgc2lfdmFsdWUJX3NpZmllbGRzLl9ydC5zaV9zaWd2YWwKKyMgZGVmaW5lIHNpX2ludAkJX3NpZmllbGRzLl9ydC5zaV9zaWd2YWwuc2l2YWxfaW50CisjIGRlZmluZSBzaV9wdHIJCV9zaWZpZWxkcy5fcnQuc2lfc2lndmFsLnNpdmFsX3B0cgorIyBkZWZpbmUgc2lfYWRkcglfc2lmaWVsZHMuX3NpZ2ZhdWx0LnNpX2FkZHIKKyMgZGVmaW5lIHNpX2JhbmQJX3NpZmllbGRzLl9zaWdwb2xsLnNpX2JhbmQKKyMgZGVmaW5lIHNpX2ZkCQlfc2lmaWVsZHMuX3NpZ3BvbGwuc2lfZmQKKworCisvKiBWYWx1ZXMgZm9yIGBzaV9jb2RlJy4gIFBvc2l0aXZlIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIGtlcm5lbC1nZW5lcmF0ZWQKKyAgIHNpZ25hbHMuICAqLworZW51bQoreworICBTSV9BU1lOQ05MID0gLTYwLAkJLyogU2VudCBieSBhc3luY2ggbmFtZSBsb29rdXAgY29tcGxldGlvbi4gICovCisjIGRlZmluZSBTSV9BU1lOQ05MCVNJX0FTWU5DTkwKKyAgU0lfVEtJTEwgPSAtNiwJCS8qIFNlbnQgYnkgdGtpbGwuICAqLworIyBkZWZpbmUgU0lfVEtJTEwJU0lfVEtJTEwKKyAgU0lfU0lHSU8sCQkJLyogU2VudCBieSBxdWV1ZWQgU0lHSU8uICovCisjIGRlZmluZSBTSV9TSUdJTwlTSV9TSUdJTworICBTSV9BU1lOQ0lPLAkJCS8qIFNlbnQgYnkgQUlPIGNvbXBsZXRpb24uICAqLworIyBkZWZpbmUgU0lfQVNZTkNJTwlTSV9BU1lOQ0lPCisgIFNJX01FU0dRLAkJCS8qIFNlbnQgYnkgcmVhbCB0aW1lIG1lc3Egc3RhdGUgY2hhbmdlLiAgKi8KKyMgZGVmaW5lIFNJX01FU0dRCVNJX01FU0dRCisgIFNJX1RJTUVSLAkJCS8qIFNlbnQgYnkgdGltZXIgZXhwaXJhdGlvbi4gICovCisjIGRlZmluZSBTSV9USU1FUglTSV9USU1FUgorICBTSV9RVUVVRSwJCQkvKiBTZW50IGJ5IHNpZ3F1ZXVlLiAgKi8KKyMgZGVmaW5lIFNJX1FVRVVFCVNJX1FVRVVFCisgIFNJX1VTRVIsCQkJLyogU2VudCBieSBraWxsLCBzaWdzZW5kLiAgKi8KKyMgZGVmaW5lIFNJX1VTRVIJU0lfVVNFUgorICBTSV9LRVJORUwgPSAweDgwCQkvKiBTZW5kIGJ5IGtlcm5lbC4gICovCisjZGVmaW5lIFNJX0tFUk5FTAlTSV9LRVJORUwKK307CisKKworLyogYHNpX2NvZGUnIHZhbHVlcyBmb3IgU0lHSUxMIHNpZ25hbC4gICovCitlbnVtCit7CisgIElMTF9JTExPUEMgPSAxLAkJLyogSWxsZWdhbCBvcGNvZGUuICAqLworIyBkZWZpbmUgSUxMX0lMTE9QQwlJTExfSUxMT1BDCisgIElMTF9JTExPUE4sCQkJLyogSWxsZWdhbCBvcGVyYW5kLiAgKi8KKyMgZGVmaW5lIElMTF9JTExPUE4JSUxMX0lMTE9QTgorICBJTExfSUxMQURSLAkJCS8qIElsbGVnYWwgYWRkcmVzc2luZyBtb2RlLiAgKi8KKyMgZGVmaW5lIElMTF9JTExBRFIJSUxMX0lMTEFEUgorICBJTExfSUxMVFJQLAkJCS8qIElsbGVnYWwgdHJhcC4gKi8KKyMgZGVmaW5lIElMTF9JTExUUlAJSUxMX0lMTFRSUAorICBJTExfUFJWT1BDLAkJCS8qIFByaXZpbGVnZWQgb3Bjb2RlLiAgKi8KKyMgZGVmaW5lIElMTF9QUlZPUEMJSUxMX1BSVk9QQworICBJTExfUFJWUkVHLAkJCS8qIFByaXZpbGVnZWQgcmVnaXN0ZXIuICAqLworIyBkZWZpbmUgSUxMX1BSVlJFRwlJTExfUFJWUkVHCisgIElMTF9DT1BST0MsCQkJLyogQ29wcm9jZXNzb3IgZXJyb3IuICAqLworIyBkZWZpbmUgSUxMX0NPUFJPQwlJTExfQ09QUk9DCisgIElMTF9CQURTVEsJCQkvKiBJbnRlcm5hbCBzdGFjayBlcnJvci4gICovCisjIGRlZmluZSBJTExfQkFEU1RLCUlMTF9CQURTVEsKK307CisKKy8qIGBzaV9jb2RlJyB2YWx1ZXMgZm9yIFNJR0ZQRSBzaWduYWwuICAqLworZW51bQoreworICBGUEVfSU5URElWID0gMSwJCS8qIEludGVnZXIgZGl2aWRlIGJ5IHplcm8uICAqLworIyBkZWZpbmUgRlBFX0lOVERJVglGUEVfSU5URElWCisgIEZQRV9JTlRPVkYsCQkJLyogSW50ZWdlciBvdmVyZmxvdy4gICovCisjIGRlZmluZSBGUEVfSU5UT1ZGCUZQRV9JTlRPVkYKKyAgRlBFX0ZMVERJViwJCQkvKiBGbG9hdGluZyBwb2ludCBkaXZpZGUgYnkgemVyby4gICovCisjIGRlZmluZSBGUEVfRkxURElWCUZQRV9GTFRESVYKKyAgRlBFX0ZMVE9WRiwJCQkvKiBGbG9hdGluZyBwb2ludCBvdmVyZmxvdy4gICovCisjIGRlZmluZSBGUEVfRkxUT1ZGCUZQRV9GTFRPVkYKKyAgRlBFX0ZMVFVORCwJCQkvKiBGbG9hdGluZyBwb2ludCB1bmRlcmZsb3cuICAqLworIyBkZWZpbmUgRlBFX0ZMVFVORAlGUEVfRkxUVU5ECisgIEZQRV9GTFRSRVMsCQkJLyogRmxvYXRpbmcgcG9pbnQgaW5leGFjdCByZXN1bHQuICAqLworIyBkZWZpbmUgRlBFX0ZMVFJFUwlGUEVfRkxUUkVTCisgIEZQRV9GTFRJTlYsCQkJLyogRmxvYXRpbmcgcG9pbnQgaW52YWxpZCBvcGVyYXRpb24uICAqLworIyBkZWZpbmUgRlBFX0ZMVElOVglGUEVfRkxUSU5WCisgIEZQRV9GTFRTVUIJCQkvKiBTdWJzY3JpcHQgb3V0IG9mIHJhbmdlLiAgKi8KKyMgZGVmaW5lIEZQRV9GTFRTVUIJRlBFX0ZMVFNVQgorfTsKKworLyogYHNpX2NvZGUnIHZhbHVlcyBmb3IgU0lHU0VHViBzaWduYWwuICAqLworZW51bQoreworICBTRUdWX01BUEVSUiA9IDEsCQkvKiBBZGRyZXNzIG5vdCBtYXBwZWQgdG8gb2JqZWN0LiAgKi8KKyMgZGVmaW5lIFNFR1ZfTUFQRVJSCVNFR1ZfTUFQRVJSCisgIFNFR1ZfQUNDRVJSCQkJLyogSW52YWxpZCBwZXJtaXNzaW9ucyBmb3IgbWFwcGVkIG9iamVjdC4gICovCisjIGRlZmluZSBTRUdWX0FDQ0VSUglTRUdWX0FDQ0VSUgorfTsKKworLyogYHNpX2NvZGUnIHZhbHVlcyBmb3IgU0lHQlVTIHNpZ25hbC4gICovCitlbnVtCit7CisgIEJVU19BRFJBTE4gPSAxLAkJLyogSW52YWxpZCBhZGRyZXNzIGFsaWdubWVudC4gICovCisjIGRlZmluZSBCVVNfQURSQUxOCUJVU19BRFJBTE4KKyAgQlVTX0FEUkVSUiwJCQkvKiBOb24tZXhpc3RhbnQgcGh5c2ljYWwgYWRkcmVzcy4gICovCisjIGRlZmluZSBCVVNfQURSRVJSCUJVU19BRFJFUlIKKyAgQlVTX09CSkVSUgkJCS8qIE9iamVjdCBzcGVjaWZpYyBoYXJkd2FyZSBlcnJvci4gICovCisjIGRlZmluZSBCVVNfT0JKRVJSCUJVU19PQkpFUlIKK307CisKKy8qIGBzaV9jb2RlJyB2YWx1ZXMgZm9yIFNJR1RSQVAgc2lnbmFsLiAgKi8KK2VudW0KK3sKKyAgVFJBUF9CUktQVCA9IDEsCQkvKiBQcm9jZXNzIGJyZWFrcG9pbnQuICAqLworIyBkZWZpbmUgVFJBUF9CUktQVAlUUkFQX0JSS1BUCisgIFRSQVBfVFJBQ0UJCQkvKiBQcm9jZXNzIHRyYWNlIHRyYXAuICAqLworIyBkZWZpbmUgVFJBUF9UUkFDRQlUUkFQX1RSQUNFCit9OworCisvKiBgc2lfY29kZScgdmFsdWVzIGZvciBTSUdDSExEIHNpZ25hbC4gICovCitlbnVtCit7CisgIENMRF9FWElURUQgPSAxLAkJLyogQ2hpbGQgaGFzIGV4aXRlZC4gICovCisjIGRlZmluZSBDTERfRVhJVEVECUNMRF9FWElURUQKKyAgQ0xEX0tJTExFRCwJCQkvKiBDaGlsZCB3YXMga2lsbGVkLiAgKi8KKyMgZGVmaW5lIENMRF9LSUxMRUQJQ0xEX0tJTExFRAorICBDTERfRFVNUEVELAkJCS8qIENoaWxkIHRlcm1pbmF0ZWQgYWJub3JtYWxseS4gICovCisjIGRlZmluZSBDTERfRFVNUEVECUNMRF9EVU1QRUQKKyAgQ0xEX1RSQVBQRUQsCQkJLyogVHJhY2VkIGNoaWxkIGhhcyB0cmFwcGVkLiAgKi8KKyMgZGVmaW5lIENMRF9UUkFQUEVECUNMRF9UUkFQUEVECisgIENMRF9TVE9QUEVELAkJCS8qIENoaWxkIGhhcyBzdG9wcGVkLiAgKi8KKyMgZGVmaW5lIENMRF9TVE9QUEVECUNMRF9TVE9QUEVECisgIENMRF9DT05USU5VRUQJCQkvKiBTdG9wcGVkIGNoaWxkIGhhcyBjb250aW51ZWQuICAqLworIyBkZWZpbmUgQ0xEX0NPTlRJTlVFRAlDTERfQ09OVElOVUVECit9OworCisvKiBgc2lfY29kZScgdmFsdWVzIGZvciBTSUdQT0xMIHNpZ25hbC4gICovCitlbnVtCit7CisgIFBPTExfSU4gPSAxLAkJCS8qIERhdGEgaW5wdXQgYXZhaWxhYmxlLiAgKi8KKyMgZGVmaW5lIFBPTExfSU4JUE9MTF9JTgorICBQT0xMX09VVCwJCQkvKiBPdXRwdXQgYnVmZmVycyBhdmFpbGFibGUuICAqLworIyBkZWZpbmUgUE9MTF9PVVQJUE9MTF9PVVQKKyAgUE9MTF9NU0csCQkJLyogSW5wdXQgbWVzc2FnZSBhdmFpbGFibGUuICAgKi8KKyMgZGVmaW5lIFBPTExfTVNHCVBPTExfTVNHCisgIFBPTExfRVJSLAkJCS8qIEkvTyBlcnJvci4gICovCisjIGRlZmluZSBQT0xMX0VSUglQT0xMX0VSUgorICBQT0xMX1BSSSwJCQkvKiBIaWdoIHByaW9yaXR5IGlucHV0IGF2YWlsYWJsZS4gICovCisjIGRlZmluZSBQT0xMX1BSSQlQT0xMX1BSSQorICBQT0xMX0hVUAkJCS8qIERldmljZSBkaXNjb25uZWN0ZWQuICAqLworIyBkZWZpbmUgUE9MTF9IVVAJUE9MTF9IVVAKK307CisKKyMgdW5kZWYgX19uZWVkX3NpZ2luZm9fdAorI2VuZGlmCS8qICFoYXZlIHNpZ2luZm9fdCAmJiAoaGF2ZSBfU0lHTkFMX0ggfHwgbmVlZCBzaWdpbmZvX3QpLiAgKi8KKworCisjaWYgKGRlZmluZWQgX1NJR05BTF9IIHx8IGRlZmluZWQgX19uZWVkX3NpZ2V2ZW50X3QpIFwKKyAgICAmJiAhZGVmaW5lZCBfX2hhdmVfc2lnZXZlbnRfdAorIyBkZWZpbmUgX19oYXZlX3NpZ2V2ZW50X3QJMQorCisvKiBTdHJ1Y3R1cmUgdG8gdHJhbnNwb3J0IGFwcGxpY2F0aW9uLWRlZmluZWQgdmFsdWVzIHdpdGggc2lnbmFscy4gICovCisjIGRlZmluZSBfX1NJR0VWX01BWF9TSVpFCTY0CisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBfX1NJR0VWX1BBRF9TSVpFCSgoX19TSUdFVl9NQVhfU0laRSAvIHNpemVvZiAoaW50KSkgLSA0KQorIyBlbHNlCisjICBkZWZpbmUgX19TSUdFVl9QQURfU0laRQkoKF9fU0lHRVZfTUFYX1NJWkUgLyBzaXplb2YgKGludCkpIC0gMykKKyMgZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc2lnZXZlbnQKKyAgeworICAgIHNpZ3ZhbF90IHNpZ2V2X3ZhbHVlOworICAgIGludCBzaWdldl9zaWdubzsKKyAgICBpbnQgc2lnZXZfbm90aWZ5OworCisgICAgdW5pb24KKyAgICAgIHsKKwlpbnQgX3BhZFtfX1NJR0VWX1BBRF9TSVpFXTsKKworCS8qIFdoZW4gU0lHRVZfU0lHTkFMIGFuZCBTSUdFVl9USFJFQURfSUQgc2V0LCBMV1AgSUQgb2YgdGhlCisJICAgdGhyZWFkIHRvIHJlY2VpdmUgdGhlIHNpZ25hbC4gICovCisJX19waWRfdCBfdGlkOworCisJc3RydWN0CisJICB7CisJICAgIHZvaWQgKCpfZnVuY3Rpb24pIChzaWd2YWxfdCk7CS8qIEZ1bmN0aW9uIHRvIHN0YXJ0LiAgKi8KKwkgICAgdm9pZCAqX2F0dHJpYnV0ZTsJCQkvKiBSZWFsbHkgcHRocmVhZF9hdHRyX3QuICAqLworCSAgfSBfc2lnZXZfdGhyZWFkOworICAgICAgfSBfc2lnZXZfdW47CisgIH0gc2lnZXZlbnRfdDsKKworLyogUE9TSVggbmFtZXMgdG8gYWNjZXNzIHNvbWUgb2YgdGhlIG1lbWJlcnMuICAqLworIyBkZWZpbmUgc2lnZXZfbm90aWZ5X2Z1bmN0aW9uICAgX3NpZ2V2X3VuLl9zaWdldl90aHJlYWQuX2Z1bmN0aW9uCisjIGRlZmluZSBzaWdldl9ub3RpZnlfYXR0cmlidXRlcyBfc2lnZXZfdW4uX3NpZ2V2X3RocmVhZC5fYXR0cmlidXRlCisKKy8qIGBzaWdldl9ub3RpZnknIHZhbHVlcy4gICovCitlbnVtCit7CisgIFNJR0VWX1NJR05BTCA9IDAsCQkvKiBOb3RpZnkgdmlhIHNpZ25hbC4gICovCisjIGRlZmluZSBTSUdFVl9TSUdOQUwJU0lHRVZfU0lHTkFMCisgIFNJR0VWX05PTkUsCQkJLyogT3RoZXIgbm90aWZpY2F0aW9uOiBtZWFuaW5nbGVzcy4gICovCisjIGRlZmluZSBTSUdFVl9OT05FCVNJR0VWX05PTkUKKyAgU0lHRVZfVEhSRUFELAkJCS8qIERlbGl2ZXIgdmlhIHRocmVhZCBjcmVhdGlvbi4gICovCisjIGRlZmluZSBTSUdFVl9USFJFQUQJU0lHRVZfVEhSRUFECisKKyAgU0lHRVZfVEhSRUFEX0lEID0gNAkJLyogU2VuZCBzaWduYWwgdG8gc3BlY2lmaWMgdGhyZWFkLiAgKi8KKyNkZWZpbmUgU0lHRVZfVEhSRUFEX0lECVNJR0VWX1RIUkVBRF9JRAorfTsKKworI2VuZGlmCS8qIGhhdmUgX1NJR05BTF9ILiAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ251bS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2lnbnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4YWMxMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ251bS5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIFNpZ25hbCBudW1iZXIgZGVmaW5pdGlvbnMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywxOTk4LDE5OTksMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmZGVmCV9TSUdOQUxfSAorCisvKiBGYWtlIHNpZ25hbCBmdW5jdGlvbnMuICAqLworI2RlZmluZSBTSUdfRVJSCSgoX19zaWdoYW5kbGVyX3QpIC0xKQkJLyogRXJyb3IgcmV0dXJuLiAgKi8KKyNkZWZpbmUgU0lHX0RGTAkoKF9fc2lnaGFuZGxlcl90KSAwKQkJLyogRGVmYXVsdCBhY3Rpb24uICAqLworI2RlZmluZSBTSUdfSUdOCSgoX19zaWdoYW5kbGVyX3QpIDEpCQkvKiBJZ25vcmUgc2lnbmFsLiAgKi8KKworI2lmZGVmIF9fVVNFX1VOSVg5OAorIyBkZWZpbmUgU0lHX0hPTEQJKChfX3NpZ2hhbmRsZXJfdCkgMikJLyogQWRkIHNpZ25hbCB0byBob2xkIG1hc2suICAqLworI2VuZGlmCisKKworLyogU2lnbmFscy4gICovCisjZGVmaW5lCVNJR0hVUAkJMQkvKiBIYW5ndXAgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR0lOVAkJMgkvKiBJbnRlcnJ1cHQgKEFOU0kpLiAgKi8KKyNkZWZpbmUJU0lHUVVJVAkJMwkvKiBRdWl0IChQT1NJWCkuICAqLworI2RlZmluZQlTSUdJTEwJCTQJLyogSWxsZWdhbCBpbnN0cnVjdGlvbiAoQU5TSSkuICAqLworI2RlZmluZQlTSUdUUkFQCQk1CS8qIFRyYWNlIHRyYXAgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR0FCUlQJCTYJLyogQWJvcnQgKEFOU0kpLiAgKi8KKyNkZWZpbmUJU0lHSU9UCQk2CS8qIElPVCB0cmFwICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR0JVUwkJNwkvKiBCVVMgZXJyb3IgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHRlBFCQk4CS8qIEZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiAoQU5TSSkuICAqLworI2RlZmluZQlTSUdLSUxMCQk5CS8qIEtpbGwsIHVuYmxvY2thYmxlIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdVU1IxCQkxMAkvKiBVc2VyLWRlZmluZWQgc2lnbmFsIDEgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1NFR1YJCTExCS8qIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gKEFOU0kpLiAgKi8KKyNkZWZpbmUJU0lHVVNSMgkJMTIJLyogVXNlci1kZWZpbmVkIHNpZ25hbCAyIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdQSVBFCQkxMwkvKiBCcm9rZW4gcGlwZSAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHQUxSTQkJMTQJLyogQWxhcm0gY2xvY2sgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1RFUk0JCTE1CS8qIFRlcm1pbmF0aW9uIChBTlNJKS4gICovCisjZGVmaW5lCVNJR1NUS0ZMVAkxNgkvKiBTdGFjayBmYXVsdC4gICovCisjZGVmaW5lCVNJR0NMRAkJU0lHQ0hMRAkvKiBTYW1lIGFzIFNJR0NITEQgKFN5c3RlbSBWKS4gICovCisjZGVmaW5lCVNJR0NITEQJCTE3CS8qIENoaWxkIHN0YXR1cyBoYXMgY2hhbmdlZCAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHQ09OVAkJMTgJLyogQ29udGludWUgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1NUT1AJCTE5CS8qIFN0b3AsIHVuYmxvY2thYmxlIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdUU1RQCQkyMAkvKiBLZXlib2FyZCBzdG9wIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdUVElOCQkyMQkvKiBCYWNrZ3JvdW5kIHJlYWQgZnJvbSB0dHkgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1RUT1UJCTIyCS8qIEJhY2tncm91bmQgd3JpdGUgdG8gdHR5IChQT1NJWCkuICAqLworI2RlZmluZQlTSUdVUkcJCTIzCS8qIFVyZ2VudCBjb25kaXRpb24gb24gc29ja2V0ICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR1hDUFUJCTI0CS8qIENQVSBsaW1pdCBleGNlZWRlZCAoNC4yIEJTRCkuICAqLworI2RlZmluZQlTSUdYRlNaCQkyNQkvKiBGaWxlIHNpemUgbGltaXQgZXhjZWVkZWQgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHVlRBTFJNCTI2CS8qIFZpcnR1YWwgYWxhcm0gY2xvY2sgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHUFJPRgkJMjcJLyogUHJvZmlsaW5nIGFsYXJtIGNsb2NrICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR1dJTkNICTI4CS8qIFdpbmRvdyBzaXplIGNoYW5nZSAoNC4zIEJTRCwgU3VuKS4gICovCisjZGVmaW5lCVNJR1BPTEwJCVNJR0lPCS8qIFBvbGxhYmxlIGV2ZW50IG9jY3VycmVkIChTeXN0ZW0gVikuICAqLworI2RlZmluZQlTSUdJTwkJMjkJLyogSS9PIG5vdyBwb3NzaWJsZSAoNC4yIEJTRCkuICAqLworI2RlZmluZQlTSUdQV1IJCTMwCS8qIFBvd2VyIGZhaWx1cmUgcmVzdGFydCAoU3lzdGVtIFYpLiAgKi8KKyNkZWZpbmUgU0lHU1lTCQkzMQkvKiBCYWQgc3lzdGVtIGNhbGwuICAqLworI2RlZmluZSBTSUdVTlVTRUQJMzEKKworI2RlZmluZQlfTlNJRwkJNjUJLyogQmlnZ2VzdCBzaWduYWwgbnVtYmVyICsgMQorCQkJCSAgIChpbmNsdWRpbmcgcmVhbC10aW1lIHNpZ25hbHMpLiAgKi8KKworI2RlZmluZSBTSUdSVE1JTiAgICAgICAgKF9fbGliY19jdXJyZW50X3NpZ3J0bWluICgpKQorI2RlZmluZSBTSUdSVE1BWCAgICAgICAgKF9fbGliY19jdXJyZW50X3NpZ3J0bWF4ICgpKQorCisvKiBUaGVzZSBhcmUgdGhlIGhhcmQgbGltaXRzIG9mIHRoZSBrZXJuZWwuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIG5vdCBiZQorICAgdXNlZCBkaXJlY3RseSBhdCB1c2VyIGxldmVsLiAgKi8KKyNkZWZpbmUgX19TSUdSVE1JTgkzMgorI2RlZmluZSBfX1NJR1JUTUFYCShfTlNJRyAtIDEpCisKKyNlbmRpZgkvKiA8c2lnbmFsLmg+IGluY2x1ZGVkLiAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ3NldC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2lnc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlYzhhYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ3NldC5oCkBAIC0wLDAgKzEsMTI2IEBACisvKiBfX3NpZ19hdG9taWNfdCwgX19zaWdzZXRfdCwgYW5kIHJlbGF0ZWQgZGVmaW5pdGlvbnMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk0LCAxOTk2LCAxOTk3LCAyMDA3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU0lHU0VUX0hfdHlwZXMKKyMgZGVmaW5lIF9TSUdTRVRfSF90eXBlcwkxCisKK3R5cGVkZWYgaW50IF9fc2lnX2F0b21pY190OworCisvKiBBIGBzaWdzZXRfdCcgaGFzIGEgYml0IGZvciBlYWNoIHNpZ25hbC4gICovCisKKyMgZGVmaW5lIF9TSUdTRVRfTldPUkRTCSgxMDI0IC8gKDggKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSkpCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX192YWxbX1NJR1NFVF9OV09SRFNdOworICB9IF9fc2lnc2V0X3Q7CisKKyNlbmRpZgorCisKKy8qIFdlIG9ubHkgd2FudCB0byBkZWZpbmUgdGhlc2UgZnVuY3Rpb25zIGlmIDxzaWduYWwuaD4gd2FzIGFjdHVhbGx5CisgICBpbmNsdWRlZDsgb3RoZXJ3aXNlIHdlIHdlcmUgaW5jbHVkZWQganVzdCB0byBkZWZpbmUgdGhlIHR5cGVzLiAgU2luY2Ugd2UKKyAgIGFyZSBuYW1lc3BhY2UtY2xlYW4sIGl0IHdvdWxkbid0IGh1cnQgdG8gZGVmaW5lIGV4dHJhIG1hY3Jvcy4gIEJ1dAorICAgdHJvdWJsZSBjYW4gYmUgY2F1c2VkIGJ5IGZ1bmN0aW9ucyBiZWluZyBkZWZpbmVkIChlLmcuLCBhbnkgZ2xvYmFsCisgICByZWdpc3RlciB2YXJzIGRlY2xhcmVkIGxhdGVyIHdpbGwgY2F1c2UgY29tcGlsYXRpb24gZXJyb3JzKS4gICovCisKKyNpZiAhZGVmaW5lZCBfU0lHU0VUX0hfZm5zICYmIGRlZmluZWQgX1NJR05BTF9ICisjIGRlZmluZSBfU0lHU0VUX0hfZm5zIDEKKworIyBpZm5kZWYgX0VYVEVSTl9JTkxJTkUKKyMgIGRlZmluZSBfRVhURVJOX0lOTElORSBfX2V4dGVybl9pbmxpbmUKKyMgZW5kaWYKKworLyogUmV0dXJuIGEgbWFzayB0aGF0IGluY2x1ZGVzIHRoZSBiaXQgZm9yIFNJRyBvbmx5LiAgKi8KKyMgZGVmaW5lIF9fc2lnbWFzayhzaWcpIFwKKyAgKCgodW5zaWduZWQgbG9uZyBpbnQpIDEpIDw8ICgoKHNpZykgLSAxKSAlICg4ICogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpKSkKKworLyogUmV0dXJuIHRoZSB3b3JkIGluZGV4IGZvciBTSUcuICAqLworIyBkZWZpbmUgX19zaWd3b3JkKHNpZykJKCgoc2lnKSAtIDEpIC8gKDggKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSkpCisKKyMgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisjICBkZWZpbmUgX19zaWdlbXB0eXNldChzZXQpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgaW50IF9fY250ID0gX1NJR1NFVF9OV09SRFM7CQkJCSAgICAgIFwKKwkJICAgIHNpZ3NldF90ICpfX3NldCA9IChzZXQpOwkJCQkgICAgICBcCisJCSAgICB3aGlsZSAoLS1fX2NudCA+PSAwKSBfX3NldC0+X192YWxbX19jbnRdID0gMDsJICAgICAgXAorCQkgICAgMDsgfSkpCisjICBkZWZpbmUgX19zaWdmaWxsc2V0KHNldCkgXAorICAoX19leHRlbnNpb25fXyAoeyBpbnQgX19jbnQgPSBfU0lHU0VUX05XT1JEUzsJCQkJICAgICAgXAorCQkgICAgc2lnc2V0X3QgKl9fc2V0ID0gKHNldCk7CQkJCSAgICAgIFwKKwkJICAgIHdoaWxlICgtLV9fY250ID49IDApIF9fc2V0LT5fX3ZhbFtfX2NudF0gPSB+MFVMOwkgICAgICBcCisJCSAgICAwOyB9KSkKKworIyAgaWZkZWYgX19VU0VfR05VCisvKiBUaGUgUE9TSVggZG9lcyBub3Qgc3BlY2lmeSBmb3IgaGFuZGxpbmcgdGhlIHdob2xlIHNpZ25hbCBzZXQgaW4gb25lCisgICBjb21tYW5kLiAgVGhpcyBpcyBvZnRlbiB3YW50ZWQgYW5kIHNvIHdlIGRlZmluZSB0aHJlZSBtb3JlIGZ1bmN0aW9ucworICAgaGVyZS4gICovCisjICAgZGVmaW5lIF9fc2lnaXNlbXB0eXNldChzZXQpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgaW50IF9fY250ID0gX1NJR1NFVF9OV09SRFM7CQkJCSAgICAgIFwKKwkJICAgIGNvbnN0IHNpZ3NldF90ICpfX3NldCA9IChzZXQpOwkJCSAgICAgIFwKKwkJICAgIGludCBfX3JldCA9IF9fc2V0LT5fX3ZhbFstLV9fY250XTsJCQkgICAgICBcCisJCSAgICB3aGlsZSAoIV9fcmV0ICYmIC0tX19jbnQgPj0gMCkJCQkgICAgICBcCisJCQlfX3JldCA9IF9fc2V0LT5fX3ZhbFtfX2NudF07CQkJICAgICAgXAorCQkgICAgX19yZXQgPT0gMDsgfSkpCisjICAgZGVmaW5lIF9fc2lnYW5kc2V0KGRlc3QsIGxlZnQsIHJpZ2h0KSBcCisgIChfX2V4dGVuc2lvbl9fICh7IGludCBfX2NudCA9IF9TSUdTRVRfTldPUkRTOwkJCQkgICAgICBcCisJCSAgICBzaWdzZXRfdCAqX19kZXN0ID0gKGRlc3QpOwkJCQkgICAgICBcCisJCSAgICBjb25zdCBzaWdzZXRfdCAqX19sZWZ0ID0gKGxlZnQpOwkJCSAgICAgIFwKKwkJICAgIGNvbnN0IHNpZ3NldF90ICpfX3JpZ2h0ID0gKHJpZ2h0KTsJCQkgICAgICBcCisJCSAgICB3aGlsZSAoLS1fX2NudCA+PSAwKQkJCQkgICAgICBcCisJCSAgICAgIF9fZGVzdC0+X192YWxbX19jbnRdID0gKF9fbGVmdC0+X192YWxbX19jbnRdCSAgICAgIFwKKwkJCQkJICAgICAgJiBfX3JpZ2h0LT5fX3ZhbFtfX2NudF0pOwkgICAgICBcCisJCSAgICAwOyB9KSkKKyMgICBkZWZpbmUgX19zaWdvcnNldChkZXN0LCBsZWZ0LCByaWdodCkgXAorICAoX19leHRlbnNpb25fXyAoeyBpbnQgX19jbnQgPSBfU0lHU0VUX05XT1JEUzsJCQkJICAgICAgXAorCQkgICAgc2lnc2V0X3QgKl9fZGVzdCA9IChkZXN0KTsJCQkJICAgICAgXAorCQkgICAgY29uc3Qgc2lnc2V0X3QgKl9fbGVmdCA9IChsZWZ0KTsJCQkgICAgICBcCisJCSAgICBjb25zdCBzaWdzZXRfdCAqX19yaWdodCA9IChyaWdodCk7CQkJICAgICAgXAorCQkgICAgd2hpbGUgKC0tX19jbnQgPj0gMCkJCQkJICAgICAgXAorCQkgICAgICBfX2Rlc3QtPl9fdmFsW19fY250XSA9IChfX2xlZnQtPl9fdmFsW19fY250XQkgICAgICBcCisJCQkJCSAgICAgIHwgX19yaWdodC0+X192YWxbX19jbnRdKTsJICAgICAgXAorCQkgICAgMDsgfSkpCisjICBlbmRpZgorIyBlbmRpZgorCisvKiBUaGVzZSBmdW5jdGlvbnMgbmVlZG4ndCBjaGVjayBmb3IgYSBib2d1cyBzaWduYWwgbnVtYmVyIC0tIGVycm9yCisgICBjaGVja2luZyBpcyBkb25lIGluIHRoZSBub24gX18gdmVyc2lvbnMuICAqLworCitleHRlcm4gaW50IF9fc2lnaXNtZW1iZXIgKF9fY29uc3QgX19zaWdzZXRfdCAqLCBpbnQpOworZXh0ZXJuIGludCBfX3NpZ2FkZHNldCAoX19zaWdzZXRfdCAqLCBpbnQpOworZXh0ZXJuIGludCBfX3NpZ2RlbHNldCAoX19zaWdzZXRfdCAqLCBpbnQpOworCisjIGlmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisjICBkZWZpbmUgX19TSUdTRVRGTihOQU1FLCBCT0RZLCBDT05TVCkJCQkJCSAgICAgIFwKKyAgX0VYVEVSTl9JTkxJTkUgaW50CQkJCQkJCSAgICAgIFwKKyAgTkFNRSAoQ09OU1QgX19zaWdzZXRfdCAqX19zZXQsIGludCBfX3NpZykJCQkJICAgICAgXAorICB7CQkJCQkJCQkJICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbWFzayA9IF9fc2lnbWFzayAoX19zaWcpOwkJCSAgICAgIFwKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3dvcmQgPSBfX3NpZ3dvcmQgKF9fc2lnKTsJCQkgICAgICBcCisgICAgcmV0dXJuIEJPRFk7CQkJCQkJCSAgICAgIFwKKyAgfQorCitfX1NJR1NFVEZOIChfX3NpZ2lzbWVtYmVyLCAoX19zZXQtPl9fdmFsW19fd29yZF0gJiBfX21hc2spID8gMSA6IDAsIF9fY29uc3QpCitfX1NJR1NFVEZOIChfX3NpZ2FkZHNldCwgKChfX3NldC0+X192YWxbX193b3JkXSB8PSBfX21hc2spLCAwKSwgKQorX19TSUdTRVRGTiAoX19zaWdkZWxzZXQsICgoX19zZXQtPl9fdmFsW19fd29yZF0gJj0gfl9fbWFzayksIDApLCApCisKKyMgIHVuZGVmIF9fU0lHU0VURk4KKyMgZW5kaWYKKworCisjZW5kaWYgLyogISBfU0lHU0VUX0hfZm5zLiAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ3N0YWNrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWdzdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMjYwMzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWdzdGFjay5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIHNpZ3N0YWNrLCBzaWdhbHRzdGFjayBkZWZpbml0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU0lHTkFMX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiAgVXNlIDxzaWduYWwuaD4gaW5zdGVhZCIKKyNlbmRpZgorCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGEgc2lnbmFsIHN0YWNrIChvYnNvbGV0ZSkuICAqLworc3RydWN0IHNpZ3N0YWNrCisgIHsKKyAgICB2b2lkICpzc19zcDsJCS8qIFNpZ25hbCBzdGFjayBwb2ludGVyLiAgKi8KKyAgICBpbnQgc3Nfb25zdGFjazsJCS8qIE5vbnplcm8gaWYgZXhlY3V0aW5nIG9uIHRoaXMgc3RhY2suICAqLworICB9OworCisKKy8qIFBvc3NpYmxlIHZhbHVlcyBmb3IgYHNzX2ZsYWdzLicuICAqLworZW51bQoreworICBTU19PTlNUQUNLID0gMSwKKyNkZWZpbmUgU1NfT05TVEFDSwlTU19PTlNUQUNLCisgIFNTX0RJU0FCTEUKKyNkZWZpbmUgU1NfRElTQUJMRQlTU19ESVNBQkxFCit9OworCisvKiBNaW5pbXVtIHN0YWNrIHNpemUgZm9yIGEgc2lnbmFsIGhhbmRsZXIuICAqLworI2RlZmluZSBNSU5TSUdTVEtTWgkyMDQ4CisKKy8qIFN5c3RlbSBkZWZhdWx0IHN0YWNrIHNpemUuICAqLworI2RlZmluZSBTSUdTVEtTWgk4MTkyCisKKworLyogQWx0ZXJuYXRlLCBwcmVmZXJyZWQgaW50ZXJmYWNlLiAgKi8KK3R5cGVkZWYgc3RydWN0IHNpZ2FsdHN0YWNrCisgIHsKKyAgICB2b2lkICpzc19zcDsKKyAgICBpbnQgc3NfZmxhZ3M7CisgICAgc2l6ZV90IHNzX3NpemU7CisgIH0gc3RhY2tfdDsKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ3RocmVhZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2lndGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1MjRlNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ3RocmVhZC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIFNpZ25hbCBoYW5kbGluZyBmdW5jdGlvbiBmb3IgdGhyZWFkZWQgcHJvZ3JhbXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfQklUU19TSUdUSFJFQURfSAorI2RlZmluZSBfQklUU19TSUdUSFJFQURfSAkxCisKKyNpZiAhZGVmaW5lZCBfU0lHTkFMX0ggJiYgIWRlZmluZWQgX1BUSFJFQURfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuICBVc2UgPHB0aHJlYWQuaD4gaW5zdGVhZCIKKyNlbmRpZgorCisvKiBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHNpZ25hbHMuICovCisKKy8qIE1vZGlmeSB0aGUgc2lnbmFsIG1hc2sgZm9yIHRoZSBjYWxsaW5nIHRocmVhZC4gIFRoZSBhcmd1bWVudHMgaGF2ZQorICAgdGhlIHNhbWUgbWVhbmluZyBhcyBmb3Igc2lncHJvY21hc2soMikuICovCitleHRlcm4gaW50IHB0aHJlYWRfc2lnbWFzayAoaW50IF9faG93LAorCQkJICAgIF9fY29uc3QgX19zaWdzZXRfdCAqX19yZXN0cmljdCBfX25ld21hc2ssCisJCQkgICAgX19zaWdzZXRfdCAqX19yZXN0cmljdCBfX29sZG1hc2spX19USFJPVzsKKworLyogU2VuZCBzaWduYWwgU0lHTk8gdG8gdGhlIGdpdmVuIHRocmVhZC4gKi8KK2V4dGVybiBpbnQgcHRocmVhZF9raWxsIChwdGhyZWFkX3QgX190aHJlYWRpZCwgaW50IF9fc2lnbm8pIF9fVEhST1c7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFF1ZXVlIHNpZ25hbCBhbmQgZGF0YSB0byBhIHRocmVhZC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc2lncXVldWUgKHB0aHJlYWRfdCBfX3RocmVhZGlkLCBpbnQgX19zaWdubywKKwkJCSAgICAgY29uc3QgdW5pb24gc2lndmFsIF9fdmFsdWUpIF9fVEhST1c7CisjZW5kaWYKKworI2VuZGlmCS8qIGJpdHMvc2lndGhyZWFkLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NvY2thZGRyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zb2NrYWRkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMWQxMzEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zb2NrYWRkci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIERlZmluaXRpb24gb2YgYHN0cnVjdCBzb2NrYWRkcl8qJyBjb21tb24gbWVtYmVycy4gIEdlbmVyaWMvNC4yIEJTRCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywxOTk4LDIwMDAsMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIE5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5OyB1c2UgPHN5cy9zb2NrZXQuaD4gaW5zdGVhZC4KKyAqLworCisjaWZuZGVmIF9CSVRTX1NPQ0tBRERSX0gKKyNkZWZpbmUgX0JJVFNfU09DS0FERFJfSAkxCisKKworLyogUE9TSVguMWcgc3BlY2lmaWVzIHRoaXMgdHlwZSBuYW1lIGZvciB0aGUgYHNhX2ZhbWlseScgbWVtYmVyLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHNhX2ZhbWlseV90OworCisvKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gZGVjbGFyZSB0aGUgaW5pdGlhbCBjb21tb24gbWVtYmVycworICAgb2YgdGhlIGRhdGEgdHlwZXMgdXNlZCBmb3Igc29ja2V0IGFkZHJlc3NlcywgYHN0cnVjdCBzb2NrYWRkcicsCisgICBgc3RydWN0IHNvY2thZGRyX2luJywgYHN0cnVjdCBzb2NrYWRkcl91bicsIGV0Yy4gICovCisKKyNkZWZpbmUJX19TT0NLQUREUl9DT01NT04oc2FfcHJlZml4KSBcCisgIHNhX2ZhbWlseV90IHNhX3ByZWZpeCMjZmFtaWx5CisKKyNkZWZpbmUgX19TT0NLQUREUl9DT01NT05fU0laRQkoc2l6ZW9mICh1bnNpZ25lZCBzaG9ydCBpbnQpKQorCisjZW5kaWYJLyogYml0cy9zb2NrYWRkci5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zb2NrZXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTA5MGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zb2NrZXQuaApAQCAtMCwwICsxLDQ0NCBAQAorLyogU3lzdGVtLXNwZWNpZmljIHNvY2tldCBjb25zdGFudHMgYW5kIHR5cGVzLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NC0yMDAxLCAyMDA0LCAyMDA2LTIwMTAsIDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9fQklUU19TT0NLRVRfSAorI2RlZmluZSBfX0JJVFNfU09DS0VUX0gKKworI2lmbmRlZiBfU1lTX1NPQ0tFVF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NvY2tldC5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc29ja2V0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNkZWZpbmUJX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIFR5cGUgZm9yIGxlbmd0aCBhcmd1bWVudHMgaW4gc29ja2V0IGNhbGxzLiAgKi8KKyNpZm5kZWYgX19zb2NrbGVuX3RfZGVmaW5lZAordHlwZWRlZiBfX3NvY2tsZW5fdCBzb2NrbGVuX3Q7CisjIGRlZmluZSBfX3NvY2tsZW5fdF9kZWZpbmVkCisjZW5kaWYKKworLyogVHlwZXMgb2Ygc29ja2V0cy4gICovCitlbnVtIF9fc29ja2V0X3R5cGUKK3sKKyAgU09DS19TVFJFQU0gPSAxLAkJLyogU2VxdWVuY2VkLCByZWxpYWJsZSwgY29ubmVjdGlvbi1iYXNlZAorCQkJCSAgIGJ5dGUgc3RyZWFtcy4gICovCisjZGVmaW5lIFNPQ0tfU1RSRUFNIFNPQ0tfU1RSRUFNCisgIFNPQ0tfREdSQU0gPSAyLAkJLyogQ29ubmVjdGlvbmxlc3MsIHVucmVsaWFibGUgZGF0YWdyYW1zCisJCQkJICAgb2YgZml4ZWQgbWF4aW11bSBsZW5ndGguICAqLworI2RlZmluZSBTT0NLX0RHUkFNIFNPQ0tfREdSQU0KKyAgU09DS19SQVcgPSAzLAkJCS8qIFJhdyBwcm90b2NvbCBpbnRlcmZhY2UuICAqLworI2RlZmluZSBTT0NLX1JBVyBTT0NLX1JBVworICBTT0NLX1JETSA9IDQsCQkJLyogUmVsaWFibHktZGVsaXZlcmVkIG1lc3NhZ2VzLiAgKi8KKyNkZWZpbmUgU09DS19SRE0gU09DS19SRE0KKyAgU09DS19TRVFQQUNLRVQgPSA1LAkJLyogU2VxdWVuY2VkLCByZWxpYWJsZSwgY29ubmVjdGlvbi1iYXNlZCwKKwkJCQkgICBkYXRhZ3JhbXMgb2YgZml4ZWQgbWF4aW11bSBsZW5ndGguICAqLworI2RlZmluZSBTT0NLX1NFUVBBQ0tFVCBTT0NLX1NFUVBBQ0tFVAorICBTT0NLX0RDQ1AgPSA2LAkJLyogRGF0YWdyYW0gQ29uZ2VzdGlvbiBDb250cm9sIFByb3RvY29sLiAgKi8KKyNkZWZpbmUgU09DS19EQ0NQIFNPQ0tfRENDUAorICBTT0NLX1BBQ0tFVCA9IDEwLAkJLyogTGludXggc3BlY2lmaWMgd2F5IG9mIGdldHRpbmcgcGFja2V0cworCQkJCSAgIGF0IHRoZSBkZXYgbGV2ZWwuICBGb3Igd3JpdGluZyByYXJwIGFuZAorCQkJCSAgIG90aGVyIHNpbWlsYXIgdGhpbmdzIG9uIHRoZSB1c2VyIGxldmVsLiAqLworI2RlZmluZSBTT0NLX1BBQ0tFVCBTT0NLX1BBQ0tFVAorCisgIC8qIEZsYWdzIHRvIGJlIE9SZWQgaW50byB0aGUgdHlwZSBwYXJhbWV0ZXIgb2Ygc29ja2V0IGFuZCBzb2NrZXRwYWlyIGFuZAorICAgICB1c2VkIGZvciB0aGUgZmxhZ3MgcGFyYW1ldGVyIG9mIHBhY2NlcHQuICAqLworCisgIFNPQ0tfQ0xPRVhFQyA9IDAyMDAwMDAwLAkvKiBBdG9taWNhbGx5IHNldCBjbG9zZS1vbi1leGVjIGZsYWcgZm9yIHRoZQorCQkJCSAgIG5ldyBkZXNjcmlwdG9yKHMpLiAgKi8KKyNkZWZpbmUgU09DS19DTE9FWEVDIFNPQ0tfQ0xPRVhFQworICBTT0NLX05PTkJMT0NLID0gMDQwMDAJCS8qIEF0b21pY2FsbHkgbWFyayBkZXNjcmlwdG9yKHMpIGFzCisJCQkJICAgbm9uLWJsb2NraW5nLiAgKi8KKyNkZWZpbmUgU09DS19OT05CTE9DSyBTT0NLX05PTkJMT0NLCit9OworCisvKiBQcm90b2NvbCBmYW1pbGllcy4gICovCisjZGVmaW5lCVBGX1VOU1BFQwkwCS8qIFVuc3BlY2lmaWVkLiAgKi8KKyNkZWZpbmUJUEZfTE9DQUwJMQkvKiBMb2NhbCB0byBob3N0IChwaXBlcyBhbmQgZmlsZS1kb21haW4pLiAgKi8KKyNkZWZpbmUJUEZfVU5JWAkJUEZfTE9DQUwgLyogUE9TSVggbmFtZSBmb3IgUEZfTE9DQUwuICAqLworI2RlZmluZQlQRl9GSUxFCQlQRl9MT0NBTCAvKiBBbm90aGVyIG5vbi1zdGFuZGFyZCBuYW1lIGZvciBQRl9MT0NBTC4gICovCisjZGVmaW5lCVBGX0lORVQJCTIJLyogSVAgcHJvdG9jb2wgZmFtaWx5LiAgKi8KKyNkZWZpbmUJUEZfQVgyNQkJMwkvKiBBbWF0ZXVyIFJhZGlvIEFYLjI1LiAgKi8KKyNkZWZpbmUJUEZfSVBYCQk0CS8qIE5vdmVsbCBJbnRlcm5ldCBQcm90b2NvbC4gICovCisjZGVmaW5lCVBGX0FQUExFVEFMSwk1CS8qIEFwcGxldGFsayBERFAuICAqLworI2RlZmluZQlQRl9ORVRST00JNgkvKiBBbWF0ZXVyIHJhZGlvIE5ldFJPTS4gICovCisjZGVmaW5lCVBGX0JSSURHRQk3CS8qIE11bHRpcHJvdG9jb2wgYnJpZGdlLiAgKi8KKyNkZWZpbmUJUEZfQVRNUFZDCTgJLyogQVRNIFBWQ3MuICAqLworI2RlZmluZQlQRl9YMjUJCTkJLyogUmVzZXJ2ZWQgZm9yIFguMjUgcHJvamVjdC4gICovCisjZGVmaW5lCVBGX0lORVQ2CTEwCS8qIElQIHZlcnNpb24gNi4gICovCisjZGVmaW5lCVBGX1JPU0UJCTExCS8qIEFtYXRldXIgUmFkaW8gWC4yNSBQTFAuICAqLworI2RlZmluZQlQRl9ERUNuZXQJMTIJLyogUmVzZXJ2ZWQgZm9yIERFQ25ldCBwcm9qZWN0LiAgKi8KKyNkZWZpbmUJUEZfTkVUQkVVSQkxMwkvKiBSZXNlcnZlZCBmb3IgODAyLjJMTEMgcHJvamVjdC4gICovCisjZGVmaW5lCVBGX1NFQ1VSSVRZCTE0CS8qIFNlY3VyaXR5IGNhbGxiYWNrIHBzZXVkbyBBRi4gICovCisjZGVmaW5lCVBGX0tFWQkJMTUJLyogUEZfS0VZIGtleSBtYW5hZ2VtZW50IEFQSS4gICovCisjZGVmaW5lCVBGX05FVExJTksJMTYKKyNkZWZpbmUJUEZfUk9VVEUJUEZfTkVUTElOSyAvKiBBbGlhcyB0byBlbXVsYXRlIDQuNEJTRC4gICovCisjZGVmaW5lCVBGX1BBQ0tFVAkxNwkvKiBQYWNrZXQgZmFtaWx5LiAgKi8KKyNkZWZpbmUJUEZfQVNICQkxOAkvKiBBc2guICAqLworI2RlZmluZQlQRl9FQ09ORVQJMTkJLyogQWNvcm4gRWNvbmV0LiAgKi8KKyNkZWZpbmUJUEZfQVRNU1ZDCTIwCS8qIEFUTSBTVkNzLiAgKi8KKyNkZWZpbmUgUEZfUkRTCQkyMQkvKiBSRFMgc29ja2V0cy4gICovCisjZGVmaW5lCVBGX1NOQQkJMjIJLyogTGludXggU05BIFByb2plY3QgKi8KKyNkZWZpbmUJUEZfSVJEQQkJMjMJLyogSVJEQSBzb2NrZXRzLiAgKi8KKyNkZWZpbmUJUEZfUFBQT1gJMjQJLyogUFBQb1ggc29ja2V0cy4gICovCisjZGVmaW5lCVBGX1dBTlBJUEUJMjUJLyogV2FucGlwZSBBUEkgc29ja2V0cy4gICovCisjZGVmaW5lIFBGX0xMQwkJMjYJLyogTGludXggTExDLiAgKi8KKyNkZWZpbmUgUEZfQ0FOCQkyOQkvKiBDb250cm9sbGVyIEFyZWEgTmV0d29yay4gICovCisjZGVmaW5lIFBGX1RJUEMJCTMwCS8qIFRJUEMgc29ja2V0cy4gICovCisjZGVmaW5lCVBGX0JMVUVUT09USAkzMQkvKiBCbHVldG9vdGggc29ja2V0cy4gICovCisjZGVmaW5lCVBGX0lVQ1YJCTMyCS8qIElVQ1Ygc29ja2V0cy4gICovCisjZGVmaW5lIFBGX1JYUlBDCTMzCS8qIFJ4UlBDIHNvY2tldHMuICAqLworI2RlZmluZSBQRl9JU0ROCQkzNAkvKiBtSVNETiBzb2NrZXRzLiAgKi8KKyNkZWZpbmUgUEZfUEhPTkVUCTM1CS8qIFBob25ldCBzb2NrZXRzLiAgKi8KKyNkZWZpbmUgUEZfSUVFRTgwMjE1NAkzNgkvKiBJRUVFIDgwMi4xNS40IHNvY2tldHMuICAqLworI2RlZmluZSBQRl9DQUlGCQkzNwkvKiBDQUlGIHNvY2tldHMuICAqLworI2RlZmluZSBQRl9BTEcJCTM4CS8qIEFsZ29yaXRobSBzb2NrZXRzLiAgKi8KKyNkZWZpbmUgUEZfTkZDCQkzOQkvKiBORkMgc29ja2V0cy4gICovCisjZGVmaW5lCVBGX01BWAkJNDAJLyogRm9yIG5vdy4uICAqLworCisvKiBBZGRyZXNzIGZhbWlsaWVzLiAgKi8KKyNkZWZpbmUJQUZfVU5TUEVDCVBGX1VOU1BFQworI2RlZmluZQlBRl9MT0NBTAlQRl9MT0NBTAorI2RlZmluZQlBRl9VTklYCQlQRl9VTklYCisjZGVmaW5lCUFGX0ZJTEUJCVBGX0ZJTEUKKyNkZWZpbmUJQUZfSU5FVAkJUEZfSU5FVAorI2RlZmluZQlBRl9BWDI1CQlQRl9BWDI1CisjZGVmaW5lCUFGX0lQWAkJUEZfSVBYCisjZGVmaW5lCUFGX0FQUExFVEFMSwlQRl9BUFBMRVRBTEsKKyNkZWZpbmUJQUZfTkVUUk9NCVBGX05FVFJPTQorI2RlZmluZQlBRl9CUklER0UJUEZfQlJJREdFCisjZGVmaW5lCUFGX0FUTVBWQwlQRl9BVE1QVkMKKyNkZWZpbmUJQUZfWDI1CQlQRl9YMjUKKyNkZWZpbmUJQUZfSU5FVDYJUEZfSU5FVDYKKyNkZWZpbmUJQUZfUk9TRQkJUEZfUk9TRQorI2RlZmluZQlBRl9ERUNuZXQJUEZfREVDbmV0CisjZGVmaW5lCUFGX05FVEJFVUkJUEZfTkVUQkVVSQorI2RlZmluZQlBRl9TRUNVUklUWQlQRl9TRUNVUklUWQorI2RlZmluZQlBRl9LRVkJCVBGX0tFWQorI2RlZmluZQlBRl9ORVRMSU5LCVBGX05FVExJTksKKyNkZWZpbmUJQUZfUk9VVEUJUEZfUk9VVEUKKyNkZWZpbmUJQUZfUEFDS0VUCVBGX1BBQ0tFVAorI2RlZmluZQlBRl9BU0gJCVBGX0FTSAorI2RlZmluZQlBRl9FQ09ORVQJUEZfRUNPTkVUCisjZGVmaW5lCUFGX0FUTVNWQwlQRl9BVE1TVkMKKyNkZWZpbmUgQUZfUkRTCQlQRl9SRFMKKyNkZWZpbmUJQUZfU05BCQlQRl9TTkEKKyNkZWZpbmUJQUZfSVJEQQkJUEZfSVJEQQorI2RlZmluZQlBRl9QUFBPWAlQRl9QUFBPWAorI2RlZmluZQlBRl9XQU5QSVBFCVBGX1dBTlBJUEUKKyNkZWZpbmUgQUZfTExDCQlQRl9MTEMKKyNkZWZpbmUgQUZfQ0FOCQlQRl9DQU4KKyNkZWZpbmUgQUZfVElQQwkJUEZfVElQQworI2RlZmluZQlBRl9CTFVFVE9PVEgJUEZfQkxVRVRPT1RICisjZGVmaW5lCUFGX0lVQ1YJCVBGX0lVQ1YKKyNkZWZpbmUgQUZfUlhSUEMJUEZfUlhSUEMKKyNkZWZpbmUgQUZfSVNETgkJUEZfSVNETgorI2RlZmluZSBBRl9QSE9ORVQJUEZfUEhPTkVUCisjZGVmaW5lIEFGX0lFRUU4MDIxNTQJUEZfSUVFRTgwMjE1NAorI2RlZmluZSBBRl9DQUlGCQlQRl9DQUlGCisjZGVmaW5lIEFGX0FMRwkJUEZfQUxHCisjZGVmaW5lIEFGX05GQwkJUEZfTkZDCisjZGVmaW5lCUFGX01BWAkJUEZfTUFYCisKKy8qIFNvY2tldCBsZXZlbCB2YWx1ZXMuICBPdGhlcnMgYXJlIGRlZmluZWQgaW4gdGhlIGFwcHJvcHJpYXRlIGhlYWRlcnMuCisKKyAgIFhYWCBUaGVzZSBkZWZpbml0aW9ucyBhbHNvIHNob3VsZCBnbyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBoZWFkZXJzIGFzCisgICBmYXIgYXMgdGhleSBhcmUgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgU09MX1JBVwkJMjU1CisjZGVmaW5lIFNPTF9ERUNORVQgICAgICAyNjEKKyNkZWZpbmUgU09MX1gyNSAgICAgICAgIDI2MgorI2RlZmluZSBTT0xfUEFDS0VUCTI2MworI2RlZmluZSBTT0xfQVRNCQkyNjQJLyogQVRNIGxheWVyIChjZWxsIGxldmVsKS4gICovCisjZGVmaW5lIFNPTF9BQUwJCTI2NQkvKiBBVE0gQWRhcHRpb24gTGF5ZXIgKHBhY2tldCBsZXZlbCkuICAqLworI2RlZmluZSBTT0xfSVJEQQkyNjYKKworLyogTWF4aW11bSBxdWV1ZSBsZW5ndGggc3BlY2lmaWFibGUgYnkgbGlzdGVuLiAgKi8KKyNkZWZpbmUgU09NQVhDT05OCTEyOAorCisvKiBHZXQgdGhlIGRlZmluaXRpb24gb2YgdGhlIG1hY3JvIHRvIGRlZmluZSB0aGUgY29tbW9uIHNvY2thZGRyIG1lbWJlcnMuICAqLworI2luY2x1ZGUgPGJpdHMvc29ja2FkZHIuaD4KKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYSBnZW5lcmljIHNvY2tldCBhZGRyZXNzLiAgKi8KK3N0cnVjdCBzb2NrYWRkcgorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHNhXyk7CS8qIENvbW1vbiBkYXRhOiBhZGRyZXNzIGZhbWlseSBhbmQgbGVuZ3RoLiAgKi8KKyAgICBjaGFyIHNhX2RhdGFbMTRdOwkJLyogQWRkcmVzcyBkYXRhLiAgKi8KKyAgfTsKKworCisvKiBTdHJ1Y3R1cmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYW55IHNvY2tldCBhZGRyZXNzICh3aXRoIHRoZSBoaXN0b3JpY2FsCisgICBleGNlcHRpb24gb2YgQUZfVU5JWCkuICBXZSByZXNlcnZlIDEyOCBieXRlcy4gICovCisjZGVmaW5lIF9fc3NfYWxpZ250eXBlCXVuc2lnbmVkIGxvbmcgaW50CisjZGVmaW5lIF9TU19TSVpFCTEyOAorI2RlZmluZSBfU1NfUEFEU0laRQkoX1NTX1NJWkUgLSAoMiAqIHNpemVvZiAoX19zc19hbGlnbnR5cGUpKSkKKworc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UKKyAgeworICAgIF9fU09DS0FERFJfQ09NTU9OIChzc18pOwkvKiBBZGRyZXNzIGZhbWlseSwgZXRjLiAgKi8KKyAgICBfX3NzX2FsaWdudHlwZSBfX3NzX2FsaWduOwkvKiBGb3JjZSBkZXNpcmVkIGFsaWdubWVudC4gICovCisgICAgY2hhciBfX3NzX3BhZGRpbmdbX1NTX1BBRFNJWkVdOworICB9OworCisKKy8qIEJpdHMgaW4gdGhlIEZMQUdTIGFyZ3VtZW50IHRvIGBzZW5kJywgYHJlY3YnLCBldCBhbC4gICovCitlbnVtCisgIHsKKyAgICBNU0dfT09CCQk9IDB4MDEsCS8qIFByb2Nlc3Mgb3V0LW9mLWJhbmQgZGF0YS4gICovCisjZGVmaW5lIE1TR19PT0IJCU1TR19PT0IKKyAgICBNU0dfUEVFSwkJPSAweDAyLAkvKiBQZWVrIGF0IGluY29taW5nIG1lc3NhZ2VzLiAgKi8KKyNkZWZpbmUgTVNHX1BFRUsJTVNHX1BFRUsKKyAgICBNU0dfRE9OVFJPVVRFCT0gMHgwNCwJLyogRG9uJ3QgdXNlIGxvY2FsIHJvdXRpbmcuICAqLworI2RlZmluZSBNU0dfRE9OVFJPVVRFCU1TR19ET05UUk9VVEUKKyNpZmRlZiBfX1VTRV9HTlUKKyAgICAvKiBERUNuZXQgdXNlcyBhIGRpZmZlcmVudCBuYW1lLiAgKi8KKyAgICBNU0dfVFJZSEFSRAkJPSBNU0dfRE9OVFJPVVRFLAorIyBkZWZpbmUgTVNHX1RSWUhBUkQJTVNHX0RPTlRST1VURQorI2VuZGlmCisgICAgTVNHX0NUUlVOQwkJPSAweDA4LAkvKiBDb250cm9sIGRhdGEgbG9zdCBiZWZvcmUgZGVsaXZlcnkuICAqLworI2RlZmluZSBNU0dfQ1RSVU5DCU1TR19DVFJVTkMKKyAgICBNU0dfUFJPWFkJCT0gMHgxMCwJLyogU3VwcGx5IG9yIGFzayBzZWNvbmQgYWRkcmVzcy4gICovCisjZGVmaW5lIE1TR19QUk9YWQlNU0dfUFJPWFkKKyAgICBNU0dfVFJVTkMJCT0gMHgyMCwKKyNkZWZpbmUJTVNHX1RSVU5DCU1TR19UUlVOQworICAgIE1TR19ET05UV0FJVAk9IDB4NDAsIC8qIE5vbmJsb2NraW5nIElPLiAgKi8KKyNkZWZpbmUJTVNHX0RPTlRXQUlUCU1TR19ET05UV0FJVAorICAgIE1TR19FT1IJCT0gMHg4MCwgLyogRW5kIG9mIHJlY29yZC4gICovCisjZGVmaW5lCU1TR19FT1IJCU1TR19FT1IKKyAgICBNU0dfV0FJVEFMTAkJPSAweDEwMCwgLyogV2FpdCBmb3IgYSBmdWxsIHJlcXVlc3QuICAqLworI2RlZmluZQlNU0dfV0FJVEFMTAlNU0dfV0FJVEFMTAorICAgIE1TR19GSU4JCT0gMHgyMDAsCisjZGVmaW5lCU1TR19GSU4JCU1TR19GSU4KKyAgICBNU0dfU1lOCQk9IDB4NDAwLAorI2RlZmluZQlNU0dfU1lOCQlNU0dfU1lOCisgICAgTVNHX0NPTkZJUk0JCT0gMHg4MDAsIC8qIENvbmZpcm0gcGF0aCB2YWxpZGl0eS4gICovCisjZGVmaW5lCU1TR19DT05GSVJNCU1TR19DT05GSVJNCisgICAgTVNHX1JTVAkJPSAweDEwMDAsCisjZGVmaW5lCU1TR19SU1QJCU1TR19SU1QKKyAgICBNU0dfRVJSUVVFVUUJPSAweDIwMDAsIC8qIEZldGNoIG1lc3NhZ2UgZnJvbSBlcnJvciBxdWV1ZS4gICovCisjZGVmaW5lCU1TR19FUlJRVUVVRQlNU0dfRVJSUVVFVUUKKyAgICBNU0dfTk9TSUdOQUwJPSAweDQwMDAsIC8qIERvIG5vdCBnZW5lcmF0ZSBTSUdQSVBFLiAgKi8KKyNkZWZpbmUJTVNHX05PU0lHTkFMCU1TR19OT1NJR05BTAorICAgIE1TR19NT1JFCQk9IDB4ODAwMCwgIC8qIFNlbmRlciB3aWxsIHNlbmQgbW9yZS4gICovCisjZGVmaW5lCU1TR19NT1JFCU1TR19NT1JFCisgICAgTVNHX1dBSVRGT1JPTkUJPSAweDEwMDAwLCAvKiBXYWl0IGZvciBhdCBsZWFzdCBvbmUgcGFja2V0IHRvIHJldHVybi4qLworI2RlZmluZSBNU0dfV0FJVEZPUk9ORQlNU0dfV0FJVEZPUk9ORQorCisgICAgTVNHX0NNU0dfQ0xPRVhFQwk9IDB4NDAwMDAwMDAJLyogU2V0IGNsb3NlX29uX2V4aXQgZm9yIGZpbGUKKwkJCQkJICAgZGVzY3JpcHRvciByZWNlaXZlZCB0aHJvdWdoCisJCQkJCSAgIFNDTV9SSUdIVFMuICAqLworI2RlZmluZSBNU0dfQ01TR19DTE9FWEVDIE1TR19DTVNHX0NMT0VYRUMKKyAgfTsKKworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBtZXNzYWdlcyBzZW50IGJ5CisgICBgc2VuZG1zZycgYW5kIHJlY2VpdmVkIGJ5IGByZWN2bXNnJy4gICovCitzdHJ1Y3QgbXNnaGRyCisgIHsKKyAgICB2b2lkICptc2dfbmFtZTsJCS8qIEFkZHJlc3MgdG8gc2VuZCB0by9yZWNlaXZlIGZyb20uICAqLworICAgIHNvY2tsZW5fdCBtc2dfbmFtZWxlbjsJLyogTGVuZ3RoIG9mIGFkZHJlc3MgZGF0YS4gICovCisKKyAgICBzdHJ1Y3QgaW92ZWMgKm1zZ19pb3Y7CS8qIFZlY3RvciBvZiBkYXRhIHRvIHNlbmQvcmVjZWl2ZSBpbnRvLiAgKi8KKyAgICBzaXplX3QgbXNnX2lvdmxlbjsJCS8qIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLiAgKi8KKworICAgIHZvaWQgKm1zZ19jb250cm9sOwkJLyogQW5jaWxsYXJ5IGRhdGEgKGVnIEJTRCBmaWxlZGVzYyBwYXNzaW5nKS4gKi8KKyAgICBzaXplX3QgbXNnX2NvbnRyb2xsZW47CS8qIEFuY2lsbGFyeSBkYXRhIGJ1ZmZlciBsZW5ndGguCisJCQkJICAgISEgVGhlIHR5cGUgc2hvdWxkIGJlIHNvY2tsZW5fdCBidXQgdGhlCisJCQkJICAgZGVmaW5pdGlvbiBvZiB0aGUga2VybmVsIGlzIGluY29tcGF0aWJsZQorCQkJCSAgIHdpdGggdGhpcy4gICovCisKKyAgICBpbnQgbXNnX2ZsYWdzOwkJLyogRmxhZ3Mgb24gcmVjZWl2ZWQgbWVzc2FnZS4gICovCisgIH07CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEZvciBgcmVjdm1tc2cnLiAgKi8KK3N0cnVjdCBtbXNnaGRyCisgIHsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZ19oZHI7CS8qIEFjdHVhbCBtZXNzYWdlIGhlYWRlci4gICovCisgICAgdW5zaWduZWQgaW50IG1zZ19sZW47CS8qIE51bWJlciBvZiByZWNlaXZlZCBieXRlcyBmb3IgdGhlIGVudHJ5LiAgKi8KKyAgfTsKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgdXNlZCBmb3Igc3RvcmFnZSBvZiBhbmNpbGxhcnkgZGF0YSBvYmplY3QgaW5mb3JtYXRpb24uICAqLworc3RydWN0IGNtc2doZHIKKyAgeworICAgIHNpemVfdCBjbXNnX2xlbjsJCS8qIExlbmd0aCBvZiBkYXRhIGluIGNtc2dfZGF0YSBwbHVzIGxlbmd0aAorCQkJCSAgIG9mIGNtc2doZHIgc3RydWN0dXJlLgorCQkJCSAgICEhIFRoZSB0eXBlIHNob3VsZCBiZSBzb2NrbGVuX3QgYnV0IHRoZQorCQkJCSAgIGRlZmluaXRpb24gb2YgdGhlIGtlcm5lbCBpcyBpbmNvbXBhdGlibGUKKwkJCQkgICB3aXRoIHRoaXMuICAqLworICAgIGludCBjbXNnX2xldmVsOwkJLyogT3JpZ2luYXRpbmcgcHJvdG9jb2wuICAqLworICAgIGludCBjbXNnX3R5cGU7CQkvKiBQcm90b2NvbCBzcGVjaWZpYyB0eXBlLiAgKi8KKyNpZiAoIWRlZmluZWQgX19TVFJJQ1RfQU5TSV9fICYmIF9fR05VQ19fID49IDIpIHx8IF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorICAgIF9fZXh0ZW5zaW9uX18gdW5zaWduZWQgY2hhciBfX2Ntc2dfZGF0YSBfX2ZsZXhhcnI7IC8qIEFuY2lsbGFyeSBkYXRhLiAgKi8KKyNlbmRpZgorICB9OworCisvKiBBbmNpbGxhcnkgZGF0YSBvYmplY3QgbWFuaXB1bGF0aW9uIG1hY3Jvcy4gICovCisjaWYgKCFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXyAmJiBfX0dOVUNfXyA+PSAyKSB8fCBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgZGVmaW5lIENNU0dfREFUQShjbXNnKSAoKGNtc2cpLT5fX2Ntc2dfZGF0YSkKKyNlbHNlCisjIGRlZmluZSBDTVNHX0RBVEEoY21zZykgKCh1bnNpZ25lZCBjaGFyICopICgoc3RydWN0IGNtc2doZHIgKikgKGNtc2cpICsgMSkpCisjZW5kaWYKKyNkZWZpbmUgQ01TR19OWFRIRFIobWhkciwgY21zZykgX19jbXNnX254dGhkciAobWhkciwgY21zZykKKyNkZWZpbmUgQ01TR19GSVJTVEhEUihtaGRyKSBcCisgICgoc2l6ZV90KSAobWhkciktPm1zZ19jb250cm9sbGVuID49IHNpemVvZiAoc3RydWN0IGNtc2doZHIpCQkgICAgICBcCisgICA/IChzdHJ1Y3QgY21zZ2hkciAqKSAobWhkciktPm1zZ19jb250cm9sIDogKHN0cnVjdCBjbXNnaGRyICopIDApCisjZGVmaW5lIENNU0dfQUxJR04obGVuKSAoKChsZW4pICsgc2l6ZW9mIChzaXplX3QpIC0gMSkgXAorCQkJICYgKHNpemVfdCkgfihzaXplb2YgKHNpemVfdCkgLSAxKSkKKyNkZWZpbmUgQ01TR19TUEFDRShsZW4pIChDTVNHX0FMSUdOIChsZW4pIFwKKwkJCSArIENNU0dfQUxJR04gKHNpemVvZiAoc3RydWN0IGNtc2doZHIpKSkKKyNkZWZpbmUgQ01TR19MRU4obGVuKSAgIChDTVNHX0FMSUdOIChzaXplb2YgKHN0cnVjdCBjbXNnaGRyKSkgKyAobGVuKSkKKworZXh0ZXJuIHN0cnVjdCBjbXNnaGRyICpfX2Ntc2dfbnh0aGRyIChzdHJ1Y3QgbXNnaGRyICpfX21oZHIsCisJCQkJICAgICAgc3RydWN0IGNtc2doZHIgKl9fY21zZykgX19USFJPVzsKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworIyBpZm5kZWYgX0VYVEVSTl9JTkxJTkUKKyMgIGRlZmluZSBfRVhURVJOX0lOTElORSBfX2V4dGVybl9pbmxpbmUKKyMgZW5kaWYKK19FWFRFUk5fSU5MSU5FIHN0cnVjdCBjbXNnaGRyICoKK19fTlRIIChfX2Ntc2dfbnh0aGRyIChzdHJ1Y3QgbXNnaGRyICpfX21oZHIsIHN0cnVjdCBjbXNnaGRyICpfX2Ntc2cpKQoreworICBpZiAoKHNpemVfdCkgX19jbXNnLT5jbXNnX2xlbiA8IHNpemVvZiAoc3RydWN0IGNtc2doZHIpKQorICAgIC8qIFRoZSBrZXJuZWwgaGVhZGVyIGRvZXMgdGhpcyBzbyB0aGVyZSBtYXkgYmUgYSByZWFzb24uICAqLworICAgIHJldHVybiAoc3RydWN0IGNtc2doZHIgKikgMDsKKworICBfX2Ntc2cgPSAoc3RydWN0IGNtc2doZHIgKikgKCh1bnNpZ25lZCBjaGFyICopIF9fY21zZworCQkJICAgICAgICsgQ01TR19BTElHTiAoX19jbXNnLT5jbXNnX2xlbikpOworICBpZiAoKHVuc2lnbmVkIGNoYXIgKikgKF9fY21zZyArIDEpID4gKCh1bnNpZ25lZCBjaGFyICopIF9fbWhkci0+bXNnX2NvbnRyb2wKKwkJCQkJKyBfX21oZHItPm1zZ19jb250cm9sbGVuKQorICAgICAgfHwgKCh1bnNpZ25lZCBjaGFyICopIF9fY21zZyArIENNU0dfQUxJR04gKF9fY21zZy0+Y21zZ19sZW4pCisJICA+ICgodW5zaWduZWQgY2hhciAqKSBfX21oZHItPm1zZ19jb250cm9sICsgX19taGRyLT5tc2dfY29udHJvbGxlbikpKQorICAgIC8qIE5vIG1vcmUgZW50cmllcy4gICovCisgICAgcmV0dXJuIChzdHJ1Y3QgY21zZ2hkciAqKSAwOworICByZXR1cm4gX19jbXNnOworfQorI2VuZGlmCS8qIFVzZSBgZXh0ZXJuIGlubGluZScuICAqLworCisvKiBTb2NrZXQgbGV2ZWwgbWVzc2FnZSB0eXBlcy4gIFRoaXMgbXVzdCBtYXRjaCB0aGUgZGVmaW5pdGlvbnMgaW4KKyAgIDxsaW51eC9zb2NrZXQuaD4uICAqLworZW51bQorICB7CisgICAgU0NNX1JJR0hUUyA9IDB4MDEJCS8qIFRyYW5zZmVyIGZpbGUgZGVzY3JpcHRvcnMuICAqLworI2RlZmluZSBTQ01fUklHSFRTIFNDTV9SSUdIVFMKKyNpZmRlZiBfX1VTRV9HTlUKKyAgICAsIFNDTV9DUkVERU5USUFMUyA9IDB4MDIJLyogQ3JlZGVudGlhbHMgcGFzc2luZy4gICovCisjIGRlZmluZSBTQ01fQ1JFREVOVElBTFMgU0NNX0NSRURFTlRJQUxTCisjZW5kaWYKKyAgfTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVXNlciB2aXNpYmxlIHN0cnVjdHVyZSBmb3IgU0NNX0NSRURFTlRJQUxTIG1lc3NhZ2UgKi8KK3N0cnVjdCB1Y3JlZAoreworICBwaWRfdCBwaWQ7CQkJLyogUElEIG9mIHNlbmRpbmcgcHJvY2Vzcy4gICovCisgIHVpZF90IHVpZDsJCQkvKiBVSUQgb2Ygc2VuZGluZyBwcm9jZXNzLiAgKi8KKyAgZ2lkX3QgZ2lkOwkJCS8qIEdJRCBvZiBzZW5kaW5nIHByb2Nlc3MuICAqLworfTsKKyNlbmRpZgorCisvKiBVZ2x5IHdvcmthcm91bmQgZm9yIHVuY2xlYW4ga2VybmVsIGhlYWRlcnMuICAqLworI2lmICFkZWZpbmVkIF9fVVNFX01JU0MgJiYgIWRlZmluZWQgX19VU0VfR05VCisjIGlmbmRlZiBGSU9HRVRPV04KKyMgIGRlZmluZSBfX1NZU19TT0NLRVRfSF91bmRlZl9GSU9HRVRPV04KKyMgZW5kaWYKKyMgaWZuZGVmIEZJT1NFVE9XTgorIyAgZGVmaW5lIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX0ZJT1NFVE9XTgorIyBlbmRpZgorIyBpZm5kZWYgU0lPQ0FUTUFSSworIyAgZGVmaW5lIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NBVE1BUksKKyMgZW5kaWYKKyMgaWZuZGVmIFNJT0NHUEdSUAorIyAgZGVmaW5lIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NHUEdSUAorIyBlbmRpZgorIyBpZm5kZWYgU0lPQ0dTVEFNUAorIyAgZGVmaW5lIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NHU1RBTVAKKyMgZW5kaWYKKyMgaWZuZGVmIFNJT0NHU1RBTVBOUworIyAgZGVmaW5lIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NHU1RBTVBOUworIyBlbmRpZgorIyBpZm5kZWYgU0lPQ1NQR1JQCisjICBkZWZpbmUgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ1NQR1JQCisjIGVuZGlmCisjZW5kaWYKKworLyogR2V0IHNvY2tldCBtYW5pcHVsYXRpb24gcmVsYXRlZCBpbmZvcm1hdGlvbnMgZnJvbSBrZXJuZWwgaGVhZGVycy4gICovCisjaW5jbHVkZSA8YXNtL3NvY2tldC5oPgorCisjaWYgIWRlZmluZWQgX19VU0VfTUlTQyAmJiAhZGVmaW5lZCBfX1VTRV9HTlUKKyMgaWZkZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfRklPR0VUT1dOCisjICB1bmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9GSU9HRVRPV04KKyMgIHVuZGVmIEZJT0dFVE9XTgorIyBlbmRpZgorIyBpZmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9GSU9TRVRPV04KKyMgIHVuZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX0ZJT1NFVE9XTgorIyAgdW5kZWYgRklPU0VUT1dOCisjIGVuZGlmCisjIGlmZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NBVE1BUksKKyMgIHVuZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NBVE1BUksKKyMgIHVuZGVmIFNJT0NBVE1BUksKKyMgZW5kaWYKKyMgaWZkZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0dQR1JQCisjICB1bmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DR1BHUlAKKyMgIHVuZGVmIFNJT0NHUEdSUAorIyBlbmRpZgorIyBpZmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DR1NUQU1QCisjICB1bmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DR1NUQU1QCisjICB1bmRlZiBTSU9DR1NUQU1QCisjIGVuZGlmCisjIGlmZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NHU1RBTVBOUworIyAgdW5kZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0dTVEFNUE5TCisjICB1bmRlZiBTSU9DR1NUQU1QTlMKKyMgZW5kaWYKKyMgaWZkZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ1NQR1JQCisjICB1bmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DU1BHUlAKKyMgIHVuZGVmIFNJT0NTUEdSUAorIyBlbmRpZgorI2VuZGlmCisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIFNPX0xJTkdFUiBvcHRpb24uICAqLworc3RydWN0IGxpbmdlcgorICB7CisgICAgaW50IGxfb25vZmY7CQkvKiBOb256ZXJvIHRvIGxpbmdlciBvbiBjbG9zZS4gICovCisgICAgaW50IGxfbGluZ2VyOwkJLyogVGltZSB0byBsaW5nZXIuICAqLworICB9OworCisKK19fQkVHSU5fREVDTFMKKworLyogUmVjZWl2ZSB1cCB0byBWTEVOIG1lc3NhZ2VzIGFzIGRlc2NyaWJlZCBieSBWTUVTU0FHRVMgZnJvbSBzb2NrZXQgRkQuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcmVjdm1tc2cgKGludCBfX2ZkLCBzdHJ1Y3QgbW1zZ2hkciAqX192bWVzc2FnZXMsCisJCSAgICAgdW5zaWduZWQgaW50IF9fdmxlbiwgaW50IF9fZmxhZ3MsCisJCSAgICAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fdG1vKTsKKworLyogU2VuZCBhIFZMRU4gbWVzc2FnZXMgYXMgZGVzY3JpYmVkIGJ5IFZNRVNTQUdFUyB0byBzb2NrZXQgRkQuCisgICBSZXR1cm4gdGhlIG51bWJlciBvZiBkYXRhZ3JhbXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gb3IgLTEgZm9yIGVycm9ycy4KK1RoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzZW5kbW1zZyAoaW50IF9fZmQsIHN0cnVjdCBtbXNnaGRyICpfX3ZtZXNzYWdlcywKKwkJICAgICB1bnNpZ25lZCBpbnQgX192bGVuLCBpbnQgX19mbGFncyk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBiaXRzL3NvY2tldC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zb2NrZXQyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zb2NrZXQyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0Y2I0NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NvY2tldDIuaApAQCAtMCwwICsxLDc4IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHNvY2tldCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TT0NLRVRfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zb2NrZXQyLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zb2NrZXQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworZXh0ZXJuIHNzaXplX3QgX19yZWN2X2NoayAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uLCBzaXplX3QgX19idWZsZW4sCisJCQkgICBpbnQgX19mbGFncyk7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlY3ZfYWxpYXMsIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX24sCisJCQkJCSAgaW50IF9fZmxhZ3MpLCByZWN2KTsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcmVjdl9jaGtfd2FybiwKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX24sIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBpbnQgX19mbGFncyksIF9fcmVjdl9jaGspCisgICAgIF9fd2FybmF0dHIgKCJyZWN2IGNhbGxlZCB3aXRoIGJpZ2dlciBsZW5ndGggdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzc2l6ZV90CityZWN2IChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX24sIGludCBfX2ZsYWdzKQoreworICBpZiAoX19ib3MwIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX19yZWN2X2NoayAoX19mZCwgX19idWYsIF9fbiwgX19ib3MwIChfX2J1ZiksIF9fZmxhZ3MpOworCisgICAgICBpZiAoX19uID4gX19ib3MwIChfX2J1ZikpCisJcmV0dXJuIF9fcmVjdl9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fbiwgX19ib3MwIChfX2J1ZiksIF9fZmxhZ3MpOworICAgIH0KKyAgcmV0dXJuIF9fcmVjdl9hbGlhcyAoX19mZCwgX19idWYsIF9fbiwgX19mbGFncyk7Cit9CisKK2V4dGVybiBzc2l6ZV90IF9fcmVjdmZyb21fY2hrIChpbnQgX19mZCwgdm9pZCAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbiwKKwkJCSAgICAgICBzaXplX3QgX19idWZsZW4sIGludCBfX2ZsYWdzLAorCQkJICAgICAgIF9fU09DS0FERFJfQVJHIF9fYWRkciwKKwkJCSAgICAgICBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19hZGRyX2xlbik7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlY3Zmcm9tX2FsaWFzLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19uLAorCQkJICAgIGludCBfX2ZsYWdzLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCQkgICAgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fYWRkcl9sZW4pLCByZWN2ZnJvbSk7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlY3Zmcm9tX2Noa193YXJuLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19uLAorCQkJICAgIHNpemVfdCBfX2J1ZmxlbiwgaW50IF9fZmxhZ3MsCisJCQkgICAgX19TT0NLQUREUl9BUkcgX19hZGRyLAorCQkJICAgIHNvY2tsZW5fdCAqX19yZXN0cmljdCBfX2FkZHJfbGVuKSwgX19yZWN2ZnJvbV9jaGspCisgICAgIF9fd2FybmF0dHIgKCJyZWN2ZnJvbSBjYWxsZWQgd2l0aCBiaWdnZXIgbGVuZ3RoIHRoYW4gc2l6ZSBvZiAiCisJCSAiZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc3NpemVfdAorcmVjdmZyb20gKGludCBfX2ZkLCB2b2lkICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19uLCBpbnQgX19mbGFncywKKwkgIF9fU09DS0FERFJfQVJHIF9fYWRkciwgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fYWRkcl9sZW4pCit7CisgIGlmIChfX2JvczAgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pKQorCXJldHVybiBfX3JlY3Zmcm9tX2NoayAoX19mZCwgX19idWYsIF9fbiwgX19ib3MwIChfX2J1ZiksIF9fZmxhZ3MsCisJCQkgICAgICAgX19hZGRyLCBfX2FkZHJfbGVuKTsKKyAgICAgIGlmIChfX24gPiBfX2JvczAgKF9fYnVmKSkKKwlyZXR1cm4gX19yZWN2ZnJvbV9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fbiwgX19ib3MwIChfX2J1ZiksIF9fZmxhZ3MsCisJCQkJICAgIF9fYWRkciwgX19hZGRyX2xlbik7CisgICAgfQorICByZXR1cm4gX19yZWN2ZnJvbV9hbGlhcyAoX19mZCwgX19idWYsIF9fbiwgX19mbGFncywgX19hZGRyLCBfX2FkZHJfbGVuKTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0YWIuZGVmIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RhYi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1NDc3NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0YWIuZGVmCkBAIC0wLDAgKzEsMjM0IEBACisvKiBUYWJsZSBvZiBEQlggc3ltYm9sIGNvZGVzIGZvciB0aGUgR05VIHN5c3RlbS4KKyAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogVGhpcyBjb250YWlucyBjb250cmlidXRpb24gZnJvbSBDeWdudXMgU3VwcG9ydC4gICovCisMCisvKiBHbG9iYWwgdmFyaWFibGUuICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgorICAgVG8gZmluZCB0aGUgYWRkcmVzcywgbG9vayBpbiB0aGUgY29ycmVzcG9uZGluZyBleHRlcm5hbCBzeW1ib2wuICAqLworX19kZWZpbmVfc3RhYiAoTl9HU1lNLCAweDIwLCAiR1NZTSIpCisKKy8qIEZ1bmN0aW9uIG5hbWUgZm9yIEJTRCBGb3J0cmFuLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KKyAgIFRvIGZpbmQgdGhlIGFkZHJlc3MsIGxvb2sgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgc3ltYm9sLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRk5BTUUsIDB4MjIsICJGTkFNRSIpCisKKy8qIEZ1bmN0aW9uIG5hbWUgb3IgdGV4dC1zZWdtZW50IHZhcmlhYmxlIGZvciBDLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuCisgICBEZXNjIGlzIHN1cHBvc2VkbHkgc3RhcnRpbmcgbGluZSBudW1iZXIsIGJ1dCBHQ0MgZG9lc24ndCBzZXQgaXQKKyAgIGFuZCBEQlggc2VlbXMgbm90IHRvIG1pc3MgaXQuICAqLworX19kZWZpbmVfc3RhYiAoTl9GVU4sIDB4MjQsICJGVU4iKQorCisvKiBEYXRhLXNlZ21lbnQgdmFyaWFibGUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuCisgICAiU3RhdGljIFN5bSIuICAqLworX19kZWZpbmVfc3RhYiAoTl9TVFNZTSwgMHgyNiwgIlNUU1lNIikKKworLyogQlNTLXNlZ21lbnQgdmFyaWFibGUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICAqLworX19kZWZpbmVfc3RhYiAoTl9MQ1NZTSwgMHgyOCwgIkxDU1lNIikKKworLyogTmFtZSBvZiBtYWluIHJvdXRpbmUuICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgorICAgVGhpcyBpcyBub3QgdXNlZCBpbiBDLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTUFJTiwgMHgyYSwgIk1BSU4iKQorCisvKiBHbG9iYWwgc3ltYm9sIGluIFBhc2NhbC4KKyAgIFN1cHBvc2VkbHkgdGhlIHZhbHVlIGlzIGl0cyBsaW5lIG51bWJlcjsgSSdtIHNrZXB0aWNhbC4gICovCitfX2RlZmluZV9zdGFiIChOX1BDLCAweDMwLCAiUEMiKQorCisvKiBOdW1iZXIgb2Ygc3ltYm9sczogIDAsIGZpbGVzLCxmdW5jcyxsaW5lcyBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICovCitfX2RlZmluZV9zdGFiIChOX05TWU1TLCAweDMyLCAiTlNZTVMiKQorCisvKiAiTm8gRFNUIG1hcCBmb3Igc3ltOiBuYW1lLCAsMCx0eXBlLGlnbm9yZWQiICBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICovCitfX2RlZmluZV9zdGFiIChOX05PTUFQLCAweDM0LCAiTk9NQVAiKQorCisvKiBOZXcgc3RhYiBmcm9tIFNvbGFyaXMuICBJIGRvbid0IGtub3cgd2hhdCBpdCBtZWFucywgYnV0IGl0CisgICBkb24ndCBzZWVtIHRvIGNvbnRhaW4gdXNlZnVsIGluZm9ybWF0aW9uLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fT0JKLCAweDM4LCAiT0JKIikKKworLyogTmV3IHN0YWIgZnJvbSBTb2xhcmlzLiAgSSBkb24ndCBrbm93IHdoYXQgaXQgbWVhbnMsIGJ1dCBpdAorICAgZG9uJ3Qgc2VlbSB0byBjb250YWluIHVzZWZ1bCBpbmZvcm1hdGlvbi4gIFBvc3NpYmx5IHJlbGF0ZWQgdG8gdGhlCisgICBvcHRpbWl6YXRpb24gZmxhZ3MgdXNlZCBpbiB0aGlzIG1vZHVsZS4gICovCitfX2RlZmluZV9zdGFiIChOX09QVCwgMHgzYywgIk9QVCIpCisKKy8qIFJlZ2lzdGVyIHZhcmlhYmxlLiAgVmFsdWUgaXMgbnVtYmVyIG9mIHJlZ2lzdGVyLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fUlNZTSwgMHg0MCwgIlJTWU0iKQorCisvKiBNb2R1bGEtMiBjb21waWxhdGlvbiB1bml0LiAgQ2FuIHNvbWVvbmUgc2F5IHdoYXQgaW5mbyBpdCBjb250YWlucz8gICovCitfX2RlZmluZV9zdGFiIChOX00yQywgMHg0MiwgIk0yQyIpCisKKy8qIExpbmUgbnVtYmVyIGluIHRleHQgc2VnbWVudC4gIERlc2MgaXMgdGhlIGxpbmUgbnVtYmVyOworICAgdmFsdWUgaXMgY29ycmVzcG9uZGluZyBhZGRyZXNzLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fU0xJTkUsIDB4NDQsICJTTElORSIpCisKKy8qIFNpbWlsYXIsIGZvciBkYXRhIHNlZ21lbnQuICAqLworX19kZWZpbmVfc3RhYiAoTl9EU0xJTkUsIDB4NDYsICJEU0xJTkUiKQorCisvKiBTaW1pbGFyLCBmb3IgYnNzIHNlZ21lbnQuICAqLworX19kZWZpbmVfc3RhYiAoTl9CU0xJTkUsIDB4NDgsICJCU0xJTkUiKQorCisvKiBTdW4ncyBzb3VyY2UtY29kZSBicm93c2VyIHN0YWJzLiAgPz8gRG9uJ3Qga25vdyB3aGF0IHRoZSBmaWVsZHMgYXJlLgorICAgU3VwcG9zZWRseSB0aGUgZmllbGQgaXMgInBhdGggdG8gYXNzb2NpYXRlZCAuY2IgZmlsZSIuICBUSElTIFZBTFVFCisgICBPVkVSTEFQUyBXSVRIIE5fQlNMSU5FISAgKi8KK19fZGVmaW5lX3N0YWIgKE5fQlJPV1MsIDB4NDgsICJCUk9XUyIpCisKKy8qIEdOVSBNb2R1bGEtMiBkZWZpbml0aW9uIG1vZHVsZSBkZXBlbmRlbmN5LiAgVmFsdWUgaXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lCisgICBvZiB0aGUgZGVmaW5pdGlvbiBmaWxlLiAgT3RoZXIgaXMgbm9uLXplcm8gaWYgaXQgaXMgaW1wb3J0ZWQgd2l0aCB0aGUKKyAgIEdOVSBNMiBrZXl3b3JkICVJTklUSUFMSVpFLiAgUGVyaGFwcyBOX00yQyBjYW4gYmUgdXNlZCBpZiB0aGVyZQorICAgYXJlIGVub3VnaCBlbXB0eSBmaWVsZHM/ICovCitfX2RlZmluZV9zdGFiKE5fREVGRCwgMHg0YSwgIkRFRkQiKQorCisvKiBUSEUgRk9MTE9XSU5HIFRXTyBTVEFCIFZBTFVFUyBDT05GTElDVC4gIEhhcHBpbHksIG9uZSBpcyBmb3IgTW9kdWxhLTIKKyAgIGFuZCBvbmUgaXMgZm9yIEMrKy4gICBTdGlsbCwuLi4gKi8KKy8qIEdOVSBDKysgZXhjZXB0aW9uIHZhcmlhYmxlLiAgTmFtZSBpcyB2YXJpYWJsZSBuYW1lLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRUhERUNMLCAweDUwLCAiRUhERUNMIikKKy8qIE1vZHVsYTIgaW5mbyAiZm9yIGltYyI6ICBuYW1lLCwwLDAsMCAgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTU9EMiwgMHg1MCwgIk1PRDIiKQorCisvKiBHTlUgQysrIGBjYXRjaCcgY2xhdXNlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICBEZXNjIGlzIG5vbnplcm8gaWYKKyAgIHRoaXMgZW50cnkgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBDQVVHSFQgc3RhYiBzYXlpbmcgd2hhdCBleGNlcHRpb24KKyAgIHdhcyBjYXVnaHQuICBNdWx0aXBsZSBDQVVHSFQgc3RhYnMgbWVhbnMgdGhhdCBtdWx0aXBsZSBleGNlcHRpb25zCisgICBjYW4gYmUgY2F1Z2h0IGhlcmUuICBJZiBEZXNjIGlzIDAsIGl0IG1lYW5zIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQKKyAgIGhlcmUuICAqLworX19kZWZpbmVfc3RhYiAoTl9DQVRDSCwgMHg1NCwgIkNBVENIIikKKworLyogU3RydWN0dXJlIG9yIHVuaW9uIGVsZW1lbnQuICBWYWx1ZSBpcyBvZmZzZXQgaW4gdGhlIHN0cnVjdHVyZS4gICovCitfX2RlZmluZV9zdGFiIChOX1NTWU0sIDB4NjAsICJTU1lNIikKKworLyogTmFtZSBvZiBtYWluIHNvdXJjZSBmaWxlLgorICAgVmFsdWUgaXMgc3RhcnRpbmcgdGV4dCBhZGRyZXNzIG9mIHRoZSBjb21waWxhdGlvbi4gICovCitfX2RlZmluZV9zdGFiIChOX1NPLCAweDY0LCAiU08iKQorCisvKiBBdXRvbWF0aWMgdmFyaWFibGUgaW4gdGhlIHN0YWNrLiAgVmFsdWUgaXMgb2Zmc2V0IGZyb20gZnJhbWUgcG9pbnRlci4KKyAgIEFsc28gdXNlZCBmb3IgdHlwZSBkZXNjcmlwdGlvbnMuICAqLworX19kZWZpbmVfc3RhYiAoTl9MU1lNLCAweDgwLCAiTFNZTSIpCisKKy8qIEJlZ2lubmluZyBvZiBhbiBpbmNsdWRlIGZpbGUuICBPbmx5IFN1biB1c2VzIHRoaXMuCisgICBJbiBhbiBvYmplY3QgZmlsZSwgb25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KKyAgIFRoZSBTdW4gbGlua2VyIHB1dHMgZGF0YSBpbnRvIHNvbWUgb2YgdGhlIG90aGVyIGZpZWxkcy4gICovCitfX2RlZmluZV9zdGFiIChOX0JJTkNMLCAweDgyLCAiQklOQ0wiKQorCisvKiBOYW1lIG9mIHN1Yi1zb3VyY2UgZmlsZSAoI2luY2x1ZGUgZmlsZSkuCisgICBWYWx1ZSBpcyBzdGFydGluZyB0ZXh0IGFkZHJlc3Mgb2YgdGhlIGNvbXBpbGF0aW9uLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fU09MLCAweDg0LCAiU09MIikKKworLyogUGFyYW1ldGVyIHZhcmlhYmxlLiAgVmFsdWUgaXMgb2Zmc2V0IGZyb20gYXJndW1lbnQgcG9pbnRlci4KKyAgIChPbiBtb3N0IG1hY2hpbmVzIHRoZSBhcmd1bWVudCBwb2ludGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmcmFtZSBwb2ludGVyLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fUFNZTSwgMHhhMCwgIlBTWU0iKQorCisvKiBFbmQgb2YgYW4gaW5jbHVkZSBmaWxlLiAgTm8gbmFtZS4KKyAgIFRoaXMgYW5kIE5fQklOQ0wgYWN0IGFzIGJyYWNrZXRzIGFyb3VuZCB0aGUgZmlsZSdzIG91dHB1dC4KKyAgIEluIGFuIG9iamVjdCBmaWxlLCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkYXRhIGluIHRoaXMgZW50cnkuCisgICBUaGUgU3VuIGxpbmtlciBwdXRzIGRhdGEgaW50byBzb21lIG9mIHRoZSBmaWVsZHMuICAqLworX19kZWZpbmVfc3RhYiAoTl9FSU5DTCwgMHhhMiwgIkVJTkNMIikKKworLyogQWx0ZXJuYXRlIGVudHJ5IHBvaW50LiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICAqLworX19kZWZpbmVfc3RhYiAoTl9FTlRSWSwgMHhhNCwgIkVOVFJZIikKKworLyogQmVnaW5uaW5nIG9mIGxleGljYWwgYmxvY2suCisgICBUaGUgZGVzYyBpcyB0aGUgbmVzdGluZyBsZXZlbCBpbiBsZXhpY2FsIGJsb2Nrcy4KKyAgIFRoZSB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgZm9yIHRoZSBibG9jay4KKyAgIFRoZSB2YXJpYWJsZXMgZGVjbGFyZWQgaW5zaWRlIHRoZSBibG9jayAqcHJlY2VkZSogdGhlIE5fTEJSQUMgc3ltYm9sLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTEJSQUMsIDB4YzAsICJMQlJBQyIpCisKKy8qIFBsYWNlIGhvbGRlciBmb3IgZGVsZXRlZCBpbmNsdWRlIGZpbGUuICBSZXBsYWNlcyBhIE5fQklOQ0wgYW5kIGV2ZXJ5dGhpbmcKKyAgIHVwIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5fRUlOQ0wuICBUaGUgU3VuIGxpbmtlciBnZW5lcmF0ZXMgdGhlc2Ugd2hlbgorICAgaXQgZmluZHMgbXVsdGlwbGUgaWRlbnRpY2FsIGNvcGllcyBvZiB0aGUgc3ltYm9scyBmcm9tIGFuIGluY2x1ZGUgZmlsZS4KKyAgIFRoaXMgYXBwZWFycyBvbmx5IGluIG91dHB1dCBmcm9tIHRoZSBTdW4gbGlua2VyLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRVhDTCwgMHhjMiwgIkVYQ0wiKQorCisvKiBNb2R1bGEtMiBzY29wZSBpbmZvcm1hdGlvbi4gIENhbiBzb21lb25lIHNheSB3aGF0IGluZm8gaXQgY29udGFpbnM/ICAqLworX19kZWZpbmVfc3RhYiAoTl9TQ09QRSwgMHhjNCwgIlNDT1BFIikKKworLyogRW5kIG9mIGEgbGV4aWNhbCBibG9jay4gIERlc2MgbWF0Y2hlcyB0aGUgTl9MQlJBQydzIGRlc2MuCisgICBUaGUgdmFsdWUgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgdGV4dCBmb3IgdGhlIGJsb2NrLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fUkJSQUMsIDB4ZTAsICJSQlJBQyIpCisKKy8qIEJlZ2luIG5hbWVkIGNvbW1vbiBibG9jay4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuICAqLworX19kZWZpbmVfc3RhYiAoTl9CQ09NTSwgMHhlMiwgIkJDT01NIikKKworLyogRW5kIG5hbWVkIGNvbW1vbiBibG9jay4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQKKyAgIChhbmQgaXQgc2hvdWxkIG1hdGNoIHRoZSBOX0JDT01NKS4gICovCitfX2RlZmluZV9zdGFiIChOX0VDT01NLCAweGU0LCAiRUNPTU0iKQorCisvKiBFbmQgY29tbW9uIChsb2NhbCBuYW1lKTogdmFsdWUgaXMgYWRkcmVzcy4KKyAgIEknbSBub3Qgc3VyZSBob3cgdGhpcyBpcyB1c2VkLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRUNPTUwsIDB4ZTgsICJFQ09NTCIpCisKKy8qIFRoZXNlIFNUQUIncyBhcmUgdXNlZCBvbiBHb3VsZCBzeXN0ZW1zIGZvciBOb24tQmFzZSByZWdpc3RlciBzeW1ib2xzCisgICBvciBzb21ldGhpbmcgbGlrZSB0aGF0LiAgRklYTUUuICBJIGhhdmUgYXNzaWduZWQgdGhlIHZhbHVlcyBhdCByYW5kb20KKyAgIHNpbmNlIEkgZG9uJ3QgaGF2ZSBhIEdvdWxkIGhlcmUuICBGaXh1cHMgZnJvbSBHb3VsZCBmb2xrIHdlbGNvbWUuLi4gKi8KK19fZGVmaW5lX3N0YWIgKE5fTkJURVhULCAweEYwLCAiTkJURVhUIikKK19fZGVmaW5lX3N0YWIgKE5fTkJEQVRBLCAweEYyLCAiTkJEQVRBIikKK19fZGVmaW5lX3N0YWIgKE5fTkJCU1MsICAweEY0LCAiTkJCU1MiKQorX19kZWZpbmVfc3RhYiAoTl9OQlNUUywgIDB4RjYsICJOQlNUUyIpCitfX2RlZmluZV9zdGFiIChOX05CTENTLCAgMHhGOCwgIk5CTENTIikKKworLyogU2Vjb25kIHN5bWJvbCBlbnRyeSBjb250YWluaW5nIGEgbGVuZ3RoLXZhbHVlIGZvciB0aGUgcHJlY2VkaW5nIGVudHJ5LgorICAgVGhlIHZhbHVlIGlzIHRoZSBsZW5ndGguICAqLworX19kZWZpbmVfc3RhYiAoTl9MRU5HLCAweGZlLCAiTEVORyIpCisMCisvKiBUaGUgYWJvdmUgaW5mb3JtYXRpb24sIGluIG1hdHJpeCBmb3JtYXQuCisKKwkJCVNUQUIgTUFUUklYCisJX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCXwgMDAgLSAxRiBhcmUgbm90IGRieCBzdGFiIHN5bWJvbHMJCXwKKwl8IEluIG1vc3QgY2FzZXMsIHRoZSBsb3cgYml0IGlzIHRoZSBFWFRlcm5hbCBiaXR8CisKKwl8IDAwIFVOREVGICB8IDAyIEFCUwl8IDA0IFRFWFQgICB8IDA2IERBVEEJfAorCXwgMDEgIHxFWFQgIHwgMDMgIHxFWFQJfCAwNSAgfEVYVCAgfCAwNyAgfEVYVAl8CisKKwl8IDA4IEJTUyAgICB8IDBBIElORFIJfCAwQyBGTl9TRVEgfCAwRSAgIAl8CisJfCAwOSAgfEVYVCAgfCAwQiAJfCAwRAkgICAgfCAwRgl8CisKKwl8IDEwIAkgICAgfCAxMiBDT01NCXwgMTQgU0VUQSAgIHwgMTYgU0VUVAl8CisJfCAxMQkgICAgfCAxMwl8IDE1IAkgICAgfCAxNwl8CisKKwl8IDE4IFNFVEQgICB8IDFBIFNFVEIJfCAxQyBTRVRWICAgfCAxRSBXQVJOSU5HfAorCXwgMTkJICAgIHwgMUIJfCAxRCAJICAgIHwgMUYgRk4JfAorCisJfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorCXwgRGVidWcgZW50cmllcyB3aXRoIGJpdCAwMSBzZXQgYXJlIHVudXNlZC4JfAorCXwgMjAgR1NZTSAgIHwgMjIgRk5BTUUJfCAyNCBGVU4gICAgfCAyNiBTVFNZTQl8CisJfCAyOCBMQ1NZTSAgfCAyQSBNQUlOCXwgMkMJICAgIHwgMkUJfAorCXwgMzAgUEMJICAgIHwgMzIgTlNZTVMJfCAzNCBOT01BUCAgfCAzNgl8CisJfCAzOCBPQkogICAgfCAzQQl8IDNDIE9QVCAgICB8IDNFCXwKKwl8IDQwIFJTWU0gICB8IDQyIE0yQwl8IDQ0IFNMSU5FICB8IDQ2IERTTElORSB8CisJfCA0OCBCU0xJTkUqfCA0QSBERUZECXwgNEMgICAgICAgIHwgNEUJfAorCXwgNTAgRUhERUNMKnwgNTIJfCA1NCBDQVRDSCAgfCA1NiAgICAgICAgfAorCXwgNTggICAgICAgIHwgNUEgICAgICAgIHwgNUMgICAgICAgIHwgNUUJfAorCXwgNjAgU1NZTSAgIHwgNjIJfCA2NCBTTwkgICAgfCA2NiAJfAorCXwgNjggCSAgICB8IDZBCXwgNkMJICAgIHwgNkUJfAorCXwgNzAJICAgIHwgNzIJfCA3NAkgICAgfCA3Ngl8CisJfCA3OAkgICAgfCA3QQl8IDdDCSAgICB8IDdFCXwKKwl8IDgwIExTWU0gICB8IDgyIEJJTkNMCXwgODQgU09MICAgIHwgODYJfAorCXwgODgJICAgIHwgOEEJfCA4QwkgICAgfCA4RQl8CisJfCA5MAkgICAgfCA5Mgl8IDk0CSAgICB8IDk2CXwKKwl8IDk4CSAgICB8IDlBCXwgOUMJICAgIHwgOUUJfAorCXwgQTAgUFNZTSAgIHwgQTIgRUlOQ0wJfCBBNCBFTlRSWSAgfCBBNgl8CisJfCBBOAkgICAgfCBBQQl8IEFDCSAgICB8IEFFCXwKKwl8IEIwCSAgICB8IEIyCXwgQjQJICAgIHwgQjYJfAorCXwgQjgJICAgIHwgQkEJfCBCQwkgICAgfCBCRQl8CisJfCBDMCBMQlJBQyAgfCBDMiBFWENMCXwgQzQgU0NPUEUgIHwgQzYJfAorCXwgQzgJICAgIHwgQ0EJfCBDQwkgICAgfCBDRQl8CisJfCBEMAkgICAgfCBEMgl8IEQ0CSAgICB8IEQ2CXwKKwl8IEQ4CSAgICB8IERBCXwgREMJICAgIHwgREUJfAorCXwgRTAgUkJSQUMgIHwgRTIgQkNPTU0JfCBFNCBFQ09NTSAgfCBFNgl8CisJfCBFOCBFQ09NTCAgfCBFQQl8IEVDCSAgICB8IEVFCXwKKwl8IEYwCSAgICB8IEYyCXwgRjQJICAgIHwgRjYJfAorCXwgRjgJICAgIHwgRkEJfCBGQwkgICAgfCBGRSBMRU5HCXwKKwkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiA1MCBFSERFQ0wgaXMgYWxzbyBNT0QyLgorICogNDggQlNMSU5FIGlzIGFsc28gQlJPV1MuCisgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0YXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2U0ZTFmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RhdC5oCkBAIC0wLDAgKzEsMjEzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMywyMDA5LDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfU1lTX1NUQVRfSCAmJiAhZGVmaW5lZCBfRkNOVExfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGF0Lmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zdGF0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX0JJVFNfU1RBVF9ICisjZGVmaW5lIF9CSVRTX1NUQVRfSAkxCisKKy8qIFZlcnNpb25zIG9mIHRoZSBgc3RydWN0IHN0YXQnIGRhdGEgc3RydWN0dXJlLiAgKi8KKyNkZWZpbmUgX1NUQVRfVkVSX0tFUk5FTAkwCisKKyNpZiBfX1dPUkRTSVpFID09IDMyCisjIGRlZmluZSBfU1RBVF9WRVJfU1ZSNAkJMgorIyBkZWZpbmUgX1NUQVRfVkVSX0xJTlVYCTMKKworLyogaTM4NiB2ZXJzaW9ucyBvZiB0aGUgYHhta25vZCcgaW50ZXJmYWNlLiAgKi8KKyMgZGVmaW5lIF9NS05PRF9WRVJfTElOVVgJMQorIyBkZWZpbmUgX01LTk9EX1ZFUl9TVlI0CTIKKyMgZGVmaW5lIF9NS05PRF9WRVIJCV9NS05PRF9WRVJfTElOVVggLyogVGhlIGJpdHMgZGVmaW5lZCBiZWxvdy4gICovCisjZWxzZQorIyBkZWZpbmUgX1NUQVRfVkVSX0xJTlVYCTEKKworLyogeDg2LTY0IHZlcnNpb25zIG9mIHRoZSBgeG1rbm9kJyBpbnRlcmZhY2UuICAqLworIyBkZWZpbmUgX01LTk9EX1ZFUl9MSU5VWAkwCisjZW5kaWYKKworI2RlZmluZSBfU1RBVF9WRVIJCV9TVEFUX1ZFUl9MSU5VWAorCitzdHJ1Y3Qgc3RhdAorICB7CisgICAgX19kZXZfdCBzdF9kZXY7CQkvKiBEZXZpY2UuICAqLworI2lmIF9fV09SRFNJWkUgPT0gMzIKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19wYWQxOworI2VuZGlmCisjaWYgX19XT1JEU0laRSA9PSA2NCB8fCAhZGVmaW5lZCBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19pbm9fdCBzdF9pbm87CQkvKiBGaWxlIHNlcmlhbCBudW1iZXIuCSovCisjZWxzZQorICAgIF9faW5vX3QgX19zdF9pbm87CQkJLyogMzJiaXQgZmlsZSBzZXJpYWwgbnVtYmVyLgkqLworI2VuZGlmCisjaWYgX19XT1JEU0laRSA9PSAzMgorICAgIF9fbW9kZV90IHN0X21vZGU7CQkJLyogRmlsZSBtb2RlLiAgKi8KKyAgICBfX25saW5rX3Qgc3Rfbmxpbms7CQkJLyogTGluayBjb3VudC4gICovCisjZWxzZQorICAgIF9fbmxpbmtfdCBzdF9ubGluazsJCS8qIExpbmsgY291bnQuICAqLworICAgIF9fbW9kZV90IHN0X21vZGU7CQkvKiBGaWxlIG1vZGUuICAqLworI2VuZGlmCisgICAgX191aWRfdCBzdF91aWQ7CQkvKiBVc2VyIElEIG9mIHRoZSBmaWxlJ3Mgb3duZXIuCSovCisgICAgX19naWRfdCBzdF9naWQ7CQkvKiBHcm91cCBJRCBvZiB0aGUgZmlsZSdzIGdyb3VwLiovCisjaWYgX19XT1JEU0laRSA9PSA2NAorICAgIGludCBfX3BhZDA7CisjZW5kaWYKKyAgICBfX2Rldl90IHN0X3JkZXY7CQkvKiBEZXZpY2UgbnVtYmVyLCBpZiBkZXZpY2UuICAqLworI2lmIF9fV09SRFNJWkUgPT0gMzIKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19wYWQyOworI2VuZGlmCisjaWYgX19XT1JEU0laRSA9PSA2NCB8fCAhZGVmaW5lZCBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19vZmZfdCBzdF9zaXplOwkJCS8qIFNpemUgb2YgZmlsZSwgaW4gYnl0ZXMuICAqLworI2Vsc2UKKyAgICBfX29mZjY0X3Qgc3Rfc2l6ZTsJCQkvKiBTaXplIG9mIGZpbGUsIGluIGJ5dGVzLiAgKi8KKyNlbmRpZgorICAgIF9fYmxrc2l6ZV90IHN0X2Jsa3NpemU7CS8qIE9wdGltYWwgYmxvY2sgc2l6ZSBmb3IgSS9PLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDY0IHx8ICFkZWZpbmVkIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICBfX2Jsa2NudF90IHN0X2Jsb2NrczsJCS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworI2Vsc2UKKyAgICBfX2Jsa2NudDY0X3Qgc3RfYmxvY2tzOwkJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisjZW5kaWYKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorICAgIC8qIE5hbm9zZWNvbmQgcmVzb2x1dGlvbiB0aW1lc3RhbXBzIGFyZSBzdG9yZWQgaW4gYSBmb3JtYXQKKyAgICAgICBlcXVpdmFsZW50IHRvICdzdHJ1Y3QgdGltZXNwZWMnLiAgVGhpcyBpcyB0aGUgdHlwZSB1c2VkCisgICAgICAgd2hlbmV2ZXIgcG9zc2libGUgYnV0IHRoZSBVbml4IG5hbWVzcGFjZSBydWxlcyBkbyBub3QgYWxsb3cgdGhlCisgICAgICAgaWRlbnRpZmllciAndGltZXNwZWMnIHRvIGFwcGVhciBpbiB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlci4KKyAgICAgICBUaGVyZWZvcmUgd2UgaGF2ZSB0byBoYW5kbGUgdGhlIHVzZSBvZiB0aGlzIGhlYWRlciBpbiBzdHJpY3RseQorICAgICAgIHN0YW5kYXJkLWNvbXBsaWFudCBzb3VyY2VzIHNwZWNpYWwuICAqLworICAgIHN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOwkJLyogVGltZSBvZiBsYXN0IGFjY2Vzcy4gICovCisgICAgc3RydWN0IHRpbWVzcGVjIHN0X210aW07CQkvKiBUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXNwZWMgc3RfY3RpbTsJCS8qIFRpbWUgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKyMgZGVmaW5lIHN0X2F0aW1lIHN0X2F0aW0udHZfc2VjCS8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICAqLworIyBkZWZpbmUgc3RfbXRpbWUgc3RfbXRpbS50dl9zZWMKKyMgZGVmaW5lIHN0X2N0aW1lIHN0X2N0aW0udHZfc2VjCisjZWxzZQorICAgIF9fdGltZV90IHN0X2F0aW1lOwkJCS8qIFRpbWUgb2YgbGFzdCBhY2Nlc3MuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN0X2F0aW1lbnNlYzsJLyogTnNjZWNzIG9mIGxhc3QgYWNjZXNzLiAgKi8KKyAgICBfX3RpbWVfdCBzdF9tdGltZTsJCQkvKiBUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzdF9tdGltZW5zZWM7CS8qIE5zZWNzIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKyAgICBfX3RpbWVfdCBzdF9jdGltZTsJCQkvKiBUaW1lIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3RfY3RpbWVuc2VjOwkvKiBOc2VjcyBvZiBsYXN0IHN0YXR1cyBjaGFuZ2UuICAqLworI2VuZGlmCisjaWYgX19XT1JEU0laRSA9PSA2NAorICAgIGxvbmcgaW50IF9fdW51c2VkWzNdOworI2Vsc2UKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDQ7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ1OworIyBlbHNlCisgICAgX19pbm82NF90IHN0X2lubzsJCQkvKiBGaWxlIHNlcmlhbCBudW1iZXIuCSovCisjIGVuZGlmCisjZW5kaWYKKyAgfTsKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CisvKiBOb3RlIHN0YXQ2NCBoYXMgdGhlIHNhbWUgc2hhcGUgYXMgc3RhdCBmb3IgeDg2LTY0LiAgKi8KK3N0cnVjdCBzdGF0NjQKKyAgeworICAgIF9fZGV2X3Qgc3RfZGV2OwkJLyogRGV2aWNlLiAgKi8KKyMgaWYgX19XT1JEU0laRSA9PSA2NAorICAgIF9faW5vNjRfdCBzdF9pbm87CQkvKiBGaWxlIHNlcmlhbCBudW1iZXIuICAqLworICAgIF9fbmxpbmtfdCBzdF9ubGluazsJCS8qIExpbmsgY291bnQuICAqLworICAgIF9fbW9kZV90IHN0X21vZGU7CQkvKiBGaWxlIG1vZGUuICAqLworIyBlbHNlCisgICAgdW5zaWduZWQgaW50IF9fcGFkMTsKKyAgICBfX2lub190IF9fc3RfaW5vOwkJCS8qIDMyYml0IGZpbGUgc2VyaWFsIG51bWJlci4JKi8KKyAgICBfX21vZGVfdCBzdF9tb2RlOwkJCS8qIEZpbGUgbW9kZS4gICovCisgICAgX19ubGlua190IHN0X25saW5rOwkJCS8qIExpbmsgY291bnQuICAqLworIyBlbmRpZgorICAgIF9fdWlkX3Qgc3RfdWlkOwkJLyogVXNlciBJRCBvZiB0aGUgZmlsZSdzIG93bmVyLgkqLworICAgIF9fZ2lkX3Qgc3RfZ2lkOwkJLyogR3JvdXAgSUQgb2YgdGhlIGZpbGUncyBncm91cC4qLworIyBpZiBfX1dPUkRTSVpFID09IDY0CisgICAgaW50IF9fcGFkMDsKKyAgICBfX2Rldl90IHN0X3JkZXY7CQkvKiBEZXZpY2UgbnVtYmVyLCBpZiBkZXZpY2UuICAqLworICAgIF9fb2ZmX3Qgc3Rfc2l6ZTsJCS8qIFNpemUgb2YgZmlsZSwgaW4gYnl0ZXMuICAqLworIyBlbHNlCisgICAgX19kZXZfdCBzdF9yZGV2OwkJCS8qIERldmljZSBudW1iZXIsIGlmIGRldmljZS4gICovCisgICAgdW5zaWduZWQgaW50IF9fcGFkMjsKKyAgICBfX29mZjY0X3Qgc3Rfc2l6ZTsJCQkvKiBTaXplIG9mIGZpbGUsIGluIGJ5dGVzLiAgKi8KKyMgZW5kaWYKKyAgICBfX2Jsa3NpemVfdCBzdF9ibGtzaXplOwkvKiBPcHRpbWFsIGJsb2NrIHNpemUgZm9yIEkvTy4gICovCisgICAgX19ibGtjbnQ2NF90IHN0X2Jsb2NrczsJLyogTnIuIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICAqLworIyBpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorICAgIC8qIE5hbm9zZWNvbmQgcmVzb2x1dGlvbiB0aW1lc3RhbXBzIGFyZSBzdG9yZWQgaW4gYSBmb3JtYXQKKyAgICAgICBlcXVpdmFsZW50IHRvICdzdHJ1Y3QgdGltZXNwZWMnLiAgVGhpcyBpcyB0aGUgdHlwZSB1c2VkCisgICAgICAgd2hlbmV2ZXIgcG9zc2libGUgYnV0IHRoZSBVbml4IG5hbWVzcGFjZSBydWxlcyBkbyBub3QgYWxsb3cgdGhlCisgICAgICAgaWRlbnRpZmllciAndGltZXNwZWMnIHRvIGFwcGVhciBpbiB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlci4KKyAgICAgICBUaGVyZWZvcmUgd2UgaGF2ZSB0byBoYW5kbGUgdGhlIHVzZSBvZiB0aGlzIGhlYWRlciBpbiBzdHJpY3RseQorICAgICAgIHN0YW5kYXJkLWNvbXBsaWFudCBzb3VyY2VzIHNwZWNpYWwuICAqLworICAgIHN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOwkJLyogVGltZSBvZiBsYXN0IGFjY2Vzcy4gICovCisgICAgc3RydWN0IHRpbWVzcGVjIHN0X210aW07CQkvKiBUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXNwZWMgc3RfY3RpbTsJCS8qIFRpbWUgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKyMgIGRlZmluZSBzdF9hdGltZSBzdF9hdGltLnR2X3NlYwkvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgKi8KKyMgIGRlZmluZSBzdF9tdGltZSBzdF9tdGltLnR2X3NlYworIyAgZGVmaW5lIHN0X2N0aW1lIHN0X2N0aW0udHZfc2VjCisjIGVsc2UKKyAgICBfX3RpbWVfdCBzdF9hdGltZTsJCQkvKiBUaW1lIG9mIGxhc3QgYWNjZXNzLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzdF9hdGltZW5zZWM7CS8qIE5zY2VjcyBvZiBsYXN0IGFjY2Vzcy4gICovCisgICAgX190aW1lX3Qgc3RfbXRpbWU7CQkJLyogVGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbi4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3RfbXRpbWVuc2VjOwkvKiBOc2VjcyBvZiBsYXN0IG1vZGlmaWNhdGlvbi4gICovCisgICAgX190aW1lX3Qgc3RfY3RpbWU7CQkJLyogVGltZSBvZiBsYXN0IHN0YXR1cyBjaGFuZ2UuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN0X2N0aW1lbnNlYzsJLyogTnNlY3Mgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKyMgZW5kaWYKKyMgaWYgX19XT1JEU0laRSA9PSA2NAorICAgIGxvbmcgaW50IF9fdW51c2VkWzNdOworIyBlbHNlCisgICAgX19pbm82NF90IHN0X2lubzsJCQkvKiBGaWxlIHNlcmlhbCBudW1iZXIuCQkqLworIyBlbmRpZgorICB9OworI2VuZGlmCisKKy8qIFRlbGwgY29kZSB3ZSBoYXZlIHRoZXNlIG1lbWJlcnMuICAqLworI2RlZmluZQlfU1RBVEJVRl9TVF9CTEtTSVpFCisjZGVmaW5lIF9TVEFUQlVGX1NUX1JERVYKKy8qIE5hbm9zZWNvbmQgcmVzb2x1dGlvbiB0aW1lIHZhbHVlcyBhcmUgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCisvKiBFbmNvZGluZyBvZiB0aGUgZmlsZSBtb2RlLiAgKi8KKworI2RlZmluZQlfX1NfSUZNVAkwMTcwMDAwCS8qIFRoZXNlIGJpdHMgZGV0ZXJtaW5lIGZpbGUgdHlwZS4gICovCisKKy8qIEZpbGUgdHlwZXMuICAqLworI2RlZmluZQlfX1NfSUZESVIJMDA0MDAwMAkvKiBEaXJlY3RvcnkuICAqLworI2RlZmluZQlfX1NfSUZDSFIJMDAyMDAwMAkvKiBDaGFyYWN0ZXIgZGV2aWNlLiAgKi8KKyNkZWZpbmUJX19TX0lGQkxLCTAwNjAwMDAJLyogQmxvY2sgZGV2aWNlLiAgKi8KKyNkZWZpbmUJX19TX0lGUkVHCTAxMDAwMDAJLyogUmVndWxhciBmaWxlLiAgKi8KKyNkZWZpbmUJX19TX0lGSUZPCTAwMTAwMDAJLyogRklGTy4gICovCisjZGVmaW5lCV9fU19JRkxOSwkwMTIwMDAwCS8qIFN5bWJvbGljIGxpbmsuICAqLworI2RlZmluZQlfX1NfSUZTT0NLCTAxNDAwMDAJLyogU29ja2V0LiAgKi8KKworLyogUE9TSVguMWIgb2JqZWN0cy4gIE5vdGUgdGhhdCB0aGVzZSBtYWNyb3MgYWx3YXlzIGV2YWx1YXRlIHRvIHplcm8uICBCdXQKKyAgIHRoZXkgZG8gaXQgYnkgZW5mb3JjaW5nIHRoZSBjb3JyZWN0IHVzZSBvZiB0aGUgbWFjcm9zLiAgKi8KKyNkZWZpbmUgX19TX1RZUEVJU01RKGJ1ZikgICgoYnVmKS0+c3RfbW9kZSAtIChidWYpLT5zdF9tb2RlKQorI2RlZmluZSBfX1NfVFlQRUlTU0VNKGJ1ZikgKChidWYpLT5zdF9tb2RlIC0gKGJ1ZiktPnN0X21vZGUpCisjZGVmaW5lIF9fU19UWVBFSVNTSE0oYnVmKSAoKGJ1ZiktPnN0X21vZGUgLSAoYnVmKS0+c3RfbW9kZSkKKworLyogUHJvdGVjdGlvbiBiaXRzLiAgKi8KKworI2RlZmluZQlfX1NfSVNVSUQJMDQwMDAJLyogU2V0IHVzZXIgSUQgb24gZXhlY3V0aW9uLiAgKi8KKyNkZWZpbmUJX19TX0lTR0lECTAyMDAwCS8qIFNldCBncm91cCBJRCBvbiBleGVjdXRpb24uICAqLworI2RlZmluZQlfX1NfSVNWVFgJMDEwMDAJLyogU2F2ZSBzd2FwcGVkIHRleHQgYWZ0ZXIgdXNlIChzdGlja3kpLiAgKi8KKyNkZWZpbmUJX19TX0lSRUFECTA0MDAJLyogUmVhZCBieSBvd25lci4gICovCisjZGVmaW5lCV9fU19JV1JJVEUJMDIwMAkvKiBXcml0ZSBieSBvd25lci4gICovCisjZGVmaW5lCV9fU19JRVhFQwkwMTAwCS8qIEV4ZWN1dGUgYnkgb3duZXIuICAqLworCisjaWZkZWYgX19VU0VfQVRGSUxFCisjIGRlZmluZSBVVElNRV9OT1cJKCgxbCA8PCAzMCkgLSAxbCkKKyMgZGVmaW5lIFVUSU1FX09NSVQJKCgxbCA8PCAzMCkgLSAybCkKKyNlbmRpZgorCisjZW5kaWYJLyogYml0cy9zdGF0LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0YXRmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RhdGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkOTBkMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0YXRmcy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywxOTk4LDIwMDAsMjAwMiwyMDAzLDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TVEFURlNfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGF0ZnMuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3N0YXRmcy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCitzdHJ1Y3Qgc3RhdGZzCisgIHsKKyAgICBfX1NXT1JEX1RZUEUgZl90eXBlOworICAgIF9fU1dPUkRfVFlQRSBmX2JzaXplOworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19mc2Jsa2NudF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnRfdCBmX2JmcmVlOworICAgIF9fZnNibGtjbnRfdCBmX2JhdmFpbDsKKyAgICBfX2ZzZmlsY250X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250X3QgZl9mZnJlZTsKKyNlbHNlCisgICAgX19mc2Jsa2NudDY0X3QgZl9ibG9ja3M7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iZnJlZTsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2JhdmFpbDsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZpbGVzOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmZyZWU7CisjZW5kaWYKKyAgICBfX2ZzaWRfdCBmX2ZzaWQ7CisgICAgX19TV09SRF9UWVBFIGZfbmFtZWxlbjsKKyAgICBfX1NXT1JEX1RZUEUgZl9mcnNpemU7CisgICAgX19TV09SRF9UWVBFIGZfZmxhZ3M7CisgICAgX19TV09SRF9UWVBFIGZfc3BhcmVbNF07CisgIH07CisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorc3RydWN0IHN0YXRmczY0CisgIHsKKyAgICBfX1NXT1JEX1RZUEUgZl90eXBlOworICAgIF9fU1dPUkRfVFlQRSBmX2JzaXplOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmZyZWU7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iYXZhaWw7CisgICAgX19mc2ZpbGNudDY0X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZmcmVlOworICAgIF9fZnNpZF90IGZfZnNpZDsKKyAgICBfX1NXT1JEX1RZUEUgZl9uYW1lbGVuOworICAgIF9fU1dPUkRfVFlQRSBmX2Zyc2l6ZTsKKyAgICBfX1NXT1JEX1RZUEUgZl9mbGFnczsKKyAgICBfX1NXT1JEX1RZUEUgZl9zcGFyZVs0XTsKKyAgfTsKKyNlbmRpZgorCisvKiBUZWxsIGNvZGUgd2UgaGF2ZSB0aGVzZSBtZW1iZXJzLiAgKi8KKyNkZWZpbmUgX1NUQVRGU19GX05BTUVMRU4KKyNkZWZpbmUgX1NUQVRGU19GX0ZSU0laRQorI2RlZmluZSBfU1RBVEZTX0ZfRkxBR1MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0YXR2ZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0YXR2ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDcxN2MzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RhdHZmcy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwyMDAwLDIwMDEsMjAwMiwyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1RBVFZGU19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0YXR2ZnMuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3N0YXR2ZnMuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4gIC8qIEZvciBfX2ZzYmxrY250X3QgYW5kIF9fZnNmaWxjbnRfdC4gICovCisKKyNpZiBfX1dPUkRTSVpFID09IDMyCisjZGVmaW5lIF9TVEFUVkZTQlVGX0ZfVU5VU0VECisjZW5kaWYKKworc3RydWN0IHN0YXR2ZnMKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfYnNpemU7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgZl9mcnNpemU7CisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICBfX2ZzYmxrY250X3QgZl9ibG9ja3M7CisgICAgX19mc2Jsa2NudF90IGZfYmZyZWU7CisgICAgX19mc2Jsa2NudF90IGZfYmF2YWlsOworICAgIF9fZnNmaWxjbnRfdCBmX2ZpbGVzOworICAgIF9fZnNmaWxjbnRfdCBmX2ZmcmVlOworICAgIF9fZnNmaWxjbnRfdCBmX2ZhdmFpbDsKKyNlbHNlCisgICAgX19mc2Jsa2NudDY0X3QgZl9ibG9ja3M7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iZnJlZTsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2JhdmFpbDsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZpbGVzOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmZyZWU7CisgICAgX19mc2ZpbGNudDY0X3QgZl9mYXZhaWw7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2ZzaWQ7CisjaWZkZWYgX1NUQVRWRlNCVUZfRl9VTlVTRUQKKyAgICBpbnQgX19mX3VudXNlZDsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfZmxhZzsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX25hbWVtYXg7CisgICAgaW50IF9fZl9zcGFyZVs2XTsKKyAgfTsKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitzdHJ1Y3Qgc3RhdHZmczY0CisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2JzaXplOworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfZnJzaXplOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmZyZWU7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iYXZhaWw7CisgICAgX19mc2ZpbGNudDY0X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZmcmVlOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmF2YWlsOworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfZnNpZDsKKyNpZmRlZiBfU1RBVFZGU0JVRl9GX1VOVVNFRAorICAgIGludCBfX2ZfdW51c2VkOworI2VuZGlmCisgICAgdW5zaWduZWQgbG9uZyBpbnQgZl9mbGFnOworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfbmFtZW1heDsKKyAgICBpbnQgX19mX3NwYXJlWzZdOworICB9OworI2VuZGlmCisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgZmxhZyBpbiBgZl9mbGFnJy4gIFRoZXNlIGRlZmluaXRpb25zIHNob3VsZCBiZQorICAga2VwdCBpbiBzeW5jIHdpdGggdGhlIGRlZmluaXRpb25zIGluIDxzeXMvbW91bnQuaD4uICAqLworZW51bQoreworICBTVF9SRE9OTFkgPSAxLAkJLyogTW91bnQgcmVhZC1vbmx5LiAgKi8KKyNkZWZpbmUgU1RfUkRPTkxZCVNUX1JET05MWQorICBTVF9OT1NVSUQgPSAyCQkJLyogSWdub3JlIHN1aWQgYW5kIHNnaWQgYml0cy4gICovCisjZGVmaW5lIFNUX05PU1VJRAlTVF9OT1NVSUQKKyNpZmRlZiBfX1VTRV9HTlUKKyAgLAorICBTVF9OT0RFViA9IDQsCQkJLyogRGlzYWxsb3cgYWNjZXNzIHRvIGRldmljZSBzcGVjaWFsIGZpbGVzLiAgKi8KKyMgZGVmaW5lIFNUX05PREVWCVNUX05PREVWCisgIFNUX05PRVhFQyA9IDgsCQkvKiBEaXNhbGxvdyBwcm9ncmFtIGV4ZWN1dGlvbi4gICovCisjIGRlZmluZSBTVF9OT0VYRUMJU1RfTk9FWEVDCisgIFNUX1NZTkNIUk9OT1VTID0gMTYsCQkvKiBXcml0ZXMgYXJlIHN5bmNlZCBhdCBvbmNlLiAgKi8KKyMgZGVmaW5lIFNUX1NZTkNIUk9OT1VTCVNUX1NZTkNIUk9OT1VTCisgIFNUX01BTkRMT0NLID0gNjQsCQkvKiBBbGxvdyBtYW5kYXRvcnkgbG9ja3Mgb24gYW4gRlMuICAqLworIyBkZWZpbmUgU1RfTUFORExPQ0sJU1RfTUFORExPQ0sKKyAgU1RfV1JJVEUgPSAxMjgsCQkvKiBXcml0ZSBvbiBmaWxlL2RpcmVjdG9yeS9zeW1saW5rLiAgKi8KKyMgZGVmaW5lIFNUX1dSSVRFCVNUX1dSSVRFCisgIFNUX0FQUEVORCA9IDI1NiwJCS8qIEFwcGVuZC1vbmx5IGZpbGUuICAqLworIyBkZWZpbmUgU1RfQVBQRU5ECVNUX0FQUEVORAorICBTVF9JTU1VVEFCTEUgPSA1MTIsCQkvKiBJbW11dGFibGUgZmlsZS4gICovCisjIGRlZmluZSBTVF9JTU1VVEFCTEUJU1RfSU1NVVRBQkxFCisgIFNUX05PQVRJTUUgPSAxMDI0LAkJLyogRG8gbm90IHVwZGF0ZSBhY2Nlc3MgdGltZXMuICAqLworIyBkZWZpbmUgU1RfTk9BVElNRQlTVF9OT0FUSU1FCisgIFNUX05PRElSQVRJTUUgPSAyMDQ4LAkJLyogRG8gbm90IHVwZGF0ZSBkaXJlY3RvcnkgYWNjZXNzIHRpbWVzLiAgKi8KKyMgZGVmaW5lIFNUX05PRElSQVRJTUUJU1RfTk9ESVJBVElNRQorICBTVF9SRUxBVElNRSA9IDQwOTYJCS8qIFVwZGF0ZSBhdGltZSByZWxhdGl2ZSB0byBtdGltZS9jdGltZS4gICovCisjIGRlZmluZSBTVF9SRUxBVElNRQlTVF9SRUxBVElNRQorI2VuZGlmCS8qIFVzZSBHTlUuICAqLworfTsKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGlvLWxkYmwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGlvLWxkYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTBmMTEzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RkaW8tbGRibC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBzdGRpbyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NURElPX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RkaW8tbGRibC5oPiBkaXJlY3RseTsgdXNlIDxzdGRpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKK19fTERCTF9SRURJUl9ERUNMIChmcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHByaW50ZikKK19fTERCTF9SRURJUl9ERUNMIChzcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHZmcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHZwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAodnNwcmludGYpCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgIWRlZmluZWQgX19VU0VfR05VIFwKKyAgICAmJiAhZGVmaW5lZCBfX1JFRElSRUNUIFwKKyAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorX19MREJMX1JFRElSMV9ERUNMIChmc2NhbmYsIF9fbmxkYmxfX19pc29jOTlfZnNjYW5mKQorX19MREJMX1JFRElSMV9ERUNMIChzY2FuZiwgX19ubGRibF9fX2lzb2M5OV9zY2FuZikKK19fTERCTF9SRURJUjFfREVDTCAoc3NjYW5mLCBfX25sZGJsX19faXNvYzk5X3NzY2FuZikKKyNlbHNlCitfX0xEQkxfUkVESVJfREVDTCAoZnNjYW5mKQorX19MREJMX1JFRElSX0RFQ0wgKHNjYW5mKQorX19MREJMX1JFRElSX0RFQ0wgKHNzY2FuZikKKyNlbmRpZgorX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorX19MREJMX1JFRElSX0RFQ0wgKHNucHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHZzbnByaW50ZikKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKyMgaWYgIWRlZmluZWQgX19VU0VfR05VICYmICFkZWZpbmVkIF9fUkVESVJFQ1QgXAorICAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorX19MREJMX1JFRElSMV9ERUNMICh2ZnNjYW5mLCBfX25sZGJsX19faXNvYzk5X3Zmc2NhbmYpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHZzY2FuZiwgX19ubGRibF9fX2lzb2M5OV92c2NhbmYpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHZzc2NhbmYsIF9fbmxkYmxfX19pc29jOTlfdnNzY2FuZikKKyMgZWxzZQorX19MREJMX1JFRElSX0RFQ0wgKHZmc2NhbmYpCitfX0xEQkxfUkVESVJfREVDTCAodnNzY2FuZikKK19fTERCTF9SRURJUl9ERUNMICh2c2NhbmYpCisjIGVuZGlmCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorX19MREJMX1JFRElSX0RFQ0wgKHZkcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKGRwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAodmFzcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKF9fYXNwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAoYXNwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAob2JzdGFja19wcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAob2JzdGFja192cHJpbnRmKQorI2VuZGlmCisKKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKK19fTERCTF9SRURJUl9ERUNMIChfX3NwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdnNwcmludGZfY2hrKQorIyBpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OSB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorX19MREJMX1JFRElSX0RFQ0wgKF9fc25wcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdnNucHJpbnRmX2NoaykKKyMgZW5kaWYKKyMgaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEKK19fTERCTF9SRURJUl9ERUNMIChfX2ZwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fcHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3ZmcHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3ZwcmludGZfY2hrKQorIyAgaWZkZWYgX19VU0VfR05VCitfX0xEQkxfUkVESVJfREVDTCAoX19hc3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192YXNwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fZHByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192ZHByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX19vYnN0YWNrX3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX19vYnN0YWNrX3ZwcmludGZfY2hrKQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RkaW8tbG9jay5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RkaW8tbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZWZkZDgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGRpby1sb2NrLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qIFRocmVhZCBwYWNrYWdlIHNwZWNpZmljIGRlZmluaXRpb25zIG9mIHN0cmVhbSBsb2NrIHR5cGUuICBOUFRMIHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0JJVFNfU1RESU9fTE9DS19ICisjZGVmaW5lIF9CSVRTX1NURElPX0xPQ0tfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgorI2luY2x1ZGUgPGxvd2xldmVsbG9jay5oPgorCisKKy8qIFRoZSBsb2NraW5nIGhlcmUgaXMgdmVyeSBpbmV4cGVuc2l2ZSwgZXZlbiBmb3IgaW5saW5pbmcuICAqLworI2RlZmluZSBfSU9fbG9ja19pbmV4cGVuc2l2ZQkxCisKK3R5cGVkZWYgc3RydWN0IHsgaW50IGxvY2s7IGludCBjbnQ7IHZvaWQgKm93bmVyOyB9IF9JT19sb2NrX3Q7CisKKyNkZWZpbmUgX0lPX2xvY2tfaW5pdGlhbGl6ZXIgeyBMTExfTE9DS19JTklUSUFMSVpFUiwgMCwgTlVMTCB9CisKKyNkZWZpbmUgX0lPX2xvY2tfaW5pdChfbmFtZSkgXAorICAoKF9uYW1lKSA9IChfSU9fbG9ja190KSBfSU9fbG9ja19pbml0aWFsaXplciAsIDApCisKKyNkZWZpbmUgX0lPX2xvY2tfZmluaShfbmFtZSkgXAorICAoKHZvaWQpIDApCisKKyNkZWZpbmUgX0lPX2xvY2tfbG9jayhfbmFtZSkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHZvaWQgKl9fc2VsZiA9IFRIUkVBRF9TRUxGOwkJCQkJCSAgICAgIFwKKyAgICBpZiAoKF9uYW1lKS5vd25lciAhPSBfX3NlbGYpCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCWxsbF9sb2NrICgoX25hbWUpLmxvY2ssIExMTF9QUklWQVRFKTsJCQkJICAgICAgXAorICAgICAgICAoX25hbWUpLm93bmVyID0gX19zZWxmOwkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgKysoX25hbWUpLmNudDsJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9JT19sb2NrX3RyeWxvY2soX25hbWUpIFwKKyAgKHsJCQkJCQkJCQkgICAgICBcCisgICAgaW50IF9fcmVzdWx0ID0gMDsJCQkJCQkJICAgICAgXAorICAgIHZvaWQgKl9fc2VsZiA9IFRIUkVBRF9TRUxGOwkJCQkJCSAgICAgIFwKKyAgICBpZiAoKF9uYW1lKS5vd25lciAhPSBfX3NlbGYpCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgICBpZiAobGxsX3RyeWxvY2sgKChfbmFtZSkubG9jaykgPT0gMCkJCQkJICAgICAgXAorICAgICAgICAgIHsJCQkJCQkJCSAgICAgIFwKKyAgICAgICAgICAgIChfbmFtZSkub3duZXIgPSBfX3NlbGY7CQkJCQkgICAgICBcCisgICAgICAgICAgICAoX25hbWUpLmNudCA9IDE7CQkJCQkJICAgICAgXAorICAgICAgICAgIH0JCQkJCQkJCSAgICAgIFwKKyAgICAgICAgZWxzZQkJCQkJCQkJICAgICAgXAorICAgICAgICAgIF9fcmVzdWx0ID0gRUJVU1k7CQkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgICBlbHNlCQkJCQkJCQkgICAgICBcCisgICAgICArKyhfbmFtZSkuY250OwkJCQkJCQkgICAgICBcCisgICAgX19yZXN1bHQ7CQkJCQkJCQkgICAgICBcCisgIH0pCisKKyNkZWZpbmUgX0lPX2xvY2tfdW5sb2NrKF9uYW1lKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaWYgKC0tKF9uYW1lKS5jbnQgPT0gMCkJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgICAoX25hbWUpLm93bmVyID0gTlVMTDsJCQkJCQkgICAgICBcCisJbGxsX3VubG9jayAoKF9uYW1lKS5sb2NrLCBMTExfUFJJVkFURSk7CQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworCisjZGVmaW5lIF9JT19jbGVhbnVwX3JlZ2lvbl9zdGFydChfZmN0LCBfZnApIFwKKyAgX19saWJjX2NsZWFudXBfcmVnaW9uX3N0YXJ0ICgoKF9mcCktPl9mbGFncyAmIF9JT19VU0VSX0xPQ0spID09IDAsIF9mY3QsIF9mcCkKKyNkZWZpbmUgX0lPX2NsZWFudXBfcmVnaW9uX3N0YXJ0X25vYXJnKF9mY3QpIFwKKyAgX19saWJjX2NsZWFudXBfcmVnaW9uX3N0YXJ0ICgxLCBfZmN0LCBOVUxMKQorI2RlZmluZSBfSU9fY2xlYW51cF9yZWdpb25fZW5kKF9kb2l0KSBcCisgIF9fbGliY19jbGVhbnVwX3JlZ2lvbl9lbmQgKF9kb2l0KQorCisjaWYgZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBOT1RfSU5fbGliYworCisjIGlmZGVmIF9fRVhDRVBUSU9OUworIyAgZGVmaW5lIF9JT19hY3F1aXJlX2xvY2soX2ZwKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgX0lPX0ZJTEUgKl9JT19hY3F1aXJlX2xvY2tfZmlsZQkJCQkJICAgICAgXAorCV9fYXR0cmlidXRlX18oKGNsZWFudXAgKF9JT19hY3F1aXJlX2xvY2tfZmN0KSkpCQkJICAgICAgXAorCT0gKF9mcCk7CQkJCQkJCSAgICAgIFwKKyAgICBfSU9fZmxvY2tmaWxlIChfSU9fYWNxdWlyZV9sb2NrX2ZpbGUpOworIyAgZGVmaW5lIF9JT19hY3F1aXJlX2xvY2tfY2xlYXJfZmxhZ3MyKF9mcCkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIF9JT19GSUxFICpfSU9fYWNxdWlyZV9sb2NrX2ZpbGUJCQkJCSAgICAgIFwKKwlfX2F0dHJpYnV0ZV9fKChjbGVhbnVwIChfSU9fYWNxdWlyZV9sb2NrX2NsZWFyX2ZsYWdzMl9mY3QpKSkJICAgICAgXAorCT0gKF9mcCk7CQkJCQkJCSAgICAgIFwKKyAgICBfSU9fZmxvY2tmaWxlIChfSU9fYWNxdWlyZV9sb2NrX2ZpbGUpOworIyBlbHNlCisjICBkZWZpbmUgX0lPX2FjcXVpcmVfbG9jayhfZnApIF9JT19hY3F1aXJlX2xvY2tfbmVlZHNfZXhjZXB0aW9uc19lbmFibGVkCisjICBkZWZpbmUgX0lPX2FjcXVpcmVfbG9ja19jbGVhcl9mbGFnczIoX2ZwKSBfSU9fYWNxdWlyZV9sb2NrIChfZnApCisjIGVuZGlmCisjIGRlZmluZSBfSU9fcmVsZWFzZV9sb2NrKF9mcCkgOyB9IHdoaWxlICgwKQorCisjZW5kaWYKKworI2VuZGlmIC8qIGJpdHMvc3RkaW8tbG9jay5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGRpby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTMwM2M2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RkaW8uaApAQCAtMCwwICsxLDE5MSBAQAorLyogT3B0aW1pemluZyBtYWNyb3MgYW5kIGlubGluZSBmdW5jdGlvbnMgZm9yIHN0ZGlvIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMjAwMCwgMjAwMSwgMjAwNCwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RESU9fSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGRpby5oPiBkaXJlY3RseTsgdXNlIDxzdGRpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fZXh0ZXJuX2lubGluZQorIyBkZWZpbmUgX19TVERJT19JTkxJTkUgaW5saW5lCisjZWxzZQorIyBkZWZpbmUgX19TVERJT19JTkxJTkUgX19leHRlcm5faW5saW5lCisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKKy8qIEZvciAtRF9GT1JUSUZZX1NPVVJDRXssPTJ9IGJpdHMvc3RkaW8yLmggd2lsbCBkZWZpbmUgYSBkaWZmZXJlbnQKKyAgIGlubGluZS4gICovCisjIGlmICEoX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lKQorLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBzdGRvdXQgZnJvbSBhcmd1bWVudCBsaXN0IEFSRy4gICovCitfX1NURElPX0lOTElORSBpbnQKK3ZwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FyZykKK3sKKyAgcmV0dXJuIHZmcHJpbnRmIChzdGRvdXQsIF9fZm10LCBfX2FyZyk7Cit9CisjIGVuZGlmCisKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSBzdGRpbi4gICovCitfX1NURElPX0lOTElORSBpbnQKK2dldGNoYXIgKHZvaWQpCit7CisgIHJldHVybiBfSU9fZ2V0YyAoc3RkaW4pOworfQorCisKKyMgaWZkZWYgX19VU0VfTUlTQworLyogRmFzdGVyIHZlcnNpb24gd2hlbiBsb2NraW5nIGlzIG5vdCBuZWNlc3NhcnkuICAqLworX19TVERJT19JTkxJTkUgaW50CitmZ2V0Y191bmxvY2tlZCAoRklMRSAqX19mcCkKK3sKKyAgcmV0dXJuIF9JT19nZXRjX3VubG9ja2VkIChfX2ZwKTsKK30KKyMgZW5kaWYgLyogbWlzYyAqLworCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKy8qIFRoaXMgaXMgZGVmaW5lZCBpbiBQT1NJWC4xOjE5OTYuICAqLworX19TVERJT19JTkxJTkUgaW50CitnZXRjX3VubG9ja2VkIChGSUxFICpfX2ZwKQoreworICByZXR1cm4gX0lPX2dldGNfdW5sb2NrZWQgKF9fZnApOworfQorCisvKiBUaGlzIGlzIGRlZmluZWQgaW4gUE9TSVguMToxOTk2LiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorZ2V0Y2hhcl91bmxvY2tlZCAodm9pZCkKK3sKKyAgcmV0dXJuIF9JT19nZXRjX3VubG9ja2VkIChzdGRpbik7Cit9CisjIGVuZGlmCS8qIFBPU0lYIHx8IG1pc2MgKi8KKworCisvKiBXcml0ZSBhIGNoYXJhY3RlciB0byBzdGRvdXQuICAqLworX19TVERJT19JTkxJTkUgaW50CitwdXRjaGFyIChpbnQgX19jKQoreworICByZXR1cm4gX0lPX3B1dGMgKF9fYywgc3Rkb3V0KTsKK30KKworCisjIGlmZGVmIF9fVVNFX01JU0MKKy8qIEZhc3RlciB2ZXJzaW9uIHdoZW4gbG9ja2luZyBpcyBub3QgbmVjZXNzYXJ5LiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorZnB1dGNfdW5sb2NrZWQgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKQoreworICByZXR1cm4gX0lPX3B1dGNfdW5sb2NrZWQgKF9fYywgX19zdHJlYW0pOworfQorIyBlbmRpZiAvKiBtaXNjICovCisKKworIyBpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworLyogVGhpcyBpcyBkZWZpbmVkIGluIFBPU0lYLjE6MTk5Ni4gICovCitfX1NURElPX0lOTElORSBpbnQKK3B1dGNfdW5sb2NrZWQgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKQoreworICByZXR1cm4gX0lPX3B1dGNfdW5sb2NrZWQgKF9fYywgX19zdHJlYW0pOworfQorCisvKiBUaGlzIGlzIGRlZmluZWQgaW4gUE9TSVguMToxOTk2LiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorcHV0Y2hhcl91bmxvY2tlZCAoaW50IF9fYykKK3sKKyAgcmV0dXJuIF9JT19wdXRjX3VubG9ja2VkIChfX2MsIHN0ZG91dCk7Cit9CisjIGVuZGlmCS8qIFBPU0lYIHx8IG1pc2MgKi8KKworCisjIGlmZGVmCV9fVVNFX0dOVQorLyogTGlrZSBgZ2V0ZGVsaW0nLCBidXQgcmVhZHMgdXAgdG8gYSBuZXdsaW5lLiAgKi8KK19fU1RESU9fSU5MSU5FIF9JT19zc2l6ZV90CitnZXRsaW5lIChjaGFyICoqX19saW5lcHRyLCBzaXplX3QgKl9fbiwgRklMRSAqX19zdHJlYW0pCit7CisgIHJldHVybiBfX2dldGRlbGltIChfX2xpbmVwdHIsIF9fbiwgJ1xuJywgX19zdHJlYW0pOworfQorIyBlbmRpZiAvKiBHTlUgKi8KKworCisjIGlmZGVmIF9fVVNFX01JU0MKKy8qIEZhc3RlciB2ZXJzaW9ucyB3aGVuIGxvY2tpbmcgaXMgbm90IHJlcXVpcmVkLiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorX19OVEggKGZlb2ZfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSkKK3sKKyAgcmV0dXJuIF9JT19mZW9mX3VubG9ja2VkIChfX3N0cmVhbSk7Cit9CisKKy8qIEZhc3RlciB2ZXJzaW9ucyB3aGVuIGxvY2tpbmcgaXMgbm90IHJlcXVpcmVkLiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorX19OVEggKGZlcnJvcl91bmxvY2tlZCAoRklMRSAqX19zdHJlYW0pKQoreworICByZXR1cm4gX0lPX2ZlcnJvcl91bmxvY2tlZCAoX19zdHJlYW0pOworfQorIyBlbmRpZiAvKiBtaXNjICovCisKKyNlbmRpZiAvKiBVc2UgZXh0ZXJuIGlubGluZXMuICAqLworCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgJiYgZGVmaW5lZCBfX0dOVUNfXyAmJiBkZWZpbmVkIF9fT1BUSU1JWkVfXyBcCisgICAgJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKKy8qIFBlcmZvcm0gc29tZSBzaW1wbGUgb3B0aW1pemF0aW9ucy4gICovCisjIGRlZmluZSBmcmVhZF91bmxvY2tlZChwdHIsIHNpemUsIG4sIHN0cmVhbSkgXAorICAoX19leHRlbnNpb25fXyAoKF9fYnVpbHRpbl9jb25zdGFudF9wIChzaXplKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgICAgXAorCQkgICAmJiAoc2l6ZV90KSAoc2l6ZSkgKiAoc2l6ZV90KSAobikgPD0gOAkJICAgICAgXAorCQkgICAmJiAoc2l6ZV90KSAoc2l6ZSkgIT0gMCkJCQkJICAgICAgXAorCQkgID8gKHsgY2hhciAqX19wdHIgPSAoY2hhciAqKSAocHRyKTsJCQkgICAgICBcCisJCSAgICAgICBGSUxFICpfX3N0cmVhbSA9IChzdHJlYW0pOwkJCSAgICAgIFwKKwkJICAgICAgIHNpemVfdCBfX2NudDsJCQkJCSAgICAgIFwKKwkJICAgICAgIGZvciAoX19jbnQgPSAoc2l6ZV90KSAoc2l6ZSkgKiAoc2l6ZV90KSAobik7CSAgICAgIFwKKwkJCSAgICBfX2NudCA+IDA7IC0tX19jbnQpCQkJCSAgICAgIFwKKwkJCSB7CQkJCQkJICAgICAgXAorCQkJICAgaW50IF9fYyA9IF9JT19nZXRjX3VubG9ja2VkIChfX3N0cmVhbSk7CSAgICAgIFwKKwkJCSAgIGlmIChfX2MgPT0gRU9GKQkJCQkgICAgICBcCisJCQkgICAgIGJyZWFrOwkJCQkJICAgICAgXAorCQkJICAgKl9fcHRyKysgPSBfX2M7CQkJCSAgICAgIFwKKwkJCSB9CQkJCQkJICAgICAgXAorCQkgICAgICAgKChzaXplX3QpIChzaXplKSAqIChzaXplX3QpIChuKSAtIF9fY250KQkJICAgICAgXAorCQkJLyAoc2l6ZV90KSAoc2l6ZSk7IH0pCQkJCSAgICAgIFwKKwkJICA6ICgoKF9fYnVpbHRpbl9jb25zdGFudF9wIChzaXplKSAmJiAoc2l6ZV90KSAoc2l6ZSkgPT0gMCkgICBcCisJCSAgICAgIHx8IChfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgJiYgKHNpemVfdCkgKG4pID09IDApKSAgICAgXAorCQkJLyogRXZhbHVhdGUgYWxsIHBhcmFtZXRlcnMgb25jZS4gICovCQkgICAgICBcCisJCSAgICAgPyAoKHZvaWQpIChwdHIpLCAodm9pZCkgKHN0cmVhbSksICh2b2lkKSAoc2l6ZSksCSAgICAgIFwKKwkJCSh2b2lkKSAobiksIChzaXplX3QpIDApCQkJCSAgICAgIFwKKwkJICAgICA6IGZyZWFkX3VubG9ja2VkIChwdHIsIHNpemUsIG4sIHN0cmVhbSkpKSkKKworIyBkZWZpbmUgZndyaXRlX3VubG9ja2VkKHB0ciwgc2l6ZSwgbiwgc3RyZWFtKSBcCisgIChfX2V4dGVuc2lvbl9fICgoX19idWlsdGluX2NvbnN0YW50X3AgKHNpemUpICYmIF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAgICBcCisJCSAgICYmIChzaXplX3QpIChzaXplKSAqIChzaXplX3QpIChuKSA8PSA4CQkgICAgICBcCisJCSAgICYmIChzaXplX3QpIChzaXplKSAhPSAwKQkJCQkgICAgICBcCisJCSAgPyAoeyBjb25zdCBjaGFyICpfX3B0ciA9IChjb25zdCBjaGFyICopIChwdHIpOwkgICAgICBcCisJCSAgICAgICBGSUxFICpfX3N0cmVhbSA9IChzdHJlYW0pOwkJCSAgICAgIFwKKwkJICAgICAgIHNpemVfdCBfX2NudDsJCQkJCSAgICAgIFwKKwkJICAgICAgIGZvciAoX19jbnQgPSAoc2l6ZV90KSAoc2l6ZSkgKiAoc2l6ZV90KSAobik7CSAgICAgIFwKKwkJCSAgICBfX2NudCA+IDA7IC0tX19jbnQpCQkJCSAgICAgIFwKKwkJCSBpZiAoX0lPX3B1dGNfdW5sb2NrZWQgKCpfX3B0cisrLCBfX3N0cmVhbSkgPT0gRU9GKSAgIFwKKwkJCSAgIGJyZWFrOwkJCQkJICAgICAgXAorCQkgICAgICAgKChzaXplX3QpIChzaXplKSAqIChzaXplX3QpIChuKSAtIF9fY250KQkJICAgICAgXAorCQkJLyAoc2l6ZV90KSAoc2l6ZSk7IH0pCQkJCSAgICAgIFwKKwkJICA6ICgoKF9fYnVpbHRpbl9jb25zdGFudF9wIChzaXplKSAmJiAoc2l6ZV90KSAoc2l6ZSkgPT0gMCkgICBcCisJCSAgICAgIHx8IChfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgJiYgKHNpemVfdCkgKG4pID09IDApKSAgICAgXAorCQkJLyogRXZhbHVhdGUgYWxsIHBhcmFtZXRlcnMgb25jZS4gICovCQkgICAgICBcCisJCSAgICAgPyAoKHZvaWQpIChwdHIpLCAodm9pZCkgKHN0cmVhbSksICh2b2lkKSAoc2l6ZSksCSAgICAgIFwKKwkJCSh2b2lkKSAobiksIChzaXplX3QpIDApCQkJCSAgICAgIFwKKwkJICAgICA6IGZ3cml0ZV91bmxvY2tlZCAocHRyLCBzaXplLCBuLCBzdHJlYW0pKSkpCisjZW5kaWYKKworLyogRGVmaW5lIGhlbHBlciBtYWNyby4gICovCisjdW5kZWYgX19TVERJT19JTkxJTkUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGlvMi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RkaW8yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyNWFhYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGlvMi5oCkBAIC0wLDAgKzEsMzc0IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHN0ZGlvIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RESU9fSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGRpbzIuaD4gZGlyZWN0bHk7IHVzZSA8c3RkaW8uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworZXh0ZXJuIGludCBfX3NwcmludGZfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fZmxhZywgc2l6ZV90IF9fc2xlbiwKKwkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIF9fVEhST1c7CitleHRlcm4gaW50IF9fdnNwcmludGZfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fZmxhZywgc2l6ZV90IF9fc2xlbiwKKwkJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgIF9HX3ZhX2xpc3QgX19hcCkgX19USFJPVzsKKworI2lmZGVmIF9fdmFfYXJnX3BhY2sKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAoc3ByaW50ZiAoY2hhciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3NwcmludGZfY2hrIChfX3MsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLAorCQkJCSAgX19ib3MgKF9fcyksIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyNlbGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjIGRlZmluZSBzcHJpbnRmKHN0ciwgLi4uKSBcCisgIF9fYnVpbHRpbl9fX3NwcmludGZfY2hrIChzdHIsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2JvcyAoc3RyKSwgXAorCQkJICAgX19WQV9BUkdTX18pCisjZW5kaWYKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIICh2c3ByaW50ZiAoY2hhciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwKKwkJIF9HX3ZhX2xpc3QgX19hcCkpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX192c3ByaW50Zl9jaGsgKF9fcywgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsCisJCQkJICAgX19ib3MgKF9fcyksIF9fZm10LCBfX2FwKTsKK30KKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CisKK2V4dGVybiBpbnQgX19zbnByaW50Zl9jaGsgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLCBpbnQgX19mbGFnLAorCQkJICAgc2l6ZV90IF9fc2xlbiwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgLi4uKSBfX1RIUk9XOworZXh0ZXJuIGludCBfX3ZzbnByaW50Zl9jaGsgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLCBpbnQgX19mbGFnLAorCQkJICAgIHNpemVfdCBfX3NsZW4sIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgICBfR192YV9saXN0IF9fYXApIF9fVEhST1c7CisKKyMgaWZkZWYgX192YV9hcmdfcGFjaworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChzbnByaW50ZiAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zbnByaW50Zl9jaGsgKF9fcywgX19uLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwKKwkJCQkgICBfX2JvcyAoX19zKSwgX19mbXQsIF9fdmFfYXJnX3BhY2sgKCkpOworfQorIyBlbGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgc25wcmludGYoc3RyLCBsZW4sIC4uLikgXAorICBfX2J1aWx0aW5fX19zbnByaW50Zl9jaGsgKHN0ciwgbGVuLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19ib3MgKHN0ciksIFwKKwkJCSAgICBfX1ZBX0FSR1NfXykKKyMgZW5kaWYKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIICh2c25wcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FwKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3ZzbnByaW50Zl9jaGsgKF9fcywgX19uLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwKKwkJCQkgICAgX19ib3MgKF9fcyksIF9fZm10LCBfX2FwKTsKK30KKworI2VuZGlmCisKKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMQorCitleHRlcm4gaW50IF9fZnByaW50Zl9jaGsgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGludCBfX2ZsYWcsCisJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKTsKK2V4dGVybiBpbnQgX19wcmludGZfY2hrIChpbnQgX19mbGFnLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLik7CitleHRlcm4gaW50IF9fdmZwcmludGZfY2hrIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBpbnQgX19mbGFnLAorCQkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCBfR192YV9saXN0IF9fYXApOworZXh0ZXJuIGludCBfX3ZwcmludGZfY2hrIChpbnQgX19mbGFnLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgIF9HX3ZhX2xpc3QgX19hcCk7CisKKyMgaWZkZWYgX192YV9hcmdfcGFjaworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK2ZwcmludGYgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQoreworICByZXR1cm4gX19mcHJpbnRmX2NoayAoX19zdHJlYW0sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwKKwkJCV9fdmFfYXJnX3BhY2sgKCkpOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorcHJpbnRmIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKK3sKKyAgcmV0dXJuIF9fcHJpbnRmX2NoayAoX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyMgZWxpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgZGVmaW5lIHByaW50ZiguLi4pIFwKKyAgX19wcmludGZfY2hrIChfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19WQV9BUkdTX18pCisjICBkZWZpbmUgZnByaW50ZihzdHJlYW0sIC4uLikgXAorICBfX2ZwcmludGZfY2hrIChzdHJlYW0sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX1ZBX0FSR1NfXykKKyMgZW5kaWYKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3ZwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FwKQoreworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisgIHJldHVybiBfX3ZmcHJpbnRmX2NoayAoc3Rkb3V0LCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsIF9fYXApOworI2Vsc2UKKyAgcmV0dXJuIF9fdnByaW50Zl9jaGsgKF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX19hcCk7CisjZW5kaWYKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3ZmcHJpbnRmIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBfR192YV9saXN0IF9fYXApCit7CisgIHJldHVybiBfX3ZmcHJpbnRmX2NoayAoX19zdHJlYW0sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX19hcCk7Cit9CisKKyMgaWZkZWYgX19VU0VfR05VCisKK2V4dGVybiBpbnQgX19hc3ByaW50Zl9jaGsgKGNoYXIgKipfX3Jlc3RyaWN0IF9fcHRyLCBpbnQgX19mbGFnLAorCQkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSkgX193dXI7CitleHRlcm4gaW50IF9fdmFzcHJpbnRmX2NoayAoY2hhciAqKl9fcmVzdHJpY3QgX19wdHIsIGludCBfX2ZsYWcsCisJCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBfR192YV9saXN0IF9fYXJnKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpIF9fd3VyOworZXh0ZXJuIGludCBfX2RwcmludGZfY2hrIChpbnQgX19mZCwgaW50IF9fZmxhZywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LAorCQkJICAuLi4pIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOworZXh0ZXJuIGludCBfX3ZkcHJpbnRmX2NoayAoaW50IF9fZmQsIGludCBfX2ZsYWcsCisJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIF9HX3ZhX2xpc3QgX19hcmcpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpOworZXh0ZXJuIGludCBfX29ic3RhY2tfcHJpbnRmX2NoayAoc3RydWN0IG9ic3RhY2sgKl9fcmVzdHJpY3QgX19vYnN0YWNrLAorCQkJCSBpbnQgX19mbGFnLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkJIC4uLikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKK2V4dGVybiBpbnQgX19vYnN0YWNrX3ZwcmludGZfY2hrIChzdHJ1Y3Qgb2JzdGFjayAqX19yZXN0cmljdCBfX29ic3RhY2ssCisJCQkJICBpbnQgX19mbGFnLAorCQkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJCSAgX0dfdmFfbGlzdCBfX2FyZ3MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDApKSk7CisKKyMgIGlmZGVmIF9fdmFfYXJnX3BhY2sKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAoYXNwcmludGYgKGNoYXIgKipfX3Jlc3RyaWN0IF9fcHRyLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikpCit7CisgIHJldHVybiBfX2FzcHJpbnRmX2NoayAoX19wdHIsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwKKwkJCSBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChfX2FzcHJpbnRmIChjaGFyICoqX19yZXN0cmljdCBfX3B0ciwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LAorCQkgICAuLi4pKQoreworICByZXR1cm4gX19hc3ByaW50Zl9jaGsgKF9fcHRyLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsCisJCQkgX192YV9hcmdfcGFjayAoKSk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitkcHJpbnRmIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCit7CisgIHJldHVybiBfX2RwcmludGZfY2hrIChfX2ZkLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsCisJCQlfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChvYnN0YWNrX3ByaW50ZiAoc3RydWN0IG9ic3RhY2sgKl9fcmVzdHJpY3QgX19vYnN0YWNrLAorCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pKQoreworICByZXR1cm4gX19vYnN0YWNrX3ByaW50Zl9jaGsgKF9fb2JzdGFjaywgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LAorCQkJICAgICAgIF9fdmFfYXJnX3BhY2sgKCkpOworfQorIyAgZWxpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBhc3ByaW50ZihwdHIsIC4uLikgXAorICBfX2FzcHJpbnRmX2NoayAocHRyLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19WQV9BUkdTX18pCisjICAgZGVmaW5lIF9fYXNwcmludGYocHRyLCAuLi4pIFwKKyAgX19hc3ByaW50Zl9jaGsgKHB0ciwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyAgIGRlZmluZSBkcHJpbnRmKGZkLCAuLi4pIFwKKyAgX19kcHJpbnRmX2NoayAoZmQsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX1ZBX0FSR1NfXykKKyMgICBkZWZpbmUgb2JzdGFja19wcmludGYob2JzdGFjaywgLi4uKSBcCisgIF9fb2JzdGFja19wcmludGZfY2hrIChvYnN0YWNrLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19WQV9BUkdTX18pCisjICBlbmRpZgorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHZhc3ByaW50ZiAoY2hhciAqKl9fcmVzdHJpY3QgX19wdHIsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwKKwkJICBfR192YV9saXN0IF9fYXApKQoreworICByZXR1cm4gX192YXNwcmludGZfY2hrIChfX3B0ciwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3ZkcHJpbnRmIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBfR192YV9saXN0IF9fYXApCit7CisgIHJldHVybiBfX3ZkcHJpbnRmX2NoayAoX19mZCwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChvYnN0YWNrX3ZwcmludGYgKHN0cnVjdCBvYnN0YWNrICpfX3Jlc3RyaWN0IF9fb2JzdGFjaywKKwkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FwKSkKK3sKKyAgcmV0dXJuIF9fb2JzdGFja192cHJpbnRmX2NoayAoX19vYnN0YWNrLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsCisJCQkJX19hcCk7Cit9CisKKyMgZW5kaWYKKworI2VuZGlmCisKK2V4dGVybiBjaGFyICpfX2dldHNfY2hrIChjaGFyICpfX3N0ciwgc2l6ZV90KSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUIChfX2dldHNfd2FybiwgKGNoYXIgKl9fc3RyKSwgZ2V0cykKKyAgICAgX193dXIgX193YXJuYXR0ciAoInBsZWFzZSB1c2UgZmdldHMgb3IgZ2V0bGluZSBpbnN0ZWFkLCBnZXRzIGNhbid0ICIKKwkJICAgICAgICJzcGVjaWZ5IGJ1ZmZlciBzaXplIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgY2hhciAqCitnZXRzIChjaGFyICpfX3N0cikKK3sKKyAgaWYgKF9fYm9zIChfX3N0cikgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fZ2V0c19jaGsgKF9fc3RyLCBfX2JvcyAoX19zdHIpKTsKKyAgcmV0dXJuIF9fZ2V0c193YXJuIChfX3N0cik7Cit9CisKK2V4dGVybiBjaGFyICpfX2ZnZXRzX2NoayAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX3NpemUsIGludCBfX24sCisJCQkgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1QgKF9fZmdldHNfYWxpYXMsCisJCQkgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLAorCQkJICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwgZmdldHMpIF9fd3VyOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1QgKF9fZmdldHNfY2hrX3dhcm4sCisJCQkgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19zaXplLCBpbnQgX19uLAorCQkJICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwgX19mZ2V0c19jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJmZ2V0cyBjYWxsZWQgd2l0aCBiaWdnZXIgc2l6ZSB0aGFuIGxlbmd0aCAiCisJCSAgICAgICAib2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgY2hhciAqCitmZ2V0cyAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pCit7CisgIGlmIChfX2JvcyAoX19zKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pIHx8IF9fbiA8PSAwKQorCXJldHVybiBfX2ZnZXRzX2NoayAoX19zLCBfX2JvcyAoX19zKSwgX19uLCBfX3N0cmVhbSk7CisKKyAgICAgIGlmICgoc2l6ZV90KSBfX24gPiBfX2JvcyAoX19zKSkKKwlyZXR1cm4gX19mZ2V0c19jaGtfd2FybiAoX19zLCBfX2JvcyAoX19zKSwgX19uLCBfX3N0cmVhbSk7CisgICAgfQorICByZXR1cm4gX19mZ2V0c19hbGlhcyAoX19zLCBfX24sIF9fc3RyZWFtKTsKK30KKworZXh0ZXJuIHNpemVfdCBfX2ZyZWFkX2NoayAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fcHRybGVuLAorCQkJICAgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwKKwkJCSAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUIChfX2ZyZWFkX2FsaWFzLAorCQkJICAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKKwkJCSAgIHNpemVfdCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLAorCQkJICBmcmVhZCkgX193dXI7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1QgKF9fZnJlYWRfY2hrX3dhcm4sCisJCQkgICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19wdHJsZW4sCisJCQkgICBzaXplX3QgX19zaXplLCBzaXplX3QgX19uLAorCQkJICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksCisJCQkgIF9fZnJlYWRfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZnJlYWQgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgKiBubWVtYiB0aGFuIGxlbmd0aCAiCisJCSAgICAgICAib2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgc2l6ZV90CitmcmVhZCAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwKKyAgICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MwIChfX3B0cikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zaXplKQorCSAgfHwgIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pCisJICB8fCAoX19zaXplIHwgX19uKSA+PSAoKChzaXplX3QpIDEpIDw8ICg4ICogc2l6ZW9mIChzaXplX3QpIC8gMikpKQorCXJldHVybiBfX2ZyZWFkX2NoayAoX19wdHIsIF9fYm9zMCAoX19wdHIpLCBfX3NpemUsIF9fbiwgX19zdHJlYW0pOworCisgICAgICBpZiAoX19zaXplICogX19uID4gX19ib3MwIChfX3B0cikpCisJcmV0dXJuIF9fZnJlYWRfY2hrX3dhcm4gKF9fcHRyLCBfX2JvczAgKF9fcHRyKSwgX19zaXplLCBfX24sIF9fc3RyZWFtKTsKKyAgICB9CisgIHJldHVybiBfX2ZyZWFkX2FsaWFzIChfX3B0ciwgX19zaXplLCBfX24sIF9fc3RyZWFtKTsKK30KKworI2lmZGVmIF9fVVNFX0dOVQorZXh0ZXJuIGNoYXIgKl9fZmdldHNfdW5sb2NrZWRfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwKKwkJCQkgICBpbnQgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUIChfX2ZnZXRzX3VubG9ja2VkX2FsaWFzLAorCQkJIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwKKwkJCSAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIGZnZXRzX3VubG9ja2VkKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUIChfX2ZnZXRzX3VubG9ja2VkX2Noa193YXJuLAorCQkJIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIF9fZmdldHNfdW5sb2NrZWRfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZmdldHNfdW5sb2NrZWQgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgdGhhbiBsZW5ndGggIgorCQkgICAgICAgIm9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGNoYXIgKgorZmdldHNfdW5sb2NrZWQgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSB8fCBfX24gPD0gMCkKKwlyZXR1cm4gX19mZ2V0c191bmxvY2tlZF9jaGsgKF9fcywgX19ib3MgKF9fcyksIF9fbiwgX19zdHJlYW0pOworCisgICAgICBpZiAoKHNpemVfdCkgX19uID4gX19ib3MgKF9fcykpCisJcmV0dXJuIF9fZmdldHNfdW5sb2NrZWRfY2hrX3dhcm4gKF9fcywgX19ib3MgKF9fcyksIF9fbiwgX19zdHJlYW0pOworICAgIH0KKyAgcmV0dXJuIF9fZmdldHNfdW5sb2NrZWRfYWxpYXMgKF9fcywgX19uLCBfX3N0cmVhbSk7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX01JU0MKKyMgdW5kZWYgZnJlYWRfdW5sb2NrZWQKK2V4dGVybiBzaXplX3QgX19mcmVhZF91bmxvY2tlZF9jaGsgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3B0cmxlbiwKKwkJCQkgICAgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwKKwkJCQkgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1QgKF9fZnJlYWRfdW5sb2NrZWRfYWxpYXMsCisJCQkgICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXplLAorCQkJICAgc2l6ZV90IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksCisJCQkgIGZyZWFkX3VubG9ja2VkKSBfX3d1cjsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVCAoX19mcmVhZF91bmxvY2tlZF9jaGtfd2FybiwKKwkJCSAgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3B0cmxlbiwKKwkJCSAgIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX24sCisJCQkgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwKKwkJCSAgX19mcmVhZF91bmxvY2tlZF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJmcmVhZF91bmxvY2tlZCBjYWxsZWQgd2l0aCBiaWdnZXIgc2l6ZSAqIG5tZW1iIHRoYW4gIgorCQkgICAgICAgImxlbmd0aCBvZiBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBzaXplX3QKK2ZyZWFkX3VubG9ja2VkICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXplLCBzaXplX3QgX19uLAorCQlGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MwIChfX3B0cikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zaXplKQorCSAgfHwgIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pCisJICB8fCAoX19zaXplIHwgX19uKSA+PSAoKChzaXplX3QpIDEpIDw8ICg4ICogc2l6ZW9mIChzaXplX3QpIC8gMikpKQorCXJldHVybiBfX2ZyZWFkX3VubG9ja2VkX2NoayAoX19wdHIsIF9fYm9zMCAoX19wdHIpLCBfX3NpemUsIF9fbiwKKwkJCQkgICAgIF9fc3RyZWFtKTsKKworICAgICAgaWYgKF9fc2l6ZSAqIF9fbiA+IF9fYm9zMCAoX19wdHIpKQorCXJldHVybiBfX2ZyZWFkX3VubG9ja2VkX2Noa193YXJuIChfX3B0ciwgX19ib3MwIChfX3B0ciksIF9fc2l6ZSwgX19uLAorCQkJCQkgIF9fc3RyZWFtKTsKKyAgICB9CisKKyMgaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX3NpemUpCisgICAgICAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKQorICAgICAgJiYgKF9fc2l6ZSB8IF9fbikgPCAoKChzaXplX3QpIDEpIDw8ICg4ICogc2l6ZW9mIChzaXplX3QpIC8gMikpCisgICAgICAmJiBfX3NpemUgKiBfX24gPD0gOCkKKyAgICB7CisgICAgICBzaXplX3QgX19jbnQgPSBfX3NpemUgKiBfX247CisgICAgICBjaGFyICpfX2NwdHIgPSAoY2hhciAqKSBfX3B0cjsKKyAgICAgIGlmIChfX2NudCA9PSAwKQorCXJldHVybiAwOworCisgICAgICBmb3IgKDsgX19jbnQgPiAwOyAtLV9fY250KQorCXsKKwkgIGludCBfX2MgPSBfSU9fZ2V0Y191bmxvY2tlZCAoX19zdHJlYW0pOworCSAgaWYgKF9fYyA9PSBFT0YpCisJICAgIGJyZWFrOworCSAgKl9fY3B0cisrID0gX19jOworCX0KKyAgICAgIHJldHVybiAoX19jcHRyIC0gKGNoYXIgKikgX19wdHIpIC8gX19zaXplOworICAgIH0KKyMgZW5kaWYKKyAgcmV0dXJuIF9fZnJlYWRfdW5sb2NrZWRfYWxpYXMgKF9fcHRyLCBfX3NpemUsIF9fbiwgX19zdHJlYW0pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGRpb19saW0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGlvX2xpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZWY2YjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGRpb19saW0uaApAQCAtMCwwICsxLDQzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfU1RESU9fSCAmJiAhZGVmaW5lZCBfX25lZWRfRk9QRU5fTUFYICYmICFkZWZpbmVkIF9fbmVlZF9JT1ZfTUFYCisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0ZGlvX2xpbS5oPiBkaXJlY3RseTsgdXNlIDxzdGRpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZkZWYgX1NURElPX0gKKyMgZGVmaW5lIExfdG1wbmFtIDIwCisjIGRlZmluZSBUTVBfTUFYIDIzODMyOAorIyBkZWZpbmUgRklMRU5BTUVfTUFYIDQwOTYKKworIyBpZmRlZiBfX1VTRV9QT1NJWAorIyAgZGVmaW5lIExfY3Rlcm1pZCA5CisjICBpZiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLIHx8IGRlZmluZWQgX19VU0VfR05VCisjICAgZGVmaW5lIExfY3VzZXJpZCA5CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fbmVlZF9GT1BFTl9NQVggfHwgZGVmaW5lZCBfU1RESU9fSAorIyB1bmRlZiAgRk9QRU5fTUFYCisjIGRlZmluZSBGT1BFTl9NQVggMTYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX25lZWRfSU9WX01BWCAmJiAhZGVmaW5lZCBJT1ZfTUFYCisjIGRlZmluZSBJT1ZfTUFYIDEwMjQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RkbGliLWxkYmwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGxpYi1sZGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4ZTFmNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGxpYi1sZGJsLmgKQEAgLTAsMCArMSw0MiBAQAorLyogLW1sb25nLWRvdWJsZS02NCBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIDxzdGRsaWIuaD4gZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVERMSUJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGRsaWItbGRibC5oPiBkaXJlY3RseTsgdXNlIDxzdGRsaWIuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmZGVmCV9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CitfX0xEQkxfUkVESVIxX0RFQ0wgKHN0cnRvbGQsIHN0cnRvZCkKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCitfX0xEQkxfUkVESVIxX0RFQ0wgKHN0cnRvbGRfbCwgc3RydG9kX2wpCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisjIGlmZGVmIF9fVVNFX01JU0MKK19fTERCTF9SRURJUjFfREVDTCAocWVjdnQsIGVjdnQpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHFmY3Z0LCBmY3Z0KQorX19MREJMX1JFRElSMV9ERUNMIChxZ2N2dCwgZ2N2dCkKK19fTERCTF9SRURJUjFfREVDTCAocWVjdnRfciwgZWN2dF9yKQorX19MREJMX1JFRElSMV9ERUNMIChxZmN2dF9yLCBmY3Z0X3IpCisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGxpYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RkbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhZjVlNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGxpYi5oCkBAIC0wLDAgKzEsMTU2IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHN0ZGxpYiBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NURExJQl9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0ZGxpYi5oPiBkaXJlY3RseTsgdXNlIDxzdGRsaWIuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworZXh0ZXJuIGNoYXIgKl9fcmVhbHBhdGhfY2hrIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkJICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQsCisJCQkgICAgIHNpemVfdCBfX3Jlc29sdmVkbGVuKSBfX1RIUk9XIF9fd3VyOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1RfTlRIIChfX3JlYWxwYXRoX2FsaWFzLAorCQkJICAgICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJCSAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19yZXNvbHZlZCksIHJlYWxwYXRoKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUX05USCAoX19yZWFscGF0aF9jaGtfd2FybiwKKwkJCSAgICAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCQkgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQsCisJCQkgICAgICBzaXplX3QgX19yZXNvbHZlZGxlbiksIF9fcmVhbHBhdGhfY2hrKSBfX3d1cgorICAgICBfX3dhcm5hdHRyICgic2Vjb25kIGFyZ3VtZW50IG9mIHJlYWxwYXRoIG11c3QgYmUgZWl0aGVyIE5VTEwgb3IgYXQgIgorCQkgImxlYXN0IFBBVEhfTUFYIGJ5dGVzIGxvbmcgYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgY2hhciAqCitfX05USCAocmVhbHBhdGggKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsIGNoYXIgKl9fcmVzdHJpY3QgX19yZXNvbHZlZCkpCit7CisgIGlmIChfX2JvcyAoX19yZXNvbHZlZCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworI2lmIGRlZmluZWQgX0xJQkNfTElNSVRTX0hfICYmIGRlZmluZWQgUEFUSF9NQVgKKyAgICAgIGlmIChfX2JvcyAoX19yZXNvbHZlZCkgPCBQQVRIX01BWCkKKwlyZXR1cm4gX19yZWFscGF0aF9jaGtfd2FybiAoX19uYW1lLCBfX3Jlc29sdmVkLCBfX2JvcyAoX19yZXNvbHZlZCkpOworI2VuZGlmCisgICAgICByZXR1cm4gX19yZWFscGF0aF9jaGsgKF9fbmFtZSwgX19yZXNvbHZlZCwgX19ib3MgKF9fcmVzb2x2ZWQpKTsKKyAgICB9CisKKyAgcmV0dXJuIF9fcmVhbHBhdGhfYWxpYXMgKF9fbmFtZSwgX19yZXNvbHZlZCk7Cit9CisKKworZXh0ZXJuIGludCBfX3B0c25hbWVfcl9jaGsgKGludCBfX2ZkLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgIHNpemVfdCBfX25yZWFsKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fcHRzbmFtZV9yX2FsaWFzLCAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLAorCQkJCQkgICAgICAgc2l6ZV90IF9fYnVmbGVuKSwgcHRzbmFtZV9yKQorICAgICBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3B0c25hbWVfcl9jaGtfd2FybiwKKwkJCSAgIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBzaXplX3QgX19ucmVhbCksIF9fcHRzbmFtZV9yX2NoaykKKyAgICAgX19ub25udWxsICgoMikpIF9fd2FybmF0dHIgKCJwdHNuYW1lX3IgY2FsbGVkIHdpdGggYnVmbGVuIGJpZ2dlciB0aGFuICIKKwkJCQkgInNpemUgb2YgYnVmIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAocHRzbmFtZV9yIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbikpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fYnVmbGVuKSkKKwlyZXR1cm4gX19wdHNuYW1lX3JfY2hrIChfX2ZkLCBfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworICAgICAgaWYgKF9fYnVmbGVuID4gX19ib3MgKF9fYnVmKSkKKwlyZXR1cm4gX19wdHNuYW1lX3JfY2hrX3dhcm4gKF9fZmQsIF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19wdHNuYW1lX3JfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX2J1Zmxlbik7Cit9CisKKworZXh0ZXJuIGludCBfX3djdG9tYl9jaGsgKGNoYXIgKl9fcywgd2NoYXJfdCBfX3djaGFyLCBzaXplX3QgX19idWZsZW4pCisgIF9fVEhST1cgX193dXI7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3djdG9tYl9hbGlhcywgKGNoYXIgKl9fcywgd2NoYXJfdCBfX3djaGFyKSwKKwkJCSAgIHdjdG9tYikgX193dXI7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgaW50CitfX05USCAod2N0b21iIChjaGFyICpfX3MsIHdjaGFyX3QgX193Y2hhcikpCit7CisgIC8qIFdlIHdvdWxkIGhhdmUgdG8gaW5jbHVkZSA8bGltaXRzLmg+IHRvIGdldCBhIGRlZmluaXRpb24gb2YgTUJfTEVOX01BWC4KKyAgICAgQnV0IHRoaXMgd291bGQgb25seSBkaXN0dXJiIHRoZSBuYW1lc3BhY2UuICBTbyB3ZSBkZWZpbmUgb3VyIG93bgorICAgICB2ZXJzaW9uIGhlcmUuICAqLworI2RlZmluZSBfX1NURExJQl9NQl9MRU5fTUFYCTE2CisjaWYgZGVmaW5lZCBNQl9MRU5fTUFYICYmIE1CX0xFTl9NQVggIT0gX19TVERMSUJfTUJfTEVOX01BWAorIyBlcnJvciAiQXNzdW1lZCB2YWx1ZSBvZiBNQl9MRU5fTUFYIHdyb25nIgorI2VuZGlmCisgIGlmIChfX2JvcyAoX19zKSAhPSAoc2l6ZV90KSAtMSAmJiBfX1NURExJQl9NQl9MRU5fTUFYID4gX19ib3MgKF9fcykpCisgICAgcmV0dXJuIF9fd2N0b21iX2NoayAoX19zLCBfX3djaGFyLCBfX2JvcyAoX19zKSk7CisgIHJldHVybiBfX3djdG9tYl9hbGlhcyAoX19zLCBfX3djaGFyKTsKK30KKworCitleHRlcm4gc2l6ZV90IF9fbWJzdG93Y3NfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgc2l6ZV90IF9fbGVuLCBzaXplX3QgX19kc3RsZW4pIF9fVEhST1c7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX21ic3Rvd2NzX2FsaWFzLAorCQkJICAgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiksIG1ic3Rvd2NzKTsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fbWJzdG93Y3NfY2hrX3dhcm4sCisJCQkgICAgICAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBzaXplX3QgX19kc3RsZW4pLCBfX21ic3Rvd2NzX2NoaykKKyAgICAgX193YXJuYXR0ciAoIm1ic3Rvd2NzIGNhbGxlZCB3aXRoIGRzdCBidWZmZXIgc21hbGxlciB0aGFuIGxlbiAiCisJCSAiKiBzaXplb2YgKHdjaGFyX3QpIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc2l6ZV90CitfX05USCAobWJzdG93Y3MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJIHNpemVfdCBfX2xlbikpCit7CisgIGlmIChfX2JvcyAoX19kc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX19tYnN0b3djc19jaGsgKF9fZHN0LCBfX3NyYywgX19sZW4sCisJCQkgICAgICAgX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworCisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX19tYnN0b3djc19jaGtfd2FybiAoX19kc3QsIF9fc3JjLCBfX2xlbiwKKwkJCQkgICAgIF9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICB9CisgIHJldHVybiBfX21ic3Rvd2NzX2FsaWFzIChfX2RzdCwgX19zcmMsIF9fbGVuKTsKK30KKworCitleHRlcm4gc2l6ZV90IF9fd2NzdG9tYnNfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgc2l6ZV90IF9fbGVuLCBzaXplX3QgX19kc3RsZW4pIF9fVEhST1c7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djc3RvbWJzX2FsaWFzLAorCQkJICAgICAgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiksIHdjc3RvbWJzKTsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fd2NzdG9tYnNfY2hrX3dhcm4sCisJCQkgICAgICAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBzaXplX3QgX19kc3RsZW4pLCBfX3djc3RvbWJzX2NoaykKKyAgICAgX193YXJuYXR0ciAoIndjc3RvbWJzIGNhbGxlZCB3aXRoIGRzdCBidWZmZXIgc21hbGxlciB0aGFuIGxlbiIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNpemVfdAorX19OVEggKHdjc3RvbWJzIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCSBzaXplX3QgX19sZW4pKQoreworICBpZiAoX19ib3MgKF9fZHN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fd2NzdG9tYnNfY2hrIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX2JvcyAoX19kc3QpKTsKKyAgICAgIGlmIChfX2xlbiA+IF9fYm9zIChfX2RzdCkpCisJcmV0dXJuIF9fd2NzdG9tYnNfY2hrX3dhcm4gKF9fZHN0LCBfX3NyYywgX19sZW4sIF9fYm9zIChfX2RzdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd2NzdG9tYnNfYWxpYXMgKF9fZHN0LCBfX3NyYywgX19sZW4pOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RyaW5nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDhjZTc4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RyaW5nLmgKQEAgLTAsMCArMSwyNiBAQAorLyogT3B0aW1pemVkLCBpbmxpbmVkIHN0cmluZyBmdW5jdGlvbnMuICBBTUQgeDg2LTY0IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NUUklOR19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvc3RyaW5nLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzdHJpbmcuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogQ3VycmVudGx5IHRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIHRlbGwgdGhlIGdlbmVyaWMgaW5saW5lCisgICBtYWNyb3MgdGhhdCB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBpcyBwb3NzaWJsZSBmb3IgeDg2LTY0LiAgKi8KKyNkZWZpbmUgX1NUUklOR19BUkNIX3VuYWxpZ25lZAkxCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdHJpbmcyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdHJpbmcyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5OGFjZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0cmluZzIuaApAQCAtMCwwICsxLDEzNTQgQEAKKy8qIE1hY2hpbmUtaW5kZXBlbmRhbnQgc3RyaW5nIGZ1bmN0aW9uIG9wdGltaXphdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMywgMjAwNCwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTcuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVFJJTkdfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3N0cmluZzIuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN0cmluZy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgX19OT19TVFJJTkdfSU5MSU5FUyAmJiAhZGVmaW5lZCBfX0JPVU5ERURfUE9JTlRFUlNfXworCisvKiBVbmxpa2UgdGhlIGRlZmluaXRpb25zIGluIHRoZSBoZWFkZXIgPGJpdHMvc3RyaW5nLmg+IHRoZQorICAgZGVmaW5pdGlvbnMgY29udGFpbmVkIGhlcmUgYXJlIG5vdCBvcHRpbWl6ZWQgZG93biB0byBhc3NlbWJsZXIKKyAgIGxldmVsLiAgVGhvc2Ugb3B0aW1pemF0aW9ucyBhcmUgbm90IGFsd2F5cyBhIGdvb2QgaWRlYSBzaW5jZSB0aGlzCisgICBtZWFucyB0aGUgY29kZSBzaXplIGluY3JlYXNlcyBhIGxvdC4gIEluc3RlYWQgdGhlIGRlZmluaXRpb25zIGhlcmUKKyAgIG9wdGltaXplIHNvbWUgZnVuY3Rpb25zIGluIGEgd2F5IHdoaWNoIGRvIG5vdCBkcmFtYXRpY2FsbHkKKyAgIGluY3JlYXNlIHRoZSBjb2RlIHNpemUgYW5kIHdoaWNoIGRvIG5vdCB1c2UgYXNzZW1ibGVyLiAgVGhlIG1haW4KKyAgIHRyaWNrIGlzIHRvIHVzZSBHQ0MncyBgX19idWlsdGluX2NvbnN0YW50X3AnIGZ1bmN0aW9uLgorCisgICBFdmVyeSBmdW5jdGlvbiBYWFggd2hpY2ggaGFzIGEgZGVmaW5lZCB2ZXJzaW9uIGluCisgICA8Yml0cy9zdHJpbmcuaD4gbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIHN5bWJvbCBfSEFWRV9TVFJJTkdfQVJDSF9YWFgKKyAgIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgcmVkZWZpbml0aW9ucy4KKworICAgV2UgbXVzdCB1c2UgaGVyZSBtYWNyb3MgaW5zdGVhZCBvZiBpbmxpbmUgZnVuY3Rpb25zIHNpbmNlIHRoZQorICAgdHJpY2sgd29uJ3Qgd29yayB3aXRoIHRoZSBsYXR0ZXIuICAqLworCisjaWZuZGVmIF9fU1RSSU5HX0lOTElORQorIyBpZmRlZiBfX2NwbHVzcGx1cworIyAgZGVmaW5lIF9fU1RSSU5HX0lOTElORSBpbmxpbmUKKyMgZWxzZQorIyAgZGVmaW5lIF9fU1RSSU5HX0lOTElORSBfX2V4dGVybl9pbmxpbmUKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgX1NUUklOR19BUkNIX3VuYWxpZ25lZAorLyogSWYgd2UgY2FuIGRvIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMgd2UgbXVzdCBrbm93IHRoZSBlbmRpYW5lc3MuICAqLworIyBpbmNsdWRlIDxlbmRpYW4uaD4KKyMgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgIGRlZmluZSBfX1NUUklORzJfU01BTExfR0VUMTYoc3JjLCBpZHgpIFwKKyAgICAgKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeCArIDFdIDw8IDgJICAgICAgXAorICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHhdKQorIyAgZGVmaW5lIF9fU1RSSU5HMl9TTUFMTF9HRVQzMihzcmMsIGlkeCkgXAorICAgICAoKCgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAzXSA8PCA4ICAgICAgXAorCXwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4ICsgMl0pIDw8IDggICBcCisgICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAxXSkgPDwgOCAgICBcCisgICAgICB8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeF0pCisjIGVsc2UKKyMgIGRlZmluZSBfX1NUUklORzJfU01BTExfR0VUMTYoc3JjLCBpZHgpIFwKKyAgICAgKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeF0gPDwgOAkgICAgICBcCisgICAgICB8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeCArIDFdKQorIyAgZGVmaW5lIF9fU1RSSU5HMl9TTUFMTF9HRVQzMihzcmMsIGlkeCkgXAorICAgICAoKCgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHhdIDw8IDgJICAgICAgXAorCXwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4ICsgMV0pIDw8IDggICBcCisgICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAyXSkgPDwgOCAgICBcCisgICAgICB8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeCArIDNdKQorIyBlbmRpZgorI2Vsc2UKKy8qIFRoZXNlIGFyZSBhIGZldyB0eXBlcyB3ZSBuZWVkIGZvciB0aGUgb3B0aW1pemF0aW9ucyBpZiB3ZSBjYW5ub3QKKyAgIHVzZSB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzLiAgKi8KKyMgZGVmaW5lIF9fU1RSSU5HMl9DT1BZX1RZUEUoTikgXAorICB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGNoYXIgX19hcnJbTl07IH0JCQkJICAgICAgXAorICAgIF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgX19TVFJJTkcyX0NPUFlfQVJSIyNOCitfX1NUUklORzJfQ09QWV9UWVBFICgyKTsKK19fU1RSSU5HMl9DT1BZX1RZUEUgKDMpOworX19TVFJJTkcyX0NPUFlfVFlQRSAoNCk7CitfX1NUUklORzJfQ09QWV9UWVBFICg1KTsKK19fU1RSSU5HMl9DT1BZX1RZUEUgKDYpOworX19TVFJJTkcyX0NPUFlfVFlQRSAoNyk7CitfX1NUUklORzJfQ09QWV9UWVBFICg4KTsKKyMgdW5kZWYgX19TVFJJTkcyX0NPUFlfVFlQRQorI2VuZGlmCisKKy8qIERlcmVmZXJlbmNpbmcgYSBwb2ludGVyIGFyZyB0byBydW4gc2l6ZW9mIG9uIGl0IGZhaWxzIGZvciB0aGUgdm9pZAorICAgcG9pbnRlciBjYXNlLCBzbyB3ZSB1c2UgdGhpcyBpbnN0ZWFkLgorICAgTm90ZSB0aGF0IF9feCBpcyBldmFsdWF0ZWQgdHdpY2UuICovCisjZGVmaW5lIF9fc3RyaW5nMl8xYnB0cl9wKF9feCkgXAorICAoKHNpemVfdCkoY29uc3Qgdm9pZCAqKSgoX194KSArIDEpIC0gKHNpemVfdCkoY29uc3Qgdm9pZCAqKShfX3gpID09IDEpCisKKy8qIFNldCBOIGJ5dGVzIG9mIFMgdG8gQy4gICovCisjaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfbWVtc2V0CisjIGlmICFfX0dOVUNfUFJFUkVRICgzLCAwKQorIyAgaWYgX1NUUklOR19BUkNIX3VuYWxpZ25lZAorIyAgIGRlZmluZSBtZW1zZXQocywgYywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKG4pICYmIChuKSA8PSAxNgkJCSAgICAgIFwKKwkJICA/ICgobikgPT0gMQkJCQkJCSAgICAgIFwKKwkJICAgICA/IF9fbWVtc2V0XzEgKHMsIGMpCQkJCSAgICAgIFwKKwkJICAgICA6IF9fbWVtc2V0X2djIChzLCBjLCBuKSkJCQkJICAgICAgXAorCQkgIDogKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKSAmJiAoYykgPT0gJ1wwJwkJICAgICAgXAorCQkgICAgID8gKHsgdm9pZCAqX19zID0gKHMpOyBfX2J6ZXJvIChfX3MsIG4pOyBfX3M7IH0pCSAgICAgIFwKKwkJICAgICA6IG1lbXNldCAocywgYywgbikpKSkKKworIyAgIGRlZmluZSBfX21lbXNldF8xKHMsIGMpICh7IHZvaWQgKl9fcyA9IChzKTsJCQkJICAgICAgXAorCQkJICAgICooKF9fdWludDhfdCAqKSBfX3MpID0gKF9fdWludDhfdCkgYzsgX19zOyB9KQorCisjICAgZGVmaW5lIF9fbWVtc2V0X2djKHMsIGMsIG4pIFwKKyAgKHsgdm9pZCAqX19zID0gKHMpOwkJCQkJCQkgICAgICBcCisgICAgIHVuaW9uIHsJCQkJCQkJCSAgICAgIFwKKyAgICAgICB1bnNpZ25lZCBpbnQgX191aTsJCQkJCQkgICAgICBcCisgICAgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdXNpOwkJCQkJICAgICAgXAorICAgICAgIHVuc2lnbmVkIGNoYXIgX191YzsJCQkJCQkgICAgICBcCisgICAgIH0gKl9fdSA9IF9fczsJCQkJCQkJICAgICAgXAorICAgICBfX3VpbnQ4X3QgX19jID0gKF9fdWludDhfdCkgKGMpOwkJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorICAgICAvKiBUaGlzIGBzd2l0Y2gnIHN0YXRlbWVudCB3aWxsIGJlIHJlbW92ZWQgYXQgY29tcGlsZS10aW1lLiAgKi8JICAgICAgXAorICAgICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIChuKSkJCQkJCSAgICAgIFwKKyAgICAgICB7CQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxNToJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMTE6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDc6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDM6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191c2kgPSAodW5zaWduZWQgc2hvcnQgaW50KSBfX2MgKiAweDAxMDE7CQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOwkJCSAgICAgIFwKKwkgX191LT5fX3VjID0gKHVuc2lnbmVkIGNoYXIpIF9fYzsJCQkJICAgICAgXAorCSBicmVhazsJCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgICBjYXNlIDE0OgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2MgKiAweDAxMDEwMTAxOwkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSAxMDoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgNjoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMjoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VzaSA9ICh1bnNpZ25lZCBzaG9ydCBpbnQpIF9fYyAqIDB4MDEwMTsJCSAgICAgIFwKKwkgYnJlYWs7CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxMzoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgOToJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgNToJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMToJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VjID0gKHVuc2lnbmVkIGNoYXIpIF9fYzsJCQkJICAgICAgXAorCSBicmVhazsJCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgICBjYXNlIDE2OgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2MgKiAweDAxMDEwMTAxOwkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSAxMjoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgODoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgNDoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKyAgICAgICBjYXNlIDA6CQkJCQkJCQkgICAgICBcCisJIGJyZWFrOwkJCQkJCQkJICAgICAgXAorICAgICAgIH0JCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgX19zOyB9KQorIyAgZWxzZQorIyAgIGRlZmluZSBtZW1zZXQocywgYywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKGMpICYmIChjKSA9PSAnXDAnCQkgICAgICBcCisJCSAgPyAoeyB2b2lkICpfX3MgPSAocyk7IF9fYnplcm8gKF9fcywgbik7IF9fczsgfSkJICAgICAgXAorCQkgIDogbWVtc2V0IChzLCBjLCBuKSkpCisjICBlbmRpZgorIyBlbmRpZgorCisvKiBHQ0MgPCAzLjAgb3B0aW1pemVzIG1lbXNldChzLCAwLCBuKSBidXQgbm90IGJ6ZXJvKHMsIG4pLgorICAgVGhlIG9wdGltaXphdGlvbiBpcyBicm9rZW4gYmVmb3JlIEVHQ1MgMS4xLgorICAgR0NDIDMuMCsgaGFzIF9fYnVpbHRpbl9iemVybyBhcyB3ZWxsLCBidXQgYXQgbGVhc3QgdGlsbCBHQ0MgMy40CisgICBpZiBpdCBkZWNpZGVzIHRvIGNhbGwgdGhlIGxpYnJhcnkgZnVuY3Rpb24sIGl0IGNhbGxzIG1lbXNldAorICAgYW5kIG5vdCBiemVyby4gICovCisjIGlmIF9fR05VQ19QUkVSRVEgKDIsIDkxKQorIyAgZGVmaW5lIF9fYnplcm8ocywgbikgX19idWlsdGluX21lbXNldCAocywgJ1wwJywgbikKKyMgZW5kaWYKKworI2VuZGlmCisKKworLyogQ29weSBOIGJ5dGVzIGZyb20gU1JDIHRvIERFU1QsIHJldHVybmluZyBwb2ludGVyIHRvIGJ5dGUgZm9sbG93aW5nIHRoZQorICAgbGFzdCBjb3BpZWQuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9tZW1wY3B5IHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9tZW1wY3B5CisjICAgaWYgX19HTlVDX1BSRVJFUSAoMywgNCkKKyMgICAgZGVmaW5lIF9fbWVtcGNweShkZXN0LCBzcmMsIG4pIF9fYnVpbHRpbl9tZW1wY3B5IChkZXN0LCBzcmMsIG4pCisjICAgZWxpZiBfX0dOVUNfUFJFUkVRICgzLCAwKQorIyAgICBkZWZpbmUgX19tZW1wY3B5KGRlc3QsIHNyYywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgICAgXAorCQkgICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzcmMpICYmIG4gPD0gOAkJCSAgICAgIFwKKwkJICA/IF9fYnVpbHRpbl9tZW1jcHkgKGRlc3QsIHNyYywgbikgKyAobikJCSAgICAgIFwKKwkJICA6IF9fbWVtcGNweSAoZGVzdCwgc3JjLCBuKSkpCisjICAgZWxzZQorIyAgICBkZWZpbmUgX19tZW1wY3B5KGRlc3QsIHNyYywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgICAgXAorCQkgICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzcmMpICYmIG4gPD0gOAkJCSAgICAgIFwKKwkJICA/IF9fbWVtcGNweV9zbWFsbCAoZGVzdCwgX19tZW1wY3B5X2FyZ3MgKHNyYyksIG4pCSAgICAgIFwKKwkJICA6IF9fbWVtcGNweSAoZGVzdCwgc3JjLCBuKSkpCisjICAgZW5kaWYKKy8qIEluIGdsaWJjIHdlIHVzZSB0aGlzIGZ1bmN0aW9uIGZyZXF1ZW50bHkgYnV0IGZvciBuYW1lc3BhY2UgcmVhc29ucworICAgd2UgaGF2ZSB0byB1c2UgdGhlIG5hbWUgYF9fbWVtcGNweScuICAqLworIyAgIGRlZmluZSBtZW1wY3B5KGRlc3QsIHNyYywgbikgX19tZW1wY3B5IChkZXN0LCBzcmMsIG4pCisjICBlbmRpZgorCisjICBpZiAhX19HTlVDX1BSRVJFUSAoMywgMCkgfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyAgIGlmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKyMgICAgaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjICAgICBkZWZpbmUgX19tZW1wY3B5X2FyZ3Moc3JjKSBcCisgICAgICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLAkJICAgICAgXAorICAgICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs2XSwJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMTYgKHNyYywgMCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQxNiAoc3JjLCA0KSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDMyIChzcmMsIDApLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMzIgKHNyYywgNCkKKyMgICAgZW5kaWYKK19fU1RSSU5HX0lOTElORSB2b2lkICpfX21lbXBjcHlfc21hbGwgKHZvaWQgKiwgY2hhciwgY2hhciwgY2hhciwgY2hhciwKKwkJCQkgICAgICAgX191aW50MTZfdCwgX191aW50MTZfdCwgX191aW50MzJfdCwKKwkJCQkgICAgICAgX191aW50MzJfdCwgc2l6ZV90KTsKK19fU1RSSU5HX0lOTElORSB2b2lkICoKK19fbWVtcGNweV9zbWFsbCAodm9pZCAqX19kZXN0MSwKKwkJIGNoYXIgX19zcmMwXzEsIGNoYXIgX19zcmMyXzEsIGNoYXIgX19zcmM0XzEsIGNoYXIgX19zcmM2XzEsCisJCSBfX3VpbnQxNl90IF9fc3JjMF8yLCBfX3VpbnQxNl90IF9fc3JjNF8yLAorCQkgX191aW50MzJfdCBfX3NyYzBfNCwgX191aW50MzJfdCBfX3NyYzRfNCwKKwkJIHNpemVfdCBfX3NyY2xlbikKK3sKKyAgdW5pb24geworICAgIF9fdWludDMyX3QgX191aTsKKyAgICBfX3VpbnQxNl90IF9fdXNpOworICAgIHVuc2lnbmVkIGNoYXIgX191YzsKKyAgICB1bnNpZ25lZCBjaGFyIF9fYzsKKyAgfSAqX191ID0gX19kZXN0MTsKKyAgc3dpdGNoICgodW5zaWduZWQgaW50KSBfX3NyY2xlbikKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgX191LT5fX2MgPSBfX3NyYzBfMTsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgX191LT5fX3VzaSA9IF9fc3JjMF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBfX3UtPl9fdXNpID0gX19zcmMwXzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsKKyAgICAgIF9fdS0+X19jID0gX19zcmMyXzE7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX2MgPSBfX3NyYzRfMTsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzRfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzRfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgX191LT5fX2MgPSBfX3NyYzZfMTsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjNF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAodm9pZCAqKSBfX3U7Cit9CisjICAgZWxzZQorIyAgICBpZm5kZWYgX0ZPUkNFX0lOTElORVMKKyMgICAgIGRlZmluZSBfX21lbXBjcHlfYXJncyhzcmMpIFwKKyAgICAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLAkJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSMikJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdIH0gfSksICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSMykJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0gfSB9KSwJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNCkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSB9IH0pLCAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjUpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs0XSB9IH0pLAkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI2KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSB9IH0pLCAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjcpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs0XSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzVdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNl0gfSB9KSwJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSOCkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs2XSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzddIH0gfSkKKyMgICAgZW5kaWYKK19fU1RSSU5HX0lOTElORSB2b2lkICpfX21lbXBjcHlfc21hbGwgKHZvaWQgKiwgY2hhciwgX19TVFJJTkcyX0NPUFlfQVJSMiwKKwkJCQkgICAgICAgX19TVFJJTkcyX0NPUFlfQVJSMywKKwkJCQkgICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNCwKKwkJCQkgICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNSwKKwkJCQkgICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNiwKKwkJCQkgICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNywKKwkJCQkgICAgICAgX19TVFJJTkcyX0NPUFlfQVJSOCwgc2l6ZV90KTsKK19fU1RSSU5HX0lOTElORSB2b2lkICoKK19fbWVtcGNweV9zbWFsbCAodm9pZCAqX19kZXN0LCBjaGFyIF9fc3JjMSwKKwkJIF9fU1RSSU5HMl9DT1BZX0FSUjIgX19zcmMyLCBfX1NUUklORzJfQ09QWV9BUlIzIF9fc3JjMywKKwkJIF9fU1RSSU5HMl9DT1BZX0FSUjQgX19zcmM0LCBfX1NUUklORzJfQ09QWV9BUlI1IF9fc3JjNSwKKwkJIF9fU1RSSU5HMl9DT1BZX0FSUjYgX19zcmM2LCBfX1NUUklORzJfQ09QWV9BUlI3IF9fc3JjNywKKwkJIF9fU1RSSU5HMl9DT1BZX0FSUjggX19zcmM4LCBzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIF9fYzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIyIF9fc2NhMjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIzIF9fc2NhMzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI0IF9fc2NhNDsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI1IF9fc2NhNTsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI2IF9fc2NhNjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI3IF9fc2NhNzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI4IF9fc2NhODsKKyAgfSAqX191ID0gX19kZXN0OworICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIF9fc3JjbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBfX3UtPl9fYyA9IF9fc3JjMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTIgPSBfX3NyYzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EzID0gX19zcmMzOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNCA9IF9fc3JjNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTUgPSBfX3NyYzU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E2ID0gX19zcmM2OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNyA9IF9fc3JjNzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTggPSBfX3NyYzg7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyBfX3NyY2xlbik7Cit9CisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworCisvKiBSZXR1cm4gcG9pbnRlciB0byBDIGluIFMuICAqLworI2lmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjaHIKK2V4dGVybiB2b2lkICpfX3Jhd21lbWNociAoY29uc3Qgdm9pZCAqX19zLCBpbnQgX19jKTsKKyMgaWYgX19HTlVDX1BSRVJFUSAoMywgMikKKyMgIGRlZmluZSBzdHJjaHIocywgYykgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKGMpICYmICFfX2J1aWx0aW5fY29uc3RhbnRfcCAocykJICAgICAgXAorCQkgICYmIChjKSA9PSAnXDAnCQkJCQkgICAgICBcCisJCSAgPyAoY2hhciAqKSBfX3Jhd21lbWNociAocywgYykJCQkJICAgICAgXAorCQkgIDogX19idWlsdGluX3N0cmNociAocywgYykpKQorIyBlbHNlCisjICBkZWZpbmUgc3RyY2hyKHMsIGMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKSAmJiAoYykgPT0gJ1wwJwkJICAgICAgXAorCQkgID8gKGNoYXIgKikgX19yYXdtZW1jaHIgKHMsIGMpCQkJCSAgICAgIFwKKwkJICA6IHN0cmNociAocywgYykpKQorIyBlbmRpZgorI2VuZGlmCisKKworLyogQ29weSBTUkMgdG8gREVTVC4gICovCisjaWYgKCFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cmNweSAmJiAhX19HTlVDX1BSRVJFUSAoMywgMCkpIFwKKyAgICB8fCBkZWZpbmVkIF9GT1JDRV9JTkxJTkVTCisjIGlmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cmNweSAmJiAhX19HTlVDX1BSRVJFUSAoMywgMCkKKyMgIGRlZmluZSBzdHJjcHkoZGVzdCwgc3JjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKQkJCQkgICAgICBcCisJCSAgPyAoX19zdHJpbmcyXzFicHRyX3AgKHNyYykgJiYgc3RybGVuIChzcmMpICsgMSA8PSA4CSAgICAgIFwKKwkJICAgICA/IF9fc3RyY3B5X3NtYWxsIChkZXN0LCBfX3N0cmNweV9hcmdzIChzcmMpLAkgICAgICBcCisJCQkJICAgICAgIHN0cmxlbiAoc3JjKSArIDEpCQkgICAgICBcCisJCSAgICAgOiAoY2hhciAqKSBtZW1jcHkgKGRlc3QsIHNyYywgc3RybGVuIChzcmMpICsgMSkpCSAgICAgIFwKKwkJICA6IHN0cmNweSAoZGVzdCwgc3JjKSkpCisjIGVuZGlmCisKKyMgaWYgX1NUUklOR19BUkNIX3VuYWxpZ25lZAorIyAgaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjICAgZGVmaW5lIF9fc3RyY3B5X2FyZ3Moc3JjKSBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDE2IChzcmMsIDApLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMTYgKHNyYywgNCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQzMiAoc3JjLCAwKSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDMyIChzcmMsIDQpCisjICBlbmRpZgorX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RyY3B5X3NtYWxsIChjaGFyICosIF9fdWludDE2X3QsIF9fdWludDE2X3QsCisJCQkJICAgICAgX191aW50MzJfdCwgX191aW50MzJfdCwgc2l6ZV90KTsKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RyY3B5X3NtYWxsIChjaGFyICpfX2Rlc3QsCisJCV9fdWludDE2X3QgX19zcmMwXzIsIF9fdWludDE2X3QgX19zcmM0XzIsCisJCV9fdWludDMyX3QgX19zcmMwXzQsIF9fdWludDMyX3QgX19zcmM0XzQsCisJCXNpemVfdCBfX3NyY2xlbikKK3sKKyAgdW5pb24geworICAgIF9fdWludDMyX3QgX191aTsKKyAgICBfX3VpbnQxNl90IF9fdXNpOworICAgIHVuc2lnbmVkIGNoYXIgX191YzsKKyAgfSAqX191ID0gKHZvaWQgKikgX19kZXN0OworICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIF9fc3JjbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBfX3UtPl9fdWMgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgX191LT5fX3VzaSA9IF9fc3JjMF8yOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX191LT5fX3VzaSA9IF9fc3JjMF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CisgICAgICBfX3UtPl9fdWMgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdXNpID0gX19zcmM0XzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VzaSA9IF9fc3JjNF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CisgICAgICBfX3UtPl9fdWMgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjNF80OworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gX19kZXN0OworfQorIyBlbHNlCisjICBpZm5kZWYgX0ZPUkNFX0lOTElORVMKKyMgICBkZWZpbmUgX19zdHJjcHlfYXJncyhzcmMpIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjIpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICdcMCcgfSB9KSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlIzKQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICdcMCcgfSB9KSwJCQkJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNCkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICdcMCcgfSB9KSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI1KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAnXDAnIH0gfSksCQkJCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjYpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs0XSwgJ1wwJyB9IH0pLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjcpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs0XSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzVdLAkgICAgICBcCisJICAnXDAnIH0gfSksCQkJCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjgpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs0XSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzVdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNl0sICdcMCcgfSB9KQorIyAgZW5kaWYKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cmNweV9zbWFsbCAoY2hhciAqLCBfX1NUUklORzJfQ09QWV9BUlIyLAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjMsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNCwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI1LAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjYsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNywKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI4LCBzaXplX3QpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJjcHlfc21hbGwgKGNoYXIgKl9fZGVzdCwKKwkJX19TVFJJTkcyX0NPUFlfQVJSMiBfX3NyYzIsIF9fU1RSSU5HMl9DT1BZX0FSUjMgX19zcmMzLAorCQlfX1NUUklORzJfQ09QWV9BUlI0IF9fc3JjNCwgX19TVFJJTkcyX0NPUFlfQVJSNSBfX3NyYzUsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjYgX19zcmM2LCBfX1NUUklORzJfQ09QWV9BUlI3IF9fc3JjNywKKwkJX19TVFJJTkcyX0NPUFlfQVJSOCBfX3NyYzgsIHNpemVfdCBfX3NyY2xlbikKK3sKKyAgdW5pb24geworICAgIGNoYXIgX19jOworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjIgX19zY2EyOworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjMgX19zY2EzOworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjQgX19zY2E0OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjUgX19zY2E1OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjYgX19zY2E2OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjcgX19zY2E3OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjggX19zY2E4OworICB9ICpfX3UgPSAodm9pZCAqKSBfX2Rlc3Q7CisgIHN3aXRjaCAoKHVuc2lnbmVkIGludCkgX19zcmNsZW4pCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIF9fdS0+X19jID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTIgPSBfX3NyYzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EzID0gX19zcmMzOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNCA9IF9fc3JjNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTUgPSBfX3NyYzU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E2ID0gX19zcmM2OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNyA9IF9fc3JjNzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTggPSBfX3NyYzg7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gX19kZXN0OworfQorIyBlbmRpZgorI2VuZGlmCisKKworLyogQ29weSBTUkMgdG8gREVTVCwgcmV0dXJuaW5nIHBvaW50ZXIgdG8gZmluYWwgTlVMIGJ5dGUuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHBjcHkgfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyAgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cGNweQorIyAgIGlmIF9fR05VQ19QUkVSRVEgKDMsIDQpCisjICAgIGRlZmluZSBfX3N0cGNweShkZXN0LCBzcmMpIF9fYnVpbHRpbl9zdHBjcHkgKGRlc3QsIHNyYykKKyMgICBlbGlmIF9fR05VQ19QUkVSRVEgKDMsIDApCisjICAgIGRlZmluZSBfX3N0cGNweShkZXN0LCBzcmMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpCQkJCSAgICAgIFwKKwkJICA/IChfX3N0cmluZzJfMWJwdHJfcCAoc3JjKSAmJiBzdHJsZW4gKHNyYykgKyAxIDw9IDgJICAgICAgXAorCQkgICAgID8gX19idWlsdGluX3N0cmNweSAoZGVzdCwgc3JjKSArIHN0cmxlbiAoc3JjKQkgICAgICBcCisJCSAgICAgOiAoKGNoYXIgKikgKF9fbWVtcGNweSkgKGRlc3QsIHNyYywgc3RybGVuIChzcmMpICsgMSkgICAgXAorCQkJLSAxKSkJCQkJCQkgICAgICBcCisJCSAgOiBfX3N0cGNweSAoZGVzdCwgc3JjKSkpCisjICAgZWxzZQorIyAgICBkZWZpbmUgX19zdHBjcHkoZGVzdCwgc3JjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKQkJCQkgICAgICBcCisJCSAgPyAoX19zdHJpbmcyXzFicHRyX3AgKHNyYykgJiYgc3RybGVuIChzcmMpICsgMSA8PSA4CSAgICAgIFwKKwkJICAgICA/IF9fc3RwY3B5X3NtYWxsIChkZXN0LCBfX3N0cGNweV9hcmdzIChzcmMpLAkgICAgICBcCisJCQkJICAgICAgIHN0cmxlbiAoc3JjKSArIDEpCQkgICAgICBcCisJCSAgICAgOiAoKGNoYXIgKikgKF9fbWVtcGNweSkgKGRlc3QsIHNyYywgc3RybGVuIChzcmMpICsgMSkgICAgXAorCQkJLSAxKSkJCQkJCQkgICAgICBcCisJCSAgOiBfX3N0cGNweSAoZGVzdCwgc3JjKSkpCisjICAgZW5kaWYKKy8qIEluIGdsaWJjIHdlIHVzZSB0aGlzIGZ1bmN0aW9uIGZyZXF1ZW50bHkgYnV0IGZvciBuYW1lc3BhY2UgcmVhc29ucworICAgd2UgaGF2ZSB0byB1c2UgdGhlIG5hbWUgYF9fc3RwY3B5Jy4gICovCisjICAgZGVmaW5lIHN0cGNweShkZXN0LCBzcmMpIF9fc3RwY3B5IChkZXN0LCBzcmMpCisjICBlbmRpZgorCisjICBpZiAhX19HTlVDX1BSRVJFUSAoMywgMCkgfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyAgIGlmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKyMgICAgaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjICAgICBkZWZpbmUgX19zdHBjcHlfYXJncyhzcmMpIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMTYgKHNyYywgMCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQxNiAoc3JjLCA0KSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDMyIChzcmMsIDApLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMzIgKHNyYywgNCkKKyMgICAgZW5kaWYKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cGNweV9zbWFsbCAoY2hhciAqLCBfX3VpbnQxNl90LCBfX3VpbnQxNl90LAorCQkJCSAgICAgIF9fdWludDMyX3QsIF9fdWludDMyX3QsIHNpemVfdCk7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cGNweV9zbWFsbCAoY2hhciAqX19kZXN0LAorCQlfX3VpbnQxNl90IF9fc3JjMF8yLCBfX3VpbnQxNl90IF9fc3JjNF8yLAorCQlfX3VpbnQzMl90IF9fc3JjMF80LCBfX3VpbnQzMl90IF9fc3JjNF80LAorCQlzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICB1bnNpZ25lZCBpbnQgX191aTsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX191c2k7CisgICAgdW5zaWduZWQgY2hhciBfX3VjOworICAgIGNoYXIgX19jOworICB9ICpfX3UgPSAodm9pZCAqKSBfX2Rlc3Q7CisgIHN3aXRjaCAoKHVuc2lnbmVkIGludCkgX19zcmNsZW4pCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIF9fdS0+X191YyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBfX3UtPl9fdXNpID0gX19zcmMwXzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzBfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdXNpID0gX19zcmM0XzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdXNpID0gX19zcmM0XzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsKKyAgICAgIF9fdS0+X191YyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VpID0gX19zcmM0XzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuICZfX3UtPl9fYzsKK30KKyMgICBlbHNlCisjICAgIGlmbmRlZiBfRk9SQ0VfSU5MSU5FUworIyAgICAgZGVmaW5lIF9fc3RwY3B5X2FyZ3Moc3JjKSBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlIyKQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAnXDAnIH0gfSksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSMykJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAnXDAnIH0gfSksCQkJCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjQpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAnXDAnIH0gfSksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNSkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgJ1wwJyB9IH0pLAkJCQkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI2KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICdcMCcgfSB9KSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI3KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSwJICAgICAgXAorCSAgJ1wwJyB9IH0pLAkJCQkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI4KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzZdLCAnXDAnIH0gfSkKKyMgICAgZW5kaWYKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cGNweV9zbWFsbCAoY2hhciAqLCBfX1NUUklORzJfQ09QWV9BUlIyLAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjMsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNCwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI1LAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjYsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNywKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI4LCBzaXplX3QpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHBjcHlfc21hbGwgKGNoYXIgKl9fZGVzdCwKKwkJX19TVFJJTkcyX0NPUFlfQVJSMiBfX3NyYzIsIF9fU1RSSU5HMl9DT1BZX0FSUjMgX19zcmMzLAorCQlfX1NUUklORzJfQ09QWV9BUlI0IF9fc3JjNCwgX19TVFJJTkcyX0NPUFlfQVJSNSBfX3NyYzUsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjYgX19zcmM2LCBfX1NUUklORzJfQ09QWV9BUlI3IF9fc3JjNywKKwkJX19TVFJJTkcyX0NPUFlfQVJSOCBfX3NyYzgsIHNpemVfdCBfX3NyY2xlbikKK3sKKyAgdW5pb24geworICAgIGNoYXIgX19jOworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjIgX19zY2EyOworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjMgX19zY2EzOworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjQgX19zY2E0OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjUgX19zY2E1OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjYgX19zY2E2OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjcgX19zY2E3OworICAgIF9fU1RSSU5HMl9DT1BZX0FSUjggX19zY2E4OworICB9ICpfX3UgPSAodm9pZCAqKSBfX2Rlc3Q7CisgIHN3aXRjaCAoKHVuc2lnbmVkIGludCkgX19zcmNsZW4pCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIF9fdS0+X19jID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTIgPSBfX3NyYzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EzID0gX19zcmMzOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNCA9IF9fc3JjNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTUgPSBfX3NyYzU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E2ID0gX19zcmM2OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNyA9IF9fc3JjNzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTggPSBfX3NyYzg7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gX19kZXN0ICsgX19zcmNsZW4gLSAxOworfQorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKworLyogQ29weSBubyBtb3JlIHRoYW4gTiBjaGFyYWN0ZXJzIG9mIFNSQyB0byBERVNULiAgKi8KKyNpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RybmNweQorIyBpZiBfX0dOVUNfUFJFUkVRICgzLCAyKQorIyAgZGVmaW5lIHN0cm5jcHkoZGVzdCwgc3JjLCBuKSBfX2J1aWx0aW5fc3RybmNweSAoZGVzdCwgc3JjLCBuKQorIyBlbHNlCisjICBkZWZpbmUgc3RybmNweShkZXN0LCBzcmMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpICYmIF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAgICAgIFwKKwkJICA/IChzdHJsZW4gKHNyYykgKyAxID49ICgoc2l6ZV90KSAobikpCQkJICAgICAgXAorCQkgICAgID8gKGNoYXIgKikgbWVtY3B5IChkZXN0LCBzcmMsIG4pCQkJICAgICAgXAorCQkgICAgIDogc3RybmNweSAoZGVzdCwgc3JjLCBuKSkJCQkJICAgICAgXAorCQkgIDogc3RybmNweSAoZGVzdCwgc3JjLCBuKSkpCisjIGVuZGlmCisjZW5kaWYKKworCisvKiBBcHBlbmQgbm8gbW9yZSB0aGFuIE4gY2hhcmFjdGVycyBmcm9tIFNSQyBvbnRvIERFU1QuICAqLworI2lmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJuY2F0CisjIGlmZGVmIF9VU0VfU1RSSU5HX0FSQ0hfc3RyY2hyCisjICBkZWZpbmUgc3RybmNhdChkZXN0LCBzcmMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgY2hhciAqX19kZXN0ID0gKGRlc3QpOwkJCQkgICAgICBcCisJCSAgICBfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgICAgXAorCQkgICAgPyAoc3RybGVuIChzcmMpIDwgKChzaXplX3QpIChuKSkJCQkgICAgICBcCisJCSAgICAgICA/IHN0cmNhdCAoX19kZXN0LCBzcmMpCQkJCSAgICAgIFwKKwkJICAgICAgIDogKCooKGNoYXIgKikgX19tZW1wY3B5IChzdHJjaHIgKF9fZGVzdCwgJ1wwJyksCSAgICAgIFwKKwkJCQkJCXNyYywgbikpID0gJ1wwJywgX19kZXN0KSkgICAgIFwKKwkJICAgIDogc3RybmNhdCAoZGVzdCwgc3JjLCBuKTsgfSkpCisjIGVsaWYgX19HTlVDX1BSRVJFUSAoMywgMikKKyMgIGRlZmluZSBzdHJuY2F0KGRlc3QsIHNyYywgbikgX19idWlsdGluX3N0cm5jYXQgKGRlc3QsIHNyYywgbikKKyMgZWxzZQorIyAgZGVmaW5lIHN0cm5jYXQoZGVzdCwgc3JjLCBuKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgICAgICBcCisJCSAgPyAoc3RybGVuIChzcmMpIDwgKChzaXplX3QpIChuKSkJCQkgICAgICBcCisJCSAgICAgPyBzdHJjYXQgKGRlc3QsIHNyYykJCQkJICAgICAgXAorCQkgICAgIDogc3RybmNhdCAoZGVzdCwgc3JjLCBuKSkJCQkJICAgICAgXAorCQkgIDogc3RybmNhdCAoZGVzdCwgc3JjLCBuKSkpCisjIGVuZGlmCisjZW5kaWYKKworCisvKiBDb21wYXJlIGNoYXJhY3RlcnMgb2YgUzEgYW5kIFMyLiAgKi8KKyNpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyY21wCisjIGlmIF9fR05VQ19QUkVSRVEgKDMsIDIpCisjICBkZWZpbmUgc3RyY21wKHMxLCBzMikgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IHNpemVfdCBfX3MxX2xlbiwgX19zMl9sZW47CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKHMxKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAoczIpCQkgICAgICBcCisgICAgICAmJiAoX19zMV9sZW4gPSBfX2J1aWx0aW5fc3RybGVuIChzMSksIF9fczJfbGVuID0gX19idWlsdGluX3N0cmxlbiAoczIpLCBcCisJICAoIV9fc3RyaW5nMl8xYnB0cl9wIChzMSkgfHwgX19zMV9sZW4gPj0gNCkJCQkgICAgICBcCisJICAmJiAoIV9fc3RyaW5nMl8xYnB0cl9wIChzMikgfHwgX19zMl9sZW4gPj0gNCkpCQkgICAgICBcCisgICAgICA/IF9fYnVpbHRpbl9zdHJjbXAgKHMxLCBzMikJCQkJCSAgICAgIFwKKyAgICAgIDogKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMxKQkJICAgICAgXAorCSAmJiAoX19zMV9sZW4gPSBfX2J1aWx0aW5fc3RybGVuIChzMSksIF9fczFfbGVuIDwgNCkJCSAgICAgIFwKKwkgPyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoczIpCQkgICAgICBcCisJICAgID8gX19idWlsdGluX3N0cmNtcCAoczEsIHMyKQkJCQkJICAgICAgXAorCSAgICA6IF9fc3RyY21wX2NnIChzMSwgczIsIF9fczFfbGVuKSkJCQkJICAgICAgXAorCSA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczIpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzMikJCSAgICAgIFwKKwkgICAgJiYgKF9fczJfbGVuID0gX19idWlsdGluX3N0cmxlbiAoczIpLCBfX3MyX2xlbiA8IDQpCQkgICAgICBcCisJICAgID8gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMxKQkgICAgICBcCisJICAgICAgID8gX19idWlsdGluX3N0cmNtcCAoczEsIHMyKQkJCQkgICAgICBcCisJICAgICAgIDogX19zdHJjbXBfZ2MgKHMxLCBzMiwgX19zMl9sZW4pKQkJCSAgICAgIFwKKwkgICAgOiBfX2J1aWx0aW5fc3RyY21wIChzMSwgczIpKSkpOyB9KQorIyBlbHNlCisjICBkZWZpbmUgc3RyY21wKHMxLCBzMikgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IHNpemVfdCBfX3MxX2xlbiwgX19zMl9sZW47CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKHMxKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAoczIpCQkgICAgICBcCisgICAgICAmJiAoX19zMV9sZW4gPSBzdHJsZW4gKHMxKSwgX19zMl9sZW4gPSBzdHJsZW4gKHMyKSwJCSAgICAgIFwKKwkgICghX19zdHJpbmcyXzFicHRyX3AgKHMxKSB8fCBfX3MxX2xlbiA+PSA0KQkJCSAgICAgIFwKKwkgICYmICghX19zdHJpbmcyXzFicHRyX3AgKHMyKSB8fCBfX3MyX2xlbiA+PSA0KSkJCSAgICAgIFwKKyAgICAgID8gbWVtY21wICgoX19jb25zdCBjaGFyICopIChzMSksIChfX2NvbnN0IGNoYXIgKikgKHMyKSwJCSAgICAgIFwKKwkJKF9fczFfbGVuIDwgX19zMl9sZW4gPyBfX3MxX2xlbiA6IF9fczJfbGVuKSArIDEpCSAgICAgIFwKKyAgICAgIDogKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMxKQkJICAgICAgXAorCSAmJiAoX19zMV9sZW4gPSBzdHJsZW4gKHMxKSwgX19zMV9sZW4gPCA0KQkJCSAgICAgIFwKKwkgPyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoczIpCQkgICAgICBcCisJICAgID8gX19zdHJjbXBfY2MgKHMxLCBzMiwgX19zMV9sZW4pCQkJCSAgICAgIFwKKwkgICAgOiBfX3N0cmNtcF9jZyAoczEsIHMyLCBfX3MxX2xlbikpCQkJCSAgICAgIFwKKwkgOiAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoczIpCQkgICAgICBcCisJICAgICYmIChfX3MyX2xlbiA9IHN0cmxlbiAoczIpLCBfX3MyX2xlbiA8IDQpCQkJICAgICAgXAorCSAgICA/IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzMSkJICAgICAgXAorCSAgICAgICA/IF9fc3RyY21wX2NjIChzMSwgczIsIF9fczJfbGVuKQkJCQkgICAgICBcCisJICAgICAgIDogX19zdHJjbXBfZ2MgKHMxLCBzMiwgX19zMl9sZW4pKQkJCSAgICAgIFwKKwkgICAgOiBzdHJjbXAgKHMxLCBzMikpKSk7IH0pCisjIGVuZGlmCisKKyMgZGVmaW5lIF9fc3RyY21wX2NjKHMxLCBzMiwgbCkgXAorICAoX19leHRlbnNpb25fXyAoeyByZWdpc3RlciBpbnQgX19yZXN1bHQgPQkJCQkgICAgICBcCisJCSAgICAgICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzMSkpWzBdICAgXAorCQkgICAgICAgLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopKHMyKSlbMF0pO1wKKwkJICAgIGlmIChsID4gMCAmJiBfX3Jlc3VsdCA9PSAwKQkJCQkgICAgICBcCisJCSAgICAgIHsJCQkJCQkJICAgICAgXAorCQkJX19yZXN1bHQgPSAoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJCSAgICAgIFwKKwkJCQkgICAgIChfX2NvbnN0IGNoYXIgKikgKHMxKSlbMV0JCSAgICAgIFwKKwkJCQkgICAgLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkgICAgICBcCisJCQkJICAgICAgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbMV0pOwkgICAgICBcCisJCQlpZiAobCA+IDEgJiYgX19yZXN1bHQgPT0gMCkJCQkgICAgICBcCisJCQkgIHsJCQkJCQkgICAgICBcCisJCQkgICAgX19yZXN1bHQgPQkJCQkJICAgICAgXAorCQkJICAgICAgKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCQkgICAgICBcCisJCQkJKF9fY29uc3QgY2hhciAqKSAoczEpKVsyXQkJICAgICAgXAorCQkJICAgICAgIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJCSAgICAgIFwKKwkJCQkgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbMl0pOwkJICAgICAgXAorCQkJICAgIGlmIChsID4gMiAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJCSAgICAgIF9fcmVzdWx0ID0JCQkJICAgICAgXAorCQkJCSgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCSAgKF9fY29uc3QgY2hhciAqKSAoczEpKVszXQkJICAgICAgXAorCQkJCSAtICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCQkgICAgICBcCisJCQkJICAgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbM10pOwkJICAgICAgXAorCQkJICB9CQkJCQkJICAgICAgXAorCQkgICAgICB9CQkJCQkJCSAgICAgIFwKKwkJICAgIF9fcmVzdWx0OyB9KSkKKworIyBkZWZpbmUgX19zdHJjbXBfY2coczEsIHMyLCBsMSkgXAorICAoX19leHRlbnNpb25fXyAoeyBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKl9fczIgPQkJCSAgICAgIFwKKwkJICAgICAgKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzMik7CSAgICAgIFwKKwkJICAgIHJlZ2lzdGVyIGludCBfX3Jlc3VsdCA9CQkJCSAgICAgIFwKKwkJICAgICAgKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHMxKSlbMF0gICBcCisJCSAgICAgICAtIF9fczJbMF0pOwkJCQkJICAgICAgXAorCQkgICAgaWYgKGwxID4gMCAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJICAgICAgewkJCQkJCQkgICAgICBcCisJCQlfX3Jlc3VsdCA9ICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCSAgICAgKF9fY29uc3QgY2hhciAqKSAoczEpKVsxXSAtIF9fczJbMV0pOyAgICBcCisJCQlpZiAobDEgPiAxICYmIF9fcmVzdWx0ID09IDApCQkJICAgICAgXAorCQkJICB7CQkJCQkJICAgICAgXAorCQkJICAgIF9fcmVzdWx0ID0gKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCSAgICAgIFwKKwkJCQkJIChfX2NvbnN0IGNoYXIgKikgKHMxKSlbMl0gLSBfX3MyWzJdKTtcCisJCQkgICAgaWYgKGwxID4gMiAmJiBfX3Jlc3VsdCA9PSAwKQkJICAgICAgXAorCQkJICAgICAgX19yZXN1bHQgPSAoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJICAgICAgXAorCQkJCQkgIChfX2NvbnN0IGNoYXIgKikgIChzMSkpWzNdCSAgICAgIFwKKwkJCQkJICAtIF9fczJbM10pOwkJCSAgICAgIFwKKwkJCSAgfQkJCQkJCSAgICAgIFwKKwkJICAgICAgfQkJCQkJCQkgICAgICBcCisJCSAgICBfX3Jlc3VsdDsgfSkpCisKKyMgZGVmaW5lIF9fc3RyY21wX2djKHMxLCBzMiwgbDIpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgX19jb25zdCB1bnNpZ25lZCBjaGFyICpfX3MxID0JCQkgICAgICBcCisJCSAgICAgIChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoczEpOwkgICAgICBcCisJCSAgICByZWdpc3RlciBpbnQgX19yZXN1bHQgPQkJCQkgICAgICBcCisJCSAgICAgIF9fczFbMF0gLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCSAoX19jb25zdCBjaGFyICopIChzMikpWzBdOwkJICAgICAgXAorCQkgICAgaWYgKGwyID4gMCAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJICAgICAgewkJCQkJCQkgICAgICBcCisJCQlfX3Jlc3VsdCA9IChfX3MxWzFdCQkJCSAgICAgIFwKKwkJCQkgICAgLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkgICAgICBcCisJCQkJICAgICAgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbMV0pOwkgICAgICBcCisJCQlpZiAobDIgPiAxICYmIF9fcmVzdWx0ID09IDApCQkJICAgICAgXAorCQkJICB7CQkJCQkJICAgICAgXAorCQkJICAgIF9fcmVzdWx0ID0JCQkJCSAgICAgIFwKKwkJCSAgICAgIChfX3MxWzJdIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJICAgICAgXAorCQkJCQkgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbMl0pOwkgICAgICBcCisJCQkgICAgaWYgKGwyID4gMiAmJiBfX3Jlc3VsdCA9PSAwKQkJICAgICAgXAorCQkJICAgICAgX19yZXN1bHQgPQkJCQkgICAgICBcCisJCQkJKF9fczFbM10JCQkJICAgICAgXAorCQkJCSAtICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCQkgICAgICBcCisJCQkJICAgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbM10pOwkJICAgICAgXAorCQkJICB9CQkJCQkJICAgICAgXAorCQkgICAgICB9CQkJCQkJCSAgICAgIFwKKwkJICAgIF9fcmVzdWx0OyB9KSkKKyNlbmRpZgorCisKKy8qIENvbXBhcmUgTiBjaGFyYWN0ZXJzIG9mIFMxIGFuZCBTMi4gICovCisjaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cm5jbXAKKyMgZGVmaW5lIHN0cm5jbXAoczEsIHMyLCBuKQkJCQkJCSAgICAgIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChuKQkJCQkgICAgICBcCisJCSAgJiYgKChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpCQkJICAgICAgXAorCQkgICAgICAgJiYgc3RybGVuIChzMSkgPCAoKHNpemVfdCkgKG4pKSkJCQkgICAgICBcCisJCSAgICAgIHx8IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczIpCQkJICAgICAgXAorCQkJICAmJiBzdHJsZW4gKHMyKSA8ICgoc2l6ZV90KSAobikpKSkJCSAgICAgIFwKKwkJICA/IHN0cmNtcCAoczEsIHMyKSA6IHN0cm5jbXAgKHMxLCBzMiwgbikpKQorI2VuZGlmCisKKworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBTIHdoaWNoCisgICBjb25zaXN0cyBlbnRpcmVseSBvZiBjaGFyYWN0ZXJzIG5vdCBpbiBSRUpFQ1QuICAqLworI2lmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cmNzcG4gfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyBpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyY3NwbgorIyAgaWYgX19HTlVDX1BSRVJFUSAoMywgMikKKyMgICBkZWZpbmUgc3RyY3NwbihzLCByZWplY3QpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBjaGFyIF9fcjAsIF9fcjEsIF9fcjI7CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKHJlamVjdCkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHJlamVjdCkJICAgICAgXAorICAgICAgPyAoKF9fYnVpbHRpbl9jb25zdGFudF9wIChzKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAocykpCQkgICAgICBcCisJID8gX19idWlsdGluX3N0cmNzcG4gKHMsIHJlamVjdCkJCQkJICAgICAgXAorCSA6ICgoX19yMCA9ICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVswXSwgX19yMCA9PSAnXDAnKQkgICAgICBcCisJICAgID8gc3RybGVuIChzKQkJCQkJCSAgICAgIFwKKwkgICAgOiAoKF9fcjEgPSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMV0sIF9fcjEgPT0gJ1wwJykJICAgICAgXAorCSAgICAgICA/IF9fc3RyY3Nwbl9jMSAocywgX19yMCkJCQkJCSAgICAgIFwKKwkgICAgICAgOiAoKF9fcjIgPSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMl0sIF9fcjIgPT0gJ1wwJykJICAgICAgXAorCQkgID8gX19zdHJjc3BuX2MyIChzLCBfX3IwLCBfX3IxKQkJCSAgICAgIFwKKwkJICA6ICgoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbM10gPT0gJ1wwJwkJICAgICAgXAorCQkgICAgID8gX19zdHJjc3BuX2MzIChzLCBfX3IwLCBfX3IxLCBfX3IyKQkJICAgICAgXAorCQkgICAgIDogX19idWlsdGluX3N0cmNzcG4gKHMsIHJlamVjdCkpKSkpKQkJICAgICAgXAorICAgICAgOiBfX2J1aWx0aW5fc3RyY3NwbiAocywgcmVqZWN0KSk7IH0pCisjICBlbHNlCisjICAgZGVmaW5lIHN0cmNzcG4ocywgcmVqZWN0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX3IwLCBfX3IxLCBfX3IyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChyZWplY3QpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChyZWplY3QpCSAgICAgIFwKKyAgICAgID8gKChfX3IwID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzBdLCBfX3IwID09ICdcMCcpCQkgICAgICBcCisJID8gc3RybGVuIChzKQkJCQkJCQkgICAgICBcCisJIDogKChfX3IxID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzFdLCBfX3IxID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyBfX3N0cmNzcG5fYzEgKHMsIF9fcjApCQkJCQkgICAgICBcCisJICAgIDogKChfX3IyID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzJdLCBfX3IyID09ICdcMCcpCSAgICAgIFwKKwkgICAgICAgPyBfX3N0cmNzcG5fYzIgKHMsIF9fcjAsIF9fcjEpCQkJCSAgICAgIFwKKwkgICAgICAgOiAoKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzNdID09ICdcMCcJCSAgICAgIFwKKwkJICA/IF9fc3RyY3Nwbl9jMyAocywgX19yMCwgX19yMSwgX19yMikJCQkgICAgICBcCisJCSAgOiBzdHJjc3BuIChzLCByZWplY3QpKSkpKQkJCQkgICAgICBcCisgICAgICA6IHN0cmNzcG4gKHMsIHJlamVjdCkpOyB9KQorIyAgZW5kaWYKKyMgZW5kaWYKKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cmNzcG5fYzEgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19yZWplY3QpOworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJjc3BuX2MxIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fcmVqZWN0KQoreworICByZWdpc3RlciBzaXplX3QgX19yZXN1bHQgPSAwOworICB3aGlsZSAoX19zW19fcmVzdWx0XSAhPSAnXDAnICYmIF9fc1tfX3Jlc3VsdF0gIT0gX19yZWplY3QpCisgICAgKytfX3Jlc3VsdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCitfX1NUUklOR19JTkxJTkUgc2l6ZV90IF9fc3RyY3Nwbl9jMiAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdDEsCisJCQkJICAgICBpbnQgX19yZWplY3QyKTsKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3RyY3Nwbl9jMiAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdDEsIGludCBfX3JlamVjdDIpCit7CisgIHJlZ2lzdGVyIHNpemVfdCBfX3Jlc3VsdCA9IDA7CisgIHdoaWxlIChfX3NbX19yZXN1bHRdICE9ICdcMCcgJiYgX19zW19fcmVzdWx0XSAhPSBfX3JlamVjdDEKKwkgJiYgX19zW19fcmVzdWx0XSAhPSBfX3JlamVjdDIpCisgICAgKytfX3Jlc3VsdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCitfX1NUUklOR19JTkxJTkUgc2l6ZV90IF9fc3RyY3Nwbl9jMyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdDEsCisJCQkJICAgICBpbnQgX19yZWplY3QyLCBpbnQgX19yZWplY3QzKTsKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3RyY3Nwbl9jMyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdDEsIGludCBfX3JlamVjdDIsCisJICAgICAgaW50IF9fcmVqZWN0MykKK3sKKyAgcmVnaXN0ZXIgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgd2hpbGUgKF9fc1tfX3Jlc3VsdF0gIT0gJ1wwJyAmJiBfX3NbX19yZXN1bHRdICE9IF9fcmVqZWN0MQorCSAmJiBfX3NbX19yZXN1bHRdICE9IF9fcmVqZWN0MiAmJiBfX3NbX19yZXN1bHRdICE9IF9fcmVqZWN0MykKKyAgICArK19fcmVzdWx0OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisjZW5kaWYKKworCisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCBzZWdtZW50IG9mIFMgd2hpY2gKKyAgIGNvbnNpc3RzIGVudGlyZWx5IG9mIGNoYXJhY3RlcnMgaW4gQUNDRVBULiAgKi8KKyNpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJzcG4gfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyBpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3Ryc3BuCisjICBpZiBfX0dOVUNfUFJFUkVRICgzLCAyKQorIyAgIGRlZmluZSBzdHJzcG4ocywgYWNjZXB0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX2EwLCBfX2ExLCBfX2EyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhY2NlcHQpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChhY2NlcHQpCSAgICAgIFwKKyAgICAgID8gKChfX2J1aWx0aW5fY29uc3RhbnRfcCAocykgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMpKQkJICAgICAgXAorCSA/IF9fYnVpbHRpbl9zdHJzcG4gKHMsIGFjY2VwdCkJCQkJCSAgICAgIFwKKwkgOiAoKF9fYTAgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMF0sIF9fYTAgPT0gJ1wwJykJICAgICAgXAorCSAgICA/ICgodm9pZCkgKHMpLCAwKQkJCQkJCSAgICAgIFwKKwkgICAgOiAoKF9fYTEgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMV0sIF9fYTEgPT0gJ1wwJykJICAgICAgXAorCSAgICAgICA/IF9fc3Ryc3BuX2MxIChzLCBfX2EwKQkJCQkJICAgICAgXAorCSAgICAgICA6ICgoX19hMiA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsyXSwgX19hMiA9PSAnXDAnKQkgICAgICBcCisJCSAgPyBfX3N0cnNwbl9jMiAocywgX19hMCwgX19hMSkJCQkJICAgICAgXAorCQkgIDogKCgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVszXSA9PSAnXDAnCQkgICAgICBcCisJCSAgICAgPyBfX3N0cnNwbl9jMyAocywgX19hMCwgX19hMSwgX19hMikJCSAgICAgIFwKKwkJICAgICA6IF9fYnVpbHRpbl9zdHJzcG4gKHMsIGFjY2VwdCkpKSkpKQkJICAgICAgXAorICAgICAgOiBfX2J1aWx0aW5fc3Ryc3BuIChzLCBhY2NlcHQpKTsgfSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgc3Ryc3BuKHMsIGFjY2VwdCkgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IGNoYXIgX19hMCwgX19hMSwgX19hMjsJCQkJCQkgICAgICBcCisgICAgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWNjZXB0KSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoYWNjZXB0KQkgICAgICBcCisgICAgICA/ICgoX19hMCA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVswXSwgX19hMCA9PSAnXDAnKQkJICAgICAgXAorCSA/ICgodm9pZCkgKHMpLCAwKQkJCQkJCSAgICAgIFwKKwkgOiAoKF9fYTEgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMV0sIF9fYTEgPT0gJ1wwJykJICAgICAgXAorCSAgICA/IF9fc3Ryc3BuX2MxIChzLCBfX2EwKQkJCQkJICAgICAgXAorCSAgICA6ICgoX19hMiA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsyXSwgX19hMiA9PSAnXDAnKQkgICAgICBcCisJICAgICAgID8gX19zdHJzcG5fYzIgKHMsIF9fYTAsIF9fYTEpCQkJCSAgICAgIFwKKwkgICAgICAgOiAoKChfX2NvbnN0IGNoYXIgKikgKGFjY2VwdCkpWzNdID09ICdcMCcJCSAgICAgIFwKKwkJICA/IF9fc3Ryc3BuX2MzIChzLCBfX2EwLCBfX2ExLCBfX2EyKQkJCSAgICAgIFwKKwkJICA6IHN0cnNwbiAocywgYWNjZXB0KSkpKSkJCQkJICAgICAgXAorICAgICAgOiBzdHJzcG4gKHMsIGFjY2VwdCkpOyB9KQorIyAgZW5kaWYKKyMgZW5kaWYKKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cnNwbl9jMSAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2FjY2VwdCk7CitfX1NUUklOR19JTkxJTkUgc2l6ZV90CitfX3N0cnNwbl9jMSAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2FjY2VwdCkKK3sKKyAgcmVnaXN0ZXIgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgLyogUGxlYXNlIG5vdGUgdGhhdCBfX2FjY2VwdCBuZXZlciBjYW4gYmUgJ1wwJy4gICovCisgIHdoaWxlIChfX3NbX19yZXN1bHRdID09IF9fYWNjZXB0KQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cnNwbl9jMiAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2FjY2VwdDEsCisJCQkJICAgIGludCBfX2FjY2VwdDIpOworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJzcG5fYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLCBpbnQgX19hY2NlcHQyKQoreworICByZWdpc3RlciBzaXplX3QgX19yZXN1bHQgPSAwOworICAvKiBQbGVhc2Ugbm90ZSB0aGF0IF9fYWNjZXB0MSBhbmQgX19hY2NlcHQyIG5ldmVyIGNhbiBiZSAnXDAnLiAgKi8KKyAgd2hpbGUgKF9fc1tfX3Jlc3VsdF0gPT0gX19hY2NlcHQxIHx8IF9fc1tfX3Jlc3VsdF0gPT0gX19hY2NlcHQyKQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cnNwbl9jMyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2FjY2VwdDEsCisJCQkJICAgIGludCBfX2FjY2VwdDIsIGludCBfX2FjY2VwdDMpOworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJzcG5fYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLCBpbnQgX19hY2NlcHQyLCBpbnQgX19hY2NlcHQzKQoreworICByZWdpc3RlciBzaXplX3QgX19yZXN1bHQgPSAwOworICAvKiBQbGVhc2Ugbm90ZSB0aGF0IF9fYWNjZXB0MSB0byBfX2FjY2VwdDMgbmV2ZXIgY2FuIGJlICdcMCcuICAqLworICB3aGlsZSAoX19zW19fcmVzdWx0XSA9PSBfX2FjY2VwdDEgfHwgX19zW19fcmVzdWx0XSA9PSBfX2FjY2VwdDIKKwkgfHwgX19zW19fcmVzdWx0XSA9PSBfX2FjY2VwdDMpCisgICAgKytfX3Jlc3VsdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorI2VuZGlmCisKKworLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiBTIG9mIGFueSBjaGFyYWN0ZXIgaW4gQUNDRVBULiAgKi8KKyNpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJwYnJrIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cnBicmsKKyMgIGlmIF9fR05VQ19QUkVSRVEgKDMsIDIpCisjICAgZGVmaW5lIHN0cnBicmsocywgYWNjZXB0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX2EwLCBfX2ExLCBfX2EyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhY2NlcHQpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChhY2NlcHQpCSAgICAgIFwKKyAgICAgID8gKChfX2J1aWx0aW5fY29uc3RhbnRfcCAocykgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMpKQkJICAgICAgXAorCSA/IF9fYnVpbHRpbl9zdHJwYnJrIChzLCBhY2NlcHQpCQkJCSAgICAgIFwKKwkgOiAoKF9fYTAgPSAoKF9fY29uc3QgY2hhciAgKikgKGFjY2VwdCkpWzBdLCBfX2EwID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyAoKHZvaWQpIChzKSwgKGNoYXIgKikgTlVMTCkJCQkJICAgICAgXAorCSAgICA6ICgoX19hMSA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsxXSwgX19hMSA9PSAnXDAnKQkgICAgICBcCisJICAgICAgID8gX19idWlsdGluX3N0cmNociAocywgX19hMCkJCQkJICAgICAgXAorCSAgICAgICA6ICgoX19hMiA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsyXSwgX19hMiA9PSAnXDAnKQkgICAgICBcCisJCSAgPyBfX3N0cnBicmtfYzIgKHMsIF9fYTAsIF9fYTEpCQkJICAgICAgXAorCQkgIDogKCgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVszXSA9PSAnXDAnCQkgICAgICBcCisJCSAgICAgPyBfX3N0cnBicmtfYzMgKHMsIF9fYTAsIF9fYTEsIF9fYTIpCQkgICAgICBcCisJCSAgICAgOiBfX2J1aWx0aW5fc3RycGJyayAocywgYWNjZXB0KSkpKSkpCQkgICAgICBcCisgICAgICA6IF9fYnVpbHRpbl9zdHJwYnJrIChzLCBhY2NlcHQpKTsgfSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgc3RycGJyayhzLCBhY2NlcHQpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBjaGFyIF9fYTAsIF9fYTEsIF9fYTI7CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKGFjY2VwdCkgJiYgX19zdHJpbmcyXzFicHRyX3AgKGFjY2VwdCkJICAgICAgXAorICAgICAgPyAoKF9fYTAgPSAoKF9fY29uc3QgY2hhciAgKikgKGFjY2VwdCkpWzBdLCBfX2EwID09ICdcMCcpCQkgICAgICBcCisJID8gKCh2b2lkKSAocyksIChjaGFyICopIE5VTEwpCQkJCQkgICAgICBcCisJIDogKChfX2ExID0gKChfX2NvbnN0IGNoYXIgKikgKGFjY2VwdCkpWzFdLCBfX2ExID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyBzdHJjaHIgKHMsIF9fYTApCQkJCQkJICAgICAgXAorCSAgICA6ICgoX19hMiA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsyXSwgX19hMiA9PSAnXDAnKQkgICAgICBcCisJICAgICAgID8gX19zdHJwYnJrX2MyIChzLCBfX2EwLCBfX2ExKQkJCQkgICAgICBcCisJICAgICAgIDogKCgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVszXSA9PSAnXDAnCQkgICAgICBcCisJCSAgPyBfX3N0cnBicmtfYzMgKHMsIF9fYTAsIF9fYTEsIF9fYTIpCQkJICAgICAgXAorCQkgIDogc3RycGJyayAocywgYWNjZXB0KSkpKSkJCQkJICAgICAgXAorICAgICAgOiBzdHJwYnJrIChzLCBhY2NlcHQpKTsgfSkKKyMgIGVuZGlmCisjIGVuZGlmCisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cnBicmtfYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLAorCQkJCSAgICAgaW50IF9fYWNjZXB0Mik7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnBicmtfYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLCBpbnQgX19hY2NlcHQyKQoreworICAvKiBQbGVhc2Ugbm90ZSB0aGF0IF9fYWNjZXB0MSBhbmQgX19hY2NlcHQyIG5ldmVyIGNhbiBiZSAnXDAnLiAgKi8KKyAgd2hpbGUgKCpfX3MgIT0gJ1wwJyAmJiAqX19zICE9IF9fYWNjZXB0MSAmJiAqX19zICE9IF9fYWNjZXB0MikKKyAgICArK19fczsKKyAgcmV0dXJuICpfX3MgPT0gJ1wwJyA/IE5VTEwgOiAoY2hhciAqKSAoc2l6ZV90KSBfX3M7Cit9CisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cnBicmtfYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLAorCQkJCSAgICAgaW50IF9fYWNjZXB0MiwgaW50IF9fYWNjZXB0Myk7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnBicmtfYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLCBpbnQgX19hY2NlcHQyLAorCSAgICAgIGludCBfX2FjY2VwdDMpCit7CisgIC8qIFBsZWFzZSBub3RlIHRoYXQgX19hY2NlcHQxIHRvIF9fYWNjZXB0MyBuZXZlciBjYW4gYmUgJ1wwJy4gICovCisgIHdoaWxlICgqX19zICE9ICdcMCcgJiYgKl9fcyAhPSBfX2FjY2VwdDEgJiYgKl9fcyAhPSBfX2FjY2VwdDIKKwkgJiYgKl9fcyAhPSBfX2FjY2VwdDMpCisgICAgKytfX3M7CisgIHJldHVybiAqX19zID09ICdcMCcgPyBOVUxMIDogKGNoYXIgKikgKHNpemVfdCkgX19zOworfQorI2VuZGlmCisKKworLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBORUVETEUgaW4gSEFZU1RBQ0suICBOZXdlciBnY2MgdmVyc2lvbnMKKyAgIGRvIHRoaXMgaXRzZWxmLiAgKi8KKyNpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJzdHIgJiYgIV9fR05VQ19QUkVSRVEgKDIsIDk3KQorIyBkZWZpbmUgc3Ryc3RyKGhheXN0YWNrLCBuZWVkbGUpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChuZWVkbGUpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChuZWVkbGUpIFwKKwkJICA/ICgoKF9fY29uc3QgY2hhciAqKSAobmVlZGxlKSlbMF0gPT0gJ1wwJwkJICAgICAgXAorCQkgICAgID8gKGNoYXIgKikgKHNpemVfdCkgKGhheXN0YWNrKQkJCSAgICAgIFwKKwkJICAgICA6ICgoKF9fY29uc3QgY2hhciAqKSAobmVlZGxlKSlbMV0gPT0gJ1wwJwkJICAgICAgXAorCQkJPyBzdHJjaHIgKGhheXN0YWNrLAkJCQkgICAgICBcCisJCQkJICAoKF9fY29uc3QgY2hhciAqKSAobmVlZGxlKSlbMF0pIAkgICAgICBcCisJCQk6IHN0cnN0ciAoaGF5c3RhY2ssIG5lZWRsZSkpKQkJCSAgICAgIFwKKwkJICA6IHN0cnN0ciAoaGF5c3RhY2ssIG5lZWRsZSkpKQorI2VuZGlmCisKKworI2lmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cnRva19yIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cnRva19yCisjICBkZWZpbmUgX19zdHJ0b2tfcihzLCBzZXAsIG5leHRwKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc2VwKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoc2VwKQkgICAgICBcCisJCSAgJiYgKChfX2NvbnN0IGNoYXIgKikgKHNlcCkpWzBdICE9ICdcMCcJCSAgICAgIFwKKwkJICAmJiAoKF9fY29uc3QgY2hhciAqKSAoc2VwKSlbMV0gPT0gJ1wwJwkJICAgICAgXAorCQkgID8gX19zdHJ0b2tfcl8xYyAocywgKChfX2NvbnN0IGNoYXIgKikgKHNlcCkpWzBdLCBuZXh0cCkgICAgIFwKKwkJICA6IF9fc3RydG9rX3IgKHMsIHNlcCwgbmV4dHApKSkKKyMgZW5kaWYKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RydG9rX3JfMWMgKGNoYXIgKl9fcywgY2hhciBfX3NlcCwgY2hhciAqKl9fbmV4dHApOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJ0b2tfcl8xYyAoY2hhciAqX19zLCBjaGFyIF9fc2VwLCBjaGFyICoqX19uZXh0cCkKK3sKKyAgY2hhciAqX19yZXN1bHQ7CisgIGlmIChfX3MgPT0gTlVMTCkKKyAgICBfX3MgPSAqX19uZXh0cDsKKyAgd2hpbGUgKCpfX3MgPT0gX19zZXApCisgICAgKytfX3M7CisgIF9fcmVzdWx0ID0gTlVMTDsKKyAgaWYgKCpfX3MgIT0gJ1wwJykKKyAgICB7CisgICAgICBfX3Jlc3VsdCA9IF9fcysrOworICAgICAgd2hpbGUgKCpfX3MgIT0gJ1wwJykKKwlpZiAoKl9fcysrID09IF9fc2VwKQorCSAgeworCSAgICBfX3NbLTFdID0gJ1wwJzsKKwkgICAgYnJlYWs7CisJICB9CisgICAgfQorICAqX19uZXh0cCA9IF9fczsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorIyBpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworIyAgZGVmaW5lIHN0cnRva19yKHMsIHNlcCwgbmV4dHApIF9fc3RydG9rX3IgKHMsIHNlcCwgbmV4dHApCisjIGVuZGlmCisjZW5kaWYKKworCisjaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfc3Ryc2VwIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cnNlcAorCitleHRlcm4gY2hhciAqX19zdHJzZXBfZyAoY2hhciAqKl9fc3RyaW5ncCwgX19jb25zdCBjaGFyICpfX2RlbGltKTsKKyMgIGRlZmluZSBfX3N0cnNlcChzLCByZWplY3QpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBjaGFyIF9fcjAsIF9fcjEsIF9fcjI7CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKHJlamVjdCkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHJlamVjdCkJICAgICAgXAorICAgICAgJiYgKF9fcjAgPSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMF0sCQkJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzBdICE9ICdcMCcpCQkJICAgICAgXAorICAgICAgPyAoKF9fcjEgPSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMV0sCQkJICAgICAgXAorCSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMV0gPT0gJ1wwJykJCQkgICAgICBcCisJID8gX19zdHJzZXBfMWMgKHMsIF9fcjApCQkJCQkgICAgICBcCisJIDogKChfX3IyID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzJdLCBfX3IyID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyBfX3N0cnNlcF8yYyAocywgX19yMCwgX19yMSkJCQkJICAgICAgXAorCSAgICA6ICgoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbM10gPT0gJ1wwJwkJCSAgICAgIFwKKwkgICAgICAgPyBfX3N0cnNlcF8zYyAocywgX19yMCwgX19yMSwgX19yMikJCQkgICAgICBcCisJICAgICAgIDogX19zdHJzZXBfZyAocywgcmVqZWN0KSkpKQkJCQkgICAgICBcCisgICAgICA6IF9fc3Ryc2VwX2cgKHMsIHJlamVjdCkpOyB9KQorIyBlbmRpZgorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJzZXBfMWMgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJzZXBfMWMgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QpCit7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmV0dmFsID0gKl9fczsKKyAgaWYgKF9fcmV0dmFsICE9IE5VTEwgJiYgKCpfX3MgPSBzdHJjaHIgKF9fcmV0dmFsLCBfX3JlamVjdCkpICE9IE5VTEwpCisgICAgKigqX19zKSsrID0gJ1wwJzsKKyAgcmV0dXJuIF9fcmV0dmFsOworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJzZXBfMmMgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QxLCBjaGFyIF9fcmVqZWN0Mik7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnNlcF8yYyAoY2hhciAqKl9fcywgY2hhciBfX3JlamVjdDEsIGNoYXIgX19yZWplY3QyKQoreworICByZWdpc3RlciBjaGFyICpfX3JldHZhbCA9ICpfX3M7CisgIGlmIChfX3JldHZhbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIGNoYXIgKl9fY3AgPSBfX3JldHZhbDsKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIGlmICgqX19jcCA9PSAnXDAnKQorCSAgICB7CisJICAgICAgX19jcCA9IE5VTEw7CisJICBicmVhazsKKwkgICAgfQorCSAgaWYgKCpfX2NwID09IF9fcmVqZWN0MSB8fCAqX19jcCA9PSBfX3JlamVjdDIpCisJICAgIHsKKwkgICAgICAqX19jcCsrID0gJ1wwJzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgKytfX2NwOworCX0KKyAgICAgICpfX3MgPSBfX2NwOworICAgIH0KKyAgcmV0dXJuIF9fcmV0dmFsOworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJzZXBfM2MgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QxLCBjaGFyIF9fcmVqZWN0MiwKKwkJCQkgICBjaGFyIF9fcmVqZWN0Myk7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnNlcF8zYyAoY2hhciAqKl9fcywgY2hhciBfX3JlamVjdDEsIGNoYXIgX19yZWplY3QyLCBjaGFyIF9fcmVqZWN0MykKK3sKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXR2YWwgPSAqX19zOworICBpZiAoX19yZXR2YWwgIT0gTlVMTCkKKyAgICB7CisgICAgICByZWdpc3RlciBjaGFyICpfX2NwID0gX19yZXR2YWw7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBpZiAoKl9fY3AgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIF9fY3AgPSBOVUxMOworCSAgYnJlYWs7CisJICAgIH0KKwkgIGlmICgqX19jcCA9PSBfX3JlamVjdDEgfHwgKl9fY3AgPT0gX19yZWplY3QyIHx8ICpfX2NwID09IF9fcmVqZWN0MykKKwkgICAgeworCSAgICAgICpfX2NwKysgPSAnXDAnOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICArK19fY3A7CisJfQorICAgICAgKl9fcyA9IF9fY3A7CisgICAgfQorICByZXR1cm4gX19yZXR2YWw7Cit9CisjIGlmZGVmIF9fVVNFX0JTRAorIyAgZGVmaW5lIHN0cnNlcChzLCByZWplY3QpIF9fc3Ryc2VwIChzLCByZWplY3QpCisjIGVuZGlmCisjZW5kaWYKKworLyogV2UgbmVlZCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGZvciBpbmxpbmUgc3RyZHVwKCkuCisgICBSZWZlcnJpbmcgdG8gc3RkbGliLmggKGV2ZW4gbWluaW1hbGx5KSBpcyBub3QgYWxsb3dlZAorICAgaW4gYW55IG9mIHRoZSB0aWdodCBzdGFuZGFyZHMgY29tcGxpYW50IG1vZGVzLiAgKi8KKyNpZmRlZiBfX1VTRV9NSVNDCisKKyMgaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyZHVwIHx8ICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cm5kdXAKKyMgIGRlZmluZSBfX25lZWRfbWFsbG9jX2FuZF9jYWxsb2MKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbmRpZgorCisjIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJkdXAKKworZXh0ZXJuIGNoYXIgKl9fc3RyZHVwIChfX2NvbnN0IGNoYXIgKl9fc3RyaW5nKSBfX1RIUk9XIF9fYXR0cmlidXRlX21hbGxvY19fOworIyAgZGVmaW5lIF9fc3RyZHVwKHMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAocykJICAgICAgXAorCQkgID8gKCgoX19jb25zdCBjaGFyICopIChzKSlbMF0gPT0gJ1wwJwkJCSAgICAgIFwKKwkJICAgICA/IChjaGFyICopIGNhbGxvYyAoKHNpemVfdCkgMSwgKHNpemVfdCkgMSkJCSAgICAgIFwKKwkJICAgICA6ICh7IHNpemVfdCBfX2xlbiA9IHN0cmxlbiAocykgKyAxOwkJICAgICAgXAorCQkJICBjaGFyICpfX3JldHZhbCA9IChjaGFyICopIG1hbGxvYyAoX19sZW4pOwkgICAgICBcCisJCQkgIGlmIChfX3JldHZhbCAhPSBOVUxMKQkJCQkgICAgICBcCisJCQkgICAgX19yZXR2YWwgPSAoY2hhciAqKSBtZW1jcHkgKF9fcmV0dmFsLCBzLCBfX2xlbik7ICBcCisJCQkgIF9fcmV0dmFsOyB9KSkJCQkJCSAgICAgIFwKKwkJICA6IF9fc3RyZHVwIChzKSkpCisKKyMgIGlmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisjICAgZGVmaW5lIHN0cmR1cChzKSBfX3N0cmR1cCAocykKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cm5kdXAKKworZXh0ZXJuIGNoYXIgKl9fc3RybmR1cCAoX19jb25zdCBjaGFyICpfX3N0cmluZywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXzsKKyMgIGRlZmluZSBfX3N0cm5kdXAocywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzKQkgICAgICBcCisJCSAgPyAoKChfX2NvbnN0IGNoYXIgKikgKHMpKVswXSA9PSAnXDAnCQkJICAgICAgXAorCQkgICAgID8gKGNoYXIgKikgY2FsbG9jICgoc2l6ZV90KSAxLCAoc2l6ZV90KSAxKQkJICAgICAgXAorCQkgICAgIDogKHsgc2l6ZV90IF9fbGVuID0gc3RybGVuIChzKSArIDE7CQkgICAgICBcCisJCQkgIHNpemVfdCBfX24gPSAobik7CQkJCSAgICAgIFwKKwkJCSAgY2hhciAqX19yZXR2YWw7CQkJCSAgICAgIFwKKwkJCSAgaWYgKF9fbiA8IF9fbGVuKQkJCQkgICAgICBcCisJCQkgICAgX19sZW4gPSBfX24gKyAxOwkJCQkgICAgICBcCisJCQkgIF9fcmV0dmFsID0gKGNoYXIgKikgbWFsbG9jIChfX2xlbik7CQkgICAgICBcCisJCQkgIGlmIChfX3JldHZhbCAhPSBOVUxMKQkJCQkgICAgICBcCisJCQkgICAgewkJCQkJCSAgICAgIFwKKwkJCSAgICAgIF9fcmV0dmFsW19fbGVuIC0gMV0gPSAnXDAnOwkJICAgICAgXAorCQkJICAgICAgX19yZXR2YWwgPSAoY2hhciAqKSBtZW1jcHkgKF9fcmV0dmFsLCBzLAkgICAgICBcCisJCQkJCQkJICBfX2xlbiAtIDEpOwkgICAgICBcCisJCQkgICAgfQkJCQkJCSAgICAgIFwKKwkJCSAgX19yZXR2YWw7IH0pKQkJCQkJICAgICAgXAorCQkgIDogX19zdHJuZHVwIChzLCBuKSkpCisKKyMgIGlmZGVmIF9fVVNFX0dOVQorIyAgIGRlZmluZSBzdHJuZHVwKHMsIG4pIF9fc3RybmR1cCAocywgbikKKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbmRpZiAvKiBVc2UgbWlzYy4gb3IgdXNlIEdOVS4gICovCisKKyNpZm5kZWYgX0ZPUkNFX0lOTElORVMKKyMgdW5kZWYgX19TVFJJTkdfSU5MSU5FCisjZW5kaWYKKworI2VuZGlmIC8qIE5vIHN0cmluZyBpbmxpbmVzLiAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0cmluZzMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0cmluZzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjQ3NzI1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RyaW5nMy5oCkBAIC0wLDAgKzEsMTUzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NUUklOR19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvc3RyaW5nMy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3RyaW5nLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK19fd2FybmRlY2wgKF9fd2Fybl9tZW1zZXRfemVyb19sZW4sCisJICAgICJtZW1zZXQgdXNlZCB3aXRoIGNvbnN0YW50IHplcm8gbGVuZ3RoIHBhcmFtZXRlcjsgdGhpcyBjb3VsZCBiZSBkdWUgdG8gdHJhbnNwb3NlZCBwYXJhbWV0ZXJzIik7CisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKy8qIFhYWCBUaGlzIGlzIHRlbXBvcmFyaWx5LiAgV2Ugc2hvdWxkIG5vdCByZWRlZmluZSBhbnkgb2YgdGhlIHN5bWJvbHMKKyAgIGFuZCBpbnN0ZWFkIGludGVncmF0ZSB0aGUgZXJyb3IgY2hlY2tpbmcgaW50byB0aGUgb3JpZ2luYWwKKyAgIGRlZmluaXRpb25zLiAgKi8KKyMgdW5kZWYgbWVtY3B5CisjIHVuZGVmIG1lbW1vdmUKKyMgdW5kZWYgbWVtc2V0CisjIHVuZGVmIHN0cmNhdAorIyB1bmRlZiBzdHJjcHkKKyMgdW5kZWYgc3RybmNhdAorIyB1bmRlZiBzdHJuY3B5CisjIGlmZGVmIF9fVVNFX0dOVQorIyAgdW5kZWYgbWVtcGNweQorIyAgdW5kZWYgc3RwY3B5CisjIGVuZGlmCisjIGlmZGVmIF9fVVNFX0JTRAorIyAgdW5kZWYgYmNvcHkKKyMgIHVuZGVmIGJ6ZXJvCisjIGVuZGlmCisjZW5kaWYKKworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQgKgorX19OVEggKG1lbWNweSAodm9pZCAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3NyYywKKwkgICAgICAgc2l6ZV90IF9fbGVuKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX21lbWNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX2JvczAgKF9fZGVzdCkpOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQgKgorX19OVEggKG1lbW1vdmUgKHZvaWQgKl9fZGVzdCwgX19jb25zdCB2b2lkICpfX3NyYywgc2l6ZV90IF9fbGVuKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX21lbW1vdmVfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MwIChfX2Rlc3QpKTsKK30KKworI2lmZGVmIF9fVVNFX0dOVQorX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkICoKK19fTlRIIChtZW1wY3B5ICh2b2lkICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fc3JjLAorCQlzaXplX3QgX19sZW4pKQoreworICByZXR1cm4gX19idWlsdGluX19fbWVtcGNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX2JvczAgKF9fZGVzdCkpOworfQorI2VuZGlmCisKKworLyogVGhlIGZpcnN0IHR3byB0ZXN0cyBoZXJlIGhlbHAgdG8gY2F0Y2ggYSBzb21ld2hhdCBjb21tb24gcHJvYmxlbQorICAgd2hlcmUgdGhlIHNlY29uZCBhbmQgdGhpcmQgcGFyYW1ldGVyIGFyZSB0cmFuc3Bvc2VkLiAgVGhpcyBpcworICAgZXNwZWNpYWxseSBwcm9ibGVtYXRpYyBpZiB0aGUgaW50ZW5kZWQgZmlsbCB2YWx1ZSBpcyB6ZXJvLiAgSW4gdGhpcworICAgY2FzZSBubyB3b3JrIGlzIGRvbmUgYXQgYWxsLiAgV2UgZGV0ZWN0IHRoZXNlIHByb2JsZW1zIGJ5IHJlZmVycmluZworICAgbm9uLWV4aXN0aW5nIGZ1bmN0aW9ucy4gICovCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQgKgorX19OVEggKG1lbXNldCAodm9pZCAqX19kZXN0LCBpbnQgX19jaCwgc2l6ZV90IF9fbGVuKSkKK3sKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikgJiYgX19sZW4gPT0gMAorICAgICAgJiYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19jaCkgfHwgX19jaCAhPSAwKSkKKyAgICB7CisgICAgICBfX3dhcm5fbWVtc2V0X3plcm9fbGVuICgpOworICAgICAgcmV0dXJuIF9fZGVzdDsKKyAgICB9CisgIHJldHVybiBfX2J1aWx0aW5fX19tZW1zZXRfY2hrIChfX2Rlc3QsIF9fY2gsIF9fbGVuLCBfX2JvczAgKF9fZGVzdCkpOworfQorCisjaWZkZWYgX19VU0VfQlNECitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQKK19fTlRIIChiY29weSAoX19jb25zdCB2b2lkICpfX3NyYywgdm9pZCAqX19kZXN0LCBzaXplX3QgX19sZW4pKQoreworICAodm9pZCkgX19idWlsdGluX19fbWVtbW92ZV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX2JvczAgKF9fZGVzdCkpOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQKK19fTlRIIChiemVybyAodm9pZCAqX19kZXN0LCBzaXplX3QgX19sZW4pKQoreworICAodm9pZCkgX19idWlsdGluX19fbWVtc2V0X2NoayAoX19kZXN0LCAnXDAnLCBfX2xlbiwgX19ib3MwIChfX2Rlc3QpKTsKK30KKyNlbmRpZgorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorX19OVEggKHN0cmNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHJjcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2JvcyAoX19kZXN0KSk7Cit9CisKKyNpZmRlZiBfX1VTRV9HTlUKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgY2hhciAqCitfX05USCAoc3RwY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3N0cGNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fYm9zIChfX2Rlc3QpKTsKK30KKyNlbmRpZgorCisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgY2hhciAqCitfX05USCAoc3RybmNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJc2l6ZV90IF9fbGVuKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3N0cm5jcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MgKF9fZGVzdCkpOworfQorCisvLyBYWFggV2UgaGF2ZSBubyBjb3JyZXNwb25kaW5nIGJ1aWx0aW4geWV0LgorZXh0ZXJuIGNoYXIgKl9fc3RwbmNweV9jaGsgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYywgc2l6ZV90IF9fbiwKKwkJCSAgICBzaXplX3QgX19kZXN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1RfTlRIIChfX3N0cG5jcHlfYWxpYXMsIChjaGFyICpfX2Rlc3QsCisJCQkJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fc3JjLAorCQkJCQkgICAgICAgc2l6ZV90IF9fbiksIHN0cG5jcHkpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorX19OVEggKHN0cG5jcHkgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYywgc2l6ZV90IF9fbikpCit7CisgIGlmIChfX2JvcyAoX19kZXN0KSAhPSAoc2l6ZV90KSAtMQorICAgICAgJiYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSB8fCBfX24gPD0gX19ib3MgKF9fZGVzdCkpKQorICAgIHJldHVybiBfX3N0cG5jcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX24sIF9fYm9zIChfX2Rlc3QpKTsKKyAgcmV0dXJuIF9fc3RwbmNweV9hbGlhcyAoX19kZXN0LCBfX3NyYywgX19uKTsKK30KKworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorX19OVEggKHN0cmNhdCAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHJjYXRfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2JvcyAoX19kZXN0KSk7Cit9CisKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK19fTlRIIChzdHJuY2F0IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLAorCQlzaXplX3QgX19sZW4pKQoreworICByZXR1cm4gX19idWlsdGluX19fc3RybmNhdF9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX2JvcyAoX19kZXN0KSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdHJvcHRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdHJvcHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlMmMyYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0cm9wdHMuaApAQCAtMCwwICsxLDIzMSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVFJPUFRTX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3Ryb3B0cy5oPiBkaXJlY3RseTsgdXNlIDxzdHJvcHRzLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX0JJVFNfU1RST1BUU19ICisjZGVmaW5lIF9CSVRTX1NUUk9QVFNfSAkxCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIE1hY3JvcyB1c2VkIGFzIGByZXF1ZXN0JyBhcmd1bWVudCB0byBgaW9jdGwnLiAgKi8KKyNkZWZpbmUgX19TSUQJCSgnUycgPDwgOCkKKworI2RlZmluZSBJX05SRUFECSAgICAoX19TSUQgfCAxKQkvKiBDb3VudHMgdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIHRoZSBkYXRhCisJCQkJICAgYmxvY2sgaW4gdGhlIGZpcnN0IG1lc3NhZ2UuICAqLworI2RlZmluZSBJX1BVU0gJICAgIChfX1NJRCB8IDIpCS8qIFB1c2ggU1RSRUFNUyBtb2R1bGUgb250byB0b3Agb2YgdGhlIGN1cnJlbnQKKwkJCQkgICBTVFJFQU0sIGp1c3QgYmVsb3cgdGhlIFNUUkVBTSBoZWFkLiAgKi8KKyNkZWZpbmUgSV9QT1AJICAgIChfX1NJRCB8IDMpCS8qIFJlbW92ZSBTVFJFQU1TIG1vZHVsZSBmcm9tIGp1c3QgYmVsb3cgdGhlCisJCQkJICAgU1RSRUFNIGhlYWQuICAqLworI2RlZmluZSBJX0xPT0sJICAgIChfX1NJRCB8IDQpCS8qIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUganVzdCBiZWxvdworCQkJCSAgIHRoZSBTVFJFQU0gaGVhZCBhbmQgcGxhY2UgaXQgaW4gYSBjaGFyYWN0ZXIKKwkJCQkgICBzdHJpbmcuICAqLworI2RlZmluZSBJX0ZMVVNICSAgICAoX19TSUQgfCA1KQkvKiBGbHVzaCBhbGwgaW5wdXQgYW5kL29yIG91dHB1dC4gICovCisjZGVmaW5lIElfU1JET1BUICAgIChfX1NJRCB8IDYpCS8qIFNldHMgdGhlIHJlYWQgbW9kZS4gICovCisjZGVmaW5lIElfR1JET1BUICAgIChfX1NJRCB8IDcpCS8qIFJldHVybnMgdGhlIGN1cnJlbnQgcmVhZCBtb2RlIHNldHRpbmcuICAqLworI2RlZmluZSBJX1NUUgkgICAgKF9fU0lEIHwgOCkJLyogQ29uc3RydWN0IGFuIGludGVybmFsIFNUUkVBTVMgYGlvY3RsJworCQkJCSAgIG1lc3NhZ2UgYW5kIHNlbmQgdGhhdCBtZXNzYWdlIGRvd25zdHJlYW0uICovCisjZGVmaW5lIElfU0VUU0lHICAgIChfX1NJRCB8IDkpCS8qIEluZm9ybSB0aGUgU1RSRUFNIGhlYWQgdGhhdCB0aGUgcHJvY2VzcworCQkJCSAgIHdhbnRzIHRoZSBTSUdQT0xMIHNpZ25hbCBpc3N1ZWQuICAqLworI2RlZmluZSBJX0dFVFNJRyAgICAoX19TSUQgfDEwKSAvKiBSZXR1cm4gdGhlIGV2ZW50cyBmb3Igd2hpY2ggdGhlIGNhbGxpbmcKKwkJCQkgICBwcm9jZXNzIGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIHRvIGJlIHNlbnQKKwkJCQkgICBhIFNJR1BPTEwgc2lnbmFsLiAgKi8KKyNkZWZpbmUgSV9GSU5ECSAgICAoX19TSUQgfDExKSAvKiBDb21wYXJlcyB0aGUgbmFtZXMgb2YgYWxsIG1vZHVsZXMgY3VycmVudGx5CisJCQkJICAgcHJlc2VudCBpbiB0aGUgU1RSRUFNIHRvIHRoZSBuYW1lIHBvaW50ZWQgdG8KKwkJCQkgICBieSBgYXJnJy4gICovCisjZGVmaW5lIElfTElOSwkgICAgKF9fU0lEIHwxMikgLyogQ29ubmVjdCB0d28gU1RSRUFNcy4gICovCisjZGVmaW5lIElfVU5MSU5LICAgIChfX1NJRCB8MTMpIC8qIERpc2Nvbm5lY3RzIHRoZSB0d28gU1RSRUFNcy4gICovCisjZGVmaW5lIElfUEVFSwkgICAgKF9fU0lEIHwxNSkgLyogQWxsb3dzIGEgcHJvY2VzcyB0byByZXRyaWV2ZSB0aGUgaW5mb3JtYXRpb24KKwkJCQkgICBpbiB0aGUgZmlyc3QgbWVzc2FnZSBvbiB0aGUgU1RSRUFNIGhlYWQgcmVhZAorCQkJCSAgIHF1ZXVlIHdpdGhvdXQgdGFraW5nIHRoZSBtZXNzYWdlIG9mZiB0aGUKKwkJCQkgICBxdWV1ZS4gICovCisjZGVmaW5lIElfRkRJTlNFUlQgIChfX1NJRCB8MTYpIC8qIENyZWF0ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgc3BlY2lmaWVkCisJCQkJICAgYnVmZmVyKHMpLCBhZGRzIGluZm9ybWF0aW9uIGFib3V0IGFub3RoZXIKKwkJCQkgICBTVFJFQU0sIGFuZCBzZW5kIHRoZSBtZXNzYWdlIGRvd25zdHJlYW0uICAqLworI2RlZmluZSBJX1NFTkRGRCAgICAoX19TSUQgfDE3KSAvKiBSZXF1ZXN0cyB0aGUgU1RSRUFNIGFzc29jaWF0ZWQgd2l0aCBgZmlsZGVzJworCQkJCSAgIHRvIHNlbmQgYSBtZXNzYWdlLCBjb250YWluaW5nIGEgZmlsZQorCQkJCSAgIHBvaW50ZXIsIHRvIHRoZSBTVFJFQU0gaGVhZCBhdCB0aGUgb3RoZXIgZW5kCisJCQkJICAgb2YgYSBTVFJFQU1TIHBpcGUuICAqLworI2RlZmluZSBJX1JFQ1ZGRCAgICAoX19TSUQgfDE0KSAvKiBOb24tRUZUIGRlZmluaXRpb24uICAqLworI2RlZmluZSBJX1NXUk9QVCAgICAoX19TSUQgfDE5KSAvKiBTZXQgdGhlIHdyaXRlIG1vZGUuICAqLworI2RlZmluZSBJX0dXUk9QVCAgICAoX19TSUQgfDIwKSAvKiBSZXR1cm4gdGhlIGN1cnJlbnQgd3JpdGUgbW9kZSBzZXR0aW5nLiAgKi8KKyNkZWZpbmUgSV9MSVNUCSAgICAoX19TSUQgfDIxKSAvKiBMaXN0IGFsbCB0aGUgbW9kdWxlIG5hbWVzIG9uIHRoZSBTVFJFQU0sIHVwCisJCQkJICAgdG8gYW5kIGluY2x1ZGluZyB0aGUgdG9wbW9zdCBkcml2ZXIgbmFtZS4gKi8KKyNkZWZpbmUgSV9QTElOSwkgICAgKF9fU0lEIHwyMikgLyogQ29ubmVjdCB0d28gU1RSRUFNcyB3aXRoIGEgcGVyc2lzdGVudAorCQkJCSAgIGxpbmsuICAqLworI2RlZmluZSBJX1BVTkxJTksgICAoX19TSUQgfDIzKSAvKiBEaXNjb25uZWN0IHRoZSB0d28gU1RSRUFNcyB0aGF0IHdlcmUKKwkJCQkgICBjb25uZWN0ZWQgd2l0aCBhIHBlcnNpc3RlbnQgbGluay4gICovCisjZGVmaW5lIElfRkxVU0hCQU5EIChfX1NJRCB8MjgpIC8qIEZsdXNoIG9ubHkgYmFuZCBzcGVjaWZpZWQuICAqLworI2RlZmluZSBJX0NLQkFORCAgICAoX19TSUQgfDI5KSAvKiBDaGVjayBpZiB0aGUgbWVzc2FnZSBvZiBhIGdpdmVuIHByaW9yaXR5CisJCQkJICAgYmFuZCBleGlzdHMgb24gdGhlIFNUUkVBTSBoZWFkIHJlYWQKKwkJCQkgICBxdWV1ZS4gICovCisjZGVmaW5lIElfR0VUQkFORCAgIChfX1NJRCB8MzApIC8qIFJldHVybiB0aGUgcHJpb3JpdHkgYmFuZCBvZiB0aGUgZmlyc3QKKwkJCQkgICBtZXNzYWdlIG9uIHRoZSBTVFJFQU0gaGVhZCByZWFkIHF1ZXVlLiAgKi8KKyNkZWZpbmUgSV9BVE1BUksgICAgKF9fU0lEIHwzMSkgLyogU2VlIGlmIHRoZSBjdXJyZW50IG1lc3NhZ2Ugb24gdGhlIFNUUkVBTQorCQkJCSAgIGhlYWQgcmVhZCBxdWV1ZSBpcyAibWFya2VkIiBieSBzb21lIG1vZHVsZQorCQkJCSAgIGRvd25zdHJlYW0uICAqLworI2RlZmluZSBJX1NFVENMVElNRSAoX19TSUQgfDMyKSAvKiBTZXQgdGhlIHRpbWUgdGhlIFNUUkVBTSBoZWFkIHdpbGwgZGVsYXkgd2hlbgorCQkJCSAgIGEgU1RSRUFNIGlzIGNsb3NpbmcgYW5kIHRoZXJlIGlzIGRhdGEgb24KKwkJCQkgICB0aGUgd3JpdGUgcXVldWVzLiAgKi8KKyNkZWZpbmUgSV9HRVRDTFRJTUUgKF9fU0lEIHwzMykgLyogR2V0IGN1cnJlbnQgdmFsdWUgZm9yIGNsb3NpbmcgdGltZW91dC4gICovCisjZGVmaW5lIElfQ0FOUFVUICAgIChfX1NJRCB8MzQpIC8qIENoZWNrIGlmIGEgY2VydGFpbiBiYW5kIGlzIHdyaXRhYmxlLiAgKi8KKworCisvKiBVc2VkIGluIGBJX0xPT0snIHJlcXVlc3QuICAqLworI2RlZmluZSBGTU5BTUVTWgk4CS8qIGNvbXBhdGliaWxpdHkgdy9Vbml4V2FyZS9Tb2xhcmlzLiAgKi8KKworLyogRmx1c2ggb3B0aW9ucy4gICovCisjZGVmaW5lIEZMVVNIUgkJMHgwMQkvKiBGbHVzaCByZWFkIHF1ZXVlcy4gICovCisjZGVmaW5lIEZMVVNIVwkJMHgwMgkvKiBGbHVzaCB3cml0ZSBxdWV1ZXMuICAqLworI2RlZmluZSBGTFVTSFJXCQkweDAzCS8qIEZsdXNoIHJlYWQgYW5kIHdyaXRlIHF1ZXVlcy4gICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBGTFVTSEJBTkQJMHgwNAkvKiBGbHVzaCBvbmx5IHNwZWNpZmllZCBiYW5kLiAgKi8KKyNlbmRpZgorCisvKiBQb3NzaWJsZSBhcmd1bWVudHMgZm9yIGBJX1NFVFNJRycuICAqLworI2RlZmluZSBTX0lOUFVUCQkweDAwMDEJLyogQSBtZXNzYWdlLCBvdGhlciB0aGFuIGEgaGlnaC1wcmlvcml0eQorCQkJCSAgIG1lc3NhZ2UsIGhhcyBhcnJpdmVkLiAgKi8KKyNkZWZpbmUgU19ISVBSSQkJMHgwMDAyCS8qIEEgaGlnaC1wcmlvcml0eSBtZXNzYWdlIGlzIHByZXNlbnQuICAqLworI2RlZmluZSBTX09VVFBVVAkweDAwMDQJLyogVGhlIHdyaXRlIHF1ZXVlIGZvciBub3JtYWwgZGF0YSBpcyBubyBsb25nZXIKKwkJCQkgICBmdWxsLiAgKi8KKyNkZWZpbmUgU19NU0cJCTB4MDAwOAkvKiBBIFNUUkVBTVMgc2lnbmFsIG1lc3NhZ2UgdGhhdCBjb250YWlucyB0aGUKKwkJCQkgICBTSUdQT0xMIHNpZ25hbCByZWFjaGVzIHRoZSBmcm9udCBvZiB0aGUKKwkJCQkgICBTVFJFQU0gaGVhZCByZWFkIHF1ZXVlLiAgKi8KKyNkZWZpbmUgU19FUlJPUgkJMHgwMDEwCS8qIE5vdGlmaWNhdGlvbiBvZiBhbiBlcnJvciBjb25kaXRpb24uICAqLworI2RlZmluZSBTX0hBTkdVUAkweDAwMjAJLyogTm90aWZpY2F0aW9uIG9mIGEgaGFuZ3VwLiAgKi8KKyNkZWZpbmUgU19SRE5PUk0JMHgwMDQwCS8qIEEgbm9ybWFsIG1lc3NhZ2UgaGFzIGFycml2ZWQuICAqLworI2RlZmluZSBTX1dSTk9STQlTX09VVFBVVAorI2RlZmluZSBTX1JEQkFORAkweDAwODAJLyogQSBtZXNzYWdlIHdpdGggYSBub24temVybyBwcmlvcml0eSBoYXMKKwkJCQkgICBhcnJpdmVkLiAgKi8KKyNkZWZpbmUgU19XUkJBTkQJMHgwMTAwCS8qIFRoZSB3cml0ZSBxdWV1ZSBmb3IgYSBub24temVybyBwcmlvcml0eQorCQkJCSAgIGJhbmQgaXMgbm8gbG9uZ2VyIGZ1bGwuICAqLworI2RlZmluZSBTX0JBTkRVUkcJMHgwMjAwCS8qIFdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNfUkRCQU5ELAorCQkJCSAgIFNJR1VSRyBpcyBnZW5lcmF0ZWQgaW5zdGVhZCBvZiBTSUdQT0xMIHdoZW4KKwkJCQkgICBhIHByaW9yaXR5IG1lc3NhZ2UgcmVhY2hlcyB0aGUgZnJvbnQgb2YgdGhlCisJCQkJICAgU1RSRUFNIGhlYWQgcmVhZCBxdWV1ZS4gICovCisKKy8qIE9wdGlvbiBmb3IgYElfUEVFSycuICAqLworI2RlZmluZSBSU19ISVBSSQkweDAxCS8qIE9ubHkgbG9vayBmb3IgaGlnaC1wcmlvcml0eSBtZXNzYWdlcy4gICovCisKKy8qIE9wdGlvbnMgZm9yIGBJX1NSRE9QVCcuICAqLworI2RlZmluZSBSTk9STQkJMHgwMDAwCS8qIEJ5dGUtU1RSRUFNIG1vZGUsIHRoZSBkZWZhdWx0LiAgKi8KKyNkZWZpbmUgUk1TR0QJCTB4MDAwMQkvKiBNZXNzYWdlLWRpc2NhcmQgbW9kZS4gICAqLworI2RlZmluZSBSTVNHTgkJMHgwMDAyCS8qIE1lc3NhZ2Utbm9uZGlzY2FyZCBtb2RlLiAgICovCisjZGVmaW5lIFJQUk9UREFUCTB4MDAwNAkvKiBEZWxpdmVyIHRoZSBjb250cm9sIHBhcnQgb2YgYSBtZXNzYWdlIGFzCisJCQkJICAgZGF0YS4gICovCisjZGVmaW5lIFJQUk9URElTCTB4MDAwOAkvKiBEaXNjYXJkIHRoZSBjb250cm9sIHBhcnQgb2YgYSBtZXNzYWdlLAorCQkJCSAgIGRlbGl2ZXJpbmcgYW55IGRhdGEgcGFydC4gICovCisjZGVmaW5lIFJQUk9UTk9STQkweDAwMTAJLyogRmFpbCBgcmVhZCcgd2l0aCBFQkFETVNHIGlmIGEgbWVzc2FnZQorCQkJCSAgIGNvbnRhaW5pbmcgYSBjb250cm9sIHBhcnQgaXMgYXQgdGhlIGZyb250CisJCQkJICAgb2YgdGhlIFNUUkVBTSBoZWFkIHJlYWQgcXVldWUuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgUlBST1RNQVNLCTB4MDAxQwkvKiBUaGUgUlBST1QgYml0cyAqLworI2VuZGlmCisKKy8qIFBvc3NpYmxlIG1vZGUgZm9yIGBJX1NXUk9QVCcuICAqLworI2RlZmluZSBTTkRaRVJPCQkweDAwMQkvKiBTZW5kIGEgemVyby1sZW5ndGggbWVzc2FnZSBkb3duc3RyZWFtIHdoZW4gYQorCQkJCSAgIGB3cml0ZScgb2YgMCBieXRlcyBvY2N1cnMuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgU05EUElQRQkweDAwMgkvKiBTZW5kIFNJR1BJUEUgb24gd3JpdGUgYW5kIHB1dG1zZyBpZgorCQkJCSAgIHNkX3dlcnJvciBpcyBzZXQuICAqLworI2VuZGlmCisKKy8qIEFyZ3VtZW50cyBmb3IgYElfQVRNQVJLJy4gICovCisjZGVmaW5lIEFOWU1BUksJCTB4MDEJLyogQ2hlY2sgaWYgdGhlIG1lc3NhZ2UgaXMgbWFya2VkLiAgKi8KKyNkZWZpbmUgTEFTVE1BUksJMHgwMgkvKiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyB0aGUgbGFzdCBvbmUgbWFya2VkCisJCQkJICAgb24gdGhlIHF1ZXVlLiAgKi8KKworLyogQXJndW1lbnQgZm9yIGBJX1VOTElOSycuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTVVYSURfQUxMCSgtMSkJLyogVW5saW5rIGFsbCBTVFJFQU1zIGxpbmtlZCB0byB0aGUgU1RSRUFNCisJCQkJICAgYXNzb2NpYXRlZCB3aXRoIGBmaWxkZXMnLiAgKi8KKyNlbmRpZgorCisKKy8qIE1hY3JvcyBmb3IgYGdldG1zZycsIGBnZXRwbXNnJywgYHB1dG1zZycgYW5kIGBwdXRwbXNnJy4gICovCisjZGVmaW5lIE1TR19ISVBSSQkweDAxCS8qIFNlbmQvcmVjZWl2ZSBoaWdoIHByaW9yaXR5IG1lc3NhZ2UuICAqLworI2RlZmluZSBNU0dfQU5ZCQkweDAyCS8qIFJlY2VpdmUgYW55IG1lc3NhZ2UuICAqLworI2RlZmluZSBNU0dfQkFORAkweDA0CS8qIFJlY2VpdmUgbWVzc2FnZSBmcm9tIHNwZWNpZmllZCBiYW5kLiAgKi8KKworLyogVmFsdWVzIHJldHVybmVkIGJ5IGdldG1zZyBhbmQgZ2V0cG1zZyAqLworI2RlZmluZSBNT1JFQ1RMCQkxCS8qIE1vcmUgY29udHJvbCBpbmZvcm1hdGlvbiBpcyBsZWZ0IGluCisJCQkJICAgbWVzc2FnZS4gICovCisjZGVmaW5lIE1PUkVEQVRBCTIJLyogTW9yZSBkYXRhIGlzIGxlZnQgaW4gbWVzc2FnZS4gICovCisKKworLyogU3RydWN0dXJlIHVzZWQgZm9yIHRoZSBJX0ZMVVNIQkFORCBpb2N0bCBvbiBzdHJlYW1zLiAgKi8KK3N0cnVjdCBiYW5kaW5mbworICB7CisgICAgdW5zaWduZWQgY2hhciBiaV9wcmk7CisgICAgaW50IGJpX2ZsYWc7CisgIH07CisKK3N0cnVjdCBzdHJidWYKKyAgeworICAgIGludCBtYXhsZW47CQkvKiBNYXhpbXVtIGJ1ZmZlciBsZW5ndGguICAqLworICAgIGludCBsZW47CQkvKiBMZW5ndGggb2YgZGF0YS4gICovCisgICAgY2hhciAqYnVmOwkJLyogUG9pbnRlciB0byBidWZmZXIuICAqLworICB9OworCitzdHJ1Y3Qgc3RycGVlaworICB7CisgICAgc3RydWN0IHN0cmJ1ZiBjdGxidWY7CisgICAgc3RydWN0IHN0cmJ1ZiBkYXRhYnVmOworICAgIHRfdXNjYWxhcl90IGZsYWdzOwkJCS8qIFVuaXhXYXJlL1NvbGFyaXMgY29tcGF0aWJpbGl0eS4gICovCisgIH07CisKK3N0cnVjdCBzdHJmZGluc2VydAorICB7CisgICAgc3RydWN0IHN0cmJ1ZiBjdGxidWY7CisgICAgc3RydWN0IHN0cmJ1ZiBkYXRhYnVmOworICAgIHRfdXNjYWxhcl90IGZsYWdzOwkJCS8qIFVuaXhXYXJlL1NvbGFyaXMgY29tcGF0aWJpbGl0eS4gICovCisgICAgaW50IGZpbGRlczsKKyAgICBpbnQgb2Zmc2V0OworICB9OworCitzdHJ1Y3Qgc3RyaW9jdGwKKyAgeworICAgIGludCBpY19jbWQ7CisgICAgaW50IGljX3RpbW91dDsKKyAgICBpbnQgaWNfbGVuOworICAgIGNoYXIgKmljX2RwOworICB9OworCitzdHJ1Y3Qgc3RycmVjdmZkCisgIHsKKyAgICBpbnQgZmQ7CisgICAgdWlkX3QgdWlkOworICAgIGdpZF90IGdpZDsKKyAgICBjaGFyIF9fZmlsbFs4XTsJCQkvKiBVbml4V2FyZS9Tb2xhcmlzIGNvbXBhdGliaWxpdHkgKi8KKyAgfTsKKworCitzdHJ1Y3Qgc3RyX21saXN0CisgIHsKKyAgICBjaGFyIGxfbmFtZVtGTU5BTUVTWiArIDFdOworICB9OworCitzdHJ1Y3Qgc3RyX2xpc3QKKyAgeworICAgIGludCBzbF9ubW9kczsKKyAgICBzdHJ1Y3Qgc3RyX21saXN0ICpzbF9tb2RsaXN0OworICB9OworCisjZW5kaWYgLyogYml0cy9zdHJvcHRzLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N5c19lcnJsaXN0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zeXNfZXJybGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTU2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zeXNfZXJybGlzdC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIERlY2xhcmUgc3lzX2Vycmxpc3QgYW5kIHN5c19uZXJyLCBvciBkb24ndC4gIENvbXBhdGliaWxpdHkgKGRvKSB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVERJT19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N5c19lcnJsaXN0Lmg+IGRpcmVjdGx5OyB1c2UgPHN0ZGlvLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIHN5c19lcnJsaXN0IGFuZCBzeXNfbmVyciBhcmUgZGVwcmVjYXRlZC4gIFVzZSBzdHJlcnJvciBpbnN0ZWFkLiAgKi8KKworI2lmZGVmICBfX1VTRV9CU0QKK2V4dGVybiBpbnQgc3lzX25lcnI7CitleHRlcm4gX19jb25zdCBjaGFyICpfX2NvbnN0IHN5c19lcnJsaXN0W107CisjZW5kaWYKKyNpZmRlZiAgX19VU0VfR05VCitleHRlcm4gaW50IF9zeXNfbmVycjsKK2V4dGVybiBfX2NvbnN0IGNoYXIgKl9fY29uc3QgX3N5c19lcnJsaXN0W107CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N5c2NhbGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjE0MWRhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3lzY2FsbC5oCkBAIC0wLDAgKzEsNjcwIEBACisvKiBHZW5lcmF0ZWQgYXQgbGliYyBidWlsZCB0aW1lIGZyb20ga2VybmVsIHN5c2NhbGwgbGlzdC4gICovCisKKyNpZm5kZWYgX1NZU0NBTExfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3N5c2NhbGwuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9zeXNjYWxsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKyNpZiBfX1dPUkRTSVpFID09IDMyCisjZGVmaW5lIFNZU19fbGxzZWVrIF9fTlJfX2xsc2VlaworI2RlZmluZSBTWVNfX25ld3NlbGVjdCBfX05SX19uZXdzZWxlY3QKKyNkZWZpbmUgU1lTX19zeXNjdGwgX19OUl9fc3lzY3RsCisjZGVmaW5lIFNZU19hY2Nlc3MgX19OUl9hY2Nlc3MKKyNkZWZpbmUgU1lTX2FjY3QgX19OUl9hY2N0CisjZGVmaW5lIFNZU19hZGRfa2V5IF9fTlJfYWRkX2tleQorI2RlZmluZSBTWVNfYWRqdGltZXggX19OUl9hZGp0aW1leAorI2RlZmluZSBTWVNfYWZzX3N5c2NhbGwgX19OUl9hZnNfc3lzY2FsbAorI2RlZmluZSBTWVNfYWxhcm0gX19OUl9hbGFybQorI2RlZmluZSBTWVNfYmRmbHVzaCBfX05SX2JkZmx1c2gKKyNkZWZpbmUgU1lTX2JyZWFrIF9fTlJfYnJlYWsKKyNkZWZpbmUgU1lTX2JyayBfX05SX2JyaworI2RlZmluZSBTWVNfY2FwZ2V0IF9fTlJfY2FwZ2V0CisjZGVmaW5lIFNZU19jYXBzZXQgX19OUl9jYXBzZXQKKyNkZWZpbmUgU1lTX2NoZGlyIF9fTlJfY2hkaXIKKyNkZWZpbmUgU1lTX2NobW9kIF9fTlJfY2htb2QKKyNkZWZpbmUgU1lTX2Nob3duIF9fTlJfY2hvd24KKyNkZWZpbmUgU1lTX2Nob3duMzIgX19OUl9jaG93bjMyCisjZGVmaW5lIFNZU19jaHJvb3QgX19OUl9jaHJvb3QKKyNkZWZpbmUgU1lTX2Nsb2NrX2FkanRpbWUgX19OUl9jbG9ja19hZGp0aW1lCisjZGVmaW5lIFNZU19jbG9ja19nZXRyZXMgX19OUl9jbG9ja19nZXRyZXMKKyNkZWZpbmUgU1lTX2Nsb2NrX2dldHRpbWUgX19OUl9jbG9ja19nZXR0aW1lCisjZGVmaW5lIFNZU19jbG9ja19uYW5vc2xlZXAgX19OUl9jbG9ja19uYW5vc2xlZXAKKyNkZWZpbmUgU1lTX2Nsb2NrX3NldHRpbWUgX19OUl9jbG9ja19zZXR0aW1lCisjZGVmaW5lIFNZU19jbG9uZSBfX05SX2Nsb25lCisjZGVmaW5lIFNZU19jbG9zZSBfX05SX2Nsb3NlCisjZGVmaW5lIFNZU19jcmVhdCBfX05SX2NyZWF0CisjZGVmaW5lIFNZU19jcmVhdGVfbW9kdWxlIF9fTlJfY3JlYXRlX21vZHVsZQorI2RlZmluZSBTWVNfZGVsZXRlX21vZHVsZSBfX05SX2RlbGV0ZV9tb2R1bGUKKyNkZWZpbmUgU1lTX2R1cCBfX05SX2R1cAorI2RlZmluZSBTWVNfZHVwMiBfX05SX2R1cDIKKyNkZWZpbmUgU1lTX2R1cDMgX19OUl9kdXAzCisjZGVmaW5lIFNZU19lcG9sbF9jcmVhdGUgX19OUl9lcG9sbF9jcmVhdGUKKyNkZWZpbmUgU1lTX2Vwb2xsX2NyZWF0ZTEgX19OUl9lcG9sbF9jcmVhdGUxCisjZGVmaW5lIFNZU19lcG9sbF9jdGwgX19OUl9lcG9sbF9jdGwKKyNkZWZpbmUgU1lTX2Vwb2xsX3B3YWl0IF9fTlJfZXBvbGxfcHdhaXQKKyNkZWZpbmUgU1lTX2Vwb2xsX3dhaXQgX19OUl9lcG9sbF93YWl0CisjZGVmaW5lIFNZU19ldmVudGZkIF9fTlJfZXZlbnRmZAorI2RlZmluZSBTWVNfZXZlbnRmZDIgX19OUl9ldmVudGZkMgorI2RlZmluZSBTWVNfZXhlY3ZlIF9fTlJfZXhlY3ZlCisjZGVmaW5lIFNZU19leGl0IF9fTlJfZXhpdAorI2RlZmluZSBTWVNfZXhpdF9ncm91cCBfX05SX2V4aXRfZ3JvdXAKKyNkZWZpbmUgU1lTX2ZhY2Nlc3NhdCBfX05SX2ZhY2Nlc3NhdAorI2RlZmluZSBTWVNfZmFkdmlzZTY0IF9fTlJfZmFkdmlzZTY0CisjZGVmaW5lIFNZU19mYWR2aXNlNjRfNjQgX19OUl9mYWR2aXNlNjRfNjQKKyNkZWZpbmUgU1lTX2ZhbGxvY2F0ZSBfX05SX2ZhbGxvY2F0ZQorI2RlZmluZSBTWVNfZmFub3RpZnlfaW5pdCBfX05SX2Zhbm90aWZ5X2luaXQKKyNkZWZpbmUgU1lTX2Zhbm90aWZ5X21hcmsgX19OUl9mYW5vdGlmeV9tYXJrCisjZGVmaW5lIFNZU19mY2hkaXIgX19OUl9mY2hkaXIKKyNkZWZpbmUgU1lTX2ZjaG1vZCBfX05SX2ZjaG1vZAorI2RlZmluZSBTWVNfZmNobW9kYXQgX19OUl9mY2htb2RhdAorI2RlZmluZSBTWVNfZmNob3duIF9fTlJfZmNob3duCisjZGVmaW5lIFNZU19mY2hvd24zMiBfX05SX2ZjaG93bjMyCisjZGVmaW5lIFNZU19mY2hvd25hdCBfX05SX2ZjaG93bmF0CisjZGVmaW5lIFNZU19mY250bCBfX05SX2ZjbnRsCisjZGVmaW5lIFNZU19mY250bDY0IF9fTlJfZmNudGw2NAorI2RlZmluZSBTWVNfZmRhdGFzeW5jIF9fTlJfZmRhdGFzeW5jCisjZGVmaW5lIFNZU19mZ2V0eGF0dHIgX19OUl9mZ2V0eGF0dHIKKyNkZWZpbmUgU1lTX2ZsaXN0eGF0dHIgX19OUl9mbGlzdHhhdHRyCisjZGVmaW5lIFNZU19mbG9jayBfX05SX2Zsb2NrCisjZGVmaW5lIFNZU19mb3JrIF9fTlJfZm9yaworI2RlZmluZSBTWVNfZnJlbW92ZXhhdHRyIF9fTlJfZnJlbW92ZXhhdHRyCisjZGVmaW5lIFNZU19mc2V0eGF0dHIgX19OUl9mc2V0eGF0dHIKKyNkZWZpbmUgU1lTX2ZzdGF0IF9fTlJfZnN0YXQKKyNkZWZpbmUgU1lTX2ZzdGF0NjQgX19OUl9mc3RhdDY0CisjZGVmaW5lIFNZU19mc3RhdGF0NjQgX19OUl9mc3RhdGF0NjQKKyNkZWZpbmUgU1lTX2ZzdGF0ZnMgX19OUl9mc3RhdGZzCisjZGVmaW5lIFNZU19mc3RhdGZzNjQgX19OUl9mc3RhdGZzNjQKKyNkZWZpbmUgU1lTX2ZzeW5jIF9fTlJfZnN5bmMKKyNkZWZpbmUgU1lTX2Z0aW1lIF9fTlJfZnRpbWUKKyNkZWZpbmUgU1lTX2Z0cnVuY2F0ZSBfX05SX2Z0cnVuY2F0ZQorI2RlZmluZSBTWVNfZnRydW5jYXRlNjQgX19OUl9mdHJ1bmNhdGU2NAorI2RlZmluZSBTWVNfZnV0ZXggX19OUl9mdXRleAorI2RlZmluZSBTWVNfZnV0aW1lc2F0IF9fTlJfZnV0aW1lc2F0CisjZGVmaW5lIFNZU19nZXRfa2VybmVsX3N5bXMgX19OUl9nZXRfa2VybmVsX3N5bXMKKyNkZWZpbmUgU1lTX2dldF9tZW1wb2xpY3kgX19OUl9nZXRfbWVtcG9saWN5CisjZGVmaW5lIFNZU19nZXRfcm9idXN0X2xpc3QgX19OUl9nZXRfcm9idXN0X2xpc3QKKyNkZWZpbmUgU1lTX2dldF90aHJlYWRfYXJlYSBfX05SX2dldF90aHJlYWRfYXJlYQorI2RlZmluZSBTWVNfZ2V0Y3B1IF9fTlJfZ2V0Y3B1CisjZGVmaW5lIFNZU19nZXRjd2QgX19OUl9nZXRjd2QKKyNkZWZpbmUgU1lTX2dldGRlbnRzIF9fTlJfZ2V0ZGVudHMKKyNkZWZpbmUgU1lTX2dldGRlbnRzNjQgX19OUl9nZXRkZW50czY0CisjZGVmaW5lIFNZU19nZXRlZ2lkIF9fTlJfZ2V0ZWdpZAorI2RlZmluZSBTWVNfZ2V0ZWdpZDMyIF9fTlJfZ2V0ZWdpZDMyCisjZGVmaW5lIFNZU19nZXRldWlkIF9fTlJfZ2V0ZXVpZAorI2RlZmluZSBTWVNfZ2V0ZXVpZDMyIF9fTlJfZ2V0ZXVpZDMyCisjZGVmaW5lIFNZU19nZXRnaWQgX19OUl9nZXRnaWQKKyNkZWZpbmUgU1lTX2dldGdpZDMyIF9fTlJfZ2V0Z2lkMzIKKyNkZWZpbmUgU1lTX2dldGdyb3VwcyBfX05SX2dldGdyb3VwcworI2RlZmluZSBTWVNfZ2V0Z3JvdXBzMzIgX19OUl9nZXRncm91cHMzMgorI2RlZmluZSBTWVNfZ2V0aXRpbWVyIF9fTlJfZ2V0aXRpbWVyCisjZGVmaW5lIFNZU19nZXRwZ2lkIF9fTlJfZ2V0cGdpZAorI2RlZmluZSBTWVNfZ2V0cGdycCBfX05SX2dldHBncnAKKyNkZWZpbmUgU1lTX2dldHBpZCBfX05SX2dldHBpZAorI2RlZmluZSBTWVNfZ2V0cG1zZyBfX05SX2dldHBtc2cKKyNkZWZpbmUgU1lTX2dldHBwaWQgX19OUl9nZXRwcGlkCisjZGVmaW5lIFNZU19nZXRwcmlvcml0eSBfX05SX2dldHByaW9yaXR5CisjZGVmaW5lIFNZU19nZXRyZXNnaWQgX19OUl9nZXRyZXNnaWQKKyNkZWZpbmUgU1lTX2dldHJlc2dpZDMyIF9fTlJfZ2V0cmVzZ2lkMzIKKyNkZWZpbmUgU1lTX2dldHJlc3VpZCBfX05SX2dldHJlc3VpZAorI2RlZmluZSBTWVNfZ2V0cmVzdWlkMzIgX19OUl9nZXRyZXN1aWQzMgorI2RlZmluZSBTWVNfZ2V0cmxpbWl0IF9fTlJfZ2V0cmxpbWl0CisjZGVmaW5lIFNZU19nZXRydXNhZ2UgX19OUl9nZXRydXNhZ2UKKyNkZWZpbmUgU1lTX2dldHNpZCBfX05SX2dldHNpZAorI2RlZmluZSBTWVNfZ2V0dGlkIF9fTlJfZ2V0dGlkCisjZGVmaW5lIFNZU19nZXR0aW1lb2ZkYXkgX19OUl9nZXR0aW1lb2ZkYXkKKyNkZWZpbmUgU1lTX2dldHVpZCBfX05SX2dldHVpZAorI2RlZmluZSBTWVNfZ2V0dWlkMzIgX19OUl9nZXR1aWQzMgorI2RlZmluZSBTWVNfZ2V0eGF0dHIgX19OUl9nZXR4YXR0cgorI2RlZmluZSBTWVNfZ3R0eSBfX05SX2d0dHkKKyNkZWZpbmUgU1lTX2lkbGUgX19OUl9pZGxlCisjZGVmaW5lIFNZU19pbml0X21vZHVsZSBfX05SX2luaXRfbW9kdWxlCisjZGVmaW5lIFNZU19pbm90aWZ5X2FkZF93YXRjaCBfX05SX2lub3RpZnlfYWRkX3dhdGNoCisjZGVmaW5lIFNZU19pbm90aWZ5X2luaXQgX19OUl9pbm90aWZ5X2luaXQKKyNkZWZpbmUgU1lTX2lub3RpZnlfaW5pdDEgX19OUl9pbm90aWZ5X2luaXQxCisjZGVmaW5lIFNZU19pbm90aWZ5X3JtX3dhdGNoIF9fTlJfaW5vdGlmeV9ybV93YXRjaAorI2RlZmluZSBTWVNfaW9fY2FuY2VsIF9fTlJfaW9fY2FuY2VsCisjZGVmaW5lIFNZU19pb19kZXN0cm95IF9fTlJfaW9fZGVzdHJveQorI2RlZmluZSBTWVNfaW9fZ2V0ZXZlbnRzIF9fTlJfaW9fZ2V0ZXZlbnRzCisjZGVmaW5lIFNZU19pb19zZXR1cCBfX05SX2lvX3NldHVwCisjZGVmaW5lIFNZU19pb19zdWJtaXQgX19OUl9pb19zdWJtaXQKKyNkZWZpbmUgU1lTX2lvY3RsIF9fTlJfaW9jdGwKKyNkZWZpbmUgU1lTX2lvcGVybSBfX05SX2lvcGVybQorI2RlZmluZSBTWVNfaW9wbCBfX05SX2lvcGwKKyNkZWZpbmUgU1lTX2lvcHJpb19nZXQgX19OUl9pb3ByaW9fZ2V0CisjZGVmaW5lIFNZU19pb3ByaW9fc2V0IF9fTlJfaW9wcmlvX3NldAorI2RlZmluZSBTWVNfaXBjIF9fTlJfaXBjCisjZGVmaW5lIFNZU19rZXhlY19sb2FkIF9fTlJfa2V4ZWNfbG9hZAorI2RlZmluZSBTWVNfa2V5Y3RsIF9fTlJfa2V5Y3RsCisjZGVmaW5lIFNZU19raWxsIF9fTlJfa2lsbAorI2RlZmluZSBTWVNfbGNob3duIF9fTlJfbGNob3duCisjZGVmaW5lIFNZU19sY2hvd24zMiBfX05SX2xjaG93bjMyCisjZGVmaW5lIFNZU19sZ2V0eGF0dHIgX19OUl9sZ2V0eGF0dHIKKyNkZWZpbmUgU1lTX2xpbmsgX19OUl9saW5rCisjZGVmaW5lIFNZU19saW5rYXQgX19OUl9saW5rYXQKKyNkZWZpbmUgU1lTX2xpc3R4YXR0ciBfX05SX2xpc3R4YXR0cgorI2RlZmluZSBTWVNfbGxpc3R4YXR0ciBfX05SX2xsaXN0eGF0dHIKKyNkZWZpbmUgU1lTX2xvY2sgX19OUl9sb2NrCisjZGVmaW5lIFNZU19sb29rdXBfZGNvb2tpZSBfX05SX2xvb2t1cF9kY29va2llCisjZGVmaW5lIFNZU19scmVtb3ZleGF0dHIgX19OUl9scmVtb3ZleGF0dHIKKyNkZWZpbmUgU1lTX2xzZWVrIF9fTlJfbHNlZWsKKyNkZWZpbmUgU1lTX2xzZXR4YXR0ciBfX05SX2xzZXR4YXR0cgorI2RlZmluZSBTWVNfbHN0YXQgX19OUl9sc3RhdAorI2RlZmluZSBTWVNfbHN0YXQ2NCBfX05SX2xzdGF0NjQKKyNkZWZpbmUgU1lTX21hZHZpc2UgX19OUl9tYWR2aXNlCisjZGVmaW5lIFNZU19tYWR2aXNlMSBfX05SX21hZHZpc2UxCisjZGVmaW5lIFNZU19tYmluZCBfX05SX21iaW5kCisjZGVmaW5lIFNZU19taWdyYXRlX3BhZ2VzIF9fTlJfbWlncmF0ZV9wYWdlcworI2RlZmluZSBTWVNfbWluY29yZSBfX05SX21pbmNvcmUKKyNkZWZpbmUgU1lTX21rZGlyIF9fTlJfbWtkaXIKKyNkZWZpbmUgU1lTX21rZGlyYXQgX19OUl9ta2RpcmF0CisjZGVmaW5lIFNZU19ta25vZCBfX05SX21rbm9kCisjZGVmaW5lIFNZU19ta25vZGF0IF9fTlJfbWtub2RhdAorI2RlZmluZSBTWVNfbWxvY2sgX19OUl9tbG9jaworI2RlZmluZSBTWVNfbWxvY2thbGwgX19OUl9tbG9ja2FsbAorI2RlZmluZSBTWVNfbW1hcCBfX05SX21tYXAKKyNkZWZpbmUgU1lTX21tYXAyIF9fTlJfbW1hcDIKKyNkZWZpbmUgU1lTX21vZGlmeV9sZHQgX19OUl9tb2RpZnlfbGR0CisjZGVmaW5lIFNZU19tb3VudCBfX05SX21vdW50CisjZGVmaW5lIFNZU19tb3ZlX3BhZ2VzIF9fTlJfbW92ZV9wYWdlcworI2RlZmluZSBTWVNfbXByb3RlY3QgX19OUl9tcHJvdGVjdAorI2RlZmluZSBTWVNfbXB4IF9fTlJfbXB4CisjZGVmaW5lIFNZU19tcV9nZXRzZXRhdHRyIF9fTlJfbXFfZ2V0c2V0YXR0cgorI2RlZmluZSBTWVNfbXFfbm90aWZ5IF9fTlJfbXFfbm90aWZ5CisjZGVmaW5lIFNZU19tcV9vcGVuIF9fTlJfbXFfb3BlbgorI2RlZmluZSBTWVNfbXFfdGltZWRyZWNlaXZlIF9fTlJfbXFfdGltZWRyZWNlaXZlCisjZGVmaW5lIFNZU19tcV90aW1lZHNlbmQgX19OUl9tcV90aW1lZHNlbmQKKyNkZWZpbmUgU1lTX21xX3VubGluayBfX05SX21xX3VubGluaworI2RlZmluZSBTWVNfbXJlbWFwIF9fTlJfbXJlbWFwCisjZGVmaW5lIFNZU19tc3luYyBfX05SX21zeW5jCisjZGVmaW5lIFNZU19tdW5sb2NrIF9fTlJfbXVubG9jaworI2RlZmluZSBTWVNfbXVubG9ja2FsbCBfX05SX211bmxvY2thbGwKKyNkZWZpbmUgU1lTX211bm1hcCBfX05SX211bm1hcAorI2RlZmluZSBTWVNfbmFtZV90b19oYW5kbGVfYXQgX19OUl9uYW1lX3RvX2hhbmRsZV9hdAorI2RlZmluZSBTWVNfbmFub3NsZWVwIF9fTlJfbmFub3NsZWVwCisjZGVmaW5lIFNZU19uZnNzZXJ2Y3RsIF9fTlJfbmZzc2VydmN0bAorI2RlZmluZSBTWVNfbmljZSBfX05SX25pY2UKKyNkZWZpbmUgU1lTX29sZGZzdGF0IF9fTlJfb2xkZnN0YXQKKyNkZWZpbmUgU1lTX29sZGxzdGF0IF9fTlJfb2xkbHN0YXQKKyNkZWZpbmUgU1lTX29sZG9sZHVuYW1lIF9fTlJfb2xkb2xkdW5hbWUKKyNkZWZpbmUgU1lTX29sZHN0YXQgX19OUl9vbGRzdGF0CisjZGVmaW5lIFNZU19vbGR1bmFtZSBfX05SX29sZHVuYW1lCisjZGVmaW5lIFNZU19vcGVuIF9fTlJfb3BlbgorI2RlZmluZSBTWVNfb3Blbl9ieV9oYW5kbGVfYXQgX19OUl9vcGVuX2J5X2hhbmRsZV9hdAorI2RlZmluZSBTWVNfb3BlbmF0IF9fTlJfb3BlbmF0CisjZGVmaW5lIFNZU19wYXVzZSBfX05SX3BhdXNlCisjZGVmaW5lIFNZU19wZXJmX2V2ZW50X29wZW4gX19OUl9wZXJmX2V2ZW50X29wZW4KKyNkZWZpbmUgU1lTX3BlcnNvbmFsaXR5IF9fTlJfcGVyc29uYWxpdHkKKyNkZWZpbmUgU1lTX3BpcGUgX19OUl9waXBlCisjZGVmaW5lIFNZU19waXBlMiBfX05SX3BpcGUyCisjZGVmaW5lIFNZU19waXZvdF9yb290IF9fTlJfcGl2b3Rfcm9vdAorI2RlZmluZSBTWVNfcG9sbCBfX05SX3BvbGwKKyNkZWZpbmUgU1lTX3Bwb2xsIF9fTlJfcHBvbGwKKyNkZWZpbmUgU1lTX3ByY3RsIF9fTlJfcHJjdGwKKyNkZWZpbmUgU1lTX3ByZWFkNjQgX19OUl9wcmVhZDY0CisjZGVmaW5lIFNZU19wcmVhZHYgX19OUl9wcmVhZHYKKyNkZWZpbmUgU1lTX3BybGltaXQ2NCBfX05SX3BybGltaXQ2NAorI2RlZmluZSBTWVNfcHJvY2Vzc192bV9yZWFkdiBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYKKyNkZWZpbmUgU1lTX3Byb2Nlc3Nfdm1fd3JpdGV2IF9fTlJfcHJvY2Vzc192bV93cml0ZXYKKyNkZWZpbmUgU1lTX3Byb2YgX19OUl9wcm9mCisjZGVmaW5lIFNZU19wcm9maWwgX19OUl9wcm9maWwKKyNkZWZpbmUgU1lTX3BzZWxlY3Q2IF9fTlJfcHNlbGVjdDYKKyNkZWZpbmUgU1lTX3B0cmFjZSBfX05SX3B0cmFjZQorI2RlZmluZSBTWVNfcHV0cG1zZyBfX05SX3B1dHBtc2cKKyNkZWZpbmUgU1lTX3B3cml0ZTY0IF9fTlJfcHdyaXRlNjQKKyNkZWZpbmUgU1lTX3B3cml0ZXYgX19OUl9wd3JpdGV2CisjZGVmaW5lIFNZU19xdWVyeV9tb2R1bGUgX19OUl9xdWVyeV9tb2R1bGUKKyNkZWZpbmUgU1lTX3F1b3RhY3RsIF9fTlJfcXVvdGFjdGwKKyNkZWZpbmUgU1lTX3JlYWQgX19OUl9yZWFkCisjZGVmaW5lIFNZU19yZWFkYWhlYWQgX19OUl9yZWFkYWhlYWQKKyNkZWZpbmUgU1lTX3JlYWRkaXIgX19OUl9yZWFkZGlyCisjZGVmaW5lIFNZU19yZWFkbGluayBfX05SX3JlYWRsaW5rCisjZGVmaW5lIFNZU19yZWFkbGlua2F0IF9fTlJfcmVhZGxpbmthdAorI2RlZmluZSBTWVNfcmVhZHYgX19OUl9yZWFkdgorI2RlZmluZSBTWVNfcmVib290IF9fTlJfcmVib290CisjZGVmaW5lIFNZU19yZWN2bW1zZyBfX05SX3JlY3ZtbXNnCisjZGVmaW5lIFNZU19yZW1hcF9maWxlX3BhZ2VzIF9fTlJfcmVtYXBfZmlsZV9wYWdlcworI2RlZmluZSBTWVNfcmVtb3ZleGF0dHIgX19OUl9yZW1vdmV4YXR0cgorI2RlZmluZSBTWVNfcmVuYW1lIF9fTlJfcmVuYW1lCisjZGVmaW5lIFNZU19yZW5hbWVhdCBfX05SX3JlbmFtZWF0CisjZGVmaW5lIFNZU19yZXF1ZXN0X2tleSBfX05SX3JlcXVlc3Rfa2V5CisjZGVmaW5lIFNZU19yZXN0YXJ0X3N5c2NhbGwgX19OUl9yZXN0YXJ0X3N5c2NhbGwKKyNkZWZpbmUgU1lTX3JtZGlyIF9fTlJfcm1kaXIKKyNkZWZpbmUgU1lTX3J0X3NpZ2FjdGlvbiBfX05SX3J0X3NpZ2FjdGlvbgorI2RlZmluZSBTWVNfcnRfc2lncGVuZGluZyBfX05SX3J0X3NpZ3BlbmRpbmcKKyNkZWZpbmUgU1lTX3J0X3NpZ3Byb2NtYXNrIF9fTlJfcnRfc2lncHJvY21hc2sKKyNkZWZpbmUgU1lTX3J0X3NpZ3F1ZXVlaW5mbyBfX05SX3J0X3NpZ3F1ZXVlaW5mbworI2RlZmluZSBTWVNfcnRfc2lncmV0dXJuIF9fTlJfcnRfc2lncmV0dXJuCisjZGVmaW5lIFNZU19ydF9zaWdzdXNwZW5kIF9fTlJfcnRfc2lnc3VzcGVuZAorI2RlZmluZSBTWVNfcnRfc2lndGltZWR3YWl0IF9fTlJfcnRfc2lndGltZWR3YWl0CisjZGVmaW5lIFNZU19ydF90Z3NpZ3F1ZXVlaW5mbyBfX05SX3J0X3Rnc2lncXVldWVpbmZvCisjZGVmaW5lIFNZU19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4IF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heAorI2RlZmluZSBTWVNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9taW4KKyNkZWZpbmUgU1lTX3NjaGVkX2dldGFmZmluaXR5IF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkKKyNkZWZpbmUgU1lTX3NjaGVkX2dldHBhcmFtIF9fTlJfc2NoZWRfZ2V0cGFyYW0KKyNkZWZpbmUgU1lTX3NjaGVkX2dldHNjaGVkdWxlciBfX05SX3NjaGVkX2dldHNjaGVkdWxlcgorI2RlZmluZSBTWVNfc2NoZWRfcnJfZ2V0X2ludGVydmFsIF9fTlJfc2NoZWRfcnJfZ2V0X2ludGVydmFsCisjZGVmaW5lIFNZU19zY2hlZF9zZXRhZmZpbml0eSBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjZGVmaW5lIFNZU19zY2hlZF9zZXRwYXJhbSBfX05SX3NjaGVkX3NldHBhcmFtCisjZGVmaW5lIFNZU19zY2hlZF9zZXRzY2hlZHVsZXIgX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIKKyNkZWZpbmUgU1lTX3NjaGVkX3lpZWxkIF9fTlJfc2NoZWRfeWllbGQKKyNkZWZpbmUgU1lTX3NlbGVjdCBfX05SX3NlbGVjdAorI2RlZmluZSBTWVNfc2VuZGZpbGUgX19OUl9zZW5kZmlsZQorI2RlZmluZSBTWVNfc2VuZGZpbGU2NCBfX05SX3NlbmRmaWxlNjQKKyNkZWZpbmUgU1lTX3NlbmRtbXNnIF9fTlJfc2VuZG1tc2cKKyNkZWZpbmUgU1lTX3NldF9tZW1wb2xpY3kgX19OUl9zZXRfbWVtcG9saWN5CisjZGVmaW5lIFNZU19zZXRfcm9idXN0X2xpc3QgX19OUl9zZXRfcm9idXN0X2xpc3QKKyNkZWZpbmUgU1lTX3NldF90aHJlYWRfYXJlYSBfX05SX3NldF90aHJlYWRfYXJlYQorI2RlZmluZSBTWVNfc2V0X3RpZF9hZGRyZXNzIF9fTlJfc2V0X3RpZF9hZGRyZXNzCisjZGVmaW5lIFNZU19zZXRkb21haW5uYW1lIF9fTlJfc2V0ZG9tYWlubmFtZQorI2RlZmluZSBTWVNfc2V0ZnNnaWQgX19OUl9zZXRmc2dpZAorI2RlZmluZSBTWVNfc2V0ZnNnaWQzMiBfX05SX3NldGZzZ2lkMzIKKyNkZWZpbmUgU1lTX3NldGZzdWlkIF9fTlJfc2V0ZnN1aWQKKyNkZWZpbmUgU1lTX3NldGZzdWlkMzIgX19OUl9zZXRmc3VpZDMyCisjZGVmaW5lIFNZU19zZXRnaWQgX19OUl9zZXRnaWQKKyNkZWZpbmUgU1lTX3NldGdpZDMyIF9fTlJfc2V0Z2lkMzIKKyNkZWZpbmUgU1lTX3NldGdyb3VwcyBfX05SX3NldGdyb3VwcworI2RlZmluZSBTWVNfc2V0Z3JvdXBzMzIgX19OUl9zZXRncm91cHMzMgorI2RlZmluZSBTWVNfc2V0aG9zdG5hbWUgX19OUl9zZXRob3N0bmFtZQorI2RlZmluZSBTWVNfc2V0aXRpbWVyIF9fTlJfc2V0aXRpbWVyCisjZGVmaW5lIFNZU19zZXRucyBfX05SX3NldG5zCisjZGVmaW5lIFNZU19zZXRwZ2lkIF9fTlJfc2V0cGdpZAorI2RlZmluZSBTWVNfc2V0cHJpb3JpdHkgX19OUl9zZXRwcmlvcml0eQorI2RlZmluZSBTWVNfc2V0cmVnaWQgX19OUl9zZXRyZWdpZAorI2RlZmluZSBTWVNfc2V0cmVnaWQzMiBfX05SX3NldHJlZ2lkMzIKKyNkZWZpbmUgU1lTX3NldHJlc2dpZCBfX05SX3NldHJlc2dpZAorI2RlZmluZSBTWVNfc2V0cmVzZ2lkMzIgX19OUl9zZXRyZXNnaWQzMgorI2RlZmluZSBTWVNfc2V0cmVzdWlkIF9fTlJfc2V0cmVzdWlkCisjZGVmaW5lIFNZU19zZXRyZXN1aWQzMiBfX05SX3NldHJlc3VpZDMyCisjZGVmaW5lIFNZU19zZXRyZXVpZCBfX05SX3NldHJldWlkCisjZGVmaW5lIFNZU19zZXRyZXVpZDMyIF9fTlJfc2V0cmV1aWQzMgorI2RlZmluZSBTWVNfc2V0cmxpbWl0IF9fTlJfc2V0cmxpbWl0CisjZGVmaW5lIFNZU19zZXRzaWQgX19OUl9zZXRzaWQKKyNkZWZpbmUgU1lTX3NldHRpbWVvZmRheSBfX05SX3NldHRpbWVvZmRheQorI2RlZmluZSBTWVNfc2V0dWlkIF9fTlJfc2V0dWlkCisjZGVmaW5lIFNZU19zZXR1aWQzMiBfX05SX3NldHVpZDMyCisjZGVmaW5lIFNZU19zZXR4YXR0ciBfX05SX3NldHhhdHRyCisjZGVmaW5lIFNZU19zZ2V0bWFzayBfX05SX3NnZXRtYXNrCisjZGVmaW5lIFNZU19zaWdhY3Rpb24gX19OUl9zaWdhY3Rpb24KKyNkZWZpbmUgU1lTX3NpZ2FsdHN0YWNrIF9fTlJfc2lnYWx0c3RhY2sKKyNkZWZpbmUgU1lTX3NpZ25hbCBfX05SX3NpZ25hbAorI2RlZmluZSBTWVNfc2lnbmFsZmQgX19OUl9zaWduYWxmZAorI2RlZmluZSBTWVNfc2lnbmFsZmQ0IF9fTlJfc2lnbmFsZmQ0CisjZGVmaW5lIFNZU19zaWdwZW5kaW5nIF9fTlJfc2lncGVuZGluZworI2RlZmluZSBTWVNfc2lncHJvY21hc2sgX19OUl9zaWdwcm9jbWFzaworI2RlZmluZSBTWVNfc2lncmV0dXJuIF9fTlJfc2lncmV0dXJuCisjZGVmaW5lIFNZU19zaWdzdXNwZW5kIF9fTlJfc2lnc3VzcGVuZAorI2RlZmluZSBTWVNfc29ja2V0Y2FsbCBfX05SX3NvY2tldGNhbGwKKyNkZWZpbmUgU1lTX3NwbGljZSBfX05SX3NwbGljZQorI2RlZmluZSBTWVNfc3NldG1hc2sgX19OUl9zc2V0bWFzaworI2RlZmluZSBTWVNfc3RhdCBfX05SX3N0YXQKKyNkZWZpbmUgU1lTX3N0YXQ2NCBfX05SX3N0YXQ2NAorI2RlZmluZSBTWVNfc3RhdGZzIF9fTlJfc3RhdGZzCisjZGVmaW5lIFNZU19zdGF0ZnM2NCBfX05SX3N0YXRmczY0CisjZGVmaW5lIFNZU19zdGltZSBfX05SX3N0aW1lCisjZGVmaW5lIFNZU19zdHR5IF9fTlJfc3R0eQorI2RlZmluZSBTWVNfc3dhcG9mZiBfX05SX3N3YXBvZmYKKyNkZWZpbmUgU1lTX3N3YXBvbiBfX05SX3N3YXBvbgorI2RlZmluZSBTWVNfc3ltbGluayBfX05SX3N5bWxpbmsKKyNkZWZpbmUgU1lTX3N5bWxpbmthdCBfX05SX3N5bWxpbmthdAorI2RlZmluZSBTWVNfc3luYyBfX05SX3N5bmMKKyNkZWZpbmUgU1lTX3N5bmNfZmlsZV9yYW5nZSBfX05SX3N5bmNfZmlsZV9yYW5nZQorI2RlZmluZSBTWVNfc3luY2ZzIF9fTlJfc3luY2ZzCisjZGVmaW5lIFNZU19zeXNmcyBfX05SX3N5c2ZzCisjZGVmaW5lIFNZU19zeXNpbmZvIF9fTlJfc3lzaW5mbworI2RlZmluZSBTWVNfc3lzbG9nIF9fTlJfc3lzbG9nCisjZGVmaW5lIFNZU190ZWUgX19OUl90ZWUKKyNkZWZpbmUgU1lTX3Rna2lsbCBfX05SX3Rna2lsbAorI2RlZmluZSBTWVNfdGltZSBfX05SX3RpbWUKKyNkZWZpbmUgU1lTX3RpbWVyX2NyZWF0ZSBfX05SX3RpbWVyX2NyZWF0ZQorI2RlZmluZSBTWVNfdGltZXJfZGVsZXRlIF9fTlJfdGltZXJfZGVsZXRlCisjZGVmaW5lIFNZU190aW1lcl9nZXRvdmVycnVuIF9fTlJfdGltZXJfZ2V0b3ZlcnJ1bgorI2RlZmluZSBTWVNfdGltZXJfZ2V0dGltZSBfX05SX3RpbWVyX2dldHRpbWUKKyNkZWZpbmUgU1lTX3RpbWVyX3NldHRpbWUgX19OUl90aW1lcl9zZXR0aW1lCisjZGVmaW5lIFNZU190aW1lcmZkX2NyZWF0ZSBfX05SX3RpbWVyZmRfY3JlYXRlCisjZGVmaW5lIFNZU190aW1lcmZkX2dldHRpbWUgX19OUl90aW1lcmZkX2dldHRpbWUKKyNkZWZpbmUgU1lTX3RpbWVyZmRfc2V0dGltZSBfX05SX3RpbWVyZmRfc2V0dGltZQorI2RlZmluZSBTWVNfdGltZXMgX19OUl90aW1lcworI2RlZmluZSBTWVNfdGtpbGwgX19OUl90a2lsbAorI2RlZmluZSBTWVNfdHJ1bmNhdGUgX19OUl90cnVuY2F0ZQorI2RlZmluZSBTWVNfdHJ1bmNhdGU2NCBfX05SX3RydW5jYXRlNjQKKyNkZWZpbmUgU1lTX3VnZXRybGltaXQgX19OUl91Z2V0cmxpbWl0CisjZGVmaW5lIFNZU191bGltaXQgX19OUl91bGltaXQKKyNkZWZpbmUgU1lTX3VtYXNrIF9fTlJfdW1hc2sKKyNkZWZpbmUgU1lTX3Vtb3VudCBfX05SX3Vtb3VudAorI2RlZmluZSBTWVNfdW1vdW50MiBfX05SX3Vtb3VudDIKKyNkZWZpbmUgU1lTX3VuYW1lIF9fTlJfdW5hbWUKKyNkZWZpbmUgU1lTX3VubGluayBfX05SX3VubGluaworI2RlZmluZSBTWVNfdW5saW5rYXQgX19OUl91bmxpbmthdAorI2RlZmluZSBTWVNfdW5zaGFyZSBfX05SX3Vuc2hhcmUKKyNkZWZpbmUgU1lTX3VzZWxpYiBfX05SX3VzZWxpYgorI2RlZmluZSBTWVNfdXN0YXQgX19OUl91c3RhdAorI2RlZmluZSBTWVNfdXRpbWUgX19OUl91dGltZQorI2RlZmluZSBTWVNfdXRpbWVuc2F0IF9fTlJfdXRpbWVuc2F0CisjZGVmaW5lIFNZU191dGltZXMgX19OUl91dGltZXMKKyNkZWZpbmUgU1lTX3Zmb3JrIF9fTlJfdmZvcmsKKyNkZWZpbmUgU1lTX3ZoYW5ndXAgX19OUl92aGFuZ3VwCisjZGVmaW5lIFNZU192bTg2IF9fTlJfdm04NgorI2RlZmluZSBTWVNfdm04Nm9sZCBfX05SX3ZtODZvbGQKKyNkZWZpbmUgU1lTX3Ztc3BsaWNlIF9fTlJfdm1zcGxpY2UKKyNkZWZpbmUgU1lTX3ZzZXJ2ZXIgX19OUl92c2VydmVyCisjZGVmaW5lIFNZU193YWl0NCBfX05SX3dhaXQ0CisjZGVmaW5lIFNZU193YWl0aWQgX19OUl93YWl0aWQKKyNkZWZpbmUgU1lTX3dhaXRwaWQgX19OUl93YWl0cGlkCisjZGVmaW5lIFNZU193cml0ZSBfX05SX3dyaXRlCisjZGVmaW5lIFNZU193cml0ZXYgX19OUl93cml0ZXYKKyNlbmRpZgorI2lmIF9fV09SRFNJWkUgPT0gNjQKKyNkZWZpbmUgU1lTX19zeXNjdGwgX19OUl9fc3lzY3RsCisjZGVmaW5lIFNZU19hY2NlcHQgX19OUl9hY2NlcHQKKyNkZWZpbmUgU1lTX2FjY2VwdDQgX19OUl9hY2NlcHQ0CisjZGVmaW5lIFNZU19hY2Nlc3MgX19OUl9hY2Nlc3MKKyNkZWZpbmUgU1lTX2FjY3QgX19OUl9hY2N0CisjZGVmaW5lIFNZU19hZGRfa2V5IF9fTlJfYWRkX2tleQorI2RlZmluZSBTWVNfYWRqdGltZXggX19OUl9hZGp0aW1leAorI2RlZmluZSBTWVNfYWZzX3N5c2NhbGwgX19OUl9hZnNfc3lzY2FsbAorI2RlZmluZSBTWVNfYWxhcm0gX19OUl9hbGFybQorI2RlZmluZSBTWVNfYXJjaF9wcmN0bCBfX05SX2FyY2hfcHJjdGwKKyNkZWZpbmUgU1lTX2JpbmQgX19OUl9iaW5kCisjZGVmaW5lIFNZU19icmsgX19OUl9icmsKKyNkZWZpbmUgU1lTX2NhcGdldCBfX05SX2NhcGdldAorI2RlZmluZSBTWVNfY2Fwc2V0IF9fTlJfY2Fwc2V0CisjZGVmaW5lIFNZU19jaGRpciBfX05SX2NoZGlyCisjZGVmaW5lIFNZU19jaG1vZCBfX05SX2NobW9kCisjZGVmaW5lIFNZU19jaG93biBfX05SX2Nob3duCisjZGVmaW5lIFNZU19jaHJvb3QgX19OUl9jaHJvb3QKKyNkZWZpbmUgU1lTX2Nsb2NrX2FkanRpbWUgX19OUl9jbG9ja19hZGp0aW1lCisjZGVmaW5lIFNZU19jbG9ja19nZXRyZXMgX19OUl9jbG9ja19nZXRyZXMKKyNkZWZpbmUgU1lTX2Nsb2NrX2dldHRpbWUgX19OUl9jbG9ja19nZXR0aW1lCisjZGVmaW5lIFNZU19jbG9ja19uYW5vc2xlZXAgX19OUl9jbG9ja19uYW5vc2xlZXAKKyNkZWZpbmUgU1lTX2Nsb2NrX3NldHRpbWUgX19OUl9jbG9ja19zZXR0aW1lCisjZGVmaW5lIFNZU19jbG9uZSBfX05SX2Nsb25lCisjZGVmaW5lIFNZU19jbG9zZSBfX05SX2Nsb3NlCisjZGVmaW5lIFNZU19jb25uZWN0IF9fTlJfY29ubmVjdAorI2RlZmluZSBTWVNfY3JlYXQgX19OUl9jcmVhdAorI2RlZmluZSBTWVNfY3JlYXRlX21vZHVsZSBfX05SX2NyZWF0ZV9tb2R1bGUKKyNkZWZpbmUgU1lTX2RlbGV0ZV9tb2R1bGUgX19OUl9kZWxldGVfbW9kdWxlCisjZGVmaW5lIFNZU19kdXAgX19OUl9kdXAKKyNkZWZpbmUgU1lTX2R1cDIgX19OUl9kdXAyCisjZGVmaW5lIFNZU19kdXAzIF9fTlJfZHVwMworI2RlZmluZSBTWVNfZXBvbGxfY3JlYXRlIF9fTlJfZXBvbGxfY3JlYXRlCisjZGVmaW5lIFNZU19lcG9sbF9jcmVhdGUxIF9fTlJfZXBvbGxfY3JlYXRlMQorI2RlZmluZSBTWVNfZXBvbGxfY3RsIF9fTlJfZXBvbGxfY3RsCisjZGVmaW5lIFNZU19lcG9sbF9jdGxfb2xkIF9fTlJfZXBvbGxfY3RsX29sZAorI2RlZmluZSBTWVNfZXBvbGxfcHdhaXQgX19OUl9lcG9sbF9wd2FpdAorI2RlZmluZSBTWVNfZXBvbGxfd2FpdCBfX05SX2Vwb2xsX3dhaXQKKyNkZWZpbmUgU1lTX2Vwb2xsX3dhaXRfb2xkIF9fTlJfZXBvbGxfd2FpdF9vbGQKKyNkZWZpbmUgU1lTX2V2ZW50ZmQgX19OUl9ldmVudGZkCisjZGVmaW5lIFNZU19ldmVudGZkMiBfX05SX2V2ZW50ZmQyCisjZGVmaW5lIFNZU19leGVjdmUgX19OUl9leGVjdmUKKyNkZWZpbmUgU1lTX2V4aXQgX19OUl9leGl0CisjZGVmaW5lIFNZU19leGl0X2dyb3VwIF9fTlJfZXhpdF9ncm91cAorI2RlZmluZSBTWVNfZmFjY2Vzc2F0IF9fTlJfZmFjY2Vzc2F0CisjZGVmaW5lIFNZU19mYWR2aXNlNjQgX19OUl9mYWR2aXNlNjQKKyNkZWZpbmUgU1lTX2ZhbGxvY2F0ZSBfX05SX2ZhbGxvY2F0ZQorI2RlZmluZSBTWVNfZmFub3RpZnlfaW5pdCBfX05SX2Zhbm90aWZ5X2luaXQKKyNkZWZpbmUgU1lTX2Zhbm90aWZ5X21hcmsgX19OUl9mYW5vdGlmeV9tYXJrCisjZGVmaW5lIFNZU19mY2hkaXIgX19OUl9mY2hkaXIKKyNkZWZpbmUgU1lTX2ZjaG1vZCBfX05SX2ZjaG1vZAorI2RlZmluZSBTWVNfZmNobW9kYXQgX19OUl9mY2htb2RhdAorI2RlZmluZSBTWVNfZmNob3duIF9fTlJfZmNob3duCisjZGVmaW5lIFNZU19mY2hvd25hdCBfX05SX2ZjaG93bmF0CisjZGVmaW5lIFNZU19mY250bCBfX05SX2ZjbnRsCisjZGVmaW5lIFNZU19mZGF0YXN5bmMgX19OUl9mZGF0YXN5bmMKKyNkZWZpbmUgU1lTX2ZnZXR4YXR0ciBfX05SX2ZnZXR4YXR0cgorI2RlZmluZSBTWVNfZmxpc3R4YXR0ciBfX05SX2ZsaXN0eGF0dHIKKyNkZWZpbmUgU1lTX2Zsb2NrIF9fTlJfZmxvY2sKKyNkZWZpbmUgU1lTX2ZvcmsgX19OUl9mb3JrCisjZGVmaW5lIFNZU19mcmVtb3ZleGF0dHIgX19OUl9mcmVtb3ZleGF0dHIKKyNkZWZpbmUgU1lTX2ZzZXR4YXR0ciBfX05SX2ZzZXR4YXR0cgorI2RlZmluZSBTWVNfZnN0YXQgX19OUl9mc3RhdAorI2RlZmluZSBTWVNfZnN0YXRmcyBfX05SX2ZzdGF0ZnMKKyNkZWZpbmUgU1lTX2ZzeW5jIF9fTlJfZnN5bmMKKyNkZWZpbmUgU1lTX2Z0cnVuY2F0ZSBfX05SX2Z0cnVuY2F0ZQorI2RlZmluZSBTWVNfZnV0ZXggX19OUl9mdXRleAorI2RlZmluZSBTWVNfZnV0aW1lc2F0IF9fTlJfZnV0aW1lc2F0CisjZGVmaW5lIFNZU19nZXRfa2VybmVsX3N5bXMgX19OUl9nZXRfa2VybmVsX3N5bXMKKyNkZWZpbmUgU1lTX2dldF9tZW1wb2xpY3kgX19OUl9nZXRfbWVtcG9saWN5CisjZGVmaW5lIFNZU19nZXRfcm9idXN0X2xpc3QgX19OUl9nZXRfcm9idXN0X2xpc3QKKyNkZWZpbmUgU1lTX2dldF90aHJlYWRfYXJlYSBfX05SX2dldF90aHJlYWRfYXJlYQorI2RlZmluZSBTWVNfZ2V0Y3B1IF9fTlJfZ2V0Y3B1CisjZGVmaW5lIFNZU19nZXRjd2QgX19OUl9nZXRjd2QKKyNkZWZpbmUgU1lTX2dldGRlbnRzIF9fTlJfZ2V0ZGVudHMKKyNkZWZpbmUgU1lTX2dldGRlbnRzNjQgX19OUl9nZXRkZW50czY0CisjZGVmaW5lIFNZU19nZXRlZ2lkIF9fTlJfZ2V0ZWdpZAorI2RlZmluZSBTWVNfZ2V0ZXVpZCBfX05SX2dldGV1aWQKKyNkZWZpbmUgU1lTX2dldGdpZCBfX05SX2dldGdpZAorI2RlZmluZSBTWVNfZ2V0Z3JvdXBzIF9fTlJfZ2V0Z3JvdXBzCisjZGVmaW5lIFNZU19nZXRpdGltZXIgX19OUl9nZXRpdGltZXIKKyNkZWZpbmUgU1lTX2dldHBlZXJuYW1lIF9fTlJfZ2V0cGVlcm5hbWUKKyNkZWZpbmUgU1lTX2dldHBnaWQgX19OUl9nZXRwZ2lkCisjZGVmaW5lIFNZU19nZXRwZ3JwIF9fTlJfZ2V0cGdycAorI2RlZmluZSBTWVNfZ2V0cGlkIF9fTlJfZ2V0cGlkCisjZGVmaW5lIFNZU19nZXRwbXNnIF9fTlJfZ2V0cG1zZworI2RlZmluZSBTWVNfZ2V0cHBpZCBfX05SX2dldHBwaWQKKyNkZWZpbmUgU1lTX2dldHByaW9yaXR5IF9fTlJfZ2V0cHJpb3JpdHkKKyNkZWZpbmUgU1lTX2dldHJlc2dpZCBfX05SX2dldHJlc2dpZAorI2RlZmluZSBTWVNfZ2V0cmVzdWlkIF9fTlJfZ2V0cmVzdWlkCisjZGVmaW5lIFNZU19nZXRybGltaXQgX19OUl9nZXRybGltaXQKKyNkZWZpbmUgU1lTX2dldHJ1c2FnZSBfX05SX2dldHJ1c2FnZQorI2RlZmluZSBTWVNfZ2V0c2lkIF9fTlJfZ2V0c2lkCisjZGVmaW5lIFNZU19nZXRzb2NrbmFtZSBfX05SX2dldHNvY2tuYW1lCisjZGVmaW5lIFNZU19nZXRzb2Nrb3B0IF9fTlJfZ2V0c29ja29wdAorI2RlZmluZSBTWVNfZ2V0dGlkIF9fTlJfZ2V0dGlkCisjZGVmaW5lIFNZU19nZXR0aW1lb2ZkYXkgX19OUl9nZXR0aW1lb2ZkYXkKKyNkZWZpbmUgU1lTX2dldHVpZCBfX05SX2dldHVpZAorI2RlZmluZSBTWVNfZ2V0eGF0dHIgX19OUl9nZXR4YXR0cgorI2RlZmluZSBTWVNfaW5pdF9tb2R1bGUgX19OUl9pbml0X21vZHVsZQorI2RlZmluZSBTWVNfaW5vdGlmeV9hZGRfd2F0Y2ggX19OUl9pbm90aWZ5X2FkZF93YXRjaAorI2RlZmluZSBTWVNfaW5vdGlmeV9pbml0IF9fTlJfaW5vdGlmeV9pbml0CisjZGVmaW5lIFNZU19pbm90aWZ5X2luaXQxIF9fTlJfaW5vdGlmeV9pbml0MQorI2RlZmluZSBTWVNfaW5vdGlmeV9ybV93YXRjaCBfX05SX2lub3RpZnlfcm1fd2F0Y2gKKyNkZWZpbmUgU1lTX2lvX2NhbmNlbCBfX05SX2lvX2NhbmNlbAorI2RlZmluZSBTWVNfaW9fZGVzdHJveSBfX05SX2lvX2Rlc3Ryb3kKKyNkZWZpbmUgU1lTX2lvX2dldGV2ZW50cyBfX05SX2lvX2dldGV2ZW50cworI2RlZmluZSBTWVNfaW9fc2V0dXAgX19OUl9pb19zZXR1cAorI2RlZmluZSBTWVNfaW9fc3VibWl0IF9fTlJfaW9fc3VibWl0CisjZGVmaW5lIFNZU19pb2N0bCBfX05SX2lvY3RsCisjZGVmaW5lIFNZU19pb3Blcm0gX19OUl9pb3Blcm0KKyNkZWZpbmUgU1lTX2lvcGwgX19OUl9pb3BsCisjZGVmaW5lIFNZU19pb3ByaW9fZ2V0IF9fTlJfaW9wcmlvX2dldAorI2RlZmluZSBTWVNfaW9wcmlvX3NldCBfX05SX2lvcHJpb19zZXQKKyNkZWZpbmUgU1lTX2tleGVjX2xvYWQgX19OUl9rZXhlY19sb2FkCisjZGVmaW5lIFNZU19rZXljdGwgX19OUl9rZXljdGwKKyNkZWZpbmUgU1lTX2tpbGwgX19OUl9raWxsCisjZGVmaW5lIFNZU19sY2hvd24gX19OUl9sY2hvd24KKyNkZWZpbmUgU1lTX2xnZXR4YXR0ciBfX05SX2xnZXR4YXR0cgorI2RlZmluZSBTWVNfbGluayBfX05SX2xpbmsKKyNkZWZpbmUgU1lTX2xpbmthdCBfX05SX2xpbmthdAorI2RlZmluZSBTWVNfbGlzdGVuIF9fTlJfbGlzdGVuCisjZGVmaW5lIFNZU19saXN0eGF0dHIgX19OUl9saXN0eGF0dHIKKyNkZWZpbmUgU1lTX2xsaXN0eGF0dHIgX19OUl9sbGlzdHhhdHRyCisjZGVmaW5lIFNZU19sb29rdXBfZGNvb2tpZSBfX05SX2xvb2t1cF9kY29va2llCisjZGVmaW5lIFNZU19scmVtb3ZleGF0dHIgX19OUl9scmVtb3ZleGF0dHIKKyNkZWZpbmUgU1lTX2xzZWVrIF9fTlJfbHNlZWsKKyNkZWZpbmUgU1lTX2xzZXR4YXR0ciBfX05SX2xzZXR4YXR0cgorI2RlZmluZSBTWVNfbHN0YXQgX19OUl9sc3RhdAorI2RlZmluZSBTWVNfbWFkdmlzZSBfX05SX21hZHZpc2UKKyNkZWZpbmUgU1lTX21iaW5kIF9fTlJfbWJpbmQKKyNkZWZpbmUgU1lTX21pZ3JhdGVfcGFnZXMgX19OUl9taWdyYXRlX3BhZ2VzCisjZGVmaW5lIFNZU19taW5jb3JlIF9fTlJfbWluY29yZQorI2RlZmluZSBTWVNfbWtkaXIgX19OUl9ta2RpcgorI2RlZmluZSBTWVNfbWtkaXJhdCBfX05SX21rZGlyYXQKKyNkZWZpbmUgU1lTX21rbm9kIF9fTlJfbWtub2QKKyNkZWZpbmUgU1lTX21rbm9kYXQgX19OUl9ta25vZGF0CisjZGVmaW5lIFNZU19tbG9jayBfX05SX21sb2NrCisjZGVmaW5lIFNZU19tbG9ja2FsbCBfX05SX21sb2NrYWxsCisjZGVmaW5lIFNZU19tbWFwIF9fTlJfbW1hcAorI2RlZmluZSBTWVNfbW9kaWZ5X2xkdCBfX05SX21vZGlmeV9sZHQKKyNkZWZpbmUgU1lTX21vdW50IF9fTlJfbW91bnQKKyNkZWZpbmUgU1lTX21vdmVfcGFnZXMgX19OUl9tb3ZlX3BhZ2VzCisjZGVmaW5lIFNZU19tcHJvdGVjdCBfX05SX21wcm90ZWN0CisjZGVmaW5lIFNZU19tcV9nZXRzZXRhdHRyIF9fTlJfbXFfZ2V0c2V0YXR0cgorI2RlZmluZSBTWVNfbXFfbm90aWZ5IF9fTlJfbXFfbm90aWZ5CisjZGVmaW5lIFNZU19tcV9vcGVuIF9fTlJfbXFfb3BlbgorI2RlZmluZSBTWVNfbXFfdGltZWRyZWNlaXZlIF9fTlJfbXFfdGltZWRyZWNlaXZlCisjZGVmaW5lIFNZU19tcV90aW1lZHNlbmQgX19OUl9tcV90aW1lZHNlbmQKKyNkZWZpbmUgU1lTX21xX3VubGluayBfX05SX21xX3VubGluaworI2RlZmluZSBTWVNfbXJlbWFwIF9fTlJfbXJlbWFwCisjZGVmaW5lIFNZU19tc2djdGwgX19OUl9tc2djdGwKKyNkZWZpbmUgU1lTX21zZ2dldCBfX05SX21zZ2dldAorI2RlZmluZSBTWVNfbXNncmN2IF9fTlJfbXNncmN2CisjZGVmaW5lIFNZU19tc2dzbmQgX19OUl9tc2dzbmQKKyNkZWZpbmUgU1lTX21zeW5jIF9fTlJfbXN5bmMKKyNkZWZpbmUgU1lTX211bmxvY2sgX19OUl9tdW5sb2NrCisjZGVmaW5lIFNZU19tdW5sb2NrYWxsIF9fTlJfbXVubG9ja2FsbAorI2RlZmluZSBTWVNfbXVubWFwIF9fTlJfbXVubWFwCisjZGVmaW5lIFNZU19uYW1lX3RvX2hhbmRsZV9hdCBfX05SX25hbWVfdG9faGFuZGxlX2F0CisjZGVmaW5lIFNZU19uYW5vc2xlZXAgX19OUl9uYW5vc2xlZXAKKyNkZWZpbmUgU1lTX25ld2ZzdGF0YXQgX19OUl9uZXdmc3RhdGF0CisjZGVmaW5lIFNZU19uZnNzZXJ2Y3RsIF9fTlJfbmZzc2VydmN0bAorI2RlZmluZSBTWVNfb3BlbiBfX05SX29wZW4KKyNkZWZpbmUgU1lTX29wZW5fYnlfaGFuZGxlX2F0IF9fTlJfb3Blbl9ieV9oYW5kbGVfYXQKKyNkZWZpbmUgU1lTX29wZW5hdCBfX05SX29wZW5hdAorI2RlZmluZSBTWVNfcGF1c2UgX19OUl9wYXVzZQorI2RlZmluZSBTWVNfcGVyZl9ldmVudF9vcGVuIF9fTlJfcGVyZl9ldmVudF9vcGVuCisjZGVmaW5lIFNZU19wZXJzb25hbGl0eSBfX05SX3BlcnNvbmFsaXR5CisjZGVmaW5lIFNZU19waXBlIF9fTlJfcGlwZQorI2RlZmluZSBTWVNfcGlwZTIgX19OUl9waXBlMgorI2RlZmluZSBTWVNfcGl2b3Rfcm9vdCBfX05SX3Bpdm90X3Jvb3QKKyNkZWZpbmUgU1lTX3BvbGwgX19OUl9wb2xsCisjZGVmaW5lIFNZU19wcG9sbCBfX05SX3Bwb2xsCisjZGVmaW5lIFNZU19wcmN0bCBfX05SX3ByY3RsCisjZGVmaW5lIFNZU19wcmVhZDY0IF9fTlJfcHJlYWQ2NAorI2RlZmluZSBTWVNfcHJlYWR2IF9fTlJfcHJlYWR2CisjZGVmaW5lIFNZU19wcmxpbWl0NjQgX19OUl9wcmxpbWl0NjQKKyNkZWZpbmUgU1lTX3Byb2Nlc3Nfdm1fcmVhZHYgX19OUl9wcm9jZXNzX3ZtX3JlYWR2CisjZGVmaW5lIFNZU19wcm9jZXNzX3ZtX3dyaXRldiBfX05SX3Byb2Nlc3Nfdm1fd3JpdGV2CisjZGVmaW5lIFNZU19wc2VsZWN0NiBfX05SX3BzZWxlY3Q2CisjZGVmaW5lIFNZU19wdHJhY2UgX19OUl9wdHJhY2UKKyNkZWZpbmUgU1lTX3B1dHBtc2cgX19OUl9wdXRwbXNnCisjZGVmaW5lIFNZU19wd3JpdGU2NCBfX05SX3B3cml0ZTY0CisjZGVmaW5lIFNZU19wd3JpdGV2IF9fTlJfcHdyaXRldgorI2RlZmluZSBTWVNfcXVlcnlfbW9kdWxlIF9fTlJfcXVlcnlfbW9kdWxlCisjZGVmaW5lIFNZU19xdW90YWN0bCBfX05SX3F1b3RhY3RsCisjZGVmaW5lIFNZU19yZWFkIF9fTlJfcmVhZAorI2RlZmluZSBTWVNfcmVhZGFoZWFkIF9fTlJfcmVhZGFoZWFkCisjZGVmaW5lIFNZU19yZWFkbGluayBfX05SX3JlYWRsaW5rCisjZGVmaW5lIFNZU19yZWFkbGlua2F0IF9fTlJfcmVhZGxpbmthdAorI2RlZmluZSBTWVNfcmVhZHYgX19OUl9yZWFkdgorI2RlZmluZSBTWVNfcmVib290IF9fTlJfcmVib290CisjZGVmaW5lIFNZU19yZWN2ZnJvbSBfX05SX3JlY3Zmcm9tCisjZGVmaW5lIFNZU19yZWN2bW1zZyBfX05SX3JlY3ZtbXNnCisjZGVmaW5lIFNZU19yZWN2bXNnIF9fTlJfcmVjdm1zZworI2RlZmluZSBTWVNfcmVtYXBfZmlsZV9wYWdlcyBfX05SX3JlbWFwX2ZpbGVfcGFnZXMKKyNkZWZpbmUgU1lTX3JlbW92ZXhhdHRyIF9fTlJfcmVtb3ZleGF0dHIKKyNkZWZpbmUgU1lTX3JlbmFtZSBfX05SX3JlbmFtZQorI2RlZmluZSBTWVNfcmVuYW1lYXQgX19OUl9yZW5hbWVhdAorI2RlZmluZSBTWVNfcmVxdWVzdF9rZXkgX19OUl9yZXF1ZXN0X2tleQorI2RlZmluZSBTWVNfcmVzdGFydF9zeXNjYWxsIF9fTlJfcmVzdGFydF9zeXNjYWxsCisjZGVmaW5lIFNZU19ybWRpciBfX05SX3JtZGlyCisjZGVmaW5lIFNZU19ydF9zaWdhY3Rpb24gX19OUl9ydF9zaWdhY3Rpb24KKyNkZWZpbmUgU1lTX3J0X3NpZ3BlbmRpbmcgX19OUl9ydF9zaWdwZW5kaW5nCisjZGVmaW5lIFNZU19ydF9zaWdwcm9jbWFzayBfX05SX3J0X3NpZ3Byb2NtYXNrCisjZGVmaW5lIFNZU19ydF9zaWdxdWV1ZWluZm8gX19OUl9ydF9zaWdxdWV1ZWluZm8KKyNkZWZpbmUgU1lTX3J0X3NpZ3JldHVybiBfX05SX3J0X3NpZ3JldHVybgorI2RlZmluZSBTWVNfcnRfc2lnc3VzcGVuZCBfX05SX3J0X3NpZ3N1c3BlbmQKKyNkZWZpbmUgU1lTX3J0X3NpZ3RpbWVkd2FpdCBfX05SX3J0X3NpZ3RpbWVkd2FpdAorI2RlZmluZSBTWVNfcnRfdGdzaWdxdWV1ZWluZm8gX19OUl9ydF90Z3NpZ3F1ZXVlaW5mbworI2RlZmluZSBTWVNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9tYXgKKyNkZWZpbmUgU1lTX3NjaGVkX2dldF9wcmlvcml0eV9taW4gX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWluCisjZGVmaW5lIFNZU19zY2hlZF9nZXRhZmZpbml0eSBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjZGVmaW5lIFNZU19zY2hlZF9nZXRwYXJhbSBfX05SX3NjaGVkX2dldHBhcmFtCisjZGVmaW5lIFNZU19zY2hlZF9nZXRzY2hlZHVsZXIgX19OUl9zY2hlZF9nZXRzY2hlZHVsZXIKKyNkZWZpbmUgU1lTX3NjaGVkX3JyX2dldF9pbnRlcnZhbCBfX05SX3NjaGVkX3JyX2dldF9pbnRlcnZhbAorI2RlZmluZSBTWVNfc2NoZWRfc2V0YWZmaW5pdHkgX19OUl9zY2hlZF9zZXRhZmZpbml0eQorI2RlZmluZSBTWVNfc2NoZWRfc2V0cGFyYW0gX19OUl9zY2hlZF9zZXRwYXJhbQorI2RlZmluZSBTWVNfc2NoZWRfc2V0c2NoZWR1bGVyIF9fTlJfc2NoZWRfc2V0c2NoZWR1bGVyCisjZGVmaW5lIFNZU19zY2hlZF95aWVsZCBfX05SX3NjaGVkX3lpZWxkCisjZGVmaW5lIFNZU19zZWN1cml0eSBfX05SX3NlY3VyaXR5CisjZGVmaW5lIFNZU19zZWxlY3QgX19OUl9zZWxlY3QKKyNkZWZpbmUgU1lTX3NlbWN0bCBfX05SX3NlbWN0bAorI2RlZmluZSBTWVNfc2VtZ2V0IF9fTlJfc2VtZ2V0CisjZGVmaW5lIFNZU19zZW1vcCBfX05SX3NlbW9wCisjZGVmaW5lIFNZU19zZW10aW1lZG9wIF9fTlJfc2VtdGltZWRvcAorI2RlZmluZSBTWVNfc2VuZGZpbGUgX19OUl9zZW5kZmlsZQorI2RlZmluZSBTWVNfc2VuZG1tc2cgX19OUl9zZW5kbW1zZworI2RlZmluZSBTWVNfc2VuZG1zZyBfX05SX3NlbmRtc2cKKyNkZWZpbmUgU1lTX3NlbmR0byBfX05SX3NlbmR0bworI2RlZmluZSBTWVNfc2V0X21lbXBvbGljeSBfX05SX3NldF9tZW1wb2xpY3kKKyNkZWZpbmUgU1lTX3NldF9yb2J1c3RfbGlzdCBfX05SX3NldF9yb2J1c3RfbGlzdAorI2RlZmluZSBTWVNfc2V0X3RocmVhZF9hcmVhIF9fTlJfc2V0X3RocmVhZF9hcmVhCisjZGVmaW5lIFNZU19zZXRfdGlkX2FkZHJlc3MgX19OUl9zZXRfdGlkX2FkZHJlc3MKKyNkZWZpbmUgU1lTX3NldGRvbWFpbm5hbWUgX19OUl9zZXRkb21haW5uYW1lCisjZGVmaW5lIFNZU19zZXRmc2dpZCBfX05SX3NldGZzZ2lkCisjZGVmaW5lIFNZU19zZXRmc3VpZCBfX05SX3NldGZzdWlkCisjZGVmaW5lIFNZU19zZXRnaWQgX19OUl9zZXRnaWQKKyNkZWZpbmUgU1lTX3NldGdyb3VwcyBfX05SX3NldGdyb3VwcworI2RlZmluZSBTWVNfc2V0aG9zdG5hbWUgX19OUl9zZXRob3N0bmFtZQorI2RlZmluZSBTWVNfc2V0aXRpbWVyIF9fTlJfc2V0aXRpbWVyCisjZGVmaW5lIFNZU19zZXRucyBfX05SX3NldG5zCisjZGVmaW5lIFNZU19zZXRwZ2lkIF9fTlJfc2V0cGdpZAorI2RlZmluZSBTWVNfc2V0cHJpb3JpdHkgX19OUl9zZXRwcmlvcml0eQorI2RlZmluZSBTWVNfc2V0cmVnaWQgX19OUl9zZXRyZWdpZAorI2RlZmluZSBTWVNfc2V0cmVzZ2lkIF9fTlJfc2V0cmVzZ2lkCisjZGVmaW5lIFNZU19zZXRyZXN1aWQgX19OUl9zZXRyZXN1aWQKKyNkZWZpbmUgU1lTX3NldHJldWlkIF9fTlJfc2V0cmV1aWQKKyNkZWZpbmUgU1lTX3NldHJsaW1pdCBfX05SX3NldHJsaW1pdAorI2RlZmluZSBTWVNfc2V0c2lkIF9fTlJfc2V0c2lkCisjZGVmaW5lIFNZU19zZXRzb2Nrb3B0IF9fTlJfc2V0c29ja29wdAorI2RlZmluZSBTWVNfc2V0dGltZW9mZGF5IF9fTlJfc2V0dGltZW9mZGF5CisjZGVmaW5lIFNZU19zZXR1aWQgX19OUl9zZXR1aWQKKyNkZWZpbmUgU1lTX3NldHhhdHRyIF9fTlJfc2V0eGF0dHIKKyNkZWZpbmUgU1lTX3NobWF0IF9fTlJfc2htYXQKKyNkZWZpbmUgU1lTX3NobWN0bCBfX05SX3NobWN0bAorI2RlZmluZSBTWVNfc2htZHQgX19OUl9zaG1kdAorI2RlZmluZSBTWVNfc2htZ2V0IF9fTlJfc2htZ2V0CisjZGVmaW5lIFNZU19zaHV0ZG93biBfX05SX3NodXRkb3duCisjZGVmaW5lIFNZU19zaWdhbHRzdGFjayBfX05SX3NpZ2FsdHN0YWNrCisjZGVmaW5lIFNZU19zaWduYWxmZCBfX05SX3NpZ25hbGZkCisjZGVmaW5lIFNZU19zaWduYWxmZDQgX19OUl9zaWduYWxmZDQKKyNkZWZpbmUgU1lTX3NvY2tldCBfX05SX3NvY2tldAorI2RlZmluZSBTWVNfc29ja2V0cGFpciBfX05SX3NvY2tldHBhaXIKKyNkZWZpbmUgU1lTX3NwbGljZSBfX05SX3NwbGljZQorI2RlZmluZSBTWVNfc3RhdCBfX05SX3N0YXQKKyNkZWZpbmUgU1lTX3N0YXRmcyBfX05SX3N0YXRmcworI2RlZmluZSBTWVNfc3dhcG9mZiBfX05SX3N3YXBvZmYKKyNkZWZpbmUgU1lTX3N3YXBvbiBfX05SX3N3YXBvbgorI2RlZmluZSBTWVNfc3ltbGluayBfX05SX3N5bWxpbmsKKyNkZWZpbmUgU1lTX3N5bWxpbmthdCBfX05SX3N5bWxpbmthdAorI2RlZmluZSBTWVNfc3luYyBfX05SX3N5bmMKKyNkZWZpbmUgU1lTX3N5bmNfZmlsZV9yYW5nZSBfX05SX3N5bmNfZmlsZV9yYW5nZQorI2RlZmluZSBTWVNfc3luY2ZzIF9fTlJfc3luY2ZzCisjZGVmaW5lIFNZU19zeXNmcyBfX05SX3N5c2ZzCisjZGVmaW5lIFNZU19zeXNpbmZvIF9fTlJfc3lzaW5mbworI2RlZmluZSBTWVNfc3lzbG9nIF9fTlJfc3lzbG9nCisjZGVmaW5lIFNZU190ZWUgX19OUl90ZWUKKyNkZWZpbmUgU1lTX3Rna2lsbCBfX05SX3Rna2lsbAorI2RlZmluZSBTWVNfdGltZSBfX05SX3RpbWUKKyNkZWZpbmUgU1lTX3RpbWVyX2NyZWF0ZSBfX05SX3RpbWVyX2NyZWF0ZQorI2RlZmluZSBTWVNfdGltZXJfZGVsZXRlIF9fTlJfdGltZXJfZGVsZXRlCisjZGVmaW5lIFNZU190aW1lcl9nZXRvdmVycnVuIF9fTlJfdGltZXJfZ2V0b3ZlcnJ1bgorI2RlZmluZSBTWVNfdGltZXJfZ2V0dGltZSBfX05SX3RpbWVyX2dldHRpbWUKKyNkZWZpbmUgU1lTX3RpbWVyX3NldHRpbWUgX19OUl90aW1lcl9zZXR0aW1lCisjZGVmaW5lIFNZU190aW1lcmZkX2NyZWF0ZSBfX05SX3RpbWVyZmRfY3JlYXRlCisjZGVmaW5lIFNZU190aW1lcmZkX2dldHRpbWUgX19OUl90aW1lcmZkX2dldHRpbWUKKyNkZWZpbmUgU1lTX3RpbWVyZmRfc2V0dGltZSBfX05SX3RpbWVyZmRfc2V0dGltZQorI2RlZmluZSBTWVNfdGltZXMgX19OUl90aW1lcworI2RlZmluZSBTWVNfdGtpbGwgX19OUl90a2lsbAorI2RlZmluZSBTWVNfdHJ1bmNhdGUgX19OUl90cnVuY2F0ZQorI2RlZmluZSBTWVNfdHV4Y2FsbCBfX05SX3R1eGNhbGwKKyNkZWZpbmUgU1lTX3VtYXNrIF9fTlJfdW1hc2sKKyNkZWZpbmUgU1lTX3Vtb3VudDIgX19OUl91bW91bnQyCisjZGVmaW5lIFNZU191bmFtZSBfX05SX3VuYW1lCisjZGVmaW5lIFNZU191bmxpbmsgX19OUl91bmxpbmsKKyNkZWZpbmUgU1lTX3VubGlua2F0IF9fTlJfdW5saW5rYXQKKyNkZWZpbmUgU1lTX3Vuc2hhcmUgX19OUl91bnNoYXJlCisjZGVmaW5lIFNZU191c2VsaWIgX19OUl91c2VsaWIKKyNkZWZpbmUgU1lTX3VzdGF0IF9fTlJfdXN0YXQKKyNkZWZpbmUgU1lTX3V0aW1lIF9fTlJfdXRpbWUKKyNkZWZpbmUgU1lTX3V0aW1lbnNhdCBfX05SX3V0aW1lbnNhdAorI2RlZmluZSBTWVNfdXRpbWVzIF9fTlJfdXRpbWVzCisjZGVmaW5lIFNZU192Zm9yayBfX05SX3Zmb3JrCisjZGVmaW5lIFNZU192aGFuZ3VwIF9fTlJfdmhhbmd1cAorI2RlZmluZSBTWVNfdm1zcGxpY2UgX19OUl92bXNwbGljZQorI2RlZmluZSBTWVNfdnNlcnZlciBfX05SX3ZzZXJ2ZXIKKyNkZWZpbmUgU1lTX3dhaXQ0IF9fTlJfd2FpdDQKKyNkZWZpbmUgU1lTX3dhaXRpZCBfX05SX3dhaXRpZAorI2RlZmluZSBTWVNfd3JpdGUgX19OUl93cml0ZQorI2RlZmluZSBTWVNfd3JpdGV2IF9fTlJfd3JpdGV2CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N5c2xvZy1sZGJsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zeXNsb2ctbGRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNGU3MGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zeXNsb2ctbGRibC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBzeXNsb2cgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1lTTE9HX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3lzbG9nLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3N5c2xvZy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitfX0xEQkxfUkVESVJfREVDTCAoc3lzbG9nKQorCisjaWZkZWYgX19VU0VfQlNECitfX0xEQkxfUkVESVJfREVDTCAodnN5c2xvZykKKyNlbmRpZgorCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lCitfX0xEQkxfUkVESVJfREVDTCAoX19zeXNsb2dfY2hrKQorCisjIGlmZGVmIF9fVVNFX0JTRAorX19MREJMX1JFRElSX0RFQ0wgKF9fdnN5c2xvZ19jaGspCisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N5c2xvZy1wYXRoLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zeXNsb2ctcGF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYmJkNmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zeXNsb2ctcGF0aC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIDxiaXRzL3N5c2xvZy1wYXRoLmg+IC0tIF9QQVRIX0xPRyBkZWZpbml0aW9uCisgICBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TWVNMT0dfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuICBVc2UgPHN5cy9zeXNsb2cuaD4gaW5zdGVhZCIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX1NZU0xPR19QQVRIX0gKKyNkZWZpbmUgX0JJVFNfU1lTTE9HX1BBVEhfSCAxCisKKyNkZWZpbmUJX1BBVEhfTE9HCSIvZGV2L2xvZyIKKworI2VuZGlmIC8qIGJpdHMvc3lzbG9nLXBhdGguaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3lzbG9nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zeXNsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDY0ZDdhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3lzbG9nLmgKQEAgLTAsMCArMSw1MCBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBzeXNsb2cgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA3LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1lTTE9HX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3lzbG9nLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zeXNsb2cuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCitleHRlcm4gdm9pZCBfX3N5c2xvZ19jaGsgKGludCBfX3ByaSwgaW50IF9fZmxhZywgX19jb25zdCBjaGFyICpfX2ZtdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKKworI2lmZGVmIF9fdmFfYXJnX3BhY2sKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZAorc3lzbG9nIChpbnQgX19wcmksIF9fY29uc3QgY2hhciAqX19mbXQsIC4uLikKK3sKKyAgX19zeXNsb2dfY2hrIChfX3ByaSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyNlbGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjIGRlZmluZSBzeXNsb2cocHJpLCAuLi4pIFwKKyAgX19zeXNsb2dfY2hrIChwcmksIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9CU0QKK2V4dGVybiB2b2lkIF9fdnN5c2xvZ19jaGsgKGludCBfX3ByaSwgaW50IF9fZmxhZywgX19jb25zdCBjaGFyICpfX2ZtdCwKKwkJCSAgIF9fZ251Y192YV9saXN0IF9fYXApCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQKK3ZzeXNsb2cgKGludCBfX3ByaSwgX19jb25zdCBjaGFyICpfX2ZtdCwgX19nbnVjX3ZhX2xpc3QgX19hcCkKK3sKKyAgX192c3lzbG9nX2NoayAoX19wcmksICBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsIF9fYXApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy90ZXJtaW9zLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy90ZXJtaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiNGNlMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3Rlcm1pb3MuaApAQCAtMCwwICsxLDIyMCBAQAorLyogdGVybWlvcyB0eXBlIGFuZCBtYWNybyBkZWZpbml0aW9ucy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5OSwgMjAwMywgMjAwNSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfVEVSTUlPU19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3Rlcm1pb3MuaD4gZGlyZWN0bHk7IHVzZSA8dGVybWlvcy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJY2NfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CXNwZWVkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAl0Y2ZsYWdfdDsKKworI2RlZmluZSBOQ0NTIDMyCitzdHJ1Y3QgdGVybWlvcworICB7CisgICAgdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKyAgICB0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKyAgICB0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisgICAgdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKyAgICBjY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKyAgICBjY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKyAgICBzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKyAgICBzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCisjZGVmaW5lIF9IQVZFX1NUUlVDVF9URVJNSU9TX0NfSVNQRUVEIDEKKyNkZWZpbmUgX0hBVkVfU1RSVUNUX1RFUk1JT1NfQ19PU1BFRUQgMQorICB9OworCisvKiBjX2NjIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUgVklOVFIgMAorI2RlZmluZSBWUVVJVCAxCisjZGVmaW5lIFZFUkFTRSAyCisjZGVmaW5lIFZLSUxMIDMKKyNkZWZpbmUgVkVPRiA0CisjZGVmaW5lIFZUSU1FIDUKKyNkZWZpbmUgVk1JTiA2CisjZGVmaW5lIFZTV1RDIDcKKyNkZWZpbmUgVlNUQVJUIDgKKyNkZWZpbmUgVlNUT1AgOQorI2RlZmluZSBWU1VTUCAxMAorI2RlZmluZSBWRU9MIDExCisjZGVmaW5lIFZSRVBSSU5UIDEyCisjZGVmaW5lIFZESVNDQVJEIDEzCisjZGVmaW5lIFZXRVJBU0UgMTQKKyNkZWZpbmUgVkxORVhUIDE1CisjZGVmaW5lIFZFT0wyIDE2CisKKy8qIGNfaWZsYWcgYml0cyAqLworI2RlZmluZSBJR05CUksJMDAwMDAwMQorI2RlZmluZSBCUktJTlQJMDAwMDAwMgorI2RlZmluZSBJR05QQVIJMDAwMDAwNAorI2RlZmluZSBQQVJNUksJMDAwMDAxMAorI2RlZmluZSBJTlBDSwkwMDAwMDIwCisjZGVmaW5lIElTVFJJUAkwMDAwMDQwCisjZGVmaW5lIElOTENSCTAwMDAxMDAKKyNkZWZpbmUgSUdOQ1IJMDAwMDIwMAorI2RlZmluZSBJQ1JOTAkwMDAwNDAwCisjZGVmaW5lIElVQ0xDCTAwMDEwMDAKKyNkZWZpbmUgSVhPTgkwMDAyMDAwCisjZGVmaW5lIElYQU5ZCTAwMDQwMDAKKyNkZWZpbmUgSVhPRkYJMDAxMDAwMAorI2RlZmluZSBJTUFYQkVMCTAwMjAwMDAKKyNkZWZpbmUgSVVURjgJMDA0MDAwMAorCisvKiBjX29mbGFnIGJpdHMgKi8KKyNkZWZpbmUgT1BPU1QJMDAwMDAwMQorI2RlZmluZSBPTENVQwkwMDAwMDAyCisjZGVmaW5lIE9OTENSCTAwMDAwMDQKKyNkZWZpbmUgT0NSTkwJMDAwMDAxMAorI2RlZmluZSBPTk9DUgkwMDAwMDIwCisjZGVmaW5lIE9OTFJFVAkwMDAwMDQwCisjZGVmaW5lIE9GSUxMCTAwMDAxMDAKKyNkZWZpbmUgT0ZERUwJMDAwMDIwMAorI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisjIGRlZmluZSBOTERMWQkwMDAwNDAwCisjIGRlZmluZSAgIE5MMAkwMDAwMDAwCisjIGRlZmluZSAgIE5MMQkwMDAwNDAwCisjIGRlZmluZSBDUkRMWQkwMDAzMDAwCisjIGRlZmluZSAgIENSMAkwMDAwMDAwCisjIGRlZmluZSAgIENSMQkwMDAxMDAwCisjIGRlZmluZSAgIENSMgkwMDAyMDAwCisjIGRlZmluZSAgIENSMwkwMDAzMDAwCisjIGRlZmluZSBUQUJETFkJMDAxNDAwMAorIyBkZWZpbmUgICBUQUIwCTAwMDAwMDAKKyMgZGVmaW5lICAgVEFCMQkwMDA0MDAwCisjIGRlZmluZSAgIFRBQjIJMDAxMDAwMAorIyBkZWZpbmUgICBUQUIzCTAwMTQwMDAKKyMgZGVmaW5lIEJTRExZCTAwMjAwMDAKKyMgZGVmaW5lICAgQlMwCTAwMDAwMDAKKyMgZGVmaW5lICAgQlMxCTAwMjAwMDAKKyMgZGVmaW5lIEZGRExZCTAxMDAwMDAKKyMgZGVmaW5lICAgRkYwCTAwMDAwMDAKKyMgZGVmaW5lICAgRkYxCTAxMDAwMDAKKyNlbmRpZgorCisjZGVmaW5lIFZURExZCTAwNDAwMDAKKyNkZWZpbmUgICBWVDAJMDAwMDAwMAorI2RlZmluZSAgIFZUMQkwMDQwMDAwCisKKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBYVEFCUwkwMDE0MDAwCisjZW5kaWYKKworLyogY19jZmxhZyBiaXQgbWVhbmluZyAqLworI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIENCQVVECTAwMTAwMTcKKyNlbmRpZgorI2RlZmluZSAgQjAJMDAwMDAwMAkJLyogaGFuZyB1cCAqLworI2RlZmluZSAgQjUwCTAwMDAwMDEKKyNkZWZpbmUgIEI3NQkwMDAwMDAyCisjZGVmaW5lICBCMTEwCTAwMDAwMDMKKyNkZWZpbmUgIEIxMzQJMDAwMDAwNAorI2RlZmluZSAgQjE1MAkwMDAwMDA1CisjZGVmaW5lICBCMjAwCTAwMDAwMDYKKyNkZWZpbmUgIEIzMDAJMDAwMDAwNworI2RlZmluZSAgQjYwMAkwMDAwMDEwCisjZGVmaW5lICBCMTIwMAkwMDAwMDExCisjZGVmaW5lICBCMTgwMAkwMDAwMDEyCisjZGVmaW5lICBCMjQwMAkwMDAwMDEzCisjZGVmaW5lICBCNDgwMAkwMDAwMDE0CisjZGVmaW5lICBCOTYwMAkwMDAwMDE1CisjZGVmaW5lICBCMTkyMDAJMDAwMDAxNgorI2RlZmluZSAgQjM4NDAwCTAwMDAwMTcKKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBFWFRBIEIxOTIwMAorIyBkZWZpbmUgRVhUQiBCMzg0MDAKKyNlbmRpZgorI2RlZmluZSBDU0laRQkwMDAwMDYwCisjZGVmaW5lICAgQ1M1CTAwMDAwMDAKKyNkZWZpbmUgICBDUzYJMDAwMDAyMAorI2RlZmluZSAgIENTNwkwMDAwMDQwCisjZGVmaW5lICAgQ1M4CTAwMDAwNjAKKyNkZWZpbmUgQ1NUT1BCCTAwMDAxMDAKKyNkZWZpbmUgQ1JFQUQJMDAwMDIwMAorI2RlZmluZSBQQVJFTkIJMDAwMDQwMAorI2RlZmluZSBQQVJPREQJMDAwMTAwMAorI2RlZmluZSBIVVBDTAkwMDAyMDAwCisjZGVmaW5lIENMT0NBTAkwMDA0MDAwCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZW5kaWYKKyNkZWZpbmUgIEI1NzYwMCAgIDAwMTAwMDEKKyNkZWZpbmUgIEIxMTUyMDAgIDAwMTAwMDIKKyNkZWZpbmUgIEIyMzA0MDAgIDAwMTAwMDMKKyNkZWZpbmUgIEI0NjA4MDAgIDAwMTAwMDQKKyNkZWZpbmUgIEI1MDAwMDAgIDAwMTAwMDUKKyNkZWZpbmUgIEI1NzYwMDAgIDAwMTAwMDYKKyNkZWZpbmUgIEI5MjE2MDAgIDAwMTAwMDcKKyNkZWZpbmUgIEIxMDAwMDAwIDAwMTAwMTAKKyNkZWZpbmUgIEIxMTUyMDAwIDAwMTAwMTEKKyNkZWZpbmUgIEIxNTAwMDAwIDAwMTAwMTIKKyNkZWZpbmUgIEIyMDAwMDAwIDAwMTAwMTMKKyNkZWZpbmUgIEIyNTAwMDAwIDAwMTAwMTQKKyNkZWZpbmUgIEIzMDAwMDAwIDAwMTAwMTUKKyNkZWZpbmUgIEIzNTAwMDAwIDAwMTAwMTYKKyNkZWZpbmUgIEI0MDAwMDAwIDAwMTAwMTcKKyNkZWZpbmUgX19NQVhfQkFVRCBCNDAwMDAwMAorI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkJLyogaW5wdXQgYmF1ZCByYXRlIChub3QgdXNlZCkgKi8KKyMgZGVmaW5lIENNU1BBUiAgIDAxMDAwMDAwMDAwMAkJLyogbWFyayBvciBzcGFjZSAoc3RpY2spIHBhcml0eSAqLworIyBkZWZpbmUgQ1JUU0NUUyAgMDIwMDAwMDAwMDAwCQkvKiBmbG93IGNvbnRyb2wgKi8KKyNlbmRpZgorCisvKiBjX2xmbGFnIGJpdHMgKi8KKyNkZWZpbmUgSVNJRwkwMDAwMDAxCisjZGVmaW5lIElDQU5PTgkwMDAwMDAyCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKyMgZGVmaW5lIFhDQVNFCTAwMDAwMDQKKyNlbmRpZgorI2RlZmluZSBFQ0hPCTAwMDAwMTAKKyNkZWZpbmUgRUNIT0UJMDAwMDAyMAorI2RlZmluZSBFQ0hPSwkwMDAwMDQwCisjZGVmaW5lIEVDSE9OTAkwMDAwMTAwCisjZGVmaW5lIE5PRkxTSAkwMDAwMjAwCisjZGVmaW5lIFRPU1RPUAkwMDAwNDAwCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgRUNIT0NUTCAwMDAxMDAwCisjIGRlZmluZSBFQ0hPUFJUIDAwMDIwMDAKKyMgZGVmaW5lIEVDSE9LRQkgMDAwNDAwMAorIyBkZWZpbmUgRkxVU0hPCSAwMDEwMDAwCisjIGRlZmluZSBQRU5ESU4JIDAwNDAwMDAKKyNlbmRpZgorI2RlZmluZSBJRVhURU4JMDEwMDAwMAorI2lmZGVmIF9fVVNFX0JTRAorIyBkZWZpbmUgRVhUUFJPQyAwMjAwMDAwCisjZW5kaWYKKworLyogdGNmbG93KCkgYW5kIFRDWE9OQyB1c2UgdGhlc2UgKi8KKyNkZWZpbmUJVENPT0ZGCQkwCisjZGVmaW5lCVRDT09OCQkxCisjZGVmaW5lCVRDSU9GRgkJMgorI2RlZmluZQlUQ0lPTgkJMworCisvKiB0Y2ZsdXNoKCkgYW5kIFRDRkxTSCB1c2UgdGhlc2UgKi8KKyNkZWZpbmUJVENJRkxVU0gJMAorI2RlZmluZQlUQ09GTFVTSAkxCisjZGVmaW5lCVRDSU9GTFVTSAkyCisKKy8qIHRjc2V0YXR0ciB1c2VzIHRoZXNlICovCisjZGVmaW5lCVRDU0FOT1cJCTAKKyNkZWZpbmUJVENTQURSQUlOCTEKKyNkZWZpbmUJVENTQUZMVVNICTIKKworCisjZGVmaW5lIF9JT1RfdGVybWlvcyAvKiBIdXJkIGlvY3RsIHR5cGUgZmllbGQuICAqLyBcCisgIF9JT1QgKF9JT1RTIChjZmxhZ190KSwgNCwgX0lPVFMgKGNjX3QpLCBOQ0NTLCBfSU9UUyAoc3BlZWRfdCksIDIpCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy90aW1lLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmOWE2NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3RpbWUuaApAQCAtMCwwICsxLDk5IEBACisvKiBTeXN0ZW0tZGVwZW5kZW50IHRpbWluZyBkZWZpbml0aW9ucy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5NywxOTk5LTIwMDMsMjAxMCwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHk7IHVzZSA8dGltZS5oPiBpbnN0ZWFkLgorICovCisKKyNpZiBkZWZpbmVkIF9fbmVlZF90aW1ldmFsIHx8IGRlZmluZWQgX19VU0VfR05VCisjIGlmbmRlZiBfU1RSVUNUX1RJTUVWQUwKKyMgIGRlZmluZSBfU1RSVUNUX1RJTUVWQUwJMQorIyAgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBBIHRpbWUgdmFsdWUgdGhhdCBpcyBhY2N1cmF0ZSB0byB0aGUgbmVhcmVzdAorICAgbWljcm9zZWNvbmQgYnV0IGFsc28gaGFzIGEgcmFuZ2Ugb2YgeWVhcnMuICAqLworc3RydWN0IHRpbWV2YWwKKyAgeworICAgIF9fdGltZV90IHR2X3NlYzsJCS8qIFNlY29uZHMuICAqLworICAgIF9fc3VzZWNvbmRzX3QgdHZfdXNlYzsJLyogTWljcm9zZWNvbmRzLiAgKi8KKyAgfTsKKyMgZW5kaWYJLyogc3RydWN0IHRpbWV2YWwgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9fbmVlZF90aW1ldmFsCisjIGlmbmRlZiBfQklUU19USU1FX0gKKyMgIGRlZmluZSBfQklUU19USU1FX0gJMQorCisvKiBJU08vSUVDIDk4OTk6MTk5MCA3LjEyLjE6IDx0aW1lLmg+CisgICBUaGUgbWFjcm8gYENMT0NLU19QRVJfU0VDJyBpcyB0aGUgbnVtYmVyIHBlciBzZWNvbmQgb2YgdGhlIHZhbHVlCisgICByZXR1cm5lZCBieSB0aGUgYGNsb2NrJyBmdW5jdGlvbi4gKi8KKy8qIENBRSBYU0gsIElzc3VlIDQsIFZlcnNpb24gMjogPHRpbWUuaD4KKyAgIFRoZSB2YWx1ZSBvZiBDTE9DS1NfUEVSX1NFQyBpcyByZXF1aXJlZCB0byBiZSAxIG1pbGxpb24gb24gYWxsCisgICBYU0ktY29uZm9ybWFudCBzeXN0ZW1zLiAqLworIyAgZGVmaW5lIENMT0NLU19QRVJfU0VDICAxMDAwMDAwbAorCisjICBpZiAhZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySworLyogRXZlbiB0aG91Z2ggQ0xPQ0tTX1BFUl9TRUMgaGFzIHN1Y2ggYSBzdHJhbmdlIHZhbHVlIENMS19UQ0sKKyAgIHByZXNlbnRzIHRoZSByZWFsIHZhbHVlIGZvciBjbG9jayB0aWNrcyBwZXIgc2Vjb25kIGZvciB0aGUgc3lzdGVtLiAgKi8KKyMgICBpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CitleHRlcm4gbG9uZyBpbnQgX19zeXNjb25mIChpbnQpOworIyAgIGRlZmluZSBDTEtfVENLICgoX19jbG9ja190KSBfX3N5c2NvbmYgKDIpKQkvKiAyIGlzIF9TQ19DTEtfVENLICovCisjICBlbmRpZgorCisjICBpZmRlZiBfX1VTRV9QT1NJWDE5OTMwOQorLyogSWRlbnRpZmllciBmb3Igc3lzdGVtLXdpZGUgcmVhbHRpbWUgY2xvY2suICAqLworIyAgIGRlZmluZSBDTE9DS19SRUFMVElNRQkJMAorLyogTW9ub3RvbmljIHN5c3RlbS13aWRlIGNsb2NrLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDCQkxCisvKiBIaWdoLXJlc29sdXRpb24gdGltZXIgZnJvbSB0aGUgQ1BVLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lECTIKKy8qIFRocmVhZC1zcGVjaWZpYyBDUFUtdGltZSBjbG9jay4gICovCisjICAgZGVmaW5lIENMT0NLX1RIUkVBRF9DUFVUSU1FX0lECTMKKy8qIE1vbm90b25pYyBzeXN0ZW0td2lkZSBjbG9jaywgbm90IGFkanVzdGVkIGZvciBmcmVxdWVuY3kgc2NhbGluZy4gICovCisjICAgZGVmaW5lIENMT0NLX01PTk9UT05JQ19SQVcJCTQKKy8qIElkZW50aWZpZXIgZm9yIHN5c3RlbS13aWRlIHJlYWx0aW1lIGNsb2NrLCB1cGRhdGVkIG9ubHkgb24gdGlja3MuICAqLworIyAgIGRlZmluZSBDTE9DS19SRUFMVElNRV9DT0FSU0UJNQorLyogTW9ub3RvbmljIHN5c3RlbS13aWRlIGNsb2NrLCB1cGRhdGVkIG9ubHkgb24gdGlja3MuICAqLworIyAgIGRlZmluZSBDTE9DS19NT05PVE9OSUNfQ09BUlNFCTYKKy8qIE1vbm90b25pYyBzeXN0ZW0td2lkZSBjbG9jayB0aGF0IGluY2x1ZGVzIHRpbWUgc3BlbnQgaW4gc3VzcGVuc2lvbi4gICovCisjICAgZGVmaW5lIENMT0NLX0JPT1RUSU1FCQk3CisvKiBMaWtlIENMT0NLX1JFQUxUSU1FIGJ1dCBhbHNvIHdha2VzIHN1c3BlbmRlZCBzeXN0ZW0uICAqLworIyAgIGRlZmluZSBDTE9DS19SRUFMVElNRV9BTEFSTQkJOAorLyogTGlrZSBDTE9DS19CT09UVElNRSBidXQgYWxzbyB3YWtlcyBzdXNwZW5kZWQgc3lzdGVtLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfQk9PVFRJTUVfQUxBUk0JCTkKKworLyogRmxhZyB0byBpbmRpY2F0ZSB0aW1lIGlzIGFic29sdXRlLiAgKi8KKyMgICBkZWZpbmUgVElNRVJfQUJTVElNRQkJMQorIyAgZW5kaWYKKworIyAgaWZkZWYgX19VU0VfR05VCisjICAgaW5jbHVkZSA8Yml0cy90aW1leC5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFR1bmUgYSBQT1NJWCBjbG9jay4gICovCitleHRlcm4gaW50IGNsb2NrX2FkanRpbWUgKF9fY2xvY2tpZF90IF9fY2xvY2tfaWQsIHN0cnVjdCB0aW1leCAqX191dHgpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisjICBlbmRpZiAvKiB1c2UgR05VICovCisKKyMgZW5kaWYJLyogYml0cy90aW1lLmggKi8KKyNlbmRpZgorCisjdW5kZWYgX19uZWVkX3RpbWV2YWwKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3RpbWV4LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy90aW1leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZGU2N2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy90aW1leC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywxOTk5LDIwMDcsMjAwOSwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9CSVRTX1RJTUVYX0gKKyNkZWZpbmUJX0JJVFNfVElNRVhfSAkxCisKKy8qIFRoZXNlIGRlZmluaXRpb25zIGZyb20gbGludXgvdGltZXguaCBhcyBvZiAyLjYuMzAuICAqLworCitzdHJ1Y3QgdGltZXgKK3sKKyAgdW5zaWduZWQgaW50IG1vZGVzOwkvKiBtb2RlIHNlbGVjdG9yICovCisgIGxvbmcgaW50IG9mZnNldDsJLyogdGltZSBvZmZzZXQgKHVzZWMpICovCisgIGxvbmcgaW50IGZyZXE7CS8qIGZyZXF1ZW5jeSBvZmZzZXQgKHNjYWxlZCBwcG0pICovCisgIGxvbmcgaW50IG1heGVycm9yOwkvKiBtYXhpbXVtIGVycm9yICh1c2VjKSAqLworICBsb25nIGludCBlc3RlcnJvcjsJLyogZXN0aW1hdGVkIGVycm9yICh1c2VjKSAqLworICBpbnQgc3RhdHVzOwkJLyogY2xvY2sgY29tbWFuZC9zdGF0dXMgKi8KKyAgbG9uZyBpbnQgY29uc3RhbnQ7CS8qIHBsbCB0aW1lIGNvbnN0YW50ICovCisgIGxvbmcgaW50IHByZWNpc2lvbjsJLyogY2xvY2sgcHJlY2lzaW9uICh1c2VjKSAocmVhZCBvbmx5KSAqLworICBsb25nIGludCB0b2xlcmFuY2U7CS8qIGNsb2NrIGZyZXF1ZW5jeSB0b2xlcmFuY2UgKHBwbSkgKHJlYWQgb25seSkgKi8KKyAgc3RydWN0IHRpbWV2YWwgdGltZTsJLyogKHJlYWQgb25seSkgKi8KKyAgbG9uZyBpbnQgdGljazsJLyogKG1vZGlmaWVkKSB1c2VjcyBiZXR3ZWVuIGNsb2NrIHRpY2tzICovCisKKyAgbG9uZyBpbnQgcHBzZnJlcTsJLyogcHBzIGZyZXF1ZW5jeSAoc2NhbGVkIHBwbSkgKHJvKSAqLworICBsb25nIGludCBqaXR0ZXI7CS8qIHBwcyBqaXR0ZXIgKHVzKSAocm8pICovCisgIGludCBzaGlmdDsJCS8qIGludGVydmFsIGR1cmF0aW9uIChzKSAoc2hpZnQpIChybykgKi8KKyAgbG9uZyBpbnQgc3RhYmlsOwkvKiBwcHMgc3RhYmlsaXR5IChzY2FsZWQgcHBtKSAocm8pICovCisgIGxvbmcgaW50IGppdGNudDsJLyogaml0dGVyIGxpbWl0IGV4Y2VlZGVkIChybykgKi8KKyAgbG9uZyBpbnQgY2FsY250OwkvKiBjYWxpYnJhdGlvbiBpbnRlcnZhbHMgKHJvKSAqLworICBsb25nIGludCBlcnJjbnQ7CS8qIGNhbGlicmF0aW9uIGVycm9ycyAocm8pICovCisgIGxvbmcgaW50IHN0YmNudDsJLyogc3RhYmlsaXR5IGxpbWl0IGV4Y2VlZGVkIChybykgKi8KKworICBpbnQgdGFpOwkJLyogVEFJIG9mZnNldCAocm8pICovCisKKyAgLyogPz8/ICovCisgIGludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOworICBpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsKKyAgaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsKK307CisKKy8qIE1vZGUgY29kZXMgKHRpbWV4Lm1vZGUpICovCisjZGVmaW5lIEFESl9PRkZTRVQJCTB4MDAwMQkvKiB0aW1lIG9mZnNldCAqLworI2RlZmluZSBBREpfRlJFUVVFTkNZCQkweDAwMDIJLyogZnJlcXVlbmN5IG9mZnNldCAqLworI2RlZmluZSBBREpfTUFYRVJST1IJCTB4MDAwNAkvKiBtYXhpbXVtIHRpbWUgZXJyb3IgKi8KKyNkZWZpbmUgQURKX0VTVEVSUk9SCQkweDAwMDgJLyogZXN0aW1hdGVkIHRpbWUgZXJyb3IgKi8KKyNkZWZpbmUgQURKX1NUQVRVUwkJMHgwMDEwCS8qIGNsb2NrIHN0YXR1cyAqLworI2RlZmluZSBBREpfVElNRUNPTlNUCQkweDAwMjAJLyogcGxsIHRpbWUgY29uc3RhbnQgKi8KKyNkZWZpbmUgQURKX1RBSQkJCTB4MDA4MAkvKiBzZXQgVEFJIG9mZnNldCAqLworI2RlZmluZSBBREpfTUlDUk8JCTB4MTAwMAkvKiBzZWxlY3QgbWljcm9zZWNvbmQgcmVzb2x1dGlvbiAqLworI2RlZmluZSBBREpfTkFOTwkJMHgyMDAwCS8qIHNlbGVjdCBuYW5vc2Vjb25kIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgQURKX1RJQ0sJCTB4NDAwMAkvKiB0aWNrIHZhbHVlICovCisjZGVmaW5lIEFESl9PRkZTRVRfU0lOR0xFU0hPVAkweDgwMDEJLyogb2xkLWZhc2hpb25lZCBhZGp0aW1lICovCisjZGVmaW5lIEFESl9PRkZTRVRfU1NfUkVBRAkweGEwMDEJLyogcmVhZC1vbmx5IGFkanRpbWUgKi8KKworLyogeG50cCAzLjQgY29tcGF0aWJpbGl0eSBuYW1lcyAqLworI2RlZmluZSBNT0RfT0ZGU0VUCUFESl9PRkZTRVQKKyNkZWZpbmUgTU9EX0ZSRVFVRU5DWQlBREpfRlJFUVVFTkNZCisjZGVmaW5lIE1PRF9NQVhFUlJPUglBREpfTUFYRVJST1IKKyNkZWZpbmUgTU9EX0VTVEVSUk9SCUFESl9FU1RFUlJPUgorI2RlZmluZSBNT0RfU1RBVFVTCUFESl9TVEFUVVMKKyNkZWZpbmUgTU9EX1RJTUVDT05TVAlBREpfVElNRUNPTlNUCisjZGVmaW5lIE1PRF9DTEtCCUFESl9USUNLCisjZGVmaW5lIE1PRF9DTEtBCUFESl9PRkZTRVRfU0lOR0xFU0hPVCAvKiAweDgwMDAgaW4gb3JpZ2luYWwgKi8KKyNkZWZpbmUgTU9EX1RBSQkJQURKX1RBSQorI2RlZmluZSBNT0RfTUlDUk8JQURKX01JQ1JPCisjZGVmaW5lIE1PRF9OQU5PCUFESl9OQU5PCisKKworLyogU3RhdHVzIGNvZGVzICh0aW1leC5zdGF0dXMpICovCisjZGVmaW5lIFNUQV9QTEwJCTB4MDAwMQkvKiBlbmFibGUgUExMIHVwZGF0ZXMgKHJ3KSAqLworI2RlZmluZSBTVEFfUFBTRlJFUQkweDAwMDIJLyogZW5hYmxlIFBQUyBmcmVxIGRpc2NpcGxpbmUgKHJ3KSAqLworI2RlZmluZSBTVEFfUFBTVElNRQkweDAwMDQJLyogZW5hYmxlIFBQUyB0aW1lIGRpc2NpcGxpbmUgKHJ3KSAqLworI2RlZmluZSBTVEFfRkxMCQkweDAwMDgJLyogc2VsZWN0IGZyZXF1ZW5jeS1sb2NrIG1vZGUgKHJ3KSAqLworCisjZGVmaW5lIFNUQV9JTlMJCTB4MDAxMAkvKiBpbnNlcnQgbGVhcCAocncpICovCisjZGVmaW5lIFNUQV9ERUwJCTB4MDAyMAkvKiBkZWxldGUgbGVhcCAocncpICovCisjZGVmaW5lIFNUQV9VTlNZTkMJMHgwMDQwCS8qIGNsb2NrIHVuc3luY2hyb25pemVkIChydykgKi8KKyNkZWZpbmUgU1RBX0ZSRVFIT0xECTB4MDA4MAkvKiBob2xkIGZyZXF1ZW5jeSAocncpICovCisKKyNkZWZpbmUgU1RBX1BQU1NJR05BTAkweDAxMDAJLyogUFBTIHNpZ25hbCBwcmVzZW50IChybykgKi8KKyNkZWZpbmUgU1RBX1BQU0pJVFRFUgkweDAyMDAJLyogUFBTIHNpZ25hbCBqaXR0ZXIgZXhjZWVkZWQgKHJvKSAqLworI2RlZmluZSBTVEFfUFBTV0FOREVSCTB4MDQwMAkvKiBQUFMgc2lnbmFsIHdhbmRlciBleGNlZWRlZCAocm8pICovCisjZGVmaW5lIFNUQV9QUFNFUlJPUgkweDA4MDAJLyogUFBTIHNpZ25hbCBjYWxpYnJhdGlvbiBlcnJvciAocm8pICovCisKKyNkZWZpbmUgU1RBX0NMT0NLRVJSCTB4MTAwMAkvKiBjbG9jayBoYXJkd2FyZSBmYXVsdCAocm8pICovCisjZGVmaW5lIFNUQV9OQU5PCTB4MjAwMAkvKiByZXNvbHV0aW9uICgwID0gdXMsIDEgPSBucykgKHJvKSAqLworI2RlZmluZSBTVEFfTU9ERQkweDQwMDAJLyogbW9kZSAoMCA9IFBMTCwgMSA9IEZMTCkgKHJvKSAqLworI2RlZmluZSBTVEFfQ0xLCQkweDgwMDAJLyogY2xvY2sgc291cmNlICgwID0gQSwgMSA9IEIpIChybykgKi8KKworLyogUmVhZC1vbmx5IGJpdHMgKi8KKyNkZWZpbmUgU1RBX1JPTkxZIChTVEFfUFBTU0lHTkFMIHwgU1RBX1BQU0pJVFRFUiB8IFNUQV9QUFNXQU5ERVIgfCBcCisgICAgU1RBX1BQU0VSUk9SIHwgU1RBX0NMT0NLRVJSIHwgU1RBX05BTk8gfCBTVEFfTU9ERSB8IFNUQV9DTEspCisKKyNlbmRpZiAvKiBiaXRzL3RpbWV4LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3R5cGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYmU4MmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy90eXBlcy5oCkBAIC0wLDAgKzEsMTk3IEBACisvKiBiaXRzL3R5cGVzLmggLS0gZGVmaW5pdGlvbnMgb2YgX18qX3QgdHlwZXMgdW5kZXJseWluZyAqX3QgdHlwZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseTsgdXNlIDxzeXMvdHlwZXMuaD4gaW5zdGVhZC4KKyAqLworCisjaWZuZGVmCV9CSVRTX1RZUEVTX0gKKyNkZWZpbmUJX0JJVFNfVFlQRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworLyogQ29udmVuaWVuY2UgdHlwZXMuICAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdV9jaGFyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgX191X3Nob3J0OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX191X2ludDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgX191X2xvbmc7CisKKy8qIEZpeGVkLXNpemUgdHlwZXMsIHVuZGVybHlpbmcgdHlwZXMgZGVwZW5kIG9uIHdvcmQgc2l6ZSBhbmQgY29tcGlsZXIuICAqLwordHlwZWRlZiBzaWduZWQgY2hhciBfX2ludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX3VpbnQ4X3Q7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgX19pbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgX191aW50MTZfdDsKK3R5cGVkZWYgc2lnbmVkIGludCBfX2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfX3VpbnQzMl90OworI2lmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgc2lnbmVkIGxvbmcgaW50IF9faW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgX191aW50NjRfdDsKKyNlbGlmIGRlZmluZWQgX19HTElCQ19IQVZFX0xPTkdfTE9ORworX19leHRlbnNpb25fXyB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgaW50IF9faW50NjRfdDsKK19fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fdWludDY0X3Q7CisjZW5kaWYKKworLyogcXVhZF90IGlzIGFsc28gNjQgYml0cy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBsb25nIGludCBfX3F1YWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgX191X3F1YWRfdDsKKyNlbGlmIGRlZmluZWQgX19HTElCQ19IQVZFX0xPTkdfTE9ORworX19leHRlbnNpb25fXyB0eXBlZGVmIGxvbmcgbG9uZyBpbnQgX19xdWFkX3Q7CitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3VfcXVhZF90OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CisgIGxvbmcgX192YWxbMl07Cit9IF9fcXVhZF90OwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgX191X2xvbmcgX192YWxbMl07Cit9IF9fdV9xdWFkX3Q7CisjZW5kaWYKKworCisvKiBUaGUgbWFjaGluZS1kZXBlbmRlbnQgZmlsZSA8Yml0cy90eXBlc2l6ZXMuaD4gZGVmaW5lcyBfXypfVF9UWVBFCisgICBtYWNyb3MgZm9yIGVhY2ggb2YgdGhlIE9TIHR5cGVzIHdlIGRlZmluZSBiZWxvdy4gIFRoZSBkZWZpbml0aW9ucworICAgb2YgdGhvc2UgbWFjcm9zIG11c3QgdXNlIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGZvciB1bmRlcmx5aW5nIHR5cGVzLgorICAgV2UgZGVmaW5lIF9fUzxTSVpFPl9UWVBFIGFuZCBfX1U8U0laRT5fVFlQRSBmb3IgdGhlIHNpZ25lZCBhbmQgdW5zaWduZWQKKyAgIHZhcmlhbnRzIG9mIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBpbnRlZ2VyIHR5cGVzIG9uIHRoaXMgbWFjaGluZS4KKworCTE2CQktLSAibmF0dXJhbCIgMTYtYml0IHR5cGUgKGFsd2F5cyBzaG9ydCkKKwkzMgkJLS0gIm5hdHVyYWwiIDMyLWJpdCB0eXBlIChhbHdheXMgaW50KQorCTY0CQktLSAibmF0dXJhbCIgNjQtYml0IHR5cGUgKGxvbmcgb3IgbG9uZyBsb25nKQorCUxPTkczMgkJLS0gMzItYml0IHR5cGUsIHRyYWRpdGlvbmFsbHkgbG9uZworCVFVQUQJCS0tIDY0LWJpdCB0eXBlLCBhbHdheXMgbG9uZyBsb25nCisJV09SRAkJLS0gbmF0dXJhbCB0eXBlIG9mIF9fV09SRFNJWkUgYml0cyAoaW50IG9yIGxvbmcpCisJTE9OR1dPUkQJLS0gdHlwZSBvZiBfX1dPUkRTSVpFIGJpdHMsIHRyYWRpdGlvbmFsbHkgbG9uZworCisgICBXZSBkaXN0aW5ndWlzaCBXT1JEL0xPTkdXT1JELCAzMi9MT05HMzIsIGFuZCA2NC9RVUFEIHNvIHRoYXQgdGhlCisgICBjb252ZW50aW9uYWwgdXNlcyBvZiBgbG9uZycgb3IgYGxvbmcgbG9uZycgdHlwZSBtb2RpZmllcnMgbWF0Y2ggdGhlCisgICB0eXBlcyB3ZSBkZWZpbmUsIGV2ZW4gd2hlbiBhIGxlc3MtYWRvcm5lZCB0eXBlIHdvdWxkIGJlIHRoZSBzYW1lIHNpemUuCisgICBUaGlzIG1hdHRlcnMgZm9yIChzb21ld2hhdCkgcG9ydGFibHkgd3JpdGluZyBwcmludGYvc2NhbmYgZm9ybWF0cyBmb3IKKyAgIHRoZXNlIHR5cGVzLCB3aGVyZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgbCBvciBsbCBmb3JtYXQgbW9kaWZpZXJzIGNhbgorICAgbWFrZSB0aGUgdHlwZWRlZnMgYW5kIHRoZSBmb3JtYXRzIG1hdGNoIHVwIGFjcm9zcyBhbGwgR05VIHBsYXRmb3Jtcy4gIElmCisgICB3ZSB1c2VkIGBsb25nJyB3aGVuIGl0J3MgNjQgYml0cyB3aGVyZSBgbG9uZyBsb25nJyBpcyBleHBlY3RlZCwgdGhlbiB0aGUKKyAgIGNvbXBpbGVyIHdvdWxkIHdhcm4gYWJvdXQgdGhlIGZvcm1hdHMgbm90IG1hdGNoaW5nIHRoZSBhcmd1bWVudCB0eXBlcywKKyAgIGFuZCB0aGUgcHJvZ3JhbW1lciBjaGFuZ2luZyB0aGVtIHRvIHNodXQgdXAgdGhlIGNvbXBpbGVyIHdvdWxkIGJyZWFrIHRoZQorICAgcHJvZ3JhbSdzIHBvcnRhYmlsaXR5LgorCisgICBIZXJlIHdlIGFzc3VtZSB3aGF0IGlzIHByZXNlbnRseSB0aGUgY2FzZSBpbiBhbGwgdGhlIEdDQyBjb25maWd1cmF0aW9ucworICAgd2Ugc3VwcG9ydDogbG9uZyBsb25nIGlzIGFsd2F5cyA2NCBiaXRzLCBsb25nIGlzIGFsd2F5cyB3b3JkL2FkZHJlc3Mgc2l6ZSwKKyAgIGFuZCBpbnQgaXMgYWx3YXlzIDMyIGJpdHMuICAqLworCisjZGVmaW5lCV9fUzE2X1RZUEUJCXNob3J0IGludAorI2RlZmluZSBfX1UxNl9UWVBFCQl1bnNpZ25lZCBzaG9ydCBpbnQKKyNkZWZpbmUJX19TMzJfVFlQRQkJaW50CisjZGVmaW5lIF9fVTMyX1RZUEUJCXVuc2lnbmVkIGludAorI2RlZmluZSBfX1NMT05HV09SRF9UWVBFCWxvbmcgaW50CisjZGVmaW5lIF9fVUxPTkdXT1JEX1RZUEUJdW5zaWduZWQgbG9uZyBpbnQKKyNpZiBfX1dPUkRTSVpFID09IDMyCisjIGRlZmluZSBfX1NRVUFEX1RZUEUJCV9fcXVhZF90CisjIGRlZmluZSBfX1VRVUFEX1RZUEUJCV9fdV9xdWFkX3QKKyMgZGVmaW5lIF9fU1dPUkRfVFlQRQkJaW50CisjIGRlZmluZSBfX1VXT1JEX1RZUEUJCXVuc2lnbmVkIGludAorIyBkZWZpbmUgX19TTE9ORzMyX1RZUEUJCWxvbmcgaW50CisjIGRlZmluZSBfX1VMT05HMzJfVFlQRQkJdW5zaWduZWQgbG9uZyBpbnQKKyMgZGVmaW5lIF9fUzY0X1RZUEUJCV9fcXVhZF90CisjIGRlZmluZSBfX1U2NF9UWVBFCQlfX3VfcXVhZF90CisvKiBXZSB3YW50IF9fZXh0ZW5zaW9uX18gYmVmb3JlIHR5cGVkZWYncyB0aGF0IHVzZSBub25zdGFuZGFyZCBiYXNlIHR5cGVzCisgICBzdWNoIGFzIGBsb25nIGxvbmcnIGluIEM4OSBtb2RlLiAgKi8KKyMgZGVmaW5lIF9fU1REX1RZUEUJCV9fZXh0ZW5zaW9uX18gdHlwZWRlZgorI2VsaWYgX19XT1JEU0laRSA9PSA2NAorIyBkZWZpbmUgX19TUVVBRF9UWVBFCQlsb25nIGludAorIyBkZWZpbmUgX19VUVVBRF9UWVBFCQl1bnNpZ25lZCBsb25nIGludAorIyBkZWZpbmUgX19TV09SRF9UWVBFCQlsb25nIGludAorIyBkZWZpbmUgX19VV09SRF9UWVBFCQl1bnNpZ25lZCBsb25nIGludAorIyBkZWZpbmUgX19TTE9ORzMyX1RZUEUJCWludAorIyBkZWZpbmUgX19VTE9ORzMyX1RZUEUJCXVuc2lnbmVkIGludAorIyBkZWZpbmUgX19TNjRfVFlQRQkJbG9uZyBpbnQKKyMgZGVmaW5lIF9fVTY0X1RZUEUJCXVuc2lnbmVkIGxvbmcgaW50CisvKiBObyBuZWVkIHRvIG1hcmsgdGhlIHR5cGVkZWYgd2l0aCBfX2V4dGVuc2lvbl9fLiAgICovCisjIGRlZmluZSBfX1NURF9UWVBFCQl0eXBlZGVmCisjZWxzZQorIyBlcnJvcgorI2VuZGlmCisjaW5jbHVkZSA8Yml0cy90eXBlc2l6ZXMuaD4JLyogRGVmaW5lcyBfXypfVF9UWVBFIG1hY3Jvcy4gICovCisKKworX19TVERfVFlQRSBfX0RFVl9UX1RZUEUgX19kZXZfdDsJLyogVHlwZSBvZiBkZXZpY2UgbnVtYmVycy4gICovCitfX1NURF9UWVBFIF9fVUlEX1RfVFlQRSBfX3VpZF90OwkvKiBUeXBlIG9mIHVzZXIgaWRlbnRpZmljYXRpb25zLiAgKi8KK19fU1REX1RZUEUgX19HSURfVF9UWVBFIF9fZ2lkX3Q7CS8qIFR5cGUgb2YgZ3JvdXAgaWRlbnRpZmljYXRpb25zLiAgKi8KK19fU1REX1RZUEUgX19JTk9fVF9UWVBFIF9faW5vX3Q7CS8qIFR5cGUgb2YgZmlsZSBzZXJpYWwgbnVtYmVycy4gICovCitfX1NURF9UWVBFIF9fSU5PNjRfVF9UWVBFIF9faW5vNjRfdDsJLyogVHlwZSBvZiBmaWxlIHNlcmlhbCBudW1iZXJzIChMRlMpLiovCitfX1NURF9UWVBFIF9fTU9ERV9UX1RZUEUgX19tb2RlX3Q7CS8qIFR5cGUgb2YgZmlsZSBhdHRyaWJ1dGUgYml0bWFza3MuICAqLworX19TVERfVFlQRSBfX05MSU5LX1RfVFlQRSBfX25saW5rX3Q7CS8qIFR5cGUgb2YgZmlsZSBsaW5rIGNvdW50cy4gICovCitfX1NURF9UWVBFIF9fT0ZGX1RfVFlQRSBfX29mZl90OwkvKiBUeXBlIG9mIGZpbGUgc2l6ZXMgYW5kIG9mZnNldHMuICAqLworX19TVERfVFlQRSBfX09GRjY0X1RfVFlQRSBfX29mZjY0X3Q7CS8qIFR5cGUgb2YgZmlsZSBzaXplcyBhbmQgb2Zmc2V0cyAoTEZTKS4gICovCitfX1NURF9UWVBFIF9fUElEX1RfVFlQRSBfX3BpZF90OwkvKiBUeXBlIG9mIHByb2Nlc3MgaWRlbnRpZmljYXRpb25zLiAgKi8KK19fU1REX1RZUEUgX19GU0lEX1RfVFlQRSBfX2ZzaWRfdDsJLyogVHlwZSBvZiBmaWxlIHN5c3RlbSBJRHMuICAqLworX19TVERfVFlQRSBfX0NMT0NLX1RfVFlQRSBfX2Nsb2NrX3Q7CS8qIFR5cGUgb2YgQ1BVIHVzYWdlIGNvdW50cy4gICovCitfX1NURF9UWVBFIF9fUkxJTV9UX1RZUEUgX19ybGltX3Q7CS8qIFR5cGUgZm9yIHJlc291cmNlIG1lYXN1cmVtZW50LiAgKi8KK19fU1REX1RZUEUgX19STElNNjRfVF9UWVBFIF9fcmxpbTY0X3Q7CS8qIFR5cGUgZm9yIHJlc291cmNlIG1lYXN1cmVtZW50IChMRlMpLiAgKi8KK19fU1REX1RZUEUgX19JRF9UX1RZUEUgX19pZF90OwkJLyogR2VuZXJhbCB0eXBlIGZvciBJRHMuICAqLworX19TVERfVFlQRSBfX1RJTUVfVF9UWVBFIF9fdGltZV90OwkvKiBTZWNvbmRzIHNpbmNlIHRoZSBFcG9jaC4gICovCitfX1NURF9UWVBFIF9fVVNFQ09ORFNfVF9UWVBFIF9fdXNlY29uZHNfdDsgLyogQ291bnQgb2YgbWljcm9zZWNvbmRzLiAgKi8KK19fU1REX1RZUEUgX19TVVNFQ09ORFNfVF9UWVBFIF9fc3VzZWNvbmRzX3Q7IC8qIFNpZ25lZCBjb3VudCBvZiBtaWNyb3NlY29uZHMuICAqLworCitfX1NURF9UWVBFIF9fREFERFJfVF9UWVBFIF9fZGFkZHJfdDsJLyogVGhlIHR5cGUgb2YgYSBkaXNrIGFkZHJlc3MuICAqLworX19TVERfVFlQRSBfX1NXQkxLX1RfVFlQRSBfX3N3YmxrX3Q7CS8qIFR5cGUgb2YgYSBzd2FwIGJsb2NrIG1heWJlPyAgKi8KK19fU1REX1RZUEUgX19LRVlfVF9UWVBFIF9fa2V5X3Q7CS8qIFR5cGUgb2YgYW4gSVBDIGtleS4gICovCisKKy8qIENsb2NrIElEIHVzZWQgaW4gY2xvY2sgYW5kIHRpbWVyIGZ1bmN0aW9ucy4gICovCitfX1NURF9UWVBFIF9fQ0xPQ0tJRF9UX1RZUEUgX19jbG9ja2lkX3Q7CisKKy8qIFRpbWVyIElEIHJldHVybmVkIGJ5IGB0aW1lcl9jcmVhdGUnLiAgKi8KK19fU1REX1RZUEUgX19USU1FUl9UX1RZUEUgX190aW1lcl90OworCisvKiBUeXBlIHRvIHJlcHJlc2VudCBibG9jayBzaXplLiAgKi8KK19fU1REX1RZUEUgX19CTEtTSVpFX1RfVFlQRSBfX2Jsa3NpemVfdDsKKworLyogVHlwZXMgZnJvbSB0aGUgTGFyZ2UgRmlsZSBTdXBwb3J0IGludGVyZmFjZS4gICovCisKKy8qIFR5cGUgdG8gY291bnQgbnVtYmVyIG9mIGRpc2sgYmxvY2tzLiAgKi8KK19fU1REX1RZUEUgX19CTEtDTlRfVF9UWVBFIF9fYmxrY250X3Q7CitfX1NURF9UWVBFIF9fQkxLQ05UNjRfVF9UWVBFIF9fYmxrY250NjRfdDsKKworLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBibG9ja3MuICAqLworX19TVERfVFlQRSBfX0ZTQkxLQ05UX1RfVFlQRSBfX2ZzYmxrY250X3Q7CitfX1NURF9UWVBFIF9fRlNCTEtDTlQ2NF9UX1RZUEUgX19mc2Jsa2NudDY0X3Q7CisKKy8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gbm9kZXMuICAqLworX19TVERfVFlQRSBfX0ZTRklMQ05UX1RfVFlQRSBfX2ZzZmlsY250X3Q7CitfX1NURF9UWVBFIF9fRlNGSUxDTlQ2NF9UX1RZUEUgX19mc2ZpbGNudDY0X3Q7CisKK19fU1REX1RZUEUgX19TU0laRV9UX1RZUEUgX19zc2l6ZV90OyAvKiBUeXBlIG9mIGEgYnl0ZSBjb3VudCwgb3IgZXJyb3IuICAqLworCisvKiBUaGVzZSBmZXcgZG9uJ3QgcmVhbGx5IHZhcnkgYnkgc3lzdGVtLCB0aGV5IGFsd2F5cyBjb3JyZXNwb25kCisgICB0byBvbmUgb2YgdGhlIG90aGVyIGRlZmluZWQgdHlwZXMuICAqLwordHlwZWRlZiBfX29mZjY0X3QgX19sb2ZmX3Q7CS8qIFR5cGUgb2YgZmlsZSBzaXplcyBhbmQgb2Zmc2V0cyAoTEZTKS4gICovCit0eXBlZGVmIF9fcXVhZF90ICpfX3FhZGRyX3Q7Cit0eXBlZGVmIGNoYXIgKl9fY2FkZHJfdDsKKworLyogRHVwbGljYXRlcyBpbmZvIGZyb20gc3RkaW50LmggYnV0IHRoaXMgaXMgdXNlZCBpbiB1bmlzdGQuaC4gICovCitfX1NURF9UWVBFIF9fU1dPUkRfVFlQRSBfX2ludHB0cl90OworCisvKiBEdXBsaWNhdGUgaW5mbyBmcm9tIHN5cy9zb2NrZXQuaC4gICovCitfX1NURF9UWVBFIF9fVTMyX1RZUEUgX19zb2NrbGVuX3Q7CisKKworI3VuZGVmIF9fU1REX1RZUEUKKworI2VuZGlmIC8qIGJpdHMvdHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdHlwZXNpemVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy90eXBlc2l6ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTIyNmM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdHlwZXNpemVzLmgKQEAgLTAsMCArMSw2NiBAQAorLyogYml0cy90eXBlc2l6ZXMuaCAtLSB1bmRlcmx5aW5nIHR5cGVzIGZvciAqX3QuICBHZW5lcmljIHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0JJVFNfVFlQRVNfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy90eXBlc2l6ZXMuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3R5cGVzLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYJX0JJVFNfVFlQRVNJWkVTX0gKKyNkZWZpbmUJX0JJVFNfVFlQRVNJWkVTX0gJMQorCisvKiBTZWUgPGJpdHMvdHlwZXMuaD4gZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIG1hY3Jvcy4gIFRoaXMgZmlsZSBleGlzdHMgc28KKyAgIHRoYXQgPGJpdHMvdHlwZXMuaD4gbmVlZCBub3QgdmFyeSBhY3Jvc3MgZGlmZmVyZW50IEdOVSBwbGF0Zm9ybXMuICAqLworCisjZGVmaW5lIF9fREVWX1RfVFlQRQkJX19VUVVBRF9UWVBFCisjZGVmaW5lIF9fVUlEX1RfVFlQRQkJX19VMzJfVFlQRQorI2RlZmluZSBfX0dJRF9UX1RZUEUJCV9fVTMyX1RZUEUKKyNkZWZpbmUgX19JTk9fVF9UWVBFCQlfX1VMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fSU5PNjRfVF9UWVBFCQlfX1VRVUFEX1RZUEUKKyNkZWZpbmUgX19NT0RFX1RfVFlQRQkJX19VMzJfVFlQRQorI2RlZmluZSBfX05MSU5LX1RfVFlQRQkJX19VV09SRF9UWVBFCisjZGVmaW5lIF9fT0ZGX1RfVFlQRQkJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX09GRjY0X1RfVFlQRQkJX19TUVVBRF9UWVBFCisjZGVmaW5lIF9fUElEX1RfVFlQRQkJX19TMzJfVFlQRQorI2RlZmluZSBfX1JMSU1fVF9UWVBFCQlfX1VMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fUkxJTTY0X1RfVFlQRQkJX19VUVVBRF9UWVBFCisjZGVmaW5lCV9fQkxLQ05UX1RfVFlQRQkJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZQlfX0JMS0NOVDY0X1RfVFlQRQlfX1NRVUFEX1RZUEUKKyNkZWZpbmUJX19GU0JMS0NOVF9UX1RZUEUJX19VTE9OR1dPUkRfVFlQRQorI2RlZmluZQlfX0ZTQkxLQ05UNjRfVF9UWVBFCV9fVVFVQURfVFlQRQorI2RlZmluZQlfX0ZTRklMQ05UX1RfVFlQRQlfX1VMT05HV09SRF9UWVBFCisjZGVmaW5lCV9fRlNGSUxDTlQ2NF9UX1RZUEUJX19VUVVBRF9UWVBFCisjZGVmaW5lCV9fSURfVF9UWVBFCQlfX1UzMl9UWVBFCisjZGVmaW5lIF9fQ0xPQ0tfVF9UWVBFCQlfX1NMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fVElNRV9UX1RZUEUJCV9fU0xPTkdXT1JEX1RZUEUKKyNkZWZpbmUgX19VU0VDT05EU19UX1RZUEUJX19VMzJfVFlQRQorI2RlZmluZSBfX1NVU0VDT05EU19UX1RZUEUJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX0RBRERSX1RfVFlQRQkJX19TMzJfVFlQRQorI2RlZmluZSBfX1NXQkxLX1RfVFlQRQkJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX0tFWV9UX1RZUEUJCV9fUzMyX1RZUEUKKyNkZWZpbmUgX19DTE9DS0lEX1RfVFlQRQlfX1MzMl9UWVBFCisjZGVmaW5lIF9fVElNRVJfVF9UWVBFCQl2b2lkICoKKyNkZWZpbmUgX19CTEtTSVpFX1RfVFlQRQlfX1NMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fRlNJRF9UX1RZUEUJCXN0cnVjdCB7IGludCBfX3ZhbFsyXTsgfQorI2RlZmluZSBfX1NTSVpFX1RfVFlQRQkJX19TV09SRF9UWVBFCisKKy8qIE51bWJlciBvZiBkZXNjcmlwdG9ycyB0aGF0IGNhbiBmaXQgaW4gYW4gYGZkX3NldCcuICAqLworI2RlZmluZQlfX0ZEX1NFVFNJWkUJCTEwMjQKKworCisjZW5kaWYgLyogYml0cy90eXBlc2l6ZXMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdWlvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy91aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmQ3NzE5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdWlvLmgKQEAgLTAsMCArMSw3NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDA2LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX1NZU19VSU9fSCAmJiAhZGVmaW5lZCBfRkNOVExfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy91aW8uaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3Vpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX1VJT19ICisjZGVmaW5lIF9CSVRTX1VJT19ICTEKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisKKy8qIFdlIHNob3VsZCBub3JtYWxseSB1c2UgdGhlIExpbnV4IGtlcm5lbCBoZWFkZXIgZmlsZSB0byBkZWZpbmUgdGhpcworICAgdHlwZSBhbmQgbWFjcm9zIGJ1dCB0aGlzIGNhbGxzIGZvciB0cm91YmxlIGJlY2F1c2Ugb2YgdGhlIGhlYWRlcgorICAgaW5jbHVkZXMgb3RoZXIga2VybmVsIGhlYWRlcnMuICAqLworCisvKiBTaXplIG9mIG9iamVjdCB3aGljaCBjYW4gYmUgd3JpdHRlbiBhdG9taWNhbGx5LgorCisgICBUaGlzIG1hY3JvIGhhcyBkaWZmZXJlbnQgdmFsdWVzIGluIGRpZmZlcmVudCBrZXJuZWwgdmVyc2lvbnMuICBUaGUKKyAgIGxhdGVzdCB2ZXJzaW9ucyBvZiB0aGUga2VybmVsIHVzZSAxMDI0IGFuZCB0aGlzIGlzIGdvb2QgY2hvaWNlLiAgU2luY2UKKyAgIHRoZSBDIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gb2YgcmVhZHYvd3JpdGV2IGlzIGFibGUgdG8gZW11bGF0ZSB0aGUKKyAgIGZ1bmN0aW9uYWxpdHkgZXZlbiBpZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcga2VybmVsIGRvZXMgbm90IHN1cHBvcnQKKyAgIHRoaXMgbGFyZ2UgdmFsdWUgdGhlIHJlYWR2L3dyaXRldiBjYWxsIHdpbGwgbm90IGZhaWwgYmVjYXVzZSBvZiB0aGlzLiAgKi8KKyNkZWZpbmUgVUlPX01BWElPVgkxMDI0CisKKworLyogU3RydWN0dXJlIGZvciBzY2F0dGVyL2dhdGhlciBJL08uICAqLworc3RydWN0IGlvdmVjCisgIHsKKyAgICB2b2lkICppb3ZfYmFzZTsJLyogUG9pbnRlciB0byBkYXRhLiAgKi8KKyAgICBzaXplX3QgaW92X2xlbjsJLyogTGVuZ3RoIG9mIGRhdGEuICAqLworICB9OworCisjZW5kaWYKKworI2lmIGRlZmluZWQgX1NZU19VSU9fSCAmJiAhZGVmaW5lZCBfQklUU19VSU9fSF9GT1JfU1lTX1VJT19ICisjZGVmaW5lIF9CSVRTX1VJT19IX0ZPUl9TWVNfVUlPX0ggMQorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJlYWQgZnJvbSBhbm90aGVyIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UuICAqLworZXh0ZXJuIHNzaXplX3QgcHJvY2Vzc192bV9yZWFkdiAocGlkX3QgX19waWQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2x2ZWMsCisJCQkJIHVuc2lnbmVkIGxvbmcgaW50IF9fbGlvdmNudCwKKwkJCQkgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9fcnZlYywKKwkJCQkgdW5zaWduZWQgbG9uZyBpbnQgX19yaW92Y250LAorCQkJCSB1bnNpZ25lZCBsb25nIGludCBfX2ZsYWdzKQorICBfX1RIUk9XOworCisvKiBXcml0ZSB0byBhbm90aGVyIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UuICAqLworZXh0ZXJuIHNzaXplX3QgcHJvY2Vzc192bV93cml0ZXYgKHBpZF90IF9fcGlkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19sdmVjLAorCQkJCSAgdW5zaWduZWQgbG9uZyBpbnQgX19saW92Y250LAorCQkJCSAgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9fcnZlYywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgaW50IF9fcmlvdmNudCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgaW50IF9fZmxhZ3MpCisgIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdW5pc3RkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy91bmlzdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjliNGNjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdW5pc3RkLmgKQEAgLTAsMCArMSwzODYgQEAKKy8qIENoZWNraW5nIG1hY3JvcyBmb3IgdW5pc3RkIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfVU5JU1REX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvdW5pc3RkLmg+IGRpcmVjdGx5OyB1c2UgPHVuaXN0ZC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitleHRlcm4gc3NpemVfdCBfX3JlYWRfY2hrIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgIHNpemVfdCBfX2J1ZmxlbikgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlYWRfYWxpYXMsIChpbnQgX19mZCwgdm9pZCAqX19idWYsCisJCQkJCSAgc2l6ZV90IF9fbmJ5dGVzKSwgcmVhZCkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlYWRfY2hrX3dhcm4sCisJCQkgICAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkgICAgc2l6ZV90IF9fYnVmbGVuKSwgX19yZWFkX2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoInJlYWQgY2FsbGVkIHdpdGggYmlnZ2VyIGxlbmd0aCB0aGFuIHNpemUgb2YgIgorCQkgICAgICAgInRoZSBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBzc2l6ZV90CityZWFkIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcykKK3sKKyAgaWYgKF9fYm9zMCAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbmJ5dGVzKSkKKwlyZXR1cm4gX19yZWFkX2NoayAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX2JvczAgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX25ieXRlcyA+IF9fYm9zMCAoX19idWYpKQorCXJldHVybiBfX3JlYWRfY2hrX3dhcm4gKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19ib3MwIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fcmVhZF9hbGlhcyAoX19mZCwgX19idWYsIF9fbmJ5dGVzKTsKK30KKworI2lmZGVmIF9fVVNFX1VOSVg5OAorZXh0ZXJuIHNzaXplX3QgX19wcmVhZF9jaGsgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJICAgIF9fb2ZmX3QgX19vZmZzZXQsIHNpemVfdCBfX2J1ZnNpemUpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19wcmVhZDY0X2NoayAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkgICAgICBfX29mZjY0X3QgX19vZmZzZXQsIHNpemVfdCBfX2J1ZnNpemUpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19wcmVhZF9hbGlhcywKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgICBfX29mZl90IF9fb2Zmc2V0KSwgcHJlYWQpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19wcmVhZDY0X2FsaWFzLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJICAgIF9fb2ZmNjRfdCBfX29mZnNldCksIHByZWFkNjQpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19wcmVhZF9jaGtfd2FybiwKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgICBfX29mZl90IF9fb2Zmc2V0LCBzaXplX3QgX19idWZzaXplKSwgX19wcmVhZF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJwcmVhZCBjYWxsZWQgd2l0aCBiaWdnZXIgbGVuZ3RoIHRoYW4gc2l6ZSBvZiAiCisJCSAgICAgICAidGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19wcmVhZDY0X2Noa193YXJuLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJICAgIF9fb2ZmNjRfdCBfX29mZnNldCwgc2l6ZV90IF9fYnVmc2l6ZSksCisJCQkgICAgX19wcmVhZDY0X2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoInByZWFkNjQgY2FsbGVkIHdpdGggYmlnZ2VyIGxlbmd0aCB0aGFuIHNpemUgb2YgIgorCQkgICAgICAgInRoZSBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBzc2l6ZV90CitwcmVhZCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsIF9fb2ZmX3QgX19vZmZzZXQpCit7CisgIGlmIChfX2JvczAgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX25ieXRlcykpCisJcmV0dXJuIF9fcHJlYWRfY2hrIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0LCBfX2JvczAgKF9fYnVmKSk7CisKKyAgICAgIGlmICggX19uYnl0ZXMgPiBfX2JvczAgKF9fYnVmKSkKKwlyZXR1cm4gX19wcmVhZF9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCwKKwkJCQkgX19ib3MwIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fcHJlYWRfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQpOworfQorIyBlbHNlCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHNzaXplX3QKK3ByZWFkIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywgX19vZmY2NF90IF9fb2Zmc2V0KQoreworICBpZiAoX19ib3MwIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uYnl0ZXMpKQorCXJldHVybiBfX3ByZWFkNjRfY2hrIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0LCBfX2JvczAgKF9fYnVmKSk7CisKKyAgICAgIGlmICggX19uYnl0ZXMgPiBfX2JvczAgKF9fYnVmKSkKKwlyZXR1cm4gX19wcmVhZDY0X2Noa193YXJuIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0LAorCQkJCSAgIF9fYm9zMCAoX19idWYpKTsKKyAgICB9CisKKyAgcmV0dXJuIF9fcHJlYWQ2NF9hbGlhcyAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCk7Cit9CisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgc3NpemVfdAorcHJlYWQ2NCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsIF9fb2ZmNjRfdCBfX29mZnNldCkKK3sKKyAgaWYgKF9fYm9zMCAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbmJ5dGVzKSkKKwlyZXR1cm4gX19wcmVhZDY0X2NoayAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCwgX19ib3MwIChfX2J1ZikpOworCisgICAgICBpZiAoIF9fbmJ5dGVzID4gX19ib3MwIChfX2J1ZikpCisJcmV0dXJuIF9fcHJlYWQ2NF9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCwKKwkJCQkgICBfX2JvczAgKF9fYnVmKSk7CisgICAgfQorCisgIHJldHVybiBfX3ByZWFkNjRfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQpOworfQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworZXh0ZXJuIHNzaXplX3QgX19yZWFkbGlua19jaGsgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuLAorCQkJICAgICAgIHNpemVfdCBfX2J1ZmxlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUX05USCAoX19yZWFkbGlua19hbGlhcywKKwkJCSAgICAgICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwKKwkJCQljaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4pLCByZWFkbGluaykKKyAgICAgX19ub25udWxsICgoMSwgMikpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVF9OVEggKF9fcmVhZGxpbmtfY2hrX3dhcm4sCisJCQkgICAgICAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkJY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuLAorCQkJCXNpemVfdCBfX2J1ZmxlbiksIF9fcmVhZGxpbmtfY2hrKQorICAgICBfX25vbm51bGwgKCgxLCAyKSkgX193dXIgX193YXJuYXR0ciAoInJlYWRsaW5rIGNhbGxlZCB3aXRoIGJpZ2dlciBsZW5ndGggIgorCQkJCQkgICJ0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX19ub25udWxsICgoMSwgMikpIF9fd3VyIHNzaXplX3QKK19fTlRIIChyZWFkbGluayAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwgY2hhciAqX19yZXN0cmljdCBfX2J1ZiwKKwkJIHNpemVfdCBfX2xlbikpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX19yZWFkbGlua19jaGsgKF9fcGF0aCwgX19idWYsIF9fbGVuLCBfX2JvcyAoX19idWYpKTsKKworICAgICAgaWYgKCBfX2xlbiA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fcmVhZGxpbmtfY2hrX3dhcm4gKF9fcGF0aCwgX19idWYsIF9fbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX3JlYWRsaW5rX2FsaWFzIChfX3BhdGgsIF9fYnVmLCBfX2xlbik7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0FURklMRQorZXh0ZXJuIHNzaXplX3QgX19yZWFkbGlua2F0X2NoayAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkJIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbiwKKwkJCQkgc2l6ZV90IF9fYnVmbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3JlYWRsaW5rYXRfYWxpYXMsCisJCQkgICAgICAgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJCWNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbiksCisJCQkgICAgICAgcmVhZGxpbmthdCkKKyAgICAgX19ub25udWxsICgoMiwgMykpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVF9OVEggKF9fcmVhZGxpbmthdF9jaGtfd2FybiwKKwkJCSAgICAgICAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkJY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuLAorCQkJCXNpemVfdCBfX2J1ZmxlbiksIF9fcmVhZGxpbmthdF9jaGspCisgICAgIF9fbm9ubnVsbCAoKDIsIDMpKSBfX3d1ciBfX3dhcm5hdHRyICgicmVhZGxpbmthdCBjYWxsZWQgd2l0aCBiaWdnZXIgIgorCQkJCQkgICJsZW5ndGggdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJCQkJICAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX19ub25udWxsICgoMiwgMykpIF9fd3VyIHNzaXplX3QKK19fTlRIIChyZWFkbGlua2F0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwKKwkJICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuKSkKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX3JlYWRsaW5rYXRfY2hrIChfX2ZkLCBfX3BhdGgsIF9fYnVmLCBfX2xlbiwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX2xlbiA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fcmVhZGxpbmthdF9jaGtfd2FybiAoX19mZCwgX19wYXRoLCBfX2J1ZiwgX19sZW4sCisJCQkJICAgICAgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19yZWFkbGlua2F0X2FsaWFzIChfX2ZkLCBfX3BhdGgsIF9fYnVmLCBfX2xlbik7Cit9CisjZW5kaWYKKworZXh0ZXJuIGNoYXIgKl9fZ2V0Y3dkX2NoayAoY2hhciAqX19idWYsIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX2J1ZmxlbikKKyAgICAgX19USFJPVyBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUX05USCAoX19nZXRjd2RfYWxpYXMsCisJCQkgICAgIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fc2l6ZSksIGdldGN3ZCkgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVF9OVEggKF9fZ2V0Y3dkX2Noa193YXJuLAorCQkJICAgICAoY2hhciAqX19idWYsIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX2J1ZmxlbiksCisJCQkgICAgIF9fZ2V0Y3dkX2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoImdldGN3ZCBjYWxsZXIgd2l0aCBiaWdnZXIgbGVuZ3RoIHRoYW4gc2l6ZSBvZiAiCisJCSAgICAgICAiZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgY2hhciAqCitfX05USCAoZ2V0Y3dkIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fc2l6ZSkpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fc2l6ZSkpCisJcmV0dXJuIF9fZ2V0Y3dkX2NoayAoX19idWYsIF9fc2l6ZSwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX3NpemUgPiBfX2JvcyAoX19idWYpKQorCXJldHVybiBfX2dldGN3ZF9jaGtfd2FybiAoX19idWYsIF9fc2l6ZSwgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19nZXRjd2RfYWxpYXMgKF9fYnVmLCBfX3NpemUpOworfQorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorZXh0ZXJuIGNoYXIgKl9fZ2V0d2RfY2hrIChjaGFyICpfX2J1Ziwgc2l6ZV90IGJ1ZmxlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVF9OVEggKF9fZ2V0d2Rfd2FybiwgKGNoYXIgKl9fYnVmKSwgZ2V0d2QpCisgICAgIF9fbm9ubnVsbCAoKDEpKSBfX3d1ciBfX3dhcm5hdHRyICgicGxlYXNlIHVzZSBnZXRjd2QgaW5zdGVhZCwgYXMgZ2V0d2QgIgorCQkJCSAgICAgICAiZG9lc24ndCBzcGVjaWZ5IGJ1ZmZlciBzaXplIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX19ub25udWxsICgoMSkpIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXyBfX3d1ciBjaGFyICoKK19fTlRIIChnZXR3ZCAoY2hhciAqX19idWYpKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICByZXR1cm4gX19nZXR3ZF9jaGsgKF9fYnVmLCBfX2JvcyAoX19idWYpKTsKKyAgcmV0dXJuIF9fZ2V0d2Rfd2FybiAoX19idWYpOworfQorI2VuZGlmCisKK2V4dGVybiBzaXplX3QgX19jb25mc3RyX2NoayAoaW50IF9fbmFtZSwgY2hhciAqX19idWYsIHNpemVfdCBfX2xlbiwKKwkJCSAgICAgc2l6ZV90IF9fYnVmbGVuKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX19jb25mc3RyX2FsaWFzLCAoaW50IF9fbmFtZSwgY2hhciAqX19idWYsCisJCQkJCQlzaXplX3QgX19sZW4pLCBjb25mc3RyKTsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fY29uZnN0cl9jaGtfd2FybiwKKwkJCSAgICAgIChpbnQgX19uYW1lLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fbGVuLAorCQkJICAgICAgIHNpemVfdCBfX2J1ZmxlbiksIF9fY29uZnN0cl9jaGspCisgICAgIF9fd2FybmF0dHIgKCJjb25mc3RyIGNhbGxlZCB3aXRoIGJpZ2dlciBsZW5ndGggdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzaXplX3QKK19fTlRIIChjb25mc3RyIChpbnQgX19uYW1lLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fbGVuKSkKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX2NvbmZzdHJfY2hrIChfX25hbWUsIF9fYnVmLCBfX2xlbiwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX2JvcyAoX19idWYpIDwgX19sZW4pCisJcmV0dXJuIF9fY29uZnN0cl9jaGtfd2FybiAoX19uYW1lLCBfX2J1ZiwgX19sZW4sIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fY29uZnN0cl9hbGlhcyAoX19uYW1lLCBfX2J1ZiwgX19sZW4pOworfQorCisKK2V4dGVybiBpbnQgX19nZXRncm91cHNfY2hrIChpbnQgX19zaXplLCBfX2dpZF90IF9fbGlzdFtdLCBzaXplX3QgX19saXN0bGVuKQorICAgICBfX1RIUk9XIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19nZXRncm91cHNfYWxpYXMsIChpbnQgX19zaXplLCBfX2dpZF90IF9fbGlzdFtdKSwKKwkJCSAgIGdldGdyb3VwcykgX193dXI7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2dldGdyb3Vwc19jaGtfd2FybiwKKwkJCSAgIChpbnQgX19zaXplLCBfX2dpZF90IF9fbGlzdFtdLCBzaXplX3QgX19saXN0bGVuKSwKKwkJCSAgIF9fZ2V0Z3JvdXBzX2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoImdldGdyb3VwcyBjYWxsZWQgd2l0aCBiaWdnZXIgZ3JvdXAgY291bnQgdGhhbiB3aGF0ICIKKwkJICAgICAgICJjYW4gZml0IGludG8gZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAoZ2V0Z3JvdXBzIChpbnQgX19zaXplLCBfX2dpZF90IF9fbGlzdFtdKSkKK3sKKyAgaWYgKF9fYm9zIChfX2xpc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fc2l6ZSkgfHwgX19zaXplIDwgMCkKKwlyZXR1cm4gX19nZXRncm91cHNfY2hrIChfX3NpemUsIF9fbGlzdCwgX19ib3MgKF9fbGlzdCkpOworCisgICAgICBpZiAoX19zaXplICogc2l6ZW9mIChfX2dpZF90KSA+IF9fYm9zIChfX2xpc3QpKQorCXJldHVybiBfX2dldGdyb3Vwc19jaGtfd2FybiAoX19zaXplLCBfX2xpc3QsIF9fYm9zIChfX2xpc3QpKTsKKyAgICB9CisgIHJldHVybiBfX2dldGdyb3Vwc19hbGlhcyAoX19zaXplLCBfX2xpc3QpOworfQorCisKK2V4dGVybiBpbnQgX190dHluYW1lX3JfY2hrIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBzaXplX3QgX19ucmVhbCkgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3R0eW5hbWVfcl9hbGlhcywgKGludCBfX2ZkLCBjaGFyICpfX2J1ZiwKKwkJCQkJICAgICAgIHNpemVfdCBfX2J1ZmxlbiksIHR0eW5hbWVfcikKKyAgICAgX19ub25udWxsICgoMikpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX190dHluYW1lX3JfY2hrX3dhcm4sCisJCQkgICAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgc2l6ZV90IF9fbnJlYWwpLCBfX3R0eW5hbWVfcl9jaGspCisgICAgIF9fbm9ubnVsbCAoKDIpKSBfX3dhcm5hdHRyICgidHR5bmFtZV9yIGNhbGxlZCB3aXRoIGJpZ2dlciBidWZsZW4gdGhhbiAiCisJCQkJICJzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHR0eW5hbWVfciAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2J1ZmxlbikpCisJcmV0dXJuIF9fdHR5bmFtZV9yX2NoayAoX19mZCwgX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKworICAgICAgaWYgKF9fYnVmbGVuID4gX19ib3MgKF9fYnVmKSkKKwlyZXR1cm4gX190dHluYW1lX3JfY2hrX3dhcm4gKF9fZmQsIF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX190dHluYW1lX3JfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX2J1Zmxlbik7Cit9CisKKworI2lmIGRlZmluZWQgX19VU0VfUkVFTlRSQU5UIHx8IGRlZmluZWQgX19VU0VfUE9TSVgxOTk1MDYKK2V4dGVybiBpbnQgX19nZXRsb2dpbl9yX2NoayAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1Zmxlbiwgc2l6ZV90IF9fbnJlYWwpCisgICAgIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19nZXRsb2dpbl9yX2FsaWFzLCAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbiksCisJCSAgICAgICBnZXRsb2dpbl9yKSBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fZ2V0bG9naW5fcl9jaGtfd2FybiwKKwkJICAgICAgIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLCBzaXplX3QgX19ucmVhbCksCisJCSAgICAgICBfX2dldGxvZ2luX3JfY2hrKQorICAgICBfX25vbm51bGwgKCgxKSkgX193YXJuYXR0ciAoImdldGxvZ2luX3IgY2FsbGVkIHdpdGggYmlnZ2VyIGJ1ZmxlbiB0aGFuICIKKwkJCQkgInNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitnZXRsb2dpbl9yIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2J1ZmxlbikpCisJcmV0dXJuIF9fZ2V0bG9naW5fcl9jaGsgKF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX2J1ZmxlbiA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fZ2V0bG9naW5fcl9jaGtfd2FybiAoX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX2dldGxvZ2luX3JfYWxpYXMgKF9fYnVmLCBfX2J1Zmxlbik7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKK2V4dGVybiBpbnQgX19nZXRob3N0bmFtZV9jaGsgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sIHNpemVfdCBfX25yZWFsKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZ2V0aG9zdG5hbWVfYWxpYXMsIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSwKKwkJCSAgIGdldGhvc3RuYW1lKSBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2dldGhvc3RuYW1lX2Noa193YXJuLAorCQkJICAgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sIHNpemVfdCBfX25yZWFsKSwKKwkJCSAgIF9fZ2V0aG9zdG5hbWVfY2hrKQorICAgICBfX25vbm51bGwgKCgxKSkgX193YXJuYXR0ciAoImdldGhvc3RuYW1lIGNhbGxlZCB3aXRoIGJpZ2dlciBidWZsZW4gdGhhbiAiCisJCQkJICJzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKGdldGhvc3RuYW1lIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSkKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19idWZsZW4pKQorCXJldHVybiBfX2dldGhvc3RuYW1lX2NoayAoX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKworICAgICAgaWYgKF9fYnVmbGVuID4gX19ib3MgKF9fYnVmKSkKKwlyZXR1cm4gX19nZXRob3N0bmFtZV9jaGtfd2FybiAoX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX2dldGhvc3RuYW1lX2FsaWFzIChfX2J1ZiwgX19idWZsZW4pOworfQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IChkZWZpbmVkIF9fVVNFX1hPUEVOICYmICFkZWZpbmVkIF9fVVNFX1VOSVg5OCkKK2V4dGVybiBpbnQgX19nZXRkb21haW5uYW1lX2NoayAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1Zmxlbiwgc2l6ZV90IF9fbnJlYWwpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19nZXRkb21haW5uYW1lX2FsaWFzLCAoY2hhciAqX19idWYsCisJCQkJCQkgICBzaXplX3QgX19idWZsZW4pLAorCQkJICAgZ2V0ZG9tYWlubmFtZSkgX19ub25udWxsICgoMSkpIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19nZXRkb21haW5uYW1lX2Noa193YXJuLAorCQkJICAgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sIHNpemVfdCBfX25yZWFsKSwKKwkJCSAgIF9fZ2V0ZG9tYWlubmFtZV9jaGspCisgICAgIF9fbm9ubnVsbCAoKDEpKSBfX3d1ciBfX3dhcm5hdHRyICgiZ2V0ZG9tYWlubmFtZSBjYWxsZWQgd2l0aCBiaWdnZXIgIgorCQkJCSAgICAgICAiYnVmbGVuIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCQkJICAgICAgICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChnZXRkb21haW5uYW1lIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSkKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19idWZsZW4pKQorCXJldHVybiBfX2dldGRvbWFpbm5hbWVfY2hrIChfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoX19idWZsZW4gPiBfX2JvcyAoX19idWYpKQorCXJldHVybiBfX2dldGRvbWFpbm5hbWVfY2hrX3dhcm4gKF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19nZXRkb21haW5uYW1lX2FsaWFzIChfX2J1ZiwgX19idWZsZW4pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy91c3RhdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdXN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWM2YjcyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdXN0YXQuaApAQCAtMCwwICsxLDMxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19VU1RBVF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3VzdGF0Lmg+IGRpcmVjdGx5OyB1c2UgPHN5cy91c3RhdC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK3N0cnVjdCB1c3RhdAorICB7CisgICAgX19kYWRkcl90IGZfdGZyZWU7CQkvKiBOdW1iZXIgb2YgZnJlZSBibG9ja3MuICAqLworICAgIF9faW5vX3QgZl90aW5vZGU7CQkvKiBOdW1iZXIgb2YgZnJlZSBpbm9kZXMuICAqLworICAgIGNoYXIgZl9mbmFtZVs2XTsKKyAgICBjaGFyIGZfZnBhY2tbNl07CisgIH07CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy91dG1wLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy91dG1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1NWFkNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3V0bXAuaApAQCAtMCwwICsxLDEyNSBAQAorLyogVGhlIGBzdHJ1Y3QgdXRtcCcgdHlwZSwgZGVzY3JpYmluZyBlbnRyaWVzIGluIHRoZSB1dG1wIGZpbGUuICBHTlUgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMgorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1VUTVBfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy91dG1wLmg+IGRpcmVjdGx5OyB1c2UgPHV0bXAuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPHBhdGhzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKworI2RlZmluZSBVVF9MSU5FU0laRQkzMgorI2RlZmluZSBVVF9OQU1FU0laRQkzMgorI2RlZmluZSBVVF9IT1NUU0laRQkyNTYKKworCisvKiBUaGUgc3RydWN0dXJlIGRlc2NyaWJpbmcgYW4gZW50cnkgaW4gdGhlIGRhdGFiYXNlIG9mCisgICBwcmV2aW91cyBsb2dpbnMuICAqLworc3RydWN0IGxhc3Rsb2cKKyAgeworI2lmIF9fV09SRFNJWkUgPT0gNjQgJiYgZGVmaW5lZCBfX1dPUkRTSVpFX0NPTVBBVDMyCisgICAgaW50MzJfdCBsbF90aW1lOworI2Vsc2UKKyAgICBfX3RpbWVfdCBsbF90aW1lOworI2VuZGlmCisgICAgY2hhciBsbF9saW5lW1VUX0xJTkVTSVpFXTsKKyAgICBjaGFyIGxsX2hvc3RbVVRfSE9TVFNJWkVdOworICB9OworCisKKy8qIFRoZSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgc3RhdHVzIG9mIGEgdGVybWluYXRlZCBwcm9jZXNzLiAgVGhpcworICAgdHlwZSBpcyB1c2VkIGluIGBzdHJ1Y3QgdXRtcCcgYmVsb3cuICAqLworc3RydWN0IGV4aXRfc3RhdHVzCisgIHsKKyAgICBzaG9ydCBpbnQgZV90ZXJtaW5hdGlvbjsJLyogUHJvY2VzcyB0ZXJtaW5hdGlvbiBzdGF0dXMuICAqLworICAgIHNob3J0IGludCBlX2V4aXQ7CQkvKiBQcm9jZXNzIGV4aXQgc3RhdHVzLiAgKi8KKyAgfTsKKworCisvKiBUaGUgc3RydWN0dXJlIGRlc2NyaWJpbmcgYW4gZW50cnkgaW4gdGhlIHVzZXIgYWNjb3VudGluZyBkYXRhYmFzZS4gICovCitzdHJ1Y3QgdXRtcAoreworICBzaG9ydCBpbnQgdXRfdHlwZTsJCS8qIFR5cGUgb2YgbG9naW4uICAqLworICBwaWRfdCB1dF9waWQ7CQkJLyogUHJvY2VzcyBJRCBvZiBsb2dpbiBwcm9jZXNzLiAgKi8KKyAgY2hhciB1dF9saW5lW1VUX0xJTkVTSVpFXTsJLyogRGV2aWNlbmFtZS4gICovCisgIGNoYXIgdXRfaWRbNF07CQkvKiBJbml0dGFiIElELiAgKi8KKyAgY2hhciB1dF91c2VyW1VUX05BTUVTSVpFXTsJLyogVXNlcm5hbWUuICAqLworICBjaGFyIHV0X2hvc3RbVVRfSE9TVFNJWkVdOwkvKiBIb3N0bmFtZSBmb3IgcmVtb3RlIGxvZ2luLiAgKi8KKyAgc3RydWN0IGV4aXRfc3RhdHVzIHV0X2V4aXQ7CS8qIEV4aXQgc3RhdHVzIG9mIGEgcHJvY2VzcyBtYXJrZWQKKwkJCQkgICBhcyBERUFEX1BST0NFU1MuICAqLworLyogVGhlIHV0X3Nlc3Npb24gYW5kIHV0X3R2IGZpZWxkcyBtdXN0IGJlIHRoZSBzYW1lIHNpemUgd2hlbiBjb21waWxlZAorICAgMzItIGFuZCA2NC1iaXQuICBUaGlzIGFsbG93cyBkYXRhIGZpbGVzIGFuZCBzaGFyZWQgbWVtb3J5IHRvIGJlCisgICBzaGFyZWQgYmV0d2VlbiAzMi0gYW5kIDY0LWJpdCBhcHBsaWNhdGlvbnMuICAqLworI2lmIF9fV09SRFNJWkUgPT0gNjQgJiYgZGVmaW5lZCBfX1dPUkRTSVpFX0NPTVBBVDMyCisgIGludDMyX3QgdXRfc2Vzc2lvbjsJCS8qIFNlc3Npb24gSUQsIHVzZWQgZm9yIHdpbmRvd2luZy4gICovCisgIHN0cnVjdAorICB7CisgICAgaW50MzJfdCB0dl9zZWM7CQkvKiBTZWNvbmRzLiAgKi8KKyAgICBpbnQzMl90IHR2X3VzZWM7CQkvKiBNaWNyb3NlY29uZHMuICAqLworICB9IHV0X3R2OwkJCS8qIFRpbWUgZW50cnkgd2FzIG1hZGUuICAqLworI2Vsc2UKKyAgbG9uZyBpbnQgdXRfc2Vzc2lvbjsJCS8qIFNlc3Npb24gSUQsIHVzZWQgZm9yIHdpbmRvd2luZy4gICovCisgIHN0cnVjdCB0aW1ldmFsIHV0X3R2OwkJLyogVGltZSBlbnRyeSB3YXMgbWFkZS4gICovCisjZW5kaWYKKworICBpbnQzMl90IHV0X2FkZHJfdjZbNF07CS8qIEludGVybmV0IGFkZHJlc3Mgb2YgcmVtb3RlIGhvc3QuICAqLworICBjaGFyIF9fdW51c2VkWzIwXTsJCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAgKi8KK307CisKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGhhY2tzLiAgKi8KKyNkZWZpbmUgdXRfbmFtZQkJdXRfdXNlcgorI2lmbmRlZiBfTk9fVVRfVElNRQorLyogV2UgaGF2ZSBhIHByb2JsZW0gaGVyZTogYHV0X3RpbWUnIGlzIGFsc28gdXNlZCBvdGhlcndpc2UuICBEZWZpbmUKKyAgIF9OT19VVF9USU1FIGlmIHRoZSBjb21waWxlciBjb21wbGFpbnMuICAqLworIyBkZWZpbmUgdXRfdGltZQl1dF90di50dl9zZWMKKyNlbmRpZgorI2RlZmluZSB1dF94dGltZQl1dF90di50dl9zZWMKKyNkZWZpbmUgdXRfYWRkcgkJdXRfYWRkcl92NlswXQorCisKKy8qIFZhbHVlcyBmb3IgdGhlIGB1dF90eXBlJyBmaWVsZCBvZiBhIGBzdHJ1Y3QgdXRtcCcuICAqLworI2RlZmluZSBFTVBUWQkJMAkvKiBObyB2YWxpZCB1c2VyIGFjY291bnRpbmcgaW5mb3JtYXRpb24uICAqLworCisjZGVmaW5lIFJVTl9MVkwJCTEJLyogVGhlIHN5c3RlbSdzIHJ1bmxldmVsLiAgKi8KKyNkZWZpbmUgQk9PVF9USU1FCTIJLyogVGltZSBvZiBzeXN0ZW0gYm9vdC4gICovCisjZGVmaW5lIE5FV19USU1FCTMJLyogVGltZSBhZnRlciBzeXN0ZW0gY2xvY2sgY2hhbmdlZC4gICovCisjZGVmaW5lIE9MRF9USU1FCTQJLyogVGltZSB3aGVuIHN5c3RlbSBjbG9jayBjaGFuZ2VkLiAgKi8KKworI2RlZmluZSBJTklUX1BST0NFU1MJNQkvKiBQcm9jZXNzIHNwYXduZWQgYnkgdGhlIGluaXQgcHJvY2Vzcy4gICovCisjZGVmaW5lIExPR0lOX1BST0NFU1MJNgkvKiBTZXNzaW9uIGxlYWRlciBvZiBhIGxvZ2dlZCBpbiB1c2VyLiAgKi8KKyNkZWZpbmUgVVNFUl9QUk9DRVNTCTcJLyogTm9ybWFsIHByb2Nlc3MuICAqLworI2RlZmluZSBERUFEX1BST0NFU1MJOAkvKiBUZXJtaW5hdGVkIHByb2Nlc3MuICAqLworCisjZGVmaW5lIEFDQ09VTlRJTkcJOQorCisvKiBPbGQgTGludXggbmFtZSBmb3IgdGhlIEVNUFRZIHR5cGUuICAqLworI2RlZmluZSBVVF9VTktOT1dOCUVNUFRZCisKKworLyogVGVsbCB0aGUgdXNlciB0aGF0IHdlIGhhdmUgYSBtb2Rlcm4gc3lzdGVtIHdpdGggVVRfSE9TVCwgVVRfUElELAorICAgVVRfVFlQRSwgVVRfSUQgYW5kIFVUX1RWIGZpZWxkcy4gICovCisjZGVmaW5lIF9IQVZFX1VUX1RZUEUJMQorI2RlZmluZSBfSEFWRV9VVF9QSUQJMQorI2RlZmluZSBfSEFWRV9VVF9JRAkxCisjZGVmaW5lIF9IQVZFX1VUX1RWCTEKKyNkZWZpbmUgX0hBVkVfVVRfSE9TVAkxCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy91dG1weC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdXRtcHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODRjZGE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdXRtcHguaApAQCAtMCwwICsxLDEwMyBAQAorLyogU3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIHRoZSB1c2VyIGFjY291bnRpbmcgZGF0YWJhc2UuICBHTlUgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfVVRNUFhfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy91dG1weC5oPiBkaXJlY3RseTsgdXNlIDx1dG1weC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisKKyNpZmRlZiBfX1VTRV9HTlUKKyMgaW5jbHVkZSA8cGF0aHMuaD4KKyMgZGVmaW5lIF9QQVRIX1VUTVBYCV9QQVRIX1VUTVAKKyMgZGVmaW5lIF9QQVRIX1dUTVBYCV9QQVRIX1dUTVAKKyNlbmRpZgorCisKKyNkZWZpbmUgX19VVF9MSU5FU0laRQkzMgorI2RlZmluZSBfX1VUX05BTUVTSVpFCTMyCisjZGVmaW5lIF9fVVRfSE9TVFNJWkUJMjU2CisKKworLyogVGhlIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBzdGF0dXMgb2YgYSB0ZXJtaW5hdGVkIHByb2Nlc3MuICBUaGlzCisgICB0eXBlIGlzIHVzZWQgaW4gYHN0cnVjdCB1dG1weCcgYmVsb3cuICAqLworc3RydWN0IF9fZXhpdF9zdGF0dXMKKyAgeworI2lmZGVmIF9fVVNFX0dOVQorICAgIHNob3J0IGludCBlX3Rlcm1pbmF0aW9uOwkvKiBQcm9jZXNzIHRlcm1pbmF0aW9uIHN0YXR1cy4gICovCisgICAgc2hvcnQgaW50IGVfZXhpdDsJCS8qIFByb2Nlc3MgZXhpdCBzdGF0dXMuICAqLworI2Vsc2UKKyAgICBzaG9ydCBpbnQgX19lX3Rlcm1pbmF0aW9uOwkvKiBQcm9jZXNzIHRlcm1pbmF0aW9uIHN0YXR1cy4gICovCisgICAgc2hvcnQgaW50IF9fZV9leGl0OwkJLyogUHJvY2VzcyBleGl0IHN0YXR1cy4gICovCisjZW5kaWYKKyAgfTsKKworCisvKiBUaGUgc3RydWN0dXJlIGRlc2NyaWJpbmcgYW4gZW50cnkgaW4gdGhlIHVzZXIgYWNjb3VudGluZyBkYXRhYmFzZS4gICovCitzdHJ1Y3QgdXRtcHgKK3sKKyAgc2hvcnQgaW50IHV0X3R5cGU7CQkvKiBUeXBlIG9mIGxvZ2luLiAgKi8KKyAgX19waWRfdCB1dF9waWQ7CQkvKiBQcm9jZXNzIElEIG9mIGxvZ2luIHByb2Nlc3MuICAqLworICBjaGFyIHV0X2xpbmVbX19VVF9MSU5FU0laRV07CS8qIERldmljZW5hbWUuICAqLworICBjaGFyIHV0X2lkWzRdOwkJLyogSW5pdHRhYiBJRC4gKi8KKyAgY2hhciB1dF91c2VyW19fVVRfTkFNRVNJWkVdOwkvKiBVc2VybmFtZS4gICovCisgIGNoYXIgdXRfaG9zdFtfX1VUX0hPU1RTSVpFXTsJLyogSG9zdG5hbWUgZm9yIHJlbW90ZSBsb2dpbi4gICovCisgIHN0cnVjdCBfX2V4aXRfc3RhdHVzIHV0X2V4aXQ7CS8qIEV4aXQgc3RhdHVzIG9mIGEgcHJvY2VzcyBtYXJrZWQKKwkJCQkgICBhcyBERUFEX1BST0NFU1MuICAqLworCisvKiBUaGUgZmllbGRzIHV0X3Nlc3Npb24gYW5kIHV0X3R2IG11c3QgYmUgdGhlIHNhbWUgc2l6ZSB3aGVuIGNvbXBpbGVkCisgICAzMi0gYW5kIDY0LWJpdC4gIFRoaXMgYWxsb3dzIGZpbGVzIGFuZCBzaGFyZWQgbWVtb3J5IHRvIGJlIHNoYXJlZAorICAgYmV0d2VlbiAzMi0gYW5kIDY0LWJpdCBhcHBsaWNhdGlvbnMuICAqLworI2lmIF9fV09SRFNJWkUgPT0gNjQgJiYgZGVmaW5lZCBfX1dPUkRTSVpFX0NPTVBBVDMyCisgIF9faW50MzJfdCB1dF9zZXNzaW9uOwkJLyogU2Vzc2lvbiBJRCwgdXNlZCBmb3Igd2luZG93aW5nLiAgKi8KKyAgc3RydWN0CisgIHsKKyAgICBfX2ludDMyX3QgdHZfc2VjOwkJLyogU2Vjb25kcy4gICovCisgICAgX19pbnQzMl90IHR2X3VzZWM7CQkvKiBNaWNyb3NlY29uZHMuICAqLworICB9IHV0X3R2OwkJCS8qIFRpbWUgZW50cnkgd2FzIG1hZGUuICAqLworI2Vsc2UKKyAgbG9uZyBpbnQgdXRfc2Vzc2lvbjsJCS8qIFNlc3Npb24gSUQsIHVzZWQgZm9yIHdpbmRvd2luZy4gICovCisgIHN0cnVjdCB0aW1ldmFsIHV0X3R2OwkJLyogVGltZSBlbnRyeSB3YXMgbWFkZS4gICovCisjZW5kaWYKKyAgX19pbnQzMl90IHV0X2FkZHJfdjZbNF07CS8qIEludGVybmV0IGFkZHJlc3Mgb2YgcmVtb3RlIGhvc3QuICAqLworICBjaGFyIF9fdW51c2VkWzIwXTsJCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAgKi8KK307CisKKworLyogVmFsdWVzIGZvciB0aGUgYHV0X3R5cGUnIGZpZWxkIG9mIGEgYHN0cnVjdCB1dG1weCcuICAqLworI2RlZmluZSBFTVBUWQkJMAkvKiBObyB2YWxpZCB1c2VyIGFjY291bnRpbmcgaW5mb3JtYXRpb24uICAqLworCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBSVU5fTFZMCTEJLyogVGhlIHN5c3RlbSdzIHJ1bmxldmVsLiAgKi8KKyNlbmRpZgorI2RlZmluZSBCT09UX1RJTUUJMgkvKiBUaW1lIG9mIHN5c3RlbSBib290LiAgKi8KKyNkZWZpbmUgTkVXX1RJTUUJMwkvKiBUaW1lIGFmdGVyIHN5c3RlbSBjbG9jayBjaGFuZ2VkLiAgKi8KKyNkZWZpbmUgT0xEX1RJTUUJNAkvKiBUaW1lIHdoZW4gc3lzdGVtIGNsb2NrIGNoYW5nZWQuICAqLworCisjZGVmaW5lIElOSVRfUFJPQ0VTUwk1CS8qIFByb2Nlc3Mgc3Bhd25lZCBieSB0aGUgaW5pdCBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgTE9HSU5fUFJPQ0VTUwk2CS8qIFNlc3Npb24gbGVhZGVyIG9mIGEgbG9nZ2VkIGluIHVzZXIuICAqLworI2RlZmluZSBVU0VSX1BST0NFU1MJNwkvKiBOb3JtYWwgcHJvY2Vzcy4gICovCisjZGVmaW5lIERFQURfUFJPQ0VTUwk4CS8qIFRlcm1pbmF0ZWQgcHJvY2Vzcy4gICovCisKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIEFDQ09VTlRJTkcJOQkvKiBTeXN0ZW0gYWNjb3VudGluZy4gICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3V0c25hbWUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3V0c25hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWU3MWUzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdXRzbmFtZS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1VUU05BTUVfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy91dHNuYW1lLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy91dHNuYW1lLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIExlbmd0aCBvZiB0aGUgZW50cmllcyBpbiBgc3RydWN0IHV0c25hbWUnIGlzIDY1LiAgKi8KKyNkZWZpbmUgX1VUU05BTUVfTEVOR1RIIDY1CisKKy8qIExpbnV4IHByb3ZpZGVzIGFzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGBzdHJ1Y3QgdXRzbmFtZScKKyAgIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGRvbWFpbi4gIERlZmluZSBfVVRTTkFNRV9ET01BSU5fTEVOR1RICisgICB0byBhIHZhbHVlICE9IDAgdG8gYWN0aXZhdGUgdGhpcyBlbnRyeS4gICovCisjZGVmaW5lIF9VVFNOQU1FX0RPTUFJTl9MRU5HVEggX1VUU05BTUVfTEVOR1RICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy93YWl0ZmxhZ3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3dhaXRmbGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NGNlZGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy93YWl0ZmxhZ3MuaApAQCAtMCwwICsxLDM4IEBACisvKiBEZWZpbml0aW9ucyBvZiBmbGFnIGJpdHMgZm9yIGB3YWl0cGlkJyBldCBhbC4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwxOTk2LDE5OTcsMjAwMCwyMDA0LDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfU1lTX1dBSVRfSCAmJiAhZGVmaW5lZCBfU1RETElCX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvd2FpdGZsYWdzLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy93YWl0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworLyogQml0cyBpbiB0aGUgdGhpcmQgYXJndW1lbnQgdG8gYHdhaXRwaWQnLiAgKi8KKyNkZWZpbmUJV05PSEFORwkJMQkvKiBEb24ndCBibG9jayB3YWl0aW5nLiAgKi8KKyNkZWZpbmUJV1VOVFJBQ0VECTIJLyogUmVwb3J0IHN0YXR1cyBvZiBzdG9wcGVkIGNoaWxkcmVuLiAgKi8KKworLyogQml0cyBpbiB0aGUgZm91cnRoIGFyZ3VtZW50IHRvIGB3YWl0aWQnLiAgKi8KKyNkZWZpbmUgV1NUT1BQRUQJMgkvKiBSZXBvcnQgc3RvcHBlZCBjaGlsZCAoc2FtZSBhcyBXVU5UUkFDRUQpLiAqLworI2RlZmluZSBXRVhJVEVECQk0CS8qIFJlcG9ydCBkZWFkIGNoaWxkLiAgKi8KKyNkZWZpbmUgV0NPTlRJTlVFRAk4CS8qIFJlcG9ydCBjb250aW51ZWQgY2hpbGQuICAqLworI2RlZmluZSBXTk9XQUlUCQkweDAxMDAwMDAwIC8qIERvbid0IHJlYXAsIGp1c3QgcG9sbCBzdGF0dXMuICAqLworCisjZGVmaW5lIF9fV05PVEhSRUFEICAgICAweDIwMDAwMDAwIC8qIERvbid0IHdhaXQgb24gY2hpbGRyZW4gb2Ygb3RoZXIgdGhyZWFkcworCQkJCSAgICAgIGluIHRoaXMgZ3JvdXAgKi8KKyNkZWZpbmUgX19XQUxMCQkweDQwMDAwMDAwIC8qIFdhaXQgZm9yIGFueSBjaGlsZC4gICovCisjZGVmaW5lIF9fV0NMT05FCTB4ODAwMDAwMDAgLyogV2FpdCBmb3IgY2xvbmVkIHByb2Nlc3MuICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvd2FpdHN0YXR1cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvd2FpdHN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OWMyMjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy93YWl0c3RhdHVzLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qIERlZmluaXRpb25zIG9mIHN0YXR1cyBiaXRzIGZvciBgd2FpdCcgZXQgYWwuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5NCwxOTk2LDE5OTcsMjAwMCwyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX1NZU19XQUlUX0ggJiYgIWRlZmluZWQgX1NURExJQl9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3dhaXRzdGF0dXMuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3dhaXQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBFdmVyeXRoaW5nIGV4dGFudCBzbyBmYXIgdXNlcyB0aGVzZSBzYW1lIGJpdHMuICAqLworCisKKy8qIElmIFdJRkVYSVRFRChTVEFUVVMpLCB0aGUgbG93LW9yZGVyIDggYml0cyBvZiB0aGUgc3RhdHVzLiAgKi8KKyNkZWZpbmUJX19XRVhJVFNUQVRVUyhzdGF0dXMpCSgoKHN0YXR1cykgJiAweGZmMDApID4+IDgpCisKKy8qIElmIFdJRlNJR05BTEVEKFNUQVRVUyksIHRoZSB0ZXJtaW5hdGluZyBzaWduYWwuICAqLworI2RlZmluZQlfX1dURVJNU0lHKHN0YXR1cykJKChzdGF0dXMpICYgMHg3ZikKKworLyogSWYgV0lGU1RPUFBFRChTVEFUVVMpLCB0aGUgc2lnbmFsIHRoYXQgc3RvcHBlZCB0aGUgY2hpbGQuICAqLworI2RlZmluZQlfX1dTVE9QU0lHKHN0YXR1cykJX19XRVhJVFNUQVRVUyhzdGF0dXMpCisKKy8qIE5vbnplcm8gaWYgU1RBVFVTIGluZGljYXRlcyBub3JtYWwgdGVybWluYXRpb24uICAqLworI2RlZmluZQlfX1dJRkVYSVRFRChzdGF0dXMpCShfX1dURVJNU0lHKHN0YXR1cykgPT0gMCkKKworLyogTm9uemVybyBpZiBTVEFUVVMgaW5kaWNhdGVzIHRlcm1pbmF0aW9uIGJ5IGEgc2lnbmFsLiAgKi8KKyNkZWZpbmUgX19XSUZTSUdOQUxFRChzdGF0dXMpIFwKKyAgKCgoc2lnbmVkIGNoYXIpICgoKHN0YXR1cykgJiAweDdmKSArIDEpID4+IDEpID4gMCkKKworLyogTm9uemVybyBpZiBTVEFUVVMgaW5kaWNhdGVzIHRoZSBjaGlsZCBpcyBzdG9wcGVkLiAgKi8KKyNkZWZpbmUJX19XSUZTVE9QUEVEKHN0YXR1cykJKCgoc3RhdHVzKSAmIDB4ZmYpID09IDB4N2YpCisKKy8qIE5vbnplcm8gaWYgU1RBVFVTIGluZGljYXRlcyB0aGUgY2hpbGQgY29udGludWVkIGFmdGVyIGEgc3RvcC4gIFdlIG9ubHkKKyAgIGRlZmluZSB0aGlzIGlmIDxiaXRzL3dhaXRmbGFncy5oPiBwcm92aWRlcyB0aGUgV0NPTlRJTlVFRCBmbGFnIGJpdC4gICovCisjaWZkZWYgV0NPTlRJTlVFRAorIyBkZWZpbmUgX19XSUZDT05USU5VRUQoc3RhdHVzKQkoKHN0YXR1cykgPT0gX19XX0NPTlRJTlVFRCkKKyNlbmRpZgorCisvKiBOb256ZXJvIGlmIFNUQVRVUyBpbmRpY2F0ZXMgdGhlIGNoaWxkIGR1bXBlZCBjb3JlLiAgKi8KKyNkZWZpbmUJX19XQ09SRURVTVAoc3RhdHVzKQkoKHN0YXR1cykgJiBfX1dDT1JFRkxBRykKKworLyogTWFjcm9zIGZvciBjb25zdHJ1Y3Rpbmcgc3RhdHVzIHZhbHVlcy4gICovCisjZGVmaW5lCV9fV19FWElUQ09ERShyZXQsIHNpZykJKChyZXQpIDw8IDggfCAoc2lnKSkKKyNkZWZpbmUJX19XX1NUT1BDT0RFKHNpZykJKChzaWcpIDw8IDggfCAweDdmKQorI2RlZmluZSBfX1dfQ09OVElOVUVECQkweGZmZmYKKyNkZWZpbmUJX19XQ09SRUZMQUcJCTB4ODAKKworCisjaWZkZWYJX19VU0VfQlNECisKKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisKK3VuaW9uIHdhaXQKKyAgeworICAgIGludCB3X3N0YXR1czsKKyAgICBzdHJ1Y3QKKyAgICAgIHsKKyMgaWYJX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVuc2lnbmVkIGludCBfX3dfdGVybXNpZzo3OyAvKiBUZXJtaW5hdGluZyBzaWduYWwuICAqLworCXVuc2lnbmVkIGludCBfX3dfY29yZWR1bXA6MTsgLyogU2V0IGlmIGR1bXBlZCBjb3JlLiAgKi8KKwl1bnNpZ25lZCBpbnQgX193X3JldGNvZGU6ODsgLyogUmV0dXJuIGNvZGUgaWYgZXhpdGVkIG5vcm1hbGx5LiAgKi8KKwl1bnNpZ25lZCBpbnQ6MTY7CisjIGVuZGlmCQkJCS8qIExpdHRsZSBlbmRpYW4uICAqLworIyBpZglfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50OjE2OworCXVuc2lnbmVkIGludCBfX3dfcmV0Y29kZTo4OworCXVuc2lnbmVkIGludCBfX3dfY29yZWR1bXA6MTsKKwl1bnNpZ25lZCBpbnQgX193X3Rlcm1zaWc6NzsKKyMgZW5kaWYJCQkJLyogQmlnIGVuZGlhbi4gICovCisgICAgICB9IF9fd2FpdF90ZXJtaW5hdGVkOworICAgIHN0cnVjdAorICAgICAgeworIyBpZglfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdW5zaWduZWQgaW50IF9fd19zdG9wdmFsOjg7IC8qIFdfU1RPUFBFRCBpZiBzdG9wcGVkLiAgKi8KKwl1bnNpZ25lZCBpbnQgX193X3N0b3BzaWc6ODsgLyogU3RvcHBpbmcgc2lnbmFsLiAgKi8KKwl1bnNpZ25lZCBpbnQ6MTY7CisjIGVuZGlmCQkJCS8qIExpdHRsZSBlbmRpYW4uICAqLworIyBpZglfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50OjE2OworCXVuc2lnbmVkIGludCBfX3dfc3RvcHNpZzo4OyAvKiBTdG9wcGluZyBzaWduYWwuICAqLworCXVuc2lnbmVkIGludCBfX3dfc3RvcHZhbDo4OyAvKiBXX1NUT1BQRUQgaWYgc3RvcHBlZC4gICovCisjIGVuZGlmCQkJCS8qIEJpZyBlbmRpYW4uICAqLworICAgICAgfSBfX3dhaXRfc3RvcHBlZDsKKyAgfTsKKworIyBkZWZpbmUgd190ZXJtc2lnCV9fd2FpdF90ZXJtaW5hdGVkLl9fd190ZXJtc2lnCisjIGRlZmluZSB3X2NvcmVkdW1wCV9fd2FpdF90ZXJtaW5hdGVkLl9fd19jb3JlZHVtcAorIyBkZWZpbmUgd19yZXRjb2RlCV9fd2FpdF90ZXJtaW5hdGVkLl9fd19yZXRjb2RlCisjIGRlZmluZSB3X3N0b3BzaWcJX193YWl0X3N0b3BwZWQuX193X3N0b3BzaWcKKyMgZGVmaW5lIHdfc3RvcHZhbAlfX3dhaXRfc3RvcHBlZC5fX3dfc3RvcHZhbAorCisjZW5kaWYJLyogVXNlIEJTRC4gICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy93Y2hhci1sZGJsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy93Y2hhci1sZGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhNmE2OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3djaGFyLWxkYmwuaApAQCAtMCwwICsxLDc1IEBACisvKiAtbWxvbmctZG91YmxlLTY0IGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgPHdjaGFyLmg+IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfV0NIQVJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy93Y2hhci1sZGJsLmg+IGRpcmVjdGx5OyB1c2UgPHdjaGFyLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0lTT0M5NSB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CitfX0xEQkxfUkVESVJfREVDTCAoZndwcmludGYpOworX19MREJMX1JFRElSX0RFQ0wgKHdwcmludGYpOworX19MREJMX1JFRElSX0RFQ0wgKHN3cHJpbnRmKTsKK19fTERCTF9SRURJUl9ERUNMICh2ZndwcmludGYpOworX19MREJMX1JFRElSX0RFQ0wgKHZ3cHJpbnRmKTsKK19fTERCTF9SRURJUl9ERUNMICh2c3dwcmludGYpOworIyBpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSAmJiAhZGVmaW5lZCBfX1VTRV9HTlUgXAorICAgICAmJiAhZGVmaW5lZCBfX1JFRElSRUNUIFwKKyAgICAgJiYgKGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykKK19fTERCTF9SRURJUjFfREVDTCAoZndzY2FuZiwgX19ubGRibF9fX2lzb2M5OV9md3NjYW5mKQorX19MREJMX1JFRElSMV9ERUNMICh3c2NhbmYsIF9fbmxkYmxfX19pc29jOTlfd3NjYW5mKSAgCitfX0xEQkxfUkVESVIxX0RFQ0wgKHN3c2NhbmYsIF9fbmxkYmxfX19pc29jOTlfc3dzY2FuZikKKyMgZWxzZQorX19MREJMX1JFRElSX0RFQ0wgKGZ3c2NhbmYpOworX19MREJMX1JFRElSX0RFQ0wgKHdzY2FuZik7CitfX0xEQkxfUkVESVJfREVDTCAoc3dzY2FuZik7CisjIGVuZGlmCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CitfX0xEQkxfUkVESVIxX0RFQ0wgKHdjc3RvbGQsIHdjc3RvZCk7CisjIGlmICFkZWZpbmVkIF9fVVNFX0dOVSAmJiAhZGVmaW5lZCBfX1JFRElSRUNUIFwKKyAgICAgJiYgKGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykKK19fTERCTF9SRURJUjFfREVDTCAodmZ3c2NhbmYsIF9fbmxkYmxfX19pc29jOTlfdmZ3c2NhbmYpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHZ3c2NhbmYsIF9fbmxkYmxfX19pc29jOTlfdndzY2FuZikgIAorX19MREJMX1JFRElSMV9ERUNMICh2c3dzY2FuZiwgX19ubGRibF9fX2lzb2M5OV92c3dzY2FuZikKKyMgZWxzZQorX19MREJMX1JFRElSX0RFQ0wgKHZmd3NjYW5mKTsKK19fTERCTF9SRURJUl9ERUNMICh2d3NjYW5mKTsKK19fTERCTF9SRURJUl9ERUNMICh2c3dzY2FuZik7CisjIGVuZGlmCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorX19MREJMX1JFRElSMV9ERUNMICh3Y3N0b2xkX2wsIHdjc3RvZF9sKTsKKyNlbmRpZgorCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lCitfX0xEQkxfUkVESVJfREVDTCAoX19zd3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192c3dwcmludGZfY2hrKQorIyBpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMQorX19MREJMX1JFRElSX0RFQ0wgKF9fZndwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fd3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192ZndwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdndwcmludGZfY2hrKQorIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy93Y2hhci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvd2NoYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDIzZmUzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvd2NoYXIuaApAQCAtMCwwICsxLDQzIEBACisvKiB3Y2hhcl90IHR5cGUgcmVsYXRlZCBkZWZpbml0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfQklUU19XQ0hBUl9ICisjZGVmaW5lIF9CSVRTX1dDSEFSX0gJMQorCisvKiBVc2UgR0NDJ3MgX19XQ0hBUl9NQVhfXyB3aGVuIGF2YWlsYWJsZS4gICovCisjaWZkZWYgX19XQ0hBUl9NQVhfXworI2RlZmluZSBfX1dDSEFSX01BWAlfX1dDSEFSX01BWF9fCisjZWxzZQorI2RlZmluZSBfX1dDSEFSX01BWAkoMjE0NzQ4MzY0NykKKyNlbmRpZgorCisvKiBHQ0MgbWF5IGFsc28gZGVmaW5lIF9fV0NIQVJfVU5TSUdORURfXy4KKyAgIFVzZSBMJ1wwJyB0byBnaXZlIHRoZSBleHByZXNzaW9uIHRoZSBjb3JyZWN0ICh1bnNpZ25lZCkgdHlwZS4gICovCisjaWZkZWYgX19XQ0hBUl9VTlNJR05FRF9fCisjZGVmaW5lIF9fV0NIQVJfTUlOICAgICAgIEwnXDAnCisKKy8qIEZhaWxpbmcgdGhhdCwgcmVseSBvbiB0aGUgcHJlcHJvY2Vzc29yJ3Mga25vd2xlZGdlIG9mIHRoZQorICAgc2lnbmVkbmVzcyBvZiB3Y2hhcl90LiAgKi8KKyNlbGlmIEwnXDAnIC0gMSA+IDAKKyNkZWZpbmUgX19XQ0hBUl9NSU4gICAgICAgTCdcMCcKKyNlbHNlCisjZGVmaW5lIF9fV0NIQVJfTUlOICAgICAgICgtX19XQ0hBUl9NQVggLSAxKQorI2VuZGlmCisKKyNlbmRpZgkvKiBiaXRzL3djaGFyLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3djaGFyMi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvd2NoYXIyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4ZWFhMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3djaGFyMi5oCkBAIC0wLDAgKzEsNTk0IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHdjaGFyIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfV0NIQVJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy93Y2hhcjIuaD4gZGlyZWN0bHk7IHVzZSA8d2NoYXIuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCitleHRlcm4gd2NoYXJfdCAqX193bWVtY3B5X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uLAorCQkJICAgICAgIHNpemVfdCBfX25zMSkgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtY3B5X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczEsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uKSwKKwkJCQl3bWVtY3B5KTsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtY3B5X2Noa193YXJuLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczEsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uLAorCQkJCSBzaXplX3QgX19uczEpLCBfX3dtZW1jcHlfY2hrKQorICAgICBfX3dhcm5hdHRyICgid21lbWNweSBjYWxsZWQgd2l0aCBsZW5ndGggYmlnZ2VyIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod21lbWNweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwKKwkJc2l6ZV90IF9fbikpCit7CisgIGlmIChfX2JvczAgKF9fczEpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikpCisJcmV0dXJuIF9fd21lbWNweV9jaGsgKF9fczEsIF9fczIsIF9fbiwKKwkJCSAgICAgIF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbiA+IF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX3dtZW1jcHlfY2hrX3dhcm4gKF9fczEsIF9fczIsIF9fbiwKKwkJCQkgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193bWVtY3B5X2FsaWFzIChfX3MxLCBfX3MyLCBfX24pOworfQorCisKK2V4dGVybiB3Y2hhcl90ICpfX3dtZW1tb3ZlX2NoayAod2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLAorCQkJCXNpemVfdCBfX24sIHNpemVfdCBfX25zMSkgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtbW92ZV9hbGlhcywgKHdjaGFyX3QgKl9fczEsCisJCQkJCQkgICBfX2NvbnN0IHdjaGFyX3QgKl9fczIsCisJCQkJCQkgICBzaXplX3QgX19uKSwgd21lbW1vdmUpOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3dtZW1tb3ZlX2Noa193YXJuLAorCQkJCSh3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIsCisJCQkJIHNpemVfdCBfX24sIHNpemVfdCBfX25zMSksIF9fd21lbW1vdmVfY2hrKQorICAgICBfX3dhcm5hdHRyICgid21lbW1vdmUgY2FsbGVkIHdpdGggbGVuZ3RoIGJpZ2dlciB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdtZW1tb3ZlICh3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIsIHNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MwIChfX3MxKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pKQorCXJldHVybiBfX3dtZW1tb3ZlX2NoayAoX19zMSwgX19zMiwgX19uLAorCQkJICAgICAgIF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbiA+IF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX3dtZW1tb3ZlX2Noa193YXJuIChfX3MxLCBfX3MyLCBfX24sCisJCQkJICAgIF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICB9CisgIHJldHVybiBfX3dtZW1tb3ZlX2FsaWFzIChfX3MxLCBfX3MyLCBfX24pOworfQorCisKKyNpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiB3Y2hhcl90ICpfX3dtZW1wY3B5X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJCV9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uLAorCQkJCXNpemVfdCBfX25zMSkgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtcGNweV9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwKKwkJCQkgc2l6ZV90IF9fbiksIHdtZW1wY3B5KTsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtcGNweV9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbiwKKwkJCQkgc2l6ZV90IF9fbnMxKSwgX193bWVtcGNweV9jaGspCisgICAgIF9fd2FybmF0dHIgKCJ3bWVtcGNweSBjYWxsZWQgd2l0aCBsZW5ndGggYmlnZ2VyIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod21lbXBjcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczIsCisJCSBzaXplX3QgX19uKSkKK3sKKyAgaWYgKF9fYm9zMCAoX19zMSkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX193bWVtcGNweV9jaGsgKF9fczEsIF9fczIsIF9fbiwKKwkJCSAgICAgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisKKyAgICAgIGlmIChfX24gPiBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX193bWVtcGNweV9jaGtfd2FybiAoX19zMSwgX19zMiwgX19uLAorCQkJCSAgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193bWVtcGNweV9hbGlhcyAoX19zMSwgX19zMiwgX19uKTsKK30KKyNlbmRpZgorCisKK2V4dGVybiB3Y2hhcl90ICpfX3dtZW1zZXRfY2hrICh3Y2hhcl90ICpfX3MsIHdjaGFyX3QgX19jLCBzaXplX3QgX19uLAorCQkJICAgICAgIHNpemVfdCBfX25zKSBfX1RIUk9XOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3dtZW1zZXRfYWxpYXMsICh3Y2hhcl90ICpfX3MsIHdjaGFyX3QgX19jLAorCQkJCQkJICBzaXplX3QgX19uKSwgd21lbXNldCk7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd21lbXNldF9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fYywgc2l6ZV90IF9fbiwKKwkJCQkgc2l6ZV90IF9fbnMpLCBfX3dtZW1zZXRfY2hrKQorICAgICBfX3dhcm5hdHRyICgid21lbXNldCBjYWxsZWQgd2l0aCBsZW5ndGggYmlnZ2VyIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod21lbXNldCAod2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fYywgc2l6ZV90IF9fbikpCit7CisgIGlmIChfX2JvczAgKF9fcykgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX193bWVtc2V0X2NoayAoX19zLCBfX2MsIF9fbiwgX19ib3MwIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisKKyAgICAgIGlmIChfX24gPiBfX2JvczAgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX3dtZW1zZXRfY2hrX3dhcm4gKF9fcywgX19jLCBfX24sCisJCQkJICAgX19ib3MwIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193bWVtc2V0X2FsaWFzIChfX3MsIF9fYywgX19uKTsKK30KKworCitleHRlcm4gd2NoYXJfdCAqX193Y3NjcHlfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCSAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgIHNpemVfdCBfX24pIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NzY3B5X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjKSwgd2NzY3B5KTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3Y3NjcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fd2NzY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgcmV0dXJuIF9fd2NzY3B5X2FsaWFzIChfX2Rlc3QsIF9fc3JjKTsKK30KKworCitleHRlcm4gd2NoYXJfdCAqX193Y3BjcHlfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCSAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgIHNpemVfdCBfX2Rlc3RsZW4pIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NwY3B5X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjKSwgd2NwY3B5KTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3Y3BjcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fd2NwY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgcmV0dXJuIF9fd2NwY3B5X2FsaWFzIChfX2Rlc3QsIF9fc3JjKTsKK30KKworCitleHRlcm4gd2NoYXJfdCAqX193Y3NuY3B5X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uLAorCQkJICAgICAgIHNpemVfdCBfX2Rlc3RsZW4pIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NzbmNweV9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCQkgc2l6ZV90IF9fbiksIHdjc25jcHkpOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3djc25jcHlfY2hrX3dhcm4sCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkJIHNpemVfdCBfX24sIHNpemVfdCBfX2Rlc3RsZW4pLCBfX3djc25jcHlfY2hrKQorICAgICBfX3dhcm5hdHRyICgid2NzbmNweSBjYWxsZWQgd2l0aCBsZW5ndGggYmlnZ2VyIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod2NzbmNweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJc2l6ZV90IF9fbikpCit7CisgIGlmIChfX2JvcyAoX19kZXN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pKQorCXJldHVybiBfX3djc25jcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX24sCisJCQkgICAgICBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgICAgaWYgKF9fbiA+IF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX193Y3NuY3B5X2Noa193YXJuIChfX2Rlc3QsIF9fc3JjLCBfX24sCisJCQkJICAgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICB9CisgIHJldHVybiBfX3djc25jcHlfYWxpYXMgKF9fZGVzdCwgX19zcmMsIF9fbik7Cit9CisKKworZXh0ZXJuIHdjaGFyX3QgKl9fd2NwbmNweV9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbiwKKwkJCSAgICAgICBzaXplX3QgX19kZXN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3djcG5jcHlfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkJIHNpemVfdCBfX24pLCB3Y3BuY3B5KTsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3BuY3B5X2Noa193YXJuLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJCSBzaXplX3QgX19uLCBzaXplX3QgX19kZXN0bGVuKSwgX193Y3BuY3B5X2NoaykKKyAgICAgX193YXJuYXR0ciAoIndjcG5jcHkgY2FsbGVkIHdpdGggbGVuZ3RoIGJpZ2dlciB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdjcG5jcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCXNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX193Y3BuY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJICAgICAgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICAgIGlmIChfX24gPiBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fd2NwbmNweV9jaGtfd2FybiAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJCSAgIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193Y3BuY3B5X2FsaWFzIChfX2Rlc3QsIF9fc3JjLCBfX24pOworfQorCisKK2V4dGVybiB3Y2hhcl90ICpfX3djc2NhdF9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgc2l6ZV90IF9fZGVzdGxlbikgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3NjYXRfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpLCB3Y3NjYXQpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdjc2NhdCAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYykpCit7CisgIGlmIChfX2JvcyAoX19kZXN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICByZXR1cm4gX193Y3NjYXRfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworICByZXR1cm4gX193Y3NjYXRfYWxpYXMgKF9fZGVzdCwgX19zcmMpOworfQorCisKK2V4dGVybiB3Y2hhcl90ICpfX3djc25jYXRfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbiwgc2l6ZV90IF9fZGVzdGxlbikgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3NuY2F0X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJCSBzaXplX3QgX19uKSwgd2NzbmNhdCk7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod2NzbmNhdCAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJc2l6ZV90IF9fbikpCit7CisgIGlmIChfX2JvcyAoX19kZXN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICByZXR1cm4gX193Y3NuY2F0X2NoayAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJICBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworICByZXR1cm4gX193Y3NuY2F0X2FsaWFzIChfX2Rlc3QsIF9fc3JjLCBfX24pOworfQorCisKK2V4dGVybiBpbnQgX19zd3ByaW50Zl9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkJICAgaW50IF9fZmxhZywgc2l6ZV90IF9fc19sZW4sCisJCQkgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKKyAgICAgX19USFJPVyAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193cHJpbnRmX18sIDUsIDYpKSkgKi87CisKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEhfTERCTCAoX19zd3ByaW50Zl9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKSwKKwkJCQlzd3ByaW50Zik7CisKKyNpZmRlZiBfX3ZhX2FyZ19wYWNrCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHN3cHJpbnRmICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKSkKK3sKKyAgaWYgKF9fYm9zIChfX3MpICE9IChzaXplX3QpIC0xIHx8IF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAxKQorICAgIHJldHVybiBfX3N3cHJpbnRmX2NoayAoX19zLCBfX24sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLAorCQkJICAgX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpLAorCQkJICAgX19mbXQsIF9fdmFfYXJnX3BhY2sgKCkpOworICByZXR1cm4gX19zd3ByaW50Zl9hbGlhcyAoX19zLCBfX24sIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyNlbGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisvKiBYWFggV2UgbWlnaHQgd2FudCB0byBoYXZlIHN1cHBvcnQgaW4gZ2NjIGZvciBzd3ByaW50Zi4gICovCisjIGRlZmluZSBzd3ByaW50ZihzLCBuLCAuLi4pIFwKKyAgKF9fYm9zIChzKSAhPSAoc2l6ZV90KSAtMSB8fCBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMQkJCSAgICAgIFwKKyAgID8gX19zd3ByaW50Zl9jaGsgKHMsIG4sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLAkJCSAgICAgIFwKKwkJICAgICBfX2JvcyAocykgLyBzaXplb2YgKHdjaGFyX3QpLCBfX1ZBX0FSR1NfXykJCSAgICAgIFwKKyAgIDogc3dwcmludGYgKHMsIG4sIF9fVkFfQVJHU19fKSkKKyNlbmRpZgorCitleHRlcm4gaW50IF9fdnN3cHJpbnRmX2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCQkgICAgaW50IF9fZmxhZywgc2l6ZV90IF9fc19sZW4sCisJCQkgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgIF9fZ251Y192YV9saXN0IF9fYXJnKQorICAgICBfX1RIUk9XIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dwcmludGZfXywgNSwgMCkpKSAqLzsKKworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USF9MREJMIChfX3Zzd3ByaW50Zl9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwKKwkJCQkgX19nbnVjX3ZhX2xpc3QgX19hcCksIHZzd3ByaW50Zik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAodnN3cHJpbnRmICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIF9fZ251Y192YV9saXN0IF9fYXApKQoreworICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEgfHwgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEpCisgICAgcmV0dXJuIF9fdnN3cHJpbnRmX2NoayAoX19zLCBfX24sICBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwKKwkJCSAgICBfX2JvcyAoX19zKSAvIHNpemVvZiAod2NoYXJfdCksIF9fZm10LCBfX2FwKTsKKyAgcmV0dXJuIF9fdnN3cHJpbnRmX2FsaWFzIChfX3MsIF9fbiwgX19mbXQsIF9fYXApOworfQorCisKKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMQorCitleHRlcm4gaW50IF9fZndwcmludGZfY2hrIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGludCBfX2ZsYWcsCisJCQkgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLik7CitleHRlcm4gaW50IF9fd3ByaW50Zl9jaGsgKGludCBfX2ZsYWcsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgLi4uKTsKK2V4dGVybiBpbnQgX192ZndwcmludGZfY2hrIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGludCBfX2ZsYWcsCisJCQkgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgIF9fZ251Y192YV9saXN0IF9fYXApOworZXh0ZXJuIGludCBfX3Z3cHJpbnRmX2NoayAoaW50IF9fZmxhZywgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgX19nbnVjX3ZhX2xpc3QgX19hcCk7CisKKyMgaWZkZWYgX192YV9hcmdfcGFjaworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3dwcmludGYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQoreworICByZXR1cm4gX193cHJpbnRmX2NoayAoX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK2Z3cHJpbnRmIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQoreworICByZXR1cm4gX19md3ByaW50Zl9jaGsgKF9fc3RyZWFtLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsCisJCQkgX192YV9hcmdfcGFjayAoKSk7Cit9CisjIGVsaWYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgIGRlZmluZSB3cHJpbnRmKC4uLikgXAorICBfX3dwcmludGZfY2hrIChfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19WQV9BUkdTX18pCisjICBkZWZpbmUgZndwcmludGYoc3RyZWFtLCAuLi4pIFwKKyAgX19md3ByaW50Zl9jaGsgKHN0cmVhbSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyBlbmRpZgorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAordndwcmludGYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwgX19nbnVjX3ZhX2xpc3QgX19hcCkKK3sKKyAgcmV0dXJuIF9fdndwcmludGZfY2hrIChfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsIF9fYXApOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAordmZ3cHJpbnRmIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm10LCBfX2dudWNfdmFfbGlzdCBfX2FwKQoreworICByZXR1cm4gX192ZndwcmludGZfY2hrIChfX3N0cmVhbSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKK30KKworI2VuZGlmCisKK2V4dGVybiB3Y2hhcl90ICpfX2ZnZXR3c19jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19zaXplLCBpbnQgX19uLAorCQkJICAgICAgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUIChfX2ZnZXR3c19hbGlhcywKKwkJCSAgICAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIGludCBfX24sCisJCQkgICAgIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIGZnZXR3cykgX193dXI7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVCAoX19mZ2V0d3NfY2hrX3dhcm4sCisJCQkgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19zaXplLCBpbnQgX19uLAorCQkJICAgICBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLCBfX2ZnZXR3c19jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJmZ2V0d3MgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgdGhhbiBsZW5ndGggIgorCQkgICAgICAgIm9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHdjaGFyX3QgKgorZmdldHdzICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSB8fCBfX24gPD0gMCkKKwlyZXR1cm4gX19mZ2V0d3NfY2hrIChfX3MsIF9fYm9zIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSwKKwkJCSAgICAgX19uLCBfX3N0cmVhbSk7CisKKyAgICAgIGlmICgoc2l6ZV90KSBfX24gPiBfX2JvcyAoX19zKSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fZmdldHdzX2Noa193YXJuIChfX3MsIF9fYm9zIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSwKKwkJCQkgIF9fbiwgX19zdHJlYW0pOworICAgIH0KKyAgcmV0dXJuIF9fZmdldHdzX2FsaWFzIChfX3MsIF9fbiwgX19zdHJlYW0pOworfQorCisjaWZkZWYgX19VU0VfR05VCitleHRlcm4gd2NoYXJfdCAqX19mZ2V0d3NfdW5sb2NrZWRfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwKKwkJCQkgICAgICAgaW50IF9fbiwgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQorICBfX3d1cjsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUIChfX2ZnZXR3c191bmxvY2tlZF9hbGlhcywKKwkJCSAgICAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIGludCBfX24sCisJCQkgICAgIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIGZnZXR3c191bmxvY2tlZCkKKyAgX193dXI7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVCAoX19mZ2V0d3NfdW5sb2NrZWRfY2hrX3dhcm4sCisJCQkgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19zaXplLCBpbnQgX19uLAorCQkJICAgICBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLAorCQkJICAgIF9fZmdldHdzX3VubG9ja2VkX2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoImZnZXR3c191bmxvY2tlZCBjYWxsZWQgd2l0aCBiaWdnZXIgc2l6ZSB0aGFuIGxlbmd0aCAiCisJCSAgICAgICAib2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgd2NoYXJfdCAqCitmZ2V0d3NfdW5sb2NrZWQgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLCBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pCit7CisgIGlmIChfX2JvcyAoX19zKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pIHx8IF9fbiA8PSAwKQorCXJldHVybiBfX2ZnZXR3c191bmxvY2tlZF9jaGsgKF9fcywgX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpLAorCQkJCSAgICAgIF9fbiwgX19zdHJlYW0pOworCisgICAgICBpZiAoKHNpemVfdCkgX19uID4gX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX2ZnZXR3c191bmxvY2tlZF9jaGtfd2FybiAoX19zLCBfX2JvcyAoX19zKSAvIHNpemVvZiAod2NoYXJfdCksCisJCQkJCSAgIF9fbiwgX19zdHJlYW0pOworICAgIH0KKyAgcmV0dXJuIF9fZmdldHdzX3VubG9ja2VkX2FsaWFzIChfX3MsIF9fbiwgX19zdHJlYW0pOworfQorI2VuZGlmCisKKworZXh0ZXJuIHNpemVfdCBfX3djcnRvbWJfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgd2NoYXJfdCBfX3djaGFyLAorCQkJICAgICBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wLAorCQkJICAgICBzaXplX3QgX19idWZsZW4pIF9fVEhST1cgX193dXI7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djcnRvbWJfYWxpYXMsCisJCQkgICAgICAoY2hhciAqX19yZXN0cmljdCBfX3MsIHdjaGFyX3QgX193Y2hhciwKKwkJCSAgICAgICBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcyksIHdjcnRvbWIpIF9fd3VyOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHNpemVfdAorX19OVEggKHdjcnRvbWIgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCB3Y2hhcl90IF9fd2NoYXIsCisJCW1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSkKK3sKKyAgLyogV2Ugd291bGQgaGF2ZSB0byBpbmNsdWRlIDxsaW1pdHMuaD4gdG8gZ2V0IGEgZGVmaW5pdGlvbiBvZiBNQl9MRU5fTUFYLgorICAgICBCdXQgdGhpcyB3b3VsZCBvbmx5IGRpc3R1cmIgdGhlIG5hbWVzcGFjZS4gIFNvIHdlIGRlZmluZSBvdXIgb3duCisgICAgIHZlcnNpb24gaGVyZS4gICovCisjZGVmaW5lIF9fV0NIQVJfTUJfTEVOX01BWAkxNgorI2lmIGRlZmluZWQgTUJfTEVOX01BWCAmJiBNQl9MRU5fTUFYICE9IF9fV0NIQVJfTUJfTEVOX01BWAorIyBlcnJvciAiQXNzdW1lZCB2YWx1ZSBvZiBNQl9MRU5fTUFYIHdyb25nIgorI2VuZGlmCisgIGlmIChfX2JvcyAoX19zKSAhPSAoc2l6ZV90KSAtMSAmJiBfX1dDSEFSX01CX0xFTl9NQVggPiBfX2JvcyAoX19zKSkKKyAgICByZXR1cm4gX193Y3J0b21iX2NoayAoX19zLCBfX3djaGFyLCBfX3BzLCBfX2JvcyAoX19zKSk7CisgIHJldHVybiBfX3djcnRvbWJfYWxpYXMgKF9fcywgX193Y2hhciwgX19wcyk7Cit9CisKKworZXh0ZXJuIHNpemVfdCBfX21ic3J0b3djc19jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLAorCQkJICAgICAgIHNpemVfdCBfX2RzdGxlbikgX19USFJPVzsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fbWJzcnRvd2NzX2FsaWFzLAorCQkJICAgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSwKKwkJCSAgICAgIG1ic3J0b3djcyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX21ic3J0b3djc19jaGtfd2FybiwKKwkJCSAgICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcywKKwkJCSAgICAgICBzaXplX3QgX19kc3RsZW4pLCBfX21ic3J0b3djc19jaGspCisgICAgIF9fd2FybmF0dHIgKCJtYnNydG93Y3MgY2FsbGVkIHdpdGggZHN0IGJ1ZmZlciBzbWFsbGVyIHRoYW4gbGVuICIKKwkJICIqIHNpemVvZiAod2NoYXJfdCkiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzaXplX3QKK19fTlRIIChtYnNydG93Y3MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsCisJCSAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykpCit7CisgIGlmIChfX2JvcyAoX19kc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX19tYnNydG93Y3NfY2hrIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX3BzLAorCQkJCV9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbGVuID4gX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fbWJzcnRvd2NzX2Noa193YXJuIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX3BzLAorCQkJCSAgICAgX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgIH0KKyAgcmV0dXJuIF9fbWJzcnRvd2NzX2FsaWFzIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX3BzKTsKK30KKworCitleHRlcm4gc2l6ZV90IF9fd2NzcnRvbWJzX2NoayAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMsCisJCQkgICAgICAgc2l6ZV90IF9fZHN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX193Y3NydG9tYnNfYWxpYXMsCisJCQkgICAgICAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpLAorCQkJICAgICAgd2NzcnRvbWJzKTsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fd2NzcnRvbWJzX2Noa193YXJuLAorCQkJICAgICAgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLAorCQkJICAgICAgIHNpemVfdCBfX2RzdGxlbiksIF9fd2NzcnRvbWJzX2NoaykKKyAgICBfX3dhcm5hdHRyICgid2NzcnRvbWJzIGNhbGxlZCB3aXRoIGRzdCBidWZmZXIgc21hbGxlciB0aGFuIGxlbiIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNpemVfdAorX19OVEggKHdjc3J0b21icyAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwgX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywKKwkJICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSkKK3sKKyAgaWYgKF9fYm9zIChfX2RzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX3djc3J0b21ic19jaGsgKF9fZHN0LCBfX3NyYywgX19sZW4sIF9fcHMsIF9fYm9zIChfX2RzdCkpOworCisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19kc3QpKQorCXJldHVybiBfX3djc3J0b21ic19jaGtfd2FybiAoX19kc3QsIF9fc3JjLCBfX2xlbiwgX19wcywgX19ib3MgKF9fZHN0KSk7CisgICAgfQorICByZXR1cm4gX193Y3NydG9tYnNfYWxpYXMgKF9fZHN0LCBfX3NyYywgX19sZW4sIF9fcHMpOworfQorCisKKyNpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiBzaXplX3QgX19tYnNucnRvd2NzX2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCQlfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19ubWMsCisJCQkJc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcywKKwkJCQlzaXplX3QgX19kc3RsZW4pIF9fVEhST1c7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX21ic25ydG93Y3NfYWxpYXMsCisJCQkgICAgICAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19ubWMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcyksCisJCQkgICAgICBtYnNucnRvd2NzKTsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fbWJzbnJ0b3djc19jaGtfd2FybiwKKwkJCSAgICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX25tYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLAorCQkJICAgICAgIHNpemVfdCBfX2RzdGxlbiksIF9fbWJzbnJ0b3djc19jaGspCisgICAgIF9fd2FybmF0dHIgKCJtYnNucnRvd2NzIGNhbGxlZCB3aXRoIGRzdCBidWZmZXIgc21hbGxlciB0aGFuIGxlbiAiCisJCSAiKiBzaXplb2YgKHdjaGFyX3QpIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc2l6ZV90CitfX05USCAobWJzbnJ0b3djcyAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwgX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywKKwkJICAgc2l6ZV90IF9fbm1jLCBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSkKK3sKKyAgaWYgKF9fYm9zIChfX2RzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX21ic25ydG93Y3NfY2hrIChfX2RzdCwgX19zcmMsIF9fbm1jLCBfX2xlbiwgX19wcywKKwkJCQkgX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworCisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX19tYnNucnRvd2NzX2Noa193YXJuIChfX2RzdCwgX19zcmMsIF9fbm1jLCBfX2xlbiwgX19wcywKKwkJCQkgICAgICBfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX19tYnNucnRvd2NzX2FsaWFzIChfX2RzdCwgX19zcmMsIF9fbm1jLCBfX2xlbiwgX19wcyk7Cit9CisKKworZXh0ZXJuIHNpemVfdCBfX3djc25ydG9tYnNfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJCV9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkJc2l6ZV90IF9fbndjLCBzaXplX3QgX19sZW4sCisJCQkJbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMsIHNpemVfdCBfX2RzdGxlbikKKyAgICAgX19USFJPVzsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fd2NzbnJ0b21ic19hbGlhcywKKwkJCSAgICAgIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbndjLCBzaXplX3QgX19sZW4sCisJCQkgICAgICAgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpLCB3Y3NucnRvbWJzKTsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fd2NzbnJ0b21ic19jaGtfd2FybiwKKwkJCSAgICAgIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbndjLCBzaXplX3QgX19sZW4sCisJCQkgICAgICAgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMsCisJCQkgICAgICAgc2l6ZV90IF9fZHN0bGVuKSwgX193Y3NucnRvbWJzX2NoaykKKyAgICAgX193YXJuYXR0ciAoIndjc25ydG9tYnMgY2FsbGVkIHdpdGggZHN0IGJ1ZmZlciBzbWFsbGVyIHRoYW4gbGVuIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc2l6ZV90CitfX05USCAod2NzbnJ0b21icyAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwgX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywKKwkJICAgc2l6ZV90IF9fbndjLCBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSkKK3sKKyAgaWYgKF9fYm9zIChfX2RzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX3djc25ydG9tYnNfY2hrIChfX2RzdCwgX19zcmMsIF9fbndjLCBfX2xlbiwgX19wcywKKwkJCQkgX19ib3MgKF9fZHN0KSk7CisKKyAgICAgIGlmIChfX2xlbiA+IF9fYm9zIChfX2RzdCkpCisJcmV0dXJuIF9fd2NzbnJ0b21ic19jaGtfd2FybiAoX19kc3QsIF9fc3JjLCBfX253YywgX19sZW4sIF9fcHMsCisJCQkJICAgICAgX19ib3MgKF9fZHN0KSk7CisgICAgfQorICByZXR1cm4gX193Y3NucnRvbWJzX2FsaWFzIChfX2RzdCwgX19zcmMsIF9fbndjLCBfX2xlbiwgX19wcyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3dvcmRzaXplLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy93b3Jkc2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MGEwZDgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy93b3Jkc2l6ZS5oCkBAIC0wLDAgKzEsOCBAQAorLyogRGV0ZXJtaW5lIHRoZSB3b3Jkc2l6ZSBmcm9tIHRoZSBwcmVwcm9jZXNzb3IgZGVmaW5lcy4gICovCisKKyNpZiBkZWZpbmVkIF9feDg2XzY0X18KKyMgZGVmaW5lIF9fV09SRFNJWkUJNjQKKyMgZGVmaW5lIF9fV09SRFNJWkVfQ09NUEFUMzIJMQorI2Vsc2UKKyMgZGVmaW5lIF9fV09SRFNJWkUJMzIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMveG9wZW5fbGltLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy94b3Blbl9saW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjM2MTE4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMveG9wZW5fbGltLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIE5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5OyB1c2UgPGxpbWl0cy5oPiBpbnN0ZWFkLgorICovCisKKy8qIEFkZGl0aW9uYWwgZGVmaW5pdGlvbnMgZnJvbSBYL09wZW4gUG9ydGFiaWxpdHkgR3VpZGUsIElzc3VlIDQsIFZlcnNpb24gMgorICAgU3lzdGVtIEludGVyZmFjZXMgYW5kIEhlYWRlcnMsIDQuMTYgPGxpbWl0cy5oPgorCisgICBQbGVhc2Ugbm90ZSBvbmx5IHRoZSB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0KKyAgIHN0YXRlZCBpbiB0aGUgc3RhbmRhcmQgZG9jdW1lbnQgYXJlIGxpc3RlZC4gIFRoZSBgc3lzY29uZicgZnVuY3Rpb25zCisgICBzaG91bGQgYmUgdXNlZCB0byBvYnRhaW4gdGhlIGFjdHVhbCB2YWx1ZS4gICovCisKKyNpZm5kZWYgX1hPUEVOX0xJTV9ICisjZGVmaW5lIF9YT1BFTl9MSU1fSAkxCisKKyNkZWZpbmUgX19uZWVkX0lPVl9NQVgKKyNpbmNsdWRlIDxiaXRzL3N0ZGlvX2xpbS5oPgorCisvKiBXZSBkbyBub3QgcHJvdmlkZSBmaXhlZCB2YWx1ZXMgZm9yCisKKyAgIEFSR19NQVgJTWF4aW11bSBsZW5ndGggb2YgYXJndW1lbnQgdG8gdGhlIGBleGVjJyBmdW5jdGlvbgorCQlpbmNsdWRpbmcgZW52aXJvbm1lbnQgZGF0YS4KKworICAgQVRFWElUX01BWAlNYXhpbXVtIG51bWJlciBvZiBmdW5jdGlvbnMgdGhhdCBtYXkgYmUgcmVnaXN0ZXJlZAorCQl3aXRoIGBhdGV4aXQnLgorCisgICBDSElMRF9NQVgJTWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHByb2Nlc3NlcyBwZXIgcmVhbAorCQl1c2VyIElELgorCisgICBPUEVOX01BWAlNYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0aGF0IG9uZSBwcm9jZXNzIGNhbiBoYXZlIG9wZW4KKwkJYXQgYW55b25lIHRpbWUuCisKKyAgIFBBR0VTSVpFCisgICBQQUdFX1NJWkUJU2l6ZSBvZiBieXRlcyBvZiBhIHBhZ2UuCisKKyAgIFBBU1NfTUFYCU1heGltdW0gbnVtYmVyIG9mIHNpZ25pZmljYW50IGJ5dGVzIGluIGEgcGFzc3dvcmQuCisKKyAgIFdlIG9ubHkgcHJvdmlkZSBhIGZpeGVkIGxpbWl0IGZvcgorCisgICBJT1ZfTUFYCU1heGltdW0gbnVtYmVyIG9mIGBpb3ZlYycgc3RydWN0dXJlcyB0aGF0IG9uZSBwcm9jZXNzIGhhcworCQlhdmFpbGFibGUgZm9yIHVzZSB3aXRoIGByZWFkdicgb3Igd3JpdGV2Jy4KKworICAgaWYgdGhpcyBpcyBpbmRlZWQgZml4ZWQgYnkgdGhlIHVuZGVybHlpbmcgc3lzdGVtLgorKi8KKworCisvKiBNYXhpbXVtIG51bWJlciBvZiBgaW92ZWMnIHN0cnVjdHVyZXMgdGhhdCBvbmUgcHJvY2VzcyBoYXMgYXZhaWxhYmxlCisgICBmb3IgdXNlIHdpdGggYHJlYWR2JyBvciB3cml0ZXYnLiAgKi8KKyNkZWZpbmUJX1hPUEVOX0lPVl9NQVgJX1BPU0lYX1VJT19NQVhJT1YKKworCisvKiBNYXhpbXVtIHZhbHVlIG9mIGBkaWdpdCcgaW4gY2FsbHMgdG8gdGhlIGBwcmludGYnIGFuZCBgc2NhbmYnCisgICBmdW5jdGlvbnMuICBXZSBoYXZlIG5vIGxpbWl0LCBzbyByZXR1cm4gYSByZWFzb25hYmxlIHZhbHVlLiAgKi8KKyNkZWZpbmUgTkxfQVJHTUFYCV9QT1NJWF9BUkdfTUFYCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGEgYExBTkcnIG5hbWUuICBXZSBoYXZlIG5vIGxpbWl0LiAgKi8KKyNkZWZpbmUgTkxfTEFOR01BWAlfUE9TSVgyX0xJTkVfTUFYCisKKy8qIE1heGltdW0gbWVzc2FnZSBudW1iZXIuICBXZSBoYXZlIG5vIGxpbWl0LiAgKi8KKyNkZWZpbmUgTkxfTVNHTUFYCUlOVF9NQVgKKworLyogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gTi10by0xIGNvbGxhdGlvbiBtYXBwaW5nLiAgV2UgaGF2ZSBubworICAgbGltaXQuICAqLworI2RlZmluZSBOTF9OTUFYCQlJTlRfTUFYCisKKy8qIE1heGltdW0gc2V0IG51bWJlci4gIFdlIGhhdmUgbm8gbGltaXQuICAqLworI2RlZmluZSBOTF9TRVRNQVgJSU5UX01BWAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyBpbiBhIG1lc3NhZ2UuICBXZSBoYXZlIG5vIGxpbWl0LiAgKi8KKyNkZWZpbmUgTkxfVEVYVE1BWAlJTlRfTUFYCisKKy8qIERlZmF1bHQgcHJvY2VzcyBwcmlvcml0eS4gICovCisjZGVmaW5lIE5aRVJPCQkyMAorCisKKy8qIE51bWJlciBvZiBiaXRzIGluIGEgd29yZCBvZiB0eXBlIGBpbnQnLiAgKi8KKyNpZmRlZiBJTlRfTUFYCisjIGlmIElOVF9NQVggPT0gMzI3NjcKKyMgIGRlZmluZSBXT1JEX0JJVAkxNgorIyBlbHNlCisjICBpZiBJTlRfTUFYID09IDIxNDc0ODM2NDcKKyMgICBkZWZpbmUgV09SRF9CSVQJMzIKKyMgIGVsc2UKKy8qIFNhZmUgYXNzdW1wdGlvbi4gICovCisjICAgZGVmaW5lIFdPUkRfQklUCTY0CisjICBlbmRpZgorIyBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX0lOVF9NQVhfXworIyBpZiBfX0lOVF9NQVhfXyA9PSAzMjc2NworIyAgZGVmaW5lIFdPUkRfQklUCTE2CisjIGVsc2UKKyMgIGlmIF9fSU5UX01BWF9fID09IDIxNDc0ODM2NDcKKyMgICBkZWZpbmUgV09SRF9CSVQJMzIKKyMgIGVsc2UKKy8qIFNhZmUgYXNzdW1wdGlvbi4gICovCisjICAgZGVmaW5lIFdPUkRfQklUCTY0CisjICBlbmRpZgorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIFdPUkRfQklUCTMyCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSB3b3JkIG9mIHR5cGUgYGxvbmcgaW50Jy4gICovCisjaWZkZWYgTE9OR19NQVgKKyMgaWYgTE9OR19NQVggPT0gMjE0NzQ4MzY0NworIyAgZGVmaW5lIExPTkdfQklUCTMyCisjIGVsc2UKKy8qIFNhZmUgYXNzdW1wdGlvbi4gICovCisjICBkZWZpbmUgTE9OR19CSVQJNjQKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQgX19MT05HX01BWF9fCisjIGlmIF9fTE9OR19NQVhfXyA9PSAyMTQ3NDgzNjQ3CisjICBkZWZpbmUgTE9OR19CSVQJMzIKKyMgZWxzZQorLyogU2FmZSBhc3N1bXB0aW9uLiAgKi8KKyMgIGRlZmluZSBMT05HX0JJVAk2NAorIyBlbmRpZgorI2Vsc2UKKyMgaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgTE9OR19CSVQJNjQKKyMgZWxzZQorIyAgZGVmaW5lIExPTkdfQklUCTMyCisjIGVuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIGJpdHMveG9wZW5fbGltLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3h0aXR5cGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy94dGl0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOGI2OTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy94dGl0eXBlcy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIGJpdHMveHRpdHlwZXMuaCAtLSBEZWZpbmUgc29tZSB0eXBlcyB1c2VkIGJ5IDxiaXRzL3N0cm9wdHMuaD4uICB4ODYtNjQuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NUUk9QVFNfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy94dGl0eXBlcy5oPiBkaXJlY3RseTsgdXNlIDxzdHJvcHRzLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX0JJVFNfWFRJVFlQRVNfSAorI2RlZmluZSBfQklUU19YVElUWVBFU19ICTEKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogVGhpcyB0eXBlIGlzIHVzZWQgYnkgc29tZSBzdHJ1Y3RzIGluIDxiaXRzL3N0cm9wdHMuaD4uICAqLwordHlwZWRlZiBfX1NMT05HMzJfVFlQRSBfX3Rfc2NhbGFyX3Q7Cit0eXBlZGVmIF9fVUxPTkczMl9UWVBFIF9fdF91c2NhbGFyX3Q7CisKKworI2VuZGlmIC8qIGJpdHMveHRpdHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2ZwdV9jb250cm9sLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvZnB1X2NvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWFlNDhlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2ZwdV9jb250cm9sLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qIEZQVSBjb250cm9sIHdvcmQgYml0cy4gIHg4Ni02NCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLDE5OTUsMTk5NiwxOTk3LDE5OTgsMjAwMCwyMDAxLDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IE9sYWYgRmxlYmJlLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfRlBVX0NPTlRST0xfSAorI2RlZmluZSBfRlBVX0NPTlRST0xfSAkxCisKKy8qIE5vdGUgdGhhdCB0aGlzIGZpbGUgc2V0cyBvbiB4ODYtNjQgb25seSB0aGUgeDg3IEZQVSwgaXQgZG9lcyBub3QKKyAgIHRvdWNoIHRoZSBTU0UgdW5pdC4gICovCisKKy8qIEhlcmUgaXMgdGhlIGRpcnR5IHBhcnQuIFNldCB1cCB5b3VyIDM4NyB0aHJvdWdoIHRoZSBjb250cm9sIHdvcmQKKyAqIChjdykgcmVnaXN0ZXIuCisgKgorICogICAgIDE1LTEzICAgIDEyICAxMS0xMCAgOS04ICAgICA3LTYgICAgIDUgICAgNCAgICAzICAgIDIgICAgMSAgICAwCisgKiB8IHJlc2VydmVkIHwgSUMgfCBSQyAgfCBQQyB8IHJlc2VydmVkIHwgUE0gfCBVTSB8IE9NIHwgWk0gfCBETSB8IElNCisgKgorICogSU06IEludmFsaWQgb3BlcmF0aW9uIG1hc2sKKyAqIERNOiBEZW5vcm1hbGl6ZWQgb3BlcmFuZCBtYXNrCisgKiBaTTogWmVyby1kaXZpZGUgbWFzaworICogT006IE92ZXJmbG93IG1hc2sKKyAqIFVNOiBVbmRlcmZsb3cgbWFzaworICogUE06IFByZWNpc2lvbiAoaW5leGFjdCByZXN1bHQpIG1hc2sKKyAqCisgKiBNYXNrIGJpdCBpcyAxIG1lYW5zIG5vIGludGVycnVwdC4KKyAqCisgKiBQQzogUHJlY2lzaW9uIGNvbnRyb2wKKyAqIDExIC0gcm91bmQgdG8gZXh0ZW5kZWQgcHJlY2lzaW9uCisgKiAxMCAtIHJvdW5kIHRvIGRvdWJsZSBwcmVjaXNpb24KKyAqIDAwIC0gcm91bmQgdG8gc2luZ2xlIHByZWNpc2lvbgorICoKKyAqIFJDOiBSb3VuZGluZyBjb250cm9sCisgKiAwMCAtIHJvdW5kaW5nIHRvIG5lYXJlc3QKKyAqIDAxIC0gcm91bmRpbmcgZG93biAodG93YXJkIC0gaW5maW5pdHkpCisgKiAxMCAtIHJvdW5kaW5nIHVwICh0b3dhcmQgKyBpbmZpbml0eSkKKyAqIDExIC0gcm91bmRpbmcgdG93YXJkIHplcm8KKyAqCisgKiBJQzogSW5maW5pdHkgY29udHJvbAorICogVGhhdCBpcyBmb3IgODA4NyBhbmQgODAyODcgb25seS4KKyAqCisgKiBUaGUgaGFyZHdhcmUgZGVmYXVsdCBpcyAweDAzN2Ygd2hpY2ggd2UgdXNlLgorICovCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBtYXNraW5nIG9mIGludGVycnVwdHMgKi8KKyNkZWZpbmUgX0ZQVV9NQVNLX0lNICAweDAxCisjZGVmaW5lIF9GUFVfTUFTS19ETSAgMHgwMgorI2RlZmluZSBfRlBVX01BU0tfWk0gIDB4MDQKKyNkZWZpbmUgX0ZQVV9NQVNLX09NICAweDA4CisjZGVmaW5lIF9GUFVfTUFTS19VTSAgMHgxMAorI2RlZmluZSBfRlBVX01BU0tfUE0gIDB4MjAKKworLyogcHJlY2lzaW9uIGNvbnRyb2wgKi8KKyNkZWZpbmUgX0ZQVV9FWFRFTkRFRCAweDMwMAkvKiBsaWJtIHJlcXVpcmVzIGRvdWJsZSBleHRlbmRlZCBwcmVjaXNpb24uICAqLworI2RlZmluZSBfRlBVX0RPVUJMRSAgIDB4MjAwCisjZGVmaW5lIF9GUFVfU0lOR0xFICAgMHgwCisKKy8qIHJvdW5kaW5nIGNvbnRyb2wgKi8KKyNkZWZpbmUgX0ZQVV9SQ19ORUFSRVNUIDB4MCAgICAvKiBSRUNPTU1FTkRFRCAqLworI2RlZmluZSBfRlBVX1JDX0RPV04gICAgMHg0MDAKKyNkZWZpbmUgX0ZQVV9SQ19VUCAgICAgIDB4ODAwCisjZGVmaW5lIF9GUFVfUkNfWkVSTyAgICAweEMwMAorCisjZGVmaW5lIF9GUFVfUkVTRVJWRUQgMHhGMEMwICAvKiBSZXNlcnZlZCBiaXRzIGluIGN3ICovCisKKworLyogVGhlIGZkbGlibSBjb2RlIHJlcXVpcmVzIHN0cmljdCBJRUVFIGRvdWJsZSBwcmVjaXNpb24gYXJpdGhtZXRpYywKKyAgIGFuZCBubyBpbnRlcnJ1cHRzIGZvciBleGNlcHRpb25zLCByb3VuZGluZyB0byBuZWFyZXN0LiAgKi8KKworI2RlZmluZSBfRlBVX0RFRkFVTFQgIDB4MDM3ZgorCisvKiBJRUVFOiAgc2FtZSBhcyBhYm92ZS4gICovCisjZGVmaW5lIF9GUFVfSUVFRSAgICAgMHgwMzdmCisKKy8qIFR5cGUgb2YgdGhlIGNvbnRyb2wgd29yZC4gICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBmcHVfY29udHJvbF90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19ISV9fKSkpOworCisvKiBNYWNyb3MgZm9yIGFjY2Vzc2luZyB0aGUgaGFyZHdhcmUgY29udHJvbCB3b3JkLiAgKi8KKyNkZWZpbmUgX0ZQVV9HRVRDVyhjdykgX19hc21fXyAoImZuc3RjdyAlMCIgOiAiPW0iICgqJmN3KSkKKyNkZWZpbmUgX0ZQVV9TRVRDVyhjdykgX19hc21fXyAoImZsZGN3ICUwIiA6IDogIm0iICgqJmN3KSkKKworLyogRGVmYXVsdCBjb250cm9sIHdvcmQgc2V0IGF0IHN0YXJ0dXAuICAqLworZXh0ZXJuIGZwdV9jb250cm9sX3QgX19mcHVfY29udHJvbDsKKworI2VuZGlmCS8qIGZwdV9jb250cm9sLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9nbnUvbGliLW5hbWVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvZ251L2xpYi1uYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NzJmMjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvZ251L2xpYi1uYW1lcy5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4KKyAgIEl0IGRlZmluZXMgbWFjcm9zIHRvIGFsbG93IHVzZXIgcHJvZ3JhbSB0byBmaW5kIHRoZSBzaGFyZWQKKyAgIGxpYnJhcnkgZmlsZXMgd2hpY2ggY29tZSBhcyBwYXJ0IG9mIEdOVSBsaWJjLiAgKi8KKyNpZm5kZWYgX19HTlVfTElCX05BTUVTX0gKKyNkZWZpbmUgX19HTlVfTElCX05BTUVTX0gJMQorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgX19XT1JEU0laRSA9PSAzMgorIyBkZWZpbmUgTERfTElOVVhfU08gICAgICAgICAgICAgICAgICAgICJsZC1saW51eC5zby4yIgorIyBkZWZpbmUgTERfU08gICAgICAgICAgICAgICAgICAgICAgICAgICJsZC1saW51eC5zby4yIgorIyBkZWZpbmUgTElCQU5MX1NPICAgICAgICAgICAgICAgICAgICAgICJsaWJhbmwuc28uMSIKKyMgZGVmaW5lIExJQkJST0tFTkxPQ0FMRV9TTyAgICAgICAgICAgICAibGliQnJva2VuTG9jYWxlLnNvLjEiCisjIGRlZmluZSBMSUJDSUROX1NPICAgICAgICAgICAgICAgICAgICAgImxpYmNpZG4uc28uMSIKKyMgZGVmaW5lIExJQkNSWVBUX1NPICAgICAgICAgICAgICAgICAgICAibGliY3J5cHQuc28uMSIKKyMgZGVmaW5lIExJQkNfU08gICAgICAgICAgICAgICAgICAgICAgICAibGliYy5zby42IgorIyBkZWZpbmUgTElCRExfU08gICAgICAgICAgICAgICAgICAgICAgICJsaWJkbC5zby4yIgorIyBkZWZpbmUgTElCTV9TTyAgICAgICAgICAgICAgICAgICAgICAgICJsaWJtLnNvLjYiCisjIGRlZmluZSBMSUJOU0xfU08gICAgICAgICAgICAgICAgICAgICAgImxpYm5zbC5zby4xIgorIyBkZWZpbmUgTElCTlNTX0NPTVBBVF9TTyAgICAgICAgICAgICAgICJsaWJuc3NfY29tcGF0LnNvLjIiCisjIGRlZmluZSBMSUJOU1NfREJfU08gICAgICAgICAgICAgICAgICAgImxpYm5zc19kYi5zby4yIgorIyBkZWZpbmUgTElCTlNTX0ROU19TTyAgICAgICAgICAgICAgICAgICJsaWJuc3NfZG5zLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfRklMRVNfU08gICAgICAgICAgICAgICAgImxpYm5zc19maWxlcy5zby4yIgorIyBkZWZpbmUgTElCTlNTX0hFU0lPRF9TTyAgICAgICAgICAgICAgICJsaWJuc3NfaGVzaW9kLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfTERBUF9TTyAgICAgICAgICAgICAgICAgImxpYm5zc19sZGFwLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfTklTUExVU19TTyAgICAgICAgICAgICAgImxpYm5zc19uaXNwbHVzLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfTklTX1NPICAgICAgICAgICAgICAgICAgImxpYm5zc19uaXMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19URVNUMV9TTyAgICAgICAgICAgICAgICAibGlibnNzX3Rlc3QxLnNvLjIiCisjIGRlZmluZSBMSUJQVEhSRUFEX1NPICAgICAgICAgICAgICAgICAgImxpYnB0aHJlYWQuc28uMCIKKyMgZGVmaW5lIExJQlJFU09MVl9TTyAgICAgICAgICAgICAgICAgICAibGlicmVzb2x2LnNvLjIiCisjIGRlZmluZSBMSUJSVF9TTyAgICAgICAgICAgICAgICAgICAgICAgImxpYnJ0LnNvLjEiCisjIGRlZmluZSBMSUJUSFJFQURfREJfU08gICAgICAgICAgICAgICAgImxpYnRocmVhZF9kYi5zby4xIgorIyBkZWZpbmUgTElCVVRJTF9TTyAgICAgICAgICAgICAgICAgICAgICJsaWJ1dGlsLnNvLjEiCisjZWxzZQorIyBkZWZpbmUgTERfTElOVVhfWDg2XzY0X1NPICAgICAgICAgICAgICJsZC1saW51eC14ODYtNjQuc28uMiIKKyMgZGVmaW5lIExEX1NPICAgICAgICAgICAgICAgICAgICAgICAgICAibGQtbGludXgteDg2LTY0LnNvLjIiCisjIGRlZmluZSBMSUJBTkxfU08gICAgICAgICAgICAgICAgICAgICAgImxpYmFubC5zby4xIgorIyBkZWZpbmUgTElCQlJPS0VOTE9DQUxFX1NPICAgICAgICAgICAgICJsaWJCcm9rZW5Mb2NhbGUuc28uMSIKKyMgZGVmaW5lIExJQkNJRE5fU08gICAgICAgICAgICAgICAgICAgICAibGliY2lkbi5zby4xIgorIyBkZWZpbmUgTElCQ1JZUFRfU08gICAgICAgICAgICAgICAgICAgICJsaWJjcnlwdC5zby4xIgorIyBkZWZpbmUgTElCQ19TTyAgICAgICAgICAgICAgICAgICAgICAgICJsaWJjLnNvLjYiCisjIGRlZmluZSBMSUJETF9TTyAgICAgICAgICAgICAgICAgICAgICAgImxpYmRsLnNvLjIiCisjIGRlZmluZSBMSUJNX1NPICAgICAgICAgICAgICAgICAgICAgICAgImxpYm0uc28uNiIKKyMgZGVmaW5lIExJQk5TTF9TTyAgICAgICAgICAgICAgICAgICAgICAibGlibnNsLnNvLjEiCisjIGRlZmluZSBMSUJOU1NfQ09NUEFUX1NPICAgICAgICAgICAgICAgImxpYm5zc19jb21wYXQuc28uMiIKKyMgZGVmaW5lIExJQk5TU19EQl9TTyAgICAgICAgICAgICAgICAgICAibGlibnNzX2RiLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfRE5TX1NPICAgICAgICAgICAgICAgICAgImxpYm5zc19kbnMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19GSUxFU19TTyAgICAgICAgICAgICAgICAibGlibnNzX2ZpbGVzLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfSEVTSU9EX1NPICAgICAgICAgICAgICAgImxpYm5zc19oZXNpb2Quc28uMiIKKyMgZGVmaW5lIExJQk5TU19MREFQX1NPICAgICAgICAgICAgICAgICAibGlibnNzX2xkYXAuc28uMiIKKyMgZGVmaW5lIExJQk5TU19OSVNQTFVTX1NPICAgICAgICAgICAgICAibGlibnNzX25pc3BsdXMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19OSVNfU08gICAgICAgICAgICAgICAgICAibGlibnNzX25pcy5zby4yIgorIyBkZWZpbmUgTElCTlNTX1RFU1QxX1NPICAgICAgICAgICAgICAgICJsaWJuc3NfdGVzdDEuc28uMiIKKyMgZGVmaW5lIExJQlBUSFJFQURfU08gICAgICAgICAgICAgICAgICAibGlicHRocmVhZC5zby4wIgorIyBkZWZpbmUgTElCUkVTT0xWX1NPICAgICAgICAgICAgICAgICAgICJsaWJyZXNvbHYuc28uMiIKKyMgZGVmaW5lIExJQlJUX1NPICAgICAgICAgICAgICAgICAgICAgICAibGlicnQuc28uMSIKKyMgZGVmaW5lIExJQlRIUkVBRF9EQl9TTyAgICAgICAgICAgICAgICAibGlidGhyZWFkX2RiLnNvLjEiCisjIGRlZmluZSBMSUJVVElMX1NPICAgICAgICAgICAgICAgICAgICAgImxpYnV0aWwuc28uMSIKKyNlbmRpZgorCisjZW5kaWYJLyogZ251L2xpYi1uYW1lcy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvZ251L2xpYmMtdmVyc2lvbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2dudS9saWJjLXZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzA3MWZkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2dudS9saWJjLXZlcnNpb24uaApAQCAtMCwwICsxLDM1IEBACisvKiBJbnRlcmZhY2UgdG8gR05VIGxpYmMgc3BlY2lmaWMgZnVuY3Rpb25zIGZvciB2ZXJzaW9uIGluZm9ybWF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9HTlVfTElCQ19WRVJTSU9OX0gKKyNkZWZpbmUJX0dOVV9MSUJDX1ZFUlNJT05fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJldHVybiBzdHJpbmcgZGVzY3JpYmluZyByZWxlYXNlIHN0YXR1cyBvZiBjdXJyZW50bHkgcnVubmluZyBHTlUgbGliYy4gICovCitleHRlcm4gY29uc3QgY2hhciAqZ251X2dldF9saWJjX3JlbGVhc2UgKHZvaWQpIF9fVEhST1c7CisKKy8qIFJldHVybiBzdHJpbmcgZGVzY3JpYmluZyB2ZXJzaW9uIG9mIGN1cnJlbnRseSBydW5uaW5nIEdOVSBsaWJjLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpnbnVfZ2V0X2xpYmNfdmVyc2lvbiAodm9pZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIGdudS9saWJjLXZlcnNpb24uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2dudS9vcHRpb24tZ3JvdXBzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvZ251L29wdGlvbi1ncm91cHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWQ2ZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2dudS9vcHRpb24tZ3JvdXBzLmgKQEAgLTAsMCArMSw1MiBAQAorLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHNjcmlwdHMvb3B0aW9uLWdyb3Vwcy5hd2sKKyAgIGluIHRoZSBFR0xJQkMgc291cmNlIHRyZWUuCisKKyAgIEl0IGRlZmluZXMgbWFjcm9zIHRoYXQgaW5kaWNhdGUgd2hpY2ggRUdMSUJDIG9wdGlvbiBncm91cHMgd2VyZQorICAgY29uZmlndXJlZCBpbiAnb3B0aW9uLWdyb3Vwcy5jb25maWcnIHdoZW4gdGhpcyBDIGxpYnJhcnkgd2FzCisgICBidWlsdC4gIEZvciBlYWNoIG9wdGlvbiBncm91cCBuYW1lZCBPUFRJT05fZm9vLCBpdCAjZGVmaW5lcworICAgX19PUFRJT05fZm9vIHRvIGJlIDEgaWYgdGhlIGdyb3VwIGlzIGVuYWJsZWQsIG9yIGxlYXZlcyB0aGF0CisgICBzeW1ib2wgdW5kZWZpbmVkIGlmIHRoZSBncm91cCBpcyBkaXNhYmxlZC4gICovCisKKyNpZm5kZWYgX19HTlVfT1BUSU9OX0dST1VQU19ICisjZGVmaW5lIF9fR05VX09QVElPTl9HUk9VUFNfSAorCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19BRFZBTkNFRF9JTkVUNiAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19CQUNLVFJBQ0UgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19CU0QgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQ0FUR0VUUyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19DSEFSU0VUUyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19DUllQVCAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19DUllQVF9VRkMgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQ1hYX1RFU1RTIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0RCX0FMSUFTRVMgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfRU5WWiAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19GQ1ZUIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0ZNVE1TRyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19GU1RBQiAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19GVFJBVkVSU0UgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfR0VUTE9HSU4gMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfSUROIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0lORVQgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfSU5FVF9BTkwgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfTElCTSAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19MSUJNX0JJRyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19MT0NBTEVTIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0xPQ0FMRV9DT0RFIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX01FTVVTQUdFIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX05JUyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19OU1NXSVRDSCAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19SQ01EIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX1JUTERfREVCVUcgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfU1BBV04gMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfU1RSRUFNUyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19TVU5SUEMgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfVVRNUCAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19VVE1QWCAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19XT1JERVhQIDEKKyNkZWZpbmUgX19PUFRJT05fUE9TSVhfQ19MQU5HX1dJREVfQ0hBUiAxCisjZGVmaW5lIF9fT1BUSU9OX1BPU0lYX1JFR0VYUCAxCisjZGVmaW5lIF9fT1BUSU9OX1BPU0lYX1JFR0VYUF9HTElCQyAxCisjZGVmaW5lIF9fT1BUSU9OX1BPU0lYX1dJREVfQ0hBUl9ERVZJQ0VfSU8gMQorCisjZW5kaWYgLyogX19HTlVfT1BUSU9OX0dST1VQU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvZ251L3N0dWJzLTY0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvZ251L3N0dWJzLTY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlNGU1NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9nbnUvc3R1YnMtNjQuaApAQCAtMCwwICsxLDIzIEBACisvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuCisgICBJdCBkZWZpbmVzIGEgc3ltYm9sIGBfX3N0dWJfRlVOQ1RJT04nIGZvciBlYWNoIGZ1bmN0aW9uCisgICBpbiB0aGUgQyBsaWJyYXJ5IHdoaWNoIGlzIGEgc3R1YiwgbWVhbmluZyBpdCB3aWxsIGZhaWwKKyAgIGV2ZXJ5IHRpbWUgY2FsbGVkLCB1c3VhbGx5IHNldHRpbmcgZXJybm8gdG8gRU5PU1lTLiAgKi8KKworI2lmZGVmIF9MSUJDCisjIGVycm9yIEFwcGxpY2F0aW9ucyBtYXkgbm90IGRlZmluZSB0aGUgbWFjcm8gX0xJQkMKKyNlbmRpZgorCisjZGVmaW5lIF9fc3R1Yl9iZGZsdXNoCisjZGVmaW5lIF9fc3R1Yl9jaGZsYWdzCisjZGVmaW5lIF9fc3R1Yl9mYXR0YWNoCisjZGVmaW5lIF9fc3R1Yl9mY2hmbGFncworI2RlZmluZSBfX3N0dWJfZmRldGFjaAorI2RlZmluZSBfX3N0dWJfZ2V0bXNnCisjZGVmaW5lIF9fc3R1Yl9ndHR5CisjZGVmaW5lIF9fc3R1Yl9sY2htb2QKKyNkZWZpbmUgX19zdHViX3B1dG1zZworI2RlZmluZSBfX3N0dWJfcmV2b2tlCisjZGVmaW5lIF9fc3R1Yl9zZXRsb2dpbgorI2RlZmluZSBfX3N0dWJfc2lncmV0dXJuCisjZGVmaW5lIF9fc3R1Yl9zc3RrCisjZGVmaW5lIF9fc3R1Yl9zdHR5CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvZ251L3N0dWJzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvZ251L3N0dWJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwODZiZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9nbnUvc3R1YnMuaApAQCAtMCwwICsxLDEyIEBACisvKiBUaGlzIGZpbGUgc2VsZWN0cyB0aGUgcmlnaHQgZ2VuZXJhdGVkIGZpbGUgb2YgYF9fc3R1Yl9GVU5DVElPTicgbWFjcm9zCisgICBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlIGJlaW5nIGNvbXBpbGVkIGZvci4gICovCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKyNpZiBfX1dPUkRTSVpFID09IDMyCisjIGluY2x1ZGUgPGdudS9zdHVicy0zMi5oPgorI2VsaWYgX19XT1JEU0laRSA9PSA2NAorIyBpbmNsdWRlIDxnbnUvc3R1YnMtNjQuaD4KKyNlbHNlCisjIGVycm9yICJ1bmV4cGVjdGVkIHZhbHVlIGZvciBfX1dPUkRTSVpFIG1hY3JvIgorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2FjY3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvYWNjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YzYzZWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2FjY3QuaApAQCAtMCwwICsxLDEwOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfQUNDVF9ICisjZGVmaW5lIF9TWVNfQUNDVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNkZWZpbmUJX19uZWVkX3RpbWVfdAorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjZGVmaW5lIEFDQ1RfQ09NTSAxNgorCisvKgorICBjb21wX3QgaXMgYSAxNi1iaXQgImZsb2F0aW5nIiBwb2ludCBudW1iZXIgd2l0aCBhIDMtYml0IGJhc2UgOAorICBleHBvbmVudCBhbmQgYSAxMy1iaXQgZnJhY3Rpb24uIFNlZSBsaW51eC9rZXJuZWwvYWNjdC5jIGZvciB0aGUKKyAgc3BlY2lmaWMgZW5jb2Rpbmcgc3lzdGVtIHVzZWQuCisqLworCit0eXBlZGVmIHVfaW50MTZfdCBjb21wX3Q7CisKK3N0cnVjdCBhY2N0Cit7CisgIGNoYXIgYWNfZmxhZzsJCQkvKiBGbGFncy4gICovCisgIHVfaW50MTZfdCBhY191aWQ7CQkvKiBSZWFsIHVzZXIgSUQuICAqLworICB1X2ludDE2X3QgYWNfZ2lkOwkJLyogUmVhbCBncm91cCBJRC4gICovCisgIHVfaW50MTZfdCBhY190dHk7CQkvKiBDb250cm9sbGluZyB0ZXJtaW5hbC4gICovCisgIHVfaW50MzJfdCBhY19idGltZTsJCS8qIEJlZ2lubmluZyB0aW1lLiAgKi8KKyAgY29tcF90IGFjX3V0aW1lOwkJLyogVXNlciB0aW1lLiAgKi8KKyAgY29tcF90IGFjX3N0aW1lOwkJLyogU3lzdGVtIHRpbWUuICAqLworICBjb21wX3QgYWNfZXRpbWU7CQkvKiBFbGFwc2VkIHRpbWUuICAqLworICBjb21wX3QgYWNfbWVtOwkJLyogQXZlcmFnZSBtZW1vcnkgdXNhZ2UuICAqLworICBjb21wX3QgYWNfaW87CQkJLyogQ2hhcnMgdHJhbnNmZXJyZWQuICAqLworICBjb21wX3QgYWNfcnc7CQkJLyogQmxvY2tzIHJlYWQgb3Igd3JpdHRlbi4gICovCisgIGNvbXBfdCBhY19taW5mbHQ7CQkvKiBNaW5vciBwYWdlZmF1bHRzLiAgKi8KKyAgY29tcF90IGFjX21hamZsdDsJCS8qIE1ham9yIHBhZ2VmYXVsdHMuICAqLworICBjb21wX3QgYWNfc3dhcHM7CQkvKiBOdW1iZXIgb2Ygc3dhcHMuICAqLworICB1X2ludDMyX3QgYWNfZXhpdGNvZGU7CS8qIFByb2Nlc3MgZXhpdGNvZGUuICAqLworICBjaGFyIGFjX2NvbW1bQUNDVF9DT01NKzFdOwkvKiBDb21tYW5kIG5hbWUuICAqLworICBjaGFyIGFjX3BhZFsxMF07CQkvKiBQYWRkaW5nIGJ5dGVzLiAgKi8KK307CisKKworc3RydWN0IGFjY3RfdjMKK3sKKyAgY2hhciBhY19mbGFnOwkJCS8qIEZsYWdzICovCisgIGNoYXIgYWNfdmVyc2lvbjsJCS8qIEFsd2F5cyBzZXQgdG8gQUNDVF9WRVJTSU9OICovCisgIHVfaW50MTZfdCBhY190dHk7CQkvKiBDb250cm9sIFRlcm1pbmFsICovCisgIHVfaW50MzJfdCBhY19leGl0Y29kZTsJLyogRXhpdGNvZGUgKi8KKyAgdV9pbnQzMl90IGFjX3VpZDsJCS8qIFJlYWwgVXNlciBJRCAqLworICB1X2ludDMyX3QgYWNfZ2lkOwkJLyogUmVhbCBHcm91cCBJRCAqLworICB1X2ludDMyX3QgYWNfcGlkOwkJLyogUHJvY2VzcyBJRCAqLworICB1X2ludDMyX3QgYWNfcHBpZDsJCS8qIFBhcmVudCBQcm9jZXNzIElEICovCisgIHVfaW50MzJfdCBhY19idGltZTsJCS8qIFByb2Nlc3MgQ3JlYXRpb24gVGltZSAqLworICBmbG9hdCBhY19ldGltZTsJCS8qIEVsYXBzZWQgVGltZSAqLworICBjb21wX3QgYWNfdXRpbWU7CQkvKiBVc2VyIFRpbWUgKi8KKyAgY29tcF90IGFjX3N0aW1lOwkJLyogU3lzdGVtIFRpbWUgKi8KKyAgY29tcF90IGFjX21lbTsJCS8qIEF2ZXJhZ2UgTWVtb3J5IFVzYWdlICovCisgIGNvbXBfdCBhY19pbzsJCQkvKiBDaGFycyBUcmFuc2ZlcnJlZCAqLworICBjb21wX3QgYWNfcnc7CQkJLyogQmxvY2tzIFJlYWQgb3IgV3JpdHRlbiAqLworICBjb21wX3QgYWNfbWluZmx0OwkJLyogTWlub3IgUGFnZWZhdWx0cyAqLworICBjb21wX3QgYWNfbWFqZmx0OwkJLyogTWFqb3IgUGFnZWZhdWx0cyAqLworICBjb21wX3QgYWNfc3dhcHM7CQkvKiBOdW1iZXIgb2YgU3dhcHMgKi8KKyAgY2hhciBhY19jb21tW0FDQ1RfQ09NTV07CS8qIENvbW1hbmQgTmFtZSAqLworfTsKKworCitlbnVtCisgIHsKKyAgICBBRk9SSyA9IDB4MDEsCQkvKiBIYXMgZXhlY3V0ZWQgZm9yaywgYnV0IG5vIGV4ZWMuICAqLworICAgIEFTVSA9IDB4MDIsCQkJLyogVXNlZCBzdXBlci11c2VyIHByaXZpbGVnZXMuICAqLworICAgIEFDT1JFID0gMHgwOCwJCS8qIER1bXBlZCBjb3JlLiAgKi8KKyAgICBBWFNJRyA9IDB4MTAJCS8qIEtpbGxlZCBieSBhIHNpZ25hbC4gICovCisgIH07CisKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjIGRlZmluZSBBQ0NUX0JZVEVPUkRFUiAweDgwCS8qIEFjY291bnRpbmcgZmlsZSBpcyBiaWcgZW5kaWFuLiAgKi8KKyNlbHNlCisjIGRlZmluZSBBQ0NUX0JZVEVPUkRFUiAweDAwCS8qIEFjY291bnRpbmcgZmlsZSBpcyBsaXR0bGUgZW5kaWFuLiAgKi8KKyNlbmRpZgorCisjZGVmaW5lIEFIWiAgICAgMTAwCisKKworLyogU3dpdGNoIHByb2Nlc3MgYWNjb3VudGluZyBvbiBhbmQgb2ZmLiAgKi8KK2V4dGVybiBpbnQgYWNjdCAoX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL2FjY3QuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9iaXR5cGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2JpdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTk4NjBmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9iaXR5cGVzLmgKQEAgLTAsMCArMSwzIEBACisvKiBUaGUgR05VIDxzeXMvdHlwZXMuaD4gZGVmaW5lcyBhbGwgdGhlIG5lY2Vzc2FyeSB0eXBlcy4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvY2RlZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvY2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODU2ZTg3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9jZGVmcy5oCkBAIC0wLDAgKzEsNDEyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTItMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19DREVGU19ICisjZGVmaW5lCV9TWVNfQ0RFRlNfSAkxCisKKy8qIFdlIGFyZSBhbG1vc3QgYWx3YXlzIGluY2x1ZGVkIGZyb20gZmVhdHVyZXMuaC4gKi8KKyNpZm5kZWYgX0ZFQVRVUkVTX0gKKyMgaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNlbmRpZgorCisvKiBUaGUgR05VIGxpYmMgZG9lcyBub3Qgc3VwcG9ydCBhbnkgSyZSIGNvbXBpbGVycyBvciB0aGUgdHJhZGl0aW9uYWwgbW9kZQorICAgb2YgSVNPIEMgY29tcGlsZXJzIGFueW1vcmUuICBDaGVjayBmb3Igc29tZSBvZiB0aGUgY29tYmluYXRpb25zIG5vdAorICAgYW55bW9yZSBzdXBwb3J0ZWQuICAqLworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgIWRlZmluZWQgX19TVERDX18KKyMgZXJyb3IgIllvdSBuZWVkIGEgSVNPIEMgY29uZm9ybWluZyBjb21waWxlciB0byB1c2UgdGhlIGdsaWJjIGhlYWRlcnMiCisjZW5kaWYKKworLyogU29tZSB1c2VyIGhlYWRlciBmaWxlIG1pZ2h0IGhhdmUgZGVmaW5lZCB0aGlzIGJlZm9yZS4gICovCisjdW5kZWYJX19QCisjdW5kZWYJX19QTVQKKworI2lmZGVmIF9fR05VQ19fCisKKy8qIEFsbCBmdW5jdGlvbnMsIGV4Y2VwdCB0aG9zZSB3aXRoIGNhbGxiYWNrcyBvciB0aG9zZSB0aGF0CisgICBzeW5jaHJvbml6ZSBtZW1vcnksIGFyZSBsZWFmIGZ1bmN0aW9ucy4gICovCisjIGlmIF9fR05VQ19QUkVSRVEgKDQsIDYpICYmICFkZWZpbmVkIF9MSUJDCisjICBkZWZpbmUgX19MRUFGICwgX19sZWFmX18KKyMgIGRlZmluZSBfX0xFQUZfQVRUUiBfX2F0dHJpYnV0ZV9fICgoX19sZWFmX18pKQorIyBlbHNlCisjICBkZWZpbmUgX19MRUFGCisjICBkZWZpbmUgX19MRUFGX0FUVFIKKyMgZW5kaWYKKworLyogR0NDIGNhbiBhbHdheXMgZ3JvayBwcm90b3R5cGVzLiAgRm9yIEMrKyBwcm9ncmFtcyB3ZSBhZGQgdGhyb3coKQorICAgdG8gaGVscCBpdCBvcHRpbWl6ZSB0aGUgZnVuY3Rpb24gY2FsbHMuICBCdXQgdGhpcyB3b3JrcyBvbmx5IHdpdGgKKyAgIGdjYyAyLjgueCBhbmQgZWdjcy4gIEZvciBnY2MgMy4yIGFuZCB1cCB3ZSBldmVuIG1hcmsgQyBmdW5jdGlvbnMKKyAgIGFzIG5vbi10aHJvd2luZyB1c2luZyBhIGZ1bmN0aW9uIGF0dHJpYnV0ZSBzaW5jZSBwcm9ncmFtcyBjYW4gdXNlCisgICB0aGUgLWZleGNlcHRpb25zIG9wdGlvbnMgZm9yIEMgY29kZSBhcyB3ZWxsLiAgKi8KKyMgaWYgIWRlZmluZWQgX19jcGx1c3BsdXMgJiYgX19HTlVDX1BSRVJFUSAoMywgMykKKyMgIGRlZmluZSBfX1RIUk9XCV9fYXR0cmlidXRlX18gKChfX25vdGhyb3dfXyBfX0xFQUYpKQorIyAgZGVmaW5lIF9fVEhST1dOTAlfX2F0dHJpYnV0ZV9fICgoX19ub3Rocm93X18pKQorIyAgZGVmaW5lIF9fTlRIKGZjdCkJX19hdHRyaWJ1dGVfXyAoKF9fbm90aHJvd19fIF9fTEVBRikpIGZjdAorIyBlbHNlCisjICBpZiBkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fR05VQ19QUkVSRVEgKDIsOCkKKyMgICBkZWZpbmUgX19USFJPVwl0aHJvdyAoKQorIyAgIGRlZmluZSBfX1RIUk9XTkwJdGhyb3cgKCkKKyMgICBkZWZpbmUgX19OVEgoZmN0KQlfX0xFQUZfQVRUUiBmY3QgdGhyb3cgKCkKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19USFJPVworIyAgIGRlZmluZSBfX1RIUk9XTkwKKyMgICBkZWZpbmUgX19OVEgoZmN0KQlmY3QKKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbHNlCS8qIE5vdCBHQ0MuICAqLworCisjIGRlZmluZSBfX2lubGluZQkJLyogTm8gaW5saW5lIGZ1bmN0aW9ucy4gICovCisKKyMgZGVmaW5lIF9fVEhST1cKKyMgZGVmaW5lIF9fVEhST1dOTAorIyBkZWZpbmUgX19OVEgoZmN0KQlmY3QKKworIyBkZWZpbmUgX19jb25zdAljb25zdAorIyBkZWZpbmUgX19zaWduZWQJc2lnbmVkCisjIGRlZmluZSBfX3ZvbGF0aWxlCXZvbGF0aWxlCisKKyNlbmRpZgkvKiBHQ0MuICAqLworCisvKiBUaGVzZSB0d28gbWFjcm9zIGFyZSBub3QgdXNlZCBpbiBnbGliYyBhbnltb3JlLiAgVGhleSBhcmUga2VwdCBoZXJlCisgICBvbmx5IGJlY2F1c2Ugc29tZSBvdGhlciBwcm9qZWN0cyBleHBlY3QgdGhlIG1hY3JvcyB0byBiZSBkZWZpbmVkLiAgKi8KKyNkZWZpbmUgX19QKGFyZ3MpCWFyZ3MKKyNkZWZpbmUgX19QTVQoYXJncykJYXJncworCisvKiBGb3IgdGhlc2UgdGhpbmdzLCBHQ0MgYmVoYXZlcyB0aGUgQU5TSSB3YXkgbm9ybWFsbHksCisgICBhbmQgdGhlIG5vbi1BTlNJIHdheSB1bmRlciAtdHJhZGl0aW9uYWwuICAqLworCisjZGVmaW5lIF9fQ09OQ0FUKHgseSkJeCAjIyB5CisjZGVmaW5lIF9fU1RSSU5HKHgpCSN4CisKKy8qIFRoaXMgaXMgbm90IGEgdHlwZWRlZiBzbyBgY29uc3QgX19wdHJfdCcgZG9lcyB0aGUgcmlnaHQgdGhpbmcuICAqLworI2RlZmluZSBfX3B0cl90IHZvaWQgKgorI2RlZmluZSBfX2xvbmdfZG91YmxlX3QgIGxvbmcgZG91YmxlCisKKworLyogQysrIG5lZWRzIHRvIGtub3cgdGhhdCB0eXBlcyBhbmQgZGVjbGFyYXRpb25zIGFyZSBDLCBub3QgQysrLiAgKi8KKyNpZmRlZglfX2NwbHVzcGx1cworIyBkZWZpbmUgX19CRUdJTl9ERUNMUwlleHRlcm4gIkMiIHsKKyMgZGVmaW5lIF9fRU5EX0RFQ0xTCX0KKyNlbHNlCisjIGRlZmluZSBfX0JFR0lOX0RFQ0xTCisjIGRlZmluZSBfX0VORF9ERUNMUworI2VuZGlmCisKKworLyogVGhlIHN0YW5kYXJkIGxpYnJhcnkgbmVlZHMgdGhlIGZ1bmN0aW9ucyBmcm9tIHRoZSBJU08gQzkwIHN0YW5kYXJkCisgICBpbiB0aGUgc3RkIG5hbWVzcGFjZS4gIEF0IHRoZSBzYW1lIHRpbWUgd2Ugd2FudCB0byBiZSBzYWZlIGZvcgorICAgZnV0dXJlIGNoYW5nZXMgYW5kIHdlIGluY2x1ZGUgdGhlIElTTyBDOTkgY29kZSBpbiB0aGUgbm9uLXN0YW5kYXJkCisgICBuYW1lc3BhY2UgX19jOTkuICBUaGUgQysrIHdyYXBwZXIgaGVhZGVyIHRha2UgY2FzZSBvZiBhZGRpbmcgdGhlCisgICBkZWZpbml0aW9ucyB0byB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gICovCisjaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiBkZWZpbmVkIF9HTElCQ1BQX1VTRV9OQU1FU1BBQ0VTCisjIGRlZmluZSBfX0JFR0lOX05BTUVTUEFDRV9TVEQJbmFtZXNwYWNlIHN0ZCB7CisjIGRlZmluZSBfX0VORF9OQU1FU1BBQ0VfU1RECX0KKyMgZGVmaW5lIF9fVVNJTkdfTkFNRVNQQUNFX1NURChuYW1lKSB1c2luZyBzdGQ6Om5hbWU7CisjIGRlZmluZSBfX0JFR0lOX05BTUVTUEFDRV9DOTkJbmFtZXNwYWNlIF9fYzk5IHsKKyMgZGVmaW5lIF9fRU5EX05BTUVTUEFDRV9DOTkJfQorIyBkZWZpbmUgX19VU0lOR19OQU1FU1BBQ0VfQzk5KG5hbWUpIHVzaW5nIF9fYzk5OjpuYW1lOworI2Vsc2UKKy8qIEZvciBjb21wYXRpYmlsaXR5IHdlIGRvIG5vdCBhZGQgdGhlIGRlY2xhcmF0aW9ucyBpbnRvIGFueQorICAgbmFtZXNwYWNlLiAgVGhleSB3aWxsIGVuZCB1cCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB3aGljaCBpcyB3aGF0CisgICBvbGQgY29kZSBleHBlY3RzLiAgKi8KKyMgZGVmaW5lIF9fQkVHSU5fTkFNRVNQQUNFX1NURAorIyBkZWZpbmUgX19FTkRfTkFNRVNQQUNFX1NURAorIyBkZWZpbmUgX19VU0lOR19OQU1FU1BBQ0VfU1REKG5hbWUpCisjIGRlZmluZSBfX0JFR0lOX05BTUVTUEFDRV9DOTkKKyMgZGVmaW5lIF9fRU5EX05BTUVTUEFDRV9DOTkKKyMgZGVmaW5lIF9fVVNJTkdfTkFNRVNQQUNFX0M5OShuYW1lKQorI2VuZGlmCisKKworLyogU3VwcG9ydCBmb3IgYm91bmRlZCBwb2ludGVycy4gICovCisjaWZuZGVmIF9fQk9VTkRFRF9QT0lOVEVSU19fCisjIGRlZmluZSBfX2JvdW5kZWQJLyogbm90aGluZyAqLworIyBkZWZpbmUgX191bmJvdW5kZWQJLyogbm90aGluZyAqLworIyBkZWZpbmUgX19wdHJ2YWx1ZQkvKiBub3RoaW5nICovCisjZW5kaWYKKworCisvKiBGb3J0aWZ5IHN1cHBvcnQuICAqLworI2RlZmluZSBfX2JvcyhwdHIpIF9fYnVpbHRpbl9vYmplY3Rfc2l6ZSAocHRyLCBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMSkKKyNkZWZpbmUgX19ib3MwKHB0cikgX19idWlsdGluX29iamVjdF9zaXplIChwdHIsIDApCisKKyNpZiBfX0dOVUNfUFJFUkVRICg0LDMpCisjIGRlZmluZSBfX3dhcm5kZWNsKG5hbWUsIG1zZykgXAorICBleHRlcm4gdm9pZCBuYW1lICh2b2lkKSBfX2F0dHJpYnV0ZV9fKChfX3dhcm5pbmdfXyAobXNnKSkpCisjIGRlZmluZSBfX3dhcm5hdHRyKG1zZykgX19hdHRyaWJ1dGVfXygoX193YXJuaW5nX18gKG1zZykpKQorIyBkZWZpbmUgX19lcnJvcmRlY2wobmFtZSwgbXNnKSBcCisgIGV4dGVybiB2b2lkIG5hbWUgKHZvaWQpIF9fYXR0cmlidXRlX18oKF9fZXJyb3JfXyAobXNnKSkpCisjZWxzZQorIyBkZWZpbmUgX193YXJuZGVjbChuYW1lLCBtc2cpIGV4dGVybiB2b2lkIG5hbWUgKHZvaWQpCisjIGRlZmluZSBfX3dhcm5hdHRyKG1zZykKKyMgZGVmaW5lIF9fZXJyb3JkZWNsKG5hbWUsIG1zZykgZXh0ZXJuIHZvaWQgbmFtZSAodm9pZCkKKyNlbmRpZgorCisvKiBTdXBwb3J0IGZvciBmbGV4aWJsZSBhcnJheXMuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsOTcpCisvKiBHQ0MgMi45NyBzdXBwb3J0cyBDOTkgZmxleGlibGUgYXJyYXkgbWVtYmVycy4gICovCisjIGRlZmluZSBfX2ZsZXhhcnIJW10KKyNlbHNlCisjIGlmZGVmIF9fR05VQ19fCisjICBkZWZpbmUgX19mbGV4YXJyCVswXQorIyBlbHNlCisjICBpZiBkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgZGVmaW5lIF9fZmxleGFycglbXQorIyAgZWxzZQorLyogU29tZSBvdGhlciBub24tQzk5IGNvbXBpbGVyLiAgQXBwcm94aW1hdGUgd2l0aCBbMV0uICAqLworIyAgIGRlZmluZSBfX2ZsZXhhcnIJWzFdCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKworLyogX19hc21fXyAoInh5eiIpIGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgaGVhZGVycyB0byByZW5hbWUgZnVuY3Rpb25zCisgICBhdCB0aGUgYXNzZW1ibHkgbGFuZ3VhZ2UgbGV2ZWwuICBUaGlzIGlzIHdyYXBwZWQgYnkgdGhlIF9fUkVESVJFQ1QKKyAgIG1hY3JvLCBpbiBvcmRlciB0byBzdXBwb3J0IGNvbXBpbGVycyB0aGF0IGNhbiBkbyB0aGlzIHNvbWUgb3RoZXIKKyAgIHdheS4gIFdoZW4gY29tcGlsZXJzIGRvbid0IHN1cHBvcnQgYXNtLW5hbWVzIGF0IGFsbCwgd2UgaGF2ZSB0byBkbworICAgcHJlcHJvY2Vzc29yIHRyaWNrcyBpbnN0ZWFkICh3aGljaCBkb24ndCBoYXZlIGV4YWN0bHkgdGhlIHJpZ2h0CisgICBzZW1hbnRpY3MsIGJ1dCBpdCdzIHRoZSBiZXN0IHdlIGNhbiBkbykuCisKKyAgIEV4YW1wbGU6CisgICBpbnQgX19SRURJUkVDVChzZXRwZ3JwLCAoX19waWRfdCBwaWQsIF9fcGlkX3QgcGdycCksIHNldHBnaWQpOyAqLworCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisKKyMgZGVmaW5lIF9fUkVESVJFQ1QobmFtZSwgcHJvdG8sIGFsaWFzKSBuYW1lIHByb3RvIF9fYXNtX18gKF9fQVNNTkFNRSAoI2FsaWFzKSkKKyMgaWZkZWYgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgICAgbmFtZSBwcm90byBfX1RIUk9XIF9fYXNtX18gKF9fQVNNTkFNRSAoI2FsaWFzKSkKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USE5MKG5hbWUsIHByb3RvLCBhbGlhcykgXAorICAgICBuYW1lIHByb3RvIF9fVEhST1dOTCBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpCisjIGVsc2UKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgICAgbmFtZSBwcm90byBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpIF9fVEhST1cKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USE5MKG5hbWUsIHByb3RvLCBhbGlhcykgXAorICAgICBuYW1lIHByb3RvIF9fYXNtX18gKF9fQVNNTkFNRSAoI2FsaWFzKSkgX19USFJPV05MCisjIGVuZGlmCisjIGRlZmluZSBfX0FTTU5BTUUoY25hbWUpICBfX0FTTU5BTUUyIChfX1VTRVJfTEFCRUxfUFJFRklYX18sIGNuYW1lKQorIyBkZWZpbmUgX19BU01OQU1FMihwcmVmaXgsIGNuYW1lKSBfX1NUUklORyAocHJlZml4KSBjbmFtZQorCisvKgorI2VsaWYgX19TT01FX09USEVSX0NPTVBJTEVSX18KKworIyBkZWZpbmUgX19SRURJUkVDVChuYW1lLCBwcm90bywgYWxpYXMpIG5hbWUgcHJvdG87IFwKKwlfUHJhZ21hKCJsZXQgIiAjbmFtZSAiID0gIiAjYWxpYXMpCisqLworI2VuZGlmCisKKy8qIEdDQyBoYXMgdmFyaW91cyB1c2VmdWwgZGVjbGFyYXRpb25zIHRoYXQgY2FuIGJlIG1hZGUgd2l0aCB0aGUKKyAgIGBfX2F0dHJpYnV0ZV9fJyBzeW50YXguICBBbGwgb2YgdGhlIHdheXMgd2UgdXNlIHRoaXMgZG8gZmluZSBpZgorICAgdGhleSBhcmUgb21pdHRlZCBmb3IgY29tcGlsZXJzIHRoYXQgZG9uJ3QgdW5kZXJzdGFuZCBpdC4gKi8KKyNpZiAhZGVmaW5lZCBfX0dOVUNfXyB8fCBfX0dOVUNfXyA8IDIKKyMgZGVmaW5lIF9fYXR0cmlidXRlX18oeHl6KQkvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgZ2NjIDIuOTYgZGV2ZWxvcG1lbnQgdGhlIGBtYWxsb2MnIGF0dHJpYnV0ZQorICAgZm9yIGZ1bmN0aW9ucyB3YXMgaW50cm9kdWNlZC4gIFdlIGRvbid0IHdhbnQgdG8gdXNlIGl0IHVuY29uZGl0aW9uYWxseQorICAgKGFsdGhvdWdoIHRoaXMgd291bGQgYmUgcG9zc2libGUpIHNpbmNlIGl0IGdlbmVyYXRlcyB3YXJuaW5ncy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMiw5NikKKyMgZGVmaW5lIF9fYXR0cmlidXRlX21hbGxvY19fIF9fYXR0cmlidXRlX18gKChfX21hbGxvY19fKSkKKyNlbHNlCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9tYWxsb2NfXyAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgZ2NjIDIuOTYgZGV2ZWxvcG1lbnQgdGhlIGBwdXJlJyBhdHRyaWJ1dGUKKyAgIGZvciBmdW5jdGlvbnMgd2FzIGludHJvZHVjZWQuICBXZSBkb24ndCB3YW50IHRvIHVzZSBpdCB1bmNvbmRpdGlvbmFsbHkKKyAgIChhbHRob3VnaCB0aGlzIHdvdWxkIGJlIHBvc3NpYmxlKSBzaW5jZSBpdCBnZW5lcmF0ZXMgd2FybmluZ3MuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsOTYpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9wdXJlX18gX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKKyNlbHNlCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9wdXJlX18gLyogSWdub3JlICovCisjZW5kaWYKKworLyogVGhpcyBkZWNsYXJhdGlvbiB0ZWxscyB0aGUgY29tcGlsZXIgdGhhdCB0aGUgdmFsdWUgaXMgY29uc3RhbnQuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsNSkKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpCisjZWxzZQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgZ2NjIDMuMSBkZXZlbG9wbWVudCB0aGUgYHVzZWQnIGF0dHJpYnV0ZQorICAgZm9yIGZ1bmN0aW9ucyB3YXMgaW50cm9kdWNlZC4gIFdlIGRvbid0IHdhbnQgdG8gdXNlIGl0IHVuY29uZGl0aW9uYWxseQorICAgKGFsdGhvdWdoIHRoaXMgd291bGQgYmUgcG9zc2libGUpIHNpbmNlIGl0IGdlbmVyYXRlcyB3YXJuaW5ncy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMywxKQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfdXNlZF9fIF9fYXR0cmlidXRlX18gKChfX3VzZWRfXykpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9ub2lubGluZV9fIF9fYXR0cmlidXRlX18gKChfX25vaW5saW5lX18pKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX3VzZWRfXyBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9ub2lubGluZV9fIC8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIGdjYyBhbGxvd3MgbWFya2luZyBkZXByZWNhdGVkIGZ1bmN0aW9ucy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMywyKQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fIF9fYXR0cmlidXRlX18gKChfX2RlcHJlY2F0ZWRfXykpCisjZWxzZQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fIC8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIEF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZSBnY2MgMi44IGRldmVsb3BtZW50IHRoZSBgZm9ybWF0X2FyZycgYXR0cmlidXRlCisgICBmb3IgZnVuY3Rpb25zIHdhcyBpbnRyb2R1Y2VkLiAgV2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQgdW5jb25kaXRpb25hbGx5CisgICAoYWx0aG91Z2ggdGhpcyB3b3VsZCBiZSBwb3NzaWJsZSkgc2luY2UgaXQgZ2VuZXJhdGVzIHdhcm5pbmdzLgorICAgSWYgc2V2ZXJhbCBgZm9ybWF0X2FyZycgYXR0cmlidXRlcyBhcmUgZ2l2ZW4gZm9yIHRoZSBzYW1lIGZ1bmN0aW9uLCBpbgorICAgZ2NjLTMuMCBhbmQgb2xkZXIsIGFsbCBidXQgdGhlIGxhc3Qgb25lIGFyZSBpZ25vcmVkLiAgSW4gbmV3ZXIgZ2NjcywKKyAgIGFsbCBkZXNpZ25hdGVkIGFyZ3VtZW50cyBhcmUgY29uc2lkZXJlZC4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMiw4KQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9hcmdfXyAoeCkpKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyh4KSAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgZ2NjIDIuOTcgZGV2ZWxvcG1lbnQgdGhlIGBzdHJmbW9uJyBmb3JtYXQKKyAgIGF0dHJpYnV0ZSBmb3IgZnVuY3Rpb25zIHdhcyBpbnRyb2R1Y2VkLiAgV2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQKKyAgIHVuY29uZGl0aW9uYWxseSAoYWx0aG91Z2ggdGhpcyB3b3VsZCBiZSBwb3NzaWJsZSkgc2luY2UgaXQKKyAgIGdlbmVyYXRlcyB3YXJuaW5ncy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMiw5NykKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2Zvcm1hdF9zdHJmbW9uX18oYSxiKSBcCisgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3N0cmZtb25fXywgYSwgYikpKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2Zvcm1hdF9zdHJmbW9uX18oYSxiKSAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBUaGUgbm9udWxsIGZ1bmN0aW9uIGF0dHJpYnV0ZSBhbGxvd3MgdG8gbWFyayBwb2ludGVyIHBhcmFtZXRlcnMgd2hpY2gKKyAgIG11c3Qgbm90IGJlIE5VTEwuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDMsMykKKyMgZGVmaW5lIF9fbm9ubnVsbChwYXJhbXMpIF9fYXR0cmlidXRlX18gKChfX25vbm51bGxfXyBwYXJhbXMpKQorI2Vsc2UKKyMgZGVmaW5lIF9fbm9ubnVsbChwYXJhbXMpCisjZW5kaWYKKworLyogSWYgZm9ydGlmaWNhdGlvbiBtb2RlLCB3ZSB3YXJuIGFib3V0IHVudXNlZCByZXN1bHRzIG9mIGNlcnRhaW4KKyAgIGZ1bmN0aW9uIGNhbGxzIHdoaWNoIGNhbiBsZWFkIHRvIHByb2JsZW1zLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgzLDQpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV93YXJuX3VudXNlZF9yZXN1bHRfXyBcCisgICBfX2F0dHJpYnV0ZV9fICgoX193YXJuX3VudXNlZF9yZXN1bHRfXykpCisjIGlmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwCisjICBkZWZpbmUgX193dXIgX19hdHRyaWJ1dGVfd2Fybl91bnVzZWRfcmVzdWx0X18KKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBfX2F0dHJpYnV0ZV93YXJuX3VudXNlZF9yZXN1bHRfXyAvKiBlbXB0eSAqLworI2VuZGlmCisjaWZuZGVmIF9fd3VyCisjIGRlZmluZSBfX3d1ciAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBGb3JjZXMgYSBmdW5jdGlvbiB0byBiZSBhbHdheXMgaW5saW5lZC4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMywyKQorIyBkZWZpbmUgX19hbHdheXNfaW5saW5lIF9faW5saW5lIF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykpCisjZWxzZQorIyBkZWZpbmUgX19hbHdheXNfaW5saW5lIF9faW5saW5lCisjZW5kaWYKKworLyogR0NDIDQuMyBhbmQgYWJvdmUgd2l0aCAtc3RkPWM5OSBvciAtc3RkPWdudTk5IGltcGxlbWVudHMgSVNPIEM5OQorICAgaW5saW5lIHNlbWFudGljcywgdW5sZXNzIC1mZ251ODktaW5saW5lIGlzIHVzZWQuICAqLworI2lmICFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IF9fR05VQ19QUkVSRVEgKDQsMykKKyMgaWYgZGVmaW5lZCBfX0dOVUNfU1REQ19JTkxJTkVfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgX19leHRlcm5faW5saW5lIGV4dGVybiBfX2lubGluZSBfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18pKQorIyAgaWYgX19HTlVDX1BSRVJFUSAoNCwzKQorIyAgIGRlZmluZSBfX2V4dGVybl9hbHdheXNfaW5saW5lIFwKKyAgZXh0ZXJuIF9fYWx3YXlzX2lubGluZSBfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19leHRlcm5fYWx3YXlzX2lubGluZSBcCisgIGV4dGVybiBfX2Fsd2F5c19pbmxpbmUgX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fKSkKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBfX2V4dGVybl9pbmxpbmUgZXh0ZXJuIF9faW5saW5lCisjICBpZiBfX0dOVUNfUFJFUkVRICg0LDMpCisjICAgZGVmaW5lIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgXAorICBleHRlcm4gX19hbHdheXNfaW5saW5lIF9fYXR0cmlidXRlX18gKChfX2FydGlmaWNpYWxfXykpCisjICBlbHNlCisjICAgZGVmaW5lIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgZXh0ZXJuIF9fYWx3YXlzX2lubGluZQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBHQ0MgNC4zIGFuZCBhYm92ZSBhbGxvdyBwYXNzaW5nIGFsbCBhbm9ueW1vdXMgYXJndW1lbnRzIG9mIGFuCisgICBfX2V4dGVybl9hbHdheXNfaW5saW5lIGZ1bmN0aW9uIHRvIHNvbWUgb3RoZXIgdmFyYXJnIGZ1bmN0aW9uLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICg0LDMpCisjIGRlZmluZSBfX3ZhX2FyZ19wYWNrKCkgX19idWlsdGluX3ZhX2FyZ19wYWNrICgpCisjIGRlZmluZSBfX3ZhX2FyZ19wYWNrX2xlbigpIF9fYnVpbHRpbl92YV9hcmdfcGFja19sZW4gKCkKKyNlbmRpZgorCisvKiBJdCBpcyBwb3NzaWJsZSB0byBjb21waWxlIGNvbnRhaW5pbmcgR0NDIGV4dGVuc2lvbnMgZXZlbiBpZiBHQ0MgaXMKKyAgIHJ1biBpbiBwZWRhbnRpYyBtb2RlIGlmIHRoZSB1c2VzIGFyZSBjYXJlZnVsbHkgbWFya2VkIHVzaW5nIHRoZQorICAgYF9fZXh0ZW5zaW9uX18nIGtleXdvcmQuICBCdXQgdGhpcyBpcyBub3QgZ2VuZXJhbGx5IGF2YWlsYWJsZSBiZWZvcmUKKyAgIHZlcnNpb24gMi44LiAgKi8KKyNpZiAhX19HTlVDX1BSRVJFUSAoMiw4KQorIyBkZWZpbmUgX19leHRlbnNpb25fXwkJLyogSWdub3JlICovCisjZW5kaWYKKworLyogX19yZXN0cmljdCBpcyBrbm93biBpbiBFR0NTIDEuMiBhbmQgYWJvdmUuICovCisjaWYgIV9fR05VQ19QUkVSRVEgKDIsOTIpCisjIGRlZmluZSBfX3Jlc3RyaWN0CS8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIElTTyBDOTkgYWxzbyBhbGxvd3MgdG8gZGVjbGFyZSBhcnJheXMgYXMgbm9uLW92ZXJsYXBwaW5nLiAgVGhlIHN5bnRheCBpcworICAgICBhcnJheV9uYW1lW3Jlc3RyaWN0XQorICAgR0NDIDMuMSBzdXBwb3J0cyB0aGlzLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgzLDEpICYmICFkZWZpbmVkIF9fR05VR19fCisjIGRlZmluZSBfX3Jlc3RyaWN0X2FycglfX3Jlc3RyaWN0CisjZWxzZQorIyBpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIF9fcmVzdHJpY3RfYXJyCS8qIE5vdCBzdXBwb3J0ZWQgaW4gb2xkIEdDQy4gICovCisjIGVsc2UKKyMgIGlmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgICBkZWZpbmUgX19yZXN0cmljdF9hcnIJcmVzdHJpY3QKKyMgIGVsc2UKKy8qIFNvbWUgb3RoZXIgbm9uLUM5OSBjb21waWxlci4gICovCisjICAgZGVmaW5lIF9fcmVzdHJpY3RfYXJyCS8qIE5vdCBzdXBwb3J0ZWQuICAqLworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFX01BVEhfT1BUSU9OQUwgJiYgZGVmaW5lZCBfX05PX0xPTkdfRE9VQkxFX01BVEgKKyMgZGVmaW5lIF9fTERCTF9DT01QQVQgMQorIyBpZmRlZiBfX1JFRElSRUNUCisjICBkZWZpbmUgX19MREJMX1JFRElSMShuYW1lLCBwcm90bywgYWxpYXMpIF9fUkVESVJFQ1QgKG5hbWUsIHByb3RvLCBhbGlhcykKKyMgIGRlZmluZSBfX0xEQkxfUkVESVIobmFtZSwgcHJvdG8pIFwKKyAgX19MREJMX1JFRElSMSAobmFtZSwgcHJvdG8sIF9fbmxkYmxfIyNuYW1lKQorIyAgZGVmaW5lIF9fTERCTF9SRURJUjFfTlRIKG5hbWUsIHByb3RvLCBhbGlhcykgX19SRURJUkVDVF9OVEggKG5hbWUsIHByb3RvLCBhbGlhcykKKyMgIGRlZmluZSBfX0xEQkxfUkVESVJfTlRIKG5hbWUsIHByb3RvKSBcCisgIF9fTERCTF9SRURJUjFfTlRIIChuYW1lLCBwcm90bywgX19ubGRibF8jI25hbWUpCisjICBkZWZpbmUgX19MREJMX1JFRElSMV9ERUNMKG5hbWUsIGFsaWFzKSBcCisgIGV4dGVybiBfX3R5cGVvZiAobmFtZSkgbmFtZSBfX2FzbSAoX19BU01OQU1FICgjYWxpYXMpKTsKKyMgIGRlZmluZSBfX0xEQkxfUkVESVJfREVDTChuYW1lKSBcCisgIGV4dGVybiBfX3R5cGVvZiAobmFtZSkgbmFtZSBfX2FzbSAoX19BU01OQU1FICgiX19ubGRibF8iICNuYW1lKSk7CisjICBkZWZpbmUgX19SRURJUkVDVF9MREJMKG5hbWUsIHByb3RvLCBhbGlhcykgXAorICBfX0xEQkxfUkVESVIxIChuYW1lLCBwcm90bywgX19ubGRibF8jI2FsaWFzKQorIyAgZGVmaW5lIF9fUkVESVJFQ1RfTlRIX0xEQkwobmFtZSwgcHJvdG8sIGFsaWFzKSBcCisgIF9fTERCTF9SRURJUjFfTlRIIChuYW1lLCBwcm90bywgX19ubGRibF8jI2FsaWFzKQorIyBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQgX19MREJMX0NPTVBBVCB8fCAhZGVmaW5lZCBfX1JFRElSRUNUCisjIGRlZmluZSBfX0xEQkxfUkVESVIxKG5hbWUsIHByb3RvLCBhbGlhcykgbmFtZSBwcm90bworIyBkZWZpbmUgX19MREJMX1JFRElSKG5hbWUsIHByb3RvKSBuYW1lIHByb3RvCisjIGRlZmluZSBfX0xEQkxfUkVESVIxX05USChuYW1lLCBwcm90bywgYWxpYXMpIG5hbWUgcHJvdG8gX19USFJPVworIyBkZWZpbmUgX19MREJMX1JFRElSX05USChuYW1lLCBwcm90bykgbmFtZSBwcm90byBfX1RIUk9XCisjIGRlZmluZSBfX0xEQkxfUkVESVJfREVDTChuYW1lKQorIyBpZmRlZiBfX1JFRElSRUNUCisjICBkZWZpbmUgX19SRURJUkVDVF9MREJMKG5hbWUsIHByb3RvLCBhbGlhcykgX19SRURJUkVDVCAobmFtZSwgcHJvdG8sIGFsaWFzKQorIyAgZGVmaW5lIF9fUkVESVJFQ1RfTlRIX0xEQkwobmFtZSwgcHJvdG8sIGFsaWFzKSBcCisgIF9fUkVESVJFQ1RfTlRIIChuYW1lLCBwcm90bywgYWxpYXMpCisjIGVuZGlmCisjZW5kaWYKKworI2VuZGlmCSAvKiBzeXMvY2RlZnMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9kZWJ1Z3JlZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9kZWJ1Z3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYmJmNzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2RlYnVncmVnLmgKQEAgLTAsMCArMSw4OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfREVCVUdSRUdfSAorI2RlZmluZSBfU1lTX0RFQlVHUkVHX0gJMQorI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworLyogSW5kaWNhdGUgdGhlIHJlZ2lzdGVyIG51bWJlcnMgZm9yIGEgbnVtYmVyIG9mIHRoZSBzcGVjaWZpYworICAgZGVidWcgcmVnaXN0ZXJzLiAgUmVnaXN0ZXJzIDAtMyBjb250YWluIHRoZSBhZGRyZXNzZXMgd2Ugd2lzaCB0byB0cmFwIG9uICovCisjZGVmaW5lIERSX0ZJUlNUQUREUiAwICAgICAgICAvKiB1X2RlYnVncmVnW0RSX0ZJUlNUQUREUl0gKi8KKyNkZWZpbmUgRFJfTEFTVEFERFIgMyAgICAgICAgIC8qIHVfZGVidWdyZWdbRFJfTEFTVEFERFJdICAqLworCisjZGVmaW5lIERSX1NUQVRVUyA2ICAgICAgICAgICAvKiB1X2RlYnVncmVnW0RSX1NUQVRVU10gICAgICovCisjZGVmaW5lIERSX0NPTlRST0wgNyAgICAgICAgICAvKiB1X2RlYnVncmVnW0RSX0NPTlRST0xdICovCisKKy8qIERlZmluZSBhIGZldyB0aGluZ3MgZm9yIHRoZSBzdGF0dXMgcmVnaXN0ZXIuICBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lCisgICB3aGljaCBkZWJ1Z2dpbmcgcmVnaXN0ZXIgd2FzIHJlc3BvbnNpYmxlIGZvciB0aGUgdHJhcC4gIFRoZSBvdGhlciBiaXRzCisgICBhcmUgZWl0aGVyIHJlc2VydmVkIG9yIG5vdCBvZiBpbnRlcmVzdCB0byB1cy4gKi8KKworI2RlZmluZSBEUl9UUkFQMAkoMHgxKQkJLyogZGIwICovCisjZGVmaW5lIERSX1RSQVAxCSgweDIpCQkvKiBkYjEgKi8KKyNkZWZpbmUgRFJfVFJBUDIJKDB4NCkJCS8qIGRiMiAqLworI2RlZmluZSBEUl9UUkFQMwkoMHg4KQkJLyogZGIzICovCisKKyNkZWZpbmUgRFJfU1RFUAkJKDB4NDAwMCkJLyogc2luZ2xlLXN0ZXAgKi8KKyNkZWZpbmUgRFJfU1dJVENICSgweDgwMDApCS8qIHRhc2sgc3dpdGNoICovCisKKy8qIE5vdyBkZWZpbmUgYSBidW5jaCBvZiB0aGluZ3MgZm9yIG1hbmlwdWxhdGluZyB0aGUgY29udHJvbCByZWdpc3Rlci4KKyAgIFRoZSB0b3AgdHdvIGJ5dGVzIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyIGNvbnNpc3Qgb2YgNCBmaWVsZHMgb2YgNAorICAgYml0cyAtIGVhY2ggZmllbGQgY29ycmVzcG9uZHMgdG8gb25lIG9mIHRoZSBmb3VyIGRlYnVnIHJlZ2lzdGVycywKKyAgIGFuZCBpbmRpY2F0ZXMgd2hhdCB0eXBlcyBvZiBhY2Nlc3Mgd2UgdHJhcCBvbiwgYW5kIGhvdyBsYXJnZSB0aGUgZGF0YQorICAgZmllbGQgaXMgdGhhdCB3ZSBhcmUgbG9va2luZyBhdCAqLworCisjZGVmaW5lIERSX0NPTlRST0xfU0hJRlQgMTYgICAvKiBTa2lwIHRoaXMgbWFueSBiaXRzIGluIGN0bCByZWdpc3RlciAqLworI2RlZmluZSBEUl9DT05UUk9MX1NJWkUgIDQgICAgLyogNCBjb250cm9sIGJpdHMgcGVyIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgRFJfUldfRVhFQ1VURQkoMHgwKSAvKiBTZXR0aW5ncyBmb3IgdGhlIGFjY2VzcyB0eXBlcyB0byB0cmFwIG9uICovCisjZGVmaW5lIERSX1JXX1dSSVRFCSgweDEpCisjZGVmaW5lIERSX1JXX1JFQUQJKDB4MykKKworI2RlZmluZSBEUl9MRU5fMSAoMHgwKQkgICAgICAvKiBTZXR0aW5ncyBmb3IgZGF0YSBsZW5ndGggdG8gdHJhcCBvbiAqLworI2RlZmluZSBEUl9MRU5fMiAoMHg0KQorI2RlZmluZSBEUl9MRU5fNCAoMHhDKQorI2RlZmluZSBEUl9MRU5fOCAoMHg4KQorCisvKiBUaGUgbG93IGJ5dGUgdG8gdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZGV0ZXJtaW5lIHdoaWNoIHJlZ2lzdGVycyBhcmUKKyAgIGVuYWJsZWQuICBUaGVyZSBhcmUgNCBmaWVsZHMgb2YgdHdvIGJpdHMuICBPbmUgYml0IGlzICJsb2NhbCIsIG1lYW5pbmcKKyAgIHRoYXQgdGhlIHByb2Nlc3NvciB3aWxsIHJlc2V0IHRoZSBiaXQgYWZ0ZXIgYSB0YXNrIHN3aXRjaCBhbmQgdGhlIG90aGVyCisgICBpcyBnbG9iYWwgbWVhbmluZyB0aGF0IHdlIGhhdmUgdG8gZXhwbGljaXRseSByZXNldCB0aGUgYml0LiAgV2l0aCBsaW51eCwKKyAgIHlvdSBjYW4gdXNlIGVpdGhlciBvbmUsIHNpbmNlIHdlIGV4cGxpY2l0bHkgemVybyB0aGUgcmVnaXN0ZXIgd2hlbiB3ZSBlbnRlcgorICAga2VybmVsIG1vZGUuICovCisKKyNkZWZpbmUgRFJfTE9DQUxfRU5BQkxFX1NISUZUICAwICAgLyogRXh0cmEgc2hpZnQgdG8gdGhlIGxvY2FsIGVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgRFJfR0xPQkFMX0VOQUJMRV9TSElGVCAxICAgLyogRXh0cmEgc2hpZnQgdG8gdGhlIGdsb2JhbCBlbmFibGUgYml0ICovCisjZGVmaW5lIERSX0VOQUJMRV9TSVpFCSAgICAgICAyICAgLyogMiBlbmFibGUgYml0cyBwZXIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBEUl9MT0NBTF9FTkFCTEVfTUFTSyAgKDB4NTUpIC8qIFNldCAgbG9jYWwgYml0cyBmb3IgYWxsIDQgcmVncyAqLworI2RlZmluZSBEUl9HTE9CQUxfRU5BQkxFX01BU0sgKDB4QUEpIC8qIFNldCBnbG9iYWwgYml0cyBmb3IgYWxsIDQgcmVncyAqLworCisvKiBUaGUgc2Vjb25kIGJ5dGUgdG8gdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaGFzIGEgZmV3IHNwZWNpYWwKKyAgIHRoaW5ncy4gICovCisKKworCisjaWYgX19XT1JEU0laRSA9PSA2NAorIyBkZWZpbmUgRFJfQ09OVFJPTF9SRVNFUlZFRCAoMHhGRkZGRkZGRjAwMDBGQzAwVUwpIC8qIFJlc2VydmVkICovCisjZWxzZQorIyBkZWZpbmUgRFJfQ09OVFJPTF9SRVNFUlZFRCAoMHgwMEZDMDBVKSAvKiBSZXNlcnZlZCAqLworI2VuZGlmCisjZGVmaW5lIERSX0xPQ0FMX1NMT1dET1dOICAgKDB4MTAwKSAgLyogTG9jYWwgc2xvdyB0aGUgcGlwZWxpbmUgKi8KKyNkZWZpbmUgRFJfR0xPQkFMX1NMT1dET1dOICAoMHgyMDApICAvKiBHbG9iYWwgc2xvdyB0aGUgcGlwZWxpbmUgKi8KKworI2VuZGlmCS8qIHN5cy9kZWJ1Z3JlZy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2Rpci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9kaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjExZDZjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9kaXIuaApAQCAtMCwwICsxLDI4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19ESVJfSAorI2RlZmluZQlfU1lTX0RJUl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKworI2RlZmluZQlkaXJlY3QJZGlyZW50CisKKyNlbmRpZgkvKiBzeXMvZGlyLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2Vwb2xsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2Vwb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1ZWYzNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZXBvbGwuaApAQCAtMCwwICsxLDE0NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDgsIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19FUE9MTF9ICisjZGVmaW5lCV9TWVNfRVBPTExfSAkxCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogR2V0IF9fc2lnc2V0X3QuICAqLworI2luY2x1ZGUgPGJpdHMvc2lnc2V0Lmg+CisKKyNpZm5kZWYgX19zaWdzZXRfdF9kZWZpbmVkCisjIGRlZmluZSBfX3NpZ3NldF90X2RlZmluZWQKK3R5cGVkZWYgX19zaWdzZXRfdCBzaWdzZXRfdDsKKyNlbmRpZgorCisKKy8qIEZsYWdzIHRvIGJlIHBhc3NlZCB0byBlcG9sbF9jcmVhdGUxLiAgKi8KK2VudW0KKyAgeworICAgIEVQT0xMX0NMT0VYRUMgPSAwMjAwMDAwMCwKKyNkZWZpbmUgRVBPTExfQ0xPRVhFQyBFUE9MTF9DTE9FWEVDCisgICAgRVBPTExfTk9OQkxPQ0sgPSAwNDAwMAorI2RlZmluZSBFUE9MTF9OT05CTE9DSyBFUE9MTF9OT05CTE9DSworICB9OworCisKK2VudW0gRVBPTExfRVZFTlRTCisgIHsKKyAgICBFUE9MTElOID0gMHgwMDEsCisjZGVmaW5lIEVQT0xMSU4gRVBPTExJTgorICAgIEVQT0xMUFJJID0gMHgwMDIsCisjZGVmaW5lIEVQT0xMUFJJIEVQT0xMUFJJCisgICAgRVBPTExPVVQgPSAweDAwNCwKKyNkZWZpbmUgRVBPTExPVVQgRVBPTExPVVQKKyAgICBFUE9MTFJETk9STSA9IDB4MDQwLAorI2RlZmluZSBFUE9MTFJETk9STSBFUE9MTFJETk9STQorICAgIEVQT0xMUkRCQU5EID0gMHgwODAsCisjZGVmaW5lIEVQT0xMUkRCQU5EIEVQT0xMUkRCQU5ECisgICAgRVBPTExXUk5PUk0gPSAweDEwMCwKKyNkZWZpbmUgRVBPTExXUk5PUk0gRVBPTExXUk5PUk0KKyAgICBFUE9MTFdSQkFORCA9IDB4MjAwLAorI2RlZmluZSBFUE9MTFdSQkFORCBFUE9MTFdSQkFORAorICAgIEVQT0xMTVNHID0gMHg0MDAsCisjZGVmaW5lIEVQT0xMTVNHIEVQT0xMTVNHCisgICAgRVBPTExFUlIgPSAweDAwOCwKKyNkZWZpbmUgRVBPTExFUlIgRVBPTExFUlIKKyAgICBFUE9MTEhVUCA9IDB4MDEwLAorI2RlZmluZSBFUE9MTEhVUCBFUE9MTEhVUAorICAgIEVQT0xMUkRIVVAgPSAweDIwMDAsCisjZGVmaW5lIEVQT0xMUkRIVVAgRVBPTExSREhVUAorICAgIEVQT0xMT05FU0hPVCA9IDF1IDw8IDMwLAorI2RlZmluZSBFUE9MTE9ORVNIT1QgRVBPTExPTkVTSE9UCisgICAgRVBPTExFVCA9IDF1IDw8IDMxCisjZGVmaW5lIEVQT0xMRVQgRVBPTExFVAorICB9OworCisKKy8qIFZhbGlkIG9wY29kZXMgKCAib3AiIHBhcmFtZXRlciApIHRvIGlzc3VlIHRvIGVwb2xsX2N0bCgpLiAgKi8KKyNkZWZpbmUgRVBPTExfQ1RMX0FERCAxCS8qIEFkZCBhIGZpbGUgZGVjcmlwdG9yIHRvIHRoZSBpbnRlcmZhY2UuICAqLworI2RlZmluZSBFUE9MTF9DVExfREVMIDIJLyogUmVtb3ZlIGEgZmlsZSBkZWNyaXB0b3IgZnJvbSB0aGUgaW50ZXJmYWNlLiAgKi8KKyNkZWZpbmUgRVBPTExfQ1RMX01PRCAzCS8qIENoYW5nZSBmaWxlIGRlY3JpcHRvciBlcG9sbF9ldmVudCBzdHJ1Y3R1cmUuICAqLworCisKK3R5cGVkZWYgdW5pb24gZXBvbGxfZGF0YQoreworICB2b2lkICpwdHI7CisgIGludCBmZDsKKyAgdWludDMyX3QgdTMyOworICB1aW50NjRfdCB1NjQ7Cit9IGVwb2xsX2RhdGFfdDsKKworc3RydWN0IGVwb2xsX2V2ZW50Cit7CisgIHVpbnQzMl90IGV2ZW50czsJLyogRXBvbGwgZXZlbnRzICovCisgIGVwb2xsX2RhdGFfdCBkYXRhOwkvKiBVc2VyIGRhdGEgdmFyaWFibGUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIENyZWF0ZXMgYW4gZXBvbGwgaW5zdGFuY2UuICBSZXR1cm5zIGFuIGZkIGZvciB0aGUgbmV3IGluc3RhbmNlLgorICAgVGhlICJzaXplIiBwYXJhbWV0ZXIgaXMgYSBoaW50IHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBmaWxlCisgICBkZXNjcmlwdG9ycyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBpbnN0YW5jZS4gIFRoZSBmZAorICAgcmV0dXJuZWQgYnkgZXBvbGxfY3JlYXRlKCkgc2hvdWxkIGJlIGNsb3NlZCB3aXRoIGNsb3NlKCkuICAqLworZXh0ZXJuIGludCBlcG9sbF9jcmVhdGUgKGludCBfX3NpemUpIF9fVEhST1c7CisKKy8qIFNhbWUgYXMgZXBvbGxfY3JlYXRlIGJ1dCB3aXRoIGFuIEZMQUdTIHBhcmFtZXRlci4gIFRoZSB1bnVzZWQgU0laRQorICAgcGFyYW1ldGVyIGhhcyBiZWVuIGRyb3BwZWQuICAqLworZXh0ZXJuIGludCBlcG9sbF9jcmVhdGUxIChpbnQgX19mbGFncykgX19USFJPVzsKKworCisvKiBNYW5pcHVsYXRlIGFuIGVwb2xsIGluc3RhbmNlICJlcGZkIi4gUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywKKyAgIC0xIGluIGNhc2Ugb2YgZXJyb3IgKCB0aGUgImVycm5vIiB2YXJpYWJsZSB3aWxsIGNvbnRhaW4gdGhlCisgICBzcGVjaWZpYyBlcnJvciBjb2RlICkgVGhlICJvcCIgcGFyYW1ldGVyIGlzIG9uZSBvZiB0aGUgRVBPTExfQ1RMXyoKKyAgIGNvbnN0YW50cyBkZWZpbmVkIGFib3ZlLiBUaGUgImZkIiBwYXJhbWV0ZXIgaXMgdGhlIHRhcmdldCBvZiB0aGUKKyAgIG9wZXJhdGlvbi4gVGhlICJldmVudCIgcGFyYW1ldGVyIGRlc2NyaWJlcyB3aGljaCBldmVudHMgdGhlIGNhbGxlcgorICAgaXMgaW50ZXJlc3RlZCBpbiBhbmQgYW55IGFzc29jaWF0ZWQgdXNlciBkYXRhLiAgKi8KK2V4dGVybiBpbnQgZXBvbGxfY3RsIChpbnQgX19lcGZkLCBpbnQgX19vcCwgaW50IF9fZmQsCisJCSAgICAgIHN0cnVjdCBlcG9sbF9ldmVudCAqX19ldmVudCkgX19USFJPVzsKKworCisvKiBXYWl0IGZvciBldmVudHMgb24gYW4gZXBvbGwgaW5zdGFuY2UgImVwZmQiLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIHRyaWdnZXJlZCBldmVudHMgcmV0dXJuZWQgaW4gImV2ZW50cyIgYnVmZmVyLiBPciAtMSBpbiBjYXNlIG9mCisgICBlcnJvciB3aXRoIHRoZSAiZXJybm8iIHZhcmlhYmxlIHNldCB0byB0aGUgc3BlY2lmaWMgZXJyb3IgY29kZS4gVGhlCisgICAiZXZlbnRzIiBwYXJhbWV0ZXIgaXMgYSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdHJpZ2dlcmVkCisgICBldmVudHMuIFRoZSAibWF4ZXZlbnRzIiBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZXZlbnRzIHRvIGJlCisgICByZXR1cm5lZCAoIHVzdWFsbHkgc2l6ZSBvZiAiZXZlbnRzIiApLiBUaGUgInRpbWVvdXQiIHBhcmFtZXRlcgorICAgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHdhaXQgdGltZSBpbiBtaWxsaXNlY29uZHMgKC0xID09IGluZmluaXRlKS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGVwb2xsX3dhaXQgKGludCBfX2VwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCAqX19ldmVudHMsCisJCSAgICAgICBpbnQgX19tYXhldmVudHMsIGludCBfX3RpbWVvdXQpOworCisKKy8qIFNhbWUgYXMgZXBvbGxfd2FpdCwgYnV0IHRoZSB0aHJlYWQncyBzaWduYWwgbWFzayBpcyB0ZW1wb3JhcmlseQorICAgYW5kIGF0b21pY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgb25lIHByb3ZpZGVkIGFzIHBhcmFtZXRlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGVwb2xsX3B3YWl0IChpbnQgX19lcGZkLCBzdHJ1Y3QgZXBvbGxfZXZlbnQgKl9fZXZlbnRzLAorCQkJaW50IF9fbWF4ZXZlbnRzLCBpbnQgX190aW1lb3V0LAorCQkJX19jb25zdCBfX3NpZ3NldF90ICpfX3NzKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9lcG9sbC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2Vycm5vLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM5ZjRmYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZXJybm8uaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8ZXJybm8uaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZXZlbnRmZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9ldmVudGZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0MmRmNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZXZlbnRmZC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0VWRU5URkRfSAorI2RlZmluZQlfU1lTX0VWRU5URkRfSAkxCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisvKiBUeXBlIGZvciBldmVudCBjb3VudGVyLiAgKi8KK3R5cGVkZWYgdWludDY0X3QgZXZlbnRmZF90OworCisvKiBGbGFncyBmb3Igc2lnbmFsZmQuICAqLworZW51bQorICB7CisgICAgRUZEX1NFTUFQSE9SRSA9IDEsCisjZGVmaW5lIEVGRF9TRU1BUEhPUkUgRUZEX1NFTUFQSE9SRQorICAgIEVGRF9DTE9FWEVDID0gMDIwMDAwMDAsCisjZGVmaW5lIEVGRF9DTE9FWEVDIEVGRF9DTE9FWEVDCisgICAgRUZEX05PTkJMT0NLID0gMDQwMDAKKyNkZWZpbmUgRUZEX05PTkJMT0NLIEVGRF9OT05CTE9DSworICB9OworCisKK19fQkVHSU5fREVDTFMKKworLyogUmV0dXJuIGZpbGUgZGVzY3JpcHRvciBmb3IgZ2VuZXJpYyBldmVudCBjaGFubmVsLiAgU2V0IGluaXRpYWwKKyAgIHZhbHVlIHRvIENPVU5ULiAgKi8KK2V4dGVybiBpbnQgZXZlbnRmZCAoaW50IF9fY291bnQsIGludCBfX2ZsYWdzKSBfX1RIUk9XOworCisvKiBSZWFkIGV2ZW50IGNvdW50ZXIgYW5kIHBvc3NpYmx5IHdhaXQgZm9yIGV2ZW50cy4gICovCitleHRlcm4gaW50IGV2ZW50ZmRfcmVhZCAoaW50IF9fZmQsIGV2ZW50ZmRfdCAqX192YWx1ZSk7CisKKy8qIEluY3JlbWVudCBldmVudCBjb3VudGVyLiAgKi8KK2V4dGVybiBpbnQgZXZlbnRmZF93cml0ZSAoaW50IF9fZmQsIGV2ZW50ZmRfdCBfX3ZhbHVlKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9ldmVudGZkLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZmFub3RpZnkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZmFub3RpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjg1MDBjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9mYW5vdGlmeS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0ZBTk9USUZZX0gKKyNkZWZpbmUJX1NZU19GQU5PVElGWV9ICTEKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zhbm90aWZ5Lmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgZmFub3RpZnkgZ3JvdXAuICAqLworZXh0ZXJuIGludCBmYW5vdGlmeV9pbml0ICh1bnNpZ25lZCBpbnQgX19mbGFncywgdW5zaWduZWQgaW50IF9fZXZlbnRfZl9mbGFncykKKyAgX19USFJPVzsKKworLyogQWRkLCByZW1vdmUsIG9yIG1vZGlmeSBhbiBmYW5vdGlmeSBtYXJrIG9uIGEgZmlsZXN5c3RlbSBvYmplY3QuICAqLworZXh0ZXJuIGludCBmYW5vdGlmeV9tYXJrIChpbnQgX19mYW5vdGlmeV9mZCwgdW5zaWduZWQgaW50IF9fZmxhZ3MsCisJCQkgIHVpbnQ2NF90IF9fbWFzaywgaW50IF9fZGZkLCBjb25zdCBjaGFyICpfX3BhdGhuYW1lKQorICAgICBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL2Zhbm90aWZ5LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZmNudGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZmNudGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDMwNDU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9mY250bC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxmY250bC5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9maWxlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2IzNjM1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9maWxlLmgKQEAgLTAsMCArMSw1NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTYsIDk3LCA5OCwgOTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19GSUxFX0gKKyNkZWZpbmUJX1NZU19GSUxFX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2lmbmRlZglfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworCisvKiBBbHRlcm5hdGUgbmFtZXMgZm9yIHZhbHVlcyBmb3IgdGhlIFdIRU5DRSBhcmd1bWVudCB0byBgbHNlZWsnLgorICAgVGhlc2UgYXJlIHRoZSBzYW1lIGFzIFNFRUtfU0VULCBTRUVLX0NVUiwgYW5kIFNFRUtfRU5ELCByZXNwZWN0aXZlbHkuICAqLworI2lmbmRlZiBMX1NFVAorIyBkZWZpbmUgTF9TRVQJMAkvKiBTZWVrIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUuICAqLworIyBkZWZpbmUgTF9JTkNSCTEJLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLworIyBkZWZpbmUgTF9YVE5ECTIJLyogU2VlayBmcm9tIGVuZCBvZiBmaWxlLiAgKi8KKyNlbmRpZgorCisKKy8qIE9wZXJhdGlvbnMgZm9yIHRoZSBgZmxvY2snIGNhbGwuICAqLworI2RlZmluZQlMT0NLX1NICTEJLyogU2hhcmVkIGxvY2suICAqLworI2RlZmluZQlMT0NLX0VYCTIgCS8qIEV4Y2x1c2l2ZSBsb2NrLiAgKi8KKyNkZWZpbmUJTE9DS19VTgk4CS8qIFVubG9jay4gICovCisKKy8qIENhbiBiZSBPUidkIGluIHRvIG9uZSBvZiB0aGUgYWJvdmUuICAqLworI2RlZmluZQlMT0NLX05CCTQJLyogRG9uJ3QgYmxvY2sgd2hlbiBsb2NraW5nLiAgKi8KKworCisvKiBBcHBseSBvciByZW1vdmUgYW4gYWR2aXNvcnkgbG9jaywgYWNjb3JkaW5nIHRvIE9QRVJBVElPTiwKKyAgIG9uIHRoZSBmaWxlIEZEIHJlZmVycyB0by4gICovCitleHRlcm4gaW50IGZsb2NrIChpbnQgX19mZCwgaW50IF9fb3BlcmF0aW9uKSBfX1RIUk9XOworCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvZmlsZS5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9mc3VpZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9mc3VpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlY2IxOTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2ZzdWlkLmgKQEAgLTAsMCArMSwzNiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfRlNVSURfSAorI2RlZmluZSBfU1lTX0ZTVUlEX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBDaGFuZ2UgdWlkIHVzZWQgZm9yIGZpbGUgYWNjZXNzIGNvbnRyb2wgdG8gVUlELCB3aXRob3V0IGFmZmVjdGluZworICAgb3RoZXIgcHJpdmlsZWdlcyAoc3VjaCBhcyB3aG8gY2FuIHNlbmQgc2lnbmFscyBhdCB0aGUgcHJvY2VzcykuICAqLworZXh0ZXJuIGludCBzZXRmc3VpZCAoX191aWRfdCBfX3VpZCkgX19USFJPVzsKKworLyogRGl0dG8gZm9yIGdyb3VwIGlkLiAqLworZXh0ZXJuIGludCBzZXRmc2dpZCAoX19naWRfdCBfX2dpZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGZzdWlkLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZ21vbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9nbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAyZjgzMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZ21vbi5oCkBAIC0wLDAgKzEsMjAxIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylnbW9uLmgJOC4yIChCZXJrZWxleSkgMS80Lzk0CisgKi8KKworI2lmbmRlZglfU1lTX0dNT05fSAorI2RlZmluZQlfU1lTX0dNT05fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qCisgKiBTZWUgZ21vbl9vdXQuaCBmb3IgZ21vbi5vdXQgZm9ybWF0LgorICovCisKKy8qIHN0cnVjdHVyZSBlbWl0dGVkIGJ5ICJnY2MgLWEiLiAgVGhpcyBtdXN0IG1hdGNoIHN0cnVjdCBiYiBpbgorICAgZ2NjL2xpYmdjYzIuYy4gIEl0IGlzIE9LIGZvciBnY2MgdG8gZGVjbGFyZSBhIGxvbmdlciBzdHJ1Y3R1cmUgYXMKKyAgIGxvbmcgYXMgdGhlIG1lbWJlcnMgYmVsb3cgYXJlIHByZXNlbnQuICAqLworc3RydWN0IF9fYmIKK3sKKyAgbG9uZwkJCXplcm9fd29yZDsKKyAgY29uc3QgY2hhcgkJKmZpbGVuYW1lOworICBsb25nCQkJKmNvdW50czsKKyAgbG9uZwkJCW5jb3VudHM7CisgIHN0cnVjdCBfX2JiCQkqbmV4dDsKKyAgY29uc3QgdW5zaWduZWQgbG9uZwkqYWRkcmVzc2VzOworfTsKKworZXh0ZXJuIHN0cnVjdCBfX2JiICpfX2JiX2hlYWQ7CisKKy8qCisgKiBoaXN0b2dyYW0gY291bnRlcnMgYXJlIHVuc2lnbmVkIHNob3J0cyAoYWNjb3JkaW5nIHRvIHRoZSBrZXJuZWwpLgorICovCisjZGVmaW5lCUhJU1RDT1VOVEVSCXVuc2lnbmVkIHNob3J0CisKKy8qCisgKiBmcmFjdGlvbiBvZiB0ZXh0IHNwYWNlIHRvIGFsbG9jYXRlIGZvciBoaXN0b2dyYW0gY291bnRlcnMgaGVyZSwgMS8yCisgKi8KKyNkZWZpbmUJSElTVEZSQUNUSU9OCTIKKworLyoKKyAqIEZyYWN0aW9uIG9mIHRleHQgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIGZyb20gaGFzaCBidWNrZXRzLgorICogVGhlIHZhbHVlIG9mIEhBU0hGUkFDVElPTiBpcyBiYXNlZCBvbiB0aGUgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMKKyAqIG9mIHNlcGFyYXRpb24gYmV0d2VlbiB0d28gc3Vicm91dGluZSBjYWxsIHBvaW50cyBpbiB0aGUgb2JqZWN0IGNvZGUuCisgKiBHaXZlbiBNSU5fU1VCUl9TRVBBUkFUSU9OIGJ5dGVzIG9mIHNlcGFyYXRpb24gdGhlIHZhbHVlIG9mCisgKiBIQVNIRlJBQ1RJT04gaXMgY2FsY3VsYXRlZCBhczoKKyAqCisgKglIQVNIRlJBQ1RJT04gPSBNSU5fU1VCUl9TRVBBUkFUSU9OIC8gKDIgKiBzaXplb2Yoc2hvcnQpIC0gMSk7CisgKgorICogRm9yIGV4YW1wbGUsIG9uIHRoZSBWQVgsIHRoZSBzaG9ydGVzdCB0d28gY2FsbCBzZXF1ZW5jZSBpczoKKyAqCisgKgljYWxscwkkMCwocjApCisgKgljYWxscwkkMCwocjApCisgKgorICogd2hpY2ggaXMgc2VwYXJhdGVkIGJ5IG9ubHkgdGhyZWUgYnl0ZXMsIHRodXMgSEFTSEZSQUNUSU9OIGlzCisgKiBjYWxjdWxhdGVkIGFzOgorICoKKyAqCUhBU0hGUkFDVElPTiA9IDMgLyAoMiAqIDIgLSAxKSA9IDEKKyAqCisgKiBOb3RlIHRoYXQgdGhlIGRpdmlzaW9uIGFib3ZlIHJvdW5kcyBkb3duLCB0aHVzIGlmIE1JTl9TVUJSX0ZSQUNUSU9OCisgKiBpcyBsZXNzIHRoYW4gdGhyZWUsIHRoaXMgYWxnb3JpdGhtIHdpbGwgbm90IHdvcmshCisgKgorICogSW4gcHJhY3RpY2UsIGhvd2V2ZXIsIGNhbGwgaW5zdHJ1Y3Rpb25zIGFyZSByYXJlbHkgYXQgYSBtaW5pbWFsCisgKiBkaXN0YW5jZS4gIEhlbmNlLCB3ZSB3aWxsIGRlZmluZSBIQVNIRlJBQ1RJT04gdG8gYmUgMiBhY3Jvc3MgYWxsCisgKiBhcmNoaXRlY3R1cmVzLiAgVGhpcyBzYXZlcyBhIHJlYXNvbmFibGUgYW1vdW50IG9mIHNwYWNlIGZvcgorICogcHJvZmlsaW5nIGRhdGEgc3RydWN0dXJlcyB3aXRob3V0IChpbiBwcmFjdGljZSkgc2FjcmlmaWNpbmcKKyAqIGFueSBncmFudWxhcml0eS4KKyAqLworI2RlZmluZQlIQVNIRlJBQ1RJT04JMgorCisvKgorICogUGVyY2VudCBvZiB0ZXh0IHNwYWNlIHRvIGFsbG9jYXRlIGZvciB0b3N0cnVjdHMuCisgKiBUaGlzIGlzIGEgaGV1cmlzdGljOyB3ZSB3aWxsIGZhaWwgd2l0aCBhIHdhcm5pbmcgd2hlbiBwcm9maWxpbmcgcHJvZ3JhbXMKKyAqIHdpdGggYSB2ZXJ5IGxhcmdlIG51bWJlciBvZiB2ZXJ5IHNtYWxsIGZ1bmN0aW9ucywgYnV0IHRoYXQncworICogbm9ybWFsbHkgT0suCisgKiAyIGlzIHByb2JhYmx5IHN0aWxsIGEgZ29vZCB2YWx1ZSBmb3Igbm9ybWFsIHByb2dyYW1zLgorICogUHJvZmlsaW5nIGEgdGVzdCBjYXNlIHdpdGggNjQwMDAgc21hbGwgZnVuY3Rpb25zIHdpbGwgd29yayBpZgorICogeW91IHJhaXNlIHRoaXMgdmFsdWUgdG8gMyBhbmQgbGluayBzdGF0aWNhbGx5ICh3aGljaCBibG9hdHMgdGhlCisgKiB0ZXh0IHNpemUsIHRodXMgcmFpc2luZyB0aGUgbnVtYmVyIG9mIGFyY3MgZXhwZWN0ZWQgYnkgdGhlIGhldXJpc3RpYykuCisgKi8KKyNkZWZpbmUgQVJDREVOU0lUWQkzCisKKy8qCisgKiBBbHdheXMgYWxsb2NhdGUgYXQgbGVhc3QgdGhpcyBtYW55IHRvc3RydWN0cy4gIFRoaXMKKyAqIGhpZGVzIHRoZSBpbmFkZXF1YWN5IG9mIHRoZSBBUkNERU5TSVRZIGhldXJpc3RpYywgYXQgbGVhc3QKKyAqIGZvciBzbWFsbCBwcm9ncmFtcy4KKyAqLworI2RlZmluZSBNSU5BUkNTCQk1MAorCisvKgorICogVGhlIHR5cGUgdXNlZCB0byByZXByZXNlbnQgaW5kaWNlcyBpbnRvIGdtb25wYXJhbS50b3NbXS4KKyAqLworI2RlZmluZQlBUkNJTkRFWAl1X2xvbmcKKworLyogCisgKiBNYXhpbXVtIG51bWJlciBvZiBhcmNzIHdlIHdhbnQgdG8gYWxsb3cuCisgKiBVc2VkIHRvIGJlIG1heCByZXByZXNlbnRhYmxlIHZhbHVlIG9mIEFSQ0lOREVYIG1pbnVzIDIsIGJ1dCBub3cgCisgKiB0aGF0IEFSQ0lOREVYIGlzIGEgbG9uZywgdGhhdCdzIHRvbyBsYXJnZTsgd2UgZG9uJ3QgcmVhbGx5IHdhbnQgCisgKiB0byBhbGxvdyBhIDQ4IGdpZ2FieXRlIHRhYmxlLgorICogVGhlIG9sZCB2YWx1ZSBvZiAxPDwxNiB3YXNuJ3QgaGlnaCBlbm91Z2ggaW4gcHJhY3RpY2UgZm9yIGxhcmdlIEMrKworICogcHJvZ3JhbXM7IHdpbGwgMTw8MjAgYmUgYWRlcXVhdGUgZm9yIGxvbmc/ICBGSVhNRQorICovCisjZGVmaW5lIE1BWEFSQ1MJCSgxIDw8IDIwKQorCitzdHJ1Y3QgdG9zdHJ1Y3QgeworCXVfbG9uZwkJc2VsZnBjOworCWxvbmcJCWNvdW50OworCUFSQ0lOREVYCWxpbms7Cit9OworCisvKgorICogYSByYXcgYXJjLCB3aXRoIHBvaW50ZXJzIHRvIHRoZSBjYWxsaW5nIHNpdGUgYW5kCisgKiB0aGUgY2FsbGVkIHNpdGUgYW5kIGEgY291bnQuCisgKi8KK3N0cnVjdCByYXdhcmMgeworCXVfbG9uZwlyYXdfZnJvbXBjOworCXVfbG9uZwlyYXdfc2VsZnBjOworCWxvbmcJcmF3X2NvdW50OworfTsKKworLyoKKyAqIGdlbmVyYWwgcm91bmRpbmcgZnVuY3Rpb25zLgorICovCisjZGVmaW5lIFJPVU5ERE9XTih4LHkpCSgoKHgpLyh5KSkqKHkpKQorI2RlZmluZSBST1VORFVQKHgseSkJKCgoKHgpKyh5KS0xKS8oeSkpKih5KSkKKworLyoKKyAqIFRoZSBwcm9maWxpbmcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBob3VzZWQgaW4gdGhpcyBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBnbW9ucGFyYW0geworCWxvbmcgaW50CXN0YXRlOworCXVfc2hvcnQJCSprY291bnQ7CisJdV9sb25nCQlrY291bnRzaXplOworCUFSQ0lOREVYCSpmcm9tczsKKwl1X2xvbmcJCWZyb21zc2l6ZTsKKwlzdHJ1Y3QgdG9zdHJ1Y3QJKnRvczsKKwl1X2xvbmcJCXRvc3NpemU7CisJbG9uZwkJdG9saW1pdDsKKwl1X2xvbmcJCWxvd3BjOworCXVfbG9uZwkJaGlnaHBjOworCXVfbG9uZwkJdGV4dHNpemU7CisJdV9sb25nCQloYXNoZnJhY3Rpb247CisJbG9uZwkJbG9nX2hhc2hmcmFjdGlvbjsKK307CisKKy8qCisgKiBQb3NzaWJsZSBzdGF0ZXMgb2YgcHJvZmlsaW5nLgorICovCisjZGVmaW5lCUdNT05fUFJPRl9PTgkwCisjZGVmaW5lCUdNT05fUFJPRl9CVVNZCTEKKyNkZWZpbmUJR01PTl9QUk9GX0VSUk9SCTIKKyNkZWZpbmUJR01PTl9QUk9GX09GRgkzCisKKy8qCisgKiBTeXNjdGwgZGVmaW5pdGlvbnMgZm9yIGV4dHJhY3RpbmcgcHJvZmlsaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIGtlcm5lbC4KKyAqLworI2RlZmluZQlHUFJPRl9TVEFURQkwCS8qIGludDogcHJvZmlsaW5nIGVuYWJsaW5nIHZhcmlhYmxlICovCisjZGVmaW5lCUdQUk9GX0NPVU5UCTEJLyogc3RydWN0OiBwcm9maWxlIHRpY2sgY291bnQgYnVmZmVyICovCisjZGVmaW5lCUdQUk9GX0ZST01TCTIJLyogc3RydWN0OiBmcm9tIGxvY2F0aW9uIGhhc2ggYnVja2V0ICovCisjZGVmaW5lCUdQUk9GX1RPUwkzCS8qIHN0cnVjdDogZGVzdGluYXRpb24vY291bnQgc3RydWN0dXJlICovCisjZGVmaW5lCUdQUk9GX0dNT05QQVJBTQk0CS8qIHN0cnVjdDogcHJvZmlsaW5nIHBhcmFtZXRlcnMgKHNlZSBhYm92ZSkgKi8KKworX19CRUdJTl9ERUNMUworCisvKiBTZXQgdXAgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBzdGFydCBwcm9maWxpbmcuICAqLworZXh0ZXJuIHZvaWQgX19tb25zdGFydHVwICh1X2xvbmcgX19sb3dwYywgdV9sb25nIF9faGlnaHBjKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbW9uc3RhcnR1cCAodV9sb25nIF9fbG93cGMsIHVfbG9uZyBfX2hpZ2hwYykgX19USFJPVzsKKworLyogQ2xlYW4gdXAgcHJvZmlsaW5nIGFuZCB3cml0ZSBvdXQgZ21vbi5vdXQuICAqLworZXh0ZXJuIHZvaWQgX21jbGVhbnVwICh2b2lkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL2dtb24uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9nbW9uX291dC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9nbW9uX291dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYTA5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2dtb25fb3V0LmgKQEAgLTAsMCArMSw4MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBEYXZpZCBNb3NiZXJnZXIgPGRhdmlkbUBjcy5hcml6b25hLmVkdT4uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgZ21vbi5vdXQgZmlsZXMuICBJdCBzaG91bGQgaGF2ZQorICAgYXMgZmV3IGV4dGVybmFsIGRlcGVuZGVuY2llcyBhcyBwb3NzaWJsZSBhcyBpdCBpcyBnb2luZyB0byBiZSBpbmNsdWRlZAorICAgaW4gbWFueSBkaWZmZXJlbnQgcHJvZ3JhbXMuICBUaGF0IGlzLCBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mICNpbmNsdWRlJ3MuCisKKyAgIEEgZ21vbi5vdXQgZmlsZSBjb25zaXN0cyBvZiBhIGhlYWRlciAoZGVmaW5lZCBieSBnbW9uX2hkcikgZm9sbG93ZWQgYnkKKyAgIGEgc2VxdWVuY2Ugb2YgcmVjb3Jkcy4gIEVhY2ggcmVjb3JkIHN0YXJ0cyB3aXRoIGEgb25lLWJ5dGUgdGFnCisgICBpZGVudGlmeWluZyB0aGUgdHlwZSBvZiByZWNvcmRzLCBmb2xsb3dlZCBieSByZWNvcmRzIHNwZWNpZmljIGRhdGEuICovCisKKyNpZm5kZWYgX1NZU19HTU9OX09VVF9ICisjZGVmaW5lIF9TWVNfR01PTl9PVVRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lCUdNT05fTUFHSUMJImdtb24iCS8qIG1hZ2ljIGNvb2tpZSAqLworI2RlZmluZSBHTU9OX1ZFUlNJT04JMQkvKiB2ZXJzaW9uIG51bWJlciAqLworCisvKiBGb3IgcHJvZmlsaW5nIHNoYXJlZCBvYmplY3Qgd2UgbmVlZCBhIG5ldyBmb3JtYXQuICAqLworI2RlZmluZSBHTU9OX1NIT0JKX1ZFUlNJT04JMHgxZmZmZgorCitfX0JFR0lOX0RFQ0xTCisKKy8qCisgKiBSYXcgaGVhZGVyIGFzIGl0IGFwcGVhcnMgb24gZmlsZSAod2l0aG91dCBwYWRkaW5nKS4gIFRoaXMgaGVhZGVyCisgKiBhbHdheXMgY29tZXMgZmlyc3QgaW4gZ21vbi5vdXQgYW5kIGlzIHRoZW4gZm9sbG93ZWQgYnkgYSBzZXJpZXMKKyAqIHJlY29yZHMgZGVmaW5lZCBiZWxvdy4KKyAqLworc3RydWN0IGdtb25faGRyCisgIHsKKyAgICBjaGFyIGNvb2tpZVs0XTsKKyAgICBjaGFyIHZlcnNpb25bNF07CisgICAgY2hhciBzcGFyZVszICogNF07CisgIH07CisKKy8qIHR5cGVzIG9mIHJlY29yZHMgaW4gdGhpcyBmaWxlOiAqLwordHlwZWRlZiBlbnVtCisgIHsKKyAgICBHTU9OX1RBR19USU1FX0hJU1QgPSAwLAorICAgIEdNT05fVEFHX0NHX0FSQyA9IDEsCisgICAgR01PTl9UQUdfQkJfQ09VTlQgPSAyCisgIH0gR01PTl9SZWNvcmRfVGFnOworCitzdHJ1Y3QgZ21vbl9oaXN0X2hkcgorICB7CisgICAgY2hhciBsb3dfcGNbc2l6ZW9mIChjaGFyICopXTsJLyogYmFzZSBwYyBhZGRyZXNzIG9mIHNhbXBsZSBidWZmZXIgKi8KKyAgICBjaGFyIGhpZ2hfcGNbc2l6ZW9mIChjaGFyICopXTsJLyogbWF4IHBjIGFkZHJlc3Mgb2Ygc2FtcGxlZCBidWZmZXIgKi8KKyAgICBjaGFyIGhpc3Rfc2l6ZVs0XTsJCQkvKiBzaXplIG9mIHNhbXBsZSBidWZmZXIgKi8KKyAgICBjaGFyIHByb2ZfcmF0ZVs0XTsJCQkvKiBwcm9maWxpbmcgY2xvY2sgcmF0ZSAqLworICAgIGNoYXIgZGltZW5bMTVdOwkJCS8qIHBoeXMuIGRpbS4sIHVzdWFsbHkgInNlY29uZHMiICovCisgICAgY2hhciBkaW1lbl9hYmJyZXY7CQkJLyogdXN1YWxseSAncycgZm9yICJzZWNvbmRzIiAqLworICB9OworCitzdHJ1Y3QgZ21vbl9jZ19hcmNfcmVjb3JkCisgIHsKKyAgICBjaGFyIGZyb21fcGNbc2l6ZW9mIChjaGFyICopXTsJLyogYWRkcmVzcyB3aXRoaW4gY2FsbGVyJ3MgYm9keSAqLworICAgIGNoYXIgc2VsZl9wY1tzaXplb2YgKGNoYXIgKildOwkvKiBhZGRyZXNzIHdpdGhpbiBjYWxsZWUncyBib2R5ICovCisgICAgY2hhciBjb3VudFs0XTsJCQkvKiBudW1iZXIgb2YgYXJjIHRyYXZlcnNhbHMgKi8KKyAgfTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9nbW9uX291dC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2lub3RpZnkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvaW5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTk5OWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2lub3RpZnkuaApAQCAtMCwwICsxLDEwNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfSU5PVElGWV9ICisjZGVmaW5lCV9TWVNfSU5PVElGWV9ICTEKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisKKy8qIEZsYWdzIGZvciB0aGUgcGFyYW1ldGVyIG9mIGlub3RpZnlfaW5pdDEuICAqLworZW51bQorICB7CisgICAgSU5fQ0xPRVhFQyA9IDAyMDAwMDAwLAorI2RlZmluZSBJTl9DTE9FWEVDIElOX0NMT0VYRUMKKyAgICBJTl9OT05CTE9DSyA9IDA0MDAwCisjZGVmaW5lIElOX05PTkJMT0NLIElOX05PTkJMT0NLCisgIH07CisKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYW4gaW5vdGlmeSBldmVudC4gICovCitzdHJ1Y3QgaW5vdGlmeV9ldmVudAoreworICBpbnQgd2Q7CQkvKiBXYXRjaCBkZXNjcmlwdG9yLiAgKi8KKyAgdWludDMyX3QgbWFzazsJLyogV2F0Y2ggbWFzay4gICovCisgIHVpbnQzMl90IGNvb2tpZTsJLyogQ29va2llIHRvIHN5bmNocm9uaXplIHR3byBldmVudHMuICAqLworICB1aW50MzJfdCBsZW47CQkvKiBMZW5ndGggKGluY2x1ZGluZyBOVUxzKSBvZiBuYW1lLiAgKi8KKyAgY2hhciBuYW1lIF9fZmxleGFycjsJLyogTmFtZS4gICovCit9OworCisKKy8qIFN1cHBvcnRlZCBldmVudHMgc3VpdGFibGUgZm9yIE1BU0sgcGFyYW1ldGVyIG9mIElOT1RJRllfQUREX1dBVENILiAgKi8KKyNkZWZpbmUgSU5fQUNDRVNTCSAweDAwMDAwMDAxCS8qIEZpbGUgd2FzIGFjY2Vzc2VkLiAgKi8KKyNkZWZpbmUgSU5fTU9ESUZZCSAweDAwMDAwMDAyCS8qIEZpbGUgd2FzIG1vZGlmaWVkLiAgKi8KKyNkZWZpbmUgSU5fQVRUUklCCSAweDAwMDAwMDA0CS8qIE1ldGFkYXRhIGNoYW5nZWQuICAqLworI2RlZmluZSBJTl9DTE9TRV9XUklURQkgMHgwMDAwMDAwOAkvKiBXcml0dGFibGUgZmlsZSB3YXMgY2xvc2VkLiAgKi8KKyNkZWZpbmUgSU5fQ0xPU0VfTk9XUklURSAweDAwMDAwMDEwCS8qIFVud3JpdHRhYmxlIGZpbGUgY2xvc2VkLiAgKi8KKyNkZWZpbmUgSU5fQ0xPU0UJIChJTl9DTE9TRV9XUklURSB8IElOX0NMT1NFX05PV1JJVEUpIC8qIENsb3NlLiAgKi8KKyNkZWZpbmUgSU5fT1BFTgkJIDB4MDAwMDAwMjAJLyogRmlsZSB3YXMgb3BlbmVkLiAgKi8KKyNkZWZpbmUgSU5fTU9WRURfRlJPTQkgMHgwMDAwMDA0MAkvKiBGaWxlIHdhcyBtb3ZlZCBmcm9tIFguICAqLworI2RlZmluZSBJTl9NT1ZFRF9UTyAgICAgIDB4MDAwMDAwODAJLyogRmlsZSB3YXMgbW92ZWQgdG8gWS4gICovCisjZGVmaW5lIElOX01PVkUJCSAoSU5fTU9WRURfRlJPTSB8IElOX01PVkVEX1RPKSAvKiBNb3Zlcy4gICovCisjZGVmaW5lIElOX0NSRUFURQkgMHgwMDAwMDEwMAkvKiBTdWJmaWxlIHdhcyBjcmVhdGVkLiAgKi8KKyNkZWZpbmUgSU5fREVMRVRFCSAweDAwMDAwMjAwCS8qIFN1YmZpbGUgd2FzIGRlbGV0ZWQuICAqLworI2RlZmluZSBJTl9ERUxFVEVfU0VMRgkgMHgwMDAwMDQwMAkvKiBTZWxmIHdhcyBkZWxldGVkLiAgKi8KKyNkZWZpbmUgSU5fTU9WRV9TRUxGCSAweDAwMDAwODAwCS8qIFNlbGYgd2FzIG1vdmVkLiAgKi8KKworLyogRXZlbnRzIHNlbnQgYnkgdGhlIGtlcm5lbC4gICovCisjZGVmaW5lIElOX1VOTU9VTlQJIDB4MDAwMDIwMDAJLyogQmFja2luZyBmcyB3YXMgdW5tb3VudGVkLiAgKi8KKyNkZWZpbmUgSU5fUV9PVkVSRkxPVwkgMHgwMDAwNDAwMAkvKiBFdmVudCBxdWV1ZWQgb3ZlcmZsb3dlZC4gICovCisjZGVmaW5lIElOX0lHTk9SRUQJIDB4MDAwMDgwMDAJLyogRmlsZSB3YXMgaWdub3JlZC4gICovCisKKy8qIEhlbHBlciBldmVudHMuICAqLworI2RlZmluZSBJTl9DTE9TRQkgKElOX0NMT1NFX1dSSVRFIHwgSU5fQ0xPU0VfTk9XUklURSkJLyogQ2xvc2UuICAqLworI2RlZmluZSBJTl9NT1ZFCQkgKElOX01PVkVEX0ZST00gfCBJTl9NT1ZFRF9UTykJCS8qIE1vdmVzLiAgKi8KKworLyogU3BlY2lhbCBmbGFncy4gICovCisjZGVmaW5lIElOX09OTFlESVIJIDB4MDEwMDAwMDAJLyogT25seSB3YXRjaCB0aGUgcGF0aCBpZiBpdCBpcyBhCisJCQkJCSAgIGRpcmVjdG9yeS4gICovCisjZGVmaW5lIElOX0RPTlRfRk9MTE9XCSAweDAyMDAwMDAwCS8qIERvIG5vdCBmb2xsb3cgYSBzeW0gbGluay4gICovCisjZGVmaW5lIElOX0VYQ0xfVU5MSU5LCSAweDA0MDAwMDAwCS8qIEV4Y2x1ZGUgZXZlbnRzIG9uIHVubGlua2VkCisJCQkJCSAgIG9iamVjdHMuICAqLworI2RlZmluZSBJTl9NQVNLX0FERAkgMHgyMDAwMDAwMAkvKiBBZGQgdG8gdGhlIG1hc2sgb2YgYW4gYWxyZWFkeQorCQkJCQkgICBleGlzdGluZyB3YXRjaC4gICovCisjZGVmaW5lIElOX0lTRElSCSAweDQwMDAwMDAwCS8qIEV2ZW50IG9jY3VycmVkIGFnYWluc3QgZGlyLiAgKi8KKyNkZWZpbmUgSU5fT05FU0hPVAkgMHg4MDAwMDAwMAkvKiBPbmx5IHNlbmQgZXZlbnQgb25jZS4gICovCisKKy8qIEFsbCBldmVudHMgd2hpY2ggYSBwcm9ncmFtIGNhbiB3YWl0IG9uLiAgKi8KKyNkZWZpbmUgSU5fQUxMX0VWRU5UUwkgKElOX0FDQ0VTUyB8IElOX01PRElGWSB8IElOX0FUVFJJQiB8IElOX0NMT1NFX1dSSVRFICBcCisJCQkgIHwgSU5fQ0xPU0VfTk9XUklURSB8IElOX09QRU4gfCBJTl9NT1ZFRF9GUk9NCSAgICAgIFwKKwkJCSAgfCBJTl9NT1ZFRF9UTyB8IElOX0NSRUFURSB8IElOX0RFTEVURQkJICAgICAgXAorCQkJICB8IElOX0RFTEVURV9TRUxGIHwgSU5fTU9WRV9TRUxGKQorCisKK19fQkVHSU5fREVDTFMKKworLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGlub3RpZnkgaW5zdGFuY2UuICAqLworZXh0ZXJuIGludCBpbm90aWZ5X2luaXQgKHZvaWQpIF9fVEhST1c7CisKKy8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBpbm90aWZ5IGluc3RhbmNlLiAgKi8KK2V4dGVybiBpbnQgaW5vdGlmeV9pbml0MSAoaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIEFkZCB3YXRjaCBvZiBvYmplY3QgTkFNRSB0byBpbm90aWZ5IGluc3RhbmNlIEZELiAgTm90aWZ5IGFib3V0CisgICBldmVudHMgc3BlY2lmaWVkIGJ5IE1BU0suICAqLworZXh0ZXJuIGludCBpbm90aWZ5X2FkZF93YXRjaCAoaW50IF9fZmQsIGNvbnN0IGNoYXIgKl9fbmFtZSwgdWludDMyX3QgX19tYXNrKQorICBfX1RIUk9XOworCisvKiBSZW1vdmUgdGhlIHdhdGNoIHNwZWNpZmllZCBieSBXRCBmcm9tIHRoZSBpbm90aWZ5IGluc3RhbmNlIEZELiAgKi8KK2V4dGVybiBpbnQgaW5vdGlmeV9ybV93YXRjaCAoaW50IF9fZmQsIGludCBfX3dkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL2lub3RpZnkuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9pby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODUzN2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2lvLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMjAwMCwgMjAwMiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0lPX0gKKyNkZWZpbmUJX1NZU19JT19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogSWYgVFVSTl9PTiBpcyBUUlVFLCByZXF1ZXN0IGZvciBwZXJtaXNzaW9uIHRvIGRvIGRpcmVjdCBpL28gb24gdGhlCisgICBwb3J0IG51bWJlcnMgaW4gdGhlIHJhbmdlIFtGUk9NLEZST00rTlVNLTFdLiAgT3RoZXJ3aXNlLCB0dXJuIEkvTworICAgcGVybWlzc2lvbiBvZmYgZm9yIHRoYXQgcmFuZ2UuICBUaGlzIGNhbGwgcmVxdWlyZXMgcm9vdCBwcml2aWxlZ2VzLgorCisgICBQb3J0YWJpbGl0eSBub3RlOiBub3QgYWxsIExpbnV4IHBsYXRmb3JtcyBzdXBwb3J0IHRoaXMgY2FsbC4gIE1vc3QKKyAgIHBsYXRmb3JtcyBiYXNlZCBvbiB0aGUgUEMgSS9PIGFyY2hpdGVjdHVyZSBwcm9iYWJseSB3aWxsLCBob3dldmVyLgorICAgRS5nLiwgTGludXgvQWxwaGEgZm9yIEFscGhhIFBDcyBzdXBwb3J0cyB0aGlzLiAgKi8KK2V4dGVybiBpbnQgaW9wZXJtICh1bnNpZ25lZCBsb25nIGludCBfX2Zyb20sIHVuc2lnbmVkIGxvbmcgaW50IF9fbnVtLAorICAgICAgICAgICAgICAgICAgIGludCBfX3R1cm5fb24pIF9fVEhST1c7CisKKy8qIFNldCB0aGUgSS9PIHByaXZpbGVnZSBsZXZlbCB0byBMRVZFTC4gIElmIExFVkVMPjMsIHBlcm1pc3Npb24gdG8KKyAgIGFjY2VzcyBhbnkgSS9PIHBvcnQgaXMgZ3JhbnRlZC4gIFRoaXMgY2FsbCByZXF1aXJlcyByb290CisgICBwcml2aWxlZ2VzLiAqLworZXh0ZXJuIGludCBpb3BsIChpbnQgX19sZXZlbCkgX19USFJPVzsKKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgY2hhcgoraW5iICh1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICB1bnNpZ25lZCBjaGFyIF92OworCisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiaW5iICV3MSwlMCI6Ij1hIiAoX3YpOiJOZCIgKF9fcG9ydCkpOworICByZXR1cm4gX3Y7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBjaGFyCitpbmJfcCAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgdW5zaWduZWQgY2hhciBfdjsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImluYiAldzEsJTBcbm91dGIgJSVhbCwkMHg4MCI6Ij1hIiAoX3YpOiJOZCIgKF9fcG9ydCkpOworICByZXR1cm4gX3Y7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQKK2ludyAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgdW5zaWduZWQgc2hvcnQgX3Y7CisKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpbncgJXcxLCUwIjoiPWEiIChfdik6Ik5kIiAoX19wb3J0KSk7CisgIHJldHVybiBfdjsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIHNob3J0IGludAoraW53X3AgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIHVuc2lnbmVkIHNob3J0IGludCBfdjsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImludyAldzEsJTBcbm91dGIgJSVhbCwkMHg4MCI6Ij1hIiAoX3YpOiJOZCIgKF9fcG9ydCkpOworICByZXR1cm4gX3Y7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2lubCAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgdW5zaWduZWQgaW50IF92OworCisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiaW5sICV3MSwlMCI6Ij1hIiAoX3YpOiJOZCIgKF9fcG9ydCkpOworICByZXR1cm4gX3Y7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2lubF9wICh1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICB1bnNpZ25lZCBpbnQgX3Y7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiaW5sICV3MSwlMFxub3V0YiAlJWFsLCQweDgwIjoiPWEiIChfdik6Ik5kIiAoX19wb3J0KSk7CisgIHJldHVybiBfdjsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dGIgKHVuc2lnbmVkIGNoYXIgX192YWx1ZSwgdW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJvdXRiICViMCwldzEiOiA6ImEiIChfX3ZhbHVlKSwgIk5kIiAoX19wb3J0KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitvdXRiX3AgKHVuc2lnbmVkIGNoYXIgX192YWx1ZSwgdW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJvdXRiICViMCwldzFcbm91dGIgJSVhbCwkMHg4MCI6IDoiYSIgKF9fdmFsdWUpLAorCQkJIk5kIiAoX19wb3J0KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitvdXR3ICh1bnNpZ25lZCBzaG9ydCBpbnQgX192YWx1ZSwgdW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJvdXR3ICV3MCwldzEiOiA6ImEiIChfX3ZhbHVlKSwgIk5kIiAoX19wb3J0KSk7CisKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dHdfcCAodW5zaWduZWQgc2hvcnQgaW50IF9fdmFsdWUsIHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgib3V0dyAldzAsJXcxXG5vdXRiICUlYWwsJDB4ODAiOiA6ImEiIChfX3ZhbHVlKSwKKwkJCSJOZCIgKF9fcG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0bCAodW5zaWduZWQgaW50IF9fdmFsdWUsIHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgib3V0bCAlMCwldzEiOiA6ImEiIChfX3ZhbHVlKSwgIk5kIiAoX19wb3J0KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitvdXRsX3AgKHVuc2lnbmVkIGludCBfX3ZhbHVlLCB1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm91dGwgJTAsJXcxXG5vdXRiICUlYWwsJDB4ODAiOiA6ImEiIChfX3ZhbHVlKSwKKwkJCSJOZCIgKF9fcG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAoraW5zYiAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBpbnQgX19jb3VudCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBpbnNiIjoiPUQiIChhZGRyKSwgIj1jIiAoX19jb3VudCkKKwkJCToiZCIgKF9fcG9ydCksICIwIiAoYWRkciksICIxIiAoX19jb3VudCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAoraW5zdyAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBpbnQgX19jb3VudCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBpbnN3IjoiPUQiIChhZGRyKSwgIj1jIiAoX19jb3VudCkKKwkJCToiZCIgKF9fcG9ydCksICIwIiAoYWRkciksICIxIiAoX19jb3VudCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAoraW5zbCAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBpbnQgX19jb3VudCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBpbnNsIjoiPUQiIChhZGRyKSwgIj1jIiAoX19jb3VudCkKKwkJCToiZCIgKF9fcG9ydCksICIwIiAoYWRkciksICIxIiAoX19jb3VudCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0c2IgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgaW50IF9fY291bnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkIDsgcmVwIDsgb3V0c2IiOiI9UyIgKGFkZHIpLCAiPWMiIChfX2NvdW50KQorCQkJOiJkIiAoX19wb3J0KSwgIjAiIChhZGRyKSwgIjEiIChfX2NvdW50KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitvdXRzdyAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBpbnQgX19jb3VudCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBvdXRzdyI6Ij1TIiAoYWRkciksICI9YyIgKF9fY291bnQpCisgIAkJCToiZCIgKF9fcG9ydCksICIwIiAoYWRkciksICIxIiAoX19jb3VudCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0c2wgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgaW50IF9fY291bnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkIDsgcmVwIDsgb3V0c2wiOiI9UyIgKGFkZHIpLCAiPWMiIChfX2NvdW50KQorCQkJOiJkIiAoX19wb3J0KSwgIjAiIChhZGRyKSwgIjEiIChfX2NvdW50KSk7Cit9CisKKyNlbmRpZgkvKiBHTlUgQyAqLworCitfX0VORF9ERUNMUworI2VuZGlmIC8qIF9TWVNfSU9fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9pb2N0bC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOGEwZjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2lvY3RsLmgKQEAgLTAsMCArMSw0NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NiwgOTgsIDk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfSU9DVExfSAorI2RlZmluZQlfU1lTX0lPQ1RMX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBHZXQgdGhlIGxpc3Qgb2YgYGlvY3RsJyByZXF1ZXN0cyBhbmQgcmVsYXRlZCBjb25zdGFudHMuICAqLworI2luY2x1ZGUgPGJpdHMvaW9jdGxzLmg+CisKKy8qIERlZmluZSBzb21lIHR5cGVzIHVzZWQgYnkgYGlvY3RsJyByZXF1ZXN0cy4gICovCisjaW5jbHVkZSA8Yml0cy9pb2N0bC10eXBlcy5oPgorCisvKiBPbiBhIFVuaXggc3lzdGVtLCB0aGUgc3lzdGVtIDxzeXMvaW9jdGwuaD4gcHJvYmFibHkgZGVmaW5lcyBzb21lIG9mCisgICB0aGUgc3ltYm9scyB3ZSBkZWZpbmUgaW4gPHN5cy90dHlkZWZhdWx0cy5oPiAodXN1YWxseSB3aXRoIHRoZSBzYW1lCisgICB2YWx1ZXMpLiAgVGhlIGNvZGUgdG8gZ2VuZXJhdGUgPGJpdHMvaW9jdGxzLmg+IGhhcyBvbWl0dGVkIHRoZXNlCisgICBzeW1ib2xzIHRvIGF2b2lkIHRoZSBjb25mbGljdCwgYnV0IGEgVW5peCBwcm9ncmFtIGV4cGVjdHMgPHN5cy9pb2N0bC5oPgorICAgdG8gZGVmaW5lIHRoZW0sIHNvIHdlIG11c3QgaW5jbHVkZSA8c3lzL3R0eWRlZmF1bHRzLmg+IGhlcmUuICAqLworI2luY2x1ZGUgPHN5cy90dHlkZWZhdWx0cy5oPgorCisvKiBQZXJmb3JtIHRoZSBJL08gY29udHJvbCBvcGVyYXRpb24gc3BlY2lmaWVkIGJ5IFJFUVVFU1Qgb24gRkQuCisgICBPbmUgYXJndW1lbnQgbWF5IGZvbGxvdzsgaXRzIHByZXNlbmNlIGFuZCB0eXBlIGRlcGVuZCBvbiBSRVFVRVNULgorICAgUmV0dXJuIHZhbHVlIGRlcGVuZHMgb24gUkVRVUVTVC4gIFVzdWFsbHkgLTEgaW5kaWNhdGVzIGVycm9yLiAgKi8KK2V4dGVybiBpbnQgaW9jdGwgKGludCBfX2ZkLCB1bnNpZ25lZCBsb25nIGludCBfX3JlcXVlc3QsIC4uLikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9pb2N0bC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2lwYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9pcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThjMDllCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9pcGMuaApAQCAtMCwwICsxLDU5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUsMTk5NiwxOTk3LDE5OTksMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0lQQ19ICisjZGVmaW5lIF9TWVNfSVBDX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2lmICFkZWZpbmVkIF9fVVNFX1NWSUQgJiYgIWRlZmluZWQgX19VU0VfWE9QRU4gJiYgX19HTlVDX18gPj0gMgorIyB3YXJuaW5nICJGaWxlcyB1c2luZyB0aGlzIGhlYWRlciBtdXN0IGJlIGNvbXBpbGVkIHdpdGggX1NWSURfU09VUkNFIG9yIF9YT1BFTl9TT1VSQ0UiCisjZW5kaWYKKworLyogR2V0IHN5c3RlbSBkZXBlbmRlbnQgZGVmaW5pdGlvbiBvZiBgc3RydWN0IGlwY19wZXJtJyBhbmQgbW9yZS4gICovCisjaW5jbHVkZSA8Yml0cy9pcGN0eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMvaXBjLmg+CisKKyNpZm5kZWYgX191aWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fdWlkX3QgdWlkX3Q7CisjIGRlZmluZSBfX3VpZF90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fZ2lkX3RfZGVmaW5lZAordHlwZWRlZiBfX2dpZF90IGdpZF90OworIyBkZWZpbmUgX19naWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX21vZGVfdF9kZWZpbmVkCit0eXBlZGVmIF9fbW9kZV90IG1vZGVfdDsKKyMgZGVmaW5lIF9fbW9kZV90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fa2V5X3RfZGVmaW5lZAordHlwZWRlZiBfX2tleV90IGtleV90OworIyBkZWZpbmUgX19rZXlfdF9kZWZpbmVkCisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisvKiBHZW5lcmF0ZXMga2V5IGZvciBTeXN0ZW0gViBzdHlsZSBJUEMuICAqLworZXh0ZXJuIGtleV90IGZ0b2sgKF9fY29uc3QgY2hhciAqX19wYXRobmFtZSwgaW50IF9fcHJval9pZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9pcGMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9rZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9rZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTljMDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2tkLmgKQEAgLTAsMCArMSwzNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfS0RfSAorI2RlZmluZSBfU1lTX0tEX0gJMQorCisvKiBNYWtlIHN1cmUgdGhlIDxsaW51eC90eXBlcy5oPiBoZWFkZXIgaXMgbm90IGxvYWRlZC4gICovCisjaWZuZGVmIF9MSU5VWF9UWVBFU19ICisjIGRlZmluZSBfTElOVVhfVFlQRVNfSAkJMQorIyBkZWZpbmUgX191bmRlZl9MSU5VWF9UWVBFU19ICisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2tkLmg+CisKKyNpZmRlZiBfX3VuZGVmX0xJTlVYX1RZUEVTX0gKKyMgdW5kZWYgX0xJTlVYX1RZUEVTX0gKKyMgdW5kZWYgX191bmRlZl9MSU5VWF9UWVBFU19ICisjZW5kaWYKKworI2VuZGlmCS8qIHN5cy9rZC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2tkYWVtb24uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMva2RhZW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDkxZjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2tkYWVtb24uaApAQCAtMCwwICsxLDMzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIEludGVyZmFjZXMgdG8gY29udHJvbCB0aGUgdmFyaW91cyBrZXJuZWwgZGFlbW9ucy4gICovCisKKyNpZm5kZWYgX1NZU19LREFFTU9OX0gKKworI2RlZmluZSBfU1lTX0tEQUVNT05fSAkxCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBTdGFydCwgZmx1c2gsIG9yIHR1bmUgdGhlIGtlcm5lbCdzIGJ1ZmZlciBmbHVzaGluZyBkYWVtb24uICAqLworZXh0ZXJuIGludCBiZGZsdXNoIChpbnQgX19mdW5jLCBsb25nIGludCBfX2RhdGEpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfU1lTX0tEQUVNT05fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9rbG9nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2tsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWY1ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9rbG9nLmgKQEAgLTAsMCArMSwzNCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfS0xPR19ICisKKyNkZWZpbmUJX1NZU19LTE9HX0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogQ29udHJvbCB0aGUga2VybmVsJ3MgbG9nZ2luZyBmYWNpbGl0eS4gIFRoaXMgY29ycmVzcG9uZHMgZXhhY3RseSB0bworICAgdGhlIGtlcm5lbCdzIHN5c2xvZyBzeXN0ZW0gY2FsbCwgYnV0IHRoYXQgbmFtZSBpcyBlYXNpbHkgY29uZnVzZWQKKyAgIHdpdGggdGhlIHVzZXItbGV2ZWwgc3lzbG9nIGZhY2lsaXR5LCB3aGljaCBpcyBzb21ldGhpbmcgY29tcGxldGVseQorICAgZGlmZmVyZW50LiAgKi8KK2V4dGVybiBpbnQga2xvZ2N0bCAoaW50IF9fdHlwZSwgY2hhciAqX19idWZwLCBpbnQgX19sZW4pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfU1lTX0tMT0dfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9tbWFuLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q4YTNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9tbWFuLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qIERlZmluaXRpb25zIGZvciBCU0Qtc3R5bGUgbWVtb3J5IG1hbmFnZW1lbnQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTQtMjAwMCwgMjAwMywgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX01NQU5fSAorI2RlZmluZQlfU1lTX01NQU5fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZuZGVmIF9fb2ZmX3RfZGVmaW5lZAorIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAordHlwZWRlZiBfX29mZl90IG9mZl90OworIyBlbHNlCit0eXBlZGVmIF9fb2ZmNjRfdCBvZmZfdDsKKyMgZW5kaWYKKyMgZGVmaW5lIF9fb2ZmX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19tb2RlX3RfZGVmaW5lZAordHlwZWRlZiBfX21vZGVfdCBtb2RlX3Q7CisjIGRlZmluZSBfX21vZGVfdF9kZWZpbmVkCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvbW1hbi5oPgorCisvKiBSZXR1cm4gdmFsdWUgb2YgYG1tYXAnIGluIGNhc2Ugb2YgYW4gZXJyb3IuICAqLworI2RlZmluZSBNQVBfRkFJTEVECSgodm9pZCAqKSAtMSkKKworX19CRUdJTl9ERUNMUworLyogTWFwIGFkZHJlc3NlcyBzdGFydGluZyBuZWFyIEFERFIgYW5kIGV4dGVuZGluZyBmb3IgTEVOIGJ5dGVzLiAgZnJvbQorICAgT0ZGU0VUIGludG8gdGhlIGZpbGUgRkQgZGVzY3JpYmVzIGFjY29yZGluZyB0byBQUk9UIGFuZCBGTEFHUy4gIElmIEFERFIKKyAgIGlzIG5vbnplcm8sIGl0IGlzIHRoZSBkZXNpcmVkIG1hcHBpbmcgYWRkcmVzcy4gIElmIHRoZSBNQVBfRklYRUQgYml0IGlzCisgICBzZXQgaW4gRkxBR1MsIHRoZSBtYXBwaW5nIHdpbGwgYmUgYXQgQUREUiBleGFjdGx5ICh3aGljaCBtdXN0IGJlCisgICBwYWdlLWFsaWduZWQpOyBvdGhlcndpc2UgdGhlIHN5c3RlbSBjaG9vc2VzIGEgY29udmVuaWVudCBuZWFyYnkgYWRkcmVzcy4KKyAgIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGFjdHVhbCBtYXBwaW5nIGFkZHJlc3MgY2hvc2VuIG9yIE1BUF9GQUlMRUQKKyAgIGZvciBlcnJvcnMgKGluIHdoaWNoIGNhc2UgYGVycm5vJyBpcyBzZXQpLiAgQSBzdWNjZXNzZnVsIGBtbWFwJyBjYWxsCisgICBkZWFsbG9jYXRlcyBhbnkgcHJldmlvdXMgbWFwcGluZyBmb3IgdGhlIGFmZmVjdGVkIHJlZ2lvbi4gICovCisKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIHZvaWQgKm1tYXAgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuLCBpbnQgX19wcm90LAorCQkgICBpbnQgX19mbGFncywgaW50IF9fZmQsIF9fb2ZmX3QgX19vZmZzZXQpIF9fVEhST1c7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIHZvaWQgKiBfX1JFRElSRUNUX05USCAobW1hcCwKKwkJCSAgICAgICh2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbiwgaW50IF9fcHJvdCwKKwkJCSAgICAgICBpbnQgX19mbGFncywgaW50IF9fZmQsIF9fb2ZmNjRfdCBfX29mZnNldCksCisJCQkgICAgICBtbWFwNjQpOworIyBlbHNlCisjICBkZWZpbmUgbW1hcCBtbWFwNjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gdm9pZCAqbW1hcDY0ICh2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbiwgaW50IF9fcHJvdCwKKwkJICAgICBpbnQgX19mbGFncywgaW50IF9fZmQsIF9fb2ZmNjRfdCBfX29mZnNldCkgX19USFJPVzsKKyNlbmRpZgorCisvKiBEZWFsbG9jYXRlIGFueSBtYXBwaW5nIGZvciB0aGUgcmVnaW9uIHN0YXJ0aW5nIGF0IEFERFIgYW5kIGV4dGVuZGluZyBMRU4KKyAgIGJ5dGVzLiAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIC0xIGZvciBlcnJvcnMgKGFuZCBzZXRzIGVycm5vKS4gICovCitleHRlcm4gaW50IG11bm1hcCAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4pIF9fVEhST1c7CisKKy8qIENoYW5nZSB0aGUgbWVtb3J5IHByb3RlY3Rpb24gb2YgdGhlIHJlZ2lvbiBzdGFydGluZyBhdCBBRERSIGFuZAorICAgZXh0ZW5kaW5nIExFTiBieXRlcyB0byBQUk9ULiAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIC0xIGZvciBlcnJvcnMKKyAgIChhbmQgc2V0cyBlcnJubykuICAqLworZXh0ZXJuIGludCBtcHJvdGVjdCAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4sIGludCBfX3Byb3QpIF9fVEhST1c7CisKKy8qIFN5bmNocm9uaXplIHRoZSByZWdpb24gc3RhcnRpbmcgYXQgQUREUiBhbmQgZXh0ZW5kaW5nIExFTiBieXRlcyB3aXRoIHRoZQorICAgZmlsZSBpdCBtYXBzLiAgRmlsZXN5c3RlbSBvcGVyYXRpb25zIG9uIGEgZmlsZSBiZWluZyBtYXBwZWQgYXJlCisgICB1bnByZWRpY3RhYmxlIGJlZm9yZSB0aGlzIGlzIGRvbmUuICBGbGFncyBhcmUgZnJvbSB0aGUgTVNfKiBzZXQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBtc3luYyAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4sIGludCBfX2ZsYWdzKTsKKworI2lmZGVmIF9fVVNFX0JTRAorLyogQWR2aXNlIHRoZSBzeXN0ZW0gYWJvdXQgcGFydGljdWxhciB1c2FnZSBwYXR0ZXJucyB0aGUgcHJvZ3JhbSBmb2xsb3dzCisgICBmb3IgdGhlIHJlZ2lvbiBzdGFydGluZyBhdCBBRERSIGFuZCBleHRlbmRpbmcgTEVOIGJ5dGVzLiAgKi8KK2V4dGVybiBpbnQgbWFkdmlzZSAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4sIGludCBfX2FkdmljZSkgX19USFJPVzsKKyNlbmRpZgorI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIFRoaXMgaXMgdGhlIFBPU0lYIG5hbWUgZm9yIHRoaXMgZnVuY3Rpb24uICAqLworZXh0ZXJuIGludCBwb3NpeF9tYWR2aXNlICh2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbiwgaW50IF9fYWR2aWNlKSBfX1RIUk9XOworI2VuZGlmCisKKy8qIEd1YXJhbnRlZSBhbGwgd2hvbGUgcGFnZXMgbWFwcGVkIGJ5IHRoZSByYW5nZSBbQUREUixBRERSK0xFTikgdG8KKyAgIGJlIG1lbW9yeSByZXNpZGVudC4gICovCitleHRlcm4gaW50IG1sb2NrIChfX2NvbnN0IHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuKSBfX1RIUk9XOworCisvKiBVbmxvY2sgd2hvbGUgcGFnZXMgcHJldmlvdXNseSBtYXBwZWQgYnkgdGhlIHJhbmdlIFtBRERSLEFERFIrTEVOKS4gICovCitleHRlcm4gaW50IG11bmxvY2sgKF9fY29uc3Qgdm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4pIF9fVEhST1c7CisKKy8qIENhdXNlIGFsbCBjdXJyZW50bHkgbWFwcGVkIHBhZ2VzIG9mIHRoZSBwcm9jZXNzIHRvIGJlIG1lbW9yeSByZXNpZGVudAorICAgdW50aWwgdW5sb2NrZWQgYnkgYSBjYWxsIHRvIHRoZSBgbXVubG9ja2FsbCcsIHVudGlsIHRoZSBwcm9jZXNzIGV4aXRzLAorICAgb3IgdW50aWwgdGhlIHByb2Nlc3MgY2FsbHMgYGV4ZWN2ZScuICAqLworZXh0ZXJuIGludCBtbG9ja2FsbCAoaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIEFsbCBjdXJyZW50bHkgbWFwcGVkIHBhZ2VzIG9mIHRoZSBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlIGJlY29tZQorICAgdW5sb2NrZWQuICAqLworZXh0ZXJuIGludCBtdW5sb2NrYWxsICh2b2lkKSBfX1RIUk9XOworCisjaWZkZWYgX19VU0VfTUlTQworLyogbWluY29yZSByZXR1cm5zIHRoZSBtZW1vcnkgcmVzaWRlbmN5IHN0YXR1cyBvZiB0aGUgcGFnZXMgaW4gdGhlCisgICBjdXJyZW50IHByb2Nlc3MncyBhZGRyZXNzIHNwYWNlIHNwZWNpZmllZCBieSBbc3RhcnQsIHN0YXJ0ICsgbGVuKS4KKyAgIFRoZSBzdGF0dXMgaXMgcmV0dXJuZWQgaW4gYSB2ZWN0b3Igb2YgYnl0ZXMuICBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQKKyAgIGJpdCBvZiBlYWNoIGJ5dGUgaXMgMSBpZiB0aGUgcmVmZXJlbmNlZCBwYWdlIGlzIGluIG1lbW9yeSwgb3RoZXJ3aXNlCisgICBpdCBpcyB6ZXJvLiAgKi8KK2V4dGVybiBpbnQgbWluY29yZSAodm9pZCAqX19zdGFydCwgc2l6ZV90IF9fbGVuLCB1bnNpZ25lZCBjaGFyICpfX3ZlYykKKyAgICAgX19USFJPVzsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBSZW1hcCBwYWdlcyBtYXBwZWQgYnkgdGhlIHJhbmdlIFtBRERSLEFERFIrT0xEX0xFTikgdG8gbmV3IGxlbmd0aAorICAgTkVXX0xFTi4gIElmIE1SRU1BUF9NQVlNT1ZFIGlzIHNldCBpbiBGTEFHUyB0aGUgcmV0dXJuZWQgYWRkcmVzcworICAgbWF5IGRpZmZlciBmcm9tIEFERFIuICBJZiBNUkVNQVBfRklYRUQgaXMgc2V0IGluIEZMQUdTIHRoZSBmdW5jdGlvbgorICAgdGFrZXMgYW5vdGhlciBwYXJhbXRlciB3aGljaCBpcyBhIGZpeGVkIGFkZHJlc3MgYXQgd2hpY2ggdGhlIGJsb2NrCisgICByZXNpZGVzIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsLiAgKi8KK2V4dGVybiB2b2lkICptcmVtYXAgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fb2xkX2xlbiwgc2l6ZV90IF9fbmV3X2xlbiwKKwkJICAgICBpbnQgX19mbGFncywgLi4uKSBfX1RIUk9XOworCisvKiBSZW1hcCBhcmJpdHJhcnkgcGFnZXMgb2YgYSBzaGFyZWQgYmFja2luZyBzdG9yZSB3aXRoaW4gYW4gZXhpc3RpbmcKKyAgIFZNQS4gICovCitleHRlcm4gaW50IHJlbWFwX2ZpbGVfcGFnZXMgKHZvaWQgKl9fc3RhcnQsIHNpemVfdCBfX3NpemUsIGludCBfX3Byb3QsCisJCQkgICAgIHNpemVfdCBfX3Bnb2ZmLCBpbnQgX19mbGFncykgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIE9wZW4gc2hhcmVkIG1lbW9yeSBzZWdtZW50LiAgKi8KK2V4dGVybiBpbnQgc2htX29wZW4gKF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQgX19vZmxhZywgbW9kZV90IF9fbW9kZSk7CisKKy8qIFJlbW92ZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQuICAqLworZXh0ZXJuIGludCBzaG1fdW5saW5rIChfX2NvbnN0IGNoYXIgKl9fbmFtZSk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvbW1hbi5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL21vdW50LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL21vdW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIzYjQ2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvbW91bnQuaApAQCAtMCwwICsxLDE0OCBAQAorLyogSGVhZGVyIGZpbGUgZm9yIG1vdW50aW5nL3VubW91bnQgTGludXggZmlsZXN5c3RlbXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCwgMjAwNCwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogVGhpcyBpcyB0YWtlbiBmcm9tIC91c3IvaW5jbHVkZS9saW51eC9mcy5oLiAgKi8KKworI2lmbmRlZiBfU1lTX01PVU5UX0gKKyNkZWZpbmUgX1NZU19NT1VOVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNkZWZpbmUgQkxPQ0tfU0laRQkxMDI0CisjZGVmaW5lIEJMT0NLX1NJWkVfQklUUwkxMAorCisKKy8qIFRoZXNlIGFyZSB0aGUgZnMtaW5kZXBlbmRlbnQgbW91bnQtZmxhZ3M6IHVwIHRvIDE2IGZsYWdzIGFyZQorICAgc3VwcG9ydGVkICAqLworZW51bQoreworICBNU19SRE9OTFkgPSAxLAkJLyogTW91bnQgcmVhZC1vbmx5LiAgKi8KKyNkZWZpbmUgTVNfUkRPTkxZCU1TX1JET05MWQorICBNU19OT1NVSUQgPSAyLAkJLyogSWdub3JlIHN1aWQgYW5kIHNnaWQgYml0cy4gICovCisjZGVmaW5lIE1TX05PU1VJRAlNU19OT1NVSUQKKyAgTVNfTk9ERVYgPSA0LAkJCS8qIERpc2FsbG93IGFjY2VzcyB0byBkZXZpY2Ugc3BlY2lhbCBmaWxlcy4gICovCisjZGVmaW5lIE1TX05PREVWCU1TX05PREVWCisgIE1TX05PRVhFQyA9IDgsCQkvKiBEaXNhbGxvdyBwcm9ncmFtIGV4ZWN1dGlvbi4gICovCisjZGVmaW5lIE1TX05PRVhFQwlNU19OT0VYRUMKKyAgTVNfU1lOQ0hST05PVVMgPSAxNiwJCS8qIFdyaXRlcyBhcmUgc3luY2VkIGF0IG9uY2UuICAqLworI2RlZmluZSBNU19TWU5DSFJPTk9VUwlNU19TWU5DSFJPTk9VUworICBNU19SRU1PVU5UID0gMzIsCQkvKiBBbHRlciBmbGFncyBvZiBhIG1vdW50ZWQgRlMuICAqLworI2RlZmluZSBNU19SRU1PVU5UCU1TX1JFTU9VTlQKKyAgTVNfTUFORExPQ0sgPSA2NCwJCS8qIEFsbG93IG1hbmRhdG9yeSBsb2NrcyBvbiBhbiBGUy4gICovCisjZGVmaW5lIE1TX01BTkRMT0NLCU1TX01BTkRMT0NLCisgIE1TX0RJUlNZTkMgPSAxMjgsCQkvKiBEaXJlY3RvcnkgbW9kaWZpY2F0aW9ucyBhcmUgc3luY2hyb25vdXMuICAqLworI2RlZmluZSBNU19ESVJTWU5DCU1TX0RJUlNZTkMKKyAgTVNfTk9BVElNRSA9IDEwMjQsCQkvKiBEbyBub3QgdXBkYXRlIGFjY2VzcyB0aW1lcy4gICovCisjZGVmaW5lIE1TX05PQVRJTUUJTVNfTk9BVElNRQorICBNU19OT0RJUkFUSU1FID0gMjA0OCwJCS8qIERvIG5vdCB1cGRhdGUgZGlyZWN0b3J5IGFjY2VzcyB0aW1lcy4gICovCisjZGVmaW5lIE1TX05PRElSQVRJTUUJTVNfTk9ESVJBVElNRQorICBNU19CSU5EID0gNDA5NiwJCS8qIEJpbmQgZGlyZWN0b3J5IGF0IGRpZmZlcmVudCBwbGFjZS4gICovCisjZGVmaW5lIE1TX0JJTkQJCU1TX0JJTkQKKyAgTVNfTU9WRSA9IDgxOTIsCisjZGVmaW5lIE1TX01PVkUJCU1TX01PVkUKKyAgTVNfUkVDID0gMTYzODQsCisjZGVmaW5lIE1TX1JFQwkJTVNfUkVDCisgIE1TX1NJTEVOVCA9IDMyNzY4LAorI2RlZmluZSBNU19TSUxFTlQJTVNfU0lMRU5UCisgIE1TX1BPU0lYQUNMID0gMSA8PCAxNiwJLyogVkZTIGRvZXMgbm90IGFwcGx5IHRoZSB1bWFzay4gICovCisjZGVmaW5lIE1TX1BPU0lYQUNMCU1TX1BPU0lYQUNMCisgIE1TX1VOQklOREFCTEUgPSAxIDw8IDE3LAkvKiBDaGFuZ2UgdG8gdW5iaW5kYWJsZS4gICovCisjZGVmaW5lIE1TX1VOQklOREFCTEUJTVNfVU5CSU5EQUJMRQorICBNU19QUklWQVRFID0gMSA8PCAxOCwJCS8qIENoYW5nZSB0byBwcml2YXRlLiAgKi8KKyNkZWZpbmUgTVNfUFJJVkFURQlNU19QUklWQVRFCisgIE1TX1NMQVZFID0gMSA8PCAxOSwJCS8qIENoYW5nZSB0byBzbGF2ZS4gICovCisjZGVmaW5lIE1TX1NMQVZFCU1TX1NMQVZFCisgIE1TX1NIQVJFRCA9IDEgPDwgMjAsCQkvKiBDaGFuZ2UgdG8gc2hhcmVkLiAgKi8KKyNkZWZpbmUgTVNfU0hBUkVECU1TX1NIQVJFRAorICBNU19SRUxBVElNRSA9IDEgPDwgMjEsCS8qIFVwZGF0ZSBhdGltZSByZWxhdGl2ZSB0byBtdGltZS9jdGltZS4gICovCisjZGVmaW5lIE1TX1JFTEFUSU1FCU1TX1JFTEFUSU1FCisgIE1TX0tFUk5NT1VOVCA9IDEgPDwgMjIsCS8qIFRoaXMgaXMgYSBrZXJuX21vdW50IGNhbGwuICAqLworI2RlZmluZSBNU19LRVJOTU9VTlQJTVNfS0VSTk1PVU5UCisgIE1TX0lfVkVSU0lPTiA9ICAxIDw8IDIzLAkvKiBVcGRhdGUgaW5vZGUgSV92ZXJzaW9uIGZpZWxkLiAgKi8KKyNkZWZpbmUgTVNfSV9WRVJTSU9OCU1TX0lfVkVSU0lPTgorICBNU19TVFJJQ1RBVElNRSA9IDEgPDwgMjQsCS8qIEFsd2F5cyBwZXJmb3JtIGF0aW1lIHVwZGF0ZXMuICAqLworI2RlZmluZSBNU19TVFJJQ1RBVElNRQlNU19TVFJJQ1RBVElNRQorICBNU19BQ1RJVkUgPSAxIDw8IDMwLAorI2RlZmluZSBNU19BQ1RJVkUJTVNfQUNUSVZFCisgIE1TX05PVVNFUiA9IDEgPDwgMzEKKyNkZWZpbmUgTVNfTk9VU0VSCU1TX05PVVNFUgorfTsKKworLyogRmxhZ3MgdGhhdCBjYW4gYmUgYWx0ZXJlZCBieSBNU19SRU1PVU5UICAqLworI2RlZmluZSBNU19STVRfTUFTSyAoTVNfUkRPTkxZfE1TX1NZTkNIUk9OT1VTfE1TX01BTkRMT0NLfE1TX0lfVkVSU0lPTikKKworCisvKiBNYWdpYyBtb3VudCBmbGFnIG51bWJlci4gSGFzIHRvIGJlIG9yLWVkIHRvIHRoZSBmbGFnIHZhbHVlcy4gICovCisKKyNkZWZpbmUgTVNfTUdDX1ZBTCAweGMwZWQwMDAwCS8qIE1hZ2ljIGZsYWcgbnVtYmVyIHRvIGluZGljYXRlICJuZXciIGZsYWdzICovCisjZGVmaW5lIE1TX01HQ19NU0sgMHhmZmZmMDAwMAkvKiBNYWdpYyBmbGFnIG51bWJlciBtYXNrICovCisKKworLyogVGhlIHJlYWQtb25seSBzdHVmZiBkb2Vzbid0IHJlYWxseSBiZWxvbmcgaGVyZSwgYnV0IGFueSBvdGhlciBwbGFjZQorICAgaXMgcHJvYmFibHkgYXMgYmFkIGFuZCBJIGRvbid0IHdhbnQgdG8gY3JlYXRlIHlldCBhbm90aGVyIGluY2x1ZGUKKyAgIGZpbGUuICAqLworCisjZGVmaW5lIEJMS1JPU0VUICAgX0lPKDB4MTIsIDkzKSAvKiBTZXQgZGV2aWNlIHJlYWQtb25seSAoMCA9IHJlYWQtd3JpdGUpLiAgKi8KKyNkZWZpbmUgQkxLUk9HRVQgICBfSU8oMHgxMiwgOTQpIC8qIEdldCByZWFkLW9ubHkgc3RhdHVzICgwID0gcmVhZF93cml0ZSkuICAqLworI2RlZmluZSBCTEtSUlBBUlQgIF9JTygweDEyLCA5NSkgLyogUmUtcmVhZCBwYXJ0aXRpb24gdGFibGUuICAqLworI2RlZmluZSBCTEtHRVRTSVpFIF9JTygweDEyLCA5NikgLyogUmV0dXJuIGRldmljZSBzaXplLiAgKi8KKyNkZWZpbmUgQkxLRkxTQlVGICBfSU8oMHgxMiwgOTcpIC8qIEZsdXNoIGJ1ZmZlciBjYWNoZS4gICovCisjZGVmaW5lIEJMS1JBU0VUICAgX0lPKDB4MTIsIDk4KSAvKiBTZXQgcmVhZCBhaGVhZCBmb3IgYmxvY2sgZGV2aWNlLiAgKi8KKyNkZWZpbmUgQkxLUkFHRVQgICBfSU8oMHgxMiwgOTkpIC8qIEdldCBjdXJyZW50IHJlYWQgYWhlYWQgc2V0dGluZy4gICovCisjZGVmaW5lIEJMS0ZSQVNFVCAgX0lPKDB4MTIsMTAwKSAvKiBTZXQgZmlsZXN5c3RlbSByZWFkLWFoZWFkLiAgKi8KKyNkZWZpbmUgQkxLRlJBR0VUICBfSU8oMHgxMiwxMDEpIC8qIEdldCBmaWxlc3lzdGVtIHJlYWQtYWhlYWQuICAqLworI2RlZmluZSBCTEtTRUNUU0VUIF9JTygweDEyLDEwMikgLyogU2V0IG1heCBzZWN0b3JzIHBlciByZXF1ZXN0LiAgKi8KKyNkZWZpbmUgQkxLU0VDVEdFVCBfSU8oMHgxMiwxMDMpIC8qIEdldCBtYXggc2VjdG9ycyBwZXIgcmVxdWVzdC4gICovCisjZGVmaW5lIEJMS1NTWkdFVCAgX0lPKDB4MTIsMTA0KSAvKiBHZXQgYmxvY2sgZGV2aWNlIHNlY3RvciBzaXplLiAgKi8KKyNkZWZpbmUgQkxLQlNaR0VUICBfSU9SKDB4MTIsMTEyLHNpemVfdCkKKyNkZWZpbmUgQkxLQlNaU0VUICBfSU9XKDB4MTIsMTEzLHNpemVfdCkKKyNkZWZpbmUgQkxLR0VUU0laRTY0IF9JT1IoMHgxMiwxMTQsc2l6ZV90KSAvKiByZXR1cm4gZGV2aWNlIHNpemUuICAqLworCisKKy8qIFBvc3NpYmxlIHZhbHVlIGZvciBGTEFHUyBwYXJhbWV0ZXIgb2YgYHVtb3VudDInLiAgKi8KK2VudW0KK3sKKyAgTU5UX0ZPUkNFID0gMSwJCS8qIEZvcmNlIHVubW91bnRpbmcuICAqLworI2RlZmluZSBNTlRfRk9SQ0UgTU5UX0ZPUkNFCisgIE1OVF9ERVRBQ0ggPSAyLAkJLyogSnVzdCBkZXRhY2ggZnJvbSB0aGUgdHJlZS4gICovCisjZGVmaW5lIE1OVF9ERVRBQ0ggTU5UX0RFVEFDSAorICBNTlRfRVhQSVJFID0gNCwJCS8qIE1hcmsgZm9yIGV4cGlyeS4gICovCisjZGVmaW5lIE1OVF9FWFBJUkUgTU5UX0VYUElSRQorICBVTU9VTlRfTk9GT0xMT1cgPSA4CQkvKiBEb24ndCBmb2xsb3cgc3ltbGluayBvbiB1bW91bnQuICAqLworI2RlZmluZSBVTU9VTlRfTk9GT0xMT1cgVU1PVU5UX05PRk9MTE9XCit9OworCisKK19fQkVHSU5fREVDTFMKKworLyogTW91bnQgYSBmaWxlc3lzdGVtLiAgKi8KK2V4dGVybiBpbnQgbW91bnQgKF9fY29uc3QgY2hhciAqX19zcGVjaWFsX2ZpbGUsIF9fY29uc3QgY2hhciAqX19kaXIsCisJCSAgX19jb25zdCBjaGFyICpfX2ZzdHlwZSwgdW5zaWduZWQgbG9uZyBpbnQgX19yd2ZsYWcsCisJCSAgX19jb25zdCB2b2lkICpfX2RhdGEpIF9fVEhST1c7CisKKy8qIFVubW91bnQgYSBmaWxlc3lzdGVtLiAgKi8KK2V4dGVybiBpbnQgdW1vdW50IChfX2NvbnN0IGNoYXIgKl9fc3BlY2lhbF9maWxlKSBfX1RIUk9XOworCisvKiBVbm1vdW50IGEgZmlsZXN5c3RlbS4gIEZvcmNlIHVubW91bnRpbmcgaWYgRkxBR1MgaXMgc2V0IHRvIE1OVF9GT1JDRS4gICovCitleHRlcm4gaW50IHVtb3VudDIgKF9fY29uc3QgY2hhciAqX19zcGVjaWFsX2ZpbGUsIGludCBfX2ZsYWdzKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX1NZU19NT1VOVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL21zZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGM5NmJlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9tc2cuaApAQCAtMCwwICsxLDg1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywxOTk5LDIwMDAsMjAwMywyMDA2LDIwMDcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfTVNHX0gKKyNkZWZpbmUgX1NZU19NU0dfSAorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZSBfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIEdldCBjb21tb24gZGVmaW5pdGlvbiBvZiBTeXN0ZW0gViBzdHlsZSBJUEMuICAqLworI2luY2x1ZGUgPHN5cy9pcGMuaD4KKworLyogR2V0IHN5c3RlbSBkZXBlbmRlbnQgZGVmaW5pdGlvbiBvZiBgc3RydWN0IG1zcWlkX2RzJyBhbmQgbW9yZS4gICovCisjaW5jbHVkZSA8Yml0cy9tc3EuaD4KKworLyogRGVmaW5lIHR5cGVzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZC4gICovCisjZGVmaW5lCV9fbmVlZF90aW1lX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZm5kZWYgX19waWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fcGlkX3QgcGlkX3Q7CisjIGRlZmluZSBfX3BpZF90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fc3NpemVfdF9kZWZpbmVkCit0eXBlZGVmIF9fc3NpemVfdCBzc2l6ZV90OworIyBkZWZpbmUgX19zc2l6ZV90X2RlZmluZWQKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIFN5c3RlbSBWIHN0eWxlIElQQyBmdW5jdGlvbnMgaW1wbGVtZW50IGEgbWVzc2FnZSBxdWV1ZQorICAgc3lzdGVtLiAgVGhlIGRlZmluaXRpb24gaXMgZm91bmQgaW4gWFBHMi4gICovCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRlbXBsYXRlIGZvciBzdHJ1Y3QgdG8gYmUgdXNlZCBhcyBhcmd1bWVudCBmb3IgYG1zZ3NuZCcgYW5kIGBtc2dyY3YnLiAgKi8KK3N0cnVjdCBtc2didWYKKyAgeworICAgIGxvbmcgaW50IG10eXBlOwkJLyogdHlwZSBvZiByZWNlaXZlZC9zZW50IG1lc3NhZ2UgKi8KKyAgICBjaGFyIG10ZXh0WzFdOwkJLyogdGV4dCBvZiB0aGUgbWVzc2FnZSAqLworICB9OworI2VuZGlmCisKKworX19CRUdJTl9ERUNMUworCisvKiBNZXNzYWdlIHF1ZXVlIGNvbnRyb2wgb3BlcmF0aW9uLiAgKi8KK2V4dGVybiBpbnQgbXNnY3RsIChpbnQgX19tc3FpZCwgaW50IF9fY21kLCBzdHJ1Y3QgbXNxaWRfZHMgKl9fYnVmKSBfX1RIUk9XOworCisvKiBHZXQgbWVzc2FnZXMgcXVldWUuICAqLworZXh0ZXJuIGludCBtc2dnZXQgKGtleV90IF9fa2V5LCBpbnQgX19tc2dmbGcpIF9fVEhST1c7CisKKy8qIFJlY2VpdmUgbWVzc2FnZSBmcm9tIG1lc3NhZ2UgcXVldWUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgbXNncmN2IChpbnQgX19tc3FpZCwgdm9pZCAqX19tc2dwLCBzaXplX3QgX19tc2dzeiwKKwkJICAgICAgIGxvbmcgaW50IF9fbXNndHlwLCBpbnQgX19tc2dmbGcpOworCisvKiBTZW5kIG1lc3NhZ2UgdG8gbWVzc2FnZSBxdWV1ZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IG1zZ3NuZCAoaW50IF9fbXNxaWQsIF9fY29uc3Qgdm9pZCAqX19tc2dwLCBzaXplX3QgX19tc2dzeiwKKwkJICAgaW50IF9fbXNnZmxnKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9tc2cuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9tdGlvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL210aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWZhNTUwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9tdGlvLmgKQEAgLTAsMCArMSwyNzcgQEAKKy8qIFN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zIGZvciBtYWduZXRpYyB0YXBlIEkvTyBjb250cm9sIGNvbW1hbmRzLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBXcml0dGVuIGJ5IEguIEJlcmdtYW4gPGhlbm51c0BjeWJlcmNvbW0ubmw+LiAgKi8KKworI2lmbmRlZiBfU1lTX01USU9fSAorI2RlZmluZSBfU1lTX01USU9fSAkxCisKKy8qIEdldCBuZWNlc3NhcnkgZGVmaW5pdGlvbnMgZnJvbSBzeXN0ZW0gYW5kIGtlcm5lbCBoZWFkZXJzLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworCisvKiBTdHJ1Y3R1cmUgZm9yIE1USU9DVE9QIC0gbWFnbmV0aWMgdGFwZSBvcGVyYXRpb24gY29tbWFuZC4gICovCitzdHJ1Y3QgbXRvcAorICB7CisgICAgc2hvcnQgaW50IG10X29wOwkJLyogT3BlcmF0aW9ucyBkZWZpbmVkIGJlbG93LiAgKi8KKyAgICBpbnQgbXRfY291bnQ7CQkvKiBIb3cgbWFueSBvZiB0aGVtLiAgKi8KKyAgfTsKKyNkZWZpbmUgX0lPVF9tdG9wIC8qIEh1cmQgaW9jdGwgdHlwZSBmaWVsZC4gICovIFwKKyAgX0lPVCAoX0lPVFMgKHNob3J0KSwgMSwgX0lPVFMgKGludCksIDEsIDAsIDApCisKKy8qIE1hZ25ldGljIFRhcGUgb3BlcmF0aW9ucyBbTm90IGFsbCBvcGVyYXRpb25zIHN1cHBvcnRlZCBieSBhbGwgZHJpdmVyc10uICAqLworI2RlZmluZSBNVFJFU0VUIDAJLyogK3Jlc2V0IGRyaXZlIGluIGNhc2Ugb2YgcHJvYmxlbXMuICAqLworI2RlZmluZSBNVEZTRgkxCS8qIEZvcndhcmQgc3BhY2Ugb3ZlciBGaWxlTWFyaywKKwkJCSAqIHBvc2l0aW9uIGF0IGZpcnN0IHJlY29yZCBvZiBuZXh0IGZpbGUuICAqLworI2RlZmluZSBNVEJTRgkyCS8qIEJhY2t3YXJkIHNwYWNlIEZpbGVNYXJrIChwb3NpdGlvbiBiZWZvcmUgRk0pLiAgKi8KKyNkZWZpbmUgTVRGU1IJMwkvKiBGb3J3YXJkIHNwYWNlIHJlY29yZC4gICovCisjZGVmaW5lIE1UQlNSCTQJLyogQmFja3dhcmQgc3BhY2UgcmVjb3JkLiAgKi8KKyNkZWZpbmUgTVRXRU9GCTUJLyogV3JpdGUgYW4gZW5kLW9mLWZpbGUgcmVjb3JkIChtYXJrKS4gICovCisjZGVmaW5lIE1UUkVXCTYJLyogUmV3aW5kLiAgKi8KKyNkZWZpbmUgTVRPRkZMCTcJLyogUmV3aW5kIGFuZCBwdXQgdGhlIGRyaXZlIG9mZmxpbmUgKGVqZWN0PykuICAqLworI2RlZmluZSBNVE5PUAk4CS8qIE5vIG9wLCBzZXQgc3RhdHVzIG9ubHkgKHJlYWQgd2l0aCBNVElPQ0dFVCkuICAqLworI2RlZmluZSBNVFJFVEVOIDkJLyogUmV0ZW5zaW9uIHRhcGUuICAqLworI2RlZmluZSBNVEJTRk0JMTAJLyogK2JhY2t3YXJkIHNwYWNlIEZpbGVNYXJrLCBwb3NpdGlvbiBhdCBGTS4gICovCisjZGVmaW5lIE1URlNGTSAgMTEJLyogK2ZvcndhcmQgc3BhY2UgRmlsZU1hcmssIHBvc2l0aW9uIGF0IEZNLiAgKi8KKyNkZWZpbmUgTVRFT00JMTIJLyogR290byBlbmQgb2YgcmVjb3JkZWQgbWVkaWEgKGZvciBhcHBlbmRpbmcgZmlsZXMpLgorCQkJICAgTVRFT00gcG9zaXRpb25zIGFmdGVyIHRoZSBsYXN0IEZNLCByZWFkeSBmb3IKKwkJCSAgIGFwcGVuZGluZyBhbm90aGVyIGZpbGUuICAqLworI2RlZmluZSBNVEVSQVNFIDEzCS8qIEVyYXNlIHRhcGUgLS0gYmUgY2FyZWZ1bCEgICovCisKKyNkZWZpbmUgTVRSQVMxICAxNAkvKiBSdW4gc2VsZiB0ZXN0IDEgKG5vbmRlc3RydWN0aXZlKS4gICovCisjZGVmaW5lIE1UUkFTMgkxNQkvKiBSdW4gc2VsZiB0ZXN0IDIgKGRlc3RydWN0aXZlKS4gICovCisjZGVmaW5lIE1UUkFTMyAgMTYJLyogUmVzZXJ2ZWQgZm9yIHNlbGYgdGVzdCAzLiAgKi8KKworI2RlZmluZSBNVFNFVEJMSyAyMAkvKiBTZXQgYmxvY2sgbGVuZ3RoIChTQ1NJKS4gICovCisjZGVmaW5lIE1UU0VUREVOU0lUWSAyMQkvKiBTZXQgdGFwZSBkZW5zaXR5IChTQ1NJKS4gICovCisjZGVmaW5lIE1UU0VFSwkyMgkvKiBTZWVrIHRvIGJsb2NrIChUYW5kYmVyZywgZXRjLikuICAqLworI2RlZmluZSBNVFRFTEwJMjMJLyogVGVsbCBibG9jayAoVGFuZGJlcmcsIGV0Yy4pLiAgKi8KKyNkZWZpbmUgTVRTRVREUlZCVUZGRVIgMjQgLyogU2V0IHRoZSBkcml2ZSBidWZmZXJpbmcgYWNjb3JkaW5nIHRvIFNDU0ktMi4KKwkJCSAgICAgT3JkaW5hcnkgYnVmZmVyZWQgb3BlcmF0aW9uIHdpdGggY29kZSAxLiAgKi8KKyNkZWZpbmUgTVRGU1MJMjUJLyogU3BhY2UgZm9yd2FyZCBvdmVyIHNldG1hcmtzLiAgKi8KKyNkZWZpbmUgTVRCU1MJMjYJLyogU3BhY2UgYmFja3dhcmQgb3ZlciBzZXRtYXJrcy4gICovCisjZGVmaW5lIE1UV1NNCTI3CS8qIFdyaXRlIHNldG1hcmtzLiAgKi8KKworI2RlZmluZSBNVExPQ0sgIDI4CS8qIExvY2sgdGhlIGRyaXZlIGRvb3IuICAqLworI2RlZmluZSBNVFVOTE9DSyAyOQkvKiBVbmxvY2sgdGhlIGRyaXZlIGRvb3IuICAqLworI2RlZmluZSBNVExPQUQgIDMwCS8qIEV4ZWN1dGUgdGhlIFNDU0kgbG9hZCBjb21tYW5kLiAgKi8KKyNkZWZpbmUgTVRVTkxPQUQgMzEJLyogRXhlY3V0ZSB0aGUgU0NTSSB1bmxvYWQgY29tbWFuZC4gICovCisjZGVmaW5lIE1UQ09NUFJFU1NJT04gMzIvKiBDb250cm9sIGNvbXByZXNzaW9uIHdpdGggU0NTSSBtb2RlIHBhZ2UgMTUuICAqLworI2RlZmluZSBNVFNFVFBBUlQgMzMJLyogQ2hhbmdlIHRoZSBhY3RpdmUgdGFwZSBwYXJ0aXRpb24uICAqLworI2RlZmluZSBNVE1LUEFSVCAgMzQJLyogRm9ybWF0IHRoZSB0YXBlIHdpdGggb25lIG9yIHR3byBwYXJ0aXRpb25zLiAgKi8KKworLyogc3RydWN0dXJlIGZvciBNVElPQ0dFVCAtIG1hZyB0YXBlIGdldCBzdGF0dXMgY29tbWFuZCAqLworCitzdHJ1Y3QgbXRnZXQKKyAgeworICAgIGxvbmcgaW50IG10X3R5cGU7CQkvKiBUeXBlIG9mIG1hZ3RhcGUgZGV2aWNlLiAgKi8KKyAgICBsb25nIGludCBtdF9yZXNpZDsJCS8qIFJlc2lkdWFsIGNvdW50OiAobm90IHN1cmUpCisJCQkJICAgbnVtYmVyIG9mIGJ5dGVzIGlnbm9yZWQsIG9yCisJCQkJICAgbnVtYmVyIG9mIGZpbGVzIG5vdCBza2lwcGVkLCBvcgorCQkJCSAgIG51bWJlciBvZiByZWNvcmRzIG5vdCBza2lwcGVkLiAgKi8KKyAgICAvKiBUaGUgZm9sbG93aW5nIHJlZ2lzdGVycyBhcmUgZGV2aWNlIGRlcGVuZGVudC4gICovCisgICAgbG9uZyBpbnQgbXRfZHNyZWc7CQkvKiBTdGF0dXMgcmVnaXN0ZXIuICAqLworICAgIGxvbmcgaW50IG10X2dzdGF0OwkJLyogR2VuZXJpYyAoZGV2aWNlIGluZGVwZW5kZW50KSBzdGF0dXMuICAqLworICAgIGxvbmcgaW50IG10X2VycmVnOwkJLyogRXJyb3IgcmVnaXN0ZXIuICAqLworICAgIC8qIFRoZSBuZXh0IHR3byBmaWVsZHMgYXJlIG5vdCBhbHdheXMgdXNlZC4gICovCisgICAgX19kYWRkcl90IG10X2ZpbGVubzsJLyogTnVtYmVyIG9mIGN1cnJlbnQgZmlsZSBvbiB0YXBlLiAgKi8KKyAgICBfX2RhZGRyX3QgbXRfYmxrbm87CQkvKiBDdXJyZW50IGJsb2NrIG51bWJlci4gICovCisgIH07CisjZGVmaW5lIF9JT1RfbXRnZXQgLyogSHVyZCBpb2N0bCB0eXBlIGZpZWxkLiAgKi8gXAorICBfSU9UIChfSU9UUyAobG9uZyksIDcsIDAsIDAsIDAsIDApCisKKworLyogQ29uc3RhbnRzIGZvciBtdF90eXBlLiBOb3QgYWxsIG9mIHRoZXNlIGFyZSBzdXBwb3J0ZWQsIGFuZAorICAgdGhlc2UgYXJlIG5vdCBhbGwgb2YgdGhlIG9uZXMgdGhhdCBhcmUgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUgTVRfSVNVTktOT1dOCQkweDAxCisjZGVmaW5lIE1UX0lTUUlDMDIJCTB4MDIJLyogR2VuZXJpYyBRSUMtMDIgdGFwZSBzdHJlYW1lci4gICovCisjZGVmaW5lIE1UX0lTV1Q1MTUwCQkweDAzCS8qIFdhbmd0ZWsgNTE1MEVRLCBRSUMtMTUwLCBRSUMtMDIuICAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVfNTk0NUwyCTB4MDQJLyogQXJjaGl2ZSA1OTQ1TC0yLCBRSUMtMjQsIFFJQy0wMj8uICovCisjZGVmaW5lIE1UX0lTQ01TSjUwMAkJMHgwNQkvKiBDTVMgSnVtYm8gNTAwIChRSUMtMDI/KS4gICovCisjZGVmaW5lIE1UX0lTVERDMzYxMAkJMHgwNgkvKiBUYW5kYmVyZyA2MzEwLCBRSUMtMjQuICAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVfVlA2MEkJMHgwNwkvKiBBcmNoaXZlIFZQNjBpLCBRSUMtMDIuICAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVfMjE1MEwJMHgwOAkvKiBBcmNoaXZlIFZpcGVyIDIxNTBMLiAgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFXzIwNjBMCTB4MDkJLyogQXJjaGl2ZSBWaXBlciAyMDYwTC4gICovCisjZGVmaW5lIE1UX0lTQVJDSElWRVNDNDk5CTB4MEEJLyogQXJjaGl2ZSBTQy00OTkgUUlDLTM2IGNvbnRyb2xsZXIuICovCisjZGVmaW5lIE1UX0lTUUlDMDJfQUxMX0ZFQVRVUkVTCTB4MEYJLyogR2VuZXJpYyBRSUMtMDIgd2l0aCBhbGwgZmVhdHVyZXMuICovCisjZGVmaW5lIE1UX0lTV1Q1MDk5RUVOMjQJMHgxMQkvKiBXYW5ndGVrIDUwOTktZWVuMjQsIDYwTUIsIFFJQy0yNC4gKi8KKyNkZWZpbmUgTVRfSVNURUFDX01UMlNUCQkweDEyCS8qIFRlYWMgTVQtMlNUIDE1NW1iIGRyaXZlLAorCQkJCQkgICBUZWFjIERDLTEgY2FyZCAoV2FuZ3RlayB0eXBlKS4gICovCisjZGVmaW5lIE1UX0lTRVZFUkVYX0ZUNDBBCTB4MzIJLyogRXZlcmV4IEZUNDBBIChRSUMtNDApLiAgKi8KKyNkZWZpbmUgTVRfSVNERFMxCQkweDUxCS8qIEREUyBkZXZpY2Ugd2l0aG91dCBwYXJ0aXRpb25zLiAgKi8KKyNkZWZpbmUgTVRfSVNERFMyCQkweDUyCS8qIEREUyBkZXZpY2Ugd2l0aCBwYXJ0aXRpb25zLiAgKi8KKyNkZWZpbmUgTVRfSVNTQ1NJMQkJMHg3MQkvKiBHZW5lcmljIEFOU0kgU0NTSS0xIHRhcGUgdW5pdC4gICovCisjZGVmaW5lIE1UX0lTU0NTSTIJCTB4NzIJLyogR2VuZXJpYyBBTlNJIFNDU0ktMiB0YXBlIHVuaXQuICAqLworCisvKiBRSUMtNDAvODAvMzAxMC8zMDIwIGZ0YXBlIHN1cHBvcnRlZCBkcml2ZXMuCisgICAyMGJpdCB2ZW5kb3IgSUQgKyAweDgwMDAwMCAoc2VlIHZlbmRvcnMuaCBpbiBmdGFwZSBkaXN0cmlidXRpb24pLiAgKi8KKyNkZWZpbmUgTVRfSVNGVEFQRV9VTktOT1dOCTB4ODAwMDAwIC8qIG9ic29sZXRlICovCisjZGVmaW5lIE1UX0lTRlRBUEVfRkxBRwkJMHg4MDAwMDAKKworc3RydWN0IG10X3RhcGVfaW5mbworICB7CisgICAgbG9uZyBpbnQgdF90eXBlOwkJLyogRGV2aWNlIHR5cGUgaWQgKG10X3R5cGUpLiAgKi8KKyAgICBjaGFyICp0X25hbWU7CQkvKiBEZXNjcmlwdGl2ZSBuYW1lLiAgKi8KKyAgfTsKKworI2RlZmluZSBNVF9UQVBFX0lORk8gXAorICB7CQkJCQkJCQkJICAgICAgXAorCXtNVF9JU1VOS05PV04sCQkiVW5rbm93biB0eXBlIG9mIHRhcGUgZGV2aWNlIn0sCQkgICAgICBcCisJe01UX0lTUUlDMDIsCQkiR2VuZXJpYyBRSUMtMDIgdGFwZSBzdHJlYW1lciJ9LAkgICAgICBcCisJe01UX0lTV1Q1MTUwLAkJIldhbmd0ZWsgNTE1MCwgUUlDLTE1MCJ9LAkJICAgICAgXAorCXtNVF9JU0FSQ0hJVkVfNTk0NUwyLAkiQXJjaGl2ZSA1OTQ1TC0yIn0sCQkJICAgICAgXAorCXtNVF9JU0NNU0o1MDAsCQkiQ01TIEp1bWJvIDUwMCJ9LAkJCSAgICAgIFwKKwl7TVRfSVNUREMzNjEwLAkJIlRhbmRiZXJnIFREQyAzNjEwLCBRSUMtMjQifSwJCSAgICAgIFwKKwl7TVRfSVNBUkNISVZFX1ZQNjBJLAkiQXJjaGl2ZSBWUDYwaSwgUUlDLTAyIn0sCQkgICAgICBcCisJe01UX0lTQVJDSElWRV8yMTUwTCwJIkFyY2hpdmUgVmlwZXIgMjE1MEwifSwJCQkgICAgICBcCisJe01UX0lTQVJDSElWRV8yMDYwTCwJIkFyY2hpdmUgVmlwZXIgMjA2MEwifSwJCQkgICAgICBcCisJe01UX0lTQVJDSElWRVNDNDk5LAkiQXJjaGl2ZSBTQy00OTkgUUlDLTM2IGNvbnRyb2xsZXIifSwJICAgICAgXAorCXtNVF9JU1FJQzAyX0FMTF9GRUFUVVJFUywgIkdlbmVyaWMgUUlDLTAyIHRhcGUsIGFsbCBmZWF0dXJlcyJ9LAkgICAgICBcCisJe01UX0lTV1Q1MDk5RUVOMjQsCSJXYW5ndGVrIDUwOTktZWVuMjQsIDYwTUIifSwJCSAgICAgIFwKKwl7TVRfSVNURUFDX01UMlNULAkiVGVhYyBNVC0yU1QgMTU1bWIgZGF0YSBjYXNzZXR0ZSBkcml2ZSJ9LCAgICAgXAorCXtNVF9JU0VWRVJFWF9GVDQwQSwJIkV2ZXJleCBGVDQwQSwgUUlDLTQwIn0sCQkgICAgICBcCisJe01UX0lTU0NTSTEsCQkiR2VuZXJpYyBTQ1NJLTEgdGFwZSJ9LAkJCSAgICAgIFwKKwl7TVRfSVNTQ1NJMiwJCSJHZW5lcmljIFNDU0ktMiB0YXBlIn0sCQkJICAgICAgXAorCXswLCBOVUxMfQkJCQkJCQkgICAgICBcCisgIH0KKworCisvKiBTdHJ1Y3R1cmUgZm9yIE1USU9DUE9TIC0gbWFnIHRhcGUgZ2V0IHBvc2l0aW9uIGNvbW1hbmQuICAqLworCitzdHJ1Y3QgbXRwb3MKKyAgeworICAgIGxvbmcgaW50IG10X2Jsa25vOwkvKiBDdXJyZW50IGJsb2NrIG51bWJlci4gICovCisgIH07CisjZGVmaW5lIF9JT1RfbXRwb3MgLyogSHVyZCBpb2N0bCB0eXBlIGZpZWxkLiAgKi8gXAorICBfSU9UX1NJTVBMRSAobG9uZykKKworCisvKiBTdHJ1Y3R1cmUgZm9yIE1USU9DR0VUQ09ORklHL01USU9DU0VUQ09ORklHIHByaW1hcmlseSBpbnRlbmRlZAorICAgYXMgYW4gaW50ZXJpbSBzb2x1dGlvbiBmb3IgUUlDLTAyIHVudGlsIERESSBpcyBmdWxseSBpbXBsZW1lbnRlZC4gICovCitzdHJ1Y3QgbXRjb25maWdpbmZvCisgIHsKKyAgICBsb25nIGludCBtdF90eXBlOwkJLyogRHJpdmUgdHlwZS4gICovCisgICAgbG9uZyBpbnQgaWZjX3R5cGU7CQkvKiBJbnRlcmZhY2UgY2FyZCB0eXBlLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgaXJxbnI7CS8qIElSUSBudW1iZXIgdG8gdXNlLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgZG1hbnI7CS8qIERNQSBjaGFubmVsIHRvIHVzZS4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IHBvcnQ7CS8qIElPIHBvcnQgYmFzZSBhZGRyZXNzLiAgKi8KKworICAgIHVuc2lnbmVkIGxvbmcgaW50IGRlYnVnOwkvKiBEZWJ1Z2dpbmcgZmxhZ3MuICAqLworCisgICAgdW5zaWduZWQgaGF2ZV9kZW5zOjE7CisgICAgdW5zaWduZWQgaGF2ZV9ic2Y6MTsKKyAgICB1bnNpZ25lZCBoYXZlX2ZzcjoxOworICAgIHVuc2lnbmVkIGhhdmVfYnNyOjE7CisgICAgdW5zaWduZWQgaGF2ZV9lb2Q6MTsKKyAgICB1bnNpZ25lZCBoYXZlX3NlZWs6MTsKKyAgICB1bnNpZ25lZCBoYXZlX3RlbGw6MTsKKyAgICB1bnNpZ25lZCBoYXZlX3JhczE6MTsKKyAgICB1bnNpZ25lZCBoYXZlX3JhczI6MTsKKyAgICB1bnNpZ25lZCBoYXZlX3JhczM6MTsKKyAgICB1bnNpZ25lZCBoYXZlX3FmYToxOworCisgICAgdW5zaWduZWQgcGFkMTo1OworICAgIGNoYXIgcmVzZXJ2ZWRbMTBdOworICB9OworI2RlZmluZSBfSU9UX210Y29uZmlnaW5mbyAvKiBIdXJkIGlvY3RsIHR5cGUgZmllbGQuICAqLyBcCisgIF9JT1QgKF9JT1RTIChsb25nKSwgMiwgX0lPVFMgKHNob3J0KSwgMywgX0lPVFMgKGxvbmcpLCAxKSAvKiBYWFggd3JvbmcgKi8KKworCisvKiBNYWduZXRpYyB0YXBlIEkvTyBjb250cm9sIGNvbW1hbmRzLiAgKi8KKyNkZWZpbmUJTVRJT0NUT1AJX0lPVygnbScsIDEsIHN0cnVjdCBtdG9wKQkvKiBEbyBhIG1hZyB0YXBlIG9wLiAqLworI2RlZmluZQlNVElPQ0dFVAlfSU9SKCdtJywgMiwgc3RydWN0IG10Z2V0KQkvKiBHZXQgdGFwZSBzdGF0dXMuICAqLworI2RlZmluZQlNVElPQ1BPUwlfSU9SKCdtJywgMywgc3RydWN0IG10cG9zKQkvKiBHZXQgdGFwZSBwb3NpdGlvbi4qLworCisvKiBUaGUgbmV4dCB0d28gYXJlIHVzZWQgYnkgdGhlIFFJQy0wMiBkcml2ZXIgZm9yIHJ1bnRpbWUgcmVjb25maWd1cmF0aW9uLgorICAgU2VlIHRwcWljMDIuaCBmb3Igc3RydWN0IG10Y29uZmlnaW5mby4gICovCisjZGVmaW5lCU1USU9DR0VUQ09ORklHCV9JT1IoJ20nLCA0LCBzdHJ1Y3QgbXRjb25maWdpbmZvKSAvKiBHZXQgdGFwZSBjb25maWcuKi8KKyNkZWZpbmUJTVRJT0NTRVRDT05GSUcJX0lPVygnbScsIDUsIHN0cnVjdCBtdGNvbmZpZ2luZm8pIC8qIFNldCB0YXBlIGNvbmZpZy4qLworCisvKiBHZW5lcmljIE1hZyBUYXBlIChkZXZpY2UgaW5kZXBlbmRlbnQpIHN0YXR1cyBtYWNyb3MgZm9yIGV4YW1pbmluZworICAgbXRfZ3N0YXQgLS0gSFAtVVggY29tcGF0aWJsZS4KKyAgIFRoZXJlIGlzIHJvb20gZm9yIG1vcmUgZ2VuZXJpYyBzdGF0dXMgYml0cyBoZXJlLCBidXQgSSBkb24ndAorICAga25vdyB3aGljaCBvZiB0aGVtIGFyZSByZXNlcnZlZC4gQXQgbGVhc3QgdGhyZWUgb3Igc28gc2hvdWxkCisgICBiZSBhZGRlZCB0byBtYWtlIHRoaXMgcmVhbGx5IHVzZWZ1bC4gICovCisjZGVmaW5lIEdNVF9FT0YoeCkgICAgICAgICAgICAgICgoeCkgJiAweDgwMDAwMDAwKQorI2RlZmluZSBHTVRfQk9UKHgpICAgICAgICAgICAgICAoKHgpICYgMHg0MDAwMDAwMCkKKyNkZWZpbmUgR01UX0VPVCh4KSAgICAgICAgICAgICAgKCh4KSAmIDB4MjAwMDAwMDApCisjZGVmaW5lIEdNVF9TTSh4KSAgICAgICAgICAgICAgICgoeCkgJiAweDEwMDAwMDAwKSAgLyogRERTIHNldG1hcmsgKi8KKyNkZWZpbmUgR01UX0VPRCh4KSAgICAgICAgICAgICAgKCh4KSAmIDB4MDgwMDAwMDApICAvKiBERFMgRU9EICovCisjZGVmaW5lIEdNVF9XUl9QUk9UKHgpICAgICAgICAgICgoeCkgJiAweDA0MDAwMDAwKQorLyogI2RlZmluZSBHTVRfID8gCQkoKHgpICYgMHgwMjAwMDAwMCkgKi8KKyNkZWZpbmUgR01UX09OTElORSh4KSAgICAgICAgICAgKCh4KSAmIDB4MDEwMDAwMDApCisjZGVmaW5lIEdNVF9EXzYyNTAoeCkgICAgICAgICAgICgoeCkgJiAweDAwODAwMDAwKQorI2RlZmluZSBHTVRfRF8xNjAwKHgpICAgICAgICAgICAoKHgpICYgMHgwMDQwMDAwMCkKKyNkZWZpbmUgR01UX0RfODAwKHgpICAgICAgICAgICAgKCh4KSAmIDB4MDAyMDAwMDApCisvKiAjZGVmaW5lIEdNVF8gPyAJCSgoeCkgJiAweDAwMTAwMDAwKSAqLworLyogI2RlZmluZSBHTVRfID8gCQkoKHgpICYgMHgwMDA4MDAwMCkgKi8KKyNkZWZpbmUgR01UX0RSX09QRU4oeCkgICAgICAgICAgKCh4KSAmIDB4MDAwNDAwMDApICAvKiBEb29yIG9wZW4gKG5vIHRhcGUpLiAgKi8KKy8qICNkZWZpbmUgR01UXyA/IAkJKCh4KSAmIDB4MDAwMjAwMDApICovCisjZGVmaW5lIEdNVF9JTV9SRVBfRU4oeCkgICAgICAgICgoeCkgJiAweDAwMDEwMDAwKSAgLyogSW1tZWRpYXRlIHJlcG9ydCBtb2RlLiovCisvKiAxNiBnZW5lcmljIHN0YXR1cyBiaXRzIHVudXNlZC4gICovCisKKworLyogU0NTSS10YXBlIHNwZWNpZmljIGRlZmluaXRpb25zLiAgQml0ZmllbGQgc2hpZnRzIGluIHRoZSBzdGF0dXMgICovCisjZGVmaW5lIE1UX1NUX0JMS1NJWkVfU0hJRlQJMAorI2RlZmluZSBNVF9TVF9CTEtTSVpFX01BU0sJMHhmZmZmZmYKKyNkZWZpbmUgTVRfU1RfREVOU0lUWV9TSElGVAkyNAorI2RlZmluZSBNVF9TVF9ERU5TSVRZX01BU0sJMHhmZjAwMDAwMAorCisjZGVmaW5lIE1UX1NUX1NPRlRFUlJfU0hJRlQJMAorI2RlZmluZSBNVF9TVF9TT0ZURVJSX01BU0sJMHhmZmZmCisKKy8qIEJpdGZpZWxkcyBmb3IgdGhlIE1UU0VURFJWQlVGRkVSIGlvY3RsLiAgKi8KKyNkZWZpbmUgTVRfU1RfT1BUSU9OUwkJMHhmMDAwMDAwMAorI2RlZmluZSBNVF9TVF9CT09MRUFOUwkJMHgxMDAwMDAwMAorI2RlZmluZSBNVF9TVF9TRVRCT09MRUFOUwkweDMwMDAwMDAwCisjZGVmaW5lIE1UX1NUX0NMRUFSQk9PTEVBTlMJMHg0MDAwMDAwMAorI2RlZmluZSBNVF9TVF9XUklURV9USFJFU0hPTEQJMHgyMDAwMDAwMAorI2RlZmluZSBNVF9TVF9ERUZfQkxLU0laRQkweDUwMDAwMDAwCisjZGVmaW5lIE1UX1NUX0RFRl9PUFRJT05TCTB4NjAwMDAwMDAKKworI2RlZmluZSBNVF9TVF9CVUZGRVJfV1JJVEVTCTB4MQorI2RlZmluZSBNVF9TVF9BU1lOQ19XUklURVMJMHgyCisjZGVmaW5lIE1UX1NUX1JFQURfQUhFQUQJMHg0CisjZGVmaW5lIE1UX1NUX0RFQlVHR0lORwkJMHg4CisjZGVmaW5lIE1UX1NUX1RXT19GTQkJMHgxMAorI2RlZmluZSBNVF9TVF9GQVNUX01URU9NCTB4MjAKKyNkZWZpbmUgTVRfU1RfQVVUT19MT0NLCQkweDQwCisjZGVmaW5lIE1UX1NUX0RFRl9XUklURVMJMHg4MAorI2RlZmluZSBNVF9TVF9DQU5fQlNSCQkweDEwMAorI2RlZmluZSBNVF9TVF9OT19CTEtMSU1TCTB4MjAwCisjZGVmaW5lIE1UX1NUX0NBTl9QQVJUSVRJT05TICAgIDB4NDAwCisjZGVmaW5lIE1UX1NUX1NDU0kyTE9HSUNBTCAgICAgIDB4ODAwCisKKy8qIFRoZSBtb2RlIHBhcmFtZXRlcnMgdG8gYmUgY29udHJvbGxlZC4gUGFyYW1ldGVyIGNob3NlbiB3aXRoIGJpdHMgMjAtMjguICAqLworI2RlZmluZSBNVF9TVF9DTEVBUl9ERUZBVUxUCTB4ZmZmZmYKKyNkZWZpbmUgTVRfU1RfREVGX0RFTlNJVFkJKE1UX1NUX0RFRl9PUFRJT05TIHwgMHgxMDAwMDApCisjZGVmaW5lIE1UX1NUX0RFRl9DT01QUkVTU0lPTgkoTVRfU1RfREVGX09QVElPTlMgfCAweDIwMDAwMCkKKyNkZWZpbmUgTVRfU1RfREVGX0RSVkJVRkZFUgkoTVRfU1RfREVGX09QVElPTlMgfCAweDMwMDAwMCkKKworLyogVGhlIG9mZnNldCBmb3IgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIHNwZWNpYWwgSFAgY2hhbmdlciBsb2FkIGNvbW1hbmQuICAqLworI2RlZmluZSBNVF9TVF9IUExPQURFUl9PRkZTRVQgMTAwMDAKKworCisvKiBTcGVjaWZ5IGRlZmF1bHQgdGFwZSBkZXZpY2UuICAqLworI2lmbmRlZiBERUZUQVBFCisjIGRlZmluZSBERUZUQVBFCSIvZGV2L3RhcGUiCisjZW5kaWYKKworI2VuZGlmIC8qIG10aW8uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wYXJhbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOGY1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3BhcmFtLmgKQEAgLTAsMCArMSw4MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsMjAwMCwyMDAxLDIwMDMsMjAwOCwyMDExCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1BBUkFNX0gKKyNkZWZpbmUgX1NZU19QQVJBTV9ICTEKKworI2lmbmRlZiBBUkdfTUFYCisjIGRlZmluZSBfX3VuZGVmX0FSR19NQVgKKyNlbmRpZgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKworLyogVGhlIGtlcm5lbCBoZWFkZXJzIGRlZmluZXMgQVJHX01BWC4gIFRoZSB2YWx1ZSBpcyB3cm9uZywgdGhvdWdoLiAgKi8KKyNpZmRlZiBfX3VuZGVmX0FSR19NQVgKKyMgdW5kZWYgQVJHX01BWAorIyB1bmRlZiBfX3VuZGVmX0FSR19NQVgKKyNlbmRpZgorCisvKiBCU0QgbmFtZXMgZm9yIHNvbWUgPGxpbWl0cy5oPiB2YWx1ZXMuICAqLworCisjZGVmaW5lCU5CQlkJCUNIQVJfQklUCisjaWZuZGVmCU5HUk9VUFMKKyMgZGVmaW5lIE5HUk9VUFMJTkdST1VQU19NQVgKKyNlbmRpZgorI2RlZmluZQlNQVhTWU1MSU5LUwkyMAorI2RlZmluZQlDQU5CU0laCQlNQVhfQ0FOT04KKyNkZWZpbmUgTUFYUEFUSExFTglQQVRIX01BWAorLyogVGhlIGZvbGxvd2luZyBhcmUgbm90IHJlYWxseSBjb3JyZWN0IGJ1dCBpdCBpcyBhIHZhbHVlIHdlIHVzZWQgZm9yIGEKKyAgIGxvbmcgdGltZSBhbmQgd2hpY2ggc2VlbXMgdG8gYmUgdXNhYmxlLiAgUGVvcGxlIHNob3VsZCBub3QgdXNlIE5PRklMRQorICAgYW5kIE5DQVJHUyBhbnl3YXkuICAqLworI2RlZmluZSBOT0ZJTEUJCTI1NgorI2RlZmluZQlOQ0FSR1MJCTEzMTA3MgorCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogQml0IG1hcCByZWxhdGVkIG1hY3Jvcy4gICovCisjZGVmaW5lCXNldGJpdChhLGkpCSgoYSlbKGkpL05CQlldIHw9IDE8PCgoaSklTkJCWSkpCisjZGVmaW5lCWNscmJpdChhLGkpCSgoYSlbKGkpL05CQlldICY9IH4oMTw8KChpKSVOQkJZKSkpCisjZGVmaW5lCWlzc2V0KGEsaSkJKChhKVsoaSkvTkJCWV0gJiAoMTw8KChpKSVOQkJZKSkpCisjZGVmaW5lCWlzY2xyKGEsaSkJKCgoYSlbKGkpL05CQlldICYgKDE8PCgoaSklTkJCWSkpKSA9PSAwKQorCisvKiBNYWNyb3MgZm9yIGNvdW50aW5nIGFuZCByb3VuZGluZy4gICovCisjaWZuZGVmIGhvd21hbnkKKyMgZGVmaW5lIGhvd21hbnkoeCwgeSkJKCgoeCkgKyAoKHkpIC0gMSkpIC8gKHkpKQorI2VuZGlmCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIHJvdW5kdXAoeCwgeSkJKF9fYnVpbHRpbl9jb25zdGFudF9wICh5KSAmJiBwb3dlcm9mMiAoeSkJICAgICAgXAorCQkJID8gKCgoeCkgKyAoeSkgLSAxKSAmIH4oKHkpIC0gMSkpCQkgICAgICBcCisJCQkgOiAoKCgoeCkgKyAoKHkpIC0gMSkpIC8gKHkpKSAqICh5KSkpCisjZWxzZQorIyBkZWZpbmUgcm91bmR1cCh4LCB5KQkoKCgoeCkgKyAoKHkpIC0gMSkpIC8gKHkpKSAqICh5KSkKKyNlbmRpZgorI2RlZmluZSBwb3dlcm9mMih4KQkoKCgoeCkgLSAxKSAmICh4KSkgPT0gMCkKKworLyogTWFjcm9zIGZvciBtaW4vbWF4LiAgKi8KKyNkZWZpbmUJTUlOKGEsYikgKCgoYSk8KGIpKT8oYSk6KGIpKQorI2RlZmluZQlNQVgoYSxiKSAoKChhKT4oYikpPyhhKTooYikpCisKKworLyogVW5pdCBvZiBgc3RfYmxvY2tzJy4gICovCisjZGVmaW5lIERFVl9CU0laRSAgICAgICA1MTIKKworCisjZW5kaWYJLyogc3lzL3BhcmFtLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcGNpLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjYyNjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3BjaS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1BDSV9ICisjZGVmaW5lIF9TWVNfUENJX0gJMQorCisvKiBXZSB1c2UgdGhlIGNvbnN0YW50cyBmcm9tIHRoZSBrZXJuZWwuICAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjZW5kaWYgLyogc3lzL3BjaS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Blcm0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcGVybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MmZhOTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Blcm0uaApAQCAtMCwwICsxLDM2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTksIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19QRVJNX0gKKworI2RlZmluZSBfU1lTX1BFUk1fSAkxCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBTZXQgcG9ydCBpbnB1dC9vdXRwdXQgcGVybWlzc2lvbnMuICAqLworZXh0ZXJuIGludCBpb3Blcm0gKHVuc2lnbmVkIGxvbmcgaW50IF9fZnJvbSwgdW5zaWduZWQgbG9uZyBpbnQgX19udW0sCisJCSAgIGludCBfX3R1cm5fb24pIF9fVEhST1c7CisKKworLyogQ2hhbmdlIEkvTyBwcml2aWxlZ2UgbGV2ZWwuICAqLworZXh0ZXJuIGludCBpb3BsIChpbnQgX19sZXZlbCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIF9TWVNfUEVSTV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3BlcnNvbmFsaXR5LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3BlcnNvbmFsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzYTRlZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcGVyc29uYWxpdHkuaApAQCAtMCwwICsxLDc4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFRha2VuIHZlcmJhdGltIGZyb20gTGludXggMi42IChpbmNsdWRlL2xpbnV4L3BlcnNvbmFsaXR5LmgpLiAgKi8KKworI2lmbmRlZiBfU1lTX1BFUlNPTkFMSVRZX0gKKyNkZWZpbmUgX1NZU19QRVJTT05BTElUWV9IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEZsYWdzIGZvciBidWcgZW11bGF0aW9uLgorICAgVGhlc2Ugb2NjdXB5IHRoZSB0b3AgdGhyZWUgYnl0ZXMuICAqLworZW51bQorICB7CisgICAgQUREUl9OT19SQU5ET01JWkUgPSAweDAwNDAwMDAsCisgICAgTU1BUF9QQUdFX1pFUk8gPSAweDAxMDAwMDAsCisgICAgQUREUl9DT01QQVRfTEFZT1VUID0gMHgwMjAwMDAwLAorICAgIFJFQURfSU1QTElFU19FWEVDID0gMHgwNDAwMDAwLAorICAgIEFERFJfTElNSVRfMzJCSVQgPSAweDA4MDAwMDAsCisgICAgU0hPUlRfSU5PREUgPSAweDEwMDAwMDAsCisgICAgV0hPTEVfU0VDT05EUyA9IDB4MjAwMDAwMCwKKyAgICBTVElDS1lfVElNRU9VVFMgPSAweDQwMDAwMDAsCisgICAgQUREUl9MSU1JVF8zR0IgPSAJMHg4MDAwMDAwCisgIH07CisKKy8qIFBlcnNvbmFsaXR5IHR5cGVzLgorCisgICBUaGVzZSBnbyBpbiB0aGUgbG93IGJ5dGUuICBBdm9pZCB1c2luZyB0aGUgdG9wIGJpdCwgaXQgd2lsbAorICAgY29uZmxpY3Qgd2l0aCBlcnJvciByZXR1cm5zLiAgKi8KK2VudW0gCisgIHsKKyAgICBQRVJfTElOVVggPSAweDAwMDAsCisgICAgUEVSX0xJTlVYXzMyQklUID0gMHgwMDAwIHwgQUREUl9MSU1JVF8zMkJJVCwKKyAgICBQRVJfU1ZSNCA9IDB4MDAwMSB8IFNUSUNLWV9USU1FT1VUUyB8IE1NQVBfUEFHRV9aRVJPLAorICAgIFBFUl9TVlIzID0gMHgwMDAyIHwgU1RJQ0tZX1RJTUVPVVRTIHwgU0hPUlRfSU5PREUsCisgICAgUEVSX1NDT1NWUjMgPSAweDAwMDMgfCBTVElDS1lfVElNRU9VVFMgfCBXSE9MRV9TRUNPTkRTIHwgU0hPUlRfSU5PREUsCisgICAgUEVSX09TUjUgPSAweDAwMDMgfCBTVElDS1lfVElNRU9VVFMgfCBXSE9MRV9TRUNPTkRTLAorICAgIFBFUl9XWVNFVjM4NiA9IDB4MDAwNCB8IFNUSUNLWV9USU1FT1VUUyB8IFNIT1JUX0lOT0RFLAorICAgIFBFUl9JU0NSNCA9IDB4MDAwNSB8IFNUSUNLWV9USU1FT1VUUywKKyAgICBQRVJfQlNEID0gMHgwMDA2LAorICAgIFBFUl9TVU5PUyA9IDB4MDAwNiB8IFNUSUNLWV9USU1FT1VUUywKKyAgICBQRVJfWEVOSVggPSAweDAwMDcgfCBTVElDS1lfVElNRU9VVFMgfCBTSE9SVF9JTk9ERSwKKyAgICBQRVJfTElOVVgzMiA9IDB4MDAwOCwKKyAgICBQRVJfTElOVVgzMl8zR0IgPSAweDAwMDggfCBBRERSX0xJTUlUXzNHQiwKKyAgICBQRVJfSVJJWDMyID0gMHgwMDA5IHwgU1RJQ0tZX1RJTUVPVVRTLAkvKiBJUklYNSAzMi1iaXQgKi8KKyAgICBQRVJfSVJJWE4zMiA9IDB4MDAwYSB8IFNUSUNLWV9USU1FT1VUUywJLyogSVJJWDYgbmV3IDMyLWJpdCAqLworICAgIFBFUl9JUklYNjQgPSAweDAwMGIgfCBTVElDS1lfVElNRU9VVFMsCS8qIElSSVg2IDY0LWJpdCAqLworICAgIFBFUl9SSVNDT1MgPSAweDAwMGMsCisgICAgUEVSX1NPTEFSSVMgPSAweDAwMGQgfCBTVElDS1lfVElNRU9VVFMsCisgICAgUEVSX1VXNyA9IDB4MDAwZSB8IFNUSUNLWV9USU1FT1VUUyB8IE1NQVBfUEFHRV9aRVJPLAorICAgIFBFUl9PU0Y0ID0gMHgwMDBmLAorICAgIFBFUl9IUFVYID0gMHgwMDEwLAorICAgIFBFUl9NQVNLID0gMHgwMGZmLAorICB9OworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFNldCBkaWZmZXJlbnQgQUJJcyAocGVyc29uYWxpdGllcykuICAqLworZXh0ZXJuIGludCBwZXJzb25hbGl0eSAodW5zaWduZWQgbG9uZyBpbnQgX19wZXJzb25hKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3BlcnNvbmFsaXR5LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcG9sbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4NWI3OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcG9sbC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIENvbXBhdGliaWxpdHkgZGVmaW5pdGlvbnMgZm9yIFN5c3RlbSBWIGBwb2xsJyBpbnRlcmZhY2UuCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsMTk5Ni0yMDAxLDIwMDQsMjAwNSwyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfUE9MTF9ICisjZGVmaW5lCV9TWVNfUE9MTF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCB0aGUgcGxhdGZvcm0gZGVwZW5kZW50IGJpdHMgb2YgYHBvbGwnLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3BvbGwuaD4KKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEdldCB0aGUgX19zaWdzZXRfdCBkZWZpbml0aW9uLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9zaWdzZXQuaD4KKy8qIEdldCB0aGUgdGltZXNwZWMgZGVmaW5pdGlvbi4gICovCisjIGRlZmluZSBfX25lZWRfdGltZXNwZWMKKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisKKworLyogVHlwZSB1c2VkIGZvciB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMuICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBuZmRzX3Q7CisKKy8qIERhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgYSBwb2xsaW5nIHJlcXVlc3QuICAqLworc3RydWN0IHBvbGxmZAorICB7CisgICAgaW50IGZkOwkJCS8qIEZpbGUgZGVzY3JpcHRvciB0byBwb2xsLiAgKi8KKyAgICBzaG9ydCBpbnQgZXZlbnRzOwkJLyogVHlwZXMgb2YgZXZlbnRzIHBvbGxlciBjYXJlcyBhYm91dC4gICovCisgICAgc2hvcnQgaW50IHJldmVudHM7CQkvKiBUeXBlcyBvZiBldmVudHMgdGhhdCBhY3R1YWxseSBvY2N1cnJlZC4gICovCisgIH07CisKKworX19CRUdJTl9ERUNMUworCisvKiBQb2xsIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGRlc2NyaWJlZCBieSB0aGUgTkZEUyBzdHJ1Y3R1cmVzIHN0YXJ0aW5nIGF0CisgICBGRFMuICBJZiBUSU1FT1VUIGlzIG5vbnplcm8gYW5kIG5vdCAtMSwgYWxsb3cgVElNRU9VVCBtaWxsaXNlY29uZHMgZm9yCisgICBhbiBldmVudCB0byBvY2N1cjsgaWYgVElNRU9VVCBpcyAtMSwgYmxvY2sgdW50aWwgYW4gZXZlbnQgb2NjdXJzLgorICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgd2l0aCBldmVudHMsIHplcm8gaWYgdGltZWQgb3V0LAorICAgb3IgLTEgZm9yIGVycm9ycy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHBvbGwgKHN0cnVjdCBwb2xsZmQgKl9fZmRzLCBuZmRzX3QgX19uZmRzLCBpbnQgX190aW1lb3V0KTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogTGlrZSBwb2xsLCBidXQgYmVmb3JlIHdhaXRpbmcgdGhlIHRocmVhZHMgc2lnbmFsIG1hc2sgaXMgcmVwbGFjZWQKKyAgIHdpdGggdGhhdCBzcGVjaWZpZWQgaW4gdGhlIGZvdXJ0aCBwYXJhbWV0ZXIuICBGb3IgYmV0dGVyIHVzYWJpbGl0eSwKKyAgIHRoZSB0aW1lb3V0IHZhbHVlIGlzIHNwZWNpZmllZCB1c2luZyBhIFRJTUVTUEVDIG9iamVjdC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHBwb2xsIChzdHJ1Y3QgcG9sbGZkICpfX2ZkcywgbmZkc190IF9fbmZkcywKKwkJICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX190aW1lb3V0LAorCQkgIF9fY29uc3QgX19zaWdzZXRfdCAqX19zcyk7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy9wb2xsLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcHJjdGwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcHJjdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTliNzJkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wcmN0bC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1BSQ1RMX0gKKyNkZWZpbmUgX1NZU19QUkNUTF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8bGludXgvcHJjdGwuaD4gIC8qICBUaGUgbWFnaWMgdmFsdWVzIGNvbWUgZnJvbSBoZXJlICAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIENvbnRyb2wgcHJvY2VzcyBleGVjdXRpb24uICAqLworZXh0ZXJuIGludCBwcmN0bCAoaW50IF9fb3B0aW9uLCAuLi4pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAgLyogc3lzL3ByY3RsLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcHJvY2ZzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Byb2Nmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1M2Q3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Byb2Nmcy5oCkBAIC0wLDAgKzEsMTQyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19QUk9DRlNfSAorI2RlZmluZSBfU1lTX1BST0NGU19ICTEKKworLyogVGhpcyBpcyBzb21ld2hhdCBtb2RlbGxlZCBhZnRlciB0aGUgZmlsZSBvZiB0aGUgc2FtZSBuYW1lIG9uIFNWUjQKKyAgIHN5c3RlbXMuICBJdCBwcm92aWRlcyBhIGRlZmluaXRpb24gb2YgdGhlIGNvcmUgZmlsZSBmb3JtYXQgZm9yIEVMRgorICAgdXNlZCBvbiBMaW51eC4gIEl0IGRvZXNuJ3QgaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIHRoZSAvcHJvYyBmaWxlCisgICBzeXN0ZW0sIGV2ZW4gdGhvdWdoIExpbnV4IGhhcyBvbmUuCisKKyAgIEFueXdheSwgdGhlIHdob2xlIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIGZvciBHREIgYW5kIEdEQiBvbmx5LgorICAgRG9uJ3QgcmVhZCB0b28gbXVjaCBpbnRvIGl0LiAgRG9uJ3QgdXNlIGl0IGZvciBhbnl0aGluZyBvdGhlciB0aGFuCisgICBHREIgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4gICovCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUeXBlIGZvciBhIGdlbmVyYWwtcHVycG9zZSByZWdpc3Rlci4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZWxmX2dyZWdfdDsKKworLyogQW5kIHRoZSB3aG9sZSBidW5jaCBvZiB0aGVtLiAgV2UgY291bGQgaGF2ZSB1c2VkIGBzdHJ1Y3QKKyAgIHVzZXJfcmVnc19zdHJ1Y3QnIGRpcmVjdGx5IGluIHRoZSB0eXBlZGVmLCBidXQgdHJhZGl0aW9uIHNheXMgdGhhdAorICAgdGhlIHJlZ2lzdGVyIHNldCBpcyBhbiBhcnJheSwgd2hpY2ggZG9lcyBoYXZlIHNvbWUgcGVjdWxpYXIKKyAgIHNlbWFudGljcywgc28gbGVhdmUgaXQgdGhhdCB3YXkuICAqLworI2RlZmluZSBFTEZfTkdSRUcgKHNpemVvZiAoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QpIC8gc2l6ZW9mKGVsZl9ncmVnX3QpKQordHlwZWRlZiBlbGZfZ3JlZ190IGVsZl9ncmVnc2V0X3RbRUxGX05HUkVHXTsKKworI2lmIF9fV09SRFNJWkUgPT0gMzIKKy8qIFJlZ2lzdGVyIHNldCBmb3IgdGhlIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycy4gICovCit0eXBlZGVmIHN0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QgZWxmX2ZwcmVnc2V0X3Q7CisKKy8qIFJlZ2lzdGVyIHNldCBmb3IgdGhlIGV4dGVuZGVkIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycy4gIEluY2x1ZGVzCisgICB0aGUgUGVudGl1bSBJSUkgU1NFIHJlZ2lzdGVycyBpbiBhZGRpdGlvbiB0byB0aGUgY2xhc3NpYworICAgZmxvYXRpbmctcG9pbnQgc3R1ZmYuICAqLwordHlwZWRlZiBzdHJ1Y3QgdXNlcl9mcHhyZWdzX3N0cnVjdCBlbGZfZnB4cmVnc2V0X3Q7CisjZWxzZQorLyogUmVnaXN0ZXIgc2V0IGZvciB0aGUgZXh0ZW5kZWQgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzLiAgSW5jbHVkZXMKKyAgIHRoZSBQZW50aXVtIElJSSBTU0UgcmVnaXN0ZXJzIGluIGFkZGl0aW9uIHRvIHRoZSBjbGFzc2ljCisgICBmbG9hdGluZy1wb2ludCBzdHVmZi4gICovCit0eXBlZGVmIHN0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QgZWxmX2ZwcmVnc2V0X3Q7CisjZW5kaWYKKworLyogU2lnbmFsIGluZm8uICAqLworc3RydWN0IGVsZl9zaWdpbmZvCisgIHsKKyAgICBpbnQgc2lfc2lnbm87CQkJLyogU2lnbmFsIG51bWJlci4gICovCisgICAgaW50IHNpX2NvZGU7CQkJLyogRXh0cmEgY29kZS4gICovCisgICAgaW50IHNpX2Vycm5vOwkJCS8qIEVycm5vLiAgKi8KKyAgfTsKKworCisvKiBEZWZpbml0aW9ucyB0byBnZW5lcmF0ZSBJbnRlbCBTVlI0LWxpa2UgY29yZSBmaWxlcy4gIFRoZXNlIG1vc3RseQorICAgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgU1ZSNCB0eXBlcyB3aXRoICJlbGZfIiB0YWNrZWQgb24gdGhlCisgICBmcm9udCB0byBwcmV2ZW50IGNsYXNoZXMgd2l0aCBMaW51eCBkZWZpbml0aW9ucywgYW5kIHRoZSB0eXBlZGVmCisgICBmb3JtcyBoYXZlIGJlZW4gYXZvaWRlZC4gIFRoaXMgaXMgbW9zdGx5IGxpa2UgdGhlIFNWUjQgc3RydWN0dXJlLAorICAgYnV0IG1vcmUgTGludXh5LCB3aXRoIHRoaW5ncyB0aGF0IExpbnV4IGRvZXMgbm90IHN1cHBvcnQgYW5kIHdoaWNoCisgICBHREIgZG9lc24ndCByZWFsbHkgdXNlIGV4Y2x1ZGVkLiAgKi8KKworc3RydWN0IGVsZl9wcnN0YXR1cworICB7CisgICAgc3RydWN0IGVsZl9zaWdpbmZvIHByX2luZm87CQkvKiBJbmZvIGFzc29jaWF0ZWQgd2l0aCBzaWduYWwuICAqLworICAgIHNob3J0IGludCBwcl9jdXJzaWc7CQkvKiBDdXJyZW50IHNpZ25hbC4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgcHJfc2lncGVuZDsJLyogU2V0IG9mIHBlbmRpbmcgc2lnbmFscy4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgcHJfc2lnaG9sZDsJLyogU2V0IG9mIGhlbGQgc2lnbmFscy4gICovCisgICAgX19waWRfdCBwcl9waWQ7CisgICAgX19waWRfdCBwcl9wcGlkOworICAgIF9fcGlkX3QgcHJfcGdycDsKKyAgICBfX3BpZF90IHByX3NpZDsKKyAgICBzdHJ1Y3QgdGltZXZhbCBwcl91dGltZTsJCS8qIFVzZXIgdGltZS4gICovCisgICAgc3RydWN0IHRpbWV2YWwgcHJfc3RpbWU7CQkvKiBTeXN0ZW0gdGltZS4gICovCisgICAgc3RydWN0IHRpbWV2YWwgcHJfY3V0aW1lOwkJLyogQ3VtdWxhdGl2ZSB1c2VyIHRpbWUuICAqLworICAgIHN0cnVjdCB0aW1ldmFsIHByX2NzdGltZTsJCS8qIEN1bXVsYXRpdmUgc3lzdGVtIHRpbWUuICAqLworICAgIGVsZl9ncmVnc2V0X3QgcHJfcmVnOwkJLyogR1AgcmVnaXN0ZXJzLiAgKi8KKyAgICBpbnQgcHJfZnB2YWxpZDsJCQkvKiBUcnVlIGlmIG1hdGggY29wcm8gYmVpbmcgdXNlZC4gICovCisgIH07CisKKworI2RlZmluZSBFTEZfUFJBUkdTWiAgICAgKDgwKSAgICAvKiBOdW1iZXIgb2YgY2hhcnMgZm9yIGFyZ3MuICAqLworCitzdHJ1Y3QgZWxmX3BycHNpbmZvCisgIHsKKyAgICBjaGFyIHByX3N0YXRlOwkJCS8qIE51bWVyaWMgcHJvY2VzcyBzdGF0ZS4gICovCisgICAgY2hhciBwcl9zbmFtZTsJCQkvKiBDaGFyIGZvciBwcl9zdGF0ZS4gICovCisgICAgY2hhciBwcl96b21iOwkJCS8qIFpvbWJpZS4gICovCisgICAgY2hhciBwcl9uaWNlOwkJCS8qIE5pY2UgdmFsLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBwcl9mbGFnOwkJLyogRmxhZ3MuICAqLworI2lmIF9fV09SRFNJWkUgPT0gMzIKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgcHJfdWlkOworICAgIHVuc2lnbmVkIHNob3J0IGludCBwcl9naWQ7CisjZWxzZQorICAgIHVuc2lnbmVkIGludCBwcl91aWQ7CisgICAgdW5zaWduZWQgaW50IHByX2dpZDsKKyNlbmRpZgorICAgIGludCBwcl9waWQsIHByX3BwaWQsIHByX3BncnAsIHByX3NpZDsKKyAgICAvKiBMb3RzIG1pc3NpbmcgKi8KKyAgICBjaGFyIHByX2ZuYW1lWzE2XTsJCQkvKiBGaWxlbmFtZSBvZiBleGVjdXRhYmxlLiAgKi8KKyAgICBjaGFyIHByX3BzYXJnc1tFTEZfUFJBUkdTWl07CS8qIEluaXRpYWwgcGFydCBvZiBhcmcgbGlzdC4gICovCisgIH07CisKKworLyogVGhlIHJlc3Qgb2YgdGhpcyBmaWxlIHByb3ZpZGVzIHRoZSB0eXBlcyBmb3IgZW11bGF0aW9uIG9mIHRoZQorICAgU29sYXJpcyA8cHJvY19zZXJ2aWNlLmg+IGludGVyZmFjZXMgdGhhdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkKKyAgIHVzZXJzIG9mIGxpYnRocmVhZF9kYi4gICovCisKKy8qIEFkZHJlc3Nlcy4gICovCit0eXBlZGVmIHZvaWQgKnBzYWRkcl90OworCisvKiBSZWdpc3RlciBzZXRzLiAgTGludXggaGFzIGRpZmZlcmVudCBuYW1lcy4gICovCit0eXBlZGVmIGVsZl9ncmVnc2V0X3QgcHJncmVnc2V0X3Q7Cit0eXBlZGVmIGVsZl9mcHJlZ3NldF90IHByZnByZWdzZXRfdDsKKworLyogV2UgZG9uJ3QgaGF2ZSBhbnkgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcm9jZXNzZXMgYW5kIHRocmVhZHMsCisgICB0aGVyZWZvcmUgaGF2ZSBvbmx5IG9uZSBQSUQgdHlwZS4gICovCit0eXBlZGVmIF9fcGlkX3QgbHdwaWRfdDsKKworLyogUHJvY2VzcyBzdGF0dXMgYW5kIGluZm8uICBJbiB0aGUgZW5kIHdlIGRvIHByb3ZpZGUgdHlwZWRlZnMgZm9yIHRoZW0uICAqLwordHlwZWRlZiBzdHJ1Y3QgZWxmX3Byc3RhdHVzIHByc3RhdHVzX3Q7Cit0eXBlZGVmIHN0cnVjdCBlbGZfcHJwc2luZm8gcHJwc2luZm9fdDsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy9wcm9jZnMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wcm9maWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcHJvZmlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0OGVjNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcHJvZmlsLmgKQEAgLTAsMCArMSw2MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9QUk9GSUxfSAorI2RlZmluZSBfUFJPRklMX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgc3Byb2ZpbCgpIHN5c3RlbSBjYWxscyBhcworICAgZGVzY3JpYmVkIGJ5IHRoZSBzcHJvZmlsKDIpIG1hbiBwYWdlIG9mIElyaXggdjYuNSwgZXhjZXB0IHRoYXQ6CisKKwktIHRoZXJlIGlzIG5vIGEgcHJpb3JpIGxpbWl0IG9uIG51bWJlciBvZiB0ZXh0IHNlY3Rpb25zCisJLSBwcl9zY2FsZSBpcyBkZWNsYXJlZCBhcyB1bnNpZ25lZCBsb25nIChpbnN0ZWFkIG9mICJ1bnNpZ25lZCBpbnQiKQorCS0gcHJfc2l6ZSBpcyBkZWNsYXJlZCBhcyBzaXplX3QgKGluc3RlYWQgb2YgInVuc2lnbmVkIGludCIpCisJLSBwcl9vZmYgaXMgZGVjbGFyZWQgYXMgdm9pZCAqIChpbnN0ZWFkIG9mICJfX3BzdW5zaWduZWRfdCIpCisJLSB0aGUgb3ZlcmZsb3cgYmluIChwcl9iYXNlPT0wLCBwcl9zY2FsZT09MikgY2FuIGFwcGVhciBhbnl3aGVyZQorCSAgaW4gdGhlIHByb2ZwIGFycmF5CisJLSBQUk9GX0ZBU1QgaGFzIG5vIGVmZmVjdCAgKi8KKworc3RydWN0IHByb2YKKyAgeworICAgIHZvaWQgKnByX2Jhc2U7CQkvKiBidWZmZXIgYmFzZSAqLworICAgIHNpemVfdCBwcl9zaXplOwkJLyogYnVmZmVyIHNpemUgKi8KKyAgICBzaXplX3QgcHJfb2ZmOwkJLyogcGMgb2Zmc2V0ICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgcHJfc2NhbGU7CS8qIHBjIHNjYWxpbmcgKGZpeGVkLXBvaW50IG51bWJlcikgKi8KKyAgfTsKKworZW51bQorICB7CisgICAgUFJPRl9VU0hPUlQJPSAwLAkJLyogdXNlIDE2LWJpdCBjb3VudGVycyAoZGVmYXVsdCkgKi8KKyAgICBQUk9GX1VJTlQJPSAxIDw8IDAsCS8qIHVzZSAzMi1iaXQgY291bnRlcnMgKi8KKyAgICBQUk9GX0ZBU1QgICA9IDEgPDwgMQkvKiBwcm9maWxlIGZhc3RlciB0aGFuIHVzdWFsICovCisgIH07CisKKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IHNwcm9maWwgKHN0cnVjdCBwcm9mICpfX3Byb2ZwLCBpbnQgX19wcm9mY250LAorCQkgICAgc3RydWN0IHRpbWV2YWwgKl9fdHZwLCB1bnNpZ25lZCBpbnQgX19mbGFncykgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHByb2ZpbC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3B0cmFjZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBmMjk0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wdHJhY2UuaApAQCAtMCwwICsxLDE5NiBAQAorLyogYHB0cmFjZScgZGVidWdnZXIgc3VwcG9ydCBpbnRlcmZhY2UuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTksMjAwMCwyMDA2LDIwMDcsMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1BUUkFDRV9ICisjZGVmaW5lIF9TWVNfUFRSQUNFX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUeXBlIG9mIHRoZSBSRVFVRVNUIGFyZ3VtZW50IHRvIGBwdHJhY2UuJyAgKi8KK2VudW0gX19wdHJhY2VfcmVxdWVzdAoreworICAvKiBJbmRpY2F0ZSB0aGF0IHRoZSBwcm9jZXNzIG1ha2luZyB0aGlzIHJlcXVlc3Qgc2hvdWxkIGJlIHRyYWNlZC4KKyAgICAgQWxsIHNpZ25hbHMgcmVjZWl2ZWQgYnkgdGhpcyBwcm9jZXNzIGNhbiBiZSBpbnRlcmNlcHRlZCBieSBpdHMKKyAgICAgcGFyZW50LCBhbmQgaXRzIHBhcmVudCBjYW4gdXNlIHRoZSBvdGhlciBgcHRyYWNlJyByZXF1ZXN0cy4gICovCisgIFBUUkFDRV9UUkFDRU1FID0gMCwKKyNkZWZpbmUgUFRfVFJBQ0VfTUUgUFRSQUNFX1RSQUNFTUUKKworICAvKiBSZXR1cm4gdGhlIHdvcmQgaW4gdGhlIHByb2Nlc3MncyB0ZXh0IHNwYWNlIGF0IGFkZHJlc3MgQUREUi4gICovCisgIFBUUkFDRV9QRUVLVEVYVCA9IDEsCisjZGVmaW5lIFBUX1JFQURfSSBQVFJBQ0VfUEVFS1RFWFQKKworICAvKiBSZXR1cm4gdGhlIHdvcmQgaW4gdGhlIHByb2Nlc3MncyBkYXRhIHNwYWNlIGF0IGFkZHJlc3MgQUREUi4gICovCisgIFBUUkFDRV9QRUVLREFUQSA9IDIsCisjZGVmaW5lIFBUX1JFQURfRCBQVFJBQ0VfUEVFS0RBVEEKKworICAvKiBSZXR1cm4gdGhlIHdvcmQgaW4gdGhlIHByb2Nlc3MncyB1c2VyIGFyZWEgYXQgb2Zmc2V0IEFERFIuICAqLworICBQVFJBQ0VfUEVFS1VTRVIgPSAzLAorI2RlZmluZSBQVF9SRUFEX1UgUFRSQUNFX1BFRUtVU0VSCisKKyAgLyogV3JpdGUgdGhlIHdvcmQgREFUQSBpbnRvIHRoZSBwcm9jZXNzJ3MgdGV4dCBzcGFjZSBhdCBhZGRyZXNzIEFERFIuICAqLworICBQVFJBQ0VfUE9LRVRFWFQgPSA0LAorI2RlZmluZSBQVF9XUklURV9JIFBUUkFDRV9QT0tFVEVYVAorCisgIC8qIFdyaXRlIHRoZSB3b3JkIERBVEEgaW50byB0aGUgcHJvY2VzcydzIGRhdGEgc3BhY2UgYXQgYWRkcmVzcyBBRERSLiAgKi8KKyAgUFRSQUNFX1BPS0VEQVRBID0gNSwKKyNkZWZpbmUgUFRfV1JJVEVfRCBQVFJBQ0VfUE9LRURBVEEKKworICAvKiBXcml0ZSB0aGUgd29yZCBEQVRBIGludG8gdGhlIHByb2Nlc3MncyB1c2VyIGFyZWEgYXQgb2Zmc2V0IEFERFIuICAqLworICBQVFJBQ0VfUE9LRVVTRVIgPSA2LAorI2RlZmluZSBQVF9XUklURV9VIFBUUkFDRV9QT0tFVVNFUgorCisgIC8qIENvbnRpbnVlIHRoZSBwcm9jZXNzLiAgKi8KKyAgUFRSQUNFX0NPTlQgPSA3LAorI2RlZmluZSBQVF9DT05USU5VRSBQVFJBQ0VfQ09OVAorCisgIC8qIEtpbGwgdGhlIHByb2Nlc3MuICAqLworICBQVFJBQ0VfS0lMTCA9IDgsCisjZGVmaW5lIFBUX0tJTEwgUFRSQUNFX0tJTEwKKworICAvKiBTaW5nbGUgc3RlcCB0aGUgcHJvY2Vzcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgIFBUUkFDRV9TSU5HTEVTVEVQID0gOSwKKyNkZWZpbmUgUFRfU1RFUCBQVFJBQ0VfU0lOR0xFU1RFUAorCisgIC8qIEdldCBhbGwgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkIGJ5IGEgcHJvY2Vzc2VzLgorICAgICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIG1hY2hpbmVzLiAgKi8KKyAgIFBUUkFDRV9HRVRSRUdTID0gMTIsCisjZGVmaW5lIFBUX0dFVFJFR1MgUFRSQUNFX0dFVFJFR1MKKworICAvKiBTZXQgYWxsIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgdXNlZCBieSBhIHByb2Nlc3Nlcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgICBQVFJBQ0VfU0VUUkVHUyA9IDEzLAorI2RlZmluZSBQVF9TRVRSRUdTIFBUUkFDRV9TRVRSRUdTCisKKyAgLyogR2V0IGFsbCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdXNlZCBieSBhIHByb2Nlc3Nlcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgICBQVFJBQ0VfR0VURlBSRUdTID0gMTQsCisjZGVmaW5lIFBUX0dFVEZQUkVHUyBQVFJBQ0VfR0VURlBSRUdTCisKKyAgLyogU2V0IGFsbCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdXNlZCBieSBhIHByb2Nlc3Nlcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgICBQVFJBQ0VfU0VURlBSRUdTID0gMTUsCisjZGVmaW5lIFBUX1NFVEZQUkVHUyBQVFJBQ0VfU0VURlBSRUdTCisKKyAgLyogQXR0YWNoIHRvIGEgcHJvY2VzcyB0aGF0IGlzIGFscmVhZHkgcnVubmluZy4gKi8KKyAgUFRSQUNFX0FUVEFDSCA9IDE2LAorI2RlZmluZSBQVF9BVFRBQ0ggUFRSQUNFX0FUVEFDSAorCisgIC8qIERldGFjaCBmcm9tIGEgcHJvY2VzcyBhdHRhY2hlZCB0byB3aXRoIFBUUkFDRV9BVFRBQ0guICAqLworICBQVFJBQ0VfREVUQUNIID0gMTcsCisjZGVmaW5lIFBUX0RFVEFDSCBQVFJBQ0VfREVUQUNICisKKyAgLyogR2V0IGFsbCBleHRlbmRlZCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdXNlZCBieSBhIHByb2Nlc3Nlcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgICBQVFJBQ0VfR0VURlBYUkVHUyA9IDE4LAorI2RlZmluZSBQVF9HRVRGUFhSRUdTIFBUUkFDRV9HRVRGUFhSRUdTCisKKyAgLyogU2V0IGFsbCBleHRlbmRlZCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdXNlZCBieSBhIHByb2Nlc3Nlcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgICBQVFJBQ0VfU0VURlBYUkVHUyA9IDE5LAorI2RlZmluZSBQVF9TRVRGUFhSRUdTIFBUUkFDRV9TRVRGUFhSRUdTCisKKyAgLyogQ29udGludWUgYW5kIHN0b3AgYXQgdGhlIG5leHQgKHJldHVybiBmcm9tKSBzeXNjYWxsLiAgKi8KKyAgUFRSQUNFX1NZU0NBTEwgPSAyNCwKKyNkZWZpbmUgUFRfU1lTQ0FMTCBQVFJBQ0VfU1lTQ0FMTAorCisgIC8qIFNldCBwdHJhY2UgZmlsdGVyIG9wdGlvbnMuICAqLworICBQVFJBQ0VfU0VUT1BUSU9OUyA9IDB4NDIwMCwKKyNkZWZpbmUgUFRfU0VUT1BUSU9OUyBQVFJBQ0VfU0VUT1BUSU9OUworCisgIC8qIEdldCBsYXN0IHB0cmFjZSBtZXNzYWdlLiAgKi8KKyAgUFRSQUNFX0dFVEVWRU5UTVNHID0gMHg0MjAxLAorI2RlZmluZSBQVF9HRVRFVkVOVE1TRyBQVFJBQ0VfR0VURVZFTlRNU0cKKworICAvKiBHZXQgc2lnaW5mbyBmb3IgcHJvY2Vzcy4gICovCisgIFBUUkFDRV9HRVRTSUdJTkZPID0gMHg0MjAyLAorI2RlZmluZSBQVF9HRVRTSUdJTkZPIFBUUkFDRV9HRVRTSUdJTkZPCisKKyAgLyogU2V0IG5ldyBzaWdpbmZvIGZvciBwcm9jZXNzLiAgKi8KKyAgUFRSQUNFX1NFVFNJR0lORk8gPSAweDQyMDMsCisjZGVmaW5lIFBUX1NFVFNJR0lORk8gUFRSQUNFX1NFVFNJR0lORk8KKworICAvKiBHZXQgcmVnaXN0ZXIgY29udGVudC4gICovCisgIFBUUkFDRV9HRVRSRUdTRVQgPSAweDQyMDQsCisjZGVmaW5lIFBUUkFDRV9HRVRSRUdTRVQgUFRSQUNFX0dFVFJFR1NFVAorCisgIC8qIFNldCByZWdpc3RlciBjb250ZW50LiAgKi8KKyAgUFRSQUNFX1NFVFJFR1NFVCA9IDB4NDIwNSwKKyNkZWZpbmUgUFRSQUNFX1NFVFJFR1NFVCBQVFJBQ0VfU0VUUkVHU0VUCisKKyAgLyogTGlrZSBQVFJBQ0VfQVRUQUNILCBidXQgZG8gbm90IGZvcmNlIHRyYWNlZSB0byB0cmFwIGFuZCBkbyBub3QgYWZmZWN0CisgICAgIHNpZ25hbCBvciBncm91cCBzdG9wIHN0YXRlLiAgKi8KKyAgUFRSQUNFX1NFSVpFID0gMHg0MjA2LAorI2RlZmluZSBQVFJBQ0VfU0VJWkUgUFRSQUNFX1NFSVpFCisKKyAgLyogVHJhcCBzZWl6ZWQgdHJhY2VlLiAgKi8KKyAgUFRSQUNFX0lOVEVSUlVQVCA9IDB4NDIwNywKKyNkZWZpbmUgUFRSQUNFX0lOVEVSUlVQVCBQVFJBQ0VfSU5URVJSVVBUCisKKyAgLyogV2FpdCBmb3IgbmV4dCBncm91cCBldmVudC4gICovCisgIFBUUkFDRV9MSVNURU4gPSAweDQyMDgKK307CisKKworLyogRmxhZyBmb3IgUFRSQUNFX0xJU1RFTi4gICovCitlbnVtIF9fcHRyYWNlX2ZsYWdzCit7CisgIFBUUkFDRV9TRUlaRV9ERVZFTCA9IDB4ODAwMDAwMDAKK307CisKKy8qIE9wdGlvbnMgc2V0IHVzaW5nIFBUUkFDRV9TRVRPUFRJT05TLiAgKi8KK2VudW0gX19wdHJhY2Vfc2V0b3B0aW9ucworeworICBQVFJBQ0VfT19UUkFDRVNZU0dPT0QJPSAweDAwMDAwMDAxLAorICBQVFJBQ0VfT19UUkFDRUZPUksJPSAweDAwMDAwMDAyLAorICBQVFJBQ0VfT19UUkFDRVZGT1JLICAgPSAweDAwMDAwMDA0LAorICBQVFJBQ0VfT19UUkFDRUNMT05FCT0gMHgwMDAwMDAwOCwKKyAgUFRSQUNFX09fVFJBQ0VFWEVDCT0gMHgwMDAwMDAxMCwKKyAgUFRSQUNFX09fVFJBQ0VWRk9SS0RPTkUgPSAweDAwMDAwMDIwLAorICBQVFJBQ0VfT19UUkFDRUVYSVQJPSAweDAwMDAwMDQwLAorICBQVFJBQ0VfT19NQVNLCQk9IDB4MDAwMDAwN2YKK307CisKKy8qIFdhaXQgZXh0ZW5kZWQgcmVzdWx0IGNvZGVzIGZvciB0aGUgYWJvdmUgdHJhY2Ugb3B0aW9ucy4gICovCitlbnVtIF9fcHRyYWNlX2V2ZW50Y29kZXMKK3sKKyAgUFRSQUNFX0VWRU5UX0ZPUksJPSAxLAorICBQVFJBQ0VfRVZFTlRfVkZPUksJPSAyLAorICBQVFJBQ0VfRVZFTlRfQ0xPTkUJPSAzLAorICBQVFJBQ0VfRVZFTlRfRVhFQwk9IDQsCisgIFBUUkFDRV9FVkVOVF9WRk9SS19ET05FID0gNSwKKyAgUFRSQUNFX0VWRU5UX0VYSVQJPSA2Cit9OworCisvKiBQZXJmb3JtIHByb2Nlc3MgdHJhY2luZyBmdW5jdGlvbnMuICBSRVFVRVNUIGlzIG9uZSBvZiB0aGUgdmFsdWVzCisgICBhYm92ZSwgYW5kIGRldGVybWluZXMgdGhlIGFjdGlvbiB0byBiZSB0YWtlbi4KKyAgIEZvciBhbGwgcmVxdWVzdHMgZXhjZXB0IFBUUkFDRV9UUkFDRU1FLCBQSUQgc3BlY2lmaWVzIHRoZSBwcm9jZXNzIHRvIGJlCisgICB0cmFjZWQuCisKKyAgIFBJRCBhbmQgdGhlIG90aGVyIGFyZ3VtZW50cyBkZXNjcmliZWQgYWJvdmUgZm9yIHRoZSB2YXJpb3VzIHJlcXVlc3RzIHNob3VsZAorICAgYXBwZWFyICh0aG9zZSB0aGF0IGFyZSB1c2VkIGZvciB0aGUgcGFydGljdWxhciByZXF1ZXN0KSBhczoKKyAgICAgcGlkX3QgUElELCB2b2lkICpBRERSLCBpbnQgREFUQSwgdm9pZCAqQUREUjIKKyAgIGFmdGVyIFJFUVVFU1QuICAqLworZXh0ZXJuIGxvbmcgaW50IHB0cmFjZSAoZW51bSBfX3B0cmFjZV9yZXF1ZXN0IF9fcmVxdWVzdCwgLi4uKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX1NZU19QVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9xdWV1ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjQ1NTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3F1ZXVlLmgKQEAgLTAsMCArMSw1NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpcXVldWUuaAk4LjUgKEJlcmtlbGV5KSA4LzIwLzk0CisgKi8KKworI2lmbmRlZglfU1lTX1FVRVVFX0hfCisjZGVmaW5lCV9TWVNfUVVFVUVfSF8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGZpdmUgdHlwZXMgb2YgZGF0YSBzdHJ1Y3R1cmVzOiBzaW5nbHktbGlua2VkIGxpc3RzLAorICogbGlzdHMsIHNpbXBsZSBxdWV1ZXMsIHRhaWwgcXVldWVzLCBhbmQgY2lyY3VsYXIgcXVldWVzLgorICoKKyAqIEEgc2luZ2x5LWxpbmtlZCBsaXN0IGlzIGhlYWRlZCBieSBhIHNpbmdsZSBmb3J3YXJkIHBvaW50ZXIuIFRoZQorICogZWxlbWVudHMgYXJlIHNpbmdseSBsaW5rZWQgZm9yIG1pbmltdW0gc3BhY2UgYW5kIHBvaW50ZXIgbWFuaXB1bGF0aW9uCisgKiBvdmVyaGVhZCBhdCB0aGUgZXhwZW5zZSBvZiBPKG4pIHJlbW92YWwgZm9yIGFyYml0cmFyeSBlbGVtZW50cy4gTmV3CisgKiBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCBvciBhdCB0aGUKKyAqIGhlYWQgb2YgdGhlIGxpc3QuICBFbGVtZW50cyBiZWluZyByZW1vdmVkIGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpc3QKKyAqIHNob3VsZCB1c2UgdGhlIGV4cGxpY2l0IG1hY3JvIGZvciB0aGlzIHB1cnBvc2UgZm9yIG9wdGltdW0KKyAqIGVmZmljaWVuY3kuIEEgc2luZ2x5LWxpbmtlZCBsaXN0IG1heSBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZAorICogZGlyZWN0aW9uLiAgU2luZ2x5LWxpbmtlZCBsaXN0cyBhcmUgaWRlYWwgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxhcmdlCisgKiBkYXRhc2V0cyBhbmQgZmV3IG9yIG5vIHJlbW92YWxzIG9yIGZvciBpbXBsZW1lbnRpbmcgYSBMSUZPIHF1ZXVlLgorICoKKyAqIEEgbGlzdCBpcyBoZWFkZWQgYnkgYSBzaW5nbGUgZm9yd2FyZCBwb2ludGVyIChvciBhbiBhcnJheSBvZiBmb3J3YXJkCisgKiBwb2ludGVycyBmb3IgYSBoYXNoIHRhYmxlIGhlYWRlcikuIFRoZSBlbGVtZW50cyBhcmUgZG91Ymx5IGxpbmtlZAorICogc28gdGhhdCBhbiBhcmJpdHJhcnkgZWxlbWVudCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IGEgbmVlZCB0bworICogdHJhdmVyc2UgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlCisgKiBvciBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50IG9yIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LiBBIGxpc3QKKyAqIG1heSBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCisgKgorICogQSBzaW1wbGUgcXVldWUgaXMgaGVhZGVkIGJ5IGEgcGFpciBvZiBwb2ludGVycywgb25lIHRoZSBoZWFkIG9mIHRoZQorICogbGlzdCBhbmQgdGhlIG90aGVyIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LiBUaGUgZWxlbWVudHMgYXJlIHNpbmdseQorICogbGlua2VkIHRvIHNhdmUgc3BhY2UsIHNvIGVsZW1lbnRzIGNhbiBvbmx5IGJlIHJlbW92ZWQgZnJvbSB0aGUKKyAqIGhlYWQgb2YgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYWZ0ZXIKKyAqIGFuIGV4aXN0aW5nIGVsZW1lbnQsIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBvciBhdCB0aGUgZW5kIG9mIHRoZQorICogbGlzdC4gQSBzaW1wbGUgcXVldWUgbWF5IG9ubHkgYmUgdHJhdmVyc2VkIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4KKyAqCisgKiBBIHRhaWwgcXVldWUgaXMgaGVhZGVkIGJ5IGEgcGFpciBvZiBwb2ludGVycywgb25lIHRvIHRoZSBoZWFkIG9mIHRoZQorICogbGlzdCBhbmQgdGhlIG90aGVyIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseQorICogbGlua2VkIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZSBvcgorICogYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZSBlbmQgb2YKKyAqIHRoZSBsaXN0LiBBIHRhaWwgcXVldWUgbWF5IGJlIHRyYXZlcnNlZCBpbiBlaXRoZXIgZGlyZWN0aW9uLgorICoKKyAqIEEgY2lyY2xlIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0byB0aGUgaGVhZCBvZiB0aGUKKyAqIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkKKyAqIGxpbmtlZCBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUgb3IgYWZ0ZXIKKyAqIGFuIGV4aXN0aW5nIGVsZW1lbnQsIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBvciBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICogQSBjaXJjbGUgcXVldWUgbWF5IGJlIHRyYXZlcnNlZCBpbiBlaXRoZXIgZGlyZWN0aW9uLCBidXQgaGFzIGEgbW9yZQorICogY29tcGxleCBlbmQgb2YgbGlzdCBkZXRlY3Rpb24uCisgKgorICogRm9yIGRldGFpbHMgb24gdGhlIHVzZSBvZiB0aGVzZSBtYWNyb3MsIHNlZSB0aGUgcXVldWUoMykgbWFudWFsIHBhZ2UuCisgKi8KKworLyoKKyAqIExpc3QgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUJTElTVF9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpsaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKK30KKworI2RlZmluZQlMSVNUX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwgfQorCisjZGVmaW5lCUxJU1RfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpsZV9uZXh0OwkvKiBuZXh0IGVsZW1lbnQgKi8JCQlcCisJc3RydWN0IHR5cGUgKipsZV9wcmV2OwkvKiBhZGRyZXNzIG9mIHByZXZpb3VzIG5leHQgZWxlbWVudCAqLwlcCit9CisKKy8qCisgKiBMaXN0IGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlMSVNUX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwkoaGVhZCktPmxoX2ZpcnN0ID0gTlVMTDsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUxJU1RfSU5TRVJUX0FGVEVSKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQubGVfbmV4dCA9IChsaXN0ZWxtKS0+ZmllbGQubGVfbmV4dCkgIT0gTlVMTCkJXAorCQkobGlzdGVsbSktPmZpZWxkLmxlX25leHQtPmZpZWxkLmxlX3ByZXYgPQkJXAorCQkgICAgJihlbG0pLT5maWVsZC5sZV9uZXh0OwkJCQlcCisJKGxpc3RlbG0pLT5maWVsZC5sZV9uZXh0ID0gKGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQubGVfcHJldiA9ICYobGlzdGVsbSktPmZpZWxkLmxlX25leHQ7CQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlMSVNUX0lOU0VSVF9CRUZPUkUobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQubGVfcHJldiA9IChsaXN0ZWxtKS0+ZmllbGQubGVfcHJldjsJCVwKKwkoZWxtKS0+ZmllbGQubGVfbmV4dCA9IChsaXN0ZWxtKTsJCQkJXAorCSoobGlzdGVsbSktPmZpZWxkLmxlX3ByZXYgPSAoZWxtKTsJCQkJXAorCShsaXN0ZWxtKS0+ZmllbGQubGVfcHJldiA9ICYoZWxtKS0+ZmllbGQubGVfbmV4dDsJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUxJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQubGVfbmV4dCA9IChoZWFkKS0+bGhfZmlyc3QpICE9IE5VTEwpCQlcCisJCShoZWFkKS0+bGhfZmlyc3QtPmZpZWxkLmxlX3ByZXYgPSAmKGVsbSktPmZpZWxkLmxlX25leHQ7XAorCShoZWFkKS0+bGhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKKwkoZWxtKS0+ZmllbGQubGVfcHJldiA9ICYoaGVhZCktPmxoX2ZpcnN0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUxJU1RfUkVNT1ZFKGVsbSwgZmllbGQpIGRvIHsJCQkJCVwKKwlpZiAoKGVsbSktPmZpZWxkLmxlX25leHQgIT0gTlVMTCkJCQkJXAorCQkoZWxtKS0+ZmllbGQubGVfbmV4dC0+ZmllbGQubGVfcHJldiA9IAkJCVwKKwkJICAgIChlbG0pLT5maWVsZC5sZV9wcmV2OwkJCQlcCisJKihlbG0pLT5maWVsZC5sZV9wcmV2ID0gKGVsbSktPmZpZWxkLmxlX25leHQ7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJTElTVF9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCQlcCisJZm9yICgodmFyKSA9ICgoaGVhZCktPmxoX2ZpcnN0KTsJCQkJXAorCQkodmFyKTsJCQkJCQkJXAorCQkodmFyKSA9ICgodmFyKS0+ZmllbGQubGVfbmV4dCkpCisKKy8qCisgKiBMaXN0IGFjY2VzcyBtZXRob2RzLgorICovCisjZGVmaW5lCUxJU1RfRU1QVFkoaGVhZCkJCSgoaGVhZCktPmxoX2ZpcnN0ID09IE5VTEwpCisjZGVmaW5lCUxJU1RfRklSU1QoaGVhZCkJCSgoaGVhZCktPmxoX2ZpcnN0KQorI2RlZmluZQlMSVNUX05FWFQoZWxtLCBmaWVsZCkJCSgoZWxtKS0+ZmllbGQubGVfbmV4dCkKKworCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGRlZmluaXRpb25zLgorICovCisjZGVmaW5lCVNMSVNUX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnNsaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKK30KKworI2RlZmluZQlTTElTVF9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMIH0KKworI2RlZmluZQlTTElTVF9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnNsZV9uZXh0OwkvKiBuZXh0IGVsZW1lbnQgKi8JCQlcCit9CisKKy8qCisgKiBTaW5nbHktbGlua2VkIExpc3QgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCVNMSVNUX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwkoaGVhZCktPnNsaF9maXJzdCA9IE5VTEw7CQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTTElTVF9JTlNFUlRfQUZURVIoc2xpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnNsZV9uZXh0ID0gKHNsaXN0ZWxtKS0+ZmllbGQuc2xlX25leHQ7CQlcCisJKHNsaXN0ZWxtKS0+ZmllbGQuc2xlX25leHQgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0xJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuc2xlX25leHQgPSAoaGVhZCktPnNsaF9maXJzdDsJCQlcCisJKGhlYWQpLT5zbGhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNMSVNUX1JFTU9WRV9IRUFEKGhlYWQsIGZpZWxkKSBkbyB7CQkJCVwKKwkoaGVhZCktPnNsaF9maXJzdCA9IChoZWFkKS0+c2xoX2ZpcnN0LT5maWVsZC5zbGVfbmV4dDsJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNMSVNUX1JFTU9WRShoZWFkLCBlbG0sIHR5cGUsIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoaGVhZCktPnNsaF9maXJzdCA9PSAoZWxtKSkgewkJCQlcCisJCVNMSVNUX1JFTU9WRV9IRUFEKChoZWFkKSwgZmllbGQpOwkJCVwKKwl9CQkJCQkJCQlcCisJZWxzZSB7CQkJCQkJCQlcCisJCXN0cnVjdCB0eXBlICpjdXJlbG0gPSAoaGVhZCktPnNsaF9maXJzdDsJCVwKKwkJd2hpbGUoY3VyZWxtLT5maWVsZC5zbGVfbmV4dCAhPSAoZWxtKSkJCQlcCisJCQljdXJlbG0gPSBjdXJlbG0tPmZpZWxkLnNsZV9uZXh0OwkJXAorCQljdXJlbG0tPmZpZWxkLnNsZV9uZXh0ID0JCQkJXAorCQkgICAgY3VyZWxtLT5maWVsZC5zbGVfbmV4dC0+ZmllbGQuc2xlX25leHQ7CQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0xJU1RfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvcigodmFyKSA9IChoZWFkKS0+c2xoX2ZpcnN0OyAodmFyKTsgKHZhcikgPSAodmFyKS0+ZmllbGQuc2xlX25leHQpCisKKy8qCisgKiBTaW5nbHktbGlua2VkIExpc3QgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUJU0xJU1RfRU1QVFkoaGVhZCkJKChoZWFkKS0+c2xoX2ZpcnN0ID09IE5VTEwpCisjZGVmaW5lCVNMSVNUX0ZJUlNUKGhlYWQpCSgoaGVhZCktPnNsaF9maXJzdCkKKyNkZWZpbmUJU0xJU1RfTkVYVChlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLnNsZV9uZXh0KQorCisKKy8qCisgKiBTaW5nbHktbGlua2VkIFRhaWwgcXVldWUgZGVjbGFyYXRpb25zLgorICovCisjZGVmaW5lCVNUQUlMUV9IRUFEKG5hbWUsIHR5cGUpCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnN0cWhfZmlyc3Q7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCisJc3RydWN0IHR5cGUgKipzdHFoX2xhc3Q7CS8qIGFkZHIgb2YgbGFzdCBuZXh0IGVsZW1lbnQgKi8JCVwKK30KKworI2RlZmluZQlTVEFJTFFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCwgJihoZWFkKS5zdHFoX2ZpcnN0IH0KKworI2RlZmluZQlTVEFJTFFfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzdHFlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKK30KKworLyoKKyAqIFNpbmdseS1saW5rZWQgVGFpbCBxdWV1ZSBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJU1RBSUxRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwkoaGVhZCktPnN0cWhfZmlyc3QgPSBOVUxMOwkJCQkJXAorCShoZWFkKS0+c3RxaF9sYXN0ID0gJihoZWFkKS0+c3RxaF9maXJzdDsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU1RBSUxRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQuc3RxZV9uZXh0ID0gKGhlYWQpLT5zdHFoX2ZpcnN0KSA9PSBOVUxMKQlcCisJCShoZWFkKS0+c3RxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zdHFlX25leHQ7CQlcCisJKGhlYWQpLT5zdHFoX2ZpcnN0ID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTVEFJTFFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuc3RxZV9uZXh0ID0gTlVMTDsJCQkJCVwKKwkqKGhlYWQpLT5zdHFoX2xhc3QgPSAoZWxtKTsJCQkJCVwKKwkoaGVhZCktPnN0cWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3RxZV9uZXh0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNUQUlMUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCWlmICgoKGVsbSktPmZpZWxkLnN0cWVfbmV4dCA9IChsaXN0ZWxtKS0+ZmllbGQuc3RxZV9uZXh0KSA9PSBOVUxMKVwKKwkJKGhlYWQpLT5zdHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnN0cWVfbmV4dDsJCVwKKwkobGlzdGVsbSktPmZpZWxkLnN0cWVfbmV4dCA9IChlbG0pOwkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTVEFJTFFfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpIGRvIHsJCQkJXAorCWlmICgoKGhlYWQpLT5zdHFoX2ZpcnN0ID0gKGhlYWQpLT5zdHFoX2ZpcnN0LT5maWVsZC5zdHFlX25leHQpID09IE5VTEwpIFwKKwkJKGhlYWQpLT5zdHFoX2xhc3QgPSAmKGhlYWQpLT5zdHFoX2ZpcnN0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNUQUlMUV9SRU1PVkUoaGVhZCwgZWxtLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKGhlYWQpLT5zdHFoX2ZpcnN0ID09IChlbG0pKSB7CQkJCVwKKwkJU1RBSUxRX1JFTU9WRV9IRUFEKChoZWFkKSwgZmllbGQpOwkJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCXN0cnVjdCB0eXBlICpjdXJlbG0gPSAoaGVhZCktPnN0cWhfZmlyc3Q7CQlcCisJCXdoaWxlIChjdXJlbG0tPmZpZWxkLnN0cWVfbmV4dCAhPSAoZWxtKSkJCQlcCisJCQljdXJlbG0gPSBjdXJlbG0tPmZpZWxkLnN0cWVfbmV4dDsJCVwKKwkJaWYgKChjdXJlbG0tPmZpZWxkLnN0cWVfbmV4dCA9CQkJCVwKKwkJCWN1cmVsbS0+ZmllbGQuc3RxZV9uZXh0LT5maWVsZC5zdHFlX25leHQpID09IE5VTEwpIFwKKwkJCSAgICAoaGVhZCktPnN0cWhfbGFzdCA9ICYoY3VyZWxtKS0+ZmllbGQuc3RxZV9uZXh0OyBcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU1RBSUxRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJXAorCWZvciAoKHZhcikgPSAoKGhlYWQpLT5zdHFoX2ZpcnN0KTsJCQkJXAorCQkodmFyKTsJCQkJCQkJXAorCQkodmFyKSA9ICgodmFyKS0+ZmllbGQuc3RxZV9uZXh0KSkKKworI2RlZmluZQlTVEFJTFFfQ09OQ0FUKGhlYWQxLCBoZWFkMikgZG8gewkJCQlcCisJaWYgKCFTVEFJTFFfRU1QVFkoKGhlYWQyKSkpIHsJCQkJCVwKKwkJKihoZWFkMSktPnN0cWhfbGFzdCA9IChoZWFkMiktPnN0cWhfZmlyc3Q7CQlcCisJCShoZWFkMSktPnN0cWhfbGFzdCA9IChoZWFkMiktPnN0cWhfbGFzdDsJCVwKKwkJU1RBSUxRX0lOSVQoKGhlYWQyKSk7CQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKy8qCisgKiBTaW5nbHktbGlua2VkIFRhaWwgcXVldWUgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUJU1RBSUxRX0VNUFRZKGhlYWQpCSgoaGVhZCktPnN0cWhfZmlyc3QgPT0gTlVMTCkKKyNkZWZpbmUJU1RBSUxRX0ZJUlNUKGhlYWQpCSgoaGVhZCktPnN0cWhfZmlyc3QpCisjZGVmaW5lCVNUQUlMUV9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuc3RxZV9uZXh0KQorCisKKy8qCisgKiBTaW1wbGUgcXVldWUgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUJU0lNUExFUV9IRUFEKG5hbWUsIHR5cGUpCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnNxaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKnNxaF9sYXN0OwkvKiBhZGRyIG9mIGxhc3QgbmV4dCBlbGVtZW50ICovCQlcCit9CisKKyNkZWZpbmUJU0lNUExFUV9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMLCAmKGhlYWQpLnNxaF9maXJzdCB9CisKKyNkZWZpbmUJU0lNUExFUV9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnNxZV9uZXh0OwkvKiBuZXh0IGVsZW1lbnQgKi8JCQlcCit9CisKKy8qCisgKiBTaW1wbGUgcXVldWUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCVNJTVBMRVFfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCShoZWFkKS0+c3FoX2ZpcnN0ID0gTlVMTDsJCQkJCVwKKwkoaGVhZCktPnNxaF9sYXN0ID0gJihoZWFkKS0+c3FoX2ZpcnN0OwkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTSU1QTEVRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQuc3FlX25leHQgPSAoaGVhZCktPnNxaF9maXJzdCkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnNxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zcWVfbmV4dDsJCVwKKwkoaGVhZCktPnNxaF9maXJzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0lNUExFUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5zcWVfbmV4dCA9IE5VTEw7CQkJCQlcCisJKihoZWFkKS0+c3FoX2xhc3QgPSAoZWxtKTsJCQkJCVwKKwkoaGVhZCktPnNxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zcWVfbmV4dDsJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTSU1QTEVRX0lOU0VSVF9BRlRFUihoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJaWYgKCgoZWxtKS0+ZmllbGQuc3FlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLnNxZV9uZXh0KSA9PSBOVUxMKVwKKwkJKGhlYWQpLT5zcWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3FlX25leHQ7CQlcCisJKGxpc3RlbG0pLT5maWVsZC5zcWVfbmV4dCA9IChlbG0pOwkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTSU1QTEVRX1JFTU9WRV9IRUFEKGhlYWQsIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKChoZWFkKS0+c3FoX2ZpcnN0ID0gKGhlYWQpLT5zcWhfZmlyc3QtPmZpZWxkLnNxZV9uZXh0KSA9PSBOVUxMKSBcCisJCShoZWFkKS0+c3FoX2xhc3QgPSAmKGhlYWQpLT5zcWhfZmlyc3Q7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0lNUExFUV9SRU1PVkUoaGVhZCwgZWxtLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKGhlYWQpLT5zcWhfZmlyc3QgPT0gKGVsbSkpIHsJCQkJXAorCQlTSU1QTEVRX1JFTU9WRV9IRUFEKChoZWFkKSwgZmllbGQpOwkJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCXN0cnVjdCB0eXBlICpjdXJlbG0gPSAoaGVhZCktPnNxaF9maXJzdDsJCVwKKwkJd2hpbGUgKGN1cmVsbS0+ZmllbGQuc3FlX25leHQgIT0gKGVsbSkpCQkJXAorCQkJY3VyZWxtID0gY3VyZWxtLT5maWVsZC5zcWVfbmV4dDsJCVwKKwkJaWYgKChjdXJlbG0tPmZpZWxkLnNxZV9uZXh0ID0JCQkJXAorCQkJY3VyZWxtLT5maWVsZC5zcWVfbmV4dC0+ZmllbGQuc3FlX25leHQpID09IE5VTEwpIFwKKwkJCSAgICAoaGVhZCktPnNxaF9sYXN0ID0gJihjdXJlbG0pLT5maWVsZC5zcWVfbmV4dDsgXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNJTVBMRVFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQlcCisJZm9yICgodmFyKSA9ICgoaGVhZCktPnNxaF9maXJzdCk7CQkJCVwKKwkJKHZhcik7CQkJCQkJCVwKKwkJKHZhcikgPSAoKHZhciktPmZpZWxkLnNxZV9uZXh0KSkKKworLyoKKyAqIFNpbXBsZSBxdWV1ZSBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZQlTSU1QTEVRX0VNUFRZKGhlYWQpCQkoKGhlYWQpLT5zcWhfZmlyc3QgPT0gTlVMTCkKKyNkZWZpbmUJU0lNUExFUV9GSVJTVChoZWFkKQkJKChoZWFkKS0+c3FoX2ZpcnN0KQorI2RlZmluZQlTSU1QTEVRX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5zcWVfbmV4dCkKKworCisvKgorICogVGFpbCBxdWV1ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZQlfVEFJTFFfSEVBRChuYW1lLCB0eXBlLCBxdWFsKQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXF1YWwgdHlwZSAqdHFoX2ZpcnN0OwkJLyogZmlyc3QgZWxlbWVudCAqLwkJXAorCXF1YWwgdHlwZSAqcXVhbCAqdHFoX2xhc3Q7CS8qIGFkZHIgb2YgbGFzdCBuZXh0IGVsZW1lbnQgKi8JXAorfQorI2RlZmluZSBUQUlMUV9IRUFEKG5hbWUsIHR5cGUpCV9UQUlMUV9IRUFEKG5hbWUsIHN0cnVjdCB0eXBlLCkKKworI2RlZmluZQlUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMLCAmKGhlYWQpLnRxaF9maXJzdCB9CisKKyNkZWZpbmUJX1RBSUxRX0VOVFJZKHR5cGUsIHF1YWwpCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXF1YWwgdHlwZSAqdHFlX25leHQ7CQkvKiBuZXh0IGVsZW1lbnQgKi8JCVwKKwlxdWFsIHR5cGUgKnF1YWwgKnRxZV9wcmV2OwkvKiBhZGRyZXNzIG9mIHByZXZpb3VzIG5leHQgZWxlbWVudCAqL1wKK30KKyNkZWZpbmUgVEFJTFFfRU5UUlkodHlwZSkJX1RBSUxRX0VOVFJZKHN0cnVjdCB0eXBlLCkKKworLyoKKyAqIFRhaWwgcXVldWUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCVRBSUxRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwkoaGVhZCktPnRxaF9maXJzdCA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT50cWhfbGFzdCA9ICYoaGVhZCktPnRxaF9maXJzdDsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKChlbG0pLT5maWVsZC50cWVfbmV4dCA9IChoZWFkKS0+dHFoX2ZpcnN0KSAhPSBOVUxMKQlcCisJCShoZWFkKS0+dHFoX2ZpcnN0LT5maWVsZC50cWVfcHJldiA9CQkJXAorCQkgICAgJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT50cWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQlcCisJKGhlYWQpLT50cWhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmKGhlYWQpLT50cWhfZmlyc3Q7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX25leHQgPSBOVUxMOwkJCQkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9IChoZWFkKS0+dHFoX2xhc3Q7CQkJXAorCSooaGVhZCktPnRxaF9sYXN0ID0gKGVsbSk7CQkJCQlcCisJKGhlYWQpLT50cWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwlpZiAoKChlbG0pLT5maWVsZC50cWVfbmV4dCA9IChsaXN0ZWxtKS0+ZmllbGQudHFlX25leHQpICE9IE5VTEwpXAorCQkoZWxtKS0+ZmllbGQudHFlX25leHQtPmZpZWxkLnRxZV9wcmV2ID0gCQlcCisJCSAgICAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCVwKKwkobGlzdGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmKGxpc3RlbG0pLT5maWVsZC50cWVfbmV4dDsJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9CRUZPUkUobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJXAorCShlbG0pLT5maWVsZC50cWVfbmV4dCA9IChsaXN0ZWxtKTsJCQkJXAorCSoobGlzdGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGVsbSk7CQkJCVwKKwkobGlzdGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVRBSUxRX1JFTU9WRShoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKChlbG0pLT5maWVsZC50cWVfbmV4dCkgIT0gTlVMTCkJCQkJXAorCQkoZWxtKS0+ZmllbGQudHFlX25leHQtPmZpZWxkLnRxZV9wcmV2ID0gCQlcCisJCSAgICAoZWxtKS0+ZmllbGQudHFlX3ByZXY7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+dHFoX2xhc3QgPSAoZWxtKS0+ZmllbGQudHFlX3ByZXY7CQlcCisJKihlbG0pLT5maWVsZC50cWVfcHJldiA9IChlbG0pLT5maWVsZC50cWVfbmV4dDsJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlUQUlMUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCQlcCisJZm9yICgodmFyKSA9ICgoaGVhZCktPnRxaF9maXJzdCk7CQkJCVwKKwkJKHZhcik7CQkJCQkJCVwKKwkJKHZhcikgPSAoKHZhciktPmZpZWxkLnRxZV9uZXh0KSkKKworI2RlZmluZQlUQUlMUV9GT1JFQUNIX1JFVkVSU0UodmFyLCBoZWFkLCBoZWFkbmFtZSwgZmllbGQpCQlcCisJZm9yICgodmFyKSA9ICgqKCgoc3RydWN0IGhlYWRuYW1lICopKChoZWFkKS0+dHFoX2xhc3QpKS0+dHFoX2xhc3QpKTsJXAorCQkodmFyKTsJCQkJCQkJXAorCQkodmFyKSA9ICgqKCgoc3RydWN0IGhlYWRuYW1lICopKCh2YXIpLT5maWVsZC50cWVfcHJldikpLT50cWhfbGFzdCkpKQorCisjZGVmaW5lCVRBSUxRX0NPTkNBVChoZWFkMSwgaGVhZDIsIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoIVRBSUxRX0VNUFRZKGhlYWQyKSkgewkJCQkJXAorCQkqKGhlYWQxKS0+dHFoX2xhc3QgPSAoaGVhZDIpLT50cWhfZmlyc3Q7CQlcCisJCShoZWFkMiktPnRxaF9maXJzdC0+ZmllbGQudHFlX3ByZXYgPSAoaGVhZDEpLT50cWhfbGFzdDsJXAorCQkoaGVhZDEpLT50cWhfbGFzdCA9IChoZWFkMiktPnRxaF9sYXN0OwkJCVwKKwkJVEFJTFFfSU5JVCgoaGVhZDIpKTsJCQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworLyoKKyAqIFRhaWwgcXVldWUgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUJVEFJTFFfRU1QVFkoaGVhZCkJCSgoaGVhZCktPnRxaF9maXJzdCA9PSBOVUxMKQorI2RlZmluZQlUQUlMUV9GSVJTVChoZWFkKQkJKChoZWFkKS0+dHFoX2ZpcnN0KQorI2RlZmluZQlUQUlMUV9ORVhUKGVsbSwgZmllbGQpCQkoKGVsbSktPmZpZWxkLnRxZV9uZXh0KQorCisjZGVmaW5lCVRBSUxRX0xBU1QoaGVhZCwgaGVhZG5hbWUpIFwKKwkoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgoaGVhZCktPnRxaF9sYXN0KSktPnRxaF9sYXN0KSkKKyNkZWZpbmUJVEFJTFFfUFJFVihlbG0sIGhlYWRuYW1lLCBmaWVsZCkgXAorCSgqKCgoc3RydWN0IGhlYWRuYW1lICopKChlbG0pLT5maWVsZC50cWVfcHJldikpLT50cWhfbGFzdCkpCisKKworLyoKKyAqIENpcmN1bGFyIHF1ZXVlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lCUNJUkNMRVFfSEVBRChuYW1lLCB0eXBlKQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpjcWhfZmlyc3Q7CQkvKiBmaXJzdCBlbGVtZW50ICovCQlcCisJc3RydWN0IHR5cGUgKmNxaF9sYXN0OwkJLyogbGFzdCBlbGVtZW50ICovCQlcCit9CisKKyNkZWZpbmUJQ0lSQ0xFUV9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyAodm9pZCAqKSZoZWFkLCAodm9pZCAqKSZoZWFkIH0KKworI2RlZmluZQlDSVJDTEVRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqY3FlX25leHQ7CQkvKiBuZXh0IGVsZW1lbnQgKi8JCVwKKwlzdHJ1Y3QgdHlwZSAqY3FlX3ByZXY7CQkvKiBwcmV2aW91cyBlbGVtZW50ICovCQlcCit9CisKKy8qCisgKiBDaXJjdWxhciBxdWV1ZSBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJQ0lSQ0xFUV9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJKGhlYWQpLT5jcWhfZmlyc3QgPSAodm9pZCAqKShoZWFkKTsJCQkJXAorCShoZWFkKS0+Y3FoX2xhc3QgPSAodm9pZCAqKShoZWFkKTsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCShlbG0pLT5maWVsZC5jcWVfbmV4dCA9IChsaXN0ZWxtKS0+ZmllbGQuY3FlX25leHQ7CQlcCisJKGVsbSktPmZpZWxkLmNxZV9wcmV2ID0gKGxpc3RlbG0pOwkJCQlcCisJaWYgKChsaXN0ZWxtKS0+ZmllbGQuY3FlX25leHQgPT0gKHZvaWQgKikoaGVhZCkpCQlcCisJCShoZWFkKS0+Y3FoX2xhc3QgPSAoZWxtKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGxpc3RlbG0pLT5maWVsZC5jcWVfbmV4dC0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtKTsJXAorCShsaXN0ZWxtKS0+ZmllbGQuY3FlX25leHQgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfQkVGT1JFKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX25leHQgPSAobGlzdGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2OwkJXAorCWlmICgobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2ID09ICh2b2lkICopKGhlYWQpKQkJXAorCQkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2LT5maWVsZC5jcWVfbmV4dCA9IChlbG0pOwlcCisJKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldiA9IChlbG0pOwkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlDSVJDTEVRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGhlYWQpLT5jcWhfZmlyc3Q7CQkJXAorCShlbG0pLT5maWVsZC5jcWVfcHJldiA9ICh2b2lkICopKGhlYWQpOwkJCQlcCisJaWYgKChoZWFkKS0+Y3FoX2xhc3QgPT0gKHZvaWQgKikoaGVhZCkpCQkJCVwKKwkJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPmNxaF9maXJzdC0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtKTsJCVwKKwkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5jcWVfbmV4dCA9ICh2b2lkICopKGhlYWQpOwkJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9wcmV2ID0gKGhlYWQpLT5jcWhfbGFzdDsJCQlcCisJaWYgKChoZWFkKS0+Y3FoX2ZpcnN0ID09ICh2b2lkICopKGhlYWQpKQkJCVwKKwkJKGhlYWQpLT5jcWhfZmlyc3QgPSAoZWxtKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT5jcWhfbGFzdC0+ZmllbGQuY3FlX25leHQgPSAoZWxtKTsJCVwKKwkoaGVhZCktPmNxaF9sYXN0ID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlDSVJDTEVRX1JFTU9WRShoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKGVsbSktPmZpZWxkLmNxZV9uZXh0ID09ICh2b2lkICopKGhlYWQpKQkJCVwKKwkJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pLT5maWVsZC5jcWVfcHJldjsJCVwKKwllbHNlCQkJCQkJCQlcCisJCShlbG0pLT5maWVsZC5jcWVfbmV4dC0+ZmllbGQuY3FlX3ByZXYgPQkJCVwKKwkJICAgIChlbG0pLT5maWVsZC5jcWVfcHJldjsJCQkJXAorCWlmICgoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPT0gKHZvaWQgKikoaGVhZCkpCQkJXAorCQkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pLT5maWVsZC5jcWVfbmV4dDsJCVwKKwllbHNlCQkJCQkJCQlcCisJCShlbG0pLT5maWVsZC5jcWVfcHJldi0+ZmllbGQuY3FlX25leHQgPQkJCVwKKwkJICAgIChlbG0pLT5maWVsZC5jcWVfbmV4dDsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJQ0lSQ0xFUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCVwKKwlmb3IgKCh2YXIpID0gKChoZWFkKS0+Y3FoX2ZpcnN0KTsJCQkJXAorCQkodmFyKSAhPSAoY29uc3Qgdm9pZCAqKShoZWFkKTsJCQkJXAorCQkodmFyKSA9ICgodmFyKS0+ZmllbGQuY3FlX25leHQpKQorCisjZGVmaW5lCUNJUkNMRVFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgZmllbGQpCQkJXAorCWZvciAoKHZhcikgPSAoKGhlYWQpLT5jcWhfbGFzdCk7CQkJCVwKKwkJKHZhcikgIT0gKGNvbnN0IHZvaWQgKikoaGVhZCk7CQkJCVwKKwkJKHZhcikgPSAoKHZhciktPmZpZWxkLmNxZV9wcmV2KSkKKworLyoKKyAqIENpcmN1bGFyIHF1ZXVlIGFjY2VzcyBtZXRob2RzLgorICovCisjZGVmaW5lCUNJUkNMRVFfRU1QVFkoaGVhZCkJCSgoaGVhZCktPmNxaF9maXJzdCA9PSAodm9pZCAqKShoZWFkKSkKKyNkZWZpbmUJQ0lSQ0xFUV9GSVJTVChoZWFkKQkJKChoZWFkKS0+Y3FoX2ZpcnN0KQorI2RlZmluZQlDSVJDTEVRX0xBU1QoaGVhZCkJCSgoaGVhZCktPmNxaF9sYXN0KQorI2RlZmluZQlDSVJDTEVRX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5jcWVfbmV4dCkKKyNkZWZpbmUJQ0lSQ0xFUV9QUkVWKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuY3FlX3ByZXYpCisKKyNkZWZpbmUgQ0lSQ0xFUV9MT09QX05FWFQoaGVhZCwgZWxtLCBmaWVsZCkJCQkJXAorCSgoKGVsbSktPmZpZWxkLmNxZV9uZXh0ID09ICh2b2lkICopKGhlYWQpKQkJCVwKKwkgICAgPyAoKGhlYWQpLT5jcWhfZmlyc3QpCQkJCQlcCisJICAgIDogKGVsbS0+ZmllbGQuY3FlX25leHQpKQorI2RlZmluZSBDSVJDTEVRX0xPT1BfUFJFVihoZWFkLCBlbG0sIGZpZWxkKQkJCQlcCisJKCgoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPT0gKHZvaWQgKikoaGVhZCkpCQkJXAorCSAgICA/ICgoaGVhZCktPmNxaF9sYXN0KQkJCQkJXAorCSAgICA6IChlbG0tPmZpZWxkLmNxZV9wcmV2KSkKKworI2VuZGlmCS8qIHN5cy9xdWV1ZS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3F1b3RhLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3F1b3RhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhMGVjMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcXVvdGEuaApAQCAtMCwwICsxLDIyNSBAQAorLyogVGhpcyBqdXN0IHJlcHJlc2VudHMgdGhlIG5vbi1rZXJuZWwgcGFydHMgb2YgPGxpbnV4L3F1b3RhLmg+LgorICoKKyAqIGhlcmUncyB0aGUgY29ycmVzcG9uZGluZyBjb3B5cmlnaHQ6CisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBSb2JlcnQgRWx6IGF0IFRoZSBVbml2ZXJzaXR5IG9mIE1lbGJvdXJuZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfU1lTX1FVT1RBX0gKKyNkZWZpbmUgX1NZU19RVU9UQV9IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qCisgKiBTZWxlY3QgYmV0d2VlbiBkaWZmZXJlbnQgaW5jb21wYXRpYmxlIHF1b3RhIHZlcnNpb25zLgorICogRGVmYXVsdCB0byB0aGUgdmVyc2lvbiB1c2VkIGJ5IExpbnV4IGtlcm5lbCB2ZXJzaW9uIDIuNC4yMgorICogb3IgbGF0ZXIuICAqLworI2lmbmRlZiBfTElOVVhfUVVPVEFfVkVSU0lPTgorIyBkZWZpbmUgX0xJTlVYX1FVT1RBX1ZFUlNJT04gMgorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGRpc2tibG9ja3MgdG8gYmxvY2tzIGFuZCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKyAqIGN1cnJlbnRseSBvbmx5IHRvIGZvb2wgdGhlIEJTRCBzb3VyY2UuIDotKQorICovCisjZGVmaW5lIGRidG9iKG51bSkgKChudW0pIDw8IDEwKQorI2RlZmluZSBidG9kYihudW0pICgobnVtKSA+PiAxMCkKKworLyoKKyAqIENvbnZlcnQgY291bnQgb2YgZmlsZXN5c3RlbSBibG9ja3MgdG8gZGlza3F1b3RhIGJsb2NrcywgbWVhbnQKKyAqIGZvciBmaWxlc3lzdGVtcyB3aGVyZSBpX2Jsa3NpemUgIT0gQkxPQ0tfU0laRQorICovCisjZGVmaW5lIGZzX3RvX2RxX2Jsb2NrcyhudW0sIGJsa3NpemUpICgoKG51bSkgKiAoYmxrc2l6ZSkpIC8gQkxPQ0tfU0laRSkKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBkaXNrIHF1b3RhcyBpbXBvc2VkIG9uIHRoZSBhdmVyYWdlIHVzZXIKKyAqIChiaWcgYnJvdGhlciBmaW5hbGx5IGhpdHMgTGludXgpLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGRlZmluZSB0aGUgYW1vdW50IG9mIHRpbWUgZ2l2ZW4gYSB1c2VyCisgKiBiZWZvcmUgdGhlIHNvZnQgbGltaXRzIGFyZSB0cmVhdGVkIGFzIGhhcmQgbGltaXRzICh1c3VhbGx5IHJlc3VsdGluZworICogaW4gYW4gYWxsb2NhdGlvbiBmYWlsdXJlKS4gVGhlIHRpbWVyIGlzIHN0YXJ0ZWQgd2hlbiB0aGUgdXNlciBjcm9zc2VzCisgKiB0aGVpciBzb2Z0IGxpbWl0LCBpdCBpcyByZXNldCB3aGVuIHRoZXkgZ28gYmVsb3cgdGhlaXIgc29mdCBsaW1pdC4KKyAqLworI2RlZmluZSBNQVhfSVFfVElNRSAgNjA0ODAwCS8qICg3KjI0KjYwKjYwKSAxIHdlZWsgKi8KKyNkZWZpbmUgTUFYX0RRX1RJTUUgIDYwNDgwMAkvKiAoNyoyNCo2MCo2MCkgMSB3ZWVrICovCisKKyNkZWZpbmUgTUFYUVVPVEFTIDIKKyNkZWZpbmUgVVNSUVVPVEEgIDAJCS8qIGVsZW1lbnQgdXNlZCBmb3IgdXNlciBxdW90YXMgKi8KKyNkZWZpbmUgR1JQUVVPVEEgIDEJCS8qIGVsZW1lbnQgdXNlZCBmb3IgZ3JvdXAgcXVvdGFzICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGRlZmF1bHQgbmFtZXMgb2YgdGhlIHF1b3RhcyBmaWxlcy4KKyAqLworI2RlZmluZSBJTklUUUZOQU1FUyB7IFwKKyAgICJ1c2VyIiwgICAgICAvKiBVU1JRVU9UQSAqLyBcCisgICAiZ3JvdXAiLCAgIC8qIEdSUFFVT1RBICovIFwKKyAgICJ1bmRlZmluZWQiLCBcCit9OworCisjZGVmaW5lIFFVT1RBRklMRU5BTUUgInF1b3RhIgorI2RlZmluZSBRVU9UQUdST1VQICJzdGFmZiIKKworI2RlZmluZSBOUl9EUUhBU0ggNDMgICAgICAgICAgLyogSnVzdCBhbiBhcmJpdHJhcnkgbnVtYmVyIGFueSBzdWdnZXN0aW9ucyA/ICovCisjZGVmaW5lIE5SX0RRVU9UUyAyNTYgICAgICAgICAvKiBOdW1iZXIgb2YgcXVvdGFzIGFjdGl2ZSBhdCBvbmUgdGltZSAqLworCisvKgorICogQ29tbWFuZCBkZWZpbml0aW9ucyBmb3IgdGhlICdxdW90YWN0bCcgc3lzdGVtIGNhbGwuCisgKiBUaGUgY29tbWFuZHMgYXJlIGJyb2tlbiBpbnRvIGEgbWFpbiBjb21tYW5kIGRlZmluZWQgYmVsb3cKKyAqIGFuZCBhIHN1YmNvbW1hbmQgdGhhdCBpcyB1c2VkIHRvIGNvbnZleSB0aGUgdHlwZSBvZgorICogcXVvdGEgdGhhdCBpcyBiZWluZyBtYW5pcHVsYXRlZCAoc2VlIGFib3ZlKS4KKyAqLworI2RlZmluZSBTVUJDTURNQVNLICAweDAwZmYKKyNkZWZpbmUgU1VCQ01EU0hJRlQgOAorI2RlZmluZSBRQ01EKGNtZCwgdHlwZSkgICgoKGNtZCkgPDwgU1VCQ01EU0hJRlQpIHwgKCh0eXBlKSAmIFNVQkNNRE1BU0spKQorCisjaWYgX0xJTlVYX1FVT1RBX1ZFUlNJT04gPCAyCisjIGRlZmluZSBRX1FVT1RBT04gIDB4MDEwMAkvKiBlbmFibGUgcXVvdGFzICovCisjIGRlZmluZSBRX1FVT1RBT0ZGIDB4MDIwMAkvKiBkaXNhYmxlIHF1b3RhcyAqLworIyBkZWZpbmUgUV9HRVRRVU9UQSAweDAzMDAJLyogZ2V0IGxpbWl0cyBhbmQgdXNhZ2UgKi8KKyMgZGVmaW5lIFFfU0VUUVVPVEEgMHgwNDAwCS8qIHNldCBsaW1pdHMgYW5kIHVzYWdlICovCisjIGRlZmluZSBRX1NFVFVTRSAgIDB4MDUwMAkvKiBzZXQgdXNhZ2UgKi8KKyMgZGVmaW5lIFFfU1lOQyAgICAgMHgwNjAwCS8qIHN5bmMgZGlzayBjb3B5IG9mIGEgZmlsZXN5c3RlbXMgcXVvdGFzICovCisjIGRlZmluZSBRX1NFVFFMSU0gIDB4MDcwMAkvKiBzZXQgbGltaXRzICovCisjIGRlZmluZSBRX0dFVFNUQVRTIDB4MDgwMAkvKiBnZXQgY29sbGVjdGVkIHN0YXRzICovCisjIGRlZmluZSBRX1JTUVVBU0ggIDB4MTAwMAkvKiBzZXQgcm9vdF9zcXVhc2ggb3B0aW9uICovCisjZWxzZQorIyBkZWZpbmUgUV9TWU5DICAgICAweDgwMDAwMQkvKiBzeW5jIGRpc2sgY29weSBvZiBhIGZpbGVzeXN0ZW1zIHF1b3RhcyAqLworIyBkZWZpbmUgUV9RVU9UQU9OICAweDgwMDAwMgkvKiB0dXJuIHF1b3RhcyBvbiAqLworIyBkZWZpbmUgUV9RVU9UQU9GRiAweDgwMDAwMwkvKiB0dXJuIHF1b3RhcyBvZmYgKi8KKyMgZGVmaW5lIFFfR0VURk1UICAgMHg4MDAwMDQJLyogZ2V0IHF1b3RhIGZvcm1hdCB1c2VkIG9uIGdpdmVuIGZpbGVzeXN0ZW0gKi8KKyMgZGVmaW5lIFFfR0VUSU5GTyAgMHg4MDAwMDUJLyogZ2V0IGluZm9ybWF0aW9uIGFib3V0IHF1b3RhIGZpbGVzICovCisjIGRlZmluZSBRX1NFVElORk8gIDB4ODAwMDA2CS8qIHNldCBpbmZvcm1hdGlvbiBhYm91dCBxdW90YSBmaWxlcyAqLworIyBkZWZpbmUgUV9HRVRRVU9UQSAweDgwMDAwNwkvKiBnZXQgdXNlciBxdW90YSBzdHJ1Y3R1cmUgKi8KKyMgZGVmaW5lIFFfU0VUUVVPVEEgMHg4MDAwMDgJLyogc2V0IHVzZXIgcXVvdGEgc3RydWN0dXJlICovCisjZW5kaWYKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlZmluZXMgdGhlIGZvcm1hdCBvZiB0aGUgZGlzayBxdW90YSBmaWxlCisgKiAoYXMgaXQgYXBwZWFycyBvbiBkaXNrKSAtIHRoZSBmaWxlIGlzIGFuIGFycmF5IG9mIHRoZXNlIHN0cnVjdHVyZXMKKyAqIGluZGV4ZWQgYnkgdXNlciBvciBncm91cCBudW1iZXIuCisgKi8KKyNpZiBfTElOVVhfUVVPVEFfVkVSU0lPTiA8IDIKK3N0cnVjdCBkcWJsaworICB7CisgICAgdV9pbnQzMl90IGRxYl9iaGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBkaXNrIGJsa3MgYWxsb2MgKi8KKyAgICB1X2ludDMyX3QgZHFiX2Jzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIGJsa3MgKi8KKyAgICB1X2ludDMyX3QgZHFiX2N1cmJsb2NrczsJLyogY3VycmVudCBibG9jayBjb3VudCAqLworICAgIHVfaW50MzJfdCBkcWJfaWhhcmRsaW1pdDsJLyogbWF4aW11bSAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KKyAgICB1X2ludDMyX3QgZHFiX2lzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBpbm9kZSBsaW1pdCAqLworICAgIHVfaW50MzJfdCBkcWJfY3VyaW5vZGVzOwkvKiBjdXJyZW50ICMgYWxsb2NhdGVkIGlub2RlcyAqLworICAgIHRpbWVfdCBkcWJfYnRpbWU7CQkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgZGlzayB1c2UgKi8KKyAgICB0aW1lX3QgZHFiX2l0aW1lOwkJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGZpbGVzICovCisgIH07CisjZWxzZQorCisvKiBGbGFncyB0aGF0IGluZGljYXRlIHdoaWNoIGZpZWxkcyBpbiBkcWJsayBzdHJ1Y3R1cmUgYXJlIHZhbGlkLiAgKi8KKyNkZWZpbmUgUUlGX0JMSU1JVFMJMQorI2RlZmluZSBRSUZfU1BBQ0UJMgorI2RlZmluZSBRSUZfSUxJTUlUUwk0CisjZGVmaW5lIFFJRl9JTk9ERVMJOAorI2RlZmluZSBRSUZfQlRJTUUJMTYKKyNkZWZpbmUgUUlGX0lUSU1FCTMyCisjZGVmaW5lIFFJRl9MSU1JVFMJKFFJRl9CTElNSVRTIHwgUUlGX0lMSU1JVFMpCisjZGVmaW5lIFFJRl9VU0FHRQkoUUlGX1NQQUNFIHwgUUlGX0lOT0RFUykKKyNkZWZpbmUgUUlGX1RJTUVTCShRSUZfQlRJTUUgfCBRSUZfSVRJTUUpCisjZGVmaW5lIFFJRl9BTEwJCShRSUZfTElNSVRTIHwgUUlGX1VTQUdFIHwgUUlGX1RJTUVTKQorCitzdHJ1Y3QgZHFibGsKKyAgeworICAgIHVfaW50NjRfdCBkcWJfYmhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gZGlzayBxdW90YSBibG9ja3MgYWxsb2MgKi8KKyAgICB1X2ludDY0X3QgZHFiX2Jzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIHF1b3RhIGJsb2NrcyAqLworICAgIHVfaW50NjRfdCBkcWJfY3Vyc3BhY2U7CS8qIGN1cnJlbnQgcXVvdGEgYmxvY2sgY291bnQgKi8KKyAgICB1X2ludDY0X3QgZHFiX2loYXJkbGltaXQ7CS8qIG1heGltdW0gIyBhbGxvY2F0ZWQgaW5vZGVzICovCisgICAgdV9pbnQ2NF90IGRxYl9pc29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgaW5vZGUgbGltaXQgKi8KKyAgICB1X2ludDY0X3QgZHFiX2N1cmlub2RlczsJLyogY3VycmVudCAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KKyAgICB1X2ludDY0X3QgZHFiX2J0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgZGlzayB1c2UgKi8KKyAgICB1X2ludDY0X3QgZHFiX2l0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgZmlsZXMgKi8KKyAgICB1X2ludDMyX3QgZHFiX3ZhbGlkOwkvKiBiaXRtYXNrIG9mIFFJRl8qIGNvbnN0YW50cyAqLworICB9OworI2VuZGlmCisKKy8qCisgKiBTaG9ydGhhbmQgbm90YXRpb24uCisgKi8KKyNkZWZpbmUJZHFfYmhhcmRsaW1pdAlkcV9kcWIuZHFiX2JoYXJkbGltaXQKKyNkZWZpbmUJZHFfYnNvZnRsaW1pdAlkcV9kcWIuZHFiX2Jzb2Z0bGltaXQKKyNpZiBfTElOVVhfUVVPVEFfVkVSU0lPTiA8IDIKKyMgZGVmaW5lIGRxX2N1cmJsb2NrcwlkcV9kcWIuZHFiX2N1cmJsb2NrcworI2Vsc2UKKyMgZGVmaW5lIGRxX2N1cnNwYWNlCWRxX2RxYi5kcWJfY3Vyc3BhY2UKKyMgZGVmaW5lIGRxX3ZhbGlkCWRxX2RxYi5kcWJfdmFsaWQKKyNlbmRpZgorI2RlZmluZQlkcV9paGFyZGxpbWl0CWRxX2RxYi5kcWJfaWhhcmRsaW1pdAorI2RlZmluZQlkcV9pc29mdGxpbWl0CWRxX2RxYi5kcWJfaXNvZnRsaW1pdAorI2RlZmluZQlkcV9jdXJpbm9kZXMJZHFfZHFiLmRxYl9jdXJpbm9kZXMKKyNkZWZpbmUJZHFfYnRpbWUJZHFfZHFiLmRxYl9idGltZQorI2RlZmluZQlkcV9pdGltZQlkcV9kcWIuZHFiX2l0aW1lCisKKyNkZWZpbmUgZHFvZmYoVUlEKSAgICAgICgobG9mZl90KSgoVUlEKSAqIHNpemVvZiAoc3RydWN0IGRxYmxrKSkpCisKKyNpZiBfTElOVVhfUVVPVEFfVkVSU0lPTiA8IDIKK3N0cnVjdCBkcXN0YXRzCisgIHsKKyAgICB1X2ludDMyX3QgbG9va3VwczsKKyAgICB1X2ludDMyX3QgZHJvcHM7CisgICAgdV9pbnQzMl90IHJlYWRzOworICAgIHVfaW50MzJfdCB3cml0ZXM7CisgICAgdV9pbnQzMl90IGNhY2hlX2hpdHM7CisgICAgdV9pbnQzMl90IHBhZ2VzX2FsbG9jYXRlZDsKKyAgICB1X2ludDMyX3QgYWxsb2NhdGVkX2RxdW90czsKKyAgICB1X2ludDMyX3QgZnJlZV9kcXVvdHM7CisgICAgdV9pbnQzMl90IHN5bmNzOworICB9OworI2Vsc2UKKworLyogRmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGljaCBmaWVsZHMgaW4gZHFpbmZvIHN0cnVjdHVyZSBhcmUgdmFsaWQuICAqLworIyBkZWZpbmUgSUlGX0JHUkFDRQkxCisjIGRlZmluZSBJSUZfSUdSQUNFCTIKKyMgZGVmaW5lIElJRl9GTEFHUwk0CisjIGRlZmluZSBJSUZfQUxMCShJSUZfQkdSQUNFIHwgSUlGX0lHUkFDRSB8IElJRl9GTEFHUykKKworc3RydWN0IGRxaW5mbworICB7CisgICAgdV9pbnQ2NF90IGRxaV9iZ3JhY2U7CisgICAgdV9pbnQ2NF90IGRxaV9pZ3JhY2U7CisgICAgdV9pbnQzMl90IGRxaV9mbGFnczsKKyAgICB1X2ludDMyX3QgZHFpX3ZhbGlkOworICB9OworI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCBxdW90YWN0bCAoaW50IF9fY21kLCBjb25zdCBjaGFyICpfX3NwZWNpYWwsIGludCBfX2lkLAorCQkgICAgIGNhZGRyX3QgX19hZGRyKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3F1b3RhLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcmF3LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Jhdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MmY3OGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Jhdy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1JBV19ICisjZGVmaW5lIF9TWVNfUkFXX0gJMQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKy8qIFRoZSBtYWpvciBkZXZpY2UgbnVtYmVyIGZvciByYXcgZGV2aWNlcy4gICovCisjZGVmaW5lIFJBV19NQUpPUgkxNjIKKworLyogYGlvY3RsJyBjb21tYW5kcyBmb3IgcmF3IGRldmljZXMuICAqLworI2RlZmluZSBSQVdfU0VUQklORCAgICAgX0lPKDB4YWMsIDApCisjZGVmaW5lIFJBV19HRVRCSU5EICAgICBfSU8oMHhhYywgMSkKKworc3RydWN0IHJhd19jb25maWdfcmVxdWVzdAoreworICBpbnQgcmF3X21pbm9yOworICB1aW50NjRfdCBibG9ja19tYWpvcjsKKyAgdWludDY0X3QgYmxvY2tfbWlub3I7Cit9OworCisjZW5kaWYgLyogc3lzL3Jhdy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3JlYm9vdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9yZWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTcxOWM3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9yZWJvb3QuaApAQCAtMCwwICsxLDQ5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBzaG91bGQgZGVmaW5lIFJCXyogbWFjcm9zIHRvIGJlIHVzZWQgYXMgZmxhZworICAgYml0cyBpbiB0aGUgYXJndW1lbnQgdG8gdGhlIGByZWJvb3QnIHN5c3RlbSBjYWxsLiAgKi8KKworI2lmbmRlZiBfU1lTX1JFQk9PVF9ICisjZGVmaW5lIF9TWVNfUkVCT09UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogUGVyZm9ybSBhIGhhcmQgcmVzZXQgbm93LiAgKi8KKyNkZWZpbmUgUkJfQVVUT0JPT1QJMHgwMTIzNDU2NworCisvKiBIYWx0IHRoZSBzeXN0ZW0uICAqLworI2RlZmluZSBSQl9IQUxUX1NZU1RFTQkweGNkZWYwMTIzCisKKy8qIEVuYWJsZSByZWJvb3QgdXNpbmcgQ3RybC1BbHQtRGVsZXRlIGtleXN0cm9rZS4gICovCisjZGVmaW5lIFJCX0VOQUJMRV9DQUQJMHg4OWFiY2RlZgorCisvKiBEaXNhYmxlIHJlYm9vdCB1c2luZyBDdHJsLUFsdC1EZWxldGUga2V5c3Ryb2tlLiAgKi8KKyNkZWZpbmUgUkJfRElTQUJMRV9DQUQJMAorCisvKiBTdG9wIHN5c3RlbSBhbmQgc3dpdGNoIHBvd2VyIG9mZiBpZiBwb3NzaWJsZS4gICovCisjZGVmaW5lIFJCX1BPV0VSX09GRgkweDQzMjFmZWRjCisKK19fQkVHSU5fREVDTFMKKworLyogUmVib290IG9yIGhhbHQgdGhlIHN5c3RlbS4gICovCitleHRlcm4gaW50IHJlYm9vdCAoaW50IF9faG93dG8pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBfU1lTX1JFQk9PVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3JlZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2I3MWEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9yZWcuaApAQCAtMCwwICsxLDc5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19SRUdfSAorI2RlZmluZSBfU1lTX1JFR19ICTEKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKworI2lmIF9fV09SRFNJWkUgPT0gNjQKKy8qIEluZGV4IGludG8gYW4gYXJyYXkgb2YgOCBieXRlIGxvbmdzIHJldHVybmVkIGZyb20gcHRyYWNlIGZvcgorICAgbG9jYXRpb24gb2YgdGhlIHVzZXJzJyBzdG9yZWQgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4gICovCisKKyMgZGVmaW5lIFIxNQkwCisjIGRlZmluZSBSMTQJMQorIyBkZWZpbmUgUjEzCTIKKyMgZGVmaW5lIFIxMgkzCisjIGRlZmluZSBSQlAJNAorIyBkZWZpbmUgUkJYCTUKKyMgZGVmaW5lIFIxMQk2CisjIGRlZmluZSBSMTAJNworIyBkZWZpbmUgUjkJOAorIyBkZWZpbmUgUjgJOQorIyBkZWZpbmUgUkFYCTEwCisjIGRlZmluZSBSQ1gJMTEKKyMgZGVmaW5lIFJEWAkxMgorIyBkZWZpbmUgUlNJCTEzCisjIGRlZmluZSBSREkJMTQKKyMgZGVmaW5lIE9SSUdfUkFYIDE1CisjIGRlZmluZSBSSVAJMTYKKyMgZGVmaW5lIENTCTE3CisjIGRlZmluZSBFRkxBR1MJMTgKKyMgZGVmaW5lIFJTUAkxOQorIyBkZWZpbmUgU1MJMjAKKyMgZGVmaW5lIEZTX0JBU0UgMjEKKyMgZGVmaW5lIEdTX0JBU0UgMjIKKyMgZGVmaW5lIERTCTIzCisjIGRlZmluZSBFUwkyNAorIyBkZWZpbmUgRlMJMjUKKyMgZGVmaW5lIEdTCTI2CisjZWxzZQorCisvKiBJbmRleCBpbnRvIGFuIGFycmF5IG9mIDQgYnl0ZSBpbnRlZ2VycyByZXR1cm5lZCBmcm9tIHB0cmFjZSBmb3IKKyAqIGxvY2F0aW9uIG9mIHRoZSB1c2Vycycgc3RvcmVkIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMuICovCisKKyMgZGVmaW5lIEVCWCAwCisjIGRlZmluZSBFQ1ggMQorIyBkZWZpbmUgRURYIDIKKyMgZGVmaW5lIEVTSSAzCisjIGRlZmluZSBFREkgNAorIyBkZWZpbmUgRUJQIDUKKyMgZGVmaW5lIEVBWCA2CisjIGRlZmluZSBEUyA3CisjIGRlZmluZSBFUyA4CisjIGRlZmluZSBGUyA5CisjIGRlZmluZSBHUyAxMAorIyBkZWZpbmUgT1JJR19FQVggMTEKKyMgZGVmaW5lIEVJUCAxMgorIyBkZWZpbmUgQ1MgIDEzCisjIGRlZmluZSBFRkwgMTQKKyMgZGVmaW5lIFVFU1AgMTUKKyMgZGVmaW5lIFNTICAgMTYKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcmVzb3VyY2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTEyNzQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9yZXNvdXJjZS5oCkBAIC0wLDAgKzEsMTAzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTIsOTQsMTk5Ni0yMDAwLDIwMDIsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX1JFU09VUkNFX0gKKyNkZWZpbmUJX1NZU19SRVNPVVJDRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWZpbml0aW9ucyBvZiBzdHJ1Y3R1cmVzIGFuZCBiaXQgdmFsdWVzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3Jlc291cmNlLmg+CisKKyNpZm5kZWYgX19pZF90X2RlZmluZWQKK3R5cGVkZWYgX19pZF90IGlkX3Q7CisjIGRlZmluZSBfX2lkX3RfZGVmaW5lZAorI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworLyogVGhlIFgvT3BlbiBzdGFuZGFyZCBkZWZpbmVzIHRoYXQgYWxsIHRoZSBmdW5jdGlvbnMgYmVsb3cgbXVzdCB1c2UKKyAgIGBpbnQnIGFzIHRoZSB0eXBlIGZvciB0aGUgZmlyc3QgYXJndW1lbnQuICBXaGVuIHdlIGFyZSBjb21waWxpbmcgd2l0aAorICAgR05VIGV4dGVuc2lvbnMgd2UgY2hhbmdlIHRoaXMgc2xpZ2h0bHkgdG8gcHJvdmlkZSBiZXR0ZXIgZXJyb3IKKyAgIGNoZWNraW5nLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX0dOVSAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cwordHlwZWRlZiBlbnVtIF9fcmxpbWl0X3Jlc291cmNlIF9fcmxpbWl0X3Jlc291cmNlX3Q7Cit0eXBlZGVmIGVudW0gX19ydXNhZ2Vfd2hvIF9fcnVzYWdlX3dob190OwordHlwZWRlZiBlbnVtIF9fcHJpb3JpdHlfd2hpY2ggX19wcmlvcml0eV93aGljaF90OworI2Vsc2UKK3R5cGVkZWYgaW50IF9fcmxpbWl0X3Jlc291cmNlX3Q7Cit0eXBlZGVmIGludCBfX3J1c2FnZV93aG9fdDsKK3R5cGVkZWYgaW50IF9fcHJpb3JpdHlfd2hpY2hfdDsKKyNlbmRpZgorCisvKiBQdXQgdGhlIHNvZnQgYW5kIGhhcmQgbGltaXRzIGZvciBSRVNPVVJDRSBpbiAqUkxJTUlUUy4KKyAgIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAtMSBpZiBub3QgKGFuZCBzZXRzIGVycm5vKS4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgZ2V0cmxpbWl0IChfX3JsaW1pdF9yZXNvdXJjZV90IF9fcmVzb3VyY2UsCisJCSAgICAgIHN0cnVjdCBybGltaXQgKl9fcmxpbWl0cykgX19USFJPVzsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChnZXRybGltaXQsIChfX3JsaW1pdF9yZXNvdXJjZV90IF9fcmVzb3VyY2UsCisJCQkJICAgICAgIHN0cnVjdCBybGltaXQgKl9fcmxpbWl0cyksIGdldHJsaW1pdDY0KTsKKyMgZWxzZQorIyAgZGVmaW5lIGdldHJsaW1pdCBnZXRybGltaXQ2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZ2V0cmxpbWl0NjQgKF9fcmxpbWl0X3Jlc291cmNlX3QgX19yZXNvdXJjZSwKKwkJCXN0cnVjdCBybGltaXQ2NCAqX19ybGltaXRzKSBfX1RIUk9XOworI2VuZGlmCisKKy8qIFNldCB0aGUgc29mdCBhbmQgaGFyZCBsaW1pdHMgZm9yIFJFU09VUkNFIHRvICpSTElNSVRTLgorICAgT25seSB0aGUgc3VwZXItdXNlciBjYW4gaW5jcmVhc2UgaGFyZCBsaW1pdHMuCisgICBSZXR1cm4gMCBpZiBzdWNjZXNzZnVsLCAtMSBpZiBub3QgKGFuZCBzZXRzIGVycm5vKS4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgc2V0cmxpbWl0IChfX3JsaW1pdF9yZXNvdXJjZV90IF9fcmVzb3VyY2UsCisJCSAgICAgIF9fY29uc3Qgc3RydWN0IHJsaW1pdCAqX19ybGltaXRzKSBfX1RIUk9XOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHNldHJsaW1pdCwgKF9fcmxpbWl0X3Jlc291cmNlX3QgX19yZXNvdXJjZSwKKwkJCQkgICAgICAgX19jb25zdCBzdHJ1Y3QgcmxpbWl0ICpfX3JsaW1pdHMpLAorCQkJICAgc2V0cmxpbWl0NjQpOworIyBlbHNlCisjICBkZWZpbmUgc2V0cmxpbWl0IHNldHJsaW1pdDY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBzZXRybGltaXQ2NCAoX19ybGltaXRfcmVzb3VyY2VfdCBfX3Jlc291cmNlLAorCQkJX19jb25zdCBzdHJ1Y3QgcmxpbWl0NjQgKl9fcmxpbWl0cykgX19USFJPVzsKKyNlbmRpZgorCisvKiBSZXR1cm4gcmVzb3VyY2UgdXNhZ2UgaW5mb3JtYXRpb24gb24gcHJvY2VzcyBpbmRpY2F0ZWQgYnkgV0hPCisgICBhbmQgcHV0IGl0IGluICpVU0FHRS4gIFJldHVybnMgMCBmb3Igc3VjY2VzcywgLTEgZm9yIGZhaWx1cmUuICAqLworZXh0ZXJuIGludCBnZXRydXNhZ2UgKF9fcnVzYWdlX3dob190IF9fd2hvLCBzdHJ1Y3QgcnVzYWdlICpfX3VzYWdlKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgb2YgYW55IHByb2Nlc3Mgc3BlY2lmaWVkIGJ5IFdISUNIIGFuZCBXSE8KKyAgIChzZWUgYWJvdmUpOyBpZiBXSE8gaXMgemVybywgdGhlIGN1cnJlbnQgcHJvY2VzcywgcHJvY2VzcyBncm91cCwgb3IgdXNlcgorICAgKGFzIHNwZWNpZmllZCBieSBXSE8pIGlzIHVzZWQuICBBIGxvd2VyIHByaW9yaXR5IG51bWJlciBtZWFucyBoaWdoZXIKKyAgIHByaW9yaXR5LiAgUHJpb3JpdGllcyByYW5nZSBmcm9tIFBSSU9fTUlOIHRvIFBSSU9fTUFYIChhYm92ZSkuICAqLworZXh0ZXJuIGludCBnZXRwcmlvcml0eSAoX19wcmlvcml0eV93aGljaF90IF9fd2hpY2gsIGlkX3QgX193aG8pIF9fVEhST1c7CisKKy8qIFNldCB0aGUgcHJpb3JpdHkgb2YgYWxsIHByb2Nlc3NlcyBzcGVjaWZpZWQgYnkgV0hJQ0ggYW5kIFdITyAoc2VlIGFib3ZlKQorICAgdG8gUFJJTy4gIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzZXRwcmlvcml0eSAoX19wcmlvcml0eV93aGljaF90IF9fd2hpY2gsIGlkX3QgX193aG8sIGludCBfX3ByaW8pCisgICAgIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvcmVzb3VyY2UuaCAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc2VsZWN0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZjJiM2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NlbGVjdC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKiBgZmRfc2V0JyB0eXBlIGFuZCByZWxhdGVkIG1hY3JvcywgYW5kIGBzZWxlY3QnL2Bwc2VsZWN0JyBkZWNsYXJhdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMywgMjAwOSwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoJUE9TSVggMTAwMy4xZzogNi4yIFNlbGVjdCBmcm9tIEZpbGUgRGVzY3JpcHRvciBTZXRzIDxzeXMvc2VsZWN0Lmg+ICAqLworCisjaWZuZGVmIF9TWVNfU0VMRUNUX0gKKyNkZWZpbmUgX1NZU19TRUxFQ1RfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgZGVmaW5pdGlvbiBvZiBuZWVkZWQgYmFzaWMgdHlwZXMuICAqLworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogR2V0IF9fRkRfKiBkZWZpbml0aW9ucy4gICovCisjaW5jbHVkZSA8Yml0cy9zZWxlY3QuaD4KKworLyogR2V0IF9fc2lnc2V0X3QuICAqLworI2luY2x1ZGUgPGJpdHMvc2lnc2V0Lmg+CisKKyNpZm5kZWYgX19zaWdzZXRfdF9kZWZpbmVkCisjIGRlZmluZSBfX3NpZ3NldF90X2RlZmluZWQKK3R5cGVkZWYgX19zaWdzZXRfdCBzaWdzZXRfdDsKKyNlbmRpZgorCisvKiBHZXQgZGVmaW5pdGlvbiBvZiB0aW1lciBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZXMuICAqLworI2RlZmluZSBfX25lZWRfdGltZV90CisjZGVmaW5lIF9fbmVlZF90aW1lc3BlYworI2luY2x1ZGUgPHRpbWUuaD4KKyNkZWZpbmUgX19uZWVkX3RpbWV2YWwKKyNpbmNsdWRlIDxiaXRzL3RpbWUuaD4KKworI2lmbmRlZiBfX3N1c2Vjb25kc190X2RlZmluZWQKK3R5cGVkZWYgX19zdXNlY29uZHNfdCBzdXNlY29uZHNfdDsKKyMgZGVmaW5lIF9fc3VzZWNvbmRzX3RfZGVmaW5lZAorI2VuZGlmCisKKworLyogVGhlIGZkX3NldCBtZW1iZXIgaXMgcmVxdWlyZWQgdG8gYmUgYW4gYXJyYXkgb2YgbG9uZ3MuICAqLwordHlwZWRlZiBsb25nIGludCBfX2ZkX21hc2s7CisKKy8qIFNvbWUgdmVyc2lvbnMgb2YgPGxpbnV4L3Bvc2l4X3R5cGVzLmg+IGRlZmluZSB0aGlzIG1hY3Jvcy4gICovCisjdW5kZWYJX19ORkRCSVRTCisvKiBJdCdzIGVhc2llciB0byBhc3N1bWUgOC1iaXQgYnl0ZXMgdGhhbiB0byBnZXQgQ0hBUl9CSVQuICAqLworI2RlZmluZSBfX05GREJJVFMJKDggKiAoaW50KSBzaXplb2YgKF9fZmRfbWFzaykpCisjZGVmaW5lCV9fRkRfRUxUKGQpCSgoZCkgLyBfX05GREJJVFMpCisjZGVmaW5lCV9fRkRfTUFTSyhkKQkoKF9fZmRfbWFzaykgMSA8PCAoKGQpICUgX19ORkRCSVRTKSkKKworLyogZmRfc2V0IGZvciBzZWxlY3QgYW5kIHBzZWxlY3QuICAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIC8qIFhQRzQuMiByZXF1aXJlcyB0aGlzIG1lbWJlciBuYW1lLiAgT3RoZXJ3aXNlIGF2b2lkIHRoZSBuYW1lCisgICAgICAgZnJvbSB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gICovCisjaWZkZWYgX19VU0VfWE9QRU4KKyAgICBfX2ZkX21hc2sgZmRzX2JpdHNbX19GRF9TRVRTSVpFIC8gX19ORkRCSVRTXTsKKyMgZGVmaW5lIF9fRkRTX0JJVFMoc2V0KSAoKHNldCktPmZkc19iaXRzKQorI2Vsc2UKKyAgICBfX2ZkX21hc2sgX19mZHNfYml0c1tfX0ZEX1NFVFNJWkUgLyBfX05GREJJVFNdOworIyBkZWZpbmUgX19GRFNfQklUUyhzZXQpICgoc2V0KS0+X19mZHNfYml0cykKKyNlbmRpZgorICB9IGZkX3NldDsKKworLyogTWF4aW11bSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBpbiBgZmRfc2V0Jy4gICovCisjZGVmaW5lCUZEX1NFVFNJWkUJCV9fRkRfU0VUU0laRQorCisjaWZkZWYgX19VU0VfTUlTQworLyogU29tZXRpbWVzIHRoZSBmZF9zZXQgbWVtYmVyIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGlzIHR5cGUuICAqLwordHlwZWRlZiBfX2ZkX21hc2sgZmRfbWFzazsKKworLyogTnVtYmVyIG9mIGJpdHMgcGVyIHdvcmQgb2YgYGZkX3NldCcgKHNvbWUgY29kZSBhc3N1bWVzIHRoaXMgaXMgMzIpLiAgKi8KKyMgZGVmaW5lIE5GREJJVFMJCV9fTkZEQklUUworI2VuZGlmCisKKworLyogQWNjZXNzIG1hY3JvcyBmb3IgYGZkX3NldCcuICAqLworI2RlZmluZQlGRF9TRVQoZmQsIGZkc2V0cCkJX19GRF9TRVQgKGZkLCBmZHNldHApCisjZGVmaW5lCUZEX0NMUihmZCwgZmRzZXRwKQlfX0ZEX0NMUiAoZmQsIGZkc2V0cCkKKyNkZWZpbmUJRkRfSVNTRVQoZmQsIGZkc2V0cCkJX19GRF9JU1NFVCAoZmQsIGZkc2V0cCkKKyNkZWZpbmUJRkRfWkVSTyhmZHNldHApCQlfX0ZEX1pFUk8gKGZkc2V0cCkKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIENoZWNrIHRoZSBmaXJzdCBORkRTIGRlc2NyaXB0b3JzIGVhY2ggaW4gUkVBREZEUyAoaWYgbm90IE5VTEwpIGZvciByZWFkCisgICByZWFkaW5lc3MsIGluIFdSSVRFRkRTIChpZiBub3QgTlVMTCkgZm9yIHdyaXRlIHJlYWRpbmVzcywgYW5kIGluIEVYQ0VQVEZEUworICAgKGlmIG5vdCBOVUxMKSBmb3IgZXhjZXB0aW9uYWwgY29uZGl0aW9ucy4gIElmIFRJTUVPVVQgaXMgbm90IE5VTEwsIHRpbWUgb3V0CisgICBhZnRlciB3YWl0aW5nIHRoZSBpbnRlcnZhbCBzcGVjaWZpZWQgdGhlcmVpbi4gIFJldHVybnMgdGhlIG51bWJlciBvZiByZWFkeQorICAgZGVzY3JpcHRvcnMsIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzZWxlY3QgKGludCBfX25mZHMsIGZkX3NldCAqX19yZXN0cmljdCBfX3JlYWRmZHMsCisJCSAgIGZkX3NldCAqX19yZXN0cmljdCBfX3dyaXRlZmRzLAorCQkgICBmZF9zZXQgKl9fcmVzdHJpY3QgX19leGNlcHRmZHMsCisJCSAgIHN0cnVjdCB0aW1ldmFsICpfX3Jlc3RyaWN0IF9fdGltZW91dCk7CisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBTYW1lIGFzIGFib3ZlIG9ubHkgdGhhdCB0aGUgVElNRU9VVCB2YWx1ZSBpcyBnaXZlbiB3aXRoIGhpZ2hlcgorICAgcmVzb2x1dGlvbiBhbmQgYSBzaWdtYXNrIHdoaWNoIGlzIGJlZW4gc2V0IHRlbXBvcmFyaWx5LiAgVGhpcyB2ZXJzaW9uCisgICBzaG91bGQgYmUgdXNlZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHBzZWxlY3QgKGludCBfX25mZHMsIGZkX3NldCAqX19yZXN0cmljdCBfX3JlYWRmZHMsCisJCSAgICBmZF9zZXQgKl9fcmVzdHJpY3QgX193cml0ZWZkcywKKwkJICAgIGZkX3NldCAqX19yZXN0cmljdCBfX2V4Y2VwdGZkcywKKwkJICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXN0cmljdCBfX3RpbWVvdXQsCisJCSAgICBjb25zdCBfX3NpZ3NldF90ICpfX3Jlc3RyaWN0IF9fc2lnbWFzayk7CisjZW5kaWYKKworCisvKiBEZWZpbmUgc29tZSBpbmxpbmVzIGhlbHBpbmcgdG8gY2F0Y2ggY29tbW9uIHByb2JsZW1zLiAgKi8KKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fR05VQ19fCisjIGluY2x1ZGUgPGJpdHMvc2VsZWN0Mi5oPgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvc2VsZWN0LmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc2VtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTU3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NlbS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0VNX0gKKyNkZWZpbmUgX1NZU19TRU1fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogR2V0IGNvbW1vbiBkZWZpbml0aW9uIG9mIFN5c3RlbSBWIHN0eWxlIElQQy4gICovCisjaW5jbHVkZSA8c3lzL2lwYy5oPgorCisvKiBHZXQgc3lzdGVtIGRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgc2VtaWRfZHMnIGFuZCBtb3JlLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NlbS5oPgorCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBfX25lZWRfdGltZXNwZWMKKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgU3lzdGVtIFYgc3R5bGUgSVBDIGZ1bmN0aW9ucyBpbXBsZW1lbnQgYSBzZW1hcGhvcmUKKyAgIGhhbmRsaW5nLiAgVGhlIGRlZmluaXRpb24gaXMgZm91bmQgaW4gWFBHMi4gICovCisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciBhcmd1bWVudCB0byBgc2Vtb3AnIHRvIGRlc2NyaWJlIG9wZXJhdGlvbnMuICAqLworc3RydWN0IHNlbWJ1ZgoreworICB1bnNpZ25lZCBzaG9ydCBpbnQgc2VtX251bTsJLyogc2VtYXBob3JlIG51bWJlciAqLworICBzaG9ydCBpbnQgc2VtX29wOwkJLyogc2VtYXBob3JlIG9wZXJhdGlvbiAqLworICBzaG9ydCBpbnQgc2VtX2ZsZzsJCS8qIG9wZXJhdGlvbiBmbGFnICovCit9OworCisKK19fQkVHSU5fREVDTFMKKworLyogU2VtYXBob3JlIGNvbnRyb2wgb3BlcmF0aW9uLiAgKi8KK2V4dGVybiBpbnQgc2VtY3RsIChpbnQgX19zZW1pZCwgaW50IF9fc2VtbnVtLCBpbnQgX19jbWQsIC4uLikgX19USFJPVzsKKworLyogR2V0IHNlbWFwaG9yZS4gICovCitleHRlcm4gaW50IHNlbWdldCAoa2V5X3QgX19rZXksIGludCBfX25zZW1zLCBpbnQgX19zZW1mbGcpIF9fVEhST1c7CisKKy8qIE9wZXJhdGUgb24gc2VtYXBob3JlLiAgKi8KK2V4dGVybiBpbnQgc2Vtb3AgKGludCBfX3NlbWlkLCBzdHJ1Y3Qgc2VtYnVmICpfX3NvcHMsIHNpemVfdCBfX25zb3BzKSBfX1RIUk9XOworCisjaWZkZWYgX19VU0VfR05VCisvKiBPcGVyYXRlIG9uIHNlbWFwaG9yZSB3aXRoIHRpbWVvdXQuICAqLworZXh0ZXJuIGludCBzZW10aW1lZG9wIChpbnQgX19zZW1pZCwgc3RydWN0IHNlbWJ1ZiAqX19zb3BzLCBzaXplX3QgX19uc29wcywKKwkJICAgICAgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3RpbWVvdXQpIF9fVEhST1c7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9zZW0uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zZW5kZmlsZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zZW5kZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTM2N2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NlbmRmaWxlLmgKQEAgLTAsMCArMSw1MiBAQAorLyogc2VuZGZpbGUgLS0gY29weSBkYXRhIGRpcmVjdGx5IGZyb20gb25lIGZpbGUgZGVzY3JpcHRvciB0byBhbm90aGVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsOTksMDEsMjAwMiwyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0VOREZJTEVfSAorI2RlZmluZSBfU1lTX1NFTkRGSUxFX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBTZW5kIHVwIHRvIENPVU5UIGJ5dGVzIGZyb20gZmlsZSBhc3NvY2lhdGVkIHdpdGggSU5fRkQgc3RhcnRpbmcgYXQKKyAgICpPRkZTRVQgdG8gZGVzY3JpcHRvciBPVVRfRkQuICBTZXQgKk9GRlNFVCB0byB0aGUgSU5fRkQncyBmaWxlIHBvc2l0aW9uCisgICBmb2xsb3dpbmcgdGhlIHJlYWQgYnl0ZXMuICBJZiBPRkZTRVQgaXMgYSBudWxsIHBvaW50ZXIsIHVzZSB0aGUgbm9ybWFsCisgICBmaWxlIHBvc2l0aW9uIGluc3RlYWQuICBSZXR1cm4gdGhlIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzLCBvciAtMSBpbgorICAgY2FzZSBvZiBlcnJvci4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBzc2l6ZV90IHNlbmRmaWxlIChpbnQgX19vdXRfZmQsIGludCBfX2luX2ZkLCBvZmZfdCAqX19vZmZzZXQsCisJCQkgc2l6ZV90IF9fY291bnQpIF9fVEhST1c7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVF9OVEggKHNlbmRmaWxlLAorCQkJICAgICAgIChpbnQgX19vdXRfZmQsIGludCBfX2luX2ZkLCBfX29mZjY0X3QgKl9fb2Zmc2V0LAorCQkJCXNpemVfdCBfX2NvdW50KSwgc2VuZGZpbGU2NCk7CisjIGVsc2UKKyMgIGRlZmluZSBzZW5kZmlsZSBzZW5kZmlsZTY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIHNzaXplX3Qgc2VuZGZpbGU2NCAoaW50IF9fb3V0X2ZkLCBpbnQgX19pbl9mZCwgX19vZmY2NF90ICpfX29mZnNldCwKKwkJCSAgIHNpemVfdCBfX2NvdW50KSBfX1RIUk9XOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvc2VuZGZpbGUuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zaG0uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc2htLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg2Y2U3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc2htLmgKQEAgLTAsMCArMSw2NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TSE1fSAorI2RlZmluZSBfU1lTX1NITV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBHZXQgY29tbW9uIGRlZmluaXRpb24gb2YgU3lzdGVtIFYgc3R5bGUgSVBDLiAgKi8KKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisKKy8qIEdldCBzeXN0ZW0gZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYHN0cnVjdCBzaG1pZF9kcycgYW5kIG1vcmUuICAqLworI2luY2x1ZGUgPGJpdHMvc2htLmg+CisKKy8qIERlZmluZSB0eXBlcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQuICAqLworI2RlZmluZSBfX25lZWRfdGltZV90CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgX19VU0VfWE9QRU4KKyMgaWZuZGVmIF9fcGlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3BpZF90IHBpZF90OworIyAgZGVmaW5lIF9fcGlkX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCS8qIFgvT3BlbiAqLworCisKK19fQkVHSU5fREVDTFMKKworLyogVGhlIGZvbGxvd2luZyBTeXN0ZW0gViBzdHlsZSBJUEMgZnVuY3Rpb25zIGltcGxlbWVudCBhIHNoYXJlZCBtZW1vcnkKKyAgIGZhY2lsaXR5LiAgVGhlIGRlZmluaXRpb24gaXMgZm91bmQgaW4gWFBHNC4yLiAgKi8KKworLyogU2hhcmVkIG1lbW9yeSBjb250cm9sIG9wZXJhdGlvbi4gICovCitleHRlcm4gaW50IHNobWN0bCAoaW50IF9fc2htaWQsIGludCBfX2NtZCwgc3RydWN0IHNobWlkX2RzICpfX2J1ZikgX19USFJPVzsKKworLyogR2V0IHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gICovCitleHRlcm4gaW50IHNobWdldCAoa2V5X3QgX19rZXksIHNpemVfdCBfX3NpemUsIGludCBfX3NobWZsZykgX19USFJPVzsKKworLyogQXR0YWNoIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gICovCitleHRlcm4gdm9pZCAqc2htYXQgKGludCBfX3NobWlkLCBfX2NvbnN0IHZvaWQgKl9fc2htYWRkciwgaW50IF9fc2htZmxnKQorICAgICBfX1RIUk9XOworCisvKiBEZXRhY2ggc2hhcmVkIG1lbW9yeSBzZWdtZW50LiAgKi8KK2V4dGVybiBpbnQgc2htZHQgKF9fY29uc3Qgdm9pZCAqX19zaG1hZGRyKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3NobS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NpZ25hbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTYwMmRhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zaWduYWwuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8c2lnbmFsLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NpZ25hbGZkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NpZ25hbGZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViMjdlZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc2lnbmFsZmQuaApAQCAtMCwwICsxLDY2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19TSUdOQUxGRF9ICisjZGVmaW5lCV9TWVNfU0lHTkFMRkRfSAkxCisKKyNkZWZpbmUgX19uZWVkX3NpZ3NldF90CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKworc3RydWN0IHNpZ25hbGZkX3NpZ2luZm8KK3sKKyAgdWludDMyX3Qgc3NpX3NpZ25vOworICBpbnQzMl90IHNzaV9lcnJubzsKKyAgaW50MzJfdCBzc2lfY29kZTsKKyAgdWludDMyX3Qgc3NpX3BpZDsKKyAgdWludDMyX3Qgc3NpX3VpZDsKKyAgaW50MzJfdCBzc2lfZmQ7CisgIHVpbnQzMl90IHNzaV90aWQ7CisgIHVpbnQzMl90IHNzaV9iYW5kOworICB1aW50MzJfdCBzc2lfb3ZlcnJ1bjsKKyAgdWludDMyX3Qgc3NpX3RyYXBubzsKKyAgaW50MzJfdCBzc2lfc3RhdHVzOworICBpbnQzMl90IHNzaV9pbnQ7CisgIHVpbnQ2NF90IHNzaV9wdHI7CisgIHVpbnQ2NF90IHNzaV91dGltZTsKKyAgdWludDY0X3Qgc3NpX3N0aW1lOworICB1aW50NjRfdCBzc2lfYWRkcjsKKyAgdWludDhfdCBfX3BhZFs0OF07Cit9OworCisvKiBGbGFncyBmb3Igc2lnbmFsZmQuICAqLworZW51bQorICB7CisgICAgU0ZEX0NMT0VYRUMgPSAwMjAwMDAwMCwKKyNkZWZpbmUgU0ZEX0NMT0VYRUMgU0ZEX0NMT0VYRUMKKyAgICBTRkRfTk9OQkxPQ0sgPSAwNDAwMAorI2RlZmluZSBTRkRfTk9OQkxPQ0sgU0ZEX05PTkJMT0NLCisgIH07CisKK19fQkVHSU5fREVDTFMKKworLyogUmVxdWVzdCBub3RpZmljYXRpb24gZm9yIGRlbGl2ZXJ5IG9mIHNpZ25hbHMgaW4gTUFTSyB0byBiZQorICAgcGVyZm9ybWVkIHVzaW5nIGRlc2NyaXB0b3IgRkQuKi8KK2V4dGVybiBpbnQgc2lnbmFsZmQgKGludCBfX2ZkLCBjb25zdCBzaWdzZXRfdCAqX19tYXNrLCBpbnQgX19mbGFncykKKyAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvc2lnbmFsZmQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zb2NrZXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxZjU2ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc29ja2V0LmgKQEAgLTAsMCArMSwyNTYgQEAKKy8qIERlY2xhcmF0aW9ucyBvZiBzb2NrZXQgY29uc3RhbnRzLCB0eXBlcywgYW5kIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5MSw5MiwxOTk0LTIwMDEsMjAwMywyMDA1LDIwMDcsMjAwOAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19TT0NLRVRfSAorI2RlZmluZQlfU1lTX1NPQ0tFVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNkZWZpbmUJX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmZGVmIF9fVVNFX0dOVQorLyogR2V0IHRoZSBfX3NpZ3NldF90IGRlZmluaXRpb24uICAqLworIyBpbmNsdWRlIDxiaXRzL3NpZ3NldC5oPgorI2VuZGlmCisKKworLyogVGhpcyBvcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIFNPQ0tfKiwgUEZfKiwKKyAgIEFGXyosIE1TR18qLCBTT0xfKiwgYW5kIFNPXyogY29uc3RhbnRzLCBhbmQgdGhlIGBzdHJ1Y3Qgc29ja2FkZHInLAorICAgYHN0cnVjdCBtc2doZHInLCBhbmQgYHN0cnVjdCBsaW5nZXInIHR5cGVzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NvY2tldC5oPgorCisjaWZkZWYgX19VU0VfQlNECisvKiBUaGlzIGlzIHRoZSA0LjMgQlNEIGBzdHJ1Y3Qgc29ja2FkZHInIGZvcm1hdCwgd2hpY2ggaXMgdXNlZCBhcyB3aXJlCisgICBmb3JtYXQgaW4gdGhlIGdyb3R0eSBvbGQgNC4zIGB0YWxrJyBwcm90b2NvbC4gICovCitzdHJ1Y3Qgb3NvY2thZGRyCisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgc2FfZmFtaWx5OworICAgIHVuc2lnbmVkIGNoYXIgc2FfZGF0YVsxNF07CisgIH07CisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mCisgICBgc2h1dGRvd24nLiAgKi8KK2VudW0KK3sKKyAgU0hVVF9SRCA9IDAsCQkvKiBObyBtb3JlIHJlY2VwdGlvbnMuICAqLworI2RlZmluZSBTSFVUX1JECQlTSFVUX1JECisgIFNIVVRfV1IsCQkvKiBObyBtb3JlIHRyYW5zbWlzc2lvbnMuICAqLworI2RlZmluZSBTSFVUX1dSCQlTSFVUX1dSCisgIFNIVVRfUkRXUgkJLyogTm8gbW9yZSByZWNlcHRpb25zIG9yIHRyYW5zbWlzc2lvbnMuICAqLworI2RlZmluZSBTSFVUX1JEV1IJU0hVVF9SRFdSCit9OworCisvKiBUaGlzIGlzIHRoZSB0eXBlIHdlIHVzZSBmb3IgZ2VuZXJpYyBzb2NrZXQgYWRkcmVzcyBhcmd1bWVudHMuCisKKyAgIFdpdGggR0NDIDIuNyBhbmQgbGF0ZXIsIHRoZSBmdW5reSB1bmlvbiBjYXVzZXMgcmVkZWNsYXJhdGlvbnMgb3IKKyAgIHVzZXMgd2l0aCBhbnkgb2YgdGhlIGxpc3RlZCB0eXBlcyB0byBiZSBhbGxvd2VkIHdpdGhvdXQgY29tcGxhaW50LgorICAgRysrIDIuNyBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zcGFyZW50IHVuaW9ucyBzbyB0aGVyZSB3ZSB3YW50IHRoZQorICAgb2xkLXN0eWxlIGRlY2xhcmF0aW9uLCB0b28uICAqLworI2lmIGRlZmluZWQgX19jcGx1c3BsdXMgfHwgIV9fR05VQ19QUkVSRVEgKDIsIDcpIHx8ICFkZWZpbmVkIF9fVVNFX0dOVQorIyBkZWZpbmUgX19TT0NLQUREUl9BUkcJCXN0cnVjdCBzb2NrYWRkciAqX19yZXN0cmljdAorIyBkZWZpbmUgX19DT05TVF9TT0NLQUREUl9BUkcJX19jb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKgorI2Vsc2UKKy8qIEFkZCBtb3JlIGBzdHJ1Y3Qgc29ja2FkZHJfQUYnIHR5cGVzIGhlcmUgYXMgbmVjZXNzYXJ5LgorICAgVGhlc2UgYXJlIGFsbCB0aGUgb25lcyBJIGZvdW5kIG9uIE5ldEJTRCBhbmQgTGludXguICAqLworIyBkZWZpbmUgX19TT0NLQUREUl9BTExUWVBFUyBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHIpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9hdCkgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX2F4MjUpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9kbCkgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX2VvbikgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX2luKSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfaW42KSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfaW5hcnApIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9pcHgpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9pc28pIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9ucykgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX3VuKSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfeDI1KQorCisjIGRlZmluZSBfX1NPQ0tBRERSX09ORVRZUEUodHlwZSkgc3RydWN0IHR5cGUgKl9fcmVzdHJpY3QgX18jI3R5cGUjI19fOwordHlwZWRlZiB1bmlvbiB7IF9fU09DS0FERFJfQUxMVFlQRVMKKwkgICAgICB9IF9fU09DS0FERFJfQVJHIF9fYXR0cmlidXRlX18gKChfX3RyYW5zcGFyZW50X3VuaW9uX18pKTsKKyMgdW5kZWYgX19TT0NLQUREUl9PTkVUWVBFCisjIGRlZmluZSBfX1NPQ0tBRERSX09ORVRZUEUodHlwZSkgX19jb25zdCBzdHJ1Y3QgdHlwZSAqX19yZXN0cmljdCBfXyMjdHlwZSMjX187Cit0eXBlZGVmIHVuaW9uIHsgX19TT0NLQUREUl9BTExUWVBFUworCSAgICAgIH0gX19DT05TVF9TT0NLQUREUl9BUkcgX19hdHRyaWJ1dGVfXyAoKF9fdHJhbnNwYXJlbnRfdW5pb25fXykpOworIyB1bmRlZiBfX1NPQ0tBRERSX09ORVRZUEUKKyNlbmRpZgorCisKKy8qIENyZWF0ZSBhIG5ldyBzb2NrZXQgb2YgdHlwZSBUWVBFIGluIGRvbWFpbiBET01BSU4sIHVzaW5nCisgICBwcm90b2NvbCBQUk9UT0NPTC4gIElmIFBST1RPQ09MIGlzIHplcm8sIG9uZSBpcyBjaG9zZW4gYXV0b21hdGljYWxseS4KKyAgIFJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBuZXcgc29ja2V0LCBvciAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgc29ja2V0IChpbnQgX19kb21haW4sIGludCBfX3R5cGUsIGludCBfX3Byb3RvY29sKSBfX1RIUk9XOworCisvKiBDcmVhdGUgdHdvIG5ldyBzb2NrZXRzLCBvZiB0eXBlIFRZUEUgaW4gZG9tYWluIERPTUFJTiBhbmQgdXNpbmcKKyAgIHByb3RvY29sIFBST1RPQ09MLCB3aGljaCBhcmUgY29ubmVjdGVkIHRvIGVhY2ggb3RoZXIsIGFuZCBwdXQgZmlsZQorICAgZGVzY3JpcHRvcnMgZm9yIHRoZW0gaW4gRkRTWzBdIGFuZCBGRFNbMV0uICBJZiBQUk9UT0NPTCBpcyB6ZXJvLAorICAgb25lIHdpbGwgYmUgY2hvc2VuIGF1dG9tYXRpY2FsbHkuICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IHNvY2tldHBhaXIgKGludCBfX2RvbWFpbiwgaW50IF9fdHlwZSwgaW50IF9fcHJvdG9jb2wsCisJCSAgICAgICBpbnQgX19mZHNbMl0pIF9fVEhST1c7CisKKy8qIEdpdmUgdGhlIHNvY2tldCBGRCB0aGUgbG9jYWwgYWRkcmVzcyBBRERSICh3aGljaCBpcyBMRU4gYnl0ZXMgbG9uZykuICAqLworZXh0ZXJuIGludCBiaW5kIChpbnQgX19mZCwgX19DT05TVF9TT0NLQUREUl9BUkcgX19hZGRyLCBzb2NrbGVuX3QgX19sZW4pCisgICAgIF9fVEhST1c7CisKKy8qIFB1dCB0aGUgbG9jYWwgYWRkcmVzcyBvZiBGRCBpbnRvICpBRERSIGFuZCBpdHMgbGVuZ3RoIGluICpMRU4uICAqLworZXh0ZXJuIGludCBnZXRzb2NrbmFtZSAoaW50IF9fZmQsIF9fU09DS0FERFJfQVJHIF9fYWRkciwKKwkJCXNvY2tsZW5fdCAqX19yZXN0cmljdCBfX2xlbikgX19USFJPVzsKKworLyogT3BlbiBhIGNvbm5lY3Rpb24gb24gc29ja2V0IEZEIHRvIHBlZXIgYXQgQUREUiAod2hpY2ggTEVOIGJ5dGVzIGxvbmcpLgorICAgRm9yIGNvbm5lY3Rpb25sZXNzIHNvY2tldCB0eXBlcywganVzdCBzZXQgdGhlIGRlZmF1bHQgYWRkcmVzcyB0byBzZW5kIHRvCisgICBhbmQgdGhlIG9ubHkgYWRkcmVzcyBmcm9tIHdoaWNoIHRvIGFjY2VwdCB0cmFuc21pc3Npb25zLgorICAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGNvbm5lY3QgKGludCBfX2ZkLCBfX0NPTlNUX1NPQ0tBRERSX0FSRyBfX2FkZHIsIHNvY2tsZW5fdCBfX2xlbik7CisKKy8qIFB1dCB0aGUgYWRkcmVzcyBvZiB0aGUgcGVlciBjb25uZWN0ZWQgdG8gc29ja2V0IEZEIGludG8gKkFERFIKKyAgICh3aGljaCBpcyAqTEVOIGJ5dGVzIGxvbmcpLCBhbmQgaXRzIGFjdHVhbCBsZW5ndGggaW50byAqTEVOLiAgKi8KK2V4dGVybiBpbnQgZ2V0cGVlcm5hbWUgKGludCBfX2ZkLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCQlzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19sZW4pIF9fVEhST1c7CisKKworLyogU2VuZCBOIGJ5dGVzIG9mIEJVRiB0byBzb2NrZXQgRkQuICBSZXR1cm5zIHRoZSBudW1iZXIgc2VudCBvciAtMS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCBzZW5kIChpbnQgX19mZCwgX19jb25zdCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbiwgaW50IF9fZmxhZ3MpOworCisvKiBSZWFkIE4gYnl0ZXMgaW50byBCVUYgZnJvbSBzb2NrZXQgRkQuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgcmVhZCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHJlY3YgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbiwgaW50IF9fZmxhZ3MpOworCisvKiBTZW5kIE4gYnl0ZXMgb2YgQlVGIG9uIHNvY2tldCBGRCB0byBwZWVyIGF0IGFkZHJlc3MgQUREUiAod2hpY2ggaXMKKyAgIEFERFJfTEVOIGJ5dGVzIGxvbmcpLiAgUmV0dXJucyB0aGUgbnVtYmVyIHNlbnQsIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3Qgc2VuZHRvIChpbnQgX19mZCwgX19jb25zdCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbiwKKwkJICAgICAgIGludCBfX2ZsYWdzLCBfX0NPTlNUX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCSAgICAgICBzb2NrbGVuX3QgX19hZGRyX2xlbik7CisKKy8qIFJlYWQgTiBieXRlcyBpbnRvIEJVRiB0aHJvdWdoIHNvY2tldCBGRC4KKyAgIElmIEFERFIgaXMgbm90IE5VTEwsIGZpbGwgaW4gKkFERFJfTEVOIGJ5dGVzIG9mIGl0IHdpdGggdGhhIGFkZHJlc3Mgb2YKKyAgIHRoZSBzZW5kZXIsIGFuZCBzdG9yZSB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGFkZHJlc3MgaW4gKkFERFJfTEVOLgorICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEgZm9yIGVycm9ycy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCByZWN2ZnJvbSAoaW50IF9fZmQsIHZvaWQgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX24sCisJCQkgaW50IF9fZmxhZ3MsIF9fU09DS0FERFJfQVJHIF9fYWRkciwKKwkJCSBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19hZGRyX2xlbik7CisKKworLyogU2VuZCBhIG1lc3NhZ2UgZGVzY3JpYmVkIE1FU1NBR0Ugb24gc29ja2V0IEZELgorICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQsIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3Qgc2VuZG1zZyAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IG1zZ2hkciAqX19tZXNzYWdlLAorCQkJaW50IF9fZmxhZ3MpOworCisvKiBSZWNlaXZlIGEgbWVzc2FnZSBhcyBkZXNjcmliZWQgYnkgTUVTU0FHRSBmcm9tIHNvY2tldCBGRC4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgcmVjdm1zZyAoaW50IF9fZmQsIHN0cnVjdCBtc2doZHIgKl9fbWVzc2FnZSwgaW50IF9fZmxhZ3MpOworCisKKy8qIFB1dCB0aGUgY3VycmVudCB2YWx1ZSBmb3Igc29ja2V0IEZEJ3Mgb3B0aW9uIE9QVE5BTUUgYXQgcHJvdG9jb2wgbGV2ZWwgTEVWRUwKKyAgIGludG8gT1BUVkFMICh3aGljaCBpcyAqT1BUTEVOIGJ5dGVzIGxvbmcpLCBhbmQgc2V0ICpPUFRMRU4gdG8gdGhlIHZhbHVlJ3MKKyAgIGFjdHVhbCBsZW5ndGguICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IGdldHNvY2tvcHQgKGludCBfX2ZkLCBpbnQgX19sZXZlbCwgaW50IF9fb3B0bmFtZSwKKwkJICAgICAgIHZvaWQgKl9fcmVzdHJpY3QgX19vcHR2YWwsCisJCSAgICAgICBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19vcHRsZW4pIF9fVEhST1c7CisKKy8qIFNldCBzb2NrZXQgRkQncyBvcHRpb24gT1BUTkFNRSBhdCBwcm90b2NvbCBsZXZlbCBMRVZFTAorICAgdG8gKk9QVFZBTCAod2hpY2ggaXMgT1BUTEVOIGJ5dGVzIGxvbmcpLgorICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzZXRzb2Nrb3B0IChpbnQgX19mZCwgaW50IF9fbGV2ZWwsIGludCBfX29wdG5hbWUsCisJCSAgICAgICBfX2NvbnN0IHZvaWQgKl9fb3B0dmFsLCBzb2NrbGVuX3QgX19vcHRsZW4pIF9fVEhST1c7CisKKworLyogUHJlcGFyZSB0byBhY2NlcHQgY29ubmVjdGlvbnMgb24gc29ja2V0IEZELgorICAgTiBjb25uZWN0aW9uIHJlcXVlc3RzIHdpbGwgYmUgcXVldWVkIGJlZm9yZSBmdXJ0aGVyIHJlcXVlc3RzIGFyZSByZWZ1c2VkLgorICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBsaXN0ZW4gKGludCBfX2ZkLCBpbnQgX19uKSBfX1RIUk9XOworCisvKiBBd2FpdCBhIGNvbm5lY3Rpb24gb24gc29ja2V0IEZELgorICAgV2hlbiBhIGNvbm5lY3Rpb24gYXJyaXZlcywgb3BlbiBhIG5ldyBzb2NrZXQgdG8gY29tbXVuaWNhdGUgd2l0aCBpdCwKKyAgIHNldCAqQUREUiAod2hpY2ggaXMgKkFERFJfTEVOIGJ5dGVzIGxvbmcpIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW5nCisgICBwZWVyIGFuZCAqQUREUl9MRU4gdG8gdGhlIGFkZHJlc3MncyBhY3R1YWwgbGVuZ3RoLCBhbmQgcmV0dXJuIHRoZQorICAgbmV3IHNvY2tldCdzIGRlc2NyaXB0b3IsIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBhY2NlcHQgKGludCBfX2ZkLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCSAgIHNvY2tsZW5fdCAqX19yZXN0cmljdCBfX2FkZHJfbGVuKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogU2ltaWxhciB0byAnYWNjZXB0JyBidXQgdGFrZXMgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgdG8gc3BlY2lmeSBmbGFncy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGFjY2VwdDQgKGludCBfX2ZkLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCSAgICBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19hZGRyX2xlbiwgaW50IF9fZmxhZ3MpOworI2VuZGlmCisKKy8qIFNodXQgZG93biBhbGwgb3IgcGFydCBvZiB0aGUgY29ubmVjdGlvbiBvcGVuIG9uIHNvY2tldCBGRC4KKyAgIEhPVyBkZXRlcm1pbmVzIHdoYXQgdG8gc2h1dCBkb3duOgorICAgICBTSFVUX1JEICAgPSBObyBtb3JlIHJlY2VwdGlvbnM7CisgICAgIFNIVVRfV1IgICA9IE5vIG1vcmUgdHJhbnNtaXNzaW9uczsKKyAgICAgU0hVVF9SRFdSID0gTm8gbW9yZSByZWNlcHRpb25zIG9yIHRyYW5zbWlzc2lvbnMuCisgICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IHNodXRkb3duIChpbnQgX19mZCwgaW50IF9faG93KSBfX1RIUk9XOworCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBEZXRlcm1pbmUgd2hldGVyIHNvY2tldCBpcyBhdCBhIG91dC1vZi1iYW5kIG1hcmsuICAqLworZXh0ZXJuIGludCBzb2NrYXRtYXJrIChpbnQgX19mZCkgX19USFJPVzsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBGRFRZUEUgaXMgU19JRlNPQ0sgb3IgYW5vdGhlciBTX0lGKiBtYWNybyBkZWZpbmVkIGluIDxzeXMvc3RhdC5oPjsKKyAgIHJldHVybnMgMSBpZiBGRCBpcyBvcGVuIG9uIGFuIG9iamVjdCBvZiB0aGUgaW5kaWNhdGVkIHR5cGUsIDAgaWYgbm90LAorICAgb3IgLTEgZm9yIGVycm9ycyAoc2V0dGluZyBlcnJubykuICAqLworZXh0ZXJuIGludCBpc2ZkdHlwZSAoaW50IF9fZmQsIGludCBfX2ZkdHlwZSkgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIERlZmluZSBzb21lIG1hY3JvcyBoZWxwaW5nIHRvIGNhdGNoIGJ1ZmZlciBvdmVyZmxvd3MuICAqLworI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZQorIyBpbmNsdWRlIDxiaXRzL3NvY2tldDIuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3NvY2tldC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NvY2tldHZhci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zb2NrZXR2YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTc3MTU4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zb2NrZXR2YXIuaApAQCAtMCwwICsxLDMgQEAKKy8qIFRoaXMgaGVhZGVyIGlzIHVzZWQgb24gbWFueSBzeXN0ZW1zIGJ1dCBmb3IgR05VIHdlIGhhdmUgZXZlcnl0aGluZworICAgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSBzdGFuZGFyZCBoZWFkZXIuICAqLworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc291bmRjYXJkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NvdW5kY2FyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZGU5ODYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NvdW5kY2FyZC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3RhdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzODllZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3RhdC5oCkBAIC0wLDAgKzEsNTM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTUtMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogNS42IEZpbGUgQ2hhcmFjdGVyaXN0aWNzCTxzeXMvc3RhdC5oPgorICovCisKKyNpZm5kZWYJX1NZU19TVEFUX0gKKyNkZWZpbmUJX1NZU19TVEFUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4JCS8qIEZvciBfX21vZGVfdCBhbmQgX19kZXZfdC4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySyB8fCBkZWZpbmVkIF9fVVNFX01JU0MgXAorCSB8fCBkZWZpbmVkIF9fVVNFX0FURklMRQorIyBpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworIyAgZGVmaW5lIF9fbmVlZF90aW1lX3QKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfQVRGSUxFCisjICBkZWZpbmUgX19uZWVkX3RpbWVzcGVjCisjIGVuZGlmCisjIGluY2x1ZGUgPHRpbWUuaD4JCS8qIEZvciB0aW1lX3QgcmVzcC4gdGltZXNwZWMuICAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworLyogVGhlIFNpbmdsZSBVbml4IHNwZWNpZmljYXRpb24gc2F5cyB0aGF0IHNvbWUgbW9yZSB0eXBlcyBhcmUKKyAgIGF2YWlsYWJsZSBoZXJlLiAgKi8KKyMgaWZuZGVmIF9fZGV2X3RfZGVmaW5lZAordHlwZWRlZiBfX2Rldl90IGRldl90OworIyAgZGVmaW5lIF9fZGV2X3RfZGVmaW5lZAorIyBlbmRpZgorCisjIGlmbmRlZiBfX2dpZF90X2RlZmluZWQKK3R5cGVkZWYgX19naWRfdCBnaWRfdDsKKyMgIGRlZmluZSBfX2dpZF90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19pbm9fdF9kZWZpbmVkCisjICBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAordHlwZWRlZiBfX2lub190IGlub190OworIyAgZWxzZQordHlwZWRlZiBfX2lubzY0X3QgaW5vX3Q7CisjICBlbmRpZgorIyAgZGVmaW5lIF9faW5vX3RfZGVmaW5lZAorIyBlbmRpZgorCisjIGlmbmRlZiBfX21vZGVfdF9kZWZpbmVkCit0eXBlZGVmIF9fbW9kZV90IG1vZGVfdDsKKyMgIGRlZmluZSBfX21vZGVfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fbmxpbmtfdF9kZWZpbmVkCit0eXBlZGVmIF9fbmxpbmtfdCBubGlua190OworIyAgZGVmaW5lIF9fbmxpbmtfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fb2ZmX3RfZGVmaW5lZAorIyAgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19vZmZfdCBvZmZfdDsKKyMgIGVsc2UKK3R5cGVkZWYgX19vZmY2NF90IG9mZl90OworIyAgZW5kaWYKKyMgIGRlZmluZSBfX29mZl90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX191aWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fdWlkX3QgdWlkX3Q7CisjICBkZWZpbmUgX191aWRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYJLyogWC9PcGVuICovCisKKyNpZmRlZiBfX1VTRV9VTklYOTgKKyMgaWZuZGVmIF9fYmxrY250X3RfZGVmaW5lZAorIyAgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19ibGtjbnRfdCBibGtjbnRfdDsKKyMgIGVsc2UKK3R5cGVkZWYgX19ibGtjbnQ2NF90IGJsa2NudF90OworIyAgZW5kaWYKKyMgIGRlZmluZSBfX2Jsa2NudF90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19ibGtzaXplX3RfZGVmaW5lZAordHlwZWRlZiBfX2Jsa3NpemVfdCBibGtzaXplX3Q7CisjICBkZWZpbmUgX19ibGtzaXplX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCS8qIFVuaXg5OCAqLworCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxiaXRzL3N0YXQuaD4KKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisjIGRlZmluZSBTX0lGTVQJCV9fU19JRk1UCisjIGRlZmluZSBTX0lGRElSCV9fU19JRkRJUgorIyBkZWZpbmUgU19JRkNIUglfX1NfSUZDSFIKKyMgZGVmaW5lIFNfSUZCTEsJX19TX0lGQkxLCisjIGRlZmluZSBTX0lGUkVHCV9fU19JRlJFRworIyBpZmRlZiBfX1NfSUZJRk8KKyMgIGRlZmluZSBTX0lGSUZPCV9fU19JRklGTworIyBlbmRpZgorIyBpZmRlZiBfX1NfSUZMTksKKyMgIGRlZmluZSBTX0lGTE5LCV9fU19JRkxOSworIyBlbmRpZgorIyBpZiAoZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfVU5JWDk4KSBcCisgICAgICYmIGRlZmluZWQgX19TX0lGU09DSworIyAgZGVmaW5lIFNfSUZTT0NLCV9fU19JRlNPQ0sKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBUZXN0IG1hY3JvcyBmb3IgZmlsZSB0eXBlcy4JKi8KKworI2RlZmluZQlfX1NfSVNUWVBFKG1vZGUsIG1hc2spCSgoKG1vZGUpICYgX19TX0lGTVQpID09IChtYXNrKSkKKworI2RlZmluZQlTX0lTRElSKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGRElSKQorI2RlZmluZQlTX0lTQ0hSKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGQ0hSKQorI2RlZmluZQlTX0lTQkxLKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGQkxLKQorI2RlZmluZQlTX0lTUkVHKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGUkVHKQorI2lmZGVmIF9fU19JRklGTworIyBkZWZpbmUgU19JU0ZJRk8obW9kZSkJIF9fU19JU1RZUEUoKG1vZGUpLCBfX1NfSUZJRk8pCisjZW5kaWYKKyNpZmRlZiBfX1NfSUZMTksKKyMgZGVmaW5lIFNfSVNMTksobW9kZSkJIF9fU19JU1RZUEUoKG1vZGUpLCBfX1NfSUZMTkspCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEICYmICFkZWZpbmVkIF9fU19JRkxOSworIyBkZWZpbmUgU19JU0xOSyhtb2RlKSAgMAorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTggfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKSBcCisgICAgJiYgZGVmaW5lZCBfX1NfSUZTT0NLCisjIGRlZmluZSBTX0lTU09DSyhtb2RlKSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGU09DSykKKyNlbGlmIGRlZmluZWQgX19VU0VfWE9QRU4ySworIyBkZWZpbmUgU19JU1NPQ0sobW9kZSkgMAorI2VuZGlmCisKKy8qIFRoZXNlIGFyZSBmcm9tIFBPU0lYLjFiLiAgSWYgdGhlIG9iamVjdHMgYXJlIG5vdCBpbXBsZW1lbnRlZCB1c2luZyBzZXBhcmF0ZQorICAgZGlzdGluY3QgZmlsZSB0eXBlcywgdGhlIG1hY3JvcyBhbHdheXMgd2lsbCBldmFsdWF0ZSB0byB6ZXJvLiAgVW5saWtlIHRoZQorICAgb3RoZXIgU18qIG1hY3JvcyB0aGUgZm9sbG93aW5nIHRocmVlIHRha2UgYSBwb2ludGVyIHRvIGEgYHN0cnVjdCBzdGF0JworICAgb2JqZWN0IGFzIHRoZSBhcmd1bWVudC4gICovCisjaWZkZWYJX19VU0VfUE9TSVgxOTkzMDkKKyMgZGVmaW5lIFNfVFlQRUlTTVEoYnVmKSBfX1NfVFlQRUlTTVEoYnVmKQorIyBkZWZpbmUgU19UWVBFSVNTRU0oYnVmKSBfX1NfVFlQRUlTU0VNKGJ1ZikKKyMgZGVmaW5lIFNfVFlQRUlTU0hNKGJ1ZikgX19TX1RZUEVJU1NITShidWYpCisjZW5kaWYKKworCisvKiBQcm90ZWN0aW9uIGJpdHMuICAqLworCisjZGVmaW5lCVNfSVNVSUQgX19TX0lTVUlECS8qIFNldCB1c2VyIElEIG9uIGV4ZWN1dGlvbi4gICovCisjZGVmaW5lCVNfSVNHSUQJX19TX0lTR0lECS8qIFNldCBncm91cCBJRCBvbiBleGVjdXRpb24uICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIFNhdmUgc3dhcHBlZCB0ZXh0IGFmdGVyIHVzZSAoc3RpY2t5IGJpdCkuICBUaGlzIGlzIHByZXR0eSB3ZWxsIG9ic29sZXRlLiAgKi8KKyMgZGVmaW5lIFNfSVNWVFgJX19TX0lTVlRYCisjZW5kaWYKKworI2RlZmluZQlTX0lSVVNSCV9fU19JUkVBRAkvKiBSZWFkIGJ5IG93bmVyLiAgKi8KKyNkZWZpbmUJU19JV1VTUglfX1NfSVdSSVRFCS8qIFdyaXRlIGJ5IG93bmVyLiAgKi8KKyNkZWZpbmUJU19JWFVTUglfX1NfSUVYRUMJLyogRXhlY3V0ZSBieSBvd25lci4gICovCisvKiBSZWFkLCB3cml0ZSwgYW5kIGV4ZWN1dGUgYnkgb3duZXIuICAqLworI2RlZmluZQlTX0lSV1hVCShfX1NfSVJFQUR8X19TX0lXUklURXxfX1NfSUVYRUMpCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgJiYgZGVmaW5lZCBfX1VTRV9CU0QKKyMgZGVmaW5lIFNfSVJFQUQJU19JUlVTUgorIyBkZWZpbmUgU19JV1JJVEUJU19JV1VTUgorIyBkZWZpbmUgU19JRVhFQwlTX0lYVVNSCisjZW5kaWYKKworI2RlZmluZQlTX0lSR1JQCShTX0lSVVNSID4+IDMpCS8qIFJlYWQgYnkgZ3JvdXAuICAqLworI2RlZmluZQlTX0lXR1JQCShTX0lXVVNSID4+IDMpCS8qIFdyaXRlIGJ5IGdyb3VwLiAgKi8KKyNkZWZpbmUJU19JWEdSUAkoU19JWFVTUiA+PiAzKQkvKiBFeGVjdXRlIGJ5IGdyb3VwLiAgKi8KKy8qIFJlYWQsIHdyaXRlLCBhbmQgZXhlY3V0ZSBieSBncm91cC4gICovCisjZGVmaW5lCVNfSVJXWEcJKFNfSVJXWFUgPj4gMykKKworI2RlZmluZQlTX0lST1RICShTX0lSR1JQID4+IDMpCS8qIFJlYWQgYnkgb3RoZXJzLiAgKi8KKyNkZWZpbmUJU19JV09USAkoU19JV0dSUCA+PiAzKQkvKiBXcml0ZSBieSBvdGhlcnMuICAqLworI2RlZmluZQlTX0lYT1RICShTX0lYR1JQID4+IDMpCS8qIEV4ZWN1dGUgYnkgb3RoZXJzLiAgKi8KKy8qIFJlYWQsIHdyaXRlLCBhbmQgZXhlY3V0ZSBieSBvdGhlcnMuICAqLworI2RlZmluZQlTX0lSV1hPCShTX0lSV1hHID4+IDMpCisKKworI2lmZGVmCV9fVVNFX0JTRAorLyogTWFjcm9zIGZvciBjb21tb24gbW9kZSBiaXQgbWFza3MuICAqLworIyBkZWZpbmUgQUNDRVNTUEVSTVMgKFNfSVJXWFV8U19JUldYR3xTX0lSV1hPKSAvKiAwNzc3ICovCisjIGRlZmluZSBBTExQRVJNUyAoU19JU1VJRHxTX0lTR0lEfFNfSVNWVFh8U19JUldYVXxTX0lSV1hHfFNfSVJXWE8pLyogMDc3NzcgKi8KKyMgZGVmaW5lIERFRkZJTEVNT0RFIChTX0lSVVNSfFNfSVdVU1J8U19JUkdSUHxTX0lXR1JQfFNfSVJPVEh8U19JV09USCkvKiAwNjY2Ki8KKworIyBkZWZpbmUgU19CTEtTSVpFCTUxMgkvKiBCbG9jayBzaXplIGZvciBgc3RfYmxvY2tzJy4gICovCisjZW5kaWYKKworCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKy8qIEdldCBmaWxlIGF0dHJpYnV0ZXMgZm9yIEZJTEUgYW5kIHB1dCB0aGVtIGluIEJVRi4gICovCitleHRlcm4gaW50IHN0YXQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZpbGUsCisJCSBzdHJ1Y3Qgc3RhdCAqX19yZXN0cmljdCBfX2J1ZikgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIEdldCBmaWxlIGF0dHJpYnV0ZXMgZm9yIHRoZSBmaWxlLCBkZXZpY2UsIHBpcGUsIG9yIHNvY2tldAorICAgdGhhdCBmaWxlIGRlc2NyaXB0b3IgRkQgaXMgb3BlbiBvbiBhbmQgcHV0IHRoZW0gaW4gQlVGLiAgKi8KK2V4dGVybiBpbnQgZnN0YXQgKGludCBfX2ZkLCBzdHJ1Y3Qgc3RhdCAqX19idWYpIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHN0YXQsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkJCSAgc3RydWN0IHN0YXQgKl9fcmVzdHJpY3QgX19idWYpLCBzdGF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDEsIDIpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGZzdGF0LCAoaW50IF9fZmQsIHN0cnVjdCBzdGF0ICpfX2J1ZiksIGZzdGF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKKyMgZWxzZQorIyAgZGVmaW5lIHN0YXQgc3RhdDY0CisjICBkZWZpbmUgZnN0YXQgZnN0YXQ2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgc3RhdDY0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICBzdHJ1Y3Qgc3RhdDY0ICpfX3Jlc3RyaWN0IF9fYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKK2V4dGVybiBpbnQgZnN0YXQ2NCAoaW50IF9fZmQsIHN0cnVjdCBzdGF0NjQgKl9fYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBTaW1pbGFyIHRvIHN0YXQsIGdldCB0aGUgYXR0cmlidXRlcyBmb3IgRklMRSBhbmQgcHV0IHRoZW0gaW4gQlVGLgorICAgUmVsYXRpdmUgcGF0aCBuYW1lcyBhcmUgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gRkQgdW5sZXNzIEZEIGlzCisgICBBVF9GRENXRC4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGZzdGF0YXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICAgc3RydWN0IHN0YXQgKl9fcmVzdHJpY3QgX19idWYsIGludCBfX2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZnN0YXRhdCwgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkJCSAgICAgc3RydWN0IHN0YXQgKl9fcmVzdHJpY3QgX19idWYsCisJCQkJICAgICBpbnQgX19mbGFnKSwKKwkJCSAgIGZzdGF0YXQ2NCkgX19ub25udWxsICgoMiwgMykpOworIyAgZWxzZQorIyAgIGRlZmluZSBmc3RhdGF0IGZzdGF0YXQ2NAorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBmc3RhdGF0NjQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICAgICBzdHJ1Y3Qgc3RhdDY0ICpfX3Jlc3RyaWN0IF9fYnVmLCBpbnQgX19mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKy8qIEdldCBmaWxlIGF0dHJpYnV0ZXMgYWJvdXQgRklMRSBhbmQgcHV0IHRoZW0gaW4gQlVGLgorICAgSWYgRklMRSBpcyBhIHN5bWJvbGljIGxpbmssIGRvIG5vdCBmb2xsb3cgaXQuICAqLworZXh0ZXJuIGludCBsc3RhdCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICBzdHJ1Y3Qgc3RhdCAqX19yZXN0cmljdCBfX2J1ZikgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChsc3RhdCwKKwkJCSAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkJICAgIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0IF9fYnVmKSwgbHN0YXQ2NCkKKyAgICAgX19ub25udWxsICgoMSwgMikpOworIyAgZWxzZQorIyAgIGRlZmluZSBsc3RhdCBsc3RhdDY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBsc3RhdDY0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICAgc3RydWN0IHN0YXQ2NCAqX19yZXN0cmljdCBfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVuZGlmCisjZW5kaWYKKworLyogU2V0IGZpbGUgYWNjZXNzIHBlcm1pc3Npb25zIGZvciBGSUxFIHRvIE1PREUuCisgICBJZiBGSUxFIGlzIGEgc3ltYm9saWMgbGluaywgdGhpcyBhZmZlY3RzIGl0cyB0YXJnZXQgaW5zdGVhZC4gICovCitleHRlcm4gaW50IGNobW9kIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19tb2RlX3QgX19tb2RlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0JTRAorLyogU2V0IGZpbGUgYWNjZXNzIHBlcm1pc3Npb25zIGZvciBGSUxFIHRvIE1PREUuCisgICBJZiBGSUxFIGlzIGEgc3ltYm9saWMgbGluaywgdGhpcyBhZmZlY3RzIHRoZSBsaW5rIGl0c2VsZgorICAgcmF0aGVyIHRoYW4gaXRzIHRhcmdldC4gICovCitleHRlcm4gaW50IGxjaG1vZCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fbW9kZV90IF9fbW9kZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworLyogU2V0IGZpbGUgYWNjZXNzIHBlcm1pc3Npb25zIG9mIHRoZSBmaWxlIEZEIGlzIG9wZW4gb24gdG8gTU9ERS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CitleHRlcm4gaW50IGZjaG1vZCAoaW50IF9fZmQsIF9fbW9kZV90IF9fbW9kZSkgX19USFJPVzsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBTZXQgZmlsZSBhY2Nlc3MgcGVybWlzc2lvbnMgb2YgRklMRSByZWxhdGl2ZSB0bworICAgdGhlIGRpcmVjdG9yeSBGRCBpcyBvcGVuIG9uLiAgKi8KK2V4dGVybiBpbnQgZmNobW9kYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19tb2RlX3QgX19tb2RlLAorCQkgICAgIGludCBfX2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpIF9fd3VyOworI2VuZGlmIC8qIFVzZSBBVEZJTEUuICAqLworCisKKworLyogU2V0IHRoZSBmaWxlIGNyZWF0aW9uIG1hc2sgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyB0byBNQVNLLAorICAgYW5kIHJldHVybiB0aGUgb2xkIGNyZWF0aW9uIG1hc2suICAqLworZXh0ZXJuIF9fbW9kZV90IHVtYXNrIChfX21vZGVfdCBfX21hc2spIF9fVEhST1c7CisKKyNpZmRlZglfX1VTRV9HTlUKKy8qIEdldCB0aGUgY3VycmVudCBgdW1hc2snIHZhbHVlIHdpdGhvdXQgY2hhbmdpbmcgaXQuCisgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgSHVyZC4gICovCitleHRlcm4gX19tb2RlX3QgZ2V0dW1hc2sgKHZvaWQpIF9fVEhST1c7CisjZW5kaWYKKworLyogQ3JlYXRlIGEgbmV3IGRpcmVjdG9yeSBuYW1lZCBQQVRILCB3aXRoIHBlcm1pc3Npb24gYml0cyBNT0RFLiAgKi8KK2V4dGVybiBpbnQgbWtkaXIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBMaWtlIG1rZGlyLCBjcmVhdGUgYSBuZXcgZGlyZWN0b3J5IHdpdGggcGVybWlzc2lvbiBiaXRzIE1PREUuICBCdXQKKyAgIGludGVycHJldCByZWxhdGl2ZSBQQVRIIG5hbWVzIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgYXNzb2NpYXRlZAorICAgd2l0aCBGRC4gICovCitleHRlcm4gaW50IG1rZGlyYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCisvKiBDcmVhdGUgYSBkZXZpY2UgZmlsZSBuYW1lZCBQQVRILCB3aXRoIHBlcm1pc3Npb24gYW5kIHNwZWNpYWwgYml0cyBNT0RFCisgICBhbmQgZGV2aWNlIG51bWJlciBERVYgKHdoaWNoIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIG1ham9yIGFuZCBtaW5vcgorICAgZGV2aWNlIG51bWJlcnMgd2l0aCB0aGUgYG1ha2VkZXYnIG1hY3JvIGFib3ZlKS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKK2V4dGVybiBpbnQgbWtub2QgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUsIF9fZGV2X3QgX19kZXYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjIGlmZGVmIF9fVVNFX0FURklMRQorLyogTGlrZSBta25vZCwgY3JlYXRlIGEgbmV3IGRldmljZSBmaWxlIHdpdGggcGVybWlzc2lvbiBiaXRzIE1PREUgYW5kCisgICBkZXZpY2UgbnVtYmVyIERFVi4gIEJ1dCBpbnRlcnByZXQgcmVsYXRpdmUgUEFUSCBuYW1lcyByZWxhdGl2ZSB0bworICAgdGhlIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggRkQuICAqLworZXh0ZXJuIGludCBta25vZGF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsIF9fbW9kZV90IF9fbW9kZSwKKwkJICAgIF9fZGV2X3QgX19kZXYpIF9fVEhST1cgX19ub25udWxsICgoMikpOworIyBlbmRpZgorI2VuZGlmCisKKworLyogQ3JlYXRlIGEgbmV3IEZJRk8gbmFtZWQgUEFUSCwgd2l0aCBwZXJtaXNzaW9uIGJpdHMgTU9ERS4gICovCitleHRlcm4gaW50IG1rZmlmbyAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fbW9kZV90IF9fbW9kZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIExpa2UgbWtmaWZvLCBjcmVhdGUgYSBuZXcgRklGTyB3aXRoIHBlcm1pc3Npb24gYml0cyBNT0RFLiAgQnV0CisgICBpbnRlcnByZXQgcmVsYXRpdmUgUEFUSCBuYW1lcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGFzc29jaWF0ZWQKKyAgIHdpdGggRkQuICAqLworZXh0ZXJuIGludCBta2ZpZm9hdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisMCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBTZXQgZmlsZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0aW1lcyByZWxhdGl2ZSB0byBkaXJlY3RvcnkgZmlsZQorICAgZGVzY3JpcHRvci4gICovCitleHRlcm4gaW50IHV0aW1lbnNhdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLAorCQkgICAgICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3RpbWVzWzJdLAorCQkgICAgICBpbnQgX19mbGFncykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBTZXQgZmlsZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0aW1lcyBvZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggRkQuICAqLworZXh0ZXJuIGludCBmdXRpbWVucyAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjIF9fdGltZXNbMl0pIF9fVEhST1c7CisjZW5kaWYKKwwKKy8qIFRvIGFsbG93IHRoZSBgc3RydWN0IHN0YXQnIHN0cnVjdHVyZSBhbmQgdGhlIGZpbGUgdHlwZSBgbW9kZV90JworICAgYml0cyB0byB2YXJ5IHdpdGhvdXQgY2hhbmdpbmcgc2hhcmVkIGxpYnJhcnkgbWFqb3IgdmVyc2lvbiBudW1iZXIsCisgICB0aGUgYHN0YXQnIGZhbWlseSBvZiBmdW5jdGlvbnMgYW5kIGBta25vZCcgYXJlIGluIGZhY3QgaW5saW5lCisgICB3cmFwcGVycyBhcm91bmQgY2FsbHMgdG8gYHhzdGF0JywgYGZ4c3RhdCcsIGBseHN0YXQnLCBhbmQgYHhta25vZCcsCisgICB3aGljaCBhbGwgdGFrZSBhIGxlYWRpbmcgdmVyc2lvbi1udW1iZXIgYXJndW1lbnQgZGVzaWduYXRpbmcgdGhlCisgICBkYXRhIHN0cnVjdHVyZSBhbmQgYml0cyB1c2VkLiAgPGJpdHMvc3RhdC5oPiBkZWZpbmVzIF9TVEFUX1ZFUiB3aXRoCisgICB0aGUgdmVyc2lvbiBudW1iZXIgY29ycmVzcG9uZGluZyB0byBgc3RydWN0IHN0YXQnIGFzIGRlZmluZWQgaW4KKyAgIHRoYXQgZmlsZTsgYW5kIF9NS05PRF9WRVIgd2l0aCB0aGUgdmVyc2lvbiBudW1iZXIgY29ycmVzcG9uZGluZyB0bworICAgdGhlIFNfSUYqIG1hY3JvcyBkZWZpbmVkIHRoZXJlaW4uICBJdCBpcyBhcnJhbmdlZCB0aGF0IHdoZW4gbm90CisgICBpbmxpbmVkIHRoZXNlIGZ1bmN0aW9uIGFyZSBhbHdheXMgc3RhdGljYWxseSBsaW5rZWQ7IHRoYXQgd2F5IGEKKyAgIGR5bmFtaWNhbGx5LWxpbmtlZCBleGVjdXRhYmxlIGFsd2F5cyBlbmNvZGVzIHRoZSB2ZXJzaW9uIG51bWJlcgorICAgY29ycmVzcG9uZGluZyB0byB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGl0IHVzZXMsIHNvIHRoZSBgeCcgZnVuY3Rpb25zCisgICBpbiB0aGUgc2hhcmVkIGxpYnJhcnkgY2FuIGFkYXB0IHdpdGhvdXQgbmVlZGluZyB0byByZWNvbXBpbGUgYWxsCisgICBjYWxsZXJzLiAgKi8KKworI2lmbmRlZiBfU1RBVF9WRVIKKyMgZGVmaW5lIF9TVEFUX1ZFUgkwCisjZW5kaWYKKyNpZm5kZWYgX01LTk9EX1ZFUgorIyBkZWZpbmUgX01LTk9EX1ZFUgkwCisjZW5kaWYKKworLyogV3JhcHBlcnMgZm9yIHN0YXQgYW5kIG1rbm9kIHN5c3RlbSBjYWxscy4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgX19meHN0YXQgKGludCBfX3ZlciwgaW50IF9fZmlsZGVzLCBzdHJ1Y3Qgc3RhdCAqX19zdGF0X2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzKSk7CitleHRlcm4gaW50IF9feHN0YXQgKGludCBfX3ZlciwgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX2x4c3RhdCAoaW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCSAgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX2Z4c3RhdGF0IChpbnQgX192ZXIsIGludCBfX2ZpbGRlcywgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkgICAgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYsIGludCBfX2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMywgNCkpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZnhzdGF0LCAoaW50IF9fdmVyLCBpbnQgX19maWxkZXMsCisJCQkJICAgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpLCBfX2Z4c3RhdDY0KQorICAgICBfX25vbm51bGwgKCgzKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3hzdGF0LCAoaW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCQkJICAgICBzdHJ1Y3Qgc3RhdCAqX19zdGF0X2J1ZiksIF9feHN0YXQ2NCkKKyAgICAgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19seHN0YXQsIChpbnQgX192ZXIsIF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJCQkgICAgICBzdHJ1Y3Qgc3RhdCAqX19zdGF0X2J1ZiksIF9fbHhzdGF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDIsIDMpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZnhzdGF0YXQsIChpbnQgX192ZXIsIGludCBfX2ZpbGRlcywKKwkJCQkJX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkJCQlzdHJ1Y3Qgc3RhdCAqX19zdGF0X2J1ZiwgaW50IF9fZmxhZyksCisJCQkgICBfX2Z4c3RhdGF0NjQpIF9fbm9ubnVsbCAoKDMsIDQpKTsKKworIyBlbHNlCisjICBkZWZpbmUgX19meHN0YXQgX19meHN0YXQ2NAorIyAgZGVmaW5lIF9feHN0YXQgX194c3RhdDY0CisjICBkZWZpbmUgX19seHN0YXQgX19seHN0YXQ2NAorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBfX2Z4c3RhdDY0IChpbnQgX192ZXIsIGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXQ2NCAqX19zdGF0X2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzKSk7CitleHRlcm4gaW50IF9feHN0YXQ2NCAoaW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCSAgICAgIHN0cnVjdCBzdGF0NjQgKl9fc3RhdF9idWYpIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX2x4c3RhdDY0IChpbnQgX192ZXIsIF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJICAgICAgIHN0cnVjdCBzdGF0NjQgKl9fc3RhdF9idWYpIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX2Z4c3RhdGF0NjQgKGludCBfX3ZlciwgaW50IF9fZmlsZGVzLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCQkgc3RydWN0IHN0YXQ2NCAqX19zdGF0X2J1ZiwgaW50IF9fZmxhZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzLCA0KSk7CisjZW5kaWYKK2V4dGVybiBpbnQgX194bWtub2QgKGludCBfX3ZlciwgX19jb25zdCBjaGFyICpfX3BhdGgsIF9fbW9kZV90IF9fbW9kZSwKKwkJICAgICBfX2Rldl90ICpfX2RldikgX19USFJPVyBfX25vbm51bGwgKCgyLCA0KSk7CisKK2V4dGVybiBpbnQgX194bWtub2RhdCAoaW50IF9fdmVyLCBpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsCisJCSAgICAgICBfX21vZGVfdCBfX21vZGUsIF9fZGV2X3QgKl9fZGV2KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDMsIDUpKTsKKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMiAmJiBkZWZpbmVkIF9fVVNFX0VYVEVSTl9JTkxJTkVTX0lOX0xJQkMKKy8qIElubGluZWQgdmVyc2lvbnMgb2YgdGhlIHJlYWwgc3RhdCBhbmQgbWtub2QgZnVuY3Rpb25zLiAgKi8KKworX19leHRlcm5faW5saW5lIGludAorX19OVEggKHN0YXQgKF9fY29uc3QgY2hhciAqX19wYXRoLCBzdHJ1Y3Qgc3RhdCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9feHN0YXQgKF9TVEFUX1ZFUiwgX19wYXRoLCBfX3N0YXRidWYpOworfQorCisjIGlmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChsc3RhdCAoX19jb25zdCBjaGFyICpfX3BhdGgsIHN0cnVjdCBzdGF0ICpfX3N0YXRidWYpKQoreworICByZXR1cm4gX19seHN0YXQgKF9TVEFUX1ZFUiwgX19wYXRoLCBfX3N0YXRidWYpOworfQorIyBlbmRpZgorCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAoZnN0YXQgKGludCBfX2ZkLCBzdHJ1Y3Qgc3RhdCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9fZnhzdGF0IChfU1RBVF9WRVIsIF9fZmQsIF9fc3RhdGJ1Zik7Cit9CisKKyMgaWZkZWYgX19VU0VfQVRGSUxFCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAoZnN0YXRhdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwgc3RydWN0IHN0YXQgKl9fc3RhdGJ1ZiwKKwkJaW50IF9fZmxhZykpCit7CisgIHJldHVybiBfX2Z4c3RhdGF0IChfU1RBVF9WRVIsIF9fZmQsIF9fZmlsZW5hbWUsIF9fc3RhdGJ1ZiwgX19mbGFnKTsKK30KKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9CU0QKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChta25vZCAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fbW9kZV90IF9fbW9kZSwgX19kZXZfdCBfX2RldikpCit7CisgIHJldHVybiBfX3hta25vZCAoX01LTk9EX1ZFUiwgX19wYXRoLCBfX21vZGUsICZfX2Rldik7Cit9CisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfQVRGSUxFCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAobWtub2RhdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUsCisJCV9fZGV2X3QgX19kZXYpKQoreworICByZXR1cm4gX194bWtub2RhdCAoX01LTk9EX1ZFUiwgX19mZCwgX19wYXRoLCBfX21vZGUsICZfX2Rldik7Cit9CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9MQVJHRUZJTEU2NCBcCisgICYmICghIGRlZmluZWQgX19VU0VfRklMRV9PRkZTRVQ2NCBcCisgICAgICB8fCAoZGVmaW5lZCBfX1JFRElSRUNUX05USCAmJiBkZWZpbmVkIF9fT1BUSU1JWkVfXykpCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAoc3RhdDY0IChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgc3RydWN0IHN0YXQ2NCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9feHN0YXQ2NCAoX1NUQVRfVkVSLCBfX3BhdGgsIF9fc3RhdGJ1Zik7Cit9CisKKyMgIGlmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChsc3RhdDY0IChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgc3RydWN0IHN0YXQ2NCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9fbHhzdGF0NjQgKF9TVEFUX1ZFUiwgX19wYXRoLCBfX3N0YXRidWYpOworfQorIyAgZW5kaWYKKworX19leHRlcm5faW5saW5lIGludAorX19OVEggKGZzdGF0NjQgKGludCBfX2ZkLCBzdHJ1Y3Qgc3RhdDY0ICpfX3N0YXRidWYpKQoreworICByZXR1cm4gX19meHN0YXQ2NCAoX1NUQVRfVkVSLCBfX2ZkLCBfX3N0YXRidWYpOworfQorCisjICBpZmRlZiBfX1VTRV9BVEZJTEUKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChmc3RhdGF0NjQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsIHN0cnVjdCBzdGF0NjQgKl9fc3RhdGJ1ZiwKKwkJICBpbnQgX19mbGFnKSkKK3sKKyAgcmV0dXJuIF9fZnhzdGF0YXQ2NCAoX1NUQVRfVkVSLCBfX2ZkLCBfX2ZpbGVuYW1lLCBfX3N0YXRidWYsIF9fZmxhZyk7Cit9CisjICBlbmRpZgorCisjIGVuZGlmCisKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBzeXMvc3RhdC5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zdGF0ZnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3RhdGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyMjI2YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3RhdGZzLmgKQEAgLTAsMCArMSw2OCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlc3lzdGVtLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfU1RBVEZTX0gKKyNkZWZpbmUJX1NZU19TVEFURlNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgdGhlIHN5c3RlbS1zcGVjaWZpYyBkZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgc3RhdGZzJy4gICovCisjaW5jbHVkZSA8Yml0cy9zdGF0ZnMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGVzeXN0ZW0gb24gd2hpY2ggRklMRSByZXNpZGVzLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBzdGF0ZnMgKF9fY29uc3QgY2hhciAqX19maWxlLCBzdHJ1Y3Qgc3RhdGZzICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoc3RhdGZzLAorCQkJICAgKF9fY29uc3QgY2hhciAqX19maWxlLCBzdHJ1Y3Qgc3RhdGZzICpfX2J1ZiksCisJCQkgICBzdGF0ZnM2NCkgX19ub25udWxsICgoMSwgMikpOworIyBlbHNlCisjICBkZWZpbmUgc3RhdGZzIHN0YXRmczY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBzdGF0ZnM2NCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIHN0cnVjdCBzdGF0ZnM2NCAqX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworI2VuZGlmCisKKy8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZXN5c3RlbSBjb250YWluaW5nIHRoZSBmaWxlIEZJTERFUworICAgcmVmZXJzIHRvLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBmc3RhdGZzIChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0ZnMgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChmc3RhdGZzLCAoaW50IF9fZmlsZGVzLCBzdHJ1Y3Qgc3RhdGZzICpfX2J1ZiksCisJCQkgICBmc3RhdGZzNjQpIF9fbm9ubnVsbCAoKDIpKTsKKyMgZWxzZQorIyAgZGVmaW5lIGZzdGF0ZnMgZnN0YXRmczY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBmc3RhdGZzNjQgKGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXRmczY0ICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy9zdGF0ZnMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zdGF0dmZzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N0YXR2ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk2NjJiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zdGF0dmZzLmgKQEAgLTAsMCArMSw5MSBAQAorLyogRGVmaW5pdGlvbnMgZm9yIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlc3lzdGVtLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfU1RBVFZGU19ICisjZGVmaW5lCV9TWVNfU1RBVFZGU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCB0aGUgc3lzdGVtLXNwZWNpZmljIGRlZmluaXRpb24gb2YgYHN0cnVjdCBzdGF0ZnMnLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3N0YXR2ZnMuaD4KKworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisjIGlmbmRlZiBfX2ZzYmxrY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2ZzYmxrY250X3QgZnNibGtjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBibG9ja3MuICAqLworIyAgZGVmaW5lIF9fZnNibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmbmRlZiBfX2ZzZmlsY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2ZzZmlsY250X3QgZnNmaWxjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBpbm9kZXMuICAqLworIyAgZGVmaW5lIF9fZnNmaWxjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjZWxzZQorIyBpZm5kZWYgX19mc2Jsa2NudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2Jsa2NudDY0X3QgZnNibGtjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBibG9ja3MuICAqLworIyAgZGVmaW5lIF9fZnNibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmbmRlZiBfX2ZzZmlsY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2ZzZmlsY250NjRfdCBmc2ZpbGNudF90OyAvKiBUeXBlIHRvIGNvdW50IGZpbGUgc3lzdGVtIGlub2Rlcy4gICovCisjICBkZWZpbmUgX19mc2ZpbGNudF90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZXN5c3RlbSBvbiB3aGljaCBGSUxFIHJlc2lkZXMuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHN0YXR2ZnMgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZpbGUsCisJCSAgICBzdHJ1Y3Qgc3RhdHZmcyAqX19yZXN0cmljdCBfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoc3RhdHZmcywKKwkJCSAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkJICAgIHN0cnVjdCBzdGF0dmZzICpfX3Jlc3RyaWN0IF9fYnVmKSwgc3RhdHZmczY0KQorICAgICBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVsc2UKKyMgIGRlZmluZSBzdGF0dmZzIHN0YXR2ZnM2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgc3RhdHZmczY0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICAgICBzdHJ1Y3Qgc3RhdHZmczY0ICpfX3Jlc3RyaWN0IF9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZgorCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGVzeXN0ZW0gY29udGFpbmluZyB0aGUgZmlsZSBGSUxERVMKKyAgIHJlZmVycyB0by4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgZnN0YXR2ZnMgKGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXR2ZnMgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChmc3RhdHZmcywgKGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXR2ZnMgKl9fYnVmKSwKKwkJCSAgIGZzdGF0dmZzNjQpIF9fbm9ubnVsbCAoKDIpKTsKKyMgZWxzZQorIyAgZGVmaW5lIGZzdGF0dmZzIGZzdGF0dmZzNjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IGZzdGF0dmZzNjQgKGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXR2ZnM2NCAqX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvc3RhdHZmcy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N0cm9wdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3Ryb3B0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNWJjMDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N0cm9wdHMuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8c3Ryb3B0cy5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zd2FwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjEwMDZjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zd2FwLmgKQEAgLTAsMCArMSw0NCBAQAorLyogQ2FsbHMgdG8gZW5hYmxlIGFuZCBkaXNhYmxlIHN3YXBwaW5nIG9uIHNwZWNpZmllZCBsb2NhdGlvbnMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAxOTk5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1dBUF9ICisKKyNkZWZpbmUgX1NZU19TV0FQX0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIFRoZSBzd2FwIHByaW9yaXR5IGlzIGVuY29kZWQgYXM6CisgICAocHJpbyA8PCBTV0FQX0ZMQUdfUFJJT19TSElGVCkgJiBTV0FQX0ZMQUdfUFJJT19NQVNLCisqLworI2RlZmluZQlTV0FQX0ZMQUdfUFJFRkVSCTB4ODAwMAkvKiBTZXQgaWYgc3dhcCBwcmlvcml0eSBpcyBzcGVjaWZpZWQuICovCisjZGVmaW5lCVNXQVBfRkxBR19QUklPX01BU0sJMHg3ZmZmCisjZGVmaW5lCVNXQVBfRkxBR19QUklPX1NISUZUCTAKKyNkZWZpbmUgU1dBUF9GTEFHX0RJU0NBUkQJMHgxMDAwMAkvKiBEaXNjYXJkIHN3YXAgY2x1c3RlciBhZnRlciB1c2UuICAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIE1ha2UgdGhlIGJsb2NrIHNwZWNpYWwgZGV2aWNlIFBBVEggYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0gZm9yIHN3YXBwaW5nLgorICAgVGhpcyBjYWxsIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHN1cGVyLXVzZXIuICAqLworZXh0ZXJuIGludCBzd2Fwb24gKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19mbGFncykgX19USFJPVzsKKworLyogU3RvcCB1c2luZyBibG9jayBzcGVjaWFsIGRldmljZSBQQVRIIGZvciBzd2FwcGluZy4gICovCitleHRlcm4gaW50IHN3YXBvZmYgKF9fY29uc3QgY2hhciAqX19wYXRoKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX1NZU19TV0FQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3lzY2FsbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zeXNjYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkNzJkMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3lzY2FsbC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTQ0FMTF9ICisjZGVmaW5lIF9TWVNDQUxMX0gJMQorCisvKiBUaGlzIGZpbGUgc2hvdWxkIGxpc3QgdGhlIG51bWJlcnMgb2YgdGhlIHN5c3RlbSBjYWxscyB0aGUgc3lzdGVtIGtub3dzLgorICAgQnV0IGluc3RlYWQgb2YgZHVwbGljYXRpbmcgdGhpcyB3ZSB1c2UgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZQorICAgZnJvbSB0aGUga2VybmVsIHNvdXJjZXMuICAqLworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworI2lmbmRlZiBfTElCQworLyogVGhlIExpbnV4IGtlcm5lbCBoZWFkZXIgZmlsZSBkZWZpbmVzIG1hY3JvcyBgX19OUl88bmFtZT4nLCBidXQgc29tZQorICAgcHJvZ3JhbXMgZXhwZWN0IHRoZSB0cmFkaXRpb25hbCBmb3JtIGBTWVNfPG5hbWU+Jy4gIFNvIGluIGJ1aWxkaW5nIGxpYmMKKyAgIHdlIHNjYW4gdGhlIGtlcm5lbCdzIGxpc3QgYW5kIHByb2R1Y2UgPGJpdHMvc3lzY2FsbC5oPiB3aXRoIG1hY3JvcyBmb3IKKyAgIGFsbCB0aGUgYFNZU18nIG5hbWVzLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9zeXNjYWxsLmg+CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N5c2N0bC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zeXNjdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTBlZmFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zeXNjdGwuaApAQCAtMCwwICsxLDcyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTksIDIwMDIsIDIwMDMsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19TWVNDVExfSAorI2RlZmluZQlfU1lTX1NZU0NUTF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKy8qIFByZXZlbnQgbW9yZSBrZXJuZWwgaGVhZGVycyB0aGFuIG5lY2Vzc2FyeSB0byBiZSBpbmNsdWRlZC4gICovCisjaWZuZGVmIF9MSU5VWF9LRVJORUxfSAorIyBkZWZpbmUgX0xJTlVYX0tFUk5FTF9ICTEKKyMgZGVmaW5lIF9fdW5kZWZfTElOVVhfS0VSTkVMX0gKKyNlbmRpZgorI2lmbmRlZiBfTElOVVhfVFlQRVNfSAorIyBkZWZpbmUgX0xJTlVYX1RZUEVTX0gJCTEKKyMgZGVmaW5lIF9fdW5kZWZfTElOVVhfVFlQRVNfSAorI2VuZGlmCisjaWZuZGVmIF9MSU5VWF9MSVNUX0gKKyMgZGVmaW5lIF9MSU5VWF9MSVNUX0gJCTEKKyMgZGVmaW5lIF9fdW5kZWZfTElOVVhfTElTVF9ICisjZW5kaWYKKyNpZm5kZWYgX19MSU5VWF9DT01QSUxFUl9ICisjIGRlZmluZSBfX0xJTlVYX0NPTVBJTEVSX0gJMQorIyBkZWZpbmUgX191c2VyCisjIGRlZmluZSBfX3VuZGVmX19MSU5VWF9DT01QSUxFUl9ICisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorCisjaWZkZWYgX191bmRlZl9MSU5VWF9LRVJORUxfSAorIyB1bmRlZiBfTElOVVhfS0VSTkVMX0gKKyMgdW5kZWYgX191bmRlZl9MSU5VWF9LRVJORUxfSAorI2VuZGlmCisjaWZkZWYgX191bmRlZl9MSU5VWF9UWVBFU19ICisjIHVuZGVmIF9MSU5VWF9UWVBFU19ICisjIHVuZGVmIF9fdW5kZWZfTElOVVhfVFlQRVNfSAorI2VuZGlmCisjaWZkZWYgX191bmRlZl9MSU5VWF9MSVNUX0gKKyMgdW5kZWYgX0xJTlVYX0xJU1RfSAorIyB1bmRlZiBfX3VuZGVmX0xJTlVYX0xJU1RfSAorI2VuZGlmCisjaWZkZWYgX191bmRlZl9fTElOVVhfQ09NUElMRVJfSAorIyB1bmRlZiBfX0xJTlVYX0NPTVBJTEVSX0gKKyMgdW5kZWYgX191c2VyCisjIHVuZGVmIF9fdW5kZWZfX0xJTlVYX0NPTVBJTEVSX0gKKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJlYWQgb3Igd3JpdGUgc3lzdGVtIHBhcmFtZXRlcnMuICAqLworZXh0ZXJuIGludCBzeXNjdGwgKGludCAqX19uYW1lLCBpbnQgX19ubGVuLCB2b2lkICpfX29sZHZhbCwKKwkJICAgc2l6ZV90ICpfX29sZGxlbnAsIHZvaWQgKl9fbmV3dmFsLCBzaXplX3QgX19uZXdsZW4pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBfU1lTX1NZU0NUTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N5c2luZm8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3lzaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NzI3YjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N5c2luZm8uaApAQCAtMCwwICsxLDQ4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTksIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TWVNJTkZPX0gKKyNkZWZpbmUgX1NZU19TWVNJTkZPX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IHN5c2luZm8gc3RydWN0dXJlIGZyb20ga2VybmVsIGhlYWRlci4gICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogUmV0dXJucyBpbmZvcm1hdGlvbiBvbiBvdmVyYWxsIHN5c3RlbSBzdGF0aXN0aWNzLiAgKi8KK2V4dGVybiBpbnQgc3lzaW5mbyAoc3RydWN0IHN5c2luZm8gKl9faW5mbykgX19USFJPVzsKKworCisvKiBSZXR1cm4gbnVtYmVyIG9mIGNvbmZpZ3VyZWQgcHJvY2Vzc29ycy4gICovCitleHRlcm4gaW50IGdldF9ucHJvY3NfY29uZiAodm9pZCkgX19USFJPVzsKKworLyogUmV0dXJuIG51bWJlciBvZiBhdmFpbGFibGUgcHJvY2Vzc29ycy4gICovCitleHRlcm4gaW50IGdldF9ucHJvY3MgKHZvaWQpIF9fVEhST1c7CisKKworLyogUmV0dXJuIG51bWJlciBvZiBwaHlzaWNhbCBwYWdlcyBvZiBtZW1vcnkgaW4gdGhlIHN5c3RlbS4gICovCitleHRlcm4gbG9uZyBpbnQgZ2V0X3BoeXNfcGFnZXMgKHZvaWQpIF9fVEhST1c7CisKKy8qIFJldHVybiBudW1iZXIgb2YgYXZhaWxhYmxlIHBoeXNpY2FsIHBhZ2VzIG9mIG1lbW9yeSBpbiB0aGUgc3lzdGVtLiAgKi8KK2V4dGVybiBsb25nIGludCBnZXRfYXZwaHlzX3BhZ2VzICh2b2lkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3N5c2luZm8uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zeXNsb2cuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3lzbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkYTFjZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3lzbG9nLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5ODgsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpc3lzbG9nLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfU1lTX1NZU0xPR19ICisjZGVmaW5lIF9TWVNfU1lTTE9HX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNkZWZpbmUgX19uZWVkX19fdmFfbGlzdAorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiBUaGlzIGZpbGUgZGVmaW5lcyBfUEFUSF9MT0cuICAqLworI2luY2x1ZGUgPGJpdHMvc3lzbG9nLXBhdGguaD4KKworLyoKKyAqIHByaW9yaXRpZXMvZmFjaWxpdGllcyBhcmUgZW5jb2RlZCBpbnRvIGEgc2luZ2xlIDMyLWJpdCBxdWFudGl0eSwgd2hlcmUgdGhlCisgKiBib3R0b20gMyBiaXRzIGFyZSB0aGUgcHJpb3JpdHkgKDAtNykgYW5kIHRoZSB0b3AgMjggYml0cyBhcmUgdGhlIGZhY2lsaXR5CisgKiAoMC1iaWcgbnVtYmVyKS4gIEJvdGggdGhlIHByaW9yaXRpZXMgYW5kIHRoZSBmYWNpbGl0aWVzIG1hcCByb3VnaGx5CisgKiBvbmUtdG8tb25lIHRvIHN0cmluZ3MgaW4gdGhlIHN5c2xvZ2QoOCkgc291cmNlIGNvZGUuICBUaGlzIG1hcHBpbmcgaXMKKyAqIGluY2x1ZGVkIGluIHRoaXMgZmlsZS4KKyAqCisgKiBwcmlvcml0aWVzICh0aGVzZSBhcmUgb3JkZXJlZCkKKyAqLworI2RlZmluZQlMT0dfRU1FUkcJMAkvKiBzeXN0ZW0gaXMgdW51c2FibGUgKi8KKyNkZWZpbmUJTE9HX0FMRVJUCTEJLyogYWN0aW9uIG11c3QgYmUgdGFrZW4gaW1tZWRpYXRlbHkgKi8KKyNkZWZpbmUJTE9HX0NSSVQJMgkvKiBjcml0aWNhbCBjb25kaXRpb25zICovCisjZGVmaW5lCUxPR19FUlIJCTMJLyogZXJyb3IgY29uZGl0aW9ucyAqLworI2RlZmluZQlMT0dfV0FSTklORwk0CS8qIHdhcm5pbmcgY29uZGl0aW9ucyAqLworI2RlZmluZQlMT0dfTk9USUNFCTUJLyogbm9ybWFsIGJ1dCBzaWduaWZpY2FudCBjb25kaXRpb24gKi8KKyNkZWZpbmUJTE9HX0lORk8JNgkvKiBpbmZvcm1hdGlvbmFsICovCisjZGVmaW5lCUxPR19ERUJVRwk3CS8qIGRlYnVnLWxldmVsIG1lc3NhZ2VzICovCisKKyNkZWZpbmUJTE9HX1BSSU1BU0sJMHgwNwkvKiBtYXNrIHRvIGV4dHJhY3QgcHJpb3JpdHkgcGFydCAoaW50ZXJuYWwpICovCisJCQkJLyogZXh0cmFjdCBwcmlvcml0eSAqLworI2RlZmluZQlMT0dfUFJJKHApCSgocCkgJiBMT0dfUFJJTUFTSykKKyNkZWZpbmUJTE9HX01BS0VQUkkoZmFjLCBwcmkpCSgoKGZhYykgPDwgMykgfCAocHJpKSkKKworI2lmZGVmIFNZU0xPR19OQU1FUworI2RlZmluZQlJTlRFUk5BTF9OT1BSSQkweDEwCS8qIHRoZSAibm8gcHJpb3JpdHkiIHByaW9yaXR5ICovCisJCQkJLyogbWFyayAiZmFjaWxpdHkiICovCisjZGVmaW5lCUlOVEVSTkFMX01BUksJTE9HX01BS0VQUkkoTE9HX05GQUNJTElUSUVTLCAwKQordHlwZWRlZiBzdHJ1Y3QgX2NvZGUgeworCWNoYXIJKmNfbmFtZTsKKwlpbnQJY192YWw7Cit9IENPREU7CisKK0NPREUgcHJpb3JpdHluYW1lc1tdID0KKyAgeworICAgIHsgImFsZXJ0IiwgTE9HX0FMRVJUIH0sCisgICAgeyAiY3JpdCIsIExPR19DUklUIH0sCisgICAgeyAiZGVidWciLCBMT0dfREVCVUcgfSwKKyAgICB7ICJlbWVyZyIsIExPR19FTUVSRyB9LAorICAgIHsgImVyciIsIExPR19FUlIgfSwKKyAgICB7ICJlcnJvciIsIExPR19FUlIgfSwJCS8qIERFUFJFQ0FURUQgKi8KKyAgICB7ICJpbmZvIiwgTE9HX0lORk8gfSwKKyAgICB7ICJub25lIiwgSU5URVJOQUxfTk9QUkkgfSwJCS8qIElOVEVSTkFMICovCisgICAgeyAibm90aWNlIiwgTE9HX05PVElDRSB9LAorICAgIHsgInBhbmljIiwgTE9HX0VNRVJHIH0sCQkvKiBERVBSRUNBVEVEICovCisgICAgeyAid2FybiIsIExPR19XQVJOSU5HIH0sCQkvKiBERVBSRUNBVEVEICovCisgICAgeyAid2FybmluZyIsIExPR19XQVJOSU5HIH0sCisgICAgeyBOVUxMLCAtMSB9CisgIH07CisjZW5kaWYKKworLyogZmFjaWxpdHkgY29kZXMgKi8KKyNkZWZpbmUJTE9HX0tFUk4JKDA8PDMpCS8qIGtlcm5lbCBtZXNzYWdlcyAqLworI2RlZmluZQlMT0dfVVNFUgkoMTw8MykJLyogcmFuZG9tIHVzZXItbGV2ZWwgbWVzc2FnZXMgKi8KKyNkZWZpbmUJTE9HX01BSUwJKDI8PDMpCS8qIG1haWwgc3lzdGVtICovCisjZGVmaW5lCUxPR19EQUVNT04JKDM8PDMpCS8qIHN5c3RlbSBkYWVtb25zICovCisjZGVmaW5lCUxPR19BVVRICSg0PDwzKQkvKiBzZWN1cml0eS9hdXRob3JpemF0aW9uIG1lc3NhZ2VzICovCisjZGVmaW5lCUxPR19TWVNMT0cJKDU8PDMpCS8qIG1lc3NhZ2VzIGdlbmVyYXRlZCBpbnRlcm5hbGx5IGJ5IHN5c2xvZ2QgKi8KKyNkZWZpbmUJTE9HX0xQUgkJKDY8PDMpCS8qIGxpbmUgcHJpbnRlciBzdWJzeXN0ZW0gKi8KKyNkZWZpbmUJTE9HX05FV1MJKDc8PDMpCS8qIG5ldHdvcmsgbmV3cyBzdWJzeXN0ZW0gKi8KKyNkZWZpbmUJTE9HX1VVQ1AJKDg8PDMpCS8qIFVVQ1Agc3Vic3lzdGVtICovCisjZGVmaW5lCUxPR19DUk9OCSg5PDwzKQkvKiBjbG9jayBkYWVtb24gKi8KKyNkZWZpbmUJTE9HX0FVVEhQUklWCSgxMDw8MykJLyogc2VjdXJpdHkvYXV0aG9yaXphdGlvbiBtZXNzYWdlcyAocHJpdmF0ZSkgKi8KKyNkZWZpbmUJTE9HX0ZUUAkJKDExPDwzKQkvKiBmdHAgZGFlbW9uICovCisKKwkvKiBvdGhlciBjb2RlcyB0aHJvdWdoIDE1IHJlc2VydmVkIGZvciBzeXN0ZW0gdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDAJKDE2PDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDEJKDE3PDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDIJKDE4PDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDMJKDE5PDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDQJKDIwPDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDUJKDIxPDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDYJKDIyPDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisjZGVmaW5lCUxPR19MT0NBTDcJKDIzPDwzKQkvKiByZXNlcnZlZCBmb3IgbG9jYWwgdXNlICovCisKKyNkZWZpbmUJTE9HX05GQUNJTElUSUVTCTI0CS8qIGN1cnJlbnQgbnVtYmVyIG9mIGZhY2lsaXRpZXMgKi8KKyNkZWZpbmUJTE9HX0ZBQ01BU0sJMHgwM2Y4CS8qIG1hc2sgdG8gZXh0cmFjdCBmYWNpbGl0eSBwYXJ0ICovCisJCQkJLyogZmFjaWxpdHkgb2YgcHJpICovCisjZGVmaW5lCUxPR19GQUMocCkJKCgocCkgJiBMT0dfRkFDTUFTSykgPj4gMykKKworI2lmZGVmIFNZU0xPR19OQU1FUworQ09ERSBmYWNpbGl0eW5hbWVzW10gPQorICB7CisgICAgeyAiYXV0aCIsIExPR19BVVRIIH0sCisgICAgeyAiYXV0aHByaXYiLCBMT0dfQVVUSFBSSVYgfSwKKyAgICB7ICJjcm9uIiwgTE9HX0NST04gfSwKKyAgICB7ICJkYWVtb24iLCBMT0dfREFFTU9OIH0sCisgICAgeyAiZnRwIiwgTE9HX0ZUUCB9LAorICAgIHsgImtlcm4iLCBMT0dfS0VSTiB9LAorICAgIHsgImxwciIsIExPR19MUFIgfSwKKyAgICB7ICJtYWlsIiwgTE9HX01BSUwgfSwKKyAgICB7ICJtYXJrIiwgSU5URVJOQUxfTUFSSyB9LAkJLyogSU5URVJOQUwgKi8KKyAgICB7ICJuZXdzIiwgTE9HX05FV1MgfSwKKyAgICB7ICJzZWN1cml0eSIsIExPR19BVVRIIH0sCQkvKiBERVBSRUNBVEVEICovCisgICAgeyAic3lzbG9nIiwgTE9HX1NZU0xPRyB9LAorICAgIHsgInVzZXIiLCBMT0dfVVNFUiB9LAorICAgIHsgInV1Y3AiLCBMT0dfVVVDUCB9LAorICAgIHsgImxvY2FsMCIsIExPR19MT0NBTDAgfSwKKyAgICB7ICJsb2NhbDEiLCBMT0dfTE9DQUwxIH0sCisgICAgeyAibG9jYWwyIiwgTE9HX0xPQ0FMMiB9LAorICAgIHsgImxvY2FsMyIsIExPR19MT0NBTDMgfSwKKyAgICB7ICJsb2NhbDQiLCBMT0dfTE9DQUw0IH0sCisgICAgeyAibG9jYWw1IiwgTE9HX0xPQ0FMNSB9LAorICAgIHsgImxvY2FsNiIsIExPR19MT0NBTDYgfSwKKyAgICB7ICJsb2NhbDciLCBMT0dfTE9DQUw3IH0sCisgICAgeyBOVUxMLCAtMSB9CisgIH07CisjZW5kaWYKKworLyoKKyAqIGFyZ3VtZW50cyB0byBzZXRsb2dtYXNrLgorICovCisjZGVmaW5lCUxPR19NQVNLKHByaSkJKDEgPDwgKHByaSkpCQkvKiBtYXNrIGZvciBvbmUgcHJpb3JpdHkgKi8KKyNkZWZpbmUJTE9HX1VQVE8ocHJpKQkoKDEgPDwgKChwcmkpKzEpKSAtIDEpCS8qIGFsbCBwcmlvcml0aWVzIHRocm91Z2ggcHJpICovCisKKy8qCisgKiBPcHRpb24gZmxhZ3MgZm9yIG9wZW5sb2cuCisgKgorICogTE9HX09ERUxBWSBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4KKyAqIExPR19OREVMQVkgaXMgdGhlIGludmVyc2Ugb2Ygd2hhdCBpdCB1c2VkIHRvIGJlLgorICovCisjZGVmaW5lCUxPR19QSUQJCTB4MDEJLyogbG9nIHRoZSBwaWQgd2l0aCBlYWNoIG1lc3NhZ2UgKi8KKyNkZWZpbmUJTE9HX0NPTlMJMHgwMgkvKiBsb2cgb24gdGhlIGNvbnNvbGUgaWYgZXJyb3JzIGluIHNlbmRpbmcgKi8KKyNkZWZpbmUJTE9HX09ERUxBWQkweDA0CS8qIGRlbGF5IG9wZW4gdW50aWwgZmlyc3Qgc3lzbG9nKCkgKGRlZmF1bHQpICovCisjZGVmaW5lCUxPR19OREVMQVkJMHgwOAkvKiBkb24ndCBkZWxheSBvcGVuICovCisjZGVmaW5lCUxPR19OT1dBSVQJMHgxMAkvKiBkb24ndCB3YWl0IGZvciBjb25zb2xlIGZvcmtzOiBERVBSRUNBVEVEICovCisjZGVmaW5lCUxPR19QRVJST1IJMHgyMAkvKiBsb2cgdG8gc3RkZXJyIGFzIHdlbGwgKi8KKworX19CRUdJTl9ERUNMUworCisvKiBDbG9zZSBkZXNjcmlwdG9yIHVzZWQgdG8gd3JpdGUgdG8gc3lzdGVtIGxvZ2dlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBjbG9zZWxvZyAodm9pZCk7CisKKy8qIE9wZW4gY29ubmVjdGlvbiB0byBzeXN0ZW0gbG9nZ2VyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIG9wZW5sb2cgKF9fY29uc3QgY2hhciAqX19pZGVudCwgaW50IF9fb3B0aW9uLCBpbnQgX19mYWNpbGl0eSk7CisKKy8qIFNldCB0aGUgbG9nIG1hc2sgbGV2ZWwuICAqLworZXh0ZXJuIGludCBzZXRsb2dtYXNrIChpbnQgX19tYXNrKSBfX1RIUk9XOworCisvKiBHZW5lcmF0ZSBhIGxvZyBtZXNzYWdlIHVzaW5nIEZNVCBzdHJpbmcgYW5kIG9wdGlvbiBhcmd1bWVudHMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgc3lzbG9nIChpbnQgX19wcmksIF9fY29uc3QgY2hhciAqX19mbXQsIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDMpKSk7CisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIEdlbmVyYXRlIGEgbG9nIG1lc3NhZ2UgdXNpbmcgRk1UIGFuZCB1c2luZyBhcmd1bWVudHMgcG9pbnRlZCB0byBieSBBUC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgdnN5c2xvZyAoaW50IF9fcHJpLCBfX2NvbnN0IGNoYXIgKl9fZm10LCBfX2dudWNfdmFfbGlzdCBfX2FwKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMCkpKTsKKyNlbmRpZgorCisKKy8qIERlZmluZSBzb21lIG1hY3JvcyBoZWxwaW5nIHRvIGNhdGNoIGJ1ZmZlciBvdmVyZmxvd3MuICAqLworI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZQorIyBpbmNsdWRlIDxiaXRzL3N5c2xvZy5oPgorI2VuZGlmCisjaWZkZWYgX19MREJMX0NPTVBBVAorIyBpbmNsdWRlIDxiaXRzL3N5c2xvZy1sZGJsLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9zeXNsb2cuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zeXNtYWNyb3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3lzbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwMGM5MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3lzbWFjcm9zLmgKQEAgLTAsMCArMSw3MiBAQAorLyogRGVmaW5pdGlvbnMgb2YgbWFjcm9zIHRvIGFjY2VzcyBgZGV2X3QnIHZhbHVlcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMywgMjAwNCwgMjAwNywgMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TWVNNQUNST1NfSAorI2RlZmluZSBfU1lTX1NZU01BQ1JPU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIElmIHRoZSBjb21waWxlciBkb2VzIG5vdCBrbm93IGxvbmcgbG9uZyBpdCBpcyBvdXQgb2YgbHVjay4gIFdlIGFyZQorICAgbm90IGdvaW5nIHRvIGhhY2sgd2VpcmQgaGFja3MgdG8gc3VwcG9ydCB0aGUgZGV2X3QgcmVwcmVzZW50YXRpb24KKyAgIHRoZXkgbmVlZC4gICovCisjaWZkZWYgX19HTElCQ19IQVZFX0xPTkdfTE9ORworX19CRUdJTl9ERUNMUworCitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgaW50IGdudV9kZXZfbWFqb3IgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19kZXYpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfY29uc3RfXzsKK19fZXh0ZW5zaW9uX18KK2V4dGVybiB1bnNpZ25lZCBpbnQgZ251X2Rldl9taW5vciAodW5zaWduZWQgbG9uZyBsb25nIGludCBfX2RldikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9jb25zdF9fOworX19leHRlbnNpb25fXworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgZ251X2Rldl9tYWtlZGV2ICh1bnNpZ25lZCBpbnQgX19tYWpvciwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBfX21pbm9yKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2NvbnN0X187CisKKyMgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyICYmIGRlZmluZWQgX19VU0VfRVhURVJOX0lOTElORVMKK19fZXh0ZW5zaW9uX18gX19leHRlcm5faW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gdW5zaWduZWQgaW50CitfX05USCAoZ251X2Rldl9tYWpvciAodW5zaWduZWQgbG9uZyBsb25nIGludCBfX2RldikpCit7CisgIHJldHVybiAoKF9fZGV2ID4+IDgpICYgMHhmZmYpIHwgKCh1bnNpZ25lZCBpbnQpIChfX2RldiA+PiAzMikgJiB+MHhmZmYpOworfQorCitfX2V4dGVuc2lvbl9fIF9fZXh0ZXJuX2lubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIHVuc2lnbmVkIGludAorX19OVEggKGdudV9kZXZfbWlub3IgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19kZXYpKQoreworICByZXR1cm4gKF9fZGV2ICYgMHhmZikgfCAoKHVuc2lnbmVkIGludCkgKF9fZGV2ID4+IDEyKSAmIH4weGZmKTsKK30KKworX19leHRlbnNpb25fXyBfX2V4dGVybl9pbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyB1bnNpZ25lZCBsb25nIGxvbmcgaW50CitfX05USCAoZ251X2Rldl9tYWtlZGV2ICh1bnNpZ25lZCBpbnQgX19tYWpvciwgdW5zaWduZWQgaW50IF9fbWlub3IpKQoreworICByZXR1cm4gKChfX21pbm9yICYgMHhmZikgfCAoKF9fbWFqb3IgJiAweGZmZikgPDwgOCkKKwkgIHwgKCgodW5zaWduZWQgbG9uZyBsb25nIGludCkgKF9fbWlub3IgJiB+MHhmZikpIDw8IDEyKQorCSAgfCAoKCh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSAoX19tYWpvciAmIH4weGZmZikpIDw8IDMyKSk7Cit9CisjIGVuZGlmCitfX0VORF9ERUNMUworCisvKiBBY2Nlc3MgdGhlIGZ1bmN0aW9ucyB3aXRoIHRoZWlyIHRyYWRpdGlvbmFsIG5hbWVzLiAgKi8KKyMgZGVmaW5lIG1ham9yKGRldikgZ251X2Rldl9tYWpvciAoZGV2KQorIyBkZWZpbmUgbWlub3IoZGV2KSBnbnVfZGV2X21pbm9yIChkZXYpCisjIGRlZmluZSBtYWtlZGV2KG1haiwgbWluKSBnbnVfZGV2X21ha2VkZXYgKG1haiwgbWluKQorI2VuZGlmCisKKyNlbmRpZiAvKiBzeXMvc3lzbWFjcm9zLmggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdGVybWlvcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90ZXJtaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxODgwNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdGVybWlvcy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfU1lTX1RFUk1JT1NfSAorI2RlZmluZSBfU1lTX1RFUk1JT1NfSAorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90aW1lLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWVjZjYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90aW1lLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTk0LDE5OTYtMjAwMywyMDA1LDIwMDYsMjAwOQorCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVElNRV9ICisjZGVmaW5lIF9TWVNfVElNRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisjZGVmaW5lIF9fbmVlZF90aW1lX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisjZGVmaW5lIF9fbmVlZF90aW1ldmFsCisjaW5jbHVkZSA8Yml0cy90aW1lLmg+CisKKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisKKyNpZm5kZWYgX19zdXNlY29uZHNfdF9kZWZpbmVkCit0eXBlZGVmIF9fc3VzZWNvbmRzX3Qgc3VzZWNvbmRzX3Q7CisjIGRlZmluZSBfX3N1c2Vjb25kc190X2RlZmluZWQKKyNlbmRpZgorCisKK19fQkVHSU5fREVDTFMKKworI2lmZGVmIF9fVVNFX0dOVQorLyogTWFjcm9zIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gYHN0cnVjdCB0aW1ldmFsJyBhbmQgYHN0cnVjdCB0aW1lc3BlYycuICAqLworIyBkZWZpbmUgVElNRVZBTF9UT19USU1FU1BFQyh0diwgdHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHRzKS0+dHZfc2VjID0gKHR2KS0+dHZfc2VjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHRzKS0+dHZfbnNlYyA9ICh0diktPnR2X3VzZWMgKiAxMDAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyMgZGVmaW5lIFRJTUVTUEVDX1RPX1RJTUVWQUwodHYsIHRzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh0diktPnR2X3NlYyA9ICh0cyktPnR2X3NlYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh0diktPnR2X3VzZWMgPSAodHMpLT50dl9uc2VjIC8gMTAwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfQlNECisvKiBTdHJ1Y3R1cmUgY3J1ZGVseSByZXByZXNlbnRpbmcgYSB0aW1lem9uZS4KKyAgIFRoaXMgaXMgb2Jzb2xldGUgYW5kIHNob3VsZCBuZXZlciBiZSB1c2VkLiAgKi8KK3N0cnVjdCB0aW1lem9uZQorICB7CisgICAgaW50IHR6X21pbnV0ZXN3ZXN0OwkJLyogTWludXRlcyB3ZXN0IG9mIEdNVC4gICovCisgICAgaW50IHR6X2RzdHRpbWU7CQkvKiBOb256ZXJvIGlmIERTVCBpcyBldmVyIGluIGVmZmVjdC4gICovCisgIH07CisKK3R5cGVkZWYgc3RydWN0IHRpbWV6b25lICpfX3Jlc3RyaWN0IF9fdGltZXpvbmVfcHRyX3Q7CisjZWxzZQordHlwZWRlZiB2b2lkICpfX3Jlc3RyaWN0IF9fdGltZXpvbmVfcHRyX3Q7CisjZW5kaWYKKworLyogR2V0IHRoZSBjdXJyZW50IHRpbWUgb2YgZGF5IGFuZCB0aW1lem9uZSBpbmZvcm1hdGlvbiwKKyAgIHB1dHRpbmcgaXQgaW50byAqVFYgYW5kICpUWi4gIElmIFRaIGlzIE5VTEwsICpUWiBpcyBub3QgZmlsbGVkLgorICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9ycy4KKyAgIE5PVEU6IFRoaXMgZm9ybSBvZiB0aW1lem9uZSBpbmZvcm1hdGlvbiBpcyBvYnNvbGV0ZS4KKyAgIFVzZSB0aGUgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gPHRpbWUuaD4gaW5zdGVhZC4gICovCitleHRlcm4gaW50IGdldHRpbWVvZmRheSAoc3RydWN0IHRpbWV2YWwgKl9fcmVzdHJpY3QgX190diwKKwkJCSBfX3RpbWV6b25lX3B0cl90IF9fdHopIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfQlNECisvKiBTZXQgdGhlIGN1cnJlbnQgdGltZSBvZiBkYXkgYW5kIHRpbWV6b25lIGluZm9ybWF0aW9uLgorICAgVGhpcyBjYWxsIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHN1cGVyLXVzZXIuICAqLworZXh0ZXJuIGludCBzZXR0aW1lb2ZkYXkgKF9fY29uc3Qgc3RydWN0IHRpbWV2YWwgKl9fdHYsCisJCQkgX19jb25zdCBzdHJ1Y3QgdGltZXpvbmUgKl9fdHopCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBBZGp1c3QgdGhlIGN1cnJlbnQgdGltZSBvZiBkYXkgYnkgdGhlIGFtb3VudCBpbiBERUxUQS4KKyAgIElmIE9MRERFTFRBIGlzIG5vdCBOVUxMLCBpdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgYW1vdW50CisgICBvZiB0aW1lIGFkanVzdG1lbnQgcmVtYWluaW5nIHRvIGJlIGRvbmUgZnJvbSB0aGUgbGFzdCBgYWRqdGltZScgY2FsbC4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgYWRqdGltZSAoX19jb25zdCBzdHJ1Y3QgdGltZXZhbCAqX19kZWx0YSwKKwkJICAgIHN0cnVjdCB0aW1ldmFsICpfX29sZGRlbHRhKSBfX1RIUk9XOworI2VuZGlmCisKKworLyogVmFsdWVzIGZvciB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYGdldGl0aW1lcicgYW5kIGBzZXRpdGltZXInLiAgKi8KK2VudW0gX19pdGltZXJfd2hpY2gKKyAgeworICAgIC8qIFRpbWVycyBydW4gaW4gcmVhbCB0aW1lLiAgKi8KKyAgICBJVElNRVJfUkVBTCA9IDAsCisjZGVmaW5lIElUSU1FUl9SRUFMIElUSU1FUl9SRUFMCisgICAgLyogVGltZXJzIHJ1biBvbmx5IHdoZW4gdGhlIHByb2Nlc3MgaXMgZXhlY3V0aW5nLiAgKi8KKyAgICBJVElNRVJfVklSVFVBTCA9IDEsCisjZGVmaW5lIElUSU1FUl9WSVJUVUFMIElUSU1FUl9WSVJUVUFMCisgICAgLyogVGltZXJzIHJ1biB3aGVuIHRoZSBwcm9jZXNzIGlzIGV4ZWN1dGluZyBhbmQgd2hlbgorICAgICAgIHRoZSBzeXN0ZW0gaXMgZXhlY3V0aW5nIG9uIGJlaGFsZiBvZiB0aGUgcHJvY2Vzcy4gICovCisgICAgSVRJTUVSX1BST0YgPSAyCisjZGVmaW5lIElUSU1FUl9QUk9GIElUSU1FUl9QUk9GCisgIH07CisKKy8qIFR5cGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZ2V0aXRpbWVyJyBhbmQKKyAgIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGFyZ3VtZW50cyBgc2V0aXRpbWVyJy4gICovCitzdHJ1Y3QgaXRpbWVydmFsCisgIHsKKyAgICAvKiBWYWx1ZSB0byBwdXQgaW50byBgaXRfdmFsdWUnIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMuICAqLworICAgIHN0cnVjdCB0aW1ldmFsIGl0X2ludGVydmFsOworICAgIC8qIFRpbWUgdG8gdGhlIG5leHQgdGltZXIgZXhwaXJhdGlvbi4gICovCisgICAgc3RydWN0IHRpbWV2YWwgaXRfdmFsdWU7CisgIH07CisKKyNpZiBkZWZpbmVkIF9fVVNFX0dOVSAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworLyogVXNlIHRoZSBuaWNlciBwYXJhbWV0ZXIgdHlwZSBvbmx5IGluIEdOVSBtb2RlIGFuZCBub3QgZm9yIEMrKyBzaW5jZSB0aGUKKyAgIHN0cmljdCBDKysgcnVsZXMgcHJldmVudCB0aGUgYXV0b21hdGljIHByb21vdGlvbi4gICovCit0eXBlZGVmIGVudW0gX19pdGltZXJfd2hpY2ggX19pdGltZXJfd2hpY2hfdDsKKyNlbHNlCit0eXBlZGVmIGludCBfX2l0aW1lcl93aGljaF90OworI2VuZGlmCisKKy8qIFNldCAqVkFMVUUgdG8gdGhlIGN1cnJlbnQgc2V0dGluZyBvZiB0aW1lciBXSElDSC4KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9ycy4gICovCitleHRlcm4gaW50IGdldGl0aW1lciAoX19pdGltZXJfd2hpY2hfdCBfX3doaWNoLAorCQkgICAgICBzdHJ1Y3QgaXRpbWVydmFsICpfX3ZhbHVlKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIHRpbWVyIFdISUNIIHRvICpORVcuICBJZiBPTEQgaXMgbm90IE5VTEwsCisgICBzZXQgKk9MRCB0byB0aGUgb2xkIHZhbHVlIG9mIHRpbWVyIFdISUNILgorICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9ycy4gICovCitleHRlcm4gaW50IHNldGl0aW1lciAoX19pdGltZXJfd2hpY2hfdCBfX3doaWNoLAorCQkgICAgICBfX2NvbnN0IHN0cnVjdCBpdGltZXJ2YWwgKl9fcmVzdHJpY3QgX19uZXcsCisJCSAgICAgIHN0cnVjdCBpdGltZXJ2YWwgKl9fcmVzdHJpY3QgX19vbGQpIF9fVEhST1c7CisKKy8qIENoYW5nZSB0aGUgYWNjZXNzIHRpbWUgb2YgRklMRSB0byBUVlBbMF0gYW5kIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZgorICAgRklMRSB0byBUVlBbMV0uICBJZiBUVlAgaXMgYSBudWxsIHBvaW50ZXIsIHVzZSB0aGUgY3VycmVudCB0aW1lIGluc3RlYWQuCisgICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgdXRpbWVzIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19jb25zdCBzdHJ1Y3QgdGltZXZhbCBfX3R2cFsyXSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIFNhbWUgYXMgYHV0aW1lcycsIGJ1dCBkb2VzIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3MuICAqLworZXh0ZXJuIGludCBsdXRpbWVzIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19jb25zdCBzdHJ1Y3QgdGltZXZhbCBfX3R2cFsyXSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFNhbWUgYXMgYHV0aW1lcycsIGJ1dCB0YWtlcyBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBpbnN0ZWFkIG9mIGEgbmFtZS4gICovCitleHRlcm4gaW50IGZ1dGltZXMgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCB0aW1ldmFsIF9fdHZwWzJdKSBfX1RIUk9XOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIENoYW5nZSB0aGUgYWNjZXNzIHRpbWUgb2YgRklMRSByZWxhdGl2ZSB0byBGRCB0byBUVlBbMF0gYW5kIHRoZQorICAgbW9kaWZpY2F0aW9uIHRpbWUgb2YgRklMRSB0byBUVlBbMV0uICBJZiBUVlAgaXMgYSBudWxsIHBvaW50ZXIsIHVzZQorICAgdGhlIGN1cnJlbnQgdGltZSBpbnN0ZWFkLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9ycy4gICovCitleHRlcm4gaW50IGZ1dGltZXNhdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19maWxlLAorCQkgICAgICBfX2NvbnN0IHN0cnVjdCB0aW1ldmFsIF9fdHZwWzJdKSBfX1RIUk9XOworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0JTRAorLyogQ29udmVuaWVuY2UgbWFjcm9zIGZvciBvcGVyYXRpb25zIG9uIHRpbWV2YWxzLgorICAgTk9URTogYHRpbWVyY21wJyBkb2VzIG5vdCB3b3JrIGZvciA+PSBvciA8PS4gICovCisjIGRlZmluZSB0aW1lcmlzc2V0KHR2cCkJKCh0dnApLT50dl9zZWMgfHwgKHR2cCktPnR2X3VzZWMpCisjIGRlZmluZSB0aW1lcmNsZWFyKHR2cCkJKCh0dnApLT50dl9zZWMgPSAodHZwKS0+dHZfdXNlYyA9IDApCisjIGRlZmluZSB0aW1lcmNtcChhLCBiLCBDTVApIAkJCQkJCSAgICAgIFwKKyAgKCgoYSktPnR2X3NlYyA9PSAoYiktPnR2X3NlYykgPyAJCQkJCSAgICAgIFwKKyAgICgoYSktPnR2X3VzZWMgQ01QIChiKS0+dHZfdXNlYykgOiAJCQkJCSAgICAgIFwKKyAgICgoYSktPnR2X3NlYyBDTVAgKGIpLT50dl9zZWMpKQorIyBkZWZpbmUgdGltZXJhZGQoYSwgYiwgcmVzdWx0KQkJCQkJCSAgICAgIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICAocmVzdWx0KS0+dHZfc2VjID0gKGEpLT50dl9zZWMgKyAoYiktPnR2X3NlYzsJCQkgICAgICBcCisgICAgKHJlc3VsdCktPnR2X3VzZWMgPSAoYSktPnR2X3VzZWMgKyAoYiktPnR2X3VzZWM7CQkJICAgICAgXAorICAgIGlmICgocmVzdWx0KS0+dHZfdXNlYyA+PSAxMDAwMDAwKQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwkrKyhyZXN1bHQpLT50dl9zZWM7CQkJCQkJICAgICAgXAorCShyZXN1bHQpLT50dl91c2VjIC09IDEwMDAwMDA7CQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorIyBkZWZpbmUgdGltZXJzdWIoYSwgYiwgcmVzdWx0KQkJCQkJCSAgICAgIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICAocmVzdWx0KS0+dHZfc2VjID0gKGEpLT50dl9zZWMgLSAoYiktPnR2X3NlYzsJCQkgICAgICBcCisgICAgKHJlc3VsdCktPnR2X3VzZWMgPSAoYSktPnR2X3VzZWMgLSAoYiktPnR2X3VzZWM7CQkJICAgICAgXAorICAgIGlmICgocmVzdWx0KS0+dHZfdXNlYyA8IDApIHsJCQkJCSAgICAgIFwKKyAgICAgIC0tKHJlc3VsdCktPnR2X3NlYzsJCQkJCQkgICAgICBcCisgICAgICAocmVzdWx0KS0+dHZfdXNlYyArPSAxMDAwMDAwOwkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYJLyogQlNEICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdGltZS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3RpbWViLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3RpbWViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkYmY0NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdGltZWIuaApAQCAtMCwwICsxLDQ2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19USU1FQl9ICisjZGVmaW5lIF9TWVNfVElNRUJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF90aW1lX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBTdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgdGhlIGBmdGltZScgZnVuY3Rpb24uICAqLworCitzdHJ1Y3QgdGltZWIKKyAgeworICAgIHRpbWVfdCB0aW1lOwkJLyogU2Vjb25kcyBzaW5jZSBlcG9jaCwgYXMgZnJvbSBgdGltZScuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBtaWxsaXRtOwkvKiBBZGRpdGlvbmFsIG1pbGxpc2Vjb25kcy4gICovCisgICAgc2hvcnQgaW50IHRpbWV6b25lOwkJLyogTWludXRlcyB3ZXN0IG9mIEdNVC4gICovCisgICAgc2hvcnQgaW50IGRzdGZsYWc7CQkvKiBOb256ZXJvIGlmIERheWxpZ2h0IFNhdmluZ3MgVGltZSB1c2VkLiAgKi8KKyAgfTsKKworLyogRmlsbCBpbiBUSU1FQlVGIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgdGltZS4gICovCisKK2V4dGVybiBpbnQgZnRpbWUgKHN0cnVjdCB0aW1lYiAqX190aW1lYnVmKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy90aW1lYi5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3RpbWVyZmQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdGltZXJmZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYmIwNmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3RpbWVyZmQuaApAQCAtMCwwICsxLDYwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19USU1FUkZEX0gKKyNkZWZpbmUJX1NZU19USU1FUkZEX0gJMQorCisjaW5jbHVkZSA8dGltZS5oPgorCisKKy8qIEJpdHMgdG8gYmUgc2V0IGluIHRoZSBGTEFHUyBwYXJhbWV0ZXIgb2YgYHRpbWVyZmRfY3JlYXRlJy4gICovCitlbnVtCisgIHsKKyAgICBURkRfQ0xPRVhFQyA9IDAyMDAwMDAwLAorI2RlZmluZSBURkRfQ0xPRVhFQyBURkRfQ0xPRVhFQworICAgIFRGRF9OT05CTE9DSyA9IDA0MDAwCisjZGVmaW5lIFRGRF9OT05CTE9DSyBURkRfTk9OQkxPQ0sKKyAgfTsKKworCisvKiBCaXRzIHRvIGJlIHNldCBpbiB0aGUgRkxBR1MgcGFyYW1ldGVyIG9mIGB0aW1lcmZkX3NldHRpbWUnLiAgKi8KK2VudW0KKyAgeworICAgIFRGRF9USU1FUl9BQlNUSU1FID0gMSA8PCAwCisjZGVmaW5lIFRGRF9USU1FUl9BQlNUSU1FIFRGRF9USU1FUl9BQlNUSU1FCisgIH07CisKKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gZmlsZSBkZXNjcmlwdG9yIGZvciBuZXcgaW50ZXJ2YWwgdGltZXIgc291cmNlLiAgKi8KK2V4dGVybiBpbnQgdGltZXJmZF9jcmVhdGUgKGNsb2NraWRfdCBfX2Nsb2NrX2lkLCBpbnQgX19mbGFncykgX19USFJPVzsKKworLyogU2V0IG5leHQgZXhwaXJhdGlvbiB0aW1lIG9mIGludGVydmFsIHRpbWVyIHNvdXJjZSBVRkQgdG8gVVRNUi4gIElmCisgICBGTEFHUyBoYXMgdGhlIFRGRF9USU1FUl9BQlNUSU1FIGZsYWcgc2V0IHRoZSB0aW1lb3V0IHZhbHVlIGlzCisgICBhYnNvbHV0ZS4gIE9wdGlvbmFsbHkgcmV0dXJuIHRoZSBvbGQgZXhwaXJhdGlvbiB0aW1lIGluIE9UTVIuICAqLworZXh0ZXJuIGludCB0aW1lcmZkX3NldHRpbWUgKGludCBfX3VmZCwgaW50IF9fZmxhZ3MsCisJCQkgICAgX19jb25zdCBzdHJ1Y3QgaXRpbWVyc3BlYyAqX191dG1yLAorCQkJICAgIHN0cnVjdCBpdGltZXJzcGVjICpfX290bXIpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgbmV4dCBleHBpcmF0aW9uIHRpbWUgb2YgVUZELiAgKi8KK2V4dGVybiBpbnQgdGltZXJmZF9nZXR0aW1lIChpbnQgX191ZmQsIHN0cnVjdCBpdGltZXJzcGVjICpfX290bXIpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdGltZXJmZC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3RpbWVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3RpbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyMmYyZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdGltZXMuaApAQCAtMCwwICsxLDUzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogNC41LjIgUHJvY2VzcyBUaW1lcwk8c3lzL3RpbWVzLmg+CisgKi8KKworI2lmbmRlZglfU1lTX1RJTUVTX0gKKyNkZWZpbmUJX1NZU19USU1FU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNkZWZpbmUJX19uZWVkX2Nsb2NrX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBDUFUgdGltZSB1c2VkIGJ5IGEgcHJvY2VzcyBhbmQgaXRzIGNoaWxkcmVuLiAgKi8KK3N0cnVjdCB0bXMKKyAgeworICAgIGNsb2NrX3QgdG1zX3V0aW1lOwkJLyogVXNlciBDUFUgdGltZS4gICovCisgICAgY2xvY2tfdCB0bXNfc3RpbWU7CQkvKiBTeXN0ZW0gQ1BVIHRpbWUuICAqLworCisgICAgY2xvY2tfdCB0bXNfY3V0aW1lOwkJLyogVXNlciBDUFUgdGltZSBvZiBkZWFkIGNoaWxkcmVuLiAgKi8KKyAgICBjbG9ja190IHRtc19jc3RpbWU7CQkvKiBTeXN0ZW0gQ1BVIHRpbWUgb2YgZGVhZCBjaGlsZHJlbi4gICovCisgIH07CisKKworLyogU3RvcmUgdGhlIENQVSB0aW1lIHVzZWQgYnkgdGhpcyBwcm9jZXNzIGFuZCBhbGwgaXRzCisgICBkZWFkIGNoaWxkcmVuIChhbmQgdGhlaXIgZGVhZCBjaGlsZHJlbikgaW4gQlVGRkVSLgorICAgUmV0dXJuIHRoZSBlbGFwc2VkIHJlYWwgdGltZSwgb3IgKGNsb2NrX3QpIC0xIGZvciBlcnJvcnMuCisgICBBbGwgdGltZXMgYXJlIGluIENMS19UQ0t0aHMgb2YgYSBzZWNvbmQuICAqLworZXh0ZXJuIGNsb2NrX3QgdGltZXMgKHN0cnVjdCB0bXMgKl9fYnVmZmVyKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3RpbWVzLmgJKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdGltZXguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdGltZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTYxYmI1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90aW1leC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LDE5OTksMjAwNywyMDA5LDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19USU1FWF9ICisjZGVmaW5lCV9TWVNfVElNRVhfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKy8qIFRoZXNlIGRlZmluaXRpb25zIGZyb20gbGludXgvdGltZXguaCBhcyBvZiAyLjYuMzAuICAqLworCisjaW5jbHVkZSA8Yml0cy90aW1leC5oPgorCisjZGVmaW5lIE5UUF9BUEkJNAkvKiBOVFAgQVBJIHZlcnNpb24gKi8KKworc3RydWN0IG50cHRpbWV2YWwKK3sKKyAgc3RydWN0IHRpbWV2YWwgdGltZTsJLyogY3VycmVudCB0aW1lIChybykgKi8KKyAgbG9uZyBpbnQgbWF4ZXJyb3I7CS8qIG1heGltdW0gZXJyb3IgKHVzKSAocm8pICovCisgIGxvbmcgaW50IGVzdGVycm9yOwkvKiBlc3RpbWF0ZWQgZXJyb3IgKHVzKSAocm8pICovCisgIGxvbmcgaW50IHRhaTsJCS8qIFRBSSBvZmZzZXQgKHJvKSAqLworCisgIGxvbmcgaW50IF9fdW51c2VkMTsKKyAgbG9uZyBpbnQgX191bnVzZWQyOworICBsb25nIGludCBfX3VudXNlZDM7CisgIGxvbmcgaW50IF9fdW51c2VkNDsKK307CisKKy8qIENsb2NrIHN0YXRlcyAodGltZV9zdGF0ZSkgKi8KKyNkZWZpbmUgVElNRV9PSwkJMAkvKiBjbG9jayBzeW5jaHJvbml6ZWQsIG5vIGxlYXAgc2Vjb25kICovCisjZGVmaW5lIFRJTUVfSU5TCTEJLyogaW5zZXJ0IGxlYXAgc2Vjb25kICovCisjZGVmaW5lIFRJTUVfREVMCTIJLyogZGVsZXRlIGxlYXAgc2Vjb25kICovCisjZGVmaW5lIFRJTUVfT09QCTMJLyogbGVhcCBzZWNvbmQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgVElNRV9XQUlUCTQJLyogbGVhcCBzZWNvbmQgaGFzIG9jY3VycmVkICovCisjZGVmaW5lIFRJTUVfRVJST1IJNQkvKiBjbG9jayBub3Qgc3luY2hyb25pemVkICovCisjZGVmaW5lIFRJTUVfQkFECVRJTUVfRVJST1IgLyogYncgY29tcGF0ICovCisKKy8qIE1heGltdW0gdGltZSBjb25zdGFudCBvZiB0aGUgUExMLiAgKi8KKyNkZWZpbmUgTUFYVEMJCTYKKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IF9fYWRqdGltZXggKHN0cnVjdCB0aW1leCAqX19udHgpIF9fVEhST1c7CitleHRlcm4gaW50IGFkanRpbWV4IChzdHJ1Y3QgdGltZXggKl9fbnR4KSBfX1RIUk9XOworCisjaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKG50cF9nZXR0aW1lLCAoc3RydWN0IG50cHRpbWV2YWwgKl9fbnR2KSwKKwkJCSAgIG50cF9nZXR0aW1leCk7CisjZWxzZQorZXh0ZXJuIGludCBudHBfZ2V0dGltZXggKHN0cnVjdCBudHB0aW1ldmFsICpfX250dikgX19USFJPVzsKKyMgZGVmaW5lIG50cF9nZXR0aW1lIG50cF9nZXR0aW1leAorI2VuZGlmCitleHRlcm4gaW50IG50cF9hZGp0aW1lIChzdHJ1Y3QgdGltZXggKl9fdG50eCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy90aW1leC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3R0eWNoYXJzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3R0eWNoYXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0M2Y2MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdHR5Y2hhcnMuaApAQCAtMCwwICsxLDYxIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MCwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0dHljaGFycy5oCTguMiAoQmVya2VsZXkpIDEvNC85NAorICovCisKKy8qCisgKiA0LjMgQ09NUEFUSUJJTElUWSBGSUxFCisgKgorICogVXNlciB2aXNpYmxlIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyByZWxhdGVkIHRvIHRlcm1pbmFsIGhhbmRsaW5nLgorICovCisjaWZuZGVmIF9TWVNfVFRZQ0hBUlNfSAorI2RlZmluZQlfU1lTX1RUWUNIQVJTX0ggMQorCitzdHJ1Y3QgdHR5Y2hhcnMgeworCWNoYXIJdGNfZXJhc2U7CS8qIGVyYXNlIGxhc3QgY2hhcmFjdGVyICovCisJY2hhcgl0Y19raWxsOwkvKiBlcmFzZSBlbnRpcmUgbGluZSAqLworCWNoYXIJdGNfaW50cmM7CS8qIGludGVycnVwdCAqLworCWNoYXIJdGNfcXVpdGM7CS8qIHF1aXQgKi8KKwljaGFyCXRjX3N0YXJ0YzsJLyogc3RhcnQgb3V0cHV0ICovCisJY2hhcgl0Y19zdG9wYzsJLyogc3RvcCBvdXRwdXQgKi8KKwljaGFyCXRjX2VvZmM7CS8qIGVuZC1vZi1maWxlICovCisJY2hhcgl0Y19icmtjOwkvKiBpbnB1dCBkZWxpbWl0ZXIgKGxpa2UgbmwpICovCisJY2hhcgl0Y19zdXNwYzsJLyogc3RvcCBwcm9jZXNzIHNpZ25hbCAqLworCWNoYXIJdGNfZHN1c3BjOwkvKiBkZWxheWVkIHN0b3AgcHJvY2VzcyBzaWduYWwgKi8KKwljaGFyCXRjX3Jwcm50YzsJLyogcmVwcmludCBsaW5lICovCisJY2hhcgl0Y19mbHVzaGM7CS8qIGZsdXNoIG91dHB1dCAodG9nZ2xlcykgKi8KKwljaGFyCXRjX3dlcmFzYzsJLyogd29yZCBlcmFzZSAqLworCWNoYXIJdGNfbG5leHRjOwkvKiBsaXRlcmFsIG5leHQgY2hhcmFjdGVyICovCit9OworCisjaWZkZWYgX19VU0VfT0xEX1RUWQorI2luY2x1ZGUgPHN5cy90dHlkZWZhdWx0cy5oPgkvKiB0byBwaWNrIHVwIGNoYXJhY3RlciBkZWZhdWx0cyAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBzeXMvdHR5Y2hhcnMuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90dHlkZWZhdWx0cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90dHlkZWZhdWx0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZTE2OGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3R0eWRlZmF1bHRzLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIChjKSBVTklYIFN5c3RlbSBMYWJvcmF0b3JpZXMsIEluYy4KKyAqIEFsbCBvciBzb21lIHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIG1hdGVyaWFsIGxpY2Vuc2VkCisgKiB0byB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGJ5IEFtZXJpY2FuIFRlbGVwaG9uZSBhbmQgVGVsZWdyYXBoCisgKiBDby4gb3IgVW5peCBTeXN0ZW0gTGFib3JhdG9yaWVzLCBJbmMuIGFuZCBhcmUgcmVwcm9kdWNlZCBoZXJlaW4gd2l0aAorICogdGhlIHBlcm1pc3Npb24gb2YgVU5JWCBTeXN0ZW0gTGFib3JhdG9yaWVzLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0dHlkZWZhdWx0cy5oCTguNCAoQmVya2VsZXkpIDEvMjEvOTQKKyAqLworCisvKgorICogU3lzdGVtIHdpZGUgZGVmYXVsdHMgZm9yIHRlcm1pbmFsIHN0YXRlLiAgTGludXggdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfU1lTX1RUWURFRkFVTFRTX0hfCisjZGVmaW5lCV9TWVNfVFRZREVGQVVMVFNfSF8KKworLyoKKyAqIERlZmF1bHRzIG9uICJmaXJzdCIgb3Blbi4KKyAqLworI2RlZmluZQlUVFlERUZfSUZMQUcJKEJSS0lOVCB8IElTVFJJUCB8IElDUk5MIHwgSU1BWEJFTCB8IElYT04gfCBJWEFOWSkKKyNkZWZpbmUgVFRZREVGX09GTEFHCShPUE9TVCB8IE9OTENSIHwgWFRBQlMpCisjZGVmaW5lIFRUWURFRl9MRkxBRwkoRUNITyB8IElDQU5PTiB8IElTSUcgfCBJRVhURU4gfCBFQ0hPRXxFQ0hPS0V8RUNIT0NUTCkKKyNkZWZpbmUgVFRZREVGX0NGTEFHCShDUkVBRCB8IENTNyB8IFBBUkVOQiB8IEhVUENMKQorI2RlZmluZSBUVFlERUZfU1BFRUQJKEI5NjAwKQorCisvKgorICogQ29udHJvbCBDaGFyYWN0ZXIgRGVmYXVsdHMKKyAqLworI2RlZmluZSBDVFJMKHgpCSh4JjAzNykKKyNkZWZpbmUJQ0VPRgkJQ1RSTCgnZCcpCisjaWZkZWYgX1BPU0lYX1ZESVNBQkxFCisjIGRlZmluZSBDRU9MCQlfUE9TSVhfVkRJU0FCTEUKKyNlbHNlCisjIGRlZmluZSBDRU9MCQknXDAnCQkvKiBYWFggYXZvaWQgX1BPU0lYX1ZESVNBQkxFICovCisjZW5kaWYKKyNkZWZpbmUJQ0VSQVNFCQkwMTc3CisjZGVmaW5lCUNJTlRSCQlDVFJMKCdjJykKKyNpZmRlZiBfUE9TSVhfVkRJU0FCTEUKKyMgZGVmaW5lIENTVEFUVVMJX1BPU0lYX1ZESVNBQkxFCisjZWxzZQorIyBkZWZpbmUgQ1NUQVRVUwknXDAnCQkvKiBYWFggYXZvaWQgX1BPU0lYX1ZESVNBQkxFICovCisjZW5kaWYKKyNkZWZpbmUJQ0tJTEwJCUNUUkwoJ3UnKQorI2RlZmluZQlDTUlOCQkxCisjZGVmaW5lCUNRVUlUCQkwMzQJCS8qIEZTLCBeXCAqLworI2RlZmluZQlDU1VTUAkJQ1RSTCgneicpCisjZGVmaW5lCUNUSU1FCQkwCisjZGVmaW5lCUNEU1VTUAkJQ1RSTCgneScpCisjZGVmaW5lCUNTVEFSVAkJQ1RSTCgncScpCisjZGVmaW5lCUNTVE9QCQlDVFJMKCdzJykKKyNkZWZpbmUJQ0xORVhUCQlDVFJMKCd2JykKKyNkZWZpbmUJQ0RJU0NBUkQgCUNUUkwoJ28nKQorI2RlZmluZQlDV0VSQVNFIAlDVFJMKCd3JykKKyNkZWZpbmUJQ1JFUFJJTlQgCUNUUkwoJ3InKQorI2RlZmluZQlDRU9UCQlDRU9GCisvKiBjb21wYXQgKi8KKyNkZWZpbmUJQ0JSSwkJQ0VPTAorI2RlZmluZSBDUlBSTlQJCUNSRVBSSU5UCisjZGVmaW5lCUNGTFVTSAkJQ0RJU0NBUkQKKworLyogUFJPVEVDVEVEIElOQ0xVU0lPTiBFTkRTIEhFUkUgKi8KKyNlbmRpZiAvKiAhX1NZU19UVFlERUZBVUxUU19IXyAqLworCisvKgorICogI2RlZmluZSBUVFlERUZDSEFSUyB0byBpbmNsdWRlIGFuIGFycmF5IG9mIGRlZmF1bHQgY29udHJvbCBjaGFyYWN0ZXJzLgorICovCisjaWZkZWYgVFRZREVGQ0hBUlMKK2NjX3QJdHR5ZGVmY2hhcnNbTkNDU10gPSB7CisJQ0VPRiwJQ0VPTCwJQ0VPTCwJQ0VSQVNFLCBDV0VSQVNFLCBDS0lMTCwgQ1JFUFJJTlQsCisJX1BPU0lYX1ZESVNBQkxFLCBDSU5UUiwJQ1FVSVQsCUNTVVNQLAlDRFNVU1AsCUNTVEFSVCwJQ1NUT1AsCUNMTkVYVCwKKwlDRElTQ0FSRCwgQ01JTiwJQ1RJTUUsICBDU1RBVFVTLCBfUE9TSVhfVkRJU0FCTEUKK307CisjdW5kZWYgVFRZREVGQ0hBUlMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90eXBlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTkwODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3R5cGVzLmgKQEAgLTAsMCArMSwyNzYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwxOTkyLDE5OTQtMjAwMiwyMDA2LDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogMi42IFByaW1pdGl2ZSBTeXN0ZW0gRGF0YSBUeXBlcwk8c3lzL3R5cGVzLmg+CisgKi8KKworI2lmbmRlZglfU1lTX1RZUEVTX0gKKyNkZWZpbmUJX1NZU19UWVBFU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworI2lmZGVmCV9fVVNFX0JTRAorIyBpZm5kZWYgX191X2NoYXJfZGVmaW5lZAordHlwZWRlZiBfX3VfY2hhciB1X2NoYXI7Cit0eXBlZGVmIF9fdV9zaG9ydCB1X3Nob3J0OwordHlwZWRlZiBfX3VfaW50IHVfaW50OwordHlwZWRlZiBfX3VfbG9uZyB1X2xvbmc7Cit0eXBlZGVmIF9fcXVhZF90IHF1YWRfdDsKK3R5cGVkZWYgX191X3F1YWRfdCB1X3F1YWRfdDsKK3R5cGVkZWYgX19mc2lkX3QgZnNpZF90OworIyAgZGVmaW5lIF9fdV9jaGFyX2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIF9fbG9mZl90IGxvZmZfdDsKKworI2lmbmRlZiBfX2lub190X2RlZmluZWQKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19pbm9fdCBpbm9fdDsKKyMgZWxzZQordHlwZWRlZiBfX2lubzY0X3QgaW5vX3Q7CisjIGVuZGlmCisjIGRlZmluZSBfX2lub190X2RlZmluZWQKKyNlbmRpZgorI2lmIGRlZmluZWQgX19VU0VfTEFSR0VGSUxFNjQgJiYgIWRlZmluZWQgX19pbm82NF90X2RlZmluZWQKK3R5cGVkZWYgX19pbm82NF90IGlubzY0X3Q7CisjIGRlZmluZSBfX2lubzY0X3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19kZXZfdF9kZWZpbmVkCit0eXBlZGVmIF9fZGV2X3QgZGV2X3Q7CisjIGRlZmluZSBfX2Rldl90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fZ2lkX3RfZGVmaW5lZAordHlwZWRlZiBfX2dpZF90IGdpZF90OworIyBkZWZpbmUgX19naWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX21vZGVfdF9kZWZpbmVkCit0eXBlZGVmIF9fbW9kZV90IG1vZGVfdDsKKyMgZGVmaW5lIF9fbW9kZV90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fbmxpbmtfdF9kZWZpbmVkCit0eXBlZGVmIF9fbmxpbmtfdCBubGlua190OworIyBkZWZpbmUgX19ubGlua190X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fdWlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3VpZF90IHVpZF90OworIyBkZWZpbmUgX191aWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX29mZl90X2RlZmluZWQKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19vZmZfdCBvZmZfdDsKKyMgZWxzZQordHlwZWRlZiBfX29mZjY0X3Qgb2ZmX3Q7CisjIGVuZGlmCisjIGRlZmluZSBfX29mZl90X2RlZmluZWQKKyNlbmRpZgorI2lmIGRlZmluZWQgX19VU0VfTEFSR0VGSUxFNjQgJiYgIWRlZmluZWQgX19vZmY2NF90X2RlZmluZWQKK3R5cGVkZWYgX19vZmY2NF90IG9mZjY0X3Q7CisjIGRlZmluZSBfX29mZjY0X3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19waWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fcGlkX3QgcGlkX3Q7CisjIGRlZmluZSBfX3BpZF90X2RlZmluZWQKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgpIFwKKyAgICAmJiAhZGVmaW5lZCBfX2lkX3RfZGVmaW5lZAordHlwZWRlZiBfX2lkX3QgaWRfdDsKKyMgZGVmaW5lIF9faWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX3NzaXplX3RfZGVmaW5lZAordHlwZWRlZiBfX3NzaXplX3Qgc3NpemVfdDsKKyMgZGVmaW5lIF9fc3NpemVfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmZGVmCV9fVVNFX0JTRAorIyBpZm5kZWYgX19kYWRkcl90X2RlZmluZWQKK3R5cGVkZWYgX19kYWRkcl90IGRhZGRyX3Q7Cit0eXBlZGVmIF9fY2FkZHJfdCBjYWRkcl90OworIyAgZGVmaW5lIF9fZGFkZHJfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworI2lmIChkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTikgJiYgIWRlZmluZWQgX19rZXlfdF9kZWZpbmVkCit0eXBlZGVmIF9fa2V5X3Qga2V5X3Q7CisjIGRlZmluZSBfX2tleV90X2RlZmluZWQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisjIGRlZmluZSBfX25lZWRfY2xvY2tfdAorI2VuZGlmCisjZGVmaW5lCV9fbmVlZF90aW1lX3QKKyNkZWZpbmUgX19uZWVkX3RpbWVyX3QKKyNkZWZpbmUgX19uZWVkX2Nsb2NraWRfdAorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmZGVmIF9fVVNFX1hPUEVOCisjIGlmbmRlZiBfX3VzZWNvbmRzX3RfZGVmaW5lZAordHlwZWRlZiBfX3VzZWNvbmRzX3QgdXNlY29uZHNfdDsKKyMgIGRlZmluZSBfX3VzZWNvbmRzX3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19zdXNlY29uZHNfdF9kZWZpbmVkCit0eXBlZGVmIF9fc3VzZWNvbmRzX3Qgc3VzZWNvbmRzX3Q7CisjICBkZWZpbmUgX19zdXNlY29uZHNfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZQlfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBPbGQgY29tcGF0aWJpbGl0eSBuYW1lcyBmb3IgQyB0eXBlcy4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHVsb25nOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgdXNob3J0OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDsKKyNlbmRpZgorCisvKiBUaGVzZSBzaXplLXNwZWNpZmljIG5hbWVzIGFyZSB1c2VkIGJ5IHNvbWUgb2YgdGhlIGluZXQgY29kZS4gICovCisKKyNpZiAhX19HTlVDX1BSRVJFUSAoMiwgNykKKworLyogVGhlc2UgdHlwZXMgYXJlIGRlZmluZWQgYnkgdGhlIElTTyBDOTkgaGVhZGVyIDxpbnR0eXBlcy5oPi4gKi8KKyMgaWZuZGVmIF9faW50OF90X2RlZmluZWQKKyMgIGRlZmluZSBfX2ludDhfdF9kZWZpbmVkCit0eXBlZGVmCWNoYXIgaW50OF90OwordHlwZWRlZglzaG9ydCBpbnQgaW50MTZfdDsKK3R5cGVkZWYJaW50IGludDMyX3Q7CisjICBpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIGxvbmcgaW50IGludDY0X3Q7CisjICBlbGlmIF9fR0xJQkNfSEFWRV9MT05HX0xPTkcKK19fZXh0ZW5zaW9uX18gdHlwZWRlZiBsb25nIGxvbmcgaW50IGludDY0X3Q7CisjICBlbmRpZgorIyBlbmRpZgorCisvKiBCdXQgdGhlc2Ugd2VyZSBkZWZpbmVkIGJ5IElTTyBDIHdpdGhvdXQgdGhlIGZpcnN0IGBfJy4gICovCit0eXBlZGVmCXVuc2lnbmVkIGNoYXIgdV9pbnQ4X3Q7Cit0eXBlZGVmCXVuc2lnbmVkIHNob3J0IGludCB1X2ludDE2X3Q7Cit0eXBlZGVmCXVuc2lnbmVkIGludCB1X2ludDMyX3Q7CisjIGlmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgdV9pbnQ2NF90OworIyBlbGlmIF9fR0xJQkNfSEFWRV9MT05HX0xPTkcKK19fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHVfaW50NjRfdDsKKyMgZW5kaWYKKwordHlwZWRlZiBpbnQgcmVnaXN0ZXJfdDsKKworI2Vsc2UKKworLyogRm9yIEdDQyAyLjcgYW5kIGxhdGVyLCB3ZSBjYW4gdXNlIHNwZWNpZmljIHR5cGUtc2l6ZSBhdHRyaWJ1dGVzLiAgKi8KKyMgZGVmaW5lIF9faW50Tl90KE4sIE1PREUpIFwKKyAgdHlwZWRlZiBpbnQgaW50IyNOIyNfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKE1PREUpKSkKKyMgZGVmaW5lIF9fdV9pbnROX3QoTiwgTU9ERSkgXAorICB0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludCMjTiMjX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChNT0RFKSkpCisKKyMgaWZuZGVmIF9faW50OF90X2RlZmluZWQKKyMgIGRlZmluZSBfX2ludDhfdF9kZWZpbmVkCitfX2ludE5fdCAoOCwgX19RSV9fKTsKK19faW50Tl90ICgxNiwgX19ISV9fKTsKK19faW50Tl90ICgzMiwgX19TSV9fKTsKK19faW50Tl90ICg2NCwgX19ESV9fKTsKKyMgZW5kaWYKKworX191X2ludE5fdCAoOCwgX19RSV9fKTsKK19fdV9pbnROX3QgKDE2LCBfX0hJX18pOworX191X2ludE5fdCAoMzIsIF9fU0lfXyk7CitfX3VfaW50Tl90ICg2NCwgX19ESV9fKTsKKwordHlwZWRlZiBpbnQgcmVnaXN0ZXJfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fd29yZF9fKSkpOworCisKKy8qIFNvbWUgY29kZSBmcm9tIEJJTkQgdGVzdHMgdGhpcyBtYWNybyB0byBzZWUgaWYgdGhlIHR5cGVzIGFib3ZlIGFyZQorICAgZGVmaW5lZC4gICovCisjZW5kaWYKKyNkZWZpbmUgX19CSVRfVFlQRVNfREVGSU5FRF9fCTEKKworCisjaWZkZWYJX19VU0VfQlNECisvKiBJbiBCU0QgPHN5cy90eXBlcy5oPiBpcyBleHBlY3RlZCB0byBkZWZpbmUgQllURV9PUkRFUi4gICovCisjIGluY2x1ZGUgPGVuZGlhbi5oPgorCisvKiBJdCBhbHNvIGRlZmluZXMgYGZkX3NldCcgYW5kIHRoZSBGRF8qIG1hY3JvcyBmb3IgYHNlbGVjdCcuICAqLworIyBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisKKy8qIEJTRCBkZWZpbmVzIHRoZXNlIHN5bWJvbHMsIHNvIHdlIGZvbGxvdy4gICovCisjIGluY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworCisjaWYgKGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgpIFwKKyAgICAmJiAhZGVmaW5lZCBfX2Jsa3NpemVfdF9kZWZpbmVkCit0eXBlZGVmIF9fYmxrc2l6ZV90IGJsa3NpemVfdDsKKyMgZGVmaW5lIF9fYmxrc2l6ZV90X2RlZmluZWQKKyNlbmRpZgorCisvKiBUeXBlcyBmcm9tIHRoZSBMYXJnZSBGaWxlIFN1cHBvcnQgaW50ZXJmYWNlLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorIyBpZm5kZWYgX19ibGtjbnRfdF9kZWZpbmVkCit0eXBlZGVmIF9fYmxrY250X3QgYmxrY250X3Q7CSAvKiBUeXBlIHRvIGNvdW50IG51bWJlciBvZiBkaXNrIGJsb2Nrcy4gICovCisjICBkZWZpbmUgX19ibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmbmRlZiBfX2ZzYmxrY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2ZzYmxrY250X3QgZnNibGtjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBibG9ja3MuICAqLworIyAgZGVmaW5lIF9fZnNibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmbmRlZiBfX2ZzZmlsY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2ZzZmlsY250X3QgZnNmaWxjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBpbm9kZXMuICAqLworIyAgZGVmaW5lIF9fZnNmaWxjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjZWxzZQorIyBpZm5kZWYgX19ibGtjbnRfdF9kZWZpbmVkCit0eXBlZGVmIF9fYmxrY250NjRfdCBibGtjbnRfdDsJICAgLyogVHlwZSB0byBjb3VudCBudW1iZXIgb2YgZGlzayBibG9ja3MuICAqLworIyAgZGVmaW5lIF9fYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2Jsa2NudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2Jsa2NudDY0X3QgZnNibGtjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBibG9ja3MuICAqLworIyAgZGVmaW5lIF9fZnNibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmbmRlZiBfX2ZzZmlsY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2ZzZmlsY250NjRfdCBmc2ZpbGNudF90OyAvKiBUeXBlIHRvIGNvdW50IGZpbGUgc3lzdGVtIGlub2Rlcy4gICovCisjICBkZWZpbmUgX19mc2ZpbGNudF90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3R5cGVkZWYgX19ibGtjbnQ2NF90IGJsa2NudDY0X3Q7ICAgICAvKiBUeXBlIHRvIGNvdW50IG51bWJlciBvZiBkaXNrIGJsb2Nrcy4gKi8KK3R5cGVkZWYgX19mc2Jsa2NudDY0X3QgZnNibGtjbnQ2NF90OyAvKiBUeXBlIHRvIGNvdW50IGZpbGUgc3lzdGVtIGJsb2Nrcy4gICovCit0eXBlZGVmIF9fZnNmaWxjbnQ2NF90IGZzZmlsY250NjRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBpbm9kZXMuICAqLworI2VuZGlmCisKKworLyogTm93IGFkZCB0aGUgdGhyZWFkIHR5cGVzLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYMTk5NTA2IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CisjIGluY2x1ZGUgPGJpdHMvcHRocmVhZHR5cGVzLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy90eXBlcy5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Vjb250ZXh0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Vjb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU5Y2QyOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdWNvbnRleHQuaApAQCAtMCwwICsxLDI0OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVUNPTlRFWFRfSAorI2RlZmluZSBfU1lTX1VDT05URVhUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKy8qIFdlIG5lZWQgdGhlIHNpZ25hbCBjb250ZXh0IGRlZmluaXRpb25zIGV2ZW4gaWYgdGhleSBhcmUgbm90IHVzZWQKKyAgIGluY2x1ZGVkIGluIDxzaWduYWwuaD4uICAqLworI2luY2x1ZGUgPGJpdHMvc2lnY29udGV4dC5oPgorCisjaWYgX19XT1JEU0laRSA9PSA2NAorCisvKiBUeXBlIGZvciBnZW5lcmFsIHJlZ2lzdGVyLiAgKi8KK3R5cGVkZWYgbG9uZyBpbnQgZ3JlZ190OworCisvKiBOdW1iZXIgb2YgZ2VuZXJhbCByZWdpc3RlcnMuICAqLworI2RlZmluZSBOR1JFRwkyMworCisvKiBDb250YWluZXIgZm9yIGFsbCBnZW5lcmFsIHJlZ2lzdGVycy4gICovCit0eXBlZGVmIGdyZWdfdCBncmVnc2V0X3RbTkdSRUddOworCisjaWZkZWYgX19VU0VfR05VCisvKiBOdW1iZXIgb2YgZWFjaCByZWdpc3RlciBpbiB0aGUgYGdyZWdzZXRfdCcgYXJyYXkuICAqLworZW51bQoreworICBSRUdfUjggPSAwLAorIyBkZWZpbmUgUkVHX1I4CQlSRUdfUjgKKyAgUkVHX1I5LAorIyBkZWZpbmUgUkVHX1I5CQlSRUdfUjkKKyAgUkVHX1IxMCwKKyMgZGVmaW5lIFJFR19SMTAJUkVHX1IxMAorICBSRUdfUjExLAorIyBkZWZpbmUgUkVHX1IxMQlSRUdfUjExCisgIFJFR19SMTIsCisjIGRlZmluZSBSRUdfUjEyCVJFR19SMTIKKyAgUkVHX1IxMywKKyMgZGVmaW5lIFJFR19SMTMJUkVHX1IxMworICBSRUdfUjE0LAorIyBkZWZpbmUgUkVHX1IxNAlSRUdfUjE0CisgIFJFR19SMTUsCisjIGRlZmluZSBSRUdfUjE1CVJFR19SMTUKKyAgUkVHX1JESSwKKyMgZGVmaW5lIFJFR19SREkJUkVHX1JESQorICBSRUdfUlNJLAorIyBkZWZpbmUgUkVHX1JTSQlSRUdfUlNJCisgIFJFR19SQlAsCisjIGRlZmluZSBSRUdfUkJQCVJFR19SQlAKKyAgUkVHX1JCWCwKKyMgZGVmaW5lIFJFR19SQlgJUkVHX1JCWAorICBSRUdfUkRYLAorIyBkZWZpbmUgUkVHX1JEWAlSRUdfUkRYCisgIFJFR19SQVgsCisjIGRlZmluZSBSRUdfUkFYCVJFR19SQVgKKyAgUkVHX1JDWCwKKyMgZGVmaW5lIFJFR19SQ1gJUkVHX1JDWAorICBSRUdfUlNQLAorIyBkZWZpbmUgUkVHX1JTUAlSRUdfUlNQCisgIFJFR19SSVAsCisjIGRlZmluZSBSRUdfUklQCVJFR19SSVAKKyAgUkVHX0VGTCwKKyMgZGVmaW5lIFJFR19FRkwJUkVHX0VGTAorICBSRUdfQ1NHU0ZTLAkJLyogQWN0dWFsbHkgc2hvcnQgY3MsIGdzLCBmcywgX19wYWQwLiAgKi8KKyMgZGVmaW5lIFJFR19DU0dTRlMJUkVHX0NTR1NGUworICBSRUdfRVJSLAorIyBkZWZpbmUgUkVHX0VSUglSRUdfRVJSCisgIFJFR19UUkFQTk8sCisjIGRlZmluZSBSRUdfVFJBUE5PCVJFR19UUkFQTk8KKyAgUkVHX09MRE1BU0ssCisjIGRlZmluZSBSRUdfT0xETUFTSwlSRUdfT0xETUFTSworICBSRUdfQ1IyCisjIGRlZmluZSBSRUdfQ1IyCVJFR19DUjIKK307CisjZW5kaWYKKworc3RydWN0IF9saWJjX2ZweHJlZworeworICB1bnNpZ25lZCBzaG9ydCBpbnQgc2lnbmlmaWNhbmRbNF07CisgIHVuc2lnbmVkIHNob3J0IGludCBleHBvbmVudDsKKyAgdW5zaWduZWQgc2hvcnQgaW50IHBhZGRpbmdbM107Cit9OworCitzdHJ1Y3QgX2xpYmNfeG1tcmVnCit7CisgIF9fdWludDMyX3QJZWxlbWVudFs0XTsKK307CisKK3N0cnVjdCBfbGliY19mcHN0YXRlCit7CisgIC8qIDY0LWJpdCBGWFNBVkUgZm9ybWF0LiAgKi8KKyAgX191aW50MTZfdAkJY3dkOworICBfX3VpbnQxNl90CQlzd2Q7CisgIF9fdWludDE2X3QJCWZ0dzsKKyAgX191aW50MTZfdAkJZm9wOworICBfX3VpbnQ2NF90CQlyaXA7CisgIF9fdWludDY0X3QJCXJkcDsKKyAgX191aW50MzJfdAkJbXhjc3I7CisgIF9fdWludDMyX3QJCW14Y3JfbWFzazsKKyAgc3RydWN0IF9saWJjX2ZweHJlZwlfc3RbOF07CisgIHN0cnVjdCBfbGliY194bW1yZWcJX3htbVsxNl07CisgIF9fdWludDMyX3QJCXBhZGRpbmdbMjRdOworfTsKKworLyogU3RydWN0dXJlIHRvIGRlc2NyaWJlIEZQVSByZWdpc3RlcnMuICAqLwordHlwZWRlZiBzdHJ1Y3QgX2xpYmNfZnBzdGF0ZSAqZnByZWdzZXRfdDsKKworLyogQ29udGV4dCB0byBkZXNjcmliZSB3aG9sZSBwcm9jZXNzb3Igc3RhdGUuICAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIGdyZWdzZXRfdCBncmVnczsKKyAgICAvKiBOb3RlIHRoYXQgZnByZWdzIGlzIGEgcG9pbnRlci4gICovCisgICAgZnByZWdzZXRfdCBmcHJlZ3M7CisgICAgdW5zaWduZWQgbG9uZyBfX3Jlc2VydmVkMSBbOF07Cit9IG1jb250ZXh0X3Q7CisKKy8qIFVzZXJsZXZlbCBjb250ZXh0LiAgKi8KK3R5cGVkZWYgc3RydWN0IHVjb250ZXh0CisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCB1Y19mbGFnczsKKyAgICBzdHJ1Y3QgdWNvbnRleHQgKnVjX2xpbms7CisgICAgc3RhY2tfdCB1Y19zdGFjazsKKyAgICBtY29udGV4dF90IHVjX21jb250ZXh0OworICAgIF9fc2lnc2V0X3QgdWNfc2lnbWFzazsKKyAgICBzdHJ1Y3QgX2xpYmNfZnBzdGF0ZSBfX2ZwcmVnc19tZW07CisgIH0gdWNvbnRleHRfdDsKKworI2Vsc2UgLyogX19XT1JEU0laRSA9PSAzMiAqLworCisvKiBUeXBlIGZvciBnZW5lcmFsIHJlZ2lzdGVyLiAgKi8KK3R5cGVkZWYgaW50IGdyZWdfdDsKKworLyogTnVtYmVyIG9mIGdlbmVyYWwgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgTkdSRUcJMTkKKworLyogQ29udGFpbmVyIGZvciBhbGwgZ2VuZXJhbCByZWdpc3RlcnMuICAqLwordHlwZWRlZiBncmVnX3QgZ3JlZ3NldF90W05HUkVHXTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogTnVtYmVyIG9mIGVhY2ggcmVnaXN0ZXIgaXMgdGhlIGBncmVnc2V0X3QnIGFycmF5LiAgKi8KK2VudW0KK3sKKyAgUkVHX0dTID0gMCwKKyMgZGVmaW5lIFJFR19HUwkJUkVHX0dTCisgIFJFR19GUywKKyMgZGVmaW5lIFJFR19GUwkJUkVHX0ZTCisgIFJFR19FUywKKyMgZGVmaW5lIFJFR19FUwkJUkVHX0VTCisgIFJFR19EUywKKyMgZGVmaW5lIFJFR19EUwkJUkVHX0RTCisgIFJFR19FREksCisjIGRlZmluZSBSRUdfRURJCVJFR19FREkKKyAgUkVHX0VTSSwKKyMgZGVmaW5lIFJFR19FU0kJUkVHX0VTSQorICBSRUdfRUJQLAorIyBkZWZpbmUgUkVHX0VCUAlSRUdfRUJQCisgIFJFR19FU1AsCisjIGRlZmluZSBSRUdfRVNQCVJFR19FU1AKKyAgUkVHX0VCWCwKKyMgZGVmaW5lIFJFR19FQlgJUkVHX0VCWAorICBSRUdfRURYLAorIyBkZWZpbmUgUkVHX0VEWAlSRUdfRURYCisgIFJFR19FQ1gsCisjIGRlZmluZSBSRUdfRUNYCVJFR19FQ1gKKyAgUkVHX0VBWCwKKyMgZGVmaW5lIFJFR19FQVgJUkVHX0VBWAorICBSRUdfVFJBUE5PLAorIyBkZWZpbmUgUkVHX1RSQVBOTwlSRUdfVFJBUE5PCisgIFJFR19FUlIsCisjIGRlZmluZSBSRUdfRVJSCVJFR19FUlIKKyAgUkVHX0VJUCwKKyMgZGVmaW5lIFJFR19FSVAJUkVHX0VJUAorICBSRUdfQ1MsCisjIGRlZmluZSBSRUdfQ1MJCVJFR19DUworICBSRUdfRUZMLAorIyBkZWZpbmUgUkVHX0VGTAlSRUdfRUZMCisgIFJFR19VRVNQLAorIyBkZWZpbmUgUkVHX1VFU1AJUkVHX1VFU1AKKyAgUkVHX1NTCisjIGRlZmluZSBSRUdfU1MJUkVHX1NTCit9OworI2VuZGlmCisKKy8qIERlZmluaXRpb25zIHRha2VuIGZyb20gdGhlIGtlcm5lbCBoZWFkZXJzLiAgKi8KK3N0cnVjdCBfbGliY19mcHJlZworeworICB1bnNpZ25lZCBzaG9ydCBpbnQgc2lnbmlmaWNhbmRbNF07CisgIHVuc2lnbmVkIHNob3J0IGludCBleHBvbmVudDsKK307CisKK3N0cnVjdCBfbGliY19mcHN0YXRlCit7CisgIHVuc2lnbmVkIGxvbmcgaW50IGN3OworICB1bnNpZ25lZCBsb25nIGludCBzdzsKKyAgdW5zaWduZWQgbG9uZyBpbnQgdGFnOworICB1bnNpZ25lZCBsb25nIGludCBpcG9mZjsKKyAgdW5zaWduZWQgbG9uZyBpbnQgY3NzZWw7CisgIHVuc2lnbmVkIGxvbmcgaW50IGRhdGFvZmY7CisgIHVuc2lnbmVkIGxvbmcgaW50IGRhdGFzZWw7CisgIHN0cnVjdCBfbGliY19mcHJlZyBfc3RbOF07CisgIHVuc2lnbmVkIGxvbmcgaW50IHN0YXR1czsKK307CisKKy8qIFN0cnVjdHVyZSB0byBkZXNjcmliZSBGUFUgcmVnaXN0ZXJzLiAgKi8KK3R5cGVkZWYgc3RydWN0IF9saWJjX2Zwc3RhdGUgKmZwcmVnc2V0X3Q7CisKKy8qIENvbnRleHQgdG8gZGVzY3JpYmUgd2hvbGUgcHJvY2Vzc29yIHN0YXRlLiAgKi8KK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBncmVnc2V0X3QgZ3JlZ3M7CisgICAgLyogRHVlIHRvIExpbnV4J3MgaGlzdG9yeSB3ZSBoYXZlIHRvIHVzZSBhIHBvaW50ZXIgaGVyZS4gIFRoZSBTeXNWL2kzODYKKyAgICAgICBBQkkgcmVxdWlyZXMgYSBzdHJ1Y3Qgd2l0aCB0aGUgdmFsdWVzLiAgKi8KKyAgICBmcHJlZ3NldF90IGZwcmVnczsKKyAgICB1bnNpZ25lZCBsb25nIGludCBvbGRtYXNrOworICAgIHVuc2lnbmVkIGxvbmcgaW50IGNyMjsKKyAgfSBtY29udGV4dF90OworCisvKiBVc2VybGV2ZWwgY29udGV4dC4gICovCit0eXBlZGVmIHN0cnVjdCB1Y29udGV4dAorICB7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgdWNfZmxhZ3M7CisgICAgc3RydWN0IHVjb250ZXh0ICp1Y19saW5rOworICAgIHN0YWNrX3QgdWNfc3RhY2s7CisgICAgbWNvbnRleHRfdCB1Y19tY29udGV4dDsKKyAgICBfX3NpZ3NldF90IHVjX3NpZ21hc2s7CisgICAgc3RydWN0IF9saWJjX2Zwc3RhdGUgX19mcHJlZ3NfbWVtOworICB9IHVjb250ZXh0X3Q7CisKKyNlbmRpZiAvKiBfX1dPUkRTSVpFID09IDMyICovCisKKyNlbmRpZiAvKiBzeXMvdWNvbnRleHQuaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91aW8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyYjdlZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdWlvLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwxOTkyLDE5OTYtMTk5OSwyMDAzLDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19VSU9fSAorI2RlZmluZSBfU1lTX1VJT19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUaGlzIGZpbGUgZGVmaW5lcyBgc3RydWN0IGlvdmVjJy4gICovCisjaW5jbHVkZSA8Yml0cy91aW8uaD4KKworCisvKiBSZWFkIGRhdGEgZnJvbSBmaWxlIGRlc2NyaXB0b3IgRkQsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiB0aGUKKyAgIGJ1ZmZlcnMgZGVzY3JpYmVkIGJ5IElPVkVDLCB3aGljaCBpcyBhIHZlY3RvciBvZiBDT1VOVCAnc3RydWN0IGlvdmVjJ3MuCisgICBUaGUgYnVmZmVycyBhcmUgZmlsbGVkIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuCisgICBPcGVyYXRlcyBqdXN0IGxpa2UgJ3JlYWQnIChzZWUgPHVuaXN0ZC5oPikgZXhjZXB0IHRoYXQgZGF0YSBhcmUKKyAgIHB1dCBpbiBJT1ZFQyBpbnN0ZWFkIG9mIGEgY29udGlndW91cyBidWZmZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgcmVhZHYgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19pb3ZlYywgaW50IF9fY291bnQpCisgIF9fd3VyOworCisvKiBXcml0ZSBkYXRhIHBvaW50ZWQgYnkgdGhlIGJ1ZmZlcnMgZGVzY3JpYmVkIGJ5IElPVkVDLCB3aGljaAorICAgaXMgYSB2ZWN0b3Igb2YgQ09VTlQgJ3N0cnVjdCBpb3ZlYydzLCB0byBmaWxlIGRlc2NyaXB0b3IgRkQuCisgICBUaGUgZGF0YSBpcyB3cml0dGVuIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuCisgICBPcGVyYXRlcyBqdXN0IGxpa2UgJ3dyaXRlJyAoc2VlIDx1bmlzdGQuaD4pIGV4Y2VwdCB0aGF0IHRoZSBkYXRhCisgICBhcmUgdGFrZW4gZnJvbSBJT1ZFQyBpbnN0ZWFkIG9mIGEgY29udGlndW91cyBidWZmZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3Qgd3JpdGV2IChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9faW92ZWMsIGludCBfX2NvdW50KQorICBfX3d1cjsKKworCisjaWZkZWYgX19VU0VfQlNECisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisvKiBSZWFkIGRhdGEgZnJvbSBmaWxlIGRlc2NyaXB0b3IgRkQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIE9GRlNFVAorICAgd2l0aG91dCBjaGFuZ2UgdGhlIGZpbGUgcG9pbnRlciwgYW5kIHB1dCB0aGUgcmVzdWx0IGluIHRoZSBidWZmZXJzCisgICBkZXNjcmliZWQgYnkgSU9WRUMsIHdoaWNoIGlzIGEgdmVjdG9yIG9mIENPVU5UICdzdHJ1Y3QgaW92ZWMncy4KKyAgIFRoZSBidWZmZXJzIGFyZSBmaWxsZWQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4gIE9wZXJhdGVzIGp1c3QgbGlrZQorICAgJ3ByZWFkJyAoc2VlIDx1bmlzdGQuaD4pIGV4Y2VwdCB0aGF0IGRhdGEgYXJlIHB1dCBpbiBJT1ZFQyBpbnN0ZWFkCisgICBvZiBhIGNvbnRpZ3VvdXMgYnVmZmVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHByZWFkdiAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdmVjLCBpbnQgX19jb3VudCwKKwkJICAgICAgIF9fb2ZmX3QgX19vZmZzZXQpIF9fd3VyOworCisvKiBXcml0ZSBkYXRhIHBvaW50ZWQgYnkgdGhlIGJ1ZmZlcnMgZGVzY3JpYmVkIGJ5IElPVkVDLCB3aGljaCBpcyBhCisgICB2ZWN0b3Igb2YgQ09VTlQgJ3N0cnVjdCBpb3ZlYydzLCB0byBmaWxlIGRlc2NyaXB0b3IgRkQgYXQgdGhlIGdpdmVuCisgICBwb3NpdGlvbiBPRkZTRVQgd2l0aG91dCBjaGFuZ2UgdGhlIGZpbGUgcG9pbnRlci4gIFRoZSBkYXRhIGlzCisgICB3cml0dGVuIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuICBPcGVyYXRlcyBqdXN0IGxpa2UgJ3B3cml0ZScgKHNlZQorICAgPHVuaXN0ZC5oPikgZXhjZXB0IHRoYXQgdGhlIGRhdGEgYXJlIHRha2VuIGZyb20gSU9WRUMgaW5zdGVhZCBvZiBhCisgICBjb250aWd1b3VzIGJ1ZmZlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCBwd3JpdGV2IChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9faW92ZWMsIGludCBfX2NvdW50LAorCQkJX19vZmZfdCBfX29mZnNldCkgX193dXI7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKHByZWFkdiwgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19pb3ZlYywKKwkJCQkgICAgaW50IF9fY291bnQsIF9fb2ZmNjRfdCBfX29mZnNldCksCisJCQkgICBwcmVhZHY2NCkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChwd3JpdGV2LCAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdmVjLAorCQkJCSAgICAgaW50IF9fY291bnQsIF9fb2ZmNjRfdCBfX29mZnNldCksCisJCQkgICBwd3JpdGV2NjQpIF9fd3VyOworIyAgZWxzZQorIyAgIGRlZmluZSBwcmVhZHYgcHJlYWR2NjQKKyMgICBkZWZpbmUgcHdyaXRldiBwd3JpdGV2NjQKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKKy8qIFJlYWQgZGF0YSBmcm9tIGZpbGUgZGVzY3JpcHRvciBGRCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gT0ZGU0VUCisgICB3aXRob3V0IGNoYW5nZSB0aGUgZmlsZSBwb2ludGVyLCBhbmQgcHV0IHRoZSByZXN1bHQgaW4gdGhlIGJ1ZmZlcnMKKyAgIGRlc2NyaWJlZCBieSBJT1ZFQywgd2hpY2ggaXMgYSB2ZWN0b3Igb2YgQ09VTlQgJ3N0cnVjdCBpb3ZlYydzLgorICAgVGhlIGJ1ZmZlcnMgYXJlIGZpbGxlZCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLiAgT3BlcmF0ZXMganVzdCBsaWtlCisgICAncHJlYWQnIChzZWUgPHVuaXN0ZC5oPikgZXhjZXB0IHRoYXQgZGF0YSBhcmUgcHV0IGluIElPVkVDIGluc3RlYWQKKyAgIG9mIGEgY29udGlndW91cyBidWZmZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgcHJlYWR2NjQgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19pb3ZlYywgaW50IF9fY291bnQsCisJCQkgX19vZmY2NF90IF9fb2Zmc2V0KSBfX3d1cjsKKworLyogV3JpdGUgZGF0YSBwb2ludGVkIGJ5IHRoZSBidWZmZXJzIGRlc2NyaWJlZCBieSBJT1ZFQywgd2hpY2ggaXMgYQorICAgdmVjdG9yIG9mIENPVU5UICdzdHJ1Y3QgaW92ZWMncywgdG8gZmlsZSBkZXNjcmlwdG9yIEZEIGF0IHRoZSBnaXZlbgorICAgcG9zaXRpb24gT0ZGU0VUIHdpdGhvdXQgY2hhbmdlIHRoZSBmaWxlIHBvaW50ZXIuICBUaGUgZGF0YSBpcworICAgd3JpdHRlbiBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLiAgT3BlcmF0ZXMganVzdCBsaWtlICdwd3JpdGUnIChzZWUKKyAgIDx1bmlzdGQuaD4pIGV4Y2VwdCB0aGF0IHRoZSBkYXRhIGFyZSB0YWtlbiBmcm9tIElPVkVDIGluc3RlYWQgb2YgYQorICAgY29udGlndW91cyBidWZmZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgcHdyaXRldjY0IChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9faW92ZWMsIGludCBfX2NvdW50LAorCQkJICBfX29mZjY0X3QgX19vZmZzZXQpIF9fd3VyOworIyBlbmRpZgorI2VuZGlmCS8qIFVzZSBCU0QgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy91aW8uaCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91bHRyYXNvdW5kLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3VsdHJhc291bmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjVjMzg1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91bHRyYXNvdW5kLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGxpbnV4L3VsdHJhc291bmQuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmExMGU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91bi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NSwgMTk5NiwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX1VOX0gKKyNkZWZpbmUJX1NZU19VTl9ICTEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisvKiBHZXQgdGhlIGRlZmluaXRpb24gb2YgdGhlIG1hY3JvIHRvIGRlZmluZSB0aGUgY29tbW9uIHNvY2thZGRyIG1lbWJlcnMuICAqLworI2luY2x1ZGUgPGJpdHMvc29ja2FkZHIuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgYWRkcmVzcyBvZiBhbiBBRl9MT0NBTCAoYWthIEFGX1VOSVgpIHNvY2tldC4gICovCitzdHJ1Y3Qgc29ja2FkZHJfdW4KKyAgeworICAgIF9fU09DS0FERFJfQ09NTU9OIChzdW5fKTsKKyAgICBjaGFyIHN1bl9wYXRoWzEwOF07CQkvKiBQYXRoIG5hbWUuICAqLworICB9OworCisKKyNpZmRlZiBfX1VTRV9NSVNDCisjIGluY2x1ZGUgPHN0cmluZy5oPgkJLyogRm9yIHByb3RvdHlwZSBvZiBgc3RybGVuJy4gICovCisKKy8qIEV2YWx1YXRlIHRvIGFjdHVhbCBsZW5ndGggb2YgdGhlIGBzb2NrYWRkcl91bicgc3RydWN0dXJlLiAgKi8KKyMgZGVmaW5lIFNVTl9MRU4ocHRyKSAoKHNpemVfdCkgKCgoc3RydWN0IHNvY2thZGRyX3VuICopIDApLT5zdW5fcGF0aCkJICAgICAgXAorCQkgICAgICArIHN0cmxlbiAoKHB0ciktPnN1bl9wYXRoKSkKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3VuLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3VuaXN0ZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91bmlzdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTgyM2ZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91bmlzdGQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3VzZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODgwMjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3VzZXIuaApAQCAtMCwwICsxLDE3NSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA0LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVVNFUl9ICisjZGVmaW5lIF9TWVNfVVNFUl9ICTEKKworLyogVGhlIHdob2xlIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIGZvciBHREIgYW5kIEdEQiBvbmx5LiAgRG9uJ3QgcmVhZAorICAgdG9vIG11Y2ggaW50byBpdC4gIERvbid0IHVzZSBpdCBmb3IgYW55dGhpbmcgb3RoZXIgdGhhbiBHREIgdW5sZXNzCisgICB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuICAqLworCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWYgX19XT1JEU0laRSA9PSA2NAorCitzdHJ1Y3QgdXNlcl9mcHJlZ3Nfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IGludAljd2Q7CisgIHVuc2lnbmVkIHNob3J0IGludAlzd2Q7CisgIHVuc2lnbmVkIHNob3J0IGludAlmdHc7CisgIHVuc2lnbmVkIHNob3J0IGludAlmb3A7CisgIHVuc2lnbmVkIGxvbmcgaW50CXJpcDsKKyAgdW5zaWduZWQgbG9uZyBpbnQJcmRwOworICB1bnNpZ25lZCBpbnQJCW14Y3NyOworICB1bnNpZ25lZCBpbnQJCW14Y3JfbWFzazsKKyAgdW5zaWduZWQgaW50CQlzdF9zcGFjZVszMl07ICAgLyogOCoxNiBieXRlcyBmb3IgZWFjaCBGUC1yZWcgPSAxMjggYnl0ZXMgKi8KKyAgdW5zaWduZWQgaW50CQl4bW1fc3BhY2VbNjRdOyAgLyogMTYqMTYgYnl0ZXMgZm9yIGVhY2ggWE1NLXJlZyA9IDI1NiBieXRlcyAqLworICB1bnNpZ25lZCBpbnQJCXBhZGRpbmdbMjRdOworfTsKKworc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgcjE1OworICB1bnNpZ25lZCBsb25nIGludCByMTQ7CisgIHVuc2lnbmVkIGxvbmcgaW50IHIxMzsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcjEyOworICB1bnNpZ25lZCBsb25nIGludCByYnA7CisgIHVuc2lnbmVkIGxvbmcgaW50IHJieDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcjExOworICB1bnNpZ25lZCBsb25nIGludCByMTA7CisgIHVuc2lnbmVkIGxvbmcgaW50IHI5OworICB1bnNpZ25lZCBsb25nIGludCByODsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcmF4OworICB1bnNpZ25lZCBsb25nIGludCByY3g7CisgIHVuc2lnbmVkIGxvbmcgaW50IHJkeDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcnNpOworICB1bnNpZ25lZCBsb25nIGludCByZGk7CisgIHVuc2lnbmVkIGxvbmcgaW50IG9yaWdfcmF4OworICB1bnNpZ25lZCBsb25nIGludCByaXA7CisgIHVuc2lnbmVkIGxvbmcgaW50IGNzOworICB1bnNpZ25lZCBsb25nIGludCBlZmxhZ3M7CisgIHVuc2lnbmVkIGxvbmcgaW50IHJzcDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgc3M7CisgIHVuc2lnbmVkIGxvbmcgaW50IGZzX2Jhc2U7CisgIHVuc2lnbmVkIGxvbmcgaW50IGdzX2Jhc2U7CisgIHVuc2lnbmVkIGxvbmcgaW50IGRzOworICB1bnNpZ25lZCBsb25nIGludCBlczsKKyAgdW5zaWduZWQgbG9uZyBpbnQgZnM7CisgIHVuc2lnbmVkIGxvbmcgaW50IGdzOworfTsKKworc3RydWN0IHVzZXIKK3sKKyAgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QJcmVnczsKKyAgaW50CQkJCXVfZnB2YWxpZDsKKyAgc3RydWN0IHVzZXJfZnByZWdzX3N0cnVjdAlpMzg3OworICB1bnNpZ25lZCBsb25nIGludAkJdV90c2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCXVfZHNpemU7CisgIHVuc2lnbmVkIGxvbmcgaW50CQl1X3NzaXplOworICB1bnNpZ25lZCBsb25nIGludAkJc3RhcnRfY29kZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCXN0YXJ0X3N0YWNrOworICBsb25nIGludAkJCXNpZ25hbDsKKyAgaW50CQkJCXJlc2VydmVkOworICBzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCoJdV9hcjA7CisgIHN0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QqCXVfZnBzdGF0ZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCW1hZ2ljOworICBjaGFyCQkJCXVfY29tbSBbMzJdOworICB1bnNpZ25lZCBsb25nIGludAkJdV9kZWJ1Z3JlZyBbOF07Cit9OworCisjZWxzZQorLyogVGhlc2UgYXJlIHRoZSAzMi1iaXQgeDg2IHN0cnVjdHVyZXMuICAqLworc3RydWN0IHVzZXJfZnByZWdzX3N0cnVjdAoreworICBsb25nIGludCBjd2Q7CisgIGxvbmcgaW50IHN3ZDsKKyAgbG9uZyBpbnQgdHdkOworICBsb25nIGludCBmaXA7CisgIGxvbmcgaW50IGZjczsKKyAgbG9uZyBpbnQgZm9vOworICBsb25nIGludCBmb3M7CisgIGxvbmcgaW50IHN0X3NwYWNlIFsyMF07Cit9OworCitzdHJ1Y3QgdXNlcl9mcHhyZWdzX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCBpbnQgY3dkOworICB1bnNpZ25lZCBzaG9ydCBpbnQgc3dkOworICB1bnNpZ25lZCBzaG9ydCBpbnQgdHdkOworICB1bnNpZ25lZCBzaG9ydCBpbnQgZm9wOworICBsb25nIGludCBmaXA7CisgIGxvbmcgaW50IGZjczsKKyAgbG9uZyBpbnQgZm9vOworICBsb25nIGludCBmb3M7CisgIGxvbmcgaW50IG14Y3NyOworICBsb25nIGludCByZXNlcnZlZDsKKyAgbG9uZyBpbnQgc3Rfc3BhY2VbMzJdOyAgIC8qIDgqMTYgYnl0ZXMgZm9yIGVhY2ggRlAtcmVnID0gMTI4IGJ5dGVzICovCisgIGxvbmcgaW50IHhtbV9zcGFjZVszMl07ICAvKiA4KjE2IGJ5dGVzIGZvciBlYWNoIFhNTS1yZWcgPSAxMjggYnl0ZXMgKi8KKyAgbG9uZyBpbnQgcGFkZGluZ1s1Nl07Cit9OworCitzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdAoreworICBsb25nIGludCBlYng7CisgIGxvbmcgaW50IGVjeDsKKyAgbG9uZyBpbnQgZWR4OworICBsb25nIGludCBlc2k7CisgIGxvbmcgaW50IGVkaTsKKyAgbG9uZyBpbnQgZWJwOworICBsb25nIGludCBlYXg7CisgIGxvbmcgaW50IHhkczsKKyAgbG9uZyBpbnQgeGVzOworICBsb25nIGludCB4ZnM7CisgIGxvbmcgaW50IHhnczsKKyAgbG9uZyBpbnQgb3JpZ19lYXg7CisgIGxvbmcgaW50IGVpcDsKKyAgbG9uZyBpbnQgeGNzOworICBsb25nIGludCBlZmxhZ3M7CisgIGxvbmcgaW50IGVzcDsKKyAgbG9uZyBpbnQgeHNzOworfTsKKworc3RydWN0IHVzZXIKK3sKKyAgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QJcmVnczsKKyAgaW50CQkJCXVfZnB2YWxpZDsKKyAgc3RydWN0IHVzZXJfZnByZWdzX3N0cnVjdAlpMzg3OworICB1bnNpZ25lZCBsb25nIGludAkJdV90c2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCXVfZHNpemU7CisgIHVuc2lnbmVkIGxvbmcgaW50CQl1X3NzaXplOworICB1bnNpZ25lZCBsb25nIGludAkJc3RhcnRfY29kZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCXN0YXJ0X3N0YWNrOworICBsb25nIGludAkJCXNpZ25hbDsKKyAgaW50CQkJCXJlc2VydmVkOworICBzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCoJdV9hcjA7CisgIHN0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QqCXVfZnBzdGF0ZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCW1hZ2ljOworICBjaGFyCQkJCXVfY29tbSBbMzJdOworICBpbnQJCQkJdV9kZWJ1Z3JlZyBbOF07Cit9OworI2VuZGlmICAvKiBfX1dPUkRTSVpFICovCisKKyNkZWZpbmUgUEFHRV9TSVpFCQkoc3lzY29uZihfU0NfUEFHRVNJWkUpKQorI2RlZmluZSBQQUdFX01BU0sJCSh+KFBBR0VfU0laRS0xKSkKKyNkZWZpbmUgTkJQRwkJCVBBR0VfU0laRQorI2RlZmluZSBVUEFHRVMJCQkxCisjZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSCSh1LnN0YXJ0X2NvZGUpCisjZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIJKHUuc3RhcnRfc3RhY2sgKyB1LnVfc3NpemUgKiBOQlBHKQorCisjZW5kaWYJLyogX1NZU19VU0VSX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdXN0YXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdXN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTljZGFjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91c3RhdC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIEhlYWRlciBkZXNjcmliaW5nIG9ic29sZXRlIGB1c3RhdCcgaW50ZXJmYWNlLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogVGhpcyBpbnRlcmZhY2UgaXMgb2Jzb2xldGUuICBVc2UgPHN5cy9zdGF0ZnMuaD4gaW5zdGVhZC4KKyAqLworCisjaWZuZGVmIF9TWVNfVVNUQVRfSAorI2RlZmluZQlfU1lTX1VTVEFUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMvdXN0YXQuaD4KKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IHVzdGF0IChfX2Rldl90IF9fZGV2LCBzdHJ1Y3QgdXN0YXQgKl9fdWJ1ZikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy91c3RhdC5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3V0c25hbWUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdXRzbmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwM2FhYjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3V0c25hbWUuaApAQCAtMCwwICsxLDg3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsOTQsOTYsOTcsOTksMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVBPU0lYIFN0YW5kYXJkOiA0LjQgU3lzdGVtIElkZW50aWZpY2F0aW9uCTxzeXMvdXRzbmFtZS5oPgorICovCisKKyNpZm5kZWYJX1NZU19VVFNOQU1FX0gKKyNkZWZpbmUJX1NZU19VVFNOQU1FX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Yml0cy91dHNuYW1lLmg+CisKKyNpZm5kZWYgX1VUU05BTUVfU1lTTkFNRV9MRU5HVEgKKyMgZGVmaW5lIF9VVFNOQU1FX1NZU05BTUVfTEVOR1RIIF9VVFNOQU1FX0xFTkdUSAorI2VuZGlmCisjaWZuZGVmIF9VVFNOQU1FX05PREVOQU1FX0xFTkdUSAorIyBkZWZpbmUgX1VUU05BTUVfTk9ERU5BTUVfTEVOR1RIIF9VVFNOQU1FX0xFTkdUSAorI2VuZGlmCisjaWZuZGVmIF9VVFNOQU1FX1JFTEVBU0VfTEVOR1RICisjIGRlZmluZSBfVVRTTkFNRV9SRUxFQVNFX0xFTkdUSCBfVVRTTkFNRV9MRU5HVEgKKyNlbmRpZgorI2lmbmRlZiBfVVRTTkFNRV9WRVJTSU9OX0xFTkdUSAorIyBkZWZpbmUgX1VUU05BTUVfVkVSU0lPTl9MRU5HVEggX1VUU05BTUVfTEVOR1RICisjZW5kaWYKKyNpZm5kZWYgX1VUU05BTUVfTUFDSElORV9MRU5HVEgKKyMgZGVmaW5lIF9VVFNOQU1FX01BQ0hJTkVfTEVOR1RIIF9VVFNOQU1FX0xFTkdUSAorI2VuZGlmCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBzeXN0ZW0gYW5kIG1hY2hpbmUuICAqLworc3RydWN0IHV0c25hbWUKKyAgeworICAgIC8qIE5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgKi8KKyAgICBjaGFyIHN5c25hbWVbX1VUU05BTUVfU1lTTkFNRV9MRU5HVEhdOworCisgICAgLyogTmFtZSBvZiB0aGlzIG5vZGUgb24gdGhlIG5ldHdvcmsuICAqLworICAgIGNoYXIgbm9kZW5hbWVbX1VUU05BTUVfTk9ERU5BTUVfTEVOR1RIXTsKKworICAgIC8qIEN1cnJlbnQgcmVsZWFzZSBsZXZlbCBvZiB0aGlzIGltcGxlbWVudGF0aW9uLiAgKi8KKyAgICBjaGFyIHJlbGVhc2VbX1VUU05BTUVfUkVMRUFTRV9MRU5HVEhdOworICAgIC8qIEN1cnJlbnQgdmVyc2lvbiBsZXZlbCBvZiB0aGlzIHJlbGVhc2UuICAqLworICAgIGNoYXIgdmVyc2lvbltfVVRTTkFNRV9WRVJTSU9OX0xFTkdUSF07CisKKyAgICAvKiBOYW1lIG9mIHRoZSBoYXJkd2FyZSB0eXBlIHRoZSBzeXN0ZW0gaXMgcnVubmluZyBvbi4gICovCisgICAgY2hhciBtYWNoaW5lW19VVFNOQU1FX01BQ0hJTkVfTEVOR1RIXTsKKworI2lmIF9VVFNOQU1FX0RPTUFJTl9MRU5HVEggLSAwCisgICAgLyogTmFtZSBvZiB0aGUgZG9tYWluIG9mIHRoaXMgbm9kZSBvbiB0aGUgbmV0d29yay4gICovCisjIGlmZGVmIF9fVVNFX0dOVQorICAgIGNoYXIgZG9tYWlubmFtZVtfVVRTTkFNRV9ET01BSU5fTEVOR1RIXTsKKyMgZWxzZQorICAgIGNoYXIgX19kb21haW5uYW1lW19VVFNOQU1FX0RPTUFJTl9MRU5HVEhdOworIyBlbmRpZgorI2VuZGlmCisgIH07CisKKyNpZmRlZiBfX1VTRV9TVklECisvKiBOb3RlIHRoYXQgU1ZJRCBhc3N1bWVzIGFsbCBtZW1iZXJzIGhhdmUgdGhlIHNhbWUgc2l6ZS4gICovCisjIGRlZmluZSBTWVNfTk1MTiAgX1VUU05BTUVfTEVOR1RICisjZW5kaWYKKworCisvKiBQdXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5c3RlbSBpbiBOQU1FLiAgKi8KK2V4dGVybiBpbnQgdW5hbWUgKHN0cnVjdCB1dHNuYW1lICpfX25hbWUpIF9fVEhST1c7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy91dHNuYW1lLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Zmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy92ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTIyZDMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy92ZnMuaApAQCAtMCwwICsxLDQgQEAKKy8qIE90aGVyIHN5c3RlbXMgZGVjbGFyZSBgc3RydWN0IHN0YXRmcycgZXQgYWwgaW4gPHN5cy92ZnMuaD4sCisgICBzbyB3ZSBoYXZlIHRoaXMgZmlsZSB0byBiZSBjb21wYXRpYmxlIHdpdGggcHJvZ3JhbXMgZXhwZWN0aW5nIGl0LiAgKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdmxpbWl0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3ZsaW1pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmN2EwOWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3ZsaW1pdC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1ZMSU1JVF9ICisjZGVmaW5lIF9TWVNfVkxJTUlUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUaGlzIGludGVyZmFjZSBpcyBvYnNvbGV0ZSwgYW5kIGlzIHN1cGVyc2VkZWQgYnkgPHN5cy9yZXNvdXJjZS5oPi4gICovCisKKy8qIEtpbmRzIG9mIHJlc291cmNlIGxpbWl0LiAgKi8KK2VudW0gX192bGltaXRfcmVzb3VyY2UKK3sKKyAgLyogU2V0dGluZyB0aGlzIG5vbi16ZXJvIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcmFpc2UgbGltaXRzLgorICAgICBPbmx5IHRoZSBzdXBlci11c2UgY2FuIHNldCBpdCB0byB6ZXJvLgorCisgICAgIFRoaXMgaXMgbm90IGltcGxlbWVudGVkIGluIHJlY2VudCB2ZXJzaW9ucyBvZiBCU0QsIG5vciBieQorICAgICB0aGUgR05VIEMgbGlicmFyeS4gICovCisgIExJTV9OT1JBSVNFLAorCisgIC8qIENQVSB0aW1lIGF2YWlsYWJsZSBmb3IgZWFjaCBwcm9jZXNzIChzZWNvbmRzKS4gICovCisgIExJTV9DUFUsCisKKyAgLyogTGFyZ2VzdCBmaWxlIHdoaWNoIGNhbiBiZSBjcmVhdGVkIChieXRlcykuICAqLworICBMSU1fRlNJWkUsCisKKyAgLyogTWF4aW11bSBzaXplIG9mIHRoZSBkYXRhIHNlZ21lbnQgKGJ5dGVzKS4gICovCisgIExJTV9EQVRBLAorCisgIC8qIE1heGltdW0gc2l6ZSBvZiB0aGUgc3RhY2sgc2VnbWVudCAoYnl0ZXMpLiAgKi8KKyAgTElNX1NUQUNLLAorCisgIC8qIExhcmdlc3QgY29yZSBmaWxlIHRoYXQgd2lsbCBiZSBjcmVhdGVkIChieXRlcykuICAqLworICBMSU1fQ09SRSwKKworICAvKiBSZXNpZGVudCBzZXQgc2l6ZSAoYnl0ZXMpLiAgKi8KKyAgTElNX01BWFJTUworfTsKKworLyogVGhpcyBtZWFucyBubyBsaW1pdC4gICovCisjZGVmaW5lIElORklOSVRZIDB4N2ZmZmZmZmYKKworCisvKiBTZXQgdGhlIHNvZnQgbGltaXQgZm9yIFJFU09VUkNFIHRvIGJlIFZBTFVFLgorICAgUmV0dXJucyAwIGZvciBzdWNjZXNzLCAtMSBmb3IgZmFpbHVyZS4gICovCitleHRlcm4gaW50IHZsaW1pdCAoZW51bSBfX3ZsaW1pdF9yZXNvdXJjZSBfX3Jlc291cmNlLCBpbnQgX192YWx1ZSkgX19USFJPVzsKKworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3ZsaW1pdC5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy92dC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy92dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNGFiZmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Z0LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGxpbnV4L3Z0Lmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Z0aW1lcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy92dGltZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdmM2E3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy92dGltZXMuaApAQCAtMCwwICsxLDY5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19WVElNRVNfSAorI2RlZmluZSBfU1lTX1ZUSU1FU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVGhpcyBpbnRlcmZhY2UgaXMgb2Jzb2xldGU7IHVzZSBgZ2V0cnVzYWdlJyBpbnN0ZWFkLiAgKi8KKworLyogR3JhbnVsYXJpdHkgb2YgdGhlIGB2bV91dGltZScgYW5kIGB2bV9zdGltZScgZmllbGRzIG9mIGEgYHN0cnVjdCB2dGltZXMnLgorICAgKFRoaXMgaXMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgbWFjaGluZSdzIHBvd2VyIHN1cHBseSwgaW4gSHouKSAgKi8KKyNkZWZpbmUJVlRJTUVTX1VOSVRTX1BFUl9TRUNPTkQJNjAKKworc3RydWN0IHZ0aW1lcworeworICAvKiBVc2VyIHRpbWUgdXNlZCBpbiB1bml0cyBvZiAxL1ZUSU1FU19VTklUU19QRVJfU0VDT05EIHNlY29uZHMuICAqLworICBpbnQgdm1fdXRpbWU7CisgIC8qIFN5c3RlbSB0aW1lIHVzZWQgaW4gdW5pdHMgb2YgMS9WVElNRVNfVU5JVFNfUEVSX1NFQ09ORCBzZWNvbmRzLiAgKi8KKyAgaW50IHZtX3N0aW1lOworCisgIC8qIEFtb3VudCBvZiBkYXRhIGFuZCBzdGFjayBtZW1vcnkgdXNlZCAoa2lsb2J5dGUtc2Vjb25kcykuICAqLworICB1bnNpZ25lZCBpbnQgdm1faWRzcnNzOworICAvKiBBbW91bnQgb2YgdGV4dCBtZW1vcnkgdXNlZCAoa2lsb2J5dGUtc2Vjb25kcykuICAqLworICB1bnNpZ25lZCBpbnQgdm1faXhyc3M7CisgIC8qIE1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgKHRleHQsIGRhdGEsIGFuZCBzdGFjaykgKGtpbG9ieXRlcykuICAqLworICBpbnQgdm1fbWF4cnNzOworCisgIC8qIE51bWJlciBvZiBoYXJkIHBhZ2UgZmF1bHRzIChpLmUuIHRob3NlIHRoYXQgcmVxdWlyZWQgSS9PKS4gICovCisgIGludCB2bV9tYWpmbHQ7CisgIC8qIE51bWJlciBvZiBzb2Z0IHBhZ2UgZmF1bHRzIChpLmUuIHRob3NlIHNlcnZpY2VkIGJ5IHJlY2xhaW1pbmcKKyAgICAgYSBwYWdlIGZyb20gdGhlIGxpc3Qgb2YgcGFnZXMgYXdhaXRpbmcgcmVhbGxvY2F0aW9uLiAgKi8KKyAgaW50IHZtX21pbmZsdDsKKworICAvKiBOdW1iZXIgb2YgdGltZXMgYSBwcm9jZXNzIHdhcyBzd2FwcGVkIG91dCBvZiBwaHlzaWNhbCBtZW1vcnkuICAqLworICBpbnQgdm1fbnN3YXA7CisKKyAgLyogTnVtYmVyIG9mIGlucHV0IG9wZXJhdGlvbnMgdmlhIHRoZSBmaWxlIHN5c3RlbS4gIE5vdGU6IFRoaXMKKyAgICAgYW5kIGBydV9vdWJsb2NrJyBkbyBub3QgaW5jbHVkZSBvcGVyYXRpb25zIHdpdGggdGhlIGNhY2hlLiAgKi8KKyAgaW50IHZtX2luYmxrOworICAvKiBOdW1iZXIgb2Ygb3V0cHV0IG9wZXJhdGlvbnMgdmlhIHRoZSBmaWxlIHN5c3RlbS4gICovCisgIGludCB2bV9vdWJsazsKK307CisKKy8qIElmIENVUlJFTlQgaXMgbm90IE5VTEwsIHdyaXRlIHN0YXRpc3RpY3MgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3MgaW50bworICAgKkNVUlJFTlQuICBJZiBDSElMRCBpcyBub3QgTlVMTCwgd3JpdGUgc3RhdGlzdGljcyBmb3IgYWxsIHRlcm1pbmF0ZWQgY2hpbGQKKyAgIHByb2Nlc3NlcyBpbnRvICpDSElMRC4gIFJldHVybnMgMCBmb3Igc3VjY2VzcywgLTEgZm9yIGZhaWx1cmUuICAqLworZXh0ZXJuIGludCB2dGltZXMgKHN0cnVjdCB2dGltZXMgKiBfX2N1cnJlbnQsIHN0cnVjdCB2dGltZXMgKiBfX2NoaWxkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3Z0aW1lcy5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy93YWl0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3dhaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZkNThmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy93YWl0LmgKQEAgLTAsMCArMSwxODIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTk0LDE5OTYtMjAwMSwyMDAzLDIwMDQsMjAwNSwyMDA3LDIwMDksMjAxMCwyMDExCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVBPU0lYIFN0YW5kYXJkOiAzLjIuMSBXYWl0IGZvciBQcm9jZXNzIFRlcm1pbmF0aW9uCTxzeXMvd2FpdC5oPgorICovCisKKyNpZm5kZWYJX1NZU19XQUlUX0gKKyNkZWZpbmUJX1NZU19XQUlUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKy8qIFRoZXNlIG1hY3JvcyBjb3VsZCBhbHNvIGJlIGRlZmluZWQgaW4gPHN0ZGxpYi5oPi4gICovCisjaWYgIWRlZmluZWQgX1NURExJQl9IIHx8ICghZGVmaW5lZCBfX1VTRV9YT1BFTiAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLOCkKKy8qIFRoaXMgd2lsbCBkZWZpbmUgdGhlIGBXKicgbWFjcm9zIGZvciB0aGUgZmxhZworICAgYml0cyB0byBgd2FpdHBpZCcsIGB3YWl0MycsIGFuZCBgd2FpdDQnLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy93YWl0ZmxhZ3MuaD4KKworIyBpZmRlZglfX1VTRV9CU0QKKworLyogTG90cyBvZiBoYWlyIHRvIGFsbG93IHRyYWRpdGlvbmFsIEJTRCB1c2Ugb2YgYHVuaW9uIHdhaXQnCisgICBhcyB3ZWxsIGFzIFBPU0lYLjEgdXNlIG9mIGBpbnQnIGZvciB0aGUgc3RhdHVzIHdvcmQuICAqLworCisjICBpZiBkZWZpbmVkIF9fR05VQ19fICYmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjICAgZGVmaW5lIF9fV0FJVF9JTlQoc3RhdHVzKSBcCisgIChfX2V4dGVuc2lvbl9fICgoKHVuaW9uIHsgX190eXBlb2Yoc3RhdHVzKSBfX2luOyBpbnQgX19pOyB9KSBcCisJCSAgIHsgLl9faW4gPSAoc3RhdHVzKSB9KS5fX2kpKQorIyAgZWxzZQorIyAgIGRlZmluZSBfX1dBSVRfSU5UKHN0YXR1cykJKCooX19jb25zdCBpbnQgKikgJihzdGF0dXMpKQorIyAgZW5kaWYKKworLyogVGhpcyBpcyB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQgdG8gYHdhaXQnLiAgVGhlIGZ1bmt5IHVuaW9uCisgICBjYXVzZXMgcmVkZWNsYXJhdGlvbnMgd2l0aCBlaXRoZXIgYGludCAqJyBvciBgdW5pb24gd2FpdCAqJyB0byBiZQorICAgYWxsb3dlZCB3aXRob3V0IGNvbXBsYWludC4gIF9fV0FJVF9TVEFUVVNfREVGTiBpcyB0aGUgdHlwZSB1c2VkIGluCisgICB0aGUgYWN0dWFsIGZ1bmN0aW9uIGRlZmluaXRpb25zLiAgKi8KKworIyAgaWYgIWRlZmluZWQgX19HTlVDX18gfHwgX19HTlVDX18gPCAyIHx8IGRlZmluZWQgX19jcGx1c3BsdXMKKyMgICBkZWZpbmUgX19XQUlUX1NUQVRVUwl2b2lkICoKKyMgICBkZWZpbmUgX19XQUlUX1NUQVRVU19ERUZOCXZvaWQgKgorIyAgZWxzZQorLyogVGhpcyB3b3JrcyBpbiBHQ0MgMi42LjEgYW5kIGxhdGVyLiAgKi8KK3R5cGVkZWYgdW5pb24KKyAgeworICAgIHVuaW9uIHdhaXQgKl9fdXB0cjsKKyAgICBpbnQgKl9faXB0cjsKKyAgfSBfX1dBSVRfU1RBVFVTIF9fYXR0cmlidXRlX18gKChfX3RyYW5zcGFyZW50X3VuaW9uX18pKTsKKyMgICBkZWZpbmUgX19XQUlUX1NUQVRVU19ERUZOCWludCAqCisjICBlbmRpZgorCisjIGVsc2UgLyogRG9uJ3QgdXNlIEJTRC4gICovCisKKyMgIGRlZmluZSBfX1dBSVRfSU5UKHN0YXR1cykJKHN0YXR1cykKKyMgIGRlZmluZSBfX1dBSVRfU1RBVFVTCQlpbnQgKgorIyAgZGVmaW5lIF9fV0FJVF9TVEFUVVNfREVGTglpbnQgKgorCisjIGVuZGlmIC8qIFVzZSBCU0QuICAqLworCisvKiBUaGlzIHdpbGwgZGVmaW5lIGFsbCB0aGUgYF9fVyonIG1hY3Jvcy4gICovCisjIGluY2x1ZGUgPGJpdHMvd2FpdHN0YXR1cy5oPgorCisjIGRlZmluZSBXRVhJVFNUQVRVUyhzdGF0dXMpCV9fV0VYSVRTVEFUVVMgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXVEVSTVNJRyhzdGF0dXMpCV9fV1RFUk1TSUcgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXU1RPUFNJRyhzdGF0dXMpCV9fV1NUT1BTSUcgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXSUZFWElURUQoc3RhdHVzKQlfX1dJRkVYSVRFRCAoX19XQUlUX0lOVCAoc3RhdHVzKSkKKyMgZGVmaW5lIFdJRlNJR05BTEVEKHN0YXR1cykJX19XSUZTSUdOQUxFRCAoX19XQUlUX0lOVCAoc3RhdHVzKSkKKyMgZGVmaW5lIFdJRlNUT1BQRUQoc3RhdHVzKQlfX1dJRlNUT1BQRUQgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGlmZGVmIF9fV0lGQ09OVElOVUVECisjICBkZWZpbmUgV0lGQ09OVElOVUVEKHN0YXR1cykJX19XSUZDT05USU5VRUQgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGVuZGlmCisjZW5kaWYJLyogPHN0ZGxpYi5oPiBub3QgaW5jbHVkZWQuICAqLworCisjaWZkZWYJX19VU0VfQlNECisjIGRlZmluZSBXQ09SRUZMQUcJCV9fV0NPUkVGTEFHCisjIGRlZmluZSBXQ09SRURVTVAoc3RhdHVzKQlfX1dDT1JFRFVNUCAoX19XQUlUX0lOVCAoc3RhdHVzKSkKKyMgZGVmaW5lIFdfRVhJVENPREUocmV0LCBzaWcpCV9fV19FWElUQ09ERSAocmV0LCBzaWcpCisjIGRlZmluZSBXX1NUT1BDT0RFKHNpZykJX19XX1NUT1BDT0RFIChzaWcpCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgYnkgdGhlIGB3YWl0aWQnIGZ1bmN0aW9uLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4Cit0eXBlZGVmIGVudW0KK3sKKyAgUF9BTEwsCQkvKiBXYWl0IGZvciBhbnkgY2hpbGQuICAqLworICBQX1BJRCwJCS8qIFdhaXQgZm9yIHNwZWNpZmllZCBwcm9jZXNzLiAgKi8KKyAgUF9QR0lECQkvKiBXYWl0IGZvciBtZW1iZXJzIG9mIHByb2Nlc3MgZ3JvdXAuICAqLworfSBpZHR5cGVfdDsKKyNlbmRpZgorCisKKy8qIFdhaXQgZm9yIGEgY2hpbGQgdG8gZGllLiAgV2hlbiBvbmUgZG9lcywgcHV0IGl0cyBzdGF0dXMgaW4gKlNUQVRfTE9DCisgICBhbmQgcmV0dXJuIGl0cyBwcm9jZXNzIElELiAgRm9yIGVycm9ycywgcmV0dXJuIChwaWRfdCkgLTEuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIF9fcGlkX3Qgd2FpdCAoX19XQUlUX1NUQVRVUyBfX3N0YXRfbG9jKTsKKworI2lmZGVmCV9fVVNFX0JTRAorLyogU3BlY2lhbCB2YWx1ZXMgZm9yIHRoZSBQSUQgYXJndW1lbnQgdG8gYHdhaXRwaWQnIGFuZCBgd2FpdDQnLiAgKi8KKyMgZGVmaW5lIFdBSVRfQU5ZCSgtMSkJLyogQW55IHByb2Nlc3MuICAqLworIyBkZWZpbmUgV0FJVF9NWVBHUlAJMAkvKiBBbnkgcHJvY2VzcyBpbiBteSBwcm9jZXNzIGdyb3VwLiAgKi8KKyNlbmRpZgorCisvKiBXYWl0IGZvciBhIGNoaWxkIG1hdGNoaW5nIFBJRCB0byBkaWUuCisgICBJZiBQSUQgaXMgZ3JlYXRlciB0aGFuIDAsIG1hdGNoIGFueSBwcm9jZXNzIHdob3NlIHByb2Nlc3MgSUQgaXMgUElELgorICAgSWYgUElEIGlzIChwaWRfdCkgLTEsIG1hdGNoIGFueSBwcm9jZXNzLgorICAgSWYgUElEIGlzIChwaWRfdCkgMCwgbWF0Y2ggYW55IHByb2Nlc3Mgd2l0aCB0aGUKKyAgIHNhbWUgcHJvY2VzcyBncm91cCBhcyB0aGUgY3VycmVudCBwcm9jZXNzLgorICAgSWYgUElEIGlzIGxlc3MgdGhhbiAtMSwgbWF0Y2ggYW55IHByb2Nlc3Mgd2hvc2UKKyAgIHByb2Nlc3MgZ3JvdXAgaXMgdGhlIGFic29sdXRlIHZhbHVlIG9mIFBJRC4KKyAgIElmIHRoZSBXTk9IQU5HIGJpdCBpcyBzZXQgaW4gT1BUSU9OUywgYW5kIHRoYXQgY2hpbGQKKyAgIGlzIG5vdCBhbHJlYWR5IGRlYWQsIHJldHVybiAocGlkX3QpIDAuICBJZiBzdWNjZXNzZnVsLAorICAgcmV0dXJuIFBJRCBhbmQgc3RvcmUgdGhlIGRlYWQgY2hpbGQncyBzdGF0dXMgaW4gU1RBVF9MT0MuCisgICBSZXR1cm4gKHBpZF90KSAtMSBmb3IgZXJyb3JzLiAgSWYgdGhlIFdVTlRSQUNFRCBiaXQgaXMKKyAgIHNldCBpbiBPUFRJT05TLCByZXR1cm4gc3RhdHVzIGZvciBzdG9wcGVkIGNoaWxkcmVuOyBvdGhlcndpc2UgZG9uJ3QuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIF9fcGlkX3Qgd2FpdHBpZCAoX19waWRfdCBfX3BpZCwgaW50ICpfX3N0YXRfbG9jLCBpbnQgX19vcHRpb25zKTsKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKyMgZGVmaW5lIF9fbmVlZF9zaWdpbmZvX3QKKyMgaW5jbHVkZSA8Yml0cy9zaWdpbmZvLmg+CisvKiBXYWl0IGZvciBhIGNoaWxkaW5nIG1hdGNoaW5nIElEVFlQRSBhbmQgSUQgdG8gY2hhbmdlIHRoZSBzdGF0dXMgYW5kCisgICBwbGFjZSBhcHByb3ByaWF0ZSBpbmZvcm1hdGlvbiBpbiAqSU5GT1AuCisgICBJZiBJRFRZUEUgaXMgUF9QSUQsIG1hdGNoIGFueSBwcm9jZXNzIHdob3NlIHByb2Nlc3MgSUQgaXMgSUQuCisgICBJZiBJRFRZUEUgaXMgUF9QR0lELCBtYXRjaCBhbnkgcHJvY2VzcyB3aG9zZSBwcm9jZXNzIGdyb3VwIGlzIElELgorICAgSWYgSURUWVBFIGlzIFBfQUxMLCBtYXRjaCBhbnkgcHJvY2Vzcy4KKyAgIElmIHRoZSBXTk9IQU5HIGJpdCBpcyBzZXQgaW4gT1BUSU9OUywgYW5kIHRoYXQgY2hpbGQKKyAgIGlzIG5vdCBhbHJlYWR5IGRlYWQsIGNsZWFyICpJTkZPUCBhbmQgcmV0dXJuIDAuICBJZiBzdWNjZXNzZnVsLCBzdG9yZQorICAgZXhpdCBjb2RlIGFuZCBzdGF0dXMgaW4gKklORk9QLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgd2FpdGlkIChpZHR5cGVfdCBfX2lkdHlwZSwgX19pZF90IF9faWQsIHNpZ2luZm9fdCAqX19pbmZvcCwKKwkJICAgaW50IF9fb3B0aW9ucyk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFRoaXMgYmVpbmcgaGVyZSBtYWtlcyB0aGUgcHJvdG90eXBlcyB2YWxpZCB3aGV0aGVyIG9yIG5vdAorICAgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIDxzeXMvcmVzb3VyY2UuaD4gdG8gZGVmaW5lIGBzdHJ1Y3QgcnVzYWdlJy4gICovCitzdHJ1Y3QgcnVzYWdlOworCisvKiBXYWl0IGZvciBhIGNoaWxkIHRvIGV4aXQuICBXaGVuIG9uZSBkb2VzLCBwdXQgaXRzIHN0YXR1cyBpbiAqU1RBVF9MT0MgYW5kCisgICByZXR1cm4gaXRzIHByb2Nlc3MgSUQuICBGb3IgZXJyb3JzIHJldHVybiAocGlkX3QpIC0xLiAgSWYgVVNBR0UgaXMgbm90CisgICBuaWwsIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGlsZCdzIHJlc291cmNlIHVzYWdlIHRoZXJlLiAgSWYgdGhlCisgICBXVU5UUkFDRUQgYml0IGlzIHNldCBpbiBPUFRJT05TLCByZXR1cm4gc3RhdHVzIGZvciBzdG9wcGVkIGNoaWxkcmVuOworICAgb3RoZXJ3aXNlIGRvbid0LiAgKi8KK2V4dGVybiBfX3BpZF90IHdhaXQzIChfX1dBSVRfU1RBVFVTIF9fc3RhdF9sb2MsIGludCBfX29wdGlvbnMsCisJCSAgICAgIHN0cnVjdCBydXNhZ2UgKiBfX3VzYWdlKSBfX1RIUk9XTkw7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0JTRAorLyogUElEIGlzIGxpa2Ugd2FpdHBpZC4gIE90aGVyIGFyZ3MgYXJlIGxpa2Ugd2FpdDMuICAqLworZXh0ZXJuIF9fcGlkX3Qgd2FpdDQgKF9fcGlkX3QgX19waWQsIF9fV0FJVF9TVEFUVVMgX19zdGF0X2xvYywgaW50IF9fb3B0aW9ucywKKwkJICAgICAgc3RydWN0IHJ1c2FnZSAqX191c2FnZSkgX19USFJPV05MOworI2VuZGlmIC8qIFVzZSBCU0QuICAqLworCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvd2FpdC5oICAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy94YXR0ci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy94YXR0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MzdmOTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3hhdHRyLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1hBVFRSX0gKKyNkZWZpbmUgX1NZU19YQVRUUl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGZpZnRoIHBhcmFtZXRlciBvZgorICAgYCpzZXR4YXR0cicuICAqLworZW51bQoreworICBYQVRUUl9DUkVBVEUgPSAxLAkvKiBzZXQgdmFsdWUsIGZhaWwgaWYgYXR0ciBhbHJlYWR5IGV4aXN0cy4gICovCisjZGVmaW5lIFhBVFRSX0NSRUFURQlYQVRUUl9DUkVBVEUKKyAgWEFUVFJfUkVQTEFDRSA9IDIJLyogc2V0IHZhbHVlLCBmYWlsIGlmIGF0dHIgZG9lcyBub3QgZXhpc3QuICAqLworI2RlZmluZSBYQVRUUl9SRVBMQUNFCVhBVFRSX1JFUExBQ0UKK307CisKKy8qIFNldCB0aGUgYXR0cmlidXRlIE5BTUUgb2YgdGhlIGZpbGUgcG9pbnRlZCB0byBieSBQQVRIIHRvIFZBTFVFICh3aGljaAorICAgaXMgU0laRSBieXRlcyBsb25nKS4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzZXR4YXR0ciAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fY29uc3QgY2hhciAqX19uYW1lLAorCQkgICAgIF9fY29uc3Qgdm9pZCAqX192YWx1ZSwgc2l6ZV90IF9fc2l6ZSwgaW50IF9fZmxhZ3MpCisJX19USFJPVzsKKworLyogU2V0IHRoZSBhdHRyaWJ1dGUgTkFNRSBvZiB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IFBBVEggdG8gVkFMVUUgKHdoaWNoIGlzCisgICBTSVpFIGJ5dGVzIGxvbmcpLCBub3QgZm9sbG93aW5nIHN5bWxpbmtzIGZvciB0aGUgbGFzdCBwYXRobmFtZSBjb21wb25lbnQuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgbHNldHhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19jb25zdCBjaGFyICpfX25hbWUsCisJCSAgICAgIF9fY29uc3Qgdm9pZCAqX192YWx1ZSwgc2l6ZV90IF9fc2l6ZSwgaW50IF9fZmxhZ3MpCisJX19USFJPVzsKKworLyogU2V0IHRoZSBhdHRyaWJ1dGUgTkFNRSBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yIEZEIHRvIFZBTFVFICh3aGljaCBpcyBTSVpFCisgICBieXRlcyBsb25nKS4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBmc2V0eGF0dHIgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSwgX19jb25zdCB2b2lkICpfX3ZhbHVlLAorCQkgICAgICBzaXplX3QgX19zaXplLCBpbnQgX19mbGFncykgX19USFJPVzsKKworLyogR2V0IHRoZSBhdHRyaWJ1dGUgTkFNRSBvZiB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IFBBVEggdG8gVkFMVUUgKHdoaWNoIGlzCisgICBTSVpFIGJ5dGVzIGxvbmcpLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gc3NpemVfdCBnZXR4YXR0ciAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fY29uc3QgY2hhciAqX19uYW1lLAorCQkJIHZvaWQgKl9fdmFsdWUsIHNpemVfdCBfX3NpemUpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgYXR0cmlidXRlIE5BTUUgb2YgdGhlIGZpbGUgcG9pbnRlZCB0byBieSBQQVRIIHRvIFZBTFVFICh3aGljaCBpcworICAgU0laRSBieXRlcyBsb25nKSwgbm90IGZvbGxvd2luZyBzeW1saW5rcyBmb3IgdGhlIGxhc3QgcGF0aG5hbWUgY29tcG9uZW50LgorICAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gc3NpemVfdCBsZ2V0eGF0dHIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSwKKwkJCSAgdm9pZCAqX192YWx1ZSwgc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKKworLyogR2V0IHRoZSBhdHRyaWJ1dGUgTkFNRSBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yIEZEIHRvIFZBTFVFICh3aGljaCBpcyBTSVpFCisgICBieXRlcyBsb25nKS4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIHNzaXplX3QgZmdldHhhdHRyIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX25hbWUsIHZvaWQgKl9fdmFsdWUsCisJCQkgIHNpemVfdCBfX3NpemUpIF9fVEhST1c7CisKKy8qIExpc3QgYXR0cmlidXRlcyBvZiB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IFBBVEggaW50byB0aGUgdXNlci1zdXBwbGllZAorICAgYnVmZmVyIExJU1QgKHdoaWNoIGlzIFNJWkUgYnl0ZXMgYmlnKS4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvcgorICAgZXJyb3JzLiAgKi8KK2V4dGVybiBzc2l6ZV90IGxpc3R4YXR0ciAoX19jb25zdCBjaGFyICpfX3BhdGgsIGNoYXIgKl9fbGlzdCwgc2l6ZV90IF9fc2l6ZSkKKwlfX1RIUk9XOworCisvKiBMaXN0IGF0dHJpYnV0ZXMgb2YgdGhlIGZpbGUgcG9pbnRlZCB0byBieSBQQVRIIGludG8gdGhlIHVzZXItc3VwcGxpZWQKKyAgIGJ1ZmZlciBMSVNUICh3aGljaCBpcyBTSVpFIGJ5dGVzIGJpZyksIG5vdCBmb2xsb3dpbmcgc3ltbGlua3MgZm9yIHRoZQorICAgbGFzdCBwYXRobmFtZSBjb21wb25lbnQuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBzc2l6ZV90IGxsaXN0eGF0dHIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBjaGFyICpfX2xpc3QsIHNpemVfdCBfX3NpemUpCisJX19USFJPVzsKKworLyogTGlzdCBhdHRyaWJ1dGVzIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgRkQgaW50byB0aGUgdXNlci1zdXBwbGllZCBidWZmZXIKKyAgIExJU1QgKHdoaWNoIGlzIFNJWkUgYnl0ZXMgYmlnKS4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIHNzaXplX3QgZmxpc3R4YXR0ciAoaW50IF9fZmQsIGNoYXIgKl9fbGlzdCwgc2l6ZV90IF9fc2l6ZSkKKwlfX1RIUk9XOworCisvKiBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBOQU1FIGZyb20gdGhlIGZpbGUgcG9pbnRlZCB0byBieSBQQVRILiAgUmV0dXJuIDAKKyAgIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCByZW1vdmV4YXR0ciAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XOworCisvKiBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBOQU1FIGZyb20gdGhlIGZpbGUgcG9pbnRlZCB0byBieSBQQVRILCBub3QKKyAgIGZvbGxvd2luZyBzeW1saW5rcyBmb3IgdGhlIGxhc3QgcGF0aG5hbWUgY29tcG9uZW50LiAgUmV0dXJuIDAgb24KKyAgIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBscmVtb3ZleGF0dHIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKKworLyogUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgTkFNRSBmcm9tIHRoZSBmaWxlIGRlc2NyaXB0b3IgRkQuICBSZXR1cm4gMCBvbgorICAgc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IGZyZW1vdmV4YXR0ciAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3hhdHRyLmggICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi9iaWdyZXEuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveGNiL2JpZ3JlcS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNTlkMDMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi9iaWdyZXEuaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGJpZ3JlcS54bWwgYnkgY19jbGllbnQucHkuCisgKiBFZGl0IGF0IHlvdXIgcGVyaWwuCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgWENCX0JpZ1JlcXVlc3RzX0FQSSBYQ0IgQmlnUmVxdWVzdHMgQVBJCisgKiBAYnJpZWYgQmlnUmVxdWVzdHMgWENCIFByb3RvY29sIEltcGxlbWVudGF0aW9uLgorICogQHsKKyAqKi8KKworI2lmbmRlZiBfX0JJR1JFUV9ICisjZGVmaW5lIF9fQklHUkVRX0gKKworI2luY2x1ZGUgInhjYi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgWENCX0JJR1JFUVVFU1RTX01BSk9SX1ZFUlNJT04gMAorI2RlZmluZSBYQ0JfQklHUkVRVUVTVFNfTUlOT1JfVkVSU0lPTiAwCisgIAorZXh0ZXJuIHhjYl9leHRlbnNpb25fdCB4Y2JfYmlnX3JlcXVlc3RzX2lkOworCisvKioKKyAqIEBicmllZiB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlLiAqLworI2RlZmluZSBYQ0JfQklHX1JFUVVFU1RTX0VOQUJMRSAwCisKKy8qKgorICogQGJyaWVmIHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgbWlub3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQzMl90IG1heGltdW1fcmVxdWVzdF9sZW5ndGg7IC8qKjwgICovCit9IHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX3JlcGx5X3Q7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV9jb29raWVfdCB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfY29va2llX3QKK3hjYl9iaWdfcmVxdWVzdHNfZW5hYmxlICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX2Nvb2tpZV90IHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfY29va2llX3QKK3hjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV9yZXBseV90ICogeGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV9yZXBseV90ICoKK3hjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKworLyoqCisgKiBAfQorICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi94Y19taXNjLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi94Y19taXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3MzE5YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveGNiL3hjX21pc2MuaApAQCAtMCwwICsxLDQxMyBAQAorLyoKKyAqIFRoaXMgZmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHhjX21pc2MueG1sIGJ5IGNfY2xpZW50LnB5LgorICogRWRpdCBhdCB5b3VyIHBlcmlsLgorICovCisKKy8qKgorICogQGRlZmdyb3VwIFhDQl9YQ01pc2NfQVBJIFhDQiBYQ01pc2MgQVBJCisgKiBAYnJpZWYgWENNaXNjIFhDQiBQcm90b2NvbCBJbXBsZW1lbnRhdGlvbi4KKyAqIEB7CisgKiovCisKKyNpZm5kZWYgX19YQ19NSVNDX0gKKyNkZWZpbmUgX19YQ19NSVNDX0gKKworI2luY2x1ZGUgInhjYi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgWENCX1hDTUlTQ19NQUpPUl9WRVJTSU9OIDEKKyNkZWZpbmUgWENCX1hDTUlTQ19NSU5PUl9WRVJTSU9OIDEKKyAgCitleHRlcm4geGNiX2V4dGVuc2lvbl90IHhjYl94Y19taXNjX2lkOworCisvKioKKyAqIEBicmllZiB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl94Y19taXNjX2dldF92ZXJzaW9uLiAqLworI2RlZmluZSBYQ0JfWENfTUlTQ19HRVRfVkVSU0lPTiAwCisKKy8qKgorICogQGJyaWVmIHhjYl94Y19taXNjX2dldF92ZXJzaW9uX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgbWlub3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBjbGllbnRfbWFqb3JfdmVyc2lvbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBjbGllbnRfbWlub3JfdmVyc2lvbjsgLyoqPCAgKi8KK30geGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcnZlcl9tYWpvcl92ZXJzaW9uOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcnZlcl9taW5vcl92ZXJzaW9uOyAvKio8ICAqLworfSB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl9yZXBseV90OworCisvKioKKyAqIEBicmllZiB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl94Y19taXNjX2dldF94aWRfcmFuZ2UuICovCisjZGVmaW5lIFhDQl9YQ19NSVNDX0dFVF9YSURfUkFOR0UgMQorCisvKioKKyAqIEBicmllZiB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBtaW5vcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDMyX3Qgc3RhcnRfaWQ7IC8qKjwgICovCisgICAgdWludDMyX3QgY291bnQ7IC8qKjwgICovCit9IHhjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3QuICovCisjZGVmaW5lIFhDQl9YQ19NSVNDX0dFVF9YSURfTElTVCAyCisKKy8qKgorICogQGJyaWVmIHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBtaW5vcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQzMl90IGNvdW50OyAvKio8ICAqLworfSB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDMyX3QgaWRzX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQxWzIwXTsgLyoqPCAgKi8KK30geGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3JlcGx5X3Q7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl9jb29raWVfdCB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGNsaWVudF9tYWpvcl92ZXJzaW9uCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGNsaWVudF9taW5vcl92ZXJzaW9uCisgKiogQHJldHVybnMgeGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fY29va2llX3QKK3hjYl94Y19taXNjX2dldF92ZXJzaW9uICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGNsaWVudF9tYWpvcl92ZXJzaW9uICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGNsaWVudF9taW5vcl92ZXJzaW9uICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl94Y19taXNjX2dldF92ZXJzaW9uX2Nvb2tpZV90IHhjYl94Y19taXNjX2dldF92ZXJzaW9uX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGNsaWVudF9tYWpvcl92ZXJzaW9uCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGNsaWVudF9taW5vcl92ZXJzaW9uCisgKiogQHJldHVybnMgeGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fY29va2llX3QKK3hjYl94Y19taXNjX2dldF92ZXJzaW9uX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgY2xpZW50X21ham9yX3ZlcnNpb24gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGNsaWVudF9taW5vcl92ZXJzaW9uICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl94Y19taXNjX2dldF92ZXJzaW9uX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl94Y19taXNjX2dldF92ZXJzaW9uX3JlcGx5X3QgKiB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl94Y19taXNjX2dldF92ZXJzaW9uX3JlcGx5X3QgKgoreGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9jb29raWVfdCB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfY29va2llX3QKK3hjYl94Y19taXNjX2dldF94aWRfcmFuZ2UgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9jb29raWVfdCB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX2Nvb2tpZV90Cit4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfcmVwbHlfdCAqIHhjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfcmVwbHlfdCAqCit4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X2Nvb2tpZV90IHhjYl94Y19taXNjX2dldF94aWRfbGlzdAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGNvdW50CisgKiogQHJldHVybnMgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl94Y19taXNjX2dldF94aWRfbGlzdF9jb29raWVfdAoreGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBjb3VudCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfY29va2llX3QgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGNvdW50CisgKiogQHJldHVybnMgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl94Y19taXNjX2dldF94aWRfbGlzdF9jb29raWVfdAoreGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGNvdW50ICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHVpbnQzMl90ICogeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X2lkcworICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHVpbnQzMl90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordWludDMyX3QgKgoreGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X2lkcyAoY29uc3QgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9pZHNfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X2lkc19sZW5ndGggKGNvbnN0IHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X2lkc19lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl94Y19taXNjX2dldF94aWRfbGlzdF9pZHNfZW5kIChjb25zdCB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3JlcGx5X3QgKiB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3JlcGx5X3QgKgoreGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgorCisvKioKKyAqIEB9CisgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveGNiL3hjYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94Y2IveGNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmNjUwYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveGNiL3hjYi5oCkBAIC0wLDAgKzEsNTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgQmFydCBNYXNzZXksIEphbWV5IFNoYXJwLCBhbmQgSm9zaCBUcmlwbGV0dC4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG9yIHRoZWlyCisgKiBpbnN0aXR1dGlvbnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqIGF1dGhvcml6YXRpb24gZnJvbSB0aGUgYXV0aG9ycy4KKyAqLworCisjaWZuZGVmIF9fWENCX0hfXworI2RlZmluZSBfX1hDQl9IX18KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmIGRlZmluZWQoX19zb2xhcmlzX18pCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjZWxzZQorI2luY2x1ZGUgInhjYl93aW5kZWZzLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIEBmaWxlIHhjYi5oCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgWENCX0NvcmVfQVBJIFhDQiBDb3JlIEFQSQorICogQGJyaWVmIENvcmUgQVBJIG9mIHRoZSBYQ0IgbGlicmFyeS4KKyAqCisgKiBAeworICovCisKKy8qIFByZS1kZWZpbmVkIGNvbnN0YW50cyAqLworCisvKiogQ3VycmVudCBwcm90b2NvbCB2ZXJzaW9uICovCisjZGVmaW5lIFhfUFJPVE9DT0wgMTEKKworLyoqIEN1cnJlbnQgbWlub3IgdmVyc2lvbiAqLworI2RlZmluZSBYX1BST1RPQ09MX1JFVklTSU9OIDAKKworLyoqIFhfVENQX1BPUlQgKyBkaXNwbGF5IG51bWJlciA9IHNlcnZlciBwb3J0IGZvciBUQ1AgdHJhbnNwb3J0ICovCisjZGVmaW5lIFhfVENQX1BPUlQgNjAwMAorCisvKiogeGNiIGNvbm5lY3Rpb24gZXJyb3JzIGJlY2F1c2Ugb2Ygc29ja2V0LCBwaXBlIGFuZCBvdGhlciBzdHJlYW0gZXJyb3JzLiAqLworI2RlZmluZSBYQ0JfQ09OTl9FUlJPUiAxCisKKy8qKiB4Y2IgY29ubmVjdGlvbiBzaHV0ZG93biBiZWNhdXNlIG9mIGV4dGVuc2lvbiBub3Qgc3BwcG9ydGVkICovCisjZGVmaW5lIFhDQl9DT05OX0NMT1NFRF9FWFRfTk9UU1VQUE9SVEVEIDIKKworLyoqIG1hbGxvYygpLCBjYWxsb2MoKSBhbmQgcmVhbGxvYygpIGVycm9yIHVwb24gZmFpbHVyZSwgZm9yIGVnIEVOT01FTSAqLworI2RlZmluZSBYQ0JfQ09OTl9DTE9TRURfTUVNX0lOU1VGRklDSUVOVCAzCisKKy8qKiBDb25uZWN0aW9uIGNsb3NlZCwgZXhjZWVkaW5nIHJlcXVlc3QgbGVuZ3RoIHRoYXQgc2VydmVyIGFjY2VwdHMuICovCisjZGVmaW5lIFhDQl9DT05OX0NMT1NFRF9SRVFfTEVOX0VYQ0VFRCA0CisKKy8qKiBDb25uZWN0aW9uIGNsb3NlZCwgZXJyb3IgZHVyaW5nIHBhcnNpbmcgZGlzcGxheSBzdHJpbmcuICovCisjZGVmaW5lIFhDQl9DT05OX0NMT1NFRF9QQVJTRV9FUlIgNQorCisjZGVmaW5lIFhDQl9UWVBFX1BBRChULEkpICgtKEkpICYgKHNpemVvZihUKSA+IDQgPyAzIDogc2l6ZW9mKFQpIC0gMSkpCisKKy8qIE9wYXF1ZSBzdHJ1Y3R1cmVzICovCisKKy8qKgorICogQGJyaWVmIFhDQiBDb25uZWN0aW9uIHN0cnVjdHVyZS4KKyAqCisgKiBBIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW4gYWxsIGRhdGEgdGhhdCAgWENCIG5lZWRzIHRvIGNvbW11bmljYXRlIHdpdGggYW4gWCBzZXJ2ZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jb25uZWN0aW9uX3QgeGNiX2Nvbm5lY3Rpb25fdDsgIC8qKjwgT3BhcXVlIHN0cnVjdHVyZSBjb250YWluaW5nIGFsbCBkYXRhIHRoYXQgIFhDQiBuZWVkcyB0byBjb21tdW5pY2F0ZSB3aXRoIGFuIFggc2VydmVyLiAqLworCisKKy8qIE90aGVyIHR5cGVzICovCisKKy8qKgorICogQGJyaWVmIEdlbmVyaWMgaXRlcmF0b3IuCisgKgorICogQSBnZW5lcmljIGl0ZXJhdG9yIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHZvaWQgKmRhdGE7ICAgLyoqPCBEYXRhIG9mIHRoZSBjdXJyZW50IGl0ZXJhdG9yICovCisgICAgaW50IHJlbTsgICAgLyoqPCByZW1haW5pbmcgZWxlbWVudHMgKi8KKyAgICBpbnQgaW5kZXg7ICAvKio8IGluZGV4IG9mIHRoZSBjdXJyZW50IGl0ZXJhdG9yICovCit9IHhjYl9nZW5lcmljX2l0ZXJhdG9yX3Q7CisKKy8qKgorICogQGJyaWVmIEdlbmVyaWMgcmVwbHkuCisgKgorICogQSBnZW5lcmljIHJlcGx5IHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICByZXNwb25zZV90eXBlOyAgLyoqPCBUeXBlIG9mIHRoZSByZXNwb25zZSAqLworICAgIHVpbnQ4X3QgIHBhZDA7ICAgICAgICAgICAvKio8IFBhZGRpbmcgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgICAgICAgLyoqPCBTZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7ICAgICAgICAgLyoqPCBMZW5ndGggb2YgdGhlIHJlc3BvbnNlICovCit9IHhjYl9nZW5lcmljX3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIEdlbmVyaWMgZXZlbnQuCisgKgorICogQSBnZW5lcmljIGV2ZW50IHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICByZXNwb25zZV90eXBlOyAgLyoqPCBUeXBlIG9mIHRoZSByZXNwb25zZSAqLworICAgIHVpbnQ4X3QgIHBhZDA7ICAgICAgICAgICAvKio8IFBhZGRpbmcgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgICAgICAgLyoqPCBTZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB1aW50MzJfdCBwYWRbN107ICAgICAgICAgLyoqPCBQYWRkaW5nICovCisgICAgdWludDMyX3QgZnVsbF9zZXF1ZW5jZTsgIC8qKjwgZnVsbCBzZXF1ZW5jZSAqLworfSB4Y2JfZ2VuZXJpY19ldmVudF90OworCisvKioKKyAqIEBicmllZiBHRSBldmVudAorICoKKyAqIEFuIGV2ZW50IGFzIHNlbnQgYnkgdGhlIFhHRSBleHRlbnNpb24uIFRoZSBsZW5ndGggZmllbGQgc3BlY2lmaWVzIHRoZQorICogbnVtYmVyIG9mIDQtYnl0ZSBibG9ja3MgdHJhaWxpbmcgdGhlIHN0cnVjdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7ICAvKio8IFR5cGUgb2YgdGhlIHJlc3BvbnNlICovCisgICAgdWludDhfdCAgcGFkMDsgICAgICAgICAgIC8qKjwgUGFkZGluZyAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAgICAgICAvKio8IFNlcXVlbmNlIG51bWJlciAqLworICAgIHVpbnQzMl90IGxlbmd0aDsKKyAgICB1aW50MTZfdCBldmVudF90eXBlOworICAgIHVpbnQxNl90IHBhZDE7CisgICAgdWludDMyX3QgcGFkWzVdOyAgICAgICAgIC8qKjwgUGFkZGluZyAqLworICAgIHVpbnQzMl90IGZ1bGxfc2VxdWVuY2U7ICAvKio8IGZ1bGwgc2VxdWVuY2UgKi8KK30geGNiX2dlX2V2ZW50X3Q7CisKKy8qKgorICogQGJyaWVmIEdlbmVyaWMgZXJyb3IuCisgKgorICogQSBnZW5lcmljIGVycm9yIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICByZXNwb25zZV90eXBlOyAgLyoqPCBUeXBlIG9mIHRoZSByZXNwb25zZSAqLworICAgIHVpbnQ4X3QgICBlcnJvcl9jb2RlOyAgICAgLyoqPCBFcnJvciBjb2RlICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7ICAgICAgIC8qKjwgU2VxdWVuY2UgbnVtYmVyICovCisgICAgdWludDMyX3QgcmVzb3VyY2VfaWQ7ICAgICAvKiogPCBSZXNvdXJjZSBJRCBmb3IgcmVxdWVzdHMgd2l0aCBzaWRlIGVmZmVjdHMgb25seSAqLworICAgIHVpbnQxNl90IG1pbm9yX2NvZGU7ICAgICAgLyoqIDwgTWlub3Igb3Bjb2RlIG9mIHRoZSBmYWlsZWQgcmVxdWVzdCAqLworICAgIHVpbnQ4X3QgbWFqb3JfY29kZTsgICAgICAgLyoqIDwgTWFqb3Igb3Bjb2RlIG9mIHRoZSBmYWlsZWQgcmVxdWVzdCAqLworICAgIHVpbnQ4X3QgcGFkMDsKKyAgICB1aW50MzJfdCBwYWRbNV07ICAgICAgICAgLyoqPCBQYWRkaW5nICovCisgICAgdWludDMyX3QgZnVsbF9zZXF1ZW5jZTsgIC8qKjwgZnVsbCBzZXF1ZW5jZSAqLworfSB4Y2JfZ2VuZXJpY19lcnJvcl90OworCisvKioKKyAqIEBicmllZiBHZW5lcmljIGNvb2tpZS4KKyAqCisgKiBBIGdlbmVyaWMgY29va2llIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgIC8qKjwgU2VxdWVuY2UgbnVtYmVyICovCit9IHhjYl92b2lkX2Nvb2tpZV90OworCisKKy8qIEluY2x1ZGUgdGhlIGdlbmVyYXRlZCB4cHJvdG8gaGVhZGVyLiAqLworI2luY2x1ZGUgInhwcm90by5oIgorCisKKy8qKiBYQ0JfTk9ORSBpcyB0aGUgdW5pdmVyc2FsIG51bGwgcmVzb3VyY2Ugb3IgbnVsbCBhdG9tIHBhcmFtZXRlciB2YWx1ZSBmb3IgbWFueSBjb3JlIFggcmVxdWVzdHMgKi8KKyNkZWZpbmUgWENCX05PTkUgMEwKKworLyoqIFhDQl9DT1BZX0ZST01fUEFSRU5UIGNhbiBiZSB1c2VkIGZvciBtYW55IHhjYl9jcmVhdGVfd2luZG93IHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgWENCX0NPUFlfRlJPTV9QQVJFTlQgMEwKKworLyoqIFhDQl9DVVJSRU5UX1RJTUUgY2FuIGJlIHVzZWQgaW4gbW9zdCByZXF1ZXN0cyB0aGF0IHRha2UgYW4geGNiX3RpbWVzdGFtcF90ICovCisjZGVmaW5lIFhDQl9DVVJSRU5UX1RJTUUgMEwKKworLyoqIFhDQl9OT19TWU1CT0wgZmlsbHMgaW4gdW51c2VkIGVudHJpZXMgaW4geGNiX2tleXN5bV90IHRhYmxlcyAqLworI2RlZmluZSBYQ0JfTk9fU1lNQk9MIDBMCisKKworLyogeGNiX2F1dGguYyAqLworCisvKioKKyAqIEBicmllZiBDb250YWluZXIgZm9yIGF1dGhvcml6YXRpb24gaW5mb3JtYXRpb24uCisgKgorICogQSBjb250YWluZXIgZm9yIGF1dGhvcml6YXRpb24gaW5mb3JtYXRpb24gdG8gYmUgc2VudCB0byB0aGUgWCBzZXJ2ZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9hdXRoX2luZm9fdCB7CisgICAgaW50ICAgbmFtZWxlbjsgIC8qKjwgTGVuZ3RoIG9mIHRoZSBzdHJpbmcgbmFtZSAoYXMgcmV0dXJuZWQgYnkgc3RybGVuKS4gKi8KKyAgICBjaGFyICpuYW1lOyAgICAgLyoqPCBTdHJpbmcgY29udGFpbmluZyB0aGUgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgbmFtZSwgc3VjaCBhcyAiTUlULU1BR0lDLUNPT0tJRS0xIiBvciAiWERNLUFVVEhPUklaQVRJT04tMSIuICovCisgICAgaW50ICAgZGF0YWxlbjsgIC8qKjwgTGVuZ3RoIG9mIHRoZSBkYXRhIG1lbWJlci4gKi8KKyAgICBjaGFyICpkYXRhOyAgIC8qKjwgRGF0YSBpbnRlcnByZXRlZCBpbiBhIHByb3RvY29sLXNwZWNpZmljIG1hbm5lci4gKi8KK30geGNiX2F1dGhfaW5mb190OworCisKKy8qIHhjYl9vdXQuYyAqLworCisvKioKKyAqIEBicmllZiBGb3JjZXMgYW55IGJ1ZmZlcmVkIG91dHB1dCB0byBiZSB3cml0dGVuIHRvIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIFggc2VydmVyLgorICogQHJldHVybiA+IEBjIDAgb24gc3VjY2VzcywgPD0gQGMgMCBvdGhlcndpc2UuCisgKgorICogRm9yY2VzIGFueSBidWZmZXJlZCBvdXRwdXQgdG8gYmUgd3JpdHRlbiB0byB0aGUgc2VydmVyLiBCbG9ja3MKKyAqIHVudGlsIHRoZSB3cml0ZSBpcyBjb21wbGV0ZS4KKyAqLworaW50IHhjYl9mbHVzaCh4Y2JfY29ubmVjdGlvbl90ICpjKTsKKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgbWF4aW11bSByZXF1ZXN0IGxlbmd0aCB0aGF0IHRoaXMgc2VydmVyIGFjY2VwdHMuCisgKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIFggc2VydmVyLgorICogQHJldHVybiBUaGUgbWF4aW11bSByZXF1ZXN0IGxlbmd0aCBmaWVsZC4KKyAqCisgKiBJbiB0aGUgYWJzZW5jZSBvZiB0aGUgQklHLVJFUVVFU1RTIGV4dGVuc2lvbiwgcmV0dXJucyB0aGUKKyAqIG1heGltdW0gcmVxdWVzdCBsZW5ndGggZmllbGQgZnJvbSB0aGUgY29ubmVjdGlvbiBzZXR1cCBkYXRhLCB3aGljaAorICogbWF5IGJlIGFzIG11Y2ggYXMgNjU1MzUuIElmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgQklHLVJFUVVFU1RTLCB0aGVuCisgKiB0aGUgbWF4aW11bSByZXF1ZXN0IGxlbmd0aCBmaWVsZCBmcm9tIHRoZSByZXBseSB0byB0aGUKKyAqIEJpZ1JlcXVlc3RzRW5hYmxlIHJlcXVlc3Qgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGxlbmd0aCBpcyBtZWFzdXJlZCBpbiBmb3VyLWJ5dGUgdW5pdHMsIG1ha2luZyB0aGUKKyAqIHRoZW9yZXRpY2FsIG1heGltdW0gbGVuZ3RocyByb3VnaGx5IDI1NmtCIHdpdGhvdXQgQklHLVJFUVVFU1RTIGFuZAorICogMTZHQiB3aXRoLgorICovCit1aW50MzJfdCB4Y2JfZ2V0X21heGltdW1fcmVxdWVzdF9sZW5ndGgoeGNiX2Nvbm5lY3Rpb25fdCAqYyk7CisKKy8qKgorICogQGJyaWVmIFByZWZldGNoIHRoZSBtYXhpbXVtIHJlcXVlc3QgbGVuZ3RoIHdpdGhvdXQgYmxvY2tpbmcuCisgKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIFggc2VydmVyLgorICoKKyAqIFdpdGhvdXQgYmxvY2tpbmcsIGRvZXMgYXMgbXVjaCB3b3JrIGFzIHBvc3NpYmxlIHRvd2FyZCBjb21wdXRpbmcKKyAqIHRoZSBtYXhpbXVtIHJlcXVlc3QgbGVuZ3RoIGFjY2VwdGVkIGJ5IHRoZSBYIHNlcnZlci4KKyAqCisgKiBJbnZva2luZyB0aGlzIGZ1bmN0aW9uIG1heSBjYXVzZSBhIGNhbGwgdG8geGNiX2JpZ19yZXF1ZXN0c19lbmFibGUsCisgKiBidXQgd2lsbCBub3QgYmxvY2sgd2FpdGluZyBmb3IgdGhlIHJlcGx5LgorICogeGNiX2dldF9tYXhpbXVtX3JlcXVlc3RfbGVuZ3RoIHdpbGwgcmV0dXJuIHRoZSBwcmVmZXRjaGVkIGRhdGEKKyAqIGFmdGVyIHBvc3NpYmx5IGJsb2NraW5nIHdoaWxlIHRoZSByZXBseSBpcyByZXRyaWV2ZWQuCisgKgorICogTm90ZSB0aGF0IGluIG9yZGVyIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGZ1bGx5IG5vbi1ibG9ja2luZywgdGhlCisgKiBhcHBsaWNhdGlvbiBtdXN0IHByZXZpb3VzbHkgaGF2ZSBjYWxsZWQKKyAqIHhjYl9wcmVmZXRjaF9leHRlbnNpb25fZGF0YShjLCAmeGNiX2JpZ19yZXF1ZXN0c19pZCkgYW5kIHRoZSByZXBseQorICogbXVzdCBoYXZlIGFscmVhZHkgYXJyaXZlZC4KKyAqLwordm9pZCB4Y2JfcHJlZmV0Y2hfbWF4aW11bV9yZXF1ZXN0X2xlbmd0aCh4Y2JfY29ubmVjdGlvbl90ICpjKTsKKworCisvKiB4Y2JfaW4uYyAqLworCisvKioKKyAqIEBicmllZiBSZXR1cm5zIHRoZSBuZXh0IGV2ZW50IG9yIGVycm9yIGZyb20gdGhlIHNlcnZlci4KKyAqIEBwYXJhbSBjOiBUaGUgY29ubmVjdGlvbiB0byB0aGUgWCBzZXJ2ZXIuCisgKiBAcmV0dXJuIFRoZSBuZXh0IGV2ZW50IGZyb20gdGhlIHNlcnZlci4KKyAqCisgKiBSZXR1cm5zIHRoZSBuZXh0IGV2ZW50IG9yIGVycm9yIGZyb20gdGhlIHNlcnZlciwgb3IgcmV0dXJucyBudWxsIGluCisgKiB0aGUgZXZlbnQgb2YgYW4gSS9PIGVycm9yLiBCbG9ja3MgdW50aWwgZWl0aGVyIGFuIGV2ZW50IG9yIGVycm9yCisgKiBhcnJpdmUsIG9yIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgKi8KK3hjYl9nZW5lcmljX2V2ZW50X3QgKnhjYl93YWl0X2Zvcl9ldmVudCh4Y2JfY29ubmVjdGlvbl90ICpjKTsKKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgbmV4dCBldmVudCBvciBlcnJvciBmcm9tIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIFggc2VydmVyLgorICogZXJyb3Igc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24uCisgKiBAcmV0dXJuIFRoZSBuZXh0IGV2ZW50IGZyb20gdGhlIHNlcnZlci4KKyAqCisgKiBSZXR1cm5zIHRoZSBuZXh0IGV2ZW50IG9yIGVycm9yIGZyb20gdGhlIHNlcnZlciwgaWYgb25lIGlzCisgKiBhdmFpbGFibGUsIG9yIHJldHVybnMgQGMgTlVMTCBvdGhlcndpc2UuIElmIG5vIGV2ZW50IGlzIGF2YWlsYWJsZSwgdGhhdAorICogbWlnaHQgYmUgYmVjYXVzZSBhbiBJL08gZXJyb3IgbGlrZSBjb25uZWN0aW9uIGNsb3NlIG9jY3VycmVkIHdoaWxlCisgKiBhdHRlbXB0aW5nIHRvIHJlYWQgdGhlIG5leHQgZXZlbnQsIGluIHdoaWNoIGNhc2UgdGhlIGNvbm5lY3Rpb24gaXMKKyAqIHNodXQgZG93biB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAqLworeGNiX2dlbmVyaWNfZXZlbnRfdCAqeGNiX3BvbGxfZm9yX2V2ZW50KHhjYl9jb25uZWN0aW9uX3QgKmMpOworCisvKioKKyAqIEBicmllZiBSZXR1cm5zIHRoZSBuZXh0IGV2ZW50IHdpdGhvdXQgcmVhZGluZyBmcm9tIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uIHRvIHRoZSBYIHNlcnZlci4KKyAqIEByZXR1cm4gVGhlIG5leHQgYWxyZWFkeSBxdWV1ZWQgZXZlbnQgZnJvbSB0aGUgc2VydmVyLgorICoKKyAqIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIHhjYl9wb2xsX2Zvcl9ldmVudCB0aGF0IG9ubHkgZXhhbWluZXMgdGhlCisgKiBldmVudCBxdWV1ZSBmb3IgbmV3IGV2ZW50cy4gVGhlIGZ1bmN0aW9uIGRvZXNuJ3QgdHJ5IHRvIHJlYWQgbmV3CisgKiBldmVudHMgZnJvbSB0aGUgY29ubmVjdGlvbiBpZiBubyBxdWV1ZWQgZXZlbnRzIGFyZSBmb3VuZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgY2FsbGVycyB0aGF0IGtub3cgaW4gYWR2YW5jZSB0aGF0IGFsbAorICogaW50ZXJlc3RpbmcgZXZlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHJlYWQgZnJvbSB0aGUgY29ubmVjdGlvbi4gRm9yCisgKiBleGFtcGxlLCBjYWxsZXJzIG1pZ2h0IHVzZSB4Y2Jfd2FpdF9mb3JfcmVwbHkgYW5kIGJlIGludGVyZXN0ZWQKKyAqIG9ubHkgb2YgZXZlbnRzIHRoYXQgcHJlY2VkZWQgYSBzcGVjaWZpYyByZXBseS4KKyAqLworeGNiX2dlbmVyaWNfZXZlbnRfdCAqeGNiX3BvbGxfZm9yX3F1ZXVlZF9ldmVudCh4Y2JfY29ubmVjdGlvbl90ICpjKTsKKworLyoqCisgKiBAYnJpZWYgUmV0dXJuIHRoZSBlcnJvciBmb3IgYSByZXF1ZXN0LCBvciBOVUxMIGlmIG5vbmUgY2FuIGV2ZXIgYXJyaXZlLgorICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uIHRvIHRoZSBYIHNlcnZlci4KKyAqIEBwYXJhbSBjb29raWU6IFRoZSByZXF1ZXN0IGNvb2tpZS4KKyAqIEByZXR1cm4gVGhlIGVycm9yIGZvciB0aGUgcmVxdWVzdCwgb3IgTlVMTCBpZiBub25lIGNhbiBldmVyIGFycml2ZS4KKyAqCisgKiBUaGUgeGNiX3ZvaWRfY29va2llX3QgY29va2llIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBoYXZlIHJlc3VsdGVkCisgKiBmcm9tIGEgY2FsbCB0byB4Y2JfW3JlcXVlc3RfbmFtZV1fY2hlY2tlZCgpLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrCisgKiB1bnRpbCBvbmUgb2YgdHdvIGNvbmRpdGlvbnMgaGFwcGVucy4gIElmIGFuIGVycm9yIGlzIHJlY2VpdmVkLCBpdCB3aWxsIGJlCisgKiByZXR1cm5lZC4gIElmIGEgcmVwbHkgdG8gYSBzdWJzZXF1ZW50IHJlcXVlc3QgaGFzIGFscmVhZHkgYXJyaXZlZCwgbm8gZXJyb3IKKyAqIGNhbiBhcnJpdmUgZm9yIHRoaXMgcmVxdWVzdCwgc28gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBOVUxMLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgcGVyZm9ybSBhIHN5bmMgaWYgbmVlZGVkIHRvIGVuc3VyZSB0aGF0IHRoZQorICogc2VxdWVuY2UgbnVtYmVyIHdpbGwgYWR2YW5jZSBiZXlvbmQgdGhhdCBwcm92aWRlZCBpbiBjb29raWU7IHRoaXMgaXMgYQorICogY29udmVuaWVuY2UgdG8gYXZvaWQgcmFjZXMgaW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgc3luYyBpcyBuZWVkZWQuCisgKi8KK3hjYl9nZW5lcmljX2Vycm9yX3QgKnhjYl9yZXF1ZXN0X2NoZWNrKHhjYl9jb25uZWN0aW9uX3QgKmMsIHhjYl92b2lkX2Nvb2tpZV90IGNvb2tpZSk7CisKKy8qKgorICogQGJyaWVmIERpc2NhcmRzIHRoZSByZXBseSBmb3IgYSByZXF1ZXN0LgorICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uIHRvIHRoZSBYIHNlcnZlci4KKyAqIEBwYXJhbSBzZXF1ZW5jZTogVGhlIHJlcXVlc3Qgc2VxdWVuY2UgbnVtYmVyIGZyb20gYSBjb29raWUuCisgKgorICogRGlzY2FyZHMgdGhlIHJlcGx5IGZvciBhIHJlcXVlc3QuIEFkZGl0aW9uYWxseSwgYW55IGVycm9yIGdlbmVyYXRlZAorICogYnkgdGhlIHJlcXVlc3QgaXMgYWxzbyBkaXNjYXJkZWQgKHVubGVzcyBpdCB3YXMgYW4gX3VuY2hlY2tlZCByZXF1ZXN0CisgKiBhbmQgdGhlIGVycm9yIGhhcyBhbHJlYWR5IGFycml2ZWQpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYmxvY2sgZXZlbiBpZiB0aGUgcmVwbHkgaXMgbm90IHlldCBhdmFpbGFibGUuCisgKgorICogTm90ZSB0aGF0IHRoZSBzZXF1ZW5jZSByZWFsbHkgZG9lcyBoYXZlIHRvIGNvbWUgZnJvbSBhbiB4Y2IgY29va2llOworICogdGhpcyBmdW5jdGlvbiBpcyBub3QgZGVzaWduZWQgdG8gb3BlcmF0ZSBvbiBzb2NrZXQtaGFuZG9mZiByZXBsaWVzLgorICovCit2b2lkIHhjYl9kaXNjYXJkX3JlcGx5KHhjYl9jb25uZWN0aW9uX3QgKmMsIHVuc2lnbmVkIGludCBzZXF1ZW5jZSk7CisKKworLyogeGNiX2V4dC5jICovCisKKy8qKgorICogQHR5cGVkZWYgdHlwZWRlZiBzdHJ1Y3QgeGNiX2V4dGVuc2lvbl90IHhjYl9leHRlbnNpb25fdAorICovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZXh0ZW5zaW9uX3QgeGNiX2V4dGVuc2lvbl90OyAgLyoqPCBPcGFxdWUgc3RydWN0dXJlIHVzZWQgYXMga2V5IGZvciB4Y2JfZ2V0X2V4dGVuc2lvbl9kYXRhX3QuICovCisKKy8qKgorICogQGJyaWVmIENhY2hlcyByZXBseSBpbmZvcm1hdGlvbiBmcm9tIFF1ZXJ5RXh0ZW5zaW9uIHJlcXVlc3RzLgorICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIGV4dDogVGhlIGV4dGVuc2lvbiBkYXRhLgorICogQHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIHhjYl9xdWVyeV9leHRlbnNpb25fcmVwbHlfdCBmb3IgdGhlIGV4dGVuc2lvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBwcmltYXJ5IGludGVyZmFjZSB0byB0aGUgImV4dGVuc2lvbiBjYWNoZSIsCisgKiB3aGljaCBjYWNoZXMgcmVwbHkgaW5mb3JtYXRpb24gZnJvbSBRdWVyeUV4dGVuc2lvbgorICogcmVxdWVzdHMuIEludm9raW5nIHRoaXMgZnVuY3Rpb24gbWF5IGNhdXNlIGEgY2FsbCB0bworICogeGNiX3F1ZXJ5X2V4dGVuc2lvbiB0byByZXRyaWV2ZSBleHRlbnNpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUKKyAqIHNlcnZlciwgYW5kIG1heSBibG9jayB1bnRpbCBleHRlbnNpb24gZGF0YSBpcyByZWNlaXZlZCBmcm9tIHRoZQorICogc2VydmVyLgorICoKKyAqIFRoZSByZXN1bHQgbXVzdCBub3QgYmUgZnJlZWQuIFRoaXMgc3RvcmFnZSBpcyBtYW5hZ2VkIGJ5IHRoZSBjYWNoZQorICogaXRzZWxmLgorICovCitjb25zdCB4Y2JfcXVlcnlfZXh0ZW5zaW9uX3JlcGx5X3QgKnhjYl9nZXRfZXh0ZW5zaW9uX2RhdGEoeGNiX2Nvbm5lY3Rpb25fdCAqYywgeGNiX2V4dGVuc2lvbl90ICpleHQpOworCisvKioKKyAqIEBicmllZiBQcmVmZXRjaCBvZiBleHRlbnNpb24gZGF0YSBpbnRvIHRoZSBleHRlbnNpb24gY2FjaGUKKyAqIEBwYXJhbSBjOiBUaGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBleHQ6IFRoZSBleHRlbnNpb24gZGF0YS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBhICJwcmVmZXRjaCIgb2YgZXh0ZW5zaW9uIGRhdGEgaW50byB0aGUKKyAqIGV4dGVuc2lvbiBjYWNoZS4gSW52b2tpbmcgdGhlIGZ1bmN0aW9uIG1heSBjYXVzZSBhIGNhbGwgdG8KKyAqIHhjYl9xdWVyeV9leHRlbnNpb24sIGJ1dCB3aWxsIG5vdCBibG9jayB3YWl0aW5nIGZvciB0aGUKKyAqIHJlcGx5LiB4Y2JfZ2V0X2V4dGVuc2lvbl9kYXRhIHdpbGwgcmV0dXJuIHRoZSBwcmVmZXRjaGVkIGRhdGEgYWZ0ZXIKKyAqIHBvc3NpYmx5IGJsb2NraW5nIHdoaWxlIGl0IGlzIHJldHJpZXZlZC4KKyAqLwordm9pZCB4Y2JfcHJlZmV0Y2hfZXh0ZW5zaW9uX2RhdGEoeGNiX2Nvbm5lY3Rpb25fdCAqYywgeGNiX2V4dGVuc2lvbl90ICpleHQpOworCisKKy8qIHhjYl9jb25uLmMgKi8KKworLyoqCisgKiBAYnJpZWYgQWNjZXNzIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24uCisgKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhbiB4Y2Jfc2V0dXBfdCBzdHJ1Y3R1cmUuCisgKgorICogQWNjZXNzb3IgZm9yIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIgd2hlbiB0aGUgeGNiX2Nvbm5lY3Rpb25fdAorICogd2FzIGluaXRpYWxpemVkLiBUaGlzIGRhdGEgaW5jbHVkZXMKKyAqIC0gdGhlIHNlcnZlcidzIHJlcXVpcmVkIGZvcm1hdCBmb3IgaW1hZ2VzLAorICogLSBhIGxpc3Qgb2YgYXZhaWxhYmxlIHZpc3VhbHMsCisgKiAtIGEgbGlzdCBvZiBhdmFpbGFibGUgc2NyZWVucywKKyAqIC0gdGhlIHNlcnZlcidzIG1heGltdW0gcmVxdWVzdCBsZW5ndGggKGluIHRoZSBhYnNlbmNlIG9mIHRoZQorICogQklHLVJFUVVFU1RTIGV4dGVuc2lvbiksCisgKiAtIGFuZCBvdGhlciBhc3NvcnRlZCBpbmZvcm1hdGlvbi4KKyAqCisgKiBTZWUgdGhlIFggcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSByZXN1bHQgbXVzdCBub3QgYmUgZnJlZWQuCisgKi8KK2NvbnN0IHhjYl9zZXR1cF90ICp4Y2JfZ2V0X3NldHVwKHhjYl9jb25uZWN0aW9uX3QgKmMpOworCisvKioKKyAqIEBicmllZiBBY2Nlc3MgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBjOiBUaGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm4gVGhlIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBBY2Nlc3NvciBmb3IgdGhlIGZpbGUgZGVzY3JpcHRvciB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlCisgKiB4Y2JfY29ubmVjdF90b19mZCBjYWxsIHRoYXQgcmV0dXJuZWQgQHAgYy4KKyAqLworaW50IHhjYl9nZXRfZmlsZV9kZXNjcmlwdG9yKHhjYl9jb25uZWN0aW9uX3QgKmMpOworCisvKioKKyAqIEBicmllZiBUZXN0IHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaGFzIHNodXQgZG93biBkdWUgdG8gYSBmYXRhbCBlcnJvci4KKyAqIEBwYXJhbSBjOiBUaGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm4gPiAwIGlmIHRoZSBjb25uZWN0aW9uIGlzIGluIGFuIGVycm9yIHN0YXRlOyAwIG90aGVyd2lzZS4KKyAqCisgKiBTb21lIGVycm9ycyB0aGF0IG9jY3VyIGluIHRoZSBjb250ZXh0IG9mIGFuIHhjYl9jb25uZWN0aW9uX3QKKyAqIGFyZSB1bnJlY292ZXJhYmxlLiBXaGVuIHN1Y2ggYW4gZXJyb3Igb2NjdXJzLCB0aGUKKyAqIGNvbm5lY3Rpb24gaXMgc2h1dCBkb3duIGFuZCBmdXJ0aGVyIG9wZXJhdGlvbnMgb24gdGhlCisgKiB4Y2JfY29ubmVjdGlvbl90IGhhdmUgbm8gZWZmZWN0LgorICoKKyAqIEByZXR1cm4gWENCX0NPTk5fRVJST1IsIGJlY2F1c2Ugb2Ygc29ja2V0IGVycm9ycywgcGlwZSBlcnJvcnMgb3Igb3RoZXIgc3RyZWFtIGVycm9ycy4KKyAqIEByZXR1cm4gWENCX0NPTk5fQ0xPU0VEX0VYVF9OT1RTVVBQT1JURUQsIHdoZW4gZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQuCisgKiBAcmV0dXJuIFhDQl9DT05OX0NMT1NFRF9NRU1fSU5TVUZGSUNJRU5ULCB3aGVuIG1lbW9yeSBub3QgYXZhaWxhYmxlLgorICogQHJldHVybiBYQ0JfQ09OTl9DTE9TRURfUkVRX0xFTl9FWENFRUQsIGV4Y2VlZGluZyByZXF1ZXN0IGxlbmd0aCB0aGF0IHNlcnZlciBhY2NlcHRzLgorICogQHJldHVybiBYQ0JfQ09OTl9DTE9TRURfUEFSU0VfRVJSLCBlcnJvciBkdXJpbmcgcGFyc2luZyBkaXNwbGF5IHN0cmluZy4KKyAqLworaW50IHhjYl9jb25uZWN0aW9uX2hhc19lcnJvcih4Y2JfY29ubmVjdGlvbl90ICpjKTsKKworLyoqCisgKiBAYnJpZWYgQ29ubmVjdHMgdG8gdGhlIFggc2VydmVyLgorICogQHBhcmFtIGZkOiBUaGUgZmlsZSBkZXNjcmlwdG9yLgorICogQHBhcmFtIGF1dGhfaW5mbzogQXV0aGVudGljYXRpb24gZGF0YS4KKyAqIEByZXR1cm4gQSBuZXdseSBhbGxvY2F0ZWQgeGNiX2Nvbm5lY3Rpb25fdCBzdHJ1Y3R1cmUuCisgKgorICogQ29ubmVjdHMgdG8gYW4gWCBzZXJ2ZXIsIGdpdmVuIHRoZSBvcGVuIHNvY2tldCBAcCBmZCBhbmQgdGhlCisgKiB4Y2JfYXV0aF9pbmZvX3QgQHAgYXV0aF9pbmZvLiBUaGUgZmlsZSBkZXNjcmlwdG9yIEBwIGZkIGlzCisgKiBiaWRpcmVjdGlvbmFsbHkgY29ubmVjdGVkIHRvIGFuIFggc2VydmVyLiBJZiB0aGUgY29ubmVjdGlvbgorICogc2hvdWxkIGJlIHVuYXV0aGVudGljYXRlZCwgQHAgYXV0aF9pbmZvIG11c3QgYmUgQGMKKyAqIE5VTEwuCisgKi8KK3hjYl9jb25uZWN0aW9uX3QgKnhjYl9jb25uZWN0X3RvX2ZkKGludCBmZCwgeGNiX2F1dGhfaW5mb190ICphdXRoX2luZm8pOworCisvKioKKyAqIEBicmllZiBDbG9zZXMgdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24uCisgKgorICogQ2xvc2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IgYW5kIGZyZWVzIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogY29ubmVjdGlvbiBAYyBjLgorICovCit2b2lkIHhjYl9kaXNjb25uZWN0KHhjYl9jb25uZWN0aW9uX3QgKmMpOworCisKKy8qIHhjYl91dGlsLmMgKi8KKworLyoqCisgKiBAYnJpZWYgUGFyc2VzIGEgZGlzcGxheSBzdHJpbmcgbmFtZSBpbiB0aGUgZm9ybSBkb2N1bWVudGVkIGJ5IFgoN3gpLgorICogQHBhcmFtIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBkaXNwbGF5LgorICogQHBhcmFtIGhvc3Q6IEEgcG9pbnRlciB0byBhIG1hbGxvYydkIGNvcHkgb2YgdGhlIGhvc3RuYW1lLgorICogQHBhcmFtIGRpc3BsYXk6IEEgcG9pbnRlciB0byB0aGUgZGlzcGxheSBudW1iZXIuCisgKiBAcGFyYW0gc2NyZWVuOiBBIHBvaW50ZXIgdG8gdGhlIHNjcmVlbiBudW1iZXIuCisgKiBAcmV0dXJuIDAgb24gZmFpbHVyZSwgbm9uIDAgb3RoZXJ3aXNlLgorICoKKyAqIFBhcnNlcyB0aGUgZGlzcGxheSBzdHJpbmcgbmFtZSBAcCBkaXNwbGF5X25hbWUgaW4gdGhlIGZvcm0KKyAqIGRvY3VtZW50ZWQgYnkgWCg3eCkuIEhhcyBubyBzaWRlIGVmZmVjdHMgb24gZmFpbHVyZS4gSWYKKyAqIEBwIGRpc3BsYXluYW1lIGlzIEBjIE5VTEwgb3IgZW1wdHksIGl0IHVzZXMgdGhlIGVudmlyb25tZW50CisgKiB2YXJpYWJsZSBESVNQTEFZLiBAcCBob3N0cCBpcyBhIHBvaW50ZXIgdG8gYSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nCisgKiB0aGF0IGNvbnRhaW4gdGhlIGhvc3QgbmFtZS4gQHAgZGlzcGxheXAgaXMgc2V0IHRvIHRoZSBkaXNwbGF5CisgKiBudW1iZXIgYW5kIEBwIHNjcmVlbnAgdG8gdGhlIHByZWZlcnJlZCBzY3JlZW4gbnVtYmVyLiBAcCBzY3JlZW5wCisgKiBjYW4gYmUgQGMgTlVMTC4gSWYgQHAgZGlzcGxheW5hbWUgZG9lcyBub3QgY29udGFpbiBhIHNjcmVlbiBudW1iZXIsCisgKiBpdCBpcyBzZXQgdG8gQGMgMC4KKyAqLworaW50IHhjYl9wYXJzZV9kaXNwbGF5KGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKipob3N0LCBpbnQgKmRpc3BsYXksIGludCAqc2NyZWVuKTsKKworLyoqCisgKiBAYnJpZWYgQ29ubmVjdHMgdG8gdGhlIFggc2VydmVyLgorICogQHBhcmFtIGRpc3BsYXluYW1lOiBUaGUgbmFtZSBvZiB0aGUgZGlzcGxheS4KKyAqIEBwYXJhbSBzY3JlZW5wOiBBIHBvaW50ZXIgdG8gYSBwcmVmZXJyZWQgc2NyZWVuIG51bWJlci4KKyAqIEByZXR1cm4gQSBuZXdseSBhbGxvY2F0ZWQgeGNiX2Nvbm5lY3Rpb25fdCBzdHJ1Y3R1cmUuCisgKgorICogQ29ubmVjdHMgdG8gdGhlIFggc2VydmVyIHNwZWNpZmllZCBieSBAcCBkaXNwbGF5bmFtZS4gSWYgQHAKKyAqIGRpc3BsYXluYW1lIGlzIEBjIE5VTEwsIHVzZXMgdGhlIHZhbHVlIG9mIHRoZSBESVNQTEFZIGVudmlyb25tZW50CisgKiB2YXJpYWJsZS4gSWYgYSBwYXJ0aWN1bGFyIHNjcmVlbiBvbiB0aGF0IHNlcnZlciBpcyBwcmVmZXJyZWQsIHRoZQorICogaW50IHBvaW50ZWQgdG8gYnkgQHAgc2NyZWVucCAoaWYgbm90IEBjIE5VTEwpIHdpbGwgYmUgc2V0IHRvIHRoYXQKKyAqIHNjcmVlbjsgb3RoZXJ3aXNlIHRoZSBzY3JlZW4gd2lsbCBiZSBzZXQgdG8gMC4KKyAqLworeGNiX2Nvbm5lY3Rpb25fdCAqeGNiX2Nvbm5lY3QoY29uc3QgY2hhciAqZGlzcGxheW5hbWUsIGludCAqc2NyZWVucCk7CisKKy8qKgorICogQGJyaWVmIENvbm5lY3RzIHRvIHRoZSBYIHNlcnZlciwgdXNpbmcgYW4gYXV0aG9yaXphdGlvbiBpbmZvcm1hdGlvbi4KKyAqIEBwYXJhbSBkaXNwbGF5OiBUaGUgbmFtZSBvZiB0aGUgZGlzcGxheS4KKyAqIEBwYXJhbSBhdXRoOiBUaGUgYXV0aG9yaXphdGlvbiBpbmZvcm1hdGlvbi4KKyAqIEBwYXJhbSBzY3JlZW46IEEgcG9pbnRlciB0byBhIHByZWZlcnJlZCBzY3JlZW4gbnVtYmVyLgorICogQHJldHVybiBBIG5ld2x5IGFsbG9jYXRlZCB4Y2JfY29ubmVjdGlvbl90IHN0cnVjdHVyZS4KKyAqCisgKiBDb25uZWN0cyB0byB0aGUgWCBzZXJ2ZXIgc3BlY2lmaWVkIGJ5IEBwIGRpc3BsYXluYW1lLCB1c2luZyB0aGUKKyAqIGF1dGhvcml6YXRpb24gQHAgYXV0aC4gSWYgYSBwYXJ0aWN1bGFyIHNjcmVlbiBvbiB0aGF0IHNlcnZlciBpcworICogcHJlZmVycmVkLCB0aGUgaW50IHBvaW50ZWQgdG8gYnkgQHAgc2NyZWVucCAoaWYgbm90IEBjIE5VTEwpIHdpbGwKKyAqIGJlIHNldCB0byB0aGF0IHNjcmVlbjsgb3RoZXJ3aXNlIEBwIHNjcmVlbnAgd2lsbCBiZSBzZXQgdG8gMC4KKyAqLworeGNiX2Nvbm5lY3Rpb25fdCAqeGNiX2Nvbm5lY3RfdG9fZGlzcGxheV93aXRoX2F1dGhfaW5mbyhjb25zdCBjaGFyICpkaXNwbGF5LCB4Y2JfYXV0aF9pbmZvX3QgKmF1dGgsIGludCAqc2NyZWVuKTsKKworCisvKiB4Y2JfeGlkLmMgKi8KKworLyoqCisgKiBAYnJpZWYgQWxsb2NhdGVzIGFuIFhJRCBmb3IgYSBuZXcgb2JqZWN0LgorICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uLgorICogQHJldHVybiBBIG5ld2x5IGFsbG9jYXRlZCBYSUQuCisgKgorICogQWxsb2NhdGVzIGFuIFhJRCBmb3IgYSBuZXcgb2JqZWN0LiBUeXBpY2FsbHkgdXNlZCBqdXN0IHByaW9yIHRvCisgKiB2YXJpb3VzIG9iamVjdCBjcmVhdGlvbiBmdW5jdGlvbnMsIHN1Y2ggYXMgeGNiX2NyZWF0ZV93aW5kb3cuCisgKi8KK3VpbnQzMl90IHhjYl9nZW5lcmF0ZV9pZCh4Y2JfY29ubmVjdGlvbl90ICpjKTsKKworCisvKioKKyAqIEB9CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogX19YQ0JfSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi94Y2JleHQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveGNiL3hjYmV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjNjOTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi94Y2JleHQuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IEJhcnQgTWFzc2V5IGFuZCBKYW1leSBTaGFycC4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG9yIHRoZWlyCisgKiBpbnN0aXR1dGlvbnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqIGF1dGhvcml6YXRpb24gZnJvbSB0aGUgYXV0aG9ycy4KKyAqLworCisjaWZuZGVmIF9fWENCRVhUX0gKKyNkZWZpbmUgX19YQ0JFWFRfSAorCisjaW5jbHVkZSAieGNiLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogeGNiX2V4dC5jICovCisKK3N0cnVjdCB4Y2JfZXh0ZW5zaW9uX3QgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgaW50IGdsb2JhbF9pZDsKK307CisKKworLyogeGNiX291dC5jICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaXplX3QgY291bnQ7CisgICAgeGNiX2V4dGVuc2lvbl90ICpleHQ7CisgICAgdWludDhfdCBvcGNvZGU7CisgICAgdWludDhfdCBpc3ZvaWQ7Cit9IHhjYl9wcm90b2NvbF9yZXF1ZXN0X3Q7CisKK2VudW0geGNiX3NlbmRfcmVxdWVzdF9mbGFnc190IHsKKyAgICBYQ0JfUkVRVUVTVF9DSEVDS0VEID0gMSA8PCAwLAorICAgIFhDQl9SRVFVRVNUX1JBVyA9IDEgPDwgMSwKKyAgICBYQ0JfUkVRVUVTVF9ESVNDQVJEX1JFUExZID0gMSA8PCAyCit9OworCit1bnNpZ25lZCBpbnQgeGNiX3NlbmRfcmVxdWVzdCh4Y2JfY29ubmVjdGlvbl90ICpjLCBpbnQgZmxhZ3MsIHN0cnVjdCBpb3ZlYyAqdmVjdG9yLCBjb25zdCB4Y2JfcHJvdG9jb2xfcmVxdWVzdF90ICpyZXF1ZXN0KTsKKworLyogeGNiX3Rha2Vfc29ja2V0IGFsbG93cyBleHRlcm5hbCBjb2RlIHRvIGFzayBYQ0IgZm9yIHBlcm1pc3Npb24gdG8KKyAqIHRha2Ugb3ZlciB0aGUgd3JpdGUgc2lkZSBvZiB0aGUgc29ja2V0IGFuZCBzZW5kIHJhdyBkYXRhIHdpdGgKKyAqIHhjYl93cml0ZXYuIHhjYl90YWtlX3NvY2tldCBwcm92aWRlcyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBsYXN0CisgKiByZXF1ZXN0IFhDQiBzZW50LiBUaGUgY2FsbGVyIG9mIHhjYl90YWtlX3NvY2tldCBtdXN0IHN1cHBseSBhCisgKiBjYWxsYmFjayB3aGljaCBYQ0IgY2FuIGNhbGwgd2hlbiBpdCB3YW50cyB0aGUgd3JpdGUgc2lkZSBvZiB0aGUKKyAqIHNvY2tldCBiYWNrIHRvIG1ha2UgYSByZXF1ZXN0LiBUaGlzIGNhbGxiYWNrIHN5bmNocm9uaXplcyB3aXRoIHRoZQorICogZXh0ZXJuYWwgc29ja2V0IG93bmVyIGFuZCBmbHVzaGVzIGFueSBvdXRwdXQgcXVldWVzIGlmIGFwcHJvcHJpYXRlLgorICogSWYgeW91IGFyZSBzZW5kaW5nIHJlcXVlc3RzIHdoaWNoIHdvbid0IGNhdXNlIGEgcmVwbHksIHBsZWFzZSBub3RlIHRoZQorICogY29tbWVudCBmb3IgeGNiX3dyaXRldiB3aGljaCBleHBsYWlucyBzb21lIHNlcXVlbmNlIG51bWJlciB3cmFwIGlzc3Vlcy4KKyAqICovCitpbnQgeGNiX3Rha2Vfc29ja2V0KHhjYl9jb25uZWN0aW9uX3QgKmMsIHZvaWQgKCpyZXR1cm5fc29ja2V0KSh2b2lkICpjbG9zdXJlKSwgdm9pZCAqY2xvc3VyZSwgaW50IGZsYWdzLCB1aW50NjRfdCAqc2VudCk7CisKKy8qIFlvdSBtdXN0IG93biB0aGUgd3JpdGUtc2lkZSBvZiB0aGUgc29ja2V0ICh5b3UndmUgY2FsbGVkCisgKiB4Y2JfdGFrZV9zb2NrZXQsIGFuZCBoYXZlbid0IHJldHVybmVkIGZyb20gcmV0dXJuX3NvY2tldCB5ZXQpIHRvIGNhbGwKKyAqIHhjYl93cml0ZXYuIEFsc28sIHRoZSBpb3ZlYyBtdXN0IGhhdmUgYXQgbGVhc3QgMSBieXRlIG9mIGRhdGEgaW4gaXQuCisgKiBZb3UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB4Y2IgY2FuIGRldGVjdCBzZXF1ZW5jZSBudW1iZXIgd3JhcHMgY29ycmVjdGx5LgorICogVGhpcyBtZWFucyB0aGF0IHRoZSBmaXJzdCByZXF1ZXN0IHlvdSBzZW5kIGFmdGVyIHhjYl90YWtlX3NvY2tldCBtdXN0IGNhdXNlIGEKKyAqIHJlcGx5IChlLmcuIGp1c3QgaW5zZXJ0IGEgR2V0SW5wdXRGb2N1cyByZXF1ZXN0KS4gQWZ0ZXIgZXZlcnkgKDEgPDwgMTYpIC0gMQorICogcmVxdWVzdHMgd2l0aG91dCBhIHJlcGx5LCB5b3UgaGF2ZSB0byBpbnNlcnQgYSByZXF1ZXN0IHdoaWNoIHdpbGwgY2F1c2UgYQorICogcmVwbHkuIFlvdSBjYW4gYWdhaW4gdXNlIEdldElucHV0Rm9jdXMgZm9yIHRoaXMuIFlvdSBkbyBub3QgaGF2ZSB0byB3YWl0IGZvcgorICogYW55IG9mIHRoZSBHZXRJbnB1dEZvY3VzIHJlcGxpZXMsIGJ1dCBjYW4gaW5zdGVhZCBoYW5kbGUgdGhlbSB2aWEKKyAqIHhjYl9kaXNjYXJkX3JlcGx5KCkuICovCitpbnQgeGNiX3dyaXRldih4Y2JfY29ubmVjdGlvbl90ICpjLCBzdHJ1Y3QgaW92ZWMgKnZlY3RvciwgaW50IGNvdW50LCB1aW50NjRfdCByZXF1ZXN0cyk7CisKKworLyogeGNiX2luLmMgKi8KKwordm9pZCAqeGNiX3dhaXRfZm9yX3JlcGx5KHhjYl9jb25uZWN0aW9uX3QgKmMsIHVuc2lnbmVkIGludCByZXF1ZXN0LCB4Y2JfZ2VuZXJpY19lcnJvcl90ICoqZSk7CitpbnQgeGNiX3BvbGxfZm9yX3JlcGx5KHhjYl9jb25uZWN0aW9uX3QgKmMsIHVuc2lnbmVkIGludCByZXF1ZXN0LCB2b2lkICoqcmVwbHksIHhjYl9nZW5lcmljX2Vycm9yX3QgKiplcnJvcik7CisKKworLyogeGNiX3V0aWwuYyAqLworCitpbnQgeGNiX3BvcGNvdW50KHVpbnQzMl90IG1hc2spOworaW50IHhjYl9zdW1vZih1aW50OF90ICpsaXN0LCBpbnQgbGVuKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi94cHJvdG8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveGNiL3hwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMmE0N2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi94cHJvdG8uaApAQCAtMCwwICsxLDE1NTMyIEBACisvKgorICogVGhpcyBmaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20geHByb3RvLnhtbCBieSBjX2NsaWVudC5weS4KKyAqIEVkaXQgYXQgeW91ciBwZXJpbC4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBYQ0JfX0FQSSBYQ0IgIEFQSQorICogQGJyaWVmICBYQ0IgUHJvdG9jb2wgSW1wbGVtZW50YXRpb24uCisgKiBAeworICoqLworCisjaWZuZGVmIF9fWFBST1RPX0gKKyNkZWZpbmUgX19YUFJPVE9fSAorCisjaW5jbHVkZSAieGNiLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBAYnJpZWYgeGNiX2NoYXIyYl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY2hhcjJiX3QgeworICAgIHVpbnQ4X3QgYnl0ZTE7IC8qKjwgICovCisgICAgdWludDhfdCBieXRlMjsgLyoqPCAgKi8KK30geGNiX2NoYXIyYl90OworCisvKioKKyAqIEBicmllZiB4Y2JfY2hhcjJiX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jaGFyMmJfaXRlcmF0b3JfdCB7CisgICAgeGNiX2NoYXIyYl90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9jaGFyMmJfaXRlcmF0b3JfdDsKKwordHlwZWRlZiB1aW50MzJfdCB4Y2Jfd2luZG93X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl93aW5kb3dfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3dpbmRvd19pdGVyYXRvcl90IHsKKyAgICB4Y2Jfd2luZG93X3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX3dpbmRvd19pdGVyYXRvcl90OworCit0eXBlZGVmIHVpbnQzMl90IHhjYl9waXhtYXBfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3BpeG1hcF9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcGl4bWFwX2l0ZXJhdG9yX3QgeworICAgIHhjYl9waXhtYXBfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfcGl4bWFwX2l0ZXJhdG9yX3Q7CisKK3R5cGVkZWYgdWludDMyX3QgeGNiX2N1cnNvcl90OworCisvKioKKyAqIEBicmllZiB4Y2JfY3Vyc29yX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jdXJzb3JfaXRlcmF0b3JfdCB7CisgICAgeGNiX2N1cnNvcl90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9jdXJzb3JfaXRlcmF0b3JfdDsKKwordHlwZWRlZiB1aW50MzJfdCB4Y2JfZm9udF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZm9udF9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZm9udF9pdGVyYXRvcl90IHsKKyAgICB4Y2JfZm9udF90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX2ZvbnRfaXRlcmF0b3JfdDsKKwordHlwZWRlZiB1aW50MzJfdCB4Y2JfZ2NvbnRleHRfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2djb250ZXh0X2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nY29udGV4dF9pdGVyYXRvcl90IHsKKyAgICB4Y2JfZ2NvbnRleHRfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX2djb250ZXh0X2l0ZXJhdG9yX3Q7CisKK3R5cGVkZWYgdWludDMyX3QgeGNiX2NvbG9ybWFwX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9jb2xvcm1hcF9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY29sb3JtYXBfaXRlcmF0b3JfdCB7CisgICAgeGNiX2NvbG9ybWFwX3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9jb2xvcm1hcF9pdGVyYXRvcl90OworCit0eXBlZGVmIHVpbnQzMl90IHhjYl9hdG9tX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9hdG9tX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9hdG9tX2l0ZXJhdG9yX3QgeworICAgIHhjYl9hdG9tX3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfYXRvbV9pdGVyYXRvcl90OworCit0eXBlZGVmIHVpbnQzMl90IHhjYl9kcmF3YWJsZV90OworCisvKioKKyAqIEBicmllZiB4Y2JfZHJhd2FibGVfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2RyYXdhYmxlX2l0ZXJhdG9yX3QgeworICAgIHhjYl9kcmF3YWJsZV90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfZHJhd2FibGVfaXRlcmF0b3JfdDsKKwordHlwZWRlZiB1aW50MzJfdCB4Y2JfZm9udGFibGVfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2ZvbnRhYmxlX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9mb250YWJsZV9pdGVyYXRvcl90IHsKKyAgICB4Y2JfZm9udGFibGVfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX2ZvbnRhYmxlX2l0ZXJhdG9yX3Q7CisKK3R5cGVkZWYgdWludDMyX3QgeGNiX3Zpc3VhbGlkX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl92aXN1YWxpZF9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfdmlzdWFsaWRfaXRlcmF0b3JfdCB7CisgICAgeGNiX3Zpc3VhbGlkX3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl92aXN1YWxpZF9pdGVyYXRvcl90OworCit0eXBlZGVmIHVpbnQzMl90IHhjYl90aW1lc3RhbXBfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3RpbWVzdGFtcF9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfdGltZXN0YW1wX2l0ZXJhdG9yX3QgeworICAgIHhjYl90aW1lc3RhbXBfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfdGltZXN0YW1wX2l0ZXJhdG9yX3Q7CisKK3R5cGVkZWYgdWludDMyX3QgeGNiX2tleXN5bV90OworCisvKioKKyAqIEBicmllZiB4Y2Jfa2V5c3ltX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9rZXlzeW1faXRlcmF0b3JfdCB7CisgICAgeGNiX2tleXN5bV90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9rZXlzeW1faXRlcmF0b3JfdDsKKwordHlwZWRlZiB1aW50OF90IHhjYl9rZXljb2RlX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9rZXljb2RlX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9rZXljb2RlX2l0ZXJhdG9yX3QgeworICAgIHhjYl9rZXljb2RlX3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2Jfa2V5Y29kZV9pdGVyYXRvcl90OworCit0eXBlZGVmIHVpbnQ4X3QgeGNiX2J1dHRvbl90OworCisvKioKKyAqIEBicmllZiB4Y2JfYnV0dG9uX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9idXR0b25faXRlcmF0b3JfdCB7CisgICAgeGNiX2J1dHRvbl90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9idXR0b25faXRlcmF0b3JfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3BvaW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9wb2ludF90IHsKKyAgICBpbnQxNl90IHg7IC8qKjwgICovCisgICAgaW50MTZfdCB5OyAvKio8ICAqLworfSB4Y2JfcG9pbnRfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3BvaW50X2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9wb2ludF9pdGVyYXRvcl90IHsKKyAgICB4Y2JfcG9pbnRfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX3BvaW50X2l0ZXJhdG9yX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9yZWN0YW5nbGVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3JlY3RhbmdsZV90IHsKKyAgICBpbnQxNl90ICB4OyAvKio8ICAqLworICAgIGludDE2X3QgIHk7IC8qKjwgICovCisgICAgdWludDE2X3Qgd2lkdGg7IC8qKjwgICovCisgICAgdWludDE2X3QgaGVpZ2h0OyAvKio8ICAqLworfSB4Y2JfcmVjdGFuZ2xlX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9yZWN0YW5nbGVfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3JlY3RhbmdsZV9pdGVyYXRvcl90IHsKKyAgICB4Y2JfcmVjdGFuZ2xlX3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX3JlY3RhbmdsZV9pdGVyYXRvcl90OworCisvKioKKyAqIEBicmllZiB4Y2JfYXJjX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9hcmNfdCB7CisgICAgaW50MTZfdCAgeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICB5OyAvKio8ICAqLworICAgIHVpbnQxNl90IHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90IGhlaWdodDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICBhbmdsZTE7IC8qKjwgICovCisgICAgaW50MTZfdCAgYW5nbGUyOyAvKio8ICAqLworfSB4Y2JfYXJjX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9hcmNfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2FyY19pdGVyYXRvcl90IHsKKyAgICB4Y2JfYXJjX3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX2FyY19pdGVyYXRvcl90OworCisvKioKKyAqIEBicmllZiB4Y2JfZm9ybWF0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9mb3JtYXRfdCB7CisgICAgdWludDhfdCBkZXB0aDsgLyoqPCAgKi8KKyAgICB1aW50OF90IGJpdHNfcGVyX3BpeGVsOyAvKio8ICAqLworICAgIHVpbnQ4X3Qgc2NhbmxpbmVfcGFkOyAvKio8ICAqLworICAgIHVpbnQ4X3QgcGFkMFs1XTsgLyoqPCAgKi8KK30geGNiX2Zvcm1hdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZm9ybWF0X2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9mb3JtYXRfaXRlcmF0b3JfdCB7CisgICAgeGNiX2Zvcm1hdF90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9mb3JtYXRfaXRlcmF0b3JfdDsKKwordHlwZWRlZiBlbnVtIHhjYl92aXN1YWxfY2xhc3NfdCB7CisgICAgWENCX1ZJU1VBTF9DTEFTU19TVEFUSUNfR1JBWSA9IDAsCisgICAgWENCX1ZJU1VBTF9DTEFTU19HUkFZX1NDQUxFID0gMSwKKyAgICBYQ0JfVklTVUFMX0NMQVNTX1NUQVRJQ19DT0xPUiA9IDIsCisgICAgWENCX1ZJU1VBTF9DTEFTU19QU0VVRE9fQ09MT1IgPSAzLAorICAgIFhDQl9WSVNVQUxfQ0xBU1NfVFJVRV9DT0xPUiA9IDQsCisgICAgWENCX1ZJU1VBTF9DTEFTU19ESVJFQ1RfQ09MT1IgPSA1Cit9IHhjYl92aXN1YWxfY2xhc3NfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3Zpc3VhbHR5cGVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3Zpc3VhbHR5cGVfdCB7CisgICAgeGNiX3Zpc3VhbGlkX3QgdmlzdWFsX2lkOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIF9jbGFzczsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBiaXRzX3Blcl9yZ2JfdmFsdWU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgY29sb3JtYXBfZW50cmllczsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICByZWRfbWFzazsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBncmVlbl9tYXNrOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIGJsdWVfbWFzazsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwWzRdOyAvKio8ICAqLworfSB4Y2JfdmlzdWFsdHlwZV90OworCisvKioKKyAqIEBicmllZiB4Y2JfdmlzdWFsdHlwZV9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfdmlzdWFsdHlwZV9pdGVyYXRvcl90IHsKKyAgICB4Y2JfdmlzdWFsdHlwZV90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX3Zpc3VhbHR5cGVfaXRlcmF0b3JfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2RlcHRoX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9kZXB0aF90IHsKKyAgICB1aW50OF90ICBkZXB0aDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHZpc3VhbHNfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbNF07IC8qKjwgICovCit9IHhjYl9kZXB0aF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZGVwdGhfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2RlcHRoX2l0ZXJhdG9yX3QgeworICAgIHhjYl9kZXB0aF90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfZGVwdGhfaXRlcmF0b3JfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9ldmVudF9tYXNrX3QgeworICAgIFhDQl9FVkVOVF9NQVNLX05PX0VWRU5UID0gMCwKKyAgICBYQ0JfRVZFTlRfTUFTS19LRVlfUFJFU1MgPSAxLAorICAgIFhDQl9FVkVOVF9NQVNLX0tFWV9SRUxFQVNFID0gMiwKKyAgICBYQ0JfRVZFTlRfTUFTS19CVVRUT05fUFJFU1MgPSA0LAorICAgIFhDQl9FVkVOVF9NQVNLX0JVVFRPTl9SRUxFQVNFID0gOCwKKyAgICBYQ0JfRVZFTlRfTUFTS19FTlRFUl9XSU5ET1cgPSAxNiwKKyAgICBYQ0JfRVZFTlRfTUFTS19MRUFWRV9XSU5ET1cgPSAzMiwKKyAgICBYQ0JfRVZFTlRfTUFTS19QT0lOVEVSX01PVElPTiA9IDY0LAorICAgIFhDQl9FVkVOVF9NQVNLX1BPSU5URVJfTU9USU9OX0hJTlQgPSAxMjgsCisgICAgWENCX0VWRU5UX01BU0tfQlVUVE9OXzFfTU9USU9OID0gMjU2LAorICAgIFhDQl9FVkVOVF9NQVNLX0JVVFRPTl8yX01PVElPTiA9IDUxMiwKKyAgICBYQ0JfRVZFTlRfTUFTS19CVVRUT05fM19NT1RJT04gPSAxMDI0LAorICAgIFhDQl9FVkVOVF9NQVNLX0JVVFRPTl80X01PVElPTiA9IDIwNDgsCisgICAgWENCX0VWRU5UX01BU0tfQlVUVE9OXzVfTU9USU9OID0gNDA5NiwKKyAgICBYQ0JfRVZFTlRfTUFTS19CVVRUT05fTU9USU9OID0gODE5MiwKKyAgICBYQ0JfRVZFTlRfTUFTS19LRVlNQVBfU1RBVEUgPSAxNjM4NCwKKyAgICBYQ0JfRVZFTlRfTUFTS19FWFBPU1VSRSA9IDMyNzY4LAorICAgIFhDQl9FVkVOVF9NQVNLX1ZJU0lCSUxJVFlfQ0hBTkdFID0gNjU1MzYsCisgICAgWENCX0VWRU5UX01BU0tfU1RSVUNUVVJFX05PVElGWSA9IDEzMTA3MiwKKyAgICBYQ0JfRVZFTlRfTUFTS19SRVNJWkVfUkVESVJFQ1QgPSAyNjIxNDQsCisgICAgWENCX0VWRU5UX01BU0tfU1VCU1RSVUNUVVJFX05PVElGWSA9IDUyNDI4OCwKKyAgICBYQ0JfRVZFTlRfTUFTS19TVUJTVFJVQ1RVUkVfUkVESVJFQ1QgPSAxMDQ4NTc2LAorICAgIFhDQl9FVkVOVF9NQVNLX0ZPQ1VTX0NIQU5HRSA9IDIwOTcxNTIsCisgICAgWENCX0VWRU5UX01BU0tfUFJPUEVSVFlfQ0hBTkdFID0gNDE5NDMwNCwKKyAgICBYQ0JfRVZFTlRfTUFTS19DT0xPUl9NQVBfQ0hBTkdFID0gODM4ODYwOCwKKyAgICBYQ0JfRVZFTlRfTUFTS19PV05FUl9HUkFCX0JVVFRPTiA9IDE2Nzc3MjE2Cit9IHhjYl9ldmVudF9tYXNrX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfYmFja2luZ19zdG9yZV90IHsKKyAgICBYQ0JfQkFDS0lOR19TVE9SRV9OT1RfVVNFRlVMID0gMCwKKyAgICBYQ0JfQkFDS0lOR19TVE9SRV9XSEVOX01BUFBFRCA9IDEsCisgICAgWENCX0JBQ0tJTkdfU1RPUkVfQUxXQVlTID0gMgorfSB4Y2JfYmFja2luZ19zdG9yZV90OworCisvKioKKyAqIEBicmllZiB4Y2Jfc2NyZWVuX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zY3JlZW5fdCB7CisgICAgeGNiX3dpbmRvd190ICAgcm9vdDsgLyoqPCAgKi8KKyAgICB4Y2JfY29sb3JtYXBfdCBkZWZhdWx0X2NvbG9ybWFwOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIHdoaXRlX3BpeGVsOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIGJsYWNrX3BpeGVsOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIGN1cnJlbnRfaW5wdXRfbWFza3M7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgd2lkdGhfaW5fcGl4ZWxzOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGhlaWdodF9pbl9waXhlbHM7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgd2lkdGhfaW5fbWlsbGltZXRlcnM7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgaGVpZ2h0X2luX21pbGxpbWV0ZXJzOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIG1pbl9pbnN0YWxsZWRfbWFwczsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBtYXhfaW5zdGFsbGVkX21hcHM7IC8qKjwgICovCisgICAgeGNiX3Zpc3VhbGlkX3Qgcm9vdF92aXN1YWw7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgYmFja2luZ19zdG9yZXM7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgc2F2ZV91bmRlcnM7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcm9vdF9kZXB0aDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBhbGxvd2VkX2RlcHRoc19sZW47IC8qKjwgICovCit9IHhjYl9zY3JlZW5fdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3NjcmVlbl9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2NyZWVuX2l0ZXJhdG9yX3QgeworICAgIHhjYl9zY3JlZW5fdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2Jfc2NyZWVuX2l0ZXJhdG9yX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9zZXR1cF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXR1cF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIGJ5dGVfb3JkZXI7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBwcm90b2NvbF9tYWpvcl92ZXJzaW9uOyAvKio8ICAqLworICAgIHVpbnQxNl90IHByb3RvY29sX21pbm9yX3ZlcnNpb247IC8qKjwgICovCisgICAgdWludDE2X3QgYXV0aG9yaXphdGlvbl9wcm90b2NvbF9uYW1lX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBhdXRob3JpemF0aW9uX3Byb3RvY29sX2RhdGFfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMl07IC8qKjwgICovCit9IHhjYl9zZXR1cF9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9zZXR1cF9yZXF1ZXN0X2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXR1cF9yZXF1ZXN0X2l0ZXJhdG9yX3QgeworICAgIHhjYl9zZXR1cF9yZXF1ZXN0X3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2Jfc2V0dXBfcmVxdWVzdF9pdGVyYXRvcl90OworCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0dXBfZmFpbGVkX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXR1cF9mYWlsZWRfdCB7CisgICAgdWludDhfdCAgc3RhdHVzOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHJlYXNvbl9sZW47IC8qKjwgICovCisgICAgdWludDE2X3QgcHJvdG9jb2xfbWFqb3JfdmVyc2lvbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBwcm90b2NvbF9taW5vcl92ZXJzaW9uOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX3NldHVwX2ZhaWxlZF90OworCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0dXBfZmFpbGVkX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXR1cF9mYWlsZWRfaXRlcmF0b3JfdCB7CisgICAgeGNiX3NldHVwX2ZhaWxlZF90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9zZXR1cF9mYWlsZWRfaXRlcmF0b3JfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX3QgeworICAgIHVpbnQ4X3QgIHN0YXR1czsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwWzVdOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX3NldHVwX2F1dGhlbnRpY2F0ZV90OworCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfaXRlcmF0b3JfdCB7CisgICAgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfaXRlcmF0b3JfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9pbWFnZV9vcmRlcl90IHsKKyAgICBYQ0JfSU1BR0VfT1JERVJfTFNCX0ZJUlNUID0gMCwKKyAgICBYQ0JfSU1BR0VfT1JERVJfTVNCX0ZJUlNUID0gMQorfSB4Y2JfaW1hZ2Vfb3JkZXJfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldHVwX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXR1cF90IHsKKyAgICB1aW50OF90ICAgICAgIHN0YXR1czsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICBwcm90b2NvbF9tYWpvcl92ZXJzaW9uOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgcHJvdG9jb2xfbWlub3JfdmVyc2lvbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgIHJlbGVhc2VfbnVtYmVyOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgcmVzb3VyY2VfaWRfYmFzZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgIHJlc291cmNlX2lkX21hc2s7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICBtb3Rpb25fYnVmZmVyX3NpemU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICB2ZW5kb3JfbGVuOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgbWF4aW11bV9yZXF1ZXN0X2xlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIHJvb3RzX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIHBpeG1hcF9mb3JtYXRzX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIGltYWdlX2J5dGVfb3JkZXI7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBiaXRtYXBfZm9ybWF0X2JpdF9vcmRlcjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIGJpdG1hcF9mb3JtYXRfc2NhbmxpbmVfdW5pdDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIGJpdG1hcF9mb3JtYXRfc2NhbmxpbmVfcGFkOyAvKio8ICAqLworICAgIHhjYl9rZXljb2RlX3QgbWluX2tleWNvZGU7IC8qKjwgICovCisgICAgeGNiX2tleWNvZGVfdCBtYXhfa2V5Y29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIHBhZDFbNF07IC8qKjwgICovCit9IHhjYl9zZXR1cF90OworCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0dXBfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NldHVwX2l0ZXJhdG9yX3QgeworICAgIHhjYl9zZXR1cF90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2Jfc2V0dXBfaXRlcmF0b3JfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9tb2RfbWFza190IHsKKyAgICBYQ0JfTU9EX01BU0tfU0hJRlQgPSAxLAorICAgIFhDQl9NT0RfTUFTS19MT0NLID0gMiwKKyAgICBYQ0JfTU9EX01BU0tfQ09OVFJPTCA9IDQsCisgICAgWENCX01PRF9NQVNLXzEgPSA4LAorICAgIFhDQl9NT0RfTUFTS18yID0gMTYsCisgICAgWENCX01PRF9NQVNLXzMgPSAzMiwKKyAgICBYQ0JfTU9EX01BU0tfNCA9IDY0LAorICAgIFhDQl9NT0RfTUFTS181ID0gMTI4LAorICAgIFhDQl9NT0RfTUFTS19BTlkgPSAzMjc2OAorfSB4Y2JfbW9kX21hc2tfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9rZXlfYnV0X21hc2tfdCB7CisgICAgWENCX0tFWV9CVVRfTUFTS19TSElGVCA9IDEsCisgICAgWENCX0tFWV9CVVRfTUFTS19MT0NLID0gMiwKKyAgICBYQ0JfS0VZX0JVVF9NQVNLX0NPTlRST0wgPSA0LAorICAgIFhDQl9LRVlfQlVUX01BU0tfTU9EXzEgPSA4LAorICAgIFhDQl9LRVlfQlVUX01BU0tfTU9EXzIgPSAxNiwKKyAgICBYQ0JfS0VZX0JVVF9NQVNLX01PRF8zID0gMzIsCisgICAgWENCX0tFWV9CVVRfTUFTS19NT0RfNCA9IDY0LAorICAgIFhDQl9LRVlfQlVUX01BU0tfTU9EXzUgPSAxMjgsCisgICAgWENCX0tFWV9CVVRfTUFTS19CVVRUT05fMSA9IDI1NiwKKyAgICBYQ0JfS0VZX0JVVF9NQVNLX0JVVFRPTl8yID0gNTEyLAorICAgIFhDQl9LRVlfQlVUX01BU0tfQlVUVE9OXzMgPSAxMDI0LAorICAgIFhDQl9LRVlfQlVUX01BU0tfQlVUVE9OXzQgPSAyMDQ4LAorICAgIFhDQl9LRVlfQlVUX01BU0tfQlVUVE9OXzUgPSA0MDk2Cit9IHhjYl9rZXlfYnV0X21hc2tfdDsKKwordHlwZWRlZiBlbnVtIHhjYl93aW5kb3dfZW51bV90IHsKKyAgICBYQ0JfV0lORE9XX05PTkUgPSAwCit9IHhjYl93aW5kb3dfZW51bV90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfa2V5X3ByZXNzLiAqLworI2RlZmluZSBYQ0JfS0VZX1BSRVNTIDIKKworLyoqCisgKiBAYnJpZWYgeGNiX2tleV9wcmVzc19ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfa2V5X3ByZXNzX2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHhjYl9rZXljb2RlX3QgICBkZXRhaWw7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICByb290OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICBldmVudDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgY2hpbGQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgIHJvb3RfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICAgcm9vdF95OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgICBldmVudF94OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgICBldmVudF95OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBzdGF0ZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgc2FtZV9zY3JlZW47IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHBhZDA7IC8qKjwgICovCit9IHhjYl9rZXlfcHJlc3NfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2tleV9yZWxlYXNlLiAqLworI2RlZmluZSBYQ0JfS0VZX1JFTEVBU0UgMworCit0eXBlZGVmIHhjYl9rZXlfcHJlc3NfZXZlbnRfdCB4Y2Jfa2V5X3JlbGVhc2VfZXZlbnRfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9idXR0b25fbWFza190IHsKKyAgICBYQ0JfQlVUVE9OX01BU0tfMSA9IDI1NiwKKyAgICBYQ0JfQlVUVE9OX01BU0tfMiA9IDUxMiwKKyAgICBYQ0JfQlVUVE9OX01BU0tfMyA9IDEwMjQsCisgICAgWENCX0JVVFRPTl9NQVNLXzQgPSAyMDQ4LAorICAgIFhDQl9CVVRUT05fTUFTS181ID0gNDA5NiwKKyAgICBYQ0JfQlVUVE9OX01BU0tfQU5ZID0gMzI3NjgKK30geGNiX2J1dHRvbl9tYXNrX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9idXR0b25fcHJlc3MuICovCisjZGVmaW5lIFhDQl9CVVRUT05fUFJFU1MgNAorCisvKioKKyAqIEBicmllZiB4Y2JfYnV0dG9uX3ByZXNzX2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9idXR0b25fcHJlc3NfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgeGNiX2J1dHRvbl90ICAgIGRldGFpbDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgIHJvb3Q7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgIGV2ZW50OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICBjaGlsZDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICAgcm9vdF94OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgICByb290X3k7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgIGV2ZW50X3g7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgIGV2ZW50X3k7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIHN0YXRlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBzYW1lX3NjcmVlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgcGFkMDsgLyoqPCAgKi8KK30geGNiX2J1dHRvbl9wcmVzc19ldmVudF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfYnV0dG9uX3JlbGVhc2UuICovCisjZGVmaW5lIFhDQl9CVVRUT05fUkVMRUFTRSA1CisKK3R5cGVkZWYgeGNiX2J1dHRvbl9wcmVzc19ldmVudF90IHhjYl9idXR0b25fcmVsZWFzZV9ldmVudF90OworCit0eXBlZGVmIGVudW0geGNiX21vdGlvbl90IHsKKyAgICBYQ0JfTU9USU9OX05PUk1BTCA9IDAsCisgICAgWENCX01PVElPTl9ISU5UID0gMQorfSB4Y2JfbW90aW9uX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9tb3Rpb25fbm90aWZ5LiAqLworI2RlZmluZSBYQ0JfTU9USU9OX05PVElGWSA2CisKKy8qKgorICogQGJyaWVmIHhjYl9tb3Rpb25fbm90aWZ5X2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9tb3Rpb25fbm90aWZ5X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBkZXRhaWw7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICByb290OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICBldmVudDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgY2hpbGQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgIHJvb3RfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICAgcm9vdF95OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgICBldmVudF94OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgICBldmVudF95OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBzdGF0ZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgc2FtZV9zY3JlZW47IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHBhZDA7IC8qKjwgICovCit9IHhjYl9tb3Rpb25fbm90aWZ5X2V2ZW50X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2Jfbm90aWZ5X2RldGFpbF90IHsKKyAgICBYQ0JfTk9USUZZX0RFVEFJTF9BTkNFU1RPUiA9IDAsCisgICAgWENCX05PVElGWV9ERVRBSUxfVklSVFVBTCA9IDEsCisgICAgWENCX05PVElGWV9ERVRBSUxfSU5GRVJJT1IgPSAyLAorICAgIFhDQl9OT1RJRllfREVUQUlMX05PTkxJTkVBUiA9IDMsCisgICAgWENCX05PVElGWV9ERVRBSUxfTk9OTElORUFSX1ZJUlRVQUwgPSA0LAorICAgIFhDQl9OT1RJRllfREVUQUlMX1BPSU5URVIgPSA1LAorICAgIFhDQl9OT1RJRllfREVUQUlMX1BPSU5URVJfUk9PVCA9IDYsCisgICAgWENCX05PVElGWV9ERVRBSUxfTk9ORSA9IDcKK30geGNiX25vdGlmeV9kZXRhaWxfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9ub3RpZnlfbW9kZV90IHsKKyAgICBYQ0JfTk9USUZZX01PREVfTk9STUFMID0gMCwKKyAgICBYQ0JfTk9USUZZX01PREVfR1JBQiA9IDEsCisgICAgWENCX05PVElGWV9NT0RFX1VOR1JBQiA9IDIsCisgICAgWENCX05PVElGWV9NT0RFX1dISUxFX0dSQUJCRUQgPSAzCit9IHhjYl9ub3RpZnlfbW9kZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZW50ZXJfbm90aWZ5LiAqLworI2RlZmluZSBYQ0JfRU5URVJfTk9USUZZIDcKKworLyoqCisgKiBAYnJpZWYgeGNiX2VudGVyX25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZW50ZXJfbm90aWZ5X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBkZXRhaWw7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICByb290OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICBldmVudDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgY2hpbGQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgIHJvb3RfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICAgcm9vdF95OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgICBldmVudF94OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgICBldmVudF95OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBzdGF0ZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgc2FtZV9zY3JlZW5fZm9jdXM7IC8qKjwgICovCit9IHhjYl9lbnRlcl9ub3RpZnlfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2xlYXZlX25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX0xFQVZFX05PVElGWSA4CisKK3R5cGVkZWYgeGNiX2VudGVyX25vdGlmeV9ldmVudF90IHhjYl9sZWF2ZV9ub3RpZnlfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2ZvY3VzX2luLiAqLworI2RlZmluZSBYQ0JfRk9DVVNfSU4gOQorCisvKioKKyAqIEBicmllZiB4Y2JfZm9jdXNfaW5fZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2ZvY3VzX2luX2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBkZXRhaWw7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBldmVudDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMFszXTsgLyoqPCAgKi8KK30geGNiX2ZvY3VzX2luX2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9mb2N1c19vdXQuICovCisjZGVmaW5lIFhDQl9GT0NVU19PVVQgMTAKKwordHlwZWRlZiB4Y2JfZm9jdXNfaW5fZXZlbnRfdCB4Y2JfZm9jdXNfb3V0X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9rZXltYXBfbm90aWZ5LiAqLworI2RlZmluZSBYQ0JfS0VZTUFQX05PVElGWSAxMQorCisvKioKKyAqIEBicmllZiB4Y2Jfa2V5bWFwX25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfa2V5bWFwX25vdGlmeV9ldmVudF90IHsKKyAgICB1aW50OF90IHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCBrZXlzWzMxXTsgLyoqPCAgKi8KK30geGNiX2tleW1hcF9ub3RpZnlfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2V4cG9zZS4gKi8KKyNkZWZpbmUgWENCX0VYUE9TRSAxMgorCisvKioKKyAqIEBicmllZiB4Y2JfZXhwb3NlX2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9leHBvc2VfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHg7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHk7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBoZWlnaHQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGNvdW50OyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQxWzJdOyAvKio8ICAqLworfSB4Y2JfZXhwb3NlX2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9ncmFwaGljc19leHBvc3VyZS4gKi8KKyNkZWZpbmUgWENCX0dSQVBISUNTX0VYUE9TVVJFIDEzCisKKy8qKgorICogQGJyaWVmIHhjYl9ncmFwaGljc19leHBvc3VyZV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhcGhpY3NfZXhwb3N1cmVfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHg7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgeTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBoZWlnaHQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbWlub3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGNvdW50OyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQxWzNdOyAvKio8ICAqLworfSB4Y2JfZ3JhcGhpY3NfZXhwb3N1cmVfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX25vX2V4cG9zdXJlLiAqLworI2RlZmluZSBYQ0JfTk9fRVhQT1NVUkUgMTQKKworLyoqCisgKiBAYnJpZWYgeGNiX25vX2V4cG9zdXJlX2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9ub19leHBvc3VyZV9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbWlub3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQxOyAvKio8ICAqLworfSB4Y2Jfbm9fZXhwb3N1cmVfZXZlbnRfdDsKKwordHlwZWRlZiBlbnVtIHhjYl92aXNpYmlsaXR5X3QgeworICAgIFhDQl9WSVNJQklMSVRZX1VOT0JTQ1VSRUQgPSAwLAorICAgIFhDQl9WSVNJQklMSVRZX1BBUlRJQUxMWV9PQlNDVVJFRCA9IDEsCisgICAgWENCX1ZJU0lCSUxJVFlfRlVMTFlfT0JTQ1VSRUQgPSAyCit9IHhjYl92aXNpYmlsaXR5X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl92aXNpYmlsaXR5X25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX1ZJU0lCSUxJVFlfTk9USUZZIDE1CisKKy8qKgorICogQGJyaWVmIHhjYl92aXNpYmlsaXR5X25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfdmlzaWJpbGl0eV9ub3RpZnlfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHN0YXRlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQxWzNdOyAvKio8ICAqLworfSB4Y2JfdmlzaWJpbGl0eV9ub3RpZnlfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NyZWF0ZV9ub3RpZnkuICovCisjZGVmaW5lIFhDQl9DUkVBVEVfTk9USUZZIDE2CisKKy8qKgorICogQGJyaWVmIHhjYl9jcmVhdGVfbm90aWZ5X2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jcmVhdGVfbm90aWZ5X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgcGFyZW50OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHk7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBoZWlnaHQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGJvcmRlcl93aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgb3ZlcnJpZGVfcmVkaXJlY3Q7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDE7IC8qKjwgICovCit9IHhjYl9jcmVhdGVfbm90aWZ5X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9kZXN0cm95X25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX0RFU1RST1lfTk9USUZZIDE3CisKKy8qKgorICogQGJyaWVmIHhjYl9kZXN0cm95X25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZGVzdHJveV9ub3RpZnlfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBldmVudDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfZGVzdHJveV9ub3RpZnlfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3VubWFwX25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX1VOTUFQX05PVElGWSAxOAorCisvKioKKyAqIEBicmllZiB4Y2JfdW5tYXBfbm90aWZ5X2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl91bm1hcF9ub3RpZnlfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBldmVudDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBmcm9tX2NvbmZpZ3VyZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMVszXTsgLyoqPCAgKi8KK30geGNiX3VubWFwX25vdGlmeV9ldmVudF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfbWFwX25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX01BUF9OT1RJRlkgMTkKKworLyoqCisgKiBAYnJpZWYgeGNiX21hcF9ub3RpZnlfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX21hcF9ub3RpZnlfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBldmVudDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBvdmVycmlkZV9yZWRpcmVjdDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMVszXTsgLyoqPCAgKi8KK30geGNiX21hcF9ub3RpZnlfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX21hcF9yZXF1ZXN0LiAqLworI2RlZmluZSBYQ0JfTUFQX1JFUVVFU1QgMjAKKworLyoqCisgKiBAYnJpZWYgeGNiX21hcF9yZXF1ZXN0X2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9tYXBfcmVxdWVzdF9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHBhcmVudDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfbWFwX3JlcXVlc3RfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3JlcGFyZW50X25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX1JFUEFSRU5UX05PVElGWSAyMQorCisvKioKKyAqIEBicmllZiB4Y2JfcmVwYXJlbnRfbm90aWZ5X2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9yZXBhcmVudF9ub3RpZnlfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBldmVudDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBwYXJlbnQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHk7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIG92ZXJyaWRlX3JlZGlyZWN0OyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQxWzNdOyAvKio8ICAqLworfSB4Y2JfcmVwYXJlbnRfbm90aWZ5X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jb25maWd1cmVfbm90aWZ5LiAqLworI2RlZmluZSBYQ0JfQ09ORklHVVJFX05PVElGWSAyMgorCisvKioKKyAqIEBicmllZiB4Y2JfY29uZmlndXJlX25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY29uZmlndXJlX25vdGlmeV9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IGV2ZW50OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IGFib3ZlX3NpYmxpbmc7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHk7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBoZWlnaHQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGJvcmRlcl93aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgb3ZlcnJpZGVfcmVkaXJlY3Q7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDE7IC8qKjwgICovCit9IHhjYl9jb25maWd1cmVfbm90aWZ5X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jb25maWd1cmVfcmVxdWVzdC4gKi8KKyNkZWZpbmUgWENCX0NPTkZJR1VSRV9SRVFVRVNUIDIzCisKKy8qKgorICogQGJyaWVmIHhjYl9jb25maWd1cmVfcmVxdWVzdF9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY29uZmlndXJlX3JlcXVlc3RfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHN0YWNrX21vZGU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBwYXJlbnQ7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgc2libGluZzsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgeTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgd2lkdGg7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGhlaWdodDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgYm9yZGVyX3dpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICB2YWx1ZV9tYXNrOyAvKio8ICAqLworfSB4Y2JfY29uZmlndXJlX3JlcXVlc3RfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dyYXZpdHlfbm90aWZ5LiAqLworI2RlZmluZSBYQ0JfR1JBVklUWV9OT1RJRlkgMjQKKworLyoqCisgKiBAYnJpZWYgeGNiX2dyYXZpdHlfbm90aWZ5X2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9ncmF2aXR5X25vdGlmeV9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IGV2ZW50OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHk7IC8qKjwgICovCit9IHhjYl9ncmF2aXR5X25vdGlmeV9ldmVudF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcmVzaXplX3JlcXVlc3QuICovCisjZGVmaW5lIFhDQl9SRVNJWkVfUkVRVUVTVCAyNQorCisvKioKKyAqIEBicmllZiB4Y2JfcmVzaXplX3JlcXVlc3RfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3Jlc2l6ZV9yZXF1ZXN0X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgaGVpZ2h0OyAvKio8ICAqLworfSB4Y2JfcmVzaXplX3JlcXVlc3RfZXZlbnRfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9wbGFjZV90IHsKKyAgICBYQ0JfUExBQ0VfT05fVE9QID0gMCwKKyAgICBYQ0JfUExBQ0VfT05fQk9UVE9NID0gMQorfSB4Y2JfcGxhY2VfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NpcmN1bGF0ZV9ub3RpZnkuICovCisjZGVmaW5lIFhDQl9DSVJDVUxBVEVfTk9USUZZIDI2CisKKy8qKgorICogQGJyaWVmIHhjYl9jaXJjdWxhdGVfbm90aWZ5X2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jaXJjdWxhdGVfbm90aWZ5X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgZXZlbnQ7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMVs0XTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGxhY2U7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDJbM107IC8qKjwgICovCit9IHhjYl9jaXJjdWxhdGVfbm90aWZ5X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jaXJjdWxhdGVfcmVxdWVzdC4gKi8KKyNkZWZpbmUgWENCX0NJUkNVTEFURV9SRVFVRVNUIDI3CisKK3R5cGVkZWYgeGNiX2NpcmN1bGF0ZV9ub3RpZnlfZXZlbnRfdCB4Y2JfY2lyY3VsYXRlX3JlcXVlc3RfZXZlbnRfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9wcm9wZXJ0eV90IHsKKyAgICBYQ0JfUFJPUEVSVFlfTkVXX1ZBTFVFID0gMCwKKyAgICBYQ0JfUFJPUEVSVFlfREVMRVRFID0gMQorfSB4Y2JfcHJvcGVydHlfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3Byb3BlcnR5X25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX1BST1BFUlRZX05PVElGWSAyOAorCisvKioKKyAqIEBicmllZiB4Y2JfcHJvcGVydHlfbm90aWZ5X2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9wcm9wZXJ0eV9ub3RpZnlfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICB3aW5kb3c7IC8qKjwgICovCisgICAgeGNiX2F0b21fdCAgICAgIGF0b207IC8qKjwgICovCisgICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHN0YXRlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQxWzNdOyAvKio8ICAqLworfSB4Y2JfcHJvcGVydHlfbm90aWZ5X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9zZWxlY3Rpb25fY2xlYXIuICovCisjZGVmaW5lIFhDQl9TRUxFQ1RJT05fQ0xFQVIgMjkKKworLyoqCisgKiBAYnJpZWYgeGNiX3NlbGVjdGlvbl9jbGVhcl9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2VsZWN0aW9uX2NsZWFyX2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgb3duZXI7IC8qKjwgICovCisgICAgeGNiX2F0b21fdCAgICAgIHNlbGVjdGlvbjsgLyoqPCAgKi8KK30geGNiX3NlbGVjdGlvbl9jbGVhcl9ldmVudF90OworCit0eXBlZGVmIGVudW0geGNiX3RpbWVfdCB7CisgICAgWENCX1RJTUVfQ1VSUkVOVF9USU1FID0gMAorfSB4Y2JfdGltZV90OworCit0eXBlZGVmIGVudW0geGNiX2F0b21fZW51bV90IHsKKyAgICBYQ0JfQVRPTV9OT05FID0gMCwKKyAgICBYQ0JfQVRPTV9BTlkgPSAwLAorICAgIFhDQl9BVE9NX1BSSU1BUlksCisgICAgWENCX0FUT01fU0VDT05EQVJZLAorICAgIFhDQl9BVE9NX0FSQywKKyAgICBYQ0JfQVRPTV9BVE9NLAorICAgIFhDQl9BVE9NX0JJVE1BUCwKKyAgICBYQ0JfQVRPTV9DQVJESU5BTCwKKyAgICBYQ0JfQVRPTV9DT0xPUk1BUCwKKyAgICBYQ0JfQVRPTV9DVVJTT1IsCisgICAgWENCX0FUT01fQ1VUX0JVRkZFUjAsCisgICAgWENCX0FUT01fQ1VUX0JVRkZFUjEsCisgICAgWENCX0FUT01fQ1VUX0JVRkZFUjIsCisgICAgWENCX0FUT01fQ1VUX0JVRkZFUjMsCisgICAgWENCX0FUT01fQ1VUX0JVRkZFUjQsCisgICAgWENCX0FUT01fQ1VUX0JVRkZFUjUsCisgICAgWENCX0FUT01fQ1VUX0JVRkZFUjYsCisgICAgWENCX0FUT01fQ1VUX0JVRkZFUjcsCisgICAgWENCX0FUT01fRFJBV0FCTEUsCisgICAgWENCX0FUT01fRk9OVCwKKyAgICBYQ0JfQVRPTV9JTlRFR0VSLAorICAgIFhDQl9BVE9NX1BJWE1BUCwKKyAgICBYQ0JfQVRPTV9QT0lOVCwKKyAgICBYQ0JfQVRPTV9SRUNUQU5HTEUsCisgICAgWENCX0FUT01fUkVTT1VSQ0VfTUFOQUdFUiwKKyAgICBYQ0JfQVRPTV9SR0JfQ09MT1JfTUFQLAorICAgIFhDQl9BVE9NX1JHQl9CRVNUX01BUCwKKyAgICBYQ0JfQVRPTV9SR0JfQkxVRV9NQVAsCisgICAgWENCX0FUT01fUkdCX0RFRkFVTFRfTUFQLAorICAgIFhDQl9BVE9NX1JHQl9HUkFZX01BUCwKKyAgICBYQ0JfQVRPTV9SR0JfR1JFRU5fTUFQLAorICAgIFhDQl9BVE9NX1JHQl9SRURfTUFQLAorICAgIFhDQl9BVE9NX1NUUklORywKKyAgICBYQ0JfQVRPTV9WSVNVQUxJRCwKKyAgICBYQ0JfQVRPTV9XSU5ET1csCisgICAgWENCX0FUT01fV01fQ09NTUFORCwKKyAgICBYQ0JfQVRPTV9XTV9ISU5UUywKKyAgICBYQ0JfQVRPTV9XTV9DTElFTlRfTUFDSElORSwKKyAgICBYQ0JfQVRPTV9XTV9JQ09OX05BTUUsCisgICAgWENCX0FUT01fV01fSUNPTl9TSVpFLAorICAgIFhDQl9BVE9NX1dNX05BTUUsCisgICAgWENCX0FUT01fV01fTk9STUFMX0hJTlRTLAorICAgIFhDQl9BVE9NX1dNX1NJWkVfSElOVFMsCisgICAgWENCX0FUT01fV01fWk9PTV9ISU5UUywKKyAgICBYQ0JfQVRPTV9NSU5fU1BBQ0UsCisgICAgWENCX0FUT01fTk9STV9TUEFDRSwKKyAgICBYQ0JfQVRPTV9NQVhfU1BBQ0UsCisgICAgWENCX0FUT01fRU5EX1NQQUNFLAorICAgIFhDQl9BVE9NX1NVUEVSU0NSSVBUX1gsCisgICAgWENCX0FUT01fU1VQRVJTQ1JJUFRfWSwKKyAgICBYQ0JfQVRPTV9TVUJTQ1JJUFRfWCwKKyAgICBYQ0JfQVRPTV9TVUJTQ1JJUFRfWSwKKyAgICBYQ0JfQVRPTV9VTkRFUkxJTkVfUE9TSVRJT04sCisgICAgWENCX0FUT01fVU5ERVJMSU5FX1RISUNLTkVTUywKKyAgICBYQ0JfQVRPTV9TVFJJS0VPVVRfQVNDRU5ULAorICAgIFhDQl9BVE9NX1NUUklLRU9VVF9ERVNDRU5ULAorICAgIFhDQl9BVE9NX0lUQUxJQ19BTkdMRSwKKyAgICBYQ0JfQVRPTV9YX0hFSUdIVCwKKyAgICBYQ0JfQVRPTV9RVUFEX1dJRFRILAorICAgIFhDQl9BVE9NX1dFSUdIVCwKKyAgICBYQ0JfQVRPTV9QT0lOVF9TSVpFLAorICAgIFhDQl9BVE9NX1JFU09MVVRJT04sCisgICAgWENCX0FUT01fQ09QWVJJR0hULAorICAgIFhDQl9BVE9NX05PVElDRSwKKyAgICBYQ0JfQVRPTV9GT05UX05BTUUsCisgICAgWENCX0FUT01fRkFNSUxZX05BTUUsCisgICAgWENCX0FUT01fRlVMTF9OQU1FLAorICAgIFhDQl9BVE9NX0NBUF9IRUlHSFQsCisgICAgWENCX0FUT01fV01fQ0xBU1MsCisgICAgWENCX0FUT01fV01fVFJBTlNJRU5UX0ZPUgorfSB4Y2JfYXRvbV9lbnVtX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9zZWxlY3Rpb25fcmVxdWVzdC4gKi8KKyNkZWZpbmUgWENCX1NFTEVDVElPTl9SRVFVRVNUIDMwCisKKy8qKgorICogQGJyaWVmIHhjYl9zZWxlY3Rpb25fcmVxdWVzdF9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2VsZWN0aW9uX3JlcXVlc3RfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICBvd25lcjsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgcmVxdWVzdG9yOyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgICAgICBzZWxlY3Rpb247IC8qKjwgICovCisgICAgeGNiX2F0b21fdCAgICAgIHRhcmdldDsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90ICAgICAgcHJvcGVydHk7IC8qKjwgICovCit9IHhjYl9zZWxlY3Rpb25fcmVxdWVzdF9ldmVudF90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfc2VsZWN0aW9uX25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX1NFTEVDVElPTl9OT1RJRlkgMzEKKworLyoqCisgKiBAYnJpZWYgeGNiX3NlbGVjdGlvbl9ub3RpZnlfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NlbGVjdGlvbl9ub3RpZnlfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICByZXF1ZXN0b3I7IC8qKjwgICovCisgICAgeGNiX2F0b21fdCAgICAgIHNlbGVjdGlvbjsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90ICAgICAgdGFyZ2V0OyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgICAgICBwcm9wZXJ0eTsgLyoqPCAgKi8KK30geGNiX3NlbGVjdGlvbl9ub3RpZnlfZXZlbnRfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9jb2xvcm1hcF9zdGF0ZV90IHsKKyAgICBYQ0JfQ09MT1JNQVBfU1RBVEVfVU5JTlNUQUxMRUQgPSAwLAorICAgIFhDQl9DT0xPUk1BUF9TVEFURV9JTlNUQUxMRUQgPSAxCit9IHhjYl9jb2xvcm1hcF9zdGF0ZV90OworCit0eXBlZGVmIGVudW0geGNiX2NvbG9ybWFwX2VudW1fdCB7CisgICAgWENCX0NPTE9STUFQX05PTkUgPSAwCit9IHhjYl9jb2xvcm1hcF9lbnVtX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jb2xvcm1hcF9ub3RpZnkuICovCisjZGVmaW5lIFhDQl9DT0xPUk1BUF9OT1RJRlkgMzIKKworLyoqCisgKiBAYnJpZWYgeGNiX2NvbG9ybWFwX25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY29sb3JtYXBfbm90aWZ5X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICB3aW5kb3c7IC8qKjwgICovCisgICAgeGNiX2NvbG9ybWFwX3QgY29sb3JtYXA7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgX25ldzsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBzdGF0ZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQxWzJdOyAvKio8ICAqLworfSB4Y2JfY29sb3JtYXBfbm90aWZ5X2V2ZW50X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX3QKKyAqKi8KK3R5cGVkZWYgdW5pb24geGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfdCB7CisgICAgdWludDhfdCAgZGF0YThbMjBdOyAvKio8ICAqLworICAgIHVpbnQxNl90IGRhdGExNlsxMF07IC8qKjwgICovCisgICAgdWludDMyX3QgZGF0YTMyWzVdOyAvKio8ICAqLworfSB4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV90OworCisvKioKKyAqIEBicmllZiB4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV9pdGVyYXRvcl90IHsKKyAgICB4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfaXRlcmF0b3JfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NsaWVudF9tZXNzYWdlLiAqLworI2RlZmluZSBYQ0JfQ0xJRU5UX01FU1NBR0UgMzMKKworLyoqCisgKiBAYnJpZWYgeGNiX2NsaWVudF9tZXNzYWdlX2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jbGllbnRfbWVzc2FnZV9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICBmb3JtYXQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgICAgICAgICAgIHdpbmRvdzsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90ICAgICAgICAgICAgICAgIHR5cGU7IC8qKjwgICovCisgICAgeGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfdCBkYXRhOyAvKio8ICAqLworfSB4Y2JfY2xpZW50X21lc3NhZ2VfZXZlbnRfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9tYXBwaW5nX3QgeworICAgIFhDQl9NQVBQSU5HX01PRElGSUVSID0gMCwKKyAgICBYQ0JfTUFQUElOR19LRVlCT0FSRCA9IDEsCisgICAgWENCX01BUFBJTkdfUE9JTlRFUiA9IDIKK30geGNiX21hcHBpbmdfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX21hcHBpbmdfbm90aWZ5LiAqLworI2RlZmluZSBYQ0JfTUFQUElOR19OT1RJRlkgMzQKKworLyoqCisgKiBAYnJpZWYgeGNiX21hcHBpbmdfbm90aWZ5X2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9tYXBwaW5nX25vdGlmeV9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICByZXF1ZXN0OyAvKio8ICAqLworICAgIHhjYl9rZXljb2RlX3QgZmlyc3Rfa2V5Y29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIGNvdW50OyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgcGFkMTsgLyoqPCAgKi8KK30geGNiX21hcHBpbmdfbm90aWZ5X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9yZXF1ZXN0LiAqLworI2RlZmluZSBYQ0JfUkVRVUVTVCAxCisKKy8qKgorICogQGJyaWVmIHhjYl9yZXF1ZXN0X2Vycm9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9yZXF1ZXN0X2Vycm9yX3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgZXJyb3JfY29kZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBiYWRfdmFsdWU7IC8qKjwgICovCisgICAgdWludDE2X3QgbWlub3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworfSB4Y2JfcmVxdWVzdF9lcnJvcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfdmFsdWUuICovCisjZGVmaW5lIFhDQl9WQUxVRSAyCisKKy8qKgorICogQGJyaWVmIHhjYl92YWx1ZV9lcnJvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfdmFsdWVfZXJyb3JfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBlcnJvcl9jb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGJhZF92YWx1ZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBtaW5vcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCit9IHhjYl92YWx1ZV9lcnJvcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfd2luZG93LiAqLworI2RlZmluZSBYQ0JfV0lORE9XIDMKKwordHlwZWRlZiB4Y2JfdmFsdWVfZXJyb3JfdCB4Y2Jfd2luZG93X2Vycm9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9waXhtYXAuICovCisjZGVmaW5lIFhDQl9QSVhNQVAgNAorCit0eXBlZGVmIHhjYl92YWx1ZV9lcnJvcl90IHhjYl9waXhtYXBfZXJyb3JfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2F0b20uICovCisjZGVmaW5lIFhDQl9BVE9NIDUKKwordHlwZWRlZiB4Y2JfdmFsdWVfZXJyb3JfdCB4Y2JfYXRvbV9lcnJvcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY3Vyc29yLiAqLworI2RlZmluZSBYQ0JfQ1VSU09SIDYKKwordHlwZWRlZiB4Y2JfdmFsdWVfZXJyb3JfdCB4Y2JfY3Vyc29yX2Vycm9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9mb250LiAqLworI2RlZmluZSBYQ0JfRk9OVCA3CisKK3R5cGVkZWYgeGNiX3ZhbHVlX2Vycm9yX3QgeGNiX2ZvbnRfZXJyb3JfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX21hdGNoLiAqLworI2RlZmluZSBYQ0JfTUFUQ0ggOAorCit0eXBlZGVmIHhjYl9yZXF1ZXN0X2Vycm9yX3QgeGNiX21hdGNoX2Vycm9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9kcmF3YWJsZS4gKi8KKyNkZWZpbmUgWENCX0RSQVdBQkxFIDkKKwordHlwZWRlZiB4Y2JfdmFsdWVfZXJyb3JfdCB4Y2JfZHJhd2FibGVfZXJyb3JfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2FjY2Vzcy4gKi8KKyNkZWZpbmUgWENCX0FDQ0VTUyAxMAorCit0eXBlZGVmIHhjYl9yZXF1ZXN0X2Vycm9yX3QgeGNiX2FjY2Vzc19lcnJvcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfYWxsb2MuICovCisjZGVmaW5lIFhDQl9BTExPQyAxMQorCit0eXBlZGVmIHhjYl9yZXF1ZXN0X2Vycm9yX3QgeGNiX2FsbG9jX2Vycm9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jb2xvcm1hcC4gKi8KKyNkZWZpbmUgWENCX0NPTE9STUFQIDEyCisKK3R5cGVkZWYgeGNiX3ZhbHVlX2Vycm9yX3QgeGNiX2NvbG9ybWFwX2Vycm9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9nX2NvbnRleHQuICovCisjZGVmaW5lIFhDQl9HX0NPTlRFWFQgMTMKKwordHlwZWRlZiB4Y2JfdmFsdWVfZXJyb3JfdCB4Y2JfZ19jb250ZXh0X2Vycm9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9pZF9jaG9pY2UuICovCisjZGVmaW5lIFhDQl9JRF9DSE9JQ0UgMTQKKwordHlwZWRlZiB4Y2JfdmFsdWVfZXJyb3JfdCB4Y2JfaWRfY2hvaWNlX2Vycm9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9uYW1lLiAqLworI2RlZmluZSBYQ0JfTkFNRSAxNQorCit0eXBlZGVmIHhjYl9yZXF1ZXN0X2Vycm9yX3QgeGNiX25hbWVfZXJyb3JfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2xlbmd0aC4gKi8KKyNkZWZpbmUgWENCX0xFTkdUSCAxNgorCit0eXBlZGVmIHhjYl9yZXF1ZXN0X2Vycm9yX3QgeGNiX2xlbmd0aF9lcnJvcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfaW1wbGVtZW50YXRpb24uICovCisjZGVmaW5lIFhDQl9JTVBMRU1FTlRBVElPTiAxNworCit0eXBlZGVmIHhjYl9yZXF1ZXN0X2Vycm9yX3QgeGNiX2ltcGxlbWVudGF0aW9uX2Vycm9yX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2Jfd2luZG93X2NsYXNzX3QgeworICAgIFhDQl9XSU5ET1dfQ0xBU1NfQ09QWV9GUk9NX1BBUkVOVCA9IDAsCisgICAgWENCX1dJTkRPV19DTEFTU19JTlBVVF9PVVRQVVQgPSAxLAorICAgIFhDQl9XSU5ET1dfQ0xBU1NfSU5QVVRfT05MWSA9IDIKK30geGNiX3dpbmRvd19jbGFzc190OworCit0eXBlZGVmIGVudW0geGNiX2N3X3QgeworICAgIFhDQl9DV19CQUNLX1BJWE1BUCA9IDEsCisgICAgWENCX0NXX0JBQ0tfUElYRUwgPSAyLAorICAgIFhDQl9DV19CT1JERVJfUElYTUFQID0gNCwKKyAgICBYQ0JfQ1dfQk9SREVSX1BJWEVMID0gOCwKKyAgICBYQ0JfQ1dfQklUX0dSQVZJVFkgPSAxNiwKKyAgICBYQ0JfQ1dfV0lOX0dSQVZJVFkgPSAzMiwKKyAgICBYQ0JfQ1dfQkFDS0lOR19TVE9SRSA9IDY0LAorICAgIFhDQl9DV19CQUNLSU5HX1BMQU5FUyA9IDEyOCwKKyAgICBYQ0JfQ1dfQkFDS0lOR19QSVhFTCA9IDI1NiwKKyAgICBYQ0JfQ1dfT1ZFUlJJREVfUkVESVJFQ1QgPSA1MTIsCisgICAgWENCX0NXX1NBVkVfVU5ERVIgPSAxMDI0LAorICAgIFhDQl9DV19FVkVOVF9NQVNLID0gMjA0OCwKKyAgICBYQ0JfQ1dfRE9OVF9QUk9QQUdBVEUgPSA0MDk2LAorICAgIFhDQl9DV19DT0xPUk1BUCA9IDgxOTIsCisgICAgWENCX0NXX0NVUlNPUiA9IDE2Mzg0Cit9IHhjYl9jd190OworCit0eXBlZGVmIGVudW0geGNiX2JhY2tfcGl4bWFwX3QgeworICAgIFhDQl9CQUNLX1BJWE1BUF9OT05FID0gMCwKKyAgICBYQ0JfQkFDS19QSVhNQVBfUEFSRU5UX1JFTEFUSVZFID0gMQorfSB4Y2JfYmFja19waXhtYXBfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9ncmF2aXR5X3QgeworICAgIFhDQl9HUkFWSVRZX0JJVF9GT1JHRVQgPSAwLAorICAgIFhDQl9HUkFWSVRZX1dJTl9VTk1BUCA9IDAsCisgICAgWENCX0dSQVZJVFlfTk9SVEhfV0VTVCA9IDEsCisgICAgWENCX0dSQVZJVFlfTk9SVEggPSAyLAorICAgIFhDQl9HUkFWSVRZX05PUlRIX0VBU1QgPSAzLAorICAgIFhDQl9HUkFWSVRZX1dFU1QgPSA0LAorICAgIFhDQl9HUkFWSVRZX0NFTlRFUiA9IDUsCisgICAgWENCX0dSQVZJVFlfRUFTVCA9IDYsCisgICAgWENCX0dSQVZJVFlfU09VVEhfV0VTVCA9IDcsCisgICAgWENCX0dSQVZJVFlfU09VVEggPSA4LAorICAgIFhDQl9HUkFWSVRZX1NPVVRIX0VBU1QgPSA5LAorICAgIFhDQl9HUkFWSVRZX1NUQVRJQyA9IDEwCit9IHhjYl9ncmF2aXR5X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jcmVhdGVfd2luZG93LiAqLworI2RlZmluZSBYQ0JfQ1JFQVRFX1dJTkRPVyAxCisKKy8qKgorICogQGJyaWVmIHhjYl9jcmVhdGVfd2luZG93X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NyZWF0ZV93aW5kb3dfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgZGVwdGg7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgIHdpZDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICBwYXJlbnQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICB5OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGhlaWdodDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBib3JkZXJfd2lkdGg7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgX2NsYXNzOyAvKio8ICAqLworICAgIHhjYl92aXN1YWxpZF90IHZpc3VhbDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICB2YWx1ZV9tYXNrOyAvKio8ICAqLworfSB4Y2JfY3JlYXRlX3dpbmRvd19yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jaGFuZ2Vfd2luZG93X2F0dHJpYnV0ZXMuICovCisjZGVmaW5lIFhDQl9DSEFOR0VfV0lORE9XX0FUVFJJQlVURVMgMgorCisvKioKKyAqIEBicmllZiB4Y2JfY2hhbmdlX3dpbmRvd19hdHRyaWJ1dGVzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYW5nZV93aW5kb3dfYXR0cmlidXRlc19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICB2YWx1ZV9tYXNrOyAvKio8ICAqLworfSB4Y2JfY2hhbmdlX3dpbmRvd19hdHRyaWJ1dGVzX3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9tYXBfc3RhdGVfdCB7CisgICAgWENCX01BUF9TVEFURV9VTk1BUFBFRCA9IDAsCisgICAgWENCX01BUF9TVEFURV9VTlZJRVdBQkxFID0gMSwKKyAgICBYQ0JfTUFQX1NUQVRFX1ZJRVdBQkxFID0gMgorfSB4Y2JfbWFwX3N0YXRlX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2dldF93aW5kb3dfYXR0cmlidXRlc19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF93aW5kb3dfYXR0cmlidXRlcy4gKi8KKyNkZWZpbmUgWENCX0dFVF9XSU5ET1dfQVRUUklCVVRFUyAzCisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCit9IHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfcmVwbHlfdCB7CisgICAgdWludDhfdCAgICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBiYWNraW5nX3N0b3JlOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfdmlzdWFsaWRfdCB2aXN1YWw7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgX2NsYXNzOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIGJpdF9ncmF2aXR5OyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHdpbl9ncmF2aXR5OyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIGJhY2tpbmdfcGxhbmVzOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIGJhY2tpbmdfcGl4ZWw7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgc2F2ZV91bmRlcjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBtYXBfaXNfaW5zdGFsbGVkOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIG1hcF9zdGF0ZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBvdmVycmlkZV9yZWRpcmVjdDsgLyoqPCAgKi8KKyAgICB4Y2JfY29sb3JtYXBfdCBjb2xvcm1hcDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBhbGxfZXZlbnRfbWFza3M7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICAgeW91cl9ldmVudF9tYXNrOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGRvX25vdF9wcm9wYWdhdGVfbWFzazsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwWzJdOyAvKio8ICAqLworfSB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcGx5X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9kZXN0cm95X3dpbmRvdy4gKi8KKyNkZWZpbmUgWENCX0RFU1RST1lfV0lORE9XIDQKKworLyoqCisgKiBAYnJpZWYgeGNiX2Rlc3Ryb3lfd2luZG93X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2Rlc3Ryb3lfd2luZG93X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCit9IHhjYl9kZXN0cm95X3dpbmRvd19yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9kZXN0cm95X3N1YndpbmRvd3MuICovCisjZGVmaW5lIFhDQl9ERVNUUk9ZX1NVQldJTkRPV1MgNQorCisvKioKKyAqIEBicmllZiB4Y2JfZGVzdHJveV9zdWJ3aW5kb3dzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2Rlc3Ryb3lfc3Vid2luZG93c19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfZGVzdHJveV9zdWJ3aW5kb3dzX3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9zZXRfbW9kZV90IHsKKyAgICBYQ0JfU0VUX01PREVfSU5TRVJUID0gMCwKKyAgICBYQ0JfU0VUX01PREVfREVMRVRFID0gMQorfSB4Y2Jfc2V0X21vZGVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NoYW5nZV9zYXZlX3NldC4gKi8KKyNkZWZpbmUgWENCX0NIQU5HRV9TQVZFX1NFVCA2CisKKy8qKgorICogQGJyaWVmIHhjYl9jaGFuZ2Vfc2F2ZV9zZXRfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY2hhbmdlX3NhdmVfc2V0X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCit9IHhjYl9jaGFuZ2Vfc2F2ZV9zZXRfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcmVwYXJlbnRfd2luZG93LiAqLworI2RlZmluZSBYQ0JfUkVQQVJFTlRfV0lORE9XIDcKKworLyoqCisgKiBAYnJpZWYgeGNiX3JlcGFyZW50X3dpbmRvd19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9yZXBhcmVudF93aW5kb3dfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgcGFyZW50OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB4OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB5OyAvKio8ICAqLworfSB4Y2JfcmVwYXJlbnRfd2luZG93X3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX21hcF93aW5kb3cuICovCisjZGVmaW5lIFhDQl9NQVBfV0lORE9XIDgKKworLyoqCisgKiBAYnJpZWYgeGNiX21hcF93aW5kb3dfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbWFwX3dpbmRvd19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfbWFwX3dpbmRvd19yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9tYXBfc3Vid2luZG93cy4gKi8KKyNkZWZpbmUgWENCX01BUF9TVUJXSU5ET1dTIDkKKworLyoqCisgKiBAYnJpZWYgeGNiX21hcF9zdWJ3aW5kb3dzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX21hcF9zdWJ3aW5kb3dzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCit9IHhjYl9tYXBfc3Vid2luZG93c19yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl91bm1hcF93aW5kb3cuICovCisjZGVmaW5lIFhDQl9VTk1BUF9XSU5ET1cgMTAKKworLyoqCisgKiBAYnJpZWYgeGNiX3VubWFwX3dpbmRvd19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl91bm1hcF93aW5kb3dfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KK30geGNiX3VubWFwX3dpbmRvd19yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl91bm1hcF9zdWJ3aW5kb3dzLiAqLworI2RlZmluZSBYQ0JfVU5NQVBfU1VCV0lORE9XUyAxMQorCisvKioKKyAqIEBicmllZiB4Y2JfdW5tYXBfc3Vid2luZG93c19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl91bm1hcF9zdWJ3aW5kb3dzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCit9IHhjYl91bm1hcF9zdWJ3aW5kb3dzX3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9jb25maWdfd2luZG93X3QgeworICAgIFhDQl9DT05GSUdfV0lORE9XX1ggPSAxLAorICAgIFhDQl9DT05GSUdfV0lORE9XX1kgPSAyLAorICAgIFhDQl9DT05GSUdfV0lORE9XX1dJRFRIID0gNCwKKyAgICBYQ0JfQ09ORklHX1dJTkRPV19IRUlHSFQgPSA4LAorICAgIFhDQl9DT05GSUdfV0lORE9XX0JPUkRFUl9XSURUSCA9IDE2LAorICAgIFhDQl9DT05GSUdfV0lORE9XX1NJQkxJTkcgPSAzMiwKKyAgICBYQ0JfQ09ORklHX1dJTkRPV19TVEFDS19NT0RFID0gNjQKK30geGNiX2NvbmZpZ193aW5kb3dfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9zdGFja19tb2RlX3QgeworICAgIFhDQl9TVEFDS19NT0RFX0FCT1ZFID0gMCwKKyAgICBYQ0JfU1RBQ0tfTU9ERV9CRUxPVyA9IDEsCisgICAgWENCX1NUQUNLX01PREVfVE9QX0lGID0gMiwKKyAgICBYQ0JfU1RBQ0tfTU9ERV9CT1RUT01fSUYgPSAzLAorICAgIFhDQl9TVEFDS19NT0RFX09QUE9TSVRFID0gNAorfSB4Y2Jfc3RhY2tfbW9kZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY29uZmlndXJlX3dpbmRvdy4gKi8KKyNkZWZpbmUgWENCX0NPTkZJR1VSRV9XSU5ET1cgMTIKKworLyoqCisgKiBAYnJpZWYgeGNiX2NvbmZpZ3VyZV93aW5kb3dfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY29uZmlndXJlX3dpbmRvd19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICB2YWx1ZV9tYXNrOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQxWzJdOyAvKio8ICAqLworfSB4Y2JfY29uZmlndXJlX3dpbmRvd19yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfY2lyY3VsYXRlX3QgeworICAgIFhDQl9DSVJDVUxBVEVfUkFJU0VfTE9XRVNUID0gMCwKKyAgICBYQ0JfQ0lSQ1VMQVRFX0xPV0VSX0hJR0hFU1QgPSAxCit9IHhjYl9jaXJjdWxhdGVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NpcmN1bGF0ZV93aW5kb3cuICovCisjZGVmaW5lIFhDQl9DSVJDVUxBVEVfV0lORE9XIDEzCisKKy8qKgorICogQGJyaWVmIHhjYl9jaXJjdWxhdGVfd2luZG93X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NpcmN1bGF0ZV93aW5kb3dfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBkaXJlY3Rpb247IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfY2lyY3VsYXRlX3dpbmRvd19yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfZ2VvbWV0cnlfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfZ2VvbWV0cnlfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2dldF9nZW9tZXRyeV9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF9nZW9tZXRyeS4gKi8KKyNkZWZpbmUgWENCX0dFVF9HRU9NRVRSWSAxNAorCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2dlb21ldHJ5X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9nZW9tZXRyeV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgLyoqPCAgKi8KK30geGNiX2dldF9nZW9tZXRyeV9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfZ2VvbWV0cnlfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9nZW9tZXRyeV9yZXBseV90IHsKKyAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgZGVwdGg7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHJvb3Q7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHk7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBoZWlnaHQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGJvcmRlcl93aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMFsyXTsgLyoqPCAgKi8KK30geGNiX2dldF9nZW9tZXRyeV9yZXBseV90OworCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfdHJlZV9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X3RyZWVfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X3RyZWVfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9xdWVyeV90cmVlLiAqLworI2RlZmluZSBYQ0JfUVVFUllfVFJFRSAxNQorCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfdHJlZV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV90cmVlX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCit9IHhjYl9xdWVyeV90cmVlX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X3RyZWVfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X3RyZWVfcmVwbHlfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHJvb3Q7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHBhcmVudDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgY2hpbGRyZW5fbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQxWzE0XTsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X3RyZWVfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2ludGVybl9hdG9tX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfaW50ZXJuX2F0b21fY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2ludGVybl9hdG9tX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfaW50ZXJuX2F0b20uICovCisjZGVmaW5lIFhDQl9JTlRFUk5fQVRPTSAxNgorCisvKioKKyAqIEBicmllZiB4Y2JfaW50ZXJuX2F0b21fcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfaW50ZXJuX2F0b21fcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgb25seV9pZl9leGlzdHM7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQxNl90IG5hbWVfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDBbMl07IC8qKjwgICovCit9IHhjYl9pbnRlcm5fYXRvbV9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9pbnRlcm5fYXRvbV9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfaW50ZXJuX2F0b21fcmVwbHlfdCB7CisgICAgdWludDhfdCAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgYXRvbTsgLyoqPCAgKi8KK30geGNiX2ludGVybl9hdG9tX3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfYXRvbV9uYW1lX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2F0b21fbmFtZV9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfZ2V0X2F0b21fbmFtZV9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF9hdG9tX25hbWUuICovCisjZGVmaW5lIFhDQl9HRVRfQVRPTV9OQU1FIDE3CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfYXRvbV9uYW1lX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9hdG9tX25hbWVfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2F0b21fdCBhdG9tOyAvKio8ICAqLworfSB4Y2JfZ2V0X2F0b21fbmFtZV9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfYXRvbV9uYW1lX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfYXRvbV9uYW1lX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgbmFtZV9sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMVsyMl07IC8qKjwgICovCit9IHhjYl9nZXRfYXRvbV9uYW1lX3JlcGx5X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfcHJvcF9tb2RlX3QgeworICAgIFhDQl9QUk9QX01PREVfUkVQTEFDRSA9IDAsCisgICAgWENCX1BST1BfTU9ERV9QUkVQRU5EID0gMSwKKyAgICBYQ0JfUFJPUF9NT0RFX0FQUEVORCA9IDIKK30geGNiX3Byb3BfbW9kZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY2hhbmdlX3Byb3BlcnR5LiAqLworI2RlZmluZSBYQ0JfQ0hBTkdFX1BST1BFUlRZIDE4CisKKy8qKgorICogQGJyaWVmIHhjYl9jaGFuZ2VfcHJvcGVydHlfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY2hhbmdlX3Byb3BlcnR5X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCisgICAgeGNiX2F0b21fdCAgIHByb3BlcnR5OyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgICB0eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBmb3JtYXQ7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDBbM107IC8qKjwgICovCisgICAgdWludDMyX3QgICAgIGRhdGFfbGVuOyAvKio8ICAqLworfSB4Y2JfY2hhbmdlX3Byb3BlcnR5X3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2RlbGV0ZV9wcm9wZXJ0eS4gKi8KKyNkZWZpbmUgWENCX0RFTEVURV9QUk9QRVJUWSAxOQorCisvKioKKyAqIEBicmllZiB4Y2JfZGVsZXRlX3Byb3BlcnR5X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2RlbGV0ZV9wcm9wZXJ0eV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgICBwcm9wZXJ0eTsgLyoqPCAgKi8KK30geGNiX2RlbGV0ZV9wcm9wZXJ0eV9yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfZ2V0X3Byb3BlcnR5X3R5cGVfdCB7CisgICAgWENCX0dFVF9QUk9QRVJUWV9UWVBFX0FOWSA9IDAKK30geGNiX2dldF9wcm9wZXJ0eV90eXBlX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfcHJvcGVydHlfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfcHJvcGVydHlfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2dldF9wcm9wZXJ0eV9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF9wcm9wZXJ0eS4gKi8KKyNkZWZpbmUgWENCX0dFVF9QUk9QRVJUWSAyMAorCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X3Byb3BlcnR5X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9wcm9wZXJ0eV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIF9kZWxldGU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgICBwcm9wZXJ0eTsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90ICAgdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgbG9uZ19vZmZzZXQ7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgIGxvbmdfbGVuZ3RoOyAvKio8ICAqLworfSB4Y2JfZ2V0X3Byb3BlcnR5X3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9wcm9wZXJ0eV9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5X3QgeworICAgIHVpbnQ4X3QgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgIGZvcm1hdDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgIGJ5dGVzX2FmdGVyOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgdmFsdWVfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgcGFkMFsxMl07IC8qKjwgICovCit9IHhjYl9nZXRfcHJvcGVydHlfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2xpc3RfcHJvcGVydGllc19jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfcHJvcGVydGllc19jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfbGlzdF9wcm9wZXJ0aWVzX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfbGlzdF9wcm9wZXJ0aWVzLiAqLworI2RlZmluZSBYQ0JfTElTVF9QUk9QRVJUSUVTIDIxCisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X3Byb3BlcnRpZXNfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9wcm9wZXJ0aWVzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCit9IHhjYl9saXN0X3Byb3BlcnRpZXNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9wcm9wZXJ0aWVzX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X3Byb3BlcnRpZXNfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBhdG9tc19sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMVsyMl07IC8qKjwgICovCit9IHhjYl9saXN0X3Byb3BlcnRpZXNfcmVwbHlfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3NldF9zZWxlY3Rpb25fb3duZXIuICovCisjZGVmaW5lIFhDQl9TRVRfU0VMRUNUSU9OX09XTkVSIDIyCisKKy8qKgorICogQGJyaWVmIHhjYl9zZXRfc2VsZWN0aW9uX293bmVyX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9zZWxlY3Rpb25fb3duZXJfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgIG93bmVyOyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgICAgICBzZWxlY3Rpb247IC8qKjwgICovCisgICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IC8qKjwgICovCit9IHhjYl9zZXRfc2VsZWN0aW9uX293bmVyX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9zZWxlY3Rpb25fb3duZXJfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lci4gKi8KKyNkZWZpbmUgWENCX0dFVF9TRUxFQ1RJT05fT1dORVIgMjMKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9zZWxlY3Rpb25fb3duZXJfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90IHNlbGVjdGlvbjsgLyoqPCAgKi8KK30geGNiX2dldF9zZWxlY3Rpb25fb3duZXJfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9yZXBseV90IHsKKyAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgb3duZXI7IC8qKjwgICovCit9IHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX3JlcGx5X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jb252ZXJ0X3NlbGVjdGlvbi4gKi8KKyNkZWZpbmUgWENCX0NPTlZFUlRfU0VMRUNUSU9OIDI0CisKKy8qKgorICogQGJyaWVmIHhjYl9jb252ZXJ0X3NlbGVjdGlvbl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jb252ZXJ0X3NlbGVjdGlvbl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgcmVxdWVzdG9yOyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgICAgICBzZWxlY3Rpb247IC8qKjwgICovCisgICAgeGNiX2F0b21fdCAgICAgIHRhcmdldDsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90ICAgICAgcHJvcGVydHk7IC8qKjwgICovCisgICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IC8qKjwgICovCit9IHhjYl9jb252ZXJ0X3NlbGVjdGlvbl9yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2Jfc2VuZF9ldmVudF9kZXN0X3QgeworICAgIFhDQl9TRU5EX0VWRU5UX0RFU1RfUE9JTlRFUl9XSU5ET1cgPSAwLAorICAgIFhDQl9TRU5EX0VWRU5UX0RFU1RfSVRFTV9GT0NVUyA9IDEKK30geGNiX3NlbmRfZXZlbnRfZGVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfc2VuZF9ldmVudC4gKi8KKyNkZWZpbmUgWENCX1NFTkRfRVZFTlQgMjUKKworLyoqCisgKiBAYnJpZWYgeGNiX3NlbmRfZXZlbnRfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2VuZF9ldmVudF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHByb3BhZ2F0ZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBkZXN0aW5hdGlvbjsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgZXZlbnRfbWFzazsgLyoqPCAgKi8KKyAgICBjaGFyICAgICAgICAgZXZlbnRbMzJdOyAvKio8ICAqLworfSB4Y2Jfc2VuZF9ldmVudF9yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfZ3JhYl9tb2RlX3QgeworICAgIFhDQl9HUkFCX01PREVfU1lOQyA9IDAsCisgICAgWENCX0dSQUJfTU9ERV9BU1lOQyA9IDEKK30geGNiX2dyYWJfbW9kZV90OworCit0eXBlZGVmIGVudW0geGNiX2dyYWJfc3RhdHVzX3QgeworICAgIFhDQl9HUkFCX1NUQVRVU19TVUNDRVNTID0gMCwKKyAgICBYQ0JfR1JBQl9TVEFUVVNfQUxSRUFEWV9HUkFCQkVEID0gMSwKKyAgICBYQ0JfR1JBQl9TVEFUVVNfSU5WQUxJRF9USU1FID0gMiwKKyAgICBYQ0JfR1JBQl9TVEFUVVNfTk9UX1ZJRVdBQkxFID0gMywKKyAgICBYQ0JfR1JBQl9TVEFUVVNfRlJPWkVOID0gNAorfSB4Y2JfZ3JhYl9zdGF0dXNfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9jdXJzb3JfZW51bV90IHsKKyAgICBYQ0JfQ1VSU09SX05PTkUgPSAwCit9IHhjYl9jdXJzb3JfZW51bV90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ3JhYl9wb2ludGVyX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhYl9wb2ludGVyX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9ncmFiX3BvaW50ZXJfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9ncmFiX3BvaW50ZXIuICovCisjZGVmaW5lIFhDQl9HUkFCX1BPSU5URVIgMjYKKworLyoqCisgKiBAYnJpZWYgeGNiX2dyYWJfcG9pbnRlcl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9ncmFiX3BvaW50ZXJfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBvd25lcl9ldmVudHM7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgZ3JhYl93aW5kb3c7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIGV2ZW50X21hc2s7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHBvaW50ZXJfbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAga2V5Ym9hcmRfbW9kZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgY29uZmluZV90bzsgLyoqPCAgKi8KKyAgICB4Y2JfY3Vyc29yX3QgICAgY3Vyc29yOyAvKio8ICAqLworICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAvKio8ICAqLworfSB4Y2JfZ3JhYl9wb2ludGVyX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dyYWJfcG9pbnRlcl9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhYl9wb2ludGVyX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgc3RhdHVzOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX2dyYWJfcG9pbnRlcl9yZXBseV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfdW5ncmFiX3BvaW50ZXIuICovCisjZGVmaW5lIFhDQl9VTkdSQUJfUE9JTlRFUiAyNworCisvKioKKyAqIEBicmllZiB4Y2JfdW5ncmFiX3BvaW50ZXJfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfdW5ncmFiX3BvaW50ZXJfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IC8qKjwgICovCit9IHhjYl91bmdyYWJfcG9pbnRlcl9yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfYnV0dG9uX2luZGV4X3QgeworICAgIFhDQl9CVVRUT05fSU5ERVhfQU5ZID0gMCwKKyAgICBYQ0JfQlVUVE9OX0lOREVYXzEgPSAxLAorICAgIFhDQl9CVVRUT05fSU5ERVhfMiA9IDIsCisgICAgWENCX0JVVFRPTl9JTkRFWF8zID0gMywKKyAgICBYQ0JfQlVUVE9OX0lOREVYXzQgPSA0LAorICAgIFhDQl9CVVRUT05fSU5ERVhfNSA9IDUKK30geGNiX2J1dHRvbl9pbmRleF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ3JhYl9idXR0b24uICovCisjZGVmaW5lIFhDQl9HUkFCX0JVVFRPTiAyOAorCisvKioKKyAqIEBicmllZiB4Y2JfZ3JhYl9idXR0b25fcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhYl9idXR0b25fcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBvd25lcl9ldmVudHM7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgZ3JhYl93aW5kb3c7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGV2ZW50X21hc2s7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBvaW50ZXJfbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAga2V5Ym9hcmRfbW9kZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgY29uZmluZV90bzsgLyoqPCAgKi8KKyAgICB4Y2JfY3Vyc29yX3QgY3Vyc29yOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBidXR0b247IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIG1vZGlmaWVyczsgLyoqPCAgKi8KK30geGNiX2dyYWJfYnV0dG9uX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3VuZ3JhYl9idXR0b24uICovCisjZGVmaW5lIFhDQl9VTkdSQUJfQlVUVE9OIDI5CisKKy8qKgorICogQGJyaWVmIHhjYl91bmdyYWJfYnV0dG9uX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3VuZ3JhYl9idXR0b25fcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBidXR0b247IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgZ3JhYl93aW5kb3c7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIG1vZGlmaWVyczsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMFsyXTsgLyoqPCAgKi8KK30geGNiX3VuZ3JhYl9idXR0b25fcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY2hhbmdlX2FjdGl2ZV9wb2ludGVyX2dyYWIuICovCisjZGVmaW5lIFhDQl9DSEFOR0VfQUNUSVZFX1BPSU5URVJfR1JBQiAzMAorCisvKioKKyAqIEBicmllZiB4Y2JfY2hhbmdlX2FjdGl2ZV9wb2ludGVyX2dyYWJfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY2hhbmdlX2FjdGl2ZV9wb2ludGVyX2dyYWJfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2N1cnNvcl90ICAgIGN1cnNvcjsgLyoqPCAgKi8KKyAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICAgZXZlbnRfbWFzazsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgcGFkMVsyXTsgLyoqPCAgKi8KK30geGNiX2NoYW5nZV9hY3RpdmVfcG9pbnRlcl9ncmFiX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dyYWJfa2V5Ym9hcmRfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9ncmFiX2tleWJvYXJkX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9ncmFiX2tleWJvYXJkX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ3JhYl9rZXlib2FyZC4gKi8KKyNkZWZpbmUgWENCX0dSQUJfS0VZQk9BUkQgMzEKKworLyoqCisgKiBAYnJpZWYgeGNiX2dyYWJfa2V5Ym9hcmRfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhYl9rZXlib2FyZF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIG93bmVyX2V2ZW50czsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICBncmFiX3dpbmRvdzsgLyoqPCAgKi8KKyAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgcG9pbnRlcl9tb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBrZXlib2FyZF9tb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQwWzJdOyAvKio8ICAqLworfSB4Y2JfZ3JhYl9rZXlib2FyZF9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9ncmFiX2tleWJvYXJkX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9ncmFiX2tleWJvYXJkX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgc3RhdHVzOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX2dyYWJfa2V5Ym9hcmRfcmVwbHlfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3VuZ3JhYl9rZXlib2FyZC4gKi8KKyNkZWZpbmUgWENCX1VOR1JBQl9LRVlCT0FSRCAzMgorCisvKioKKyAqIEBicmllZiB4Y2JfdW5ncmFiX2tleWJvYXJkX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3VuZ3JhYl9rZXlib2FyZF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgLyoqPCAgKi8KK30geGNiX3VuZ3JhYl9rZXlib2FyZF9yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfZ3JhYl90IHsKKyAgICBYQ0JfR1JBQl9BTlkgPSAwCit9IHhjYl9ncmFiX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9ncmFiX2tleS4gKi8KKyNkZWZpbmUgWENCX0dSQUJfS0VZIDMzCisKKy8qKgorICogQGJyaWVmIHhjYl9ncmFiX2tleV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9ncmFiX2tleV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgb3duZXJfZXZlbnRzOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgZ3JhYl93aW5kb3c7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICBtb2RpZmllcnM7IC8qKjwgICovCisgICAgeGNiX2tleWNvZGVfdCBrZXk7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBwb2ludGVyX21vZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBrZXlib2FyZF9tb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgcGFkMFszXTsgLyoqPCAgKi8KK30geGNiX2dyYWJfa2V5X3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3VuZ3JhYl9rZXkuICovCisjZGVmaW5lIFhDQl9VTkdSQUJfS0VZIDM0CisKKy8qKgorICogQGJyaWVmIHhjYl91bmdyYWJfa2V5X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3VuZ3JhYl9rZXlfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB4Y2Jfa2V5Y29kZV90IGtleTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgIGdyYWJfd2luZG93OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgbW9kaWZpZXJzOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgcGFkMFsyXTsgLyoqPCAgKi8KK30geGNiX3VuZ3JhYl9rZXlfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2FsbG93X3QgeworICAgIFhDQl9BTExPV19BU1lOQ19QT0lOVEVSID0gMCwKKyAgICBYQ0JfQUxMT1dfU1lOQ19QT0lOVEVSID0gMSwKKyAgICBYQ0JfQUxMT1dfUkVQTEFZX1BPSU5URVIgPSAyLAorICAgIFhDQl9BTExPV19BU1lOQ19LRVlCT0FSRCA9IDMsCisgICAgWENCX0FMTE9XX1NZTkNfS0VZQk9BUkQgPSA0LAorICAgIFhDQl9BTExPV19SRVBMQVlfS0VZQk9BUkQgPSA1LAorICAgIFhDQl9BTExPV19BU1lOQ19CT1RIID0gNiwKKyAgICBYQ0JfQUxMT1dfU1lOQ19CT1RIID0gNworfSB4Y2JfYWxsb3dfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2FsbG93X2V2ZW50cy4gKi8KKyNkZWZpbmUgWENCX0FMTE9XX0VWRU5UUyAzNQorCisvKioKKyAqIEBicmllZiB4Y2JfYWxsb3dfZXZlbnRzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG93X2V2ZW50c19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIG1vZGU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgLyoqPCAgKi8KK30geGNiX2FsbG93X2V2ZW50c19yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9ncmFiX3NlcnZlci4gKi8KKyNkZWZpbmUgWENCX0dSQUJfU0VSVkVSIDM2CisKKy8qKgorICogQGJyaWVmIHhjYl9ncmFiX3NlcnZlcl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9ncmFiX3NlcnZlcl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX2dyYWJfc2VydmVyX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3VuZ3JhYl9zZXJ2ZXIuICovCisjZGVmaW5lIFhDQl9VTkdSQUJfU0VSVkVSIDM3CisKKy8qKgorICogQGJyaWVmIHhjYl91bmdyYWJfc2VydmVyX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3VuZ3JhYl9zZXJ2ZXJfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl91bmdyYWJfc2VydmVyX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X3BvaW50ZXJfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9wb2ludGVyX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9xdWVyeV9wb2ludGVyX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcXVlcnlfcG9pbnRlci4gKi8KKyNkZWZpbmUgWENCX1FVRVJZX1BPSU5URVIgMzgKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X3BvaW50ZXJfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfcG9pbnRlcl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfcXVlcnlfcG9pbnRlcl9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV9wb2ludGVyX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9wb2ludGVyX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBzYW1lX3NjcmVlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgcm9vdDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgY2hpbGQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHJvb3RfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgcm9vdF95OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB3aW5feDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgd2luX3k7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIG1hc2s7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDBbMl07IC8qKjwgICovCit9IHhjYl9xdWVyeV9wb2ludGVyX3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl90aW1lY29vcmRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3RpbWVjb29yZF90IHsKKyAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICAgeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICAgeTsgLyoqPCAgKi8KK30geGNiX3RpbWVjb29yZF90OworCisvKioKKyAqIEBicmllZiB4Y2JfdGltZWNvb3JkX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl90aW1lY29vcmRfaXRlcmF0b3JfdCB7CisgICAgeGNiX3RpbWVjb29yZF90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl90aW1lY29vcmRfaXRlcmF0b3JfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9tb3Rpb25fZXZlbnRzX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2dldF9tb3Rpb25fZXZlbnRzX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ2V0X21vdGlvbl9ldmVudHMuICovCisjZGVmaW5lIFhDQl9HRVRfTU9USU9OX0VWRU5UUyAzOQorCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgIHdpbmRvdzsgLyoqPCAgKi8KKyAgICB4Y2JfdGltZXN0YW1wX3Qgc3RhcnQ7IC8qKjwgICovCisgICAgeGNiX3RpbWVzdGFtcF90IHN0b3A7IC8qKjwgICovCit9IHhjYl9nZXRfbW90aW9uX2V2ZW50c19yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfbW90aW9uX2V2ZW50c19yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBldmVudHNfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMjBdOyAvKio8ICAqLworfSB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzLiAqLworI2RlZmluZSBYQ0JfVFJBTlNMQVRFX0NPT1JESU5BVEVTIDQwCisKKy8qKgorICogQGJyaWVmIHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBzcmNfd2luZG93OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBkc3Rfd2luZG93OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICBzcmNfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgc3JjX3k7IC8qKjwgICovCit9IHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfcmVwbHlfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHNhbWVfc2NyZWVuOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBjaGlsZDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgZHN0X3g7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIGRzdF95OyAvKio8ICAqLworfSB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcGx5X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl93YXJwX3BvaW50ZXIuICovCisjZGVmaW5lIFhDQl9XQVJQX1BPSU5URVIgNDEKKworLyoqCisgKiBAYnJpZWYgeGNiX3dhcnBfcG9pbnRlcl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl93YXJwX3BvaW50ZXJfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHNyY193aW5kb3c7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IGRzdF93aW5kb3c7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHNyY194OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICBzcmNfeTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgc3JjX3dpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzcmNfaGVpZ2h0OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICBkc3RfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgZHN0X3k7IC8qKjwgICovCit9IHhjYl93YXJwX3BvaW50ZXJfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2lucHV0X2ZvY3VzX3QgeworICAgIFhDQl9JTlBVVF9GT0NVU19OT05FID0gMCwKKyAgICBYQ0JfSU5QVVRfRk9DVVNfUE9JTlRFUl9ST09UID0gMSwKKyAgICBYQ0JfSU5QVVRfRk9DVVNfUEFSRU5UID0gMiwKKyAgICBYQ0JfSU5QVVRfRk9DVVNfRk9MTE9XX0tFWUJPQVJEID0gMworfSB4Y2JfaW5wdXRfZm9jdXNfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3NldF9pbnB1dF9mb2N1cy4gKi8KKyNkZWZpbmUgWENCX1NFVF9JTlBVVF9GT0NVUyA0MgorCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0X2lucHV0X2ZvY3VzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9pbnB1dF9mb2N1c19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHJldmVydF90bzsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICBmb2N1czsgLyoqPCAgKi8KKyAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgLyoqPCAgKi8KK30geGNiX3NldF9pbnB1dF9mb2N1c19yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfaW5wdXRfZm9jdXNfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfaW5wdXRfZm9jdXNfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2dldF9pbnB1dF9mb2N1c19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF9pbnB1dF9mb2N1cy4gKi8KKyNkZWZpbmUgWENCX0dFVF9JTlBVVF9GT0NVUyA0MworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2lucHV0X2ZvY3VzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9pbnB1dF9mb2N1c19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX2dldF9pbnB1dF9mb2N1c19yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfaW5wdXRfZm9jdXNfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9pbnB1dF9mb2N1c19yZXBseV90IHsKKyAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcmV2ZXJ0X3RvOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBmb2N1czsgLyoqPCAgKi8KK30geGNiX2dldF9pbnB1dF9mb2N1c19yZXBseV90OworCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfa2V5bWFwX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfa2V5bWFwX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9xdWVyeV9rZXltYXBfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9xdWVyeV9rZXltYXAuICovCisjZGVmaW5lIFhDQl9RVUVSWV9LRVlNQVAgNDQKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X2tleW1hcF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9rZXltYXBfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9xdWVyeV9rZXltYXBfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfa2V5bWFwX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9rZXltYXBfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBrZXlzWzMyXTsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X2tleW1hcF9yZXBseV90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfb3Blbl9mb250LiAqLworI2RlZmluZSBYQ0JfT1BFTl9GT05UIDQ1CisKKy8qKgorICogQGJyaWVmIHhjYl9vcGVuX2ZvbnRfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfb3Blbl9mb250X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9mb250X3QgZmlkOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgbmFtZV9sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgICBwYWQxWzJdOyAvKio8ICAqLworfSB4Y2Jfb3Blbl9mb250X3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2Nsb3NlX2ZvbnQuICovCisjZGVmaW5lIFhDQl9DTE9TRV9GT05UIDQ2CisKKy8qKgorICogQGJyaWVmIHhjYl9jbG9zZV9mb250X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2Nsb3NlX2ZvbnRfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2ZvbnRfdCBmb250OyAvKio8ICAqLworfSB4Y2JfY2xvc2VfZm9udF9yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfZm9udF9kcmF3X3QgeworICAgIFhDQl9GT05UX0RSQVdfTEVGVF9UT19SSUdIVCA9IDAsCisgICAgWENCX0ZPTlRfRFJBV19SSUdIVF9UT19MRUZUID0gMQorfSB4Y2JfZm9udF9kcmF3X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9mb250cHJvcF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZm9udHByb3BfdCB7CisgICAgeGNiX2F0b21fdCBuYW1lOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgdmFsdWU7IC8qKjwgICovCit9IHhjYl9mb250cHJvcF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZm9udHByb3BfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3QgeworICAgIHhjYl9mb250cHJvcF90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfZm9udHByb3BfaXRlcmF0b3JfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2NoYXJpbmZvX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jaGFyaW5mb190IHsKKyAgICBpbnQxNl90ICBsZWZ0X3NpZGVfYmVhcmluZzsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICByaWdodF9zaWRlX2JlYXJpbmc7IC8qKjwgICovCisgICAgaW50MTZfdCAgY2hhcmFjdGVyX3dpZHRoOyAvKio8ICAqLworICAgIGludDE2X3QgIGFzY2VudDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICBkZXNjZW50OyAvKio8ICAqLworICAgIHVpbnQxNl90IGF0dHJpYnV0ZXM7IC8qKjwgICovCit9IHhjYl9jaGFyaW5mb190OworCisvKioKKyAqIEBicmllZiB4Y2JfY2hhcmluZm9faXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYXJpbmZvX2l0ZXJhdG9yX3QgeworICAgIHhjYl9jaGFyaW5mb190ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfY2hhcmluZm9faXRlcmF0b3JfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X2ZvbnRfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9mb250X2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9xdWVyeV9mb250X2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcXVlcnlfZm9udC4gKi8KKyNkZWZpbmUgWENCX1FVRVJZX0ZPTlQgNDcKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X2ZvbnRfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfZm9udF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZm9udGFibGVfdCBmb250OyAvKio8ICAqLworfSB4Y2JfcXVlcnlfZm9udF9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV9mb250X3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9mb250X3JlcGx5X3QgeworICAgIHVpbnQ4X3QgICAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2NoYXJpbmZvX3QgbWluX2JvdW5kczsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQxWzRdOyAvKio8ICAqLworICAgIHhjYl9jaGFyaW5mb190IG1heF9ib3VuZHM7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMls0XTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBtaW5fY2hhcl9vcl9ieXRlMjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBtYXhfY2hhcl9vcl9ieXRlMjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBkZWZhdWx0X2NoYXI7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgcHJvcGVydGllc19sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgZHJhd19kaXJlY3Rpb247IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgbWluX2J5dGUxOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIG1heF9ieXRlMTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBhbGxfY2hhcnNfZXhpc3Q7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgZm9udF9hc2NlbnQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgZm9udF9kZXNjZW50OyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIGNoYXJfaW5mb3NfbGVuOyAvKio8ICAqLworfSB4Y2JfcXVlcnlfZm9udF9yZXBseV90OworCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9xdWVyeV90ZXh0X2V4dGVudHMuICovCisjZGVmaW5lIFhDQl9RVUVSWV9URVhUX0VYVEVOVFMgNDgKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgb2RkX2xlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2ZvbnRhYmxlX3QgZm9udDsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIGRyYXdfZGlyZWN0aW9uOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICBmb250X2FzY2VudDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICBmb250X2Rlc2NlbnQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgb3ZlcmFsbF9hc2NlbnQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgb3ZlcmFsbF9kZXNjZW50OyAvKio8ICAqLworICAgIGludDMyX3QgIG92ZXJhbGxfd2lkdGg7IC8qKjwgICovCisgICAgaW50MzJfdCAgb3ZlcmFsbF9sZWZ0OyAvKio8ICAqLworICAgIGludDMyX3QgIG92ZXJhbGxfcmlnaHQ7IC8qKjwgICovCit9IHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3N0cl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc3RyX3QgeworICAgIHVpbnQ4X3QgbmFtZV9sZW47IC8qKjwgICovCit9IHhjYl9zdHJfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3N0cl9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc3RyX2l0ZXJhdG9yX3QgeworICAgIHhjYl9zdHJfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2Jfc3RyX2l0ZXJhdG9yX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X2ZvbnRzX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9mb250c19jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfbGlzdF9mb250c19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2xpc3RfZm9udHMuICovCisjZGVmaW5lIFhDQl9MSVNUX0ZPTlRTIDQ5CisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X2ZvbnRzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfZm9udHNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgbWF4X25hbWVzOyAvKio8ICAqLworICAgIHVpbnQxNl90IHBhdHRlcm5fbGVuOyAvKio8ICAqLworfSB4Y2JfbGlzdF9mb250c19yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X2ZvbnRzX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X2ZvbnRzX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgbmFtZXNfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMjJdOyAvKio8ICAqLworfSB4Y2JfbGlzdF9mb250c19yZXBseV90OworCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mby4gKi8KKyNkZWZpbmUgWENCX0xJU1RfRk9OVFNfV0lUSF9JTkZPIDUwCisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBtYXhfbmFtZXM7IC8qKjwgICovCisgICAgdWludDE2X3QgcGF0dGVybl9sZW47IC8qKjwgICovCit9IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCB7CisgICAgdWludDhfdCAgICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBuYW1lX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2NoYXJpbmZvX3QgbWluX2JvdW5kczsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwWzRdOyAvKio8ICAqLworICAgIHhjYl9jaGFyaW5mb190IG1heF9ib3VuZHM7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMVs0XTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBtaW5fY2hhcl9vcl9ieXRlMjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBtYXhfY2hhcl9vcl9ieXRlMjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBkZWZhdWx0X2NoYXI7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgcHJvcGVydGllc19sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgZHJhd19kaXJlY3Rpb247IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgbWluX2J5dGUxOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIG1heF9ieXRlMTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBhbGxfY2hhcnNfZXhpc3Q7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgZm9udF9hc2NlbnQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgZm9udF9kZXNjZW50OyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIHJlcGxpZXNfaGludDsgLyoqPCAgKi8KK30geGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9zZXRfZm9udF9wYXRoLiAqLworI2RlZmluZSBYQ0JfU0VUX0ZPTlRfUEFUSCA1MQorCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0X2ZvbnRfcGF0aF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXRfZm9udF9wYXRoX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQxNl90IGZvbnRfcXR5OyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMl07IC8qKjwgICovCit9IHhjYl9zZXRfZm9udF9wYXRoX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9mb250X3BhdGhfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfZm9udF9wYXRoX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9nZXRfZm9udF9wYXRoX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ2V0X2ZvbnRfcGF0aC4gKi8KKyNkZWZpbmUgWENCX0dFVF9GT05UX1BBVEggNTIKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9mb250X3BhdGhfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX2dldF9mb250X3BhdGhfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQxNl90IHBhdGhfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMjJdOyAvKio8ICAqLworfSB4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXBseV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY3JlYXRlX3BpeG1hcC4gKi8KKyNkZWZpbmUgWENCX0NSRUFURV9QSVhNQVAgNTMKKworLyoqCisgKiBAYnJpZWYgeGNiX2NyZWF0ZV9waXhtYXBfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY3JlYXRlX3BpeG1hcF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBkZXB0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3BpeG1hcF90ICAgcGlkOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGhlaWdodDsgLyoqPCAgKi8KK30geGNiX2NyZWF0ZV9waXhtYXBfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZnJlZV9waXhtYXAuICovCisjZGVmaW5lIFhDQl9GUkVFX1BJWE1BUCA1NAorCisvKioKKyAqIEBicmllZiB4Y2JfZnJlZV9waXhtYXBfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZnJlZV9waXhtYXBfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3BpeG1hcF90IHBpeG1hcDsgLyoqPCAgKi8KK30geGNiX2ZyZWVfcGl4bWFwX3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9nY190IHsKKyAgICBYQ0JfR0NfRlVOQ1RJT04gPSAxLAorICAgIFhDQl9HQ19QTEFORV9NQVNLID0gMiwKKyAgICBYQ0JfR0NfRk9SRUdST1VORCA9IDQsCisgICAgWENCX0dDX0JBQ0tHUk9VTkQgPSA4LAorICAgIFhDQl9HQ19MSU5FX1dJRFRIID0gMTYsCisgICAgWENCX0dDX0xJTkVfU1RZTEUgPSAzMiwKKyAgICBYQ0JfR0NfQ0FQX1NUWUxFID0gNjQsCisgICAgWENCX0dDX0pPSU5fU1RZTEUgPSAxMjgsCisgICAgWENCX0dDX0ZJTExfU1RZTEUgPSAyNTYsCisgICAgWENCX0dDX0ZJTExfUlVMRSA9IDUxMiwKKyAgICBYQ0JfR0NfVElMRSA9IDEwMjQsCisgICAgWENCX0dDX1NUSVBQTEUgPSAyMDQ4LAorICAgIFhDQl9HQ19USUxFX1NUSVBQTEVfT1JJR0lOX1ggPSA0MDk2LAorICAgIFhDQl9HQ19USUxFX1NUSVBQTEVfT1JJR0lOX1kgPSA4MTkyLAorICAgIFhDQl9HQ19GT05UID0gMTYzODQsCisgICAgWENCX0dDX1NVQldJTkRPV19NT0RFID0gMzI3NjgsCisgICAgWENCX0dDX0dSQVBISUNTX0VYUE9TVVJFUyA9IDY1NTM2LAorICAgIFhDQl9HQ19DTElQX09SSUdJTl9YID0gMTMxMDcyLAorICAgIFhDQl9HQ19DTElQX09SSUdJTl9ZID0gMjYyMTQ0LAorICAgIFhDQl9HQ19DTElQX01BU0sgPSA1MjQyODgsCisgICAgWENCX0dDX0RBU0hfT0ZGU0VUID0gMTA0ODU3NiwKKyAgICBYQ0JfR0NfREFTSF9MSVNUID0gMjA5NzE1MiwKKyAgICBYQ0JfR0NfQVJDX01PREUgPSA0MTk0MzA0Cit9IHhjYl9nY190OworCit0eXBlZGVmIGVudW0geGNiX2d4X3QgeworICAgIFhDQl9HWF9DTEVBUiA9IDAsCisgICAgWENCX0dYX0FORCA9IDEsCisgICAgWENCX0dYX0FORF9SRVZFUlNFID0gMiwKKyAgICBYQ0JfR1hfQ09QWSA9IDMsCisgICAgWENCX0dYX0FORF9JTlZFUlRFRCA9IDQsCisgICAgWENCX0dYX05PT1AgPSA1LAorICAgIFhDQl9HWF9YT1IgPSA2LAorICAgIFhDQl9HWF9PUiA9IDcsCisgICAgWENCX0dYX05PUiA9IDgsCisgICAgWENCX0dYX0VRVUlWID0gOSwKKyAgICBYQ0JfR1hfSU5WRVJUID0gMTAsCisgICAgWENCX0dYX09SX1JFVkVSU0UgPSAxMSwKKyAgICBYQ0JfR1hfQ09QWV9JTlZFUlRFRCA9IDEyLAorICAgIFhDQl9HWF9PUl9JTlZFUlRFRCA9IDEzLAorICAgIFhDQl9HWF9OQU5EID0gMTQsCisgICAgWENCX0dYX1NFVCA9IDE1Cit9IHhjYl9neF90OworCit0eXBlZGVmIGVudW0geGNiX2xpbmVfc3R5bGVfdCB7CisgICAgWENCX0xJTkVfU1RZTEVfU09MSUQgPSAwLAorICAgIFhDQl9MSU5FX1NUWUxFX09OX09GRl9EQVNIID0gMSwKKyAgICBYQ0JfTElORV9TVFlMRV9ET1VCTEVfREFTSCA9IDIKK30geGNiX2xpbmVfc3R5bGVfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9jYXBfc3R5bGVfdCB7CisgICAgWENCX0NBUF9TVFlMRV9OT1RfTEFTVCA9IDAsCisgICAgWENCX0NBUF9TVFlMRV9CVVRUID0gMSwKKyAgICBYQ0JfQ0FQX1NUWUxFX1JPVU5EID0gMiwKKyAgICBYQ0JfQ0FQX1NUWUxFX1BST0pFQ1RJTkcgPSAzCit9IHhjYl9jYXBfc3R5bGVfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9qb2luX3N0eWxlX3QgeworICAgIFhDQl9KT0lOX1NUWUxFX01JVEVSID0gMCwKKyAgICBYQ0JfSk9JTl9TVFlMRV9ST1VORCA9IDEsCisgICAgWENCX0pPSU5fU1RZTEVfQkVWRUwgPSAyCit9IHhjYl9qb2luX3N0eWxlX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfZmlsbF9zdHlsZV90IHsKKyAgICBYQ0JfRklMTF9TVFlMRV9TT0xJRCA9IDAsCisgICAgWENCX0ZJTExfU1RZTEVfVElMRUQgPSAxLAorICAgIFhDQl9GSUxMX1NUWUxFX1NUSVBQTEVEID0gMiwKKyAgICBYQ0JfRklMTF9TVFlMRV9PUEFRVUVfU1RJUFBMRUQgPSAzCit9IHhjYl9maWxsX3N0eWxlX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfZmlsbF9ydWxlX3QgeworICAgIFhDQl9GSUxMX1JVTEVfRVZFTl9PREQgPSAwLAorICAgIFhDQl9GSUxMX1JVTEVfV0lORElORyA9IDEKK30geGNiX2ZpbGxfcnVsZV90OworCit0eXBlZGVmIGVudW0geGNiX3N1YndpbmRvd19tb2RlX3QgeworICAgIFhDQl9TVUJXSU5ET1dfTU9ERV9DTElQX0JZX0NISUxEUkVOID0gMCwKKyAgICBYQ0JfU1VCV0lORE9XX01PREVfSU5DTFVERV9JTkZFUklPUlMgPSAxCit9IHhjYl9zdWJ3aW5kb3dfbW9kZV90OworCit0eXBlZGVmIGVudW0geGNiX2FyY19tb2RlX3QgeworICAgIFhDQl9BUkNfTU9ERV9DSE9SRCA9IDAsCisgICAgWENCX0FSQ19NT0RFX1BJRV9TTElDRSA9IDEKK30geGNiX2FyY19tb2RlX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jcmVhdGVfZ2MuICovCisjZGVmaW5lIFhDQl9DUkVBVEVfR0MgNTUKKworLyoqCisgKiBAYnJpZWYgeGNiX2NyZWF0ZV9nY19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jcmVhdGVfZ2NfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgY2lkOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIHZhbHVlX21hc2s7IC8qKjwgICovCit9IHhjYl9jcmVhdGVfZ2NfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY2hhbmdlX2djLiAqLworI2RlZmluZSBYQ0JfQ0hBTkdFX0dDIDU2CisKKy8qKgorICogQGJyaWVmIHhjYl9jaGFuZ2VfZ2NfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY2hhbmdlX2djX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGdjOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIHZhbHVlX21hc2s7IC8qKjwgICovCit9IHhjYl9jaGFuZ2VfZ2NfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY29weV9nYy4gKi8KKyNkZWZpbmUgWENCX0NPUFlfR0MgNTcKKworLyoqCisgKiBAYnJpZWYgeGNiX2NvcHlfZ2NfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY29weV9nY19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZ2NvbnRleHRfdCBzcmNfZ2M7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZHN0X2djOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIHZhbHVlX21hc2s7IC8qKjwgICovCit9IHhjYl9jb3B5X2djX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3NldF9kYXNoZXMuICovCisjZGVmaW5lIFhDQl9TRVRfREFTSEVTIDU4CisKKy8qKgorICogQGJyaWVmIHhjYl9zZXRfZGFzaGVzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9kYXNoZXNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZ2M7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgZGFzaF9vZmZzZXQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgZGFzaGVzX2xlbjsgLyoqPCAgKi8KK30geGNiX3NldF9kYXNoZXNfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2NsaXBfb3JkZXJpbmdfdCB7CisgICAgWENCX0NMSVBfT1JERVJJTkdfVU5TT1JURUQgPSAwLAorICAgIFhDQl9DTElQX09SREVSSU5HX1lfU09SVEVEID0gMSwKKyAgICBYQ0JfQ0xJUF9PUkRFUklOR19ZWF9TT1JURUQgPSAyLAorICAgIFhDQl9DTElQX09SREVSSU5HX1lYX0JBTkRFRCA9IDMKK30geGNiX2NsaXBfb3JkZXJpbmdfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3NldF9jbGlwX3JlY3RhbmdsZXMuICovCisjZGVmaW5lIFhDQl9TRVRfQ0xJUF9SRUNUQU5HTEVTIDU5CisKKy8qKgorICogQGJyaWVmIHhjYl9zZXRfY2xpcF9yZWN0YW5nbGVzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9jbGlwX3JlY3RhbmdsZXNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgb3JkZXJpbmc7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGdjOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIGNsaXBfeF9vcmlnaW47IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgY2xpcF95X29yaWdpbjsgLyoqPCAgKi8KK30geGNiX3NldF9jbGlwX3JlY3RhbmdsZXNfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZnJlZV9nYy4gKi8KKyNkZWZpbmUgWENCX0ZSRUVfR0MgNjAKKworLyoqCisgKiBAYnJpZWYgeGNiX2ZyZWVfZ2NfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZnJlZV9nY19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgLyoqPCAgKi8KK30geGNiX2ZyZWVfZ2NfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY2xlYXJfYXJlYS4gKi8KKyNkZWZpbmUgWENCX0NMRUFSX0FSRUEgNjEKKworLyoqCisgKiBAYnJpZWYgeGNiX2NsZWFyX2FyZWFfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY2xlYXJfYXJlYV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIGV4cG9zdXJlczsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHk7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBoZWlnaHQ7IC8qKjwgICovCit9IHhjYl9jbGVhcl9hcmVhX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NvcHlfYXJlYS4gKi8KKyNkZWZpbmUgWENCX0NPUFlfQVJFQSA2MgorCisvKioKKyAqIEBicmllZiB4Y2JfY29weV9hcmVhX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NvcHlfYXJlYV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBzcmNfZHJhd2FibGU7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHN0X2RyYXdhYmxlOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGdjOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIHNyY194OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIHNyY195OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIGRzdF94OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIGRzdF95OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGhlaWdodDsgLyoqPCAgKi8KK30geGNiX2NvcHlfYXJlYV9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jb3B5X3BsYW5lLiAqLworI2RlZmluZSBYQ0JfQ09QWV9QTEFORSA2MworCisvKioKKyAqIEBicmllZiB4Y2JfY29weV9wbGFuZV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jb3B5X3BsYW5lX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IHNyY19kcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkc3RfZHJhd2FibGU7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZ2M7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgc3JjX3g7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgc3JjX3k7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgZHN0X3g7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgZHN0X3k7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgd2lkdGg7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgaGVpZ2h0OyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIGJpdF9wbGFuZTsgLyoqPCAgKi8KK30geGNiX2NvcHlfcGxhbmVfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2Nvb3JkX21vZGVfdCB7CisgICAgWENCX0NPT1JEX01PREVfT1JJR0lOID0gMCwKKyAgICBYQ0JfQ09PUkRfTU9ERV9QUkVWSU9VUyA9IDEKK30geGNiX2Nvb3JkX21vZGVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3BvbHlfcG9pbnQuICovCisjZGVmaW5lIFhDQl9QT0xZX1BPSU5UIDY0CisKKy8qKgorICogQGJyaWVmIHhjYl9wb2x5X3BvaW50X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3BvbHlfcG9pbnRfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgY29vcmRpbmF0ZV9tb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgLyoqPCAgKi8KK30geGNiX3BvbHlfcG9pbnRfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcG9seV9saW5lLiAqLworI2RlZmluZSBYQ0JfUE9MWV9MSU5FIDY1CisKKy8qKgorICogQGJyaWVmIHhjYl9wb2x5X2xpbmVfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcG9seV9saW5lX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIGNvb3JkaW5hdGVfbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZ2M7IC8qKjwgICovCit9IHhjYl9wb2x5X2xpbmVfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2Jfc2VnbWVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2VnbWVudF90IHsKKyAgICBpbnQxNl90IHgxOyAvKio8ICAqLworICAgIGludDE2X3QgeTE7IC8qKjwgICovCisgICAgaW50MTZfdCB4MjsgLyoqPCAgKi8KKyAgICBpbnQxNl90IHkyOyAvKio8ICAqLworfSB4Y2Jfc2VnbWVudF90OworCisvKioKKyAqIEBicmllZiB4Y2Jfc2VnbWVudF9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2VnbWVudF9pdGVyYXRvcl90IHsKKyAgICB4Y2Jfc2VnbWVudF90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX3NlZ21lbnRfaXRlcmF0b3JfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3BvbHlfc2VnbWVudC4gKi8KKyNkZWZpbmUgWENCX1BPTFlfU0VHTUVOVCA2NgorCisvKioKKyAqIEBicmllZiB4Y2JfcG9seV9zZWdtZW50X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3BvbHlfc2VnbWVudF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgLyoqPCAgKi8KK30geGNiX3BvbHlfc2VnbWVudF9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9wb2x5X3JlY3RhbmdsZS4gKi8KKyNkZWZpbmUgWENCX1BPTFlfUkVDVEFOR0xFIDY3CisKKy8qKgorICogQGJyaWVmIHhjYl9wb2x5X3JlY3RhbmdsZV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9wb2x5X3JlY3RhbmdsZV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgLyoqPCAgKi8KK30geGNiX3BvbHlfcmVjdGFuZ2xlX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3BvbHlfYXJjLiAqLworI2RlZmluZSBYQ0JfUE9MWV9BUkMgNjgKKworLyoqCisgKiBAYnJpZWYgeGNiX3BvbHlfYXJjX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3BvbHlfYXJjX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGdjOyAvKio8ICAqLworfSB4Y2JfcG9seV9hcmNfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX3BvbHlfc2hhcGVfdCB7CisgICAgWENCX1BPTFlfU0hBUEVfQ09NUExFWCA9IDAsCisgICAgWENCX1BPTFlfU0hBUEVfTk9OQ09OVkVYID0gMSwKKyAgICBYQ0JfUE9MWV9TSEFQRV9DT05WRVggPSAyCit9IHhjYl9wb2x5X3NoYXBlX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9maWxsX3BvbHkuICovCisjZGVmaW5lIFhDQl9GSUxMX1BPTFkgNjkKKworLyoqCisgKiBAYnJpZWYgeGNiX2ZpbGxfcG9seV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9maWxsX3BvbHlfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZ2M7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgc2hhcGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgY29vcmRpbmF0ZV9tb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDFbMl07IC8qKjwgICovCit9IHhjYl9maWxsX3BvbHlfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcG9seV9maWxsX3JlY3RhbmdsZS4gKi8KKyNkZWZpbmUgWENCX1BPTFlfRklMTF9SRUNUQU5HTEUgNzAKKworLyoqCisgKiBAYnJpZWYgeGNiX3BvbHlfZmlsbF9yZWN0YW5nbGVfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcG9seV9maWxsX3JlY3RhbmdsZV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgLyoqPCAgKi8KK30geGNiX3BvbHlfZmlsbF9yZWN0YW5nbGVfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcG9seV9maWxsX2FyYy4gKi8KKyNkZWZpbmUgWENCX1BPTFlfRklMTF9BUkMgNzEKKworLyoqCisgKiBAYnJpZWYgeGNiX3BvbHlfZmlsbF9hcmNfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcG9seV9maWxsX2FyY19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgLyoqPCAgKi8KK30geGNiX3BvbHlfZmlsbF9hcmNfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2ltYWdlX2Zvcm1hdF90IHsKKyAgICBYQ0JfSU1BR0VfRk9STUFUX1hZX0JJVE1BUCA9IDAsCisgICAgWENCX0lNQUdFX0ZPUk1BVF9YWV9QSVhNQVAgPSAxLAorICAgIFhDQl9JTUFHRV9GT1JNQVRfWl9QSVhNQVAgPSAyCit9IHhjYl9pbWFnZV9mb3JtYXRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3B1dF9pbWFnZS4gKi8KKyNkZWZpbmUgWENCX1BVVF9JTUFHRSA3MgorCisvKioKKyAqIEBicmllZiB4Y2JfcHV0X2ltYWdlX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3B1dF9pbWFnZV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBmb3JtYXQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGdjOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGhlaWdodDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICBkc3RfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICBkc3RfeTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBsZWZ0X3BhZDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBkZXB0aDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwWzJdOyAvKio8ICAqLworfSB4Y2JfcHV0X2ltYWdlX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9pbWFnZV9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9pbWFnZV9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfZ2V0X2ltYWdlX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ2V0X2ltYWdlLiAqLworI2RlZmluZSBYQ0JfR0VUX0lNQUdFIDczCisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfaW1hZ2VfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2ltYWdlX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIGZvcm1hdDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICB5OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGhlaWdodDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBwbGFuZV9tYXNrOyAvKio8ICAqLworfSB4Y2JfZ2V0X2ltYWdlX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9pbWFnZV9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2ltYWdlX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgICAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgZGVwdGg7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl92aXN1YWxpZF90IHZpc3VhbDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwWzIwXTsgLyoqPCAgKi8KK30geGNiX2dldF9pbWFnZV9yZXBseV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcG9seV90ZXh0XzguICovCisjZGVmaW5lIFhDQl9QT0xZX1RFWFRfOCA3NAorCisvKioKKyAqIEBicmllZiB4Y2JfcG9seV90ZXh0XzhfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcG9seV90ZXh0XzhfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZ2M7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICB5OyAvKio8ICAqLworfSB4Y2JfcG9seV90ZXh0XzhfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcG9seV90ZXh0XzE2LiAqLworI2RlZmluZSBYQ0JfUE9MWV9URVhUXzE2IDc1CisKKy8qKgorICogQGJyaWVmIHhjYl9wb2x5X3RleHRfMTZfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcG9seV90ZXh0XzE2X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGdjOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgeTsgLyoqPCAgKi8KK30geGNiX3BvbHlfdGV4dF8xNl9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9pbWFnZV90ZXh0XzguICovCisjZGVmaW5lIFhDQl9JTUFHRV9URVhUXzggNzYKKworLyoqCisgKiBAYnJpZWYgeGNiX2ltYWdlX3RleHRfOF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9pbWFnZV90ZXh0XzhfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgc3RyaW5nX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZ2M7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICB5OyAvKio8ICAqLworfSB4Y2JfaW1hZ2VfdGV4dF84X3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2ltYWdlX3RleHRfMTYuICovCisjZGVmaW5lIFhDQl9JTUFHRV9URVhUXzE2IDc3CisKKy8qKgorICogQGJyaWVmIHhjYl9pbWFnZV90ZXh0XzE2X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2ltYWdlX3RleHRfMTZfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgc3RyaW5nX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZ2M7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICB5OyAvKio8ICAqLworfSB4Y2JfaW1hZ2VfdGV4dF8xNl9yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfY29sb3JtYXBfYWxsb2NfdCB7CisgICAgWENCX0NPTE9STUFQX0FMTE9DX05PTkUgPSAwLAorICAgIFhDQl9DT0xPUk1BUF9BTExPQ19BTEwgPSAxCit9IHhjYl9jb2xvcm1hcF9hbGxvY190OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY3JlYXRlX2NvbG9ybWFwLiAqLworI2RlZmluZSBYQ0JfQ1JFQVRFX0NPTE9STUFQIDc4CisKKy8qKgorICogQGJyaWVmIHhjYl9jcmVhdGVfY29sb3JtYXBfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY3JlYXRlX2NvbG9ybWFwX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIGFsbG9jOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfY29sb3JtYXBfdCBtaWQ7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgd2luZG93OyAvKio8ICAqLworICAgIHhjYl92aXN1YWxpZF90IHZpc3VhbDsgLyoqPCAgKi8KK30geGNiX2NyZWF0ZV9jb2xvcm1hcF9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9mcmVlX2NvbG9ybWFwLiAqLworI2RlZmluZSBYQ0JfRlJFRV9DT0xPUk1BUCA3OQorCisvKioKKyAqIEBicmllZiB4Y2JfZnJlZV9jb2xvcm1hcF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9mcmVlX2NvbG9ybWFwX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IC8qKjwgICovCit9IHhjYl9mcmVlX2NvbG9ybWFwX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NvcHlfY29sb3JtYXBfYW5kX2ZyZWUuICovCisjZGVmaW5lIFhDQl9DT1BZX0NPTE9STUFQX0FORF9GUkVFIDgwCisKKy8qKgorICogQGJyaWVmIHhjYl9jb3B5X2NvbG9ybWFwX2FuZF9mcmVlX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NvcHlfY29sb3JtYXBfYW5kX2ZyZWVfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2NvbG9ybWFwX3QgbWlkOyAvKio8ICAqLworICAgIHhjYl9jb2xvcm1hcF90IHNyY19jbWFwOyAvKio8ICAqLworfSB4Y2JfY29weV9jb2xvcm1hcF9hbmRfZnJlZV9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9pbnN0YWxsX2NvbG9ybWFwLiAqLworI2RlZmluZSBYQ0JfSU5TVEFMTF9DT0xPUk1BUCA4MQorCisvKioKKyAqIEBicmllZiB4Y2JfaW5zdGFsbF9jb2xvcm1hcF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9pbnN0YWxsX2NvbG9ybWFwX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IC8qKjwgICovCit9IHhjYl9pbnN0YWxsX2NvbG9ybWFwX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3VuaW5zdGFsbF9jb2xvcm1hcC4gKi8KKyNkZWZpbmUgWENCX1VOSU5TVEFMTF9DT0xPUk1BUCA4MgorCisvKioKKyAqIEBicmllZiB4Y2JfdW5pbnN0YWxsX2NvbG9ybWFwX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3VuaW5zdGFsbF9jb2xvcm1hcF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfY29sb3JtYXBfdCBjbWFwOyAvKio8ICAqLworfSB4Y2JfdW5pbnN0YWxsX2NvbG9ybWFwX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzLiAqLworI2RlZmluZSBYQ0JfTElTVF9JTlNUQUxMRURfQ09MT1JNQVBTIDgzCisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCit9IHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBjbWFwc19sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMVsyMl07IC8qKjwgICovCit9IHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2FsbG9jX2NvbG9yX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYWxsb2NfY29sb3JfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2FsbG9jX2NvbG9yX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfYWxsb2NfY29sb3IuICovCisjZGVmaW5lIFhDQl9BTExPQ19DT0xPUiA4NAorCisvKioKKyAqIEBicmllZiB4Y2JfYWxsb2NfY29sb3JfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYWxsb2NfY29sb3JfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2NvbG9ybWFwX3QgY21hcDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICByZWQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgZ3JlZW47IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgYmx1ZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQxWzJdOyAvKio8ICAqLworfSB4Y2JfYWxsb2NfY29sb3JfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfYWxsb2NfY29sb3JfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX2NvbG9yX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgcmVkOyAvKio8ICAqLworICAgIHVpbnQxNl90IGdyZWVuOyAvKio8ICAqLworICAgIHVpbnQxNl90IGJsdWU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMVsyXTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBwaXhlbDsgLyoqPCAgKi8KK30geGNiX2FsbG9jX2NvbG9yX3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9hbGxvY19uYW1lZF9jb2xvcl9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX25hbWVkX2NvbG9yX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9hbGxvY19uYW1lZF9jb2xvcl9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2FsbG9jX25hbWVkX2NvbG9yLiAqLworI2RlZmluZSBYQ0JfQUxMT0NfTkFNRURfQ09MT1IgODUKKworLyoqCisgKiBAYnJpZWYgeGNiX2FsbG9jX25hbWVkX2NvbG9yX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX25hbWVkX2NvbG9yX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbmFtZV9sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMVsyXTsgLyoqPCAgKi8KK30geGNiX2FsbG9jX25hbWVkX2NvbG9yX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2FsbG9jX25hbWVkX2NvbG9yX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9hbGxvY19uYW1lZF9jb2xvcl9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQzMl90IHBpeGVsOyAvKio8ICAqLworICAgIHVpbnQxNl90IGV4YWN0X3JlZDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBleGFjdF9ncmVlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBleGFjdF9ibHVlOyAvKio8ICAqLworICAgIHVpbnQxNl90IHZpc3VhbF9yZWQ7IC8qKjwgICovCisgICAgdWludDE2X3QgdmlzdWFsX2dyZWVuOyAvKio8ICAqLworICAgIHVpbnQxNl90IHZpc3VhbF9ibHVlOyAvKio8ICAqLworfSB4Y2JfYWxsb2NfbmFtZWRfY29sb3JfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2FsbG9jX2NvbG9yX2NlbGxzX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfYWxsb2NfY29sb3JfY2VsbHMuICovCisjZGVmaW5lIFhDQl9BTExPQ19DT0xPUl9DRUxMUyA4NgorCisvKioKKyAqIEBicmllZiB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgY29udGlndW91czsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2NvbG9ybWFwX3QgY21hcDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBjb2xvcnM7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgcGxhbmVzOyAvKio8ICAqLworfSB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgcGl4ZWxzX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBtYXNrc19sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMVsyMF07IC8qKjwgICovCit9IHhjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseV90OworCisvKioKKyAqIEBicmllZiB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9hbGxvY19jb2xvcl9wbGFuZXMuICovCisjZGVmaW5lIFhDQl9BTExPQ19DT0xPUl9QTEFORVMgODcKKworLyoqCisgKiBAYnJpZWYgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgY29udGlndW91czsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2NvbG9ybWFwX3QgY21hcDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBjb2xvcnM7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgcmVkczsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBncmVlbnM7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgYmx1ZXM7IC8qKjwgICovCit9IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBwaXhlbHNfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMl07IC8qKjwgICovCisgICAgdWludDMyX3QgcmVkX21hc2s7IC8qKjwgICovCisgICAgdWludDMyX3QgZ3JlZW5fbWFzazsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBibHVlX21hc2s7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMls4XTsgLyoqPCAgKi8KK30geGNiX2FsbG9jX2NvbG9yX3BsYW5lc19yZXBseV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZnJlZV9jb2xvcnMuICovCisjZGVmaW5lIFhDQl9GUkVFX0NPTE9SUyA4OAorCisvKioKKyAqIEBicmllZiB4Y2JfZnJlZV9jb2xvcnNfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZnJlZV9jb2xvcnNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2NvbG9ybWFwX3QgY21hcDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBwbGFuZV9tYXNrOyAvKio8ICAqLworfSB4Y2JfZnJlZV9jb2xvcnNfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2NvbG9yX2ZsYWdfdCB7CisgICAgWENCX0NPTE9SX0ZMQUdfUkVEID0gMSwKKyAgICBYQ0JfQ09MT1JfRkxBR19HUkVFTiA9IDIsCisgICAgWENCX0NPTE9SX0ZMQUdfQkxVRSA9IDQKK30geGNiX2NvbG9yX2ZsYWdfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2NvbG9yaXRlbV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY29sb3JpdGVtX3QgeworICAgIHVpbnQzMl90IHBpeGVsOyAvKio8ICAqLworICAgIHVpbnQxNl90IHJlZDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBncmVlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBibHVlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIGZsYWdzOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCit9IHhjYl9jb2xvcml0ZW1fdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2NvbG9yaXRlbV9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY29sb3JpdGVtX2l0ZXJhdG9yX3QgeworICAgIHhjYl9jb2xvcml0ZW1fdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfY29sb3JpdGVtX2l0ZXJhdG9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9zdG9yZV9jb2xvcnMuICovCisjZGVmaW5lIFhDQl9TVE9SRV9DT0xPUlMgODkKKworLyoqCisgKiBAYnJpZWYgeGNiX3N0b3JlX2NvbG9yc19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zdG9yZV9jb2xvcnNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2NvbG9ybWFwX3QgY21hcDsgLyoqPCAgKi8KK30geGNiX3N0b3JlX2NvbG9yc19yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9zdG9yZV9uYW1lZF9jb2xvci4gKi8KKyNkZWZpbmUgWENCX1NUT1JFX05BTUVEX0NPTE9SIDkwCisKKy8qKgorICogQGJyaWVmIHhjYl9zdG9yZV9uYW1lZF9jb2xvcl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zdG9yZV9uYW1lZF9jb2xvcl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBmbGFnczsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2NvbG9ybWFwX3QgY21hcDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBwaXhlbDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBuYW1lX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwWzJdOyAvKio8ICAqLworfSB4Y2Jfc3RvcmVfbmFtZWRfY29sb3JfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfcmdiX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9yZ2JfdCB7CisgICAgdWludDE2X3QgcmVkOyAvKio8ICAqLworICAgIHVpbnQxNl90IGdyZWVuOyAvKio8ICAqLworICAgIHVpbnQxNl90IGJsdWU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMFsyXTsgLyoqPCAgKi8KK30geGNiX3JnYl90OworCisvKioKKyAqIEBicmllZiB4Y2JfcmdiX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9yZ2JfaXRlcmF0b3JfdCB7CisgICAgeGNiX3JnYl90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9yZ2JfaXRlcmF0b3JfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X2NvbG9yc19jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X2NvbG9yc19jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfcXVlcnlfY29sb3JzX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcXVlcnlfY29sb3JzLiAqLworI2RlZmluZSBYQ0JfUVVFUllfQ09MT1JTIDkxCisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV9jb2xvcnNfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfY29sb3JzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IC8qKjwgICovCit9IHhjYl9xdWVyeV9jb2xvcnNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfY29sb3JzX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9jb2xvcnNfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBjb2xvcnNfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMjJdOyAvKio8ICAqLworfSB4Y2JfcXVlcnlfY29sb3JzX3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9sb29rdXBfY29sb3JfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9sb29rdXBfY29sb3JfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2xvb2t1cF9jb2xvcl9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2xvb2t1cF9jb2xvci4gKi8KKyNkZWZpbmUgWENCX0xPT0tVUF9DT0xPUiA5MgorCisvKioKKyAqIEBicmllZiB4Y2JfbG9va3VwX2NvbG9yX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2xvb2t1cF9jb2xvcl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfY29sb3JtYXBfdCBjbWFwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIG5hbWVfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDFbMl07IC8qKjwgICovCit9IHhjYl9sb29rdXBfY29sb3JfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfbG9va3VwX2NvbG9yX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9sb29rdXBfY29sb3JfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBleGFjdF9yZWQ7IC8qKjwgICovCisgICAgdWludDE2X3QgZXhhY3RfZ3JlZW47IC8qKjwgICovCisgICAgdWludDE2X3QgZXhhY3RfYmx1ZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCB2aXN1YWxfcmVkOyAvKio8ICAqLworICAgIHVpbnQxNl90IHZpc3VhbF9ncmVlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCB2aXN1YWxfYmx1ZTsgLyoqPCAgKi8KK30geGNiX2xvb2t1cF9jb2xvcl9yZXBseV90OworCit0eXBlZGVmIGVudW0geGNiX3BpeG1hcF9lbnVtX3QgeworICAgIFhDQl9QSVhNQVBfTk9ORSA9IDAKK30geGNiX3BpeG1hcF9lbnVtX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jcmVhdGVfY3Vyc29yLiAqLworI2RlZmluZSBYQ0JfQ1JFQVRFX0NVUlNPUiA5MworCisvKioKKyAqIEBicmllZiB4Y2JfY3JlYXRlX2N1cnNvcl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jcmVhdGVfY3Vyc29yX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jdXJzb3JfdCBjaWQ7IC8qKjwgICovCisgICAgeGNiX3BpeG1hcF90IHNvdXJjZTsgLyoqPCAgKi8KKyAgICB4Y2JfcGl4bWFwX3QgbWFzazsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgZm9yZV9yZWQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGZvcmVfZ3JlZW47IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGZvcmVfYmx1ZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgYmFja19yZWQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGJhY2tfZ3JlZW47IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGJhY2tfYmx1ZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgeDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgeTsgLyoqPCAgKi8KK30geGNiX2NyZWF0ZV9jdXJzb3JfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2ZvbnRfZW51bV90IHsKKyAgICBYQ0JfRk9OVF9OT05FID0gMAorfSB4Y2JfZm9udF9lbnVtX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jcmVhdGVfZ2x5cGhfY3Vyc29yLiAqLworI2RlZmluZSBYQ0JfQ1JFQVRFX0dMWVBIX0NVUlNPUiA5NAorCisvKioKKyAqIEBicmllZiB4Y2JfY3JlYXRlX2dseXBoX2N1cnNvcl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jcmVhdGVfZ2x5cGhfY3Vyc29yX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jdXJzb3JfdCBjaWQ7IC8qKjwgICovCisgICAgeGNiX2ZvbnRfdCAgIHNvdXJjZV9mb250OyAvKio8ICAqLworICAgIHhjYl9mb250X3QgICBtYXNrX2ZvbnQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNvdXJjZV9jaGFyOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBtYXNrX2NoYXI7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGZvcmVfcmVkOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBmb3JlX2dyZWVuOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBmb3JlX2JsdWU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGJhY2tfcmVkOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBiYWNrX2dyZWVuOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBiYWNrX2JsdWU7IC8qKjwgICovCit9IHhjYl9jcmVhdGVfZ2x5cGhfY3Vyc29yX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2ZyZWVfY3Vyc29yLiAqLworI2RlZmluZSBYQ0JfRlJFRV9DVVJTT1IgOTUKKworLyoqCisgKiBAYnJpZWYgeGNiX2ZyZWVfY3Vyc29yX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2ZyZWVfY3Vyc29yX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jdXJzb3JfdCBjdXJzb3I7IC8qKjwgICovCit9IHhjYl9mcmVlX2N1cnNvcl9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9yZWNvbG9yX2N1cnNvci4gKi8KKyNkZWZpbmUgWENCX1JFQ09MT1JfQ1VSU09SIDk2CisKKy8qKgorICogQGJyaWVmIHhjYl9yZWNvbG9yX2N1cnNvcl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9yZWNvbG9yX2N1cnNvcl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfY3Vyc29yX3QgY3Vyc29yOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBmb3JlX3JlZDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgZm9yZV9ncmVlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgZm9yZV9ibHVlOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBiYWNrX3JlZDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgYmFja19ncmVlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgYmFja19ibHVlOyAvKio8ICAqLworfSB4Y2JfcmVjb2xvcl9jdXJzb3JfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX3F1ZXJ5X3NoYXBlX29mX3QgeworICAgIFhDQl9RVUVSWV9TSEFQRV9PRl9MQVJHRVNUX0NVUlNPUiA9IDAsCisgICAgWENCX1FVRVJZX1NIQVBFX09GX0ZBU1RFU1RfVElMRSA9IDEsCisgICAgWENCX1FVRVJZX1NIQVBFX09GX0ZBU1RFU1RfU1RJUFBMRSA9IDIKK30geGNiX3F1ZXJ5X3NoYXBlX29mX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV9iZXN0X3NpemVfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9iZXN0X3NpemVfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3F1ZXJ5X2Jlc3Rfc2l6ZS4gKi8KKyNkZWZpbmUgWENCX1FVRVJZX0JFU1RfU0laRSA5NworCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfYmVzdF9zaXplX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBfY2xhc3M7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGhlaWdodDsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV9iZXN0X3NpemVfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQxNl90IHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90IGhlaWdodDsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9yZXBseV90OworCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfZXh0ZW5zaW9uX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfZXh0ZW5zaW9uX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9xdWVyeV9leHRlbnNpb25fY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9xdWVyeV9leHRlbnNpb24uICovCisjZGVmaW5lIFhDQl9RVUVSWV9FWFRFTlNJT04gOTgKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X2V4dGVuc2lvbl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9leHRlbnNpb25fcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgbmFtZV9sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMVsyXTsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X2V4dGVuc2lvbl9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV9leHRlbnNpb25fcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X2V4dGVuc2lvbl9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHByZXNlbnQ7IC8qKjwgICovCisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIGZpcnN0X2V2ZW50OyAvKio8ICAqLworICAgIHVpbnQ4X3QgIGZpcnN0X2Vycm9yOyAvKio8ICAqLworfSB4Y2JfcXVlcnlfZXh0ZW5zaW9uX3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X2V4dGVuc2lvbnNfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X2V4dGVuc2lvbnNfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2xpc3RfZXh0ZW5zaW9uc19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2xpc3RfZXh0ZW5zaW9ucy4gKi8KKyNkZWZpbmUgWENCX0xJU1RfRVhURU5TSU9OUyA5OQorCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9leHRlbnNpb25zX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfZXh0ZW5zaW9uc19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX2xpc3RfZXh0ZW5zaW9uc19yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X2V4dGVuc2lvbnNfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfZXh0ZW5zaW9uc19yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIG5hbWVzX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMFsyNF07IC8qKjwgICovCit9IHhjYl9saXN0X2V4dGVuc2lvbnNfcmVwbHlfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NoYW5nZV9rZXlib2FyZF9tYXBwaW5nLiAqLworI2RlZmluZSBYQ0JfQ0hBTkdFX0tFWUJPQVJEX01BUFBJTkcgMTAwCisKKy8qKgorICogQGJyaWVmIHhjYl9jaGFuZ2Vfa2V5Ym9hcmRfbWFwcGluZ19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jaGFuZ2Vfa2V5Ym9hcmRfbWFwcGluZ19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAga2V5Y29kZV9jb3VudDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfa2V5Y29kZV90IGZpcnN0X2tleWNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBrZXlzeW1zX3Blcl9rZXljb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgcGFkMFsyXTsgLyoqPCAgKi8KK30geGNiX2NoYW5nZV9rZXlib2FyZF9tYXBwaW5nX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmcuICovCisjZGVmaW5lIFhDQl9HRVRfS0VZQk9BUkRfTUFQUElORyAxMDEKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9rZXljb2RlX3QgZmlyc3Rfa2V5Y29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIGNvdW50OyAvKio8ICAqLworfSB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAga2V5c3ltc19wZXJfa2V5Y29kZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMFsyNF07IC8qKjwgICovCit9IHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXBseV90OworCit0eXBlZGVmIGVudW0geGNiX2tiX3QgeworICAgIFhDQl9LQl9LRVlfQ0xJQ0tfUEVSQ0VOVCA9IDEsCisgICAgWENCX0tCX0JFTExfUEVSQ0VOVCA9IDIsCisgICAgWENCX0tCX0JFTExfUElUQ0ggPSA0LAorICAgIFhDQl9LQl9CRUxMX0RVUkFUSU9OID0gOCwKKyAgICBYQ0JfS0JfTEVEID0gMTYsCisgICAgWENCX0tCX0xFRF9NT0RFID0gMzIsCisgICAgWENCX0tCX0tFWSA9IDY0LAorICAgIFhDQl9LQl9BVVRPX1JFUEVBVF9NT0RFID0gMTI4Cit9IHhjYl9rYl90OworCit0eXBlZGVmIGVudW0geGNiX2xlZF9tb2RlX3QgeworICAgIFhDQl9MRURfTU9ERV9PRkYgPSAwLAorICAgIFhDQl9MRURfTU9ERV9PTiA9IDEKK30geGNiX2xlZF9tb2RlX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfYXV0b19yZXBlYXRfbW9kZV90IHsKKyAgICBYQ0JfQVVUT19SRVBFQVRfTU9ERV9PRkYgPSAwLAorICAgIFhDQl9BVVRPX1JFUEVBVF9NT0RFX09OID0gMSwKKyAgICBYQ0JfQVVUT19SRVBFQVRfTU9ERV9ERUZBVUxUID0gMgorfSB4Y2JfYXV0b19yZXBlYXRfbW9kZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY2hhbmdlX2tleWJvYXJkX2NvbnRyb2wuICovCisjZGVmaW5lIFhDQl9DSEFOR0VfS0VZQk9BUkRfQ09OVFJPTCAxMDIKKworLyoqCisgKiBAYnJpZWYgeGNiX2NoYW5nZV9rZXlib2FyZF9jb250cm9sX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYW5nZV9rZXlib2FyZF9jb250cm9sX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQzMl90IHZhbHVlX21hc2s7IC8qKjwgICovCit9IHhjYl9jaGFuZ2Vfa2V5Ym9hcmRfY29udHJvbF9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9rZXlib2FyZF9jb250cm9sX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF9rZXlib2FyZF9jb250cm9sLiAqLworI2RlZmluZSBYQ0JfR0VUX0tFWUJPQVJEX0NPTlRST0wgMTAzCisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX2dldF9rZXlib2FyZF9jb250cm9sX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9rZXlib2FyZF9jb250cm9sX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIGdsb2JhbF9hdXRvX3JlcGVhdDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVkX21hc2s7IC8qKjwgICovCisgICAgdWludDhfdCAga2V5X2NsaWNrX3BlcmNlbnQ7IC8qKjwgICovCisgICAgdWludDhfdCAgYmVsbF9wZXJjZW50OyAvKio8ICAqLworICAgIHVpbnQxNl90IGJlbGxfcGl0Y2g7IC8qKjwgICovCisgICAgdWludDE2X3QgYmVsbF9kdXJhdGlvbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwWzJdOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIGF1dG9fcmVwZWF0c1szMl07IC8qKjwgICovCit9IHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9yZXBseV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfYmVsbC4gKi8KKyNkZWZpbmUgWENCX0JFTEwgMTA0CisKKy8qKgorICogQGJyaWVmIHhjYl9iZWxsX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2JlbGxfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgaW50OF90ICAgcGVyY2VudDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9iZWxsX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NoYW5nZV9wb2ludGVyX2NvbnRyb2wuICovCisjZGVmaW5lIFhDQl9DSEFOR0VfUE9JTlRFUl9DT05UUk9MIDEwNQorCisvKioKKyAqIEBicmllZiB4Y2JfY2hhbmdlX3BvaW50ZXJfY29udHJvbF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jaGFuZ2VfcG9pbnRlcl9jb250cm9sX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworICAgIGludDE2X3QgIGFjY2VsZXJhdGlvbl9udW1lcmF0b3I7IC8qKjwgICovCisgICAgaW50MTZfdCAgYWNjZWxlcmF0aW9uX2Rlbm9taW5hdG9yOyAvKio8ICAqLworICAgIGludDE2X3QgIHRocmVzaG9sZDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBkb19hY2NlbGVyYXRpb247IC8qKjwgICovCisgICAgdWludDhfdCAgZG9fdGhyZXNob2xkOyAvKio8ICAqLworfSB4Y2JfY2hhbmdlX3BvaW50ZXJfY29udHJvbF9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfcG9pbnRlcl9jb250cm9sX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF9wb2ludGVyX2NvbnRyb2wuICovCisjZGVmaW5lIFhDQl9HRVRfUE9JTlRFUl9DT05UUk9MIDEwNgorCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfcG9pbnRlcl9jb250cm9sX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfcG9pbnRlcl9jb250cm9sX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfcG9pbnRlcl9jb250cm9sX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgYWNjZWxlcmF0aW9uX251bWVyYXRvcjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBhY2NlbGVyYXRpb25fZGVub21pbmF0b3I7IC8qKjwgICovCisgICAgdWludDE2X3QgdGhyZXNob2xkOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMThdOyAvKio8ICAqLworfSB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9yZXBseV90OworCit0eXBlZGVmIGVudW0geGNiX2JsYW5raW5nX3QgeworICAgIFhDQl9CTEFOS0lOR19OT1RfUFJFRkVSUkVEID0gMCwKKyAgICBYQ0JfQkxBTktJTkdfUFJFRkVSUkVEID0gMSwKKyAgICBYQ0JfQkxBTktJTkdfREVGQVVMVCA9IDIKK30geGNiX2JsYW5raW5nX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfZXhwb3N1cmVzX3QgeworICAgIFhDQl9FWFBPU1VSRVNfTk9UX0FMTE9XRUQgPSAwLAorICAgIFhDQl9FWFBPU1VSRVNfQUxMT1dFRCA9IDEsCisgICAgWENCX0VYUE9TVVJFU19ERUZBVUxUID0gMgorfSB4Y2JfZXhwb3N1cmVzX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9zZXRfc2NyZWVuX3NhdmVyLiAqLworI2RlZmluZSBYQ0JfU0VUX1NDUkVFTl9TQVZFUiAxMDcKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldF9zY3JlZW5fc2F2ZXJfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0X3NjcmVlbl9zYXZlcl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICB0aW1lb3V0OyAvKio8ICAqLworICAgIGludDE2X3QgIGludGVydmFsOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHByZWZlcl9ibGFua2luZzsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBhbGxvd19leHBvc3VyZXM7IC8qKjwgICovCit9IHhjYl9zZXRfc2NyZWVuX3NhdmVyX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9zY3JlZW5fc2F2ZXJfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfc2NyZWVuX3NhdmVyX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9nZXRfc2NyZWVuX3NhdmVyX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ2V0X3NjcmVlbl9zYXZlci4gKi8KKyNkZWZpbmUgWENCX0dFVF9TQ1JFRU5fU0FWRVIgMTA4CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfc2NyZWVuX3NhdmVyX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9zY3JlZW5fc2F2ZXJfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9nZXRfc2NyZWVuX3NhdmVyX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9zY3JlZW5fc2F2ZXJfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9zY3JlZW5fc2F2ZXJfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCB0aW1lb3V0OyAvKio8ICAqLworICAgIHVpbnQxNl90IGludGVydmFsOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHByZWZlcl9ibGFua2luZzsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBhbGxvd19leHBvc3VyZXM7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMVsxOF07IC8qKjwgICovCit9IHhjYl9nZXRfc2NyZWVuX3NhdmVyX3JlcGx5X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfaG9zdF9tb2RlX3QgeworICAgIFhDQl9IT1NUX01PREVfSU5TRVJUID0gMCwKKyAgICBYQ0JfSE9TVF9NT0RFX0RFTEVURSA9IDEKK30geGNiX2hvc3RfbW9kZV90OworCit0eXBlZGVmIGVudW0geGNiX2ZhbWlseV90IHsKKyAgICBYQ0JfRkFNSUxZX0lOVEVSTkVUID0gMCwKKyAgICBYQ0JfRkFNSUxZX0RFQ05FVCA9IDEsCisgICAgWENCX0ZBTUlMWV9DSEFPUyA9IDIsCisgICAgWENCX0ZBTUlMWV9TRVJWRVJfSU5URVJQUkVURUQgPSA1LAorICAgIFhDQl9GQU1JTFlfSU5URVJORVRfNiA9IDYKK30geGNiX2ZhbWlseV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY2hhbmdlX2hvc3RzLiAqLworI2RlZmluZSBYQ0JfQ0hBTkdFX0hPU1RTIDEwOQorCisvKioKKyAqIEBicmllZiB4Y2JfY2hhbmdlX2hvc3RzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYW5nZV9ob3N0c19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBtb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBmYW1pbHk7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBhZGRyZXNzX2xlbjsgLyoqPCAgKi8KK30geGNiX2NoYW5nZV9ob3N0c19yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9ob3N0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9ob3N0X3QgeworICAgIHVpbnQ4X3QgIGZhbWlseTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGFkZHJlc3NfbGVuOyAvKio8ICAqLworfSB4Y2JfaG9zdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfaG9zdF9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfaG9zdF9pdGVyYXRvcl90IHsKKyAgICB4Y2JfaG9zdF90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX2hvc3RfaXRlcmF0b3JfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2xpc3RfaG9zdHNfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X2hvc3RzX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9saXN0X2hvc3RzX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfbGlzdF9ob3N0cy4gKi8KKyNkZWZpbmUgWENCX0xJU1RfSE9TVFMgMTEwCisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X2hvc3RzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfaG9zdHNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9saXN0X2hvc3RzX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2xpc3RfaG9zdHNfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfaG9zdHNfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBtb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBob3N0c19sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMFsyMl07IC8qKjwgICovCit9IHhjYl9saXN0X2hvc3RzX3JlcGx5X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfYWNjZXNzX2NvbnRyb2xfdCB7CisgICAgWENCX0FDQ0VTU19DT05UUk9MX0RJU0FCTEUgPSAwLAorICAgIFhDQl9BQ0NFU1NfQ09OVFJPTF9FTkFCTEUgPSAxCit9IHhjYl9hY2Nlc3NfY29udHJvbF90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfc2V0X2FjY2Vzc19jb250cm9sLiAqLworI2RlZmluZSBYQ0JfU0VUX0FDQ0VTU19DT05UUk9MIDExMQorCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0X2FjY2Vzc19jb250cm9sX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9hY2Nlc3NfY29udHJvbF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBtb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX3NldF9hY2Nlc3NfY29udHJvbF9yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfY2xvc2VfZG93bl90IHsKKyAgICBYQ0JfQ0xPU0VfRE9XTl9ERVNUUk9ZX0FMTCA9IDAsCisgICAgWENCX0NMT1NFX0RPV05fUkVUQUlOX1BFUk1BTkVOVCA9IDEsCisgICAgWENCX0NMT1NFX0RPV05fUkVUQUlOX1RFTVBPUkFSWSA9IDIKK30geGNiX2Nsb3NlX2Rvd25fdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3NldF9jbG9zZV9kb3duX21vZGUuICovCisjZGVmaW5lIFhDQl9TRVRfQ0xPU0VfRE9XTl9NT0RFIDExMgorCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0X2Nsb3NlX2Rvd25fbW9kZV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXRfY2xvc2VfZG93bl9tb2RlX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIG1vZGU7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2Jfc2V0X2Nsb3NlX2Rvd25fbW9kZV9yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2Jfa2lsbF90IHsKKyAgICBYQ0JfS0lMTF9BTExfVEVNUE9SQVJZID0gMAorfSB4Y2Jfa2lsbF90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfa2lsbF9jbGllbnQuICovCisjZGVmaW5lIFhDQl9LSUxMX0NMSUVOVCAxMTMKKworLyoqCisgKiBAYnJpZWYgeGNiX2tpbGxfY2xpZW50X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2tpbGxfY2xpZW50X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQzMl90IHJlc291cmNlOyAvKio8ICAqLworfSB4Y2Jfa2lsbF9jbGllbnRfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfcm90YXRlX3Byb3BlcnRpZXMuICovCisjZGVmaW5lIFhDQl9ST1RBVEVfUFJPUEVSVElFUyAxMTQKKworLyoqCisgKiBAYnJpZWYgeGNiX3JvdGF0ZV9wcm9wZXJ0aWVzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3JvdGF0ZV9wcm9wZXJ0aWVzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGF0b21zX2xlbjsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgZGVsdGE7IC8qKjwgICovCit9IHhjYl9yb3RhdGVfcHJvcGVydGllc19yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2Jfc2NyZWVuX3NhdmVyX3QgeworICAgIFhDQl9TQ1JFRU5fU0FWRVJfUkVTRVQgPSAwLAorICAgIFhDQl9TQ1JFRU5fU0FWRVJfQUNUSVZFID0gMQorfSB4Y2Jfc2NyZWVuX3NhdmVyX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9mb3JjZV9zY3JlZW5fc2F2ZXIuICovCisjZGVmaW5lIFhDQl9GT1JDRV9TQ1JFRU5fU0FWRVIgMTE1CisKKy8qKgorICogQGJyaWVmIHhjYl9mb3JjZV9zY3JlZW5fc2F2ZXJfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZm9yY2Vfc2NyZWVuX3NhdmVyX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIG1vZGU7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2JfZm9yY2Vfc2NyZWVuX3NhdmVyX3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9tYXBwaW5nX3N0YXR1c190IHsKKyAgICBYQ0JfTUFQUElOR19TVEFUVVNfU1VDQ0VTUyA9IDAsCisgICAgWENCX01BUFBJTkdfU1RBVFVTX0JVU1kgPSAxLAorICAgIFhDQl9NQVBQSU5HX1NUQVRVU19GQUlMVVJFID0gMgorfSB4Y2JfbWFwcGluZ19zdGF0dXNfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZy4gKi8KKyNkZWZpbmUgWENCX1NFVF9QT0lOVEVSX01BUFBJTkcgMTE2CisKKy8qKgorICogQGJyaWVmIHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9wb2ludGVyX21hcHBpbmdfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgbWFwX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBzdGF0dXM7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2dldF9wb2ludGVyX21hcHBpbmdfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nLiAqLworI2RlZmluZSBYQ0JfR0VUX1BPSU5URVJfTUFQUElORyAxMTcKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIG1hcF9sZW47IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDBbMjRdOyAvKio8ICAqLworfSB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90OworCit0eXBlZGVmIGVudW0geGNiX21hcF9pbmRleF90IHsKKyAgICBYQ0JfTUFQX0lOREVYX1NISUZUID0gMCwKKyAgICBYQ0JfTUFQX0lOREVYX0xPQ0sgPSAxLAorICAgIFhDQl9NQVBfSU5ERVhfQ09OVFJPTCA9IDIsCisgICAgWENCX01BUF9JTkRFWF8xID0gMywKKyAgICBYQ0JfTUFQX0lOREVYXzIgPSA0LAorICAgIFhDQl9NQVBfSU5ERVhfMyA9IDUsCisgICAgWENCX01BUF9JTkRFWF80ID0gNiwKKyAgICBYQ0JfTUFQX0lOREVYXzUgPSA3Cit9IHhjYl9tYXBfaW5kZXhfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmcuICovCisjZGVmaW5lIFhDQl9TRVRfTU9ESUZJRVJfTUFQUElORyAxMTgKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIGtleWNvZGVzX3Blcl9tb2RpZmllcjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBzdGF0dXM7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmcuICovCisjZGVmaW5lIFhDQl9HRVRfTU9ESUZJRVJfTUFQUElORyAxMTkKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAga2V5Y29kZXNfcGVyX21vZGlmaWVyOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwWzI0XTsgLyoqPCAgKi8KK30geGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9ub19vcGVyYXRpb24uICovCisjZGVmaW5lIFhDQl9OT19PUEVSQVRJT04gMTI3CisKKy8qKgorICogQGJyaWVmIHhjYl9ub19vcGVyYXRpb25fcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfbm9fb3BlcmF0aW9uX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2Jfbm9fb3BlcmF0aW9uX3JlcXVlc3RfdDsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfY2hhcjJiX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2NoYXIyYl90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfY2hhcjJiX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2NoYXIyYl9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfY2hhcjJiX25leHQgKHhjYl9jaGFyMmJfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfY2hhcjJiX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2NoYXIyYl9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2NoYXIyYl9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9jaGFyMmJfZW5kICh4Y2JfY2hhcjJiX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX3dpbmRvd19pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl93aW5kb3dfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX3dpbmRvd19uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl93aW5kb3dfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX3dpbmRvd19uZXh0ICh4Y2Jfd2luZG93X2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX3dpbmRvd19pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl93aW5kb3dfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl93aW5kb3dfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfd2luZG93X2VuZCAoeGNiX3dpbmRvd19pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9waXhtYXBfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfcGl4bWFwX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9waXhtYXBfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfcGl4bWFwX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9waXhtYXBfbmV4dCAoeGNiX3BpeG1hcF9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9waXhtYXBfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfcGl4bWFwX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfcGl4bWFwX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX3BpeG1hcF9lbmQgKHhjYl9waXhtYXBfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfY3Vyc29yX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2N1cnNvcl90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfY3Vyc29yX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2N1cnNvcl9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfY3Vyc29yX25leHQgKHhjYl9jdXJzb3JfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfY3Vyc29yX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2N1cnNvcl9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2N1cnNvcl9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9jdXJzb3JfZW5kICh4Y2JfY3Vyc29yX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2ZvbnRfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfZm9udF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfZm9udF9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9mb250X2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9mb250X25leHQgKHhjYl9mb250X2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2ZvbnRfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfZm9udF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2ZvbnRfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfZm9udF9lbmQgKHhjYl9mb250X2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2djb250ZXh0X2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2djb250ZXh0X3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9nY29udGV4dF9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfZ2NvbnRleHRfbmV4dCAoeGNiX2djb250ZXh0X2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2djb250ZXh0X2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2djb250ZXh0X2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfZ2NvbnRleHRfZW5kICh4Y2JfZ2NvbnRleHRfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfY29sb3JtYXBfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfY29sb3JtYXBfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX2NvbG9ybWFwX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9jb2xvcm1hcF9uZXh0ICh4Y2JfY29sb3JtYXBfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfY29sb3JtYXBfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfY29sb3JtYXBfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9jb2xvcm1hcF9lbmQgKHhjYl9jb2xvcm1hcF9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9hdG9tX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2F0b21fdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX2F0b21fbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfYXRvbV9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfYXRvbV9uZXh0ICh4Y2JfYXRvbV9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9hdG9tX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2F0b21fZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9hdG9tX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2F0b21fZW5kICh4Y2JfYXRvbV9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9kcmF3YWJsZV9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9kcmF3YWJsZV90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfZHJhd2FibGVfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX2RyYXdhYmxlX25leHQgKHhjYl9kcmF3YWJsZV9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9kcmF3YWJsZV9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9kcmF3YWJsZV9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2RyYXdhYmxlX2VuZCAoeGNiX2RyYXdhYmxlX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2ZvbnRhYmxlX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2ZvbnRhYmxlX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9mb250YWJsZV9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9mb250YWJsZV9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfZm9udGFibGVfbmV4dCAoeGNiX2ZvbnRhYmxlX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2ZvbnRhYmxlX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2ZvbnRhYmxlX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfZm9udGFibGVfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfZm9udGFibGVfZW5kICh4Y2JfZm9udGFibGVfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfdmlzdWFsaWRfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfdmlzdWFsaWRfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX3Zpc3VhbGlkX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3Zpc3VhbGlkX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl92aXN1YWxpZF9uZXh0ICh4Y2JfdmlzdWFsaWRfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfdmlzdWFsaWRfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfdmlzdWFsaWRfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl92aXN1YWxpZF9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl92aXN1YWxpZF9lbmQgKHhjYl92aXN1YWxpZF9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl90aW1lc3RhbXBfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfdGltZXN0YW1wX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl90aW1lc3RhbXBfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl90aW1lc3RhbXBfbmV4dCAoeGNiX3RpbWVzdGFtcF9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl90aW1lc3RhbXBfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfdGltZXN0YW1wX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX3RpbWVzdGFtcF9lbmQgKHhjYl90aW1lc3RhbXBfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2Jfa2V5c3ltX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2tleXN5bV90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2Jfa2V5c3ltX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2tleXN5bV9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2Jfa2V5c3ltX25leHQgKHhjYl9rZXlzeW1faXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2Jfa2V5c3ltX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2tleXN5bV9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2tleXN5bV9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9rZXlzeW1fZW5kICh4Y2Jfa2V5c3ltX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2tleWNvZGVfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2Jfa2V5Y29kZV90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2Jfa2V5Y29kZV9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9rZXljb2RlX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9rZXljb2RlX25leHQgKHhjYl9rZXljb2RlX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2tleWNvZGVfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2Jfa2V5Y29kZV9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2tleWNvZGVfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfa2V5Y29kZV9lbmQgKHhjYl9rZXljb2RlX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2J1dHRvbl9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9idXR0b25fdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX2J1dHRvbl9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9idXR0b25faXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX2J1dHRvbl9uZXh0ICh4Y2JfYnV0dG9uX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2J1dHRvbl9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9idXR0b25fZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9idXR0b25faXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfYnV0dG9uX2VuZCAoeGNiX2J1dHRvbl9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9wb2ludF9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9wb2ludF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfcG9pbnRfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfcG9pbnRfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX3BvaW50X25leHQgKHhjYl9wb2ludF9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9wb2ludF9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9wb2ludF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3BvaW50X2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX3BvaW50X2VuZCAoeGNiX3BvaW50X2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX3JlY3RhbmdsZV9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9yZWN0YW5nbGVfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX3JlY3RhbmdsZV9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9yZWN0YW5nbGVfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX3JlY3RhbmdsZV9uZXh0ICh4Y2JfcmVjdGFuZ2xlX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX3JlY3RhbmdsZV9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9yZWN0YW5nbGVfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9yZWN0YW5nbGVfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfcmVjdGFuZ2xlX2VuZCAoeGNiX3JlY3RhbmdsZV9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9hcmNfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfYXJjX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9hcmNfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfYXJjX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9hcmNfbmV4dCAoeGNiX2FyY19pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9hcmNfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfYXJjX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfYXJjX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2FyY19lbmQgKHhjYl9hcmNfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfZm9ybWF0X2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2Zvcm1hdF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfZm9ybWF0X25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Zvcm1hdF9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfZm9ybWF0X25leHQgKHhjYl9mb3JtYXRfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfZm9ybWF0X2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2Zvcm1hdF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Zvcm1hdF9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9mb3JtYXRfZW5kICh4Y2JfZm9ybWF0X2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX3Zpc3VhbHR5cGVfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfdmlzdWFsdHlwZV90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfdmlzdWFsdHlwZV9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl92aXN1YWx0eXBlX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl92aXN1YWx0eXBlX25leHQgKHhjYl92aXN1YWx0eXBlX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX3Zpc3VhbHR5cGVfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfdmlzdWFsdHlwZV9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3Zpc3VhbHR5cGVfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfdmlzdWFsdHlwZV9lbmQgKHhjYl92aXN1YWx0eXBlX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2RlcHRoX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3Zpc3VhbHR5cGVfdCAqIHhjYl9kZXB0aF92aXN1YWxzCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9kZXB0aF90ICpSCisgKiogQHJldHVybnMgeGNiX3Zpc3VhbHR5cGVfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92aXN1YWx0eXBlX3QgKgoreGNiX2RlcHRoX3Zpc3VhbHMgKGNvbnN0IHhjYl9kZXB0aF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfZGVwdGhfdmlzdWFsc19sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2RlcHRoX3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfZGVwdGhfdmlzdWFsc19sZW5ndGggKGNvbnN0IHhjYl9kZXB0aF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92aXN1YWx0eXBlX2l0ZXJhdG9yX3QgeGNiX2RlcHRoX3Zpc3VhbHNfaXRlcmF0b3IKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2RlcHRoX3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfdmlzdWFsdHlwZV9pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92aXN1YWx0eXBlX2l0ZXJhdG9yX3QKK3hjYl9kZXB0aF92aXN1YWxzX2l0ZXJhdG9yIChjb25zdCB4Y2JfZGVwdGhfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2RlcHRoX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2RlcHRoX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9kZXB0aF9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9kZXB0aF9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfZGVwdGhfbmV4dCAoeGNiX2RlcHRoX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2RlcHRoX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2RlcHRoX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfZGVwdGhfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfZGVwdGhfZW5kICh4Y2JfZGVwdGhfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworaW50Cit4Y2Jfc2NyZWVuX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9zY3JlZW5fYWxsb3dlZF9kZXB0aHNfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zY3JlZW5fdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9zY3JlZW5fYWxsb3dlZF9kZXB0aHNfbGVuZ3RoIChjb25zdCB4Y2Jfc2NyZWVuX3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2RlcHRoX2l0ZXJhdG9yX3QgeGNiX3NjcmVlbl9hbGxvd2VkX2RlcHRoc19pdGVyYXRvcgorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2NyZWVuX3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZGVwdGhfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZGVwdGhfaXRlcmF0b3JfdAoreGNiX3NjcmVlbl9hbGxvd2VkX2RlcHRoc19pdGVyYXRvciAoY29uc3QgeGNiX3NjcmVlbl90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2Jfc2NyZWVuX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX3NjcmVlbl90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2Jfc2NyZWVuX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3NjcmVlbl9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2Jfc2NyZWVuX25leHQgKHhjYl9zY3JlZW5faXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2Jfc2NyZWVuX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3NjcmVlbl9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3NjcmVlbl9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9zY3JlZW5fZW5kICh4Y2Jfc2NyZWVuX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3NldHVwX3JlcXVlc3Rfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBjaGFyICogeGNiX3NldHVwX3JlcXVlc3RfYXV0aG9yaXphdGlvbl9wcm90b2NvbF9uYW1lCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZXR1cF9yZXF1ZXN0X3QgKlIKKyAqKiBAcmV0dXJucyBjaGFyICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorY2hhciAqCit4Y2Jfc2V0dXBfcmVxdWVzdF9hdXRob3JpemF0aW9uX3Byb3RvY29sX25hbWUgKGNvbnN0IHhjYl9zZXR1cF9yZXF1ZXN0X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9zZXR1cF9yZXF1ZXN0X2F1dGhvcml6YXRpb25fcHJvdG9jb2xfbmFtZV9sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NldHVwX3JlcXVlc3RfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9zZXR1cF9yZXF1ZXN0X2F1dGhvcml6YXRpb25fcHJvdG9jb2xfbmFtZV9sZW5ndGggKGNvbnN0IHhjYl9zZXR1cF9yZXF1ZXN0X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2Jfc2V0dXBfcmVxdWVzdF9hdXRob3JpemF0aW9uX3Byb3RvY29sX25hbWVfZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZXR1cF9yZXF1ZXN0X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9zZXR1cF9yZXF1ZXN0X2F1dGhvcml6YXRpb25fcHJvdG9jb2xfbmFtZV9lbmQgKGNvbnN0IHhjYl9zZXR1cF9yZXF1ZXN0X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogY2hhciAqIHhjYl9zZXR1cF9yZXF1ZXN0X2F1dGhvcml6YXRpb25fcHJvdG9jb2xfZGF0YQorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfcmVxdWVzdF90ICpSCisgKiogQHJldHVybnMgY2hhciAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2NoYXIgKgoreGNiX3NldHVwX3JlcXVlc3RfYXV0aG9yaXphdGlvbl9wcm90b2NvbF9kYXRhIChjb25zdCB4Y2Jfc2V0dXBfcmVxdWVzdF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2Jfc2V0dXBfcmVxdWVzdF9hdXRob3JpemF0aW9uX3Byb3RvY29sX2RhdGFfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZXR1cF9yZXF1ZXN0X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2Jfc2V0dXBfcmVxdWVzdF9hdXRob3JpemF0aW9uX3Byb3RvY29sX2RhdGFfbGVuZ3RoIChjb25zdCB4Y2Jfc2V0dXBfcmVxdWVzdF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3NldHVwX3JlcXVlc3RfYXV0aG9yaXphdGlvbl9wcm90b2NvbF9kYXRhX2VuZAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfcmVxdWVzdF90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfc2V0dXBfcmVxdWVzdF9hdXRob3JpemF0aW9uX3Byb3RvY29sX2RhdGFfZW5kIChjb25zdCB4Y2Jfc2V0dXBfcmVxdWVzdF90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2Jfc2V0dXBfcmVxdWVzdF9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9zZXR1cF9yZXF1ZXN0X3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9zZXR1cF9yZXF1ZXN0X25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3NldHVwX3JlcXVlc3RfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX3NldHVwX3JlcXVlc3RfbmV4dCAoeGNiX3NldHVwX3JlcXVlc3RfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2Jfc2V0dXBfcmVxdWVzdF9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9zZXR1cF9yZXF1ZXN0X2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2Jfc2V0dXBfcmVxdWVzdF9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9zZXR1cF9yZXF1ZXN0X2VuZCAoeGNiX3NldHVwX3JlcXVlc3RfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworaW50Cit4Y2Jfc2V0dXBfZmFpbGVkX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogY2hhciAqIHhjYl9zZXR1cF9mYWlsZWRfcmVhc29uCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZXR1cF9mYWlsZWRfdCAqUgorICoqIEByZXR1cm5zIGNoYXIgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitjaGFyICoKK3hjYl9zZXR1cF9mYWlsZWRfcmVhc29uIChjb25zdCB4Y2Jfc2V0dXBfZmFpbGVkX3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9zZXR1cF9mYWlsZWRfcmVhc29uX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfZmFpbGVkX3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2Jfc2V0dXBfZmFpbGVkX3JlYXNvbl9sZW5ndGggKGNvbnN0IHhjYl9zZXR1cF9mYWlsZWRfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9zZXR1cF9mYWlsZWRfcmVhc29uX2VuZAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfZmFpbGVkX3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9zZXR1cF9mYWlsZWRfcmVhc29uX2VuZCAoY29uc3QgeGNiX3NldHVwX2ZhaWxlZF90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2Jfc2V0dXBfZmFpbGVkX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX3NldHVwX2ZhaWxlZF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2Jfc2V0dXBfZmFpbGVkX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3NldHVwX2ZhaWxlZF9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2Jfc2V0dXBfZmFpbGVkX25leHQgKHhjYl9zZXR1cF9mYWlsZWRfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2Jfc2V0dXBfZmFpbGVkX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3NldHVwX2ZhaWxlZF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3NldHVwX2ZhaWxlZF9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9zZXR1cF9mYWlsZWRfZW5kICh4Y2Jfc2V0dXBfZmFpbGVkX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGNoYXIgKiB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX3JlYXNvbgorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX3QgKlIKKyAqKiBAcmV0dXJucyBjaGFyICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorY2hhciAqCit4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX3JlYXNvbiAoY29uc3QgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX3JlYXNvbl9sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9yZWFzb25fbGVuZ3RoIChjb25zdCB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX3JlYXNvbl9lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX3JlYXNvbl9lbmQgKGNvbnN0IHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9uZXh0ICh4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX2VuZCAoeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCitpbnQKK3hjYl9zZXR1cF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGNoYXIgKiB4Y2Jfc2V0dXBfdmVuZG9yCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZXR1cF90ICpSCisgKiogQHJldHVybnMgY2hhciAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2NoYXIgKgoreGNiX3NldHVwX3ZlbmRvciAoY29uc3QgeGNiX3NldHVwX3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9zZXR1cF92ZW5kb3JfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZXR1cF90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX3NldHVwX3ZlbmRvcl9sZW5ndGggKGNvbnN0IHhjYl9zZXR1cF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3NldHVwX3ZlbmRvcl9lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NldHVwX3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9zZXR1cF92ZW5kb3JfZW5kIChjb25zdCB4Y2Jfc2V0dXBfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZm9ybWF0X3QgKiB4Y2Jfc2V0dXBfcGl4bWFwX2Zvcm1hdHMKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NldHVwX3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZm9ybWF0X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZm9ybWF0X3QgKgoreGNiX3NldHVwX3BpeG1hcF9mb3JtYXRzIChjb25zdCB4Y2Jfc2V0dXBfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX3NldHVwX3BpeG1hcF9mb3JtYXRzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9zZXR1cF9waXhtYXBfZm9ybWF0c19sZW5ndGggKGNvbnN0IHhjYl9zZXR1cF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9mb3JtYXRfaXRlcmF0b3JfdCB4Y2Jfc2V0dXBfcGl4bWFwX2Zvcm1hdHNfaXRlcmF0b3IKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NldHVwX3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZm9ybWF0X2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2Zvcm1hdF9pdGVyYXRvcl90Cit4Y2Jfc2V0dXBfcGl4bWFwX2Zvcm1hdHNfaXRlcmF0b3IgKGNvbnN0IHhjYl9zZXR1cF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2Jfc2V0dXBfcm9vdHNfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZXR1cF90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX3NldHVwX3Jvb3RzX2xlbmd0aCAoY29uc3QgeGNiX3NldHVwX3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3NjcmVlbl9pdGVyYXRvcl90IHhjYl9zZXR1cF9yb290c19pdGVyYXRvcgorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfdCAqUgorICoqIEByZXR1cm5zIHhjYl9zY3JlZW5faXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfc2NyZWVuX2l0ZXJhdG9yX3QKK3hjYl9zZXR1cF9yb290c19pdGVyYXRvciAoY29uc3QgeGNiX3NldHVwX3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9zZXR1cF9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9zZXR1cF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2Jfc2V0dXBfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2Jfc2V0dXBfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX3NldHVwX25leHQgKHhjYl9zZXR1cF9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9zZXR1cF9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9zZXR1cF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3NldHVwX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX3NldHVwX2VuZCAoeGNiX3NldHVwX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9jbGllbnRfbWVzc2FnZV9kYXRhX25leHQgKHhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV9lbmQgKHhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2NyZWF0ZV93aW5kb3dfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jcmVhdGVfd2luZG93X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBkZXB0aAorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aWQKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgcGFyZW50CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHgKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICB3aWR0aAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBoZWlnaHQKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYm9yZGVyX3dpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIF9jbGFzcworICoqIEBwYXJhbSB4Y2JfdmlzdWFsaWRfdCAgICB2aXN1YWwKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzaworICoqIEBwYXJhbSBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jcmVhdGVfd2luZG93X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBkZXB0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHBhcmVudCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBib3JkZXJfd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBfY2xhc3MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdmlzdWFsaWRfdCAgICB2aXN1YWwgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY3JlYXRlX3dpbmRvdworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGRlcHRoCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpZAorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBwYXJlbnQKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB5CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHdpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGhlaWdodAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBib3JkZXJfd2lkdGgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgX2NsYXNzCisgKiogQHBhcmFtIHhjYl92aXN1YWxpZF90ICAgIHZpc3VhbAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrCisgKiogQHBhcmFtIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NyZWF0ZV93aW5kb3cgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZGVwdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2lkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHBhcmVudCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB4ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgaGVpZ2h0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJvcmRlcl93aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBfY2xhc3MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgeGNiX3Zpc3VhbGlkX3QgICAgdmlzdWFsICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdCAgLyoqPCAqLyk7CisKK2ludAoreGNiX2NoYW5nZV93aW5kb3dfYXR0cmlidXRlc19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NoYW5nZV93aW5kb3dfYXR0cmlidXRlc19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sKKyAqKiBAcGFyYW0gY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2hhbmdlX3dpbmRvd19hdHRyaWJ1dGVzX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY2hhbmdlX3dpbmRvd19hdHRyaWJ1dGVzCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sKKyAqKiBAcGFyYW0gY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2hhbmdlX3dpbmRvd19hdHRyaWJ1dGVzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF93aW5kb3dfYXR0cmlidXRlc19jb29raWVfdCB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX2dldF93aW5kb3dfYXR0cmlidXRlc19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX2Nvb2tpZV90Cit4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfY29va2llX3QgeGNiX2dldF93aW5kb3dfYXR0cmlidXRlc191bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfY29va2llX3QKK3hjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfcmVwbHlfdCAqIHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2dldF93aW5kb3dfYXR0cmlidXRlc19jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfcmVwbHlfdCAqCit4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9kZXN0cm95X3dpbmRvd19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9kZXN0cm95X3dpbmRvd19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZGVzdHJveV93aW5kb3cKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2Rlc3Ryb3lfd2luZG93ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZGVzdHJveV9zdWJ3aW5kb3dzX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2Rlc3Ryb3lfc3Vid2luZG93c19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2Rlc3Ryb3lfc3Vid2luZG93cworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZGVzdHJveV9zdWJ3aW5kb3dzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NoYW5nZV9zYXZlX3NldF9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgbW9kZQorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NoYW5nZV9zYXZlX3NldF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NoYW5nZV9zYXZlX3NldAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG1vZGUKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jaGFuZ2Vfc2F2ZV9zZXQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3JlcGFyZW50X3dpbmRvd19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHBhcmVudAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB4CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHkKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3JlcGFyZW50X3dpbmRvd19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHBhcmVudCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcmVwYXJlbnRfd2luZG93CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHBhcmVudAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB4CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHkKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3JlcGFyZW50X3dpbmRvdyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHBhcmVudCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB5ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX21hcF93aW5kb3dfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfbWFwX3dpbmRvd19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9tYXBfd2luZG93CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9tYXBfd2luZG93ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9tYXBfc3Vid2luZG93c19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9tYXBfc3Vid2luZG93c19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfbWFwX3N1YndpbmRvd3MKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX21hcF9zdWJ3aW5kb3dzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfdW5tYXBfd2luZG93X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3VubWFwX3dpbmRvd19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3VubWFwX3dpbmRvdworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfdW5tYXBfd2luZG93ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3VubWFwX3N1YndpbmRvd3NfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfdW5tYXBfc3Vid2luZG93c19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl91bm1hcF9zdWJ3aW5kb3dzCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl91bm1hcF9zdWJ3aW5kb3dzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKK2ludAoreGNiX2NvbmZpZ3VyZV93aW5kb3dfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jb25maWd1cmVfd2luZG93X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgdmFsdWVfbWFzaworICoqIEBwYXJhbSBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jb25maWd1cmVfd2luZG93X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB2YWx1ZV9tYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY29uZmlndXJlX3dpbmRvdworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICB2YWx1ZV9tYXNrCisgKiogQHBhcmFtIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NvbmZpZ3VyZV93aW5kb3cgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHZhbHVlX21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaXJjdWxhdGVfd2luZG93X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBkaXJlY3Rpb24KKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jaXJjdWxhdGVfd2luZG93X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBkaXJlY3Rpb24gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NpcmN1bGF0ZV93aW5kb3cKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBkaXJlY3Rpb24KKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jaXJjdWxhdGVfd2luZG93ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGRpcmVjdGlvbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9nZW9tZXRyeV9jb29raWVfdCB4Y2JfZ2V0X2dlb21ldHJ5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2dlb21ldHJ5X2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfZ2VvbWV0cnlfY29va2llX3QKK3hjYl9nZXRfZ2VvbWV0cnkgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2dlb21ldHJ5X2Nvb2tpZV90IHhjYl9nZXRfZ2VvbWV0cnlfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2dlb21ldHJ5X2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfZ2VvbWV0cnlfY29va2llX3QKK3hjYl9nZXRfZ2VvbWV0cnlfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9nZXRfZ2VvbWV0cnlfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9nZW9tZXRyeV9yZXBseV90ICogeGNiX2dldF9nZW9tZXRyeV9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZ2V0X2dlb21ldHJ5X2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2dldF9nZW9tZXRyeV9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9nZW9tZXRyeV9yZXBseV90ICoKK3hjYl9nZXRfZ2VvbWV0cnlfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dldF9nZW9tZXRyeV9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2JfcXVlcnlfdHJlZV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV90cmVlX2Nvb2tpZV90IHhjYl9xdWVyeV90cmVlCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X3RyZWVfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X3RyZWVfY29va2llX3QKK3hjYl9xdWVyeV90cmVlICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfdHJlZV9jb29raWVfdCB4Y2JfcXVlcnlfdHJlZV91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfdHJlZV9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfdHJlZV9jb29raWVfdAoreGNiX3F1ZXJ5X3RyZWVfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3dpbmRvd190ICogeGNiX3F1ZXJ5X3RyZWVfY2hpbGRyZW4KKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3F1ZXJ5X3RyZWVfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl93aW5kb3dfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl93aW5kb3dfdCAqCit4Y2JfcXVlcnlfdHJlZV9jaGlsZHJlbiAoY29uc3QgeGNiX3F1ZXJ5X3RyZWVfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX3F1ZXJ5X3RyZWVfY2hpbGRyZW5fbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9xdWVyeV90cmVlX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfcXVlcnlfdHJlZV9jaGlsZHJlbl9sZW5ndGggKGNvbnN0IHhjYl9xdWVyeV90cmVlX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfcXVlcnlfdHJlZV9jaGlsZHJlbl9lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3F1ZXJ5X3RyZWVfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX3F1ZXJ5X3RyZWVfY2hpbGRyZW5fZW5kIChjb25zdCB4Y2JfcXVlcnlfdHJlZV9yZXBseV90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9xdWVyeV90cmVlX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV90cmVlX3JlcGx5X3QgKiB4Y2JfcXVlcnlfdHJlZV9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX3F1ZXJ5X3RyZWVfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgKiplCisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X3RyZWVfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9xdWVyeV90cmVlX3JlcGx5X3QgKgoreGNiX3F1ZXJ5X3RyZWVfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB4Y2JfcXVlcnlfdHJlZV9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9pbnRlcm5fYXRvbV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9pbnRlcm5fYXRvbV9jb29raWVfdCB4Y2JfaW50ZXJuX2F0b20KKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBvbmx5X2lmX2V4aXN0cworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbgorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpuYW1lCisgKiogQHJldHVybnMgeGNiX2ludGVybl9hdG9tX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9pbnRlcm5fYXRvbV9jb29raWVfdAoreGNiX2ludGVybl9hdG9tICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBvbmx5X2lmX2V4aXN0cyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm5hbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2ludGVybl9hdG9tX2Nvb2tpZV90IHhjYl9pbnRlcm5fYXRvbV91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBvbmx5X2lmX2V4aXN0cworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbgorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpuYW1lCisgKiogQHJldHVybnMgeGNiX2ludGVybl9hdG9tX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9pbnRlcm5fYXRvbV9jb29raWVfdAoreGNiX2ludGVybl9hdG9tX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG9ubHlfaWZfZXhpc3RzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9pbnRlcm5fYXRvbV91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfaW50ZXJuX2F0b21fcmVwbHlfdCAqIHhjYl9pbnRlcm5fYXRvbV9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9pbnRlcm5fYXRvbV9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2ludGVybl9hdG9tX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfaW50ZXJuX2F0b21fcmVwbHlfdCAqCit4Y2JfaW50ZXJuX2F0b21fcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9pbnRlcm5fYXRvbV9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2dldF9hdG9tX25hbWVfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2F0b21fbmFtZV9jb29raWVfdCB4Y2JfZ2V0X2F0b21fbmFtZQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIGF0b20KKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2F0b21fbmFtZV9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X2F0b21fbmFtZV9jb29raWVfdAoreGNiX2dldF9hdG9tX25hbWUgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgYXRvbSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2F0b21fbmFtZV9jb29raWVfdCB4Y2JfZ2V0X2F0b21fbmFtZV91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfYXRvbV90ICAgICAgICBhdG9tCisgKiogQHJldHVybnMgeGNiX2dldF9hdG9tX25hbWVfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9hdG9tX25hbWVfY29va2llX3QKK3hjYl9nZXRfYXRvbV9uYW1lX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgYXRvbSAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBjaGFyICogeGNiX2dldF9hdG9tX25hbWVfbmFtZQorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X2F0b21fbmFtZV9yZXBseV90ICpSCisgKiogQHJldHVybnMgY2hhciAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2NoYXIgKgoreGNiX2dldF9hdG9tX25hbWVfbmFtZSAoY29uc3QgeGNiX2dldF9hdG9tX25hbWVfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2dldF9hdG9tX25hbWVfbmFtZV9sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2dldF9hdG9tX25hbWVfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9nZXRfYXRvbV9uYW1lX25hbWVfbGVuZ3RoIChjb25zdCB4Y2JfZ2V0X2F0b21fbmFtZV9yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2dldF9hdG9tX25hbWVfbmFtZV9lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2dldF9hdG9tX25hbWVfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2dldF9hdG9tX25hbWVfbmFtZV9lbmQgKGNvbnN0IHhjYl9nZXRfYXRvbV9uYW1lX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dldF9hdG9tX25hbWVfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9hdG9tX25hbWVfcmVwbHlfdCAqIHhjYl9nZXRfYXRvbV9uYW1lX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZ2V0X2F0b21fbmFtZV9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2F0b21fbmFtZV9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9hdG9tX25hbWVfcmVwbHlfdCAqCit4Y2JfZ2V0X2F0b21fbmFtZV9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfYXRvbV9uYW1lX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2NoYW5nZV9wcm9wZXJ0eV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NoYW5nZV9wcm9wZXJ0eV9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgbW9kZQorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgdHlwZQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBmb3JtYXQKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgZGF0YV9sZW4KKyAqKiBAcGFyYW0gY29uc3Qgdm9pZCAgICAgICAqZGF0YQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2hhbmdlX3Byb3BlcnR5X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHR5cGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGZvcm1hdCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgZGF0YV9sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgKmRhdGEgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NoYW5nZV9wcm9wZXJ0eQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG1vZGUKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5CisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHR5cGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZm9ybWF0CisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGRhdGFfbGVuCisgKiogQHBhcmFtIGNvbnN0IHZvaWQgICAgICAgKmRhdGEKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NoYW5nZV9wcm9wZXJ0eSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBwcm9wZXJ0eSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHR5cGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBmb3JtYXQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBkYXRhX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgKmRhdGEgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZGVsZXRlX3Byb3BlcnR5X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2RlbGV0ZV9wcm9wZXJ0eV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9kZWxldGVfcHJvcGVydHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2RlbGV0ZV9wcm9wZXJ0eSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5ICAvKio8ICovKTsKKworaW50Cit4Y2JfZ2V0X3Byb3BlcnR5X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9wcm9wZXJ0eV9jb29raWVfdCB4Y2JfZ2V0X3Byb3BlcnR5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgX2RlbGV0ZQorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgdHlwZQorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBsb25nX29mZnNldAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBsb25nX2xlbmd0aAorICoqIEByZXR1cm5zIHhjYl9nZXRfcHJvcGVydHlfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9wcm9wZXJ0eV9jb29raWVfdAoreGNiX2dldF9wcm9wZXJ0eSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIF9kZWxldGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBwcm9wZXJ0eSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHR5cGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBsb25nX29mZnNldCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGxvbmdfbGVuZ3RoICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfcHJvcGVydHlfY29va2llX3QgeGNiX2dldF9wcm9wZXJ0eV91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBfZGVsZXRlCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSB4Y2JfYXRvbV90ICAgICAgICBwcm9wZXJ0eQorICoqIEBwYXJhbSB4Y2JfYXRvbV90ICAgICAgICB0eXBlCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGxvbmdfb2Zmc2V0CisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGxvbmdfbGVuZ3RoCisgKiogQHJldHVybnMgeGNiX2dldF9wcm9wZXJ0eV9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3Byb3BlcnR5X2Nvb2tpZV90Cit4Y2JfZ2V0X3Byb3BlcnR5X3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBfZGVsZXRlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBwcm9wZXJ0eSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICB0eXBlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGxvbmdfb2Zmc2V0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGxvbmdfbGVuZ3RoICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgKiB4Y2JfZ2V0X3Byb3BlcnR5X3ZhbHVlCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfcHJvcGVydHlfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHZvaWQgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkICoKK3hjYl9nZXRfcHJvcGVydHlfdmFsdWUgKGNvbnN0IHhjYl9nZXRfcHJvcGVydHlfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2dldF9wcm9wZXJ0eV92YWx1ZV9sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2dldF9wcm9wZXJ0eV9yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX2dldF9wcm9wZXJ0eV92YWx1ZV9sZW5ndGggKGNvbnN0IHhjYl9nZXRfcHJvcGVydHlfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9nZXRfcHJvcGVydHlfdmFsdWVfZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfcHJvcGVydHlfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2dldF9wcm9wZXJ0eV92YWx1ZV9lbmQgKGNvbnN0IHhjYl9nZXRfcHJvcGVydHlfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfZ2V0X3Byb3BlcnR5X3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfcHJvcGVydHlfcmVwbHlfdCAqIHhjYl9nZXRfcHJvcGVydHlfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2dldF9wcm9wZXJ0eV9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9nZXRfcHJvcGVydHlfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfcHJvcGVydHlfcmVwbHlfdCAqCit4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfcHJvcGVydHlfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2xpc3RfcHJvcGVydGllc19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9saXN0X3Byb3BlcnRpZXNfY29va2llX3QgeGNiX2xpc3RfcHJvcGVydGllcworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl9saXN0X3Byb3BlcnRpZXNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xpc3RfcHJvcGVydGllc19jb29raWVfdAoreGNiX2xpc3RfcHJvcGVydGllcyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbGlzdF9wcm9wZXJ0aWVzX2Nvb2tpZV90IHhjYl9saXN0X3Byb3BlcnRpZXNfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX2xpc3RfcHJvcGVydGllc19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9wcm9wZXJ0aWVzX2Nvb2tpZV90Cit4Y2JfbGlzdF9wcm9wZXJ0aWVzX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2F0b21fdCAqIHhjYl9saXN0X3Byb3BlcnRpZXNfYXRvbXMKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2xpc3RfcHJvcGVydGllc19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2F0b21fdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9hdG9tX3QgKgoreGNiX2xpc3RfcHJvcGVydGllc19hdG9tcyAoY29uc3QgeGNiX2xpc3RfcHJvcGVydGllc19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfbGlzdF9wcm9wZXJ0aWVzX2F0b21zX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfbGlzdF9wcm9wZXJ0aWVzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfbGlzdF9wcm9wZXJ0aWVzX2F0b21zX2xlbmd0aCAoY29uc3QgeGNiX2xpc3RfcHJvcGVydGllc19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2xpc3RfcHJvcGVydGllc19hdG9tc19lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2xpc3RfcHJvcGVydGllc19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfbGlzdF9wcm9wZXJ0aWVzX2F0b21zX2VuZCAoY29uc3QgeGNiX2xpc3RfcHJvcGVydGllc19yZXBseV90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9saXN0X3Byb3BlcnRpZXNfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2xpc3RfcHJvcGVydGllc19yZXBseV90ICogeGNiX2xpc3RfcHJvcGVydGllc19yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfbGlzdF9wcm9wZXJ0aWVzX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2xpc3RfcHJvcGVydGllc19yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xpc3RfcHJvcGVydGllc19yZXBseV90ICoKK3hjYl9saXN0X3Byb3BlcnRpZXNfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2xpc3RfcHJvcGVydGllc19jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgKiplICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3NldF9zZWxlY3Rpb25fb3duZXJfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIG93bmVyCisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHNlbGVjdGlvbgorICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX3QgICB0aW1lCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zZXRfc2VsZWN0aW9uX293bmVyX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBvd25lciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHNlbGVjdGlvbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3NldF9zZWxlY3Rpb25fb3duZXIKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBvd25lcgorICoqIEBwYXJhbSB4Y2JfYXRvbV90ICAgICAgICBzZWxlY3Rpb24KKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgdGltZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X3NlbGVjdGlvbl9vd25lciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBvd25lciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBzZWxlY3Rpb24gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9jb29raWVfdCB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHNlbGVjdGlvbgorICoqIEByZXR1cm5zIHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfc2VsZWN0aW9uX293bmVyX2Nvb2tpZV90Cit4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBzZWxlY3Rpb24gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9zZWxlY3Rpb25fb3duZXJfY29va2llX3QgeGNiX2dldF9zZWxlY3Rpb25fb3duZXJfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgc2VsZWN0aW9uCisgKiogQHJldHVybnMgeGNiX2dldF9zZWxlY3Rpb25fb3duZXJfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9zZWxlY3Rpb25fb3duZXJfY29va2llX3QKK3hjYl9nZXRfc2VsZWN0aW9uX293bmVyX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgc2VsZWN0aW9uICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX3JlcGx5X3QgKiB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2dldF9zZWxlY3Rpb25fb3duZXJfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2dldF9zZWxlY3Rpb25fb3duZXJfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfc2VsZWN0aW9uX293bmVyX3JlcGx5X3QgKgoreGNiX2dldF9zZWxlY3Rpb25fb3duZXJfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY29udmVydF9zZWxlY3Rpb25fY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHJlcXVlc3RvcgorICoqIEBwYXJhbSB4Y2JfYXRvbV90ICAgICAgICBzZWxlY3Rpb24KKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgdGFyZ2V0CisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5CisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NvbnZlcnRfc2VsZWN0aW9uX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgcmVxdWVzdG9yICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHNlbGVjdGlvbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICB0YXJnZXQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY29udmVydF9zZWxlY3Rpb24KKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICByZXF1ZXN0b3IKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgc2VsZWN0aW9uCisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHRhcmdldAorICoqIEBwYXJhbSB4Y2JfYXRvbV90ICAgICAgICBwcm9wZXJ0eQorICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX3QgICB0aW1lCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jb252ZXJ0X3NlbGVjdGlvbiAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgcmVxdWVzdG9yICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBzZWxlY3Rpb24gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHRhcmdldCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc2VuZF9ldmVudF9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgcHJvcGFnYXRlCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGRlc3RpbmF0aW9uCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGV2ZW50X21hc2sKKyAqKiBAcGFyYW0gY29uc3QgY2hhciAgICAgICAqZXZlbnQKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3NlbmRfZXZlbnRfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHByb3BhZ2F0ZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGRlc3RpbmF0aW9uICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgZXZlbnRfbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmV2ZW50ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zZW5kX2V2ZW50CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgcHJvcGFnYXRlCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGRlc3RpbmF0aW9uCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGV2ZW50X21hc2sKKyAqKiBAcGFyYW0gY29uc3QgY2hhciAgICAgICAqZXZlbnQKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3NlbmRfZXZlbnQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgcHJvcGFnYXRlICAvKio8ICovLAorICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGRlc3RpbmF0aW9uICAvKio8ICovLAorICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGV2ZW50X21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZXZlbnQgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dyYWJfcG9pbnRlcl9jb29raWVfdCB4Y2JfZ3JhYl9wb2ludGVyCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgb3duZXJfZXZlbnRzCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGV2ZW50X21hc2sKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgcG9pbnRlcl9tb2RlCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGtleWJvYXJkX21vZGUKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgY29uZmluZV90bworICoqIEBwYXJhbSB4Y2JfY3Vyc29yX3QgICAgICBjdXJzb3IKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgdGltZQorICoqIEByZXR1cm5zIHhjYl9ncmFiX3BvaW50ZXJfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dyYWJfcG9pbnRlcl9jb29raWVfdAoreGNiX2dyYWJfcG9pbnRlciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZXZlbnRfbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGtleWJvYXJkX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBjb25maW5lX3RvICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ3JhYl9wb2ludGVyX2Nvb2tpZV90IHhjYl9ncmFiX3BvaW50ZXJfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgb3duZXJfZXZlbnRzCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGV2ZW50X21hc2sKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgcG9pbnRlcl9tb2RlCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGtleWJvYXJkX21vZGUKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgY29uZmluZV90bworICoqIEBwYXJhbSB4Y2JfY3Vyc29yX3QgICAgICBjdXJzb3IKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgdGltZQorICoqIEByZXR1cm5zIHhjYl9ncmFiX3BvaW50ZXJfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dyYWJfcG9pbnRlcl9jb29raWVfdAoreGNiX2dyYWJfcG9pbnRlcl91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgb3duZXJfZXZlbnRzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGV2ZW50X21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgcG9pbnRlcl9tb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGtleWJvYXJkX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgY29uZmluZV90byAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY3Vyc29yX3QgICAgICBjdXJzb3IgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfZ3JhYl9wb2ludGVyX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9ncmFiX3BvaW50ZXJfcmVwbHlfdCAqIHhjYl9ncmFiX3BvaW50ZXJfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2dyYWJfcG9pbnRlcl9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9ncmFiX3BvaW50ZXJfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9ncmFiX3BvaW50ZXJfcmVwbHlfdCAqCit4Y2JfZ3JhYl9wb2ludGVyX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9ncmFiX3BvaW50ZXJfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICoqZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl91bmdyYWJfcG9pbnRlcl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgdGltZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfdW5ncmFiX3BvaW50ZXJfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl91bmdyYWJfcG9pbnRlcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3VuZ3JhYl9wb2ludGVyICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2dyYWJfYnV0dG9uX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZXZlbnRfbWFzaworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZQorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBjb25maW5lX3RvCisgKiogQHBhcmFtIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvcgorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBidXR0b24KKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9ncmFiX2J1dHRvbl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBldmVudF9tYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBrZXlib2FyZF9tb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGNvbmZpbmVfdG8gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGJ1dHRvbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBtb2RpZmllcnMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2dyYWJfYnV0dG9uCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgb3duZXJfZXZlbnRzCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGV2ZW50X21hc2sKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgcG9pbnRlcl9tb2RlCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGtleWJvYXJkX21vZGUKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgY29uZmluZV90bworICoqIEBwYXJhbSB4Y2JfY3Vyc29yX3QgICAgICBjdXJzb3IKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgYnV0dG9uCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG1vZGlmaWVycworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZ3JhYl9idXR0b24gKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGV2ZW50X21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgY29uZmluZV90byAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAvKio8ICovLAorICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBidXR0b24gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1vZGlmaWVycyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl91bmdyYWJfYnV0dG9uX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBidXR0b24KKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl91bmdyYWJfYnV0dG9uX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBidXR0b24gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1vZGlmaWVycyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfdW5ncmFiX2J1dHRvbgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGJ1dHRvbgorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBtb2RpZmllcnMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3VuZ3JhYl9idXR0b24gKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgYnV0dG9uICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1vZGlmaWVycyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2VfYWN0aXZlX3BvaW50ZXJfZ3JhYl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2N1cnNvcl90ICAgICAgY3Vyc29yCisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZXZlbnRfbWFzaworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2hhbmdlX2FjdGl2ZV9wb2ludGVyX2dyYWJfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY3Vyc29yX3QgICAgICBjdXJzb3IgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBldmVudF9tYXNrICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2VfYWN0aXZlX3BvaW50ZXJfZ3JhYgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvcgorICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX3QgICB0aW1lCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGV2ZW50X21hc2sKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NoYW5nZV9hY3RpdmVfcG9pbnRlcl9ncmFiICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY3Vyc29yX3QgICAgICBjdXJzb3IgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGV2ZW50X21hc2sgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dyYWJfa2V5Ym9hcmRfY29va2llX3QgeGNiX2dyYWJfa2V5Ym9hcmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgdGltZQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZQorICoqIEByZXR1cm5zIHhjYl9ncmFiX2tleWJvYXJkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9ncmFiX2tleWJvYXJkX2Nvb2tpZV90Cit4Y2JfZ3JhYl9rZXlib2FyZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ3JhYl9rZXlib2FyZF9jb29raWVfdCB4Y2JfZ3JhYl9rZXlib2FyZF91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgdGltZQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZQorICoqIEByZXR1cm5zIHhjYl9ncmFiX2tleWJvYXJkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9ncmFiX2tleWJvYXJkX2Nvb2tpZV90Cit4Y2JfZ3JhYl9rZXlib2FyZF91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfZ3JhYl9rZXlib2FyZF91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ3JhYl9rZXlib2FyZF9yZXBseV90ICogeGNiX2dyYWJfa2V5Ym9hcmRfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9ncmFiX2tleWJvYXJkX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9ncmFiX2tleWJvYXJkX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ3JhYl9rZXlib2FyZF9yZXBseV90ICoKK3hjYl9ncmFiX2tleWJvYXJkX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dyYWJfa2V5Ym9hcmRfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgKiplICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3VuZ3JhYl9rZXlib2FyZF9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgdGltZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfdW5ncmFiX2tleWJvYXJkX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3VuZ3JhYl9rZXlib2FyZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3VuZ3JhYl9rZXlib2FyZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZ3JhYl9rZXlfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBtb2RpZmllcnMKKyAqKiBAcGFyYW0geGNiX2tleWNvZGVfdCAgICAga2V5CisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBrZXlib2FyZF9tb2RlCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9ncmFiX2tleV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBtb2RpZmllcnMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX2tleWNvZGVfdCAgICAga2V5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBrZXlib2FyZF9tb2RlICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9ncmFiX2tleQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBtb2RpZmllcnMKKyAqKiBAcGFyYW0geGNiX2tleWNvZGVfdCAgICAga2V5CisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBrZXlib2FyZF9tb2RlCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9ncmFiX2tleSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgb3duZXJfZXZlbnRzICAvKio8ICovLAorICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzICAvKio8ICovLAorICAgICAgICAgICAgICB4Y2Jfa2V5Y29kZV90ICAgICBrZXkgIC8qKjwgKi8sCisgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl91bmdyYWJfa2V5X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfa2V5Y29kZV90ICAgICBrZXkKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl91bmdyYWJfa2V5X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfa2V5Y29kZV90ICAgICBrZXkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1vZGlmaWVycyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfdW5ncmFiX2tleQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9rZXljb2RlX3QgICAgIGtleQorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBtb2RpZmllcnMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3VuZ3JhYl9rZXkgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgeGNiX2tleWNvZGVfdCAgICAga2V5ICAvKio8ICovLAorICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1vZGlmaWVycyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9hbGxvd19ldmVudHNfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG1vZGUKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgdGltZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfYWxsb3dfZXZlbnRzX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2FsbG93X2V2ZW50cworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG1vZGUKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgdGltZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfYWxsb3dfZXZlbnRzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZ3JhYl9zZXJ2ZXJfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9ncmFiX3NlcnZlcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9ncmFiX3NlcnZlcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9ncmFiX3NlcnZlciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl91bmdyYWJfc2VydmVyX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfdW5ncmFiX3NlcnZlcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl91bmdyYWJfc2VydmVyCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3VuZ3JhYl9zZXJ2ZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X3BvaW50ZXJfY29va2llX3QgeGNiX3F1ZXJ5X3BvaW50ZXIKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVfdAoreGNiX3F1ZXJ5X3BvaW50ZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV9wb2ludGVyX2Nvb2tpZV90IHhjYl9xdWVyeV9wb2ludGVyX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl9xdWVyeV9wb2ludGVyX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9xdWVyeV9wb2ludGVyX2Nvb2tpZV90Cit4Y2JfcXVlcnlfcG9pbnRlcl91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfcXVlcnlfcG9pbnRlcl91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfcG9pbnRlcl9yZXBseV90ICogeGNiX3F1ZXJ5X3BvaW50ZXJfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9xdWVyeV9wb2ludGVyX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9xdWVyeV9wb2ludGVyX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfcG9pbnRlcl9yZXBseV90ICoKK3hjYl9xdWVyeV9wb2ludGVyX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3F1ZXJ5X3BvaW50ZXJfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgKiplICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfdGltZWNvb3JkX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX3RpbWVjb29yZF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfdGltZWNvb3JkX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3RpbWVjb29yZF9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfdGltZWNvb3JkX25leHQgKHhjYl90aW1lY29vcmRfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfdGltZWNvb3JkX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3RpbWVjb29yZF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3RpbWVjb29yZF9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl90aW1lY29vcmRfZW5kICh4Y2JfdGltZWNvb3JkX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2dldF9tb3Rpb25fZXZlbnRzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9tb3Rpb25fZXZlbnRzX2Nvb2tpZV90IHhjYl9nZXRfbW90aW9uX2V2ZW50cworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX3QgICBzdGFydAorICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX3QgICBzdG9wCisgKiogQHJldHVybnMgeGNiX2dldF9tb3Rpb25fZXZlbnRzX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfbW90aW9uX2V2ZW50c19jb29raWVfdAoreGNiX2dldF9tb3Rpb25fZXZlbnRzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHN0YXJ0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICBzdG9wICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfbW90aW9uX2V2ZW50c19jb29raWVfdCB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHN0YXJ0CisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHN0b3AKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9tb3Rpb25fZXZlbnRzX2Nvb2tpZV90Cit4Y2JfZ2V0X21vdGlvbl9ldmVudHNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgc3RhcnQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICBzdG9wICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl90aW1lY29vcmRfdCAqIHhjYl9nZXRfbW90aW9uX2V2ZW50c19ldmVudHMKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfdGltZWNvb3JkX3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfdGltZWNvb3JkX3QgKgoreGNiX2dldF9tb3Rpb25fZXZlbnRzX2V2ZW50cyAoY29uc3QgeGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9nZXRfbW90aW9uX2V2ZW50c19ldmVudHNfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfbW90aW9uX2V2ZW50c19yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX2dldF9tb3Rpb25fZXZlbnRzX2V2ZW50c19sZW5ndGggKGNvbnN0IHhjYl9nZXRfbW90aW9uX2V2ZW50c19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl90aW1lY29vcmRfaXRlcmF0b3JfdCB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfZXZlbnRzX2l0ZXJhdG9yCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfbW90aW9uX2V2ZW50c19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX3RpbWVjb29yZF9pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl90aW1lY29vcmRfaXRlcmF0b3JfdAoreGNiX2dldF9tb3Rpb25fZXZlbnRzX2V2ZW50c19pdGVyYXRvciAoY29uc3QgeGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dldF9tb3Rpb25fZXZlbnRzX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfbW90aW9uX2V2ZW50c19yZXBseV90ICogeGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2dldF9tb3Rpb25fZXZlbnRzX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfbW90aW9uX2V2ZW50c19yZXBseV90ICoKK3hjYl9nZXRfbW90aW9uX2V2ZW50c19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dldF9tb3Rpb25fZXZlbnRzX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfY29va2llX3QgeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlcworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHNyY193aW5kb3cKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgZHN0X3dpbmRvdworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBzcmNfeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBzcmNfeQorICoqIEByZXR1cm5zIHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19jb29raWVfdAoreGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlcyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHNyY193aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBkc3Rfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3ggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX2Nvb2tpZV90IHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgc3JjX3dpbmRvdworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBkc3Rfd2luZG93CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHNyY194CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHNyY195CisgKiogQHJldHVybnMgeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX2Nvb2tpZV90Cit4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBzcmNfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGRzdF93aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3ggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3kgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcGx5X3QgKiB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcGx5X3QgKgoreGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfd2FycF9wb2ludGVyX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBzcmNfd2luZG93CisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGRzdF93aW5kb3cKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgc3JjX3gKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgc3JjX3kKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgc3JjX3dpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHNyY19oZWlnaHQKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3gKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3kKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3dhcnBfcG9pbnRlcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBzcmNfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBkc3Rfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3kgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHNyY193aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgc3JjX2hlaWdodCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3ggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF95ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl93YXJwX3BvaW50ZXIKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBzcmNfd2luZG93CisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGRzdF93aW5kb3cKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgc3JjX3gKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgc3JjX3kKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgc3JjX3dpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHNyY19oZWlnaHQKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3gKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3kKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3dhcnBfcG9pbnRlciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHNyY193aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBkc3Rfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3ggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHNyY193aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHNyY19oZWlnaHQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF95ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3NldF9pbnB1dF9mb2N1c19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgcmV2ZXJ0X3RvCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGZvY3VzCisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3NldF9pbnB1dF9mb2N1c19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICByZXZlcnRfdG8gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGZvY3VzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zZXRfaW5wdXRfZm9jdXMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICByZXZlcnRfdG8KKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgZm9jdXMKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgdGltZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X2lucHV0X2ZvY3VzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgcmV2ZXJ0X3RvICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZm9jdXMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfaW5wdXRfZm9jdXNfY29va2llX3QgeGNiX2dldF9pbnB1dF9mb2N1cworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2dldF9pbnB1dF9mb2N1c19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X2lucHV0X2ZvY3VzX2Nvb2tpZV90Cit4Y2JfZ2V0X2lucHV0X2ZvY3VzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfaW5wdXRfZm9jdXNfY29va2llX3QgeGNiX2dldF9pbnB1dF9mb2N1c191bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl9nZXRfaW5wdXRfZm9jdXNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9pbnB1dF9mb2N1c19jb29raWVfdAoreGNiX2dldF9pbnB1dF9mb2N1c191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dldF9pbnB1dF9mb2N1c191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2lucHV0X2ZvY3VzX3JlcGx5X3QgKiB4Y2JfZ2V0X2lucHV0X2ZvY3VzX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9nZXRfaW5wdXRfZm9jdXNfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2lucHV0X2ZvY3VzX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X2lucHV0X2ZvY3VzX3JlcGx5X3QgKgoreGNiX2dldF9pbnB1dF9mb2N1c19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X2lucHV0X2ZvY3VzX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X2tleW1hcF9jb29raWVfdCB4Y2JfcXVlcnlfa2V5bWFwCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfa2V5bWFwX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9xdWVyeV9rZXltYXBfY29va2llX3QKK3hjYl9xdWVyeV9rZXltYXAgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X2tleW1hcF9jb29raWVfdCB4Y2JfcXVlcnlfa2V5bWFwX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X2tleW1hcF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfa2V5bWFwX2Nvb2tpZV90Cit4Y2JfcXVlcnlfa2V5bWFwX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfcXVlcnlfa2V5bWFwX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV9rZXltYXBfcmVwbHlfdCAqIHhjYl9xdWVyeV9rZXltYXBfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX3F1ZXJ5X2tleW1hcF9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9xdWVyeV9rZXltYXBfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9xdWVyeV9rZXltYXBfcmVwbHlfdCAqCit4Y2JfcXVlcnlfa2V5bWFwX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9xdWVyeV9rZXltYXBfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX29wZW5fZm9udF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX29wZW5fZm9udF9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2ZvbnRfdCAgICAgICAgZmlkCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuCisgKiogQHBhcmFtIGNvbnN0IGNoYXIgICAgICAgKm5hbWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX29wZW5fZm9udF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZm9udF90ICAgICAgICBmaWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9vcGVuX2ZvbnQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZm9udF90ICAgICAgICBmaWQKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4KKyAqKiBAcGFyYW0gY29uc3QgY2hhciAgICAgICAqbmFtZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfb3Blbl9mb250ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgeGNiX2ZvbnRfdCAgICAgICAgZmlkICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2Nsb3NlX2ZvbnRfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9mb250X3QgICAgICAgIGZvbnQKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2Nsb3NlX2ZvbnRfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9mb250X3QgICAgICAgIGZvbnQgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2Nsb3NlX2ZvbnQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZm9udF90ICAgICAgICBmb250CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jbG9zZV9mb250ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgIHhjYl9mb250X3QgICAgICAgIGZvbnQgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9mb250cHJvcF9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9mb250cHJvcF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfZm9udHByb3BfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfZm9udHByb3BfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX2ZvbnRwcm9wX25leHQgKHhjYl9mb250cHJvcF9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9mb250cHJvcF9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9mb250cHJvcF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2ZvbnRwcm9wX2VuZCAoeGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2NoYXJpbmZvX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2NoYXJpbmZvX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9jaGFyaW5mb19uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9jaGFyaW5mb19pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfY2hhcmluZm9fbmV4dCAoeGNiX2NoYXJpbmZvX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2NoYXJpbmZvX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2NoYXJpbmZvX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY2hhcmluZm9faXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfY2hhcmluZm9fZW5kICh4Y2JfY2hhcmluZm9faXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworaW50Cit4Y2JfcXVlcnlfZm9udF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV9mb250X2Nvb2tpZV90IHhjYl9xdWVyeV9mb250CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2ZvbnRhYmxlX3QgICAgZm9udAorICoqIEByZXR1cm5zIHhjYl9xdWVyeV9mb250X2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9xdWVyeV9mb250X2Nvb2tpZV90Cit4Y2JfcXVlcnlfZm9udCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB4Y2JfZm9udGFibGVfdCAgICBmb250ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV9mb250X2Nvb2tpZV90IHhjYl9xdWVyeV9mb250X3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9mb250YWJsZV90ICAgIGZvbnQKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfZm9udF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfZm9udF9jb29raWVfdAoreGNiX3F1ZXJ5X2ZvbnRfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZm9udGFibGVfdCAgICBmb250ICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9mb250cHJvcF90ICogeGNiX3F1ZXJ5X2ZvbnRfcHJvcGVydGllcworICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfcXVlcnlfZm9udF9yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2ZvbnRwcm9wX3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZm9udHByb3BfdCAqCit4Y2JfcXVlcnlfZm9udF9wcm9wZXJ0aWVzIChjb25zdCB4Y2JfcXVlcnlfZm9udF9yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfcXVlcnlfZm9udF9wcm9wZXJ0aWVzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfcXVlcnlfZm9udF9yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX3F1ZXJ5X2ZvbnRfcHJvcGVydGllc19sZW5ndGggKGNvbnN0IHhjYl9xdWVyeV9mb250X3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3QgeGNiX3F1ZXJ5X2ZvbnRfcHJvcGVydGllc19pdGVyYXRvcgorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfcXVlcnlfZm9udF9yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3QKK3hjYl9xdWVyeV9mb250X3Byb3BlcnRpZXNfaXRlcmF0b3IgKGNvbnN0IHhjYl9xdWVyeV9mb250X3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2NoYXJpbmZvX3QgKiB4Y2JfcXVlcnlfZm9udF9jaGFyX2luZm9zCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9xdWVyeV9mb250X3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfY2hhcmluZm9fdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9jaGFyaW5mb190ICoKK3hjYl9xdWVyeV9mb250X2NoYXJfaW5mb3MgKGNvbnN0IHhjYl9xdWVyeV9mb250X3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9xdWVyeV9mb250X2NoYXJfaW5mb3NfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9xdWVyeV9mb250X3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfcXVlcnlfZm9udF9jaGFyX2luZm9zX2xlbmd0aCAoY29uc3QgeGNiX3F1ZXJ5X2ZvbnRfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfY2hhcmluZm9faXRlcmF0b3JfdCB4Y2JfcXVlcnlfZm9udF9jaGFyX2luZm9zX2l0ZXJhdG9yCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9xdWVyeV9mb250X3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfY2hhcmluZm9faXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfY2hhcmluZm9faXRlcmF0b3JfdAoreGNiX3F1ZXJ5X2ZvbnRfY2hhcl9pbmZvc19pdGVyYXRvciAoY29uc3QgeGNiX3F1ZXJ5X2ZvbnRfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfcXVlcnlfZm9udF91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfZm9udF9yZXBseV90ICogeGNiX3F1ZXJ5X2ZvbnRfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9xdWVyeV9mb250X2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9xdWVyeV9mb250X3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfZm9udF9yZXBseV90ICoKK3hjYl9xdWVyeV9mb250X3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX3F1ZXJ5X2ZvbnRfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIHN0cmluZ19sZW4gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19jb29raWVfdCB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAqYworICoqIEBwYXJhbSB4Y2JfZm9udGFibGVfdCAgICAgIGZvbnQKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgICBzdHJpbmdfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9jaGFyMmJfdCAqc3RyaW5nCisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX2Nvb2tpZV90Cit4Y2JfcXVlcnlfdGV4dF9leHRlbnRzICh4Y2JfY29ubmVjdGlvbl90ICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZm9udGFibGVfdCAgICAgIGZvbnQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIHN0cmluZ19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfY2hhcjJiX3QgKnN0cmluZyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX2Nvb2tpZV90IHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAqYworICoqIEBwYXJhbSB4Y2JfZm9udGFibGVfdCAgICAgIGZvbnQKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgICBzdHJpbmdfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9jaGFyMmJfdCAqc3RyaW5nCisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX2Nvb2tpZV90Cit4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9mb250YWJsZV90ICAgICAgZm9udCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIHN0cmluZ19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2NoYXIyYl90ICpzdHJpbmcgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX3JlcGx5X3QgKiB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX3JlcGx5X3QgKgoreGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9zdHJfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBjaGFyICogeGNiX3N0cl9uYW1lCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zdHJfdCAqUgorICoqIEByZXR1cm5zIGNoYXIgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitjaGFyICoKK3hjYl9zdHJfbmFtZSAoY29uc3QgeGNiX3N0cl90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2Jfc3RyX25hbWVfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zdHJfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9zdHJfbmFtZV9sZW5ndGggKGNvbnN0IHhjYl9zdHJfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9zdHJfbmFtZV9lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3N0cl90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfc3RyX25hbWVfZW5kIChjb25zdCB4Y2Jfc3RyX3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9zdHJfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2Jfc3RyX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9zdHJfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2Jfc3RyX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9zdHJfbmV4dCAoeGNiX3N0cl9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9zdHJfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2Jfc3RyX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2Jfc3RyX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX3N0cl9lbmQgKHhjYl9zdHJfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworaW50Cit4Y2JfbGlzdF9mb250c19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9saXN0X2ZvbnRzX2Nvb2tpZV90IHhjYl9saXN0X2ZvbnRzCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbWF4X25hbWVzCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHBhdHRlcm5fbGVuCisgKiogQHBhcmFtIGNvbnN0IGNoYXIgICAgICAgKnBhdHRlcm4KKyAqKiBAcmV0dXJucyB4Y2JfbGlzdF9mb250c19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9mb250c19jb29raWVfdAoreGNiX2xpc3RfZm9udHMgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbWF4X25hbWVzICAvKio8ICovLAorICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHBhdHRlcm5fbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnBhdHRlcm4gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2xpc3RfZm9udHNfY29va2llX3QgeGNiX2xpc3RfZm9udHNfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbWF4X25hbWVzCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHBhdHRlcm5fbGVuCisgKiogQHBhcmFtIGNvbnN0IGNoYXIgICAgICAgKnBhdHRlcm4KKyAqKiBAcmV0dXJucyB4Y2JfbGlzdF9mb250c19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9mb250c19jb29raWVfdAoreGNiX2xpc3RfZm9udHNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBtYXhfbmFtZXMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHBhdHRlcm5fbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpwYXR0ZXJuICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfbGlzdF9mb250c19uYW1lc19sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2xpc3RfZm9udHNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9saXN0X2ZvbnRzX25hbWVzX2xlbmd0aCAoY29uc3QgeGNiX2xpc3RfZm9udHNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfc3RyX2l0ZXJhdG9yX3QgeGNiX2xpc3RfZm9udHNfbmFtZXNfaXRlcmF0b3IKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2xpc3RfZm9udHNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9zdHJfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfc3RyX2l0ZXJhdG9yX3QKK3hjYl9saXN0X2ZvbnRzX25hbWVzX2l0ZXJhdG9yIChjb25zdCB4Y2JfbGlzdF9mb250c19yZXBseV90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9saXN0X2ZvbnRzX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9saXN0X2ZvbnRzX3JlcGx5X3QgKiB4Y2JfbGlzdF9mb250c19yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2xpc3RfZm9udHNfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2xpc3RfZm9udHNfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9saXN0X2ZvbnRzX3JlcGx5X3QgKgoreGNiX2xpc3RfZm9udHNfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB4Y2JfbGlzdF9mb250c19jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19jb29raWVfdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm8KKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBtYXhfbmFtZXMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgcGF0dGVybl9sZW4KKyAqKiBAcGFyYW0gY29uc3QgY2hhciAgICAgICAqcGF0dGVybgorICoqIEByZXR1cm5zIHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9mb250c193aXRoX2luZm9fY29va2llX3QKK3hjYl9saXN0X2ZvbnRzX3dpdGhfaW5mbyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbWF4X25hbWVzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBwYXR0ZXJuX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqcGF0dGVybiAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fY29va2llX3QgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG1heF9uYW1lcworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBwYXR0ZXJuX2xlbgorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpwYXR0ZXJuCisgKiogQHJldHVybnMgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19jb29raWVfdAoreGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1heF9uYW1lcyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHBhdHRlcm5fbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqcGF0dGVybiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZm9udHByb3BfdCAqIHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19wcm9wZXJ0aWVzCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2ZvbnRwcm9wX3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZm9udHByb3BfdCAqCit4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcHJvcGVydGllcyAoY29uc3QgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19wcm9wZXJ0aWVzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19wcm9wZXJ0aWVzX2xlbmd0aCAoY29uc3QgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3QgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3Byb3BlcnRpZXNfaXRlcmF0b3IKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZm9udHByb3BfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZm9udHByb3BfaXRlcmF0b3JfdAoreGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3Byb3BlcnRpZXNfaXRlcmF0b3IgKGNvbnN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGNoYXIgKiB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fbmFtZQorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGNoYXIgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitjaGFyICoKK3hjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19uYW1lIChjb25zdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX25hbWVfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX25hbWVfbGVuZ3RoIChjb25zdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19uYW1lX2VuZAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX25hbWVfZW5kIChjb25zdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3QgKiB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3QgKgoreGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9zZXRfZm9udF9wYXRoX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc2V0X2ZvbnRfcGF0aF9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZm9udF9xdHkKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3N0cl90ICAqZm9udAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X2ZvbnRfcGF0aF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9udF9xdHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2Jfc3RyX3QgICpmb250ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zZXRfZm9udF9wYXRoCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZm9udF9xdHkKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3N0cl90ICAqZm9udAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X2ZvbnRfcGF0aCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb250X3F0eSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2Jfc3RyX3QgICpmb250ICAvKio8ICovKTsKKworaW50Cit4Y2JfZ2V0X2ZvbnRfcGF0aF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfZm9udF9wYXRoX2Nvb2tpZV90IHhjYl9nZXRfZm9udF9wYXRoCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2ZvbnRfcGF0aF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X2ZvbnRfcGF0aF9jb29raWVfdAoreGNiX2dldF9mb250X3BhdGggKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9mb250X3BhdGhfY29va2llX3QgeGNiX2dldF9mb250X3BhdGhfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2ZvbnRfcGF0aF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X2ZvbnRfcGF0aF9jb29raWVfdAoreGNiX2dldF9mb250X3BhdGhfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfZ2V0X2ZvbnRfcGF0aF9wYXRoX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX2dldF9mb250X3BhdGhfcGF0aF9sZW5ndGggKGNvbnN0IHhjYl9nZXRfZm9udF9wYXRoX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3N0cl9pdGVyYXRvcl90IHhjYl9nZXRfZm9udF9wYXRoX3BhdGhfaXRlcmF0b3IKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2dldF9mb250X3BhdGhfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9zdHJfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfc3RyX2l0ZXJhdG9yX3QKK3hjYl9nZXRfZm9udF9wYXRoX3BhdGhfaXRlcmF0b3IgKGNvbnN0IHhjYl9nZXRfZm9udF9wYXRoX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dldF9mb250X3BhdGhfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9mb250X3BhdGhfcmVwbHlfdCAqIHhjYl9nZXRfZm9udF9wYXRoX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZ2V0X2ZvbnRfcGF0aF9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9mb250X3BhdGhfcmVwbHlfdCAqCit4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfZm9udF9wYXRoX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICoqZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jcmVhdGVfcGl4bWFwX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBkZXB0aAorICoqIEBwYXJhbSB4Y2JfcGl4bWFwX3QgICAgICBwaWQKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgd2lkdGgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgaGVpZ2h0CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jcmVhdGVfcGl4bWFwX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBkZXB0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9waXhtYXBfdCAgICAgIHBpZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NyZWF0ZV9waXhtYXAKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBkZXB0aAorICoqIEBwYXJhbSB4Y2JfcGl4bWFwX3QgICAgICBwaWQKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgd2lkdGgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgaGVpZ2h0CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jcmVhdGVfcGl4bWFwICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGRlcHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl9waXhtYXBfdCAgICAgIHBpZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZnJlZV9waXhtYXBfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9waXhtYXBfdCAgICAgIHBpeG1hcAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZnJlZV9waXhtYXBfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfcGl4bWFwX3QgICAgICBwaXhtYXAgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2ZyZWVfcGl4bWFwCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3BpeG1hcF90ICAgICAgcGl4bWFwCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9mcmVlX3BpeG1hcCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgeGNiX3BpeG1hcF90ICAgICAgcGl4bWFwICAvKio8ICovKTsKKworaW50Cit4Y2JfY3JlYXRlX2djX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY3JlYXRlX2djX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBjaWQKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzaworICoqIEBwYXJhbSBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jcmVhdGVfZ2NfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgY2lkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY3JlYXRlX2djCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgY2lkCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sKKyAqKiBAcGFyYW0gY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY3JlYXRlX2djICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgY2lkICAvKio8ICovLAorICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdCAgLyoqPCAqLyk7CisKK2ludAoreGNiX2NoYW5nZV9nY19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NoYW5nZV9nY19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzaworICoqIEBwYXJhbSBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jaGFuZ2VfZ2NfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NoYW5nZV9nYworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sKKyAqKiBAcGFyYW0gY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2hhbmdlX2djICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jb3B5X2djX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBzcmNfZ2MKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZHN0X2djCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NvcHlfZ2NfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIHNyY19nYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGRzdF9nYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NvcHlfZ2MKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBzcmNfZ2MKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZHN0X2djCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NvcHlfZ2MgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgc3JjX2djICAvKio8ICovLAorICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGRzdF9nYyAgLyoqPCAqLywKKyAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrICAvKio8ICovKTsKKworaW50Cit4Y2Jfc2V0X2Rhc2hlc19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3NldF9kYXNoZXNfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGRhc2hfb2Zmc2V0CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGRhc2hlc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgdWludDhfdCAgICAqZGFzaGVzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zZXRfZGFzaGVzX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGRhc2hfb2Zmc2V0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZGFzaGVzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKmRhc2hlcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc2V0X2Rhc2hlcworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGRhc2hfb2Zmc2V0CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGRhc2hlc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgdWludDhfdCAgICAqZGFzaGVzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zZXRfZGFzaGVzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGRhc2hfb2Zmc2V0ICAvKio8ICovLAorICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGRhc2hlc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAgICAqZGFzaGVzICAvKio8ICovKTsKKworaW50Cit4Y2Jfc2V0X2NsaXBfcmVjdGFuZ2xlc19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgcmVjdGFuZ2xlc19sZW4gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc2V0X2NsaXBfcmVjdGFuZ2xlc19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICAgICAgIG9yZGVyaW5nCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgICAgICAgZ2MKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgICAgICBjbGlwX3hfb3JpZ2luCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgICAgICAgY2xpcF95X29yaWdpbgorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgICAgIHJlY3RhbmdsZXNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9yZWN0YW5nbGVfdCAqcmVjdGFuZ2xlcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X2NsaXBfcmVjdGFuZ2xlc19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgICAgIG9yZGVyaW5nICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgICAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgICAgICAgY2xpcF94X29yaWdpbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgICAgICAgY2xpcF95X29yaWdpbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgcmVjdGFuZ2xlc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfcmVjdGFuZ2xlX3QgKnJlY3RhbmdsZXMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3NldF9jbGlwX3JlY3RhbmdsZXMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgICAgICAgb3JkZXJpbmcKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgICAgICBnYworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICAgICAgIGNsaXBfeF9vcmlnaW4KKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgICAgICBjbGlwX3lfb3JpZ2luCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgICAgICAgcmVjdGFuZ2xlc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgeGNiX3JlY3RhbmdsZV90ICpyZWN0YW5nbGVzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zZXRfY2xpcF9yZWN0YW5nbGVzICh4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAgICBvcmRlcmluZyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICAgICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgICAgICAgY2xpcF94X29yaWdpbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgICAgIGNsaXBfeV9vcmlnaW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICByZWN0YW5nbGVzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfcmVjdGFuZ2xlX3QgKnJlY3RhbmdsZXMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZnJlZV9nY19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2ZyZWVfZ2NfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9mcmVlX2djCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2ZyZWVfZ2MgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY2xlYXJfYXJlYV9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZXhwb3N1cmVzCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB4CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHkKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgd2lkdGgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgaGVpZ2h0CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jbGVhcl9hcmVhX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBleHBvc3VyZXMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB4ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgaGVpZ2h0ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jbGVhcl9hcmVhCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZXhwb3N1cmVzCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB4CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHkKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgd2lkdGgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgaGVpZ2h0CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jbGVhcl9hcmVhICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGV4cG9zdXJlcyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB5ICAvKio8ICovLAorICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jb3B5X2FyZWFfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIHNyY19kcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBkc3RfZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgc3JjX3gKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgc3JjX3kKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3gKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3kKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgd2lkdGgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgaGVpZ2h0CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jb3B5X2FyZWFfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgc3JjX2RyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkc3RfZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3kgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF94ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY29weV9hcmVhCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgc3JjX2RyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRzdF9kcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBnYworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBzcmNfeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBzcmNfeQorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBkc3RfeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBkc3RfeQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICB3aWR0aAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBoZWlnaHQKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NvcHlfYXJlYSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIHNyY19kcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRzdF9kcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3ggIC8qKjwgKi8sCisgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF94ICAvKio8ICovLAorICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3kgIC8qKjwgKi8sCisgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jb3B5X3BsYW5lX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBzcmNfZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHN0X2RyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHNyY194CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHNyY195CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF94CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF95CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHdpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGhlaWdodAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBiaXRfcGxhbmUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NvcHlfcGxhbmVfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIHNyY19kcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRzdF9kcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3ggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF94ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3kgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGJpdF9wbGFuZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY29weV9wbGFuZQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIHNyY19kcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBkc3RfZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgc3JjX3gKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgc3JjX3kKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3gKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3kKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgd2lkdGgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgaGVpZ2h0CisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGJpdF9wbGFuZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY29weV9wbGFuZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBzcmNfZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHN0X2RyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY194ICAvKio8ICovLAorICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY195ICAvKio8ICovLAorICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF94ICAvKio8ICovLAorICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF95ICAvKio8ICovLAorICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBiaXRfcGxhbmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9wb2x5X3BvaW50X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBwb2ludHNfbGVuICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3BvbHlfcG9pbnRfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICAgY29vcmRpbmF0ZV9tb2RlCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICAgZ2MKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgIHBvaW50c19sZW4KKyAqKiBAcGFyYW0gY29uc3QgeGNiX3BvaW50X3QgKnBvaW50cworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcG9seV9wb2ludF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9wb2ludF90ICpwb2ludHMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3BvbHlfcG9pbnQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgIGNvb3JkaW5hdGVfbW9kZQorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgICBwb2ludHNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9wb2ludF90ICpwb2ludHMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfcG9pbnQgKHhjYl9jb25uZWN0aW9uX3QgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICBjb25zdCB4Y2JfcG9pbnRfdCAqcG9pbnRzICAvKio8ICovKTsKKworaW50Cit4Y2JfcG9seV9saW5lX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIHBvaW50c19sZW4gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcG9seV9saW5lX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgIGNvb3JkaW5hdGVfbW9kZQorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgICBwb2ludHNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9wb2ludF90ICpwb2ludHMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfbGluZV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgIGNvb3JkaW5hdGVfbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBwb2ludHNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfcG9pbnRfdCAqcG9pbnRzICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9wb2x5X2xpbmUKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgIGNvb3JkaW5hdGVfbW9kZQorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgICBwb2ludHNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9wb2ludF90ICpwb2ludHMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfbGluZSAoeGNiX2Nvbm5lY3Rpb25fdCAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgY29vcmRpbmF0ZV9tb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgIHBvaW50c19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICBjb25zdCB4Y2JfcG9pbnRfdCAqcG9pbnRzICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2Jfc2VnbWVudF9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9zZWdtZW50X3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9zZWdtZW50X25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3NlZ21lbnRfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX3NlZ21lbnRfbmV4dCAoeGNiX3NlZ21lbnRfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2Jfc2VnbWVudF9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9zZWdtZW50X2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2Jfc2VnbWVudF9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9zZWdtZW50X2VuZCAoeGNiX3NlZ21lbnRfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworaW50Cit4Y2JfcG9seV9zZWdtZW50X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIHNlZ21lbnRzX2xlbiAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9wb2x5X3NlZ21lbnRfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgICAgIHNlZ21lbnRzX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2VnbWVudF90ICpzZWdtZW50cworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcG9seV9zZWdtZW50X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgc2VnbWVudHNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2Jfc2VnbWVudF90ICpzZWdtZW50cyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcG9seV9zZWdtZW50CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgICAgZ2MKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgICAgc2VnbWVudHNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZWdtZW50X3QgKnNlZ21lbnRzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9wb2x5X3NlZ21lbnQgKHhjYl9jb25uZWN0aW9uX3QgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgc2VnbWVudHNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3NlZ21lbnRfdCAqc2VnbWVudHMgIC8qKjwgKi8pOworCitpbnQKK3hjYl9wb2x5X3JlY3RhbmdsZV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIHJlY3RhbmdsZXNfbGVuICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3BvbHlfcmVjdGFuZ2xlX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgICAgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgICAgICBnYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgICAgIHJlY3RhbmdsZXNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9yZWN0YW5nbGVfdCAqcmVjdGFuZ2xlcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcG9seV9yZWN0YW5nbGVfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICAgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgICAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIHJlY3RhbmdsZXNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9yZWN0YW5nbGVfdCAqcmVjdGFuZ2xlcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcG9seV9yZWN0YW5nbGUKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgICAgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgICAgICBnYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgICAgIHJlY3RhbmdsZXNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9yZWN0YW5nbGVfdCAqcmVjdGFuZ2xlcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcG9seV9yZWN0YW5nbGUgKHhjYl9jb25uZWN0aW9uX3QgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgICAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgICAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICByZWN0YW5nbGVzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3JlY3RhbmdsZV90ICpyZWN0YW5nbGVzICAvKio8ICovKTsKKworaW50Cit4Y2JfcG9seV9hcmNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBhcmNzX2xlbiAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9wb2x5X2FyY19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgYXJjc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgeGNiX2FyY190ICAqYXJjcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcG9seV9hcmNfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBhcmNzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfYXJjX3QgICphcmNzICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9wb2x5X2FyYworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGFyY3NfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9hcmNfdCAgKmFyY3MKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfYXJjICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGFyY3NfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICBjb25zdCB4Y2JfYXJjX3QgICphcmNzICAvKio8ICovKTsKKworaW50Cit4Y2JfZmlsbF9wb2x5X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIHBvaW50c19sZW4gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZmlsbF9wb2x5X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgICBnYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICAgc2hhcGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgIGNvb3JkaW5hdGVfbW9kZQorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfcG9pbnRfdCAqcG9pbnRzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9maWxsX3BvbHlfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgc2hhcGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBwb2ludHNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfcG9pbnRfdCAqcG9pbnRzICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9maWxsX3BvbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgICBnYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICAgc2hhcGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgIGNvb3JkaW5hdGVfbW9kZQorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfcG9pbnRfdCAqcG9pbnRzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9maWxsX3BvbHkgKHhjYl9jb25uZWN0aW9uX3QgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgIHNoYXBlICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgIGNvb3JkaW5hdGVfbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBwb2ludHNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgY29uc3QgeGNiX3BvaW50X3QgKnBvaW50cyAgLyoqPCAqLyk7CisKK2ludAoreGNiX3BvbHlfZmlsbF9yZWN0YW5nbGVfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIHJlY3RhbmdsZXNfbGVuICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3BvbHlfZmlsbF9yZWN0YW5nbGVfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgICAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICAgICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgICAgICAgcmVjdGFuZ2xlc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgeGNiX3JlY3RhbmdsZV90ICpyZWN0YW5nbGVzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9wb2x5X2ZpbGxfcmVjdGFuZ2xlX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICAgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICAgICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICByZWN0YW5nbGVzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9yZWN0YW5nbGVfdCAqcmVjdGFuZ2xlcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcG9seV9maWxsX3JlY3RhbmdsZQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgICAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICAgICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgICAgICAgcmVjdGFuZ2xlc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgeGNiX3JlY3RhbmdsZV90ICpyZWN0YW5nbGVzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9wb2x5X2ZpbGxfcmVjdGFuZ2xlICh4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgICAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICAgICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgcmVjdGFuZ2xlc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3JlY3RhbmdsZV90ICpyZWN0YW5nbGVzICAvKio8ICovKTsKKworaW50Cit4Y2JfcG9seV9maWxsX2FyY19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgYXJjc19sZW4gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcG9seV9maWxsX2FyY19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgYXJjc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgeGNiX2FyY190ICAqYXJjcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcG9seV9maWxsX2FyY19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGFyY3NfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2FyY190ICAqYXJjcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcG9seV9maWxsX2FyYworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGFyY3NfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9hcmNfdCAgKmFyY3MKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfZmlsbF9hcmMgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgYXJjc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2FyY190ICAqYXJjcyAgLyoqPCAqLyk7CisKK2ludAoreGNiX3B1dF9pbWFnZV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBkYXRhX2xlbiAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9wdXRfaW1hZ2VfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGZvcm1hdAorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBnYworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICB3aWR0aAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBoZWlnaHQKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3gKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3kKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgbGVmdF9wYWQKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZGVwdGgKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgZGF0YV9sZW4KKyAqKiBAcGFyYW0gY29uc3QgdWludDhfdCAgICAqZGF0YQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcHV0X2ltYWdlX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGZvcm1hdCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgaGVpZ2h0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3kgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGxlZnRfcGFkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBkZXB0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgZGF0YV9sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKmRhdGEgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3B1dF9pbWFnZQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGZvcm1hdAorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBnYworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICB3aWR0aAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBoZWlnaHQKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3gKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3kKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgbGVmdF9wYWQKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZGVwdGgKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgZGF0YV9sZW4KKyAqKiBAcGFyYW0gY29uc3QgdWludDhfdCAgICAqZGF0YQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcHV0X2ltYWdlICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZm9ybWF0ICAvKio8ICovLAorICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgaGVpZ2h0ICAvKio8ICovLAorICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3ggIC8qKjwgKi8sCisgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGxlZnRfcGFkICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZGVwdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBkYXRhX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKmRhdGEgIC8qKjwgKi8pOworCitpbnQKK3hjYl9nZXRfaW1hZ2Vfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2ltYWdlX2Nvb2tpZV90IHhjYl9nZXRfaW1hZ2UKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBmb3JtYXQKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB5CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHdpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGhlaWdodAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBwbGFuZV9tYXNrCisgKiogQHJldHVybnMgeGNiX2dldF9pbWFnZV9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X2ltYWdlX2Nvb2tpZV90Cit4Y2JfZ2V0X2ltYWdlICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZm9ybWF0ICAvKio8ICovLAorICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB4ICAvKio8ICovLAorICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgaGVpZ2h0ICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcGxhbmVfbWFzayAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2ltYWdlX2Nvb2tpZV90IHhjYl9nZXRfaW1hZ2VfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZm9ybWF0CisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHgKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICB3aWR0aAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBoZWlnaHQKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgcGxhbmVfbWFzaworICoqIEByZXR1cm5zIHhjYl9nZXRfaW1hZ2VfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9pbWFnZV9jb29raWVfdAoreGNiX2dldF9pbWFnZV91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZm9ybWF0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcGxhbmVfbWFzayAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB1aW50OF90ICogeGNiX2dldF9pbWFnZV9kYXRhCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfaW1hZ2VfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHVpbnQ4X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit1aW50OF90ICoKK3hjYl9nZXRfaW1hZ2VfZGF0YSAoY29uc3QgeGNiX2dldF9pbWFnZV9yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfZ2V0X2ltYWdlX2RhdGFfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfaW1hZ2VfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9nZXRfaW1hZ2VfZGF0YV9sZW5ndGggKGNvbnN0IHhjYl9nZXRfaW1hZ2VfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9nZXRfaW1hZ2VfZGF0YV9lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2dldF9pbWFnZV9yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfZ2V0X2ltYWdlX2RhdGFfZW5kIChjb25zdCB4Y2JfZ2V0X2ltYWdlX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dldF9pbWFnZV91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2ltYWdlX3JlcGx5X3QgKiB4Y2JfZ2V0X2ltYWdlX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9nZXRfaW1hZ2VfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2ltYWdlX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X2ltYWdlX3JlcGx5X3QgKgoreGNiX2dldF9pbWFnZV9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X2ltYWdlX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9wb2x5X3RleHRfOF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIGl0ZW1zX2xlbiAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9wb2x5X3RleHRfOF9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB5CisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGl0ZW1zX2xlbgorICoqIEBwYXJhbSBjb25zdCB1aW50OF90ICAgICppdGVtcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcG9seV90ZXh0XzhfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB4ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgaXRlbXNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKml0ZW1zICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9wb2x5X3RleHRfOAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHgKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeQorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBpdGVtc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgdWludDhfdCAgICAqaXRlbXMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfdGV4dF84ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGl0ZW1zX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAgICAqaXRlbXMgIC8qKjwgKi8pOworCitpbnQKK3hjYl9wb2x5X3RleHRfMTZfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgaXRlbXNfbGVuICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3BvbHlfdGV4dF8xNl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB5CisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGl0ZW1zX2xlbgorICoqIEBwYXJhbSBjb25zdCB1aW50OF90ICAgICppdGVtcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcG9seV90ZXh0XzE2X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgaXRlbXNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICppdGVtcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcG9seV90ZXh0XzE2CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB5CisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGl0ZW1zX2xlbgorICoqIEBwYXJhbSBjb25zdCB1aW50OF90ICAgICppdGVtcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcG9seV90ZXh0XzE2ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgaXRlbXNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAgICAqaXRlbXMgIC8qKjwgKi8pOworCitpbnQKK3hjYl9pbWFnZV90ZXh0Xzhfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9pbWFnZV90ZXh0XzhfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIHN0cmluZ19sZW4KKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB5CisgKiogQHBhcmFtIGNvbnN0IGNoYXIgICAgICAgKnN0cmluZworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfaW1hZ2VfdGV4dF84X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHN0cmluZ19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqc3RyaW5nICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9pbWFnZV90ZXh0XzgKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBzdHJpbmdfbGVuCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHgKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeQorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpzdHJpbmcKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2ltYWdlX3RleHRfOCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHN0cmluZ19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpzdHJpbmcgIC8qKjwgKi8pOworCitpbnQKK3hjYl9pbWFnZV90ZXh0XzE2X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfaW1hZ2VfdGV4dF8xNl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICAgIHN0cmluZ19sZW4KKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICAgIGdjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgICAgeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICAgIHkKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2NoYXIyYl90ICpzdHJpbmcKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2ltYWdlX3RleHRfMTZfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBzdHJpbmdfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgIHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfY2hhcjJiX3QgKnN0cmluZyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfaW1hZ2VfdGV4dF8xNgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgICBzdHJpbmdfbGVuCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgICBnYworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICAgIHgKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgICB5CisgKiogQHBhcmFtIGNvbnN0IHhjYl9jaGFyMmJfdCAqc3RyaW5nCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9pbWFnZV90ZXh0XzE2ICh4Y2JfY29ubmVjdGlvbl90ICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBzdHJpbmdfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgICB5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9jaGFyMmJfdCAqc3RyaW5nICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NyZWF0ZV9jb2xvcm1hcF9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgYWxsb2MKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgbWlkCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSB4Y2JfdmlzdWFsaWRfdCAgICB2aXN1YWwKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NyZWF0ZV9jb2xvcm1hcF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBhbGxvYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgbWlkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl92aXN1YWxpZF90ICAgIHZpc3VhbCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY3JlYXRlX2NvbG9ybWFwCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgYWxsb2MKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgbWlkCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSB4Y2JfdmlzdWFsaWRfdCAgICB2aXN1YWwKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NyZWF0ZV9jb2xvcm1hcCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGFsbG9jICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgbWlkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgeGNiX3Zpc3VhbGlkX3QgICAgdmlzdWFsICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2ZyZWVfY29sb3JtYXBfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2ZyZWVfY29sb3JtYXBfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2ZyZWVfY29sb3JtYXAKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBjbWFwCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9mcmVlX2NvbG9ybWFwICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY29weV9jb2xvcm1hcF9hbmRfZnJlZV9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgbWlkCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIHNyY19jbWFwCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jb3B5X2NvbG9ybWFwX2FuZF9mcmVlX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBtaWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBzcmNfY21hcCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY29weV9jb2xvcm1hcF9hbmRfZnJlZQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIG1pZAorICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBzcmNfY21hcAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY29weV9jb2xvcm1hcF9hbmRfZnJlZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBtaWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgc3JjX2NtYXAgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfaW5zdGFsbF9jb2xvcm1hcF9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfaW5zdGFsbF9jb2xvcm1hcF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfaW5zdGFsbF9jb2xvcm1hcAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2luc3RhbGxfY29sb3JtYXAgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl91bmluc3RhbGxfY29sb3JtYXBfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3VuaW5zdGFsbF9jb2xvcm1hcF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl91bmluc3RhbGxfY29sb3JtYXAKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBjbWFwCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl91bmluc3RhbGxfY29sb3JtYXAgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovKTsKKworaW50Cit4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19jb29raWVfdCB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2Nvb2tpZV90Cit4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY29va2llX3QgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc191bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY29va2llX3QKK3hjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfY29sb3JtYXBfdCAqIHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY21hcHMKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2NvbG9ybWFwX3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfY29sb3JtYXBfdCAqCit4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2NtYXBzIChjb25zdCB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY21hcHNfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY21hcHNfbGVuZ3RoIChjb25zdCB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2NtYXBzX2VuZAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY21hcHNfZW5kIChjb25zdCB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcGx5X3QgKiB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcGx5X3QgKgoreGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2FsbG9jX2NvbG9yX2Nvb2tpZV90IHhjYl9hbGxvY19jb2xvcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgcmVkCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGdyZWVuCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJsdWUKKyAqKiBAcmV0dXJucyB4Y2JfYWxsb2NfY29sb3JfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2FsbG9jX2NvbG9yX2Nvb2tpZV90Cit4Y2JfYWxsb2NfY29sb3IgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHJlZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZ3JlZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJsdWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2FsbG9jX2NvbG9yX2Nvb2tpZV90IHhjYl9hbGxvY19jb2xvcl91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBjbWFwCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHJlZAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBncmVlbgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBibHVlCisgKiogQHJldHVybnMgeGNiX2FsbG9jX2NvbG9yX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9hbGxvY19jb2xvcl9jb29raWVfdAoreGNiX2FsbG9jX2NvbG9yX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICByZWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBncmVlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJsdWUgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2FsbG9jX2NvbG9yX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9hbGxvY19jb2xvcl9yZXBseV90ICogeGNiX2FsbG9jX2NvbG9yX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2FsbG9jX2NvbG9yX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfYWxsb2NfY29sb3JfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9hbGxvY19jb2xvcl9yZXBseV90ICoKK3hjYl9hbGxvY19jb2xvcl9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2FsbG9jX2NvbG9yX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2JfYWxsb2NfbmFtZWRfY29sb3Jfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfYWxsb2NfbmFtZWRfY29sb3JfY29va2llX3QgeGNiX2FsbG9jX25hbWVkX2NvbG9yCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbgorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpuYW1lCisgKiogQHJldHVybnMgeGNiX2FsbG9jX25hbWVkX2NvbG9yX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9hbGxvY19uYW1lZF9jb2xvcl9jb29raWVfdAoreGNiX2FsbG9jX25hbWVkX2NvbG9yICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbmFtZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfYWxsb2NfbmFtZWRfY29sb3JfY29va2llX3QgeGNiX2FsbG9jX25hbWVkX2NvbG9yX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4KKyAqKiBAcGFyYW0gY29uc3QgY2hhciAgICAgICAqbmFtZQorICoqIEByZXR1cm5zIHhjYl9hbGxvY19uYW1lZF9jb2xvcl9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfYWxsb2NfbmFtZWRfY29sb3JfY29va2llX3QKK3hjYl9hbGxvY19uYW1lZF9jb2xvcl91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9hbGxvY19uYW1lZF9jb2xvcl91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfYWxsb2NfbmFtZWRfY29sb3JfcmVwbHlfdCAqIHhjYl9hbGxvY19uYW1lZF9jb2xvcl9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9hbGxvY19uYW1lZF9jb2xvcl9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2FsbG9jX25hbWVkX2NvbG9yX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfYWxsb2NfbmFtZWRfY29sb3JfcmVwbHlfdCAqCit4Y2JfYWxsb2NfbmFtZWRfY29sb3JfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hbGxvY19uYW1lZF9jb2xvcl9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2FsbG9jX2NvbG9yX2NlbGxzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2FsbG9jX2NvbG9yX2NlbGxzX2Nvb2tpZV90IHhjYl9hbGxvY19jb2xvcl9jZWxscworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGNvbnRpZ3VvdXMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBjb2xvcnMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgcGxhbmVzCisgKiogQHJldHVybnMgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9hbGxvY19jb2xvcl9jZWxsc19jb29raWVfdAoreGNiX2FsbG9jX2NvbG9yX2NlbGxzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBjb250aWd1b3VzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBjb2xvcnMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHBsYW5lcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfY29va2llX3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGNvbnRpZ3VvdXMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBjb2xvcnMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgcGxhbmVzCisgKiogQHJldHVybnMgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9hbGxvY19jb2xvcl9jZWxsc19jb29raWVfdAoreGNiX2FsbG9jX2NvbG9yX2NlbGxzX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGNvbnRpZ3VvdXMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgY29sb3JzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgcGxhbmVzICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHVpbnQzMl90ICogeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3BpeGVscworICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHVpbnQzMl90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordWludDMyX3QgKgoreGNiX2FsbG9jX2NvbG9yX2NlbGxzX3BpeGVscyAoY29uc3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9hbGxvY19jb2xvcl9jZWxsc19waXhlbHNfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX2FsbG9jX2NvbG9yX2NlbGxzX3BpeGVsc19sZW5ndGggKGNvbnN0IHhjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3BpeGVsc19lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9hbGxvY19jb2xvcl9jZWxsc19waXhlbHNfZW5kIChjb25zdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB1aW50MzJfdCAqIHhjYl9hbGxvY19jb2xvcl9jZWxsc19tYXNrcworICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHVpbnQzMl90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordWludDMyX3QgKgoreGNiX2FsbG9jX2NvbG9yX2NlbGxzX21hc2tzIChjb25zdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX21hc2tzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9hbGxvY19jb2xvcl9jZWxsc19tYXNrc19sZW5ndGggKGNvbnN0IHhjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX21hc2tzX2VuZAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2FsbG9jX2NvbG9yX2NlbGxzX21hc2tzX2VuZCAoY29uc3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseV90ICogeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2FsbG9jX2NvbG9yX2NlbGxzX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseV90ICoKK3hjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19jb29raWVfdCB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgY29udGlndW91cworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBjbWFwCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGNvbG9ycworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICByZWRzCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGdyZWVucworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBibHVlcworICoqIEByZXR1cm5zIHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2FsbG9jX2NvbG9yX3BsYW5lc19jb29raWVfdAoreGNiX2FsbG9jX2NvbG9yX3BsYW5lcyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGNvbnRpZ3VvdXMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgY29sb3JzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgcmVkcyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGdyZWVucyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJsdWVzICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfY29va2llX3QgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc191bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBjb250aWd1b3VzCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgY29sb3JzCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHJlZHMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZ3JlZW5zCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJsdWVzCisgKiogQHJldHVybnMgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX2Nvb2tpZV90Cit4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBjb250aWd1b3VzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgY29sb3JzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHJlZHMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZ3JlZW5zICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJsdWVzICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHVpbnQzMl90ICogeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19waXhlbHMKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19yZXBseV90ICpSCisgKiogQHJldHVybnMgdWludDMyX3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit1aW50MzJfdCAqCit4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3BpeGVscyAoY29uc3QgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3BpeGVsc19sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX2FsbG9jX2NvbG9yX3BsYW5lc19waXhlbHNfbGVuZ3RoIChjb25zdCB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3BpeGVsc19lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3BpeGVsc19lbmQgKGNvbnN0IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdCAqIHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2FsbG9jX2NvbG9yX3BsYW5lc19jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdCAqCit4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2ZyZWVfY29sb3JzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgcGl4ZWxzX2xlbiAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9mcmVlX2NvbG9yc19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBwbGFuZV9tYXNrCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHBpeGVsc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgdWludDMyX3QgICAqcGl4ZWxzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9mcmVlX2NvbG9yc19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcGxhbmVfbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBwaXhlbHNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnBpeGVscyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZnJlZV9jb2xvcnMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBjbWFwCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHBsYW5lX21hc2sKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgcGl4ZWxzX2xlbgorICoqIEBwYXJhbSBjb25zdCB1aW50MzJfdCAgICpwaXhlbHMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2ZyZWVfY29sb3JzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBwbGFuZV9tYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBwaXhlbHNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICpwaXhlbHMgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9jb2xvcml0ZW1faXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfY29sb3JpdGVtX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9jb2xvcml0ZW1fbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29sb3JpdGVtX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9jb2xvcml0ZW1fbmV4dCAoeGNiX2NvbG9yaXRlbV9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9jb2xvcml0ZW1faXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfY29sb3JpdGVtX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29sb3JpdGVtX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2NvbG9yaXRlbV9lbmQgKHhjYl9jb2xvcml0ZW1faXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworaW50Cit4Y2Jfc3RvcmVfY29sb3JzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIGl0ZW1zX2xlbiAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zdG9yZV9jb2xvcnNfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgICAgICBjbWFwCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgICAgICAgaXRlbXNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9jb2xvcml0ZW1fdCAqaXRlbXMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3N0b3JlX2NvbG9yc19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgICAgICAgY21hcCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICBpdGVtc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9jb2xvcml0ZW1fdCAqaXRlbXMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3N0b3JlX2NvbG9ycworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgICAgICBjbWFwCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgICAgICAgaXRlbXNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9jb2xvcml0ZW1fdCAqaXRlbXMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3N0b3JlX2NvbG9ycyAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgICAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICBpdGVtc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfY29sb3JpdGVtX3QgKml0ZW1zICAvKio8ICovKTsKKworaW50Cit4Y2Jfc3RvcmVfbmFtZWRfY29sb3Jfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zdG9yZV9uYW1lZF9jb2xvcl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZmxhZ3MKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBwaXhlbAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbgorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpuYW1lCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zdG9yZV9uYW1lZF9jb2xvcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGZsYWdzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcGl4ZWwgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbmFtZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc3RvcmVfbmFtZWRfY29sb3IKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBmbGFncworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBjbWFwCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHBpeGVsCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuCisgKiogQHBhcmFtIGNvbnN0IGNoYXIgICAgICAgKm5hbWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3N0b3JlX25hbWVkX2NvbG9yICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBmbGFncyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcGl4ZWwgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfcmdiX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX3JnYl90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfcmdiX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3JnYl9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfcmdiX25leHQgKHhjYl9yZ2JfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfcmdiX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3JnYl9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3JnYl9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9yZ2JfZW5kICh4Y2JfcmdiX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3F1ZXJ5X2NvbG9yc19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBwaXhlbHNfbGVuICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV9jb2xvcnNfY29va2llX3QgeGNiX3F1ZXJ5X2NvbG9ycworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgcGl4ZWxzX2xlbgorICoqIEBwYXJhbSBjb25zdCB1aW50MzJfdCAgICpwaXhlbHMKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfY29sb3JzX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9xdWVyeV9jb2xvcnNfY29va2llX3QKK3hjYl9xdWVyeV9jb2xvcnMgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcGl4ZWxzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnBpeGVscyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfY29sb3JzX2Nvb2tpZV90IHhjYl9xdWVyeV9jb2xvcnNfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBwaXhlbHNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHVpbnQzMl90ICAgKnBpeGVscworICoqIEByZXR1cm5zIHhjYl9xdWVyeV9jb2xvcnNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X2NvbG9yc19jb29raWVfdAoreGNiX3F1ZXJ5X2NvbG9yc191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBwaXhlbHNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnBpeGVscyAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcmdiX3QgKiB4Y2JfcXVlcnlfY29sb3JzX2NvbG9ycworICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfcXVlcnlfY29sb3JzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfcmdiX3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcmdiX3QgKgoreGNiX3F1ZXJ5X2NvbG9yc19jb2xvcnMgKGNvbnN0IHhjYl9xdWVyeV9jb2xvcnNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX3F1ZXJ5X2NvbG9yc19jb2xvcnNfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9xdWVyeV9jb2xvcnNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9xdWVyeV9jb2xvcnNfY29sb3JzX2xlbmd0aCAoY29uc3QgeGNiX3F1ZXJ5X2NvbG9yc19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9yZ2JfaXRlcmF0b3JfdCB4Y2JfcXVlcnlfY29sb3JzX2NvbG9yc19pdGVyYXRvcgorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfcXVlcnlfY29sb3JzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfcmdiX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3JnYl9pdGVyYXRvcl90Cit4Y2JfcXVlcnlfY29sb3JzX2NvbG9yc19pdGVyYXRvciAoY29uc3QgeGNiX3F1ZXJ5X2NvbG9yc19yZXBseV90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9xdWVyeV9jb2xvcnNfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X2NvbG9yc19yZXBseV90ICogeGNiX3F1ZXJ5X2NvbG9yc19yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfcXVlcnlfY29sb3JzX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X2NvbG9yc19yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X2NvbG9yc19yZXBseV90ICoKK3hjYl9xdWVyeV9jb2xvcnNfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3F1ZXJ5X2NvbG9yc19jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2JfbG9va3VwX2NvbG9yX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2xvb2t1cF9jb2xvcl9jb29raWVfdCB4Y2JfbG9va3VwX2NvbG9yCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbgorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpuYW1lCisgKiogQHJldHVybnMgeGNiX2xvb2t1cF9jb2xvcl9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbG9va3VwX2NvbG9yX2Nvb2tpZV90Cit4Y2JfbG9va3VwX2NvbG9yICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbmFtZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbG9va3VwX2NvbG9yX2Nvb2tpZV90IHhjYl9sb29rdXBfY29sb3JfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbgorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpuYW1lCisgKiogQHJldHVybnMgeGNiX2xvb2t1cF9jb2xvcl9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbG9va3VwX2NvbG9yX2Nvb2tpZV90Cit4Y2JfbG9va3VwX2NvbG9yX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm5hbWUgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2xvb2t1cF9jb2xvcl91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbG9va3VwX2NvbG9yX3JlcGx5X3QgKiB4Y2JfbG9va3VwX2NvbG9yX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9sb29rdXBfY29sb3JfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfbG9va3VwX2NvbG9yX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbG9va3VwX2NvbG9yX3JlcGx5X3QgKgoreGNiX2xvb2t1cF9jb2xvcl9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfbG9va3VwX2NvbG9yX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAqKmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY3JlYXRlX2N1cnNvcl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2N1cnNvcl90ICAgICAgY2lkCisgKiogQHBhcmFtIHhjYl9waXhtYXBfdCAgICAgIHNvdXJjZQorICoqIEBwYXJhbSB4Y2JfcGl4bWFwX3QgICAgICBtYXNrCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfcmVkCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfZ3JlZW4KKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZm9yZV9ibHVlCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfcmVkCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfZ3JlZW4KKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYmFja19ibHVlCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgeQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY3JlYXRlX2N1cnNvcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY2lkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3BpeG1hcF90ICAgICAgc291cmNlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3BpeG1hcF90ICAgICAgbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfcmVkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9ncmVlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfYmx1ZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfcmVkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19ncmVlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfYmx1ZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB5ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jcmVhdGVfY3Vyc29yCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2N1cnNvcl90ICAgICAgY2lkCisgKiogQHBhcmFtIHhjYl9waXhtYXBfdCAgICAgIHNvdXJjZQorICoqIEBwYXJhbSB4Y2JfcGl4bWFwX3QgICAgICBtYXNrCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfcmVkCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfZ3JlZW4KKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZm9yZV9ibHVlCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfcmVkCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfZ3JlZW4KKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYmFja19ibHVlCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgeQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY3JlYXRlX2N1cnNvciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB4Y2JfY3Vyc29yX3QgICAgICBjaWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgeGNiX3BpeG1hcF90ICAgICAgc291cmNlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl9waXhtYXBfdCAgICAgIG1hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9yZWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9ncmVlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX2JsdWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19yZWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19ncmVlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX2JsdWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB5ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NyZWF0ZV9nbHlwaF9jdXJzb3JfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jdXJzb3JfdCAgICAgIGNpZAorICoqIEBwYXJhbSB4Y2JfZm9udF90ICAgICAgICBzb3VyY2VfZm9udAorICoqIEBwYXJhbSB4Y2JfZm9udF90ICAgICAgICBtYXNrX2ZvbnQKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgc291cmNlX2NoYXIKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbWFza19jaGFyCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfcmVkCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfZ3JlZW4KKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZm9yZV9ibHVlCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfcmVkCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfZ3JlZW4KKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYmFja19ibHVlCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jcmVhdGVfZ2x5cGhfY3Vyc29yX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY3Vyc29yX3QgICAgICBjaWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZm9udF90ICAgICAgICBzb3VyY2VfZm9udCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9mb250X3QgICAgICAgIG1hc2tfZm9udCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHNvdXJjZV9jaGFyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbWFza19jaGFyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9yZWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX2dyZWVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9ibHVlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19yZWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX2dyZWVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19ibHVlICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jcmVhdGVfZ2x5cGhfY3Vyc29yCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2N1cnNvcl90ICAgICAgY2lkCisgKiogQHBhcmFtIHhjYl9mb250X3QgICAgICAgIHNvdXJjZV9mb250CisgKiogQHBhcmFtIHhjYl9mb250X3QgICAgICAgIG1hc2tfZm9udAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBzb3VyY2VfY2hhcgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBtYXNrX2NoYXIKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZm9yZV9yZWQKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZm9yZV9ncmVlbgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBmb3JlX2JsdWUKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYmFja19yZWQKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYmFja19ncmVlbgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBiYWNrX2JsdWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NyZWF0ZV9nbHlwaF9jdXJzb3IgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY2lkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9mb250X3QgICAgICAgIHNvdXJjZV9mb250ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9mb250X3QgICAgICAgIG1hc2tfZm9udCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBzb3VyY2VfY2hhciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBtYXNrX2NoYXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9yZWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9ncmVlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX2JsdWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19yZWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19ncmVlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX2JsdWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZnJlZV9jdXJzb3JfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvcgorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZnJlZV9jdXJzb3JfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY3Vyc29yX3QgICAgICBjdXJzb3IgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2ZyZWVfY3Vyc29yCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2N1cnNvcl90ICAgICAgY3Vyc29yCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9mcmVlX2N1cnNvciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3JlY29sb3JfY3Vyc29yX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY3Vyc29yX3QgICAgICBjdXJzb3IKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZm9yZV9yZWQKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZm9yZV9ncmVlbgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBmb3JlX2JsdWUKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYmFja19yZWQKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYmFja19ncmVlbgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBiYWNrX2JsdWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3JlY29sb3JfY3Vyc29yX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfcmVkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfZ3JlZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9ibHVlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfcmVkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfZ3JlZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19ibHVlICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9yZWNvbG9yX2N1cnNvcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvcgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBmb3JlX3JlZAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBmb3JlX2dyZWVuCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfYmx1ZQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBiYWNrX3JlZAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBiYWNrX2dyZWVuCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfYmx1ZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcmVjb2xvcl9jdXJzb3IgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9yZWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfZ3JlZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfYmx1ZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19yZWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfZ3JlZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfYmx1ZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfYmVzdF9zaXplX2Nvb2tpZV90IHhjYl9xdWVyeV9iZXN0X3NpemUKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBfY2xhc3MKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgd2lkdGgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgaGVpZ2h0CisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfYmVzdF9zaXplX2Nvb2tpZV90Cit4Y2JfcXVlcnlfYmVzdF9zaXplICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgX2NsYXNzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfYmVzdF9zaXplX2Nvb2tpZV90IHhjYl9xdWVyeV9iZXN0X3NpemVfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgX2NsYXNzCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHdpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGhlaWdodAorICoqIEByZXR1cm5zIHhjYl9xdWVyeV9iZXN0X3NpemVfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9jb29raWVfdAoreGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgX2NsYXNzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfcXVlcnlfYmVzdF9zaXplX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV9iZXN0X3NpemVfcmVwbHlfdCAqIHhjYl9xdWVyeV9iZXN0X3NpemVfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9xdWVyeV9iZXN0X3NpemVfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9xdWVyeV9iZXN0X3NpemVfcmVwbHlfdCAqCit4Y2JfcXVlcnlfYmVzdF9zaXplX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9xdWVyeV9iZXN0X3NpemVfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3F1ZXJ5X2V4dGVuc2lvbl9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV9leHRlbnNpb25fY29va2llX3QgeGNiX3F1ZXJ5X2V4dGVuc2lvbgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuCisgKiogQHBhcmFtIGNvbnN0IGNoYXIgICAgICAgKm5hbWUKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfZXh0ZW5zaW9uX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9xdWVyeV9leHRlbnNpb25fY29va2llX3QKK3hjYl9xdWVyeV9leHRlbnNpb24gKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm5hbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X2V4dGVuc2lvbl9jb29raWVfdCB4Y2JfcXVlcnlfZXh0ZW5zaW9uX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuCisgKiogQHBhcmFtIGNvbnN0IGNoYXIgICAgICAgKm5hbWUKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfZXh0ZW5zaW9uX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9xdWVyeV9leHRlbnNpb25fY29va2llX3QKK3hjYl9xdWVyeV9leHRlbnNpb25fdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm5hbWUgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX3F1ZXJ5X2V4dGVuc2lvbl91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfZXh0ZW5zaW9uX3JlcGx5X3QgKiB4Y2JfcXVlcnlfZXh0ZW5zaW9uX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9xdWVyeV9leHRlbnNpb25fY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfZXh0ZW5zaW9uX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfZXh0ZW5zaW9uX3JlcGx5X3QgKgoreGNiX3F1ZXJ5X2V4dGVuc2lvbl9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfcXVlcnlfZXh0ZW5zaW9uX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9saXN0X2V4dGVuc2lvbnNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbGlzdF9leHRlbnNpb25zX2Nvb2tpZV90IHhjYl9saXN0X2V4dGVuc2lvbnMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl9saXN0X2V4dGVuc2lvbnNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xpc3RfZXh0ZW5zaW9uc19jb29raWVfdAoreGNiX2xpc3RfZXh0ZW5zaW9ucyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbGlzdF9leHRlbnNpb25zX2Nvb2tpZV90IHhjYl9saXN0X2V4dGVuc2lvbnNfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfbGlzdF9leHRlbnNpb25zX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9saXN0X2V4dGVuc2lvbnNfY29va2llX3QKK3hjYl9saXN0X2V4dGVuc2lvbnNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfbGlzdF9leHRlbnNpb25zX25hbWVzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfbGlzdF9leHRlbnNpb25zX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfbGlzdF9leHRlbnNpb25zX25hbWVzX2xlbmd0aCAoY29uc3QgeGNiX2xpc3RfZXh0ZW5zaW9uc19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9zdHJfaXRlcmF0b3JfdCB4Y2JfbGlzdF9leHRlbnNpb25zX25hbWVzX2l0ZXJhdG9yCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9saXN0X2V4dGVuc2lvbnNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9zdHJfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfc3RyX2l0ZXJhdG9yX3QKK3hjYl9saXN0X2V4dGVuc2lvbnNfbmFtZXNfaXRlcmF0b3IgKGNvbnN0IHhjYl9saXN0X2V4dGVuc2lvbnNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfbGlzdF9leHRlbnNpb25zX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9saXN0X2V4dGVuc2lvbnNfcmVwbHlfdCAqIHhjYl9saXN0X2V4dGVuc2lvbnNfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2xpc3RfZXh0ZW5zaW9uc19jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9saXN0X2V4dGVuc2lvbnNfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9saXN0X2V4dGVuc2lvbnNfcmVwbHlfdCAqCit4Y2JfbGlzdF9leHRlbnNpb25zX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9saXN0X2V4dGVuc2lvbnNfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2NoYW5nZV9rZXlib2FyZF9tYXBwaW5nX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY2hhbmdlX2tleWJvYXJkX21hcHBpbmdfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgICBrZXljb2RlX2NvdW50CisgKiogQHBhcmFtIHhjYl9rZXljb2RlX3QgICAgICAgZmlyc3Rfa2V5Y29kZQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICAgIGtleXN5bXNfcGVyX2tleWNvZGUKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2tleXN5bV90ICprZXlzeW1zCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jaGFuZ2Vfa2V5Ym9hcmRfbWFwcGluZ19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBrZXljb2RlX2NvdW50ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9rZXljb2RlX3QgICAgICAgZmlyc3Rfa2V5Y29kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgIGtleXN5bXNfcGVyX2tleWNvZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2tleXN5bV90ICprZXlzeW1zICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2Vfa2V5Ym9hcmRfbWFwcGluZworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgICBrZXljb2RlX2NvdW50CisgKiogQHBhcmFtIHhjYl9rZXljb2RlX3QgICAgICAgZmlyc3Rfa2V5Y29kZQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICAgIGtleXN5bXNfcGVyX2tleWNvZGUKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2tleXN5bV90ICprZXlzeW1zCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jaGFuZ2Vfa2V5Ym9hcmRfbWFwcGluZyAoeGNiX2Nvbm5lY3Rpb25fdCAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgIGtleWNvZGVfY291bnQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9rZXljb2RlX3QgICAgICAgZmlyc3Rfa2V5Y29kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBrZXlzeW1zX3Blcl9rZXljb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2Jfa2V5c3ltX3QgKmtleXN5bXMgIC8qKjwgKi8pOworCitpbnQKK3hjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19jb29raWVfdCB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmcKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfa2V5Y29kZV90ICAgICBmaXJzdF9rZXljb2RlCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGNvdW50CisgKiogQHJldHVybnMgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19jb29raWVfdAoreGNiX2dldF9rZXlib2FyZF9tYXBwaW5nICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfa2V5Y29kZV90ICAgICBmaXJzdF9rZXljb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBjb3VudCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfY29va2llX3QgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9rZXljb2RlX3QgICAgIGZpcnN0X2tleWNvZGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgY291bnQKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX2Nvb2tpZV90Cit4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2tleWNvZGVfdCAgICAgZmlyc3Rfa2V5Y29kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGNvdW50ICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9rZXlzeW1fdCAqIHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19rZXlzeW1zCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2tleXN5bV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2tleXN5bV90ICoKK3hjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19rZXlzeW1zIChjb25zdCB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX2tleXN5bXNfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX2tleXN5bXNfbGVuZ3RoIChjb25zdCB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19rZXlzeW1zX2VuZAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX2tleXN5bXNfZW5kIChjb25zdCB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcGx5X3QgKiB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcGx5X3QgKgoreGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9jaGFuZ2Vfa2V5Ym9hcmRfY29udHJvbF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NoYW5nZV9rZXlib2FyZF9jb250cm9sX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrCisgKiogQHBhcmFtIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NoYW5nZV9rZXlib2FyZF9jb250cm9sX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2Vfa2V5Ym9hcmRfY29udHJvbAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sKKyAqKiBAcGFyYW0gY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2hhbmdlX2tleWJvYXJkX2NvbnRyb2wgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9rZXlib2FyZF9jb250cm9sX2Nvb2tpZV90IHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2dldF9rZXlib2FyZF9jb250cm9sX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9jb29raWVfdAoreGNiX2dldF9rZXlib2FyZF9jb250cm9sICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9jb29raWVfdCB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9rZXlib2FyZF9jb250cm9sX2Nvb2tpZV90Cit4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfcmVwbHlfdCAqIHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2dldF9rZXlib2FyZF9jb250cm9sX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfcmVwbHlfdCAqCit4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9iZWxsX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSBpbnQ4X3QgICAgICAgICAgICBwZXJjZW50CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9iZWxsX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICBpbnQ4X3QgICAgICAgICAgICBwZXJjZW50ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9iZWxsCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gaW50OF90ICAgICAgICAgICAgcGVyY2VudAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfYmVsbCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICBpbnQ4X3QgICAgICAgICAgICBwZXJjZW50ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NoYW5nZV9wb2ludGVyX2NvbnRyb2xfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGFjY2VsZXJhdGlvbl9udW1lcmF0b3IKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgYWNjZWxlcmF0aW9uX2Rlbm9taW5hdG9yCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHRocmVzaG9sZAorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBkb19hY2NlbGVyYXRpb24KKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZG9fdGhyZXNob2xkCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jaGFuZ2VfcG9pbnRlcl9jb250cm9sX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBhY2NlbGVyYXRpb25fbnVtZXJhdG9yICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgYWNjZWxlcmF0aW9uX2Rlbm9taW5hdG9yICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgdGhyZXNob2xkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZG9fYWNjZWxlcmF0aW9uICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZG9fdGhyZXNob2xkICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2VfcG9pbnRlcl9jb250cm9sCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgYWNjZWxlcmF0aW9uX251bWVyYXRvcgorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBhY2NlbGVyYXRpb25fZGVub21pbmF0b3IKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgdGhyZXNob2xkCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGRvX2FjY2VsZXJhdGlvbgorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBkb190aHJlc2hvbGQKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NoYW5nZV9wb2ludGVyX2NvbnRyb2wgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgYWNjZWxlcmF0aW9uX251bWVyYXRvciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBhY2NlbGVyYXRpb25fZGVub21pbmF0b3IgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgdGhyZXNob2xkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGRvX2FjY2VsZXJhdGlvbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBkb190aHJlc2hvbGQgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9wb2ludGVyX2NvbnRyb2xfY29va2llX3QgeGNiX2dldF9wb2ludGVyX2NvbnRyb2wKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl9nZXRfcG9pbnRlcl9jb250cm9sX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfcG9pbnRlcl9jb250cm9sX2Nvb2tpZV90Cit4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9jb29raWVfdCB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl9nZXRfcG9pbnRlcl9jb250cm9sX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfcG9pbnRlcl9jb250cm9sX2Nvb2tpZV90Cit4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dldF9wb2ludGVyX2NvbnRyb2xfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9wb2ludGVyX2NvbnRyb2xfcmVwbHlfdCAqIHhjYl9nZXRfcG9pbnRlcl9jb250cm9sX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9wb2ludGVyX2NvbnRyb2xfcmVwbHlfdCAqCit4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfcG9pbnRlcl9jb250cm9sX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zZXRfc2NyZWVuX3NhdmVyX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB0aW1lb3V0CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGludGVydmFsCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIHByZWZlcl9ibGFua2luZworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBhbGxvd19leHBvc3VyZXMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3NldF9zY3JlZW5fc2F2ZXJfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHRpbWVvdXQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBpbnRlcnZhbCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHByZWZlcl9ibGFua2luZyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGFsbG93X2V4cG9zdXJlcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc2V0X3NjcmVlbl9zYXZlcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHRpbWVvdXQKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgaW50ZXJ2YWwKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgcHJlZmVyX2JsYW5raW5nCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGFsbG93X2V4cG9zdXJlcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X3NjcmVlbl9zYXZlciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB0aW1lb3V0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGludGVydmFsICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHByZWZlcl9ibGFua2luZyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBhbGxvd19leHBvc3VyZXMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9zY3JlZW5fc2F2ZXJfY29va2llX3QgeGNiX2dldF9zY3JlZW5fc2F2ZXIKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl9nZXRfc2NyZWVuX3NhdmVyX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfc2NyZWVuX3NhdmVyX2Nvb2tpZV90Cit4Y2JfZ2V0X3NjcmVlbl9zYXZlciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9jb29raWVfdCB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl9nZXRfc2NyZWVuX3NhdmVyX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfc2NyZWVuX3NhdmVyX2Nvb2tpZV90Cit4Y2JfZ2V0X3NjcmVlbl9zYXZlcl91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dldF9zY3JlZW5fc2F2ZXJfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9zY3JlZW5fc2F2ZXJfcmVwbHlfdCAqIHhjYl9nZXRfc2NyZWVuX3NhdmVyX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9zY3JlZW5fc2F2ZXJfcmVwbHlfdCAqCit4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfc2NyZWVuX3NhdmVyX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2NoYW5nZV9ob3N0c19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NoYW5nZV9ob3N0c19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgbW9kZQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBmYW1pbHkKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYWRkcmVzc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgdWludDhfdCAgICAqYWRkcmVzcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2hhbmdlX2hvc3RzX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGZhbWlseSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYWRkcmVzc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKmFkZHJlc3MgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NoYW5nZV9ob3N0cworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG1vZGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZmFtaWx5CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGFkZHJlc3NfbGVuCisgKiogQHBhcmFtIGNvbnN0IHVpbnQ4X3QgICAgKmFkZHJlc3MKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NoYW5nZV9ob3N0cyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBmYW1pbHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBhZGRyZXNzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKmFkZHJlc3MgIC8qKjwgKi8pOworCitpbnQKK3hjYl9ob3N0X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdWludDhfdCAqIHhjYl9ob3N0X2FkZHJlc3MKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2hvc3RfdCAqUgorICoqIEByZXR1cm5zIHVpbnQ4X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit1aW50OF90ICoKK3hjYl9ob3N0X2FkZHJlc3MgKGNvbnN0IHhjYl9ob3N0X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9ob3N0X2FkZHJlc3NfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9ob3N0X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfaG9zdF9hZGRyZXNzX2xlbmd0aCAoY29uc3QgeGNiX2hvc3RfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9ob3N0X2FkZHJlc3NfZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9ob3N0X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9ob3N0X2FkZHJlc3NfZW5kIChjb25zdCB4Y2JfaG9zdF90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfaG9zdF9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9ob3N0X3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9ob3N0X25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2hvc3RfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX2hvc3RfbmV4dCAoeGNiX2hvc3RfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfaG9zdF9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9ob3N0X2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfaG9zdF9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9ob3N0X2VuZCAoeGNiX2hvc3RfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworaW50Cit4Y2JfbGlzdF9ob3N0c19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9saXN0X2hvc3RzX2Nvb2tpZV90IHhjYl9saXN0X2hvc3RzCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfbGlzdF9ob3N0c19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9ob3N0c19jb29raWVfdAoreGNiX2xpc3RfaG9zdHMgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2xpc3RfaG9zdHNfY29va2llX3QgeGNiX2xpc3RfaG9zdHNfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfbGlzdF9ob3N0c19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9ob3N0c19jb29raWVfdAoreGNiX2xpc3RfaG9zdHNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfbGlzdF9ob3N0c19ob3N0c19sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2xpc3RfaG9zdHNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9saXN0X2hvc3RzX2hvc3RzX2xlbmd0aCAoY29uc3QgeGNiX2xpc3RfaG9zdHNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfaG9zdF9pdGVyYXRvcl90IHhjYl9saXN0X2hvc3RzX2hvc3RzX2l0ZXJhdG9yCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9saXN0X2hvc3RzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfaG9zdF9pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9ob3N0X2l0ZXJhdG9yX3QKK3hjYl9saXN0X2hvc3RzX2hvc3RzX2l0ZXJhdG9yIChjb25zdCB4Y2JfbGlzdF9ob3N0c19yZXBseV90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9saXN0X2hvc3RzX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9saXN0X2hvc3RzX3JlcGx5X3QgKiB4Y2JfbGlzdF9ob3N0c19yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2xpc3RfaG9zdHNfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2xpc3RfaG9zdHNfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9saXN0X2hvc3RzX3JlcGx5X3QgKgoreGNiX2xpc3RfaG9zdHNfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB4Y2JfbGlzdF9ob3N0c19jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAqKmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc2V0X2FjY2Vzc19jb250cm9sX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBtb2RlCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zZXRfYWNjZXNzX2NvbnRyb2xfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgbW9kZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc2V0X2FjY2Vzc19jb250cm9sCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgbW9kZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X2FjY2Vzc19jb250cm9sICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgbW9kZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zZXRfY2xvc2VfZG93bl9tb2RlX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBtb2RlCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zZXRfY2xvc2VfZG93bl9tb2RlX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zZXRfY2xvc2VfZG93bl9tb2RlCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgbW9kZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X2Nsb3NlX2Rvd25fbW9kZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2tpbGxfY2xpZW50X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICByZXNvdXJjZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfa2lsbF9jbGllbnRfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICByZXNvdXJjZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfa2lsbF9jbGllbnQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICByZXNvdXJjZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfa2lsbF9jbGllbnQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHJlc291cmNlICAvKio8ICovKTsKKworaW50Cit4Y2Jfcm90YXRlX3Byb3BlcnRpZXNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9yb3RhdGVfcHJvcGVydGllc19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGF0b21zX2xlbgorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBkZWx0YQorICoqIEBwYXJhbSBjb25zdCB4Y2JfYXRvbV90ICphdG9tcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfcm90YXRlX3Byb3BlcnRpZXNfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYXRvbXNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRlbHRhICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9hdG9tX3QgKmF0b21zICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9yb3RhdGVfcHJvcGVydGllcworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBhdG9tc19sZW4KKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZGVsdGEKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2F0b21fdCAqYXRvbXMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3JvdGF0ZV9wcm9wZXJ0aWVzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGF0b21zX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZGVsdGEgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9hdG9tX3QgKmF0b21zICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2ZvcmNlX3NjcmVlbl9zYXZlcl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgbW9kZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZm9yY2Vfc2NyZWVuX3NhdmVyX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2ZvcmNlX3NjcmVlbl9zYXZlcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG1vZGUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2ZvcmNlX3NjcmVlbl9zYXZlciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3NldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QgeGNiX3NldF9wb2ludGVyX21hcHBpbmcKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBtYXBfbGVuCisgKiogQHBhcmFtIGNvbnN0IHVpbnQ4X3QgICAgKm1hcAorICoqIEByZXR1cm5zIHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90Cit4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtYXBfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKm1hcCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdCB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ191bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBtYXBfbGVuCisgKiogQHBhcmFtIGNvbnN0IHVpbnQ4X3QgICAgKm1hcAorICoqIEByZXR1cm5zIHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90Cit4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1hcF9sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKm1hcCAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90ICogeGNiX3NldF9wb2ludGVyX21hcHBpbmdfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90ICoKK3hjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3NldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdAoreGNiX2dldF9wb2ludGVyX21hcHBpbmcgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdAoreGNiX2dldF9wb2ludGVyX21hcHBpbmdfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHVpbnQ4X3QgKiB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19tYXAKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHVpbnQ4X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit1aW50OF90ICoKK3hjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX21hcCAoY29uc3QgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfbWFwX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX2dldF9wb2ludGVyX21hcHBpbmdfbWFwX2xlbmd0aCAoY29uc3QgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX21hcF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2dldF9wb2ludGVyX21hcHBpbmdfbWFwX2VuZCAoY29uc3QgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90ICogeGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90ICoKK3hjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QgeGNiX3NldF9tb2RpZmllcl9tYXBwaW5nCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgICAga2V5Y29kZXNfcGVyX21vZGlmaWVyCisgKiogQHBhcmFtIGNvbnN0IHhjYl9rZXljb2RlX3QgKmtleWNvZGVzCisgKiogQHJldHVybnMgeGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdAoreGNiX3NldF9tb2RpZmllcl9tYXBwaW5nICh4Y2JfY29ubmVjdGlvbl90ICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgICBrZXljb2Rlc19wZXJfbW9kaWZpZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9rZXljb2RlX3QgKmtleWNvZGVzICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdCB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgICAga2V5Y29kZXNfcGVyX21vZGlmaWVyCisgKiogQHBhcmFtIGNvbnN0IHhjYl9rZXljb2RlX3QgKmtleWNvZGVzCisgKiogQHJldHVybnMgeGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdAoreGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgIGtleWNvZGVzX3Blcl9tb2RpZmllciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9rZXljb2RlX3QgKmtleWNvZGVzICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdCAqIHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdCAqCit4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdAoreGNiX2dldF9tb2RpZmllcl9tYXBwaW5nICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdCB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90Cit4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9rZXljb2RlX3QgKiB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfa2V5Y29kZXMKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2Jfa2V5Y29kZV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2tleWNvZGVfdCAqCit4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfa2V5Y29kZXMgKGNvbnN0IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfa2V5Y29kZXNfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2tleWNvZGVzX2xlbmd0aCAoY29uc3QgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfa2V5Y29kZXNfZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfa2V5Y29kZXNfZW5kIChjb25zdCB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3QgKiB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3QgKgoreGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfbm9fb3BlcmF0aW9uX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfbm9fb3BlcmF0aW9uX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX25vX29wZXJhdGlvbgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9ub19vcGVyYXRpb24gKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgorCisvKioKKyAqIEB9CisgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveGVuL2V2dGNobi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94ZW4vZXZ0Y2huLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlODMzZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveGVuL2V2dGNobi5oCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV2dGNobi5oCisgKgorICogSW50ZXJmYWNlIHRvIC9kZXYveGVuL2V2dGNobi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSwgSyBBIEZyYXNlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IG9yLCB3aGVuIGRpc3RyaWJ1dGVkCisgKiBzZXBhcmF0ZWx5IGZyb20gdGhlIExpbnV4IGtlcm5lbCBvciBpbmNvcnBvcmF0ZWQgaW50byBvdGhlcgorICogc29mdHdhcmUgcGFja2FnZXMsIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBsaWNlbnNlOgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc291cmNlIGZpbGUgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwKKyAqIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1BVQkxJQ19FVlRDSE5fSF9fCisjZGVmaW5lIF9fTElOVVhfUFVCTElDX0VWVENITl9IX18KKworLyoKKyAqIEJpbmQgYSBmcmVzaCBwb3J0IHRvIFZJUlEgQHZpcnEuCisgKiBSZXR1cm4gYWxsb2NhdGVkIHBvcnQuCisgKi8KKyNkZWZpbmUgSU9DVExfRVZUQ0hOX0JJTkRfVklSUQkJCQlcCisJX0lPQyhfSU9DX05PTkUsICdFJywgMCwgc2l6ZW9mKHN0cnVjdCBpb2N0bF9ldnRjaG5fYmluZF92aXJxKSkKK3N0cnVjdCBpb2N0bF9ldnRjaG5fYmluZF92aXJxIHsKKwl1bnNpZ25lZCBpbnQgdmlycTsKK307CisKKy8qCisgKiBCaW5kIGEgZnJlc2ggcG9ydCB0byByZW1vdGUgPEByZW1vdGVfZG9tYWluLCBAcmVtb3RlX3BvcnQ+LgorICogUmV0dXJuIGFsbG9jYXRlZCBwb3J0LgorICovCisjZGVmaW5lIElPQ1RMX0VWVENITl9CSU5EX0lOVEVSRE9NQUlOCQkJXAorCV9JT0MoX0lPQ19OT05FLCAnRScsIDEsIHNpemVvZihzdHJ1Y3QgaW9jdGxfZXZ0Y2huX2JpbmRfaW50ZXJkb21haW4pKQorc3RydWN0IGlvY3RsX2V2dGNobl9iaW5kX2ludGVyZG9tYWluIHsKKwl1bnNpZ25lZCBpbnQgcmVtb3RlX2RvbWFpbiwgcmVtb3RlX3BvcnQ7Cit9OworCisvKgorICogQWxsb2NhdGUgYSBmcmVzaCBwb3J0IGZvciBiaW5kaW5nIHRvIEByZW1vdGVfZG9tYWluLgorICogUmV0dXJuIGFsbG9jYXRlZCBwb3J0LgorICovCisjZGVmaW5lIElPQ1RMX0VWVENITl9CSU5EX1VOQk9VTkRfUE9SVAkJCVwKKwlfSU9DKF9JT0NfTk9ORSwgJ0UnLCAyLCBzaXplb2Yoc3RydWN0IGlvY3RsX2V2dGNobl9iaW5kX3VuYm91bmRfcG9ydCkpCitzdHJ1Y3QgaW9jdGxfZXZ0Y2huX2JpbmRfdW5ib3VuZF9wb3J0IHsKKwl1bnNpZ25lZCBpbnQgcmVtb3RlX2RvbWFpbjsKK307CisKKy8qCisgKiBVbmJpbmQgcHJldmlvdXNseSBhbGxvY2F0ZWQgQHBvcnQuCisgKi8KKyNkZWZpbmUgSU9DVExfRVZUQ0hOX1VOQklORAkJCQlcCisJX0lPQyhfSU9DX05PTkUsICdFJywgMywgc2l6ZW9mKHN0cnVjdCBpb2N0bF9ldnRjaG5fdW5iaW5kKSkKK3N0cnVjdCBpb2N0bF9ldnRjaG5fdW5iaW5kIHsKKwl1bnNpZ25lZCBpbnQgcG9ydDsKK307CisKKy8qCisgKiBVbmJpbmQgcHJldmlvdXNseSBhbGxvY2F0ZWQgQHBvcnQuCisgKi8KKyNkZWZpbmUgSU9DVExfRVZUQ0hOX05PVElGWQkJCQlcCisJX0lPQyhfSU9DX05PTkUsICdFJywgNCwgc2l6ZW9mKHN0cnVjdCBpb2N0bF9ldnRjaG5fbm90aWZ5KSkKK3N0cnVjdCBpb2N0bF9ldnRjaG5fbm90aWZ5IHsKKwl1bnNpZ25lZCBpbnQgcG9ydDsKK307CisKKy8qIENsZWFyIGFuZCByZWluaXRpYWxpc2UgdGhlIGV2ZW50IGJ1ZmZlci4gQ2xlYXIgZXJyb3IgY29uZGl0aW9uLiAqLworI2RlZmluZSBJT0NUTF9FVlRDSE5fUkVTRVQJCQkJXAorCV9JT0MoX0lPQ19OT05FLCAnRScsIDUsIDApCisKKyNlbmRpZiAvKiBfX0xJTlVYX1BVQkxJQ19FVlRDSE5fSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3hlbi9wcml2Y21kLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3hlbi9wcml2Y21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiMDNjNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveGVuL3ByaXZjbWQuaApAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwcml2Y21kLmgKKyAqCisgKiBJbnRlcmZhY2UgdG8gL3Byb2MveGVuL3ByaXZjbWQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUsIEsgQSBGcmFzZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBvciwgd2hlbiBkaXN0cmlidXRlZAorICogc2VwYXJhdGVseSBmcm9tIHRoZSBMaW51eCBrZXJuZWwgb3IgaW5jb3Jwb3JhdGVkIGludG8gb3RoZXIKKyAqIHNvZnR3YXJlIHBhY2thZ2VzLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgbGljZW5zZToKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvdXJjZSBmaWxlICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksCisgKiBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9QVUJMSUNfUFJJVkNNRF9IX18KKyNkZWZpbmUgX19MSU5VWF9QVUJMSUNfUFJJVkNNRF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHhlbl9wZm5fdDsKKworc3RydWN0IHByaXZjbWRfaHlwZXJjYWxsIHsKKwlfX3U2NCBvcDsKKwlfX3U2NCBhcmdbNV07Cit9OworCitzdHJ1Y3QgcHJpdmNtZF9tbWFwX2VudHJ5IHsKKwlfX3U2NCB2YTsKKwlfX3U2NCBtZm47CisJX191NjQgbnBhZ2VzOworfTsKKworc3RydWN0IHByaXZjbWRfbW1hcCB7CisJaW50IG51bTsKKwlkb21pZF90IGRvbTsgLyogdGFyZ2V0IGRvbWFpbiAqLworCXN0cnVjdCBwcml2Y21kX21tYXBfZW50cnkgKmVudHJ5OworfTsKKworc3RydWN0IHByaXZjbWRfbW1hcGJhdGNoIHsKKwlpbnQgbnVtOyAgICAgLyogbnVtYmVyIG9mIHBhZ2VzIHRvIHBvcHVsYXRlICovCisJZG9taWRfdCBkb207IC8qIHRhcmdldCBkb21haW4gKi8KKwlfX3U2NCBhZGRyOyAgLyogdmlydHVhbCBhZGRyZXNzICovCisJeGVuX3Bmbl90ICphcnI7IC8qIGFycmF5IG9mIG1mbnMgLSB0b3AgbmliYmxlIHNldCBvbiBlcnIgKi8KK307CisKKy8qCisgKiBAY21kOiBJT0NUTF9QUklWQ01EX0hZUEVSQ0FMTAorICogQGFyZzogJnByaXZjbWRfaHlwZXJjYWxsX3QKKyAqIFJldHVybjogVmFsdWUgcmV0dXJuZWQgZnJvbSBleGVjdXRpb24gb2YgdGhlIHNwZWNpZmllZCBoeXBlcmNhbGwuCisgKi8KKyNkZWZpbmUgSU9DVExfUFJJVkNNRF9IWVBFUkNBTEwJCQkJCVwKKwlfSU9DKF9JT0NfTk9ORSwgJ1AnLCAwLCBzaXplb2Yoc3RydWN0IHByaXZjbWRfaHlwZXJjYWxsKSkKKyNkZWZpbmUgSU9DVExfUFJJVkNNRF9NTUFQCQkJCQlcCisJX0lPQyhfSU9DX05PTkUsICdQJywgMiwgc2l6ZW9mKHN0cnVjdCBwcml2Y21kX21tYXApKQorI2RlZmluZSBJT0NUTF9QUklWQ01EX01NQVBCQVRDSAkJCQkJXAorCV9JT0MoX0lPQ19OT05FLCAnUCcsIDMsIHNpemVvZihzdHJ1Y3QgcHJpdmNtZF9tbWFwYmF0Y2gpKQorCisjZW5kaWYgLyogX19MSU5VWF9QVUJMSUNfUFJJVkNNRF9IX18gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveGxvY2FsZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS94bG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1NDE1MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUveGxvY2FsZS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIERlZmluaXRpb24gb2YgbG9jYWxlIGRhdGF0eXBlLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LDIwMDAsMjAwMiwyMDA5LDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk3LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfWExPQ0FMRV9ICisjZGVmaW5lIF9YTE9DQUxFX0gJMQorCisvKiBTdHJ1Y3R1cmUgZm9yIHJlZW50cmFudCBsb2NhbGUgdXNpbmcgZnVuY3Rpb25zLiAgVGhpcyBpcyBhbgorICAgKGFsbW9zdCkgb3BhcXVlIHR5cGUgZm9yIHRoZSB1c2VyIGxldmVsIHByb2dyYW1zLiAgVGhlIGZpbGUgYW5kCisgICB0aGlzIGRhdGEgc3RydWN0dXJlIGlzIG5vdCBzdGFuZGFyZGl6ZWQuICBEb24ndCByZWx5IG9uIGl0LiAgSXQgY2FuCisgICBnbyBhd2F5IHdpdGhvdXQgd2FybmluZy4gICovCit0eXBlZGVmIHN0cnVjdCBfX2xvY2FsZV9zdHJ1Y3QKK3sKKyAgLyogTm90ZTogTENfQUxMIGlzIG5vdCBhIHZhbGlkIGluZGV4IGludG8gdGhpcyBhcnJheS4gICovCisgIHN0cnVjdCBfX2xvY2FsZV9kYXRhICpfX2xvY2FsZXNbMTNdOyAvKiAxMyA9IF9fTENfTEFTVC4gKi8KKworICAvKiBUbyBpbmNyZWFzZSB0aGUgc3BlZWQgb2YgdGhpcyBzb2x1dGlvbiB3ZSBhZGQgc29tZSBzcGVjaWFsIG1lbWJlcnMuICAqLworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBpbnQgKl9fY3R5cGVfYjsKKyAgY29uc3QgaW50ICpfX2N0eXBlX3RvbG93ZXI7CisgIGNvbnN0IGludCAqX19jdHlwZV90b3VwcGVyOworCisgIC8qIE5vdGU6IExDX0FMTCBpcyBub3QgYSB2YWxpZCBpbmRleCBpbnRvIHRoaXMgYXJyYXkuICAqLworICBjb25zdCBjaGFyICpfX25hbWVzWzEzXTsKK30gKl9fbG9jYWxlX3Q7CisKKy8qIFBPU0lYIDIwMDggbWFrZXMgbG9jYWxlX3Qgb2ZmaWNpYWwuICAqLwordHlwZWRlZiBfX2xvY2FsZV90IGxvY2FsZV90OworCisjZW5kaWYgLyogeGxvY2FsZS5oICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3pjb25mLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3pjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkOTU1MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvemNvbmYuaApAQCAtMCwwICsxLDM5NCBAQAorLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA3IEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNpZm5kZWYgWkNPTkZfSAorI2RlZmluZSBaQ09ORl9ICisKKy8qCisgKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCisgKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KKyAqIEV2ZW4gYmV0dGVyIHRoYW4gY29tcGlsaW5nIHdpdGggLURaX1BSRUZJWCB3b3VsZCBiZSB0byB1c2UgY29uZmlndXJlIHRvIHNldAorICogdGhpcyBwZXJtYW5lbnRseSBpbiB6Y29uZi5oIHVzaW5nICIuL2NvbmZpZ3VyZSAtLXpwcmVmaXgiLgorICovCisjaWZkZWYgWl9QUkVGSVggICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KKworLyogYWxsIGxpbmtlZCBzeW1ib2xzICovCisjICBkZWZpbmUgX2Rpc3RfY29kZSAgICAgICAgICAgIHpfX2Rpc3RfY29kZQorIyAgZGVmaW5lIF9sZW5ndGhfY29kZSAgICAgICAgICB6X19sZW5ndGhfY29kZQorIyAgZGVmaW5lIF90cl9hbGlnbiAgICAgICAgICAgICB6X190cl9hbGlnbgorIyAgZGVmaW5lIF90cl9mbHVzaF9ibG9jayAgICAgICB6X190cl9mbHVzaF9ibG9jaworIyAgZGVmaW5lIF90cl9pbml0ICAgICAgICAgICAgICB6X190cl9pbml0CisjICBkZWZpbmUgX3RyX3N0b3JlZF9ibG9jayAgICAgIHpfX3RyX3N0b3JlZF9ibG9jaworIyAgZGVmaW5lIF90cl90YWxseSAgICAgICAgICAgICB6X190cl90YWxseQorIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKKyMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmUgICAgICAgel9hZGxlcjMyX2NvbWJpbmUKKyMgIGRlZmluZSBjb21wcmVzcyAgICAgICAgICAgICAgel9jb21wcmVzcworIyAgZGVmaW5lIGNvbXByZXNzMiAgICAgICAgICAgICB6X2NvbXByZXNzMgorIyAgZGVmaW5lIGNvbXByZXNzQm91bmQgICAgICAgICB6X2NvbXByZXNzQm91bmQKKyMgIGRlZmluZSBjcmMzMiAgICAgICAgICAgICAgICAgel9jcmMzMgorIyAgZGVmaW5lIGNyYzMyX2NvbWJpbmUgICAgICAgICB6X2NyYzMyX2NvbWJpbmUKKyMgIGRlZmluZSBkZWZsYXRlICAgICAgICAgICAgICAgel9kZWZsYXRlCisjICBkZWZpbmUgZGVmbGF0ZUJvdW5kICAgICAgICAgIHpfZGVmbGF0ZUJvdW5kCisjICBkZWZpbmUgZGVmbGF0ZUNvcHkgICAgICAgICAgIHpfZGVmbGF0ZUNvcHkKKyMgIGRlZmluZSBkZWZsYXRlRW5kICAgICAgICAgICAgel9kZWZsYXRlRW5kCisjICBkZWZpbmUgZGVmbGF0ZUluaXQyXyAgICAgICAgIHpfZGVmbGF0ZUluaXQyXworIyAgZGVmaW5lIGRlZmxhdGVJbml0XyAgICAgICAgICB6X2RlZmxhdGVJbml0XworIyAgZGVmaW5lIGRlZmxhdGVQYXJhbXMgICAgICAgICB6X2RlZmxhdGVQYXJhbXMKKyMgIGRlZmluZSBkZWZsYXRlUHJpbWUgICAgICAgICAgel9kZWZsYXRlUHJpbWUKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXQgICAgICAgICAgel9kZWZsYXRlUmVzZXQKKyMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSAgel9kZWZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGRlZmxhdGVTZXRIZWFkZXIgICAgICB6X2RlZmxhdGVTZXRIZWFkZXIKKyMgIGRlZmluZSBkZWZsYXRlVHVuZSAgICAgICAgICAgel9kZWZsYXRlVHVuZQorIyAgZGVmaW5lIGRlZmxhdGVfY29weXJpZ2h0ICAgICB6X2RlZmxhdGVfY29weXJpZ2h0CisjICBkZWZpbmUgZ2V0X2NyY190YWJsZSAgICAgICAgIHpfZ2V0X2NyY190YWJsZQorIyAgZGVmaW5lIGd6Y2xlYXJlcnIgICAgICAgICAgICB6X2d6Y2xlYXJlcnIKKyMgIGRlZmluZSBnemNsb3NlICAgICAgICAgICAgICAgel9nemNsb3NlCisjICBkZWZpbmUgZ3pkaXJlY3QgICAgICAgICAgICAgIHpfZ3pkaXJlY3QKKyMgIGRlZmluZSBnemRvcGVuICAgICAgICAgICAgICAgel9nemRvcGVuCisjICBkZWZpbmUgZ3plb2YgICAgICAgICAgICAgICAgIHpfZ3plb2YKKyMgIGRlZmluZSBnemVycm9yICAgICAgICAgICAgICAgel9nemVycm9yCisjICBkZWZpbmUgZ3pmbHVzaCAgICAgICAgICAgICAgIHpfZ3pmbHVzaAorIyAgZGVmaW5lIGd6Z2V0YyAgICAgICAgICAgICAgICB6X2d6Z2V0YworIyAgZGVmaW5lIGd6Z2V0cyAgICAgICAgICAgICAgICB6X2d6Z2V0cworIyAgZGVmaW5lIGd6b3BlbiAgICAgICAgICAgICAgICB6X2d6b3BlbgorIyAgZGVmaW5lIGd6cHJpbnRmICAgICAgICAgICAgICB6X2d6cHJpbnRmCisjICBkZWZpbmUgZ3pwdXRjICAgICAgICAgICAgICAgIHpfZ3pwdXRjCisjICBkZWZpbmUgZ3pwdXRzICAgICAgICAgICAgICAgIHpfZ3pwdXRzCisjICBkZWZpbmUgZ3pyZWFkICAgICAgICAgICAgICAgIHpfZ3pyZWFkCisjICBkZWZpbmUgZ3pyZXdpbmQgICAgICAgICAgICAgIHpfZ3pyZXdpbmQKKyMgIGRlZmluZSBnenNlZWsgICAgICAgICAgICAgICAgel9nenNlZWsKKyMgIGRlZmluZSBnenNldHBhcmFtcyAgICAgICAgICAgel9nenNldHBhcmFtcworIyAgZGVmaW5lIGd6dGVsbCAgICAgICAgICAgICAgICB6X2d6dGVsbAorIyAgZGVmaW5lIGd6dW5nZXRjICAgICAgICAgICAgICB6X2d6dW5nZXRjCisjICBkZWZpbmUgZ3p3cml0ZSAgICAgICAgICAgICAgIHpfZ3p3cml0ZQorIyAgZGVmaW5lIGluZmxhdGUgICAgICAgICAgICAgICB6X2luZmxhdGUKKyMgIGRlZmluZSBpbmZsYXRlQmFjayAgICAgICAgICAgel9pbmZsYXRlQmFjaworIyAgZGVmaW5lIGluZmxhdGVCYWNrRW5kICAgICAgICB6X2luZmxhdGVCYWNrRW5kCisjICBkZWZpbmUgaW5mbGF0ZUJhY2tJbml0XyAgICAgIHpfaW5mbGF0ZUJhY2tJbml0XworIyAgZGVmaW5lIGluZmxhdGVDb3B5ICAgICAgICAgICB6X2luZmxhdGVDb3B5CisjICBkZWZpbmUgaW5mbGF0ZUVuZCAgICAgICAgICAgIHpfaW5mbGF0ZUVuZAorIyAgZGVmaW5lIGluZmxhdGVHZXRIZWFkZXIgICAgICB6X2luZmxhdGVHZXRIZWFkZXIKKyMgIGRlZmluZSBpbmZsYXRlSW5pdDJfICAgICAgICAgel9pbmZsYXRlSW5pdDJfCisjICBkZWZpbmUgaW5mbGF0ZUluaXRfICAgICAgICAgIHpfaW5mbGF0ZUluaXRfCisjICBkZWZpbmUgaW5mbGF0ZVByaW1lICAgICAgICAgIHpfaW5mbGF0ZVByaW1lCisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0ICAgICAgICAgIHpfaW5mbGF0ZVJlc2V0CisjICBkZWZpbmUgaW5mbGF0ZVNldERpY3Rpb25hcnkgIHpfaW5mbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBpbmZsYXRlU3luYyAgICAgICAgICAgel9pbmZsYXRlU3luYworIyAgZGVmaW5lIGluZmxhdGVTeW5jUG9pbnQgICAgICB6X2luZmxhdGVTeW5jUG9pbnQKKyMgIGRlZmluZSBpbmZsYXRlX2NvcHlyaWdodCAgICAgel9pbmZsYXRlX2NvcHlyaWdodAorIyAgZGVmaW5lIGluZmxhdGVfZmFzdCAgICAgICAgICB6X2luZmxhdGVfZmFzdAorIyAgZGVmaW5lIGluZmxhdGVfdGFibGUgICAgICAgICB6X2luZmxhdGVfdGFibGUKKyMgIGRlZmluZSB1bmNvbXByZXNzICAgICAgICAgICAgel91bmNvbXByZXNzCisjICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCisjICBkZWZpbmUgel9lcnJtc2cgICAgICAgICAgICAgIHpfel9lcnJtc2cKKyMgIGRlZmluZSB6Y2FsbG9jICAgICAgICAgICAgICAgel96Y2FsbG9jCisjICBkZWZpbmUgemNmcmVlICAgICAgICAgICAgICAgIHpfemNmcmVlCisjICBkZWZpbmUgemxpYkNvbXBpbGVGbGFncyAgICAgIHpfemxpYkNvbXBpbGVGbGFncworIyAgZGVmaW5lIHpsaWJWZXJzaW9uICAgICAgICAgICB6X3psaWJWZXJzaW9uCisKKy8qIGFsbCB6bGliIHR5cGVkZWZzIGluIHpsaWIuaCBhbmQgemNvbmYuaCAqLworIyAgZGVmaW5lIEJ5dGUgICAgICAgICAgICAgICAgICB6X0J5dGUKKyMgIGRlZmluZSBCeXRlZiAgICAgICAgICAgICAgICAgel9CeXRlZgorIyAgZGVmaW5lIGFsbG9jX2Z1bmMgICAgICAgICAgICB6X2FsbG9jX2Z1bmMKKyMgIGRlZmluZSBjaGFyZiAgICAgICAgICAgICAgICAgel9jaGFyZgorIyAgZGVmaW5lIGZyZWVfZnVuYyAgICAgICAgICAgICB6X2ZyZWVfZnVuYworIyAgZGVmaW5lIGd6RmlsZSAgICAgICAgICAgICAgICB6X2d6RmlsZQorIyAgZGVmaW5lIGd6X2hlYWRlciAgICAgICAgICAgICB6X2d6X2hlYWRlcgorIyAgZGVmaW5lIGd6X2hlYWRlcnAgICAgICAgICAgICB6X2d6X2hlYWRlcnAKKyMgIGRlZmluZSBpbl9mdW5jICAgICAgICAgICAgICAgel9pbl9mdW5jCisjICBkZWZpbmUgaW50ZiAgICAgICAgICAgICAgICAgIHpfaW50ZgorIyAgZGVmaW5lIG91dF9mdW5jICAgICAgICAgICAgICB6X291dF9mdW5jCisjICBkZWZpbmUgdUludCAgICAgICAgICAgICAgICAgIHpfdUludAorIyAgZGVmaW5lIHVJbnRmICAgICAgICAgICAgICAgICB6X3VJbnRmCisjICBkZWZpbmUgdUxvbmcgICAgICAgICAgICAgICAgIHpfdUxvbmcKKyMgIGRlZmluZSB1TG9uZ2YgICAgICAgICAgICAgICAgel91TG9uZ2YKKyMgIGRlZmluZSB2b2lkcCAgICAgICAgICAgICAgICAgel92b2lkcAorIyAgZGVmaW5lIHZvaWRwICAgICAgICAgICAgICAgICB6X3ZvaWRwCisjICBkZWZpbmUgdm9pZHBjICAgICAgICAgICAgICAgIHpfdm9pZHBjCisjICBkZWZpbmUgdm9pZHBjICAgICAgICAgICAgICAgIHpfdm9pZHBjCisjICBkZWZpbmUgdm9pZHBmICAgICAgICAgICAgICAgIHpfdm9pZHBmCisjICBkZWZpbmUgdm9pZHBmICAgICAgICAgICAgICAgIHpfdm9pZHBmCisjICBkZWZpbmUgel9zdHJlYW0gICAgICAgICAgICAgIHpfel9zdHJlYW0KKyMgIGRlZmluZSB6X3N0cmVhbXAgICAgICAgICAgICAgel96X3N0cmVhbXAKKworLyogYWxsIHpsaWIgc3RydWN0cyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KKyMgIGRlZmluZSBnel9oZWFkZXJfcyAgICAgICAgICAgel9nel9oZWFkZXJfcworIyAgZGVmaW5lIGludGVybmFsX3N0YXRlICAgICAgICB6X2ludGVybmFsX3N0YXRlCisjICBkZWZpbmUgel9zdHJlYW1fcyAgICAgICAgICAgIHpfel9zdHJlYW1fcworCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiAhZGVmaW5lZChNU0RPUykKKyMgIGRlZmluZSBNU0RPUworI2VuZGlmCisjaWYgKGRlZmluZWQoT1NfMikgfHwgZGVmaW5lZChfX09TMl9fKSkgJiYgIWRlZmluZWQoT1MyKQorIyAgZGVmaW5lIE9TMgorI2VuZGlmCisjaWYgZGVmaW5lZChfV0lORE9XUykgJiYgIWRlZmluZWQoV0lORE9XUykKKyMgIGRlZmluZSBXSU5ET1dTCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKKyMgIGlmbmRlZiBXSU4zMgorIyAgICBkZWZpbmUgV0lOMzIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lORE9XUykpICYmICFkZWZpbmVkKFdJTjMyKQorIyAgaWYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSAmJiAhZGVmaW5lZChfXzM4Nl9fKQorIyAgICBpZm5kZWYgU1lTMTZCSVQKKyMgICAgICBkZWZpbmUgU1lTMTZCSVQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIENvbXBpbGUgd2l0aCAtRE1BWFNFR182NEsgaWYgdGhlIGFsbG9jIGZ1bmN0aW9uIGNhbm5vdCBhbGxvY2F0ZSBtb3JlCisgKiB0aGFuIDY0ayBieXRlcyBhdCBhIHRpbWUgKG5lZWRlZCBvbiBzeXN0ZW1zIHdpdGggMTYtYml0IGludCkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgZGVmaW5lIE1BWFNFR182NEsKKyNlbmRpZgorI2lmZGVmIE1TRE9TCisjICBkZWZpbmUgVU5BTElHTkVEX09LCisjZW5kaWYKKworI2lmZGVmIF9fU1REQ19WRVJTSU9OX18KKyMgIGlmbmRlZiBTVERDCisjICAgIGRlZmluZSBTVERDCisjICBlbmRpZgorIyAgaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgIGlmbmRlZiBTVERDOTkKKyMgICAgICBkZWZpbmUgU1REQzk5CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKF9fSE9TX0FJWF9fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKSAmJiAhZGVmaW5lZChTVERDKSAgICAvKiBpU2VyaWVzIChmb3JtZXJseSBBUy80MDApLiAqLworIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWZuZGVmIFNUREMKKyMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KKyMgICAgZGVmaW5lIGNvbnN0ICAgICAgIC8qIG5vdGU6IG5lZWQgYSBtb3JlIGdlbnRsZSBzb2x1dGlvbiBoZXJlICovCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKXx8ZGVmaW5lZChhcHBsZWMpfHxkZWZpbmVkKFRISU5LX0MpfHxkZWZpbmVkKF9fU0NfXykKKyMgIGRlZmluZSBOT19EVU1NWV9ERUNMCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovCisjaWZuZGVmIE1BWF9NRU1fTEVWRUwKKyMgIGlmZGVmIE1BWFNFR182NEsKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOAorIyAgZWxzZQorIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA5CisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIuCisgKiBXQVJOSU5HOiByZWR1Y2luZyBNQVhfV0JJVFMgbWFrZXMgbWluaWd6aXAgdW5hYmxlIHRvIGV4dHJhY3QgLmd6IGZpbGVzCisgKiBjcmVhdGVkIGJ5IGd6aXAuIChGaWxlcyBjcmVhdGVkIGJ5IG1pbmlnemlwIGNhbiBzdGlsbCBiZSBleHRyYWN0ZWQgYnkKKyAqIGd6aXAuKQorICovCisjaWZuZGVmIE1BWF9XQklUUworIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLworI2VuZGlmCisKKy8qIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgorICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKKyB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKKyBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQorIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAorICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCisgT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KKworICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCisgdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcworIGZvciBzbWFsbCBvYmplY3RzLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjICBpZmRlZiBTVERDCisjICAgIGRlZmluZSBPRihhcmdzKSAgYXJncworIyAgZWxzZQorIyAgICBkZWZpbmUgT0YoYXJncykgICgpCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIEZBUiBhcmUgbmVlZGVkIG9ubHkgZm9yIE1TRE9TIG1peGVkCisgKiBtb2RlbCBwcm9ncmFtbWluZyAoc21hbGwgb3IgbWVkaXVtIG1vZGVsIHdpdGggc29tZSBmYXIgYWxsb2NhdGlvbnMpLgorICogVGhpcyB3YXMgdGVzdGVkIG9ubHkgd2l0aCBNU0M7IGZvciBvdGhlciBNU0RPUyBjb21waWxlcnMgeW91IG1heSBoYXZlCisgKiB0byBkZWZpbmUgTk9fTUVNQ1BZIGluIHp1dGlsLmguICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgbWl4ZWQgbW9kZWwsCisgKiBqdXN0IGRlZmluZSBGQVIgdG8gYmUgZW1wdHkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgaWYgZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKE1fSTg2TU0pCisgICAgIC8qIE1TQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfTVNDX1ZFUgorIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAoZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoX19NRURJVU1fXykpCisgICAgIC8qIFR1cmJvIEMgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX19CT1JMQU5EQ19fCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKQorICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiBhcyBhIERMTCwgZGVmaW5lIFpMSUJfRExMLgorICAgICogVGhpcyBpcyBub3QgbWFuZGF0b3J5LCBidXQgaXQgb2ZmZXJzIGEgbGl0dGxlIHBlcmZvcm1hbmNlIGluY3JlYXNlLgorICAgICovCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZiBkZWZpbmVkKFdJTjMyKSAmJiAoIWRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTAwKSkKKyMgICAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZiAgLyogWkxJQl9ETEwgKi8KKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgd2l0aCB0aGUgV0lOQVBJL1dJTkFQSVYgY2FsbGluZyBjb252ZW50aW9uLAorICAgICogZGVmaW5lIFpMSUJfV0lOQVBJLgorICAgICogQ2F1dGlvbjogdGhlIHN0YW5kYXJkIFpMSUIxLkRMTCBpcyBOT1QgY29tcGlsZWQgdXNpbmcgWkxJQl9XSU5BUEkuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfV0lOQVBJCisjICAgIGlmZGVmIEZBUgorIyAgICAgIHVuZGVmIEZBUgorIyAgICBlbmRpZgorIyAgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisgICAgIC8qIE5vIG5lZWQgZm9yIF9leHBvcnQsIHVzZSBaTElCLkRFRiBpbnN0ZWFkLiAqLworICAgICAvKiBGb3IgY29tcGxldGUgV2luZG93cyBjb21wYXRpYmlsaXR5LCB1c2UgV0lOQVBJLCBub3QgX19zdGRjYWxsLiAqLworIyAgICBkZWZpbmUgWkVYUE9SVCBXSU5BUEkKKyMgICAgaWZkZWYgV0lOMzIKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgRkFSIENERUNMCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0JFT1NfXykKKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1ZJU0lCSUxJVFlfUFJBR01BCisjICBkZWZpbmUgWkVYVEVSTiBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkgZXh0ZXJuCisjZW5kaWYKKworI2lmbmRlZiBaRVhURVJOCisjICBkZWZpbmUgWkVYVEVSTiBleHRlcm4KKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUCisjICBkZWZpbmUgWkVYUE9SVAorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlRWQQorIyAgZGVmaW5lIFpFWFBPUlRWQQorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjICBkZWZpbmUgRkFSCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fTUFDVFlQRVNfXykKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLworCisjaWZkZWYgU01BTExfTUVESVVNCisgICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLworIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCisjZWxzZQorICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7CisjZW5kaWYKK3R5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwordHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKK3R5cGVkZWYgdUludCAgRkFSIHVJbnRmOwordHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOworCisjaWZkZWYgU1REQworICAgdHlwZWRlZiB2b2lkIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIHZvaWQgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgdm9pZCAgICAgICAqdm9pZHA7CisjZWxzZQorICAgdHlwZWRlZiBCeXRlIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIEJ5dGUgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgQnl0ZSAgICAgICAqdm9pZHA7CisjZW5kaWYKKworI2luY2x1ZGUgInpsaWJkZWZzLmgiICAgICAgIC8qIGNyZWF0ZWQgYnkgY29uZmlndXJlICovCisKKyNpZmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCisjICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaWZuZGVmIFNFRUtfU0VUCisjICBkZWZpbmUgU0VFS19TRVQgICAgICAgIDAgICAgICAgLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyMgIGRlZmluZSBTRUVLX0NVUiAgICAgICAgMSAgICAgICAvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjICBkZWZpbmUgU0VFS19FTkQgICAgICAgIDIgICAgICAgLyogU2V0IGZpbGUgcG9pbnRlciB0byBFT0YgcGx1cyAib2Zmc2V0IiAqLworI2VuZGlmCisjaWZuZGVmIHpfb2ZmX3QKKyMgIGRlZmluZSB6X29mZl90IGxvbmcKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09TNDAwX18pCisjICBkZWZpbmUgTk9fdnNucHJpbnRmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NVlNfXykKKyMgIGRlZmluZSBOT192c25wcmludGYKKyNlbmRpZgorCisvKiBNVlMgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgZXh0ZXJuYWwgbmFtZXMgbGFyZ2VyIHRoYW4gOCBieXRlcyAqLworI2lmIGRlZmluZWQoX19NVlNfXykKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVJbml0XywiREVJTiIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdDJfLCJERUlOMiIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlRW5kLCJERUVORCIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlQm91bmQsIkRFQk5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVJbml0XywiSU5JTiIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdDJfLCJJTklOMiIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlRW5kLCJJTkVORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlU3luYywiSU5TWSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlU2V0RGljdGlvbmFyeSwiSU5TRURJIikKKyMgICBwcmFnbWEgbWFwKGNvbXByZXNzQm91bmQsIkNNQk5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfdGFibGUsIklOVEFCTCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2Zhc3QsIklORkEiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9jb3B5cmlnaHQsIklOQ09QWSIpCisjZW5kaWYKKworI2VuZGlmIC8qIFpDT05GX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvemxpYi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS96bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3ZDYwNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2luY2x1ZGUvemxpYi5oCkBAIC0wLDAgKzEsMTQ4OCBAQAorLyogemxpYi5oIC0tIGludGVyZmFjZSBvZiB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgIHZlcnNpb24gMS4yLjMuNCwgRGVjZW1iZXIgMjFzdCwgMjAwOQorCisgIENvcHlyaWdodCAoQykgMTk5NS0yMDA5IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgorICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKKworICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvcgorICBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dAorICAoemxpYiBmb3JtYXQpLCByZmMxOTUxLnR4dCAoZGVmbGF0ZSBmb3JtYXQpIGFuZCByZmMxOTUyLnR4dCAoZ3ppcCBmb3JtYXQpLgorKi8KKworI2lmbmRlZiBaTElCX0gKKyNkZWZpbmUgWkxJQl9ICisKKyNpbmNsdWRlICJ6Y29uZi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjIuMy40IgorI2RlZmluZSBaTElCX1ZFUk5VTSAweDEyMzQKKyNkZWZpbmUgWkxJQl9WRVJfTUFKT1IgMQorI2RlZmluZSBaTElCX1ZFUl9NSU5PUiAyCisjZGVmaW5lIFpMSUJfVkVSX1JFVklTSU9OIDMKKworLyoKKyAgICAgVGhlICd6bGliJyBjb21wcmVzc2lvbiBsaWJyYXJ5IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQKKyAgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQKKyAgZGF0YS4gIFRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBzdXBwb3J0cyBvbmx5IG9uZSBjb21wcmVzc2lvbiBtZXRob2QKKyAgKGRlZmxhdGlvbikgYnV0IG90aGVyIGFsZ29yaXRobXMgd2lsbCBiZSBhZGRlZCBsYXRlciBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lCisgIHN0cmVhbSBpbnRlcmZhY2UuCisKKyAgICAgQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcCBpZiB0aGUgYnVmZmVycyBhcmUgbGFyZ2UKKyAgZW5vdWdoIChmb3IgZXhhbXBsZSBpZiBhbiBpbnB1dCBmaWxlIGlzIG1tYXAnZWQpLCBvciBjYW4gYmUgZG9uZSBieQorICByZXBlYXRlZCBjYWxscyBvZiB0aGUgY29tcHJlc3Npb24gZnVuY3Rpb24uICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZQorICBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0CisgIChwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCisKKyAgICAgVGhlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgdXNlZCBieSBkZWZhdWx0IGJ5IHRoZSBpbi1tZW1vcnkgZnVuY3Rpb25zIGlzCisgIHRoZSB6bGliIGZvcm1hdCwgd2hpY2ggaXMgYSB6bGliIHdyYXBwZXIgZG9jdW1lbnRlZCBpbiBSRkMgMTk1MCwgd3JhcHBlZAorICBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbSwgd2hpY2ggaXMgaXRzZWxmIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTEuCisKKyAgICAgVGhlIGxpYnJhcnkgYWxzbyBzdXBwb3J0cyByZWFkaW5nIGFuZCB3cml0aW5nIGZpbGVzIGluIGd6aXAgKC5neikgZm9ybWF0CisgIHdpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpbyB1c2luZyB0aGUgZnVuY3Rpb25zIHRoYXQgc3RhcnQKKyAgd2l0aCAiZ3oiLiAgVGhlIGd6aXAgZm9ybWF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSB6bGliIGZvcm1hdC4gIGd6aXAgaXMgYQorICBnemlwIHdyYXBwZXIsIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTIsIHdyYXBwZWQgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0uCisKKyAgICAgVGhpcyBsaWJyYXJ5IGNhbiBvcHRpb25hbGx5IHJlYWQgYW5kIHdyaXRlIGd6aXAgc3RyZWFtcyBpbiBtZW1vcnkgYXMgd2VsbC4KKworICAgICBUaGUgemxpYiBmb3JtYXQgd2FzIGRlc2lnbmVkIHRvIGJlIGNvbXBhY3QgYW5kIGZhc3QgZm9yIHVzZSBpbiBtZW1vcnkKKyAgYW5kIG9uIGNvbW11bmljYXRpb25zIGNoYW5uZWxzLiAgVGhlIGd6aXAgZm9ybWF0IHdhcyBkZXNpZ25lZCBmb3Igc2luZ2xlLQorICBmaWxlIGNvbXByZXNzaW9uIG9uIGZpbGUgc3lzdGVtcywgaGFzIGEgbGFyZ2VyIGhlYWRlciB0aGFuIHpsaWIgdG8gbWFpbnRhaW4KKyAgZGlyZWN0b3J5IGluZm9ybWF0aW9uLCBhbmQgdXNlcyBhIGRpZmZlcmVudCwgc2xvd2VyIGNoZWNrIG1ldGhvZCB0aGFuIHpsaWIuCisKKyAgICAgVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuIFRoZSBkZWNvZGVyIGNoZWNrcworICB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyCisgIGNyYXNoIGV2ZW4gaW4gY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCisqLworCit0eXBlZGVmIHZvaWRwZiAoKmFsbG9jX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB1SW50IGl0ZW1zLCB1SW50IHNpemUpKTsKK3R5cGVkZWYgdm9pZCAgICgqZnJlZV9mdW5jKSAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBhZGRyZXNzKSk7CisKK3N0cnVjdCBpbnRlcm5hbF9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3Qgel9zdHJlYW1fcyB7CisgICAgQnl0ZWYgICAgKm5leHRfaW47ICAvKiBuZXh0IGlucHV0IGJ5dGUgKi8KKyAgICB1SW50ICAgICBhdmFpbF9pbjsgIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgbmV4dF9pbiAqLworICAgIHVMb25nICAgIHRvdGFsX2luOyAgLyogdG90YWwgbmIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi8KKworICAgIEJ5dGVmICAgICpuZXh0X291dDsgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovCisgICAgdUludCAgICAgYXZhaWxfb3V0OyAvKiByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBuZXh0X291dCAqLworICAgIHVMb25nICAgIHRvdGFsX291dDsgLyogdG90YWwgbmIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqLworCisgICAgY2hhciAgICAgKm1zZzsgICAgICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi8KKyAgICBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICpzdGF0ZTsgLyogbm90IHZpc2libGUgYnkgYXBwbGljYXRpb25zICovCisKKyAgICBhbGxvY19mdW5jIHphbGxvYzsgIC8qIHVzZWQgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIHN0YXRlICovCisgICAgZnJlZV9mdW5jICB6ZnJlZTsgICAvKiB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIHN0YXRlICovCisgICAgdm9pZHBmICAgICBvcGFxdWU7ICAvKiBwcml2YXRlIGRhdGEgb2JqZWN0IHBhc3NlZCB0byB6YWxsb2MgYW5kIHpmcmVlICovCisKKyAgICBpbnQgICAgIGRhdGFfdHlwZTsgIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi8KKyAgICB1TG9uZyAgIGFkbGVyOyAgICAgIC8qIGFkbGVyMzIgdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgdUxvbmcgICByZXNlcnZlZDsgICAvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworfSB6X3N0cmVhbTsKKwordHlwZWRlZiB6X3N0cmVhbSBGQVIgKnpfc3RyZWFtcDsKKworLyoKKyAgICAgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gcGFzc2VkIHRvIGFuZCBmcm9tIHpsaWIgcm91dGluZXMuICBTZWUgUkZDIDE5NTIKKyAgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgbWVhbmluZ3Mgb2YgdGhlc2UgZmllbGRzLgorKi8KK3R5cGVkZWYgc3RydWN0IGd6X2hlYWRlcl9zIHsKKyAgICBpbnQgICAgIHRleHQ7ICAgICAgIC8qIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHQgKi8KKyAgICB1TG9uZyAgIHRpbWU7ICAgICAgIC8qIG1vZGlmaWNhdGlvbiB0aW1lICovCisgICAgaW50ICAgICB4ZmxhZ3M7ICAgICAvKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqLworICAgIGludCAgICAgb3M7ICAgICAgICAgLyogb3BlcmF0aW5nIHN5c3RlbSAqLworICAgIEJ5dGVmICAgKmV4dHJhOyAgICAgLyogcG9pbnRlciB0byBleHRyYSBmaWVsZCBvciBaX05VTEwgaWYgbm9uZSAqLworICAgIHVJbnQgICAgZXh0cmFfbGVuOyAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICh2YWxpZCBpZiBleHRyYSAhPSBaX05VTEwpICovCisgICAgdUludCAgICBleHRyYV9tYXg7ICAvKiBzcGFjZSBhdCBleHRyYSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqLworICAgIEJ5dGVmICAgKm5hbWU7ICAgICAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgZmlsZSBuYW1lIG9yIFpfTlVMTCAqLworICAgIHVJbnQgICAgbmFtZV9tYXg7ICAgLyogc3BhY2UgYXQgbmFtZSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqLworICAgIEJ5dGVmICAgKmNvbW1lbnQ7ICAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKi8KKyAgICB1SW50ICAgIGNvbW1fbWF4OyAgIC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKyAgICBpbnQgICAgIGhjcmM7ICAgICAgIC8qIHRydWUgaWYgdGhlcmUgd2FzIG9yIHdpbGwgYmUgYSBoZWFkZXIgY3JjICovCisgICAgaW50ICAgICBkb25lOyAgICAgICAvKiB0cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyIChub3QgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqLworfSBnel9oZWFkZXI7CisKK3R5cGVkZWYgZ3pfaGVhZGVyIEZBUiAqZ3pfaGVhZGVycDsKKworLyoKKyAgIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbiB3aGVuIGF2YWlsX2luIGhhcworICAgZHJvcHBlZCB0byB6ZXJvLiBJdCBtdXN0IHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0IHdoZW4gYXZhaWxfb3V0CisgICBoYXMgZHJvcHBlZCB0byB6ZXJvLiBUaGUgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXplIHphbGxvYywgemZyZWUgYW5kCisgICBvcGFxdWUgYmVmb3JlIGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24uIEFsbCBvdGhlciBmaWVsZHMgYXJlIHNldCBieSB0aGUKKyAgIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIG11c3Qgbm90IGJlIHVwZGF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorCisgICBUaGUgb3BhcXVlIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QKKyAgIHBhcmFtZXRlciBmb3IgY2FsbHMgb2YgemFsbG9jIGFuZCB6ZnJlZS4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjdXN0b20KKyAgIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGUgY29tcHJlc3Npb24gbGlicmFyeSBhdHRhY2hlcyBubyBtZWFuaW5nIHRvIHRoZQorICAgb3BhcXVlIHZhbHVlLgorCisgICB6YWxsb2MgbXVzdCByZXR1cm4gWl9OVUxMIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb2JqZWN0LgorICAgSWYgemxpYiBpcyB1c2VkIGluIGEgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb24sIHphbGxvYyBhbmQgemZyZWUgbXVzdCBiZQorICAgdGhyZWFkIHNhZmUuCisKKyAgIE9uIDE2LWJpdCBzeXN0ZW1zLCB0aGUgZnVuY3Rpb25zIHphbGxvYyBhbmQgemZyZWUgbXVzdCBiZSBhYmxlIHRvIGFsbG9jYXRlCisgICBleGFjdGx5IDY1NTM2IGJ5dGVzLCBidXQgd2lsbCBub3QgYmUgcmVxdWlyZWQgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIHRoaXMKKyAgIGlmIHRoZSBzeW1ib2wgTUFYU0VHXzY0SyBpcyBkZWZpbmVkIChzZWUgemNvbmYuaCkuIFdBUk5JTkc6IE9uIE1TRE9TLAorICAgcG9pbnRlcnMgcmV0dXJuZWQgYnkgemFsbG9jIGZvciBvYmplY3RzIG9mIGV4YWN0bHkgNjU1MzYgYnl0ZXMgKm11c3QqCisgICBoYXZlIHRoZWlyIG9mZnNldCBub3JtYWxpemVkIHRvIHplcm8uIFRoZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb24KKyAgIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeSBlbnN1cmVzIHRoaXMgKHNlZSB6dXRpbC5jKS4gVG8gcmVkdWNlIG1lbW9yeQorICAgcmVxdWlyZW1lbnRzIGFuZCBhdm9pZCBhbnkgYWxsb2NhdGlvbiBvZiA2NEsgb2JqZWN0cywgYXQgdGhlIGV4cGVuc2Ugb2YKKyAgIGNvbXByZXNzaW9uIHJhdGlvLCBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggLURNQVhfV0JJVFM9MTQgKHNlZSB6Y29uZi5oKS4KKworICAgVGhlIGZpZWxkcyB0b3RhbF9pbiBhbmQgdG90YWxfb3V0IGNhbiBiZSB1c2VkIGZvciBzdGF0aXN0aWNzIG9yCisgICBwcm9ncmVzcyByZXBvcnRzLiBBZnRlciBjb21wcmVzc2lvbiwgdG90YWxfaW4gaG9sZHMgdGhlIHRvdGFsIHNpemUgb2YKKyAgIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhbmQgbWF5IGJlIHNhdmVkIGZvciB1c2UgaW4gdGhlIGRlY29tcHJlc3NvcgorICAgKHBhcnRpY3VsYXJseSBpZiB0aGUgZGVjb21wcmVzc29yIHdhbnRzIHRvIGRlY29tcHJlc3MgZXZlcnl0aGluZyBpbgorICAgYSBzaW5nbGUgc3RlcCkuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25zdGFudHMgKi8KKworI2RlZmluZSBaX05PX0ZMVVNIICAgICAgMAorI2RlZmluZSBaX1BBUlRJQUxfRkxVU0ggMQorI2RlZmluZSBaX1NZTkNfRkxVU0ggICAgMgorI2RlZmluZSBaX0ZVTExfRkxVU0ggICAgMworI2RlZmluZSBaX0ZJTklTSCAgICAgICAgNAorI2RlZmluZSBaX0JMT0NLICAgICAgICAgNQorI2RlZmluZSBaX1RSRUVTICAgICAgICAgNgorLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqLworCisjZGVmaW5lIFpfT0sgICAgICAgICAgICAwCisjZGVmaW5lIFpfU1RSRUFNX0VORCAgICAxCisjZGVmaW5lIFpfTkVFRF9ESUNUICAgICAyCisjZGVmaW5lIFpfRVJSTk8gICAgICAgICgtMSkKKyNkZWZpbmUgWl9TVFJFQU1fRVJST1IgKC0yKQorI2RlZmluZSBaX0RBVEFfRVJST1IgICAoLTMpCisjZGVmaW5lIFpfTUVNX0VSUk9SICAgICgtNCkKKyNkZWZpbmUgWl9CVUZfRVJST1IgICAgKC01KQorI2RlZmluZSBaX1ZFUlNJT05fRVJST1IgKC02KQorLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlCisgKiB2YWx1ZXMgYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLgorICovCisKKyNkZWZpbmUgWl9OT19DT01QUkVTU0lPTiAgICAgICAgIDAKKyNkZWZpbmUgWl9CRVNUX1NQRUVEICAgICAgICAgICAgIDEKKyNkZWZpbmUgWl9CRVNUX0NPTVBSRVNTSU9OICAgICAgIDkKKyNkZWZpbmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OICAoLTEpCisvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi8KKworI2RlZmluZSBaX0ZJTFRFUkVEICAgICAgICAgICAgMQorI2RlZmluZSBaX0hVRkZNQU5fT05MWSAgICAgICAgMgorI2RlZmluZSBaX1JMRSAgICAgICAgICAgICAgICAgMworI2RlZmluZSBaX0ZJWEVEICAgICAgICAgICAgICAgNAorI2RlZmluZSBaX0RFRkFVTFRfU1RSQVRFR1kgICAgMAorLyogY29tcHJlc3Npb24gc3RyYXRlZ3k7IHNlZSBkZWZsYXRlSW5pdDIoKSBiZWxvdyBmb3IgZGV0YWlscyAqLworCisjZGVmaW5lIFpfQklOQVJZICAgMAorI2RlZmluZSBaX1RFWFQgICAgIDEKKyNkZWZpbmUgWl9BU0NJSSAgICBaX1RFWFQgICAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDEuMi4yIGFuZCBlYXJsaWVyICovCisjZGVmaW5lIFpfVU5LTk9XTiAgMgorLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqLworCisjZGVmaW5lIFpfREVGTEFURUQgICA4CisvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKHRoZSBvbmx5IG9uZSBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uKSAqLworCisjZGVmaW5lIFpfTlVMTCAgMCAgLyogZm9yIGluaXRpYWxpemluZyB6YWxsb2MsIHpmcmVlLCBvcGFxdWUgKi8KKworI2RlZmluZSB6bGliX3ZlcnNpb24gemxpYlZlcnNpb24oKQorLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucyA8IDEuMC4yICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2ljIGZ1bmN0aW9ucyAqLworCitaRVhURVJOIGNvbnN0IGNoYXIgKiBaRVhQT1JUIHpsaWJWZXJzaW9uIE9GKCh2b2lkKSk7CisvKiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbXBhcmUgemxpYlZlcnNpb24gYW5kIFpMSUJfVkVSU0lPTiBmb3IgY29uc2lzdGVuY3kuCisgICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGRpZmZlcnMsIHRoZSBsaWJyYXJ5IGNvZGUgYWN0dWFsbHkgdXNlZCBpcworICAgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgemxpYi5oIGhlYWRlciBmaWxlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgVGhpcyBjaGVjayBpcyBhdXRvbWF0aWNhbGx5IG1hZGUgYnkgZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0LgorICovCisKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0IE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGxldmVsKSk7CisKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgY29tcHJlc3Npb24uIFRoZSBmaWVsZHMKKyAgIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieSB0aGUgY2FsbGVyLgorICAgSWYgemFsbG9jIGFuZCB6ZnJlZSBhcmUgc2V0IHRvIFpfTlVMTCwgZGVmbGF0ZUluaXQgdXBkYXRlcyB0aGVtIHRvCisgICB1c2UgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKworICAgICBUaGUgY29tcHJlc3Npb24gbGV2ZWwgbXVzdCBiZSBaX0RFRkFVTFRfQ09NUFJFU1NJT04sIG9yIGJldHdlZW4gMCBhbmQgOToKKyAgIDEgZ2l2ZXMgYmVzdCBzcGVlZCwgOSBnaXZlcyBiZXN0IGNvbXByZXNzaW9uLCAwIGdpdmVzIG5vIGNvbXByZXNzaW9uIGF0CisgICBhbGwgKHRoZSBpbnB1dCBkYXRhIGlzIHNpbXBseSBjb3BpZWQgYSBibG9jayBhdCBhIHRpbWUpLgorICAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OIHJlcXVlc3RzIGEgZGVmYXVsdCBjb21wcm9taXNlIGJldHdlZW4gc3BlZWQgYW5kCisgICBjb21wcmVzc2lvbiAoY3VycmVudGx5IGVxdWl2YWxlbnQgdG8gbGV2ZWwgNikuCisKKyAgICAgZGVmbGF0ZUluaXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGxldmVsIGlzIG5vdCBhIHZhbGlkIGNvbXByZXNzaW9uIGxldmVsLAorICAgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiAoemxpYl92ZXJzaW9uKSBpcyBpbmNvbXBhdGlibGUKKyAgIHdpdGggdGhlIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyIChaTElCX1ZFUlNJT04pLgorICAgbXNnIGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBkZWZsYXRlSW5pdCBkb2VzIG5vdAorICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKSk7CisvKgorICAgIGRlZmxhdGUgY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAorICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBpbnRyb2R1Y2Ugc29tZQorICBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgorICBmb3JjZWQgdG8gZmx1c2guCisKKyAgICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiBkZWZsYXRlIHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQorICBmb2xsb3dpbmcgYWN0aW9uczoKKworICAtIENvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgbmV4dF9pbiBhbmQgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luCisgICAgYWNjb3JkaW5nbHkuIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKKyAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIG5leHRfaW4gYW5kIGF2YWlsX2luIGFyZSB1cGRhdGVkIGFuZAorICAgIHByb2Nlc3Npbmcgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBkZWZsYXRlKCkuCisKKyAgLSBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IG5leHRfb3V0IGFuZCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dAorICAgIGFjY29yZGluZ2x5LiBUaGlzIGFjdGlvbiBpcyBmb3JjZWQgaWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBub24gemVyby4KKyAgICBGb3JjaW5nIGZsdXNoIGZyZXF1ZW50bHkgZGVncmFkZXMgdGhlIGNvbXByZXNzaW9uIHJhdGlvLCBzbyB0aGlzIHBhcmFtZXRlcgorICAgIHNob3VsZCBiZSBzZXQgb25seSB3aGVuIG5lY2Vzc2FyeSAoaW4gaW50ZXJhY3RpdmUgYXBwbGljYXRpb25zKS4KKyAgICBTb21lIG91dHB1dCBtYXkgYmUgcHJvdmlkZWQgZXZlbiBpZiBmbHVzaCBpcyBub3Qgc2V0LgorCisgIEJlZm9yZSB0aGUgY2FsbCBvZiBkZWZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKKyAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nCisgIG1vcmUgb3V0cHV0LCBhbmQgdXBkYXRpbmcgYXZhaWxfaW4gb3IgYXZhaWxfb3V0IGFjY29yZGluZ2x5OyBhdmFpbF9vdXQKKyAgc2hvdWxkIG5ldmVyIGJlIHplcm8gYmVmb3JlIHRoZSBjYWxsLiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlCisgIGNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvciBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbAorICAoYXZhaWxfb3V0ID09IDApLCBvciBhZnRlciBlYWNoIGNhbGwgb2YgZGVmbGF0ZSgpLiBJZiBkZWZsYXRlIHJldHVybnMgWl9PSworICBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlCisgIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgorCisgICAgTm9ybWFsbHkgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9OT19GTFVTSCwgd2hpY2ggYWxsb3dzIGRlZmxhdGUgdG8KKyAgZGVjaWRlIGhvdyBtdWNoIGRhdGEgdG8gYWNjdW11bGF0ZSBiZWZvcmUgcHJvZHVjaW5nIG91dHB1dCwgaW4gb3JkZXIgdG8KKyAgbWF4aW1pemUgY29tcHJlc3Npb24uCisKKyAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX1NZTkNfRkxVU0gsIGFsbCBwZW5kaW5nIG91dHB1dCBpcworICBmbHVzaGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCB0aGUgb3V0cHV0IGlzIGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5LCBzbworICB0aGF0IHRoZSBkZWNvbXByZXNzb3IgY2FuIGdldCBhbGwgaW5wdXQgZGF0YSBhdmFpbGFibGUgc28gZmFyLiAoSW4gcGFydGljdWxhcgorICBhdmFpbF9pbiBpcyB6ZXJvIGFmdGVyIHRoZSBjYWxsIGlmIGVub3VnaCBvdXRwdXQgc3BhY2UgaGFzIGJlZW4gcHJvdmlkZWQKKyAgYmVmb3JlIHRoZSBjYWxsLikgIEZsdXNoaW5nIG1heSBkZWdyYWRlIGNvbXByZXNzaW9uIGZvciBzb21lIGNvbXByZXNzaW9uCisgIGFsZ29yaXRobXMgYW5kIHNvIGl0IHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBuZWNlc3NhcnkuICBUaGlzIGNvbXBsZXRlcyB0aGUKKyAgY3VycmVudCBkZWZsYXRlIGJsb2NrIGFuZCBmb2xsb3dzIGl0IHdpdGggYW4gZW1wdHkgc3RvcmVkIGJsb2NrIHRoYXQgaXMgdGhyZWUKKyAgYml0cyBwbHVzIGZpbGxlciBiaXRzIHRvIHRoZSBuZXh0IGJ5dGUsIGZvbGxvd2VkIGJ5IGZvdXIgYnl0ZXMgKDAwIDAwIGZmIGZmKS4KKworICAgIElmIGZsdXNoIGlzIHNldCB0byBaX1BBUlRJQUxfRkxVU0gsIGFsbCBwZW5kaW5nIG91dHB1dCBpcyBmbHVzaGVkIHRvIHRoZQorICBvdXRwdXQgYnVmZmVyLCBidXQgdGhlIG91dHB1dCBpcyBub3QgYWxpZ25lZCB0byBhIGJ5dGUgYm91bmRhcnkuICBBbGwgb2YgdGhlCisgIGlucHV0IGRhdGEgc28gZmFyIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHRoZSBkZWNvbXByZXNzb3IsIGFzIGZvciBaX1NZTkNfRkxVU0guCisgIFRoaXMgY29tcGxldGVzIHRoZSBjdXJyZW50IGRlZmxhdGUgYmxvY2sgYW5kIGZvbGxvd3MgaXQgd2l0aCBhbiBlbXB0eSBmaXhlZAorICBjb2RlcyBibG9jayB0aGF0IGlzIDEwIGJpdHMgbG9uZy4gIFRoaXMgYXNzdXJlcyB0aGF0IGVub3VnaCBieXRlcyBhcmUgb3V0cHV0CisgIGluIG9yZGVyIGZvciB0aGUgZGVjb21wcmVzc29yIHRvIGZpbmlzaCB0aGUgYmxvY2sgYmVmb3JlIHRoZSBlbXB0eSBmaXhlZCBjb2RlCisgIGJsb2NrLgorCisgICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfQkxPQ0ssIGEgZGVmbGF0ZSBibG9jayBpcyBjb21wbGV0ZWQgYW5kIGVtaXR0ZWQsIGFzCisgIGZvciBaX1NZTkNfRkxVU0gsIGJ1dCB0aGUgb3V0cHV0IGlzIG5vdCBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgYW5kIHVwIHRvCisgIHNldmVuIGJpdHMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgYXJlIGhlbGQgdG8gYmUgd3JpdHRlbiBhcyB0aGUgbmV4dCBieXRlIGFmdGVyCisgIHRoZSBuZXh0IGRlZmxhdGUgYmxvY2sgaXMgY29tcGxldGVkLiAgSW4gdGhpcyBjYXNlLCB0aGUgZGVjb21wcmVzc29yIG1heSBub3QKKyAgYmUgcHJvdmlkZWQgZW5vdWdoIGJpdHMgYXQgdGhpcyBwb2ludCBpbiBvcmRlciB0byBjb21wbGV0ZSBkZWNvbXByZXNzaW9uIG9mCisgIHRoZSBkYXRhIHByb3ZpZGVkIHNvIGZhciB0byB0aGUgY29tcHJlc3Nvci4gIEl0IG1heSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXh0CisgIGJsb2NrIHRvIGJlIGVtaXR0ZWQuICBUaGlzIGlzIGZvciBhZHZhbmNlZCBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGNvbnRyb2wKKyAgdGhlIGVtaXNzaW9uIG9mIGRlZmxhdGUgYmxvY2tzLgorCisgICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfRlVMTF9GTFVTSCwgYWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGgKKyAgWl9TWU5DX0ZMVVNILCBhbmQgdGhlIGNvbXByZXNzaW9uIHN0YXRlIGlzIHJlc2V0IHNvIHRoYXQgZGVjb21wcmVzc2lvbiBjYW4KKyAgcmVzdGFydCBmcm9tIHRoaXMgcG9pbnQgaWYgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGRhbWFnZWQgb3IgaWYKKyAgcmFuZG9tIGFjY2VzcyBpcyBkZXNpcmVkLiBVc2luZyBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQorICBjb21wcmVzc2lvbi4KKworICAgIElmIGRlZmxhdGUgcmV0dXJucyB3aXRoIGF2YWlsX291dCA9PSAwLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFnYWluCisgIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQKKyAgYXZhaWxfb3V0KSwgdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlIChkZWZsYXRlIHJldHVybnMgd2l0aCBub24temVybworICBhdmFpbF9vdXQpLiBJbiB0aGUgY2FzZSBvZiBhIFpfRlVMTF9GTFVTSCBvciBaX1NZTkNfRkxVU0gsIG1ha2Ugc3VyZSB0aGF0CisgIGF2YWlsX291dCBpcyBncmVhdGVyIHRoYW4gc2l4IHRvIGF2b2lkIHJlcGVhdGVkIGZsdXNoIG1hcmtlcnMgZHVlIHRvCisgIGF2YWlsX291dCA9PSAwIG9uIHJldHVybi4KKworICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfRklOSVNILCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCwKKyAgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCBhbmQgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIGlmIHRoZXJlCisgIHdhcyBlbm91Z2ggb3V0cHV0IHNwYWNlOyBpZiBkZWZsYXRlIHJldHVybnMgd2l0aCBaX09LLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKKyAgY2FsbGVkIGFnYWluIHdpdGggWl9GSU5JU0ggYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkIGF2YWlsX291dCkgYnV0IG5vCisgIG1vcmUgaW5wdXQgZGF0YSwgdW50aWwgaXQgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBvciBhbiBlcnJvci4gQWZ0ZXIKKyAgZGVmbGF0ZSBoYXMgcmV0dXJuZWQgWl9TVFJFQU1fRU5ELCB0aGUgb25seSBwb3NzaWJsZSBvcGVyYXRpb25zIG9uIHRoZQorICBzdHJlYW0gYXJlIGRlZmxhdGVSZXNldCBvciBkZWZsYXRlRW5kLgorCisgICAgWl9GSU5JU0ggY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVmbGF0ZUluaXQgaWYgYWxsIHRoZSBjb21wcmVzc2lvbgorICBpcyB0byBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAuIEluIHRoaXMgY2FzZSwgYXZhaWxfb3V0IG11c3QgYmUgYXQgbGVhc3QKKyAgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlZmxhdGVCb3VuZCAoc2VlIGJlbG93KS4gSWYgZGVmbGF0ZSBkb2VzIG5vdCByZXR1cm4KKyAgWl9TVFJFQU1fRU5ELCB0aGVuIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFzIGRlc2NyaWJlZCBhYm92ZS4KKworICAgIGRlZmxhdGUoKSBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIGFsbCBpbnB1dCByZWFkCisgIHNvIGZhciAodGhhdCBpcywgdG90YWxfaW4gYnl0ZXMpLgorCisgICAgZGVmbGF0ZSgpIG1heSB1cGRhdGUgc3RybS0+ZGF0YV90eXBlIGlmIGl0IGNhbiBtYWtlIGEgZ29vZCBndWVzcyBhYm91dAorICB0aGUgaW5wdXQgZGF0YSB0eXBlIChaX0JJTkFSWSBvciBaX1RFWFQpLiBJbiBkb3VidCwgdGhlIGRhdGEgaXMgY29uc2lkZXJlZAorICBiaW5hcnkuIFRoaXMgZmllbGQgaXMgb25seSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMgYW5kIGRvZXMgbm90IGFmZmVjdAorICB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGluIGFueSBtYW5uZXIuCisKKyAgICBkZWZsYXRlKCkgcmV0dXJucyBaX09LIGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dAorICBwcm9jZXNzZWQgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCBaX1NUUkVBTV9FTkQgaWYgYWxsIGlucHV0IGhhcyBiZWVuCisgIGNvbnN1bWVkIGFuZCBhbGwgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkIChvbmx5IHdoZW4gZmx1c2ggaXMgc2V0IHRvCisgIFpfRklOSVNIKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQorICBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBaX05VTEwpLCBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZQorICAoZm9yIGV4YW1wbGUgYXZhaWxfaW4gb3IgYXZhaWxfb3V0IHdhcyB6ZXJvKS4gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdAorICBmYXRhbCwgYW5kIGRlZmxhdGUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBpbnB1dCBhbmQgbW9yZSBvdXRwdXQKKyAgc3BhY2UgdG8gY29udGludWUgY29tcHJlc3NpbmcuCisqLworCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCisgICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55CisgICBwZW5kaW5nIG91dHB1dC4KKworICAgICBkZWZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIHN0cmVhbSB3YXMgZnJlZWQKKyAgIHByZW1hdHVyZWx5IChzb21lIGlucHV0IG9yIG91dHB1dCB3YXMgZGlzY2FyZGVkKS4gSW4gdGhlIGVycm9yIGNhc2UsCisgICBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYSBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZQorICAgZGVhbGxvY2F0ZWQpLgorKi8KKworCisvKgorWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKworICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uLiBUaGUgZmllbGRzCisgICBuZXh0X2luLCBhdmFpbF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5CisgICB0aGUgY2FsbGVyLiBJZiBuZXh0X2luIGlzIG5vdCBaX05VTEwgYW5kIGF2YWlsX2luIGlzIGxhcmdlIGVub3VnaCAodGhlIGV4YWN0CisgICB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjb21wcmVzc2lvbiBtZXRob2QpLCBpbmZsYXRlSW5pdCBkZXRlcm1pbmVzIHRoZQorICAgY29tcHJlc3Npb24gbWV0aG9kIGZyb20gdGhlIHpsaWIgaGVhZGVyIGFuZCBhbGxvY2F0ZXMgYWxsIGRhdGEgc3RydWN0dXJlcworICAgYWNjb3JkaW5nbHk7IG90aGVyd2lzZSB0aGUgYWxsb2NhdGlvbiB3aWxsIGJlIGRlZmVycmVkIHRvIHRoZSBmaXJzdCBjYWxsIG9mCisgICBpbmZsYXRlLiAgSWYgemFsbG9jIGFuZCB6ZnJlZSBhcmUgc2V0IHRvIFpfTlVMTCwgaW5mbGF0ZUluaXQgdXBkYXRlcyB0aGVtIHRvCisgICB1c2UgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKworICAgICBpbmZsYXRlSW5pdCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKKyAgIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgcGFyYW1ldGVycyBhcmUKKyAgIGludmFsaWQsIHN1Y2ggYXMgYSBudWxsIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZS4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZgorICAgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gaW5mbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbgorICAgYXBhcnQgZnJvbSBwb3NzaWJseSByZWFkaW5nIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiBhY3R1YWwgZGVjb21wcmVzc2lvbgorICAgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gIChTbyBuZXh0X2luIGFuZCBhdmFpbF9pbiBtYXkgYmUgbW9kaWZpZWQsIGJ1dAorICAgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW51c2VkIGFuZCB1bmNoYW5nZWQuKSAgVGhlIGN1cnJlbnQKKyAgIGltcGxlbWVudGF0aW9uIG9mIGluZmxhdGVJbml0KCkgZG9lcyBub3QgcHJvY2VzcyBhbnkgaGVhZGVyIGluZm9ybWF0aW9uIC0tCisgICB0aGF0IGlzIGRlZmVycmVkIHVudGlsIGluZmxhdGUoKSBpcyBjYWxsZWQuCisqLworCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZSBPRigoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCkpOworLyoKKyAgICBpbmZsYXRlIGRlY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAorICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBpbnRyb2R1Y2UKKyAgc29tZSBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgorICBmb3JjZWQgdG8gZmx1c2guCisKKyAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gaW5mbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKKyAgZm9sbG93aW5nIGFjdGlvbnM6CisKKyAgLSBEZWNvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgbmV4dF9pbiBhbmQgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luCisgICAgYWNjb3JkaW5nbHkuIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKKyAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIG5leHRfaW4gaXMgdXBkYXRlZCBhbmQgcHJvY2Vzc2luZworICAgIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgaW5mbGF0ZSgpLgorCisgIC0gUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCBuZXh0X291dCBhbmQgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQKKyAgICBhY2NvcmRpbmdseS4gIGluZmxhdGUoKSBwcm92aWRlcyBhcyBtdWNoIG91dHB1dCBhcyBwb3NzaWJsZSwgdW50aWwgdGhlcmUKKyAgICBpcyBubyBtb3JlIGlucHV0IGRhdGEgb3Igbm8gbW9yZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAoc2VlIGJlbG93CisgICAgYWJvdXQgdGhlIGZsdXNoIHBhcmFtZXRlcikuCisKKyAgQmVmb3JlIHRoZSBjYWxsIG9mIGluZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAorICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKKyAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyB0aGUgbmV4dF8qIGFuZCBhdmFpbF8qIHZhbHVlcyBhY2NvcmRpbmdseS4KKyAgVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvcgorICBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoYXZhaWxfb3V0ID09IDApLCBvciBhZnRlciBlYWNoCisgIGNhbGwgb2YgaW5mbGF0ZSgpLiBJZiBpbmZsYXRlIHJldHVybnMgWl9PSyBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQKKyAgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZQorICBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgorCisgICAgVGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgY2FuIGJlIFpfTk9fRkxVU0gsIFpfU1lOQ19GTFVTSCwgWl9GSU5JU0gsCisgIFpfQkxPQ0ssIG9yIFpfVFJFRVMuIFpfU1lOQ19GTFVTSCByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBmbHVzaCBhcyBtdWNoCisgIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gWl9CTE9DSyByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBzdG9wCisgIGlmIGFuZCB3aGVuIGl0IGdldHMgdG8gdGhlIG5leHQgZGVmbGF0ZSBibG9jayBib3VuZGFyeS4gV2hlbiBkZWNvZGluZyB0aGUKKyAgemxpYiBvciBnemlwIGZvcm1hdCwgdGhpcyB3aWxsIGNhdXNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIKKyAgdGhlIGhlYWRlciBhbmQgYmVmb3JlIHRoZSBmaXJzdCBibG9jay4gV2hlbiBkb2luZyBhIHJhdyBpbmZsYXRlLCBpbmZsYXRlKCkKKyAgd2lsbCBnbyBhaGVhZCBhbmQgcHJvY2VzcyB0aGUgZmlyc3QgYmxvY2ssIGFuZCB3aWxsIHJldHVybiB3aGVuIGl0IGdldHMgdG8KKyAgdGhlIGVuZCBvZiB0aGF0IGJsb2NrLCBvciB3aGVuIGl0IHJ1bnMgb3V0IG9mIGRhdGEuCisKKyAgICBUaGUgWl9CTE9DSyBvcHRpb24gYXNzaXN0cyBpbiBhcHBlbmRpbmcgdG8gb3IgY29tYmluaW5nIGRlZmxhdGUgc3RyZWFtcy4KKyAgQWxzbyB0byBhc3Npc3QgaW4gdGhpcywgb24gcmV0dXJuIGluZmxhdGUoKSB3aWxsIHNldCBzdHJtLT5kYXRhX3R5cGUgdG8gdGhlCisgIG51bWJlciBvZiB1bnVzZWQgYml0cyBpbiB0aGUgbGFzdCBieXRlIHRha2VuIGZyb20gc3RybS0+bmV4dF9pbiwgcGx1cyA2NAorICBpZiBpbmZsYXRlKCkgaXMgY3VycmVudGx5IGRlY29kaW5nIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBkZWZsYXRlIHN0cmVhbSwKKyAgcGx1cyAxMjggaWYgaW5mbGF0ZSgpIHJldHVybmVkIGltbWVkaWF0ZWx5IGFmdGVyIGRlY29kaW5nIGFuIGVuZC1vZi1ibG9jaworICBjb2RlIG9yIGRlY29kaW5nIHRoZSBjb21wbGV0ZSBoZWFkZXIgdXAgdG8ganVzdCBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlCisgIGRlZmxhdGUgc3RyZWFtLiBUaGUgZW5kLW9mLWJsb2NrIHdpbGwgbm90IGJlIGluZGljYXRlZCB1bnRpbCBhbGwgb2YgdGhlCisgIHVuY29tcHJlc3NlZCBkYXRhIGZyb20gdGhhdCBibG9jayBoYXMgYmVlbiB3cml0dGVuIHRvIHN0cm0tPm5leHRfb3V0LiAgVGhlCisgIG51bWJlciBvZiB1bnVzZWQgYml0cyBtYXkgaW4gZ2VuZXJhbCBiZSBncmVhdGVyIHRoYW4gc2V2ZW4sIGV4Y2VwdCB3aGVuCisgIGJpdCA3IG9mIGRhdGFfdHlwZSBpcyBzZXQsIGluIHdoaWNoIGNhc2UgdGhlIG51bWJlciBvZiB1bnVzZWQgYml0cyB3aWxsIGJlCisgIGxlc3MgdGhhbiBlaWdodC4gIGRhdGFfdHlwZSBpcyBzZXQgYXMgbm90ZWQgaGVyZSBldmVyeSB0aW1lIGluZmxhdGUoKQorICByZXR1cm5zIGZvciBhbGwgZmx1c2ggb3B0aW9ucywgYW5kIHNvIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgYW1vdW50CisgIG9mIGN1cnJlbnRseSBjb25zdW1lZCBpbnB1dCBpbiBiaXRzLgorCisgICAgVGhlIFpfVFJFRVMgb3B0aW9uIGJlaGF2ZXMgYXMgWl9CTE9DSyBkb2VzLCBidXQgaXQgYWxzbyByZXR1cm5zIHdoZW4gdGhlCisgIGVuZCBvZiBlYWNoIGRlZmxhdGUgYmxvY2sgaGVhZGVyIGlzIHJlYWNoZWQsIGJlZm9yZSBhbnkgYWN0dWFsIGRhdGEgaW4gdGhhdAorICBibG9jayBpcyBkZWNvZGVkLiAgVGhpcyBhbGxvd3MgdGhlIGNhbGxlciB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUKKyAgZGVmbGF0ZSBibG9jayBoZWFkZXIgZm9yIGxhdGVyIHVzZSBpbiByYW5kb20gYWNjZXNzIHdpdGhpbiBhIGRlZmxhdGUgYmxvY2suCisgIDI1NiBpcyBhZGRlZCB0byB0aGUgdmFsdWUgb2Ygc3RybS0+ZGF0YV90eXBlIHdoZW4gaW5mbGF0ZSgpIHJldHVybnMKKyAgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBibG9jayBoZWFkZXIuCisKKyAgICBpbmZsYXRlKCkgc2hvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIFpfU1RSRUFNX0VORCBvciBhbgorICBlcnJvci4gSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcAorICAoYSBzaW5nbGUgY2FsbCBvZiBpbmZsYXRlKSwgdGhlIHBhcmFtZXRlciBmbHVzaCBzaG91bGQgYmUgc2V0IHRvCisgIFpfRklOSVNILiBJbiB0aGlzIGNhc2UgYWxsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkIGFuZCBhbGwgcGVuZGluZworICBvdXRwdXQgaXMgZmx1c2hlZDsgYXZhaWxfb3V0IG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZQorICB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtYXkgaGF2ZSBiZWVuIHNhdmVkCisgIGJ5IHRoZSBjb21wcmVzc29yIGZvciB0aGlzIHB1cnBvc2UuKSBUaGUgbmV4dCBvcGVyYXRpb24gb24gdGhpcyBzdHJlYW0gbXVzdAorICBiZSBpbmZsYXRlRW5kIHRvIGRlYWxsb2NhdGUgdGhlIGRlY29tcHJlc3Npb24gc3RhdGUuIFRoZSB1c2Ugb2YgWl9GSU5JU0gKKyAgaXMgbmV2ZXIgcmVxdWlyZWQsIGJ1dCBjYW4gYmUgdXNlZCB0byBpbmZvcm0gaW5mbGF0ZSB0aGF0IGEgZmFzdGVyIGFwcHJvYWNoCisgIG1heSBiZSB1c2VkIGZvciB0aGUgc2luZ2xlIGluZmxhdGUoKSBjYWxsLgorCisgICAgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIGluZmxhdGUoKSBhbHdheXMgZmx1c2hlcyBhcyBtdWNoIG91dHB1dCBhcworICBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIGFsd2F5cyB1c2VzIHRoZSBmYXN0ZXIgYXBwcm9hY2ggb24gdGhlCisgIGZpcnN0IGNhbGwuIFNvIHRoZSBvbmx5IGVmZmVjdCBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGluIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgaXMgb24gdGhlIHJldHVybiB2YWx1ZSBvZiBpbmZsYXRlKCksIGFzIG5vdGVkIGJlbG93LCBvciB3aGVuIGl0IHJldHVybnMgZWFybHkKKyAgYmVjYXVzZSBaX0JMT0NLIG9yIFpfVFJFRVMgaXMgdXNlZC4KKworICAgICBJZiBhIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhZnRlciB0aGlzIGNhbGwgKHNlZSBpbmZsYXRlU2V0RGljdGlvbmFyeQorICBiZWxvdyksIGluZmxhdGUgc2V0cyBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiB0aGUgZGljdGlvbmFyeQorICBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9ORUVEX0RJQ1Q7IG90aGVyd2lzZSBpdCBzZXRzCisgIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIGFsbCBvdXRwdXQgcHJvZHVjZWQgc28gZmFyICh0aGF0IGlzLAorICB0b3RhbF9vdXQgYnl0ZXMpIGFuZCByZXR1cm5zIFpfT0ssIFpfU1RSRUFNX0VORCBvciBhbiBlcnJvciBjb2RlIGFzIGRlc2NyaWJlZAorICBiZWxvdy4gQXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCBpbmZsYXRlKCkgY2hlY2tzIHRoYXQgaXRzIGNvbXB1dGVkIGFkbGVyMzIKKyAgY2hlY2tzdW0gaXMgZXF1YWwgdG8gdGhhdCBzYXZlZCBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX1NUUkVBTV9FTkQKKyAgb25seSBpZiB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdC4KKworICAgIGluZmxhdGUoKSBjYW4gZGVjb21wcmVzcyBhbmQgY2hlY2sgZWl0aGVyIHpsaWItd3JhcHBlZCBvciBnemlwLXdyYXBwZWQKKyAgZGVmbGF0ZSBkYXRhLiAgVGhlIGhlYWRlciB0eXBlIGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHksIGlmIHJlcXVlc3RlZCB3aGVuCisgIGluaXRpYWxpemluZyB3aXRoIGluZmxhdGVJbml0MigpLiAgQW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgZ3ppcAorICBoZWFkZXIgaXMgbm90IHJldGFpbmVkLCBzbyBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRoYXQgaW5mb3JtYXRpb24gc2hvdWxkCisgIGluc3RlYWQgdXNlIHJhdyBpbmZsYXRlLCBzZWUgaW5mbGF0ZUluaXQyKCkgYmVsb3csIG9yIGluZmxhdGVCYWNrKCkgYW5kCisgIHBlcmZvcm0gdGhlaXIgb3duIHByb2Nlc3Npbmcgb2YgdGhlIGd6aXAgaGVhZGVyIGFuZCB0cmFpbGVyLgorCisgICAgaW5mbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQgcHJvY2Vzc2VkCisgIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBoYXMKKyAgYmVlbiByZWFjaGVkIGFuZCBhbGwgdW5jb21wcmVzc2VkIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCwgWl9ORUVEX0RJQ1QgaWYgYQorICBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcworICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0IGNoZWNrCisgIHZhbHVlKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKKyAgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgWl9OVUxMKSwgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5LAorICBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZQorICBvdXRwdXQgYnVmZmVyIHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbCwgYW5kCisgIGluZmxhdGUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBpbnB1dCBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgdG8KKyAgY29udGludWUgZGVjb21wcmVzc2luZy4gSWYgWl9EQVRBX0VSUk9SIGlzIHJldHVybmVkLCB0aGUgYXBwbGljYXRpb24gbWF5IHRoZW4KKyAgY2FsbCBpbmZsYXRlU3luYygpIHRvIGxvb2sgZm9yIGEgZ29vZCBjb21wcmVzc2lvbiBibG9jayBpZiBhIHBhcnRpYWwgcmVjb3ZlcnkKKyAgb2YgdGhlIGRhdGEgaXMgZGVzaXJlZC4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKKyAgIHBlbmRpbmcgb3V0cHV0LgorCisgICAgIGluZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUKKyAgIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBlcnJvciBjYXNlLCBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQorICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZWQgZnVuY3Rpb25zICovCisKKy8qCisgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG5lZWRlZCBvbmx5IGluIHNvbWUgc3BlY2lhbCBhcHBsaWNhdGlvbnMuCisqLworCisvKgorWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDIgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWVtTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBzdHJhdGVneSkpOworCisgICAgIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIGRlZmxhdGVJbml0IHdpdGggbW9yZSBjb21wcmVzc2lvbiBvcHRpb25zLiBUaGUKKyAgIGZpZWxkcyBuZXh0X2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKKyAgIHRoZSBjYWxsZXIuCisKKyAgICAgVGhlIG1ldGhvZCBwYXJhbWV0ZXIgaXMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4gSXQgbXVzdCBiZSBaX0RFRkxBVEVEIGluCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplCisgICAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IgdGhpcworICAgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gTGFyZ2VyIHZhbHVlcyBvZiB0aGlzIHBhcmFtZXRlciByZXN1bHQgaW4gYmV0dGVyCisgICBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmCisgICBkZWZsYXRlSW5pdCBpcyB1c2VkIGluc3RlYWQuCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSAtOC4uLTE1IGZvciByYXcgZGVmbGF0ZS4gSW4gdGhpcyBjYXNlLCAtd2luZG93Qml0cworICAgZGV0ZXJtaW5lcyB0aGUgd2luZG93IHNpemUuIGRlZmxhdGUoKSB3aWxsIHRoZW4gZ2VuZXJhdGUgcmF3IGRlZmxhdGUgZGF0YQorICAgd2l0aCBubyB6bGliIGhlYWRlciBvciB0cmFpbGVyLCBhbmQgd2lsbCBub3QgY29tcHV0ZSBhbiBhZGxlcjMyIGNoZWNrIHZhbHVlLgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgZ3JlYXRlciB0aGFuIDE1IGZvciBvcHRpb25hbCBnemlwIGVuY29kaW5nLiBBZGQKKyAgIDE2IHRvIHdpbmRvd0JpdHMgdG8gd3JpdGUgYSBzaW1wbGUgZ3ppcCBoZWFkZXIgYW5kIHRyYWlsZXIgYXJvdW5kIHRoZQorICAgY29tcHJlc3NlZCBkYXRhIGluc3RlYWQgb2YgYSB6bGliIHdyYXBwZXIuIFRoZSBnemlwIGhlYWRlciB3aWxsIGhhdmUgbm8KKyAgIGZpbGUgbmFtZSwgbm8gZXh0cmEgZGF0YSwgbm8gY29tbWVudCwgbm8gbW9kaWZpY2F0aW9uIHRpbWUgKHNldCB0byB6ZXJvKSwKKyAgIG5vIGhlYWRlciBjcmMsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aWxsIGJlIHNldCB0byAyNTUgKHVua25vd24pLiAgSWYgYQorICAgZ3ppcCBzdHJlYW0gaXMgYmVpbmcgd3JpdHRlbiwgc3RybS0+YWRsZXIgaXMgYSBjcmMzMiBpbnN0ZWFkIG9mIGFuIGFkbGVyMzIuCisKKyAgICAgVGhlIG1lbUxldmVsIHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG11Y2ggbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQKKyAgIGZvciB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuIG1lbUxldmVsPTEgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQKKyAgIGlzIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW87IG1lbUxldmVsPTkgdXNlcyBtYXhpbXVtIG1lbW9yeQorICAgZm9yIG9wdGltYWwgc3BlZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDguIFNlZSB6Y29uZi5oIGZvciB0b3RhbCBtZW1vcnkKKyAgIHVzYWdlIGFzIGEgZnVuY3Rpb24gb2Ygd2luZG93Qml0cyBhbmQgbWVtTGV2ZWwuCisKKyAgICAgVGhlIHN0cmF0ZWd5IHBhcmFtZXRlciBpcyB1c2VkIHRvIHR1bmUgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gVXNlIHRoZQorICAgdmFsdWUgWl9ERUZBVUxUX1NUUkFURUdZIGZvciBub3JtYWwgZGF0YSwgWl9GSUxURVJFRCBmb3IgZGF0YSBwcm9kdWNlZCBieSBhCisgICBmaWx0ZXIgKG9yIHByZWRpY3RvciksIFpfSFVGRk1BTl9PTkxZIHRvIGZvcmNlIEh1ZmZtYW4gZW5jb2Rpbmcgb25seSAobm8KKyAgIHN0cmluZyBtYXRjaCksIG9yIFpfUkxFIHRvIGxpbWl0IG1hdGNoIGRpc3RhbmNlcyB0byBvbmUgKHJ1bi1sZW5ndGgKKyAgIGVuY29kaW5nKS4gRmlsdGVyZWQgZGF0YSBjb25zaXN0cyBtb3N0bHkgb2Ygc21hbGwgdmFsdWVzIHdpdGggYSBzb21ld2hhdAorICAgcmFuZG9tIGRpc3RyaWJ1dGlvbi4gSW4gdGhpcyBjYXNlLCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzIHR1bmVkIHRvCisgICBjb21wcmVzcyB0aGVtIGJldHRlci4gVGhlIGVmZmVjdCBvZiBaX0ZJTFRFUkVEIGlzIHRvIGZvcmNlIG1vcmUgSHVmZm1hbgorICAgY29kaW5nIGFuZCBsZXNzIHN0cmluZyBtYXRjaGluZzsgaXQgaXMgc29tZXdoYXQgaW50ZXJtZWRpYXRlIGJldHdlZW4KKyAgIFpfREVGQVVMVF9TVFJBVEVHWSBhbmQgWl9IVUZGTUFOX09OTFkuIFpfUkxFIGlzIGRlc2lnbmVkIHRvIGJlIGFsbW9zdCBhcworICAgZmFzdCBhcyBaX0hVRkZNQU5fT05MWSwgYnV0IGdpdmUgYmV0dGVyIGNvbXByZXNzaW9uIGZvciBQTkcgaW1hZ2UgZGF0YS4gVGhlCisgICBzdHJhdGVneSBwYXJhbWV0ZXIgb25seSBhZmZlY3RzIHRoZSBjb21wcmVzc2lvbiByYXRpbyBidXQgbm90IHRoZQorICAgY29ycmVjdG5lc3Mgb2YgdGhlIGNvbXByZXNzZWQgb3V0cHV0IGV2ZW4gaWYgaXQgaXMgbm90IHNldCBhcHByb3ByaWF0ZWx5LgorICAgWl9GSVhFRCBwcmV2ZW50cyB0aGUgdXNlIG9mIGR5bmFtaWMgSHVmZm1hbiBjb2RlcywgYWxsb3dpbmcgZm9yIGEgc2ltcGxlcgorICAgZGVjb2RlciBmb3Igc3BlY2lhbCBhcHBsaWNhdGlvbnMuCisKKyAgICAgIGRlZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhbiBpbnZhbGlkCisgICBtZXRob2QpLiBtc2cgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGRlZmxhdGVJbml0MiBkb2VzCisgICBub3QgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVNldERpY3Rpb25hcnkgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICBkaWN0TGVuZ3RoKSk7CisvKgorICAgICBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlIHNlcXVlbmNlCisgICB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQKKyAgIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0LCBkZWZsYXRlSW5pdDIgb3IgZGVmbGF0ZVJlc2V0LCBiZWZvcmUgYW55CisgICBjYWxsIG9mIGRlZmxhdGUuIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZQorICAgZGljdGlvbmFyeSAoc2VlIGluZmxhdGVTZXREaWN0aW9uYXJ5KS4KKworICAgICBUaGUgZGljdGlvbmFyeSBzaG91bGQgY29uc2lzdCBvZiBzdHJpbmdzIChieXRlIHNlcXVlbmNlcykgdGhhdCBhcmUgbGlrZWx5CisgICB0byBiZSBlbmNvdW50ZXJlZCBsYXRlciBpbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkLCB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5CisgICB1c2VkIHN0cmluZ3MgcHJlZmVyYWJseSBwdXQgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LiBVc2luZyBhCisgICBkaWN0aW9uYXJ5IGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCBpcyBzaG9ydCBhbmQgY2FuIGJlCisgICBwcmVkaWN0ZWQgd2l0aCBnb29kIGFjY3VyYWN5OyB0aGUgZGF0YSBjYW4gdGhlbiBiZSBjb21wcmVzc2VkIGJldHRlciB0aGFuCisgICB3aXRoIHRoZSBkZWZhdWx0IGVtcHR5IGRpY3Rpb25hcnkuCisKKyAgICAgRGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2lvbiBkYXRhIHN0cnVjdHVyZXMgc2VsZWN0ZWQgYnkKKyAgIGRlZmxhdGVJbml0IG9yIGRlZmxhdGVJbml0MiwgYSBwYXJ0IG9mIHRoZSBkaWN0aW9uYXJ5IG1heSBpbiBlZmZlY3QgYmUKKyAgIGRpc2NhcmRlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIGRpY3Rpb25hcnkgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpbmRvdyBzaXplCisgICBwcm92aWRlZCBpbiBkZWZsYXRlSW5pdCBvciBkZWZsYXRlSW5pdDIuIFRodXMgdGhlIHN0cmluZ3MgbW9zdCBsaWtlbHkgdG8gYmUKKyAgIHVzZWZ1bCBzaG91bGQgYmUgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnksIG5vdCBhdCB0aGUgZnJvbnQuIEluCisgICBhZGRpdGlvbiwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGVmbGF0ZSB3aWxsIHVzZSBhdCBtb3N0IHRoZSB3aW5kb3cKKyAgIHNpemUgbWludXMgMjYyIGJ5dGVzIG9mIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5LgorCisgICAgIFVwb24gcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24sIHN0cm0tPmFkbGVyIGlzIHNldCB0byB0aGUgYWRsZXIzMiB2YWx1ZQorICAgb2YgdGhlIGRpY3Rpb25hcnk7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQorICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLiAoVGhlIGFkbGVyMzIgdmFsdWUKKyAgIGFwcGxpZXMgdG8gdGhlIHdob2xlIGRpY3Rpb25hcnkgZXZlbiBpZiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBkaWN0aW9uYXJ5IGlzCisgICBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLikgSWYgYSByYXcgZGVmbGF0ZSB3YXMgcmVxdWVzdGVkLCB0aGVuIHRoZQorICAgYWRsZXIzMiB2YWx1ZSBpcyBub3QgY29tcHV0ZWQgYW5kIHN0cm0tPmFkbGVyIGlzIG5vdCBzZXQuCisKKyAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIGEKKyAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChlLmcuIGRpY3Rpb25hcnkgYmVpbmcgWl9OVUxMKSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCisgICBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlIGlmIGRlZmxhdGUgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc3RyZWFtCisgICBvciBpZiB0aGUgY29tcHJlc3Npb24gbWV0aG9kIGlzIGJzb3J0KS4gZGVmbGF0ZVNldERpY3Rpb25hcnkgZG9lcyBub3QKKyAgIHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVDb3B5IE9GKCh6X3N0cmVhbXAgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfc3RyZWFtcCBzb3VyY2UpKTsKKy8qCisgICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBhcyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJlYW0uCisKKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gc2V2ZXJhbCBjb21wcmVzc2lvbiBzdHJhdGVnaWVzIHdpbGwgYmUKKyAgIHRyaWVkLCBmb3IgZXhhbXBsZSB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsIHdheXMgb2YgcHJlLXByb2Nlc3NpbmcgdGhlIGlucHV0CisgICBkYXRhIHdpdGggYSBmaWx0ZXIuIFRoZSBzdHJlYW1zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgc2hvdWxkIHRoZW4gYmUgZnJlZWQKKyAgIGJ5IGNhbGxpbmcgZGVmbGF0ZUVuZC4gIE5vdGUgdGhhdCBkZWZsYXRlQ29weSBkdXBsaWNhdGVzIHRoZSBpbnRlcm5hbAorICAgY29tcHJlc3Npb24gc3RhdGUgd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kCisgICBjYW4gY29uc3VtZSBsb3RzIG9mIG1lbW9yeS4KKworICAgICBkZWZsYXRlQ29weSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudAorICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIFpfTlVMTCkuIG1zZyBpcyBsZWZ0IHVuY2hhbmdlZCBpbiBib3RoIHNvdXJjZSBhbmQKKyAgIGRlc3RpbmF0aW9uLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUmVzZXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZGVmbGF0ZUVuZCBmb2xsb3dlZCBieSBkZWZsYXRlSW5pdCwKKyAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuCisgICBUaGUgc3RyZWFtIHdpbGwga2VlcCB0aGUgc2FtZSBjb21wcmVzc2lvbiBsZXZlbCBhbmQgYW55IG90aGVyIGF0dHJpYnV0ZXMKKyAgIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgZGVmbGF0ZUluaXQyLgorCisgICAgICBkZWZsYXRlUmVzZXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIHphbGxvYyBvciBzdGF0ZSBiZWluZyBaX05VTEwpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUGFyYW1zIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3kpKTsKKy8qCisgICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGNvbXByZXNzaW9uIHN0cmF0ZWd5LiAgVGhlCisgICBpbnRlcnByZXRhdGlvbiBvZiBsZXZlbCBhbmQgc3RyYXRlZ3kgaXMgYXMgaW4gZGVmbGF0ZUluaXQyLiAgVGhpcyBjYW4gYmUKKyAgIHVzZWQgdG8gc3dpdGNoIGJldHdlZW4gY29tcHJlc3Npb24gYW5kIHN0cmFpZ2h0IGNvcHkgb2YgdGhlIGlucHV0IGRhdGEsIG9yCisgICB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQga2luZCBvZiBpbnB1dCBkYXRhIHJlcXVpcmluZyBhIGRpZmZlcmVudAorICAgc3RyYXRlZ3kuIElmIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpcyBjaGFuZ2VkLCB0aGUgaW5wdXQgYXZhaWxhYmxlIHNvIGZhcgorICAgaXMgY29tcHJlc3NlZCB3aXRoIHRoZSBvbGQgbGV2ZWwgKGFuZCBtYXkgYmUgZmx1c2hlZCk7IHRoZSBuZXcgbGV2ZWwgd2lsbAorICAgdGFrZSBlZmZlY3Qgb25seSBhdCB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KKworICAgICBCZWZvcmUgdGhlIGNhbGwgb2YgZGVmbGF0ZVBhcmFtcywgdGhlIHN0cmVhbSBzdGF0ZSBtdXN0IGJlIHNldCBhcyBmb3IKKyAgIGEgY2FsbCBvZiBkZWZsYXRlKCksIHNpbmNlIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGlucHV0IG1heSBoYXZlIHRvCisgICBiZSBjb21wcmVzc2VkIGFuZCBmbHVzaGVkLiBJbiBwYXJ0aWN1bGFyLCBzdHJtLT5hdmFpbF9vdXQgbXVzdCBiZSBub24temVyby4KKworICAgICBkZWZsYXRlUGFyYW1zIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCBvciBpZiBhIHBhcmFtZXRlciB3YXMgaW52YWxpZCwgWl9CVUZfRVJST1IKKyAgIGlmIHN0cm0tPmF2YWlsX291dCB3YXMgemVyby4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVR1bmUgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdvb2RfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9sYXp5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5pY2VfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9jaGFpbikpOworLyoKKyAgICAgRmluZSB0dW5lIGRlZmxhdGUncyBpbnRlcm5hbCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLiAgVGhpcyBzaG91bGQgb25seSBiZQorICAgdXNlZCBieSBzb21lb25lIHdobyB1bmRlcnN0YW5kcyB0aGUgYWxnb3JpdGhtIHVzZWQgYnkgemxpYidzIGRlZmxhdGUgZm9yCisgICBzZWFyY2hpbmcgZm9yIHRoZSBiZXN0IG1hdGNoaW5nIHN0cmluZywgYW5kIGV2ZW4gdGhlbiBvbmx5IGJ5IHRoZSBtb3N0CisgICBmYW5hdGljIG9wdGltaXplciB0cnlpbmcgdG8gc3F1ZWV6ZSBvdXQgdGhlIGxhc3QgY29tcHJlc3NlZCBiaXQgZm9yIHRoZWlyCisgICBzcGVjaWZpYyBpbnB1dCBkYXRhLiAgUmVhZCB0aGUgZGVmbGF0ZS5jIHNvdXJjZSBjb2RlIGZvciB0aGUgbWVhbmluZyBvZiB0aGUKKyAgIG1heF9sYXp5LCBnb29kX2xlbmd0aCwgbmljZV9sZW5ndGgsIGFuZCBtYXhfY2hhaW4gcGFyYW1ldGVycy4KKworICAgICBkZWZsYXRlVHVuZSgpIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgZGVmbGF0ZUluaXQoKSBvciBkZWZsYXRlSW5pdDIoKSwgYW5kCisgICByZXR1cm5zIFpfT0sgb24gc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgZm9yIGFuIGludmFsaWQgZGVmbGF0ZSBzdHJlYW0uCisgKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGRlZmxhdGVCb3VuZCBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBzb3VyY2VMZW4pKTsKKy8qCisgICAgIGRlZmxhdGVCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgorICAgZGVmbGF0aW9uIG9mIHNvdXJjZUxlbiBieXRlcy4gIEl0IG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZmxhdGVJbml0KCkgb3IKKyAgIGRlZmxhdGVJbml0MigpLCBhbmQgYWZ0ZXIgZGVmbGF0ZVNldEhlYWRlcigpLCBpZiB1c2VkLiAgVGhpcyB3b3VsZCBiZSB1c2VkCisgICB0byBhbGxvY2F0ZSBhbiBvdXRwdXQgYnVmZmVyIGZvciBkZWZsYXRpb24gaW4gYSBzaW5nbGUgcGFzcywgYW5kIHNvIHdvdWxkIGJlCisgICBjYWxsZWQgYmVmb3JlIGRlZmxhdGUoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVByaW1lIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpKTsKKy8qCisgICAgIGRlZmxhdGVQcmltZSgpIGluc2VydHMgYml0cyBpbiB0aGUgZGVmbGF0ZSBvdXRwdXQgc3RyZWFtLiAgVGhlIGludGVudAorICBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCBvZmYgdGhlIGRlZmxhdGUgb3V0cHV0IHdpdGggdGhlCisgIGJpdHMgbGVmdG92ZXIgZnJvbSBhIHByZXZpb3VzIGRlZmxhdGUgc3RyZWFtIHdoZW4gYXBwZW5kaW5nIHRvIGl0LiAgQXMgc3VjaCwKKyAgdGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGZvciByYXcgZGVmbGF0ZSwgYW5kIG11c3QgYmUgdXNlZCBiZWZvcmUgdGhlCisgIGZpcnN0IGRlZmxhdGUoKSBjYWxsIGFmdGVyIGEgZGVmbGF0ZUluaXQyKCkgb3IgZGVmbGF0ZVJlc2V0KCkuICBiaXRzIG11c3QgYmUKKyAgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LCBhbmQgdGhhdCBtYW55IG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mCisgIHZhbHVlIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gdGhlIG91dHB1dC4KKworICAgICAgZGVmbGF0ZVByaW1lIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVNldEhlYWRlciBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd6X2hlYWRlcnAgaGVhZCkpOworLyoKKyAgICAgIGRlZmxhdGVTZXRIZWFkZXIoKSBwcm92aWRlcyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3Igd2hlbiBhIGd6aXAKKyAgIHN0cmVhbSBpcyByZXF1ZXN0ZWQgYnkgZGVmbGF0ZUluaXQyKCkuICBkZWZsYXRlU2V0SGVhZGVyKCkgbWF5IGJlIGNhbGxlZAorICAgYWZ0ZXIgZGVmbGF0ZUluaXQyKCkgb3IgZGVmbGF0ZVJlc2V0KCkgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZgorICAgZGVmbGF0ZSgpLiAgVGhlIHRleHQsIHRpbWUsIG9zLCBleHRyYSBmaWVsZCwgbmFtZSwgYW5kIGNvbW1lbnQgaW5mb3JtYXRpb24KKyAgIGluIHRoZSBwcm92aWRlZCBnel9oZWFkZXIgc3RydWN0dXJlIGFyZSB3cml0dGVuIHRvIHRoZSBnemlwIGhlYWRlciAoeGZsYWcgaXMKKyAgIGlnbm9yZWQgLS0gdGhlIGV4dHJhIGZsYWdzIGFyZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBjb21wcmVzc2lvbiBsZXZlbCkuICBUaGUKKyAgIGNhbGxlciBtdXN0IGFzc3VyZSB0aGF0LCBpZiBub3QgWl9OVUxMLCBuYW1lIGFuZCBjb21tZW50IGFyZSB0ZXJtaW5hdGVkIHdpdGgKKyAgIGEgemVybyBieXRlLCBhbmQgdGhhdCBpZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGF0IGV4dHJhX2xlbiBieXRlcyBhcmUKKyAgIGF2YWlsYWJsZSB0aGVyZS4gIElmIGhjcmMgaXMgdHJ1ZSwgYSBnemlwIGhlYWRlciBjcmMgaXMgaW5jbHVkZWQuICBOb3RlIHRoYXQKKyAgIHRoZSBjdXJyZW50IHZlcnNpb25zIG9mIHRoZSBjb21tYW5kLWxpbmUgdmVyc2lvbiBvZiBnemlwICh1cCB0aHJvdWdoIHZlcnNpb24KKyAgIDEuMy54KSBkbyBub3Qgc3VwcG9ydCBoZWFkZXIgY3JjJ3MsIGFuZCB3aWxsIHJlcG9ydCB0aGF0IGl0IGlzIGEgIm11bHRpLXBhcnQKKyAgIGd6aXAgZmlsZSIgYW5kIGdpdmUgdXAuCisKKyAgICAgIElmIGRlZmxhdGVTZXRIZWFkZXIgaXMgbm90IHVzZWQsIHRoZSBkZWZhdWx0IGd6aXAgaGVhZGVyIGhhcyB0ZXh0IGZhbHNlLAorICAgdGhlIHRpbWUgc2V0IHRvIHplcm8sIGFuZCBvcyBzZXQgdG8gMjU1LCB3aXRoIG5vIGV4dHJhLCBuYW1lLCBvciBjb21tZW50CisgICBmaWVsZHMuICBUaGUgZ3ppcCBoZWFkZXIgaXMgcmV0dXJuZWQgdG8gdGhlIGRlZmF1bHQgc3RhdGUgYnkgZGVmbGF0ZVJlc2V0KCkuCisKKyAgICAgIGRlZmxhdGVTZXRIZWFkZXIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorKi8KKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHdpbmRvd0JpdHMpKTsKKworICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBpbmZsYXRlSW5pdCB3aXRoIGFuIGV4dHJhIHBhcmFtZXRlci4gVGhlCisgICBmaWVsZHMgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkCisgICBiZWZvcmUgYnkgdGhlIGNhbGxlci4KKworICAgICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgbWF4aW11bSB3aW5kb3cKKyAgIHNpemUgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvcgorICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZiBpbmZsYXRlSW5pdCBpcyB1c2VkCisgICBpbnN0ZWFkLiB3aW5kb3dCaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB3aW5kb3dCaXRzIHZhbHVlCisgICBwcm92aWRlZCB0byBkZWZsYXRlSW5pdDIoKSB3aGlsZSBjb21wcmVzc2luZywgb3IgaXQgbXVzdCBiZSBlcXVhbCB0byAxNSBpZgorICAgZGVmbGF0ZUluaXQyKCkgd2FzIG5vdCB1c2VkLiBJZiBhIGNvbXByZXNzZWQgc3RyZWFtIHdpdGggYSBsYXJnZXIgd2luZG93CisgICBzaXplIGlzIGdpdmVuIGFzIGlucHV0LCBpbmZsYXRlKCkgd2lsbCByZXR1cm4gd2l0aCB0aGUgZXJyb3IgY29kZQorICAgWl9EQVRBX0VSUk9SIGluc3RlYWQgb2YgdHJ5aW5nIHRvIGFsbG9jYXRlIGEgbGFyZ2VyIHdpbmRvdy4KKworICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIC04Li4tMTUgZm9yIHJhdyBpbmZsYXRlLiBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCisgICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gaW5mbGF0ZSgpIHdpbGwgdGhlbiBwcm9jZXNzIHJhdyBkZWZsYXRlIGRhdGEsCisgICBub3QgbG9va2luZyBmb3IgYSB6bGliIG9yIGd6aXAgaGVhZGVyLCBub3QgZ2VuZXJhdGluZyBhIGNoZWNrIHZhbHVlLCBhbmQgbm90CisgICBsb29raW5nIGZvciBhbnkgY2hlY2sgdmFsdWVzIGZvciBjb21wYXJpc29uIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gVGhpcworICAgaXMgZm9yIHVzZSB3aXRoIG90aGVyIGZvcm1hdHMgdGhhdCB1c2UgdGhlIGRlZmxhdGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdAorICAgc3VjaCBhcyB6aXAuICBUaG9zZSBmb3JtYXRzIHByb3ZpZGUgdGhlaXIgb3duIGNoZWNrIHZhbHVlcy4gSWYgYSBjdXN0b20KKyAgIGZvcm1hdCBpcyBkZXZlbG9wZWQgdXNpbmcgdGhlIHJhdyBkZWZsYXRlIGZvcm1hdCBmb3IgY29tcHJlc3NlZCBkYXRhLCBpdCBpcworICAgcmVjb21tZW5kZWQgdGhhdCBhIGNoZWNrIHZhbHVlIHN1Y2ggYXMgYW4gYWRsZXIzMiBvciBhIGNyYzMyIGJlIGFwcGxpZWQgdG8KKyAgIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhcyBpcyBkb25lIGluIHRoZSB6bGliLCBnemlwLCBhbmQgemlwIGZvcm1hdHMuICBGb3IKKyAgIG1vc3QgYXBwbGljYXRpb25zLCB0aGUgemxpYiBmb3JtYXQgc2hvdWxkIGJlIHVzZWQgYXMgaXMuIE5vdGUgdGhhdCBjb21tZW50cworICAgYWJvdmUgb24gdGhlIHVzZSBpbiBkZWZsYXRlSW5pdDIoKSBhcHBsaWVzIHRvIHRoZSBtYWduaXR1ZGUgb2Ygd2luZG93Qml0cy4KKworICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIGdyZWF0ZXIgdGhhbiAxNSBmb3Igb3B0aW9uYWwgZ3ppcCBkZWNvZGluZy4gQWRkCisgICAzMiB0byB3aW5kb3dCaXRzIHRvIGVuYWJsZSB6bGliIGFuZCBnemlwIGRlY29kaW5nIHdpdGggYXV0b21hdGljIGhlYWRlcgorICAgZGV0ZWN0aW9uLCBvciBhZGQgMTYgdG8gZGVjb2RlIG9ubHkgdGhlIGd6aXAgZm9ybWF0ICh0aGUgemxpYiBmb3JtYXQgd2lsbAorICAgcmV0dXJuIGEgWl9EQVRBX0VSUk9SKS4gIElmIGEgZ3ppcCBzdHJlYW0gaXMgYmVpbmcgZGVjb2RlZCwgc3RybS0+YWRsZXIgaXMKKyAgIGEgY3JjMzIgaW5zdGVhZCBvZiBhbiBhZGxlcjMyLgorCisgICAgIGluZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKKyAgIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgcGFyYW1ldGVycyBhcmUKKyAgIGludmFsaWQsIHN1Y2ggYXMgYSBudWxsIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZS4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZgorICAgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gaW5mbGF0ZUluaXQyIGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24KKyAgIGFwYXJ0IGZyb20gcG9zc2libHkgcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogYWN0dWFsIGRlY29tcHJlc3Npb24KKyAgIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuICAoU28gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbWF5IGJlIG1vZGlmaWVkLCBidXQKKyAgIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVudXNlZCBhbmQgdW5jaGFuZ2VkLikgIFRoZSBjdXJyZW50CisgICBpbXBsZW1lbnRhdGlvbiBvZiBpbmZsYXRlSW5pdDIoKSBkb2VzIG5vdCBwcm9jZXNzIGFueSBoZWFkZXIgaW5mb3JtYXRpb24gLS0KKyAgIHRoYXQgaXMgZGVmZXJyZWQgdW50aWwgaW5mbGF0ZSgpIGlzIGNhbGxlZC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVNldERpY3Rpb25hcnkgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICBkaWN0TGVuZ3RoKSk7CisvKgorICAgICBJbml0aWFsaXplcyB0aGUgZGVjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIHVuY29tcHJlc3NlZCBieXRlCisgICBzZXF1ZW5jZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgb2YgaW5mbGF0ZSwKKyAgIGlmIHRoYXQgY2FsbCByZXR1cm5lZCBaX05FRURfRElDVC4gVGhlIGRpY3Rpb25hcnkgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yCisgICBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBhZGxlcjMyIHZhbHVlIHJldHVybmVkIGJ5IHRoYXQgY2FsbCBvZiBpbmZsYXRlLgorICAgVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lIGRpY3Rpb25hcnkgKHNlZQorICAgZGVmbGF0ZVNldERpY3Rpb25hcnkpLiAgRm9yIHJhdyBpbmZsYXRlLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQKKyAgIGltbWVkaWF0ZWx5IGFmdGVyIGluZmxhdGVJbml0MigpIG9yIGluZmxhdGVSZXNldCgpIGFuZCBiZWZvcmUgYW55IGNhbGwgb2YKKyAgIGluZmxhdGUoKSB0byBzZXQgdGhlIGRpY3Rpb25hcnkuICBUaGUgYXBwbGljYXRpb24gbXVzdCBpbnN1cmUgdGhhdCB0aGUKKyAgIGRpY3Rpb25hcnkgdGhhdCB3YXMgdXNlZCBmb3IgY29tcHJlc3Npb24gaXMgcHJvdmlkZWQuCisKKyAgICAgaW5mbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIGEKKyAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChlLmcuIGRpY3Rpb25hcnkgYmVpbmcgWl9OVUxMKSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCisgICBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBkb2Vzbid0IG1hdGNoIHRoZQorICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgYWRsZXIzMiB2YWx1ZSkuIGluZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBzdWJzZXF1ZW50IGNhbGxzIG9mCisgICBpbmZsYXRlKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVTeW5jIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZSB0aGUKKyAgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZSB3aXRoIFpfRlVMTF9GTFVTSCkgY2FuIGJlIGZvdW5kLCBvciB1bnRpbCBhbGwKKyAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuIE5vIG91dHB1dCBpcyBwcm92aWRlZC4KKworICAgIGluZmxhdGVTeW5jIHJldHVybnMgWl9PSyBpZiBhIGZ1bGwgZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsIFpfQlVGX0VSUk9SCisgIGlmIG5vIG1vcmUgaW5wdXQgd2FzIHByb3ZpZGVkLCBaX0RBVEFfRVJST1IgaWYgbm8gZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsCisgIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBzdWNjZXNzCisgIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgc2F2ZSB0aGUgY3VycmVudCBjdXJyZW50IHZhbHVlIG9mIHRvdGFsX2luIHdoaWNoCisgIGluZGljYXRlcyB3aGVyZSB2YWxpZCBjb21wcmVzc2VkIGRhdGEgd2FzIGZvdW5kLiBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlCisgIGFwcGxpY2F0aW9uIG1heSByZXBlYXRlZGx5IGNhbGwgaW5mbGF0ZVN5bmMsIHByb3ZpZGluZyBtb3JlIGlucHV0IGVhY2ggdGltZSwKKyAgdW50aWwgc3VjY2VzcyBvciBlbmQgb2YgdGhlIGlucHV0IGRhdGEuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVDb3B5IE9GKCh6X3N0cmVhbXAgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfc3RyZWFtcCBzb3VyY2UpKTsKKy8qCisgICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBhcyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJlYW0uCisKKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gcmFuZG9tbHkgYWNjZXNzaW5nIGEgbGFyZ2Ugc3RyZWFtLiAgVGhlCisgICBmaXJzdCBwYXNzIHRocm91Z2ggdGhlIHN0cmVhbSBjYW4gcGVyaW9kaWNhbGx5IHJlY29yZCB0aGUgaW5mbGF0ZSBzdGF0ZSwKKyAgIGFsbG93aW5nIHJlc3RhcnRpbmcgaW5mbGF0ZSBhdCB0aG9zZSBwb2ludHMgd2hlbiByYW5kb21seSBhY2Nlc3NpbmcgdGhlCisgICBzdHJlYW0uCisKKyAgICAgaW5mbGF0ZUNvcHkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQKKyAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBaX05VTEwpLiBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCisgICBkZXN0aW5hdGlvbi4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGluZmxhdGVFbmQgZm9sbG93ZWQgYnkgaW5mbGF0ZUluaXQsCisgICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGRlY29tcHJlc3Npb24gc3RhdGUuCisgICBUaGUgc3RyZWFtIHdpbGwga2VlcCBhdHRyaWJ1dGVzIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgaW5mbGF0ZUluaXQyLgorCisgICAgICBpbmZsYXRlUmVzZXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIHphbGxvYyBvciBzdGF0ZSBiZWluZyBaX05VTEwpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMpKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgaW5mbGF0ZVJlc2V0LCBidXQgaXQgYWxzbyBwZXJtaXRzIGNoYW5naW5nCisgICB0aGUgd3JhcCBhbmQgd2luZG93IHNpemUgcmVxdWVzdHMuICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMKKyAgIGludGVycHJldGVkIHRoZSBzYW1lIGFzIGl0IGlzIGZvciBpbmZsYXRlSW5pdDIuCisKKyAgICAgIGluZmxhdGVSZXNldDIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIHphbGxvYyBvciBzdGF0ZSBiZWluZyBaX05VTEwpLCBvciBpZgorICAgdGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIGludmFsaWQuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVQcmltZSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSk7CisvKgorICAgICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYml0cyBpbiB0aGUgaW5mbGF0ZSBpbnB1dCBzdHJlYW0uICBUaGUgaW50ZW50IGlzCisgIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IGluZmxhdGluZyBhdCBhIGJpdCBwb3NpdGlvbiBpbiB0aGUKKyAgbWlkZGxlIG9mIGEgYnl0ZS4gIFRoZSBwcm92aWRlZCBiaXRzIHdpbGwgYmUgdXNlZCBiZWZvcmUgYW55IGJ5dGVzIGFyZSB1c2VkCisgIGZyb20gbmV4dF9pbi4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHJhdyBpbmZsYXRlLCBhbmQKKyAgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIHRoZSBmaXJzdCBpbmZsYXRlKCkgY2FsbCBhZnRlciBpbmZsYXRlSW5pdDIoKSBvcgorICBpbmZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlCisgIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdmFsdWUgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgaW5wdXQuCisKKyAgICAgSWYgYml0cyBpcyBuZWdhdGl2ZSwgdGhlbiB0aGUgaW5wdXQgc3RyZWFtIGJpdCBidWZmZXIgaXMgZW1wdGllZC4gIFRoZW4KKyAgaW5mbGF0ZVByaW1lKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB0byBwdXQgYml0cyBpbiB0aGUgYnVmZmVyLiAgVGhpcyBpcyB1c2VkCisgIHRvIGNsZWFyIG91dCBiaXRzIGxlZnRvdmVyIGFmdGVyIGZlZWRpbmcgaW5mbGF0ZSBhIGJsb2NrIGRlc2NyaXB0aW9uIHByaW9yCisgIHRvIGZlZWRpbmcgaW5mbGF0ZSBjb2Rlcy4KKworICAgICAgaW5mbGF0ZVByaW1lIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKK1pFWFRFUk4gbG9uZyBaRVhQT1JUIGluZmxhdGVNYXJrIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHR3byB2YWx1ZXMsIG9uZSBpbiB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgcmV0dXJuCisgICB2YWx1ZSwgYW5kIHRoZSBvdGhlciBpbiB0aGUgcmVtYWluaW5nIHVwcGVyIGJpdHMsIG9idGFpbmVkIGJ5IHNoaWZ0aW5nIHRoZQorICAgcmV0dXJuIHZhbHVlIGRvd24gMTYgYml0cy4gIElmIHRoZSB1cHBlciB2YWx1ZSBpcyAtMSBhbmQgdGhlIGxvd2VyIHZhbHVlIGlzCisgICB6ZXJvLCB0aGVuIGluZmxhdGUoKSBpcyBjdXJyZW50bHkgZGVjb2RpbmcgaW5mb3JtYXRpb24gb3V0c2lkZSBvZiBhIGJsb2NrLgorICAgSWYgdGhlIHVwcGVyIHZhbHVlIGlzIC0xIGFuZCB0aGUgbG93ZXIgdmFsdWUgaXMgbm9uLXplcm8sIHRoZW4gaW5mbGF0ZSBpcyBpbgorICAgdGhlIG1pZGRsZSBvZiBhIHN0b3JlZCBibG9jaywgd2l0aCB0aGUgbG93ZXIgdmFsdWUgZXF1YWxpbmcgdGhlIG51bWJlciBvZgorICAgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgcmVtYWluaW5nIHRvIGNvcHkuICBJZiB0aGUgdXBwZXIgdmFsdWUgaXMgbm90IC0xLCB0aGVuCisgICBpdCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgYmFjayBmcm9tIHRoZSBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgb2YKKyAgIHRoZSBjb2RlIChsaXRlcmFsIG9yIGxlbmd0aC9kaXN0YW5jZSBwYWlyKSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiAgSW4KKyAgIHRoYXQgY2FzZSB0aGUgbG93ZXIgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBhbHJlYWR5IGVtaXR0ZWQgZm9yIHRoYXQKKyAgIGNvZGUuCisKKyAgICAgQSBjb2RlIGlzIGJlaW5nIHByb2Nlc3NlZCBpZiBpbmZsYXRlIGlzIHdhaXRpbmcgZm9yIG1vcmUgaW5wdXQgdG8gY29tcGxldGUKKyAgIGRlY29kaW5nIG9mIHRoZSBjb2RlLCBvciBpZiBpdCBoYXMgY29tcGxldGVkIGRlY29kaW5nIGJ1dCBpcyB3YWl0aW5nIGZvcgorICAgbW9yZSBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgdGhlIGxpdGVyYWwgb3IgbWF0Y2ggZGF0YS4KKworICAgICAgaW5mbGF0ZU1hcmsoKSBpcyB1c2VkIHRvIG1hcmsgbG9jYXRpb25zIGluIHRoZSBpbnB1dCBkYXRhIGZvciByYW5kb20KKyAgIGFjY2Vzcywgd2hpY2ggbWF5IGJlIGF0IGJpdCBwb3NpdGlvbnMsIGFuZCB0byBub3RlIHRob3NlIGNhc2VzIHdoZXJlIHRoZQorICAgb3V0cHV0IG9mIGEgY29kZSBtYXkgc3BhbiBib3VuZGFyaWVzIG9mIHJhbmRvbSBhY2Nlc3MgYmxvY2tzLiAgVGhlIGN1cnJlbnQKKyAgIGxvY2F0aW9uIGluIHRoZSBpbnB1dCBzdHJlYW0gY2FuIGJlIGRldGVybWluZWQgZnJvbSBhdmFpbF9pbiBhbmQgZGF0YV90eXBlCisgICBhcyBub3RlZCBpbiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBaX0JMT0NLIGZsdXNoIHBhcmFtZXRlciBmb3IgaW5mbGF0ZS4KKworICAgICAgaW5mbGF0ZU1hcmsgcmV0dXJucyB0aGUgdmFsdWUgbm90ZWQgYWJvdmUgb3IgLTEgPDwgMTYgaWYgdGhlIHByb3ZpZGVkCisgICBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVHZXRIZWFkZXIgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnel9oZWFkZXJwIGhlYWQpKTsKKy8qCisgICAgICBpbmZsYXRlR2V0SGVhZGVyKCkgcmVxdWVzdHMgdGhhdCBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBiZSBzdG9yZWQgaW4gdGhlCisgICBwcm92aWRlZCBnel9oZWFkZXIgc3RydWN0dXJlLiAgaW5mbGF0ZUdldEhlYWRlcigpIG1heSBiZSBjYWxsZWQgYWZ0ZXIKKyAgIGluZmxhdGVJbml0MigpIG9yIGluZmxhdGVSZXNldCgpLCBhbmQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIG9mIGluZmxhdGUoKS4KKyAgIEFzIGluZmxhdGUoKSBwcm9jZXNzZXMgdGhlIGd6aXAgc3RyZWFtLCBoZWFkLT5kb25lIGlzIHplcm8gdW50aWwgdGhlIGhlYWRlcgorICAgaXMgY29tcGxldGVkLCBhdCB3aGljaCB0aW1lIGhlYWQtPmRvbmUgaXMgc2V0IHRvIG9uZS4gIElmIGEgemxpYiBzdHJlYW0gaXMKKyAgIGJlaW5nIGRlY29kZWQsIHRoZW4gaGVhZC0+ZG9uZSBpcyBzZXQgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSB3aWxsIGJlCisgICBubyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3J0aGNvbWluZy4gIE5vdGUgdGhhdCBaX0JMT0NLIG9yIFpfVFJFRVMgY2FuIGJlCisgICB1c2VkIHRvIGZvcmNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIgaGVhZGVyIHByb2Nlc3NpbmcgaXMKKyAgIGNvbXBsZXRlIGFuZCBiZWZvcmUgYW55IGFjdHVhbCBkYXRhIGlzIGRlY29tcHJlc3NlZC4KKworICAgICAgVGhlIHRleHQsIHRpbWUsIHhmbGFncywgYW5kIG9zIGZpZWxkcyBhcmUgZmlsbGVkIGluIHdpdGggdGhlIGd6aXAgaGVhZGVyCisgICBjb250ZW50cy4gIGhjcmMgaXMgc2V0IHRvIHRydWUgaWYgdGhlcmUgaXMgYSBoZWFkZXIgQ1JDLiAgKFRoZSBoZWFkZXIgQ1JDCisgICB3YXMgdmFsaWQgaWYgZG9uZSBpcyBzZXQgdG8gb25lLikgIElmIGV4dHJhIGlzIG5vdCBaX05VTEwsIHRoZW4gZXh0cmFfbWF4CisgICBjb250YWlucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgdG8gZXh0cmEuICBPbmNlIGRvbmUgaXMgdHJ1ZSwKKyAgIGV4dHJhX2xlbiBjb250YWlucyB0aGUgYWN0dWFsIGV4dHJhIGZpZWxkIGxlbmd0aCwgYW5kIGV4dHJhIGNvbnRhaW5zIHRoZQorICAgZXh0cmEgZmllbGQsIG9yIHRoYXQgZmllbGQgdHJ1bmNhdGVkIGlmIGV4dHJhX21heCBpcyBsZXNzIHRoYW4gZXh0cmFfbGVuLgorICAgSWYgbmFtZSBpcyBub3QgWl9OVUxMLCB0aGVuIHVwIHRvIG5hbWVfbWF4IGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gdGhlcmUsCisgICB0ZXJtaW5hdGVkIHdpdGggYSB6ZXJvIHVubGVzcyB0aGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBuYW1lX21heC4gIElmCisgICBjb21tZW50IGlzIG5vdCBaX05VTEwsIHRoZW4gdXAgdG8gY29tbV9tYXggY2hhcmFjdGVycyBhcmUgd3JpdHRlbiB0aGVyZSwKKyAgIHRlcm1pbmF0ZWQgd2l0aCBhIHplcm8gdW5sZXNzIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGNvbW1fbWF4LiAgV2hlbgorICAgYW55IG9mIGV4dHJhLCBuYW1lLCBvciBjb21tZW50IGFyZSBub3QgWl9OVUxMIGFuZCB0aGUgcmVzcGVjdGl2ZSBmaWVsZCBpcworICAgbm90IHByZXNlbnQgaW4gdGhlIGhlYWRlciwgdGhlbiB0aGF0IGZpZWxkIGlzIHNldCB0byBaX05VTEwgdG8gc2lnbmFsIGl0cworICAgYWJzZW5jZS4gIFRoaXMgYWxsb3dzIHRoZSB1c2Ugb2YgZGVmbGF0ZVNldEhlYWRlcigpIHdpdGggdGhlIHJldHVybmVkCisgICBzdHJ1Y3R1cmUgdG8gZHVwbGljYXRlIHRoZSBoZWFkZXIuICBIb3dldmVyIGlmIHRob3NlIGZpZWxkcyBhcmUgc2V0IHRvCisgICBhbGxvY2F0ZWQgbWVtb3J5LCB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5lZWQgdG8gc2F2ZSB0aG9zZSBwb2ludGVycworICAgZWxzZXdoZXJlIHNvIHRoYXQgdGhleSBjYW4gYmUgZXZlbnR1YWxseSBmcmVlZC4KKworICAgICAgSWYgaW5mbGF0ZUdldEhlYWRlciBpcyBub3QgdXNlZCwgdGhlbiB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIGlzIHNpbXBseQorICAgZGlzY2FyZGVkLiAgVGhlIGhlYWRlciBpcyBhbHdheXMgY2hlY2tlZCBmb3IgdmFsaWRpdHksIGluY2x1ZGluZyB0aGUgaGVhZGVyCisgICBDUkMgaWYgcHJlc2VudC4gIGluZmxhdGVSZXNldCgpIHdpbGwgcmVzZXQgdGhlIHByb2Nlc3MgdG8gZGlzY2FyZCB0aGUgaGVhZGVyCisgICBpbmZvcm1hdGlvbi4gIFRoZSBhcHBsaWNhdGlvbiB3b3VsZCBuZWVkIHRvIGNhbGwgaW5mbGF0ZUdldEhlYWRlcigpIGFnYWluIHRvCisgICByZXRyaWV2ZSB0aGUgaGVhZGVyIGZyb20gdGhlIG5leHQgZ3ppcCBzdHJlYW0uCisKKyAgICAgIGluZmxhdGVHZXRIZWFkZXIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorKi8KKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0IE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdykpOworCisgICAgIEluaXRpYWxpemUgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgZGVjb21wcmVzc2lvbiB1c2luZyBpbmZsYXRlQmFjaygpCisgICBjYWxscy4gIFRoZSBmaWVsZHMgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIGluIHN0cm0gbXVzdCBiZSBpbml0aWFsaXplZAorICAgYmVmb3JlIHRoZSBjYWxsLiAgSWYgemFsbG9jIGFuZCB6ZnJlZSBhcmUgWl9OVUxMLCB0aGVuIHRoZSBkZWZhdWx0IGxpYnJhcnktCisgICBkZXJpdmVkIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGFyZSB1c2VkLiAgd2luZG93Qml0cyBpcyB0aGUgYmFzZSB0d28KKyAgIGxvZ2FyaXRobSBvZiB0aGUgd2luZG93IHNpemUsIGluIHRoZSByYW5nZSA4Li4xNS4gIHdpbmRvdyBpcyBhIGNhbGxlcgorICAgc3VwcGxpZWQgYnVmZmVyIG9mIHRoYXQgc2l6ZS4gIEV4Y2VwdCBmb3Igc3BlY2lhbCBhcHBsaWNhdGlvbnMgd2hlcmUgaXQgaXMKKyAgIGFzc3VyZWQgdGhhdCBkZWZsYXRlIHdhcyB1c2VkIHdpdGggc21hbGwgd2luZG93IHNpemVzLCB3aW5kb3dCaXRzIG11c3QgYmUgMTUKKyAgIGFuZCBhIDMySyBieXRlIHdpbmRvdyBtdXN0IGJlIHN1cHBsaWVkIHRvIGJlIGFibGUgdG8gZGVjb21wcmVzcyBnZW5lcmFsCisgICBkZWZsYXRlIHN0cmVhbXMuCisKKyAgICAgU2VlIGluZmxhdGVCYWNrKCkgZm9yIHRoZSB1c2FnZSBvZiB0aGVzZSByb3V0aW5lcy4KKworICAgICBpbmZsYXRlQmFja0luaXQgd2lsbCByZXR1cm4gWl9PSyBvbiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiBhbnkgb2YKKyAgIHRoZSBwYXJhbWF0ZXJzIGFyZSBpbnZhbGlkLCBaX01FTV9FUlJPUiBpZiB0aGUgaW50ZXJuYWwgc3RhdGUgY291bGQgbm90CisgICBiZSBhbGxvY2F0ZWQsIG9yIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBkb2VzIG5vdAorICAgbWF0Y2ggdGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlciBmaWxlLgorKi8KKwordHlwZWRlZiB1bnNpZ25lZCAoKmluX2Z1bmMpIE9GKCh2b2lkIEZBUiAqLCB1bnNpZ25lZCBjaGFyIEZBUiAqIEZBUiAqKSk7Cit0eXBlZGVmIGludCAoKm91dF9mdW5jKSBPRigodm9pZCBGQVIgKiwgdW5zaWduZWQgY2hhciBGQVIgKiwgdW5zaWduZWQpKTsKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFjayBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9mdW5jIGluLCB2b2lkIEZBUiAqaW5fZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9mdW5jIG91dCwgdm9pZCBGQVIgKm91dF9kZXNjKSk7CisvKgorICAgICBpbmZsYXRlQmFjaygpIGRvZXMgYSByYXcgaW5mbGF0ZSB3aXRoIGEgc2luZ2xlIGNhbGwgdXNpbmcgYSBjYWxsLWJhY2sKKyAgIGludGVyZmFjZSBmb3IgaW5wdXQgYW5kIG91dHB1dC4gIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBpbmZsYXRlKCkgZm9yCisgICBmaWxlIGkvbyBhcHBsaWNhdGlvbnMgaW4gdGhhdCBpdCBhdm9pZHMgY29weWluZyBiZXR3ZWVuIHRoZSBvdXRwdXQgYW5kIHRoZQorICAgc2xpZGluZyB3aW5kb3cgYnkgc2ltcGx5IG1ha2luZyB0aGUgd2luZG93IGl0c2VsZiB0aGUgb3V0cHV0IGJ1ZmZlci4gIFRoaXMKKyAgIGZ1bmN0aW9uIHRydXN0cyB0aGUgYXBwbGljYXRpb24gdG8gbm90IGNoYW5nZSB0aGUgb3V0cHV0IGJ1ZmZlciBwYXNzZWQgYnkKKyAgIHRoZSBvdXRwdXQgZnVuY3Rpb24sIGF0IGxlYXN0IHVudGlsIGluZmxhdGVCYWNrKCkgcmV0dXJucy4KKworICAgICBpbmZsYXRlQmFja0luaXQoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgc3RhdGUKKyAgIGFuZCB0byBpbml0aWFsaXplIHRoZSBzdGF0ZSB3aXRoIHRoZSB1c2VyLXByb3ZpZGVkIHdpbmRvdyBidWZmZXIuCisgICBpbmZsYXRlQmFjaygpIG1heSB0aGVuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXMgdG8gaW5mbGF0ZSBhIGNvbXBsZXRlLCByYXcKKyAgIGRlZmxhdGUgc3RyZWFtIHdpdGggZWFjaCBjYWxsLiAgaW5mbGF0ZUJhY2tFbmQoKSBpcyB0aGVuIGNhbGxlZCB0byBmcmVlCisgICB0aGUgYWxsb2NhdGVkIHN0YXRlLgorCisgICAgIEEgcmF3IGRlZmxhdGUgc3RyZWFtIGlzIG9uZSB3aXRoIG5vIHpsaWIgb3IgZ3ppcCBoZWFkZXIgb3IgdHJhaWxlci4KKyAgIFRoaXMgcm91dGluZSB3b3VsZCBub3JtYWxseSBiZSB1c2VkIGluIGEgdXRpbGl0eSB0aGF0IHJlYWRzIHppcCBvciBnemlwCisgICBmaWxlcyBhbmQgd3JpdGVzIG91dCB1bmNvbXByZXNzZWQgZmlsZXMuICBUaGUgdXRpbGl0eSB3b3VsZCBkZWNvZGUgdGhlCisgICBoZWFkZXIgYW5kIHByb2Nlc3MgdGhlIHRyYWlsZXIgb24gaXRzIG93biwgaGVuY2UgdGhpcyByb3V0aW5lIGV4cGVjdHMKKyAgIG9ubHkgdGhlIHJhdyBkZWZsYXRlIHN0cmVhbSB0byBkZWNvbXByZXNzLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgIG5vcm1hbCBiZWhhdmlvciBvZiBpbmZsYXRlKCksIHdoaWNoIGV4cGVjdHMgZWl0aGVyIGEgemxpYiBvciBnemlwIGhlYWRlciBhbmQKKyAgIHRyYWlsZXIgYXJvdW5kIHRoZSBkZWZsYXRlIHN0cmVhbS4KKworICAgICBpbmZsYXRlQmFjaygpIHVzZXMgdHdvIHN1YnJvdXRpbmVzIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIgdGhhdCBhcmUgdGhlbgorICAgY2FsbGVkIGJ5IGluZmxhdGVCYWNrKCkgZm9yIGlucHV0IGFuZCBvdXRwdXQuICBpbmZsYXRlQmFjaygpIGNhbGxzIHRob3NlCisgICByb3V0aW5lcyB1bnRpbCBpdCByZWFkcyBhIGNvbXBsZXRlIGRlZmxhdGUgc3RyZWFtIGFuZCB3cml0ZXMgb3V0IGFsbCBvZiB0aGUKKyAgIHVuY29tcHJlc3NlZCBkYXRhLCBvciB1bnRpbCBpdCBlbmNvdW50ZXJzIGFuIGVycm9yLiAgVGhlIGZ1bmN0aW9uJ3MKKyAgIHBhcmFtZXRlcnMgYW5kIHJldHVybiB0eXBlcyBhcmUgZGVmaW5lZCBhYm92ZSBpbiB0aGUgaW5fZnVuYyBhbmQgb3V0X2Z1bmMKKyAgIHR5cGVkZWZzLiAgaW5mbGF0ZUJhY2soKSB3aWxsIGNhbGwgaW4oaW5fZGVzYywgJmJ1Zikgd2hpY2ggc2hvdWxkIHJldHVybiB0aGUKKyAgIG51bWJlciBvZiBieXRlcyBvZiBwcm92aWRlZCBpbnB1dCwgYW5kIGEgcG9pbnRlciB0byB0aGF0IGlucHV0IGluIGJ1Zi4gIElmCisgICB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUsIGluKCkgbXVzdCByZXR1cm4gemVyby0tYnVmIGlzIGlnbm9yZWQgaW4gdGhhdAorICAgY2FzZS0tYW5kIGluZmxhdGVCYWNrKCkgd2lsbCByZXR1cm4gYSBidWZmZXIgZXJyb3IuICBpbmZsYXRlQmFjaygpIHdpbGwgY2FsbAorICAgb3V0KG91dF9kZXNjLCBidWYsIGxlbikgdG8gd3JpdGUgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGJ1ZlswLi5sZW4tMV0uICBvdXQoKQorICAgc2hvdWxkIHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIG5vbi16ZXJvIG9uIGZhaWx1cmUuICBJZiBvdXQoKSByZXR1cm5zCisgICBub24temVybywgaW5mbGF0ZUJhY2soKSB3aWxsIHJldHVybiB3aXRoIGFuIGVycm9yLiAgTmVpdGhlciBpbigpIG5vciBvdXQoKQorICAgYXJlIHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSB3aW5kb3cgcHJvdmlkZWQgdG8KKyAgIGluZmxhdGVCYWNrSW5pdCgpLCB3aGljaCBpcyBhbHNvIHRoZSBidWZmZXIgdGhhdCBvdXQoKSB1c2VzIHRvIHdyaXRlIGZyb20uCisgICBUaGUgbGVuZ3RoIHdyaXR0ZW4gYnkgb3V0KCkgd2lsbCBiZSBhdCBtb3N0IHRoZSB3aW5kb3cgc2l6ZS4gIEFueSBub24temVybworICAgYW1vdW50IG9mIGlucHV0IG1heSBiZSBwcm92aWRlZCBieSBpbigpLgorCisgICAgIEZvciBjb252ZW5pZW5jZSwgaW5mbGF0ZUJhY2soKSBjYW4gYmUgcHJvdmlkZWQgaW5wdXQgb24gdGhlIGZpcnN0IGNhbGwgYnkKKyAgIHNldHRpbmcgc3RybS0+bmV4dF9pbiBhbmQgc3RybS0+YXZhaWxfaW4uICBJZiB0aGF0IGlucHV0IGlzIGV4aGF1c3RlZCwgdGhlbgorICAgaW4oKSB3aWxsIGJlIGNhbGxlZC4gIFRoZXJlZm9yZSBzdHJtLT5uZXh0X2luIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlCisgICBjYWxsaW5nIGluZmxhdGVCYWNrKCkuICBJZiBzdHJtLT5uZXh0X2luIGlzIFpfTlVMTCwgdGhlbiBpbigpIHdpbGwgYmUgY2FsbGVkCisgICBpbW1lZGlhdGVseSBmb3IgaW5wdXQuICBJZiBzdHJtLT5uZXh0X2luIGlzIG5vdCBaX05VTEwsIHRoZW4gc3RybS0+YXZhaWxfaW4KKyAgIG11c3QgYWxzbyBiZSBpbml0aWFsaXplZCwgYW5kIHRoZW4gaWYgc3RybS0+YXZhaWxfaW4gaXMgbm90IHplcm8sIGlucHV0IHdpbGwKKyAgIGluaXRpYWxseSBiZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW5bMCAuLiBzdHJtLT5hdmFpbF9pbiAtIDFdLgorCisgICAgIFRoZSBpbl9kZXNjIGFuZCBvdXRfZGVzYyBwYXJhbWV0ZXJzIG9mIGluZmxhdGVCYWNrKCkgaXMgcGFzc2VkIGFzIHRoZQorICAgZmlyc3QgcGFyYW1ldGVyIG9mIGluKCkgYW5kIG91dCgpIHJlc3BlY3RpdmVseSB3aGVuIHRoZXkgYXJlIGNhbGxlZC4gIFRoZXNlCisgICBkZXNjcmlwdG9ycyBjYW4gYmUgb3B0aW9uYWxseSB1c2VkIHRvIHBhc3MgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGNhbGxlci0KKyAgIHN1cHBsaWVkIGluKCkgYW5kIG91dCgpIGZ1bmN0aW9ucyBuZWVkIHRvIGRvIHRoZWlyIGpvYi4KKworICAgICBPbiByZXR1cm4sIGluZmxhdGVCYWNrKCkgd2lsbCBzZXQgc3RybS0+bmV4dF9pbiBhbmQgc3RybS0+YXZhaWxfaW4gdG8KKyAgIHBhc3MgYmFjayBhbnkgdW51c2VkIGlucHV0IHRoYXQgd2FzIHByb3ZpZGVkIGJ5IHRoZSBsYXN0IGluKCkgY2FsbC4gIFRoZQorICAgcmV0dXJuIHZhbHVlcyBvZiBpbmZsYXRlQmFjaygpIGNhbiBiZSBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9CVUZfRVJST1IKKyAgIGlmIGluKCkgb3Igb3V0KCkgcmV0dXJuZWQgYW4gZXJyb3IsIFpfREFUQV9FUlJPUiBpZiB0aGVyZSB3YXMgYSBmb3JtYXQKKyAgIGVycm9yIGluIHRoZSBkZWZsYXRlIHN0cmVhbSAoaW4gd2hpY2ggY2FzZSBzdHJtLT5tc2cgaXMgc2V0IHRvIGluZGljYXRlIHRoZQorICAgbmF0dXJlIG9mIHRoZSBlcnJvciksIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gd2FzIG5vdCBwcm9wZXJseQorICAgaW5pdGlhbGl6ZWQuICBJbiB0aGUgY2FzZSBvZiBaX0JVRl9FUlJPUiwgYW4gaW5wdXQgb3Igb3V0cHV0IGVycm9yIGNhbiBiZQorICAgZGlzdGluZ3Vpc2hlZCB1c2luZyBzdHJtLT5uZXh0X2luIHdoaWNoIHdpbGwgYmUgWl9OVUxMIG9ubHkgaWYgaW4oKSByZXR1cm5lZAorICAgYW4gZXJyb3IuICBJZiBzdHJtLT5uZXh0X2luIGlzIG5vdCBaX05VTEwsIHRoZW4gdGhlIFpfQlVGX0VSUk9SIHdhcyBkdWUgdG8KKyAgIG91dCgpIHJldHVybmluZyBub24temVyby4gIChpbigpIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBiZWZvcmUgb3V0KCksIHNvCisgICBzdHJtLT5uZXh0X2luIGlzIGFzc3VyZWQgdG8gYmUgZGVmaW5lZCBpZiBvdXQoKSByZXR1cm5zIG5vbi16ZXJvLikgIE5vdGUKKyAgIHRoYXQgaW5mbGF0ZUJhY2soKSBjYW5ub3QgcmV0dXJuIFpfT0suCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgQWxsIG1lbW9yeSBhbGxvY2F0ZWQgYnkgaW5mbGF0ZUJhY2tJbml0KCkgaXMgZnJlZWQuCisKKyAgICAgaW5mbGF0ZUJhY2tFbmQoKSByZXR1cm5zIFpfT0sgb24gc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbQorICAgc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCB6bGliQ29tcGlsZUZsYWdzIE9GKCh2b2lkKSk7CisvKiBSZXR1cm4gZmxhZ3MgaW5kaWNhdGluZyBjb21waWxlLXRpbWUgb3B0aW9ucy4KKworICAgIFR5cGUgc2l6ZXMsIHR3byBiaXRzIGVhY2gsIDAwID0gMTYgYml0cywgMDEgPSAzMiwgMTAgPSA2NCwgMTEgPSBvdGhlcjoKKyAgICAgMS4wOiBzaXplIG9mIHVJbnQKKyAgICAgMy4yOiBzaXplIG9mIHVMb25nCisgICAgIDUuNDogc2l6ZSBvZiB2b2lkcGYgKHBvaW50ZXIpCisgICAgIDcuNjogc2l6ZSBvZiB6X29mZl90CisKKyAgICBDb21waWxlciwgYXNzZW1ibGVyLCBhbmQgZGVidWcgb3B0aW9uczoKKyAgICAgODogREVCVUcKKyAgICAgOTogQVNNViBvciBBU01JTkYgLS0gdXNlIEFTTSBjb2RlCisgICAgIDEwOiBaTElCX1dJTkFQSSAtLSBleHBvcnRlZCBmdW5jdGlvbnMgdXNlIHRoZSBXSU5BUEkgY2FsbGluZyBjb252ZW50aW9uCisgICAgIDExOiAwIChyZXNlcnZlZCkKKworICAgIE9uZS10aW1lIHRhYmxlIGJ1aWxkaW5nIChzbWFsbGVyIGNvZGUsIGJ1dCBub3QgdGhyZWFkLXNhZmUgaWYgdHJ1ZSk6CisgICAgIDEyOiBCVUlMREZJWEVEIC0tIGJ1aWxkIHN0YXRpYyBibG9jayBkZWNvZGluZyB0YWJsZXMgd2hlbiBuZWVkZWQKKyAgICAgMTM6IERZTkFNSUNfQ1JDX1RBQkxFIC0tIGJ1aWxkIENSQyBjYWxjdWxhdGlvbiB0YWJsZXMgd2hlbiBuZWVkZWQKKyAgICAgMTQsMTU6IDAgKHJlc2VydmVkKQorCisgICAgTGlicmFyeSBjb250ZW50IChpbmRpY2F0ZXMgbWlzc2luZyBmdW5jdGlvbmFsaXR5KToKKyAgICAgMTY6IE5PX0daQ09NUFJFU1MgLS0gZ3oqIGZ1bmN0aW9ucyBjYW5ub3QgY29tcHJlc3MgKHRvIGF2b2lkIGxpbmtpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbGF0ZSBjb2RlIHdoZW4gbm90IG5lZWRlZCkKKyAgICAgMTc6IE5PX0daSVAgLS0gZGVmbGF0ZSBjYW4ndCB3cml0ZSBnemlwIHN0cmVhbXMsIGFuZCBpbmZsYXRlIGNhbid0IGRldGVjdAorICAgICAgICAgICAgICAgICAgICBhbmQgZGVjb2RlIGd6aXAgc3RyZWFtcyAodG8gYXZvaWQgbGlua2luZyBjcmMgY29kZSkKKyAgICAgMTgtMTk6IDAgKHJlc2VydmVkKQorCisgICAgT3BlcmF0aW9uIHZhcmlhdGlvbnMgKGNoYW5nZXMgaW4gbGlicmFyeSBmdW5jdGlvbmFsaXR5KToKKyAgICAgMjA6IFBLWklQX0JVR19XT1JLQVJPVU5EIC0tIHNsaWdodGx5IG1vcmUgcGVybWlzc2l2ZSBpbmZsYXRlCisgICAgIDIxOiBGQVNURVNUIC0tIGRlZmxhdGUgYWxnb3JpdGhtIHdpdGggb25seSBvbmUsIGxvd2VzdCBjb21wcmVzc2lvbiBsZXZlbAorICAgICAyMiwyMzogMCAocmVzZXJ2ZWQpCisKKyAgICBUaGUgc3ByaW50ZiB2YXJpYW50IHVzZWQgYnkgZ3pwcmludGYgKHplcm8gaXMgYmVzdCk6CisgICAgIDI0OiAwID0gdnMqLCAxID0gcyogLS0gMSBtZWFucyBsaW1pdGVkIHRvIDIwIGFyZ3VtZW50cyBhZnRlciB0aGUgZm9ybWF0CisgICAgIDI1OiAwID0gKm5wcmludGYsIDEgPSAqcHJpbnRmIC0tIDEgbWVhbnMgZ3pwcmludGYoKSBub3Qgc2VjdXJlIQorICAgICAyNjogMCA9IHJldHVybnMgdmFsdWUsIDEgPSB2b2lkIC0tIDEgbWVhbnMgaW5mZXJyZWQgc3RyaW5nIGxlbmd0aCByZXR1cm5lZAorCisgICAgUmVtYWluZGVyOgorICAgICAyNy0zMTogMCAocmVzZXJ2ZWQpCisgKi8KKworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB1dGlsaXR5IGZ1bmN0aW9ucyAqLworCisvKgorICAgICBUaGUgZm9sbG93aW5nIHV0aWxpdHkgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgdGhlCisgICBiYXNpYyBzdHJlYW0tb3JpZW50ZWQgZnVuY3Rpb25zLiBUbyBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlLCBzb21lCisgICBkZWZhdWx0IG9wdGlvbnMgYXJlIGFzc3VtZWQgKGNvbXByZXNzaW9uIGxldmVsIGFuZCBtZW1vcnkgdXNhZ2UsCisgICBzdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMpLiBUaGUgc291cmNlIGNvZGUgb2YgdGhlc2UKKyAgIHV0aWxpdHkgZnVuY3Rpb25zIGNhbiBlYXNpbHkgYmUgbW9kaWZpZWQgaWYgeW91IG5lZWQgc3BlY2lhbCBvcHRpb25zLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBjb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKSk7CisvKgorICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcworICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbAorICAgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IHRoZSB2YWx1ZSByZXR1cm5lZAorICAgYnkgY29tcHJlc3NCb3VuZChzb3VyY2VMZW4pLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQorICAgY29tcHJlc3NlZCBidWZmZXIuCisgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCisgICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCisgICAgIGNvbXByZXNzIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKKyAgIGJ1ZmZlci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgY29tcHJlc3MyIE9GKChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkpOworLyoKKyAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIFRoZSBsZXZlbAorICAgcGFyYW1ldGVyIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGluIGRlZmxhdGVJbml0LiAgc291cmNlTGVuIGlzIHRoZSBieXRlCisgICBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCisgICBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgICBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbikuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCisgICBjb21wcmVzc2VkIGJ1ZmZlci4KKworICAgICBjb21wcmVzczIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIsCisgICBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgbGV2ZWwgcGFyYW1ldGVyIGlzIGludmFsaWQuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgY29tcHJlc3NCb3VuZCBPRigodUxvbmcgc291cmNlTGVuKSk7CisvKgorICAgICBjb21wcmVzc0JvdW5kKCkgcmV0dXJucyBhbiB1cHBlciBib3VuZCBvbiB0aGUgY29tcHJlc3NlZCBzaXplIGFmdGVyCisgICBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIG9uIHNvdXJjZUxlbiBieXRlcy4gIEl0IHdvdWxkIGJlIHVzZWQgYmVmb3JlCisgICBhIGNvbXByZXNzKCkgb3IgY29tcHJlc3MyKCkgY2FsbCB0byBhbGxvY2F0ZSB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCB1bmNvbXByZXNzIE9GKChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgRGVjb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcworICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbAorICAgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZQorICAgZW50aXJlIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgaGF2ZQorICAgYmVlbiBzYXZlZCBwcmV2aW91c2x5IGJ5IHRoZSBjb21wcmVzc29yIGFuZCB0cmFuc21pdHRlZCB0byB0aGUgZGVjb21wcmVzc29yCisgICBieSBzb21lIG1lY2hhbmlzbSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNvbXByZXNzaW9uIGxpYnJhcnkuKQorICAgVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGJ1ZmZlci4KKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBkZWNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQorICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgorCisgICAgIHVuY29tcHJlc3MgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAorICAgYnVmZmVyLCBvciBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzIGNvcnJ1cHRlZCBvciBpbmNvbXBsZXRlLgorKi8KKworCit0eXBlZGVmIHZvaWRwIGd6RmlsZTsKKworLyoKK1pFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuICBPRigoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSkpOworCisgICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuIFRoZSBtb2RlIHBhcmFtZXRlcgorICAgaXMgYXMgaW4gZm9wZW4gKCJyYiIgb3IgIndiIikgYnV0IGNhbiBhbHNvIGluY2x1ZGUgYSBjb21wcmVzc2lvbiBsZXZlbAorICAgKCJ3YjkiKSBvciBhIHN0cmF0ZWd5OiAnZicgZm9yIGZpbHRlcmVkIGRhdGEgYXMgaW4gIndiNmYiLCAnaCcgZm9yCisgICBIdWZmbWFuIG9ubHkgY29tcHJlc3Npb24gYXMgaW4gIndiMWgiLCBvciAnUicgZm9yIHJ1bi1sZW5ndGggZW5jb2RpbmcKKyAgIGFzIGluICJ3YjFSIi4gKFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZUluaXQyIGZvciBtb3JlIGluZm9ybWF0aW9uCisgICBhYm91dCB0aGUgc3RyYXRlZ3kgcGFyYW1ldGVyLikKKworICAgICBnem9wZW4gY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGZpbGUgd2hpY2ggaXMgbm90IGluIGd6aXAgZm9ybWF0OyBpbiB0aGlzCisgICBjYXNlIGd6cmVhZCB3aWxsIGRpcmVjdGx5IHJlYWQgZnJvbSB0aGUgZmlsZSB3aXRob3V0IGRlY29tcHJlc3Npb24uCisKKyAgICAgZ3pvcGVuIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIG9yIGlmIHRoZXJlIHdhcworICAgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlOyBlcnJubworICAgY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyAoaWYgZXJybm8gaXMgemVybywgdGhlCisgICB6bGliIGVycm9yIGlzIFpfTUVNX0VSUk9SKS4gICovCisKK1pFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pkb3BlbiAgT0YoKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSkpOworLyoKKyAgICAgZ3pkb3BlbigpIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZQorICAgZGVzY3JpcHRvcnMgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yCisgICBmaWxlbm8gKGluIHRoZSBmaWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLgorICAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIGd6b3Blbi4KKyAgICAgVGhlIG5leHQgY2FsbCBvZiBnemNsb3NlIG9uIHRoZSByZXR1cm5lZCBnekZpbGUgd2lsbCBhbHNvIGNsb3NlIHRoZQorICAgZmlsZSBkZXNjcmlwdG9yIGZkLCBqdXN0IGxpa2UgZmNsb3NlKGZkb3BlbihmZCksIG1vZGUpIGNsb3NlcyB0aGUgZmlsZQorICAgZGVzY3JpcHRvciBmZC4gSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgZ3pkb3BlbihkdXAoZmQpLCBtb2RlKS4KKyAgICAgZ3pkb3BlbiByZXR1cm5zIE5VTEwgaWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUKKyAgIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6c2V0cGFyYW1zIE9GKChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpKTsKKy8qCisgICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3Igc3RyYXRlZ3kuIFNlZSB0aGUgZGVzY3JpcHRpb24KKyAgIG9mIGRlZmxhdGVJbml0MiBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlc2UgcGFyYW1ldGVycy4KKyAgICAgZ3pzZXRwYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBmaWxlIHdhcyBub3QKKyAgIG9wZW5lZCBmb3Igd3JpdGluZy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pyZWFkICBPRigoZ3pGaWxlIGZpbGUsIHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKSk7CisvKgorICAgICBSZWFkcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBJZiB0aGUgaW5wdXQgZmlsZSB3YXMgbm90IGluIGd6aXAgZm9ybWF0LCBnenJlYWQgY29waWVzIHRoZSBnaXZlbiBudW1iZXIKKyAgIG9mIGJ5dGVzIGludG8gdGhlIGJ1ZmZlci4KKyAgICAgZ3pyZWFkIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgcmVhZCAoMCBmb3IKKyAgIGVuZCBvZiBmaWxlLCAtMSBmb3IgZXJyb3IpLiAqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6d3JpdGUgT0YoKGd6RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkcGMgYnVmLCB1bnNpZ25lZCBsZW4pKTsKKy8qCisgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBnendyaXRlIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbgorICAgKDAgaW4gY2FzZSBvZiBlcnJvcikuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUVkEgICBnenByaW50ZiBPRigoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSk7CisvKgorICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJncyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCisgICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiBnenByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLiAgVGhlIG51bWJlciBvZgorICAgdW5jb21wcmVzc2VkIGJ5dGVzIHdyaXR0ZW4gaXMgbGltaXRlZCB0byA0MDk1LiBUaGUgY2FsbGVyIHNob3VsZCBhc3N1cmUgdGhhdAorICAgdGhpcyBsaW1pdCBpcyBub3QgZXhjZWVkZWQuIElmIGl0IGlzIGV4Y2VlZGVkLCB0aGVuIGd6cHJpbnRmKCkgd2lsbCByZXR1cm4KKyAgIHJldHVybiBhbiBlcnJvciAoMCkgd2l0aCBub3RoaW5nIHdyaXR0ZW4uIEluIHRoaXMgY2FzZSwgdGhlcmUgbWF5IGFsc28gYmUgYQorICAgYnVmZmVyIG92ZXJmbG93IHdpdGggdW5wcmVkaWN0YWJsZSBjb25zZXF1ZW5jZXMsIHdoaWNoIGlzIHBvc3NpYmxlIG9ubHkgaWYKKyAgIHpsaWIgd2FzIGNvbXBpbGVkIHdpdGggdGhlIGluc2VjdXJlIGZ1bmN0aW9ucyBzcHJpbnRmKCkgb3IgdnNwcmludGYoKQorICAgYmVjYXVzZSB0aGUgc2VjdXJlIHNucHJpbnRmKCkgb3IgdnNucHJpbnRmKCkgZnVuY3Rpb25zIHdlcmUgbm90IGF2YWlsYWJsZS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pwdXRzIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcykpOworLyoKKyAgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgY29tcHJlc3NlZCBmaWxlLCBleGNsdWRpbmcKKyAgIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3Rlci4KKyAgICAgIGd6cHV0cyByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorKi8KKworWkVYVEVSTiBjaGFyICogWkVYUE9SVCBnemdldHMgT0YoKGd6RmlsZSBmaWxlLCBjaGFyICpidWYsIGludCBsZW4pKTsKKy8qCisgICAgICBSZWFkcyBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUgdW50aWwgbGVuLTEgY2hhcmFjdGVycyBhcmUgcmVhZCwgb3IKKyAgIGEgbmV3bGluZSBjaGFyYWN0ZXIgaXMgcmVhZCBhbmQgdHJhbnNmZXJyZWQgdG8gYnVmLCBvciBhbiBlbmQtb2YtZmlsZQorICAgY29uZGl0aW9uIGlzIGVuY291bnRlcmVkLiAgVGhlIHN0cmluZyBpcyB0aGVuIHRlcm1pbmF0ZWQgd2l0aCBhIG51bGwKKyAgIGNoYXJhY3Rlci4KKyAgICAgIGd6Z2V0cyByZXR1cm5zIGJ1Ziwgb3IgWl9OVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6cHV0YyBPRigoZ3pGaWxlIGZpbGUsIGludCBjKSk7CisvKgorICAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBnenB1dGMgcmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pnZXRjIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gZ3pnZXRjIHJldHVybnMgdGhpcyBieXRlCisgICBvciAtMSBpbiBjYXNlIG9mIGVuZCBvZiBmaWxlIG9yIGVycm9yLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenVuZ2V0YyBPRigoaW50IGMsIGd6RmlsZSBmaWxlKSk7CisvKgorICAgICAgUHVzaCBvbmUgY2hhcmFjdGVyIGJhY2sgb250byB0aGUgc3RyZWFtIHRvIGJlIHJlYWQgYWdhaW4gbGF0ZXIuCisgICBPbmx5IG9uZSBjaGFyYWN0ZXIgb2YgcHVzaC1iYWNrIGlzIGFsbG93ZWQuICBnenVuZ2V0YygpIHJldHVybnMgdGhlCisgICBjaGFyYWN0ZXIgcHVzaGVkLCBvciAtMSBvbiBmYWlsdXJlLiAgZ3p1bmdldGMoKSB3aWxsIGZhaWwgaWYgYQorICAgY2hhcmFjdGVyIGhhcyBiZWVuIHB1c2hlZCBidXQgbm90IHJlYWQgeWV0LCBvciBpZiBjIGlzIC0xLiBUaGUgcHVzaGVkCisgICBjaGFyYWN0ZXIgd2lsbCBiZSBkaXNjYXJkZWQgaWYgdGhlIHN0cmVhbSBpcyByZXBvc2l0aW9uZWQgd2l0aCBnenNlZWsoKQorICAgb3IgZ3pyZXdpbmQoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pmbHVzaCBPRigoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCkpOworLyoKKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCisgICBmbHVzaCBpcyBhcyBpbiB0aGUgZGVmbGF0ZSgpIGZ1bmN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCisgICBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiBnemVycm9yIGJlbG93KS4gZ3pmbHVzaCByZXR1cm5zIFpfT0sgaWYKKyAgIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaXMgWl9GSU5JU0ggYW5kIGFsbCBvdXRwdXQgY291bGQgYmUgZmx1c2hlZC4KKyAgICAgZ3pmbHVzaCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBzdHJpY3RseSBuZWNlc3NhcnkgYmVjYXVzZSBpdCBjYW4KKyAgIGRlZ3JhZGUgY29tcHJlc3Npb24uCisqLworCisvKgorWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3pzZWVrIE9GKChnekZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9vZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpKTsKKworICAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZQorICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGUgb2Zmc2V0IHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uIFRoZSB3aGVuY2UgcGFyYW1ldGVyIGlzIGRlZmluZWQgYXMgaW4gbHNlZWsoMik7CisgICB0aGUgdmFsdWUgU0VFS19FTkQgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgSWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciByZWFkaW5nLCB0aGlzIGZ1bmN0aW9uIGlzIGVtdWxhdGVkIGJ1dCBjYW4gYmUKKyAgIGV4dHJlbWVseSBzbG93LiBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcsIG9ubHkgZm9yd2FyZCBzZWVrcyBhcmUKKyAgIHN1cHBvcnRlZDsgZ3pzZWVrIHRoZW4gY29tcHJlc3NlcyBhIHNlcXVlbmNlIG9mIHplcm9lcyB1cCB0byB0aGUgbmV3CisgICBzdGFydGluZyBwb3NpdGlvbi4KKworICAgICAgZ3pzZWVrIHJldHVybnMgdGhlIHJlc3VsdGluZyBvZmZzZXQgbG9jYXRpb24gYXMgbWVhc3VyZWQgaW4gYnl0ZXMgZnJvbQorICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbSwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvciwgaW4KKyAgIHBhcnRpY3VsYXIgaWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciB3cml0aW5nIGFuZCB0aGUgbmV3IHN0YXJ0aW5nIHBvc2l0aW9uCisgICB3b3VsZCBiZSBiZWZvcmUgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6cmV3aW5kIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgUmV3aW5kcyB0aGUgZ2l2ZW4gZmlsZS4gVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3J0ZWQgb25seSBmb3IgcmVhZGluZy4KKworICAgZ3pyZXdpbmQoZmlsZSkgaXMgZXF1aXZhbGVudCB0byAoaW50KWd6c2VlayhmaWxlLCAwTCwgU0VFS19TRVQpCisqLworCisvKgorWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3p0ZWxsIE9GKChnekZpbGUgZmlsZSkpOworCisgICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhpcyBwb3NpdGlvbiByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLgorCisgICBnenRlbGwoZmlsZSkgaXMgZXF1aXZhbGVudCB0byBnenNlZWsoZmlsZSwgMEwsIFNFRUtfQ1VSKQorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemVvZiBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJldHVybnMgMSB3aGVuIEVPRiBoYXMgcHJldmlvdXNseSBiZWVuIGRldGVjdGVkIHJlYWRpbmcgdGhlIGdpdmVuCisgICBpbnB1dCBzdHJlYW0sIG90aGVyd2lzZSB6ZXJvLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemRpcmVjdCBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJldHVybnMgMSBpZiBmaWxlIGlzIGJlaW5nIHJlYWQgZGlyZWN0bHkgd2l0aG91dCBkZWNvbXByZXNzaW9uLCBvdGhlcndpc2UKKyAgIHplcm8uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6Y2xvc2UgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCisgICBhbmQgZGVhbGxvY2F0ZXMgYWxsIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIKKyAgIGVycm9yIG51bWJlci4gIE5vdGUgdGhhdCBvbmNlIGZpbGUgaXMgY2xvc2UsIHlvdSBjYW5ub3QgY2FsbCBnemVycm9yIHdpdGgKKyAgIGZpbGUsIHNpbmNlIGl0cyBzdHJ1Y3R1cmVzIGhhdmUgYmVlbiBkZWFsbG9jYXRlZC4KKyovCisKK1pFWFRFUk4gY29uc3QgY2hhciAqIFpFWFBPUlQgZ3plcnJvciBPRigoZ3pGaWxlIGZpbGUsIGludCAqZXJybnVtKSk7CisvKgorICAgICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gZXJybnVtIGlzIHNldCB0byB6bGliIGVycm9yIG51bWJlci4gSWYgYW4KKyAgIGVycm9yIG9jY3VycmVkIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgbm90IGluIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5LAorICAgZXJybnVtIGlzIHNldCB0byBaX0VSUk5PIGFuZCB0aGUgYXBwbGljYXRpb24gbWF5IGNvbnN1bHQgZXJybm8KKyAgIHRvIGdldCB0aGUgZXhhY3QgZXJyb3IgY29kZS4KKworICAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nIGFuZCBmdXR1cmUgY2FsbHMgdG8KKyAgIHRoaXMgZnVuY3Rpb24gbWF5IGludmFsaWRhdGUgdGhlIHJldHVybmVkIHN0cmluZy4KKyovCisKK1pFWFRFUk4gdm9pZCBaRVhQT1JUIGd6Y2xlYXJlcnIgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBDbGVhcnMgdGhlIGVycm9yIGFuZCBlbmQtb2YtZmlsZSBmbGFncyBmb3IgZmlsZS4gVGhpcyBpcyBhbmFsb2dvdXMgdG8gdGhlCisgICBjbGVhcmVycigpIGZ1bmN0aW9uIGluIHN0ZGlvLiBUaGlzIGlzIHVzZWZ1bCBmb3IgY29udGludWluZyB0byByZWFkIGEgZ3ppcAorICAgZmlsZSB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gY29uY3VycmVudGx5LgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2tzdW0gZnVuY3Rpb25zICovCisKKy8qCisgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHJlbGF0ZWQgdG8gY29tcHJlc3Npb24gYnV0IGFyZSBleHBvcnRlZAorICAgYW55d2F5IGJlY2F1c2UgdGhleSBtaWdodCBiZSB1c2VmdWwgaW4gYXBwbGljYXRpb25zIHVzaW5nIHRoZQorICAgY29tcHJlc3Npb24gbGlicmFyeS4KKyovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyIE9GKCh1TG9uZyBhZGxlciwgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pKTsKKy8qCisgICAgIFVwZGF0ZSBhIHJ1bm5pbmcgQWRsZXItMzIgY2hlY2tzdW0gd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQKKyAgIHJldHVybiB0aGUgdXBkYXRlZCBjaGVja3N1bS4gSWYgYnVmIGlzIFpfTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNoZWNrc3VtLgorICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAorICAgbXVjaCBmYXN0ZXIuIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgYWRsZXIgPSBhZGxlcjMyKGFkbGVyLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOworKi8KKworLyoKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUgT0YoKHVMb25nIGFkbGVyMSwgdUxvbmcgYWRsZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9vZmZfdCBsZW4yKSk7CisKKyAgICAgQ29tYmluZSB0d28gQWRsZXItMzIgY2hlY2tzdW1zIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsIHNlcTEKKyAgIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBBZGxlci0zMiBjaGVja3N1bXMgd2VyZSBjYWxjdWxhdGVkIGZvcgorICAgZWFjaCwgYWRsZXIxIGFuZCBhZGxlcjIuICBhZGxlcjMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZgorICAgc2VxMSBhbmQgc2VxMiBjb25jYXRlbmF0ZWQsIHJlcXVpcmluZyBvbmx5IGFkbGVyMSwgYWRsZXIyLCBhbmQgbGVuMi4KKyovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMiAgIE9GKCh1TG9uZyBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CisvKgorICAgICBVcGRhdGUgYSBydW5uaW5nIENSQy0zMiB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZCByZXR1cm4gdGhlCisgICB1cGRhdGVkIENSQy0zMi4gSWYgYnVmIGlzIFpfTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1aXJlZCBpbml0aWFsCisgICB2YWx1ZSBmb3IgdGhlIGZvciB0aGUgY3JjLiBQcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZyAob25lJ3MgY29tcGxlbWVudCkgaXMKKyAgIHBlcmZvcm1lZCB3aXRoaW4gdGhpcyBmdW5jdGlvbiBzbyBpdCBzaG91bGRuJ3QgYmUgZG9uZSBieSB0aGUgYXBwbGljYXRpb24uCisgICBVc2FnZSBleGFtcGxlOgorCisgICAgIHVMb25nIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgY3JjID0gY3JjMzIoY3JjLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7CisqLworCisvKgorWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nIGNyYzEsIHVMb25nIGNyYzIsIHpfb2ZmX3QgbGVuMikpOworCisgICAgIENvbWJpbmUgdHdvIENSQy0zMiBjaGVjayB2YWx1ZXMgaW50byBvbmUuICBGb3IgdHdvIHNlcXVlbmNlcyBvZiBieXRlcywKKyAgIHNlcTEgYW5kIHNlcTIgd2l0aCBsZW5ndGhzIGxlbjEgYW5kIGxlbjIsIENSQy0zMiBjaGVjayB2YWx1ZXMgd2VyZQorICAgY2FsY3VsYXRlZCBmb3IgZWFjaCwgY3JjMSBhbmQgY3JjMi4gIGNyYzMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBDUkMtMzIKKyAgIGNoZWNrIHZhbHVlIG9mIHNlcTEgYW5kIHNlcTIgY29uY2F0ZW5hdGVkLCByZXF1aXJpbmcgb25seSBjcmMxLCBjcmMyLCBhbmQKKyAgIGxlbjIuCisqLworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcmlvdXMgaGFja3MsIGRvbid0IGxvb2sgOikgKi8KKworLyogZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGFyZSBtYWNyb3MgdG8gYWxsb3cgY2hlY2tpbmcgdGhlIHpsaWIgdmVyc2lvbgorICogYW5kIHRoZSBjb21waWxlcidzIHZpZXcgb2Ygel9zdHJlYW06CisgKi8KK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8gT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDJfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50ICBsZXZlbCwgaW50ICBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLCBpbnQgbWVtTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSwgY29uc3QgY2hhciAqdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9zaXplKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgIHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOworI2RlZmluZSBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkgXAorICAgICAgICBkZWZsYXRlSW5pdF8oKHN0cm0pLCAobGV2ZWwpLCAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisjZGVmaW5lIGluZmxhdGVJbml0KHN0cm0pIFwKKyAgICAgICAgaW5mbGF0ZUluaXRfKChzdHJtKSwgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSBcCisgICAgICAgIGRlZmxhdGVJbml0Ml8oKHN0cm0pLChsZXZlbCksKG1ldGhvZCksKHdpbmRvd0JpdHMpLChtZW1MZXZlbCksXAorICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSksICAgICAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisjZGVmaW5lIGluZmxhdGVJbml0MihzdHJtLCB3aW5kb3dCaXRzKSBcCisgICAgICAgIGluZmxhdGVJbml0Ml8oKHN0cm0pLCAod2luZG93Qml0cyksIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgaW5mbGF0ZUJhY2tJbml0KHN0cm0sIHdpbmRvd0JpdHMsIHdpbmRvdykgXAorICAgICAgICBpbmZsYXRlQmFja0luaXRfKChzdHJtKSwgKHdpbmRvd0JpdHMpLCAod2luZG93KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisKKyNpZiBkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpCisgICAgI2RlZmluZSB6X29mZjY0X3Qgb2ZmNjRfdAorI2Vsc2UgCisgICAgI2lmIF9GSUxFX09GRlNFVF9CSVRTID09IDY0CisgICAgICAgICNkZWZpbmUgel9vZmY2NF90IG9mZl90CisgICAgI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgfHwgX0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQKKyAgIFpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuNjQgT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CisgICBaRVhURVJOIHpfb2ZmNjRfdCBaRVhQT1JUIGd6c2VlazY0IE9GKChnekZpbGUsIHpfb2ZmNjRfdCwgaW50KSk7CisgICBaRVhURVJOIHpfb2ZmNjRfdCBaRVhQT1JUIGd6dGVsbDY0IE9GKChnekZpbGUpKTsKKyAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCB6X29mZjY0X3QpKTsKKyAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmY2NF90KSk7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFpMSUJfSU5URVJOQUwpICYmIF9GSUxFX09GRlNFVF9CSVRTID09IDY0CisjICBkZWZpbmUgZ3pvcGVuIGd6b3BlbjY0CisjICBkZWZpbmUgZ3pzZWVrIGd6c2VlazY0CisjICBkZWZpbmUgZ3p0ZWxsIGd6dGVsbDY0CisjICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lIGFkbGVyMzJfY29tYmluZTY0CisjICBkZWZpbmUgY3JjMzJfY29tYmluZSBjcmMzMl9jb21iaW5lNjQKKyMgIGlmbmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCisgICAgIFpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuNjQgT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CisgICAgIFpFWFRFUk4gb2ZmX3QgWkVYUE9SVCBnenNlZWs2NCBPRigoZ3pGaWxlLCBvZmZfdCwgaW50KSk7CisgICAgIFpFWFRFUk4gb2ZmX3QgWkVYUE9SVCBnenRlbGw2NCBPRigoZ3pGaWxlKSk7CisgICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCBvZmZfdCkpOworICAgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIG9mZl90KSk7CisjICBlbmRpZgorI2Vsc2UKKyAgIFpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuIE9GKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworICAgWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgZ3pzZWVrIE9GKChnekZpbGUsIHpfb2ZmX3QsIGludCkpOworICAgWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgZ3p0ZWxsIE9GKChnekZpbGUpKTsKKyAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOworICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChaVVRJTF9IKSAmJiAhZGVmaW5lZChOT19EVU1NWV9ERUNMKQorICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7aW50IGR1bW15O307IC8qIGhhY2sgZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworI2VuZGlmCisKK1pFWFRFUk4gY29uc3QgY2hhciAgICogWkVYUE9SVCB6RXJyb3IgICAgICAgICAgIE9GKChpbnQpKTsKK1pFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVCBpbmZsYXRlU3luY1BvaW50IE9GKCh6X3N0cmVhbXApKTsKK1pFWFRFUk4gY29uc3QgdUxvbmdmICogWkVYUE9SVCBnZXRfY3JjX3RhYmxlICAgIE9GKCh2b2lkKSk7CitaRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgaW5mbGF0ZVVuZGVybWluZSBPRigoel9zdHJlYW1wLCBpbnQpKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFpMSUJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS96bGliZGVmcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvaW5jbHVkZS96bGliZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZDZlODEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9pbmNsdWRlL3psaWJkZWZzLmgKQEAgLTAsMCArMSwxMyBAQAorLyogemxpYmRlZnMuaCAtLSBjb21waWxlLXRpbWUgZGVmaW5pdGlvbnMgZm9yIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA2IEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkvKiBmb3Igb2ZmX3QgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4JLyogZm9yIFNFRUtfKiBhbmQgb2ZmX3QgKi8KKyNpZmRlZiBWTVMKKyMgIGluY2x1ZGUgPHVuaXhpby5oPgkvKiBmb3Igb2ZmX3QgKi8KKyNlbmRpZgorI2lmbmRlZiB6X29mZl90CisjICBkZWZpbmUgel9vZmZfdCBvZmZfdAorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvTWNydDEubyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9NY3J0MS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZjljMTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvTWNydDEubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvU2NydDEubyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9TY3J0MS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YjMxYmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvU2NydDEubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvYWxzYS1saWIvc21peGVyL3NtaXhlci1hYzk3LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItYWM5Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzIyYjlhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItYWM5Ny5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvYWxzYS1saWIvc21peGVyL3NtaXhlci1oZGEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvYWxzYS1saWIvc21peGVyL3NtaXhlci1oZGEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0MzU0ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9hbHNhLWxpYi9zbWl4ZXIvc21peGVyLWhkYS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvYWxzYS1saWIvc21peGVyL3NtaXhlci1zYmFzZS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9hbHNhLWxpYi9zbWl4ZXIvc21peGVyLXNiYXNlLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTZmOWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvYWxzYS1saWIvc21peGVyL3NtaXhlci1zYmFzZS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvY21ha2UvUHVsc2VBdWRpby9QdWxzZUF1ZGlvQ29uZmlnLmNtYWtlIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2NtYWtlL1B1bHNlQXVkaW8vUHVsc2VBdWRpb0NvbmZpZy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTQzNmFiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2NtYWtlL1B1bHNlQXVkaW8vUHVsc2VBdWRpb0NvbmZpZy5jbWFrZQpAQCAtMCwwICsxLDEwIEBACitzZXQoUFVMU0VBVURJT19GT1VORCBUUlVFKQorCitzZXQoUFVMU0VBVURJT19WRVJTSU9OX01BSk9SIDEpCitzZXQoUFVMU0VBVURJT19WRVJTSU9OX01JTk9SIDEpCitzZXQoUFVMU0VBVURJT19WRVJTSU9OIDEuMSkKK3NldChQVUxTRUFVRElPX1ZFUlNJT05fU1RSSU5HICIxLjEiKQorCitmaW5kX3BhdGgoUFVMU0VBVURJT19JTkNMVURFX0RJUiBwdWxzZS9wdWxzZWF1ZGlvLmggSElOVFMgIi91c3IvaW5jbHVkZSIpCitmaW5kX2xpYnJhcnkoUFVMU0VBVURJT19MSUJSQVJZIE5BTUVTIHB1bHNlIGxpYnB1bHNlIEhJTlRTICIvdXNyL2xpYi94ODZfNjQtbGludXgtZ251IikKK2ZpbmRfbGlicmFyeShQVUxTRUFVRElPX01BSU5MT09QX0xJQlJBUlkgTkFNRVMgcHVsc2UtbWFpbmxvb3AtZ2xpYiBsaWJwdWxzZS1tYWlubG9vcC1nbGliIEhJTlRTICIvdXNyL2xpYi94ODZfNjQtbGludXgtZ251IikKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9jbWFrZS9QdWxzZUF1ZGlvL1B1bHNlQXVkaW9Db25maWdWZXJzaW9uLmNtYWtlIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2NtYWtlL1B1bHNlQXVkaW8vUHVsc2VBdWRpb0NvbmZpZ1ZlcnNpb24uY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2MTEwOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9jbWFrZS9QdWxzZUF1ZGlvL1B1bHNlQXVkaW9Db25maWdWZXJzaW9uLmNtYWtlCkBAIC0wLDAgKzEsMTEgQEAKK3NldChQQUNLQUdFX1ZFUlNJT04gMS4xKQorCitpZigiJHtQQUNLQUdFX1ZFUlNJT059IiBWRVJTSU9OX0xFU1MgIiR7UEFDS0FHRV9GSU5EX1ZFUlNJT059IiApCisgIHNldChQQUNLQUdFX1ZFUlNJT05fQ09NUEFUSUJMRSBGQUxTRSkKK2Vsc2UoIiR7UEFDS0FHRV9WRVJTSU9OfSIgVkVSU0lPTl9MRVNTICIke1BBQ0tBR0VfRklORF9WRVJTSU9OfSIgKQorICBzZXQoUEFDS0FHRV9WRVJTSU9OX0NPTVBBVElCTEUgVFJVRSkKKyAgaWYoICIke1BBQ0tBR0VfRklORF9WRVJTSU9OfSIgU1RSRVFVQUwgIiR7UEFDS0FHRV9WRVJTSU9OfSIpCisgICAgc2V0KFBBQ0tBR0VfVkVSU0lPTl9FWEFDVCBUUlVFKQorICBlbmRpZiggIiR7UEFDS0FHRV9GSU5EX1ZFUlNJT059IiBTVFJFUVVBTCAiJHtQQUNLQUdFX1ZFUlNJT059IikKK2VuZGlmKCIke1BBQ0tBR0VfVkVSU0lPTn0iIFZFUlNJT05fTEVTUyAiJHtQQUNLQUdFX0ZJTkRfVkVSU0lPTn0iICkKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2NydDEubyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9jcnQxLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmNDY1ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9jcnQxLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2NydGkubyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9jcnRpLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5YTIzMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9jcnRpLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2NydG4ubyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9jcnRuLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1ZTZlZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9jcnRuLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0FOU0lfWDMuMTEwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0FOU0lfWDMuMTEwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZmU0N2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvQU5TSV9YMy4xMTAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0FSTVNDSUktOC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9BUk1TQ0lJLTguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwNGJlZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9BUk1TQ0lJLTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0FTTU9fNDQ5LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0FTTU9fNDQ5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YjIxNWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvQVNNT180NDkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0JJRzUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvQklHNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJiM2E2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0JJRzUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0JJRzVIS1NDUy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9CSUc1SEtTQ1Muc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExNTJkMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9CSUc1SEtTQ1Muc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0JSRi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9CUkYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiOTNmYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9CUkYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTAwMDcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMDAwNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk2Y2QxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTAwMDcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTEyNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDExMjUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3MDI4ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDExMjUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1MC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwNWUwZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1MS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmNzYxMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1Mi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkY2I3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1My5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmMzA0MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1NC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4MmE1MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1NS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhOWE3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1Ni5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxZDc0ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1Ny5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjZWYwOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1OC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU4ZGNmZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzM3LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzM3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2NmYjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A3Mzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzcwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzcwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlODZlNmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A3NzAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzcxLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzcxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZGJhY2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A3NzEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzcyLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzcyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTRlM2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A3NzIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzczLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzczLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OTdhNzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A3NzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzc0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzc0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwM2VmODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A3NzQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzc1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzc1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYWFjYmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A3NzUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQOTMyLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NQOTMyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2M1OWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A5MzIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NTTl8zNjkxMDMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1NOXzM2OTEwMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjg5NmZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NTTl8zNjkxMDMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0NXSS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DV0kuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2MjVmZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DV0kuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0RFQy1NQ1Muc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvREVDLU1DUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2U3M2U2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0RFQy1NQ1Muc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1BVC1ERS1BLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1BVC1ERS1BLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNGU0YWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUFULURFLUEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1BVC1ERS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtQVQtREUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjZjdlMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtQVQtREUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1DQS1GUi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtQ0EtRlIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllZDI5MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtQ0EtRlIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1ESy1OTy1BLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1ESy1OTy1BLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmY1OWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLURLLU5PLUEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1ESy1OTy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtREstTk8uc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkNWNmOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtREstTk8uc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1FUy1BLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1FUy1BLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYmNhMTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUVTLUEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1FUy1TLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1FUy1TLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMmYyZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUVTLVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1FUy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRVMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwZTgyZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1GSS1TRS1BLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1GSS1TRS1BLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODc4YzIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUZJLVNFLUEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1GSS1TRS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRkktU0Uuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiMjJlMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRkktU0Uuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1GUi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRlIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5ZGVhMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRlIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1JUy1GUklTUy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtSVMtRlJJU1Muc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1ZjMwZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtSVMtRlJJU1Muc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1JVC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtSVQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyOTc0YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtSVQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1QVC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtUFQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0NjBkMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtUFQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1VSy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtVUsuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5NTNhOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtVUsuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1VUy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtVVMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhMzFjNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtVVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VDTUEtQ1lSSUxMSUMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUNNQS1DWVJJTExJQy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzY2MTEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VDTUEtQ1lSSUxMSUMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1DTi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtQ04uc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2OThjOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtQ04uc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1KSVNYMDIxMy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtSklTWDAyMTMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2ZWViYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtSklTWDAyMTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1KUC1NUy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtSlAtTVMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0OGZmMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtSlAtTVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1KUC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtSlAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4ZGZhMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtSlAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1LUi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtS1Iuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlZjU5MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtS1Iuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1UVy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtVFcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5MTc0ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtVFcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dCMTgwMzAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0IxODAzMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTgxNmI1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dCMTgwMzAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dCQklHNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HQkJJRzUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyNzUwOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HQkJJRzUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dCR0JLLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dCR0JLLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkY2NiNjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0JHQksuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dCSy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HQksuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxYjUxYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HQksuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dFT1JHSUFOLUFDQURFTVkuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0VPUkdJQU4tQUNBREVNWS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzk1OGI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dFT1JHSUFOLUFDQURFTVkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dFT1JHSUFOLVBTLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dFT1JHSUFOLVBTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ODQyMDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0VPUkdJQU4tUFMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dPU1RfMTk3NjgtNzQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvR09TVF8xOTc2OC03NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTZiMmI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dPU1RfMTk3NjgtNzQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dSRUVLLUNDSVRULnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dSRUVLLUNDSVRULnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYmNlN2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvR1JFRUstQ0NJVFQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dSRUVLNy1PTEQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvR1JFRUs3LU9MRC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDlkNWI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dSRUVLNy1PTEQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0dSRUVLNy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HUkVFSzcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzM2Y1NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HUkVFSzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0hQLUdSRUVLOC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9IUC1HUkVFSzguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxOWEzNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9IUC1HUkVFSzguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0hQLVJPTUFOOC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9IUC1ST01BTjguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThmMmQzYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9IUC1ST01BTjguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0hQLVJPTUFOOS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9IUC1ST01BTjkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3ZGVmNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9IUC1ST01BTjkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0hQLVRIQUk4LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0hQLVRIQUk4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YjE1NGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSFAtVEhBSTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0hQLVRVUktJU0g4LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0hQLVRVUktJU0g4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTBiOWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSFAtVFVSS0lTSDguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTAzNy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0wMzcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzNGU5MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0wMzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTAzOC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0wMzguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0NDk0NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0wMzguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMDQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAwNC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDI1YWZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMDQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMDguc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAwOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWE0ZGNjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMDguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMDhfNDIwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMDhfNDIwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOWJjNTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAwOF80MjAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMjUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAyNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2MyMWZkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMjUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMjYuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAyNi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDFjYzBiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMjYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwNDYuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTA0Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjM1OGY0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwNDYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwNDcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTA0Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjllOTIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwNDcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwOTcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTA5Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNThlYmI5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwOTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMTIuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTExMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzlkMTExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMTIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMjIuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEyMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWZkZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMjIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMjMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEyMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmJmOTBhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMjMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMjQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEyNC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTBhOWZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMjQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMjkuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEyOS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODY5NzJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMjkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMzAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEzMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2NmZGUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMzAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMzIuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEzMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTE2MmVmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMzIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMzMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEzMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzA1MjNiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMzcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEzNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGI2Yzc3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDY4ODEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2JiOGU5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDIuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0Mi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODQxNGVjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0My5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTljODIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2RlODBiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRlOTJkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDYuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDJjZTZlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTljM2ZlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDguc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0OC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGY4NWYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDkuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0OS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTgwMGI1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1My5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzEwZTZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmU2NzJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDU1MmE5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTYuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWRlMDgxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2FjYzc0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTguc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1OC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzM0M2E0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjhjNjI1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmE2NTA0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjIuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2Mi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDExNGE0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2My5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzVhMjVmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTYzNWUyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjYuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmZiNGRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjc1MjljCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEyNzEyLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEyNzEyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjhiZTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTI3MTIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzNjQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM2NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjg5NzVmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzNjQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzNzEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM3MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTZjNTZjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzNzEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzODguc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM4OC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODI1NzA3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzODguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzOTAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM5MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTMxNDgxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzOTAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzOTkuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM5OS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWMxN2QzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzOTkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTE2ODA0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTE2ODA0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNGY0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTY4MDQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI1Ni5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNTYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0ZjVjMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3My5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlYmMxNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3NC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjMTY1MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3NS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZkZTIxMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3Ny5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5MDYwNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3OC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmMTY3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI4MC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yODAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2ZjhjMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yODAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI4MS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yODEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1ZjlhYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yODEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI4NC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yODQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1MzI1MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yODQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI4NS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yODUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdjOWI1NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yODUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI5MC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yOTAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmNGVkNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yOTAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI5Ny5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yOTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1MTRjZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yOTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQyMC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00MjAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE1M2QxZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00MjAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQyMy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00MjMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhYTg5NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00MjMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQyNC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00MjQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlN2VkMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00MjQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQzNy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00Mzcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmNzY5NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00Mzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQ1MTcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDUxNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjYxMWJmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQ1MTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQ4OTkuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDg5OS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjVkM2E5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQ4OTkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQ5MDkuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDkwOS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjhjOTA4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQ5MDkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQ5NzEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDk3MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2ZjNmJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQ5NzEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTUwMC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk01MDAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkMmY3MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk01MDAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTUzNDcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNTM0Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTRlODgzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTUzNDcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTgwMy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04MDMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MxOWU0MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04MDMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1MC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkYmJjNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1MS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2N2IxMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1Mi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiNmFjYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1NS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5MTY3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1Ni5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1YjRiZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1Ny5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmYzNhOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2MC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyZTIxYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2MS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1MmZhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2Mi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1MmJmZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2My5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwMjRmNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2NC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyNGY0ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2NS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3MmJhMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2Ni5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzNzllMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2Nk5BVi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjZOQVYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0MGJmNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjZOQVYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2OC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04Njguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM4M2Y5ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04Njguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2OS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04Njkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhNjE3NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04Njkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg3MC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NzAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5ZjdjYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NzAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg3MS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NzEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5OTdjMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NzEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg3NC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NzQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjMmRjYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NzQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg3NS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NzUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1YzkxNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NzUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg4MC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04ODAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0ZTQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04ODAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg5MS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04OTEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxNDcxZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04OTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwMS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiNGFiZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwMi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3ZGU1MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwMy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViYTY5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwMzAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTAzMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjk2NTFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwMzAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwNC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5OGYxNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkZjdmZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwNjYuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTA2Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWQ1NmFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwNjYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkxOC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MTguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhNzgzZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkyMS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MjEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwZTFmNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MjEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkyMi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MjIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1ZGExNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MjIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzMC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MzAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5NDMyZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MzAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzMi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MzIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwYjczOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MzIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzMy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MzMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzMzExMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MzUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5ZmQ2YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MzUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzNy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05Mzcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0OTUwOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05Mzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzOS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05Mzkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmODM5ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05Mzkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTk0My5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05NDMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjOGUxNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05NDMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTk0NDguc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTQ0OC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2VkZjdhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTk0NDguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lFQ19QMjctMS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JRUNfUDI3LTEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0OTFiOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JRUNfUDI3LTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lOSVMtOC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JTklTLTguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkZDJjMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JTklTLTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lOSVMtQ1lSSUxMSUMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSU5JUy1DWVJJTExJQy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2JlM2VlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lOSVMtQ1lSSUxMSUMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lOSVMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSU5JUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmY1YjljCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lOSVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTSVJJLTMzNDIuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNJUkktMzM0Mi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjZkNTlkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTSVJJLTMzNDIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUNOLUVYVC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1DTi1FWFQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3NWViNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1DTi1FWFQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUNOLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUNOLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTQxOGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItQ04uc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUpQLTMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItSlAtMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTcwMmZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUpQLTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUpQLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUpQLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MzNlYTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItSlAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUtSLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUtSLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTJhYjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItS1Iuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy1JUi0xOTcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLUlSLTE5Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWQwODlmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy1JUi0xOTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy1JUi0yMDkuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLUlSLTIwOS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODA0YmNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy1JUi0yMDkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzY0Ni5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU082NDYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyODlkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU082NDYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1YWY3MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg2MDBlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzMzOGFmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTE0OGRmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xNC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmNhYmE5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU2YTYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTYuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xNi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2YzMjM1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRkYmUwOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4MzliYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktNC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwODM1OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhZjU5MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktNi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiYWYyMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktNy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkZjE1MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktOC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiMTE2MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktOS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwMjFkMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktOUUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS05RS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzFmZTY2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktOUUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT18xMDM2Ny1CT1guc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzEwMzY3LUJPWC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTZiYmI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT18xMDM2Ny1CT1guc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT18xMTU0OC0xLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT18xMTU0OC0xLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZGU4YjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzExNTQ4LTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT18yMDMzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT18yMDMzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYmY2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzIwMzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT181NDI3LUVYVC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNTQyNy1FWFQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwYTJhMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNTQyNy1FWFQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT181NDI3LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT181NDI3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzQ0N2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzU0Mjcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT181NDI4LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT181NDI4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNTdlODIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzU0Mjguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT182OTM3LTIuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzY5MzctMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDNhZGE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT182OTM3LTIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT182OTM3LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0lTT182OTM3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMDIyNjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzY5Mzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0pPSEFCLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0pPSEFCLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YmUyZmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvSk9IQUIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0tPSS04LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0tPSS04LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNTc2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JLTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0tPSTgtUi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0k4LVIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3NjQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0k4LVIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0tPSTgtUlUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JOC1SVS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjc1MmIxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0tPSTgtUlUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0tPSTgtVC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0k4LVQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0NTA2MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0k4LVQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0tPSTgtVS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0k4LVUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiNzk5ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0k4LVUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0xBVElOLUdSRUVLLTEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvTEFUSU4tR1JFRUstMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzhhZTc3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0xBVElOLUdSRUVLLTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0xBVElOLUdSRUVLLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L0xBVElOLUdSRUVLLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMjQxNGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvTEFUSU4tR1JFRUsuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L01BQy1DRU5UUkFMRVVST1BFLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L01BQy1DRU5UUkFMRVVST1BFLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMzIyMjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDLUNFTlRSQUxFVVJPUEUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L01BQy1JUy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUMtSVMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0N2YwZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUMtSVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L01BQy1TQU1JLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L01BQy1TQU1JLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTg1NjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDLVNBTUkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L01BQy1VSy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUMtVUsuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlNjYyOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUMtVUsuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L01BQ0lOVE9TSC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUNJTlRPU0guc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczN2NmMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUNJTlRPU0guc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L01JSy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NSUsuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwYmZlNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NSUsuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L05BVFMtREFOTy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9OQVRTLURBTk8uc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwYWNmNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9OQVRTLURBTk8uc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L05BVFMtU0VGSS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9OQVRTLVNFRkkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViNzUwOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9OQVRTLVNFRkkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1BUMTU0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1BUMTU0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYTQ0NjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvUFQxNTQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1JLMTA0OC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9SSzEwNDguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0YzM0MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9SSzEwNDguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1NBTUktV1MyLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1NBTUktV1MyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzRhZjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvU0FNSS1XUzIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1NISUZUX0pJU1gwMjEzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1NISUZUX0pJU1gwMjEzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNjEyNGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvU0hJRlRfSklTWDAyMTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1NKSVMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvU0pJUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTI1NzJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1NKSVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1QuNjEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvVC42MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGJhNTQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1QuNjEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1RDVk41NzEyLTEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvVENWTjU3MTItMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmVkMGEzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1RDVk41NzEyLTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1RJUy02MjAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvVElTLTYyMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjgwOGUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1RJUy02MjAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1RTQ0lJLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1RTQ0lJLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NTUxZTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvVFNDSUkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1VIQy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VSEMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyNGQ1YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VSEMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1VOSUNPREUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvVU5JQ09ERS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTlkYTg5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1VOSUNPREUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1VURi0xNi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VVEYtMTYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlY2RiOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VVEYtMTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1VURi0zMi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VVEYtMzIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5NTkyZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VVEYtMzIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1VURi03LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1VURi03LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZGJiOWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvVVRGLTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L1ZJU0NJSS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9WSVNDSUkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwZGE2ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9WSVNDSUkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L2djb252LW1vZHVsZXMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvZ2NvbnYtbW9kdWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTg3MDk0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L2djb252LW1vZHVsZXMKQEAgLTAsMCArMSwxOTcxIEBACisjIEdOVSBsaWJjIGljb252IGNvbmZpZ3VyYXRpb24uCisjIENvcHlyaWdodCAoQykgMTk5Ny0yMDA1LCAyMDA3LCAyMDA4LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworIyBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorIyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorIyAwMjExMS0xMzA3IFVTQS4KKworIyBBbGwgbGluZXMgY29udGFpbiB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgorCisjIElmIHRoZSBsaW5lcyBzdGFydCB3aXRoIGBtb2R1bGUnCisjICBmcm9tc2V0OgllaXRoZXIgYSBuYW1lIHRyaXBsZSBvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0cmlwbGUuCisjICB0b3NldDoJYSBuYW1lIHRyaXBsZSBvciBhbiBleHByZXNzaW9uIHdpdGggXE4gdG8gZ2V0IHJlZ3VsYXIKKyMJCWV4cHJlc3Npb24gbWF0Y2hpbmcgcmVzdWx0cy4KKyMgIGZpbGVuYW1lOglmaWxlbmFtZSBvZiB0aGUgbW9kdWxlIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtYXRpb24uCisjCQlJZiBpdCBpcyBub3QgYWJzb2x1dGUgdGhlIHBhdGggaXMgbWFkZSBhYnNvbHV0ZSBieSBwcmVwZW5kaW5nCisjCQl0aGUgZGlyZWN0b3J5IHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgZm91bmQgaW4uCisjICBjb3N0OglvcHRpb25hbCBjb3N0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbi4gIERlZmF1bHQgaXMgMS4KKworIyBJZiB0aGUgbGluZXMgc3RhcnQgd2l0aCBgYWxpYXMnCisjICBhbGlhczoJYWxpYXMgbmFtZSB3aGljaCBpcyBub3QgcmVhbGx5IHJlY29nbml6ZWQuCisjICBuYW1lOgl0aGUgcmVhbCBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgc2V0CisKK2FsaWFzCUlTTy1JUi00Ly8JCUJTXzQ3MzAvLworYWxpYXMJSVNPNjQ2LUdCLy8JCUJTXzQ3MzAvLworYWxpYXMJR0IvLwkJCUJTXzQ3MzAvLworYWxpYXMJVUsvLwkJCUJTXzQ3MzAvLworYWxpYXMJQ1NJU080VU5JVEVES0lOR0RPTS8vCUJTXzQ3MzAvLworbW9kdWxlCUJTXzQ3MzAvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlCU180NzMwLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTIxLy8JCUNTQV9aMjQzLjQtMTk4NS0xLy8KK2FsaWFzCUlTTzY0Ni1DQS8vCQlDU0FfWjI0My40LTE5ODUtMS8vCithbGlhcwlDU0E3LTEvLwkJQ1NBX1oyNDMuNC0xOTg1LTEvLworYWxpYXMJQ0EvLwkJCUNTQV9aMjQzLjQtMTk4NS0xLy8KK2FsaWFzCUNTSVNPMTIxQ0FOQURJQU4xLy8JQ1NBX1oyNDMuNC0xOTg1LTEvLworYWxpYXMJQ1NBX1oyNDMuNDE5ODUxLy8JQ1NBX1oyNDMuNC0xOTg1LTEvLworbW9kdWxlCUNTQV9aMjQzLjQtMTk4NS0xLy8JSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlDU0FfWjI0My40LTE5ODUtMS8vCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTIyLy8JCUNTQV9aMjQzLjQtMTk4NS0yLy8KK2FsaWFzCUlTTzY0Ni1DQTIvLwkJQ1NBX1oyNDMuNC0xOTg1LTIvLworYWxpYXMJQ1NBNy0yLy8JCUNTQV9aMjQzLjQtMTk4NS0yLy8KK2FsaWFzCUNTSVNPMTIyQ0FOQURJQU4yLy8JQ1NBX1oyNDMuNC0xOTg1LTIvLworYWxpYXMJQ1NBX1oyNDMuNDE5ODUyLy8JQ1NBX1oyNDMuNC0xOTg1LTIvLworbW9kdWxlCUNTQV9aMjQzLjQtMTk4NS0yLy8JSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlDU0FfWjI0My40LTE5ODUtMi8vCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMjEvLwkJRElOXzY2MDAzLy8KK2FsaWFzCURFLy8JCQlESU5fNjYwMDMvLworYWxpYXMJSVNPNjQ2LURFLy8JCURJTl82NjAwMy8vCithbGlhcwlDU0lTTzIxR0VSTUFOLy8JCURJTl82NjAwMy8vCittb2R1bGUJRElOXzY2MDAzLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJRElOXzY2MDAzLy8JCUlTTzY0NgkJMgorCithbGlhcwlEUzIwODkvLwkJRFNfMjA4OS8vCithbGlhcwlJU082NDYtREsvLwkJRFNfMjA4OS8vCithbGlhcwlESy8vCQkJRFNfMjA4OS8vCithbGlhcwlDU0lTTzY0NkRBTklTSC8vCURTXzIwODkvLworbW9kdWxlCURTXzIwODkvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlEU18yMDg5Ly8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTcvLwkJRVMvLworYWxpYXMJSVNPNjQ2LUVTLy8JCUVTLy8KK2FsaWFzCUNTSVNPMTdTUEFOSVNILy8JRVMvLworbW9kdWxlCUVTLy8JCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUVTLy8JCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTg1Ly8JCUVTMi8vCithbGlhcwlJU082NDYtRVMyLy8JCUVTMi8vCithbGlhcwlDU0lTTzg1U1BBTklTSDIvLwlFUzIvLworbW9kdWxlCUVTMi8vCQkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlFUzIvLwkJCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItNTcvLwkJR0JfMTk4OC04MC8vCithbGlhcwlDTi8vCQkJR0JfMTk4OC04MC8vCithbGlhcwlJU082NDYtQ04vLwkJR0JfMTk4OC04MC8vCithbGlhcwlDU0lTTzU4R0IxOTg4Ly8JCUdCXzE5ODgtODAvLworYWxpYXMJR0JfMTk4ODgwLy8JCUdCXzE5ODgtODAvLworbW9kdWxlCUdCXzE5ODgtODAvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlHQl8xOTg4LTgwLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTUvLwkJSVQvLworYWxpYXMJSVNPNjQ2LUlULy8JCUlULy8KK2FsaWFzCUNTSVNPMTVJVEFMSUFOLy8JSVQvLworbW9kdWxlCUlULy8JCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUlULy8JCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTE0Ly8JCUpJU19DNjIyMC0xOTY5LVJPLy8KK2FsaWFzCUpQLy8JCQlKSVNfQzYyMjAtMTk2OS1STy8vCithbGlhcwlJU082NDYtSlAvLwkJSklTX0M2MjIwLTE5NjktUk8vLworYWxpYXMJQ1NJU08xNEpJU0M2MjIwUk8vLwlKSVNfQzYyMjAtMTk2OS1STy8vCithbGlhcwlKSVNfQzYyMjAxOTY5Uk8vLwlKSVNfQzYyMjAtMTk2OS1STy8vCittb2R1bGUJSklTX0M2MjIwLTE5NjktUk8vLwlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUpJU19DNjIyMC0xOTY5LVJPLy8JSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi05Mi8vCQlKSVNfQzYyMjktMTk4NC1CLy8KK2FsaWFzCUlTTzY0Ni1KUC1PQ1ItQi8vCUpJU19DNjIyOS0xOTg0LUIvLworYWxpYXMJSlAtT0NSLUIvLwkJSklTX0M2MjI5LTE5ODQtQi8vCithbGlhcwlDU0lTTzkySklTQzYyOTkxOTg0Qi8vCUpJU19DNjIyOS0xOTg0LUIvLworYWxpYXMJSklTX0M2MjI5MTk4NEIvLwlKSVNfQzYyMjktMTk4NC1CLy8KK21vZHVsZQlKSVNfQzYyMjktMTk4NC1CLy8JSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlKSVNfQzYyMjktMTk4NC1CLy8JSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0xNDEvLwkJSlVTX0kuQjEuMDAyLy8KK2FsaWFzCUlTTzY0Ni1ZVS8vCQlKVVNfSS5CMS4wMDIvLworYWxpYXMJSlMvLwkJCUpVU19JLkIxLjAwMi8vCithbGlhcwlZVS8vCQkJSlVTX0kuQjEuMDAyLy8KK2FsaWFzCUNTSVNPMTQxSlVTSUIxMDAyLy8JSlVTX0kuQjEuMDAyLy8KK21vZHVsZQlKVVNfSS5CMS4wMDIvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlKVVNfSS5CMS4wMDIvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTzY0Ni1LUi8vCQlLU0M1NjM2Ly8KK2FsaWFzCUNTS1NDNTYzNi8vCQlLU0M1NjM2Ly8KK21vZHVsZQlLU0M1NjM2Ly8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJS1NDNTYzNi8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTg2Ly8JCU1TWl83Nzk1LjMvLworYWxpYXMJSVNPNjQ2LUhVLy8JCU1TWl83Nzk1LjMvLworYWxpYXMJSFUvLwkJCU1TWl83Nzk1LjMvLworYWxpYXMJQ1NJU084NkhVTkdBUklBTi8vCU1TWl83Nzk1LjMvLworbW9kdWxlCU1TWl83Nzk1LjMvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlNU1pfNzc5NS4zLy8JCUlTTzY0NgkJMgorCithbGlhcwlDVUJBLy8JCQlOQ19OQzAwLTEwLy8KK2FsaWFzCU5DX05DMDAtMTA6ODEvLwkJTkNfTkMwMC0xMC8vCithbGlhcwlJU08tSVItMTUxLy8JCU5DX05DMDAtMTAvLworYWxpYXMJSVNPNjQ2LUNVLy8JCU5DX05DMDAtMTAvLworYWxpYXMJQ1NJU08xNTFDVUJBLy8JCU5DX05DMDAtMTAvLworYWxpYXMJTkNfTkMwMDEwLy8JCU5DX05DMDAtMTAvLworbW9kdWxlCU5DX05DMDAtMTAvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlOQ19OQzAwLTEwLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItNjkvLwkJTkZfWl82Mi0wMTAvLworYWxpYXMJSVNPNjQ2LUZSLy8JCU5GX1pfNjItMDEwLy8KK2FsaWFzCUZSLy8JCQlORl9aXzYyLTAxMC8vCithbGlhcwlDU0lTTzY5RlJFTkNILy8JCU5GX1pfNjItMDEwLy8KK2FsaWFzCU5GX1pfNjIwMTAvLwkJTkZfWl82Mi0wMTAvLworbW9kdWxlCU5GX1pfNjItMDEwLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJTkZfWl82Mi0wMTAvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0yNS8vCQlORl9aXzYyLTAxMF8xOTczLy8KK2FsaWFzCUlTTzY0Ni1GUjEvLwkJTkZfWl82Mi0wMTBfMTk3My8vCithbGlhcwlORl9aXzYyLTAxMF8oMTk3MykvLwlORl9aXzYyLTAxMF8xOTczLy8KK2FsaWFzCUNTSVNPMjVGUkVOQ0gvLwkJTkZfWl82Mi0wMTBfMTk3My8vCithbGlhcwlORl9aXzYyMDEwXzE5NzMvLwlORl9aXzYyLTAxMF8xOTczLy8KK21vZHVsZQlORl9aXzYyLTAxMF8xOTczLy8JSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlORl9aXzYyLTAxMF8xOTczLy8JSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi02MC8vCQlOU180NTUxLTEvLworYWxpYXMJSVNPNjQ2LU5PLy8JCU5TXzQ1NTEtMS8vCithbGlhcwlOTy8vCQkJTlNfNDU1MS0xLy8KK2FsaWFzCUNTSVNPNjBEQU5JU0hOT1JXRUdJQU4vLyBOU180NTUxLTEvLworYWxpYXMJQ1NJU082ME5PUldFR0lBTjEvLwlOU180NTUxLTEvLworYWxpYXMJTlNfNDU1MTEvLwkJTlNfNDU1MS0xLy8KK21vZHVsZQlOU180NTUxLTEvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlOU180NTUxLTEvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTzY0Ni1OTzIvLwkJTlNfNDU1MS0yLy8KK2FsaWFzCUlTTy1JUi02MS8vCQlOU180NTUxLTIvLworYWxpYXMJTk8yLy8JCQlOU180NTUxLTIvLworYWxpYXMJQ1NJU082MU5PUldFR0lBTjIvLwlOU180NTUxLTIvLworYWxpYXMJTlNfNDU1MTIvLwkJTlNfNDU1MS0yLy8KK21vZHVsZQlOU180NTUxLTIvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlOU180NTUxLTIvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0xNi8vCQlQVC8vCithbGlhcwlJU082NDYtUFQvLwkJUFQvLworYWxpYXMJQ1NJU08xNlBPUlRVR0VTRS8vCVBULy8KK21vZHVsZQlQVC8vCQkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlQVC8vCQkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi04NC8vCQlQVDIvLworYWxpYXMJSVNPNjQ2LVBUMi8vCQlQVDIvLworYWxpYXMJQ1NJU084NFBPUlRVR1VFU0UyLy8JUFQyLy8KK21vZHVsZQlQVDIvLwkJCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJUFQyLy8JCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTEwLy8JCVNFTl84NTAyMDBfQi8vCithbGlhcwlGSS8vCQkJU0VOXzg1MDIwMF9CLy8KK2FsaWFzCUlTTzY0Ni1GSS8vCQlTRU5fODUwMjAwX0IvLworYWxpYXMJSVNPNjQ2LVNFLy8JCVNFTl84NTAyMDBfQi8vCithbGlhcwlTRS8vCQkJU0VOXzg1MDIwMF9CLy8KK2FsaWFzCUNTSVNPMTBTV0VESVNILy8JU0VOXzg1MDIwMF9CLy8KK2FsaWFzCVNTNjM2MTI3Ly8JCVNFTl84NTAyMDBfQi8vCittb2R1bGUJU0VOXzg1MDIwMF9CLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJU0VOXzg1MDIwMF9CLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTEvLwkJU0VOXzg1MDIwMF9DLy8KK2FsaWFzCUlTTzY0Ni1TRTIvLwkJU0VOXzg1MDIwMF9DLy8KK2FsaWFzCVNFMi8vCQkJU0VOXzg1MDIwMF9DLy8KK2FsaWFzCUNTSVNPMTFTV0VESVNIRk9STkFNRVMvLyBTRU5fODUwMjAwX0MvLworbW9kdWxlCVNFTl84NTAyMDBfQy8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCVNFTl84NTAyMDBfQy8vCQlJU082NDYJCTIKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMDAvLwkJSVNPLTg4NTktMS8vCithbGlhcwlJU09fODg1OS0xOjE5ODcvLwlJU08tODg1OS0xLy8KK2FsaWFzCUlTT184ODU5LTEvLwkJSVNPLTg4NTktMS8vCithbGlhcwlJU084ODU5LTEvLwkJSVNPLTg4NTktMS8vCithbGlhcwlJU084ODU5MS8vCQlJU08tODg1OS0xLy8KK2FsaWFzCUxBVElOMS8vCQlJU08tODg1OS0xLy8KK2FsaWFzCUwxLy8JCQlJU08tODg1OS0xLy8KK2FsaWFzCUlCTTgxOS8vCQlJU08tODg1OS0xLy8KK2FsaWFzCUNQODE5Ly8JCQlJU08tODg1OS0xLy8KK2FsaWFzCUNTSVNPTEFUSU4xLy8JCUlTTy04ODU5LTEvLworYWxpYXMJODg1OV8xLy8JCUlTTy04ODU5LTEvLworYWxpYXMJT1NGMDAwMTAwMDEvLwkJSVNPLTg4NTktMS8vCittb2R1bGUJSVNPLTg4NTktMS8vCQlJTlRFUk5BTAkJSVNPODg1OS0xCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMS8vCQlJU084ODU5LTEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTEwMS8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUlTT184ODU5LTI6MTk4Ny8vCUlTTy04ODU5LTIvLworYWxpYXMJSVNPXzg4NTktMi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUlTTzg4NTktMi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUlTTzg4NTkyLy8JCUlTTy04ODU5LTIvLworYWxpYXMJTEFUSU4yLy8JCUlTTy04ODU5LTIvLworYWxpYXMJTDIvLwkJCUlTTy04ODU5LTIvLworYWxpYXMJQ1NJU09MQVRJTjIvLwkJSVNPLTg4NTktMi8vCithbGlhcwk4ODU5XzIvLwkJSVNPLTg4NTktMi8vCithbGlhcwlPU0YwMDAxMDAwMi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUlCTTkxMi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUNQOTEyLy8JCQlJU08tODg1OS0yLy8KK21vZHVsZQlJU08tODg1OS0yLy8JCUlOVEVSTkFMCQlJU084ODU5LTIJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS0yLy8JCUlTTzg4NTktMgkxCisKKyMJZnJvbQkJCXRvCQkJIG1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTEwOS8vCQlJU08tODg1OS0zLy8KK2FsaWFzCUlTT184ODU5LTM6MTk4OC8vCUlTTy04ODU5LTMvLworYWxpYXMJSVNPXzg4NTktMy8vCQlJU08tODg1OS0zLy8KK2FsaWFzCUlTTzg4NTktMy8vCQlJU08tODg1OS0zLy8KK2FsaWFzCUlTTzg4NTkzLy8JCUlTTy04ODU5LTMvLworYWxpYXMJTEFUSU4zLy8JCUlTTy04ODU5LTMvLworYWxpYXMJTDMvLwkJCUlTTy04ODU5LTMvLworYWxpYXMJQ1NJU09MQVRJTjMvLwkJSVNPLTg4NTktMy8vCithbGlhcwk4ODU5XzMvLwkJSVNPLTg4NTktMy8vCithbGlhcwlPU0YwMDAxMDAwMy8vCQlJU08tODg1OS0zLy8KK21vZHVsZQlJU08tODg1OS0zLy8JCUlOVEVSTkFMCQlJU084ODU5LTMJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS0zLy8JCUlTTzg4NTktMwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTEwLy8JCUlTTy04ODU5LTQvLworYWxpYXMJSVNPXzg4NTktNDoxOTg4Ly8JSVNPLTg4NTktNC8vCithbGlhcwlJU09fODg1OS00Ly8JCUlTTy04ODU5LTQvLworYWxpYXMJSVNPODg1OS00Ly8JCUlTTy04ODU5LTQvLworYWxpYXMJSVNPODg1OTQvLwkJSVNPLTg4NTktNC8vCithbGlhcwlMQVRJTjQvLwkJSVNPLTg4NTktNC8vCithbGlhcwlMNC8vCQkJSVNPLTg4NTktNC8vCithbGlhcwlDU0lTT0xBVElONC8vCQlJU08tODg1OS00Ly8KK2FsaWFzCTg4NTlfNC8vCQlJU08tODg1OS00Ly8KK2FsaWFzCU9TRjAwMDEwMDA0Ly8JCUlTTy04ODU5LTQvLworbW9kdWxlCUlTTy04ODU5LTQvLwkJSU5URVJOQUwJCUlTTzg4NTktNAkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTQvLwkJSVNPODg1OS00CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xNDQvLwkJSVNPLTg4NTktNS8vCithbGlhcwlJU09fODg1OS01OjE5ODgvLwlJU08tODg1OS01Ly8KK2FsaWFzCUlTT184ODU5LTUvLwkJSVNPLTg4NTktNS8vCithbGlhcwlJU084ODU5LTUvLwkJSVNPLTg4NTktNS8vCithbGlhcwlJU084ODU5NS8vCQlJU08tODg1OS01Ly8KK2FsaWFzCUNZUklMTElDLy8JCUlTTy04ODU5LTUvLworYWxpYXMJQ1NJU09MQVRJTkNZUklMTElDLy8JSVNPLTg4NTktNS8vCithbGlhcwk4ODU5XzUvLwkJSVNPLTg4NTktNS8vCithbGlhcwlPU0YwMDAxMDAwNS8vCQlJU08tODg1OS01Ly8KK2FsaWFzCUlCTTkxNS8vCQlJU08tODg1OS01Ly8KK2FsaWFzCUNQOTE1Ly8JCQlJU08tODg1OS01Ly8KK21vZHVsZQlJU08tODg1OS01Ly8JCUlOVEVSTkFMCQlJU084ODU5LTUJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS01Ly8JCUlTTzg4NTktNQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTI3Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJSVNPXzg4NTktNjoxOTg3Ly8JSVNPLTg4NTktNi8vCithbGlhcwlJU09fODg1OS02Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJSVNPODg1OS02Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJSVNPODg1OTYvLwkJSVNPLTg4NTktNi8vCithbGlhcwlFQ01BLTExNC8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUFTTU8tNzA4Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJQVJBQklDLy8JCUlTTy04ODU5LTYvLworYWxpYXMJQ1NJU09MQVRJTkFSQUJJQy8vCUlTTy04ODU5LTYvLworYWxpYXMJODg1OV82Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJT1NGMDAwMTAwMDYvLwkJSVNPLTg4NTktNi8vCithbGlhcwlJQk0xMDg5Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJQ1AxMDg5Ly8JCUlTTy04ODU5LTYvLworbW9kdWxlCUlTTy04ODU5LTYvLwkJSU5URVJOQUwJCUlTTzg4NTktNgkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTYvLwkJSVNPODg1OS02CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMjYvLwkJSVNPLTg4NTktNy8vCithbGlhcwlJU09fODg1OS03OjIwMDMvLwlJU08tODg1OS03Ly8KK2FsaWFzCUlTT184ODU5LTc6MTk4Ny8vCUlTTy04ODU5LTcvLworYWxpYXMJSVNPXzg4NTktNy8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUlTTzg4NTktNy8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUlTTzg4NTk3Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJRUxPVF85MjgvLwkJSVNPLTg4NTktNy8vCithbGlhcwlFQ01BLTExOC8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUdSRUVLLy8JCQlJU08tODg1OS03Ly8KK2FsaWFzCUdSRUVLOC8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUNTSVNPTEFUSU5HUkVFSy8vCUlTTy04ODU5LTcvLworYWxpYXMJODg1OV83Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJT1NGMDAwMTAwMDcvLwkJSVNPLTg4NTktNy8vCithbGlhcwlJQk04MTMvLwkJSVNPLTg4NTktNy8vCithbGlhcwlDUDgxMy8vCQkJSVNPLTg4NTktNy8vCittb2R1bGUJSVNPLTg4NTktNy8vCQlJTlRFUk5BTAkJSVNPODg1OS03CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktNy8vCQlJU084ODU5LTcJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTEzOC8vCQlJU08tODg1OS04Ly8KK2FsaWFzCUlTT184ODU5LTg6MTk4OC8vCUlTTy04ODU5LTgvLworYWxpYXMJSVNPXzg4NTktOC8vCQlJU08tODg1OS04Ly8KK2FsaWFzCUlTTzg4NTktOC8vCQlJU08tODg1OS04Ly8KK2FsaWFzCUlTTzg4NTk4Ly8JCUlTTy04ODU5LTgvLworYWxpYXMJSEVCUkVXLy8JCUlTTy04ODU5LTgvLworYWxpYXMJQ1NJU09MQVRJTkhFQlJFVy8vCUlTTy04ODU5LTgvLworYWxpYXMJODg1OV84Ly8JCUlTTy04ODU5LTgvLworYWxpYXMJT1NGMDAwMTAwMDgvLwkJSVNPLTg4NTktOC8vCithbGlhcwlJQk05MTYvLwkJSVNPLTg4NTktOC8vCithbGlhcwlDUDkxNi8vCQkJSVNPLTg4NTktOC8vCittb2R1bGUJSVNPLTg4NTktOC8vCQlJTlRFUk5BTAkJSVNPODg1OS04CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktOC8vCQlJU084ODU5LTgJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE0OC8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUlTT184ODU5LTk6MTk4OS8vCUlTTy04ODU5LTkvLworYWxpYXMJSVNPXzg4NTktOS8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUlTTzg4NTktOS8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUlTTzg4NTk5Ly8JCUlTTy04ODU5LTkvLworYWxpYXMJTEFUSU41Ly8JCUlTTy04ODU5LTkvLworYWxpYXMJTDUvLwkJCUlTTy04ODU5LTkvLworYWxpYXMJQ1NJU09MQVRJTjUvLwkJSVNPLTg4NTktOS8vCithbGlhcwk4ODU5XzkvLwkJSVNPLTg4NTktOS8vCithbGlhcwlPU0YwMDAxMDAwOS8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUlCTTkyMC8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUNQOTIwLy8JCQlJU08tODg1OS05Ly8KK2FsaWFzCVRTLTU4ODEvLwkJSVNPLTg4NTktOS8vCithbGlhcwlFQ01BLTEyOC8vCQlJU08tODg1OS05Ly8KK21vZHVsZQlJU08tODg1OS05Ly8JCUlOVEVSTkFMCQlJU084ODU5LTkJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS05Ly8JCUlTTzg4NTktOQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTU3Ly8JCUlTTy04ODU5LTEwLy8KK2FsaWFzCUlTT184ODU5LTEwOjE5OTIvLwlJU08tODg1OS0xMC8vCithbGlhcwlJU09fODg1OS0xMC8vCQlJU08tODg1OS0xMC8vCithbGlhcwlJU084ODU5LTEwLy8JCUlTTy04ODU5LTEwLy8KK2FsaWFzCUlTTzg4NTkxMC8vCQlJU08tODg1OS0xMC8vCithbGlhcwlMQVRJTjYvLwkJSVNPLTg4NTktMTAvLworYWxpYXMJTDYvLwkJCUlTTy04ODU5LTEwLy8KK2FsaWFzCUNTSVNPTEFUSU42Ly8JCUlTTy04ODU5LTEwLy8KK2FsaWFzCU9TRjAwMDEwMDBBLy8JCUlTTy04ODU5LTEwLy8KK21vZHVsZQlJU08tODg1OS0xMC8vCQlJTlRFUk5BTAkJSVNPODg1OS0xMAkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTEwLy8JCUlTTzg4NTktMTAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPODg1OS0xMS8vCQlJU08tODg1OS0xMS8vCithbGlhcwlJU084ODU5MTEvLwkJSVNPLTg4NTktMTEvLworbW9kdWxlCUlTTy04ODU5LTExLy8JCUlOVEVSTkFMCQlJU084ODU5LTExCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMTEvLwkJSVNPODg1OS0xMQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU084ODU5LTEzLy8JCUlTTy04ODU5LTEzLy8KK2FsaWFzCUlTTzg4NTkxMy8vCQlJU08tODg1OS0xMy8vCithbGlhcwlJU08tSVItMTc5Ly8JCUlTTy04ODU5LTEzLy8KK2FsaWFzCUxBVElONy8vCQlJU08tODg1OS0xMy8vCithbGlhcwlMNy8vCQkJSVNPLTg4NTktMTMvLworYWxpYXMJQkFMVElDLy8JCUlTTy04ODU5LTEzLy8KK21vZHVsZQlJU08tODg1OS0xMy8vCQlJTlRFUk5BTAkJSVNPODg1OS0xMwkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTEzLy8JCUlTTzg4NTktMTMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPODg1OS0xNC8vCQlJU08tODg1OS0xNC8vCithbGlhcwlJU084ODU5MTQvLwkJSVNPLTg4NTktMTQvLworYWxpYXMJSVNPLUlSLTE5OS8vCQlJU08tODg1OS0xNC8vCithbGlhcwlMQVRJTjgvLwkJSVNPLTg4NTktMTQvLworYWxpYXMJTDgvLwkJCUlTTy04ODU5LTE0Ly8KK2FsaWFzCUlTT184ODU5LTE0OjE5OTgvLwlJU08tODg1OS0xNC8vCithbGlhcwlJU09fODg1OS0xNC8vCQlJU08tODg1OS0xNC8vCithbGlhcwlJU08tQ0VMVElDLy8JCUlTTy04ODU5LTE0Ly8KK21vZHVsZQlJU08tODg1OS0xNC8vCQlJTlRFUk5BTAkJSVNPODg1OS0xNAkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTE0Ly8JCUlTTzg4NTktMTQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPODg1OS0xNS8vCQlJU08tODg1OS0xNS8vCithbGlhcwlJU084ODU5MTUvLwkJSVNPLTg4NTktMTUvLworYWxpYXMJSVNPLUlSLTIwMy8vCQlJU08tODg1OS0xNS8vCithbGlhcwlJU09fODg1OS0xNS8vCQlJU08tODg1OS0xNS8vCithbGlhcwlMQVRJTi05Ly8JCUlTTy04ODU5LTE1Ly8KK2FsaWFzCUxBVElOOS8vCQlJU08tODg1OS0xNS8vCithbGlhcwlJU09fODg1OS0xNToxOTk4Ly8JSVNPLTg4NTktMTUvLworbW9kdWxlCUlTTy04ODU5LTE1Ly8JCUlOVEVSTkFMCQlJU084ODU5LTE1CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMTUvLwkJSVNPODg1OS0xNQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU084ODU5LTE2Ly8JCUlTTy04ODU5LTE2Ly8KK2FsaWFzCUlTTzg4NTkxNi8vCQlJU08tODg1OS0xNi8vCithbGlhcwlJU08tSVItMjI2Ly8JCUlTTy04ODU5LTE2Ly8KK2FsaWFzCUxBVElOMTAvLwkJSVNPLTg4NTktMTYvLworYWxpYXMJTDEwLy8JCQlJU08tODg1OS0xNi8vCithbGlhcwlJU09fODg1OS0xNjoyMDAxLy8JSVNPLTg4NTktMTYvLworYWxpYXMJSVNPXzg4NTktMTYvLwkJSVNPLTg4NTktMTYvLworbW9kdWxlCUlTTy04ODU5LTE2Ly8JCUlOVEVSTkFMCQlJU084ODU5LTE2CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMTYvLwkJSVNPODg1OS0xNgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlULjYxLy8JCQlULjYxLThCSVQvLworYWxpYXMJSVNPLUlSLTEwMy8vCQlULjYxLThCSVQvLworYWxpYXMJQ1NJU08xMDNUNjE4QklULy8JVC42MS04QklULy8KK2FsaWFzCVQuNjE4QklULy8JCVQuNjEtOEJJVC8vCittb2R1bGUJVC42MS04QklULy8JCUlOVEVSTkFMCQlULjYxCQkxCittb2R1bGUJSU5URVJOQUwJCVQuNjEtOEJJVC8vCQlULjYxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTU2Ly8JCUlTT182OTM3Ly8KK2FsaWFzCUlTT182OTM3OjE5OTIvLwkJSVNPXzY5MzcvLworYWxpYXMJSVNPNjkzNy8vCQlJU09fNjkzNy8vCittb2R1bGUJSVNPXzY5MzcvLwkJSU5URVJOQUwJCUlTT182OTM3CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzY5MzcvLwkJSVNPXzY5MzcJMQorCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItOTAvLwkJSVNPXzY5MzctMi8vCithbGlhcwlJU09fNjkzNy0yOjE5ODMvLwlJU09fNjkzNy0yLy8KK2FsaWFzCUNTSVNPOTAvLwkJSVNPXzY5MzctMi8vCithbGlhcwlJU09fNjkzNzIvLwkJSVNPXzY5MzctMi8vCittb2R1bGUJSVNPXzY5MzctMi8vCQlJTlRFUk5BTAkJSVNPXzY5MzctMgkxCittb2R1bGUJSU5URVJOQUwJCUlTT182OTM3LTIvLwkJSVNPXzY5MzctMgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlTSElGVC1KSVMvLwkJU0pJUy8vCithbGlhcwlTSElGVF9KSVMvLwkJU0pJUy8vCithbGlhcwlNU19LQU5KSS8vCQlTSklTLy8KK2FsaWFzCUNTU0hJRlRKSVMvLwkJU0pJUy8vCittb2R1bGUJU0pJUy8vCQkJSU5URVJOQUwJCVNKSVMJCTEKK21vZHVsZQlJTlRFUk5BTAkJU0pJUy8vCQkJU0pJUwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJV0lORE9XUy0zMUovLwkJQ1A5MzIvLworYWxpYXMJTVM5MzIvLwkJCUNQOTMyLy8KK2FsaWFzCVNKSVMtT1BFTi8vCQlDUDkzMi8vCithbGlhcwlTSklTLVdJTi8vCQlDUDkzMi8vCithbGlhcwlDU1dJTkRPV1MzMUovLwkJQ1A5MzIvLworbW9kdWxlCUNQOTMyLy8JCQlJTlRFUk5BTAkJQ1A5MzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1A5MzIvLwkJCUNQOTMyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlLT0k4Ly8JCQlLT0ktOC8vCittb2R1bGUJS09JLTgvLwkJCUlOVEVSTkFMCQlLT0ktOAkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0ktOC8vCQkJS09JLTgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTS09JOFIvLwkJS09JOC1SLy8KK2FsaWFzCUtPSThSLy8JCQlLT0k4LVIvLworbW9kdWxlCUtPSTgtUi8vCQlJTlRFUk5BTAkJS09JOC1SCQkxCittb2R1bGUJSU5URVJOQUwJCUtPSTgtUi8vCQlLT0k4LVIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xOS8vCQlMQVRJTi1HUkVFSy8vCithbGlhcwlDU0lTTzE5TEFUSU5HUkVFSy8vCUxBVElOLUdSRUVLLy8KK2FsaWFzCUxBVElOR1JFRUsvLwkJTEFUSU4tR1JFRUsvLworbW9kdWxlCUxBVElOLUdSRUVLLy8JCUlOVEVSTkFMCQlMQVRJTi1HUkVFSwkxCittb2R1bGUJSU5URVJOQUwJCUxBVElOLUdSRUVLLy8JCUxBVElOLUdSRUVLCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0yNy8vCQlMQVRJTi1HUkVFSy0xLy8KK2FsaWFzCUNTSVNPMjdMQVRJTkdSRUVLMS8vCUxBVElOLUdSRUVLLTEvLworYWxpYXMJTEFUSU5HUkVFSzEvLwkJTEFUSU4tR1JFRUstMS8vCittb2R1bGUJTEFUSU4tR1JFRUstMS8vCQlJTlRFUk5BTAkJTEFUSU4tR1JFRUstMQkxCittb2R1bGUJSU5URVJOQUwJCUxBVElOLUdSRUVLLTEvLwkJTEFUSU4tR1JFRUstMQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlST01BTjgvLwkJSFAtUk9NQU44Ly8KK2FsaWFzCVI4Ly8JCQlIUC1ST01BTjgvLworYWxpYXMJQ1NIUFJPTUFOOC8vCQlIUC1ST01BTjgvLworYWxpYXMJT1NGMTAwMTAwMDEvLwkJSFAtUk9NQU44Ly8KK2FsaWFzCUhQUk9NQU44Ly8JCUhQLVJPTUFOOC8vCittb2R1bGUJSFAtUk9NQU44Ly8JCUlOVEVSTkFMCQlIUC1ST01BTjgJMQorbW9kdWxlCUlOVEVSTkFMCQlIUC1ST01BTjgvLwkJSFAtUk9NQU44CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDQVRERS8vCQlFQkNESUMtQVQtREUvLworYWxpYXMJRUJDRElDQVRERS8vCQlFQkNESUMtQVQtREUvLworbW9kdWxlCUVCQ0RJQy1BVC1ERS8vCQlJTlRFUk5BTAkJRUJDRElDLUFULURFCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLUFULURFLy8JCUVCQ0RJQy1BVC1ERQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0FUREVBLy8JCUVCQ0RJQy1BVC1ERS1BLy8KK2FsaWFzCUVCQ0RJQ0FUREVBLy8JCUVCQ0RJQy1BVC1ERS1BLy8KK21vZHVsZQlFQkNESUMtQVQtREUtQS8vCUlOVEVSTkFMCQlFQkNESUMtQVQtREUtQQkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1BVC1ERS1BLy8JRUJDRElDLUFULURFLUEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNDQUZSLy8JCUVCQ0RJQy1DQS1GUi8vCithbGlhcwlFQkNESUNDQUZSLy8JCUVCQ0RJQy1DQS1GUi8vCittb2R1bGUJRUJDRElDLUNBLUZSLy8JCUlOVEVSTkFMCQlFQkNESUMtQ0EtRlIJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtQ0EtRlIvLwkJRUJDRElDLUNBLUZSCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDREtOTy8vCQlFQkNESUMtREstTk8vLworYWxpYXMJRUJDRElDREtOTy8vCQlFQkNESUMtREstTk8vLworbW9kdWxlCUVCQ0RJQy1ESy1OTy8vCQlJTlRFUk5BTAkJRUJDRElDLURLLU5PCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLURLLU5PLy8JCUVCQ0RJQy1ESy1OTwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0RLTk9BLy8JCUVCQ0RJQy1ESy1OTy1BLy8KK2FsaWFzCUVCQ0RJQ0RLTk9BLy8JCUVCQ0RJQy1ESy1OTy1BLy8KK21vZHVsZQlFQkNESUMtREstTk8tQS8vCUlOVEVSTkFMCQlFQkNESUMtREstTk8tQQkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1ESy1OTy1BLy8JRUJDRElDLURLLU5PLUEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNFUy8vCQlFQkNESUMtRVMvLworYWxpYXMJRUJDRElDRVMvLwkJRUJDRElDLUVTLy8KK21vZHVsZQlFQkNESUMtRVMvLwkJSU5URVJOQUwJCUVCQ0RJQy1FUwkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1FUy8vCQlFQkNESUMtRVMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNFU0EvLwkJRUJDRElDLUVTLUEvLworYWxpYXMJRUJDRElDRVNBLy8JCUVCQ0RJQy1FUy1BLy8KK21vZHVsZQlFQkNESUMtRVMtQS8vCQlJTlRFUk5BTAkJRUJDRElDLUVTLUEJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRVMtQS8vCQlFQkNESUMtRVMtQQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0VTUy8vCQlFQkNESUMtRVMtUy8vCithbGlhcwlFQkNESUNFU1MvLwkJRUJDRElDLUVTLVMvLworbW9kdWxlCUVCQ0RJQy1FUy1TLy8JCUlOVEVSTkFMCQlFQkNESUMtRVMtUwkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1FUy1TLy8JCUVCQ0RJQy1FUy1TCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDRklTRS8vCQlFQkNESUMtRkktU0UvLworYWxpYXMJRUJDRElDRklTRS8vCQlFQkNESUMtRkktU0UvLworbW9kdWxlCUVCQ0RJQy1GSS1TRS8vCQlJTlRFUk5BTAkJRUJDRElDLUZJLVNFCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLUZJLVNFLy8JCUVCQ0RJQy1GSS1TRQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0ZJU0VBLy8JCUVCQ0RJQy1GSS1TRS1BLy8KK2FsaWFzCUVCQ0RJQ0ZJU0VBLy8JCUVCQ0RJQy1GSS1TRS1BLy8KK21vZHVsZQlFQkNESUMtRkktU0UtQS8vCUlOVEVSTkFMCQlFQkNESUMtRkktU0UtQQkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1GSS1TRS1BLy8JRUJDRElDLUZJLVNFLUEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNGUi8vCQlFQkNESUMtRlIvLworYWxpYXMJRUJDRElDRlIvLwkJRUJDRElDLUZSLy8KK21vZHVsZQlFQkNESUMtRlIvLwkJSU5URVJOQUwJCUVCQ0RJQy1GUgkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1GUi8vCQlFQkNESUMtRlIJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRUJDRElDSVNGUklTUy8vCQlFQkNESUMtSVMtRlJJU1MvLworbW9kdWxlCUVCQ0RJQy1JUy1GUklTUy8vCUlOVEVSTkFMCQlFQkNESUMtSVMtRlJJU1MJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtSVMtRlJJU1MvLwlFQkNESUMtSVMtRlJJU1MJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNJVC8vCQlFQkNESUMtSVQvLworYWxpYXMJRUJDRElDSVQvLwkJRUJDRElDLUlULy8KK21vZHVsZQlFQkNESUMtSVQvLwkJSU5URVJOQUwJCUVCQ0RJQy1JVAkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1JVC8vCQlFQkNESUMtSVQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNQVC8vCQlFQkNESUMtUFQvLworYWxpYXMJRUJDRElDUFQvLwkJRUJDRElDLVBULy8KK21vZHVsZQlFQkNESUMtUFQvLwkJSU5URVJOQUwJCUVCQ0RJQy1QVAkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1QVC8vCQlFQkNESUMtUFQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNVSy8vCQlFQkNESUMtVUsvLworYWxpYXMJRUJDRElDVUsvLwkJRUJDRElDLVVLLy8KK21vZHVsZQlFQkNESUMtVUsvLwkJSU5URVJOQUwJCUVCQ0RJQy1VSwkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1VSy8vCQlFQkNESUMtVUsJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNVUy8vCQlFQkNESUMtVVMvLworYWxpYXMJRUJDRElDVVMvLwkJRUJDRElDLVVTLy8KK21vZHVsZQlFQkNESUMtVVMvLwkJSU5URVJOQUwJCUVCQ0RJQy1VUwkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1VUy8vCQlFQkNESUMtVVMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AwMzcvLwkJCUlCTTAzNy8vCithbGlhcwlFQkNESUMtQ1AtVVMvLwkJSUJNMDM3Ly8KK2FsaWFzCUVCQ0RJQy1DUC1DQS8vCQlJQk0wMzcvLworYWxpYXMJRUJDRElDLUNQLVdULy8JCUlCTTAzNy8vCithbGlhcwlFQkNESUMtQ1AtTkwvLwkJSUJNMDM3Ly8KK2FsaWFzCUNTSUJNMDM3Ly8JCUlCTTAzNy8vCithbGlhcwlPU0YxMDAyMDAyNS8vCQlJQk0wMzcvLworYWxpYXMJQ1AxMDcwLy8JCUlCTTAzNy8vCithbGlhcwlDUDI4Mi8vCQkJSUJNMDM3Ly8KK21vZHVsZQlJQk0wMzcvLwkJSU5URVJOQUwJCUlCTTAzNwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0wMzcvLwkJSUJNMDM3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFQkNESUMtSU5ULy8JCUlCTTAzOC8vCithbGlhcwlDUDAzOC8vCQkJSUJNMDM4Ly8KK2FsaWFzCUNTSUJNMDM4Ly8JCUlCTTAzOC8vCittb2R1bGUJSUJNMDM4Ly8JCUlOVEVSTkFMCQlJQk0wMzgJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMDM4Ly8JCUlCTTAzOAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRUJDRElDLUlOVDEvLwkJSUJNMjU2Ly8KK21vZHVsZQlJQk0yNTYvLwkJSU5URVJOQUwJCUlCTTI1NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNTYvLwkJSUJNMjU2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDI3My8vCQkJSUJNMjczLy8KK2FsaWFzCUNTSUJNMjczLy8JCUlCTTI3My8vCithbGlhcwlPU0YxMDAyMDExMS8vCQlJQk0yNzMvLworbW9kdWxlCUlCTTI3My8vCQlJTlRFUk5BTAkJSUJNMjczCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTI3My8vCQlJQk0yNzMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQy1CRS8vCQlJQk0yNzQvLworYWxpYXMJQ1AyNzQvLwkJCUlCTTI3NC8vCithbGlhcwlDU0lCTTI3NC8vCQlJQk0yNzQvLworbW9kdWxlCUlCTTI3NC8vCQlJTlRFUk5BTAkJSUJNMjc0CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTI3NC8vCQlJQk0yNzQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQy1CUi8vCQlJQk0yNzUvLworYWxpYXMJQ1AyNzUvLwkJCUlCTTI3NS8vCithbGlhcwlDU0lCTTI3NS8vCQlJQk0yNzUvLworbW9kdWxlCUlCTTI3NS8vCQlJTlRFUk5BTAkJSUJNMjc1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTI3NS8vCQlJQk0yNzUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQy1DUC1ESy8vCQlJQk0yNzcvLworYWxpYXMJRUJDRElDLUNQLU5PLy8JCUlCTTI3Ny8vCithbGlhcwlDU0lCTTI3Ny8vCQlJQk0yNzcvLworYWxpYXMJT1NGMTAwMjAxMTUvLwkJSUJNMjc3Ly8KK21vZHVsZQlJQk0yNzcvLwkJSU5URVJOQUwJCUlCTTI3NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNzcvLwkJSUJNMjc3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDI3OC8vCQkJSUJNMjc4Ly8KK2FsaWFzCUVCQ0RJQy1DUC1GSS8vCQlJQk0yNzgvLworYWxpYXMJRUJDRElDLUNQLVNFLy8JCUlCTTI3OC8vCithbGlhcwlDU0lCTTI3OC8vCQlJQk0yNzgvLworYWxpYXMJT1NGMTAwMjAxMTYvLwkJSUJNMjc4Ly8KK21vZHVsZQlJQk0yNzgvLwkJSU5URVJOQUwJCUlCTTI3OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNzgvLwkJSUJNMjc4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDI4MC8vCQkJSUJNMjgwLy8KK2FsaWFzCUVCQ0RJQy1DUC1JVC8vCQlJQk0yODAvLworYWxpYXMJQ1NJQk0yODAvLwkJSUJNMjgwLy8KK2FsaWFzCU9TRjEwMDIwMTE4Ly8JCUlCTTI4MC8vCittb2R1bGUJSUJNMjgwLy8JCUlOVEVSTkFMCQlJQk0yODAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjgwLy8JCUlCTTI4MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRUJDRElDLUpQLUUvLwkJSUJNMjgxLy8KK2FsaWFzCUNQMjgxLy8JCQlJQk0yODEvLworYWxpYXMJQ1NJQk0yODEvLwkJSUJNMjgxLy8KK21vZHVsZQlJQk0yODEvLwkJSU5URVJOQUwJCUlCTTI4MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yODEvLwkJSUJNMjgxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDI4NC8vCQkJSUJNMjg0Ly8KK2FsaWFzCUVCQ0RJQy1DUC1FUy8vCQlJQk0yODQvLworYWxpYXMJQ1NJQk0yODQvLwkJSUJNMjg0Ly8KK2FsaWFzCU9TRjEwMDIwMTFDLy8JCUlCTTI4NC8vCithbGlhcwlDUDEwNzkvLwkJSUJNMjg0Ly8KK21vZHVsZQlJQk0yODQvLwkJSU5URVJOQUwJCUlCTTI4NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yODQvLwkJSUJNMjg0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDI4NS8vCQkJSUJNMjg1Ly8KK2FsaWFzCUVCQ0RJQy1DUC1HQi8vCQlJQk0yODUvLworYWxpYXMJQ1NJQk0yODUvLwkJSUJNMjg1Ly8KK2FsaWFzCU9TRjEwMDIwMTFELy8JCUlCTTI4NS8vCittb2R1bGUJSUJNMjg1Ly8JCUlOVEVSTkFMCQlJQk0yODUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjg1Ly8JCUlCTTI4NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyOTAvLwkJCUlCTTI5MC8vCithbGlhcwlFQkNESUMtSlAtS0FOQS8vCUlCTTI5MC8vCithbGlhcwlDU0lCTTI5MC8vCQlJQk0yOTAvLworYWxpYXMJT1NGMTAwMjAxMjIvLwkJSUJNMjkwLy8KK21vZHVsZQlJQk0yOTAvLwkJSU5URVJOQUwJCUlCTTI5MAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yOTAvLwkJSUJNMjkwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDI5Ny8vCQkJSUJNMjk3Ly8KK2FsaWFzCUVCQ0RJQy1DUC1GUi8vCQlJQk0yOTcvLworYWxpYXMJQ1NJQk0yOTcvLwkJSUJNMjk3Ly8KK2FsaWFzCU9TRjEwMDIwMTI5Ly8JCUlCTTI5Ny8vCithbGlhcwlDUDEwODEvLwkJSUJNMjk3Ly8KK21vZHVsZQlJQk0yOTcvLwkJSU5URVJOQUwJCUlCTTI5NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yOTcvLwkJSUJNMjk3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDQyMC8vCQkJSUJNNDIwLy8KK2FsaWFzCUVCQ0RJQy1DUC1BUjEvLwkJSUJNNDIwLy8KK2FsaWFzCUNTSUJNNDIwLy8JCUlCTTQyMC8vCithbGlhcwlPU0YxMDAyMDFBNC8vCQlJQk00MjAvLworbW9kdWxlCUlCTTQyMC8vCQlJTlRFUk5BTAkJSUJNNDIwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTQyMC8vCQlJQk00MjAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQNDIzLy8JCQlJQk00MjMvLworYWxpYXMJRUJDRElDLUNQLUdSLy8JCUlCTTQyMy8vCithbGlhcwlDU0lCTTQyMy8vCQlJQk00MjMvLworbW9kdWxlCUlCTTQyMy8vCQlJTlRFUk5BTAkJSUJNNDIzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTQyMy8vCQlJQk00MjMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQNDI0Ly8JCQlJQk00MjQvLworYWxpYXMJRUJDRElDLUNQLUhFLy8JCUlCTTQyNC8vCithbGlhcwlDU0lCTTQyNC8vCQlJQk00MjQvLworYWxpYXMJT1NGMTAwMjAxQTgvLwkJSUJNNDI0Ly8KK21vZHVsZQlJQk00MjQvLwkJSU5URVJOQUwJCUlCTTQyNAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00MjQvLwkJSUJNNDI0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDQzNy8vCQkJSUJNNDM3Ly8KK2FsaWFzCTQzNy8vCQkJSUJNNDM3Ly8KK2FsaWFzCUNTUEM4Q09ERVBBR0U0MzcvLwlJQk00MzcvLworYWxpYXMJT1NGMTAwMjAxQjUvLwkJSUJNNDM3Ly8KK21vZHVsZQlJQk00MzcvLwkJSU5URVJOQUwJCUlCTTQzNwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00MzcvLwkJSUJNNDM3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDUwMC8vCQkJSUJNNTAwLy8KK2FsaWFzCTUwMC8vCQkJSUJNNTAwLy8KK2FsaWFzCTUwMFYxLy8JCQlJQk01MDAvLworYWxpYXMJRUJDRElDLUNQLUJFLy8JCUlCTTUwMC8vCithbGlhcwlFQkNESUMtQ1AtQ0gvLwkJSUJNNTAwLy8KK2FsaWFzCUNTSUJNNTAwLy8JCUlCTTUwMC8vCithbGlhcwlPU0YxMDAyMDFGNC8vCQlJQk01MDAvLworYWxpYXMJQ1AxMDg0Ly8JCUlCTTUwMC8vCittb2R1bGUJSUJNNTAwLy8JCUlOVEVSTkFMCQlJQk01MDAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNTAwLy8JCUlCTTUwMAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NTAvLwkJCUlCTTg1MC8vCithbGlhcwk4NTAvLwkJCUlCTTg1MC8vCithbGlhcwlDU1BDODUwTVVMVElMSU5HVUFMLy8JSUJNODUwLy8KK2FsaWFzCU9TRjEwMDIwMzUyLy8JCUlCTTg1MC8vCittb2R1bGUJSUJNODUwLy8JCUlOVEVSTkFMCQlJQk04NTAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODUwLy8JCUlCTTg1MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NTEvLwkJCUlCTTg1MS8vCithbGlhcwk4NTEvLwkJCUlCTTg1MS8vCithbGlhcwlDU0lCTTg1MS8vCQlJQk04NTEvLworbW9kdWxlCUlCTTg1MS8vCQlJTlRFUk5BTAkJSUJNODUxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg1MS8vCQlJQk04NTEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODUyLy8JCQlJQk04NTIvLworYWxpYXMJODUyLy8JCQlJQk04NTIvLworYWxpYXMJQ1NQQ1A4NTIvLwkJSUJNODUyLy8KK2FsaWFzCU9TRjEwMDIwMzU0Ly8JCUlCTTg1Mi8vCittb2R1bGUJSUJNODUyLy8JCUlOVEVSTkFMCQlJQk04NTIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODUyLy8JCUlCTTg1MgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NTUvLwkJCUlCTTg1NS8vCithbGlhcwk4NTUvLwkJCUlCTTg1NS8vCithbGlhcwlDU0lCTTg1NS8vCQlJQk04NTUvLworYWxpYXMJT1NGMTAwMjAzNTcvLwkJSUJNODU1Ly8KK21vZHVsZQlJQk04NTUvLwkJSU5URVJOQUwJCUlCTTg1NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NTUvLwkJSUJNODU1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tODU2Ly8JCUlCTTg1Ni8vCithbGlhcwlDUDg1Ni8vCQkJSUJNODU2Ly8KK2FsaWFzCTg1Ni8vCQkJSUJNODU2Ly8KK2FsaWFzCUNTSUJNODU2Ly8JCUlCTTg1Ni8vCittb2R1bGUJSUJNODU2Ly8JCUlOVEVSTkFMCQlJQk04NTYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODU2Ly8JCUlCTTg1NgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NTcvLwkJCUlCTTg1Ny8vCithbGlhcwk4NTcvLwkJCUlCTTg1Ny8vCithbGlhcwlDU0lCTTg1Ny8vCQlJQk04NTcvLworYWxpYXMJT1NGMTAwMjAzNTkvLwkJSUJNODU3Ly8KK21vZHVsZQlJQk04NTcvLwkJSU5URVJOQUwJCUlCTTg1NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NTcvLwkJSUJNODU3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2MC8vCQkJSUJNODYwLy8KK2FsaWFzCTg2MC8vCQkJSUJNODYwLy8KK2FsaWFzCUNTSUJNODYwLy8JCUlCTTg2MC8vCittb2R1bGUJSUJNODYwLy8JCUlOVEVSTkFMCQlJQk04NjAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODYwLy8JCUlCTTg2MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjEvLwkJCUlCTTg2MS8vCithbGlhcwk4NjEvLwkJCUlCTTg2MS8vCithbGlhcwlDUElCTTg2MS8vCQlJQk04NjEvLworYWxpYXMJT1NGMTAwMjAzNUQvLwkJSUJNODYxLy8KK21vZHVsZQlJQk04NjEvLwkJSU5URVJOQUwJCUlCTTg2MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjEvLwkJSUJNODYxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2Mi8vCQkJSUJNODYyLy8KK2FsaWFzCTg2Mi8vCQkJSUJNODYyLy8KK2FsaWFzCUNTUEM4NjJMQVRJTkhFQlJFVy8vCUlCTTg2Mi8vCithbGlhcwlPU0YxMDAyMDM1RS8vCQlJQk04NjIvLworbW9kdWxlCUlCTTg2Mi8vCQlJTlRFUk5BTAkJSUJNODYyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2Mi8vCQlJQk04NjIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODYzLy8JCQlJQk04NjMvLworYWxpYXMJODYzLy8JCQlJQk04NjMvLworYWxpYXMJQ1NJQk04NjMvLwkJSUJNODYzLy8KK2FsaWFzCU9TRjEwMDIwMzVGLy8JCUlCTTg2My8vCittb2R1bGUJSUJNODYzLy8JCUlOVEVSTkFMCQlJQk04NjMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODYzLy8JCUlCTTg2MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjQvLwkJCUlCTTg2NC8vCithbGlhcwk4NjQvLwkJCUlCTTg2NC8vCithbGlhcwlDU0lCTTg2NC8vCQlJQk04NjQvLworYWxpYXMJT1NGMTAwMjAzNjAvLwkJSUJNODY0Ly8KK21vZHVsZQlJQk04NjQvLwkJSU5URVJOQUwJCUlCTTg2NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjQvLwkJSUJNODY0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2NS8vCQkJSUJNODY1Ly8KK2FsaWFzCTg2NS8vCQkJSUJNODY1Ly8KK2FsaWFzCUNTSUJNODY1Ly8JCUlCTTg2NS8vCittb2R1bGUJSUJNODY1Ly8JCUlOVEVSTkFMCQlJQk04NjUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODY1Ly8JCUlCTTg2NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjYvLwkJCUlCTTg2Ni8vCithbGlhcwk4NjYvLwkJCUlCTTg2Ni8vCithbGlhcwlDU0lCTTg2Ni8vCQlJQk04NjYvLworbW9kdWxlCUlCTTg2Ni8vCQlJTlRFUk5BTAkJSUJNODY2CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2Ni8vCQlJQk04NjYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODY2TkFWLy8JCUlCTTg2Nk5BVi8vCithbGlhcwk4NjZOQVYvLwkJSUJNODY2TkFWLy8KK21vZHVsZQlJQk04NjZOQVYvLwkJSU5URVJOQUwJCUlCTTg2Nk5BVgkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2Nk5BVi8vCQlJQk04NjZOQVYJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjgvLwkJCUlCTTg2OC8vCithbGlhcwlDUC1BUi8vCQkJSUJNODY4Ly8KK2FsaWFzCUNTSUJNODY4Ly8JCUlCTTg2OC8vCithbGlhcwlPU0YxMDAyMDM2NC8vCQlJQk04NjgvLworbW9kdWxlCUlCTTg2OC8vCQlJTlRFUk5BTAkJSUJNODY4CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2OC8vCQlJQk04NjgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODY5Ly8JCQlJQk04NjkvLworYWxpYXMJODY5Ly8JCQlJQk04NjkvLworYWxpYXMJQ1AtR1IvLwkJCUlCTTg2OS8vCithbGlhcwlDU0lCTTg2OS8vCQlJQk04NjkvLworYWxpYXMJT1NGMTAwMjAzNjUvLwkJSUJNODY5Ly8KK21vZHVsZQlJQk04NjkvLwkJSU5URVJOQUwJCUlCTTg2OQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjkvLwkJSUJNODY5CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg3MC8vCQkJSUJNODcwLy8KK2FsaWFzCUVCQ0RJQy1DUC1ST0VDRS8vCUlCTTg3MC8vCithbGlhcwlFQkNESUMtQ1AtWVUvLwkJSUJNODcwLy8KK2FsaWFzCUNTSUJNODcwLy8JCUlCTTg3MC8vCithbGlhcwlPU0YxMDAyMDM2Ni8vCQlJQk04NzAvLworbW9kdWxlCUlCTTg3MC8vCQlJTlRFUk5BTAkJSUJNODcwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg3MC8vCQlJQk04NzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODcxLy8JCQlJQk04NzEvLworYWxpYXMJRUJDRElDLUNQLUlTLy8JCUlCTTg3MS8vCithbGlhcwlDU0lCTTg3MS8vCQlJQk04NzEvLworYWxpYXMJT1NGMTAwMjAzNjcvLwkJSUJNODcxLy8KK21vZHVsZQlJQk04NzEvLwkJSU5URVJOQUwJCUlCTTg3MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NzEvLwkJSUJNODcxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg3NS8vCQkJSUJNODc1Ly8KK2FsaWFzCUVCQ0RJQy1HUkVFSy8vCQlJQk04NzUvLworYWxpYXMJT1NGMTAwMjAzNkIvLwkJSUJNODc1Ly8KK21vZHVsZQlJQk04NzUvLwkJSU5URVJOQUwJCUlCTTg3NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NzUvLwkJSUJNODc1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg4MC8vCQkJSUJNODgwLy8KK2FsaWFzCUVCQ0RJQy1DWVJJTExJQy8vCUlCTTg4MC8vCithbGlhcwlDU0lCTTg4MC8vCQlJQk04ODAvLworYWxpYXMJT1NGMTAwMjAzNzAvLwkJSUJNODgwLy8KK21vZHVsZQlJQk04ODAvLwkJSU5URVJOQUwJCUlCTTg4MAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04ODAvLwkJSUJNODgwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg5MS8vCQkJSUJNODkxLy8KK2FsaWFzCUNTSUJNODkxLy8JCUlCTTg5MS8vCithbGlhcwlPU0YxMDAyMDM3Qi8vCQlJQk04OTEvLworbW9kdWxlCUlCTTg5MS8vCQlJTlRFUk5BTAkJSUJNODkxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg5MS8vCQlJQk04OTEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQOTAzLy8JCQlJQk05MDMvLworYWxpYXMJQ1NJQk05MDMvLwkJSUJNOTAzLy8KK2FsaWFzCU9TRjEwMDIwMzg3Ly8JCUlCTTkwMy8vCittb2R1bGUJSUJNOTAzLy8JCUlOVEVSTkFMCQlJQk05MDMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTAzLy8JCUlCTTkwMwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A5MDQvLwkJCUlCTTkwNC8vCithbGlhcwk5MDQvLwkJCUlCTTkwNC8vCithbGlhcwlDU0lCTTkwNC8vCQlJQk05MDQvLworYWxpYXMJT1NGMTAwMjAzODgvLwkJSUJNOTA0Ly8KK21vZHVsZQlJQk05MDQvLwkJSU5URVJOQUwJCUlCTTkwNAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MDQvLwkJSUJNOTA0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDkwNS8vCQkJSUJNOTA1Ly8KK2FsaWFzCUVCQ0RJQy1DUC1UUi8vCQlJQk05MDUvLworYWxpYXMJQ1NJQk05MDUvLwkJSUJNOTA1Ly8KK21vZHVsZQlJQk05MDUvLwkJSU5URVJOQUwJCUlCTTkwNQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MDUvLwkJSUJNOTA1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDkxOC8vCQkJSUJNOTE4Ly8KK2FsaWFzCUVCQ0RJQy1DUC1BUjIvLwkJSUJNOTE4Ly8KK2FsaWFzCUNTSUJNOTE4Ly8JCUlCTTkxOC8vCithbGlhcwlPU0YxMDAyMDM5Ni8vCQlJQk05MTgvLworbW9kdWxlCUlCTTkxOC8vCQlJTlRFUk5BTAkJSUJNOTE4CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkxOC8vCQlJQk05MTgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MjIvLwkJSUJNOTIyLy8KK2FsaWFzCUNQOTIyLy8JCQlJQk05MjIvLworYWxpYXMJQ1NJQk05MjIvLwkJSUJNOTIyLy8KK21vZHVsZQlJQk05MjIvLwkJSU5URVJOQUwJCUlCTTkyMgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MjIvLwkJSUJNOTIyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTMwLy8JCUlCTTkzMC8vCithbGlhcwlDUDkzMC8vCQkJSUJNOTMwLy8KK2FsaWFzCUNTSUJNOTMwLy8JCUlCTTkzMC8vCittb2R1bGUJSUJNOTMwLy8JCUlOVEVSTkFMCQlJQk05MzAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTMwLy8JCUlCTTkzMAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkzMi8vCQlJQk05MzIvLworYWxpYXMJQ1NJQk05MzIvLwkJSUJNOTMyLy8KK21vZHVsZQlJQk05MzIvLwkJSU5URVJOQUwJCUlCTTkzMgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MzIvLwkJSUJNOTMyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTMzLy8JCUlCTTkzMy8vCithbGlhcwlDUDkzMy8vCQkJSUJNOTMzLy8KK2FsaWFzCUNTSUJNOTMzLy8JCUlCTTkzMy8vCittb2R1bGUJSUJNOTMzLy8JCUlOVEVSTkFMCQlJQk05MzMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTMzLy8JCUlCTTkzMwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkzNS8vCQlJQk05MzUvLworYWxpYXMJQ1A5MzUvLwkJCUlCTTkzNS8vCithbGlhcwlDU0lCTTkzNS8vCQlJQk05MzUvLworbW9kdWxlCUlCTTkzNS8vCQlJTlRFUk5BTAkJSUJNOTM1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkzNS8vCQlJQk05MzUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MzcvLwkJSUJNOTM3Ly8KK2FsaWFzCUNQOTM3Ly8JCQlJQk05MzcvLworYWxpYXMJQ1NJQk05MzcvLwkJSUJNOTM3Ly8KK21vZHVsZQlJQk05MzcvLwkJSU5URVJOQUwJCUlCTTkzNwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MzcvLwkJSUJNOTM3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTM5Ly8JCUlCTTkzOS8vCithbGlhcwlDUDkzOS8vCQkJSUJNOTM5Ly8KK2FsaWFzCUNTSUJNOTM5Ly8JCUlCTTkzOS8vCittb2R1bGUJSUJNOTM5Ly8JCUlOVEVSTkFMCQlJQk05MzkJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTM5Ly8JCUlCTTkzOQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTk0My8vCQlJQk05NDMvLworYWxpYXMJQ1NJQk05NDMvLwkJSUJNOTQzLy8KK21vZHVsZQlJQk05NDMvLwkJSU5URVJOQUwJCUlCTTk0MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05NDMvLwkJSUJNOTQzCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDEwMDQvLwkJSUJNMTAwNC8vCithbGlhcwlPUzJMQVRJTjEvLwkJSUJNMTAwNC8vCittb2R1bGUJSUJNMTAwNC8vCQlJTlRFUk5BTAkJSUJNMTAwNAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDA0Ly8JCUlCTTEwMDQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQMTAyNi8vCQlJQk0xMDI2Ly8KK2FsaWFzCTEwMjYvLwkJCUlCTTEwMjYvLworYWxpYXMJQ1NJQk0xMDI2Ly8JCUlCTTEwMjYvLworYWxpYXMJT1NGMTAwMjA0MDIvLwkJSUJNMTAyNi8vCittb2R1bGUJSUJNMTAyNi8vCQlJTlRFUk5BTAkJSUJNMTAyNgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDI2Ly8JCUlCTTEwMjYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMDQ2Ly8JCUlCTTEwNDYvLworYWxpYXMJQ1AxMDQ2Ly8JCUlCTTEwNDYvLworYWxpYXMJMTA0Ni8vCQkJSUJNMTA0Ni8vCittb2R1bGUJSUJNMTA0Ni8vCQlJTlRFUk5BTAkJSUJNMTA0NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDQ2Ly8JCUlCTTEwNDYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMDQ3Ly8JCUlCTTEwNDcvLworYWxpYXMJQ1AxMDQ3Ly8JCUlCTTEwNDcvLworYWxpYXMJMTA0Ny8vCQkJSUJNMTA0Ny8vCithbGlhcwlPU0YxMDAyMDQxNy8vCQlJQk0xMDQ3Ly8KK21vZHVsZQlJQk0xMDQ3Ly8JCUlOVEVSTkFMCQlJQk0xMDQ3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEwNDcvLwkJSUJNMTA0NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExMjQvLwkJSUJNMTEyNC8vCithbGlhcwlDUDExMjQvLwkJSUJNMTEyNC8vCithbGlhcwlDU0lCTTExMjQvLwkJSUJNMTEyNC8vCittb2R1bGUJSUJNMTEyNC8vCQlJTlRFUk5BTAkJSUJNMTEyNAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTI0Ly8JCUlCTTExMjQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTI5Ly8JCUlCTTExMjkvLworYWxpYXMJQ1AxMTI5Ly8JCUlCTTExMjkvLworYWxpYXMJQ1NJQk0xMTI5Ly8JCUlCTTExMjkvLworbW9kdWxlCUlCTTExMjkvLwkJSU5URVJOQUwJCUlCTTExMjkJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEyOS8vCQlJQk0xMTI5CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE2MC8vCQlJQk0xMTYwLy8KK2FsaWFzCUNQMTE2MC8vCQlJQk0xMTYwLy8KK2FsaWFzCUNTSUJNMTE2MC8vCQlJQk0xMTYwLy8KK21vZHVsZQlJQk0xMTYwLy8JCUlOVEVSTkFMCQlJQk0xMTYwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNjAvLwkJSUJNMTE2MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjEvLwkJSUJNMTE2MS8vCithbGlhcwlDUDExNjEvLwkJSUJNMTE2MS8vCithbGlhcwlDU0lCTTExNjEvLwkJSUJNMTE2MS8vCittb2R1bGUJSUJNMTE2MS8vCQlJTlRFUk5BTAkJSUJNMTE2MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTYxLy8JCUlCTTExNjEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTMyLy8JCUlCTTExMzIvLworYWxpYXMJQ1AxMTMyLy8JCUlCTTExMzIvLworYWxpYXMJQ1NJQk0xMTMyLy8JCUlCTTExMzIvLworbW9kdWxlCUlCTTExMzIvLwkJSU5URVJOQUwJCUlCTTExMzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEzMi8vCQlJQk0xMTMyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTEzMy8vCQlJQk0xMTMzLy8KK2FsaWFzCUNQMTEzMy8vCQlJQk0xMTMzLy8KK2FsaWFzCUNTSUJNMTEzMy8vCQlJQk0xMTMzLy8KK21vZHVsZQlJQk0xMTMzLy8JCUlOVEVSTkFMCQlJQk0xMTMzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMzMvLwkJSUJNMTEzMwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjIvLwkJSUJNMTE2Mi8vCithbGlhcwlDUDExNjIvLwkJSUJNMTE2Mi8vCithbGlhcwlDU0lCTTExNjIxMTYyLy8JCUlCTTExNjIvLworbW9kdWxlCUlCTTExNjIvLwkJSU5URVJOQUwJCUlCTTExNjIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE2Mi8vCQlJQk0xMTYyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE2My8vCQlJQk0xMTYzLy8KK2FsaWFzCUNQMTE2My8vCQlJQk0xMTYzLy8KK2FsaWFzCUNTSUJNMTE2My8vCQlJQk0xMTYzLy8KK21vZHVsZQlJQk0xMTYzLy8JCUlOVEVSTkFMCQlJQk0xMTYzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNjMvLwkJSUJNMTE2MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjQvLwkJSUJNMTE2NC8vCithbGlhcwlDUDExNjQvLwkJSUJNMTE2NC8vCithbGlhcwlDU0lCTTExNjQvLwkJSUJNMTE2NC8vCittb2R1bGUJSUJNMTE2NC8vCQlJTlRFUk5BTAkJSUJNMTE2NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTY0Ly8JCUlCTTExNjQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVVQ0tSLy8JCQlFVUMtS1IvLworYWxpYXMJQ1NFVUNLUi8vCQlFVUMtS1IvLworYWxpYXMJT1NGMDAwNDAwMGEvLwkJRVVDLUtSLy8KK21vZHVsZQlFVUMtS1IvLwkJSU5URVJOQUwJCUVVQy1LUgkJMQorbW9kdWxlCUlOVEVSTkFMCQlFVUMtS1IvLwkJRVVDLUtSCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNU0NQOTQ5Ly8JCVVIQy8vCithbGlhcwlDUDk0OS8vCQkJVUhDLy8KK2FsaWFzCU9TRjEwMDIwM0I1Ly8JCVVIQy8vCittb2R1bGUJVUhDLy8JCQlJTlRFUk5BTAkJVUhDCQkxCittb2R1bGUJSU5URVJOQUwJCVVIQy8vCQkJVUhDCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNU0NQMTM2MS8vCQlKT0hBQi8vCithbGlhcwlDUDEzNjEvLwkJSk9IQUIvLworbW9kdWxlCUpPSEFCLy8JCQlJTlRFUk5BTAkJSk9IQUIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSk9IQUIvLwkJCUpPSEFCCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlCSUctRklWRS8vCQlCSUc1Ly8KK2FsaWFzCUJJR0ZJVkUvLwkJQklHNS8vCithbGlhcwlCSUctNS8vCQkJQklHNS8vCithbGlhcwlDTi1CSUc1Ly8JCUJJRzUvLworYWxpYXMJQ1A5NTAvLwkJCUJJRzUvLworbW9kdWxlCUJJRzUvLwkJCUlOVEVSTkFMCQlCSUc1CQkxCittb2R1bGUJSU5URVJOQUwJCUJJRzUvLwkJCUJJRzUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUJJRzUtSEtTQ1MvLwkJQklHNUhLU0NTLy8KK21vZHVsZQlCSUc1SEtTQ1MvLwkJSU5URVJOQUwJCUJJRzVIS1NDUwkxCittb2R1bGUJSU5URVJOQUwJCUJJRzVIS1NDUy8vCQlCSUc1SEtTQ1MJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRVVDSlAtTVMvLwkJRVVDLUpQLU1TLy8KK2FsaWFzCUVVQ0pQLU9QRU4vLwkJRVVDLUpQLU1TLy8KK2FsaWFzCUVVQ0pQLVdJTi8vCQlFVUMtSlAtTVMvLworbW9kdWxlCUVVQy1KUC1NUy8vCQlJTlRFUk5BTAkJRVVDLUpQLU1TCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLUpQLU1TLy8JCUVVQy1KUC1NUwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFVUNKUC8vCQkJRVVDLUpQLy8KK2FsaWFzCUNTRVVDUEtERk1USkFQQU5FU0UvLwlFVUMtSlAvLworYWxpYXMJT1NGMDAwMzAwMTAvLwkJRVVDLUpQLy8KK2FsaWFzCVVKSVMvLwkJCUVVQy1KUC8vCittb2R1bGUJRVVDLUpQLy8JCUlOVEVSTkFMCQlFVUMtSlAJCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLUpQLy8JCUVVQy1KUAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRVVDQ04vLwkJCUVVQy1DTi8vCithbGlhcwlHQjIzMTIvLwkJRVVDLUNOLy8KK2FsaWFzCWNzR0IyMzEyLy8JCUVVQy1DTi8vCithbGlhcwlDTi1HQi8vCQkJRVVDLUNOLy8KK21vZHVsZQlFVUMtQ04vLwkJSU5URVJOQUwJCUVVQy1DTgkJMQorbW9kdWxlCUlOVEVSTkFMCQlFVUMtQ04vLwkJRVVDLUNOCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJRVVDLUNOLy8JCUJJRzUvLwkJCUdCQklHNQkJMQorbW9kdWxlCUJJRzUvLwkJCUVVQy1DTi8vCQlHQkJJRzUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUdCMTMwMDAvLwkJR0JLLy8KK2FsaWFzCUNQOTM2Ly8JCQlHQksvLworYWxpYXMJTVM5MzYvLwkJCUdCSy8vCithbGlhcwlXSU5ET1dTLTkzNi8vCQlHQksvLworbW9kdWxlCUdCSy8vCQkJSU5URVJOQUwJCUdCSwkJMQorbW9kdWxlCUlOVEVSTkFMCQlHQksvLwkJCUdCSwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUdCSy8vCQkJRVVDLUNOLy8JCUdCR0JLCQkxCittb2R1bGUJRVVDLUNOLy8JCUdCSy8vCQkJR0JHQksJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVVQ1RXLy8JCQlFVUMtVFcvLworYWxpYXMJT1NGMDAwNTAwMGEvLwkJRVVDLVRXLy8KK21vZHVsZQlFVUMtVFcvLwkJSU5URVJOQUwJCUVVQy1UVwkJMQorbW9kdWxlCUlOVEVSTkFMCQlFVUMtVFcvLwkJRVVDLVRXCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlSVVNDSUkvLwkJQ1AxMTI1Ly8KK2FsaWFzCUlCTTg0OC8vCQlDUDExMjUvLworbW9kdWxlCUNQMTEyNS8vCQlJTlRFUk5BTAkJQ1AxMTI1CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTEyNS8vCQlDUDExMjUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUVFLy8JCQlDUDEyNTAvLworYWxpYXMJV0lORE9XUy0xMjUwLy8JCUNQMTI1MC8vCittb2R1bGUJQ1AxMjUwLy8JCUlOVEVSTkFMCQlDUDEyNTAJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1AxMjUwLy8JCUNQMTI1MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVMtQ1lSTC8vCQlDUDEyNTEvLworYWxpYXMJV0lORE9XUy0xMjUxLy8JCUNQMTI1MS8vCittb2R1bGUJQ1AxMjUxLy8JCUlOVEVSTkFMCQlDUDEyNTEJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1AxMjUxLy8JCUNQMTI1MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVMtQU5TSS8vCQlDUDEyNTIvLworYWxpYXMJV0lORE9XUy0xMjUyLy8JCUNQMTI1Mi8vCittb2R1bGUJQ1AxMjUyLy8JCUlOVEVSTkFMCQlDUDEyNTIJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1AxMjUyLy8JCUNQMTI1MgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVMtR1JFRUsvLwkJQ1AxMjUzLy8KK2FsaWFzCVdJTkRPV1MtMTI1My8vCQlDUDEyNTMvLworbW9kdWxlCUNQMTI1My8vCQlJTlRFUk5BTAkJQ1AxMjUzCQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1My8vCQlDUDEyNTMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLVRVUksvLwkJQ1AxMjU0Ly8KK2FsaWFzCVdJTkRPV1MtMTI1NC8vCQlDUDEyNTQvLworbW9kdWxlCUNQMTI1NC8vCQlJTlRFUk5BTAkJQ1AxMjU0CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1NC8vCQlDUDEyNTQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUhFQlIvLwkJQ1AxMjU1Ly8KK2FsaWFzCVdJTkRPV1MtMTI1NS8vCQlDUDEyNTUvLworbW9kdWxlCUNQMTI1NS8vCQlJTlRFUk5BTAkJQ1AxMjU1CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1NS8vCQlDUDEyNTUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUFSQUIvLwkJQ1AxMjU2Ly8KK2FsaWFzCVdJTkRPV1MtMTI1Ni8vCQlDUDEyNTYvLworbW9kdWxlCUNQMTI1Ni8vCQlJTlRFUk5BTAkJQ1AxMjU2CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1Ni8vCQlDUDEyNTYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVdJTkJBTFRSSU0vLwkJQ1AxMjU3Ly8KK2FsaWFzCVdJTkRPV1MtMTI1Ny8vCQlDUDEyNTcvLworbW9kdWxlCUNQMTI1Ny8vCQlJTlRFUk5BTAkJQ1AxMjU3CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1Ny8vCQlDUDEyNTcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVdJTkRPV1MtMTI1OC8vCQlDUDEyNTgvLworbW9kdWxlCUNQMTI1OC8vCQlJTlRFUk5BTAkJQ1AxMjU4CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1OC8vCQlDUDEyNTgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCTg3NC8vCQkJSUJNODc0Ly8KK2FsaWFzCUNQODc0Ly8JCQlJQk04NzQvLworYWxpYXMJV0lORE9XUy04NzQvLwkJSUJNODc0Ly8KK21vZHVsZQlJQk04NzQvLwkJSU5URVJOQUwJCUlCTTg3NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NzQvLwkJSUJNODc0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQ1A3MzcvLwkJCUlOVEVSTkFMCQlDUDczNwkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDczNy8vCQkJQ1A3MzcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlDUDc3MC8vCQkJSU5URVJOQUwJCUNQNzcwCQkxCittb2R1bGUJSU5URVJOQUwJCUNQNzcwLy8JCQlDUDc3MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUNQNzcxLy8JCQlJTlRFUk5BTAkJQ1A3NzEJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1A3NzEvLwkJCUNQNzcxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQ1A3NzIvLwkJCUlOVEVSTkFMCQlDUDc3MgkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDc3Mi8vCQkJQ1A3NzIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlDUDc3My8vCQkJSU5URVJOQUwJCUNQNzczCQkxCittb2R1bGUJSU5URVJOQUwJCUNQNzczLy8JCQlDUDc3MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUNQNzc0Ly8JCQlJTlRFUk5BTAkJQ1A3NzQJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1A3NzQvLwkJCUNQNzc0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk03NzUvLwkJQ1A3NzUvLworYWxpYXMJQ1NQQzc3NUJBTFRJQy8vCQlDUDc3NS8vCittb2R1bGUJQ1A3NzUvLwkJCUlOVEVSTkFMCQlDUDc3NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDc3NS8vCQkJQ1A3NzUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTSVNPMjAyMkpQLy8JCUlTTy0yMDIyLUpQLy8KK2FsaWFzCUlTTzIwMjJKUC8vCQlJU08tMjAyMi1KUC8vCittb2R1bGUJSVNPLTIwMjItSlAvLwkJSU5URVJOQUwJCUlTTy0yMDIyLUpQCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTIwMjItSlAvLwkJSVNPLTIwMjItSlAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NJU08yMDIySlAyLy8JCUlTTy0yMDIyLUpQLTIvLworYWxpYXMJSVNPMjAyMkpQMi8vCQlJU08tMjAyMi1KUC0yLy8KK21vZHVsZQlJU08tMjAyMi1KUC0yLy8JCUlOVEVSTkFMCQlJU08tMjAyMi1KUAkxCittb2R1bGUJSU5URVJOQUwJCUlTTy0yMDIyLUpQLTIvLwkJSVNPLTIwMjItSlAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUlTTy0yMDIyLUpQLTMvLwkJSU5URVJOQUwJCUlTTy0yMDIyLUpQLTMJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tMjAyMi1KUC0zLy8JCUlTTy0yMDIyLUpQLTMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NJU08yMDIyS1IvLwkJSVNPLTIwMjItS1IvLworYWxpYXMJSVNPMjAyMktSLy8JCUlTTy0yMDIyLUtSLy8KK21vZHVsZQlJU08tMjAyMi1LUi8vCQlJTlRFUk5BTAkJSVNPLTIwMjItS1IJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tMjAyMi1LUi8vCQlJU08tMjAyMi1LUgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0lTTzIwMjJDTi8vCQlJU08tMjAyMi1DTi8vCithbGlhcwlJU08yMDIyQ04vLwkJSVNPLTIwMjItQ04vLworbW9kdWxlCUlTTy0yMDIyLUNOLy8JCUlOVEVSTkFMCQlJU08tMjAyMi1DTgkxCittb2R1bGUJSU5URVJOQUwJCUlTTy0yMDIyLUNOLy8JCUlTTy0yMDIyLUNOCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTzIwMjJDTkVYVC8vCQlJU08tMjAyMi1DTi1FWFQvLworbW9kdWxlCUlTTy0yMDIyLUNOLUVYVC8vCUlOVEVSTkFMCQlJU08tMjAyMi1DTi1FWFQJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tMjAyMi1DTi1FWFQvLwlJU08tMjAyMi1DTi1FWFQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTUFDLy8JCQlNQUNJTlRPU0gvLworYWxpYXMJQ1NNQUNJTlRPU0gvLwkJTUFDSU5UT1NILy8KK21vZHVsZQlNQUNJTlRPU0gvLwkJSU5URVJOQUwJCU1BQ0lOVE9TSAkxCittb2R1bGUJSU5URVJOQUwJCU1BQ0lOVE9TSC8vCQlNQUNJTlRPU0gJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE0My8vCQlJRUNfUDI3LTEvLworYWxpYXMJQ1NJU08xNDNJRUNQMjcxLy8JSUVDX1AyNy0xLy8KK2FsaWFzCUlFQ19QMjcxLy8JCUlFQ19QMjctMS8vCittb2R1bGUJSUVDX1AyNy0xLy8JCUlOVEVSTkFMCQlJRUNfUDI3LTEJMQorbW9kdWxlCUlOVEVSTkFMCQlJRUNfUDI3LTEvLwkJSUVDX1AyNy0xCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTT185MDM2Ly8JCUFTTU9fNDQ5Ly8KK2FsaWFzCUFSQUJJQzcvLwkJQVNNT180NDkvLworYWxpYXMJSVNPLUlSLTg5Ly8JCUFTTU9fNDQ5Ly8KK2FsaWFzCUNTSVNPODlBU01PNDQ5Ly8JQVNNT180NDkvLworbW9kdWxlCUFTTU9fNDQ5Ly8JCUlOVEVSTkFMCQlBU01PXzQ0OQkxCittb2R1bGUJSU5URVJOQUwJCUFTTU9fNDQ5Ly8JCUFTTU9fNDQ5CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUFOU0lfWDMuMTEwLTE5ODMvLwlBTlNJX1gzLjExMC8vCithbGlhcwlJU08tSVItOTkvLwkJQU5TSV9YMy4xMTAvLworYWxpYXMJQ1NBX1Q1MDAtMTk4My8vCQlBTlNJX1gzLjExMC8vCithbGlhcwlDU0FfVDUwMC8vCQlBTlNJX1gzLjExMC8vCithbGlhcwlOQVBMUFMvLwkJQU5TSV9YMy4xMTAvLworYWxpYXMJQ1NJU085OU5BUExQUy8vCQlBTlNJX1gzLjExMC8vCittb2R1bGUJQU5TSV9YMy4xMTAvLwkJSU5URVJOQUwJCUFOU0lfWDMuMTEwCTEKK21vZHVsZQlJTlRFUk5BTAkJQU5TSV9YMy4xMTAvLwkJQU5TSV9YMy4xMTAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTEzOS8vCQlDU05fMzY5MTAzLy8KK2FsaWFzCUNTSVNPMTM5Q1NOMzY5MTAzLy8JQ1NOXzM2OTEwMy8vCittb2R1bGUJQ1NOXzM2OTEwMy8vCQlJTlRFUk5BTAkJQ1NOXzM2OTEwMwkxCittb2R1bGUJSU5URVJOQUwJCUNTTl8zNjkxMDMvLwkJQ1NOXzM2OTEwMwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDV0ktMi8vCQkJQ1dJLy8KK2FsaWFzCUNQLUhVLy8JCQlDV0kvLworbW9kdWxlCUNXSS8vCQkJSU5URVJOQUwJCUNXSQkJMQorbW9kdWxlCUlOVEVSTkFMCQlDV0kvLwkJCUNXSQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJREVDLy8JCQlERUMtTUNTLy8KK2FsaWFzCUNTREVDTUNTLy8JCURFQy1NQ1MvLworYWxpYXMJREVDTUNTLy8JCURFQy1NQ1MvLworbW9kdWxlCURFQy1NQ1MvLwkJSU5URVJOQUwJCURFQy1NQ1MJCTEKK21vZHVsZQlJTlRFUk5BTAkJREVDLU1DUy8vCQlERUMtTUNTCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTExLy8JCUVDTUEtQ1lSSUxMSUMvLworYWxpYXMJQ1NJU08xMTFFQ01BQ1lSSUxMSUMvLwlFQ01BLUNZUklMTElDLy8KK2FsaWFzCUVDTUFDWVJJTExJQy8vCQlFQ01BLUNZUklMTElDLy8KK21vZHVsZQlFQ01BLUNZUklMTElDLy8JCUlOVEVSTkFMCQlFQ01BLUNZUklMTElDCTEKK21vZHVsZQlJTlRFUk5BTAkJRUNNQS1DWVJJTExJQy8vCQlFQ01BLUNZUklMTElDCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVNUX1NFVl8zNTgtODgvLwkJR09TVF8xOTc2OC03NC8vCithbGlhcwlHT1NUXzE5NzY4Ly8JCUdPU1RfMTk3NjgtNzQvLworYWxpYXMJSVNPLUlSLTE1My8vCQlHT1NUXzE5NzY4LTc0Ly8KK2FsaWFzCUNTSVNPMTUzR09TVDE5NzY4NzQvLwlHT1NUXzE5NzY4LTc0Ly8KK2FsaWFzCUdPU1RfMTk3Njg3NC8vCQlHT1NUXzE5NzY4LTc0Ly8KK21vZHVsZQlHT1NUXzE5NzY4LTc0Ly8JCUlOVEVSTkFMCQlHT1NUXzE5NzY4LTc0CTEKK21vZHVsZQlJTlRFUk5BTAkJR09TVF8xOTc2OC03NC8vCQlHT1NUXzE5NzY4LTc0CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xNTAvLwkJR1JFRUstQ0NJVFQvLworYWxpYXMJQ1NJU08xNTAvLwkJR1JFRUstQ0NJVFQvLworYWxpYXMJQ1NJU08xNTBHUkVFS0NDSVRULy8JR1JFRUstQ0NJVFQvLworYWxpYXMJR1JFRUtDQ0lUVC8vCQlHUkVFSy1DQ0lUVC8vCittb2R1bGUJR1JFRUstQ0NJVFQvLwkJSU5URVJOQUwJCUdSRUVLLUNDSVRUCTEKK21vZHVsZQlJTlRFUk5BTAkJR1JFRUstQ0NJVFQvLwkJR1JFRUstQ0NJVFQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTg4Ly8JCUdSRUVLNy8vCithbGlhcwlDU0lTTzg4R1JFRUs3Ly8JCUdSRUVLNy8vCittb2R1bGUJR1JFRUs3Ly8JCUlOVEVSTkFMCQlHUkVFSzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJR1JFRUs3Ly8JCUdSRUVLNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE4Ly8JCUdSRUVLNy1PTEQvLworYWxpYXMJQ1NJU08xOEdSRUVLN09MRC8vCUdSRUVLNy1PTEQvLworYWxpYXMJR1JFRUs3T0xELy8JCUdSRUVLNy1PTEQvLworbW9kdWxlCUdSRUVLNy1PTEQvLwkJSU5URVJOQUwJCUdSRUVLNy1PTEQJMQorbW9kdWxlCUlOVEVSTkFMCQlHUkVFSzctT0xELy8JCUdSRUVLNy1PTEQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTQ5Ly8JCUlOSVMvLworYWxpYXMJQ1NJU080OUlOSVMvLwkJSU5JUy8vCittb2R1bGUJSU5JUy8vCQkJSU5URVJOQUwJCUlOSVMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSU5JUy8vCQkJSU5JUwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTUwLy8JCUlOSVMtOC8vCithbGlhcwlDU0lTTzUwSU5JUzgvLwkJSU5JUy04Ly8KK2FsaWFzCUlOSVM4Ly8JCQlJTklTLTgvLworbW9kdWxlCUlOSVMtOC8vCQlJTlRFUk5BTAkJSU5JUy04CQkxCittb2R1bGUJSU5URVJOQUwJCUlOSVMtOC8vCQlJTklTLTgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi01MS8vCQlJTklTLUNZUklMTElDLy8KK2FsaWFzCUNTSVNPNTFJTklTQ1lSSUxMSUMvLwlJTklTLUNZUklMTElDLy8KK2FsaWFzCUlOSVNDWVJJTExJQy8vCQlJTklTLUNZUklMTElDLy8KK21vZHVsZQlJTklTLUNZUklMTElDLy8JCUlOVEVSTkFMCQlJTklTLUNZUklMTElDCTEKK21vZHVsZQlJTlRFUk5BTAkJSU5JUy1DWVJJTExJQy8vCQlJTklTLUNZUklMTElDCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi05OC8vCQlJU09fMjAzMy8vCithbGlhcwlJU09fMjAzMy0xOTgzLy8JCUlTT18yMDMzLy8KK2FsaWFzCUUxM0IvLwkJCUlTT18yMDMzLy8KK2FsaWFzCUNTSVNPMjAzMy8vCQlJU09fMjAzMy8vCittb2R1bGUJSVNPXzIwMzMvLwkJSU5URVJOQUwJCUlTT18yMDMzCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzIwMzMvLwkJSVNPXzIwMzMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTM3Ly8JCUlTT181NDI3Ly8KK2FsaWFzCUtPSS03Ly8JCQlJU09fNTQyNy8vCithbGlhcwlDU0lTTzU0MjdDWVJJTExJQy8vCUlTT181NDI3Ly8KK21vZHVsZQlJU09fNTQyNy8vCQlJTlRFUk5BTAkJSVNPXzU0MjcJMQorbW9kdWxlCUlOVEVSTkFMCQlJU09fNTQyNy8vCQlJU09fNTQyNwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItNTQvLwkJSVNPXzU0MjctRVhULy8KK2FsaWFzCUlTT181NDI3OjE5ODEvLwkJSVNPXzU0MjctRVhULy8KK2FsaWFzCUNTSVNPNTQyN0NZUklMTElDMTk4MS8vCUlTT181NDI3LUVYVC8vCithbGlhcwlJU09fNTQyN0VYVC8vCQlJU09fNTQyNy1FWFQvLworbW9kdWxlCUlTT181NDI3LUVYVC8vCQlJTlRFUk5BTAkJSVNPXzU0MjctRVhUCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzU0MjctRVhULy8JCUlTT181NDI3LUVYVAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItNTUvLwkJSVNPXzU0MjgvLworYWxpYXMJSVNPXzU0Mjg6MTk4MC8vCQlJU09fNTQyOC8vCithbGlhcwlDU0lTTzU0MjhHUkVFSy8vCUlTT181NDI4Ly8KK21vZHVsZQlJU09fNTQyOC8vCQlJTlRFUk5BTAkJSVNPXzU0MjgJMQorbW9kdWxlCUlOVEVSTkFMCQlJU09fNTQyOC8vCQlJU09fNTQyOAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTU1Ly8JCUlTT18xMDM2Ny1CT1gvLworYWxpYXMJQ1NJU08xMDM2N0JPWC8vCQlJU09fMTAzNjctQk9YLy8KK2FsaWFzCUlTT18xMDM2N0JPWC8vCQlJU09fMTAzNjctQk9YLy8KK21vZHVsZQlJU09fMTAzNjctQk9YLy8JCUlOVEVSTkFMCQlJU09fMTAzNjctQk9YCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzEwMzY3LUJPWC8vCQlJU09fMTAzNjctQk9YCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1BQ0lTLy8JCQlNQUMtSVMvLworbW9kdWxlCU1BQy1JUy8vCQlJTlRFUk5BTAkJTUFDLUlTCQkxCittb2R1bGUJSU5URVJOQUwJCU1BQy1JUy8vCQlNQUMtSVMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1BQ1VLLy8JCQlNQUMtVUsvLworYWxpYXMJTUFDVUtSQUlOSUFOLy8JCU1BQy1VSy8vCithbGlhcwlNQUMtQ1lSSUxMSUMvLwkJTUFDLVVLLy8KK2FsaWFzCU1BQ0NZUklMTElDLy8JCU1BQy1VSy8vCittb2R1bGUJTUFDLVVLLy8JCUlOVEVSTkFMCQlNQUMtVUsJCTEKK21vZHVsZQlJTlRFUk5BTAkJTUFDLVVLLy8JCU1BQy1VSwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVMtTUFDLUNZUklMTElDLy8JQ1AxMDAwNy8vCithbGlhcwlNU01BQ0NZUklMTElDLy8JCUNQMTAwMDcvLworbW9kdWxlCUNQMTAwMDcvLwkJSU5URVJOQUwJCUNQMTAwMDcJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1AxMDAwNy8vCQlDUDEwMDA3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItOS0xLy8JCU5BVFMtREFOTy8vCithbGlhcwlDU05BVFNEQU5PLy8JCU5BVFMtREFOTy8vCithbGlhcwlOQVRTREFOTy8vCQlOQVRTLURBTk8vLworbW9kdWxlCU5BVFMtREFOTy8vCQlJTlRFUk5BTAkJTkFUUy1EQU5PCTEKK21vZHVsZQlJTlRFUk5BTAkJTkFUUy1EQU5PLy8JCU5BVFMtREFOTwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItOC0xLy8JCU5BVFMtU0VGSS8vCithbGlhcwlDU05BVFNTRUZJLy8JCU5BVFMtU0VGSS8vCithbGlhcwlOQVRTU0VGSS8vCQlOQVRTLVNFRkkvLworbW9kdWxlCU5BVFMtU0VGSS8vCQlJTlRFUk5BTAkJTkFUUy1TRUZJCTEKK21vZHVsZQlJTlRFUk5BTAkJTkFUUy1TRUZJLy8JCU5BVFMtU0VGSQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlXUzIvLwkJCVdJTi1TQU1JLTIvLworYWxpYXMJV0lOU0FNSTIvLwkJV0lOLVNBTUktMi8vCittb2R1bGUJV0lOLVNBTUktMi8vCQlJTlRFUk5BTAkJU0FNSS1XUzIJMQorbW9kdWxlCUlOVEVSTkFMCQlXSU4tU0FNSS0yLy8JCVNBTUktV1MyCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlJU08tSVItMTk3Ly8JCUlOVEVSTkFMCQlJU08tSVItMTk3CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLUlSLTE5Ny8vCQlJU08tSVItMTk3CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVRJUzYyMC8vCQlUSVMtNjIwLy8KK2FsaWFzCVRJUzYyMC0wLy8JCVRJUy02MjAvLworYWxpYXMJVElTNjIwLjI1MjktMS8vCQlUSVMtNjIwLy8KK2FsaWFzCVRJUzYyMC4yNTMzLTAvLwkJVElTLTYyMC8vCithbGlhcwlJU08tSVItMTY2Ly8JCVRJUy02MjAvLworbW9kdWxlCVRJUy02MjAvLwkJSU5URVJOQUwJCVRJUy02MjAJCTEKK21vZHVsZQlJTlRFUk5BTAkJVElTLTYyMC8vCQlUSVMtNjIwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlLT0k4VS8vCQkJS09JOC1VLy8KK21vZHVsZQlLT0k4LVUvLwkJSU5URVJOQUwJCUtPSTgtVQkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0k4LVUvLwkJS09JOC1VCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU0lSSTMzNDIvLwkJSVNJUkktMzM0Mi8vCittb2R1bGUJSVNJUkktMzM0Mi8vCQlJTlRFUk5BTAkJSVNJUkktMzM0MgkxCittb2R1bGUJSU5URVJOQUwJCUlTSVJJLTMzNDIvLwkJSVNJUkktMzM0MgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlVVEYxNi8vCQkJVVRGLTE2Ly8KK21vZHVsZQlVVEYtMTYvLwkJSU5URVJOQUwJCVVURi0xNgkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtMTYvLwkJVVRGLTE2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlVVEYxNkxFLy8JCVVURi0xNkxFLy8KK21vZHVsZQlVVEYtMTZMRS8vCQlJTlRFUk5BTAkJVVRGLTE2CQkxCittb2R1bGUJSU5URVJOQUwJCVVURi0xNkxFLy8JCVVURi0xNgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGMTZCRS8vCQlVVEYtMTZCRS8vCittb2R1bGUJVVRGLTE2QkUvLwkJSU5URVJOQUwJCVVURi0xNgkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtMTZCRS8vCQlVVEYtMTYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTVU5JQ09ERS8vCQlVTklDT0RFLy8KK21vZHVsZQlVTklDT0RFLy8JCUlOVEVSTkFMCQlVTklDT0RFCQkxCittb2R1bGUJSU5URVJOQUwJCVVOSUNPREUvLwkJVU5JQ09ERQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGMzIvLwkJCVVURi0zMi8vCittb2R1bGUJVVRGLTMyLy8JCUlOVEVSTkFMCQlVVEYtMzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTMyLy8JCVVURi0zMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGMzJMRS8vCQlVVEYtMzJMRS8vCittb2R1bGUJVVRGLTMyTEUvLwkJSU5URVJOQUwJCVVURi0zMgkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtMzJMRS8vCQlVVEYtMzIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVVURjMyQkUvLwkJVVRGLTMyQkUvLworbW9kdWxlCVVURi0zMkJFLy8JCUlOVEVSTkFMCQlVVEYtMzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTMyQkUvLwkJVVRGLTMyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlVVEY3Ly8JCQlVVEYtNy8vCittb2R1bGUJVVRGLTcvLwkJCUlOVEVSTkFMCQlVVEYtNwkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtNy8vCQkJVVRGLTcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlHQjE4MDMwLy8JCUlOVEVSTkFMCQlHQjE4MDMwCQkxCittb2R1bGUJSU5URVJOQUwJCUdCMTgwMzAvLwkJR0IxODAzMAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCVZJU0NJSS8vCQlJTlRFUk5BTAkJVklTQ0lJCQkxCittb2R1bGUJSU5URVJOQUwJCVZJU0NJSS8vCQlWSVNDSUkJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlLT0k4LVQvLwkJSU5URVJOQUwJCUtPSTgtVAkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0k4LVQvLwkJS09JOC1UCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJR0VPUkdJQU4tUFMvLwkJSU5URVJOQUwJCUdFT1JHSUFOLVBTCTEKK21vZHVsZQlJTlRFUk5BTAkJR0VPUkdJQU4tUFMvLwkJR0VPUkdJQU4tUFMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUdFT1JHSUFOLUFDQURFTVkvLwlJTlRFUk5BTAkJR0VPUkdJQU4tQUNBREVNWSAxCittb2R1bGUJSU5URVJOQUwJCUdFT1JHSUFOLUFDQURFTVkvLwlHRU9SR0lBTi1BQ0FERU1ZIDEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlJU08tSVItMjA5Ly8JCUlOVEVSTkFMCQlJU08tSVItMjA5CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLUlSLTIwOS8vCQlJU08tSVItMjA5CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlNQUMtU0FNSS8vCQlJTlRFUk5BTAkJTUFDLVNBTUkJMQorbW9kdWxlCUlOVEVSTkFMCQlNQUMtU0FNSS8vCQlNQUMtU0FNSQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQVJNU0NJSS04Ly8JCUlOVEVSTkFMCQlBUk1TQ0lJLTgJMQorbW9kdWxlCUlOVEVSTkFMCQlBUk1TQ0lJLTgvLwkJQVJNU0NJSS04CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVRDVk4vLwkJCVRDVk41NzEyLTEvLworYWxpYXMJVENWTi01NzEyLy8JCVRDVk41NzEyLTEvLworYWxpYXMJVENWTjU3MTItMToxOTkzLy8JVENWTjU3MTItMS8vCittb2R1bGUJVENWTjU3MTItMS8vCQlJTlRFUk5BTAkJVENWTjU3MTItMQkxCittb2R1bGUJSU5URVJOQUwJCVRDVk41NzEyLTEvLwkJVENWTjU3MTItMQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJRVVDLUpJU1gwMjEzLy8JCUlOVEVSTkFMCQlFVUMtSklTWDAyMTMJMQorbW9kdWxlCUlOVEVSTkFMCQlFVUMtSklTWDAyMTMvLwkJRVVDLUpJU1gwMjEzCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlTaGlmdF9KSVNYMDIxMy8vCUlOVEVSTkFMCQlTSElGVF9KSVNYMDIxMwkxCittb2R1bGUJSU5URVJOQUwJCVNoaWZ0X0pJU1gwMjEzLy8JU0hJRlRfSklTWDAyMTMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCVRTQ0lJLy8JCQlJTlRFUk5BTAkJVFNDSUkJCTEKK21vZHVsZQlJTlRFUk5BTAkJVFNDSUkvLwkJCVRTQ0lJCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJUFQxNTQvLwkJCUlOVEVSTkFMCQlQVDE1NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlQVDE1NC8vCQkJUFQxNTQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVNUUksxMDQ4LTIwMDIvLwkJUksxMDQ4Ly8KK21vZHVsZQlSSzEwNDgvLwkJSU5URVJOQUwJCVJLMTA0OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlSSzEwNDgvLwkJUksxMDQ4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTAyNS8vCQlJQk0xMDI1Ly8KK2FsaWFzCUNQMTAyNS8vCQlJQk0xMDI1Ly8KK2FsaWFzCUNTSUJNMTAyNS8vCQlJQk0xMDI1Ly8KK21vZHVsZQlJQk0xMDI1Ly8JCUlOVEVSTkFMCQlJQk0xMDI1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEwMjUvLwkJSUJNMTAyNQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExMjIvLwkJSUJNMTEyMi8vCithbGlhcwlDUDExMjIvLwkJSUJNMTEyMi8vCithbGlhcwlDU0lCTTExMjIvLwkJSUJNMTEyMi8vCittb2R1bGUJSUJNMTEyMi8vCQlJTlRFUk5BTAkJSUJNMTEyMgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTIyLy8JCUlCTTExMjIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTM3Ly8JCUlCTTExMzcvLworYWxpYXMJQ1AxMTM3Ly8JCUlCTTExMzcvLworYWxpYXMJQ1NJQk0xMTM3Ly8JCUlCTTExMzcvLworbW9kdWxlCUlCTTExMzcvLwkJSU5URVJOQUwJCUlCTTExMzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEzNy8vCQlJQk0xMTM3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE1My8vCQlJQk0xMTUzLy8KK2FsaWFzCUNQMTE1My8vCQlJQk0xMTUzLy8KK2FsaWFzCUNTSUJNMTE1My8vCQlJQk0xMTUzLy8KK21vZHVsZQlJQk0xMTUzLy8JCUlOVEVSTkFMCQlJQk0xMTUzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNTMvLwkJSUJNMTE1MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNTQvLwkJSUJNMTE1NC8vCithbGlhcwlDUDExNTQvLwkJSUJNMTE1NC8vCithbGlhcwlDU0lCTTExNTQvLwkJSUJNMTE1NC8vCittb2R1bGUJSUJNMTE1NC8vCQlJTlRFUk5BTAkJSUJNMTE1NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTU0Ly8JCUlCTTExNTQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTU1Ly8JCUlCTTExNTUvLworYWxpYXMJQ1AxMTU1Ly8JCUlCTTExNTUvLworYWxpYXMJQ1NJQk0xMTU1Ly8JCUlCTTExNTUvLworbW9kdWxlCUlCTTExNTUvLwkJSU5URVJOQUwJCUlCTTExNTUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE1NS8vCQlJQk0xMTU1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE1NS8vCQlJQk0xMTU1Ly8KK2FsaWFzCUNQMTE1NS8vCQlJQk0xMTU1Ly8KK2FsaWFzCUNTSUJNMTE1NS8vCQlJQk0xMTU1Ly8KK21vZHVsZQlJQk0xMTU1Ly8JCUlOVEVSTkFMCQlJQk0xMTU1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNTUvLwkJSUJNMTE1NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNTYvLwkJSUJNMTE1Ni8vCithbGlhcwlDUDExNTYvLwkJSUJNMTE1Ni8vCithbGlhcwlDU0lCTTExNTYvLwkJSUJNMTE1Ni8vCittb2R1bGUJSUJNMTE1Ni8vCQlJTlRFUk5BTAkJSUJNMTE1NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTU2Ly8JCUlCTTExNTYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTU3Ly8JCUlCTTExNTcvLworYWxpYXMJQ1AxMTU3Ly8JCUlCTTExNTcvLworYWxpYXMJQ1NJQk0xMTU3Ly8JCUlCTTExNTcvLworbW9kdWxlCUlCTTExNTcvLwkJSU5URVJOQUwJCUlCTTExNTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE1Ny8vCQlJQk0xMTU3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE1OC8vCQlJQk0xMTU4Ly8KK2FsaWFzCUNQMTE1OC8vCQlJQk0xMTU4Ly8KK2FsaWFzCUNTSUJNMTE1OC8vCQlJQk0xMTU4Ly8KK21vZHVsZQlJQk0xMTU4Ly8JCUlOVEVSTkFMCQlJQk0xMTU4CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNTgvLwkJSUJNMTE1OAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTgwMy8vCQlJQk04MDMvLworYWxpYXMJQ1A4MDMvLwkJSUJNODAzLy8KK2FsaWFzCUNTSUJNODAzLy8JCUlCTTgwMy8vCittb2R1bGUJSUJNODAzLy8JCUlOVEVSTkFMCQlJQk04MDMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODAzLy8JCUlCTTgwMwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkwMS8vCQlJQk05MDEvLworYWxpYXMJQ1A5MDEvLwkJSUJNOTAxLy8KK2FsaWFzCUNTSUJNOTAxLy8JCUlCTTkwMS8vCittb2R1bGUJSUJNOTAxLy8JCUlOVEVSTkFMCQlJQk05MDEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTAxLy8JCUlCTTkwMQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkwMi8vCQlJQk05MDIvLworYWxpYXMJQ1A5MDIvLwkJSUJNOTAyLy8KK2FsaWFzCUNTSUJNOTAyLy8JCUlCTTkwMi8vCittb2R1bGUJSUJNOTAyLy8JCUlOVEVSTkFMCQlJQk05MDIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTAyLy8JCUlCTTkwMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkyMS8vCQlJQk05MjEvLworYWxpYXMJQ1A5MjEvLwkJSUJNOTIxLy8KK2FsaWFzCUNTSUJNOTIxLy8JCUlCTTkyMS8vCittb2R1bGUJSUJNOTIxLy8JCUlOVEVSTkFMCQlJQk05MjEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTIxLy8JCUlCTTkyMQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEwMDgvLwkJSUJNMTAwOC8vCithbGlhcwlDUDEwMDgvLwkJSUJNMTAwOC8vCithbGlhcwlDU0lCTTEwMDgvLwkJSUJNMTAwOC8vCittb2R1bGUJSUJNMTAwOC8vCQlJTlRFUk5BTAkJSUJNMTAwOAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDA4Ly8JCUlCTTEwMDgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlJQk0xMDA4Ly8JCUlCTTQyMC8vCQlJQk0xMDA4XzQyMAkxCittb2R1bGUJSUJNNDIwLy8JCUlCTTEwMDgvLwkJSUJNMTAwOF80MjAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEwOTcvLwkJSUJNMTA5Ny8vCithbGlhcwlDUDEwOTcvLwkJSUJNMTA5Ny8vCithbGlhcwlDU0lCTTEwOTcvLwkJSUJNMTA5Ny8vCittb2R1bGUJSUJNMTA5Ny8vCQlJTlRFUk5BTAkJSUJNMTA5NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDk3Ly8JCUlCTTEwOTcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTEyLy8JCUlCTTExMTIvLworYWxpYXMJQ1AxMTEyLy8JCUlCTTExMTIvLworYWxpYXMJQ1NJQk0xMTEyLy8JCUlCTTExMTIvLworbW9kdWxlCUlCTTExMTIvLwkJSU5URVJOQUwJCUlCTTExMTIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTExMi8vCQlJQk0xMTEyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTEyMy8vCQlJQk0xMTIzLy8KK2FsaWFzCUNQMTEyMy8vCQlJQk0xMTIzLy8KK2FsaWFzCUNTSUJNMTEyMy8vCQlJQk0xMTIzLy8KK21vZHVsZQlJQk0xMTIzLy8JCUlOVEVSTkFMCQlJQk0xMTIzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMjMvLwkJSUJNMTEyMwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExMzAvLwkJSUJNMTEzMC8vCithbGlhcwlDUDExMzAvLwkJSUJNMTEzMC8vCithbGlhcwlDU0lCTTExMzAvLwkJSUJNMTEzMC8vCittb2R1bGUJSUJNMTEzMC8vCQlJTlRFUk5BTAkJSUJNMTEzMAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTMwLy8JCUlCTTExMzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQwLy8JCUlCTTExNDAvLworYWxpYXMJQ1AxMTQwLy8JCUlCTTExNDAvLworYWxpYXMJQ1NJQk0xMTQwLy8JCUlCTTExNDAvLworbW9kdWxlCUlCTTExNDAvLwkJSU5URVJOQUwJCUlCTTExNDAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0MC8vCQlJQk0xMTQwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0MS8vCQlJQk0xMTQxLy8KK2FsaWFzCUNQMTE0MS8vCQlJQk0xMTQxLy8KK2FsaWFzCUNTSUJNMTE0MS8vCQlJQk0xMTQxLy8KK21vZHVsZQlJQk0xMTQxLy8JCUlOVEVSTkFMCQlJQk0xMTQxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDEvLwkJSUJNMTE0MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDIvLwkJSUJNMTE0Mi8vCithbGlhcwlDUDExNDIvLwkJSUJNMTE0Mi8vCithbGlhcwlDU0lCTTExNDIvLwkJSUJNMTE0Mi8vCittb2R1bGUJSUJNMTE0Mi8vCQlJTlRFUk5BTAkJSUJNMTE0MgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQyLy8JCUlCTTExNDIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQzLy8JCUlCTTExNDMvLworYWxpYXMJQ1AxMTQzLy8JCUlCTTExNDMvLworYWxpYXMJQ1NJQk0xMTQzLy8JCUlCTTExNDMvLworbW9kdWxlCUlCTTExNDMvLwkJSU5URVJOQUwJCUlCTTExNDMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0My8vCQlJQk0xMTQzCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0NC8vCQlJQk0xMTQ0Ly8KK2FsaWFzCUNQMTE0NC8vCQlJQk0xMTQ0Ly8KK2FsaWFzCUNTSUJNMTE0NC8vCQlJQk0xMTQ0Ly8KK21vZHVsZQlJQk0xMTQ0Ly8JCUlOVEVSTkFMCQlJQk0xMTQ0CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDQvLwkJSUJNMTE0NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDUvLwkJSUJNMTE0NS8vCithbGlhcwlDUDExNDUvLwkJSUJNMTE0NS8vCithbGlhcwlDU0lCTTExNDUvLwkJSUJNMTE0NS8vCittb2R1bGUJSUJNMTE0NS8vCQlJTlRFUk5BTAkJSUJNMTE0NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQ1Ly8JCUlCTTExNDUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQ2Ly8JCUlCTTExNDYvLworYWxpYXMJQ1AxMTQ2Ly8JCUlCTTExNDYvLworYWxpYXMJQ1NJQk0xMTQ2Ly8JCUlCTTExNDYvLworbW9kdWxlCUlCTTExNDYvLwkJSU5URVJOQUwJCUlCTTExNDYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0Ni8vCQlJQk0xMTQ2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0Ny8vCQlJQk0xMTQ3Ly8KK2FsaWFzCUNQMTE0Ny8vCQlJQk0xMTQ3Ly8KK2FsaWFzCUNTSUJNMTE0Ny8vCQlJQk0xMTQ3Ly8KK21vZHVsZQlJQk0xMTQ3Ly8JCUlOVEVSTkFMCQlJQk0xMTQ3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDcvLwkJSUJNMTE0NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDgvLwkJSUJNMTE0OC8vCithbGlhcwlDUDExNDgvLwkJSUJNMTE0OC8vCithbGlhcwlDU0lCTTExNDgvLwkJSUJNMTE0OC8vCittb2R1bGUJSUJNMTE0OC8vCQlJTlRFUk5BTAkJSUJNMTE0OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQ4Ly8JCUlCTTExNDgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQ5Ly8JCUlCTTExNDkvLworYWxpYXMJQ1AxMTQ5Ly8JCUlCTTExNDkvLworYWxpYXMJQ1NJQk0xMTQ5Ly8JCUlCTTExNDkvLworbW9kdWxlCUlCTTExNDkvLwkJSU5URVJOQUwJCUlCTTExNDkJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0OS8vCQlJQk0xMTQ5CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE2Ni8vCQlJQk0xMTY2Ly8KK2FsaWFzCUNQMTE2Ni8vCQlJQk0xMTY2Ly8KK2FsaWFzCUNTSUJNMTE2Ni8vCQlJQk0xMTY2Ly8KK21vZHVsZQlJQk0xMTY2Ly8JCUlOVEVSTkFMCQlJQk0xMTY2CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNjYvLwkJSUJNMTE2NgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjcvLwkJSUJNMTE2Ny8vCithbGlhcwlDUDExNjcvLwkJSUJNMTE2Ny8vCithbGlhcwlDU0lCTTExNjcvLwkJSUJNMTE2Ny8vCittb2R1bGUJSUJNMTE2Ny8vCQlJTlRFUk5BTAkJSUJNMTE2NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTY3Ly8JCUlCTTExNjcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS00NTE3Ly8JCUlCTTQ1MTcvLworYWxpYXMJQ1A0NTE3Ly8JCUlCTTQ1MTcvLworYWxpYXMJQ1NJQk00NTE3Ly8JCUlCTTQ1MTcvLworbW9kdWxlCUlCTTQ1MTcvLwkJSU5URVJOQUwJCUlCTTQ1MTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDUxNy8vCQlJQk00NTE3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tNDg5OS8vCQlJQk00ODk5Ly8KK2FsaWFzCUNQNDg5OS8vCQlJQk00ODk5Ly8KK2FsaWFzCUNTSUJNNDg5OS8vCQlJQk00ODk5Ly8KK21vZHVsZQlJQk00ODk5Ly8JCUlOVEVSTkFMCQlJQk00ODk5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTQ4OTkvLwkJSUJNNDg5OQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTQ5MDkvLwkJSUJNNDkwOS8vCithbGlhcwlDUDQ5MDkvLwkJSUJNNDkwOS8vCithbGlhcwlDU0lCTTQ5MDkvLwkJSUJNNDkwOS8vCittb2R1bGUJSUJNNDkwOS8vCQlJTlRFUk5BTAkJSUJNNDkwOQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00OTA5Ly8JCUlCTTQ5MDkJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS00OTcxLy8JCUlCTTQ5NzEvLworYWxpYXMJQ1A0OTcxLy8JCUlCTTQ5NzEvLworYWxpYXMJQ1NJQk00OTcxLy8JCUlCTTQ5NzEvLworbW9kdWxlCUlCTTQ5NzEvLwkJSU5URVJOQUwJCUlCTTQ5NzEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDk3MS8vCQlJQk00OTcxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tNTM0Ny8vCQlJQk01MzQ3Ly8KK2FsaWFzCUNQNTM0Ny8vCQlJQk01MzQ3Ly8KK2FsaWFzCUNTSUJNNTM0Ny8vCQlJQk01MzQ3Ly8KK21vZHVsZQlJQk01MzQ3Ly8JCUlOVEVSTkFMCQlJQk01MzQ3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTUzNDcvLwkJSUJNNTM0NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkwMzAvLwkJSUJNOTAzMC8vCithbGlhcwlDUDkwMzAvLwkJSUJNOTAzMC8vCithbGlhcwlDU0lCTTkwMzAvLwkJSUJNOTAzMC8vCittb2R1bGUJSUJNOTAzMC8vCQlJTlRFUk5BTAkJSUJNOTAzMAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MDMwLy8JCUlCTTkwMzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MDY2Ly8JCUlCTTkwNjYvLworYWxpYXMJQ1A5MDY2Ly8JCUlCTTkwNjYvLworYWxpYXMJQ1NJQk05MDY2Ly8JCUlCTTkwNjYvLworbW9kdWxlCUlCTTkwNjYvLwkJSU5URVJOQUwJCUlCTTkwNjYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTA2Ni8vCQlJQk05MDY2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTQ0OC8vCQlJQk05NDQ4Ly8KK2FsaWFzCUNQOTQ0OC8vCQlJQk05NDQ4Ly8KK2FsaWFzCUNTSUJNOTQ0OC8vCQlJQk05NDQ4Ly8KK21vZHVsZQlJQk05NDQ4Ly8JCUlOVEVSTkFMCQlJQk05NDQ4CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTk0NDgvLwkJSUJNOTQ0OAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEyNzEyLy8JCUlCTTEyNzEyLy8KK2FsaWFzCUNQMTI3MTIvLwkJSUJNMTI3MTIvLworYWxpYXMJQ1NJQk0xMjcxMi8vCQlJQk0xMjcxMi8vCittb2R1bGUJSUJNMTI3MTIvLwkJSU5URVJOQUwJCUlCTTEyNzEyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEyNzEyLy8JCUlCTTEyNzEyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTY4MDQvLwkJSUJNMTY4MDQvLworYWxpYXMJQ1AxNjgwNC8vCQlJQk0xNjgwNC8vCithbGlhcwlDU0lCTTE2ODA0Ly8JCUlCTTE2ODA0Ly8KK21vZHVsZQlJQk0xNjgwNC8vCQlJTlRFUk5BTAkJSUJNMTY4MDQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTY4MDQvLwkJSUJNMTY4MDQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMzY0Ly8JCUlCTTEzNjQvLworYWxpYXMJQ1AxMzY0Ly8JCUlCTTEzNjQvLworYWxpYXMJQ1NJQk0xMzY0Ly8JCUlCTTEzNjQvLworbW9kdWxlCUlCTTEzNjQvLwkJSU5URVJOQUwJCUlCTTEzNjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTM2NC8vCQlJQk0xMzY0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTM3MS8vCQlJQk0xMzcxLy8KK2FsaWFzCUNQMTM3MS8vCQlJQk0xMzcxLy8KK2FsaWFzCUNTSUJNMTM3MS8vCQlJQk0xMzcxLy8KK21vZHVsZQlJQk0xMzcxLy8JCUlOVEVSTkFMCQlJQk0xMzcxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEzNzEvLwkJSUJNMTM3MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEzODgvLwkJSUJNMTM4OC8vCithbGlhcwlDUDEzODgvLwkJSUJNMTM4OC8vCithbGlhcwlDU0lCTTEzODgvLwkJSUJNMTM4OC8vCittb2R1bGUJSUJNMTM4OC8vCQlJTlRFUk5BTAkJSUJNMTM4OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMzg4Ly8JCUlCTTEzODgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMzkwLy8JCUlCTTEzOTAvLworYWxpYXMJQ1AxMzkwLy8JCUlCTTEzOTAvLworYWxpYXMJQ1NJQk0xMzkwLy8JCUlCTTEzOTAvLworbW9kdWxlCUlCTTEzOTAvLwkJSU5URVJOQUwJCUlCTTEzOTAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTM5MC8vCQlJQk0xMzkwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTM5OS8vCQlJQk0xMzk5Ly8KK2FsaWFzCUNQMTM5OS8vCQlJQk0xMzk5Ly8KK2FsaWFzCUNTSUJNMTM5OS8vCQlJQk0xMzk5Ly8KK21vZHVsZQlJQk0xMzk5Ly8JCUlOVEVSTkFMCQlJQk0xMzk5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEzOTkvLwkJSUJNMTM5OQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPL1RSXzExNTQ4LTEvCQlJU09fMTE1NDgtMS8vCithbGlhcwlJU08xMTU0OC0xLy8JCUlTT18xMTU0OC0xLy8KK21vZHVsZQlJU09fMTE1NDgtMS8vCQlJTlRFUk5BTAkJSVNPXzExNTQ4LTEJMQorbW9kdWxlCUlOVEVSTkFMCQlJU09fMTE1NDgtMS8vCQlJU09fMTE1NDgtMQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJTUlLLy8JCQlJTlRFUk5BTAkJTUlLCQkxCittb2R1bGUJSU5URVJOQUwJCU1JSy8vCQkJTUlLCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQlJGLy8JCQlJTlRFUk5BTAkJQlJGCQkxCittb2R1bGUJSU5URVJOQUwJCUJSRi8vCQkJQlJGCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDEyODIvLwkJTUFDLUNFTlRSQUxFVVJPUEUvLworbW9kdWxlCU1BQy1DRU5UUkFMRVVST1BFLy8JSU5URVJOQUwJCU1BQy1DRU5UUkFMRVVST1BFIDEKK21vZHVsZQlJTlRFUk5BTAkJTUFDLUNFTlRSQUxFVVJPUEUvLwlNQUMtQ0VOVFJBTEVVUk9QRSAxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJS09JOC1SVS8vCQlJTlRFUk5BTAkJS09JOC1SVQkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0k4LVJVLy8JCUtPSTgtUlUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTT184ODU5LTlFLy8JCUlTTy04ODU5LTlFLy8KK2FsaWFzCUlTTzg4NTktOUUvLwkJSVNPLTg4NTktOUUvLworYWxpYXMJSVNPODg1OTlFLy8JCUlTTy04ODU5LTlFLy8KK21vZHVsZQlJU08tODg1OS05RS8vCQlJTlRFUk5BTAkJSVNPODg1OS05RQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTlFLy8JCUlTTzg4NTktOUUJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJUk9NQU45Ly8JCUhQLVJPTUFOOS8vCithbGlhcwlSOS8vCQkJSFAtUk9NQU45Ly8KK2FsaWFzCUhQUk9NQU45Ly8JCUhQLVJPTUFOOS8vCittb2R1bGUJSFAtUk9NQU45Ly8JCUlOVEVSTkFMCQlIUC1ST01BTjkJMQorbW9kdWxlCUlOVEVSTkFMCQlIUC1ST01BTjkvLwkJSFAtUk9NQU45CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVRVUktJU0g4Ly8JCUhQLVRVUktJU0g4Ly8KK2FsaWFzCUhQVFVSS0lTSDgvLwkJSFAtVFVSS0lTSDgvLworYWxpYXMJT1NGMTAwMTAwMDYvLwkJSFAtVFVSS0lTSDgvLworbW9kdWxlCUhQLVRVUktJU0g4Ly8JCUlOVEVSTkFMCQlIUC1UVVJLSVNIOAkxCittb2R1bGUJSU5URVJOQUwJCUhQLVRVUktJU0g4Ly8JCUhQLVRVUktJU0g4CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVRIQUk4Ly8JCQlIUC1USEFJOC8vCithbGlhcwlIUFRIQUk4Ly8JCUhQLVRIQUk4Ly8KK21vZHVsZQlIUC1USEFJOC8vCQlJTlRFUk5BTAkJSFAtVEhBSTgJMQorbW9kdWxlCUlOVEVSTkFMCQlIUC1USEFJOC8vCQlIUC1USEFJOAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlIUEdSRUVLOC8vCQlIUC1HUkVFSzgvLworYWxpYXMJT1NGMTAwMTAwMDQvLwkJSFAtR1JFRUs4Ly8KK21vZHVsZQlIUC1HUkVFSzgvLwkJSU5URVJOQUwJCUhQLUdSRUVLOAkxCittb2R1bGUJSU5URVJOQUwJCUhQLUdSRUVLOC8vCQlIUC1HUkVFSzgJMQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L2djb252LW1vZHVsZXMuY2FjaGUgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvZ2NvbnYtbW9kdWxlcy5jYWNoZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTljZTdiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L2djb252LW1vZHVsZXMuY2FjaGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkNOUy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJDTlMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxYWU2MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJDTlMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkdCLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkdCLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTcwN2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvbGliR0Iuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L2xpYklTT0lSMTY1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L2xpYklTT0lSMTY1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTIyOTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvbGliSVNPSVIxNjUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkpJUy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJKSVMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiNDk1ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJKSVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkpJU1gwMjEzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkpJU1gwMjEzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MDFlM2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NvbnYvbGliSklTWDAyMTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djb252L2xpYktTQy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJLU0Muc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3ZDIxYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJLU0Muc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djcnQxLm8gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvZ2NydDEubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzQ0OTBlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2djcnQxLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xkLTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGQtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYjk2NjBhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xkLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xkLWxpbnV4LXg4Ni02NC5zby4yIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xkLWxpbnV4LXg4Ni02NC5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjg2NzZkMjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGQtbGludXgteDg2LTY0LnNvLjIKQEAgLTAsMCArMSBAQAorbGQtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJCcm9rZW5Mb2NhbGUtMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJCcm9rZW5Mb2NhbGUtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODFmZjliCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYkJyb2tlbkxvY2FsZS0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJCcm9rZW5Mb2NhbGUuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJCcm9rZW5Mb2NhbGUuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjIwOTlkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYkJyb2tlbkxvY2FsZS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJCcm9rZW5Mb2NhbGUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliQnJva2VuTG9jYWxlLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY4MTA0YzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliQnJva2VuTG9jYWxlLnNvCkBAIC0wLDAgKzEgQEAKK2xpYkJyb2tlbkxvY2FsZS5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYkJyb2tlbkxvY2FsZS5zby4xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYkJyb2tlbkxvY2FsZS5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjc4OWVkMWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliQnJva2VuTG9jYWxlLnNvLjEKQEAgLTAsMCArMSBAQAorbGliQnJva2VuTG9jYWxlLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliR0wuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliR0wuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZmMzYTAzZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJHTC5zbwpAQCAtMCwwICsxIEBACitsaWJHTC5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJTZWdGYXVsdC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJTZWdGYXVsdC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY3NGMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlNlZ0ZhdWx0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWYyMWRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlgxMS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWDExLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjM4NzdkYjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWDExLnNvCkBAIC0wLDAgKzEgQEAKK2xpYlgxMS5zby42LjMuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuc28uNiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuc28uNgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zODc3ZGI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlgxMS5zby42CkBAIC0wLDAgKzEgQEAKK2xpYlgxMS5zby42LjMuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuc28uNi4zLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWDExLnNvLjYuMy4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNzBkNTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWDExLnNvLjYuMy4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYYXUuc28uNiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYYXUuc28uNgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zMzk2MzZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhhdS5zby42CkBAIC0wLDAgKzEgQEAKK2xpYlhhdS5zby42LjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYYXUuc28uNi4wLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGF1LnNvLjYuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjk0M2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGF1LnNvLjYuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYZGFtYWdlLnNvLjEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGRhbWFnZS5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmE2MWQ5MWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGRhbWFnZS5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYlhkYW1hZ2Uuc28uMS4xLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGRhbWFnZS5zby4xLjEuMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYZGFtYWdlLnNvLjEuMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MWE5YzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGRhbWFnZS5zby4xLjEuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGRtY3Auc28uNiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYZG1jcC5zby42Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmJiZjQ2NDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGRtY3Auc28uNgpAQCAtMCwwICsxIEBACitsaWJYZG1jcC5zby42LjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYZG1jcC5zby42LjAuMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYZG1jcC5zby42LjAuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODI0MTJiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhkbWNwLnNvLjYuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYZXh0LmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGV4dC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MDA1NjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGV4dC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYZXh0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhleHQuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDY1ZjgwNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYZXh0LnNvCkBAIC0wLDAgKzEgQEAKK2xpYlhleHQuc28uNi40LjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGV4dC5zby42IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhleHQuc28uNgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40NjVmODA1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhleHQuc28uNgpAQCAtMCwwICsxIEBACitsaWJYZXh0LnNvLjYuNC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhleHQuc28uNi40LjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGV4dC5zby42LjQuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY2NzQwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhleHQuc28uNi40LjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhmaXhlcy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhmaXhlcy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YzZkODgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGZpeGVzLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhmaXhlcy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYZml4ZXMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOTI3ZGE5OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYZml4ZXMuc28KQEAgLTAsMCArMSBAQAorbGliWGZpeGVzLnNvLjMuMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhmaXhlcy5zby4zIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhmaXhlcy5zby4zCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjkyN2RhOTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGZpeGVzLnNvLjMKQEAgLTAsMCArMSBAQAorbGliWGZpeGVzLnNvLjMuMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhmaXhlcy5zby4zLjEuMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYZml4ZXMuc28uMy4xLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5MWZhOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJYZml4ZXMuc28uMy4xLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhpLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGkuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWFjZGExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhpLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhpLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlhpLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU5MmM4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWGkuc28KQEAgLTAsMCArMSBAQAorbGliWGkuc28uNi4xLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWHhmODZ2bS5zby4xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlh4Zjg2dm0uc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lOTkxZmY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlh4Zjg2dm0uc28uMQpAQCAtMCwwICsxIEBACitsaWJYeGY4NnZtLnNvLjEuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlh4Zjg2dm0uc28uMS4wLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliWHhmODZ2bS5zby4xLjAuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTZjNmJlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYlh4Zjg2dm0uc28uMS4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmFjbC5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmFjbC5hCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmJiYWI3NWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYWNsLmEKQEAgLTAsMCArMSBAQAorbGliYWNsLmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYWNsLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmFjbC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iMjkzMzIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmFjbC5zbwpAQCAtMCwwICsxIEBACitsaWJhY2wuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhY2wuc28uMSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhY2wuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4wOWJmMDU3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmFjbC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmFjbC5zby4xLjEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhY2wuc28uMS4xLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYWNsLnNvLjEuMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTcyMWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYWNsLnNvLjEuMS4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhbmwtMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhbmwtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzU1MjEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmFubC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhbmwuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhbmwuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWM2YjM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmFubC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhbmwuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYW5sLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjRmMGM0YzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYW5sLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmFubC5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmFubC5zby4xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmFubC5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjRjNGQ2NjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYW5sLnNvLjEKQEAgLTAsMCArMSBAQAorbGliYW5sLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40MmRmYzk5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5zbwpAQCAtMCwwICsxIEBACitsaWJhc291bmQuc28uMi4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLnNvLjIgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDJkZmM5OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhc291bmQuc28uMgpAQCAtMCwwICsxIEBACitsaWJhc291bmQuc28uMi4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLnNvLjIuMC4wIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5zby4yLjAuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWM4ZmRmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5zby4yLjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYXR0ci5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmF0dHIuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjJkNThiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmF0dHIuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYXR0ci5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhdHRyLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmViMzJkNWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYXR0ci5zbwpAQCAtMCwwICsxIEBACitsaWJhdHRyLnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmF0dHIuc28uMSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhdHRyLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uM2JmMDc4OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhdHRyLnNvLjEKQEAgLTAsMCArMSBAQAorbGliYXR0ci5zby4xLjEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhdHRyLnNvLjEuMS4wIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmF0dHIuc28uMS4xLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEwZDgwNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhdHRyLnNvLjEuMS4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJhdWRpb2ZpbGUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYXVkaW9maWxlLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjZmODM5N2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYXVkaW9maWxlLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmF1ZGlvZmlsZS5zby4xLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJic2QtY29tcGF0LmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYnNkLWNvbXBhdC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMTYyMTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYnNkLWNvbXBhdC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjLTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYy0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ3YTc5NTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYy0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3Njg2ODgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwMGQwOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjLnNvCkBAIC0wLDAgKzEsNSBAQAorLyogR05VIGxkIHNjcmlwdAorICAgVXNlIHRoZSBzaGFyZWQgbGlicmFyeSwgYnV0IHNvbWUgZnVuY3Rpb25zIGFyZSBvbmx5IGluCisgICB0aGUgc3RhdGljIGxpYnJhcnksIHNvIHRyeSB0aGF0IHNlY29uZGFyaWx5LiAgKi8KK09VVFBVVF9GT1JNQVQoZWxmNjQteDg2LTY0KQorR1JPVVAgKCBsaWJjLnNvLjYgbGliY19ub25zaGFyZWQuYSAgQVNfTkVFREVEICggbGQtbGludXgteDg2LTY0LnNvLjIgKSApCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYy5zby42IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmMuc28uNgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hOGY0MmNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmMuc28uNgpAQCAtMCwwICsxIEBACitsaWJjLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYy9tZW1jcHktcHJlbG9hZC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjL21lbWNweS1wcmVsb2FkLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YjdlOTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYy9tZW1jcHktcHJlbG9hZC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYy9tZW1jcHktc3lzbG9nLXByZWxvYWQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliYy9tZW1jcHktc3lzbG9nLXByZWxvYWQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzODg1NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjL21lbWNweS1zeXNsb2ctcHJlbG9hZC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliY19ub25zaGFyZWQuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjX25vbnNoYXJlZC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OGM1NjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliY19ub25zaGFyZWQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliY2FwLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliY2FwLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhNDZkNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjYXAuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliY2FwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNhcC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zZGYxZjY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNhcC5zbwpAQCAtMCwwICsxIEBACitsaWJjYXAuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjYXAuc28uMiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjYXAuc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iNmQ1ZmU3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNhcC5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYmNhcC5zby4yLjIyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNhcC5zby4yLjIyIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNhcC5zby4yLjIyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDVmMGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliY2FwLnNvLjIuMjIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNpZG4tMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjaWRuLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY2ODYxMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjaWRuLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNpZG4uc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliY2lkbi5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zMGEwMWE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNpZG4uc28KQEAgLTAsMCArMSBAQAorbGliY2lkbi5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNpZG4uc28uMSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjaWRuLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjlmN2ZjNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjaWRuLnNvLjEKQEAgLTAsMCArMSBAQAorbGliY2lkbi0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliY3J5cHQtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWY0N2IzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliY3J5cHQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjYyMGVhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjNiMTFmZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliY3J5cHQuc28KQEAgLTAsMCArMSBAQAorbGliY3J5cHQuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjcnlwdC5zby4xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjRiOWMzOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjcnlwdC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmNyeXB0LTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliY3Vyc2VzLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliY3Vyc2VzLmEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTc0NTYxMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJjdXJzZXMuYQpAQCAtMCwwICsxIEBACitsaWJuY3Vyc2VzLmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliY3Vyc2VzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmN1cnNlcy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42N2Y4ZTYxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmN1cnNlcy5zbwpAQCAtMCwwICsxIEBACitsaWJuY3Vyc2VzLnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmRsLTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliZGwtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzNiMDNkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmRsLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmRsLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliZGwuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFhYzY3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmRsLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmRsLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmRsLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY5MWYxOTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliZGwuc28KQEAgLTAsMCArMSBAQAorbGliZGwuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJkbC5zby4yIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmRsLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZWE1MWE3ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJkbC5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYmRsLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliZHJtLnNvLjIgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliZHJtLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNmRmMjNlNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJkcm0uc28uMgpAQCAtMCwwICsxIEBACitsaWJkcm0uc28uMi40LjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliZHJtLnNvLjIuNC4wIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmRybS5zby4yLjQuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjIzNDQ4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmRybS5zby4yLjQuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliZXNkLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliZXNkLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0N2Q0MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJlc2QuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliZXNkLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmVzZC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mZDU0MTQwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmVzZC5zbwpAQCAtMCwwICsxIEBACitsaWJlc2Quc28uMC4yLjM5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmZvcm0uYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJmb3JtLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyMDllOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJmb3JtLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmZvcm0uc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliZm9ybS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4xMGU5MTY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmZvcm0uc28KQEAgLTAsMCArMSBAQAorbGliZm9ybS5zby41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmZvcm0uc28uNSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJmb3JtLnNvLjUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZmFkMmU3NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJmb3JtLnNvLjUKQEAgLTAsMCArMSBAQAorbGliZm9ybS5zby41LjkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliZm9ybS5zby41LjkgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliZm9ybS5zby41LjkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2ZGRkNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJmb3JtLnNvLjUuOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliZy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmcuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjE2MjE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmcuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliaWVlZS5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmllZWUuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWI5NjVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYmllZWUuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibS0yLjE1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm0tMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzVkNjU5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm0tMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibS5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm0uYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWU5MTAxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm0uYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJtLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmM2MDc5N2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibS5zbwpAQCAtMCwwICsxIEBACitsaWJtLnNvLjYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibS5zby42IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm0uc28uNgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43NjdiZDNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm0uc28uNgpAQCAtMCwwICsxIEBACitsaWJtLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibWNoZWNrLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibWNoZWNrLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkNmJkYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJtY2hlY2suYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibWVtdXNhZ2Uuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibWVtdXNhZ2Uuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzOGUyOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJtZW11c2FnZS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibWVudS5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm1lbnUuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDlhMDA4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm1lbnUuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibWVudS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJtZW51LnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmIxMmI1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibWVudS5zbwpAQCAtMCwwICsxIEBACitsaWJtZW51LnNvLjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibWVudS5zby41IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm1lbnUuc28uNQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40MWExOTkyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm1lbnUuc28uNQpAQCAtMCwwICsxIEBACitsaWJtZW51LnNvLjUuOQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJtZW51LnNvLjUuOSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJtZW51LnNvLjUuOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDVjZmRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm1lbnUuc28uNS45CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzKysuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzKysuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTMxY2Y4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5jdXJzZXMrKy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTc5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5jdXJzZXMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwOTUzYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzLnNvCkBAIC0wLDAgKzEgQEAKK0lOUFVUKGxpYm5jdXJzZXMuc28uNSAtbHRpbmZvKQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5jdXJzZXMuc28uNSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzLnNvLjUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzJjYWFmMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzLnNvLjUKQEAgLTAsMCArMSBAQAorbGlibmN1cnNlcy5zby41LjkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5zby41LjkgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5zby41LjkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0NjdjOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzLnNvLjUuOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNsLTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNsLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwZGU0MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc2wtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNsLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNsLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzODRlZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc2wuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNsLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zbC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yOGQxNmQ5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zbC5zbwpAQCAtMCwwICsxIEBACitsaWJuc2wuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc2wuc28uMSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc2wuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43OTg5NmY4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zbC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYm5zbC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19jb21wYXQtMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfY29tcGF0LTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0MGRhYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfY29tcGF0LTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19jb21wYXQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNzX2NvbXBhdC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iMGZhMTdmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19jb21wYXQuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX2NvbXBhdC5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19jb21wYXQuc28uMiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfY29tcGF0LnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYWE1ODk3ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfY29tcGF0LnNvLjIKQEAgLTAsMCArMSBAQAorbGlibnNzX2NvbXBhdC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kYi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZGIuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTM4OTlhYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZGIuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX2RiLnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNzX2Rucy0yLjE1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kbnMtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODhlOWY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kbnMtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNzX2Rucy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZG5zLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjdkN2ExNjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNzX2Rucy5zbwpAQCAtMCwwICsxIEBACitsaWJuc3NfZG5zLnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNzX2Rucy5zby4yIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kbnMuc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iOTczOGE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kbnMuc28uMgpAQCAtMCwwICsxIEBACitsaWJuc3NfZG5zLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNzX2ZpbGVzLTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNzX2ZpbGVzLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiNjEwMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZmlsZXMtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNzX2ZpbGVzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19maWxlcy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yYjllMzk4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19maWxlcy5zbwpAQCAtMCwwICsxIEBACitsaWJuc3NfZmlsZXMuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZmlsZXMuc28uMiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZmlsZXMuc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lNzk2YWE3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19maWxlcy5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19maWxlcy0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19oZXNpb2QtMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfaGVzaW9kLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkYjMwMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfaGVzaW9kLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19oZXNpb2Quc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNzX2hlc2lvZC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mZDdmMTc0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19oZXNpb2Quc28KQEAgLTAsMCArMSBAQAorbGlibnNzX2hlc2lvZC5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19oZXNpb2Quc28uMiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfaGVzaW9kLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjYxYTczNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfaGVzaW9kLnNvLjIKQEAgLTAsMCArMSBAQAorbGlibnNzX2hlc2lvZC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXMtMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2MTc4OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNzX25pcy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hNDAzNjUyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXMuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX25pcy5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXMuc28uMiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOWY4OTZhOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzLnNvLjIKQEAgLTAsMCArMSBAQAorbGlibnNzX25pcy0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXNwbHVzLTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNzX25pc3BsdXMtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTY1ZWYzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXNwbHVzLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXNwbHVzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXNwbHVzLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmJhNjE4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlibnNzX25pc3BsdXMuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX25pc3BsdXMuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzcGx1cy5zby4yIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXNwbHVzLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uN2U0NTA2ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzcGx1cy5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19uaXNwbHVzLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicGFuZWwuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwYW5lbC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZTYwMzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicGFuZWwuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicGFuZWwuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicGFuZWwuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjVjZDRhNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwYW5lbC5zbwpAQCAtMCwwICsxIEBACitsaWJwYW5lbC5zby41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnBhbmVsLnNvLjUgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicGFuZWwuc28uNQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41Njk0Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnBhbmVsLnNvLjUKQEAgLTAsMCArMSBAQAorbGlicGFuZWwuc28uNS45ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnBhbmVsLnNvLjUuOSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwYW5lbC5zby41LjkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2NDQ2YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwYW5lbC5zby41LjkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnBjcHJvZmlsZS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwY3Byb2ZpbGUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE2NGIzMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwY3Byb2ZpbGUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB0aHJlYWQtMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmMwZGY2ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB0aHJlYWQuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwNjFjOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB0aHJlYWQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDJjZTcyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB0aHJlYWQuc28KQEAgLTAsMCArMSw1IEBACisvKiBHTlUgbGQgc2NyaXB0CisgICBVc2UgdGhlIHNoYXJlZCBsaWJyYXJ5LCBidXQgc29tZSBmdW5jdGlvbnMgYXJlIG9ubHkgaW4KKyAgIHRoZSBzdGF0aWMgbGlicmFyeSwgc28gdHJ5IHRoYXQgc2Vjb25kYXJpbHkuICAqLworT1VUUFVUX0ZPUk1BVChlbGY2NC14ODYtNjQpCitHUk9VUCAoIGxpYnB0aHJlYWQuc28uMCBsaWJwdGhyZWFkX25vbnNoYXJlZC5hICkKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkLnNvLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZC5zby4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjIxNTk3YjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZC5zby4wCkBAIC0wLDAgKzEgQEAKK2xpYnB0aHJlYWQtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkX25vbnNoYXJlZC5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB0aHJlYWRfbm9uc2hhcmVkLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhMDhhNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkX25vbnNoYXJlZC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1tYWlubG9vcC1nbGliLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLW1haW5sb29wLWdsaWIuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjQ2NmI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1tYWlubG9vcC1nbGliLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnB1bHNlLW1haW5sb29wLWdsaWIuc28uMC4wLjQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicHVsc2Utc2ltcGxlLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLXNpbXBsZS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yZjY1ZDVjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLXNpbXBsZS5zbwpAQCAtMCwwICsxIEBACitsaWJwdWxzZS1zaW1wbGUuc28uMC4wLjMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicHVsc2Utc2ltcGxlLnNvLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicHVsc2Utc2ltcGxlLnNvLjAKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMmY2NWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1zaW1wbGUuc28uMApAQCAtMCwwICsxIEBACitsaWJwdWxzZS1zaW1wbGUuc28uMC4wLjMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicHVsc2Utc2ltcGxlLnNvLjAuMC4zIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLXNpbXBsZS5zby4wLjAuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjI4OTkxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLXNpbXBsZS5zby4wLjAuMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicHVsc2Uuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicHVsc2Uuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOGVkZTZhNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS5zbwpAQCAtMCwwICsxIEBACitsaWJwdWxzZS5zby4wLjEzLjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicHVsc2Uuc28uMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS5zby4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjhlZGU2YTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicHVsc2Uuc28uMApAQCAtMCwwICsxIEBACitsaWJwdWxzZS5zby4wLjEzLjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicHVsc2Uuc28uMC4xMy41IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLnNvLjAuMTMuNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDg3ZmY2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLnNvLjAuMTMuNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicHVsc2Vjb21tb24tMS4xLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlY29tbW9uLTEuMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzVmNjAyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlY29tbW9uLTEuMS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicmVzb2x2LTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicmVzb2x2LTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwN2I5OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJyZXNvbHYtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicmVzb2x2LmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicmVzb2x2LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzYWUxZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJyZXNvbHYuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicmVzb2x2LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnJlc29sdi5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iZjZjMTdmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnJlc29sdi5zbwpAQCAtMCwwICsxIEBACitsaWJyZXNvbHYuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJyZXNvbHYuc28uMiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJyZXNvbHYuc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yODNhOTIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnJlc29sdi5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYnJlc29sdi0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnJwY3N2Yy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnJwY3N2Yy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDBhY2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicnBjc3ZjLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnJ0LTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicnQtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2NiNzViCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnJ0LTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnJ0LmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicnQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTljY2NkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnJ0LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnJ0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnJ0LnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjA4MjBkZjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlicnQuc28KQEAgLTAsMCArMSBAQAorbGlicnQuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJydC5zby4xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnJ0LnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjY3OGUwMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJydC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYnJ0LTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidGVybWNhcC5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRlcm1jYXAuYQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yNjExNzM5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRlcm1jYXAuYQpAQCAtMCwwICsxIEBACitsaWJ0aW5mby5hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRlcm1jYXAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidGVybWNhcC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjM1NTgzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRlcm1jYXAuc28KQEAgLTAsMCArMSwzIEBACisvKiBXZSB1c2UgYSBsaW5rZXIgc2NyaXB0IHJhdGhlciB0aGFuIGEgc3ltbGluayB0byB3b3JrIGFyb3VuZAorICAgYW4gbGRjb25maWcgYnVnLCBzZWUgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy8yNDkxMjIuICovCitHUk9VUCggbGlidGluZm8uc28gKQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRocmVhZF9kYi0xLjAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidGhyZWFkX2RiLTEuMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDQxMGVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRocmVhZF9kYi0xLjAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRocmVhZF9kYi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ0aHJlYWRfZGIuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzkxOTQ1NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ0aHJlYWRfZGIuc28KQEAgLTAsMCArMSBAQAorbGlidGhyZWFkX2RiLnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidGhyZWFkX2RiLnNvLjEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidGhyZWFkX2RiLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYmM1MjUxNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ0aHJlYWRfZGIuc28uMQpAQCAtMCwwICsxIEBACitsaWJ0aHJlYWRfZGItMS4wLnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmY2Q3MGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ0aWMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjI4YzU1YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ0aWMuc28KQEAgLTAsMCArMSBAQAorbGlidGljLnNvLjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidGljLnNvLjUgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidGljLnNvLjUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNThmNDVhZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ0aWMuc28uNQpAQCAtMCwwICsxIEBACitsaWJ0aWMuc28uNS45ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5zby41LjkgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidGljLnNvLjUuOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDcwODJkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5zby41LjkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRpbmZvLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidGluZm8uYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjY1Mjk3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRpbmZvLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRpbmZvLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRpbmZvLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjRmYWI4OTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidGluZm8uc28KQEAgLTAsMCArMSBAQAorbGlidGluZm8uc28uNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ0aW5mby5zby41IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnRpbmZvLnNvLjUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uY2Y5YmQxNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ0aW5mby5zby41CkBAIC0wLDAgKzEgQEAKK2xpYnRpbmZvLnNvLjUuOQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ0aW5mby5zby41LjkgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidGluZm8uc28uNS45Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMTFlZjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidGluZm8uc28uNS45CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ1dGlsLTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidXRpbC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMmZmZjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidXRpbC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ1dGlsLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidXRpbC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTViMWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidXRpbC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ1dGlsLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnV0aWwuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjNhZjY0NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ1dGlsLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnV0aWwuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ1dGlsLnNvLjEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidXRpbC5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjVmZmEzZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlidXRpbC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYnV0aWwtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ4Y2IuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ4Y2IuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzU1N2ExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnhjYi5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ4Y2Iuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlieGNiLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmU4NThkNDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlieGNiLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnhjYi5zby4xLjEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ4Y2Iuc28uMSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ4Y2Iuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lODU4ZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnhjYi5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYnhjYi5zby4xLjEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ4Y2Iuc28uMS4xLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlieGNiLnNvLjEuMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZjNmYjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGlieGNiLnNvLjEuMS4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ6LmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliei5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNWFiODIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliei5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ6LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL2xpYnouc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjkzYTVkZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ6LnNvCkBAIC0wLDAgKzEgQEAKK2xpYnouc28uMS4yLjMuNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ6LnNvLjEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliei5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY5M2E1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliei5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYnouc28uMS4yLjMuNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9saWJ6LnNvLjEuMi4zLjQgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliei5zby4xLjIuMy40Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjFhYTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbGliei5zby4xLjIuMy40CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9tZXNhL2xkLnNvLmNvbmYgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbWVzYS9sZC5zby5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzU1YWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbWVzYS9sZC5zby5jb25mCkBAIC0wLDAgKzEgQEAKKy91c3IvbGliL3g4Nl82NC1saW51eC1nbnUvbWVzYQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL21lc2EvbGliR0wuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbWVzYS9saWJHTC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zY2RkOWMwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL21lc2EvbGliR0wuc28KQEAgLTAsMCArMSBAQAorbGliR0wuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9tZXNhL2xpYkdMLnNvLjEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbWVzYS9saWJHTC5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmMwYWI4YzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvbWVzYS9saWJHTC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYkdMLnNvLjEuMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9tZXNhL2xpYkdMLnNvLjEuMiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9tZXNhL2xpYkdMLnNvLjEuMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzJhM2RlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL21lc2EvbGliR0wuc28uMS4yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvYWxzYS5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvYWxzYS5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjU0MjcwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9hbHNhLnBjCkBAIC0wLDAgKzEsMTQgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0vdXNyCitsaWJkaXI9JHtwcmVmaXh9L2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK05hbWU6IGFsc2EKK0Rlc2NyaXB0aW9uOiBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgKEFMU0EpIC0gTGlicmFyeQorVmVyc2lvbjogMS4wLjI1CitSZXF1aXJlczogCitMaWJzOiAtTCR7bGliZGlyfSAtbGFzb3VuZAorTGlicy5wcml2YXRlOiAtbG0gLWxkbCAtbHB0aHJlYWQgLWxydAorIyAtSSR7aW5jbHVkZWRpcn0vYWxzYSBiZWxvdyBpcyBqdXN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisjIChpdCB3YXMgc2V0IHNvIG1pc3Rha2VseSBpbiB0aGUgb2xkZXIgdmVyc2lvbikKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1JJHtpbmNsdWRlZGlyfS9hbHNhCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2F1ZGlvZmlsZS5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvYXVkaW9maWxlLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNmRkYzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2F1ZGlvZmlsZS5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK05hbWU6IGF1ZGlvZmlsZQorRGVzY3JpcHRpb246IGF1ZGlvZmlsZQorUmVxdWlyZXM6CitWZXJzaW9uOiAwLjMuMworTGliczogLUwke2xpYmRpcn0gLWxhdWRpb2ZpbGUKK0xpYnMucHJpdmF0ZTogLWxtCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9kcmkucGMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2RyaS5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjE5YjA5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9kcmkucGMKQEAgLTAsMCArMSwxMSBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPS91c3IvbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9L3Vzci9pbmNsdWRlCitkcmlkcml2ZXJkaXI9L3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9kcmkKKworTmFtZTogZHJpCitEZXNjcmlwdGlvbjogRGlyZWN0IFJlbmRlcmluZyBJbmZyYXN0cnVjdHVyZQorVmVyc2lvbjogOC4wLjAKK1JlcXVpcmVzLnByaXZhdGU6IGxpYmRybSA+PSAyLjQuMjQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2Vzb3VuZC5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvZXNvdW5kLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzgzZjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2Vzb3VuZC5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCitlc2Rfc2VydmVyZGlyPSR7cHJlZml4fS9iaW4KKworTmFtZTogZXNvdW5kCitEZXNjcmlwdGlvbjogZXNvdW5kCitSZXF1aXJlcy5wcml2YXRlOiBhdWRpb2ZpbGUKK1ZlcnNpb246IDAuMi40MQorTGliczogLUwke2xpYmRpcn0gLWxlc2QgCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9mb3JtLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9mb3JtLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTY5YWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2Zvcm0ucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPS91c3IvbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK21ham9yX3ZlcnNpb249NQordmVyc2lvbj01LjkuMjAxMTA0MDQKKworTmFtZTogZm9ybQorRGVzY3JpcHRpb246IG5jdXJzZXMgNS45IGFkZC1vbiBsaWJyYXJ5CitWZXJzaW9uOiAke3ZlcnNpb259CitSZXF1aXJlczogbmN1cnNlcyB0aW5mbworTGliczogLUwke2xpYmRpcn0gLWxmb3JtCitDZmxhZ3M6IApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9nbC5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvZ2wucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiY2Q0YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvZ2wucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPS91c3IvbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9L3Vzci9pbmNsdWRlCisKK05hbWU6IGdsCitEZXNjcmlwdGlvbjogTWVzYSBPcGVuR0wgbGlicmFyeQorUmVxdWlyZXMucHJpdmF0ZTogeDExIHhleHQKK1ZlcnNpb246IDguMC4wCitMaWJzOiAtTCR7bGliZGlyfSAtbEdMCitMaWJzLnByaXZhdGU6IC1sbSAtbHB0aHJlYWQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IAorZ2x4X3Rsczogbm8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjkwMTU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9saWJwdWxzZS1tYWlubG9vcC1nbGliLnBjCkBAIC0wLDAgKzEsMTIgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke3ByZWZpeH0vbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogbGlicHVsc2UtbWFpbmxvb3AtZ2xpYgorRGVzY3JpcHRpb246IFB1bHNlQXVkaW8gR0xpYiAyLjAgTWFpbiBMb29wIFdyYXBwZXIKK1ZlcnNpb246IDEuMQorTGliczogLUwke2xpYmRpcn0gLWxwdWxzZS1tYWlubG9vcC1nbGliIAorTGlicy5wcml2YXRlOiAtbHB1bHNlY29tbW9uLTEuMQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0gLURfUkVFTlRSQU5UCitSZXF1aXJlczogbGlicHVsc2UgZ2xpYi0yLjAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2Utc2ltcGxlLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9saWJwdWxzZS1zaW1wbGUucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3N2U1YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2Utc2ltcGxlLnBjCkBAIC0wLDAgKzEsMTIgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke3ByZWZpeH0vbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogbGlicHVsc2Utc2ltcGxlCitEZXNjcmlwdGlvbjogUHVsc2VBdWRpbyBTaW1wbGlmaWVkIFN5bmNocm9ub3VzIENsaWVudCBJbnRlcmZhY2UKK1ZlcnNpb246IDEuMQorTGliczogLUwke2xpYmRpcn0gLWxwdWxzZS1zaW1wbGUgCitMaWJzLnByaXZhdGU6IC1scHVsc2Vjb21tb24tMS4xCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAtRF9SRUVOVFJBTlQKK1JlcXVpcmVzOiBsaWJwdWxzZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9saWJwdWxzZS5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2UucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmOWVhMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2UucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIveDg2XzY0LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorbW9kbGliZXhlY2Rpcj0ke3ByZWZpeH0vbGliL3B1bHNlLTEuMS9tb2R1bGVzCisKK05hbWU6IGxpYnB1bHNlCitEZXNjcmlwdGlvbjogUHVsc2VBdWRpbyBDbGllbnQgSW50ZXJmYWNlCitWZXJzaW9uOiAxLjEKK0xpYnM6IC1MJHtsaWJkaXJ9IC1scHVsc2UgCitMaWJzLnByaXZhdGU6IC1scHVsc2Vjb21tb24tMS4xCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAtRF9SRUVOVFJBTlQKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbWVudS5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbWVudS5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODA0MGE3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9tZW51LnBjCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0vdXNyL2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCittYWpvcl92ZXJzaW9uPTUKK3ZlcnNpb249NS45LjIwMTEwNDA0CisKK05hbWU6IG1lbnUKK0Rlc2NyaXB0aW9uOiBuY3Vyc2VzIDUuOSBhZGQtb24gbGlicmFyeQorVmVyc2lvbjogJHt2ZXJzaW9ufQorUmVxdWlyZXM6IG5jdXJzZXMgdGluZm8KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sbWVudQorQ2ZsYWdzOiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbmN1cnNlcysrLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9uY3Vyc2VzKysucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjNmMwNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbmN1cnNlcysrLnBjCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0vdXNyL2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCittYWpvcl92ZXJzaW9uPTUKK3ZlcnNpb249NS45LjIwMTEwNDA0CisKK05hbWU6IG5jdXJzZXMrKworRGVzY3JpcHRpb246IG5jdXJzZXMgNS45IGFkZC1vbiBsaWJyYXJ5CitWZXJzaW9uOiAke3ZlcnNpb259CitSZXF1aXJlczogcGFuZWwgbWVudSBmb3JtIG5jdXJzZXMgdGluZm8KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sbmN1cnNlcysrCitDZmxhZ3M6IApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9uY3Vyc2VzLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9uY3Vyc2VzLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZTVhNWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL25jdXJzZXMucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPS91c3IvbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK21ham9yX3ZlcnNpb249NQordmVyc2lvbj01LjkuMjAxMTA0MDQKKworTmFtZTogbmN1cnNlcworRGVzY3JpcHRpb246IG5jdXJzZXMgNS45IGxpYnJhcnkKK1ZlcnNpb246ICR7dmVyc2lvbn0KK1JlcXVpcmVzOiB0aW5mbworTGliczogLUwke2xpYmRpcn0gLWxuY3Vyc2VzCitDZmxhZ3M6IApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9wYW5lbC5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvcGFuZWwucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU0NTIwOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvcGFuZWwucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPS91c3IvbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK21ham9yX3ZlcnNpb249NQordmVyc2lvbj01LjkuMjAxMTA0MDQKKworTmFtZTogcGFuZWwKK0Rlc2NyaXB0aW9uOiBuY3Vyc2VzIDUuOSBhZGQtb24gbGlicmFyeQorVmVyc2lvbjogJHt2ZXJzaW9ufQorUmVxdWlyZXM6IG5jdXJzZXMgdGluZm8KK0xpYnM6IC1MJHtsaWJkaXJ9IC1scGFuZWwKK0NmbGFnczogCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3RpYy5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvdGljLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YzI0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3RpYy5wYwpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9L3Vzci9saWIveDg2XzY0LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorbWFqb3JfdmVyc2lvbj01Cit2ZXJzaW9uPTUuOS4yMDExMDQwNAorCitOYW1lOiB0aWMKK0Rlc2NyaXB0aW9uOiBuY3Vyc2VzIDUuOSBhZGQtb24gbGlicmFyeQorVmVyc2lvbjogJHt2ZXJzaW9ufQorUmVxdWlyZXM6IG5jdXJzZXMgdGluZm8KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sdGljCitDZmxhZ3M6IApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy90aW5mby5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvdGluZm8ucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5ZDJhMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvdGluZm8ucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPS91c3IvbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK21ham9yX3ZlcnNpb249NQordmVyc2lvbj01LjkuMjAxMTA0MDQKKworTmFtZTogdGluZm8KK0Rlc2NyaXB0aW9uOiBuY3Vyc2VzIDUuOSB0ZXJtaW5hbCBpbnRlcmZhY2UgbGlicmFyeQorVmVyc2lvbjogJHt2ZXJzaW9ufQorUmVxdWlyZXM6IAorTGliczogLUwke2xpYmRpcn0gLWx0aW5mbyAgCitDZmxhZ3M6IApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94MTEucGMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3gxMS5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmQ5MTk1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94MTEucGMKQEAgLTAsMCArMSwxNSBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIveDg2XzY0LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCit4dGhyZWFkbGliPS1scHRocmVhZAorCitOYW1lOiBYMTEKK0Rlc2NyaXB0aW9uOiBYIExpYnJhcnkKK1ZlcnNpb246IDEuNC45OS4xCitSZXF1aXJlczogeHByb3RvIGticHJvdG8KK1JlcXVpcmVzLnByaXZhdGU6IHhjYiA+PSAxLjEuOTIKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IAorTGliczogLUwke2xpYmRpcn0gLWxYMTEKK0xpYnMucHJpdmF0ZTogLWxwdGhyZWFkCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3hjYi5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcveGNiLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDU2YTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3hjYi5wYwpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCit4Y2Jwcm90b192ZXJzaW9uPTEuNworCitOYW1lOiBYQ0IKK0Rlc2NyaXB0aW9uOiBYLXByb3RvY29sIEMgQmluZGluZworVmVyc2lvbjogMS44LjEKK1JlcXVpcmVzLnByaXZhdGU6IHB0aHJlYWQtc3R1YnMgeGF1ID49IDAuOTkuMiB4ZG1jcAorTGliczogLUwke2xpYmRpcn0gLWx4Y2IKK0xpYnMucHJpdmF0ZTogCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94ZXh0LnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94ZXh0LnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMDJjYWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3hleHQucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIveDg2XzY0LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBYZXh0CitEZXNjcmlwdGlvbjogTWlzYyBYIEV4dGVuc2lvbiBMaWJyYXJ5CitWZXJzaW9uOiAxLjMuMAorUmVxdWlyZXM6IHhleHRwcm90bworUmVxdWlyZXMucHJpdmF0ZTogeDExCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQorTGliczogLUwke2xpYmRpcn0gLWxYZXh0CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3hmaXhlcy5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcveGZpeGVzLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDNiNmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3hmaXhlcy5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK05hbWU6IFhmaXhlcworRGVzY3JpcHRpb246IFggRml4ZXMgIExpYnJhcnkKK1ZlcnNpb246IDUuMAorUmVxdWlyZXM6IHhwcm90byBmaXhlc3Byb3RvID49IDUuMAorUmVxdWlyZXMucHJpdmF0ZTogeDExCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQorTGliczogLUwke2xpYmRpcn0gLWxYZml4ZXMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcveGkucGMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3hpLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjY2FkNGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3hpLnBjCkBAIC0wLDAgKzEsMTIgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke3ByZWZpeH0vbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogWGkKK0Rlc2NyaXB0aW9uOiBYIElucHV0IEV4dGVuc2lvbiBMaWJyYXJ5CitWZXJzaW9uOiAxLjYuMAorUmVxdWlyZXM6IGlucHV0cHJvdG8KK1JlcXVpcmVzLnByaXZhdGU6IHgxMSB4ZXh0CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQorTGliczogLUwke2xpYmRpcn0gLWxYaQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy96bGliLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy96bGliLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNjBjMmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3psaWIucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIveDg2XzY0LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiB6bGliCitEZXNjcmlwdGlvbjogemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CitWZXJzaW9uOiAxLjIuMy40CisKK1JlcXVpcmVzOiAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1segorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYi92YWxncmluZC9uY3Vyc2VzLnN1cHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvdmFsZ3JpbmQvbmN1cnNlcy5zdXBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYTU4MmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIvdmFsZ3JpbmQvbmN1cnNlcy5zdXBwCkBAIC0wLDAgKzEsMjA1IEBACisjICRJZDogbmN1cnNlcy5zdXBwLHYgMS43IDIwMDgvMDkvMjAgMTg6NDM6NDIgdG9tIEV4cCAkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAgICMKKyMgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgIworIyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uICAjCisjIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBkaXN0cmlidXRlICAgICMKKyMgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gIworIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlICAjCisjIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiAjCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiAjCisjIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCAgICMKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgICAgIworIyBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgICAgICAjCisjIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HICAgICMKKyMgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiAgICAgICAgIworIyBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgIworIyBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCAjCisjIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAgICAgICAgICMKKyMgYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRoaXMgaXMgYSB3YXJuaW5nLXN1cHByZXNzaW9uIGZpbGUgZm9yIHZhbGdyaW5kIGFuZCBuY3Vyc2VzLgorIworIyBuY3Vyc2VzIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIC0tZGlzYWJsZS1sZWFrcyBvcHRpb24sIHdoaWNoCisjIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBjYWxsIF9uY19mcmVlYWxsKCkgb3IgX25jX2ZyZWVfYW5kX2V4aXQoKSwgdG8KKyMgZnJlZSBhbGwgb2YgbmN1cnNlcycgInBlcm1hbmVudCIgbWVtb3J5LgorIworIyBTb21lIG9mIHRoZXNlIGxlYWtzIGNhbiBiZSBmcmVlZCBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBpdHMgb3duIGNsZWFudXAsCisjIGZvciBleGFtcGxlOgorIwlkZWxzY3JlZW4oU1ApOworIwlkZWxfY3VydGVybShjdXJfdGVybSk7CisjIEhvd2V2ZXIsIGZldyBhcHBsaWNhdGlvbnMgZG8gdGhpcy4KKworeworICAgbmN1cnNlc19sZWFrX19uY19hZGRfdG9fdHJ5CisgICBNZW1jaGVjazpMZWFrCisgICBmdW46KmFsbG9jCisgICBmdW46X25jX2FkZF90b190cnkKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19ob21lX3Rlcm1pbmZvCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46bWFsbG9jCisgICBmdW46X25jX2hvbWVfdGVybWluZm8KK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19pbml0X3dhY3MKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpfbmNfaW5pdF93YWNzCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfa2V5bmFtZQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOmNhbGxvYworICAgZnVuOl9uY19rZXluYW1lCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfa2V5bmFtZV8yCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46bWFsbG9jCisgICBmdW46c3RyZHVwCisgICBmdW46X25jX2tleW5hbWUKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19wcmludGZfc3RyaW5nCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46bWFsbG9jCisgICBmdW46X25jX2RvYWxsb2MKKyAgIGZ1bjpfbmNfcHJpbnRmX3N0cmluZworfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3JlYWRfdGVybXR5cGUKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjoqYWxsb2MKKyAgIGZ1bjpfbmNfcmVhZF90ZXJtdHlwZQorICAgZnVuOl9uY19yZWFkX2ZpbGVfZW50cnkKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19yZWFkX3Rlcm10eXBlXzIKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjoqYWxsb2MKKyAgIGZ1bjpfbmNfZG9hbGxvYworICAgZnVuOl9uY19yZWFkX3Rlcm10eXBlCisgICBmdW46X25jX3JlYWRfZmlsZV9lbnRyeQorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3Njcm9sbF9vcHRpbWl6ZQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOiphbGxvYworICAgZnVuOl9uY19oYXNoX21hcAorICAgZnVuOl9uY19zY3JvbGxfb3B0aW1pemUKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19zY3JvbGxfb3B0aW1pemVfMgorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOiphbGxvYworICAgZnVuOl9uY19kb2FsbG9jCisgICBmdW46X25jX3Njcm9sbF9vcHRpbWl6ZQorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3NldHVwc2NyZWVuCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46Y2FsbG9jCisgICBmdW46X25jX3NldHVwc2NyZWVuCisgICBmdW46bmV3dGVybQorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3NldHVwc2NyZWVuXzIKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpuZXd3aW4KKyAgIGZ1bjpfbmNfc2V0dXBzY3JlZW4KK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19zZXR1cHRlcm1fMQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOm1hbGxvYworICAgZnVuOnN0cmR1cAorICAgZnVuOl9uY19zZXR1cHRlcm0KK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19zZXR1cHRlcm0KKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpfbmNfc2V0dXB0ZXJtCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfc2V0dXBzY3JlZW5fMworICAgTWVtY2hlY2s6TGVhaworICAgZnVuOmNhbGxvYworICAgZnVuOl9uY19tYWtlbmV3CisgICBmdW46bmV3d2luCisgICBmdW46X25jX3NldHVwc2NyZWVuCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfc2V0X2J1ZmZlcgorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOm1hbGxvYworICAgZnVuOl9uY19zZXRfYnVmZmVyCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfdHBhcm1fYW5hbHl6ZQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOiphbGxvYworICAgZnVuOl9uY19kb2FsbG9jCisgICBmdW46X25jX3RwYXJtX2FuYWx5emUKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY190cmFjZV9hbGxvYworICAgTWVtY2hlY2s6TGVhaworICAgZnVuOiphbGxvYworICAgZnVuOl9uY19kb2FsbG9jCisgICBmdW46X25jX3RyYWNlX2FsbG9jCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19zdGFydF9jb2xvcgorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOmNhbGxvYworICAgZnVuOnN0YXJ0X2NvbG9yCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha190cGFybQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOnJlYWxsb2MKKyAgIGZ1bjpfbmNfZG9hbGxvYworICAgZnVuOnRwYXJtCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha190cGFyYW1faW50ZXJuYWwKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpyZWFsbG9jCisgICBmdW46X25jX2RvYWxsb2MKKyAgIGZ1bjpnZXRfc3BhY2UKKyAgIGZ1bjpzYXZlX251bWJlcgorICAgZnVuOnRwYXJhbV9pbnRlcm5hbAorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvTWNydDEubyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL01jcnQxLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlZGFhYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL01jcnQxLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvU2NydDEubyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL1NjcnQxLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4YTljNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL1NjcnQxLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvYWxzYS1saWIvc21peGVyL3NtaXhlci1hYzk3LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvYWxzYS1saWIvc21peGVyL3NtaXhlci1hYzk3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNDMyMjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9hbHNhLWxpYi9zbWl4ZXIvc21peGVyLWFjOTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvYWxzYS1saWIvc21peGVyL3NtaXhlci1oZGEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9hbHNhLWxpYi9zbWl4ZXIvc21peGVyLWhkYS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjdkYWU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvYWxzYS1saWIvc21peGVyL3NtaXhlci1oZGEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvYWxzYS1saWIvc21peGVyL3NtaXhlci1zYmFzZS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItc2Jhc2Uuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1OWQ3YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItc2Jhc2Uuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvY21ha2UvUHVsc2VBdWRpby9QdWxzZUF1ZGlvQ29uZmlnLmNtYWtlIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvY21ha2UvUHVsc2VBdWRpby9QdWxzZUF1ZGlvQ29uZmlnLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWFjODkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9jbWFrZS9QdWxzZUF1ZGlvL1B1bHNlQXVkaW9Db25maWcuY21ha2UKQEAgLTAsMCArMSwxMCBAQAorc2V0KFBVTFNFQVVESU9fRk9VTkQgVFJVRSkKKworc2V0KFBVTFNFQVVESU9fVkVSU0lPTl9NQUpPUiAxKQorc2V0KFBVTFNFQVVESU9fVkVSU0lPTl9NSU5PUiAxKQorc2V0KFBVTFNFQVVESU9fVkVSU0lPTiAxLjEpCitzZXQoUFVMU0VBVURJT19WRVJTSU9OX1NUUklORyAiMS4xIikKKworZmluZF9wYXRoKFBVTFNFQVVESU9fSU5DTFVERV9ESVIgcHVsc2UvcHVsc2VhdWRpby5oIEhJTlRTICIvdXNyL2luY2x1ZGUiKQorZmluZF9saWJyYXJ5KFBVTFNFQVVESU9fTElCUkFSWSBOQU1FUyBwdWxzZSBsaWJwdWxzZSBISU5UUyAiL3Vzci9saWIvaTM4Ni1saW51eC1nbnUiKQorZmluZF9saWJyYXJ5KFBVTFNFQVVESU9fTUFJTkxPT1BfTElCUkFSWSBOQU1FUyBwdWxzZS1tYWlubG9vcC1nbGliIGxpYnB1bHNlLW1haW5sb29wLWdsaWIgSElOVFMgIi91c3IvbGliL2kzODYtbGludXgtZ251IikKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2NtYWtlL1B1bHNlQXVkaW8vUHVsc2VBdWRpb0NvbmZpZ1ZlcnNpb24uY21ha2UgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9jbWFrZS9QdWxzZUF1ZGlvL1B1bHNlQXVkaW9Db25maWdWZXJzaW9uLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjExMDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9jbWFrZS9QdWxzZUF1ZGlvL1B1bHNlQXVkaW9Db25maWdWZXJzaW9uLmNtYWtlCkBAIC0wLDAgKzEsMTEgQEAKK3NldChQQUNLQUdFX1ZFUlNJT04gMS4xKQorCitpZigiJHtQQUNLQUdFX1ZFUlNJT059IiBWRVJTSU9OX0xFU1MgIiR7UEFDS0FHRV9GSU5EX1ZFUlNJT059IiApCisgIHNldChQQUNLQUdFX1ZFUlNJT05fQ09NUEFUSUJMRSBGQUxTRSkKK2Vsc2UoIiR7UEFDS0FHRV9WRVJTSU9OfSIgVkVSU0lPTl9MRVNTICIke1BBQ0tBR0VfRklORF9WRVJTSU9OfSIgKQorICBzZXQoUEFDS0FHRV9WRVJTSU9OX0NPTVBBVElCTEUgVFJVRSkKKyAgaWYoICIke1BBQ0tBR0VfRklORF9WRVJTSU9OfSIgU1RSRVFVQUwgIiR7UEFDS0FHRV9WRVJTSU9OfSIpCisgICAgc2V0KFBBQ0tBR0VfVkVSU0lPTl9FWEFDVCBUUlVFKQorICBlbmRpZiggIiR7UEFDS0FHRV9GSU5EX1ZFUlNJT059IiBTVFJFUVVBTCAiJHtQQUNLQUdFX1ZFUlNJT059IikKK2VuZGlmKCIke1BBQ0tBR0VfVkVSU0lPTn0iIFZFUlNJT05fTEVTUyAiJHtQQUNLQUdFX0ZJTkRfVkVSU0lPTn0iICkKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvY3J0MS5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvY3J0MS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZjdhYWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9jcnQxLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvY3J0aS5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvY3J0aS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZmNlODgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9jcnRpLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvY3J0bi5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvY3J0bi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZTMzNTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9jcnRuLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQU5TSV9YMy4xMTAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9BTlNJX1gzLjExMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmIzNGFiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQU5TSV9YMy4xMTAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQVJNU0NJSS04LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQVJNU0NJSS04LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzA4MjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9BUk1TQ0lJLTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQVNNT180NDkuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9BU01PXzQ0OS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTJmZDVhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQVNNT180NDkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQklHNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0JJRzUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM5NzNjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0JJRzUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQklHNUhLU0NTLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQklHNUhLU0NTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjg2MGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9CSUc1SEtTQ1Muc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQlJGLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQlJGLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNGUwYmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9CUkYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMDAwNy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTAwMDcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3NjI1YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTAwMDcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMTI1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMTI1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZWRiZjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDExMjUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjUwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjUwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZGZkZDgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDEyNTAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjUxLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjUxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjhiZjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDEyNTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjUyLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjUyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMmRkNDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDEyNTIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjUzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjUzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTk2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDEyNTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhM2U0MTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDEyNTQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZmNjYmEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDEyNTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU2LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MjI2YTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDEyNTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU3LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYjRhYjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDEyNTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU4LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMzFhZWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDEyNTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3Mzcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDczNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDVkZTAzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3Mzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDc3MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTZlOTRiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDc3MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGNlYmYzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzIuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDc3Mi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTI0MjA5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDc3My5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGVmODAyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDc3NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDQwYzZjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDc3NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmM3MGUyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A5MzIuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDkzMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTFjZjM3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A5MzIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1NOXzM2OTEwMy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NTTl8zNjkxMDMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5OTZlNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NTTl8zNjkxMDMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1dJLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1dJLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYzljNzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9DV0kuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvREVDLU1DUy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0RFQy1NQ1Muc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyYzliYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0RFQy1NQ1Muc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUFULURFLUEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtQVQtREUtQS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODFhMjE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUFULURFLUEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUFULURFLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUFULURFLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZjlhMmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtQVQtREUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUNBLUZSLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUNBLUZSLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlY2NjNmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtQ0EtRlIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLURLLU5PLUEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtREstTk8tQS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM3YmEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLURLLU5PLUEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLURLLU5PLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLURLLU5PLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDBkZTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtREstTk8uc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUVTLUEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtRVMtQS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjkzODhmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUVTLUEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUVTLVMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtRVMtUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDVhZmNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUVTLVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUVTLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUVTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMGQwN2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtRVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUZJLVNFLUEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtRkktU0UtQS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTUzZTU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUZJLVNFLUEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUZJLVNFLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUZJLVNFLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MTRiOTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtRkktU0Uuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUZSLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUZSLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYjc1MWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtRlIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUlTLUZSSVNTLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUlTLUZSSVNTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOWU4MTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtSVMtRlJJU1Muc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUlULnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUlULnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MWFjODYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtSVQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLVBULnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLVBULnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDEwM2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtUFQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLVVLLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLVVLLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOWEyYzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtVUsuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLVVTLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLVVTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTZkMzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQkNESUMtVVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUNNQS1DWVJJTExJQy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VDTUEtQ1lSSUxMSUMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2Yjg3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VDTUEtQ1lSSUxMSUMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUNOLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUNOLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjE2NTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FVUMtQ04uc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUpJU1gwMjEzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUpJU1gwMjEzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNjk2MjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FVUMtSklTWDAyMTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUpQLU1TLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUpQLU1TLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYzZmNzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FVUMtSlAtTVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUpQLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUpQLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MGQ5YjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FVUMtSlAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUtSLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUtSLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDExNmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FVUMtS1Iuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLVRXLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLVRXLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMDEzNDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9FVUMtVFcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0IxODAzMC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dCMTgwMzAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkODk4ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dCMTgwMzAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0JCSUc1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0JCSUc1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNzZhZTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9HQkJJRzUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0JHQksuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9HQkdCSy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTRjMWQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0JHQksuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0JLLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0JLLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZWFmZDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9HQksuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0VPUkdJQU4tQUNBREVNWS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dFT1JHSUFOLUFDQURFTVkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2YmMxNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dFT1JHSUFOLUFDQURFTVkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0VPUkdJQU4tUFMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9HRU9SR0lBTi1QUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODRkOGE5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0VPUkdJQU4tUFMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR09TVF8xOTc2OC03NC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dPU1RfMTk3NjgtNzQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2MjM0YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dPU1RfMTk3NjgtNzQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR1JFRUstQ0NJVFQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9HUkVFSy1DQ0lUVC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDYzZTZlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR1JFRUstQ0NJVFQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR1JFRUs3LU9MRC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dSRUVLNy1PTEQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3ZmU3MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dSRUVLNy1PTEQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR1JFRUs3LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR1JFRUs3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzllNTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9HUkVFSzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtR1JFRUs4LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtR1JFRUs4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZDczMWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9IUC1HUkVFSzguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtUk9NQU44LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtUk9NQU44LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MmQ5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9IUC1ST01BTjguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtUk9NQU45LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtUk9NQU45LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOWVlZTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9IUC1ST01BTjkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtVEhBSTguc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9IUC1USEFJOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjA2ZGY2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtVEhBSTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtVFVSS0lTSDguc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9IUC1UVVJLSVNIOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWJkODBjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtVFVSS0lTSDguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMDM3LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMDM3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMTRjNzAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0wMzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMDM4LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMDM4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NTczMTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0wMzguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTAwNC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMDQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3NWZmNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMDQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTAwOC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMDguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhZGY5YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMDguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTAwOF80MjAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDA4XzQyMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTE2MjNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTAwOF80MjAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTAyNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMjUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxMTFlMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMjUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTAyNi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMjYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2ZjViMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMjYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTA0Ni5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwNDYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4Mzk4NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwNDYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTA0Ny5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwNDcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2NmVjNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwNDcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTA5Ny5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwOTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwYWVjMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwOTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTExMi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMTIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0ZDYwZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMTIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTEyMi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMjIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5NGM4YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMjIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTEyMy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMjMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwZGJmOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMjMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTEyNC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMjQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjNTNhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMjQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTEyOS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMjkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5MTIzNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMjkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTEzMC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMzAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdkZDQwZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMzAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTEzMi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMzIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjN2NhOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMzIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTEzMy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMzMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4YWRiOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTEzNy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMzcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiOGQwYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE0MC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwYTg0NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE0MS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3MGYzZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE0Mi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzODhiNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE0My5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiOWY5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE0NC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2Yjk0ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE0NS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwNjA2ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE0Ni5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0OWEyMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE0Ny5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4NGU2YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE0OC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1M2M5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE0OS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0YzVmNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE1My5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5MzFkMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE1NC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmNmRiMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE1NS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlZDBkZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE1Ni5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxODVjNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE1Ny5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2NjEzMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE1OC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmNWNmOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE2MC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1ZjgxMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE2MS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1ZDI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE2Mi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVjZmUyZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE2My5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlZGJhYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE2NC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiNjRjYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE2Ni5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyYTFhOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTE2Ny5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzNTcyOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTI3MTIuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMjcxMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmM2MmU4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTI3MTIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTM2NC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzNjQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2NmQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzNjQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTM3MS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzNzEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmOTRlMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzNzEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTM4OC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzODguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmYWIxOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzODguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTM5MC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzOTAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1ZDZmMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzOTAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTM5OS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzOTkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmOGZmMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzOTkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTY4MDQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xNjgwNC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODViMTRhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTY4MDQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjU2LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjU2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2I0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0yNTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjczLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjczLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MDRhM2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0yNzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjc0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjc0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MjMzOGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0yNzQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjc1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjc1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjUwMTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0yNzUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjc3LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjc3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZjdjNTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0yNzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjc4LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjc4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxM2Y3MmEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0yNzguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjgwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjgwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMDlmZjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0yODAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjgxLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjgxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YzdkY2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0yODEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjg0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjg0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNThiNWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0yODQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjg1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjg1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NjBmYWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0yODUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjkwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjkwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDRiZWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0yOTAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjk3LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjk3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YWU4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0yOTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDIwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDIwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTc0ZDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk00MjAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDIzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDIzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYzQwZDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk00MjMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDI0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDI0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNmZjOWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk00MjQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDM3LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDM3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYTg2MzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk00Mzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDUxNy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQ1MTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3MmVhYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQ1MTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDg5OS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQ4OTkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5ZGVhZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQ4OTkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDkwOS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQ5MDkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4YzU0MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQ5MDkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDk3MS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQ5NzEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiOTEyNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQ5NzEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNTAwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNTAwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjVmZjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk01MDAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNTM0Ny5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTUzNDcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyYmIyZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTUzNDcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODAzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODAzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ODYzNGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04MDMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODUwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODUwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMWE4OTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NTAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODUxLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODUxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NGYwYWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODUyLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODUyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzZkNzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NTIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODU1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODU1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjdjZDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODU2LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODU2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YTdlOGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODU3LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODU3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZWY2MjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODYwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODYwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDFiODkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NjAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODYxLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODYxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OGMzYmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NjEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODYyLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODYyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNmZhNDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NjIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODYzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODYzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZDhhNzEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NjMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODc2YjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NjQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NjUwMzAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NjUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY2LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYTQ2MjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NjYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY2TkFWLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY2TkFWLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTkzYWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NjZOQVYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY4LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NmFkYzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04Njguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY5LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmQ5OTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04Njkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODcwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODcwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDdjMjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NzAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODcxLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODcxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNDIwYTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NzEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODc0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODc0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzJiZmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NzQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODc1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODc1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDY2NzIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04NzUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODgwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODgwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiODU3MWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04ODAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODkxLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODkxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMzAwOWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk04OTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTAxLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTAxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZDU3YmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MDEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTAyLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTAyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOGJlNWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MDIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTAzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTAzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Y2E0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MDMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTAzMC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwMzAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkYmMwYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwMzAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTA0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTA0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Y2RlN2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MDQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTA1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTA1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTMwZmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MDUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTA2Ni5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwNjYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzMTZlZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwNjYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTE4LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTE4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjM1NTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTIxLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTIxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YThkZDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MjEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTIyLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTIyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYzgxNTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MjIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTMwLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTMwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDQ5M2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MzAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTMyLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTMyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOGYxZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MzIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTMzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTMzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjE1MjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTM1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTM1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOGI0ODkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MzUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTM3LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTM3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZGVmNWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05Mzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTM5LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTM5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OGFjMDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05Mzkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTQzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTQzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxM2IwNDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05NDMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTQ0OC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTk0NDguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4OGFkZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTk0NDguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUVDX1AyNy0xLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUVDX1AyNy0xLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTJkM2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JRUNfUDI3LTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSU5JUy04LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSU5JUy04LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Njk3YjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JTklTLTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSU5JUy1DWVJJTExJQy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lOSVMtQ1lSSUxMSUMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljNzlkMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lOSVMtQ1lSSUxMSUMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSU5JUy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lOSVMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4Y2FkMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lOSVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNJUkktMzM0Mi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTSVJJLTMzNDIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2NmZjMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTSVJJLTMzNDIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLTIwMjItQ04tRVhULnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLTIwMjItQ04tRVhULnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZjg0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU08tMjAyMi1DTi1FWFQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLTIwMjItQ04uc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU08tMjAyMi1DTi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2Q2NDJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLTIwMjItQ04uc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLTIwMjItSlAtMy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy0yMDIyLUpQLTMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0OThjYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy0yMDIyLUpQLTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLTIwMjItSlAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU08tMjAyMi1KUC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWQ0MzIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLTIwMjItSlAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLTIwMjItS1Iuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU08tMjAyMi1LUi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjAwZThmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLTIwMjItS1Iuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLUlSLTE5Ny5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy1JUi0xOTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiY2E5MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy1JUi0xOTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLUlSLTIwOS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy1JUi0yMDkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3YzQ5NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy1JUi0yMDkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPNjQ2LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPNjQ2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMmRjNmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU082NDYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0xLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0xLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMTgzYjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0xMC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiNDMwYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0xMS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkYTdkZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0xMy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxNGI3OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0xNC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkN2U0OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MwYmQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0xNi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4NDcxYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0yLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0yLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmFmMjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0zLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0zLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Mjk2M2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS00LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS00LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NTQ1NjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS01LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS01LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOTVjNDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS02LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS02LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YzNhOTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS03LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS03LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZmRlODYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS04LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS04LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjBiZTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS05LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS05LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NGQ3YzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS05RS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktOUUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmZTBjOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktOUUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzEwMzY3LUJPWC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT18xMDM2Ny1CT1guc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhOWM5NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT18xMDM2Ny1CT1guc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzExNTQ4LTEuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU09fMTE1NDgtMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjU2NDZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzExNTQ4LTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzIwMzMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU09fMjAzMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzMzYmMwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzIwMzMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzU0MjctRVhULnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzU0MjctRVhULnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOTQ5NmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU09fNTQyNy1FWFQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzU0Mjcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU09fNTQyNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDhlNDhhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzU0Mjcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzU0Mjguc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU09fNTQyOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDk5NjU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzU0Mjguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzY5MzctMi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT182OTM3LTIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhMTUzMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT182OTM3LTIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzY5Mzcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU09fNjkzNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmUzN2E4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzY5Mzcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSk9IQUIuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9KT0hBQi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTNlMWRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSk9IQUIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvS09JLTguc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9LT0ktOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2U0NGQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvS09JLTguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvS09JOC1SLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvS09JOC1SLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ODJhZjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9LT0k4LVIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvS09JOC1SVS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0tPSTgtUlUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2OGI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0tPSTgtUlUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvS09JOC1ULnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvS09JOC1ULnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZTNjN2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9LT0k4LVQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvS09JOC1VLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvS09JOC1VLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNmJiNDgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9LT0k4LVUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTEFUSU4tR1JFRUstMS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0xBVElOLUdSRUVLLTEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4YTk4ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0xBVElOLUdSRUVLLTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTEFUSU4tR1JFRUsuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9MQVRJTi1HUkVFSy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTcxNzY3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTEFUSU4tR1JFRUsuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDLUNFTlRSQUxFVVJPUEUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9NQUMtQ0VOVFJBTEVVUk9QRS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmI2MzRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDLUNFTlRSQUxFVVJPUEUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDLUlTLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDLUlTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2E3NmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9NQUMtSVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDLVNBTUkuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9NQUMtU0FNSS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQ5MWQ1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDLVNBTUkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDLVVLLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDLVVLLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NDI5MjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9NQUMtVUsuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDSU5UT1NILnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDSU5UT1NILnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzYwZTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9NQUNJTlRPU0guc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUlLLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUlLLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODljMDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9NSUsuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTkFUUy1EQU5PLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTkFUUy1EQU5PLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMmUyODEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9OQVRTLURBTk8uc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTkFUUy1TRUZJLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTkFUUy1TRUZJLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YjNjYTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9OQVRTLVNFRkkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvUFQxNTQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9QVDE1NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E1NWM5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvUFQxNTQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvUksxMDQ4LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvUksxMDQ4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDU3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9SSzEwNDguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvU0FNSS1XUzIuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9TQU1JLVdTMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTIxNjNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvU0FNSS1XUzIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvU0hJRlRfSklTWDAyMTMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9TSElGVF9KSVNYMDIxMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzkwYzcyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvU0hJRlRfSklTWDAyMTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvU0pJUy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1NKSVMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiODU2YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1NKSVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVC42MS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1QuNjEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMyYTBkNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1QuNjEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVENWTjU3MTItMS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1RDVk41NzEyLTEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5ODYzMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1RDVk41NzEyLTEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVElTLTYyMC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1RJUy02MjAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwZGNmMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1RJUy02MjAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVFNDSUkuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9UU0NJSS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWM3ZTRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVFNDSUkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVUhDLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVUhDLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Zjg0MjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9VSEMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVU5JQ09ERS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1VOSUNPREUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzN2Q1MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1VOSUNPREUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVVRGLTE2LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVVRGLTE2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjNkMzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9VVEYtMTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVVRGLTMyLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVVRGLTMyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NTYzZGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9VVEYtMzIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVVRGLTcuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9VVEYtNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzhjYjNiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVVRGLTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVklTQ0lJLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVklTQ0lJLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNTAyNTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9WSVNDSUkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvZ2NvbnYtbW9kdWxlcyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2djb252LW1vZHVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4NzA5NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2djb252LW1vZHVsZXMKQEAgLTAsMCArMSwxOTcxIEBACisjIEdOVSBsaWJjIGljb252IGNvbmZpZ3VyYXRpb24uCisjIENvcHlyaWdodCAoQykgMTk5Ny0yMDA1LCAyMDA3LCAyMDA4LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworIyBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorIyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorIyAwMjExMS0xMzA3IFVTQS4KKworIyBBbGwgbGluZXMgY29udGFpbiB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgorCisjIElmIHRoZSBsaW5lcyBzdGFydCB3aXRoIGBtb2R1bGUnCisjICBmcm9tc2V0OgllaXRoZXIgYSBuYW1lIHRyaXBsZSBvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0cmlwbGUuCisjICB0b3NldDoJYSBuYW1lIHRyaXBsZSBvciBhbiBleHByZXNzaW9uIHdpdGggXE4gdG8gZ2V0IHJlZ3VsYXIKKyMJCWV4cHJlc3Npb24gbWF0Y2hpbmcgcmVzdWx0cy4KKyMgIGZpbGVuYW1lOglmaWxlbmFtZSBvZiB0aGUgbW9kdWxlIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtYXRpb24uCisjCQlJZiBpdCBpcyBub3QgYWJzb2x1dGUgdGhlIHBhdGggaXMgbWFkZSBhYnNvbHV0ZSBieSBwcmVwZW5kaW5nCisjCQl0aGUgZGlyZWN0b3J5IHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgZm91bmQgaW4uCisjICBjb3N0OglvcHRpb25hbCBjb3N0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbi4gIERlZmF1bHQgaXMgMS4KKworIyBJZiB0aGUgbGluZXMgc3RhcnQgd2l0aCBgYWxpYXMnCisjICBhbGlhczoJYWxpYXMgbmFtZSB3aGljaCBpcyBub3QgcmVhbGx5IHJlY29nbml6ZWQuCisjICBuYW1lOgl0aGUgcmVhbCBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgc2V0CisKK2FsaWFzCUlTTy1JUi00Ly8JCUJTXzQ3MzAvLworYWxpYXMJSVNPNjQ2LUdCLy8JCUJTXzQ3MzAvLworYWxpYXMJR0IvLwkJCUJTXzQ3MzAvLworYWxpYXMJVUsvLwkJCUJTXzQ3MzAvLworYWxpYXMJQ1NJU080VU5JVEVES0lOR0RPTS8vCUJTXzQ3MzAvLworbW9kdWxlCUJTXzQ3MzAvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlCU180NzMwLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTIxLy8JCUNTQV9aMjQzLjQtMTk4NS0xLy8KK2FsaWFzCUlTTzY0Ni1DQS8vCQlDU0FfWjI0My40LTE5ODUtMS8vCithbGlhcwlDU0E3LTEvLwkJQ1NBX1oyNDMuNC0xOTg1LTEvLworYWxpYXMJQ0EvLwkJCUNTQV9aMjQzLjQtMTk4NS0xLy8KK2FsaWFzCUNTSVNPMTIxQ0FOQURJQU4xLy8JQ1NBX1oyNDMuNC0xOTg1LTEvLworYWxpYXMJQ1NBX1oyNDMuNDE5ODUxLy8JQ1NBX1oyNDMuNC0xOTg1LTEvLworbW9kdWxlCUNTQV9aMjQzLjQtMTk4NS0xLy8JSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlDU0FfWjI0My40LTE5ODUtMS8vCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTIyLy8JCUNTQV9aMjQzLjQtMTk4NS0yLy8KK2FsaWFzCUlTTzY0Ni1DQTIvLwkJQ1NBX1oyNDMuNC0xOTg1LTIvLworYWxpYXMJQ1NBNy0yLy8JCUNTQV9aMjQzLjQtMTk4NS0yLy8KK2FsaWFzCUNTSVNPMTIyQ0FOQURJQU4yLy8JQ1NBX1oyNDMuNC0xOTg1LTIvLworYWxpYXMJQ1NBX1oyNDMuNDE5ODUyLy8JQ1NBX1oyNDMuNC0xOTg1LTIvLworbW9kdWxlCUNTQV9aMjQzLjQtMTk4NS0yLy8JSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlDU0FfWjI0My40LTE5ODUtMi8vCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMjEvLwkJRElOXzY2MDAzLy8KK2FsaWFzCURFLy8JCQlESU5fNjYwMDMvLworYWxpYXMJSVNPNjQ2LURFLy8JCURJTl82NjAwMy8vCithbGlhcwlDU0lTTzIxR0VSTUFOLy8JCURJTl82NjAwMy8vCittb2R1bGUJRElOXzY2MDAzLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJRElOXzY2MDAzLy8JCUlTTzY0NgkJMgorCithbGlhcwlEUzIwODkvLwkJRFNfMjA4OS8vCithbGlhcwlJU082NDYtREsvLwkJRFNfMjA4OS8vCithbGlhcwlESy8vCQkJRFNfMjA4OS8vCithbGlhcwlDU0lTTzY0NkRBTklTSC8vCURTXzIwODkvLworbW9kdWxlCURTXzIwODkvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlEU18yMDg5Ly8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTcvLwkJRVMvLworYWxpYXMJSVNPNjQ2LUVTLy8JCUVTLy8KK2FsaWFzCUNTSVNPMTdTUEFOSVNILy8JRVMvLworbW9kdWxlCUVTLy8JCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUVTLy8JCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTg1Ly8JCUVTMi8vCithbGlhcwlJU082NDYtRVMyLy8JCUVTMi8vCithbGlhcwlDU0lTTzg1U1BBTklTSDIvLwlFUzIvLworbW9kdWxlCUVTMi8vCQkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlFUzIvLwkJCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItNTcvLwkJR0JfMTk4OC04MC8vCithbGlhcwlDTi8vCQkJR0JfMTk4OC04MC8vCithbGlhcwlJU082NDYtQ04vLwkJR0JfMTk4OC04MC8vCithbGlhcwlDU0lTTzU4R0IxOTg4Ly8JCUdCXzE5ODgtODAvLworYWxpYXMJR0JfMTk4ODgwLy8JCUdCXzE5ODgtODAvLworbW9kdWxlCUdCXzE5ODgtODAvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlHQl8xOTg4LTgwLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTUvLwkJSVQvLworYWxpYXMJSVNPNjQ2LUlULy8JCUlULy8KK2FsaWFzCUNTSVNPMTVJVEFMSUFOLy8JSVQvLworbW9kdWxlCUlULy8JCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUlULy8JCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTE0Ly8JCUpJU19DNjIyMC0xOTY5LVJPLy8KK2FsaWFzCUpQLy8JCQlKSVNfQzYyMjAtMTk2OS1STy8vCithbGlhcwlJU082NDYtSlAvLwkJSklTX0M2MjIwLTE5NjktUk8vLworYWxpYXMJQ1NJU08xNEpJU0M2MjIwUk8vLwlKSVNfQzYyMjAtMTk2OS1STy8vCithbGlhcwlKSVNfQzYyMjAxOTY5Uk8vLwlKSVNfQzYyMjAtMTk2OS1STy8vCittb2R1bGUJSklTX0M2MjIwLTE5NjktUk8vLwlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUpJU19DNjIyMC0xOTY5LVJPLy8JSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi05Mi8vCQlKSVNfQzYyMjktMTk4NC1CLy8KK2FsaWFzCUlTTzY0Ni1KUC1PQ1ItQi8vCUpJU19DNjIyOS0xOTg0LUIvLworYWxpYXMJSlAtT0NSLUIvLwkJSklTX0M2MjI5LTE5ODQtQi8vCithbGlhcwlDU0lTTzkySklTQzYyOTkxOTg0Qi8vCUpJU19DNjIyOS0xOTg0LUIvLworYWxpYXMJSklTX0M2MjI5MTk4NEIvLwlKSVNfQzYyMjktMTk4NC1CLy8KK21vZHVsZQlKSVNfQzYyMjktMTk4NC1CLy8JSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlKSVNfQzYyMjktMTk4NC1CLy8JSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0xNDEvLwkJSlVTX0kuQjEuMDAyLy8KK2FsaWFzCUlTTzY0Ni1ZVS8vCQlKVVNfSS5CMS4wMDIvLworYWxpYXMJSlMvLwkJCUpVU19JLkIxLjAwMi8vCithbGlhcwlZVS8vCQkJSlVTX0kuQjEuMDAyLy8KK2FsaWFzCUNTSVNPMTQxSlVTSUIxMDAyLy8JSlVTX0kuQjEuMDAyLy8KK21vZHVsZQlKVVNfSS5CMS4wMDIvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlKVVNfSS5CMS4wMDIvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTzY0Ni1LUi8vCQlLU0M1NjM2Ly8KK2FsaWFzCUNTS1NDNTYzNi8vCQlLU0M1NjM2Ly8KK21vZHVsZQlLU0M1NjM2Ly8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJS1NDNTYzNi8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTg2Ly8JCU1TWl83Nzk1LjMvLworYWxpYXMJSVNPNjQ2LUhVLy8JCU1TWl83Nzk1LjMvLworYWxpYXMJSFUvLwkJCU1TWl83Nzk1LjMvLworYWxpYXMJQ1NJU084NkhVTkdBUklBTi8vCU1TWl83Nzk1LjMvLworbW9kdWxlCU1TWl83Nzk1LjMvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlNU1pfNzc5NS4zLy8JCUlTTzY0NgkJMgorCithbGlhcwlDVUJBLy8JCQlOQ19OQzAwLTEwLy8KK2FsaWFzCU5DX05DMDAtMTA6ODEvLwkJTkNfTkMwMC0xMC8vCithbGlhcwlJU08tSVItMTUxLy8JCU5DX05DMDAtMTAvLworYWxpYXMJSVNPNjQ2LUNVLy8JCU5DX05DMDAtMTAvLworYWxpYXMJQ1NJU08xNTFDVUJBLy8JCU5DX05DMDAtMTAvLworYWxpYXMJTkNfTkMwMDEwLy8JCU5DX05DMDAtMTAvLworbW9kdWxlCU5DX05DMDAtMTAvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlOQ19OQzAwLTEwLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItNjkvLwkJTkZfWl82Mi0wMTAvLworYWxpYXMJSVNPNjQ2LUZSLy8JCU5GX1pfNjItMDEwLy8KK2FsaWFzCUZSLy8JCQlORl9aXzYyLTAxMC8vCithbGlhcwlDU0lTTzY5RlJFTkNILy8JCU5GX1pfNjItMDEwLy8KK2FsaWFzCU5GX1pfNjIwMTAvLwkJTkZfWl82Mi0wMTAvLworbW9kdWxlCU5GX1pfNjItMDEwLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJTkZfWl82Mi0wMTAvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0yNS8vCQlORl9aXzYyLTAxMF8xOTczLy8KK2FsaWFzCUlTTzY0Ni1GUjEvLwkJTkZfWl82Mi0wMTBfMTk3My8vCithbGlhcwlORl9aXzYyLTAxMF8oMTk3MykvLwlORl9aXzYyLTAxMF8xOTczLy8KK2FsaWFzCUNTSVNPMjVGUkVOQ0gvLwkJTkZfWl82Mi0wMTBfMTk3My8vCithbGlhcwlORl9aXzYyMDEwXzE5NzMvLwlORl9aXzYyLTAxMF8xOTczLy8KK21vZHVsZQlORl9aXzYyLTAxMF8xOTczLy8JSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlORl9aXzYyLTAxMF8xOTczLy8JSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi02MC8vCQlOU180NTUxLTEvLworYWxpYXMJSVNPNjQ2LU5PLy8JCU5TXzQ1NTEtMS8vCithbGlhcwlOTy8vCQkJTlNfNDU1MS0xLy8KK2FsaWFzCUNTSVNPNjBEQU5JU0hOT1JXRUdJQU4vLyBOU180NTUxLTEvLworYWxpYXMJQ1NJU082ME5PUldFR0lBTjEvLwlOU180NTUxLTEvLworYWxpYXMJTlNfNDU1MTEvLwkJTlNfNDU1MS0xLy8KK21vZHVsZQlOU180NTUxLTEvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlOU180NTUxLTEvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTzY0Ni1OTzIvLwkJTlNfNDU1MS0yLy8KK2FsaWFzCUlTTy1JUi02MS8vCQlOU180NTUxLTIvLworYWxpYXMJTk8yLy8JCQlOU180NTUxLTIvLworYWxpYXMJQ1NJU082MU5PUldFR0lBTjIvLwlOU180NTUxLTIvLworYWxpYXMJTlNfNDU1MTIvLwkJTlNfNDU1MS0yLy8KK21vZHVsZQlOU180NTUxLTIvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlOU180NTUxLTIvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0xNi8vCQlQVC8vCithbGlhcwlJU082NDYtUFQvLwkJUFQvLworYWxpYXMJQ1NJU08xNlBPUlRVR0VTRS8vCVBULy8KK21vZHVsZQlQVC8vCQkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlQVC8vCQkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi04NC8vCQlQVDIvLworYWxpYXMJSVNPNjQ2LVBUMi8vCQlQVDIvLworYWxpYXMJQ1NJU084NFBPUlRVR1VFU0UyLy8JUFQyLy8KK21vZHVsZQlQVDIvLwkJCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJUFQyLy8JCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTEwLy8JCVNFTl84NTAyMDBfQi8vCithbGlhcwlGSS8vCQkJU0VOXzg1MDIwMF9CLy8KK2FsaWFzCUlTTzY0Ni1GSS8vCQlTRU5fODUwMjAwX0IvLworYWxpYXMJSVNPNjQ2LVNFLy8JCVNFTl84NTAyMDBfQi8vCithbGlhcwlTRS8vCQkJU0VOXzg1MDIwMF9CLy8KK2FsaWFzCUNTSVNPMTBTV0VESVNILy8JU0VOXzg1MDIwMF9CLy8KK2FsaWFzCVNTNjM2MTI3Ly8JCVNFTl84NTAyMDBfQi8vCittb2R1bGUJU0VOXzg1MDIwMF9CLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJU0VOXzg1MDIwMF9CLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTEvLwkJU0VOXzg1MDIwMF9DLy8KK2FsaWFzCUlTTzY0Ni1TRTIvLwkJU0VOXzg1MDIwMF9DLy8KK2FsaWFzCVNFMi8vCQkJU0VOXzg1MDIwMF9DLy8KK2FsaWFzCUNTSVNPMTFTV0VESVNIRk9STkFNRVMvLyBTRU5fODUwMjAwX0MvLworbW9kdWxlCVNFTl84NTAyMDBfQy8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCVNFTl84NTAyMDBfQy8vCQlJU082NDYJCTIKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMDAvLwkJSVNPLTg4NTktMS8vCithbGlhcwlJU09fODg1OS0xOjE5ODcvLwlJU08tODg1OS0xLy8KK2FsaWFzCUlTT184ODU5LTEvLwkJSVNPLTg4NTktMS8vCithbGlhcwlJU084ODU5LTEvLwkJSVNPLTg4NTktMS8vCithbGlhcwlJU084ODU5MS8vCQlJU08tODg1OS0xLy8KK2FsaWFzCUxBVElOMS8vCQlJU08tODg1OS0xLy8KK2FsaWFzCUwxLy8JCQlJU08tODg1OS0xLy8KK2FsaWFzCUlCTTgxOS8vCQlJU08tODg1OS0xLy8KK2FsaWFzCUNQODE5Ly8JCQlJU08tODg1OS0xLy8KK2FsaWFzCUNTSVNPTEFUSU4xLy8JCUlTTy04ODU5LTEvLworYWxpYXMJODg1OV8xLy8JCUlTTy04ODU5LTEvLworYWxpYXMJT1NGMDAwMTAwMDEvLwkJSVNPLTg4NTktMS8vCittb2R1bGUJSVNPLTg4NTktMS8vCQlJTlRFUk5BTAkJSVNPODg1OS0xCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMS8vCQlJU084ODU5LTEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTEwMS8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUlTT184ODU5LTI6MTk4Ny8vCUlTTy04ODU5LTIvLworYWxpYXMJSVNPXzg4NTktMi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUlTTzg4NTktMi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUlTTzg4NTkyLy8JCUlTTy04ODU5LTIvLworYWxpYXMJTEFUSU4yLy8JCUlTTy04ODU5LTIvLworYWxpYXMJTDIvLwkJCUlTTy04ODU5LTIvLworYWxpYXMJQ1NJU09MQVRJTjIvLwkJSVNPLTg4NTktMi8vCithbGlhcwk4ODU5XzIvLwkJSVNPLTg4NTktMi8vCithbGlhcwlPU0YwMDAxMDAwMi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUlCTTkxMi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUNQOTEyLy8JCQlJU08tODg1OS0yLy8KK21vZHVsZQlJU08tODg1OS0yLy8JCUlOVEVSTkFMCQlJU084ODU5LTIJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS0yLy8JCUlTTzg4NTktMgkxCisKKyMJZnJvbQkJCXRvCQkJIG1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTEwOS8vCQlJU08tODg1OS0zLy8KK2FsaWFzCUlTT184ODU5LTM6MTk4OC8vCUlTTy04ODU5LTMvLworYWxpYXMJSVNPXzg4NTktMy8vCQlJU08tODg1OS0zLy8KK2FsaWFzCUlTTzg4NTktMy8vCQlJU08tODg1OS0zLy8KK2FsaWFzCUlTTzg4NTkzLy8JCUlTTy04ODU5LTMvLworYWxpYXMJTEFUSU4zLy8JCUlTTy04ODU5LTMvLworYWxpYXMJTDMvLwkJCUlTTy04ODU5LTMvLworYWxpYXMJQ1NJU09MQVRJTjMvLwkJSVNPLTg4NTktMy8vCithbGlhcwk4ODU5XzMvLwkJSVNPLTg4NTktMy8vCithbGlhcwlPU0YwMDAxMDAwMy8vCQlJU08tODg1OS0zLy8KK21vZHVsZQlJU08tODg1OS0zLy8JCUlOVEVSTkFMCQlJU084ODU5LTMJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS0zLy8JCUlTTzg4NTktMwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTEwLy8JCUlTTy04ODU5LTQvLworYWxpYXMJSVNPXzg4NTktNDoxOTg4Ly8JSVNPLTg4NTktNC8vCithbGlhcwlJU09fODg1OS00Ly8JCUlTTy04ODU5LTQvLworYWxpYXMJSVNPODg1OS00Ly8JCUlTTy04ODU5LTQvLworYWxpYXMJSVNPODg1OTQvLwkJSVNPLTg4NTktNC8vCithbGlhcwlMQVRJTjQvLwkJSVNPLTg4NTktNC8vCithbGlhcwlMNC8vCQkJSVNPLTg4NTktNC8vCithbGlhcwlDU0lTT0xBVElONC8vCQlJU08tODg1OS00Ly8KK2FsaWFzCTg4NTlfNC8vCQlJU08tODg1OS00Ly8KK2FsaWFzCU9TRjAwMDEwMDA0Ly8JCUlTTy04ODU5LTQvLworbW9kdWxlCUlTTy04ODU5LTQvLwkJSU5URVJOQUwJCUlTTzg4NTktNAkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTQvLwkJSVNPODg1OS00CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xNDQvLwkJSVNPLTg4NTktNS8vCithbGlhcwlJU09fODg1OS01OjE5ODgvLwlJU08tODg1OS01Ly8KK2FsaWFzCUlTT184ODU5LTUvLwkJSVNPLTg4NTktNS8vCithbGlhcwlJU084ODU5LTUvLwkJSVNPLTg4NTktNS8vCithbGlhcwlJU084ODU5NS8vCQlJU08tODg1OS01Ly8KK2FsaWFzCUNZUklMTElDLy8JCUlTTy04ODU5LTUvLworYWxpYXMJQ1NJU09MQVRJTkNZUklMTElDLy8JSVNPLTg4NTktNS8vCithbGlhcwk4ODU5XzUvLwkJSVNPLTg4NTktNS8vCithbGlhcwlPU0YwMDAxMDAwNS8vCQlJU08tODg1OS01Ly8KK2FsaWFzCUlCTTkxNS8vCQlJU08tODg1OS01Ly8KK2FsaWFzCUNQOTE1Ly8JCQlJU08tODg1OS01Ly8KK21vZHVsZQlJU08tODg1OS01Ly8JCUlOVEVSTkFMCQlJU084ODU5LTUJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS01Ly8JCUlTTzg4NTktNQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTI3Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJSVNPXzg4NTktNjoxOTg3Ly8JSVNPLTg4NTktNi8vCithbGlhcwlJU09fODg1OS02Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJSVNPODg1OS02Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJSVNPODg1OTYvLwkJSVNPLTg4NTktNi8vCithbGlhcwlFQ01BLTExNC8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUFTTU8tNzA4Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJQVJBQklDLy8JCUlTTy04ODU5LTYvLworYWxpYXMJQ1NJU09MQVRJTkFSQUJJQy8vCUlTTy04ODU5LTYvLworYWxpYXMJODg1OV82Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJT1NGMDAwMTAwMDYvLwkJSVNPLTg4NTktNi8vCithbGlhcwlJQk0xMDg5Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJQ1AxMDg5Ly8JCUlTTy04ODU5LTYvLworbW9kdWxlCUlTTy04ODU5LTYvLwkJSU5URVJOQUwJCUlTTzg4NTktNgkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTYvLwkJSVNPODg1OS02CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMjYvLwkJSVNPLTg4NTktNy8vCithbGlhcwlJU09fODg1OS03OjIwMDMvLwlJU08tODg1OS03Ly8KK2FsaWFzCUlTT184ODU5LTc6MTk4Ny8vCUlTTy04ODU5LTcvLworYWxpYXMJSVNPXzg4NTktNy8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUlTTzg4NTktNy8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUlTTzg4NTk3Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJRUxPVF85MjgvLwkJSVNPLTg4NTktNy8vCithbGlhcwlFQ01BLTExOC8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUdSRUVLLy8JCQlJU08tODg1OS03Ly8KK2FsaWFzCUdSRUVLOC8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUNTSVNPTEFUSU5HUkVFSy8vCUlTTy04ODU5LTcvLworYWxpYXMJODg1OV83Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJT1NGMDAwMTAwMDcvLwkJSVNPLTg4NTktNy8vCithbGlhcwlJQk04MTMvLwkJSVNPLTg4NTktNy8vCithbGlhcwlDUDgxMy8vCQkJSVNPLTg4NTktNy8vCittb2R1bGUJSVNPLTg4NTktNy8vCQlJTlRFUk5BTAkJSVNPODg1OS03CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktNy8vCQlJU084ODU5LTcJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTEzOC8vCQlJU08tODg1OS04Ly8KK2FsaWFzCUlTT184ODU5LTg6MTk4OC8vCUlTTy04ODU5LTgvLworYWxpYXMJSVNPXzg4NTktOC8vCQlJU08tODg1OS04Ly8KK2FsaWFzCUlTTzg4NTktOC8vCQlJU08tODg1OS04Ly8KK2FsaWFzCUlTTzg4NTk4Ly8JCUlTTy04ODU5LTgvLworYWxpYXMJSEVCUkVXLy8JCUlTTy04ODU5LTgvLworYWxpYXMJQ1NJU09MQVRJTkhFQlJFVy8vCUlTTy04ODU5LTgvLworYWxpYXMJODg1OV84Ly8JCUlTTy04ODU5LTgvLworYWxpYXMJT1NGMDAwMTAwMDgvLwkJSVNPLTg4NTktOC8vCithbGlhcwlJQk05MTYvLwkJSVNPLTg4NTktOC8vCithbGlhcwlDUDkxNi8vCQkJSVNPLTg4NTktOC8vCittb2R1bGUJSVNPLTg4NTktOC8vCQlJTlRFUk5BTAkJSVNPODg1OS04CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktOC8vCQlJU084ODU5LTgJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE0OC8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUlTT184ODU5LTk6MTk4OS8vCUlTTy04ODU5LTkvLworYWxpYXMJSVNPXzg4NTktOS8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUlTTzg4NTktOS8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUlTTzg4NTk5Ly8JCUlTTy04ODU5LTkvLworYWxpYXMJTEFUSU41Ly8JCUlTTy04ODU5LTkvLworYWxpYXMJTDUvLwkJCUlTTy04ODU5LTkvLworYWxpYXMJQ1NJU09MQVRJTjUvLwkJSVNPLTg4NTktOS8vCithbGlhcwk4ODU5XzkvLwkJSVNPLTg4NTktOS8vCithbGlhcwlPU0YwMDAxMDAwOS8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUlCTTkyMC8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUNQOTIwLy8JCQlJU08tODg1OS05Ly8KK2FsaWFzCVRTLTU4ODEvLwkJSVNPLTg4NTktOS8vCithbGlhcwlFQ01BLTEyOC8vCQlJU08tODg1OS05Ly8KK21vZHVsZQlJU08tODg1OS05Ly8JCUlOVEVSTkFMCQlJU084ODU5LTkJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS05Ly8JCUlTTzg4NTktOQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTU3Ly8JCUlTTy04ODU5LTEwLy8KK2FsaWFzCUlTT184ODU5LTEwOjE5OTIvLwlJU08tODg1OS0xMC8vCithbGlhcwlJU09fODg1OS0xMC8vCQlJU08tODg1OS0xMC8vCithbGlhcwlJU084ODU5LTEwLy8JCUlTTy04ODU5LTEwLy8KK2FsaWFzCUlTTzg4NTkxMC8vCQlJU08tODg1OS0xMC8vCithbGlhcwlMQVRJTjYvLwkJSVNPLTg4NTktMTAvLworYWxpYXMJTDYvLwkJCUlTTy04ODU5LTEwLy8KK2FsaWFzCUNTSVNPTEFUSU42Ly8JCUlTTy04ODU5LTEwLy8KK2FsaWFzCU9TRjAwMDEwMDBBLy8JCUlTTy04ODU5LTEwLy8KK21vZHVsZQlJU08tODg1OS0xMC8vCQlJTlRFUk5BTAkJSVNPODg1OS0xMAkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTEwLy8JCUlTTzg4NTktMTAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPODg1OS0xMS8vCQlJU08tODg1OS0xMS8vCithbGlhcwlJU084ODU5MTEvLwkJSVNPLTg4NTktMTEvLworbW9kdWxlCUlTTy04ODU5LTExLy8JCUlOVEVSTkFMCQlJU084ODU5LTExCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMTEvLwkJSVNPODg1OS0xMQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU084ODU5LTEzLy8JCUlTTy04ODU5LTEzLy8KK2FsaWFzCUlTTzg4NTkxMy8vCQlJU08tODg1OS0xMy8vCithbGlhcwlJU08tSVItMTc5Ly8JCUlTTy04ODU5LTEzLy8KK2FsaWFzCUxBVElONy8vCQlJU08tODg1OS0xMy8vCithbGlhcwlMNy8vCQkJSVNPLTg4NTktMTMvLworYWxpYXMJQkFMVElDLy8JCUlTTy04ODU5LTEzLy8KK21vZHVsZQlJU08tODg1OS0xMy8vCQlJTlRFUk5BTAkJSVNPODg1OS0xMwkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTEzLy8JCUlTTzg4NTktMTMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPODg1OS0xNC8vCQlJU08tODg1OS0xNC8vCithbGlhcwlJU084ODU5MTQvLwkJSVNPLTg4NTktMTQvLworYWxpYXMJSVNPLUlSLTE5OS8vCQlJU08tODg1OS0xNC8vCithbGlhcwlMQVRJTjgvLwkJSVNPLTg4NTktMTQvLworYWxpYXMJTDgvLwkJCUlTTy04ODU5LTE0Ly8KK2FsaWFzCUlTT184ODU5LTE0OjE5OTgvLwlJU08tODg1OS0xNC8vCithbGlhcwlJU09fODg1OS0xNC8vCQlJU08tODg1OS0xNC8vCithbGlhcwlJU08tQ0VMVElDLy8JCUlTTy04ODU5LTE0Ly8KK21vZHVsZQlJU08tODg1OS0xNC8vCQlJTlRFUk5BTAkJSVNPODg1OS0xNAkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTE0Ly8JCUlTTzg4NTktMTQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPODg1OS0xNS8vCQlJU08tODg1OS0xNS8vCithbGlhcwlJU084ODU5MTUvLwkJSVNPLTg4NTktMTUvLworYWxpYXMJSVNPLUlSLTIwMy8vCQlJU08tODg1OS0xNS8vCithbGlhcwlJU09fODg1OS0xNS8vCQlJU08tODg1OS0xNS8vCithbGlhcwlMQVRJTi05Ly8JCUlTTy04ODU5LTE1Ly8KK2FsaWFzCUxBVElOOS8vCQlJU08tODg1OS0xNS8vCithbGlhcwlJU09fODg1OS0xNToxOTk4Ly8JSVNPLTg4NTktMTUvLworbW9kdWxlCUlTTy04ODU5LTE1Ly8JCUlOVEVSTkFMCQlJU084ODU5LTE1CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMTUvLwkJSVNPODg1OS0xNQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU084ODU5LTE2Ly8JCUlTTy04ODU5LTE2Ly8KK2FsaWFzCUlTTzg4NTkxNi8vCQlJU08tODg1OS0xNi8vCithbGlhcwlJU08tSVItMjI2Ly8JCUlTTy04ODU5LTE2Ly8KK2FsaWFzCUxBVElOMTAvLwkJSVNPLTg4NTktMTYvLworYWxpYXMJTDEwLy8JCQlJU08tODg1OS0xNi8vCithbGlhcwlJU09fODg1OS0xNjoyMDAxLy8JSVNPLTg4NTktMTYvLworYWxpYXMJSVNPXzg4NTktMTYvLwkJSVNPLTg4NTktMTYvLworbW9kdWxlCUlTTy04ODU5LTE2Ly8JCUlOVEVSTkFMCQlJU084ODU5LTE2CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMTYvLwkJSVNPODg1OS0xNgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlULjYxLy8JCQlULjYxLThCSVQvLworYWxpYXMJSVNPLUlSLTEwMy8vCQlULjYxLThCSVQvLworYWxpYXMJQ1NJU08xMDNUNjE4QklULy8JVC42MS04QklULy8KK2FsaWFzCVQuNjE4QklULy8JCVQuNjEtOEJJVC8vCittb2R1bGUJVC42MS04QklULy8JCUlOVEVSTkFMCQlULjYxCQkxCittb2R1bGUJSU5URVJOQUwJCVQuNjEtOEJJVC8vCQlULjYxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTU2Ly8JCUlTT182OTM3Ly8KK2FsaWFzCUlTT182OTM3OjE5OTIvLwkJSVNPXzY5MzcvLworYWxpYXMJSVNPNjkzNy8vCQlJU09fNjkzNy8vCittb2R1bGUJSVNPXzY5MzcvLwkJSU5URVJOQUwJCUlTT182OTM3CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzY5MzcvLwkJSVNPXzY5MzcJMQorCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItOTAvLwkJSVNPXzY5MzctMi8vCithbGlhcwlJU09fNjkzNy0yOjE5ODMvLwlJU09fNjkzNy0yLy8KK2FsaWFzCUNTSVNPOTAvLwkJSVNPXzY5MzctMi8vCithbGlhcwlJU09fNjkzNzIvLwkJSVNPXzY5MzctMi8vCittb2R1bGUJSVNPXzY5MzctMi8vCQlJTlRFUk5BTAkJSVNPXzY5MzctMgkxCittb2R1bGUJSU5URVJOQUwJCUlTT182OTM3LTIvLwkJSVNPXzY5MzctMgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlTSElGVC1KSVMvLwkJU0pJUy8vCithbGlhcwlTSElGVF9KSVMvLwkJU0pJUy8vCithbGlhcwlNU19LQU5KSS8vCQlTSklTLy8KK2FsaWFzCUNTU0hJRlRKSVMvLwkJU0pJUy8vCittb2R1bGUJU0pJUy8vCQkJSU5URVJOQUwJCVNKSVMJCTEKK21vZHVsZQlJTlRFUk5BTAkJU0pJUy8vCQkJU0pJUwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJV0lORE9XUy0zMUovLwkJQ1A5MzIvLworYWxpYXMJTVM5MzIvLwkJCUNQOTMyLy8KK2FsaWFzCVNKSVMtT1BFTi8vCQlDUDkzMi8vCithbGlhcwlTSklTLVdJTi8vCQlDUDkzMi8vCithbGlhcwlDU1dJTkRPV1MzMUovLwkJQ1A5MzIvLworbW9kdWxlCUNQOTMyLy8JCQlJTlRFUk5BTAkJQ1A5MzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1A5MzIvLwkJCUNQOTMyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlLT0k4Ly8JCQlLT0ktOC8vCittb2R1bGUJS09JLTgvLwkJCUlOVEVSTkFMCQlLT0ktOAkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0ktOC8vCQkJS09JLTgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTS09JOFIvLwkJS09JOC1SLy8KK2FsaWFzCUtPSThSLy8JCQlLT0k4LVIvLworbW9kdWxlCUtPSTgtUi8vCQlJTlRFUk5BTAkJS09JOC1SCQkxCittb2R1bGUJSU5URVJOQUwJCUtPSTgtUi8vCQlLT0k4LVIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xOS8vCQlMQVRJTi1HUkVFSy8vCithbGlhcwlDU0lTTzE5TEFUSU5HUkVFSy8vCUxBVElOLUdSRUVLLy8KK2FsaWFzCUxBVElOR1JFRUsvLwkJTEFUSU4tR1JFRUsvLworbW9kdWxlCUxBVElOLUdSRUVLLy8JCUlOVEVSTkFMCQlMQVRJTi1HUkVFSwkxCittb2R1bGUJSU5URVJOQUwJCUxBVElOLUdSRUVLLy8JCUxBVElOLUdSRUVLCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0yNy8vCQlMQVRJTi1HUkVFSy0xLy8KK2FsaWFzCUNTSVNPMjdMQVRJTkdSRUVLMS8vCUxBVElOLUdSRUVLLTEvLworYWxpYXMJTEFUSU5HUkVFSzEvLwkJTEFUSU4tR1JFRUstMS8vCittb2R1bGUJTEFUSU4tR1JFRUstMS8vCQlJTlRFUk5BTAkJTEFUSU4tR1JFRUstMQkxCittb2R1bGUJSU5URVJOQUwJCUxBVElOLUdSRUVLLTEvLwkJTEFUSU4tR1JFRUstMQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlST01BTjgvLwkJSFAtUk9NQU44Ly8KK2FsaWFzCVI4Ly8JCQlIUC1ST01BTjgvLworYWxpYXMJQ1NIUFJPTUFOOC8vCQlIUC1ST01BTjgvLworYWxpYXMJT1NGMTAwMTAwMDEvLwkJSFAtUk9NQU44Ly8KK2FsaWFzCUhQUk9NQU44Ly8JCUhQLVJPTUFOOC8vCittb2R1bGUJSFAtUk9NQU44Ly8JCUlOVEVSTkFMCQlIUC1ST01BTjgJMQorbW9kdWxlCUlOVEVSTkFMCQlIUC1ST01BTjgvLwkJSFAtUk9NQU44CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDQVRERS8vCQlFQkNESUMtQVQtREUvLworYWxpYXMJRUJDRElDQVRERS8vCQlFQkNESUMtQVQtREUvLworbW9kdWxlCUVCQ0RJQy1BVC1ERS8vCQlJTlRFUk5BTAkJRUJDRElDLUFULURFCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLUFULURFLy8JCUVCQ0RJQy1BVC1ERQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0FUREVBLy8JCUVCQ0RJQy1BVC1ERS1BLy8KK2FsaWFzCUVCQ0RJQ0FUREVBLy8JCUVCQ0RJQy1BVC1ERS1BLy8KK21vZHVsZQlFQkNESUMtQVQtREUtQS8vCUlOVEVSTkFMCQlFQkNESUMtQVQtREUtQQkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1BVC1ERS1BLy8JRUJDRElDLUFULURFLUEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNDQUZSLy8JCUVCQ0RJQy1DQS1GUi8vCithbGlhcwlFQkNESUNDQUZSLy8JCUVCQ0RJQy1DQS1GUi8vCittb2R1bGUJRUJDRElDLUNBLUZSLy8JCUlOVEVSTkFMCQlFQkNESUMtQ0EtRlIJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtQ0EtRlIvLwkJRUJDRElDLUNBLUZSCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDREtOTy8vCQlFQkNESUMtREstTk8vLworYWxpYXMJRUJDRElDREtOTy8vCQlFQkNESUMtREstTk8vLworbW9kdWxlCUVCQ0RJQy1ESy1OTy8vCQlJTlRFUk5BTAkJRUJDRElDLURLLU5PCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLURLLU5PLy8JCUVCQ0RJQy1ESy1OTwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0RLTk9BLy8JCUVCQ0RJQy1ESy1OTy1BLy8KK2FsaWFzCUVCQ0RJQ0RLTk9BLy8JCUVCQ0RJQy1ESy1OTy1BLy8KK21vZHVsZQlFQkNESUMtREstTk8tQS8vCUlOVEVSTkFMCQlFQkNESUMtREstTk8tQQkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1ESy1OTy1BLy8JRUJDRElDLURLLU5PLUEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNFUy8vCQlFQkNESUMtRVMvLworYWxpYXMJRUJDRElDRVMvLwkJRUJDRElDLUVTLy8KK21vZHVsZQlFQkNESUMtRVMvLwkJSU5URVJOQUwJCUVCQ0RJQy1FUwkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1FUy8vCQlFQkNESUMtRVMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNFU0EvLwkJRUJDRElDLUVTLUEvLworYWxpYXMJRUJDRElDRVNBLy8JCUVCQ0RJQy1FUy1BLy8KK21vZHVsZQlFQkNESUMtRVMtQS8vCQlJTlRFUk5BTAkJRUJDRElDLUVTLUEJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRVMtQS8vCQlFQkNESUMtRVMtQQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0VTUy8vCQlFQkNESUMtRVMtUy8vCithbGlhcwlFQkNESUNFU1MvLwkJRUJDRElDLUVTLVMvLworbW9kdWxlCUVCQ0RJQy1FUy1TLy8JCUlOVEVSTkFMCQlFQkNESUMtRVMtUwkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1FUy1TLy8JCUVCQ0RJQy1FUy1TCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDRklTRS8vCQlFQkNESUMtRkktU0UvLworYWxpYXMJRUJDRElDRklTRS8vCQlFQkNESUMtRkktU0UvLworbW9kdWxlCUVCQ0RJQy1GSS1TRS8vCQlJTlRFUk5BTAkJRUJDRElDLUZJLVNFCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLUZJLVNFLy8JCUVCQ0RJQy1GSS1TRQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0ZJU0VBLy8JCUVCQ0RJQy1GSS1TRS1BLy8KK2FsaWFzCUVCQ0RJQ0ZJU0VBLy8JCUVCQ0RJQy1GSS1TRS1BLy8KK21vZHVsZQlFQkNESUMtRkktU0UtQS8vCUlOVEVSTkFMCQlFQkNESUMtRkktU0UtQQkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1GSS1TRS1BLy8JRUJDRElDLUZJLVNFLUEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNGUi8vCQlFQkNESUMtRlIvLworYWxpYXMJRUJDRElDRlIvLwkJRUJDRElDLUZSLy8KK21vZHVsZQlFQkNESUMtRlIvLwkJSU5URVJOQUwJCUVCQ0RJQy1GUgkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1GUi8vCQlFQkNESUMtRlIJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRUJDRElDSVNGUklTUy8vCQlFQkNESUMtSVMtRlJJU1MvLworbW9kdWxlCUVCQ0RJQy1JUy1GUklTUy8vCUlOVEVSTkFMCQlFQkNESUMtSVMtRlJJU1MJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtSVMtRlJJU1MvLwlFQkNESUMtSVMtRlJJU1MJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNJVC8vCQlFQkNESUMtSVQvLworYWxpYXMJRUJDRElDSVQvLwkJRUJDRElDLUlULy8KK21vZHVsZQlFQkNESUMtSVQvLwkJSU5URVJOQUwJCUVCQ0RJQy1JVAkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1JVC8vCQlFQkNESUMtSVQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNQVC8vCQlFQkNESUMtUFQvLworYWxpYXMJRUJDRElDUFQvLwkJRUJDRElDLVBULy8KK21vZHVsZQlFQkNESUMtUFQvLwkJSU5URVJOQUwJCUVCQ0RJQy1QVAkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1QVC8vCQlFQkNESUMtUFQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNVSy8vCQlFQkNESUMtVUsvLworYWxpYXMJRUJDRElDVUsvLwkJRUJDRElDLVVLLy8KK21vZHVsZQlFQkNESUMtVUsvLwkJSU5URVJOQUwJCUVCQ0RJQy1VSwkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1VSy8vCQlFQkNESUMtVUsJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNVUy8vCQlFQkNESUMtVVMvLworYWxpYXMJRUJDRElDVVMvLwkJRUJDRElDLVVTLy8KK21vZHVsZQlFQkNESUMtVVMvLwkJSU5URVJOQUwJCUVCQ0RJQy1VUwkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1VUy8vCQlFQkNESUMtVVMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AwMzcvLwkJCUlCTTAzNy8vCithbGlhcwlFQkNESUMtQ1AtVVMvLwkJSUJNMDM3Ly8KK2FsaWFzCUVCQ0RJQy1DUC1DQS8vCQlJQk0wMzcvLworYWxpYXMJRUJDRElDLUNQLVdULy8JCUlCTTAzNy8vCithbGlhcwlFQkNESUMtQ1AtTkwvLwkJSUJNMDM3Ly8KK2FsaWFzCUNTSUJNMDM3Ly8JCUlCTTAzNy8vCithbGlhcwlPU0YxMDAyMDAyNS8vCQlJQk0wMzcvLworYWxpYXMJQ1AxMDcwLy8JCUlCTTAzNy8vCithbGlhcwlDUDI4Mi8vCQkJSUJNMDM3Ly8KK21vZHVsZQlJQk0wMzcvLwkJSU5URVJOQUwJCUlCTTAzNwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0wMzcvLwkJSUJNMDM3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFQkNESUMtSU5ULy8JCUlCTTAzOC8vCithbGlhcwlDUDAzOC8vCQkJSUJNMDM4Ly8KK2FsaWFzCUNTSUJNMDM4Ly8JCUlCTTAzOC8vCittb2R1bGUJSUJNMDM4Ly8JCUlOVEVSTkFMCQlJQk0wMzgJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMDM4Ly8JCUlCTTAzOAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRUJDRElDLUlOVDEvLwkJSUJNMjU2Ly8KK21vZHVsZQlJQk0yNTYvLwkJSU5URVJOQUwJCUlCTTI1NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNTYvLwkJSUJNMjU2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDI3My8vCQkJSUJNMjczLy8KK2FsaWFzCUNTSUJNMjczLy8JCUlCTTI3My8vCithbGlhcwlPU0YxMDAyMDExMS8vCQlJQk0yNzMvLworbW9kdWxlCUlCTTI3My8vCQlJTlRFUk5BTAkJSUJNMjczCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTI3My8vCQlJQk0yNzMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQy1CRS8vCQlJQk0yNzQvLworYWxpYXMJQ1AyNzQvLwkJCUlCTTI3NC8vCithbGlhcwlDU0lCTTI3NC8vCQlJQk0yNzQvLworbW9kdWxlCUlCTTI3NC8vCQlJTlRFUk5BTAkJSUJNMjc0CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTI3NC8vCQlJQk0yNzQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQy1CUi8vCQlJQk0yNzUvLworYWxpYXMJQ1AyNzUvLwkJCUlCTTI3NS8vCithbGlhcwlDU0lCTTI3NS8vCQlJQk0yNzUvLworbW9kdWxlCUlCTTI3NS8vCQlJTlRFUk5BTAkJSUJNMjc1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTI3NS8vCQlJQk0yNzUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQy1DUC1ESy8vCQlJQk0yNzcvLworYWxpYXMJRUJDRElDLUNQLU5PLy8JCUlCTTI3Ny8vCithbGlhcwlDU0lCTTI3Ny8vCQlJQk0yNzcvLworYWxpYXMJT1NGMTAwMjAxMTUvLwkJSUJNMjc3Ly8KK21vZHVsZQlJQk0yNzcvLwkJSU5URVJOQUwJCUlCTTI3NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNzcvLwkJSUJNMjc3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDI3OC8vCQkJSUJNMjc4Ly8KK2FsaWFzCUVCQ0RJQy1DUC1GSS8vCQlJQk0yNzgvLworYWxpYXMJRUJDRElDLUNQLVNFLy8JCUlCTTI3OC8vCithbGlhcwlDU0lCTTI3OC8vCQlJQk0yNzgvLworYWxpYXMJT1NGMTAwMjAxMTYvLwkJSUJNMjc4Ly8KK21vZHVsZQlJQk0yNzgvLwkJSU5URVJOQUwJCUlCTTI3OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNzgvLwkJSUJNMjc4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDI4MC8vCQkJSUJNMjgwLy8KK2FsaWFzCUVCQ0RJQy1DUC1JVC8vCQlJQk0yODAvLworYWxpYXMJQ1NJQk0yODAvLwkJSUJNMjgwLy8KK2FsaWFzCU9TRjEwMDIwMTE4Ly8JCUlCTTI4MC8vCittb2R1bGUJSUJNMjgwLy8JCUlOVEVSTkFMCQlJQk0yODAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjgwLy8JCUlCTTI4MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRUJDRElDLUpQLUUvLwkJSUJNMjgxLy8KK2FsaWFzCUNQMjgxLy8JCQlJQk0yODEvLworYWxpYXMJQ1NJQk0yODEvLwkJSUJNMjgxLy8KK21vZHVsZQlJQk0yODEvLwkJSU5URVJOQUwJCUlCTTI4MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yODEvLwkJSUJNMjgxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDI4NC8vCQkJSUJNMjg0Ly8KK2FsaWFzCUVCQ0RJQy1DUC1FUy8vCQlJQk0yODQvLworYWxpYXMJQ1NJQk0yODQvLwkJSUJNMjg0Ly8KK2FsaWFzCU9TRjEwMDIwMTFDLy8JCUlCTTI4NC8vCithbGlhcwlDUDEwNzkvLwkJSUJNMjg0Ly8KK21vZHVsZQlJQk0yODQvLwkJSU5URVJOQUwJCUlCTTI4NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yODQvLwkJSUJNMjg0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDI4NS8vCQkJSUJNMjg1Ly8KK2FsaWFzCUVCQ0RJQy1DUC1HQi8vCQlJQk0yODUvLworYWxpYXMJQ1NJQk0yODUvLwkJSUJNMjg1Ly8KK2FsaWFzCU9TRjEwMDIwMTFELy8JCUlCTTI4NS8vCittb2R1bGUJSUJNMjg1Ly8JCUlOVEVSTkFMCQlJQk0yODUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjg1Ly8JCUlCTTI4NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyOTAvLwkJCUlCTTI5MC8vCithbGlhcwlFQkNESUMtSlAtS0FOQS8vCUlCTTI5MC8vCithbGlhcwlDU0lCTTI5MC8vCQlJQk0yOTAvLworYWxpYXMJT1NGMTAwMjAxMjIvLwkJSUJNMjkwLy8KK21vZHVsZQlJQk0yOTAvLwkJSU5URVJOQUwJCUlCTTI5MAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yOTAvLwkJSUJNMjkwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDI5Ny8vCQkJSUJNMjk3Ly8KK2FsaWFzCUVCQ0RJQy1DUC1GUi8vCQlJQk0yOTcvLworYWxpYXMJQ1NJQk0yOTcvLwkJSUJNMjk3Ly8KK2FsaWFzCU9TRjEwMDIwMTI5Ly8JCUlCTTI5Ny8vCithbGlhcwlDUDEwODEvLwkJSUJNMjk3Ly8KK21vZHVsZQlJQk0yOTcvLwkJSU5URVJOQUwJCUlCTTI5NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yOTcvLwkJSUJNMjk3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDQyMC8vCQkJSUJNNDIwLy8KK2FsaWFzCUVCQ0RJQy1DUC1BUjEvLwkJSUJNNDIwLy8KK2FsaWFzCUNTSUJNNDIwLy8JCUlCTTQyMC8vCithbGlhcwlPU0YxMDAyMDFBNC8vCQlJQk00MjAvLworbW9kdWxlCUlCTTQyMC8vCQlJTlRFUk5BTAkJSUJNNDIwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTQyMC8vCQlJQk00MjAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQNDIzLy8JCQlJQk00MjMvLworYWxpYXMJRUJDRElDLUNQLUdSLy8JCUlCTTQyMy8vCithbGlhcwlDU0lCTTQyMy8vCQlJQk00MjMvLworbW9kdWxlCUlCTTQyMy8vCQlJTlRFUk5BTAkJSUJNNDIzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTQyMy8vCQlJQk00MjMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQNDI0Ly8JCQlJQk00MjQvLworYWxpYXMJRUJDRElDLUNQLUhFLy8JCUlCTTQyNC8vCithbGlhcwlDU0lCTTQyNC8vCQlJQk00MjQvLworYWxpYXMJT1NGMTAwMjAxQTgvLwkJSUJNNDI0Ly8KK21vZHVsZQlJQk00MjQvLwkJSU5URVJOQUwJCUlCTTQyNAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00MjQvLwkJSUJNNDI0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDQzNy8vCQkJSUJNNDM3Ly8KK2FsaWFzCTQzNy8vCQkJSUJNNDM3Ly8KK2FsaWFzCUNTUEM4Q09ERVBBR0U0MzcvLwlJQk00MzcvLworYWxpYXMJT1NGMTAwMjAxQjUvLwkJSUJNNDM3Ly8KK21vZHVsZQlJQk00MzcvLwkJSU5URVJOQUwJCUlCTTQzNwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00MzcvLwkJSUJNNDM3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDUwMC8vCQkJSUJNNTAwLy8KK2FsaWFzCTUwMC8vCQkJSUJNNTAwLy8KK2FsaWFzCTUwMFYxLy8JCQlJQk01MDAvLworYWxpYXMJRUJDRElDLUNQLUJFLy8JCUlCTTUwMC8vCithbGlhcwlFQkNESUMtQ1AtQ0gvLwkJSUJNNTAwLy8KK2FsaWFzCUNTSUJNNTAwLy8JCUlCTTUwMC8vCithbGlhcwlPU0YxMDAyMDFGNC8vCQlJQk01MDAvLworYWxpYXMJQ1AxMDg0Ly8JCUlCTTUwMC8vCittb2R1bGUJSUJNNTAwLy8JCUlOVEVSTkFMCQlJQk01MDAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNTAwLy8JCUlCTTUwMAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NTAvLwkJCUlCTTg1MC8vCithbGlhcwk4NTAvLwkJCUlCTTg1MC8vCithbGlhcwlDU1BDODUwTVVMVElMSU5HVUFMLy8JSUJNODUwLy8KK2FsaWFzCU9TRjEwMDIwMzUyLy8JCUlCTTg1MC8vCittb2R1bGUJSUJNODUwLy8JCUlOVEVSTkFMCQlJQk04NTAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODUwLy8JCUlCTTg1MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NTEvLwkJCUlCTTg1MS8vCithbGlhcwk4NTEvLwkJCUlCTTg1MS8vCithbGlhcwlDU0lCTTg1MS8vCQlJQk04NTEvLworbW9kdWxlCUlCTTg1MS8vCQlJTlRFUk5BTAkJSUJNODUxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg1MS8vCQlJQk04NTEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODUyLy8JCQlJQk04NTIvLworYWxpYXMJODUyLy8JCQlJQk04NTIvLworYWxpYXMJQ1NQQ1A4NTIvLwkJSUJNODUyLy8KK2FsaWFzCU9TRjEwMDIwMzU0Ly8JCUlCTTg1Mi8vCittb2R1bGUJSUJNODUyLy8JCUlOVEVSTkFMCQlJQk04NTIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODUyLy8JCUlCTTg1MgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NTUvLwkJCUlCTTg1NS8vCithbGlhcwk4NTUvLwkJCUlCTTg1NS8vCithbGlhcwlDU0lCTTg1NS8vCQlJQk04NTUvLworYWxpYXMJT1NGMTAwMjAzNTcvLwkJSUJNODU1Ly8KK21vZHVsZQlJQk04NTUvLwkJSU5URVJOQUwJCUlCTTg1NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NTUvLwkJSUJNODU1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tODU2Ly8JCUlCTTg1Ni8vCithbGlhcwlDUDg1Ni8vCQkJSUJNODU2Ly8KK2FsaWFzCTg1Ni8vCQkJSUJNODU2Ly8KK2FsaWFzCUNTSUJNODU2Ly8JCUlCTTg1Ni8vCittb2R1bGUJSUJNODU2Ly8JCUlOVEVSTkFMCQlJQk04NTYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODU2Ly8JCUlCTTg1NgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NTcvLwkJCUlCTTg1Ny8vCithbGlhcwk4NTcvLwkJCUlCTTg1Ny8vCithbGlhcwlDU0lCTTg1Ny8vCQlJQk04NTcvLworYWxpYXMJT1NGMTAwMjAzNTkvLwkJSUJNODU3Ly8KK21vZHVsZQlJQk04NTcvLwkJSU5URVJOQUwJCUlCTTg1NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NTcvLwkJSUJNODU3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2MC8vCQkJSUJNODYwLy8KK2FsaWFzCTg2MC8vCQkJSUJNODYwLy8KK2FsaWFzCUNTSUJNODYwLy8JCUlCTTg2MC8vCittb2R1bGUJSUJNODYwLy8JCUlOVEVSTkFMCQlJQk04NjAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODYwLy8JCUlCTTg2MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjEvLwkJCUlCTTg2MS8vCithbGlhcwk4NjEvLwkJCUlCTTg2MS8vCithbGlhcwlDUElCTTg2MS8vCQlJQk04NjEvLworYWxpYXMJT1NGMTAwMjAzNUQvLwkJSUJNODYxLy8KK21vZHVsZQlJQk04NjEvLwkJSU5URVJOQUwJCUlCTTg2MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjEvLwkJSUJNODYxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2Mi8vCQkJSUJNODYyLy8KK2FsaWFzCTg2Mi8vCQkJSUJNODYyLy8KK2FsaWFzCUNTUEM4NjJMQVRJTkhFQlJFVy8vCUlCTTg2Mi8vCithbGlhcwlPU0YxMDAyMDM1RS8vCQlJQk04NjIvLworbW9kdWxlCUlCTTg2Mi8vCQlJTlRFUk5BTAkJSUJNODYyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2Mi8vCQlJQk04NjIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODYzLy8JCQlJQk04NjMvLworYWxpYXMJODYzLy8JCQlJQk04NjMvLworYWxpYXMJQ1NJQk04NjMvLwkJSUJNODYzLy8KK2FsaWFzCU9TRjEwMDIwMzVGLy8JCUlCTTg2My8vCittb2R1bGUJSUJNODYzLy8JCUlOVEVSTkFMCQlJQk04NjMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODYzLy8JCUlCTTg2MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjQvLwkJCUlCTTg2NC8vCithbGlhcwk4NjQvLwkJCUlCTTg2NC8vCithbGlhcwlDU0lCTTg2NC8vCQlJQk04NjQvLworYWxpYXMJT1NGMTAwMjAzNjAvLwkJSUJNODY0Ly8KK21vZHVsZQlJQk04NjQvLwkJSU5URVJOQUwJCUlCTTg2NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjQvLwkJSUJNODY0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2NS8vCQkJSUJNODY1Ly8KK2FsaWFzCTg2NS8vCQkJSUJNODY1Ly8KK2FsaWFzCUNTSUJNODY1Ly8JCUlCTTg2NS8vCittb2R1bGUJSUJNODY1Ly8JCUlOVEVSTkFMCQlJQk04NjUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODY1Ly8JCUlCTTg2NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjYvLwkJCUlCTTg2Ni8vCithbGlhcwk4NjYvLwkJCUlCTTg2Ni8vCithbGlhcwlDU0lCTTg2Ni8vCQlJQk04NjYvLworbW9kdWxlCUlCTTg2Ni8vCQlJTlRFUk5BTAkJSUJNODY2CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2Ni8vCQlJQk04NjYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODY2TkFWLy8JCUlCTTg2Nk5BVi8vCithbGlhcwk4NjZOQVYvLwkJSUJNODY2TkFWLy8KK21vZHVsZQlJQk04NjZOQVYvLwkJSU5URVJOQUwJCUlCTTg2Nk5BVgkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2Nk5BVi8vCQlJQk04NjZOQVYJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjgvLwkJCUlCTTg2OC8vCithbGlhcwlDUC1BUi8vCQkJSUJNODY4Ly8KK2FsaWFzCUNTSUJNODY4Ly8JCUlCTTg2OC8vCithbGlhcwlPU0YxMDAyMDM2NC8vCQlJQk04NjgvLworbW9kdWxlCUlCTTg2OC8vCQlJTlRFUk5BTAkJSUJNODY4CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2OC8vCQlJQk04NjgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODY5Ly8JCQlJQk04NjkvLworYWxpYXMJODY5Ly8JCQlJQk04NjkvLworYWxpYXMJQ1AtR1IvLwkJCUlCTTg2OS8vCithbGlhcwlDU0lCTTg2OS8vCQlJQk04NjkvLworYWxpYXMJT1NGMTAwMjAzNjUvLwkJSUJNODY5Ly8KK21vZHVsZQlJQk04NjkvLwkJSU5URVJOQUwJCUlCTTg2OQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjkvLwkJSUJNODY5CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg3MC8vCQkJSUJNODcwLy8KK2FsaWFzCUVCQ0RJQy1DUC1ST0VDRS8vCUlCTTg3MC8vCithbGlhcwlFQkNESUMtQ1AtWVUvLwkJSUJNODcwLy8KK2FsaWFzCUNTSUJNODcwLy8JCUlCTTg3MC8vCithbGlhcwlPU0YxMDAyMDM2Ni8vCQlJQk04NzAvLworbW9kdWxlCUlCTTg3MC8vCQlJTlRFUk5BTAkJSUJNODcwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg3MC8vCQlJQk04NzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODcxLy8JCQlJQk04NzEvLworYWxpYXMJRUJDRElDLUNQLUlTLy8JCUlCTTg3MS8vCithbGlhcwlDU0lCTTg3MS8vCQlJQk04NzEvLworYWxpYXMJT1NGMTAwMjAzNjcvLwkJSUJNODcxLy8KK21vZHVsZQlJQk04NzEvLwkJSU5URVJOQUwJCUlCTTg3MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NzEvLwkJSUJNODcxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg3NS8vCQkJSUJNODc1Ly8KK2FsaWFzCUVCQ0RJQy1HUkVFSy8vCQlJQk04NzUvLworYWxpYXMJT1NGMTAwMjAzNkIvLwkJSUJNODc1Ly8KK21vZHVsZQlJQk04NzUvLwkJSU5URVJOQUwJCUlCTTg3NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NzUvLwkJSUJNODc1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg4MC8vCQkJSUJNODgwLy8KK2FsaWFzCUVCQ0RJQy1DWVJJTExJQy8vCUlCTTg4MC8vCithbGlhcwlDU0lCTTg4MC8vCQlJQk04ODAvLworYWxpYXMJT1NGMTAwMjAzNzAvLwkJSUJNODgwLy8KK21vZHVsZQlJQk04ODAvLwkJSU5URVJOQUwJCUlCTTg4MAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04ODAvLwkJSUJNODgwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg5MS8vCQkJSUJNODkxLy8KK2FsaWFzCUNTSUJNODkxLy8JCUlCTTg5MS8vCithbGlhcwlPU0YxMDAyMDM3Qi8vCQlJQk04OTEvLworbW9kdWxlCUlCTTg5MS8vCQlJTlRFUk5BTAkJSUJNODkxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg5MS8vCQlJQk04OTEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQOTAzLy8JCQlJQk05MDMvLworYWxpYXMJQ1NJQk05MDMvLwkJSUJNOTAzLy8KK2FsaWFzCU9TRjEwMDIwMzg3Ly8JCUlCTTkwMy8vCittb2R1bGUJSUJNOTAzLy8JCUlOVEVSTkFMCQlJQk05MDMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTAzLy8JCUlCTTkwMwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A5MDQvLwkJCUlCTTkwNC8vCithbGlhcwk5MDQvLwkJCUlCTTkwNC8vCithbGlhcwlDU0lCTTkwNC8vCQlJQk05MDQvLworYWxpYXMJT1NGMTAwMjAzODgvLwkJSUJNOTA0Ly8KK21vZHVsZQlJQk05MDQvLwkJSU5URVJOQUwJCUlCTTkwNAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MDQvLwkJSUJNOTA0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDkwNS8vCQkJSUJNOTA1Ly8KK2FsaWFzCUVCQ0RJQy1DUC1UUi8vCQlJQk05MDUvLworYWxpYXMJQ1NJQk05MDUvLwkJSUJNOTA1Ly8KK21vZHVsZQlJQk05MDUvLwkJSU5URVJOQUwJCUlCTTkwNQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MDUvLwkJSUJNOTA1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDkxOC8vCQkJSUJNOTE4Ly8KK2FsaWFzCUVCQ0RJQy1DUC1BUjIvLwkJSUJNOTE4Ly8KK2FsaWFzCUNTSUJNOTE4Ly8JCUlCTTkxOC8vCithbGlhcwlPU0YxMDAyMDM5Ni8vCQlJQk05MTgvLworbW9kdWxlCUlCTTkxOC8vCQlJTlRFUk5BTAkJSUJNOTE4CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkxOC8vCQlJQk05MTgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MjIvLwkJSUJNOTIyLy8KK2FsaWFzCUNQOTIyLy8JCQlJQk05MjIvLworYWxpYXMJQ1NJQk05MjIvLwkJSUJNOTIyLy8KK21vZHVsZQlJQk05MjIvLwkJSU5URVJOQUwJCUlCTTkyMgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MjIvLwkJSUJNOTIyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTMwLy8JCUlCTTkzMC8vCithbGlhcwlDUDkzMC8vCQkJSUJNOTMwLy8KK2FsaWFzCUNTSUJNOTMwLy8JCUlCTTkzMC8vCittb2R1bGUJSUJNOTMwLy8JCUlOVEVSTkFMCQlJQk05MzAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTMwLy8JCUlCTTkzMAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkzMi8vCQlJQk05MzIvLworYWxpYXMJQ1NJQk05MzIvLwkJSUJNOTMyLy8KK21vZHVsZQlJQk05MzIvLwkJSU5URVJOQUwJCUlCTTkzMgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MzIvLwkJSUJNOTMyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTMzLy8JCUlCTTkzMy8vCithbGlhcwlDUDkzMy8vCQkJSUJNOTMzLy8KK2FsaWFzCUNTSUJNOTMzLy8JCUlCTTkzMy8vCittb2R1bGUJSUJNOTMzLy8JCUlOVEVSTkFMCQlJQk05MzMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTMzLy8JCUlCTTkzMwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkzNS8vCQlJQk05MzUvLworYWxpYXMJQ1A5MzUvLwkJCUlCTTkzNS8vCithbGlhcwlDU0lCTTkzNS8vCQlJQk05MzUvLworbW9kdWxlCUlCTTkzNS8vCQlJTlRFUk5BTAkJSUJNOTM1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkzNS8vCQlJQk05MzUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MzcvLwkJSUJNOTM3Ly8KK2FsaWFzCUNQOTM3Ly8JCQlJQk05MzcvLworYWxpYXMJQ1NJQk05MzcvLwkJSUJNOTM3Ly8KK21vZHVsZQlJQk05MzcvLwkJSU5URVJOQUwJCUlCTTkzNwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MzcvLwkJSUJNOTM3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTM5Ly8JCUlCTTkzOS8vCithbGlhcwlDUDkzOS8vCQkJSUJNOTM5Ly8KK2FsaWFzCUNTSUJNOTM5Ly8JCUlCTTkzOS8vCittb2R1bGUJSUJNOTM5Ly8JCUlOVEVSTkFMCQlJQk05MzkJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTM5Ly8JCUlCTTkzOQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTk0My8vCQlJQk05NDMvLworYWxpYXMJQ1NJQk05NDMvLwkJSUJNOTQzLy8KK21vZHVsZQlJQk05NDMvLwkJSU5URVJOQUwJCUlCTTk0MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05NDMvLwkJSUJNOTQzCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDEwMDQvLwkJSUJNMTAwNC8vCithbGlhcwlPUzJMQVRJTjEvLwkJSUJNMTAwNC8vCittb2R1bGUJSUJNMTAwNC8vCQlJTlRFUk5BTAkJSUJNMTAwNAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDA0Ly8JCUlCTTEwMDQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQMTAyNi8vCQlJQk0xMDI2Ly8KK2FsaWFzCTEwMjYvLwkJCUlCTTEwMjYvLworYWxpYXMJQ1NJQk0xMDI2Ly8JCUlCTTEwMjYvLworYWxpYXMJT1NGMTAwMjA0MDIvLwkJSUJNMTAyNi8vCittb2R1bGUJSUJNMTAyNi8vCQlJTlRFUk5BTAkJSUJNMTAyNgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDI2Ly8JCUlCTTEwMjYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMDQ2Ly8JCUlCTTEwNDYvLworYWxpYXMJQ1AxMDQ2Ly8JCUlCTTEwNDYvLworYWxpYXMJMTA0Ni8vCQkJSUJNMTA0Ni8vCittb2R1bGUJSUJNMTA0Ni8vCQlJTlRFUk5BTAkJSUJNMTA0NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDQ2Ly8JCUlCTTEwNDYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMDQ3Ly8JCUlCTTEwNDcvLworYWxpYXMJQ1AxMDQ3Ly8JCUlCTTEwNDcvLworYWxpYXMJMTA0Ny8vCQkJSUJNMTA0Ny8vCithbGlhcwlPU0YxMDAyMDQxNy8vCQlJQk0xMDQ3Ly8KK21vZHVsZQlJQk0xMDQ3Ly8JCUlOVEVSTkFMCQlJQk0xMDQ3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEwNDcvLwkJSUJNMTA0NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExMjQvLwkJSUJNMTEyNC8vCithbGlhcwlDUDExMjQvLwkJSUJNMTEyNC8vCithbGlhcwlDU0lCTTExMjQvLwkJSUJNMTEyNC8vCittb2R1bGUJSUJNMTEyNC8vCQlJTlRFUk5BTAkJSUJNMTEyNAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTI0Ly8JCUlCTTExMjQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTI5Ly8JCUlCTTExMjkvLworYWxpYXMJQ1AxMTI5Ly8JCUlCTTExMjkvLworYWxpYXMJQ1NJQk0xMTI5Ly8JCUlCTTExMjkvLworbW9kdWxlCUlCTTExMjkvLwkJSU5URVJOQUwJCUlCTTExMjkJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEyOS8vCQlJQk0xMTI5CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE2MC8vCQlJQk0xMTYwLy8KK2FsaWFzCUNQMTE2MC8vCQlJQk0xMTYwLy8KK2FsaWFzCUNTSUJNMTE2MC8vCQlJQk0xMTYwLy8KK21vZHVsZQlJQk0xMTYwLy8JCUlOVEVSTkFMCQlJQk0xMTYwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNjAvLwkJSUJNMTE2MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjEvLwkJSUJNMTE2MS8vCithbGlhcwlDUDExNjEvLwkJSUJNMTE2MS8vCithbGlhcwlDU0lCTTExNjEvLwkJSUJNMTE2MS8vCittb2R1bGUJSUJNMTE2MS8vCQlJTlRFUk5BTAkJSUJNMTE2MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTYxLy8JCUlCTTExNjEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTMyLy8JCUlCTTExMzIvLworYWxpYXMJQ1AxMTMyLy8JCUlCTTExMzIvLworYWxpYXMJQ1NJQk0xMTMyLy8JCUlCTTExMzIvLworbW9kdWxlCUlCTTExMzIvLwkJSU5URVJOQUwJCUlCTTExMzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEzMi8vCQlJQk0xMTMyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTEzMy8vCQlJQk0xMTMzLy8KK2FsaWFzCUNQMTEzMy8vCQlJQk0xMTMzLy8KK2FsaWFzCUNTSUJNMTEzMy8vCQlJQk0xMTMzLy8KK21vZHVsZQlJQk0xMTMzLy8JCUlOVEVSTkFMCQlJQk0xMTMzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMzMvLwkJSUJNMTEzMwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjIvLwkJSUJNMTE2Mi8vCithbGlhcwlDUDExNjIvLwkJSUJNMTE2Mi8vCithbGlhcwlDU0lCTTExNjIxMTYyLy8JCUlCTTExNjIvLworbW9kdWxlCUlCTTExNjIvLwkJSU5URVJOQUwJCUlCTTExNjIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE2Mi8vCQlJQk0xMTYyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE2My8vCQlJQk0xMTYzLy8KK2FsaWFzCUNQMTE2My8vCQlJQk0xMTYzLy8KK2FsaWFzCUNTSUJNMTE2My8vCQlJQk0xMTYzLy8KK21vZHVsZQlJQk0xMTYzLy8JCUlOVEVSTkFMCQlJQk0xMTYzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNjMvLwkJSUJNMTE2MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjQvLwkJSUJNMTE2NC8vCithbGlhcwlDUDExNjQvLwkJSUJNMTE2NC8vCithbGlhcwlDU0lCTTExNjQvLwkJSUJNMTE2NC8vCittb2R1bGUJSUJNMTE2NC8vCQlJTlRFUk5BTAkJSUJNMTE2NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTY0Ly8JCUlCTTExNjQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVVQ0tSLy8JCQlFVUMtS1IvLworYWxpYXMJQ1NFVUNLUi8vCQlFVUMtS1IvLworYWxpYXMJT1NGMDAwNDAwMGEvLwkJRVVDLUtSLy8KK21vZHVsZQlFVUMtS1IvLwkJSU5URVJOQUwJCUVVQy1LUgkJMQorbW9kdWxlCUlOVEVSTkFMCQlFVUMtS1IvLwkJRVVDLUtSCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNU0NQOTQ5Ly8JCVVIQy8vCithbGlhcwlDUDk0OS8vCQkJVUhDLy8KK2FsaWFzCU9TRjEwMDIwM0I1Ly8JCVVIQy8vCittb2R1bGUJVUhDLy8JCQlJTlRFUk5BTAkJVUhDCQkxCittb2R1bGUJSU5URVJOQUwJCVVIQy8vCQkJVUhDCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNU0NQMTM2MS8vCQlKT0hBQi8vCithbGlhcwlDUDEzNjEvLwkJSk9IQUIvLworbW9kdWxlCUpPSEFCLy8JCQlJTlRFUk5BTAkJSk9IQUIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSk9IQUIvLwkJCUpPSEFCCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlCSUctRklWRS8vCQlCSUc1Ly8KK2FsaWFzCUJJR0ZJVkUvLwkJQklHNS8vCithbGlhcwlCSUctNS8vCQkJQklHNS8vCithbGlhcwlDTi1CSUc1Ly8JCUJJRzUvLworYWxpYXMJQ1A5NTAvLwkJCUJJRzUvLworbW9kdWxlCUJJRzUvLwkJCUlOVEVSTkFMCQlCSUc1CQkxCittb2R1bGUJSU5URVJOQUwJCUJJRzUvLwkJCUJJRzUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUJJRzUtSEtTQ1MvLwkJQklHNUhLU0NTLy8KK21vZHVsZQlCSUc1SEtTQ1MvLwkJSU5URVJOQUwJCUJJRzVIS1NDUwkxCittb2R1bGUJSU5URVJOQUwJCUJJRzVIS1NDUy8vCQlCSUc1SEtTQ1MJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRVVDSlAtTVMvLwkJRVVDLUpQLU1TLy8KK2FsaWFzCUVVQ0pQLU9QRU4vLwkJRVVDLUpQLU1TLy8KK2FsaWFzCUVVQ0pQLVdJTi8vCQlFVUMtSlAtTVMvLworbW9kdWxlCUVVQy1KUC1NUy8vCQlJTlRFUk5BTAkJRVVDLUpQLU1TCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLUpQLU1TLy8JCUVVQy1KUC1NUwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFVUNKUC8vCQkJRVVDLUpQLy8KK2FsaWFzCUNTRVVDUEtERk1USkFQQU5FU0UvLwlFVUMtSlAvLworYWxpYXMJT1NGMDAwMzAwMTAvLwkJRVVDLUpQLy8KK2FsaWFzCVVKSVMvLwkJCUVVQy1KUC8vCittb2R1bGUJRVVDLUpQLy8JCUlOVEVSTkFMCQlFVUMtSlAJCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLUpQLy8JCUVVQy1KUAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRVVDQ04vLwkJCUVVQy1DTi8vCithbGlhcwlHQjIzMTIvLwkJRVVDLUNOLy8KK2FsaWFzCWNzR0IyMzEyLy8JCUVVQy1DTi8vCithbGlhcwlDTi1HQi8vCQkJRVVDLUNOLy8KK21vZHVsZQlFVUMtQ04vLwkJSU5URVJOQUwJCUVVQy1DTgkJMQorbW9kdWxlCUlOVEVSTkFMCQlFVUMtQ04vLwkJRVVDLUNOCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJRVVDLUNOLy8JCUJJRzUvLwkJCUdCQklHNQkJMQorbW9kdWxlCUJJRzUvLwkJCUVVQy1DTi8vCQlHQkJJRzUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUdCMTMwMDAvLwkJR0JLLy8KK2FsaWFzCUNQOTM2Ly8JCQlHQksvLworYWxpYXMJTVM5MzYvLwkJCUdCSy8vCithbGlhcwlXSU5ET1dTLTkzNi8vCQlHQksvLworbW9kdWxlCUdCSy8vCQkJSU5URVJOQUwJCUdCSwkJMQorbW9kdWxlCUlOVEVSTkFMCQlHQksvLwkJCUdCSwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUdCSy8vCQkJRVVDLUNOLy8JCUdCR0JLCQkxCittb2R1bGUJRVVDLUNOLy8JCUdCSy8vCQkJR0JHQksJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVVQ1RXLy8JCQlFVUMtVFcvLworYWxpYXMJT1NGMDAwNTAwMGEvLwkJRVVDLVRXLy8KK21vZHVsZQlFVUMtVFcvLwkJSU5URVJOQUwJCUVVQy1UVwkJMQorbW9kdWxlCUlOVEVSTkFMCQlFVUMtVFcvLwkJRVVDLVRXCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlSVVNDSUkvLwkJQ1AxMTI1Ly8KK2FsaWFzCUlCTTg0OC8vCQlDUDExMjUvLworbW9kdWxlCUNQMTEyNS8vCQlJTlRFUk5BTAkJQ1AxMTI1CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTEyNS8vCQlDUDExMjUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUVFLy8JCQlDUDEyNTAvLworYWxpYXMJV0lORE9XUy0xMjUwLy8JCUNQMTI1MC8vCittb2R1bGUJQ1AxMjUwLy8JCUlOVEVSTkFMCQlDUDEyNTAJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1AxMjUwLy8JCUNQMTI1MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVMtQ1lSTC8vCQlDUDEyNTEvLworYWxpYXMJV0lORE9XUy0xMjUxLy8JCUNQMTI1MS8vCittb2R1bGUJQ1AxMjUxLy8JCUlOVEVSTkFMCQlDUDEyNTEJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1AxMjUxLy8JCUNQMTI1MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVMtQU5TSS8vCQlDUDEyNTIvLworYWxpYXMJV0lORE9XUy0xMjUyLy8JCUNQMTI1Mi8vCittb2R1bGUJQ1AxMjUyLy8JCUlOVEVSTkFMCQlDUDEyNTIJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1AxMjUyLy8JCUNQMTI1MgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVMtR1JFRUsvLwkJQ1AxMjUzLy8KK2FsaWFzCVdJTkRPV1MtMTI1My8vCQlDUDEyNTMvLworbW9kdWxlCUNQMTI1My8vCQlJTlRFUk5BTAkJQ1AxMjUzCQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1My8vCQlDUDEyNTMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLVRVUksvLwkJQ1AxMjU0Ly8KK2FsaWFzCVdJTkRPV1MtMTI1NC8vCQlDUDEyNTQvLworbW9kdWxlCUNQMTI1NC8vCQlJTlRFUk5BTAkJQ1AxMjU0CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1NC8vCQlDUDEyNTQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUhFQlIvLwkJQ1AxMjU1Ly8KK2FsaWFzCVdJTkRPV1MtMTI1NS8vCQlDUDEyNTUvLworbW9kdWxlCUNQMTI1NS8vCQlJTlRFUk5BTAkJQ1AxMjU1CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1NS8vCQlDUDEyNTUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUFSQUIvLwkJQ1AxMjU2Ly8KK2FsaWFzCVdJTkRPV1MtMTI1Ni8vCQlDUDEyNTYvLworbW9kdWxlCUNQMTI1Ni8vCQlJTlRFUk5BTAkJQ1AxMjU2CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1Ni8vCQlDUDEyNTYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVdJTkJBTFRSSU0vLwkJQ1AxMjU3Ly8KK2FsaWFzCVdJTkRPV1MtMTI1Ny8vCQlDUDEyNTcvLworbW9kdWxlCUNQMTI1Ny8vCQlJTlRFUk5BTAkJQ1AxMjU3CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1Ny8vCQlDUDEyNTcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVdJTkRPV1MtMTI1OC8vCQlDUDEyNTgvLworbW9kdWxlCUNQMTI1OC8vCQlJTlRFUk5BTAkJQ1AxMjU4CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1OC8vCQlDUDEyNTgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCTg3NC8vCQkJSUJNODc0Ly8KK2FsaWFzCUNQODc0Ly8JCQlJQk04NzQvLworYWxpYXMJV0lORE9XUy04NzQvLwkJSUJNODc0Ly8KK21vZHVsZQlJQk04NzQvLwkJSU5URVJOQUwJCUlCTTg3NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NzQvLwkJSUJNODc0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQ1A3MzcvLwkJCUlOVEVSTkFMCQlDUDczNwkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDczNy8vCQkJQ1A3MzcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlDUDc3MC8vCQkJSU5URVJOQUwJCUNQNzcwCQkxCittb2R1bGUJSU5URVJOQUwJCUNQNzcwLy8JCQlDUDc3MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUNQNzcxLy8JCQlJTlRFUk5BTAkJQ1A3NzEJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1A3NzEvLwkJCUNQNzcxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQ1A3NzIvLwkJCUlOVEVSTkFMCQlDUDc3MgkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDc3Mi8vCQkJQ1A3NzIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlDUDc3My8vCQkJSU5URVJOQUwJCUNQNzczCQkxCittb2R1bGUJSU5URVJOQUwJCUNQNzczLy8JCQlDUDc3MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUNQNzc0Ly8JCQlJTlRFUk5BTAkJQ1A3NzQJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1A3NzQvLwkJCUNQNzc0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk03NzUvLwkJQ1A3NzUvLworYWxpYXMJQ1NQQzc3NUJBTFRJQy8vCQlDUDc3NS8vCittb2R1bGUJQ1A3NzUvLwkJCUlOVEVSTkFMCQlDUDc3NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDc3NS8vCQkJQ1A3NzUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTSVNPMjAyMkpQLy8JCUlTTy0yMDIyLUpQLy8KK2FsaWFzCUlTTzIwMjJKUC8vCQlJU08tMjAyMi1KUC8vCittb2R1bGUJSVNPLTIwMjItSlAvLwkJSU5URVJOQUwJCUlTTy0yMDIyLUpQCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTIwMjItSlAvLwkJSVNPLTIwMjItSlAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NJU08yMDIySlAyLy8JCUlTTy0yMDIyLUpQLTIvLworYWxpYXMJSVNPMjAyMkpQMi8vCQlJU08tMjAyMi1KUC0yLy8KK21vZHVsZQlJU08tMjAyMi1KUC0yLy8JCUlOVEVSTkFMCQlJU08tMjAyMi1KUAkxCittb2R1bGUJSU5URVJOQUwJCUlTTy0yMDIyLUpQLTIvLwkJSVNPLTIwMjItSlAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUlTTy0yMDIyLUpQLTMvLwkJSU5URVJOQUwJCUlTTy0yMDIyLUpQLTMJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tMjAyMi1KUC0zLy8JCUlTTy0yMDIyLUpQLTMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NJU08yMDIyS1IvLwkJSVNPLTIwMjItS1IvLworYWxpYXMJSVNPMjAyMktSLy8JCUlTTy0yMDIyLUtSLy8KK21vZHVsZQlJU08tMjAyMi1LUi8vCQlJTlRFUk5BTAkJSVNPLTIwMjItS1IJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tMjAyMi1LUi8vCQlJU08tMjAyMi1LUgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0lTTzIwMjJDTi8vCQlJU08tMjAyMi1DTi8vCithbGlhcwlJU08yMDIyQ04vLwkJSVNPLTIwMjItQ04vLworbW9kdWxlCUlTTy0yMDIyLUNOLy8JCUlOVEVSTkFMCQlJU08tMjAyMi1DTgkxCittb2R1bGUJSU5URVJOQUwJCUlTTy0yMDIyLUNOLy8JCUlTTy0yMDIyLUNOCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTzIwMjJDTkVYVC8vCQlJU08tMjAyMi1DTi1FWFQvLworbW9kdWxlCUlTTy0yMDIyLUNOLUVYVC8vCUlOVEVSTkFMCQlJU08tMjAyMi1DTi1FWFQJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tMjAyMi1DTi1FWFQvLwlJU08tMjAyMi1DTi1FWFQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTUFDLy8JCQlNQUNJTlRPU0gvLworYWxpYXMJQ1NNQUNJTlRPU0gvLwkJTUFDSU5UT1NILy8KK21vZHVsZQlNQUNJTlRPU0gvLwkJSU5URVJOQUwJCU1BQ0lOVE9TSAkxCittb2R1bGUJSU5URVJOQUwJCU1BQ0lOVE9TSC8vCQlNQUNJTlRPU0gJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE0My8vCQlJRUNfUDI3LTEvLworYWxpYXMJQ1NJU08xNDNJRUNQMjcxLy8JSUVDX1AyNy0xLy8KK2FsaWFzCUlFQ19QMjcxLy8JCUlFQ19QMjctMS8vCittb2R1bGUJSUVDX1AyNy0xLy8JCUlOVEVSTkFMCQlJRUNfUDI3LTEJMQorbW9kdWxlCUlOVEVSTkFMCQlJRUNfUDI3LTEvLwkJSUVDX1AyNy0xCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTT185MDM2Ly8JCUFTTU9fNDQ5Ly8KK2FsaWFzCUFSQUJJQzcvLwkJQVNNT180NDkvLworYWxpYXMJSVNPLUlSLTg5Ly8JCUFTTU9fNDQ5Ly8KK2FsaWFzCUNTSVNPODlBU01PNDQ5Ly8JQVNNT180NDkvLworbW9kdWxlCUFTTU9fNDQ5Ly8JCUlOVEVSTkFMCQlBU01PXzQ0OQkxCittb2R1bGUJSU5URVJOQUwJCUFTTU9fNDQ5Ly8JCUFTTU9fNDQ5CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUFOU0lfWDMuMTEwLTE5ODMvLwlBTlNJX1gzLjExMC8vCithbGlhcwlJU08tSVItOTkvLwkJQU5TSV9YMy4xMTAvLworYWxpYXMJQ1NBX1Q1MDAtMTk4My8vCQlBTlNJX1gzLjExMC8vCithbGlhcwlDU0FfVDUwMC8vCQlBTlNJX1gzLjExMC8vCithbGlhcwlOQVBMUFMvLwkJQU5TSV9YMy4xMTAvLworYWxpYXMJQ1NJU085OU5BUExQUy8vCQlBTlNJX1gzLjExMC8vCittb2R1bGUJQU5TSV9YMy4xMTAvLwkJSU5URVJOQUwJCUFOU0lfWDMuMTEwCTEKK21vZHVsZQlJTlRFUk5BTAkJQU5TSV9YMy4xMTAvLwkJQU5TSV9YMy4xMTAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTEzOS8vCQlDU05fMzY5MTAzLy8KK2FsaWFzCUNTSVNPMTM5Q1NOMzY5MTAzLy8JQ1NOXzM2OTEwMy8vCittb2R1bGUJQ1NOXzM2OTEwMy8vCQlJTlRFUk5BTAkJQ1NOXzM2OTEwMwkxCittb2R1bGUJSU5URVJOQUwJCUNTTl8zNjkxMDMvLwkJQ1NOXzM2OTEwMwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDV0ktMi8vCQkJQ1dJLy8KK2FsaWFzCUNQLUhVLy8JCQlDV0kvLworbW9kdWxlCUNXSS8vCQkJSU5URVJOQUwJCUNXSQkJMQorbW9kdWxlCUlOVEVSTkFMCQlDV0kvLwkJCUNXSQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJREVDLy8JCQlERUMtTUNTLy8KK2FsaWFzCUNTREVDTUNTLy8JCURFQy1NQ1MvLworYWxpYXMJREVDTUNTLy8JCURFQy1NQ1MvLworbW9kdWxlCURFQy1NQ1MvLwkJSU5URVJOQUwJCURFQy1NQ1MJCTEKK21vZHVsZQlJTlRFUk5BTAkJREVDLU1DUy8vCQlERUMtTUNTCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTExLy8JCUVDTUEtQ1lSSUxMSUMvLworYWxpYXMJQ1NJU08xMTFFQ01BQ1lSSUxMSUMvLwlFQ01BLUNZUklMTElDLy8KK2FsaWFzCUVDTUFDWVJJTExJQy8vCQlFQ01BLUNZUklMTElDLy8KK21vZHVsZQlFQ01BLUNZUklMTElDLy8JCUlOVEVSTkFMCQlFQ01BLUNZUklMTElDCTEKK21vZHVsZQlJTlRFUk5BTAkJRUNNQS1DWVJJTExJQy8vCQlFQ01BLUNZUklMTElDCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVNUX1NFVl8zNTgtODgvLwkJR09TVF8xOTc2OC03NC8vCithbGlhcwlHT1NUXzE5NzY4Ly8JCUdPU1RfMTk3NjgtNzQvLworYWxpYXMJSVNPLUlSLTE1My8vCQlHT1NUXzE5NzY4LTc0Ly8KK2FsaWFzCUNTSVNPMTUzR09TVDE5NzY4NzQvLwlHT1NUXzE5NzY4LTc0Ly8KK2FsaWFzCUdPU1RfMTk3Njg3NC8vCQlHT1NUXzE5NzY4LTc0Ly8KK21vZHVsZQlHT1NUXzE5NzY4LTc0Ly8JCUlOVEVSTkFMCQlHT1NUXzE5NzY4LTc0CTEKK21vZHVsZQlJTlRFUk5BTAkJR09TVF8xOTc2OC03NC8vCQlHT1NUXzE5NzY4LTc0CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xNTAvLwkJR1JFRUstQ0NJVFQvLworYWxpYXMJQ1NJU08xNTAvLwkJR1JFRUstQ0NJVFQvLworYWxpYXMJQ1NJU08xNTBHUkVFS0NDSVRULy8JR1JFRUstQ0NJVFQvLworYWxpYXMJR1JFRUtDQ0lUVC8vCQlHUkVFSy1DQ0lUVC8vCittb2R1bGUJR1JFRUstQ0NJVFQvLwkJSU5URVJOQUwJCUdSRUVLLUNDSVRUCTEKK21vZHVsZQlJTlRFUk5BTAkJR1JFRUstQ0NJVFQvLwkJR1JFRUstQ0NJVFQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTg4Ly8JCUdSRUVLNy8vCithbGlhcwlDU0lTTzg4R1JFRUs3Ly8JCUdSRUVLNy8vCittb2R1bGUJR1JFRUs3Ly8JCUlOVEVSTkFMCQlHUkVFSzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJR1JFRUs3Ly8JCUdSRUVLNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE4Ly8JCUdSRUVLNy1PTEQvLworYWxpYXMJQ1NJU08xOEdSRUVLN09MRC8vCUdSRUVLNy1PTEQvLworYWxpYXMJR1JFRUs3T0xELy8JCUdSRUVLNy1PTEQvLworbW9kdWxlCUdSRUVLNy1PTEQvLwkJSU5URVJOQUwJCUdSRUVLNy1PTEQJMQorbW9kdWxlCUlOVEVSTkFMCQlHUkVFSzctT0xELy8JCUdSRUVLNy1PTEQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTQ5Ly8JCUlOSVMvLworYWxpYXMJQ1NJU080OUlOSVMvLwkJSU5JUy8vCittb2R1bGUJSU5JUy8vCQkJSU5URVJOQUwJCUlOSVMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSU5JUy8vCQkJSU5JUwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTUwLy8JCUlOSVMtOC8vCithbGlhcwlDU0lTTzUwSU5JUzgvLwkJSU5JUy04Ly8KK2FsaWFzCUlOSVM4Ly8JCQlJTklTLTgvLworbW9kdWxlCUlOSVMtOC8vCQlJTlRFUk5BTAkJSU5JUy04CQkxCittb2R1bGUJSU5URVJOQUwJCUlOSVMtOC8vCQlJTklTLTgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi01MS8vCQlJTklTLUNZUklMTElDLy8KK2FsaWFzCUNTSVNPNTFJTklTQ1lSSUxMSUMvLwlJTklTLUNZUklMTElDLy8KK2FsaWFzCUlOSVNDWVJJTExJQy8vCQlJTklTLUNZUklMTElDLy8KK21vZHVsZQlJTklTLUNZUklMTElDLy8JCUlOVEVSTkFMCQlJTklTLUNZUklMTElDCTEKK21vZHVsZQlJTlRFUk5BTAkJSU5JUy1DWVJJTExJQy8vCQlJTklTLUNZUklMTElDCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi05OC8vCQlJU09fMjAzMy8vCithbGlhcwlJU09fMjAzMy0xOTgzLy8JCUlTT18yMDMzLy8KK2FsaWFzCUUxM0IvLwkJCUlTT18yMDMzLy8KK2FsaWFzCUNTSVNPMjAzMy8vCQlJU09fMjAzMy8vCittb2R1bGUJSVNPXzIwMzMvLwkJSU5URVJOQUwJCUlTT18yMDMzCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzIwMzMvLwkJSVNPXzIwMzMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTM3Ly8JCUlTT181NDI3Ly8KK2FsaWFzCUtPSS03Ly8JCQlJU09fNTQyNy8vCithbGlhcwlDU0lTTzU0MjdDWVJJTExJQy8vCUlTT181NDI3Ly8KK21vZHVsZQlJU09fNTQyNy8vCQlJTlRFUk5BTAkJSVNPXzU0MjcJMQorbW9kdWxlCUlOVEVSTkFMCQlJU09fNTQyNy8vCQlJU09fNTQyNwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItNTQvLwkJSVNPXzU0MjctRVhULy8KK2FsaWFzCUlTT181NDI3OjE5ODEvLwkJSVNPXzU0MjctRVhULy8KK2FsaWFzCUNTSVNPNTQyN0NZUklMTElDMTk4MS8vCUlTT181NDI3LUVYVC8vCithbGlhcwlJU09fNTQyN0VYVC8vCQlJU09fNTQyNy1FWFQvLworbW9kdWxlCUlTT181NDI3LUVYVC8vCQlJTlRFUk5BTAkJSVNPXzU0MjctRVhUCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzU0MjctRVhULy8JCUlTT181NDI3LUVYVAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItNTUvLwkJSVNPXzU0MjgvLworYWxpYXMJSVNPXzU0Mjg6MTk4MC8vCQlJU09fNTQyOC8vCithbGlhcwlDU0lTTzU0MjhHUkVFSy8vCUlTT181NDI4Ly8KK21vZHVsZQlJU09fNTQyOC8vCQlJTlRFUk5BTAkJSVNPXzU0MjgJMQorbW9kdWxlCUlOVEVSTkFMCQlJU09fNTQyOC8vCQlJU09fNTQyOAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTU1Ly8JCUlTT18xMDM2Ny1CT1gvLworYWxpYXMJQ1NJU08xMDM2N0JPWC8vCQlJU09fMTAzNjctQk9YLy8KK2FsaWFzCUlTT18xMDM2N0JPWC8vCQlJU09fMTAzNjctQk9YLy8KK21vZHVsZQlJU09fMTAzNjctQk9YLy8JCUlOVEVSTkFMCQlJU09fMTAzNjctQk9YCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzEwMzY3LUJPWC8vCQlJU09fMTAzNjctQk9YCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1BQ0lTLy8JCQlNQUMtSVMvLworbW9kdWxlCU1BQy1JUy8vCQlJTlRFUk5BTAkJTUFDLUlTCQkxCittb2R1bGUJSU5URVJOQUwJCU1BQy1JUy8vCQlNQUMtSVMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1BQ1VLLy8JCQlNQUMtVUsvLworYWxpYXMJTUFDVUtSQUlOSUFOLy8JCU1BQy1VSy8vCithbGlhcwlNQUMtQ1lSSUxMSUMvLwkJTUFDLVVLLy8KK2FsaWFzCU1BQ0NZUklMTElDLy8JCU1BQy1VSy8vCittb2R1bGUJTUFDLVVLLy8JCUlOVEVSTkFMCQlNQUMtVUsJCTEKK21vZHVsZQlJTlRFUk5BTAkJTUFDLVVLLy8JCU1BQy1VSwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVMtTUFDLUNZUklMTElDLy8JQ1AxMDAwNy8vCithbGlhcwlNU01BQ0NZUklMTElDLy8JCUNQMTAwMDcvLworbW9kdWxlCUNQMTAwMDcvLwkJSU5URVJOQUwJCUNQMTAwMDcJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1AxMDAwNy8vCQlDUDEwMDA3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItOS0xLy8JCU5BVFMtREFOTy8vCithbGlhcwlDU05BVFNEQU5PLy8JCU5BVFMtREFOTy8vCithbGlhcwlOQVRTREFOTy8vCQlOQVRTLURBTk8vLworbW9kdWxlCU5BVFMtREFOTy8vCQlJTlRFUk5BTAkJTkFUUy1EQU5PCTEKK21vZHVsZQlJTlRFUk5BTAkJTkFUUy1EQU5PLy8JCU5BVFMtREFOTwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItOC0xLy8JCU5BVFMtU0VGSS8vCithbGlhcwlDU05BVFNTRUZJLy8JCU5BVFMtU0VGSS8vCithbGlhcwlOQVRTU0VGSS8vCQlOQVRTLVNFRkkvLworbW9kdWxlCU5BVFMtU0VGSS8vCQlJTlRFUk5BTAkJTkFUUy1TRUZJCTEKK21vZHVsZQlJTlRFUk5BTAkJTkFUUy1TRUZJLy8JCU5BVFMtU0VGSQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlXUzIvLwkJCVdJTi1TQU1JLTIvLworYWxpYXMJV0lOU0FNSTIvLwkJV0lOLVNBTUktMi8vCittb2R1bGUJV0lOLVNBTUktMi8vCQlJTlRFUk5BTAkJU0FNSS1XUzIJMQorbW9kdWxlCUlOVEVSTkFMCQlXSU4tU0FNSS0yLy8JCVNBTUktV1MyCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlJU08tSVItMTk3Ly8JCUlOVEVSTkFMCQlJU08tSVItMTk3CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLUlSLTE5Ny8vCQlJU08tSVItMTk3CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVRJUzYyMC8vCQlUSVMtNjIwLy8KK2FsaWFzCVRJUzYyMC0wLy8JCVRJUy02MjAvLworYWxpYXMJVElTNjIwLjI1MjktMS8vCQlUSVMtNjIwLy8KK2FsaWFzCVRJUzYyMC4yNTMzLTAvLwkJVElTLTYyMC8vCithbGlhcwlJU08tSVItMTY2Ly8JCVRJUy02MjAvLworbW9kdWxlCVRJUy02MjAvLwkJSU5URVJOQUwJCVRJUy02MjAJCTEKK21vZHVsZQlJTlRFUk5BTAkJVElTLTYyMC8vCQlUSVMtNjIwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlLT0k4VS8vCQkJS09JOC1VLy8KK21vZHVsZQlLT0k4LVUvLwkJSU5URVJOQUwJCUtPSTgtVQkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0k4LVUvLwkJS09JOC1VCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU0lSSTMzNDIvLwkJSVNJUkktMzM0Mi8vCittb2R1bGUJSVNJUkktMzM0Mi8vCQlJTlRFUk5BTAkJSVNJUkktMzM0MgkxCittb2R1bGUJSU5URVJOQUwJCUlTSVJJLTMzNDIvLwkJSVNJUkktMzM0MgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlVVEYxNi8vCQkJVVRGLTE2Ly8KK21vZHVsZQlVVEYtMTYvLwkJSU5URVJOQUwJCVVURi0xNgkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtMTYvLwkJVVRGLTE2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlVVEYxNkxFLy8JCVVURi0xNkxFLy8KK21vZHVsZQlVVEYtMTZMRS8vCQlJTlRFUk5BTAkJVVRGLTE2CQkxCittb2R1bGUJSU5URVJOQUwJCVVURi0xNkxFLy8JCVVURi0xNgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGMTZCRS8vCQlVVEYtMTZCRS8vCittb2R1bGUJVVRGLTE2QkUvLwkJSU5URVJOQUwJCVVURi0xNgkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtMTZCRS8vCQlVVEYtMTYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTVU5JQ09ERS8vCQlVTklDT0RFLy8KK21vZHVsZQlVTklDT0RFLy8JCUlOVEVSTkFMCQlVTklDT0RFCQkxCittb2R1bGUJSU5URVJOQUwJCVVOSUNPREUvLwkJVU5JQ09ERQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGMzIvLwkJCVVURi0zMi8vCittb2R1bGUJVVRGLTMyLy8JCUlOVEVSTkFMCQlVVEYtMzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTMyLy8JCVVURi0zMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGMzJMRS8vCQlVVEYtMzJMRS8vCittb2R1bGUJVVRGLTMyTEUvLwkJSU5URVJOQUwJCVVURi0zMgkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtMzJMRS8vCQlVVEYtMzIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVVURjMyQkUvLwkJVVRGLTMyQkUvLworbW9kdWxlCVVURi0zMkJFLy8JCUlOVEVSTkFMCQlVVEYtMzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTMyQkUvLwkJVVRGLTMyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlVVEY3Ly8JCQlVVEYtNy8vCittb2R1bGUJVVRGLTcvLwkJCUlOVEVSTkFMCQlVVEYtNwkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtNy8vCQkJVVRGLTcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlHQjE4MDMwLy8JCUlOVEVSTkFMCQlHQjE4MDMwCQkxCittb2R1bGUJSU5URVJOQUwJCUdCMTgwMzAvLwkJR0IxODAzMAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCVZJU0NJSS8vCQlJTlRFUk5BTAkJVklTQ0lJCQkxCittb2R1bGUJSU5URVJOQUwJCVZJU0NJSS8vCQlWSVNDSUkJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlLT0k4LVQvLwkJSU5URVJOQUwJCUtPSTgtVAkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0k4LVQvLwkJS09JOC1UCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJR0VPUkdJQU4tUFMvLwkJSU5URVJOQUwJCUdFT1JHSUFOLVBTCTEKK21vZHVsZQlJTlRFUk5BTAkJR0VPUkdJQU4tUFMvLwkJR0VPUkdJQU4tUFMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUdFT1JHSUFOLUFDQURFTVkvLwlJTlRFUk5BTAkJR0VPUkdJQU4tQUNBREVNWSAxCittb2R1bGUJSU5URVJOQUwJCUdFT1JHSUFOLUFDQURFTVkvLwlHRU9SR0lBTi1BQ0FERU1ZIDEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlJU08tSVItMjA5Ly8JCUlOVEVSTkFMCQlJU08tSVItMjA5CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLUlSLTIwOS8vCQlJU08tSVItMjA5CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlNQUMtU0FNSS8vCQlJTlRFUk5BTAkJTUFDLVNBTUkJMQorbW9kdWxlCUlOVEVSTkFMCQlNQUMtU0FNSS8vCQlNQUMtU0FNSQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQVJNU0NJSS04Ly8JCUlOVEVSTkFMCQlBUk1TQ0lJLTgJMQorbW9kdWxlCUlOVEVSTkFMCQlBUk1TQ0lJLTgvLwkJQVJNU0NJSS04CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVRDVk4vLwkJCVRDVk41NzEyLTEvLworYWxpYXMJVENWTi01NzEyLy8JCVRDVk41NzEyLTEvLworYWxpYXMJVENWTjU3MTItMToxOTkzLy8JVENWTjU3MTItMS8vCittb2R1bGUJVENWTjU3MTItMS8vCQlJTlRFUk5BTAkJVENWTjU3MTItMQkxCittb2R1bGUJSU5URVJOQUwJCVRDVk41NzEyLTEvLwkJVENWTjU3MTItMQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJRVVDLUpJU1gwMjEzLy8JCUlOVEVSTkFMCQlFVUMtSklTWDAyMTMJMQorbW9kdWxlCUlOVEVSTkFMCQlFVUMtSklTWDAyMTMvLwkJRVVDLUpJU1gwMjEzCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlTaGlmdF9KSVNYMDIxMy8vCUlOVEVSTkFMCQlTSElGVF9KSVNYMDIxMwkxCittb2R1bGUJSU5URVJOQUwJCVNoaWZ0X0pJU1gwMjEzLy8JU0hJRlRfSklTWDAyMTMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCVRTQ0lJLy8JCQlJTlRFUk5BTAkJVFNDSUkJCTEKK21vZHVsZQlJTlRFUk5BTAkJVFNDSUkvLwkJCVRTQ0lJCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJUFQxNTQvLwkJCUlOVEVSTkFMCQlQVDE1NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlQVDE1NC8vCQkJUFQxNTQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVNUUksxMDQ4LTIwMDIvLwkJUksxMDQ4Ly8KK21vZHVsZQlSSzEwNDgvLwkJSU5URVJOQUwJCVJLMTA0OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlSSzEwNDgvLwkJUksxMDQ4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTAyNS8vCQlJQk0xMDI1Ly8KK2FsaWFzCUNQMTAyNS8vCQlJQk0xMDI1Ly8KK2FsaWFzCUNTSUJNMTAyNS8vCQlJQk0xMDI1Ly8KK21vZHVsZQlJQk0xMDI1Ly8JCUlOVEVSTkFMCQlJQk0xMDI1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEwMjUvLwkJSUJNMTAyNQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExMjIvLwkJSUJNMTEyMi8vCithbGlhcwlDUDExMjIvLwkJSUJNMTEyMi8vCithbGlhcwlDU0lCTTExMjIvLwkJSUJNMTEyMi8vCittb2R1bGUJSUJNMTEyMi8vCQlJTlRFUk5BTAkJSUJNMTEyMgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTIyLy8JCUlCTTExMjIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTM3Ly8JCUlCTTExMzcvLworYWxpYXMJQ1AxMTM3Ly8JCUlCTTExMzcvLworYWxpYXMJQ1NJQk0xMTM3Ly8JCUlCTTExMzcvLworbW9kdWxlCUlCTTExMzcvLwkJSU5URVJOQUwJCUlCTTExMzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEzNy8vCQlJQk0xMTM3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE1My8vCQlJQk0xMTUzLy8KK2FsaWFzCUNQMTE1My8vCQlJQk0xMTUzLy8KK2FsaWFzCUNTSUJNMTE1My8vCQlJQk0xMTUzLy8KK21vZHVsZQlJQk0xMTUzLy8JCUlOVEVSTkFMCQlJQk0xMTUzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNTMvLwkJSUJNMTE1MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNTQvLwkJSUJNMTE1NC8vCithbGlhcwlDUDExNTQvLwkJSUJNMTE1NC8vCithbGlhcwlDU0lCTTExNTQvLwkJSUJNMTE1NC8vCittb2R1bGUJSUJNMTE1NC8vCQlJTlRFUk5BTAkJSUJNMTE1NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTU0Ly8JCUlCTTExNTQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTU1Ly8JCUlCTTExNTUvLworYWxpYXMJQ1AxMTU1Ly8JCUlCTTExNTUvLworYWxpYXMJQ1NJQk0xMTU1Ly8JCUlCTTExNTUvLworbW9kdWxlCUlCTTExNTUvLwkJSU5URVJOQUwJCUlCTTExNTUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE1NS8vCQlJQk0xMTU1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE1NS8vCQlJQk0xMTU1Ly8KK2FsaWFzCUNQMTE1NS8vCQlJQk0xMTU1Ly8KK2FsaWFzCUNTSUJNMTE1NS8vCQlJQk0xMTU1Ly8KK21vZHVsZQlJQk0xMTU1Ly8JCUlOVEVSTkFMCQlJQk0xMTU1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNTUvLwkJSUJNMTE1NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNTYvLwkJSUJNMTE1Ni8vCithbGlhcwlDUDExNTYvLwkJSUJNMTE1Ni8vCithbGlhcwlDU0lCTTExNTYvLwkJSUJNMTE1Ni8vCittb2R1bGUJSUJNMTE1Ni8vCQlJTlRFUk5BTAkJSUJNMTE1NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTU2Ly8JCUlCTTExNTYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTU3Ly8JCUlCTTExNTcvLworYWxpYXMJQ1AxMTU3Ly8JCUlCTTExNTcvLworYWxpYXMJQ1NJQk0xMTU3Ly8JCUlCTTExNTcvLworbW9kdWxlCUlCTTExNTcvLwkJSU5URVJOQUwJCUlCTTExNTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE1Ny8vCQlJQk0xMTU3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE1OC8vCQlJQk0xMTU4Ly8KK2FsaWFzCUNQMTE1OC8vCQlJQk0xMTU4Ly8KK2FsaWFzCUNTSUJNMTE1OC8vCQlJQk0xMTU4Ly8KK21vZHVsZQlJQk0xMTU4Ly8JCUlOVEVSTkFMCQlJQk0xMTU4CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNTgvLwkJSUJNMTE1OAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTgwMy8vCQlJQk04MDMvLworYWxpYXMJQ1A4MDMvLwkJSUJNODAzLy8KK2FsaWFzCUNTSUJNODAzLy8JCUlCTTgwMy8vCittb2R1bGUJSUJNODAzLy8JCUlOVEVSTkFMCQlJQk04MDMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODAzLy8JCUlCTTgwMwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkwMS8vCQlJQk05MDEvLworYWxpYXMJQ1A5MDEvLwkJSUJNOTAxLy8KK2FsaWFzCUNTSUJNOTAxLy8JCUlCTTkwMS8vCittb2R1bGUJSUJNOTAxLy8JCUlOVEVSTkFMCQlJQk05MDEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTAxLy8JCUlCTTkwMQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkwMi8vCQlJQk05MDIvLworYWxpYXMJQ1A5MDIvLwkJSUJNOTAyLy8KK2FsaWFzCUNTSUJNOTAyLy8JCUlCTTkwMi8vCittb2R1bGUJSUJNOTAyLy8JCUlOVEVSTkFMCQlJQk05MDIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTAyLy8JCUlCTTkwMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkyMS8vCQlJQk05MjEvLworYWxpYXMJQ1A5MjEvLwkJSUJNOTIxLy8KK2FsaWFzCUNTSUJNOTIxLy8JCUlCTTkyMS8vCittb2R1bGUJSUJNOTIxLy8JCUlOVEVSTkFMCQlJQk05MjEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTIxLy8JCUlCTTkyMQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEwMDgvLwkJSUJNMTAwOC8vCithbGlhcwlDUDEwMDgvLwkJSUJNMTAwOC8vCithbGlhcwlDU0lCTTEwMDgvLwkJSUJNMTAwOC8vCittb2R1bGUJSUJNMTAwOC8vCQlJTlRFUk5BTAkJSUJNMTAwOAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDA4Ly8JCUlCTTEwMDgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlJQk0xMDA4Ly8JCUlCTTQyMC8vCQlJQk0xMDA4XzQyMAkxCittb2R1bGUJSUJNNDIwLy8JCUlCTTEwMDgvLwkJSUJNMTAwOF80MjAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEwOTcvLwkJSUJNMTA5Ny8vCithbGlhcwlDUDEwOTcvLwkJSUJNMTA5Ny8vCithbGlhcwlDU0lCTTEwOTcvLwkJSUJNMTA5Ny8vCittb2R1bGUJSUJNMTA5Ny8vCQlJTlRFUk5BTAkJSUJNMTA5NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDk3Ly8JCUlCTTEwOTcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTEyLy8JCUlCTTExMTIvLworYWxpYXMJQ1AxMTEyLy8JCUlCTTExMTIvLworYWxpYXMJQ1NJQk0xMTEyLy8JCUlCTTExMTIvLworbW9kdWxlCUlCTTExMTIvLwkJSU5URVJOQUwJCUlCTTExMTIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTExMi8vCQlJQk0xMTEyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTEyMy8vCQlJQk0xMTIzLy8KK2FsaWFzCUNQMTEyMy8vCQlJQk0xMTIzLy8KK2FsaWFzCUNTSUJNMTEyMy8vCQlJQk0xMTIzLy8KK21vZHVsZQlJQk0xMTIzLy8JCUlOVEVSTkFMCQlJQk0xMTIzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMjMvLwkJSUJNMTEyMwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExMzAvLwkJSUJNMTEzMC8vCithbGlhcwlDUDExMzAvLwkJSUJNMTEzMC8vCithbGlhcwlDU0lCTTExMzAvLwkJSUJNMTEzMC8vCittb2R1bGUJSUJNMTEzMC8vCQlJTlRFUk5BTAkJSUJNMTEzMAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTMwLy8JCUlCTTExMzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQwLy8JCUlCTTExNDAvLworYWxpYXMJQ1AxMTQwLy8JCUlCTTExNDAvLworYWxpYXMJQ1NJQk0xMTQwLy8JCUlCTTExNDAvLworbW9kdWxlCUlCTTExNDAvLwkJSU5URVJOQUwJCUlCTTExNDAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0MC8vCQlJQk0xMTQwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0MS8vCQlJQk0xMTQxLy8KK2FsaWFzCUNQMTE0MS8vCQlJQk0xMTQxLy8KK2FsaWFzCUNTSUJNMTE0MS8vCQlJQk0xMTQxLy8KK21vZHVsZQlJQk0xMTQxLy8JCUlOVEVSTkFMCQlJQk0xMTQxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDEvLwkJSUJNMTE0MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDIvLwkJSUJNMTE0Mi8vCithbGlhcwlDUDExNDIvLwkJSUJNMTE0Mi8vCithbGlhcwlDU0lCTTExNDIvLwkJSUJNMTE0Mi8vCittb2R1bGUJSUJNMTE0Mi8vCQlJTlRFUk5BTAkJSUJNMTE0MgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQyLy8JCUlCTTExNDIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQzLy8JCUlCTTExNDMvLworYWxpYXMJQ1AxMTQzLy8JCUlCTTExNDMvLworYWxpYXMJQ1NJQk0xMTQzLy8JCUlCTTExNDMvLworbW9kdWxlCUlCTTExNDMvLwkJSU5URVJOQUwJCUlCTTExNDMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0My8vCQlJQk0xMTQzCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0NC8vCQlJQk0xMTQ0Ly8KK2FsaWFzCUNQMTE0NC8vCQlJQk0xMTQ0Ly8KK2FsaWFzCUNTSUJNMTE0NC8vCQlJQk0xMTQ0Ly8KK21vZHVsZQlJQk0xMTQ0Ly8JCUlOVEVSTkFMCQlJQk0xMTQ0CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDQvLwkJSUJNMTE0NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDUvLwkJSUJNMTE0NS8vCithbGlhcwlDUDExNDUvLwkJSUJNMTE0NS8vCithbGlhcwlDU0lCTTExNDUvLwkJSUJNMTE0NS8vCittb2R1bGUJSUJNMTE0NS8vCQlJTlRFUk5BTAkJSUJNMTE0NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQ1Ly8JCUlCTTExNDUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQ2Ly8JCUlCTTExNDYvLworYWxpYXMJQ1AxMTQ2Ly8JCUlCTTExNDYvLworYWxpYXMJQ1NJQk0xMTQ2Ly8JCUlCTTExNDYvLworbW9kdWxlCUlCTTExNDYvLwkJSU5URVJOQUwJCUlCTTExNDYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0Ni8vCQlJQk0xMTQ2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0Ny8vCQlJQk0xMTQ3Ly8KK2FsaWFzCUNQMTE0Ny8vCQlJQk0xMTQ3Ly8KK2FsaWFzCUNTSUJNMTE0Ny8vCQlJQk0xMTQ3Ly8KK21vZHVsZQlJQk0xMTQ3Ly8JCUlOVEVSTkFMCQlJQk0xMTQ3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDcvLwkJSUJNMTE0NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDgvLwkJSUJNMTE0OC8vCithbGlhcwlDUDExNDgvLwkJSUJNMTE0OC8vCithbGlhcwlDU0lCTTExNDgvLwkJSUJNMTE0OC8vCittb2R1bGUJSUJNMTE0OC8vCQlJTlRFUk5BTAkJSUJNMTE0OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQ4Ly8JCUlCTTExNDgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQ5Ly8JCUlCTTExNDkvLworYWxpYXMJQ1AxMTQ5Ly8JCUlCTTExNDkvLworYWxpYXMJQ1NJQk0xMTQ5Ly8JCUlCTTExNDkvLworbW9kdWxlCUlCTTExNDkvLwkJSU5URVJOQUwJCUlCTTExNDkJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0OS8vCQlJQk0xMTQ5CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE2Ni8vCQlJQk0xMTY2Ly8KK2FsaWFzCUNQMTE2Ni8vCQlJQk0xMTY2Ly8KK2FsaWFzCUNTSUJNMTE2Ni8vCQlJQk0xMTY2Ly8KK21vZHVsZQlJQk0xMTY2Ly8JCUlOVEVSTkFMCQlJQk0xMTY2CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNjYvLwkJSUJNMTE2NgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjcvLwkJSUJNMTE2Ny8vCithbGlhcwlDUDExNjcvLwkJSUJNMTE2Ny8vCithbGlhcwlDU0lCTTExNjcvLwkJSUJNMTE2Ny8vCittb2R1bGUJSUJNMTE2Ny8vCQlJTlRFUk5BTAkJSUJNMTE2NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTY3Ly8JCUlCTTExNjcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS00NTE3Ly8JCUlCTTQ1MTcvLworYWxpYXMJQ1A0NTE3Ly8JCUlCTTQ1MTcvLworYWxpYXMJQ1NJQk00NTE3Ly8JCUlCTTQ1MTcvLworbW9kdWxlCUlCTTQ1MTcvLwkJSU5URVJOQUwJCUlCTTQ1MTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDUxNy8vCQlJQk00NTE3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tNDg5OS8vCQlJQk00ODk5Ly8KK2FsaWFzCUNQNDg5OS8vCQlJQk00ODk5Ly8KK2FsaWFzCUNTSUJNNDg5OS8vCQlJQk00ODk5Ly8KK21vZHVsZQlJQk00ODk5Ly8JCUlOVEVSTkFMCQlJQk00ODk5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTQ4OTkvLwkJSUJNNDg5OQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTQ5MDkvLwkJSUJNNDkwOS8vCithbGlhcwlDUDQ5MDkvLwkJSUJNNDkwOS8vCithbGlhcwlDU0lCTTQ5MDkvLwkJSUJNNDkwOS8vCittb2R1bGUJSUJNNDkwOS8vCQlJTlRFUk5BTAkJSUJNNDkwOQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00OTA5Ly8JCUlCTTQ5MDkJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS00OTcxLy8JCUlCTTQ5NzEvLworYWxpYXMJQ1A0OTcxLy8JCUlCTTQ5NzEvLworYWxpYXMJQ1NJQk00OTcxLy8JCUlCTTQ5NzEvLworbW9kdWxlCUlCTTQ5NzEvLwkJSU5URVJOQUwJCUlCTTQ5NzEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDk3MS8vCQlJQk00OTcxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tNTM0Ny8vCQlJQk01MzQ3Ly8KK2FsaWFzCUNQNTM0Ny8vCQlJQk01MzQ3Ly8KK2FsaWFzCUNTSUJNNTM0Ny8vCQlJQk01MzQ3Ly8KK21vZHVsZQlJQk01MzQ3Ly8JCUlOVEVSTkFMCQlJQk01MzQ3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTUzNDcvLwkJSUJNNTM0NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkwMzAvLwkJSUJNOTAzMC8vCithbGlhcwlDUDkwMzAvLwkJSUJNOTAzMC8vCithbGlhcwlDU0lCTTkwMzAvLwkJSUJNOTAzMC8vCittb2R1bGUJSUJNOTAzMC8vCQlJTlRFUk5BTAkJSUJNOTAzMAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MDMwLy8JCUlCTTkwMzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MDY2Ly8JCUlCTTkwNjYvLworYWxpYXMJQ1A5MDY2Ly8JCUlCTTkwNjYvLworYWxpYXMJQ1NJQk05MDY2Ly8JCUlCTTkwNjYvLworbW9kdWxlCUlCTTkwNjYvLwkJSU5URVJOQUwJCUlCTTkwNjYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTA2Ni8vCQlJQk05MDY2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTQ0OC8vCQlJQk05NDQ4Ly8KK2FsaWFzCUNQOTQ0OC8vCQlJQk05NDQ4Ly8KK2FsaWFzCUNTSUJNOTQ0OC8vCQlJQk05NDQ4Ly8KK21vZHVsZQlJQk05NDQ4Ly8JCUlOVEVSTkFMCQlJQk05NDQ4CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTk0NDgvLwkJSUJNOTQ0OAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEyNzEyLy8JCUlCTTEyNzEyLy8KK2FsaWFzCUNQMTI3MTIvLwkJSUJNMTI3MTIvLworYWxpYXMJQ1NJQk0xMjcxMi8vCQlJQk0xMjcxMi8vCittb2R1bGUJSUJNMTI3MTIvLwkJSU5URVJOQUwJCUlCTTEyNzEyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEyNzEyLy8JCUlCTTEyNzEyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTY4MDQvLwkJSUJNMTY4MDQvLworYWxpYXMJQ1AxNjgwNC8vCQlJQk0xNjgwNC8vCithbGlhcwlDU0lCTTE2ODA0Ly8JCUlCTTE2ODA0Ly8KK21vZHVsZQlJQk0xNjgwNC8vCQlJTlRFUk5BTAkJSUJNMTY4MDQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTY4MDQvLwkJSUJNMTY4MDQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMzY0Ly8JCUlCTTEzNjQvLworYWxpYXMJQ1AxMzY0Ly8JCUlCTTEzNjQvLworYWxpYXMJQ1NJQk0xMzY0Ly8JCUlCTTEzNjQvLworbW9kdWxlCUlCTTEzNjQvLwkJSU5URVJOQUwJCUlCTTEzNjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTM2NC8vCQlJQk0xMzY0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTM3MS8vCQlJQk0xMzcxLy8KK2FsaWFzCUNQMTM3MS8vCQlJQk0xMzcxLy8KK2FsaWFzCUNTSUJNMTM3MS8vCQlJQk0xMzcxLy8KK21vZHVsZQlJQk0xMzcxLy8JCUlOVEVSTkFMCQlJQk0xMzcxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEzNzEvLwkJSUJNMTM3MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEzODgvLwkJSUJNMTM4OC8vCithbGlhcwlDUDEzODgvLwkJSUJNMTM4OC8vCithbGlhcwlDU0lCTTEzODgvLwkJSUJNMTM4OC8vCittb2R1bGUJSUJNMTM4OC8vCQlJTlRFUk5BTAkJSUJNMTM4OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMzg4Ly8JCUlCTTEzODgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMzkwLy8JCUlCTTEzOTAvLworYWxpYXMJQ1AxMzkwLy8JCUlCTTEzOTAvLworYWxpYXMJQ1NJQk0xMzkwLy8JCUlCTTEzOTAvLworbW9kdWxlCUlCTTEzOTAvLwkJSU5URVJOQUwJCUlCTTEzOTAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTM5MC8vCQlJQk0xMzkwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTM5OS8vCQlJQk0xMzk5Ly8KK2FsaWFzCUNQMTM5OS8vCQlJQk0xMzk5Ly8KK2FsaWFzCUNTSUJNMTM5OS8vCQlJQk0xMzk5Ly8KK21vZHVsZQlJQk0xMzk5Ly8JCUlOVEVSTkFMCQlJQk0xMzk5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEzOTkvLwkJSUJNMTM5OQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPL1RSXzExNTQ4LTEvCQlJU09fMTE1NDgtMS8vCithbGlhcwlJU08xMTU0OC0xLy8JCUlTT18xMTU0OC0xLy8KK21vZHVsZQlJU09fMTE1NDgtMS8vCQlJTlRFUk5BTAkJSVNPXzExNTQ4LTEJMQorbW9kdWxlCUlOVEVSTkFMCQlJU09fMTE1NDgtMS8vCQlJU09fMTE1NDgtMQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJTUlLLy8JCQlJTlRFUk5BTAkJTUlLCQkxCittb2R1bGUJSU5URVJOQUwJCU1JSy8vCQkJTUlLCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQlJGLy8JCQlJTlRFUk5BTAkJQlJGCQkxCittb2R1bGUJSU5URVJOQUwJCUJSRi8vCQkJQlJGCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDEyODIvLwkJTUFDLUNFTlRSQUxFVVJPUEUvLworbW9kdWxlCU1BQy1DRU5UUkFMRVVST1BFLy8JSU5URVJOQUwJCU1BQy1DRU5UUkFMRVVST1BFIDEKK21vZHVsZQlJTlRFUk5BTAkJTUFDLUNFTlRSQUxFVVJPUEUvLwlNQUMtQ0VOVFJBTEVVUk9QRSAxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJS09JOC1SVS8vCQlJTlRFUk5BTAkJS09JOC1SVQkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0k4LVJVLy8JCUtPSTgtUlUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTT184ODU5LTlFLy8JCUlTTy04ODU5LTlFLy8KK2FsaWFzCUlTTzg4NTktOUUvLwkJSVNPLTg4NTktOUUvLworYWxpYXMJSVNPODg1OTlFLy8JCUlTTy04ODU5LTlFLy8KK21vZHVsZQlJU08tODg1OS05RS8vCQlJTlRFUk5BTAkJSVNPODg1OS05RQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTlFLy8JCUlTTzg4NTktOUUJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJUk9NQU45Ly8JCUhQLVJPTUFOOS8vCithbGlhcwlSOS8vCQkJSFAtUk9NQU45Ly8KK2FsaWFzCUhQUk9NQU45Ly8JCUhQLVJPTUFOOS8vCittb2R1bGUJSFAtUk9NQU45Ly8JCUlOVEVSTkFMCQlIUC1ST01BTjkJMQorbW9kdWxlCUlOVEVSTkFMCQlIUC1ST01BTjkvLwkJSFAtUk9NQU45CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVRVUktJU0g4Ly8JCUhQLVRVUktJU0g4Ly8KK2FsaWFzCUhQVFVSS0lTSDgvLwkJSFAtVFVSS0lTSDgvLworYWxpYXMJT1NGMTAwMTAwMDYvLwkJSFAtVFVSS0lTSDgvLworbW9kdWxlCUhQLVRVUktJU0g4Ly8JCUlOVEVSTkFMCQlIUC1UVVJLSVNIOAkxCittb2R1bGUJSU5URVJOQUwJCUhQLVRVUktJU0g4Ly8JCUhQLVRVUktJU0g4CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVRIQUk4Ly8JCQlIUC1USEFJOC8vCithbGlhcwlIUFRIQUk4Ly8JCUhQLVRIQUk4Ly8KK21vZHVsZQlIUC1USEFJOC8vCQlJTlRFUk5BTAkJSFAtVEhBSTgJMQorbW9kdWxlCUlOVEVSTkFMCQlIUC1USEFJOC8vCQlIUC1USEFJOAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlIUEdSRUVLOC8vCQlIUC1HUkVFSzgvLworYWxpYXMJT1NGMTAwMTAwMDQvLwkJSFAtR1JFRUs4Ly8KK21vZHVsZQlIUC1HUkVFSzgvLwkJSU5URVJOQUwJCUhQLUdSRUVLOAkxCittb2R1bGUJSU5URVJOQUwJCUhQLUdSRUVLOC8vCQlIUC1HUkVFSzgJMQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvZ2NvbnYtbW9kdWxlcy5jYWNoZSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2djb252LW1vZHVsZXMuY2FjaGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhNDgzZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2djb252LW1vZHVsZXMuY2FjaGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliQ05TLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliQ05TLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjODc5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9saWJDTlMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliR0Iuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9saWJHQi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTY2MWZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliR0Iuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliSVNPSVIxNjUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9saWJJU09JUjE2NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDYwYzBhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliSVNPSVIxNjUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliSklTLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliSklTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTU2OGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9saWJKSVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliSklTWDAyMTMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9saWJKSVNYMDIxMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjI4YjcxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliSklTWDAyMTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliS1NDLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliS1NDLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNjRhNTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9nY29udi9saWJLU0Muc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvZ2NydDEubyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djcnQxLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlODA2NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2djcnQxLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGQtMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xkLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDIzMDZkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xkLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGQtbGludXguc28uMiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xkLWxpbnV4LnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uODY3NmQyMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xkLWxpbnV4LnNvLjIKQEAgLTAsMCArMSBAQAorbGQtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYkJyb2tlbkxvY2FsZS0yLjE1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliQnJva2VuTG9jYWxlLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwMmY2OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYkJyb2tlbkxvY2FsZS0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYkJyb2tlbkxvY2FsZS5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliQnJva2VuTG9jYWxlLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1MjRjYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYkJyb2tlbkxvY2FsZS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYkJyb2tlbkxvY2FsZS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYkJyb2tlbkxvY2FsZS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42ODEwNGMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliQnJva2VuTG9jYWxlLnNvCkBAIC0wLDAgKzEgQEAKK2xpYkJyb2tlbkxvY2FsZS5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliQnJva2VuTG9jYWxlLnNvLjEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJCcm9rZW5Mb2NhbGUuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43ODllZDFiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliQnJva2VuTG9jYWxlLnNvLjEKQEAgLTAsMCArMSBAQAorbGliQnJva2VuTG9jYWxlLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJHTC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYkdMLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZjM2EwM2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJHTC5zbwpAQCAtMCwwICsxIEBACitsaWJHTC5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlNlZ0ZhdWx0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliU2VnRmF1bHQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1OGQzOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlNlZ0ZhdWx0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlgxMS5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWDExLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkYzFlNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlgxMS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlgxMS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlgxMS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zODc3ZGI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWDExLnNvCkBAIC0wLDAgKzEgQEAKK2xpYlgxMS5zby42LjMuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlgxMS5zby42IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWDExLnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzg3N2RiNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlgxMS5zby42CkBAIC0wLDAgKzEgQEAKK2xpYlgxMS5zby42LjMuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlgxMS5zby42LjMuMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlgxMS5zby42LjMuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDgwZDEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWDExLnNvLjYuMy4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhhdS5zby42IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGF1LnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzM5NjM2YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhhdS5zby42CkBAIC0wLDAgKzEgQEAKK2xpYlhhdS5zby42LjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhhdS5zby42LjAuMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhhdS5zby42LjAuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWZmODE0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGF1LnNvLjYuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhkYW1hZ2Uuc28uMSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhkYW1hZ2Uuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hNjFkOTFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGRhbWFnZS5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYlhkYW1hZ2Uuc28uMS4xLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJYZGFtYWdlLnNvLjEuMS4wIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGRhbWFnZS5zby4xLjEuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTE1Mjc3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGRhbWFnZS5zby4xLjEuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJYZG1jcC5zby42IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGRtY3Auc28uNgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iYmY0NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGRtY3Auc28uNgpAQCAtMCwwICsxIEBACitsaWJYZG1jcC5zby42LjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhkbWNwLnNvLjYuMC4wIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGRtY3Auc28uNi4wLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1NDU4YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhkbWNwLnNvLjYuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhleHQuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhleHQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTdkZjcyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGV4dC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhleHQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJYZXh0LnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQ2NWY4MDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJYZXh0LnNvCkBAIC0wLDAgKzEgQEAKK2xpYlhleHQuc28uNi40LjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJYZXh0LnNvLjYgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJYZXh0LnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDY1ZjgwNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhleHQuc28uNgpAQCAtMCwwICsxIEBACitsaWJYZXh0LnNvLjYuNC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGV4dC5zby42LjQuMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhleHQuc28uNi40LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlMjI4ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhleHQuc28uNi40LjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGZpeGVzLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJYZml4ZXMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmNkOTFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGZpeGVzLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGZpeGVzLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGZpeGVzLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjkyN2RhOTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJYZml4ZXMuc28KQEAgLTAsMCArMSBAQAorbGliWGZpeGVzLnNvLjMuMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGZpeGVzLnNvLjMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJYZml4ZXMuc28uMwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45MjdkYTk5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGZpeGVzLnNvLjMKQEAgLTAsMCArMSBAQAorbGliWGZpeGVzLnNvLjMuMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGZpeGVzLnNvLjMuMS4wIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGZpeGVzLnNvLjMuMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNzQwZjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJYZml4ZXMuc28uMy4xLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGkuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhpLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2MzQxMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhpLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGkuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJYaS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41OTJjOGY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWGkuc28KQEAgLTAsMCArMSBAQAorbGliWGkuc28uNi4xLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJYeGY4NnZtLnNvLjEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJYeGY4NnZtLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZTk5MWZmOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlh4Zjg2dm0uc28uMQpAQCAtMCwwICsxIEBACitsaWJYeGY4NnZtLnNvLjEuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliWHhmODZ2bS5zby4xLjAuMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlh4Zjg2dm0uc28uMS4wLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5NzMwYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlh4Zjg2dm0uc28uMS4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYWNsLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhY2wuYQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iYmFiNzVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYWNsLmEKQEAgLTAsMCArMSBAQAorbGliYWNsLmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhY2wuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhY2wuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjI5MzMyMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFjbC5zbwpAQCAtMCwwICsxIEBACitsaWJhY2wuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFjbC5zby4xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYWNsLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMDliZjA1NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFjbC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmFjbC5zby4xLjEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFjbC5zby4xLjEuMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFjbC5zby4xLjEuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTQ4NzQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYWNsLnNvLjEuMS4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFubC0yLjE1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYW5sLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzYmY0NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFubC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFubC5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYW5sLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlMmQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFubC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFubC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFubC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40ZjBjNGM1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYW5sLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmFubC5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYW5sLnNvLjEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhbmwuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40YzRkNjY2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYW5sLnNvLjEKQEAgLTAsMCArMSBAQAorbGliYW5sLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhc291bmQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhc291bmQuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDJkZmM5OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFzb3VuZC5zbwpAQCAtMCwwICsxIEBACitsaWJhc291bmQuc28uMi4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhc291bmQuc28uMiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFzb3VuZC5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQyZGZjOTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhc291bmQuc28uMgpAQCAtMCwwICsxIEBACitsaWJhc291bmQuc28uMi4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhc291bmQuc28uMi4wLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhc291bmQuc28uMi4wLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1YTE2YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFzb3VuZC5zby4yLjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhdHRyLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhdHRyLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDViYTIxMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmF0dHIuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhdHRyLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYXR0ci5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lYjMyZDVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYXR0ci5zbwpAQCAtMCwwICsxIEBACitsaWJhdHRyLnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYXR0ci5zby4xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYXR0ci5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjNiZjA3ODgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhdHRyLnNvLjEKQEAgLTAsMCArMSBAQAorbGliYXR0ci5zby4xLjEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmF0dHIuc28uMS4xLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhdHRyLnNvLjEuMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWU2NjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJhdHRyLnNvLjEuMS4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmF1ZGlvZmlsZS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmF1ZGlvZmlsZS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42ZjgzOTdjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYXVkaW9maWxlLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmF1ZGlvZmlsZS5zby4xLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmJzZC1jb21wYXQuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmJzZC1jb21wYXQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjE1ZDY3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYnNkLWNvbXBhdC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmMtMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmMtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YzExMTIxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYy0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmMuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGY3M2Q0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzA4MmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjLnNvCkBAIC0wLDAgKzEsNSBAQAorLyogR05VIGxkIHNjcmlwdAorICAgVXNlIHRoZSBzaGFyZWQgbGlicmFyeSwgYnV0IHNvbWUgZnVuY3Rpb25zIGFyZSBvbmx5IGluCisgICB0aGUgc3RhdGljIGxpYnJhcnksIHNvIHRyeSB0aGF0IHNlY29uZGFyaWx5LiAgKi8KK09VVFBVVF9GT1JNQVQoZWxmMzItaTM4NikKK0dST1VQICggbGliYy5zby42IGxpYmNfbm9uc2hhcmVkLmEgIEFTX05FRURFRCAoIGxkLWxpbnV4LnNvLjIgKSApCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjLnNvLjYgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjLnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYThmNDJjZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmMuc28uNgpAQCAtMCwwICsxIEBACitsaWJjLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjX25vbnNoYXJlZC5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY19ub25zaGFyZWQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGZjZWY2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY19ub25zaGFyZWQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjYXAuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNhcC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OTU4MWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjYXAuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjYXAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjYXAuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uM2RmMWY2OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNhcC5zbwpAQCAtMCwwICsxIEBACitsaWJjYXAuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNhcC5zby4yIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY2FwLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjZkNWZlNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNhcC5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYmNhcC5zby4yLjIyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY2FwLnNvLjIuMjIgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjYXAuc28uMi4yMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjAwODdkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY2FwLnNvLjIuMjIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY2lkbi0yLjE1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY2lkbi0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNWMyOTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjaWRuLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY2lkbi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNpZG4uc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzBhMDFhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNpZG4uc28KQEAgLTAsMCArMSBAQAorbGliY2lkbi5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY2lkbi5zby4xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY2lkbi5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmY5ZjdmYzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjaWRuLnNvLjEKQEAgLTAsMCArMSBAQAorbGliY2lkbi0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY3J5cHQtMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNyeXB0LTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkYzE1YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNyeXB0LTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY3J5cHQuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNyeXB0LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlODE1ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNyeXB0LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY3J5cHQuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjcnlwdC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zYjExZmZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliY3J5cHQuc28KQEAgLTAsMCArMSBAQAorbGliY3J5cHQuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNyeXB0LnNvLjEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjcnlwdC5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmI0YjljMzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjcnlwdC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmNyeXB0LTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjdXJzZXMuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmN1cnNlcy5hCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU3NDU2MTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjdXJzZXMuYQpAQCAtMCwwICsxIEBACitsaWJuY3Vyc2VzLmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjdXJzZXMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJjdXJzZXMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjdmOGU2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmN1cnNlcy5zbwpAQCAtMCwwICsxIEBACitsaWJuY3Vyc2VzLnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliZGwtMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmRsLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyMzU3MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmRsLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliZGwuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmRsLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjZTZiNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmRsLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliZGwuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJkbC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42OTFmMTk5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliZGwuc28KQEAgLTAsMCArMSBAQAorbGliZGwuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmRsLnNvLjIgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJkbC5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmVhNTFhN2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJkbC5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYmRsLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJkcm0uc28uMiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmRybS5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjZkZjIzZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJkcm0uc28uMgpAQCAtMCwwICsxIEBACitsaWJkcm0uc28uMi40LjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJkcm0uc28uMi40LjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJkcm0uc28uMi40LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzYTU0YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmRybS5zby4yLjQuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJlc2QuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmVzZC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODIyNjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJlc2QuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJlc2Quc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJlc2Quc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZmQ1NDE0MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmVzZC5zbwpAQCAtMCwwICsxIEBACitsaWJlc2Quc28uMC4yLjM5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliZm9ybS5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliZm9ybS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODBmMzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJmb3JtLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliZm9ybS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmZvcm0uc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMTBlOTE2OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmZvcm0uc28KQEAgLTAsMCArMSBAQAorbGliZm9ybS5zby41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliZm9ybS5zby41IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliZm9ybS5zby41Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZhZDJlNzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJmb3JtLnNvLjUKQEAgLTAsMCArMSBAQAorbGliZm9ybS5zby41LjkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJmb3JtLnNvLjUuOSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmZvcm0uc28uNS45Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODU2NjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJmb3JtLnNvLjUuOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJnLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJnLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkMmRmZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmcuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJpZWVlLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJpZWVlLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1Yzk4ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmllZWUuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtLTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5NzRhNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm0tMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyY2I2MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm0uYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jNjA3OTdkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibS5zbwpAQCAtMCwwICsxIEBACitsaWJtLnNvLjYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtLnNvLjYgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtLnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzY3YmQzZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm0uc28uNgpAQCAtMCwwICsxIEBACitsaWJtLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtY2hlY2suYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm1jaGVjay5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MTBlYjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtY2hlY2suYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtZW11c2FnZS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm1lbXVzYWdlLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNmM4MjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtZW11c2FnZS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtZW51LmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtZW51LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwZmI5NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm1lbnUuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtZW51LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibWVudS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iMTJiNWNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibWVudS5zbwpAQCAtMCwwICsxIEBACitsaWJtZW51LnNvLjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtZW51LnNvLjUgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJtZW51LnNvLjUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDFhMTk5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm1lbnUuc28uNQpAQCAtMCwwICsxIEBACitsaWJtZW51LnNvLjUuOQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm1lbnUuc28uNS45IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibWVudS5zby41LjkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhYWM2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm1lbnUuc28uNS45CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5jdXJzZXMrKy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibmN1cnNlcysrLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllOGMyMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5jdXJzZXMrKy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5jdXJzZXMuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5jdXJzZXMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWNjMGY4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibmN1cnNlcy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5jdXJzZXMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuY3Vyc2VzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDk1M2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuY3Vyc2VzLnNvCkBAIC0wLDAgKzEgQEAKK0lOUFVUKGxpYm5jdXJzZXMuc28uNSAtbHRpbmZvKQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibmN1cnNlcy5zby41IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibmN1cnNlcy5zby41Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjcyY2FhZjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuY3Vyc2VzLnNvLjUKQEAgLTAsMCArMSBAQAorbGlibmN1cnNlcy5zby41LjkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuY3Vyc2VzLnNvLjUuOSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5jdXJzZXMuc28uNS45Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYzkzYmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuY3Vyc2VzLnNvLjUuOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc2wtMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zbC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNzM5YTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc2wtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc2wuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zbC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODU5MjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc2wuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc2wuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc2wuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjhkMTZkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zbC5zbwpAQCAtMCwwICsxIEBACitsaWJuc2wuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zbC5zby4xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNsLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzk4OTZmOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zbC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYm5zbC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2NvbXBhdC0yLjE1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2NvbXBhdC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YWE5MDMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfY29tcGF0LTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2NvbXBhdC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19jb21wYXQuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjBmYTE3ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19jb21wYXQuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX2NvbXBhdC5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2NvbXBhdC5zby4yIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2NvbXBhdC5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmFhNTg5N2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfY29tcGF0LnNvLjIKQEAgLTAsMCArMSBAQAorbGlibnNzX2NvbXBhdC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2RiLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2RiLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmEzODk5YWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZGIuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX2RiLnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZG5zLTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZG5zLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyM2Q2NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19kbnMtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZG5zLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2Rucy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43ZDdhMTY4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2Rucy5zbwpAQCAtMCwwICsxIEBACitsaWJuc3NfZG5zLnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZG5zLnNvLjIgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZG5zLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjk3MzhhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19kbnMuc28uMgpAQCAtMCwwICsxIEBACitsaWJuc3NfZG5zLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZmlsZXMtMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19maWxlcy0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzYwODIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZmlsZXMtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZmlsZXMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZmlsZXMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMmI5ZTM5OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19maWxlcy5zbwpAQCAtMCwwICsxIEBACitsaWJuc3NfZmlsZXMuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19maWxlcy5zby4yIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2ZpbGVzLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZTc5NmFhNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19maWxlcy5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19maWxlcy0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2hlc2lvZC0yLjE1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2hlc2lvZC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NzVhNDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfaGVzaW9kLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2hlc2lvZC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19oZXNpb2Quc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZmQ3ZjE3NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19oZXNpb2Quc28KQEAgLTAsMCArMSBAQAorbGlibnNzX2hlc2lvZC5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2hlc2lvZC5zby4yIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2hlc2lvZC5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmI2MWE3MzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfaGVzaW9kLnNvLjIKQEAgLTAsMCArMSBAQAorbGlibnNzX2hlc2lvZC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX25pcy0yLjE1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX25pcy0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZDU5OWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfbmlzLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX25pcy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19uaXMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTQwMzY1MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19uaXMuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX25pcy5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX25pcy5zby4yIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX25pcy5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjlmODk2YTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfbmlzLnNvLjIKQEAgLTAsMCArMSBAQAorbGlibnNzX25pcy0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX25pc3BsdXMtMi4xNS5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19uaXNwbHVzLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzMmVlYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19uaXNwbHVzLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX25pc3BsdXMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfbmlzcGx1cy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iYTYxOGYxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX25pc3BsdXMuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX25pc3BsdXMuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19uaXNwbHVzLnNvLjIgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfbmlzcGx1cy5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjdlNDUwNmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfbmlzcGx1cy5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19uaXNwbHVzLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwYW5lbC5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicGFuZWwuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGEyYzU5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicGFuZWwuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwYW5lbC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnBhbmVsLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmI1Y2Q0YTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwYW5lbC5zbwpAQCAtMCwwICsxIEBACitsaWJwYW5lbC5zby41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicGFuZWwuc28uNSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnBhbmVsLnNvLjUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTY5NDc5OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnBhbmVsLnNvLjUKQEAgLTAsMCArMSBAQAorbGlicGFuZWwuc28uNS45ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicGFuZWwuc28uNS45IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicGFuZWwuc28uNS45Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTBkNzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwYW5lbC5zby41LjkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicGNwcm9maWxlLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicGNwcm9maWxlLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWVkZjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwY3Byb2ZpbGUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHRocmVhZC0yLjE1LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHRocmVhZC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE0YmZjMjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwdGhyZWFkLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHRocmVhZC5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHRocmVhZC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExODQ0NDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwdGhyZWFkLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHRocmVhZC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB0aHJlYWQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkN2M5MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB0aHJlYWQuc28KQEAgLTAsMCArMSw1IEBACisvKiBHTlUgbGQgc2NyaXB0CisgICBVc2UgdGhlIHNoYXJlZCBsaWJyYXJ5LCBidXQgc29tZSBmdW5jdGlvbnMgYXJlIG9ubHkgaW4KKyAgIHRoZSBzdGF0aWMgbGlicmFyeSwgc28gdHJ5IHRoYXQgc2Vjb25kYXJpbHkuICAqLworT1VUUFVUX0ZPUk1BVChlbGYzMi1pMzg2KQorR1JPVVAgKCBsaWJwdGhyZWFkLnNvLjAgbGlicHRocmVhZF9ub25zaGFyZWQuYSApCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwdGhyZWFkLnNvLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwdGhyZWFkLnNvLjAKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjE1OTdiMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB0aHJlYWQuc28uMApAQCAtMCwwICsxIEBACitsaWJwdGhyZWFkLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwdGhyZWFkX25vbnNoYXJlZC5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHRocmVhZF9ub25zaGFyZWQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTA4MzJiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHRocmVhZF9ub25zaGFyZWQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwdWxzZS1tYWlubG9vcC1nbGliLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mNDY2YjRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5zbwpAQCAtMCwwICsxIEBACitsaWJwdWxzZS1tYWlubG9vcC1nbGliLnNvLjAuMC40ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Utc2ltcGxlLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Utc2ltcGxlLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjJmNjVkNWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwdWxzZS1zaW1wbGUuc28KQEAgLTAsMCArMSBAQAorbGlicHVsc2Utc2ltcGxlLnNvLjAuMC4zClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Utc2ltcGxlLnNvLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwdWxzZS1zaW1wbGUuc28uMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yZjY1ZDVjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Utc2ltcGxlLnNvLjAKQEAgLTAsMCArMSBAQAorbGlicHVsc2Utc2ltcGxlLnNvLjAuMC4zClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Utc2ltcGxlLnNvLjAuMC4zIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Utc2ltcGxlLnNvLjAuMC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MmRjMTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwdWxzZS1zaW1wbGUuc28uMC4wLjMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Uuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwdWxzZS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44ZWRlNmE3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Uuc28KQEAgLTAsMCArMSBAQAorbGlicHVsc2Uuc28uMC4xMy41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Uuc28uMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLnNvLjAKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOGVkZTZhNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLnNvLjAKQEAgLTAsMCArMSBAQAorbGlicHVsc2Uuc28uMC4xMy41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Uuc28uMC4xMy41IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Uuc28uMC4xMy41Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNDBhYWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwdWxzZS5zby4wLjEzLjUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Vjb21tb24tMS4xLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Vjb21tb24tMS4xLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYzVhNGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJwdWxzZWNvbW1vbi0xLjEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicmVzb2x2LTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJyZXNvbHYtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmYyZmI4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicmVzb2x2LTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicmVzb2x2LmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJyZXNvbHYuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWIxNmI5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicmVzb2x2LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicmVzb2x2LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicmVzb2x2LnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmJmNmMxN2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJyZXNvbHYuc28KQEAgLTAsMCArMSBAQAorbGlicmVzb2x2LnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJyZXNvbHYuc28uMiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJlc29sdi5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjI4M2E5MjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJyZXNvbHYuc28uMgpAQCAtMCwwICsxIEBACitsaWJyZXNvbHYtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJwY3N2Yy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicnBjc3ZjLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmYjA5NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJwY3N2Yy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJ0LTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJydC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkM2Q4OGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJydC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJ0LmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJydC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDRlMjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJydC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJ0LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicnQuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMDgyMGRmNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJ0LnNvCkBAIC0wLDAgKzEgQEAKK2xpYnJ0LnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJydC5zby4xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicnQuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iNjc4ZTAxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlicnQuc28uMQpAQCAtMCwwICsxIEBACitsaWJydC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidGVybWNhcC5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidGVybWNhcC5hCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjI2MTE3MzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0ZXJtY2FwLmEKQEAgLTAsMCArMSBAQAorbGlidGluZm8uYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRlcm1jYXAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0ZXJtY2FwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMzU1ODMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0ZXJtY2FwLnNvCkBAIC0wLDAgKzEsMyBAQAorLyogV2UgdXNlIGEgbGlua2VyIHNjcmlwdCByYXRoZXIgdGhhbiBhIHN5bWxpbmsgdG8gd29yayBhcm91bmQKKyAgIGFuIGxkY29uZmlnIGJ1Zywgc2VlIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvMjQ5MTIyLiAqLworR1JPVVAoIGxpYnRpbmZvLnNvICkKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRocmVhZF9kYi0xLjAuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0aHJlYWRfZGItMS4wLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOWExNWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0aHJlYWRfZGItMS4wLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRocmVhZF9kYi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRocmVhZF9kYi5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zOTE5NDU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidGhyZWFkX2RiLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnRocmVhZF9kYi5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidGhyZWFkX2RiLnNvLjEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0aHJlYWRfZGIuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iYzUyNTE0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidGhyZWFkX2RiLnNvLjEKQEAgLTAsMCArMSBAQAorbGlidGhyZWFkX2RiLTEuMC5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpYy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhMzBkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpYy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpYy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iMjhjNTViCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidGljLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnRpYy5zby41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidGljLnNvLjUgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0aWMuc28uNQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41OGY0NWFmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidGljLnNvLjUKQEAgLTAsMCArMSBAQAorbGlidGljLnNvLjUuOQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpYy5zby41LjkgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0aWMuc28uNS45Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOWExZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0aWMuc28uNS45CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpbmZvLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0aW5mby5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZDY3N2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0aW5mby5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpbmZvLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidGluZm8uc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNGZhYjg5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpbmZvLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnRpbmZvLnNvLjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0aW5mby5zby41IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidGluZm8uc28uNQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jZjliZDE3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidGluZm8uc28uNQpAQCAtMCwwICsxIEBACitsaWJ0aW5mby5zby41LjkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0aW5mby5zby41LjkgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ0aW5mby5zby41LjkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxOGQ3NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpbmZvLnNvLjUuOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ1dGlsLTIuMTUuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ1dGlsLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmM2RmMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnV0aWwtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ1dGlsLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ1dGlsLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlNWY2MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnV0aWwuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ1dGlsLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidXRpbC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iM2FmNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGlidXRpbC5zbwpAQCAtMCwwICsxIEBACitsaWJ1dGlsLnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ1dGlsLnNvLjEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ1dGlsLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNWZmYTNkMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnV0aWwuc28uMQpAQCAtMCwwICsxIEBACitsaWJ1dGlsLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ4Y2IuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnhjYi5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDQwMDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ4Y2IuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ4Y2Iuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ4Y2Iuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZTg1OGQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnhjYi5zbwpAQCAtMCwwICsxIEBACitsaWJ4Y2Iuc28uMS4xLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ4Y2Iuc28uMSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnhjYi5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmU4NThkNDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ4Y2Iuc28uMQpAQCAtMCwwICsxIEBACitsaWJ4Y2Iuc28uMS4xLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ4Y2Iuc28uMS4xLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ4Y2Iuc28uMS4xLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlODBiNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnhjYi5zby4xLjEuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ6LmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ6LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4ZmJhYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnouYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ6LnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliei5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42OTNhNWRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbGliei5zbwpAQCAtMCwwICsxIEBACitsaWJ6LnNvLjEuMi4zLjQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ6LnNvLjEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ6LnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjkzYTVkZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnouc28uMQpAQCAtMCwwICsxIEBACitsaWJ6LnNvLjEuMi4zLjQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ6LnNvLjEuMi4zLjQgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9saWJ6LnNvLjEuMi4zLjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmYTZlMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnouc28uMS4yLjMuNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9tZXNhL2xkLnNvLmNvbmYgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9tZXNhL2xkLnNvLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmZTM1MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL21lc2EvbGQuc28uY29uZgpAQCAtMCwwICsxIEBACisvdXNyL2xpYi9pMzg2LWxpbnV4LWdudS9tZXNhCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9tZXNhL2xpYkdMLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbWVzYS9saWJHTC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zY2RkOWMwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbWVzYS9saWJHTC5zbwpAQCAtMCwwICsxIEBACitsaWJHTC5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbWVzYS9saWJHTC5zby4xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbWVzYS9saWJHTC5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmMwYWI4YzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9tZXNhL2xpYkdMLnNvLjEKQEAgLTAsMCArMSBAQAorbGliR0wuc28uMS4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbWVzYS9saWJHTC5zby4xLjIgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9tZXNhL2xpYkdMLnNvLjEuMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTJlNWIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvbWVzYS9saWJHTC5zby4xLjIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2Fsc2EucGMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvYWxzYS5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjk5ZTdmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2Fsc2EucGMKQEAgLTAsMCArMSwxNCBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PS91c3IKK2xpYmRpcj0ke3ByZWZpeH0vbGliL2kzODYtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK05hbWU6IGFsc2EKK0Rlc2NyaXB0aW9uOiBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgKEFMU0EpIC0gTGlicmFyeQorVmVyc2lvbjogMS4wLjI1CitSZXF1aXJlczogCitMaWJzOiAtTCR7bGliZGlyfSAtbGFzb3VuZAorTGlicy5wcml2YXRlOiAtbG0gLWxkbCAtbHB0aHJlYWQgLWxydAorIyAtSSR7aW5jbHVkZWRpcn0vYWxzYSBiZWxvdyBpcyBqdXN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisjIChpdCB3YXMgc2V0IHNvIG1pc3Rha2VseSBpbiB0aGUgb2xkZXIgdmVyc2lvbikKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1JJHtpbmNsdWRlZGlyfS9hbHNhCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvYXVkaW9maWxlLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2F1ZGlvZmlsZS5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTVmZWYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2F1ZGlvZmlsZS5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBhdWRpb2ZpbGUKK0Rlc2NyaXB0aW9uOiBhdWRpb2ZpbGUKK1JlcXVpcmVzOgorVmVyc2lvbjogMC4zLjMKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sYXVkaW9maWxlCitMaWJzLnByaXZhdGU6IC1sbQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9kcmkucGMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvZHJpLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZTNmMDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvZHJpLnBjCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0vdXNyL2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0vdXNyL2luY2x1ZGUKK2RyaWRyaXZlcmRpcj0vdXNyL2xpYi9pMzg2LWxpbnV4LWdudS9kcmkKKworTmFtZTogZHJpCitEZXNjcmlwdGlvbjogRGlyZWN0IFJlbmRlcmluZyBJbmZyYXN0cnVjdHVyZQorVmVyc2lvbjogOC4wLjAKK1JlcXVpcmVzLnByaXZhdGU6IGxpYmRybSA+PSAyLjQuMjQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvZXNvdW5kLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2Vzb3VuZC5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGYyMzk5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2Vzb3VuZC5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorZXNkX3NlcnZlcmRpcj0ke3ByZWZpeH0vYmluCisKK05hbWU6IGVzb3VuZAorRGVzY3JpcHRpb246IGVzb3VuZAorUmVxdWlyZXMucHJpdmF0ZTogYXVkaW9maWxlCitWZXJzaW9uOiAwLjIuNDEKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sZXNkIAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9mb3JtLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2Zvcm0ucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2MzUwZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9mb3JtLnBjCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0vdXNyL2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorbWFqb3JfdmVyc2lvbj01Cit2ZXJzaW9uPTUuOS4yMDExMDQwNAorCitOYW1lOiBmb3JtCitEZXNjcmlwdGlvbjogbmN1cnNlcyA1LjkgYWRkLW9uIGxpYnJhcnkKK1ZlcnNpb246ICR7dmVyc2lvbn0KK1JlcXVpcmVzOiBuY3Vyc2VzIHRpbmZvCitMaWJzOiAtTCR7bGliZGlyfSAtbGZvcm0KK0NmbGFnczogCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvZ2wucGMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvZ2wucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzZTZkYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9nbC5wYwpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9L3Vzci9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9L3Vzci9pbmNsdWRlCisKK05hbWU6IGdsCitEZXNjcmlwdGlvbjogTWVzYSBPcGVuR0wgbGlicmFyeQorUmVxdWlyZXMucHJpdmF0ZTogeDExIHhleHQKK1ZlcnNpb246IDguMC4wCitMaWJzOiAtTCR7bGliZGlyfSAtbEdMCitMaWJzLnByaXZhdGU6IC1sbSAtbHB0aHJlYWQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IAorZ2x4X3Rsczogbm8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9saWJwdWxzZS1tYWlubG9vcC1nbGliLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2xpYnB1bHNlLW1haW5sb29wLWdsaWIucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhYmE3MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9saWJwdWxzZS1tYWlubG9vcC1nbGliLnBjCkBAIC0wLDAgKzEsMTIgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke3ByZWZpeH0vbGliL2kzODYtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK05hbWU6IGxpYnB1bHNlLW1haW5sb29wLWdsaWIKK0Rlc2NyaXB0aW9uOiBQdWxzZUF1ZGlvIEdMaWIgMi4wIE1haW4gTG9vcCBXcmFwcGVyCitWZXJzaW9uOiAxLjEKK0xpYnM6IC1MJHtsaWJkaXJ9IC1scHVsc2UtbWFpbmxvb3AtZ2xpYiAKK0xpYnMucHJpdmF0ZTogLWxwdWxzZWNvbW1vbi0xLjEKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1EX1JFRU5UUkFOVAorUmVxdWlyZXM6IGxpYnB1bHNlIGdsaWItMi4wCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvbGlicHVsc2Utc2ltcGxlLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2xpYnB1bHNlLXNpbXBsZS5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTk0MGJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2xpYnB1bHNlLXNpbXBsZS5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBsaWJwdWxzZS1zaW1wbGUKK0Rlc2NyaXB0aW9uOiBQdWxzZUF1ZGlvIFNpbXBsaWZpZWQgU3luY2hyb25vdXMgQ2xpZW50IEludGVyZmFjZQorVmVyc2lvbjogMS4xCitMaWJzOiAtTCR7bGliZGlyfSAtbHB1bHNlLXNpbXBsZSAKK0xpYnMucHJpdmF0ZTogLWxwdWxzZWNvbW1vbi0xLjEKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1EX1JFRU5UUkFOVAorUmVxdWlyZXM6IGxpYnB1bHNlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvbGlicHVsc2UucGMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvbGlicHVsc2UucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIxNzMyNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9saWJwdWxzZS5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorbW9kbGliZXhlY2Rpcj0ke3ByZWZpeH0vbGliL3B1bHNlLTEuMS9tb2R1bGVzCisKK05hbWU6IGxpYnB1bHNlCitEZXNjcmlwdGlvbjogUHVsc2VBdWRpbyBDbGllbnQgSW50ZXJmYWNlCitWZXJzaW9uOiAxLjEKK0xpYnM6IC1MJHtsaWJkaXJ9IC1scHVsc2UgCitMaWJzLnByaXZhdGU6IC1scHVsc2Vjb21tb24tMS4xCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAtRF9SRUVOVFJBTlQKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9tZW51LnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL21lbnUucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlYjZlNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9tZW51LnBjCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0vdXNyL2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorbWFqb3JfdmVyc2lvbj01Cit2ZXJzaW9uPTUuOS4yMDExMDQwNAorCitOYW1lOiBtZW51CitEZXNjcmlwdGlvbjogbmN1cnNlcyA1LjkgYWRkLW9uIGxpYnJhcnkKK1ZlcnNpb246ICR7dmVyc2lvbn0KK1JlcXVpcmVzOiBuY3Vyc2VzIHRpbmZvCitMaWJzOiAtTCR7bGliZGlyfSAtbG1lbnUKK0NmbGFnczogCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvbmN1cnNlcysrLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL25jdXJzZXMrKy5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQxZGU2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL25jdXJzZXMrKy5wYwpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9L3Vzci9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK21ham9yX3ZlcnNpb249NQordmVyc2lvbj01LjkuMjAxMTA0MDQKKworTmFtZTogbmN1cnNlcysrCitEZXNjcmlwdGlvbjogbmN1cnNlcyA1LjkgYWRkLW9uIGxpYnJhcnkKK1ZlcnNpb246ICR7dmVyc2lvbn0KK1JlcXVpcmVzOiBwYW5lbCBtZW51IGZvcm0gbmN1cnNlcyB0aW5mbworTGliczogLUwke2xpYmRpcn0gLWxuY3Vyc2VzKysKK0NmbGFnczogCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvbmN1cnNlcy5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9uY3Vyc2VzLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OTJiNjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvbmN1cnNlcy5wYwpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9L3Vzci9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK21ham9yX3ZlcnNpb249NQordmVyc2lvbj01LjkuMjAxMTA0MDQKKworTmFtZTogbmN1cnNlcworRGVzY3JpcHRpb246IG5jdXJzZXMgNS45IGxpYnJhcnkKK1ZlcnNpb246ICR7dmVyc2lvbn0KK1JlcXVpcmVzOiB0aW5mbworTGliczogLUwke2xpYmRpcn0gLWxuY3Vyc2VzCitDZmxhZ3M6IApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3BhbmVsLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3BhbmVsLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhN2Q3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvcGFuZWwucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPS91c3IvbGliL2kzODYtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCittYWpvcl92ZXJzaW9uPTUKK3ZlcnNpb249NS45LjIwMTEwNDA0CisKK05hbWU6IHBhbmVsCitEZXNjcmlwdGlvbjogbmN1cnNlcyA1LjkgYWRkLW9uIGxpYnJhcnkKK1ZlcnNpb246ICR7dmVyc2lvbn0KK1JlcXVpcmVzOiBuY3Vyc2VzIHRpbmZvCitMaWJzOiAtTCR7bGliZGlyfSAtbHBhbmVsCitDZmxhZ3M6IApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3RpYy5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy90aWMucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2NWI1YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy90aWMucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPS91c3IvbGliL2kzODYtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCittYWpvcl92ZXJzaW9uPTUKK3ZlcnNpb249NS45LjIwMTEwNDA0CisKK05hbWU6IHRpYworRGVzY3JpcHRpb246IG5jdXJzZXMgNS45IGFkZC1vbiBsaWJyYXJ5CitWZXJzaW9uOiAke3ZlcnNpb259CitSZXF1aXJlczogbmN1cnNlcyB0aW5mbworTGliczogLUwke2xpYmRpcn0gLWx0aWMKK0NmbGFnczogCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvdGluZm8ucGMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvdGluZm8ucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiNzAzZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy90aW5mby5wYwpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9L3Vzci9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK21ham9yX3ZlcnNpb249NQordmVyc2lvbj01LjkuMjAxMTA0MDQKKworTmFtZTogdGluZm8KK0Rlc2NyaXB0aW9uOiBuY3Vyc2VzIDUuOSB0ZXJtaW5hbCBpbnRlcmZhY2UgbGlicmFyeQorVmVyc2lvbjogJHt2ZXJzaW9ufQorUmVxdWlyZXM6IAorTGliczogLUwke2xpYmRpcn0gLWx0aW5mbyAgCitDZmxhZ3M6IApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3gxMS5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy94MTEucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiYTRjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy94MTEucGMKQEAgLTAsMCArMSwxNSBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworeHRocmVhZGxpYj0tbHB0aHJlYWQKKworTmFtZTogWDExCitEZXNjcmlwdGlvbjogWCBMaWJyYXJ5CitWZXJzaW9uOiAxLjQuOTkuMQorUmVxdWlyZXM6IHhwcm90byBrYnByb3RvCitSZXF1aXJlcy5wcml2YXRlOiB4Y2IgPj0gMS4xLjkyCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sWDExCitMaWJzLnByaXZhdGU6IC1scHRocmVhZApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3hjYi5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy94Y2IucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiNWU3MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy94Y2IucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK3hjYnByb3RvX3ZlcnNpb249MS43CisKK05hbWU6IFhDQgorRGVzY3JpcHRpb246IFgtcHJvdG9jb2wgQyBCaW5kaW5nCitWZXJzaW9uOiAxLjguMQorUmVxdWlyZXMucHJpdmF0ZTogcHRocmVhZC1zdHVicyB4YXUgPj0gMC45OS4yIHhkbWNwCitMaWJzOiAtTCR7bGliZGlyfSAtbHhjYgorTGlicy5wcml2YXRlOiAKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcveGV4dC5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy94ZXh0LnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NWI1ODMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcveGV4dC5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBYZXh0CitEZXNjcmlwdGlvbjogTWlzYyBYIEV4dGVuc2lvbiBMaWJyYXJ5CitWZXJzaW9uOiAxLjMuMAorUmVxdWlyZXM6IHhleHRwcm90bworUmVxdWlyZXMucHJpdmF0ZTogeDExCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQorTGliczogLUwke2xpYmRpcn0gLWxYZXh0CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcveGZpeGVzLnBjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3hmaXhlcy5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTk0MTYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3hmaXhlcy5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBYZml4ZXMKK0Rlc2NyaXB0aW9uOiBYIEZpeGVzICBMaWJyYXJ5CitWZXJzaW9uOiA1LjAKK1JlcXVpcmVzOiB4cHJvdG8gZml4ZXNwcm90byA+PSA1LjAKK1JlcXVpcmVzLnByaXZhdGU6IHgxMQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sWGZpeGVzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcveGkucGMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcveGkucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4MDg2NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy94aS5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBYaQorRGVzY3JpcHRpb246IFggSW5wdXQgRXh0ZW5zaW9uIExpYnJhcnkKK1ZlcnNpb246IDEuNi4wCitSZXF1aXJlczogaW5wdXRwcm90bworUmVxdWlyZXMucHJpdmF0ZTogeDExIHhleHQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CitMaWJzOiAtTCR7bGliZGlyfSAtbFhpCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvemxpYi5wYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy96bGliLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NjY5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvemxpYi5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiB6bGliCitEZXNjcmlwdGlvbjogemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CitWZXJzaW9uOiAxLjIuMy40CisKK1JlcXVpcmVzOiAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1segorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3ZhbGdyaW5kL25jdXJzZXMuc3VwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3ZhbGdyaW5kL25jdXJzZXMuc3VwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2E1ODJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIvdmFsZ3JpbmQvbmN1cnNlcy5zdXBwCkBAIC0wLDAgKzEsMjA1IEBACisjICRJZDogbmN1cnNlcy5zdXBwLHYgMS43IDIwMDgvMDkvMjAgMTg6NDM6NDIgdG9tIEV4cCAkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAgICMKKyMgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgIworIyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uICAjCisjIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBkaXN0cmlidXRlICAgICMKKyMgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gIworIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlICAjCisjIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiAjCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiAjCisjIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCAgICMKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgICAgIworIyBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgICAgICAjCisjIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HICAgICMKKyMgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiAgICAgICAgIworIyBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgIworIyBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCAjCisjIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAgICAgICAgICMKKyMgYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRoaXMgaXMgYSB3YXJuaW5nLXN1cHByZXNzaW9uIGZpbGUgZm9yIHZhbGdyaW5kIGFuZCBuY3Vyc2VzLgorIworIyBuY3Vyc2VzIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIC0tZGlzYWJsZS1sZWFrcyBvcHRpb24sIHdoaWNoCisjIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBjYWxsIF9uY19mcmVlYWxsKCkgb3IgX25jX2ZyZWVfYW5kX2V4aXQoKSwgdG8KKyMgZnJlZSBhbGwgb2YgbmN1cnNlcycgInBlcm1hbmVudCIgbWVtb3J5LgorIworIyBTb21lIG9mIHRoZXNlIGxlYWtzIGNhbiBiZSBmcmVlZCBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBpdHMgb3duIGNsZWFudXAsCisjIGZvciBleGFtcGxlOgorIwlkZWxzY3JlZW4oU1ApOworIwlkZWxfY3VydGVybShjdXJfdGVybSk7CisjIEhvd2V2ZXIsIGZldyBhcHBsaWNhdGlvbnMgZG8gdGhpcy4KKworeworICAgbmN1cnNlc19sZWFrX19uY19hZGRfdG9fdHJ5CisgICBNZW1jaGVjazpMZWFrCisgICBmdW46KmFsbG9jCisgICBmdW46X25jX2FkZF90b190cnkKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19ob21lX3Rlcm1pbmZvCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46bWFsbG9jCisgICBmdW46X25jX2hvbWVfdGVybWluZm8KK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19pbml0X3dhY3MKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpfbmNfaW5pdF93YWNzCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfa2V5bmFtZQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOmNhbGxvYworICAgZnVuOl9uY19rZXluYW1lCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfa2V5bmFtZV8yCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46bWFsbG9jCisgICBmdW46c3RyZHVwCisgICBmdW46X25jX2tleW5hbWUKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19wcmludGZfc3RyaW5nCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46bWFsbG9jCisgICBmdW46X25jX2RvYWxsb2MKKyAgIGZ1bjpfbmNfcHJpbnRmX3N0cmluZworfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3JlYWRfdGVybXR5cGUKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjoqYWxsb2MKKyAgIGZ1bjpfbmNfcmVhZF90ZXJtdHlwZQorICAgZnVuOl9uY19yZWFkX2ZpbGVfZW50cnkKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19yZWFkX3Rlcm10eXBlXzIKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjoqYWxsb2MKKyAgIGZ1bjpfbmNfZG9hbGxvYworICAgZnVuOl9uY19yZWFkX3Rlcm10eXBlCisgICBmdW46X25jX3JlYWRfZmlsZV9lbnRyeQorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3Njcm9sbF9vcHRpbWl6ZQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOiphbGxvYworICAgZnVuOl9uY19oYXNoX21hcAorICAgZnVuOl9uY19zY3JvbGxfb3B0aW1pemUKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19zY3JvbGxfb3B0aW1pemVfMgorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOiphbGxvYworICAgZnVuOl9uY19kb2FsbG9jCisgICBmdW46X25jX3Njcm9sbF9vcHRpbWl6ZQorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3NldHVwc2NyZWVuCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46Y2FsbG9jCisgICBmdW46X25jX3NldHVwc2NyZWVuCisgICBmdW46bmV3dGVybQorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3NldHVwc2NyZWVuXzIKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpuZXd3aW4KKyAgIGZ1bjpfbmNfc2V0dXBzY3JlZW4KK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19zZXR1cHRlcm1fMQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOm1hbGxvYworICAgZnVuOnN0cmR1cAorICAgZnVuOl9uY19zZXR1cHRlcm0KK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19zZXR1cHRlcm0KKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpfbmNfc2V0dXB0ZXJtCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfc2V0dXBzY3JlZW5fMworICAgTWVtY2hlY2s6TGVhaworICAgZnVuOmNhbGxvYworICAgZnVuOl9uY19tYWtlbmV3CisgICBmdW46bmV3d2luCisgICBmdW46X25jX3NldHVwc2NyZWVuCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfc2V0X2J1ZmZlcgorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOm1hbGxvYworICAgZnVuOl9uY19zZXRfYnVmZmVyCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfdHBhcm1fYW5hbHl6ZQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOiphbGxvYworICAgZnVuOl9uY19kb2FsbG9jCisgICBmdW46X25jX3RwYXJtX2FuYWx5emUKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY190cmFjZV9hbGxvYworICAgTWVtY2hlY2s6TGVhaworICAgZnVuOiphbGxvYworICAgZnVuOl9uY19kb2FsbG9jCisgICBmdW46X25jX3RyYWNlX2FsbG9jCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19zdGFydF9jb2xvcgorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOmNhbGxvYworICAgZnVuOnN0YXJ0X2NvbG9yCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha190cGFybQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOnJlYWxsb2MKKyAgIGZ1bjpfbmNfZG9hbGxvYworICAgZnVuOnRwYXJtCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha190cGFyYW1faW50ZXJuYWwKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpyZWFsbG9jCisgICBmdW46X25jX2RvYWxsb2MKKyAgIGZ1bjpnZXRfc3BhY2UKKyAgIGZ1bjpzYXZlX251bWJlcgorICAgZnVuOnRwYXJhbV9pbnRlcm5hbAorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYkJyb2tlbkxvY2FsZS5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYkJyb2tlbkxvY2FsZS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYmY1YTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliQnJva2VuTG9jYWxlLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYkJyb2tlbkxvY2FsZV9waWMuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJCcm9rZW5Mb2NhbGVfcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczYmEzNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJCcm9rZW5Mb2NhbGVfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmFubC5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmFubC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2ZjOTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliYW5sLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmFubF9waWMuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJhbmxfcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiODBlOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJhbmxfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmJzZC1jb21wYXQuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJic2QtY29tcGF0LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkMmRmZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJic2QtY29tcGF0LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmMuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJjLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyYmY5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJjLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNfbm9uc2hhcmVkLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliY19ub25zaGFyZWQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2ZmNDZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNfbm9uc2hhcmVkLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNfcGljLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliY19waWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTI2ZWRiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNpZG5fcGljLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliY2lkbl9waWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzU4NzE5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNpZG5fcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNyeXB0LmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliY3J5cHQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZThmYzFmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNyeXB0LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNyeXB0X3BpYy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNyeXB0X3BpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMWZiMjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliY3J5cHRfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmRsLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliZGwuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjY3M2VjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmRsLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmRsX3BpYy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmRsX3BpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMzBjNDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliZGxfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmcuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJnLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4MDkyOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJnLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmllZWUuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJpZWVlLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1Yzk4ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJpZWVlLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm0uYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJtLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2YmViNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJtLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm1fcGljLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibV9waWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmYwMWUyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm1fcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm1jaGVjay5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm1jaGVjay5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MTBlYjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibWNoZWNrLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zbC5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zbC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNzllOGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibnNsLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zbF9waWMuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc2xfcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0ODY4NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc2xfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19jb21wYXRfcGljLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibnNzX2NvbXBhdF9waWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGY3MDk5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19jb21wYXRfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19kYl9waWMuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfZGJfcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1MWMyZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfZGJfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19kbnNfcGljLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibnNzX2Ruc19waWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWEwYTYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19kbnNfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19maWxlc19waWMuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfZmlsZXNfcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxYmMzYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfZmlsZXNfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19oZXNpb2RfcGljLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibnNzX2hlc2lvZF9waWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTRlYzBkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19oZXNpb2RfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19uaXNfcGljLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibnNzX25pc19waWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmRiODBmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19uaXNfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19uaXNwbHVzX3BpYy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19uaXNwbHVzX3BpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDg0MjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibnNzX25pc3BsdXNfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnB0aHJlYWQuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJwdGhyZWFkLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxZTYxOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJwdGhyZWFkLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnB0aHJlYWRfbm9uc2hhcmVkLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlicHRocmVhZF9ub25zaGFyZWQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE2OTQwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnB0aHJlYWRfbm9uc2hhcmVkLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnJlc29sdi5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnJlc29sdi5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZGRkY2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlicmVzb2x2LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnJlc29sdl9waWMuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJyZXNvbHZfcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjZmYyNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJyZXNvbHZfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnJwY3N2Yy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnJwY3N2Yy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDY5NmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlicnBjc3ZjLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnJ0LmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlicnQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTk2NThmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnJ0LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnJ0X3BpYy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnJ0X3BpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NzY2MDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlicnRfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnRocmVhZF9kYl9waWMuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJ0aHJlYWRfZGJfcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjNDA3ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJ0aHJlYWRfZGJfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnV0aWwuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJ1dGlsLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyOGMxMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJ1dGlsLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnV0aWxfcGljLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlidXRpbF9waWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjFjNjQ0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnV0aWxfcGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvdG9vbGNoYWluLXBhdGNoZXMvZ2NjLzAwMDEtUmUtZW5hYmxlLWdjYzQuNi1saWJzdGRjLXZlcnNpb25pbmctZm9yLWhvc3QtdG9vbGNoYS5wYXRjaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3Rvb2xjaGFpbi1wYXRjaGVzL2djYy8wMDAxLVJlLWVuYWJsZS1nY2M0LjYtbGlic3RkYy12ZXJzaW9uaW5nLWZvci1ob3N0LXRvb2xjaGEucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmNWJkYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3Rvb2xjaGFpbi1wYXRjaGVzL2djYy8wMDAxLVJlLWVuYWJsZS1nY2M0LjYtbGlic3RkYy12ZXJzaW9uaW5nLWZvci1ob3N0LXRvb2xjaGEucGF0Y2gKQEAgLTAsMCArMSw0MyBAQAorRnJvbSBhZjE4NzY5NzJmOWRjNTVhZjBlMmY5MGZlNTYzYzY1ODJmNjIzZjY5IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQW5kcmV3IEhzaWVoIDxhbmRyZXdoc2llaEBnb29nbGUuY29tPgorRGF0ZTogV2VkLCAxMiBNYXIgMjAxNCAxMzoxMjoxOCArMDgwMAorU3ViamVjdDogW1BBVENIXSBSZS1lbmFibGUgZ2NjNC42IGxpYnN0ZGMrKyB2ZXJzaW9uaW5nIGZvciBob3N0IHRvb2xjaGFpbgorCitUaGlzIENMIHJldmVydHMgNGEwOTI3NDIzZDUxZjU5NGI4NzBlNThiM2ViNTE1NzQzMjdmOGIwZQorZm9yIHByZWJ1aWx0cy9nY2MvbGludXgteDg2L2hvc3QveDg2XzY0LWxpbnV4LWdsaWJjMi4xMS00LjYKKworQ2hhbmdlLUlkOiBJMzFjMDRjMTA1NjkyZmU0Y2RiNmYyNjE5MjBhMDU4ODI1MzljMzc1MAorLS0tCisgZ2NjLTQuNi9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmFtIHwgMiArLQorIGdjYy00LjYvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5pbiB8IDIgKy0KKyAyIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2djYy00LjYvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5hbSBiL2djYy00LjYvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5hbQoraW5kZXggNjgwYTE3Mi4uMjc3MzE3YiAxMDA2NDQKKy0tLSBhL2djYy00LjYvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5hbQorKysrIGIvZ2NjLTQuNi9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmFtCitAQCAtMjUxLDcgKzI1MSw3IEBAIGxpYnN0ZGNfX19sYV9ERVBFTkRFTkNJRVMgPSBcCisgCSQodG9wX2J1aWxkZGlyKS9saWJzdXBjKysvbGlic3VwYysrY29udmVuaWVuY2UubGEKKyAKKyBsaWJzdGRjX19fbGFfTERGTEFHUyA9IFwKKy0JLWF2b2lkLXZlcnNpb24gJHt2ZXJzaW9uX2FyZ30gLWxtCisrCS12ZXJzaW9uLWluZm8gJChsaWJ0b29sX1ZFUlNJT04pJHt2ZXJzaW9uX2FyZ30gLWxtCisgCisgbGlic3RkY19fX2xhX0xJTksgPSAkKENYWExJTkspICQobGlic3RkY19fX2xhX0xERkxBR1MpCisgCitkaWZmIC0tZ2l0IGEvZ2NjLTQuNi9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmluIGIvZ2NjLTQuNi9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmluCitpbmRleCBkMDNhY2Q1Li4xNDZlYzNmIDEwMDY0NAorLS0tIGEvZ2NjLTQuNi9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmluCisrKysgYi9nY2MtNC42L2xpYnN0ZGMrKy12My9zcmMvTWFrZWZpbGUuaW4KK0BAIC00NjYsNyArNDY2LDcgQEAgbGlic3RkY19fX2xhX0RFUEVOREVOQ0lFUyA9IFwKKyAJJCh0b3BfYnVpbGRkaXIpL2xpYnN1cGMrKy9saWJzdXBjKytjb252ZW5pZW5jZS5sYQorIAorIGxpYnN0ZGNfX19sYV9MREZMQUdTID0gXAorLQktYXZvaWQtdmVyc2lvbiAke3ZlcnNpb25fYXJnfSAtbG0KKysJLXZlcnNpb24taW5mbyAkKGxpYnRvb2xfVkVSU0lPTikgJHt2ZXJzaW9uX2FyZ30gLWxtCisgCisgbGlic3RkY19fX2xhX0xJTksgPSAkKENYWExJTkspICQobGlic3RkY19fX2xhX0xERkxBR1MpCisgCistLSAKKzEuOS4wLjI3OS5nZGM5ZTNlYgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC90b29sY2hhaW4tcGF0Y2hlcy9nY2MvMDAwMS1SZS1lbmFibGUtZ2NjNC44LWxpYnN0ZGMtdmVyc2lvbmluZy1mb3ItaG9zdC10b29sY2hhLnBhdGNoIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvdG9vbGNoYWluLXBhdGNoZXMvZ2NjLzAwMDEtUmUtZW5hYmxlLWdjYzQuOC1saWJzdGRjLXZlcnNpb25pbmctZm9yLWhvc3QtdG9vbGNoYS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWM0NDRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvdG9vbGNoYWluLXBhdGNoZXMvZ2NjLzAwMDEtUmUtZW5hYmxlLWdjYzQuOC1saWJzdGRjLXZlcnNpb25pbmctZm9yLWhvc3QtdG9vbGNoYS5wYXRjaApAQCAtMCwwICsxLDQzIEBACitGcm9tIDJlNzQyYTVhMDZmYjI5NmM3YWVmYTYxMWIyYjEwYzQwYzQ5MmViMzYgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBbmRyZXcgSHNpZWggPGFuZHJld2hzaWVoQGdvb2dsZS5jb20+CitEYXRlOiBXZWQsIDEyIE1hciAyMDE0IDEzOjE2OjE2ICswODAwCitTdWJqZWN0OiBbUEFUQ0hdIFJlLWVuYWJsZSBnY2M0LjggbGlic3RkYysrIHZlcnNpb25pbmcgZm9yIGhvc3QgdG9vbGNoYWluCisKK1RoaXMgQ0wgcmV2ZXJ0cyBmNTBhODExNjVlMzA1YzczMzliZWM3OGJkM2M5Y2Y4YTM1ZTFmMjMzCitmb3IgcHJlYnVpbHRzL2djYy9saW51eC14ODYvaG9zdC94ODZfNjQtbGludXgtZ2xpYmMyLjExLTQuOAorCitDaGFuZ2UtSWQ6IEk3NGUwNjVlYWIyMjkzOWU1ZGQ3ZmQ2MGY2MWFhMDBjNmI5MzNkZTgwCistLS0KKyBnY2MtNC44L2xpYnN0ZGMrKy12My9zcmMvTWFrZWZpbGUuYW0gfCAyICstCisgZ2NjLTQuOC9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmluIHwgMiArLQorIDIgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZ2NjLTQuOC9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmFtIGIvZ2NjLTQuOC9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmFtCitpbmRleCAwN2M0MTYwLi4yMGRkOTE4IDEwMDY0NAorLS0tIGEvZ2NjLTQuOC9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmFtCisrKysgYi9nY2MtNC44L2xpYnN0ZGMrKy12My9zcmMvTWFrZWZpbGUuYW0KK0BAIC02OCw3ICs2OCw3IEBAIGxpYnN0ZGNfX19sYV9ERVBFTkRFTkNJRVMgPSBcCisgCSQodG9wX2J1aWxkZGlyKS9zcmMvYysrMTEvbGliYysrMTFjb252ZW5pZW5jZS5sYQorIAorIGxpYnN0ZGNfX19sYV9MREZMQUdTID0gXAorLQktYXZvaWQtdmVyc2lvbiAke3ZlcnNpb25fYXJnfSAtbG0KKysJLXZlcnNpb24taW5mbyAkKGxpYnRvb2xfVkVSU0lPTikke3ZlcnNpb25fYXJnfSAtbG0KKyAKKyBsaWJzdGRjX19fbGFfTElOSyA9ICQoQ1hYTElOSykgJChsaWJzdGRjX19fbGFfTERGTEFHUykKKyAKK2RpZmYgLS1naXQgYS9nY2MtNC44L2xpYnN0ZGMrKy12My9zcmMvTWFrZWZpbGUuaW4gYi9nY2MtNC44L2xpYnN0ZGMrKy12My9zcmMvTWFrZWZpbGUuaW4KK2luZGV4IDk3MjFlYmIuLmE3YjM0MDQgMTAwNjQ0CistLS0gYS9nY2MtNC44L2xpYnN0ZGMrKy12My9zcmMvTWFrZWZpbGUuaW4KKysrKyBiL2djYy00LjgvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5pbgorQEAgLTM2OCw3ICszNjgsNyBAQCBsaWJzdGRjX19fbGFfREVQRU5ERU5DSUVTID0gXAorIAkkKHRvcF9idWlsZGRpcikvc3JjL2MrKzExL2xpYmMrKzExY29udmVuaWVuY2UubGEKKyAKKyBsaWJzdGRjX19fbGFfTERGTEFHUyA9IFwKKy0JLWF2b2lkLXZlcnNpb24gJHt2ZXJzaW9uX2FyZ30gLWxtCisrCS12ZXJzaW9uLWluZm8gJChsaWJ0b29sX1ZFUlNJT04pICR7dmVyc2lvbl9hcmd9IC1sbQorIAorIGxpYnN0ZGNfX19sYV9MSU5LID0gJChDWFhMSU5LKSAkKGxpYnN0ZGNfX19sYV9MREZMQUdTKQorIAorLS0gCisxLjkuMC4yNzkuZ2RjOWUzZWIKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9hciBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9iaW4vYXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDBhNDRiNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9iaW4vYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9hcyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9iaW4vYXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQ5NzNkYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9iaW4vYXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9jKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvYmluL2MrKwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDJhNzg3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9jKysKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9nKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvYmluL2crKwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDJhNzg3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9nKysKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9nY2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvYmluL2djYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNzQ4NGYzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9nY2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9sZCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9iaW4vbGQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWVhNWFhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9iaW4vbGQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9sZC5iZmQgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvYmluL2xkLmJmZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43OTdmYzBkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9sZC5iZmQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9sZC5nb2xkIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9sZC5nb2xkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlYTVhYTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvYmluL2xkLmdvbGQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9ubSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9iaW4vbm0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjhlZDIyOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9iaW4vbm0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9vYmpjb3B5IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9vYmpjb3B5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY0NWZmMzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvYmluL29iamNvcHkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9vYmpkdW1wIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9vYmpkdW1wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIyNGZmOWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvYmluL29iamR1bXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9yYW5saWIgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvYmluL3JhbmxpYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMmY3MmNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9yYW5saWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2Jpbi9zdHJpcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9iaW4vc3RyaXAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjFmNWY3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9iaW4vc3RyaXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9hbGdvcml0aG0gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2FsZ29yaXRobQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzVkZGI5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9hbGdvcml0aG0KQEAgLTAsMCArMSw2OCBAQAorLy8gPGFsZ29yaXRobT4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvYWxnb3JpdGhtCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0FMR09SSVRITQorI2RlZmluZSBfR0xJQkNYWF9BTEdPUklUSE0gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDx1dGlsaXR5PiAvLyBVSy0zMDAuCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvLmg+CisKKyNpZmRlZiBfR0xJQkNYWF9QQVJBTExFTAorIyBpbmNsdWRlIDxwYXJhbGxlbC9hbGdvcml0aG0+CisjZW5kaWYKKworI2VuZGlmIC8qIF9HTElCQ1hYX0FMR09SSVRITSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9hcnJheSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYXJyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyYTcxYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYXJyYXkKQEAgLTAsMCArMSwzMzMgQEAKKy8vIDxhcnJheT4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvYXJyYXkKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQVJSQVkKKyNkZWZpbmUgX0dMSUJDWFhfQVJSQVkgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IF9fYXJyYXlfdHJhaXRzCisgICAgeworICAgICAgdHlwZWRlZiBfVHAgX1R5cGVbX05tXTsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBfVHAmCisgICAgICBfU19yZWYoY29uc3QgX1R5cGUmIF9fdCwgc3RkOjpzaXplX3QgX19uKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfY2FzdDxfVHAmPihfX3RbX19uXSk7IH0KKyAgICB9OworCisgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgc3RydWN0IF9fYXJyYXlfdHJhaXRzPF9UcCwgMD4KKyAgIHsKKyAgICAgc3RydWN0IF9UeXBlIHsgfTsKKworICAgICBzdGF0aWMgY29uc3RleHByIF9UcCYKKyAgICAgX1NfcmVmKGNvbnN0IF9UeXBlJiwgc3RkOjpzaXplX3QpIG5vZXhjZXB0CisgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxfVHAqPihudWxscHRyKTsgfQorICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBBIHN0YW5kYXJkIGNvbnRhaW5lciBmb3Igc3RvcmluZyBhIGZpeGVkIHNpemUgc2VxdWVuY2Ugb2YgZWxlbWVudHMuCisgICAqCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjYiPnJldmVyc2libGUgY29udGFpbmVyPC9hPiwgYW5kIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY3Ij5zZXF1ZW5jZTwvYT4uCisgICAqCisgICAqICBTZXRzIHN1cHBvcnQgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuCisgICAqCisgICAqICBAdHBhcmFtICBUcCAgVHlwZSBvZiBlbGVtZW50LiBSZXF1aXJlZCB0byBiZSBhIGNvbXBsZXRlIHR5cGUuCisgICAqICBAdHBhcmFtICBOICBOdW1iZXIgb2YgZWxlbWVudHMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIHN0cnVjdCBhcnJheQorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwIAkgICAgCQkJICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSoJCQkgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgCSAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgCSAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSogICAgICAgICAgCQkgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSoJCQkgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgICAgICAgICAgICAgICAgICAgIAkgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgIAkgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4JICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIFN1cHBvcnQgZm9yIHplcm8tc2l6ZWQgYXJyYXlzIG1hbmRhdG9yeS4KKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6Ol9fYXJyYXlfdHJhaXRzPF9UcCwgX05tPiBfQVRfVHlwZTsKKyAgICAgIHR5cGVuYW1lIF9BVF9UeXBlOjpfVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBfTV9lbGVtczsKKworICAgICAgLy8gTm8gZXhwbGljaXQgY29uc3RydWN0L2NvcHkvZGVzdHJveSBmb3IgYWdncmVnYXRlIHR5cGUuCisKKyAgICAgIC8vIERSIDc3Ni4KKyAgICAgIHZvaWQKKyAgICAgIGZpbGwoY29uc3QgdmFsdWVfdHlwZSYgX191KQorICAgICAgeyBzdGQ6OmZpbGxfbihiZWdpbigpLCBzaXplKCksIF9fdSk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChhcnJheSYgX19vdGhlcikKKyAgICAgIG5vZXhjZXB0KG5vZXhjZXB0KHN3YXAoc3RkOjpkZWNsdmFsPF9UcCY+KCksIHN0ZDo6ZGVjbHZhbDxfVHAmPigpKSkpCisgICAgICB7IHN0ZDo6c3dhcF9yYW5nZXMoYmVnaW4oKSwgZW5kKCksIF9fb3RoZXIuYmVnaW4oKSk7IH0KKworICAgICAgLy8gSXRlcmF0b3JzLgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKGRhdGEoKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGRhdGEoKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihkYXRhKCkgKyBfTm0pOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpICsgX05tKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmJlZ2luKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgCisgICAgICByYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIHJlbmQoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihkYXRhKCkgKyBfTm0pOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIC8vIENhcGFjaXR5LgorICAgICAgY29uc3RleHByIHNpemVfdHlwZSAKKyAgICAgIHNpemUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBfTm07IH0KKworICAgICAgY29uc3RleHByIHNpemVfdHlwZSAKKyAgICAgIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gX05tOyB9CisKKyAgICAgIGNvbnN0ZXhwciBib29sIAorICAgICAgZW1wdHkoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorCisgICAgICAvLyBFbGVtZW50IGFjY2Vzcy4KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgX19uKTsgfQorCisgICAgICBjb25zdGV4cHIgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCBfX24pOyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlpZiAoX19uID49IF9ObSkKKwkgIHN0ZDo6X190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJhcnJheTo6YXQiKSk7CisJcmV0dXJuIF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIF9fbik7CisgICAgICB9CisKKyAgICAgIGNvbnN0ZXhwciBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJLy8gUmVzdWx0IG9mIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gbXVzdCBiZSBhbiBsdmFsdWUgc28gdXNlCisJLy8gYm9vbGVhbiA/IGx2YWx1ZSA6ICh0aHJvdy1leHByLCBsdmFsdWUpCisJcmV0dXJuIF9fbiA8IF9ObSA/IF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIF9fbikKKwkgIDogKHN0ZDo6X190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJhcnJheTo6YXQiKSksCisJICAgICBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCAwKSk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZSAKKyAgICAgIGZyb250KCkKKyAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisKKyAgICAgIGNvbnN0ZXhwciBjb25zdF9yZWZlcmVuY2UgCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCAwKTsgfQorCisgICAgICByZWZlcmVuY2UgCisgICAgICBiYWNrKCkKKyAgICAgIHsgcmV0dXJuIF9ObSA/ICooZW5kKCkgLSAxKSA6ICplbmQoKTsgfQorCisgICAgICBjb25zdGV4cHIgY29uc3RfcmVmZXJlbmNlIAorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7IAorCXJldHVybiBfTm0gPyBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCBfTm0gLSAxKSAKKyAJICAgICAgICAgICA6IF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIDApOworICAgICAgfQorCisgICAgICBwb2ludGVyCisgICAgICBkYXRhKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgMCkpOyB9CisKKyAgICAgIGNvbnN0X3BvaW50ZXIKKyAgICAgIGRhdGEoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCAwKSk7IH0KKyAgICB9OworCisgIC8vIEFycmF5IGNvbXBhcmlzb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbCAKKyAgICBvcGVyYXRvcj09KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gc3RkOjplcXVhbChfX29uZS5iZWdpbigpLCBfX29uZS5lbmQoKSwgX190d28uYmVnaW4oKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiAhKF9fb25lID09IF9fdHdvKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19hLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fYikKKyAgICB7IAorICAgICAgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX19hLmJlZ2luKCksIF9fYS5lbmQoKSwKKwkJCQkJICBfX2IuYmVnaW4oKSwgX19iLmVuZCgpKTsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gX190d28gPCBfX29uZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuICEoX19vbmUgPiBfX3R3byk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiAhKF9fb25lIDwgX190d28pOyB9CisKKyAgLy8gU3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgbm9leGNlcHQobm9leGNlcHQoX19vbmUuc3dhcChfX3R3bykpKQorICAgIHsgX19vbmUuc3dhcChfX3R3byk7IH0KKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW50LCB0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBjb25zdGV4cHIgX1RwJgorICAgIGdldChhcnJheTxfVHAsIF9ObT4mIF9fYXJyKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX0ludCA8IF9ObSwgImluZGV4IGlzIG91dCBvZiBib3VuZHMiKTsKKyAgICAgIHJldHVybiBfR0xJQkNYWF9TVERfQzo6X19hcnJheV90cmFpdHM8X1RwLCBfTm0+OjoKKwlfU19yZWYoX19hcnIuX01fZWxlbXMsIF9JbnQpOworICAgIH0KKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW50LCB0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBjb25zdGV4cHIgX1RwJiYKKyAgICBnZXQoYXJyYXk8X1RwLCBfTm0+JiYgX19hcnIpIG5vZXhjZXB0CisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChfSW50IDwgX05tLCAiaW5kZXggaXMgb3V0IG9mIGJvdW5kcyIpOworICAgICAgcmV0dXJuIHN0ZDo6bW92ZShnZXQ8X0ludD4oX19hcnIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgY29uc3RleHByIGNvbnN0IF9UcCYKKyAgICBnZXQoY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX2Fycikgbm9leGNlcHQKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9JbnQgPCBfTm0sICJpbmRleCBpcyBvdXQgb2YgYm91bmRzIik7CisgICAgICByZXR1cm4gX0dMSUJDWFhfU1REX0M6Ol9fYXJyYXlfdHJhaXRzPF9UcCwgX05tPjo6CisJX1NfcmVmKF9fYXJyLl9NX2VsZW1zLCBfSW50KTsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFR1cGxlIGludGVyZmFjZSB0byBjbGFzcyB0ZW1wbGF0ZSBhcnJheS4KKworICAvLy8gdHVwbGVfc2l6ZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IAorICAgIGNsYXNzIHR1cGxlX3NpemU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IHR1cGxlX3NpemU8X0dMSUJDWFhfU1REX0M6OmFycmF5PF9UcCwgX05tPj4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgX05tPiB7IH07CisKKyAgLy8vIHR1cGxlX2VsZW1lbnQKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgdHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHR1cGxlX2VsZW1lbnQ7CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8X0ludCwgX0dMSUJDWFhfU1REX0M6OmFycmF5PF9UcCwgX05tPj4KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9JbnQgPCBfTm0sICJpbmRleCBpcyBvdXQgb2YgYm91bmRzIik7CisgICAgICB0eXBlZGVmIF9UcCB0eXBlOworICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworIyBpbmNsdWRlIDxkZWJ1Zy9hcnJheT4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfUFJPRklMRQorIyBpbmNsdWRlIDxwcm9maWxlL2FycmF5PgorI2VuZGlmCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfQVJSQVkKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYXRvbWljIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9hdG9taWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzZjU3NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYXRvbWljCkBAIC0wLDAgKzEsMTEyMiBAQAorLy8gLSotIEMrKyAtKi0gaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9hdG9taWMKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vIEJhc2VkIG9uICJDKysgQXRvbWljIFR5cGVzIGFuZCBPcGVyYXRpb25zIiBieSBIYW5zIEJvZWhtIGFuZCBMYXdyZW5jZSBDcm93bC4KKy8vIGh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMDcvbjI0MjcuaHRtbAorCisjaWZuZGVmIF9HTElCQ1hYX0FUT01JQworI2RlZmluZSBfR0xJQkNYWF9BVE9NSUMgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvYXRvbWljX2Jhc2UuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBhdG9taWNzCisgICAqIEB7CisgICAqLworCisgIC8vLyBhdG9taWNfYm9vbAorICAvLyBOQjogTm8gb3BlcmF0b3JzIG9yIGZldGNoLW9wZXJhdGlvbnMgZm9yIHRoaXMgdHlwZS4KKyAgc3RydWN0IGF0b21pY19ib29sCisgIHsKKyAgcHJpdmF0ZToKKyAgICBfX2F0b21pY19iYXNlPGJvb2w+CV9NX2Jhc2U7CisKKyAgcHVibGljOgorICAgIGF0b21pY19ib29sKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgIH5hdG9taWNfYm9vbCgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICBhdG9taWNfYm9vbChjb25zdCBhdG9taWNfYm9vbCYpID0gZGVsZXRlOworICAgIGF0b21pY19ib29sJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljX2Jvb2wmKSA9IGRlbGV0ZTsKKyAgICBhdG9taWNfYm9vbCYgb3BlcmF0b3I9KGNvbnN0IGF0b21pY19ib29sJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICBjb25zdGV4cHIgYXRvbWljX2Jvb2woYm9vbCBfX2kpIG5vZXhjZXB0IDogX01fYmFzZShfX2kpIHsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPShib29sIF9faSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV9iYXNlLm9wZXJhdG9yPShfX2kpOyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I9KGJvb2wgX19pKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX2Jhc2Uub3BlcmF0b3I9KF9faSk7IH0KKworICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX2Jhc2UubG9hZCgpOyB9CisKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV9iYXNlLmxvYWQoKTsgfQorCisgICAgYm9vbAorICAgIGlzX2xvY2tfZnJlZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIF9NX2Jhc2UuaXNfbG9ja19mcmVlKCk7IH0KKworICAgIGJvb2wKKyAgICBpc19sb2NrX2ZyZWUoKSBjb25zdCB2b2xhdGlsZSBub2V4Y2VwdCB7IHJldHVybiBfTV9iYXNlLmlzX2xvY2tfZnJlZSgpOyB9CisKKyAgICB2b2lkCisgICAgc3RvcmUoYm9vbCBfX2ksIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICB7IF9NX2Jhc2Uuc3RvcmUoX19pLCBfX20pOyB9CisKKyAgICB2b2lkCisgICAgc3RvcmUoYm9vbCBfX2ksIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICB7IF9NX2Jhc2Uuc3RvcmUoX19pLCBfX20pOyB9CisKKyAgICBib29sCisgICAgbG9hZChtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fYmFzZS5sb2FkKF9fbSk7IH0KKworICAgIGJvb2wKKyAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV9iYXNlLmxvYWQoX19tKTsgfQorCisgICAgYm9vbAorICAgIGV4Y2hhbmdlKGJvb2wgX19pLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fYmFzZS5leGNoYW5nZShfX2ksIF9fbSk7IH0KKworICAgIGJvb2wKKyAgICBleGNoYW5nZShib29sIF9faSwKKwkgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV9iYXNlLmV4Y2hhbmdlKF9faSwgX19tKTsgfQorCisgICAgYm9vbAorICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2Vhayhib29sJiBfX2kxLCBib29sIF9faTIsIG1lbW9yeV9vcmRlciBfX20xLAorCQkJICBtZW1vcnlfb3JkZXIgX19tMikgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV9iYXNlLmNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2kxLCBfX2kyLCBfX20xLCBfX20yKTsgfQorCisgICAgYm9vbAorICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2Vhayhib29sJiBfX2kxLCBib29sIF9faTIsIG1lbW9yeV9vcmRlciBfX20xLAorCQkJICBtZW1vcnlfb3JkZXIgX19tMikgdm9sYXRpbGUgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV9iYXNlLmNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2kxLCBfX2kyLCBfX20xLCBfX20yKTsgfQorCisgICAgYm9vbAorICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2Vhayhib29sJiBfX2kxLCBib29sIF9faTIsCisJCQkgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV9iYXNlLmNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2kxLCBfX2kyLCBfX20pOyB9CisKKyAgICBib29sCisgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKGJvb2wmIF9faTEsIGJvb2wgX19pMiwKKwkJICAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fYmFzZS5jb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19pMSwgX19pMiwgX19tKTsgfQorCisgICAgYm9vbAorICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGJvb2wmIF9faTEsIGJvb2wgX19pMiwgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbTIpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fYmFzZS5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2kxLCBfX2kyLCBfX20xLCBfX20yKTsgfQorCisgICAgYm9vbAorICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGJvb2wmIF9faTEsIGJvb2wgX19pMiwgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbTIpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fYmFzZS5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2kxLCBfX2kyLCBfX20xLCBfX20yKTsgfQorCisgICAgYm9vbAorICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGJvb2wmIF9faTEsIGJvb2wgX19pMiwKKwkJCSAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fYmFzZS5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2kxLCBfX2kyLCBfX20pOyB9CisKKyAgICBib29sCisgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoYm9vbCYgX19pMSwgYm9vbCBfX2kyLAorCQkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX2Jhc2UuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19pMSwgX19pMiwgX19tKTsgfQorICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgR2VuZXJpYyBhdG9taWMgdHlwZSwgcHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZS4KKyAgICoKKyAgICogIEB0cGFyYW0gX1RwICBUeXBlIHRvIGJlIG1hZGUgYXRvbWljLCBtdXN0IGJlIHRyaXZhbGx5IGNvcHlhYmxlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhdG9taWMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIF9UcCBfTV9pOworCisgICAgcHVibGljOgorICAgICAgYXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX1RwIF9faSkgbm9leGNlcHQgOiBfTV9pKF9faSkgeyB9CisKKyAgICAgIG9wZXJhdG9yIF9UcCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBsb2FkKCk7IH0KKworICAgICAgb3BlcmF0b3IgX1RwKCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGxvYWQoKTsgfQorCisgICAgICBfVHAKKyAgICAgIG9wZXJhdG9yPShfVHAgX19pKSBub2V4Y2VwdCAKKyAgICAgIHsgc3RvcmUoX19pKTsgcmV0dXJuIF9faTsgfQorCisgICAgICBfVHAKKyAgICAgIG9wZXJhdG9yPShfVHAgX19pKSB2b2xhdGlsZSBub2V4Y2VwdCAKKyAgICAgIHsgc3RvcmUoX19pKTsgcmV0dXJuIF9faTsgfQorCisgICAgICBib29sCisgICAgICBpc19sb2NrX2ZyZWUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfaXNfbG9ja19mcmVlKHNpemVvZihfTV9pKSwgbnVsbHB0cik7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2lzX2xvY2tfZnJlZShzaXplb2YoX01faSksIG51bGxwdHIpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN0b3JlKF9UcCBfX2ksIG1lbW9yeV9vcmRlciBfbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeyBfX2F0b21pY19zdG9yZSgmX01faSwgJl9faSwgX20pOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN0b3JlKF9UcCBfX2ksIG1lbW9yeV9vcmRlciBfbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyBfX2F0b21pY19zdG9yZSgmX01faSwgJl9faSwgX20pOyB9CisKKyAgICAgIF9UcAorICAgICAgbG9hZChtZW1vcnlfb3JkZXIgX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgCisgICAgICAgIF9UcCB0bXA7CisJX19hdG9taWNfbG9hZCgmX01faSwgJnRtcCwgX20pOyAKKwlyZXR1cm4gdG1wOworICAgICAgfQorCisgICAgICBfVHAKKyAgICAgIGxvYWQobWVtb3J5X29yZGVyIF9tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0IHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IAorICAgICAgICBfVHAgdG1wOworCV9fYXRvbWljX2xvYWQoJl9NX2ksICZ0bXAsIF9tKTsgCisJcmV0dXJuIHRtcDsKKyAgICAgIH0KKworICAgICAgX1RwCisgICAgICBleGNoYW5nZShfVHAgX19pLCBtZW1vcnlfb3JkZXIgX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgCisgICAgICAgIF9UcCB0bXA7CisJX19hdG9taWNfZXhjaGFuZ2UoJl9NX2ksICZfX2ksICZ0bXAsIF9tKTsgCisJcmV0dXJuIHRtcDsKKyAgICAgIH0KKworICAgICAgX1RwCisgICAgICBleGNoYW5nZShfVHAgX19pLCAKKwkgICAgICAgbWVtb3J5X29yZGVyIF9tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IAorICAgICAgICBfVHAgdG1wOworCV9fYXRvbWljX2V4Y2hhbmdlKCZfTV9pLCAmX19pLCAmdG1wLCBfbSk7IAorCXJldHVybiB0bXA7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfVHAmIF9fZSwgX1RwIF9faSwgbWVtb3J5X29yZGVyIF9fcywgCisJCQkgICAgbWVtb3J5X29yZGVyIF9fZikgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gX19hdG9taWNfY29tcGFyZV9leGNoYW5nZSgmX01faSwgJl9fZSwgJl9faSwgdHJ1ZSwgX19zLCBfX2YpOyAKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKF9UcCYgX19lLCBfVHAgX19pLCBtZW1vcnlfb3JkZXIgX19zLCAKKwkJCSAgICBtZW1vcnlfb3JkZXIgX19mKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlKCZfTV9pLCAmX19lLCAmX19pLCB0cnVlLCBfX3MsIF9fZik7IAorICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX1RwJiBfX2UsIF9UcCBfX2ksCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29tcGFyZV9leGNoYW5nZV93ZWFrKF9fZSwgX19pLCBfX20sIF9fbSk7IH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKF9UcCYgX19lLCBfVHAgX19pLAorCQkgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2UsIF9faSwgX19tLCBfX20pOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9UcCYgX19lLCBfVHAgX19pLCBtZW1vcnlfb3JkZXIgX19zLCAKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX2YpIG5vZXhjZXB0CisgICAgICB7CisJcmV0dXJuIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UoJl9NX2ksICZfX2UsICZfX2ksIGZhbHNlLCBfX3MsIF9fZik7IAorICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfVHAmIF9fZSwgX1RwIF9faSwgbWVtb3J5X29yZGVyIF9fcywgCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19mKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlKCZfTV9pLCAmX19lLCAmX19pLCBmYWxzZSwgX19zLCBfX2YpOyAKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX1RwJiBfX2UsIF9UcCBfX2ksCisJCQkgICAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19lLCBfX2ksIF9fbSwgX19tKTsgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfVHAmIF9fZSwgX1RwIF9faSwKKwkJICAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2UsIF9faSwgX19tLCBfX20pOyB9CisgICAgfTsKKworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBwb2ludGVyIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGF0b21pYzxfVHAqPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwKiAJCQlfX3BvaW50ZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxfVHAqPglfX2Jhc2VfdHlwZTsKKyAgICAgIF9fYmFzZV90eXBlCQkJX01fYjsKKworICAgICAgYXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19wb2ludGVyX3R5cGUgX19wKSBub2V4Y2VwdCA6IF9NX2IoX19wKSB7IH0KKworICAgICAgb3BlcmF0b3IgX19wb2ludGVyX3R5cGUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19wb2ludGVyX3R5cGUoX01fYik7IH0KKworICAgICAgb3BlcmF0b3IgX19wb2ludGVyX3R5cGUoKSBjb25zdCB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19wb2ludGVyX3R5cGUoX01fYik7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yPShfX3BvaW50ZXJfdHlwZSBfX3ApIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9iLm9wZXJhdG9yPShfX3ApOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcj0oX19wb2ludGVyX3R5cGUgX19wKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5vcGVyYXRvcj0oX19wKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrKyhpbnQpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9iKys7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKysoaW50KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYisrOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci0tKGludCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2ItLTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItLShpbnQpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9iLS07IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKysoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gKytfTV9iOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcisrKCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuICsrX01fYjsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItLSgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiAtLV9NX2I7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLS0oKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gLS1fTV9iOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcis9KHB0cmRpZmZfdCBfX2QpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9iLm9wZXJhdG9yKz0oX19kKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrPShwdHJkaWZmX3QgX19kKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5vcGVyYXRvcis9KF9fZCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLT0ocHRyZGlmZl90IF9fZCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2Iub3BlcmF0b3ItPShfX2QpOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci09KHB0cmRpZmZfdCBfX2QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9iLm9wZXJhdG9yLT0oX19kKTsgfQorCisgICAgICBib29sCisgICAgICBpc19sb2NrX2ZyZWUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5pc19sb2NrX2ZyZWUoKTsgfQorCisgICAgICBib29sCisgICAgICBpc19sb2NrX2ZyZWUoKSBjb25zdCB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5pc19sb2NrX2ZyZWUoKTsgfQorCisgICAgICB2b2lkCisgICAgICBzdG9yZShfX3BvaW50ZXJfdHlwZSBfX3AsCisJICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2Iuc3RvcmUoX19wLCBfX20pOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN0b3JlKF9fcG9pbnRlcl90eXBlIF9fcCwKKwkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5zdG9yZShfX3AsIF9fbSk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGxvYWQobWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5sb2FkKF9fbSk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGxvYWQobWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBjb25zdCB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5sb2FkKF9fbSk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGV4Y2hhbmdlKF9fcG9pbnRlcl90eXBlIF9fcCwKKwkgICAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5leGNoYW5nZShfX3AsIF9fbSk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGV4Y2hhbmdlKF9fcG9pbnRlcl90eXBlIF9fcCwKKwkgICAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5leGNoYW5nZShfX3AsIF9fbSk7IH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKF9fcG9pbnRlcl90eXBlJiBfX3AxLCBfX3BvaW50ZXJfdHlwZSBfX3AyLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX20xLCBtZW1vcnlfb3JkZXIgX19tMikgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wMSwgX19wMiwgX19tMSwgX19tMik7IH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKF9fcG9pbnRlcl90eXBlJiBfX3AxLCBfX3BvaW50ZXJfdHlwZSBfX3AyLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX20xLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX20yKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3AxLCBfX3AyLCBfX20xLCBfX20yKTsgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19wb2ludGVyX3R5cGUmIF9fcDEsIF9fcG9pbnRlcl90eXBlIF9fcDIsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19wMSwgX19wMiwgX19tLAorCQkJCSAgICAgX19jbXBleGNoX2ZhaWx1cmVfb3JkZXIoX19tKSk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX3BvaW50ZXJfdHlwZSYgX19wMSwgX19wb2ludGVyX3R5cGUgX19wMiwKKwkJICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gY29tcGFyZV9leGNoYW5nZV93ZWFrKF9fcDEsIF9fcDIsIF9fbSwKKwkJCQkgICAgIF9fY21wZXhjaF9mYWlsdXJlX29yZGVyKF9fbSkpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3BvaW50ZXJfdHlwZSYgX19wMSwgX19wb2ludGVyX3R5cGUgX19wMiwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20xLCBtZW1vcnlfb3JkZXIgX19tMikgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wMSwgX19wMiwgX19tMSwgX19tMik7IH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wb2ludGVyX3R5cGUmIF9fcDEsIF9fcG9pbnRlcl90eXBlIF9fcDIsCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tMSwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20yKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3AxLCBfX3AyLCBfX20xLCBfX20yKTsgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3BvaW50ZXJfdHlwZSYgX19wMSwgX19wb2ludGVyX3R5cGUgX19wMiwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gX01fYi5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3AxLCBfX3AyLCBfX20sCisJCQkJCSAgICBfX2NtcGV4Y2hfZmFpbHVyZV9vcmRlcihfX20pKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wb2ludGVyX3R5cGUmIF9fcDEsIF9fcG9pbnRlcl90eXBlIF9fcDIsCisJCSAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7CisJcmV0dXJuIF9NX2IuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wMSwgX19wMiwgX19tLAorCQkJCQkgICAgX19jbXBleGNoX2ZhaWx1cmVfb3JkZXIoX19tKSk7CisgICAgICB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBmZXRjaF9hZGQocHRyZGlmZl90IF9fZCwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5mZXRjaF9hZGQoX19kLCBfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBmZXRjaF9hZGQocHRyZGlmZl90IF9fZCwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5mZXRjaF9hZGQoX19kLCBfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBmZXRjaF9zdWIocHRyZGlmZl90IF9fZCwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5mZXRjaF9zdWIoX19kLCBfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBmZXRjaF9zdWIocHRyZGlmZl90IF9fZCwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5mZXRjaF9zdWIoX19kLCBfX20pOyB9CisgICAgfTsKKworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgYm9vbC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8Ym9vbD4gOiBwdWJsaWMgYXRvbWljX2Jvb2wKKyAgICB7CisgICAgICB0eXBlZGVmIGJvb2wgCQkJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfYm9vbCAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSBub2V4Y2VwdCA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBjaGFyLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzxjaGFyPiA6IHB1YmxpYyBhdG9taWNfY2hhcgorICAgIHsKKyAgICAgIHR5cGVkZWYgY2hhciAJCQlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY19jaGFyIAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIG5vZXhjZXB0IDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHNpZ25lZCBjaGFyLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzxzaWduZWQgY2hhcj4gOiBwdWJsaWMgYXRvbWljX3NjaGFyCisgICAgeworICAgICAgdHlwZWRlZiBzaWduZWQgY2hhciAJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX3NjaGFyIAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0PSBkZWZhdWx0OworICAgICAgfmF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgbm9leGNlcHQgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgdW5zaWduZWQgY2hhci4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8dW5zaWduZWQgY2hhcj4gOiBwdWJsaWMgYXRvbWljX3VjaGFyCisgICAgeworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIAkJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfdWNoYXIgCQlfX2Jhc2VfdHlwZTsKKworICAgICAgYXRvbWljKCkgbm9leGNlcHQ9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSBub2V4Y2VwdCA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBzaG9ydC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8c2hvcnQ+IDogcHVibGljIGF0b21pY19zaG9ydAorICAgIHsKKyAgICAgIHR5cGVkZWYgc2hvcnQgCQkJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfc2hvcnQgCQlfX2Jhc2VfdHlwZTsKKworICAgICAgYXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgbm9leGNlcHQgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgdW5zaWduZWQgc2hvcnQuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPHVuc2lnbmVkIHNob3J0PiA6IHB1YmxpYyBhdG9taWNfdXNob3J0CisgICAgeworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAJICAgICAgCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX3VzaG9ydCAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSBub2V4Y2VwdCA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBpbnQuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPGludD4gOiBhdG9taWNfaW50CisgICAgeworICAgICAgdHlwZWRlZiBpbnQgCQkJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfaW50IAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIG5vZXhjZXB0IDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHVuc2lnbmVkIGludC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8dW5zaWduZWQgaW50PiA6IHB1YmxpYyBhdG9taWNfdWludAorICAgIHsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50CQlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY191aW50IAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIG5vZXhjZXB0IDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIGxvbmcuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPGxvbmc+IDogcHVibGljIGF0b21pY19sb25nCisgICAgeworICAgICAgdHlwZWRlZiBsb25nIAkJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX2xvbmcgCQlfX2Jhc2VfdHlwZTsKKworICAgICAgYXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgbm9leGNlcHQgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgdW5zaWduZWQgbG9uZy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8dW5zaWduZWQgbG9uZz4gOiBwdWJsaWMgYXRvbWljX3Vsb25nCisgICAgeworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIAkJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfdWxvbmcgCQlfX2Jhc2VfdHlwZTsKKworICAgICAgYXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgbm9leGNlcHQgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgbG9uZyBsb25nLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzxsb25nIGxvbmc+IDogcHVibGljIGF0b21pY19sbG9uZworICAgIHsKKyAgICAgIHR5cGVkZWYgbG9uZyBsb25nIAkJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfbGxvbmcgCQlfX2Jhc2VfdHlwZTsKKworICAgICAgYXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgbm9leGNlcHQgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgdW5zaWduZWQgbG9uZyBsb25nLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzx1bnNpZ25lZCBsb25nIGxvbmc+IDogcHVibGljIGF0b21pY191bGxvbmcKKyAgICB7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgICAgICAJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfdWxsb25nIAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIG5vZXhjZXB0IDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHdjaGFyX3QuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPHdjaGFyX3Q+IDogcHVibGljIGF0b21pY193Y2hhcl90CisgICAgeworICAgICAgdHlwZWRlZiB3Y2hhcl90IAkJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX3djaGFyX3QgCQlfX2Jhc2VfdHlwZTsKKworICAgICAgYXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgbm9leGNlcHQgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgY2hhcjE2X3QuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPGNoYXIxNl90PiA6IHB1YmxpYyBhdG9taWNfY2hhcjE2X3QKKyAgICB7CisgICAgICB0eXBlZGVmIGNoYXIxNl90IAkJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX2NoYXIxNl90IAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIG5vZXhjZXB0IDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIGNoYXIzMl90LgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzxjaGFyMzJfdD4gOiBwdWJsaWMgYXRvbWljX2NoYXIzMl90CisgICAgeworICAgICAgdHlwZWRlZiBjaGFyMzJfdCAJCQlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY19jaGFyMzJfdCAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSBub2V4Y2VwdCA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKworICAvLyBGdW5jdGlvbiBkZWZpbml0aW9ucywgYXRvbWljX2ZsYWcgb3BlcmF0aW9ucy4KKyAgaW5saW5lIGJvb2wKKyAgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0X2V4cGxpY2l0KGF0b21pY19mbGFnKiBfX2EsCisJCQkJICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgIHsgcmV0dXJuIF9fYS0+dGVzdF9hbmRfc2V0KF9fbSk7IH0KKworICBpbmxpbmUgYm9vbAorICBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ZsYWcqIF9fYSwKKwkJCQkgICAgbWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgeyByZXR1cm4gX19hLT50ZXN0X2FuZF9zZXQoX19tKTsgfQorCisgIGlubGluZSB2b2lkCisgIGF0b21pY19mbGFnX2NsZWFyX2V4cGxpY2l0KGF0b21pY19mbGFnKiBfX2EsIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgIHsgX19hLT5jbGVhcihfX20pOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgYXRvbWljX2ZsYWdfY2xlYXJfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljX2ZsYWcqIF9fYSwKKwkJCSAgICAgbWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgeyBfX2EtPmNsZWFyKF9fbSk7IH0KKworICBpbmxpbmUgYm9vbAorICBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXQoYXRvbWljX2ZsYWcqIF9fYSkgbm9leGNlcHQKKyAgeyByZXR1cm4gYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0X2V4cGxpY2l0KF9fYSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0KHZvbGF0aWxlIGF0b21pY19mbGFnKiBfX2EpIG5vZXhjZXB0CisgIHsgcmV0dXJuIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldF9leHBsaWNpdChfX2EsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIGlubGluZSB2b2lkCisgIGF0b21pY19mbGFnX2NsZWFyKGF0b21pY19mbGFnKiBfX2EpIG5vZXhjZXB0CisgIHsgYXRvbWljX2ZsYWdfY2xlYXJfZXhwbGljaXQoX19hLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICBpbmxpbmUgdm9pZAorICBhdG9taWNfZmxhZ19jbGVhcih2b2xhdGlsZSBhdG9taWNfZmxhZyogX19hKSBub2V4Y2VwdAorICB7IGF0b21pY19mbGFnX2NsZWFyX2V4cGxpY2l0KF9fYSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKworICAvLyBGdW5jdGlvbiB0ZW1wbGF0ZXMgZ2VuZXJhbGx5IGFwcGxpY2FibGUgdG8gYXRvbWljIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBib29sCisgICAgYXRvbWljX2lzX2xvY2tfZnJlZShjb25zdCBhdG9taWM8X0lUcD4qIF9fYSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmlzX2xvY2tfZnJlZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGF0b21pY19pc19sb2NrX2ZyZWUoY29uc3Qgdm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5pc19sb2NrX2ZyZWUoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBhdG9taWNfaW5pdChhdG9taWM8X0lUcD4qIF9fYSwgX0lUcCBfX2kpIG5vZXhjZXB0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBhdG9taWNfaW5pdCh2b2xhdGlsZSBhdG9taWM8X0lUcD4qIF9fYSwgX0lUcCBfX2kpIG5vZXhjZXB0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBhdG9taWNfc3RvcmVfZXhwbGljaXQoYXRvbWljPF9JVHA+KiBfX2EsIF9JVHAgX19pLAorCQkJICBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgX19hLT5zdG9yZShfX2ksIF9fbSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSB2b2lkCisgICAgYXRvbWljX3N0b3JlX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgbWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgICB7IF9fYS0+c3RvcmUoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19sb2FkX2V4cGxpY2l0KGNvbnN0IGF0b21pYzxfSVRwPiogX19hLCBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+bG9hZChfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19sb2FkX2V4cGxpY2l0KGNvbnN0IHZvbGF0aWxlIGF0b21pYzxfSVRwPiogX19hLAorCQkJIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5sb2FkKF9fbSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2V4Y2hhbmdlX2V4cGxpY2l0KGF0b21pYzxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgbWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmV4Y2hhbmdlKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EsIF9JVHAgX19pLAorCQkJICAgICBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZXhjaGFuZ2UoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWtfZXhwbGljaXQoYXRvbWljPF9JVHA+KiBfX2EsCisJCQkJCSAgX0lUcCogX19pMSwgX0lUcCBfX2kyLAorCQkJCQkgIG1lbW9yeV9vcmRlciBfX20xLAorCQkJCQkgIG1lbW9yeV9vcmRlciBfX20yKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+Y29tcGFyZV9leGNoYW5nZV93ZWFrKCpfX2kxLCBfX2kyLCBfX20xLCBfX20yKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfSVRwPiogX19hLAorCQkJCQkgIF9JVHAqIF9faTEsIF9JVHAgX19pMiwKKwkJCQkJICBtZW1vcnlfb3JkZXIgX19tMSwKKwkJCQkJICBtZW1vcnlfb3JkZXIgX19tMikgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmNvbXBhcmVfZXhjaGFuZ2Vfd2VhaygqX19pMSwgX19pMiwgX19tMSwgX19tMik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nX2V4cGxpY2l0KGF0b21pYzxfSVRwPiogX19hLAorCQkJCQkgICAgX0lUcCogX19pMSwgX0lUcCBfX2kyLAorCQkJCQkgICAgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkJCSAgICBtZW1vcnlfb3JkZXIgX19tMikgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKCpfX2kxLCBfX2kyLCBfX20xLCBfX20yKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmdfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EsCisJCQkJCSAgICBfSVRwKiBfX2kxLCBfSVRwIF9faTIsCisJCQkJCSAgICBtZW1vcnlfb3JkZXIgX19tMSwKKwkJCQkJICAgIG1lbW9yeV9vcmRlciBfX20yKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+Y29tcGFyZV9leGNoYW5nZV9zdHJvbmcoKl9faTEsIF9faTIsIF9fbTEsIF9fbTIpOyB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSB2b2lkCisgICAgYXRvbWljX3N0b3JlKGF0b21pYzxfSVRwPiogX19hLCBfSVRwIF9faSkgbm9leGNlcHQKKyAgICB7IGF0b21pY19zdG9yZV9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGF0b21pY19zdG9yZSh2b2xhdGlsZSBhdG9taWM8X0lUcD4qIF9fYSwgX0lUcCBfX2kpIG5vZXhjZXB0CisgICAgeyBhdG9taWNfc3RvcmVfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfbG9hZChjb25zdCBhdG9taWM8X0lUcD4qIF9fYSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBhdG9taWNfbG9hZF9leHBsaWNpdChfX2EsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfbG9hZChjb25zdCB2b2xhdGlsZSBhdG9taWM8X0lUcD4qIF9fYSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBhdG9taWNfbG9hZF9leHBsaWNpdChfX2EsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZXhjaGFuZ2UoYXRvbWljPF9JVHA+KiBfX2EsIF9JVHAgX19pKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGF0b21pY19leGNoYW5nZV9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19leGNoYW5nZSh2b2xhdGlsZSBhdG9taWM8X0lUcD4qIF9fYSwgX0lUcCBfX2kpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gYXRvbWljX2V4Y2hhbmdlX2V4cGxpY2l0KF9fYSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhhdG9taWM8X0lUcD4qIF9fYSwKKwkJCQkgX0lUcCogX19pMSwgX0lUcCBfX2kyKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHJldHVybiBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrX2V4cGxpY2l0KF9fYSwgX19pMSwgX19pMiwKKwkJCQkJCSAgIG1lbW9yeV9vcmRlcl9zZXFfY3N0LAorCQkJCQkJICAgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vhayh2b2xhdGlsZSBhdG9taWM8X0lUcD4qIF9fYSwKKwkJCQkgX0lUcCogX19pMSwgX0lUcCBfX2kyKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHJldHVybiBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrX2V4cGxpY2l0KF9fYSwgX19pMSwgX19pMiwKKwkJCQkJCSAgIG1lbW9yeV9vcmRlcl9zZXFfY3N0LAorCQkJCQkJICAgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGF0b21pYzxfSVRwPiogX19hLAorCQkJCSAgIF9JVHAqIF9faTEsIF9JVHAgX19pMikgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nX2V4cGxpY2l0KF9fYSwgX19pMSwgX19pMiwKKwkJCQkJCSAgICAgbWVtb3J5X29yZGVyX3NlcV9jc3QsCisJCQkJCQkgICAgIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyh2b2xhdGlsZSBhdG9taWM8X0lUcD4qIF9fYSwKKwkJCQkgICBfSVRwKiBfX2kxLCBfSVRwIF9faTIpIG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdChfX2EsIF9faTEsIF9faTIsCisJCQkJCQkgICAgIG1lbW9yeV9vcmRlcl9zZXFfY3N0LAorCQkJCQkJICAgICBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgfQorCisgIC8vIEZ1bmN0aW9uIHRlbXBsYXRlcyBmb3IgYXRvbWljX2ludGVncmFsIG9wZXJhdGlvbnMgb25seSwgdXNpbmcKKyAgLy8gX19hdG9taWNfYmFzZS4gVGVtcGxhdGUgYXJndW1lbnQgc2hvdWxkIGJlIGNvbnN0cmljdGVkIHRvCisgIC8vIGludGVyZ3JhbCB0eXBlcyBhcyBzcGVjaWZpZWQgaW4gdGhlIHN0YW5kYXJkLCBleGNsdWRpbmcgYWRkcmVzcworICAvLyB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9hZGQoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQodm9sYXRpbGUgX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9hZGQoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQoX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9zdWIoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQodm9sYXRpbGUgX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9zdWIoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9hbmRfZXhwbGljaXQoX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9hbmQoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9hbmRfZXhwbGljaXQodm9sYXRpbGUgX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9hbmQoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9vcl9leHBsaWNpdChfX2F0b21pY19iYXNlPF9JVHA+KiBfX2EsIF9JVHAgX19pLAorCQkJICAgICBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfb3IoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9vcl9leHBsaWNpdCh2b2xhdGlsZSBfX2F0b21pY19iYXNlPF9JVHA+KiBfX2EsIF9JVHAgX19pLAorCQkJICAgICBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfb3IoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF94b3JfZXhwbGljaXQoX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5mZXRjaF94b3IoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF94b3JfZXhwbGljaXQodm9sYXRpbGUgX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5mZXRjaF94b3IoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9hZGQoX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KF9fYSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2ZldGNoX2FkZCh2b2xhdGlsZSBfX2F0b21pY19iYXNlPF9JVHA+KiBfX2EsIF9JVHAgX19pKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfc3ViKF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2kpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gYXRvbWljX2ZldGNoX3N1Yl9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9zdWIodm9sYXRpbGUgX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KF9fYSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2ZldGNoX2FuZChfX2F0b21pY19iYXNlPF9JVHA+KiBfX2EsIF9JVHAgX19pKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGF0b21pY19mZXRjaF9hbmRfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfYW5kKHZvbGF0aWxlIF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2kpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gYXRvbWljX2ZldGNoX2FuZF9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9vcihfX2F0b21pY19iYXNlPF9JVHA+KiBfX2EsIF9JVHAgX19pKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGF0b21pY19mZXRjaF9vcl9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9vcih2b2xhdGlsZSBfX2F0b21pY19iYXNlPF9JVHA+KiBfX2EsIF9JVHAgX19pKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGF0b21pY19mZXRjaF9vcl9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF94b3IoX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBhdG9taWNfZmV0Y2hfeG9yX2V4cGxpY2l0KF9fYSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2ZldGNoX3hvcih2b2xhdGlsZSBfX2F0b21pY19iYXNlPF9JVHA+KiBfX2EsIF9JVHAgX19pKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGF0b21pY19mZXRjaF94b3JfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisKKyAgLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbnMgZm9yIHBvaW50ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwKgorICAgIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoYXRvbWljPF9JVHAqPiogX19hLCBwdHJkaWZmX3QgX19kLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX2FkZChfX2QsIF9fbSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwKgorICAgIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljPF9JVHAqPiogX19hLCBwdHJkaWZmX3QgX19kLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX2FkZChfX2QsIF9fbSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwKgorICAgIGF0b21pY19mZXRjaF9hZGQodm9sYXRpbGUgYXRvbWljPF9JVHAqPiogX19hLCBwdHJkaWZmX3QgX19kKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfYWRkKF9fZCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwKgorICAgIGF0b21pY19mZXRjaF9hZGQoYXRvbWljPF9JVHAqPiogX19hLCBwdHJkaWZmX3QgX19kKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfYWRkKF9fZCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwKgorICAgIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljPF9JVHAqPiogX19hLAorCQkJICAgICAgcHRyZGlmZl90IF9fZCwgbWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX3N1YihfX2QsIF9fbSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwKgorICAgIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQoYXRvbWljPF9JVHAqPiogX19hLCBwdHJkaWZmX3QgX19kLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX3N1YihfX2QsIF9fbSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwKgorICAgIGF0b21pY19mZXRjaF9zdWIodm9sYXRpbGUgYXRvbWljPF9JVHAqPiogX19hLCBwdHJkaWZmX3QgX19kKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfc3ViKF9fZCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwKgorICAgIGF0b21pY19mZXRjaF9zdWIoYXRvbWljPF9JVHAqPiogX19hLCBwdHJkaWZmX3QgX19kKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfc3ViKF9fZCk7IH0KKyAgLy8gQH0gZ3JvdXAgYXRvbWljcworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9hdXRvX3B0ci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9hdXRvX3B0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYzlkMmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2F1dG9fcHRyLmgKQEAgLTAsMCArMSwzMjkgQEAKKy8vIGF1dG9fcHRyIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiYWNrd2FyZC9hdXRvX3B0ci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWVtb3J5fQorICovCisKKyNpZm5kZWYgX0JBQ0tXQVJEX0FVVE9fUFRSX0gKKyNkZWZpbmUgX0JBQ0tXQVJEX0FVVE9fUFRSX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBBIHdyYXBwZXIgY2xhc3MgdG8gcHJvdmlkZSBhdXRvX3B0ciB3aXRoIHJlZmVyZW5jZSBzZW1hbnRpY3MuCisgICAqICBGb3IgZXhhbXBsZSwgYW4gYXV0b19wdHIgY2FuIGJlIGFzc2lnbmVkIChvciBjb25zdHJ1Y3RlZCBmcm9tKQorICAgKiAgdGhlIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gYXV0b19wdHIgYnkgdmFsdWUuCisgICAqCisgICAqICBBbGwgdGhlIGF1dG9fcHRyX3JlZiBzdHVmZiBzaG91bGQgaGFwcGVuIGJlaGluZCB0aGUgc2NlbmVzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICBzdHJ1Y3QgYXV0b19wdHJfcmVmCisgICAgeworICAgICAgX1RwMSogX01fcHRyOworICAgICAgCisgICAgICBleHBsaWNpdAorICAgICAgYXV0b19wdHJfcmVmKF9UcDEqIF9fcCk6IF9NX3B0cihfX3ApIHsgfQorICAgIH0gX0dMSUJDWFhfREVQUkVDQVRFRDsKKworCisgIC8qKgorICAgKiAgQGJyaWVmICBBIHNpbXBsZSBzbWFydCBwb2ludGVyIHByb3ZpZGluZyBzdHJpY3Qgb3duZXJzaGlwIHNlbWFudGljcy4KKyAgICoKKyAgICogIFRoZSBTdGFuZGFyZCBzYXlzOgorICAgKiAgPHByZT4KKyAgICogIEFuIEBjIGF1dG9fcHRyIG93bnMgdGhlIG9iamVjdCBpdCBob2xkcyBhIHBvaW50ZXIgdG8uICBDb3B5aW5nCisgICAqICBhbiBAYyBhdXRvX3B0ciBjb3BpZXMgdGhlIHBvaW50ZXIgYW5kIHRyYW5zZmVycyBvd25lcnNoaXAgdG8gdGhlCisgICAqICBkZXN0aW5hdGlvbi4gIElmIG1vcmUgdGhhbiBvbmUgQGMgYXV0b19wdHIgb3ducyB0aGUgc2FtZSBvYmplY3QKKyAgICogIGF0IHRoZSBzYW1lIHRpbWUgdGhlIGJlaGF2aW9yIG9mIHRoZSBwcm9ncmFtIGlzIHVuZGVmaW5lZC4KKyAgICoKKyAgICogIFRoZSB1c2VzIG9mIEBjIGF1dG9fcHRyIGluY2x1ZGUgcHJvdmlkaW5nIHRlbXBvcmFyeQorICAgKiAgZXhjZXB0aW9uLXNhZmV0eSBmb3IgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSwgcGFzc2luZworICAgKiAgb3duZXJzaGlwIG9mIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkgdG8gYSBmdW5jdGlvbiwgYW5kCisgICAqICByZXR1cm5pbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSBmcm9tIGEgZnVuY3Rpb24uICBAYworICAgKiAgYXV0b19wdHIgZG9lcyBub3QgbWVldCB0aGUgQ29weUNvbnN0cnVjdGlibGUgYW5kIEFzc2lnbmFibGUKKyAgICogIHJlcXVpcmVtZW50cyBmb3IgU3RhbmRhcmQgTGlicmFyeSA8YQorICAgKiAgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4gZWxlbWVudHMgYW5kIHRodXMKKyAgICogIGluc3RhbnRpYXRpbmcgYSBTdGFuZGFyZCBMaWJyYXJ5IGNvbnRhaW5lciB3aXRoIGFuIEBjIGF1dG9fcHRyCisgICAqICByZXN1bHRzIGluIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICogIDwvcHJlPgorICAgKiAgUXVvdGVkIGZyb20gWzIwLjQuNV0vMy4KKyAgICoKKyAgICogIEdvb2QgZXhhbXBsZXMgb2Ygd2hhdCBjYW4gYW5kIGNhbm5vdCBiZSBkb25lIHdpdGggYXV0b19wdHIgY2FuCisgICAqICBiZSBmb3VuZCBpbiB0aGUgbGlic3RkYysrIHRlc3RzdWl0ZS4KKyAgICoKKyAgICogIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICogIDEyNy4gIGF1dG9fcHRyPD4gY29udmVyc2lvbiBpc3N1ZXMKKyAgICogIFRoZXNlIHJlc29sdXRpb25zIGhhdmUgYWxsIGJlZW4gaW5jb3Jwb3JhdGVkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGF1dG9fcHRyCisgICAgeworICAgIHByaXZhdGU6CisgICAgICBfVHAqIF9NX3B0cjsKKyAgICAgIAorICAgIHB1YmxpYzoKKyAgICAgIC8vLyBUaGUgcG9pbnRlZC10byB0eXBlLgorICAgICAgdHlwZWRlZiBfVHAgZWxlbWVudF90eXBlOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFuICVhdXRvX3B0ciBpcyB1c3VhbGx5IGNvbnN0cnVjdGVkIGZyb20gYSByYXcgcG9pbnRlci4KKyAgICAgICAqICBAcGFyYW0gIF9fcCAgQSBwb2ludGVyIChkZWZhdWx0cyB0byBOVUxMKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvYmplY3Qgbm93IEBlIG93bnMgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IEBhIF9fcC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGF1dG9fcHRyKGVsZW1lbnRfdHlwZSogX19wID0gMCkgdGhyb3coKSA6IF9NX3B0cihfX3ApIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFuICVhdXRvX3B0ciBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBhbm90aGVyICVhdXRvX3B0ci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW5vdGhlciAlYXV0b19wdHIgb2YgdGhlIHNhbWUgdHlwZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvYmplY3Qgbm93IEBlIG93bnMgdGhlIG9iamVjdCBwcmV2aW91c2x5IG93bmVkIGJ5IEBhIF9fYSwKKyAgICAgICAqICB3aGljaCBoYXMgZ2l2ZW4gdXAgb3duZXJzaGlwLgorICAgICAgICovCisgICAgICBhdXRvX3B0cihhdXRvX3B0ciYgX19hKSB0aHJvdygpIDogX01fcHRyKF9fYS5yZWxlYXNlKCkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFuICVhdXRvX3B0ciBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBhbm90aGVyICVhdXRvX3B0ci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW5vdGhlciAlYXV0b19wdHIgb2YgYSBkaWZmZXJlbnQgYnV0IHJlbGF0ZWQgdHlwZS4KKyAgICAgICAqCisgICAgICAgKiAgQSBwb2ludGVyLXRvLVRwMSBtdXN0IGJlIGNvbnZlcnRpYmxlIHRvIGEKKyAgICAgICAqICBwb2ludGVyLXRvLVRwL2VsZW1lbnRfdHlwZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvYmplY3Qgbm93IEBlIG93bnMgdGhlIG9iamVjdCBwcmV2aW91c2x5IG93bmVkIGJ5IEBhIF9fYSwKKyAgICAgICAqICB3aGljaCBoYXMgZ2l2ZW4gdXAgb3duZXJzaGlwLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBhdXRvX3B0cihhdXRvX3B0cjxfVHAxPiYgX19hKSB0aHJvdygpIDogX01fcHRyKF9fYS5yZWxlYXNlKCkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVhdXRvX3B0ciBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbm90aGVyICVhdXRvX3B0ciBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9iamVjdCBub3cgQGUgb3ducyB0aGUgb2JqZWN0IHByZXZpb3VzbHkgb3duZWQgYnkgQGEgX19hLAorICAgICAgICogIHdoaWNoIGhhcyBnaXZlbiB1cCBvd25lcnNoaXAuICBUaGUgb2JqZWN0IHRoYXQgdGhpcyBvbmUgQGUKKyAgICAgICAqICB1c2VkIHRvIG93biBhbmQgdHJhY2sgaGFzIGJlZW4gZGVsZXRlZC4KKyAgICAgICAqLworICAgICAgYXV0b19wdHImCisgICAgICBvcGVyYXRvcj0oYXV0b19wdHImIF9fYSkgdGhyb3coKQorICAgICAgeworCXJlc2V0KF9fYS5yZWxlYXNlKCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlYXV0b19wdHIgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW5vdGhlciAlYXV0b19wdHIgb2YgYSBkaWZmZXJlbnQgYnV0IHJlbGF0ZWQgdHlwZS4KKyAgICAgICAqCisgICAgICAgKiAgQSBwb2ludGVyLXRvLVRwMSBtdXN0IGJlIGNvbnZlcnRpYmxlIHRvIGEgcG9pbnRlci10by1UcC9lbGVtZW50X3R5cGUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgb2JqZWN0IG5vdyBAZSBvd25zIHRoZSBvYmplY3QgcHJldmlvdXNseSBvd25lZCBieSBAYSBfX2EsCisgICAgICAgKiAgd2hpY2ggaGFzIGdpdmVuIHVwIG93bmVyc2hpcC4gIFRoZSBvYmplY3QgdGhhdCB0aGlzIG9uZSBAZQorICAgICAgICogIHVzZWQgdG8gb3duIGFuZCB0cmFjayBoYXMgYmVlbiBkZWxldGVkLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBhdXRvX3B0ciYKKyAgICAgICAgb3BlcmF0b3I9KGF1dG9fcHRyPF9UcDE+JiBfX2EpIHRocm93KCkKKyAgICAgICAgeworCSAgcmVzZXQoX19hLnJlbGVhc2UoKSk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICAvKioKKyAgICAgICAqICBXaGVuIHRoZSAlYXV0b19wdHIgZ29lcyBvdXQgb2Ygc2NvcGUsIHRoZSBvYmplY3QgaXQgb3ducyBpcworICAgICAgICogIGRlbGV0ZWQuICBJZiBpdCBubyBsb25nZXIgb3ducyBhbnl0aGluZyAoaS5lLiwgQGMgZ2V0KCkgaXMKKyAgICAgICAqICBAYyBOVUxMKSwgdGhlbiB0aGlzIGhhcyBubyBlZmZlY3QuCisgICAgICAgKgorICAgICAgICogIFRoZSBDKysgc3RhbmRhcmQgc2F5cyB0aGVyZSBpcyBzdXBwb3NlZCB0byBiZSBhbiBlbXB0eSB0aHJvdworICAgICAgICogIHNwZWNpZmljYXRpb24gaGVyZSwgYnV0IG9taXR0aW5nIGl0IGlzIHN0YW5kYXJkIGNvbmZvcm1pbmcuICBJdHMKKyAgICAgICAqICBwcmVzZW5jZSBjYW4gYmUgZGV0ZWN0ZWQgb25seSBpZiBfVHA6On5fVHAoKSB0aHJvd3MsIGJ1dCB0aGlzIGlzCisgICAgICAgKiAgcHJvaGliaXRlZC4gIFsxNy40LjMuNl0vMgorICAgICAgICovCisgICAgICB+YXV0b19wdHIoKSB7IGRlbGV0ZSBfTV9wdHI7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTbWFydCBwb2ludGVyIGRlcmVmZXJlbmNpbmcuCisgICAgICAgKgorICAgICAgICogIElmIHRoaXMgJWF1dG9fcHRyIG5vIGxvbmdlciBvd25zIGFueXRoaW5nLCB0aGVuIHRoaXMKKyAgICAgICAqICBvcGVyYXRpb24gd2lsbCBjcmFzaC4gIChGb3IgYSBzbWFydCBwb2ludGVyLCA8ZW0+bm8gbG9uZ2VyIG93bnMKKyAgICAgICAqICBhbnl0aGluZzwvZW0+IGlzIHRoZSBzYW1lIGFzIGJlaW5nIGEgbnVsbCBwb2ludGVyLCBhbmQgeW91IGtub3cKKyAgICAgICAqICB3aGF0IGhhcHBlbnMgd2hlbiB5b3UgZGVyZWZlcmVuY2Ugb25lIG9mIHRob3NlLi4uKQorICAgICAgICovCisgICAgICBlbGVtZW50X3R5cGUmCisgICAgICBvcGVyYXRvciooKSBjb25zdCB0aHJvdygpIAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9wdHIgIT0gMCk7CisJcmV0dXJuICpfTV9wdHI7IAorICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNtYXJ0IHBvaW50ZXIgZGVyZWZlcmVuY2luZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyByZXR1cm5zIHRoZSBwb2ludGVyIGl0c2VsZiwgd2hpY2ggdGhlIGxhbmd1YWdlIHRoZW4gd2lsbAorICAgICAgICogIGF1dG9tYXRpY2FsbHkgY2F1c2UgdG8gYmUgZGVyZWZlcmVuY2VkLgorICAgICAgICovCisgICAgICBlbGVtZW50X3R5cGUqCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QgdGhyb3coKSAKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fcHRyICE9IDApOworCXJldHVybiBfTV9wdHI7IAorICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ5cGFzc2luZyB0aGUgc21hcnQgcG9pbnRlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgcmF3IHBvaW50ZXIgYmVpbmcgbWFuYWdlZC4KKyAgICAgICAqCisgICAgICAgKiAgWW91IGNhbiBnZXQgYSBjb3B5IG9mIHRoZSBwb2ludGVyIHRoYXQgdGhpcyBvYmplY3Qgb3ducywgZm9yCisgICAgICAgKiAgc2l0dWF0aW9ucyBzdWNoIGFzIHBhc3NpbmcgdG8gYSBmdW5jdGlvbiB3aGljaCBvbmx5IGFjY2VwdHMKKyAgICAgICAqICBhIHJhdyBwb2ludGVyLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyAlYXV0b19wdHIgc3RpbGwgb3ducyB0aGUgbWVtb3J5LgorICAgICAgICovCisgICAgICBlbGVtZW50X3R5cGUqCisgICAgICBnZXQoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIF9NX3B0cjsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ5cGFzc2luZyB0aGUgc21hcnQgcG9pbnRlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgcmF3IHBvaW50ZXIgYmVpbmcgbWFuYWdlZC4KKyAgICAgICAqCisgICAgICAgKiAgWW91IGNhbiBnZXQgYSBjb3B5IG9mIHRoZSBwb2ludGVyIHRoYXQgdGhpcyBvYmplY3Qgb3ducywgZm9yCisgICAgICAgKiAgc2l0dWF0aW9ucyBzdWNoIGFzIHBhc3NpbmcgdG8gYSBmdW5jdGlvbiB3aGljaCBvbmx5IGFjY2VwdHMKKyAgICAgICAqICBhIHJhdyBwb2ludGVyLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyAlYXV0b19wdHIgbm8gbG9uZ2VyIG93bnMgdGhlIG1lbW9yeS4gIFdoZW4gdGhpcyBvYmplY3QKKyAgICAgICAqICBnb2VzIG91dCBvZiBzY29wZSwgbm90aGluZyB3aWxsIGhhcHBlbi4KKyAgICAgICAqLworICAgICAgZWxlbWVudF90eXBlKgorICAgICAgcmVsZWFzZSgpIHRocm93KCkKKyAgICAgIHsKKwllbGVtZW50X3R5cGUqIF9fdG1wID0gX01fcHRyOworCV9NX3B0ciA9IDA7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZvcmNpYmx5IGRlbGV0ZXMgdGhlIG1hbmFnZWQgb2JqZWN0LgorICAgICAgICogIEBwYXJhbSAgX19wICBBIHBvaW50ZXIgKGRlZmF1bHRzIHRvIE5VTEwpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9iamVjdCBub3cgQGUgb3ducyB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgQGEgX19wLiAgVGhlCisgICAgICAgKiAgcHJldmlvdXMgb2JqZWN0IGhhcyBiZWVuIGRlbGV0ZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KGVsZW1lbnRfdHlwZSogX19wID0gMCkgdGhyb3coKQorICAgICAgeworCWlmIChfX3AgIT0gX01fcHRyKQorCSAgeworCSAgICBkZWxldGUgX01fcHRyOworCSAgICBfTV9wdHIgPSBfX3A7CisJICB9CisgICAgICB9CisgICAgICAKKyAgICAgIC8qKiAKKyAgICAgICAqICBAYnJpZWYgIEF1dG9tYXRpYyBjb252ZXJzaW9ucworICAgICAgICoKKyAgICAgICAqICBUaGVzZSBvcGVyYXRpb25zIGNvbnZlcnQgYW4gJWF1dG9fcHRyIGludG8gYW5kIGZyb20gYW4gYXV0b19wdHJfcmVmCisgICAgICAgKiAgYXV0b21hdGljYWxseSBhcyBuZWVkZWQuICBUaGlzIGFsbG93cyBjb25zdHJ1Y3RzIHN1Y2ggYXMKKyAgICAgICAqICBAY29kZQorICAgICAgICogICAgYXV0b19wdHI8RGVyaXZlZD4gIGZ1bmNfcmV0dXJuaW5nX2F1dG9fcHRyKC4uLi4uKTsKKyAgICAgICAqICAgIC4uLgorICAgICAgICogICAgYXV0b19wdHI8QmFzZT4gcHRyID0gZnVuY19yZXR1cm5pbmdfYXV0b19wdHIoLi4uLi4pOworICAgICAgICogIEBlbmRjb2RlCisgICAgICAgKi8KKyAgICAgIGF1dG9fcHRyKGF1dG9fcHRyX3JlZjxlbGVtZW50X3R5cGU+IF9fcmVmKSB0aHJvdygpCisgICAgICA6IF9NX3B0cihfX3JlZi5fTV9wdHIpIHsgfQorICAgICAgCisgICAgICBhdXRvX3B0ciYKKyAgICAgIG9wZXJhdG9yPShhdXRvX3B0cl9yZWY8ZWxlbWVudF90eXBlPiBfX3JlZikgdGhyb3coKQorICAgICAgeworCWlmIChfX3JlZi5fTV9wdHIgIT0gdGhpcy0+Z2V0KCkpCisJICB7CisJICAgIGRlbGV0ZSBfTV9wdHI7CisJICAgIF9NX3B0ciA9IF9fcmVmLl9NX3B0cjsKKwkgIH0KKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIG9wZXJhdG9yIGF1dG9fcHRyX3JlZjxfVHAxPigpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gYXV0b19wdHJfcmVmPF9UcDE+KHRoaXMtPnJlbGVhc2UoKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgb3BlcmF0b3IgYXV0b19wdHI8X1RwMT4oKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIGF1dG9fcHRyPF9UcDE+KHRoaXMtPnJlbGVhc2UoKSk7IH0KKyAgICB9IF9HTElCQ1hYX0RFUFJFQ0FURUQ7CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyA1NDEuIHNoYXJlZF9wdHIgdGVtcGxhdGUgYXNzaWdubWVudCBhbmQgdm9pZAorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgYXV0b19wdHI8dm9pZD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB2b2lkIGVsZW1lbnRfdHlwZTsKKyAgICB9IF9HTElCQ1hYX0RFUFJFQ0FURUQ7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHA+CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICBfX3NoYXJlZF9jb3VudDxfTHA+OjpfX3NoYXJlZF9jb3VudChzdGQ6OmF1dG9fcHRyPF9UcD4mJiBfX3IpCisgICAgOiBfTV9waShuZXcgX1NwX2NvdW50ZWRfcHRyPF9UcCosIF9McD4oX19yLmdldCgpKSkKKyAgICB7IF9fci5yZWxlYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgaW5saW5lCisgICAgX19zaGFyZWRfcHRyPF9UcCwgX0xwPjo6X19zaGFyZWRfcHRyKHN0ZDo6YXV0b19wdHI8X1RwMT4mJiBfX3IpCisgICAgOiBfTV9wdHIoX19yLmdldCgpKSwgX01fcmVmY291bnQoKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcDEqLCBfVHAqPikKKyAgICAgIHN0YXRpY19hc3NlcnQoIHNpemVvZihfVHAxKSA+IDAsICJpbmNvbXBsZXRlIHR5cGUiICk7CisgICAgICBfVHAxKiBfX3RtcCA9IF9fci5nZXQoKTsKKyAgICAgIF9NX3JlZmNvdW50ID0gX19zaGFyZWRfY291bnQ8X0xwPihzdGQ6Om1vdmUoX19yKSk7CisgICAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihfTV9yZWZjb3VudCwgX190bXAsIF9fdG1wKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgIGlubGluZQorICAgIHNoYXJlZF9wdHI8X1RwPjo6c2hhcmVkX3B0cihzdGQ6OmF1dG9fcHRyPF9UcDE+JiYgX19yKQorICAgIDogX19zaGFyZWRfcHRyPF9UcD4oc3RkOjptb3ZlKF9fcikpIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwPgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lPgorICAgIGlubGluZQorICAgIHVuaXF1ZV9wdHI8X1RwLCBfRHA+Ojp1bmlxdWVfcHRyKGF1dG9fcHRyPF9VcD4mJiBfX3UpIG5vZXhjZXB0CisgICAgOiBfTV90KF9fdS5yZWxlYXNlKCksIGRlbGV0ZXJfdHlwZSgpKSB7IH0KKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfQkFDS1dBUkRfQVVUT19QVFJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9iYWNrd2FyZF93YXJuaW5nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2JhY2t3YXJkX3dhcm5pbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODdkNTI4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9iYWNrd2FyZF93YXJuaW5nLmgKQEAgLTAsMCArMSw2MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJhY2t3YXJkL2JhY2t3YXJkX3dhcm5pbmcuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc2Z3ZH0KKyAqLworCisjaWZuZGVmIF9CQUNLV0FSRF9CQUNLV0FSRF9XQVJOSU5HX0gKKyNkZWZpbmUgX0JBQ0tXQVJEX0JBQ0tXQVJEX1dBUk5JTkdfSCAxCisKKyNpZmRlZiBfX0RFUFJFQ0FURUQKKyN3YXJuaW5nIFwKKyAgVGhpcyBmaWxlIGluY2x1ZGVzIGF0IGxlYXN0IG9uZSBkZXByZWNhdGVkIG9yIGFudGlxdWF0ZWQgaGVhZGVyIHdoaWNoIFwKKyAgbWF5IGJlIHJlbW92ZWQgd2l0aG91dCBmdXJ0aGVyIG5vdGljZSBhdCBhIGZ1dHVyZSBkYXRlLiBQbGVhc2UgdXNlIGEgXAorICBub24tZGVwcmVjYXRlZCBpbnRlcmZhY2Ugd2l0aCBlcXVpdmFsZW50IGZ1bmN0aW9uYWxpdHkgaW5zdGVhZC4gRm9yIGEgXAorICBsaXN0aW5nIG9mIHJlcGxhY2VtZW50IGhlYWRlcnMgYW5kIGludGVyZmFjZXMsIGNvbnN1bHQgdGhlIGZpbGUgXAorICBiYWNrd2FyZF93YXJuaW5nLmguIFRvIGRpc2FibGUgdGhpcyB3YXJuaW5nIHVzZSAtV25vLWRlcHJlY2F0ZWQuCisKKy8qCisgIEEgbGlzdCBvZiB2YWxpZCByZXBsYWNlbWVudHMgaXMgYXMgZm9sbG93czoKKworICBVc2U6CQkJCQlJbnN0ZWFkIG9mOgorICA8c3N0cmVhbT4sIGJhc2ljX3N0cmluZ2J1ZgkgICAJPHN0cnN0cmVhbT4sIHN0cnN0cmVhbWJ1ZgorICA8c3N0cmVhbT4sIGJhc2ljX2lzdHJpbmdzdHJlYW0JPHN0cnN0cmVhbT4sIGlzdHJzdHJlYW0KKyAgPHNzdHJlYW0+LCBiYXNpY19vc3RyaW5nc3RyZWFtCTxzdHJzdHJlYW0+LCBvc3Ryc3RyZWFtCisgIDxzc3RyZWFtPiwgYmFzaWNfc3RyaW5nc3RyZWFtCQk8c3Ryc3RyZWFtPiwgc3Ryc3RyZWFtCisgIDx1bm9yZGVyZWRfc2V0PiwgdW5vcmRlcmVkX3NldCAgICAgCTxleHQvaGFzaF9zZXQ+LCBoYXNoX3NldAorICA8dW5vcmRlcmVkX3NldD4sIHVub3JkZXJlZF9tdWx0aXNldAk8ZXh0L2hhc2hfc2V0PiwgaGFzaF9tdWx0aXNldAorICA8dW5vcmRlcmVkX21hcD4sIHVub3JkZXJlZF9tYXAJPGV4dC9oYXNoX21hcD4sIGhhc2hfbWFwCisgIDx1bm9yZGVyZWRfbWFwPiwgdW5vcmRlcmVkX211bHRpbWFwCTxleHQvaGFzaF9tYXA+LCBoYXNoX211bHRpbWFwCisgIDxmdW5jdGlvbmFsPiwgYmluZAkJCTxmdW5jdGlvbmFsPiwgYmluZGVyMXN0CisgIDxmdW5jdGlvbmFsPiwgYmluZAkJCTxmdW5jdGlvbmFsPiwgYmluZGVyMm5kCisgIDxmdW5jdGlvbmFsPiwgYmluZAkJCTxmdW5jdGlvbmFsPiwgYmluZDFzdAorICA8ZnVuY3Rpb25hbD4sIGJpbmQJCQk8ZnVuY3Rpb25hbD4sIGJpbmQybmQKKyAgPG1lbW9yeT4sIHVuaXF1ZV9wdHIgICAgICAgCQk8bWVtb3J5PiwgYXV0b19wdHIKKyovCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvYmluZGVycy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9iaW5kZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZiZTAyOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvYmluZGVycy5oCkBAIC0wLDAgKzEsMTc2IEBACisvLyBGdW5jdG9yIGltcGxlbWVudGF0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk4CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYmFja3dhcmQvYmluZGVycy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZnVuY3Rpb25hbH0KKyAqLworCisjaWZuZGVmIF9CQUNLV0FSRF9CSU5ERVJTX0gKKyNkZWZpbmUgX0JBQ0tXQVJEX0JJTkRFUlNfSCAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyAyMC4zLjYgYmluZGVycworICAvKiogQGRlZmdyb3VwIGJpbmRlcnMgQmluZGVyIENsYXNzZXMKKyAgICogQGluZ3JvdXAgZnVuY3RvcnMKKyAgICoKKyAgICogIEJpbmRlcnMgdHVybiBmdW5jdGlvbnMvZnVuY3RvcnMgd2l0aCB0d28gYXJndW1lbnRzIGludG8gZnVuY3RvcnMKKyAgICogIHdpdGggYSBzaW5nbGUgYXJndW1lbnQsIHN0b3JpbmcgYW4gYXJndW1lbnQgdG8gYmUgYXBwbGllZCBsYXRlci4KKyAgICogIEZvciBleGFtcGxlLCBhIHZhcmlhYmxlIEBjIEIgb2YgdHlwZSBAYyBiaW5kZXIxc3QgaXMgY29uc3RydWN0ZWQKKyAgICogIGZyb20gYSBmdW5jdG9yIEBjIGYgYW5kIGFuIGFyZ3VtZW50IEBjIHguIExhdGVyLCBCJ3MgQGMKKyAgICogIG9wZXJhdG9yKCkgaXMgY2FsbGVkIHdpdGggYSBzaW5nbGUgYXJndW1lbnQgQGMgeS4gVGhlIHJldHVybgorICAgKiAgdmFsdWUgaXMgdGhlIHZhbHVlIG9mIEBjIGYoeCx5KS4gQGMgQiBjYW4gYmUgQGEgY2FsbGVkIHdpdGgKKyAgICogIHZhcmlvdXMgYXJndW1lbnRzICh5MSwgeTIsIC4uLikgYW5kIHdpbGwgaW4gdHVybiBjYWxsIEBjCisgICAqICBmKHgseTEpLCBAYyBmKHgseTIpLCAuLi4KKyAgICoKKyAgICogIFRoZSBmdW5jdGlvbiBAYyBiaW5kMXN0IGlzIHByb3ZpZGVkIHRvIHNhdmUgc29tZSB0eXBpbmcuIEl0IHRha2VzIHRoZQorICAgKiAgZnVuY3Rpb24gYW5kIGFuIGFyZ3VtZW50IGFzIHBhcmFtZXRlcnMsIGFuZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mCisgICAqICBAYyBiaW5kZXIxc3QuCisgICAqCisgICAqICBUaGUgdHlwZSBAYyBiaW5kZXIybmQgYW5kIGl0cyBjcmVhdG9yIGZ1bmN0aW9uIEBjIGJpbmQybmQgZG8gdGhlIHNhbWUKKyAgICogIHRoaW5nLCBidXQgdGhlIHN0b3JlZCBhcmd1bWVudCBpcyBwYXNzZWQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaW5zdGVhZAorICAgKiAgb2YgdGhlIGZpcnN0LCBlLmcuLCBAYyBiaW5kMm5kKHN0ZDo6bWludXM8ZmxvYXQ+KCksMS4zKSB3aWxsIGNyZWF0ZSBhCisgICAqICBmdW5jdG9yIHdob3NlIEBjIG9wZXJhdG9yKCkgYWNjZXB0cyBhIGZsb2F0aW5nLXBvaW50IG51bWJlciwgc3VidHJhY3RzCisgICAqICAxLjMgZnJvbSBpdCwgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4gKElmIEBjIGJpbmQxc3QgaGFkIGJlZW4gdXNlZCwKKyAgICogIHRoZSBmdW5jdG9yIHdvdWxkIHBlcmZvcm0gPGVtPjEuMyAtIHg8L2VtPiBpbnN0ZWFkLgorICAgKgorICAgKiAgQ3JlYXRvci13cmFwcGVyIGZ1bmN0aW9ucyBsaWtlIEBjIGJpbmQxc3QgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW4KKyAgICogIGNhbGxpbmcgYWxnb3JpdGhtcy4gVGhlaXIgcmV0dXJuIHZhbHVlcyB3aWxsIGJlIHRlbXBvcmFyeSBvYmplY3RzLgorICAgKiAgKFRoZSBnb2FsIGlzIHRvIG5vdCByZXF1aXJlIHlvdSB0byB0eXBlIG5hbWVzIGxpa2UKKyAgICogIEBjIHN0ZDo6YmluZGVyMXN0PHN0ZDo6cGx1czxpbnQ+PiBmb3IgZGVjbGFyaW5nIGEgdmFyaWFibGUgdG8gaG9sZCB0aGUKKyAgICogIHJldHVybiB2YWx1ZSBmcm9tIEBjIGJpbmQxc3Qoc3RkOjpwbHVzPGludD4oKSw1KS4KKyAgICoKKyAgICogIFRoZXNlIGJlY29tZSBtb3JlIHVzZWZ1bCB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIGNvbXBvc2l0aW9uIGZ1bmN0aW9ucy4KKyAgICoKKyAgICogIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVwcmVjYXRlZCBpbiBDKysxMSBhbmQgY2FuIGJlIHJlcGxhY2VkIGJ5CisgICAqICBAYyBzdGQ6OmJpbmQgKG9yIEBjIHN0ZDo6dHIxOjpiaW5kKSB3aGljaCBpcyBtb3JlIHBvd2VyZnVsIGFuZCBmbGV4aWJsZSwKKyAgICogIHN1cHBvcnRpbmcgZnVuY3Rpb25zIHdpdGggYW55IG51bWJlciBvZiBhcmd1bWVudHMuICBVc2VzIG9mIEBjIGJpbmQxc3QKKyAgICogIGNhbiBiZSByZXBsYWNlZCBieSBAYyBzdGQ6OmJpbmQoZiwgeCwgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSBhbmQKKyAgICogIEBjIGJpbmQybmQgYnkgQGMgc3RkOjpiaW5kKGYsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSwgeCkuCisgICAqICBAeworICAgKi8KKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgYmluZGVycyBiaW5kZXIgZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09wZXJhdGlvbj4KKyAgICBjbGFzcyBiaW5kZXIxc3QKKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSwKKwkJCSAgICB0eXBlbmFtZSBfT3BlcmF0aW9uOjpyZXN1bHRfdHlwZT4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX09wZXJhdGlvbiBvcDsKKyAgICAgIHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgdmFsdWU7CisKKyAgICBwdWJsaWM6CisgICAgICBiaW5kZXIxc3QoY29uc3QgX09wZXJhdGlvbiYgX194LAorCQljb25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlJiBfX3kpCisgICAgICA6IG9wKF9feCksIHZhbHVlKF9feSkgeyB9CisKKyAgICAgIHR5cGVuYW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9PcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBvcCh2YWx1ZSwgX194KTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMDkuICBNaXNzaW5nIGJpbmRlcnMgZm9yIG5vbi1jb25zdCBzZXF1ZW5jZSBlbGVtZW50cworICAgICAgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkodHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG9wKHZhbHVlLCBfX3gpOyB9CisgICAgfSBfR0xJQkNYWF9ERVBSRUNBVEVEOworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGJpbmRlcnMgYmluZGVyIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PcGVyYXRpb24sIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYmluZGVyMXN0PF9PcGVyYXRpb24+CisgICAgYmluZDFzdChjb25zdCBfT3BlcmF0aW9uJiBfX2ZuLCBjb25zdCBfVHAmIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgX0FyZzFfdHlwZTsKKyAgICAgIHJldHVybiBiaW5kZXIxc3Q8X09wZXJhdGlvbj4oX19mbiwgX0FyZzFfdHlwZShfX3gpKTsKKyAgICB9CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgYmluZGVycyBiaW5kZXIgZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09wZXJhdGlvbj4KKyAgICBjbGFzcyBiaW5kZXIybmQKKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlLAorCQkJICAgIHR5cGVuYW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfT3BlcmF0aW9uIG9wOworICAgICAgdHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgdmFsdWU7CisKKyAgICBwdWJsaWM6CisgICAgICBiaW5kZXIybmQoY29uc3QgX09wZXJhdGlvbiYgX194LAorCQljb25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSYgX195KQorICAgICAgOiBvcChfX3gpLCB2YWx1ZShfX3kpIHsgfQorCisgICAgICB0eXBlbmFtZSBfT3BlcmF0aW9uOjpyZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKShjb25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBvcChfX3gsIHZhbHVlKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMDkuICBNaXNzaW5nIGJpbmRlcnMgZm9yIG5vbi1jb25zdCBzZXF1ZW5jZSBlbGVtZW50cworICAgICAgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkodHlwZW5hbWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gb3AoX194LCB2YWx1ZSk7IH0KKyAgICB9IF9HTElCQ1hYX0RFUFJFQ0FURUQ7CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgYmluZGVycyBiaW5kZXIgZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09wZXJhdGlvbiwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBiaW5kZXIybmQ8X09wZXJhdGlvbj4KKyAgICBiaW5kMm5kKGNvbnN0IF9PcGVyYXRpb24mIF9fZm4sIGNvbnN0IF9UcCYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgX0FyZzJfdHlwZTsKKyAgICAgIHJldHVybiBiaW5kZXIybmQ8X09wZXJhdGlvbj4oX19mbiwgX0FyZzJfdHlwZShfX3gpKTsKKyAgICB9IAorICAvKiogQH0gICovCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9CQUNLV0FSRF9CSU5ERVJTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvaGFzaF9mdW4uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvaGFzaF9mdW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTFjYWE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9oYXNoX2Z1bi5oCkBAIC0wLDAgKzEsMTcwIEBACisvLyAnc3RydWN0IGhhc2gnIGZyb20gU0dJIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICovCisKKy8qKiBAZmlsZSBiYWNrd2FyZC9oYXNoX2Z1bi5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4KKyAqLworCisjaWZuZGVmIF9CQUNLV0FSRF9IQVNIX0ZVTl9ICisjZGVmaW5lIF9CQUNLV0FSRF9IQVNIX0ZVTl9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OnNpemVfdDsKKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5PgorICAgIHN0cnVjdCBoYXNoIHsgfTsKKworICBpbmxpbmUgc2l6ZV90CisgIF9fc3RsX2hhc2hfc3RyaW5nKGNvbnN0IGNoYXIqIF9fcykKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgX19oID0gMDsKKyAgICBmb3IgKCA7ICpfX3M7ICsrX19zKQorICAgICAgX19oID0gNSAqIF9faCArICpfX3M7CisgICAgcmV0dXJuIHNpemVfdChfX2gpOworICB9CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPGNoYXIqPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBfX3MpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3N0bF9oYXNoX3N0cmluZyhfX3MpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8Y29uc3QgY2hhcio+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIF9fcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fc3RsX2hhc2hfc3RyaW5nKF9fcyk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxjaGFyPgorICAgIHsgCisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY2hhciBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3g7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDx1bnNpZ25lZCBjaGFyPgorICAgIHsgCisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkodW5zaWduZWQgY2hhciBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3g7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxzaWduZWQgY2hhcj4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkodW5zaWduZWQgY2hhciBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3g7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxzaG9ydD4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoc2hvcnQgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8dW5zaWduZWQgc2hvcnQ+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKHVuc2lnbmVkIHNob3J0IF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPGludD4KKyAgICB7IAorICAgICAgc2l6ZV90IAorICAgICAgb3BlcmF0b3IoKShpbnQgX194KSBjb25zdCAKKyAgICAgIHsgcmV0dXJuIF9feDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHVuc2lnbmVkIGludD4KKyAgICB7IAorICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKHVuc2lnbmVkIGludCBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3g7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxsb25nPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShsb25nIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHVuc2lnbmVkIGxvbmc+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKHVuc2lnbmVkIGxvbmcgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194OyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvaGFzaF9tYXAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2hhc2hfbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMjg3MWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2hhc2hfbWFwCkBAIC0wLDAgKzEsNTk5IEBACisvLyBIYXNoaW5nIG1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworLyoqIEBmaWxlIGJhY2t3YXJkL2hhc2hfbWFwCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4KKyAqLworCisjaWZuZGVmIF9CQUNLV0FSRF9IQVNIX01BUAorI2RlZmluZSBfQkFDS1dBUkRfSEFTSF9NQVAgMQorCisjaWZuZGVmIF9HTElCQ1hYX1BFUk1JVF9CQUNLV0FSRF9IQVNICisjaW5jbHVkZSAiYmFja3dhcmRfd2FybmluZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJhY2t3YXJkL2hhc2h0YWJsZS5oPgorI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjplcXVhbF90bzsKKyAgdXNpbmcgc3RkOjphbGxvY2F0b3I7CisgIHVzaW5nIHN0ZDo6cGFpcjsKKyAgdXNpbmcgc3RkOjpfU2VsZWN0MXN0OworCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiA9IGhhc2g8X0tleT4sCisJICAgY2xhc3MgX0VxdWFsS2V5ID0gZXF1YWxfdG88X0tleT4sIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBoYXNoX21hcAorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBoYXNodGFibGU8cGFpcjxjb25zdCBfS2V5LCBfVHA+LF9LZXksIF9IYXNoRm4sCisJCQlfU2VsZWN0MXN0PHBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LAorCQkJX0VxdWFsS2V5LCBfQWxsb2M+IF9IdDsKKworICAgICAgX0h0IF9NX2h0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV90eXBlIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgZGF0YV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICAKKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKworICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIGhhc2hfbWFwKCkKKyAgICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIAorICAgICAgZXhwbGljaXQKKyAgICAgIGhhc2hfbWFwKHNpemVfdHlwZSBfX24pCisgICAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBoYXNoX21hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGhhc2hfbWFwKHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorCTogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorCTogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgY29uc3QgaGFzaGVyJiBfX2hmKQorCTogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9CisgICAgICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQorICAgICAgCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisgIAorICAgICAgdm9pZAorICAgICAgc3dhcChoYXNoX21hcCYgX19ocykKKyAgICAgIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSzEsIGNsYXNzIF9UMSwgY2xhc3MgX0hGLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWw+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0gKGNvbnN0IGhhc2hfbWFwPF9LMSwgX1QxLCBfSEYsIF9FcUssIF9BbD4mLAorCQkgICAgY29uc3QgaGFzaF9tYXA8X0sxLCBfVDEsIF9IRiwgX0VxSywgX0FsPiYpOworCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWUoX19vYmopOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeyByZXR1cm4gX01faHQuaW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShfX29iaik7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgX1RwJgorICAgICAgb3BlcmF0b3JbXShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5maW5kX29yX2luc2VydCh2YWx1ZV90eXBlKF9fa2V5LCBfVHAoKSkpLnNlY29uZDsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgICAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHtyZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IF9NX2h0LmVyYXNlKF9faXQpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sKQorICAgICAgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeyBfTV9odC5jbGVhcigpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19oaW50KQorICAgICAgeyBfTV9odC5yZXNpemUoX19oaW50KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5idWNrZXRfY291bnQoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCBjbGFzcyBfRXFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTEsCisJICAgICAgIGNvbnN0IGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTIpCisgICAgeyByZXR1cm4gX19obTEuX01faHQgPT0gX19obTIuX01faHQ7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sIGNsYXNzIF9FcWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgaGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMSwKKwkgICAgICAgY29uc3QgaGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMikKKyAgICB7IHJldHVybiAhKF9faG0xID09IF9faG0yKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgY2xhc3MgX0VxbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0xLAorCSBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0yKQorICAgIHsgX19obTEuc3dhcChfX2htMik7IH0KKworCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwKKwkgICBjbGFzcyBfSGFzaEZuID0gaGFzaDxfS2V5PiwKKwkgICBjbGFzcyBfRXF1YWxLZXkgPSBlcXVhbF90bzxfS2V5PiwKKwkgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1RwPiA+CisgICAgY2xhc3MgaGFzaF9tdWx0aW1hcAorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX0tleSwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9UcCwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfSGFzaEZuLCBzaXplX3QsIF9LZXksIF9VbmFyeUZ1bmN0aW9uQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczMoX0VxdWFsS2V5LCBfS2V5LCBfS2V5LCBfQmluYXJ5UHJlZGljYXRlQ29uY2VwdCkKKwkKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBoYXNodGFibGU8cGFpcjxjb25zdCBfS2V5LCBfVHA+LCBfS2V5LCBfSGFzaEZuLAorCQkJX1NlbGVjdDFzdDxwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiwgX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgICAgX0h0OworCisgICAgICBfSHQgX01faHQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCBkYXRhX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIAorICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQorCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgaGFzaF9tdWx0aW1hcCgpCisgICAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBleHBsaWNpdAorICAgICAgaGFzaF9tdWx0aW1hcChzaXplX3R5cGUgX19uKQorICAgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9tdWx0aW1hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGhhc2hfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisJOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorCTogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQorCTogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGhhc2hfbXVsdGltYXAmIF9faHMpCisgICAgICB7IF9NX2h0LnN3YXAoX19ocy5fTV9odCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0sxLCBjbGFzcyBfVDEsIGNsYXNzIF9IRiwgY2xhc3MgX0VxSywgY2xhc3MgX0FsPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfbXVsdGltYXA8X0sxLCBfVDEsIF9IRiwgX0VxSywgX0FsPiYsCisJCSAgIGNvbnN0IGhhc2hfbXVsdGltYXA8X0sxLCBfVDEsIF9IRiwgX0VxSywgX0FsPiYpOworCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbChfX29iaik7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsX19sKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsX25vcmVzaXplKF9fb2JqKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgICAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQorCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgX01faHQuY2xlYXIoKTsgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9faGludCkKKyAgICAgIHsgX01faHQucmVzaXplKF9faGludCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorICAgICAgCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hGLCBjbGFzcyBfRXFLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IRiwgX0VxS2V5LCBfQWxsb2M+JiBfX2htMSwKKwkgICAgICAgY29uc3QgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IRiwgX0VxS2V5LCBfQWxsb2M+JiBfX2htMikKKyAgICB7IHJldHVybiBfX2htMS5fTV9odCA9PSBfX2htMi5fTV9odDsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hGLCBjbGFzcyBfRXFLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IRiwgX0VxS2V5LCBfQWxsb2M+JiBfX2htMSwKKwkgICAgICAgY29uc3QgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IRiwgX0VxS2V5LCBfQWxsb2M+JiBfX2htMikKKyAgICB7IHJldHVybiAhKF9faG0xID09IF9faG0yKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgY2xhc3MgX0VxbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTEsCisJIGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMikKKyAgICB7IF9faG0xLnN3YXAoX19obTIpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFNwZWNpYWxpemF0aW9uIG9mIGluc2VydF9pdGVyYXRvciBzbyB0aGF0IGl0IHdpbGwgd29yayBmb3IgaGFzaF9tYXAKKyAgLy8gYW5kIGhhc2hfbXVsdGltYXAuCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIGluc2VydF9pdGVyYXRvcjxfX2dudV9jeHg6Omhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgCisJCQkJCSAgICAgIF9FcUtleSwgX0FsbG9jPiA+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPgorICAgICAgICBfQ29udGFpbmVyOworICAgICAgX0NvbnRhaW5lciogY29udGFpbmVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgICAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkKKyAgICAgIHsKKwljb250YWluZXItPmluc2VydChfX3ZhbHVlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCAgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPF9fZ251X2N4eDo6aGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sCisJCQkJCQkgICBfRXFLZXksIF9BbGxvYz4gPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6aGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPgorICAgICAgICBfQ29udGFpbmVyOworICAgICAgX0NvbnRhaW5lciogY29udGFpbmVyOworICAgICAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgaXRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5pbnNlcnQoX192YWx1ZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvaGFzaF9zZXQgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2hhc2hfc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOGU4NDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2hhc2hfc2V0CkBAIC0wLDAgKzEsNTY3IEBACisvLyBIYXNoaW5nIHNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworLyoqIEBmaWxlIGJhY2t3YXJkL2hhc2hfc2V0CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4KKyAqLworCisjaWZuZGVmIF9CQUNLV0FSRF9IQVNIX1NFVAorI2RlZmluZSBfQkFDS1dBUkRfSEFTSF9TRVQgMQorCisjaWZuZGVmIF9HTElCQ1hYX1BFUk1JVF9CQUNLV0FSRF9IQVNICisjaW5jbHVkZSAiYmFja3dhcmRfd2FybmluZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJhY2t3YXJkL2hhc2h0YWJsZS5oPgorI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjplcXVhbF90bzsKKyAgdXNpbmcgc3RkOjphbGxvY2F0b3I7CisgIHVzaW5nIHN0ZDo6cGFpcjsKKyAgdXNpbmcgc3RkOjpfSWRlbnRpdHk7CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiAgPSBoYXNoPF9WYWx1ZT4sCisJICAgY2xhc3MgX0VxdWFsS2V5ID0gZXF1YWxfdG88X1ZhbHVlPiwKKwkgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgY2xhc3MgaGFzaF9zZXQKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9WYWx1ZSwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfSGFzaEZjbiwgc2l6ZV90LCBfVmFsdWUsIF9VbmFyeUZ1bmN0aW9uQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczMoX0VxdWFsS2V5LCBfVmFsdWUsIF9WYWx1ZSwgX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQpCisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBoYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9IYXNoRmNuLCBfSWRlbnRpdHk8X1ZhbHVlPiwKKwkJCV9FcXVhbEtleSwgX0FsbG9jPiBfSHQ7CisgICAgICBfSHQgX01faHQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpwb2ludGVyIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICAKKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKworICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIGhhc2hfc2V0KCkKKyAgICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBoYXNoX3NldChzaXplX3R5cGUgX19uKQorICAgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBoYXNoX3NldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKwk6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKwk6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJIGNvbnN0IGhhc2hlciYgX19oZikKKwk6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKyAgICAgIAorICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBzd2FwKGhhc2hfc2V0JiBfX2hzKQorICAgICAgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IRiwgY2xhc3MgX0VxSywgY2xhc3MgX0FsPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfc2V0PF9WYWwsIF9IRiwgX0VxSywgX0FsPiYsCisJCSAgIGNvbnN0IGhhc2hfc2V0PF9WYWwsIF9IRiwgX0VxSywgX0FsPiYpOworCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisJcGFpcjx0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yLCBib29sPiBfX3AgPSBfTV9odC5pbnNlcnRfdW5pcXVlKF9fb2JqKTsKKwlyZXR1cm4gcGFpcjxpdGVyYXRvcixib29sPihfX3AuZmlyc3QsIF9fcC5zZWNvbmQpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlwYWlyPHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IsIGJvb2w+IF9fcAorCSAgPSBfTV9odC5pbnNlcnRfdW5pcXVlX25vcmVzaXplKF9fb2JqKTsKKwlyZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgX01faHQuY2xlYXIoKTsgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9faGludCkKKyAgICAgIHsgX01faHQucmVzaXplKF9faGludCk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorICAgICAgCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMxLAorCSAgICAgICBjb25zdCBoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMyKQorICAgIHsgcmV0dXJuIF9faHMxLl9NX2h0ID09IF9faHMyLl9NX2h0OyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczEsCisJICAgICAgIGNvbnN0IGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczIpCisgICAgeyByZXR1cm4gIShfX2hzMSA9PSBfX2hzMik7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGhhc2hfc2V0PF9WYWwsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMxLAorCSBoYXNoX3NldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IF9faHMxLnN3YXAoX19oczIpOyB9CisKKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsCisJICAgY2xhc3MgX0hhc2hGY24gPSBoYXNoPF9WYWx1ZT4sCisJICAgY2xhc3MgX0VxdWFsS2V5ID0gZXF1YWxfdG88X1ZhbHVlPiwKKwkgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgY2xhc3MgaGFzaF9tdWx0aXNldAorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1ZhbHVlLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMzKF9IYXNoRmNuLCBzaXplX3QsIF9WYWx1ZSwgX1VuYXJ5RnVuY3Rpb25Db25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfRXF1YWxLZXksIF9WYWx1ZSwgX1ZhbHVlLCBfQmluYXJ5UHJlZGljYXRlQ29uY2VwdCkKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsdWUsIF9WYWx1ZSwgX0hhc2hGY24sIF9JZGVudGl0eTxfVmFsdWU+LAorCQkJX0VxdWFsS2V5LCBfQWxsb2M+IF9IdDsKKyAgICAgIF9IdCBfTV9odDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfdHlwZSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIAorICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQorICAgICAgCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorICAgICAgCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgaGFzaF9tdWx0aXNldCgpCisgICAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBleHBsaWNpdAorICAgICAgaGFzaF9tdWx0aXNldChzaXplX3R5cGUgX19uKQorICAgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9tdWx0aXNldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgICAgICAKKyAgICAgIGhhc2hfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisJOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorCTogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQorCTogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGhhc2hfbXVsdGlzZXQmIGhzKQorICAgICAgeyBfTV9odC5zd2FwKGhzLl9NX2h0KTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSEYsIGNsYXNzIF9FcUssIGNsYXNzIF9BbD4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX211bHRpc2V0PF9WYWwsIF9IRiwgX0VxSywgX0FsPiYsCisJCSAgIGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hGLCBfRXFLLCBfQWw+Jik7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgICAgICAKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbChfX29iaik7IH0KKyAgCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZixfX2wpOyB9CisgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbF9ub3Jlc2l6ZShfX29iaik7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICAKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sKQorICAgICAgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IF9NX2h0LmNsZWFyKCk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpCisgICAgICB7IF9NX2h0LnJlc2l6ZShfX2hpbnQpOyB9CisgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgICAgICAgY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IHJldHVybiBfX2hzMS5fTV9odCA9PSBfX2hzMi5fTV9odDsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgICAgICAgY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IHJldHVybiAhKF9faHMxID09IF9faHMyKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IF9faHMxLnN3YXAoX19oczIpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFNwZWNpYWxpemF0aW9uIG9mIGluc2VydF9pdGVyYXRvciBzbyB0aGF0IGl0IHdpbGwgd29yayBmb3IgaGFzaF9zZXQKKyAgLy8gYW5kIGhhc2hfbXVsdGlzZXQuCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIGluc2VydF9pdGVyYXRvcjxfX2dudV9jeHg6Omhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sCisJCQkJCSAgICAgIF9FcXVhbEtleSwgX0FsbG9jPiA+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgX0NvbnRhaW5lcjsKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisgICAgICAKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5pbnNlcnQoX192YWx1ZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICAgIAorICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgICAgCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X19nbnVfY3h4OjpoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sCisJCQkJCQkgICBfRXF1YWxLZXksIF9BbGxvYz4gPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6aGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgX0NvbnRhaW5lcjsKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKyAgICAgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgICAgICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICAKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorICAgICAgCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvaGFzaHRhYmxlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2hhc2h0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZGY2NzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2hhc2h0YWJsZS5oCkBAIC0wLDAgKzEsMTE2NyBAQAorLy8gSGFzaHRhYmxlIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgY29udGFpbmVycyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisvKiogQGZpbGUgYmFja3dhcmQvaGFzaHRhYmxlLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLgorICovCisKKyNpZm5kZWYgX0JBQ0tXQVJEX0hBU0hUQUJMRV9ICisjZGVmaW5lIF9CQUNLV0FSRF9IQVNIVEFCTEVfSCAxCisKKy8vIEhhc2h0YWJsZSBjbGFzcywgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGhhc2hlZCBhc3NvY2lhdGl2ZSBjb250YWluZXJzCisvLyBoYXNoX3NldCwgaGFzaF9tYXAsIGhhc2hfbXVsdGlzZXQsIGFuZCBoYXNoX211bHRpbWFwLgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPgorI2luY2x1ZGUgPGJhY2t3YXJkL2hhc2hfZnVuLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisgIHVzaW5nIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7CisgIHVzaW5nIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnOworICB1c2luZyBzdGQ6Ol9Db25zdHJ1Y3Q7CisgIHVzaW5nIHN0ZDo6X0Rlc3Ryb3k7CisgIHVzaW5nIHN0ZDo6ZGlzdGFuY2U7CisgIHVzaW5nIHN0ZDo6dmVjdG9yOworICB1c2luZyBzdGQ6OnBhaXI7CisgIHVzaW5nIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX25vZGUKKyAgICB7CisgICAgICBfSGFzaHRhYmxlX25vZGUqIF9NX25leHQ7CisgICAgICBfVmFsIF9NX3ZhbDsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXh0cmFjdEtleSwgCisJICAgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVmFsPiA+CisgICAgY2xhc3MgaGFzaHRhYmxlOworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IYXNoRmNuLAorCSAgIGNsYXNzIF9FeHRyYWN0S2V5LCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9pdGVyYXRvcjsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSGFzaEZjbiwKKwkgICBjbGFzcyBfRXh0cmFjdEtleSwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3I7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hhc2hGY24sCisJICAgY2xhc3MgX0V4dHJhY3RLZXksIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX2l0ZXJhdG9yCisgICAgeworICAgICAgdHlwZWRlZiBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hhc2hGY24sIF9FeHRyYWN0S2V5LCBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgX0hhc2h0YWJsZTsKKyAgICAgIHR5cGVkZWYgX0hhc2h0YWJsZV9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSGFzaEZjbiwKKwkJCQkgIF9FeHRyYWN0S2V5LCBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hhc2hGY24sCisJCQkJCV9FeHRyYWN0S2V5LCBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGVfbm9kZTxfVmFsPiBfTm9kZTsKKyAgICAgIHR5cGVkZWYgZm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIF9WYWwgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1ZhbCYgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVmFsKiBwb2ludGVyOworICAgICAgCisgICAgICBfTm9kZSogX01fY3VyOworICAgICAgX0hhc2h0YWJsZSogX01faHQ7CisKKyAgICAgIF9IYXNodGFibGVfaXRlcmF0b3IoX05vZGUqIF9fbiwgX0hhc2h0YWJsZSogX190YWIpCisgICAgICA6IF9NX2N1cihfX24pLCBfTV9odChfX3RhYikgeyB9CisKKyAgICAgIF9IYXNodGFibGVfaXRlcmF0b3IoKSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VyLT5fTV92YWw7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQorCisgICAgICBpdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KTsKKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgX19pdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1ciA9PSBfX2l0Ll9NX2N1cjsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBfX2l0KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VyICE9IF9faXQuX01fY3VyOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSGFzaEZjbiwKKwkgICBjbGFzcyBfRXh0cmFjdEtleSwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3IKKyAgICB7CisgICAgICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSGFzaEZjbiwgX0V4dHJhY3RLZXksIF9FcXVhbEtleSwgX0FsbG9jPgorICAgICAgICBfSGFzaHRhYmxlOworICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlX2l0ZXJhdG9yPF9WYWwsX0tleSxfSGFzaEZjbiwKKwkJCQkgIF9FeHRyYWN0S2V5LF9FcXVhbEtleSxfQWxsb2M+CisgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IYXNoRmNuLAorCQkJCQlfRXh0cmFjdEtleSwgX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlX25vZGU8X1ZhbD4gX05vZGU7CisKKyAgICAgIHR5cGVkZWYgZm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIF9WYWwgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1ZhbCYgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBfVmFsKiBwb2ludGVyOworICAgICAgCisgICAgICBjb25zdCBfTm9kZSogX01fY3VyOworICAgICAgY29uc3QgX0hhc2h0YWJsZSogX01faHQ7CisKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3IoY29uc3QgX05vZGUqIF9fbiwgY29uc3QgX0hhc2h0YWJsZSogX190YWIpCisgICAgICA6IF9NX2N1cihfX24pLCBfTV9odChfX3RhYikgeyB9CisKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3IoKSB7IH0KKworICAgICAgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkKKyAgICAgIDogX01fY3VyKF9faXQuX01fY3VyKSwgX01faHQoX19pdC5fTV9odCkgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1ci0+X01fdmFsOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCk7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCk7CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faXQpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9jdXIgPT0gX19pdC5fTV9jdXI7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBjb25zdF9pdGVyYXRvciYgX19pdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1ciAhPSBfX2l0Ll9NX2N1cjsgfQorICAgIH07CisKKyAgLy8gTm90ZTogYXNzdW1lcyBsb25nIGlzIGF0IGxlYXN0IDMyIGJpdHMuCisgIGVudW0geyBfU19udW1fcHJpbWVzID0gMjkgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJpbWVUeXBlPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX3ByaW1lX2xpc3QKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgX1ByaW1lVHlwZSAgX19zdGxfcHJpbWVfbGlzdFtfU19udW1fcHJpbWVzXTsKKworICAgICAgc3RhdGljIGNvbnN0IF9QcmltZVR5cGUqCisgICAgICBfU19nZXRfcHJpbWVfbGlzdCgpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByaW1lVHlwZT4gY29uc3QgX1ByaW1lVHlwZQorICBfSGFzaHRhYmxlX3ByaW1lX2xpc3Q8X1ByaW1lVHlwZT46Ol9fc3RsX3ByaW1lX2xpc3RbX1NfbnVtX3ByaW1lc10gPQorICAgIHsKKyAgICAgIDV1bCwgICAgICAgICAgNTN1bCwgICAgICAgICA5N3VsLCAgICAgICAgIDE5M3VsLCAgICAgICAzODl1bCwKKyAgICAgIDc2OXVsLCAgICAgICAgMTU0M3VsLCAgICAgICAzMDc5dWwsICAgICAgIDYxNTF1bCwgICAgICAxMjI4OXVsLAorICAgICAgMjQ1OTN1bCwgICAgICA0OTE1N3VsLCAgICAgIDk4MzE3dWwsICAgICAgMTk2NjEzdWwsICAgIDM5MzI0MXVsLAorICAgICAgNzg2NDMzdWwsICAgICAxNTcyODY5dWwsICAgIDMxNDU3Mzl1bCwgICAgNjI5MTQ2OXVsLCAgIDEyNTgyOTE3dWwsCisgICAgICAyNTE2NTg0M3VsLCAgIDUwMzMxNjUzdWwsICAgMTAwNjYzMzE5dWwsICAyMDEzMjY2MTF1bCwgNDAyNjUzMTg5dWwsCisgICAgICA4MDUzMDY0NTd1bCwgIDE2MTA2MTI3NDF1bCwgMzIyMTIyNTQ3M3VsLCA0Mjk0OTY3MjkxdWwKKyAgICB9OworCisgdGVtcGxhdGU8Y2xhc3MgX1ByaW1lVHlwZT4gaW5saW5lIGNvbnN0IF9QcmltZVR5cGUqCisgX0hhc2h0YWJsZV9wcmltZV9saXN0PF9QcmltZVR5cGU+OjpfU19nZXRfcHJpbWVfbGlzdCgpCisgeworICAgcmV0dXJuIF9fc3RsX3ByaW1lX2xpc3Q7CisgfQorCisgIGlubGluZSB1bnNpZ25lZCBsb25nCisgIF9fc3RsX25leHRfcHJpbWUodW5zaWduZWQgbG9uZyBfX24pCisgIHsKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBfX2ZpcnN0ID0gX0hhc2h0YWJsZV9wcmltZV9saXN0PHVuc2lnbmVkIGxvbmc+OjpfU19nZXRfcHJpbWVfbGlzdCgpOworICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcqIF9fbGFzdCA9IF9fZmlyc3QgKyAoaW50KV9TX251bV9wcmltZXM7CisgICAgY29uc3QgdW5zaWduZWQgbG9uZyogcG9zID0gc3RkOjpsb3dlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fbik7CisgICAgcmV0dXJuIHBvcyA9PSBfX2xhc3QgPyAqKF9fbGFzdCAtIDEpIDogKnBvczsKKyAgfQorCisgIC8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2Ygb3BlcmF0b3I9PS4gIAorICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwKKwkgICBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgY2xhc3MgaGFzaHRhYmxlOworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LAorCSAgIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD4mIF9faHQxLAorCSAgICAgICBjb25zdCBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD4mIF9faHQyKTsKKworICAvLyBIYXNodGFibGVzIGhhbmRsZSBhbGxvY2F0b3JzIGEgYml0IGRpZmZlcmVudGx5IHRoYW4gb3RoZXIKKyAgLy8gY29udGFpbmVycyBkby4gIElmIHdlJ3JlIHVzaW5nIHN0YW5kYXJkLWNvbmZvcm1pbmcgYWxsb2NhdG9ycywgdGhlbgorICAvLyBhIGhhc2h0YWJsZSB1bmNvbmRpdGlvbmFsbHkgaGFzIGEgbWVtYmVyIHZhcmlhYmxlIHRvIGhvbGQgaXRzCisgIC8vIGFsbG9jYXRvciwgZXZlbiBpZiBpdCBzbyBoYXBwZW5zIHRoYXQgYWxsIGluc3RhbmNlcyBvZiB0aGUKKyAgLy8gYWxsb2NhdG9yIHR5cGUgYXJlIGlkZW50aWNhbC4gIFRoaXMgaXMgYmVjYXVzZSwgZm9yIGhhc2h0YWJsZXMsCisgIC8vIHRoaXMgZXh0cmEgc3RvcmFnZSBpcyBuZWdsaWdpYmxlLiAgQWRkaXRpb25hbGx5LCBhIGJhc2UgY2xhc3MKKyAgLy8gd291bGRuJ3Qgc2VydmUgYW55IG90aGVyIHB1cnBvc2VzOyBpdCB3b3VsZG4ndCwgZm9yIGV4YW1wbGUsCisgIC8vIHNpbXBsaWZ5IHRoZSBleGNlcHRpb24taGFuZGxpbmcgY29kZS4gIAorICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSGFzaEZjbiwKKwkgICBjbGFzcyBfRXh0cmFjdEtleSwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgaGFzaHRhYmxlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0tleSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1ZhbCB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfSGFzaEZjbiBoYXNoZXI7CisgICAgICB0eXBlZGVmIF9FcXVhbEtleSBrZXlfZXF1YWw7CisKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUqICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOworCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faGFzaDsgfQorCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9lcXVhbHM7IH0KKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9IYXNodGFibGVfbm9kZTxfVmFsPiBfTm9kZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8dmFsdWVfdHlwZT46Om90aGVyIGFsbG9jYXRvcl90eXBlOworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZV9hbGxvY2F0b3I7IH0KKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9Ob2RlPjo6b3RoZXIgX05vZGVfQWxsb2M7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9Ob2RlKj46Om90aGVyIF9Ob2RlcHRyX0FsbG9jOworICAgICAgdHlwZWRlZiB2ZWN0b3I8X05vZGUqLCBfTm9kZXB0cl9BbGxvYz4gX1ZlY3Rvcl90eXBlOworCisgICAgICBfTm9kZV9BbGxvYyBfTV9ub2RlX2FsbG9jYXRvcjsKKworICAgICAgX05vZGUqCisgICAgICBfTV9nZXRfbm9kZSgpCisgICAgICB7IHJldHVybiBfTV9ub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9wdXRfbm9kZShfTm9kZSogX19wKQorICAgICAgeyBfTV9ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKF9fcCwgMSk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBoYXNoZXIgICAgICAgICAgICAgICAgX01faGFzaDsKKyAgICAgIGtleV9lcXVhbCAgICAgICAgICAgICBfTV9lcXVhbHM7CisgICAgICBfRXh0cmFjdEtleSAgICAgICAgICAgX01fZ2V0X2tleTsKKyAgICAgIF9WZWN0b3JfdHlwZSAgICAgICAgICBfTV9idWNrZXRzOworICAgICAgc2l6ZV90eXBlICAgICAgICAgICAgIF9NX251bV9lbGVtZW50czsKKyAgICAgIAorICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0hhc2h0YWJsZV9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSGFzaEZjbiwgX0V4dHJhY3RLZXksCisJCQkJICBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hhc2hGY24sIF9FeHRyYWN0S2V5LAorCQkJCQlfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIGZyaWVuZCBzdHJ1Y3QKKyAgICAgIF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hhc2hGY24sIF9FeHRyYWN0S2V5LCBfRXF1YWxLZXksIF9BbGxvYz47CisKKyAgICAgIGZyaWVuZCBzdHJ1Y3QKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hhc2hGY24sIF9FeHRyYWN0S2V5LAorCQkJCV9FcXVhbEtleSwgX0FsbG9jPjsKKworICAgIHB1YmxpYzoKKyAgICAgIGhhc2h0YWJsZShzaXplX3R5cGUgX19uLCBjb25zdCBfSGFzaEZjbiYgX19oZiwKKwkJY29uc3QgX0VxdWFsS2V5JiBfX2VxbCwgY29uc3QgX0V4dHJhY3RLZXkmIF9fZXh0LAorCQljb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01fbm9kZV9hbGxvY2F0b3IoX19hKSwgX01faGFzaChfX2hmKSwgX01fZXF1YWxzKF9fZXFsKSwKKwlfTV9nZXRfa2V5KF9fZXh0KSwgX01fYnVja2V0cyhfX2EpLCBfTV9udW1fZWxlbWVudHMoMCkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9idWNrZXRzKF9fbik7IH0KKworICAgICAgaGFzaHRhYmxlKHNpemVfdHlwZSBfX24sIGNvbnN0IF9IYXNoRmNuJiBfX2hmLAorCQljb25zdCBfRXF1YWxLZXkmIF9fZXFsLAorCQljb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01fbm9kZV9hbGxvY2F0b3IoX19hKSwgX01faGFzaChfX2hmKSwgX01fZXF1YWxzKF9fZXFsKSwKKwlfTV9nZXRfa2V5KF9FeHRyYWN0S2V5KCkpLCBfTV9idWNrZXRzKF9fYSksIF9NX251bV9lbGVtZW50cygwKQorICAgICAgeyBfTV9pbml0aWFsaXplX2J1Y2tldHMoX19uKTsgfQorCisgICAgICBoYXNodGFibGUoY29uc3QgaGFzaHRhYmxlJiBfX2h0KQorICAgICAgOiBfTV9ub2RlX2FsbG9jYXRvcihfX2h0LmdldF9hbGxvY2F0b3IoKSksIF9NX2hhc2goX19odC5fTV9oYXNoKSwKKyAgICAgIF9NX2VxdWFscyhfX2h0Ll9NX2VxdWFscyksIF9NX2dldF9rZXkoX19odC5fTV9nZXRfa2V5KSwKKyAgICAgIF9NX2J1Y2tldHMoX19odC5nZXRfYWxsb2NhdG9yKCkpLCBfTV9udW1fZWxlbWVudHMoMCkKKyAgICAgIHsgX01fY29weV9mcm9tKF9faHQpOyB9CisKKyAgICAgIGhhc2h0YWJsZSYKKyAgICAgIG9wZXJhdG9yPSAoY29uc3QgaGFzaHRhYmxlJiBfX2h0KQorICAgICAgeworCWlmICgmX19odCAhPSB0aGlzKQorCSAgeworCSAgICBjbGVhcigpOworCSAgICBfTV9oYXNoID0gX19odC5fTV9oYXNoOworCSAgICBfTV9lcXVhbHMgPSBfX2h0Ll9NX2VxdWFsczsKKwkgICAgX01fZ2V0X2tleSA9IF9faHQuX01fZ2V0X2tleTsKKwkgICAgX01fY29weV9mcm9tKF9faHQpOworCSAgfQorCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgfmhhc2h0YWJsZSgpCisgICAgICB7IGNsZWFyKCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX251bV9lbGVtZW50czsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNpemVfdHlwZSgtMSk7IH0KKworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChoYXNodGFibGUmIF9faHQpCisgICAgICB7CisJc3RkOjpzd2FwKF9NX2hhc2gsIF9faHQuX01faGFzaCk7CisJc3RkOjpzd2FwKF9NX2VxdWFscywgX19odC5fTV9lcXVhbHMpOworCXN0ZDo6c3dhcChfTV9nZXRfa2V5LCBfX2h0Ll9NX2dldF9rZXkpOworCV9NX2J1Y2tldHMuc3dhcChfX2h0Ll9NX2J1Y2tldHMpOworCXN0ZDo6c3dhcChfTV9udW1fZWxlbWVudHMsIF9faHQuX01fbnVtX2VsZW1lbnRzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsKKwlmb3IgKHNpemVfdHlwZSBfX24gPSAwOyBfX24gPCBfTV9idWNrZXRzLnNpemUoKTsgKytfX24pCisJICBpZiAoX01fYnVja2V0c1tfX25dKQorCSAgICByZXR1cm4gaXRlcmF0b3IoX01fYnVja2V0c1tfX25dLCB0aGlzKTsKKwlyZXR1cm4gZW5kKCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoMCwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsKKwlmb3IgKHNpemVfdHlwZSBfX24gPSAwOyBfX24gPCBfTV9idWNrZXRzLnNpemUoKTsgKytfX24pCisJICBpZiAoX01fYnVja2V0c1tfX25dKQorCSAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX01fYnVja2V0c1tfX25dLCB0aGlzKTsKKwlyZXR1cm4gZW5kKCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoMCwgdGhpcyk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1ZsLCBjbGFzcyBfS3ksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsCisJCWNsYXNzIF9BbD4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBoYXNodGFibGU8X1ZsLCBfS3ksIF9IRiwgX0V4LCBfRXEsIF9BbD4mLAorCQkgICBjb25zdCBoYXNodGFibGU8X1ZsLCBfS3ksIF9IRiwgX0V4LCBfRXEsIF9BbD4mKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2J1Y2tldHMuc2l6ZSgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfSGFzaHRhYmxlX3ByaW1lX2xpc3Q8dW5zaWduZWQgbG9uZz46OgorICAgICAgICAgICAgICAgX1NfZ2V0X3ByaW1lX2xpc3QoKVsoaW50KV9TX251bV9wcmltZXMgLSAxXTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fYnVja2V0KSBjb25zdAorICAgICAgeworCXNpemVfdHlwZSBfX3Jlc3VsdCA9IDA7CisJZm9yIChfTm9kZSogX19uID0gX01fYnVja2V0c1tfX2J1Y2tldF07IF9fbjsgX19uID0gX19uLT5fTV9uZXh0KQorCSAgX19yZXN1bHQgKz0gMTsKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnRfdW5pcXVlKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCXJlc2l6ZShfTV9udW1fZWxlbWVudHMgKyAxKTsKKwlyZXR1cm4gaW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShfX29iaik7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisJcmVzaXplKF9NX251bV9lbGVtZW50cyArIDEpOworCXJldHVybiBpbnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopOworICAgICAgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfZXF1YWxfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnRfdW5pcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgICAgICB7IGluc2VydF91bmlxdWUoX19mLCBfX2wsIF9faXRlcmF0b3JfY2F0ZWdvcnkoX19mKSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0X2VxdWFsKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgICAgICB7IGluc2VydF9lcXVhbChfX2YsIF9fbCwgX19pdGVyYXRvcl9jYXRlZ29yeShfX2YpKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnRfdW5pcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkgICAgICBpbnB1dF9pdGVyYXRvcl90YWcpCisgICAgICAgIHsKKwkgIGZvciAoIDsgX19mICE9IF9fbDsgKytfX2YpCisJICAgIGluc2VydF91bmlxdWUoKl9fZik7CisJfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnRfZXF1YWwoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCSAgICAgaW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgICB7CisJICBmb3IgKCA7IF9fZiAhPSBfX2w7ICsrX19mKQorCSAgICBpbnNlcnRfZXF1YWwoKl9fZik7CisJfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydF91bmlxdWUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sLAorCQkgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgICAgeworCSAgc2l6ZV90eXBlIF9fbiA9IGRpc3RhbmNlKF9fZiwgX19sKTsKKwkgIHJlc2l6ZShfTV9udW1fZWxlbWVudHMgKyBfX24pOworCSAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytfX2YpCisJICAgIGluc2VydF91bmlxdWVfbm9yZXNpemUoKl9fZik7CisJfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydF9lcXVhbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX2wsCisJCSAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICAgIHsKKwkgIHNpemVfdHlwZSBfX24gPSBkaXN0YW5jZShfX2YsIF9fbCk7CisJICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgX19uKTsKKwkgIGZvciAoIDsgX19uID4gMDsgLS1fX24sICsrX19mKQorCSAgICBpbnNlcnRfZXF1YWxfbm9yZXNpemUoKl9fZik7CisJfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIGZpbmRfb3JfaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeworCXNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtX2tleShfX2tleSk7CisJX05vZGUqIF9fZmlyc3Q7CisJZm9yIChfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dOworCSAgICAgX19maXJzdCAmJiAhX01fZXF1YWxzKF9NX2dldF9rZXkoX19maXJzdC0+X01fdmFsKSwgX19rZXkpOworCSAgICAgX19maXJzdCA9IF9fZmlyc3QtPl9NX25leHQpCisJICB7IH0KKwlyZXR1cm4gaXRlcmF0b3IoX19maXJzdCwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsKKwlzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOworCWNvbnN0IF9Ob2RlKiBfX2ZpcnN0OworCWZvciAoX19maXJzdCA9IF9NX2J1Y2tldHNbX19uXTsKKwkgICAgIF9fZmlyc3QgJiYgIV9NX2VxdWFscyhfTV9nZXRfa2V5KF9fZmlyc3QtPl9NX3ZhbCksIF9fa2V5KTsKKwkgICAgIF9fZmlyc3QgPSBfX2ZpcnN0LT5fTV9uZXh0KQorCSAgeyB9CisJcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9fZmlyc3QsIHRoaXMpOworICAgICAgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsKKwljb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOworCXNpemVfdHlwZSBfX3Jlc3VsdCA9IDA7CisJCisJZm9yIChjb25zdCBfTm9kZSogX19jdXIgPSBfTV9idWNrZXRzW19fbl07IF9fY3VyOworCSAgICAgX19jdXIgPSBfX2N1ci0+X01fbmV4dCkKKwkgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX2N1ci0+X01fdmFsKSwgX19rZXkpKQorCSAgICArK19fcmVzdWx0OworCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpOworCisgICAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3Q7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KTsKKyAgICAgIAorICAgICAgdm9pZAorICAgICAgZXJhc2UoY29uc3QgaXRlcmF0b3ImIF9faXQpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZShjb25zdCBjb25zdF9pdGVyYXRvciYgX19pdCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19udW1fZWxlbWVudHNfaGludCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9uZXh0X3NpemUoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fc3RsX25leHRfcHJpbWUoX19uKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplX2J1Y2tldHMoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwljb25zdCBzaXplX3R5cGUgX19uX2J1Y2tldHMgPSBfTV9uZXh0X3NpemUoX19uKTsKKwlfTV9idWNrZXRzLnJlc2VydmUoX19uX2J1Y2tldHMpOworCV9NX2J1Y2tldHMuaW5zZXJ0KF9NX2J1Y2tldHMuZW5kKCksIF9fbl9idWNrZXRzLCAoX05vZGUqKSAwKTsKKwlfTV9udW1fZWxlbWVudHMgPSAwOworICAgICAgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2JrdF9udW1fa2V5KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2JrdF9udW1fa2V5KF9fa2V5LCBfTV9idWNrZXRzLnNpemUoKSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9ia3RfbnVtKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYmt0X251bV9rZXkoX01fZ2V0X2tleShfX29iaikpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fYmt0X251bV9rZXkoY29uc3Qga2V5X3R5cGUmIF9fa2V5LCBzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faGFzaChfX2tleSkgJSBfX247IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9ia3RfbnVtKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqLCBzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYmt0X251bV9rZXkoX01fZ2V0X2tleShfX29iaiksIF9fbik7IH0KKworICAgICAgX05vZGUqCisgICAgICBfTV9uZXdfbm9kZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlfTm9kZSogX19uID0gX01fZ2V0X25vZGUoKTsKKwlfX24tPl9NX25leHQgPSAwOworCV9fdHJ5CisJICB7CisJICAgIHRoaXMtPmdldF9hbGxvY2F0b3IoKS5jb25zdHJ1Y3QoJl9fbi0+X01fdmFsLCBfX29iaik7CisJICAgIHJldHVybiBfX247CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9NX3B1dF9ub2RlKF9fbik7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kZWxldGVfbm9kZShfTm9kZSogX19uKQorICAgICAgeworCXRoaXMtPmdldF9hbGxvY2F0b3IoKS5kZXN0cm95KCZfX24tPl9NX3ZhbCk7CisJX01fcHV0X25vZGUoX19uKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgX01fZXJhc2VfYnVja2V0KGNvbnN0IHNpemVfdHlwZSBfX24sIF9Ob2RlKiBfX2ZpcnN0LCBfTm9kZSogX19sYXN0KTsKKworICAgICAgdm9pZAorICAgICAgX01fZXJhc2VfYnVja2V0KGNvbnN0IHNpemVfdHlwZSBfX24sIF9Ob2RlKiBfX2xhc3QpOworCisgICAgICB2b2lkCisgICAgICBfTV9jb3B5X2Zyb20oY29uc3QgaGFzaHRhYmxlJiBfX2h0KTsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywKKwkgICAgY2xhc3MgX0FsbD4KKyAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IRiwgX0V4SywgX0VxSywgX0FsbD4mCisgICAgX0hhc2h0YWJsZV9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSEYsIF9FeEssIF9FcUssIF9BbGw+OjoKKyAgICBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICBjb25zdCBfTm9kZSogX19vbGQgPSBfTV9jdXI7CisgICAgICBfTV9jdXIgPSBfTV9jdXItPl9NX25leHQ7CisgICAgICBpZiAoIV9NX2N1cikKKwl7CisJICBzaXplX3R5cGUgX19idWNrZXQgPSBfTV9odC0+X01fYmt0X251bShfX29sZC0+X01fdmFsKTsKKwkgIHdoaWxlICghX01fY3VyICYmICsrX19idWNrZXQgPCBfTV9odC0+X01fYnVja2V0cy5zaXplKCkpCisJICAgIF9NX2N1ciA9IF9NX2h0LT5fTV9idWNrZXRzW19fYnVja2V0XTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywKKwkgICAgY2xhc3MgX0FsbD4KKyAgICBpbmxpbmUgX0hhc2h0YWJsZV9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSEYsIF9FeEssIF9FcUssIF9BbGw+CisgICAgX0hhc2h0YWJsZV9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSEYsIF9FeEssIF9FcUssIF9BbGw+OjoKKyAgICBvcGVyYXRvcisrKGludCkKKyAgICB7CisgICAgICBpdGVyYXRvciBfX3RtcCA9ICp0aGlzOworICAgICAgKysqdGhpczsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLAorCSAgICBjbGFzcyBfQWxsPgorICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hGLCBfRXhLLCBfRXFLLCBfQWxsPiYKKyAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IRiwgX0V4SywgX0VxSywgX0FsbD46OgorICAgIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgIGNvbnN0IF9Ob2RlKiBfX29sZCA9IF9NX2N1cjsKKyAgICAgIF9NX2N1ciA9IF9NX2N1ci0+X01fbmV4dDsKKyAgICAgIGlmICghX01fY3VyKQorCXsKKwkgIHNpemVfdHlwZSBfX2J1Y2tldCA9IF9NX2h0LT5fTV9ia3RfbnVtKF9fb2xkLT5fTV92YWwpOworCSAgd2hpbGUgKCFfTV9jdXIgJiYgKytfX2J1Y2tldCA8IF9NX2h0LT5fTV9idWNrZXRzLnNpemUoKSkKKwkgICAgX01fY3VyID0gX01faHQtPl9NX2J1Y2tldHNbX19idWNrZXRdOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXhLLCBjbGFzcyBfRXFLLAorCSAgICBjbGFzcyBfQWxsPgorICAgIGlubGluZSBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IRiwgX0V4SywgX0VxSywgX0FsbD4KKyAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IRiwgX0V4SywgX0VxSywgX0FsbD46OgorICAgIG9wZXJhdG9yKysoaW50KQorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisgICAgICArKyp0aGlzOworICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPiYgX19odDEsCisJICAgICAgIGNvbnN0IGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPiYgX19odDIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46Ol9Ob2RlIF9Ob2RlOworCisgICAgICBpZiAoX19odDEuX01fYnVja2V0cy5zaXplKCkgIT0gX19odDIuX01fYnVja2V0cy5zaXplKCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBmb3IgKHNpemVfdCBfX24gPSAwOyBfX24gPCBfX2h0MS5fTV9idWNrZXRzLnNpemUoKTsgKytfX24pCisJeworCSAgX05vZGUqIF9fY3VyMSA9IF9faHQxLl9NX2J1Y2tldHNbX19uXTsKKwkgIF9Ob2RlKiBfX2N1cjIgPSBfX2h0Mi5fTV9idWNrZXRzW19fbl07CisJICAvLyBDaGVjayBzYW1lIGxlbmd0aCBvZiBsaXN0cworCSAgZm9yICg7IF9fY3VyMSAmJiBfX2N1cjI7CisJICAgICAgIF9fY3VyMSA9IF9fY3VyMS0+X01fbmV4dCwgX19jdXIyID0gX19jdXIyLT5fTV9uZXh0KQorCSAgICB7IH0gCisJICBpZiAoX19jdXIxIHx8IF9fY3VyMikKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgLy8gTm93IGNoZWNrIG9uZSdzIGVsZW1lbnRzIGFyZSBpbiB0aGUgb3RoZXIKKwkgIGZvciAoX19jdXIxID0gX19odDEuX01fYnVja2V0c1tfX25dIDsgX19jdXIxOworCSAgICAgICBfX2N1cjEgPSBfX2N1cjEtPl9NX25leHQpCisJICAgIHsKKwkgICAgICBib29sIF9mb3VuZF9fY3VyMSA9IGZhbHNlOworCSAgICAgIGZvciAoX19jdXIyID0gX19odDIuX01fYnVja2V0c1tfX25dOworCQkgICBfX2N1cjI7IF9fY3VyMiA9IF9fY3VyMi0+X01fbmV4dCkKKwkJeworCQkgIGlmIChfX2N1cjEtPl9NX3ZhbCA9PSBfX2N1cjItPl9NX3ZhbCkKKwkJICAgIHsKKwkJICAgICAgX2ZvdW5kX19jdXIxID0gdHJ1ZTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgICBpZiAoIV9mb3VuZF9fY3VyMSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPiYgX19odDEsCisJICAgICAgIGNvbnN0IGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPiYgX19odDIpCisgICAgeyByZXR1cm4gIShfX2h0MSA9PSBfX2h0Mik7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeHRyYWN0LCBjbGFzcyBfRXFLZXksCisJICAgIGNsYXNzIF9BbGw+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeHRyYWN0LCBfRXFLZXksIF9BbGw+JiBfX2h0MSwKKwkgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4dHJhY3QsIF9FcUtleSwgX0FsbD4mIF9faHQyKQorICAgIHsgX19odDEuc3dhcChfX2h0Mik7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIHBhaXI8dHlwZW5hbWUgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjppdGVyYXRvciwgYm9vbD4KKyAgICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OgorICAgIGluc2VydF91bmlxdWVfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW0oX19vYmopOworICAgICAgX05vZGUqIF9fZmlyc3QgPSBfTV9idWNrZXRzW19fbl07CisgICAgICAKKyAgICAgIGZvciAoX05vZGUqIF9fY3VyID0gX19maXJzdDsgX19jdXI7IF9fY3VyID0gX19jdXItPl9NX25leHQpCisJaWYgKF9NX2VxdWFscyhfTV9nZXRfa2V5KF9fY3VyLT5fTV92YWwpLCBfTV9nZXRfa2V5KF9fb2JqKSkpCisJICByZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19jdXIsIHRoaXMpLCBmYWxzZSk7CisgICAgICAKKyAgICAgIF9Ob2RlKiBfX3RtcCA9IF9NX25ld19ub2RlKF9fb2JqKTsKKyAgICAgIF9fdG1wLT5fTV9uZXh0ID0gX19maXJzdDsKKyAgICAgIF9NX2J1Y2tldHNbX19uXSA9IF9fdG1wOworICAgICAgKytfTV9udW1fZWxlbWVudHM7CisgICAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX190bXAsIHRoaXMpLCB0cnVlKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICB0eXBlbmFtZSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46Oml0ZXJhdG9yCisgICAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjoKKyAgICBpbnNlcnRfZXF1YWxfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW0oX19vYmopOworICAgICAgX05vZGUqIF9fZmlyc3QgPSBfTV9idWNrZXRzW19fbl07CisgICAgICAKKyAgICAgIGZvciAoX05vZGUqIF9fY3VyID0gX19maXJzdDsgX19jdXI7IF9fY3VyID0gX19jdXItPl9NX25leHQpCisJaWYgKF9NX2VxdWFscyhfTV9nZXRfa2V5KF9fY3VyLT5fTV92YWwpLCBfTV9nZXRfa2V5KF9fb2JqKSkpCisJICB7CisJICAgIF9Ob2RlKiBfX3RtcCA9IF9NX25ld19ub2RlKF9fb2JqKTsKKwkgICAgX190bXAtPl9NX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkgICAgX19jdXItPl9NX25leHQgPSBfX3RtcDsKKwkgICAgKytfTV9udW1fZWxlbWVudHM7CisJICAgIHJldHVybiBpdGVyYXRvcihfX3RtcCwgdGhpcyk7CisJICB9CisKKyAgICAgIF9Ob2RlKiBfX3RtcCA9IF9NX25ld19ub2RlKF9fb2JqKTsKKyAgICAgIF9fdG1wLT5fTV9uZXh0ID0gX19maXJzdDsKKyAgICAgIF9NX2J1Y2tldHNbX19uXSA9IF9fdG1wOworICAgICAgKytfTV9udW1fZWxlbWVudHM7CisgICAgICByZXR1cm4gaXRlcmF0b3IoX190bXAsIHRoaXMpOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIHR5cGVuYW1lIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6cmVmZXJlbmNlCisgICAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjoKKyAgICBmaW5kX29yX2luc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICB7CisgICAgICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgMSk7CisKKyAgICAgIHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtKF9fb2JqKTsKKyAgICAgIF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dOworICAgICAgCisgICAgICBmb3IgKF9Ob2RlKiBfX2N1ciA9IF9fZmlyc3Q7IF9fY3VyOyBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0KQorCWlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX2N1ci0+X01fdmFsKSwgX01fZ2V0X2tleShfX29iaikpKQorCSAgcmV0dXJuIF9fY3VyLT5fTV92YWw7CisgICAgICAKKyAgICAgIF9Ob2RlKiBfX3RtcCA9IF9NX25ld19ub2RlKF9fb2JqKTsKKyAgICAgIF9fdG1wLT5fTV9uZXh0ID0gX19maXJzdDsKKyAgICAgIF9NX2J1Y2tldHNbX19uXSA9IF9fdG1wOworICAgICAgKytfTV9udW1fZWxlbWVudHM7CisgICAgICByZXR1cm4gX190bXAtPl9NX3ZhbDsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICBwYWlyPHR5cGVuYW1lIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6aXRlcmF0b3IsCisJIHR5cGVuYW1lIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6aXRlcmF0b3I+CisgICAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjoKKyAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgeworICAgICAgdHlwZWRlZiBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gX1BpaTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtX2tleShfX2tleSk7CisKKyAgICAgIGZvciAoX05vZGUqIF9fZmlyc3QgPSBfTV9idWNrZXRzW19fbl07IF9fZmlyc3Q7CisJICAgX19maXJzdCA9IF9fZmlyc3QtPl9NX25leHQpCisJaWYgKF9NX2VxdWFscyhfTV9nZXRfa2V5KF9fZmlyc3QtPl9NX3ZhbCksIF9fa2V5KSkKKwkgIHsKKwkgICAgZm9yIChfTm9kZSogX19jdXIgPSBfX2ZpcnN0LT5fTV9uZXh0OyBfX2N1cjsKKwkJIF9fY3VyID0gX19jdXItPl9NX25leHQpCisJICAgICAgaWYgKCFfTV9lcXVhbHMoX01fZ2V0X2tleShfX2N1ci0+X01fdmFsKSwgX19rZXkpKQorCQlyZXR1cm4gX1BpaShpdGVyYXRvcihfX2ZpcnN0LCB0aGlzKSwgaXRlcmF0b3IoX19jdXIsIHRoaXMpKTsKKwkgICAgZm9yIChzaXplX3R5cGUgX19tID0gX19uICsgMTsgX19tIDwgX01fYnVja2V0cy5zaXplKCk7ICsrX19tKQorCSAgICAgIGlmIChfTV9idWNrZXRzW19fbV0pCisJCXJldHVybiBfUGlpKGl0ZXJhdG9yKF9fZmlyc3QsIHRoaXMpLAorCQkJICAgIGl0ZXJhdG9yKF9NX2J1Y2tldHNbX19tXSwgdGhpcykpOworCSAgICByZXR1cm4gX1BpaShpdGVyYXRvcihfX2ZpcnN0LCB0aGlzKSwgZW5kKCkpOworCSAgfQorICAgICAgcmV0dXJuIF9QaWkoZW5kKCksIGVuZCgpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICBwYWlyPHR5cGVuYW1lIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6Y29uc3RfaXRlcmF0b3IsCisJIHR5cGVuYW1lIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6Y29uc3RfaXRlcmF0b3I+CisgICAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjoKKyAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gX1BpaTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtX2tleShfX2tleSk7CisKKyAgICAgIGZvciAoY29uc3QgX05vZGUqIF9fZmlyc3QgPSBfTV9idWNrZXRzW19fbl07IF9fZmlyc3Q7CisJICAgX19maXJzdCA9IF9fZmlyc3QtPl9NX25leHQpCisJeworCSAgaWYgKF9NX2VxdWFscyhfTV9nZXRfa2V5KF9fZmlyc3QtPl9NX3ZhbCksIF9fa2V5KSkKKwkgICAgeworCSAgICAgIGZvciAoY29uc3QgX05vZGUqIF9fY3VyID0gX19maXJzdC0+X01fbmV4dDsgX19jdXI7CisJCSAgIF9fY3VyID0gX19jdXItPl9NX25leHQpCisJCWlmICghX01fZXF1YWxzKF9NX2dldF9rZXkoX19jdXItPl9NX3ZhbCksIF9fa2V5KSkKKwkJICByZXR1cm4gX1BpaShjb25zdF9pdGVyYXRvcihfX2ZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9fY3VyLCB0aGlzKSk7CisJICAgICAgZm9yIChzaXplX3R5cGUgX19tID0gX19uICsgMTsgX19tIDwgX01fYnVja2V0cy5zaXplKCk7ICsrX19tKQorCQlpZiAoX01fYnVja2V0c1tfX21dKQorCQkgIHJldHVybiBfUGlpKGNvbnN0X2l0ZXJhdG9yKF9fZmlyc3QsIHRoaXMpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX01fYnVja2V0c1tfX21dLCB0aGlzKSk7CisJICAgICAgcmV0dXJuIF9QaWkoY29uc3RfaXRlcmF0b3IoX19maXJzdCwgdGhpcyksIGVuZCgpKTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfUGlpKGVuZCgpLCBlbmQoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgdHlwZW5hbWUgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjpzaXplX3R5cGUKKyAgICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OgorICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOworICAgICAgX05vZGUqIF9fZmlyc3QgPSBfTV9idWNrZXRzW19fbl07CisgICAgICBfTm9kZSogX19zYXZlZF9zbG90ID0gMDsKKyAgICAgIHNpemVfdHlwZSBfX2VyYXNlZCA9IDA7CisKKyAgICAgIGlmIChfX2ZpcnN0KQorCXsKKwkgIF9Ob2RlKiBfX2N1ciA9IF9fZmlyc3Q7CisJICBfTm9kZSogX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJICB3aGlsZSAoX19uZXh0KQorCSAgICB7CisJICAgICAgaWYgKF9NX2VxdWFscyhfTV9nZXRfa2V5KF9fbmV4dC0+X01fdmFsKSwgX19rZXkpKQorCQl7CisJCSAgaWYgKCZfTV9nZXRfa2V5KF9fbmV4dC0+X01fdmFsKSAhPSAmX19rZXkpCisJCSAgICB7CisJCSAgICAgIF9fY3VyLT5fTV9uZXh0ID0gX19uZXh0LT5fTV9uZXh0OworCQkgICAgICBfTV9kZWxldGVfbm9kZShfX25leHQpOworCQkgICAgICBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkJICAgICAgKytfX2VyYXNlZDsKKwkJICAgICAgLS1fTV9udW1fZWxlbWVudHM7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBfX3NhdmVkX3Nsb3QgPSBfX2N1cjsKKwkJICAgICAgX19jdXIgPSBfX25leHQ7CisJCSAgICAgIF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0OworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgX19jdXIgPSBfX25leHQ7CisJCSAgX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJCX0KKwkgICAgfQorCSAgYm9vbCBfX2RlbGV0ZV9maXJzdCA9IF9NX2VxdWFscyhfTV9nZXRfa2V5KF9fZmlyc3QtPl9NX3ZhbCksIF9fa2V5KTsKKwkgIGlmIChfX3NhdmVkX3Nsb3QpCisJICAgIHsKKwkgICAgICBfX25leHQgPSBfX3NhdmVkX3Nsb3QtPl9NX25leHQ7CisJICAgICAgX19zYXZlZF9zbG90LT5fTV9uZXh0ID0gX19uZXh0LT5fTV9uZXh0OworCSAgICAgIF9NX2RlbGV0ZV9ub2RlKF9fbmV4dCk7CisJICAgICAgKytfX2VyYXNlZDsKKwkgICAgICAtLV9NX251bV9lbGVtZW50czsKKwkgICAgfQorCSAgaWYgKF9fZGVsZXRlX2ZpcnN0KQorCSAgICB7CisJICAgICAgX01fYnVja2V0c1tfX25dID0gX19maXJzdC0+X01fbmV4dDsKKwkgICAgICBfTV9kZWxldGVfbm9kZShfX2ZpcnN0KTsKKwkgICAgICArK19fZXJhc2VkOworCSAgICAgIC0tX01fbnVtX2VsZW1lbnRzOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fZXJhc2VkOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIHZvaWQgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjoKKyAgICBlcmFzZShjb25zdCBpdGVyYXRvciYgX19pdCkKKyAgICB7CisgICAgICBfTm9kZSogX19wID0gX19pdC5fTV9jdXI7CisgICAgICBpZiAoX19wKQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtKF9fcC0+X01fdmFsKTsKKwkgIF9Ob2RlKiBfX2N1ciA9IF9NX2J1Y2tldHNbX19uXTsKKwkgIAorCSAgaWYgKF9fY3VyID09IF9fcCkKKwkgICAgeworCSAgICAgIF9NX2J1Y2tldHNbX19uXSA9IF9fY3VyLT5fTV9uZXh0OworCSAgICAgIF9NX2RlbGV0ZV9ub2RlKF9fY3VyKTsKKwkgICAgICAtLV9NX251bV9lbGVtZW50czsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgX05vZGUqIF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0OworCSAgICAgIHdoaWxlIChfX25leHQpCisJCXsKKwkJICBpZiAoX19uZXh0ID09IF9fcCkKKwkJICAgIHsKKwkJICAgICAgX19jdXItPl9NX25leHQgPSBfX25leHQtPl9NX25leHQ7CisJCSAgICAgIF9NX2RlbGV0ZV9ub2RlKF9fbmV4dCk7CisJCSAgICAgIC0tX01fbnVtX2VsZW1lbnRzOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIF9fY3VyID0gX19uZXh0OworCQkgICAgICBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIHZvaWQKKyAgICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBzaXplX3R5cGUgX19mX2J1Y2tldCA9IF9fZmlyc3QuX01fY3VyID8gX01fYmt0X251bShfX2ZpcnN0Ll9NX2N1ci0+X01fdmFsKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX01fYnVja2V0cy5zaXplKCk7CisKKyAgICAgIHNpemVfdHlwZSBfX2xfYnVja2V0ID0gX19sYXN0Ll9NX2N1ciA/IF9NX2JrdF9udW0oX19sYXN0Ll9NX2N1ci0+X01fdmFsKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfTV9idWNrZXRzLnNpemUoKTsKKworICAgICAgaWYgKF9fZmlyc3QuX01fY3VyID09IF9fbGFzdC5fTV9jdXIpCisJcmV0dXJuOworICAgICAgZWxzZSBpZiAoX19mX2J1Y2tldCA9PSBfX2xfYnVja2V0KQorCV9NX2VyYXNlX2J1Y2tldChfX2ZfYnVja2V0LCBfX2ZpcnN0Ll9NX2N1ciwgX19sYXN0Ll9NX2N1cik7CisgICAgICBlbHNlCisJeworCSAgX01fZXJhc2VfYnVja2V0KF9fZl9idWNrZXQsIF9fZmlyc3QuX01fY3VyLCAwKTsKKwkgIGZvciAoc2l6ZV90eXBlIF9fbiA9IF9fZl9idWNrZXQgKyAxOyBfX24gPCBfX2xfYnVja2V0OyArK19fbikKKwkgICAgX01fZXJhc2VfYnVja2V0KF9fbiwgMCk7CisJICBpZiAoX19sX2J1Y2tldCAhPSBfTV9idWNrZXRzLnNpemUoKSkKKwkgICAgX01fZXJhc2VfYnVja2V0KF9fbF9idWNrZXQsIF9fbGFzdC5fTV9jdXIpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIGVyYXNlKGl0ZXJhdG9yKGNvbnN0X2Nhc3Q8X05vZGUqPihfX2ZpcnN0Ll9NX2N1ciksCisJCSAgICAgY29uc3RfY2FzdDxoYXNodGFibGUqPihfX2ZpcnN0Ll9NX2h0KSksCisJICAgIGl0ZXJhdG9yKGNvbnN0X2Nhc3Q8X05vZGUqPihfX2xhc3QuX01fY3VyKSwKKwkJICAgICBjb25zdF9jYXN0PGhhc2h0YWJsZSo+KF9fbGFzdC5fTV9odCkpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgZXJhc2UoY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faXQpCisgICAgeyBlcmFzZShpdGVyYXRvcihjb25zdF9jYXN0PF9Ob2RlKj4oX19pdC5fTV9jdXIpLAorCQkgICAgIGNvbnN0X2Nhc3Q8aGFzaHRhYmxlKj4oX19pdC5fTV9odCkpKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgdm9pZAorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgcmVzaXplKHNpemVfdHlwZSBfX251bV9lbGVtZW50c19oaW50KQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9uID0gX01fYnVja2V0cy5zaXplKCk7CisgICAgICBpZiAoX19udW1fZWxlbWVudHNfaGludCA+IF9fb2xkX24pCisJeworCSAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX25leHRfc2l6ZShfX251bV9lbGVtZW50c19oaW50KTsKKwkgIGlmIChfX24gPiBfX29sZF9uKQorCSAgICB7CisJICAgICAgX1ZlY3Rvcl90eXBlIF9fdG1wKF9fbiwgKF9Ob2RlKikoMCksIF9NX2J1Y2tldHMuZ2V0X2FsbG9jYXRvcigpKTsKKwkgICAgICBfX3RyeQorCQl7CisJCSAgZm9yIChzaXplX3R5cGUgX19idWNrZXQgPSAwOyBfX2J1Y2tldCA8IF9fb2xkX247ICsrX19idWNrZXQpCisJCSAgICB7CisJCSAgICAgIF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX2J1Y2tldF07CisJCSAgICAgIHdoaWxlIChfX2ZpcnN0KQorCQkJeworCQkJICBzaXplX3R5cGUgX19uZXdfYnVja2V0ID0gX01fYmt0X251bShfX2ZpcnN0LT5fTV92YWwsCisJCQkJCQkJICAgICAgX19uKTsKKwkJCSAgX01fYnVja2V0c1tfX2J1Y2tldF0gPSBfX2ZpcnN0LT5fTV9uZXh0OworCQkJICBfX2ZpcnN0LT5fTV9uZXh0ID0gX190bXBbX19uZXdfYnVja2V0XTsKKwkJCSAgX190bXBbX19uZXdfYnVja2V0XSA9IF9fZmlyc3Q7CisJCQkgIF9fZmlyc3QgPSBfTV9idWNrZXRzW19fYnVja2V0XTsKKwkJCX0KKwkJICAgIH0KKwkJICBfTV9idWNrZXRzLnN3YXAoX190bXApOworCQl9CisJICAgICAgX19jYXRjaCguLi4pCisJCXsKKwkJICBmb3IgKHNpemVfdHlwZSBfX2J1Y2tldCA9IDA7IF9fYnVja2V0IDwgX190bXAuc2l6ZSgpOworCQkgICAgICAgKytfX2J1Y2tldCkKKwkJICAgIHsKKwkJICAgICAgd2hpbGUgKF9fdG1wW19fYnVja2V0XSkKKwkJCXsKKwkJCSAgX05vZGUqIF9fbmV4dCA9IF9fdG1wW19fYnVja2V0XS0+X01fbmV4dDsKKwkJCSAgX01fZGVsZXRlX25vZGUoX190bXBbX19idWNrZXRdKTsKKwkJCSAgX190bXBbX19idWNrZXRdID0gX19uZXh0OworCQkJfQorCQkgICAgfQorCQkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgdm9pZAorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgX01fZXJhc2VfYnVja2V0KGNvbnN0IHNpemVfdHlwZSBfX24sIF9Ob2RlKiBfX2ZpcnN0LCBfTm9kZSogX19sYXN0KQorICAgIHsKKyAgICAgIF9Ob2RlKiBfX2N1ciA9IF9NX2J1Y2tldHNbX19uXTsKKyAgICAgIGlmIChfX2N1ciA9PSBfX2ZpcnN0KQorCV9NX2VyYXNlX2J1Y2tldChfX24sIF9fbGFzdCk7CisgICAgICBlbHNlCisJeworCSAgX05vZGUqIF9fbmV4dDsKKwkgIGZvciAoX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJICAgICAgIF9fbmV4dCAhPSBfX2ZpcnN0OworCSAgICAgICBfX2N1ciA9IF9fbmV4dCwgX19uZXh0ID0gX19jdXItPl9NX25leHQpCisJICAgIDsKKwkgIHdoaWxlIChfX25leHQgIT0gX19sYXN0KQorCSAgICB7CisJICAgICAgX19jdXItPl9NX25leHQgPSBfX25leHQtPl9NX25leHQ7CisJICAgICAgX01fZGVsZXRlX25vZGUoX19uZXh0KTsKKwkgICAgICBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkgICAgICAtLV9NX251bV9lbGVtZW50czsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICB2b2lkCisgICAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjoKKyAgICBfTV9lcmFzZV9idWNrZXQoY29uc3Qgc2l6ZV90eXBlIF9fbiwgX05vZGUqIF9fbGFzdCkKKyAgICB7CisgICAgICBfTm9kZSogX19jdXIgPSBfTV9idWNrZXRzW19fbl07CisgICAgICB3aGlsZSAoX19jdXIgIT0gX19sYXN0KQorCXsKKwkgIF9Ob2RlKiBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkgIF9NX2RlbGV0ZV9ub2RlKF9fY3VyKTsKKwkgIF9fY3VyID0gX19uZXh0OworCSAgX01fYnVja2V0c1tfX25dID0gX19jdXI7CisJICAtLV9NX251bV9lbGVtZW50czsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgdm9pZAorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgY2xlYXIoKQorICAgIHsKKyAgICAgIGlmIChfTV9udW1fZWxlbWVudHMgPT0gMCkKKwlyZXR1cm47CisKKyAgICAgIGZvciAoc2l6ZV90eXBlIF9faSA9IDA7IF9faSA8IF9NX2J1Y2tldHMuc2l6ZSgpOyArK19faSkKKwl7CisJICBfTm9kZSogX19jdXIgPSBfTV9idWNrZXRzW19faV07CisJICB3aGlsZSAoX19jdXIgIT0gMCkKKwkgICAgeworCSAgICAgIF9Ob2RlKiBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkgICAgICBfTV9kZWxldGVfbm9kZShfX2N1cik7CisJICAgICAgX19jdXIgPSBfX25leHQ7CisJICAgIH0KKwkgIF9NX2J1Y2tldHNbX19pXSA9IDA7CisJfQorICAgICAgX01fbnVtX2VsZW1lbnRzID0gMDsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICB2b2lkCisgICAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjoKKyAgICBfTV9jb3B5X2Zyb20oY29uc3QgaGFzaHRhYmxlJiBfX2h0KQorICAgIHsKKyAgICAgIF9NX2J1Y2tldHMuY2xlYXIoKTsKKyAgICAgIF9NX2J1Y2tldHMucmVzZXJ2ZShfX2h0Ll9NX2J1Y2tldHMuc2l6ZSgpKTsKKyAgICAgIF9NX2J1Y2tldHMuaW5zZXJ0KF9NX2J1Y2tldHMuZW5kKCksIF9faHQuX01fYnVja2V0cy5zaXplKCksIChfTm9kZSopIDApOworICAgICAgX190cnkKKwl7CisJICBmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPCBfX2h0Ll9NX2J1Y2tldHMuc2l6ZSgpOyArK19faSkgeworCSAgICBjb25zdCBfTm9kZSogX19jdXIgPSBfX2h0Ll9NX2J1Y2tldHNbX19pXTsKKwkgICAgaWYgKF9fY3VyKQorCSAgICAgIHsKKwkJX05vZGUqIF9fbG9jYWxfY29weSA9IF9NX25ld19ub2RlKF9fY3VyLT5fTV92YWwpOworCQlfTV9idWNrZXRzW19faV0gPSBfX2xvY2FsX2NvcHk7CisJCQorCQlmb3IgKF9Ob2RlKiBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkJICAgICBfX25leHQ7CisJCSAgICAgX19jdXIgPSBfX25leHQsIF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0KQorCQkgIHsKKwkJICAgIF9fbG9jYWxfY29weS0+X01fbmV4dCA9IF9NX25ld19ub2RlKF9fbmV4dC0+X01fdmFsKTsKKwkJICAgIF9fbG9jYWxfY29weSA9IF9fbG9jYWxfY29weS0+X01fbmV4dDsKKwkJICB9CisJICAgICAgfQorCSAgfQorCSAgX01fbnVtX2VsZW1lbnRzID0gX19odC5fTV9udW1fZWxlbWVudHM7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgY2xlYXIoKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL3N0cnN0cmVhbSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvc3Ryc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjViZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL3N0cnN0cmVhbQpAQCAtMCwwICsxLDE4NCBAQAorLy8gQmFja3dhcmQtY29tcGF0IHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLy8gV0FSTklORzogVGhlIGNsYXNzZXMgZGVmaW5lZCBpbiB0aGlzIGhlYWRlciBhcmUgREVQUkVDQVRFRC4gIFRoaXMKKy8vIGhlYWRlciBpcyBkZWZpbmVkIGluIHNlY3Rpb24gRC43LjEgb2YgdGhlIEMrKyBzdGFuZGFyZCwgYW5kIGl0CisvLyBNQVkgQkUgUkVNT1ZFRCBpbiBhIGZ1dHVyZSBzdGFuZGFyZCByZXZpc2lvbi4gIE9uZSBzaG91bGQgdXNlIHRoZQorLy8gaGVhZGVyIDxzc3RyZWFtPiBpbnN0ZWFkLgorCisvKiogQGZpbGUgYmFja3dhcmQvc3Ryc3RyZWFtCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3N0cmVhbX0KKyAqLworCisjaWZuZGVmIF9CQUNLV0FSRF9TVFJTVFJFQU0KKyNkZWZpbmUgX0JBQ0tXQVJEX1NUUlNUUkVBTQorCisjaW5jbHVkZSAiYmFja3dhcmRfd2FybmluZy5oIgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxpb3M+CisjaW5jbHVkZSA8aXN0cmVhbT4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIENsYXNzIHN0cnN0cmVhbWJ1ZiwgYSBzdHJlYW1idWYgY2xhc3MgdGhhdCBtYW5hZ2VzIGFuIGFycmF5IG9mIGNoYXIuCisgIC8vIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIG5vdCBhIHRlbXBsYXRlLgorICBjbGFzcyBzdHJzdHJlYW1idWYgOiBwdWJsaWMgYmFzaWNfc3RyZWFtYnVmPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4KKyAgeworICBwdWJsaWM6CisgICAgLy8gVHlwZXMuCisgICAgdHlwZWRlZiBjaGFyX3RyYWl0czxjaGFyPiAgICAgICAgICAgICAgX1RyYWl0czsKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyLCBfVHJhaXRzPiBfQmFzZTsKKworICBwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3IsIGRlc3RydWN0b3IKKyAgICBleHBsaWNpdCBzdHJzdHJlYW1idWYoc3RyZWFtc2l6ZSBfX2luaXRpYWxfY2FwYWNpdHkgPSAwKTsKKyAgICBzdHJzdHJlYW1idWYodm9pZCogKCpfX2FsbG9jKShzaXplX3QpLCB2b2lkICgqX19mcmVlKSh2b2lkKikpOworCisgICAgc3Ryc3RyZWFtYnVmKGNoYXIqIF9fZ2V0LCBzdHJlYW1zaXplIF9fbiwgY2hhciogX19wdXQgPSAwKSB0aHJvdyAoKTsKKyAgICBzdHJzdHJlYW1idWYoc2lnbmVkIGNoYXIqIF9fZ2V0LCBzdHJlYW1zaXplIF9fbiwgc2lnbmVkIGNoYXIqIF9fcHV0ID0gMCkgdGhyb3cgKCk7CisgICAgc3Ryc3RyZWFtYnVmKHVuc2lnbmVkIGNoYXIqIF9fZ2V0LCBzdHJlYW1zaXplIF9fbiwgdW5zaWduZWQgY2hhciogX19wdXQ9MCkgdGhyb3cgKCk7CisKKyAgICBzdHJzdHJlYW1idWYoY29uc3QgY2hhciogX19nZXQsIHN0cmVhbXNpemUgX19uKSB0aHJvdyAoKTsKKyAgICBzdHJzdHJlYW1idWYoY29uc3Qgc2lnbmVkIGNoYXIqIF9fZ2V0LCBzdHJlYW1zaXplIF9fbikgdGhyb3cgKCk7CisgICAgc3Ryc3RyZWFtYnVmKGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZ2V0LCBzdHJlYW1zaXplIF9fbikgdGhyb3cgKCk7CisKKyAgICB2aXJ0dWFsIH5zdHJzdHJlYW1idWYoKTsKKworICBwdWJsaWM6CisgICAgdm9pZCBmcmVlemUoYm9vbCA9IHRydWUpIHRocm93ICgpOworICAgIGNoYXIqIHN0cigpIHRocm93ICgpOworICAgIF9HTElCQ1hYX1BVUkUgaW50IHBjb3VudCgpIGNvbnN0IHRocm93ICgpOworCisgIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGludF90eXBlIG92ZXJmbG93KGludF90eXBlIF9fYyAgPSBfVHJhaXRzOjplb2YoKSk7CisgICAgdmlydHVhbCBpbnRfdHlwZSBwYmFja2ZhaWwoaW50X3R5cGUgX19jID0gX1RyYWl0czo6ZW9mKCkpOworICAgIHZpcnR1YWwgaW50X3R5cGUgdW5kZXJmbG93KCk7CisgICAgdmlydHVhbCBfQmFzZSogc2V0YnVmKGNoYXIqIF9fYnVmLCBzdHJlYW1zaXplIF9fbik7CisgICAgdmlydHVhbCBwb3NfdHlwZSBzZWVrb2ZmKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX2RpciwKKwkJCSAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZQorCQkJICAgICA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICAgIHZpcnR1YWwgcG9zX3R5cGUgc2Vla3Bvcyhwb3NfdHlwZSBfX3BvcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZQorCQkJICAgICA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworCisgIHByaXZhdGU6CisgICAgc3Ryc3RyZWFtYnVmJgorICAgIG9wZXJhdG9yPShjb25zdCBzdHJzdHJlYW1idWYmKTsKKworICAgIHN0cnN0cmVhbWJ1Zihjb25zdCBzdHJzdHJlYW1idWYmKTsKKworICAgIC8vIER5bmFtaWMgYWxsb2NhdGlvbiwgcG9zc2libHkgdXNpbmcgX01fYWxsb2NfZnVuIGFuZCBfTV9mcmVlX2Z1bi4KKyAgICBjaGFyKiBfTV9hbGxvYyhzaXplX3QpOworICAgIHZvaWQgIF9NX2ZyZWUoY2hhciopOworCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgaW4gY29uc3RydWN0b3JzLgorICAgIHZvaWQgX01fc2V0dXAoY2hhciogX19nZXQsIGNoYXIqIF9fcHV0LCBzdHJlYW1zaXplIF9fbikgdGhyb3cgKCk7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBEYXRhIG1lbWJlcnMuCisgICAgdm9pZCogKCpfTV9hbGxvY19mdW4pKHNpemVfdCk7CisgICAgdm9pZCAgKCpfTV9mcmVlX2Z1bikodm9pZCopOworCisgICAgYm9vbCBfTV9keW5hbWljICA6IDE7CisgICAgYm9vbCBfTV9mcm96ZW4gICA6IDE7CisgICAgYm9vbCBfTV9jb25zdGFudCA6IDE7CisgIH07CisKKyAgLy8gQ2xhc3MgaXN0cnN0cmVhbSwgYW4gaXN0cmVhbSB0aGF0IG1hbmFnZXMgYSBzdHJzdHJlYW1idWYuCisgIGNsYXNzIGlzdHJzdHJlYW0gOiBwdWJsaWMgYmFzaWNfaXN0cmVhbTxjaGFyPgorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBpc3Ryc3RyZWFtKGNoYXIqKTsKKyAgICBleHBsaWNpdCBpc3Ryc3RyZWFtKGNvbnN0IGNoYXIqKTsKKyAgICBpc3Ryc3RyZWFtKGNoYXIqICwgc3RyZWFtc2l6ZSk7CisgICAgaXN0cnN0cmVhbShjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZSk7CisgICAgdmlydHVhbCB+aXN0cnN0cmVhbSgpOworCisgICAgX0dMSUJDWFhfQ09OU1Qgc3Ryc3RyZWFtYnVmKiByZGJ1ZigpIGNvbnN0IHRocm93ICgpOworICAgIGNoYXIqIHN0cigpIHRocm93ICgpOworCisgIHByaXZhdGU6CisgICAgc3Ryc3RyZWFtYnVmIF9NX2J1ZjsKKyAgfTsKKworICAvLyBDbGFzcyBvc3Ryc3RyZWFtCisgIGNsYXNzIG9zdHJzdHJlYW0gOiBwdWJsaWMgYmFzaWNfb3N0cmVhbTxjaGFyPgorICB7CisgIHB1YmxpYzoKKyAgICBvc3Ryc3RyZWFtKCk7CisgICAgb3N0cnN0cmVhbShjaGFyKiwgaW50LCBpb3NfYmFzZTo6b3Blbm1vZGUgPSBpb3NfYmFzZTo6b3V0KTsKKyAgICB2aXJ0dWFsIH5vc3Ryc3RyZWFtKCk7CisKKyAgICBfR0xJQkNYWF9DT05TVCBzdHJzdHJlYW1idWYqIHJkYnVmKCkgY29uc3QgdGhyb3cgKCk7CisgICAgdm9pZCBmcmVlemUoYm9vbCA9IHRydWUpIHRocm93KCk7CisgICAgY2hhciogc3RyKCkgdGhyb3cgKCk7CisgICAgX0dMSUJDWFhfUFVSRSBpbnQgcGNvdW50KCkgY29uc3QgdGhyb3cgKCk7CisKKyAgcHJpdmF0ZToKKyAgICBzdHJzdHJlYW1idWYgX01fYnVmOworICB9OworCisgIC8vIENsYXNzIHN0cnN0cmVhbQorICBjbGFzcyBzdHJzdHJlYW0gOiBwdWJsaWMgYmFzaWNfaW9zdHJlYW08Y2hhcj4KKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj46OmludF90eXBlIGludF90eXBlOworICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj46OnBvc190eXBlIHBvc190eXBlOworICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj46Om9mZl90eXBlIG9mZl90eXBlOworCisgICAgc3Ryc3RyZWFtKCk7CisgICAgc3Ryc3RyZWFtKGNoYXIqLCBpbnQsIGlvc19iYXNlOjpvcGVubW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICAgIHZpcnR1YWwgfnN0cnN0cmVhbSgpOworCisgICAgX0dMSUJDWFhfQ09OU1Qgc3Ryc3RyZWFtYnVmKiByZGJ1ZigpIGNvbnN0IHRocm93ICgpOworICAgIHZvaWQgZnJlZXplKGJvb2wgPSB0cnVlKSB0aHJvdyAoKTsKKyAgICBfR0xJQkNYWF9QVVJFIGludCBwY291bnQoKSBjb25zdCB0aHJvdyAoKTsKKyAgICBjaGFyKiBzdHIoKSB0aHJvdyAoKTsKKworICBwcml2YXRlOgorICAgIHN0cnN0cmVhbWJ1ZiBfTV9idWY7CisgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYWxnb3JpdGhtZndkLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYWxnb3JpdGhtZndkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzMjFiMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9hbGdvcml0aG1md2QuaApAQCAtMCwwICsxLDgyNiBAQAorLy8gPGFsZ29yaXRobT4gRm9yd2FyZCBkZWNsYXJhdGlvbnMgIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2FsZ29yaXRobWZ3ZC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7YWxnb3JpdGhtfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQUxHT1JJVEhNRldEX0gKKyNkZWZpbmUgX0dMSUJDWFhfQUxHT1JJVEhNRldEX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3BhaXIuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX3R5cGVzLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qCisgICAgYWRqYWNlbnRfZmluZAorICAgIGFsbF9vZiAoQysrMHgpCisgICAgYW55X29mIChDKysweCkKKyAgICBiaW5hcnlfc2VhcmNoCisgICAgY29weQorICAgIGNvcHlfYmFja3dhcmQKKyAgICBjb3B5X2lmIChDKysweCkKKyAgICBjb3B5X24gKEMrKzB4KQorICAgIGNvdW50CisgICAgY291bnRfaWYKKyAgICBlcXVhbAorICAgIGVxdWFsX3JhbmdlCisgICAgZmlsbAorICAgIGZpbGxfbgorICAgIGZpbmQKKyAgICBmaW5kX2VuZAorICAgIGZpbmRfZmlyc3Rfb2YKKyAgICBmaW5kX2lmCisgICAgZmluZF9pZl9ub3QgKEMrKzB4KQorICAgIGZvcl9lYWNoCisgICAgZ2VuZXJhdGUKKyAgICBnZW5lcmF0ZV9uCisgICAgaW5jbHVkZXMKKyAgICBpbnBsYWNlX21lcmdlCisgICAgaXNfaGVhcCAoQysrMHgpCisgICAgaXNfaGVhcF91bnRpbCAoQysrMHgpCisgICAgaXNfcGFydGl0aW9uZWQgKEMrKzB4KQorICAgIGlzX3NvcnRlZCAoQysrMHgpCisgICAgaXNfc29ydGVkX3VudGlsIChDKysweCkKKyAgICBpdGVyX3N3YXAKKyAgICBsZXhpY29ncmFwaGljYWxfY29tcGFyZQorICAgIGxvd2VyX2JvdW5kCisgICAgbWFrZV9oZWFwCisgICAgbWF4CisgICAgbWF4X2VsZW1lbnQKKyAgICBtZXJnZQorICAgIG1pbgorICAgIG1pbl9lbGVtZW50CisgICAgbWlubWF4IChDKysweCkKKyAgICBtaW5tYXhfZWxlbWVudCAoQysrMHgpCisgICAgbWlzbWF0Y2gKKyAgICBuZXh0X3Blcm11dGF0aW9uCisgICAgbm9uZV9vZiAoQysrMHgpCisgICAgbnRoX2VsZW1lbnQKKyAgICBwYXJ0aWFsX3NvcnQKKyAgICBwYXJ0aWFsX3NvcnRfY29weQorICAgIHBhcnRpdGlvbgorICAgIHBhcnRpdGlvbl9jb3B5IChDKysweCkKKyAgICBwYXJ0aXRpb25fcG9pbnQgKEMrKzB4KQorICAgIHBvcF9oZWFwCisgICAgcHJldl9wZXJtdXRhdGlvbgorICAgIHB1c2hfaGVhcAorICAgIHJhbmRvbV9zaHVmZmxlCisgICAgcmVtb3ZlCisgICAgcmVtb3ZlX2NvcHkKKyAgICByZW1vdmVfY29weV9pZgorICAgIHJlbW92ZV9pZgorICAgIHJlcGxhY2UKKyAgICByZXBsYWNlX2NvcHkKKyAgICByZXBsYWNlX2NvcHlfaWYKKyAgICByZXBsYWNlX2lmCisgICAgcmV2ZXJzZQorICAgIHJldmVyc2VfY29weQorICAgIHJvdGF0ZQorICAgIHJvdGF0ZV9jb3B5CisgICAgc2VhcmNoCisgICAgc2VhcmNoX24KKyAgICBzZXRfZGlmZmVyZW5jZQorICAgIHNldF9pbnRlcnNlY3Rpb24KKyAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UKKyAgICBzZXRfdW5pb24KKyAgICBzaHVmZmxlIChDKysweCkKKyAgICBzb3J0CisgICAgc29ydF9oZWFwCisgICAgc3RhYmxlX3BhcnRpdGlvbgorICAgIHN0YWJsZV9zb3J0CisgICAgc3dhcAorICAgIHN3YXBfcmFuZ2VzCisgICAgdHJhbnNmb3JtCisgICAgdW5pcXVlCisgICAgdW5pcXVlX2NvcHkKKyAgICB1cHBlcl9ib3VuZAorICAqLworCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgYWxnb3JpdGhtcyBBbGdvcml0aG1zCisgICAqCisgICAqIENvbXBvbmVudHMgZm9yIHBlcmZvcm1pbmcgYWxnb3JpdGhtaWMgb3BlcmF0aW9ucy4gSW5jbHVkZXMKKyAgICogbm9uLW1vZGlmeWluZyBzZXF1ZW5jZSwgbW9kaWZ5aW5nIChtdXRhdGluZykgc2VxdWVuY2UsIHNvcnRpbmcsCisgICAqIHNlYXJjaGluZywgbWVyZ2UsIHBhcnRpdGlvbiwgaGVhcCwgc2V0LCBtaW5pbWEsIG1heGltYSwgYW5kCisgICAqIHBlcm11dGF0aW9uIG9wZXJhdGlvbnMuCisgICAqLworCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcyBNdXRhdGluZworICAgKiBAaW5ncm91cCBhbGdvcml0aG1zCisgICAqLworCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMgTm9uLU11dGF0aW5nCisgICAqIEBpbmdyb3VwIGFsZ29yaXRobXMKKyAgICovCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBzb3J0aW5nX2FsZ29yaXRobXMgU29ydGluZworICAgKiBAaW5ncm91cCBhbGdvcml0aG1zCisgICAqLworCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgc2V0X2FsZ29yaXRobXMgU2V0IE9wZXJhdGlvbgorICAgKiBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICoKKyAgICogVGhlc2UgYWxnb3JpdGhtcyBhcmUgY29tbW9uIHNldCBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiBzZXF1ZW5jZXMKKyAgICogdGhhdCBhcmUgYWxyZWFkeSBzb3J0ZWQuIFRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgd2lsbCBiZQorICAgKiBsaW5lYXIuCisgICAqLworCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgYmluYXJ5X3NlYXJjaF9hbGdvcml0aG1zIEJpbmFyeSBTZWFyY2gKKyAgICogQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqCisgICAqIFRoZXNlIGFsZ29yaXRobXMgYXJlIHZhcmlhdGlvbnMgb2YgYSBjbGFzc2ljIGJpbmFyeSBzZWFyY2gsIGFuZAorICAgKiBhbGwgYXNzdW1lIHRoYXQgdGhlIHNlcXVlbmNlIGJlaW5nIHNlYXJjaGVkIGlzIGFscmVhZHkgc29ydGVkLgorICAgKiAKKyAgICogVGhlIG51bWJlciBvZiBjb21wYXJpc29ucyB3aWxsIGJlIGxvZ2FyaXRobWljIChhbmQgYXMgZmV3IGFzCisgICAqIHBvc3NpYmxlKS4gIFRoZSBudW1iZXIgb2Ygc3RlcHMgdGhyb3VnaCB0aGUgc2VxdWVuY2Ugd2lsbCBiZQorICAgKiBsb2dhcml0aG1pYyBmb3IgcmFuZG9tLWFjY2VzcyBpdGVyYXRvcnMgKGUuZy4sIHBvaW50ZXJzKSwgYW5kCisgICAqIGxpbmVhciBvdGhlcndpc2UuCisgICAqIAorICAgKiBUaGUgTFdHIGhhcyBwYXNzZWQgRGVmZWN0IFJlcG9ydCAyNzAsIHdoaWNoIG5vdGVzOiA8ZW0+VGhlCisgICAqIHByb3Bvc2VkIHJlc29sdXRpb24gcmVpbnRlcnByZXRzIGJpbmFyeSBzZWFyY2guIEluc3RlYWQgb2YKKyAgICogdGhpbmtpbmcgYWJvdXQgc2VhcmNoaW5nIGZvciBhIHZhbHVlIGluIGEgc29ydGVkIHJhbmdlLCB3ZSB2aWV3CisgICAqIHRoYXQgYXMgYW4gaW1wb3J0YW50IHNwZWNpYWwgY2FzZSBvZiBhIG1vcmUgZ2VuZXJhbCBhbGdvcml0aG06CisgICAqIHNlYXJjaGluZyBmb3IgdGhlIHBhcnRpdGlvbiBwb2ludCBpbiBhIHBhcnRpdGlvbmVkIHJhbmdlLiAgV2UKKyAgICogYWxzbyBhZGQgYSBndWFyYW50ZWUgdGhhdCB0aGUgb2xkIHdvcmRpbmcgZGlkIG5vdDogd2UgZW5zdXJlIHRoYXQKKyAgICogdGhlIHVwcGVyIGJvdW5kIGlzIG5vIGVhcmxpZXIgdGhhbiB0aGUgbG93ZXIgYm91bmQsIHRoYXQgdGhlIHBhaXIKKyAgICogcmV0dXJuZWQgYnkgZXF1YWxfcmFuZ2UgaXMgYSB2YWxpZCByYW5nZSwgYW5kIHRoYXQgdGhlIGZpcnN0IHBhcnQKKyAgICogb2YgdGhhdCBwYWlyIGlzIHRoZSBsb3dlciBib3VuZC48L2VtPgorICAgKgorICAgKiBUaGUgYWN0dWFsIGVmZmVjdCBvZiB0aGUgZmlyc3Qgc2VudGVuY2UgaXMgdGhhdCBhIGNvbXBhcmlzb24KKyAgICogZnVuY3RvciBwYXNzZWQgYnkgdGhlIHVzZXIgZG9lc24ndCBuZWNlc3NhcmlseSBuZWVkIHRvIGluZHVjZSBhCisgICAqIHN0cmljdCB3ZWFrIG9yZGVyaW5nIHJlbGF0aW9uLiAgUmF0aGVyLCBpdCBwYXJ0aXRpb25zIHRoZSByYW5nZS4KKyAgICovCisKKyAgLy8gYWRqYWNlbnRfZmluZAorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgYm9vbAorICAgIGFsbF9vZihfSUl0ZXIsIF9JSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGJvb2wKKyAgICBhbnlfb2YoX0lJdGVyLCBfSUl0ZXIsIF9QcmVkaWNhdGUpOworI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgYm9vbCAKKyAgICBiaW5hcnlfc2VhcmNoKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgYm9vbCAKKyAgICBiaW5hcnlfc2VhcmNoKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyIAorICAgIGNvcHkoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJdGVyMSwgdHlwZW5hbWUgX0JJdGVyMj4KKyAgICBfQkl0ZXIyCisgICAgY29weV9iYWNrd2FyZChfQkl0ZXIxLCBfQkl0ZXIxLCBfQkl0ZXIyKTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX09JdGVyCisgICAgY29weV9pZihfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyCisgICAgY29weV9uKF9JSXRlciwgX1NpemUsIF9PSXRlcik7CisjZW5kaWYKKworICAvLyBjb3VudAorICAvLyBjb3VudF9pZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIHBhaXI8X0ZJdGVyLCBfRkl0ZXI+CisgICAgZXF1YWxfcmFuZ2UoX0ZJdGVyLCBfRkl0ZXIsIGNvbnN0IF9UcCYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBwYWlyPF9GSXRlciwgX0ZJdGVyPgorICAgIGVxdWFsX3JhbmdlKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZCAKKyAgICBmaWxsKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfVHA+CisgICAgX09JdGVyCisgICAgZmlsbF9uKF9PSXRlciwgX1NpemUsIGNvbnN0IF9UcCYpOworCisgIC8vIGZpbmQKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyPgorICAgIF9GSXRlcjEKKyAgICBmaW5kX2VuZChfRkl0ZXIxLCBfRkl0ZXIxLCBfRkl0ZXIyLCBfRkl0ZXIyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyLCB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9GSXRlcjEKKyAgICBmaW5kX2VuZChfRkl0ZXIxLCBfRkl0ZXIxLCBfRkl0ZXIyLCBfRkl0ZXIyLCBfQmluYXJ5UHJlZGljYXRlKTsKKworICAvLyBmaW5kX2ZpcnN0X29mCisgIC8vIGZpbmRfaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9JSXRlcgorICAgIGZpbmRfaWZfbm90KF9JSXRlciwgX0lJdGVyLCBfUHJlZGljYXRlKTsKKyNlbmRpZgorCisgIC8vIGZvcl9lYWNoCisgIC8vIGdlbmVyYXRlCisgIC8vIGdlbmVyYXRlX24KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyPgorICAgIGJvb2wgCisgICAgaW5jbHVkZXMoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgYm9vbCAKKyAgICBpbmNsdWRlcyhfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJdGVyPgorICAgIHZvaWQgCisgICAgaW5wbGFjZV9tZXJnZShfQkl0ZXIsIF9CSXRlciwgX0JJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQgCisgICAgaW5wbGFjZV9tZXJnZShfQkl0ZXIsIF9CSXRlciwgX0JJdGVyLCBfQ29tcGFyZSk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgYm9vbCAKKyAgICBpc19oZWFwKF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGJvb2wgCisgICAgaXNfaGVhcChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICBfUkFJdGVyIAorICAgIGlzX2hlYXBfdW50aWwoX1JBSXRlciwgX1JBSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlciAKKyAgICBpc19oZWFwX3VudGlsKF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgYm9vbAorICAgIGlzX3BhcnRpdGlvbmVkKF9JSXRlciwgX0lJdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyPgorICAgIGJvb2wKKyAgICBpc19wZXJtdXRhdGlvbihfRkl0ZXIxLCBfRkl0ZXIxLCBfRkl0ZXIyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgYm9vbAorICAgIGlzX3Blcm11dGF0aW9uKF9GSXRlcjEsIF9GSXRlcjEsIF9GSXRlcjIsIF9CaW5hcnlQcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBib29sIAorICAgIGlzX3NvcnRlZChfRkl0ZXIsIF9GSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sIAorICAgIGlzX3NvcnRlZChfRkl0ZXIsIF9GSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBfRkl0ZXIgCisgICAgaXNfc29ydGVkX3VudGlsKF9GSXRlciwgX0ZJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlciAKKyAgICBpc19zb3J0ZWRfdW50aWwoX0ZJdGVyLCBfRkl0ZXIsIF9Db21wYXJlKTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcjEsIHR5cGVuYW1lIF9GSXRlcjI+CisgICAgdm9pZCAKKyAgICBpdGVyX3N3YXAoX0ZJdGVyMSwgX0ZJdGVyMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgX0ZJdGVyIAorICAgIGxvd2VyX2JvdW5kKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZJdGVyIAorICAgIGxvd2VyX2JvdW5kKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkIAorICAgIG1ha2VfaGVhcChfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkIAorICAgIG1ha2VfaGVhcChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICBjb25zdCBfVHAmIAorICAgIG1heChjb25zdCBfVHAmLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNvbnN0IF9UcCYgCisgICAgbWF4KGNvbnN0IF9UcCYsIGNvbnN0IF9UcCYsIF9Db21wYXJlKTsKKworICAvLyBtYXhfZWxlbWVudAorICAvLyBtZXJnZQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gCisgICAgY29uc3QgX1RwJiAKKyAgICBtaW4oY29uc3QgX1RwJiwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjb25zdCBfVHAmIAorICAgIG1pbihjb25zdCBfVHAmLCBjb25zdCBfVHAmLCBfQ29tcGFyZSk7CisKKyAgLy8gbWluX2VsZW1lbnQKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHBhaXI8Y29uc3QgX1RwJiwgY29uc3QgX1RwJj4gCisgICAgbWlubWF4KGNvbnN0IF9UcCYsIGNvbnN0IF9UcCYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgcGFpcjxjb25zdCBfVHAmLCBjb25zdCBfVHAmPgorICAgIG1pbm1heChjb25zdCBfVHAmLCBjb25zdCBfVHAmLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyPgorICAgIHBhaXI8X0ZJdGVyLCBfRkl0ZXI+CisgICAgbWlubWF4X2VsZW1lbnQoX0ZJdGVyLCBfRkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgcGFpcjxfRkl0ZXIsIF9GSXRlcj4KKyAgICBtaW5tYXhfZWxlbWVudChfRkl0ZXIsIF9GSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBtaW4oaW5pdGlhbGl6ZXJfbGlzdDxfVHA+KTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9UcAorICAgIG1pbihpbml0aWFsaXplcl9saXN0PF9UcD4sIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgbWF4KGluaXRpYWxpemVyX2xpc3Q8X1RwPik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfVHAKKyAgICBtYXgoaW5pdGlhbGl6ZXJfbGlzdDxfVHA+LCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHBhaXI8X1RwLCBfVHA+CisgICAgbWlubWF4KGluaXRpYWxpemVyX2xpc3Q8X1RwPik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBwYWlyPF9UcCwgX1RwPgorICAgIG1pbm1heChpbml0aWFsaXplcl9saXN0PF9UcD4sIF9Db21wYXJlKTsKKyNlbmRpZgorCisgIC8vIG1pc21hdGNoCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJdGVyPgorICAgIGJvb2wgCisgICAgbmV4dF9wZXJtdXRhdGlvbihfQkl0ZXIsIF9CSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sIAorICAgIG5leHRfcGVybXV0YXRpb24oX0JJdGVyLCBfQkl0ZXIsIF9Db21wYXJlKTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGJvb2wKKyAgICBub25lX29mKF9JSXRlciwgX0lJdGVyLCBfUHJlZGljYXRlKTsKKyNlbmRpZgorCisgIC8vIG50aF9lbGVtZW50CisgIC8vIHBhcnRpYWxfc29ydAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1JBSXRlcj4KKyAgICBfUkFJdGVyCisgICAgcGFydGlhbF9zb3J0X2NvcHkoX0lJdGVyLCBfSUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlcgorICAgIHBhcnRpYWxfc29ydF9jb3B5KF9JSXRlciwgX0lJdGVyLCBfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgLy8gcGFydGl0aW9uCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyMSwKKwkgICB0eXBlbmFtZSBfT0l0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIHBhaXI8X09JdGVyMSwgX09JdGVyMj4KKyAgICBwYXJ0aXRpb25fY29weShfSUl0ZXIsIF9JSXRlciwgX09JdGVyMSwgX09JdGVyMiwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9GSXRlcgorICAgIHBhcnRpdGlvbl9wb2ludChfRkl0ZXIsIF9GSXRlciwgX1ByZWRpY2F0ZSk7CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQgCisgICAgcG9wX2hlYXAoX1JBSXRlciwgX1JBSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZCAKKyAgICBwb3BfaGVhcChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJdGVyPgorICAgIGJvb2wgCisgICAgcHJldl9wZXJtdXRhdGlvbihfQkl0ZXIsIF9CSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sIAorICAgIHByZXZfcGVybXV0YXRpb24oX0JJdGVyLCBfQkl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQgCisgICAgcHVzaF9oZWFwKF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQgCisgICAgcHVzaF9oZWFwKF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICAvLyByYW5kb21fc2h1ZmZsZQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9GSXRlciAKKyAgICByZW1vdmUoX0ZJdGVyLCBfRkl0ZXIsIGNvbnN0IF9UcCYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfRkl0ZXIgCisgICAgcmVtb3ZlX2lmKF9GSXRlciwgX0ZJdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9PSXRlciAKKyAgICByZW1vdmVfY29weShfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT0l0ZXIgCisgICAgcmVtb3ZlX2NvcHlfaWYoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgLy8gcmVwbGFjZQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgX09JdGVyIAorICAgIHJlcGxhY2VfY29weShfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBjb25zdCBfVHAmLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfVHA+CisgICAgX09JdGVyIAorICAgIHJlcGxhY2VfY29weV9pZihfSXRlciwgX0l0ZXIsIF9PSXRlciwgX1ByZWRpY2F0ZSwgY29uc3QgX1RwJik7CisKKyAgLy8gcmVwbGFjZV9pZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlcj4KKyAgICB2b2lkIAorICAgIHJldmVyc2UoX0JJdGVyLCBfQkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlciwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlciAKKyAgICByZXZlcnNlX2NvcHkoX0JJdGVyLCBfQkl0ZXIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyPgorICAgIHZvaWQgCisgICAgcm90YXRlKF9GSXRlciwgX0ZJdGVyLCBfRkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlciAKKyAgICByb3RhdGVfY29weShfRkl0ZXIsIF9GSXRlciwgX0ZJdGVyLCBfT0l0ZXIpOworCisgIC8vIHNlYXJjaAorICAvLyBzZWFyY2hfbgorICAvLyBzZXRfZGlmZmVyZW5jZQorICAvLyBzZXRfaW50ZXJzZWN0aW9uCisgIC8vIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZQorICAvLyBzZXRfdW5pb24KKworI2lmIChfX2NwbHVzcGx1cyA+PSAyMDExMDNMKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1VHZW5lcmF0b3I+CisgICAgdm9pZAorICAgIHNodWZmbGUoX1JBSXRlciwgX1JBSXRlciwgX1VHZW5lcmF0b3ImJik7CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQgCisgICAgc29ydF9oZWFwKF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQgCisgICAgc29ydF9oZWFwKF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0JJdGVyIAorICAgIHN0YWJsZV9wYXJ0aXRpb24oX0JJdGVyLCBfQkl0ZXIsIF9QcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gCisgICAgdm9pZCAKKyAgICBzd2FwKF9UcCYsIF9UcCYpCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIG5vZXhjZXB0KF9fYW5kXzxpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxfVHA+LAorCSAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9UcD4+Ojp2YWx1ZSkKKyNlbmRpZgorICAgIDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHNpemVfdCBfTm0+CisgICAgdm9pZAorICAgIHN3YXAoX1RwICgmX19hKVtfTm1dLCBfVHAgKCZfX2IpW19ObV0pCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIG5vZXhjZXB0KG5vZXhjZXB0KHN3YXAoKl9fYSwgKl9fYikpKQorI2VuZGlmCisgICAgOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcjEsIHR5cGVuYW1lIF9GSXRlcjI+CisgICAgX0ZJdGVyMiAKKyAgICBzd2FwX3JhbmdlcyhfRkl0ZXIxLCBfRkl0ZXIxLCBfRkl0ZXIyKTsKKworICAvLyB0cmFuc2Zvcm0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0ZJdGVyIAorICAgIHVuaXF1ZShfRkl0ZXIsIF9GSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9GSXRlciAKKyAgICB1bmlxdWUoX0ZJdGVyLCBfRkl0ZXIsIF9CaW5hcnlQcmVkaWNhdGUpOworCisgIC8vIHVuaXF1ZV9jb3B5CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgX0ZJdGVyIAorICAgIHVwcGVyX2JvdW5kKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZJdGVyIAorICAgIHVwcGVyX2JvdW5kKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmLCBfQ29tcGFyZSk7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQUxHTworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBfRkl0ZXIgCisgICAgYWRqYWNlbnRfZmluZChfRkl0ZXIsIF9GSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9GSXRlciAKKyAgICBhZGphY2VudF9maW5kKF9GSXRlciwgX0ZJdGVyLCBfQmluYXJ5UHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgY291bnQoX0lJdGVyLCBfSUl0ZXIsIGNvbnN0IF9UcCYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgY291bnRfaWYoX0lJdGVyLCBfSUl0ZXIsIF9QcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgYm9vbCAKKyAgICBlcXVhbChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGJvb2wgCisgICAgZXF1YWwoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0JpbmFyeVByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgX0lJdGVyIAorICAgIGZpbmQoX0lJdGVyLCBfSUl0ZXIsIGNvbnN0IF9UcCYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcjEsIHR5cGVuYW1lIF9GSXRlcjI+CisgICAgX0ZJdGVyMQorICAgIGZpbmRfZmlyc3Rfb2YoX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMiwgX0ZJdGVyMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMiwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIxCisgICAgZmluZF9maXJzdF9vZihfRkl0ZXIxLCBfRkl0ZXIxLCBfRkl0ZXIyLCBfRkl0ZXIyLCBfQmluYXJ5UHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0lJdGVyCisgICAgZmluZF9pZihfSUl0ZXIsIF9JSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRnVuY3Q+CisgICAgX0Z1bmN0IAorICAgIGZvcl9lYWNoKF9JSXRlciwgX0lJdGVyLCBfRnVuY3QpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICB2b2lkIAorICAgIGdlbmVyYXRlKF9GSXRlciwgX0ZJdGVyLCBfR2VuZXJhdG9yKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIF9PSXRlcgorICAgIGdlbmVyYXRlX24oX09JdGVyLCBfU2l6ZSwgX0dlbmVyYXRvcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMj4KKyAgICBib29sIAorICAgIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGJvb2wgCisgICAgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBfRkl0ZXIgCisgICAgbWF4X2VsZW1lbnQoX0ZJdGVyLCBfRkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZJdGVyIAorICAgIG1heF9lbGVtZW50KF9GSXRlciwgX0ZJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlciAKKyAgICBtZXJnZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwgCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX09JdGVyIAorICAgIG1lcmdlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBfRkl0ZXIgCisgICAgbWluX2VsZW1lbnQoX0ZJdGVyLCBfRkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZJdGVyIAorICAgIG1pbl9lbGVtZW50KF9GSXRlciwgX0ZJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMj4KKyAgICBwYWlyPF9JSXRlcjEsIF9JSXRlcjI+CisgICAgbWlzbWF0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBwYWlyPF9JSXRlcjEsIF9JSXRlcjI+CisgICAgbWlzbWF0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0JpbmFyeVByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkIAorICAgIG50aF9lbGVtZW50KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQgCisgICAgbnRoX2VsZW1lbnQoX1JBSXRlciwgX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgdm9pZCAKKyAgICBwYXJ0aWFsX3NvcnQoX1JBSXRlciwgX1JBSXRlciwgX1JBSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZCAKKyAgICBwYXJ0aWFsX3NvcnQoX1JBSXRlciwgX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfQkl0ZXIgCisgICAgcGFydGl0aW9uKF9CSXRlciwgX0JJdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQgCisgICAgcmFuZG9tX3NodWZmbGUoX1JBSXRlciwgX1JBSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICB2b2lkIAorICAgIHJhbmRvbV9zaHVmZmxlKF9SQUl0ZXIsIF9SQUl0ZXIsCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCQkgICBfR2VuZXJhdG9yJiYpOworI2Vsc2UKKwkJICAgX0dlbmVyYXRvciYpOworI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZCAKKyAgICByZXBsYWNlKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkIAorICAgIHJlcGxhY2VfaWYoX0ZJdGVyLCBfRkl0ZXIsIF9QcmVkaWNhdGUsIGNvbnN0IF9UcCYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcjEsIHR5cGVuYW1lIF9GSXRlcjI+CisgICAgX0ZJdGVyMSAKKyAgICBzZWFyY2goX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMiwgX0ZJdGVyMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMiwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIxIAorICAgIHNlYXJjaChfRkl0ZXIxLCBfRkl0ZXIxLCBfRkl0ZXIyLCBfRkl0ZXIyLCBfQmluYXJ5UHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfVHA+CisgICAgX0ZJdGVyIAorICAgIHNlYXJjaF9uKF9GSXRlciwgX0ZJdGVyLCBfU2l6ZSwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwLCAKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9GSXRlciAKKyAgICBzZWFyY2hfbihfRkl0ZXIsIF9GSXRlciwgX1NpemUsIGNvbnN0IF9UcCYsIF9CaW5hcnlQcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIgCisgICAgc2V0X2RpZmZlcmVuY2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsIAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PSXRlciAKKyAgICBzZXRfZGlmZmVyZW5jZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyIAorICAgIHNldF9pbnRlcnNlY3Rpb24oX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX09JdGVyIAorICAgIHNldF9pbnRlcnNlY3Rpb24oX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwgCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX09JdGVyCisgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIAorCQkJICAgICBfT0l0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyIAorICAgIHNldF91bmlvbihfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT0l0ZXIgCisgICAgc2V0X3VuaW9uKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgdm9pZCAKKyAgICBzb3J0KF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQgCisgICAgc29ydChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkIAorICAgIHN0YWJsZV9zb3J0KF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQgCisgICAgc3RhYmxlX3NvcnQoX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfVW5hcnlPcGVyYXRpb24+CisgICAgX09JdGVyIAorICAgIHRyYW5zZm9ybShfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBfVW5hcnlPcGVyYXRpb24pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwgCisJICAgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBfT0l0ZXIgCisgICAgdHJhbnNmb3JtKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9PSXRlciwgX0JpbmFyeU9wZXJhdGlvbik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyIAorICAgIHVuaXF1ZV9jb3B5KF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9PSXRlciAKKyAgICB1bmlxdWVfY29weShfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBfQmluYXJ5UHJlZGljYXRlKTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2lmZGVmIF9HTElCQ1hYX1BBUkFMTEVMCisjIGluY2x1ZGUgPHBhcmFsbGVsL2FsZ29yaXRobWZ3ZC5oPgorI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYWxsb2NfdHJhaXRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYWxsb2NfdHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlYTE0NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9hbGxvY190cmFpdHMuaApAQCAtMCwwICsxLDU2NiBAQAorLy8gQWxsb2NhdG9yIHRyYWl0cyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9hbGxvY190cmFpdHMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9BTExPQ19UUkFJVFNfSAorI2RlZmluZSBfQUxMT0NfVFJBSVRTX0ggMQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjaW5jbHVkZSA8Yml0cy9tZW1vcnlmd2QuaD4KKyNpbmNsdWRlIDxiaXRzL3B0cl90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvbnVtZXJpY190cmFpdHMuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9fYWxsb2N0cl9yZWJpbmRfaGVscGVyCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMiwgdHlwZW5hbWUgX1RwMj4KKwlzdGF0aWMgY29uc3RleHByIGJvb2wKKyAgICAgICAJX1NfY2hrKHR5cGVuYW1lIF9BbGxvYzI6OnRlbXBsYXRlIHJlYmluZDxfVHAyPjo6b3RoZXIqKQorCXsgcmV0dXJuIHRydWU7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wKKyAgICAgICAJX1NfY2hrKC4uLikKKyAgICAgICAJeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9fdmFsdWUgPSBfU19jaGs8X0FsbG9jLCBfVHA+KG51bGxwdHIpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfVHA+CisgICAgY29uc3QgYm9vbCBfX2FsbG9jdHJfcmViaW5kX2hlbHBlcjxfQWxsb2MsIF9UcD46Ol9fdmFsdWU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIGJvb2wgPSBfX2FsbG9jdHJfcmViaW5kX2hlbHBlcjxfQWxsb2MsIF9UcD46Ol9fdmFsdWU+CisgICAgc3RydWN0IF9fYWxsb2N0cl9yZWJpbmQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWxsb2N0cl9yZWJpbmQ8X0FsbG9jLCBfVHAsIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfVHA+OjpvdGhlciBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWUuLi4+IGNsYXNzIF9BbGxvYywgdHlwZW5hbWUgX1RwLAorICAgICAgICAgICAgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19hbGxvY3RyX3JlYmluZDxfQWxsb2M8X1VwLCBfQXJncy4uLj4sIF9UcCwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBfQWxsb2M8X1RwLCBfQXJncy4uLj4gX190eXBlOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiAgVW5pZm9ybSBpbnRlcmZhY2UgdG8gYWxsIGFsbG9jYXRvciB0eXBlcy4KKyAgICogQGluZ3JvdXAgYWxsb2NhdG9ycworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IGFsbG9jYXRvcl90cmFpdHMKKyAgICB7CisgICAgICAvLy8gVGhlIGFsbG9jYXRvciB0eXBlCisgICAgICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIC8vLyBUaGUgYWxsb2NhdGVkIHR5cGUKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyNkZWZpbmUgX0dMSUJDWFhfQUxMT0NfVFJfTkVTVEVEX1RZUEUoX05UWVBFLCBfQUxUKSBcCisgIHByaXZhdGU6IFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBcCisgICAgc3RhdGljIHR5cGVuYW1lIF9UcDo6X05UWVBFIF9TXyMjX05UWVBFIyNfaGVscGVyKF9UcCopOyBcCisgIHN0YXRpYyBfQUxUIF9TXyMjX05UWVBFIyNfaGVscGVyKC4uLik7IFwKKyAgICB0eXBlZGVmIGRlY2x0eXBlKF9TXyMjX05UWVBFIyNfaGVscGVyKChfQWxsb2MqKTApKSBfXyMjX05UWVBFOyBcCisgIHB1YmxpYzoKKworX0dMSUJDWFhfQUxMT0NfVFJfTkVTVEVEX1RZUEUocG9pbnRlciwgdmFsdWVfdHlwZSopCisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmICAgVGhlIGFsbG9jYXRvcidzIHBvaW50ZXIgdHlwZS4KKyAgICAgICAqCisgICAgICAgKiBAYyBBbGxvYzo6cG9pbnRlciBpZiB0aGF0IHR5cGUgZXhpc3RzLCBvdGhlcndpc2UgQGMgdmFsdWVfdHlwZSoKKyAgICAgICovCisgICAgICB0eXBlZGVmIF9fcG9pbnRlciBwb2ludGVyOworCitfR0xJQkNYWF9BTExPQ19UUl9ORVNURURfVFlQRShjb25zdF9wb2ludGVyLAorICB0eXBlbmFtZSBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6dGVtcGxhdGUgcmViaW5kPGNvbnN0IHZhbHVlX3R5cGU+KQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiAgIFRoZSBhbGxvY2F0b3IncyBjb25zdCBwb2ludGVyIHR5cGUuCisgICAgICAgKgorICAgICAgICogQGMgQWxsb2M6OmNvbnN0X3BvaW50ZXIgaWYgdGhhdCB0eXBlIGV4aXN0cywgb3RoZXJ3aXNlCisgICAgICAgKiA8dHQ+IHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+OjpyZWJpbmQ8Y29uc3QgdmFsdWVfdHlwZT4gPC90dD4KKyAgICAgICovCisgICAgICB0eXBlZGVmIF9fY29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworCitfR0xJQkNYWF9BTExPQ19UUl9ORVNURURfVFlQRSh2b2lkX3BvaW50ZXIsCisgIHR5cGVuYW1lIHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+Ojp0ZW1wbGF0ZSByZWJpbmQ8dm9pZD4pCisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmICAgVGhlIGFsbG9jYXRvcidzIHZvaWQgcG9pbnRlciB0eXBlLgorICAgICAgICoKKyAgICAgICAqIEBjIEFsbG9jOjp2b2lkX3BvaW50ZXIgaWYgdGhhdCB0eXBlIGV4aXN0cywgb3RoZXJ3aXNlCisgICAgICAgKiA8dHQ+IHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+OjpyZWJpbmQ8dm9pZD4gPC90dD4KKyAgICAgICovCisgICAgICB0eXBlZGVmIF9fdm9pZF9wb2ludGVyIHZvaWRfcG9pbnRlcjsKKworX0dMSUJDWFhfQUxMT0NfVFJfTkVTVEVEX1RZUEUoY29uc3Rfdm9pZF9wb2ludGVyLAorICB0eXBlbmFtZSBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6dGVtcGxhdGUgcmViaW5kPGNvbnN0IHZvaWQ+KQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiAgIFRoZSBhbGxvY2F0b3IncyBjb25zdCB2b2lkIHBvaW50ZXIgdHlwZS4KKyAgICAgICAqCisgICAgICAgKiBAYyBBbGxvYzo6Y29uc3Rfdm9pZF9wb2ludGVyIGlmIHRoYXQgdHlwZSBleGlzdHMsIG90aGVyd2lzZQorICAgICAgICogPHR0PiBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6cmViaW5kPGNvbnN0IHZvaWQ+IDwvdHQ+CisgICAgICAqLworICAgICAgdHlwZWRlZiBfX2NvbnN0X3ZvaWRfcG9pbnRlciBjb25zdF92b2lkX3BvaW50ZXI7CisKK19HTElCQ1hYX0FMTE9DX1RSX05FU1RFRF9UWVBFKGRpZmZlcmVuY2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+OjpkaWZmZXJlbmNlX3R5cGUpCisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmICAgVGhlIGFsbG9jYXRvcidzIGRpZmZlcmVuY2UgdHlwZQorICAgICAgICoKKyAgICAgICAqIEBjIEFsbG9jOjpkaWZmZXJlbmNlX3R5cGUgaWYgdGhhdCB0eXBlIGV4aXN0cywgb3RoZXJ3aXNlCisgICAgICAgKiA8dHQ+IHBvaW50ZXJfdHJhaXRzPHBvaW50ZXI+OjpkaWZmZXJlbmNlX3R5cGUgPC90dD4KKyAgICAgICovCisgICAgICB0eXBlZGVmIF9fZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworX0dMSUJDWFhfQUxMT0NfVFJfTkVTVEVEX1RZUEUoc2l6ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgbWFrZV91bnNpZ25lZDxkaWZmZXJlbmNlX3R5cGU+Ojp0eXBlKQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiAgIFRoZSBhbGxvY2F0b3IncyBzaXplIHR5cGUKKyAgICAgICAqCisgICAgICAgKiBAYyBBbGxvYzo6c2l6ZV90eXBlIGlmIHRoYXQgdHlwZSBleGlzdHMsIG90aGVyd2lzZQorICAgICAgICogPHR0PiBtYWtlX3Vuc2lnbmVkPGRpZmZlcmVuY2VfdHlwZT46OnR5cGUgPC90dD4KKyAgICAgICovCisgICAgICB0eXBlZGVmIF9fc2l6ZV90eXBlIHNpemVfdHlwZTsKKworX0dMSUJDWFhfQUxMT0NfVFJfTkVTVEVEX1RZUEUocHJvcGFnYXRlX29uX2NvbnRhaW5lcl9jb3B5X2Fzc2lnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZV90eXBlKQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiAgIEhvdyB0aGUgYWxsb2NhdG9yIGlzIHByb3BhZ2F0ZWQgb24gY29weSBhc3NpZ25tZW50CisgICAgICAgKgorICAgICAgICogQGMgQWxsb2M6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50IGlmIHRoYXQgdHlwZSBleGlzdHMsCisgICAgICAgKiBvdGhlcndpc2UgQGMgZmFsc2VfdHlwZQorICAgICAgKi8KKyAgICAgIHR5cGVkZWYgX19wcm9wYWdhdGVfb25fY29udGFpbmVyX2NvcHlfYXNzaWdubWVudAorICAgICAgIAlwcm9wYWdhdGVfb25fY29udGFpbmVyX2NvcHlfYXNzaWdubWVudDsKKworX0dMSUJDWFhfQUxMT0NfVFJfTkVTVEVEX1RZUEUocHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZV90eXBlKQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiAgIEhvdyB0aGUgYWxsb2NhdG9yIGlzIHByb3BhZ2F0ZWQgb24gbW92ZSBhc3NpZ25tZW50CisgICAgICAgKgorICAgICAgICogQGMgQWxsb2M6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50IGlmIHRoYXQgdHlwZSBleGlzdHMsCisgICAgICAgKiBvdGhlcndpc2UgQGMgZmFsc2VfdHlwZQorICAgICAgKi8KKyAgICAgIHR5cGVkZWYgX19wcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudAorICAgICAgIAlwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDsKKworX0dMSUJDWFhfQUxMT0NfVFJfTkVTVEVEX1RZUEUocHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VfdHlwZSkKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgICBIb3cgdGhlIGFsbG9jYXRvciBpcyBwcm9wYWdhdGVkIG9uIHN3YXAKKyAgICAgICAqCisgICAgICAgKiBAYyBBbGxvYzo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwIGlmIHRoYXQgdHlwZSBleGlzdHMsCisgICAgICAgKiBvdGhlcndpc2UgQGMgZmFsc2VfdHlwZQorICAgICAgKi8KKyAgICAgIHR5cGVkZWYgX19wcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXAgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwOworCisjdW5kZWYgX0dMSUJDWFhfQUxMT0NfVFJfTkVTVEVEX1RZUEUKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICB1c2luZyByZWJpbmRfYWxsb2MgPSB0eXBlbmFtZSBfX2FsbG9jdHJfcmViaW5kPF9BbGxvYywgX1RwPjo6X190eXBlOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICB1c2luZyByZWJpbmRfdHJhaXRzID0gYWxsb2NhdG9yX3RyYWl0czxyZWJpbmRfYWxsb2M8X1RwPj47CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMj4KKwlzdHJ1Y3QgX19hbGxvY2F0ZV9oZWxwZXIKKwl7CisJICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MzLAorCSAgICB0eXBlbmFtZSA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxfQWxsb2MzKj4oKS0+YWxsb2NhdGUoCisJCSAgc3RkOjpkZWNsdmFsPHNpemVfdHlwZT4oKSwKKwkJICBzdGQ6OmRlY2x2YWw8Y29uc3Rfdm9pZF9wb2ludGVyPigpKSk+CisJICAgIHN0YXRpYyB0cnVlX3R5cGUgX190ZXN0KGludCk7CisKKwkgIHRlbXBsYXRlPHR5cGVuYW1lPgorCSAgICBzdGF0aWMgZmFsc2VfdHlwZSBfX3Rlc3QoLi4uKTsKKworCSAgdHlwZWRlZiBkZWNsdHlwZShfX3Rlc3Q8X0FsbG9jPigwKSkgdHlwZTsKKwkgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHlwZTo6dmFsdWU7CisJfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMj4KKwlzdGF0aWMgdHlwZW5hbWUKKyAgICAgICAJZW5hYmxlX2lmPF9fYWxsb2NhdGVfaGVscGVyPF9BbGxvYzI+Ojp2YWx1ZSwgcG9pbnRlcj46OnR5cGUKKyAgICAgICAJX1NfYWxsb2NhdGUoX0FsbG9jMiYgX19hLCBzaXplX3R5cGUgX19uLCBjb25zdF92b2lkX3BvaW50ZXIgX19oaW50KQorCXsgcmV0dXJuIF9fYS5hbGxvY2F0ZShfX24sIF9faGludCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMj4KKwlzdGF0aWMgdHlwZW5hbWUKKyAgICAgICAJZW5hYmxlX2lmPCFfX2FsbG9jYXRlX2hlbHBlcjxfQWxsb2MyPjo6dmFsdWUsIHBvaW50ZXI+Ojp0eXBlCisgICAgICAgCV9TX2FsbG9jYXRlKF9BbGxvYzImIF9fYSwgc2l6ZV90eXBlIF9fbiwgLi4uKQorCXsgcmV0dXJuIF9fYS5hbGxvY2F0ZShfX24pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RydWN0IF9fY29uc3RydWN0X2hlbHBlcgorCXsKKwkgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzIsCisJICAgIHR5cGVuYW1lID0gZGVjbHR5cGUoc3RkOjpkZWNsdmFsPF9BbGxvYzIqPigpLT5jb25zdHJ1Y3QoCisJCSAgc3RkOjpkZWNsdmFsPF9UcCo+KCksIHN0ZDo6ZGVjbHZhbDxfQXJncz4oKS4uLikpPgorCSAgICBzdGF0aWMgdHJ1ZV90eXBlIF9fdGVzdChpbnQpOworCisJICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKwkgICAgc3RhdGljIGZhbHNlX3R5cGUgX190ZXN0KC4uLik7CisKKwkgIHR5cGVkZWYgZGVjbHR5cGUoX190ZXN0PF9BbGxvYz4oMCkpIHR5cGU7CisJICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHR5cGU6OnZhbHVlOworCX07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RhdGljIHR5cGVuYW1lCisgICAgICAgCWVuYWJsZV9pZjxfX2NvbnN0cnVjdF9oZWxwZXI8X1RwLCBfQXJncy4uLj46OnZhbHVlLCB2b2lkPjo6dHlwZQorICAgICAgIAlfU19jb25zdHJ1Y3QoX0FsbG9jJiBfX2EsIF9UcCogX19wLCBfQXJncyYmLi4uIF9fYXJncykKKwl7IF9fYS5jb25zdHJ1Y3QoX19wLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RhdGljIHR5cGVuYW1lCisJZW5hYmxlX2lmPF9fYW5kXzxfX25vdF88X19jb25zdHJ1Y3RfaGVscGVyPF9UcCwgX0FyZ3MuLi4+PiwKKwkJCSBpc19jb25zdHJ1Y3RpYmxlPF9UcCwgX0FyZ3MuLi4+Pjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCisgICAgICAgCV9TX2NvbnN0cnVjdChfQWxsb2MmLCBfVHAqIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyA6Om5ldygodm9pZCopX19wKSBfVHAoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJc3RydWN0IF9fZGVzdHJveV9oZWxwZXIKKwl7CisJICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MyLAorCSAgICB0eXBlbmFtZSA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxfQWxsb2MyKj4oKS0+ZGVzdHJveSgKKwkJICBzdGQ6OmRlY2x2YWw8X1RwKj4oKSkpPgorCSAgICBzdGF0aWMgdHJ1ZV90eXBlIF9fdGVzdChpbnQpOworCisJICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKwkgICAgc3RhdGljIGZhbHNlX3R5cGUgX190ZXN0KC4uLik7CisKKwkgIHR5cGVkZWYgZGVjbHR5cGUoX190ZXN0PF9BbGxvYz4oMCkpIHR5cGU7CisJICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHR5cGU6OnZhbHVlOworCX07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwlzdGF0aWMgdHlwZW5hbWUgZW5hYmxlX2lmPF9fZGVzdHJveV9oZWxwZXI8X1RwPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCisgICAgICAgCV9TX2Rlc3Ryb3koX0FsbG9jJiBfX2EsIF9UcCogX19wKQorCXsgX19hLmRlc3Ryb3koX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJc3RhdGljIHR5cGVuYW1lIGVuYWJsZV9pZjwhX19kZXN0cm95X2hlbHBlcjxfVHA+Ojp2YWx1ZSwgdm9pZD46OnR5cGUKKyAgICAgICAJX1NfZGVzdHJveShfQWxsb2MmLCBfVHAqIF9fcCkKKwl7IF9fcC0+fl9UcCgpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzI+CisJc3RydWN0IF9fbWF4c2l6ZV9oZWxwZXIKKwl7CisJICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MzLAorCSAgICB0eXBlbmFtZSA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxfQWxsb2MzKj4oKS0+bWF4X3NpemUoKSk+CisJICAgIHN0YXRpYyB0cnVlX3R5cGUgX190ZXN0KGludCk7CisKKwkgIHRlbXBsYXRlPHR5cGVuYW1lPgorCSAgICBzdGF0aWMgZmFsc2VfdHlwZSBfX3Rlc3QoLi4uKTsKKworCSAgdHlwZWRlZiBkZWNsdHlwZShfX3Rlc3Q8X0FsbG9jMj4oMCkpIHR5cGU7CisJICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHR5cGU6OnZhbHVlOworCX07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzI+CisJc3RhdGljIHR5cGVuYW1lCisgICAgICAgCWVuYWJsZV9pZjxfX21heHNpemVfaGVscGVyPF9BbGxvYzI+Ojp2YWx1ZSwgc2l6ZV90eXBlPjo6dHlwZQorICAgICAgIAlfU19tYXhfc2l6ZShfQWxsb2MyJiBfX2EpCisJeyByZXR1cm4gX19hLm1heF9zaXplKCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMj4KKwlzdGF0aWMgdHlwZW5hbWUKKyAgICAgICAJZW5hYmxlX2lmPCFfX21heHNpemVfaGVscGVyPF9BbGxvYzI+Ojp2YWx1ZSwgc2l6ZV90eXBlPjo6dHlwZQorCV9TX21heF9zaXplKF9BbGxvYzImKQorCXsgcmV0dXJuIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxzaXplX3R5cGU+OjpfX21heDsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MyPgorCXN0cnVjdCBfX3NlbGVjdF9oZWxwZXIKKwl7CisJICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MzLCB0eXBlbmFtZQorCSAgICA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxfQWxsb2MzKj4oKQorCQktPnNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oKSk+CisJICAgIHN0YXRpYyB0cnVlX3R5cGUgX190ZXN0KGludCk7CisKKwkgIHRlbXBsYXRlPHR5cGVuYW1lPgorCSAgICBzdGF0aWMgZmFsc2VfdHlwZSBfX3Rlc3QoLi4uKTsKKworCSAgdHlwZWRlZiBkZWNsdHlwZShfX3Rlc3Q8X0FsbG9jMj4oMCkpIHR5cGU7CisJICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHR5cGU6OnZhbHVlOworCX07CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MyPgorCXN0YXRpYyB0eXBlbmFtZQorICAgICAgIAllbmFibGVfaWY8X19zZWxlY3RfaGVscGVyPF9BbGxvYzI+Ojp2YWx1ZSwgX0FsbG9jMj46OnR5cGUKKyAgICAgICAJX1Nfc2VsZWN0KF9BbGxvYzImIF9fYSkKKwl7IHJldHVybiBfX2Euc2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbigpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzI+CisJc3RhdGljIHR5cGVuYW1lCisgICAgICAgCWVuYWJsZV9pZjwhX19zZWxlY3RfaGVscGVyPF9BbGxvYzI+Ojp2YWx1ZSwgX0FsbG9jMj46OnR5cGUKKyAgICAgICAJX1Nfc2VsZWN0KF9BbGxvYzImIF9fYSkKKwl7IHJldHVybiBfX2E7IH0KKworICAgIHB1YmxpYzoKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBbGxvY2F0ZSBtZW1vcnkuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgVGhlIG51bWJlciBvZiBvYmplY3RzIHRvIGFsbG9jYXRlIHNwYWNlIGZvci4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgYS5hbGxvY2F0ZShuKQorICAgICAgKi8KKyAgICAgIHN0YXRpYyBwb2ludGVyCisgICAgICBhbGxvY2F0ZShfQWxsb2MmIF9fYSwgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIF9fYS5hbGxvY2F0ZShfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWxsb2NhdGUgbWVtb3J5LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0byBhbGxvY2F0ZSBzcGFjZSBmb3IuCisgICAgICAgKiAgQHBhcmFtICBfX2hpbnQgQWlkIHRvIGxvY2FsaXR5LgorICAgICAgICogIEByZXR1cm4gTWVtb3J5IG9mIHN1aXRhYmxlIHNpemUgYW5kIGFsaWdubWVudCBmb3IgQGEgbiBvYmplY3RzCisgICAgICAgKiAgICAgICAgICBvZiB0eXBlIEBjIHZhbHVlX3R5cGUKKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyA8dHQ+IGEuYWxsb2NhdGUobiwgaGludCkgPC90dD4gaWYgdGhhdCBleHByZXNzaW9uIGlzCisgICAgICAgKiAgd2VsbC1mb3JtZWQsIG90aGVyd2lzZSByZXR1cm5zIEBjIGEuYWxsb2NhdGUobikKKyAgICAgICovCisgICAgICBzdGF0aWMgcG9pbnRlcgorICAgICAgYWxsb2NhdGUoX0FsbG9jJiBfX2EsIHNpemVfdHlwZSBfX24sIGNvbnN0X3ZvaWRfcG9pbnRlciBfX2hpbnQpCisgICAgICB7IHJldHVybiBfU19hbGxvY2F0ZShfX2EsIF9fbiwgX19oaW50KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlYWxsb2NhdGUgbWVtb3J5LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3AgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSB0byBkZWFsbG9jYXRlLgorICAgICAgICogIEBwYXJhbSAgX19uICBUaGUgbnVtYmVyIG9mIG9iamVjdHMgc3BhY2Ugd2FzIGFsbG9jYXRlZCBmb3IuCisgICAgICAgKgorICAgICAgICogIENhbGxzIDx0dD4gYS5kZWFsbG9jYXRlKHAsIG4pIDwvdHQ+CisgICAgICAqLworICAgICAgc3RhdGljIHZvaWQgZGVhbGxvY2F0ZShfQWxsb2MmIF9fYSwgcG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pCisgICAgICB7IF9fYS5kZWFsbG9jYXRlKF9fcCwgX19uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBhbiBvYmplY3Qgb2YgdHlwZSBAYSBfVHAKKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19wICBQb2ludGVyIHRvIG1lbW9yeSBvZiBzdWl0YWJsZSBzaXplIGFuZCBhbGlnbm1lbnQgZm9yIFRwCisgICAgICAgKiAgQHBhcmFtICBfX2FyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyA8dHQ+IF9fYS5jb25zdHJ1Y3QoX19wLCBzdGQ6OmZvcndhcmQ8QXJncz4oX19hcmdzKS4uLikgPC90dD4KKyAgICAgICAqICBpZiB0aGF0IGV4cHJlc3Npb24gaXMgd2VsbC1mb3JtZWQsIG90aGVyd2lzZSB1c2VzIHBsYWNlbWVudC1uZXcKKyAgICAgICAqICB0byBjb25zdHJ1Y3QgYW4gb2JqZWN0IG9mIHR5cGUgQGEgX1RwIGF0IGxvY2F0aW9uIEBhIF9fcCBmcm9tIHRoZQorICAgICAgICogIGFyZ3VtZW50cyBAYSBfX2FyZ3MuLi4KKyAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0YXRpYyBhdXRvIGNvbnN0cnVjdChfQWxsb2MmIF9fYSwgX1RwKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorCS0+IGRlY2x0eXBlKF9TX2NvbnN0cnVjdChfX2EsIF9fcCwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSkKKwl7IF9TX2NvbnN0cnVjdChfX2EsIF9fcCwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlc3Ryb3kgYW4gb2JqZWN0IG9mIHR5cGUgQGEgX1RwCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fcCAgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIGRlc3Ryb3kKKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgX19hLmRlc3Ryb3koX19wKSBpZiB0aGF0IGV4cHJlc3Npb24gaXMgd2VsbC1mb3JtZWQsCisgICAgICAgKiAgb3RoZXJ3aXNlIGNhbGxzIEBjIF9fcC0+fl9UcCgpCisgICAgICAqLworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKwlzdGF0aWMgdm9pZCBkZXN0cm95KF9BbGxvYyYgX19hLCBfVHAqIF9fcCkKKwl7IF9TX2Rlc3Ryb3koX19hLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlIG1heGltdW0gc3VwcG9ydGVkIGFsbG9jYXRpb24gc2l6ZQorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3IuCisgICAgICAgKiAgQHJldHVybiBAYyBfX2EubWF4X3NpemUoKSBvciBAYyBudW1lcmljX2xpbWl0czxzaXplX3R5cGU+OjptYXgoKQorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIEBjIF9fYS5tYXhfc2l6ZSgpIGlmIHRoYXQgZXhwcmVzc2lvbiBpcyB3ZWxsLWZvcm1lZCwKKyAgICAgICAqICBvdGhlcndpc2UgcmV0dXJucyBAYyBudW1lcmljX2xpbWl0czxzaXplX3R5cGU+OjptYXgoKQorICAgICAgKi8KKyAgICAgIHN0YXRpYyBzaXplX3R5cGUgbWF4X3NpemUoY29uc3QgX0FsbG9jJiBfX2EpCisgICAgICB7IHJldHVybiBfU19tYXhfc2l6ZShfX2EpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgT2J0YWluIGFuIGFsbG9jYXRvciB0byB1c2Ugd2hlbiBjb3B5aW5nIGEgY29udGFpbmVyLgorICAgICAgICogIEBwYXJhbSAgX19yaHMgIEFuIGFsbG9jYXRvci4KKyAgICAgICAqICBAcmV0dXJuIEBjIF9fcmhzLnNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oKSBvciBAYSBfX3JocworICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIEBjIF9fcmhzLnNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oKSBpZiB0aGF0CisgICAgICAgKiAgZXhwcmVzc2lvbiBpcyB3ZWxsLWZvcm1lZCwgb3RoZXJ3aXNlIHJldHVybnMgQGEgX19yaHMKKyAgICAgICovCisgICAgICBzdGF0aWMgX0FsbG9jCisgICAgICBzZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKGNvbnN0IF9BbGxvYyYgX19yaHMpCisgICAgICB7IHJldHVybiBfU19zZWxlY3QoX19yaHMpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzI+CisgICAgY29uc3QgYm9vbCBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46Ol9fYWxsb2NhdGVfaGVscGVyPF9BbGxvYzI+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgY29uc3QgYm9vbAorICAgIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPjo6X19jb25zdHJ1Y3RfaGVscGVyPF9UcCwgX0FyZ3MuLi4+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdCBib29sIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPjo6X19kZXN0cm95X2hlbHBlcjxfVHA+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzI+CisgICAgY29uc3QgYm9vbCBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46Ol9fbWF4c2l6ZV9oZWxwZXI8X0FsbG9jMj46OnZhbHVlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMj4KKyAgICBjb25zdCBib29sIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPjo6X19zZWxlY3RfaGVscGVyPF9BbGxvYzI+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX2RvX2FsbG9jX29uX2NvcHkoX0FsbG9jJiBfX29uZSwgY29uc3QgX0FsbG9jJiBfX3R3bywgdHJ1ZV90eXBlKQorICAgIHsgX19vbmUgPSBfX3R3bzsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fZG9fYWxsb2Nfb25fY29weShfQWxsb2MmLCBjb25zdCBfQWxsb2MmLCBmYWxzZV90eXBlKQorICAgIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZCBfX2FsbG9jX29uX2NvcHkoX0FsbG9jJiBfX29uZSwgY29uc3QgX0FsbG9jJiBfX3R3bykKKyAgICB7CisgICAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPiBfX3RyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50IF9fcG9jY2E7CisgICAgICBfX2RvX2FsbG9jX29uX2NvcHkoX19vbmUsIF9fdHdvLCBfX3BvY2NhKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIF9BbGxvYyBfX2FsbG9jX29uX2NvcHkoY29uc3QgX0FsbG9jJiBfX2EpCisgICAgeworICAgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4gX190cmFpdHM7CisgICAgICByZXR1cm4gX190cmFpdHM6OnNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oX19hKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkIF9fZG9fYWxsb2Nfb25fbW92ZShfQWxsb2MmIF9fb25lLCBfQWxsb2MmIF9fdHdvLCB0cnVlX3R5cGUpCisgICAgeyBfX29uZSA9IHN0ZDo6bW92ZShfX3R3byk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQgX19kb19hbGxvY19vbl9tb3ZlKF9BbGxvYyYsIF9BbGxvYyYsIGZhbHNlX3R5cGUpCisgICAgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkIF9fYWxsb2Nfb25fbW92ZShfQWxsb2MmIF9fb25lLCBfQWxsb2MmIF9fdHdvKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+IF9fdHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0czo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQgX19wb2NtYTsKKyAgICAgIF9fZG9fYWxsb2Nfb25fbW92ZShfX29uZSwgX190d28sIF9fcG9jbWEoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZCBfX2RvX2FsbG9jX29uX3N3YXAoX0FsbG9jJiBfX29uZSwgX0FsbG9jJiBfX3R3bywgdHJ1ZV90eXBlKQorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICAgIHN3YXAoX19vbmUsIF9fdHdvKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkIF9fZG9fYWxsb2Nfb25fc3dhcChfQWxsb2MmLCBfQWxsb2MmLCBmYWxzZV90eXBlKQorICAgIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZCBfX2FsbG9jX29uX3N3YXAoX0FsbG9jJiBfX29uZSwgX0FsbG9jJiBfX3R3bykKKyAgICB7CisgICAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPiBfX3RyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcCBfX3BvY3M7CisgICAgICBfX2RvX2FsbG9jX29uX3N3YXAoX19vbmUsIF9fdHdvLCBfX3BvY3MoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBfX2lzX2NvcHlfaW5zZXJ0YWJsZV9pbXBsCisgICAgeworICAgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4gX1RyYWl0czsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZQorCSAgICAgICA9IGRlY2x0eXBlKF9UcmFpdHM6OmNvbnN0cnVjdChzdGQ6OmRlY2x2YWw8X0FsbG9jJj4oKSwKKwkJCQkJICAgICBzdGQ6OmRlY2x2YWw8X1VwKj4oKSwKKwkJCQkJICAgICBzdGQ6OmRlY2x2YWw8Y29uc3QgX1VwJj4oKSkpPgorCXN0YXRpYyB0cnVlX3R5cGUKKwlfTV9zZWxlY3QoaW50KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorCXN0YXRpYyBmYWxzZV90eXBlCisJX01fc2VsZWN0KC4uLik7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIGRlY2x0eXBlKF9NX3NlbGVjdDx0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGU+KDApKSB0eXBlOworICAgIH07CisKKyAgLy8gdHJ1ZSBpZiBfQWxsb2M6OnZhbHVlX3R5cGUgaXMgQ29weUluc2VydGFibGUgaW50byBjb250YWluZXJzIHVzaW5nIF9BbGxvYworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9faXNfY29weV9pbnNlcnRhYmxlCisgICAgOiBfX2lzX2NvcHlfaW5zZXJ0YWJsZV9pbXBsPF9BbGxvYz46OnR5cGUKKyAgICB7IH07CisKKyAgLy8gc3RkOjphbGxvY2F0b3I8X1RwPiBqdXN0IHJlcXVpcmVzIENvcHlDb25zdHJ1Y3RpYmxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19jb3B5X2luc2VydGFibGU8YWxsb2NhdG9yPF9UcD4+CisgICAgOiBpc19jb3B5X2NvbnN0cnVjdGlibGU8X1RwPgorICAgIHsgfTsKKworICAvLyBVc2VkIHRvIGFsbG93IGNvcHkgY29uc3RydWN0aW9uIG9mIHVub3JkZXJlZCBjb250YWluZXJzCisgIHRlbXBsYXRlPGJvb2w+IHN0cnVjdCBfX2FsbG93X2NvcHlfY29ucyB7IH07CisKKyAgLy8gVXNlZCB0byBkZWxldGUgY29weSBjb25zdHJ1Y3RvciBvZiB1bm9yZGVyZWQgY29udGFpbmVycworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fYWxsb3dfY29weV9jb25zPGZhbHNlPgorICAgIHsKKyAgICAgIF9fYWxsb3dfY29weV9jb25zKCkgPSBkZWZhdWx0OworICAgICAgX19hbGxvd19jb3B5X2NvbnMoY29uc3QgX19hbGxvd19jb3B5X2NvbnMmKSA9IGRlbGV0ZTsKKyAgICAgIF9fYWxsb3dfY29weV9jb25zKF9fYWxsb3dfY29weV9jb25zJiYpID0gZGVmYXVsdDsKKyAgICAgIF9fYWxsb3dfY29weV9jb25zJiBvcGVyYXRvcj0oY29uc3QgX19hbGxvd19jb3B5X2NvbnMmKSA9IGRlZmF1bHQ7CisgICAgICBfX2FsbG93X2NvcHlfY29ucyYgb3BlcmF0b3I9KF9fYWxsb3dfY29weV9jb25zJiYpID0gZGVmYXVsdDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICB1c2luZyBfX2NoZWNrX2NvcHlfY29uc3RydWN0aWJsZQorICAgICAgPSBfX2FsbG93X2NvcHlfY29uczxfX2lzX2NvcHlfaW5zZXJ0YWJsZTxfQWxsb2M+Ojp2YWx1ZT47CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkZjI0MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9hbGxvY2F0b3IuaApAQCAtMCwwICsxLDIyMSBAQAorLy8gQWxsb2NhdG9ycyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL2FsbG9jYXRvci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWVtb3J5fQorICovCisKKyNpZm5kZWYgX0FMTE9DQVRPUl9ICisjZGVmaW5lIF9BTExPQ0FUT1JfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2FsbG9jYXRvci5oPiAvLyBEZWZpbmUgdGhlIGJhc2UgY2xhc3MgdG8gc3RkOjphbGxvY2F0b3IuCisjaW5jbHVkZSA8Yml0cy9tZW1vcnlmd2QuaD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGFkZHRvZ3JvdXAgYWxsb2NhdG9ycworICAgKiAgQHsKKyAgICovCisKKyAgLy8vIGFsbG9jYXRvcjx2b2lkPiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIGFsbG9jYXRvcjx2b2lkPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkKiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2b2lkKiBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICB2YWx1ZV90eXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBzdHJ1Y3QgcmViaW5kCisgICAgICAgIHsgdHlwZWRlZiBhbGxvY2F0b3I8X1RwMT4gb3RoZXI7IH07CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTAzLiBzdGQ6OmFsbG9jYXRvciBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudAorICAgICAgdHlwZWRlZiB0cnVlX3R5cGUgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ7CisjZW5kaWYKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgIFRoZSBAYSBzdGFuZGFyZCBhbGxvY2F0b3IsIGFzIHBlciBbMjAuNF0uCisgICAqCisgICAqICBTZWUgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwNGNoMTEuaHRtbAorICAgKiAgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAgICoKKyAgICogIEB0cGFyYW0gIF9UcCAgVHlwZSBvZiBhbGxvY2F0ZWQgb2JqZWN0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGFsbG9jYXRvcjogcHVibGljIF9fYWxsb2NhdG9yX2Jhc2U8X1RwPgorICAgIHsKKyAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1RwJiAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKyAgICAgICAgeyB0eXBlZGVmIGFsbG9jYXRvcjxfVHAxPiBvdGhlcjsgfTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxMDMuIHN0ZDo6YWxsb2NhdG9yIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50CisgICAgICB0eXBlZGVmIHRydWVfdHlwZSBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDsKKyNlbmRpZgorCisgICAgICBhbGxvY2F0b3IoKSB0aHJvdygpIHsgfQorCisgICAgICBhbGxvY2F0b3IoY29uc3QgYWxsb2NhdG9yJiBfX2EpIHRocm93KCkKKyAgICAgIDogX19hbGxvY2F0b3JfYmFzZTxfVHA+KF9fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGFsbG9jYXRvcihjb25zdCBhbGxvY2F0b3I8X1RwMT4mKSB0aHJvdygpIHsgfQorCisgICAgICB+YWxsb2NhdG9yKCkgdGhyb3coKSB7IH0KKworICAgICAgLy8gSW5oZXJpdCBldmVyeXRoaW5nIGVsc2UuCisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgYWxsb2NhdG9yPF9UMT4mLCBjb25zdCBhbGxvY2F0b3I8X1QyPiYpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgYWxsb2NhdG9yPF9UcD4mLCBjb25zdCBhbGxvY2F0b3I8X1RwPiYpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBhbGxvY2F0b3I8X1QxPiYsIGNvbnN0IGFsbG9jYXRvcjxfVDI+JikKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYWxsb2NhdG9yPF9UcD4mLCBjb25zdCBhbGxvY2F0b3I8X1RwPiYpCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gQH0gZ3JvdXAgYWxsb2NhdG9yCisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBhbGxvY2F0b3I8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBhbGxvY2F0b3I8d2NoYXJfdD47CisjZW5kaWYKKworICAvLyBVbmRlZmluZS4KKyN1bmRlZiBfX2FsbG9jYXRvcl9iYXNlCisKKyAgLy8gVG8gaW1wbGVtZW50IE9wdGlvbiAzIG9mIERSIDQzMS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCBib29sID0gX19pc19lbXB0eShfQWxsb2MpPgorICAgIHN0cnVjdCBfX2FsbG9jX3N3YXAKKyAgICB7IHN0YXRpYyB2b2lkIF9TX2RvX2l0KF9BbGxvYyYsIF9BbGxvYyYpIHsgfSB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX19hbGxvY19zd2FwPF9BbGxvYywgZmFsc2U+CisgICAgeworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2RvX2l0KF9BbGxvYyYgX19vbmUsIF9BbGxvYyYgX190d28pCisgICAgICB7CisJLy8gUHJlY29uZGl0aW9uOiBzd2FwcGFibGUgYWxsb2NhdG9ycy4KKwlpZiAoX19vbmUgIT0gX190d28pCisJICBzd2FwKF9fb25lLCBfX3R3byk7CisgICAgICB9CisgICAgfTsKKworICAvLyBPcHRpbWl6ZSBmb3Igc3RhdGVsZXNzIGFsbG9jYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgYm9vbCA9IF9faXNfZW1wdHkoX0FsbG9jKT4KKyAgICBzdHJ1Y3QgX19hbGxvY19uZXEKKyAgICB7CisgICAgICBzdGF0aWMgYm9vbAorICAgICAgX1NfZG9faXQoY29uc3QgX0FsbG9jJiwgY29uc3QgX0FsbG9jJikKKyAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9fYWxsb2NfbmVxPF9BbGxvYywgZmFsc2U+CisgICAgeworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX2RvX2l0KGNvbnN0IF9BbGxvYyYgX19vbmUsIGNvbnN0IF9BbGxvYyYgX190d28pCisgICAgICB7IHJldHVybiBfX29uZSAhPSBfX3R3bzsgfQorICAgIH07CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbAorICAgID0gX19vcl88aXNfY29weV9jb25zdHJ1Y3RpYmxlPHR5cGVuYW1lIF9UcDo6dmFsdWVfdHlwZT4sCisgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTx0eXBlbmFtZSBfVHA6OnZhbHVlX3R5cGU+Pjo6dmFsdWU+CisgICAgc3RydWN0IF9fc2hyaW5rX3RvX2ZpdF9hdXgKKyAgICB7IHN0YXRpYyBib29sIF9TX2RvX2l0KF9UcCYpIHsgcmV0dXJuIGZhbHNlOyB9IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3Nocmlua190b19maXRfYXV4PF9UcCwgdHJ1ZT4KKyAgICB7CisgICAgICBzdGF0aWMgYm9vbAorICAgICAgX1NfZG9faXQoX1RwJiBfX2MpCisgICAgICB7CisJX190cnkKKwkgIHsKKwkgICAgX1RwKF9fbWFrZV9tb3ZlX2lmX25vZXhjZXB0X2l0ZXJhdG9yKF9fYy5iZWdpbigpKSwKKwkJX19tYWtlX21vdmVfaWZfbm9leGNlcHRfaXRlcmF0b3IoX19jLmVuZCgpKSwKKwkJX19jLmdldF9hbGxvY2F0b3IoKSkuc3dhcChfX2MpOworCSAgICByZXR1cm4gdHJ1ZTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICB9CisgICAgfTsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9hdG9taWNfYmFzZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2F0b21pY19iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI0ZDIwMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9hdG9taWNfYmFzZS5oCkBAIC0wLDAgKzEsODg4IEBACisvLyAtKi0gQysrIC0qLSBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2F0b21pY19iYXNlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXthdG9taWN9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9BVE9NSUNfQkFTRV9ICisjZGVmaW5lIF9HTElCQ1hYX0FUT01JQ19CQVNFX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxiaXRzL2F0b21pY19sb2NrZnJlZV9kZWZpbmVzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGRlZmdyb3VwIGF0b21pY3MgQXRvbWljcworICAgKgorICAgKiBDb21wb25lbnRzIGZvciBwZXJmb3JtaW5nIGF0b21pYyBvcGVyYXRpb25zLgorICAgKiBAeworICAgKi8KKworICAvLy8gRW51bWVyYXRpb24gZm9yIG1lbW9yeV9vcmRlcgorICB0eXBlZGVmIGVudW0gbWVtb3J5X29yZGVyCisgICAgeworICAgICAgbWVtb3J5X29yZGVyX3JlbGF4ZWQsCisgICAgICBtZW1vcnlfb3JkZXJfY29uc3VtZSwKKyAgICAgIG1lbW9yeV9vcmRlcl9hY3F1aXJlLAorICAgICAgbWVtb3J5X29yZGVyX3JlbGVhc2UsCisgICAgICBtZW1vcnlfb3JkZXJfYWNxX3JlbCwKKyAgICAgIG1lbW9yeV9vcmRlcl9zZXFfY3N0CisgICAgfSBtZW1vcnlfb3JkZXI7CisKKyAgZW51bSBfX21lbW9yeV9vcmRlcl9tb2RpZmllcgorICAgIHsKKyAgICAgIF9fbWVtb3J5X29yZGVyX21hc2sgICAgICAgICAgPSAweDBmZmZmLAorICAgICAgX19tZW1vcnlfb3JkZXJfbW9kaWZpZXJfbWFzayA9IDB4ZmZmZjAwMDAsCisgICAgICBfX21lbW9yeV9vcmRlcl9obGVfYWNxdWlyZSAgID0gMHgxMDAwMCwKKyAgICAgIF9fbWVtb3J5X29yZGVyX2hsZV9yZWxlYXNlICAgPSAweDIwMDAwCisgICAgfTsKKworICBjb25zdGV4cHIgbWVtb3J5X29yZGVyCisgIG9wZXJhdG9yfChtZW1vcnlfb3JkZXIgX19tLCBfX21lbW9yeV9vcmRlcl9tb2RpZmllciBfX21vZCkKKyAgeworICAgIHJldHVybiBtZW1vcnlfb3JkZXIoX19tIHwgaW50KF9fbW9kKSk7CisgIH0KKworICBjb25zdGV4cHIgbWVtb3J5X29yZGVyCisgIG9wZXJhdG9yJihtZW1vcnlfb3JkZXIgX19tLCBfX21lbW9yeV9vcmRlcl9tb2RpZmllciBfX21vZCkKKyAgeworICAgIHJldHVybiBtZW1vcnlfb3JkZXIoX19tICYgaW50KF9fbW9kKSk7CisgIH0KKworICAvLyBEcm9wIHJlbGVhc2Ugb3JkZXJpbmcgYXMgcGVyIFthdG9taWNzLnR5cGVzLm9wZXJhdGlvbnMucmVxXS8yMQorICBjb25zdGV4cHIgbWVtb3J5X29yZGVyCisgIF9fY21wZXhjaF9mYWlsdXJlX29yZGVyMihtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICB7CisgICAgcmV0dXJuIF9fbSA9PSBtZW1vcnlfb3JkZXJfYWNxX3JlbCA/IG1lbW9yeV9vcmRlcl9hY3F1aXJlCisgICAgICA6IF9fbSA9PSBtZW1vcnlfb3JkZXJfcmVsZWFzZSA/IG1lbW9yeV9vcmRlcl9yZWxheGVkIDogX19tOworICB9CisKKyAgY29uc3RleHByIG1lbW9yeV9vcmRlcgorICBfX2NtcGV4Y2hfZmFpbHVyZV9vcmRlcihtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICB7CisgICAgcmV0dXJuIG1lbW9yeV9vcmRlcihfX2NtcGV4Y2hfZmFpbHVyZV9vcmRlcjIoX19tICYgX19tZW1vcnlfb3JkZXJfbWFzaykKKyAgICAgIHwgKF9fbSAmIF9fbWVtb3J5X29yZGVyX21vZGlmaWVyX21hc2spKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIGF0b21pY190aHJlYWRfZmVuY2UobWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgeyBfX2F0b21pY190aHJlYWRfZmVuY2UoX19tKTsgfQorCisgIGlubGluZSB2b2lkCisgIGF0b21pY19zaWduYWxfZmVuY2UobWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgeyBfX2F0b21pY19zaWduYWxfZmVuY2UoX19tKTsgfQorCisgIC8vLyBraWxsX2RlcGVuZGVuY3kKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBraWxsX2RlcGVuZGVuY3koX1RwIF9feSkgbm9leGNlcHQKKyAgICB7CisgICAgICBfVHAgX19yZXQoX195KTsKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKworICAvLyBCYXNlIHR5cGVzIGZvciBhdG9taWNzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHA+CisgICAgc3RydWN0IF9fYXRvbWljX2Jhc2U7CisKKyAgLy8vIGF0b21pY19jaGFyCisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxjaGFyPiAgCSAgICAgICAJCWF0b21pY19jaGFyOworCisgIC8vLyBhdG9taWNfc2NoYXIKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHNpZ25lZCBjaGFyPgkgICAgIAlhdG9taWNfc2NoYXI7CisKKyAgLy8vIGF0b21pY191Y2hhcgorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8dW5zaWduZWQgY2hhcj4JCWF0b21pY191Y2hhcjsKKworICAvLy8gYXRvbWljX3Nob3J0CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxzaG9ydD4JCQlhdG9taWNfc2hvcnQ7CisKKyAgLy8vIGF0b21pY191c2hvcnQKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVuc2lnbmVkIHNob3J0PgkgCWF0b21pY191c2hvcnQ7CisKKyAgLy8vIGF0b21pY19pbnQKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPGludD4gIAkgICAgICAgCQlhdG9taWNfaW50OworCisgIC8vLyBhdG9taWNfdWludAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8dW5zaWduZWQgaW50PgkgICAgIAlhdG9taWNfdWludDsKKworICAvLy8gYXRvbWljX2xvbmcKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPGxvbmc+ICAJICAgICAgIAkJYXRvbWljX2xvbmc7CisKKyAgLy8vIGF0b21pY191bG9uZworICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8dW5zaWduZWQgbG9uZz4JCWF0b21pY191bG9uZzsKKworICAvLy8gYXRvbWljX2xsb25nCisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxsb25nIGxvbmc+ICAJCWF0b21pY19sbG9uZzsKKworICAvLy8gYXRvbWljX3VsbG9uZworICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8dW5zaWduZWQgbG9uZyBsb25nPiAJYXRvbWljX3VsbG9uZzsKKworICAvLy8gYXRvbWljX3djaGFyX3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHdjaGFyX3Q+ICAJCWF0b21pY193Y2hhcl90OworCisgIC8vLyBhdG9taWNfY2hhcjE2X3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPGNoYXIxNl90PiAgCQlhdG9taWNfY2hhcjE2X3Q7CisKKyAgLy8vIGF0b21pY19jaGFyMzJfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8Y2hhcjMyX3Q+ICAJCWF0b21pY19jaGFyMzJfdDsKKworICAvLy8gYXRvbWljX2NoYXIzMl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxjaGFyMzJfdD4gIAkJYXRvbWljX2NoYXIzMl90OworCisKKyAgLy8vIGF0b21pY19pbnRfbGVhc3Q4X3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPGludF9sZWFzdDhfdD4gIAkJYXRvbWljX2ludF9sZWFzdDhfdDsKKworICAvLy8gYXRvbWljX3VpbnRfbGVhc3Q4X3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVpbnRfbGVhc3Q4X3Q+CSAgICAgICAJYXRvbWljX3VpbnRfbGVhc3Q4X3Q7CisKKyAgLy8vIGF0b21pY19pbnRfbGVhc3QxNl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxpbnRfbGVhc3QxNl90PgkgICAgICAgCWF0b21pY19pbnRfbGVhc3QxNl90OworCisgIC8vLyBhdG9taWNfdWludF9sZWFzdDE2X3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVpbnRfbGVhc3QxNl90PgkgICAgICAgCWF0b21pY191aW50X2xlYXN0MTZfdDsKKworICAvLy8gYXRvbWljX2ludF9sZWFzdDMyX3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPGludF9sZWFzdDMyX3Q+CSAgICAgICAJYXRvbWljX2ludF9sZWFzdDMyX3Q7CisKKyAgLy8vIGF0b21pY191aW50X2xlYXN0MzJfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8dWludF9sZWFzdDMyX3Q+CSAgICAgICAJYXRvbWljX3VpbnRfbGVhc3QzMl90OworCisgIC8vLyBhdG9taWNfaW50X2xlYXN0NjRfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8aW50X2xlYXN0NjRfdD4JICAgICAgIAlhdG9taWNfaW50X2xlYXN0NjRfdDsKKworICAvLy8gYXRvbWljX3VpbnRfbGVhc3Q2NF90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx1aW50X2xlYXN0NjRfdD4JICAgICAgIAlhdG9taWNfdWludF9sZWFzdDY0X3Q7CisKKworICAvLy8gYXRvbWljX2ludF9mYXN0OF90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxpbnRfZmFzdDhfdD4gIAkJYXRvbWljX2ludF9mYXN0OF90OworCisgIC8vLyBhdG9taWNfdWludF9mYXN0OF90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx1aW50X2Zhc3Q4X3Q+CSAgICAgIAlhdG9taWNfdWludF9mYXN0OF90OworCisgIC8vLyBhdG9taWNfaW50X2Zhc3QxNl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxpbnRfZmFzdDE2X3Q+CSAgICAgIAlhdG9taWNfaW50X2Zhc3QxNl90OworCisgIC8vLyBhdG9taWNfdWludF9mYXN0MTZfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8dWludF9mYXN0MTZfdD4JICAgICAgCWF0b21pY191aW50X2Zhc3QxNl90OworCisgIC8vLyBhdG9taWNfaW50X2Zhc3QzMl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxpbnRfZmFzdDMyX3Q+CSAgICAgIAlhdG9taWNfaW50X2Zhc3QzMl90OworCisgIC8vLyBhdG9taWNfdWludF9mYXN0MzJfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8dWludF9mYXN0MzJfdD4JICAgICAgCWF0b21pY191aW50X2Zhc3QzMl90OworCisgIC8vLyBhdG9taWNfaW50X2Zhc3Q2NF90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxpbnRfZmFzdDY0X3Q+CSAgICAgIAlhdG9taWNfaW50X2Zhc3Q2NF90OworCisgIC8vLyBhdG9taWNfdWludF9mYXN0NjRfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8dWludF9mYXN0NjRfdD4JICAgICAgCWF0b21pY191aW50X2Zhc3Q2NF90OworCisKKyAgLy8vIGF0b21pY19pbnRwdHJfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8aW50cHRyX3Q+ICAJICAgICAgIAlhdG9taWNfaW50cHRyX3Q7CisKKyAgLy8vIGF0b21pY191aW50cHRyX3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVpbnRwdHJfdD4gIAkgICAgICAgCWF0b21pY191aW50cHRyX3Q7CisKKyAgLy8vIGF0b21pY19zaXplX3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHNpemVfdD4JIAkgICAgICAgCWF0b21pY19zaXplX3Q7CisKKyAgLy8vIGF0b21pY19pbnRtYXhfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8aW50bWF4X3Q+ICAJICAgICAgIAlhdG9taWNfaW50bWF4X3Q7CisKKyAgLy8vIGF0b21pY191aW50bWF4X3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVpbnRtYXhfdD4gIAkgICAgICAgCWF0b21pY191aW50bWF4X3Q7CisKKyAgLy8vIGF0b21pY19wdHJkaWZmX3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHB0cmRpZmZfdD4gIAkgICAgICAgCWF0b21pY19wdHJkaWZmX3Q7CisKKworI2RlZmluZSBBVE9NSUNfVkFSX0lOSVQoX1ZJKSB7IF9WSSB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhdG9taWM7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhdG9taWM8X1RwKj47CisKKyAgICAvKiBUaGUgdGFyZ2V0J3MgInNldCIgdmFsdWUgZm9yIHRlc3QtYW5kLXNldCBtYXkgbm90IGJlIGV4YWN0bHkgMS4gICovCisjaWYgX19HQ0NfQVRPTUlDX1RFU1RfQU5EX1NFVF9UUlVFVkFMID09IDEKKyAgICB0eXBlZGVmIGJvb2wgX19hdG9taWNfZmxhZ19kYXRhX3R5cGU7CisjZWxzZQorICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBfX2F0b21pY19mbGFnX2RhdGFfdHlwZTsKKyNlbmRpZgorCisgIC8qKgorICAgKiAgQGJyaWVmIEJhc2UgdHlwZSBmb3IgYXRvbWljX2ZsYWcuCisgICAqCisgICAqICBCYXNlIHR5cGUgaXMgUE9EIHdpdGggZGF0YSwgYWxsb3dpbmcgYXRvbWljX2ZsYWcgdG8gZGVyaXZlIGZyb20KKyAgICogIGl0IGFuZCBtZWV0IHRoZSBzdGFuZGFyZCBsYXlvdXQgdHlwZSByZXF1aXJlbWVudC4gSW4gYWRkaXRpb24gdG8KKyAgICogIGNvbXBhdGliaWx0eSB3aXRoIGEgQyBpbnRlcmZhY2UsIHRoaXMgYWxsb3dzIGRpZmZlcmVudAorICAgKiAgaW1wbGVtZW50YXRpb25zIG9mIGF0b21pY19mbGFnIHRvIHVzZSB0aGUgc2FtZSBhdG9taWMgb3BlcmF0aW9uCisgICAqICBmdW5jdGlvbnMsIHZpYSBhIHN0YW5kYXJkIGNvbnZlcnNpb24gdG8gdGhlIF9fYXRvbWljX2ZsYWdfYmFzZQorICAgKiAgYXJndW1lbnQuCisgICovCisgIF9HTElCQ1hYX0JFR0lOX0VYVEVSTl9DCisKKyAgc3RydWN0IF9fYXRvbWljX2ZsYWdfYmFzZQorICB7CisgICAgX19hdG9taWNfZmxhZ19kYXRhX3R5cGUgX01faTsKKyAgfTsKKworICBfR0xJQkNYWF9FTkRfRVhURVJOX0MKKworI2RlZmluZSBBVE9NSUNfRkxBR19JTklUIHsgMCB9CisKKyAgLy8vIGF0b21pY19mbGFnCisgIHN0cnVjdCBhdG9taWNfZmxhZyA6IHB1YmxpYyBfX2F0b21pY19mbGFnX2Jhc2UKKyAgeworICAgIGF0b21pY19mbGFnKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgIH5hdG9taWNfZmxhZygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICBhdG9taWNfZmxhZyhjb25zdCBhdG9taWNfZmxhZyYpID0gZGVsZXRlOworICAgIGF0b21pY19mbGFnJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljX2ZsYWcmKSA9IGRlbGV0ZTsKKyAgICBhdG9taWNfZmxhZyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pY19mbGFnJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAvLyBDb252ZXJzaW9uIHRvIEFUT01JQ19GTEFHX0lOSVQuCisgICAgY29uc3RleHByIGF0b21pY19mbGFnKGJvb2wgX19pKSBub2V4Y2VwdAorICAgICAgOiBfX2F0b21pY19mbGFnX2Jhc2V7IF9TX2luaXQoX19pKSB9CisgICAgeyB9CisKKyAgICBib29sCisgICAgdGVzdF9hbmRfc2V0KG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gX19hdG9taWNfdGVzdF9hbmRfc2V0ICgmX01faSwgX19tKTsKKyAgICB9CisKKyAgICBib29sCisgICAgdGVzdF9hbmRfc2V0KG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gX19hdG9taWNfdGVzdF9hbmRfc2V0ICgmX01faSwgX19tKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgY2xlYXIobWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgIHsKKyAgICAgIG1lbW9yeV9vcmRlciBfX2IgPSBfX20gJiBfX21lbW9yeV9vcmRlcl9tYXNrOworICAgICAgX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2NvbnN1bWUpOworICAgICAgX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAgICAgX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCisgICAgICBfX2F0b21pY19jbGVhciAoJl9NX2ksIF9fbSk7CisgICAgfQorCisgICAgdm9pZAorICAgIGNsZWFyKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICB7CisgICAgICBtZW1vcnlfb3JkZXIgX19iID0gX19tICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKyAgICAgIF9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9jb25zdW1lKTsKKyAgICAgIF9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgICAgIF9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKworICAgICAgX19hdG9taWNfY2xlYXIgKCZfTV9pLCBfX20pOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdGV4cHIgX19hdG9taWNfZmxhZ19kYXRhX3R5cGUKKyAgICBfU19pbml0KGJvb2wgX19pKQorICAgIHsgcmV0dXJuIF9faSA/IF9fR0NDX0FUT01JQ19URVNUX0FORF9TRVRfVFJVRVZBTCA6IDA7IH0KKyAgfTsKKworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBhdG9taWMgaW50ZWdyYWxzLgorICAvLworICAvLyBGb3IgZWFjaCBvZiB0aGUgaW50ZWdyYWwgdHlwZXMsIGRlZmluZSBhdG9taWNfW2ludGVncmFsIHR5cGVdIHN0cnVjdAorICAvLworICAvLyBhdG9taWNfYm9vbCAgICAgYm9vbAorICAvLyBhdG9taWNfY2hhciAgICAgY2hhcgorICAvLyBhdG9taWNfc2NoYXIgICAgc2lnbmVkIGNoYXIKKyAgLy8gYXRvbWljX3VjaGFyICAgIHVuc2lnbmVkIGNoYXIKKyAgLy8gYXRvbWljX3Nob3J0ICAgIHNob3J0CisgIC8vIGF0b21pY191c2hvcnQgICB1bnNpZ25lZCBzaG9ydAorICAvLyBhdG9taWNfaW50ICAgICAgaW50CisgIC8vIGF0b21pY191aW50ICAgICB1bnNpZ25lZCBpbnQKKyAgLy8gYXRvbWljX2xvbmcgICAgIGxvbmcKKyAgLy8gYXRvbWljX3Vsb25nICAgIHVuc2lnbmVkIGxvbmcKKyAgLy8gYXRvbWljX2xsb25nICAgIGxvbmcgbG9uZworICAvLyBhdG9taWNfdWxsb25nICAgdW5zaWduZWQgbG9uZyBsb25nCisgIC8vIGF0b21pY19jaGFyMTZfdCBjaGFyMTZfdAorICAvLyBhdG9taWNfY2hhcjMyX3QgY2hhcjMyX3QKKyAgLy8gYXRvbWljX3djaGFyX3QgIHdjaGFyX3QKKyAgLy8KKyAgLy8gTkI6IEFzc3VtaW5nIF9JVHAgaXMgYW4gaW50ZWdyYWwgc2NhbGFyIHR5cGUgdGhhdCBpcyAxLCAyLCA0LCBvcgorICAvLyA4IGJ5dGVzLCBzaW5jZSB0aGF0IGlzIHdoYXQgR0NDIGJ1aWx0LWluIGZ1bmN0aW9ucyBmb3IgYXRvbWljCisgIC8vIG1lbW9yeSBhY2Nlc3MgZXhwZWN0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIHN0cnVjdCBfX2F0b21pY19iYXNlCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9JVHAgCV9faW50X3R5cGU7CisKKyAgICAgIF9faW50X3R5cGUgCV9NX2k7CisKKyAgICBwdWJsaWM6CisgICAgICBfX2F0b21pY19iYXNlKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgfl9fYXRvbWljX2Jhc2UoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBfX2F0b21pY19iYXNlKGNvbnN0IF9fYXRvbWljX2Jhc2UmKSA9IGRlbGV0ZTsKKyAgICAgIF9fYXRvbWljX2Jhc2UmIG9wZXJhdG9yPShjb25zdCBfX2F0b21pY19iYXNlJikgPSBkZWxldGU7CisgICAgICBfX2F0b21pY19iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19hdG9taWNfYmFzZSYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICAvLyBSZXF1aXJlcyBfX2ludF90eXBlIGNvbnZlcnRpYmxlIHRvIF9NX2kuCisgICAgICBjb25zdGV4cHIgX19hdG9taWNfYmFzZShfX2ludF90eXBlIF9faSkgbm9leGNlcHQgOiBfTV9pIChfX2kpIHsgfQorCisgICAgICBvcGVyYXRvciBfX2ludF90eXBlKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGxvYWQoKTsgfQorCisgICAgICBvcGVyYXRvciBfX2ludF90eXBlKCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGxvYWQoKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcj0oX19pbnRfdHlwZSBfX2kpIG5vZXhjZXB0CisgICAgICB7CisJc3RvcmUoX19pKTsKKwlyZXR1cm4gX19pOworICAgICAgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcj0oX19pbnRfdHlwZSBfX2kpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7CisJc3RvcmUoX19pKTsKKwlyZXR1cm4gX19pOworICAgICAgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcisrKGludCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGZldGNoX2FkZCgxKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcisrKGludCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGZldGNoX2FkZCgxKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvci0tKGludCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGZldGNoX3N1YigxKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvci0tKGludCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGZldGNoX3N1YigxKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcisrKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2FkZF9mZXRjaCgmX01faSwgMSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yKysoKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfYWRkX2ZldGNoKCZfTV9pLCAxLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3ItLSgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19zdWJfZmV0Y2goJl9NX2ksIDEsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvci0tKCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX3N1Yl9mZXRjaCgmX01faSwgMSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yKz0oX19pbnRfdHlwZSBfX2kpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19hZGRfZmV0Y2goJl9NX2ksIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yKz0oX19pbnRfdHlwZSBfX2kpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19hZGRfZmV0Y2goJl9NX2ksIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yLT0oX19pbnRfdHlwZSBfX2kpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19zdWJfZmV0Y2goJl9NX2ksIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yLT0oX19pbnRfdHlwZSBfX2kpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19zdWJfZmV0Y2goJl9NX2ksIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yJj0oX19pbnRfdHlwZSBfX2kpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19hbmRfZmV0Y2goJl9NX2ksIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yJj0oX19pbnRfdHlwZSBfX2kpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19hbmRfZmV0Y2goJl9NX2ksIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yfD0oX19pbnRfdHlwZSBfX2kpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19vcl9mZXRjaCgmX01faSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3J8PShfX2ludF90eXBlIF9faSkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX29yX2ZldGNoKCZfTV9pLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcl49KF9faW50X3R5cGUgX19pKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfeG9yX2ZldGNoKCZfTV9pLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcl49KF9faW50X3R5cGUgX19pKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfeG9yX2ZldGNoKCZfTV9pLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBib29sCisgICAgICBpc19sb2NrX2ZyZWUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfaXNfbG9ja19mcmVlKHNpemVvZihfTV9pKSwgbnVsbHB0cik7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2lzX2xvY2tfZnJlZShzaXplb2YoX01faSksIG51bGxwdHIpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN0b3JlKF9faW50X3R5cGUgX19pLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIG1lbW9yeV9vcmRlciBfX2IgPSBfX20gJiBfX21lbW9yeV9vcmRlcl9tYXNrOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2NvbnN1bWUpOworCisJX19hdG9taWNfc3RvcmVfbigmX01faSwgX19pLCBfX20pOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzdG9yZShfX2ludF90eXBlIF9faSwKKwkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBtZW1vcnlfb3JkZXIgX19iID0gX19tICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9jb25zdW1lKTsKKworCV9fYXRvbWljX3N0b3JlX24oJl9NX2ksIF9faSwgX19tKTsKKyAgICAgIH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgbG9hZChtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisgICAgICAgbWVtb3J5X29yZGVyIF9fYiA9IF9fbSAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKworCXJldHVybiBfX2F0b21pY19sb2FkX24oJl9NX2ksIF9fbSk7CisgICAgICB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGxvYWQobWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBjb25zdCB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBtZW1vcnlfb3JkZXIgX19iID0gX19tICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCisJcmV0dXJuIF9fYXRvbWljX2xvYWRfbigmX01faSwgX19tKTsKKyAgICAgIH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZXhjaGFuZ2UoX19pbnRfdHlwZSBfX2ksCisJICAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gX19hdG9taWNfZXhjaGFuZ2VfbigmX01faSwgX19pLCBfX20pOworICAgICAgfQorCisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGV4Y2hhbmdlKF9faW50X3R5cGUgX19pLAorCSAgICAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7CisJcmV0dXJuIF9fYXRvbWljX2V4Y2hhbmdlX24oJl9NX2ksIF9faSwgX19tKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKF9faW50X3R5cGUmIF9faTEsIF9faW50X3R5cGUgX19pMiwKKwkJCSAgICBtZW1vcnlfb3JkZXIgX19tMSwgbWVtb3J5X29yZGVyIF9fbTIpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgbWVtb3J5X29yZGVyIF9fYjIgPSBfX20yICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKyAgICAgICBtZW1vcnlfb3JkZXIgX19iMSA9IF9fbTEgJiBfX21lbW9yeV9vcmRlcl9tYXNrOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iMiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX2IyICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYjIgPD0gX19iMSk7CisKKwlyZXR1cm4gX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKCZfTV9pLCAmX19pMSwgX19pMiwgMSwgX19tMSwgX19tMik7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbTIpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgbWVtb3J5X29yZGVyIF9fYjIgPSBfX20yICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKyAgICAgICBtZW1vcnlfb3JkZXIgX19iMSA9IF9fbTEgJiBfX21lbW9yeV9vcmRlcl9tYXNrOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iMiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX2IyICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYjIgPD0gX19iMSk7CisKKwlyZXR1cm4gX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKCZfTV9pLCAmX19pMSwgX19pMiwgMSwgX19tMSwgX19tMik7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19pMSwgX19pMiwgX19tLAorCQkJCSAgICAgX19jbXBleGNoX2ZhaWx1cmVfb3JkZXIoX19tKSk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCSAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gY29tcGFyZV9leGNoYW5nZV93ZWFrKF9faTEsIF9faTIsIF9fbSwKKwkJCQkgICAgIF9fY21wZXhjaF9mYWlsdXJlX29yZGVyKF9fbSkpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tMSwgbWVtb3J5X29yZGVyIF9fbTIpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIG1lbW9yeV9vcmRlciBfX2IyID0gX19tMiAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisgICAgICAgIG1lbW9yeV9vcmRlciBfX2IxID0gX19tMSAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisJX19nbGliY3h4X2Fzc2VydChfX2IyICE9IG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYjIgIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iMiA8PSBfX2IxKTsKKworCXJldHVybiBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24oJl9NX2ksICZfX2kxLCBfX2kyLCAwLCBfX20xLCBfX20yKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19pbnRfdHlwZSYgX19pMSwgX19pbnRfdHlwZSBfX2kyLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tMikgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgbWVtb3J5X29yZGVyIF9fYjIgPSBfX20yICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKyAgICAgICAgbWVtb3J5X29yZGVyIF9fYjEgPSBfX20xICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKworCV9fZ2xpYmN4eF9hc3NlcnQoX19iMiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX2IyICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYjIgPD0gX19iMSk7CisKKwlyZXR1cm4gX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKCZfTV9pLCAmX19pMSwgX19pMiwgMCwgX19tMSwgX19tMik7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9faW50X3R5cGUmIF9faTEsIF9faW50X3R5cGUgX19pMiwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19pMSwgX19pMiwgX19tLAorCQkJCSAgICAgICBfX2NtcGV4Y2hfZmFpbHVyZV9vcmRlcihfX20pKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19pbnRfdHlwZSYgX19pMSwgX19pbnRfdHlwZSBfX2kyLAorCQkgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2kxLCBfX2kyLCBfX20sCisJCQkJICAgICAgIF9fY21wZXhjaF9mYWlsdXJlX29yZGVyKF9fbSkpOworICAgICAgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF9hZGQoX19pbnRfdHlwZSBfX2ksCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2ZldGNoX2FkZCgmX01faSwgX19pLCBfX20pOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGZldGNoX2FkZChfX2ludF90eXBlIF9faSwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfZmV0Y2hfYWRkKCZfTV9pLCBfX2ksIF9fbSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfc3ViKF9faW50X3R5cGUgX19pLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19mZXRjaF9zdWIoJl9NX2ksIF9faSwgX19tKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF9zdWIoX19pbnRfdHlwZSBfX2ksCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2ZldGNoX3N1YigmX01faSwgX19pLCBfX20pOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGZldGNoX2FuZChfX2ludF90eXBlIF9faSwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfZmV0Y2hfYW5kKCZfTV9pLCBfX2ksIF9fbSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfYW5kKF9faW50X3R5cGUgX19pLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19mZXRjaF9hbmQoJl9NX2ksIF9faSwgX19tKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF9vcihfX2ludF90eXBlIF9faSwKKwkgICAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfZmV0Y2hfb3IoJl9NX2ksIF9faSwgX19tKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF9vcihfX2ludF90eXBlIF9faSwKKwkgICAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfZmV0Y2hfb3IoJl9NX2ksIF9faSwgX19tKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF94b3IoX19pbnRfdHlwZSBfX2ksCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2ZldGNoX3hvcigmX01faSwgX19pLCBfX20pOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGZldGNoX3hvcihfX2ludF90eXBlIF9faSwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfZmV0Y2hfeG9yKCZfTV9pLCBfX2ksIF9fbSk7IH0KKyAgICB9OworCisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIHBvaW50ZXIgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QVHA+CisgICAgc3RydWN0IF9fYXRvbWljX2Jhc2U8X1BUcCo+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9QVHAqIAlfX3BvaW50ZXJfdHlwZTsKKworICAgICAgX19wb2ludGVyX3R5cGUgCV9NX3A7CisKKyAgICAgIC8vIEZhY3RvcmVkIG91dCB0byBmYWNpbGl0YXRlIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uLgorICAgICAgY29uc3RleHByIHB0cmRpZmZfdAorICAgICAgX01fdHlwZV9zaXplKHB0cmRpZmZfdCBfX2QpIHsgcmV0dXJuIF9fZCAqIHNpemVvZihfUFRwKTsgfQorCisgICAgICBjb25zdGV4cHIgcHRyZGlmZl90CisgICAgICBfTV90eXBlX3NpemUocHRyZGlmZl90IF9fZCkgdm9sYXRpbGUgeyByZXR1cm4gX19kICogc2l6ZW9mKF9QVHApOyB9CisKKyAgICBwdWJsaWM6CisgICAgICBfX2F0b21pY19iYXNlKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgfl9fYXRvbWljX2Jhc2UoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBfX2F0b21pY19iYXNlKGNvbnN0IF9fYXRvbWljX2Jhc2UmKSA9IGRlbGV0ZTsKKyAgICAgIF9fYXRvbWljX2Jhc2UmIG9wZXJhdG9yPShjb25zdCBfX2F0b21pY19iYXNlJikgPSBkZWxldGU7CisgICAgICBfX2F0b21pY19iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19hdG9taWNfYmFzZSYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICAvLyBSZXF1aXJlcyBfX3BvaW50ZXJfdHlwZSBjb252ZXJ0aWJsZSB0byBfTV9wLgorICAgICAgY29uc3RleHByIF9fYXRvbWljX2Jhc2UoX19wb2ludGVyX3R5cGUgX19wKSBub2V4Y2VwdCA6IF9NX3AgKF9fcCkgeyB9CisKKyAgICAgIG9wZXJhdG9yIF9fcG9pbnRlcl90eXBlKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGxvYWQoKTsgfQorCisgICAgICBvcGVyYXRvciBfX3BvaW50ZXJfdHlwZSgpIGNvbnN0IHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBsb2FkKCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yPShfX3BvaW50ZXJfdHlwZSBfX3ApIG5vZXhjZXB0CisgICAgICB7CisJc3RvcmUoX19wKTsKKwlyZXR1cm4gX19wOworICAgICAgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3I9KF9fcG9pbnRlcl90eXBlIF9fcCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsKKwlzdG9yZShfX3ApOworCXJldHVybiBfX3A7CisgICAgICB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcisrKGludCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGZldGNoX2FkZCgxKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrKyhpbnQpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBmZXRjaF9hZGQoMSk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLS0oaW50KSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gZmV0Y2hfc3ViKDEpOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci0tKGludCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGZldGNoX3N1YigxKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrKygpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19hZGRfZmV0Y2goJl9NX3AsIF9NX3R5cGVfc2l6ZSgxKSwKKwkJCQkgIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrKygpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19hZGRfZmV0Y2goJl9NX3AsIF9NX3R5cGVfc2l6ZSgxKSwKKwkJCQkgIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItLSgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19zdWJfZmV0Y2goJl9NX3AsIF9NX3R5cGVfc2l6ZSgxKSwKKwkJCQkgIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItLSgpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19zdWJfZmV0Y2goJl9NX3AsIF9NX3R5cGVfc2l6ZSgxKSwKKwkJCQkgIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrPShwdHJkaWZmX3QgX19kKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfYWRkX2ZldGNoKCZfTV9wLCBfTV90eXBlX3NpemUoX19kKSwKKwkJCQkgIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrPShwdHJkaWZmX3QgX19kKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfYWRkX2ZldGNoKCZfTV9wLCBfTV90eXBlX3NpemUoX19kKSwKKwkJCQkgIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItPShwdHJkaWZmX3QgX19kKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfc3ViX2ZldGNoKCZfTV9wLCBfTV90eXBlX3NpemUoX19kKSwKKwkJCQkgIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItPShwdHJkaWZmX3QgX19kKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfc3ViX2ZldGNoKCZfTV9wLCBfTV90eXBlX3NpemUoX19kKSwKKwkJCQkgIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBib29sCisgICAgICBpc19sb2NrX2ZyZWUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfaXNfbG9ja19mcmVlKHNpemVvZihfX3BvaW50ZXJfdHlwZSksIG51bGxwdHIpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGlzX2xvY2tfZnJlZSgpIGNvbnN0IHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19pc19sb2NrX2ZyZWUoc2l6ZW9mKF9fcG9pbnRlcl90eXBlKSwgbnVsbHB0cik7IH0KKworICAgICAgdm9pZAorICAgICAgc3RvcmUoX19wb2ludGVyX3R5cGUgX19wLAorCSAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIG1lbW9yeV9vcmRlciBfX2IgPSBfX20gJiBfX21lbW9yeV9vcmRlcl9tYXNrOworCisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2FjcXVpcmUpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisKKwlfX2F0b21pY19zdG9yZV9uKCZfTV9wLCBfX3AsIF9fbSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN0b3JlKF9fcG9pbnRlcl90eXBlIF9fcCwKKwkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBtZW1vcnlfb3JkZXIgX19iID0gX19tICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9jb25zdW1lKTsKKworCV9fYXRvbWljX3N0b3JlX24oJl9NX3AsIF9fcCwgX19tKTsKKyAgICAgIH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGxvYWQobWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBjb25zdCBub2V4Y2VwdAorICAgICAgeworICAgICAgICBtZW1vcnlfb3JkZXIgX19iID0gX19tICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCisJcmV0dXJuIF9fYXRvbWljX2xvYWRfbigmX01fcCwgX19tKTsKKyAgICAgIH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGxvYWQobWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBjb25zdCB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBtZW1vcnlfb3JkZXIgX19iID0gX19tICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCisJcmV0dXJuIF9fYXRvbWljX2xvYWRfbigmX01fcCwgX19tKTsKKyAgICAgIH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGV4Y2hhbmdlKF9fcG9pbnRlcl90eXBlIF9fcCwKKwkgICAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBfX2F0b21pY19leGNoYW5nZV9uKCZfTV9wLCBfX3AsIF9fbSk7CisgICAgICB9CisKKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGV4Y2hhbmdlKF9fcG9pbnRlcl90eXBlIF9fcCwKKwkgICAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBfX2F0b21pY19leGNoYW5nZV9uKCZfTV9wLCBfX3AsIF9fbSk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fcG9pbnRlcl90eXBlJiBfX3AxLCBfX3BvaW50ZXJfdHlwZSBfX3AyLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tMikgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgbWVtb3J5X29yZGVyIF9fYjIgPSBfX20yICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKyAgICAgICAgbWVtb3J5X29yZGVyIF9fYjEgPSBfX20xICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYjIgIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iMiAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX2IyIDw9IF9fYjEpOworCisJcmV0dXJuIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbigmX01fcCwgJl9fcDEsIF9fcDIsIDAsIF9fbTEsIF9fbTIpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3BvaW50ZXJfdHlwZSYgX19wMSwgX19wb2ludGVyX3R5cGUgX19wMiwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20xLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbTIpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIG1lbW9yeV9vcmRlciBfX2IyID0gX19tMiAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisgICAgICAgIG1lbW9yeV9vcmRlciBfX2IxID0gX19tMSAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYjIgIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iMiAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX2IyIDw9IF9fYjEpOworCisJcmV0dXJuIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbigmX01fcCwgJl9fcDEsIF9fcDIsIDAsIF9fbTEsIF9fbTIpOworICAgICAgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgZmV0Y2hfYWRkKHB0cmRpZmZfdCBfX2QsCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2ZldGNoX2FkZCgmX01fcCwgX01fdHlwZV9zaXplKF9fZCksIF9fbSk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGZldGNoX2FkZChwdHJkaWZmX3QgX19kLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19mZXRjaF9hZGQoJl9NX3AsIF9NX3R5cGVfc2l6ZShfX2QpLCBfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBmZXRjaF9zdWIocHRyZGlmZl90IF9fZCwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfZmV0Y2hfc3ViKCZfTV9wLCBfTV90eXBlX3NpemUoX19kKSwgX19tKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgZmV0Y2hfc3ViKHB0cmRpZmZfdCBfX2QsCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2ZldGNoX3N1YigmX01fcCwgX01fdHlwZV9zaXplKF9fZCksIF9fbSk7IH0KKyAgICB9OworCisgIC8vIEB9IGdyb3VwIGF0b21pY3MKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYXRvbWljX2xvY2tmcmVlX2RlZmluZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9hdG9taWNfbG9ja2ZyZWVfZGVmaW5lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwODkwN2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYXRvbWljX2xvY2tmcmVlX2RlZmluZXMuaApAQCAtMCwwICsxLDYzIEBACisvLyAtKi0gQysrIC0qLSBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2F0b21pY19sb2NrZnJlZV9kZWZpbmVzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXthdG9taWN9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9BVE9NSUNfTE9DS19GUkVFX0gKKyNkZWZpbmUgX0dMSUJDWFhfQVRPTUlDX0xPQ0tfRlJFRV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisvKioKKyAqIEBhZGR0b2dyb3VwIGF0b21pY3MKKyAqIEB7CisgKi8KKworLyoqCisgKiBMb2NrLWZyZWUgcHJvcGVydHkuCisgKgorICogMCBpbmRpY2F0ZXMgdGhhdCB0aGUgdHlwZXMgYXJlIG5ldmVyIGxvY2stZnJlZS4KKyAqIDEgaW5kaWNhdGVzIHRoYXQgdGhlIHR5cGVzIGFyZSBzb21ldGltZXMgbG9jay1mcmVlLgorICogMiBpbmRpY2F0ZXMgdGhhdCB0aGUgdHlwZXMgYXJlIGFsd2F5cyBsb2NrLWZyZWUuCisgKi8KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNkZWZpbmUgQVRPTUlDX0JPT0xfTE9DS19GUkVFCQlfX0dDQ19BVE9NSUNfQk9PTF9MT0NLX0ZSRUUKKyNkZWZpbmUgQVRPTUlDX0NIQVJfTE9DS19GUkVFCQlfX0dDQ19BVE9NSUNfQ0hBUl9MT0NLX0ZSRUUKKyNkZWZpbmUgQVRPTUlDX1dDSEFSX1RfTE9DS19GUkVFCV9fR0NDX0FUT01JQ19XQ0hBUl9UX0xPQ0tfRlJFRQorI2RlZmluZSBBVE9NSUNfQ0hBUjE2X1RfTE9DS19GUkVFCV9fR0NDX0FUT01JQ19DSEFSMTZfVF9MT0NLX0ZSRUUKKyNkZWZpbmUgQVRPTUlDX0NIQVIzMl9UX0xPQ0tfRlJFRQlfX0dDQ19BVE9NSUNfQ0hBUjMyX1RfTE9DS19GUkVFCisjZGVmaW5lIEFUT01JQ19TSE9SVF9MT0NLX0ZSRUUJCV9fR0NDX0FUT01JQ19TSE9SVF9MT0NLX0ZSRUUKKyNkZWZpbmUgQVRPTUlDX0lOVF9MT0NLX0ZSRUUJCV9fR0NDX0FUT01JQ19JTlRfTE9DS19GUkVFCisjZGVmaW5lIEFUT01JQ19MT05HX0xPQ0tfRlJFRQkJX19HQ0NfQVRPTUlDX0xPTkdfTE9DS19GUkVFCisjZGVmaW5lIEFUT01JQ19MTE9OR19MT0NLX0ZSRUUJCV9fR0NDX0FUT01JQ19MTE9OR19MT0NLX0ZSRUUKKyNkZWZpbmUgQVRPTUlDX1BPSU5URVJfTE9DS19GUkVFCV9fR0NDX0FUT01JQ19QT0lOVEVSX0xPQ0tfRlJFRQorI2VuZGlmCisKKy8vIEB9IGdyb3VwIGF0b21pY3MKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYmFzaWNfaW9zLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYmFzaWNfaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyNTgwMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9iYXNpY19pb3MuaApAQCAtMCwwICsxLDQ3NyBAQAorLy8gSW9zdHJlYW1zIGJhc2UgY2xhc3NlcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9iYXNpY19pb3MuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc30KKyAqLworCisjaWZuZGVmIF9CQVNJQ19JT1NfSAorI2RlZmluZSBfQkFTSUNfSU9TX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2xvY2FsZWZ3ZC5oPgorI2luY2x1ZGUgPGJpdHMvbG9jYWxlX2NsYXNzZXMuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZV9mYWNldHMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgIGlubGluZSBjb25zdCBfRmFjZXQmCisgICAgX19jaGVja19mYWNldChjb25zdCBfRmFjZXQqIF9fZikKKyAgICB7CisgICAgICBpZiAoIV9fZikKKwlfX3Rocm93X2JhZF9jYXN0KCk7CisgICAgICByZXR1cm4gKl9fZjsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgVGVtcGxhdGUgY2xhc3MgYmFzaWNfaW9zLCB2aXJ0dWFsIGJhc2UgY2xhc3MgZm9yIGFsbAorICAgKiAgc3RyZWFtIGNsYXNzZXMuIAorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIEB0cGFyYW0gX0NoYXJUICBUeXBlIG9mIGNoYXJhY3RlciBzdHJlYW0uCisgICAqICBAdHBhcmFtIF9UcmFpdHMgIFRyYWl0cyBmb3IgY2hhcmFjdGVyIHR5cGUsIGRlZmF1bHRzIHRvCisgICAqICAgICAgICAgICAgICAgICAgIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisgICAqCisgICAqICBNb3N0IG9mIHRoZSBtZW1iZXIgZnVuY3Rpb25zIGNhbGxlZCBkaXNwYXRjaGVkIG9uIHN0cmVhbSBvYmplY3RzCisgICAqICAoZS5nLiwgQGMgc3RkOjpjb3V0LmZvbyhiYXIpOykgYXJlIGNvbnNvbGlkYXRlZCBpbiB0aGlzIGNsYXNzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgYmFzaWNfaW9zIDogcHVibGljIGlvc19iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIFRoZXNlIGFyZSBzdGFuZGFyZCB0eXBlcy4gIFRoZXkgcGVybWl0IGEgc3RhbmRhcmRpemVkIHdheSBvZgorICAgICAgICogIHJlZmVycmluZyB0byBuYW1lcyBvZiAob3IgbmFtZXMgZGVwZW5kZW50IG9uKSB0aGUgdGVtcGxhdGUKKyAgICAgICAqICBwYXJhbWV0ZXJzLCB3aGljaCBhcmUgc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uLgorICAgICAgKi8KKyAgICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSAgICAgICAgICAgICBpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgICAgICAgICAgICAgcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlICAgICAgICAgICAgIG9mZl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgVGhlc2UgYXJlIG5vbi1zdGFuZGFyZCB0eXBlcy4KKyAgICAgICovCisgICAgICB0eXBlZGVmIGN0eXBlPF9DaGFyVD4gICAgICAgICAgICAgICAgICAgICAgICAgIF9fY3R5cGVfdHlwZTsKKyAgICAgIHR5cGVkZWYgbnVtX3B1dDxfQ2hhclQsIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiA+CisJCQkJCQkgICAgIF9fbnVtX3B1dF90eXBlOworICAgICAgdHlwZWRlZiBudW1fZ2V0PF9DaGFyVCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+ID4KKwkJCQkJCSAgICAgX19udW1fZ2V0X3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vIERhdGEgbWVtYmVyczoKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qICAgICAgICAgICAgICAgIF9NX3RpZTsKKyAgICAgIG11dGFibGUgY2hhcl90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fZmlsbDsKKyAgICAgIG11dGFibGUgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fZmlsbF9pbml0OworICAgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qICAgICAgICAgICAgICBfTV9zdHJlYW1idWY7CisKKyAgICAgIC8vIENhY2hlZCB1c2VfZmFjZXQ8Y3R5cGU+LCB3aGljaCBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCBsb2NhbGUgaW5mby4KKyAgICAgIGNvbnN0IF9fY3R5cGVfdHlwZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fY3R5cGU7CisgICAgICAvLyBGb3Igb3N0cmVhbS4KKyAgICAgIGNvbnN0IF9fbnVtX3B1dF90eXBlKiAgICAgICAgICAgICAgICAgICAgICAgICAgX01fbnVtX3B1dDsKKyAgICAgIC8vIEZvciBpc3RyZWFtLgorICAgICAgY29uc3QgX19udW1fZ2V0X3R5cGUqICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9udW1fZ2V0OworCisgICAgcHVibGljOgorICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgcXVpY2stYW5kLWVhc3kgc3RhdHVzIGNoZWNrLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGFsbG93cyB5b3UgdG8gd3JpdGUgY29uc3RydWN0cyBzdWNoIGFzCisgICAgICAgKiAgPGNvZGU+aWYgKCFhX3N0cmVhbSkgLi4uPC9jb2RlPiBhbmQgPGNvZGU+d2hpbGUgKGFfc3RyZWFtKSAuLi48L2NvZGU+CisgICAgICAqLworICAgICAgb3BlcmF0b3Igdm9pZCooKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZmFpbCgpID8gMCA6IGNvbnN0X2Nhc3Q8YmFzaWNfaW9zKj4odGhpcyk7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZhaWwoKTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybnMgdGhlIGVycm9yIHN0YXRlIG9mIHRoZSBzdHJlYW0gYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gIEEgYml0IHBhdHRlcm4gKHdlbGwsIGlzbid0IGV2ZXJ5dGhpbmc/KQorICAgICAgICoKKyAgICAgICAqICBTZWUgc3RkOjppb3NfYmFzZTo6aW9zdGF0ZSBmb3IgdGhlIHBvc3NpYmxlIGJpdCB2YWx1ZXMuICBNb3N0CisgICAgICAgKiAgdXNlcnMgd2lsbCBjYWxsIG9uZSBvZiB0aGUgaW50ZXJwcmV0aW5nIHdyYXBwZXJzLCBlLmcuLCBnb29kKCkuCisgICAgICAqLworICAgICAgaW9zdGF0ZQorICAgICAgcmRzdGF0ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9zdHJlYW1idWZfc3RhdGU7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBbUmVdc2V0cyB0aGUgZXJyb3Igc3RhdGUuCisgICAgICAgKiAgQHBhcmFtICBfX3N0YXRlICBUaGUgbmV3IHN0YXRlIGZsYWcocykgdG8gc2V0LgorICAgICAgICoKKyAgICAgICAqICBTZWUgc3RkOjppb3NfYmFzZTo6aW9zdGF0ZSBmb3IgdGhlIHBvc3NpYmxlIGJpdCB2YWx1ZXMuICBNb3N0CisgICAgICAgKiAgdXNlcnMgd2lsbCBub3QgbmVlZCB0byBwYXNzIGFuIGFyZ3VtZW50LgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKGlvc3RhdGUgX19zdGF0ZSA9IGdvb2RiaXQpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldHMgYWRkaXRpb25hbCBmbGFncyBpbiB0aGUgZXJyb3Igc3RhdGUuCisgICAgICAgKiAgQHBhcmFtICBfX3N0YXRlICBUaGUgYWRkaXRpb25hbCBzdGF0ZSBmbGFnKHMpIHRvIHNldC4KKyAgICAgICAqCisgICAgICAgKiAgU2VlIHN0ZDo6aW9zX2Jhc2U6Omlvc3RhdGUgZm9yIHRoZSBwb3NzaWJsZSBiaXQgdmFsdWVzLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNldHN0YXRlKGlvc3RhdGUgX19zdGF0ZSkKKyAgICAgIHsgdGhpcy0+Y2xlYXIodGhpcy0+cmRzdGF0ZSgpIHwgX19zdGF0ZSk7IH0KKworICAgICAgLy8gRmxpcCB0aGUgaW50ZXJuYWwgc3RhdGUgb24gZm9yIHRoZSBwcm9wZXIgc3RhdGUgYml0cywgdGhlbiByZQorICAgICAgLy8gdGhyb3dzIHRoZSBwcm9wYWdhdGVkIGV4Y2VwdGlvbiBpZiBiaXQgYWxzbyBzZXQgaW4KKyAgICAgIC8vIGV4Y2VwdGlvbnMoKS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX3NldHN0YXRlKGlvc3RhdGUgX19zdGF0ZSkKKyAgICAgIHsKKwkvLyAyNy42LjEuMi4xIENvbW1vbiByZXF1aXJlbWVudHMuCisJLy8gVHVybiB0aGlzIG9uIHdpdGhvdXQgY2F1c2luZyBhbiBpb3M6OmZhaWx1cmUgdG8gYmUgdGhyb3duLgorCV9NX3N0cmVhbWJ1Zl9zdGF0ZSB8PSBfX3N0YXRlOworCWlmICh0aGlzLT5leGNlcHRpb25zKCkgJiBfX3N0YXRlKQorCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmFzdCBlcnJvciBjaGVja2luZy4KKyAgICAgICAqICBAcmV0dXJuICBUcnVlIGlmIG5vIGVycm9yIGZsYWdzIGFyZSBzZXQuCisgICAgICAgKgorICAgICAgICogIEEgd3JhcHBlciBhcm91bmQgcmRzdGF0ZS4KKyAgICAgICovCisgICAgICBib29sCisgICAgICBnb29kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJkc3RhdGUoKSA9PSAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmFzdCBlcnJvciBjaGVja2luZy4KKyAgICAgICAqICBAcmV0dXJuICBUcnVlIGlmIHRoZSBlb2ZiaXQgaXMgc2V0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgb3RoZXIgaW9zdGF0ZSBmbGFncyBtYXkgYWxzbyBiZSBzZXQuCisgICAgICAqLworICAgICAgYm9vbAorICAgICAgZW9mKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICh0aGlzLT5yZHN0YXRlKCkgJiBlb2ZiaXQpICE9IDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGYXN0IGVycm9yIGNoZWNraW5nLgorICAgICAgICogIEByZXR1cm4gIFRydWUgaWYgZWl0aGVyIHRoZSBiYWRiaXQgb3IgdGhlIGZhaWxiaXQgaXMgc2V0LgorICAgICAgICoKKyAgICAgICAqICBDaGVja2luZyB0aGUgYmFkYml0IGluIGZhaWwoKSBpcyBoaXN0b3JpY2FsIHByYWN0aWNlLgorICAgICAgICogIE5vdGUgdGhhdCBvdGhlciBpb3N0YXRlIGZsYWdzIG1heSBhbHNvIGJlIHNldC4KKyAgICAgICovCisgICAgICBib29sCisgICAgICBmYWlsKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICh0aGlzLT5yZHN0YXRlKCkgJiAoYmFkYml0IHwgZmFpbGJpdCkpICE9IDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGYXN0IGVycm9yIGNoZWNraW5nLgorICAgICAgICogIEByZXR1cm4gIFRydWUgaWYgdGhlIGJhZGJpdCBpcyBzZXQuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCBvdGhlciBpb3N0YXRlIGZsYWdzIG1heSBhbHNvIGJlIHNldC4KKyAgICAgICovCisgICAgICBib29sCisgICAgICBiYWQoKSBjb25zdAorICAgICAgeyByZXR1cm4gKHRoaXMtPnJkc3RhdGUoKSAmIGJhZGJpdCkgIT0gMDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRocm93aW5nIGV4Y2VwdGlvbnMgb24gZXJyb3JzLgorICAgICAgICogIEByZXR1cm4gIFRoZSBjdXJyZW50IGV4Y2VwdGlvbnMgbWFzay4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjaGFuZ2VzIG5vdGhpbmcgaW4gdGhlIHN0cmVhbS4gIFNlZSB0aGUgb25lLWFyZ3VtZW50IHZlcnNpb24KKyAgICAgICAqICBvZiBleGNlcHRpb25zKGlvc3RhdGUpIGZvciB0aGUgbWVhbmluZyBvZiB0aGUgcmV0dXJuIHZhbHVlLgorICAgICAgKi8KKyAgICAgIGlvc3RhdGUKKyAgICAgIGV4Y2VwdGlvbnMoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXhjZXB0aW9uOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhyb3dpbmcgZXhjZXB0aW9ucyBvbiBlcnJvcnMuCisgICAgICAgKiAgQHBhcmFtICBfX2V4Y2VwdCAgVGhlIG5ldyBleGNlcHRpb25zIG1hc2suCisgICAgICAgKgorICAgICAgICogIEJ5IGRlZmF1bHQsIGVycm9yIGZsYWdzIGFyZSBzZXQgc2lsZW50bHkuICBZb3UgY2FuIHNldCBhbgorICAgICAgICogIGV4Y2VwdGlvbnMgbWFzayBmb3IgZWFjaCBzdHJlYW07IGlmIGEgYml0IGluIHRoZSBtYXNrIGJlY29tZXMgc2V0CisgICAgICAgKiAgaW4gdGhlIGVycm9yIGZsYWdzLCB0aGVuIGFuIGV4Y2VwdGlvbiBvZiB0eXBlCisgICAgICAgKiAgc3RkOjppb3NfYmFzZTo6ZmFpbHVyZSBpcyB0aHJvd24uCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBlcnJvciBmbGFnIGlzIGFscmVhZHkgc2V0IHdoZW4gdGhlIGV4Y2VwdGlvbnMgbWFzayBpcworICAgICAgICogIGFkZGVkLCB0aGUgZXhjZXB0aW9uIGlzIGltbWVkaWF0ZWx5IHRocm93bi4gIFRyeSBydW5uaW5nIHRoZQorICAgICAgICogIGZvbGxvd2luZyB1bmRlciBHQ0MgMy4xIG9yIGxhdGVyOgorICAgICAgICogIEBjb2RlCisgICAgICAgKiAgI2luY2x1ZGUgPGlvc3RyZWFtPgorICAgICAgICogICNpbmNsdWRlIDxmc3RyZWFtPgorICAgICAgICogICNpbmNsdWRlIDxleGNlcHRpb24+CisgICAgICAgKgorICAgICAgICogIGludCBtYWluKCkKKyAgICAgICAqICB7CisgICAgICAgKiAgICAgIHN0ZDo6c2V0X3Rlcm1pbmF0ZSAoX19nbnVfY3h4OjpfX3ZlcmJvc2VfdGVybWluYXRlX2hhbmRsZXIpOworICAgICAgICoKKyAgICAgICAqICAgICAgc3RkOjppZnN0cmVhbSBmICgiL2V0Yy9tb3RkIik7CisgICAgICAgKgorICAgICAgICogICAgICBzdGQ6OmNlcnIgPDwgIlNldHRpbmcgYmFkYml0XG4iOworICAgICAgICogICAgICBmLnNldHN0YXRlIChzdGQ6Omlvc19iYXNlOjpiYWRiaXQpOworICAgICAgICoKKyAgICAgICAqICAgICAgc3RkOjpjZXJyIDw8ICJTZXR0aW5nIGV4Y2VwdGlvbiBtYXNrXG4iOworICAgICAgICogICAgICBmLmV4Y2VwdGlvbnMgKHN0ZDo6aW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICAgKiAgfQorICAgICAgICogIEBlbmRjb2RlCisgICAgICAqLworICAgICAgdm9pZAorICAgICAgZXhjZXB0aW9ucyhpb3N0YXRlIF9fZXhjZXB0KQorICAgICAgeworICAgICAgICBfTV9leGNlcHRpb24gPSBfX2V4Y2VwdDsKKyAgICAgICAgdGhpcy0+Y2xlYXIoX01fc3RyZWFtYnVmX3N0YXRlKTsKKyAgICAgIH0KKworICAgICAgLy8gQ29uc3RydWN0b3IvZGVzdHJ1Y3RvcjoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoZSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGJ5IGRlcml2ZWQgc3RyZWFtcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfaW9zKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NiKQorICAgICAgOiBpb3NfYmFzZSgpLCBfTV90aWUoMCksIF9NX2ZpbGwoKSwgX01fZmlsbF9pbml0KGZhbHNlKSwgX01fc3RyZWFtYnVmKDApLAorCV9NX2N0eXBlKDApLCBfTV9udW1fcHV0KDApLCBfTV9udW1fZ2V0KDApCisgICAgICB7IHRoaXMtPmluaXQoX19zYik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFbXB0eS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGRlc3RydWN0b3IgZG9lcyBub3RoaW5nLiAgTW9yZSBzcGVjaWZpY2FsbHksIGl0IGRvZXMgbm90CisgICAgICAgKiAgZGVzdHJveSB0aGUgc3RyZWFtYnVmIGhlbGQgYnkgcmRidWYoKS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsCisgICAgICB+YmFzaWNfaW9zKCkgeyB9CisKKyAgICAgIC8vIE1lbWJlcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZldGNoZXMgdGhlIGN1cnJlbnQgQGUgdGllZCBzdHJlYW0uCisgICAgICAgKiAgQHJldHVybiAgQSBwb2ludGVyIHRvIHRoZSB0aWVkIHN0cmVhbSwgb3IgTlVMTCBpZiB0aGUgc3RyZWFtIGlzCisgICAgICAgKiAgICAgICAgICAgbm90IHRpZWQuCisgICAgICAgKgorICAgICAgICogIEEgc3RyZWFtIG1heSBiZSBAZSB0aWVkIChvciBzeW5jaHJvbml6ZWQpIHRvIGEgc2Vjb25kIG91dHB1dAorICAgICAgICogIHN0cmVhbS4gIFdoZW4gdGhpcyBzdHJlYW0gcGVyZm9ybXMgYW55IEkvTywgdGhlIHRpZWQgc3RyZWFtIGlzCisgICAgICAgKiAgZmlyc3QgZmx1c2hlZC4gIEZvciBleGFtcGxlLCBAYyBzdGQ6OmNpbiBpcyB0aWVkIHRvIEBjIHN0ZDo6Y291dC4KKyAgICAgICovCisgICAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qCisgICAgICB0aWUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdGllOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGllcyB0aGlzIHN0cmVhbSB0byBhbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgX190aWVzdHIgIFRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91c2x5IHRpZWQgb3V0cHV0IHN0cmVhbSwgb3IgTlVMTCBpZiB0aGUgc3RyZWFtCisgICAgICAgKiAgICAgICAgICAgd2FzIG5vdCB0aWVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHNldHMgdXAgYSBuZXcgdGllOyBzZWUgdGllKCkgZm9yIG1vcmUuCisgICAgICAqLworICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KgorICAgICAgdGllKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiogX190aWVzdHIpCisgICAgICB7CisgICAgICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiogX19vbGQgPSBfTV90aWU7CisgICAgICAgIF9NX3RpZSA9IF9fdGllc3RyOworICAgICAgICByZXR1cm4gX19vbGQ7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWNjZXNzaW5nIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBzdHJlYW0gYnVmZmVyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIHN0cmVhbS4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKKyAgICAgIHJkYnVmKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3N0cmVhbWJ1ZjsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENoYW5naW5nIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fc2IgIFRoZSBuZXcgc3RyZWFtIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgcHJldmlvdXMgc3RyZWFtIGJ1ZmZlci4KKyAgICAgICAqCisgICAgICAgKiAgQXNzb2NpYXRlcyBhIG5ldyBidWZmZXIgd2l0aCB0aGUgY3VycmVudCBzdHJlYW0sIGFuZCBjbGVhcnMgdGhlCisgICAgICAgKiAgZXJyb3Igc3RhdGUuCisgICAgICAgKgorICAgICAgICogIER1ZSB0byBoaXN0b3JpY2FsIGFjY2lkZW50cyB3aGljaCB0aGUgTFdHIHJlZnVzZXMgdG8gY29ycmVjdCwgdGhlCisgICAgICAgKiAgSS9PIGxpYnJhcnkgc3VmZmVycyBmcm9tIGEgZGVzaWduIGVycm9yOiAgdGhpcyBmdW5jdGlvbiBpcyBoaWRkZW4KKyAgICAgICAqICBpbiBkZXJpdmVkIGNsYXNzZXMgYnkgb3ZlcnJpZGVzIG9mIHRoZSB6ZXJvLWFyZ3VtZW50IEBjIHJkYnVmKCksCisgICAgICAgKiAgd2hpY2ggaXMgbm9uLXZpcnR1YWwgZm9yIGh5c3RlcmljYWwgcmFpc2lucy4gIEFzIGEgcmVzdWx0LCB5b3UKKyAgICAgICAqICBtdXN0IHVzZSBleHBsaWNpdCBxdWFsaWZpY2F0aW9ucyB0byBhY2Nlc3MgdGhpcyBmdW5jdGlvbiB2aWEgYW55CisgICAgICAgKiAgZGVyaXZlZCBjbGFzcy4gIEZvciBleGFtcGxlOgorICAgICAgICoKKyAgICAgICAqICBAY29kZQorICAgICAgICogIHN0ZDo6ZnN0cmVhbSAgICAgZm9vOyAgICAgICAgIC8vIG9yIHNvbWUgb3RoZXIgZGVyaXZlZCB0eXBlCisgICAgICAgKiAgc3RkOjpzdHJlYW1idWYqICBwID0gLi4uLi47CisgICAgICAgKgorICAgICAgICogIGZvby5pb3M6OnJkYnVmKHApOyAgICAgICAgICAgIC8vIGlvcyA9PSBiYXNpY19pb3M8Y2hhcj4KKyAgICAgICAqICBAZW5kY29kZQorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KgorICAgICAgcmRidWYoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2IpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvcGllcyBmaWVsZHMgb2YgX19yaHMgaW50byB0aGlzLgorICAgICAgICogIEBwYXJhbSAgX19yaHMgIFRoZSBzb3VyY2UgdmFsdWVzIGZvciB0aGUgY29waWVzLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQWxsIGZpZWxkcyBvZiBfX3JocyBhcmUgY29waWVkIGludG8gdGhpcyBvYmplY3QgZXhjZXB0IHRoYXQgcmRidWYoKQorICAgICAgICogIGFuZCByZHN0YXRlKCkgcmVtYWluIHVuY2hhbmdlZC4gIEFsbCB2YWx1ZXMgaW4gdGhlIHB3b3JkIGFuZCBpd29yZAorICAgICAgICogIGFycmF5cyBhcmUgY29waWVkLiAgQmVmb3JlIGNvcHlpbmcsIGVhY2ggY2FsbGJhY2sgaXMgaW52b2tlZCB3aXRoCisgICAgICAgKiAgZXJhc2VfZXZlbnQuICBBZnRlciBjb3B5aW5nLCBlYWNoIChuZXcpIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aAorICAgICAgICogIGNvcHlmbXRfZXZlbnQuICBUaGUgZmluYWwgc3RlcCBpcyB0byBjb3B5IGV4Y2VwdGlvbnMoKS4KKyAgICAgICovCisgICAgICBiYXNpY19pb3MmCisgICAgICBjb3B5Zm10KGNvbnN0IGJhc2ljX2lvcyYgX19yaHMpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHJpZXZlcyB0aGUgQGEgZW1wdHkgY2hhcmFjdGVyLgorICAgICAgICogIEByZXR1cm4gIFRoZSBjdXJyZW50IGZpbGwgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBJdCBkZWZhdWx0cyB0byBhIHNwYWNlICgnICcpIGluIHRoZSBjdXJyZW50IGxvY2FsZS4KKyAgICAgICovCisgICAgICBjaGFyX3R5cGUKKyAgICAgIGZpbGwoKSBjb25zdAorICAgICAgeworCWlmICghX01fZmlsbF9pbml0KQorCSAgeworCSAgICBfTV9maWxsID0gdGhpcy0+d2lkZW4oJyAnKTsKKwkgICAgX01fZmlsbF9pbml0ID0gdHJ1ZTsKKwkgIH0KKwlyZXR1cm4gX01fZmlsbDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXRzIGEgbmV3IEBhIGVtcHR5IGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gIF9fY2ggIFRoZSBuZXcgY2hhcmFjdGVyLgorICAgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91cyBmaWxsIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGZpbGwgY2hhcmFjdGVyIGlzIHVzZWQgdG8gZmlsbCBvdXQgc3BhY2Ugd2hlbiBQKyBjaGFyYWN0ZXJzCisgICAgICAgKiAgaGF2ZSBiZWVuIHJlcXVlc3RlZCAoZS5nLiwgdmlhIHNldHcpLCBRIGNoYXJhY3RlcnMgYXJlIGFjdHVhbGx5CisgICAgICAgKiAgdXNlZCwgYW5kIFE8UC4gIEl0IGRlZmF1bHRzIHRvIGEgc3BhY2UgKCcgJykgaW4gdGhlIGN1cnJlbnQgbG9jYWxlLgorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgZmlsbChjaGFyX3R5cGUgX19jaCkKKyAgICAgIHsKKwljaGFyX3R5cGUgX19vbGQgPSB0aGlzLT5maWxsKCk7CisJX01fZmlsbCA9IF9fY2g7CisJcmV0dXJuIF9fb2xkOworICAgICAgfQorCisgICAgICAvLyBMb2NhbGVzOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNb3ZlcyB0byBhIG5ldyBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBfX2xvYyAgVGhlIG5ldyBsb2NhbGUuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIGxvY2FsZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgaW9zX2Jhc2U6OmltYnVlKGxvYyksIGFuZCBpZiBhIHN0cmVhbSBidWZmZXIgaXMgYXNzb2NpYXRlZAorICAgICAgICogIHdpdGggdGhpcyBzdHJlYW0sIGNhbGxzIHRoYXQgYnVmZmVyJ3MgQGMgcHViaW1idWUobG9jKS4KKyAgICAgICAqCisgICAgICAgKiAgQWRkaXRpb25hbCBsMTBuIG5vdGVzIGFyZSBhdAorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvbG9jYWxpemF0aW9uLmh0bWwKKyAgICAgICovCisgICAgICBsb2NhbGUKKyAgICAgIGltYnVlKGNvbnN0IGxvY2FsZSYgX19sb2MpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNxdWVlemVzIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gbmFycm93LgorICAgICAgICogIEBwYXJhbSAgX19kZmF1bHQgIFRoZSBjaGFyYWN0ZXIgdG8gbmFycm93LgorICAgICAgICogIEByZXR1cm4gIFRoZSBuYXJyb3dlZCBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIE1hcHMgYSBjaGFyYWN0ZXIgb2YgQGMgY2hhcl90eXBlIHRvIGEgY2hhcmFjdGVyIG9mIEBjIGNoYXIsCisgICAgICAgKiAgaWYgcG9zc2libGUuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgdGhlIHJlc3VsdCBvZgorICAgICAgICogIEBjb2RlCisgICAgICAgKiAgICBzdGQ6OnVzZV9mYWNldDxjdHlwZTxjaGFyX3R5cGU+ID4oZ2V0bG9jKCkpLm5hcnJvdyhjLGRmYXVsdCkKKyAgICAgICAqICBAZW5kY29kZQorICAgICAgICoKKyAgICAgICAqICBBZGRpdGlvbmFsIGwxMG4gbm90ZXMgYXJlIGF0CisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9sb2NhbGl6YXRpb24uaHRtbAorICAgICAgKi8KKyAgICAgIGNoYXIKKyAgICAgIG5hcnJvdyhjaGFyX3R5cGUgX19jLCBjaGFyIF9fZGZhdWx0KSBjb25zdAorICAgICAgeyByZXR1cm4gX19jaGVja19mYWNldChfTV9jdHlwZSkubmFycm93KF9fYywgX19kZmF1bHQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV2lkZW5zIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gd2lkZW4uCisgICAgICAgKiAgQHJldHVybiAgVGhlIHdpZGVuZWQgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBNYXBzIGEgY2hhcmFjdGVyIG9mIEBjIGNoYXIgdG8gYSBjaGFyYWN0ZXIgb2YgQGMgY2hhcl90eXBlLgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIHRoZSByZXN1bHQgb2YKKyAgICAgICAqICBAY29kZQorICAgICAgICogICAgc3RkOjp1c2VfZmFjZXQ8Y3R5cGU8Y2hhcl90eXBlPiA+KGdldGxvYygpKS53aWRlbihjKQorICAgICAgICogIEBlbmRjb2RlCisgICAgICAgKgorICAgICAgICogIEFkZGl0aW9uYWwgbDEwbiBub3RlcyBhcmUgYXQKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2xvY2FsaXphdGlvbi5odG1sCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB3aWRlbihjaGFyIF9fYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fY2hlY2tfZmFjZXQoX01fY3R5cGUpLndpZGVuKF9fYyk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIDI3LjQuNS4xICBiYXNpY19pb3MgY29uc3RydWN0b3JzCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEVtcHR5LgorICAgICAgICoKKyAgICAgICAqICBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBkb2VzIG5vdGhpbmcgYW5kIGlzIG5vdCBub3JtYWxseQorICAgICAgICogIGFjY2Vzc2libGUgdG8gdXNlcnMuCisgICAgICAqLworICAgICAgYmFzaWNfaW9zKCkKKyAgICAgIDogaW9zX2Jhc2UoKSwgX01fdGllKDApLCBfTV9maWxsKGNoYXJfdHlwZSgpKSwgX01fZmlsbF9pbml0KGZhbHNlKSwgCisJX01fc3RyZWFtYnVmKDApLCBfTV9jdHlwZSgwKSwgX01fbnVtX3B1dCgwKSwgX01fbnVtX2dldCgwKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWxsIHNldHVwIGlzIHBlcmZvcm1lZCBoZXJlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBwdWJsaWMgY29uc3RydWN0b3IuICBJdCBpcyBub3QgdmlydHVhbCBhbmQKKyAgICAgICAqICBjYW5ub3QgYmUgcmVkZWZpbmVkLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluaXQoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2IpOworCisgICAgICB2b2lkCisgICAgICBfTV9jYWNoZV9sb2NhbGUoY29uc3QgbG9jYWxlJiBfX2xvYyk7CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaW5jbHVkZSA8Yml0cy9iYXNpY19pb3MudGNjPgorCisjZW5kaWYgLyogX0JBU0lDX0lPU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYmFzaWNfaW9zLnRjYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9iYXNpY19pb3MudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNDVhNjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYmFzaWNfaW9zLnRjYwpAQCAtMCwwICsxLDE4OCBAQAorLy8gYmFzaWNfaW9zIG1lbWJlciBmdW5jdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvYmFzaWNfaW9zLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc30KKyAqLworCisjaWZuZGVmIF9CQVNJQ19JT1NfVENDCisjZGVmaW5lIF9CQVNJQ19JT1NfVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6Y2xlYXIoaW9zdGF0ZSBfX3N0YXRlKQorICAgIHsKKyAgICAgIGlmICh0aGlzLT5yZGJ1ZigpKQorCV9NX3N0cmVhbWJ1Zl9zdGF0ZSA9IF9fc3RhdGU7CisgICAgICBlbHNlCisJICBfTV9zdHJlYW1idWZfc3RhdGUgPSBfX3N0YXRlIHwgYmFkYml0OworICAgICAgaWYgKHRoaXMtPmV4Y2VwdGlvbnMoKSAmIHRoaXMtPnJkc3RhdGUoKSkKKwlfX3Rocm93X2lvc19mYWlsdXJlKF9fTigiYmFzaWNfaW9zOjpjbGVhciIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpyZGJ1ZihiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zYikKKyAgICB7CisgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19vbGQgPSBfTV9zdHJlYW1idWY7CisgICAgICBfTV9zdHJlYW1idWYgPSBfX3NiOworICAgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIHJldHVybiBfX29sZDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojpjb3B5Zm10KGNvbnN0IGJhc2ljX2lvcyYgX19yaHMpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjkyLiBlZmZlY3RzIG9mIGEuY29weWZtdCAoYSkKKyAgICAgIGlmICh0aGlzICE9ICZfX3JocykKKwl7CisJICAvLyBQZXIgMjcuMS4xLCBkbyBub3QgY2FsbCBpbWJ1ZSwgeWV0IG11c3QgdHJhc2ggYWxsIGNhY2hlcworCSAgLy8gYXNzb2NpYXRlZCB3aXRoIGltYnVlKCkKKworCSAgLy8gQWxsb2MgYW55IG5ldyB3b3JkIGFycmF5IGZpcnN0LCBzbyBpZiBpdCBmYWlscyB3ZSBoYXZlICJyb2xsYmFjayIuCisJICBfV29yZHMqIF9fd29yZHMgPSAoX19yaHMuX01fd29yZF9zaXplIDw9IF9TX2xvY2FsX3dvcmRfc2l6ZSkgPworCSAgICAgICAgICAgICAgICAgICAgIF9NX2xvY2FsX3dvcmQgOiBuZXcgX1dvcmRzW19fcmhzLl9NX3dvcmRfc2l6ZV07CisKKwkgIC8vIEJ1bXAgcmVmcyBiZWZvcmUgZG9pbmcgY2FsbGJhY2tzLCBmb3Igc2FmZXR5LgorCSAgX0NhbGxiYWNrX2xpc3QqIF9fY2IgPSBfX3Jocy5fTV9jYWxsYmFja3M7CisJICBpZiAoX19jYikKKwkgICAgX19jYi0+X01fYWRkX3JlZmVyZW5jZSgpOworCSAgX01fY2FsbF9jYWxsYmFja3MoZXJhc2VfZXZlbnQpOworCSAgaWYgKF9NX3dvcmQgIT0gX01fbG9jYWxfd29yZCkKKwkgICAgeworCSAgICAgIGRlbGV0ZSBbXSBfTV93b3JkOworCSAgICAgIF9NX3dvcmQgPSAwOworCSAgICB9CisJICBfTV9kaXNwb3NlX2NhbGxiYWNrcygpOworCisJICAvLyBOQjogRG9uJ3Qgd2FudCBhbnkgYWRkZWQgZHVyaW5nIGFib3ZlLgorCSAgX01fY2FsbGJhY2tzID0gX19jYjsKKwkgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fcmhzLl9NX3dvcmRfc2l6ZTsgKytfX2kpCisJICAgIF9fd29yZHNbX19pXSA9IF9fcmhzLl9NX3dvcmRbX19pXTsKKwkgIF9NX3dvcmQgPSBfX3dvcmRzOworCSAgX01fd29yZF9zaXplID0gX19yaHMuX01fd29yZF9zaXplOworCisJICB0aGlzLT5mbGFncyhfX3Jocy5mbGFncygpKTsKKwkgIHRoaXMtPndpZHRoKF9fcmhzLndpZHRoKCkpOworCSAgdGhpcy0+cHJlY2lzaW9uKF9fcmhzLnByZWNpc2lvbigpKTsKKwkgIHRoaXMtPnRpZShfX3Jocy50aWUoKSk7CisJICB0aGlzLT5maWxsKF9fcmhzLmZpbGwoKSk7CisJICBfTV9pb3NfbG9jYWxlID0gX19yaHMuZ2V0bG9jKCk7CisJICBfTV9jYWNoZV9sb2NhbGUoX01faW9zX2xvY2FsZSk7CisKKwkgIF9NX2NhbGxfY2FsbGJhY2tzKGNvcHlmbXRfZXZlbnQpOworCisJICAvLyBUaGUgbmV4dCBpcyByZXF1aXJlZCB0byBiZSB0aGUgbGFzdCBhc3NpZ25tZW50LgorCSAgdGhpcy0+ZXhjZXB0aW9ucyhfX3Jocy5leGNlcHRpb25zKCkpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgLy8gTG9jYWxlczoKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGxvY2FsZQorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjppbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsKKyAgICAgIGxvY2FsZSBfX29sZCh0aGlzLT5nZXRsb2MoKSk7CisgICAgICBpb3NfYmFzZTo6aW1idWUoX19sb2MpOworICAgICAgX01fY2FjaGVfbG9jYWxlKF9fbG9jKTsKKyAgICAgIGlmICh0aGlzLT5yZGJ1ZigpICE9IDApCisJdGhpcy0+cmRidWYoKS0+cHViaW1idWUoX19sb2MpOworICAgICAgcmV0dXJuIF9fb2xkOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdm9pZAorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojppbml0KGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NiKQorICAgIHsKKyAgICAgIC8vIE5COiBUaGlzIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgb2JqZWN0LgorICAgICAgaW9zX2Jhc2U6Ol9NX2luaXQoKTsKKworICAgICAgLy8gQ2FjaGUgbG9jYWxlIGRhdGEgYW5kIHNwZWNpZmljIGZhY2V0cyB1c2VkIGJ5IGlvc3RyZWFtcy4KKyAgICAgIF9NX2NhY2hlX2xvY2FsZShfTV9pb3NfbG9jYWxlKTsKKworICAgICAgLy8gTkI6IFRoZSAyNy40LjQuMSBQb3N0Y29uZGl0aW9ucyBUYWJsZSBzcGVjaWZpZXMgcmVxdWlyZW1lbnRzCisgICAgICAvLyBhZnRlciBiYXNpY19pb3M6OmluaXQoKSBoYXMgYmVlbiBjYWxsZWQuIEFzIHBhcnQgb2YgdGhpcywKKyAgICAgIC8vIGZpbGwoKSBtdXN0IHJldHVybiB3aWRlbignICcpIGFueSB0aW1lIGFmdGVyIGluaXQoKSBoYXMgYmVlbgorICAgICAgLy8gY2FsbGVkLCB3aGljaCBuZWVkcyBhbiBpbWJ1ZWQgY3R5cGUgZmFjZXQgb2YgY2hhcl90eXBlIHRvCisgICAgICAvLyByZXR1cm4gd2l0aG91dCB0aHJvd2luZyBhbiBleGNlcHRpb24uIFVuZm9ydHVuYXRlbHksCisgICAgICAvLyBjdHlwZTxjaGFyX3R5cGU+IGlzIG5vdCBuZWNlc3NhcmlseSBhIHJlcXVpcmVkIGZhY2V0LCBzbworICAgICAgLy8gc3RyZWFtcyB3aXRoIGNoYXJfdHlwZSAhPSBbY2hhciwgd2NoYXJfdF0gd2lsbCBub3QgaGF2ZSBpdCBieQorICAgICAgLy8gZGVmYXVsdC4gQmVjYXVzZSBvZiB0aGlzLCB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgX01fZmlsbCBpcworICAgICAgLy8gY29uc3RydWN0ZWQgb24gdGhlIGZpcnN0IGNhbGwgb2YgZmlsbCgpLiBUaGF0IHdheSwKKyAgICAgIC8vIHVuZm9ybWF0dGVkIGlucHV0IGFuZCBvdXRwdXQgd2l0aCBub24tcmVxdWlyZWQgYmFzaWNfaW9zCisgICAgICAvLyBpbnN0YW50aWF0aW9ucyBpcyBwb3NzaWJsZSBldmVuIHdpdGhvdXQgaW1idWluZyB0aGUgZXhwZWN0ZWQKKyAgICAgIC8vIGN0eXBlPGNoYXJfdHlwZT4gZmFjZXQuCisgICAgICBfTV9maWxsID0gX0NoYXJUKCk7CisgICAgICBfTV9maWxsX2luaXQgPSBmYWxzZTsKKworICAgICAgX01fdGllID0gMDsKKyAgICAgIF9NX2V4Y2VwdGlvbiA9IGdvb2RiaXQ7CisgICAgICBfTV9zdHJlYW1idWYgPSBfX3NiOworICAgICAgX01fc3RyZWFtYnVmX3N0YXRlID0gX19zYiA/IGdvb2RiaXQgOiBiYWRiaXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46Ol9NX2NhY2hlX2xvY2FsZShjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGhhc19mYWNldDxfX2N0eXBlX3R5cGU+KF9fbG9jKSwgdHJ1ZSkpCisJX01fY3R5cGUgPSAmdXNlX2ZhY2V0PF9fY3R5cGVfdHlwZT4oX19sb2MpOworICAgICAgZWxzZQorCV9NX2N0eXBlID0gMDsKKworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoaGFzX2ZhY2V0PF9fbnVtX3B1dF90eXBlPihfX2xvYyksIHRydWUpKQorCV9NX251bV9wdXQgPSAmdXNlX2ZhY2V0PF9fbnVtX3B1dF90eXBlPihfX2xvYyk7CisgICAgICBlbHNlCisJX01fbnVtX3B1dCA9IDA7CisKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGhhc19mYWNldDxfX251bV9nZXRfdHlwZT4oX19sb2MpLCB0cnVlKSkKKwlfTV9udW1fZ2V0ID0gJnVzZV9mYWNldDxfX251bV9nZXRfdHlwZT4oX19sb2MpOworICAgICAgZWxzZQorCV9NX251bV9nZXQgPSAwOworICAgIH0KKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX2lvczxjaGFyPjsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19pb3M8d2NoYXJfdD47CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9iYXNpY19zdHJpbmcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9iYXNpY19zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2JkOWI5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2Jhc2ljX3N0cmluZy5oCkBAIC0wLDAgKzEsMzExMSBAQAorLy8gQ29tcG9uZW50cyBmb3IgbWFuaXB1bGF0aW5nIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2Jhc2ljX3N0cmluZy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3RyaW5nfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMSBTdHJpbmdzIGxpYnJhcnkKKy8vCisKKyNpZm5kZWYgX0JBU0lDX1NUUklOR19ICisjZGVmaW5lIF9CQVNJQ19TVFJJTkdfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGV4dC9hdG9taWNpdHkuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBjbGFzcyBiYXNpY19zdHJpbmcgYmFzaWNfc3RyaW5nLmggPHN0cmluZz4KKyAgICogIEBicmllZiAgTWFuYWdpbmcgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgYW5kIGNoYXJhY3Rlci1saWtlIG9iamVjdHMuCisgICAqCisgICAqICBAaW5ncm91cCBzdHJpbmdzCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIEB0cGFyYW0gX0NoYXJUICBUeXBlIG9mIGNoYXJhY3RlcgorICAgKiAgQHRwYXJhbSBfVHJhaXRzICBUcmFpdHMgZm9yIGNoYXJhY3RlciB0eXBlLCBkZWZhdWx0cyB0bworICAgKiAgICAgICAgICAgICAgICAgICBjaGFyX3RyYWl0czxfQ2hhclQ+LgorICAgKiAgQHRwYXJhbSBfQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8X0NoYXJUPi4KKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjYiPnJldmVyc2libGUgY29udGFpbmVyPC9hPiwgYW5kIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY3Ij5zZXF1ZW5jZTwvYT4uICBPZiB0aGUKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY4Ij5vcHRpb25hbCBzZXF1ZW5jZSByZXF1aXJlbWVudHM8L2E+LCBvbmx5CisgICAqICBAYyBwdXNoX2JhY2ssIEBjIGF0LCBhbmQgQGMgJWFycmF5IGFjY2VzcyBhcmUgc3VwcG9ydGVkLgorICAgKgorICAgKiAgQGRvY3RvZG8KKyAgICoKKyAgICoKKyAgICogIERvY3VtZW50YXRpb24/ICBXaGF0J3MgdGhhdD8KKyAgICogIE5hdGhhbiBNeWVycyA8bmNtQGNhbnRyaXAub3JnPi4KKyAgICoKKyAgICogIEEgc3RyaW5nIGxvb2tzIGxpa2UgdGhpczoKKyAgICoKKyAgICogIEBjb2RlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtfUmVwXQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9sZW5ndGgKKyAgICogICBbYmFzaWNfc3RyaW5nPGNoYXJfdHlwZT5dICAgICAgICAgICAgX01fY2FwYWNpdHkKKyAgICogICBfTV9kYXRhcGx1cyAgICAgICAgICAgICAgICAgICAgICAgICAgX01fcmVmY291bnQKKyAgICogICBfTV9wIC0tLS0tLS0tLS0tLS0tLS0+ICAgICAgICAgICAgICAgdW5uYW1lZCBhcnJheSBvZiBjaGFyX3R5cGUKKyAgICogIEBlbmRjb2RlCisgICAqCisgICAqICBXaGVyZSB0aGUgX01fcCBwb2ludHMgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLCBhbmQKKyAgICogIHlvdSBjYXN0IGl0IHRvIGEgcG9pbnRlci10by1fUmVwIGFuZCBzdWJ0cmFjdCAxIHRvIGdldCBhCisgICAqICBwb2ludGVyIHRvIHRoZSBoZWFkZXIuCisgICAqCisgICAqICBUaGlzIGFwcHJvYWNoIGhhcyB0aGUgZW5vcm1vdXMgYWR2YW50YWdlIHRoYXQgYSBzdHJpbmcgb2JqZWN0CisgICAqICByZXF1aXJlcyBvbmx5IG9uZSBhbGxvY2F0aW9uLiAgQWxsIHRoZSB1Z2xpbmVzcyBpcyBjb25maW5lZAorICAgKiAgd2l0aGluIGEgc2luZ2xlICVwYWlyIG9mIGlubGluZSBmdW5jdGlvbnMsIHdoaWNoIGVhY2ggY29tcGlsZSB0bworICAgKiAgYSBzaW5nbGUgQGEgYWRkIGluc3RydWN0aW9uOiBfUmVwOjpfTV9kYXRhKCksIGFuZAorICAgKiAgc3RyaW5nOjpfTV9yZXAoKTsgYW5kIHRoZSBhbGxvY2F0aW9uIGZ1bmN0aW9uIHdoaWNoIGdldHMgYQorICAgKiAgYmxvY2sgb2YgcmF3IGJ5dGVzIGFuZCB3aXRoIHJvb20gZW5vdWdoIGFuZCBjb25zdHJ1Y3RzIGEgX1JlcAorICAgKiAgb2JqZWN0IGF0IHRoZSBmcm9udC4KKyAgICoKKyAgICogIFRoZSByZWFzb24geW91IHdhbnQgX01fZGF0YSBwb2ludGluZyB0byB0aGUgY2hhcmFjdGVyICVhcnJheSBhbmQKKyAgICogIG5vdCB0aGUgX1JlcCBpcyBzbyB0aGF0IHRoZSBkZWJ1Z2dlciBjYW4gc2VlIHRoZSBzdHJpbmcKKyAgICogIGNvbnRlbnRzLiAoUHJvYmFibHkgd2Ugc2hvdWxkIGFkZCBhIG5vbi1pbmxpbmUgbWVtYmVyIHRvIGdldAorICAgKiAgdGhlIF9SZXAgZm9yIHRoZSBkZWJ1Z2dlciB0byB1c2UsIHNvIHVzZXJzIGNhbiBjaGVjayB0aGUgYWN0dWFsCisgICAqICBzdHJpbmcgbGVuZ3RoLikKKyAgICoKKyAgICogIE5vdGUgdGhhdCB0aGUgX1JlcCBvYmplY3QgaXMgYSBQT0Qgc28gdGhhdCB5b3UgY2FuIGhhdmUgYQorICAgKiAgc3RhdGljIDxlbT5lbXB0eSBzdHJpbmc8L2VtPiBfUmVwIG9iamVjdCBhbHJlYWR5IEBhIGNvbnN0cnVjdGVkIGJlZm9yZQorICAgKiAgc3RhdGljIGNvbnN0cnVjdG9ycyBoYXZlIHJ1bi4gIFRoZSByZWZlcmVuY2UtY291bnQgZW5jb2RpbmcgaXMKKyAgICogIGNob3NlbiBzbyB0aGF0IGEgMCBpbmRpY2F0ZXMgb25lIHJlZmVyZW5jZSwgc28geW91IG5ldmVyIHRyeSB0bworICAgKiAgZGVzdHJveSB0aGUgZW1wdHktc3RyaW5nIF9SZXAgb2JqZWN0LgorICAgKgorICAgKiAgQWxsIGJ1dCB0aGUgbGFzdCBwYXJhZ3JhcGggaXMgY29uc2lkZXJlZCBwcmV0dHkgY29udmVudGlvbmFsCisgICAqICBmb3IgYSBDKysgc3RyaW5nIGltcGxlbWVudGF0aW9uLgorICAqLworICAvLyAyMS4zICBUZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmcKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYmFzaWNfc3RyaW5nCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfQ2hhclQ+OjpvdGhlciBfQ2hhclRfYWxsb2NfdHlwZTsKKworICAgICAgLy8gVHlwZXM6CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHJhaXRzCQkJCQkgICAgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYwkJCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6c2l6ZV90eXBlCSAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpkaWZmZXJlbmNlX3R5cGUgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpyZWZlcmVuY2UJICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OnBvaW50ZXIJICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpjb25zdF9wb2ludGVyCSAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fbm9ybWFsX2l0ZXJhdG9yPHBvaW50ZXIsIGJhc2ljX3N0cmluZz4gIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fbm9ybWFsX2l0ZXJhdG9yPGNvbnN0X3BvaW50ZXIsIGJhc2ljX3N0cmluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+CWNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4JCSAgICByZXZlcnNlX2l0ZXJhdG9yOworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIF9SZXA6IHN0cmluZyByZXByZXNlbnRhdGlvbgorICAgICAgLy8gICBJbnZhcmlhbnRzOgorICAgICAgLy8gICAxLiBTdHJpbmcgcmVhbGx5IGNvbnRhaW5zIF9NX2xlbmd0aCArIDEgY2hhcmFjdGVyczogZHVlIHRvIDIxLjMuNAorICAgICAgLy8gICAgICBtdXN0IGJlIGtlcHQgbnVsbC10ZXJtaW5hdGVkLgorICAgICAgLy8gICAyLiBfTV9jYXBhY2l0eSA+PSBfTV9sZW5ndGgKKyAgICAgIC8vICAgICAgQWxsb2NhdGVkIG1lbW9yeSBpcyBhbHdheXMgKF9NX2NhcGFjaXR5ICsgMSkgKiBzaXplb2YoX0NoYXJUKS4KKyAgICAgIC8vICAgMy4gX01fcmVmY291bnQgaGFzIHRocmVlIHN0YXRlczoKKyAgICAgIC8vICAgICAgLTE6IGxlYWtlZCwgb25lIHJlZmVyZW5jZSwgbm8gcmVmLWNvcGllcyBhbGxvd2VkLCBub24tY29uc3QuCisgICAgICAvLyAgICAgICAwOiBvbmUgcmVmZXJlbmNlLCBub24tY29uc3QuCisgICAgICAvLyAgICAgbj4wOiBuICsgMSByZWZlcmVuY2VzLCBvcGVyYXRpb25zIHJlcXVpcmUgYSBsb2NrLCBjb25zdC4KKyAgICAgIC8vICAgNC4gQWxsIGZpZWxkcz09MCBpcyBhbiBlbXB0eSBzdHJpbmcsIGdpdmVuIHRoZSBleHRyYSBzdG9yYWdlCisgICAgICAvLyAgICAgIGJleW9uZC10aGUtZW5kIGZvciBhIG51bGwgdGVybWluYXRvcjsgdGh1cywgdGhlIHNoYXJlZAorICAgICAgLy8gICAgICBlbXB0eSBzdHJpbmcgcmVwcmVzZW50YXRpb24gbmVlZHMgbm8gY29uc3RydWN0b3IuCisKKyAgICAgIHN0cnVjdCBfUmVwX2Jhc2UKKyAgICAgIHsKKwlzaXplX3R5cGUJCV9NX2xlbmd0aDsKKwlzaXplX3R5cGUJCV9NX2NhcGFjaXR5OworCV9BdG9taWNfd29yZAkJX01fcmVmY291bnQ7CisgICAgICB9OworCisgICAgICBzdHJ1Y3QgX1JlcCA6IF9SZXBfYmFzZQorICAgICAgeworCS8vIFR5cGVzOgorCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8Y2hhcj46Om90aGVyIF9SYXdfYnl0ZXNfYWxsb2M7CisKKwkvLyAoUHVibGljKSBEYXRhIG1lbWJlcnM6CisKKwkvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5kaXZpZHVhbCBjaGFyX3R5cGUgZWxlbWVudHMgb2YgYW4KKwkvLyBpbmRpdmlkdWFsIHN0cmluZyBpcyBkZXRlcm1pbmVkIGJ5IF9TX21heF9zaXplLiBUaGlzIGlzIHRoZQorCS8vIHZhbHVlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSBtYXhfc2l6ZSgpLiAgKFdoZXJlYXMgbnBvcworCS8vIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGUgYWxsb2NhdG9yIGNhbiBhbGxvY2F0ZS4pCisJLy8gSWYgb25lIHdhcyB0byBkaXZ2eSB1cCB0aGUgdGhlb3JldGljYWwgbGFyZ2VzdCBzaXplIHN0cmluZywKKwkvLyB3aXRoIGEgdGVybWluYXRpbmcgY2hhcmFjdGVyIGFuZCBtIF9DaGFyVCBlbGVtZW50cywgaXQnZAorCS8vIGxvb2sgbGlrZSB0aGlzOgorCS8vIG5wb3MgPSBzaXplb2YoX1JlcCkgKyAobSAqIHNpemVvZihfQ2hhclQpKSArIHNpemVvZihfQ2hhclQpCisJLy8gU29sdmluZyBmb3IgbToKKwkvLyBtID0gKChucG9zIC0gc2l6ZW9mKF9SZXApKS9zaXplb2YoQ2hhclQpKSAtIDEKKwkvLyBJbiBhZGRpdGlvbiwgdGhpcyBpbXBsZW1lbnRhdGlvbiBxdWFydGVycyB0aGlzIGFtb3VudC4KKwlzdGF0aWMgY29uc3Qgc2l6ZV90eXBlCV9TX21heF9zaXplOworCXN0YXRpYyBjb25zdCBfQ2hhclQJX1NfdGVybWluYWw7CisKKwkvLyBUaGUgZm9sbG93aW5nIHN0b3JhZ2UgaXMgaW5pdCdkIHRvIDAgYnkgdGhlIGxpbmtlciwgcmVzdWx0aW5nCisgICAgICAgIC8vIChjYXJlZnVsbHkpIGluIGFuIGVtcHR5IHN0cmluZyB3aXRoIG9uZSByZWZlcmVuY2UuCisgICAgICAgIHN0YXRpYyBzaXplX3R5cGUgX1NfZW1wdHlfcmVwX3N0b3JhZ2VbXTsKKworICAgICAgICBzdGF0aWMgX1JlcCYKKyAgICAgICAgX1NfZW1wdHlfcmVwKCkKKyAgICAgICAgeyAKKwkgIC8vIE5COiBNaWxkIGhhY2sgdG8gYXZvaWQgc3RyaWN0LWFsaWFzaW5nIHdhcm5pbmdzLiAgTm90ZSB0aGF0CisJICAvLyBfU19lbXB0eV9yZXBfc3RvcmFnZSBpcyBuZXZlciBtb2RpZmllZCBhbmQgdGhlIHB1bm5pbmcgc2hvdWxkCisJICAvLyBiZSByZWFzb25hYmx5IHNhZmUgaW4gdGhpcyBjYXNlLgorCSAgdm9pZCogX19wID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oJl9TX2VtcHR5X3JlcF9zdG9yYWdlKTsKKwkgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxfUmVwKj4oX19wKTsKKwl9CisKKyAgICAgICAgYm9vbAorCV9NX2lzX2xlYWtlZCgpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX3JlZmNvdW50IDwgMDsgfQorCisgICAgICAgIGJvb2wKKwlfTV9pc19zaGFyZWQoKSBjb25zdAorICAgICAgICB7IHJldHVybiB0aGlzLT5fTV9yZWZjb3VudCA+IDA7IH0KKworICAgICAgICB2b2lkCisJX01fc2V0X2xlYWtlZCgpCisgICAgICAgIHsgdGhpcy0+X01fcmVmY291bnQgPSAtMTsgfQorCisgICAgICAgIHZvaWQKKwlfTV9zZXRfc2hhcmFibGUoKQorICAgICAgICB7IHRoaXMtPl9NX3JlZmNvdW50ID0gMDsgfQorCisJdm9pZAorCV9NX3NldF9sZW5ndGhfYW5kX3NoYXJhYmxlKHNpemVfdHlwZSBfX24pCisJeworI2lmIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HID09IDAKKwkgIGlmIChfX2J1aWx0aW5fZXhwZWN0KHRoaXMgIT0gJl9TX2VtcHR5X3JlcCgpLCBmYWxzZSkpCisjZW5kaWYKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldF9zaGFyYWJsZSgpOyAgLy8gT25lIHJlZmVyZW5jZS4KKwkgICAgICB0aGlzLT5fTV9sZW5ndGggPSBfX247CisJICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbih0aGlzLT5fTV9yZWZkYXRhKClbX19uXSwgX1NfdGVybWluYWwpOworCSAgICAgIC8vIGdycnIuIChwZXIgMjEuMy40KQorCSAgICAgIC8vIFlvdSBjYW5ub3QgbGVhdmUgdGhvc2UgTFdHIHBlb3BsZSBhbG9uZSBmb3IgYSBzZWNvbmQuCisJICAgIH0KKwl9CisKKwlfQ2hhclQqCisJX01fcmVmZGF0YSgpIHRocm93KCkKKwl7IHJldHVybiByZWludGVycHJldF9jYXN0PF9DaGFyVCo+KHRoaXMgKyAxKTsgfQorCisJX0NoYXJUKgorCV9NX2dyYWIoY29uc3QgX0FsbG9jJiBfX2FsbG9jMSwgY29uc3QgX0FsbG9jJiBfX2FsbG9jMikKKwl7CisJICByZXR1cm4gKCFfTV9pc19sZWFrZWQoKSAmJiBfX2FsbG9jMSA9PSBfX2FsbG9jMikKKwkgICAgICAgICAgPyBfTV9yZWZjb3B5KCkgOiBfTV9jbG9uZShfX2FsbG9jMSk7CisJfQorCisJLy8gQ3JlYXRlICYgRGVzdHJveQorCXN0YXRpYyBfUmVwKgorCV9TX2NyZWF0ZShzaXplX3R5cGUsIHNpemVfdHlwZSwgY29uc3QgX0FsbG9jJik7CisKKwl2b2lkCisJX01fZGlzcG9zZShjb25zdCBfQWxsb2MmIF9fYSkKKwl7CisjaWYgX0dMSUJDWFhfRlVMTFlfRFlOQU1JQ19TVFJJTkcgPT0gMAorCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QodGhpcyAhPSAmX1NfZW1wdHlfcmVwKCksIGZhbHNlKSkKKyNlbmRpZgorCSAgICB7CisJICAgICAgLy8gQmUgcmFjZS1kZXRlY3Rvci1mcmllbmRseS4gIEZvciBtb3JlIGluZm8gc2VlIGJpdHMvYysrY29uZmlnLgorCSAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmdGhpcy0+X01fcmVmY291bnQpOworCSAgICAgIGlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmdGhpcy0+X01fcmVmY291bnQsCisJCQkJCQkJIC0xKSA8PSAwKQorCQl7CisJCSAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoJnRoaXMtPl9NX3JlZmNvdW50KTsKKwkJICBfTV9kZXN0cm95KF9fYSk7CisJCX0KKwkgICAgfQorCX0gIC8vIFhYWCBNVAorCisJdm9pZAorCV9NX2Rlc3Ryb3koY29uc3QgX0FsbG9jJikgdGhyb3coKTsKKworCV9DaGFyVCoKKwlfTV9yZWZjb3B5KCkgdGhyb3coKQorCXsKKyNpZiBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORyA9PSAwCisJICBpZiAoX19idWlsdGluX2V4cGVjdCh0aGlzICE9ICZfU19lbXB0eV9yZXAoKSwgZmFsc2UpKQorI2VuZGlmCisgICAgICAgICAgICBfX2dudV9jeHg6Ol9fYXRvbWljX2FkZF9kaXNwYXRjaCgmdGhpcy0+X01fcmVmY291bnQsIDEpOworCSAgcmV0dXJuIF9NX3JlZmRhdGEoKTsKKwl9ICAvLyBYWFggTVQKKworCV9DaGFyVCoKKwlfTV9jbG9uZShjb25zdCBfQWxsb2MmLCBzaXplX3R5cGUgX19yZXMgPSAwKTsKKyAgICAgIH07CisKKyAgICAgIC8vIFVzZSBlbXB0eS1iYXNlIG9wdGltaXphdGlvbjogaHR0cDovL3d3dy5jYW50cmlwLm9yZy9lbXB0eW9wdC5odG1sCisgICAgICBzdHJ1Y3QgX0FsbG9jX2hpZGVyIDogX0FsbG9jCisgICAgICB7CisJX0FsbG9jX2hpZGVyKF9DaGFyVCogX19kYXQsIGNvbnN0IF9BbGxvYyYgX19hKQorCTogX0FsbG9jKF9fYSksIF9NX3AoX19kYXQpIHsgfQorCisJX0NoYXJUKiBfTV9wOyAvLyBUaGUgYWN0dWFsIGRhdGEuCisgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgLy8gRGF0YSBNZW1iZXJzIChwdWJsaWMpOgorICAgICAgLy8gTkI6IFRoaXMgaXMgYW4gdW5zaWduZWQgdHlwZSwgYW5kIHRodXMgcmVwcmVzZW50cyB0aGUgbWF4aW11bQorICAgICAgLy8gc2l6ZSB0aGF0IHRoZSBhbGxvY2F0b3IgY2FuIGhvbGQuCisgICAgICAvLy8gIFZhbHVlIHJldHVybmVkIGJ5IHZhcmlvdXMgbWVtYmVyIGZ1bmN0aW9ucyB3aGVuIHRoZXkgZmFpbC4KKyAgICAgIHN0YXRpYyBjb25zdCBzaXplX3R5cGUJbnBvcyA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpOworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIERhdGEgTWVtYmVycyAocHJpdmF0ZSk6CisgICAgICBtdXRhYmxlIF9BbGxvY19oaWRlcglfTV9kYXRhcGx1czsKKworICAgICAgX0NoYXJUKgorICAgICAgX01fZGF0YSgpIGNvbnN0CisgICAgICB7IHJldHVybiAgX01fZGF0YXBsdXMuX01fcDsgfQorCisgICAgICBfQ2hhclQqCisgICAgICBfTV9kYXRhKF9DaGFyVCogX19wKQorICAgICAgeyByZXR1cm4gKF9NX2RhdGFwbHVzLl9NX3AgPSBfX3ApOyB9CisKKyAgICAgIF9SZXAqCisgICAgICBfTV9yZXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gJigocmVpbnRlcnByZXRfY2FzdDxfUmVwKj4gKF9NX2RhdGEoKSkpWy0xXSk7IH0KKworICAgICAgLy8gRm9yIHRoZSBpbnRlcm5hbCB1c2Ugd2UgaGF2ZSBmdW5jdGlvbnMgc2ltaWxhciB0byBgYmVnaW4nL2BlbmQnCisgICAgICAvLyBidXQgdGhleSBkbyBub3QgY2FsbCBfTV9sZWFrLgorICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2liZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihfTV9kYXRhKCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fbGVhaygpICAgIC8vIGZvciB1c2UgaW4gYmVnaW4oKSAmIG5vbi1jb25zdCBvcFtdCisgICAgICB7CisJaWYgKCFfTV9yZXAoKS0+X01faXNfbGVha2VkKCkpCisJICBfTV9sZWFrX2hhcmQoKTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9jaGVjayhzaXplX3R5cGUgX19wb3MsIGNvbnN0IGNoYXIqIF9fcykgY29uc3QKKyAgICAgIHsKKwlpZiAoX19wb3MgPiB0aGlzLT5zaXplKCkpCisJICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oX19zKSk7CisJcmV0dXJuIF9fcG9zOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jaGVja19sZW5ndGgoc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yLCBjb25zdCBjaGFyKiBfX3MpIGNvbnN0CisgICAgICB7CisJaWYgKHRoaXMtPm1heF9zaXplKCkgLSAodGhpcy0+c2l6ZSgpIC0gX19uMSkgPCBfX24yKQorCSAgX190aHJvd19sZW5ndGhfZXJyb3IoX19OKF9fcykpOworICAgICAgfQorCisgICAgICAvLyBOQjogX01fbGltaXQgZG9lc24ndCBjaGVjayBmb3IgYSBiYWQgX19wb3MgdmFsdWUuCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2xpbWl0KHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fb2ZmKSBjb25zdAorICAgICAgeworCWNvbnN0IGJvb2wgX190ZXN0b2ZmID0gIF9fb2ZmIDwgdGhpcy0+c2l6ZSgpIC0gX19wb3M7CisJcmV0dXJuIF9fdGVzdG9mZiA/IF9fb2ZmIDogdGhpcy0+c2l6ZSgpIC0gX19wb3M7CisgICAgICB9CisKKyAgICAgIC8vIFRydWUgaWYgX1JlcCBhbmQgc291cmNlIGRvIG5vdCBvdmVybGFwLgorICAgICAgYm9vbAorICAgICAgX01fZGlzanVuY3QoY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIChsZXNzPGNvbnN0IF9DaGFyVCo+KCkoX19zLCBfTV9kYXRhKCkpCisJCXx8IGxlc3M8Y29uc3QgX0NoYXJUKj4oKShfTV9kYXRhKCkgKyB0aGlzLT5zaXplKCksIF9fcykpOworICAgICAgfQorCisgICAgICAvLyBXaGVuIF9fbiA9IDEgd2F5IGZhc3RlciB0aGFuIHRoZSBnZW5lcmFsIG11bHRpY2hhcgorICAgICAgLy8gdHJhaXRzX3R5cGU6OmNvcHkvbW92ZS9hc3NpZ24uCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX01fY29weShfQ2hhclQqIF9fZCwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fbiA9PSAxKQorCSAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19kLCAqX19zKTsKKwllbHNlCisJICB0cmFpdHNfdHlwZTo6Y29weShfX2QsIF9fcywgX19uKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9NX21vdmUoX0NoYXJUKiBfX2QsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgICAgeworCWlmIChfX24gPT0gMSkKKwkgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fZCwgKl9fcyk7CisJZWxzZQorCSAgdHJhaXRzX3R5cGU6Om1vdmUoX19kLCBfX3MsIF9fbik7CSAgCisgICAgICB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfTV9hc3NpZ24oX0NoYXJUKiBfX2QsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7CisJaWYgKF9fbiA9PSAxKQorCSAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19kLCBfX2MpOworCWVsc2UKKwkgIHRyYWl0c190eXBlOjphc3NpZ24oX19kLCBfX24sIF9fYyk7CSAgCisgICAgICB9CisKKyAgICAgIC8vIF9TX2NvcHlfY2hhcnMgaXMgYSBzZXBhcmF0ZSB0ZW1wbGF0ZSB0byBwZXJtaXQgc3BlY2lhbGl6YXRpb24KKyAgICAgIC8vIHRvIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgcG9pbnRlcnMgYXMgaXRlcmF0b3JzLgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0l0ZXJhdG9yPgorICAgICAgICBzdGF0aWMgdm9pZAorICAgICAgICBfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBfSXRlcmF0b3IgX19rMSwgX0l0ZXJhdG9yIF9fazIpCisgICAgICAgIHsKKwkgIGZvciAoOyBfX2sxICE9IF9fazI7ICsrX19rMSwgKytfX3ApCisJICAgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fcCwgKl9fazEpOyAvLyBUaGVzZSB0eXBlcyBhcmUgb2ZmLgorCX0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2NvcHlfY2hhcnMoX0NoYXJUKiBfX3AsIGl0ZXJhdG9yIF9fazEsIGl0ZXJhdG9yIF9fazIpCisgICAgICB7IF9TX2NvcHlfY2hhcnMoX19wLCBfX2sxLmJhc2UoKSwgX19rMi5iYXNlKCkpOyB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBjb25zdF9pdGVyYXRvciBfX2sxLCBjb25zdF9pdGVyYXRvciBfX2syKQorICAgICAgeyBfU19jb3B5X2NoYXJzKF9fcCwgX19rMS5iYXNlKCksIF9fazIuYmFzZSgpKTsgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfY29weV9jaGFycyhfQ2hhclQqIF9fcCwgX0NoYXJUKiBfX2sxLCBfQ2hhclQqIF9fazIpCisgICAgICB7IF9NX2NvcHkoX19wLCBfX2sxLCBfX2syIC0gX19rMSk7IH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2NvcHlfY2hhcnMoX0NoYXJUKiBfX3AsIGNvbnN0IF9DaGFyVCogX19rMSwgY29uc3QgX0NoYXJUKiBfX2syKQorICAgICAgeyBfTV9jb3B5KF9fcCwgX19rMSwgX19rMiAtIF9fazEpOyB9CisKKyAgICAgIHN0YXRpYyBpbnQKKyAgICAgIF9TX2NvbXBhcmUoc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yKQorICAgICAgeworCWNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2QgPSBkaWZmZXJlbmNlX3R5cGUoX19uMSAtIF9fbjIpOworCisJaWYgKF9fZCA+IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21heCkKKwkgIHJldHVybiBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8aW50Pjo6X19tYXg7CisJZWxzZSBpZiAoX19kIDwgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGludD46Ol9fbWluKQorCSAgcmV0dXJuIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21pbjsKKwllbHNlCisJICByZXR1cm4gaW50KF9fZCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX211dGF0ZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX2xlbjEsIHNpemVfdHlwZSBfX2xlbjIpOworCisgICAgICB2b2lkCisgICAgICBfTV9sZWFrX2hhcmQoKTsKKworICAgICAgc3RhdGljIF9SZXAmCisgICAgICBfU19lbXB0eV9yZXAoKQorICAgICAgeyByZXR1cm4gX1JlcDo6X1NfZW1wdHlfcmVwKCk7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICAvLyBOQjogV2Ugb3ZlcmxvYWQgY3RvcnMgaW4gc29tZSBjYXNlcyBpbnN0ZWFkIG9mIHVzaW5nIGRlZmF1bHQKKyAgICAgIC8vIGFyZ3VtZW50cywgcGVyIDE3LjQuNC40IHBhcmEuIDIgaXRlbSAyLgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZygpCisjaWYgX0dMSUJDWFhfRlVMTFlfRFlOQU1JQ19TVFJJTkcgPT0gMAorICAgICAgOiBfTV9kYXRhcGx1cyhfU19lbXB0eV9yZXAoKS5fTV9yZWZkYXRhKCksIF9BbGxvYygpKSB7IH0KKyNlbHNlCisgICAgICA6IF9NX2RhdGFwbHVzKF9TX2NvbnN0cnVjdChzaXplX3R5cGUoKSwgX0NoYXJUKCksIF9BbGxvYygpKSwgX0FsbG9jKCkpeyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYW4gZW1wdHkgc3RyaW5nIHVzaW5nIGFsbG9jYXRvciBAYSBhLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfc3RyaW5nKGNvbnN0IF9BbGxvYyYgX19hKTsKKworICAgICAgLy8gTkI6IHBlciBMV0cgaXNzdWUgNDIsIHNlbWFudGljcyBkaWZmZXJlbnQgZnJvbSBJUzoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyB3aXRoIGNvcHkgb2YgdmFsdWUgb2YgQGEgc3RyLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIFNvdXJjZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKTsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBhcyBjb3B5IG9mIGEgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIFNvdXJjZSBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIGNvcHkgZnJvbS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29weSAoZGVmYXVsdCByZW1haW5kZXIpLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLAorCQkgICBzaXplX3R5cGUgX19uID0gbnBvcyk7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgYXMgY29weSBvZiBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byBjb3B5IGZyb20uCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFsbG9jYXRvciB0byB1c2UuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsCisJCSAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9BbGxvYyYgX19hKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIGluaXRpYWxpemVkIGJ5IGEgY2hhcmFjdGVyICVhcnJheS4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgU291cmNlIGNoYXJhY3RlciAlYXJyYXkuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFsbG9jYXRvciB0byB1c2UgKGRlZmF1bHQgaXMgZGVmYXVsdCBhbGxvY2F0b3IpLgorICAgICAgICoKKyAgICAgICAqICBOQjogQGEgX19zIG11c3QgaGF2ZSBhdCBsZWFzdCBAYSBfX24gY2hhcmFjdGVycywgJmFwb3M7XFwwJmFwb3M7CisgICAgICAgKiAgaGFzIG5vIHNwZWNpYWwgbWVhbmluZy4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLAorCQkgICBjb25zdCBfQWxsb2MmIF9fYSA9IF9BbGxvYygpKTsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBhcyBjb3B5IG9mIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFNvdXJjZSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQWxsb2NhdG9yIHRvIHVzZSAoZGVmYXVsdCBpcyBkZWZhdWx0IGFsbG9jYXRvcikuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgY29uc3QgX0FsbG9jJiBfX2EgPSBfQWxsb2MoKSk7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgYXMgbXVsdGlwbGUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX2MgIENoYXJhY3RlciB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFsbG9jYXRvciB0byB1c2UgKGRlZmF1bHQgaXMgZGVmYXVsdCBhbGxvY2F0b3IpLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYywgY29uc3QgX0FsbG9jJiBfX2EgPSBfQWxsb2MoKSk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmUgY29uc3RydWN0IHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCBzdHJpbmcgY29udGFpbnMgdGhlIGV4YWN0IGNvbnRlbnRzIG9mIEBhIF9fc3RyLgorICAgICAgICogIEBhIF9fc3RyIGlzIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCBzdHJpbmcuCisgICAgICAgKiovCisgICAgICBiYXNpY19zdHJpbmcoYmFzaWNfc3RyaW5nJiYgX19zdHIpIG5vZXhjZXB0CisgICAgICA6IF9NX2RhdGFwbHVzKF9fc3RyLl9NX2RhdGFwbHVzKQorICAgICAgeworI2lmIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HID09IDAKKwlfX3N0ci5fTV9kYXRhKF9TX2VtcHR5X3JlcCgpLl9NX3JlZmRhdGEoKSk7CisjZWxzZQorCV9fc3RyLl9NX2RhdGEoX1NfY29uc3RydWN0KHNpemVfdHlwZSgpLCBfQ2hhclQoKSwgZ2V0X2FsbG9jYXRvcigpKSk7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIGZyb20gYW4gaW5pdGlhbGl6ZXIgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbGxvY2F0b3IgdG8gdXNlIChkZWZhdWx0IGlzIGRlZmF1bHQgYWxsb2NhdG9yKS4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nKGluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wsIGNvbnN0IF9BbGxvYyYgX19hID0gX0FsbG9jKCkpOworI2VuZGlmIC8vIEMrKzExCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBhcyBjb3B5IG9mIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2JlZyAgU3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2VuZCAgRW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbGxvY2F0b3IgdG8gdXNlIChkZWZhdWx0IGlzIGRlZmF1bHQgYWxsb2NhdG9yKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGJhc2ljX3N0cmluZyhfSW5wdXRJdGVyYXRvciBfX2JlZywgX0lucHV0SXRlcmF0b3IgX19lbmQsCisJCSAgICAgY29uc3QgX0FsbG9jJiBfX2EgPSBfQWxsb2MoKSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVzdHJveSB0aGUgc3RyaW5nIGluc3RhbmNlLgorICAgICAgICovCisgICAgICB+YmFzaWNfc3RyaW5nKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX01fcmVwKCktPl9NX2Rpc3Bvc2UodGhpcy0+Z2V0X2FsbG9jYXRvcigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbiB0aGUgdmFsdWUgb2YgQGEgc3RyIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIFNvdXJjZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKSAKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihfX3N0cik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb3B5IGNvbnRlbnRzIG9mIEBhIHMgaW50byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgU291cmNlIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfQ2hhclQqIF9fcykgCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19zKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBzdHJpbmcgb2YgbGVuZ3RoIDEuCisgICAgICAgKiAgQHBhcmFtICBfX2MgIFNvdXJjZSBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIEFzc2lnbmluZyB0byBhIGNoYXJhY3RlciBtYWtlcyB0aGlzIHN0cmluZyBsZW5ndGggMSBhbmQKKyAgICAgICAqICAoKnRoaXMpWzBdID09IEBhIGMuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yPShfQ2hhclQgX19jKSAKKyAgICAgIHsgCisJdGhpcy0+YXNzaWduKDEsIF9fYyk7IAorCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTW92ZSBhc3NpZ24gdGhlIHZhbHVlIG9mIEBhIHN0ciB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgc3RyIGFyZSBtb3ZlZCBpbnRvIHRoaXMgc3RyaW5nICh3aXRob3V0IGNvcHlpbmcpLgorICAgICAgICogIEBhIHN0ciBpcyBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgc3RyaW5nLgorICAgICAgICoqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgb3BlcmF0b3I9KGJhc2ljX3N0cmluZyYmIF9fc3RyKQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCXRoaXMtPnN3YXAoX19zdHIpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gc3RyaW5nIGNvbnN0cnVjdGVkIGZyb20gaW5pdGlhbGl6ZXIgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wpCisgICAgICB7CisJdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuc2l6ZSgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYgLy8gQysrMTEKKworICAgICAgLy8gSXRlcmF0b3JzOgorICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbgorICAgICAgICogIHRoZSAlc3RyaW5nLiAgVW5zaGFyZXMgdGhlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfTV9sZWFrKCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9NX2RhdGEoKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9kYXRhKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLiAgVW5zaGFyZXMgdGhlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX01fbGVhaygpOworCXJldHVybiBpdGVyYXRvcihfTV9kYXRhKCkgKyB0aGlzLT5zaXplKCkpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlCisgICAgICAgKiAgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX01fZGF0YSgpICsgdGhpcy0+c2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBsYXN0CisgICAgICAgKiAgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gcmV2ZXJzZSBlbGVtZW50CisgICAgICAgKiAgb3JkZXIuICBVbnNoYXJlcyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5lbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IodGhpcy0+ZW5kKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gb25lIGJlZm9yZSB0aGUKKyAgICAgICAqICBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBJdGVyYXRpb24gaXMgZG9uZSBpbiByZXZlcnNlCisgICAgICAgKiAgZWxlbWVudCBvcmRlci4gIFVuc2hhcmVzIHRoZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5iZWdpbigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIG9uZSBiZWZvcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbgorICAgICAgICogIGlzIGRvbmUgaW4gcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IodGhpcy0+YmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlCisgICAgICAgKiAgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIG9uZSBiZWZvcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbgorICAgICAgICogIGlzIGRvbmUgaW4gcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENhcGFjaXR5OgorICAgICAgLy8vICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBub3QgaW5jbHVkaW5nIGFueQorICAgICAgLy8vICBudWxsLXRlcm1pbmF0aW9uLgorICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3JlcCgpLT5fTV9sZW5ndGg7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBub3QgaW5jbHVkaW5nIGFueQorICAgICAgLy8vICBudWxsLXRlcm1pbmF0aW9uLgorICAgICAgc2l6ZV90eXBlCisgICAgICBsZW5ndGgoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fcmVwKCktPl9NX2xlbmd0aDsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIHNpemUoKSBvZiB0aGUgbGFyZ2VzdCBwb3NzaWJsZSAlc3RyaW5nLgorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfUmVwOjpfU19tYXhfc2l6ZTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2l6ZXMgdGhlICVzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhlICVzdHJpbmcgc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKiAgQHBhcmFtICBfX2MgIENoYXJhY3RlciB0byBmaWxsIGFueSBuZXcgZWxlbWVudHMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAlc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBudW1iZXIgb2YgY2hhcmFjdGVycy4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZQorICAgICAgICogICVzdHJpbmcncyBjdXJyZW50IHNpemUgdGhlICVzdHJpbmcgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UKKyAgICAgICAqICB0aGUgJXN0cmluZyBpcyBleHRlbmRlZCBhbmQgbmV3IGVsZW1lbnRzIGFyZSAlc2V0IHRvIEBhIF9fYy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2l6ZXMgdGhlICVzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhlICVzdHJpbmcgc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCByZXNpemUgdGhlICVzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguICBJZgorICAgICAgICogIHRoZSBuZXcgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlICVzdHJpbmcncyBjdXJyZW50IHNpemUgdGhlICVzdHJpbmcKKyAgICAgICAqICBpcyB0cnVuY2F0ZWQsIG90aGVyd2lzZSB0aGUgJXN0cmluZyBpcyBleHRlbmRlZCBhbmQgbmV3IGNoYXJhY3RlcnMKKyAgICAgICAqICBhcmUgZGVmYXVsdC1jb25zdHJ1Y3RlZC4gIEZvciBiYXNpYyB0eXBlcyBzdWNoIGFzIGNoYXIsIHRoaXMgbWVhbnMKKyAgICAgICAqICBzZXR0aW5nIHRoZW0gdG8gMC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX24pCisgICAgICB7IHRoaXMtPnJlc2l6ZShfX24sIF9DaGFyVCgpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8vICBBIG5vbi1iaW5kaW5nIHJlcXVlc3QgdG8gcmVkdWNlIGNhcGFjaXR5KCkgdG8gc2l6ZSgpLgorICAgICAgdm9pZAorICAgICAgc2hyaW5rX3RvX2ZpdCgpCisgICAgICB7CisJaWYgKGNhcGFjaXR5KCkgPiBzaXplKCkpCisJICB7CisJICAgIF9fdHJ5CisJICAgICAgeyByZXNlcnZlKDApOyB9CisJICAgIF9fY2F0Y2goLi4uKQorCSAgICAgIHsgfQorCSAgfQorICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhlICVzdHJpbmcgY2FuIGhvbGQKKyAgICAgICAqICBiZWZvcmUgbmVlZGluZyB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjYXBhY2l0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV9yZXAoKS0+X01fY2FwYWNpdHk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBdHRlbXB0IHRvIHByZWFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIHNwZWNpZmllZCBudW1iZXIgb2YKKyAgICAgICAqICAgICAgICAgIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX3Jlc19hcmcgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHJlcXVpcmVkLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIEBhIF9fcmVzX2FyZyBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gcmVzZXJ2ZSBlbm91Z2ggbWVtb3J5IGZvciB0aGUKKyAgICAgICAqICAlc3RyaW5nIHRvIGhvbGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycy4gIElmIHRoZQorICAgICAgICogIG51bWJlciByZXF1ZXN0ZWQgaXMgbW9yZSB0aGFuIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcworICAgICAgICogIHRocm93bi4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGFkdmFudGFnZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgaWYgb3B0aW1hbCBjb2RlIGlzIGEKKyAgICAgICAqICBuZWNlc3NpdHkgYW5kIHRoZSB1c2VyIGNhbiBkZXRlcm1pbmUgdGhlIHN0cmluZyBsZW5ndGggdGhhdCB3aWxsIGJlCisgICAgICAgKiAgcmVxdWlyZWQsIHRoZSB1c2VyIGNhbiByZXNlcnZlIHRoZSBtZW1vcnkgaW4gJWFkdmFuY2UsIGFuZCB0aHVzCisgICAgICAgKiAgcHJldmVudCBhIHBvc3NpYmxlIHJlYWxsb2NhdGlvbiBvZiBtZW1vcnkgYW5kIGNvcHlpbmcgb2YgJXN0cmluZworICAgICAgICogIGRhdGEuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2VydmUoc2l6ZV90eXBlIF9fcmVzX2FyZyA9IDApOworCisgICAgICAvKioKKyAgICAgICAqICBFcmFzZXMgdGhlIHN0cmluZywgbWFraW5nIGl0IGVtcHR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX211dGF0ZSgwLCB0aGlzLT5zaXplKCksIDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXN0cmluZyBpcyBlbXB0eS4gIEVxdWl2YWxlbnQgdG8gCisgICAgICAgKiAgPGNvZGU+KnRoaXMgPT0gIiI8L2NvZGU+LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5zaXplKCkgPT0gMDsgfQorCisgICAgICAvLyBFbGVtZW50IGFjY2VzczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3Vic2NyaXB0IGFjY2VzcyB0byB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdG8gYWNjZXNzLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdG9yIGFsbG93cyBmb3IgZWFzeSwgYXJyYXktc3R5bGUsIGRhdGEgYWNjZXNzLgorICAgICAgICogIE5vdGUgdGhhdCBkYXRhIGFjY2VzcyB3aXRoIHRoaXMgb3BlcmF0b3IgaXMgdW5jaGVja2VkIGFuZAorICAgICAgICogIG91dF9vZl9yYW5nZSBsb29rdXBzIGFyZSBub3QgZGVmaW5lZC4gKEZvciBjaGVja2VkIGxvb2t1cHMKKyAgICAgICAqICBzZWUgYXQoKS4pCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXSAoc2l6ZV90eXBlIF9fcG9zKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfX3BvcyA8PSBzaXplKCkpOworCXJldHVybiBfTV9kYXRhKClbX19wb3NdOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN1YnNjcmlwdCBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIHRvIGFjY2Vzcy4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdG9yIGFsbG93cyBmb3IgZWFzeSwgYXJyYXktc3R5bGUsIGRhdGEgYWNjZXNzLgorICAgICAgICogIE5vdGUgdGhhdCBkYXRhIGFjY2VzcyB3aXRoIHRoaXMgb3BlcmF0b3IgaXMgdW5jaGVja2VkIGFuZAorICAgICAgICogIG91dF9vZl9yYW5nZSBsb29rdXBzIGFyZSBub3QgZGVmaW5lZC4gKEZvciBjaGVja2VkIGxvb2t1cHMKKyAgICAgICAqICBzZWUgYXQoKS4pICBVbnNoYXJlcyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fcG9zKQorICAgICAgeworICAgICAgICAvLyBhbGxvdyBwb3MgPT0gc2l6ZSgpIGFzIHYzIGV4dGVuc2lvbjoKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19wb3MgPD0gc2l6ZSgpKTsKKyAgICAgICAgLy8gYnV0IGJlIHN0cmljdCBpbiBwZWRhbnRpYyBtb2RlOgorCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfX3BvcyA8IHNpemUoKSk7CisJX01fbGVhaygpOworCXJldHVybiBfTV9kYXRhKClbX19wb3NdOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fbiBUaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB0byBhY2Nlc3MuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC1vbmx5IChjb25zdCkgcmVmZXJlbmNlIHRvIHRoZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgbiBpcyBhbiBpbnZhbGlkIGluZGV4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBzYWZlciBkYXRhIGFjY2Vzcy4gIFRoZSBwYXJhbWV0ZXIgaXMKKyAgICAgICAqICBmaXJzdCBjaGVja2VkIHRoYXQgaXQgaXMgaW4gdGhlIHJhbmdlIG9mIHRoZSBzdHJpbmcuICBUaGUgZnVuY3Rpb24KKyAgICAgICAqICB0aHJvd3Mgb3V0X29mX3JhbmdlIGlmIHRoZSBjaGVjayBmYWlscy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBhdChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeworCWlmIChfX24gPj0gdGhpcy0+c2l6ZSgpKQorCSAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJiYXNpY19zdHJpbmc6OmF0IikpOworCXJldHVybiBfTV9kYXRhKClbX19uXTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX24gVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdG8gYWNjZXNzLgorICAgICAgICogIEByZXR1cm4gIFJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgbiBpcyBhbiBpbnZhbGlkIGluZGV4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBzYWZlciBkYXRhIGFjY2Vzcy4gIFRoZSBwYXJhbWV0ZXIgaXMKKyAgICAgICAqICBmaXJzdCBjaGVja2VkIHRoYXQgaXQgaXMgaW4gdGhlIHJhbmdlIG9mIHRoZSBzdHJpbmcuICBUaGUgZnVuY3Rpb24KKyAgICAgICAqICB0aHJvd3Mgb3V0X29mX3JhbmdlIGlmIHRoZSBjaGVjayBmYWlscy4gIFN1Y2Nlc3MgcmVzdWx0cyBpbgorICAgICAgICogIHVuc2hhcmluZyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fbiA+PSBzaXplKCkpCisJICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oImJhc2ljX3N0cmluZzo6YXQiKSk7CisJX01fbGVhaygpOworCXJldHVybiBfTV9kYXRhKClbX19uXTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlc3RyaW5nLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGZyb250KCkKKyAgICAgIHsgcmV0dXJuIG9wZXJhdG9yW10oMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlc3RyaW5nLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG9wZXJhdG9yW10oMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBiYWNrKCkKKyAgICAgIHsgcmV0dXJuIG9wZXJhdG9yW10odGhpcy0+c2l6ZSgpIC0gMSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUKKyAgICAgICAqICBsYXN0IGVsZW1lbnQgb2YgdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7IHJldHVybiBvcGVyYXRvcltdKHRoaXMtPnNpemUoKSAtIDEpOyB9CisjZW5kaWYKKworICAgICAgLy8gTW9kaWZpZXJzOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBzdHJpbmcgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBUaGUgc3RyaW5nIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yKz0oY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFwcGVuZChfX3N0cik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBUaGUgQyBzdHJpbmcgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgb3BlcmF0b3IrPShjb25zdCBfQ2hhclQqIF9fcykKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFwcGVuZChfX3MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgb3BlcmF0b3IrPShfQ2hhclQgX19jKQorICAgICAgeyAKKwl0aGlzLT5wdXNoX2JhY2soX19jKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhbiBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fbCAgVGhlIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycyB0byBiZSBhcHBlbmRlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yKz0oaW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFwcGVuZChfX2wuYmVnaW4oKSwgX19sLnNpemUoKSk7IH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIHN0cmluZyB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFRoZSBzdHJpbmcgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgYXBwZW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFRoZSBzdHJpbmcgdG8gYXBwZW5kLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBzdHIgdG8gYXBwZW5kLgorICAgICAgICogIEBwYXJhbSBfX24gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgaWYgQGEgX19wb3MgaXMgbm90IGEgdmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXBwZW5kcyBAYSBfX24gY2hhcmFjdGVycyBmcm9tIEBhIF9fc3RyCisgICAgICAgKiAgc3RhcnRpbmcgYXQgQGEgX19wb3MgdG8gdGhpcyBzdHJpbmcuICBJZiBAYSBfX24gaXMgaXMgbGFyZ2VyCisgICAgICAgKiAgdGhhbiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjaGFyYWN0ZXJzIGluIEBhIF9fc3RyLCB0aGUKKyAgICAgICAqICByZW1haW5kZXIgb2YgQGEgX19zdHIgaXMgYXBwZW5kZWQuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFwcGVuZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBDIHN0cmluZyB0byBhcHBlbmQuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbik7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIEMgc3RyaW5nIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcykKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmFwcGVuZChfX3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIG11bHRpcGxlIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcmFjdGVyIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIEFwcGVuZHMgX19uIGNvcGllcyBvZiBfX2MgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFwcGVuZChzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGFuIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19sICBUaGUgaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFwcGVuZChpbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXBwZW5kKF9fbC5iZWdpbigpLCBfX2wuc2l6ZSgpKTsgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19maXJzdCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGZpcnN0IGNoYXJhY3RlciB0byBhcHBlbmQuCisgICAgICAgKiAgQHBhcmFtIF9fbGFzdCAgSXRlcmF0b3IgbWFya2luZyB0aGUgZW5kIG9mIHRoZSByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIEFwcGVuZHMgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW19fZmlyc3QsX19sYXN0KSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgICAgYXBwZW5kKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfTV9pZW5kKCksIF9NX2llbmQoKSwgX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGFwcGVuZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKF9DaGFyVCBfX2MpCisgICAgICB7IAorCWNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IDEgKyB0aGlzLT5zaXplKCk7CisJaWYgKF9fbGVuID4gdGhpcy0+Y2FwYWNpdHkoKSB8fCBfTV9yZXAoKS0+X01faXNfc2hhcmVkKCkpCisJICB0aGlzLT5yZXNlcnZlKF9fbGVuKTsKKwl0cmFpdHNfdHlwZTo6YXNzaWduKF9NX2RhdGEoKVt0aGlzLT5zaXplKCldLCBfX2MpOworCV9NX3JlcCgpLT5fTV9zZXRfbGVuZ3RoX2FuZF9zaGFyYWJsZShfX2xlbik7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGNvbnRlbnRzIG9mIGFub3RoZXIgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIFNvdXJjZSBzdHJpbmcgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgYXNzaWduKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gY29udGVudHMgb2YgYW5vdGhlciBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgU291cmNlIHN0cmluZyB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhpcyBzdHJpbmcgdG8gdGhlIGV4YWN0IGNvbnRlbnRzIG9mIEBhIF9fc3RyLgorICAgICAgICogIEBhIF9fc3RyIGlzIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFzc2lnbihiYXNpY19zdHJpbmcmJiBfX3N0cikKKyAgICAgIHsKKwl0aGlzLT5zd2FwKF9fc3RyKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYgLy8gQysrMTEKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gYSBzdWJzdHJpbmcgb2YgYSBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBUaGUgc3RyaW5nIHRvIHVzZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3RyLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSBpZiBAYSBwb3MgaXMgbm90IGEgdmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGlzIHN0cmluZyB0byB0aGUgc3Vic3RyaW5nIG9mIEBhIF9fc3RyCisgICAgICAgKiAgY29uc2lzdGluZyBvZiBAYSBfX24gY2hhcmFjdGVycyBhdCBAYSBfX3Bvcy4gIElmIEBhIF9fbiBpcworICAgICAgICogIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNoYXJhY3RlcnMgaW4gQGEKKyAgICAgICAqICBfX3N0ciwgdGhlIHJlbWFpbmRlciBvZiBAYSBfX3N0ciBpcyB1c2VkLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhc3NpZ24oY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fc3RyLl9NX2RhdGEoKQorCQkJICAgICsgX19zdHIuX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6OmFzc2lnbiIpLAorCQkJICAgIF9fc3RyLl9NX2xpbWl0KF9fcG9zLCBfX24pKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBhIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBDIHN0cmluZyB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHN0cmluZyB0byB0aGUgZmlyc3QgQGEgX19uCisgICAgICAgKiAgY2hhcmFjdGVycyBvZiBAYSBfX3MuICBJZiBAYSBfX24gaXMgaXMgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZgorICAgICAgICogIGF2YWlsYWJsZSBjaGFyYWN0ZXJzIGluIEBhIF9fcywgdGhlIHJlbWFpbmRlciBvZiBAYSBfX3MgaXMgdXNlZC4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgYXNzaWduKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gY29udGVudHMgb2YgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBUaGUgQyBzdHJpbmcgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHN0cmluZyB0byB0aGUgdmFsdWUgb2YgQGEgX19zLgorICAgICAgICogIFRoZSBkYXRhIGlzIGNvcGllZCwgc28gdGhlcmUgaXMgbm8gZGVwZW5kZW5jZSBvbiBAYSBfX3Mgb25jZSB0aGUKKyAgICAgICAqICBmdW5jdGlvbiByZXR1cm5zLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5hc3NpZ24oX19zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX24gIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcmFjdGVyIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBzdHJpbmcgdG8gQGEgX19uIGNvcGllcyBvZgorICAgICAgICogIGNoYXJhY3RlciBAYSBfX2MuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFzc2lnbihzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgICAgeyByZXR1cm4gX01fcmVwbGFjZV9hdXgoc2l6ZV90eXBlKDApLCB0aGlzLT5zaXplKCksIF9fbiwgX19jKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBhIHJhbmdlIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fZmlyc3QgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gYXBwZW5kLgorICAgICAgICogIEBwYXJhbSBfX2xhc3QgIEl0ZXJhdG9yIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBTZXRzIHZhbHVlIG9mIHN0cmluZyB0byBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbX19maXJzdCxfX2xhc3QpLgorICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBiYXNpY19zdHJpbmcmCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX01faWJlZ2luKCksIF9NX2llbmQoKSwgX19maXJzdCwgX19sYXN0KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gYW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX2wgIFRoZSBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMgdG8gYXNzaWduLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wpCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19sLmJlZ2luKCksIF9fbC5zaXplKCkpOyB9CisjZW5kaWYgLy8gQysrMTEKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgbXVsdGlwbGUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19wICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydAorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gaW5zZXJ0LgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRzIEBhIF9fbiBjb3BpZXMgb2YgY2hhcmFjdGVyIEBhIF9fYyBzdGFydGluZyBhdCB0aGUKKyAgICAgICAqICBwb3NpdGlvbiByZWZlcmVuY2VkIGJ5IGl0ZXJhdG9yIEBhIF9fcC4gIElmIGFkZGluZworICAgICAgICogIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksCisgICAgICAgKiAgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7CXRoaXMtPnJlcGxhY2UoX19wLCBfX3AsIF9fbiwgX19jKTsgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgYSByYW5nZSBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX3AgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGxvY2F0aW9uIGluIHN0cmluZyB0byBpbnNlcnQgYXQuCisgICAgICAgKiAgQHBhcmFtIF9fYmVnICBTdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19lbmQgIEVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyBjaGFyYWN0ZXJzIGluIHJhbmdlIFtfX2JlZyxfX2VuZCkuICBJZiBhZGRpbmcKKyAgICAgICAqICBjaGFyYWN0ZXJzIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZCBtYXhfc2l6ZSgpLAorICAgICAgICogIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0CisgICAgICAgKiAgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wLCBfSW5wdXRJdGVyYXRvciBfX2JlZywgX0lucHV0SXRlcmF0b3IgX19lbmQpCisgICAgICAgIHsgdGhpcy0+cmVwbGFjZShfX3AsIF9fcCwgX19iZWcsIF9fZW5kKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgYW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX3AgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGxvY2F0aW9uIGluIHN0cmluZyB0byBpbnNlcnQgYXQuCisgICAgICAgKiAgQHBhcmFtIF9fbCAgVGhlIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIGluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9fcCA+PSBfTV9pYmVnaW4oKSAmJiBfX3AgPD0gX01faWVuZCgpKTsKKwl0aGlzLT5pbnNlcnQoX19wIC0gX01faWJlZ2luKCksIF9fbC5iZWdpbigpLCBfX2wuc2l6ZSgpKTsKKyAgICAgIH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCB2YWx1ZSBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MxICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRzIHZhbHVlIG9mIEBhIF9fc3RyIHN0YXJ0aW5nIGF0IEBhIF9fcG9zMS4gIElmIGFkZGluZworICAgICAgICogIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksCisgICAgICAgKiAgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGluc2VydChzaXplX3R5cGUgX19wb3MxLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgICAgeyByZXR1cm4gdGhpcy0+aW5zZXJ0KF9fcG9zMSwgX19zdHIsIHNpemVfdHlwZSgwKSwgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MxICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMiAgU3RhcnQgb2YgY2hhcmFjdGVycyBpbiBzdHIgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zMSA+IHNpemUoKSBvcgorICAgICAgICogIEBhIF9fcG9zMiA+IEBhIHN0ci5zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGF0IEBhIHBvczEsIGluc2VydCBAYSBfX24gY2hhcmFjdGVyIG9mIEBhIF9fc3RyCisgICAgICAgKiAgYmVnaW5uaW5nIHdpdGggQGEgX19wb3MyLiAgSWYgYWRkaW5nIGNoYXJhY3RlcnMgY2F1c2VzIHRoZQorICAgICAgICogIGxlbmd0aCB0byBleGNlZWQgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIElmIEBhCisgICAgICAgKiAgX19wb3MxIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMgc3RyaW5nIG9yIEBhIF9fcG9zMiBpcworICAgICAgICogIGJleW9uZCB0aGUgZW5kIG9mIEBhIF9fc3RyLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgVGhlCisgICAgICAgKiAgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgaW5zZXJ0KHNpemVfdHlwZSBfX3BvczEsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsCisJICAgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gdGhpcy0+aW5zZXJ0KF9fcG9zMSwgX19zdHIuX01fZGF0YSgpCisJCQkgICAgKyBfX3N0ci5fTV9jaGVjayhfX3BvczIsICJiYXNpY19zdHJpbmc6Omluc2VydCIpLAorCQkJICAgIF9fc3RyLl9NX2xpbWl0KF9fcG9zMiwgX19uKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgYSBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGxvY2F0aW9uIGluIHN0cmluZyB0byBpbnNlcnQgYXQuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIEMgc3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19uICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX3BvcyBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGlzCisgICAgICAgKiAgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRzIHRoZSBmaXJzdCBAYSBfX24gY2hhcmFjdGVycyBvZiBAYSBfX3Mgc3RhcnRpbmcgYXQgQGEKKyAgICAgICAqICBfX3Bvcy4gIElmIGFkZGluZyBjaGFyYWN0ZXJzIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZAorICAgICAgICogIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBJZiBAYSBfX3BvcyBpcyBiZXlvbmQKKyAgICAgICAqICBlbmQoKSwgb3V0X29mX3JhbmdlIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nCisgICAgICAgKiAgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGxvY2F0aW9uIGluIHN0cmluZyB0byBpbnNlcnQgYXQuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIEMgc3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAqICBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIEluc2VydHMgdGhlIGZpcnN0IEBhIG4gY2hhcmFjdGVycyBvZiBAYSBfX3Mgc3RhcnRpbmcgYXQgQGEgX19wb3MuICBJZgorICAgICAgICogIGFkZGluZyBjaGFyYWN0ZXJzIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZCBtYXhfc2l6ZSgpLAorICAgICAgICogIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBJZiBAYSBfX3BvcyBpcyBiZXlvbmQgZW5kKCksIG91dF9vZl9yYW5nZSBpcworICAgICAgICogIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzCisgICAgICAgKiAgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+aW5zZXJ0KF9fcG9zLCBfX3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IG11bHRpcGxlIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydAorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX3BvcyBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGlzCisgICAgICAgKiAgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRzIEBhIF9fbiBjb3BpZXMgb2YgY2hhcmFjdGVyIEBhIF9fYyBzdGFydGluZyBhdCBpbmRleAorICAgICAgICogIEBhIF9fcG9zLiAgSWYgYWRkaW5nIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkCisgICAgICAgKiAgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIElmIEBhIF9fcG9zID4gbGVuZ3RoKCksCisgICAgICAgKiAgb3V0X29mX3JhbmdlIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGluc2VydChzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7IHJldHVybiBfTV9yZXBsYWNlX2F1eChfTV9jaGVjayhfX3BvcywgImJhc2ljX3N0cmluZzo6aW5zZXJ0IiksCisJCQkgICAgICBzaXplX3R5cGUoMCksIF9fbiwgX19jKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBvbmUgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX3AgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHBvc2l0aW9uIGluIHN0cmluZyB0byBpbnNlcnQgYXQuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXJhY3RlciB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbmV3bHkgaW5zZXJ0ZWQgY2hhci4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyBjaGFyYWN0ZXIgQGEgX19jIGF0IHBvc2l0aW9uIHJlZmVyZW5jZWQgYnkgQGEgX19wLgorICAgICAgICogIElmIGFkZGluZyBjaGFyYWN0ZXIgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksCisgICAgICAgKiAgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIElmIEBhIF9fcCBpcyBiZXlvbmQgZW5kIG9mIHN0cmluZywKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndAorICAgICAgICogIGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIF9DaGFyVCBfX2MpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9fcCA+PSBfTV9pYmVnaW4oKSAmJiBfX3AgPD0gX01faWVuZCgpKTsKKwljb25zdCBzaXplX3R5cGUgX19wb3MgPSBfX3AgLSBfTV9pYmVnaW4oKTsKKwlfTV9yZXBsYWNlX2F1eChfX3Bvcywgc2l6ZV90eXBlKDApLCBzaXplX3R5cGUoMSksIF9fYyk7CisJX01fcmVwKCktPl9NX3NldF9sZWFrZWQoKTsKKwlyZXR1cm4gaXRlcmF0b3IoX01fZGF0YSgpICsgX19wb3MpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIHJlbW92ZSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgKGRlZmF1bHQgcmVtYWluZGVyKS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAqICBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgQGEgX19uIGNoYXJhY3RlcnMgZnJvbSB0aGlzIHN0cmluZyBzdGFydGluZyBhdCBAYQorICAgICAgICogIF9fcG9zLiAgVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzIHJlZHVjZWQgYnkgQGEgX19uLiAgSWYKKyAgICAgICAqICB0aGVyZSBhcmUgPCBAYSBfX24gY2hhcmFjdGVycyB0byByZW1vdmUsIHRoZSByZW1haW5kZXIgb2YKKyAgICAgICAqICB0aGUgc3RyaW5nIGlzIHRydW5jYXRlZC4gIElmIEBhIF9fcCBpcyBiZXlvbmQgZW5kIG9mIHN0cmluZywKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndAorICAgICAgICogIGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgZXJhc2Uoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpCisgICAgICB7IAorCV9NX211dGF0ZShfTV9jaGVjayhfX3BvcywgImJhc2ljX3N0cmluZzo6ZXJhc2UiKSwKKwkJICBfTV9saW1pdChfX3BvcywgX19uKSwgc2l6ZV90eXBlKDApKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIG9uZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zaXRpb24gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBjaGFyYWN0ZXIgdG8gcmVtb3ZlLgorICAgICAgICogIEByZXR1cm4gIGl0ZXJhdG9yIHJlZmVyZW5jaW5nIHNhbWUgbG9jYXRpb24gYWZ0ZXIgcmVtb3ZhbC4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVyIGF0IEBhIF9fcG9zaXRpb24gZnJvbSB0aGlzIHN0cmluZy4gVGhlIHZhbHVlCisgICAgICAgKiAgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9fcG9zaXRpb24gPj0gX01faWJlZ2luKCkKKwkJCQkgJiYgX19wb3NpdGlvbiA8IF9NX2llbmQoKSk7CisJY29uc3Qgc2l6ZV90eXBlIF9fcG9zID0gX19wb3NpdGlvbiAtIF9NX2liZWdpbigpOworCV9NX211dGF0ZShfX3Bvcywgc2l6ZV90eXBlKDEpLCBzaXplX3R5cGUoMCkpOworCV9NX3JlcCgpLT5fTV9zZXRfbGVha2VkKCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9NX2RhdGEoKSArIF9fcG9zKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgYSByYW5nZSBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX2ZpcnN0ICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIHJlbW92ZS4KKyAgICAgICAqICBAcGFyYW0gX19sYXN0ICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZW5kIG9mIHRoZSByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBvZiBmaXJzdCBhZnRlciByZW1vdmFsLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgZnJvbSB0aGlzIHN0cmluZy4KKyAgICAgICAqICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCk7CisgCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgdGhlIGxhc3QgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBUaGUgc3RyaW5nIG11c3QgYmUgbm9uLWVtcHR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwb3BfYmFjaygpCisgICAgICB7IGVyYXNlKHNpemUoKS0xLCAxKTsgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSBjaGFyYWN0ZXJzIHdpdGggdmFsdWUgZnJvbSBhbm90aGVyIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAqICBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtfX3BvcyxfX3BvcytfX24pIGZyb20KKyAgICAgICAqICB0aGlzIHN0cmluZy4gIEluIHBsYWNlLCB0aGUgdmFsdWUgb2YgQGEgX19zdHIgaXMgaW5zZXJ0ZWQuCisgICAgICAgKiAgSWYgQGEgX19wb3MgaXMgYmV5b25kIGVuZCBvZiBzdHJpbmcsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uCisgICAgICAgKiAgSWYgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yCisgICAgICAgKiAgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4KKyAgICAgICAqICBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpCisgICAgICB7IHJldHVybiB0aGlzLT5yZXBsYWNlKF9fcG9zLCBfX24sIF9fc3RyLl9NX2RhdGEoKSwgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgY2hhcmFjdGVycyB3aXRoIHZhbHVlIGZyb20gYW5vdGhlciBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMSAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MyICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3RyIHRvIHVzZS4KKyAgICAgICAqICBAcGFyYW0gX19uMiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzdHIgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX3BvczEgPiBzaXplKCkgb3IgQGEgX19wb3MyID4KKyAgICAgICAqICBfX3N0ci5zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtfX3BvczEsX19wb3MxICsgbikgZnJvbSB0aGlzCisgICAgICAgKiAgc3RyaW5nLiAgSW4gcGxhY2UsIHRoZSB2YWx1ZSBvZiBAYSBfX3N0ciBpcyBpbnNlcnRlZC4gIElmIEBhIF9fcG9zIGlzCisgICAgICAgKiAgYmV5b25kIGVuZCBvZiBzdHJpbmcsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBJZiB0aGUgbGVuZ3RoIG9mIHRoZQorICAgICAgICogIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlCisgICAgICAgKiAgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLAorCSAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKQorICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfX3BvczEsIF9fbjEsIF9fc3RyLl9NX2RhdGEoKQorCQkJICAgICArIF9fc3RyLl9NX2NoZWNrKF9fcG9zMiwgImJhc2ljX3N0cmluZzo6cmVwbGFjZSIpLAorCQkJICAgICBfX3N0ci5fTV9saW1pdChfX3BvczIsIF9fbjIpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgY2hhcmFjdGVycyB3aXRoIHZhbHVlIG9mIGEgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVwbGFjZWQuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX24yICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIEBhIHMgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBwb3MxID4gc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbX19wb3MsX19wb3MgKyBfX24xKQorICAgICAgICogIGZyb20gdGhpcyBzdHJpbmcuICBJbiBwbGFjZSwgdGhlIGZpcnN0IEBhIF9fbjIgY2hhcmFjdGVycyBvZgorICAgICAgICogIEBhIF9fcyBhcmUgaW5zZXJ0ZWQsIG9yIGFsbCBvZiBAYSBfX3MgaWYgQGEgX19uMiBpcyB0b28gbGFyZ2UuICBJZgorICAgICAgICogIEBhIF9fcG9zIGlzIGJleW9uZCBlbmQgb2Ygc3RyaW5nLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgSWYKKyAgICAgICAqICB0aGUgbGVuZ3RoIG9mIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcworICAgICAgICogIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yCisgICAgICAgKiAgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgICAgc2l6ZV90eXBlIF9fbjIpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgY2hhcmFjdGVycyB3aXRoIHZhbHVlIG9mIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVwbGFjZWQuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBwb3MgPiBzaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtfX3BvcyxfX3BvcyArIF9fbjEpCisgICAgICAgKiAgZnJvbSB0aGlzIHN0cmluZy4gIEluIHBsYWNlLCB0aGUgY2hhcmFjdGVycyBvZiBAYSBfX3MgYXJlCisgICAgICAgKiAgaW5zZXJ0ZWQuICBJZiBAYSBfX3BvcyBpcyBiZXlvbmQgZW5kIG9mIHN0cmluZywgb3V0X29mX3JhbmdlCisgICAgICAgKiAgaXMgdGhyb3duLiAgSWYgdGhlIGxlbmd0aCBvZiByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLAorICAgICAgICogIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0CisgICAgICAgKiAgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX3BvcywgX19uMSwgX19zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgY2hhcmFjdGVycyB3aXRoIG11bHRpcGxlIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVwbGFjZWQuCisgICAgICAgKiAgQHBhcmFtIF9fbjIgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX3BvcyA+IHNpemUoKS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW3Bvcyxwb3MgKyBuMSkgZnJvbSB0aGlzCisgICAgICAgKiAgc3RyaW5nLiAgSW4gcGxhY2UsIEBhIF9fbjIgY29waWVzIG9mIEBhIF9fYyBhcmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgSWYgQGEgX19wb3MgaXMgYmV5b25kIGVuZCBvZiBzdHJpbmcsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uCisgICAgICAgKiAgSWYgdGhlIGxlbmd0aCBvZiByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMKKyAgICAgICAqICB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvcgorICAgICAgICogIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yLCBfQ2hhclQgX19jKQorICAgICAgeyByZXR1cm4gX01fcmVwbGFjZV9hdXgoX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6OnJlcGxhY2UiKSwKKwkJCSAgICAgIF9NX2xpbWl0KF9fcG9zLCBfX24xKSwgX19uMiwgX19jKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19pMSAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgc3RhcnQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19pMiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgZW5kIG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgdmFsdWUgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW19faTEsX19pMikuICBJbiBwbGFjZSwKKyAgICAgICAqICB0aGUgdmFsdWUgb2YgQGEgX19zdHIgaXMgaW5zZXJ0ZWQuICBJZiB0aGUgbGVuZ3RoIG9mIHJlc3VsdAorICAgICAgICogIGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZgorICAgICAgICogIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSwgX19pMiwgX19zdHIuX01fZGF0YSgpLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSByYW5nZSBvZiBjaGFyYWN0ZXJzIHdpdGggQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9faTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9faTIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHZhbHVlIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHMgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW19faTEsX19pMikuICBJbiBwbGFjZSwKKyAgICAgICAqICB0aGUgZmlyc3QgQGEgX19uIGNoYXJhY3RlcnMgb2YgQGEgX19zIGFyZSBpbnNlcnRlZC4gIElmIHRoZQorICAgICAgICogIGxlbmd0aCBvZiByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLgorICAgICAgICogIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzCisgICAgICAgKiAgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9NX2liZWdpbigpIDw9IF9faTEgJiYgX19pMSA8PSBfX2kyCisJCQkJICYmIF9faTIgPD0gX01faWVuZCgpKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLCBfX3MsIF9fbik7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSByYW5nZSBvZiBjaGFyYWN0ZXJzIHdpdGggQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9faTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9faTIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHZhbHVlIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtfX2kxLF9faTIpLiAgSW4gcGxhY2UsCisgICAgICAgKiAgdGhlIGNoYXJhY3RlcnMgb2YgQGEgX19zIGFyZSBpbnNlcnRlZC4gIElmIHRoZSBsZW5ndGggb2YKKyAgICAgICAqICByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlCisgICAgICAgKiAgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBjb25zdCBfQ2hhclQqIF9fcykKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSwgX19pMiwgX19zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIG11bHRpcGxlIGNoYXJhY3RlcnMKKyAgICAgICAqICBAcGFyYW0gX19pMSAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgc3RhcnQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19pMiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgZW5kIG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbX19pMSxfX2kyKS4gIEluIHBsYWNlLAorICAgICAgICogIEBhIF9fbiBjb3BpZXMgb2YgQGEgX19jIGFyZSBpbnNlcnRlZC4gIElmIHRoZSBsZW5ndGggb2YKKyAgICAgICAqICByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlCisgICAgICAgKiAgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJcmV0dXJuIF9NX3JlcGxhY2VfYXV4KF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsIF9fbiwgX19jKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aCByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19pMSAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgc3RhcnQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19pMiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgZW5kIG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fazEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19rMiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgZW5kIG9mIHJhbmdlIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtfX2kxLF9faTIpLiAgSW4gcGxhY2UsCisgICAgICAgKiAgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW19fazEsX19rMikgYXJlIGluc2VydGVkLiAgSWYgdGhlCisgICAgICAgKiAgbGVuZ3RoIG9mIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uCisgICAgICAgKiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMKKyAgICAgICAqICB0aHJvd24uCisgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLAorCQlfSW5wdXRJdGVyYXRvciBfX2sxLCBfSW5wdXRJdGVyYXRvciBfX2syKQorICAgICAgICB7CisJICBfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgICAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19rMSwgX19rMik7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwkgIHJldHVybiBfTV9yZXBsYWNlX2Rpc3BhdGNoKF9faTEsIF9faTIsIF9fazEsIF9fazIsIF9JbnRlZ3JhbCgpKTsKKwl9CisKKyAgICAgIC8vIFNwZWNpYWxpemF0aW9ucyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIHBvaW50ZXIgYW5kIGl0ZXJhdG9yOgorICAgICAgLy8gdXNlZnVsIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiB0ZW1wb3JhcnkgYnVmZmVyaW5nIGluIF9NX3JlcGxhY2UuCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIF9DaGFyVCogX19rMSwgX0NoYXJUKiBfX2syKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fazEsIF9fazIpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsCisJCQkgICAgIF9fazEsIF9fazIgLSBfX2sxKTsKKyAgICAgIH0KKworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19rMSwgY29uc3QgX0NoYXJUKiBfX2syKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fazEsIF9fazIpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsCisJCQkgICAgIF9fazEsIF9fazIgLSBfX2sxKTsKKyAgICAgIH0KKworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBpdGVyYXRvciBfX2sxLCBpdGVyYXRvciBfX2syKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fazEsIF9fazIpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsCisJCQkgICAgIF9fazEuYmFzZSgpLCBfX2syIC0gX19rMSk7CisgICAgICB9CisKKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkgICAgICBjb25zdF9pdGVyYXRvciBfX2sxLCBjb25zdF9pdGVyYXRvciBfX2syKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fazEsIF9fazIpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsCisJCQkgICAgIF9fazEuYmFzZSgpLCBfX2syIC0gX19rMSk7CisgICAgICB9CisgICAgICAKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtIF9faTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9faTIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2wgIFRoZSBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW19faTEsX19pMikuICBJbiBwbGFjZSwKKyAgICAgICAqICBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbX19rMSxfX2syKSBhcmUgaW5zZXJ0ZWQuICBJZiB0aGUKKyAgICAgICAqICBsZW5ndGggb2YgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4KKyAgICAgICAqICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcworICAgICAgICogIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkJCSAgICBpbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxLCBfX2kyLCBfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0ludGVnZXI+CisJYmFzaWNfc3RyaW5nJgorCV9NX3JlcGxhY2VfZGlzcGF0Y2goaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgX0ludGVnZXIgX19uLAorCQkJICAgIF9JbnRlZ2VyIF9fdmFsLCBfX3RydWVfdHlwZSkKKyAgICAgICAgeyByZXR1cm4gX01fcmVwbGFjZV9hdXgoX19pMSAtIF9NX2liZWdpbigpLCBfX2kyIC0gX19pMSwgX19uLCBfX3ZhbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisJYmFzaWNfc3RyaW5nJgorCV9NX3JlcGxhY2VfZGlzcGF0Y2goaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgX0lucHV0SXRlcmF0b3IgX19rMSwKKwkJCSAgICBfSW5wdXRJdGVyYXRvciBfX2syLCBfX2ZhbHNlX3R5cGUpOworCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBfTV9yZXBsYWNlX2F1eChzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIsCisJCSAgICAgX0NoYXJUIF9fYyk7CisKKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIF9NX3JlcGxhY2Vfc2FmZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJCSAgICAgIHNpemVfdHlwZSBfX24yKTsKKworICAgICAgLy8gX1NfY29uc3RydWN0X2F1eCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgMjEuMy4xIHBhcmEgMTUgd2hpY2gKKyAgICAgIC8vIHJlcXVpcmVzIHNwZWNpYWwgYmVoYXZpb3VyIGlmIF9Jbkl0ZXIgaXMgYW4gaW50ZWdyYWwgdHlwZQorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0luSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyBfQ2hhclQqCisgICAgICAgIF9TX2NvbnN0cnVjdF9hdXgoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLAorCQkJIGNvbnN0IF9BbGxvYyYgX19hLCBfX2ZhbHNlX3R5cGUpCisJeworICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Jbkl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX1RhZzsKKyAgICAgICAgICByZXR1cm4gX1NfY29uc3RydWN0KF9fYmVnLCBfX2VuZCwgX19hLCBfVGFnKCkpOworCX0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0ludGVnZXI+CisgICAgICAgIHN0YXRpYyBfQ2hhclQqCisgICAgICAgIF9TX2NvbnN0cnVjdF9hdXgoX0ludGVnZXIgX19iZWcsIF9JbnRlZ2VyIF9fZW5kLAorCQkJIGNvbnN0IF9BbGxvYyYgX19hLCBfX3RydWVfdHlwZSkKKyAgICAgICAgeyByZXR1cm4gX1NfY29uc3RydWN0X2F1eF8yKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19iZWcpLAorCQkJCSAgICBfX2VuZCwgX19hKTsgfQorCisgICAgICBzdGF0aWMgX0NoYXJUKgorICAgICAgX1NfY29uc3RydWN0X2F1eF8yKHNpemVfdHlwZSBfX3JlcSwgX0NoYXJUIF9fYywgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgICB7IHJldHVybiBfU19jb25zdHJ1Y3QoX19yZXEsIF9fYywgX19hKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5JdGVyYXRvcj4KKyAgICAgICAgc3RhdGljIF9DaGFyVCoKKyAgICAgICAgX1NfY29uc3RydWN0KF9Jbkl0ZXJhdG9yIF9fYmVnLCBfSW5JdGVyYXRvciBfX2VuZCwgY29uc3QgX0FsbG9jJiBfX2EpCisJeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5JdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICByZXR1cm4gX1NfY29uc3RydWN0X2F1eChfX2JlZywgX19lbmQsIF9fYSwgX0ludGVncmFsKCkpOworICAgICAgICB9CisKKyAgICAgIC8vIEZvciBJbnB1dCBJdGVyYXRvcnMsIHVzZWQgaW4gaXN0cmVhbWJ1Zl9pdGVyYXRvcnMsIGV0Yy4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Jbkl0ZXJhdG9yPgorICAgICAgICBzdGF0aWMgX0NoYXJUKgorICAgICAgICAgX1NfY29uc3RydWN0KF9Jbkl0ZXJhdG9yIF9fYmVnLCBfSW5JdGVyYXRvciBfX2VuZCwgY29uc3QgX0FsbG9jJiBfX2EsCisJCSAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZyk7CisKKyAgICAgIC8vIEZvciBmb3J3YXJkX2l0ZXJhdG9ycyB1cCB0byByYW5kb21fYWNjZXNzX2l0ZXJhdG9ycywgdXNlZCBmb3IKKyAgICAgIC8vIHN0cmluZzo6aXRlcmF0b3IsIF9DaGFyVCosIGV0Yy4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Gd2RJdGVyYXRvcj4KKyAgICAgICAgc3RhdGljIF9DaGFyVCoKKyAgICAgICAgX1NfY29uc3RydWN0KF9Gd2RJdGVyYXRvciBfX2JlZywgX0Z3ZEl0ZXJhdG9yIF9fZW5kLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkJICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZyk7CisKKyAgICAgIHN0YXRpYyBfQ2hhclQqCisgICAgICBfU19jb25zdHJ1Y3Qoc2l6ZV90eXBlIF9fcmVxLCBfQ2hhclQgX19jLCBjb25zdCBfQWxsb2MmIF9fYSk7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29weSBzdWJzdHJpbmcgaW50byBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBjb3B5IHZhbHVlIGludG8uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29weS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byBjb3B5LgorICAgICAgICogIEByZXR1cm4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IGNvcGllZAorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIF9fcG9zID4gc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBDb3BpZXMgdXAgdG8gQGEgX19uIGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQgQGEgX19wb3MgaW50byB0aGUKKyAgICAgICAqICBDIHN0cmluZyBAYSBfX3MuICBJZiBAYSBfX3BvcyBpcyAlZ3JlYXRlciB0aGFuIHNpemUoKSwKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgY29weShfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3dhcCBjb250ZW50cyB3aXRoIGFub3RoZXIgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIFN0cmluZyB0byBzd2FwIHdpdGguCisgICAgICAgKgorICAgICAgICogIEV4Y2hhbmdlcyB0aGUgY29udGVudHMgb2YgdGhpcyBzdHJpbmcgd2l0aCB0aGF0IG9mIEBhIF9fcyBpbiBjb25zdGFudAorICAgICAgICogIHRpbWUuCisgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3dhcChiYXNpY19zdHJpbmcmIF9fcyk7CisKKyAgICAgIC8vIFN0cmluZyBvcGVyYXRpb25zOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gY29uc3QgcG9pbnRlciB0byBudWxsLXRlcm1pbmF0ZWQgY29udGVudHMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSBoYW5kbGUgdG8gaW50ZXJuYWwgZGF0YS4gIERvIG5vdCBtb2RpZnkgb3IgZGlyZSB0aGluZ3MgbWF5CisgICAgICAgKiAgaGFwcGVuLgorICAgICAgKi8KKyAgICAgIGNvbnN0IF9DaGFyVCoKKyAgICAgIGNfc3RyKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBjb25zdCBwb2ludGVyIHRvIGNvbnRlbnRzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgaGFuZGxlIHRvIGludGVybmFsIGRhdGEuICBEbyBub3QgbW9kaWZ5IG9yIGRpcmUgdGhpbmdzIG1heQorICAgICAgICogIGhhcHBlbi4KKyAgICAgICovCisgICAgICBjb25zdCBfQ2hhclQqCisgICAgICBkYXRhKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBjb3B5IG9mIGFsbG9jYXRvciB1c2VkIHRvIGNvbnN0cnVjdCB0aGlzIHN0cmluZy4KKyAgICAgICovCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV9kYXRhcGx1czsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBAYSBzIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2Ygc3RhcnQgb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgdGhlIGZpcnN0IEBhCisgICAgICAgKiAgX19uIGNoYXJhY3RlcnMgaW4gQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLAorICAgICAgICogIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IGJlZ2lucy4gIElmIG5vdCBmb3VuZCwgcmV0dXJucworICAgICAgICogIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIHN0YXJ0IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIHZhbHVlIG9mIEBhIF9fc3RyIHdpdGhpbgorICAgICAgICogIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IGJlZ2lucy4gIElmIG5vdAorICAgICAgICogIGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisJX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZpbmQoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2Ygc3RhcnQgb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgdGhlIHZhbHVlIG9mIEBhCisgICAgICAgKiAgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZQorICAgICAgICogIGl0IGJlZ2lucy4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmZpbmQoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgQGEgX19jIHdpdGhpbgorICAgICAgICogIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcworICAgICAgICogIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIHN0YXJ0IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIHZhbHVlIG9mIEBhCisgICAgICAgKiAgX19zdHIgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlCisgICAgICAgKiAgaXQgYmVnaW5zLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICByZmluZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorCV9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5yZmluZChfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2Ygc3RhcnQgb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgdGhlIGZpcnN0IEBhCisgICAgICAgKiAgX19uIGNoYXJhY3RlcnMgaW4gQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLAorICAgICAgICogIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IGJlZ2lucy4gIElmIG5vdCBmb3VuZCwgcmV0dXJucworICAgICAgICogIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc3RhcnQgc2VhcmNoIGF0IChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2Ygc3RhcnQgb2YgIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIHRoZSB2YWx1ZSBvZgorICAgICAgICogIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXgKKyAgICAgICAqICB3aGVyZSBpdCBiZWdpbnMuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+cmZpbmQoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgQGEgX19jIHdpdGhpbgorICAgICAgICogIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcworICAgICAgICogIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICByZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG9mIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIG9uZSBvZiB0aGUKKyAgICAgICAqICBjaGFyYWN0ZXJzIG9mIEBhIF9fc3RyIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLAorICAgICAgICogIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucworICAgICAgICogIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisJX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZpbmRfZmlyc3Rfb2YoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgb2YgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgU3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3Igb25lIG9mIHRoZQorICAgICAgICogIGZpcnN0IEBhIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZgorICAgICAgICogIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsCisgICAgICAgKiAgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG9mIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIG9uZSBvZiB0aGUKKyAgICAgICAqICBjaGFyYWN0ZXJzIG9mIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucworICAgICAgICogIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5maW5kX2ZpcnN0X29mKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAqICBAYSBfX2Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4CisgICAgICAgKiAgd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IGVxdWl2YWxlbnQgdG8gZmluZChfX2MsIF9fcG9zKS4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZpbmQoX19jLCBfX3Bvcyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgb2Ygc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIG9uZSBvZiB0aGUKKyAgICAgICAqICBjaGFyYWN0ZXJzIG9mIEBhIF9fc3RyIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLAorICAgICAgICogIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucworICAgICAgICogIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2xhc3Rfb2YoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKwlfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZF9sYXN0X29mKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgb2YgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcyB0byBzZWFyY2ggZm9yLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIG9uZSBvZiB0aGUKKyAgICAgICAqICBmaXJzdCBAYSBfX24gY2hhcmFjdGVycyBvZiBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYKKyAgICAgICAqICBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLAorICAgICAgICogIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgb2YgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3Igb25lIG9mIHRoZQorICAgICAgICogIGNoYXJhY3RlcnMgb2YgQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+ZmluZF9sYXN0X29mKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIEBhIF9fYyB3aXRoaW4KKyAgICAgICAqICB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMKKyAgICAgICAqICBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiBlcXVpdmFsZW50IHRvIHJmaW5kKF9fYywgX19wb3MpLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5yZmluZChfX2MsIF9fcG9zKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgYSBjaGFyYWN0ZXIgbm90IGNvbnRhaW5lZAorICAgICAgICogIGluIEBhIF9fc3RyIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdAorICAgICAgICogIHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKwlfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZF9maXJzdF9ub3Rfb2YoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIF9fcyB0byBjb25zaWRlci4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciBhIGNoYXJhY3RlciBub3QKKyAgICAgICAqICBjb250YWluZWQgaW4gdGhlIGZpcnN0IEBhIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcyB3aXRoaW4KKyAgICAgICAqICB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMKKyAgICAgICAqICBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcywKKwkJCXNpemVfdHlwZSBfX24pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciBhIGNoYXJhY3RlciBub3QKKyAgICAgICAqICBjb250YWluZWQgaW4gQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5maW5kX2ZpcnN0X25vdF9vZihfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBkaWZmZXJlbnQgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciBhIGNoYXJhY3RlcgorICAgICAgICogIG90aGVyIHRoYW4gQGEgX19jIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZQorICAgICAgICogIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKwlfR0xJQkNYWF9OT0VYQ0VQVDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIGEgY2hhcmFjdGVyCisgICAgICAgKiAgbm90IGNvbnRhaW5lZCBpbiBAYSBfX3N0ciB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMKKyAgICAgICAqICBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X25vdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorCV9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5maW5kX2xhc3Rfbm90X29mKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcyB0byBjb25zaWRlci4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBhIGNoYXJhY3RlciBub3QKKyAgICAgICAqICBjb250YWluZWQgaW4gdGhlIGZpcnN0IEBhIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsCisJCSAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdDsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG5vdCBpbiBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIGEgY2hhcmFjdGVyCisgICAgICAgKiAgbm90IGNvbnRhaW5lZCBpbiBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsCisgICAgICAgKiAgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5maW5kX2xhc3Rfbm90X29mKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgZGlmZmVyZW50IGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIGEgY2hhcmFjdGVyIG90aGVyIHRoYW4KKyAgICAgICAqICBAYSBfX2Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcworICAgICAgICogIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2xhc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisJX0dMSUJDWFhfTk9FWENFUFQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgR2V0IGEgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIChkZWZhdWx0IDApLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YnN0cmluZyAoZGVmYXVsdCByZW1haW5kZXIpLgorICAgICAgICogIEByZXR1cm4gIFRoZSBuZXcgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIF9fcG9zID4gc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIG5ldyBzdHJpbmcgdXNpbmcgdGhlIEBhIF9fbgorICAgICAgICogIGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQgQGEgX19wb3MuICBJZiB0aGUgc3RyaW5nIGlzIHRvbworICAgICAgICogIHNob3J0LCB1c2UgdGhlIHJlbWFpbmRlciBvZiB0aGUgY2hhcmFjdGVycy4gIElmIEBhIF9fcG9zIGlzCisgICAgICAgKiAgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHN0cmluZywgb3V0X29mX3JhbmdlIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcKKyAgICAgIHN1YnN0cihzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIGJhc2ljX3N0cmluZygqdGhpcywKKwkJCSAgICBfTV9jaGVjayhfX3BvcywgImJhc2ljX3N0cmluZzo6c3Vic3RyIiksIF9fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb21wYXJlIHRvIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcmV0dXJuICBJbnRlZ2VyIDwgMCwgMCwgb3IgPiAwLgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGFuIGludGVnZXIgPCAwIGlmIHRoaXMgc3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIEBhCisgICAgICAgKiAgX19zdHIsIDAgaWYgdGhlaXIgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBvciA+IDAgaWYgdGhpcworICAgICAgICogIHN0cmluZyBpcyBvcmRlcmVkIGFmdGVyIEBhIF9fc3RyLiAgRGV0ZXJtaW5lcyB0aGUgZWZmZWN0aXZlCisgICAgICAgKiAgbGVuZ3RoIHJsZW4gb2YgdGhlIHN0cmluZ3MgdG8gY29tcGFyZSBhcyB0aGUgc21hbGxlc3Qgb2YKKyAgICAgICAqICBzaXplKCkgYW5kIHN0ci5zaXplKCkuICBUaGUgZnVuY3Rpb24gdGhlbiBjb21wYXJlcyB0aGUgdHdvCisgICAgICAgKiAgc3RyaW5ncyBieSBjYWxsaW5nIHRyYWl0czo6Y29tcGFyZShkYXRhKCksIHN0ci5kYXRhKCkscmxlbikuCisgICAgICAgKiAgSWYgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyBub256ZXJvIHJldHVybnMgaXQsCisgICAgICAgKiAgb3RoZXJ3aXNlIHRoZSBzaG9ydGVyIG9uZSBpcyBvcmRlcmVkIGZpcnN0LgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKSBjb25zdAorICAgICAgeworCWNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisJY29uc3Qgc2l6ZV90eXBlIF9fb3NpemUgPSBfX3N0ci5zaXplKCk7CisJY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19zaXplLCBfX29zaXplKTsKKworCWludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZShfTV9kYXRhKCksIF9fc3RyLmRhdGEoKSwgX19sZW4pOworCWlmICghX19yKQorCSAgX19yID0gX1NfY29tcGFyZShfX3NpemUsIF9fb3NpemUpOworCXJldHVybiBfX3I7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSBzdWJzdHJpbmcgdG8gYSBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHJldHVybiAgSW50ZWdlciA8IDAsIDAsIG9yID4gMC4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybSB0aGUgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIGZyb20gdGhlIEBhIF9fbiBjaGFyYWN0ZXJzCisgICAgICAgKiAgc3RhcnRpbmcgYXQgQGEgX19wb3MuICBSZXR1cm5zIGFuIGludGVnZXIgPCAwIGlmIHRoZQorICAgICAgICogIHN1YnN0cmluZyBpcyBvcmRlcmVkIGJlZm9yZSBAYSBfX3N0ciwgMCBpZiB0aGVpciB2YWx1ZXMgYXJlCisgICAgICAgKiAgZXF1aXZhbGVudCwgb3IgPiAwIGlmIHRoZSBzdWJzdHJpbmcgaXMgb3JkZXJlZCBhZnRlciBAYQorICAgICAgICogIF9fc3RyLiAgRGV0ZXJtaW5lcyB0aGUgZWZmZWN0aXZlIGxlbmd0aCBybGVuIG9mIHRoZSBzdHJpbmdzCisgICAgICAgKiAgdG8gY29tcGFyZSBhcyB0aGUgc21hbGxlc3Qgb2YgdGhlIGxlbmd0aCBvZiB0aGUgc3Vic3RyaW5nCisgICAgICAgKiAgYW5kIEBhIF9fc3RyLnNpemUoKS4gIFRoZSBmdW5jdGlvbiB0aGVuIGNvbXBhcmVzIHRoZSB0d28KKyAgICAgICAqICBzdHJpbmdzIGJ5IGNhbGxpbmcKKyAgICAgICAqICB0cmFpdHM6OmNvbXBhcmUoc3Vic3RyaW5nLmRhdGEoKSxzdHIuZGF0YSgpLHJsZW4pLiAgSWYgdGhlCisgICAgICAgKiAgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwgb3RoZXJ3aXNlCisgICAgICAgKiAgdGhlIHNob3J0ZXIgb25lIGlzIG9yZGVyZWQgZmlyc3QuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSBzdWJzdHJpbmcgdG8gYSBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMSAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MyICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3Vic3RyaW5nIG9mIHN0ci4KKyAgICAgICAqICBAcGFyYW0gX19uMiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3Vic3RyaW5nIG9mIHN0ci4KKyAgICAgICAqICBAcmV0dXJuICBJbnRlZ2VyIDwgMCwgMCwgb3IgPiAwLgorICAgICAgICoKKyAgICAgICAqICBGb3JtIHRoZSBzdWJzdHJpbmcgb2YgdGhpcyBzdHJpbmcgZnJvbSB0aGUgQGEgX19uMQorICAgICAgICogIGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQgQGEgX19wb3MxLiAgRm9ybSB0aGUgc3Vic3RyaW5nIG9mIEBhCisgICAgICAgKiAgX19zdHIgZnJvbSB0aGUgQGEgX19uMiBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IEBhIF9fcG9zMi4KKyAgICAgICAqICBSZXR1cm5zIGFuIGludGVnZXIgPCAwIGlmIHRoaXMgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlCisgICAgICAgKiAgdGhlIHN1YnN0cmluZyBvZiBAYSBfX3N0ciwgMCBpZiB0aGVpciB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsCisgICAgICAgKiAgb3IgPiAwIGlmIHRoaXMgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYWZ0ZXIgdGhlIHN1YnN0cmluZyBvZgorICAgICAgICogIEBhIF9fc3RyLiAgRGV0ZXJtaW5lcyB0aGUgZWZmZWN0aXZlIGxlbmd0aCBybGVuIG9mIHRoZQorICAgICAgICogIHN0cmluZ3MgdG8gY29tcGFyZSBhcyB0aGUgc21hbGxlc3Qgb2YgdGhlIGxlbmd0aHMgb2YgdGhlCisgICAgICAgKiAgc3Vic3RyaW5ncy4gIFRoZSBmdW5jdGlvbiB0aGVuIGNvbXBhcmVzIHRoZSB0d28gc3RyaW5ncyBieQorICAgICAgICogIGNhbGxpbmcKKyAgICAgICAqICB0cmFpdHM6OmNvbXBhcmUoc3Vic3RyaW5nLmRhdGEoKSxzdHIuc3Vic3RyKHBvczIsbjIpLmRhdGEoKSxybGVuKS4KKyAgICAgICAqICBJZiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwKKyAgICAgICAqICBvdGhlcndpc2UgdGhlIHNob3J0ZXIgb25lIGlzIG9yZGVyZWQgZmlyc3QuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLAorCSAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb21wYXJlIHRvIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEByZXR1cm4gIEludGVnZXIgPCAwLCAwLCBvciA+IDAuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYW4gaW50ZWdlciA8IDAgaWYgdGhpcyBzdHJpbmcgaXMgb3JkZXJlZCBiZWZvcmUgQGEgX19zLCAwIGlmCisgICAgICAgKiAgdGhlaXIgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBvciA+IDAgaWYgdGhpcyBzdHJpbmcgaXMgb3JkZXJlZCBhZnRlcgorICAgICAgICogIEBhIF9fcy4gIERldGVybWluZXMgdGhlIGVmZmVjdGl2ZSBsZW5ndGggcmxlbiBvZiB0aGUgc3RyaW5ncyB0bworICAgICAgICogIGNvbXBhcmUgYXMgdGhlIHNtYWxsZXN0IG9mIHNpemUoKSBhbmQgdGhlIGxlbmd0aCBvZiBhIHN0cmluZworICAgICAgICogIGNvbnN0cnVjdGVkIGZyb20gQGEgX19zLiAgVGhlIGZ1bmN0aW9uIHRoZW4gY29tcGFyZXMgdGhlIHR3byBzdHJpbmdzCisgICAgICAgKiAgYnkgY2FsbGluZyB0cmFpdHM6OmNvbXBhcmUoZGF0YSgpLHMscmxlbikuICBJZiB0aGUgcmVzdWx0IG9mIHRoZQorICAgICAgICogIGNvbXBhcmlzb24gaXMgbm9uemVybyByZXR1cm5zIGl0LCBvdGhlcndpc2UgdGhlIHNob3J0ZXIgb25lIGlzCisgICAgICAgKiAgb3JkZXJlZCBmaXJzdC4KKyAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0OworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA1IFN0cmluZzo6Y29tcGFyZSBzcGVjaWZpY2F0aW9uIHF1ZXN0aW9uYWJsZQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb21wYXJlIHN1YnN0cmluZyB0byBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcmV0dXJuICBJbnRlZ2VyIDwgMCwgMCwgb3IgPiAwLgorICAgICAgICoKKyAgICAgICAqICBGb3JtIHRoZSBzdWJzdHJpbmcgb2YgdGhpcyBzdHJpbmcgZnJvbSB0aGUgQGEgX19uMQorICAgICAgICogIGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQgQGEgcG9zLiAgUmV0dXJucyBhbiBpbnRlZ2VyIDwgMCBpZgorICAgICAgICogIHRoZSBzdWJzdHJpbmcgaXMgb3JkZXJlZCBiZWZvcmUgQGEgX19zLCAwIGlmIHRoZWlyIHZhbHVlcworICAgICAgICogIGFyZSBlcXVpdmFsZW50LCBvciA+IDAgaWYgdGhlIHN1YnN0cmluZyBpcyBvcmRlcmVkIGFmdGVyIEBhCisgICAgICAgKiAgX19zLiAgRGV0ZXJtaW5lcyB0aGUgZWZmZWN0aXZlIGxlbmd0aCBybGVuIG9mIHRoZSBzdHJpbmdzIHRvCisgICAgICAgKiAgY29tcGFyZSBhcyB0aGUgc21hbGxlc3Qgb2YgdGhlIGxlbmd0aCBvZiB0aGUgc3Vic3RyaW5nIGFuZAorICAgICAgICogIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcgY29uc3RydWN0ZWQgZnJvbSBAYSBfX3MuICBUaGUKKyAgICAgICAqICBmdW5jdGlvbiB0aGVuIGNvbXBhcmVzIHRoZSB0d28gc3RyaW5nIGJ5IGNhbGxpbmcKKyAgICAgICAqICB0cmFpdHM6OmNvbXBhcmUoc3Vic3RyaW5nLmRhdGEoKSxfX3MscmxlbikuICBJZiB0aGUgcmVzdWx0IG9mCisgICAgICAgKiAgdGhlIGNvbXBhcmlzb24gaXMgbm9uemVybyByZXR1cm5zIGl0LCBvdGhlcndpc2UgdGhlIHNob3J0ZXIKKyAgICAgICAqICBvbmUgaXMgb3JkZXJlZCBmaXJzdC4KKyAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbXBhcmUgc3Vic3RyaW5nIGFnYWluc3QgYSBjaGFyYWN0ZXIgJWFycmF5LgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIGNoYXJhY3RlciAlYXJyYXkgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEBwYXJhbSBfX24yICBOdW1iZXIgb2YgY2hhcmFjdGVycyBvZiBzLgorICAgICAgICogIEByZXR1cm4gIEludGVnZXIgPCAwLCAwLCBvciA+IDAuCisgICAgICAgKgorICAgICAgICogIEZvcm0gdGhlIHN1YnN0cmluZyBvZiB0aGlzIHN0cmluZyBmcm9tIHRoZSBAYSBfX24xCisgICAgICAgKiAgY2hhcmFjdGVycyBzdGFydGluZyBhdCBAYSBfX3Bvcy4gIEZvcm0gYSBzdHJpbmcgZnJvbSB0aGUKKyAgICAgICAqICBmaXJzdCBAYSBfX24yIGNoYXJhY3RlcnMgb2YgQGEgX19zLiAgUmV0dXJucyBhbiBpbnRlZ2VyIDwgMAorICAgICAgICogIGlmIHRoaXMgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIHRoZSBzdHJpbmcgZnJvbSBAYSBfX3MsCisgICAgICAgKiAgMCBpZiB0aGVpciB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIG9yID4gMCBpZiB0aGlzIHN1YnN0cmluZworICAgICAgICogIGlzIG9yZGVyZWQgYWZ0ZXIgdGhlIHN0cmluZyBmcm9tIEBhIF9fcy4gIERldGVybWluZXMgdGhlCisgICAgICAgKiAgZWZmZWN0aXZlIGxlbmd0aCBybGVuIG9mIHRoZSBzdHJpbmdzIHRvIGNvbXBhcmUgYXMgdGhlCisgICAgICAgKiAgc21hbGxlc3Qgb2YgdGhlIGxlbmd0aCBvZiB0aGUgc3Vic3RyaW5nIGFuZCBAYSBfX24yLiAgVGhlCisgICAgICAgKiAgZnVuY3Rpb24gdGhlbiBjb21wYXJlcyB0aGUgdHdvIHN0cmluZ3MgYnkgY2FsbGluZworICAgICAgICogIHRyYWl0czo6Y29tcGFyZShzdWJzdHJpbmcuZGF0YSgpLHMscmxlbikuICBJZiB0aGUgcmVzdWx0IG9mCisgICAgICAgKiAgdGhlIGNvbXBhcmlzb24gaXMgbm9uemVybyByZXR1cm5zIGl0LCBvdGhlcndpc2UgdGhlIHNob3J0ZXIKKyAgICAgICAqICBvbmUgaXMgb3JkZXJlZCBmaXJzdC4KKyAgICAgICAqCisgICAgICAgKiAgTkI6IHMgbXVzdCBoYXZlIGF0IGxlYXN0IG4yIGNoYXJhY3RlcnMsICZhcG9zO1xcMCZhcG9zOyBoYXMKKyAgICAgICAqICBubyBzcGVjaWFsIG1lYW5pbmcuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCSAgICAgIHNpemVfdHlwZSBfX24yKSBjb25zdDsKKyAgfTsKKworICAvLyBvcGVyYXRvcisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbmNhdGVuYXRlIHR3byBzdHJpbmdzLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIExhc3Qgc3RyaW5nLgorICAgKiAgQHJldHVybiAgTmV3IHN0cmluZyB3aXRoIHZhbHVlIG9mIEBhIF9fbGhzIGZvbGxvd2VkIGJ5IEBhIF9fcmhzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7CisgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9fc3RyKF9fbGhzKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX3Jocyk7CisgICAgICByZXR1cm4gX19zdHI7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25jYXRlbmF0ZSBDIHN0cmluZyBhbmQgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIExhc3Qgc3RyaW5nLgorICAgKiAgQHJldHVybiAgTmV3IHN0cmluZyB3aXRoIHZhbHVlIG9mIEBhIF9fbGhzIGZvbGxvd2VkIGJ5IEBhIF9fcmhzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19yaHMpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25jYXRlbmF0ZSBjaGFyYWN0ZXIgYW5kIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBMYXN0IHN0cmluZy4KKyAgICogIEByZXR1cm4gIE5ldyBzdHJpbmcgd2l0aCBAYSBfX2xocyBmb2xsb3dlZCBieSBAYSBfX3Jocy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+CisgICAgb3BlcmF0b3IrKF9DaGFyVCBfX2xocywgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9fcmhzKTsKKworICAvKioKKyAgICogIEBicmllZiAgQ29uY2F0ZW5hdGUgc3RyaW5nIGFuZCBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBMYXN0IHN0cmluZy4KKyAgICogIEByZXR1cm4gIE5ldyBzdHJpbmcgd2l0aCBAYSBfX2xocyBmb2xsb3dlZCBieSBAYSBfX3Jocy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7CisgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9fc3RyKF9fbGhzKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX3Jocyk7CisgICAgICByZXR1cm4gX19zdHI7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25jYXRlbmF0ZSBzdHJpbmcgYW5kIGNoYXJhY3Rlci4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBMYXN0IHN0cmluZy4KKyAgICogIEByZXR1cm4gIE5ldyBzdHJpbmcgd2l0aCBAYSBfX2xocyBmb2xsb3dlZCBieSBAYSBfX3Jocy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLCBfQ2hhclQgX19yaHMpCisgICAgeworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CV9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc3RyaW5nX3R5cGU6OnNpemVfdHlwZQkJX19zaXplX3R5cGU7CisgICAgICBfX3N0cmluZ190eXBlIF9fc3RyKF9fbGhzKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX3NpemVfdHlwZSgxKSwgX19yaHMpOworICAgICAgcmV0dXJuIF9fc3RyOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYmIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX2xocy5hcHBlbmQoX19yaHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mJiBfX3JocykKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19yaHMuaW5zZXJ0KDAsIF9fbGhzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiYgX19saHMsCisJICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYmIF9fcmhzKQorICAgIHsKKyAgICAgIGNvbnN0IGF1dG8gX19zaXplID0gX19saHMuc2l6ZSgpICsgX19yaHMuc2l6ZSgpOworICAgICAgY29uc3QgYm9vbCBfX2NvbmQgPSAoX19zaXplID4gX19saHMuY2FwYWNpdHkoKQorCQkJICAgJiYgX19zaXplIDw9IF9fcmhzLmNhcGFjaXR5KCkpOworICAgICAgcmV0dXJuIF9fY29uZCA/IHN0ZDo6bW92ZShfX3Jocy5pbnNlcnQoMCwgX19saHMpKQorCSAgICAgICAgICAgIDogc3RkOjptb3ZlKF9fbGhzLmFwcGVuZChfX3JocykpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mJiBfX3JocykKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19yaHMuaW5zZXJ0KDAsIF9fbGhzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhfQ2hhclQgX19saHMsCisJICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYmIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX3Jocy5pbnNlcnQoMCwgMSwgX19saHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mJiBfX2xocywKKwkgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX2xocy5hcHBlbmQoX19yaHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mJiBfX2xocywKKwkgICAgICBfQ2hhclQgX19yaHMpCisgICAgeyByZXR1cm4gc3RkOjptb3ZlKF9fbGhzLmFwcGVuZCgxLCBfX3JocykpOyB9CisjZW5kaWYKKworICAvLyBvcGVyYXRvciA9PQorICAvKioKKyAgICogIEBicmllZiAgVGVzdCBlcXVpdmFsZW5jZSBvZiB0d28gc3RyaW5ncy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTZWNvbmQgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocy5jb21wYXJlKEBhIF9fcmhzKSA9PSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA9PSAwOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVD46Ol9fdmFsdWUsIGJvb2w+OjpfX3R5cGUKKyAgICBvcGVyYXRvcj09KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQ+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVD4mIF9fcmhzKQorICAgIHsgcmV0dXJuIChfX2xocy5zaXplKCkgPT0gX19yaHMuc2l6ZSgpCisJICAgICAgJiYgIXN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPjo6Y29tcGFyZShfX2xocy5kYXRhKCksIF9fcmhzLmRhdGEoKSwKKwkJCQkJCSAgICBfX2xocy5zaXplKCkpKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGVxdWl2YWxlbmNlIG9mIEMgc3RyaW5nIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fcmhzLmNvbXBhcmUoQGEgX19saHMpID09IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocykgPT0gMDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGVxdWl2YWxlbmNlIG9mIHN0cmluZyBhbmQgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIFN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzLmNvbXBhcmUoQGEgX19yaHMpID09IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPT0gMDsgfQorCisgIC8vIG9wZXJhdG9yICE9CisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGRpZmZlcmVuY2Ugb2YgdHdvIHN0cmluZ3MuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU2Vjb25kIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMuY29tcGFyZShAYSBfX3JocykgIT0gMC4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBkaWZmZXJlbmNlIG9mIEMgc3RyaW5nIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fcmhzLmNvbXBhcmUoQGEgX19saHMpICE9IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBkaWZmZXJlbmNlIG9mIHN0cmluZyBhbmQgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIFN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzLmNvbXBhcmUoQGEgX19yaHMpICE9IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvLyBvcGVyYXRvciA8CisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIHN0cmluZyBwcmVjZWRlcyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU2Vjb25kIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgcHJlY2VkZXMgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgcHJlY2VkZXMgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIFN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIHByZWNlZGVzIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBDIHN0cmluZyBwcmVjZWRlcyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIHByZWNlZGVzIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzKSA+IDA7IH0KKworICAvLyBvcGVyYXRvciA+CisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIHN0cmluZyBmb2xsb3dzIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTZWNvbmQgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBmb2xsb3dzIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPiAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGZvbGxvd3MgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIFN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIGZvbGxvd3MgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID4gMDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIEMgc3RyaW5nIGZvbGxvd3Mgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBmb2xsb3dzIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzKSA8IDA7IH0KKworICAvLyBvcGVyYXRvciA8PQorICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgZG9lc24ndCBmb2xsb3cgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIGRvZXNuJ3QgZm9sbG93IEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGRvZXNuJ3QgZm9sbG93IEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIEMgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBkb2Vzbid0IGZvbGxvdyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgQyBzdHJpbmcgZG9lc24ndCBmb2xsb3cgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBkb2Vzbid0IGZvbGxvdyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzKSA+PSAwOyB9CisKKyAgLy8gb3BlcmF0b3IgPj0KKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGRvZXNuJ3QgcHJlY2VkZSBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU2Vjb25kIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZG9lc24ndCBwcmVjZWRlIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGRvZXNuJ3QgcHJlY2VkZSBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgU3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBDIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZG9lc24ndCBwcmVjZWRlIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID49IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBDIHN0cmluZyBkb2Vzbid0IHByZWNlZGUgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBkb2Vzbid0IHByZWNlZGUgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpIDw9IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgU3dhcCBjb250ZW50cyBvZiB0d28gc3RyaW5ncy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTZWNvbmQgc3RyaW5nLgorICAgKgorICAgKiAgRXhjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBAYSBfX2xocyBhbmQgQGEgX19yaHMgaW4gY29uc3RhbnQgdGltZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWFkIHN0cmVhbSBpbnRvIGEgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9faXMgIElucHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSBfX3N0ciAgQnVmZmVyIHRvIHN0b3JlIGludG8uCisgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogIFN0b3JlcyBjaGFyYWN0ZXJzIGZyb20gQGEgX19pcyBpbnRvIEBhIF9fc3RyIHVudGlsIHdoaXRlc3BhY2UgaXMKKyAgICogIGZvdW5kLCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgZW5jb3VudGVyZWQsIG9yIHN0ci5tYXhfc2l6ZSgpCisgICAqICBpcyByZWFjaGVkLiAgSWYgaXMud2lkdGgoKSBpcyBub24temVybywgdGhhdCBpcyB0aGUgbGltaXQgb24gdGhlCisgICAqICBudW1iZXIgb2YgY2hhcmFjdGVycyBzdG9yZWQgaW50byBAYSBfX3N0ci4gIEFueSBwcmV2aW91cworICAgKiAgY29udGVudHMgb2YgQGEgX19zdHIgYXJlIGVyYXNlZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zdHIpOworCisgIHRlbXBsYXRlPD4KKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyPiYgX19pcywgYmFzaWNfc3RyaW5nPGNoYXI+JiBfX3N0cik7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFdyaXRlIHN0cmluZyB0byBhIHN0cmVhbS4KKyAgICogIEBwYXJhbSBfX29zICBPdXRwdXQgc3RyZWFtLgorICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgdG8gd3JpdGUgb3V0LgorICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgKgorICAgKiAgT3V0cHV0IGNoYXJhY3RlcnMgb2YgQGEgX19zdHIgaW50byBvcyBmb2xsb3dpbmcgdGhlIHNhbWUgcnVsZXMgYXMgZm9yCisgICAqICB3cml0aW5nIGEgQyBzdHJpbmcuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3N0cikKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA1ODYuIHN0cmluZyBpbnNlcnRlciBub3QgYSBmb3JtYXR0ZWQgZnVuY3Rpb24KKyAgICAgIHJldHVybiBfX29zdHJlYW1faW5zZXJ0KF9fb3MsIF9fc3RyLmRhdGEoKSwgX19zdHIuc2l6ZSgpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJlYWQgYSBsaW5lIGZyb20gc3RyZWFtIGludG8gYSBzdHJpbmcuCisgICAqICBAcGFyYW0gX19pcyAgSW5wdXQgc3RyZWFtLgorICAgKiAgQHBhcmFtIF9fc3RyICBCdWZmZXIgdG8gc3RvcmUgaW50by4KKyAgICogIEBwYXJhbSBfX2RlbGltICBDaGFyYWN0ZXIgbWFya2luZyBlbmQgb2YgbGluZS4KKyAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiAgU3RvcmVzIGNoYXJhY3RlcnMgZnJvbSBAYSBfX2lzIGludG8gQGEgX19zdHIgdW50aWwgQGEgX19kZWxpbSBpcworICAgKiAgZm91bmQsIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyBlbmNvdW50ZXJlZCwgb3Igc3RyLm1heF9zaXplKCkKKyAgICogIGlzIHJlYWNoZWQuICBBbnkgcHJldmlvdXMgY29udGVudHMgb2YgQGEgX19zdHIgYXJlIGVyYXNlZC4gIElmCisgICAqICBAYSBfX2RlbGltIGlzIGVuY291bnRlcmVkLCBpdCBpcyBleHRyYWN0ZWQgYnV0IG5vdCBzdG9yZWQgaW50bworICAgKiAgQGEgX19zdHIuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fc3RyLCBfQ2hhclQgX19kZWxpbSk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJlYWQgYSBsaW5lIGZyb20gc3RyZWFtIGludG8gYSBzdHJpbmcuCisgICAqICBAcGFyYW0gX19pcyAgSW5wdXQgc3RyZWFtLgorICAgKiAgQHBhcmFtIF9fc3RyICBCdWZmZXIgdG8gc3RvcmUgaW50by4KKyAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiAgU3RvcmVzIGNoYXJhY3RlcnMgZnJvbSBpcyBpbnRvIEBhIF9fc3RyIHVudGlsICZhcG9zO1xuJmFwb3M7IGlzCisgICAqICBmb3VuZCwgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGlzIGVuY291bnRlcmVkLCBvciBzdHIubWF4X3NpemUoKQorICAgKiAgaXMgcmVhY2hlZC4gIEFueSBwcmV2aW91cyBjb250ZW50cyBvZiBAYSBfX3N0ciBhcmUgZXJhc2VkLiAgSWYKKyAgICogIGVuZCBvZiBsaW5lIGlzIGVuY291bnRlcmVkLCBpdCBpcyBleHRyYWN0ZWQgYnV0IG5vdCBzdG9yZWQgaW50bworICAgKiAgQGEgX19zdHIuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3N0cikKKyAgICB7IHJldHVybiBnZXRsaW5lKF9faXMsIF9fc3RyLCBfX2lzLndpZGVuKCdcbicpKTsgfQorCisgIHRlbXBsYXRlPD4KKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+JgorICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTxjaGFyPiYgX19pbiwgYmFzaWNfc3RyaW5nPGNoYXI+JiBfX3N0ciwKKwkgICAgY2hhciBfX2RlbGltKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICBiYXNpY19pc3RyZWFtPHdjaGFyX3Q+JgorICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTx3Y2hhcl90PiYgX19pbiwgYmFzaWNfc3RyaW5nPHdjaGFyX3Q+JiBfX3N0ciwKKwkgICAgd2NoYXJfdCBfX2RlbGltKTsKKyNlbmRpZiAgCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmICgoX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfQzk5KSBcCisgICAgICYmICFkZWZpbmVkKF9HTElCQ1hYX0hBVkVfQlJPS0VOX1ZTV1BSSU5URikpCisKKyNpbmNsdWRlIDxleHQvc3RyaW5nX2NvbnZlcnNpb25zLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyAyMS40IE51bWVyaWMgQ29udmVyc2lvbnMgW3N0cmluZy5jb252ZXJzaW9uc10uCisgIGlubGluZSBpbnQKKyAgc3RvaShjb25zdCBzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYTxsb25nLCBpbnQ+KCZzdGQ6OnN0cnRvbCwgInN0b2kiLCBfX3N0ci5jX3N0cigpLAorCQkJCQlfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSBsb25nCisgIHN0b2woY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6c3RydG9sLCAic3RvbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIHVuc2lnbmVkIGxvbmcKKyAgc3RvdWwoY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6c3RydG91bCwgInN0b3VsIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nCisgIHN0b2xsKGNvbnN0IHN0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvbGwsICJzdG9sbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworICBzdG91bGwoY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6c3RydG91bGwsICJzdG91bGwiLCBfX3N0ci5jX3N0cigpLAorCQkJICAgICBfX2lkeCwgX19iYXNlKTsgfQorCisgIC8vIE5COiBzdHJ0b2YgdnMgc3RydG9kLgorICBpbmxpbmUgZmxvYXQKKyAgc3RvZihjb25zdCBzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6c3RydG9mLCAic3RvZiIsIF9fc3RyLmNfc3RyKCksIF9faWR4KTsgfQorCisgIGlubGluZSBkb3VibGUKKyAgc3RvZChjb25zdCBzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6c3RydG9kLCAic3RvZCIsIF9fc3RyLmNfc3RyKCksIF9faWR4KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBzdG9sZChjb25zdCBzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6c3RydG9sZCwgInN0b2xkIiwgX19zdHIuY19zdHIoKSwgX19pZHgpOyB9CisKKyAgLy8gTkI6ICh2KXNucHJpbnRmIHZzIHNwcmludGYuCisKKyAgLy8gRFIgMTI2MS4KKyAgaW5saW5lIHN0cmluZworICB0b19zdHJpbmcoaW50IF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwgNCAqIHNpemVvZihpbnQpLAorCQkJCQkgICAiJWQiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgc3RyaW5nCisgIHRvX3N0cmluZyh1bnNpZ25lZCBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8c3RyaW5nPigmc3RkOjp2c25wcmludGYsCisJCQkJCSAgIDQgKiBzaXplb2YodW5zaWduZWQpLAorCQkJCQkgICAiJXUiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgc3RyaW5nCisgIHRvX3N0cmluZyhsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwgNCAqIHNpemVvZihsb25nKSwKKwkJCQkJICAgIiVsZCIsIF9fdmFsKTsgfQorCisgIGlubGluZSBzdHJpbmcKKyAgdG9fc3RyaW5nKHVuc2lnbmVkIGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLAorCQkJCQkgICA0ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAorCQkJCQkgICAiJWx1IiwgX192YWwpOyB9CisKKyAgaW5saW5lIHN0cmluZworICB0b19zdHJpbmcobG9uZyBsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwKKwkJCQkJICAgNCAqIHNpemVvZihsb25nIGxvbmcpLAorCQkJCQkgICAiJWxsZCIsIF9fdmFsKTsgfQorCisgIGlubGluZSBzdHJpbmcKKyAgdG9fc3RyaW5nKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8c3RyaW5nPigmc3RkOjp2c25wcmludGYsCisJCQkJCSAgIDQgKiBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSwKKwkJCQkJICAgIiVsbHUiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgc3RyaW5nCisgIHRvX3N0cmluZyhmbG9hdCBfX3ZhbCkKKyAgeworICAgIGNvbnN0IGludCBfX24gPSAKKyAgICAgIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxmbG9hdD46Ol9fbWF4X2V4cG9uZW50MTAgKyAyMDsKKyAgICByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8c3RyaW5nPigmc3RkOjp2c25wcmludGYsIF9fbiwKKwkJCQkJICAgIiVmIiwgX192YWwpOworICB9CisKKyAgaW5saW5lIHN0cmluZworICB0b19zdHJpbmcoZG91YmxlIF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9IAorICAgICAgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGRvdWJsZT46Ol9fbWF4X2V4cG9uZW50MTAgKyAyMDsKKyAgICByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8c3RyaW5nPigmc3RkOjp2c25wcmludGYsIF9fbiwKKwkJCQkJICAgIiVmIiwgX192YWwpOworICB9CisKKyAgaW5saW5lIHN0cmluZworICB0b19zdHJpbmcobG9uZyBkb3VibGUgX192YWwpCisgIHsKKyAgICBjb25zdCBpbnQgX19uID0gCisgICAgICBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8bG9uZyBkb3VibGU+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLCBfX24sCisJCQkJCSAgICIlTGYiLCBfX3ZhbCk7CisgIH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGlubGluZSBpbnQgCisgIHN0b2koY29uc3Qgd3N0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hPGxvbmcsIGludD4oJnN0ZDo6d2NzdG9sLCAic3RvaSIsIF9fc3RyLmNfc3RyKCksCisJCQkJCV9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIGxvbmcgCisgIHN0b2woY29uc3Qgd3N0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6Ondjc3RvbCwgInN0b2wiLCBfX3N0ci5jX3N0cigpLAorCQkJICAgICBfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSB1bnNpZ25lZCBsb25nCisgIHN0b3VsKGNvbnN0IHdzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b3VsLCAic3RvdWwiLCBfX3N0ci5jX3N0cigpLAorCQkJICAgICBfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSBsb25nIGxvbmcKKyAgc3RvbGwoY29uc3Qgd3N0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6Ondjc3RvbGwsICJzdG9sbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworICBzdG91bGwoY29uc3Qgd3N0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6Ondjc3RvdWxsLCAic3RvdWxsIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICAvLyBOQjogd2NzdG9mIHZzIHdjc3RvZC4KKyAgaW5saW5lIGZsb2F0CisgIHN0b2YoY29uc3Qgd3N0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b2YsICJzdG9mIiwgX19zdHIuY19zdHIoKSwgX19pZHgpOyB9CisKKyAgaW5saW5lIGRvdWJsZQorICBzdG9kKGNvbnN0IHdzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG9kLCAic3RvZCIsIF9fc3RyLmNfc3RyKCksIF9faWR4KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBzdG9sZChjb25zdCB3c3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6Ondjc3RvbGQsICJzdG9sZCIsIF9fc3RyLmNfc3RyKCksIF9faWR4KTsgfQorCisgIC8vIERSIDEyNjEuCisgIGlubGluZSB3c3RyaW5nCisgIHRvX3dzdHJpbmcoaW50IF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzx3c3RyaW5nPigmc3RkOjp2c3dwcmludGYsIDQgKiBzaXplb2YoaW50KSwKKwkJCQkJICAgIEwiJWQiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgd3N0cmluZworICB0b193c3RyaW5nKHVuc2lnbmVkIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzx3c3RyaW5nPigmc3RkOjp2c3dwcmludGYsCisJCQkJCSAgICA0ICogc2l6ZW9mKHVuc2lnbmVkKSwKKwkJCQkJICAgIEwiJXUiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgd3N0cmluZworICB0b193c3RyaW5nKGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHdzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwgNCAqIHNpemVvZihsb25nKSwKKwkJCQkJICAgIEwiJWxkIiwgX192YWwpOyB9CisKKyAgaW5saW5lIHdzdHJpbmcKKyAgdG9fd3N0cmluZyh1bnNpZ25lZCBsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzx3c3RyaW5nPigmc3RkOjp2c3dwcmludGYsCisJCQkJCSAgICA0ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAorCQkJCQkgICAgTCIlbHUiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgd3N0cmluZworICB0b193c3RyaW5nKGxvbmcgbG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8d3N0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLAorCQkJCQkgICAgNCAqIHNpemVvZihsb25nIGxvbmcpLAorCQkJCQkgICAgTCIlbGxkIiwgX192YWwpOyB9CisKKyAgaW5saW5lIHdzdHJpbmcKKyAgdG9fd3N0cmluZyh1bnNpZ25lZCBsb25nIGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHdzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwKKwkJCQkJICAgIDQgKiBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSwKKwkJCQkJICAgIEwiJWxsdSIsIF9fdmFsKTsgfQorCisgIGlubGluZSB3c3RyaW5nCisgIHRvX3dzdHJpbmcoZmxvYXQgX192YWwpCisgIHsKKyAgICBjb25zdCBpbnQgX19uID0KKyAgICAgIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxmbG9hdD46Ol9fbWF4X2V4cG9uZW50MTAgKyAyMDsKKyAgICByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8d3N0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLCBfX24sCisJCQkJCSAgICBMIiVmIiwgX192YWwpOworICB9CisKKyAgaW5saW5lIHdzdHJpbmcKKyAgdG9fd3N0cmluZyhkb3VibGUgX192YWwpCisgIHsKKyAgICBjb25zdCBpbnQgX19uID0KKyAgICAgIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxkb3VibGU+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHdzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwgX19uLAorCQkJCQkgICAgTCIlZiIsIF9fdmFsKTsKKyAgfQorCisgIGlubGluZSB3c3RyaW5nCisgIHRvX3dzdHJpbmcobG9uZyBkb3VibGUgX192YWwpCisgIHsKKyAgICBjb25zdCBpbnQgX19uID0KKyAgICAgIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxsb25nIGRvdWJsZT46Ol9fbWF4X2V4cG9uZW50MTAgKyAyMDsKKyAgICByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8d3N0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLCBfX24sCisJCQkJCSAgICBMIiVMZiIsIF9fdmFsKTsKKyAgfQorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIEMrKzExICYmIF9HTElCQ1hYX1VTRV9DOTkgLi4uICovCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0aW9uYWxfaGFzaC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gRFIgMTE4Mi4KKworI2lmbmRlZiBfR0xJQkNYWF9DT01QQVRJQklMSVRZX0NYWDBYCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHN0cmluZy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHN0cmluZz4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIHN0cmluZz4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3Qgc3RyaW5nJiBfX3MpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19zLmRhdGEoKSwgX19zLmxlbmd0aCgpKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2Zhc3RfaGFzaDxoYXNoPHN0cmluZz4+IDogc3RkOjpmYWxzZV90eXBlCisgICAgeyB9OworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3Igd3N0cmluZy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHdzdHJpbmc+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCB3c3RyaW5nPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCB3c3RyaW5nJiBfX3MpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19zLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3MubGVuZ3RoKCkgKiBzaXplb2Yod2NoYXJfdCkpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfZmFzdF9oYXNoPGhhc2g8d3N0cmluZz4+IDogc3RkOjpmYWxzZV90eXBlCisgICAgeyB9OworI2VuZGlmCisjZW5kaWYgLyogX0dMSUJDWFhfQ09NUEFUSUJJTElUWV9DWFgwWCAqLworCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHUxNnN0cmluZy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHUxNnN0cmluZz4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIHUxNnN0cmluZz4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdTE2c3RyaW5nJiBfX3MpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19zLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3MubGVuZ3RoKCkgKiBzaXplb2YoY2hhcjE2X3QpKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2Zhc3RfaGFzaDxoYXNoPHUxNnN0cmluZz4+IDogc3RkOjpmYWxzZV90eXBlCisgICAgeyB9OworCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHUzMnN0cmluZy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHUzMnN0cmluZz4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIHUzMnN0cmluZz4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdTMyc3RyaW5nJiBfX3MpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19zLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3MubGVuZ3RoKCkgKiBzaXplb2YoY2hhcjMyX3QpKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2Zhc3RfaGFzaDxoYXNoPHUzMnN0cmluZz4+IDogc3RkOjpmYWxzZV90eXBlCisgICAgeyB9OworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZiAvKiBfQkFTSUNfU1RSSU5HX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9iYXNpY19zdHJpbmcudGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2Jhc2ljX3N0cmluZy50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3ZWI3NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9iYXNpY19zdHJpbmcudGNjCkBAIC0wLDAgKzEsMTE2NiBAQAorLy8gQ29tcG9uZW50cyBmb3IgbWFuaXB1bGF0aW5nIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2Jhc2ljX3N0cmluZy50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtzdHJpbmd9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIxICBTdHJpbmdzIGxpYnJhcnkKKy8vCisKKy8vIFdyaXR0ZW4gYnkgSmFzb24gTWVycmlsbCBiYXNlZCB1cG9uIHRoZSBzcGVjaWZpY2F0aW9uIGJ5IFRha2Fub3JpIEFkYWNoaQorLy8gaW4gQU5TSSBYM0oxNi85NC0wMDEzUjIuICBSZXdyaXR0ZW4gYnkgTmF0aGFuIE15ZXJzIHRvIElTTy0xNDg4Mi4KKworI2lmbmRlZiBfQkFTSUNfU1RSSU5HX1RDQworI2RlZmluZSBfQkFTSUNfU1RSSU5HX1RDQyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvY3h4YWJpX2ZvcmNlZC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY29uc3QgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX1JlcDo6X1NfbWF4X3NpemUgPSAoKChucG9zIC0gc2l6ZW9mKF9SZXBfYmFzZSkpL3NpemVvZihfQ2hhclQpKSAtIDEpIC8gNDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjb25zdCBfQ2hhclQKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfUmVwOjpfU190ZXJtaW5hbCA9IF9DaGFyVCgpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNvbnN0IHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Om5wb3M7CisKKyAgLy8gTGlua2VyIHNldHMgX1NfZW1wdHlfcmVwX3N0b3JhZ2UgdG8gYWxsIDBzIChvbmUgcmVmZXJlbmNlLCBlbXB0eSBzdHJpbmcpCisgIC8vIGF0IHN0YXRpYyBpbml0IHRpbWUgKGJlZm9yZSBzdGF0aWMgY3RvcnMgYXJlIHJ1bikuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9SZXA6Ol9TX2VtcHR5X3JlcF9zdG9yYWdlWworICAgIChzaXplb2YoX1JlcF9iYXNlKSArIHNpemVvZihfQ2hhclQpICsgc2l6ZW9mKHNpemVfdHlwZSkgLSAxKSAvCisgICAgICBzaXplb2Yoc2l6ZV90eXBlKV07CisKKyAgLy8gTkI6IFRoaXMgaXMgdGhlIHNwZWNpYWwgY2FzZSBmb3IgSW5wdXQgSXRlcmF0b3JzLCB1c2VkIGluCisgIC8vIGlzdHJlYW1idWZfaXRlcmF0b3JzLCBldGMuCisgIC8vIElucHV0IEl0ZXJhdG9ycyBoYXZlIGEgY29zdCBzdHJ1Y3R1cmUgdmVyeSBkaWZmZXJlbnQgZnJvbQorICAvLyBwb2ludGVycywgY2FsbGluZyBmb3IgYSBkaWZmZXJlbnQgY29kaW5nIHN0eWxlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyYXRvcj4KKyAgICAgIF9DaGFyVCoKKyAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgICAgX1NfY29uc3RydWN0KF9Jbkl0ZXJhdG9yIF9fYmVnLCBfSW5JdGVyYXRvciBfX2VuZCwgY29uc3QgX0FsbG9jJiBfX2EsCisJCSAgIGlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKyNpZiBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORyA9PSAwCisJaWYgKF9fYmVnID09IF9fZW5kICYmIF9fYSA9PSBfQWxsb2MoKSkKKwkgIHJldHVybiBfU19lbXB0eV9yZXAoKS5fTV9yZWZkYXRhKCk7CisjZW5kaWYKKwkvLyBBdm9pZCByZWFsbG9jYXRpb24gZm9yIGNvbW1vbiBjYXNlLgorCV9DaGFyVCBfX2J1ZlsxMjhdOworCXNpemVfdHlwZSBfX2xlbiA9IDA7CisJd2hpbGUgKF9fYmVnICE9IF9fZW5kICYmIF9fbGVuIDwgc2l6ZW9mKF9fYnVmKSAvIHNpemVvZihfQ2hhclQpKQorCSAgeworCSAgICBfX2J1ZltfX2xlbisrXSA9ICpfX2JlZzsKKwkgICAgKytfX2JlZzsKKwkgIH0KKwlfUmVwKiBfX3IgPSBfUmVwOjpfU19jcmVhdGUoX19sZW4sIHNpemVfdHlwZSgwKSwgX19hKTsKKwlfTV9jb3B5KF9fci0+X01fcmVmZGF0YSgpLCBfX2J1ZiwgX19sZW4pOworCV9fdHJ5CisJICB7CisJICAgIHdoaWxlIChfX2JlZyAhPSBfX2VuZCkKKwkgICAgICB7CisJCWlmIChfX2xlbiA9PSBfX3ItPl9NX2NhcGFjaXR5KQorCQkgIHsKKwkJICAgIC8vIEFsbG9jYXRlIG1vcmUgc3BhY2UuCisJCSAgICBfUmVwKiBfX2Fub3RoZXIgPSBfUmVwOjpfU19jcmVhdGUoX19sZW4gKyAxLCBfX2xlbiwgX19hKTsKKwkJICAgIF9NX2NvcHkoX19hbm90aGVyLT5fTV9yZWZkYXRhKCksIF9fci0+X01fcmVmZGF0YSgpLCBfX2xlbik7CisJCSAgICBfX3ItPl9NX2Rlc3Ryb3koX19hKTsKKwkJICAgIF9fciA9IF9fYW5vdGhlcjsKKwkJICB9CisJCV9fci0+X01fcmVmZGF0YSgpW19fbGVuKytdID0gKl9fYmVnOworCQkrK19fYmVnOworCSAgICAgIH0KKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX19yLT5fTV9kZXN0cm95KF9fYSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCV9fci0+X01fc2V0X2xlbmd0aF9hbmRfc2hhcmFibGUoX19sZW4pOworCXJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0luSXRlcmF0b3I+CisgICAgICBfQ2hhclQqCisgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICAgIF9TX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKyNpZiBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORyA9PSAwCisJaWYgKF9fYmVnID09IF9fZW5kICYmIF9fYSA9PSBfQWxsb2MoKSkKKwkgIHJldHVybiBfU19lbXB0eV9yZXAoKS5fTV9yZWZkYXRhKCk7CisjZW5kaWYKKwkvLyBOQjogTm90IHJlcXVpcmVkLCBidXQgY29uc2lkZXJlZCBiZXN0IHByYWN0aWNlLgorCWlmIChfX2dudV9jeHg6Ol9faXNfbnVsbF9wb2ludGVyKF9fYmVnKSAmJiBfX2JlZyAhPSBfX2VuZCkKKwkgIF9fdGhyb3dfbG9naWNfZXJyb3IoX19OKCJiYXNpY19zdHJpbmc6Ol9TX2NvbnN0cnVjdCBudWxsIG5vdCB2YWxpZCIpKTsKKworCWNvbnN0IHNpemVfdHlwZSBfX2RuZXcgPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KHN0ZDo6ZGlzdGFuY2UoX19iZWcsCisJCQkJCQkJCSAgICAgIF9fZW5kKSk7CisJLy8gQ2hlY2sgZm9yIG91dF9vZl9yYW5nZSBhbmQgbGVuZ3RoX2Vycm9yIGV4Y2VwdGlvbnMuCisJX1JlcCogX19yID0gX1JlcDo6X1NfY3JlYXRlKF9fZG5ldywgc2l6ZV90eXBlKDApLCBfX2EpOworCV9fdHJ5CisJICB7IF9TX2NvcHlfY2hhcnMoX19yLT5fTV9yZWZkYXRhKCksIF9fYmVnLCBfX2VuZCk7IH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX19yLT5fTV9kZXN0cm95KF9fYSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCV9fci0+X01fc2V0X2xlbmd0aF9hbmRfc2hhcmFibGUoX19kbmV3KTsKKwlyZXR1cm4gX19yLT5fTV9yZWZkYXRhKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX0NoYXJUKgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9TX2NvbnN0cnVjdChzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICB7CisjaWYgX0dMSUJDWFhfRlVMTFlfRFlOQU1JQ19TVFJJTkcgPT0gMAorICAgICAgaWYgKF9fbiA9PSAwICYmIF9fYSA9PSBfQWxsb2MoKSkKKwlyZXR1cm4gX1NfZW1wdHlfcmVwKCkuX01fcmVmZGF0YSgpOworI2VuZGlmCisgICAgICAvLyBDaGVjayBmb3Igb3V0X29mX3JhbmdlIGFuZCBsZW5ndGhfZXJyb3IgZXhjZXB0aW9ucy4KKyAgICAgIF9SZXAqIF9fciA9IF9SZXA6Ol9TX2NyZWF0ZShfX24sIHNpemVfdHlwZSgwKSwgX19hKTsKKyAgICAgIGlmIChfX24pCisJX01fYXNzaWduKF9fci0+X01fcmVmZGF0YSgpLCBfX24sIF9fYyk7CisKKyAgICAgIF9fci0+X01fc2V0X2xlbmd0aF9hbmRfc2hhcmFibGUoX19uKTsKKyAgICAgIHJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpCisgICAgOiBfTV9kYXRhcGx1cyhfX3N0ci5fTV9yZXAoKS0+X01fZ3JhYihfQWxsb2MoX19zdHIuZ2V0X2FsbG9jYXRvcigpKSwKKwkJCQkJICBfX3N0ci5nZXRfYWxsb2NhdG9yKCkpLAorCQkgIF9fc3RyLmdldF9hbGxvY2F0b3IoKSkKKyAgICB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3Qoc2l6ZV90eXBlKCksIF9DaGFyVCgpLCBfX2EpLCBfX2EpCisgICAgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgICA6IF9NX2RhdGFwbHVzKF9TX2NvbnN0cnVjdChfX3N0ci5fTV9kYXRhKCkKKwkJCSAgICAgICArIF9fc3RyLl9NX2NoZWNrKF9fcG9zLAorCQkJCQkJImJhc2ljX3N0cmluZzo6YmFzaWNfc3RyaW5nIiksCisJCQkgICAgICAgX19zdHIuX01fZGF0YSgpICsgX19zdHIuX01fbGltaXQoX19wb3MsIF9fbikKKwkJCSAgICAgICArIF9fcG9zLCBfQWxsb2MoKSksIF9BbGxvYygpKQorICAgIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsCisJCSBzaXplX3R5cGUgX19uLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICA6IF9NX2RhdGFwbHVzKF9TX2NvbnN0cnVjdChfX3N0ci5fTV9kYXRhKCkKKwkJCSAgICAgICArIF9fc3RyLl9NX2NoZWNrKF9fcG9zLAorCQkJCQkJImJhc2ljX3N0cmluZzo6YmFzaWNfc3RyaW5nIiksCisJCQkgICAgICAgX19zdHIuX01fZGF0YSgpICsgX19zdHIuX01fbGltaXQoX19wb3MsIF9fbikKKwkJCSAgICAgICArIF9fcG9zLCBfX2EpLCBfX2EpCisgICAgeyB9CisKKyAgLy8gVEJEOiBEUEcgYW5ub3RhdGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICA6IF9NX2RhdGFwbHVzKF9TX2NvbnN0cnVjdChfX3MsIF9fcyArIF9fbiwgX19hKSwgX19hKQorICAgIHsgfQorCisgIC8vIFRCRDogRFBHIGFubm90YXRlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3QoX19zLCBfX3MgPyBfX3MgKyB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykgOgorCQkJICAgICAgIF9fcyArIG5wb3MsIF9fYSksIF9fYSkKKyAgICB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBiYXNpY19zdHJpbmcoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYywgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3QoX19uLCBfX2MsIF9fYSksIF9fYSkKKyAgICB7IH0KKworICAvLyBUQkQ6IERQRyBhbm5vdGF0ZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19iZWcsIF9JbnB1dEl0ZXJhdG9yIF9fZW5kLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICA6IF9NX2RhdGFwbHVzKF9TX2NvbnN0cnVjdChfX2JlZywgX19lbmQsIF9fYSksIF9fYSkKKyAgICB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYmFzaWNfc3RyaW5nKGluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fZGF0YXBsdXMoX1NfY29uc3RydWN0KF9fbC5iZWdpbigpLCBfX2wuZW5kKCksIF9fYSksIF9fYSkKKyAgICB7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYXNzaWduKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpCisgICAgeworICAgICAgaWYgKF9NX3JlcCgpICE9IF9fc3RyLl9NX3JlcCgpKQorCXsKKwkgIC8vIFhYWCBNVAorCSAgY29uc3QgYWxsb2NhdG9yX3R5cGUgX19hID0gdGhpcy0+Z2V0X2FsbG9jYXRvcigpOworCSAgX0NoYXJUKiBfX3RtcCA9IF9fc3RyLl9NX3JlcCgpLT5fTV9ncmFiKF9fYSwgX19zdHIuZ2V0X2FsbG9jYXRvcigpKTsKKwkgIF9NX3JlcCgpLT5fTV9kaXNwb3NlKF9fYSk7CisJICBfTV9kYXRhKF9fdG1wKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYXNzaWduKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIF9NX2NoZWNrX2xlbmd0aCh0aGlzLT5zaXplKCksIF9fbiwgImJhc2ljX3N0cmluZzo6YXNzaWduIik7CisgICAgICBpZiAoX01fZGlzanVuY3QoX19zKSB8fCBfTV9yZXAoKS0+X01faXNfc2hhcmVkKCkpCisJcmV0dXJuIF9NX3JlcGxhY2Vfc2FmZShzaXplX3R5cGUoMCksIHRoaXMtPnNpemUoKSwgX19zLCBfX24pOworICAgICAgZWxzZQorCXsKKwkgIC8vIFdvcmsgaW4tcGxhY2UuCisJICBjb25zdCBzaXplX3R5cGUgX19wb3MgPSBfX3MgLSBfTV9kYXRhKCk7CisJICBpZiAoX19wb3MgPj0gX19uKQorCSAgICBfTV9jb3B5KF9NX2RhdGEoKSwgX19zLCBfX24pOworCSAgZWxzZSBpZiAoX19wb3MpCisJICAgIF9NX21vdmUoX01fZGF0YSgpLCBfX3MsIF9fbik7CisJICBfTV9yZXAoKS0+X01fc2V0X2xlbmd0aF9hbmRfc2hhcmFibGUoX19uKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGFwcGVuZChzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIGlmIChfX24pCisJeworCSAgX01fY2hlY2tfbGVuZ3RoKHNpemVfdHlwZSgwKSwgX19uLCAiYmFzaWNfc3RyaW5nOjphcHBlbmQiKTsJICAKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IF9fbiArIHRoaXMtPnNpemUoKTsKKwkgIGlmIChfX2xlbiA+IHRoaXMtPmNhcGFjaXR5KCkgfHwgX01fcmVwKCktPl9NX2lzX3NoYXJlZCgpKQorCSAgICB0aGlzLT5yZXNlcnZlKF9fbGVuKTsKKwkgIF9NX2Fzc2lnbihfTV9kYXRhKCkgKyB0aGlzLT5zaXplKCksIF9fbiwgX19jKTsKKwkgIF9NX3JlcCgpLT5fTV9zZXRfbGVuZ3RoX2FuZF9zaGFyYWJsZShfX2xlbik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBpZiAoX19uKQorCXsKKwkgIF9NX2NoZWNrX2xlbmd0aChzaXplX3R5cGUoMCksIF9fbiwgImJhc2ljX3N0cmluZzo6YXBwZW5kIik7CisJICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX24gKyB0aGlzLT5zaXplKCk7CisJICBpZiAoX19sZW4gPiB0aGlzLT5jYXBhY2l0eSgpIHx8IF9NX3JlcCgpLT5fTV9pc19zaGFyZWQoKSkKKwkgICAgeworCSAgICAgIGlmIChfTV9kaXNqdW5jdChfX3MpKQorCQl0aGlzLT5yZXNlcnZlKF9fbGVuKTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBjb25zdCBzaXplX3R5cGUgX19vZmYgPSBfX3MgLSBfTV9kYXRhKCk7CisJCSAgdGhpcy0+cmVzZXJ2ZShfX2xlbik7CisJCSAgX19zID0gX01fZGF0YSgpICsgX19vZmY7CisJCX0KKwkgICAgfQorCSAgX01fY29weShfTV9kYXRhKCkgKyB0aGlzLT5zaXplKCksIF9fcywgX19uKTsKKwkgIF9NX3JlcCgpLT5fTV9zZXRfbGVuZ3RoX2FuZF9zaGFyYWJsZShfX2xlbik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGFwcGVuZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSBfX3N0ci5zaXplKCk7CisgICAgICBpZiAoX19zaXplKQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IF9fc2l6ZSArIHRoaXMtPnNpemUoKTsKKwkgIGlmIChfX2xlbiA+IHRoaXMtPmNhcGFjaXR5KCkgfHwgX01fcmVwKCktPl9NX2lzX3NoYXJlZCgpKQorCSAgICB0aGlzLT5yZXNlcnZlKF9fbGVuKTsKKwkgIF9NX2NvcHkoX01fZGF0YSgpICsgdGhpcy0+c2l6ZSgpLCBfX3N0ci5fTV9kYXRhKCksIF9fc2l6ZSk7CisJICBfTV9yZXAoKS0+X01fc2V0X2xlbmd0aF9hbmRfc2hhcmFibGUoX19sZW4pOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9ICAgIAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYXBwZW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfX3N0ci5fTV9jaGVjayhfX3BvcywgImJhc2ljX3N0cmluZzo6YXBwZW5kIik7CisgICAgICBfX24gPSBfX3N0ci5fTV9saW1pdChfX3BvcywgX19uKTsKKyAgICAgIGlmIChfX24pCisJeworCSAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gX19uICsgdGhpcy0+c2l6ZSgpOworCSAgaWYgKF9fbGVuID4gdGhpcy0+Y2FwYWNpdHkoKSB8fCBfTV9yZXAoKS0+X01faXNfc2hhcmVkKCkpCisJICAgIHRoaXMtPnJlc2VydmUoX19sZW4pOworCSAgX01fY29weShfTV9kYXRhKCkgKyB0aGlzLT5zaXplKCksIF9fc3RyLl9NX2RhdGEoKSArIF9fcG9zLCBfX24pOworCSAgX01fcmVwKCktPl9NX3NldF9sZW5ndGhfYW5kX3NoYXJhYmxlKF9fbGVuKTsJICAKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKKyAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgICB7CisgICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgIF9NX2NoZWNrKF9fcG9zLCAiYmFzaWNfc3RyaW5nOjppbnNlcnQiKTsKKyAgICAgICBfTV9jaGVja19sZW5ndGgoc2l6ZV90eXBlKDApLCBfX24sICJiYXNpY19zdHJpbmc6Omluc2VydCIpOworICAgICAgIGlmIChfTV9kaXNqdW5jdChfX3MpIHx8IF9NX3JlcCgpLT5fTV9pc19zaGFyZWQoKSkKKyAgICAgICAgIHJldHVybiBfTV9yZXBsYWNlX3NhZmUoX19wb3MsIHNpemVfdHlwZSgwKSwgX19zLCBfX24pOworICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgLy8gV29yayBpbi1wbGFjZS4KKyAgICAgICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2ZmID0gX19zIC0gX01fZGF0YSgpOworICAgICAgICAgICBfTV9tdXRhdGUoX19wb3MsIDAsIF9fbik7CisgICAgICAgICAgIF9fcyA9IF9NX2RhdGEoKSArIF9fb2ZmOworICAgICAgICAgICBfQ2hhclQqIF9fcCA9IF9NX2RhdGEoKSArIF9fcG9zOworICAgICAgICAgICBpZiAoX19zICArIF9fbiA8PSBfX3ApCisgICAgICAgICAgICAgX01fY29weShfX3AsIF9fcywgX19uKTsKKyAgICAgICAgICAgZWxzZSBpZiAoX19zID49IF9fcCkKKyAgICAgICAgICAgICBfTV9jb3B5KF9fcCwgX19zICsgX19uLCBfX24pOworICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgeworCSAgICAgICBjb25zdCBzaXplX3R5cGUgX19ubGVmdCA9IF9fcCAtIF9fczsKKyAgICAgICAgICAgICAgIF9NX2NvcHkoX19wLCBfX3MsIF9fbmxlZnQpOworICAgICAgICAgICAgICAgX01fY29weShfX3AgKyBfX25sZWZ0LCBfX3AgKyBfX24sIF9fbiAtIF9fbmxlZnQpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgfQorICAgICB9CisKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjppdGVyYXRvcgorICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICB7CisgICAgICAgX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9fZmlyc3QgPj0gX01faWJlZ2luKCkgJiYgX19maXJzdCA8PSBfX2xhc3QKKwkJCQkmJiBfX2xhc3QgPD0gX01faWVuZCgpKTsKKworICAgICAgIC8vIE5COiBUaGlzIGlzbid0IGp1c3QgYW4gb3B0aW1pemF0aW9uIChiYWlsIG91dCBlYXJseSB3aGVuCisgICAgICAgLy8gdGhlcmUgaXMgbm90aGluZyB0byBkbywgcmVhbGx5KSwgaXQncyBhbHNvIGEgY29ycmVjdG5lc3MKKyAgICAgICAvLyBpc3N1ZSB2cyBNVCwgc2VlIGxpYnN0ZGMrKy80MDUxOC4KKyAgICAgICBjb25zdCBzaXplX3R5cGUgX19zaXplID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgICBpZiAoX19zaXplKQorCSB7CisJICAgY29uc3Qgc2l6ZV90eXBlIF9fcG9zID0gX19maXJzdCAtIF9NX2liZWdpbigpOworCSAgIF9NX211dGF0ZShfX3BvcywgX19zaXplLCBzaXplX3R5cGUoMCkpOworCSAgIF9NX3JlcCgpLT5fTV9zZXRfbGVha2VkKCk7CisJICAgcmV0dXJuIGl0ZXJhdG9yKF9NX2RhdGEoKSArIF9fcG9zKTsKKwkgfQorICAgICAgIGVsc2UKKwkgcmV0dXJuIF9fZmlyc3Q7CisgICAgIH0KKworICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mCisgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCSAgICAgc2l6ZV90eXBlIF9fbjIpCisgICAgIHsKKyAgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbjIpOworICAgICAgIF9NX2NoZWNrKF9fcG9zLCAiYmFzaWNfc3RyaW5nOjpyZXBsYWNlIik7CisgICAgICAgX19uMSA9IF9NX2xpbWl0KF9fcG9zLCBfX24xKTsKKyAgICAgICBfTV9jaGVja19sZW5ndGgoX19uMSwgX19uMiwgImJhc2ljX3N0cmluZzo6cmVwbGFjZSIpOworICAgICAgIGJvb2wgX19sZWZ0OworICAgICAgIGlmIChfTV9kaXNqdW5jdChfX3MpIHx8IF9NX3JlcCgpLT5fTV9pc19zaGFyZWQoKSkKKyAgICAgICAgIHJldHVybiBfTV9yZXBsYWNlX3NhZmUoX19wb3MsIF9fbjEsIF9fcywgX19uMik7CisgICAgICAgZWxzZSBpZiAoKF9fbGVmdCA9IF9fcyArIF9fbjIgPD0gX01fZGF0YSgpICsgX19wb3MpCisJCXx8IF9NX2RhdGEoKSArIF9fcG9zICsgX19uMSA8PSBfX3MpCisJIHsKKwkgICAvLyBXb3JrIGluLXBsYWNlOiBub24tb3ZlcmxhcHBpbmcgY2FzZS4KKwkgICBzaXplX3R5cGUgX19vZmYgPSBfX3MgLSBfTV9kYXRhKCk7CisJICAgX19sZWZ0ID8gX19vZmYgOiAoX19vZmYgKz0gX19uMiAtIF9fbjEpOworCSAgIF9NX211dGF0ZShfX3BvcywgX19uMSwgX19uMik7CisJICAgX01fY29weShfTV9kYXRhKCkgKyBfX3BvcywgX01fZGF0YSgpICsgX19vZmYsIF9fbjIpOworCSAgIHJldHVybiAqdGhpczsKKwkgfQorICAgICAgIGVsc2UKKwkgeworCSAgIC8vIFRvZG86IG92ZXJsYXBwaW5nIGNhc2UuCisJICAgY29uc3QgYmFzaWNfc3RyaW5nIF9fdG1wKF9fcywgX19uMik7CisJICAgcmV0dXJuIF9NX3JlcGxhY2Vfc2FmZShfX3BvcywgX19uMSwgX190bXAuX01fZGF0YSgpLCBfX24yKTsKKwkgfQorICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9SZXA6OgorICAgIF9NX2Rlc3Ryb3koY29uc3QgX0FsbG9jJiBfX2EpIHRocm93ICgpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHNpemVvZihfUmVwX2Jhc2UpICsKKwkgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLT5fTV9jYXBhY2l0eSArIDEpICogc2l6ZW9mKF9DaGFyVCk7CisgICAgICBfUmF3X2J5dGVzX2FsbG9jKF9fYSkuZGVhbGxvY2F0ZShyZWludGVycHJldF9jYXN0PGNoYXIqPih0aGlzKSwgX19zaXplKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX2xlYWtfaGFyZCgpCisgICAgeworI2lmIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HID09IDAKKyAgICAgIGlmIChfTV9yZXAoKSA9PSAmX1NfZW1wdHlfcmVwKCkpCisJcmV0dXJuOworI2VuZGlmCisgICAgICBpZiAoX01fcmVwKCktPl9NX2lzX3NoYXJlZCgpKQorCV9NX211dGF0ZSgwLCAwLCAwKTsKKyAgICAgIF9NX3JlcCgpLT5fTV9zZXRfbGVha2VkKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9tdXRhdGUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19sZW4xLCBzaXplX3R5cGUgX19sZW4yKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbmV3X3NpemUgPSBfX29sZF9zaXplICsgX19sZW4yIC0gX19sZW4xOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9faG93X211Y2ggPSBfX29sZF9zaXplIC0gX19wb3MgLSBfX2xlbjE7CisKKyAgICAgIGlmIChfX25ld19zaXplID4gdGhpcy0+Y2FwYWNpdHkoKSB8fCBfTV9yZXAoKS0+X01faXNfc2hhcmVkKCkpCisJeworCSAgLy8gTXVzdCByZWFsbG9jYXRlLgorCSAgY29uc3QgYWxsb2NhdG9yX3R5cGUgX19hID0gZ2V0X2FsbG9jYXRvcigpOworCSAgX1JlcCogX19yID0gX1JlcDo6X1NfY3JlYXRlKF9fbmV3X3NpemUsIHRoaXMtPmNhcGFjaXR5KCksIF9fYSk7CisKKwkgIGlmIChfX3BvcykKKwkgICAgX01fY29weShfX3ItPl9NX3JlZmRhdGEoKSwgX01fZGF0YSgpLCBfX3Bvcyk7CisJICBpZiAoX19ob3dfbXVjaCkKKwkgICAgX01fY29weShfX3ItPl9NX3JlZmRhdGEoKSArIF9fcG9zICsgX19sZW4yLAorCQkgICAgX01fZGF0YSgpICsgX19wb3MgKyBfX2xlbjEsIF9faG93X211Y2gpOworCisJICBfTV9yZXAoKS0+X01fZGlzcG9zZShfX2EpOworCSAgX01fZGF0YShfX3ItPl9NX3JlZmRhdGEoKSk7CisJfQorICAgICAgZWxzZSBpZiAoX19ob3dfbXVjaCAmJiBfX2xlbjEgIT0gX19sZW4yKQorCXsKKwkgIC8vIFdvcmsgaW4tcGxhY2UuCisJICBfTV9tb3ZlKF9NX2RhdGEoKSArIF9fcG9zICsgX19sZW4yLAorCQkgIF9NX2RhdGEoKSArIF9fcG9zICsgX19sZW4xLCBfX2hvd19tdWNoKTsKKwl9CisgICAgICBfTV9yZXAoKS0+X01fc2V0X2xlbmd0aF9hbmRfc2hhcmFibGUoX19uZXdfc2l6ZSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICByZXNlcnZlKHNpemVfdHlwZSBfX3JlcykKKyAgICB7CisgICAgICBpZiAoX19yZXMgIT0gdGhpcy0+Y2FwYWNpdHkoKSB8fCBfTV9yZXAoKS0+X01faXNfc2hhcmVkKCkpCisgICAgICAgIHsKKwkgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBzaHJpbmsgYmVsb3cgdGhlIGN1cnJlbnQgc2l6ZQorCSAgaWYgKF9fcmVzIDwgdGhpcy0+c2l6ZSgpKQorCSAgICBfX3JlcyA9IHRoaXMtPnNpemUoKTsKKwkgIGNvbnN0IGFsbG9jYXRvcl90eXBlIF9fYSA9IGdldF9hbGxvY2F0b3IoKTsKKwkgIF9DaGFyVCogX190bXAgPSBfTV9yZXAoKS0+X01fY2xvbmUoX19hLCBfX3JlcyAtIHRoaXMtPnNpemUoKSk7CisJICBfTV9yZXAoKS0+X01fZGlzcG9zZShfX2EpOworCSAgX01fZGF0YShfX3RtcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIHN3YXAoYmFzaWNfc3RyaW5nJiBfX3MpCisgICAgeworICAgICAgaWYgKF9NX3JlcCgpLT5fTV9pc19sZWFrZWQoKSkKKwlfTV9yZXAoKS0+X01fc2V0X3NoYXJhYmxlKCk7CisgICAgICBpZiAoX19zLl9NX3JlcCgpLT5fTV9pc19sZWFrZWQoKSkKKwlfX3MuX01fcmVwKCktPl9NX3NldF9zaGFyYWJsZSgpOworICAgICAgaWYgKHRoaXMtPmdldF9hbGxvY2F0b3IoKSA9PSBfX3MuZ2V0X2FsbG9jYXRvcigpKQorCXsKKwkgIF9DaGFyVCogX190bXAgPSBfTV9kYXRhKCk7CisJICBfTV9kYXRhKF9fcy5fTV9kYXRhKCkpOworCSAgX19zLl9NX2RhdGEoX190bXApOworCX0KKyAgICAgIC8vIFRoZSBjb2RlIGJlbG93IGNhbiB1c3VhbGx5IGJlIG9wdGltaXplZCBhd2F5LgorICAgICAgZWxzZQorCXsKKwkgIGNvbnN0IGJhc2ljX3N0cmluZyBfX3RtcDEoX01faWJlZ2luKCksIF9NX2llbmQoKSwKKwkJCQkgICAgX19zLmdldF9hbGxvY2F0b3IoKSk7CisJICBjb25zdCBiYXNpY19zdHJpbmcgX190bXAyKF9fcy5fTV9pYmVnaW4oKSwgX19zLl9NX2llbmQoKSwKKwkJCQkgICAgdGhpcy0+Z2V0X2FsbG9jYXRvcigpKTsKKwkgICp0aGlzID0gX190bXAyOworCSAgX19zID0gX190bXAxOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X1JlcCoKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfUmVwOjoKKyAgICBfU19jcmVhdGUoc2l6ZV90eXBlIF9fY2FwYWNpdHksIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSwKKwkgICAgICBjb25zdCBfQWxsb2MmIF9fYWxsb2MpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gODMuICBTdHJpbmc6Om5wb3MgdnMuIHN0cmluZzo6bWF4X3NpemUoKQorICAgICAgaWYgKF9fY2FwYWNpdHkgPiBfU19tYXhfc2l6ZSkKKwlfX3Rocm93X2xlbmd0aF9lcnJvcihfX04oImJhc2ljX3N0cmluZzo6X1NfY3JlYXRlIikpOworCisgICAgICAvLyBUaGUgc3RhbmRhcmQgcGxhY2VzIG5vIHJlc3RyaWN0aW9uIG9uIGFsbG9jYXRpbmcgbW9yZSBtZW1vcnkKKyAgICAgIC8vIHRoYW4gaXMgc3RyaWN0bHkgbmVlZGVkIHdpdGhpbiB0aGlzIGxheWVyIGF0IHRoZSBtb21lbnQgb3IgYXMKKyAgICAgIC8vIHJlcXVlc3RlZCBieSBhbiBleHBsaWNpdCBhcHBsaWNhdGlvbiBjYWxsIHRvIHJlc2VydmUoKS4KKworICAgICAgLy8gTWFueSBtYWxsb2MgaW1wbGVtZW50YXRpb25zIHBlcmZvcm0gcXVpdGUgcG9vcmx5IHdoZW4gYW4KKyAgICAgIC8vIGFwcGxpY2F0aW9uIGF0dGVtcHRzIHRvIGFsbG9jYXRlIG1lbW9yeSBpbiBhIHN0ZXB3aXNlIGZhc2hpb24KKyAgICAgIC8vIGdyb3dpbmcgZWFjaCBhbGxvY2F0aW9uIHNpemUgYnkgb25seSAxIGNoYXIuICBBZGRpdGlvbmFsbHksCisgICAgICAvLyBpdCBtYWtlcyBsaXR0bGUgc2Vuc2UgdG8gYWxsb2NhdGUgbGVzcyBsaW5lYXIgbWVtb3J5IHRoYW4gdGhlCisgICAgICAvLyBuYXR1cmFsIGJsb2NraW5nIHNpemUgb2YgdGhlIG1hbGxvYyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHdlIHdvdWxkIG5lZWQgYSBzb21ld2hhdCBsb3ctbGV2ZWwgY2FsY3VsYXRpb24KKyAgICAgIC8vIHdpdGggdHVuZWQgcGFyYW1ldGVycyB0byBnZXQgdGhpcyBwZXJmZWN0IGZvciBhbnkgcGFydGljdWxhcgorICAgICAgLy8gbWFsbG9jIGltcGxlbWVudGF0aW9uLiAgRm9ydHVuYXRlbHksIGdlbmVyYWxpemF0aW9ucyBhYm91dAorICAgICAgLy8gY29tbW9uIGZlYXR1cmVzIHNlZW4gYW1vbmcgaW1wbGVtZW50YXRpb25zIHNlZW1zIHRvIHN1ZmZpY2UuCisKKyAgICAgIC8vIF9fcGFnZXNpemUgbmVlZCBub3QgbWF0Y2ggdGhlIGFjdHVhbCBWTSBwYWdlIHNpemUgZm9yIGdvb2QKKyAgICAgIC8vIHJlc3VsdHMgaW4gcHJhY3RpY2UsIHRodXMgd2UgcGljayBhIGNvbW1vbiB2YWx1ZSBvbiB0aGUgbG93CisgICAgICAvLyBzaWRlLiAgX19tYWxsb2NfaGVhZGVyX3NpemUgaXMgYW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZgorICAgICAgLy8gb3ZlcmhlYWQgcGVyIG1lbW9yeSBhbGxvY2F0aW9uIChpbiBwcmFjdGljZSBzZWVuIE4gKiBzaXplb2YKKyAgICAgIC8vICh2b2lkKikgd2hlcmUgTiBpcyAwLCAyIG9yIDQpLiAgQWNjb3JkaW5nIHRvIGZvbGtsb3JlLAorICAgICAgLy8gcGlja2luZyB0aGlzIHZhbHVlIG9uIHRoZSBoaWdoIHNpZGUgaXMgYmV0dGVyIHRoYW4KKyAgICAgIC8vIGxvdy1iYWxsaW5nIGl0IChlc3BlY2lhbGx5IHdoZW4gdGhpcyBhbGdvcml0aG0gaXMgdXNlZCB3aXRoCisgICAgICAvLyBtYWxsb2MgaW1wbGVtZW50YXRpb25zIHRoYXQgYWxsb2NhdGUgbWVtb3J5IGJsb2NrcyByb3VuZGVkIHVwCisgICAgICAvLyB0byBhIHNpemUgd2hpY2ggaXMgYSBwb3dlciBvZiAyKS4KKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3BhZ2VzaXplID0gNDA5NjsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX21hbGxvY19oZWFkZXJfc2l6ZSA9IDQgKiBzaXplb2Yodm9pZCopOworCisgICAgICAvLyBUaGUgYmVsb3cgaW1wbGVtZW50cyBhbiBleHBvbmVudGlhbCBncm93dGggcG9saWN5LCBuZWNlc3NhcnkgdG8KKyAgICAgIC8vIG1lZXQgYW1vcnRpemVkIGxpbmVhciB0aW1lIHJlcXVpcmVtZW50cyBvZiB0aGUgbGlicmFyeTogc2VlCisgICAgICAvLyBodHRwOi8vZ2NjLmdudS5vcmcvbWwvbGlic3RkYysrLzIwMDEtMDcvbXNnMDAwODUuaHRtbC4KKyAgICAgIC8vIEl0J3MgYWN0aXZlIGZvciBhbGxvY2F0aW9ucyByZXF1aXJpbmcgYW4gYW1vdW50IG9mIG1lbW9yeSBhYm92ZQorICAgICAgLy8gc3lzdGVtIHBhZ2VzaXplLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZQorICAgICAgLy8gc3RhbmRhcmQ6IGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwMS0wNy9tc2cwMDEzMC5odG1sCisgICAgICBpZiAoX19jYXBhY2l0eSA+IF9fb2xkX2NhcGFjaXR5ICYmIF9fY2FwYWNpdHkgPCAyICogX19vbGRfY2FwYWNpdHkpCisJX19jYXBhY2l0eSA9IDIgKiBfX29sZF9jYXBhY2l0eTsKKworICAgICAgLy8gTkI6IE5lZWQgYW4gYXJyYXkgb2YgY2hhcl90eXBlW19fY2FwYWNpdHldLCBwbHVzIGEgdGVybWluYXRpbmcKKyAgICAgIC8vIG51bGwgY2hhcl90eXBlKCkgZWxlbWVudCwgcGx1cyBlbm91Z2ggZm9yIHRoZSBfUmVwIGRhdGEgc3RydWN0dXJlLgorICAgICAgLy8gV2hldy4gU2VlbWluZ2x5IHNvIG5lZWR5LCB5ZXQgc28gZWxlbWVudGFsLgorICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IChfX2NhcGFjaXR5ICsgMSkgKiBzaXplb2YoX0NoYXJUKSArIHNpemVvZihfUmVwKTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fYWRqX3NpemUgPSBfX3NpemUgKyBfX21hbGxvY19oZWFkZXJfc2l6ZTsKKyAgICAgIGlmIChfX2Fkal9zaXplID4gX19wYWdlc2l6ZSAmJiBfX2NhcGFjaXR5ID4gX19vbGRfY2FwYWNpdHkpCisJeworCSAgY29uc3Qgc2l6ZV90eXBlIF9fZXh0cmEgPSBfX3BhZ2VzaXplIC0gX19hZGpfc2l6ZSAlIF9fcGFnZXNpemU7CisJICBfX2NhcGFjaXR5ICs9IF9fZXh0cmEgLyBzaXplb2YoX0NoYXJUKTsKKwkgIC8vIE5ldmVyIGFsbG9jYXRlIGEgc3RyaW5nIGJpZ2dlciB0aGFuIF9TX21heF9zaXplLgorCSAgaWYgKF9fY2FwYWNpdHkgPiBfU19tYXhfc2l6ZSkKKwkgICAgX19jYXBhY2l0eSA9IF9TX21heF9zaXplOworCSAgX19zaXplID0gKF9fY2FwYWNpdHkgKyAxKSAqIHNpemVvZihfQ2hhclQpICsgc2l6ZW9mKF9SZXApOworCX0KKworICAgICAgLy8gTkI6IE1pZ2h0IHRocm93LCBidXQgbm8gd29ycmllcyBhYm91dCBhIGxlYWssIG1hdGU6IF9SZXAoKQorICAgICAgLy8gZG9lcyBub3QgdGhyb3cuCisgICAgICB2b2lkKiBfX3BsYWNlID0gX1Jhd19ieXRlc19hbGxvYyhfX2FsbG9jKS5hbGxvY2F0ZShfX3NpemUpOworICAgICAgX1JlcCAqX19wID0gbmV3IChfX3BsYWNlKSBfUmVwOworICAgICAgX19wLT5fTV9jYXBhY2l0eSA9IF9fY2FwYWNpdHk7CisgICAgICAvLyBBQkkgY29tcGF0aWJpbGl0eSAtIDMuNC54IHNldCBpbiBfU19jcmVhdGUgYm90aAorICAgICAgLy8gX01fcmVmY291bnQgYW5kIF9NX2xlbmd0aC4gIEFsbCBjYWxsZXJzIG9mIF9TX2NyZWF0ZQorICAgICAgLy8gaW4gYmFzaWNfc3RyaW5nLnRjYyB0aGVuIHNldCBqdXN0IF9NX2xlbmd0aC4KKyAgICAgIC8vIEluIDQuMC54IGFuZCBsYXRlciBib3RoIF9NX3JlZmNvdW50IGFuZCBfTV9sZW5ndGgKKyAgICAgIC8vIGFyZSBpbml0aWFsaXplZCBpbiB0aGUgY2FsbGVycywgdW5mb3J0dW5hdGVseSB3ZSBjYW4KKyAgICAgIC8vIGhhdmUgMy40LnggY29tcGlsZWQgY29kZSB3aXRoIF9TX2NyZWF0ZSBjYWxsZXJzIGlubGluZWQKKyAgICAgIC8vIGNhbGxpbmcgNC4wLngrIF9TX2NyZWF0ZS4KKyAgICAgIF9fcC0+X01fc2V0X3NoYXJhYmxlKCk7CisgICAgICByZXR1cm4gX19wOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfQ2hhclQqCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X1JlcDo6CisgICAgX01fY2xvbmUoY29uc3QgX0FsbG9jJiBfX2FsbG9jLCBzaXplX3R5cGUgX19yZXMpCisgICAgeworICAgICAgLy8gUmVxdWVzdGVkIGNhcGFjaXR5IG9mIHRoZSBjbG9uZS4KKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3JlcXVlc3RlZF9jYXAgPSB0aGlzLT5fTV9sZW5ndGggKyBfX3JlczsKKyAgICAgIF9SZXAqIF9fciA9IF9SZXA6Ol9TX2NyZWF0ZShfX3JlcXVlc3RlZF9jYXAsIHRoaXMtPl9NX2NhcGFjaXR5LAorCQkJCSAgX19hbGxvYyk7CisgICAgICBpZiAodGhpcy0+X01fbGVuZ3RoKQorCV9NX2NvcHkoX19yLT5fTV9yZWZkYXRhKCksIF9NX3JlZmRhdGEoKSwgdGhpcy0+X01fbGVuZ3RoKTsKKworICAgICAgX19yLT5fTV9zZXRfbGVuZ3RoX2FuZF9zaGFyYWJsZSh0aGlzLT5fTV9sZW5ndGgpOworICAgICAgcmV0dXJuIF9fci0+X01fcmVmZGF0YSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgcmVzaXplKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIF9NX2NoZWNrX2xlbmd0aChfX3NpemUsIF9fbiwgImJhc2ljX3N0cmluZzo6cmVzaXplIik7CisgICAgICBpZiAoX19zaXplIDwgX19uKQorCXRoaXMtPmFwcGVuZChfX24gLSBfX3NpemUsIF9fYyk7CisgICAgICBlbHNlIGlmIChfX24gPCBfX3NpemUpCisJdGhpcy0+ZXJhc2UoX19uKTsKKyAgICAgIC8vIGVsc2Ugbm90aGluZyAoaW4gcGFydGljdWxhciwgYXZvaWQgY2FsbGluZyBfTV9tdXRhdGUoKSB1bm5lY2Vzc2FyaWx5LikKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JgorICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgICBfTV9yZXBsYWNlX2Rpc3BhdGNoKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIF9JbnB1dEl0ZXJhdG9yIF9fazEsCisJCQkgIF9JbnB1dEl0ZXJhdG9yIF9fazIsIF9fZmFsc2VfdHlwZSkKKyAgICAgIHsKKwljb25zdCBiYXNpY19zdHJpbmcgX19zKF9fazEsIF9fazIpOworCWNvbnN0IHNpemVfdHlwZSBfX24xID0gX19pMiAtIF9faTE7CisJX01fY2hlY2tfbGVuZ3RoKF9fbjEsIF9fcy5zaXplKCksICJiYXNpY19zdHJpbmc6Ol9NX3JlcGxhY2VfZGlzcGF0Y2giKTsKKwlyZXR1cm4gX01fcmVwbGFjZV9zYWZlKF9faTEgLSBfTV9pYmVnaW4oKSwgX19uMSwgX19zLl9NX2RhdGEoKSwKKwkJCSAgICAgICBfX3Muc2l6ZSgpKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX3JlcGxhY2VfYXV4KHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMiwKKwkJICAgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfTV9jaGVja19sZW5ndGgoX19uMSwgX19uMiwgImJhc2ljX3N0cmluZzo6X01fcmVwbGFjZV9hdXgiKTsKKyAgICAgIF9NX211dGF0ZShfX3BvczEsIF9fbjEsIF9fbjIpOworICAgICAgaWYgKF9fbjIpCisJX01fYXNzaWduKF9NX2RhdGEoKSArIF9fcG9zMSwgX19uMiwgX19jKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9yZXBsYWNlX3NhZmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCQkgICAgc2l6ZV90eXBlIF9fbjIpCisgICAgeworICAgICAgX01fbXV0YXRlKF9fcG9zMSwgX19uMSwgX19uMik7CisgICAgICBpZiAoX19uMikKKwlfTV9jb3B5KF9NX2RhdGEoKSArIF9fcG9zMSwgX19zLCBfX24yKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19saHMpOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc3RyaW5nX3R5cGU6OnNpemVfdHlwZQkgIF9fc2l6ZV90eXBlOworICAgICAgY29uc3QgX19zaXplX3R5cGUgX19sZW4gPSBfVHJhaXRzOjpsZW5ndGgoX19saHMpOworICAgICAgX19zdHJpbmdfdHlwZSBfX3N0cjsKKyAgICAgIF9fc3RyLnJlc2VydmUoX19sZW4gKyBfX3Jocy5zaXplKCkpOworICAgICAgX19zdHIuYXBwZW5kKF9fbGhzLCBfX2xlbik7CisgICAgICBfX3N0ci5hcHBlbmQoX19yaHMpOworICAgICAgcmV0dXJuIF9fc3RyOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKF9DaGFyVCBfX2xocywgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc3RyaW5nX3R5cGU6OnNpemVfdHlwZQkgIF9fc2l6ZV90eXBlOworICAgICAgX19zdHJpbmdfdHlwZSBfX3N0cjsKKyAgICAgIGNvbnN0IF9fc2l6ZV90eXBlIF9fbGVuID0gX19yaHMuc2l6ZSgpOworICAgICAgX19zdHIucmVzZXJ2ZShfX2xlbiArIDEpOworICAgICAgX19zdHIuYXBwZW5kKF9fc2l6ZV90eXBlKDEpLCBfX2xocyk7CisgICAgICBfX3N0ci5hcHBlbmQoX19yaHMpOworICAgICAgcmV0dXJuIF9fc3RyOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBjb3B5KF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgeworICAgICAgX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6OmNvcHkiKTsKKyAgICAgIF9fbiA9IF9NX2xpbWl0KF9fcG9zLCBfX24pOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgaWYgKF9fbikKKwlfTV9jb3B5KF9fcywgX01fZGF0YSgpICsgX19wb3MsIF9fbik7CisgICAgICAvLyAyMS4zLjUuNyBwYXIgMzogZG8gbm90IGFwcGVuZCBudWxsLiAgKGdvb2QuKQorICAgICAgcmV0dXJuIF9fbjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBjb25zdCBfQ2hhclQqIF9fZGF0YSA9IF9NX2RhdGEoKTsKKworICAgICAgaWYgKF9fbiA9PSAwKQorCXJldHVybiBfX3BvcyA8PSBfX3NpemUgPyBfX3BvcyA6IG5wb3M7CisKKyAgICAgIGlmIChfX24gPD0gX19zaXplKQorCXsKKwkgIGZvciAoOyBfX3BvcyA8PSBfX3NpemUgLSBfX247ICsrX19wb3MpCisJICAgIGlmICh0cmFpdHNfdHlwZTo6ZXEoX19kYXRhW19fcG9zXSwgX19zWzBdKQorCQkmJiB0cmFpdHNfdHlwZTo6Y29tcGFyZShfX2RhdGEgKyBfX3BvcyArIDEsCisJCQkJCV9fcyArIDEsIF9fbiAtIDEpID09IDApCisJICAgICAgcmV0dXJuIF9fcG9zOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBzaXplX3R5cGUgX19yZXQgPSBucG9zOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3BvcyA8IF9fc2l6ZSkKKwl7CisJICBjb25zdCBfQ2hhclQqIF9fZGF0YSA9IF9NX2RhdGEoKTsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfX3NpemUgLSBfX3BvczsKKwkgIGNvbnN0IF9DaGFyVCogX19wID0gdHJhaXRzX3R5cGU6OmZpbmQoX19kYXRhICsgX19wb3MsIF9fbiwgX19jKTsKKwkgIGlmIChfX3ApCisJICAgIF9fcmV0ID0gX19wIC0gX19kYXRhOworCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgcmZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgaWYgKF9fbiA8PSBfX3NpemUpCisJeworCSAgX19wb3MgPSBzdGQ6Om1pbihzaXplX3R5cGUoX19zaXplIC0gX19uKSwgX19wb3MpOworCSAgY29uc3QgX0NoYXJUKiBfX2RhdGEgPSBfTV9kYXRhKCk7CisJICBkbworCSAgICB7CisJICAgICAgaWYgKHRyYWl0c190eXBlOjpjb21wYXJlKF9fZGF0YSArIF9fcG9zLCBfX3MsIF9fbikgPT0gMCkKKwkJcmV0dXJuIF9fcG9zOworCSAgICB9CisJICB3aGlsZSAoX19wb3MtLSA+IDApOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICByZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3NpemUpCisJeworCSAgaWYgKC0tX19zaXplID4gX19wb3MpCisJICAgIF9fc2l6ZSA9IF9fcG9zOworCSAgZm9yICgrK19fc2l6ZTsgX19zaXplLS0gPiAwOyApCisJICAgIGlmICh0cmFpdHNfdHlwZTo6ZXEoX01fZGF0YSgpW19fc2l6ZV0sIF9fYykpCisJICAgICAgcmV0dXJuIF9fc2l6ZTsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIGZvciAoOyBfX24gJiYgX19wb3MgPCB0aGlzLT5zaXplKCk7ICsrX19wb3MpCisJeworCSAgY29uc3QgX0NoYXJUKiBfX3AgPSB0cmFpdHNfdHlwZTo6ZmluZChfX3MsIF9fbiwgX01fZGF0YSgpW19fcG9zXSk7CisJICBpZiAoX19wKQorCSAgICByZXR1cm4gX19wb3M7CisJfQorICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBpZiAoX19zaXplICYmIF9fbikKKwl7CisJICBpZiAoLS1fX3NpemUgPiBfX3BvcykKKwkgICAgX19zaXplID0gX19wb3M7CisJICBkbworCSAgICB7CisJICAgICAgaWYgKHRyYWl0c190eXBlOjpmaW5kKF9fcywgX19uLCBfTV9kYXRhKClbX19zaXplXSkpCisJCXJldHVybiBfX3NpemU7CisJICAgIH0KKwkgIHdoaWxlIChfX3NpemUtLSAhPSAwKTsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBmb3IgKDsgX19wb3MgPCB0aGlzLT5zaXplKCk7ICsrX19wb3MpCisJaWYgKCF0cmFpdHNfdHlwZTo6ZmluZChfX3MsIF9fbiwgX01fZGF0YSgpW19fcG9zXSkpCisJICByZXR1cm4gX19wb3M7CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgZmluZF9maXJzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGZvciAoOyBfX3BvcyA8IHRoaXMtPnNpemUoKTsgKytfX3BvcykKKwlpZiAoIXRyYWl0c190eXBlOjplcShfTV9kYXRhKClbX19wb3NdLCBfX2MpKQorCSAgcmV0dXJuIF9fcG9zOworICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgaWYgKF9fc2l6ZSkKKwl7CisJICBpZiAoLS1fX3NpemUgPiBfX3BvcykKKwkgICAgX19zaXplID0gX19wb3M7CisJICBkbworCSAgICB7CisJICAgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZmluZChfX3MsIF9fbiwgX01fZGF0YSgpW19fc2l6ZV0pKQorCQlyZXR1cm4gX19zaXplOworCSAgICB9CisJICB3aGlsZSAoX19zaXplLS0pOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBmaW5kX2xhc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgaWYgKF9fc2l6ZSkKKwl7CisJICBpZiAoLS1fX3NpemUgPiBfX3BvcykKKwkgICAgX19zaXplID0gX19wb3M7CisJICBkbworCSAgICB7CisJICAgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZXEoX01fZGF0YSgpW19fc2l6ZV0sIF9fYykpCisJCXJldHVybiBfX3NpemU7CisJICAgIH0KKwkgIHdoaWxlIChfX3NpemUtLSk7CisJfQorICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGludAorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKSBjb25zdAorICAgIHsKKyAgICAgIF9NX2NoZWNrKF9fcG9zLCAiYmFzaWNfc3RyaW5nOjpjb21wYXJlIik7CisgICAgICBfX24gPSBfTV9saW1pdChfX3BvcywgX19uKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29zaXplID0gX19zdHIuc2l6ZSgpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19uLCBfX29zaXplKTsKKyAgICAgIGludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZShfTV9kYXRhKCkgKyBfX3BvcywgX19zdHIuZGF0YSgpLCBfX2xlbik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfU19jb21wYXJlKF9fbiwgX19vc2l6ZSk7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbnQKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLAorCSAgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uMikgY29uc3QKKyAgICB7CisgICAgICBfTV9jaGVjayhfX3BvczEsICJiYXNpY19zdHJpbmc6OmNvbXBhcmUiKTsKKyAgICAgIF9fc3RyLl9NX2NoZWNrKF9fcG9zMiwgImJhc2ljX3N0cmluZzo6Y29tcGFyZSIpOworICAgICAgX19uMSA9IF9NX2xpbWl0KF9fcG9zMSwgX19uMSk7CisgICAgICBfX24yID0gX19zdHIuX01fbGltaXQoX19wb3MyLCBfX24yKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHN0ZDo6bWluKF9fbjEsIF9fbjIpOworICAgICAgaW50IF9fciA9IHRyYWl0c190eXBlOjpjb21wYXJlKF9NX2RhdGEoKSArIF9fcG9zMSwKKwkJCQkgICAgIF9fc3RyLmRhdGEoKSArIF9fcG9zMiwgX19sZW4pOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX1NfY29tcGFyZShfX24xLCBfX24yKTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGludAorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGNvbXBhcmUoY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29zaXplID0gdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19zaXplLCBfX29zaXplKTsKKyAgICAgIGludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZShfTV9kYXRhKCksIF9fcywgX19sZW4pOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX1NfY29tcGFyZShfX3NpemUsIF9fb3NpemUpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW50CisgICAgYmFzaWNfc3RyaW5nIDxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworICAgICAgX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6OmNvbXBhcmUiKTsKKyAgICAgIF9fbjEgPSBfTV9saW1pdChfX3BvcywgX19uMSk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vc2l6ZSA9IHRyYWl0c190eXBlOjpsZW5ndGgoX19zKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHN0ZDo6bWluKF9fbjEsIF9fb3NpemUpOworICAgICAgaW50IF9fciA9IHRyYWl0c190eXBlOjpjb21wYXJlKF9NX2RhdGEoKSArIF9fcG9zLCBfX3MsIF9fbGVuKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9TX2NvbXBhcmUoX19uMSwgX19vc2l6ZSk7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbnQKKyAgICBiYXNpY19zdHJpbmcgPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkgICAgc2l6ZV90eXBlIF9fbjIpIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24yKTsKKyAgICAgIF9NX2NoZWNrKF9fcG9zLCAiYmFzaWNfc3RyaW5nOjpjb21wYXJlIik7CisgICAgICBfX24xID0gX01fbGltaXQoX19wb3MsIF9fbjEpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19uMSwgX19uMik7CisgICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUoX01fZGF0YSgpICsgX19wb3MsIF9fcywgX19sZW4pOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX1NfY29tcGFyZShfX24xLCBfX24yKTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIC8vIDIxLjMuNy45IGJhc2ljX3N0cmluZzo6Z2V0bGluZSBhbmQgb3BlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pbiwKKwkgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zdHIpCisgICAgeworICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4JCV9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CV9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICAgICAgIF9faW9zX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppbnRfdHlwZQkJX19pbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zdHJpbmdfdHlwZTo6c2l6ZV90eXBlCQlfX3NpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY3R5cGU8X0NoYXJUPgkJCQlfX2N0eXBlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY3R5cGVfdHlwZTo6Y3R5cGVfYmFzZSAgICAgICAgIF9fY3R5cGVfYmFzZTsKKworICAgICAgX19zaXplX3R5cGUgX19leHRyYWN0ZWQgPSAwOworICAgICAgdHlwZW5hbWUgX19pb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IF9faW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6c2VudHJ5IF9fY2VyYihfX2luLCBmYWxzZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICAvLyBBdm9pZCByZWFsbG9jYXRpb24gZm9yIGNvbW1vbiBjYXNlLgorCSAgICAgIF9fc3RyLmVyYXNlKCk7CisJICAgICAgX0NoYXJUIF9fYnVmWzEyOF07CisJICAgICAgX19zaXplX3R5cGUgX19sZW4gPSAwOwkgICAgICAKKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fdyA9IF9faW4ud2lkdGgoKTsKKwkgICAgICBjb25zdCBfX3NpemVfdHlwZSBfX24gPSBfX3cgPiAwID8gc3RhdGljX2Nhc3Q8X19zaXplX3R5cGU+KF9fdykKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX3N0ci5tYXhfc2l6ZSgpOworCSAgICAgIGNvbnN0IF9fY3R5cGVfdHlwZSYgX19jdCA9IHVzZV9mYWNldDxfX2N0eXBlX3R5cGU+KF9faW4uZ2V0bG9jKCkpOworCSAgICAgIGNvbnN0IF9faW50X3R5cGUgX19lb2YgPSBfVHJhaXRzOjplb2YoKTsKKwkgICAgICBfX2ludF90eXBlIF9fYyA9IF9faW4ucmRidWYoKS0+c2dldGMoKTsKKworCSAgICAgIHdoaWxlIChfX2V4dHJhY3RlZCA8IF9fbgorCQkgICAgICYmICFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKQorCQkgICAgICYmICFfX2N0LmlzKF9fY3R5cGVfYmFzZTo6c3BhY2UsCisJCQkJIF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkKKwkJeworCQkgIGlmIChfX2xlbiA9PSBzaXplb2YoX19idWYpIC8gc2l6ZW9mKF9DaGFyVCkpCisJCSAgICB7CisJCSAgICAgIF9fc3RyLmFwcGVuZChfX2J1Ziwgc2l6ZW9mKF9fYnVmKSAvIHNpemVvZihfQ2hhclQpKTsKKwkJICAgICAgX19sZW4gPSAwOworCQkgICAgfQorCQkgIF9fYnVmW19fbGVuKytdID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYyk7CisJCSAgKytfX2V4dHJhY3RlZDsKKwkJICBfX2MgPSBfX2luLnJkYnVmKCktPnNuZXh0YygpOworCQl9CisJICAgICAgX19zdHIuYXBwZW5kKF9fYnVmLCBfX2xlbik7CisKKwkgICAgICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisJCV9fZXJyIHw9IF9faW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgICBfX2luLndpZHRoKDApOworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICBfX2luLl9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDkxLiBEZXNjcmlwdGlvbiBvZiBvcGVyYXRvcj4+IGFuZCBnZXRsaW5lKCkgZm9yIHN0cmluZzw+CisJICAgICAgLy8gbWlnaHQgY2F1c2UgZW5kbGVzcyBsb29wCisJICAgICAgX19pbi5fTV9zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOworCSAgICB9CisJfQorICAgICAgLy8gMjExLiAgb3BlcmF0b3I+Pihpc3RyZWFtJiwgc3RyaW5nJikgZG9lc24ndCBzZXQgZmFpbGJpdAorICAgICAgaWYgKCFfX2V4dHJhY3RlZCkKKwlfX2VyciB8PSBfX2lvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCV9faW4uc2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuIF9faW47CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pbiwKKwkgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zdHIsIF9DaGFyVCBfX2RlbGltKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CQlfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPglfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgICAgICBfX2lvc19iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW50X3R5cGUJCV9faW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc3RyaW5nX3R5cGU6OnNpemVfdHlwZQkJX19zaXplX3R5cGU7CisKKyAgICAgIF9fc2l6ZV90eXBlIF9fZXh0cmFjdGVkID0gMDsKKyAgICAgIGNvbnN0IF9fc2l6ZV90eXBlIF9fbiA9IF9fc3RyLm1heF9zaXplKCk7CisgICAgICB0eXBlbmFtZSBfX2lvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gX19pb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjpzZW50cnkgX19jZXJiKF9faW4sIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgX19zdHIuZXJhc2UoKTsKKwkgICAgICBjb25zdCBfX2ludF90eXBlIF9faWRlbGltID0gX1RyYWl0czo6dG9faW50X3R5cGUoX19kZWxpbSk7CisJICAgICAgY29uc3QgX19pbnRfdHlwZSBfX2VvZiA9IF9UcmFpdHM6OmVvZigpOworCSAgICAgIF9faW50X3R5cGUgX19jID0gX19pbi5yZGJ1ZigpLT5zZ2V0YygpOworCisJICAgICAgd2hpbGUgKF9fZXh0cmFjdGVkIDwgX19uCisJCSAgICAgJiYgIV9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpCisJCSAgICAgJiYgIV9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19pZGVsaW0pKQorCQl7CisJCSAgX19zdHIgKz0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYyk7CisJCSAgKytfX2V4dHJhY3RlZDsKKwkJICBfX2MgPSBfX2luLnJkYnVmKCktPnNuZXh0YygpOworCQl9CisKKwkgICAgICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisJCV9fZXJyIHw9IF9faW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgICBlbHNlIGlmIChfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9faWRlbGltKSkKKwkJeworCQkgICsrX19leHRyYWN0ZWQ7CQkgIAorCQkgIF9faW4ucmRidWYoKS0+c2J1bXBjKCk7CisJCX0KKwkgICAgICBlbHNlCisJCV9fZXJyIHw9IF9faW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIF9faW4uX01fc2V0c3RhdGUoX19pb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gOTEuIERlc2NyaXB0aW9uIG9mIG9wZXJhdG9yPj4gYW5kIGdldGxpbmUoKSBmb3Igc3RyaW5nPD4KKwkgICAgICAvLyBtaWdodCBjYXVzZSBlbmRsZXNzIGxvb3AKKwkgICAgICBfX2luLl9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgIH0KKwl9CisgICAgICBpZiAoIV9fZXh0cmFjdGVkKQorCV9fZXJyIHw9IF9faW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBpZiAoX19lcnIpCisJX19pbi5zZXRzdGF0ZShfX2Vycik7CisgICAgICByZXR1cm4gX19pbjsKKyAgICB9CisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFID4gMAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfc3RyaW5nPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUKKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyPiYsIHN0cmluZyYpOworICBleHRlcm4gdGVtcGxhdGUKKyAgICBiYXNpY19vc3RyZWFtPGNoYXI+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyPiYsIGNvbnN0IHN0cmluZyYpOworICBleHRlcm4gdGVtcGxhdGUKKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+JgorICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTxjaGFyPiYsIHN0cmluZyYsIGNoYXIpOworICBleHRlcm4gdGVtcGxhdGUKKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+JgorICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTxjaGFyPiYsIHN0cmluZyYpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3N0cmluZzx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYmFzaWNfaXN0cmVhbTx3Y2hhcl90PiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08d2NoYXJfdD4mLCB3c3RyaW5nJik7CisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJhc2ljX29zdHJlYW08d2NoYXJfdD4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPHdjaGFyX3Q+JiwgY29uc3Qgd3N0cmluZyYpOworICBleHRlcm4gdGVtcGxhdGUKKyAgICBiYXNpY19pc3RyZWFtPHdjaGFyX3Q+JgorICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTx3Y2hhcl90PiYsIHdzdHJpbmcmLCB3Y2hhcl90KTsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYmFzaWNfaXN0cmVhbTx3Y2hhcl90PiYKKyAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08d2NoYXJfdD4mLCB3c3RyaW5nJik7CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9ib29zdF9jb25jZXB0X2NoZWNrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYm9vc3RfY29uY2VwdF9jaGVjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjM2I4YWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYm9vc3RfY29uY2VwdF9jaGVjay5oCkBAIC0wLDAgKzEsNzkwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyAoQykgQ29weXJpZ2h0IEplcmVteSBTaWVrIDIwMDAuIFBlcm1pc3Npb24gdG8gY29weSwgdXNlLCBtb2RpZnksCisvLyBzZWxsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGlzCisvLyBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZAorLy8gImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eSwgYW5kIHdpdGggbm8gY2xhaW0gYXMKKy8vIHRvIGl0cyBzdWl0YWJpbGl0eSBmb3IgYW55IHB1cnBvc2UuCisvLworCisvKiogQGZpbGUgYml0cy9ib29zdF9jb25jZXB0X2NoZWNrLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpdGVyYXRvcn0KKyAqLworCisvLyBHQ0MgTm90ZTogIGJhc2VkIG9uIHZlcnNpb24gMS4xMi4wIG9mIHRoZSBCb29zdCBsaWJyYXJ5LgorCisjaWZuZGVmIF9CT09TVF9DT05DRVBUX0NIRUNLX0gKKyNkZWZpbmUgX0JPT1NUX0NPTkNFUFRfQ0hFQ0tfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oPiAgICAvLyBmb3IgdHJhaXRzIGFuZCB0YWdzCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworI2RlZmluZSBfSXNVbnVzZWQgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorCisvLyBXaGVuIHRoZSBDLUMgY29kZSBpcyBpbiB1c2UsIHdlIHdvdWxkIGxpa2UgdGhpcyBmdW5jdGlvbiB0byBkbyBhcyBsaXR0bGUKKy8vIGFzIHBvc3NpYmxlIGF0IHJ1bnRpbWUsIHVzZSBhcyBmZXcgcmVzb3VyY2VzIGFzIHBvc3NpYmxlLCBhbmQgaG9wZWZ1bGx5CisvLyBiZSBlbGlkZWQgb3V0IG9mIGV4aXN0ZW5jZS4uLiBobW1tLgordGVtcGxhdGUgPGNsYXNzIF9Db25jZXB0PgoraW5saW5lIHZvaWQgX19mdW5jdGlvbl9yZXF1aXJlcygpCit7CisgIHZvaWQgKF9Db25jZXB0OjoqX194KSgpIF9Jc1VudXNlZCA9ICZfQ29uY2VwdDo6X19jb25zdHJhaW50czsKK30KKworLy8gTm8gZGVmaW5pdGlvbjogaWYgdGhpcyBpcyByZWZlcmVuY2VkLCB0aGVyZSdzIGEgcHJvYmxlbSB3aXRoCisvLyB0aGUgaW5zdGFudGlhdGluZyB0eXBlIG5vdCBiZWluZyBvbmUgb2YgdGhlIHJlcXVpcmVkIGludGVnZXIgdHlwZXMuCisvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIHJlc3VsdHMgaW4gYSBsaW5rLXRpbWUgZXJyb3IsIG5vdCBhIGNvbXBpbGUtdGltZSBlcnJvci4KK3ZvaWQgX19lcnJvcl90eXBlX211c3RfYmVfYW5faW50ZWdlcl90eXBlKCk7Cit2b2lkIF9fZXJyb3JfdHlwZV9tdXN0X2JlX2FuX3Vuc2lnbmVkX2ludGVnZXJfdHlwZSgpOwordm9pZCBfX2Vycm9yX3R5cGVfbXVzdF9iZV9hX3NpZ25lZF9pbnRlZ2VyX3R5cGUoKTsKKworLy8gPz8/IFNob3VsZCB0aGUgImNvbmNlcHRfY2hlY2tpbmcqIiBzdHJ1Y3RzIGJlZ2luIHdpdGggbW9yZSB0aGFuIF8gPworI2RlZmluZSBfR0xJQkNYWF9DTEFTU19SRVFVSVJFUyhfdHlwZV92YXIsIF9ucywgX2NvbmNlcHQpIFwKKyAgdHlwZWRlZiB2b2lkIChfbnM6Ol9jb25jZXB0IDxfdHlwZV92YXI+OjoqIF9mdW5jIyNfdHlwZV92YXIjI19jb25jZXB0KSgpOyBcCisgIHRlbXBsYXRlIDxfZnVuYyMjX3R5cGVfdmFyIyNfY29uY2VwdCBfVHAxPiBcCisgIHN0cnVjdCBfY29uY2VwdF9jaGVja2luZyMjX3R5cGVfdmFyIyNfY29uY2VwdCB7IH07IFwKKyAgdHlwZWRlZiBfY29uY2VwdF9jaGVja2luZyMjX3R5cGVfdmFyIyNfY29uY2VwdDwgXAorICAgICZfbnM6Ol9jb25jZXB0IDxfdHlwZV92YXI+OjpfX2NvbnN0cmFpbnRzPiBcCisgICAgX2NvbmNlcHRfY2hlY2tpbmdfdHlwZWRlZiMjX3R5cGVfdmFyIyNfY29uY2VwdAorCisjZGVmaW5lIF9HTElCQ1hYX0NMQVNTX1JFUVVJUkVTMihfdHlwZV92YXIxLCBfdHlwZV92YXIyLCBfbnMsIF9jb25jZXB0KSBcCisgIHR5cGVkZWYgdm9pZCAoX25zOjpfY29uY2VwdCA8X3R5cGVfdmFyMSxfdHlwZV92YXIyPjo6KiBfZnVuYyMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX2NvbmNlcHQpKCk7IFwKKyAgdGVtcGxhdGUgPF9mdW5jIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfY29uY2VwdCBfVHAxPiBcCisgIHN0cnVjdCBfY29uY2VwdF9jaGVja2luZyMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX2NvbmNlcHQgeyB9OyBcCisgIHR5cGVkZWYgX2NvbmNlcHRfY2hlY2tpbmcjI190eXBlX3ZhcjEjI190eXBlX3ZhcjIjI19jb25jZXB0PCBcCisgICAgJl9uczo6X2NvbmNlcHQgPF90eXBlX3ZhcjEsX3R5cGVfdmFyMj46Ol9fY29uc3RyYWludHM+IFwKKyAgICBfY29uY2VwdF9jaGVja2luZ190eXBlZGVmIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfY29uY2VwdAorCisjZGVmaW5lIF9HTElCQ1hYX0NMQVNTX1JFUVVJUkVTMyhfdHlwZV92YXIxLCBfdHlwZV92YXIyLCBfdHlwZV92YXIzLCBfbnMsIF9jb25jZXB0KSBcCisgIHR5cGVkZWYgdm9pZCAoX25zOjpfY29uY2VwdCA8X3R5cGVfdmFyMSxfdHlwZV92YXIyLF90eXBlX3ZhcjM+OjoqIF9mdW5jIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfdHlwZV92YXIzIyNfY29uY2VwdCkoKTsgXAorICB0ZW1wbGF0ZSA8X2Z1bmMjI190eXBlX3ZhcjEjI190eXBlX3ZhcjIjI190eXBlX3ZhcjMjI19jb25jZXB0IF9UcDE+IFwKKyAgc3RydWN0IF9jb25jZXB0X2NoZWNraW5nIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfdHlwZV92YXIzIyNfY29uY2VwdCB7IH07IFwKKyAgdHlwZWRlZiBfY29uY2VwdF9jaGVja2luZyMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX3R5cGVfdmFyMyMjX2NvbmNlcHQ8IFwKKyAgICAmX25zOjpfY29uY2VwdCA8X3R5cGVfdmFyMSxfdHlwZV92YXIyLF90eXBlX3ZhcjM+OjpfX2NvbnN0cmFpbnRzPiAgXAorICBfY29uY2VwdF9jaGVja2luZ190eXBlZGVmIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfdHlwZV92YXIzIyNfY29uY2VwdAorCisjZGVmaW5lIF9HTElCQ1hYX0NMQVNTX1JFUVVJUkVTNChfdHlwZV92YXIxLCBfdHlwZV92YXIyLCBfdHlwZV92YXIzLCBfdHlwZV92YXI0LCBfbnMsIF9jb25jZXB0KSBcCisgIHR5cGVkZWYgdm9pZCAoX25zOjpfY29uY2VwdCA8X3R5cGVfdmFyMSxfdHlwZV92YXIyLF90eXBlX3ZhcjMsX3R5cGVfdmFyND46OiogX2Z1bmMjI190eXBlX3ZhcjEjI190eXBlX3ZhcjIjI190eXBlX3ZhcjMjI190eXBlX3ZhcjQjI19jb25jZXB0KSgpOyBcCisgIHRlbXBsYXRlIDxfZnVuYyMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX3R5cGVfdmFyMyMjX3R5cGVfdmFyNCMjX2NvbmNlcHQgX1RwMT4gXAorICBzdHJ1Y3QgX2NvbmNlcHRfY2hlY2tpbmcjI190eXBlX3ZhcjEjI190eXBlX3ZhcjIjI190eXBlX3ZhcjMjI190eXBlX3ZhcjQjI19jb25jZXB0IHsgfTsgXAorICB0eXBlZGVmIF9jb25jZXB0X2NoZWNraW5nIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfdHlwZV92YXIzIyNfdHlwZV92YXI0IyNfY29uY2VwdDwgXAorICAmX25zOjpfY29uY2VwdCA8X3R5cGVfdmFyMSxfdHlwZV92YXIyLF90eXBlX3ZhcjMsX3R5cGVfdmFyND46Ol9fY29uc3RyYWludHM+IFwKKyAgICBfY29uY2VwdF9jaGVja2luZ190eXBlZGVmIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfdHlwZV92YXIzIyNfdHlwZV92YXI0IyNfY29uY2VwdAorCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IF9BdXhfcmVxdWlyZV9zYW1lIHsgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfQXV4X3JlcXVpcmVfc2FtZTxfVHAsX1RwPiB7IHR5cGVkZWYgX1RwIF9UeXBlOyB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICBzdHJ1Y3QgX1NhbWVUeXBlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQXV4X3JlcXVpcmVfc2FtZTxfVHAxLCBfVHAyPjo6X1R5cGUgX1JlcXVpcmVkOworICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX0ludGVnZXJDb25jZXB0IHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Vycm9yX3R5cGVfbXVzdF9iZV9hbl9pbnRlZ2VyX3R5cGUoKTsKKyAgICB9CisgIH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfSW50ZWdlckNvbmNlcHQ8c2hvcnQ+IHsgdm9pZCBfX2NvbnN0cmFpbnRzKCkge30gfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9JbnRlZ2VyQ29uY2VwdDx1bnNpZ25lZCBzaG9ydD4geyB2b2lkIF9fY29uc3RyYWludHMoKXt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfSW50ZWdlckNvbmNlcHQ8aW50PiB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfSW50ZWdlckNvbmNlcHQ8dW5zaWduZWQgaW50PiB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfSW50ZWdlckNvbmNlcHQ8bG9uZz4geyB2b2lkIF9fY29uc3RyYWludHMoKSB7fSB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0ludGVnZXJDb25jZXB0PHVuc2lnbmVkIGxvbmc+IHsgdm9pZCBfX2NvbnN0cmFpbnRzKCkge30gfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9JbnRlZ2VyQ29uY2VwdDxsb25nIGxvbmc+IHsgdm9pZCBfX2NvbnN0cmFpbnRzKCkge30gfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9JbnRlZ2VyQ29uY2VwdDx1bnNpZ25lZCBsb25nIGxvbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9TaWduZWRJbnRlZ2VyQ29uY2VwdCB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19lcnJvcl90eXBlX211c3RfYmVfYV9zaWduZWRfaW50ZWdlcl90eXBlKCk7CisgICAgfQorICB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX1NpZ25lZEludGVnZXJDb25jZXB0PHNob3J0PiB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfU2lnbmVkSW50ZWdlckNvbmNlcHQ8aW50PiB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfU2lnbmVkSW50ZWdlckNvbmNlcHQ8bG9uZz4geyB2b2lkIF9fY29uc3RyYWludHMoKSB7fSB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX1NpZ25lZEludGVnZXJDb25jZXB0PGxvbmcgbG9uZz4geyB2b2lkIF9fY29uc3RyYWludHMoKXt9fTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX1Vuc2lnbmVkSW50ZWdlckNvbmNlcHQgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZXJyb3JfdHlwZV9tdXN0X2JlX2FuX3Vuc2lnbmVkX2ludGVnZXJfdHlwZSgpOworICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9VbnNpZ25lZEludGVnZXJDb25jZXB0PHVuc2lnbmVkIHNob3J0PgorICAgIHsgdm9pZCBfX2NvbnN0cmFpbnRzKCkge30gfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9VbnNpZ25lZEludGVnZXJDb25jZXB0PHVuc2lnbmVkIGludD4KKyAgICB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfVW5zaWduZWRJbnRlZ2VyQ29uY2VwdDx1bnNpZ25lZCBsb25nPgorICAgIHsgdm9pZCBfX2NvbnN0cmFpbnRzKCkge30gfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9VbnNpZ25lZEludGVnZXJDb25jZXB0PHVuc2lnbmVkIGxvbmcgbG9uZz4KKyAgICB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisKKyAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gQmFzaWMgQ29uY2VwdHMKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX0RlZmF1bHRDb25zdHJ1Y3RpYmxlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX1RwIF9fYSBfSXNVbnVzZWQ7ICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX0Fzc2lnbmFibGVDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2EgPSBfX2E7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgICBfX2NvbnN0X2NvbnN0cmFpbnRzKF9fYSk7CisgICAgfQorICAgIHZvaWQgX19jb25zdF9jb25zdHJhaW50cyhjb25zdCBfVHAmIF9fYikgeworICAgICAgX19hID0gX19iOyAgICAgICAgICAgICAgICAgICAvLyBjb25zdCByZXF1aXJlZCBmb3IgYXJndW1lbnQgdG8gYXNzaWdubWVudAorICAgIH0KKyAgICBfVHAgX19hOworICAgIC8vIHBvc3NpYmx5IHNob3VsZCBiZSAiVHAqIGE7IiBhbmQgdGhlbiBkZXJlZmVyZW5jZSAiYSIgaW4gY29uc3RyYWludAorICAgIC8vIGZ1bmN0aW9ucz8gIHByZXNlbnQgd2F5IHdvdWxkIHJlcXVpcmUgYSBkZWZhdWx0IGN0b3IsIGkgdGhpbmsuLi4KKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX0NvcHlDb25zdHJ1Y3RpYmxlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX1RwIF9fYShfX2IpOyAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgY29weSBjb25zdHJ1Y3RvcgorICAgICAgX1RwKiBfX3B0ciBfSXNVbnVzZWQgPSAmX19hOyAgICAgIC8vIHJlcXVpcmUgYWRkcmVzcyBvZiBvcGVyYXRvcgorICAgICAgX19jb25zdF9jb25zdHJhaW50cyhfX2EpOworICAgIH0KKyAgICB2b2lkIF9fY29uc3RfY29uc3RyYWludHMoY29uc3QgX1RwJiBfX2EpIHsKKyAgICAgIF9UcCBfX2MgX0lzVW51c2VkKF9fYSk7ICAgICAgICAgICAvLyByZXF1aXJlIGNvbnN0IGNvcHkgY29uc3RydWN0b3IKKyAgICAgIGNvbnN0IF9UcCogX19wdHIgX0lzVW51c2VkID0gJl9fYTsgLy8gcmVxdWlyZSBjb25zdCBhZGRyZXNzIG9mIG9wZXJhdG9yCisgICAgfQorICAgIF9UcCBfX2I7CisgIH07CisKKyAgLy8gVGhlIFNHSSBTVEwgdmVyc2lvbiBvZiBBc3NpZ25hYmxlIHJlcXVpcmVzIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX1NHSUFzc2lnbmFibGVDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfVHAgX19iIF9Jc1VudXNlZChfX2EpOworICAgICAgX19hID0gX19hOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgYXNzaWdubWVudCBvcGVyYXRvcgorICAgICAgX19jb25zdF9jb25zdHJhaW50cyhfX2EpOworICAgIH0KKyAgICB2b2lkIF9fY29uc3RfY29uc3RyYWludHMoY29uc3QgX1RwJiBfX2IpIHsKKyAgICAgIF9UcCBfX2MgX0lzVW51c2VkKF9fYik7CisgICAgICBfX2EgPSBfX2I7ICAgICAgICAgICAgICAvLyBjb25zdCByZXF1aXJlZCBmb3IgYXJndW1lbnQgdG8gYXNzaWdubWVudAorICAgIH0KKyAgICBfVHAgX19hOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnJvbSwgY2xhc3MgX1RvPgorICBzdHJ1Y3QgX0NvbnZlcnRpYmxlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX1RvIF9feSBfSXNVbnVzZWQgPSBfX3g7CisgICAgfQorICAgIF9Gcm9tIF9feDsKKyAgfTsKKworICAvLyBUaGUgQysrIHN0YW5kYXJkIHJlcXVpcmVtZW50cyBmb3IgbWFueSBjb25jZXB0cyB0YWxrIGFib3V0IHJldHVybgorICAvLyB0eXBlcyB0aGF0IG11c3QgYmUgImNvbnZlcnRpYmxlIHRvIGJvb2wiLiAgVGhlIHByb2JsZW0gd2l0aCB0aGlzCisgIC8vIHJlcXVpcmVtZW50IGlzIHRoYXQgaXQgbGVhdmVzIHRoZSBkb29yIG9wZW4gZm9yIGV2aWwgcHJveGllcyB0aGF0CisgIC8vIGRlZmluZSB0aGluZ3MgbGlrZSBvcGVyYXRvcnx8IHdpdGggc3RyYW5nZSByZXR1cm4gdHlwZXMuICBUd28KKyAgLy8gcG9zc2libGUgc29sdXRpb25zIGFyZToKKyAgLy8gMSkgcmVxdWlyZSB0aGUgcmV0dXJuIHR5cGUgdG8gYmUgZXhhY3RseSBib29sCisgIC8vIDIpIHN0YXkgd2l0aCBjb252ZXJ0aWJsZSB0byBib29sLCBhbmQgYWxzbworICAvLyAgICBzcGVjaWZ5IHN0dWZmIGFib3V0IGFsbCB0aGUgbG9naWNhbCBvcGVyYXRvcnMuCisgIC8vIEZvciBub3cgd2UganVzdCB0ZXN0IGZvciBjb252ZXJ0aWJsZSB0byBib29sLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICB2b2lkIF9fYXV4X3JlcXVpcmVfYm9vbGVhbl9leHByKGNvbnN0IF9UcCYgX190KSB7CisgICAgYm9vbCBfX3ggX0lzVW51c2VkID0gX190OworICB9CisKKy8vIEZJWE1FCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIHN0cnVjdCBfRXF1YWxpdHlDb21wYXJhYmxlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19hdXhfcmVxdWlyZV9ib29sZWFuX2V4cHIoX19hID09IF9fYik7CisgICAgfQorICAgIF9UcCBfX2EsIF9fYjsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fYXV4X3JlcXVpcmVfYm9vbGVhbl9leHByKF9fYSA8IF9fYik7CisgICAgfQorICAgIF9UcCBfX2EsIF9fYjsKKyAgfTsKKworICAvLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gU0dJIFNUTCdzIExlc3NUaGFuQ29tcGFyYWJsZS4KKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9Db21wYXJhYmxlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19hdXhfcmVxdWlyZV9ib29sZWFuX2V4cHIoX19hIDwgX19iKTsKKyAgICAgIF9fYXV4X3JlcXVpcmVfYm9vbGVhbl9leHByKF9fYSA+IF9fYik7CisgICAgICBfX2F1eF9yZXF1aXJlX2Jvb2xlYW5fZXhwcihfX2EgPD0gX19iKTsKKyAgICAgIF9fYXV4X3JlcXVpcmVfYm9vbGVhbl9leHByKF9fYSA+PSBfX2IpOworICAgIH0KKyAgICBfVHAgX19hLCBfX2I7CisgIH07CisKKyNkZWZpbmUgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9QUkVESUNBVEVfT1BfQ09OU1RSQUlOVChfT1AsX05BTUUpIFwKKyAgdGVtcGxhdGUgPGNsYXNzIF9GaXJzdCwgY2xhc3MgX1NlY29uZD4gXAorICBzdHJ1Y3QgX05BTUUgeyBcCisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeyAodm9pZClfX2NvbnN0cmFpbnRzXygpOyB9IFwKKyAgICBib29sIF9fY29uc3RyYWludHNfKCkgeyAgXAorICAgICAgcmV0dXJuICBfX2EgX09QIF9fYjsgXAorICAgIH0gXAorICAgIF9GaXJzdCBfX2E7IFwKKyAgICBfU2Vjb25kIF9fYjsgXAorICB9CisKKyNkZWZpbmUgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9PUEVSQVRPUl9DT05TVFJBSU5UKF9PUCxfTkFNRSkgXAorICB0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX0ZpcnN0LCBjbGFzcyBfU2Vjb25kPiBcCisgIHN0cnVjdCBfTkFNRSB7IFwKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7ICh2b2lkKV9fY29uc3RyYWludHNfKCk7IH0gXAorICAgIF9SZXQgX19jb25zdHJhaW50c18oKSB7ICBcCisgICAgICByZXR1cm4gX19hIF9PUCBfX2I7IFwKKyAgICB9IFwKKyAgICBfRmlyc3QgX19hOyBcCisgICAgX1NlY29uZCBfX2I7IFwKKyAgfQorCisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfUFJFRElDQVRFX09QX0NPTlNUUkFJTlQoPT0sIF9FcXVhbE9wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfUFJFRElDQVRFX09QX0NPTlNUUkFJTlQoIT0sIF9Ob3RFcXVhbE9wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfUFJFRElDQVRFX09QX0NPTlNUUkFJTlQoPCwgX0xlc3NUaGFuT3BDb25jZXB0KTsKKyAgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9QUkVESUNBVEVfT1BfQ09OU1RSQUlOVCg8PSwgX0xlc3NFcXVhbE9wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfUFJFRElDQVRFX09QX0NPTlNUUkFJTlQoPiwgX0dyZWF0ZXJUaGFuT3BDb25jZXB0KTsKKyAgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9QUkVESUNBVEVfT1BfQ09OU1RSQUlOVCg+PSwgX0dyZWF0ZXJFcXVhbE9wQ29uY2VwdCk7CisKKyAgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9PUEVSQVRPUl9DT05TVFJBSU5UKCssIF9QbHVzT3BDb25jZXB0KTsKKyAgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9PUEVSQVRPUl9DT05TVFJBSU5UKCosIF9UaW1lc09wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfT1BFUkFUT1JfQ09OU1RSQUlOVCgvLCBfRGl2aWRlT3BDb25jZXB0KTsKKyAgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9PUEVSQVRPUl9DT05TVFJBSU5UKC0sIF9TdWJ0cmFjdE9wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfT1BFUkFUT1JfQ09OU1RSQUlOVCglLCBfTW9kT3BDb25jZXB0KTsKKworI3VuZGVmIF9HTElCQ1hYX0RFRklORV9CSU5BUllfUFJFRElDQVRFX09QX0NPTlNUUkFJTlQKKyN1bmRlZiBfR0xJQkNYWF9ERUZJTkVfQklOQVJZX09QRVJBVE9SX0NPTlNUUkFJTlQKKworICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBGdW5jdGlvbiBPYmplY3QgQ29uY2VwdHMKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0Z1bmMsIGNsYXNzIF9SZXR1cm4+CisgIHN0cnVjdCBfR2VuZXJhdG9yQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgY29uc3QgX1JldHVybiYgX19yIF9Jc1VudXNlZCA9IF9fZigpOy8vIHJlcXVpcmUgb3BlcmF0b3IoKSBtZW1iZXIgZnVuY3Rpb24KKyAgICB9CisgICAgX0Z1bmMgX19mOworICB9OworCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9GdW5jPgorICBzdHJ1Y3QgX0dlbmVyYXRvckNvbmNlcHQ8X0Z1bmMsdm9pZD4KKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIG9wZXJhdG9yKCkgbWVtYmVyIGZ1bmN0aW9uCisgICAgfQorICAgIF9GdW5jIF9fZjsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0Z1bmMsIGNsYXNzIF9SZXR1cm4sIGNsYXNzIF9Bcmc+CisgIHN0cnVjdCBfVW5hcnlGdW5jdGlvbkNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fciA9IF9fZihfX2FyZyk7ICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBvcGVyYXRvcigpCisgICAgfQorICAgIF9GdW5jIF9fZjsKKyAgICBfQXJnIF9fYXJnOworICAgIF9SZXR1cm4gX19yOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnVuYywgY2xhc3MgX0FyZz4KKyAgc3RydWN0IF9VbmFyeUZ1bmN0aW9uQ29uY2VwdDxfRnVuYywgdm9pZCwgX0FyZz4geworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZihfX2FyZyk7ICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIG9wZXJhdG9yKCkKKyAgICB9CisgICAgX0Z1bmMgX19mOworICAgIF9BcmcgX19hcmc7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9GdW5jLCBjbGFzcyBfUmV0dXJuLCBjbGFzcyBfRmlyc3QsIGNsYXNzIF9TZWNvbmQ+CisgIHN0cnVjdCBfQmluYXJ5RnVuY3Rpb25Db25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX3IgPSBfX2YoX19maXJzdCwgX19zZWNvbmQpOyAgICAgLy8gcmVxdWlyZSBvcGVyYXRvcigpCisgICAgfQorICAgIF9GdW5jIF9fZjsKKyAgICBfRmlyc3QgX19maXJzdDsKKyAgICBfU2Vjb25kIF9fc2Vjb25kOworICAgIF9SZXR1cm4gX19yOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnVuYywgY2xhc3MgX0ZpcnN0LCBjbGFzcyBfU2Vjb25kPgorICBzdHJ1Y3QgX0JpbmFyeUZ1bmN0aW9uQ29uY2VwdDxfRnVuYywgdm9pZCwgX0ZpcnN0LCBfU2Vjb25kPgorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mKF9fZmlyc3QsIF9fc2Vjb25kKTsgICAgICAgICAgIC8vIHJlcXVpcmUgb3BlcmF0b3IoKQorICAgIH0KKyAgICBfRnVuYyBfX2Y7CisgICAgX0ZpcnN0IF9fZmlyc3Q7CisgICAgX1NlY29uZCBfX3NlY29uZDsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0Z1bmMsIGNsYXNzIF9Bcmc+CisgIHN0cnVjdCBfVW5hcnlQcmVkaWNhdGVDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2F1eF9yZXF1aXJlX2Jvb2xlYW5fZXhwcihfX2YoX19hcmcpKTsgLy8gcmVxdWlyZSBvcCgpIHJldHVybmluZyBib29sCisgICAgfQorICAgIF9GdW5jIF9fZjsKKyAgICBfQXJnIF9fYXJnOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnVuYywgY2xhc3MgX0ZpcnN0LCBjbGFzcyBfU2Vjb25kPgorICBzdHJ1Y3QgX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fYXV4X3JlcXVpcmVfYm9vbGVhbl9leHByKF9fZihfX2EsIF9fYikpOyAvLyByZXF1aXJlIG9wKCkgcmV0dXJuaW5nIGJvb2wKKyAgICB9CisgICAgX0Z1bmMgX19mOworICAgIF9GaXJzdCBfX2E7CisgICAgX1NlY29uZCBfX2I7CisgIH07CisKKyAgLy8gdXNlIHRoaXMgd2hlbiBmdW5jdG9yIGlzIHVzZWQgaW5zaWRlIGEgY29udGFpbmVyIGNsYXNzIGxpa2Ugc3RkOjpzZXQKKyAgdGVtcGxhdGUgPGNsYXNzIF9GdW5jLCBjbGFzcyBfRmlyc3QsIGNsYXNzIF9TZWNvbmQ+CisgIHN0cnVjdCBfQ29uc3RfQmluYXJ5UHJlZGljYXRlQ29uY2VwdCB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19jb25zdF9jb25zdHJhaW50cyhfX2YpOworICAgIH0KKyAgICB2b2lkIF9fY29uc3RfY29uc3RyYWludHMoY29uc3QgX0Z1bmMmIF9fZnVuKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9GdW5jLCBfRmlyc3QsIF9TZWNvbmQ+ID4oKTsKKyAgICAgIC8vIG9wZXJhdG9yKCkgbXVzdCBiZSBhIGNvbnN0IG1lbWJlciBmdW5jdGlvbgorICAgICAgX19hdXhfcmVxdWlyZV9ib29sZWFuX2V4cHIoX19mdW4oX19hLCBfX2IpKTsKKyAgICB9CisgICAgX0Z1bmMgX19mOworICAgIF9GaXJzdCBfX2E7CisgICAgX1NlY29uZCBfX2I7CisgIH07CisKKyAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gSXRlcmF0b3IgQ29uY2VwdHMKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX1RyaXZpYWxJdGVyYXRvckNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKy8vICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9EZWZhdWx0Q29uc3RydWN0aWJsZUNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQXNzaWduYWJsZUNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfRXF1YWxpdHlDb21wYXJhYmxlQ29uY2VwdDxfVHA+ID4oKTsKKy8vICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfVHA+Ojp2YWx1ZV90eXBlIF9WOworICAgICAgKHZvaWQpKl9faTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgZGVyZWZlcmVuY2Ugb3BlcmF0b3IKKyAgICB9CisgICAgX1RwIF9faTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX011dGFibGVfVHJpdmlhbEl0ZXJhdG9yQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX1RyaXZpYWxJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICAqX19pID0gKl9fajsgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBkZXJlZmVyZW5jZSBhbmQgYXNzaWdubWVudAorICAgIH0KKyAgICBfVHAgX19pLCBfX2o7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9JbnB1dEl0ZXJhdG9yQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX1RyaXZpYWxJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICAvLyByZXF1aXJlIGl0ZXJhdG9yX3RyYWl0cyB0eXBlZGVmJ3MKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmOworLy8gICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfU2lnbmVkSW50ZWdlckNvbmNlcHQ8X0RpZmY+ID4oKTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6cmVmZXJlbmNlIF9SZWY7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9UcD46OnBvaW50ZXIgX1B0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfVHA+OjppdGVyYXRvcl9jYXRlZ29yeSBfQ2F0OworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0NvbnZlcnRpYmxlQ29uY2VwdDwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnPiA+KCk7CisgICAgICArK19faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBwcmVpbmNyZW1lbnQgb3BlcmF0b3IKKyAgICAgIF9faSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIHBvc3RpbmNyZW1lbnQgb3BlcmF0b3IKKyAgICB9CisgICAgX1RwIF9faTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVmFsdWVUPgorICBzdHJ1Y3QgX091dHB1dEl0ZXJhdG9yQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0Fzc2lnbmFibGVDb25jZXB0PF9UcD4gPigpOworICAgICAgKytfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgcHJlaW5jcmVtZW50IG9wZXJhdG9yCisgICAgICBfX2krKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBwb3N0aW5jcmVtZW50IG9wZXJhdG9yCisgICAgICAqX19pKysgPSBfX3Q7ICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBwb3N0aW5jcmVtZW50IGFuZCBhc3NpZ25tZW50CisgICAgfQorICAgIF9UcCBfX2k7CisgICAgX1ZhbHVlVCBfX3Q7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfRGVmYXVsdENvbnN0cnVjdGlibGVDb25jZXB0PF9UcD4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0NvbnZlcnRpYmxlQ29uY2VwdDwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc+ID4oKTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6cmVmZXJlbmNlIF9SZWY7CisgICAgICBfUmVmIF9fciBfSXNVbnVzZWQgPSAqX19pOworICAgIH0KKyAgICBfVHAgX19pOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIHN0cnVjdCBfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfVHA+ID4oKTsKKyAgICAgICpfX2krKyA9ICpfX2k7ICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIHBvc3RpbmNyZW1lbnQgYW5kIGFzc2lnbm1lbnQKKyAgICB9CisgICAgX1RwIF9faTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9UcD4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0NvbnZlcnRpYmxlQ29uY2VwdDwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgIHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWc+ID4oKTsKKyAgICAgIC0tX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIHByZWRlY3JlbWVudCBvcGVyYXRvcgorICAgICAgX19pLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgcG9zdGRlY3JlbWVudCBvcGVyYXRvcgorICAgIH0KKyAgICBfVHAgX19pOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIHN0cnVjdCBfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDxfVHA+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICAqX19pLS0gPSAqX19pOyAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBwb3N0ZGVjcmVtZW50IGFuZCBhc3NpZ25tZW50CisgICAgfQorICAgIF9UcCBfX2k7CisgIH07CisKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQ29tcGFyYWJsZUNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQ29udmVydGlibGVDb25jZXB0PAorICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfVHA+OjppdGVyYXRvcl9jYXRlZ29yeSwKKyAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZz4gPigpOworICAgICAgLy8gPz8/IFdlIGRvbid0IHVzZSBfUmVmLCBhcmUgd2UganVzdCBjaGVja2luZyBmb3IgInJlZmVyZW5jZWFiaWxpdHkiPworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfVHA+OjpyZWZlcmVuY2UgX1JlZjsKKworICAgICAgX19pICs9IF9fbjsgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgYXNzaWdubWVudCBhZGRpdGlvbiBvcGVyYXRvcgorICAgICAgX19pID0gX19pICsgX19uOyBfX2kgPSBfX24gKyBfX2k7IC8vIHJlcXVpcmUgYWRkaXRpb24gd2l0aCBkaWZmZXJlbmNlIHR5cGUKKyAgICAgIF9faSAtPSBfX247ICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIGFzc2lnbm1lbnQgc3VidHJhY3Rpb24gb3AKKyAgICAgIF9faSA9IF9faSAtIF9fbjsgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIHN1YnRyYWN0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGRpZmZlcmVuY2UgdHlwZQorICAgICAgX19uID0gX19pIC0gX19qOyAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgZGlmZmVyZW5jZSBvcGVyYXRvcgorICAgICAgKHZvaWQpX19pW19fbl07ICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgZWxlbWVudCBhY2Nlc3Mgb3BlcmF0b3IKKyAgICB9CisgICAgX1RwIF9fYSwgX19iOworICAgIF9UcCBfX2ksIF9fajsKKyAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfVHA+OjpkaWZmZXJlbmNlX3R5cGUgX19uOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIHN0cnVjdCBfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PF9UcD4gPigpOworICAgICAgX19pW19fbl0gPSAqX19pOyAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgZWxlbWVudCBhY2Nlc3MgYW5kIGFzc2lnbm1lbnQKKyAgICB9CisgICAgX1RwIF9faTsKKyAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfVHA+OjpkaWZmZXJlbmNlX3R5cGUgX19uOworICB9OworCisgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIENvbnRhaW5lciBDb25jZXB0cworCisgIHRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgorICBzdHJ1Y3QgX0NvbnRhaW5lckNvbmNlcHQKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSBfVmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6c2l6ZV90eXBlIF9TaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpjb25zdF9yZWZlcmVuY2UgX0NvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6OmNvbnN0X3BvaW50ZXIgX0NvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBfQ29uc3RfaXRlcmF0b3I7CisKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0NvbnN0X2l0ZXJhdG9yPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQXNzaWduYWJsZUNvbmNlcHQ8X0NvbnRhaW5lcj4gPigpOworICAgICAgY29uc3QgX0NvbnRhaW5lciBfX2M7CisgICAgICBfX2kgPSBfX2MuYmVnaW4oKTsKKyAgICAgIF9faSA9IF9fYy5lbmQoKTsKKyAgICAgIF9fbiA9IF9fYy5zaXplKCk7CisgICAgICBfX24gPSBfX2MubWF4X3NpemUoKTsKKyAgICAgIF9fYiA9IF9fYy5lbXB0eSgpOworICAgIH0KKyAgICBib29sIF9fYjsKKyAgICBfQ29uc3RfaXRlcmF0b3IgX19pOworICAgIF9TaXplX3R5cGUgX19uOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgorICBzdHJ1Y3QgX011dGFibGVfQ29udGFpbmVyQ29uY2VwdAorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlIF9WYWx1ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6cmVmZXJlbmNlIF9SZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBfSXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpwb2ludGVyIF9Qb2ludGVyOworCisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0NvbnRhaW5lckNvbmNlcHQ8X0NvbnRhaW5lcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0Fzc2lnbmFibGVDb25jZXB0PF9WYWx1ZV90eXBlPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0l0ZXJhdG9yPiA+KCk7CisKKyAgICAgIF9faSA9IF9fYy5iZWdpbigpOworICAgICAgX19pID0gX19jLmVuZCgpOworICAgICAgX19jLnN3YXAoX19jMik7CisgICAgfQorICAgIF9JdGVyYXRvciBfX2k7CisgICAgX0NvbnRhaW5lciBfX2MsIF9fYzI7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkQ29udGFpbmVyPgorICBzdHJ1Y3QgX0ZvcndhcmRDb250YWluZXJDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQ29udGFpbmVyQ29uY2VwdDxfRm9yd2FyZENvbnRhaW5lcj4gPigpOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRm9yd2FyZENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgX0NvbnN0X2l0ZXJhdG9yOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0NvbnN0X2l0ZXJhdG9yPiA+KCk7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZENvbnRhaW5lcj4KKyAgc3RydWN0IF9NdXRhYmxlX0ZvcndhcmRDb250YWluZXJDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfRm9yd2FyZENvbnRhaW5lckNvbmNlcHQ8X0ZvcndhcmRDb250YWluZXI+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9NdXRhYmxlX0NvbnRhaW5lckNvbmNlcHQ8X0ZvcndhcmRDb250YWluZXI+ID4oKTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0ZvcndhcmRDb250YWluZXI6Oml0ZXJhdG9yIF9JdGVyYXRvcjsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0l0ZXJhdG9yPiA+KCk7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfUmV2ZXJzaWJsZUNvbnRhaW5lcj4KKyAgc3RydWN0IF9SZXZlcnNpYmxlQ29udGFpbmVyQ29uY2VwdAorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmV2ZXJzaWJsZUNvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgX0NvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JldmVyc2libGVDb250YWluZXI6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIF9Db25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0ZvcndhcmRDb250YWluZXJDb25jZXB0PF9SZXZlcnNpYmxlQ29udGFpbmVyPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDxfQ29uc3RfaXRlcmF0b3I+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8CisgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PF9Db25zdF9yZXZlcnNlX2l0ZXJhdG9yPiA+KCk7CisKKyAgICAgIGNvbnN0IF9SZXZlcnNpYmxlQ29udGFpbmVyIF9fYzsKKyAgICAgIF9Db25zdF9yZXZlcnNlX2l0ZXJhdG9yIF9faSA9IF9fYy5yYmVnaW4oKTsKKyAgICAgIF9faSA9IF9fYy5yZW5kKCk7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfUmV2ZXJzaWJsZUNvbnRhaW5lcj4KKyAgc3RydWN0IF9NdXRhYmxlX1JldmVyc2libGVDb250YWluZXJDb25jZXB0CisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXZlcnNpYmxlQ29udGFpbmVyOjppdGVyYXRvciBfSXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmV2ZXJzaWJsZUNvbnRhaW5lcjo6cmV2ZXJzZV9pdGVyYXRvciBfUmV2ZXJzZV9pdGVyYXRvcjsKKworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8X1JldmVyc2libGVDb250YWluZXJDb25jZXB0PF9SZXZlcnNpYmxlQ29udGFpbmVyPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPAorICAgICAgICBfTXV0YWJsZV9Gb3J3YXJkQ29udGFpbmVyQ29uY2VwdDxfUmV2ZXJzaWJsZUNvbnRhaW5lcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczxfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PF9JdGVyYXRvcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwKKyAgICAgICAgX011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDxfUmV2ZXJzZV9pdGVyYXRvcj4gPigpOworCisgICAgICBfUmV2ZXJzZV9pdGVyYXRvciBfX2kgPSBfX2MucmJlZ2luKCk7CisgICAgICBfX2kgPSBfX2MucmVuZCgpOworICAgIH0KKyAgICBfUmV2ZXJzaWJsZUNvbnRhaW5lciBfX2M7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NDb250YWluZXI+CisgIHN0cnVjdCBfUmFuZG9tQWNjZXNzQ29udGFpbmVyQ29uY2VwdAorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzQ29udGFpbmVyOjpzaXplX3R5cGUgX1NpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NDb250YWluZXI6OmNvbnN0X3JlZmVyZW5jZSBfQ29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgX0NvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lcjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgX0NvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPAorICAgICAgICBfUmV2ZXJzaWJsZUNvbnRhaW5lckNvbmNlcHQ8X1JhbmRvbUFjY2Vzc0NvbnRhaW5lcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDxfQ29uc3RfaXRlcmF0b3I+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8CisgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8X0NvbnN0X3JldmVyc2VfaXRlcmF0b3I+ID4oKTsKKworICAgICAgY29uc3QgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lciBfX2M7CisgICAgICBfQ29uc3RfcmVmZXJlbmNlIF9fciBfSXNVbnVzZWQgPSBfX2NbX19uXTsKKyAgICB9CisgICAgX1NpemVfdHlwZSBfX247CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NDb250YWluZXI+CisgIHN0cnVjdCBfTXV0YWJsZV9SYW5kb21BY2Nlc3NDb250YWluZXJDb25jZXB0CisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NDb250YWluZXI6OnNpemVfdHlwZSBfU2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lcjo6cmVmZXJlbmNlIF9SZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzQ29udGFpbmVyOjppdGVyYXRvciBfSXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzQ29udGFpbmVyOjpyZXZlcnNlX2l0ZXJhdG9yIF9SZXZlcnNlX2l0ZXJhdG9yOworCisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwKKyAgICAgICAgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lckNvbmNlcHQ8X1JhbmRvbUFjY2Vzc0NvbnRhaW5lcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwKKyAgICAgICAgX011dGFibGVfUmV2ZXJzaWJsZUNvbnRhaW5lckNvbmNlcHQ8X1JhbmRvbUFjY2Vzc0NvbnRhaW5lcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PF9JdGVyYXRvcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwKKyAgICAgICAgX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PF9SZXZlcnNlX2l0ZXJhdG9yPiA+KCk7CisKKyAgICAgIF9SZWZlcmVuY2UgX19yIF9Jc1VudXNlZCA9IF9fY1tfX2ldOworICAgIH0KKyAgICBfU2l6ZV90eXBlIF9faTsKKyAgICBfUmFuZG9tQWNjZXNzQ29udGFpbmVyIF9fYzsKKyAgfTsKKworICAvLyBBIFNlcXVlbmNlIGlzIGluaGVyZW50bHkgbXV0YWJsZQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1NlcXVlbmNlPgorICBzdHJ1Y3QgX1NlcXVlbmNlQ29uY2VwdAorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnJlZmVyZW5jZSBfUmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpjb25zdF9yZWZlcmVuY2UgX0NvbnN0X3JlZmVyZW5jZTsKKworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIC8vIE1hdHQgQXVzdGVybidzIGJvb2sgcHV0cyBEZWZhdWx0Q29uc3RydWN0aWJsZSBoZXJlLCB0aGUgQysrCisgICAgICAvLyBzdGFuZGFyZCBwbGFjZXMgaXQgaW4gQ29udGFpbmVyCisgICAgICAvLyAgICBmdW5jdGlvbl9yZXF1aXJlczwgRGVmYXVsdENvbnN0cnVjdGlibGU8U2VxdWVuY2U+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9NdXRhYmxlX0ZvcndhcmRDb250YWluZXJDb25jZXB0PF9TZXF1ZW5jZT4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0RlZmF1bHRDb25zdHJ1Y3RpYmxlQ29uY2VwdDxfU2VxdWVuY2U+ID4oKTsKKworICAgICAgX1NlcXVlbmNlCisJX19jIF9Jc1VudXNlZChfX24sIF9fdCksCisgICAgICAgIF9fYzIgX0lzVW51c2VkKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIF9fYy5pbnNlcnQoX19wLCBfX3QpOworICAgICAgX19jLmluc2VydChfX3AsIF9fbiwgX190KTsKKyAgICAgIF9fYy5pbnNlcnQoX19wLCBfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBfX2MuZXJhc2UoX19wKTsKKyAgICAgIF9fYy5lcmFzZShfX3AsIF9fcSk7CisKKyAgICAgIF9SZWZlcmVuY2UgX19yIF9Jc1VudXNlZCA9IF9fYy5mcm9udCgpOworCisgICAgICBfX2NvbnN0X2NvbnN0cmFpbnRzKF9fYyk7CisgICAgfQorICAgIHZvaWQgX19jb25zdF9jb25zdHJhaW50cyhjb25zdCBfU2VxdWVuY2UmIF9fYykgeworICAgICAgX0NvbnN0X3JlZmVyZW5jZSBfX3IgX0lzVW51c2VkID0gX19jLmZyb250KCk7CisgICAgfQorICAgIHR5cGVuYW1lIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZSBfX3Q7CisgICAgdHlwZW5hbWUgX1NlcXVlbmNlOjpzaXplX3R5cGUgX19uOworICAgIHR5cGVuYW1lIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZSAqX19maXJzdCwgKl9fbGFzdDsKKyAgICB0eXBlbmFtZSBfU2VxdWVuY2U6Oml0ZXJhdG9yIF9fcCwgX19xOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnJvbnRJbnNlcnRpb25TZXF1ZW5jZT4KKyAgc3RydWN0IF9Gcm9udEluc2VydGlvblNlcXVlbmNlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX1NlcXVlbmNlQ29uY2VwdDxfRnJvbnRJbnNlcnRpb25TZXF1ZW5jZT4gPigpOworCisgICAgICBfX2MucHVzaF9mcm9udChfX3QpOworICAgICAgX19jLnBvcF9mcm9udCgpOworICAgIH0KKyAgICBfRnJvbnRJbnNlcnRpb25TZXF1ZW5jZSBfX2M7CisgICAgdHlwZW5hbWUgX0Zyb250SW5zZXJ0aW9uU2VxdWVuY2U6OnZhbHVlX3R5cGUgX190OworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfQmFja0luc2VydGlvblNlcXVlbmNlPgorICBzdHJ1Y3QgX0JhY2tJbnNlcnRpb25TZXF1ZW5jZUNvbmNlcHQKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0JhY2tJbnNlcnRpb25TZXF1ZW5jZTo6cmVmZXJlbmNlIF9SZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFja0luc2VydGlvblNlcXVlbmNlOjpjb25zdF9yZWZlcmVuY2UgX0NvbnN0X3JlZmVyZW5jZTsKKworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9TZXF1ZW5jZUNvbmNlcHQ8X0JhY2tJbnNlcnRpb25TZXF1ZW5jZT4gPigpOworCisgICAgICBfX2MucHVzaF9iYWNrKF9fdCk7CisgICAgICBfX2MucG9wX2JhY2soKTsKKyAgICAgIF9SZWZlcmVuY2UgX19yIF9Jc1VudXNlZCA9IF9fYy5iYWNrKCk7CisgICAgfQorICAgIHZvaWQgX19jb25zdF9jb25zdHJhaW50cyhjb25zdCBfQmFja0luc2VydGlvblNlcXVlbmNlJiBfX2MpIHsKKyAgICAgIF9Db25zdF9yZWZlcmVuY2UgX19yIF9Jc1VudXNlZCA9IF9fYy5iYWNrKCk7CisgICAgfTsKKyAgICBfQmFja0luc2VydGlvblNlcXVlbmNlIF9fYzsKKyAgICB0eXBlbmFtZSBfQmFja0luc2VydGlvblNlcXVlbmNlOjp2YWx1ZV90eXBlIF9fdDsKKyAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjdW5kZWYgX0lzVW51c2VkCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9CT09TVF9DT05DRVBUX0NIRUNLCisKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2MrKzB4X3dhcm5pbmcuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jKysweF93YXJuaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ3YjM3NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jKysweF93YXJuaW5nLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvYysrMHhfd2FybmluZy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zZndkfQorICovCisKKyNpZm5kZWYgX0NYWDBYX1dBUk5JTkdfSAorI2RlZmluZSBfQ1hYMFhfV0FSTklOR19IIDEKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorI2Vycm9yIFRoaXMgZmlsZSByZXF1aXJlcyBjb21waWxlciBhbmQgbGlicmFyeSBzdXBwb3J0IGZvciB0aGUgXAorSVNPIEMrKyAyMDExIHN0YW5kYXJkLiBUaGlzIHN1cHBvcnQgaXMgY3VycmVudGx5IGV4cGVyaW1lbnRhbCwgYW5kIG11c3QgYmUgXAorZW5hYmxlZCB3aXRoIHRoZSAtc3RkPWMrKzExIG9yIC1zdGQ9Z251KysxMSBjb21waWxlciBvcHRpb25zLgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2NoYXJfdHJhaXRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvY2hhcl90cmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjkzNDk1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2NoYXJfdHJhaXRzLmgKQEAgLTAsMCArMSw1NzMgQEAKKy8vIENoYXJhY3RlciBUcmFpdHMgZm9yIHVzZSBieSBzdGFuZGFyZCBzdHJpbmcgYW5kIGlvc3RyZWFtIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2NoYXJfdHJhaXRzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtzdHJpbmd9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIxICBTdHJpbmdzIGxpYnJhcnkKKy8vCisKKyNpZm5kZWYgX0NIQVJfVFJBSVRTX0gKKyNkZWZpbmUgX0NIQVJfVFJBSVRTX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPiAgLy8gc3RkOjpjb3B5LCBzdGQ6OmZpbGxfbgorI2luY2x1ZGUgPGJpdHMvcG9zdHlwZXMuaD4gICAgICAvLyBGb3Igc3RyZWFtcG9zCisjaW5jbHVkZSA8Y3djaGFyPiAgICAgICAgICAgICAgIC8vIEZvciBXRU9GLCB3bWVtbW92ZSwgd21lbXNldCwgZXRjLgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1hcHBpbmcgZnJvbSBjaGFyYWN0ZXIgdHlwZSB0byBhc3NvY2lhdGVkIHR5cGVzLgorICAgKgorICAgKiAgQG5vdGUgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhlIGdlbmVyaWMgdmVyc2lvbgorICAgKiAgb2YgY2hhcl90cmFpdHMuICBJdCBkZWZpbmVzIGludF90eXBlLCBvZmZfdHlwZSwgcG9zX3R5cGUsIGFuZAorICAgKiAgc3RhdGVfdHlwZS4gIEJ5IGRlZmF1bHQgdGhlc2UgYXJlIHVuc2lnbmVkIGxvbmcsIHN0cmVhbW9mZiwKKyAgICogIHN0cmVhbXBvcywgYW5kIG1ic3RhdGVfdC4gIFVzZXJzIHdobyBuZWVkIGEgZGlmZmVyZW50IHNldCBvZgorICAgKiAgdHlwZXMsIGJ1dCB3aG8gZG9uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb25zIG9mIGFueSBmdW5jdGlvbgorICAgKiAgZGVmaW5lZCBpbiBjaGFyX3RyYWl0cywgY2FuIHNwZWNpYWxpemUgX19nbnVfY3h4OjpfQ2hhcl90eXBlcworICAgKiAgd2hpbGUgbGVhdmluZyBfX2dudV9jeHg6OmNoYXJfdHJhaXRzIGFsb25lLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgc3RydWN0IF9DaGFyX3R5cGVzCisgICAgeworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6c3RyZWFtcG9zICBwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpzdHJlYW1vZmYgIG9mZl90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6Om1ic3RhdGVfdCAgc3RhdGVfdHlwZTsKKyAgICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgIEJhc2UgY2xhc3MgdXNlZCB0byBpbXBsZW1lbnQgc3RkOjpjaGFyX3RyYWl0cy4KKyAgICoKKyAgICogIEBub3RlIEZvciBhbnkgZ2l2ZW4gYWN0dWFsIGNoYXJhY3RlciB0eXBlLCB0aGlzIGRlZmluaXRpb24gaXMKKyAgICogIHByb2JhYmx5IHdyb25nLiAgKE1vc3Qgb2YgdGhlIG1lbWJlciBmdW5jdGlvbnMgYXJlIGxpa2VseSB0byBiZQorICAgKiAgcmlnaHQsIGJ1dCB0aGUgaW50X3R5cGUgYW5kIHN0YXRlX3R5cGUgdHlwZWRlZnMsIGFuZCB0aGUgZW9mKCkKKyAgICogIG1lbWJlciBmdW5jdGlvbiwgYXJlIGxpa2VseSB0byBiZSB3cm9uZy4pICBUaGUgcmVhc29uIHRoaXMgY2xhc3MKKyAgICogIGV4aXN0cyBpcyBzbyB1c2VycyBjYW4gc3BlY2lhbGl6ZSBpdC4gIENsYXNzZXMgaW4gbmFtZXNwYWNlIHN0ZAorICAgKiAgbWF5IG5vdCBiZSBzcGVjaWFsaXplZCBmb3IgZnVuZGFtZW50YWwgdHlwZXMsIGJ1dCBjbGFzc2VzIGluCisgICAqICBuYW1lc3BhY2UgX19nbnVfY3h4IG1heSBiZS4KKyAgICoKKyAgICogIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA1Y2gxM3MwMy5odG1sCisgICAqICBmb3IgYWR2aWNlIG9uIGhvdyB0byBtYWtlIHVzZSBvZiB0aGlzIGNsYXNzIGZvciBAYSB1bnVzdWFsIGNoYXJhY3RlcgorICAgKiAgdHlwZXMuIEFsc28sIGNoZWNrIG91dCBpbmNsdWRlL2V4dC9wb2RfY2hhcl90cmFpdHMuaC4gIAorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHN0cnVjdCBjaGFyX3RyYWl0cworICAgIHsKKyAgICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhcl90eXBlczxfQ2hhclQ+OjppbnRfdHlwZSAgICBpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJfdHlwZXM8X0NoYXJUPjo6cG9zX3R5cGUgICAgcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyX3R5cGVzPF9DaGFyVD46Om9mZl90eXBlICAgIG9mZl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhcl90eXBlczxfQ2hhclQ+OjpzdGF0ZV90eXBlICBzdGF0ZV90eXBlOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgYXNzaWduKGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICAgICAgeyBfX2MxID0gX19jMjsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIGVxKGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICAgICAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgICAgbHQoY29uc3QgY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpCisgICAgICB7IHJldHVybiBfX2MxIDwgX19jMjsgfQorCisgICAgICBzdGF0aWMgaW50CisgICAgICBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzdGQ6OnNpemVfdCBfX24pOworCisgICAgICBzdGF0aWMgc3RkOjpzaXplX3QKKyAgICAgIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcyk7CisKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyX3R5cGUqCisgICAgICBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdGQ6OnNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKTsKKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHN0ZDo6c2l6ZV90IF9fbik7CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBjb3B5KGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzdGQ6OnNpemVfdCBfX24pOworCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgYXNzaWduKGNoYXJfdHlwZSogX19zLCBzdGQ6OnNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXJfdHlwZQorICAgICAgdG9fY2hhcl90eXBlKGNvbnN0IGludF90eXBlJiBfX2MpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjaGFyX3R5cGU+KF9fYyk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnRfdHlwZQorICAgICAgdG9faW50X3R5cGUoY29uc3QgY2hhcl90eXBlJiBfX2MpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnRfdHlwZT4oX19jKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIGVxX2ludF90eXBlKGNvbnN0IGludF90eXBlJiBfX2MxLCBjb25zdCBpbnRfdHlwZSYgX19jMikKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludF90eXBlCisgICAgICBlb2YoKQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50X3R5cGU+KF9HTElCQ1hYX1NURElPX0VPRik7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnRfdHlwZQorICAgICAgbm90X2VvZihjb25zdCBpbnRfdHlwZSYgX19jKQorICAgICAgeyByZXR1cm4gIWVxX2ludF90eXBlKF9fYywgZW9mKCkpID8gX19jIDogdG9faW50X3R5cGUoY2hhcl90eXBlKCkpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW50CisgICAgY2hhcl90cmFpdHM8X0NoYXJUPjo6CisgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc3RkOjpzaXplX3QgX19uKQorICAgIHsKKyAgICAgIGZvciAoc3RkOjpzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwlpZiAobHQoX19zMVtfX2ldLCBfX3MyW19faV0pKQorCSAgcmV0dXJuIC0xOworCWVsc2UgaWYgKGx0KF9fczJbX19pXSwgX19zMVtfX2ldKSkKKwkgIHJldHVybiAxOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBzdGQ6OnNpemVfdAorICAgIGNoYXJfdHJhaXRzPF9DaGFyVD46OgorICAgIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcCkKKyAgICB7CisgICAgICBzdGQ6OnNpemVfdCBfX2kgPSAwOworICAgICAgd2hpbGUgKCFlcShfX3BbX19pXSwgY2hhcl90eXBlKCkpKQorICAgICAgICArK19faTsKKyAgICAgIHJldHVybiBfX2k7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjb25zdCB0eXBlbmFtZSBjaGFyX3RyYWl0czxfQ2hhclQ+OjpjaGFyX3R5cGUqCisgICAgY2hhcl90cmFpdHM8X0NoYXJUPjo6CisgICAgZmluZChjb25zdCBjaGFyX3R5cGUqIF9fcywgc3RkOjpzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkKKyAgICB7CisgICAgICBmb3IgKHN0ZDo6c2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisgICAgICAgIGlmIChlcShfX3NbX19pXSwgX19hKSkKKyAgICAgICAgICByZXR1cm4gX19zICsgX19pOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBjaGFyX3RyYWl0czxfQ2hhclQ+OjpjaGFyX3R5cGUqCisgICAgY2hhcl90cmFpdHM8X0NoYXJUPjo6CisgICAgbW92ZShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc3RkOjpzaXplX3QgX19uKQorICAgIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfQ2hhclQqPihfX2J1aWx0aW5fbWVtbW92ZShfX3MxLCBfX3MyLAorCQkJCQkJICAgIF9fbiAqIHNpemVvZihjaGFyX3R5cGUpKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBjaGFyX3RyYWl0czxfQ2hhclQ+OjpjaGFyX3R5cGUqCisgICAgY2hhcl90cmFpdHM8X0NoYXJUPjo6CisgICAgY29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc3RkOjpzaXplX3QgX19uKQorICAgIHsKKyAgICAgIC8vIE5COiBJbmxpbmUgc3RkOjpjb3B5IHNvIG5vIHJlY3Vyc2l2ZSBkZXBlbmRlbmNpZXMuCisgICAgICBzdGQ6OmNvcHkoX19zMiwgX19zMiArIF9fbiwgX19zMSk7CisgICAgICByZXR1cm4gX19zMTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIGNoYXJfdHJhaXRzPF9DaGFyVD46OmNoYXJfdHlwZSoKKyAgICBjaGFyX3RyYWl0czxfQ2hhclQ+OjoKKyAgICBhc3NpZ24oY2hhcl90eXBlKiBfX3MsIHN0ZDo6c2l6ZV90IF9fbiwgY2hhcl90eXBlIF9fYSkKKyAgICB7CisgICAgICAvLyBOQjogSW5saW5lIHN0ZDo6ZmlsbF9uIHNvIG5vIHJlY3Vyc2l2ZSBkZXBlbmRlbmNpZXMuCisgICAgICBzdGQ6OmZpbGxfbihfX3MsIF9fbiwgX19hKTsKKyAgICAgIHJldHVybiBfX3M7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyAyMS4xCisgIC8qKgorICAgKiAgQGJyaWVmICBCYXNpcyBmb3IgZXhwbGljaXQgdHJhaXRzIHNwZWNpYWxpemF0aW9ucy4KKyAgICoKKyAgICogIEBub3RlICBGb3IgYW55IGdpdmVuIGFjdHVhbCBjaGFyYWN0ZXIgdHlwZSwgdGhpcyBkZWZpbml0aW9uIGlzCisgICAqICBwcm9iYWJseSB3cm9uZy4gIFNpbmNlIHRoaXMgaXMganVzdCBhIHRoaW4gd3JhcHBlciBhcm91bmQKKyAgICogIF9fZ251X2N4eDo6Y2hhcl90cmFpdHMsIGl0IGlzIHBvc3NpYmxlIHRvIGFjaGlldmUgYSBtb3JlCisgICAqICBhcHByb3ByaWF0ZSBkZWZpbml0aW9uIGJ5IHNwZWNpYWxpemluZyBfX2dudV9jeHg6OmNoYXJfdHJhaXRzLgorICAgKgorICAgKiAgU2VlIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDVjaDEzczAzLmh0bWwKKyAgICogIGZvciBhZHZpY2Ugb24gaG93IHRvIG1ha2UgdXNlIG9mIHRoaXMgY2xhc3MgZm9yIEBhIHVudXN1YWwgY2hhcmFjdGVyCisgICAqICB0eXBlcy4gQWxzbywgY2hlY2sgb3V0IGluY2x1ZGUvZXh0L3BvZF9jaGFyX3RyYWl0cy5oLgorICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CisgICAgc3RydWN0IGNoYXJfdHJhaXRzIDogcHVibGljIF9fZ251X2N4eDo6Y2hhcl90cmFpdHM8X0NoYXJUPgorICAgIHsgfTsKKworCisgIC8vLyAyMS4xLjMuMSAgY2hhcl90cmFpdHMgc3BlY2lhbGl6YXRpb25zCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgY2hhcl90cmFpdHM8Y2hhcj4KKyAgICB7CisgICAgICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAgaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHN0cmVhbXBvcyAgICAgICAgIHBvc190eXBlOworICAgICAgdHlwZWRlZiBzdHJlYW1vZmYgICAgICAgICBvZmZfdHlwZTsKKyAgICAgIHR5cGVkZWYgbWJzdGF0ZV90ICAgICAgICAgc3RhdGVfdHlwZTsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX19jMSA9IF9fYzI7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBlcShjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIGx0KGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX19jMSA8IF9fYzI7IH0KKworICAgICAgc3RhdGljIGludAorICAgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9tZW1jbXAoX19zMSwgX19zMiwgX19uKTsgfQorCisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpCisgICAgICB7IHJldHVybiBfX2J1aWx0aW5fc3RybGVuKF9fcyk7IH0KKworICAgICAgc3RhdGljIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcl90eXBlKj4oX19idWlsdGluX21lbWNocihfX3MsIF9fYSwgX19uKSk7IH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjaGFyX3R5cGUqPihfX2J1aWx0aW5fbWVtbW92ZShfX3MxLCBfX3MyLCBfX24pKTsgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgY29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXJfdHlwZSo+KF9fYnVpbHRpbl9tZW1jcHkoX19zMSwgX19zMiwgX19uKSk7IH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY2hhcl90eXBlIF9fYSkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXJfdHlwZSo+KF9fYnVpbHRpbl9tZW1zZXQoX19zLCBfX2EsIF9fbikpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgY2hhcl90eXBlCisgICAgICB0b19jaGFyX3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXJfdHlwZT4oX19jKTsgfQorCisgICAgICAvLyBUbyBrZWVwIGJvdGggdGhlIGJ5dGUgMHhmZiBhbmQgdGhlIGVvZiBzeW1ib2wgMHhmZmZmZmZmZgorICAgICAgLy8gZnJvbSBlbmRpbmcgdXAgYXMgMHhmZmZmZmZmZi4KKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50X3R5cGUKKyAgICAgIHRvX2ludF90eXBlKGNvbnN0IGNoYXJfdHlwZSYgX19jKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50X3R5cGU+KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KF9fYykpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgICAgZXFfaW50X3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYzEsIGNvbnN0IGludF90eXBlJiBfX2MyKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50X3R5cGUKKyAgICAgIGVvZigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnRfdHlwZT4oX0dMSUJDWFhfU1RESU9fRU9GKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludF90eXBlCisgICAgICBub3RfZW9mKGNvbnN0IGludF90eXBlJiBfX2MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAoX19jID09IGVvZigpKSA/IDAgOiBfX2M7IH0KKyAgfTsKKworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgLy8vIDIxLjEuMy4yICBjaGFyX3RyYWl0cyBzcGVjaWFsaXphdGlvbnMKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBjaGFyX3RyYWl0czx3Y2hhcl90PgorICAgIHsKKyAgICAgIHR5cGVkZWYgd2NoYXJfdCAgICAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiB3aW50X3QgICAgICAgICAgICBpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RyZWFtb2ZmICAgICAgICAgb2ZmX3R5cGU7CisgICAgICB0eXBlZGVmIHdzdHJlYW1wb3MgICAgICAgIHBvc190eXBlOworICAgICAgdHlwZWRlZiBtYnN0YXRlX3QgICAgICAgICBzdGF0ZV90eXBlOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgYXNzaWduKGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyBfX2MxID0gX19jMjsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIGVxKGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgICAgbHQoY29uc3QgY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfX2MxIDwgX19jMjsgfQorCisgICAgICBzdGF0aWMgaW50CisgICAgICBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeyByZXR1cm4gd21lbWNtcChfX3MxLCBfX3MyLCBfX24pOyB9CisKKyAgICAgIHN0YXRpYyBzaXplX3QKKyAgICAgIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcykKKyAgICAgIHsgcmV0dXJuIHdjc2xlbihfX3MpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyX3R5cGUqCisgICAgICBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkKKyAgICAgIHsgcmV0dXJuIHdtZW1jaHIoX19zLCBfX2EsIF9fbik7IH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7IHJldHVybiB3bWVtbW92ZShfX3MxLCBfX3MyLCBfX24pOyB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBjb3B5KGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeyByZXR1cm4gd21lbWNweShfX3MxLCBfX3MyLCBfX24pOyB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBhc3NpZ24oY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpCisgICAgICB7IHJldHVybiB3bWVtc2V0KF9fcywgX19hLCBfX24pOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgY2hhcl90eXBlCisgICAgICB0b19jaGFyX3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNoYXJfdHlwZShfX2MpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50X3R5cGUKKyAgICAgIHRvX2ludF90eXBlKGNvbnN0IGNoYXJfdHlwZSYgX19jKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaW50X3R5cGUoX19jKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIGVxX2ludF90eXBlKGNvbnN0IGludF90eXBlJiBfX2MxLCBjb25zdCBpbnRfdHlwZSYgX19jMikgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludF90eXBlCisgICAgICBlb2YoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50X3R5cGU+KFdFT0YpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50X3R5cGUKKyAgICAgIG5vdF9lb2YoY29uc3QgaW50X3R5cGUmIF9fYykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGVxX2ludF90eXBlKF9fYywgZW9mKCkpID8gMCA6IF9fYzsgfQorICB9OworI2VuZGlmIC8vX0dMSUJDWFhfVVNFX1dDSEFSX1QKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaWYgKChfX2NwbHVzcGx1cyA+PSAyMDExMDNMKSBcCisgICAgICYmIGRlZmluZWQoX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxKSkKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGNoYXJfdHJhaXRzPGNoYXIxNl90PgorICAgIHsKKyAgICAgIHR5cGVkZWYgY2hhcjE2X3QgICAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiB1aW50X2xlYXN0MTZfdCAgICBpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RyZWFtb2ZmICAgICAgICAgb2ZmX3R5cGU7CisgICAgICB0eXBlZGVmIHUxNnN0cmVhbXBvcyAgICAgIHBvc190eXBlOworICAgICAgdHlwZWRlZiBtYnN0YXRlX3QgICAgICAgICBzdGF0ZV90eXBlOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgYXNzaWduKGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSBub2V4Y2VwdAorICAgICAgeyBfX2MxID0gX19jMjsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wKKyAgICAgIGVxKGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbAorICAgICAgbHQoY29uc3QgY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2MxIDwgX19jMjsgfQorCisgICAgICBzdGF0aWMgaW50CisgICAgICBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJICBpZiAobHQoX19zMVtfX2ldLCBfX3MyW19faV0pKQorCSAgICByZXR1cm4gLTE7CisJICBlbHNlIGlmIChsdChfX3MyW19faV0sIF9fczFbX19pXSkpCisJICAgIHJldHVybiAxOworCXJldHVybiAwOworICAgICAgfQorCisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpCisgICAgICB7CisJc2l6ZV90IF9faSA9IDA7CisJd2hpbGUgKCFlcShfX3NbX19pXSwgY2hhcl90eXBlKCkpKQorCSAgKytfX2k7CisJcmV0dXJuIF9faTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKQorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJICBpZiAoZXEoX19zW19faV0sIF9fYSkpCisJICAgIHJldHVybiBfX3MgKyBfX2k7CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeworCXJldHVybiAoc3RhdGljX2Nhc3Q8Y2hhcl90eXBlKj4KKwkJKF9fYnVpbHRpbl9tZW1tb3ZlKF9fczEsIF9fczIsIF9fbiAqIHNpemVvZihjaGFyX3R5cGUpKSkpOworICAgICAgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgY29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlyZXR1cm4gKHN0YXRpY19jYXN0PGNoYXJfdHlwZSo+CisJCShfX2J1aWx0aW5fbWVtY3B5KF9fczEsIF9fczIsIF9fbiAqIHNpemVvZihjaGFyX3R5cGUpKSkpOworICAgICAgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgYXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKQorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJICBhc3NpZ24oX19zW19faV0sIF9fYSk7CisJcmV0dXJuIF9fczsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyX3R5cGUKKyAgICAgIHRvX2NoYXJfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY2hhcl90eXBlKF9fYyk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRfdHlwZQorICAgICAgdG9faW50X3R5cGUoY29uc3QgY2hhcl90eXBlJiBfX2MpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpbnRfdHlwZShfX2MpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbAorICAgICAgZXFfaW50X3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYzEsIGNvbnN0IGludF90eXBlJiBfX2MyKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50X3R5cGUKKyAgICAgIGVvZigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnRfdHlwZT4oLTEpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50X3R5cGUKKyAgICAgIG5vdF9lb2YoY29uc3QgaW50X3R5cGUmIF9fYykgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGVxX2ludF90eXBlKF9fYywgZW9mKCkpID8gMCA6IF9fYzsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBjaGFyX3RyYWl0czxjaGFyMzJfdD4KKyAgICB7CisgICAgICB0eXBlZGVmIGNoYXIzMl90ICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdWludF9sZWFzdDMyX3QgICAgaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHN0cmVhbW9mZiAgICAgICAgIG9mZl90eXBlOworICAgICAgdHlwZWRlZiB1MzJzdHJlYW1wb3MgICAgICBwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgbWJzdGF0ZV90ICAgICAgICAgc3RhdGVfdHlwZTsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikgbm9leGNlcHQKKyAgICAgIHsgX19jMSA9IF9fYzI7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sCisgICAgICBlcShjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wKKyAgICAgIGx0KGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19jMSA8IF9fYzI7IH0KKworICAgICAgc3RhdGljIGludAorICAgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCSAgaWYgKGx0KF9fczFbX19pXSwgX19zMltfX2ldKSkKKwkgICAgcmV0dXJuIC0xOworCSAgZWxzZSBpZiAobHQoX19zMltfX2ldLCBfX3MxW19faV0pKQorCSAgICByZXR1cm4gMTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgc3RhdGljIHNpemVfdAorICAgICAgbGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogX19zKQorICAgICAgeworCXNpemVfdCBfX2kgPSAwOworCXdoaWxlICghZXEoX19zW19faV0sIGNoYXJfdHlwZSgpKSkKKwkgICsrX19pOworCXJldHVybiBfX2k7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyX3R5cGUqCisgICAgICBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCSAgaWYgKGVxKF9fc1tfX2ldLCBfX2EpKQorCSAgICByZXR1cm4gX19zICsgX19pOworCXJldHVybiAwOworICAgICAgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgbW92ZShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlyZXR1cm4gKHN0YXRpY19jYXN0PGNoYXJfdHlwZSo+CisJCShfX2J1aWx0aW5fbWVtbW92ZShfX3MxLCBfX3MyLCBfX24gKiBzaXplb2YoY2hhcl90eXBlKSkpKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIGNvcHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7IAorCXJldHVybiAoc3RhdGljX2Nhc3Q8Y2hhcl90eXBlKj4KKwkJKF9fYnVpbHRpbl9tZW1jcHkoX19zMSwgX19zMiwgX19uICogc2l6ZW9mKGNoYXJfdHlwZSkpKSk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBhc3NpZ24oY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpCisgICAgICB7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwkgIGFzc2lnbihfX3NbX19pXSwgX19hKTsKKwlyZXR1cm4gX19zOworICAgICAgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXJfdHlwZQorICAgICAgdG9fY2hhcl90eXBlKGNvbnN0IGludF90eXBlJiBfX2MpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjaGFyX3R5cGUoX19jKTsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGludF90eXBlCisgICAgICB0b19pbnRfdHlwZShjb25zdCBjaGFyX3R5cGUmIF9fYykgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGludF90eXBlKF9fYyk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sCisgICAgICBlcV9pbnRfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jMSwgY29uc3QgaW50X3R5cGUmIF9fYzIpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRfdHlwZQorICAgICAgZW9mKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludF90eXBlPigtMSk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRfdHlwZQorICAgICAgbm90X2VvZihjb25zdCBpbnRfdHlwZSYgX19jKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gZXFfaW50X3R5cGUoX19jLCBlb2YoKSkgPyAwIDogX19jOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgCisKKyNlbmRpZiAvLyBfQ0hBUl9UUkFJVFNfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2NvZGVjdnQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jb2RlY3Z0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdjZDkzZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jb2RlY3Z0LmgKQEAgLTAsMCArMSw1MDcgQEAKKy8vIExvY2FsZSBzdXBwb3J0IChjb2RlY3Z0KSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jb2RlY3Z0LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjIuMS41IFRlbXBsYXRlIGNsYXNzIGNvZGVjdnQKKy8vCisKKy8vIFdyaXR0ZW4gYnkgQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisKKyNpZm5kZWYgX0NPREVDVlRfSAorI2RlZmluZSBfQ09ERUNWVF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8vIEVtcHR5IGJhc2UgY2xhc3MgZm9yIGNvZGVjdnQgZmFjZXQgWzIyLjIuMS41XS4KKyAgY2xhc3MgY29kZWN2dF9iYXNlCisgIHsKKyAgcHVibGljOgorICAgIGVudW0gcmVzdWx0CisgICAgeworICAgICAgb2ssCisgICAgICBwYXJ0aWFsLAorICAgICAgZXJyb3IsCisgICAgICBub2NvbnYKKyAgICB9OworICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBDb21tb24gYmFzZSBmb3IgY29kZWN2dCBmdW5jdGlvbnMuCisgICAqCisgICAqICBUaGlzIHRlbXBsYXRlIGNsYXNzIHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgcHVibGljIGZ1bmN0aW9ucworICAgKiAgdGhhdCBmb3J3YXJkIHRvIHRoZSBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMuCisgICAqCisgICAqICBUaGlzIHRlbXBsYXRlIGFsc28gcHJvdmlkZXMgYWJzdHJhY3Qgc3R1YnMgZm9yIHRoZSBwcm90ZWN0ZWQgdmlydHVhbAorICAgKiAgZnVuY3Rpb25zLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZXJuVCwgdHlwZW5hbWUgX0V4dGVyblQsIHR5cGVuYW1lIF9TdGF0ZVQ+CisgICAgY2xhc3MgX19jb2RlY3Z0X2Fic3RyYWN0X2Jhc2UKKyAgICA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgY29kZWN2dF9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBjb2RlY3Z0X2Jhc2U6OnJlc3VsdAlyZXN1bHQ7CisgICAgICB0eXBlZGVmIF9JbnRlcm5UCQkJaW50ZXJuX3R5cGU7CisgICAgICB0eXBlZGVmIF9FeHRlcm5UCQkJZXh0ZXJuX3R5cGU7CisgICAgICB0eXBlZGVmIF9TdGF0ZVQJCQlzdGF0ZV90eXBlOworCisgICAgICAvLyAyMi4yLjEuNS4xIGNvZGVjdnQgbWVtYmVycworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGZyb20gaW50ZXJuYWwgdG8gZXh0ZXJuYWwgY2hhcmFjdGVyIHNldC4KKyAgICAgICAqCisgICAgICAgKiAgQ29udmVydHMgaW5wdXQgc3RyaW5nIG9mIGludGVybl90eXBlIHRvIG91dHB1dCBzdHJpbmcgb2YKKyAgICAgICAqICBleHRlcm5fdHlwZS4gIFRoaXMgaXMgYW5hbG9nb3VzIHRvIHdjc3J0b21icy4gIEl0IGRvZXMgdGhpcyBieQorICAgICAgICogIGNhbGxpbmcgY29kZWN2dDo6ZG9fb3V0LgorICAgICAgICoKKyAgICAgICAqICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBjaGFyYWN0ZXIgc2V0cyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUKKyAgICAgICAqICBmYWNldCdzIGxvY2FsZSwgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgY2hhcmFjdGVycyBpbiBbZnJvbSxmcm9tX2VuZCkgYXJlIGNvbnZlcnRlZCBhbmQgd3JpdHRlbiB0bworICAgICAgICogIFt0byx0b19lbmQpLiAgZnJvbV9uZXh0IGFuZCB0b19uZXh0IGFyZSBzZXQgdG8gcG9pbnQgdG8gdGhlCisgICAgICAgKiAgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgbGFzdCBzdWNjZXNzZnVsbHkgY29udmVydGVkIGNoYXJhY3RlciwKKyAgICAgICAqICByZXNwZWN0aXZlbHkuICBJZiB0aGUgcmVzdWx0IG5lZWRlZCBubyBjb252ZXJzaW9uLCBmcm9tX25leHQgYW5kCisgICAgICAgKiAgdG9fbmV4dCBhcmUgbm90IGFmZmVjdGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGUgQGEgc3RhdGUgYXJndW1lbnQgc2hvdWxkIGJlIGluaXRpYWxpemVkIGlmIHRoZSBpbnB1dCBpcyBhdCB0aGUKKyAgICAgICAqICBiZWdpbm5pbmcgYW5kIGNhcnJpZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwgaWYgY29udGludWluZworICAgICAgICogIGNvbnZlcnNpb24uICBUaGVyZSBhcmUgbm8gZ3VhcmFudGVlcyBhYm91dCBob3cgQGEgc3RhdGUgaXMgdXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHJlc3VsdCByZXR1cm5lZCBpcyBhIG1lbWJlciBvZiBjb2RlY3Z0X2Jhc2U6OnJlc3VsdC4gIElmCisgICAgICAgKiAgYWxsIHRoZSBpbnB1dCBpcyBjb252ZXJ0ZWQsIHJldHVybnMgY29kZWN2dF9iYXNlOjpvay4gIElmIG5vCisgICAgICAgKiAgY29udmVyc2lvbiBpcyBuZWNlc3NhcnksIHJldHVybnMgY29kZWN2dF9iYXNlOjpub2NvbnYuICBJZgorICAgICAgICogIHRoZSBpbnB1dCBlbmRzIGVhcmx5IG9yIHRoZXJlIGlzIGluc3VmZmljaWVudCBzcGFjZSBpbiB0aGUKKyAgICAgICAqICBvdXRwdXQsIHJldHVybnMgY29kZWN2dF9iYXNlOjpwYXJ0aWFsLiAgT3RoZXJ3aXNlIHRoZQorICAgICAgICogIGNvbnZlcnNpb24gZmFpbGVkIGFuZCBjb2RlY3Z0X2Jhc2U6OmVycm9yIGlzIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fc3RhdGUgIFBlcnNpc3RlbnQgY29udmVyc2lvbiBzdGF0ZSBkYXRhLgorICAgICAgICogIEBwYXJhbSAgX19mcm9tICBTdGFydCBvZiBpbnB1dC4KKyAgICAgICAqICBAcGFyYW0gIF9fZnJvbV9lbmQgIEVuZCBvZiBpbnB1dC4KKyAgICAgICAqICBAcGFyYW0gIF9fZnJvbV9uZXh0ICBSZXR1cm5zIHN0YXJ0IG9mIHVuY29udmVydGVkIGRhdGEuCisgICAgICAgKiAgQHBhcmFtICBfX3RvICBTdGFydCBvZiBvdXRwdXQgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX190b19lbmQgIEVuZCBvZiBvdXRwdXQgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX190b19uZXh0ICBSZXR1cm5zIHN0YXJ0IG9mIHVudXNlZCBvdXRwdXQgYXJlYS4KKyAgICAgICAqICBAcmV0dXJuICBjb2RlY3Z0X2Jhc2U6OnJlc3VsdC4KKyAgICAgICovCisgICAgICByZXN1bHQKKyAgICAgIG91dChzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBpbnRlcm5fdHlwZSogX19mcm9tLAorCSAgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm9tX25leHQsCisJICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLAorCSAgZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRoaXMtPmRvX291dChfX3N0YXRlLCBfX2Zyb20sIF9fZnJvbV9lbmQsIF9fZnJvbV9uZXh0LAorCQkJICAgIF9fdG8sIF9fdG9fZW5kLCBfX3RvX25leHQpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2V0IGNvbnZlcnNpb24gc3RhdGUuCisgICAgICAgKgorICAgICAgICogIFdyaXRlcyBjaGFyYWN0ZXJzIHRvIG91dHB1dCB0aGF0IHdvdWxkIHJlc3RvcmUgQGEgc3RhdGUgdG8gaW5pdGlhbAorICAgICAgICogIGNvbmRpdGlvbnMuICBUaGUgaWRlYSBpcyB0aGF0IGlmIGEgcGFydGlhbCBjb252ZXJzaW9uIG9jY3VycywgdGhlbgorICAgICAgICogIHRoZSBjb252ZXJ0aW5nIHRoZSBjaGFyYWN0ZXJzIHdyaXR0ZW4gYnkgdGhpcyBmdW5jdGlvbiB3b3VsZCBsZWF2ZQorICAgICAgICogIHRoZSBzdGF0ZSBpbiBpbml0aWFsIGNvbmRpdGlvbnMsIHJhdGhlciB0aGFuIHBhcnRpYWwgY29udmVyc2lvbgorICAgICAgICogIHN0YXRlLiAgSXQgZG9lcyB0aGlzIGJ5IGNhbGxpbmcgY29kZWN2dDo6ZG9fdW5zaGlmdCgpLgorICAgICAgICoKKyAgICAgICAqICBGb3IgZXhhbXBsZSwgaWYgNCBleHRlcm5hbCBjaGFyYWN0ZXJzIGFsd2F5cyBjb252ZXJ0ZWQgdG8gMSBpbnRlcm5hbAorICAgICAgICogIGNoYXJhY3RlciwgYW5kIGlucHV0IHRvIGluKCkgaGFkIDYgZXh0ZXJuYWwgY2hhcmFjdGVycyB3aXRoIHN0YXRlCisgICAgICAgKiAgc2F2ZWQsIHRoaXMgZnVuY3Rpb24gd291bGQgd3JpdGUgdHdvIGNoYXJhY3RlcnMgdG8gdGhlIG91dHB1dCBhbmQKKyAgICAgICAqICBzZXQgdGhlIHN0YXRlIHRvIGluaXRpYWxpemVkIGNvbmRpdGlvbnMuCisgICAgICAgKgorICAgICAgICogIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGNoYXJhY3RlciBzZXRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZQorICAgICAgICogIGZhY2V0J3MgbG9jYWxlLCBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSByZXN1bHQgcmV0dXJuZWQgaXMgYSBtZW1iZXIgb2YgY29kZWN2dF9iYXNlOjpyZXN1bHQuICBJZiB0aGUKKyAgICAgICAqICBzdGF0ZSBjb3VsZCBiZSByZXNldCBhbmQgZGF0YSB3cml0dGVuLCByZXR1cm5zIGNvZGVjdnRfYmFzZTo6b2suICBJZgorICAgICAgICogIG5vIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5LCByZXR1cm5zIGNvZGVjdnRfYmFzZTo6bm9jb252LiAgSWYgdGhlCisgICAgICAgKiAgb3V0cHV0IGhhcyBpbnN1ZmZpY2llbnQgc3BhY2UsIHJldHVybnMgY29kZWN2dF9iYXNlOjpwYXJ0aWFsLgorICAgICAgICogIE90aGVyd2lzZSB0aGUgcmVzZXQgZmFpbGVkIGFuZCBjb2RlY3Z0X2Jhc2U6OmVycm9yIGlzIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fc3RhdGUgIFBlcnNpc3RlbnQgY29udmVyc2lvbiBzdGF0ZSBkYXRhLgorICAgICAgICogIEBwYXJhbSAgX190byAgU3RhcnQgb2Ygb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fdG9fZW5kICBFbmQgb2Ygb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fdG9fbmV4dCAgUmV0dXJucyBzdGFydCBvZiB1bnVzZWQgb3V0cHV0IGFyZWEuCisgICAgICAgKiAgQHJldHVybiAgY29kZWN2dF9iYXNlOjpyZXN1bHQuCisgICAgICAqLworICAgICAgcmVzdWx0CisgICAgICB1bnNoaWZ0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsCisJICAgICAgZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb191bnNoaWZ0KF9fc3RhdGUsIF9fdG8sX190b19lbmQsX190b19uZXh0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgZnJvbSBleHRlcm5hbCB0byBpbnRlcm5hbCBjaGFyYWN0ZXIgc2V0LgorICAgICAgICoKKyAgICAgICAqICBDb252ZXJ0cyBpbnB1dCBzdHJpbmcgb2YgZXh0ZXJuX3R5cGUgdG8gb3V0cHV0IHN0cmluZyBvZgorICAgICAgICogIGludGVybl90eXBlLiAgVGhpcyBpcyBhbmFsb2dvdXMgdG8gbWJzcnRvd2NzLiAgSXQgZG9lcyB0aGlzIGJ5CisgICAgICAgKiAgY2FsbGluZyBjb2RlY3Z0Ojpkb19pbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gY2hhcmFjdGVyIHNldHMgYXJlIGRldGVybWluZWQgYnkgdGhlCisgICAgICAgKiAgZmFjZXQncyBsb2NhbGUsIGludGVybmFsIGFuZCBleHRlcm5hbCB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGNoYXJhY3RlcnMgaW4gW2Zyb20sZnJvbV9lbmQpIGFyZSBjb252ZXJ0ZWQgYW5kIHdyaXR0ZW4gdG8KKyAgICAgICAqICBbdG8sdG9fZW5kKS4gIGZyb21fbmV4dCBhbmQgdG9fbmV4dCBhcmUgc2V0IHRvIHBvaW50IHRvIHRoZQorICAgICAgICogIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIGxhc3Qgc3VjY2Vzc2Z1bGx5IGNvbnZlcnRlZCBjaGFyYWN0ZXIsCisgICAgICAgKiAgcmVzcGVjdGl2ZWx5LiAgSWYgdGhlIHJlc3VsdCBuZWVkZWQgbm8gY29udmVyc2lvbiwgZnJvbV9uZXh0IGFuZAorICAgICAgICogIHRvX25leHQgYXJlIG5vdCBhZmZlY3RlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIEBhIHN0YXRlIGFyZ3VtZW50IHNob3VsZCBiZSBpbml0aWFsaXplZCBpZiB0aGUgaW5wdXQgaXMgYXQgdGhlCisgICAgICAgKiAgYmVnaW5uaW5nIGFuZCBjYXJyaWVkIGZyb20gYSBwcmV2aW91cyBjYWxsIGlmIGNvbnRpbnVpbmcKKyAgICAgICAqICBjb252ZXJzaW9uLiAgVGhlcmUgYXJlIG5vIGd1YXJhbnRlZXMgYWJvdXQgaG93IEBhIHN0YXRlIGlzIHVzZWQuCisgICAgICAgKgorICAgICAgICogIFRoZSByZXN1bHQgcmV0dXJuZWQgaXMgYSBtZW1iZXIgb2YgY29kZWN2dF9iYXNlOjpyZXN1bHQuICBJZgorICAgICAgICogIGFsbCB0aGUgaW5wdXQgaXMgY29udmVydGVkLCByZXR1cm5zIGNvZGVjdnRfYmFzZTo6b2suICBJZiBubworICAgICAgICogIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5LCByZXR1cm5zIGNvZGVjdnRfYmFzZTo6bm9jb252LiAgSWYKKyAgICAgICAqICB0aGUgaW5wdXQgZW5kcyBlYXJseSBvciB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgc3BhY2UgaW4gdGhlCisgICAgICAgKiAgb3V0cHV0LCByZXR1cm5zIGNvZGVjdnRfYmFzZTo6cGFydGlhbC4gIE90aGVyd2lzZSB0aGUKKyAgICAgICAqICBjb252ZXJzaW9uIGZhaWxlZCBhbmQgY29kZWN2dF9iYXNlOjplcnJvciBpcyByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3N0YXRlICBQZXJzaXN0ZW50IGNvbnZlcnNpb24gc3RhdGUgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gIF9fZnJvbSAgU3RhcnQgb2YgaW5wdXQuCisgICAgICAgKiAgQHBhcmFtICBfX2Zyb21fZW5kICBFbmQgb2YgaW5wdXQuCisgICAgICAgKiAgQHBhcmFtICBfX2Zyb21fbmV4dCAgUmV0dXJucyBzdGFydCBvZiB1bmNvbnZlcnRlZCBkYXRhLgorICAgICAgICogIEBwYXJhbSAgX190byAgU3RhcnQgb2Ygb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fdG9fZW5kICBFbmQgb2Ygb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fdG9fbmV4dCAgUmV0dXJucyBzdGFydCBvZiB1bnVzZWQgb3V0cHV0IGFyZWEuCisgICAgICAgKiAgQHJldHVybiAgY29kZWN2dF9iYXNlOjpyZXN1bHQuCisgICAgICAqLworICAgICAgcmVzdWx0CisgICAgICBpbihzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAorCSBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgZXh0ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKwkgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwKKwkgaW50ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRoaXMtPmRvX2luKF9fc3RhdGUsIF9fZnJvbSwgX19mcm9tX2VuZCwgX19mcm9tX25leHQsCisJCQkgICBfX3RvLCBfX3RvX2VuZCwgX190b19uZXh0KTsKKyAgICAgIH0KKworICAgICAgaW50CisgICAgICBlbmNvZGluZygpIGNvbnN0IHRocm93KCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2VuY29kaW5nKCk7IH0KKworICAgICAgYm9vbAorICAgICAgYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2Fsd2F5c19ub2NvbnYoKTsgfQorCisgICAgICBpbnQKKyAgICAgIGxlbmd0aChzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAorCSAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLCBzaXplX3QgX19tYXgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19sZW5ndGgoX19zdGF0ZSwgX19mcm9tLCBfX2VuZCwgX19tYXgpOyB9CisKKyAgICAgIGludAorICAgICAgbWF4X2xlbmd0aCgpIGNvbnN0IHRocm93KCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX21heF9sZW5ndGgoKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgZXhwbGljaXQKKyAgICAgIF9fY29kZWN2dF9hYnN0cmFjdF9iYXNlKHNpemVfdCBfX3JlZnMgPSAwKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7IH0KKworICAgICAgdmlydHVhbAorICAgICAgfl9fY29kZWN2dF9hYnN0cmFjdF9iYXNlKCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBmcm9tIGludGVybmFsIHRvIGV4dGVybmFsIGNoYXJhY3RlciBzZXQuCisgICAgICAgKgorICAgICAgICogIENvbnZlcnRzIGlucHV0IHN0cmluZyBvZiBpbnRlcm5fdHlwZSB0byBvdXRwdXQgc3RyaW5nIG9mCisgICAgICAgKiAgZXh0ZXJuX3R5cGUuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZQorICAgICAgICogIHRoZSB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgb3V0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb19vdXQoc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbSwKKwkgICAgIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwKKwkgICAgIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdCA9IDA7CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb191bnNoaWZ0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGV4dGVybl90eXBlKiBfX3RvLAorCQkgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3QgPSAwOworCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9faW4oc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwKKwkgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbV9lbmQsIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm9tX25leHQsCisJICAgIGludGVybl90eXBlKiBfX3RvLCBpbnRlcm5fdHlwZSogX190b19lbmQsCisJICAgIGludGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdCA9IDA7CisKKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBkb19lbmNvZGluZygpIGNvbnN0IHRocm93KCkgPSAwOworCisgICAgICB2aXJ0dWFsIGJvb2wKKyAgICAgIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCB0aHJvdygpID0gMDsKKworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIGRvX2xlbmd0aChzdGF0ZV90eXBlJiwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwKKwkJY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLCBzaXplX3QgX19tYXgpIGNvbnN0ID0gMDsKKworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpID0gMDsKKyAgICB9OworCisKKworICAvKioKKyAgICogIEBicmllZiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBjb2RlY3Z0LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgTkI6IEdlbmVyaWMsIG1vc3RseSB1c2VsZXNzIGltcGxlbWVudGF0aW9uLgorICAgKgorICAqLworICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5ULCB0eXBlbmFtZSBfU3RhdGVUPgorICAgIGNsYXNzIGNvZGVjdnQKKyAgICA6IHB1YmxpYyBfX2NvZGVjdnRfYWJzdHJhY3RfYmFzZTxfSW50ZXJuVCwgX0V4dGVyblQsIF9TdGF0ZVQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBjb2RlY3Z0X2Jhc2U6OnJlc3VsdAlyZXN1bHQ7CisgICAgICB0eXBlZGVmIF9JbnRlcm5UCQkJaW50ZXJuX3R5cGU7CisgICAgICB0eXBlZGVmIF9FeHRlcm5UCQkJZXh0ZXJuX3R5cGU7CisgICAgICB0eXBlZGVmIF9TdGF0ZVQJCQlzdGF0ZV90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgX19jX2xvY2FsZQkJCV9NX2NfbG9jYWxlX2NvZGVjdnQ7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJCWlkOworCisgICAgICBleHBsaWNpdAorICAgICAgY29kZWN2dChzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogX19jb2RlY3Z0X2Fic3RyYWN0X2Jhc2U8X0ludGVyblQsIF9FeHRlcm5ULCBfU3RhdGVUPiAoX19yZWZzKSwKKwlfTV9jX2xvY2FsZV9jb2RlY3Z0KDApCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGNvZGVjdnQoX19jX2xvY2FsZSBfX2Nsb2MsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5jb2RlY3Z0KCkgeyB9CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb19vdXQoc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbSwKKwkgICAgIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwKKwkgICAgIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdDsKKworICAgICAgdmlydHVhbCByZXN1bHQKKyAgICAgIGRvX3Vuc2hpZnQoc3RhdGVfdHlwZSYgX19zdGF0ZSwgZXh0ZXJuX3R5cGUqIF9fdG8sCisJCSBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdDsKKworICAgICAgdmlydHVhbCByZXN1bHQKKyAgICAgIGRvX2luKHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sCisJICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgICBpbnRlcm5fdHlwZSogX190bywgaW50ZXJuX3R5cGUqIF9fdG9fZW5kLAorCSAgICBpbnRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBkb19lbmNvZGluZygpIGNvbnN0IHRocm93KCk7CisKKyAgICAgIHZpcnR1YWwgYm9vbAorICAgICAgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCk7CisKKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBkb19sZW5ndGgoc3RhdGVfdHlwZSYsIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sCisJCWNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwgc2l6ZV90IF9fbWF4KSBjb25zdDsKKworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5ULCB0eXBlbmFtZSBfU3RhdGVUPgorICAgIGxvY2FsZTo6aWQgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIF9TdGF0ZVQ+OjppZDsKKworICAvLy8gY2xhc3MgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+CisgICAgOiBwdWJsaWMgX19jb2RlY3Z0X2Fic3RyYWN0X2Jhc2U8Y2hhciwgY2hhciwgbWJzdGF0ZV90PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgY2hhcgkJCWludGVybl90eXBlOworICAgICAgdHlwZWRlZiBjaGFyCQkJZXh0ZXJuX3R5cGU7CisgICAgICB0eXBlZGVmIG1ic3RhdGVfdAkJCXN0YXRlX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfX2NfbG9jYWxlCQkJX01fY19sb2NhbGVfY29kZWN2dDsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkIGlkOworCisgICAgICBleHBsaWNpdAorICAgICAgY29kZWN2dChzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBjb2RlY3Z0KF9fY19sb2NhbGUgX19jbG9jLCBzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+Y29kZWN2dCgpOworCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb20sCisJICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKwkgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsCisJICAgICBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb191bnNoaWZ0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGV4dGVybl90eXBlKiBfX3RvLAorCQkgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb19pbihzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAorCSAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgZXh0ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKwkgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwKKwkgICAgaW50ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGludAorICAgICAgZG9fZW5jb2RpbmcoKSBjb25zdCB0aHJvdygpOworCisgICAgICB2aXJ0dWFsIGJvb2wKKyAgICAgIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCB0aHJvdygpOworCisgICAgICB2aXJ0dWFsIGludAorICAgICAgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAorCQljb25zdCBleHRlcm5fdHlwZSogX19lbmQsIHNpemVfdCBfX21heCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBkb19tYXhfbGVuZ3RoKCkgY29uc3QgdGhyb3coKTsKKyAgfTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8vLyBjbGFzcyBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4KKyAgICA6IHB1YmxpYyBfX2NvZGVjdnRfYWJzdHJhY3RfYmFzZTx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiB3Y2hhcl90CQkJaW50ZXJuX3R5cGU7CisgICAgICB0eXBlZGVmIGNoYXIJCQlleHRlcm5fdHlwZTsKKyAgICAgIHR5cGVkZWYgbWJzdGF0ZV90CQkJc3RhdGVfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9fY19sb2NhbGUJCQlfTV9jX2xvY2FsZV9jb2RlY3Z0OworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgZXhwbGljaXQKKyAgICAgIGNvZGVjdnQoc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgICBleHBsaWNpdAorICAgICAgY29kZWN2dChfX2NfbG9jYWxlIF9fY2xvYywgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfmNvZGVjdnQoKTsKKworICAgICAgdmlydHVhbCByZXN1bHQKKyAgICAgIGRvX291dChzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBpbnRlcm5fdHlwZSogX19mcm9tLAorCSAgICAgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm9tX25leHQsCisJICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLAorCSAgICAgZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0YXRlLAorCQkgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwKKwkJIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdDsKKworICAgICAgdmlydHVhbCByZXN1bHQKKyAgICAgIGRvX2luKHN0YXRlX3R5cGUmIF9fc3RhdGUsCisJICAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tX2VuZCwKKwkgICAgIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm9tX25leHQsCisJICAgICBpbnRlcm5fdHlwZSogX190bywgaW50ZXJuX3R5cGUqIF9fdG9fZW5kLAorCSAgICAgaW50ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsCisgICAgICBpbnQgZG9fZW5jb2RpbmcoKSBjb25zdCB0aHJvdygpOworCisgICAgICB2aXJ0dWFsCisgICAgICBib29sIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCB0aHJvdygpOworCisgICAgICB2aXJ0dWFsCisgICAgICBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAorCQkgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLCBzaXplX3QgX19tYXgpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGludAorICAgICAgZG9fbWF4X2xlbmd0aCgpIGNvbnN0IHRocm93KCk7CisgICAgfTsKKyNlbmRpZiAvL19HTElCQ1hYX1VTRV9XQ0hBUl9UCisKKyAgLy8vIGNsYXNzIGNvZGVjdnRfYnluYW1lIFsyMi4yLjEuNl0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVCwgdHlwZW5hbWUgX1N0YXRlVD4KKyAgICBjbGFzcyBjb2RlY3Z0X2J5bmFtZSA6IHB1YmxpYyBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgX1N0YXRlVD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIGNvZGVjdnRfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IGNvZGVjdnQ8X0ludGVyblQsIF9FeHRlcm5ULCBfU3RhdGVUPihfX3JlZnMpCisgICAgICB7CisJaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19zLCAiQyIpICE9IDAKKwkgICAgJiYgX19idWlsdGluX3N0cmNtcChfX3MsICJQT1NJWCIpICE9IDApCisJICB7CisJICAgIHRoaXMtPl9TX2Rlc3Ryb3lfY19sb2NhbGUodGhpcy0+X01fY19sb2NhbGVfY29kZWN2dCk7CisJICAgIHRoaXMtPl9TX2NyZWF0ZV9jX2xvY2FsZSh0aGlzLT5fTV9jX2xvY2FsZV9jb2RlY3Z0LCBfX3MpOworCSAgfQorICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfmNvZGVjdnRfYnluYW1lKCkgeyB9CisgICAgfTsKKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGNvZGVjdnRfYnluYW1lPGNoYXIsIGNoYXIsIG1ic3RhdGVfdD47CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+JgorICAgIHVzZV9mYWNldDxjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiA+KGNvbnN0IGxvY2FsZSYpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD47CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+JgorICAgIHVzZV9mYWNldDxjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PGNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PiA+KGNvbnN0IGxvY2FsZSYpOworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIF9DT0RFQ1ZUX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jb25jZXB0X2NoZWNrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvY29uY2VwdF9jaGVjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OWZkNmEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvY29uY2VwdF9jaGVjay5oCkBAIC0wLDAgKzEsODAgQEAKKy8vIENvbmNlcHQtY2hlY2tpbmcgY29udHJvbCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jb25jZXB0X2NoZWNrLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpdGVyYXRvcn0KKyAqLworCisjaWZuZGVmIF9DT05DRVBUX0NIRUNLX0gKKyNkZWZpbmUgX0NPTkNFUFRfQ0hFQ0tfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKy8vIEFsbCBwbGFjZXMgaW4gbGlic3RkYysrLXYzIHdoZXJlIHRoZXNlIGFyZSB1c2VkLCBvciAvbWlnaHQvIGJlIHVzZWQsIG9yCisvLyBkb24ndCBuZWVkIHRvIGJlIHVzZWQsIG9yIHBlcmhhcHMgL3Nob3VsZC8gYmUgdXNlZCwgYXJlIGNvbW1lbnRlZCB3aXRoCisvLyAiY29uY2VwdCByZXF1aXJlbWVudHMiIChhbmQgbWF5YmUgc29tZSBtb3JlIHRleHQpLiAgU28gZ3JlcCBsaWtlIGNyYXp5CisvLyBpZiB5b3UncmUgbG9va2luZyBmb3IgYWRkaXRpb25hbCBwbGFjZXMgdG8gdXNlIHRoZXNlLgorCisvLyBDb25jZXB0LWNoZWNraW5nIGNvZGUgaXMgb2ZmIGJ5IGRlZmF1bHQgdW5sZXNzIHVzZXJzIHR1cm4gaXQgb24gdmlhCisvLyBjb25maWd1cmUgb3B0aW9ucyBvciBlZGl0aW5nIGMrK2NvbmZpZy5oLgorCisjaWZuZGVmIF9HTElCQ1hYX0NPTkNFUFRfQ0hFQ0tTCisKKyNkZWZpbmUgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKC4uLikKKyNkZWZpbmUgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9hLF9iKQorI2RlZmluZSBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMyKF9hLF9iLF9jKQorI2RlZmluZSBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMzKF9hLF9iLF9jLF9kKQorI2RlZmluZSBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXM0KF9hLF9iLF9jLF9kLF9lKQorCisjZWxzZSAvLyB0aGUgY2hlY2tzIGFyZSBvbgorCisjaW5jbHVkZSA8Yml0cy9ib29zdF9jb25jZXB0X2NoZWNrLmg+CisKKy8vIE5vdGUgdGhhdCB0aGUgb2J2aW91cyBhbmQgZWxlZ2FudCBhcHByb2FjaCBvZgorLy8KKy8vI2RlZmluZSBnbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKEMpIGRlYnVnOjpmdW5jdGlvbl9yZXF1aXJlczwgZGVidWc6OkMgPigpCisvLworLy8gd29uJ3Qgd29yayBkdWUgdG8gY29uY2VwdCB0ZW1wbGF0ZXMgd2l0aCBtb3JlIHRoYW4gb25lIHBhcmFtZXRlciwgZS5nLiwKKy8vIEJpbmFyeVByZWRpY2F0ZUNvbmNlcHQuICBUaGUgcHJlcHJvY2Vzc29yIHRyaWVzIHRvIHNwbGl0IHRoaW5ncyB1cCBvbgorLy8gdGhlIGNvbW1hcyBpbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4gIFdlIGNhbid0IHVzZSBhbiBpbm5lciBwYWlyIG9mCisvLyBwYXJlbnRoZXNpcyB0byBoaWRlIHRoZSBjb21tYXMsIGJlY2F1c2UgImRlYnVnOjooVGVtcDxGb28sQmFyPikiIGlzbid0CisvLyBhIHZhbGlkIGluc3RhbnRpYXRpb24gcGF0dGVybi4gIFRodXMsIHdlIHN0ZWFsIGEgZmVhdHVyZSBmcm9tIEM5OS4KKworI2RlZmluZSBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fZ251X2N4eDo6X19mdW5jdGlvbl9yZXF1aXJlczwgX19nbnVfY3h4OjpfX1ZBX0FSR1NfXyA+KCk7CisjZGVmaW5lIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfYSxfQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX0dMSUJDWFhfQ0xBU1NfUkVRVUlSRVMoX2EsIF9fZ251X2N4eCwgX0MpOworI2RlZmluZSBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMyKF9hLF9iLF9DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9HTElCQ1hYX0NMQVNTX1JFUVVJUkVTMihfYSwgX2IsIF9fZ251X2N4eCwgX0MpOworI2RlZmluZSBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMzKF9hLF9iLF9jLF9DKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9HTElCQ1hYX0NMQVNTX1JFUVVJUkVTMyhfYSwgX2IsIF9jLCBfX2dudV9jeHgsIF9DKTsKKyNkZWZpbmUgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzNChfYSxfYixfYyxfZCxfQykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfR0xJQkNYWF9DTEFTU19SRVFVSVJFUzQoX2EsIF9iLCBfYywgX2QsIF9fZ251X2N4eCwgX0MpOworCisjZW5kaWYgLy8gZW5hYmxlL2Rpc2FibGUKKworI2VuZGlmIC8vIF9HTElCQ1hYX0NPTkNFUFRfQ0hFQ0sKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jcHBfdHlwZV90cmFpdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jcHBfdHlwZV90cmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzAzYzk4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2NwcF90eXBlX3RyYWl0cy5oCkBAIC0wLDAgKzEsNDI0IEBACisvLyBUaGUgIC0qLSBDKysgLSotIHR5cGUgdHJhaXRzIGNsYXNzZXMgZm9yIGludGVybmFsIHVzZSBpbiBsaWJzdGRjKysKKworLy8gQ29weXJpZ2h0IChDKSAyMDAwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvY3BwX3R5cGVfdHJhaXRzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtleHQvdHlwZV90cmFpdHN9CisgKi8KKworLy8gV3JpdHRlbiBieSBHYWJyaWVsIERvcyBSZWlzIDxkb3NyZWlzQGNtbGEuZW5zLWNhY2hhbi5mcj4KKworI2lmbmRlZiBfQ1BQX1RZUEVfVFJBSVRTX0gKKyNkZWZpbmUgX0NQUF9UWVBFX1RSQUlUU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBzb21lIGNvbXBpbGUtdGltZSBpbmZvcm1hdGlvbiBhYm91dCB2YXJpb3VzIHR5cGVzLgorLy8gVGhlc2UgcmVwcmVzZW50YXRpb25zIHdlcmUgZGVzaWduZWQsIG9uIHB1cnBvc2UsIHRvIGJlIGNvbnN0YW50LWV4cHJlc3Npb25zCisvLyBhbmQgbm90IHR5cGVzIGFzIGZvdW5kIGluIDxiaXRzL3R5cGVfdHJhaXRzLmg+LiAgSW4gcGFydGljdWxhciwgdGhleQorLy8gY2FuIGJlIHVzZWQgaW4gY29udHJvbCBzdHJ1Y3R1cmVzIGFuZCB0aGUgb3B0aW1pemVyIGhvcGVmdWxseSB3aWxsIGRvCisvLyB0aGUgb2J2aW91cyB0aGluZy4KKy8vCisvLyBXaHkgaW50ZWdyYWwgZXhwcmVzc2lvbnMsIGFuZCBub3QgZnVuY3Rpb25zIG5vciB0eXBlcz8KKy8vIEZpcnN0bHksIHRoZXNlIGNvbXBpbGUtdGltZSBlbnRpdGllcyBhcmUgdXNlZCBhcyB0ZW1wbGF0ZS1hcmd1bWVudHMKKy8vIHNvIGZ1bmN0aW9uIHJldHVybiB2YWx1ZXMgd29uJ3Qgd29yazogIFdlIG5lZWQgY29tcGlsZS10aW1lIGVudGl0aWVzLgorLy8gV2UncmUgbGVmdCB3aXRoIHR5cGVzIGFuZCBjb25zdGFudCAgaW50ZWdyYWwgZXhwcmVzc2lvbnMuCisvLyBTZWNvbmRseSwgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiBlYXNlIG9mIHVzZSwgdHlwZS1iYXNlZCBjb21waWxlLXRpbWUKKy8vIGluZm9ybWF0aW9uIGlzIC1ub3QtICp0aGF0KiBjb252ZW5pZW50LiAgT24gaGFzIHRvIHdyaXRlIGxvdHMgb2YKKy8vIG92ZXJsb2FkZWQgZnVuY3Rpb25zIGFuZCB0byBob3BlIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgc2VsZWN0IHRoZSByaWdodAorLy8gb25lLiBBcyBhIG5ldCBlZmZlY3QsIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBpc24ndCB2ZXJ5IGNsZWFyIGF0IGZpcnN0CisvLyBnbGFuY2UuCisvLyBUaGlyZGx5LCBwYXJ0aWFsIG9yZGVyaW5nIGFuZCBvdmVybG9hZCByZXNvbHV0aW9uIChvZiBmdW5jdGlvbiB0ZW1wbGF0ZXMpCisvLyBpcyBoaWdobHkgY29zdGx5IGluIHRlcm1zIG9mIGNvbXBpbGVyLXJlc291cmNlLiAgSXQgaXMgYSBHb29kIFRoaW5nIHRvCisvLyBrZWVwIHRoZXNlIHJlc291cmNlIGNvbnN1bXB0aW9uIGFzIGxlYXN0IGFzIHBvc3NpYmxlLgorLy8KKy8vIFNlZSB2YWxhcnJheV9hcnJheS5oIGZvciBhIGNhc2UgdXNlLgorLy8KKy8vIC0tIEdhYnkgKGRvc3JlaXNAY21sYS5lbnMtY2FjaGFuLmZyKSAyMDAwLTAzLTA2LgorLy8KKy8vIFVwZGF0ZSAyMDA1OiB0eXBlcyBhcmUgYWxzbyBwcm92aWRlZCBhbmQgPGJpdHMvdHlwZV90cmFpdHMuaD4gaGFzIGJlZW4KKy8vIHJlbW92ZWQuCisvLworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIGhhY2ssIHNob3VsZCByZWFsbHkgaW5jbHVkZSB0aGlzIGZyb20gc29tZXdoZXJlLgorbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBjbGFzcyBfX25vcm1hbF9pdGVyYXRvcjsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgc3RydWN0IF9fdHJ1ZV90eXBlIHsgfTsKKyAgc3RydWN0IF9fZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8Ym9vbD4KKyAgICBzdHJ1Y3QgX190cnV0aF90eXBlCisgICAgeyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3RydXRoX3R5cGU8dHJ1ZT4KKyAgICB7IHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOyB9OworCisgIC8vIE4uQi4gVGhlIGNvbnZlcnNpb25zIHRvIGJvb2wgYXJlIG5lZWRlZCBkdWUgdG8gdGhlIGlzc3VlCisgIC8vIGV4cGxhaW5lZCBpbiBjKysvMTk0MDQuCisgIHRlbXBsYXRlPGNsYXNzIF9TcCwgY2xhc3MgX1RwPgorICAgIHN0cnVjdCBfX3RyYWl0b3IKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IGJvb2woX1NwOjpfX3ZhbHVlKSB8fCBib29sKF9UcDo6X192YWx1ZSkgfTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cnV0aF90eXBlPF9fdmFsdWU+OjpfX3R5cGUgX190eXBlOworICAgIH07CisKKyAgLy8gQ29tcGFyZSBmb3IgZXF1YWxpdHkgb2YgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19hcmVfc2FtZQorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMCB9OworICAgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FyZV9zYW1lPF9UcCwgX1RwPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLyBIb2xkcyBpZiB0aGUgdGVtcGxhdGUtYXJndW1lbnQgaXMgYSB2b2lkIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc192b2lkCisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAwIH07CisgICAgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfdm9pZDx2b2lkPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLworICAvLyBJbnRlZ2VyIHR5cGVzCisgIC8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyCisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAwIH07CisgICAgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLyBUaGlydGVlbiBzcGVjaWFsaXphdGlvbnMgKHllcyB0aGVyZSBhcmUgZWxldmVuIHN0YW5kYXJkIGludGVnZXIKKyAgLy8gdHlwZXM7IDxlbT5sb25nIGxvbmc8L2VtPiBhbmQgPGVtPnVuc2lnbmVkIGxvbmcgbG9uZzwvZW0+IGFyZQorICAvLyBzdXBwb3J0ZWQgYXMgZXh0ZW5zaW9ucykKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8Ym9vbD4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8Y2hhcj4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8c2lnbmVkIGNoYXI+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPHVuc2lnbmVkIGNoYXI+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisjIGlmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPHdjaGFyX3Q+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworIyBlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdlcjxjaGFyMTZfdD4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8Y2hhcjMyX3Q+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworI2VuZGlmCisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8c2hvcnQ+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPHVuc2lnbmVkIHNob3J0PgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdlcjxpbnQ+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPHVuc2lnbmVkIGludD4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8bG9uZz4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8dW5zaWduZWQgbG9uZz4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8bG9uZyBsb25nPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdlcjx1bnNpZ25lZCBsb25nIGxvbmc+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIC8vCisgIC8vIEZsb2F0aW5nIHBvaW50IHR5cGVzCisgIC8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19mbG9hdGluZworICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMCB9OworICAgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgLy8gdGhyZWUgc3BlY2lhbGl6YXRpb25zIChmbG9hdCwgZG91YmxlIGFuZCAnbG9uZyBkb3VibGUnKQorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfZmxvYXRpbmc8ZmxvYXQ+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19mbG9hdGluZzxkb3VibGU+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19mbG9hdGluZzxsb25nIGRvdWJsZT4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgLy8KKyAgLy8gUG9pbnRlciB0eXBlcworICAvLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfcG9pbnRlcgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMCB9OworICAgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX3BvaW50ZXI8X1RwKj4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgLy8KKyAgLy8gTm9ybWFsIGl0ZXJhdG9yIHR5cGUKKyAgLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX25vcm1hbF9pdGVyYXRvcgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMCB9OworICAgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIHN0cnVjdCBfX2lzX25vcm1hbF9pdGVyYXRvcjwgX19nbnVfY3h4OjpfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsCisJCQkJCQkJICAgICAgX0NvbnRhaW5lcj4gPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLworICAvLyBBbiBhcml0aG1ldGljIHR5cGUgaXMgYW4gaW50ZWdlciB0eXBlIG9yIGEgZmxvYXRpbmcgcG9pbnQgdHlwZQorICAvLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfYXJpdGhtZXRpYworICAgIDogcHVibGljIF9fdHJhaXRvcjxfX2lzX2ludGVnZXI8X1RwPiwgX19pc19mbG9hdGluZzxfVHA+ID4KKyAgICB7IH07CisKKyAgLy8KKyAgLy8gQSBmdW5kYW1lbnRhbCB0eXBlIGlzIGB2b2lkJyBvciBhbmQgYXJpdGhtZXRpYyB0eXBlCisgIC8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19mdW5kYW1lbnRhbAorICAgIDogcHVibGljIF9fdHJhaXRvcjxfX2lzX3ZvaWQ8X1RwPiwgX19pc19hcml0aG1ldGljPF9UcD4gPgorICAgIHsgfTsKKworICAvLworICAvLyBBIHNjYWxhciB0eXBlIGlzIGFuIGFyaXRobWV0aWMgdHlwZSBvciBhIHBvaW50ZXIgdHlwZQorICAvLyAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX3NjYWxhcgorICAgIDogcHVibGljIF9fdHJhaXRvcjxfX2lzX2FyaXRobWV0aWM8X1RwPiwgX19pc19wb2ludGVyPF9UcD4gPgorICAgIHsgfTsKKworICAvLworICAvLyBGb3IgdXNlIGluIHN0ZDo6Y29weSBhbmQgc3RkOjpmaW5kIG92ZXJsb2FkcyBmb3Igc3RyZWFtYnVmIGl0ZXJhdG9ycy4KKyAgLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2NoYXIKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDAgfTsKKyAgICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19jaGFyPGNoYXI+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2NoYXI8d2NoYXJfdD4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfYnl0ZQorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMCB9OworICAgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2J5dGU8Y2hhcj4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2J5dGU8c2lnbmVkIGNoYXI+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19ieXRlPHVuc2lnbmVkIGNoYXI+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIC8vCisgIC8vIE1vdmUgaXRlcmF0b3IgdHlwZQorICAvLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbW92ZV9pdGVyYXRvcgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMCB9OworICAgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX190eXBlOworICAgIH07CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBjbGFzcyBtb3ZlX2l0ZXJhdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBzdHJ1Y3QgX19pc19tb3ZlX2l0ZXJhdG9yPCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4gPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvL19DUFBfVFlQRV9UUkFJVFNfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2N4eGFiaV9mb3JjZWQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jeHhhYmlfZm9yY2VkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNhNjU4MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jeHhhYmlfZm9yY2VkLmgKQEAgLTAsMCArMSw2MCBAQAorLy8gY3h4YWJpLmggc3Vic2V0IGZvciBjYW5jZWxsYXRpb24gLSotIEMrKyAtKi0KKyAgCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisvLworLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIAorLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvY3h4YWJpX2ZvcmNlZC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7Y3h4YWJpLmh9CisgKi8KKworI2lmbmRlZiBfQ1hYQUJJX0ZPUkNFRF9ICisjZGVmaW5lIF9DWFhBQklfRk9SQ0VEX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcHVzaChkZWZhdWx0KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK25hbWVzcGFjZSBfX2N4eGFiaXYxCit7ICAKKyAgLyoqIAorICAgKiAgQGJyaWVmIFRocm93biBhcyBwYXJ0IG9mIGZvcmNlZCB1bndpbmRpbmcuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqCisgICAqICBBIG1hZ2ljIHBsYWNlaG9sZGVyIGNsYXNzIHRoYXQgY2FuIGJlIGNhdWdodCBieSByZWZlcmVuY2UgdG8KKyAgICogIHJlY29nbml6ZSBmb3JjZWQgdW53aW5kaW5nLgorICAgKi8KKyAgY2xhc3MgX19mb3JjZWRfdW53aW5kCisgIHsKKyAgICB2aXJ0dWFsIH5fX2ZvcmNlZF91bndpbmQoKSB0aHJvdygpOworCisgICAgLy8gUHJldmVudCBjYXRjaCBieSB2YWx1ZS4KKyAgICB2aXJ0dWFsIHZvaWQgX19wdXJlX2R1bW15KCkgPSAwOyAKKyAgfTsKK30KKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorCisjZW5kaWYgLy8gX19DWFhBQklfRk9SQ0VEX0ggCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZGVxdWUudGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2RlcXVlLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWM1ZWY3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2RlcXVlLnRjYwpAQCAtMCwwICsxLDEwNjggQEAKKy8vIERlcXVlIGltcGxlbWVudGF0aW9uIChvdXQgb2YgbGluZSkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL2RlcXVlLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2RlcXVlfQorICovCisKKyNpZm5kZWYgX0RFUVVFX1RDQworI2RlZmluZSBfREVRVUVfVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9kZWZhdWx0X2luaXRpYWxpemUoKQorICAgIHsKKyAgICAgIF9NYXBfcG9pbnRlciBfX2N1cjsKKyAgICAgIF9fdHJ5CisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKF9fY3VyID0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlOworCSAgICAgICBfX2N1ciA8IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGU7CisJICAgICAgICsrX19jdXIpCisgICAgICAgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9kZWZhdWx0X2EoKl9fY3VyLCAqX19jdXIgKyBfU19idWZmZXJfc2l6ZSgpLAorCQkJCQkgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2RlZmF1bHRfYSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9maXJzdCwKKwkJCQkJIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1ciwKKwkJCQkJIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisgICAgICAgIH0KKyAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICB7CisgICAgICAgICAgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCBpdGVyYXRvcigqX19jdXIsIF9fY3VyKSwKKwkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisgICAgICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgZGVxdWU8X1RwLCBfQWxsb2M+JgorICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgb3BlcmF0b3I9KGNvbnN0IGRlcXVlJiBfX3gpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpOworICAgICAgaWYgKCZfX3ggIT0gdGhpcykKKwl7CisJICBpZiAoX19sZW4gPj0gX194LnNpemUoKSkKKwkgICAgX01fZXJhc2VfYXRfZW5kKHN0ZDo6Y29weShfX3guYmVnaW4oKSwgX194LmVuZCgpLAorCQkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fbWlkID0gX194LmJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX19sZW4pOworCSAgICAgIHN0ZDo6Y29weShfX3guYmVnaW4oKSwgX19taWQsIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworCSAgICAgIGluc2VydCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwgX19taWQsIF9feC5lbmQoKSk7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHZvaWQKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBlbXBsYWNlX2Zyb250KF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgeworCWlmICh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1ciAhPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2ZpcnN0KQorCSAgeworCSAgICB0aGlzLT5fTV9pbXBsLmNvbnN0cnVjdCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1ciAtIDEsCisJCQkJICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICAgIC0tdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXI7CisJICB9CisJZWxzZQorCSAgX01fcHVzaF9mcm9udF9hdXgoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHZvaWQKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBlbXBsYWNlX2JhY2soX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJaWYgKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1cgorCSAgICAhPSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9sYXN0IC0gMSkKKwkgIHsKKwkgICAgdGhpcy0+X01faW1wbC5jb25zdHJ1Y3QodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyLAorCQkJCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgICArK3RoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1cjsKKwkgIH0KKwllbHNlCisJICBfTV9wdXNoX2JhY2tfYXV4KHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgZGVxdWU8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICB7CisgICAgICBpZiAoX19wb3NpdGlvbi5fTV9jdXIgPT0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIpCisJeworCSAgcHVzaF9mcm9udChfX3gpOworCSAgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQ7CisJfQorICAgICAgZWxzZSBpZiAoX19wb3NpdGlvbi5fTV9jdXIgPT0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyKQorCXsKKwkgIHB1c2hfYmFjayhfX3gpOworCSAgaXRlcmF0b3IgX190bXAgPSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKwkgIC0tX190bXA7CisJICByZXR1cm4gX190bXA7CisJfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX01faW5zZXJ0X2F1eChfX3Bvc2l0aW9uLCBfX3gpOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICB0eXBlbmFtZSBkZXF1ZTxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwlpZiAoX19wb3NpdGlvbi5fTV9jdXIgPT0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIpCisJICB7CisJICAgIGVtcGxhY2VfZnJvbnQoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgICAgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQ7CisJICB9CisJZWxzZSBpZiAoX19wb3NpdGlvbi5fTV9jdXIgPT0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyKQorCSAgeworCSAgICBlbXBsYWNlX2JhY2soc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgICAgaXRlcmF0b3IgX190bXAgPSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKwkgICAgLS1fX3RtcDsKKwkgICAgcmV0dXJuIF9fdG1wOworCSAgfQorCWVsc2UKKwkgIHJldHVybiBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24sIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgZGVxdWU8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICB7CisgICAgICBpdGVyYXRvciBfX25leHQgPSBfX3Bvc2l0aW9uOworICAgICAgKytfX25leHQ7CisgICAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19pbmRleCA9IF9fcG9zaXRpb24gLSBiZWdpbigpOworICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19pbmRleCkgPCAoc2l6ZSgpID4+IDEpKQorCXsKKwkgIGlmIChfX3Bvc2l0aW9uICE9IGJlZ2luKCkpCisJICAgIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKGJlZ2luKCksIF9fcG9zaXRpb24sIF9fbmV4dCk7CisJICBwb3BfZnJvbnQoKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKF9fbmV4dCAhPSBlbmQoKSkKKwkgICAgX0dMSUJDWFhfTU9WRTMoX19uZXh0LCBlbmQoKSwgX19wb3NpdGlvbik7CisJICBwb3BfYmFjaygpOworCX0KKyAgICAgIHJldHVybiBiZWdpbigpICsgX19pbmRleDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fZmlyc3Q7CisgICAgICBlbHNlIGlmIChfX2ZpcnN0ID09IGJlZ2luKCkgJiYgX19sYXN0ID09IGVuZCgpKQorCXsKKwkgIGNsZWFyKCk7CisJICByZXR1cm4gZW5kKCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OworCSAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYmVmb3JlID0gX19maXJzdCAtIGJlZ2luKCk7CisJICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX2VsZW1zX2JlZm9yZSkgPD0gKHNpemUoKSAtIF9fbikgLyAyKQorCSAgICB7CisJICAgICAgaWYgKF9fZmlyc3QgIT0gYmVnaW4oKSkKKwkJX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsKKwkgICAgICBfTV9lcmFzZV9hdF9iZWdpbihiZWdpbigpICsgX19uKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKF9fbGFzdCAhPSBlbmQoKSkKKwkJX0dMSUJDWFhfTU9WRTMoX19sYXN0LCBlbmQoKSwgX19maXJzdCk7CisJICAgICAgX01fZXJhc2VfYXRfZW5kKGVuZCgpIC0gX19uKTsKKwkgICAgfQorCSAgcmV0dXJuIGJlZ2luKCkgKyBfX2VsZW1zX2JlZm9yZTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgICAgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKyAgICAgICAgaXRlcmF0b3IgX19jdXIgPSBiZWdpbigpOworICAgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19jdXIgIT0gZW5kKCk7ICsrX19jdXIsICsrX19maXJzdCkKKyAgICAgICAgICAqX19jdXIgPSAqX19maXJzdDsKKyAgICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgICAgIF9NX2VyYXNlX2F0X2VuZChfX2N1cik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBpbnNlcnQoZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX2ZpbGxfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgeworICAgICAgaWYgKF9fcG9zLl9NX2N1ciA9PSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1cikKKwl7CisJICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX2EoX19uZXdfc3RhcnQsIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQkJCSAgX194LCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsCisJCQkgICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKF9fcG9zLl9NX2N1ciA9PSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIpCisJeworCSAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9hKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkgIF9fbmV3X2ZpbmlzaCwgX194LAorCQkJCQkgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwKKwkJCSAgICAgICBfX25ld19maW5pc2guX01fbm9kZSArIDEpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorICAgICAgZWxzZQorICAgICAgICBfTV9pbnNlcnRfYXV4KF9fcG9zLCBfX24sIF9feCk7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgX01fZGVmYXVsdF9hcHBlbmQoc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBpZiAoX19uKQorCXsKKwkgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworCSAgX190cnkKKwkgICAgeworCSAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2RlZmF1bHRfYSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICAgICBfX25ld19maW5pc2gsCisJCQkJCSAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyAxLAorCQkJICAgICAgIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBib29sCisgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9zaHJpbmtfdG9fZml0KCkKKyAgICB7CisgICAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19mcm9udF9jYXBhY2l0eQorCT0gKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9maXJzdCk7CisgICAgICBpZiAoX19mcm9udF9jYXBhY2l0eSA9PSAwKQorCXJldHVybiBmYWxzZTsKKworICAgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fYmFja19jYXBhY2l0eQorCT0gKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2xhc3QgLSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIpOworICAgICAgaWYgKF9fZnJvbnRfY2FwYWNpdHkgKyBfX2JhY2tfY2FwYWNpdHkgPCBfU19idWZmZXJfc2l6ZSgpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19zaHJpbmtfdG9fZml0X2F1eDxkZXF1ZT46Ol9TX2RvX2l0KCp0aGlzKTsKKyAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgX01fZmlsbF9pbml0aWFsaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgeworICAgICAgX01hcF9wb2ludGVyIF9fY3VyOworICAgICAgX190cnkKKyAgICAgICAgeworICAgICAgICAgIGZvciAoX19jdXIgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX25vZGU7CisJICAgICAgIF9fY3VyIDwgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZTsKKwkgICAgICAgKytfX2N1cikKKyAgICAgICAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2ZpbGxfYSgqX19jdXIsICpfX2N1ciArIF9TX2J1ZmZlcl9zaXplKCksCisJCQkJCV9fdmFsdWUsIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisgICAgICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9hKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2ZpcnN0LAorCQkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1ciwKKwkJCQkgICAgICBfX3ZhbHVlLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgICB9CisgICAgICBfX2NhdGNoKC4uLikKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6X0Rlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydCwgaXRlcmF0b3IoKl9fY3VyLCBfX2N1ciksCisJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgICB9CisgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgeworICAgICAgICB0aGlzLT5fTV9pbml0aWFsaXplX21hcCgwKTsKKyAgICAgICAgX190cnkKKyAgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisJICAgICAgZW1wbGFjZV9iYWNrKCpfX2ZpcnN0KTsKKyNlbHNlCisgICAgICAgICAgICAgIHB1c2hfYmFjaygqX19maXJzdCk7CisjZW5kaWYKKyAgICAgICAgICB9CisgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNsZWFyKCk7CisgICAgICAgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgdGhpcy0+X01faW5pdGlhbGl6ZV9tYXAoX19uKTsKKworICAgICAgICBfTWFwX3BvaW50ZXIgX19jdXJfbm9kZTsKKyAgICAgICAgX190cnkKKyAgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKF9fY3VyX25vZGUgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX25vZGU7CisgICAgICAgICAgICAgICAgIF9fY3VyX25vZGUgPCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlOworICAgICAgICAgICAgICAgICArK19fY3VyX25vZGUpCisJICAgICAgeworCQlfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKKwkJc3RkOjphZHZhbmNlKF9fbWlkLCBfU19idWZmZXJfc2l6ZSgpKTsKKwkJc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9fZmlyc3QsIF9fbWlkLCAqX19jdXJfbm9kZSwKKwkJCQkJICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCV9fZmlyc3QgPSBfX21pZDsKKwkgICAgICB9CisgICAgICAgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX19maXJzdCwgX19sYXN0LAorCQkJCQl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9maXJzdCwKKwkJCQkJX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKyAgICAgICAgICB9CisgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6X0Rlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCSAgaXRlcmF0b3IoKl9fY3VyX25vZGUsIF9fY3VyX25vZGUpLAorCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgICAgfQorICAgICAgfQorCisgIC8vIENhbGxlZCBvbmx5IGlmIF9NX2ltcGwuX01fZmluaXNoLl9NX2N1ciA9PSBfTV9pbXBsLl9NX2ZpbmlzaC5fTV9sYXN0IC0gMS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3B1c2hfYmFja19hdXgoX0FyZ3MmJi4uLiBfX2FyZ3MpCisjZWxzZQorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3B1c2hfYmFja19hdXgoY29uc3QgdmFsdWVfdHlwZSYgX190KQorI2VuZGlmCisgICAgICB7CisJX01fcmVzZXJ2ZV9tYXBfYXRfYmFjaygpOworCSoodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSArIDEpID0gdGhpcy0+X01fYWxsb2NhdGVfbm9kZSgpOworCV9fdHJ5CisJICB7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCSAgICB0aGlzLT5fTV9pbXBsLmNvbnN0cnVjdCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIsCisJCQkJICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisjZWxzZQorCSAgICB0aGlzLT5fTV9pbXBsLmNvbnN0cnVjdCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIsIF9fdCk7CisjZW5kaWYKKwkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fc2V0X25vZGUodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZQorCQkJCQkJKyAxKTsKKwkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyID0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fZmlyc3Q7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9NX2RlYWxsb2NhdGVfbm9kZSgqKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyAxKSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorCisgIC8vIENhbGxlZCBvbmx5IGlmIF9NX2ltcGwuX01fc3RhcnQuX01fY3VyID09IF9NX2ltcGwuX01fc3RhcnQuX01fZmlyc3QuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHZvaWQKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9wdXNoX2Zyb250X2F1eChfQXJncyYmLi4uIF9fYXJncykKKyNlbHNlCisgICAgICB2b2lkCisgICAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgICAgX01fcHVzaF9mcm9udF9hdXgoY29uc3QgdmFsdWVfdHlwZSYgX190KQorI2VuZGlmCisgICAgICB7CisJX01fcmVzZXJ2ZV9tYXBfYXRfZnJvbnQoKTsKKwkqKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSAtIDEpID0gdGhpcy0+X01fYWxsb2NhdGVfbm9kZSgpOworCV9fdHJ5CisJICB7CisJICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fc2V0X25vZGUodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlCisJCQkJCSAgICAgICAtIDEpOworCSAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1ciA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbGFzdCAtIDE7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCSAgICB0aGlzLT5fTV9pbXBsLmNvbnN0cnVjdCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1ciwKKwkJCQkgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyNlbHNlCisJICAgIHRoaXMtPl9NX2ltcGwuY29uc3RydWN0KHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyLCBfX3QpOworI2VuZGlmCisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgICsrdGhpcy0+X01faW1wbC5fTV9zdGFydDsKKwkgICAgX01fZGVhbGxvY2F0ZV9ub2RlKCoodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlIC0gMSkpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKworICAvLyBDYWxsZWQgb25seSBpZiBfTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIgPT0gX01faW1wbC5fTV9maW5pc2guX01fZmlyc3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgX01fcG9wX2JhY2tfYXV4KCkKKyAgICB7CisgICAgICBfTV9kZWFsbG9jYXRlX25vZGUodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fZmlyc3QpOworICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fc2V0X25vZGUodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSAtIDEpOworICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyID0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbGFzdCAtIDE7CisgICAgICB0aGlzLT5fTV9pbXBsLmRlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyKTsKKyAgICB9CisKKyAgLy8gQ2FsbGVkIG9ubHkgaWYgX01faW1wbC5fTV9zdGFydC5fTV9jdXIgPT0gX01faW1wbC5fTV9zdGFydC5fTV9sYXN0IC0gMS4KKyAgLy8gTm90ZSB0aGF0IGlmIHRoZSBkZXF1ZSBoYXMgYXQgbGVhc3Qgb25lIGVsZW1lbnQgKGEgcHJlY29uZGl0aW9uIGZvciB0aGlzCisgIC8vIG1lbWJlciBmdW5jdGlvbiksIGFuZCBpZgorICAvLyAgIF9NX2ltcGwuX01fc3RhcnQuX01fY3VyID09IF9NX2ltcGwuX01fc3RhcnQuX01fbGFzdCwKKyAgLy8gdGhlbiB0aGUgZGVxdWUgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBub2Rlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9wb3BfZnJvbnRfYXV4KCkKKyAgICB7CisgICAgICB0aGlzLT5fTV9pbXBsLmRlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIpOworICAgICAgX01fZGVhbGxvY2F0ZV9ub2RlKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fZmlyc3QpOworICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9zZXRfbm9kZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX25vZGUgKyAxKTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyID0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9maXJzdDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9yYW5nZV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgeyBzdGQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBzdGQ6Omluc2VydGVyKCp0aGlzLCBfX3BvcykpOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3JhbmdlX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICB7CisgICAgICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIpCisJICB7CisJICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOworCSAgICBfX3RyeQorCSAgICAgIHsKKwkJc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9fZmlyc3QsIF9fbGFzdCwgX19uZXdfc3RhcnQsCisJCQkJCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQl0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisJICAgICAgfQorCSAgICBfX2NhdGNoKC4uLikKKwkgICAgICB7CisJCV9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwKKwkJCQkgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlKTsKKwkJX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgICAgfQorCSAgfQorICAgICAgICBlbHNlIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyKQorCSAgeworCSAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKKwkgICAgX190cnkKKwkgICAgICB7CisJCXN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX2ZpcnN0LCBfX2xhc3QsCisJCQkJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19uZXdfZmluaXNoOworCSAgICAgIH0KKwkgICAgX19jYXRjaCguLi4pCisJICAgICAgeworCQlfTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyAxLAorCQkJCSBfX25ld19maW5pc2guX01fbm9kZSArIDEpOworCQlfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgICB9CisJICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBfTV9pbnNlcnRfYXV4KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9fbik7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdHlwZW5hbWUgZGVxdWU8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgeworCXZhbHVlX3R5cGUgX194X2NvcHkoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgLy8gWFhYIGNvcHkKKyNlbHNlCisgICAgdHlwZW5hbWUgZGVxdWU8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwl2YWx1ZV90eXBlIF9feF9jb3B5ID0gX194OyAvLyBYWFggY29weQorI2VuZGlmCisJZGlmZmVyZW5jZV90eXBlIF9faW5kZXggPSBfX3BvcyAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQ7CisJaWYgKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19pbmRleCkgPCBzaXplKCkgLyAyKQorCSAgeworCSAgICBwdXNoX2Zyb250KF9HTElCQ1hYX01PVkUoZnJvbnQoKSkpOworCSAgICBpdGVyYXRvciBfX2Zyb250MSA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQ7CisJICAgICsrX19mcm9udDE7CisJICAgIGl0ZXJhdG9yIF9fZnJvbnQyID0gX19mcm9udDE7CisJICAgICsrX19mcm9udDI7CisJICAgIF9fcG9zID0gdGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9faW5kZXg7CisJICAgIGl0ZXJhdG9yIF9fcG9zMSA9IF9fcG9zOworCSAgICArK19fcG9zMTsKKwkgICAgX0dMSUJDWFhfTU9WRTMoX19mcm9udDIsIF9fcG9zMSwgX19mcm9udDEpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgcHVzaF9iYWNrKF9HTElCQ1hYX01PVkUoYmFjaygpKSk7CisJICAgIGl0ZXJhdG9yIF9fYmFjazEgPSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKwkgICAgLS1fX2JhY2sxOworCSAgICBpdGVyYXRvciBfX2JhY2syID0gX19iYWNrMTsKKwkgICAgLS1fX2JhY2syOworCSAgICBfX3BvcyA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX2luZGV4OworCSAgICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX3BvcywgX19iYWNrMiwgX19iYWNrMSk7CisJICB9CisJKl9fcG9zID0gX0dMSUJDWFhfTU9WRShfX3hfY29weSk7CisJcmV0dXJuIF9fcG9zOworICAgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgeworICAgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYmVmb3JlID0gX19wb3MgLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuZ3RoID0gdGhpcy0+c2l6ZSgpOworICAgICAgdmFsdWVfdHlwZSBfX3hfY29weSA9IF9feDsKKyAgICAgIGlmIChfX2VsZW1zX2JlZm9yZSA8IGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCAvIDIpKQorCXsKKwkgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOworCSAgaXRlcmF0b3IgX19vbGRfc3RhcnQgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OworCSAgX19wb3MgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19lbGVtc19iZWZvcmU7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgaWYgKF9fZWxlbXNfYmVmb3JlID49IGRpZmZlcmVuY2VfdHlwZShfX24pKQorCQl7CisJCSAgaXRlcmF0b3IgX19zdGFydF9uID0gKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQKKwkJCQkJKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CisJCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQkJCSAgICAgIF9fc3RhcnRfbiwgX19uZXdfc3RhcnQsCisJCQkJCSAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworCQkgIF9HTElCQ1hYX01PVkUzKF9fc3RhcnRfbiwgX19wb3MsIF9fb2xkX3N0YXJ0KTsKKwkJICBzdGQ6OmZpbGwoX19wb3MgLSBkaWZmZXJlbmNlX3R5cGUoX19uKSwgX19wb3MsIF9feF9jb3B5KTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfZmlsbCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJCQkJIF9fcG9zLCBfX25ld19zdGFydCwKKwkJCQkJCSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJCQkJIF9feF9jb3B5LAorCQkJCQkJIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworCQkgIHN0ZDo6ZmlsbChfX29sZF9zdGFydCwgX19wb3MsIF9feF9jb3B5KTsKKwkJfQorCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIF9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwKKwkJCSAgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX25vZGUpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworCSAgaXRlcmF0b3IgX19vbGRfZmluaXNoID0gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisJICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc19hZnRlciA9CisJICAgIGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCkgLSBfX2VsZW1zX2JlZm9yZTsKKwkgIF9fcG9zID0gdGhpcy0+X01faW1wbC5fTV9maW5pc2ggLSBfX2VsZW1zX2FmdGVyOworCSAgX190cnkKKwkgICAgeworCSAgICAgIGlmIChfX2VsZW1zX2FmdGVyID4gZGlmZmVyZW5jZV90eXBlKF9fbikpCisJCXsKKwkJICBpdGVyYXRvciBfX2ZpbmlzaF9uID0gKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoCisJCQkJCSAtIGRpZmZlcmVuY2VfdHlwZShfX24pKTsKKwkJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EoX19maW5pc2hfbiwKKwkJCQkJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19uZXdfZmluaXNoOworCQkgIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKF9fcG9zLCBfX2ZpbmlzaF9uLCBfX29sZF9maW5pc2gpOworCQkgIHN0ZDo6ZmlsbChfX3BvcywgX19wb3MgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSwgX194X2NvcHkpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9tb3ZlKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkJIF9fcG9zICsgZGlmZmVyZW5jZV90eXBlKF9fbiksCisJCQkJCQkgX194X2NvcHksIF9fcG9zLAorCQkJCQkJIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkJIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJCSAgc3RkOjpmaWxsKF9fcG9zLCBfX29sZF9maW5pc2gsIF9feF9jb3B5KTsKKwkJfQorCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIF9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSArIDEsCisJCQkgICAgICAgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX24pCisgICAgICB7CisgICAgICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zYmVmb3JlID0gX19wb3MgLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OworICAgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW5ndGggPSBzaXplKCk7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fZWxlbXNiZWZvcmUpIDwgX19sZW5ndGggLyAyKQorCSAgeworCSAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKwkgICAgaXRlcmF0b3IgX19vbGRfc3RhcnQgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OworCSAgICBfX3BvcyA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX2VsZW1zYmVmb3JlOworCSAgICBfX3RyeQorCSAgICAgIHsKKwkJaWYgKF9fZWxlbXNiZWZvcmUgPj0gZGlmZmVyZW5jZV90eXBlKF9fbikpCisJCSAgeworCQkgICAgaXRlcmF0b3IgX19zdGFydF9uID0gKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQKKwkJCQkJICArIGRpZmZlcmVuY2VfdHlwZShfX24pKTsKKwkJICAgIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJCQkJX19zdGFydF9uLCBfX25ld19zdGFydCwKKwkJCQkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisJCSAgICBfR0xJQkNYWF9NT1ZFMyhfX3N0YXJ0X24sIF9fcG9zLCBfX29sZF9zdGFydCk7CisJCSAgICBzdGQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX3BvcyAtIGRpZmZlcmVuY2VfdHlwZShfX24pKTsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKKwkJICAgIHN0ZDo6YWR2YW5jZShfX21pZCwgZGlmZmVyZW5jZV90eXBlKF9fbikgLSBfX2VsZW1zYmVmb3JlKTsKKwkJICAgIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfY29weSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJCQkJICAgX19wb3MsIF9fZmlyc3QsIF9fbWlkLAorCQkJCQkJICAgX19uZXdfc3RhcnQsCisJCQkJCQkgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworCQkgICAgc3RkOjpjb3B5KF9fbWlkLCBfX2xhc3QsIF9fb2xkX3N0YXJ0KTsKKwkJICB9CisJICAgICAgfQorCSAgICBfX2NhdGNoKC4uLikKKwkgICAgICB7CisJCV9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwKKwkJCQkgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlKTsKKwkJX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgICAgfQorCSAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKKyAgICAgICAgICBpdGVyYXRvciBfX29sZF9maW5pc2ggPSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKyAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc2FmdGVyID0KKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZShfX2xlbmd0aCkgLSBfX2VsZW1zYmVmb3JlOworICAgICAgICAgIF9fcG9zID0gdGhpcy0+X01faW1wbC5fTV9maW5pc2ggLSBfX2VsZW1zYWZ0ZXI7CisgICAgICAgICAgX190cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKF9fZWxlbXNhZnRlciA+IGRpZmZlcmVuY2VfdHlwZShfX24pKQorCQl7CisJCSAgaXRlcmF0b3IgX19maW5pc2hfbiA9ICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaAorCQkJCQkgLSBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CisJCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9fZmluaXNoX24sCisJCQkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKwkJICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX3BvcywgX19maW5pc2hfbiwgX19vbGRfZmluaXNoKTsKKwkJICBzdGQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvcyk7CisJCX0KKyAgICAgICAgICAgICAgZWxzZQorCQl7CisJCSAgX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IF9fZmlyc3Q7CisJCSAgc3RkOjphZHZhbmNlKF9fbWlkLCBfX2VsZW1zYWZ0ZXIpOworCQkgIHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfbW92ZShfX21pZCwgX19sYXN0LCBfX3BvcywKKwkJCQkJCSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJCSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJCSBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19uZXdfZmluaXNoOworCQkgIHN0ZDo6Y29weShfX2ZpcnN0LCBfX21pZCwgX19wb3MpOworCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgX19jYXRjaCguLi4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSArIDEsCisJCQkgICAgICAgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKTsKKyAgICAgICAgICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgIHZvaWQKKyAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgX01fZGVzdHJveV9kYXRhX2F1eChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgIHsKKyAgICAgICBmb3IgKF9NYXBfcG9pbnRlciBfX25vZGUgPSBfX2ZpcnN0Ll9NX25vZGUgKyAxOworCSAgICBfX25vZGUgPCBfX2xhc3QuX01fbm9kZTsgKytfX25vZGUpCisJIHN0ZDo6X0Rlc3Ryb3koKl9fbm9kZSwgKl9fbm9kZSArIF9TX2J1ZmZlcl9zaXplKCksCisJCSAgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCisgICAgICAgaWYgKF9fZmlyc3QuX01fbm9kZSAhPSBfX2xhc3QuX01fbm9kZSkKKwkgeworCSAgIHN0ZDo6X0Rlc3Ryb3koX19maXJzdC5fTV9jdXIsIF9fZmlyc3QuX01fbGFzdCwKKwkJCSBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgIHN0ZDo6X0Rlc3Ryb3koX19sYXN0Ll9NX2ZpcnN0LCBfX2xhc3QuX01fY3VyLAorCQkJIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJIH0KKyAgICAgICBlbHNlCisJIHN0ZDo6X0Rlc3Ryb3koX19maXJzdC5fTV9jdXIsIF9fbGFzdC5fTV9jdXIsCisJCSAgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX25ld19lbGVtZW50c19hdF9mcm9udChzaXplX3R5cGUgX19uZXdfZWxlbXMpCisgICAgeworICAgICAgaWYgKHRoaXMtPm1heF9zaXplKCkgLSB0aGlzLT5zaXplKCkgPCBfX25ld19lbGVtcykKKwlfX3Rocm93X2xlbmd0aF9lcnJvcihfX04oImRlcXVlOjpfTV9uZXdfZWxlbWVudHNfYXRfZnJvbnQiKSk7CisKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX25ld19ub2RlcyA9ICgoX19uZXdfZWxlbXMgKyBfU19idWZmZXJfc2l6ZSgpIC0gMSkKKwkJCQkgICAgIC8gX1NfYnVmZmVyX3NpemUoKSk7CisgICAgICBfTV9yZXNlcnZlX21hcF9hdF9mcm9udChfX25ld19ub2Rlcyk7CisgICAgICBzaXplX3R5cGUgX19pOworICAgICAgX190cnkKKyAgICAgICAgeworICAgICAgICAgIGZvciAoX19pID0gMTsgX19pIDw9IF9fbmV3X25vZGVzOyArK19faSkKKyAgICAgICAgICAgICoodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlIC0gX19pKSA9IHRoaXMtPl9NX2FsbG9jYXRlX25vZGUoKTsKKyAgICAgICAgfQorICAgICAgX19jYXRjaCguLi4pCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKHNpemVfdHlwZSBfX2ogPSAxOyBfX2ogPCBfX2k7ICsrX19qKQorICAgICAgICAgICAgX01fZGVhbGxvY2F0ZV9ub2RlKCoodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlIC0gX19qKSk7CisgICAgICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgIH0KKyAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX25ld19lbGVtZW50c19hdF9iYWNrKHNpemVfdHlwZSBfX25ld19lbGVtcykKKyAgICB7CisgICAgICBpZiAodGhpcy0+bWF4X3NpemUoKSAtIHRoaXMtPnNpemUoKSA8IF9fbmV3X2VsZW1zKQorCV9fdGhyb3dfbGVuZ3RoX2Vycm9yKF9fTigiZGVxdWU6Ol9NX25ld19lbGVtZW50c19hdF9iYWNrIikpOworCisgICAgICBjb25zdCBzaXplX3R5cGUgX19uZXdfbm9kZXMgPSAoKF9fbmV3X2VsZW1zICsgX1NfYnVmZmVyX3NpemUoKSAtIDEpCisJCQkJICAgICAvIF9TX2J1ZmZlcl9zaXplKCkpOworICAgICAgX01fcmVzZXJ2ZV9tYXBfYXRfYmFjayhfX25ld19ub2Rlcyk7CisgICAgICBzaXplX3R5cGUgX19pOworICAgICAgX190cnkKKyAgICAgICAgeworICAgICAgICAgIGZvciAoX19pID0gMTsgX19pIDw9IF9fbmV3X25vZGVzOyArK19faSkKKyAgICAgICAgICAgICoodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSArIF9faSkgPSB0aGlzLT5fTV9hbGxvY2F0ZV9ub2RlKCk7CisgICAgICAgIH0KKyAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICB7CisgICAgICAgICAgZm9yIChzaXplX3R5cGUgX19qID0gMTsgX19qIDwgX19pOyArK19faikKKyAgICAgICAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZSgqKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyBfX2opKTsKKyAgICAgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICAgICAgfQorICAgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgX01fcmVhbGxvY2F0ZV9tYXAoc2l6ZV90eXBlIF9fbm9kZXNfdG9fYWRkLCBib29sIF9fYWRkX2F0X2Zyb250KQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9udW1fbm9kZXMKKwk9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX25vZGUgKyAxOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbmV3X251bV9ub2RlcyA9IF9fb2xkX251bV9ub2RlcyArIF9fbm9kZXNfdG9fYWRkOworCisgICAgICBfTWFwX3BvaW50ZXIgX19uZXdfbnN0YXJ0OworICAgICAgaWYgKHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUgPiAyICogX19uZXdfbnVtX25vZGVzKQorCXsKKwkgIF9fbmV3X25zdGFydCA9IHRoaXMtPl9NX2ltcGwuX01fbWFwICsgKHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUKKwkJCQkJIC0gX19uZXdfbnVtX25vZGVzKSAvIDIKKwkgICAgICAgICAgICAgICAgICsgKF9fYWRkX2F0X2Zyb250ID8gX19ub2Rlc190b19hZGQgOiAwKTsKKwkgIGlmIChfX25ld19uc3RhcnQgPCB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX25vZGUpCisJICAgIHN0ZDo6Y29weSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX25vZGUsCisJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyAxLAorCQkgICAgICBfX25ld19uc3RhcnQpOworCSAgZWxzZQorCSAgICBzdGQ6OmNvcHlfYmFja3dhcmQodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlLAorCQkJICAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyAxLAorCQkJICAgICAgIF9fbmV3X25zdGFydCArIF9fb2xkX251bV9ub2Rlcyk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHNpemVfdHlwZSBfX25ld19tYXBfc2l6ZSA9IHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RkOjptYXgodGhpcy0+X01faW1wbC5fTV9tYXBfc2l6ZSwKKwkJCQkJCV9fbm9kZXNfdG9fYWRkKSArIDI7CisKKwkgIF9NYXBfcG9pbnRlciBfX25ld19tYXAgPSB0aGlzLT5fTV9hbGxvY2F0ZV9tYXAoX19uZXdfbWFwX3NpemUpOworCSAgX19uZXdfbnN0YXJ0ID0gX19uZXdfbWFwICsgKF9fbmV3X21hcF9zaXplIC0gX19uZXdfbnVtX25vZGVzKSAvIDIKKwkgICAgICAgICAgICAgICAgICsgKF9fYWRkX2F0X2Zyb250ID8gX19ub2Rlc190b19hZGQgOiAwKTsKKwkgIHN0ZDo6Y29weSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX25vZGUsCisJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwKKwkJICAgIF9fbmV3X25zdGFydCk7CisJICBfTV9kZWFsbG9jYXRlX21hcCh0aGlzLT5fTV9pbXBsLl9NX21hcCwgdGhpcy0+X01faW1wbC5fTV9tYXBfc2l6ZSk7CisKKwkgIHRoaXMtPl9NX2ltcGwuX01fbWFwID0gX19uZXdfbWFwOworCSAgdGhpcy0+X01faW1wbC5fTV9tYXBfc2l6ZSA9IF9fbmV3X21hcF9zaXplOworCX0KKworICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9zZXRfbm9kZShfX25ld19uc3RhcnQpOworICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fc2V0X25vZGUoX19uZXdfbnN0YXJ0ICsgX19vbGRfbnVtX25vZGVzIC0gMSk7CisgICAgfQorCisgIC8vIE92ZXJsb2FkIGZvciBkZXF1ZTo6aXRlcmF0b3JzLCBleHBsb2l0aW5nIHRoZSAic2VnbWVudGVkLWl0ZXJhdG9yCisgIC8vIG9wdGltaXphdGlvbiIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgZmlsbChjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiYgX19maXJzdCwKKwkgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4mIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj46Ol9TZWxmIF9TZWxmOworCisgICAgICBmb3IgKHR5cGVuYW1lIF9TZWxmOjpfTWFwX3BvaW50ZXIgX19ub2RlID0gX19maXJzdC5fTV9ub2RlICsgMTsKKyAgICAgICAgICAgX19ub2RlIDwgX19sYXN0Ll9NX25vZGU7ICsrX19ub2RlKQorCXN0ZDo6ZmlsbCgqX19ub2RlLCAqX19ub2RlICsgX1NlbGY6Ol9TX2J1ZmZlcl9zaXplKCksIF9fdmFsdWUpOworCisgICAgICBpZiAoX19maXJzdC5fTV9ub2RlICE9IF9fbGFzdC5fTV9ub2RlKQorCXsKKwkgIHN0ZDo6ZmlsbChfX2ZpcnN0Ll9NX2N1ciwgX19maXJzdC5fTV9sYXN0LCBfX3ZhbHVlKTsKKwkgIHN0ZDo6ZmlsbChfX2xhc3QuX01fZmlyc3QsIF9fbGFzdC5fTV9jdXIsIF9fdmFsdWUpOworCX0KKyAgICAgIGVsc2UKKwlzdGQ6OmZpbGwoX19maXJzdC5fTV9jdXIsIF9fbGFzdC5fTV9jdXIsIF9fdmFsdWUpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4KKyAgICBjb3B5KF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+IF9fZmlyc3QsCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+IF9fbGFzdCwKKwkgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPjo6X1NlbGYgX1NlbGY7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZWxmOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgICBkaWZmZXJlbmNlX3R5cGUgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgICAgd2hpbGUgKF9fbGVuID4gMCkKKwl7CisJICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19jbGVuCisJICAgID0gc3RkOjptaW4oX19sZW4sIHN0ZDo6bWluKF9fZmlyc3QuX01fbGFzdCAtIF9fZmlyc3QuX01fY3VyLAorCQkJCSAgICAgICBfX3Jlc3VsdC5fTV9sYXN0IC0gX19yZXN1bHQuX01fY3VyKSk7CisJICBzdGQ6OmNvcHkoX19maXJzdC5fTV9jdXIsIF9fZmlyc3QuX01fY3VyICsgX19jbGVuLCBfX3Jlc3VsdC5fTV9jdXIpOworCSAgX19maXJzdCArPSBfX2NsZW47CisJICBfX3Jlc3VsdCArPSBfX2NsZW47CisJICBfX2xlbiAtPSBfX2NsZW47CisJfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4KKyAgICBjb3B5X2JhY2t3YXJkKF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+IF9fZmlyc3QsCisJCSAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4gX19sYXN0LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj46Ol9TZWxmIF9TZWxmOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VsZjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApCisJeworCSAgZGlmZmVyZW5jZV90eXBlIF9fbGxlbiA9IF9fbGFzdC5fTV9jdXIgLSBfX2xhc3QuX01fZmlyc3Q7CisJICBfVHAqIF9fbGVuZCA9IF9fbGFzdC5fTV9jdXI7CisKKwkgIGRpZmZlcmVuY2VfdHlwZSBfX3JsZW4gPSBfX3Jlc3VsdC5fTV9jdXIgLSBfX3Jlc3VsdC5fTV9maXJzdDsKKwkgIF9UcCogX19yZW5kID0gX19yZXN1bHQuX01fY3VyOworCisJICBpZiAoIV9fbGxlbikKKwkgICAgeworCSAgICAgIF9fbGxlbiA9IF9TZWxmOjpfU19idWZmZXJfc2l6ZSgpOworCSAgICAgIF9fbGVuZCA9ICooX19sYXN0Ll9NX25vZGUgLSAxKSArIF9fbGxlbjsKKwkgICAgfQorCSAgaWYgKCFfX3JsZW4pCisJICAgIHsKKwkgICAgICBfX3JsZW4gPSBfU2VsZjo6X1NfYnVmZmVyX3NpemUoKTsKKwkgICAgICBfX3JlbmQgPSAqKF9fcmVzdWx0Ll9NX25vZGUgLSAxKSArIF9fcmxlbjsKKwkgICAgfQorCisJICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19jbGVuID0gc3RkOjptaW4oX19sZW4sCisJCQkJCQkgIHN0ZDo6bWluKF9fbGxlbiwgX19ybGVuKSk7CisJICBzdGQ6OmNvcHlfYmFja3dhcmQoX19sZW5kIC0gX19jbGVuLCBfX2xlbmQsIF9fcmVuZCk7CisJICBfX2xhc3QgLT0gX19jbGVuOworCSAgX19yZXN1bHQgLT0gX19jbGVuOworCSAgX19sZW4gLT0gX19jbGVuOworCX0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPgorICAgIG1vdmUoX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4gX19maXJzdCwKKwkgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4gX19sYXN0LAorCSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+OjpfU2VsZiBfU2VsZjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlbGY6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICB3aGlsZSAoX19sZW4gPiAwKQorCXsKKwkgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2NsZW4KKwkgICAgPSBzdGQ6Om1pbihfX2xlbiwgc3RkOjptaW4oX19maXJzdC5fTV9sYXN0IC0gX19maXJzdC5fTV9jdXIsCisJCQkJICAgICAgIF9fcmVzdWx0Ll9NX2xhc3QgLSBfX3Jlc3VsdC5fTV9jdXIpKTsKKwkgIHN0ZDo6bW92ZShfX2ZpcnN0Ll9NX2N1ciwgX19maXJzdC5fTV9jdXIgKyBfX2NsZW4sIF9fcmVzdWx0Ll9NX2N1cik7CisJICBfX2ZpcnN0ICs9IF9fY2xlbjsKKwkgIF9fcmVzdWx0ICs9IF9fY2xlbjsKKwkgIF9fbGVuIC09IF9fY2xlbjsKKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPgorICAgIG1vdmVfYmFja3dhcmQoX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4gX19maXJzdCwKKwkJICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBfX2xhc3QsCisJCSAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPjo6X1NlbGYgX1NlbGY7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZWxmOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgICBkaWZmZXJlbmNlX3R5cGUgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgICAgd2hpbGUgKF9fbGVuID4gMCkKKwl7CisJICBkaWZmZXJlbmNlX3R5cGUgX19sbGVuID0gX19sYXN0Ll9NX2N1ciAtIF9fbGFzdC5fTV9maXJzdDsKKwkgIF9UcCogX19sZW5kID0gX19sYXN0Ll9NX2N1cjsKKworCSAgZGlmZmVyZW5jZV90eXBlIF9fcmxlbiA9IF9fcmVzdWx0Ll9NX2N1ciAtIF9fcmVzdWx0Ll9NX2ZpcnN0OworCSAgX1RwKiBfX3JlbmQgPSBfX3Jlc3VsdC5fTV9jdXI7CisKKwkgIGlmICghX19sbGVuKQorCSAgICB7CisJICAgICAgX19sbGVuID0gX1NlbGY6Ol9TX2J1ZmZlcl9zaXplKCk7CisJICAgICAgX19sZW5kID0gKihfX2xhc3QuX01fbm9kZSAtIDEpICsgX19sbGVuOworCSAgICB9CisJICBpZiAoIV9fcmxlbikKKwkgICAgeworCSAgICAgIF9fcmxlbiA9IF9TZWxmOjpfU19idWZmZXJfc2l6ZSgpOworCSAgICAgIF9fcmVuZCA9ICooX19yZXN1bHQuX01fbm9kZSAtIDEpICsgX19ybGVuOworCSAgICB9CisKKwkgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2NsZW4gPSBzdGQ6Om1pbihfX2xlbiwKKwkJCQkJCSAgc3RkOjptaW4oX19sbGVuLCBfX3JsZW4pKTsKKwkgIHN0ZDo6bW92ZV9iYWNrd2FyZChfX2xlbmQgLSBfX2NsZW4sIF9fbGVuZCwgX19yZW5kKTsKKwkgIF9fbGFzdCAtPSBfX2NsZW47CisJICBfX3Jlc3VsdCAtPSBfX2NsZW47CisJICBfX2xlbiAtPSBfX2NsZW47CisJfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2V4Y2VwdGlvbl9kZWZpbmVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZXhjZXB0aW9uX2RlZmluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDJhMmQ3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2V4Y2VwdGlvbl9kZWZpbmVzLmgKQEAgLTAsMCArMSw0NSBAQAorLy8gLWZuby1leGNlcHRpb25zIFN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvZXhjZXB0aW9uX2RlZmluZXMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4Y2VwdGlvbn0KKyAqLworCisjaWZuZGVmIF9FWENFUFRJT05fREVGSU5FU19ICisjZGVmaW5lIF9FWENFUFRJT05fREVGSU5FU19IIDEKKworI2lmbmRlZiBfX0VYQ0VQVElPTlMKKy8vIElmZiAtZm5vLWV4Y2VwdGlvbnMsIHRyYW5zZm9ybSBlcnJvciBoYW5kbGluZyBjb2RlIHRvIHdvcmsgd2l0aG91dCBpdC4KKyMgZGVmaW5lIF9fdHJ5ICAgICAgaWYgKHRydWUpCisjIGRlZmluZSBfX2NhdGNoKFgpIGlmIChmYWxzZSkKKyMgZGVmaW5lIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluCisjZWxzZQorLy8gRWxzZSBwcm9jZWVkIG5vcm1hbGx5LgorIyBkZWZpbmUgX190cnkgICAgICB0cnkKKyMgZGVmaW5lIF9fY2F0Y2goWCkgY2F0Y2goWCkKKyMgZGVmaW5lIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluIHRocm93CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZXhjZXB0aW9uX3B0ci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2V4Y2VwdGlvbl9wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmY4Zjg1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2V4Y2VwdGlvbl9wdHIuaApAQCAtMCwwICsxLDE5OCBAQAorLy8gRXhjZXB0aW9uIEhhbmRsaW5nIHN1cHBvcnQgaGVhZGVyIChleGNlcHRpb25fcHRyIGNsYXNzKSBmb3IgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorLy8KKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisvLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyAKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2V4Y2VwdGlvbl9wdHIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4Y2VwdGlvbn0KKyAqLworCisjaWZuZGVmIF9FWENFUFRJT05fUFRSX0gKKyNkZWZpbmUgX0VYQ0VQVElPTl9QVFJfSAorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9leGNlcHRpb25fZGVmaW5lcy5oPgorCisjaWYgQVRPTUlDX0lOVF9MT0NLX0ZSRUUgPCAyCisjICBlcnJvciBUaGlzIHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgZXhjZXB0aW9uIHByb3BhZ2F0aW9uLgorI2VuZGlmCisKK2V4dGVybiAiQysrIiB7CisKK25hbWVzcGFjZSBzdGQgCit7CisgIGNsYXNzIHR5cGVfaW5mbzsKKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgZXhjZXB0aW9ucworICAgKiBAeworICAgKi8KKyAgbmFtZXNwYWNlIF9fZXhjZXB0aW9uX3B0cgorICB7CisgICAgY2xhc3MgZXhjZXB0aW9uX3B0cjsKKyAgfQorCisgIHVzaW5nIF9fZXhjZXB0aW9uX3B0cjo6ZXhjZXB0aW9uX3B0cjsKKworICAvKiogT2J0YWluIGFuIGV4Y2VwdGlvbl9wdHIgdG8gdGhlIGN1cnJlbnRseSBoYW5kbGVkIGV4Y2VwdGlvbi4gSWYgdGhlcmUKKyAgICogIGlzIG5vbmUsIG9yIHRoZSBjdXJyZW50bHkgaGFuZGxlZCBleGNlcHRpb24gaXMgZm9yZWlnbiwgcmV0dXJuIHRoZSBudWxsCisgICAqICB2YWx1ZS4KKyAgICovCisgIGV4Y2VwdGlvbl9wdHIgY3VycmVudF9leGNlcHRpb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyAgLy8vIFRocm93IHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSB0aGUgZXhjZXB0aW9uX3B0ci4KKyAgdm9pZCByZXRocm93X2V4Y2VwdGlvbihleGNlcHRpb25fcHRyKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisKKyAgbmFtZXNwYWNlIF9fZXhjZXB0aW9uX3B0cgorICB7CisgICAgLyoqCisgICAgICogIEBicmllZiBBbiBvcGFxdWUgcG9pbnRlciB0byBhbiBhcmJpdHJhcnkgZXhjZXB0aW9uLgorICAgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAgICovCisgICAgY2xhc3MgZXhjZXB0aW9uX3B0cgorICAgIHsKKyAgICAgIHZvaWQqIF9NX2V4Y2VwdGlvbl9vYmplY3Q7CisKKyAgICAgIGV4cGxpY2l0IGV4Y2VwdGlvbl9wdHIodm9pZCogX19lKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyAgICAgIHZvaWQgX01fYWRkcmVmKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworICAgICAgdm9pZCBfTV9yZWxlYXNlKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisgICAgICB2b2lkICpfTV9nZXQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKTsKKworICAgICAgZnJpZW5kIGV4Y2VwdGlvbl9wdHIgc3RkOjpjdXJyZW50X2V4Y2VwdGlvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyAgICAgIGZyaWVuZCB2b2lkIHN0ZDo6cmV0aHJvd19leGNlcHRpb24oZXhjZXB0aW9uX3B0cik7CisKKyAgICBwdWJsaWM6CisgICAgICBleGNlcHRpb25fcHRyKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisgICAgICBleGNlcHRpb25fcHRyKGNvbnN0IGV4Y2VwdGlvbl9wdHImKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBleGNlcHRpb25fcHRyKG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICAgIDogX01fZXhjZXB0aW9uX29iamVjdCgwKQorICAgICAgeyB9CisKKyAgICAgIGV4Y2VwdGlvbl9wdHIoZXhjZXB0aW9uX3B0ciYmIF9fbykgbm9leGNlcHQKKyAgICAgIDogX01fZXhjZXB0aW9uX29iamVjdChfX28uX01fZXhjZXB0aW9uX29iamVjdCkKKyAgICAgIHsgX19vLl9NX2V4Y2VwdGlvbl9vYmplY3QgPSAwOyB9CisjZW5kaWYKKworI2lmIChfX2NwbHVzcGx1cyA8IDIwMTEwM0wpIHx8IGRlZmluZWQgKF9HTElCQ1hYX0VIX1BUUl9DT01QQVQpCisgICAgICB0eXBlZGVmIHZvaWQgKGV4Y2VwdGlvbl9wdHI6OipfX3NhZmVfYm9vbCkoKTsKKworICAgICAgLy8gRm9yIGNvbnN0cnVjdGlvbiBmcm9tIG51bGxwdHIgb3IgMC4KKyAgICAgIGV4Y2VwdGlvbl9wdHIoX19zYWZlX2Jvb2wpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyNlbmRpZgorCisgICAgICBleGNlcHRpb25fcHRyJiAKKyAgICAgIG9wZXJhdG9yPShjb25zdCBleGNlcHRpb25fcHRyJikgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgZXhjZXB0aW9uX3B0ciYgCisgICAgICBvcGVyYXRvcj0oZXhjZXB0aW9uX3B0ciYmIF9fbykgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX3B0cihzdGF0aWNfY2FzdDxleGNlcHRpb25fcHRyJiY+KF9fbykpLnN3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgfmV4Y2VwdGlvbl9wdHIoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyAgICAgIHZvaWQgCisgICAgICBzd2FwKGV4Y2VwdGlvbl9wdHImKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyNpZmRlZiBfR0xJQkNYWF9FSF9QVFJfQ09NUEFUCisgICAgICAvLyBSZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIENYWEFCSV8xLjMuCisgICAgICB2b2lkIF9NX3NhZmVfYm9vbF9kdW1teSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorCV9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKyAgICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisJX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisgICAgICBvcGVyYXRvciBfX3NhZmVfYm9vbCgpIGNvbnN0IF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leGNlcHRpb25fb2JqZWN0OyB9CisjZW5kaWYKKworICAgICAgZnJpZW5kIGJvb2wgCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGV4Y2VwdGlvbl9wdHImLCBjb25zdCBleGNlcHRpb25fcHRyJikKKwlfR0xJQkNYWF9VU0VfTk9FWENFUFQgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisKKyAgICAgIGNvbnN0IGNsYXNzIHN0ZDo6dHlwZV9pbmZvKgorICAgICAgX19jeGFfZXhjZXB0aW9uX3R5cGUoKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKwlfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKTsKKyAgICB9OworCisgICAgYm9vbCAKKyAgICBvcGVyYXRvcj09KGNvbnN0IGV4Y2VwdGlvbl9wdHImLCBjb25zdCBleGNlcHRpb25fcHRyJikKKyAgICAgIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKTsKKworICAgIGJvb2wgCisgICAgb3BlcmF0b3IhPShjb25zdCBleGNlcHRpb25fcHRyJiwgY29uc3QgZXhjZXB0aW9uX3B0ciYpCisgICAgICBfR0xJQkNYWF9VU0VfTk9FWENFUFQgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoZXhjZXB0aW9uX3B0ciYgX19saHMsIGV4Y2VwdGlvbl9wdHImIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworICB9IC8vIG5hbWVzcGFjZSBfX2V4Y2VwdGlvbl9wdHIKKworCisgIC8vLyBPYnRhaW4gYW4gZXhjZXB0aW9uX3B0ciBwb2ludGluZyB0byBhIGNvcHkgb2YgdGhlIHN1cHBsaWVkIG9iamVjdC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4PgorICAgIGV4Y2VwdGlvbl9wdHIgCisgICAgY29weV9leGNlcHRpb24oX0V4IF9fZXgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgIHsKKyAgICAgIF9fdHJ5CisJeworI2lmZGVmIF9fRVhDRVBUSU9OUworCSAgdGhyb3cgX19leDsKKyNlbmRpZgorCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHJldHVybiBjdXJyZW50X2V4Y2VwdGlvbigpOworCX0KKyAgICB9CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyAxMTMwLiBjb3B5X2V4Y2VwdGlvbiBuYW1lIG1pc2xlYWRpbmcKKyAgLy8vIE9idGFpbiBhbiBleGNlcHRpb25fcHRyIHBvaW50aW5nIHRvIGEgY29weSBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXg+CisgICAgZXhjZXB0aW9uX3B0ciAKKyAgICBtYWtlX2V4Y2VwdGlvbl9wdHIoX0V4IF9fZXgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIHN0ZDo6Y29weV9leGNlcHRpb248X0V4PihfX2V4KTsgfQorCisgIC8vIEB9IGdyb3VwIGV4Y2VwdGlvbnMKK30gLy8gbmFtZXNwYWNlIHN0ZAorCit9IC8vIGV4dGVybiAiQysrIgorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9mb3J3YXJkX2xpc3QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9mb3J3YXJkX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDhkNjc4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2ZvcndhcmRfbGlzdC5oCkBAIC0wLDAgKzEsMTQwMiBAQAorLy8gPGZvcndhcmRfbGlzdC5oPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9mb3J3YXJkX2xpc3QuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2ZvcndhcmRfbGlzdH0KKyAqLworCisjaWZuZGVmIF9GT1JXQVJEX0xJU1RfSAorI2RlZmluZSBfRk9SV0FSRF9MSVNUX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLyoqCisgICAqICBAYnJpZWYgIEEgaGVscGVyIGJhc2ljIG5vZGUgY2xhc3MgZm9yICVmb3J3YXJkX2xpc3QuCisgICAqICAgICAgICAgIFRoaXMgaXMganVzdCBhIGxpbmtlZCBsaXN0IHdpdGggbm90aGluZyBpbnNpZGUgaXQuCisgICAqICAgICAgICAgIFRoZXJlIGFyZSBwdXJlbHkgbGlzdCBzaHVmZmxpbmcgdXRpbGl0eSBtZXRob2RzIGhlcmUuCisgICAqLworICBzdHJ1Y3QgX0Z3ZF9saXN0X25vZGVfYmFzZQorICB7CisgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSgpID0gZGVmYXVsdDsKKworICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9NX25leHQgPSBudWxscHRyOworCisgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSoKKyAgICBfTV90cmFuc2Zlcl9hZnRlcihfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX2JlZ2luLAorCQkgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX2VuZCkKKyAgICB7CisgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX2tlZXAgPSBfX2JlZ2luLT5fTV9uZXh0OworICAgICAgaWYgKF9fZW5kKQorCXsKKwkgIF9fYmVnaW4tPl9NX25leHQgPSBfX2VuZC0+X01fbmV4dDsKKwkgIF9fZW5kLT5fTV9uZXh0ID0gX01fbmV4dDsKKwl9CisgICAgICBlbHNlCisJX19iZWdpbi0+X01fbmV4dCA9IDA7CisgICAgICBfTV9uZXh0ID0gX19rZWVwOworICAgICAgcmV0dXJuIF9fZW5kOworICAgIH0KKworICAgIHZvaWQKKyAgICBfTV9yZXZlcnNlX2FmdGVyKCkgbm9leGNlcHQKKyAgICB7CisgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX3RhaWwgPSBfTV9uZXh0OworICAgICAgaWYgKCFfX3RhaWwpCisJcmV0dXJuOworICAgICAgd2hpbGUgKF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fdGVtcCA9IF9fdGFpbC0+X01fbmV4dCkKKwl7CisJICBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX2tlZXAgPSBfTV9uZXh0OworCSAgX01fbmV4dCA9IF9fdGVtcDsKKwkgIF9fdGFpbC0+X01fbmV4dCA9IF9fdGVtcC0+X01fbmV4dDsKKwkgIF9NX25leHQtPl9NX25leHQgPSBfX2tlZXA7CisJfQorICAgIH0KKyAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgQSBoZWxwZXIgbm9kZSBjbGFzcyBmb3IgJWZvcndhcmRfbGlzdC4KKyAgICogICAgICAgICAgVGhpcyBpcyBqdXN0IGEgbGlua2VkIGxpc3Qgd2l0aCB1bmluaXRpYWxpemVkIHN0b3JhZ2UgZm9yIGEKKyAgICogICAgICAgICAgZGF0YSB2YWx1ZSBpbiBlYWNoIG5vZGUuCisgICAqICAgICAgICAgIFRoZXJlIGlzIGEgc29ydGluZyB1dGlsaXR5IG1ldGhvZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0Z3ZF9saXN0X25vZGUKKyAgICA6IHB1YmxpYyBfRndkX2xpc3Rfbm9kZV9iYXNlCisgICAgeworICAgICAgX0Z3ZF9saXN0X25vZGUoKSA9IGRlZmF1bHQ7CisKKyAgICAgIHR5cGVuYW1lIGFsaWduZWRfc3RvcmFnZTxzaXplb2YoX1RwKSwgYWxpZ25tZW50X29mPF9UcD46OnZhbHVlPjo6dHlwZQorCV9NX3N0b3JhZ2U7CisKKyAgICAgIF9UcCoKKyAgICAgIF9NX3ZhbHB0cigpIG5vZXhjZXB0CisgICAgICB7CisJcmV0dXJuIHN0YXRpY19jYXN0PF9UcCo+KHN0YXRpY19jYXN0PHZvaWQqPigmX01fc3RvcmFnZSkpOworICAgICAgfQorCisgICAgICBjb25zdCBfVHAqCisgICAgICBfTV92YWxwdHIoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBfVHAqPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4oJl9NX3N0b3JhZ2UpKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKgorICAgKiAgIEBicmllZiBBIGZvcndhcmRfbGlzdDo6aXRlcmF0b3IuCisgICAqIAorICAgKiAgIEFsbCB0aGUgZnVuY3Rpb25zIGFyZSBvcCBvdmVybG9hZHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9Gd2RfbGlzdF9pdGVyYXRvcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z3ZF9saXN0X2l0ZXJhdG9yPF9UcD4gICAgICAgICAgICBfU2VsZjsKKyAgICAgIHR5cGVkZWYgX0Z3ZF9saXN0X25vZGU8X1RwPiAgICAgICAgICAgICAgICBfTm9kZTsKKworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1RwJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICBfRndkX2xpc3RfaXRlcmF0b3IoKQorICAgICAgOiBfTV9ub2RlKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfRndkX2xpc3RfaXRlcmF0b3IoX0Z3ZF9saXN0X25vZGVfYmFzZSogX19uKSAKKyAgICAgIDogX01fbm9kZShfX24pIHsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X05vZGUqPih0aGlzLT5fTV9ub2RlKS0+X01fdmFscHRyKCk7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfTm9kZSo+KHRoaXMtPl9NX25vZGUpLT5fTV92YWxwdHIoKTsgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworICAgICAgICBfTV9ub2RlID0gX01fbm9kZS0+X01fbmV4dDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisgICAgICAgIF9TZWxmIF9fdG1wKCp0aGlzKTsKKyAgICAgICAgX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7CisgICAgICAgIHJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfU2VsZiYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZSA9PSBfX3guX01fbm9kZTsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ub2RlICE9IF9feC5fTV9ub2RlOyB9CisKKyAgICAgIF9TZWxmCisgICAgICBfTV9uZXh0KCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgaWYgKF9NX25vZGUpCisgICAgICAgICAgcmV0dXJuIF9Gd2RfbGlzdF9pdGVyYXRvcihfTV9ub2RlLT5fTV9uZXh0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBfRndkX2xpc3RfaXRlcmF0b3IoMCk7CisgICAgICB9CisKKyAgICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9NX25vZGU7CisgICAgfTsKKworICAvKioKKyAgICogICBAYnJpZWYgQSBmb3J3YXJkX2xpc3Q6OmNvbnN0X2l0ZXJhdG9yLgorICAgKiAKKyAgICogICBBbGwgdGhlIGZ1bmN0aW9ucyBhcmUgb3Agb3ZlcmxvYWRzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfRndkX2xpc3RfY29uc3RfaXRlcmF0b3IKKyAgICB7CisgICAgICB0eXBlZGVmIF9Gd2RfbGlzdF9jb25zdF9pdGVyYXRvcjxfVHA+ICAgICAgX1NlbGY7CisgICAgICB0eXBlZGVmIGNvbnN0IF9Gd2RfbGlzdF9ub2RlPF9UcD4gICAgICAgICAgX05vZGU7CisgICAgICB0eXBlZGVmIF9Gd2RfbGlzdF9pdGVyYXRvcjxfVHA+ICAgICAgICAgICAgaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgX0Z3ZF9saXN0X2NvbnN0X2l0ZXJhdG9yKCkKKyAgICAgIDogX01fbm9kZSgpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgX0Z3ZF9saXN0X2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fbikgCisgICAgICA6IF9NX25vZGUoX19uKSB7IH0KKworICAgICAgX0Z3ZF9saXN0X2NvbnN0X2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX2l0ZXIpCisgICAgICA6IF9NX25vZGUoX19pdGVyLl9NX25vZGUpIHsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X05vZGUqPih0aGlzLT5fTV9ub2RlKS0+X01fdmFscHRyKCk7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfTm9kZSo+KHRoaXMtPl9NX25vZGUpLT5fTV92YWxwdHIoKTsgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworICAgICAgICBfTV9ub2RlID0gX01fbm9kZS0+X01fbmV4dDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisgICAgICAgIF9TZWxmIF9fdG1wKCp0aGlzKTsKKyAgICAgICAgX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7CisgICAgICAgIHJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfU2VsZiYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZSA9PSBfX3guX01fbm9kZTsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ub2RlICE9IF9feC5fTV9ub2RlOyB9CisKKyAgICAgIF9TZWxmCisgICAgICBfTV9uZXh0KCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPl9NX25vZGUpCisgICAgICAgICAgcmV0dXJuIF9Gd2RfbGlzdF9jb25zdF9pdGVyYXRvcihfTV9ub2RlLT5fTV9uZXh0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBfRndkX2xpc3RfY29uc3RfaXRlcmF0b3IoMCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9NX25vZGU7CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgRm9yd2FyZCBsaXN0IGl0ZXJhdG9yIGVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Gd2RfbGlzdF9pdGVyYXRvcjxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBfRndkX2xpc3RfY29uc3RfaXRlcmF0b3I8X1RwPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9ub2RlID09IF9feS5fTV9ub2RlOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZvcndhcmQgbGlzdCBpdGVyYXRvciBpbmVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9Gd2RfbGlzdF9pdGVyYXRvcjxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBfRndkX2xpc3RfY29uc3RfaXRlcmF0b3I8X1RwPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9ub2RlICE9IF9feS5fTV9ub2RlOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEJhc2UgY2xhc3MgZm9yICVmb3J3YXJkX2xpc3QuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX0Z3ZF9saXN0X2Jhc2UKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fYWxsb2NfdHJhaXRzPF9BbGxvYz4gX0FsbG9jX3RyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czo6dGVtcGxhdGUgcmViaW5kPF9UcD46Om90aGVyCisgICAgICAgIF9UcF9hbGxvY190eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM6OnRlbXBsYXRlCisgICAgICAgIHJlYmluZDxfRndkX2xpc3Rfbm9kZTxfVHA+Pjo6b3RoZXIgX05vZGVfYWxsb2NfdHlwZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fYWxsb2NfdHJhaXRzPF9Ob2RlX2FsbG9jX3R5cGU+IF9Ob2RlX2FsbG9jX3RyYWl0czsKKworICAgICAgc3RydWN0IF9Gd2RfbGlzdF9pbXBsIAorICAgICAgOiBwdWJsaWMgX05vZGVfYWxsb2NfdHlwZQorICAgICAgeworICAgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlIF9NX2hlYWQ7CisKKyAgICAgICAgX0Z3ZF9saXN0X2ltcGwoKQorICAgICAgICA6IF9Ob2RlX2FsbG9jX3R5cGUoKSwgX01faGVhZCgpCisgICAgICAgIHsgfQorCisgICAgICAgIF9Gd2RfbGlzdF9pbXBsKGNvbnN0IF9Ob2RlX2FsbG9jX3R5cGUmIF9fYSkKKyAgICAgICAgOiBfTm9kZV9hbGxvY190eXBlKF9fYSksIF9NX2hlYWQoKQorICAgICAgICB7IH0KKworICAgICAgICBfRndkX2xpc3RfaW1wbChfTm9kZV9hbGxvY190eXBlJiYgX19hKQorCTogX05vZGVfYWxsb2NfdHlwZShzdGQ6Om1vdmUoX19hKSksIF9NX2hlYWQoKQorICAgICAgICB7IH0KKyAgICAgIH07CisKKyAgICAgIF9Gd2RfbGlzdF9pbXBsIF9NX2ltcGw7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9Gd2RfbGlzdF9pdGVyYXRvcjxfVHA+ICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0Z3ZF9saXN0X2NvbnN0X2l0ZXJhdG9yPF9UcD4gICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfRndkX2xpc3Rfbm9kZTxfVHA+ICAgICAgICAgICAgICAgICAgICAgX05vZGU7CisKKyAgICAgIF9Ob2RlX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9Ob2RlX2FsbG9jX3R5cGUqPigmdGhpcy0+X01faW1wbCk7IH0KKworICAgICAgY29uc3QgX05vZGVfYWxsb2NfdHlwZSYKKyAgICAgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX05vZGVfYWxsb2NfdHlwZSo+KCZ0aGlzLT5fTV9pbXBsKTsgfQorCisgICAgICBfRndkX2xpc3RfYmFzZSgpCisgICAgICA6IF9NX2ltcGwoKSB7IH0KKworICAgICAgX0Z3ZF9saXN0X2Jhc2UoY29uc3QgX05vZGVfYWxsb2NfdHlwZSYgX19hKQorICAgICAgOiBfTV9pbXBsKF9fYSkgeyB9CisKKyAgICAgIF9Gd2RfbGlzdF9iYXNlKF9Gd2RfbGlzdF9iYXNlJiYgX19sc3QsIGNvbnN0IF9Ob2RlX2FsbG9jX3R5cGUmIF9fYSk7CisKKyAgICAgIF9Gd2RfbGlzdF9iYXNlKF9Gd2RfbGlzdF9iYXNlJiYgX19sc3QpCisgICAgICA6IF9NX2ltcGwoc3RkOjptb3ZlKF9fbHN0Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKSkKKyAgICAgIHsKKwl0aGlzLT5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCA9IF9fbHN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0OworCV9fbHN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0ID0gMDsKKyAgICAgIH0KKworICAgICAgfl9Gd2RfbGlzdF9iYXNlKCkKKyAgICAgIHsgX01fZXJhc2VfYWZ0ZXIoJl9NX2ltcGwuX01faGVhZCwgMCk7IH0KKworICAgIHByb3RlY3RlZDoKKworICAgICAgX05vZGUqCisgICAgICBfTV9nZXRfbm9kZSgpCisgICAgICB7IHJldHVybiBfTm9kZV9hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLCAxKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgX05vZGUqCisgICAgICAgIF9NX2NyZWF0ZV9ub2RlKF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7CisgICAgICAgICAgX05vZGUqIF9fbm9kZSA9IHRoaXMtPl9NX2dldF9ub2RlKCk7CisgICAgICAgICAgX190cnkKKyAgICAgICAgICAgIHsKKwkgICAgICBfVHBfYWxsb2NfdHlwZSBfX2EoX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpOworCSAgICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfVHBfYWxsb2NfdHlwZT4gX0FsbG9jX3RyYWl0czsKKwkgICAgICA6Om5ldyAoKHZvaWQqKV9fbm9kZSkgX05vZGUoKTsKKwkgICAgICBfQWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19hLCBfX25vZGUtPl9NX3ZhbHB0cigpLAorCQkJCSAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgICAgICAgfQorICAgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB0aGlzLT5fTV9wdXRfbm9kZShfX25vZGUpOworICAgICAgICAgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gX19ub2RlOworICAgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKgorICAgICAgICBfTV9pbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKTsKKworICAgICAgdm9pZAorICAgICAgX01fcHV0X25vZGUoX05vZGUqIF9fcCkKKyAgICAgIHsgX05vZGVfYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLCBfX3AsIDEpOyB9CisKKyAgICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqCisgICAgICBfTV9lcmFzZV9hZnRlcihfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX3Bvcyk7CisKKyAgICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqCisgICAgICBfTV9lcmFzZV9hZnRlcihfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX3BvcywgCisgICAgICAgICAgICAgICAgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX2xhc3QpOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgd2l0aCBsaW5lYXIgdGltZSBhY2Nlc3MgdG8gZWxlbWVudHMsCisgICAqICBhbmQgZml4ZWQgdGltZSBpbnNlcnRpb24vZGVsZXRpb24gYXQgYW55IHBvaW50IGluIHRoZSBzZXF1ZW5jZS4KKyAgICoKKyAgICogIEBpbmdyb3VwIHNlcXVlbmNlcworICAgKgorICAgKiAgQHRwYXJhbSBfVHAgIFR5cGUgb2YgZWxlbWVudC4KKyAgICogIEB0cGFyYW0gX0FsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gYWxsb2NhdG9yPF9UcD4uCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY3Ij5zZXF1ZW5jZTwvYT4sIGluY2x1ZGluZyB0aGUKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY4Ij5vcHRpb25hbCBzZXF1ZW5jZSByZXF1aXJlbWVudHM8L2E+IHdpdGggdGhlCisgICAqICAlZXhjZXB0aW9uIG9mIEBjIGF0IGFuZCBAYyBvcGVyYXRvcltdLgorICAgKgorICAgKiAgVGhpcyBpcyBhIEBlIHNpbmdseSBAZSBsaW5rZWQgJWxpc3QuICBUcmF2ZXJzYWwgdXAgdGhlCisgICAqICAlbGlzdCByZXF1aXJlcyBsaW5lYXIgdGltZSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgZWxlbWVudHMgKG9yCisgICAqICBAZSBub2RlcykgaXMgZG9uZSBpbiBjb25zdGFudCB0aW1lLCByZWdhcmRsZXNzIG9mIHdoZXJlIHRoZQorICAgKiAgY2hhbmdlIHRha2VzIHBsYWNlLiAgVW5saWtlIHN0ZDo6dmVjdG9yIGFuZCBzdGQ6OmRlcXVlLAorICAgKiAgcmFuZG9tLWFjY2VzcyBpdGVyYXRvcnMgYXJlIG5vdCBwcm92aWRlZCwgc28gc3Vic2NyaXB0aW5nICggQGMKKyAgICogIFtdICkgYWNjZXNzIGlzIG5vdCBhbGxvd2VkLiAgRm9yIGFsZ29yaXRobXMgd2hpY2ggb25seSBuZWVkCisgICAqICBzZXF1ZW50aWFsIGFjY2VzcywgdGhpcyBsYWNrIG1ha2VzIG5vIGRpZmZlcmVuY2UuCisgICAqCisgICAqICBBbHNvIHVubGlrZSB0aGUgb3RoZXIgc3RhbmRhcmQgY29udGFpbmVycywgc3RkOjpmb3J3YXJkX2xpc3QgcHJvdmlkZXMKKyAgICogIHNwZWNpYWxpemVkIGFsZ29yaXRobXMgJXVuaXF1ZSB0byBsaW5rZWQgbGlzdHMsIHN1Y2ggYXMKKyAgICogIHNwbGljaW5nLCBzb3J0aW5nLCBhbmQgaW4tcGxhY2UgcmV2ZXJzYWwuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYyA9IGFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBmb3J3YXJkX2xpc3QgOiBwcml2YXRlIF9Gd2RfbGlzdF9iYXNlPF9UcCwgX0FsbG9jPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfRndkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz4gICAgICAgICAgICAgICAgICBfQmFzZTsKKyAgICAgIHR5cGVkZWYgX0Z3ZF9saXN0X25vZGU8X1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgX05vZGU7CisgICAgICB0eXBlZGVmIF9Gd2RfbGlzdF9ub2RlX2Jhc2UgICAgICAgICAgICAgICAgICAgICAgICAgIF9Ob2RlX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpfVHBfYWxsb2NfdHlwZSAgICAgICAgICAgICAgIF9UcF9hbGxvY190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6X05vZGVfYWxsb2NfdHlwZSAgICAgICAgICAgICBfTm9kZV9hbGxvY190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6X05vZGVfYWxsb2NfdHJhaXRzICAgICAgICAgICBfTm9kZV9hbGxvY190cmFpdHM7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X19hbGxvY190cmFpdHM8X1RwX2FsbG9jX3R5cGU+ICAgIF9BbGxvY190cmFpdHM7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlczoKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czo6cG9pbnRlciAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czo6Y29uc3RfcG9pbnRlciAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czo6cmVmZXJlbmNlICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzOjpjb25zdF9yZWZlcmVuY2UgICAgICBjb25zdF9yZWZlcmVuY2U7CisgCisgICAgICB0eXBlZGVmIF9Gd2RfbGlzdF9pdGVyYXRvcjxfVHA+ICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfRndkX2xpc3RfY29uc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworCisgICAgICAvLyAyMy4zLjQuMiBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZXMgYSAlZm9yd2FyZF9saXN0IHdpdGggbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2FsICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZm9yd2FyZF9saXN0KGNvbnN0IF9BbGxvYyYgX19hbCA9IF9BbGxvYygpKQorICAgICAgOiBfQmFzZShfTm9kZV9hbGxvY190eXBlKF9fYWwpKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29weSBjb25zdHJ1Y3RvciB3aXRoIGFsbG9jYXRvciBhcmd1bWVudC4KKyAgICAgICAqICBAcGFyYW0gIF9fbGlzdCAgSW5wdXQgbGlzdCB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgX19hbCAgICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICovCisgICAgICBmb3J3YXJkX2xpc3QoY29uc3QgZm9yd2FyZF9saXN0JiBfX2xpc3QsIGNvbnN0IF9BbGxvYyYgX19hbCkKKyAgICAgIDogX0Jhc2UoX05vZGVfYWxsb2NfdHlwZShfX2FsKSkKKyAgICAgIHsgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2xpc3QuYmVnaW4oKSwgX19saXN0LmVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmUgY29uc3RydWN0b3Igd2l0aCBhbGxvY2F0b3IgYXJndW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBfX2xpc3QgIElucHV0IGxpc3QgdG8gbW92ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fYWwgICAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZm9yd2FyZF9saXN0KGZvcndhcmRfbGlzdCYmIF9fbGlzdCwgY29uc3QgX0FsbG9jJiBfX2FsKQorICAgICAgbm9leGNlcHQoX05vZGVfYWxsb2NfdHJhaXRzOjpfU19hbHdheXNfZXF1YWwoKSkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9fbGlzdCksIF9Ob2RlX2FsbG9jX3R5cGUoX19hbCkpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJWZvcndhcmRfbGlzdCB3aXRoIGRlZmF1bHQgY29uc3RydWN0ZWQgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIHRoZSAlZm9yd2FyZF9saXN0IHdpdGggQGEgX19uIGRlZmF1bHQKKyAgICAgICAqICBjb25zdHJ1Y3RlZCBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGZvcndhcmRfbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX05vZGVfYWxsb2NfdHlwZShfX2FsKSkKKyAgICAgIHsgX01fZGVmYXVsdF9pbml0aWFsaXplKF9fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJWZvcndhcmRfbGlzdCB3aXRoIGNvcGllcyBvZiBhbiBleGVtcGxhciBlbGVtZW50LgorICAgICAgICogIEBwYXJhbSAgX19uICAgICAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBpbml0aWFsbHkgY3JlYXRlLgorICAgICAgICogIEBwYXJhbSAgX192YWx1ZSAgQW4gZWxlbWVudCB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgX19hbCAgICAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBmaWxscyB0aGUgJWZvcndhcmRfbGlzdCB3aXRoIEBhIF9fbiBjb3BpZXMgb2YKKyAgICAgICAqICBAYSBfX3ZhbHVlLgorICAgICAgICovCisgICAgICBmb3J3YXJkX2xpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BbGxvYyYgX19hbCA9IF9BbGxvYygpKQorICAgICAgOiBfQmFzZShfTm9kZV9hbGxvY190eXBlKF9fYWwpKQorICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoX19uLCBfX3ZhbHVlKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVmb3J3YXJkX2xpc3QgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYWwgICAgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVmb3J3YXJkX2xpc3QgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAgICAqICBbQGEgX19maXJzdCxAYSBfX2xhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiAod2hlcmUgTiBpcworICAgICAgICogIGRpc3RhbmNlKEBhIF9fZmlyc3QsQGEgX19sYXN0KSkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorICAgICAgICBmb3J3YXJkX2xpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisJOiBfQmFzZShfTm9kZV9hbGxvY190eXBlKF9fYWwpKQorICAgICAgICB7IF9NX3JhbmdlX2luaXRpYWxpemUoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSAlZm9yd2FyZF9saXN0IGNvcHkgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xpc3QgIEEgJWZvcndhcmRfbGlzdCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgICAgIHR5cGVzLgorICAgICAgICovCisgICAgICBmb3J3YXJkX2xpc3QoY29uc3QgZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICA6IF9CYXNlKF9Ob2RlX2FsbG9jX3RyYWl0czo6X1Nfc2VsZWN0X29uX2NvcHkoCisgICAgICAgICAgICAgICAgX19saXN0Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKSkKKyAgICAgIHsgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2xpc3QuYmVnaW4oKSwgX19saXN0LmVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSAlZm9yd2FyZF9saXN0IG1vdmUgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xpc3QgIEEgJWZvcndhcmRfbGlzdCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgICAgIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlZm9yd2FyZF9saXN0IGNvbnRhaW5zIHRoZSBleGFjdCBjb250ZW50cyBvZiBAYQorICAgICAgICogIF9fbGlzdC4gVGhlIGNvbnRlbnRzIG9mIEBhIF9fbGlzdCBhcmUgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkCisgICAgICAgKiAgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqLworICAgICAgZm9yd2FyZF9saXN0KGZvcndhcmRfbGlzdCYmIF9fbGlzdCkgbm9leGNlcHQKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9fbGlzdCkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVmb3J3YXJkX2xpc3QgZnJvbSBhbiBpbml0aWFsaXplcl9saXN0CisgICAgICAgKiAgQHBhcmFtICBfX2lsICBBbiBpbml0aWFsaXplcl9saXN0IG9mIHZhbHVlX3R5cGUuCisgICAgICAgKiAgQHBhcmFtICBfX2FsICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlZm9yd2FyZF9saXN0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cworICAgICAgICogIGluIHRoZSBpbml0aWFsaXplcl9saXN0IEBhIF9faWwuICBUaGlzIGlzIGxpbmVhciBpbiBfX2lsLnNpemUoKS4KKyAgICAgICAqLworICAgICAgZm9yd2FyZF9saXN0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWwsCisgICAgICAgICAgICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisgICAgICA6IF9CYXNlKF9Ob2RlX2FsbG9jX3R5cGUoX19hbCkpCisgICAgICB7IF9NX3JhbmdlX2luaXRpYWxpemUoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBmb3J3YXJkX2xpc3QgZHRvci4KKyAgICAgICAqLworICAgICAgfmZvcndhcmRfbGlzdCgpIG5vZXhjZXB0CisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgJWZvcndhcmRfbGlzdCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19saXN0ICBBICVmb3J3YXJkX2xpc3Qgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvcgorICAgICAgICogICAgICAgICAgICAgICAgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgZWxlbWVudHMgb2YgQGEgX19saXN0IGFyZSBjb3BpZWQsIGJ1dCB1bmxpa2UgdGhlIGNvcHkKKyAgICAgICAqICBjb25zdHJ1Y3RvciwgdGhlIGFsbG9jYXRvciBvYmplY3QgaXMgbm90IGNvcGllZC4KKyAgICAgICAqLworICAgICAgZm9yd2FyZF9saXN0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGZvcndhcmRfbGlzdCYgX19saXN0KTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgJWZvcndhcmRfbGlzdCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xpc3QgIEEgJWZvcndhcmRfbGlzdCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgICB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIF9fbGlzdCBhcmUgbW92ZWQgaW50byB0aGlzICVmb3J3YXJkX2xpc3QKKyAgICAgICAqICAod2l0aG91dCBjb3B5aW5nLCBpZiB0aGUgYWxsb2NhdG9ycyBwZXJtaXQgaXQpLgorICAgICAgICogIEBhIF9fbGlzdCBpcyBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgJWZvcndhcmRfbGlzdAorICAgICAgICovCisgICAgICBmb3J3YXJkX2xpc3QmCisgICAgICBvcGVyYXRvcj0oZm9yd2FyZF9saXN0JiYgX19saXN0KQorICAgICAgbm9leGNlcHQoX05vZGVfYWxsb2NfdHJhaXRzOjpfU19ub3Rocm93X21vdmUoKSkKKyAgICAgIHsKKyAgICAgICAgY29uc3RleHByIGJvb2wgX19tb3ZlX3N0b3JhZ2UgPQorICAgICAgICAgIF9Ob2RlX2FsbG9jX3RyYWl0czo6X1NfcHJvcGFnYXRlX29uX21vdmVfYXNzaWduKCkKKyAgICAgICAgICB8fCBfTm9kZV9hbGxvY190cmFpdHM6Ol9TX2Fsd2F5c19lcXVhbCgpOworICAgICAgICBfTV9tb3ZlX2Fzc2lnbihzdGQ6Om1vdmUoX19saXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19tb3ZlX3N0b3JhZ2U+KCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgJWZvcndhcmRfbGlzdCBpbml0aWFsaXplciBsaXN0IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2lsICBBbiBpbml0aWFsaXplcl9saXN0IG9mIHZhbHVlX3R5cGUuCisgICAgICAgKgorICAgICAgICogIFJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoZSAlZm9yd2FyZF9saXN0IHdpdGggY29waWVzIG9mIHRoZQorICAgICAgICogIGVsZW1lbnRzIGluIHRoZSBpbml0aWFsaXplcl9saXN0IEBhIF9faWwuICBUaGlzIGlzIGxpbmVhciBpbgorICAgICAgICogIF9faWwuc2l6ZSgpLgorICAgICAgICovCisgICAgICBmb3J3YXJkX2xpc3QmCisgICAgICBvcGVyYXRvcj0oc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX19pbCkKKyAgICAgIHsKKyAgICAgICAgYXNzaWduKF9faWwpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhIHJhbmdlIHRvIGEgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlZm9yd2FyZF9saXN0IHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cworICAgICAgICogIGluIHRoZSByYW5nZSBbQGEgX19maXJzdCxAYSBfX2xhc3QpLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAlZm9yd2FyZF9saXN0IGFuZAorICAgICAgICogIHRoYXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgcmVzdWx0aW5nICVmb3J3YXJkX2xpc3QgaXMgdGhlCisgICAgICAgKiAgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFzc2lnbmVkLiAgT2xkIGRhdGEgaXMgbG9zdC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisJdm9pZAorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICB0eXBlZGVmIGlzX2Fzc2lnbmFibGU8X1RwLCBkZWNsdHlwZSgqX19maXJzdCk+IF9fYXNzaWduYWJsZTsKKwkgIF9NX2Fzc2lnbihfX2ZpcnN0LCBfX2xhc3QsIF9fYXNzaWduYWJsZSgpKTsKKwl9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhIGdpdmVuIHZhbHVlIHRvIGEgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGFzc2lnbmVkLgorICAgICAgICogIEBwYXJhbSAgX192YWwgIFZhbHVlIHRvIGJlIGFzc2lnbmVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJWZvcndhcmRfbGlzdCB3aXRoIEBhIF9fbiBjb3BpZXMgb2YgdGhlCisgICAgICAgKiAgZ2l2ZW4gdmFsdWUuICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZQorICAgICAgICogICVmb3J3YXJkX2xpc3QsIGFuZCB0aGF0IHRoZSByZXN1bHRpbmcgJWZvcndhcmRfbGlzdCBoYXMgX19uCisgICAgICAgKiAgZWxlbWVudHMuICBPbGQgZGF0YSBpcyBsb3N0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICAgIHsgX01fYXNzaWduX24oX19uLCBfX3ZhbCwgaXNfY29weV9hc3NpZ25hYmxlPF9UcD4oKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ25zIGFuIGluaXRpYWxpemVyX2xpc3QgdG8gYSAlZm9yd2FyZF9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19pbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiB2YWx1ZV90eXBlLgorICAgICAgICoKKyAgICAgICAqICBSZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aGUgJWZvcndhcmRfbGlzdCB3aXRoIGNvcGllcyBvZiB0aGUKKyAgICAgICAqICBlbGVtZW50cyBpbiB0aGUgaW5pdGlhbGl6ZXJfbGlzdCBAYSBfX2lsLiAgVGhpcyBpcyBsaW5lYXIgaW4KKyAgICAgICAqICBpbC5zaXplKCkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2lsKQorICAgICAgeyBhc3NpZ24oX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsgfQorCisgICAgICAvLy8gR2V0IGEgY29weSBvZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gb2JqZWN0LgorICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUodGhpcy0+X01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIC8vIDIzLjMuNC4zIGl0ZXJhdG9yczoKKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgYmVmb3JlIHRoZSBmaXJzdCBlbGVtZW50CisgICAgICAgKiAgaW4gdGhlICVmb3J3YXJkX2xpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVmb3JlX2JlZ2luKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKCZ0aGlzLT5fTV9pbXBsLl9NX2hlYWQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBiZWZvcmUgdGhlCisgICAgICAgKiAgZmlyc3QgZWxlbWVudCBpbiB0aGUgJWZvcndhcmRfbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5CisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZm9yZV9iZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmdGhpcy0+X01faW1wbC5fTV9oZWFkKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgZWxlbWVudAorICAgICAgICogIGluIHRoZSAlZm9yd2FyZF9saXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9uZXh0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJWZvcndhcmRfbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5CisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9uZXh0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVmb3J3YXJkX2xpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVmb3J3YXJkX2xpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVmb3J3YXJkX2xpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBiZWZvcmUgdGhlCisgICAgICAgKiAgZmlyc3QgZWxlbWVudCBpbiB0aGUgJWZvcndhcmRfbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5CisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWZvcmVfYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJnRoaXMtPl9NX2ltcGwuX01faGVhZCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0CisgICAgICAgKiAgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJWZvcndhcmRfbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgb3JkaW5hcnkgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSAlZm9yd2FyZF9saXN0IGlzIGVtcHR5LiAgKFRodXMgYmVnaW4oKSB3b3VsZAorICAgICAgICogIGVxdWFsIGVuZCgpLikKKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQgPT0gMDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRoZSBsYXJnZXN0IHBvc3NpYmxlIG51bWJlciBvZiBlbGVtZW50cyBvZiAlZm9yd2FyZF9saXN0LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9Ob2RlX2FsbG9jX3RyYWl0czo6bWF4X3NpemUodGhpcy0+X01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIC8vIDIzLjMuNC40IGVsZW1lbnQgYWNjZXNzOgorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7CisgICAgICAgIF9Ob2RlKiBfX2Zyb250ID0gc3RhdGljX2Nhc3Q8X05vZGUqPih0aGlzLT5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCk7CisgICAgICAgIHJldHVybiAqX19mcm9udC0+X01fdmFscHRyKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIF9Ob2RlKiBfX2Zyb250ID0gc3RhdGljX2Nhc3Q8X05vZGUqPih0aGlzLT5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCk7CisgICAgICAgIHJldHVybiAqX19mcm9udC0+X01fdmFscHRyKCk7CisgICAgICB9CisKKyAgICAgIC8vIDIzLjMuNC41IG1vZGnvrIFlcnM6CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0cyBvYmplY3QgaW4gJWZvcndhcmRfbGlzdCBhdCB0aGUgZnJvbnQgb2YgdGhlCisgICAgICAgKiAgICAgICAgICBsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19hcmdzICBBcmd1bWVudHMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYW4gb2JqZWN0IG9mIHR5cGUgVHAgY29uc3RydWN0ZWQKKyAgICAgICAqICB3aXRoIFRwKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikgYXQgdGhlIGZyb250IG9mIHRoZSBsaXN0CisgICAgICAgKiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlZm9yd2FyZF9saXN0IHRoaXMgb3BlcmF0aW9uIGNhbgorICAgICAgICogIGJlIGRvbmUgaW4gY29uc3RhbnQgdGltZSwgYW5kIGRvZXMgbm90IGludmFsaWRhdGUgaXRlcmF0b3JzCisgICAgICAgKiAgYW5kIHJlZmVyZW5jZXMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2VfZnJvbnQoX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgIHsgdGhpcy0+X01faW5zZXJ0X2FmdGVyKGNiZWZvcmVfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFkZCBkYXRhIHRvIHRoZSBmcm9udCBvZiB0aGUgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsICBEYXRhIHRvIGJlIGFkZGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCBzdGFjayBvcGVyYXRpb24uICBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhbgorICAgICAgICogIGVsZW1lbnQgYXQgdGhlIGZyb250IG9mIHRoZSAlZm9yd2FyZF9saXN0IGFuZCBhc3NpZ25zIHRoZSBnaXZlbgorICAgICAgICogIGRhdGEgdG8gaXQuICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBhICVmb3J3YXJkX2xpc3QgdGhpcyBvcGVyYXRpb24KKyAgICAgICAqICBjYW4gYmUgZG9uZSBpbiBjb25zdGFudCB0aW1lLCBhbmQgZG9lcyBub3QgaW52YWxpZGF0ZSBpdGVyYXRvcnMKKyAgICAgICAqICBhbmQgcmVmZXJlbmNlcy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9mcm9udChjb25zdCBfVHAmIF9fdmFsKQorICAgICAgeyB0aGlzLT5fTV9pbnNlcnRfYWZ0ZXIoY2JlZm9yZV9iZWdpbigpLCBfX3ZhbCk7IH0KKworICAgICAgLyoqCisgICAgICAgKgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KF9UcCYmIF9fdmFsKQorICAgICAgeyB0aGlzLT5fTV9pbnNlcnRfYWZ0ZXIoY2JlZm9yZV9iZWdpbigpLCBzdGQ6Om1vdmUoX192YWwpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZXMgZmlyc3QgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgc3RhY2sgb3BlcmF0aW9uLiAgSXQgc2hyaW5rcyB0aGUgJWZvcndhcmRfbGlzdAorICAgICAgICogIGJ5IG9uZS4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWZvcndhcmRfbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4KKyAgICAgICAqICBiZSBkb25lIGluIGNvbnN0YW50IHRpbWUsIGFuZCBvbmx5IGludmFsaWRhdGVzIGl0ZXJhdG9ycy9yZWZlcmVuY2VzCisgICAgICAgKiAgdG8gdGhlIGVsZW1lbnQgYmVpbmcgcmVtb3ZlZC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IG5vIGRhdGEgaXMgcmV0dXJuZWQsIGFuZCBpZiB0aGUgZmlyc3QgZWxlbWVudCdzIGRhdGEKKyAgICAgICAqICBpcyBuZWVkZWQsIGl0IHNob3VsZCBiZSByZXRyaWV2ZWQgYmVmb3JlIHBvcF9mcm9udCgpIGlzCisgICAgICAgKiAgY2FsbGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwb3BfZnJvbnQoKQorICAgICAgeyB0aGlzLT5fTV9lcmFzZV9hZnRlcigmdGhpcy0+X01faW1wbC5fTV9oZWFkKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdHMgb2JqZWN0IGluICVmb3J3YXJkX2xpc3QgYWZ0ZXIgdGhlIHNwZWNpZmllZAorICAgICAgICogICAgICAgICAgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgQSBjb25zdF9pdGVyYXRvciBpbnRvIHRoZSAlZm9yd2FyZF9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19hcmdzICBBcmd1bWVudHMuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGRhdGEuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYW4gb2JqZWN0IG9mIHR5cGUgVCBjb25zdHJ1Y3RlZAorICAgICAgICogIHdpdGggVChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pIGFmdGVyIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBsb2NhdGlvbi4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWZvcndhcmRfbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4KKyAgICAgICAqICBiZSBkb25lIGluIGNvbnN0YW50IHRpbWUsIGFuZCBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycworICAgICAgICogIGFuZCByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2luc2VydF9hZnRlcihfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBnaXZlbiB2YWx1ZSBpbnRvICVmb3J3YXJkX2xpc3QgYWZ0ZXIgc3BlY2lmaWVkCisgICAgICAgKiAgICAgICAgICBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlZm9yd2FyZF9saXN0LgorICAgICAgICogIEBwYXJhbSAgX192YWwgIERhdGEgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGRhdGEuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYSBjb3B5IG9mIHRoZSBnaXZlbiB2YWx1ZSBhZnRlcgorICAgICAgICogIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBhICVmb3J3YXJkX2xpc3QgdGhpcworICAgICAgICogIG9wZXJhdGlvbiBjYW4gYmUgZG9uZSBpbiBjb25zdGFudCB0aW1lLCBhbmQgZG9lcyBub3QKKyAgICAgICAqICBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2luc2VydF9hZnRlcihfX3BvcywgX192YWwpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9UcCYmIF9fdmFsKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01faW5zZXJ0X2FmdGVyKF9fcG9zLCBzdGQ6Om1vdmUoX192YWwpKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGEgbnVtYmVyIG9mIGNvcGllcyBvZiBnaXZlbiBkYXRhIGludG8gdGhlCisgICAgICAgKiAgICAgICAgICAlZm9yd2FyZF9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEFuIGl0ZXJhdG9yIGludG8gdGhlICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBlbGVtZW50cyB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsICBEYXRhIHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGluc2VydGVkIGNvcHkgb2YKKyAgICAgICAqICAgICAgICAgICBAYSB2YWwgb3IgQGEgcG9zIGlmIEBhIG4gPT0gMC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIHNwZWNpZmllZCBudW1iZXIgb2YgY29waWVzIG9mIHRoZQorICAgICAgICogIGdpdmVuIGRhdGEgYWZ0ZXIgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBAYSBwb3MuCisgICAgICAgKgorICAgICAgICogIFRoaXMgb3BlcmF0aW9uIGlzIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluc2VydGVkIGFuZAorICAgICAgICogIGRvZXMgbm90IGludmFsaWRhdGUgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGEgcmFuZ2UgaW50byB0aGUgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlZm9yd2FyZF9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBpbnNlcnRlZCBlbGVtZW50IG9yCisgICAgICAgKiAgICAgICAgICAgQGEgX19wb3MgaWYgQGEgX19maXJzdCA9PSBAYSBfX2xhc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgY29waWVzIG9mIHRoZSBkYXRhIGluIHRoZSByYW5nZQorICAgICAgICogIFtAYSBfX2ZpcnN0LEBhIF9fbGFzdCkgaW50byB0aGUgJWZvcndhcmRfbGlzdCBhZnRlciB0aGUKKyAgICAgICAqICBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgQGEgX19wb3MuCisgICAgICAgKgorICAgICAgICogIFRoaXMgb3BlcmF0aW9uIGlzIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluc2VydGVkIGFuZAorICAgICAgICogIGRvZXMgbm90IGludmFsaWRhdGUgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIHRoZSBjb250ZW50cyBvZiBhbiBpbml0aWFsaXplcl9saXN0IGludG8KKyAgICAgICAqICAgICAgICAgICVmb3J3YXJkX2xpc3QgYWZ0ZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlZm9yd2FyZF9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19pbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiB2YWx1ZV90eXBlLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGluc2VydGVkIGVsZW1lbnQKKyAgICAgICAqICAgICAgICAgICBvciBAYSBfX3BvcyBpZiBAYSBfX2lsIGlzIGVtcHR5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGNvcGllcyBvZiB0aGUgZGF0YSBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplcl9saXN0IEBhIF9faWwgaW50byB0aGUgJWZvcndhcmRfbGlzdCBiZWZvcmUgdGhlIGxvY2F0aW9uCisgICAgICAgKiAgc3BlY2lmaWVkIGJ5IEBhIF9fcG9zLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdGlvbiBpcyBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbnNlcnRlZCBhbmQKKyAgICAgICAqICBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3Bvcywgc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX19pbCkKKyAgICAgIHsgcmV0dXJuIGluc2VydF9hZnRlcihfX3BvcywgX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZXMgdGhlIGVsZW1lbnQgcG9pbnRlZCB0byBieSB0aGUgaXRlcmF0b3IgZm9sbG93aW5nCisgICAgICAgKiAgICAgICAgICBAYyBwb3MuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgSXRlcmF0b3IgcG9pbnRpbmcgYmVmb3JlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IGZvbGxvd2luZyB0aGUgb25lCisgICAgICAgKiAgICAgICAgICAgdGhhdCB3YXMgZXJhc2VkLCBvciBlbmQoKSBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgZXJhc2UgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGFuZAorICAgICAgICogIHRodXMgc2hvcnRlbiB0aGUgJWZvcndhcmRfbGlzdCBieSBvbmUuCisgICAgICAgKgorICAgICAgICogIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWZvcndhcmRfbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4gYmUgZG9uZQorICAgICAgICogIGluIGNvbnN0YW50IHRpbWUsIGFuZCBvbmx5IGludmFsaWRhdGVzIGl0ZXJhdG9ycy9yZWZlcmVuY2VzIHRvCisgICAgICAgKiAgdGhlIGVsZW1lbnQgYmVpbmcgcmVtb3ZlZC4gIFRoZSB1c2VyIGlzIGFsc28gY2F1dGlvbmVkIHRoYXQKKyAgICAgICAqICB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudAorICAgICAgICogIGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbgorICAgICAgICogIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MpCisgICAgICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9lcmFzZV9hZnRlcihjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPgorCQkJCQkgICAgIChfX3Bvcy5fTV9ub2RlKSkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGEgcmFuZ2Ugb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgSXRlcmF0b3IgcG9pbnRpbmcgYmVmb3JlIHRoZSBmaXJzdCBlbGVtZW50IHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50IHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBAIF9fbGFzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGVyYXNlIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UKKyAgICAgICAqICBAYSAoX19wb3MsX19sYXN0KSBhbmQgc2hvcnRlbiB0aGUgJWZvcndhcmRfbGlzdCBhY2NvcmRpbmdseS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRpb24gaXMgbGluZWFyIHRpbWUgaW4gdGhlIHNpemUgb2YgdGhlIHJhbmdlIGFuZCBvbmx5CisgICAgICAgKiAgaW52YWxpZGF0ZXMgaXRlcmF0b3JzL3JlZmVyZW5jZXMgdG8gdGhlIGVsZW1lbnQgYmVpbmcgcmVtb3ZlZC4KKyAgICAgICAqICBUaGUgdXNlciBpcyBhbHNvIGNhdXRpb25lZCB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlCisgICAgICAgKiAgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlCisgICAgICAgKiAgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyCisgICAgICAgKiAgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9lcmFzZV9hZnRlcihjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPgorCQkJCQkgICAgIChfX3Bvcy5fTV9ub2RlKSwKKwkJCQkJICAgICBjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPgorCQkJCQkgICAgIChfX2xhc3QuX01fbm9kZSkpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXBzIGRhdGEgd2l0aCBhbm90aGVyICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2xpc3QgIEEgJWZvcndhcmRfbGlzdCBvZiB0aGUgc2FtZSBlbGVtZW50IGFuZCBhbGxvY2F0b3IKKyAgICAgICAqICAgICAgICAgICAgICAgICAgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZXhjaGFuZ2VzIHRoZSBlbGVtZW50cyBiZXR3ZWVuIHR3byBsaXN0cyBpbiBjb25zdGFudAorICAgICAgICogIHRpbWUuICBOb3RlIHRoYXQgdGhlIGdsb2JhbCBzdGQ6OnN3YXAoKSBmdW5jdGlvbiBpcworICAgICAgICogIHNwZWNpYWxpemVkIHN1Y2ggdGhhdCBzdGQ6OnN3YXAobDEsbDIpIHdpbGwgZmVlZCB0byB0aGlzCisgICAgICAgKiAgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICBub2V4Y2VwdChfTm9kZV9hbGxvY190cmFpdHM6Ol9TX25vdGhyb3dfc3dhcCgpKQorICAgICAgeworICAgICAgICBzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQsCisJCSAgX19saXN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0KTsKKwlfTm9kZV9hbGxvY190cmFpdHM6Ol9TX29uX3N3YXAodGhpcy0+X01fZ2V0X05vZGVfYWxsb2NhdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xpc3QuX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgUmVzaXplcyB0aGUgJWZvcndhcmRfbGlzdCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZgorICAgICAgICogICAgICAgICBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gX19zeiBOdW1iZXIgb2YgZWxlbWVudHMgdGhlICVmb3J3YXJkX2xpc3Qgc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAlZm9yd2FyZF9saXN0IHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBudW1iZXIgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICAqICAlZm9yd2FyZF9saXN0J3MgY3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgdGhlICVmb3J3YXJkX2xpc3QKKyAgICAgICAqICBpcyB0cnVuY2F0ZWQsIG90aGVyd2lzZSB0aGUgJWZvcndhcmRfbGlzdCBpcyBleHRlbmRlZCBhbmQgdGhlCisgICAgICAgKiAgbmV3IGVsZW1lbnRzIGFyZSBkZWZhdWx0IGNvbnN0cnVjdGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3opOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgUmVzaXplcyB0aGUgJWZvcndhcmRfbGlzdCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZgorICAgICAgICogICAgICAgICBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gX19zeiBOdW1iZXIgb2YgZWxlbWVudHMgdGhlICVmb3J3YXJkX2xpc3Qgc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKiAgQHBhcmFtIF9fdmFsIERhdGEgd2l0aCB3aGljaCBuZXcgZWxlbWVudHMgc2hvdWxkIGJlIHBvcHVsYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICVmb3J3YXJkX2xpc3QgdG8gdGhlIHNwZWNpZmllZAorICAgICAgICogIG51bWJlciBvZiBlbGVtZW50cy4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZQorICAgICAgICogICVmb3J3YXJkX2xpc3QncyBjdXJyZW50IG51bWJlciBvZiBlbGVtZW50cyB0aGUgJWZvcndhcmRfbGlzdAorICAgICAgICogIGlzIHRydW5jYXRlZCwgb3RoZXJ3aXNlIHRoZSAlZm9yd2FyZF9saXN0IGlzIGV4dGVuZGVkIGFuZCBuZXcKKyAgICAgICAqICBlbGVtZW50cyBhcmUgcG9wdWxhdGVkIHdpdGggZ2l2ZW4gZGF0YS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRXJhc2VzIGFsbCB0aGUgZWxlbWVudHMuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzCisgICAgICAgKiAgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUKKyAgICAgICAqICBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuCisgICAgICAgKiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBub2V4Y2VwdAorICAgICAgeyB0aGlzLT5fTV9lcmFzZV9hZnRlcigmdGhpcy0+X01faW1wbC5fTV9oZWFkLCAwKTsgfQorCisgICAgICAvLyAyMy4zLjQuNiBmb3J3YXJkX2xpc3Qgb3BlcmF0aW9uczoKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgY29udGVudHMgb2YgYW5vdGhlciAlZm9yd2FyZF9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBlbGVtZW50IHRvIGluc2VydCBhZnRlci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGlzdCAgU291cmNlIGxpc3QuCisgICAgICAgKgorICAgICAgICogIFRoZSBlbGVtZW50cyBvZiBAYSBsaXN0IGFyZSBpbnNlcnRlZCBpbiBjb25zdGFudCB0aW1lIGFmdGVyCisgICAgICAgKiAgdGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSBAYSBwb3MuICBAYSBsaXN0IGJlY29tZXMgYW4gZW1wdHkKKyAgICAgICAqICBsaXN0LgorICAgICAgICoKKyAgICAgICAqICBSZXF1aXJlcyB0aGlzICE9IEBhIHguCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgZm9yd2FyZF9saXN0JiYgX19saXN0KQorICAgICAgeworCWlmICghX19saXN0LmVtcHR5KCkpCisJICBfTV9zcGxpY2VfYWZ0ZXIoX19wb3MsIF9fbGlzdC5iZWZvcmVfYmVnaW4oKSwgX19saXN0LmVuZCgpKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBmb3J3YXJkX2xpc3QmIF9fbGlzdCkKKyAgICAgIHsgc3BsaWNlX2FmdGVyKF9fcG9zLCBzdGQ6Om1vdmUoX19saXN0KSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgZWxlbWVudCBmcm9tIGFub3RoZXIgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZWxlbWVudCB0byBpbnNlcnQgYWZ0ZXIuCisgICAgICAgKiAgQHBhcmFtICBfX2xpc3QgIFNvdXJjZSBsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19pICAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnQgYmVmb3JlIHRoZSBlbGVtZW50CisgICAgICAgKiAgICAgICAgICAgICAgICB0byBtb3ZlLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBlbGVtZW50IGluIGxpc3QgQGEgbGlzdCByZWZlcmVuY2VkIGJ5IEBhIGkgYW5kCisgICAgICAgKiAgaW5zZXJ0cyBpdCBpbnRvIHRoZSBjdXJyZW50IGxpc3QgYWZ0ZXIgQGEgcG9zLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGZvcndhcmRfbGlzdCYmIF9fbGlzdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2kpOworCisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGZvcndhcmRfbGlzdCYgX19saXN0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9faSkKKyAgICAgIHsgc3BsaWNlX2FmdGVyKF9fcG9zLCBzdGQ6Om1vdmUoX19saXN0KSwgX19pKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCByYW5nZSBmcm9tIGFub3RoZXIgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZWxlbWVudCB0byBpbnNlcnQgYWZ0ZXIuCisgICAgICAgKiAgQHBhcmFtICBfX2xpc3QgIFNvdXJjZSBsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19iZWZvcmUgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGJlZm9yZSB0aGUgc3RhcnQgb2YgcmFuZ2UKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICBpbiBsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZW5kIG9mIHJhbmdlIGluIGxpc3QuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgZWxlbWVudHMgaW4gdGhlIHJhbmdlIChfX2JlZm9yZSxfX2xhc3QpIGFuZCBpbnNlcnRzIHRoZW0KKyAgICAgICAqICBhZnRlciBAYSBfX3BvcyBpbiBjb25zdGFudCB0aW1lLgorICAgICAgICoKKyAgICAgICAqICBVbmRlZmluZWQgaWYgQGEgX19wb3MgaXMgaW4gKF9fYmVmb3JlLF9fbGFzdCkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgZm9yd2FyZF9saXN0JiYsCisgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19iZWZvcmUsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX01fc3BsaWNlX2FmdGVyKF9fcG9zLCBfX2JlZm9yZSwgX19sYXN0KTsgfQorCisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGZvcndhcmRfbGlzdCYsCisgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19iZWZvcmUsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX01fc3BsaWNlX2FmdGVyKF9fcG9zLCBfX2JlZm9yZSwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhbGwgZWxlbWVudHMgZXF1YWwgdG8gdmFsdWUuCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbCAgVGhlIHZhbHVlIHRvIHJlbW92ZS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyBldmVyeSBlbGVtZW50IGluIHRoZSBsaXN0IGVxdWFsIHRvIEBhIF9fdmFsLgorICAgICAgICogIFJlbWFpbmluZyBlbGVtZW50cyBzdGF5IGluIGxpc3Qgb3JkZXIuICBOb3RlIHRoYXQgdGhpcworICAgICAgICogIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QKKyAgICAgICAqICB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlbW92ZShjb25zdCBfVHAmIF9fdmFsKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgYWxsIGVsZW1lbnRzIHNhdGlzZnlpbmcgYSBwcmVkaWNhdGUuCisgICAgICAgKiAgQHBhcmFtICBfX3ByZWQgIFVuYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbiBvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgZXZlcnkgZWxlbWVudCBpbiB0aGUgbGlzdCBmb3Igd2hpY2ggdGhlIHByZWRpY2F0ZQorICAgICAgICogIHJldHVybnMgdHJ1ZS4gIFJlbWFpbmluZyBlbGVtZW50cyBzdGF5IGluIGxpc3Qgb3JkZXIuICBOb3RlCisgICAgICAgKiAgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlCisgICAgICAgKiAgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcworICAgICAgICogIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkPgorICAgICAgICB2b2lkCisgICAgICAgIHJlbW92ZV9pZihfUHJlZCBfX3ByZWQpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBjb25zZWN1dGl2ZSBkdXBsaWNhdGUgZWxlbWVudHMuCisgICAgICAgKgorICAgICAgICogIEZvciBlYWNoIGNvbnNlY3V0aXZlIHNldCBvZiBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIHZhbHVlLAorICAgICAgICogIHJlbW92ZSBhbGwgYnV0IHRoZSBmaXJzdCBvbmUuICBSZW1haW5pbmcgZWxlbWVudHMgc3RheSBpbgorICAgICAgICogIGxpc3Qgb3JkZXIuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUKKyAgICAgICAqICBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLAorICAgICAgICogIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcKKyAgICAgICAqICB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICB1bmlxdWUoKQorICAgICAgeyB1bmlxdWUoc3RkOjplcXVhbF90bzxfVHA+KCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGNvbnNlY3V0aXZlIGVsZW1lbnRzIHNhdGlzZnlpbmcgYSBwcmVkaWNhdGUuCisgICAgICAgKiAgQHBhcmFtICBfX2JpbmFyeV9wcmVkICBCaW5hcnkgcHJlZGljYXRlIGZ1bmN0aW9uIG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGVhY2ggY29uc2VjdXRpdmUgc2V0IG9mIGVsZW1lbnRzIFtmaXJzdCxsYXN0KSB0aGF0CisgICAgICAgKiAgc2F0aXNmeSBwcmVkaWNhdGUoZmlyc3QsaSkgd2hlcmUgaSBpcyBhbiBpdGVyYXRvciBpbgorICAgICAgICogIFtmaXJzdCxsYXN0KSwgcmVtb3ZlIGFsbCBidXQgdGhlIGZpcnN0IG9uZS4gIFJlbWFpbmluZworICAgICAgICogIGVsZW1lbnRzIHN0YXkgaW4gbGlzdCBvcmRlci4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkKKyAgICAgICAqICBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUKKyAgICAgICAqICBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuCisgICAgICAgKiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpblByZWQ+CisgICAgICAgIHZvaWQKKyAgICAgICAgdW5pcXVlKF9CaW5QcmVkIF9fYmluYXJ5X3ByZWQpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1lcmdlIHNvcnRlZCBsaXN0cy4KKyAgICAgICAqICBAcGFyYW0gIF9fbGlzdCAgU29ydGVkIGxpc3QgdG8gbWVyZ2UuCisgICAgICAgKgorICAgICAgICogIEFzc3VtZXMgdGhhdCBib3RoIEBhIGxpc3QgYW5kIHRoaXMgbGlzdCBhcmUgc29ydGVkIGFjY29yZGluZyB0bworICAgICAgICogIG9wZXJhdG9yPCgpLiAgTWVyZ2VzIGVsZW1lbnRzIG9mIEBhIF9fbGlzdCBpbnRvIHRoaXMgbGlzdCBpbgorICAgICAgICogIHNvcnRlZCBvcmRlciwgbGVhdmluZyBAYSBfX2xpc3QgZW1wdHkgd2hlbiBjb21wbGV0ZS4gIEVsZW1lbnRzIGluCisgICAgICAgKiAgdGhpcyBsaXN0IHByZWNlZGUgZWxlbWVudHMgaW4gQGEgX19saXN0IHRoYXQgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBtZXJnZShmb3J3YXJkX2xpc3QmJiBfX2xpc3QpCisgICAgICB7IG1lcmdlKHN0ZDo6bW92ZShfX2xpc3QpLCBzdGQ6Omxlc3M8X1RwPigpKTsgfQorCisgICAgICB2b2lkCisgICAgICBtZXJnZShmb3J3YXJkX2xpc3QmIF9fbGlzdCkKKyAgICAgIHsgbWVyZ2Uoc3RkOjptb3ZlKF9fbGlzdCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTWVyZ2Ugc29ydGVkIGxpc3RzIGFjY29yZGluZyB0byBjb21wYXJpc29uIGZ1bmN0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19saXN0ICBTb3J0ZWQgbGlzdCB0byBtZXJnZS4KKyAgICAgICAqICBAcGFyYW0gIF9fY29tcCBDb21wYXJpc29uIGZ1bmN0aW9uIGRlZmluaW5nIHNvcnQgb3JkZXIuCisgICAgICAgKgorICAgICAgICogIEFzc3VtZXMgdGhhdCBib3RoIEBhIF9fbGlzdCBhbmQgdGhpcyBsaXN0IGFyZSBzb3J0ZWQgYWNjb3JkaW5nIHRvCisgICAgICAgKiAgY29tcC4gIE1lcmdlcyBlbGVtZW50cyBvZiBAYSBfX2xpc3QgaW50byB0aGlzIGxpc3QKKyAgICAgICAqICBpbiBzb3J0ZWQgb3JkZXIsIGxlYXZpbmcgQGEgX19saXN0IGVtcHR5IHdoZW4gY29tcGxldGUuICBFbGVtZW50cworICAgICAgICogIGluIHRoaXMgbGlzdCBwcmVjZWRlIGVsZW1lbnRzIGluIEBhIF9fbGlzdCB0aGF0IGFyZSBlcXVpdmFsZW50CisgICAgICAgKiAgYWNjb3JkaW5nIHRvIGNvbXAoKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbXA+CisgICAgICAgIHZvaWQKKyAgICAgICAgbWVyZ2UoZm9yd2FyZF9saXN0JiYgX19saXN0LCBfQ29tcCBfX2NvbXApOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29tcD4KKyAgICAgICAgdm9pZAorICAgICAgICBtZXJnZShmb3J3YXJkX2xpc3QmIF9fbGlzdCwgX0NvbXAgX19jb21wKQorICAgICAgICB7IG1lcmdlKHN0ZDo6bW92ZShfX2xpc3QpLCBfX2NvbXApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU29ydCB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QuCisgICAgICAgKgorICAgICAgICogIFNvcnRzIHRoZSBlbGVtZW50cyBvZiB0aGlzIGxpc3QgaW4gTmxvZ04gdGltZS4gIEVxdWl2YWxlbnQKKyAgICAgICAqICBlbGVtZW50cyByZW1haW4gaW4gbGlzdCBvcmRlci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc29ydCgpCisgICAgICB7IHNvcnQoc3RkOjpsZXNzPF9UcD4oKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTb3J0IHRoZSBmb3J3YXJkX2xpc3QgdXNpbmcgYSBjb21wYXJpc29uIGZ1bmN0aW9uLgorICAgICAgICoKKyAgICAgICAqICBTb3J0cyB0aGUgZWxlbWVudHMgb2YgdGhpcyBsaXN0IGluIE5sb2dOIHRpbWUuICBFcXVpdmFsZW50CisgICAgICAgKiAgZWxlbWVudHMgcmVtYWluIGluIGxpc3Qgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db21wPgorICAgICAgICB2b2lkCisgICAgICAgIHNvcnQoX0NvbXAgX19jb21wKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXZlcnNlIHRoZSBlbGVtZW50cyBpbiBsaXN0LgorICAgICAgICoKKyAgICAgICAqICBSZXZlcnNlIHRoZSBvcmRlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBpbiBsaW5lYXIgdGltZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmV2ZXJzZSgpIG5vZXhjZXB0CisgICAgICB7IHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9yZXZlcnNlX2FmdGVyKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAvLyBDYWxsZWQgYnkgdGhlIHJhbmdlIGNvbnN0cnVjdG9yIHRvIGltcGxlbWVudCBbMjMuMy40LjJdLzkKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IGZvcndhcmRfbGlzdChuLHYsYSksIGFuZCB0aGUgcmFuZ2UgY29uc3RydWN0b3Igd2hlbiBpdAorICAgICAgLy8gdHVybnMgb3V0IHRvIGJlIHRoZSBzYW1lIHRoaW5nLgorICAgICAgdm9pZAorICAgICAgX01fZmlsbF9pbml0aWFsaXplKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsdWUpOworCisgICAgICAvLyBDYWxsZWQgYnkgc3BsaWNlX2FmdGVyIGFuZCBpbnNlcnRfYWZ0ZXIuCisgICAgICBpdGVyYXRvcgorICAgICAgX01fc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBjb25zdF9pdGVyYXRvciBfX2JlZm9yZSwKKwkJICAgICAgY29uc3RfaXRlcmF0b3IgX19sYXN0KTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IGZvcndhcmRfbGlzdChuKS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlZmF1bHRfaW5pdGlhbGl6ZShzaXplX3R5cGUgX19uKTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IHJlc2l6ZShzeikuCisgICAgICB2b2lkCisgICAgICBfTV9kZWZhdWx0X2luc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbik7CisKKyAgICAgIC8vIENhbGxlZCBieSBvcGVyYXRvcj0oZm9yd2FyZF9saXN0JiYpCisgICAgICB2b2lkCisgICAgICBfTV9tb3ZlX2Fzc2lnbihmb3J3YXJkX2xpc3QmJiBfX2xpc3QsIHN0ZDo6dHJ1ZV90eXBlKSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBjbGVhcigpOworICAgICAgICBzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQsCisgICAgICAgICAgICAgICAgICBfX2xpc3QuX01faW1wbC5fTV9oZWFkLl9NX25leHQpOworICAgICAgICBzdGQ6Ol9fYWxsb2Nfb25fbW92ZSh0aGlzLT5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19saXN0Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKworICAgICAgLy8gQ2FsbGVkIGJ5IG9wZXJhdG9yPShmb3J3YXJkX2xpc3QmJikKKyAgICAgIHZvaWQKKyAgICAgIF9NX21vdmVfYXNzaWduKGZvcndhcmRfbGlzdCYmIF9fbGlzdCwgc3RkOjpmYWxzZV90eXBlKQorICAgICAgeworICAgICAgICBpZiAoX19saXN0Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpID09IHRoaXMtPl9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKQorICAgICAgICAgIF9NX21vdmVfYXNzaWduKHN0ZDo6bW92ZShfX2xpc3QpLCBzdGQ6OnRydWVfdHlwZSgpKTsKKyAgICAgICAgZWxzZQorCSAgLy8gVGhlIHJ2YWx1ZSdzIGFsbG9jYXRvciBjYW5ub3QgYmUgbW92ZWQsIG9yIGlzIG5vdCBlcXVhbCwKKwkgIC8vIHNvIHdlIG5lZWQgdG8gaW5kaXZpZHVhbGx5IG1vdmUgZWFjaCBlbGVtZW50LgorCSAgdGhpcy0+YXNzaWduKHN0ZDo6X19tYWtlX21vdmVfaWZfbm9leGNlcHRfaXRlcmF0b3IoX19saXN0LmJlZ2luKCkpLAorCQkgICAgICAgc3RkOjpfX21ha2VfbW92ZV9pZl9ub2V4Y2VwdF9pdGVyYXRvcihfX2xpc3QuZW5kKCkpKTsKKyAgICAgIH0KKworICAgICAgLy8gQ2FsbGVkIGJ5IGFzc2lnbihfSW5wdXRJdGVyYXRvciwgX0lucHV0SXRlcmF0b3IpIGlmIF9UcCBpcworICAgICAgLy8gQ29weUFzc2lnbmFibGUuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl2b2lkCisgICAgICAgIF9NX2Fzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIHRydWVfdHlwZSkKKwl7CisJICBhdXRvIF9fcHJldiA9IGJlZm9yZV9iZWdpbigpOworCSAgYXV0byBfX2N1cnIgPSBiZWdpbigpOworCSAgYXV0byBfX2VuZCA9IGVuZCgpOworCSAgd2hpbGUgKF9fY3VyciAhPSBfX2VuZCAmJiBfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgICAgeworCSAgICAgICpfX2N1cnIgPSAqX19maXJzdDsKKwkgICAgICArK19fcHJldjsKKwkgICAgICArK19fY3VycjsKKwkgICAgICArK19fZmlyc3Q7CisJICAgIH0KKwkgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgICAgaW5zZXJ0X2FmdGVyKF9fcHJldiwgX19maXJzdCwgX19sYXN0KTsKKwkgIGVsc2UgaWYgKF9fY3VyciAhPSBfX2VuZCkKKwkgICAgZXJhc2VfYWZ0ZXIoX19wcmV2LCBfX2VuZCk7CisgICAgICAgIH0KKworICAgICAgLy8gQ2FsbGVkIGJ5IGFzc2lnbihfSW5wdXRJdGVyYXRvciwgX0lucHV0SXRlcmF0b3IpIGlmIF9UcCBpcyBub3QKKyAgICAgIC8vIENvcHlBc3NpZ25hYmxlLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdm9pZAorICAgICAgICBfTV9hc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBmYWxzZV90eXBlKQorCXsKKwkgIGNsZWFyKCk7CisJICBpbnNlcnRfYWZ0ZXIoY2JlZm9yZV9iZWdpbigpLCBfX2ZpcnN0LCBfX2xhc3QpOworCX0KKworICAgICAgLy8gQ2FsbGVkIGJ5IGFzc2lnbihzaXplX3R5cGUsIGNvbnN0IF9UcCYpIGlmIFRwIGlzIENvcHlBc3NpZ25hYmxlCisgICAgICB2b2lkCisgICAgICBfTV9hc3NpZ25fbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsLCB0cnVlX3R5cGUpCisgICAgICB7CisJYXV0byBfX3ByZXYgPSBiZWZvcmVfYmVnaW4oKTsKKwlhdXRvIF9fY3VyciA9IGJlZ2luKCk7CisJYXV0byBfX2VuZCA9IGVuZCgpOworCXdoaWxlIChfX2N1cnIgIT0gX19lbmQgJiYgX19uID4gMCkKKwkgIHsKKwkgICAgKl9fY3VyciA9IF9fdmFsOworCSAgICArK19fcHJldjsKKwkgICAgKytfX2N1cnI7CisJICAgIC0tX19uOworCSAgfQorCWlmIChfX24gPiAwKQorCSAgaW5zZXJ0X2FmdGVyKF9fcHJldiwgX19uLCBfX3ZhbCk7CisJZWxzZSBpZiAoX19jdXJyICE9IF9fZW5kKQorCSAgZXJhc2VfYWZ0ZXIoX19wcmV2LCBfX2VuZCk7CisgICAgICB9CisKKyAgICAgIC8vIENhbGxlZCBieSBhc3NpZ24oc2l6ZV90eXBlLCBjb25zdCBfVHAmKSBpZiBUcCBpcyBub24tQ29weUFzc2lnbmFibGUKKyAgICAgIHZvaWQKKyAgICAgIF9NX2Fzc2lnbl9uKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwsIGZhbHNlX3R5cGUpCisgICAgICB7CisJY2xlYXIoKTsKKwlpbnNlcnRfYWZ0ZXIoY2JlZm9yZV9iZWdpbigpLCBfX24sIF9fdmFsKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBGb3J3YXJkIGxpc3QgZXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgICogIEBwYXJhbSAgX19seCAgQSAlZm9yd2FyZF9saXN0CisgICAqICBAcGFyYW0gIF9fbHkgIEEgJWZvcndhcmRfbGlzdCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIF9fbHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiB0aGUgZWxlbWVudHMgb2YgdGhlIGZvcndhcmQgbGlzdHMgYXJlIGVxdWFsLgorICAgKgorICAgKiAgVGhpcyBpcyBhbiBlcXVpdmFsZW5jZSByZWxhdGlvbi4gIEl0IGlzIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIAorICAgKiAgZWxlbWVudHMgb2YgdGhlIGZvcndhcmQgbGlzdHMuICBEZXF1ZXMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudAorICAgKiAgaWYgY29ycmVzcG9uZGluZyBlbGVtZW50cyBjb21wYXJlIGVxdWFsLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBGb3J3YXJkIGxpc3Qgb3JkZXJpbmcgcmVsYXRpb24uCisgICAqICBAcGFyYW0gIF9fbHggIEEgJWZvcndhcmRfbGlzdC4KKyAgICogIEBwYXJhbSAgX19seSAgQSAlZm9yd2FyZF9saXN0IG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgX19seC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIEBhIF9fbHggaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuIEBhIF9fbHkuCisgICAqCisgICAqICBUaGlzIGlzIGEgdG90YWwgb3JkZXJpbmcgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiAKKyAgICogIGVsZW1lbnRzIG9mIHRoZSBmb3J3YXJkIGxpc3RzLiAgVGhlIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZQorICAgKiAgd2l0aCBAYyA8LgorICAgKgorICAgKiAgU2VlIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoKSBmb3IgaG93IHRoZSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX19seC5jYmVnaW4oKSwgX19seC5jZW5kKCksCisJCQkJCSAgX19seS5jYmVnaW4oKSwgX19seS5jZW5kKCkpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPT0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuICEoX19seCA9PSBfX2x5KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiAoX19seSA8IF9fbHgpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gIShfX2x4IDwgX19seSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiAhKF9fbHkgPCBfX2x4KTsgfQorCisgIC8vLyBTZWUgc3RkOjpmb3J3YXJkX2xpc3Q6OnN3YXAoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisJIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyBfX2x4LnN3YXAoX19seSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0ZPUldBUkRfTElTVF9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZm9yd2FyZF9saXN0LnRjYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9mb3J3YXJkX2xpc3QudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Y2U4MGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZm9yd2FyZF9saXN0LnRjYwpAQCAtMCwwICsxLDUxMSBAQAorLy8gPGZvcndhcmRfbGlzdC50Y2M+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2ZvcndhcmRfbGlzdC50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtmb3J3YXJkX2xpc3R9CisgKi8KKworI2lmbmRlZiBfRk9SV0FSRF9MSVNUX1RDQworI2RlZmluZSBfRk9SV0FSRF9MSVNUX1RDQyAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9Gd2RfbGlzdF9iYXNlPF9UcCwgX0FsbG9jPjo6CisgICAgX0Z3ZF9saXN0X2Jhc2UoX0Z3ZF9saXN0X2Jhc2UmJiBfX2xzdCwgY29uc3QgX05vZGVfYWxsb2NfdHlwZSYgX19hKQorICAgIDogX01faW1wbChfX2EpCisgICAgeworICAgICAgaWYgKF9fbHN0Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpID09IF9fYSkKKwl7CisJICB0aGlzLT5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCA9IF9fbHN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0OworCSAgX19sc3QuX01faW1wbC5fTV9oZWFkLl9NX25leHQgPSAwOworCX0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9uZXh0ID0gMDsKKyAgICAgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX3RvID0gJnRoaXMtPl9NX2ltcGwuX01faGVhZDsKKyAgICAgICAgICBfTm9kZSogX19jdXJyID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfX2xzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCk7CisKKyAgICAgICAgICB3aGlsZSAoX19jdXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX3RvLT5fTV9uZXh0ID0KKyAgICAgICAgICAgICAgICBfTV9jcmVhdGVfbm9kZShzdGQ6Om1vdmVfaWZfbm9leGNlcHQoKl9fY3Vyci0+X01fdmFscHRyKCkpKTsKKyAgICAgICAgICAgICAgX190byA9IF9fdG8tPl9NX25leHQ7CisgICAgICAgICAgICAgIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19jdXJyLT5fTV9uZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqCisgICAgICBfRndkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz46OgorICAgICAgX01faW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSogX190bworCSAgPSBjb25zdF9jYXN0PF9Gd2RfbGlzdF9ub2RlX2Jhc2UqPihfX3Bvcy5fTV9ub2RlKTsKKwlfTm9kZSogX190aGluZyA9IF9NX2NyZWF0ZV9ub2RlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICAgIF9fdGhpbmctPl9NX25leHQgPSBfX3RvLT5fTV9uZXh0OworICAgICAgICBfX3RvLT5fTV9uZXh0ID0gX190aGluZzsKKyAgICAgICAgcmV0dXJuIF9fdG8tPl9NX25leHQ7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSoKKyAgICBfRndkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX2VyYXNlX2FmdGVyKF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fcG9zKQorICAgIHsKKyAgICAgIF9Ob2RlKiBfX2N1cnIgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fcG9zLT5fTV9uZXh0KTsKKyAgICAgIF9fcG9zLT5fTV9uZXh0ID0gX19jdXJyLT5fTV9uZXh0OworICAgICAgX1RwX2FsbG9jX3R5cGUgX19hKF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKTsKKyAgICAgIGFsbG9jYXRvcl90cmFpdHM8X1RwX2FsbG9jX3R5cGU+OjpkZXN0cm95KF9fYSwgX19jdXJyLT5fTV92YWxwdHIoKSk7CisgICAgICBfX2N1cnItPn5fTm9kZSgpOworICAgICAgX01fcHV0X25vZGUoX19jdXJyKTsKKyAgICAgIHJldHVybiBfX3Bvcy0+X01fbmV4dDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSoKKyAgICBfRndkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX2VyYXNlX2FmdGVyKF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fcG9zLCAKKyAgICAgICAgICAgICAgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX2xhc3QpCisgICAgeworICAgICAgX05vZGUqIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19wb3MtPl9NX25leHQpOworICAgICAgd2hpbGUgKF9fY3VyciAhPSBfX2xhc3QpCisgICAgICAgIHsKKyAgICAgICAgICBfTm9kZSogX190ZW1wID0gX19jdXJyOworICAgICAgICAgIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19jdXJyLT5fTV9uZXh0KTsKKwkgIF9UcF9hbGxvY190eXBlIF9fYShfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSk7CisJICBhbGxvY2F0b3JfdHJhaXRzPF9UcF9hbGxvY190eXBlPjo6ZGVzdHJveShfX2EsIF9fdGVtcC0+X01fdmFscHRyKCkpOworCSAgX190ZW1wLT5+X05vZGUoKTsKKyAgICAgICAgICBfTV9wdXRfbm9kZShfX3RlbXApOworICAgICAgICB9CisgICAgICBfX3Bvcy0+X01fbmV4dCA9IF9fbGFzdDsKKyAgICAgIHJldHVybiBfX2xhc3Q7CisgICAgfQorCisgIC8vIENhbGxlZCBieSB0aGUgcmFuZ2UgY29uc3RydWN0b3IgdG8gaW1wbGVtZW50IFsyMy4zLjQuMl0vOQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisgICAgICAgIF9Ob2RlX2Jhc2UqIF9fdG8gPSAmdGhpcy0+X01faW1wbC5fTV9oZWFkOworICAgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfX3RvLT5fTV9uZXh0ID0gdGhpcy0+X01fY3JlYXRlX25vZGUoKl9fZmlyc3QpOworICAgICAgICAgICAgX190byA9IF9fdG8tPl9NX25leHQ7CisgICAgICAgICAgfQorICAgICAgfQorCisgIC8vIENhbGxlZCBieSBmb3J3YXJkX2xpc3Qobix2LGEpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgX01fZmlsbF9pbml0aWFsaXplKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgeworICAgICAgX05vZGVfYmFzZSogX190byA9ICZ0aGlzLT5fTV9pbXBsLl9NX2hlYWQ7CisgICAgICBmb3IgKDsgX19uOyAtLV9fbikKKyAgICAgICAgeworICAgICAgICAgIF9fdG8tPl9NX25leHQgPSB0aGlzLT5fTV9jcmVhdGVfbm9kZShfX3ZhbHVlKTsKKyAgICAgICAgICBfX3RvID0gX190by0+X01fbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgX01fZGVmYXVsdF9pbml0aWFsaXplKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX05vZGVfYmFzZSogX190byA9ICZ0aGlzLT5fTV9pbXBsLl9NX2hlYWQ7CisgICAgICBmb3IgKDsgX19uOyAtLV9fbikKKyAgICAgICAgeworICAgICAgICAgIF9fdG8tPl9NX25leHQgPSB0aGlzLT5fTV9jcmVhdGVfbm9kZSgpOworICAgICAgICAgIF9fdG8gPSBfX3RvLT5fTV9uZXh0OworICAgICAgICB9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mCisgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgb3BlcmF0b3I9KGNvbnN0IGZvcndhcmRfbGlzdCYgX19saXN0KQorICAgIHsKKyAgICAgIGlmICgmX19saXN0ICE9IHRoaXMpCisgICAgICAgIHsKKwkgIGlmIChfTm9kZV9hbGxvY190cmFpdHM6Ol9TX3Byb3BhZ2F0ZV9vbl9jb3B5X2Fzc2lnbigpKQorCSAgICB7CisgICAgICAgICAgICAgIGF1dG8mIF9fdGhpc19hbGxvYyA9IHRoaXMtPl9NX2dldF9Ob2RlX2FsbG9jYXRvcigpOworICAgICAgICAgICAgICBhdXRvJiBfX3RoYXRfYWxsb2MgPSBfX2xpc3QuX01fZ2V0X05vZGVfYWxsb2NhdG9yKCk7CisgICAgICAgICAgICAgIGlmICghX05vZGVfYWxsb2NfdHJhaXRzOjpfU19hbHdheXNfZXF1YWwoKQorCSAgICAgICAgICAmJiBfX3RoaXNfYWxsb2MgIT0gX190aGF0X2FsbG9jKQorCSAgICAgICAgeworCQkgIC8vIHJlcGxhY2VtZW50IGFsbG9jYXRvciBjYW5ub3QgZnJlZSBleGlzdGluZyBzdG9yYWdlCisJCSAgY2xlYXIoKTsKKwkJfQorCSAgICAgIHN0ZDo6X19hbGxvY19vbl9jb3B5KF9fdGhpc19hbGxvYywgX190aGF0X2FsbG9jKTsKKyAgICAgICAgICAgIH0KKwkgIGFzc2lnbihfX2xpc3QuY2JlZ2luKCksIF9fbGlzdC5jZW5kKCkpOworICAgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9kZWZhdWx0X2luc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBjb25zdF9pdGVyYXRvciBfX3NhdmVkX3BvcyA9IF9fcG9zOworICAgICAgX190cnkKKwl7CisJICBmb3IgKDsgX19uOyAtLV9fbikKKwkgICAgX19wb3MgPSBlbXBsYWNlX2FmdGVyKF9fcG9zKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBlcmFzZV9hZnRlcihfX3NhdmVkX3BvcywgKytfX3Bvcyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICByZXNpemUoc2l6ZV90eXBlIF9fc3opCisgICAgeworICAgICAgaXRlcmF0b3IgX19rID0gYmVmb3JlX2JlZ2luKCk7CisKKyAgICAgIHNpemVfdHlwZSBfX2xlbiA9IDA7CisgICAgICB3aGlsZSAoX19rLl9NX25leHQoKSAhPSBlbmQoKSAmJiBfX2xlbiA8IF9fc3opCisgICAgICAgIHsKKyAgICAgICAgICArK19fazsKKyAgICAgICAgICArK19fbGVuOworICAgICAgICB9CisgICAgICBpZiAoX19sZW4gPT0gX19zeikKKyAgICAgICAgZXJhc2VfYWZ0ZXIoX19rLCBlbmQoKSk7CisgICAgICBlbHNlCisJX01fZGVmYXVsdF9pbnNlcnRfYWZ0ZXIoX19rLCBfX3N6IC0gX19sZW4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKKyAgICB7CisgICAgICBpdGVyYXRvciBfX2sgPSBiZWZvcmVfYmVnaW4oKTsKKworICAgICAgc2l6ZV90eXBlIF9fbGVuID0gMDsKKyAgICAgIHdoaWxlIChfX2suX01fbmV4dCgpICE9IGVuZCgpICYmIF9fbGVuIDwgX19zeikKKyAgICAgICAgeworICAgICAgICAgICsrX19rOworICAgICAgICAgICsrX19sZW47CisgICAgICAgIH0KKyAgICAgIGlmIChfX2xlbiA9PSBfX3N6KQorICAgICAgICBlcmFzZV9hZnRlcihfX2ssIGVuZCgpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgaW5zZXJ0X2FmdGVyKF9faywgX19zeiAtIF9fbGVuLCBfX3ZhbCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgX01fc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLAorCQkgICAgY29uc3RfaXRlcmF0b3IgX19iZWZvcmUsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBfTm9kZV9iYXNlKiBfX3RtcCA9IGNvbnN0X2Nhc3Q8X05vZGVfYmFzZSo+KF9fcG9zLl9NX25vZGUpOworICAgICAgX05vZGVfYmFzZSogX19iID0gY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4oX19iZWZvcmUuX01fbm9kZSk7CisgICAgICBfTm9kZV9iYXNlKiBfX2VuZCA9IF9fYjsKKworICAgICAgd2hpbGUgKF9fZW5kICYmIF9fZW5kLT5fTV9uZXh0ICE9IF9fbGFzdC5fTV9ub2RlKQorCV9fZW5kID0gX19lbmQtPl9NX25leHQ7CisKKyAgICAgIGlmIChfX2IgIT0gX19lbmQpCisJcmV0dXJuIGl0ZXJhdG9yKF9fdG1wLT5fTV90cmFuc2Zlcl9hZnRlcihfX2IsIF9fZW5kKSk7ICAgICAgCisgICAgICBlbHNlCisJcmV0dXJuIGl0ZXJhdG9yKF9fdG1wKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgZm9yd2FyZF9saXN0JiYsCisJCSBjb25zdF9pdGVyYXRvciBfX2kpCisgICAgeworICAgICAgY29uc3RfaXRlcmF0b3IgX19qID0gX19pOworICAgICAgKytfX2o7CisKKyAgICAgIGlmIChfX3BvcyA9PSBfX2kgfHwgX19wb3MgPT0gX19qKQorCXJldHVybjsKKworICAgICAgX05vZGVfYmFzZSogX190bXAgPSBjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPihfX3Bvcy5fTV9ub2RlKTsKKyAgICAgIF9fdG1wLT5fTV90cmFuc2Zlcl9hZnRlcihjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPihfX2kuX01fbm9kZSksCisJCQkgICAgICAgY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4oX19qLl9NX25vZGUpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpCisgICAgeworICAgICAgaWYgKF9fbikKKwl7CisJICBmb3J3YXJkX2xpc3QgX190bXAoX19uLCBfX3ZhbCwgZ2V0X2FsbG9jYXRvcigpKTsKKwkgIHJldHVybiBfTV9zcGxpY2VfYWZ0ZXIoX19wb3MsIF9fdG1wLmJlZm9yZV9iZWdpbigpLCBfX3RtcC5lbmQoKSk7CisJfQorICAgICAgZWxzZQorCXJldHVybiBpdGVyYXRvcihjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPihfX3Bvcy5fTV9ub2RlKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZT4KKyAgICAgIHR5cGVuYW1lIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywKKwkJICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCWZvcndhcmRfbGlzdCBfX3RtcChfX2ZpcnN0LCBfX2xhc3QsIGdldF9hbGxvY2F0b3IoKSk7CisJaWYgKCFfX3RtcC5lbXB0eSgpKQorCSAgcmV0dXJuIF9NX3NwbGljZV9hZnRlcihfX3BvcywgX190bXAuYmVmb3JlX2JlZ2luKCksIF9fdG1wLmVuZCgpKTsKKwllbHNlCisJICByZXR1cm4gaXRlcmF0b3IoY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4oX19wb3MuX01fbm9kZSkpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICByZW1vdmUoY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisgICAgICBfTm9kZSogX19jdXJyID0gc3RhdGljX2Nhc3Q8X05vZGUqPigmdGhpcy0+X01faW1wbC5fTV9oZWFkKTsKKyAgICAgIF9Ob2RlKiBfX2V4dHJhID0gMDsKKworICAgICAgd2hpbGUgKF9Ob2RlKiBfX3RtcCA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19jdXJyLT5fTV9uZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgqX190bXAtPl9NX3ZhbHB0cigpID09IF9fdmFsKQorCSAgICB7CisJICAgICAgaWYgKF9fdG1wLT5fTV92YWxwdHIoKSAhPSBzdGQ6Ol9fYWRkcmVzc29mKF9fdmFsKSkKKwkJeworCQkgIHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fY3Vycik7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBlbHNlCisJCV9fZXh0cmEgPSBfX2N1cnI7CisJICAgIH0KKwkgIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19jdXJyLT5fTV9uZXh0KTsKKyAgICAgICAgfQorCisgICAgICBpZiAoX19leHRyYSkKKwl0aGlzLT5fTV9lcmFzZV9hZnRlcihfX2V4dHJhKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWQ+CisgICAgICB2b2lkCisgICAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICAgIHJlbW92ZV9pZihfUHJlZCBfX3ByZWQpCisgICAgICB7CisJX05vZGUqIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oJnRoaXMtPl9NX2ltcGwuX01faGVhZCk7CisgICAgICAgIHdoaWxlIChfTm9kZSogX190bXAgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fY3Vyci0+X01fbmV4dCkpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fcHJlZCgqX190bXAtPl9NX3ZhbHB0cigpKSkKKyAgICAgICAgICAgICAgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19jdXJyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgX19jdXJyID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfX2N1cnItPl9NX25leHQpOworICAgICAgICAgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmluUHJlZD4KKyAgICAgIHZvaWQKKyAgICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgICAgdW5pcXVlKF9CaW5QcmVkIF9fYmluYXJ5X3ByZWQpCisgICAgICB7CisgICAgICAgIGl0ZXJhdG9yIF9fZmlyc3QgPSBiZWdpbigpOworICAgICAgICBpdGVyYXRvciBfX2xhc3QgPSBlbmQoKTsKKyAgICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICAgICAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkKKyAgICAgICAgICAgIGVyYXNlX2FmdGVyKF9fZmlyc3QpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fZmlyc3QgPSBfX25leHQ7CisgICAgICAgICAgX19uZXh0ID0gX19maXJzdDsKKyAgICAgICAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db21wPgorICAgICAgdm9pZAorICAgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgICBtZXJnZShmb3J3YXJkX2xpc3QmJiBfX2xpc3QsIF9Db21wIF9fY29tcCkKKyAgICAgIHsKKyAgICAgICAgX05vZGVfYmFzZSogX19ub2RlID0gJnRoaXMtPl9NX2ltcGwuX01faGVhZDsKKyAgICAgICAgd2hpbGUgKF9fbm9kZS0+X01fbmV4dCAmJiBfX2xpc3QuX01faW1wbC5fTV9oZWFkLl9NX25leHQpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fY29tcCgqc3RhdGljX2Nhc3Q8X05vZGUqPgorICAgICAgICAgICAgICAgICAgICAgICAoX19saXN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0KS0+X01fdmFscHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxfTm9kZSo+CisgICAgICAgICAgICAgICAgICAgICAgIChfX25vZGUtPl9NX25leHQpLT5fTV92YWxwdHIoKSkpCisgICAgICAgICAgICAgIF9fbm9kZS0+X01fdHJhbnNmZXJfYWZ0ZXIoJl9fbGlzdC5fTV9pbXBsLl9NX2hlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19saXN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0KTsKKyAgICAgICAgICAgIF9fbm9kZSA9IF9fbm9kZS0+X01fbmV4dDsKKyAgICAgICAgICB9CisgICAgICAgIGlmIChfX2xpc3QuX01faW1wbC5fTV9oZWFkLl9NX25leHQpCisgICAgICAgICAgeworICAgICAgICAgICAgX19ub2RlLT5fTV9uZXh0ID0gX19saXN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0OworICAgICAgICAgICAgX19saXN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0ID0gMDsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeworICAgICAgLy8gIFdlIGRvbid0IGhhdmUgc2l6ZSgpIHNvIHdlIG5lZWQgdG8gd2FsayB0aHJvdWdoIGJvdGggbGlzdHMKKyAgICAgIC8vICBtYWtpbmcgc3VyZSBib3RoIGl0ZXJhdG9ycyBhcmUgdmFsaWQuCisgICAgICBhdXRvIF9faXggPSBfX2x4LmNiZWdpbigpOworICAgICAgYXV0byBfX2l5ID0gX19seS5jYmVnaW4oKTsKKyAgICAgIHdoaWxlIChfX2l4ICE9IF9fbHguY2VuZCgpICYmIF9faXkgIT0gX19seS5jZW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKl9faXggIT0gKl9faXkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgKytfX2l4OworICAgICAgICAgICsrX19peTsKKyAgICAgICAgfQorICAgICAgaWYgKF9faXggPT0gX19seC5jZW5kKCkgJiYgX19peSA9PSBfX2x5LmNlbmQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbXA+CisgICAgICB2b2lkCisgICAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICAgIHNvcnQoX0NvbXAgX19jb21wKQorICAgICAgeworICAgICAgICAvLyBJZiBgbmV4dCcgaXMgMCwgcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgICAgICBfTm9kZSogX19saXN0ID0gc3RhdGljX2Nhc3Q8X05vZGUqPih0aGlzLT5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCk7CisgICAgICAgIGlmICghX19saXN0KQorICAgICAgICAgIHJldHVybjsKKworICAgICAgICB1bnNpZ25lZCBsb25nIF9faW5zaXplID0gMTsKKworICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfTm9kZSogX19wID0gX19saXN0OworICAgICAgICAgICAgX19saXN0ID0gMDsKKyAgICAgICAgICAgIF9Ob2RlKiBfX3RhaWwgPSAwOworCisgICAgICAgICAgICAvLyBDb3VudCBudW1iZXIgb2YgbWVyZ2VzIHdlIGRvIGluIHRoaXMgcGFzcy4KKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgX19ubWVyZ2VzID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKF9fcCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrX19ubWVyZ2VzOworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGV4aXN0cyBhIG1lcmdlIHRvIGJlIGRvbmUuCisgICAgICAgICAgICAgICAgLy8gU3RlcCBgaW5zaXplJyBwbGFjZXMgYWxvbmcgZnJvbSBwLgorICAgICAgICAgICAgICAgIF9Ob2RlKiBfX3EgPSBfX3A7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBfX3BzaXplID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGxvbmcgX19pID0gMDsgX19pIDwgX19pbnNpemU7ICsrX19pKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK19fcHNpemU7CisgICAgICAgICAgICAgICAgICAgIF9fcSA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19xLT5fTV9uZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfX3EpCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJZiBxIGhhc24ndCBmYWxsZW4gb2ZmIGVuZCwgd2UgaGF2ZSB0d28gbGlzdHMgdG8gbWVyZ2UuCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBfX3FzaXplID0gX19pbnNpemU7CisKKyAgICAgICAgICAgICAgICAvLyBOb3cgd2UgaGF2ZSB0d28gbGlzdHM7IG1lcmdlIHRoZW0uCisgICAgICAgICAgICAgICAgd2hpbGUgKF9fcHNpemUgPiAwIHx8IChfX3FzaXplID4gMCAmJiBfX3EpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBEZWNpZGUgd2hldGhlciBuZXh0IG5vZGUgb2YgbWVyZ2UgY29tZXMgZnJvbSBwIG9yIHEuCisgICAgICAgICAgICAgICAgICAgIF9Ob2RlKiBfX2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX3BzaXplID09IDApCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcCBpcyBlbXB0eTsgZSBtdXN0IGNvbWUgZnJvbSBxLgorICAgICAgICAgICAgICAgICAgICAgICAgX19lID0gX19xOworICAgICAgICAgICAgICAgICAgICAgICAgX19xID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfX3EtPl9NX25leHQpOworICAgICAgICAgICAgICAgICAgICAgICAgLS1fX3FzaXplOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX19xc2l6ZSA9PSAwIHx8ICFfX3EpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcSBpcyBlbXB0eTsgZSBtdXN0IGNvbWUgZnJvbSBwLgorICAgICAgICAgICAgICAgICAgICAgICAgX19lID0gX19wOworICAgICAgICAgICAgICAgICAgICAgICAgX19wID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfX3AtPl9NX25leHQpOworICAgICAgICAgICAgICAgICAgICAgICAgLS1fX3BzaXplOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX19jb21wKCpfX3AtPl9NX3ZhbHB0cigpLCAqX19xLT5fTV92YWxwdHIoKSkpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3Qgbm9kZSBvZiBwIGlzIGxvd2VyOyBlIG11c3QgY29tZSBmcm9tIHAuCisgICAgICAgICAgICAgICAgICAgICAgICBfX2UgPSBfX3A7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3AgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fcC0+X01fbmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAtLV9fcHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3Qgbm9kZSBvZiBxIGlzIGxvd2VyOyBlIG11c3QgY29tZSBmcm9tIHEuCisgICAgICAgICAgICAgICAgICAgICAgICBfX2UgPSBfX3E7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3EgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fcS0+X01fbmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAtLV9fcXNpemU7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV4dCBub2RlIHRvIHRoZSBtZXJnZWQgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fdGFpbCkKKyAgICAgICAgICAgICAgICAgICAgICBfX3RhaWwtPl9NX25leHQgPSBfX2U7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBfX2xpc3QgPSBfX2U7CisgICAgICAgICAgICAgICAgICAgIF9fdGFpbCA9IF9fZTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE5vdyBwIGhhcyBzdGVwcGVkIGBpbnNpemUnIHBsYWNlcyBhbG9uZywgYW5kIHEgaGFzIHRvby4KKyAgICAgICAgICAgICAgICBfX3AgPSBfX3E7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fdGFpbC0+X01fbmV4dCA9IDA7CisKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgZG9uZSBvbmx5IG9uZSBtZXJnZSwgd2UncmUgZmluaXNoZWQuCisgICAgICAgICAgICAvLyBBbGxvdyBmb3Igbm1lcmdlcyA9PSAwLCB0aGUgZW1wdHkgbGlzdCBjYXNlLgorICAgICAgICAgICAgaWYgKF9fbm1lcmdlcyA8PSAxKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQgPSBfX2xpc3Q7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSByZXBlYXQsIG1lcmdpbmcgbGlzdHMgdHdpY2UgdGhlIHNpemUuCisgICAgICAgICAgICBfX2luc2l6ZSAqPSAyOworICAgICAgICAgIH0KKyAgICAgIH0KKyAKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9GT1JXQVJEX0xJU1RfVENDICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9mc3RyZWFtLnRjYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9mc3RyZWFtLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODNhNTc2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2ZzdHJlYW0udGNjCkBAIC0wLDAgKzEsOTgyIEBACisvLyBGaWxlIGJhc2VkIHN0cmVhbXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvZnN0cmVhbS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtmc3RyZWFtfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy44ICBGaWxlLWJhc2VkIHN0cmVhbXMKKy8vCisKKyNpZm5kZWYgX0ZTVFJFQU1fVENDCisjZGVmaW5lIF9GU1RSRUFNX1RDQyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvY3h4YWJpX2ZvcmNlZC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIF9NX2FsbG9jYXRlX2ludGVybmFsX2J1ZmZlcigpCisgICAgeworICAgICAgLy8gQWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVyIG9ubHkgaWYgb25lIGRvZXNuJ3QgYWxyZWFkeSBleGlzdAorICAgICAgLy8gKGVpdGhlciBhbGxvY2F0ZWQgb3IgcHJvdmlkZWQgYnkgdGhlIHVzZXIgdmlhIHNldGJ1ZikuCisgICAgICBpZiAoIV9NX2J1Zl9hbGxvY2F0ZWQgJiYgIV9NX2J1ZikKKwl7CisJICBfTV9idWYgPSBuZXcgY2hhcl90eXBlW19NX2J1Zl9zaXplXTsKKwkgIF9NX2J1Zl9hbGxvY2F0ZWQgPSB0cnVlOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIF9NX2Rlc3Ryb3lfaW50ZXJuYWxfYnVmZmVyKCkgdGhyb3coKQorICAgIHsKKyAgICAgIGlmIChfTV9idWZfYWxsb2NhdGVkKQorCXsKKwkgIGRlbGV0ZSBbXSBfTV9idWY7CisJICBfTV9idWYgPSAwOworCSAgX01fYnVmX2FsbG9jYXRlZCA9IGZhbHNlOworCX0KKyAgICAgIGRlbGV0ZSBbXSBfTV9leHRfYnVmOworICAgICAgX01fZXh0X2J1ZiA9IDA7CisgICAgICBfTV9leHRfYnVmX3NpemUgPSAwOworICAgICAgX01fZXh0X25leHQgPSAwOworICAgICAgX01fZXh0X2VuZCA9IDA7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGJhc2ljX2ZpbGVidWYoKSA6IF9fc3RyZWFtYnVmX3R5cGUoKSwgX01fbG9jaygpLCBfTV9maWxlKCZfTV9sb2NrKSwKKyAgICBfTV9tb2RlKGlvc19iYXNlOjpvcGVubW9kZSgwKSksIF9NX3N0YXRlX2JlZygpLCBfTV9zdGF0ZV9jdXIoKSwKKyAgICBfTV9zdGF0ZV9sYXN0KCksIF9NX2J1ZigwKSwgX01fYnVmX3NpemUoQlVGU0laKSwKKyAgICBfTV9idWZfYWxsb2NhdGVkKGZhbHNlKSwgX01fcmVhZGluZyhmYWxzZSksIF9NX3dyaXRpbmcoZmFsc2UpLCBfTV9wYmFjaygpLCAKKyAgICBfTV9wYmFja19jdXJfc2F2ZSgwKSwgX01fcGJhY2tfZW5kX3NhdmUoMCksIF9NX3BiYWNrX2luaXQoZmFsc2UpLAorICAgIF9NX2NvZGVjdnQoMCksIF9NX2V4dF9idWYoMCksIF9NX2V4dF9idWZfc2l6ZSgwKSwgX01fZXh0X25leHQoMCksCisgICAgX01fZXh0X2VuZCgwKQorICAgIHsKKyAgICAgIGlmIChoYXNfZmFjZXQ8X19jb2RlY3Z0X3R5cGU+KHRoaXMtPl9NX2J1Zl9sb2NhbGUpKQorCV9NX2NvZGVjdnQgPSAmdXNlX2ZhY2V0PF9fY29kZWN2dF90eXBlPih0aGlzLT5fTV9idWZfbG9jYWxlKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6X19maWxlYnVmX3R5cGUqCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBvcGVuKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKKyAgICB7CisgICAgICBfX2ZpbGVidWZfdHlwZSAqX19yZXQgPSAwOworICAgICAgaWYgKCF0aGlzLT5pc19vcGVuKCkpCisJeworCSAgX01fZmlsZS5vcGVuKF9fcywgX19tb2RlKTsKKwkgIGlmICh0aGlzLT5pc19vcGVuKCkpCisJICAgIHsKKwkgICAgICBfTV9hbGxvY2F0ZV9pbnRlcm5hbF9idWZmZXIoKTsKKwkgICAgICBfTV9tb2RlID0gX19tb2RlOworCisJICAgICAgLy8gU2V0dXAgaW5pdGlhbCBidWZmZXIgdG8gJ3VuY29tbWl0dGVkJyBtb2RlLgorCSAgICAgIF9NX3JlYWRpbmcgPSBmYWxzZTsKKwkgICAgICBfTV93cml0aW5nID0gZmFsc2U7CisJICAgICAgX01fc2V0X2J1ZmZlcigtMSk7CisKKwkgICAgICAvLyBSZXNldCB0byBpbml0aWFsIHN0YXRlLgorCSAgICAgIF9NX3N0YXRlX2xhc3QgPSBfTV9zdGF0ZV9jdXIgPSBfTV9zdGF0ZV9iZWc7CisKKwkgICAgICAvLyAyNy44LjEuMyw0CisJICAgICAgaWYgKChfX21vZGUgJiBpb3NfYmFzZTo6YXRlKQorCQkgICYmIHRoaXMtPnNlZWtvZmYoMCwgaW9zX2Jhc2U6OmVuZCwgX19tb2RlKQorCQkgID09IHBvc190eXBlKG9mZl90eXBlKC0xKSkpCisJCXRoaXMtPmNsb3NlKCk7CisJICAgICAgZWxzZQorCQlfX3JldCA9IHRoaXM7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9fZmlsZWJ1Zl90eXBlKgorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgY2xvc2UoKQorICAgIHsKKyAgICAgIGlmICghdGhpcy0+aXNfb3BlbigpKQorCXJldHVybiAwOworCisgICAgICBib29sIF9fdGVzdGZhaWwgPSBmYWxzZTsKKyAgICAgIHsKKwkvLyBOQjogRG8gdGhpcyBoZXJlIHNvIHRoYXQgcmUtb3BlbmVkIGZpbGVidWZzIHdpbGwgYmUgY29vbC4uLgorCXN0cnVjdCBfX2Nsb3NlX3NlbnRyeQorCXsKKwkgIGJhc2ljX2ZpbGVidWYgKl9fZmI7CisJICBfX2Nsb3NlX3NlbnRyeSAoYmFzaWNfZmlsZWJ1ZiAqX19mYmkpOiBfX2ZiKF9fZmJpKSB7IH0KKwkgIH5fX2Nsb3NlX3NlbnRyeSAoKQorCSAgeworCSAgICBfX2ZiLT5fTV9tb2RlID0gaW9zX2Jhc2U6Om9wZW5tb2RlKDApOworCSAgICBfX2ZiLT5fTV9wYmFja19pbml0ID0gZmFsc2U7CisJICAgIF9fZmItPl9NX2Rlc3Ryb3lfaW50ZXJuYWxfYnVmZmVyKCk7CisJICAgIF9fZmItPl9NX3JlYWRpbmcgPSBmYWxzZTsKKwkgICAgX19mYi0+X01fd3JpdGluZyA9IGZhbHNlOworCSAgICBfX2ZiLT5fTV9zZXRfYnVmZmVyKC0xKTsKKwkgICAgX19mYi0+X01fc3RhdGVfbGFzdCA9IF9fZmItPl9NX3N0YXRlX2N1ciA9IF9fZmItPl9NX3N0YXRlX2JlZzsKKwkgIH0KKwl9IF9fY3MgKHRoaXMpOworCisJX190cnkKKwkgIHsKKwkgICAgaWYgKCFfTV90ZXJtaW5hdGVfb3V0cHV0KCkpCisJICAgICAgX190ZXN0ZmFpbCA9IHRydWU7CisJICB9CisJX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgeworCSAgICBfTV9maWxlLmNsb3NlKCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeyBfX3Rlc3RmYWlsID0gdHJ1ZTsgfQorICAgICAgfQorCisgICAgICBpZiAoIV9NX2ZpbGUuY2xvc2UoKSkKKwlfX3Rlc3RmYWlsID0gdHJ1ZTsKKworICAgICAgaWYgKF9fdGVzdGZhaWwpCisJcmV0dXJuIDA7CisgICAgICBlbHNlCisJcmV0dXJuIHRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJlYW1zaXplCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzaG93bWFueWMoKQorICAgIHsKKyAgICAgIHN0cmVhbXNpemUgX19yZXQgPSAtMTsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0aW4gPSBfTV9tb2RlICYgaW9zX2Jhc2U6OmluOworICAgICAgaWYgKF9fdGVzdGluICYmIHRoaXMtPmlzX29wZW4oKSkKKwl7CisJICAvLyBGb3IgYSBzdGF0ZWZ1bCBlbmNvZGluZyAoLTEpIHRoZSBwZW5kaW5nIHNlcXVlbmNlIG1pZ2h0IGJlIGp1c3QKKwkgIC8vIHNoaWZ0IGFuZCB1bnNoaWZ0IHByZWZpeGVzIHdpdGggbm8gYWN0dWFsIGNoYXJhY3Rlci4KKwkgIF9fcmV0ID0gdGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKTsKKworI2lmIF9HTElCQ1hYX0hBVkVfRE9TX0JBU0VEX0ZJTEVTWVNURU0KKwkgIC8vIEFib3V0IHRoaXMgd29ya2Fyb3VuZCwgc2VlIGxpYnN0ZGMrKy8yMDgwNi4KKwkgIGNvbnN0IGJvb2wgX190ZXN0YmluYXJ5ID0gX01fbW9kZSAmIGlvc19iYXNlOjpiaW5hcnk7CisJICBpZiAoX19jaGVja19mYWNldChfTV9jb2RlY3Z0KS5lbmNvZGluZygpID49IDAKKwkgICAgICAmJiBfX3Rlc3RiaW5hcnkpCisjZWxzZQorCSAgaWYgKF9fY2hlY2tfZmFjZXQoX01fY29kZWN2dCkuZW5jb2RpbmcoKSA+PSAwKQorI2VuZGlmCisJICAgIF9fcmV0ICs9IF9NX2ZpbGUuc2hvd21hbnljKCkgLyBfTV9jb2RlY3Z0LT5tYXhfbGVuZ3RoKCk7CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgdW5kZXJmbG93KCkKKyAgICB7CisgICAgICBpbnRfdHlwZSBfX3JldCA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0aW4gPSBfTV9tb2RlICYgaW9zX2Jhc2U6OmluOworICAgICAgaWYgKF9fdGVzdGluKQorCXsKKwkgIGlmIChfTV93cml0aW5nKQorCSAgICB7CisJICAgICAgaWYgKG92ZXJmbG93KCkgPT0gdHJhaXRzX3R5cGU6OmVvZigpKQorCQlyZXR1cm4gX19yZXQ7CisJICAgICAgX01fc2V0X2J1ZmZlcigtMSk7CisJICAgICAgX01fd3JpdGluZyA9IGZhbHNlOworCSAgICB9CisJICAvLyBDaGVjayBmb3IgcGJhY2sgbWFkbmVzcywgYW5kIGlmIHNvIHN3aXRjaCBiYWNrIHRvIHRoZQorCSAgLy8gbm9ybWFsIGJ1ZmZlcnMgYW5kIGpldCBvdXR0YSBoZXJlIGJlZm9yZSBleHBlbnNpdmUKKwkgIC8vIGZpbGVvcHMgaGFwcGVuLi4uCisJICBfTV9kZXN0cm95X3BiYWNrKCk7CisKKwkgIGlmICh0aGlzLT5ncHRyKCkgPCB0aGlzLT5lZ3B0cigpKQorCSAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworCisJICAvLyBHZXQgYW5kIGNvbnZlcnQgaW5wdXQgc2VxdWVuY2UuCisJICBjb25zdCBzaXplX3QgX19idWZsZW4gPSBfTV9idWZfc2l6ZSA+IDEgPyBfTV9idWZfc2l6ZSAtIDEgOiAxOworCisJICAvLyBXaWxsIGJlIHNldCB0byB0cnVlIGlmIDo6cmVhZCgpIHJldHVybnMgMCBpbmRpY2F0aW5nIEVPRi4KKwkgIGJvb2wgX19nb3RfZW9mID0gZmFsc2U7CisJICAvLyBOdW1iZXIgb2YgaW50ZXJuYWwgY2hhcmFjdGVycyBwcm9kdWNlZC4KKwkgIHN0cmVhbXNpemUgX19pbGVuID0gMDsKKwkgIGNvZGVjdnRfYmFzZTo6cmVzdWx0IF9fciA9IGNvZGVjdnRfYmFzZTo6b2s7CisJICBpZiAoX19jaGVja19mYWNldChfTV9jb2RlY3Z0KS5hbHdheXNfbm9jb252KCkpCisJICAgIHsKKwkgICAgICBfX2lsZW4gPSBfTV9maWxlLnhzZ2V0bihyZWludGVycHJldF9jYXN0PGNoYXIqPih0aGlzLT5lYmFjaygpKSwKKwkJCQkgICAgICBfX2J1Zmxlbik7CisJICAgICAgaWYgKF9faWxlbiA9PSAwKQorCQlfX2dvdF9lb2YgPSB0cnVlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKyAgICAgICAgICAgICAgLy8gV29yc3QtY2FzZSBudW1iZXIgb2YgZXh0ZXJuYWwgYnl0ZXMuCisJICAgICAgLy8gWFhYIE5vdCBkb25lIGVuY29kaW5nKCkgPT0gLTEuCisJICAgICAgY29uc3QgaW50IF9fZW5jID0gX01fY29kZWN2dC0+ZW5jb2RpbmcoKTsKKwkgICAgICBzdHJlYW1zaXplIF9fYmxlbjsgLy8gTWluaW11bSBidWZmZXIgc2l6ZS4KKwkgICAgICBzdHJlYW1zaXplIF9fcmxlbjsgLy8gTnVtYmVyIG9mIGNoYXJzIHRvIHJlYWQuCisJICAgICAgaWYgKF9fZW5jID4gMCkKKwkJX19ibGVuID0gX19ybGVuID0gX19idWZsZW4gKiBfX2VuYzsKKwkgICAgICBlbHNlCisJCXsKKwkJICBfX2JsZW4gPSBfX2J1ZmxlbiArIF9NX2NvZGVjdnQtPm1heF9sZW5ndGgoKSAtIDE7CisJCSAgX19ybGVuID0gX19idWZsZW47CisJCX0KKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fcmVtYWluZGVyID0gX01fZXh0X2VuZCAtIF9NX2V4dF9uZXh0OworCSAgICAgIF9fcmxlbiA9IF9fcmxlbiA+IF9fcmVtYWluZGVyID8gX19ybGVuIC0gX19yZW1haW5kZXIgOiAwOworCisJICAgICAgLy8gQW4gaW1idWUgaW4gJ3JlYWQnIG1vZGUgaW1wbGllcyBmaXJzdCBjb252ZXJ0aW5nIHRoZSBleHRlcm5hbAorCSAgICAgIC8vIGNoYXJzIGFscmVhZHkgcHJlc2VudC4KKwkgICAgICBpZiAoX01fcmVhZGluZyAmJiB0aGlzLT5lZ3B0cigpID09IHRoaXMtPmViYWNrKCkgJiYgX19yZW1haW5kZXIpCisJCV9fcmxlbiA9IDA7CisKKwkgICAgICAvLyBBbGxvY2F0ZSBidWZmZXIgaWYgbmVjZXNzYXJ5IGFuZCBtb3ZlIHVuY29udmVydGVkCisJICAgICAgLy8gYnl0ZXMgdG8gZnJvbnQuCisJICAgICAgaWYgKF9NX2V4dF9idWZfc2l6ZSA8IF9fYmxlbikKKwkJeworCQkgIGNoYXIqIF9fYnVmID0gbmV3IGNoYXJbX19ibGVuXTsKKwkJICBpZiAoX19yZW1haW5kZXIpCisJCSAgICBfX2J1aWx0aW5fbWVtY3B5KF9fYnVmLCBfTV9leHRfbmV4dCwgX19yZW1haW5kZXIpOworCisJCSAgZGVsZXRlIFtdIF9NX2V4dF9idWY7CisJCSAgX01fZXh0X2J1ZiA9IF9fYnVmOworCQkgIF9NX2V4dF9idWZfc2l6ZSA9IF9fYmxlbjsKKwkJfQorCSAgICAgIGVsc2UgaWYgKF9fcmVtYWluZGVyKQorCQlfX2J1aWx0aW5fbWVtbW92ZShfTV9leHRfYnVmLCBfTV9leHRfbmV4dCwgX19yZW1haW5kZXIpOworCisJICAgICAgX01fZXh0X25leHQgPSBfTV9leHRfYnVmOworCSAgICAgIF9NX2V4dF9lbmQgPSBfTV9leHRfYnVmICsgX19yZW1haW5kZXI7CisJICAgICAgX01fc3RhdGVfbGFzdCA9IF9NX3N0YXRlX2N1cjsKKworCSAgICAgIGRvCisJCXsKKwkJICBpZiAoX19ybGVuID4gMCkKKwkJICAgIHsKKwkJICAgICAgLy8gU2FuaXR5IGNoZWNrIQorCQkgICAgICAvLyBUaGlzIG1heSBmYWlsIGlmIHRoZSByZXR1cm4gdmFsdWUgb2YKKwkJICAgICAgLy8gY29kZWN2dDo6bWF4X2xlbmd0aCgpIGlzIGJvZ3VzLgorCQkgICAgICBpZiAoX01fZXh0X2VuZCAtIF9NX2V4dF9idWYgKyBfX3JsZW4gPiBfTV9leHRfYnVmX3NpemUpCisJCQl7CisJCQkgIF9fdGhyb3dfaW9zX2ZhaWx1cmUoX19OKCJiYXNpY19maWxlYnVmOjp1bmRlcmZsb3cgIgorCQkJCQkgICAgICAiY29kZWN2dDo6bWF4X2xlbmd0aCgpICIKKwkJCQkJICAgICAgImlzIG5vdCB2YWxpZCIpKTsKKwkJCX0KKwkJICAgICAgc3RyZWFtc2l6ZSBfX2VsZW4gPSBfTV9maWxlLnhzZ2V0bihfTV9leHRfZW5kLCBfX3JsZW4pOworCQkgICAgICBpZiAoX19lbGVuID09IDApCisJCQlfX2dvdF9lb2YgPSB0cnVlOworCQkgICAgICBlbHNlIGlmIChfX2VsZW4gPT0gLTEpCisJCQlicmVhazsKKwkJICAgICAgX01fZXh0X2VuZCArPSBfX2VsZW47CisJCSAgICB9CisKKwkJICBjaGFyX3R5cGUqIF9faWVuZCA9IHRoaXMtPmViYWNrKCk7CisJCSAgaWYgKF9NX2V4dF9uZXh0IDwgX01fZXh0X2VuZCkKKwkJICAgIF9fciA9IF9NX2NvZGVjdnQtPmluKF9NX3N0YXRlX2N1ciwgX01fZXh0X25leHQsCisJCQkJCSBfTV9leHRfZW5kLCBfTV9leHRfbmV4dCwKKwkJCQkJIHRoaXMtPmViYWNrKCksCisJCQkJCSB0aGlzLT5lYmFjaygpICsgX19idWZsZW4sIF9faWVuZCk7CisJCSAgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6Om5vY29udikKKwkJICAgIHsKKwkJICAgICAgc2l6ZV90IF9fYXZhaWwgPSBfTV9leHRfZW5kIC0gX01fZXh0X2J1ZjsKKwkJICAgICAgX19pbGVuID0gc3RkOjptaW4oX19hdmFpbCwgX19idWZsZW4pOworCQkgICAgICB0cmFpdHNfdHlwZTo6Y29weSh0aGlzLT5lYmFjaygpLAorCQkJCQlyZWludGVycHJldF9jYXN0PGNoYXJfdHlwZSo+CisJCQkJCShfTV9leHRfYnVmKSwgX19pbGVuKTsKKwkJICAgICAgX01fZXh0X25leHQgPSBfTV9leHRfYnVmICsgX19pbGVuOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIF9faWxlbiA9IF9faWVuZCAtIHRoaXMtPmViYWNrKCk7CisKKwkJICAvLyBfTV9jb2RlY3Z0LT5pbiBtYXkgcmV0dXJuIGVycm9yIHdoaWxlIF9faWxlbiA+IDA6IHRoaXMgaXMKKwkJICAvLyBvaywgYW5kIGFjdHVhbGx5IG9jY3VycyBpbiBjYXNlIG9mIG1peGVkIGVuY29kaW5ncyAoZS5nLiwKKwkJICAvLyBYTUwgZmlsZXMpLgorCQkgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjplcnJvcikKKwkJICAgIGJyZWFrOworCisJCSAgX19ybGVuID0gMTsKKwkJfQorCSAgICAgIHdoaWxlIChfX2lsZW4gPT0gMCAmJiAhX19nb3RfZW9mKTsKKwkgICAgfQorCisJICBpZiAoX19pbGVuID4gMCkKKwkgICAgeworCSAgICAgIF9NX3NldF9idWZmZXIoX19pbGVuKTsKKwkgICAgICBfTV9yZWFkaW5nID0gdHJ1ZTsKKwkgICAgICBfX3JldCA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqdGhpcy0+Z3B0cigpKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoX19nb3RfZW9mKQorCSAgICB7CisJICAgICAgLy8gSWYgdGhlIGFjdHVhbCBlbmQgb2YgZmlsZSBpcyByZWFjaGVkLCBzZXQgJ3VuY29tbWl0dGVkJworCSAgICAgIC8vIG1vZGUsIHRodXMgYWxsb3dpbmcgYW4gaW1tZWRpYXRlIHdyaXRlIHdpdGhvdXQgYW4KKwkgICAgICAvLyBpbnRlcnZlbmluZyBzZWVrLgorCSAgICAgIF9NX3NldF9idWZmZXIoLTEpOworCSAgICAgIF9NX3JlYWRpbmcgPSBmYWxzZTsKKwkgICAgICAvLyBIb3dldmVyLCByZWFjaGluZyBpdCB3aGlsZSBsb29waW5nIG9uIHBhcnRpYWwgbWVhbnMgdGhhdAorCSAgICAgIC8vIHRoZSBmaWxlIGhhcyBnb3QgYW4gaW5jb21wbGV0ZSBjaGFyYWN0ZXIuCisJICAgICAgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWwpCisJCV9fdGhyb3dfaW9zX2ZhaWx1cmUoX19OKCJiYXNpY19maWxlYnVmOjp1bmRlcmZsb3cgIgorCQkJCSAgICAiaW5jb21wbGV0ZSBjaGFyYWN0ZXIgaW4gZmlsZSIpKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6ZXJyb3IpCisJICAgIF9fdGhyb3dfaW9zX2ZhaWx1cmUoX19OKCJiYXNpY19maWxlYnVmOjp1bmRlcmZsb3cgIgorCQkJCSJpbnZhbGlkIGJ5dGUgc2VxdWVuY2UgaW4gZmlsZSIpKTsKKwkgIGVsc2UKKwkgICAgX190aHJvd19pb3NfZmFpbHVyZShfX04oImJhc2ljX2ZpbGVidWY6OnVuZGVyZmxvdyAiCisJCQkJImVycm9yIHJlYWRpbmcgdGhlIGZpbGUiKSk7CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgcGJhY2tmYWlsKGludF90eXBlIF9faSkKKyAgICB7CisgICAgICBpbnRfdHlwZSBfX3JldCA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0aW4gPSBfTV9tb2RlICYgaW9zX2Jhc2U6OmluOworICAgICAgaWYgKF9fdGVzdGluKQorCXsKKwkgIGlmIChfTV93cml0aW5nKQorCSAgICB7CisJICAgICAgaWYgKG92ZXJmbG93KCkgPT0gdHJhaXRzX3R5cGU6OmVvZigpKQorCQlyZXR1cm4gX19yZXQ7CisJICAgICAgX01fc2V0X2J1ZmZlcigtMSk7CisJICAgICAgX01fd3JpdGluZyA9IGZhbHNlOworCSAgICB9CisJICAvLyBSZW1lbWJlciB3aGV0aGVyIHRoZSBwYmFjayBidWZmZXIgaXMgYWN0aXZlLCBvdGhlcndpc2UgYmVsb3cKKwkgIC8vIHdlIG1heSB0cnkgdG8gc3RvcmUgaW4gaXQgYSBzZWNvbmQgY2hhciAobGlic3RkYysrLzk3NjEpLgorCSAgY29uc3QgYm9vbCBfX3Rlc3RwYiA9IF9NX3BiYWNrX2luaXQ7CisJICBjb25zdCBib29sIF9fdGVzdGVvZiA9IHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2ksIF9fcmV0KTsKKwkgIGludF90eXBlIF9fdG1wOworCSAgaWYgKHRoaXMtPmViYWNrKCkgPCB0aGlzLT5ncHRyKCkpCisJICAgIHsKKwkgICAgICB0aGlzLT5nYnVtcCgtMSk7CisJICAgICAgX190bXAgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKnRoaXMtPmdwdHIoKSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKHRoaXMtPnNlZWtvZmYoLTEsIGlvc19iYXNlOjpjdXIpICE9IHBvc190eXBlKG9mZl90eXBlKC0xKSkpCisJICAgIHsKKwkgICAgICBfX3RtcCA9IHRoaXMtPnVuZGVyZmxvdygpOworCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX190bXAsIF9fcmV0KSkKKwkJcmV0dXJuIF9fcmV0OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvLyBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIsIG5lZWQgdG8gbWFrZSBhCisJICAgICAgLy8gcHV0YmFjayBwb3NpdGlvbiBhdmFpbGFibGUuICBCdXQgdGhlIHNlZWsgbWF5IGZhaWwKKwkgICAgICAvLyAoZi5pLiwgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGZpbGUsIHNlZQorCSAgICAgIC8vIGxpYnN0ZGMrKy85NDM5KSBhbmQgaW4gdGhhdCBjYXNlIHdlIHJldHVybgorCSAgICAgIC8vIHRyYWl0c190eXBlOjplb2YoKS4KKwkgICAgICByZXR1cm4gX19yZXQ7CisJICAgIH0KKworCSAgLy8gVHJ5IHRvIHB1dCBiYWNrIF9faSBpbnRvIGlucHV0IHNlcXVlbmNlIGluIG9uZSBvZiB0aHJlZSB3YXlzLgorCSAgLy8gT3JkZXIgdGhlc2UgdGVzdHMgZG9uZSBpbiBpcyB1bnNwZWNpZmllZCBieSB0aGUgc3RhbmRhcmQuCisJICBpZiAoIV9fdGVzdGVvZiAmJiB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19pLCBfX3RtcCkpCisJICAgIF9fcmV0ID0gX19pOworCSAgZWxzZSBpZiAoX190ZXN0ZW9mKQorCSAgICBfX3JldCA9IHRyYWl0c190eXBlOjpub3RfZW9mKF9faSk7CisJICBlbHNlIGlmICghX190ZXN0cGIpCisJICAgIHsKKwkgICAgICBfTV9jcmVhdGVfcGJhY2soKTsKKwkgICAgICBfTV9yZWFkaW5nID0gdHJ1ZTsKKwkgICAgICAqdGhpcy0+Z3B0cigpID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2kpOworCSAgICAgIF9fcmV0ID0gX19pOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgb3ZlcmZsb3coaW50X3R5cGUgX19jKQorICAgIHsKKyAgICAgIGludF90eXBlIF9fcmV0ID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgY29uc3QgYm9vbCBfX3Rlc3Rlb2YgPSB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX3JldCk7CisgICAgICBjb25zdCBib29sIF9fdGVzdG91dCA9IF9NX21vZGUgJiBpb3NfYmFzZTo6b3V0OworICAgICAgaWYgKF9fdGVzdG91dCkKKwl7CisgICAgICAgICAgaWYgKF9NX3JlYWRpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9NX2Rlc3Ryb3lfcGJhY2soKTsKKyAgICAgICAgICAgICAgY29uc3QgaW50IF9fZ3B0cl9vZmYgPSBfTV9nZXRfZXh0X3BvcyhfTV9zdGF0ZV9sYXN0KTsKKyAgICAgICAgICAgICAgaWYgKF9NX3NlZWsoX19ncHRyX29mZiwgaW9zX2Jhc2U6OmN1ciwgX01fc3RhdGVfbGFzdCkKKyAgICAgICAgICAgICAgICAgID09IHBvc190eXBlKG9mZl90eXBlKC0xKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9fcmV0OworICAgICAgICAgICAgfQorCSAgaWYgKHRoaXMtPnBiYXNlKCkgPCB0aGlzLT5wcHRyKCkpCisJICAgIHsKKwkgICAgICAvLyBJZiBhcHByb3ByaWF0ZSwgYXBwZW5kIHRoZSBvdmVyZmxvdyBjaGFyLgorCSAgICAgIGlmICghX190ZXN0ZW9mKQorCQl7CisJCSAgKnRoaXMtPnBwdHIoKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKwkJICB0aGlzLT5wYnVtcCgxKTsKKwkJfQorCisJICAgICAgLy8gQ29udmVydCBwZW5kaW5nIHNlcXVlbmNlIHRvIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uLAorCSAgICAgIC8vIGFuZCBvdXRwdXQuCisJICAgICAgaWYgKF9NX2NvbnZlcnRfdG9fZXh0ZXJuYWwodGhpcy0+cGJhc2UoKSwKKwkJCQkJIHRoaXMtPnBwdHIoKSAtIHRoaXMtPnBiYXNlKCkpKQorCQl7CisJCSAgX01fc2V0X2J1ZmZlcigwKTsKKwkJICBfX3JldCA9IHRyYWl0c190eXBlOjpub3RfZW9mKF9fYyk7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoX01fYnVmX3NpemUgPiAxKQorCSAgICB7CisJICAgICAgLy8gT3ZlcmZsb3cgaW4gJ3VuY29tbWl0dGVkJyBtb2RlOiBzZXQgX01fd3JpdGluZywgc2V0CisJICAgICAgLy8gdGhlIGJ1ZmZlciB0byB0aGUgaW5pdGlhbCAnd3JpdGUnIG1vZGUsIGFuZCBwdXQgX19jCisJICAgICAgLy8gaW50byB0aGUgYnVmZmVyLgorCSAgICAgIF9NX3NldF9idWZmZXIoMCk7CisJICAgICAgX01fd3JpdGluZyA9IHRydWU7CisJICAgICAgaWYgKCFfX3Rlc3Rlb2YpCisJCXsKKwkJICAqdGhpcy0+cHB0cigpID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgIHRoaXMtPnBidW1wKDEpOworCQl9CisJICAgICAgX19yZXQgPSB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvLyBVbmJ1ZmZlcmVkLgorCSAgICAgIGNoYXJfdHlwZSBfX2NvbnYgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisJICAgICAgaWYgKF9fdGVzdGVvZiB8fCBfTV9jb252ZXJ0X3RvX2V4dGVybmFsKCZfX2NvbnYsIDEpKQorCQl7CisJCSAgX01fd3JpdGluZyA9IHRydWU7CisJCSAgX19yZXQgPSB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOworCQl9CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBib29sCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBfTV9jb252ZXJ0X3RvX2V4dGVybmFsKF9DaGFyVCogX19pYnVmLCBzdHJlYW1zaXplIF9faWxlbikKKyAgICB7CisgICAgICAvLyBTaXplcyBvZiBleHRlcm5hbCBhbmQgcGVuZGluZyBvdXRwdXQuCisgICAgICBzdHJlYW1zaXplIF9fZWxlbjsKKyAgICAgIHN0cmVhbXNpemUgX19wbGVuOworICAgICAgaWYgKF9fY2hlY2tfZmFjZXQoX01fY29kZWN2dCkuYWx3YXlzX25vY29udigpKQorCXsKKwkgIF9fZWxlbiA9IF9NX2ZpbGUueHNwdXRuKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9faWJ1ZiksIF9faWxlbik7CisJICBfX3BsZW4gPSBfX2lsZW47CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8vIFdvcnN0LWNhc2UgbnVtYmVyIG9mIGV4dGVybmFsIGJ5dGVzIG5lZWRlZC4KKwkgIC8vIFhYWCBOb3QgZG9uZSBlbmNvZGluZygpID09IC0xLgorCSAgc3RyZWFtc2l6ZSBfX2JsZW4gPSBfX2lsZW4gKiBfTV9jb2RlY3Z0LT5tYXhfbGVuZ3RoKCk7CisJICBjaGFyKiBfX2J1ZiA9IHN0YXRpY19jYXN0PGNoYXIqPihfX2J1aWx0aW5fYWxsb2NhKF9fYmxlbikpOworCisJICBjaGFyKiBfX2JlbmQ7CisJICBjb25zdCBjaGFyX3R5cGUqIF9faWVuZDsKKwkgIGNvZGVjdnRfYmFzZTo6cmVzdWx0IF9fcjsKKwkgIF9fciA9IF9NX2NvZGVjdnQtPm91dChfTV9zdGF0ZV9jdXIsIF9faWJ1ZiwgX19pYnVmICsgX19pbGVuLAorCQkJCV9faWVuZCwgX19idWYsIF9fYnVmICsgX19ibGVuLCBfX2JlbmQpOworCisJICBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6b2sgfHwgX19yID09IGNvZGVjdnRfYmFzZTo6cGFydGlhbCkKKwkgICAgX19ibGVuID0gX19iZW5kIC0gX19idWY7CisJICBlbHNlIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpub2NvbnYpCisJICAgIHsKKwkgICAgICAvLyBTYW1lIGFzIHRoZSBhbHdheXNfbm9jb252IGNhc2UgYWJvdmUuCisJICAgICAgX19idWYgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihfX2lidWYpOworCSAgICAgIF9fYmxlbiA9IF9faWxlbjsKKwkgICAgfQorCSAgZWxzZQorCSAgICBfX3Rocm93X2lvc19mYWlsdXJlKF9fTigiYmFzaWNfZmlsZWJ1Zjo6X01fY29udmVydF90b19leHRlcm5hbCAiCisJCQkJICAgICJjb252ZXJzaW9uIGVycm9yIikpOworICAKKwkgIF9fZWxlbiA9IF9NX2ZpbGUueHNwdXRuKF9fYnVmLCBfX2JsZW4pOworCSAgX19wbGVuID0gX19ibGVuOworCisJICAvLyBUcnkgb25jZSBtb3JlIGZvciBwYXJ0aWFsIGNvbnZlcnNpb25zLgorCSAgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWwgJiYgX19lbGVuID09IF9fcGxlbikKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19pcmVzdW1lID0gX19pZW5kOworCSAgICAgIHN0cmVhbXNpemUgX19ybGVuID0gdGhpcy0+cHB0cigpIC0gX19pZW5kOworCSAgICAgIF9fciA9IF9NX2NvZGVjdnQtPm91dChfTV9zdGF0ZV9jdXIsIF9faXJlc3VtZSwKKwkJCQkgICAgX19pcmVzdW1lICsgX19ybGVuLCBfX2llbmQsIF9fYnVmLAorCQkJCSAgICBfX2J1ZiArIF9fYmxlbiwgX19iZW5kKTsKKwkgICAgICBpZiAoX19yICE9IGNvZGVjdnRfYmFzZTo6ZXJyb3IpCisJCXsKKwkJICBfX3JsZW4gPSBfX2JlbmQgLSBfX2J1ZjsKKwkJICBfX2VsZW4gPSBfTV9maWxlLnhzcHV0bihfX2J1ZiwgX19ybGVuKTsKKwkJICBfX3BsZW4gPSBfX3JsZW47CisJCX0KKwkgICAgICBlbHNlCisJCV9fdGhyb3dfaW9zX2ZhaWx1cmUoX19OKCJiYXNpY19maWxlYnVmOjpfTV9jb252ZXJ0X3RvX2V4dGVybmFsICIKKwkJCQkJImNvbnZlcnNpb24gZXJyb3IiKSk7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19lbGVuID09IF9fcGxlbjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cmVhbXNpemUKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHhzZ2V0bihfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgLy8gQ2xlYXIgb3V0IHBiYWNrIGJ1ZmZlciBiZWZvcmUgZ29pbmcgb24gdG8gdGhlIHJlYWwgZGVhbC4uLgorICAgICAgc3RyZWFtc2l6ZSBfX3JldCA9IDA7CisgICAgICBpZiAoX01fcGJhY2tfaW5pdCkKKwl7CisJICBpZiAoX19uID4gMCAmJiB0aGlzLT5ncHRyKCkgPT0gdGhpcy0+ZWJhY2soKSkKKwkgICAgeworCSAgICAgICpfX3MrKyA9ICp0aGlzLT5ncHRyKCk7IC8vIGVtdWxhdGUgbm9uLXVuZGVyZmxvd2luZyBzYnVtcGMKKwkgICAgICB0aGlzLT5nYnVtcCgxKTsKKwkgICAgICBfX3JldCA9IDE7CisJICAgICAgLS1fX247CisJICAgIH0KKwkgIF9NX2Rlc3Ryb3lfcGJhY2soKTsKKwl9CisgICAgICBlbHNlIGlmIChfTV93cml0aW5nKQorCXsKKyAJICBpZiAob3ZlcmZsb3coKSA9PSB0cmFpdHNfdHlwZTo6ZW9mKCkpCisgCSAgICByZXR1cm4gX19yZXQ7CisgCSAgX01fc2V0X2J1ZmZlcigtMSk7CisgCSAgX01fd3JpdGluZyA9IGZhbHNlOworIAl9CisgCisgICAgICAvLyBPcHRpbWl6YXRpb24gaW4gdGhlIGFsd2F5c19ub2NvbnYoKSBjYXNlLCB0byBiZSBnZW5lcmFsaXplZCBpbiB0aGUKKyAgICAgIC8vIGZ1dHVyZTogd2hlbiBfX24gPiBfX2J1ZmxlbiB3ZSByZWFkIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgdGhlCisgICAgICAvLyBidWZmZXIgcmVwZWF0ZWRseS4KKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0aW4gPSBfTV9tb2RlICYgaW9zX2Jhc2U6OmluOworICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX2J1ZmxlbiA9IF9NX2J1Zl9zaXplID4gMSA/IF9NX2J1Zl9zaXplIC0gMSA6IDE7CisgCisgICAgICBpZiAoX19uID4gX19idWZsZW4gJiYgX19jaGVja19mYWNldChfTV9jb2RlY3Z0KS5hbHdheXNfbm9jb252KCkKKyAJICAgJiYgX190ZXN0aW4pCisgCSB7CisgCSAgIC8vIEZpcnN0LCBjb3B5IHRoZSBjaGFycyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGJ1ZmZlci4KKyAJICAgY29uc3Qgc3RyZWFtc2l6ZSBfX2F2YWlsID0gdGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKTsKKyAJICAgaWYgKF9fYXZhaWwgIT0gMCkKKyAJICAgICB7CisJICAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9fcywgdGhpcy0+Z3B0cigpLCBfX2F2YWlsKTsKKyAJICAgICAgIF9fcyArPSBfX2F2YWlsOworCSAgICAgICB0aGlzLT5zZXRnKHRoaXMtPmViYWNrKCksIHRoaXMtPmdwdHIoKSArIF9fYXZhaWwsCisJCQkgIHRoaXMtPmVncHRyKCkpOworCSAgICAgICBfX3JldCArPSBfX2F2YWlsOworCSAgICAgICBfX24gLT0gX19hdmFpbDsKKyAJICAgICB9CisgCisgCSAgIC8vIE5lZWQgdG8gbG9vcCBpbiBjYXNlIG9mIHNob3J0IHJlYWRzIChyZWxhdGl2ZWx5IGNvbW1vbgorIAkgICAvLyB3aXRoIHBpcGVzKS4KKyAJICAgc3RyZWFtc2l6ZSBfX2xlbjsKKyAJICAgZm9yICg7OykKKyAJICAgICB7CisgCSAgICAgICBfX2xlbiA9IF9NX2ZpbGUueHNnZXRuKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9fcyksCisgCQkJCSAgICAgIF9fbik7CisgCSAgICAgICBpZiAoX19sZW4gPT0gLTEpCisgCQkgX190aHJvd19pb3NfZmFpbHVyZShfX04oImJhc2ljX2ZpbGVidWY6OnhzZ2V0biAiCisgCQkJCQkgImVycm9yIHJlYWRpbmcgdGhlIGZpbGUiKSk7CisgCSAgICAgICBpZiAoX19sZW4gPT0gMCkKKyAJCSBicmVhazsKKyAKKyAJICAgICAgIF9fbiAtPSBfX2xlbjsKKyAJICAgICAgIF9fcmV0ICs9IF9fbGVuOworIAkgICAgICAgaWYgKF9fbiA9PSAwKQorIAkJIGJyZWFrOworIAorIAkgICAgICAgX19zICs9IF9fbGVuOworIAkgICAgIH0KKyAKKyAJICAgaWYgKF9fbiA9PSAwKQorIAkgICAgIHsKKyAJICAgICAgIF9NX3NldF9idWZmZXIoMCk7CisgCSAgICAgICBfTV9yZWFkaW5nID0gdHJ1ZTsKKyAJICAgICB9CisgCSAgIGVsc2UgaWYgKF9fbGVuID09IDApCisgCSAgICAgeworIAkgICAgICAgLy8gSWYgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZCwgc2V0ICd1bmNvbW1pdHRlZCcKKyAJICAgICAgIC8vIG1vZGUsIHRodXMgYWxsb3dpbmcgYW4gaW1tZWRpYXRlIHdyaXRlIHdpdGhvdXQKKyAJICAgICAgIC8vIGFuIGludGVydmVuaW5nIHNlZWsuCisgCSAgICAgICBfTV9zZXRfYnVmZmVyKC0xKTsKKyAJICAgICAgIF9NX3JlYWRpbmcgPSBmYWxzZTsKKyAJICAgICB9CisgCSB9CisgICAgICBlbHNlCisgCSBfX3JldCArPSBfX3N0cmVhbWJ1Zl90eXBlOjp4c2dldG4oX19zLCBfX24pOworIAorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RyZWFtc2l6ZQorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgeHNwdXRuKGNvbnN0IF9DaGFyVCogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICBzdHJlYW1zaXplIF9fcmV0ID0gMDsKKyAgICAgIC8vIE9wdGltaXphdGlvbiBpbiB0aGUgYWx3YXlzX25vY29udigpIGNhc2UsIHRvIGJlIGdlbmVyYWxpemVkIGluIHRoZQorICAgICAgLy8gZnV0dXJlOiB3aGVuIF9fbiBpcyBzdWZmaWNpZW50bHkgbGFyZ2Ugd2Ugd3JpdGUgZGlyZWN0bHkgaW5zdGVhZCBvZgorICAgICAgLy8gdXNpbmcgdGhlIGJ1ZmZlci4KKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0b3V0ID0gX01fbW9kZSAmIGlvc19iYXNlOjpvdXQ7CisgICAgICBpZiAoX19jaGVja19mYWNldChfTV9jb2RlY3Z0KS5hbHdheXNfbm9jb252KCkKKyAJICAgJiYgX190ZXN0b3V0ICYmICFfTV9yZWFkaW5nKQorCXsKKwkgIC8vIE1lYXN1cmVtZW50IHdvdWxkIHJldmVhbCB0aGUgYmVzdCBjaG9pY2UuCisJICBjb25zdCBzdHJlYW1zaXplIF9fY2h1bmsgPSAxdWwgPDwgMTA7CisJICBzdHJlYW1zaXplIF9fYnVmYXZhaWwgPSB0aGlzLT5lcHB0cigpIC0gdGhpcy0+cHB0cigpOworCisJICAvLyBEb24ndCBtaXN0YWtlICd1bmNvbW1pdHRlZCcgbW9kZSBidWZmZXJlZCB3aXRoIHVuYnVmZmVyZWQuCisJICBpZiAoIV9NX3dyaXRpbmcgJiYgX01fYnVmX3NpemUgPiAxKQorCSAgICBfX2J1ZmF2YWlsID0gX01fYnVmX3NpemUgLSAxOworCisJICBjb25zdCBzdHJlYW1zaXplIF9fbGltaXQgPSBzdGQ6Om1pbihfX2NodW5rLCBfX2J1ZmF2YWlsKTsKKwkgIGlmIChfX24gPj0gX19saW1pdCkKKwkgICAgeworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19idWZmaWxsID0gdGhpcy0+cHB0cigpIC0gdGhpcy0+cGJhc2UoKTsKKwkgICAgICBjb25zdCBjaGFyKiBfX2J1ZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHRoaXMtPnBiYXNlKCkpOworCSAgICAgIF9fcmV0ID0gX01fZmlsZS54c3B1dG5fMihfX2J1ZiwgX19idWZmaWxsLAorCQkJCSAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihfX3MpLAorCQkJCSAgICAgICBfX24pOworCSAgICAgIGlmIChfX3JldCA9PSBfX2J1ZmZpbGwgKyBfX24pCisJCXsKKwkJICBfTV9zZXRfYnVmZmVyKDApOworCQkgIF9NX3dyaXRpbmcgPSB0cnVlOworCQl9CisJICAgICAgaWYgKF9fcmV0ID4gX19idWZmaWxsKQorCQlfX3JldCAtPSBfX2J1ZmZpbGw7CisJICAgICAgZWxzZQorCQlfX3JldCA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgX19yZXQgPSBfX3N0cmVhbWJ1Zl90eXBlOjp4c3B1dG4oX19zLCBfX24pOworCX0KKyAgICAgICBlbHNlCisJIF9fcmV0ID0gX19zdHJlYW1idWZfdHlwZTo6eHNwdXRuKF9fcywgX19uKTsKKyAgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9fc3RyZWFtYnVmX3R5cGUqCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzZXRidWYoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgIHsKKyAgICAgIGlmICghdGhpcy0+aXNfb3BlbigpKQorCXsKKwkgIGlmIChfX3MgPT0gMCAmJiBfX24gPT0gMCkKKwkgICAgX01fYnVmX3NpemUgPSAxOworCSAgZWxzZSBpZiAoX19zICYmIF9fbiA+IDApCisJICAgIHsKKwkgICAgICAvLyBUaGlzIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQgYmVoYXZpb3IsIGFuZCBhc3N1bWVzIHRoYXQKKwkgICAgICAvLyBhbiBleHRlcm5hbCBjaGFyX3R5cGUgYXJyYXkgb2YgbGVuZ3RoIF9fbiBleGlzdHMgYW5kIGhhcworCSAgICAgIC8vIGJlZW4gcHJlLWFsbG9jYXRlZC4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHRoaW5ncyB3aWxsCisJICAgICAgLy8gcXVpY2tseSBibG93IHVwLiBXaGVuIF9fbiA+IDEsIF9fbiAtIDEgcG9zaXRpb25zIHdpbGwgYmUKKwkgICAgICAvLyB1c2VkIGZvciB0aGUgZ2V0IGFyZWEsIF9fbiAtIDEgZm9yIHRoZSBwdXQgYXJlYSBhbmQgMQorCSAgICAgIC8vIHBvc2l0aW9uIHRvIGhvc3QgdGhlIG92ZXJmbG93IGNoYXIgb2YgYSBmdWxsIHB1dCBhcmVhLgorCSAgICAgIC8vIFdoZW4gX19uID09IDEsIDEgcG9zaXRpb24gd2lsbCBiZSB1c2VkIGZvciB0aGUgZ2V0IGFyZWEKKwkgICAgICAvLyBhbmQgMCBmb3IgdGhlIHB1dCBhcmVhLCBhcyBpbiB0aGUgdW5idWZmZXJlZCBjYXNlIGFib3ZlLgorCSAgICAgIF9NX2J1ZiA9IF9fczsKKwkgICAgICBfTV9idWZfc2l6ZSA9IF9fbjsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworCisgIC8vIEFjY29yZGluZyB0byAyNy44LjEuNCBwMTEgLSAxMywgc2Vla29mZiBzaG91bGQgaWdub3JlIHRoZSBsYXN0CisgIC8vIGFyZ3VtZW50IChvZiB0eXBlIG9wZW5tb2RlKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHNlZWtvZmYob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LCBpb3NfYmFzZTo6b3Blbm1vZGUpCisgICAgeworICAgICAgaW50IF9fd2lkdGggPSAwOworICAgICAgaWYgKF9NX2NvZGVjdnQpCisJX193aWR0aCA9IF9NX2NvZGVjdnQtPmVuY29kaW5nKCk7CisgICAgICBpZiAoX193aWR0aCA8IDApCisJX193aWR0aCA9IDA7CisKKyAgICAgIHBvc190eXBlIF9fcmV0ID0gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0ZmFpbCA9IF9fb2ZmICE9IDAgJiYgX193aWR0aCA8PSAwOworICAgICAgaWYgKHRoaXMtPmlzX29wZW4oKSAmJiAhX190ZXN0ZmFpbCkKKwl7CisJICAvLyB0ZWxsZyBhbmQgdGVsbHAgcXVlcmllcyBkbyBub3QgYWZmZWN0IGFueSBzdGF0ZSwgdW5sZXNzCisJICAvLyAhIGFsd2F5c19ub2NvbnYgYW5kIHRoZSBwdXQgc2VxdWVuY2UgaXMgbm90IGVtcHR5LgorCSAgLy8gSW4gdGhhdCBjYXNlLCBkZXRlcm1pbmluZyB0aGUgcG9zaXRpb24gcmVxdWlyZXMgY29udmVydGluZyB0aGUKKwkgIC8vIHB1dCBzZXF1ZW5jZS4gVGhhdCBkb2Vzbid0IHVzZSBleHRfYnVmLCBzbyByZXF1aXJlcyBhIGZsdXNoLgorCSAgYm9vbCBfX25vX21vdmVtZW50ID0gX193YXkgPT0gaW9zX2Jhc2U6OmN1ciAmJiBfX29mZiA9PSAwCisJICAgICYmICghX01fd3JpdGluZyB8fCBfTV9jb2RlY3Z0LT5hbHdheXNfbm9jb252KCkpOworCisJICAvLyBEaXRjaCBhbnkgcGJhY2sgYnVmZmVycyB0byBhdm9pZCBjb25mdXNpb24uCisJICBpZiAoIV9fbm9fbW92ZW1lbnQpCisJICAgIF9NX2Rlc3Ryb3lfcGJhY2soKTsKKworCSAgLy8gQ29ycmVjdCBzdGF0ZSBhdCBkZXN0aW5hdGlvbi4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGNvcnJlY3QKKwkgIC8vIHN0YXRlIGZvciB0aGUgY3VycmVudCBwb3NpdGlvbiBkdXJpbmcgb3V0cHV0LCBiZWNhdXNlCisJICAvLyBjb2RlY3Z0Ojp1bnNoaWZ0KCkgcmV0dXJucyB0aGUgc3RhdGUgdG8gdGhlIGluaXRpYWwgc3RhdGUuCisJICAvLyBUaGlzIGlzIGFsc28gdGhlIGNvcnJlY3Qgc3RhdGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBiZWNhdXNlCisJICAvLyBhbiB1bnNoaWZ0IHNlcXVlbmNlIHNob3VsZCBoYXZlIGJlZW4gd3JpdHRlbiBhdCB0aGUgZW5kLgorCSAgX19zdGF0ZV90eXBlIF9fc3RhdGUgPSBfTV9zdGF0ZV9iZWc7CisJICBvZmZfdHlwZSBfX2NvbXB1dGVkX29mZiA9IF9fb2ZmICogX193aWR0aDsKKwkgIGlmIChfTV9yZWFkaW5nICYmIF9fd2F5ID09IGlvc19iYXNlOjpjdXIpCisJICAgIHsKKwkgICAgICBfX3N0YXRlID0gX01fc3RhdGVfbGFzdDsKKwkgICAgICBfX2NvbXB1dGVkX29mZiArPSBfTV9nZXRfZXh0X3BvcyhfX3N0YXRlKTsKKwkgICAgfQorCSAgaWYgKCFfX25vX21vdmVtZW50KQorCSAgICBfX3JldCA9IF9NX3NlZWsoX19jb21wdXRlZF9vZmYsIF9fd2F5LCBfX3N0YXRlKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChfTV93cml0aW5nKQorCQlfX2NvbXB1dGVkX29mZiA9IHRoaXMtPnBwdHIoKSAtIHRoaXMtPnBiYXNlKCk7CisJICAgICAgCisgCSAgICAgIG9mZl90eXBlIF9fZmlsZV9vZmYgPSBfTV9maWxlLnNlZWtvZmYoMCwgaW9zX2Jhc2U6OmN1cik7CisgCSAgICAgIGlmIChfX2ZpbGVfb2ZmICE9IG9mZl90eXBlKC0xKSkKKwkJeworCQkgIF9fcmV0ID0gX19maWxlX29mZiArIF9fY29tcHV0ZWRfb2ZmOworCQkgIF9fcmV0LnN0YXRlKF9fc3RhdGUpOworCQl9CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gMTcxLiBTdHJhbmdlIHNlZWtwb3MoKSBzZW1hbnRpY3MgZHVlIHRvIGpvaW50IHBvc2l0aW9uCisgIC8vIEFjY29yZGluZyB0byB0aGUgcmVzb2x1dGlvbiBvZiBEUiAxNzEsIHNlZWtwb3Mgc2hvdWxkIGlnbm9yZSB0aGUgbGFzdAorICAvLyBhcmd1bWVudCAob2YgdHlwZSBvcGVubW9kZSkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnBvc190eXBlCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzZWVrcG9zKHBvc190eXBlIF9fcG9zLCBpb3NfYmFzZTo6b3Blbm1vZGUpCisgICAgeworICAgICAgcG9zX3R5cGUgX19yZXQgPSAgcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICAgIGlmICh0aGlzLT5pc19vcGVuKCkpCisJeworCSAgLy8gRGl0Y2ggYW55IHBiYWNrIGJ1ZmZlcnMgdG8gYXZvaWQgY29uZnVzaW9uLgorCSAgX01fZGVzdHJveV9wYmFjaygpOworCSAgX19yZXQgPSBfTV9zZWVrKG9mZl90eXBlKF9fcG9zKSwgaW9zX2Jhc2U6OmJlZywgX19wb3Muc3RhdGUoKSk7CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Ojpwb3NfdHlwZQorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgX01fc2VlayhvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksIF9fc3RhdGVfdHlwZSBfX3N0YXRlKQorICAgIHsKKyAgICAgIHBvc190eXBlIF9fcmV0ID0gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICAgIGlmIChfTV90ZXJtaW5hdGVfb3V0cHV0KCkpCisJeworCSAgb2ZmX3R5cGUgX19maWxlX29mZiA9IF9NX2ZpbGUuc2Vla29mZihfX29mZiwgX193YXkpOworCSAgaWYgKF9fZmlsZV9vZmYgIT0gb2ZmX3R5cGUoLTEpKQorCSAgICB7CisJICAgICAgX01fcmVhZGluZyA9IGZhbHNlOworCSAgICAgIF9NX3dyaXRpbmcgPSBmYWxzZTsKKwkgICAgICBfTV9leHRfbmV4dCA9IF9NX2V4dF9lbmQgPSBfTV9leHRfYnVmOworCSAgICAgIF9NX3NldF9idWZmZXIoLTEpOworCSAgICAgIF9NX3N0YXRlX2N1ciA9IF9fc3RhdGU7CisJICAgICAgX19yZXQgPSBfX2ZpbGVfb2ZmOworCSAgICAgIF9fcmV0LnN0YXRlKF9NX3N0YXRlX2N1cik7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIC8vIFJldHVybnMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGVuZCBvZiB0aGUgZXh0IGJ1ZmZlciB0byB0aGUgcG9pbnQKKyAgLy8gY29ycmVzcG9uZGluZyB0byBncHRyKCkuIFRoaXMgaXMgYSBuZWdhdGl2ZSB2YWx1ZS4gVXBkYXRlcyBfX3N0YXRlCisgIC8vIGZyb20gZWJhY2soKSBjb3JyZXNwb25kZW5jZSB0byBncHRyKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbnQgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBfTV9nZXRfZXh0X3BvcyhfX3N0YXRlX3R5cGUmIF9fc3RhdGUpCisgICAgeworICAgICAgaWYgKF9NX2NvZGVjdnQtPmFsd2F5c19ub2NvbnYoKSkKKyAgICAgICAgcmV0dXJuIHRoaXMtPmdwdHIoKSAtIHRoaXMtPmVncHRyKCk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyBDYWxjdWxhdGUgb2Zmc2V0IGZyb20gX01fZXh0X2J1ZiB0aGF0IGNvcnJlc3BvbmRzIHRvCisgICAgICAgICAgLy8gZ3B0cigpLiBQcmVjb25kaXRpb246IF9fc3RhdGUgPT0gX01fc3RhdGVfbGFzdCwgd2hpY2gKKyAgICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBlYmFjaygpLgorICAgICAgICAgIGNvbnN0IGludCBfX2dwdHJfb2ZmID0KKyAgICAgICAgICAgIF9NX2NvZGVjdnQtPmxlbmd0aChfX3N0YXRlLCBfTV9leHRfYnVmLCBfTV9leHRfbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5ncHRyKCkgLSB0aGlzLT5lYmFjaygpKTsKKyAgICAgICAgICByZXR1cm4gX01fZXh0X2J1ZiArIF9fZ3B0cl9vZmYgLSBfTV9leHRfZW5kOworICAgICAgICB9CisgICAgfQorICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYm9vbAorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgX01fdGVybWluYXRlX291dHB1dCgpCisgICAgeworICAgICAgLy8gUGFydCBvbmU6IHVwZGF0ZSB0aGUgb3V0cHV0IHNlcXVlbmNlLgorICAgICAgYm9vbCBfX3Rlc3R2YWxpZCA9IHRydWU7CisgICAgICBpZiAodGhpcy0+cGJhc2UoKSA8IHRoaXMtPnBwdHIoKSkKKwl7CisJICBjb25zdCBpbnRfdHlwZSBfX3RtcCA9IHRoaXMtPm92ZXJmbG93KCk7CisJICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fdG1wLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorCSAgICBfX3Rlc3R2YWxpZCA9IGZhbHNlOworCX0KKworICAgICAgLy8gUGFydCB0d286IG91dHB1dCB1bnNoaWZ0IHNlcXVlbmNlLgorICAgICAgaWYgKF9NX3dyaXRpbmcgJiYgIV9fY2hlY2tfZmFjZXQoX01fY29kZWN2dCkuYWx3YXlzX25vY29udigpCisJICAmJiBfX3Rlc3R2YWxpZCkKKwl7CisJICAvLyBOb3RlOiB0aGlzIHZhbHVlIGlzIGFyYml0cmFyeSwgc2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvCisJICAvLyBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgdW5zaGlmdCBzZXF1ZW5jZSBmcm9tIGNvZGVjdnQsCisJICAvLyB3aXRob3V0IGNhbGxpbmcgdW5zaGlmdC4KKwkgIGNvbnN0IHNpemVfdCBfX2JsZW4gPSAxMjg7CisJICBjaGFyIF9fYnVmW19fYmxlbl07CisJICBjb2RlY3Z0X2Jhc2U6OnJlc3VsdCBfX3I7CisJICBzdHJlYW1zaXplIF9faWxlbiA9IDA7CisKKwkgIGRvCisJICAgIHsKKwkgICAgICBjaGFyKiBfX25leHQ7CisJICAgICAgX19yID0gX01fY29kZWN2dC0+dW5zaGlmdChfTV9zdGF0ZV9jdXIsIF9fYnVmLAorCQkJCQlfX2J1ZiArIF9fYmxlbiwgX19uZXh0KTsKKwkgICAgICBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6ZXJyb3IpCisJCV9fdGVzdHZhbGlkID0gZmFsc2U7CisJICAgICAgZWxzZSBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6b2sgfHwKKwkJICAgICAgIF9fciA9PSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWwpCisJCXsKKwkJICBfX2lsZW4gPSBfX25leHQgLSBfX2J1ZjsKKwkJICBpZiAoX19pbGVuID4gMCkKKwkJICAgIHsKKwkJICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX2VsZW4gPSBfTV9maWxlLnhzcHV0bihfX2J1ZiwgX19pbGVuKTsKKwkJICAgICAgaWYgKF9fZWxlbiAhPSBfX2lsZW4pCisJCQlfX3Rlc3R2YWxpZCA9IGZhbHNlOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIHdoaWxlIChfX3IgPT0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsICYmIF9faWxlbiA+IDAgJiYgX190ZXN0dmFsaWQpOworCisJICBpZiAoX190ZXN0dmFsaWQpCisJICAgIHsKKwkgICAgICAvLyBUaGlzIHNlY29uZCBjYWxsIHRvIG92ZXJmbG93KCkgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkLAorCSAgICAgIC8vIGJ1dCBpdCdzIG5vdCBjbGVhciB3aHkgaXQncyBuZWVkZWQsIHNpbmNlIHRoZSBvdXRwdXQgYnVmZmVyCisJICAgICAgLy8gc2hvdWxkIGJlIGVtcHR5IGJ5IHRoaXMgcG9pbnQgKGl0IHNob3VsZCBoYXZlIGJlZW4gZW1wdGllZAorCSAgICAgIC8vIGluIHRoZSBmaXJzdCBjYWxsIHRvIG92ZXJmbG93KCkpLgorCSAgICAgIGNvbnN0IGludF90eXBlIF9fdG1wID0gdGhpcy0+b3ZlcmZsb3coKTsKKwkgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fdG1wLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorCQlfX3Rlc3R2YWxpZCA9IGZhbHNlOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fdGVzdHZhbGlkOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW50CisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzeW5jKCkKKyAgICB7CisgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaW50ZXJuYWwgYnVmZmVyIHJlc3luY3MgaXRzIGlkZWEgb2YKKyAgICAgIC8vIHRoZSBmaWxlIHBvc2l0aW9uIHdpdGggdGhlIGV4dGVybmFsIGZpbGUuCisgICAgICBpbnQgX19yZXQgPSAwOworICAgICAgaWYgKHRoaXMtPnBiYXNlKCkgPCB0aGlzLT5wcHRyKCkpCisJeworCSAgY29uc3QgaW50X3R5cGUgX190bXAgPSB0aGlzLT5vdmVyZmxvdygpOworCSAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX3RtcCwgdHJhaXRzX3R5cGU6OmVvZigpKSkKKwkgICAgX19yZXQgPSAtMTsKKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBpbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsKKyAgICAgIGJvb2wgX190ZXN0dmFsaWQgPSB0cnVlOworCisgICAgICBjb25zdCBfX2NvZGVjdnRfdHlwZSogX01fY29kZWN2dF90bXAgPSAwOworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoaGFzX2ZhY2V0PF9fY29kZWN2dF90eXBlPihfX2xvYyksIHRydWUpKQorCV9NX2NvZGVjdnRfdG1wID0gJnVzZV9mYWNldDxfX2NvZGVjdnRfdHlwZT4oX19sb2MpOworCisgICAgICBpZiAodGhpcy0+aXNfb3BlbigpKQorCXsKKwkgIC8vIGVuY29kaW5nKCkgPT0gLTEgaXMgb2sgb25seSBhdCB0aGUgYmVnaW5uaW5nLgorCSAgaWYgKChfTV9yZWFkaW5nIHx8IF9NX3dyaXRpbmcpCisJICAgICAgJiYgX19jaGVja19mYWNldChfTV9jb2RlY3Z0KS5lbmNvZGluZygpID09IC0xKQorCSAgICBfX3Rlc3R2YWxpZCA9IGZhbHNlOworCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKF9NX3JlYWRpbmcpCisJCXsKKwkJICBpZiAoX19jaGVja19mYWNldChfTV9jb2RlY3Z0KS5hbHdheXNfbm9jb252KCkpCisJCSAgICB7CisJCSAgICAgIGlmIChfTV9jb2RlY3Z0X3RtcAorCQkJICAmJiAhX19jaGVja19mYWNldChfTV9jb2RlY3Z0X3RtcCkuYWx3YXlzX25vY29udigpKQorCQkJX190ZXN0dmFsaWQgPSB0aGlzLT5zZWVrb2ZmKDAsIGlvc19iYXNlOjpjdXIsIF9NX21vZGUpCisJCQkgICAgICAgICAgICAgICE9IHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvLyBFeHRlcm5hbCBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIGdwdHIoKS4KKwkJICAgICAgX01fZXh0X25leHQgPSBfTV9leHRfYnVmCisJCQkrIF9NX2NvZGVjdnQtPmxlbmd0aChfTV9zdGF0ZV9sYXN0LCBfTV9leHRfYnVmLAorCQkJCQkgICAgIF9NX2V4dF9uZXh0LAorCQkJCQkgICAgIHRoaXMtPmdwdHIoKSAtIHRoaXMtPmViYWNrKCkpOworCQkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fcmVtYWluZGVyID0gX01fZXh0X2VuZCAtIF9NX2V4dF9uZXh0OworCQkgICAgICBpZiAoX19yZW1haW5kZXIpCisJCQlfX2J1aWx0aW5fbWVtbW92ZShfTV9leHRfYnVmLCBfTV9leHRfbmV4dCwgX19yZW1haW5kZXIpOworCisJCSAgICAgIF9NX2V4dF9uZXh0ID0gX01fZXh0X2J1ZjsKKwkJICAgICAgX01fZXh0X2VuZCA9IF9NX2V4dF9idWYgKyBfX3JlbWFpbmRlcjsKKwkJICAgICAgX01fc2V0X2J1ZmZlcigtMSk7CisJCSAgICAgIF9NX3N0YXRlX2xhc3QgPSBfTV9zdGF0ZV9jdXIgPSBfTV9zdGF0ZV9iZWc7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmIChfTV93cml0aW5nICYmIChfX3Rlc3R2YWxpZCA9IF9NX3Rlcm1pbmF0ZV9vdXRwdXQoKSkpCisJCV9NX3NldF9idWZmZXIoLTEpOworCSAgICB9CisJfQorCisgICAgICBpZiAoX190ZXN0dmFsaWQpCisJX01fY29kZWN2dCA9IF9NX2NvZGVjdnRfdG1wOworICAgICAgZWxzZQorCV9NX2NvZGVjdnQgPSAwOworICAgIH0KKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX2ZpbGVidWY8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19pZnN0cmVhbTxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX29mc3RyZWFtPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfZnN0cmVhbTxjaGFyPjsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19maWxlYnVmPHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaWZzdHJlYW08d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19vZnN0cmVhbTx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX2ZzdHJlYW08d2NoYXJfdD47CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9mdW5jdGV4Y2VwdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2Z1bmN0ZXhjZXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxNDA1OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9mdW5jdGV4Y2VwdC5oCkBAIC0wLDAgKzEsMTA2IEBACisvLyBGdW5jdGlvbi1CYXNlZCBFeGNlcHRpb24gU3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9mdW5jdGV4Y2VwdC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXhjZXB0aW9ufQorICoKKyAqICBUaGlzIGhlYWRlciBwcm92aWRlcyBzdXBwb3J0IGZvciAtZm5vLWV4Y2VwdGlvbnMuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDE5LjEgIEV4Y2VwdGlvbiBjbGFzc2VzCisvLworCisjaWZuZGVmIF9GVU5DVEVYQ0VQVF9ICisjZGVmaW5lIF9GVU5DVEVYQ0VQVF9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9leGNlcHRpb25fZGVmaW5lcy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gSGVscGVyIGZvciBleGNlcHRpb24gb2JqZWN0cyBpbiA8ZXhjZXB0PgorICB2b2lkCisgIF9fdGhyb3dfYmFkX2V4Y2VwdGlvbih2b2lkKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICAvLyBIZWxwZXIgZm9yIGV4Y2VwdGlvbiBvYmplY3RzIGluIDxuZXc+CisgIHZvaWQKKyAgX190aHJvd19iYWRfYWxsb2Modm9pZCkgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgLy8gSGVscGVyIGZvciBleGNlcHRpb24gb2JqZWN0cyBpbiA8dHlwZWluZm8+CisgIHZvaWQKKyAgX190aHJvd19iYWRfY2FzdCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICB2b2lkCisgIF9fdGhyb3dfYmFkX3R5cGVpZCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICAvLyBIZWxwZXJzIGZvciBleGNlcHRpb24gb2JqZWN0cyBpbiA8c3RkZXhjZXB0PgorICB2b2lkCisgIF9fdGhyb3dfbG9naWNfZXJyb3IoY29uc3QgY2hhciopIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIHZvaWQKKyAgX190aHJvd19kb21haW5fZXJyb3IoY29uc3QgY2hhciopIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIHZvaWQKKyAgX190aHJvd19pbnZhbGlkX2FyZ3VtZW50KGNvbnN0IGNoYXIqKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICB2b2lkCisgIF9fdGhyb3dfbGVuZ3RoX2Vycm9yKGNvbnN0IGNoYXIqKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICB2b2lkCisgIF9fdGhyb3dfb3V0X29mX3JhbmdlKGNvbnN0IGNoYXIqKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICB2b2lkCisgIF9fdGhyb3dfcnVudGltZV9lcnJvcihjb25zdCBjaGFyKikgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgdm9pZAorICBfX3Rocm93X3JhbmdlX2Vycm9yKGNvbnN0IGNoYXIqKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICB2b2lkCisgIF9fdGhyb3dfb3ZlcmZsb3dfZXJyb3IoY29uc3QgY2hhciopIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIHZvaWQKKyAgX190aHJvd191bmRlcmZsb3dfZXJyb3IoY29uc3QgY2hhciopIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIC8vIEhlbHBlcnMgZm9yIGV4Y2VwdGlvbiBvYmplY3RzIGluIDxpb3M+CisgIHZvaWQKKyAgX190aHJvd19pb3NfZmFpbHVyZShjb25zdCBjaGFyKikgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgdm9pZAorICBfX3Rocm93X3N5c3RlbV9lcnJvcihpbnQpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIHZvaWQKKyAgX190aHJvd19mdXR1cmVfZXJyb3IoaW50KSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICAvLyBIZWxwZXJzIGZvciBleGNlcHRpb24gb2JqZWN0cyBpbiA8ZnVuY3Rpb25hbD4KKyAgdm9pZAorICBfX3Rocm93X2JhZF9mdW5jdGlvbl9jYWxsKCkgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZnVuY3Rpb25hbF9oYXNoLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZnVuY3Rpb25hbF9oYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyOTIzNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9mdW5jdGlvbmFsX2hhc2guaApAQCAtMCwwICsxLDIxMiBAQAorLy8gZnVuY3Rpb25hbF9oYXNoLmggaGVhZGVyIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2Z1bmN0aW9uYWxfaGFzaC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZnVuY3Rpb25hbH0KKyAqLworCisjaWZuZGVmIF9GVU5DVElPTkFMX0hBU0hfSAorI2RlZmluZSBfRlVOQ1RJT05BTF9IQVNIX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2hhc2hfYnl0ZXMuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKiBAZGVmZ3JvdXAgaGFzaGVzIEhhc2hlcworICAgKiAgQGluZ3JvdXAgZnVuY3RvcnMKKyAgICoKKyAgICogICBIYXNoaW5nIGZ1bmN0b3JzIHRha2luZyBhIHZhcmlhYmxlIHR5cGUgYW5kIHJldHVybmluZyBhIEBjIHN0ZDo6c2l6ZV90LgorICAgKgorICAgKiAgQHsKKyAgICovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX0FyZz4KKyAgICBzdHJ1Y3QgX19oYXNoX2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXN1bHQgICAgIHJlc3VsdF90eXBlOworICAgICAgdHlwZWRlZiBfQXJnICAgICAgYXJndW1lbnRfdHlwZTsKKyAgICB9OworCisgIC8vLyBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIGhhc2guCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzaDsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbnMgZm9yIHBvaW50ZXIgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzaDxfVHAqPiA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9UcCo+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKF9UcCogX19wKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KF9fcCk7IH0KKyAgICB9OworCisgIC8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9ucyBmb3IgaW50ZWdlciB0eXBlcy4KKyNkZWZpbmUgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChfVHApIAlcCisgIHRlbXBsYXRlPD4JCQkJCQlcCisgICAgc3RydWN0IGhhc2g8X1RwPiA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9UcD4gIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBvcGVyYXRvcigpKF9UcCBfX3ZhbCkgY29uc3Qgbm9leGNlcHQgICAgICAgICAgICAgIFwKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oX192YWwpOyB9ICAgICAgICAgICAgXAorICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBib29sLgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGJvb2wpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBjaGFyLgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGNoYXIpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBzaWduZWQgY2hhci4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChzaWduZWQgY2hhcikKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHVuc2lnbmVkIGNoYXIuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2godW5zaWduZWQgY2hhcikKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHdjaGFyX3QuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2god2NoYXJfdCkKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIGNoYXIxNl90LgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGNoYXIxNl90KQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgY2hhcjMyX3QuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goY2hhcjMyX3QpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBzaG9ydC4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChzaG9ydCkKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIGludC4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChpbnQpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBsb25nLgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGxvbmcpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBsb25nIGxvbmcuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2gobG9uZyBsb25nKQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgdW5zaWduZWQgc2hvcnQuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2godW5zaWduZWQgc2hvcnQpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciB1bnNpZ25lZCBpbnQuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2godW5zaWduZWQgaW50KQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgdW5zaWduZWQgbG9uZy4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaCh1bnNpZ25lZCBsb25nKQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgdW5zaWduZWQgbG9uZyBsb25nLgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIGxvbmcgbG9uZykKKworI3VuZGVmIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2gKKworICBzdHJ1Y3QgX0hhc2hfaW1wbAorICB7CisgICAgc3RhdGljIHNpemVfdAorICAgIGhhc2goY29uc3Qgdm9pZCogX19wdHIsIHNpemVfdCBfX2NsZW5ndGgsCisJIHNpemVfdCBfX3NlZWQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KDB4YzcwZjY5MDdVTCkpCisgICAgeyByZXR1cm4gX0hhc2hfYnl0ZXMoX19wdHIsIF9fY2xlbmd0aCwgX19zZWVkKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgc3RhdGljIHNpemVfdAorICAgICAgaGFzaChjb25zdCBfVHAmIF9fdmFsKQorICAgICAgeyByZXR1cm4gaGFzaCgmX192YWwsIHNpemVvZihfX3ZhbCkpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBfX2hhc2hfY29tYmluZShjb25zdCBfVHAmIF9fdmFsLCBzaXplX3QgX19oYXNoKQorICAgICAgeyByZXR1cm4gaGFzaCgmX192YWwsIHNpemVvZihfX3ZhbCksIF9faGFzaCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX0Zudl9oYXNoX2ltcGwKKyAgeworICAgIHN0YXRpYyBzaXplX3QKKyAgICBoYXNoKGNvbnN0IHZvaWQqIF9fcHRyLCBzaXplX3QgX19jbGVuZ3RoLAorCSBzaXplX3QgX19zZWVkID0gc3RhdGljX2Nhc3Q8c2l6ZV90PigyMTY2MTM2MjYxVUwpKQorICAgIHsgcmV0dXJuIF9GbnZfaGFzaF9ieXRlcyhfX3B0ciwgX19jbGVuZ3RoLCBfX3NlZWQpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBoYXNoKGNvbnN0IF9UcCYgX192YWwpCisgICAgICB7IHJldHVybiBoYXNoKCZfX3ZhbCwgc2l6ZW9mKF9fdmFsKSk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0YXRpYyBzaXplX3QKKyAgICAgIF9faGFzaF9jb21iaW5lKGNvbnN0IF9UcCYgX192YWwsIHNpemVfdCBfX2hhc2gpCisgICAgICB7IHJldHVybiBoYXNoKCZfX3ZhbCwgc2l6ZW9mKF9fdmFsKSwgX19oYXNoKTsgfQorICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgZmxvYXQuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxmbG9hdD4gOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBmbG9hdD4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoZmxvYXQgX192YWwpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisJLy8gMCBhbmQgLTAgYm90aCBoYXNoIHRvIHplcm8uCisJcmV0dXJuIF9fdmFsICE9IDAuMGYgPyBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX192YWwpIDogMDsKKyAgICAgIH0KKyAgICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgZG91YmxlLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8ZG91YmxlPiA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIGRvdWJsZT4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoZG91YmxlIF9fdmFsKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworCS8vIDAgYW5kIC0wIGJvdGggaGFzaCB0byB6ZXJvLgorCXJldHVybiBfX3ZhbCAhPSAwLjAgPyBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX192YWwpIDogMDsKKyAgICAgIH0KKyAgICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgbG9uZyBkb3VibGUuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxsb25nIGRvdWJsZT4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIGxvbmcgZG91YmxlPgorICAgIHsKKyAgICAgIF9HTElCQ1hYX1BVUkUgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGxvbmcgZG91YmxlIF9fdmFsKSBjb25zdCBub2V4Y2VwdDsKKyAgICB9OworCisgIC8vIEB9IGdyb3VwIGhhc2hlcworCisgIC8vIEhpbnQgYWJvdXQgcGVyZm9ybWFuY2Ugb2YgaGFzaCBmdW5jdG9yLiBJZiBub3QgZmFzdCB0aGUgaGFzaCBiYXNlZAorICAvLyBjb250YWluZXJzIHdpbGwgY2FjaGUgdGhlIGhhc2ggY29kZS4KKyAgLy8gRGVmYXVsdCBiZWhhdmlvciBpcyB0byBjb25zaWRlciB0aGF0IGhhc2hlciBhcmUgZmFzdCB1bmxlc3Mgc3BlY2lmaWVkCisgIC8vIG90aGVyd2lzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0hhc2g+CisgICAgc3RydWN0IF9faXNfZmFzdF9oYXNoIDogcHVibGljIHN0ZDo6dHJ1ZV90eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19mYXN0X2hhc2g8aGFzaDxsb25nIGRvdWJsZT4+IDogcHVibGljIHN0ZDo6ZmFsc2VfdHlwZQorICAgIHsgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX0ZVTkNUSU9OQUxfSEFTSF9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZ3NsaWNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZ3NsaWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1ZWNmZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9nc2xpY2UuaApAQCAtMCwwICsxLDE4NSBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gZ3NsaWNlIGNsYXNzLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9nc2xpY2UuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3ZhbGFycmF5fQorICovCisKKy8vIFdyaXR0ZW4gYnkgR2FicmllbCBEb3MgUmVpcyA8R2FicmllbC5Eb3MtUmVpc0BEUFRNYXRocy5FTlMtQ2FjaGFuLkZyPgorCisjaWZuZGVmIF9HU0xJQ0VfSAorI2RlZmluZSBfR1NMSUNFX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgbnVtZXJpY19hcnJheXMKKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqICBAYnJpZWYgIENsYXNzIGRlZmluaW5nIG11bHRpLWRpbWVuc2lvbmFsIHN1YnNldCBvZiBhbiBhcnJheS4KKyAgICoKKyAgICogIFRoZSBzbGljZSBjbGFzcyByZXByZXNlbnRzIGEgbXVsdGktZGltZW5zaW9uYWwgc3Vic2V0IG9mIGFuIGFycmF5LAorICAgKiAgc3BlY2lmaWVkIGJ5IHRocmVlIHBhcmFtZXRlciBzZXRzOiBzdGFydCBvZmZzZXQsIHNpemUgYXJyYXksIGFuZCBzdHJpZGUKKyAgICogIGFycmF5LiAgVGhlIHN0YXJ0IG9mZnNldCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5CisgICAqICB0aGF0IGlzIHBhcnQgb2YgdGhlIHN1YnNldC4gIFRoZSBzaXplIGFuZCBzdHJpZGUgYXJyYXkgZGVzY3JpYmUgZWFjaAorICAgKiAgZGltZW5zaW9uIG9mIHRoZSBzbGljZS4gIFNpemUgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGF0CisgICAqICBkaW1lbnNpb24sIGFuZCBzdHJpZGUgaXMgdGhlIGRpc3RhbmNlIGluIHRoZSBhcnJheSBiZXR3ZWVuIHN1Y2Nlc3NpdmUKKyAgICogIGVsZW1lbnRzIGluIHRoYXQgZGltZW5zaW9uLiAgRWFjaCBkaW1lbnNpb24ncyBzaXplIGFuZCBzdHJpZGUgaXMgdGFrZW4KKyAgICogIHRvIGJlZ2luIGF0IGFuIGFycmF5IGVsZW1lbnQgZGVzY3JpYmVkIGJ5IHRoZSBwcmV2aW91cyBkaW1lbnNpb24uICBUaGUKKyAgICogIHNpemUgYXJyYXkgYW5kIHN0cmlkZSBhcnJheSBtdXN0IGJlIHRoZSBzYW1lIHNpemUuCisgICAqCisgICAqICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgb2Zmc2V0PT0zLCBzdHJpZGVbMF09PTExLCBzaXplWzFdPT0zLAorICAgKiAgc3RyaWRlWzFdPT0zLCB0aGVuIHNsaWNlWzAsMF09PWFycmF5WzNdLCBzbGljZVswLDFdPT1hcnJheVs2XSwKKyAgICogIHNsaWNlWzAsMl09PWFycmF5WzldLCBzbGljZVsxLDBdPT1hcnJheVsxNF0sIHNsaWNlWzEsMV09PWFycmF5WzE3XSwKKyAgICogIHNsaWNlWzEsMl09PWFycmF5WzIwXS4KKyAgICovCisgIGNsYXNzIGdzbGljZQorICB7CisgIHB1YmxpYzoKKyAgICAvLy8gIENvbnN0cnVjdCBhbiBlbXB0eSBzbGljZS4KKyAgICBnc2xpY2UoKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBhIHNsaWNlLgorICAgICAqCisgICAgICogIENvbnN0cnVjdHMgYSBzbGljZSB3aXRoIGFzIG1hbnkgZGltZW5zaW9ucyBhcyB0aGUgbGVuZ3RoIG9mIHRoZSBAYSBsCisgICAgICogIGFuZCBAYSBzIGFycmF5cy4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIF9fbyAgT2Zmc2V0IGluIGFycmF5IG9mIGZpcnN0IGVsZW1lbnQuCisgICAgICogIEBwYXJhbSAgX19sICBBcnJheSBvZiBkaW1lbnNpb24gbGVuZ3Rocy4KKyAgICAgKiAgQHBhcmFtICBfX3MgIEFycmF5IG9mIGRpbWVuc2lvbiBzdHJpZGVzIGJldHdlZW4gYXJyYXkgZWxlbWVudHMuCisgICAgICovCisgICAgZ3NsaWNlKHNpemVfdCBfX28sIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9fbCwgCisJICAgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19zKTsKKworICAgIC8vIFhYWDogdGhlIElTIHNheXMgdGhlIGNvcHktY3RvciBhbmQgY29weS1hc3NpZ25tZW50IG9wZXJhdG9ycyBhcmUKKyAgICAvLyAgICAgIHN5bnRoZXNpemVkIGJ5IHRoZSBjb21waWxlciBidXQgdGhleSBhcmUganVzdCB1bnN1aXRhYmxlCisgICAgLy8gICAgICBmb3IgYSByZWYtY291bnRlZCBzZW1hbnRpYworICAgIC8vLyAgQ29weSBjb25zdHJ1Y3Rvci4KKyAgICBnc2xpY2UoY29uc3QgZ3NsaWNlJik7CisKKyAgICAvLy8gIERlc3RydWN0b3IuCisgICAgfmdzbGljZSgpOworCisgICAgLy8gWFhYOiBTZWUgdGhlIG5vdGUgYWJvdmUuCisgICAgLy8vICBBc3NpZ25tZW50IG9wZXJhdG9yLgorICAgIGdzbGljZSYgb3BlcmF0b3I9KGNvbnN0IGdzbGljZSYpOworCisgICAgLy8vICBSZXR1cm4gYXJyYXkgb2Zmc2V0IG9mIGZpcnN0IHNsaWNlIGVsZW1lbnQuCisgICAgc2l6ZV90ICAgICAgICAgICBzdGFydCgpIGNvbnN0OworCisgICAgLy8vICBSZXR1cm4gYXJyYXkgb2Ygc2l6ZXMgb2Ygc2xpY2UgZGltZW5zaW9ucy4KKyAgICB2YWxhcnJheTxzaXplX3Q+IHNpemUoKSBjb25zdDsKKyAgICAKKyAgICAvLy8gIFJldHVybiBhcnJheSBvZiBhcnJheSBzdHJpZGVzIGZvciBlYWNoIGRpbWVuc2lvbi4KKyAgICB2YWxhcnJheTxzaXplX3Q+IHN0cmlkZSgpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgc3RydWN0IF9JbmRleGVyCisgICAgeworICAgICAgc2l6ZV90IF9NX2NvdW50OworICAgICAgc2l6ZV90IF9NX3N0YXJ0OworICAgICAgdmFsYXJyYXk8c2l6ZV90PiBfTV9zaXplOworICAgICAgdmFsYXJyYXk8c2l6ZV90PiBfTV9zdHJpZGU7CisgICAgICB2YWxhcnJheTxzaXplX3Q+IF9NX2luZGV4OyAvLyBMaW5lYXIgYXJyYXkgb2YgcmVmZXJlbmNlZCBpbmRpY2VzCisKKyAgICAgIF9JbmRleGVyKCkKKyAgICAgIDogX01fY291bnQoMSksIF9NX3N0YXJ0KDApLCBfTV9zaXplKCksIF9NX3N0cmlkZSgpLCBfTV9pbmRleCgpIHt9CisKKyAgICAgIF9JbmRleGVyKHNpemVfdCwgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYsCisJICAgICAgIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mKTsKKworICAgICAgdm9pZAorICAgICAgX01faW5jcmVtZW50X3VzZSgpCisgICAgICB7ICsrX01fY291bnQ7IH0KKyAgICAgIAorICAgICAgc2l6ZV90CisgICAgICBfTV9kZWNyZW1lbnRfdXNlKCkKKyAgICAgIHsgcmV0dXJuIC0tX01fY291bnQ7IH0KKyAgICB9OworCisgICAgX0luZGV4ZXIqIF9NX2luZGV4OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBmcmllbmQgY2xhc3MgdmFsYXJyYXk7CisgIH07CisKKyAgaW5saW5lIHNpemVfdAorICBnc2xpY2U6OnN0YXJ0KCkgY29uc3QKKyAgeyByZXR1cm4gX01faW5kZXggPyBfTV9pbmRleC0+X01fc3RhcnQgOiAwOyB9CisKKyAgaW5saW5lIHZhbGFycmF5PHNpemVfdD4KKyAgZ3NsaWNlOjpzaXplKCkgY29uc3QKKyAgeyByZXR1cm4gX01faW5kZXggPyBfTV9pbmRleC0+X01fc2l6ZSA6IHZhbGFycmF5PHNpemVfdD4oKTsgfQorCisgIGlubGluZSB2YWxhcnJheTxzaXplX3Q+CisgIGdzbGljZTo6c3RyaWRlKCkgY29uc3QKKyAgeyByZXR1cm4gX01faW5kZXggPyBfTV9pbmRleC0+X01fc3RyaWRlIDogdmFsYXJyYXk8c2l6ZV90PigpOyB9CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyA1NDMuIHZhbGFycmF5IHNsaWNlIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5saW5lCisgIGdzbGljZTo6Z3NsaWNlKCkKKyAgOiBfTV9pbmRleChuZXcgZ3NsaWNlOjpfSW5kZXhlcigpKSB7fQorCisgIGlubGluZQorICBnc2xpY2U6OmdzbGljZShzaXplX3QgX19vLCBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2wsCisJCSBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX3MpCisgIDogX01faW5kZXgobmV3IGdzbGljZTo6X0luZGV4ZXIoX19vLCBfX2wsIF9fcykpIHt9CisKKyAgaW5saW5lCisgIGdzbGljZTo6Z3NsaWNlKGNvbnN0IGdzbGljZSYgX19nKQorICA6IF9NX2luZGV4KF9fZy5fTV9pbmRleCkKKyAgeyBpZiAoX01faW5kZXgpIF9NX2luZGV4LT5fTV9pbmNyZW1lbnRfdXNlKCk7IH0KKworICBpbmxpbmUKKyAgZ3NsaWNlOjp+Z3NsaWNlKCkKKyAgeworICAgIGlmIChfTV9pbmRleCAmJiBfTV9pbmRleC0+X01fZGVjcmVtZW50X3VzZSgpID09IDApCisgICAgICBkZWxldGUgX01faW5kZXg7CisgIH0KKworICBpbmxpbmUgZ3NsaWNlJgorICBnc2xpY2U6Om9wZXJhdG9yPShjb25zdCBnc2xpY2UmIF9fZykKKyAgeworICAgIGlmIChfX2cuX01faW5kZXgpCisgICAgICBfX2cuX01faW5kZXgtPl9NX2luY3JlbWVudF91c2UoKTsKKyAgICBpZiAoX01faW5kZXggJiYgX01faW5kZXgtPl9NX2RlY3JlbWVudF91c2UoKSA9PSAwKQorICAgICAgZGVsZXRlIF9NX2luZGV4OworICAgIF9NX2luZGV4ID0gX19nLl9NX2luZGV4OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEB9IGdyb3VwIG51bWVyaWNfYXJyYXlzCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HU0xJQ0VfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2dzbGljZV9hcnJheS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2dzbGljZV9hcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjE4ODYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZ3NsaWNlX2FycmF5LmgKQEAgLTAsMCArMSwyMTggQEAKKy8vIFRoZSB0ZW1wbGF0ZSBhbmQgaW5saW5lcyBmb3IgdGhlIC0qLSBDKysgLSotIGdzbGljZV9hcnJheSBjbGFzcy4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvZ3NsaWNlX2FycmF5LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2YWxhcnJheX0KKyAqLworCisvLyBXcml0dGVuIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPEdhYnJpZWwuRG9zLVJlaXNARFBUTWF0aHMuRU5TLUNhY2hhbi5Gcj4KKworI2lmbmRlZiBfR1NMSUNFX0FSUkFZX0gKKyNkZWZpbmUgX0dTTElDRV9BUlJBWV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIG51bWVyaWNfYXJyYXlzCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWZlcmVuY2UgdG8gbXVsdGktZGltZW5zaW9uYWwgc3Vic2V0IG9mIGFuIGFycmF5LgorICAgKgorICAgKiAgQSBnc2xpY2VfYXJyYXkgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBlbGVtZW50cyBvZiBhbiBhcnJheQorICAgKiAgc3BlY2lmaWVkIGJ5IGEgZ3NsaWNlLiAgVGhlIHdheSB0byBnZXQgYSBnc2xpY2VfYXJyYXkgaXMgdG8gY2FsbAorICAgKiAgb3BlcmF0b3JbXShnc2xpY2UpIG9uIGEgdmFsYXJyYXkuICBUaGUgcmV0dXJuZWQgZ3NsaWNlX2FycmF5IHRoZW4KKyAgICogIHBlcm1pdHMgY2Fycnlpbmcgb3BlcmF0aW9ucyBvdXQgb24gdGhlIHJlZmVyZW5jZWQgc3Vic2V0IG9mIGVsZW1lbnRzIGluCisgICAqICB0aGUgb3JpZ2luYWwgdmFsYXJyYXkuICBGb3IgZXhhbXBsZSwgb3BlcmF0b3IrPSh2YWxhcnJheSkgd2lsbCBhZGQKKyAgICogIHZhbHVlcyB0byB0aGUgc3Vic2V0IG9mIGVsZW1lbnRzIGluIHRoZSB1bmRlcmx5aW5nIHZhbGFycmF5IHRoaXMKKyAgICogIGdzbGljZV9hcnJheSByZWZlcnMgdG8uCisgICAqCisgICAqICBAcGFyYW0gIFRwICBFbGVtZW50IHR5cGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgZ3NsaWNlX2FycmF5CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDI1My4gdmFsYXJyYXkgaGVscGVyIGZ1bmN0aW9ucyBhcmUgYWxtb3N0IGVudGlyZWx5IHVzZWxlc3MKKworICAgICAgLy8vICBDb3B5IGNvbnN0cnVjdG9yLiAgQm90aCBzbGljZXMgcmVmZXIgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBhcnJheS4KKyAgICAgIGdzbGljZV9hcnJheShjb25zdCBnc2xpY2VfYXJyYXkmKTsKKworICAgICAgLy8vICBBc3NpZ25tZW50IG9wZXJhdG9yLiAgQXNzaWducyBzbGljZSBlbGVtZW50cyB0byBjb3JyZXNwb25kaW5nCisgICAgICAvLy8gIGVsZW1lbnRzIG9mIEBhIGEuCisgICAgICBnc2xpY2VfYXJyYXkmIG9wZXJhdG9yPShjb25zdCBnc2xpY2VfYXJyYXkmKTsKKworICAgICAgLy8vICBBc3NpZ24gc2xpY2UgZWxlbWVudHMgdG8gY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBNdWx0aXBseSBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yKj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBEaXZpZGUgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvci89KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTW9kdWxvIHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3IlPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIEFkZCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYgdG8gc2xpY2UgZWxlbWVudHMuCisgICAgICB2b2lkIG9wZXJhdG9yKz0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBTdWJ0cmFjdCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYgZnJvbSBzbGljZSBlbGVtZW50cy4KKyAgICAgIHZvaWQgb3BlcmF0b3ItPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExvZ2ljYWwgeG9yIHNsaWNlIGVsZW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcl49KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTG9naWNhbCBhbmQgc2xpY2UgZWxlbWVudHMgd2l0aCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yJj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMb2dpY2FsIG9yIHNsaWNlIGVsZW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcnw9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTGVmdCBzaGlmdCBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yPDw9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgUmlnaHQgc2hpZnQgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcj4+PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIEFzc2lnbiBhbGwgc2xpY2UgZWxlbWVudHMgdG8gQGEgdC4KKyAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IF9UcCYpIGNvbnN0OworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yKj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvci89KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3IlPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yKz0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvci09KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3JePShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yJj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcnw9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3I8PD0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcj4+PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgX0FycmF5PF9UcD4gICAgX01fYXJyYXk7CisgICAgICBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfTV9pbmRleDsKKworICAgICAgZnJpZW5kIGNsYXNzIHZhbGFycmF5PF9UcD47CisKKyAgICAgIGdzbGljZV9hcnJheShfQXJyYXk8X1RwPiwgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYpOworCisgICAgICAvLyBub3QgaW1wbGVtZW50ZWQKKyAgICAgIGdzbGljZV9hcnJheSgpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIGdzbGljZV9hcnJheTxfVHA+Ojpnc2xpY2VfYXJyYXkoX0FycmF5PF9UcD4gX19hLAorCQkJCSAgICBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2kpCisgICAgOiBfTV9hcnJheShfX2EpLCBfTV9pbmRleChfX2kpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIGdzbGljZV9hcnJheTxfVHA+Ojpnc2xpY2VfYXJyYXkoY29uc3QgZ3NsaWNlX2FycmF5PF9UcD4mIF9fYSkKKyAgICA6IF9NX2FycmF5KF9fYS5fTV9hcnJheSksIF9NX2luZGV4KF9fYS5fTV9pbmRleCkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGdzbGljZV9hcnJheTxfVHA+JgorICAgIGdzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgZ3NsaWNlX2FycmF5PF9UcD4mIF9fYSkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPihfX2EuX01fYXJyYXkpLAorCQkJICAgX0FycmF5PHNpemVfdD4oX19hLl9NX2luZGV4KSwgX01faW5kZXguc2l6ZSgpLAorCQkJICAgX01fYXJyYXksIF9BcnJheTxzaXplX3Q+KF9NX2luZGV4KSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGdzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgeworICAgICAgc3RkOjpfX3ZhbGFycmF5X2ZpbGwoX01fYXJyYXksIF9BcnJheTxzaXplX3Q+KF9NX2luZGV4KSwKKwkJCSAgIF9NX2luZGV4LnNpemUoKSwgX190KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgZ3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpIGNvbnN0CisgICAgeworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4oX192KSwgX192LnNpemUoKSwKKwkJCSAgIF9NX2FycmF5LCBfQXJyYXk8c2l6ZV90PihfTV9pbmRleCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgIGlubGluZSB2b2lkCisgICAgICBnc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSkgY29uc3QKKyAgICAgIHsKKwlzdGQ6Ol9fdmFsYXJyYXlfY29weSAoX19lLCBfTV9pbmRleC5zaXplKCksIF9NX2FycmF5LAorCQkJICAgICAgX0FycmF5PHNpemVfdD4oX01faW5kZXgpKTsKKyAgICAgIH0KKworI3VuZGVmIF9ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IKKyNkZWZpbmUgX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUihfT3AsIF9OYW1lKQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCQkJCQlcCisgICAgaW5saW5lIHZvaWQJCQkJCQkJCVwKKyAgICBnc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3IgX09wIyM9KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikgY29uc3QJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX01fYXJyYXksIF9BcnJheTxzaXplX3Q+KF9NX2luZGV4KSwJXAorCQkJICAgICAgIF9BcnJheTxfVHA+KF9fdiksIF9fdi5zaXplKCkpOwkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4JCQkJICAgICAgICAgICAgICAgIFwKKyAgICAgIGlubGluZSB2b2lkCQkJCQkJCVwKKyAgICAgIGdzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvciBfT3AjIz0gKGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSkgY29uc3RcCisgICAgICB7CQkJCQkJCQkJXAorCV9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfTV9hcnJheSwgX0FycmF5PHNpemVfdD4oX01faW5kZXgpLCBfX2UsXAorCQkJCSBfTV9pbmRleC5zaXplKCkpOwkJCVwKKyAgICAgIH0KKworX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigqLCBfX211bHRpcGxpZXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKC8sIF9fZGl2aWRlcykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoJSwgX19tb2R1bHVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigrLCBfX3BsdXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKC0sIF9fbWludXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKF4sIF9fYml0d2lzZV94b3IpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCYsIF9fYml0d2lzZV9hbmQpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKHwsIF9fYml0d2lzZV9vcikKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoPDwsIF9fc2hpZnRfbGVmdCkKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoPj4sIF9fc2hpZnRfcmlnaHQpCisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SCisKKyAgLy8gQH0gZ3JvdXAgbnVtZXJpY19hcnJheXMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0dTTElDRV9BUlJBWV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvaGFzaF9ieXRlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2hhc2hfYnl0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2U0ZTA1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2hhc2hfYnl0ZXMuaApAQCAtMCwwICsxLDU5IEBACisvLyBEZWNsYXJhdGlvbnMgZm9yIGhhc2ggZnVuY3Rpb25zLiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9oYXNoX2J5dGVzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtmdW5jdGlvbmFsfQorICovCisKKyNpZm5kZWYgX0hBU0hfQllURVNfSAorI2RlZmluZSBfSEFTSF9CWVRFU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworbmFtZXNwYWNlIHN0ZAoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBIYXNoIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbm9udHJpdmlhbCBzcGVjaWFsaXphdGlvbi4KKyAgLy8gQWxsIG9mIHRoZW0gYXJlIGJhc2VkIG9uIGEgcHJpbWl0aXZlIHRoYXQgaGFzaGVzIGEgcG9pbnRlciB0byBhCisgIC8vIGJ5dGUgYXJyYXkuIFRoZSBhY3R1YWwgaGFzaCBhbGdvcml0aG0gaXMgbm90IGd1YXJhbnRlZWQgdG8gc3RheQorICAvLyB0aGUgc2FtZSBmcm9tIHJlbGVhc2UgdG8gcmVsZWFzZSAtLSBpdCBtYXkgYmUgdXBkYXRlZCBvciB0dW5lZCB0bworICAvLyBpbXByb3ZlIGhhc2ggcXVhbGl0eSBvciBzcGVlZC4KKyAgc2l6ZV90CisgIF9IYXNoX2J5dGVzKGNvbnN0IHZvaWQqIF9fcHRyLCBzaXplX3QgX19sZW4sIHNpemVfdCBfX3NlZWQpOworCisgIC8vIEEgc2ltaWxhciBoYXNoIHByaW1pdGl2ZSwgdXNpbmcgdGhlIEZOViBoYXNoIGFsZ29yaXRobS4gVGhpcworICAvLyBhbGdvcml0aG0gaXMgZ3VhcmFudGVlZCB0byBzdGF5IHRoZSBzYW1lIGZyb20gcmVsZWFzZSB0byByZWxlYXNlLgorICAvLyAoYWx0aG91Z2ggaXQgbWlnaHQgbm90IHByb2R1Y2UgdGhlIHNhbWUgdmFsdWVzIG9uIGRpZmZlcmVudAorICAvLyBtYWNoaW5lcy4pCisgIHNpemVfdAorICBfRm52X2hhc2hfYnl0ZXMoY29uc3Qgdm9pZCogX19wdHIsIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fc2VlZCk7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvaGFzaHRhYmxlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvaGFzaHRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2ZTliYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9oYXNodGFibGUuaApAQCAtMCwwICsxLDE4MjMgQEAKKy8vIGhhc2h0YWJsZS5oIGhlYWRlciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9oYXNodGFibGUuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3Vub3JkZXJlZF9tYXAsIHVub3JkZXJlZF9zZXR9CisgKi8KKworI2lmbmRlZiBfSEFTSFRBQkxFX0gKKyNkZWZpbmUgX0hBU0hUQUJMRV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9oYXNodGFibGVfcG9saWN5Lmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9IYXNoPgorICAgIHVzaW5nIF9fY2FjaGVfZGVmYXVsdAorICAgICAgPSAgX19ub3RfPF9fYW5kXzwvLyBEbyBub3QgY2FjaGUgZm9yIGZhc3QgaGFzaGVyLgorCQkgICAgICAgX19pc19mYXN0X2hhc2g8X0hhc2g+LAorCQkgICAgICAgLy8gTWFuZGF0b3J5IHRvIG1ha2UgbG9jYWxfaXRlcmF0b3IgZGVmYXVsdAorCQkgICAgICAgLy8gY29uc3RydWN0aWJsZSBhbmQgYXNzaWduYWJsZS4KKwkJICAgICAgIGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxfSGFzaD4sCisJCSAgICAgICBpc19jb3B5X2Fzc2lnbmFibGU8X0hhc2g+LAorCQkgICAgICAgLy8gTWFuZGF0b3J5IHRvIGhhdmUgZXJhc2Ugbm90IHRocm93aW5nLgorCQkgICAgICAgX19kZXRhaWw6Ol9faXNfbm9leGNlcHRfaGFzaDxfVHAsIF9IYXNoPj4+OworCisgIC8qKgorICAgKiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBfSGFzaHRhYmxlLgorICAgKgorICAgKiAgQGluZ3JvdXAgaGFzaHRhYmxlLWRldGFpbAorICAgKgorICAgKiAgQHRwYXJhbSBfVmFsdWUgIENvcHlDb25zdHJ1Y3RpYmxlIHR5cGUuCisgICAqCisgICAqICBAdHBhcmFtIF9LZXkgICAgQ29weUNvbnN0cnVjdGlibGUgdHlwZS4KKyAgICoKKyAgICogIEB0cGFyYW0gX0FsbG9jICBBbiBhbGxvY2F0b3IgdHlwZQorICAgKiAgKFtsaWIuYWxsb2NhdG9yLnJlcXVpcmVtZW50c10pIHdob3NlIF9BbGxvYzo6dmFsdWVfdHlwZSBpcworICAgKiAgX1ZhbHVlLiAgQXMgYSBjb25mb3JtaW5nIGV4dGVuc2lvbiwgd2UgYWxsb3cgZm9yCisgICAqICBfQWxsb2M6OnZhbHVlX3R5cGUgIT0gX1ZhbHVlLgorICAgKgorICAgKiAgQHRwYXJhbSBfRXh0cmFjdEtleSAgRnVuY3Rpb24gb2JqZWN0IHRoYXQgdGFrZXMgYW4gb2JqZWN0IG9mIHR5cGUKKyAgICogIF9WYWx1ZSBhbmQgcmV0dXJucyBhIHZhbHVlIG9mIHR5cGUgX0tleS4KKyAgICoKKyAgICogIEB0cGFyYW0gX0VxdWFsICBGdW5jdGlvbiBvYmplY3QgdGhhdCB0YWtlcyB0d28gb2JqZWN0cyBvZiB0eXBlIGsKKyAgICogIGFuZCByZXR1cm5zIGEgYm9vbC1saWtlIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMKKyAgICogIGFyZSBjb25zaWRlcmVkIGVxdWFsLgorICAgKgorICAgKiAgQHRwYXJhbSBfSDEgIFRoZSBoYXNoIGZ1bmN0aW9uLiBBIHVuYXJ5IGZ1bmN0aW9uIG9iamVjdCB3aXRoCisgICAqICBhcmd1bWVudCB0eXBlIF9LZXkgYW5kIHJlc3VsdCB0eXBlIHNpemVfdC4gUmV0dXJuIHZhbHVlcyBzaG91bGQKKyAgICogIGJlIGRpc3RyaWJ1dGVkIG92ZXIgdGhlIGVudGlyZSByYW5nZSBbMCwgbnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6Om1heCgpXS4KKyAgICoKKyAgICogIEB0cGFyYW0gX0gyICBUaGUgcmFuZ2UtaGFzaGluZyBmdW5jdGlvbiAoaW4gdGhlIHRlcm1pbm9sb2d5IG9mCisgICAqICBUYXZvcmkgYW5kIERyZWl6aW4pLiAgQSBiaW5hcnkgZnVuY3Rpb24gb2JqZWN0IHdob3NlIGFyZ3VtZW50CisgICAqICB0eXBlcyBhbmQgcmVzdWx0IHR5cGUgYXJlIGFsbCBzaXplX3QuICBHaXZlbiBhcmd1bWVudHMgciBhbmQgTiwKKyAgICogIHRoZSByZXR1cm4gdmFsdWUgaXMgaW4gdGhlIHJhbmdlIFswLCBOKS4KKyAgICoKKyAgICogIEB0cGFyYW0gX0hhc2ggIFRoZSByYW5nZWQgaGFzaCBmdW5jdGlvbiAoVGF2b3JpIGFuZCBEcmVpemluKS4gQQorICAgKiAgYmluYXJ5IGZ1bmN0aW9uIHdob3NlIGFyZ3VtZW50IHR5cGVzIGFyZSBfS2V5IGFuZCBzaXplX3QgYW5kCisgICAqICB3aG9zZSByZXN1bHQgdHlwZSBpcyBzaXplX3QuICBHaXZlbiBhcmd1bWVudHMgayBhbmQgTiwgdGhlCisgICAqICByZXR1cm4gdmFsdWUgaXMgaW4gdGhlIHJhbmdlIFswLCBOKS4gIERlZmF1bHQ6IGhhc2goaywgTikgPQorICAgKiAgaDIoaDEoayksIE4pLiAgSWYgX0hhc2ggaXMgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCwgX0gxCisgICAqICBhbmQgX0gyIGFyZSBpZ25vcmVkLgorICAgKgorICAgKiAgQHRwYXJhbSBfUmVoYXNoUG9saWN5ICBQb2xpY3kgY2xhc3Mgd2l0aCB0aHJlZSBtZW1iZXJzLCBhbGwgb2YKKyAgICogIHdoaWNoIGdvdmVybiB0aGUgYnVja2V0IGNvdW50LiBfTV9uZXh0X2JrdChuKSByZXR1cm5zIGEgYnVja2V0CisgICAqICBjb3VudCBubyBzbWFsbGVyIHRoYW4gbi4gIF9NX2JrdF9mb3JfZWxlbWVudHMobikgcmV0dXJucyBhCisgICAqICBidWNrZXQgY291bnQgYXBwcm9wcmlhdGUgZm9yIGFuIGVsZW1lbnQgY291bnQgb2Ygbi4KKyAgICogIF9NX25lZWRfcmVoYXNoKG5fYmt0LCBuX2VsdCwgbl9pbnMpIGRldGVybWluZXMgd2hldGhlciwgaWYgdGhlCisgICAqICBjdXJyZW50IGJ1Y2tldCBjb3VudCBpcyBuX2JrdCBhbmQgdGhlIGN1cnJlbnQgZWxlbWVudCBjb3VudCBpcworICAgKiAgbl9lbHQsIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIGJ1Y2tldCBjb3VudC4gIElmIHNvLCByZXR1cm5zCisgICAqICBtYWtlX3BhaXIodHJ1ZSwgbiksIHdoZXJlIG4gaXMgdGhlIG5ldyBidWNrZXQgY291bnQuICBJZiBub3QsCisgICAqICByZXR1cm5zIG1ha2VfcGFpcihmYWxzZSwgPGFueXRoaW5nPikKKyAgICoKKyAgICogIEB0cGFyYW0gX1RyYWl0cyAgQ29tcGlsZS10aW1lIGNsYXNzIHdpdGggdGhyZWUgYm9vbGVhbgorICAgKiAgc3RkOjppbnRlZ3JhbF9jb25zdGFudCBtZW1iZXJzOiAgX19jYWNoZV9oYXNoX2NvZGUsIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorICAgKiAgIF9fdW5pcXVlX2tleXMuCisgICAqCisgICAqICBFYWNoIF9IYXNodGFibGUgZGF0YSBzdHJ1Y3R1cmUgaGFzOgorICAgKgorICAgKiAgLSBfQnVja2V0W10gICAgICAgX01fYnVja2V0cworICAgKiAgLSBfSGFzaF9ub2RlX2Jhc2UgX01fYmJlZ2luCisgICAqICAtIHNpemVfdHlwZSAgICAgICBfTV9idWNrZXRfY291bnQKKyAgICogIC0gc2l6ZV90eXBlICAgICAgIF9NX2VsZW1lbnRfY291bnQKKyAgICoKKyAgICogIHdpdGggX0J1Y2tldCBiZWluZyBfSGFzaF9ub2RlKiBhbmQgX0hhc2hfbm9kZSBjb250YWluaW5nOgorICAgKgorICAgKiAgLSBfSGFzaF9ub2RlKiAgIF9NX25leHQKKyAgICogIC0gVHAgICAgICAgICAgICBfTV92YWx1ZQorICAgKiAgLSBzaXplX3QgICAgICAgIF9NX2hhc2hfY29kZSBpZiBjYWNoZV9oYXNoX2NvZGUgaXMgdHJ1ZQorICAgKgorICAgKiAgSW4gdGVybXMgb2YgU3RhbmRhcmQgY29udGFpbmVycyB0aGUgaGFzaHRhYmxlIGlzIGxpa2UgdGhlIGFnZ3JlZ2F0aW9uIG9mOgorICAgKgorICAgKiAgLSBzdGQ6OmZvcndhcmRfbGlzdDxfTm9kZT4gY29udGFpbmluZyB0aGUgZWxlbWVudHMKKyAgICogIC0gc3RkOjp2ZWN0b3I8c3RkOjpmb3J3YXJkX2xpc3Q8X05vZGU+OjppdGVyYXRvcj4gcmVwcmVzZW50aW5nIHRoZSBidWNrZXRzCisgICAqCisgICAqICBUaGUgbm9uLWVtcHR5IGJ1Y2tldHMgY29udGFpbiB0aGUgbm9kZSBiZWZvcmUgdGhlIGZpcnN0IG5vZGUgaW4gdGhlCisgICAqICBidWNrZXQuIFRoaXMgZGVzaWduIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGltcGxlbWVudCBzb21ldGhpbmcgbGlrZSBhCisgICAqICBzdGQ6OmZvcndhcmRfbGlzdDo6aW5zZXJ0X2FmdGVyIG9uIGNvbnRhaW5lciBpbnNlcnRpb24gYW5kCisgICAqICBzdGQ6OmZvcndhcmRfbGlzdDo6ZXJhc2VfYWZ0ZXIgb24gY29udGFpbmVyIGVyYXNlCisgICAqICBjYWxscy4gX01fYmVmb3JlX2JlZ2luIGlzIGVxdWl2YWxlbnQgdG8KKyAgICogIHN0ZDo6Zm9yd2FyZF9saXN0OjpiZWZvcmVfYmVnaW4uIEVtcHR5IGJ1Y2tldHMgY29udGFpbgorICAgKiAgbnVsbHB0ci4gIE5vdGUgdGhhdCBvbmUgb2YgdGhlIG5vbi1lbXB0eSBidWNrZXRzIGNvbnRhaW5zCisgICAqICAmX01fYmVmb3JlX2JlZ2luIHdoaWNoIGlzIG5vdCBhIGRlcmVmZXJlbmNlYWJsZSBub2RlIHNvIHRoZQorICAgKiAgbm9kZSBwb2ludGVyIGluIGEgYnVja2V0IHNoYWxsIG5ldmVyIGJlIGRlcmVmZXJlbmNlZCwgb25seSBpdHMKKyAgICogIG5leHQgbm9kZSBjYW4gYmUuCisgICAqCisgICAqICBXYWxraW5nIHRocm91Z2ggYSBidWNrZXQncyBub2RlcyByZXF1aXJlcyBhIGNoZWNrIG9uIHRoZSBoYXNoIGNvZGUgdG8KKyAgICogIHNlZSBpZiBlYWNoIG5vZGUgaXMgc3RpbGwgaW4gdGhlIGJ1Y2tldC4gU3VjaCBhIGRlc2lnbiBhc3N1bWVzIGEKKyAgICogIHF1aXRlIGVmZmljaWVudCBoYXNoIGZ1bmN0b3IgYW5kIGlzIG9uZSBvZiB0aGUgcmVhc29ucyBpdCBpcworICAgKiAgaGlnaGx5IGFkdmlzYWJsZSB0byBzZXQgX19jYWNoZV9oYXNoX2NvZGUgdG8gdHJ1ZS4KKyAgICoKKyAgICogIFRoZSBjb250YWluZXIgaXRlcmF0b3JzIGFyZSBzaW1wbHkgYnVpbHQgZnJvbSBub2Rlcy4gVGhpcyB3YXkKKyAgICogIGluY3JlbWVudGluZyB0aGUgaXRlcmF0b3IgaXMgcGVyZmVjdGx5IGVmZmljaWVudCBpbmRlcGVuZGVudCBvZgorICAgKiAgaG93IG1hbnkgZW1wdHkgYnVja2V0cyB0aGVyZSBhcmUgaW4gdGhlIGNvbnRhaW5lci4KKyAgICoKKyAgICogIE9uIGluc2VydCB3ZSBjb21wdXRlIHRoZSBlbGVtZW50J3MgaGFzaCBjb2RlIGFuZCB1c2UgaXQgdG8gZmluZCB0aGUKKyAgICogIGJ1Y2tldCBpbmRleC4gSWYgdGhlIGVsZW1lbnQgbXVzdCBiZSBpbnNlcnRlZCBpbiBhbiBlbXB0eSBidWNrZXQKKyAgICogIHdlIGFkZCBpdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzaW5nbHkgbGlua2VkIGxpc3QgYW5kIG1ha2UgdGhlCisgICAqICBidWNrZXQgcG9pbnQgdG8gX01fYmVmb3JlX2JlZ2luLiBUaGUgYnVja2V0IHRoYXQgdXNlZCB0byBwb2ludCB0bworICAgKiAgX01fYmVmb3JlX2JlZ2luLCBpZiBhbnksIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gaXRzIG5ldyBiZWZvcmUKKyAgICogIGJlZ2luIG5vZGUuCisgICAqCisgICAqICBPbiBlcmFzZSwgdGhlIHNpbXBsZSBpdGVyYXRvciBkZXNpZ24gcmVxdWlyZXMgdXNpbmcgdGhlIGhhc2gKKyAgICogIGZ1bmN0b3IgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgYnVja2V0IHRvIHVwZGF0ZS4gRm9yIHRoaXMKKyAgICogIHJlYXNvbiwgd2hlbiBfX2NhY2hlX2hhc2hfY29kZSBpcyBzZXQgdG8gZmFsc2UgdGhlIGhhc2ggZnVuY3RvciBtdXN0CisgICAqICBub3QgdGhyb3cgYW5kIHRoaXMgaXMgZW5mb3JjZWQgYnkgYSBzdGF0aWMgYXNzZXJ0aW9uLgorICAgKgorICAgKiAgRnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZCBieSBkZWNvbXBvc2l0aW9uIGludG8gYmFzZSBjbGFzc2VzLAorICAgKiAgd2hlcmUgdGhlIGRlcml2ZWQgX0hhc2h0YWJsZSBjbGFzcyBpcyB1c2VkIGluIF9NYXBfYmFzZSwKKyAgICogIF9JbnNlcnQsIF9SZWhhc2hfYmFzZSwgYW5kIF9FcXVhbGl0eSBiYXNlIGNsYXNzZXMgdG8gYWNjZXNzIHRoZQorICAgKiAgInRoaXMiIHBvaW50ZXIuIF9IYXNodGFibGVfYmFzZSBpcyB1c2VkIGluIHRoZSBiYXNlIGNsYXNzZXMgYXMgYQorICAgKiAgbm9uLXJlY3Vyc2l2ZSwgZnVsbHktY29tcGxldGVkLXR5cGUgc28gdGhhdCBkZXRhaWxlZCBuZXN0ZWQgdHlwZQorICAgKiAgaW5mb3JtYXRpb24sIHN1Y2ggYXMgaXRlcmF0b3IgdHlwZSBhbmQgbm9kZSB0eXBlLCBjYW4gYmUKKyAgICogIHVzZWQuIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgIkN1cmlvdXNseSBSZWN1cnJpbmcgVGVtcGxhdGUKKyAgICogIFBhdHRlcm4iIChDUlRQKSB0ZWNobmlxdWUsIGJ1dCB1c2VzIGEgcmVjb25zdHJ1Y3RlZCwgbm90CisgICAqICBleHBsaWNpdGx5IHBhc3NlZCwgdGVtcGxhdGUgcGF0dGVybi4KKyAgICoKKyAgICogIEJhc2UgY2xhc3MgdGVtcGxhdGVzIGFyZTogCisgICAqICAgIC0gX19kZXRhaWw6Ol9IYXNodGFibGVfYmFzZQorICAgKiAgICAtIF9fZGV0YWlsOjpfTWFwX2Jhc2UKKyAgICogICAgLSBfX2RldGFpbDo6X0luc2VydAorICAgKiAgICAtIF9fZGV0YWlsOjpfUmVoYXNoX2Jhc2UKKyAgICogICAgLSBfX2RldGFpbDo6X0VxdWFsaXR5CisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIF9IYXNodGFibGUKKyAgICA6IHB1YmxpYyBfX2RldGFpbDo6X0hhc2h0YWJsZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCQkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfVHJhaXRzPiwKKyAgICAgIHB1YmxpYyBfX2RldGFpbDo6X01hcF9iYXNlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJCSBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+LAorICAgICAgcHVibGljIF9fZGV0YWlsOjpfSW5zZXJ0PF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz4sCisgICAgICBwdWJsaWMgX19kZXRhaWw6Ol9SZWhhc2hfYmFzZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCQkgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPiwKKyAgICAgIHB1YmxpYyBfX2RldGFpbDo6X0VxdWFsaXR5PF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJCSBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiBfRXF1YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2VxdWFsOworCisgICAgICAvLyBtYXBwZWRfdHlwZSwgaWYgcHJlc2VudCwgY29tZXMgZnJvbSBfTWFwX2Jhc2UuCisgICAgICAvLyBoYXNoZXIsIGlmIHByZXNlbnQsIGNvbWVzIGZyb20gX0hhc2hfY29kZV9iYXNlL19IYXNodGFibGVfYmFzZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpwb2ludGVyCQkgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmNvbnN0X3BvaW50ZXIgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpyZWZlcmVuY2UgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpjb25zdF9yZWZlcmVuY2UgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgIHByaXZhdGU6CisgICAgICB1c2luZyBfX3JlaGFzaF90eXBlID0gX1JlaGFzaFBvbGljeTsKKyAgICAgIHVzaW5nIF9fcmVoYXNoX3N0YXRlID0gdHlwZW5hbWUgX19yZWhhc2hfdHlwZTo6X1N0YXRlOworCisgICAgICB1c2luZyBfX3RyYWl0c190eXBlID0gX1RyYWl0czsKKyAgICAgIHVzaW5nIF9faGFzaF9jYWNoZWQgPSB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpfX2hhc2hfY2FjaGVkOworICAgICAgdXNpbmcgX19jb25zdGFudF9pdGVyYXRvcnMgPSB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpfX2NvbnN0YW50X2l0ZXJhdG9yczsKKyAgICAgIHVzaW5nIF9fdW5pcXVlX2tleXMgPSB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpfX3VuaXF1ZV9rZXlzOworCisgICAgICB1c2luZyBfX2tleV9leHRyYWN0ID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDwKKwkJCQkJICAgICBfX2NvbnN0YW50X2l0ZXJhdG9yczo6dmFsdWUsCisJCQkJICAgICAgIAkgICAgIF9fZGV0YWlsOjpfSWRlbnRpdHksCisJCQkJCSAgICAgX19kZXRhaWw6Ol9TZWxlY3Qxc3Q+Ojp0eXBlOworCisgICAgICB1c2luZyBfX2hhc2h0YWJsZV9iYXNlID0gX19kZXRhaWw6OgorCQkJICAgICAgIF9IYXNodGFibGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LAorCQkJCQkgICAgICBfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwgX1RyYWl0cz47CisKKyAgICAgIHVzaW5nIF9faGFzaF9jb2RlX2Jhc2UgPSAgdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6X19oYXNoX2NvZGVfYmFzZTsKKyAgICAgIHVzaW5nIF9faGFzaF9jb2RlID0gIHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6Ol9faGFzaF9jb2RlOworICAgICAgdXNpbmcgX19ub2RlX3R5cGUgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjpfX25vZGVfdHlwZTsKKyAgICAgIHVzaW5nIF9fbm9kZV9iYXNlID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6X19ub2RlX2Jhc2U7CisgICAgICB1c2luZyBfX2J1Y2tldF90eXBlID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6X19idWNrZXRfdHlwZTsKKyAgICAgIHVzaW5nIF9faXJldHVybl90eXBlID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6X19pcmV0dXJuX3R5cGU7CisgICAgICB1c2luZyBfX2ljb252X3R5cGUgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjpfX2ljb252X3R5cGU7CisKKyAgICAgIHVzaW5nIF9fbWFwX2Jhc2UgPSBfX2RldGFpbDo6X01hcF9iYXNlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwKKwkJCQkJICAgICBfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwKKwkJCQkJICAgICBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjsKKworICAgICAgdXNpbmcgX19yZWhhc2hfYmFzZSA9IF9fZGV0YWlsOjpfUmVoYXNoX2Jhc2U8X0tleSwgX1ZhbHVlLCBfQWxsb2MsCisJCQkJCQkgICBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJCQkJICAgX0gxLCBfSDIsIF9IYXNoLAorCQkJCQkJICAgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz47CisKKyAgICAgIHVzaW5nIF9fZXFfYmFzZSA9IF9fZGV0YWlsOjpfRXF1YWxpdHk8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LAorCQkJCQkgICAgX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCQkJCSAgICBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjsKKworICAgICAgLy8gTWV0YXByb2dyYW1taW5nIGZvciBwaWNraW5nIGFwYXJ0IGhhc2ggY2FjaGluZy4KKyAgICAgIHVzaW5nIF9faGFzaF9ub2V4Y2VwdCA9IF9fZGV0YWlsOjpfX2lzX25vZXhjZXB0X2hhc2g8X0tleSwgX0gxPjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbmQ+CisJdXNpbmcgX19pZl9oYXNoX2NhY2hlZCA9IF9fb3JfPF9fbm90XzxfX2hhc2hfY2FjaGVkPiwgX0NvbmQ+OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29uZD4KKwl1c2luZyBfX2lmX2hhc2hfbm90X2NhY2hlZCA9IF9fb3JfPF9faGFzaF9jYWNoZWQsIF9Db25kPjsKKworICAgICAgLy8gQ29tcGlsZS10aW1lIGRpYWdub3N0aWNzLgorCisgICAgICAvLyBXaGVuIGhhc2ggY29kZXMgYXJlIG5vdCBjYWNoZWQgdGhlIGhhc2ggZnVuY3RvciBzaGFsbCBub3QKKyAgICAgIC8vIHRocm93IGJlY2F1c2UgaXQgaXMgdXNlZCBpbiBtZXRob2RzIChlcmFzZSwgc3dhcC4uLikgdGhhdAorICAgICAgLy8gc2hhbGwgbm90IHRocm93LgorICAgICAgc3RhdGljX2Fzc2VydChfX2lmX2hhc2hfbm90X2NhY2hlZDxfX2hhc2hfbm9leGNlcHQ+Ojp2YWx1ZSwKKwkJICAgICJDYWNoZSB0aGUgaGFzaCBjb2RlIgorCQkgICAgIiBvciBxdWFsaWZ5IHlvdXIgaGFzaCBmdW5jdG9yIHdpdGggbm9leGNlcHQiKTsKKworICAgICAgLy8gRm9sbG93aW5nIHR3byBzdGF0aWMgYXNzZXJ0aW9ucyBhcmUgbmVjZXNzYXJ5IHRvIGd1YXJhbnRlZQorICAgICAgLy8gdGhhdCBsb2NhbF9pdGVyYXRvciB3aWxsIGJlIGRlZmF1bHQgY29uc3RydWN0aWJsZS4KKworICAgICAgLy8gV2hlbiBoYXNoIGNvZGVzIGFyZSBjYWNoZWQgbG9jYWwgaXRlcmF0b3IgaW5oZXJpdHMgZnJvbSBIMiBmdW5jdG9yCisgICAgICAvLyB3aGljaCBtdXN0IHRoZW4gYmUgZGVmYXVsdCBjb25zdHJ1Y3RpYmxlLgorICAgICAgc3RhdGljX2Fzc2VydChfX2lmX2hhc2hfY2FjaGVkPGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxfSDI+Pjo6dmFsdWUsCisJCSAgICAiRnVuY3RvciB1c2VkIHRvIG1hcCBoYXNoIGNvZGUgdG8gYnVja2V0IGluZGV4IgorCQkgICAgIiBtdXN0IGJlIGRlZmF1bHQgY29uc3RydWN0aWJsZSIpOworCisgICAgICAvLyBXaGVuIGhhc2ggY29kZXMgYXJlIG5vdCBjYWNoZWQgbG9jYWwgaXRlcmF0b3IgaW5oZXJpdHMgZnJvbQorICAgICAgLy8gX19oYXNoX2NvZGVfYmFzZSBhYm92ZSB0byBjb21wdXRlIG5vZGUgYnVja2V0IGluZGV4IHNvIGl0IGhhcyB0byBiZQorICAgICAgLy8gZGVmYXVsdCBjb25zdHJ1Y3RpYmxlLgorICAgICAgc3RhdGljX2Fzc2VydChfX2lmX2hhc2hfbm90X2NhY2hlZDwKKwkJICAgIGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTwKKwkJICAgICAgLy8gV2UgdXNlIF9IYXNodGFibGVfZWJvX2hlbHBlciB0byBhY2Nlc3MgdGhlIHByb3RlY3RlZAorCQkgICAgICAvLyBkZWZhdWx0IGNvbnN0cnVjdG9yLgorCQkgICAgICBfX2RldGFpbDo6X0hhc2h0YWJsZV9lYm9faGVscGVyPDAsIF9faGFzaF9jb2RlX2Jhc2U+Pj46OnZhbHVlLAorCQkgICAgIkNhY2hlIHRoZSBoYXNoIGNvZGUgb3IgbWFrZSBmdW5jdG9ycyBpbnZvbHZlZCBpbiBoYXNoIGNvZGUiCisJCSAgICAiIGFuZCBidWNrZXQgaW5kZXggY29tcHV0YXRpb24gZGVmYXVsdCBjb25zdHJ1Y3RpYmxlIik7CisKKyAgICAgIC8vIFdoZW4gaGFzaCBjb2RlcyBhcmUgbm90IGNhY2hlZCBsb2NhbCBpdGVyYXRvciBpbmhlcml0cyBmcm9tCisgICAgICAvLyBfX2hhc2hfY29kZV9iYXNlIGFib3ZlIHRvIGNvbXB1dGUgbm9kZSBidWNrZXQgaW5kZXggc28gaXQgaGFzIHRvIGJlCisgICAgICAvLyBhc3NpZ25hYmxlLgorICAgICAgc3RhdGljX2Fzc2VydChfX2lmX2hhc2hfbm90X2NhY2hlZDwKKwkJICAgICAgaXNfY29weV9hc3NpZ25hYmxlPF9faGFzaF9jb2RlX2Jhc2U+Pjo6dmFsdWUsCisJCSAgICAiQ2FjaGUgdGhlIGhhc2ggY29kZSBvciBtYWtlIGZ1bmN0b3JzIGludm9sdmVkIGluIGhhc2ggY29kZSIKKwkJICAgICIgYW5kIGJ1Y2tldCBpbmRleCBjb21wdXRhdGlvbiBjb3B5IGFzc2lnbmFibGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXlhLCB0eXBlbmFtZSBfVmFsdWVhLCB0eXBlbmFtZSBfQWxsb2NhLAorCSAgICAgICB0eXBlbmFtZSBfRXh0cmFjdEtleWEsIHR5cGVuYW1lIF9FcXVhbGEsCisJICAgICAgIHR5cGVuYW1lIF9IMWEsIHR5cGVuYW1lIF9IMmEsIHR5cGVuYW1lIF9IYXNoYSwKKwkgICAgICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeWEsIHR5cGVuYW1lIF9UcmFpdHNhLAorCSAgICAgICBib29sIF9VbmlxdWVfa2V5c2E+CisJZnJpZW5kIHN0cnVjdCBfX2RldGFpbDo6X01hcF9iYXNlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5YSwgdHlwZW5hbWUgX1ZhbHVlYSwgdHlwZW5hbWUgX0FsbG9jYSwKKwkgICAgICAgdHlwZW5hbWUgX0V4dHJhY3RLZXlhLCB0eXBlbmFtZSBfRXF1YWxhLAorCSAgICAgICB0eXBlbmFtZSBfSDFhLCB0eXBlbmFtZSBfSDJhLCB0eXBlbmFtZSBfSGFzaGEsCisJICAgICAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3lhLCB0eXBlbmFtZSBfVHJhaXRzYT4KKwlmcmllbmQgc3RydWN0IF9fZGV0YWlsOjpfSW5zZXJ0X2Jhc2U7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXlhLCB0eXBlbmFtZSBfVmFsdWVhLCB0eXBlbmFtZSBfQWxsb2NhLAorCSAgICAgICB0eXBlbmFtZSBfRXh0cmFjdEtleWEsIHR5cGVuYW1lIF9FcXVhbGEsCisJICAgICAgIHR5cGVuYW1lIF9IMWEsIHR5cGVuYW1lIF9IMmEsIHR5cGVuYW1lIF9IYXNoYSwKKwkgICAgICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeWEsIHR5cGVuYW1lIF9UcmFpdHNhLAorCSAgICAgICBib29sIF9Db25zdGFudF9pdGVyYXRvcnNhLCBib29sIF9VbmlxdWVfa2V5c2E+CisJZnJpZW5kIHN0cnVjdCBfX2RldGFpbDo6X0luc2VydDsKKworICAgICAgdXNpbmcgc2l6ZV90eXBlID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6c2l6ZV90eXBlOworICAgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6ZGlmZmVyZW5jZV90eXBlOworCisgICAgICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6Oml0ZXJhdG9yOworICAgICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjpjb25zdF9pdGVyYXRvcjsKKworICAgICAgdXNpbmcgbG9jYWxfaXRlcmF0b3IgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjpsb2NhbF9pdGVyYXRvcjsKKyAgICAgIHVzaW5nIGNvbnN0X2xvY2FsX2l0ZXJhdG9yID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6CisJCQkJICAgY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfX25vZGVfdHlwZT46Om90aGVyCisJCQkJCQkJX05vZGVfYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9fYnVja2V0X3R5cGU+OjpvdGhlcgorCQkJCQkJCV9CdWNrZXRfYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIHVzaW5nIF9fYmVmb3JlX2JlZ2luID0gX19kZXRhaWw6Ol9CZWZvcmVfYmVnaW48X05vZGVfYWxsb2NhdG9yX3R5cGU+OworCisgICAgICBfX2J1Y2tldF90eXBlKgkJX01fYnVja2V0czsKKyAgICAgIHNpemVfdHlwZQkJCV9NX2J1Y2tldF9jb3VudDsKKyAgICAgIF9fYmVmb3JlX2JlZ2luCQlfTV9iYmVnaW47CisgICAgICBzaXplX3R5cGUJCQlfTV9lbGVtZW50X2NvdW50OworICAgICAgX1JlaGFzaFBvbGljeQkJX01fcmVoYXNoX3BvbGljeTsKKworICAgICAgX05vZGVfYWxsb2NhdG9yX3R5cGUmCisgICAgICBfTV9ub2RlX2FsbG9jYXRvcigpCisgICAgICB7IHJldHVybiBfTV9iYmVnaW47IH0KKworICAgICAgY29uc3QgX05vZGVfYWxsb2NhdG9yX3R5cGUmCisgICAgICBfTV9ub2RlX2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9iYmVnaW47IH0KKworICAgICAgX19ub2RlX2Jhc2UmCisgICAgICBfTV9iZWZvcmVfYmVnaW4oKQorICAgICAgeyByZXR1cm4gX01fYmJlZ2luLl9NX25vZGU7IH0KKworICAgICAgY29uc3QgX19ub2RlX2Jhc2UmCisgICAgICBfTV9iZWZvcmVfYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYmJlZ2luLl9NX25vZGU7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJX19ub2RlX3R5cGUqCisJX01fYWxsb2NhdGVfbm9kZShfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZShfX25vZGVfdHlwZSogX19uKTsKKworICAgICAgLy8gRGVhbGxvY2F0ZSB0aGUgbGlua2VkIGxpc3Qgb2Ygbm9kZXMgcG9pbnRlZCB0byBieSBfX24KKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZXMoX19ub2RlX3R5cGUqIF9fbik7CisKKyAgICAgIF9fYnVja2V0X3R5cGUqCisgICAgICBfTV9hbGxvY2F0ZV9idWNrZXRzKHNpemVfdHlwZSBfX24pOworCisgICAgICB2b2lkCisgICAgICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoX19idWNrZXRfdHlwZSosIHNpemVfdHlwZSBfX24pOworCisgICAgICAvLyBHZXRzIGJ1Y2tldCBiZWdpbiwgZGVhbHMgd2l0aCB0aGUgZmFjdCB0aGF0IG5vbi1lbXB0eSBidWNrZXRzIGNvbnRhaW4KKyAgICAgIC8vIHRoZWlyIGJlZm9yZSBiZWdpbiBub2RlLgorICAgICAgX19ub2RlX3R5cGUqCisgICAgICBfTV9idWNrZXRfYmVnaW4oc2l6ZV90eXBlIF9fYmt0KSBjb25zdDsKKworICAgICAgX19ub2RlX3R5cGUqCisgICAgICBfTV9iZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfX25vZGVfdHlwZSo+KF9NX2JlZm9yZV9iZWdpbigpLl9NX254dCk7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENvbnN0cnVjdG9yLCBkZXN0cnVjdG9yLCBhc3NpZ25tZW50LCBzd2FwCisgICAgICBfSGFzaHRhYmxlKHNpemVfdHlwZSBfX2J1Y2tldF9oaW50LAorCQkgY29uc3QgX0gxJiwgY29uc3QgX0gyJiwgY29uc3QgX0hhc2gmLAorCQkgY29uc3QgX0VxdWFsJiwgY29uc3QgX0V4dHJhY3RLZXkmLAorCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJX0hhc2h0YWJsZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgIHNpemVfdHlwZSBfX2J1Y2tldF9oaW50LAorCQkgICBjb25zdCBfSDEmLCBjb25zdCBfSDImLCBjb25zdCBfSGFzaCYsCisJCSAgIGNvbnN0IF9FcXVhbCYsIGNvbnN0IF9FeHRyYWN0S2V5JiwKKwkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmKTsKKworICAgICAgX0hhc2h0YWJsZShjb25zdCBfSGFzaHRhYmxlJik7CisKKyAgICAgIF9IYXNodGFibGUoX0hhc2h0YWJsZSYmKTsKKworICAgICAgLy8gVXNlIGRlbGVnYXRpbmcgY29uc3RydWN0b3JzLgorICAgICAgZXhwbGljaXQKKyAgICAgIF9IYXNodGFibGUoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkgY29uc3QgX0gxJiBfX2hmID0gX0gxKCksCisJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0hhc2h0YWJsZShfX24sIF9faGYsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcoKSwKKwkJICAgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoKCksIF9fZXFsLAorCQkgICBfX2tleV9leHRyYWN0KCksIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwlfSGFzaHRhYmxlKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgY29uc3QgX0gxJiBfX2hmID0gX0gxKCksCisJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfSGFzaHRhYmxlKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcoKSwKKwkJICAgICBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwgX19lcWwsCisJCSAgICAgX19rZXlfZXh0cmFjdCgpLCBfX2EpCisJeyB9CisKKyAgICAgIF9IYXNodGFibGUoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJCSBzaXplX3R5cGUgX19uID0gMCwKKwkJIGNvbnN0IF9IMSYgX19oZiA9IF9IMSgpLAorCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9IYXNodGFibGUoX19sLmJlZ2luKCksIF9fbC5lbmQoKSwgX19uLCBfX2hmLAorCQkgICBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nKCksCisJCSAgIF9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCgpLCBfX2VxbCwKKwkJICAgX19rZXlfZXh0cmFjdCgpLCBfX2EpCisgICAgICB7IH0KKworICAgICAgX0hhc2h0YWJsZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfSGFzaHRhYmxlJiBfX2h0KQorICAgICAgeworCV9IYXNodGFibGUgX190bXAoX19odCk7CisJdGhpcy0+c3dhcChfX3RtcCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfSGFzaHRhYmxlJgorICAgICAgb3BlcmF0b3I9KF9IYXNodGFibGUmJiBfX2h0KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9faHQpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0hhc2h0YWJsZSYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIH5fSGFzaHRhYmxlKCkgbm9leGNlcHQ7CisKKyAgICAgIHZvaWQgc3dhcChfSGFzaHRhYmxlJik7CisKKyAgICAgIC8vIEJhc2ljIGNvbnRhaW5lciBvcGVyYXRpb25zCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX01fYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9NX2JlZ2luKCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IobnVsbHB0cik7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihudWxscHRyKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9NX2JlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKG51bGxwdHIpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9lbGVtZW50X2NvdW50OyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX25vZGVfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fbm9kZV9hbGxvY2F0b3IoKS5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8vIE9ic2VydmVycworICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZXEoKTsgfQorCisgICAgICAvLyBoYXNoX2Z1bmN0aW9uLCBpZiBwcmVzZW50LCBjb21lcyBmcm9tIF9IYXNoX2NvZGVfYmFzZS4KKworICAgICAgLy8gQnVja2V0IG9wZXJhdGlvbnMKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2J1Y2tldF9jb3VudDsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gbWF4X3NpemUoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6OmRpc3RhbmNlKGJlZ2luKF9fbiksIGVuZChfX24pKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYnVja2V0X2luZGV4KF9faywgdGhpcy0+X01faGFzaF9jb2RlKF9faykpOyB9CisKKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKQorICAgICAgeworCXJldHVybiBsb2NhbF9pdGVyYXRvcigqdGhpcywgX01fYnVja2V0X2JlZ2luKF9fbiksCisJCQkgICAgICBfX24sIF9NX2J1Y2tldF9jb3VudCk7CisgICAgICB9CisKKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKCp0aGlzLCBudWxscHRyLCBfX24sIF9NX2J1Y2tldF9jb3VudCk7IH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKCp0aGlzLCBfTV9idWNrZXRfYmVnaW4oX19uKSwKKwkJCQkgICAgX19uLCBfTV9idWNrZXRfY291bnQpOworICAgICAgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcigqdGhpcywgbnVsbHB0ciwgX19uLCBfTV9idWNrZXRfY291bnQpOyB9CisKKyAgICAgIC8vIERSIDY5MS4KKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoKnRoaXMsIF9NX2J1Y2tldF9iZWdpbihfX24pLAorCQkJCSAgICBfX24sIF9NX2J1Y2tldF9jb3VudCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcigqdGhpcywgbnVsbHB0ciwgX19uLCBfTV9idWNrZXRfY291bnQpOyB9CisKKyAgICAgIGZsb2F0CisgICAgICBsb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisJcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihzaXplKCkpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJ1Y2tldF9jb3VudCgpKTsKKyAgICAgIH0KKworICAgICAgLy8gbWF4X2xvYWRfZmFjdG9yLCBpZiBwcmVzZW50LCBjb21lcyBmcm9tIF9SZWhhc2hfYmFzZS4KKworICAgICAgLy8gR2VuZXJhbGl6YXRpb24gb2YgbWF4X2xvYWRfZmFjdG9yLiAgRXh0ZW5zaW9uLCBub3QgZm91bmQgaW4KKyAgICAgIC8vIFRSMS4gIE9ubHkgdXNlZnVsIGlmIF9SZWhhc2hQb2xpY3kgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4KKyAgICAgIC8vIHRoZSBkZWZhdWx0LgorICAgICAgY29uc3QgX1JlaGFzaFBvbGljeSYKKyAgICAgIF9fcmVoYXNoX3BvbGljeSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9yZWhhc2hfcG9saWN5OyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9fcmVoYXNoX3BvbGljeShjb25zdCBfUmVoYXNoUG9saWN5Jik7CisKKyAgICAgIC8vIExvb2t1cC4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spOworCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdDsKKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdDsKKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spOworCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyBCdWNrZXQgaW5kZXggY29tcHV0YXRpb24gaGVscGVycy4KKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fYnVja2V0X2luZGV4KF9fbm9kZV90eXBlKiBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfX2hhc2hfY29kZV9iYXNlOjpfTV9idWNrZXRfaW5kZXgoX19uLCBfTV9idWNrZXRfY291bnQpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fYnVja2V0X2luZGV4KGNvbnN0IGtleV90eXBlJiBfX2ssIF9faGFzaF9jb2RlIF9fYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9faGFzaF9jb2RlX2Jhc2U6Ol9NX2J1Y2tldF9pbmRleChfX2ssIF9fYywgX01fYnVja2V0X2NvdW50KTsgfQorCisgICAgICAvLyBGaW5kIGFuZCBpbnNlcnQgaGVscGVyIGZ1bmN0aW9ucyBhbmQgdHlwZXMKKyAgICAgIC8vIEZpbmQgdGhlIG5vZGUgYmVmb3JlIHRoZSBvbmUgbWF0Y2hpbmcgdGhlIGNyaXRlcmlhLgorICAgICAgX19ub2RlX2Jhc2UqCisgICAgICBfTV9maW5kX2JlZm9yZV9ub2RlKHNpemVfdHlwZSwgY29uc3Qga2V5X3R5cGUmLCBfX2hhc2hfY29kZSkgY29uc3Q7CisKKyAgICAgIF9fbm9kZV90eXBlKgorICAgICAgX01fZmluZF9ub2RlKHNpemVfdHlwZSBfX2JrdCwgY29uc3Qga2V5X3R5cGUmIF9fa2V5LAorCQkgICBfX2hhc2hfY29kZSBfX2MpIGNvbnN0CisgICAgICB7CisJX19ub2RlX2Jhc2UqIF9fYmVmb3JlX24gPSBfTV9maW5kX2JlZm9yZV9ub2RlKF9fYmt0LCBfX2tleSwgX19jKTsKKwlpZiAoX19iZWZvcmVfbikKKwkgIHJldHVybiBzdGF0aWNfY2FzdDxfX25vZGVfdHlwZSo+KF9fYmVmb3JlX24tPl9NX254dCk7CisJcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisKKyAgICAgIC8vIEluc2VydCBhIG5vZGUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJ1Y2tldC4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2luc2VydF9idWNrZXRfYmVnaW4oc2l6ZV90eXBlLCBfX25vZGVfdHlwZSopOworCisgICAgICAvLyBSZW1vdmUgdGhlIGJ1Y2tldCBmaXJzdCBub2RlCisgICAgICB2b2lkCisgICAgICBfTV9yZW1vdmVfYnVja2V0X2JlZ2luKHNpemVfdHlwZSBfX2JrdCwgX19ub2RlX3R5cGUqIF9fbmV4dF9uLAorCQkJICAgICBzaXplX3R5cGUgX19uZXh0X2JrdCk7CisKKyAgICAgIC8vIEdldCB0aGUgbm9kZSBiZWZvcmUgX19uIGluIHRoZSBidWNrZXQgX19ia3QKKyAgICAgIF9fbm9kZV9iYXNlKgorICAgICAgX01fZ2V0X3ByZXZpb3VzX25vZGUoc2l6ZV90eXBlIF9fYmt0LCBfX25vZGVfYmFzZSogX19uKTsKKworICAgICAgLy8gSW5zZXJ0IG5vZGUgd2l0aCBoYXNoIGNvZGUgX19jb2RlLCBpbiBidWNrZXQgYmt0IGlmIG5vIHJlaGFzaCAoYXNzdW1lcworICAgICAgLy8gbm8gZWxlbWVudCB3aXRoIGl0cyBrZXkgYWxyZWFkeSBwcmVzZW50KS4gVGFrZSBvd25lcnNoaXAgb2YgdGhlIG5vZGUsCisgICAgICAvLyBkZWFsbG9jYXRlIGl0IG9uIGV4Y2VwdGlvbi4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnRfdW5pcXVlX25vZGUoc2l6ZV90eXBlIF9fYmt0LCBfX2hhc2hfY29kZSBfX2NvZGUsCisJCQkgICAgX19ub2RlX3R5cGUqIF9fbik7CisKKyAgICAgIC8vIEluc2VydCBub2RlIHdpdGggaGFzaCBjb2RlIF9fY29kZS4gVGFrZSBvd25lcnNoaXAgb2YgdGhlIG5vZGUsCisgICAgICAvLyBkZWFsbG9jYXRlIGl0IG9uIGV4Y2VwdGlvbi4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnRfbXVsdGlfbm9kZShfX2hhc2hfY29kZSBfX2NvZGUsIF9fbm9kZV90eXBlKiBfX24pOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisJX01fZW1wbGFjZShzdGQ6OnRydWVfdHlwZSwgX0FyZ3MmJi4uLiBfX2FyZ3MpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCV9NX2VtcGxhY2Uoc3RkOjpmYWxzZV90eXBlLCBfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorCV9NX2luc2VydChfQXJnJiYsIHN0ZDo6dHJ1ZV90eXBlKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKwlpdGVyYXRvcgorCV9NX2luc2VydChfQXJnJiYsIHN0ZDo6ZmFsc2VfdHlwZSk7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fZXJhc2Uoc3RkOjp0cnVlX3R5cGUsIGNvbnN0IGtleV90eXBlJik7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fZXJhc2Uoc3RkOjpmYWxzZV90eXBlLCBjb25zdCBrZXlfdHlwZSYpOworCisgICAgICBpdGVyYXRvcgorICAgICAgX01fZXJhc2Uoc2l6ZV90eXBlIF9fYmt0LCBfX25vZGVfYmFzZSogX19wcmV2X24sIF9fbm9kZV90eXBlKiBfX24pOworCisgICAgcHVibGljOgorICAgICAgLy8gRW1wbGFjZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJX19pcmV0dXJuX3R5cGUKKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsgcmV0dXJuIF9NX2VtcGxhY2UoX191bmlxdWVfa2V5cygpLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yLCBfQXJncyYmLi4uIF9fYXJncykKKwl7IHJldHVybiBfX2ljb252X3R5cGUoKShlbXBsYWNlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpOyB9CisKKyAgICAgIC8vIEluc2VydCBtZW1iZXIgZnVuY3Rpb25zIHZpYSBpbmhlcml0YW5jZS4KKworICAgICAgLy8gRXJhc2UKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvcik7CisKKyAgICAgIC8vIExXRyAyMDU5LgorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBlcmFzZShjb25zdF9pdGVyYXRvcihfX2l0KSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgeyByZXR1cm4gX01fZXJhc2UoX191bmlxdWVfa2V5cygpLCBfX2spOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3IpOworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIG5vZXhjZXB0OworCisgICAgICAvLyBTZXQgbnVtYmVyIG9mIGJ1Y2tldHMgdG8gYmUgYXBwcm9wcmlhdGUgZm9yIGNvbnRhaW5lciBvZiBuIGVsZW1lbnQuCisgICAgICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19uKTsKKworICAgICAgLy8gRFIgMTE4OS4KKyAgICAgIC8vIHJlc2VydmUsIGlmIHByZXNlbnQsIGNvbWVzIGZyb20gX1JlaGFzaF9iYXNlLgorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIEhlbHBlciByZWhhc2ggbWV0aG9kIHVzZWQgd2hlbiBrZXlzIGFyZSB1bmlxdWUuCisgICAgICB2b2lkIF9NX3JlaGFzaF9hdXgoc2l6ZV90eXBlIF9fbiwgc3RkOjp0cnVlX3R5cGUpOworCisgICAgICAvLyBIZWxwZXIgcmVoYXNoIG1ldGhvZCB1c2VkIHdoZW4ga2V5cyBjYW4gYmUgbm9uLXVuaXF1ZS4KKyAgICAgIHZvaWQgX01fcmVoYXNoX2F1eChzaXplX3R5cGUgX19uLCBzdGQ6OmZhbHNlX3R5cGUpOworCisgICAgICAvLyBVbmNvbmRpdGlvbmFsbHkgY2hhbmdlIHNpemUgb2YgYnVja2V0IGFycmF5IHRvIG4sIHJlc3RvcmUKKyAgICAgIC8vIGhhc2ggcG9saWN5IHN0YXRlIHRvIF9fc3RhdGUgb24gZXhjZXB0aW9uLgorICAgICAgdm9pZCBfTV9yZWhhc2goc2l6ZV90eXBlIF9fbiwgY29uc3QgX19yZWhhc2hfc3RhdGUmIF9fc3RhdGUpOworICAgIH07CisKKworICAvLyBEZWZpbml0aW9ucyBvZiBjbGFzcyB0ZW1wbGF0ZSBfSGFzaHRhYmxlJ3Mgb3V0LW9mLWxpbmUgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46Ol9fbm9kZV90eXBlKgorICAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgICAgX01fYWxsb2NhdGVfbm9kZShfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwlfX25vZGVfdHlwZSogX19uID0gX01fbm9kZV9hbGxvY2F0b3IoKS5hbGxvY2F0ZSgxKTsKKwlfX3RyeQorCSAgeworCSAgICBfTV9ub2RlX2FsbG9jYXRvcigpLmNvbnN0cnVjdChfX24sIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICAgIHJldHVybiBfX247CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9NX25vZGVfYWxsb2NhdG9yKCkuZGVhbGxvY2F0ZShfX24sIDEpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfTV9kZWFsbG9jYXRlX25vZGUoX19ub2RlX3R5cGUqIF9fbikKKyAgICB7CisgICAgICBfTV9ub2RlX2FsbG9jYXRvcigpLmRlc3Ryb3koX19uKTsKKyAgICAgIF9NX25vZGVfYWxsb2NhdG9yKCkuZGVhbGxvY2F0ZShfX24sIDEpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfTV9kZWFsbG9jYXRlX25vZGVzKF9fbm9kZV90eXBlKiBfX24pCisgICAgeworICAgICAgd2hpbGUgKF9fbikKKwl7CisJICBfX25vZGVfdHlwZSogX190bXAgPSBfX247CisJICBfX24gPSBfX24tPl9NX25leHQoKTsKKwkgIF9NX2RlYWxsb2NhdGVfbm9kZShfX3RtcCk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjpfX2J1Y2tldF90eXBlKgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIF9NX2FsbG9jYXRlX2J1Y2tldHMoc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfQnVja2V0X2FsbG9jYXRvcl90eXBlIF9fYWxsb2MoX01fbm9kZV9hbGxvY2F0b3IoKSk7CisKKyAgICAgIF9fYnVja2V0X3R5cGUqIF9fcCA9IF9fYWxsb2MuYWxsb2NhdGUoX19uKTsKKyAgICAgIF9fYnVpbHRpbl9tZW1zZXQoX19wLCAwLCBfX24gKiBzaXplb2YoX19idWNrZXRfdHlwZSkpOworICAgICAgcmV0dXJuIF9fcDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9fYnVja2V0X3R5cGUqIF9fcCwgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfQnVja2V0X2FsbG9jYXRvcl90eXBlIF9fYWxsb2MoX01fbm9kZV9hbGxvY2F0b3IoKSk7CisgICAgICBfX2FsbG9jLmRlYWxsb2NhdGUoX19wLCBfX24pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LAorCQkJX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfVHJhaXRzPjo6X19ub2RlX3R5cGUqCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01fYnVja2V0X2JlZ2luKHNpemVfdHlwZSBfX2JrdCkgY29uc3QKKyAgICB7CisgICAgICBfX25vZGVfYmFzZSogX19uID0gX01fYnVja2V0c1tfX2JrdF07CisgICAgICByZXR1cm4gX19uID8gc3RhdGljX2Nhc3Q8X19ub2RlX3R5cGUqPihfX24tPl9NX254dCkgOiBudWxscHRyOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIF9IYXNodGFibGUoc2l6ZV90eXBlIF9fYnVja2V0X2hpbnQsCisJICAgICAgIGNvbnN0IF9IMSYgX19oMSwgY29uc3QgX0gyJiBfX2gyLCBjb25zdCBfSGFzaCYgX19oLAorCSAgICAgICBjb25zdCBfRXF1YWwmIF9fZXEsIGNvbnN0IF9FeHRyYWN0S2V5JiBfX2V4aywKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9faGFzaHRhYmxlX2Jhc2UoX19leGssIF9faDEsIF9faDIsIF9faCwgX19lcSksCisgICAgICBfX21hcF9iYXNlKCksCisgICAgICBfX3JlaGFzaF9iYXNlKCksCisgICAgICBfTV9idWNrZXRfY291bnQoMCksCisgICAgICBfTV9iYmVnaW4oX19hKSwKKyAgICAgIF9NX2VsZW1lbnRfY291bnQoMCksCisgICAgICBfTV9yZWhhc2hfcG9saWN5KCkKKyAgICB7CisgICAgICBfTV9idWNrZXRfY291bnQgPSBfTV9yZWhhc2hfcG9saWN5Ll9NX25leHRfYmt0KF9fYnVja2V0X2hpbnQpOworICAgICAgX01fYnVja2V0cyA9IF9NX2FsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0X2NvdW50KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCSBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICAgIF9IYXNodGFibGUoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCSBzaXplX3R5cGUgX19idWNrZXRfaGludCwKKwkJIGNvbnN0IF9IMSYgX19oMSwgY29uc3QgX0gyJiBfX2gyLCBjb25zdCBfSGFzaCYgX19oLAorCQkgY29uc3QgX0VxdWFsJiBfX2VxLCBjb25zdCBfRXh0cmFjdEtleSYgX19leGssCisJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfX2hhc2h0YWJsZV9iYXNlKF9fZXhrLCBfX2gxLCBfX2gyLCBfX2gsIF9fZXEpLAorCV9fbWFwX2Jhc2UoKSwKKwlfX3JlaGFzaF9iYXNlKCksCisJX01fYnVja2V0X2NvdW50KDApLAorCV9NX2JiZWdpbihfX2EpLAorCV9NX2VsZW1lbnRfY291bnQoMCksCisJX01fcmVoYXNoX3BvbGljeSgpCisgICAgICB7CisJYXV0byBfX25iX2VsZW1zID0gX19kZXRhaWw6Ol9fZGlzdGFuY2VfZncoX19mLCBfX2wpOworCV9NX2J1Y2tldF9jb3VudCA9CisJICBfTV9yZWhhc2hfcG9saWN5Ll9NX25leHRfYmt0KAorCSAgICBzdGQ6Om1heChfTV9yZWhhc2hfcG9saWN5Ll9NX2JrdF9mb3JfZWxlbWVudHMoX19uYl9lbGVtcyksCisJCSAgICAgX19idWNrZXRfaGludCkpOworCisJX01fYnVja2V0cyA9IF9NX2FsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0X2NvdW50KTsKKwlfX3RyeQorCSAgeworCSAgICBmb3IgKDsgX19mICE9IF9fbDsgKytfX2YpCisJICAgICAgdGhpcy0+aW5zZXJ0KCpfX2YpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBjbGVhcigpOworCSAgICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0cywgX01fYnVja2V0X2NvdW50KTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfSGFzaHRhYmxlKGNvbnN0IF9IYXNodGFibGUmIF9faHQpCisgICAgOiBfX2hhc2h0YWJsZV9iYXNlKF9faHQpLAorICAgICAgX19tYXBfYmFzZShfX2h0KSwKKyAgICAgIF9fcmVoYXNoX2Jhc2UoX19odCksCisgICAgICBfTV9idWNrZXRfY291bnQoX19odC5fTV9idWNrZXRfY291bnQpLAorICAgICAgX01fYmJlZ2luKF9faHQuX01fYmJlZ2luKSwKKyAgICAgIF9NX2VsZW1lbnRfY291bnQoX19odC5fTV9lbGVtZW50X2NvdW50KSwKKyAgICAgIF9NX3JlaGFzaF9wb2xpY3koX19odC5fTV9yZWhhc2hfcG9saWN5KQorICAgIHsKKyAgICAgIF9NX2J1Y2tldHMgPSBfTV9hbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldF9jb3VudCk7CisgICAgICBfX3RyeQorCXsKKwkgIGlmICghX19odC5fTV9iZWZvcmVfYmVnaW4oKS5fTV9ueHQpCisJICAgIHJldHVybjsKKworCSAgLy8gRmlyc3QgZGVhbCB3aXRoIHRoZSBzcGVjaWFsIGZpcnN0IG5vZGUgcG9pbnRlZCB0byBieQorCSAgLy8gX01fYmVmb3JlX2JlZ2luLgorCSAgY29uc3QgX19ub2RlX3R5cGUqIF9faHRfbiA9IF9faHQuX01fYmVnaW4oKTsKKwkgIF9fbm9kZV90eXBlKiBfX3RoaXNfbiA9IF9NX2FsbG9jYXRlX25vZGUoX19odF9uLT5fTV92KTsKKwkgIHRoaXMtPl9NX2NvcHlfY29kZShfX3RoaXNfbiwgX19odF9uKTsKKwkgIF9NX2JlZm9yZV9iZWdpbigpLl9NX254dCA9IF9fdGhpc19uOworCSAgX01fYnVja2V0c1tfTV9idWNrZXRfaW5kZXgoX190aGlzX24pXSA9ICZfTV9iZWZvcmVfYmVnaW4oKTsKKworCSAgLy8gVGhlbiBkZWFsIHdpdGggb3RoZXIgbm9kZXMuCisJICBfX25vZGVfYmFzZSogX19wcmV2X24gPSBfX3RoaXNfbjsKKwkgIGZvciAoX19odF9uID0gX19odF9uLT5fTV9uZXh0KCk7IF9faHRfbjsgX19odF9uID0gX19odF9uLT5fTV9uZXh0KCkpCisJICAgIHsKKwkgICAgICBfX3RoaXNfbiA9IF9NX2FsbG9jYXRlX25vZGUoX19odF9uLT5fTV92KTsKKwkgICAgICBfX3ByZXZfbi0+X01fbnh0ID0gX190aGlzX247CisJICAgICAgdGhpcy0+X01fY29weV9jb2RlKF9fdGhpc19uLCBfX2h0X24pOworCSAgICAgIHNpemVfdHlwZSBfX2JrdCA9IF9NX2J1Y2tldF9pbmRleChfX3RoaXNfbik7CisJICAgICAgaWYgKCFfTV9idWNrZXRzW19fYmt0XSkKKwkJX01fYnVja2V0c1tfX2JrdF0gPSBfX3ByZXZfbjsKKwkgICAgICBfX3ByZXZfbiA9IF9fdGhpc19uOworCSAgICB9CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgY2xlYXIoKTsKKwkgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRzLCBfTV9idWNrZXRfY291bnQpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIF9IYXNodGFibGUoX0hhc2h0YWJsZSYmIF9faHQpCisgICAgOiBfX2hhc2h0YWJsZV9iYXNlKF9faHQpLAorICAgICAgX19tYXBfYmFzZShfX2h0KSwKKyAgICAgIF9fcmVoYXNoX2Jhc2UoX19odCksCisgICAgICBfTV9idWNrZXRzKF9faHQuX01fYnVja2V0cyksCisgICAgICBfTV9idWNrZXRfY291bnQoX19odC5fTV9idWNrZXRfY291bnQpLAorICAgICAgX01fYmJlZ2luKHN0ZDo6bW92ZShfX2h0Ll9NX2JiZWdpbikpLAorICAgICAgX01fZWxlbWVudF9jb3VudChfX2h0Ll9NX2VsZW1lbnRfY291bnQpLAorICAgICAgX01fcmVoYXNoX3BvbGljeShfX2h0Ll9NX3JlaGFzaF9wb2xpY3kpCisgICAgeworICAgICAgLy8gVXBkYXRlLCBpZiBuZWNlc3NhcnksIGJ1Y2tldCBwb2ludGluZyB0byBiZWZvcmUgYmVnaW4gdGhhdCBoYXNuJ3QgbW92ZWQuCisgICAgICBpZiAoX01fYmVnaW4oKSkKKwlfTV9idWNrZXRzW19NX2J1Y2tldF9pbmRleChfTV9iZWdpbigpKV0gPSAmX01fYmVmb3JlX2JlZ2luKCk7CisgICAgICBfX2h0Ll9NX3JlaGFzaF9wb2xpY3kgPSBfUmVoYXNoUG9saWN5KCk7CisgICAgICBfX2h0Ll9NX2J1Y2tldF9jb3VudCA9IF9faHQuX01fcmVoYXNoX3BvbGljeS5fTV9uZXh0X2JrdCgwKTsKKyAgICAgIF9faHQuX01fYnVja2V0cyA9IF9faHQuX01fYWxsb2NhdGVfYnVja2V0cyhfX2h0Ll9NX2J1Y2tldF9jb3VudCk7CisgICAgICBfX2h0Ll9NX2JlZm9yZV9iZWdpbigpLl9NX254dCA9IG51bGxwdHI7CisgICAgICBfX2h0Ll9NX2VsZW1lbnRfY291bnQgPSAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIH5fSGFzaHRhYmxlKCkgbm9leGNlcHQKKyAgICB7CisgICAgICBjbGVhcigpOworICAgICAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldHMsIF9NX2J1Y2tldF9jb3VudCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIHN3YXAoX0hhc2h0YWJsZSYgX194KQorICAgIHsKKyAgICAgIC8vIFRoZSBvbmx5IGJhc2UgY2xhc3Mgd2l0aCBtZW1iZXIgdmFyaWFibGVzIGlzIGhhc2hfY29kZV9iYXNlLgorICAgICAgLy8gV2UgZGVmaW5lIF9IYXNoX2NvZGVfYmFzZTo6X01fc3dhcCBiZWNhdXNlIGRpZmZlcmVudAorICAgICAgLy8gc3BlY2lhbGl6YXRpb25zIGhhdmUgZGlmZmVyZW50IG1lbWJlcnMuCisgICAgICB0aGlzLT5fTV9zd2FwKF9feCk7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzMS4gU3dhcHBpbmcgY29udGFpbmVycyB3aXRoIHVuZXF1YWwgYWxsb2NhdG9ycy4KKyAgICAgIHN0ZDo6X19hbGxvY19zd2FwPF9Ob2RlX2FsbG9jYXRvcl90eXBlPjo6X1NfZG9faXQoX01fbm9kZV9hbGxvY2F0b3IoKSwKKwkJCQkJCQlfX3guX01fbm9kZV9hbGxvY2F0b3IoKSk7CisKKyAgICAgIHN0ZDo6c3dhcChfTV9yZWhhc2hfcG9saWN5LCBfX3guX01fcmVoYXNoX3BvbGljeSk7CisgICAgICBzdGQ6OnN3YXAoX01fYnVja2V0cywgX194Ll9NX2J1Y2tldHMpOworICAgICAgc3RkOjpzd2FwKF9NX2J1Y2tldF9jb3VudCwgX194Ll9NX2J1Y2tldF9jb3VudCk7CisgICAgICBzdGQ6OnN3YXAoX01fYmVmb3JlX2JlZ2luKCkuX01fbnh0LCBfX3guX01fYmVmb3JlX2JlZ2luKCkuX01fbnh0KTsKKyAgICAgIHN0ZDo6c3dhcChfTV9lbGVtZW50X2NvdW50LCBfX3guX01fZWxlbWVudF9jb3VudCk7CisKKyAgICAgIC8vIEZpeCBidWNrZXRzIGNvbnRhaW5pbmcgdGhlIF9NX2JlZm9yZV9iZWdpbiBwb2ludGVycyB0aGF0CisgICAgICAvLyBjYW4ndCBiZSBzd2FwcGVkLgorICAgICAgaWYgKF9NX2JlZ2luKCkpCisJX01fYnVja2V0c1tfTV9idWNrZXRfaW5kZXgoX01fYmVnaW4oKSldID0gJl9NX2JlZm9yZV9iZWdpbigpOworICAgICAgaWYgKF9feC5fTV9iZWdpbigpKQorCV9feC5fTV9idWNrZXRzW19feC5fTV9idWNrZXRfaW5kZXgoX194Ll9NX2JlZ2luKCkpXQorCSAgPSAmKF9feC5fTV9iZWZvcmVfYmVnaW4oKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIF9fcmVoYXNoX3BvbGljeShjb25zdCBfUmVoYXNoUG9saWN5JiBfX3BvbCkKKyAgICB7CisgICAgICBzaXplX3R5cGUgX19uX2JrdCA9IF9fcG9sLl9NX2JrdF9mb3JfZWxlbWVudHMoX01fZWxlbWVudF9jb3VudCk7CisgICAgICBfX25fYmt0ID0gX19wb2wuX01fbmV4dF9ia3QoX19uX2JrdCk7CisgICAgICBpZiAoX19uX2JrdCAhPSBfTV9idWNrZXRfY291bnQpCisJX01fcmVoYXNoKF9fbl9ia3QsIF9NX3JlaGFzaF9wb2xpY3kuX01fc3RhdGUoKSk7CisgICAgICBfTV9yZWhhc2hfcG9saWN5ID0gX19wb2w7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9UcmFpdHM+OjppdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICB7CisgICAgICBfX2hhc2hfY29kZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IF9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSk7CisgICAgICBfX25vZGVfdHlwZSogX19wID0gX01fZmluZF9ub2RlKF9fbiwgX19rLCBfX2NvZGUpOworICAgICAgcmV0dXJuIF9fcCA/IGl0ZXJhdG9yKF9fcCkgOiB0aGlzLT5lbmQoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX1RyYWl0cz46OmNvbnN0X2l0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgIHsKKyAgICAgIF9faGFzaF9jb2RlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gX01fYnVja2V0X2luZGV4KF9faywgX19jb2RlKTsKKyAgICAgIF9fbm9kZV90eXBlKiBfX3AgPSBfTV9maW5kX25vZGUoX19uLCBfX2ssIF9fY29kZSk7CisgICAgICByZXR1cm4gX19wID8gY29uc3RfaXRlcmF0b3IoX19wKSA6IHRoaXMtPmVuZCgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfVHJhaXRzPjo6c2l6ZV90eXBlCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICB7CisgICAgICBfX2hhc2hfY29kZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IF9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSk7CisgICAgICBfX25vZGVfdHlwZSogX19wID0gX01fYnVja2V0X2JlZ2luKF9fbik7CisgICAgICBpZiAoIV9fcCkKKwlyZXR1cm4gMDsKKworICAgICAgc3RkOjpzaXplX3QgX19yZXN1bHQgPSAwOworICAgICAgZm9yICg7OyBfX3AgPSBfX3AtPl9NX25leHQoKSkKKwl7CisJICBpZiAodGhpcy0+X01fZXF1YWxzKF9faywgX19jb2RlLCBfX3ApKQorCSAgICArK19fcmVzdWx0OworCSAgZWxzZSBpZiAoX19yZXN1bHQpCisJICAgIC8vIEFsbCBlcXVpdmFsZW50IHZhbHVlcyBhcmUgbmV4dCB0byBlYWNoIG90aGVyLCBpZiB3ZQorCSAgICAvLyBmb3VuZCBhIG5vbi1lcXVpdmFsZW50IHZhbHVlIGFmdGVyIGFuIGVxdWl2YWxlbnQgb25lIGl0CisJICAgIC8vIG1lYW5zIHRoYXQgd2Ugd29uJ3QgZmluZCBhbnkgbW9yZSBlcXVpdmFsZW50IHZhbHVlcy4KKwkgICAgYnJlYWs7CisJICBpZiAoIV9fcC0+X01fbnh0IHx8IF9NX2J1Y2tldF9pbmRleChfX3AtPl9NX25leHQoKSkgIT0gX19uKQorCSAgICBicmVhazsKKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpwYWlyPHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsCisJCQkJICBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsCisJCQkJICBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJCSAgX1RyYWl0cz46Oml0ZXJhdG9yLAorCSAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsCisJCQkJICBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsCisJCQkJICBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJCSAgX1RyYWl0cz46Oml0ZXJhdG9yPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgX19oYXNoX2NvZGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSBfTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUpOworICAgICAgX19ub2RlX3R5cGUqIF9fcCA9IF9NX2ZpbmRfbm9kZShfX24sIF9faywgX19jb2RlKTsKKworICAgICAgaWYgKF9fcCkKKwl7CisJICBfX25vZGVfdHlwZSogX19wMSA9IF9fcC0+X01fbmV4dCgpOworCSAgd2hpbGUgKF9fcDEgJiYgX01fYnVja2V0X2luZGV4KF9fcDEpID09IF9fbgorCQkgJiYgdGhpcy0+X01fZXF1YWxzKF9faywgX19jb2RlLCBfX3AxKSkKKwkgICAgX19wMSA9IF9fcDEtPl9NX25leHQoKTsKKworCSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcCksIGl0ZXJhdG9yKF9fcDEpKTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRoaXMtPmVuZCgpLCB0aGlzLT5lbmQoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpwYWlyPHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsCisJCQkJICBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsCisJCQkJICBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJCSAgX1RyYWl0cz46OmNvbnN0X2l0ZXJhdG9yLAorCSAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsCisJCQkJICBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsCisJCQkJICBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJCSAgX1RyYWl0cz46OmNvbnN0X2l0ZXJhdG9yPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgeworICAgICAgX19oYXNoX2NvZGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSBfTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUpOworICAgICAgX19ub2RlX3R5cGUqIF9fcCA9IF9NX2ZpbmRfbm9kZShfX24sIF9faywgX19jb2RlKTsKKworICAgICAgaWYgKF9fcCkKKwl7CisJICBfX25vZGVfdHlwZSogX19wMSA9IF9fcC0+X01fbmV4dCgpOworCSAgd2hpbGUgKF9fcDEgJiYgX01fYnVja2V0X2luZGV4KF9fcDEpID09IF9fbgorCQkgJiYgdGhpcy0+X01fZXF1YWxzKF9faywgX19jb2RlLCBfX3AxKSkKKwkgICAgX19wMSA9IF9fcDEtPl9NX25leHQoKTsKKworCSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKF9fcCksIGNvbnN0X2l0ZXJhdG9yKF9fcDEpKTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRoaXMtPmVuZCgpLCB0aGlzLT5lbmQoKSk7CisgICAgfQorCisgIC8vIEZpbmQgdGhlIG5vZGUgd2hvc2Uga2V5IGNvbXBhcmVzIGVxdWFsIHRvIGsgaW4gdGhlIGJ1Y2tldCBuLgorICAvLyBSZXR1cm4gbnVsbHB0ciBpZiBubyBub2RlIGlzIGZvdW5kLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LAorCQkJX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfVHJhaXRzPjo6X19ub2RlX2Jhc2UqCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01fZmluZF9iZWZvcmVfbm9kZShzaXplX3R5cGUgX19uLCBjb25zdCBrZXlfdHlwZSYgX19rLAorCQkJX19oYXNoX2NvZGUgX19jb2RlKSBjb25zdAorICAgIHsKKyAgICAgIF9fbm9kZV9iYXNlKiBfX3ByZXZfcCA9IF9NX2J1Y2tldHNbX19uXTsKKyAgICAgIGlmICghX19wcmV2X3ApCisJcmV0dXJuIG51bGxwdHI7CisgICAgICBfX25vZGVfdHlwZSogX19wID0gc3RhdGljX2Nhc3Q8X19ub2RlX3R5cGUqPihfX3ByZXZfcC0+X01fbnh0KTsKKyAgICAgIGZvciAoOzsgX19wID0gX19wLT5fTV9uZXh0KCkpCisJeworCSAgaWYgKHRoaXMtPl9NX2VxdWFscyhfX2ssIF9fY29kZSwgX19wKSkKKwkgICAgcmV0dXJuIF9fcHJldl9wOworCSAgaWYgKCFfX3AtPl9NX254dCB8fCBfTV9idWNrZXRfaW5kZXgoX19wLT5fTV9uZXh0KCkpICE9IF9fbikKKwkgICAgYnJlYWs7CisJICBfX3ByZXZfcCA9IF9fcDsKKwl9CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01faW5zZXJ0X2J1Y2tldF9iZWdpbihzaXplX3R5cGUgX19ia3QsIF9fbm9kZV90eXBlKiBfX25vZGUpCisgICAgeworICAgICAgaWYgKF9NX2J1Y2tldHNbX19ia3RdKQorCXsKKwkgIC8vIEJ1Y2tldCBpcyBub3QgZW1wdHksIHdlIGp1c3QgbmVlZCB0byBpbnNlcnQgdGhlIG5ldyBub2RlCisJICAvLyBhZnRlciB0aGUgYnVja2V0IGJlZm9yZSBiZWdpbi4KKwkgIF9fbm9kZS0+X01fbnh0ID0gX01fYnVja2V0c1tfX2JrdF0tPl9NX254dDsKKwkgIF9NX2J1Y2tldHNbX19ia3RdLT5fTV9ueHQgPSBfX25vZGU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8vIFRoZSBidWNrZXQgaXMgZW1wdHksIHRoZSBuZXcgbm9kZSBpcyBpbnNlcnRlZCBhdCB0aGUKKwkgIC8vIGJlZ2lubmluZyBvZiB0aGUgc2luZ2x5LWxpbmtlZCBsaXN0IGFuZCB0aGUgYnVja2V0IHdpbGwKKwkgIC8vIGNvbnRhaW4gX01fYmVmb3JlX2JlZ2luIHBvaW50ZXIuCisJICBfX25vZGUtPl9NX254dCA9IF9NX2JlZm9yZV9iZWdpbigpLl9NX254dDsKKwkgIF9NX2JlZm9yZV9iZWdpbigpLl9NX254dCA9IF9fbm9kZTsKKwkgIGlmIChfX25vZGUtPl9NX254dCkKKwkgICAgLy8gV2UgbXVzdCB1cGRhdGUgZm9ybWVyIGJlZ2luIGJ1Y2tldCB0aGF0IGlzIHBvaW50aW5nIHRvCisJICAgIC8vIF9NX2JlZm9yZV9iZWdpbi4KKwkgICAgX01fYnVja2V0c1tfTV9idWNrZXRfaW5kZXgoX19ub2RlLT5fTV9uZXh0KCkpXSA9IF9fbm9kZTsKKwkgIF9NX2J1Y2tldHNbX19ia3RdID0gJl9NX2JlZm9yZV9iZWdpbigpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01fcmVtb3ZlX2J1Y2tldF9iZWdpbihzaXplX3R5cGUgX19ia3QsIF9fbm9kZV90eXBlKiBfX25leHQsCisJCQkgICBzaXplX3R5cGUgX19uZXh0X2JrdCkKKyAgICB7CisgICAgICBpZiAoIV9fbmV4dCB8fCBfX25leHRfYmt0ICE9IF9fYmt0KQorCXsKKwkgIC8vIEJ1Y2tldCBpcyBub3cgZW1wdHkKKwkgIC8vIEZpcnN0IHVwZGF0ZSBuZXh0IGJ1Y2tldCBpZiBhbnkKKwkgIGlmIChfX25leHQpCisJICAgIF9NX2J1Y2tldHNbX19uZXh0X2JrdF0gPSBfTV9idWNrZXRzW19fYmt0XTsKKworCSAgLy8gU2Vjb25kIHVwZGF0ZSBiZWZvcmUgYmVnaW4gbm9kZSBpZiBuZWNlc3NhcnkKKwkgIGlmICgmX01fYmVmb3JlX2JlZ2luKCkgPT0gX01fYnVja2V0c1tfX2JrdF0pCisJICAgIF9NX2JlZm9yZV9iZWdpbigpLl9NX254dCA9IF9fbmV4dDsKKwkgIF9NX2J1Y2tldHNbX19ia3RdID0gbnVsbHB0cjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksCisJCQlfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9UcmFpdHM+OjpfX25vZGVfYmFzZSoKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfTV9nZXRfcHJldmlvdXNfbm9kZShzaXplX3R5cGUgX19ia3QsIF9fbm9kZV9iYXNlKiBfX24pCisgICAgeworICAgICAgX19ub2RlX2Jhc2UqIF9fcHJldl9uID0gX01fYnVja2V0c1tfX2JrdF07CisgICAgICB3aGlsZSAoX19wcmV2X24tPl9NX254dCAhPSBfX24pCisJX19wcmV2X24gPSBfX3ByZXZfbi0+X01fbnh0OworICAgICAgcmV0dXJuIF9fcHJldl9uOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgc3RkOjpwYWlyPHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsCisJCQkJICAgIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwKKwkJCQkgICAgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCQkgICAgX1RyYWl0cz46Oml0ZXJhdG9yLCBib29sPgorICAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgICAgX01fZW1wbGFjZShzdGQ6OnRydWVfdHlwZSwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJLy8gRmlyc3QgYnVpbGQgdGhlIG5vZGUgdG8gZ2V0IGFjY2VzcyB0byB0aGUgaGFzaCBjb2RlCisJX19ub2RlX3R5cGUqIF9fbm9kZSA9IF9NX2FsbG9jYXRlX25vZGUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwljb25zdCBrZXlfdHlwZSYgX19rID0gdGhpcy0+X01fZXh0cmFjdCgpKF9fbm9kZS0+X01fdik7CisJX19oYXNoX2NvZGUgX19jb2RlOworCV9fdHJ5CisJICB7CisJICAgIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9kZWFsbG9jYXRlX25vZGUoX19ub2RlKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisKKwlzaXplX3R5cGUgX19ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUpOworCWlmIChfX25vZGVfdHlwZSogX19wID0gX01fZmluZF9ub2RlKF9fYmt0LCBfX2ssIF9fY29kZSkpCisJICB7CisJICAgIC8vIFRoZXJlIGlzIGFscmVhZHkgYW4gZXF1aXZhbGVudCBub2RlLCBubyBpbnNlcnRpb24KKwkgICAgX01fZGVhbGxvY2F0ZV9ub2RlKF9fbm9kZSk7CisJICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3ApLCBmYWxzZSk7CisJICB9CisKKwkvLyBJbnNlcnQgdGhlIG5vZGUKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoX01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9fYmt0LCBfX2NvZGUsIF9fbm9kZSksCisJCQkgICAgICB0cnVlKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCSAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJICBfVHJhaXRzPjo6aXRlcmF0b3IKKyAgICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCSBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICAgIF9NX2VtcGxhY2Uoc3RkOjpmYWxzZV90eXBlLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwkvLyBGaXJzdCBidWlsZCB0aGUgbm9kZSB0byBnZXQgaXRzIGhhc2ggY29kZS4KKwlfX25vZGVfdHlwZSogX19ub2RlID0gX01fYWxsb2NhdGVfbm9kZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCisJX19oYXNoX2NvZGUgX19jb2RlOworCV9fdHJ5CisJICB7CisJICAgIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZSh0aGlzLT5fTV9leHRyYWN0KCkoX19ub2RlLT5fTV92KSk7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9NX2RlYWxsb2NhdGVfbm9kZShfX25vZGUpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKworCXJldHVybiBfTV9pbnNlcnRfbXVsdGlfbm9kZShfX2NvZGUsIF9fbm9kZSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX1RyYWl0cz46Oml0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01faW5zZXJ0X3VuaXF1ZV9ub2RlKHNpemVfdHlwZSBfX2JrdCwgX19oYXNoX2NvZGUgX19jb2RlLAorCQkJICBfX25vZGVfdHlwZSogX19ub2RlKQorICAgIHsKKyAgICAgIGNvbnN0IF9fcmVoYXNoX3N0YXRlJiBfX3NhdmVkX3N0YXRlID0gX01fcmVoYXNoX3BvbGljeS5fTV9zdGF0ZSgpOworICAgICAgc3RkOjpwYWlyPGJvb2wsIHN0ZDo6c2l6ZV90PiBfX2RvX3JlaGFzaAorCT0gX01fcmVoYXNoX3BvbGljeS5fTV9uZWVkX3JlaGFzaChfTV9idWNrZXRfY291bnQsIF9NX2VsZW1lbnRfY291bnQsIDEpOworCisgICAgICBfX3RyeQorCXsKKwkgIGlmIChfX2RvX3JlaGFzaC5maXJzdCkKKwkgICAgeworCSAgICAgIF9NX3JlaGFzaChfX2RvX3JlaGFzaC5zZWNvbmQsIF9fc2F2ZWRfc3RhdGUpOworCSAgICAgIF9fYmt0ID0gX01fYnVja2V0X2luZGV4KHRoaXMtPl9NX2V4dHJhY3QoKShfX25vZGUtPl9NX3YpLCBfX2NvZGUpOworCSAgICB9CisKKwkgIHRoaXMtPl9NX3N0b3JlX2NvZGUoX19ub2RlLCBfX2NvZGUpOworCisJICAvLyBBbHdheXMgaW5zZXJ0IGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYnVja2V0LgorCSAgX01faW5zZXJ0X2J1Y2tldF9iZWdpbihfX2JrdCwgX19ub2RlKTsKKwkgICsrX01fZWxlbWVudF9jb3VudDsKKwkgIHJldHVybiBpdGVyYXRvcihfX25vZGUpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIF9NX2RlYWxsb2NhdGVfbm9kZShfX25vZGUpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICAvLyBJbnNlcnQgbm9kZSwgaW4gYnVja2V0IGJrdCBpZiBubyByZWhhc2ggKGFzc3VtZXMgbm8gZWxlbWVudCB3aXRoIGl0cyBrZXkKKyAgLy8gYWxyZWFkeSBwcmVzZW50KS4gVGFrZSBvd25lcnNoaXAgb2YgdGhlIG5vZGUsIGRlYWxsb2NhdGUgaXQgb24gZXhjZXB0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfVHJhaXRzPjo6aXRlcmF0b3IKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfTV9pbnNlcnRfbXVsdGlfbm9kZShfX2hhc2hfY29kZSBfX2NvZGUsIF9fbm9kZV90eXBlKiBfX25vZGUpCisgICAgeworICAgICAgY29uc3QgX19yZWhhc2hfc3RhdGUmIF9fc2F2ZWRfc3RhdGUgPSBfTV9yZWhhc2hfcG9saWN5Ll9NX3N0YXRlKCk7CisgICAgICBzdGQ6OnBhaXI8Ym9vbCwgc3RkOjpzaXplX3Q+IF9fZG9fcmVoYXNoCisJPSBfTV9yZWhhc2hfcG9saWN5Ll9NX25lZWRfcmVoYXNoKF9NX2J1Y2tldF9jb3VudCwgX01fZWxlbWVudF9jb3VudCwgMSk7CisKKyAgICAgIF9fdHJ5CisJeworCSAgaWYgKF9fZG9fcmVoYXNoLmZpcnN0KQorCSAgICBfTV9yZWhhc2goX19kb19yZWhhc2guc2Vjb25kLCBfX3NhdmVkX3N0YXRlKTsKKworCSAgdGhpcy0+X01fc3RvcmVfY29kZShfX25vZGUsIF9fY29kZSk7CisJICBjb25zdCBrZXlfdHlwZSYgX19rID0gdGhpcy0+X01fZXh0cmFjdCgpKF9fbm9kZS0+X01fdik7CisJICBzaXplX3R5cGUgX19ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUpOworCisJICAvLyBGaW5kIHRoZSBub2RlIGJlZm9yZSBhbiBlcXVpdmFsZW50IG9uZS4KKwkgIF9fbm9kZV9iYXNlKiBfX3ByZXYgPSBfTV9maW5kX2JlZm9yZV9ub2RlKF9fYmt0LCBfX2ssIF9fY29kZSk7CisJICBpZiAoX19wcmV2KQorCSAgICB7CisJICAgICAgLy8gSW5zZXJ0IGFmdGVyIHRoZSBub2RlIGJlZm9yZSB0aGUgZXF1aXZhbGVudCBvbmUuCisJICAgICAgX19ub2RlLT5fTV9ueHQgPSBfX3ByZXYtPl9NX254dDsKKwkgICAgICBfX3ByZXYtPl9NX254dCA9IF9fbm9kZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICAvLyBUaGUgaW5zZXJ0ZWQgbm9kZSBoYXMgbm8gZXF1aXZhbGVudCBpbiB0aGUKKwkgICAgLy8gaGFzaHRhYmxlLiBXZSBtdXN0IGluc2VydCB0aGUgbmV3IG5vZGUgYXQgdGhlCisJICAgIC8vIGJlZ2lubmluZyBvZiB0aGUgYnVja2V0IHRvIHByZXNlcnZlIGVxdWl2YWxlbnQKKwkgICAgLy8gZWxlbWVudHMnIHJlbGF0aXZlIHBvc2l0aW9ucy4KKwkgICAgX01faW5zZXJ0X2J1Y2tldF9iZWdpbihfX2JrdCwgX19ub2RlKTsKKwkgICsrX01fZWxlbWVudF9jb3VudDsKKwkgIHJldHVybiBpdGVyYXRvcihfX25vZGUpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIF9NX2RlYWxsb2NhdGVfbm9kZShfX25vZGUpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICAvLyBJbnNlcnQgdiBpZiBubyBlbGVtZW50IHdpdGggaXRzIGtleSBpcyBhbHJlYWR5IHByZXNlbnQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICAgIHN0ZDo6cGFpcjx0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLAorCQkJCSAgICBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsCisJCQkJICAgIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQkJICAgIF9UcmFpdHM+OjppdGVyYXRvciwgYm9vbD4KKyAgICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCSBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICAgIF9NX2luc2VydChfQXJnJiYgX192LCBzdGQ6OnRydWVfdHlwZSkKKyAgICAgIHsKKwljb25zdCBrZXlfdHlwZSYgX19rID0gdGhpcy0+X01fZXh0cmFjdCgpKF9fdik7CisJX19oYXNoX2NvZGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisJc2l6ZV90eXBlIF9fYmt0ID0gX01fYnVja2V0X2luZGV4KF9faywgX19jb2RlKTsKKworCV9fbm9kZV90eXBlKiBfX24gPSBfTV9maW5kX25vZGUoX19ia3QsIF9faywgX19jb2RlKTsKKwlpZiAoX19uKQorCSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fbiksIGZhbHNlKTsKKworCV9fbiA9IF9NX2FsbG9jYXRlX25vZGUoc3RkOjpmb3J3YXJkPF9Bcmc+KF9fdikpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihfTV9pbnNlcnRfdW5pcXVlX25vZGUoX19ia3QsIF9fY29kZSwgX19uKSwgdHJ1ZSk7CisgICAgICB9CisKKyAgLy8gSW5zZXJ0IHYgdW5jb25kaXRpb25hbGx5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQkgIF9UcmFpdHM+OjppdGVyYXRvcgorICAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgICAgX01faW5zZXJ0KF9BcmcmJiBfX3YsIHN0ZDo6ZmFsc2VfdHlwZSkKKyAgICAgIHsKKwkvLyBGaXJzdCBjb21wdXRlIHRoZSBoYXNoIGNvZGUgc28gdGhhdCB3ZSBkb24ndCBkbyBhbnl0aGluZyBpZiBpdAorCS8vIHRocm93cy4KKwlfX2hhc2hfY29kZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUodGhpcy0+X01fZXh0cmFjdCgpKF9fdikpOworCisJLy8gU2Vjb25kIGFsbG9jYXRlIG5ldyBub2RlIHNvIHRoYXQgd2UgZG9uJ3QgcmVoYXNoIGlmIGl0IHRocm93cy4KKwlfX25vZGVfdHlwZSogX19ub2RlID0gX01fYWxsb2NhdGVfbm9kZShzdGQ6OmZvcndhcmQ8X0FyZz4oX192KSk7CisKKwlyZXR1cm4gX01faW5zZXJ0X211bHRpX25vZGUoX19jb2RlLCBfX25vZGUpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9UcmFpdHM+OjppdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9faXQpCisgICAgeworICAgICAgX19ub2RlX3R5cGUqIF9fbiA9IF9faXQuX01fY3VyOworICAgICAgc3RkOjpzaXplX3QgX19ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19uKTsKKworICAgICAgLy8gTG9vayBmb3IgcHJldmlvdXMgbm9kZSB0byB1bmxpbmsgaXQgZnJvbSB0aGUgZXJhc2VkIG9uZSwgdGhpcworICAgICAgLy8gaXMgd2h5IHdlIG5lZWQgYnVja2V0cyB0byBjb250YWluIHRoZSBiZWZvcmUgYmVnaW4gdG8gbWFrZQorICAgICAgLy8gdGhpcyBzZWFyY2ggZmFzdC4KKyAgICAgIF9fbm9kZV9iYXNlKiBfX3ByZXZfbiA9IF9NX2dldF9wcmV2aW91c19ub2RlKF9fYmt0LCBfX24pOworICAgICAgcmV0dXJuIF9NX2VyYXNlKF9fYmt0LCBfX3ByZXZfbiwgX19uKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX1RyYWl0cz46Oml0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01fZXJhc2Uoc2l6ZV90eXBlIF9fYmt0LCBfX25vZGVfYmFzZSogX19wcmV2X24sIF9fbm9kZV90eXBlKiBfX24pCisgICAgeworICAgICAgaWYgKF9fcHJldl9uID09IF9NX2J1Y2tldHNbX19ia3RdKQorCV9NX3JlbW92ZV9idWNrZXRfYmVnaW4oX19ia3QsIF9fbi0+X01fbmV4dCgpLAorCSAgIF9fbi0+X01fbnh0ID8gX01fYnVja2V0X2luZGV4KF9fbi0+X01fbmV4dCgpKSA6IDApOworICAgICAgZWxzZSBpZiAoX19uLT5fTV9ueHQpCisJeworCSAgc2l6ZV90eXBlIF9fbmV4dF9ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19uLT5fTV9uZXh0KCkpOworCSAgaWYgKF9fbmV4dF9ia3QgIT0gX19ia3QpCisJICAgIF9NX2J1Y2tldHNbX19uZXh0X2JrdF0gPSBfX3ByZXZfbjsKKwl9CisKKyAgICAgIF9fcHJldl9uLT5fTV9ueHQgPSBfX24tPl9NX254dDsKKyAgICAgIGl0ZXJhdG9yIF9fcmVzdWx0KF9fbi0+X01fbmV4dCgpKTsKKyAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZShfX24pOworICAgICAgLS1fTV9lbGVtZW50X2NvdW50OworCisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9UcmFpdHM+OjpzaXplX3R5cGUKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfTV9lcmFzZShzdGQ6OnRydWVfdHlwZSwgY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICB7CisgICAgICBfX2hhc2hfY29kZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fYmt0ID0gX01fYnVja2V0X2luZGV4KF9faywgX19jb2RlKTsKKworICAgICAgLy8gTG9vayBmb3IgdGhlIG5vZGUgYmVmb3JlIHRoZSBmaXJzdCBtYXRjaGluZyBub2RlLgorICAgICAgX19ub2RlX2Jhc2UqIF9fcHJldl9uID0gX01fZmluZF9iZWZvcmVfbm9kZShfX2JrdCwgX19rLCBfX2NvZGUpOworICAgICAgaWYgKCFfX3ByZXZfbikKKwlyZXR1cm4gMDsKKworICAgICAgLy8gV2UgZm91bmQgYSBtYXRjaGluZyBub2RlLCBlcmFzZSBpdC4KKyAgICAgIF9fbm9kZV90eXBlKiBfX24gPSBzdGF0aWNfY2FzdDxfX25vZGVfdHlwZSo+KF9fcHJldl9uLT5fTV9ueHQpOworICAgICAgX01fZXJhc2UoX19ia3QsIF9fcHJldl9uLCBfX24pOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9UcmFpdHM+OjpzaXplX3R5cGUKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfTV9lcmFzZShzdGQ6OmZhbHNlX3R5cGUsIGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgX19oYXNoX2NvZGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX2JrdCA9IF9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSk7CisKKyAgICAgIC8vIExvb2sgZm9yIHRoZSBub2RlIGJlZm9yZSB0aGUgZmlyc3QgbWF0Y2hpbmcgbm9kZS4KKyAgICAgIF9fbm9kZV9iYXNlKiBfX3ByZXZfbiA9IF9NX2ZpbmRfYmVmb3JlX25vZGUoX19ia3QsIF9faywgX19jb2RlKTsKKyAgICAgIGlmICghX19wcmV2X24pCisJcmV0dXJuIDA7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDUyNi4gSXMgaXQgdW5kZWZpbmVkIGlmIGEgZnVuY3Rpb24gaW4gdGhlIHN0YW5kYXJkIGNoYW5nZXMKKyAgICAgIC8vIGluIHBhcmFtZXRlcnM/CisgICAgICAvLyBXZSB1c2Ugb25lIGxvb3AgdG8gZmluZCBhbGwgbWF0Y2hpbmcgbm9kZXMgYW5kIGFub3RoZXIgdG8gZGVhbGxvY2F0ZQorICAgICAgLy8gdGhlbSBzbyB0aGF0IHRoZSBrZXkgc3RheXMgdmFsaWQgZHVyaW5nIHRoZSBmaXJzdCBsb29wLiBJdCBtaWdodCBiZQorICAgICAgLy8gaW52YWxpZGF0ZWQgaW5kaXJlY3RseSB3aGVuIGRlc3Ryb3lpbmcgbm9kZXMuCisgICAgICBfX25vZGVfdHlwZSogX19uID0gc3RhdGljX2Nhc3Q8X19ub2RlX3R5cGUqPihfX3ByZXZfbi0+X01fbnh0KTsKKyAgICAgIF9fbm9kZV90eXBlKiBfX25fbGFzdCA9IF9fbjsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbl9sYXN0X2JrdCA9IF9fYmt0OworICAgICAgZG8KKwl7CisJICBfX25fbGFzdCA9IF9fbl9sYXN0LT5fTV9uZXh0KCk7CisJICBpZiAoIV9fbl9sYXN0KQorCSAgICBicmVhazsKKwkgIF9fbl9sYXN0X2JrdCA9IF9NX2J1Y2tldF9pbmRleChfX25fbGFzdCk7CisJfQorICAgICAgd2hpbGUgKF9fbl9sYXN0X2JrdCA9PSBfX2JrdCAmJiB0aGlzLT5fTV9lcXVhbHMoX19rLCBfX2NvZGUsIF9fbl9sYXN0KSk7CisKKyAgICAgIC8vIERlYWxsb2NhdGUgbm9kZXMuCisgICAgICBzaXplX3R5cGUgX19yZXN1bHQgPSAwOworICAgICAgZG8KKwl7CisJICBfX25vZGVfdHlwZSogX19wID0gX19uLT5fTV9uZXh0KCk7CisJICBfTV9kZWFsbG9jYXRlX25vZGUoX19uKTsKKwkgIF9fbiA9IF9fcDsKKwkgICsrX19yZXN1bHQ7CisJICAtLV9NX2VsZW1lbnRfY291bnQ7CisJfQorICAgICAgd2hpbGUgKF9fbiAhPSBfX25fbGFzdCk7CisKKyAgICAgIGlmIChfX3ByZXZfbiA9PSBfTV9idWNrZXRzW19fYmt0XSkKKwlfTV9yZW1vdmVfYnVja2V0X2JlZ2luKF9fYmt0LCBfX25fbGFzdCwgX19uX2xhc3RfYmt0KTsKKyAgICAgIGVsc2UgaWYgKF9fbl9sYXN0ICYmIF9fbl9sYXN0X2JrdCAhPSBfX2JrdCkKKwlfTV9idWNrZXRzW19fbl9sYXN0X2JrdF0gPSBfX3ByZXZfbjsKKyAgICAgIF9fcHJldl9uLT5fTV9ueHQgPSBfX25fbGFzdDsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX1RyYWl0cz46Oml0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIF9fbm9kZV90eXBlKiBfX24gPSBfX2ZpcnN0Ll9NX2N1cjsKKyAgICAgIF9fbm9kZV90eXBlKiBfX2xhc3RfbiA9IF9fbGFzdC5fTV9jdXI7CisgICAgICBpZiAoX19uID09IF9fbGFzdF9uKQorCXJldHVybiBpdGVyYXRvcihfX24pOworCisgICAgICBzdGQ6OnNpemVfdCBfX2JrdCA9IF9NX2J1Y2tldF9pbmRleChfX24pOworCisgICAgICBfX25vZGVfYmFzZSogX19wcmV2X24gPSBfTV9nZXRfcHJldmlvdXNfbm9kZShfX2JrdCwgX19uKTsKKyAgICAgIGJvb2wgX19pc19idWNrZXRfYmVnaW4gPSBfX24gPT0gX01fYnVja2V0X2JlZ2luKF9fYmt0KTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbl9ia3QgPSBfX2JrdDsKKyAgICAgIGZvciAoOzspCisJeworCSAgZG8KKwkgICAgeworCSAgICAgIF9fbm9kZV90eXBlKiBfX3RtcCA9IF9fbjsKKwkgICAgICBfX24gPSBfX24tPl9NX25leHQoKTsKKwkgICAgICBfTV9kZWFsbG9jYXRlX25vZGUoX190bXApOworCSAgICAgIC0tX01fZWxlbWVudF9jb3VudDsKKwkgICAgICBpZiAoIV9fbikKKwkJYnJlYWs7CisJICAgICAgX19uX2JrdCA9IF9NX2J1Y2tldF9pbmRleChfX24pOworCSAgICB9CisJICB3aGlsZSAoX19uICE9IF9fbGFzdF9uICYmIF9fbl9ia3QgPT0gX19ia3QpOworCSAgaWYgKF9faXNfYnVja2V0X2JlZ2luKQorCSAgICBfTV9yZW1vdmVfYnVja2V0X2JlZ2luKF9fYmt0LCBfX24sIF9fbl9ia3QpOworCSAgaWYgKF9fbiA9PSBfX2xhc3RfbikKKwkgICAgYnJlYWs7CisJICBfX2lzX2J1Y2tldF9iZWdpbiA9IHRydWU7CisJICBfX2JrdCA9IF9fbl9ia3Q7CisJfQorCisgICAgICBpZiAoX19uICYmIChfX25fYmt0ICE9IF9fYmt0IHx8IF9faXNfYnVja2V0X2JlZ2luKSkKKwlfTV9idWNrZXRzW19fbl9ia3RdID0gX19wcmV2X247CisgICAgICBfX3ByZXZfbi0+X01fbnh0ID0gX19uOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fbik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIGNsZWFyKCkgbm9leGNlcHQKKyAgICB7CisgICAgICBfTV9kZWFsbG9jYXRlX25vZGVzKF9NX2JlZ2luKCkpOworICAgICAgX19idWlsdGluX21lbXNldChfTV9idWNrZXRzLCAwLCBfTV9idWNrZXRfY291bnQgKiBzaXplb2YoX19idWNrZXRfdHlwZSkpOworICAgICAgX01fZWxlbWVudF9jb3VudCA9IDA7CisgICAgICBfTV9iZWZvcmVfYmVnaW4oKS5fTV9ueHQgPSBudWxscHRyOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICByZWhhc2goc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBjb25zdCBfX3JlaGFzaF9zdGF0ZSYgX19zYXZlZF9zdGF0ZSA9IF9NX3JlaGFzaF9wb2xpY3kuX01fc3RhdGUoKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fYnVja2V0cworCT0gc3RkOjptYXgoX01fcmVoYXNoX3BvbGljeS5fTV9ia3RfZm9yX2VsZW1lbnRzKF9NX2VsZW1lbnRfY291bnQgKyAxKSwKKwkJICAgX19uKTsKKyAgICAgIF9fYnVja2V0cyA9IF9NX3JlaGFzaF9wb2xpY3kuX01fbmV4dF9ia3QoX19idWNrZXRzKTsKKworICAgICAgaWYgKF9fYnVja2V0cyAhPSBfTV9idWNrZXRfY291bnQpCisJX01fcmVoYXNoKF9fYnVja2V0cywgX19zYXZlZF9zdGF0ZSk7CisgICAgICBlbHNlCisJLy8gTm8gcmVoYXNoLCByZXN0b3JlIHByZXZpb3VzIHN0YXRlIHRvIGtlZXAgYSBjb25zaXN0ZW50IHN0YXRlLgorCV9NX3JlaGFzaF9wb2xpY3kuX01fcmVzZXQoX19zYXZlZF9zdGF0ZSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIF9NX3JlaGFzaChzaXplX3R5cGUgX19uLCBjb25zdCBfX3JlaGFzaF9zdGF0ZSYgX19zdGF0ZSkKKyAgICB7CisgICAgICBfX3RyeQorCXsKKwkgIF9NX3JlaGFzaF9hdXgoX19uLCBfX3VuaXF1ZV9rZXlzKCkpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIC8vIEEgZmFpbHVyZSBoZXJlIG1lYW5zIHRoYXQgYnVja2V0cyBhbGxvY2F0aW9uIGZhaWxlZC4gIFdlIG9ubHkKKwkgIC8vIGhhdmUgdG8gcmVzdG9yZSBoYXNoIHBvbGljeSBwcmV2aW91cyBzdGF0ZS4KKwkgIF9NX3JlaGFzaF9wb2xpY3kuX01fcmVzZXQoX19zdGF0ZSk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIC8vIFJlaGFzaCB3aGVuIHRoZXJlIGlzIG5vIGVxdWl2YWxlbnQgZWxlbWVudHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIF9NX3JlaGFzaF9hdXgoc2l6ZV90eXBlIF9fbiwgc3RkOjp0cnVlX3R5cGUpCisgICAgeworICAgICAgX19idWNrZXRfdHlwZSogX19uZXdfYnVja2V0cyA9IF9NX2FsbG9jYXRlX2J1Y2tldHMoX19uKTsKKyAgICAgIF9fbm9kZV90eXBlKiBfX3AgPSBfTV9iZWdpbigpOworICAgICAgX01fYmVmb3JlX2JlZ2luKCkuX01fbnh0ID0gbnVsbHB0cjsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fYmJlZ2luX2JrdCA9IDA7CisgICAgICB3aGlsZSAoX19wKQorCXsKKwkgIF9fbm9kZV90eXBlKiBfX25leHQgPSBfX3AtPl9NX25leHQoKTsKKwkgIHN0ZDo6c2l6ZV90IF9fYmt0ID0gX19oYXNoX2NvZGVfYmFzZTo6X01fYnVja2V0X2luZGV4KF9fcCwgX19uKTsKKwkgIGlmICghX19uZXdfYnVja2V0c1tfX2JrdF0pCisJICAgIHsKKwkgICAgICBfX3AtPl9NX254dCA9IF9NX2JlZm9yZV9iZWdpbigpLl9NX254dDsKKwkgICAgICBfTV9iZWZvcmVfYmVnaW4oKS5fTV9ueHQgPSBfX3A7CisJICAgICAgX19uZXdfYnVja2V0c1tfX2JrdF0gPSAmX01fYmVmb3JlX2JlZ2luKCk7CisJICAgICAgaWYgKF9fcC0+X01fbnh0KQorCQlfX25ld19idWNrZXRzW19fYmJlZ2luX2JrdF0gPSBfX3A7CisJICAgICAgX19iYmVnaW5fYmt0ID0gX19ia3Q7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9fcC0+X01fbnh0ID0gX19uZXdfYnVja2V0c1tfX2JrdF0tPl9NX254dDsKKwkgICAgICBfX25ld19idWNrZXRzW19fYmt0XS0+X01fbnh0ID0gX19wOworCSAgICB9CisJICBfX3AgPSBfX25leHQ7CisJfQorICAgICAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldHMsIF9NX2J1Y2tldF9jb3VudCk7CisgICAgICBfTV9idWNrZXRfY291bnQgPSBfX247CisgICAgICBfTV9idWNrZXRzID0gX19uZXdfYnVja2V0czsKKyAgICB9CisKKyAgLy8gUmVoYXNoIHdoZW4gdGhlcmUgY2FuIGJlIGVxdWl2YWxlbnQgZWxlbWVudHMsIHByZXNlcnZlIHRoZWlyIHJlbGF0aXZlCisgIC8vIG9yZGVyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfTV9yZWhhc2hfYXV4KHNpemVfdHlwZSBfX24sIHN0ZDo6ZmFsc2VfdHlwZSkKKyAgICB7CisgICAgICBfX2J1Y2tldF90eXBlKiBfX25ld19idWNrZXRzID0gX01fYWxsb2NhdGVfYnVja2V0cyhfX24pOworCisgICAgICBfX25vZGVfdHlwZSogX19wID0gX01fYmVnaW4oKTsKKyAgICAgIF9NX2JlZm9yZV9iZWdpbigpLl9NX254dCA9IG51bGxwdHI7CisgICAgICBzdGQ6OnNpemVfdCBfX2JiZWdpbl9ia3QgPSAwOworICAgICAgc3RkOjpzaXplX3QgX19wcmV2X2JrdCA9IDA7CisgICAgICBfX25vZGVfdHlwZSogX19wcmV2X3AgPSBudWxscHRyOworICAgICAgYm9vbCBfX2NoZWNrX2J1Y2tldCA9IGZhbHNlOworCisgICAgICB3aGlsZSAoX19wKQorCXsKKwkgIF9fbm9kZV90eXBlKiBfX25leHQgPSBfX3AtPl9NX25leHQoKTsKKwkgIHN0ZDo6c2l6ZV90IF9fYmt0ID0gX19oYXNoX2NvZGVfYmFzZTo6X01fYnVja2V0X2luZGV4KF9fcCwgX19uKTsKKworCSAgaWYgKF9fcHJldl9wICYmIF9fcHJldl9ia3QgPT0gX19ia3QpCisJICAgIHsKKwkgICAgICAvLyBQcmV2aW91cyBpbnNlcnQgd2FzIGFscmVhZHkgaW4gdGhpcyBidWNrZXQsIHdlIGluc2VydCBhZnRlcgorCSAgICAgIC8vIHRoZSBwcmV2aW91c2x5IGluc2VydGVkIG9uZSB0byBwcmVzZXJ2ZSBlcXVpdmFsZW50IGVsZW1lbnRzCisJICAgICAgLy8gcmVsYXRpdmUgb3JkZXIuCisJICAgICAgX19wLT5fTV9ueHQgPSBfX3ByZXZfcC0+X01fbnh0OworCSAgICAgIF9fcHJldl9wLT5fTV9ueHQgPSBfX3A7CisKKwkgICAgICAvLyBJbnNlcnRpbmcgYWZ0ZXIgYSBub2RlIGluIGEgYnVja2V0IHJlcXVpcmUgdG8gY2hlY2sgdGhhdCB3ZQorCSAgICAgIC8vIGhhdmVuJ3QgY2hhbmdlIHRoZSBidWNrZXQgbGFzdCBub2RlLCBpbiB0aGlzIGNhc2UgbmV4dAorCSAgICAgIC8vIGJ1Y2tldCBjb250YWluaW5nIGl0cyBiZWZvcmUgYmVnaW4gbm9kZSBtdXN0IGJlIHVwZGF0ZWQuIFdlCisJICAgICAgLy8gc2NoZWR1bGUgYSBjaGVjayBhcyBzb29uIGFzIHdlIG1vdmUgb3V0IG9mIHRoZSBzZXF1ZW5jZSBvZgorCSAgICAgIC8vIGVxdWl2YWxlbnQgbm9kZXMgdG8gbGltaXQgdGhlIG51bWJlciBvZiBjaGVja3MuCisJICAgICAgX19jaGVja19idWNrZXQgPSB0cnVlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoX19jaGVja19idWNrZXQpCisJCXsKKwkJICAvLyBDaGVjayBpZiB3ZSBzaGFsbCB1cGRhdGUgdGhlIG5leHQgYnVja2V0IGJlY2F1c2Ugb2YKKwkJICAvLyBpbnNlcnRpb25zIGludG8gX19wcmV2X2JrdCBidWNrZXQuCisJCSAgaWYgKF9fcHJldl9wLT5fTV9ueHQpCisJCSAgICB7CisJCSAgICAgIHN0ZDo6c2l6ZV90IF9fbmV4dF9ia3QKKwkJCT0gX19oYXNoX2NvZGVfYmFzZTo6X01fYnVja2V0X2luZGV4KF9fcHJldl9wLT5fTV9uZXh0KCksCisJCQkJCQkJICAgIF9fbik7CisJCSAgICAgIGlmIChfX25leHRfYmt0ICE9IF9fcHJldl9ia3QpCisJCQlfX25ld19idWNrZXRzW19fbmV4dF9ia3RdID0gX19wcmV2X3A7CisJCSAgICB9CisJCSAgX19jaGVja19idWNrZXQgPSBmYWxzZTsKKwkJfQorCisJICAgICAgaWYgKCFfX25ld19idWNrZXRzW19fYmt0XSkKKwkJeworCQkgIF9fcC0+X01fbnh0ID0gX01fYmVmb3JlX2JlZ2luKCkuX01fbnh0OworCQkgIF9NX2JlZm9yZV9iZWdpbigpLl9NX254dCA9IF9fcDsKKwkJICBfX25ld19idWNrZXRzW19fYmt0XSA9ICZfTV9iZWZvcmVfYmVnaW4oKTsKKwkJICBpZiAoX19wLT5fTV9ueHQpCisJCSAgICBfX25ld19idWNrZXRzW19fYmJlZ2luX2JrdF0gPSBfX3A7CisJCSAgX19iYmVnaW5fYmt0ID0gX19ia3Q7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBfX3AtPl9NX254dCA9IF9fbmV3X2J1Y2tldHNbX19ia3RdLT5fTV9ueHQ7CisJCSAgX19uZXdfYnVja2V0c1tfX2JrdF0tPl9NX254dCA9IF9fcDsKKwkJfQorCSAgICB9CisJICBfX3ByZXZfcCA9IF9fcDsKKwkgIF9fcHJldl9ia3QgPSBfX2JrdDsKKwkgIF9fcCA9IF9fbmV4dDsKKwl9CisKKyAgICAgIGlmIChfX2NoZWNrX2J1Y2tldCAmJiBfX3ByZXZfcC0+X01fbnh0KQorCXsKKwkgIHN0ZDo6c2l6ZV90IF9fbmV4dF9ia3QKKwkgICAgPSBfX2hhc2hfY29kZV9iYXNlOjpfTV9idWNrZXRfaW5kZXgoX19wcmV2X3AtPl9NX25leHQoKSwgX19uKTsKKwkgIGlmIChfX25leHRfYmt0ICE9IF9fcHJldl9ia3QpCisJICAgIF9fbmV3X2J1Y2tldHNbX19uZXh0X2JrdF0gPSBfX3ByZXZfcDsKKwl9CisKKyAgICAgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRzLCBfTV9idWNrZXRfY291bnQpOworICAgICAgX01fYnVja2V0X2NvdW50ID0gX19uOworICAgICAgX01fYnVja2V0cyA9IF9fbmV3X2J1Y2tldHM7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0hBU0hUQUJMRV9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvaGFzaHRhYmxlX3BvbGljeS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2hhc2h0YWJsZV9wb2xpY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjliODQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2hhc2h0YWJsZV9wb2xpY3kuaApAQCAtMCwwICsxLDE2NzAgQEAKKy8vIEludGVybmFsIHBvbGljeSBoZWFkZXIgZm9yIHVub3JkZXJlZF9zZXQgYW5kIHVub3JkZXJlZF9tYXAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvaGFzaHRhYmxlX3BvbGljeS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqICBAaGVhZGVybmFtZXt1bm9yZGVyZWRfbWFwLHVub3JkZXJlZF9zZXR9CisgKi8KKworI2lmbmRlZiBfSEFTSFRBQkxFX1BPTElDWV9ICisjZGVmaW5lIF9IQVNIVEFCTEVfUE9MSUNZX0ggMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBfSGFzaHRhYmxlOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKworbmFtZXNwYWNlIF9fZGV0YWlsCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIGhhc2h0YWJsZS1kZXRhaWwgQmFzZSBhbmQgSW1wbGVtZW50YXRpb24gQ2xhc3NlcworICAgKiAgQGluZ3JvdXAgdW5vcmRlcmVkX2Fzc29jaWF0aXZlX2NvbnRhaW5lcnMKKyAgICogIEB7CisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RydWN0IF9IYXNodGFibGVfYmFzZTsKKworICAvLyBIZWxwZXIgZnVuY3Rpb246IHJldHVybiBkaXN0YW5jZShmaXJzdCwgbGFzdCkgZm9yIGZvcndhcmQKKyAgLy8gaXRlcmF0b3JzLCBvciAwIGZvciBpbnB1dCBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPGNsYXNzIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19kaXN0YW5jZV9mdyhfSXRlcmF0b3IgX19maXJzdCwgX0l0ZXJhdG9yIF9fbGFzdCwKKwkJICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7IHJldHVybiAwOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0l0ZXJhdG9yPgorICAgIGlubGluZSB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBfX2Rpc3RhbmNlX2Z3KF9JdGVyYXRvciBfX2ZpcnN0LCBfSXRlcmF0b3IgX19sYXN0LAorCQkgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgeyByZXR1cm4gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0l0ZXJhdG9yPgorICAgIGlubGluZSB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBfX2Rpc3RhbmNlX2Z3KF9JdGVyYXRvciBfX2ZpcnN0LCBfSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX1RhZzsKKyAgICAgIHJldHVybiBfX2Rpc3RhbmNlX2Z3KF9fZmlyc3QsIF9fbGFzdCwgX1RhZygpKTsKKyAgICB9CisKKyAgLy8gSGVscGVyIHR5cGUgdXNlZCB0byBkZXRlY3Qgd2hldGhlciB0aGUgaGFzaCBmdW5jdG9yIGlzIG5vZXhjZXB0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0hhc2g+CisgICAgc3RydWN0IF9faXNfbm9leGNlcHRfaGFzaCA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKwlub2V4Y2VwdChkZWNsdmFsPGNvbnN0IF9IYXNoJj4oKShkZWNsdmFsPGNvbnN0IF9LZXkmPigpKSk+CisgICAgeyB9OworCisgIHN0cnVjdCBfSWRlbnRpdHkKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCYmCisgICAgICBvcGVyYXRvcigpKF9UcCYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxfVHA+KF9feCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX1NlbGVjdDFzdAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgYXV0bworICAgICAgb3BlcmF0b3IoKShfVHAmJiBfX3gpIGNvbnN0CisgICAgICAtPiBkZWNsdHlwZShzdGQ6OmdldDwwPihzdGQ6OmZvcndhcmQ8X1RwPihfX3gpKSkKKyAgICAgIHsgcmV0dXJuIHN0ZDo6Z2V0PDA+KHN0ZDo6Zm9yd2FyZDxfVHA+KF9feCkpOyB9CisgIH07CisKKyAgLy8gQXV4aWxpYXJ5IHR5cGVzIHVzZWQgZm9yIGFsbCBpbnN0YW50aWF0aW9ucyBvZiBfSGFzaHRhYmxlIG5vZGVzCisgIC8vIGFuZCBpdGVyYXRvcnMuCisKKyAgLyoqCisgICAqICBzdHJ1Y3QgX0hhc2h0YWJsZV90cmFpdHMKKyAgICoKKyAgICogIEltcG9ydGFudCB0cmFpdHMgZm9yIGhhc2ggdGFibGVzLgorICAgKgorICAgKiAgQHRwYXJhbSBfQ2FjaGVfaGFzaF9jb2RlICBCb29sZWFuIHZhbHVlLiBUcnVlIGlmIHRoZSB2YWx1ZSBvZgorICAgKiAgdGhlIGhhc2ggZnVuY3Rpb24gaXMgc3RvcmVkIGFsb25nIHdpdGggdGhlIHZhbHVlLiBUaGlzIGlzIGEKKyAgICogIHRpbWUtc3BhY2UgdHJhZGVvZmYuICBTdG9yaW5nIGl0IG1heSBpbXByb3ZlIGxvb2t1cCBzcGVlZCBieQorICAgKiAgcmVkdWNpbmcgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSBuZWVkIHRvIGNhbGwgdGhlIF9FcXVhbAorICAgKiAgZnVuY3Rpb24uCisgICAqCisgICAqICBAdHBhcmFtIF9Db25zdGFudF9pdGVyYXRvcnMgIEJvb2xlYW4gdmFsdWUuIFRydWUgaWYgaXRlcmF0b3IgYW5kCisgICAqICBjb25zdF9pdGVyYXRvciBhcmUgYm90aCBjb25zdGFudCBpdGVyYXRvciB0eXBlcy4gVGhpcyBpcyB0cnVlCisgICAqICBmb3IgdW5vcmRlcmVkX3NldCBhbmQgdW5vcmRlcmVkX211bHRpc2V0LCBmYWxzZSBmb3IKKyAgICogIHVub3JkZXJlZF9tYXAgYW5kIHVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICoKKyAgICogIEB0cGFyYW0gX1VuaXF1ZV9rZXlzICBCb29sZWFuIHZhbHVlLiBUcnVlIGlmIHRoZSByZXR1cm4gdmFsdWUKKyAgICogIG9mIF9IYXNodGFibGU6OmNvdW50KGspIGlzIGFsd2F5cyBhdCBtb3N0IG9uZSwgZmFsc2UgaWYgaXQgbWF5CisgICAqICBiZSBhbiBhcmJpdHJhcnkgbnVtYmVyLiBUaGlzIGlzIHRydWUgZm9yIHVub3JkZXJlZF9zZXQgYW5kCisgICAqICB1bm9yZGVyZWRfbWFwLCBmYWxzZSBmb3IgdW5vcmRlcmVkX211bHRpc2V0IGFuZAorICAgKiAgdW5vcmRlcmVkX211bHRpbWFwLgorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfQ2FjaGVfaGFzaF9jb2RlLCBib29sIF9Db25zdGFudF9pdGVyYXRvcnMsIGJvb2wgX1VuaXF1ZV9rZXlzPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX3RyYWl0cworICAgIHsKKyAgICAgIHRlbXBsYXRlPGJvb2wgX0NvbmQ+CisJdXNpbmcgX19ib29sX2NvbnN0YW50ID0gaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX0NvbmQ+OworCisgICAgICB1c2luZyBfX2hhc2hfY2FjaGVkID0gX19ib29sX2NvbnN0YW50PF9DYWNoZV9oYXNoX2NvZGU+OworICAgICAgdXNpbmcgX19jb25zdGFudF9pdGVyYXRvcnMgPSBfX2Jvb2xfY29uc3RhbnQ8X0NvbnN0YW50X2l0ZXJhdG9ycz47CisgICAgICB1c2luZyBfX3VuaXF1ZV9rZXlzID0gX19ib29sX2NvbnN0YW50PF9VbmlxdWVfa2V5cz47CisgICAgfTsKKworICAvKioKKyAgICogIHN0cnVjdCBfSGFzaF9ub2RlX2Jhc2UKKyAgICoKKyAgICogIE5vZGVzLCB1c2VkIHRvIHdyYXAgZWxlbWVudHMgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlLiAgQSBwb2xpY3kKKyAgICogIHRlbXBsYXRlIHBhcmFtZXRlciBvZiBjbGFzcyB0ZW1wbGF0ZSBfSGFzaHRhYmxlIGNvbnRyb2xzIHdoZXRoZXIKKyAgICogIG5vZGVzIGFsc28gc3RvcmUgYSBoYXNoIGNvZGUuIEluIHNvbWUgY2FzZXMgKGUuZy4gc3RyaW5ncykgdGhpcworICAgKiAgbWF5IGJlIGEgcGVyZm9ybWFuY2Ugd2luLgorICAgKi8KKyAgc3RydWN0IF9IYXNoX25vZGVfYmFzZQorICB7CisgICAgX0hhc2hfbm9kZV9iYXNlKiBfTV9ueHQ7CisKKyAgICBfSGFzaF9ub2RlX2Jhc2UoKSA6IF9NX254dCgpIHsgfQorCisgICAgX0hhc2hfbm9kZV9iYXNlKF9IYXNoX25vZGVfYmFzZSogX19uZXh0KSA6IF9NX254dChfX25leHQpIHsgfQorICB9OworCisgIC8qKgorICAgKiAgUHJpbWFyeSB0ZW1wbGF0ZSBzdHJ1Y3QgX0hhc2hfbm9kZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfQ2FjaGVfaGFzaF9jb2RlPgorICAgIHN0cnVjdCBfSGFzaF9ub2RlOworCisgIC8qKgorICAgKiAgU3BlY2lhbGl6YXRpb24gZm9yIG5vZGVzIHdpdGggY2FjaGVzLCBzdHJ1Y3QgX0hhc2hfbm9kZS4KKyAgICoKKyAgICogIEJhc2UgY2xhc3MgaXMgX19kZXRhaWw6Ol9IYXNoX25vZGVfYmFzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBzdHJ1Y3QgX0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+IDogX0hhc2hfbm9kZV9iYXNlCisgICAgeworICAgICAgX1ZhbHVlICAgICAgIF9NX3Y7CisgICAgICBzdGQ6OnNpemVfdCAgX01faGFzaF9jb2RlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlfSGFzaF9ub2RlKF9BcmdzJiYuLi4gX19hcmdzKQorCTogX01fdihzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLCBfTV9oYXNoX2NvZGUoKSB7IH0KKworICAgICAgX0hhc2hfbm9kZSoKKyAgICAgIF9NX25leHQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxfSGFzaF9ub2RlKj4oX01fbnh0KTsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBTcGVjaWFsaXphdGlvbiBmb3Igbm9kZXMgd2l0aG91dCBjYWNoZXMsIHN0cnVjdCBfSGFzaF9ub2RlLgorICAgKgorICAgKiAgQmFzZSBjbGFzcyBpcyBfX2RldGFpbDo6X0hhc2hfbm9kZV9iYXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIHN0cnVjdCBfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+IDogX0hhc2hfbm9kZV9iYXNlCisgICAgeworICAgICAgX1ZhbHVlICAgICAgIF9NX3Y7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCV9IYXNoX25vZGUoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJOiBfTV92KHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikgeyB9CisKKyAgICAgIF9IYXNoX25vZGUqCisgICAgICBfTV9uZXh0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X0hhc2hfbm9kZSo+KF9NX254dCk7IH0KKyAgICB9OworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBub2RlIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9DYWNoZV9oYXNoX2NvZGU+CisgICAgc3RydWN0IF9Ob2RlX2l0ZXJhdG9yX2Jhc2UKKyAgICB7CisgICAgICB1c2luZyBfX25vZGVfdHlwZSA9IF9IYXNoX25vZGU8X1ZhbHVlLCBfQ2FjaGVfaGFzaF9jb2RlPjsKKworICAgICAgX19ub2RlX3R5cGUqICBfTV9jdXI7CisKKyAgICAgIF9Ob2RlX2l0ZXJhdG9yX2Jhc2UoX19ub2RlX3R5cGUqIF9fcCkKKyAgICAgIDogX01fY3VyKF9fcCkgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luY3IoKQorICAgICAgeyBfTV9jdXIgPSBfTV9jdXItPl9NX25leHQoKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9DYWNoZV9oYXNoX2NvZGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfQ2FjaGVfaGFzaF9jb2RlPiYgX194LAorCSAgICAgICBjb25zdCBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX0NhY2hlX2hhc2hfY29kZSA+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2N1ciA9PSBfX3kuX01fY3VyOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9DYWNoZV9oYXNoX2NvZGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfQ2FjaGVfaGFzaF9jb2RlPiYgX194LAorCSAgICAgICBjb25zdCBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX0NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fY3VyICE9IF9feS5fTV9jdXI7IH0KKworICAvLy8gTm9kZSBpdGVyYXRvcnMsIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgaGFzaHRhYmxlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jb25zdGFudF9pdGVyYXRvcnMsIGJvb2wgX19jYWNoZT4KKyAgICBzdHJ1Y3QgX05vZGVfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlID0gX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+OworICAgICAgdXNpbmcgX19ub2RlX3R5cGUgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6X19ub2RlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCQkJY29uc3QgX1ZhbHVlKiwgX1ZhbHVlKj46OnR5cGU7CisKKyAgICAgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8X19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJCQkgIGNvbnN0IF9WYWx1ZSYsIF9WYWx1ZSY+Ojp0eXBlOworCisgICAgICBfTm9kZV9pdGVyYXRvcigpCisgICAgICA6IF9fYmFzZV90eXBlKDApIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgX05vZGVfaXRlcmF0b3IoX19ub2RlX3R5cGUqIF9fcCkKKyAgICAgIDogX19iYXNlX3R5cGUoX19wKSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY3VyLT5fTV92OyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZih0aGlzLT5fTV9jdXItPl9NX3YpOyB9CisKKyAgICAgIF9Ob2RlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX05vZGVfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9Ob2RlX2l0ZXJhdG9yIF9fdG1wKCp0aGlzKTsKKwl0aGlzLT5fTV9pbmNyKCk7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorICAgIH07CisKKyAgLy8vIE5vZGUgY29uc3RfaXRlcmF0b3JzLCB1c2VkIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIGhhc2h0YWJsZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9fY29uc3RhbnRfaXRlcmF0b3JzLCBib29sIF9fY2FjaGU+CisgICAgc3RydWN0IF9Ob2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZSA9IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPjsKKyAgICAgIHVzaW5nIF9fbm9kZV90eXBlID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9fbm9kZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICB0eXBlZGVmIGNvbnN0IF9WYWx1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1ZhbHVlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgICAgIF9Ob2RlX2NvbnN0X2l0ZXJhdG9yKCkKKyAgICAgIDogX19iYXNlX3R5cGUoMCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfTm9kZV9jb25zdF9pdGVyYXRvcihfX25vZGVfdHlwZSogX19wKQorICAgICAgOiBfX2Jhc2VfdHlwZShfX3ApIHsgfQorCisgICAgICBfTm9kZV9jb25zdF9pdGVyYXRvcihjb25zdCBfTm9kZV9pdGVyYXRvcjxfVmFsdWUsIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJICAgX19jYWNoZT4mIF9feCkKKyAgICAgIDogX19iYXNlX3R5cGUoX194Ll9NX2N1cikgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2N1ci0+X01fdjsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YodGhpcy0+X01fY3VyLT5fTV92KTsgfQorCisgICAgICBfTm9kZV9jb25zdF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Ob2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfTm9kZV9jb25zdF9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICB9OworCisgIC8vIE1hbnkgb2YgY2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZSdzIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIHBvbGljeQorICAvLyBjbGFzc2VzLiAgVGhlc2UgYXJlIGRlZmF1bHRzIGZvciB0aGUgcG9saWNpZXMuCisKKyAgLy8vIERlZmF1bHQgcmFuZ2UgaGFzaGluZyBmdW5jdGlvbjogdXNlIGRpdmlzaW9uIHRvIGZvbGQgYSBsYXJnZSBudW1iZXIKKyAgLy8vIGludG8gdGhlIHJhbmdlIFswLCBOKS4KKyAgc3RydWN0IF9Nb2RfcmFuZ2VfaGFzaGluZworICB7CisgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCBmaXJzdF9hcmd1bWVudF90eXBlOworICAgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCByZXN1bHRfdHlwZTsKKworICAgIHJlc3VsdF90eXBlCisgICAgb3BlcmF0b3IoKShmaXJzdF9hcmd1bWVudF90eXBlIF9fbnVtLCBzZWNvbmRfYXJndW1lbnRfdHlwZSBfX2RlbikgY29uc3QKKyAgICB7IHJldHVybiBfX251bSAlIF9fZGVuOyB9CisgIH07CisKKyAgLy8vIERlZmF1bHQgcmFuZ2VkIGhhc2ggZnVuY3Rpb24gSC4gIEluIHByaW5jaXBsZSBpdCBzaG91bGQgYmUgYQorICAvLy8gZnVuY3Rpb24gb2JqZWN0IGNvbXBvc2VkIGZyb20gb2JqZWN0cyBvZiB0eXBlIEgxIGFuZCBIMiBzdWNoIHRoYXQKKyAgLy8vIGgoaywgTikgPSBoMihoMShrKSwgTiksIGJ1dCB0aGF0IHdvdWxkIG1lYW4gbWFraW5nIGV4dHJhIGNvcGllcyBvZgorICAvLy8gaDEgYW5kIGgyLiAgU28gaW5zdGVhZCB3ZSdsbCBqdXN0IHVzZSBhIHRhZyB0byB0ZWxsIGNsYXNzIHRlbXBsYXRlCisgIC8vLyBoYXNodGFibGUgdG8gZG8gdGhhdCBjb21wb3NpdGlvbi4KKyAgc3RydWN0IF9EZWZhdWx0X3JhbmdlZF9oYXNoIHsgfTsKKworICAvLy8gRGVmYXVsdCB2YWx1ZSBmb3IgcmVoYXNoIHBvbGljeS4gIEJ1Y2tldCBzaXplIGlzICh1c3VhbGx5KSB0aGUKKyAgLy8vIHNtYWxsZXN0IHByaW1lIHRoYXQga2VlcHMgdGhlIGxvYWQgZmFjdG9yIHNtYWxsIGVub3VnaC4KKyAgc3RydWN0IF9QcmltZV9yZWhhc2hfcG9saWN5CisgIHsKKyAgICBfUHJpbWVfcmVoYXNoX3BvbGljeShmbG9hdCBfX3ogPSAxLjApCisgICAgOiBfTV9tYXhfbG9hZF9mYWN0b3IoX196KSwgX01fbmV4dF9yZXNpemUoMCkgeyB9CisKKyAgICBmbG9hdAorICAgIG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fbWF4X2xvYWRfZmFjdG9yOyB9CisKKyAgICAvLyBSZXR1cm4gYSBidWNrZXQgc2l6ZSBubyBzbWFsbGVyIHRoYW4gbi4KKyAgICBzdGQ6OnNpemVfdAorICAgIF9NX25leHRfYmt0KHN0ZDo6c2l6ZV90IF9fbikgY29uc3Q7CisKKyAgICAvLyBSZXR1cm4gYSBidWNrZXQgY291bnQgYXBwcm9wcmlhdGUgZm9yIG4gZWxlbWVudHMKKyAgICBzdGQ6OnNpemVfdAorICAgIF9NX2JrdF9mb3JfZWxlbWVudHMoc3RkOjpzaXplX3QgX19uKSBjb25zdAorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9jZWlsKF9fbiAvIChsb25nIGRvdWJsZSlfTV9tYXhfbG9hZF9mYWN0b3IpOyB9CisKKyAgICAvLyBfX25fYmt0IGlzIGN1cnJlbnQgYnVja2V0IGNvdW50LCBfX25fZWx0IGlzIGN1cnJlbnQgZWxlbWVudCBjb3VudCwKKyAgICAvLyBhbmQgX19uX2lucyBpcyBudW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgaW5zZXJ0ZWQuICBEbyB3ZSBuZWVkIHRvCisgICAgLy8gaW5jcmVhc2UgYnVja2V0IGNvdW50PyAgSWYgc28sIHJldHVybiBtYWtlX3BhaXIodHJ1ZSwgbiksIHdoZXJlIG4KKyAgICAvLyBpcyB0aGUgbmV3IGJ1Y2tldCBjb3VudC4gIElmIG5vdCwgcmV0dXJuIG1ha2VfcGFpcihmYWxzZSwgMCkuCisgICAgc3RkOjpwYWlyPGJvb2wsIHN0ZDo6c2l6ZV90PgorICAgIF9NX25lZWRfcmVoYXNoKHN0ZDo6c2l6ZV90IF9fbl9ia3QsIHN0ZDo6c2l6ZV90IF9fbl9lbHQsCisJCSAgIHN0ZDo6c2l6ZV90IF9fbl9pbnMpIGNvbnN0OworCisgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCBfU3RhdGU7CisKKyAgICBfU3RhdGUKKyAgICBfTV9zdGF0ZSgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fbmV4dF9yZXNpemU7IH0KKworICAgIHZvaWQKKyAgICBfTV9yZXNldChfU3RhdGUgX19zdGF0ZSkKKyAgICB7IF9NX25leHRfcmVzaXplID0gX19zdGF0ZTsgfQorCisgICAgZW51bSB7IF9TX25fcHJpbWVzID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICE9IDggPyAyNTYgOiAyNTYgKyA0OCB9OworCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IF9TX2dyb3d0aF9mYWN0b3IgPSAyOworCisgICAgZmxvYXQgICAgICAgICAgICAgICAgX01fbWF4X2xvYWRfZmFjdG9yOworICAgIG11dGFibGUgc3RkOjpzaXplX3QgIF9NX25leHRfcmVzaXplOworICB9OworCisgIC8vIEJhc2UgY2xhc3NlcyBmb3Igc3RkOjpfSGFzaHRhYmxlLiAgV2UgZGVmaW5lIHRoZXNlIGJhc2UgY2xhc3NlcworICAvLyBiZWNhdXNlIGluIHNvbWUgY2FzZXMgd2Ugd2FudCB0byBkbyBkaWZmZXJlbnQgdGhpbmdzIGRlcGVuZGluZyBvbgorICAvLyB0aGUgdmFsdWUgb2YgYSBwb2xpY3kgY2xhc3MuICBJbiBzb21lIGNhc2VzIHRoZSBwb2xpY3kgY2xhc3MKKyAgLy8gYWZmZWN0cyB3aGljaCBtZW1iZXIgZnVuY3Rpb25zIGFuZCBuZXN0ZWQgdHlwZWRlZnMgYXJlIGRlZmluZWQ7CisgIC8vIHdlIGhhbmRsZSB0aGF0IGJ5IHNwZWNpYWxpemluZyBiYXNlIGNsYXNzIHRlbXBsYXRlcy4gIFNldmVyYWwgb2YKKyAgLy8gdGhlIGJhc2UgY2xhc3MgdGVtcGxhdGVzIG5lZWQgdG8gYWNjZXNzIG90aGVyIG1lbWJlcnMgb2YgY2xhc3MKKyAgLy8gdGVtcGxhdGUgX0hhc2h0YWJsZSwgc28gd2UgdXNlIGEgdmFyaWFudCBvZiB0aGUgIkN1cmlvdXNseQorICAvLyBSZWN1cnJpbmcgVGVtcGxhdGUgUGF0dGVybiIgKENSVFApIHRlY2huaXF1ZS4KKworICAvKioKKyAgICogIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgX01hcF9iYXNlLgorICAgKgorICAgKiAgSWYgdGhlIGhhc2h0YWJsZSBoYXMgYSB2YWx1ZSB0eXBlIG9mIHRoZSBmb3JtIHBhaXI8VDEsIFQyPiBhbmQgYQorICAgKiAga2V5IGV4dHJhY3Rpb24gcG9saWN5IChfRXh0cmFjdEtleSkgdGhhdCByZXR1cm5zIHRoZSBmaXJzdCBwYXJ0CisgICAqICBvZiB0aGUgcGFpciwgdGhlIGhhc2h0YWJsZSBnZXRzIGEgbWFwcGVkX3R5cGUgdHlwZWRlZi4gIElmIGl0CisgICAqICBzYXRpc2ZpZXMgdGhvc2UgY3JpdGVyaWEgYW5kIGFsc28gaGFzIHVuaXF1ZSBrZXlzLCB0aGVuIGl0IGFsc28KKyAgICogIGdldHMgYW4gb3BlcmF0b3JbXS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHMsCisJICAgYm9vbCBfVW5pcXVlX2tleXMgPSBfVHJhaXRzOjpfX3VuaXF1ZV9rZXlzOjp2YWx1ZT4KKyAgICBzdHJ1Y3QgX01hcF9iYXNlIHsgfTsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiwgX191bmlxdWVfa2V5cyBzZXQgdG8gZmFsc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJ1Y3QgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBfQWxsb2MsIF9TZWxlY3Qxc3QsIF9FcXVhbCwKKwkJICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHMsIGZhbHNlPgorICAgIHsKKyAgICAgIHVzaW5nIG1hcHBlZF90eXBlID0gdHlwZW5hbWUgc3RkOjp0dXBsZV9lbGVtZW50PDEsIF9QYWlyPjo6dHlwZTsKKyAgICB9OworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uLCBfX3VuaXF1ZV9rZXlzIHNldCB0byB0cnVlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RydWN0IF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgX0FsbG9jLCBfU2VsZWN0MXN0LCBfRXF1YWwsCisJCSAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzLCB0cnVlPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdXNpbmcgX19oYXNodGFibGVfYmFzZSA9IF9fZGV0YWlsOjpfSGFzaHRhYmxlX2Jhc2U8X0tleSwgX1BhaXIsCisJCQkJCQkJIF9TZWxlY3Qxc3QsCisJCQkJCQkJX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCQkJCQkJICBfVHJhaXRzPjsKKworICAgICAgdXNpbmcgX19oYXNodGFibGUgPSBfSGFzaHRhYmxlPF9LZXksIF9QYWlyLCBfQWxsb2MsCisJCQkJICAgICBfU2VsZWN0MXN0LCBfRXF1YWwsCisJCQkJICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OworCisgICAgICB1c2luZyBfX2hhc2hfY29kZSA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6Ol9faGFzaF9jb2RlOworICAgICAgdXNpbmcgX19ub2RlX3R5cGUgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjpfX25vZGVfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHVzaW5nIGtleV90eXBlID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6a2V5X3R5cGU7CisgICAgICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6Oml0ZXJhdG9yOworICAgICAgdXNpbmcgbWFwcGVkX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OnR1cGxlX2VsZW1lbnQ8MSwgX1BhaXI+Ojp0eXBlOworCisgICAgICBtYXBwZWRfdHlwZSYKKyAgICAgIG9wZXJhdG9yW10oY29uc3Qga2V5X3R5cGUmIF9fayk7CisKKyAgICAgIG1hcHBlZF90eXBlJgorICAgICAgb3BlcmF0b3JbXShrZXlfdHlwZSYmIF9fayk7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDc2MS4gdW5vcmRlcmVkX21hcCBuZWVkcyBhbiBhdCgpIG1lbWJlciBmdW5jdGlvbi4KKyAgICAgIG1hcHBlZF90eXBlJgorICAgICAgYXQoY29uc3Qga2V5X3R5cGUmIF9fayk7CisKKyAgICAgIGNvbnN0IG1hcHBlZF90eXBlJgorICAgICAgYXQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Q7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBfQWxsb2MsIF9TZWxlY3Qxc3QsIF9FcXVhbCwKKwkJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cywgdHJ1ZT4KKwkJICAgICAgIDo6bWFwcGVkX3R5cGUmCisgICAgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBfQWxsb2MsIF9TZWxlY3Qxc3QsIF9FcXVhbCwKKwkgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHMsIHRydWU+OjoKKyAgICBvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgX19oYXNodGFibGUqIF9faCA9IHN0YXRpY19jYXN0PF9faGFzaHRhYmxlKj4odGhpcyk7CisgICAgICBfX2hhc2hfY29kZSBfX2NvZGUgPSBfX2gtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gX19oLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUpOworICAgICAgX19ub2RlX3R5cGUqIF9fcCA9IF9faC0+X01fZmluZF9ub2RlKF9fbiwgX19rLCBfX2NvZGUpOworCisgICAgICBpZiAoIV9fcCkKKwl7CisJICBfX3AgPSBfX2gtPl9NX2FsbG9jYXRlX25vZGUoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LAorCQkJCSAgICAgIHN0ZDo6dHVwbGU8Y29uc3Qga2V5X3R5cGUmPihfX2spLAorCQkJCSAgICAgIHN0ZDo6dHVwbGU8PigpKTsKKwkgIHJldHVybiBfX2gtPl9NX2luc2VydF91bmlxdWVfbm9kZShfX24sIF9fY29kZSwgX19wKS0+c2Vjb25kOworCX0KKworICAgICAgcmV0dXJuIChfX3AtPl9NX3YpLnNlY29uZDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgX0FsbG9jLCBfU2VsZWN0MXN0LCBfRXF1YWwsCisJCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHMsIHRydWU+CisJCSAgICAgICA6Om1hcHBlZF90eXBlJgorICAgIF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgX0FsbG9jLCBfU2VsZWN0MXN0LCBfRXF1YWwsCisJICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzLCB0cnVlPjo6CisgICAgb3BlcmF0b3JbXShrZXlfdHlwZSYmIF9faykKKyAgICB7CisgICAgICBfX2hhc2h0YWJsZSogX19oID0gc3RhdGljX2Nhc3Q8X19oYXNodGFibGUqPih0aGlzKTsKKyAgICAgIF9faGFzaF9jb2RlIF9fY29kZSA9IF9faC0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSBfX2gtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSk7CisgICAgICBfX25vZGVfdHlwZSogX19wID0gX19oLT5fTV9maW5kX25vZGUoX19uLCBfX2ssIF9fY29kZSk7CisKKyAgICAgIGlmICghX19wKQorCXsKKwkgIF9fcCA9IF9faC0+X01fYWxsb2NhdGVfbm9kZShzdGQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsCisJCQkJICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6bW92ZShfX2spKSwKKwkJCQkgICAgICBzdGQ6OnR1cGxlPD4oKSk7CisJICByZXR1cm4gX19oLT5fTV9pbnNlcnRfdW5pcXVlX25vZGUoX19uLCBfX2NvZGUsIF9fcCktPnNlY29uZDsKKwl9CisKKyAgICAgIHJldHVybiAoX19wLT5fTV92KS5zZWNvbmQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBfTWFwX2Jhc2U8X0tleSwgX1BhaXIsIF9BbGxvYywgX1NlbGVjdDFzdCwgX0VxdWFsLAorCQkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzLCB0cnVlPgorCQkgICAgICAgOjptYXBwZWRfdHlwZSYKKyAgICBfTWFwX2Jhc2U8X0tleSwgX1BhaXIsIF9BbGxvYywgX1NlbGVjdDFzdCwgX0VxdWFsLAorCSAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cywgdHJ1ZT46OgorICAgIGF0KGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgX19oYXNodGFibGUqIF9faCA9IHN0YXRpY19jYXN0PF9faGFzaHRhYmxlKj4odGhpcyk7CisgICAgICBfX2hhc2hfY29kZSBfX2NvZGUgPSBfX2gtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gX19oLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUpOworICAgICAgX19ub2RlX3R5cGUqIF9fcCA9IF9faC0+X01fZmluZF9ub2RlKF9fbiwgX19rLCBfX2NvZGUpOworCisgICAgICBpZiAoIV9fcCkKKwlfX3Rocm93X291dF9vZl9yYW5nZShfX04oIl9NYXBfYmFzZTo6YXQiKSk7CisgICAgICByZXR1cm4gKF9fcC0+X01fdikuc2Vjb25kOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY29uc3QgdHlwZW5hbWUgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBfQWxsb2MsIF9TZWxlY3Qxc3QsCisJCQkgICAgIF9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJICAgICBfVHJhaXRzLCB0cnVlPjo6bWFwcGVkX3R5cGUmCisgICAgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBfQWxsb2MsIF9TZWxlY3Qxc3QsIF9FcXVhbCwKKwkgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHMsIHRydWU+OjoKKyAgICBhdChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IF9faGFzaHRhYmxlKiBfX2ggPSBzdGF0aWNfY2FzdDxjb25zdCBfX2hhc2h0YWJsZSo+KHRoaXMpOworICAgICAgX19oYXNoX2NvZGUgX19jb2RlID0gX19oLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IF9faC0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlKTsKKyAgICAgIF9fbm9kZV90eXBlKiBfX3AgPSBfX2gtPl9NX2ZpbmRfbm9kZShfX24sIF9faywgX19jb2RlKTsKKworICAgICAgaWYgKCFfX3ApCisJX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJfTWFwX2Jhc2U6OmF0IikpOworICAgICAgcmV0dXJuIChfX3AtPl9NX3YpLnNlY29uZDsKKyAgICB9CisKKyAgLyoqCisgICAqICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIF9JbnNlcnRfYmFzZS4KKyAgICoKKyAgICogIGluc2VydCBtZW1iZXIgZnVuY3Rpb25zIGFwcHJvcHJpYXRlIHRvIGFsbCBfSGFzaHRhYmxlcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RydWN0IF9JbnNlcnRfYmFzZQorICAgIHsKKyAgICAgIHVzaW5nIF9faGFzaHRhYmxlID0gX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksCisJCQkJICAgICBfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwKKwkJCQkgICAgIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OworCisgICAgICB1c2luZyBfX2hhc2h0YWJsZV9iYXNlID0gX0hhc2h0YWJsZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksCisJCQkJCSAgICAgICBfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwKKwkJCQkJICAgICAgIF9UcmFpdHM+OworCisgICAgICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6dmFsdWVfdHlwZTsKKyAgICAgIHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6aXRlcmF0b3I7CisgICAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9ICB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjpjb25zdF9pdGVyYXRvcjsKKyAgICAgIHVzaW5nIHNpemVfdHlwZSA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6OnNpemVfdHlwZTsKKworICAgICAgdXNpbmcgX191bmlxdWVfa2V5cyA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6Ol9fdW5pcXVlX2tleXM7CisgICAgICB1c2luZyBfX2lyZXR1cm5fdHlwZSA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6Ol9faXJldHVybl90eXBlOworICAgICAgdXNpbmcgX19pY29udl90eXBlID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6X19pY29udl90eXBlOworCisgICAgICBfX2hhc2h0YWJsZSYKKyAgICAgIF9NX2Nvbmp1cmVfaGFzaHRhYmxlKCkKKyAgICAgIHsgcmV0dXJuICooc3RhdGljX2Nhc3Q8X19oYXNodGFibGUqPih0aGlzKSk7IH0KKworICAgICAgX19pcmV0dXJuX3R5cGUKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3YpCisgICAgICB7CisJX19oYXNodGFibGUmIF9faCA9IF9NX2Nvbmp1cmVfaGFzaHRhYmxlKCk7CisJcmV0dXJuIF9faC5fTV9pbnNlcnQoX192LCBfX3VuaXF1ZV9rZXlzKCkpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpCisgICAgICB7IHJldHVybiBfX2ljb252X3R5cGUoKShpbnNlcnQoX192KSk7IH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyB0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdm9pZAorCWluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9JbnNlcnRfYmFzZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLAorCQkgICAgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwl1c2luZyBfX3JlaGFzaF90eXBlID0gdHlwZW5hbWUgX19oYXNodGFibGU6Ol9fcmVoYXNoX3R5cGU7CisJdXNpbmcgX19yZWhhc2hfc3RhdGUgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZTo6X19yZWhhc2hfc3RhdGU7CisJdXNpbmcgcGFpcl90eXBlID0gc3RkOjpwYWlyPGJvb2wsIHN0ZDo6c2l6ZV90PjsKKworCXNpemVfdHlwZSBfX25fZWx0ID0gX19kZXRhaWw6Ol9fZGlzdGFuY2VfZncoX19maXJzdCwgX19sYXN0KTsKKworCV9faGFzaHRhYmxlJiBfX2ggPSBfTV9jb25qdXJlX2hhc2h0YWJsZSgpOworCV9fcmVoYXNoX3R5cGUmIF9fcmVoYXNoID0gX19oLl9NX3JlaGFzaF9wb2xpY3k7CisJY29uc3QgX19yZWhhc2hfc3RhdGUmIF9fc2F2ZWRfc3RhdGUgPSBfX3JlaGFzaC5fTV9zdGF0ZSgpOworCXBhaXJfdHlwZSBfX2RvX3JlaGFzaCA9IF9fcmVoYXNoLl9NX25lZWRfcmVoYXNoKF9faC5fTV9idWNrZXRfY291bnQsCisJCQkJCQkJX19oLl9NX2VsZW1lbnRfY291bnQsCisJCQkJCQkJX19uX2VsdCk7CisKKwlpZiAoX19kb19yZWhhc2guZmlyc3QpCisJICBfX2guX01fcmVoYXNoKF9fZG9fcmVoYXNoLnNlY29uZCwgX19zYXZlZF9zdGF0ZSk7CisKKwlmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwkgIF9faC5fTV9pbnNlcnQoKl9fZmlyc3QsIF9fdW5pcXVlX2tleXMoKSk7CisgICAgICB9CisKKyAgLyoqCisgICAqICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIF9JbnNlcnQuCisgICAqCisgICAqICBTZWxlY3QgaW5zZXJ0IG1lbWJlciBmdW5jdGlvbnMgYXBwcm9wcmlhdGUgdG8gX0hhc2h0YWJsZSBwb2xpY3kgY2hvaWNlcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHMsCisJICAgYm9vbCBfQ29uc3RhbnRfaXRlcmF0b3JzID0gX1RyYWl0czo6X19jb25zdGFudF9pdGVyYXRvcnM6OnZhbHVlLAorCSAgIGJvb2wgX1VuaXF1ZV9rZXlzID0gX1RyYWl0czo6X191bmlxdWVfa2V5czo6dmFsdWU+CisgICAgc3RydWN0IF9JbnNlcnQ7CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cnVjdCBfSW5zZXJ0PF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCSAgIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHMsIHRydWUsIHRydWU+CisgICAgOiBwdWJsaWMgX0luc2VydF9iYXNlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPgorICAgIHsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlID0gX0luc2VydF9iYXNlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwKKwkJCQkJX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCQkJCV9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OworICAgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIF9fYmFzZV90eXBlOjp2YWx1ZV90eXBlOworICAgICAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6aXRlcmF0b3I7CisgICAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9ICB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHVzaW5nIF9fdW5pcXVlX2tleXMgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6X191bmlxdWVfa2V5czsKKyAgICAgIHVzaW5nIF9faGFzaHRhYmxlID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9faGFzaHRhYmxlOworCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6aW5zZXJ0OworCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9fdikKKyAgICAgIHsKKwlfX2hhc2h0YWJsZSYgX19oID0gdGhpcy0+X01fY29uanVyZV9oYXNodGFibGUoKTsKKwlyZXR1cm4gX19oLl9NX2luc2VydChzdGQ6Om1vdmUoX192KSwgX191bmlxdWVfa2V5cygpKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciwgdmFsdWVfdHlwZSYmIF9fdikKKyAgICAgIHsgcmV0dXJuIGluc2VydChzdGQ6Om1vdmUoX192KSkuZmlyc3Q7IH0KKyAgICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJ1Y3QgX0luc2VydDxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLAorCQkgICBfUmVoYXNoUG9saWN5LCBfVHJhaXRzLCB0cnVlLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBfSW5zZXJ0X2Jhc2U8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+CisgICAgeworICAgICAgdXNpbmcgX19iYXNlX3R5cGUgPSBfSW5zZXJ0X2Jhc2U8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LAorCQkJCQlfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwKKwkJCQkJX1JlaGFzaFBvbGljeSwgX1RyYWl0cz47CisgICAgICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6OnZhbHVlX3R5cGU7CisgICAgICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIF9fYmFzZV90eXBlOjppdGVyYXRvcjsKKyAgICAgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gIHR5cGVuYW1lIF9fYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvcjsKKworICAgICAgdXNpbmcgX191bmlxdWVfa2V5cyA9IHR5cGVuYW1lIF9fYmFzZV90eXBlOjpfX3VuaXF1ZV9rZXlzOworICAgICAgdXNpbmcgX19oYXNodGFibGUgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6X19oYXNodGFibGU7CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjppbnNlcnQ7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9fdikKKyAgICAgIHsKKwlfX2hhc2h0YWJsZSYgX19oID0gdGhpcy0+X01fY29uanVyZV9oYXNodGFibGUoKTsKKwlyZXR1cm4gX19oLl9NX2luc2VydChzdGQ6Om1vdmUoX192KSwgX191bmlxdWVfa2V5cygpKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciwgdmFsdWVfdHlwZSYmIF9fdikKKyAgICAgIHsgcmV0dXJuIGluc2VydChzdGQ6Om1vdmUoX192KSk7IH0KKyAgICAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHMsIGJvb2wgX1VuaXF1ZV9rZXlzPgorICAgIHN0cnVjdCBfSW5zZXJ0PF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCSAgIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHMsIGZhbHNlLCBfVW5pcXVlX2tleXM+CisgICAgOiBwdWJsaWMgX0luc2VydF9iYXNlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPgorICAgIHsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlID0gX0luc2VydF9iYXNlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwKKwkJCQkgICAgICAgX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCQkJICAgICAgIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OworICAgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIF9fYmFzZV90eXBlOjp2YWx1ZV90eXBlOworICAgICAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6aXRlcmF0b3I7CisgICAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9ICB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHVzaW5nIF9fdW5pcXVlX2tleXMgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6X191bmlxdWVfa2V5czsKKyAgICAgIHVzaW5nIF9faGFzaHRhYmxlID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9faGFzaHRhYmxlOworICAgICAgdXNpbmcgX19pcmV0dXJuX3R5cGUgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6X19pcmV0dXJuX3R5cGU7CisgICAgICB1c2luZyBfX2ljb252X3R5cGUgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6X19pY29udl90eXBlOworCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6aW5zZXJ0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpcj4KKwl1c2luZyBfX2lzX2NvbnMgPSBzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwgX1BhaXImJj47CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyPgorCXVzaW5nIF9JRmNvbnMgPSBzdGQ6OmVuYWJsZV9pZjxfX2lzX2NvbnM8X1BhaXI+Ojp2YWx1ZT47CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyPgorCXVzaW5nIF9JRmNvbnNwID0gdHlwZW5hbWUgX0lGY29uczxfUGFpcj46OnR5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IF9JRmNvbnNwPF9QYWlyPj4KKwlfX2lyZXR1cm5fdHlwZQorCWluc2VydChfUGFpciYmIF9fdikKKwl7CisJICBfX2hhc2h0YWJsZSYgX19oID0gdGhpcy0+X01fY29uanVyZV9oYXNodGFibGUoKTsKKwkgIHJldHVybiBfX2guX01fZW1wbGFjZShfX3VuaXF1ZV9rZXlzKCksIHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX192KSk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSBfSUZjb25zcDxfUGFpcj4+CisJaXRlcmF0b3IKKwlpbnNlcnQoY29uc3RfaXRlcmF0b3IsIF9QYWlyJiYgX192KQorCXsgcmV0dXJuIF9faWNvbnZfdHlwZSgpKGluc2VydChzdGQ6OmZvcndhcmQ8X1BhaXI+KF9fdikpKTsgfQorICAgfTsKKworICAvKioKKyAgICogIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgIF9SZWhhc2hfYmFzZS4KKyAgICoKKyAgICogIEdpdmUgaGFzaHRhYmxlIHRoZSBtYXhfbG9hZF9mYWN0b3IgZnVuY3Rpb25zIGFuZCByZXNlcnZlIGlmZiB0aGUKKyAgICogIHJlaGFzaCBwb2xpY3kgaXMgX1ByaW1lX3JlaGFzaF9wb2xpY3kuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RydWN0IF9SZWhhc2hfYmFzZTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cnVjdCBfUmVoYXNoX2Jhc2U8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9QcmltZV9yZWhhc2hfcG9saWN5LCBfVHJhaXRzPgorICAgIHsKKyAgICAgIHVzaW5nIF9faGFzaHRhYmxlID0gX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksCisJCQkJICAgICBfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwKKwkJCQkgICAgIF9QcmltZV9yZWhhc2hfcG9saWN5LCBfVHJhaXRzPjsKKworICAgICAgZmxvYXQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisJY29uc3QgX19oYXNodGFibGUqIF9fdGhpcyA9IHN0YXRpY19jYXN0PGNvbnN0IF9faGFzaHRhYmxlKj4odGhpcyk7CisJcmV0dXJuIF9fdGhpcy0+X19yZWhhc2hfcG9saWN5KCkubWF4X2xvYWRfZmFjdG9yKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX3opCisgICAgICB7CisJX19oYXNodGFibGUqIF9fdGhpcyA9IHN0YXRpY19jYXN0PF9faGFzaHRhYmxlKj4odGhpcyk7CisJX190aGlzLT5fX3JlaGFzaF9wb2xpY3koX1ByaW1lX3JlaGFzaF9wb2xpY3koX196KSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2VydmUoc3RkOjpzaXplX3QgX19uKQorICAgICAgeworCV9faGFzaHRhYmxlKiBfX3RoaXMgPSBzdGF0aWNfY2FzdDxfX2hhc2h0YWJsZSo+KHRoaXMpOworCV9fdGhpcy0+cmVoYXNoKF9fYnVpbHRpbl9jZWlsKF9fbiAvIG1heF9sb2FkX2ZhY3RvcigpKSk7CisgICAgICB9CisgICAgfTsKKworICAvKioKKyAgICogIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZV9lYm9faGVscGVyLgorICAgKgorICAgKiAgSGVscGVyIGNsYXNzIHVzaW5nIEVCTyB3aGVuIGl0IGlzIG5vdCBmb3JiaWRkZW4sIHR5cGUgaXMgbm90CisgICAqICBmaW5hbCwgYW5kIHdoZW4gaXQgd29ydGggaXQsIHR5cGUgaXMgZW1wdHkuCisgICAqLworICB0ZW1wbGF0ZTxpbnQgX05tLCB0eXBlbmFtZSBfVHAsCisJICAgYm9vbCBfX3VzZV9lYm8gPSAhX19pc19maW5hbChfVHApICYmIF9faXNfZW1wdHkoX1RwKT4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9lYm9faGVscGVyOworCisgIC8vLyBTcGVjaWFsaXphdGlvbiB1c2luZyBFQk8uCisgIHRlbXBsYXRlPGludCBfTm0sIHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9lYm9faGVscGVyPF9ObSwgX1RwLCB0cnVlPgorICAgIDogcHJpdmF0ZSBfVHAKKyAgICB7CisgICAgICBfSGFzaHRhYmxlX2Vib19oZWxwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAgIF9IYXNodGFibGVfZWJvX2hlbHBlcihjb25zdCBfVHAmIF9fdHApIDogX1RwKF9fdHApCisgICAgICB7IH0KKworICAgICAgc3RhdGljIGNvbnN0IF9UcCYKKyAgICAgIF9TX2NnZXQoY29uc3QgX0hhc2h0YWJsZV9lYm9faGVscGVyJiBfX2Vib2gpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBfVHAmPihfX2Vib2gpOyB9CisKKyAgICAgIHN0YXRpYyBfVHAmCisgICAgICBfU19nZXQoX0hhc2h0YWJsZV9lYm9faGVscGVyJiBfX2Vib2gpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHAmPihfX2Vib2gpOyB9CisgICAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gbm90IHVzaW5nIEVCTy4KKyAgdGVtcGxhdGU8aW50IF9ObSwgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX2Vib19oZWxwZXI8X05tLCBfVHAsIGZhbHNlPgorICAgIHsKKyAgICAgIF9IYXNodGFibGVfZWJvX2hlbHBlcigpID0gZGVmYXVsdDsKKworICAgICAgX0hhc2h0YWJsZV9lYm9faGVscGVyKGNvbnN0IF9UcCYgX190cCkgOiBfTV90cChfX3RwKQorICAgICAgeyB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBfVHAmCisgICAgICBfU19jZ2V0KGNvbnN0IF9IYXNodGFibGVfZWJvX2hlbHBlciYgX19lYm9oKQorICAgICAgeyByZXR1cm4gX19lYm9oLl9NX3RwOyB9CisKKyAgICAgIHN0YXRpYyBfVHAmCisgICAgICBfU19nZXQoX0hhc2h0YWJsZV9lYm9faGVscGVyJiBfX2Vib2gpCisgICAgICB7IHJldHVybiBfX2Vib2guX01fdHA7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfVHAgX01fdHA7CisgICAgfTsKKworICAvKioKKyAgICogIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgX0xvY2FsX2l0ZXJhdG9yX2Jhc2UuCisgICAqCisgICAqICBCYXNlIGNsYXNzIGZvciBsb2NhbCBpdGVyYXRvcnMsIHVzZWQgdG8gaXRlcmF0ZSB3aXRoaW4gYSBidWNrZXQKKyAgICogIGJ1dCBub3QgYmV0d2VlbiBidWNrZXRzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZT4KKyAgICBzdHJ1Y3QgX0xvY2FsX2l0ZXJhdG9yX2Jhc2U7CisKKyAgLyoqCisgICAqICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIF9IYXNoX2NvZGVfYmFzZS4KKyAgICoKKyAgICogIEVuY2Fwc3VsYXRlcyB0d28gcG9saWN5IGlzc3VlcyB0aGF0IGFyZW4ndCBxdWl0ZSBvcnRob2dvbmFsLgorICAgKiAgICgxKSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHVzaW5nIGEgcmFuZ2VkIGhhc2ggZnVuY3Rpb24gYW5kIHVzaW5nCisgICAqICAgICAgIHRoZSBjb21iaW5hdGlvbiBvZiBhIGhhc2ggZnVuY3Rpb24gYW5kIGEgcmFuZ2UtaGFzaGluZyBmdW5jdGlvbi4KKyAgICogICAgICAgSW4gdGhlIGZvcm1lciBjYXNlIHdlIGRvbid0IGhhdmUgc3VjaCB0aGluZ3MgYXMgaGFzaCBjb2Rlcywgc28KKyAgICogICAgICAgd2UgaGF2ZSBhIGR1bW15IHR5cGUgYXMgcGxhY2Vob2xkZXIuCisgICAqICAgKDIpIFdoZXRoZXIgb3Igbm90IHdlIGNhY2hlIGhhc2ggY29kZXMuICBDYWNoaW5nIGhhc2ggY29kZXMgaXMKKyAgICogICAgICAgbWVhbmluZ2xlc3MgaWYgd2UgaGF2ZSBhIHJhbmdlZCBoYXNoIGZ1bmN0aW9uLgorICAgKgorICAgKiAgV2UgYWxzbyBwdXQgdGhlIGtleSBleHRyYWN0aW9uIG9iamVjdHMgaGVyZSwgZm9yIGNvbnZlbmllbmNlLgorICAgKiAgRWFjaCBzcGVjaWFsaXphdGlvbiBkZXJpdmVzIGZyb20gb25lIG9yIG1vcmUgb2YgdGhlIHRlbXBsYXRlCisgICAqICBwYXJhbWV0ZXJzIHRvIGJlbmVmaXQgZnJvbSBFYm8uIFRoaXMgaXMgaW1wb3J0YW50IGFzIHRoaXMgdHlwZQorICAgKiAgaXMgaW5oZXJpdGVkIGluIHNvbWUgY2FzZXMgYnkgdGhlIF9Mb2NhbF9pdGVyYXRvcl9iYXNlIHR5cGUgdXNlZAorICAgKiAgdG8gaW1wbGVtZW50IGxvY2FsX2l0ZXJhdG9yIGFuZCBjb25zdF9sb2NhbF9pdGVyYXRvci4gQXMgd2l0aAorICAgKiAgYW55IGl0ZXJhdG9yIHR5cGUgd2UgcHJlZmVyIHRvIG1ha2UgaXQgYXMgc21hbGwgYXMgcG9zc2libGUuCisgICAqCisgICAqICBQcmltYXJ5IHRlbXBsYXRlIGlzIHVudXNlZCBleGNlcHQgYXMgYSBob29rIGZvciBzcGVjaWFsaXphdGlvbnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIHN0cnVjdCBfSGFzaF9jb2RlX2Jhc2U7CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uOiByYW5nZWQgaGFzaCBmdW5jdGlvbiwgbm8gY2FjaGluZyBoYXNoIGNvZGVzLiAgSDEKKyAgLy8vIGFuZCBIMiBhcmUgcHJvdmlkZWQgYnV0IGlnbm9yZWQuICBXZSBkZWZpbmUgYSBkdW1teSBoYXNoIGNvZGUgdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2g+CisgICAgc3RydWN0IF9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfSDEsIF9IMiwgX0hhc2gsIGZhbHNlPgorICAgIDogcHJpdmF0ZSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MCwgX0V4dHJhY3RLZXk+LAorICAgICAgcHJpdmF0ZSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MSwgX0hhc2g+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB1c2luZyBfX2Vib19leHRyYWN0X2tleSA9IF9IYXNodGFibGVfZWJvX2hlbHBlcjwwLCBfRXh0cmFjdEtleT47CisgICAgICB1c2luZyBfX2Vib19oYXNoID0gX0hhc2h0YWJsZV9lYm9faGVscGVyPDEsIF9IYXNoPjsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdm9pZCogCQkJCQlfX2hhc2hfY29kZTsKKyAgICAgIHR5cGVkZWYgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPgkJCV9fbm9kZV90eXBlOworCisgICAgICAvLyBXZSBuZWVkIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciB0aGUgbG9jYWwgaXRlcmF0b3JzLgorICAgICAgX0hhc2hfY29kZV9iYXNlKCkgPSBkZWZhdWx0OworCisgICAgICBfSGFzaF9jb2RlX2Jhc2UoY29uc3QgX0V4dHJhY3RLZXkmIF9fZXgsIGNvbnN0IF9IMSYsIGNvbnN0IF9IMiYsCisJCSAgICAgIGNvbnN0IF9IYXNoJiBfX2gpCisgICAgICA6IF9fZWJvX2V4dHJhY3Rfa2V5KF9fZXgpLCBfX2Vib19oYXNoKF9faCkgeyB9CisKKyAgICAgIF9faGFzaF9jb2RlCisgICAgICBfTV9oYXNoX2NvZGUoY29uc3QgX0tleSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAgICBfTV9idWNrZXRfaW5kZXgoY29uc3QgX0tleSYgX19rLCBfX2hhc2hfY29kZSwgc3RkOjpzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmFuZ2VkX2hhc2goKShfX2ssIF9fbik7IH0KKworICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfX25vZGVfdHlwZSogX19wLCBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9yYW5nZWRfaGFzaCgpKF9NX2V4dHJhY3QoKShfX3AtPl9NX3YpLCBfX24pOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N0b3JlX2NvZGUoX19ub2RlX3R5cGUqLCBfX2hhc2hfY29kZSkgY29uc3QKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jb3B5X2NvZGUoX19ub2RlX3R5cGUqLCBjb25zdCBfX25vZGVfdHlwZSopIGNvbnN0CisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc3dhcChfSGFzaF9jb2RlX2Jhc2UmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fZXh0cmFjdCgpLCBfX3guX01fZXh0cmFjdCgpKTsKKwlzdGQ6OnN3YXAoX01fcmFuZ2VkX2hhc2goKSwgX194Ll9NX3JhbmdlZF9oYXNoKCkpOworICAgICAgfQorCisgICAgICBjb25zdCBfRXh0cmFjdEtleSYKKyAgICAgIF9NX2V4dHJhY3QoKSBjb25zdCB7IHJldHVybiBfX2Vib19leHRyYWN0X2tleTo6X1NfY2dldCgqdGhpcyk7IH0KKworICAgICAgX0V4dHJhY3RLZXkmCisgICAgICBfTV9leHRyYWN0KCkgeyByZXR1cm4gX19lYm9fZXh0cmFjdF9rZXk6Ol9TX2dldCgqdGhpcyk7IH0KKworICAgICAgY29uc3QgX0hhc2gmCisgICAgICBfTV9yYW5nZWRfaGFzaCgpIGNvbnN0IHsgcmV0dXJuIF9fZWJvX2hhc2g6Ol9TX2NnZXQoKnRoaXMpOyB9CisKKyAgICAgIF9IYXNoJgorICAgICAgX01fcmFuZ2VkX2hhc2goKSB7IHJldHVybiBfX2Vib19oYXNoOjpfU19nZXQoKnRoaXMpOyB9CisgICAgfTsKKworICAvLyBObyBzcGVjaWFsaXphdGlvbiBmb3IgcmFuZ2VkIGhhc2ggZnVuY3Rpb24gd2hpbGUgY2FjaGluZyBoYXNoIGNvZGVzLgorICAvLyBUaGF0IGNvbWJpbmF0aW9uIGlzIG1lYW5pbmdsZXNzLCBhbmQgdHJ5aW5nIHRvIGRvIGl0IGlzIGFuIGVycm9yLgorCisgIC8vLyBTcGVjaWFsaXphdGlvbjogcmFuZ2VkIGhhc2ggZnVuY3Rpb24sIGNhY2hlIGhhc2ggY29kZXMuICBUaGlzCisgIC8vLyBjb21iaW5hdGlvbiBpcyBtZWFuaW5nbGVzcywgc28gd2UgcHJvdmlkZSBvbmx5IGEgZGVjbGFyYXRpb24KKyAgLy8vIGFuZCBubyBkZWZpbml0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaD4KKyAgICBzdHJ1Y3QgX0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9IMSwgX0gyLCBfSGFzaCwgdHJ1ZT47CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uOiBoYXNoIGZ1bmN0aW9uIGFuZCByYW5nZS1oYXNoaW5nIGZ1bmN0aW9uLCBubworICAvLy8gY2FjaGluZyBvZiBoYXNoIGNvZGVzLgorICAvLy8gUHJvdmlkZXMgdHlwZWRlZiBhbmQgYWNjZXNzb3IgcmVxdWlyZWQgYnkgQysrIDExLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyPgorICAgIHN0cnVjdCBfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0gxLCBfSDIsCisJCQkgICBfRGVmYXVsdF9yYW5nZWRfaGFzaCwgZmFsc2U+CisgICAgOiBwcml2YXRlIF9IYXNodGFibGVfZWJvX2hlbHBlcjwwLCBfRXh0cmFjdEtleT4sCisgICAgICBwcml2YXRlIF9IYXNodGFibGVfZWJvX2hlbHBlcjwxLCBfSDE+LAorICAgICAgcHJpdmF0ZSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MiwgX0gyPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdXNpbmcgX19lYm9fZXh0cmFjdF9rZXkgPSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MCwgX0V4dHJhY3RLZXk+OworICAgICAgdXNpbmcgX19lYm9faDEgPSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MSwgX0gxPjsKKyAgICAgIHVzaW5nIF9fZWJvX2gyID0gX0hhc2h0YWJsZV9lYm9faGVscGVyPDIsIF9IMj47CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9IMSAJCQkJCWhhc2hlcjsKKworICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0aW9uKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gxKCk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgCQkJCV9faGFzaF9jb2RlOworICAgICAgdHlwZWRlZiBfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+CQkJX19ub2RlX3R5cGU7CisKKyAgICAgIC8vIFdlIG5lZWQgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIHRoZSBsb2NhbCBpdGVyYXRvcnMuCisgICAgICBfSGFzaF9jb2RlX2Jhc2UoKSA9IGRlZmF1bHQ7CisKKyAgICAgIF9IYXNoX2NvZGVfYmFzZShjb25zdCBfRXh0cmFjdEtleSYgX19leCwKKwkJICAgICAgY29uc3QgX0gxJiBfX2gxLCBjb25zdCBfSDImIF9faDIsCisJCSAgICAgIGNvbnN0IF9EZWZhdWx0X3JhbmdlZF9oYXNoJikKKyAgICAgIDogX19lYm9fZXh0cmFjdF9rZXkoX19leCksIF9fZWJvX2gxKF9faDEpLCBfX2Vib19oMihfX2gyKSB7IH0KKworICAgICAgX19oYXNoX2NvZGUKKyAgICAgIF9NX2hhc2hfY29kZShjb25zdCBfS2V5JiBfX2spIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMSgpKF9fayk7IH0KKworICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfS2V5JiwgX19oYXNoX2NvZGUgX19jLCBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMigpKF9fYywgX19uKTsgfQorCisgICAgICBzdGQ6OnNpemVfdAorICAgICAgX01fYnVja2V0X2luZGV4KGNvbnN0IF9fbm9kZV90eXBlKiBfX3AsCisJCSAgICAgIHN0ZDo6c2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gyKCkoX01faDEoKShfTV9leHRyYWN0KCkoX19wLT5fTV92KSksIF9fbik7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc3RvcmVfY29kZShfX25vZGVfdHlwZSosIF9faGFzaF9jb2RlKSBjb25zdAorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NvcHlfY29kZShfX25vZGVfdHlwZSosIGNvbnN0IF9fbm9kZV90eXBlKikgY29uc3QKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9IYXNoX2NvZGVfYmFzZSYgX194KQorICAgICAgeworCXN0ZDo6c3dhcChfTV9leHRyYWN0KCksIF9feC5fTV9leHRyYWN0KCkpOworCXN0ZDo6c3dhcChfTV9oMSgpLCBfX3guX01faDEoKSk7CisJc3RkOjpzd2FwKF9NX2gyKCksIF9feC5fTV9oMigpKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgX0V4dHJhY3RLZXkmCisgICAgICBfTV9leHRyYWN0KCkgY29uc3QgeyByZXR1cm4gX19lYm9fZXh0cmFjdF9rZXk6Ol9TX2NnZXQoKnRoaXMpOyB9CisKKyAgICAgIF9FeHRyYWN0S2V5JgorICAgICAgX01fZXh0cmFjdCgpIHsgcmV0dXJuIF9fZWJvX2V4dHJhY3Rfa2V5OjpfU19nZXQoKnRoaXMpOyB9CisKKyAgICAgIGNvbnN0IF9IMSYKKyAgICAgIF9NX2gxKCkgY29uc3QgeyByZXR1cm4gX19lYm9faDE6Ol9TX2NnZXQoKnRoaXMpOyB9CisKKyAgICAgIF9IMSYKKyAgICAgIF9NX2gxKCkgeyByZXR1cm4gX19lYm9faDE6Ol9TX2dldCgqdGhpcyk7IH0KKworICAgICAgY29uc3QgX0gyJgorICAgICAgX01faDIoKSBjb25zdCB7IHJldHVybiBfX2Vib19oMjo6X1NfY2dldCgqdGhpcyk7IH0KKworICAgICAgX0gyJgorICAgICAgX01faDIoKSB7IHJldHVybiBfX2Vib19oMjo6X1NfZ2V0KCp0aGlzKTsgfQorICAgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uOiBoYXNoIGZ1bmN0aW9uIGFuZCByYW5nZS1oYXNoaW5nIGZ1bmN0aW9uLAorICAvLy8gY2FjaGluZyBoYXNoIGNvZGVzLiAgSCBpcyBwcm92aWRlZCBidXQgaWdub3JlZC4gIFByb3ZpZGVzCisgIC8vLyB0eXBlZGVmIGFuZCBhY2Nlc3NvciByZXF1aXJlZCBieSBDKysgMTEuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0V4dHJhY3RLZXksCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDI+CisgICAgc3RydWN0IF9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfSDEsIF9IMiwKKwkJCSAgIF9EZWZhdWx0X3JhbmdlZF9oYXNoLCB0cnVlPgorICAgIDogcHJpdmF0ZSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MCwgX0V4dHJhY3RLZXk+LAorICAgICAgcHJpdmF0ZSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MSwgX0gxPiwKKyAgICAgIHByaXZhdGUgX0hhc2h0YWJsZV9lYm9faGVscGVyPDIsIF9IMj4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIC8vIEdpdmVzIGFjY2VzcyB0byBfTV9oMigpIHRvIHRoZSBsb2NhbCBpdGVyYXRvciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgIGZyaWVuZCBzdHJ1Y3QgX0xvY2FsX2l0ZXJhdG9yX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0gxLCBfSDIsCisJCQkJCSBfRGVmYXVsdF9yYW5nZWRfaGFzaCwgdHJ1ZT47CisKKyAgICAgIHVzaW5nIF9fZWJvX2V4dHJhY3Rfa2V5ID0gX0hhc2h0YWJsZV9lYm9faGVscGVyPDAsIF9FeHRyYWN0S2V5PjsKKyAgICAgIHVzaW5nIF9fZWJvX2gxID0gX0hhc2h0YWJsZV9lYm9faGVscGVyPDEsIF9IMT47CisgICAgICB1c2luZyBfX2Vib19oMiA9IF9IYXNodGFibGVfZWJvX2hlbHBlcjwyLCBfSDI+OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfSDEgCQkJCQloYXNoZXI7CisKKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdGlvbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMSgpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IAkJCQlfX2hhc2hfY29kZTsKKyAgICAgIHR5cGVkZWYgX0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+CQkJX19ub2RlX3R5cGU7CisKKyAgICAgIF9IYXNoX2NvZGVfYmFzZShjb25zdCBfRXh0cmFjdEtleSYgX19leCwKKwkJICAgICAgY29uc3QgX0gxJiBfX2gxLCBjb25zdCBfSDImIF9faDIsCisJCSAgICAgIGNvbnN0IF9EZWZhdWx0X3JhbmdlZF9oYXNoJikKKyAgICAgIDogX19lYm9fZXh0cmFjdF9rZXkoX19leCksIF9fZWJvX2gxKF9faDEpLCBfX2Vib19oMihfX2gyKSB7IH0KKworICAgICAgX19oYXNoX2NvZGUKKyAgICAgIF9NX2hhc2hfY29kZShjb25zdCBfS2V5JiBfX2spIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMSgpKF9fayk7IH0KKworICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfS2V5JiwgX19oYXNoX2NvZGUgX19jLAorCQkgICAgICBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMigpKF9fYywgX19uKTsgfQorCisgICAgICBzdGQ6OnNpemVfdAorICAgICAgX01fYnVja2V0X2luZGV4KGNvbnN0IF9fbm9kZV90eXBlKiBfX3AsIHN0ZDo6c2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gyKCkoX19wLT5fTV9oYXNoX2NvZGUsIF9fbik7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc3RvcmVfY29kZShfX25vZGVfdHlwZSogX19uLCBfX2hhc2hfY29kZSBfX2MpIGNvbnN0CisgICAgICB7IF9fbi0+X01faGFzaF9jb2RlID0gX19jOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NvcHlfY29kZShfX25vZGVfdHlwZSogX190bywgY29uc3QgX19ub2RlX3R5cGUqIF9fZnJvbSkgY29uc3QKKyAgICAgIHsgX190by0+X01faGFzaF9jb2RlID0gX19mcm9tLT5fTV9oYXNoX2NvZGU7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc3dhcChfSGFzaF9jb2RlX2Jhc2UmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fZXh0cmFjdCgpLCBfX3guX01fZXh0cmFjdCgpKTsKKwlzdGQ6OnN3YXAoX01faDEoKSwgX194Ll9NX2gxKCkpOworCXN0ZDo6c3dhcChfTV9oMigpLCBfX3guX01faDIoKSk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IF9FeHRyYWN0S2V5JgorICAgICAgX01fZXh0cmFjdCgpIGNvbnN0IHsgcmV0dXJuIF9fZWJvX2V4dHJhY3Rfa2V5OjpfU19jZ2V0KCp0aGlzKTsgfQorCisgICAgICBfRXh0cmFjdEtleSYKKyAgICAgIF9NX2V4dHJhY3QoKSB7IHJldHVybiBfX2Vib19leHRyYWN0X2tleTo6X1NfZ2V0KCp0aGlzKTsgfQorCisgICAgICBjb25zdCBfSDEmCisgICAgICBfTV9oMSgpIGNvbnN0IHsgcmV0dXJuIF9fZWJvX2gxOjpfU19jZ2V0KCp0aGlzKTsgfQorCisgICAgICBfSDEmCisgICAgICBfTV9oMSgpIHsgcmV0dXJuIF9fZWJvX2gxOjpfU19nZXQoKnRoaXMpOyB9CisKKyAgICAgIGNvbnN0IF9IMiYKKyAgICAgIF9NX2gyKCkgY29uc3QgeyByZXR1cm4gX19lYm9faDI6Ol9TX2NnZXQoKnRoaXMpOyB9CisKKyAgICAgIF9IMiYKKyAgICAgIF9NX2gyKCkgeyByZXR1cm4gX19lYm9faDI6Ol9TX2dldCgqdGhpcyk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBfRXF1YWxfaGVscGVyLgorICAgKgorICAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0V4dHJhY3RLZXksCisJICAgIHR5cGVuYW1lIF9FcXVhbCwgdHlwZW5hbWUgX0hhc2hDb2RlVHlwZSwKKwkgICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZT4KKyAgc3RydWN0IF9FcXVhbF9oZWxwZXI7CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgIHR5cGVuYW1lIF9FcXVhbCwgdHlwZW5hbWUgX0hhc2hDb2RlVHlwZT4KKyAgc3RydWN0IF9FcXVhbF9oZWxwZXI8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSGFzaENvZGVUeXBlLCB0cnVlPgorICB7CisgICAgc3RhdGljIGJvb2wKKyAgICBfU19lcXVhbHMoY29uc3QgX0VxdWFsJiBfX2VxLCBjb25zdCBfRXh0cmFjdEtleSYgX19leHRyYWN0LAorCSAgICAgIGNvbnN0IF9LZXkmIF9faywgX0hhc2hDb2RlVHlwZSBfX2MsIF9IYXNoX25vZGU8X1ZhbHVlLCB0cnVlPiogX19uKQorICAgIHsgcmV0dXJuIF9fYyA9PSBfX24tPl9NX2hhc2hfY29kZSAmJiBfX2VxKF9faywgX19leHRyYWN0KF9fbi0+X01fdikpOyB9CisgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgIHR5cGVuYW1lIF9FcXVhbCwgdHlwZW5hbWUgX0hhc2hDb2RlVHlwZT4KKyAgc3RydWN0IF9FcXVhbF9oZWxwZXI8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSGFzaENvZGVUeXBlLCBmYWxzZT4KKyAgeworICAgIHN0YXRpYyBib29sCisgICAgX1NfZXF1YWxzKGNvbnN0IF9FcXVhbCYgX19lcSwgY29uc3QgX0V4dHJhY3RLZXkmIF9fZXh0cmFjdCwKKwkgICAgICBjb25zdCBfS2V5JiBfX2ssIF9IYXNoQ29kZVR5cGUsIF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qIF9fbikKKyAgICB7IHJldHVybiBfX2VxKF9faywgX19leHRyYWN0KF9fbi0+X01fdikpOyB9CisgIH07CisKKworICAvLy8gU3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0V4dHJhY3RLZXksCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoPgorICAgIHN0cnVjdCBfTG9jYWxfaXRlcmF0b3JfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LAorCQkJCV9IMSwgX0gyLCBfSGFzaCwgdHJ1ZT4KKyAgICA6IHByaXZhdGUgX0hhc2h0YWJsZV9lYm9faGVscGVyPDAsIF9IMj4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdXNpbmcgX19iYXNlX3R5cGUgPSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MCwgX0gyPjsKKyAgICAgIHVzaW5nIF9faGFzaF9jb2RlX2Jhc2UgPSBfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwKKwkJCQkJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgdHJ1ZT47CisKKyAgICBwdWJsaWM6CisgICAgICBfTG9jYWxfaXRlcmF0b3JfYmFzZSgpID0gZGVmYXVsdDsKKyAgICAgIF9Mb2NhbF9pdGVyYXRvcl9iYXNlKGNvbnN0IF9faGFzaF9jb2RlX2Jhc2UmIF9fYmFzZSwKKwkJCSAgIF9IYXNoX25vZGU8X1ZhbHVlLCB0cnVlPiogX19wLAorCQkJICAgc3RkOjpzaXplX3QgX19ia3QsIHN0ZDo6c2l6ZV90IF9fYmt0X2NvdW50KQorICAgICAgOiBfX2Jhc2VfdHlwZShfX2Jhc2UuX01faDIoKSksCisJX01fY3VyKF9fcCksIF9NX2J1Y2tldChfX2JrdCksIF9NX2J1Y2tldF9jb3VudChfX2JrdF9jb3VudCkgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luY3IoKQorICAgICAgeworCV9NX2N1ciA9IF9NX2N1ci0+X01fbmV4dCgpOworCWlmIChfTV9jdXIpCisJICB7CisJICAgIHN0ZDo6c2l6ZV90IF9fYmt0CisJICAgICAgPSBfX2Jhc2VfdHlwZTo6X1NfZ2V0KCp0aGlzKShfTV9jdXItPl9NX2hhc2hfY29kZSwKKwkJCQkJICAgX01fYnVja2V0X2NvdW50KTsKKwkgICAgaWYgKF9fYmt0ICE9IF9NX2J1Y2tldCkKKwkgICAgICBfTV9jdXIgPSBudWxscHRyOworCSAgfQorICAgICAgfQorCisgICAgICBfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4qICBfTV9jdXI7CisgICAgICBzdGQ6OnNpemVfdCBfTV9idWNrZXQ7CisgICAgICBzdGQ6OnNpemVfdCBfTV9idWNrZXRfY291bnQ7CisgICAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0V4dHJhY3RLZXksCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoPgorICAgIHN0cnVjdCBfTG9jYWxfaXRlcmF0b3JfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LAorCQkJCV9IMSwgX0gyLCBfSGFzaCwgZmFsc2U+CisgICAgOiBwcml2YXRlIF9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LAorCQkJICAgICAgX0gxLCBfSDIsIF9IYXNoLCBmYWxzZT4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdXNpbmcgX19oYXNoX2NvZGVfYmFzZSA9IF9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LAorCQkJCQkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBmYWxzZT47CisKKyAgICBwdWJsaWM6CisgICAgICBfTG9jYWxfaXRlcmF0b3JfYmFzZSgpID0gZGVmYXVsdDsKKyAgICAgIF9Mb2NhbF9pdGVyYXRvcl9iYXNlKGNvbnN0IF9faGFzaF9jb2RlX2Jhc2UmIF9fYmFzZSwKKwkJCSAgIF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qIF9fcCwKKwkJCSAgIHN0ZDo6c2l6ZV90IF9fYmt0LCBzdGQ6OnNpemVfdCBfX2JrdF9jb3VudCkKKwk6IF9faGFzaF9jb2RlX2Jhc2UoX19iYXNlKSwKKwkgIF9NX2N1cihfX3ApLCBfTV9idWNrZXQoX19ia3QpLCBfTV9idWNrZXRfY291bnQoX19ia3RfY291bnQpIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbmNyKCkKKyAgICAgIHsKKwlfTV9jdXIgPSBfTV9jdXItPl9NX25leHQoKTsKKwlpZiAoX01fY3VyKQorCSAgeworCSAgICBzdGQ6OnNpemVfdCBfX2JrdCA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfTV9jdXIsIF9NX2J1Y2tldF9jb3VudCk7CisJICAgIGlmIChfX2JrdCAhPSBfTV9idWNrZXQpCisJICAgICAgX01fY3VyID0gbnVsbHB0cjsKKwkgIH0KKyAgICAgIH0KKworICAgICAgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiogIF9NX2N1cjsKKyAgICAgIHN0ZDo6c2l6ZV90IF9NX2J1Y2tldDsKKyAgICAgIHN0ZDo6c2l6ZV90IF9NX2J1Y2tldF9jb3VudDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0V4dHJhY3RLZXksCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCBib29sIF9fY2FjaGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Mb2NhbF9pdGVyYXRvcl9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksCisJCQkJCSAgX0gxLCBfSDIsIF9IYXNoLCBfX2NhY2hlPiYgX194LAorCSAgICAgICBjb25zdCBfTG9jYWxfaXRlcmF0b3JfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LAorCQkJCQkgIF9IMSwgX0gyLCBfSGFzaCwgX19jYWNoZT4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fY3VyID09IF9feS5fTV9jdXI7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgYm9vbCBfX2NhY2hlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfTG9jYWxfaXRlcmF0b3JfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LAorCQkJCQkgIF9IMSwgX0gyLCBfSGFzaCwgX19jYWNoZT4mIF9feCwKKwkgICAgICAgY29uc3QgX0xvY2FsX2l0ZXJhdG9yX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwKKwkJCQkJICBfSDEsIF9IMiwgX0hhc2gsIF9fY2FjaGU+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2N1ciAhPSBfX3kuX01fY3VyOyB9CisKKyAgLy8vIGxvY2FsIGl0ZXJhdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICBib29sIF9fY29uc3RhbnRfaXRlcmF0b3JzLCBib29sIF9fY2FjaGU+CisgICAgc3RydWN0IF9Mb2NhbF9pdGVyYXRvcgorICAgIDogcHVibGljIF9Mb2NhbF9pdGVyYXRvcl9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksCisJCQkJICBfSDEsIF9IMiwgX0hhc2gsIF9fY2FjaGU+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZSA9IF9Mb2NhbF9pdGVyYXRvcl9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksCisJCQkJCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9fY2FjaGU+OworICAgICAgdXNpbmcgX19oYXNoX2NvZGVfYmFzZSA9IHR5cGVuYW1lIF9fYmFzZV90eXBlOjpfX2hhc2hfY29kZV9iYXNlOworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCQljb25zdCBfVmFsdWUqLCBfVmFsdWUqPjo6dHlwZQorCQkJCQkJICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8X19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJCWNvbnN0IF9WYWx1ZSYsIF9WYWx1ZSY+Ojp0eXBlCisJCQkJCQkgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgX0xvY2FsX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgICBfTG9jYWxfaXRlcmF0b3IoY29uc3QgX19oYXNoX2NvZGVfYmFzZSYgX19iYXNlLAorCQkgICAgICBfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCwKKwkJICAgICAgc3RkOjpzaXplX3QgX19ia3QsIHN0ZDo6c2l6ZV90IF9fYmt0X2NvdW50KQorCTogX19iYXNlX3R5cGUoX19iYXNlLCBfX3AsIF9fYmt0LCBfX2JrdF9jb3VudCkKKyAgICAgIHsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9jdXItPl9NX3Y7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHRoaXMtPl9NX2N1ci0+X01fdik7IH0KKworICAgICAgX0xvY2FsX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0xvY2FsX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfTG9jYWxfaXRlcmF0b3IgX190bXAoKnRoaXMpOworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAgfTsKKworICAvLy8gbG9jYWwgY29uc3RfaXRlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0V4dHJhY3RLZXksCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIGJvb2wgX19jb25zdGFudF9pdGVyYXRvcnMsIGJvb2wgX19jYWNoZT4KKyAgICBzdHJ1Y3QgX0xvY2FsX2NvbnN0X2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgX0xvY2FsX2l0ZXJhdG9yX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwKKwkJCQkgIF9IMSwgX0gyLCBfSGFzaCwgX19jYWNoZT4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlID0gX0xvY2FsX2l0ZXJhdG9yX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwKKwkJCQkJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX19jYWNoZT47CisgICAgICB1c2luZyBfX2hhc2hfY29kZV9iYXNlID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9faGFzaF9jb2RlX2Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1ZhbHVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVmFsdWUmICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIF9Mb2NhbF9jb25zdF9pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgICAgX0xvY2FsX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9faGFzaF9jb2RlX2Jhc2UmIF9fYmFzZSwKKwkJCSAgICBfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCwKKwkJCSAgICBzdGQ6OnNpemVfdCBfX2JrdCwgc3RkOjpzaXplX3QgX19ia3RfY291bnQpCisJOiBfX2Jhc2VfdHlwZShfX2Jhc2UsIF9fcCwgX19ia3QsIF9fYmt0X2NvdW50KQorICAgICAgeyB9CisKKyAgICAgIF9Mb2NhbF9jb25zdF9pdGVyYXRvcihjb25zdCBfTG9jYWxfaXRlcmF0b3I8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwKKwkJCQkJCSAgX0gxLCBfSDIsIF9IYXNoLAorCQkJCQkJICBfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkJCSAgX19jYWNoZT4mIF9feCkKKwk6IF9fYmFzZV90eXBlKF9feCkKKyAgICAgIHsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9jdXItPl9NX3Y7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHRoaXMtPl9NX2N1ci0+X01fdik7IH0KKworICAgICAgX0xvY2FsX2NvbnN0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0xvY2FsX2NvbnN0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfTG9jYWxfY29uc3RfaXRlcmF0b3IgX190bXAoKnRoaXMpOworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAgfTsKKworICAvKioKKyAgICogIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZV9iYXNlLgorICAgKgorICAgKiAgSGVscGVyIGNsYXNzIGFkZGluZyBtYW5hZ2VtZW50IG9mIF9FcXVhbCBmdW5jdG9yIHRvCisgICAqICBfSGFzaF9jb2RlX2Jhc2UgdHlwZS4KKyAgICoKKyAgICogIEJhc2UgY2xhc3MgdGVtcGxhdGVzIGFyZToKKyAgICogICAgLSBfX2RldGFpbDo6X0hhc2hfY29kZV9iYXNlCisgICAqICAgIC0gX19kZXRhaWw6Ol9IYXNodGFibGVfZWJvX2hlbHBlcgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfVHJhaXRzPgorICBzdHJ1Y3QgX0hhc2h0YWJsZV9iYXNlCisgIDogcHVibGljIF9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfSDEsIF9IMiwgX0hhc2gsCisJCQkgICBfVHJhaXRzOjpfX2hhc2hfY2FjaGVkOjp2YWx1ZT4sCisgICAgcHJpdmF0ZSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MCwgX0VxdWFsPgorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICB0eXBlZGVmIF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX0VxdWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9lcXVhbDsKKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgdXNpbmcgX190cmFpdHNfdHlwZSA9IF9UcmFpdHM7CisgICAgdXNpbmcgX19oYXNoX2NhY2hlZCA9IHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6Ol9faGFzaF9jYWNoZWQ7CisgICAgdXNpbmcgX19jb25zdGFudF9pdGVyYXRvcnMgPSB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpfX2NvbnN0YW50X2l0ZXJhdG9yczsKKyAgICB1c2luZyBfX3VuaXF1ZV9rZXlzID0gdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6X191bmlxdWVfa2V5czsKKworICAgIHVzaW5nIF9faGFzaF9jb2RlX2Jhc2UgPSBfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwKKwkJCQkJICAgICBfSDEsIF9IMiwgX0hhc2gsCisJCQkJCSAgICAgX19oYXNoX2NhY2hlZDo6dmFsdWU+OworCisgICAgdXNpbmcgX19oYXNoX2NvZGUgPSB0eXBlbmFtZSBfX2hhc2hfY29kZV9iYXNlOjpfX2hhc2hfY29kZTsKKyAgICB1c2luZyBfX25vZGVfdHlwZSA9IHR5cGVuYW1lIF9faGFzaF9jb2RlX2Jhc2U6Ol9fbm9kZV90eXBlOworCisgICAgdXNpbmcgaXRlcmF0b3IgPSBfX2RldGFpbDo6X05vZGVfaXRlcmF0b3I8dmFsdWVfdHlwZSwKKwkJCQkJICAgICAgX19jb25zdGFudF9pdGVyYXRvcnM6OnZhbHVlLAorCQkJCQkgICAgICBfX2hhc2hfY2FjaGVkOjp2YWx1ZT47CisKKyAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9IF9fZGV0YWlsOjpfTm9kZV9jb25zdF9pdGVyYXRvcjx2YWx1ZV90eXBlLAorCQkJCQkJICAgX19jb25zdGFudF9pdGVyYXRvcnM6OnZhbHVlLAorCQkJCQkJICAgX19oYXNoX2NhY2hlZDo6dmFsdWU+OworCisgICAgdXNpbmcgbG9jYWxfaXRlcmF0b3IgPSBfX2RldGFpbDo6X0xvY2FsX2l0ZXJhdG9yPGtleV90eXBlLCB2YWx1ZV90eXBlLAorCQkJCQkJICBfRXh0cmFjdEtleSwgX0gxLCBfSDIsIF9IYXNoLAorCQkJCQkJICBfX2NvbnN0YW50X2l0ZXJhdG9yczo6dmFsdWUsCisJCQkJCQkgICAgIF9faGFzaF9jYWNoZWQ6OnZhbHVlPjsKKworICAgIHVzaW5nIGNvbnN0X2xvY2FsX2l0ZXJhdG9yID0gX19kZXRhaWw6Ol9Mb2NhbF9jb25zdF9pdGVyYXRvcjxrZXlfdHlwZSwKKwkJCQkJCQkJIHZhbHVlX3R5cGUsCisJCQkJCV9FeHRyYWN0S2V5LCBfSDEsIF9IMiwgX0hhc2gsCisJCQkJCV9fY29uc3RhbnRfaXRlcmF0b3JzOjp2YWx1ZSwKKwkJCQkJX19oYXNoX2NhY2hlZDo6dmFsdWU+OworCisgICAgdXNpbmcgX19pcmV0dXJuX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPF9fdW5pcXVlX2tleXM6OnZhbHVlLAorCQkJCQkJICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+LAorCQkJCQkJICAgICBpdGVyYXRvcj46OnR5cGU7CisKKyAgICB1c2luZyBfX2ljb252X3R5cGUgPSB0eXBlbmFtZSAgc3RkOjpjb25kaXRpb25hbDxfX3VuaXF1ZV9rZXlzOjp2YWx1ZSwKKwkJCQkJCSAgICBfU2VsZWN0MXN0LCBfSWRlbnRpdHkKKwkJCQkJCSAgICA+Ojp0eXBlOworICBwcml2YXRlOgorICAgIHVzaW5nIF9FcXVhbEVCTyA9IF9IYXNodGFibGVfZWJvX2hlbHBlcjwwLCBfRXF1YWw+OworICAgIHVzaW5nIF9FcXVhbEhlbHBlciA9ICBfRXF1YWxfaGVscGVyPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCQkJX19oYXNoX2NvZGUsIF9faGFzaF9jYWNoZWQ6OnZhbHVlPjsKKworICBwcm90ZWN0ZWQ6CisgICAgdXNpbmcgX19ub2RlX2Jhc2UgPSBfX2RldGFpbDo6X0hhc2hfbm9kZV9iYXNlOworICAgIHVzaW5nIF9fYnVja2V0X3R5cGUgPSBfX25vZGVfYmFzZSo7CisKKyAgICBfSGFzaHRhYmxlX2Jhc2UoY29uc3QgX0V4dHJhY3RLZXkmIF9fZXgsIGNvbnN0IF9IMSYgX19oMSwgY29uc3QgX0gyJiBfX2gyLAorCQkgICAgY29uc3QgX0hhc2gmIF9faGFzaCwgY29uc3QgX0VxdWFsJiBfX2VxKQorICAgIDogX19oYXNoX2NvZGVfYmFzZShfX2V4LCBfX2gxLCBfX2gyLCBfX2hhc2gpLCBfRXF1YWxFQk8oX19lcSkKKyAgICB7IH0KKworICAgIGJvb2wKKyAgICBfTV9lcXVhbHMoY29uc3QgX0tleSYgX19rLCBfX2hhc2hfY29kZSBfX2MsIF9fbm9kZV90eXBlKiBfX24pIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIF9FcXVhbEhlbHBlcjo6X1NfZXF1YWxzKF9NX2VxKCksIHRoaXMtPl9NX2V4dHJhY3QoKSwKKwkJCQkgICAgIF9faywgX19jLCBfX24pOworICAgIH0KKworICAgIHZvaWQKKyAgICBfTV9zd2FwKF9IYXNodGFibGVfYmFzZSYgX194KQorICAgIHsKKyAgICAgIF9faGFzaF9jb2RlX2Jhc2U6Ol9NX3N3YXAoX194KTsKKyAgICAgIHN0ZDo6c3dhcChfTV9lcSgpLCBfX3guX01fZXEoKSk7CisgICAgfQorCisgICAgY29uc3QgX0VxdWFsJgorICAgIF9NX2VxKCkgY29uc3QgeyByZXR1cm4gX0VxdWFsRUJPOjpfU19jZ2V0KCp0aGlzKTsgfQorCisgICAgX0VxdWFsJgorICAgIF9NX2VxKCkgeyByZXR1cm4gX0VxdWFsRUJPOjpfU19nZXQoKnRoaXMpOyB9CisgIH07CisKKyAgLyoqCisgICAqICBzdHJ1Y3QgX0VxdWFsaXR5X2Jhc2UuCisgICAqCisgICAqICBDb21tb24gdHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3IgY2xhc3MgX0VxdWFsaXR5LgorICAgKi8KKyAgc3RydWN0IF9FcXVhbGl0eV9iYXNlCisgIHsKKyAgcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VaXRlcmF0b3I+CisgICAgICBzdGF0aWMgYm9vbAorICAgICAgX1NfaXNfcGVybXV0YXRpb24oX1VpdGVyYXRvciwgX1VpdGVyYXRvciwgX1VpdGVyYXRvcik7CisgIH07CisKKyAgLy8gU2VlIHN0ZDo6aXNfcGVybXV0YXRpb24gaW4gTjMwNjguCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VaXRlcmF0b3I+CisgICAgYm9vbAorICAgIF9FcXVhbGl0eV9iYXNlOjoKKyAgICBfU19pc19wZXJtdXRhdGlvbihfVWl0ZXJhdG9yIF9fZmlyc3QxLCBfVWl0ZXJhdG9yIF9fbGFzdDEsCisJCSAgICAgIF9VaXRlcmF0b3IgX19maXJzdDIpCisgICAgeworICAgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIpCisJaWYgKCEoKl9fZmlyc3QxID09ICpfX2ZpcnN0MikpCisJICBicmVhazsKKworICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCisJcmV0dXJuIHRydWU7CisKKyAgICAgIF9VaXRlcmF0b3IgX19sYXN0MiA9IF9fZmlyc3QyOworICAgICAgc3RkOjphZHZhbmNlKF9fbGFzdDIsIHN0ZDo6ZGlzdGFuY2UoX19maXJzdDEsIF9fbGFzdDEpKTsKKworICAgICAgZm9yIChfVWl0ZXJhdG9yIF9faXQxID0gX19maXJzdDE7IF9faXQxICE9IF9fbGFzdDE7ICsrX19pdDEpCisJeworCSAgX1VpdGVyYXRvciBfX3RtcCA9ICBfX2ZpcnN0MTsKKwkgIHdoaWxlIChfX3RtcCAhPSBfX2l0MSAmJiAhYm9vbCgqX190bXAgPT0gKl9faXQxKSkKKwkgICAgKytfX3RtcDsKKworCSAgLy8gV2UndmUgc2VlbiB0aGlzIG9uZSBiZWZvcmUuCisJICBpZiAoX190bXAgIT0gX19pdDEpCisJICAgIGNvbnRpbnVlOworCisJICBzdGQ6OnB0cmRpZmZfdCBfX24yID0gMDsKKwkgIGZvciAoX190bXAgPSBfX2ZpcnN0MjsgX190bXAgIT0gX19sYXN0MjsgKytfX3RtcCkKKwkgICAgaWYgKCpfX3RtcCA9PSAqX19pdDEpCisJICAgICAgKytfX24yOworCisJICBpZiAoIV9fbjIpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgc3RkOjpwdHJkaWZmX3QgX19uMSA9IDA7CisJICBmb3IgKF9fdG1wID0gX19pdDE7IF9fdG1wICE9IF9fbGFzdDE7ICsrX190bXApCisJICAgIGlmICgqX190bXAgPT0gKl9faXQxKQorCSAgICAgICsrX19uMTsKKworCSAgaWYgKF9fbjEgIT0gX19uMikKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKioKKyAgICogIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgIF9FcXVhbGl0eS4KKyAgICoKKyAgICogIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyBlcXVhbGl0eSBjb21wYXJpc29uIGZvciB1bm9yZGVyZWQKKyAgICogIGNvbnRhaW5lcnMsIHBlciBOMzA2OCwgYnkgSm9obiBMYWtvcyBhbmQgUGFibG8gSGFscGVybi4KKyAgICogIEFsZ29yaXRobWljYWxseSwgd2UgZm9sbG93IGNsb3NlbHkgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbnMKKyAgICogIHRoZXJlaW4uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzLAorCSAgIGJvb2wgX1VuaXF1ZV9rZXlzID0gX1RyYWl0czo6X191bmlxdWVfa2V5czo6dmFsdWU+CisgICAgc3RydWN0IF9FcXVhbGl0eTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RydWN0IF9FcXVhbGl0eTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHMsIHRydWU+CisgICAgeworICAgICAgdXNpbmcgX19oYXNodGFibGUgPSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJCSAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjsKKworICAgICAgYm9vbAorICAgICAgX01fZXF1YWwoY29uc3QgX19oYXNodGFibGUmKSBjb25zdDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYm9vbAorICAgIF9FcXVhbGl0eTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHMsIHRydWU+OjoKKyAgICBfTV9lcXVhbChjb25zdCBfX2hhc2h0YWJsZSYgX19vdGhlcikgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBfX2hhc2h0YWJsZSogX190aGlzID0gc3RhdGljX2Nhc3Q8Y29uc3QgX19oYXNodGFibGUqPih0aGlzKTsKKworICAgICAgaWYgKF9fdGhpcy0+c2l6ZSgpICE9IF9fb3RoZXIuc2l6ZSgpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgZm9yIChhdXRvIF9faXR4ID0gX190aGlzLT5iZWdpbigpOyBfX2l0eCAhPSBfX3RoaXMtPmVuZCgpOyArK19faXR4KQorCXsKKwkgIGNvbnN0IGF1dG8gX19pdHkgPSBfX290aGVyLmZpbmQoX0V4dHJhY3RLZXkoKSgqX19pdHgpKTsKKwkgIGlmIChfX2l0eSA9PSBfX290aGVyLmVuZCgpIHx8ICFib29sKCpfX2l0eSA9PSAqX19pdHgpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8vLyBTcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJ1Y3QgX0VxdWFsaXR5PF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cywgZmFsc2U+CisgICAgOiBwdWJsaWMgX0VxdWFsaXR5X2Jhc2UKKyAgICB7CisgICAgICB1c2luZyBfX2hhc2h0YWJsZSA9IF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkJICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OworCisgICAgICBib29sCisgICAgICBfTV9lcXVhbChjb25zdCBfX2hhc2h0YWJsZSYpIGNvbnN0OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBib29sCisgICAgX0VxdWFsaXR5PF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cywgZmFsc2U+OjoKKyAgICBfTV9lcXVhbChjb25zdCBfX2hhc2h0YWJsZSYgX19vdGhlcikgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBfX2hhc2h0YWJsZSogX190aGlzID0gc3RhdGljX2Nhc3Q8Y29uc3QgX19oYXNodGFibGUqPih0aGlzKTsKKworICAgICAgaWYgKF9fdGhpcy0+c2l6ZSgpICE9IF9fb3RoZXIuc2l6ZSgpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgZm9yIChhdXRvIF9faXR4ID0gX190aGlzLT5iZWdpbigpOyBfX2l0eCAhPSBfX3RoaXMtPmVuZCgpOykKKwl7CisJICBjb25zdCBhdXRvIF9feHJhbmdlID0gX190aGlzLT5lcXVhbF9yYW5nZShfRXh0cmFjdEtleSgpKCpfX2l0eCkpOworCSAgY29uc3QgYXV0byBfX3lyYW5nZSA9IF9fb3RoZXIuZXF1YWxfcmFuZ2UoX0V4dHJhY3RLZXkoKSgqX19pdHgpKTsKKworCSAgaWYgKHN0ZDo6ZGlzdGFuY2UoX194cmFuZ2UuZmlyc3QsIF9feHJhbmdlLnNlY29uZCkKKwkgICAgICAhPSBzdGQ6OmRpc3RhbmNlKF9feXJhbmdlLmZpcnN0LCBfX3lyYW5nZS5zZWNvbmQpKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIGlmICghX1NfaXNfcGVybXV0YXRpb24oX194cmFuZ2UuZmlyc3QsIF9feHJhbmdlLnNlY29uZCwKKwkJCQkgX195cmFuZ2UuZmlyc3QpKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIF9faXR4ID0gX194cmFuZ2Uuc2Vjb25kOworCX0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKioKKyAgICogVGhpcyB0eXBlIGlzIHRvIGNvbWJpbmUgYSBfSGFzaF9ub2RlX2Jhc2UgaW5zdGFuY2Ugd2l0aCBhbiBhbGxvY2F0b3IKKyAgICogaW5zdGFuY2UgdGhyb3VnaCBpbmhlcml0YW5jZSB0byBiZW5lZml0IGZyb20gRUJPIHdoZW4gcG9zc2libGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTm9kZUFsbG9jPgorICAgIHN0cnVjdCBfQmVmb3JlX2JlZ2luIDogcHVibGljIF9Ob2RlQWxsb2MKKyAgICB7CisgICAgICBfSGFzaF9ub2RlX2Jhc2UgX01fbm9kZTsKKworICAgICAgX0JlZm9yZV9iZWdpbihjb25zdCBfQmVmb3JlX2JlZ2luJikgPSBkZWZhdWx0OworICAgICAgX0JlZm9yZV9iZWdpbihfQmVmb3JlX2JlZ2luJiYpID0gZGVmYXVsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCV9CZWZvcmVfYmVnaW4oX0FsbG9jJiYgX19hKQorCSAgOiBfTm9kZUFsbG9jKHN0ZDo6Zm9yd2FyZDxfQWxsb2M+KF9fYSkpCisJeyB9CisgICAgfTsKKworIC8vQH0gaGFzaHRhYmxlLWRldGFpbAorX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBfSEFTSFRBQkxFX1BPTElDWV9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvaW5kaXJlY3RfYXJyYXkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9pbmRpcmVjdF9hcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYjg0NTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvaW5kaXJlY3RfYXJyYXkuaApAQCAtMCwwICsxLDIxMiBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gaW5kaXJlY3RfYXJyYXkgY2xhc3MuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2luZGlyZWN0X2FycmF5LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2YWxhcnJheX0KKyAqLworCisvLyBXcml0dGVuIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPEdhYnJpZWwuRG9zLVJlaXNARFBUTWF0aHMuRU5TLUNhY2hhbi5Gcj4KKworI2lmbmRlZiBfSU5ESVJFQ1RfQVJSQVlfSAorI2RlZmluZSBfSU5ESVJFQ1RfQVJSQVlfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBudW1lcmljX2FycmF5cworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogIEBicmllZiAgUmVmZXJlbmNlIHRvIGFyYml0cmFyeSBzdWJzZXQgb2YgYW4gYXJyYXkuCisgICAqCisgICAqICBBbiBpbmRpcmVjdF9hcnJheSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgYWN0dWFsIGVsZW1lbnRzIG9mIGFuIGFycmF5CisgICAqICBzcGVjaWZpZWQgYnkgYW4gb3JkZXJlZCBhcnJheSBvZiBpbmRpY2VzLiAgVGhlIHdheSB0byBnZXQgYW4KKyAgICogIGluZGlyZWN0X2FycmF5IGlzIHRvIGNhbGwgb3BlcmF0b3JbXSh2YWxhcnJheTxzaXplX3Q+KSBvbiBhIHZhbGFycmF5LgorICAgKiAgVGhlIHJldHVybmVkIGluZGlyZWN0X2FycmF5IHRoZW4gcGVybWl0cyBjYXJyeWluZyBvcGVyYXRpb25zIG91dCBvbiB0aGUKKyAgICogIHJlZmVyZW5jZWQgc3Vic2V0IG9mIGVsZW1lbnRzIGluIHRoZSBvcmlnaW5hbCB2YWxhcnJheS4KKyAgICoKKyAgICogIEZvciBleGFtcGxlLCBpZiBhbiBpbmRpcmVjdF9hcnJheSBpcyBvYnRhaW5lZCB1c2luZyB0aGUgYXJyYXkgKDQsMiwwKSBhcworICAgKiAgYW4gYXJndW1lbnQsIGFuZCB0aGVuIGFzc2lnbmVkIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgKDEsMiwzKSwgdGhlbiB0aGUKKyAgICogIHVuZGVybHlpbmcgYXJyYXkgd2lsbCBoYXZlIGFycmF5WzBdPT0zLCBhcnJheVsyXT09MiwgYW5kIGFycmF5WzRdPT0xLgorICAgKgorICAgKiAgQHBhcmFtICBUcCAgRWxlbWVudCB0eXBlLgorICAgKi8KKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBjbGFzcyBpbmRpcmVjdF9hcnJheQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNTMuIHZhbGFycmF5IGhlbHBlciBmdW5jdGlvbnMgYXJlIGFsbW9zdCBlbnRpcmVseSB1c2VsZXNzCisKKyAgICAgIC8vLyAgQ29weSBjb25zdHJ1Y3Rvci4gIEJvdGggc2xpY2VzIHJlZmVyIHRvIHRoZSBzYW1lIHVuZGVybHlpbmcgYXJyYXkuCisgICAgICBpbmRpcmVjdF9hcnJheShjb25zdCBpbmRpcmVjdF9hcnJheSYpOworCisgICAgICAvLy8gIEFzc2lnbm1lbnQgb3BlcmF0b3IuICBBc3NpZ25zIGVsZW1lbnRzIHRvIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMKKyAgICAgIC8vLyAgb2YgQGEgYS4KKyAgICAgIGluZGlyZWN0X2FycmF5JiBvcGVyYXRvcj0oY29uc3QgaW5kaXJlY3RfYXJyYXkmKTsKKworICAgICAgLy8vICBBc3NpZ24gc2xpY2UgZWxlbWVudHMgdG8gY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBNdWx0aXBseSBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yKj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBEaXZpZGUgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvci89KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTW9kdWxvIHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3IlPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIEFkZCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYgdG8gc2xpY2UgZWxlbWVudHMuCisgICAgICB2b2lkIG9wZXJhdG9yKz0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBTdWJ0cmFjdCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYgZnJvbSBzbGljZSBlbGVtZW50cy4KKyAgICAgIHZvaWQgb3BlcmF0b3ItPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExvZ2ljYWwgeG9yIHNsaWNlIGVsZW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcl49KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTG9naWNhbCBhbmQgc2xpY2UgZWxlbWVudHMgd2l0aCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yJj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMb2dpY2FsIG9yIHNsaWNlIGVsZW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcnw9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTGVmdCBzaGlmdCBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yPDw9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgUmlnaHQgc2hpZnQgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcj4+PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIEFzc2lnbiBhbGwgc2xpY2UgZWxlbWVudHMgdG8gQGEgdC4KKyAgICAgIHZvaWQgb3BlcmF0b3I9IChjb25zdCBfVHAmKSBjb25zdDsKKyAgICAgIC8vICAgIH5pbmRpcmVjdF9hcnJheSgpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgIHZvaWQgb3BlcmF0b3IqPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgdm9pZCBvcGVyYXRvci89KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICB2b2lkIG9wZXJhdG9yJT0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgIHZvaWQgb3BlcmF0b3IrPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgdm9pZCBvcGVyYXRvci09KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICB2b2lkIG9wZXJhdG9yXj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgIHZvaWQgb3BlcmF0b3ImPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgdm9pZCBvcGVyYXRvcnw9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICB2b2lkIG9wZXJhdG9yPDw9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICB2b2lkIG9wZXJhdG9yPj49KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAvLy8gIENvcHkgY29uc3RydWN0b3IuICBCb3RoIHNsaWNlcyByZWZlciB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIGFycmF5LgorICAgICAgaW5kaXJlY3RfYXJyYXkoX0FycmF5PF9UcD4sIHNpemVfdCwgX0FycmF5PHNpemVfdD4pOworCisgICAgICBmcmllbmQgY2xhc3MgdmFsYXJyYXk8X1RwPjsKKyAgICAgIGZyaWVuZCBjbGFzcyBnc2xpY2VfYXJyYXk8X1RwPjsKKworICAgICAgY29uc3Qgc2l6ZV90CSBfTV9zejsKKyAgICAgIGNvbnN0IF9BcnJheTxzaXplX3Q+IF9NX2luZGV4OworICAgICAgY29uc3QgX0FycmF5PF9UcD4JIF9NX2FycmF5OworCisgICAgICAvLyBub3QgaW1wbGVtZW50ZWQKKyAgICAgIGluZGlyZWN0X2FycmF5KCk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lCisgICAgaW5kaXJlY3RfYXJyYXk8X1RwPjo6aW5kaXJlY3RfYXJyYXkoY29uc3QgaW5kaXJlY3RfYXJyYXk8X1RwPiYgX19hKQorICAgIDogX01fc3ooX19hLl9NX3N6KSwgX01faW5kZXgoX19hLl9NX2luZGV4KSwgX01fYXJyYXkoX19hLl9NX2FycmF5KSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICBpbmRpcmVjdF9hcnJheTxfVHA+OjppbmRpcmVjdF9hcnJheShfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX3MsCisJCQkJCV9BcnJheTxzaXplX3Q+IF9faSkKKyAgICA6IF9NX3N6KF9fcyksIF9NX2luZGV4KF9faSksIF9NX2FycmF5KF9fYSkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGluZGlyZWN0X2FycmF5PF9UcD4mCisgICAgaW5kaXJlY3RfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IGluZGlyZWN0X2FycmF5PF9UcD4mIF9fYSkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2EuX01fYXJyYXksIF9NX3N6LCBfX2EuX01faW5kZXgsIF9NX2FycmF5LAorCQkJICAgX01faW5kZXgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBpbmRpcmVjdF9hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfZmlsbChfTV9hcnJheSwgX01faW5kZXgsIF9NX3N6LCBfX3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgaW5kaXJlY3RfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikgY29uc3QKKyAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+KF9fdiksIF9NX3N6LCBfTV9hcnJheSwgX01faW5kZXgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICBpbmxpbmUgdm9pZAorICAgICAgaW5kaXJlY3RfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSkgY29uc3QKKyAgICAgIHsgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19lLCBfTV9zeiwgX01fYXJyYXksIF9NX2luZGV4KTsgfQorCisjdW5kZWYgX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUgorI2RlZmluZSBfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKF9PcCwgX05hbWUpCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgdm9pZAkJCQkJCQkJXAorICAgIGluZGlyZWN0X2FycmF5PF9UcD46Om9wZXJhdG9yIF9PcCMjPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpIGNvbnN0XAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX01fYXJyYXksIF9NX2luZGV4LCBfQXJyYXk8X1RwPihfX3YpLCBfTV9zeik7IFwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CQkJCSAgICAgICAgICAgICAgICBcCisgICAgICBpbmxpbmUgdm9pZAkJCQkJCQlcCisgICAgICBpbmRpcmVjdF9hcnJheTxfVHA+OjpvcGVyYXRvciBfT3AjIz0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JiBfX2UpIGNvbnN0XAorICAgICAgewkJCQkJCQkJCVwKKwlfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX01fYXJyYXksIF9NX2luZGV4LCBfX2UsIF9NX3N6KTsJXAorICAgICAgfQorCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCosIF9fbXVsdGlwbGllcykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoLywgX19kaXZpZGVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUiglLCBfX21vZHVsdXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCssIF9fcGx1cykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoLSwgX19taW51cykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoXiwgX19iaXR3aXNlX3hvcikKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoJiwgX19iaXR3aXNlX2FuZCkKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IofCwgX19iaXR3aXNlX29yKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUig8PCwgX19zaGlmdF9sZWZ0KQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUig+PiwgX19zaGlmdF9yaWdodCkKKworI3VuZGVmIF9ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IKKworICAvLyBAfSBncm91cCBudW1lcmljX2FycmF5cworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfSU5ESVJFQ1RfQVJSQVlfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2lvc19iYXNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvaW9zX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjdiOWE0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2lvc19iYXNlLmgKQEAgLTAsMCArMSw5NzUgQEAKKy8vIElvc3RyZWFtcyBiYXNlIGNsYXNzZXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvaW9zX2Jhc2UuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc30KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuNCAgSW9zdHJlYW1zIGJhc2UgY2xhc3NlcworLy8KKworI2lmbmRlZiBfSU9TX0JBU0VfSAorI2RlZmluZSBfSU9TX0JBU0VfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGV4dC9hdG9taWNpdHkuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZWZ3ZC5oPgorI2luY2x1ZGUgPGJpdHMvbG9jYWxlX2NsYXNzZXMuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgb2YgYml0bWFzayB0eXBlcyBhcmUgZW51bXMsIG5vdCBpbnRzLAorICAvLyBhcyBwZXJtaXR0ZWQgKGJ1dCBub3QgcmVxdWlyZWQpIGluIHRoZSBzdGFuZGFyZCwgaW4gb3JkZXIgdG8gcHJvdmlkZQorICAvLyBiZXR0ZXIgdHlwZSBzYWZldHkgaW4gaW9zdHJlYW0gY2FsbHMuICBBIHNpZGUgZWZmZWN0IGlzIHRoYXQKKyAgLy8gZXhwcmVzc2lvbnMgaW52b2x2aW5nIHRoZW0gYXJlIG5vIGxvbmdlciBjb21waWxlLXRpbWUgY29uc3RhbnRzLgorICBlbnVtIF9Jb3NfRm10ZmxhZ3MgCisgICAgeyAKKyAgICAgIF9TX2Jvb2xhbHBoYSAJPSAxTCA8PCAwLAorICAgICAgX1NfZGVjIAkJPSAxTCA8PCAxLAorICAgICAgX1NfZml4ZWQgCQk9IDFMIDw8IDIsCisgICAgICBfU19oZXggCQk9IDFMIDw8IDMsCisgICAgICBfU19pbnRlcm5hbCAJPSAxTCA8PCA0LAorICAgICAgX1NfbGVmdCAJCT0gMUwgPDwgNSwKKyAgICAgIF9TX29jdCAJCT0gMUwgPDwgNiwKKyAgICAgIF9TX3JpZ2h0IAkJPSAxTCA8PCA3LAorICAgICAgX1Nfc2NpZW50aWZpYyAJPSAxTCA8PCA4LAorICAgICAgX1Nfc2hvd2Jhc2UgCT0gMUwgPDwgOSwKKyAgICAgIF9TX3Nob3dwb2ludCAJPSAxTCA8PCAxMCwKKyAgICAgIF9TX3Nob3dwb3MgCT0gMUwgPDwgMTEsCisgICAgICBfU19za2lwd3MgCT0gMUwgPDwgMTIsCisgICAgICBfU191bml0YnVmIAk9IDFMIDw8IDEzLAorICAgICAgX1NfdXBwZXJjYXNlIAk9IDFMIDw8IDE0LAorICAgICAgX1NfYWRqdXN0ZmllbGQgCT0gX1NfbGVmdCB8IF9TX3JpZ2h0IHwgX1NfaW50ZXJuYWwsCisgICAgICBfU19iYXNlZmllbGQgCT0gX1NfZGVjIHwgX1Nfb2N0IHwgX1NfaGV4LAorICAgICAgX1NfZmxvYXRmaWVsZCAJPSBfU19zY2llbnRpZmljIHwgX1NfZml4ZWQsCisgICAgICBfU19pb3NfZm10ZmxhZ3NfZW5kID0gMUwgPDwgMTYgCisgICAgfTsKKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIF9Jb3NfRm10ZmxhZ3MKKyAgb3BlcmF0b3ImKF9Jb3NfRm10ZmxhZ3MgX19hLCBfSW9zX0ZtdGZsYWdzIF9fYikKKyAgeyByZXR1cm4gX0lvc19GbXRmbGFncyhzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgJiBzdGF0aWNfY2FzdDxpbnQ+KF9fYikpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX0ZtdGZsYWdzCisgIG9wZXJhdG9yfChfSW9zX0ZtdGZsYWdzIF9fYSwgX0lvc19GbXRmbGFncyBfX2IpCisgIHsgcmV0dXJuIF9Jb3NfRm10ZmxhZ3Moc3RhdGljX2Nhc3Q8aW50PihfX2EpIHwgc3RhdGljX2Nhc3Q8aW50PihfX2IpKTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgX0lvc19GbXRmbGFncworICBvcGVyYXRvcl4oX0lvc19GbXRmbGFncyBfX2EsIF9Jb3NfRm10ZmxhZ3MgX19iKQorICB7IHJldHVybiBfSW9zX0ZtdGZsYWdzKHN0YXRpY19jYXN0PGludD4oX19hKSBeIHN0YXRpY19jYXN0PGludD4oX19iKSk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIF9Jb3NfRm10ZmxhZ3MKKyAgb3BlcmF0b3J+KF9Jb3NfRm10ZmxhZ3MgX19hKQorICB7IHJldHVybiBfSW9zX0ZtdGZsYWdzKH5zdGF0aWNfY2FzdDxpbnQ+KF9fYSkpOyB9CisKKyAgaW5saW5lIGNvbnN0IF9Jb3NfRm10ZmxhZ3MmCisgIG9wZXJhdG9yfD0oX0lvc19GbXRmbGFncyYgX19hLCBfSW9zX0ZtdGZsYWdzIF9fYikKKyAgeyByZXR1cm4gX19hID0gX19hIHwgX19iOyB9CisKKyAgaW5saW5lIGNvbnN0IF9Jb3NfRm10ZmxhZ3MmCisgIG9wZXJhdG9yJj0oX0lvc19GbXRmbGFncyYgX19hLCBfSW9zX0ZtdGZsYWdzIF9fYikKKyAgeyByZXR1cm4gX19hID0gX19hICYgX19iOyB9CisKKyAgaW5saW5lIGNvbnN0IF9Jb3NfRm10ZmxhZ3MmCisgIG9wZXJhdG9yXj0oX0lvc19GbXRmbGFncyYgX19hLCBfSW9zX0ZtdGZsYWdzIF9fYikKKyAgeyByZXR1cm4gX19hID0gX19hIF4gX19iOyB9CisKKworICBlbnVtIF9Jb3NfT3Blbm1vZGUgCisgICAgeyAKKyAgICAgIF9TX2FwcCAJCT0gMUwgPDwgMCwKKyAgICAgIF9TX2F0ZSAJCT0gMUwgPDwgMSwKKyAgICAgIF9TX2JpbiAJCT0gMUwgPDwgMiwKKyAgICAgIF9TX2luIAkJPSAxTCA8PCAzLAorICAgICAgX1Nfb3V0IAkJPSAxTCA8PCA0LAorICAgICAgX1NfdHJ1bmMgCQk9IDFMIDw8IDUsCisgICAgICBfU19pb3Nfb3Blbm1vZGVfZW5kID0gMUwgPDwgMTYgCisgICAgfTsKKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIF9Jb3NfT3Blbm1vZGUKKyAgb3BlcmF0b3ImKF9Jb3NfT3Blbm1vZGUgX19hLCBfSW9zX09wZW5tb2RlIF9fYikKKyAgeyByZXR1cm4gX0lvc19PcGVubW9kZShzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgJiBzdGF0aWNfY2FzdDxpbnQ+KF9fYikpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX09wZW5tb2RlCisgIG9wZXJhdG9yfChfSW9zX09wZW5tb2RlIF9fYSwgX0lvc19PcGVubW9kZSBfX2IpCisgIHsgcmV0dXJuIF9Jb3NfT3Blbm1vZGUoc3RhdGljX2Nhc3Q8aW50PihfX2EpIHwgc3RhdGljX2Nhc3Q8aW50PihfX2IpKTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgX0lvc19PcGVubW9kZQorICBvcGVyYXRvcl4oX0lvc19PcGVubW9kZSBfX2EsIF9Jb3NfT3Blbm1vZGUgX19iKQorICB7IHJldHVybiBfSW9zX09wZW5tb2RlKHN0YXRpY19jYXN0PGludD4oX19hKSBeIHN0YXRpY19jYXN0PGludD4oX19iKSk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIF9Jb3NfT3Blbm1vZGUKKyAgb3BlcmF0b3J+KF9Jb3NfT3Blbm1vZGUgX19hKQorICB7IHJldHVybiBfSW9zX09wZW5tb2RlKH5zdGF0aWNfY2FzdDxpbnQ+KF9fYSkpOyB9CisKKyAgaW5saW5lIGNvbnN0IF9Jb3NfT3Blbm1vZGUmCisgIG9wZXJhdG9yfD0oX0lvc19PcGVubW9kZSYgX19hLCBfSW9zX09wZW5tb2RlIF9fYikKKyAgeyByZXR1cm4gX19hID0gX19hIHwgX19iOyB9CisKKyAgaW5saW5lIGNvbnN0IF9Jb3NfT3Blbm1vZGUmCisgIG9wZXJhdG9yJj0oX0lvc19PcGVubW9kZSYgX19hLCBfSW9zX09wZW5tb2RlIF9fYikKKyAgeyByZXR1cm4gX19hID0gX19hICYgX19iOyB9CisKKyAgaW5saW5lIGNvbnN0IF9Jb3NfT3Blbm1vZGUmCisgIG9wZXJhdG9yXj0oX0lvc19PcGVubW9kZSYgX19hLCBfSW9zX09wZW5tb2RlIF9fYikKKyAgeyByZXR1cm4gX19hID0gX19hIF4gX19iOyB9CisKKworICBlbnVtIF9Jb3NfSW9zdGF0ZQorICAgIHsgCisgICAgICBfU19nb29kYml0IAkJPSAwLAorICAgICAgX1NfYmFkYml0IAkJPSAxTCA8PCAwLAorICAgICAgX1NfZW9mYml0IAkJPSAxTCA8PCAxLAorICAgICAgX1NfZmFpbGJpdAkJPSAxTCA8PCAyLAorICAgICAgX1NfaW9zX2lvc3RhdGVfZW5kID0gMUwgPDwgMTYgCisgICAgfTsKKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIF9Jb3NfSW9zdGF0ZQorICBvcGVyYXRvciYoX0lvc19Jb3N0YXRlIF9fYSwgX0lvc19Jb3N0YXRlIF9fYikKKyAgeyByZXR1cm4gX0lvc19Jb3N0YXRlKHN0YXRpY19jYXN0PGludD4oX19hKSAmIHN0YXRpY19jYXN0PGludD4oX19iKSk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIF9Jb3NfSW9zdGF0ZQorICBvcGVyYXRvcnwoX0lvc19Jb3N0YXRlIF9fYSwgX0lvc19Jb3N0YXRlIF9fYikKKyAgeyByZXR1cm4gX0lvc19Jb3N0YXRlKHN0YXRpY19jYXN0PGludD4oX19hKSB8IHN0YXRpY19jYXN0PGludD4oX19iKSk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIF9Jb3NfSW9zdGF0ZQorICBvcGVyYXRvcl4oX0lvc19Jb3N0YXRlIF9fYSwgX0lvc19Jb3N0YXRlIF9fYikKKyAgeyByZXR1cm4gX0lvc19Jb3N0YXRlKHN0YXRpY19jYXN0PGludD4oX19hKSBeIHN0YXRpY19jYXN0PGludD4oX19iKSk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIF9Jb3NfSW9zdGF0ZQorICBvcGVyYXRvcn4oX0lvc19Jb3N0YXRlIF9fYSkKKyAgeyByZXR1cm4gX0lvc19Jb3N0YXRlKH5zdGF0aWNfY2FzdDxpbnQ+KF9fYSkpOyB9CisKKyAgaW5saW5lIGNvbnN0IF9Jb3NfSW9zdGF0ZSYKKyAgb3BlcmF0b3J8PShfSW9zX0lvc3RhdGUmIF9fYSwgX0lvc19Jb3N0YXRlIF9fYikKKyAgeyByZXR1cm4gX19hID0gX19hIHwgX19iOyB9CisKKyAgaW5saW5lIGNvbnN0IF9Jb3NfSW9zdGF0ZSYKKyAgb3BlcmF0b3ImPShfSW9zX0lvc3RhdGUmIF9fYSwgX0lvc19Jb3N0YXRlIF9fYikKKyAgeyByZXR1cm4gX19hID0gX19hICYgX19iOyB9CisKKyAgaW5saW5lIGNvbnN0ICBfSW9zX0lvc3RhdGUmCisgIG9wZXJhdG9yXj0oX0lvc19Jb3N0YXRlJiBfX2EsIF9Jb3NfSW9zdGF0ZSBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSBeIF9fYjsgfQorCisKKyAgZW51bSBfSW9zX1NlZWtkaXIgCisgICAgeyAKKyAgICAgIF9TX2JlZyA9IDAsCisgICAgICBfU19jdXIgPSBfR0xJQkNYWF9TVERJT19TRUVLX0NVUiwKKyAgICAgIF9TX2VuZCA9IF9HTElCQ1hYX1NURElPX1NFRUtfRU5ELAorICAgICAgX1NfaW9zX3NlZWtkaXJfZW5kID0gMUwgPDwgMTYgCisgICAgfTsKKworICAvLyAyNy40LjIgIENsYXNzIGlvc19iYXNlCisgIC8qKgorICAgKiAgQGJyaWVmICBUaGUgYmFzZSBvZiB0aGUgSS9PIGNsYXNzIGhpZXJhcmNoeS4KKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBUaGlzIGNsYXNzIGRlZmluZXMgZXZlcnl0aGluZyB0aGF0IGNhbiBiZSBkZWZpbmVkIGFib3V0IEkvTyB0aGF0IGRvZXMKKyAgICogIG5vdCBkZXBlbmQgb24gdGhlIHR5cGUgb2YgY2hhcmFjdGVycyBiZWluZyBpbnB1dCBvciBvdXRwdXQuICBNb3N0CisgICAqICBwZW9wbGUgd2lsbCBvbmx5IHNlZSBAYyBpb3NfYmFzZSB3aGVuIHRoZXkgbmVlZCB0byBzcGVjaWZ5IHRoZSBmdWxsCisgICAqICBuYW1lIG9mIHRoZSB2YXJpb3VzIEkvTyBmbGFncyAoZS5nLiwgdGhlIG9wZW5tb2RlcykuCisgICovCisgIGNsYXNzIGlvc19iYXNlCisgIHsKKyAgcHVibGljOgorCisgICAgLyoqIAorICAgICAqICBAYnJpZWYgVGhlc2UgYXJlIHRocm93biB0byBpbmRpY2F0ZSBwcm9ibGVtcyB3aXRoIGlvLgorICAgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAgICoKKyAgICAgKiAgMjcuNC4yLjEuMSAgQ2xhc3MgaW9zX2Jhc2U6OmZhaWx1cmUKKyAgICAgKi8KKyAgICBjbGFzcyBmYWlsdXJlIDogcHVibGljIGV4Y2VwdGlvbgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0OC4gIFVzZSBvZiBub24tZXhpc3RlbnQgZXhjZXB0aW9uIGNvbnN0cnVjdG9yCisgICAgICBleHBsaWNpdAorICAgICAgZmFpbHVyZShjb25zdCBzdHJpbmcmIF9fc3RyKSB0aHJvdygpOworCisgICAgICAvLyBUaGlzIGRlY2xhcmF0aW9uIGlzIG5vdCB1c2VsZXNzOgorICAgICAgLy8gaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjLTQuMy4yL2djYy9WYWd1ZS1MaW5rYWdlLmh0bWwKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5mYWlsdXJlKCkgdGhyb3coKTsKKworICAgICAgdmlydHVhbCBjb25zdCBjaGFyKgorICAgICAgd2hhdCgpIGNvbnN0IHRocm93KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgc3RyaW5nIF9NX21zZzsKKyAgICB9OworCisgICAgLy8gMjcuNC4yLjEuMiAgVHlwZSBpb3NfYmFzZTo6Zm10ZmxhZ3MKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmIFRoaXMgaXMgYSBiaXRtYXNrIHR5cGUuCisgICAgICoKKyAgICAgKiAgQGMgQGEgX0lvc19GbXRmbGFncyBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLCBidXQgaXQgaXMgdmFsaWQgdG8KKyAgICAgKiAgcGVyZm9ybSBiaXR3aXNlIG9wZXJhdGlvbnMgb24gdGhlc2UgdmFsdWVzIGFuZCBleHBlY3QgdGhlIFJpZ2h0CisgICAgICogIFRoaW5nIHRvIGhhcHBlbi4gIERlZmluZWQgb2JqZWN0cyBvZiB0eXBlIGZtdGZsYWdzIGFyZToKKyAgICAgKiAgLSBib29sYWxwaGEKKyAgICAgKiAgLSBkZWMKKyAgICAgKiAgLSBmaXhlZAorICAgICAqICAtIGhleAorICAgICAqICAtIGludGVybmFsCisgICAgICogIC0gbGVmdAorICAgICAqICAtIG9jdAorICAgICAqICAtIHJpZ2h0CisgICAgICogIC0gc2NpZW50aWZpYworICAgICAqICAtIHNob3diYXNlCisgICAgICogIC0gc2hvd3BvaW50CisgICAgICogIC0gc2hvd3BvcworICAgICAqICAtIHNraXB3cworICAgICAqICAtIHVuaXRidWYKKyAgICAgKiAgLSB1cHBlcmNhc2UKKyAgICAgKiAgLSBhZGp1c3RmaWVsZAorICAgICAqICAtIGJhc2VmaWVsZAorICAgICAqICAtIGZsb2F0ZmllbGQKKyAgICAqLworICAgIHR5cGVkZWYgX0lvc19GbXRmbGFncyBmbXRmbGFnczsKKworICAgIC8vLyBJbnNlcnQvZXh0cmFjdCBAYyBib29sIGluIGFscGhhYmV0aWMgcmF0aGVyIHRoYW4gbnVtZXJpYyBmb3JtYXQuCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGJvb2xhbHBoYSA9ICAgX1NfYm9vbGFscGhhOworCisgICAgLy8vIENvbnZlcnRzIGludGVnZXIgaW5wdXQgb3IgZ2VuZXJhdGVzIGludGVnZXIgb3V0cHV0IGluIGRlY2ltYWwgYmFzZS4KKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgZGVjID0gICAgICAgICBfU19kZWM7CisKKyAgICAvLy8gR2VuZXJhdGUgZmxvYXRpbmctcG9pbnQgb3V0cHV0IGluIGZpeGVkLXBvaW50IG5vdGF0aW9uLgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBmaXhlZCA9ICAgICAgIF9TX2ZpeGVkOworCisgICAgLy8vIENvbnZlcnRzIGludGVnZXIgaW5wdXQgb3IgZ2VuZXJhdGVzIGludGVnZXIgb3V0cHV0IGluIGhleGFkZWNpbWFsIGJhc2UuCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGhleCA9ICAgICAgICAgX1NfaGV4OworCisgICAgLy8vIEFkZHMgZmlsbCBjaGFyYWN0ZXJzIGF0IGEgZGVzaWduYXRlZCBpbnRlcm5hbCBwb2ludCBpbiBjZXJ0YWluCisgICAgLy8vIGdlbmVyYXRlZCBvdXRwdXQsIG9yIGlkZW50aWNhbCB0byBAYyByaWdodCBpZiBubyBzdWNoIHBvaW50IGlzCisgICAgLy8vIGRlc2lnbmF0ZWQuCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGludGVybmFsID0gICAgX1NfaW50ZXJuYWw7CisKKyAgICAvLy8gQWRkcyBmaWxsIGNoYXJhY3RlcnMgb24gdGhlIHJpZ2h0IChmaW5hbCBwb3NpdGlvbnMpIG9mIGNlcnRhaW4KKyAgICAvLy8gZ2VuZXJhdGVkIG91dHB1dC4gIChJLmUuLCB0aGUgdGhpbmcgeW91IHByaW50IGlzIGZsdXNoIGxlZnQuKQorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBsZWZ0ID0gICAgICAgIF9TX2xlZnQ7CisKKyAgICAvLy8gQ29udmVydHMgaW50ZWdlciBpbnB1dCBvciBnZW5lcmF0ZXMgaW50ZWdlciBvdXRwdXQgaW4gb2N0YWwgYmFzZS4KKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3Mgb2N0ID0gICAgICAgICBfU19vY3Q7CisKKyAgICAvLy8gQWRkcyBmaWxsIGNoYXJhY3RlcnMgb24gdGhlIGxlZnQgKGluaXRpYWwgcG9zaXRpb25zKSBvZiBjZXJ0YWluCisgICAgLy8vIGdlbmVyYXRlZCBvdXRwdXQuICAoSS5lLiwgdGhlIHRoaW5nIHlvdSBwcmludCBpcyBmbHVzaCByaWdodC4pCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHJpZ2h0ID0gICAgICAgX1NfcmlnaHQ7CisKKyAgICAvLy8gR2VuZXJhdGVzIGZsb2F0aW5nLXBvaW50IG91dHB1dCBpbiBzY2llbnRpZmljIG5vdGF0aW9uLgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBzY2llbnRpZmljID0gIF9TX3NjaWVudGlmaWM7CisKKyAgICAvLy8gR2VuZXJhdGVzIGEgcHJlZml4IGluZGljYXRpbmcgdGhlIG51bWVyaWMgYmFzZSBvZiBnZW5lcmF0ZWQgaW50ZWdlcgorICAgIC8vLyBvdXRwdXQuCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHNob3diYXNlID0gICAgX1Nfc2hvd2Jhc2U7CisKKyAgICAvLy8gR2VuZXJhdGVzIGEgZGVjaW1hbC1wb2ludCBjaGFyYWN0ZXIgdW5jb25kaXRpb25hbGx5IGluIGdlbmVyYXRlZAorICAgIC8vLyBmbG9hdGluZy1wb2ludCBvdXRwdXQuCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHNob3dwb2ludCA9ICAgX1Nfc2hvd3BvaW50OworCisgICAgLy8vIEdlbmVyYXRlcyBhICsgc2lnbiBpbiBub24tbmVnYXRpdmUgZ2VuZXJhdGVkIG51bWVyaWMgb3V0cHV0LgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBzaG93cG9zID0gICAgIF9TX3Nob3dwb3M7CisKKyAgICAvLy8gU2tpcHMgbGVhZGluZyB3aGl0ZSBzcGFjZSBiZWZvcmUgY2VydGFpbiBpbnB1dCBvcGVyYXRpb25zLgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBza2lwd3MgPSAgICAgIF9TX3NraXB3czsKKworICAgIC8vLyBGbHVzaGVzIG91dHB1dCBhZnRlciBlYWNoIG91dHB1dCBvcGVyYXRpb24uCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHVuaXRidWYgPSAgICAgX1NfdW5pdGJ1ZjsKKworICAgIC8vLyBSZXBsYWNlcyBjZXJ0YWluIGxvd2VyY2FzZSBsZXR0ZXJzIHdpdGggdGhlaXIgdXBwZXJjYXNlIGVxdWl2YWxlbnRzCisgICAgLy8vIGluIGdlbmVyYXRlZCBvdXRwdXQuCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHVwcGVyY2FzZSA9ICAgX1NfdXBwZXJjYXNlOworCisgICAgLy8vIEEgbWFzayBvZiBsZWZ0fHJpZ2h0fGludGVybmFsLiAgVXNlZnVsIGZvciB0aGUgMi1hcmcgZm9ybSBvZiBAYyBzZXRmLgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBhZGp1c3RmaWVsZCA9IF9TX2FkanVzdGZpZWxkOworCisgICAgLy8vIEEgbWFzayBvZiBkZWN8b2N0fGhleC4gIFVzZWZ1bCBmb3IgdGhlIDItYXJnIGZvcm0gb2YgQGMgc2V0Zi4KKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgYmFzZWZpZWxkID0gICBfU19iYXNlZmllbGQ7CisKKyAgICAvLy8gQSBtYXNrIG9mIHNjaWVudGlmaWN8Zml4ZWQuICBVc2VmdWwgZm9yIHRoZSAyLWFyZyBmb3JtIG9mIEBjIHNldGYuCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGZsb2F0ZmllbGQgPSAgX1NfZmxvYXRmaWVsZDsKKworICAgIC8vIDI3LjQuMi4xLjMgIFR5cGUgaW9zX2Jhc2U6Omlvc3RhdGUKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmIFRoaXMgaXMgYSBiaXRtYXNrIHR5cGUuCisgICAgICoKKyAgICAgKiAgQGMgQGEgX0lvc19Jb3N0YXRlIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQsIGJ1dCBpdCBpcyB2YWxpZCB0bworICAgICAqICBwZXJmb3JtIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiB0aGVzZSB2YWx1ZXMgYW5kIGV4cGVjdCB0aGUgUmlnaHQKKyAgICAgKiAgVGhpbmcgdG8gaGFwcGVuLiAgRGVmaW5lZCBvYmplY3RzIG9mIHR5cGUgaW9zdGF0ZSBhcmU6CisgICAgICogIC0gYmFkYml0CisgICAgICogIC0gZW9mYml0CisgICAgICogIC0gZmFpbGJpdAorICAgICAqICAtIGdvb2RiaXQKKyAgICAqLworICAgIHR5cGVkZWYgX0lvc19Jb3N0YXRlIGlvc3RhdGU7CisKKyAgICAvLy8gSW5kaWNhdGVzIGEgbG9zcyBvZiBpbnRlZ3JpdHkgaW4gYW4gaW5wdXQgb3Igb3V0cHV0IHNlcXVlbmNlIChzdWNoCisgICAgLy8vIGFzIGFuIGlycmVjb3ZlcmFibGUgcmVhZCBlcnJvciBmcm9tIGEgZmlsZSkuCisgICAgc3RhdGljIGNvbnN0IGlvc3RhdGUgYmFkYml0ID0JX1NfYmFkYml0OworCisgICAgLy8vIEluZGljYXRlcyB0aGF0IGFuIGlucHV0IG9wZXJhdGlvbiByZWFjaGVkIHRoZSBlbmQgb2YgYW4gaW5wdXQgc2VxdWVuY2UuCisgICAgc3RhdGljIGNvbnN0IGlvc3RhdGUgZW9mYml0ID0JX1NfZW9mYml0OworCisgICAgLy8vIEluZGljYXRlcyB0aGF0IGFuIGlucHV0IG9wZXJhdGlvbiBmYWlsZWQgdG8gcmVhZCB0aGUgZXhwZWN0ZWQKKyAgICAvLy8gY2hhcmFjdGVycywgb3IgdGhhdCBhbiBvdXRwdXQgb3BlcmF0aW9uIGZhaWxlZCB0byBnZW5lcmF0ZSB0aGUKKyAgICAvLy8gZGVzaXJlZCBjaGFyYWN0ZXJzLgorICAgIHN0YXRpYyBjb25zdCBpb3N0YXRlIGZhaWxiaXQgPQlfU19mYWlsYml0OworCisgICAgLy8vIEluZGljYXRlcyBhbGwgaXMgd2VsbC4KKyAgICBzdGF0aWMgY29uc3QgaW9zdGF0ZSBnb29kYml0ID0JX1NfZ29vZGJpdDsKKworICAgIC8vIDI3LjQuMi4xLjQgIFR5cGUgaW9zX2Jhc2U6Om9wZW5tb2RlCisgICAgLyoqCisgICAgICogIEBicmllZiBUaGlzIGlzIGEgYml0bWFzayB0eXBlLgorICAgICAqCisgICAgICogIEBjIEBhIF9Jb3NfT3Blbm1vZGUgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZCwgYnV0IGl0IGlzIHZhbGlkIHRvCisgICAgICogIHBlcmZvcm0gYml0d2lzZSBvcGVyYXRpb25zIG9uIHRoZXNlIHZhbHVlcyBhbmQgZXhwZWN0IHRoZSBSaWdodAorICAgICAqICBUaGluZyB0byBoYXBwZW4uICBEZWZpbmVkIG9iamVjdHMgb2YgdHlwZSBvcGVubW9kZSBhcmU6CisgICAgICogIC0gYXBwCisgICAgICogIC0gYXRlCisgICAgICogIC0gYmluYXJ5CisgICAgICogIC0gaW4KKyAgICAgKiAgLSBvdXQKKyAgICAgKiAgLSB0cnVuYworICAgICovCisgICAgdHlwZWRlZiBfSW9zX09wZW5tb2RlIG9wZW5tb2RlOworCisgICAgLy8vIFNlZWsgdG8gZW5kIGJlZm9yZSBlYWNoIHdyaXRlLgorICAgIHN0YXRpYyBjb25zdCBvcGVubW9kZSBhcHAgPQkJX1NfYXBwOworCisgICAgLy8vIE9wZW4gYW5kIHNlZWsgdG8gZW5kIGltbWVkaWF0ZWx5IGFmdGVyIG9wZW5pbmcuCisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIGF0ZSA9CQlfU19hdGU7CisKKyAgICAvLy8gUGVyZm9ybSBpbnB1dCBhbmQgb3V0cHV0IGluIGJpbmFyeSBtb2RlIChhcyBvcHBvc2VkIHRvIHRleHQgbW9kZSkuCisgICAgLy8vIFRoaXMgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91IHRoaW5rIGl0IGlzOyBzZWUKKyAgICAvLy8gaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQxMWNoMjdzMDIuaHRtbAorICAgIHN0YXRpYyBjb25zdCBvcGVubW9kZSBiaW5hcnkgPQlfU19iaW47CisKKyAgICAvLy8gT3BlbiBmb3IgaW5wdXQuICBEZWZhdWx0IGZvciBAYyBpZnN0cmVhbSBhbmQgZnN0cmVhbS4KKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgaW4gPQkJX1NfaW47CisKKyAgICAvLy8gT3BlbiBmb3Igb3V0cHV0LiAgRGVmYXVsdCBmb3IgQGMgb2ZzdHJlYW0gYW5kIGZzdHJlYW0uCisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIG91dCA9CQlfU19vdXQ7CisKKyAgICAvLy8gT3BlbiBmb3IgaW5wdXQuICBEZWZhdWx0IGZvciBAYyBvZnN0cmVhbS4KKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgdHJ1bmMgPQlfU190cnVuYzsKKworICAgIC8vIDI3LjQuMi4xLjUgIFR5cGUgaW9zX2Jhc2U6OnNlZWtkaXIKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmIFRoaXMgaXMgYW4gZW51bWVyYXRlZCB0eXBlLgorICAgICAqCisgICAgICogIEBjIEBhIF9Jb3NfU2Vla2RpciBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLiAgRGVmaW5lZCB2YWx1ZXMKKyAgICAgKiAgb2YgdHlwZSBzZWVrZGlyIGFyZToKKyAgICAgKiAgLSBiZWcKKyAgICAgKiAgLSBjdXIsIGVxdWl2YWxlbnQgdG8gQGMgU0VFS19DVVIgaW4gdGhlIEMgc3RhbmRhcmQgbGlicmFyeS4KKyAgICAgKiAgLSBlbmQsIGVxdWl2YWxlbnQgdG8gQGMgU0VFS19FTkQgaW4gdGhlIEMgc3RhbmRhcmQgbGlicmFyeS4KKyAgICAqLworICAgIHR5cGVkZWYgX0lvc19TZWVrZGlyIHNlZWtkaXI7CisKKyAgICAvLy8gUmVxdWVzdCBhIHNlZWsgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLgorICAgIHN0YXRpYyBjb25zdCBzZWVrZGlyIGJlZyA9CQlfU19iZWc7CisKKyAgICAvLy8gUmVxdWVzdCBhIHNlZWsgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBzZXF1ZW5jZS4KKyAgICBzdGF0aWMgY29uc3Qgc2Vla2RpciBjdXIgPQkJX1NfY3VyOworCisgICAgLy8vIFJlcXVlc3QgYSBzZWVrIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGVuZCBvZiB0aGUgc2VxdWVuY2UuCisgICAgc3RhdGljIGNvbnN0IHNlZWtkaXIgZW5kID0JCV9TX2VuZDsKKworICAgIC8vIEFubmV4IEQuNgorICAgIHR5cGVkZWYgaW50IGlvX3N0YXRlOworICAgIHR5cGVkZWYgaW50IG9wZW5fbW9kZTsKKyAgICB0eXBlZGVmIGludCBzZWVrX2RpcjsKKworICAgIHR5cGVkZWYgc3RkOjpzdHJlYW1wb3Mgc3RyZWFtcG9zOworICAgIHR5cGVkZWYgc3RkOjpzdHJlYW1vZmYgc3RyZWFtb2ZmOworCisgICAgLy8gQ2FsbGJhY2tzOworICAgIC8qKgorICAgICAqICBAYnJpZWYgIFRoZSBzZXQgb2YgZXZlbnRzIHRoYXQgbWF5IGJlIHBhc3NlZCB0byBhbiBldmVudCBjYWxsYmFjay4KKyAgICAgKgorICAgICAqICBlcmFzZV9ldmVudCBpcyB1c2VkIGR1cmluZyB+aW9zKCkgYW5kIGNvcHlmbXQoKS4gIGltYnVlX2V2ZW50IGlzIHVzZWQKKyAgICAgKiAgZHVyaW5nIGltYnVlKCkuICBjb3B5Zm10X2V2ZW50IGlzIHVzZWQgZHVyaW5nIGNvcHlmbXQoKS4KKyAgICAqLworICAgIGVudW0gZXZlbnQKKyAgICB7CisgICAgICBlcmFzZV9ldmVudCwKKyAgICAgIGltYnVlX2V2ZW50LAorICAgICAgY29weWZtdF9ldmVudAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBUaGUgdHlwZSBvZiBhbiBldmVudCBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICAgKiAgQHBhcmFtICBfX2UgIE9uZSBvZiB0aGUgbWVtYmVycyBvZiB0aGUgZXZlbnQgZW51bS4KKyAgICAgKiAgQHBhcmFtICBfX2IgIFJlZmVyZW5jZSB0byB0aGUgaW9zX2Jhc2Ugb2JqZWN0LgorICAgICAqICBAcGFyYW0gIF9faSAgVGhlIGludGVnZXIgcHJvdmlkZWQgd2hlbiB0aGUgY2FsbGJhY2sgd2FzIHJlZ2lzdGVyZWQuCisgICAgICoKKyAgICAgKiAgRXZlbnQgY2FsbGJhY2tzIGFyZSB1c2VyIGRlZmluZWQgZnVuY3Rpb25zIHRoYXQgZ2V0IGNhbGxlZCBkdXJpbmcKKyAgICAgKiAgc2V2ZXJhbCBpb3NfYmFzZSBhbmQgYmFzaWNfaW9zIGZ1bmN0aW9ucywgc3BlY2lmaWNhbGx5IGltYnVlKCksCisgICAgICogIGNvcHlmbXQoKSwgYW5kIH5pb3MoKS4KKyAgICAqLworICAgIHR5cGVkZWYgdm9pZCAoKmV2ZW50X2NhbGxiYWNrKSAoZXZlbnQgX19lLCBpb3NfYmFzZSYgX19iLCBpbnQgX19pKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIEFkZCB0aGUgY2FsbGJhY2sgX19mbiB3aXRoIHBhcmFtZXRlciBfX2luZGV4LgorICAgICAqICBAcGFyYW0gIF9fZm4gIFRoZSBmdW5jdGlvbiB0byBhZGQuCisgICAgICogIEBwYXJhbSAgX19pbmRleCAgVGhlIGludGVnZXIgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gd2hlbiBpbnZva2VkLgorICAgICAqCisgICAgICogIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGFzIGFuIGV2ZW50IGNhbGxiYWNrIHdpdGggYW4gaW50ZWdlciBwYXJhbWV0ZXIgdG8KKyAgICAgKiAgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiB3aGVuIGludm9rZWQuICBNdWx0aXBsZSBjb3BpZXMgb2YgdGhlCisgICAgICogIGZ1bmN0aW9uIGFyZSBhbGxvd2VkLiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNhbGxiYWNrcywgdGhleSBhcmUKKyAgICAgKiAgaW52b2tlZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuCisgICAgKi8KKyAgICB2b2lkCisgICAgcmVnaXN0ZXJfY2FsbGJhY2soZXZlbnRfY2FsbGJhY2sgX19mbiwgaW50IF9faW5kZXgpOworCisgIHByb3RlY3RlZDoKKyAgICBzdHJlYW1zaXplCQlfTV9wcmVjaXNpb247CisgICAgc3RyZWFtc2l6ZQkJX01fd2lkdGg7CisgICAgZm10ZmxhZ3MJCV9NX2ZsYWdzOworICAgIGlvc3RhdGUJCV9NX2V4Y2VwdGlvbjsKKyAgICBpb3N0YXRlCQlfTV9zdHJlYW1idWZfc3RhdGU7CisKKyAgICAvLyAyNy40LjIuNiAgTWVtYmVycyBmb3IgY2FsbGJhY2tzCisgICAgLy8gMjcuNC4yLjYgIGlvc19iYXNlIGNhbGxiYWNrcworICAgIHN0cnVjdCBfQ2FsbGJhY2tfbGlzdAorICAgIHsKKyAgICAgIC8vIERhdGEgTWVtYmVycworICAgICAgX0NhbGxiYWNrX2xpc3QqCQlfTV9uZXh0OworICAgICAgaW9zX2Jhc2U6OmV2ZW50X2NhbGxiYWNrCV9NX2ZuOworICAgICAgaW50CQkJX01faW5kZXg7CisgICAgICBfQXRvbWljX3dvcmQJCV9NX3JlZmNvdW50OyAgLy8gMCBtZWFucyBvbmUgcmVmZXJlbmNlLgorCisgICAgICBfQ2FsbGJhY2tfbGlzdChpb3NfYmFzZTo6ZXZlbnRfY2FsbGJhY2sgX19mbiwgaW50IF9faW5kZXgsCisJCSAgICAgX0NhbGxiYWNrX2xpc3QqIF9fY2IpCisgICAgICA6IF9NX25leHQoX19jYiksIF9NX2ZuKF9fZm4pLCBfTV9pbmRleChfX2luZGV4KSwgX01fcmVmY291bnQoMCkgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2FkZF9yZWZlcmVuY2UoKSB7IF9fZ251X2N4eDo6X19hdG9taWNfYWRkX2Rpc3BhdGNoKCZfTV9yZWZjb3VudCwgMSk7IH0KKworICAgICAgLy8gMCA9PiBPSyB0byBkZWxldGUuCisgICAgICBpbnQKKyAgICAgIF9NX3JlbW92ZV9yZWZlcmVuY2UoKSAKKyAgICAgIHsKKyAgICAgICAgLy8gQmUgcmFjZS1kZXRlY3Rvci1mcmllbmRseS4gIEZvciBtb3JlIGluZm8gc2VlIGJpdHMvYysrY29uZmlnLgorICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoJl9NX3JlZmNvdW50KTsKKyAgICAgICAgaW50IF9fcmVzID0gX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3JlZmNvdW50LCAtMSk7CisgICAgICAgIGlmIChfX3JlcyA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZfTV9yZWZjb3VudCk7CisgICAgICAgICAgfQorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisgICAgfTsKKworICAgICBfQ2FsbGJhY2tfbGlzdCoJX01fY2FsbGJhY2tzOworCisgICAgdm9pZAorICAgIF9NX2NhbGxfY2FsbGJhY2tzKGV2ZW50IF9fZXYpIHRocm93KCk7CisKKyAgICB2b2lkCisgICAgX01fZGlzcG9zZV9jYWxsYmFja3Modm9pZCkgdGhyb3coKTsKKworICAgIC8vIDI3LjQuMi41ICBNZW1iZXJzIGZvciBpd29yZC9wd29yZCBzdG9yYWdlCisgICAgc3RydWN0IF9Xb3JkcworICAgIHsKKyAgICAgIHZvaWQqCV9NX3B3b3JkOworICAgICAgbG9uZwlfTV9pd29yZDsKKyAgICAgIF9Xb3JkcygpIDogX01fcHdvcmQoMCksIF9NX2l3b3JkKDApIHsgfQorICAgIH07CisKKyAgICAvLyBPbmx5IGZvciBmYWlsZWQgaXdvcmQvcHdvcmQgY2FsbHMuCisgICAgX1dvcmRzCQlfTV93b3JkX3plcm87CisKKyAgICAvLyBHdWFyYW50ZWVkIHN0b3JhZ2UuCisgICAgLy8gVGhlIGZpcnN0IDUgaXdvcmQgYW5kIHB3b3JkIHNsb3RzIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLgorICAgIGVudW0geyBfU19sb2NhbF93b3JkX3NpemUgPSA4IH07CisgICAgX1dvcmRzCQlfTV9sb2NhbF93b3JkW19TX2xvY2FsX3dvcmRfc2l6ZV07CisKKyAgICAvLyBBbGxvY2F0ZWQgc3RvcmFnZS4KKyAgICBpbnQJCQlfTV93b3JkX3NpemU7CisgICAgX1dvcmRzKgkJX01fd29yZDsKKworICAgIF9Xb3JkcyYKKyAgICBfTV9ncm93X3dvcmRzKGludCBfX2luZGV4LCBib29sIF9faXdvcmQpOworCisgICAgLy8gTWVtYmVycyBmb3IgbG9jYWxlIGFuZCBsb2NhbGUgY2FjaGluZy4KKyAgICBsb2NhbGUJCV9NX2lvc19sb2NhbGU7CisKKyAgICB2b2lkCisgICAgX01faW5pdCgpIHRocm93KCk7CisKKyAgcHVibGljOgorCisgICAgLy8gMjcuNC4yLjEuNiAgQ2xhc3MgaW9zX2Jhc2U6OkluaXQKKyAgICAvLyBVc2VkIHRvIGluaXRpYWxpemUgc3RhbmRhcmQgc3RyZWFtcy4gSW4gdGhlb3J5LCBnKysgY291bGQgdXNlCisgICAgLy8gLWZpbml0LXByaW9yaXR5IHRvIG9yZGVyIHRoaXMgc3R1ZmYgY29ycmVjdGx5IHdpdGhvdXQgZ29pbmcKKyAgICAvLyB0aHJvdWdoIHRoZXNlIG1hY2hpbmF0aW9ucy4KKyAgICBjbGFzcyBJbml0CisgICAgeworICAgICAgZnJpZW5kIGNsYXNzIGlvc19iYXNlOworICAgIHB1YmxpYzoKKyAgICAgIEluaXQoKTsKKyAgICAgIH5Jbml0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgc3RhdGljIF9BdG9taWNfd29yZAlfU19yZWZjb3VudDsKKyAgICAgIHN0YXRpYyBib29sCQlfU19zeW5jZWRfd2l0aF9zdGRpbzsKKyAgICB9OworCisgICAgLy8gWzI3LjQuMi4yXSBmbXRmbGFncyBzdGF0ZSBmdW5jdGlvbnMKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBBY2Nlc3MgdG8gZm9ybWF0IGZsYWdzLgorICAgICAqICBAcmV0dXJuICBUaGUgZm9ybWF0IGNvbnRyb2wgZmxhZ3MgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dC4KKyAgICAqLworICAgIGZtdGZsYWdzCisgICAgZmxhZ3MoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2ZsYWdzOyB9CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBTZXR0aW5nIG5ldyBmb3JtYXQgZmxhZ3MgYWxsIGF0IG9uY2UuCisgICAgICogIEBwYXJhbSAgX19mbXRmbCAgVGhlIG5ldyBmbGFncyB0byBzZXQuCisgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91cyBmb3JtYXQgY29udHJvbCBmbGFncy4KKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIG92ZXJ3cml0ZXMgYWxsIHRoZSBmb3JtYXQgZmxhZ3Mgd2l0aCBAYSBfX2ZtdGZsLgorICAgICovCisgICAgZm10ZmxhZ3MKKyAgICBmbGFncyhmbXRmbGFncyBfX2ZtdGZsKQorICAgIHsKKyAgICAgIGZtdGZsYWdzIF9fb2xkID0gX01fZmxhZ3M7CisgICAgICBfTV9mbGFncyA9IF9fZm10Zmw7CisgICAgICByZXR1cm4gX19vbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiAgU2V0dGluZyBuZXcgZm9ybWF0IGZsYWdzLgorICAgICAqICBAcGFyYW0gIF9fZm10ZmwgIEFkZGl0aW9uYWwgZmxhZ3MgdG8gc2V0LgorICAgICAqICBAcmV0dXJuICBUaGUgcHJldmlvdXMgZm9ybWF0IGNvbnRyb2wgZmxhZ3MuCisgICAgICoKKyAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZXRzIGFkZGl0aW9uYWwgZmxhZ3MgaW4gZm9ybWF0IGNvbnRyb2wuICBGbGFncyB0aGF0CisgICAgICogIHdlcmUgcHJldmlvdXNseSBzZXQgcmVtYWluIHNldC4KKyAgICAqLworICAgIGZtdGZsYWdzCisgICAgc2V0ZihmbXRmbGFncyBfX2ZtdGZsKQorICAgIHsKKyAgICAgIGZtdGZsYWdzIF9fb2xkID0gX01fZmxhZ3M7CisgICAgICBfTV9mbGFncyB8PSBfX2ZtdGZsOworICAgICAgcmV0dXJuIF9fb2xkOworICAgIH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIFNldHRpbmcgbmV3IGZvcm1hdCBmbGFncy4KKyAgICAgKiAgQHBhcmFtICBfX2ZtdGZsICBBZGRpdGlvbmFsIGZsYWdzIHRvIHNldC4KKyAgICAgKiAgQHBhcmFtICBfX21hc2sgIFRoZSBmbGFncyBtYXNrIGZvciBAYSBmbXRmbC4KKyAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIGZvcm1hdCBjb250cm9sIGZsYWdzLgorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gY2xlYXJzIEBhIG1hc2sgaW4gdGhlIGZvcm1hdCBmbGFncywgdGhlbiBzZXRzCisgICAgICogIEBhIGZtdGZsIEBjICYgQGEgbWFzay4gIEFuIGV4YW1wbGUgbWFzayBpcyBAYyBpb3NfYmFzZTo6YWRqdXN0ZmllbGQuCisgICAgKi8KKyAgICBmbXRmbGFncworICAgIHNldGYoZm10ZmxhZ3MgX19mbXRmbCwgZm10ZmxhZ3MgX19tYXNrKQorICAgIHsKKyAgICAgIGZtdGZsYWdzIF9fb2xkID0gX01fZmxhZ3M7CisgICAgICBfTV9mbGFncyAmPSB+X19tYXNrOworICAgICAgX01fZmxhZ3MgfD0gKF9fZm10ZmwgJiBfX21hc2spOworICAgICAgcmV0dXJuIF9fb2xkOworICAgIH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIENsZWFyaW5nIGZvcm1hdCBmbGFncy4KKyAgICAgKiAgQHBhcmFtICBfX21hc2sgIFRoZSBmbGFncyB0byB1bnNldC4KKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIGNsZWFycyBAYSBfX21hc2sgaW4gdGhlIGZvcm1hdCBmbGFncy4KKyAgICAqLworICAgIHZvaWQKKyAgICB1bnNldGYoZm10ZmxhZ3MgX19tYXNrKQorICAgIHsgX01fZmxhZ3MgJj0gfl9fbWFzazsgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiAgRmxhZ3MgYWNjZXNzLgorICAgICAqICBAcmV0dXJuICBUaGUgcHJlY2lzaW9uIHRvIGdlbmVyYXRlIG9uIGNlcnRhaW4gb3V0cHV0IG9wZXJhdGlvbnMuCisgICAgICoKKyAgICAgKiAgQmUgY2FyZWZ1bCBpZiB5b3UgdHJ5IHRvIGdpdmUgYSBkZWZpbml0aW9uIG9mIEBhIHByZWNpc2lvbiBoZXJlOyBzZWUKKyAgICAgKiAgRFIgMTg5LgorICAgICovCisgICAgc3RyZWFtc2l6ZQorICAgIHByZWNpc2lvbigpIGNvbnN0CisgICAgeyByZXR1cm4gX01fcHJlY2lzaW9uOyB9CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDaGFuZ2luZyBmbGFncy4KKyAgICAgKiAgQHBhcmFtICBfX3ByZWMgIFRoZSBuZXcgcHJlY2lzaW9uIHZhbHVlLgorICAgICAqICBAcmV0dXJuICBUaGUgcHJldmlvdXMgdmFsdWUgb2YgcHJlY2lzaW9uKCkuCisgICAgKi8KKyAgICBzdHJlYW1zaXplCisgICAgcHJlY2lzaW9uKHN0cmVhbXNpemUgX19wcmVjKQorICAgIHsKKyAgICAgIHN0cmVhbXNpemUgX19vbGQgPSBfTV9wcmVjaXNpb247CisgICAgICBfTV9wcmVjaXNpb24gPSBfX3ByZWM7CisgICAgICByZXR1cm4gX19vbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiAgRmxhZ3MgYWNjZXNzLgorICAgICAqICBAcmV0dXJuICBUaGUgbWluaW11bSBmaWVsZCB3aWR0aCB0byBnZW5lcmF0ZSBvbiBvdXRwdXQgb3BlcmF0aW9ucy4KKyAgICAgKgorICAgICAqICA8ZW0+TWluaW11bSBmaWVsZCB3aWR0aDwvZW0+IHJlZmVycyB0byB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMuCisgICAgKi8KKyAgICBzdHJlYW1zaXplCisgICAgd2lkdGgoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3dpZHRoOyB9CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDaGFuZ2luZyBmbGFncy4KKyAgICAgKiAgQHBhcmFtICBfX3dpZGUgIFRoZSBuZXcgd2lkdGggdmFsdWUuCisgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91cyB2YWx1ZSBvZiB3aWR0aCgpLgorICAgICovCisgICAgc3RyZWFtc2l6ZQorICAgIHdpZHRoKHN0cmVhbXNpemUgX193aWRlKQorICAgIHsKKyAgICAgIHN0cmVhbXNpemUgX19vbGQgPSBfTV93aWR0aDsKKyAgICAgIF9NX3dpZHRoID0gX193aWRlOworICAgICAgcmV0dXJuIF9fb2xkOworICAgIH0KKworICAgIC8vIFsyNy40LjIuNF0gaW9zX2Jhc2Ugc3RhdGljIG1lbWJlcnMKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBJbnRlcmFjdGlvbiB3aXRoIHRoZSBzdGFuZGFyZCBDIEkvTyBvYmplY3RzLgorICAgICAqICBAcGFyYW0gIF9fc3luYyAgV2hldGhlciB0byBzeW5jaHJvbml6ZSBvciBub3QuCisgICAgICogIEByZXR1cm4gIFRydWUgaWYgdGhlIHN0YW5kYXJkIHN0cmVhbXMgd2VyZSBwcmV2aW91c2x5IHN5bmNocm9uaXplZC4KKyAgICAgKgorICAgICAqICBUaGUgc3luY2hyb25pemF0aW9uIHJlZmVycmVkIHRvIGlzIEBlIG9ubHkgdGhhdCBiZXR3ZWVuIHRoZSBzdGFuZGFyZAorICAgICAqICBDIGZhY2lsaXRpZXMgKGUuZy4sIHN0ZG91dCkgYW5kIHRoZSBzdGFuZGFyZCBDKysgb2JqZWN0cyAoZS5nLiwKKyAgICAgKiAgY291dCkuICBVc2VyLWRlY2xhcmVkIHN0cmVhbXMgYXJlIHVuYWZmZWN0ZWQuICBTZWUKKyAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQxMWNoMjhzMDIuaHRtbAorICAgICovCisgICAgc3RhdGljIGJvb2wKKyAgICBzeW5jX3dpdGhfc3RkaW8oYm9vbCBfX3N5bmMgPSB0cnVlKTsKKworICAgIC8vIFsyNy40LjIuM10gaW9zX2Jhc2UgbG9jYWxlIGZ1bmN0aW9ucworICAgIC8qKgorICAgICAqICBAYnJpZWYgIFNldHRpbmcgYSBuZXcgbG9jYWxlLgorICAgICAqICBAcGFyYW0gIF9fbG9jICBUaGUgbmV3IGxvY2FsZS4KKyAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIGxvY2FsZS4KKyAgICAgKgorICAgICAqICBTZXRzIHRoZSBuZXcgbG9jYWxlIGZvciB0aGlzIHN0cmVhbSwgYW5kIHRoZW4gaW52b2tlcyBlYWNoIGNhbGxiYWNrCisgICAgICogIHdpdGggaW1idWVfZXZlbnQuCisgICAgKi8KKyAgICBsb2NhbGUKKyAgICBpbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKSB0aHJvdygpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgTG9jYWxlIGFjY2VzcworICAgICAqICBAcmV0dXJuICBBIGNvcHkgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLgorICAgICAqCisgICAgICogIElmIEBjIGltYnVlKGxvYykgaGFzIHByZXZpb3VzbHkgYmVlbiBjYWxsZWQsIHRoZW4gdGhpcyBmdW5jdGlvbgorICAgICAqICByZXR1cm5zIEBjIGxvYy4gIE90aGVyd2lzZSwgaXQgcmV0dXJucyBhIGNvcHkgb2YgQGMgc3RkOjpsb2NhbGUoKSwKKyAgICAgKiAgdGhlIGdsb2JhbCBDKysgbG9jYWxlLgorICAgICovCisgICAgbG9jYWxlCisgICAgZ2V0bG9jKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9pb3NfbG9jYWxlOyB9CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBMb2NhbGUgYWNjZXNzCisgICAgICogIEByZXR1cm4gIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4KKyAgICAgKgorICAgICAqICBMaWtlIGdldGxvYyBhYm92ZSwgYnV0IHJldHVybnMgYSByZWZlcmVuY2UgaW5zdGVhZCBvZgorICAgICAqICBnZW5lcmF0aW5nIGEgY29weS4KKyAgICAqLworICAgIGNvbnN0IGxvY2FsZSYKKyAgICBfTV9nZXRsb2MoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2lvc19sb2NhbGU7IH0KKworICAgIC8vIFsyNy40LjIuNV0gaW9zX2Jhc2Ugc3RvcmFnZSBmdW5jdGlvbnMKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBBY2Nlc3MgdG8gdW5pcXVlIGluZGljZXMuCisgICAgICogIEByZXR1cm4gIEFuIGludGVnZXIgZGlmZmVyZW50IGZyb20gYWxsIHByZXZpb3VzIGNhbGxzLgorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHVuaXF1ZSBpbnRlZ2VyIGV2ZXJ5IHRpbWUgaXQgaXMgY2FsbGVkLiAgSXQKKyAgICAgKiAgY2FuIGJlIHVzZWQgZm9yIGFueSBwdXJwb3NlLCBidXQgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGJlIGEgdW5pcXVlCisgICAgICogIGluZGV4IGZvciB0aGUgaXdvcmQgYW5kIHB3b3JkIGZ1bmN0aW9ucy4gIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0IGFuCisgICAgICogIGFwcGxpY2F0aW9uIGNhbGxzIHhhbGxvYyBpbiBvcmRlciB0byBvYnRhaW4gYW4gaW5kZXggaW4gdGhlIGl3b3JkIGFuZAorICAgICAqICBwd29yZCBhcnJheXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRob3V0IGZlYXIgb2YgY29uZmxpY3QuCisgICAgICoKKyAgICAgKiAgVGhlIGltcGxlbWVudGF0aW9uIG1haW50YWlucyBhIHN0YXRpYyB2YXJpYWJsZSB0aGF0IGlzIGluY3JlbWVudGVkIGFuZAorICAgICAqICByZXR1cm5lZCBvbiBlYWNoIGludm9jYXRpb24uICB4YWxsb2MgaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gYW4gaW5kZXgKKyAgICAgKiAgdGhhdCBpcyBzYWZlIHRvIHVzZSBpbiB0aGUgaXdvcmQgYW5kIHB3b3JkIGFycmF5cy4KKyAgICAqLworICAgIHN0YXRpYyBpbnQKKyAgICB4YWxsb2MoKSB0aHJvdygpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgQWNjZXNzIHRvIGludGVnZXIgYXJyYXkuCisgICAgICogIEBwYXJhbSAgX19peCAgSW5kZXggaW50byB0aGUgYXJyYXkuCisgICAgICogIEByZXR1cm4gIEEgcmVmZXJlbmNlIHRvIGFuIGludGVnZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmRleC4KKyAgICAgKgorICAgICAqICBUaGUgaXdvcmQgZnVuY3Rpb24gcHJvdmlkZXMgYWNjZXNzIHRvIGFuIGFycmF5IG9mIGludGVnZXJzIHRoYXQgY2FuIGJlCisgICAgICogIHVzZWQgZm9yIGFueSBwdXJwb3NlLiAgVGhlIGFycmF5IGdyb3dzIGFzIHJlcXVpcmVkIHRvIGhvbGQgdGhlCisgICAgICogIHN1cHBsaWVkIGluZGV4LiAgQWxsIGludGVnZXJzIGluIHRoZSBhcnJheSBhcmUgaW5pdGlhbGl6ZWQgdG8gMC4KKyAgICAgKgorICAgICAqICBUaGUgaW1wbGVtZW50YXRpb24gcmVzZXJ2ZXMgc2V2ZXJhbCBpbmRpY2VzLiAgWW91IHNob3VsZCB1c2UgeGFsbG9jIHRvCisgICAgICogIG9idGFpbiBhbiBpbmRleCB0aGF0IGlzIHNhZmUgdG8gdXNlLiAgQWxzbyBub3RlIHRoYXQgc2luY2UgdGhlIGFycmF5CisgICAgICogIGNhbiBncm93IGR5bmFtaWNhbGx5LCBpdCBpcyBub3Qgc2FmZSB0byBob2xkIG9udG8gdGhlIHJlZmVyZW5jZS4KKyAgICAqLworICAgIGxvbmcmCisgICAgaXdvcmQoaW50IF9faXgpCisgICAgeworICAgICAgX1dvcmRzJiBfX3dvcmQgPSAoX19peCA8IF9NX3dvcmRfc2l6ZSkKKwkJCT8gX01fd29yZFtfX2l4XSA6IF9NX2dyb3dfd29yZHMoX19peCwgdHJ1ZSk7CisgICAgICByZXR1cm4gX193b3JkLl9NX2l3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIEFjY2VzcyB0byB2b2lkIHBvaW50ZXIgYXJyYXkuCisgICAgICogIEBwYXJhbSAgX19peCAgSW5kZXggaW50byB0aGUgYXJyYXkuCisgICAgICogIEByZXR1cm4gIEEgcmVmZXJlbmNlIHRvIGEgdm9pZCogYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmRleC4KKyAgICAgKgorICAgICAqICBUaGUgcHdvcmQgZnVuY3Rpb24gcHJvdmlkZXMgYWNjZXNzIHRvIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRoYXQgY2FuIGJlCisgICAgICogIHVzZWQgZm9yIGFueSBwdXJwb3NlLiAgVGhlIGFycmF5IGdyb3dzIGFzIHJlcXVpcmVkIHRvIGhvbGQgdGhlCisgICAgICogIHN1cHBsaWVkIGluZGV4LiAgQWxsIHBvaW50ZXJzIGluIHRoZSBhcnJheSBhcmUgaW5pdGlhbGl6ZWQgdG8gMC4KKyAgICAgKgorICAgICAqICBUaGUgaW1wbGVtZW50YXRpb24gcmVzZXJ2ZXMgc2V2ZXJhbCBpbmRpY2VzLiAgWW91IHNob3VsZCB1c2UgeGFsbG9jIHRvCisgICAgICogIG9idGFpbiBhbiBpbmRleCB0aGF0IGlzIHNhZmUgdG8gdXNlLiAgQWxzbyBub3RlIHRoYXQgc2luY2UgdGhlIGFycmF5CisgICAgICogIGNhbiBncm93IGR5bmFtaWNhbGx5LCBpdCBpcyBub3Qgc2FmZSB0byBob2xkIG9udG8gdGhlIHJlZmVyZW5jZS4KKyAgICAqLworICAgIHZvaWQqJgorICAgIHB3b3JkKGludCBfX2l4KQorICAgIHsKKyAgICAgIF9Xb3JkcyYgX193b3JkID0gKF9faXggPCBfTV93b3JkX3NpemUpCisJCQk/IF9NX3dvcmRbX19peF0gOiBfTV9ncm93X3dvcmRzKF9faXgsIGZhbHNlKTsKKyAgICAgIHJldHVybiBfX3dvcmQuX01fcHdvcmQ7CisgICAgfQorCisgICAgLy8gRGVzdHJ1Y3RvcgorICAgIC8qKgorICAgICAqICBJbnZva2VzIGVhY2ggY2FsbGJhY2sgd2l0aCBlcmFzZV9ldmVudC4gIERlc3Ryb3lzIGxvY2FsIHN0b3JhZ2UuCisgICAgICoKKyAgICAgKiAgTm90ZSB0aGF0IHRoZSBpb3NfYmFzZSBvYmplY3QgZm9yIHRoZSBzdGFuZGFyZCBzdHJlYW1zIG5ldmVyIGdldHMKKyAgICAgKiAgZGVzdHJveWVkLiAgQXMgYSByZXN1bHQsIGFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzdGFuZGFyZAorICAgICAqICBzdHJlYW1zIHdpbGwgbm90IGdldCBpbnZva2VkIHdpdGggZXJhc2VfZXZlbnQgKHVubGVzcyBjb3B5Zm10IGlzCisgICAgICogIHVzZWQpLgorICAgICovCisgICAgdmlydHVhbCB+aW9zX2Jhc2UoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgaW9zX2Jhc2UoKSB0aHJvdyAoKTsKKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIDUwLiAgQ29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBvZiBpb3NfYmFzZQorICBwcml2YXRlOgorICAgIGlvc19iYXNlKGNvbnN0IGlvc19iYXNlJik7CisKKyAgICBpb3NfYmFzZSYKKyAgICBvcGVyYXRvcj0oY29uc3QgaW9zX2Jhc2UmKTsKKyAgfTsKKworICAvLyBbMjcuNC41LjFdIGZtdGZsYWdzIG1hbmlwdWxhdG9ycworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjpib29sYWxwaGEpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIGJvb2xhbHBoYShpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OmJvb2xhbHBoYSk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnVuc2V0Zihpb3NfYmFzZTo6Ym9vbGFscGhhKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBub2Jvb2xhbHBoYShpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6Ym9vbGFscGhhKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6c2hvd2Jhc2UpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIHNob3diYXNlKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6c2hvd2Jhc2UpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS51bnNldGYoaW9zX2Jhc2U6OnNob3diYXNlKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBub3Nob3diYXNlKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2UudW5zZXRmKGlvc19iYXNlOjpzaG93YmFzZSk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OnNob3dwb2ludCkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgc2hvd3BvaW50KGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6c2hvd3BvaW50KTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2UudW5zZXRmKGlvc19iYXNlOjpzaG93cG9pbnQpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIG5vc2hvd3BvaW50KGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2UudW5zZXRmKGlvc19iYXNlOjpzaG93cG9pbnQpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjpzaG93cG9zKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBzaG93cG9zKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6c2hvd3Bvcyk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnVuc2V0Zihpb3NfYmFzZTo6c2hvd3BvcykuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgbm9zaG93cG9zKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2UudW5zZXRmKGlvc19iYXNlOjpzaG93cG9zKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6c2tpcHdzKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBza2lwd3MoaW9zX2Jhc2UmIF9fYmFzZSkKKyAgeworICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjpza2lwd3MpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS51bnNldGYoaW9zX2Jhc2U6OnNraXB3cykuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgbm9za2lwd3MoaW9zX2Jhc2UmIF9fYmFzZSkKKyAgeworICAgIF9fYmFzZS51bnNldGYoaW9zX2Jhc2U6OnNraXB3cyk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OnVwcGVyY2FzZSkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgdXBwZXJjYXNlKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6dXBwZXJjYXNlKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2UudW5zZXRmKGlvc19iYXNlOjp1cHBlcmNhc2UpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIG5vdXBwZXJjYXNlKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2UudW5zZXRmKGlvc19iYXNlOjp1cHBlcmNhc2UpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjp1bml0YnVmKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICB1bml0YnVmKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnVuaXRidWYpOworICAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2UudW5zZXRmKGlvc19iYXNlOjp1bml0YnVmKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBub3VuaXRidWYoaW9zX2Jhc2UmIF9fYmFzZSkKKyAgeworICAgICBfX2Jhc2UudW5zZXRmKGlvc19iYXNlOjp1bml0YnVmKTsKKyAgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vIFsyNy40LjUuMl0gYWRqdXN0ZmllbGQgbWFuaXB1bGF0b3JzCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OmludGVybmFsLCBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIGludGVybmFsKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OmludGVybmFsLCBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpOworICAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6bGVmdCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBsZWZ0KGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6bGVmdCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6cmlnaHQsIGlvc19iYXNlOjphZGp1c3RmaWVsZCkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgcmlnaHQoaW9zX2Jhc2UmIF9fYmFzZSkKKyAgeworICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjpyaWdodCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8gWzI3LjQuNS4zXSBiYXNlZmllbGQgbWFuaXB1bGF0b3JzCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OmRlYywgaW9zX2Jhc2U6OmJhc2VmaWVsZCkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgZGVjKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6ZGVjLCBpb3NfYmFzZTo6YmFzZWZpZWxkKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6aGV4LCBpb3NfYmFzZTo6YmFzZWZpZWxkKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBoZXgoaW9zX2Jhc2UmIF9fYmFzZSkKKyAgeworICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjpoZXgsIGlvc19iYXNlOjpiYXNlZmllbGQpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjpvY3QsIGlvc19iYXNlOjpiYXNlZmllbGQpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIG9jdChpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6Om9jdCwgaW9zX2Jhc2U6OmJhc2VmaWVsZCk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vIFsyNy40LjUuNF0gZmxvYXRmaWVsZCBtYW5pcHVsYXRvcnMKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6Zml4ZWQsIGlvc19iYXNlOjpmbG9hdGZpZWxkKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBmaXhlZChpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OmZpeGVkLCBpb3NfYmFzZTo6ZmxvYXRmaWVsZCk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OnNjaWVudGlmaWMsIGlvc19iYXNlOjpmbG9hdGZpZWxkKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBzY2llbnRpZmljKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6c2NpZW50aWZpYywgaW9zX2Jhc2U6OmZsb2F0ZmllbGQpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0lPU19CQVNFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9pc3RyZWFtLnRjYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9pc3RyZWFtLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTA3MzAxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2lzdHJlYW0udGNjCkBAIC0wLDAgKzEsMTA5MiBAQAorLy8gaXN0cmVhbSBjbGFzc2VzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2lzdHJlYW0udGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aXN0cmVhbX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuNi4xICBJbnB1dCBzdHJlYW1zCisvLworCisjaWZuZGVmIF9JU1RSRUFNX1RDQworI2RlZmluZSBfSVNUUkVBTV9UQ0MgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2N4eGFiaV9mb3JjZWQuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeTo6CisgICAgc2VudHJ5KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pbiwgYm9vbCBfX25vc2tpcCkgOiBfTV9vayhmYWxzZSkKKyAgICB7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgaWYgKF9faW4uZ29vZCgpKQorCXsKKwkgIGlmIChfX2luLnRpZSgpKQorCSAgICBfX2luLnRpZSgpLT5mbHVzaCgpOworCSAgaWYgKCFfX25vc2tpcCAmJiBib29sKF9faW4uZmxhZ3MoKSAmIGlvc19iYXNlOjpza2lwd3MpKQorCSAgICB7CisJICAgICAgY29uc3QgX19pbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gX19pbi5yZGJ1ZigpOworCSAgICAgIF9faW50X3R5cGUgX19jID0gX19zYi0+c2dldGMoKTsKKworCSAgICAgIGNvbnN0IF9fY3R5cGVfdHlwZSYgX19jdCA9IF9fY2hlY2tfZmFjZXQoX19pbi5fTV9jdHlwZSk7CisJICAgICAgd2hpbGUgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikKKwkJICAgICAmJiBfX2N0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCAKKwkJCQl0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYykpKQorCQlfX2MgPSBfX3NiLT5zbmV4dGMoKTsKKworCSAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgICAgICAvLyAxOTUuIFNob3VsZCBiYXNpY19pc3RyZWFtOjpzZW50cnkncyBjb25zdHJ1Y3RvciBldmVyCisJICAgICAgLy8gc2V0IGVvZmJpdD8KKwkgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCSAgICB9CisJfQorCisgICAgICBpZiAoX19pbi5nb29kKCkgJiYgX19lcnIgPT0gaW9zX2Jhc2U6Omdvb2RiaXQpCisJX01fb2sgPSB0cnVlOworICAgICAgZWxzZQorCXsKKwkgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCSAgX19pbi5zZXRzdGF0ZShfX2Vycik7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlVD4KKyAgICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgICBfTV9leHRyYWN0KF9WYWx1ZVQmIF9fdikKKyAgICAgIHsKKwlzZW50cnkgX19jZXJiKCp0aGlzLCBmYWxzZSk7CisJaWYgKF9fY2VyYikKKwkgIHsKKwkgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgICAgX190cnkKKwkgICAgICB7CisJCWNvbnN0IF9fbnVtX2dldF90eXBlJiBfX25nID0gX19jaGVja19mYWNldCh0aGlzLT5fTV9udW1fZ2V0KTsKKwkJX19uZy5nZXQoKnRoaXMsIDAsICp0aGlzLCBfX2VyciwgX192KTsKKwkgICAgICB9CisJICAgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgICB7CisJCXRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCQlfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgICB9CisJICAgIF9fY2F0Y2goLi4uKQorCSAgICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgICAgaWYgKF9fZXJyKQorCSAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwkgIH0KKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIG9wZXJhdG9yPj4oc2hvcnQmIF9fbikKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMTguIGJhc2ljX2lzdHJlYW0gdXNlcyBub25leGlzdGVudCBudW1fZ2V0IG1lbWJlciBmdW5jdGlvbnMuCisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCBmYWxzZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgbG9uZyBfX2w7CisJICAgICAgY29uc3QgX19udW1fZ2V0X3R5cGUmIF9fbmcgPSBfX2NoZWNrX2ZhY2V0KHRoaXMtPl9NX251bV9nZXQpOworCSAgICAgIF9fbmcuZ2V0KCp0aGlzLCAwLCAqdGhpcywgX19lcnIsIF9fbCk7CisKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gNjk2LiBpc3RyZWFtOjpvcGVyYXRvcj4+KGludCYpIGJyb2tlbi4KKwkgICAgICBpZiAoX19sIDwgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHNob3J0Pjo6X19taW4pCisJCXsKKwkJICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkJICBfX24gPSBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8c2hvcnQ+OjpfX21pbjsKKwkJfQorCSAgICAgIGVsc2UgaWYgKF9fbCA+IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxzaG9ydD46Ol9fbWF4KQorCQl7CisJCSAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJCSAgX19uID0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHNob3J0Pjo6X19tYXg7CisJCX0KKwkgICAgICBlbHNlCisJCV9fbiA9IHNob3J0KF9fbCk7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgb3BlcmF0b3I+PihpbnQmIF9fbikKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMTguIGJhc2ljX2lzdHJlYW0gdXNlcyBub25leGlzdGVudCBudW1fZ2V0IG1lbWJlciBmdW5jdGlvbnMuCisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCBmYWxzZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgbG9uZyBfX2w7CisJICAgICAgY29uc3QgX19udW1fZ2V0X3R5cGUmIF9fbmcgPSBfX2NoZWNrX2ZhY2V0KHRoaXMtPl9NX251bV9nZXQpOworCSAgICAgIF9fbmcuZ2V0KCp0aGlzLCAwLCAqdGhpcywgX19lcnIsIF9fbCk7CisKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gNjk2LiBpc3RyZWFtOjpvcGVyYXRvcj4+KGludCYpIGJyb2tlbi4KKwkgICAgICBpZiAoX19sIDwgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGludD46Ol9fbWluKQorCQl7CisJCSAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJCSAgX19uID0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGludD46Ol9fbWluOworCQl9CisJICAgICAgZWxzZSBpZiAoX19sID4gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGludD46Ol9fbWF4KQorCQl7CisJCSAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CSAgICAgIAorCQkgIF9fbiA9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21heDsKKwkJfQorCSAgICAgIGVsc2UKKwkJX19uID0gaW50KF9fbCk7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgb3BlcmF0b3I+PihfX3N0cmVhbWJ1Zl90eXBlKiBfX3Nib3V0KQorICAgIHsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCBmYWxzZSk7CisgICAgICBpZiAoX19jZXJiICYmIF9fc2JvdXQpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIGJvb2wgX19pbmVvZjsKKwkgICAgICBpZiAoIV9fY29weV9zdHJlYW1idWZzX2VvZih0aGlzLT5yZGJ1ZigpLCBfX3Nib3V0LCBfX2luZW9mKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgICAgaWYgKF9faW5lb2YpCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOyB9CisJfQorICAgICAgZWxzZSBpZiAoIV9fc2JvdXQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBpZiAoX19lcnIpCisJdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgZ2V0KHZvaWQpCisgICAgeworICAgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICBpbnRfdHlwZSBfX2MgPSBfX2VvZjsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBfX2MgPSB0aGlzLT5yZGJ1ZigpLT5zYnVtcGMoKTsKKwkgICAgICAvLyAyNy42LjEuMSBwYXJhZ3JhcGggMworCSAgICAgIGlmICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQlfTV9nY291bnQgPSAxOworCSAgICAgIGVsc2UKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJfQorICAgICAgaWYgKCFfTV9nY291bnQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBpZiAoX19lcnIpCisJdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuIF9fYzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGdldChjaGFyX3R5cGUmIF9fYykKKyAgICB7CisgICAgICBfTV9nY291bnQgPSAwOworICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgY29uc3QgaW50X3R5cGUgX19jYiA9IHRoaXMtPnJkYnVmKCktPnNidW1wYygpOworCSAgICAgIC8vIDI3LjYuMS4xIHBhcmFncmFwaCAzCisJICAgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jYiwgdHJhaXRzX3R5cGU6OmVvZigpKSkKKwkJeworCQkgIF9NX2djb3VudCA9IDE7CisJCSAgX19jID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2NiKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJfQorICAgICAgaWYgKCFfTV9nY291bnQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBpZiAoX19lcnIpCisJdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgZ2V0KGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbiwgY2hhcl90eXBlIF9fZGVsaW0pCisgICAgeworICAgICAgX01fZ2NvdW50ID0gMDsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIGNvbnN0IGludF90eXBlIF9faWRlbGltID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKF9fZGVsaW0pOworCSAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworCSAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSB0aGlzLT5yZGJ1ZigpOworCSAgICAgIGludF90eXBlIF9fYyA9IF9fc2ItPnNnZXRjKCk7CisKKwkgICAgICB3aGlsZSAoX01fZ2NvdW50ICsgMSA8IF9fbgorCQkgICAgICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikKKwkJICAgICAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19pZGVsaW0pKQorCQl7CisJCSAgKl9fcysrID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgICsrX01fZ2NvdW50OworCQkgIF9fYyA9IF9fc2ItPnNuZXh0YygpOworCQl9CisJICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJfQorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjQzLiBnZXQgYW5kIGdldGxpbmUgd2hlbiBzZW50cnkgcmVwb3J0cyBmYWlsdXJlLgorICAgICAgaWYgKF9fbiA+IDApCisJKl9fcyA9IGNoYXJfdHlwZSgpOworICAgICAgaWYgKCFfTV9nY291bnQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBpZiAoX19lcnIpCisJdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgZ2V0KF9fc3RyZWFtYnVmX3R5cGUmIF9fc2IsIGNoYXJfdHlwZSBfX2RlbGltKQorICAgIHsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2lkZWxpbSA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZShfX2RlbGltKTsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3RoaXNfc2IgPSB0aGlzLT5yZGJ1ZigpOworCSAgICAgIGludF90eXBlIF9fYyA9IF9fdGhpc19zYi0+c2dldGMoKTsKKwkgICAgICBjaGFyX3R5cGUgX19jMiA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKworCSAgICAgIHdoaWxlICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpCisJCSAgICAgJiYgIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9faWRlbGltKQorCQkgICAgICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19zYi5zcHV0YyhfX2MyKSwgX19lb2YpKQorCQl7CisJCSAgKytfTV9nY291bnQ7CisJCSAgX19jID0gX190aGlzX3NiLT5zbmV4dGMoKTsKKwkJICBfX2MyID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworCQl9CisJICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJfQorICAgICAgaWYgKCFfTV9nY291bnQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBpZiAoX19lcnIpCisJdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgZ2V0bGluZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24sIGNoYXJfdHlwZSBfX2RlbGltKQorICAgIHsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CisgICAgICBpZiAoX19jZXJiKQorICAgICAgICB7CisgICAgICAgICAgX190cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgaW50X3R5cGUgX19pZGVsaW0gPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX19kZWxpbSk7CisgICAgICAgICAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgICAgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gdGhpcy0+cmRidWYoKTsKKyAgICAgICAgICAgICAgaW50X3R5cGUgX19jID0gX19zYi0+c2dldGMoKTsKKworICAgICAgICAgICAgICB3aGlsZSAoX01fZ2NvdW50ICsgMSA8IF9fbgorICAgICAgICAgICAgICAgICAgICAgJiYgIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKQorICAgICAgICAgICAgICAgICAgICAgJiYgIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9faWRlbGltKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAqX19zKysgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisgICAgICAgICAgICAgICAgICBfX2MgPSBfX3NiLT5zbmV4dGMoKTsKKyAgICAgICAgICAgICAgICAgICsrX01fZ2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkKKyAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9faWRlbGltKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIF9fc2ItPnNidW1wYygpOworICAgICAgICAgICAgICAgICAgICAgICsrX01fZ2NvdW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisgICAgICAgICAgX19jYXRjaCguLi4pCisgICAgICAgICAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisgICAgICAgIH0KKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDI0My4gZ2V0IGFuZCBnZXRsaW5lIHdoZW4gc2VudHJ5IHJlcG9ydHMgZmFpbHVyZS4KKyAgICAgIGlmIChfX24gPiAwKQorCSpfX3MgPSBjaGFyX3R5cGUoKTsKKyAgICAgIGlmICghX01fZ2NvdW50KQorICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgIGlmIChfX2VycikKKyAgICAgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAvLyBXZSBwcm92aWRlIHRocmVlIG92ZXJsb2Fkcywgc2luY2UgdGhlIGZpcnN0IHR3byBhcmUgbXVjaCBzaW1wbGVyCisgIC8vIHRoYW4gdGhlIGdlbmVyYWwgY2FzZS4gQWxzbywgdGhlIGxhdHRlciB0d28gY2FuIHRodXMgYWRvcHQgdGhlCisgIC8vIHNhbWUgImJhdGNoeSIgc3RyYXRlZ3kgdXNlZCBieSBnZXRsaW5lIGFib3ZlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgaWdub3JlKHZvaWQpCisgICAgeworICAgICAgX01fZ2NvdW50ID0gMDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworCSAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSB0aGlzLT5yZGJ1ZigpOworCisJICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX3NiLT5zYnVtcGMoKSwgX19lb2YpKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCSAgICAgIGVsc2UKKwkJX01fZ2NvdW50ID0gMTsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBpZ25vcmUoc3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgX01fZ2NvdW50ID0gMDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYiAmJiBfX24gPiAwKQorICAgICAgICB7CisgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgICAgICBfX3RyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgICAgICAgICAgX19zdHJlYW1idWZfdHlwZSogX19zYiA9IHRoaXMtPnJkYnVmKCk7CisgICAgICAgICAgICAgIGludF90eXBlIF9fYyA9IF9fc2ItPnNnZXRjKCk7CisKKwkgICAgICAvLyBOLkIuIE9uIExGUy1lbmFibGVkIHBsYXRmb3JtcyBzdHJlYW1zaXplIGlzIHN0aWxsIDMyIGJpdHMKKwkgICAgICAvLyB3aWRlOiBpZiB3ZSB3YW50IHRvIGltcGxlbWVudCB0aGUgc3RhbmRhcmQgbWFuZGF0ZWQgYmVoYXZpb3IKKwkgICAgICAvLyBmb3IgbiA9PSBtYXgoKSAoc2VlIDI3LjYuMS4zLzI0KSB3ZSBhcmUgYXQgcmlzayBvZiBzaWduZWQKKwkgICAgICAvLyBpbnRlZ2VyIG92ZXJmbG93OiB0aHVzIHRoZXNlIGNvbnRvcnRpb25zLiBBbHNvIG5vdGUgdGhhdCwKKwkgICAgICAvLyBieSBkZWZpbml0aW9uLCB3aGVuIG1vcmUgdGhhbiAyRyBjaGFycyBhcmUgYWN0dWFsbHkgaWdub3JlZCwKKwkgICAgICAvLyBfTV9nY291bnQgKHRoZSByZXR1cm4gdmFsdWUgb2YgZ2NvdW50LCB0aGF0IGlzKSBjYW5ub3QgYmUKKwkgICAgICAvLyByZWFsbHkgY29ycmVjdCwgYmVpbmcgdW5hdm9pZGFibHkgdG9vIHNtYWxsLgorCSAgICAgIGJvb2wgX19sYXJnZV9pZ25vcmUgPSBmYWxzZTsKKwkgICAgICB3aGlsZSAodHJ1ZSkKKwkJeworCQkgIHdoaWxlIChfTV9nY291bnQgPCBfX24KKwkJCSAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQkgICAgeworCQkgICAgICArK19NX2djb3VudDsKKwkJICAgICAgX19jID0gX19zYi0+c25leHRjKCk7CisJCSAgICB9CisJCSAgaWYgKF9fbiA9PSBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8c3RyZWFtc2l6ZT46Ol9fbWF4CisJCSAgICAgICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisJCSAgICB7CisJCSAgICAgIF9NX2djb3VudCA9CisJCQlfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8c3RyZWFtc2l6ZT46Ol9fbWluOworCQkgICAgICBfX2xhcmdlX2lnbm9yZSA9IHRydWU7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgYnJlYWs7CisJCX0KKworCSAgICAgIGlmIChfX2xhcmdlX2lnbm9yZSkKKwkJX01fZ2NvdW50ID0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHN0cmVhbXNpemU+OjpfX21heDsKKworCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisgICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgICAgICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisgICAgICAgICAgX19jYXRjaCguLi4pCisgICAgICAgICAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisgICAgICAgICAgaWYgKF9fZXJyKQorICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBpZ25vcmUoc3RyZWFtc2l6ZSBfX24sIGludF90eXBlIF9fZGVsaW0pCisgICAgeworICAgICAgX01fZ2NvdW50ID0gMDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYiAmJiBfX24gPiAwKQorICAgICAgICB7CisgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgICAgICBfX3RyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgICAgICAgICAgX19zdHJlYW1idWZfdHlwZSogX19zYiA9IHRoaXMtPnJkYnVmKCk7CisgICAgICAgICAgICAgIGludF90eXBlIF9fYyA9IF9fc2ItPnNnZXRjKCk7CisKKwkgICAgICAvLyBTZWUgY29tbWVudCBhYm92ZS4KKwkgICAgICBib29sIF9fbGFyZ2VfaWdub3JlID0gZmFsc2U7CisJICAgICAgd2hpbGUgKHRydWUpCisJCXsKKwkJICB3aGlsZSAoX01fZ2NvdW50IDwgX19uCisJCQkgJiYgIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKQorCQkJICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2RlbGltKSkKKwkJICAgIHsKKwkJICAgICAgKytfTV9nY291bnQ7CisJCSAgICAgIF9fYyA9IF9fc2ItPnNuZXh0YygpOworCQkgICAgfQorCQkgIGlmIChfX24gPT0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHN0cmVhbXNpemU+OjpfX21heAorCQkgICAgICAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpCisJCSAgICAgICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2RlbGltKSkKKwkJICAgIHsKKwkJICAgICAgX01fZ2NvdW50ID0KKwkJCV9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxzdHJlYW1zaXplPjo6X19taW47CisJCSAgICAgIF9fbGFyZ2VfaWdub3JlID0gdHJ1ZTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBicmVhazsKKwkJfQorCisJICAgICAgaWYgKF9fbGFyZ2VfaWdub3JlKQorCQlfTV9nY291bnQgPSBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8c3RyZWFtc2l6ZT46Ol9fbWF4OworCisgICAgICAgICAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisgICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgICBlbHNlIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2RlbGltKSkKKwkJeworCQkgIGlmIChfTV9nY291bnQKKwkJICAgICAgPCBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8c3RyZWFtc2l6ZT46Ol9fbWF4KQorCQkgICAgKytfTV9nY291bnQ7CisJCSAgX19zYi0+c2J1bXBjKCk7CisJCX0KKyAgICAgICAgICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisgICAgICAgICAgX19jYXRjaCguLi4pCisgICAgICAgICAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisgICAgICAgICAgaWYgKF9fZXJyKQorICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBwZWVrKHZvaWQpCisgICAgeworICAgICAgaW50X3R5cGUgX19jID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgX01fZ2NvdW50ID0gMDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIF9fYyA9IHRoaXMtPnJkYnVmKCktPnNnZXRjKCk7CisJICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIHRyYWl0c190eXBlOjplb2YoKSkpCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJfQorICAgICAgcmV0dXJuIF9fYzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHJlYWQoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgIHsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBfTV9nY291bnQgPSB0aGlzLT5yZGJ1ZigpLT5zZ2V0bihfX3MsIF9fbik7CisJICAgICAgaWYgKF9NX2djb3VudCAhPSBfX24pCisJCV9fZXJyIHw9IChpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cmVhbXNpemUKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHJlYWRzb21lKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICBfTV9nY291bnQgPSAwOworICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgLy8gQ2Fubm90IGNvbXBhcmUgaW50X3R5cGUgd2l0aCBzdHJlYW1zaXplIGdlbmVyaWNhbGx5LgorCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19udW0gPSB0aGlzLT5yZGJ1ZigpLT5pbl9hdmFpbCgpOworCSAgICAgIGlmIChfX251bSA+IDApCisJCV9NX2djb3VudCA9IHRoaXMtPnJkYnVmKCktPnNnZXRuKF9fcywgc3RkOjptaW4oX19udW0sIF9fbikpOworCSAgICAgIGVsc2UgaWYgKF9fbnVtID09IC0xKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiBfTV9nY291bnQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBwdXRiYWNrKGNoYXJfdHlwZSBfX2MpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNjAuIFdoYXQgaXMgYSBmb3JtYXR0ZWQgaW5wdXQgZnVuY3Rpb24/CisgICAgICBfTV9nY291bnQgPSAwOworICAgICAgLy8gQ2xlYXIgZW9mYml0IHBlciBOMzE2OC4KKyAgICAgIHRoaXMtPmNsZWFyKHRoaXMtPnJkc3RhdGUoKSAmIH5pb3NfYmFzZTo6ZW9mYml0KTsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworCSAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSB0aGlzLT5yZGJ1ZigpOworCSAgICAgIGlmICghX19zYgorCQkgIHx8IHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX3NiLT5zcHV0YmFja2MoX19jKSwgX19lb2YpKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6YmFkYml0OworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHVuZ2V0KHZvaWQpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNjAuIFdoYXQgaXMgYSBmb3JtYXR0ZWQgaW5wdXQgZnVuY3Rpb24/CisgICAgICBfTV9nY291bnQgPSAwOworICAgICAgLy8gQ2xlYXIgZW9mYml0IHBlciBOMzE2OC4KKyAgICAgIHRoaXMtPmNsZWFyKHRoaXMtPnJkc3RhdGUoKSAmIH5pb3NfYmFzZTo6ZW9mYml0KTsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworCSAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSB0aGlzLT5yZGJ1ZigpOworCSAgICAgIGlmICghX19zYgorCQkgIHx8IHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX3NiLT5zdW5nZXRjKCksIF9fZW9mKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmJhZGJpdDsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbnQKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHN5bmModm9pZCkKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUjYwLiAgRG8gbm90IGNoYW5nZSBfTV9nY291bnQuCisgICAgICBpbnQgX19yZXQgPSAtMTsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSB0aGlzLT5yZGJ1ZigpOworCSAgICAgIGlmIChfX3NiKQorCQl7CisJCSAgaWYgKF9fc2ItPnB1YnN5bmMoKSA9PSAtMSkKKwkJICAgIF9fZXJyIHw9IGlvc19iYXNlOjpiYWRiaXQ7CisJCSAgZWxzZQorCQkgICAgX19yZXQgPSAwOworCQl9CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojpwb3NfdHlwZQorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgdGVsbGcodm9pZCkKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUjYwLiAgRG8gbm90IGNoYW5nZSBfTV9nY291bnQuCisgICAgICBwb3NfdHlwZSBfX3JldCA9IHBvc190eXBlKC0xKTsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgaWYgKCF0aGlzLT5mYWlsKCkpCisJCV9fcmV0ID0gdGhpcy0+cmRidWYoKS0+cHVic2Vla29mZigwLCBpb3NfYmFzZTo6Y3VyLAorCQkJCQkJICBpb3NfYmFzZTo6aW4pOworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzZWVrZyhwb3NfdHlwZSBfX3BvcykKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUjYwLiAgRG8gbm90IGNoYW5nZSBfTV9nY291bnQuCisgICAgICAvLyBDbGVhciBlb2ZiaXQgcGVyIE4zMTY4LgorICAgICAgdGhpcy0+Y2xlYXIodGhpcy0+cmRzdGF0ZSgpICYgfmlvc19iYXNlOjplb2ZiaXQpOworICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgaWYgKCF0aGlzLT5mYWlsKCkpCisJCXsKKwkJICAvLyAxMzYuICBzZWVrcCwgc2Vla2cgc2V0dGluZyB3cm9uZyBzdHJlYW1zPworCQkgIGNvbnN0IHBvc190eXBlIF9fcCA9IHRoaXMtPnJkYnVmKCktPnB1YnNlZWtwb3MoX19wb3MsCisJCQkJCQkJCSBpb3NfYmFzZTo6aW4pOworCQkgIAorCQkgIC8vIDEyOS4gIE5lZWQgZXJyb3IgaW5kaWNhdGlvbiBmcm9tIHNlZWtwKCkgYW5kIHNlZWtnKCkKKwkJICBpZiAoX19wID09IHBvc190eXBlKG9mZl90eXBlKC0xKSkpCisJCSAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkJfQorCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHNlZWtnKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX2RpcikKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUjYwLiAgRG8gbm90IGNoYW5nZSBfTV9nY291bnQuCisgICAgICAvLyBDbGVhciBlb2ZiaXQgcGVyIE4zMTY4LgorICAgICAgdGhpcy0+Y2xlYXIodGhpcy0+cmRzdGF0ZSgpICYgfmlvc19iYXNlOjplb2ZiaXQpOworICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgaWYgKCF0aGlzLT5mYWlsKCkpCisJCXsKKwkJICAvLyAxMzYuICBzZWVrcCwgc2Vla2cgc2V0dGluZyB3cm9uZyBzdHJlYW1zPworCQkgIGNvbnN0IHBvc190eXBlIF9fcCA9IHRoaXMtPnJkYnVmKCktPnB1YnNlZWtvZmYoX19vZmYsIF9fZGlyLAorCQkJCQkJCQkgaW9zX2Jhc2U6OmluKTsKKwkgICAgICAKKwkJICAvLyAxMjkuICBOZWVkIGVycm9yIGluZGljYXRpb24gZnJvbSBzZWVrcCgpIGFuZCBzZWVrZygpCisJCSAgaWYgKF9fcCA9PSBwb3NfdHlwZShvZmZfdHlwZSgtMSkpKQorCQkgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJCX0KKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIC8vIDI3LjYuMS4yLjMgQ2hhcmFjdGVyIGV4dHJhY3Rpb24gdGVtcGxhdGVzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sIF9DaGFyVCYgX19jKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CQlfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OmludF90eXBlICAgICAgICAgX19pbnRfdHlwZTsKKworICAgICAgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OnNlbnRyeSBfX2NlcmIoX19pbiwgZmFsc2UpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGNvbnN0IF9faW50X3R5cGUgX19jYiA9IF9faW4ucmRidWYoKS0+c2J1bXBjKCk7CisJICAgICAgaWYgKCFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2NiLCBfVHJhaXRzOjplb2YoKSkpCisJCV9fYyA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2NiKTsKKwkgICAgICBlbHNlCisJCV9fZXJyIHw9IChpb3NfYmFzZTo6ZW9mYml0IHwgaW9zX2Jhc2U6OmZhaWxiaXQpOworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICBfX2luLl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyBfX2luLl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIF9faW4uc2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiBfX2luOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luLCBfQ2hhclQqIF9fcykKKyAgICB7CisgICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgkJX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgIF9fc3RyZWFtYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGN0eXBlPF9DaGFyVD4JCQkJX19jdHlwZV90eXBlOworCisgICAgICBzdHJlYW1zaXplIF9fZXh0cmFjdGVkID0gMDsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6c2VudHJ5IF9fY2VyYihfX2luLCBmYWxzZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICAvLyBGaWd1cmUgb3V0IGhvdyBtYW55IGNoYXJhY3RlcnMgdG8gZXh0cmFjdC4KKwkgICAgICBzdHJlYW1zaXplIF9fbnVtID0gX19pbi53aWR0aCgpOworCSAgICAgIGlmIChfX251bSA8PSAwKQorCQlfX251bSA9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxzdHJlYW1zaXplPjo6X19tYXg7CisKKwkgICAgICBjb25zdCBfX2N0eXBlX3R5cGUmIF9fY3QgPSB1c2VfZmFjZXQ8X19jdHlwZV90eXBlPihfX2luLmdldGxvYygpKTsKKworCSAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisJICAgICAgX19zdHJlYW1idWZfdHlwZSogX19zYiA9IF9faW4ucmRidWYoKTsKKwkgICAgICBpbnRfdHlwZSBfX2MgPSBfX3NiLT5zZ2V0YygpOworCisJICAgICAgd2hpbGUgKF9fZXh0cmFjdGVkIDwgX19udW0gLSAxCisJCSAgICAgJiYgIV9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpCisJCSAgICAgJiYgIV9fY3QuaXMoY3R5cGVfYmFzZTo6c3BhY2UsCisJCQkJIF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkKKwkJeworCQkgICpfX3MrKyA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgICsrX19leHRyYWN0ZWQ7CisJCSAgX19jID0gX19zYi0+c25leHRjKCk7CisJCX0KKwkgICAgICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gNjguICBFeHRyYWN0b3JzIGZvciBjaGFyKiBzaG91bGQgc3RvcmUgbnVsbCBhdCBlbmQKKwkgICAgICAqX19zID0gY2hhcl90eXBlKCk7CisJICAgICAgX19pbi53aWR0aCgwKTsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgX19pbi5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgX19pbi5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCX0KKyAgICAgIGlmICghX19leHRyYWN0ZWQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBpZiAoX19lcnIpCisJX19pbi5zZXRzdGF0ZShfX2Vycik7CisgICAgICByZXR1cm4gX19pbjsKKyAgICB9CisKKyAgLy8gMjcuNi4xLjQgU3RhbmRhcmQgYmFzaWNfaXN0cmVhbSBtYW5pcHVsYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICB3cyhiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4pCisgICAgeworICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4JCV9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICBfX3N0cmVhbWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW50X3R5cGUJCV9faW50X3R5cGU7CisgICAgICB0eXBlZGVmIGN0eXBlPF9DaGFyVD4JCQkJX19jdHlwZV90eXBlOworCisgICAgICBjb25zdCBfX2N0eXBlX3R5cGUmIF9fY3QgPSB1c2VfZmFjZXQ8X19jdHlwZV90eXBlPihfX2luLmdldGxvYygpKTsKKyAgICAgIGNvbnN0IF9faW50X3R5cGUgX19lb2YgPSBfVHJhaXRzOjplb2YoKTsKKyAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSBfX2luLnJkYnVmKCk7CisgICAgICBfX2ludF90eXBlIF9fYyA9IF9fc2ItPnNnZXRjKCk7CisKKyAgICAgIHdoaWxlICghX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikKKwkgICAgICYmIF9fY3QuaXMoY3R5cGVfYmFzZTo6c3BhY2UsIF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpKSkKKwlfX2MgPSBfX3NiLT5zbmV4dGMoKTsKKworICAgICAgIGlmIChfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkKKwkgX19pbi5zZXRzdGF0ZShpb3NfYmFzZTo6ZW9mYml0KTsKKyAgICAgIHJldHVybiBfX2luOworICAgIH0KKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX2lzdHJlYW08Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiB3cyhpc3RyZWFtJik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCBjaGFyJik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCBjaGFyKik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCB1bnNpZ25lZCBjaGFyJik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCBzaWduZWQgY2hhciYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgdW5zaWduZWQgY2hhciopOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgc2lnbmVkIGNoYXIqKTsKKworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgaXN0cmVhbTo6X01fZXh0cmFjdCh1bnNpZ25lZCBzaG9ydCYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgaXN0cmVhbTo6X01fZXh0cmFjdCh1bnNpZ25lZCBpbnQmKTsgIAorICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgaXN0cmVhbTo6X01fZXh0cmFjdChsb25nJik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBpc3RyZWFtOjpfTV9leHRyYWN0KHVuc2lnbmVkIGxvbmcmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIGlzdHJlYW06Ol9NX2V4dHJhY3QoYm9vbCYpOworI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIGlzdHJlYW06Ol9NX2V4dHJhY3QobG9uZyBsb25nJik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBpc3RyZWFtOjpfTV9leHRyYWN0KHVuc2lnbmVkIGxvbmcgbG9uZyYpOworI2VuZGlmCisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBpc3RyZWFtOjpfTV9leHRyYWN0KGZsb2F0Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBpc3RyZWFtOjpfTV9leHRyYWN0KGRvdWJsZSYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgaXN0cmVhbTo6X01fZXh0cmFjdChsb25nIGRvdWJsZSYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgaXN0cmVhbTo6X01fZXh0cmFjdCh2b2lkKiYpOworCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19pb3N0cmVhbTxjaGFyPjsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19pc3RyZWFtPHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIHdzKHdpc3RyZWFtJik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgb3BlcmF0b3I+Pih3aXN0cmVhbSYsIHdjaGFyX3QmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiBvcGVyYXRvcj4+KHdpc3RyZWFtJiwgd2NoYXJfdCopOworCisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3QodW5zaWduZWQgc2hvcnQmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiB3aXN0cmVhbTo6X01fZXh0cmFjdCh1bnNpZ25lZCBpbnQmKTsgIAorICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIHdpc3RyZWFtOjpfTV9leHRyYWN0KGxvbmcmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiB3aXN0cmVhbTo6X01fZXh0cmFjdCh1bnNpZ25lZCBsb25nJik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3QoYm9vbCYpOworI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiB3aXN0cmVhbTo6X01fZXh0cmFjdChsb25nIGxvbmcmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiB3aXN0cmVhbTo6X01fZXh0cmFjdCh1bnNpZ25lZCBsb25nIGxvbmcmKTsKKyNlbmRpZgorICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIHdpc3RyZWFtOjpfTV9leHRyYWN0KGZsb2F0Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3QoZG91YmxlJik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3QobG9uZyBkb3VibGUmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiB3aXN0cmVhbTo6X01fZXh0cmFjdCh2b2lkKiYpOworCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19pb3N0cmVhbTx3Y2hhcl90PjsKKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xpc3QudGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xpc3QudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYTZhNzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbGlzdC50Y2MKQEAgLTAsMCArMSw0NjkgQEAKKy8vIExpc3QgaW1wbGVtZW50YXRpb24gKG91dCBvZiBsaW5lKSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9saXN0LnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xpc3R9CisgKi8KKworI2lmbmRlZiBfTElTVF9UQ0MKKyNkZWZpbmUgX0xJU1RfVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9jbGVhcigpCisgICAgeworICAgICAgdHlwZWRlZiBfTGlzdF9ub2RlPF9UcD4gIF9Ob2RlOworICAgICAgX05vZGUqIF9fY3VyID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfTV9pbXBsLl9NX25vZGUuX01fbmV4dCk7CisgICAgICB3aGlsZSAoX19jdXIgIT0gJl9NX2ltcGwuX01fbm9kZSkKKwl7CisJICBfTm9kZSogX190bXAgPSBfX2N1cjsKKwkgIF9fY3VyID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfX2N1ci0+X01fbmV4dCk7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCSAgX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkuZGVzdHJveShfX3RtcCk7CisjZWxzZQorCSAgX01fZ2V0X1RwX2FsbG9jYXRvcigpLmRlc3Ryb3koc3RkOjpfX2FkZHJlc3NvZihfX3RtcC0+X01fZGF0YSkpOworI2VuZGlmCisJICBfTV9wdXRfbm9kZShfX3RtcCk7CisJfQorICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICB0eXBlbmFtZSBsaXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICAgIGVtcGxhY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJX05vZGUqIF9fdG1wID0gX01fY3JlYXRlX25vZGUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwlfX3RtcC0+X01faG9vayhfX3Bvc2l0aW9uLl9NX25vZGUpOworCXJldHVybiBpdGVyYXRvcihfX3RtcCk7CisgICAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBsaXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICB7CisgICAgICBfTm9kZSogX190bXAgPSBfTV9jcmVhdGVfbm9kZShfX3gpOworICAgICAgX190bXAtPl9NX2hvb2soX19wb3NpdGlvbi5fTV9ub2RlKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcihfX3RtcCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGxpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9fcmV0ID0gaXRlcmF0b3IoX19wb3NpdGlvbi5fTV9ub2RlLT5fTV9uZXh0KTsKKyAgICAgIF9NX2VyYXNlKF9fcG9zaXRpb24pOworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9kZWZhdWx0X2FwcGVuZChzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIHNpemVfdHlwZSBfX2kgPSAwOworICAgICAgX190cnkKKwl7CisJICBmb3IgKDsgX19pIDwgX19uOyArK19faSkKKwkgICAgZW1wbGFjZV9iYWNrKCk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgZm9yICg7IF9faTsgLS1fX2kpCisJICAgIHBvcF9iYWNrKCk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9faSA9IGJlZ2luKCk7CisgICAgICBzaXplX3R5cGUgX19sZW4gPSAwOworICAgICAgZm9yICg7IF9faSAhPSBlbmQoKSAmJiBfX2xlbiA8IF9fbmV3X3NpemU7ICsrX19pLCArK19fbGVuKQorICAgICAgICA7CisgICAgICBpZiAoX19sZW4gPT0gX19uZXdfc2l6ZSkKKyAgICAgICAgZXJhc2UoX19pLCBlbmQoKSk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBfX2kgPT0gZW5kKCkKKwlfTV9kZWZhdWx0X2FwcGVuZChfX25ld19zaXplIC0gX19sZW4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9faSA9IGJlZ2luKCk7CisgICAgICBzaXplX3R5cGUgX19sZW4gPSAwOworICAgICAgZm9yICg7IF9faSAhPSBlbmQoKSAmJiBfX2xlbiA8IF9fbmV3X3NpemU7ICsrX19pLCArK19fbGVuKQorICAgICAgICA7CisgICAgICBpZiAoX19sZW4gPT0gX19uZXdfc2l6ZSkKKyAgICAgICAgZXJhc2UoX19pLCBlbmQoKSk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBfX2kgPT0gZW5kKCkKKyAgICAgICAgaW5zZXJ0KGVuZCgpLCBfX25ld19zaXplIC0gX19sZW4sIF9feCk7CisgICAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIHZhbHVlX3R5cGUgX194KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9faSA9IGJlZ2luKCk7CisgICAgICBzaXplX3R5cGUgX19sZW4gPSAwOworICAgICAgZm9yICg7IF9faSAhPSBlbmQoKSAmJiBfX2xlbiA8IF9fbmV3X3NpemU7ICsrX19pLCArK19fbGVuKQorICAgICAgICA7CisgICAgICBpZiAoX19sZW4gPT0gX19uZXdfc2l6ZSkKKyAgICAgICAgZXJhc2UoX19pLCBlbmQoKSk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBfX2kgPT0gZW5kKCkKKyAgICAgICAgaW5zZXJ0KGVuZCgpLCBfX25ld19zaXplIC0gX19sZW4sIF9feCk7CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgbGlzdDxfVHAsIF9BbGxvYz4mCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIG9wZXJhdG9yPShjb25zdCBsaXN0JiBfX3gpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0gJl9feCkKKwl7CisJICBpdGVyYXRvciBfX2ZpcnN0MSA9IGJlZ2luKCk7CisJICBpdGVyYXRvciBfX2xhc3QxID0gZW5kKCk7CisJICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0MiA9IF9feC5iZWdpbigpOworCSAgY29uc3RfaXRlcmF0b3IgX19sYXN0MiA9IF9feC5lbmQoKTsKKwkgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDI7CisJICAgICAgICsrX19maXJzdDEsICsrX19maXJzdDIpCisJICAgICpfX2ZpcnN0MSA9ICpfX2ZpcnN0MjsKKwkgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorCSAgICBlcmFzZShfX2ZpcnN0MSwgX19sYXN0MSk7CisJICBlbHNlCisJICAgIGluc2VydChfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIF9NX2ZpbGxfYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9faSA9IGJlZ2luKCk7CisgICAgICBmb3IgKDsgX19pICE9IGVuZCgpICYmIF9fbiA+IDA7ICsrX19pLCAtLV9fbikKKyAgICAgICAgKl9faSA9IF9fdmFsOworICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgIGluc2VydChlbmQoKSwgX19uLCBfX3ZhbCk7CisgICAgICBlbHNlCisgICAgICAgIGVyYXNlKF9faSwgZW5kKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdDIsCisJCQkgX19mYWxzZV90eXBlKQorICAgICAgeworICAgICAgICBpdGVyYXRvciBfX2ZpcnN0MSA9IGJlZ2luKCk7CisgICAgICAgIGl0ZXJhdG9yIF9fbGFzdDEgPSBlbmQoKTsKKyAgICAgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MjsKKwkgICAgICsrX19maXJzdDEsICsrX19maXJzdDIpCisgICAgICAgICAgKl9fZmlyc3QxID0gKl9fZmlyc3QyOworICAgICAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKyAgICAgICAgICBlcmFzZShfX2ZpcnN0MSwgX19sYXN0MSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBpbnNlcnQoX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgcmVtb3ZlKGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgeworICAgICAgaXRlcmF0b3IgX19maXJzdCA9IGJlZ2luKCk7CisgICAgICBpdGVyYXRvciBfX2xhc3QgPSBlbmQoKTsKKyAgICAgIGl0ZXJhdG9yIF9fZXh0cmEgPSBfX2xhc3Q7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKwkgICsrX19uZXh0OworCSAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsdWUpCisJICAgIHsKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gNTI2LiBJcyBpdCB1bmRlZmluZWQgaWYgYSBmdW5jdGlvbiBpbiB0aGUgc3RhbmRhcmQgY2hhbmdlcworCSAgICAgIC8vIGluIHBhcmFtZXRlcnM/CisJICAgICAgaWYgKHN0ZDo6X19hZGRyZXNzb2YoKl9fZmlyc3QpICE9IHN0ZDo6X19hZGRyZXNzb2YoX192YWx1ZSkpCisJCV9NX2VyYXNlKF9fZmlyc3QpOworCSAgICAgIGVsc2UKKwkJX19leHRyYSA9IF9fZmlyc3Q7CisJICAgIH0KKwkgIF9fZmlyc3QgPSBfX25leHQ7CisJfQorICAgICAgaWYgKF9fZXh0cmEgIT0gX19sYXN0KQorCV9NX2VyYXNlKF9fZXh0cmEpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIHVuaXF1ZSgpCisgICAgeworICAgICAgaXRlcmF0b3IgX19maXJzdCA9IGJlZ2luKCk7CisgICAgICBpdGVyYXRvciBfX2xhc3QgPSBlbmQoKTsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm47CisgICAgICBpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkKKwl7CisJICBpZiAoKl9fZmlyc3QgPT0gKl9fbmV4dCkKKwkgICAgX01fZXJhc2UoX19uZXh0KTsKKwkgIGVsc2UKKwkgICAgX19maXJzdCA9IF9fbmV4dDsKKwkgIF9fbmV4dCA9IF9fZmlyc3Q7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBtZXJnZShsaXN0JiYgX194KQorI2Vsc2UKKyAgICBtZXJnZShsaXN0JiBfX3gpCisjZW5kaWYKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAzMDAuIGxpc3Q6Om1lcmdlKCkgc3BlY2lmaWNhdGlvbiBpbmNvbXBsZXRlCisgICAgICBpZiAodGhpcyAhPSAmX194KQorCXsKKwkgIF9NX2NoZWNrX2VxdWFsX2FsbG9jYXRvcnMoX194KTsgCisKKwkgIGl0ZXJhdG9yIF9fZmlyc3QxID0gYmVnaW4oKTsKKwkgIGl0ZXJhdG9yIF9fbGFzdDEgPSBlbmQoKTsKKwkgIGl0ZXJhdG9yIF9fZmlyc3QyID0gX194LmJlZ2luKCk7CisJICBpdGVyYXRvciBfX2xhc3QyID0gX194LmVuZCgpOworCSAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwkgICAgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgICAgICB7CisJCWl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3QyOworCQlfTV90cmFuc2ZlcihfX2ZpcnN0MSwgX19maXJzdDIsICsrX19uZXh0KTsKKwkJX19maXJzdDIgPSBfX25leHQ7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgKytfX2ZpcnN0MTsKKwkgIGlmIChfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCSAgICBfTV90cmFuc2ZlcihfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICAgIHZvaWQKKyAgICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBtZXJnZShsaXN0JiYgX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyNlbHNlCisgICAgICBtZXJnZShsaXN0JiBfX3gsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorI2VuZGlmCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDMwMC4gbGlzdDo6bWVyZ2UoKSBzcGVjaWZpY2F0aW9uIGluY29tcGxldGUKKwlpZiAodGhpcyAhPSAmX194KQorCSAgeworCSAgICBfTV9jaGVja19lcXVhbF9hbGxvY2F0b3JzKF9feCk7CisKKwkgICAgaXRlcmF0b3IgX19maXJzdDEgPSBiZWdpbigpOworCSAgICBpdGVyYXRvciBfX2xhc3QxID0gZW5kKCk7CisJICAgIGl0ZXJhdG9yIF9fZmlyc3QyID0gX194LmJlZ2luKCk7CisJICAgIGl0ZXJhdG9yIF9fbGFzdDIgPSBfX3guZW5kKCk7CisJICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJICAgICAgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisJCXsKKwkJICBpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0MjsKKwkJICBfTV90cmFuc2ZlcihfX2ZpcnN0MSwgX19maXJzdDIsICsrX19uZXh0KTsKKwkJICBfX2ZpcnN0MiA9IF9fbmV4dDsKKwkJfQorCSAgICAgIGVsc2UKKwkJKytfX2ZpcnN0MTsKKwkgICAgaWYgKF9fZmlyc3QyICE9IF9fbGFzdDIpCisJICAgICAgX01fdHJhbnNmZXIoX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgc29ydCgpCisgICAgeworICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGUgbGlzdCBoYXMgbGVuZ3RoIDAgb3IgMS4KKyAgICAgIGlmICh0aGlzLT5fTV9pbXBsLl9NX25vZGUuX01fbmV4dCAhPSAmdGhpcy0+X01faW1wbC5fTV9ub2RlCisJICAmJiB0aGlzLT5fTV9pbXBsLl9NX25vZGUuX01fbmV4dC0+X01fbmV4dCAhPSAmdGhpcy0+X01faW1wbC5fTV9ub2RlKQorICAgICAgeworICAgICAgICBsaXN0IF9fY2Fycnk7CisgICAgICAgIGxpc3QgX190bXBbNjRdOworICAgICAgICBsaXN0ICogX19maWxsID0gJl9fdG1wWzBdOworICAgICAgICBsaXN0ICogX19jb3VudGVyOworCisgICAgICAgIGRvCisJICB7CisJICAgIF9fY2Fycnkuc3BsaWNlKF9fY2FycnkuYmVnaW4oKSwgKnRoaXMsIGJlZ2luKCkpOworCisJICAgIGZvcihfX2NvdW50ZXIgPSAmX190bXBbMF07CisJCV9fY291bnRlciAhPSBfX2ZpbGwgJiYgIV9fY291bnRlci0+ZW1wdHkoKTsKKwkJKytfX2NvdW50ZXIpCisJICAgICAgeworCQlfX2NvdW50ZXItPm1lcmdlKF9fY2FycnkpOworCQlfX2NhcnJ5LnN3YXAoKl9fY291bnRlcik7CisJICAgICAgfQorCSAgICBfX2NhcnJ5LnN3YXAoKl9fY291bnRlcik7CisJICAgIGlmIChfX2NvdW50ZXIgPT0gX19maWxsKQorCSAgICAgICsrX19maWxsOworCSAgfQorCXdoaWxlICggIWVtcHR5KCkgKTsKKworICAgICAgICBmb3IgKF9fY291bnRlciA9ICZfX3RtcFsxXTsgX19jb3VudGVyICE9IF9fZmlsbDsgKytfX2NvdW50ZXIpCisgICAgICAgICAgX19jb3VudGVyLT5tZXJnZSgqKF9fY291bnRlciAtIDEpKTsKKyAgICAgICAgc3dhcCggKihfX2ZpbGwgLSAxKSApOworICAgICAgfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgIHZvaWQKKyAgICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICAgIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkKKyAgICAgIHsKKyAgICAgICAgaXRlcmF0b3IgX19maXJzdCA9IGJlZ2luKCk7CisgICAgICAgIGl0ZXJhdG9yIF9fbGFzdCA9IGVuZCgpOworICAgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJICB7CisJICAgIGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisJICAgICsrX19uZXh0OworCSAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgICAgICBfTV9lcmFzZShfX2ZpcnN0KTsKKwkgICAgX19maXJzdCA9IF9fbmV4dDsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICAgIHZvaWQKKyAgICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICAgIHVuaXF1ZShfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpCisgICAgICB7CisgICAgICAgIGl0ZXJhdG9yIF9fZmlyc3QgPSBiZWdpbigpOworICAgICAgICBpdGVyYXRvciBfX2xhc3QgPSBlbmQoKTsKKyAgICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgcmV0dXJuOworICAgICAgICBpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgICB3aGlsZSAoKytfX25leHQgIT0gX19sYXN0KQorCSAgeworCSAgICBpZiAoX19iaW5hcnlfcHJlZCgqX19maXJzdCwgKl9fbmV4dCkpCisJICAgICAgX01fZXJhc2UoX19uZXh0KTsKKwkgICAgZWxzZQorCSAgICAgIF9fZmlyc3QgPSBfX25leHQ7CisJICAgIF9fbmV4dCA9IF9fZmlyc3Q7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICB2b2lkCisgICAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgICBzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorICAgICAgeworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGxpc3QgaGFzIGxlbmd0aCAwIG9yIDEuCisJaWYgKHRoaXMtPl9NX2ltcGwuX01fbm9kZS5fTV9uZXh0ICE9ICZ0aGlzLT5fTV9pbXBsLl9NX25vZGUKKwkgICAgJiYgdGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX25leHQtPl9NX25leHQgIT0gJnRoaXMtPl9NX2ltcGwuX01fbm9kZSkKKwkgIHsKKwkgICAgbGlzdCBfX2NhcnJ5OworCSAgICBsaXN0IF9fdG1wWzY0XTsKKwkgICAgbGlzdCAqIF9fZmlsbCA9ICZfX3RtcFswXTsKKwkgICAgbGlzdCAqIF9fY291bnRlcjsKKworCSAgICBkbworCSAgICAgIHsKKwkJX19jYXJyeS5zcGxpY2UoX19jYXJyeS5iZWdpbigpLCAqdGhpcywgYmVnaW4oKSk7CisKKwkJZm9yKF9fY291bnRlciA9ICZfX3RtcFswXTsKKwkJICAgIF9fY291bnRlciAhPSBfX2ZpbGwgJiYgIV9fY291bnRlci0+ZW1wdHkoKTsKKwkJICAgICsrX19jb3VudGVyKQorCQkgIHsKKwkJICAgIF9fY291bnRlci0+bWVyZ2UoX19jYXJyeSwgX19jb21wKTsKKwkJICAgIF9fY2Fycnkuc3dhcCgqX19jb3VudGVyKTsKKwkJICB9CisJCV9fY2Fycnkuc3dhcCgqX19jb3VudGVyKTsKKwkJaWYgKF9fY291bnRlciA9PSBfX2ZpbGwpCisJCSAgKytfX2ZpbGw7CisJICAgICAgfQorCSAgICB3aGlsZSAoICFlbXB0eSgpICk7CisKKwkgICAgZm9yIChfX2NvdW50ZXIgPSAmX190bXBbMV07IF9fY291bnRlciAhPSBfX2ZpbGw7ICsrX19jb3VudGVyKQorCSAgICAgIF9fY291bnRlci0+bWVyZ2UoKihfX2NvdW50ZXIgLSAxKSwgX19jb21wKTsKKwkgICAgc3dhcCgqKF9fZmlsbCAtIDEpKTsKKwkgIH0KKyAgICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX0xJU1RfVENDICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVfY2xhc3Nlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZV9jbGFzc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZTdlNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVfY2xhc3Nlcy5oCkBAIC0wLDAgKzEsNzg5IEBACisvLyBMb2NhbGUgc3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9sb2NhbGVfY2xhc3Nlcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4xICBMb2NhbGVzCisvLworCisjaWZuZGVmIF9MT0NBTEVfQ0xBU1NFU19ICisjZGVmaW5lIF9MT0NBTEVfQ0xBU1NFU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9sb2NhbGVmd2QuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZXh0L2F0b21pY2l0eS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gMjIuMS4xIENsYXNzIGxvY2FsZQorICAvKioKKyAgICogIEBicmllZiAgQ29udGFpbmVyIGNsYXNzIGZvciBsb2NhbGl6YXRpb24gZnVuY3Rpb25hbGl0eS4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIFRoZSBsb2NhbGUgY2xhc3MgaXMgZmlyc3QgYSBjbGFzcyB3cmFwcGVyIGZvciBDIGxpYnJhcnkgbG9jYWxlcy4gIEl0IGlzCisgICAqICBhbHNvIGFuIGV4dGVuc2libGUgY29udGFpbmVyIGZvciB1c2VyLWRlZmluZWQgbG9jYWxpemF0aW9uLiAgQSBsb2NhbGUgaXMKKyAgICogIGEgY29sbGVjdGlvbiBvZiBmYWNldHMgdGhhdCBpbXBsZW1lbnQgdmFyaW91cyBsb2NhbGl6YXRpb24gZmVhdHVyZXMgc3VjaAorICAgKiAgYXMgbW9uZXksIHRpbWUsIGFuZCBudW1iZXIgcHJpbnRpbmcuCisgICAqCisgICAqICBDb25zdHJ1Y3RpbmcgQysrIGxvY2FsZXMgZG9lcyBub3QgY2hhbmdlIHRoZSBDIGxpYnJhcnkgbG9jYWxlLgorICAgKgorICAgKiAgVGhpcyBsaWJyYXJ5IHN1cHBvcnRzIGVmZmljaWVudCBjb25zdHJ1Y3Rpb24gYW5kIGNvcHlpbmcgb2YgbG9jYWxlcworICAgKiAgdGhyb3VnaCBhIHJlZmVyZW5jZSBjb3VudGluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbG9jYWxlIGNsYXNzLgorICAqLworICBjbGFzcyBsb2NhbGUKKyAgeworICBwdWJsaWM6CisgICAgLy8gVHlwZXM6CisgICAgLy8vIERlZmluaXRpb24gb2YgbG9jYWxlOjpjYXRlZ29yeS4KKyAgICB0eXBlZGVmIGludAljYXRlZ29yeTsKKworICAgIC8vIEZvcndhcmQgZGVjbHMgYW5kIGZyaWVuZHM6CisgICAgY2xhc3MgZmFjZXQ7CisgICAgY2xhc3MgaWQ7CisgICAgY2xhc3MgX0ltcGw7CisKKyAgICBmcmllbmQgY2xhc3MgZmFjZXQ7CisgICAgZnJpZW5kIGNsYXNzIF9JbXBsOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIGhhc19mYWNldChjb25zdCBsb2NhbGUmKSB0aHJvdygpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgICAgZnJpZW5kIGNvbnN0IF9GYWNldCYKKyAgICAgIHVzZV9mYWNldChjb25zdCBsb2NhbGUmKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DYWNoZT4KKyAgICAgIGZyaWVuZCBzdHJ1Y3QgX191c2VfY2FjaGU7CisKKyAgICAvL0B7CisgICAgLyoqCisgICAgICogIEBicmllZiAgQ2F0ZWdvcnkgdmFsdWVzLgorICAgICAqCisgICAgICogIFRoZSBzdGFuZGFyZCBjYXRlZ29yeSB2YWx1ZXMgYXJlIG5vbmUsIGN0eXBlLCBudW1lcmljLCBjb2xsYXRlLCB0aW1lLAorICAgICAqICBtb25ldGFyeSwgYW5kIG1lc3NhZ2VzLiAgVGhleSBmb3JtIGEgYml0bWFzayB0aGF0IHN1cHBvcnRzIHVuaW9uIGFuZAorICAgICAqICBpbnRlcnNlY3Rpb24uICBUaGUgY2F0ZWdvcnkgYWxsIGlzIHRoZSB1bmlvbiBvZiB0aGVzZSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiAgTkI6IE9yZGVyIG11c3QgbWF0Y2ggX1NfZmFjZXRfY2F0ZWdvcmllcyBkZWZpbml0aW9uIGluIGxvY2FsZS5jYworICAgICovCisgICAgc3RhdGljIGNvbnN0IGNhdGVnb3J5IG5vbmUJCT0gMDsKKyAgICBzdGF0aWMgY29uc3QgY2F0ZWdvcnkgY3R5cGUJCT0gMUwgPDwgMDsKKyAgICBzdGF0aWMgY29uc3QgY2F0ZWdvcnkgbnVtZXJpYwk9IDFMIDw8IDE7CisgICAgc3RhdGljIGNvbnN0IGNhdGVnb3J5IGNvbGxhdGUJPSAxTCA8PCAyOworICAgIHN0YXRpYyBjb25zdCBjYXRlZ29yeSB0aW1lCQk9IDFMIDw8IDM7CisgICAgc3RhdGljIGNvbnN0IGNhdGVnb3J5IG1vbmV0YXJ5CT0gMUwgPDwgNDsKKyAgICBzdGF0aWMgY29uc3QgY2F0ZWdvcnkgbWVzc2FnZXMJPSAxTCA8PCA1OworICAgIHN0YXRpYyBjb25zdCBjYXRlZ29yeSBhbGwJCT0gKGN0eXBlIHwgbnVtZXJpYyB8IGNvbGxhdGUgfAorCQkJCQkgICB0aW1lICB8IG1vbmV0YXJ5IHwgbWVzc2FnZXMpOworICAgIC8vQH0KKworICAgIC8vIENvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogIENvbnN0cnVjdHMgYSBjb3B5IG9mIHRoZSBnbG9iYWwgbG9jYWxlLiAgSWYgbm8gbG9jYWxlIGhhcyBiZWVuCisgICAgICogIGV4cGxpY2l0bHkgc2V0LCB0aGlzIGlzIHRoZSBDIGxvY2FsZS4KKyAgICAqLworICAgIGxvY2FsZSgpIHRocm93KCk7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDb3B5IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogIENvbnN0cnVjdHMgYSBjb3B5IG9mIEBhIG90aGVyLgorICAgICAqCisgICAgICogIEBwYXJhbSAgX19vdGhlciAgVGhlIGxvY2FsZSB0byBjb3B5LgorICAgICovCisgICAgbG9jYWxlKGNvbnN0IGxvY2FsZSYgX19vdGhlcikgdGhyb3coKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIE5hbWVkIGxvY2FsZSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqICBDb25zdHJ1Y3RzIGEgY29weSBvZiB0aGUgbmFtZWQgQyBsaWJyYXJ5IGxvY2FsZS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIF9fcyAgTmFtZSBvZiB0aGUgbG9jYWxlIHRvIGNvbnN0cnVjdC4KKyAgICAgKiAgQHRocm93ICBzdGQ6OnJ1bnRpbWVfZXJyb3IgaWYgX19zIGlzIG51bGwgb3IgYW4gdW5kZWZpbmVkIGxvY2FsZS4KKyAgICAqLworICAgIGV4cGxpY2l0CisgICAgbG9jYWxlKGNvbnN0IGNoYXIqIF9fcyk7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgbG9jYWxlIHdpdGggZmFjZXRzIGZyb20gYW5vdGhlciBsb2NhbGUuCisgICAgICoKKyAgICAgKiAgQ29uc3RydWN0cyBhIGNvcHkgb2YgdGhlIGxvY2FsZSBAYSBiYXNlLiAgVGhlIGZhY2V0cyBzcGVjaWZpZWQgYnkgQGEKKyAgICAgKiAgY2F0IGFyZSByZXBsYWNlZCB3aXRoIHRob3NlIGZyb20gdGhlIGxvY2FsZSBuYW1lZCBieSBAYSBzLiAgSWYgYmFzZSBpcworICAgICAqICBuYW1lZCwgdGhpcyBsb2NhbGUgaW5zdGFuY2Ugd2lsbCBhbHNvIGJlIG5hbWVkLgorICAgICAqCisgICAgICogIEBwYXJhbSAgX19iYXNlICBUaGUgbG9jYWxlIHRvIGNvcHkuCisgICAgICogIEBwYXJhbSAgX19zICBOYW1lIG9mIHRoZSBsb2NhbGUgdG8gdXNlIGZhY2V0cyBmcm9tLgorICAgICAqICBAcGFyYW0gIF9fY2F0ICBTZXQgb2YgY2F0ZWdvcmllcyBkZWZpbmluZyB0aGUgZmFjZXRzIHRvIHVzZSBmcm9tIF9fcy4KKyAgICAgKiAgQHRocm93ICBzdGQ6OnJ1bnRpbWVfZXJyb3IgaWYgX19zIGlzIG51bGwgb3IgYW4gdW5kZWZpbmVkIGxvY2FsZS4KKyAgICAqLworICAgIGxvY2FsZShjb25zdCBsb2NhbGUmIF9fYmFzZSwgY29uc3QgY2hhciogX19zLCBjYXRlZ29yeSBfX2NhdCk7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgbG9jYWxlIHdpdGggZmFjZXRzIGZyb20gYW5vdGhlciBsb2NhbGUuCisgICAgICoKKyAgICAgKiAgQ29uc3RydWN0cyBhIGNvcHkgb2YgdGhlIGxvY2FsZSBAYSBiYXNlLiAgVGhlIGZhY2V0cyBzcGVjaWZpZWQgYnkgQGEKKyAgICAgKiAgY2F0IGFyZSByZXBsYWNlZCB3aXRoIHRob3NlIGZyb20gdGhlIGxvY2FsZSBAYSBhZGQuICBJZiBAYSBiYXNlIGFuZCBAYQorICAgICAqICBhZGQgYXJlIG5hbWVkLCB0aGlzIGxvY2FsZSBpbnN0YW5jZSB3aWxsIGFsc28gYmUgbmFtZWQuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBfX2Jhc2UgIFRoZSBsb2NhbGUgdG8gY29weS4KKyAgICAgKiAgQHBhcmFtICBfX2FkZCAgVGhlIGxvY2FsZSB0byB1c2UgZmFjZXRzIGZyb20uCisgICAgICogIEBwYXJhbSAgX19jYXQgIFNldCBvZiBjYXRlZ29yaWVzIGRlZmluaW5nIHRoZSBmYWNldHMgdG8gdXNlIGZyb20gYWRkLgorICAgICovCisgICAgbG9jYWxlKGNvbnN0IGxvY2FsZSYgX19iYXNlLCBjb25zdCBsb2NhbGUmIF9fYWRkLCBjYXRlZ29yeSBfX2NhdCk7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgbG9jYWxlIHdpdGggYW5vdGhlciBmYWNldC4KKyAgICAgKgorICAgICAqICBDb25zdHJ1Y3RzIGEgY29weSBvZiB0aGUgbG9jYWxlIEBhIF9fb3RoZXIuICBUaGUgZmFjZXQgQGEgX19mCisgICAgICogIGlzIGFkZGVkIHRvIEBhIF9fb3RoZXIsIHJlcGxhY2luZyBhbiBleGlzdGluZyBmYWNldCBvZiB0eXBlCisgICAgICogIEZhY2V0IGlmIHRoZXJlIGlzIG9uZS4gIElmIEBhIF9fZiBpcyBudWxsLCB0aGlzIGxvY2FsZSBpcyBhCisgICAgICogIGNvcHkgb2YgQGEgX19vdGhlci4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIF9fb3RoZXIgIFRoZSBsb2NhbGUgdG8gY29weS4KKyAgICAgKiAgQHBhcmFtICBfX2YgIFRoZSBmYWNldCB0byBhZGQgaW4uCisgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgICBsb2NhbGUoY29uc3QgbG9jYWxlJiBfX290aGVyLCBfRmFjZXQqIF9fZik7CisKKyAgICAvLy8gTG9jYWxlIGRlc3RydWN0b3IuCisgICAgfmxvY2FsZSgpIHRocm93KCk7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBBc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAqCisgICAgICogIFNldCB0aGlzIGxvY2FsZSB0byBiZSBhIGNvcHkgb2YgQGEgb3RoZXIuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBfX290aGVyICBUaGUgbG9jYWxlIHRvIGNvcHkuCisgICAgICogIEByZXR1cm4gIEEgcmVmZXJlbmNlIHRvIHRoaXMgbG9jYWxlLgorICAgICovCisgICAgY29uc3QgbG9jYWxlJgorICAgIG9wZXJhdG9yPShjb25zdCBsb2NhbGUmIF9fb3RoZXIpIHRocm93KCk7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgbG9jYWxlIHdpdGggYW5vdGhlciBmYWNldC4KKyAgICAgKgorICAgICAqICBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIGEgbmV3IGNvcHkgb2YgdGhpcyBsb2NhbGUuICBBZGRzIG9yIHJlcGxhY2VzIGFuCisgICAgICogIGV4aXN0aW5nIGZhY2V0IG9mIHR5cGUgRmFjZXQgZnJvbSB0aGUgbG9jYWxlIEBhIG90aGVyIGludG8gdGhlIG5ldworICAgICAqICBsb2NhbGUuCisgICAgICoKKyAgICAgKiAgQHRwYXJhbSAgX0ZhY2V0ICBUaGUgZmFjZXQgdHlwZSB0byBjb3B5IGZyb20gb3RoZXIKKyAgICAgKiAgQHBhcmFtICBfX290aGVyICBUaGUgbG9jYWxlIHRvIGNvcHkgZnJvbS4KKyAgICAgKiAgQHJldHVybiAgTmV3bHkgY29uc3RydWN0ZWQgbG9jYWxlLgorICAgICAqICBAdGhyb3cgIHN0ZDo6cnVudGltZV9lcnJvciBpZiBfX290aGVyIGhhcyBubyBmYWNldCBvZiB0eXBlIF9GYWNldC4KKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICAgIGxvY2FsZQorICAgICAgY29tYmluZShjb25zdCBsb2NhbGUmIF9fb3RoZXIpIGNvbnN0OworCisgICAgLy8gTG9jYWxlIG9wZXJhdGlvbnM6CisgICAgLyoqCisgICAgICogIEBicmllZiAgUmV0dXJuIGxvY2FsZSBuYW1lLgorICAgICAqICBAcmV0dXJuICBMb2NhbGUgbmFtZSBvciAiKiIgaWYgdW5uYW1lZC4KKyAgICAqLworICAgIHN0cmluZworICAgIG5hbWUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIExvY2FsZSBlcXVhbGl0eS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIF9fb3RoZXIgIFRoZSBsb2NhbGUgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAqICBAcmV0dXJuICBUcnVlIGlmIG90aGVyIGFuZCB0aGlzIHJlZmVyIHRvIHRoZSBzYW1lIGxvY2FsZSBpbnN0YW5jZSwgYXJlCisgICAgICoJCSBjb3BpZXMsIG9yIGhhdmUgdGhlIHNhbWUgbmFtZS4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICAqLworICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGxvY2FsZSYgX19vdGhlcikgY29uc3QgdGhyb3coKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIExvY2FsZSBpbmVxdWFsaXR5LgorICAgICAqCisgICAgICogIEBwYXJhbSAgX19vdGhlciAgVGhlIGxvY2FsZSB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICogIEByZXR1cm4gICEgKCp0aGlzID09IF9fb3RoZXIpCisgICAgKi8KKyAgICBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBsb2NhbGUmIF9fb3RoZXIpIGNvbnN0IHRocm93KCkKKyAgICB7IHJldHVybiAhKHRoaXMtPm9wZXJhdG9yPT0oX19vdGhlcikpOyB9CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDb21wYXJlIHR3byBzdHJpbmdzIGFjY29yZGluZyB0byBjb2xsYXRlLgorICAgICAqCisgICAgICogIFRlbXBsYXRlIG9wZXJhdG9yIHRvIGNvbXBhcmUgdHdvIHN0cmluZ3MgdXNpbmcgdGhlIGNvbXBhcmUgZnVuY3Rpb24gb2YKKyAgICAgKiAgdGhlIGNvbGxhdGUgZmFjZXQgaW4gdGhpcyBsb2NhbGUuICBPbmUgdXNlIGlzIHRvIHByb3ZpZGUgdGhlIGxvY2FsZSB0bworICAgICAqICB0aGUgc29ydCBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCBhIHZlY3RvciB2IG9mIHN0cmluZ3MgY291bGQgYmUgc29ydGVkCisgICAgICogIGFjY29yZGluZyB0byBsb2NhbGUgbG9jIGJ5IGRvaW5nOgorICAgICAqICBAY29kZQorICAgICAqICBzdGQ6OnNvcnQodi5iZWdpbigpLCB2LmVuZCgpLCBsb2MpOworICAgICAqICBAZW5kY29kZQorICAgICAqCisgICAgICogIEBwYXJhbSAgX19zMSAgRmlyc3Qgc3RyaW5nIHRvIGNvbXBhcmUuCisgICAgICogIEBwYXJhbSAgX19zMiAgU2Vjb25kIHN0cmluZyB0byBjb21wYXJlLgorICAgICAqICBAcmV0dXJuICBUcnVlIGlmIGNvbGxhdGU8X0NoYXI+IGZhY2V0IGNvbXBhcmVzIF9fczEgPCBfX3MyLCBlbHNlIGZhbHNlLgorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXIsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyLCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MxLAorCQkgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyLCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MyKSBjb25zdDsKKworICAgIC8vIEdsb2JhbCBsb2NhbGUgb2JqZWN0czoKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBTZXQgZ2xvYmFsIGxvY2FsZQorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZ2xvYmFsIGxvY2FsZSB0byB0aGUgYXJndW1lbnQgYW5kIHJldHVybnMgYQorICAgICAqICBjb3B5IG9mIHRoZSBwcmV2aW91cyBnbG9iYWwgbG9jYWxlLiAgSWYgdGhlIGFyZ3VtZW50IGhhcyBhIG5hbWUsIGl0CisgICAgICogIHdpbGwgYWxzbyBjYWxsIHN0ZDo6c2V0bG9jYWxlKExDX0FMTCwgbG9jLm5hbWUoKSkuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBfX2xvYyAgVGhlIG5ldyBsb2NhbGUgdG8gbWFrZSBnbG9iYWwuCisgICAgICogIEByZXR1cm4gIENvcHkgb2YgdGhlIG9sZCBnbG9iYWwgbG9jYWxlLgorICAgICovCisgICAgc3RhdGljIGxvY2FsZQorICAgIGdsb2JhbChjb25zdCBsb2NhbGUmIF9fbG9jKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIFJldHVybiByZWZlcmVuY2UgdG8gdGhlIEMgbG9jYWxlLgorICAgICovCisgICAgc3RhdGljIGNvbnN0IGxvY2FsZSYKKyAgICBjbGFzc2ljKCk7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBUaGUgKHNoYXJlZCkgaW1wbGVtZW50YXRpb24KKyAgICBfSW1wbCoJCV9NX2ltcGw7CisKKyAgICAvLyBUaGUgIkMiIHJlZmVyZW5jZSBsb2NhbGUKKyAgICBzdGF0aWMgX0ltcGwqICAgICAgIF9TX2NsYXNzaWM7CisKKyAgICAvLyBDdXJyZW50IGdsb2JhbCBsb2NhbGUKKyAgICBzdGF0aWMgX0ltcGwqCV9TX2dsb2JhbDsKKworICAgIC8vIE5hbWVzIG9mIHVuZGVybHlpbmcgbG9jYWxlIGNhdGVnb3JpZXMuCisgICAgLy8gTkI6IGxvY2FsZTo6Z2xvYmFsKCkgaGFzIHRvIGtub3cgaG93IHRvIG1vZGlmeSBhbGwgdGhlCisgICAgLy8gdW5kZXJseWluZyBjYXRlZ29yaWVzLCBub3QganVzdCB0aGUgb25lcyByZXF1aXJlZCBieSB0aGUgQysrCisgICAgLy8gc3RhbmRhcmQuCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0KiBjb25zdCBfU19jYXRlZ29yaWVzOworCisgICAgLy8gTnVtYmVyIG9mIHN0YW5kYXJkIGNhdGVnb3JpZXMuIEZvciBDKyssIHRoZXNlIGNhdGVnb3JpZXMgYXJlCisgICAgLy8gY29sbGF0ZSwgY3R5cGUsIG1vbmV0YXJ5LCBudW1lcmljLCB0aW1lLCBhbmQgbWVzc2FnZXMuIFRoZXNlCisgICAgLy8gZGlyZWN0bHkgY29ycmVzcG9uZCB0byBJU08gQzk5IG1hY3JvcyBMQ19DT0xMQVRFLCBMQ19DVFlQRSwKKyAgICAvLyBMQ19NT05FVEFSWSwgTENfTlVNRVJJQywgYW5kIExDX1RJTUUuIEluIGFkZGl0aW9uLCBQT1NJWCAoSUVFRQorICAgIC8vIDEwMDMuMS0yMDAxKSBzcGVjaWZpZXMgTENfTUVTU0FHRVMuCisgICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIGNhdGVnb3JpZXMsIHRoZSB1bmRlcmx5aW5nCisgICAgLy8gb3BlcmF0aW5nIHN5c3RlbSBpcyBhbGxvd2VkIHRvIGRlZmluZSBleHRyYSBMQ18qCisgICAgLy8gbWFjcm9zLiBGb3IgR05VIHN5c3RlbXMsIHRoZSBmb2xsb3dpbmcgYXJlIGFsc28gdmFsaWQ6CisgICAgLy8gTENfUEFQRVIsIExDX05BTUUsIExDX0FERFJFU1MsIExDX1RFTEVQSE9ORSwgTENfTUVBU1VSRU1FTlQsCisgICAgLy8gYW5kIExDX0lERU5USUZJQ0FUSU9OLgorICAgIGVudW0geyBfU19jYXRlZ29yaWVzX3NpemUgPSA2ICsgX0dMSUJDWFhfTlVNX0NBVEVHT1JJRVMgfTsKKworI2lmZGVmIF9fR1RIUkVBRFMKKyAgICBzdGF0aWMgX19ndGhyZWFkX29uY2VfdCBfU19vbmNlOworI2VuZGlmCisKKyAgICBleHBsaWNpdAorICAgIGxvY2FsZShfSW1wbCopIHRocm93KCk7CisKKyAgICBzdGF0aWMgdm9pZAorICAgIF9TX2luaXRpYWxpemUoKTsKKworICAgIHN0YXRpYyB2b2lkCisgICAgX1NfaW5pdGlhbGl6ZV9vbmNlKCkgdGhyb3coKTsKKworICAgIHN0YXRpYyBjYXRlZ29yeQorICAgIF9TX25vcm1hbGl6ZV9jYXRlZ29yeShjYXRlZ29yeSk7CisKKyAgICB2b2lkCisgICAgX01fY29hbGVzY2UoY29uc3QgbG9jYWxlJiBfX2Jhc2UsIGNvbnN0IGxvY2FsZSYgX19hZGQsIGNhdGVnb3J5IF9fY2F0KTsKKyAgfTsKKworCisgIC8vIDIyLjEuMS4xLjIgIENsYXNzIGxvY2FsZTo6ZmFjZXQKKyAgLyoqCisgICAqICBAYnJpZWYgIExvY2FsaXphdGlvbiBmdW5jdGlvbmFsaXR5IGJhc2UgY2xhc3MuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGUgZmFjZXQgY2xhc3MgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGEgbG9jYWxpemF0aW9uIGZlYXR1cmUsIHN1Y2ggYXMKKyAgICogIG1vbmV5LCB0aW1lLCBhbmQgbnVtYmVyIHByaW50aW5nLiAgSXQgcHJvdmlkZXMgY29tbW9uIHN1cHBvcnQgZm9yIGZhY2V0cworICAgKiAgYW5kIHJlZmVyZW5jZSBtYW5hZ2VtZW50LgorICAgKgorICAgKiAgRmFjZXRzIG1heSBub3QgYmUgY29waWVkIG9yIGFzc2lnbmVkLgorICAqLworICBjbGFzcyBsb2NhbGU6OmZhY2V0CisgIHsKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgbG9jYWxlOworICAgIGZyaWVuZCBjbGFzcyBsb2NhbGU6Ol9JbXBsOworCisgICAgbXV0YWJsZSBfQXRvbWljX3dvcmQJCV9NX3JlZmNvdW50OworCisgICAgLy8gQ29udGFpbnMgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nICJDIiBsaWJyYXJ5IGZvciB0aGUgY2xhc3NpYyBsb2NhbGUuCisgICAgc3RhdGljIF9fY19sb2NhbGUgICAgICAgICAgICAgICAgICAgX1NfY19sb2NhbGU7CisKKyAgICAvLyBTdHJpbmcgbGl0ZXJhbCBmb3IgdGhlIG5hbWUgb2YgdGhlIGNsYXNzaWMgbG9jYWxlLgorICAgIHN0YXRpYyBjb25zdCBjaGFyCQkJX1NfY19uYW1lWzJdOworCisjaWZkZWYgX19HVEhSRUFEUworICAgIHN0YXRpYyBfX2d0aHJlYWRfb25jZV90CQlfU19vbmNlOworI2VuZGlmCisKKyAgICBzdGF0aWMgdm9pZAorICAgIF9TX2luaXRpYWxpemVfb25jZSgpOworCisgIHByb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBGYWNldCBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqICBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQuICBJZiByZWZzIGlzIDAsIHRoZQorICAgICAqICBmYWNldCBpcyBkZXN0cm95ZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2luZyBsb2NhbGUgaXMgZGVzdHJveWVkLgorICAgICAqICBPdGhlcndpc2UgdGhlIGZhY2V0IHdpbGwgbmV2ZXIgYmUgZGVzdHJveWVkLgorICAgICAqCisgICAgICogIEBwYXJhbSBfX3JlZnMgIFRoZSBpbml0aWFsIHZhbHVlIGZvciByZWZlcmVuY2UgY291bnQuCisgICAgKi8KKyAgICBleHBsaWNpdAorICAgIGZhY2V0KHNpemVfdCBfX3JlZnMgPSAwKSB0aHJvdygpIDogX01fcmVmY291bnQoX19yZWZzID8gMSA6IDApCisgICAgeyB9CisKKyAgICAvLy8gRmFjZXQgZGVzdHJ1Y3Rvci4KKyAgICB2aXJ0dWFsCisgICAgfmZhY2V0KCk7CisKKyAgICBzdGF0aWMgdm9pZAorICAgIF9TX2NyZWF0ZV9jX2xvY2FsZShfX2NfbG9jYWxlJiBfX2Nsb2MsIGNvbnN0IGNoYXIqIF9fcywKKwkJICAgICAgIF9fY19sb2NhbGUgX19vbGQgPSAwKTsKKworICAgIHN0YXRpYyBfX2NfbG9jYWxlCisgICAgX1NfY2xvbmVfY19sb2NhbGUoX19jX2xvY2FsZSYgX19jbG9jKSB0aHJvdygpOworCisgICAgc3RhdGljIHZvaWQKKyAgICBfU19kZXN0cm95X2NfbG9jYWxlKF9fY19sb2NhbGUmIF9fY2xvYyk7CisKKyAgICBzdGF0aWMgX19jX2xvY2FsZQorICAgIF9TX2xjX2N0eXBlX2NfbG9jYWxlKF9fY19sb2NhbGUgX19jbG9jLCBjb25zdCBjaGFyKiBfX3MpOworCisgICAgLy8gUmV0dXJucyBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgIkMiIGxpYnJhcnkgZGF0YSBmb3IgdGhlCisgICAgLy8gY2xhc3NpYyBsb2NhbGUuCisgICAgc3RhdGljIF9fY19sb2NhbGUKKyAgICBfU19nZXRfY19sb2NhbGUoKTsKKworICAgIF9HTElCQ1hYX0NPTlNUIHN0YXRpYyBjb25zdCBjaGFyKgorICAgIF9TX2dldF9jX25hbWUoKSB0aHJvdygpOworCisgIHByaXZhdGU6CisgICAgdm9pZAorICAgIF9NX2FkZF9yZWZlcmVuY2UoKSBjb25zdCB0aHJvdygpCisgICAgeyBfX2dudV9jeHg6Ol9fYXRvbWljX2FkZF9kaXNwYXRjaCgmX01fcmVmY291bnQsIDEpOyB9CisKKyAgICB2b2lkCisgICAgX01fcmVtb3ZlX3JlZmVyZW5jZSgpIGNvbnN0IHRocm93KCkKKyAgICB7CisgICAgICAvLyBCZSByYWNlLWRldGVjdG9yLWZyaWVuZGx5LiAgRm9yIG1vcmUgaW5mbyBzZWUgYml0cy9jKytjb25maWcuCisgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoJl9NX3JlZmNvdW50KTsKKyAgICAgIGlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmX01fcmVmY291bnQsIC0xKSA9PSAxKQorCXsKKyAgICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUigmX01fcmVmY291bnQpOworCSAgX190cnkKKwkgICAgeyBkZWxldGUgdGhpczsgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgfQorCX0KKyAgICB9CisKKyAgICBmYWNldChjb25zdCBmYWNldCYpOyAgLy8gTm90IGRlZmluZWQuCisKKyAgICBmYWNldCYKKyAgICBvcGVyYXRvcj0oY29uc3QgZmFjZXQmKTsgIC8vIE5vdCBkZWZpbmVkLgorICB9OworCisKKyAgLy8gMjIuMS4xLjEuMyBDbGFzcyBsb2NhbGU6OmlkCisgIC8qKgorICAgKiAgQGJyaWVmICBGYWNldCBJRCBjbGFzcy4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIFRoZSBJRCBjbGFzcyBwcm92aWRlcyBmYWNldHMgd2l0aCBhbiBpbmRleCB1c2VkIHRvIGlkZW50aWZ5IHRoZW0uCisgICAqICBFdmVyeSBmYWNldCBjbGFzcyBtdXN0IGRlZmluZSBhIHB1YmxpYyBzdGF0aWMgbWVtYmVyIGxvY2FsZTo6aWQsIG9yIGJlCisgICAqICBkZXJpdmVkIGZyb20gYSBmYWNldCB0aGF0IHByb3ZpZGVzIHRoaXMgbWVtYmVyLCBvdGhlcndpc2UgdGhlIGZhY2V0CisgICAqICBjYW5ub3QgYmUgdXNlZCBpbiBhIGxvY2FsZS4gIFRoZSBsb2NhbGU6OmlkIGVuc3VyZXMgdGhhdCBlYWNoIGNsYXNzCisgICAqICB0eXBlIGdldHMgYSB1bmlxdWUgaWRlbnRpZmllci4KKyAgKi8KKyAgY2xhc3MgbG9jYWxlOjppZAorICB7CisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIGxvY2FsZTsKKyAgICBmcmllbmQgY2xhc3MgbG9jYWxlOjpfSW1wbDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICAgIGZyaWVuZCBjb25zdCBfRmFjZXQmCisgICAgICB1c2VfZmFjZXQoY29uc3QgbG9jYWxlJik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgICBmcmllbmQgYm9vbAorICAgICAgaGFzX2ZhY2V0KGNvbnN0IGxvY2FsZSYpIHRocm93KCk7CisKKyAgICAvLyBOQjogVGhlcmUgaXMgbm8gYWNjZXNzb3IgZm9yIF9NX2luZGV4IGJlY2F1c2UgaXQgbWF5IGJlIHVzZWQKKyAgICAvLyBiZWZvcmUgdGhlIGNvbnN0cnVjdG9yIGlzIHJ1bjsgdGhlIGVmZmVjdCBvZiBjYWxsaW5nIGEgbWVtYmVyCisgICAgLy8gZnVuY3Rpb24gKGV2ZW4gYW4gaW5saW5lKSB3b3VsZCBiZSB1bmRlZmluZWQuCisgICAgbXV0YWJsZSBzaXplX3QJCV9NX2luZGV4OworCisgICAgLy8gTGFzdCBpZCBudW1iZXIgYXNzaWduZWQuCisgICAgc3RhdGljIF9BdG9taWNfd29yZAkJX1NfcmVmY291bnQ7CisKKyAgICB2b2lkCisgICAgb3BlcmF0b3I9KGNvbnN0IGlkJik7ICAvLyBOb3QgZGVmaW5lZC4KKworICAgIGlkKGNvbnN0IGlkJik7ICAvLyBOb3QgZGVmaW5lZC4KKworICBwdWJsaWM6CisgICAgLy8gTkI6IFRoaXMgY2xhc3MgaXMgYWx3YXlzIGEgc3RhdGljIGRhdGEgbWVtYmVyLCBhbmQgdGh1cyBjYW4gYmUKKyAgICAvLyBjb3VudGVkIG9uIHRvIGJlIHplcm8taW5pdGlhbGl6ZWQuCisgICAgLy8vIENvbnN0cnVjdG9yLgorICAgIGlkKCkgeyB9CisKKyAgICBzaXplX3QKKyAgICBfTV9pZCgpIGNvbnN0IHRocm93KCk7CisgIH07CisKKworICAvLyBJbXBsZW1lbnRhdGlvbiBvYmplY3QgZm9yIGxvY2FsZS4KKyAgY2xhc3MgbG9jYWxlOjpfSW1wbAorICB7CisgIHB1YmxpYzoKKyAgICAvLyBGcmllbmRzLgorICAgIGZyaWVuZCBjbGFzcyBsb2NhbGU7CisgICAgZnJpZW5kIGNsYXNzIGxvY2FsZTo6ZmFjZXQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgICBmcmllbmQgYm9vbAorICAgICAgaGFzX2ZhY2V0KGNvbnN0IGxvY2FsZSYpIHRocm93KCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgICBmcmllbmQgY29uc3QgX0ZhY2V0JgorICAgICAgdXNlX2ZhY2V0KGNvbnN0IGxvY2FsZSYpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NhY2hlPgorICAgICAgZnJpZW5kIHN0cnVjdCBfX3VzZV9jYWNoZTsKKworICBwcml2YXRlOgorICAgIC8vIERhdGEgTWVtYmVycy4KKyAgICBfQXRvbWljX3dvcmQJCQlfTV9yZWZjb3VudDsKKyAgICBjb25zdCBmYWNldCoqCQkJX01fZmFjZXRzOworICAgIHNpemVfdAkJCQlfTV9mYWNldHNfc2l6ZTsKKyAgICBjb25zdCBmYWNldCoqCQkJX01fY2FjaGVzOworICAgIGNoYXIqKgkJCQlfTV9uYW1lczsKKyAgICBzdGF0aWMgY29uc3QgbG9jYWxlOjppZCogY29uc3QJX1NfaWRfY3R5cGVbXTsKKyAgICBzdGF0aWMgY29uc3QgbG9jYWxlOjppZCogY29uc3QJX1NfaWRfbnVtZXJpY1tdOworICAgIHN0YXRpYyBjb25zdCBsb2NhbGU6OmlkKiBjb25zdAlfU19pZF9jb2xsYXRlW107CisgICAgc3RhdGljIGNvbnN0IGxvY2FsZTo6aWQqIGNvbnN0CV9TX2lkX3RpbWVbXTsKKyAgICBzdGF0aWMgY29uc3QgbG9jYWxlOjppZCogY29uc3QJX1NfaWRfbW9uZXRhcnlbXTsKKyAgICBzdGF0aWMgY29uc3QgbG9jYWxlOjppZCogY29uc3QJX1NfaWRfbWVzc2FnZXNbXTsKKyAgICBzdGF0aWMgY29uc3QgbG9jYWxlOjppZCogY29uc3QqIGNvbnN0IF9TX2ZhY2V0X2NhdGVnb3JpZXNbXTsKKworICAgIHZvaWQKKyAgICBfTV9hZGRfcmVmZXJlbmNlKCkgdGhyb3coKQorICAgIHsgX19nbnVfY3h4OjpfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9NX3JlZmNvdW50LCAxKTsgfQorCisgICAgdm9pZAorICAgIF9NX3JlbW92ZV9yZWZlcmVuY2UoKSB0aHJvdygpCisgICAgeworICAgICAgLy8gQmUgcmFjZS1kZXRlY3Rvci1mcmllbmRseS4gIEZvciBtb3JlIGluZm8gc2VlIGJpdHMvYysrY29uZmlnLgorICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKCZfTV9yZWZjb3VudCk7CisgICAgICBpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3JlZmNvdW50LCAtMSkgPT0gMSkKKwl7CisgICAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoJl9NX3JlZmNvdW50KTsKKwkgIF9fdHJ5CisJICAgIHsgZGVsZXRlIHRoaXM7IH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IH0KKwl9CisgICAgfQorCisgICAgX0ltcGwoY29uc3QgX0ltcGwmLCBzaXplX3QpOworICAgIF9JbXBsKGNvbnN0IGNoYXIqLCBzaXplX3QpOworICAgIF9JbXBsKHNpemVfdCkgdGhyb3coKTsKKworICAgfl9JbXBsKCkgdGhyb3coKTsKKworICAgIF9JbXBsKGNvbnN0IF9JbXBsJik7ICAvLyBOb3QgZGVmaW5lZC4KKworICAgIHZvaWQKKyAgICBvcGVyYXRvcj0oY29uc3QgX0ltcGwmKTsgIC8vIE5vdCBkZWZpbmVkLgorCisgICAgYm9vbAorICAgIF9NX2NoZWNrX3NhbWVfbmFtZSgpCisgICAgeworICAgICAgYm9vbCBfX3JldCA9IHRydWU7CisgICAgICBpZiAoX01fbmFtZXNbMV0pCisJLy8gV2UgbXVzdCBhY3R1YWxseSBjb21wYXJlIGFsbCB0aGUgX01fbmFtZXM6IGNhbiBiZSBhbGwgZXF1YWwhCisJZm9yIChzaXplX3QgX19pID0gMDsgX19yZXQgJiYgX19pIDwgX1NfY2F0ZWdvcmllc19zaXplIC0gMTsgKytfX2kpCisJICBfX3JldCA9IF9fYnVpbHRpbl9zdHJjbXAoX01fbmFtZXNbX19pXSwgX01fbmFtZXNbX19pICsgMV0pID09IDA7CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgICAgdm9pZAorICAgIF9NX3JlcGxhY2VfY2F0ZWdvcmllcyhjb25zdCBfSW1wbCosIGNhdGVnb3J5KTsKKworICAgIHZvaWQKKyAgICBfTV9yZXBsYWNlX2NhdGVnb3J5KGNvbnN0IF9JbXBsKiwgY29uc3QgbG9jYWxlOjppZCogY29uc3QqKTsKKworICAgIHZvaWQKKyAgICBfTV9yZXBsYWNlX2ZhY2V0KGNvbnN0IF9JbXBsKiwgY29uc3QgbG9jYWxlOjppZCopOworCisgICAgdm9pZAorICAgIF9NX2luc3RhbGxfZmFjZXQoY29uc3QgbG9jYWxlOjppZCosIGNvbnN0IGZhY2V0Kik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgICB2b2lkCisgICAgICBfTV9pbml0X2ZhY2V0KF9GYWNldCogX19mYWNldCkKKyAgICAgIHsgX01faW5zdGFsbF9mYWNldCgmX0ZhY2V0OjppZCwgX19mYWNldCk7IH0KKworICAgIHZvaWQKKyAgICBfTV9pbnN0YWxsX2NhY2hlKGNvbnN0IGZhY2V0Kiwgc2l6ZV90KTsKKyAgfTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmICBGYWNldCBmb3IgbG9jYWxpemVkIHN0cmluZyBjb21wYXJpc29uLgorICAgKgorICAgKiAgVGhpcyBmYWNldCBlbmNhcHN1bGF0ZXMgdGhlIGNvZGUgdG8gY29tcGFyZSBzdHJpbmdzIGluIGEgbG9jYWxpemVkCisgICAqICBtYW5uZXIuCisgICAqCisgICAqICBUaGUgY29sbGF0ZSB0ZW1wbGF0ZSB1c2VzIHByb3RlY3RlZCB2aXJ0dWFsIGZ1bmN0aW9ucyB0byBwcm92aWRlCisgICAqICB0aGUgYWN0dWFsIHJlc3VsdHMuICBUaGUgcHVibGljIGFjY2Vzc29ycyBmb3J3YXJkIHRoZSBjYWxsIHRvCisgICAqICB0aGUgdmlydHVhbCBmdW5jdGlvbnMuICBUaGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgaG9va3MgZm9yCisgICAqICBkZXZlbG9wZXJzIHRvIGltcGxlbWVudCB0aGUgYmVoYXZpb3IgdGhleSByZXF1aXJlIGZyb20gdGhlCisgICAqICBjb2xsYXRlIGZhY2V0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgY29sbGF0ZSA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcworICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+CXN0cmluZ190eXBlOworICAgICAgLy9AfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gVW5kZXJseWluZyAiQyIgbGlicmFyeSBsb2NhbGUgaW5mb3JtYXRpb24gc2F2ZWQgZnJvbQorICAgICAgLy8gaW5pdGlhbGl6YXRpb24sIG5lZWRlZCBieSBjb2xsYXRlX2J5bmFtZSBhcyB3ZWxsLgorICAgICAgX19jX2xvY2FsZQkJCV9NX2NfbG9jYWxlX2NvbGxhdGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gTnVtcHVuY3QgZmFjZXQgaWQuCisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJCWlkOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX3JlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgY29sbGF0ZShzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogZmFjZXQoX19yZWZzKSwgX01fY19sb2NhbGVfY29sbGF0ZShfU19nZXRfY19sb2NhbGUoKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEludGVybmFsIGNvbnN0cnVjdG9yLiBOb3QgZm9yIGdlbmVyYWwgdXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgY29uc3RydWN0b3IgZm9yIHVzZSBieSB0aGUgbGlicmFyeSBpdHNlbGYgdG8gc2V0IHVwIG5ldworICAgICAgICogIGxvY2FsZXMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2Nsb2MgIFRoZSBDIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gX19yZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGNvbGxhdGUoX19jX2xvY2FsZSBfX2Nsb2MsIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9jX2xvY2FsZV9jb2xsYXRlKF9TX2Nsb25lX2NfbG9jYWxlKF9fY2xvYykpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb21wYXJlIHR3byBzdHJpbmdzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbXBhcmVzIHR3byBzdHJpbmdzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYnkgY2FsbGluZworICAgICAgICogIGNvbGxhdGU6OmRvX2NvbXBhcmUoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8xICBTdGFydCBvZiBzdHJpbmcgMS4KKyAgICAgICAqICBAcGFyYW0gX19oaTEgIEVuZCBvZiBzdHJpbmcgMS4KKyAgICAgICAqICBAcGFyYW0gX19sbzIgIFN0YXJ0IG9mIHN0cmluZyAyLgorICAgICAgICogIEBwYXJhbSBfX2hpMiAgRW5kIG9mIHN0cmluZyAyLgorICAgICAgICogIEByZXR1cm4gIDEgaWYgc3RyaW5nMSA+IHN0cmluZzIsIC0xIGlmIHN0cmluZzEgPCBzdHJpbmcyLCBlbHNlIDAuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKGNvbnN0IF9DaGFyVCogX19sbzEsIGNvbnN0IF9DaGFyVCogX19oaTEsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX2xvMiwgY29uc3QgX0NoYXJUKiBfX2hpMikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2NvbXBhcmUoX19sbzEsIF9faGkxLCBfX2xvMiwgX19oaTIpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVHJhbnNmb3JtIHN0cmluZyB0byBjb21wYXJhYmxlIGZvcm0uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGZvciBzdHJ4ZnJtIGZ1bmN0aW9uYWxpdHkuICBJdCB0YWtlcyB0aGUKKyAgICAgICAqICBpbnB1dCBzdHJpbmcgYW5kIHJldHVybnMgYSBtb2RpZmllZCBzdHJpbmcgdGhhdCBjYW4gYmUgZGlyZWN0bHkKKyAgICAgICAqICBjb21wYXJlZCB0byBvdGhlciB0cmFuc2Zvcm1lZCBzdHJpbmdzLiAgSW4gdGhlIEMgbG9jYWxlLCB0aGlzCisgICAgICAgKiAgZnVuY3Rpb24ganVzdCByZXR1cm5zIGEgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nLiAgSW4gc29tZSBvdGhlcgorICAgICAgICogIGxvY2FsZXMsIGl0IG1heSByZXBsYWNlIHR3byBjaGFycyB3aXRoIG9uZSwgY2hhbmdlIGEgY2hhciBmb3IKKyAgICAgICAqICBhbm90aGVyLCBldGMuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZyBjb2xsYXRlOjpkb190cmFuc2Zvcm0oKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFN0YXJ0IG9mIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgRW5kIG9mIHN0cmluZy4KKyAgICAgICAqICBAcmV0dXJuICBUcmFuc2Zvcm1lZCBzdHJpbmdfdHlwZS4KKyAgICAgICovCisgICAgICBzdHJpbmdfdHlwZQorICAgICAgdHJhbnNmb3JtKGNvbnN0IF9DaGFyVCogX19sbywgY29uc3QgX0NoYXJUKiBfX2hpKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdHJhbnNmb3JtKF9fbG8sIF9faGkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGhhc2ggb2YgYSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgYW5kIHJldHVybnMgYSBoYXNoIG9uIHRoZSBpbnB1dCBzdHJpbmcuICBJdAorICAgICAgICogIGRvZXMgc28gYnkgcmV0dXJuaW5nIGNvbGxhdGU6OmRvX2hhc2goKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFN0YXJ0IG9mIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgRW5kIG9mIHN0cmluZy4KKyAgICAgICAqICBAcmV0dXJuICBIYXNoIHZhbHVlLgorICAgICAgKi8KKyAgICAgIGxvbmcKKyAgICAgIGhhc2goY29uc3QgX0NoYXJUKiBfX2xvLCBjb25zdCBfQ2hhclQqIF9faGkpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19oYXNoKF9fbG8sIF9faGkpOyB9CisKKyAgICAgIC8vIFVzZWQgdG8gYWJzdHJhY3Qgb3V0IF9DaGFyVCBiaXRzIGluIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9ucywgYmVsb3cuCisgICAgICBpbnQKKyAgICAgIF9NX2NvbXBhcmUoY29uc3QgX0NoYXJUKiwgY29uc3QgX0NoYXJUKikgY29uc3QgdGhyb3coKTsKKworICAgICAgc2l6ZV90CisgICAgICBfTV90cmFuc2Zvcm0oX0NoYXJUKiwgY29uc3QgX0NoYXJUKiwgc2l6ZV90KSBjb25zdCB0aHJvdygpOworCisgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBEZXN0cnVjdG9yLgorICAgICAgdmlydHVhbAorICAgICAgfmNvbGxhdGUoKQorICAgICAgeyBfU19kZXN0cm95X2NfbG9jYWxlKF9NX2NfbG9jYWxlX2NvbGxhdGUpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSB0d28gc3RyaW5ncy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlCisgICAgICAgKiAgcmV0dXJuZWQuICBAc2VlIGNvbXBhcmUoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8xICBTdGFydCBvZiBzdHJpbmcgMS4KKyAgICAgICAqICBAcGFyYW0gX19oaTEgIEVuZCBvZiBzdHJpbmcgMS4KKyAgICAgICAqICBAcGFyYW0gX19sbzIgIFN0YXJ0IG9mIHN0cmluZyAyLgorICAgICAgICogIEBwYXJhbSBfX2hpMiAgRW5kIG9mIHN0cmluZyAyLgorICAgICAgICogIEByZXR1cm4gIDEgaWYgc3RyaW5nMSA+IHN0cmluZzIsIC0xIGlmIHN0cmluZzEgPCBzdHJpbmcyLCBlbHNlIDAuCisgICAgICAqLworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIGRvX2NvbXBhcmUoY29uc3QgX0NoYXJUKiBfX2xvMSwgY29uc3QgX0NoYXJUKiBfX2hpMSwKKwkJIGNvbnN0IF9DaGFyVCogX19sbzIsIGNvbnN0IF9DaGFyVCogX19oaTIpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRyYW5zZm9ybSBzdHJpbmcgdG8gY29tcGFyYWJsZSBmb3JtLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUKKyAgICAgICAqICByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFN0YXJ0LgorICAgICAgICogIEBwYXJhbSBfX2hpICBFbmQuCisgICAgICAgKiAgQHJldHVybiAgdHJhbnNmb3JtZWQgc3RyaW5nLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgc3RyaW5nX3R5cGUKKyAgICAgIGRvX3RyYW5zZm9ybShjb25zdCBfQ2hhclQqIF9fbG8sIGNvbnN0IF9DaGFyVCogX19oaSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGhhc2ggb2YgYSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgYW5kIHJldHVybnMgYSBoYXNoIG9uIHRoZSBpbnB1dCBzdHJpbmcuICBUaGlzCisgICAgICAgKiAgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFN0YXJ0IG9mIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgRW5kIG9mIHN0cmluZy4KKyAgICAgICAqICBAcmV0dXJuICBIYXNoIHZhbHVlLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgbG9uZworICAgICAgZG9faGFzaChjb25zdCBfQ2hhclQqIF9fbG8sIGNvbnN0IF9DaGFyVCogX19oaSkgY29uc3Q7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgbG9jYWxlOjppZCBjb2xsYXRlPF9DaGFyVD46OmlkOworCisgIC8vIFNwZWNpYWxpemF0aW9ucy4KKyAgdGVtcGxhdGU8PgorICAgIGludAorICAgIGNvbGxhdGU8Y2hhcj46Ol9NX2NvbXBhcmUoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKSBjb25zdCB0aHJvdygpOworCisgIHRlbXBsYXRlPD4KKyAgICBzaXplX3QKKyAgICBjb2xsYXRlPGNoYXI+OjpfTV90cmFuc2Zvcm0oY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QpIGNvbnN0IHRocm93KCk7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgaW50CisgICAgY29sbGF0ZTx3Y2hhcl90Pjo6X01fY29tcGFyZShjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCopIGNvbnN0IHRocm93KCk7CisKKyAgdGVtcGxhdGU8PgorICAgIHNpemVfdAorICAgIGNvbGxhdGU8d2NoYXJfdD46Ol9NX3RyYW5zZm9ybSh3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCosIHNpemVfdCkgY29uc3QgdGhyb3coKTsKKyNlbmRpZgorCisgIC8vLyBjbGFzcyBjb2xsYXRlX2J5bmFtZSBbMjIuMi40LjJdLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgY29sbGF0ZV9ieW5hbWUgOiBwdWJsaWMgY29sbGF0ZTxfQ2hhclQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPiBzdHJpbmdfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGNvbGxhdGVfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IGNvbGxhdGU8X0NoYXJUPihfX3JlZnMpCisgICAgICB7CisJaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19zLCAiQyIpICE9IDAKKwkgICAgJiYgX19idWlsdGluX3N0cmNtcChfX3MsICJQT1NJWCIpICE9IDApCisJICB7CisJICAgIHRoaXMtPl9TX2Rlc3Ryb3lfY19sb2NhbGUodGhpcy0+X01fY19sb2NhbGVfY29sbGF0ZSk7CisJICAgIHRoaXMtPl9TX2NyZWF0ZV9jX2xvY2FsZSh0aGlzLT5fTV9jX2xvY2FsZV9jb2xsYXRlLCBfX3MpOworCSAgfQorICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfmNvbGxhdGVfYnluYW1lKCkgeyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjIGluY2x1ZGUgPGJpdHMvbG9jYWxlX2NsYXNzZXMudGNjPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVfY2xhc3Nlcy50Y2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbG9jYWxlX2NsYXNzZXMudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNGQyYWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbG9jYWxlX2NsYXNzZXMudGNjCkBAIC0wLDAgKzEsMjk4IEBACisvLyBMb2NhbGUgc3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9sb2NhbGVfY2xhc3Nlcy50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjEgIExvY2FsZXMKKy8vCisKKyNpZm5kZWYgX0xPQ0FMRV9DTEFTU0VTX1RDQworI2RlZmluZSBfTE9DQUxFX0NMQVNTRVNfVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgIGxvY2FsZTo6CisgICAgbG9jYWxlKGNvbnN0IGxvY2FsZSYgX19vdGhlciwgX0ZhY2V0KiBfX2YpCisgICAgeworICAgICAgX01faW1wbCA9IG5ldyBfSW1wbCgqX19vdGhlci5fTV9pbXBsLCAxKTsKKworICAgICAgX190cnkKKwl7IF9NX2ltcGwtPl9NX2luc3RhbGxfZmFjZXQoJl9GYWNldDo6aWQsIF9fZik7IH0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIF9NX2ltcGwtPl9NX3JlbW92ZV9yZWZlcmVuY2UoKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICAgIGRlbGV0ZSBbXSBfTV9pbXBsLT5fTV9uYW1lc1swXTsKKyAgICAgIF9NX2ltcGwtPl9NX25hbWVzWzBdID0gMDsgICAvLyBVbm5hbWVkLgorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgbG9jYWxlCisgICAgbG9jYWxlOjoKKyAgICBjb21iaW5lKGNvbnN0IGxvY2FsZSYgX19vdGhlcikgY29uc3QKKyAgICB7CisgICAgICBfSW1wbCogX190bXAgPSBuZXcgX0ltcGwoKl9NX2ltcGwsIDEpOworICAgICAgX190cnkKKwl7CisJICBfX3RtcC0+X01fcmVwbGFjZV9mYWNldChfX290aGVyLl9NX2ltcGwsICZfRmFjZXQ6OmlkKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBfX3RtcC0+X01fcmVtb3ZlX3JlZmVyZW5jZSgpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgcmV0dXJuIGxvY2FsZShfX3RtcCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJvb2wKKyAgICBsb2NhbGU6OgorICAgIG9wZXJhdG9yKCkoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zMSwKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zMikgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6Y29sbGF0ZTxfQ2hhclQ+IF9fY29sbGF0ZV90eXBlOworICAgICAgY29uc3QgX19jb2xsYXRlX3R5cGUmIF9fY29sbGF0ZSA9IHVzZV9mYWNldDxfX2NvbGxhdGVfdHlwZT4oKnRoaXMpOworICAgICAgcmV0dXJuIChfX2NvbGxhdGUuY29tcGFyZShfX3MxLmRhdGEoKSwgX19zMS5kYXRhKCkgKyBfX3MxLmxlbmd0aCgpLAorCQkJCV9fczIuZGF0YSgpLCBfX3MyLmRhdGEoKSArIF9fczIubGVuZ3RoKCkpIDwgMCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBmYWNldC4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIGhhc19mYWNldCB0ZXN0cyB0aGUgbG9jYWxlIGFyZ3VtZW50IGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIGZhY2V0IHR5cGUKKyAgICogIHByb3ZpZGVkIGFzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICBGYWNldHMgZGVyaXZlZCBmcm9tIHRoZSBmYWNldAorICAgKiAgcGFyYW1ldGVyIHdpbGwgYWxzbyByZXR1cm4gdHJ1ZS4KKyAgICoKKyAgICogIEB0cGFyYW0gIF9GYWNldCAgVGhlIGZhY2V0IHR5cGUgdG8gdGVzdCB0aGUgcHJlc2VuY2Ugb2YuCisgICAqICBAcGFyYW0gIF9fbG9jICBUaGUgbG9jYWxlIHRvIHRlc3QuCisgICAqICBAcmV0dXJuICB0cnVlIGlmIEBwIF9fbG9jIGNvbnRhaW5zIGEgZmFjZXQgb2YgdHlwZSBfRmFjZXQsIGVsc2UgZmFsc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICBib29sCisgICAgaGFzX2ZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MpIHRocm93KCkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3QgX19pID0gX0ZhY2V0OjppZC5fTV9pZCgpOworICAgICAgY29uc3QgbG9jYWxlOjpmYWNldCoqIF9fZmFjZXRzID0gX19sb2MuX01faW1wbC0+X01fZmFjZXRzOworICAgICAgcmV0dXJuIChfX2kgPCBfX2xvYy5fTV9pbXBsLT5fTV9mYWNldHNfc2l6ZQorI2lmZGVmIF9fR1hYX1JUVEkKKwkgICAgICAmJiBkeW5hbWljX2Nhc3Q8Y29uc3QgX0ZhY2V0Kj4oX19mYWNldHNbX19pXSkpOworI2Vsc2UKKyAgICAgICAgICAgICAgJiYgc3RhdGljX2Nhc3Q8Y29uc3QgX0ZhY2V0Kj4oX19mYWNldHNbX19pXSkpOworI2VuZGlmCisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gYSBmYWNldC4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIHVzZV9mYWNldCBsb29rcyBmb3IgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBmYWNldCBvZiB0eXBlIEZhY2V0CisgICAqICB3aGVyZSBGYWNldCBpcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLiAgSWYgaGFzX2ZhY2V0KGxvY2FsZSkgaXMgdHJ1ZSwKKyAgICogIHRoZXJlIGlzIGEgc3VpdGFibGUgZmFjZXQgdG8gcmV0dXJuLiAgSXQgdGhyb3dzIHN0ZDo6YmFkX2Nhc3QgaWYgdGhlCisgICAqICBsb2NhbGUgZG9lc24ndCBjb250YWluIGEgZmFjZXQgb2YgdHlwZSBGYWNldC4KKyAgICoKKyAgICogIEB0cGFyYW0gIF9GYWNldCAgVGhlIGZhY2V0IHR5cGUgdG8gYWNjZXNzLgorICAgKiAgQHBhcmFtICBfX2xvYyAgVGhlIGxvY2FsZSB0byB1c2UuCisgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gZmFjZXQgb2YgdHlwZSBGYWNldC4KKyAgICogIEB0aHJvdyAgc3RkOjpiYWRfY2FzdCBpZiBAcCBfX2xvYyBkb2Vzbid0IGNvbnRhaW4gYSBmYWNldCBvZiB0eXBlIF9GYWNldC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgIGNvbnN0IF9GYWNldCYKKyAgICB1c2VfZmFjZXQoY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7CisgICAgICBjb25zdCBzaXplX3QgX19pID0gX0ZhY2V0OjppZC5fTV9pZCgpOworICAgICAgY29uc3QgbG9jYWxlOjpmYWNldCoqIF9fZmFjZXRzID0gX19sb2MuX01faW1wbC0+X01fZmFjZXRzOworICAgICAgaWYgKF9faSA+PSBfX2xvYy5fTV9pbXBsLT5fTV9mYWNldHNfc2l6ZSB8fCAhX19mYWNldHNbX19pXSkKKyAgICAgICAgX190aHJvd19iYWRfY2FzdCgpOworI2lmZGVmIF9fR1hYX1JUVEkKKyAgICAgIHJldHVybiBkeW5hbWljX2Nhc3Q8Y29uc3QgX0ZhY2V0Jj4oKl9fZmFjZXRzW19faV0pOworI2Vsc2UKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBfRmFjZXQmPigqX19mYWNldHNbX19pXSk7CisjZW5kaWYKKyAgICB9CisKKworICAvLyBHZW5lcmljIHZlcnNpb24gZG9lcyBub3RoaW5nLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW50CisgICAgY29sbGF0ZTxfQ2hhclQ+OjpfTV9jb21wYXJlKGNvbnN0IF9DaGFyVCosIGNvbnN0IF9DaGFyVCopIGNvbnN0IHRocm93ICgpCisgICAgeyByZXR1cm4gMDsgfQorCisgIC8vIEdlbmVyaWMgdmVyc2lvbiBkb2VzIG5vdGhpbmcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBzaXplX3QKKyAgICBjb2xsYXRlPF9DaGFyVD46Ol9NX3RyYW5zZm9ybShfQ2hhclQqLCBjb25zdCBfQ2hhclQqLCBzaXplX3QpIGNvbnN0IHRocm93ICgpCisgICAgeyByZXR1cm4gMDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbnQKKyAgICBjb2xsYXRlPF9DaGFyVD46OgorICAgIGRvX2NvbXBhcmUoY29uc3QgX0NoYXJUKiBfX2xvMSwgY29uc3QgX0NoYXJUKiBfX2hpMSwKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX2xvMiwgY29uc3QgX0NoYXJUKiBfX2hpMikgY29uc3QKKyAgICB7CisgICAgICAvLyBzdHJjb2xsIGFzc3VtZXMgemVyby10ZXJtaW5hdGVkIHN0cmluZ3Mgc28gd2UgbWFrZSBhIGNvcHkKKyAgICAgIC8vIGFuZCB0aGVuIHB1dCBhIHplcm8gYXQgdGhlIGVuZC4KKyAgICAgIGNvbnN0IHN0cmluZ190eXBlIF9fb25lKF9fbG8xLCBfX2hpMSk7CisgICAgICBjb25zdCBzdHJpbmdfdHlwZSBfX3R3byhfX2xvMiwgX19oaTIpOworCisgICAgICBjb25zdCBfQ2hhclQqIF9fcCA9IF9fb25lLmNfc3RyKCk7CisgICAgICBjb25zdCBfQ2hhclQqIF9fcGVuZCA9IF9fb25lLmRhdGEoKSArIF9fb25lLmxlbmd0aCgpOworICAgICAgY29uc3QgX0NoYXJUKiBfX3EgPSBfX3R3by5jX3N0cigpOworICAgICAgY29uc3QgX0NoYXJUKiBfX3FlbmQgPSBfX3R3by5kYXRhKCkgKyBfX3R3by5sZW5ndGgoKTsKKworICAgICAgLy8gc3RyY29sbCBzdG9wcyB3aGVuIGl0IHNlZXMgYSBudWwgY2hhcmFjdGVyIHNvIHdlIGJyZWFrCisgICAgICAvLyB0aGUgc3RyaW5ncyBpbnRvIHplcm8tdGVybWluYXRlZCBzdWJzdHJpbmdzIGFuZCBwYXNzIHRob3NlCisgICAgICAvLyB0byBzdHJjb2xsLgorICAgICAgZm9yICg7OykKKwl7CisJICBjb25zdCBpbnQgX19yZXMgPSBfTV9jb21wYXJlKF9fcCwgX19xKTsKKwkgIGlmIChfX3JlcykKKwkgICAgcmV0dXJuIF9fcmVzOworCisJICBfX3AgKz0gY2hhcl90cmFpdHM8X0NoYXJUPjo6bGVuZ3RoKF9fcCk7CisJICBfX3EgKz0gY2hhcl90cmFpdHM8X0NoYXJUPjo6bGVuZ3RoKF9fcSk7CisJICBpZiAoX19wID09IF9fcGVuZCAmJiBfX3EgPT0gX19xZW5kKQorCSAgICByZXR1cm4gMDsKKwkgIGVsc2UgaWYgKF9fcCA9PSBfX3BlbmQpCisJICAgIHJldHVybiAtMTsKKwkgIGVsc2UgaWYgKF9fcSA9PSBfX3FlbmQpCisJICAgIHJldHVybiAxOworCisJICBfX3ArKzsKKwkgIF9fcSsrOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIGNvbGxhdGU8X0NoYXJUPjo6c3RyaW5nX3R5cGUKKyAgICBjb2xsYXRlPF9DaGFyVD46OgorICAgIGRvX3RyYW5zZm9ybShjb25zdCBfQ2hhclQqIF9fbG8sIGNvbnN0IF9DaGFyVCogX19oaSkgY29uc3QKKyAgICB7CisgICAgICBzdHJpbmdfdHlwZSBfX3JldDsKKworICAgICAgLy8gc3RyeGZybSBhc3N1bWVzIHplcm8tdGVybWluYXRlZCBzdHJpbmdzIHNvIHdlIG1ha2UgYSBjb3B5CisgICAgICBjb25zdCBzdHJpbmdfdHlwZSBfX3N0cihfX2xvLCBfX2hpKTsKKworICAgICAgY29uc3QgX0NoYXJUKiBfX3AgPSBfX3N0ci5jX3N0cigpOworICAgICAgY29uc3QgX0NoYXJUKiBfX3BlbmQgPSBfX3N0ci5kYXRhKCkgKyBfX3N0ci5sZW5ndGgoKTsKKworICAgICAgc2l6ZV90IF9fbGVuID0gKF9faGkgLSBfX2xvKSAqIDI7CisKKyAgICAgIF9DaGFyVCogX19jID0gbmV3IF9DaGFyVFtfX2xlbl07CisKKyAgICAgIF9fdHJ5CisJeworCSAgLy8gc3RyeGZybSBzdG9wcyB3aGVuIGl0IHNlZXMgYSBudWwgY2hhcmFjdGVyIHNvIHdlIGJyZWFrCisJICAvLyB0aGUgc3RyaW5nIGludG8gemVyby10ZXJtaW5hdGVkIHN1YnN0cmluZ3MgYW5kIHBhc3MgdGhvc2UKKwkgIC8vIHRvIHN0cnhmcm0uCisJICBmb3IgKDs7KQorCSAgICB7CisJICAgICAgLy8gRmlyc3QgdHJ5IGEgYnVmZmVyIHBlcmhhcHMgYmlnIGVub3VnaC4KKwkgICAgICBzaXplX3QgX19yZXMgPSBfTV90cmFuc2Zvcm0oX19jLCBfX3AsIF9fbGVuKTsKKwkgICAgICAvLyBJZiB0aGUgYnVmZmVyIHdhcyBub3QgbGFyZ2UgZW5vdWdoLCB0cnkgYWdhaW4gd2l0aCB0aGUKKwkgICAgICAvLyBjb3JyZWN0IHNpemUuCisJICAgICAgaWYgKF9fcmVzID49IF9fbGVuKQorCQl7CisJCSAgX19sZW4gPSBfX3JlcyArIDE7CisJCSAgZGVsZXRlIFtdIF9fYywgX19jID0gMDsKKwkJICBfX2MgPSBuZXcgX0NoYXJUW19fbGVuXTsKKwkJICBfX3JlcyA9IF9NX3RyYW5zZm9ybShfX2MsIF9fcCwgX19sZW4pOworCQl9CisKKwkgICAgICBfX3JldC5hcHBlbmQoX19jLCBfX3Jlcyk7CisJICAgICAgX19wICs9IGNoYXJfdHJhaXRzPF9DaGFyVD46Omxlbmd0aChfX3ApOworCSAgICAgIGlmIChfX3AgPT0gX19wZW5kKQorCQlicmVhazsKKworCSAgICAgIF9fcCsrOworCSAgICAgIF9fcmV0LnB1c2hfYmFjayhfQ2hhclQoKSk7CisJICAgIH0KKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBkZWxldGUgW10gX19jOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorCisgICAgICBkZWxldGUgW10gX19jOworCisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBsb25nCisgICAgY29sbGF0ZTxfQ2hhclQ+OjoKKyAgICBkb19oYXNoKGNvbnN0IF9DaGFyVCogX19sbywgY29uc3QgX0NoYXJUKiBfX2hpKSBjb25zdAorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgX192YWwgPSAwOworICAgICAgZm9yICg7IF9fbG8gPCBfX2hpOyArK19fbG8pCisJX192YWwgPQorCSAgKl9fbG8gKyAoKF9fdmFsIDw8IDcpCisJCSAgIHwgKF9fdmFsID4+IChfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8dW5zaWduZWQgbG9uZz46OgorCQkJCV9fZGlnaXRzIC0gNykpKTsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxsb25nPihfX3ZhbCk7CisgICAgfQorCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgY29sbGF0ZTxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGNvbGxhdGVfYnluYW1lPGNoYXI+OworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IGNvbGxhdGU8Y2hhcj4mCisgICAgdXNlX2ZhY2V0PGNvbGxhdGU8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PGNvbGxhdGU8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBjb2xsYXRlPHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgY29sbGF0ZV9ieW5hbWU8d2NoYXJfdD47CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgY29sbGF0ZTx3Y2hhcl90PiYKKyAgICB1c2VfZmFjZXQ8Y29sbGF0ZTx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8Y29sbGF0ZTx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbG9jYWxlX2ZhY2V0cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZV9mYWNldHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ZjYWMyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZV9mYWNldHMuaApAQCAtMCwwICsxLDI2MTAgQEAKKy8vIExvY2FsZSBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2xvY2FsZV9mYWNldHMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xvY2FsZX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMSAgTG9jYWxlcworLy8KKworI2lmbmRlZiBfTE9DQUxFX0ZBQ0VUU19ICisjZGVmaW5lIF9MT0NBTEVfRkFDRVRTX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxjd2N0eXBlPgkvLyBGb3Igd2N0eXBlX3QKKyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8Yml0cy9jdHlwZV9iYXNlLmg+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGJpdHMvaW9zX2Jhc2UuaD4gIC8vIEZvciBpb3NfYmFzZSwgaW9zX2Jhc2U6Omlvc3RhdGUKKyNpbmNsdWRlIDxzdHJlYW1idWY+CisjaW5jbHVkZSA8Yml0cy9jcHBfdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvbnVtZXJpY190cmFpdHMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gTkI6IERvbid0IGluc3RhbnRpYXRlIHJlcXVpcmVkIHdjaGFyX3QgZmFjZXRzIGlmIG5vIHdjaGFyX3Qgc3VwcG9ydC4KKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorIyBkZWZpbmUgIF9HTElCQ1hYX05VTV9GQUNFVFMgMjgKKyNlbHNlCisjIGRlZmluZSAgX0dMSUJDWFhfTlVNX0ZBQ0VUUyAxNAorI2VuZGlmCisKKyAgLy8gQ29udmVydCBzdHJpbmcgdG8gbnVtZXJpYyB2YWx1ZSBvZiB0eXBlIF9UcCBhbmQgc3RvcmUgcmVzdWx0cy4KKyAgLy8gTkI6IFRoaXMgaXMgc3BlY2lhbGl6ZWQgZm9yIGFsbCByZXF1aXJlZCB0eXBlcywgdGhlcmUgaXMgbm8KKyAgLy8gZ2VuZXJpYyBkZWZpbml0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fY29udmVydF90b192KGNvbnN0IGNoYXIqLCBfVHAmLCBpb3NfYmFzZTo6aW9zdGF0ZSYsCisJCSAgIGNvbnN0IF9fY19sb2NhbGUmKSB0aHJvdygpOworCisgIC8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9ucyBmb3IgcmVxdWlyZWQgdHlwZXMuCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgX19jb252ZXJ0X3RvX3YoY29uc3QgY2hhciosIGZsb2F0JiwgaW9zX2Jhc2U6Omlvc3RhdGUmLAorCQkgICBjb25zdCBfX2NfbG9jYWxlJikgdGhyb3coKTsKKworICB0ZW1wbGF0ZTw+CisgICAgdm9pZAorICAgIF9fY29udmVydF90b192KGNvbnN0IGNoYXIqLCBkb3VibGUmLCBpb3NfYmFzZTo6aW9zdGF0ZSYsCisJCSAgIGNvbnN0IF9fY19sb2NhbGUmKSB0aHJvdygpOworCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgX19jb252ZXJ0X3RvX3YoY29uc3QgY2hhciosIGxvbmcgZG91YmxlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLAorCQkgICBjb25zdCBfX2NfbG9jYWxlJikgdGhyb3coKTsKKworICAvLyBOQjogX19wYWQgaXMgYSBzdHJ1Y3QsIHJhdGhlciB0aGFuIGEgZnVuY3Rpb24sIHNvIGl0IGNhbiBiZQorICAvLyBwYXJ0aWFsbHktc3BlY2lhbGl6ZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJ1Y3QgX19wYWQKKyAgICB7CisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfcGFkKGlvc19iYXNlJiBfX2lvLCBfQ2hhclQgX19maWxsLCBfQ2hhclQqIF9fbmV3cywKKwkgICAgIGNvbnN0IF9DaGFyVCogX19vbGRzLCBzdHJlYW1zaXplIF9fbmV3bGVuLCBzdHJlYW1zaXplIF9fb2xkbGVuKTsKKyAgICB9OworCisgIC8vIFVzZWQgYnkgYm90aCBudW1lcmljIGFuZCBtb25ldGFyeSBmYWNldHMuCisgIC8vIEluc2VydHMgImdyb3VwIHNlcGFyYXRvciIgY2hhcmFjdGVycyBpbnRvIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMuCisgIC8vIEl0J3MgcmVjdXJzaXZlLCBvbmUgaXRlcmF0aW9uIHBlciBncm91cC4gIEl0IG1vdmVzIHRoZSBjaGFyYWN0ZXJzCisgIC8vIGluIHRoZSBidWZmZXIgdGhpcyB3YXk6ICJ4eHh4MTIzNDUiIC0+ICIxMiwzNDV4eHgiLiAgQ2FsbCB0aGlzCisgIC8vIG9ubHkgd2l0aCBfX2dzaXplICE9IDAuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfQ2hhclQqCisgICAgX19hZGRfZ3JvdXBpbmcoX0NoYXJUKiBfX3MsIF9DaGFyVCBfX3NlcCwKKwkJICAgY29uc3QgY2hhciogX19nYmVnLCBzaXplX3QgX19nc2l6ZSwKKwkJICAgY29uc3QgX0NoYXJUKiBfX2ZpcnN0LCBjb25zdCBfQ2hhclQqIF9fbGFzdCk7CisKKyAgLy8gVGhpcyB0ZW1wbGF0ZSBwZXJtaXRzIHNwZWNpYWxpemluZyBmYWNldCBvdXRwdXQgY29kZSBmb3IKKyAgLy8gb3N0cmVhbWJ1Zl9pdGVyYXRvci4gIEZvciBvc3RyZWFtYnVmX2l0ZXJhdG9yLCBzcHV0biBpcworICAvLyBzaWduaWZpY2FudGx5IG1vcmUgZWZmaWNpZW50IHRoYW4gaW5jcmVtZW50aW5nIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZQorICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPgorICAgIF9fd3JpdGUob3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+IF9fcywgY29uc3QgX0NoYXJUKiBfX3dzLCBpbnQgX19sZW4pCisgICAgeworICAgICAgX19zLl9NX3B1dChfX3dzLCBfX2xlbik7CisgICAgICByZXR1cm4gX19zOworICAgIH0KKworICAvLyBUaGlzIGlzIHRoZSB1bnNwZWNpYWxpemVkIGZvcm0gb2YgdGhlIHRlbXBsYXRlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIGlubGluZQorICAgIF9PdXRJdGVyCisgICAgX193cml0ZShfT3V0SXRlciBfX3MsIGNvbnN0IF9DaGFyVCogX193cywgaW50IF9fbGVuKQorICAgIHsKKyAgICAgIGZvciAoaW50IF9faiA9IDA7IF9faiA8IF9fbGVuOyBfX2orKywgKytfX3MpCisJKl9fcyA9IF9fd3NbX19qXTsKKyAgICAgIHJldHVybiBfX3M7CisgICAgfQorCisKKyAgLy8gMjIuMi4xLjEgIFRlbXBsYXRlIGNsYXNzIGN0eXBlCisgIC8vIEluY2x1ZGUgaG9zdCBhbmQgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBjdHlwZSBlbnVtcyBmb3IgY3R5cGVfYmFzZS4KKworICAvKioKKyAgICogIEBicmllZiAgQ29tbW9uIGJhc2UgZm9yIGN0eXBlIGZhY2V0CisgICAqCisgICAqICBUaGlzIHRlbXBsYXRlIGNsYXNzIHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgcHVibGljIGZ1bmN0aW9ucworICAgKiAgdGhhdCBmb3J3YXJkIHRvIHRoZSBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMuCisgICAqCisgICAqICBUaGlzIHRlbXBsYXRlIGFsc28gcHJvdmlkZXMgYWJzdHJhY3Qgc3R1YnMgZm9yIHRoZSBwcm90ZWN0ZWQgdmlydHVhbAorICAgKiAgZnVuY3Rpb25zLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgX19jdHlwZV9hYnN0cmFjdF9iYXNlIDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBjdHlwZV9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgLy8vIFR5cGVkZWYgZm9yIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIKKyAgICAgIHR5cGVkZWYgX0NoYXJUIGNoYXJfdHlwZTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUZXN0IGNoYXJfdHlwZSBjbGFzc2lmaWNhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaW5kcyBhIG1hc2sgTSBmb3IgQGEgX19jIGFuZCBjb21wYXJlcyBpdCB0bworICAgICAgICogIG1hc2sgQGEgX19tLiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcgdGhlIHZhbHVlIG9mCisgICAgICAgKiAgY3R5cGU8Y2hhcl90eXBlPjo6ZG9faXMoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXJfdHlwZSB0byBjb21wYXJlIHRoZSBtYXNrIG9mLgorICAgICAgICogIEBwYXJhbSBfX20gIFRoZSBtYXNrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcmV0dXJuICAoTSAmIF9fbSkgIT0gMC4KKyAgICAgICovCisgICAgICBib29sCisgICAgICBpcyhtYXNrIF9fbSwgY2hhcl90eXBlIF9fYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2lzKF9fbSwgX19jKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBhIG1hc2sgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIG1hc2sgZm9yIGVhY2ggY2hhcl90eXBlIGluIHRoZSByYW5nZSBbbG8saGkpCisgICAgICAgKiAgYW5kIHN1Y2Nlc3NpdmVseSB3cml0ZXMgaXQgdG8gdmVjLiAgdmVjIG11c3QgaGF2ZSBhcyBtYW55IGVsZW1lbnRzCisgICAgICAgKiAgYXMgdGhlIGNoYXIgYXJyYXkuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZyB0aGUgdmFsdWUgb2YKKyAgICAgICAqICBjdHlwZTxjaGFyX3R5cGU+Ojpkb19pcygpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9fdmVjICBQb2ludGVyIHRvIGFuIGFycmF5IG9mIG1hc2sgc3RvcmFnZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGlzKGNvbnN0IGNoYXJfdHlwZSAqX19sbywgY29uc3QgY2hhcl90eXBlICpfX2hpLCBtYXNrICpfX3ZlYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2lzKF9fbG8sIF9faGksIF9fdmVjKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgY2hhcl90eXBlIG1hdGNoaW5nIGEgbWFzaworICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhbmQgcmV0dXJucyB0aGUgZmlyc3QgY2hhcl90eXBlIGMgaW4KKyAgICAgICAqICBbbG8saGkpIGZvciB3aGljaCBpcyhtLGMpIGlzIHRydWUuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZworICAgICAgICogIGN0eXBlPGNoYXJfdHlwZT46OmRvX3NjYW5faXMoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbSAgVGhlIG1hc2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBQb2ludGVyIHRvIG1hdGNoaW5nIGNoYXJfdHlwZSBpZiBmb3VuZCwgZWxzZSBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIHNjYW5faXMobWFzayBfX20sIGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fc2Nhbl9pcyhfX20sIF9fbG8sIF9faGkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBjaGFyX3R5cGUgbm90IG1hdGNoaW5nIGEgbWFzaworICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhbmQgcmV0dXJucyB0aGUgZmlyc3QgY2hhcl90eXBlIGMgaW4KKyAgICAgICAqICBbbG8saGkpIGZvciB3aGljaCBpcyhtLGMpIGlzIGZhbHNlLiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcKKyAgICAgICAqICBjdHlwZTxjaGFyX3R5cGU+Ojpkb19zY2FuX25vdCgpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19tICBUaGUgbWFzayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gZmlyc3QgY2hhciBpbiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgUG9pbnRlciB0byBub24tbWF0Y2hpbmcgY2hhciBpZiBmb3VuZCwgZWxzZSBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIHNjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3NjYW5fbm90KF9fbSwgX19sbywgX19oaSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IHRvIHVwcGVyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgYXJndW1lbnQgdG8gdXBwZXJjYXNlIGlmIHBvc3NpYmxlLgorICAgICAgICogIElmIG5vdCBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsICcyJyksIHJldHVybnMgdGhlIGFyZ3VtZW50LiAgSXQgZG9lcworICAgICAgICogIHNvIGJ5IHJldHVybmluZyBjdHlwZTxjaGFyX3R5cGU+Ojpkb190b3VwcGVyKCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyX3R5cGUgdG8gY29udmVydC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgdXBwZXJjYXNlIGNoYXJfdHlwZSBpZiBjb252ZXJ0aWJsZSwgZWxzZSBAYSBfX2MuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB0b3VwcGVyKGNoYXJfdHlwZSBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190b3VwcGVyKF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGFycmF5IHRvIHVwcGVyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXJfdHlwZSBpbiB0aGUgcmFuZ2UgW2xvLGhpKSB0bworICAgICAgICogIHVwcGVyY2FzZSBpZiBwb3NzaWJsZS4gIE90aGVyIGVsZW1lbnRzIHJlbWFpbiB1bnRvdWNoZWQuICBJdCBkb2VzIHNvCisgICAgICAgKiAgYnkgcmV0dXJuaW5nIGN0eXBlPGNoYXJfdHlwZT46OiBkb190b3VwcGVyKGxvLCBoaSkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIHRvdXBwZXIoY2hhcl90eXBlICpfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190b3VwcGVyKF9fbG8sIF9faGkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGFyZ3VtZW50IHRvIGxvd2VyY2FzZSBpZiBwb3NzaWJsZS4gIElmCisgICAgICAgKiAgbm90IHBvc3NpYmxlIChmb3IgZXhhbXBsZSwgJzInKSwgcmV0dXJucyB0aGUgYXJndW1lbnQuICBJdCBkb2VzIHNvCisgICAgICAgKiAgYnkgcmV0dXJuaW5nIGN0eXBlPGNoYXJfdHlwZT46OmRvX3RvbG93ZXIoYykuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyX3R5cGUgdG8gY29udmVydC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbG93ZXJjYXNlIGNoYXJfdHlwZSBpZiBjb252ZXJ0aWJsZSwgZWxzZSBAYSBfX2MuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB0b2xvd2VyKGNoYXJfdHlwZSBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190b2xvd2VyKF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGFycmF5IHRvIGxvd2VyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXJfdHlwZSBpbiB0aGUgcmFuZ2UgW19fbG8sX19oaSkgdG8KKyAgICAgICAqICBsb3dlcmNhc2UgaWYgcG9zc2libGUuICBPdGhlciBlbGVtZW50cyByZW1haW4gdW50b3VjaGVkLiAgSXQgZG9lcyBzbworICAgICAgICogIGJ5IHJldHVybmluZyBjdHlwZTxjaGFyX3R5cGU+OjogZG9fdG9sb3dlcihfX2xvLCBfX2hpKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgY29uc3QgY2hhcl90eXBlKgorICAgICAgdG9sb3dlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3RvbG93ZXIoX19sbywgX19oaSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBXaWRlbiBjaGFyIHRvIGNoYXJfdHlwZQorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBjaGFyIGFyZ3VtZW50IHRvIGNoYXJfdHlwZSB1c2luZyB0aGUKKyAgICAgICAqICBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uLiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcKKyAgICAgICAqICBjdHlwZTxjaGFyX3R5cGU+Ojpkb193aWRlbihjKS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhciB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBjb252ZXJ0ZWQgY2hhcl90eXBlLgorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgd2lkZW4oY2hhciBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb193aWRlbihfX2MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV2lkZW4gYXJyYXkgdG8gY2hhcl90eXBlCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29udmVydHMgZWFjaCBjaGFyIGluIHRoZSBpbnB1dCB0byBjaGFyX3R5cGUgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nCisgICAgICAgKiAgY3R5cGU8Y2hhcl90eXBlPjo6ZG9fd2lkZW4oYykuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX3RvICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXIqCisgICAgICB3aWRlbihjb25zdCBjaGFyKiBfX2xvLCBjb25zdCBjaGFyKiBfX2hpLCBjaGFyX3R5cGUqIF9fdG8pIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb193aWRlbihfX2xvLCBfX2hpLCBfX3RvKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE5hcnJvdyBjaGFyX3R5cGUgdG8gY2hhcgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBjaGFyX3R5cGUgdG8gY2hhciB1c2luZyB0aGUgc2ltcGxlc3QKKyAgICAgICAqICByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uLiAgSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIGRmYXVsdCBpcworICAgICAgICogIHJldHVybmVkIGluc3RlYWQuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZworICAgICAgICogIGN0eXBlPGNoYXJfdHlwZT46OmRvX25hcnJvdyhfX2MpLgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyX3R5cGUgdG8gY29udmVydC4KKyAgICAgICAqICBAcGFyYW0gX19kZmF1bHQgIENoYXIgdG8gcmV0dXJuIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCBjaGFyLgorICAgICAgKi8KKyAgICAgIGNoYXIKKyAgICAgIG5hcnJvdyhjaGFyX3R5cGUgX19jLCBjaGFyIF9fZGZhdWx0KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fbmFycm93KF9fYywgX19kZmF1bHQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTmFycm93IGFycmF5IHRvIGNoYXIgYXJyYXkKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXJfdHlwZSBpbiB0aGUgaW5wdXQgdG8gY2hhciB1c2luZyB0aGUKKyAgICAgICAqICBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uIGFuZCB3cml0ZXMgdGhlIHJlc3VsdHMgdG8gdGhlCisgICAgICAgKiAgZGVzdGluYXRpb24gYXJyYXkuICBGb3IgYW55IGNoYXJfdHlwZSBpbiB0aGUgaW5wdXQgdGhhdCBjYW5ub3QgYmUKKyAgICAgICAqICBjb252ZXJ0ZWQsIEBhIGRmYXVsdCBpcyB1c2VkIGluc3RlYWQuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZworICAgICAgICogIGN0eXBlPGNoYXJfdHlwZT46OmRvX25hcnJvdyhfX2xvLCBfX2hpLCBfX2RmYXVsdCwgX190bykuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2RmYXVsdCAgQ2hhciB0byB1c2UgaWYgY29udmVyc2lvbiBmYWlscy4KKyAgICAgICAqICBAcGFyYW0gX190byAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAgICAgKiAgQHJldHVybiAgQGEgX19oaS4KKyAgICAgICovCisgICAgICBjb25zdCBjaGFyX3R5cGUqCisgICAgICBuYXJyb3coY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGksCisJICAgICAgY2hhciBfX2RmYXVsdCwgY2hhciogX190bykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX25hcnJvdyhfX2xvLCBfX2hpLCBfX2RmYXVsdCwgX190byk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX2N0eXBlX2Fic3RyYWN0X2Jhc2Uoc2l6ZV90IF9fcmVmcyA9IDApOiBmYWNldChfX3JlZnMpIHsgfQorCisgICAgICB2aXJ0dWFsCisgICAgICB+X19jdHlwZV9hYnN0cmFjdF9iYXNlKCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGVzdCBjaGFyX3R5cGUgY2xhc3NpZmljYXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmluZHMgYSBtYXNrIE0gZm9yIEBhIGMgYW5kIGNvbXBhcmVzIGl0IHRvIG1hc2sgQGEgbS4KKyAgICAgICAqCisgICAgICAgKiAgZG9faXMoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgY2xhc3NpZnlpbmcuICBkb19pcygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyX3R5cGUgdG8gZmluZCB0aGUgbWFzayBvZi4KKyAgICAgICAqICBAcGFyYW0gX19tICBUaGUgbWFzayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHJldHVybiAgKE0gJiBfX20pICE9IDAuCisgICAgICAqLworICAgICAgdmlydHVhbCBib29sCisgICAgICBkb19pcyhtYXNrIF9fbSwgY2hhcl90eXBlIF9fYykgY29uc3QgPSAwOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBhIG1hc2sgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIG1hc2sgZm9yIGVhY2ggY2hhcl90eXBlIGluIHRoZSByYW5nZSBbbG8saGkpCisgICAgICAgKiAgYW5kIHN1Y2Nlc3NpdmVseSB3cml0ZXMgaXQgdG8gdmVjLiAgdmVjIG11c3QgaGF2ZSBhcyBtYW55IGVsZW1lbnRzCisgICAgICAgKiAgYXMgdGhlIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBkb19pcygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBjbGFzc2lmeWluZy4gIGRvX2lzKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX3ZlYyAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBtYXNrIHN0b3JhZ2UuCisgICAgICAgKiAgQHJldHVybiAgQGEgX19oaS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGRvX2lzKGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpLAorCSAgICBtYXNrKiBfX3ZlYykgY29uc3QgPSAwOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgY2hhcl90eXBlIG1hdGNoaW5nIG1hc2sKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYW5kIHJldHVybnMgdGhlIGZpcnN0IGNoYXJfdHlwZSBjIGluCisgICAgICAgKiAgW19fbG8sX19oaSkgZm9yIHdoaWNoIGlzKF9fbSxjKSBpcyB0cnVlLgorICAgICAgICoKKyAgICAgICAqICBkb19zY2FuX2lzKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIG1hdGNoIHNlYXJjaGluZy4gIGRvX2lzKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbSAgVGhlIG1hc2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBQb2ludGVyIHRvIGEgbWF0Y2hpbmcgY2hhcl90eXBlIGlmIGZvdW5kLCBlbHNlIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19zY2FuX2lzKG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG8sCisJCSBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0ID0gMDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGNoYXJfdHlwZSBub3QgbWF0Y2hpbmcgbWFzaworICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgY2hhcl90eXBlIGMgb2YgW2xvLGhpKSBmb3Igd2hpY2ggaXMobSxjKSBpcyBmYWxzZS4KKyAgICAgICAqCisgICAgICAgKiAgZG9fc2Nhbl9pcygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBtYXRjaCBzZWFyY2hpbmcuICBkb19pcygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX20gIFRoZSBtYXNrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgUG9pbnRlciB0byBhIG5vbi1tYXRjaGluZyBjaGFyX3R5cGUgaWYgZm91bmQsIGVsc2UgQGEgX19oaS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGRvX3NjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG8sCisJCSAgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdCA9IDA7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byB1cHBlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhcl90eXBlIGFyZ3VtZW50IHRvIHVwcGVyY2FzZQorICAgICAgICogIGlmIHBvc3NpYmxlLiAgSWYgbm90IHBvc3NpYmxlIChmb3IgZXhhbXBsZSwgJzInKSwgcmV0dXJucyB0aGUKKyAgICAgICAqICBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fdG91cHBlcigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICB1cHBlcmNhc2luZy4gIGRvX3RvdXBwZXIoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvcgorICAgICAgICogIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcl90eXBlIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHVwcGVyY2FzZSBjaGFyX3R5cGUgaWYgY29udmVydGlibGUsIGVsc2UgQGEgX19jLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb190b3VwcGVyKGNoYXJfdHlwZSBfX2MpIGNvbnN0ID0gMDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGFycmF5IHRvIHVwcGVyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhcl90eXBlIGluIHRoZSByYW5nZSBbX19sbyxfX2hpKQorICAgICAgICogIHRvIHVwcGVyY2FzZSBpZiBwb3NzaWJsZS4gIE90aGVyIGVsZW1lbnRzIHJlbWFpbiB1bnRvdWNoZWQuCisgICAgICAgKgorICAgICAgICogIGRvX3RvdXBwZXIoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgdXBwZXJjYXNpbmcuICBkb190b3VwcGVyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAqICB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb190b3VwcGVyKGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdCA9IDA7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgYXJndW1lbnQgdG8gbG93ZXJjYXNlIGlmCisgICAgICAgKiAgcG9zc2libGUuICBJZiBub3QgcG9zc2libGUgKGZvciBleGFtcGxlLCAnMicpLCByZXR1cm5zIHRoZSBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fdG9sb3dlcigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBsb3dlcmNhc2luZy4gIGRvX3RvbG93ZXIoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvcgorICAgICAgICogIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcl90eXBlIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGxvd2VyY2FzZSBjaGFyX3R5cGUgaWYgY29udmVydGlibGUsIGVsc2UgQGEgX19jLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb190b2xvd2VyKGNoYXJfdHlwZSBfX2MpIGNvbnN0ID0gMDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGFycmF5IHRvIGxvd2VyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhcl90eXBlIGluIHRoZSByYW5nZSBbX19sbyxfX2hpKQorICAgICAgICogIHRvIGxvd2VyY2FzZSBpZiBwb3NzaWJsZS4gIE90aGVyIGVsZW1lbnRzIHJlbWFpbiB1bnRvdWNoZWQuCisgICAgICAgKgorICAgICAgICogIGRvX3RvbG93ZXIoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbG93ZXJjYXNpbmcuICBkb190b2xvd2VyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAqICB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb190b2xvd2VyKGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdCA9IDA7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV2lkZW4gY2hhcgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgdGhlIGNoYXIgdG8gY2hhcl90eXBlIHVzaW5nIHRoZQorICAgICAgICogIHNpbXBsZXN0IHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uCisgICAgICAgKgorICAgICAgICogIGRvX3dpZGVuKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHdpZGVuaW5nLiAgZG9fd2lkZW4oKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCBjaGFyX3R5cGUKKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fd2lkZW4oY2hhciBfX2MpIGNvbnN0ID0gMDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBXaWRlbiBjaGFyIGFycmF5CisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29udmVydHMgZWFjaCBjaGFyIGluIHRoZSBpbnB1dCB0byBjaGFyX3R5cGUgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgZG9fd2lkZW4oKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgd2lkZW5pbmcuICBkb193aWRlbigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX3RvICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcioKKyAgICAgIGRvX3dpZGVuKGNvbnN0IGNoYXIqIF9fbG8sIGNvbnN0IGNoYXIqIF9faGksIGNoYXJfdHlwZSogX190bykgY29uc3QgPSAwOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE5hcnJvdyBjaGFyX3R5cGUgdG8gY2hhcgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgdGhlIGFyZ3VtZW50IHRvIGNoYXIgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIElmIHRoZSBjb252ZXJzaW9uIGZhaWxzLCBkZmF1bHQKKyAgICAgICAqICBpcyByZXR1cm5lZCBpbnN0ZWFkLgorICAgICAgICoKKyAgICAgICAqICBkb19uYXJyb3coKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbmFycm93aW5nLiAgZG9fbmFycm93KCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcl90eXBlIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fZGZhdWx0ICBDaGFyIHRvIHJldHVybiBpZiBjb252ZXJzaW9uIGZhaWxzLgorICAgICAgICogIEByZXR1cm4gIFRoZSBjb252ZXJ0ZWQgY2hhci4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXIKKyAgICAgIGRvX25hcnJvdyhjaGFyX3R5cGUgX19jLCBjaGFyIF9fZGZhdWx0KSBjb25zdCA9IDA7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTmFycm93IGNoYXJfdHlwZSBhcnJheSB0byBjaGFyCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXJfdHlwZSBpbiB0aGUgcmFuZ2UKKyAgICAgICAqICBbX19sbyxfX2hpKSB0byBjaGFyIHVzaW5nIHRoZSBzaW1wbGVzdCByZWFzb25hYmxlCisgICAgICAgKiAgdHJhbnNmb3JtYXRpb24gYW5kIHdyaXRlcyB0aGUgcmVzdWx0cyB0byB0aGUgZGVzdGluYXRpb24KKyAgICAgICAqICBhcnJheS4gIEZvciBhbnkgZWxlbWVudCBpbiB0aGUgaW5wdXQgdGhhdCBjYW5ub3QgYmUKKyAgICAgICAqICBjb252ZXJ0ZWQsIEBhIF9fZGZhdWx0IGlzIHVzZWQgaW5zdGVhZC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fbmFycm93KCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIG5hcnJvd2luZy4gIGRvX25hcnJvdygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2RmYXVsdCAgQ2hhciB0byB1c2UgaWYgY29udmVyc2lvbiBmYWlscy4KKyAgICAgICAqICBAcGFyYW0gX190byAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAgICAgKiAgQHJldHVybiAgQGEgX19oaS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGRvX25hcnJvdyhjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSwKKwkJY2hhciBfX2RmYXVsdCwgY2hhciogX190bykgY29uc3QgPSAwOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgY3R5cGUgZmFjZXQuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIHRlbXBsYXRlIGNsYXNzIGRlZmluZXMgY2xhc3NpZmljYXRpb24gYW5kIGNvbnZlcnNpb24gZnVuY3Rpb25zIGZvcgorICAgKiAgY2hhcmFjdGVyIHNldHMuICBJdCB3cmFwcyBjY3R5cGUgZnVuY3Rpb25hbGl0eS4gIEN0eXBlIGdldHMgdXNlZCBieQorICAgKiAgc3RyZWFtcyBmb3IgbWFueSBJL08gb3BlcmF0aW9ucy4KKyAgICoKKyAgICogIFRoaXMgdGVtcGxhdGUgcHJvdmlkZXMgdGhlIHByb3RlY3RlZCB2aXJ0dWFsIGZ1bmN0aW9ucyB0aGUgZGV2ZWxvcGVyCisgICAqICB3aWxsIGhhdmUgdG8gcmVwbGFjZSBpbiBhIGRlcml2ZWQgY2xhc3Mgb3Igc3BlY2lhbGl6YXRpb24gdG8gbWFrZSBhCisgICAqICB3b3JraW5nIGZhY2V0LiAgVGhlIHB1YmxpYyBmdW5jdGlvbnMgdGhhdCBhY2Nlc3MgdGhlbSBhcmUgZGVmaW5lZCBpbgorICAgKiAgX19jdHlwZV9hYnN0cmFjdF9iYXNlLCB0byBhbGxvdyBmb3IgaW1wbGVtZW50YXRpb24gZmxleGliaWxpdHkuICBTZWUKKyAgICogIGN0eXBlPHdjaGFyX3Q+IGZvciBhbiBleGFtcGxlLiAgVGhlIGZ1bmN0aW9ucyBhcmUgZG9jdW1lbnRlZCBpbgorICAgKiAgX19jdHlwZV9hYnN0cmFjdF9iYXNlLgorICAgKgorICAgKiAgTm90ZTogaW1wbGVtZW50YXRpb25zIGFyZSBwcm92aWRlZCBmb3IgYWxsIHRoZSBwcm90ZWN0ZWQgdmlydHVhbAorICAgKiAgZnVuY3Rpb25zLCBidXQgd2lsbCBsaWtlbHkgbm90IGJlIHVzZWZ1bC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIGN0eXBlIDogcHVibGljIF9fY3R5cGVfYWJzdHJhY3RfYmFzZTxfQ2hhclQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY3R5cGVfYWJzdHJhY3RfYmFzZTxfQ2hhclQ+OjptYXNrIG1hc2s7CisKKyAgICAgIC8vLyBUaGUgZmFjZXQgaWQgZm9yIGN0eXBlPGNoYXJfdHlwZT4KKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkCQkJaWQ7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBjdHlwZShzaXplX3QgX19yZWZzID0gMCkgOiBfX2N0eXBlX2Fic3RyYWN0X2Jhc2U8X0NoYXJUPihfX3JlZnMpIHsgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+Y3R5cGUoKTsKKworICAgICAgdmlydHVhbCBib29sCisgICAgICBkb19pcyhtYXNrIF9fbSwgY2hhcl90eXBlIF9fYykgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9faXMoY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGksIG1hc2sqIF9fdmVjKSBjb25zdDsKKworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19zY2FuX2lzKG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fc2Nhbl9ub3QobWFzayBfX20sIGNvbnN0IGNoYXJfdHlwZSogX19sbywKKwkJICBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fdG91cHBlcihjaGFyX3R5cGUgX19jKSBjb25zdDsKKworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb190b3VwcGVyKGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdDsKKworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3RvbG93ZXIoY2hhcl90eXBlIF9fYykgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fdG9sb3dlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb193aWRlbihjaGFyIF9fYykgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcioKKyAgICAgIGRvX3dpZGVuKGNvbnN0IGNoYXIqIF9fbG8sIGNvbnN0IGNoYXIqIF9faGksIGNoYXJfdHlwZSogX19kZXN0KSBjb25zdDsKKworICAgICAgdmlydHVhbCBjaGFyCisgICAgICBkb19uYXJyb3coY2hhcl90eXBlLCBjaGFyIF9fZGZhdWx0KSBjb25zdDsKKworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19uYXJyb3coY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGksCisJCWNoYXIgX19kZmF1bHQsIGNoYXIqIF9fdG8pIGNvbnN0OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGxvY2FsZTo6aWQgY3R5cGU8X0NoYXJUPjo6aWQ7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRoZSBjdHlwZTxjaGFyPiBzcGVjaWFsaXphdGlvbi4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIFRoaXMgY2xhc3MgZGVmaW5lcyBjbGFzc2lmaWNhdGlvbiBhbmQgY29udmVyc2lvbiBmdW5jdGlvbnMgZm9yCisgICAqICB0aGUgY2hhciB0eXBlLiAgSXQgZ2V0cyB1c2VkIGJ5IGNoYXIgc3RyZWFtcyBmb3IgbWFueSBJL08KKyAgICogIG9wZXJhdGlvbnMuICBUaGUgY2hhciBzcGVjaWFsaXphdGlvbiBwcm92aWRlcyBhIG51bWJlciBvZgorICAgKiAgb3B0aW1pemF0aW9ucyBhcyB3ZWxsLgorICAqLworICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgY3R5cGU8Y2hhcj4gOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIGN0eXBlX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvLy8gVHlwZWRlZiBmb3IgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBjaGFyLgorICAgICAgdHlwZWRlZiBjaGFyCQljaGFyX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyBEYXRhIE1lbWJlcnM6CisgICAgICBfX2NfbG9jYWxlCQlfTV9jX2xvY2FsZV9jdHlwZTsKKyAgICAgIGJvb2wJCQlfTV9kZWw7CisgICAgICBfX3RvX3R5cGUJCQlfTV90b3VwcGVyOworICAgICAgX190b190eXBlCQkJX01fdG9sb3dlcjsKKyAgICAgIGNvbnN0IG1hc2sqCQlfTV90YWJsZTsKKyAgICAgIG11dGFibGUgY2hhcgkJX01fd2lkZW5fb2s7CisgICAgICBtdXRhYmxlIGNoYXIJCV9NX3dpZGVuWzEgKyBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigtMSldOworICAgICAgbXV0YWJsZSBjaGFyCQlfTV9uYXJyb3dbMSArIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KC0xKV07CisgICAgICBtdXRhYmxlIGNoYXIJCV9NX25hcnJvd19vazsJLy8gMCB1bmluaXRpYWxpemVkLCAxIGluaXQsCisJCQkJCQkvLyAyIG1lbWNweSBjYW4ndCBiZSB1c2VkCisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gVGhlIGZhY2V0IGlkIGZvciBjdHlwZTxjaGFyPgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQgICAgICAgIGlkOworICAgICAgLy8vIFRoZSBzaXplIG9mIHRoZSBtYXNrIHRhYmxlLiAgSXQgaXMgU0NIQVJfTUFYICsgMS4KKyAgICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgICB0YWJsZV9zaXplID0gMSArIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KC0xKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX190YWJsZSBJZiBub24temVybywgdGFibGUgaXMgdXNlZCBhcyB0aGUgcGVyLWNoYXIgbWFzay4KKyAgICAgICAqICAgICAgICAgICAgICAgRWxzZSBjbGFzc2ljX3RhYmxlKCkgaXMgdXNlZC4KKyAgICAgICAqICBAcGFyYW0gX19kZWwgICBJZiB0cnVlLCBwYXNzZXMgb3duZXJzaGlwIG9mIHRhYmxlIHRvIHRoaXMgZmFjZXQuCisgICAgICAgKiAgQHBhcmFtIF9fcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBjdHlwZShjb25zdCBtYXNrKiBfX3RhYmxlID0gMCwgYm9vbCBfX2RlbCA9IGZhbHNlLCBzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgcGVyZm9ybXMgc3RhdGljIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBpbml0aWFsIEMgbG9jYWxlIGZhY2V0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jbG9jICBIYW5kbGUgdG8gQyBsb2NhbGUgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gX190YWJsZSBJZiBub24temVybywgdGFibGUgaXMgdXNlZCBhcyB0aGUgcGVyLWNoYXIgbWFzay4KKyAgICAgICAqICBAcGFyYW0gX19kZWwgICBJZiB0cnVlLCBwYXNzZXMgb3duZXJzaGlwIG9mIHRhYmxlIHRvIHRoaXMgZmFjZXQuCisgICAgICAgKiAgQHBhcmFtIF9fcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBjdHlwZShfX2NfbG9jYWxlIF9fY2xvYywgY29uc3QgbWFzayogX190YWJsZSA9IDAsIGJvb2wgX19kZWwgPSBmYWxzZSwKKwkgICAgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRlc3QgY2hhciBjbGFzc2lmaWNhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb21wYXJlcyB0aGUgbWFzayB0YWJsZVtjXSB0byBAYSBfX20uCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyIHRvIGNvbXBhcmUgdGhlIG1hc2sgb2YuCisgICAgICAgKiAgQHBhcmFtIF9fbSAgVGhlIG1hc2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEByZXR1cm4gIFRydWUgaWYgX19tICYgdGFibGVbX19jXSBpcyB0cnVlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAqLworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGlzKG1hc2sgX19tLCBjaGFyIF9fYykgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGEgbWFzayBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgbWFzayBmb3IgZWFjaCBjaGFyIGluIHRoZSByYW5nZSBbbG8sIGhpKSBhbmQKKyAgICAgICAqICBzdWNjZXNzaXZlbHkgd3JpdGVzIGl0IHRvIHZlYy4gIHZlYyBtdXN0IGhhdmUgYXMgbWFueSBlbGVtZW50cyBhcworICAgICAgICogIHRoZSBjaGFyIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9fdmVjICBQb2ludGVyIHRvIGFuIGFycmF5IG9mIG1hc2sgc3RvcmFnZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIGlubGluZSBjb25zdCBjaGFyKgorICAgICAgaXMoY29uc3QgY2hhciogX19sbywgY29uc3QgY2hhciogX19oaSwgbWFzayogX192ZWMpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgY2hhciBtYXRjaGluZyBhIG1hc2sKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYW5kIHJldHVybnMgdGhlIGZpcnN0IGNoYXIgaW4gW2xvLGhpKSBmb3IKKyAgICAgICAqICB3aGljaCBpcyhtLGNoYXIpIGlzIHRydWUuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX20gIFRoZSBtYXNrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgUG9pbnRlciB0byBhIG1hdGNoaW5nIGNoYXIgaWYgZm91bmQsIGVsc2UgQGEgX19oaS4KKyAgICAgICovCisgICAgICBpbmxpbmUgY29uc3QgY2hhcioKKyAgICAgIHNjYW5faXMobWFzayBfX20sIGNvbnN0IGNoYXIqIF9fbG8sIGNvbnN0IGNoYXIqIF9faGkpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgY2hhciBub3QgbWF0Y2hpbmcgYSBtYXNrCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcgorICAgICAgICogIGluIFtfX2xvLF9faGkpIGZvciB3aGljaCBpcyhtLGNoYXIpIGlzIGZhbHNlLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19tICBUaGUgbWFzayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFBvaW50ZXIgdG8gYSBub24tbWF0Y2hpbmcgY2hhciBpZiBmb3VuZCwgZWxzZSBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIGlubGluZSBjb25zdCBjaGFyKgorICAgICAgc2Nhbl9ub3QobWFzayBfX20sIGNvbnN0IGNoYXIqIF9fbG8sIGNvbnN0IGNoYXIqIF9faGkpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgdG8gdXBwZXJjYXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBjaGFyIGFyZ3VtZW50IHRvIHVwcGVyY2FzZSBpZiBwb3NzaWJsZS4KKyAgICAgICAqICBJZiBub3QgcG9zc2libGUgKGZvciBleGFtcGxlLCAnMicpLCByZXR1cm5zIHRoZSBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgdG91cHBlcigpIGFjdHMgYXMgaWYgaXQgcmV0dXJucyBjdHlwZTxjaGFyPjo6ZG9fdG91cHBlcihjKS4KKyAgICAgICAqICBkb190b3VwcGVyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHVwcGVyY2FzZSBjaGFyIGlmIGNvbnZlcnRpYmxlLCBlbHNlIEBhIF9fYy4KKyAgICAgICovCisgICAgICBjaGFyX3R5cGUKKyAgICAgIHRvdXBwZXIoY2hhcl90eXBlIF9fYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3RvdXBwZXIoX19jKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgYXJyYXkgdG8gdXBwZXJjYXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhciBpbiB0aGUgcmFuZ2UgW19fbG8sX19oaSkgdG8gdXBwZXJjYXNlCisgICAgICAgKiAgaWYgcG9zc2libGUuICBPdGhlciBjaGFycyByZW1haW4gdW50b3VjaGVkLgorICAgICAgICoKKyAgICAgICAqICB0b3VwcGVyKCkgYWN0cyBhcyBpZiBpdCByZXR1cm5zIGN0eXBlPGNoYXI+OjogZG9fdG91cHBlcihfX2xvLCBfX2hpKS4KKyAgICAgICAqICBkb190b3VwcGVyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIGZpcnN0IGNoYXIgaW4gcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgY29uc3QgY2hhcl90eXBlKgorICAgICAgdG91cHBlcihjaGFyX3R5cGUgKl9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3RvdXBwZXIoX19sbywgX19oaSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IHRvIGxvd2VyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciBhcmd1bWVudCB0byBsb3dlcmNhc2UgaWYgcG9zc2libGUuCisgICAgICAgKiAgSWYgbm90IHBvc3NpYmxlIChmb3IgZXhhbXBsZSwgJzInKSwgcmV0dXJucyB0aGUgYXJndW1lbnQuCisgICAgICAgKgorICAgICAgICogIHRvbG93ZXIoKSBhY3RzIGFzIGlmIGl0IHJldHVybnMgY3R5cGU8Y2hhcj46OmRvX3RvbG93ZXIoX19jKS4KKyAgICAgICAqICBkb190b2xvd2VyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGxvd2VyY2FzZSBjaGFyIGlmIGNvbnZlcnRpYmxlLCBlbHNlIEBhIF9fYy4KKyAgICAgICovCisgICAgICBjaGFyX3R5cGUKKyAgICAgIHRvbG93ZXIoY2hhcl90eXBlIF9fYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3RvbG93ZXIoX19jKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgYXJyYXkgdG8gbG93ZXJjYXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhciBpbiB0aGUgcmFuZ2UgW2xvLGhpKSB0byBsb3dlcmNhc2UKKyAgICAgICAqICBpZiBwb3NzaWJsZS4gIE90aGVyIGNoYXJzIHJlbWFpbiB1bnRvdWNoZWQuCisgICAgICAgKgorICAgICAgICogIHRvbG93ZXIoKSBhY3RzIGFzIGlmIGl0IHJldHVybnMgY3R5cGU8Y2hhcj46OiBkb190b2xvd2VyKF9fbG8sIF9faGkpLgorICAgICAgICogIGRvX3RvbG93ZXIoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gZmlyc3QgY2hhciBpbiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgQGEgX19oaS4KKyAgICAgICovCisgICAgICBjb25zdCBjaGFyX3R5cGUqCisgICAgICB0b2xvd2VyKGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdG9sb3dlcihfX2xvLCBfX2hpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdpZGVuIGNoYXIKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciB0byBjaGFyX3R5cGUgdXNpbmcgdGhlIHNpbXBsZXN0CisgICAgICAgKiAgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIEZvciBhbiB1bmRlcml2ZWQgY3R5cGU8Y2hhcj4gZmFjZXQsIHRoZQorICAgICAgICogIGFyZ3VtZW50IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdvcmtzIGFzIGlmIGl0IHJldHVybnMgY3R5cGU8Y2hhcj46OmRvX3dpZGVuKGMpLgorICAgICAgICogIGRvX3dpZGVuKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXIgdG8gY29udmVydC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY29udmVydGVkIGNoYXJhY3Rlci4KKyAgICAgICovCisgICAgICBjaGFyX3R5cGUKKyAgICAgIHdpZGVuKGNoYXIgX19jKSBjb25zdAorICAgICAgeworCWlmIChfTV93aWRlbl9vaykKKwkgIHJldHVybiBfTV93aWRlbltzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihfX2MpXTsKKwl0aGlzLT5fTV93aWRlbl9pbml0KCk7CisJcmV0dXJuIHRoaXMtPmRvX3dpZGVuKF9fYyk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV2lkZW4gY2hhciBhcnJheQorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhciBpbiB0aGUgaW5wdXQgdG8gY2hhciB1c2luZyB0aGUKKyAgICAgICAqICBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGFuIHVuZGVyaXZlZCBjdHlwZTxjaGFyPgorICAgICAgICogIGZhY2V0LCB0aGUgYXJndW1lbnQgd2lsbCBiZSBjb3BpZWQgdW5jaGFuZ2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdvcmtzIGFzIGlmIGl0IHJldHVybnMgY3R5cGU8Y2hhcj46OmRvX3dpZGVuKGMpLgorICAgICAgICogIGRvX3dpZGVuKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gZmlyc3QgY2hhciBpbiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9fdG8gIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5LgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgY29uc3QgY2hhcioKKyAgICAgIHdpZGVuKGNvbnN0IGNoYXIqIF9fbG8sIGNvbnN0IGNoYXIqIF9faGksIGNoYXJfdHlwZSogX190bykgY29uc3QKKyAgICAgIHsKKwlpZiAoX01fd2lkZW5fb2sgPT0gMSkKKwkgIHsKKwkgICAgX19idWlsdGluX21lbWNweShfX3RvLCBfX2xvLCBfX2hpIC0gX19sbyk7CisJICAgIHJldHVybiBfX2hpOworCSAgfQorCWlmICghX01fd2lkZW5fb2spCisJICBfTV93aWRlbl9pbml0KCk7CisJcmV0dXJuIHRoaXMtPmRvX3dpZGVuKF9fbG8sIF9faGksIF9fdG8pOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE5hcnJvdyBjaGFyCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGNoYXIgdG8gY2hhciB1c2luZyB0aGUgc2ltcGxlc3QKKyAgICAgICAqICByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uLiAgSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIGRmYXVsdCBpcworICAgICAgICogIHJldHVybmVkIGluc3RlYWQuICBGb3IgYW4gdW5kZXJpdmVkIGN0eXBlPGNoYXI+IGZhY2V0LCBAYSBjCisgICAgICAgKiAgd2lsbCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd29ya3MgYXMgaWYgaXQgcmV0dXJucyBjdHlwZTxjaGFyPjo6ZG9fbmFycm93KGMpLgorICAgICAgICogIGRvX25hcnJvdygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fZGZhdWx0ICBDaGFyIHRvIHJldHVybiBpZiBjb252ZXJzaW9uIGZhaWxzLgorICAgICAgICogIEByZXR1cm4gIFRoZSBjb252ZXJ0ZWQgY2hhcmFjdGVyLgorICAgICAgKi8KKyAgICAgIGNoYXIKKyAgICAgIG5hcnJvdyhjaGFyX3R5cGUgX19jLCBjaGFyIF9fZGZhdWx0KSBjb25zdAorICAgICAgeworCWlmIChfTV9uYXJyb3dbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oX19jKV0pCisJICByZXR1cm4gX01fbmFycm93W3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KF9fYyldOworCWNvbnN0IGNoYXIgX190ID0gZG9fbmFycm93KF9fYywgX19kZmF1bHQpOworCWlmIChfX3QgIT0gX19kZmF1bHQpCisJICBfTV9uYXJyb3dbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oX19jKV0gPSBfX3Q7CisJcmV0dXJuIF9fdDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOYXJyb3cgY2hhciBhcnJheQorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhciBpbiB0aGUgaW5wdXQgdG8gY2hhciB1c2luZyB0aGUKKyAgICAgICAqICBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uIGFuZCB3cml0ZXMgdGhlIHJlc3VsdHMgdG8gdGhlCisgICAgICAgKiAgZGVzdGluYXRpb24gYXJyYXkuICBGb3IgYW55IGNoYXIgaW4gdGhlIGlucHV0IHRoYXQgY2Fubm90IGJlCisgICAgICAgKiAgY29udmVydGVkLCBAYSBkZmF1bHQgaXMgdXNlZCBpbnN0ZWFkLiAgRm9yIGFuIHVuZGVyaXZlZCBjdHlwZTxjaGFyPgorICAgICAgICogIGZhY2V0LCB0aGUgYXJndW1lbnQgd2lsbCBiZSBjb3BpZWQgdW5jaGFuZ2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdvcmtzIGFzIGlmIGl0IHJldHVybnMgY3R5cGU8Y2hhcj46OmRvX25hcnJvdyhsbywgaGksCisgICAgICAgKiAgZGZhdWx0LCB0bykuICBkb19uYXJyb3coKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19kZmF1bHQgIENoYXIgdG8gdXNlIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgKiAgQHBhcmFtIF9fdG8gIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5LgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgY29uc3QgY2hhcl90eXBlKgorICAgICAgbmFycm93KGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpLAorCSAgICAgY2hhciBfX2RmYXVsdCwgY2hhciogX190bykgY29uc3QKKyAgICAgIHsKKwlpZiAoX19idWlsdGluX2V4cGVjdChfTV9uYXJyb3dfb2sgPT0gMSwgdHJ1ZSkpCisJICB7CisJICAgIF9fYnVpbHRpbl9tZW1jcHkoX190bywgX19sbywgX19oaSAtIF9fbG8pOworCSAgICByZXR1cm4gX19oaTsKKwkgIH0KKwlpZiAoIV9NX25hcnJvd19vaykKKwkgIF9NX25hcnJvd19pbml0KCk7CisJcmV0dXJuIHRoaXMtPmRvX25hcnJvdyhfX2xvLCBfX2hpLCBfX2RmYXVsdCwgX190byk7CisgICAgICB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDY5NS4gY3R5cGU8Y2hhcj46OmNsYXNzaWNfdGFibGUoKSBub3QgYWNjZXNzaWJsZS4KKyAgICAgIC8vLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbWFzayB0YWJsZSBwcm92aWRlZCB0byB0aGUgY29uc3RydWN0b3IsIG9yCisgICAgICAvLy8gdGhlIGRlZmF1bHQgZnJvbSBjbGFzc2ljX3RhYmxlKCkgaWYgbm9uZSB3YXMgcHJvdmlkZWQuCisgICAgICBjb25zdCBtYXNrKgorICAgICAgdGFibGUoKSBjb25zdCB0aHJvdygpCisgICAgICB7IHJldHVybiBfTV90YWJsZTsgfQorCisgICAgICAvLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIEMgbG9jYWxlIG1hc2sgdGFibGUuCisgICAgICBzdGF0aWMgY29uc3QgbWFzayoKKyAgICAgIGNsYXNzaWNfdGFibGUoKSB0aHJvdygpOworICAgIHByb3RlY3RlZDoKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZXN0cnVjdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgdGFibGUoKSBpZiBAYSBkZWwgd2FzIHRydWUgaW4gdGhlCisgICAgICAgKiAgY29uc3RydWN0b3IuCisgICAgICAqLworICAgICAgdmlydHVhbAorICAgICAgfmN0eXBlKCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byB1cHBlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciBhcmd1bWVudCB0byB1cHBlcmNhc2UgaWYKKyAgICAgICAqICBwb3NzaWJsZS4gIElmIG5vdCBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsICcyJyksIHJldHVybnMgdGhlIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqICBkb190b3VwcGVyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHVwcGVyY2FzaW5nLiAgZG9fdG91cHBlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHVwcGVyY2FzZSBjaGFyIGlmIGNvbnZlcnRpYmxlLCBlbHNlIEBhIF9fYy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fdG91cHBlcihjaGFyX3R5cGUgX19jKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGFycmF5IHRvIHVwcGVyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhciBpbiB0aGUgcmFuZ2UgW2xvLGhpKSB0bworICAgICAgICogIHVwcGVyY2FzZSBpZiBwb3NzaWJsZS4gIE90aGVyIGNoYXJzIHJlbWFpbiB1bnRvdWNoZWQuCisgICAgICAgKgorICAgICAgICogIGRvX3RvdXBwZXIoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgdXBwZXJjYXNpbmcuICBkb190b3VwcGVyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAqICB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb190b3VwcGVyKGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IHRvIGxvd2VyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBjaGFyIGFyZ3VtZW50IHRvIGxvd2VyY2FzZSBpZgorICAgICAgICogIHBvc3NpYmxlLiAgSWYgbm90IHBvc3NpYmxlIChmb3IgZXhhbXBsZSwgJzInKSwgcmV0dXJucyB0aGUgYXJndW1lbnQuCisgICAgICAgKgorICAgICAgICogIGRvX3RvbG93ZXIoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbG93ZXJjYXNpbmcuICBkb190b2xvd2VyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAqICB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXIgdG8gY29udmVydC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbG93ZXJjYXNlIGNoYXIgaWYgY29udmVydGlibGUsIGVsc2UgQGEgX19jLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb190b2xvd2VyKGNoYXJfdHlwZSBfX2MpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgYXJyYXkgdG8gbG93ZXJjYXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgZWFjaCBjaGFyIGluIHRoZSByYW5nZSBbbG8saGkpIHRvCisgICAgICAgKiAgbG93ZXJjYXNlIGlmIHBvc3NpYmxlLiAgT3RoZXIgY2hhcnMgcmVtYWluIHVudG91Y2hlZC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fdG9sb3dlcigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBsb3dlcmNhc2luZy4gIGRvX3RvbG93ZXIoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvcgorICAgICAgICogIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBmaXJzdCBjaGFyIGluIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fdG9sb3dlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV2lkZW4gY2hhcgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgdGhlIGNoYXIgdG8gY2hhciB1c2luZyB0aGUgc2ltcGxlc3QKKyAgICAgICAqICByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGFuIHVuZGVyaXZlZCBjdHlwZTxjaGFyPiBmYWNldCwgdGhlCisgICAgICAgKiAgYXJndW1lbnQgd2lsbCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuCisgICAgICAgKgorICAgICAgICogIGRvX3dpZGVuKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHdpZGVuaW5nLiAgZG9fd2lkZW4oKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCBjaGFyYWN0ZXIuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3dpZGVuKGNoYXIgX19jKSBjb25zdAorICAgICAgeyByZXR1cm4gX19jOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV2lkZW4gY2hhciBhcnJheQorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhciBpbiB0aGUgcmFuZ2UgW2xvLGhpKSB0byBjaGFyIHVzaW5nCisgICAgICAgKiAgdGhlIHNpbXBsZXN0IHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uICBGb3IgYW4gdW5kZXJpdmVkCisgICAgICAgKiAgY3R5cGU8Y2hhcj4gZmFjZXQsIHRoZSBhcmd1bWVudCB3aWxsIGJlIGNvcGllZCB1bmNoYW5nZWQuCisgICAgICAgKgorICAgICAgICogIGRvX3dpZGVuKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHdpZGVuaW5nLiAgZG9fd2lkZW4oKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX190byAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAgICAgKiAgQHJldHVybiAgQGEgX19oaS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqCisgICAgICBkb193aWRlbihjb25zdCBjaGFyKiBfX2xvLCBjb25zdCBjaGFyKiBfX2hpLCBjaGFyX3R5cGUqIF9fdG8pIGNvbnN0CisgICAgICB7CisJX19idWlsdGluX21lbWNweShfX3RvLCBfX2xvLCBfX2hpIC0gX19sbyk7CisJcmV0dXJuIF9faGk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTmFycm93IGNoYXIKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBjaGFyIHRvIGNoYXIgdXNpbmcgdGhlIHNpbXBsZXN0CisgICAgICAgKiAgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIElmIHRoZSBjb252ZXJzaW9uIGZhaWxzLCBkZmF1bHQgaXMKKyAgICAgICAqICByZXR1cm5lZCBpbnN0ZWFkLiAgRm9yIGFuIHVuZGVyaXZlZCBjdHlwZTxjaGFyPiBmYWNldCwgQGEgYyB3aWxsIGJlCisgICAgICAgKiAgcmV0dXJuZWQgdW5jaGFuZ2VkLgorICAgICAgICoKKyAgICAgICAqICBkb19uYXJyb3coKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbmFycm93aW5nLiAgZG9fbmFycm93KCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhciB0byBjb252ZXJ0LgorICAgICAgICogIEBwYXJhbSBfX2RmYXVsdCAgQ2hhciB0byByZXR1cm4gaWYgY29udmVyc2lvbiBmYWlscy4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY29udmVydGVkIGNoYXIuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyCisgICAgICBkb19uYXJyb3coY2hhcl90eXBlIF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fYzsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE5hcnJvdyBjaGFyIGFycmF5IHRvIGNoYXIgYXJyYXkKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhciBpbiB0aGUgcmFuZ2UgW2xvLGhpKSB0bworICAgICAgICogIGNoYXIgdXNpbmcgdGhlIHNpbXBsZXN0IHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24gYW5kIHdyaXRlcyB0aGUKKyAgICAgICAqICByZXN1bHRzIHRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4gIEZvciBhbnkgY2hhciBpbiB0aGUgaW5wdXQgdGhhdAorICAgICAgICogIGNhbm5vdCBiZSBjb252ZXJ0ZWQsIEBhIGRmYXVsdCBpcyB1c2VkIGluc3RlYWQuICBGb3IgYW4gdW5kZXJpdmVkCisgICAgICAgKiAgY3R5cGU8Y2hhcj4gZmFjZXQsIHRoZSBhcmd1bWVudCB3aWxsIGJlIGNvcGllZCB1bmNoYW5nZWQuCisgICAgICAgKgorICAgICAgICogIGRvX25hcnJvdygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBuYXJyb3dpbmcuICBkb19uYXJyb3coKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19kZmF1bHQgIENoYXIgdG8gdXNlIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgKiAgQHBhcmFtIF9fdG8gIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5LgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19uYXJyb3coY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGksCisJCWNoYXIgX19kZmF1bHQsIGNoYXIqIF9fdG8pIGNvbnN0CisgICAgICB7CisJX19idWlsdGluX21lbWNweShfX3RvLCBfX2xvLCBfX2hpIC0gX19sbyk7CisJcmV0dXJuIF9faGk7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZCBfTV9uYXJyb3dfaW5pdCgpIGNvbnN0OworICAgICAgdm9pZCBfTV93aWRlbl9pbml0KCkgY29uc3Q7CisgICAgfTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8qKgorICAgKiAgQGJyaWVmICBUaGUgY3R5cGU8d2NoYXJfdD4gc3BlY2lhbGl6YXRpb24uCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIGNsYXNzIGRlZmluZXMgY2xhc3NpZmljYXRpb24gYW5kIGNvbnZlcnNpb24gZnVuY3Rpb25zIGZvciB0aGUKKyAgICogIHdjaGFyX3QgdHlwZS4gIEl0IGdldHMgdXNlZCBieSB3Y2hhcl90IHN0cmVhbXMgZm9yIG1hbnkgSS9PIG9wZXJhdGlvbnMuCisgICAqICBUaGUgd2NoYXJfdCBzcGVjaWFsaXphdGlvbiBwcm92aWRlcyBhIG51bWJlciBvZiBvcHRpbWl6YXRpb25zIGFzIHdlbGwuCisgICAqCisgICAqICBjdHlwZTx3Y2hhcl90PiBpbmhlcml0cyBpdHMgcHVibGljIG1ldGhvZHMgZnJvbQorICAgKiAgX19jdHlwZV9hYnN0cmFjdF9iYXNlPHdjaGFyX3Q+LgorICAqLworICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgY3R5cGU8d2NoYXJfdD4gOiBwdWJsaWMgX19jdHlwZV9hYnN0cmFjdF9iYXNlPHdjaGFyX3Q+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgLy8vIFR5cGVkZWYgZm9yIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgd2NoYXJfdC4KKyAgICAgIHR5cGVkZWYgd2NoYXJfdAkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiB3Y3R5cGVfdAkJX193bWFza190eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgX19jX2xvY2FsZQkJX01fY19sb2NhbGVfY3R5cGU7CisKKyAgICAgIC8vIFByZS1jb21wdXRlZCBuYXJyb3dlZCBhbmQgd2lkZW5lZCBjaGFycy4KKyAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgX01fbmFycm93X29rOworICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICBfTV9uYXJyb3dbMTI4XTsKKyAgICAgIHdpbnRfdCAgICAgICAgICAgICAgICAgICAgX01fd2lkZW5bMSArIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KC0xKV07CisKKyAgICAgIC8vIFByZS1jb21wdXRlZCBlbGVtZW50cyBmb3IgZG9faXMuCisgICAgICBtYXNrICAgICAgICAgICAgICAgICAgICAgIF9NX2JpdFsxNl07CisgICAgICBfX3dtYXNrX3R5cGUgICAgICAgICAgICAgIF9NX3dtYXNrWzE2XTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIERhdGEgTWVtYmVyczoKKyAgICAgIC8vLyBUaGUgZmFjZXQgaWQgZm9yIGN0eXBlPHdjaGFyX3Q+CisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJaWQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHByb3ZpZGVkIGJ5IHRoZSBzdGFuZGFyZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBjdHlwZShzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgcGVyZm9ybXMgc3RhdGljIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBpbml0aWFsIEMgbG9jYWxlIGZhY2V0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jbG9jICBIYW5kbGUgdG8gQyBsb2NhbGUgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gX19yZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGN0eXBlKF9fY19sb2NhbGUgX19jbG9jLCBzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfX3dtYXNrX3R5cGUKKyAgICAgIF9NX2NvbnZlcnRfdG9fd21hc2soY29uc3QgbWFzayBfX20pIGNvbnN0IHRocm93KCk7CisKKyAgICAgIC8vLyBEZXN0cnVjdG9yCisgICAgICB2aXJ0dWFsCisgICAgICB+Y3R5cGUoKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUZXN0IHdjaGFyX3QgY2xhc3NpZmljYXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmluZHMgYSBtYXNrIE0gZm9yIEBhIGMgYW5kIGNvbXBhcmVzIGl0IHRvIG1hc2sgQGEgbS4KKyAgICAgICAqCisgICAgICAgKiAgZG9faXMoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgY2xhc3NpZnlpbmcuICBkb19pcygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSB3Y2hhcl90IHRvIGZpbmQgdGhlIG1hc2sgb2YuCisgICAgICAgKiAgQHBhcmFtIF9fbSAgVGhlIG1hc2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEByZXR1cm4gIChNICYgX19tKSAhPSAwLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgYm9vbAorICAgICAgZG9faXMobWFzayBfX20sIGNoYXJfdHlwZSBfX2MpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBhIG1hc2sgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIG1hc2sgZm9yIGVhY2ggd2NoYXJfdCBpbiB0aGUgcmFuZ2UgW2xvLGhpKQorICAgICAgICogIGFuZCBzdWNjZXNzaXZlbHkgd3JpdGVzIGl0IHRvIHZlYy4gIHZlYyBtdXN0IGhhdmUgYXMgbWFueSBlbGVtZW50cworICAgICAgICogIGFzIHRoZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgZG9faXMoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgY2xhc3NpZnlpbmcuICBkb19pcygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX192ZWMgIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgbWFzayBzdG9yYWdlLgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19pcyhjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSwgbWFzayogX192ZWMpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgd2NoYXJfdCBtYXRjaGluZyBtYXNrCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGFuZCByZXR1cm5zIHRoZSBmaXJzdCB3Y2hhcl90IGMgaW4KKyAgICAgICAqICBbX19sbyxfX2hpKSBmb3Igd2hpY2ggaXMoX19tLGMpIGlzIHRydWUuCisgICAgICAgKgorICAgICAgICogIGRvX3NjYW5faXMoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbWF0Y2ggc2VhcmNoaW5nLiAgZG9faXMoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19tICBUaGUgbWFzayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFBvaW50ZXIgdG8gYSBtYXRjaGluZyB3Y2hhcl90IGlmIGZvdW5kLCBlbHNlIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19zY2FuX2lzKG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCB3Y2hhcl90IG5vdCBtYXRjaGluZyBtYXNrCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QKKyAgICAgICAqICB3Y2hhcl90IGMgb2YgW19fbG8sX19oaSkgZm9yIHdoaWNoIGlzKF9fbSxjKSBpcyBmYWxzZS4KKyAgICAgICAqCisgICAgICAgKiAgZG9fc2Nhbl9pcygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBtYXRjaCBzZWFyY2hpbmcuICBkb19pcygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX20gIFRoZSBtYXNrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgUG9pbnRlciB0byBhIG5vbi1tYXRjaGluZyB3Y2hhcl90IGlmIGZvdW5kLCBlbHNlIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19zY2FuX25vdChtYXNrIF9fbSwgY29uc3QgY2hhcl90eXBlKiBfX2xvLAorCQkgIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byB1cHBlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgd2NoYXJfdCBhcmd1bWVudCB0byB1cHBlcmNhc2UgaWYKKyAgICAgICAqICBwb3NzaWJsZS4gIElmIG5vdCBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsICcyJyksIHJldHVybnMgdGhlIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqICBkb190b3VwcGVyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHVwcGVyY2FzaW5nLiAgZG9fdG91cHBlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSB3Y2hhcl90IHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHVwcGVyY2FzZSB3Y2hhcl90IGlmIGNvbnZlcnRpYmxlLCBlbHNlIEBhIF9fYy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fdG91cHBlcihjaGFyX3R5cGUgX19jKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGFycmF5IHRvIHVwcGVyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggd2NoYXJfdCBpbiB0aGUgcmFuZ2UgW2xvLGhpKSB0bworICAgICAgICogIHVwcGVyY2FzZSBpZiBwb3NzaWJsZS4gIE90aGVyIGVsZW1lbnRzIHJlbWFpbiB1bnRvdWNoZWQuCisgICAgICAgKgorICAgICAgICogIGRvX3RvdXBwZXIoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgdXBwZXJjYXNpbmcuICBkb190b3VwcGVyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAqICB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb190b3VwcGVyKGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IHRvIGxvd2VyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBhcmd1bWVudCB0byBsb3dlcmNhc2UgaWYKKyAgICAgICAqICBwb3NzaWJsZS4gIElmIG5vdCBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsICcyJyksIHJldHVybnMgdGhlIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqICBkb190b2xvd2VyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIGxvd2VyY2FzaW5nLiAgZG9fdG9sb3dlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSB3Y2hhcl90IHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGxvd2VyY2FzZSB3Y2hhcl90IGlmIGNvbnZlcnRpYmxlLCBlbHNlIEBhIF9fYy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fdG9sb3dlcihjaGFyX3R5cGUgX19jKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGFycmF5IHRvIGxvd2VyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggd2NoYXJfdCBpbiB0aGUgcmFuZ2UgW2xvLGhpKSB0bworICAgICAgICogIGxvd2VyY2FzZSBpZiBwb3NzaWJsZS4gIE90aGVyIGVsZW1lbnRzIHJlbWFpbiB1bnRvdWNoZWQuCisgICAgICAgKgorICAgICAgICogIGRvX3RvbG93ZXIoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbG93ZXJjYXNpbmcuICBkb190b2xvd2VyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAqICB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb190b2xvd2VyKGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBXaWRlbiBjaGFyIHRvIHdjaGFyX3QKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBjaGFyIHRvIHdjaGFyX3QgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIEZvciBhbiB1bmRlcml2ZWQgY3R5cGU8d2NoYXJfdD4KKyAgICAgICAqICBmYWNldCwgdGhlIGFyZ3VtZW50IHdpbGwgYmUgY2FzdCB0byB3Y2hhcl90LgorICAgICAgICoKKyAgICAgICAqICBkb193aWRlbigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICB3aWRlbmluZy4gIGRvX3dpZGVuKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhciB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBjb252ZXJ0ZWQgd2NoYXJfdC4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fd2lkZW4oY2hhciBfX2MpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdpZGVuIGNoYXIgYXJyYXkgdG8gd2NoYXJfdCBhcnJheQorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhciBpbiB0aGUgaW5wdXQgdG8gd2NoYXJfdCB1c2luZyB0aGUKKyAgICAgICAqICBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGFuIHVuZGVyaXZlZCBjdHlwZTx3Y2hhcl90PgorICAgICAgICogIGZhY2V0LCB0aGUgYXJndW1lbnQgd2lsbCBiZSBjb3BpZWQsIGNhc3RpbmcgZWFjaCBlbGVtZW50IHRvIHdjaGFyX3QuCisgICAgICAgKgorICAgICAgICogIGRvX3dpZGVuKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHdpZGVuaW5nLiAgZG9fd2lkZW4oKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX190byAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAgICAgKiAgQHJldHVybiAgQGEgX19oaS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqCisgICAgICBkb193aWRlbihjb25zdCBjaGFyKiBfX2xvLCBjb25zdCBjaGFyKiBfX2hpLCBjaGFyX3R5cGUqIF9fdG8pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE5hcnJvdyB3Y2hhcl90IHRvIGNoYXIKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBhcmd1bWVudCB0byBjaGFyIHVzaW5nCisgICAgICAgKiAgdGhlIHNpbXBsZXN0IHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uICBJZiB0aGUgY29udmVyc2lvbgorICAgICAgICogIGZhaWxzLCBkZmF1bHQgaXMgcmV0dXJuZWQgaW5zdGVhZC4gIEZvciBhbiB1bmRlcml2ZWQKKyAgICAgICAqICBjdHlwZTx3Y2hhcl90PiBmYWNldCwgQGEgYyB3aWxsIGJlIGNhc3QgdG8gY2hhciBhbmQKKyAgICAgICAqICByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fbmFycm93KCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZQorICAgICAgICogIGJlaGF2aW9yIG9mIG5hcnJvd2luZy4gIGRvX25hcnJvdygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUKKyAgICAgICAqICBzYW1lIHJlc3VsdCBmb3IgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIHdjaGFyX3QgdG8gY29udmVydC4KKyAgICAgICAqICBAcGFyYW0gX19kZmF1bHQgIENoYXIgdG8gcmV0dXJuIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCBjaGFyLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcgorICAgICAgZG9fbmFycm93KGNoYXJfdHlwZSBfX2MsIGNoYXIgX19kZmF1bHQpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE5hcnJvdyB3Y2hhcl90IGFycmF5IHRvIGNoYXIgYXJyYXkKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggd2NoYXJfdCBpbiB0aGUgcmFuZ2UgW2xvLGhpKSB0bworICAgICAgICogIGNoYXIgdXNpbmcgdGhlIHNpbXBsZXN0IHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24gYW5kIHdyaXRlcyB0aGUKKyAgICAgICAqICByZXN1bHRzIHRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4gIEZvciBhbnkgd2NoYXJfdCBpbiB0aGUgaW5wdXQgdGhhdAorICAgICAgICogIGNhbm5vdCBiZSBjb252ZXJ0ZWQsIEBhIGRmYXVsdCBpcyB1c2VkIGluc3RlYWQuICBGb3IgYW4gdW5kZXJpdmVkCisgICAgICAgKiAgY3R5cGU8d2NoYXJfdD4gZmFjZXQsIHRoZSBhcmd1bWVudCB3aWxsIGJlIGNvcGllZCwgY2FzdGluZyBlYWNoCisgICAgICAgKiAgZWxlbWVudCB0byBjaGFyLgorICAgICAgICoKKyAgICAgICAqICBkb19uYXJyb3coKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbmFycm93aW5nLiAgZG9fbmFycm93KCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9fZGZhdWx0ICBDaGFyIHRvIHVzZSBpZiBjb252ZXJzaW9uIGZhaWxzLgorICAgICAgICogIEBwYXJhbSBfX3RvICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fbmFycm93KGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpLAorCQljaGFyIF9fZGZhdWx0LCBjaGFyKiBfX3RvKSBjb25zdDsKKworICAgICAgLy8gRm9yIHVzZSBhdCBjb25zdHJ1Y3Rpb24gdGltZSBvbmx5LgorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZV9jdHlwZSgpIHRocm93KCk7CisgICAgfTsKKyNlbmRpZiAvL19HTElCQ1hYX1VTRV9XQ0hBUl9UCisKKyAgLy8vIGNsYXNzIGN0eXBlX2J5bmFtZSBbMjIuMi4xLjJdLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgY3R5cGVfYnluYW1lIDogcHVibGljIGN0eXBlPF9DaGFyVD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjdHlwZTxfQ2hhclQ+OjptYXNrICBtYXNrOworCisgICAgICBleHBsaWNpdAorICAgICAgY3R5cGVfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfmN0eXBlX2J5bmFtZSgpIHsgfTsKKyAgICB9OworCisgIC8vLyAyMi4yLjEuNCAgQ2xhc3MgY3R5cGVfYnluYW1lIHNwZWNpYWxpemF0aW9ucy4KKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIGN0eXBlX2J5bmFtZTxjaGFyPiA6IHB1YmxpYyBjdHlwZTxjaGFyPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgY3R5cGVfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfmN0eXBlX2J5bmFtZSgpOworICAgIH07CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgY3R5cGVfYnluYW1lPHdjaGFyX3Q+IDogcHVibGljIGN0eXBlPHdjaGFyX3Q+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBjdHlwZV9ieW5hbWUoY29uc3QgY2hhciogX19zLCBzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+Y3R5cGVfYnluYW1lKCk7CisgICAgfTsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKy8vIEluY2x1ZGUgaG9zdCBhbmQgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBjdHlwZSBpbmxpbmVzLgorI2luY2x1ZGUgPGJpdHMvY3R5cGVfaW5saW5lLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyAyMi4yLjIgIFRoZSBudW1lcmljIGNhdGVnb3J5LgorICBjbGFzcyBfX251bV9iYXNlCisgIHsKKyAgcHVibGljOgorICAgIC8vIE5COiBDb2RlIGRlcGVuZHMgb24gdGhlIG9yZGVyIG9mIF9TX2F0b21zX291dCBlbGVtZW50cy4KKyAgICAvLyBCZWxvdyBhcmUgdGhlIGluZGljZXMgaW50byBfU19hdG9tc19vdXQuCisgICAgZW51bQorICAgICAgeworCV9TX29taW51cywKKwlfU19vcGx1cywKKwlfU19veCwKKwlfU19vWCwKKwlfU19vZGlnaXRzLAorCV9TX29kaWdpdHNfZW5kID0gX1Nfb2RpZ2l0cyArIDE2LAorCV9TX291ZGlnaXRzID0gX1Nfb2RpZ2l0c19lbmQsCisJX1Nfb3VkaWdpdHNfZW5kID0gX1Nfb3VkaWdpdHMgKyAxNiwKKwlfU19vZSA9IF9TX29kaWdpdHMgKyAxNCwgIC8vIEZvciBzY2llbnRpZmljIG5vdGF0aW9uLCAnZScKKwlfU19vRSA9IF9TX291ZGlnaXRzICsgMTQsIC8vIEZvciBzY2llbnRpZmljIG5vdGF0aW9uLCAnRScKKwlfU19vZW5kID0gX1Nfb3VkaWdpdHNfZW5kCisgICAgICB9OworCisgICAgLy8gQSBsaXN0IG9mIHZhbGlkIG51bWVyaWMgbGl0ZXJhbHMgZm9yIG91dHB1dC4gIFRoaXMgYXJyYXkKKyAgICAvLyBjb250YWlucyBjaGFycyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdGhlIGN1cnJlbnQgbG9jYWxlJ3MKKyAgICAvLyBjdHlwZTxfQ2hhclQ+LndpZGVuKCkgYW5kIHRoZW4gdXNlZCB0byByZW5kZXIgbnVtYmVycy4KKyAgICAvLyBGb3IgdGhlIHN0YW5kYXJkICJDIiBsb2NhbGUsIHRoaXMgaXMKKyAgICAvLyAiLSt4WDAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5QUJDREVGIi4KKyAgICBzdGF0aWMgY29uc3QgY2hhciogX1NfYXRvbXNfb3V0OworCisgICAgLy8gU3RyaW5nIGxpdGVyYWwgb2YgYWNjZXB0YWJsZSAobmFycm93KSBpbnB1dCwgZm9yIG51bV9nZXQuCisgICAgLy8gIi0reFgwMTIzNDU2Nzg5YWJjZGVmQUJDREVGIgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBfU19hdG9tc19pbjsKKworICAgIGVudW0KKyAgICB7CisgICAgICBfU19pbWludXMsCisgICAgICBfU19pcGx1cywKKyAgICAgIF9TX2l4LAorICAgICAgX1NfaVgsCisgICAgICBfU19pemVybywKKyAgICAgIF9TX2llID0gX1NfaXplcm8gKyAxNCwKKyAgICAgIF9TX2lFID0gX1NfaXplcm8gKyAyMCwKKyAgICAgIF9TX2llbmQgPSAyNgorICAgIH07CisKKyAgICAvLyBudW1fcHV0CisgICAgLy8gQ29uc3RydWN0IGFuZCByZXR1cm4gdmFsaWQgc2NhbmYgZm9ybWF0IGZvciBmbG9hdGluZyBwb2ludCB0eXBlcy4KKyAgICBzdGF0aWMgdm9pZAorICAgIF9TX2Zvcm1hdF9mbG9hdChjb25zdCBpb3NfYmFzZSYgX19pbywgY2hhciogX19mcHRyLCBjaGFyIF9fbW9kKSB0aHJvdygpOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBzdHJ1Y3QgX19udW1wdW5jdF9jYWNoZSA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0CisgICAgeworICAgICAgY29uc3QgY2hhcioJCQlfTV9ncm91cGluZzsKKyAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9ncm91cGluZ19zaXplOworICAgICAgYm9vbAkJCQlfTV91c2VfZ3JvdXBpbmc7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fdHJ1ZW5hbWU7CisgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fdHJ1ZW5hbWVfc2l6ZTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9mYWxzZW5hbWU7CisgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fZmFsc2VuYW1lX3NpemU7CisgICAgICBfQ2hhclQJCQkJX01fZGVjaW1hbF9wb2ludDsKKyAgICAgIF9DaGFyVAkJCQlfTV90aG91c2FuZHNfc2VwOworCisgICAgICAvLyBBIGxpc3Qgb2YgdmFsaWQgbnVtZXJpYyBsaXRlcmFscyBmb3Igb3V0cHV0OiBpbiB0aGUgc3RhbmRhcmQKKyAgICAgIC8vICJDIiBsb2NhbGUsIHRoaXMgaXMgIi0reFgwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OUFCQ0RFRiIuCisgICAgICAvLyBUaGlzIGFycmF5IGNvbnRhaW5zIHRoZSBjaGFycyBhZnRlciBoYXZpbmcgYmVlbiBwYXNzZWQKKyAgICAgIC8vIHRocm91Z2ggdGhlIGN1cnJlbnQgbG9jYWxlJ3MgY3R5cGU8X0NoYXJUPi53aWRlbigpLgorICAgICAgX0NoYXJUCQkJCV9NX2F0b21zX291dFtfX251bV9iYXNlOjpfU19vZW5kXTsKKworICAgICAgLy8gQSBsaXN0IG9mIHZhbGlkIG51bWVyaWMgbGl0ZXJhbHMgZm9yIGlucHV0OiBpbiB0aGUgc3RhbmRhcmQKKyAgICAgIC8vICJDIiBsb2NhbGUsIHRoaXMgaXMgIi0reFgwMTIzNDU2Nzg5YWJjZGVmQUJDREVGIgorICAgICAgLy8gVGhpcyBhcnJheSBjb250YWlucyB0aGUgY2hhcnMgYWZ0ZXIgaGF2aW5nIGJlZW4gcGFzc2VkCisgICAgICAvLyB0aHJvdWdoIHRoZSBjdXJyZW50IGxvY2FsZSdzIGN0eXBlPF9DaGFyVD4ud2lkZW4oKS4KKyAgICAgIF9DaGFyVAkJCQlfTV9hdG9tc19pbltfX251bV9iYXNlOjpfU19pZW5kXTsKKworICAgICAgYm9vbAkJCQlfTV9hbGxvY2F0ZWQ7CisKKyAgICAgIF9fbnVtcHVuY3RfY2FjaGUoc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2dyb3VwaW5nKDApLCBfTV9ncm91cGluZ19zaXplKDApLAorCV9NX3VzZV9ncm91cGluZyhmYWxzZSksCisJX01fdHJ1ZW5hbWUoMCksIF9NX3RydWVuYW1lX3NpemUoMCksIF9NX2ZhbHNlbmFtZSgwKSwKKwlfTV9mYWxzZW5hbWVfc2l6ZSgwKSwgX01fZGVjaW1hbF9wb2ludChfQ2hhclQoKSksCisJX01fdGhvdXNhbmRzX3NlcChfQ2hhclQoKSksIF9NX2FsbG9jYXRlZChmYWxzZSkKKwl7IH0KKworICAgICAgfl9fbnVtcHVuY3RfY2FjaGUoKTsKKworICAgICAgdm9pZAorICAgICAgX01fY2FjaGUoY29uc3QgbG9jYWxlJiBfX2xvYyk7CisKKyAgICBwcml2YXRlOgorICAgICAgX19udW1wdW5jdF9jYWNoZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX251bXB1bmN0X2NhY2hlJik7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX251bXB1bmN0X2NhY2hlKGNvbnN0IF9fbnVtcHVuY3RfY2FjaGUmKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD46On5fX251bXB1bmN0X2NhY2hlKCkKKyAgICB7CisgICAgICBpZiAoX01fYWxsb2NhdGVkKQorCXsKKwkgIGRlbGV0ZSBbXSBfTV9ncm91cGluZzsKKwkgIGRlbGV0ZSBbXSBfTV90cnVlbmFtZTsKKwkgIGRlbGV0ZSBbXSBfTV9mYWxzZW5hbWU7CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBudW1wdW5jdC4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIFRoaXMgZmFjZXQgc3RvcmVzIHNldmVyYWwgcGllY2VzIG9mIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gcHJpbnRpbmcgYW5kCisgICAqICBzY2FubmluZyBudW1iZXJzLCBzdWNoIGFzIHRoZSBkZWNpbWFsIHBvaW50IGNoYXJhY3Rlci4gIEl0IHRha2VzIGEKKyAgICogIHRlbXBsYXRlIHBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZSBjaGFyIHR5cGUuICBUaGUgbnVtcHVuY3QgZmFjZXQgaXMKKyAgICogIHVzZWQgYnkgc3RyZWFtcyBmb3IgbWFueSBJL08gb3BlcmF0aW9ucyBpbnZvbHZpbmcgbnVtYmVycy4KKyAgICoKKyAgICogIFRoZSBudW1wdW5jdCB0ZW1wbGF0ZSB1c2VzIHByb3RlY3RlZCB2aXJ0dWFsIGZ1bmN0aW9ucyB0byBwcm92aWRlIHRoZQorICAgKiAgYWN0dWFsIHJlc3VsdHMuICBUaGUgcHVibGljIGFjY2Vzc29ycyBmb3J3YXJkIHRoZSBjYWxsIHRvIHRoZSB2aXJ0dWFsCisgICAqICBmdW5jdGlvbnMuICBUaGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgaG9va3MgZm9yIGRldmVsb3BlcnMgdG8KKyAgICogIGltcGxlbWVudCB0aGUgYmVoYXZpb3IgdGhleSByZXF1aXJlIGZyb20gYSBudW1wdW5jdCBmYWNldC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIG51bXB1bmN0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4Jc3RyaW5nX3R5cGU7CisgICAgICAvL0B9CisgICAgICB0eXBlZGVmIF9fbnVtcHVuY3RfY2FjaGU8X0NoYXJUPiAgX19jYWNoZV90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgX19jYWNoZV90eXBlKgkJCV9NX2RhdGE7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gTnVtcHVuY3QgZmFjZXQgaWQuCisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJCWlkOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE51bXB1bmN0IGNvbnN0cnVjdG9yLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcmVmcyAgUmVmY291bnQgdG8gcGFzcyB0byB0aGUgYmFzZSBjbGFzcy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG51bXB1bmN0KHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9kYXRhKDApCisgICAgICB7IF9NX2luaXRpYWxpemVfbnVtcHVuY3QoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEludGVybmFsIGNvbnN0cnVjdG9yLiAgTm90IGZvciBnZW5lcmFsIHVzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZvciB1c2UgYnkgdGhlIGxpYnJhcnkgaXRzZWxmIHRvIHNldCB1cCB0aGUKKyAgICAgICAqICBwcmVkZWZpbmVkIGxvY2FsZSBmYWNldHMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19jYWNoZSAgX19udW1wdW5jdF9jYWNoZSBvYmplY3QuCisgICAgICAgKiAgQHBhcmFtICBfX3JlZnMgIFJlZmNvdW50IHRvIHBhc3MgdG8gdGhlIGJhc2UgY2xhc3MuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBudW1wdW5jdChfX2NhY2hlX3R5cGUqIF9fY2FjaGUsIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9kYXRhKF9fY2FjaGUpCisgICAgICB7IF9NX2luaXRpYWxpemVfbnVtcHVuY3QoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEludGVybmFsIGNvbnN0cnVjdG9yLiAgTm90IGZvciBnZW5lcmFsIHVzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZvciB1c2UgYnkgdGhlIGxpYnJhcnkgaXRzZWxmIHRvIHNldCB1cCBuZXcKKyAgICAgICAqICBsb2NhbGVzLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fY2xvYyAgVGhlIEMgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgX19yZWZzICBSZWZjb3VudCB0byBwYXNzIHRvIHRoZSBiYXNlIGNsYXNzLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbnVtcHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MsIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9kYXRhKDApCisgICAgICB7IF9NX2luaXRpYWxpemVfbnVtcHVuY3QoX19jbG9jKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBkZWNpbWFsIHBvaW50IGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgY2hhcl90eXBlIHRvIHVzZSBhcyBhIGRlY2ltYWwgcG9pbnQuICBJdAorICAgICAgICogIGRvZXMgc28gYnkgcmV0dXJuaW5nIHJldHVybmluZworICAgICAgICogIG51bXB1bmN0PGNoYXJfdHlwZT46OmRvX2RlY2ltYWxfcG9pbnQoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQGEgY2hhcl90eXBlIHJlcHJlc2VudGluZyBhIGRlY2ltYWwgcG9pbnQuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICBkZWNpbWFsX3BvaW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2RlY2ltYWxfcG9pbnQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiB0aG91c2FuZHMgc2VwYXJhdG9yIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgY2hhcl90eXBlIHRvIHVzZSBhcyBhIHRob3VzYW5kcworICAgICAgICogIHNlcGFyYXRvci4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nIHJldHVybmluZworICAgICAgICogIG51bXB1bmN0PGNoYXJfdHlwZT46OmRvX3Rob3VzYW5kc19zZXAoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgY2hhcl90eXBlIHJlcHJlc2VudGluZyBhIHRob3VzYW5kcyBzZXBhcmF0b3IuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB0aG91c2FuZHNfc2VwKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3Rob3VzYW5kc19zZXAoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBncm91cGluZyBzcGVjaWZpY2F0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGdyb3VwaW5ncyBmb3IgdGhlCisgICAgICAgKiAgaW50ZWdlciBwYXJ0IG9mIGEgbnVtYmVyLiAgR3JvdXBpbmdzIGluZGljYXRlIHdoZXJlIHRob3VzYW5kcworICAgICAgICogIHNlcGFyYXRvcnMgc2hvdWxkIGJlIGluc2VydGVkIGluIHRoZSBpbnRlZ2VyIHBhcnQgb2YgYSBudW1iZXIuCisgICAgICAgKgorICAgICAgICogIEVhY2ggY2hhciBpbiB0aGUgcmV0dXJuIHN0cmluZyBpcyBpbnRlcnByZXQgYXMgYW4gaW50ZWdlcgorICAgICAgICogIHJhdGhlciB0aGFuIGEgY2hhcmFjdGVyLiAgVGhlc2UgbnVtYmVycyByZXByZXNlbnQgdGhlIG51bWJlcgorICAgICAgICogIG9mIGRpZ2l0cyBpbiBhIGdyb3VwLiAgVGhlIGZpcnN0IGNoYXIgaW4gdGhlIHN0cmluZworICAgICAgICogIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50CisgICAgICAgKiAgZ3JvdXAuICBJZiBhIGNoYXIgaXMgbmVnYXRpdmUsIGl0IGluZGljYXRlcyBhbiB1bmxpbWl0ZWQKKyAgICAgICAqICBudW1iZXIgb2YgZGlnaXRzIGZvciB0aGUgZ3JvdXAuICBJZiBtb3JlIGNoYXJzIGZyb20gdGhlCisgICAgICAgKiAgc3RyaW5nIGFyZSByZXF1aXJlZCB0byBncm91cCBhIG51bWJlciwgdGhlIGxhc3QgY2hhciBpcyB1c2VkCisgICAgICAgKiAgcmVwZWF0ZWRseS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBncm91cGluZygpIHJldHVybnMgIlwwMDNcMDAyIiBhbmQgaXMKKyAgICAgICAqICBhcHBsaWVkIHRvIHRoZSBudW1iZXIgMTIzNDU2Nzg5LCB0aGlzIGNvcnJlc3BvbmRzIHRvCisgICAgICAgKiAgMTIsMzQsNTYsNzg5LiAgTm90ZSB0aGF0IGlmIHRoZSBzdHJpbmcgd2FzICIzMiIsIHRoaXMgd291bGQKKyAgICAgICAqICBwdXQgbW9yZSB0aGFuIDUwIGRpZ2l0cyBpbnRvIHRoZSBsZWFzdCBzaWduaWZpY2FudCBncm91cCBpZgorICAgICAgICogIHRoZSBjaGFyYWN0ZXIgc2V0IGlzIEFTQ0lJLgorICAgICAgICoKKyAgICAgICAqICBUaGUgc3RyaW5nIGlzIHJldHVybmVkIGJ5IGNhbGxpbmcKKyAgICAgICAqICBudW1wdW5jdDxjaGFyX3R5cGU+Ojpkb19ncm91cGluZygpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBzdHJpbmcgcmVwcmVzZW50aW5nIGdyb3VwaW5nIHNwZWNpZmljYXRpb24uCisgICAgICAqLworICAgICAgc3RyaW5nCisgICAgICBncm91cGluZygpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19ncm91cGluZygpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBib29sIHRydWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZ190eXBlIGNvbnRhaW5pbmcgdGhlIHRleHQKKyAgICAgICAqICByZXByZXNlbnRhdGlvbiBmb3IgdHJ1ZSBib29sIHZhcmlhYmxlcy4gIEl0IGRvZXMgc28gYnkgY2FsbGluZworICAgICAgICogIG51bXB1bmN0PGNoYXJfdHlwZT46OmRvX3RydWVuYW1lKCkuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIHN0cmluZ190eXBlIHJlcHJlc2VudGluZyBwcmludGVkIGZvcm0gb2YgdHJ1ZS4KKyAgICAgICovCisgICAgICBzdHJpbmdfdHlwZQorICAgICAgdHJ1ZW5hbWUoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdHJ1ZW5hbWUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYm9vbCBmYWxzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nX3R5cGUgY29udGFpbmluZyB0aGUgdGV4dAorICAgICAgICogIHJlcHJlc2VudGF0aW9uIGZvciBmYWxzZSBib29sIHZhcmlhYmxlcy4gIEl0IGRvZXMgc28gYnkgY2FsbGluZworICAgICAgICogIG51bXB1bmN0PGNoYXJfdHlwZT46OmRvX2ZhbHNlbmFtZSgpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBzdHJpbmdfdHlwZSByZXByZXNlbnRpbmcgcHJpbnRlZCBmb3JtIG9mIGZhbHNlLgorICAgICAgKi8KKyAgICAgIHN0cmluZ190eXBlCisgICAgICBmYWxzZW5hbWUoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZmFsc2VuYW1lKCk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBEZXN0cnVjdG9yLgorICAgICAgdmlydHVhbAorICAgICAgfm51bXB1bmN0KCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGRlY2ltYWwgcG9pbnQgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgY2hhcl90eXBlIHRvIHVzZSBhcyBhIGRlY2ltYWwgcG9pbnQuICBUaGlzIGZ1bmN0aW9uIGlzIGEKKyAgICAgICAqICBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQGEgY2hhcl90eXBlIHJlcHJlc2VudGluZyBhIGRlY2ltYWwgcG9pbnQuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fZGVjaW1hbF9wb2ludDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiB0aG91c2FuZHMgc2VwYXJhdG9yIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIGNoYXJfdHlwZSB0byB1c2UgYXMgYSB0aG91c2FuZHMgc2VwYXJhdG9yLiAgVGhpcyBmdW5jdGlvbgorICAgICAgICogIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIGNoYXJfdHlwZSByZXByZXNlbnRpbmcgYSB0aG91c2FuZHMgc2VwYXJhdG9yLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX3Rob3VzYW5kc19zZXA7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gZ3JvdXBpbmcgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgZ3JvdXBpbmdzIGZvciB0aGUgaW50ZWdlciBwYXJ0IG9mIGEKKyAgICAgICAqICBudW1iZXIuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUKKyAgICAgICAqICB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgZ3JvdXBpbmcoKSBmb3IgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgU3RyaW5nIHJlcHJlc2VudGluZyBncm91cGluZyBzcGVjaWZpY2F0aW9uLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgc3RyaW5nCisgICAgICBkb19ncm91cGluZygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhLT5fTV9ncm91cGluZzsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYm9vbCB0cnVlLgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgc3RyaW5nX3R5cGUgY29udGFpbmluZyB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBmb3IgdHJ1ZQorICAgICAgICogIGJvb2wgdmFyaWFibGVzLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0bworICAgICAgICogIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIHN0cmluZ190eXBlIHJlcHJlc2VudGluZyBwcmludGVkIGZvcm0gb2YgdHJ1ZS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHN0cmluZ190eXBlCisgICAgICBkb190cnVlbmFtZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhLT5fTV90cnVlbmFtZTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYm9vbCBmYWxzZS4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIHN0cmluZ190eXBlIGNvbnRhaW5pbmcgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gZm9yIGZhbHNlCisgICAgICAgKiAgYm9vbCB2YXJpYWJsZXMuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvCisgICAgICAgKiAgY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgc3RyaW5nX3R5cGUgcmVwcmVzZW50aW5nIHByaW50ZWQgZm9ybSBvZiBmYWxzZS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHN0cmluZ190eXBlCisgICAgICBkb19mYWxzZW5hbWUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fZmFsc2VuYW1lOyB9CisKKyAgICAgIC8vIEZvciB1c2UgYXQgY29uc3RydWN0aW9uIHRpbWUgb25seS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemVfbnVtcHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MgPSAwKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBsb2NhbGU6OmlkIG51bXB1bmN0PF9DaGFyVD46OmlkOworCisgIHRlbXBsYXRlPD4KKyAgICBudW1wdW5jdDxjaGFyPjo6fm51bXB1bmN0KCk7CisKKyAgdGVtcGxhdGU8PgorICAgIHZvaWQKKyAgICBudW1wdW5jdDxjaGFyPjo6X01faW5pdGlhbGl6ZV9udW1wdW5jdChfX2NfbG9jYWxlIF9fY2xvYyk7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgbnVtcHVuY3Q8d2NoYXJfdD46On5udW1wdW5jdCgpOworCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgbnVtcHVuY3Q8d2NoYXJfdD46Ol9NX2luaXRpYWxpemVfbnVtcHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MpOworI2VuZGlmCisKKyAgLy8vIGNsYXNzIG51bXB1bmN0X2J5bmFtZSBbMjIuMi4zLjJdLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgbnVtcHVuY3RfYnluYW1lIDogcHVibGljIG51bXB1bmN0PF9DaGFyVD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+CXN0cmluZ190eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgbnVtcHVuY3RfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IG51bXB1bmN0PF9DaGFyVD4oX19yZWZzKQorICAgICAgeworCWlmIChfX2J1aWx0aW5fc3RyY21wKF9fcywgIkMiKSAhPSAwCisJICAgICYmIF9fYnVpbHRpbl9zdHJjbXAoX19zLCAiUE9TSVgiKSAhPSAwKQorCSAgeworCSAgICBfX2NfbG9jYWxlIF9fdG1wOworCSAgICB0aGlzLT5fU19jcmVhdGVfY19sb2NhbGUoX190bXAsIF9fcyk7CisJICAgIHRoaXMtPl9NX2luaXRpYWxpemVfbnVtcHVuY3QoX190bXApOworCSAgICB0aGlzLT5fU19kZXN0cm95X2NfbG9jYWxlKF9fdG1wKTsKKwkgIH0KKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5udW1wdW5jdF9ieW5hbWUoKSB7IH0KKyAgICB9OworCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfTERCTAorCisgIC8qKgorICAgKiAgQGJyaWVmICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIG51bV9nZXQuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIGZhY2V0IGVuY2Fwc3VsYXRlcyB0aGUgY29kZSB0byBwYXJzZSBhbmQgcmV0dXJuIGEgbnVtYmVyCisgICAqICBmcm9tIGEgc3RyaW5nLiAgSXQgaXMgdXNlZCBieSB0aGUgaXN0cmVhbSBudW1lcmljIGV4dHJhY3Rpb24KKyAgICogIG9wZXJhdG9ycy4KKyAgICoKKyAgICogIFRoZSBudW1fZ2V0IHRlbXBsYXRlIHVzZXMgcHJvdGVjdGVkIHZpcnR1YWwgZnVuY3Rpb25zIHRvIHByb3ZpZGUgdGhlCisgICAqICBhY3R1YWwgcmVzdWx0cy4gIFRoZSBwdWJsaWMgYWNjZXNzb3JzIGZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIHZpcnR1YWwKKyAgICogIGZ1bmN0aW9ucy4gIFRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBob29rcyBmb3IgZGV2ZWxvcGVycyB0bworICAgKiAgaW1wbGVtZW50IHRoZSBiZWhhdmlvciB0aGV5IHJlcXVpcmUgZnJvbSB0aGUgbnVtX2dldCBmYWNldC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIGNsYXNzIG51bV9nZXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfSW5JdGVyCQkJaXRlcl90eXBlOworICAgICAgLy9AfQorCisgICAgICAvLy8gTnVtcHVuY3QgZmFjZXQgaWQuCisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJCWlkOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX3JlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbnVtX2dldChzaXplX3QgX19yZWZzID0gMCkgOiBmYWNldChfX3JlZnMpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE51bWVyaWMgcGFyc2luZy4KKyAgICAgICAqCisgICAgICAgKiAgUGFyc2VzIHRoZSBpbnB1dCBzdHJlYW0gaW50byB0aGUgYm9vbCBAYSB2LiAgSXQgZG9lcyBzbyBieSBjYWxsaW5nCisgICAgICAgKiAgbnVtX2dldDo6ZG9fZ2V0KCkuCisgICAgICAgKgorICAgICAgICogIElmIGlvc19iYXNlOjpib29sYWxwaGEgaXMgc2V0LCBhdHRlbXB0cyB0byByZWFkCisgICAgICAgKiAgY3R5cGU8Q2hhclQ+Ojp0cnVlbmFtZSgpIG9yIGN0eXBlPENoYXJUPjo6ZmFsc2VuYW1lKCkuICBTZXRzCisgICAgICAgKiAgQGEgdiB0byB0cnVlIG9yIGZhbHNlIGlmIHN1Y2Nlc3NmdWwuICBTZXRzIGVyciB0bworICAgICAgICogIGlvc19iYXNlOjpmYWlsYml0IGlmIHJlYWRpbmcgdGhlIHN0cmluZyBmYWlscy4gIFNldHMgZXJyIHRvCisgICAgICAgKiAgaW9zX2Jhc2U6OmVvZmJpdCBpZiB0aGUgc3RyZWFtIGlzIGVtcHRpZWQuCisgICAgICAgKgorICAgICAgICogIElmIGlvc19iYXNlOjpib29sYWxwaGEgaXMgbm90IHNldCwgcHJvY2VlZHMgYXMgd2l0aCByZWFkaW5nIGEgbG9uZywKKyAgICAgICAqICBleGNlcHQgaWYgdGhlIHZhbHVlIGlzIDEsIHNldHMgQGEgdiB0byB0cnVlLCBpZiB0aGUgdmFsdWUgaXMgMCwgc2V0cworICAgICAgICogIEBhIHYgdG8gZmFsc2UsIGFuZCBvdGhlcndpc2Ugc2V0IGVyciB0byBpb3NfYmFzZTo6ZmFpbGJpdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2luICBTdGFydCBvZiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBfX2VuZCAgRW5kIG9mIGlucHV0IHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBsb2NhbGUgYW5kIGZsYWdzLgorICAgICAgICogIEBwYXJhbSAgX19lcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fdiAgVmFsdWUgdG8gZm9ybWF0IGFuZCBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgcmVhZGluZy4KKyAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgYm9vbCYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0KF9faW4sIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE51bWVyaWMgcGFyc2luZy4KKyAgICAgICAqCisgICAgICAgKiAgUGFyc2VzIHRoZSBpbnB1dCBzdHJlYW0gaW50byB0aGUgaW50ZWdyYWwgdmFyaWFibGUgQGEgdi4gIEl0IGRvZXMgc28KKyAgICAgICAqICBieSBjYWxsaW5nIG51bV9nZXQ6OmRvX2dldCgpLgorICAgICAgICoKKyAgICAgICAqICBQYXJzaW5nIGlzIGFmZmVjdGVkIGJ5IHRoZSBmbGFnIHNldHRpbmdzIGluIEBhIGlvLgorICAgICAgICoKKyAgICAgICAqICBUaGUgYmFzaWMgcGFyc2UgaXMgYWZmZWN0ZWQgYnkgdGhlIHZhbHVlIG9mIGlvLmZsYWdzKCkgJgorICAgICAgICogIGlvc19iYXNlOjpiYXNlZmllbGQuICBJZiBlcXVhbCB0byBpb3NfYmFzZTo6b2N0LCBwYXJzZXMgbGlrZSB0aGUKKyAgICAgICAqICBzY2FuZiAlbyBzcGVjaWZpZXIuICBFbHNlIGlmIGVxdWFsIHRvIGlvc19iYXNlOjpoZXgsIHBhcnNlcyBsaWtlICVYCisgICAgICAgKiAgc3BlY2lmaWVyLiAgRWxzZSBpZiBiYXNlZmllbGQgZXF1YWwgdG8gMCwgcGFyc2VzIGxpa2UgdGhlICVpCisgICAgICAgKiAgc3BlY2lmaWVyLiAgT3RoZXJ3aXNlLCBwYXJzZXMgbGlrZSAlZCBmb3Igc2lnbmVkIGFuZCAldSBmb3IgdW5zaWduZWQKKyAgICAgICAqICB0eXBlcy4gIFRoZSBtYXRjaGluZyB0eXBlIGxlbmd0aCBtb2RpZmllciBpcyBhbHNvIHVzZWQuCisgICAgICAgKgorICAgICAgICogIERpZ2l0IGdyb3VwaW5nIGlzIGludGVycHJldGVkIGFjY29yZGluZyB0bworICAgICAgICogIG51bXB1bmN0Ojpncm91cGluZygpIGFuZCBudW1wdW5jdDo6dGhvdXNhbmRzX3NlcCgpLiAgSWYgdGhlCisgICAgICAgKiAgcGF0dGVybiBvZiBkaWdpdCBncm91cHMgaXNuJ3QgY29uc2lzdGVudCwgc2V0cyBlcnIgdG8KKyAgICAgICAqICBpb3NfYmFzZTo6ZmFpbGJpdC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgcGFyc2luZyB0aGUgc3RyaW5nIHlpZWxkcyBhIHZhbGlkIHZhbHVlIGZvciBAYSB2LCBAYSB2IGlzIHNldC4KKyAgICAgICAqICBPdGhlcndpc2UsIHNldHMgZXJyIHRvIGlvc19iYXNlOjpmYWlsYml0IGFuZCBsZWF2ZXMgQGEgdiB1bmFsdGVyZWQuCisgICAgICAgKiAgU2V0cyBlcnIgdG8gaW9zX2Jhc2U6OmVvZmJpdCBpZiB0aGUgc3RyZWFtIGlzIGVtcHRpZWQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19pbiAgU3RhcnQgb2YgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgbG9jYWxlIGFuZCBmbGFncy4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3YgIFZhbHVlIHRvIGZvcm1hdCBhbmQgaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHJlYWRpbmcuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcmIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKworICAgICAgaXRlcl90eXBlCisgICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIHNob3J0JiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX2luLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBpbnQmIF9fdikgICBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0KF9faW4sIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgbG9uZyYgX192KSAgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX2luLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGxvbmcmIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKworICAgICAgaXRlcl90eXBlCisgICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIGxvbmcgbG9uZyYgX192KSAgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKyNlbmRpZgorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE51bWVyaWMgcGFyc2luZy4KKyAgICAgICAqCisgICAgICAgKiAgUGFyc2VzIHRoZSBpbnB1dCBzdHJlYW0gaW50byB0aGUgaW50ZWdyYWwgdmFyaWFibGUgQGEgdi4gIEl0IGRvZXMgc28KKyAgICAgICAqICBieSBjYWxsaW5nIG51bV9nZXQ6OmRvX2dldCgpLgorICAgICAgICoKKyAgICAgICAqICBUaGUgaW5wdXQgY2hhcmFjdGVycyBhcmUgcGFyc2VkIGxpa2UgdGhlIHNjYW5mICVnIHNwZWNpZmllci4gIFRoZQorICAgICAgICogIG1hdGNoaW5nIHR5cGUgbGVuZ3RoIG1vZGlmaWVyIGlzIGFsc28gdXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGRlY2ltYWwgcG9pbnQgY2hhcmFjdGVyIHVzZWQgaXMgbnVtcHVuY3Q6OmRlY2ltYWxfcG9pbnQoKS4KKyAgICAgICAqICBEaWdpdCBncm91cGluZyBpcyBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8KKyAgICAgICAqICBudW1wdW5jdDo6Z3JvdXBpbmcoKSBhbmQgbnVtcHVuY3Q6OnRob3VzYW5kc19zZXAoKS4gIElmIHRoZQorICAgICAgICogIHBhdHRlcm4gb2YgZGlnaXQgZ3JvdXBzIGlzbid0IGNvbnNpc3RlbnQsIHNldHMgZXJyIHRvCisgICAgICAgKiAgaW9zX2Jhc2U6OmZhaWxiaXQuCisgICAgICAgKgorICAgICAgICogIElmIHBhcnNpbmcgdGhlIHN0cmluZyB5aWVsZHMgYSB2YWxpZCB2YWx1ZSBmb3IgQGEgdiwgQGEgdiBpcyBzZXQuCisgICAgICAgKiAgT3RoZXJ3aXNlLCBzZXRzIGVyciB0byBpb3NfYmFzZTo6ZmFpbGJpdCBhbmQgbGVhdmVzIEBhIHYgdW5hbHRlcmVkLgorICAgICAgICogIFNldHMgZXJyIHRvIGlvc19iYXNlOjplb2ZiaXQgaWYgdGhlIHN0cmVhbSBpcyBlbXB0aWVkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9faW4gIFN0YXJ0IG9mIGlucHV0IHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2YgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIGxvY2FsZSBhbmQgZmxhZ3MuCisgICAgICAgKiAgQHBhcmFtICBfX2VyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgX192ICBWYWx1ZSB0byBmb3JtYXQgYW5kIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciByZWFkaW5nLgorICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX2luLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBmbG9hdCYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0KF9faW4sIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgZG91YmxlJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX2luLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGRvdWJsZSYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0KF9faW4sIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE51bWVyaWMgcGFyc2luZy4KKyAgICAgICAqCisgICAgICAgKiAgUGFyc2VzIHRoZSBpbnB1dCBzdHJlYW0gaW50byB0aGUgcG9pbnRlciB2YXJpYWJsZSBAYSB2LiAgSXQgZG9lcyBzbworICAgICAgICogIGJ5IGNhbGxpbmcgbnVtX2dldDo6ZG9fZ2V0KCkuCisgICAgICAgKgorICAgICAgICogIFRoZSBpbnB1dCBjaGFyYWN0ZXJzIGFyZSBwYXJzZWQgbGlrZSB0aGUgc2NhbmYgJXAgc3BlY2lmaWVyLgorICAgICAgICoKKyAgICAgICAqICBEaWdpdCBncm91cGluZyBpcyBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8KKyAgICAgICAqICBudW1wdW5jdDo6Z3JvdXBpbmcoKSBhbmQgbnVtcHVuY3Q6OnRob3VzYW5kc19zZXAoKS4gIElmIHRoZQorICAgICAgICogIHBhdHRlcm4gb2YgZGlnaXQgZ3JvdXBzIGlzbid0IGNvbnNpc3RlbnQsIHNldHMgZXJyIHRvCisgICAgICAgKiAgaW9zX2Jhc2U6OmZhaWxiaXQuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZGlnaXQgZ3JvdXBpbmcgZWZmZWN0IGZvciBwb2ludGVycyBpcyBhIGJpdCBhbWJpZ3VvdXMKKyAgICAgICAqICBpbiB0aGUgc3RhbmRhcmQgYW5kIHNob3VsZG4ndCBiZSByZWxpZWQgb24uICBTZWUgRFIgMzQ0LgorICAgICAgICoKKyAgICAgICAqICBJZiBwYXJzaW5nIHRoZSBzdHJpbmcgeWllbGRzIGEgdmFsaWQgdmFsdWUgZm9yIEBhIHYsIEBhIHYgaXMgc2V0LgorICAgICAgICogIE90aGVyd2lzZSwgc2V0cyBlcnIgdG8gaW9zX2Jhc2U6OmZhaWxiaXQgYW5kIGxlYXZlcyBAYSB2IHVuYWx0ZXJlZC4KKyAgICAgICAqICBTZXRzIGVyciB0byBpb3NfYmFzZTo6ZW9mYml0IGlmIHRoZSBzdHJlYW0gaXMgZW1wdGllZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2luICBTdGFydCBvZiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBfX2VuZCAgRW5kIG9mIGlucHV0IHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBsb2NhbGUgYW5kIGZsYWdzLgorICAgICAgICogIEBwYXJhbSAgX19lcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fdiAgVmFsdWUgdG8gZm9ybWF0IGFuZCBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgcmVhZGluZy4KKyAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgdm9pZComIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBEZXN0cnVjdG9yLgorICAgICAgdmlydHVhbCB+bnVtX2dldCgpIHsgfQorCisgICAgICBpdGVyX3R5cGUKKyAgICAgIF9NX2V4dHJhY3RfZmxvYXQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLAorCQkgICAgICAgc3RyaW5nJikgY29uc3Q7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZVQ+CisJaXRlcl90eXBlCisJX01fZXh0cmFjdF9pbnQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLAorCQkgICAgICAgX1ZhbHVlVCYpIGNvbnN0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQyPgorICAgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUMj46Ol9fdmFsdWUsIGludD46Ol9fdHlwZQorCV9NX2ZpbmQoY29uc3QgX0NoYXJUMiosIHNpemVfdCBfX2xlbiwgX0NoYXJUMiBfX2MpIGNvbnN0CisJeworCSAgaW50IF9fcmV0ID0gLTE7CisJICBpZiAoX19sZW4gPD0gMTApCisJICAgIHsKKwkgICAgICBpZiAoX19jID49IF9DaGFyVDIoJzAnKSAmJiBfX2MgPCBfQ2hhclQyKF9DaGFyVDIoJzAnKSArIF9fbGVuKSkKKwkJX19yZXQgPSBfX2MgLSBfQ2hhclQyKCcwJyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChfX2MgPj0gX0NoYXJUMignMCcpICYmIF9fYyA8PSBfQ2hhclQyKCc5JykpCisJCV9fcmV0ID0gX19jIC0gX0NoYXJUMignMCcpOworCSAgICAgIGVsc2UgaWYgKF9fYyA+PSBfQ2hhclQyKCdhJykgJiYgX19jIDw9IF9DaGFyVDIoJ2YnKSkKKwkJX19yZXQgPSAxMCArIChfX2MgLSBfQ2hhclQyKCdhJykpOworCSAgICAgIGVsc2UgaWYgKF9fYyA+PSBfQ2hhclQyKCdBJykgJiYgX19jIDw9IF9DaGFyVDIoJ0YnKSkKKwkJX19yZXQgPSAxMCArIChfX2MgLSBfQ2hhclQyKCdBJykpOworCSAgICB9CisJICByZXR1cm4gX19yZXQ7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQyPgorICAgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwhX19pc19jaGFyPF9DaGFyVDI+OjpfX3ZhbHVlLAorCQkJCSAgICAgIGludD46Ol9fdHlwZQorCV9NX2ZpbmQoY29uc3QgX0NoYXJUMiogX196ZXJvLCBzaXplX3QgX19sZW4sIF9DaGFyVDIgX19jKSBjb25zdAorCXsKKwkgIGludCBfX3JldCA9IC0xOworCSAgY29uc3QgY2hhcl90eXBlKiBfX3EgPSBjaGFyX3RyYWl0czxfQ2hhclQyPjo6ZmluZChfX3plcm8sIF9fbGVuLCBfX2MpOworCSAgaWYgKF9fcSkKKwkgICAgeworCSAgICAgIF9fcmV0ID0gX19xIC0gX196ZXJvOworCSAgICAgIGlmIChfX3JldCA+IDE1KQorCQlfX3JldCAtPSA2OworCSAgICB9CisJICByZXR1cm4gX19yZXQ7CisJfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE51bWVyaWMgcGFyc2luZy4KKyAgICAgICAqCisgICAgICAgKiAgUGFyc2VzIHRoZSBpbnB1dCBzdHJlYW0gaW50byB0aGUgdmFyaWFibGUgQGEgdi4gIFRoaXMgZnVuY3Rpb24gaXMgYQorICAgICAgICogIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLiAgQHNlZSBnZXQoKQorICAgICAgICogIGZvciBtb3JlIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19iZWcgIFN0YXJ0IG9mIGlucHV0IHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2YgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIGxvY2FsZSBhbmQgZmxhZ3MuCisgICAgICAgKiAgQHBhcmFtICBfX2VyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgX192ICBWYWx1ZSB0byBmb3JtYXQgYW5kIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciByZWFkaW5nLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLCBib29sJikgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHRyYWN0X2ludChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBzaG9ydCYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdF9pbnQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgaW50JiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHRyYWN0X2ludChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBsb25nJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHRyYWN0X2ludChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBsb25nJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHRyYWN0X2ludChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBsb25nIGxvbmcmIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2V4dHJhY3RfaW50KF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKyNlbmRpZgorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSwgaXRlcl90eXBlLCBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRlJiwgZmxvYXQmKSBjb25zdDsKKworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldChpdGVyX3R5cGUsIGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBpb3NfYmFzZTo6aW9zdGF0ZSYsCisJICAgICBkb3VibGUmKSBjb25zdDsKKworICAgICAgLy8gWFhYIEdMSUJDWFhfQUJJIERlcHJlY2F0ZWQKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0xPTkdfRE9VQkxFX0NPTVBBVCAmJiBkZWZpbmVkIF9fTE9OR19ET1VCTEVfMTI4X18KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBfX2RvX2dldChpdGVyX3R5cGUsIGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBpb3NfYmFzZTo6aW9zdGF0ZSYsCisJICAgICAgIGRvdWJsZSYpIGNvbnN0OworI2Vsc2UKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLAorCSAgICAgbG9uZyBkb3VibGUmKSBjb25zdDsKKyNlbmRpZgorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSwgaXRlcl90eXBlLCBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRlJiwgdm9pZComKSBjb25zdDsKKworICAgICAgLy8gWFhYIEdMSUJDWFhfQUJJIERlcHJlY2F0ZWQKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0xPTkdfRE9VQkxFX0NPTVBBVCAmJiBkZWZpbmVkIF9fTE9OR19ET1VCTEVfMTI4X18KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLAorCSAgICAgbG9uZyBkb3VibGUmKSBjb25zdDsKKyNlbmRpZgorICAgICAgLy9AfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIGxvY2FsZTo6aWQgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjppZDsKKworCisgIC8qKgorICAgKiAgQGJyaWVmICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIG51bV9wdXQuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIGZhY2V0IGVuY2Fwc3VsYXRlcyB0aGUgY29kZSB0byBjb252ZXJ0IGEgbnVtYmVyIHRvIGEgc3RyaW5nLiAgSXQgaXMKKyAgICogIHVzZWQgYnkgdGhlIG9zdHJlYW0gbnVtZXJpYyBpbnNlcnRpb24gb3BlcmF0b3JzLgorICAgKgorICAgKiAgVGhlIG51bV9wdXQgdGVtcGxhdGUgdXNlcyBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMgdG8gcHJvdmlkZSB0aGUKKyAgICogIGFjdHVhbCByZXN1bHRzLiAgVGhlIHB1YmxpYyBhY2Nlc3NvcnMgZm9yd2FyZCB0aGUgY2FsbCB0byB0aGUgdmlydHVhbAorICAgKiAgZnVuY3Rpb25zLiAgVGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGhvb2tzIGZvciBkZXZlbG9wZXJzIHRvCisgICAqICBpbXBsZW1lbnQgdGhlIGJlaGF2aW9yIHRoZXkgcmVxdWlyZSBmcm9tIHRoZSBudW1fcHV0IGZhY2V0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIGNsYXNzIG51bV9wdXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9PdXRJdGVyCQlpdGVyX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vLyBOdW1wdW5jdCBmYWNldCBpZC4KKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19yZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG51bV9wdXQoc2l6ZV90IF9fcmVmcyA9IDApIDogZmFjZXQoX19yZWZzKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOdW1lcmljIGZvcm1hdHRpbmcuCisgICAgICAgKgorICAgICAgICogIEZvcm1hdHMgdGhlIGJvb2xlYW4gQGEgdiBhbmQgaW5zZXJ0cyBpdCBpbnRvIGEgc3RyZWFtLiAgSXQgZG9lcyBzbworICAgICAgICogIGJ5IGNhbGxpbmcgbnVtX3B1dDo6ZG9fcHV0KCkuCisgICAgICAgKgorICAgICAgICogIElmIGlvc19iYXNlOjpib29sYWxwaGEgaXMgc2V0LCB3cml0ZXMgY3R5cGU8Q2hhclQ+Ojp0cnVlbmFtZSgpIG9yCisgICAgICAgKiAgY3R5cGU8Q2hhclQ+OjpmYWxzZW5hbWUoKS4gIE90aGVyd2lzZSBmb3JtYXRzIEBhIHYgYXMgYW4gaW50LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcyAgU3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIGxvY2FsZSBhbmQgZmxhZ3MuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpbGwgIENoYXJfdHlwZSB0byB1c2UgZm9yIGZpbGxpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3YgIFZhbHVlIHRvIGZvcm1hdCBhbmQgaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHdyaXRpbmcuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGJvb2wgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19pbywgX19maWxsLCBfX3YpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTnVtZXJpYyBmb3JtYXR0aW5nLgorICAgICAgICoKKyAgICAgICAqICBGb3JtYXRzIHRoZSBpbnRlZ3JhbCB2YWx1ZSBAYSB2IGFuZCBpbnNlcnRzIGl0IGludG8gYQorICAgICAgICogIHN0cmVhbS4gIEl0IGRvZXMgc28gYnkgY2FsbGluZyBudW1fcHV0Ojpkb19wdXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybWF0dGluZyBpcyBhZmZlY3RlZCBieSB0aGUgZmxhZyBzZXR0aW5ncyBpbiBAYSBpby4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGJhc2ljIGZvcm1hdCBpcyBhZmZlY3RlZCBieSB0aGUgdmFsdWUgb2YgaW8uZmxhZ3MoKSAmCisgICAgICAgKiAgaW9zX2Jhc2U6OmJhc2VmaWVsZC4gIElmIGVxdWFsIHRvIGlvc19iYXNlOjpvY3QsIGZvcm1hdHMgbGlrZSB0aGUKKyAgICAgICAqICBwcmludGYgJW8gc3BlY2lmaWVyLiAgRWxzZSBpZiBlcXVhbCB0byBpb3NfYmFzZTo6aGV4LCBmb3JtYXRzIGxpa2UKKyAgICAgICAqICAleCBvciAlWCB3aXRoIGlvc19iYXNlOjp1cHBlcmNhc2UgdW5zZXQgb3Igc2V0IHJlc3BlY3RpdmVseS4KKyAgICAgICAqICBPdGhlcndpc2UsIGZvcm1hdHMgbGlrZSAlZCwgJWxkLCAlbGxkIGZvciBzaWduZWQgYW5kICV1LCAlbHUsICVsbHUKKyAgICAgICAqICBmb3IgdW5zaWduZWQgdmFsdWVzLiAgTm90ZSB0aGF0IGlmIGJvdGggb2N0IGFuZCBoZXggYXJlIHNldCwgbmVpdGhlcgorICAgICAgICogIHdpbGwgdGFrZSBlZmZlY3QuCisgICAgICAgKgorICAgICAgICogIElmIGlvc19iYXNlOjpzaG93cG9zIGlzIHNldCwgJysnIGlzIG91dHB1dCBiZWZvcmUgcG9zaXRpdmUgdmFsdWVzLgorICAgICAgICogIElmIGlvc19iYXNlOjpzaG93YmFzZSBpcyBzZXQsICcwJyBwcmVjZWRlcyBvY3RhbCB2YWx1ZXMgKGV4Y2VwdCAwKQorICAgICAgICogIGFuZCAnMFt4WF0nIHByZWNlZGVzIGhleCB2YWx1ZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBkZWNpbWFsIHBvaW50IGNoYXJhY3RlciB1c2VkIGlzIG51bXB1bmN0OjpkZWNpbWFsX3BvaW50KCkuCisgICAgICAgKiAgVGhvdXNhbmRzIHNlcGFyYXRvcnMgYXJlIGluc2VydGVkIGFjY29yZGluZyB0bworICAgICAgICogIG51bXB1bmN0Ojpncm91cGluZygpIGFuZCBudW1wdW5jdDo6dGhvdXNhbmRzX3NlcCgpLgorICAgICAgICoKKyAgICAgICAqICBJZiBpby53aWR0aCgpIGlzIG5vbi16ZXJvLCBlbm91Z2ggQGEgZmlsbCBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZCB0bworICAgICAgICogIG1ha2UgdGhlIHJlc3VsdCBhdCBsZWFzdCB0aGF0IHdpZGUuICBJZgorICAgICAgICogIChpby5mbGFncygpICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKSA9PSBpb3NfYmFzZTo6bGVmdCwgcmVzdWx0IGlzCisgICAgICAgKiAgcGFkZGVkIGF0IHRoZSBlbmQuICBJZiBpb3NfYmFzZTo6aW50ZXJuYWwsIHRoZW4gcGFkZGluZyBvY2N1cnMKKyAgICAgICAqICBpbW1lZGlhdGVseSBhZnRlciBlaXRoZXIgYSAnKycgb3IgJy0nIG9yIGFmdGVyICcweCcgb3IgJzBYJy4KKyAgICAgICAqICBPdGhlcndpc2UsIHBhZGRpbmcgb2NjdXJzIGF0IHRoZSBiZWdpbm5pbmcuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zICBTdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgbG9jYWxlIGFuZCBmbGFncy4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlsbCAgQ2hhcl90eXBlIHRvIHVzZSBmb3IgZmlsbGluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fdiAgVmFsdWUgdG8gZm9ybWF0IGFuZCBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwgbG9uZyBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19wdXQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fdik7IH0KKworICAgICAgaXRlcl90eXBlCisgICAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICB1bnNpZ25lZCBsb25nIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9faW8sIF9fZmlsbCwgX192KTsgfQorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0xPTkdfTE9ORworICAgICAgaXRlcl90eXBlCisgICAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGxvbmcgbG9uZyBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19wdXQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fdik7IH0KKworICAgICAgaXRlcl90eXBlCisgICAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICB1bnNpZ25lZCBsb25nIGxvbmcgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19pbywgX19maWxsLCBfX3YpOyB9CisjZW5kaWYKKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOdW1lcmljIGZvcm1hdHRpbmcuCisgICAgICAgKgorICAgICAgICogIEZvcm1hdHMgdGhlIGZsb2F0aW5nIHBvaW50IHZhbHVlIEBhIHYgYW5kIGluc2VydHMgaXQgaW50byBhIHN0cmVhbS4KKyAgICAgICAqICBJdCBkb2VzIHNvIGJ5IGNhbGxpbmcgbnVtX3B1dDo6ZG9fcHV0KCkuCisgICAgICAgKgorICAgICAgICogIEZvcm1hdHRpbmcgaXMgYWZmZWN0ZWQgYnkgdGhlIGZsYWcgc2V0dGluZ3MgaW4gQGEgaW8uCisgICAgICAgKgorICAgICAgICogIFRoZSBiYXNpYyBmb3JtYXQgaXMgYWZmZWN0ZWQgYnkgdGhlIHZhbHVlIG9mIGlvLmZsYWdzKCkgJgorICAgICAgICogIGlvc19iYXNlOjpmbG9hdGZpZWxkLiAgSWYgZXF1YWwgdG8gaW9zX2Jhc2U6OmZpeGVkLCBmb3JtYXRzIGxpa2UgdGhlCisgICAgICAgKiAgcHJpbnRmICVmIHNwZWNpZmllci4gIEVsc2UgaWYgZXF1YWwgdG8gaW9zX2Jhc2U6OnNjaWVudGlmaWMsIGZvcm1hdHMKKyAgICAgICAqICBsaWtlICVlIG9yICVFIHdpdGggaW9zX2Jhc2U6OnVwcGVyY2FzZSB1bnNldCBvciBzZXQgcmVzcGVjdGl2ZWx5LgorICAgICAgICogIE90aGVyd2lzZSwgZm9ybWF0cyBsaWtlICVnIG9yICVHIGRlcGVuZGluZyBvbiB1cHBlcmNhc2UuICBOb3RlIHRoYXQKKyAgICAgICAqICBpZiBib3RoIGZpeGVkIGFuZCBzY2llbnRpZmljIGFyZSBzZXQsIHRoZSBlZmZlY3Qgd2lsbCBhbHNvIGJlIGxpa2UKKyAgICAgICAqICAlZyBvciAlRy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG91dHB1dCBwcmVjaXNpb24gaXMgZ2l2ZW4gYnkgaW8ucHJlY2lzaW9uKCkuICBUaGlzIHByZWNpc2lvbiBpcworICAgICAgICogIGNhcHBlZCBhdCBudW1lcmljX2xpbWl0czo6ZGlnaXRzMTAgKyAyIChkaWZmZXJlbnQgZm9yIGRvdWJsZSBhbmQKKyAgICAgICAqICBsb25nIGRvdWJsZSkuICBUaGUgZGVmYXVsdCBwcmVjaXNpb24gaXMgNi4KKyAgICAgICAqCisgICAgICAgKiAgSWYgaW9zX2Jhc2U6OnNob3dwb3MgaXMgc2V0LCAnKycgaXMgb3V0cHV0IGJlZm9yZSBwb3NpdGl2ZSB2YWx1ZXMuCisgICAgICAgKiAgSWYgaW9zX2Jhc2U6OnNob3dwb2ludCBpcyBzZXQsIGEgZGVjaW1hbCBwb2ludCB3aWxsIGFsd2F5cyBiZQorICAgICAgICogIG91dHB1dC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGRlY2ltYWwgcG9pbnQgY2hhcmFjdGVyIHVzZWQgaXMgbnVtcHVuY3Q6OmRlY2ltYWxfcG9pbnQoKS4KKyAgICAgICAqICBUaG91c2FuZHMgc2VwYXJhdG9ycyBhcmUgaW5zZXJ0ZWQgYWNjb3JkaW5nIHRvCisgICAgICAgKiAgbnVtcHVuY3Q6Omdyb3VwaW5nKCkgYW5kIG51bXB1bmN0Ojp0aG91c2FuZHNfc2VwKCkuCisgICAgICAgKgorICAgICAgICogIElmIGlvLndpZHRoKCkgaXMgbm9uLXplcm8sIGVub3VnaCBAYSBmaWxsIGNoYXJhY3RlcnMgYXJlIGluc2VydGVkIHRvCisgICAgICAgKiAgbWFrZSB0aGUgcmVzdWx0IGF0IGxlYXN0IHRoYXQgd2lkZS4gIElmCisgICAgICAgKiAgKGlvLmZsYWdzKCkgJiBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpID09IGlvc19iYXNlOjpsZWZ0LCByZXN1bHQgaXMKKyAgICAgICAqICBwYWRkZWQgYXQgdGhlIGVuZC4gIElmIGlvc19iYXNlOjppbnRlcm5hbCwgdGhlbiBwYWRkaW5nIG9jY3VycworICAgICAgICogIGltbWVkaWF0ZWx5IGFmdGVyIGVpdGhlciBhICcrJyBvciAnLScgb3IgYWZ0ZXIgJzB4JyBvciAnMFgnLgorICAgICAgICogIE90aGVyd2lzZSwgcGFkZGluZyBvY2N1cnMgYXQgdGhlIGJlZ2lubmluZy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBsb2NhbGUgYW5kIGZsYWdzLgorICAgICAgICogIEBwYXJhbSAgX19maWxsICBDaGFyX3R5cGUgdG8gdXNlIGZvciBmaWxsaW5nLgorICAgICAgICogIEBwYXJhbSAgX192ICBWYWx1ZSB0byBmb3JtYXQgYW5kIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciB3cml0aW5nLgorICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLCBkb3VibGUgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19pbywgX19maWxsLCBfX3YpOyB9CisKKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgbG9uZyBkb3VibGUgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19pbywgX19maWxsLCBfX3YpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTnVtZXJpYyBmb3JtYXR0aW5nLgorICAgICAgICoKKyAgICAgICAqICBGb3JtYXRzIHRoZSBwb2ludGVyIHZhbHVlIEBhIHYgYW5kIGluc2VydHMgaXQgaW50byBhIHN0cmVhbS4gIEl0CisgICAgICAgKiAgZG9lcyBzbyBieSBjYWxsaW5nIG51bV9wdXQ6OmRvX3B1dCgpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZvcm1hdHMgQGEgdiBhcyBhbiB1bnNpZ25lZCBsb25nIHdpdGggaW9zX2Jhc2U6OmhleAorICAgICAgICogIGFuZCBpb3NfYmFzZTo6c2hvd2Jhc2Ugc2V0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcyAgU3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIGxvY2FsZSBhbmQgZmxhZ3MuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpbGwgIENoYXJfdHlwZSB0byB1c2UgZm9yIGZpbGxpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3YgIFZhbHVlIHRvIGZvcm1hdCBhbmQgaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHdyaXRpbmcuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICBjb25zdCB2b2lkKiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19wdXQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fdik7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZVQ+CisJaXRlcl90eXBlCisJX01faW5zZXJ0X2Zsb2F0KGl0ZXJfdHlwZSwgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJCQljaGFyIF9fbW9kLCBfVmFsdWVUIF9fdikgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2dyb3VwX2Zsb2F0KGNvbnN0IGNoYXIqIF9fZ3JvdXBpbmcsIHNpemVfdCBfX2dyb3VwaW5nX3NpemUsCisJCSAgICAgY2hhcl90eXBlIF9fc2VwLCBjb25zdCBjaGFyX3R5cGUqIF9fcCwgY2hhcl90eXBlKiBfX25ldywKKwkJICAgICBjaGFyX3R5cGUqIF9fY3MsIGludCYgX19sZW4pIGNvbnN0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVUPgorCWl0ZXJfdHlwZQorCV9NX2luc2VydF9pbnQoaXRlcl90eXBlLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkJICAgICAgX1ZhbHVlVCBfX3YpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBfTV9ncm91cF9pbnQoY29uc3QgY2hhciogX19ncm91cGluZywgc2l6ZV90IF9fZ3JvdXBpbmdfc2l6ZSwKKwkJICAgY2hhcl90eXBlIF9fc2VwLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlKiBfX25ldywKKwkJICAgY2hhcl90eXBlKiBfX2NzLCBpbnQmIF9fbGVuKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgX01fcGFkKGNoYXJfdHlwZSBfX2ZpbGwsIHN0cmVhbXNpemUgX193LCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGNoYXJfdHlwZSogX19uZXcsIGNvbnN0IGNoYXJfdHlwZSogX19jcywgaW50JiBfX2xlbikgY29uc3Q7CisKKyAgICAgIC8vLyBEZXN0cnVjdG9yLgorICAgICAgdmlydHVhbAorICAgICAgfm51bV9wdXQoKSB7IH07CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTnVtZXJpYyBmb3JtYXR0aW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBmdW5jdGlvbnMgZG8gdGhlIHdvcmsgb2YgZm9ybWF0dGluZyBudW1lcmljIHZhbHVlcyBhbmQKKyAgICAgICAqICBpbnNlcnRpbmcgdGhlbSBpbnRvIGEgc3RyZWFtLiBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZAorICAgICAgICogIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBsb2NhbGUgYW5kIGZsYWdzLgorICAgICAgICogIEBwYXJhbSAgX19maWxsICBDaGFyX3R5cGUgdG8gdXNlIGZvciBmaWxsaW5nLgorICAgICAgICogIEBwYXJhbSAgX192ICBWYWx1ZSB0byBmb3JtYXQgYW5kIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciB3cml0aW5nLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGJvb2wgX192KSBjb25zdDsKKworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwgbG9uZyBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9pbnNlcnRfaW50KF9fcywgX19pbywgX19maWxsLCBfX3YpOyB9CisKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICAgICB1bnNpZ25lZCBsb25nIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2luc2VydF9pbnQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fdik7IH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICAgICBsb25nIGxvbmcgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faW5zZXJ0X2ludChfX3MsIF9faW8sIF9fZmlsbCwgX192KTsgfQorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgICAgdW5zaWduZWQgbG9uZyBsb25nIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2luc2VydF9pbnQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fdik7IH0KKyNlbmRpZgorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBjaGFyX3R5cGUsIGRvdWJsZSkgY29uc3Q7CisKKyAgICAgIC8vIFhYWCBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgX19kb19wdXQoaXRlcl90eXBlLCBpb3NfYmFzZSYsIGNoYXJfdHlwZSwgZG91YmxlKSBjb25zdDsKKyNlbHNlCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBjaGFyX3R5cGUsIGxvbmcgZG91YmxlKSBjb25zdDsKKyNlbmRpZgorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBjaGFyX3R5cGUsIGNvbnN0IHZvaWQqKSBjb25zdDsKKworICAgICAgLy8gWFhYIEdMSUJDWFhfQUJJIERlcHJlY2F0ZWQKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0xPTkdfRE9VQkxFX0NPTVBBVCAmJiBkZWZpbmVkIF9fTE9OR19ET1VCTEVfMTI4X18KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19wdXQoaXRlcl90eXBlLCBpb3NfYmFzZSYsIGNoYXJfdHlwZSwgbG9uZyBkb3VibGUpIGNvbnN0OworI2VuZGlmCisgICAgICAvL0B9CisgICAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBsb2NhbGU6OmlkIG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OmlkOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0xEQkwKKworICAvLyBTdWJjbGF1c2UgY29udmVuaWVuY2UgaW50ZXJmYWNlcywgaW5saW5lcy4KKyAgLy8gTkI6IFRoZXNlIGFyZSBpbmxpbmUgYmVjYXVzZSwgd2hlbiB1c2VkIGluIGEgbG9vcCwgc29tZSBjb21waWxlcnMKKyAgLy8gY2FuIGhvaXN0IHRoZSBib2R5IG91dCBvZiB0aGUgbG9vcDsgdGhlbiBpdCdzIGp1c3QgYXMgZmFzdCBhcyB0aGUKKyAgLy8gQyBpcyooKSBmdW5jdGlvbi4KKworICAvLy8gQ29udmVuaWVuY2UgaW50ZXJmYWNlIHRvIGN0eXBlLmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2MpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc3NwYWNlKF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6c3BhY2UsIF9fYyk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgaW50ZXJmYWNlIHRvIGN0eXBlLmlzKGN0eXBlX2Jhc2U6OnByaW50LCBfX2MpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc3ByaW50KF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6cHJpbnQsIF9fYyk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgaW50ZXJmYWNlIHRvIGN0eXBlLmlzKGN0eXBlX2Jhc2U6OmNudHJsLCBfX2MpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc2NudHJsKF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6Y250cmwsIF9fYyk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgaW50ZXJmYWNlIHRvIGN0eXBlLmlzKGN0eXBlX2Jhc2U6OnVwcGVyLCBfX2MpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc3VwcGVyKF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6dXBwZXIsIF9fYyk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgaW50ZXJmYWNlIHRvIGN0eXBlLmlzKGN0eXBlX2Jhc2U6Omxvd2VyLCBfX2MpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc2xvd2VyKF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6bG93ZXIsIF9fYyk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgaW50ZXJmYWNlIHRvIGN0eXBlLmlzKGN0eXBlX2Jhc2U6OmFscGhhLCBfX2MpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc2FscGhhKF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6YWxwaGEsIF9fYyk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgaW50ZXJmYWNlIHRvIGN0eXBlLmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCBfX2MpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc2RpZ2l0KF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6ZGlnaXQsIF9fYyk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgaW50ZXJmYWNlIHRvIGN0eXBlLmlzKGN0eXBlX2Jhc2U6OnB1bmN0LCBfX2MpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc3B1bmN0KF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6cHVuY3QsIF9fYyk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgaW50ZXJmYWNlIHRvIGN0eXBlLmlzKGN0eXBlX2Jhc2U6OnhkaWdpdCwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXN4ZGlnaXQoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7IHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS5pcyhjdHlwZV9iYXNlOjp4ZGlnaXQsIF9fYyk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgaW50ZXJmYWNlIHRvIGN0eXBlLmlzKGN0eXBlX2Jhc2U6OmFsbnVtLCBfX2MpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc2FsbnVtKF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6YWxudW0sIF9fYyk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgaW50ZXJmYWNlIHRvIGN0eXBlLmlzKGN0eXBlX2Jhc2U6OmdyYXBoLCBfX2MpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc2dyYXBoKF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6Z3JhcGgsIF9fYyk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgaW50ZXJmYWNlIHRvIGN0eXBlLnRvdXBwZXIoX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBfQ2hhclQKKyAgICB0b3VwcGVyKF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykudG91cHBlcihfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS50b2xvd2VyKF9fYykuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbmxpbmUgX0NoYXJUCisgICAgdG9sb3dlcihfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLnRvbG93ZXIoX19jKTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjIGluY2x1ZGUgPGJpdHMvbG9jYWxlX2ZhY2V0cy50Y2M+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZV9mYWNldHMudGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZV9mYWNldHMudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Y2JhM2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbG9jYWxlX2ZhY2V0cy50Y2MKQEAgLTAsMCArMSwxMzYwIEBACisvLyBMb2NhbGUgc3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9sb2NhbGVfZmFjZXRzLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xvY2FsZX0KKyAqLworCisjaWZuZGVmIF9MT0NBTEVfRkFDRVRTX1RDQworI2RlZmluZSBfTE9DQUxFX0ZBQ0VUU19UQ0MgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBSb3V0aW5lIHRvIGFjY2VzcyBhIGNhY2hlIGZvciB0aGUgZmFjZXQuICBJZiB0aGUgY2FjaGUgZGlkbid0CisgIC8vIGV4aXN0IGJlZm9yZSwgaXQgZ2V0cyBjb25zdHJ1Y3RlZCBvbiB0aGUgZmx5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgc3RydWN0IF9fdXNlX2NhY2hlCisgICAgeworICAgICAgY29uc3QgX0ZhY2V0KgorICAgICAgb3BlcmF0b3IoKSAoY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3Q7CisgICAgfTsKKworICAvLyBTcGVjaWFsaXphdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBzdHJ1Y3QgX191c2VfY2FjaGU8X19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+ID4KKyAgICB7CisgICAgICBjb25zdCBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4qCisgICAgICBvcGVyYXRvcigpIChjb25zdCBsb2NhbGUmIF9fbG9jKSBjb25zdAorICAgICAgeworCWNvbnN0IHNpemVfdCBfX2kgPSBudW1wdW5jdDxfQ2hhclQ+OjppZC5fTV9pZCgpOworCWNvbnN0IGxvY2FsZTo6ZmFjZXQqKiBfX2NhY2hlcyA9IF9fbG9jLl9NX2ltcGwtPl9NX2NhY2hlczsKKwlpZiAoIV9fY2FjaGVzW19faV0pCisJICB7CisJICAgIF9fbnVtcHVuY3RfY2FjaGU8X0NoYXJUPiogX190bXAgPSAwOworCSAgICBfX3RyeQorCSAgICAgIHsKKwkJX190bXAgPSBuZXcgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+OworCQlfX3RtcC0+X01fY2FjaGUoX19sb2MpOworCSAgICAgIH0KKwkgICAgX19jYXRjaCguLi4pCisJICAgICAgeworCQlkZWxldGUgX190bXA7CisJCV9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICAgIH0KKwkgICAgX19sb2MuX01faW1wbC0+X01faW5zdGFsbF9jYWNoZShfX3RtcCwgX19pKTsKKwkgIH0KKwlyZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+Kj4oX19jYWNoZXNbX19pXSk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgdm9pZAorICAgIF9fbnVtcHVuY3RfY2FjaGU8X0NoYXJUPjo6X01fY2FjaGUoY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7CisgICAgICBfTV9hbGxvY2F0ZWQgPSB0cnVlOworCisgICAgICBjb25zdCBudW1wdW5jdDxfQ2hhclQ+JiBfX25wID0gdXNlX2ZhY2V0PG51bXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisKKyAgICAgIGNoYXIqIF9fZ3JvdXBpbmcgPSAwOworICAgICAgX0NoYXJUKiBfX3RydWVuYW1lID0gMDsKKyAgICAgIF9DaGFyVCogX19mYWxzZW5hbWUgPSAwOworICAgICAgX190cnkKKwl7CisJICBfTV9ncm91cGluZ19zaXplID0gX19ucC5ncm91cGluZygpLnNpemUoKTsKKwkgIF9fZ3JvdXBpbmcgPSBuZXcgY2hhcltfTV9ncm91cGluZ19zaXplXTsKKwkgIF9fbnAuZ3JvdXBpbmcoKS5jb3B5KF9fZ3JvdXBpbmcsIF9NX2dyb3VwaW5nX3NpemUpOworCSAgX01fZ3JvdXBpbmcgPSBfX2dyb3VwaW5nOworCSAgX01fdXNlX2dyb3VwaW5nID0gKF9NX2dyb3VwaW5nX3NpemUKKwkJCSAgICAgJiYgc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KF9NX2dyb3VwaW5nWzBdKSA+IDAKKwkJCSAgICAgJiYgKF9NX2dyb3VwaW5nWzBdCisJCQkJICE9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxjaGFyPjo6X19tYXgpKTsKKworCSAgX01fdHJ1ZW5hbWVfc2l6ZSA9IF9fbnAudHJ1ZW5hbWUoKS5zaXplKCk7CisJICBfX3RydWVuYW1lID0gbmV3IF9DaGFyVFtfTV90cnVlbmFtZV9zaXplXTsKKwkgIF9fbnAudHJ1ZW5hbWUoKS5jb3B5KF9fdHJ1ZW5hbWUsIF9NX3RydWVuYW1lX3NpemUpOworCSAgX01fdHJ1ZW5hbWUgPSBfX3RydWVuYW1lOworCisJICBfTV9mYWxzZW5hbWVfc2l6ZSA9IF9fbnAuZmFsc2VuYW1lKCkuc2l6ZSgpOworCSAgX19mYWxzZW5hbWUgPSBuZXcgX0NoYXJUW19NX2ZhbHNlbmFtZV9zaXplXTsKKwkgIF9fbnAuZmFsc2VuYW1lKCkuY29weShfX2ZhbHNlbmFtZSwgX01fZmFsc2VuYW1lX3NpemUpOworCSAgX01fZmFsc2VuYW1lID0gX19mYWxzZW5hbWU7CisKKwkgIF9NX2RlY2ltYWxfcG9pbnQgPSBfX25wLmRlY2ltYWxfcG9pbnQoKTsKKwkgIF9NX3Rob3VzYW5kc19zZXAgPSBfX25wLnRob3VzYW5kc19zZXAoKTsKKworCSAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdCA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworCSAgX19jdC53aWRlbihfX251bV9iYXNlOjpfU19hdG9tc19vdXQsCisJCSAgICAgX19udW1fYmFzZTo6X1NfYXRvbXNfb3V0CisJCSAgICAgKyBfX251bV9iYXNlOjpfU19vZW5kLCBfTV9hdG9tc19vdXQpOworCSAgX19jdC53aWRlbihfX251bV9iYXNlOjpfU19hdG9tc19pbiwKKwkJICAgICBfX251bV9iYXNlOjpfU19hdG9tc19pbgorCQkgICAgICsgX19udW1fYmFzZTo6X1NfaWVuZCwgX01fYXRvbXNfaW4pOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGRlbGV0ZSBbXSBfX2dyb3VwaW5nOworCSAgZGVsZXRlIFtdIF9fdHJ1ZW5hbWU7CisJICBkZWxldGUgW10gX19mYWxzZW5hbWU7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIC8vIFVzZWQgYnkgYm90aCBudW1lcmljIGFuZCBtb25ldGFyeSBmYWNldHMuCisgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBfX2dyb3VwaW5nX3RtcCBzdHJpbmcgY29uc3RydWN0ZWQgaW4KKyAgLy8gbW9uZXlfZ2V0IG9yIG51bV9nZXQgbWF0Y2hlcyB0aGUgY2Fub25pY2FsIGdyb3VwaW5nIGZvciBhIGdpdmVuCisgIC8vIGxvY2FsZS4KKyAgLy8gX19ncm91cGluZ190bXAgaXMgcGFyc2VkIEwgdG8gUgorICAvLyAxLDIyMiw0NDQgPT0gX19ncm91cGluZ190bXAgb2YgIlwxXDNcMyIKKyAgLy8gX19ncm91cGluZyBpcyBwYXJzZWQgUiB0byBMCisgIC8vIDEsMjIyLDQ0NCA9PSBfX2dyb3VwaW5nIG9mICJcMyIgPT0gIlwzXDNcMyIKKyAgX0dMSUJDWFhfUFVSRSBib29sCisgIF9fdmVyaWZ5X2dyb3VwaW5nKGNvbnN0IGNoYXIqIF9fZ3JvdXBpbmcsIHNpemVfdCBfX2dyb3VwaW5nX3NpemUsCisJCSAgICBjb25zdCBzdHJpbmcmIF9fZ3JvdXBpbmdfdG1wKSB0aHJvdyAoKTsKKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0xEQkwKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgX01fZXh0cmFjdF9mbG9hdChfSW5JdGVyIF9fYmVnLCBfSW5JdGVyIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkJICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHN0cmluZyYgX194dHJjKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8X0NoYXJUPgkJCV9fdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIF9fbnVtcHVuY3RfY2FjaGU8X0NoYXJUPiAgICAgICAgICAgICAgICAgIF9fY2FjaGVfdHlwZTsKKyAgICAgIF9fdXNlX2NhY2hlPF9fY2FjaGVfdHlwZT4gX191YzsKKyAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworICAgICAgY29uc3QgX19jYWNoZV90eXBlKiBfX2xjID0gX191YyhfX2xvYyk7CisgICAgICBjb25zdCBfQ2hhclQqIF9fbGl0ID0gX19sYy0+X01fYXRvbXNfaW47CisgICAgICBjaGFyX3R5cGUgX19jID0gY2hhcl90eXBlKCk7CisKKyAgICAgIC8vIFRydWUgaWYgX19iZWcgYmVjb21lcyBlcXVhbCB0byBfX2VuZC4KKyAgICAgIGJvb2wgX190ZXN0ZW9mID0gX19iZWcgPT0gX19lbmQ7CisKKyAgICAgIC8vIEZpcnN0IGNoZWNrIGZvciBzaWduLgorICAgICAgaWYgKCFfX3Rlc3Rlb2YpCisJeworCSAgX19jID0gKl9fYmVnOworCSAgY29uc3QgYm9vbCBfX3BsdXMgPSBfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaXBsdXNdOworCSAgaWYgKChfX3BsdXMgfHwgX19jID09IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX2ltaW51c10pCisJICAgICAgJiYgIShfX2xjLT5fTV91c2VfZ3JvdXBpbmcgJiYgX19jID09IF9fbGMtPl9NX3Rob3VzYW5kc19zZXApCisJICAgICAgJiYgIShfX2MgPT0gX19sYy0+X01fZGVjaW1hbF9wb2ludCkpCisJICAgIHsKKwkgICAgICBfX3h0cmMgKz0gX19wbHVzID8gJysnIDogJy0nOworCSAgICAgIGlmICgrK19fYmVnICE9IF9fZW5kKQorCQlfX2MgPSAqX19iZWc7CisJICAgICAgZWxzZQorCQlfX3Rlc3Rlb2YgPSB0cnVlOworCSAgICB9CisJfQorCisgICAgICAvLyBOZXh0LCBsb29rIGZvciBsZWFkaW5nIHplcm9zLgorICAgICAgYm9vbCBfX2ZvdW5kX21hbnRpc3NhID0gZmFsc2U7CisgICAgICBpbnQgX19zZXBfcG9zID0gMDsKKyAgICAgIHdoaWxlICghX190ZXN0ZW9mKQorCXsKKwkgIGlmICgoX19sYy0+X01fdXNlX2dyb3VwaW5nICYmIF9fYyA9PSBfX2xjLT5fTV90aG91c2FuZHNfc2VwKQorCSAgICAgIHx8IF9fYyA9PSBfX2xjLT5fTV9kZWNpbWFsX3BvaW50KQorCSAgICBicmVhazsKKwkgIGVsc2UgaWYgKF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pemVyb10pCisJICAgIHsKKwkgICAgICBpZiAoIV9fZm91bmRfbWFudGlzc2EpCisJCXsKKwkJICBfX3h0cmMgKz0gJzAnOworCQkgIF9fZm91bmRfbWFudGlzc2EgPSB0cnVlOworCQl9CisJICAgICAgKytfX3NlcF9wb3M7CisKKwkgICAgICBpZiAoKytfX2JlZyAhPSBfX2VuZCkKKwkJX19jID0gKl9fYmVnOworCSAgICAgIGVsc2UKKwkJX190ZXN0ZW9mID0gdHJ1ZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisKKyAgICAgIC8vIE9ubHkgbmVlZCBhY2NlcHRhYmxlIGRpZ2l0cyBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KKyAgICAgIGJvb2wgX19mb3VuZF9kZWMgPSBmYWxzZTsKKyAgICAgIGJvb2wgX19mb3VuZF9zY2kgPSBmYWxzZTsKKyAgICAgIHN0cmluZyBfX2ZvdW5kX2dyb3VwaW5nOworICAgICAgaWYgKF9fbGMtPl9NX3VzZV9ncm91cGluZykKKwlfX2ZvdW5kX2dyb3VwaW5nLnJlc2VydmUoMzIpOworICAgICAgY29uc3QgY2hhcl90eXBlKiBfX2xpdF96ZXJvID0gX19saXQgKyBfX251bV9iYXNlOjpfU19pemVybzsKKworICAgICAgaWYgKCFfX2xjLT5fTV9hbGxvY2F0ZWQpCisJLy8gIkMiIGxvY2FsZQorCXdoaWxlICghX190ZXN0ZW9mKQorCSAgeworCSAgICBjb25zdCBpbnQgX19kaWdpdCA9IF9NX2ZpbmQoX19saXRfemVybywgMTAsIF9fYyk7CisJICAgIGlmIChfX2RpZ2l0ICE9IC0xKQorCSAgICAgIHsKKwkJX194dHJjICs9ICcwJyArIF9fZGlnaXQ7CisJCV9fZm91bmRfbWFudGlzc2EgPSB0cnVlOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoX19jID09IF9fbGMtPl9NX2RlY2ltYWxfcG9pbnQKKwkJICAgICAmJiAhX19mb3VuZF9kZWMgJiYgIV9fZm91bmRfc2NpKQorCSAgICAgIHsKKwkJX194dHJjICs9ICcuJzsKKwkJX19mb3VuZF9kZWMgPSB0cnVlOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoKF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pZV0gCisJCSAgICAgIHx8IF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pRV0pCisJCSAgICAgJiYgIV9fZm91bmRfc2NpICYmIF9fZm91bmRfbWFudGlzc2EpCisJICAgICAgeworCQkvLyBTY2llbnRpZmljIG5vdGF0aW9uLgorCQlfX3h0cmMgKz0gJ2UnOworCQlfX2ZvdW5kX3NjaSA9IHRydWU7CisJCQorCQkvLyBSZW1vdmUgb3B0aW9uYWwgcGx1cyBvciBtaW51cyBzaWduLCBpZiB0aGV5IGV4aXN0LgorCQlpZiAoKytfX2JlZyAhPSBfX2VuZCkKKwkJICB7CisJCSAgICBfX2MgPSAqX19iZWc7CisJCSAgICBjb25zdCBib29sIF9fcGx1cyA9IF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pcGx1c107CisJCSAgICBpZiAoX19wbHVzIHx8IF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pbWludXNdKQorCQkgICAgICBfX3h0cmMgKz0gX19wbHVzID8gJysnIDogJy0nOworCQkgICAgZWxzZQorCQkgICAgICBjb250aW51ZTsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBfX3Rlc3Rlb2YgPSB0cnVlOworCQkgICAgYnJlYWs7CisJCSAgfQorCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIGJyZWFrOworCisJICAgIGlmICgrK19fYmVnICE9IF9fZW5kKQorCSAgICAgIF9fYyA9ICpfX2JlZzsKKwkgICAgZWxzZQorCSAgICAgIF9fdGVzdGVvZiA9IHRydWU7CisJICB9CisgICAgICBlbHNlCisJd2hpbGUgKCFfX3Rlc3Rlb2YpCisJICB7CisJICAgIC8vIEFjY29yZGluZyB0byAyMi4yLjIuMS4yLCBwOC05LCBmaXJzdCBsb29rIGZvciB0aG91c2FuZHNfc2VwCisJICAgIC8vIGFuZCBkZWNpbWFsX3BvaW50LgorCSAgICBpZiAoX19sYy0+X01fdXNlX2dyb3VwaW5nICYmIF9fYyA9PSBfX2xjLT5fTV90aG91c2FuZHNfc2VwKQorCSAgICAgIHsKKwkJaWYgKCFfX2ZvdW5kX2RlYyAmJiAhX19mb3VuZF9zY2kpCisJCSAgeworCQkgICAgLy8gTkI6IFRob3VzYW5kcyBzZXBhcmF0b3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHN0cmluZworCQkgICAgLy8gaXMgYSBuby1ubywgYXMgaXMgdHdvIGNvbnNlY3V0aXZlIHRob3VzYW5kcyBzZXBhcmF0b3JzLgorCQkgICAgaWYgKF9fc2VwX3BvcykKKwkJICAgICAgeworCQkJX19mb3VuZF9ncm91cGluZyArPSBzdGF0aWNfY2FzdDxjaGFyPihfX3NlcF9wb3MpOworCQkJX19zZXBfcG9zID0gMDsKKwkJICAgICAgfQorCQkgICAgZWxzZQorCQkgICAgICB7CisJCQkvLyBOQjogX19jb252ZXJ0X3RvX3Ygd2lsbCBub3QgYXNzaWduIF9fdiBhbmQgd2lsbAorCQkJLy8gc2V0IHRoZSBmYWlsYml0LgorCQkJX194dHJjLmNsZWFyKCk7CisJCQlicmVhazsKKwkJICAgICAgfQorCQkgIH0KKwkJZWxzZQorCQkgIGJyZWFrOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoX19jID09IF9fbGMtPl9NX2RlY2ltYWxfcG9pbnQpCisJICAgICAgeworCQlpZiAoIV9fZm91bmRfZGVjICYmICFfX2ZvdW5kX3NjaSkKKwkJICB7CisJCSAgICAvLyBJZiBubyBncm91cGluZyBjaGFycyBhcmUgc2Vlbiwgbm8gZ3JvdXBpbmcgY2hlY2sKKwkJICAgIC8vIGlzIGFwcGxpZWQuIFRoZXJlZm9yZSBfX2ZvdW5kX2dyb3VwaW5nIGlzIGFkanVzdGVkCisJCSAgICAvLyBvbmx5IGlmIGRlY2ltYWxfcG9pbnQgY29tZXMgYWZ0ZXIgc29tZSB0aG91c2FuZHNfc2VwLgorCQkgICAgaWYgKF9fZm91bmRfZ3JvdXBpbmcuc2l6ZSgpKQorCQkgICAgICBfX2ZvdW5kX2dyb3VwaW5nICs9IHN0YXRpY19jYXN0PGNoYXI+KF9fc2VwX3Bvcyk7CisJCSAgICBfX3h0cmMgKz0gJy4nOworCQkgICAgX19mb3VuZF9kZWMgPSB0cnVlOworCQkgIH0KKwkJZWxzZQorCQkgIGJyZWFrOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJY29uc3QgY2hhcl90eXBlKiBfX3EgPQorCQkgIF9fdHJhaXRzX3R5cGU6OmZpbmQoX19saXRfemVybywgMTAsIF9fYyk7CisJCWlmIChfX3EpCisJCSAgeworCQkgICAgX194dHJjICs9ICcwJyArIChfX3EgLSBfX2xpdF96ZXJvKTsKKwkJICAgIF9fZm91bmRfbWFudGlzc2EgPSB0cnVlOworCQkgICAgKytfX3NlcF9wb3M7CisJCSAgfQorCQllbHNlIGlmICgoX19jID09IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX2llXSAKKwkJCSAgfHwgX19jID09IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX2lFXSkKKwkJCSAmJiAhX19mb3VuZF9zY2kgJiYgX19mb3VuZF9tYW50aXNzYSkKKwkJICB7CisJCSAgICAvLyBTY2llbnRpZmljIG5vdGF0aW9uLgorCQkgICAgaWYgKF9fZm91bmRfZ3JvdXBpbmcuc2l6ZSgpICYmICFfX2ZvdW5kX2RlYykKKwkJICAgICAgX19mb3VuZF9ncm91cGluZyArPSBzdGF0aWNfY2FzdDxjaGFyPihfX3NlcF9wb3MpOworCQkgICAgX194dHJjICs9ICdlJzsKKwkJICAgIF9fZm91bmRfc2NpID0gdHJ1ZTsKKwkJICAgIAorCQkgICAgLy8gUmVtb3ZlIG9wdGlvbmFsIHBsdXMgb3IgbWludXMgc2lnbiwgaWYgdGhleSBleGlzdC4KKwkJICAgIGlmICgrK19fYmVnICE9IF9fZW5kKQorCQkgICAgICB7CisJCQlfX2MgPSAqX19iZWc7CisJCQljb25zdCBib29sIF9fcGx1cyA9IF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pcGx1c107CisJCQlpZiAoKF9fcGx1cyB8fCBfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaW1pbnVzXSkKKwkJCSAgICAmJiAhKF9fbGMtPl9NX3VzZV9ncm91cGluZworCQkJCSAmJiBfX2MgPT0gX19sYy0+X01fdGhvdXNhbmRzX3NlcCkKKwkJCSAgICAmJiAhKF9fYyA9PSBfX2xjLT5fTV9kZWNpbWFsX3BvaW50KSkKKwkJICAgICAgX194dHJjICs9IF9fcGx1cyA/ICcrJyA6ICctJzsKKwkJCWVsc2UKKwkJCSAgY29udGludWU7CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgeworCQkJX190ZXN0ZW9mID0gdHJ1ZTsKKwkJCWJyZWFrOworCQkgICAgICB9CisJCSAgfQorCQllbHNlCisJCSAgYnJlYWs7CisJICAgICAgfQorCSAgICAKKwkgICAgaWYgKCsrX19iZWcgIT0gX19lbmQpCisJICAgICAgX19jID0gKl9fYmVnOworCSAgICBlbHNlCisJICAgICAgX190ZXN0ZW9mID0gdHJ1ZTsKKwkgIH0KKworICAgICAgLy8gRGlnaXQgZ3JvdXBpbmcgaXMgY2hlY2tlZC4gSWYgZ3JvdXBpbmcgYW5kIGZvdW5kX2dyb3VwaW5nIGRvbid0CisgICAgICAvLyBtYXRjaCwgdGhlbiBnZXQgdmVyeSB2ZXJ5IHVwc2V0LCBhbmQgc2V0IGZhaWxiaXQuCisgICAgICBpZiAoX19mb3VuZF9ncm91cGluZy5zaXplKCkpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBBZGQgdGhlIGVuZGluZyBncm91cGluZyBpZiBhIGRlY2ltYWwgb3IgJ2UnLydFJyB3YXNuJ3QgZm91bmQuCisJICBpZiAoIV9fZm91bmRfZGVjICYmICFfX2ZvdW5kX3NjaSkKKwkgICAgX19mb3VuZF9ncm91cGluZyArPSBzdGF0aWNfY2FzdDxjaGFyPihfX3NlcF9wb3MpOworCisgICAgICAgICAgaWYgKCFzdGQ6Ol9fdmVyaWZ5X2dyb3VwaW5nKF9fbGMtPl9NX2dyb3VwaW5nLCAKKwkJCQkgICAgICBfX2xjLT5fTV9ncm91cGluZ19zaXplLAorCQkJCSAgICAgIF9fZm91bmRfZ3JvdXBpbmcpKQorCSAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgICB9CisKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZVQ+CisgICAgICBfSW5JdGVyCisgICAgICBudW1fZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgICAgX01fZXh0cmFjdF9pbnQoX0luSXRlciBfX2JlZywgX0luSXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBfVmFsdWVUJiBfX3YpIGNvbnN0CisgICAgICB7CisgICAgICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8X0NoYXJUPgkJCSAgICAgX190cmFpdHNfdHlwZTsKKwl1c2luZyBfX2dudV9jeHg6Ol9fYWRkX3Vuc2lnbmVkOworCXR5cGVkZWYgdHlwZW5hbWUgX19hZGRfdW5zaWduZWQ8X1ZhbHVlVD46Ol9fdHlwZSBfX3Vuc2lnbmVkX3R5cGU7CisJdHlwZWRlZiBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4gICAgICAgICAgICAgICAgICAgICBfX2NhY2hlX3R5cGU7CisJX191c2VfY2FjaGU8X19jYWNoZV90eXBlPiBfX3VjOworCWNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCWNvbnN0IF9fY2FjaGVfdHlwZSogX19sYyA9IF9fdWMoX19sb2MpOworCWNvbnN0IF9DaGFyVCogX19saXQgPSBfX2xjLT5fTV9hdG9tc19pbjsKKwljaGFyX3R5cGUgX19jID0gY2hhcl90eXBlKCk7CisKKwkvLyBOQjogSWZmIF9fYmFzZWZpZWxkID09IDAsIF9fYmFzZSBjYW4gY2hhbmdlIGJhc2VkIG9uIGNvbnRlbnRzLgorCWNvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBfX2Jhc2VmaWVsZCA9IF9faW8uZmxhZ3MoKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgaW9zX2Jhc2U6OmJhc2VmaWVsZDsKKwljb25zdCBib29sIF9fb2N0ID0gX19iYXNlZmllbGQgPT0gaW9zX2Jhc2U6Om9jdDsKKwlpbnQgX19iYXNlID0gX19vY3QgPyA4IDogKF9fYmFzZWZpZWxkID09IGlvc19iYXNlOjpoZXggPyAxNiA6IDEwKTsKKworCS8vIFRydWUgaWYgX19iZWcgYmVjb21lcyBlcXVhbCB0byBfX2VuZC4KKwlib29sIF9fdGVzdGVvZiA9IF9fYmVnID09IF9fZW5kOworCisJLy8gRmlyc3QgY2hlY2sgZm9yIHNpZ24uCisJYm9vbCBfX25lZ2F0aXZlID0gZmFsc2U7CisJaWYgKCFfX3Rlc3Rlb2YpCisJICB7CisJICAgIF9fYyA9ICpfX2JlZzsKKwkgICAgX19uZWdhdGl2ZSA9IF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pbWludXNdOworCSAgICBpZiAoKF9fbmVnYXRpdmUgfHwgX19jID09IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX2lwbHVzXSkKKwkJJiYgIShfX2xjLT5fTV91c2VfZ3JvdXBpbmcgJiYgX19jID09IF9fbGMtPl9NX3Rob3VzYW5kc19zZXApCisJCSYmICEoX19jID09IF9fbGMtPl9NX2RlY2ltYWxfcG9pbnQpKQorCSAgICAgIHsKKwkJaWYgKCsrX19iZWcgIT0gX19lbmQpCisJCSAgX19jID0gKl9fYmVnOworCQllbHNlCisJCSAgX190ZXN0ZW9mID0gdHJ1ZTsKKwkgICAgICB9CisJICB9CisKKwkvLyBOZXh0LCBsb29rIGZvciBsZWFkaW5nIHplcm9zIGFuZCBjaGVjayByZXF1aXJlZCBkaWdpdHMKKwkvLyBmb3IgYmFzZSBmb3JtYXRzLgorCWJvb2wgX19mb3VuZF96ZXJvID0gZmFsc2U7CisJaW50IF9fc2VwX3BvcyA9IDA7CisJd2hpbGUgKCFfX3Rlc3Rlb2YpCisJICB7CisJICAgIGlmICgoX19sYy0+X01fdXNlX2dyb3VwaW5nICYmIF9fYyA9PSBfX2xjLT5fTV90aG91c2FuZHNfc2VwKQorCQl8fCBfX2MgPT0gX19sYy0+X01fZGVjaW1hbF9wb2ludCkKKwkgICAgICBicmVhazsKKwkgICAgZWxzZSBpZiAoX19jID09IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX2l6ZXJvXSAKKwkJICAgICAmJiAoIV9fZm91bmRfemVybyB8fCBfX2Jhc2UgPT0gMTApKQorCSAgICAgIHsKKwkJX19mb3VuZF96ZXJvID0gdHJ1ZTsKKwkJKytfX3NlcF9wb3M7CisJCWlmIChfX2Jhc2VmaWVsZCA9PSAwKQorCQkgIF9fYmFzZSA9IDg7CisJCWlmIChfX2Jhc2UgPT0gOCkKKwkJICBfX3NlcF9wb3MgPSAwOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoX19mb3VuZF96ZXJvCisJCSAgICAgJiYgKF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19peF0KKwkJCSB8fCBfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaVhdKSkKKwkgICAgICB7CisJCWlmIChfX2Jhc2VmaWVsZCA9PSAwKQorCQkgIF9fYmFzZSA9IDE2OworCQlpZiAoX19iYXNlID09IDE2KQorCQkgIHsKKwkJICAgIF9fZm91bmRfemVybyA9IGZhbHNlOworCQkgICAgX19zZXBfcG9zID0gMDsKKwkJICB9CisJCWVsc2UKKwkJICBicmVhazsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBicmVhazsKKworCSAgICBpZiAoKytfX2JlZyAhPSBfX2VuZCkKKwkgICAgICB7CisJCV9fYyA9ICpfX2JlZzsKKwkJaWYgKCFfX2ZvdW5kX3plcm8pCisJCSAgYnJlYWs7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgX190ZXN0ZW9mID0gdHJ1ZTsKKwkgIH0KKwkKKwkvLyBBdCB0aGlzIHBvaW50LCBiYXNlIGlzIGRldGVybWluZWQuIElmIG5vdCBoZXgsIG9ubHkgYWxsb3cKKwkvLyBiYXNlIGRpZ2l0cyBhcyB2YWxpZCBpbnB1dC4KKwljb25zdCBzaXplX3QgX19sZW4gPSAoX19iYXNlID09IDE2ID8gX19udW1fYmFzZTo6X1NfaWVuZAorCQkJICAgICAgLSBfX251bV9iYXNlOjpfU19pemVybyA6IF9fYmFzZSk7CisKKwkvLyBFeHRyYWN0LgorCXN0cmluZyBfX2ZvdW5kX2dyb3VwaW5nOworCWlmIChfX2xjLT5fTV91c2VfZ3JvdXBpbmcpCisJICBfX2ZvdW5kX2dyb3VwaW5nLnJlc2VydmUoMzIpOworCWJvb2wgX190ZXN0ZmFpbCA9IGZhbHNlOworCWJvb2wgX190ZXN0b3ZlcmZsb3cgPSBmYWxzZTsKKwljb25zdCBfX3Vuc2lnbmVkX3R5cGUgX19tYXggPQorCSAgKF9fbmVnYXRpdmUgJiYgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPF9WYWx1ZVQ+OjpfX2lzX3NpZ25lZCkKKwkgID8gLV9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUPjo6X19taW4KKwkgIDogX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPF9WYWx1ZVQ+OjpfX21heDsKKwljb25zdCBfX3Vuc2lnbmVkX3R5cGUgX19zbWF4ID0gX19tYXggLyBfX2Jhc2U7CisJX191bnNpZ25lZF90eXBlIF9fcmVzdWx0ID0gMDsKKwlpbnQgX19kaWdpdCA9IDA7CisJY29uc3QgY2hhcl90eXBlKiBfX2xpdF96ZXJvID0gX19saXQgKyBfX251bV9iYXNlOjpfU19pemVybzsKKworCWlmICghX19sYy0+X01fYWxsb2NhdGVkKQorCSAgLy8gIkMiIGxvY2FsZQorCSAgd2hpbGUgKCFfX3Rlc3Rlb2YpCisJICAgIHsKKwkgICAgICBfX2RpZ2l0ID0gX01fZmluZChfX2xpdF96ZXJvLCBfX2xlbiwgX19jKTsKKwkgICAgICBpZiAoX19kaWdpdCA9PSAtMSkKKwkJYnJlYWs7CisJICAgICAgCisJICAgICAgaWYgKF9fcmVzdWx0ID4gX19zbWF4KQorCQlfX3Rlc3RvdmVyZmxvdyA9IHRydWU7CisJICAgICAgZWxzZQorCQl7CisJCSAgX19yZXN1bHQgKj0gX19iYXNlOworCQkgIF9fdGVzdG92ZXJmbG93IHw9IF9fcmVzdWx0ID4gX19tYXggLSBfX2RpZ2l0OworCQkgIF9fcmVzdWx0ICs9IF9fZGlnaXQ7CisJCSAgKytfX3NlcF9wb3M7CisJCX0KKwkgICAgICAKKwkgICAgICBpZiAoKytfX2JlZyAhPSBfX2VuZCkKKwkJX19jID0gKl9fYmVnOworCSAgICAgIGVsc2UKKwkJX190ZXN0ZW9mID0gdHJ1ZTsKKwkgICAgfQorCWVsc2UKKwkgIHdoaWxlICghX190ZXN0ZW9mKQorCSAgICB7CisJICAgICAgLy8gQWNjb3JkaW5nIHRvIDIyLjIuMi4xLjIsIHA4LTksIGZpcnN0IGxvb2sgZm9yIHRob3VzYW5kc19zZXAKKwkgICAgICAvLyBhbmQgZGVjaW1hbF9wb2ludC4KKwkgICAgICBpZiAoX19sYy0+X01fdXNlX2dyb3VwaW5nICYmIF9fYyA9PSBfX2xjLT5fTV90aG91c2FuZHNfc2VwKQorCQl7CisJCSAgLy8gTkI6IFRob3VzYW5kcyBzZXBhcmF0b3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHN0cmluZworCQkgIC8vIGlzIGEgbm8tbm8sIGFzIGlzIHR3byBjb25zZWN1dGl2ZSB0aG91c2FuZHMgc2VwYXJhdG9ycy4KKwkJICBpZiAoX19zZXBfcG9zKQorCQkgICAgeworCQkgICAgICBfX2ZvdW5kX2dyb3VwaW5nICs9IHN0YXRpY19jYXN0PGNoYXI+KF9fc2VwX3Bvcyk7CisJCSAgICAgIF9fc2VwX3BvcyA9IDA7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBfX3Rlc3RmYWlsID0gdHJ1ZTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmIChfX2MgPT0gX19sYy0+X01fZGVjaW1hbF9wb2ludCkKKwkJYnJlYWs7CisJICAgICAgZWxzZQorCQl7CisJCSAgY29uc3QgY2hhcl90eXBlKiBfX3EgPQorCQkgICAgX190cmFpdHNfdHlwZTo6ZmluZChfX2xpdF96ZXJvLCBfX2xlbiwgX19jKTsKKwkJICBpZiAoIV9fcSkKKwkJICAgIGJyZWFrOworCQkgIAorCQkgIF9fZGlnaXQgPSBfX3EgLSBfX2xpdF96ZXJvOworCQkgIGlmIChfX2RpZ2l0ID4gMTUpCisJCSAgICBfX2RpZ2l0IC09IDY7CisJCSAgaWYgKF9fcmVzdWx0ID4gX19zbWF4KQorCQkgICAgX190ZXN0b3ZlcmZsb3cgPSB0cnVlOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgX19yZXN1bHQgKj0gX19iYXNlOworCQkgICAgICBfX3Rlc3RvdmVyZmxvdyB8PSBfX3Jlc3VsdCA+IF9fbWF4IC0gX19kaWdpdDsKKwkJICAgICAgX19yZXN1bHQgKz0gX19kaWdpdDsKKwkJICAgICAgKytfX3NlcF9wb3M7CisJCSAgICB9CisJCX0KKwkgICAgICAKKwkgICAgICBpZiAoKytfX2JlZyAhPSBfX2VuZCkKKwkJX19jID0gKl9fYmVnOworCSAgICAgIGVsc2UKKwkJX190ZXN0ZW9mID0gdHJ1ZTsKKwkgICAgfQorCQorCS8vIERpZ2l0IGdyb3VwaW5nIGlzIGNoZWNrZWQuIElmIGdyb3VwaW5nIGFuZCBmb3VuZF9ncm91cGluZyBkb24ndAorCS8vIG1hdGNoLCB0aGVuIGdldCB2ZXJ5IHZlcnkgdXBzZXQsIGFuZCBzZXQgZmFpbGJpdC4KKwlpZiAoX19mb3VuZF9ncm91cGluZy5zaXplKCkpCisJICB7CisJICAgIC8vIEFkZCB0aGUgZW5kaW5nIGdyb3VwaW5nLgorCSAgICBfX2ZvdW5kX2dyb3VwaW5nICs9IHN0YXRpY19jYXN0PGNoYXI+KF9fc2VwX3Bvcyk7CisKKwkgICAgaWYgKCFzdGQ6Ol9fdmVyaWZ5X2dyb3VwaW5nKF9fbGMtPl9NX2dyb3VwaW5nLAorCQkJCQlfX2xjLT5fTV9ncm91cGluZ19zaXplLAorCQkJCQlfX2ZvdW5kX2dyb3VwaW5nKSkKKwkgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworCSAgfQorCisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDIzLiBOdW1fZ2V0IG92ZXJmbG93IHJlc3VsdC4KKwlpZiAoKCFfX3NlcF9wb3MgJiYgIV9fZm91bmRfemVybyAmJiAhX19mb3VuZF9ncm91cGluZy5zaXplKCkpCisJICAgIHx8IF9fdGVzdGZhaWwpCisJICB7CisJICAgIF9fdiA9IDA7CisJICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICB9CisJZWxzZSBpZiAoX190ZXN0b3ZlcmZsb3cpCisJICB7CisJICAgIGlmIChfX25lZ2F0aXZlCisJCSYmIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUPjo6X19pc19zaWduZWQpCisJICAgICAgX192ID0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPF9WYWx1ZVQ+OjpfX21pbjsKKwkgICAgZWxzZQorCSAgICAgIF9fdiA9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUPjo6X19tYXg7CisJICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICB9CisJZWxzZQorCSAgX192ID0gX19uZWdhdGl2ZSA/IC1fX3Jlc3VsdCA6IF9fcmVzdWx0OworCisJaWYgKF9fdGVzdGVvZikKKwkgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJcmV0dXJuIF9fYmVnOworICAgICAgfQorCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gMTcuICBCYWQgYm9vbCBwYXJzaW5nCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGJvb2wmIF9fdikgY29uc3QKKyAgICB7CisgICAgICBpZiAoIShfX2lvLmZsYWdzKCkgJiBpb3NfYmFzZTo6Ym9vbGFscGhhKSkKKyAgICAgICAgeworCSAgLy8gUGFyc2UgYm9vbCB2YWx1ZXMgYXMgbG9uZy4KKyAgICAgICAgICAvLyBOQjogV2UgY2FuJ3QganVzdCBjYWxsIGRvX2dldChsb25nKSBoZXJlLCBhcyBpdCBtaWdodAorICAgICAgICAgIC8vIHJlZmVyIHRvIGEgZGVyaXZlZCBjbGFzcy4KKwkgIGxvbmcgX19sID0gLTE7CisgICAgICAgICAgX19iZWcgPSBfTV9leHRyYWN0X2ludChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX2wpOworCSAgaWYgKF9fbCA9PSAwIHx8IF9fbCA9PSAxKQorCSAgICBfX3YgPSBib29sKF9fbCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gMjMuIE51bV9nZXQgb3ZlcmZsb3cgcmVzdWx0LgorCSAgICAgIF9fdiA9IHRydWU7CisJICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgICAgICBpZiAoX19iZWcgPT0gX19lbmQpCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisJICAvLyBQYXJzZSBib29sIHZhbHVlcyBhcyBhbHBoYW51bWVyaWMuCisJICB0eXBlZGVmIF9fbnVtcHVuY3RfY2FjaGU8X0NoYXJUPiAgX19jYWNoZV90eXBlOworCSAgX191c2VfY2FjaGU8X19jYWNoZV90eXBlPiBfX3VjOworCSAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisJICBjb25zdCBfX2NhY2hlX3R5cGUqIF9fbGMgPSBfX3VjKF9fbG9jKTsKKworCSAgYm9vbCBfX3Rlc3RmID0gdHJ1ZTsKKwkgIGJvb2wgX190ZXN0dCA9IHRydWU7CisJICBib29sIF9fZG9uZWYgPSBfX2xjLT5fTV9mYWxzZW5hbWVfc2l6ZSA9PSAwOworCSAgYm9vbCBfX2RvbmV0ID0gX19sYy0+X01fdHJ1ZW5hbWVfc2l6ZSA9PSAwOworCSAgYm9vbCBfX3Rlc3Rlb2YgPSBmYWxzZTsKKwkgIHNpemVfdCBfX24gPSAwOworCSAgd2hpbGUgKCFfX2RvbmVmIHx8ICFfX2RvbmV0KQorCSAgICB7CisJICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQorCQl7CisJCSAgX190ZXN0ZW9mID0gdHJ1ZTsKKwkJICBicmVhazsKKwkJfQorCisJICAgICAgY29uc3QgY2hhcl90eXBlIF9fYyA9ICpfX2JlZzsKKworCSAgICAgIGlmICghX19kb25lZikKKwkJX190ZXN0ZiA9IF9fYyA9PSBfX2xjLT5fTV9mYWxzZW5hbWVbX19uXTsKKworCSAgICAgIGlmICghX190ZXN0ZiAmJiBfX2RvbmV0KQorCQlicmVhazsKKworCSAgICAgIGlmICghX19kb25ldCkKKwkJX190ZXN0dCA9IF9fYyA9PSBfX2xjLT5fTV90cnVlbmFtZVtfX25dOworCisJICAgICAgaWYgKCFfX3Rlc3R0ICYmIF9fZG9uZWYpCisJCWJyZWFrOworCisJICAgICAgaWYgKCFfX3Rlc3R0ICYmICFfX3Rlc3RmKQorCQlicmVhazsKKworCSAgICAgICsrX19uOworCSAgICAgICsrX19iZWc7CisKKwkgICAgICBfX2RvbmVmID0gIV9fdGVzdGYgfHwgX19uID49IF9fbGMtPl9NX2ZhbHNlbmFtZV9zaXplOworCSAgICAgIF9fZG9uZXQgPSAhX190ZXN0dCB8fCBfX24gPj0gX19sYy0+X01fdHJ1ZW5hbWVfc2l6ZTsKKwkgICAgfQorCSAgaWYgKF9fdGVzdGYgJiYgX19uID09IF9fbGMtPl9NX2ZhbHNlbmFtZV9zaXplICYmIF9fbikKKwkgICAgeworCSAgICAgIF9fdiA9IGZhbHNlOworCSAgICAgIGlmIChfX3Rlc3R0ICYmIF9fbiA9PSBfX2xjLT5fTV90cnVlbmFtZV9zaXplKQorCQlfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworCSAgICAgIGVsc2UKKwkJX19lcnIgPSBfX3Rlc3Rlb2YgPyBpb3NfYmFzZTo6ZW9mYml0IDogaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fdGVzdHQgJiYgX19uID09IF9fbGMtPl9NX3RydWVuYW1lX3NpemUgJiYgX19uKQorCSAgICB7CisJICAgICAgX192ID0gdHJ1ZTsKKwkgICAgICBfX2VyciA9IF9fdGVzdGVvZiA/IGlvc19iYXNlOjplb2ZiaXQgOiBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDIzLiBOdW1fZ2V0IG92ZXJmbG93IHJlc3VsdC4KKwkgICAgICBfX3YgPSBmYWxzZTsKKwkgICAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworCSAgICAgIGlmIChfX3Rlc3Rlb2YpCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgZmxvYXQmIF9fdikgY29uc3QKKyAgICB7CisgICAgICBzdHJpbmcgX194dHJjOworICAgICAgX194dHJjLnJlc2VydmUoMzIpOworICAgICAgX19iZWcgPSBfTV9leHRyYWN0X2Zsb2F0KF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9feHRyYyk7CisgICAgICBzdGQ6Ol9fY29udmVydF90b192KF9feHRyYy5jX3N0cigpLCBfX3YsIF9fZXJyLCBfU19nZXRfY19sb2NhbGUoKSk7CisgICAgICBpZiAoX19iZWcgPT0gX19lbmQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICBudW1fZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgIGRvX2dldChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgZG91YmxlJiBfX3YpIGNvbnN0CisgICAgeworICAgICAgc3RyaW5nIF9feHRyYzsKKyAgICAgIF9feHRyYy5yZXNlcnZlKDMyKTsKKyAgICAgIF9fYmVnID0gX01fZXh0cmFjdF9mbG9hdChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3h0cmMpOworICAgICAgc3RkOjpfX2NvbnZlcnRfdG9fdihfX3h0cmMuY19zdHIoKSwgX192LCBfX2VyciwgX1NfZ2V0X2NfbG9jYWxlKCkpOworICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQorCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBfX2RvX2dldChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGRvdWJsZSYgX192KSBjb25zdAorICAgIHsKKyAgICAgIHN0cmluZyBfX3h0cmM7CisgICAgICBfX3h0cmMucmVzZXJ2ZSgzMik7CisgICAgICBfX2JlZyA9IF9NX2V4dHJhY3RfZmxvYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX194dHJjKTsKKyAgICAgIHN0ZDo6X19jb252ZXJ0X3RvX3YoX194dHJjLmNfc3RyKCksIF9fdiwgX19lcnIsIF9TX2dldF9jX2xvY2FsZSgpKTsKKyAgICAgIGlmIChfX2JlZyA9PSBfX2VuZCkKKwlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcgZG91YmxlJiBfX3YpIGNvbnN0CisgICAgeworICAgICAgc3RyaW5nIF9feHRyYzsKKyAgICAgIF9feHRyYy5yZXNlcnZlKDMyKTsKKyAgICAgIF9fYmVnID0gX01fZXh0cmFjdF9mbG9hdChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3h0cmMpOworICAgICAgc3RkOjpfX2NvbnZlcnRfdG9fdihfX3h0cmMuY19zdHIoKSwgX192LCBfX2VyciwgX1NfZ2V0X2NfbG9jYWxlKCkpOworICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQorCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHZvaWQqJiBfX3YpIGNvbnN0CisgICAgeworICAgICAgLy8gUHJlcGFyZSBmb3IgaGV4IGZvcm1hdHRlZCBpbnB1dC4KKyAgICAgIHR5cGVkZWYgaW9zX2Jhc2U6OmZtdGZsYWdzICAgICAgICBmbXRmbGFnczsKKyAgICAgIGNvbnN0IGZtdGZsYWdzIF9fZm10ID0gX19pby5mbGFncygpOworICAgICAgX19pby5mbGFncygoX19mbXQgJiB+aW9zX2Jhc2U6OmJhc2VmaWVsZCkgfCBpb3NfYmFzZTo6aGV4KTsKKworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTwoc2l6ZW9mKHZvaWQqKQorCQkJCQkgICAgIDw9IHNpemVvZih1bnNpZ25lZCBsb25nKSksCisJdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyBsb25nPjo6X190eXBlIF9VSW50UHRyVHlwZTsgICAgICAgCisKKyAgICAgIF9VSW50UHRyVHlwZSBfX3VsOworICAgICAgX19iZWcgPSBfTV9leHRyYWN0X2ludChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3VsKTsKKworICAgICAgLy8gUmVzZXQgZnJvbSBoZXggZm9ybWF0dGVkIGlucHV0LgorICAgICAgX19pby5mbGFncyhfX2ZtdCk7CisKKyAgICAgIF9fdiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KF9fdWwpOworICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKworICAvLyBGb3IgdXNlIGJ5IGludGVnZXIgYW5kIGZsb2F0aW5nLXBvaW50IHR5cGVzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuCisgIC8vIGNvbnZlcnRlZCBpbnRvIGEgY2hhcl90eXBlIHN0cmluZy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICB2b2lkCisgICAgbnVtX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgX01fcGFkKF9DaGFyVCBfX2ZpbGwsIHN0cmVhbXNpemUgX193LCBpb3NfYmFzZSYgX19pbywKKwkgICBfQ2hhclQqIF9fbmV3LCBjb25zdCBfQ2hhclQqIF9fY3MsIGludCYgX19sZW4pIGNvbnN0CisgICAgeworICAgICAgLy8gWzIyLjIuMi4yLjJdIFN0YWdlIDMuCisgICAgICAvLyBJZiBuZWNlc3NhcnksIHBhZC4KKyAgICAgIF9fcGFkPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+OjpfU19wYWQoX19pbywgX19maWxsLCBfX25ldywKKwkJCQkJCSAgX19jcywgX193LCBfX2xlbik7CisgICAgICBfX2xlbiA9IHN0YXRpY19jYXN0PGludD4oX193KTsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfTERCTAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1ZhbHVlVD4KKyAgICBpbnQKKyAgICBfX2ludF90b19jaGFyKF9DaGFyVCogX19idWZlbmQsIF9WYWx1ZVQgX192LCBjb25zdCBfQ2hhclQqIF9fbGl0LAorCQkgIGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzLCBib29sIF9fZGVjKQorICAgIHsKKyAgICAgIF9DaGFyVCogX19idWYgPSBfX2J1ZmVuZDsKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KF9fZGVjLCB0cnVlKSkKKwl7CisJICAvLyBEZWNpbWFsLgorCSAgZG8KKwkgICAgeworCSAgICAgICotLV9fYnVmID0gX19saXRbKF9fdiAlIDEwKSArIF9fbnVtX2Jhc2U6Ol9TX29kaWdpdHNdOworCSAgICAgIF9fdiAvPSAxMDsKKwkgICAgfQorCSAgd2hpbGUgKF9fdiAhPSAwKTsKKwl9CisgICAgICBlbHNlIGlmICgoX19mbGFncyAmIGlvc19iYXNlOjpiYXNlZmllbGQpID09IGlvc19iYXNlOjpvY3QpCisJeworCSAgLy8gT2N0YWwuCisJICBkbworCSAgICB7CisJICAgICAgKi0tX19idWYgPSBfX2xpdFsoX192ICYgMHg3KSArIF9fbnVtX2Jhc2U6Ol9TX29kaWdpdHNdOworCSAgICAgIF9fdiA+Pj0gMzsKKwkgICAgfQorCSAgd2hpbGUgKF9fdiAhPSAwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLy8gSGV4LgorCSAgY29uc3QgYm9vbCBfX3VwcGVyY2FzZSA9IF9fZmxhZ3MgJiBpb3NfYmFzZTo6dXBwZXJjYXNlOworCSAgY29uc3QgaW50IF9fY2FzZV9vZmZzZXQgPSBfX3VwcGVyY2FzZSA/IF9fbnVtX2Jhc2U6Ol9TX291ZGlnaXRzCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19udW1fYmFzZTo6X1Nfb2RpZ2l0czsKKwkgIGRvCisJICAgIHsKKwkgICAgICAqLS1fX2J1ZiA9IF9fbGl0WyhfX3YgJiAweGYpICsgX19jYXNlX29mZnNldF07CisJICAgICAgX192ID4+PSA0OworCSAgICB9CisJICB3aGlsZSAoX192ICE9IDApOworCX0KKyAgICAgIHJldHVybiBfX2J1ZmVuZCAtIF9fYnVmOworICAgIH0KKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0xEQkwKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIHZvaWQKKyAgICBudW1fcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBfTV9ncm91cF9pbnQoY29uc3QgY2hhciogX19ncm91cGluZywgc2l6ZV90IF9fZ3JvdXBpbmdfc2l6ZSwgX0NoYXJUIF9fc2VwLAorCQkgaW9zX2Jhc2UmLCBfQ2hhclQqIF9fbmV3LCBfQ2hhclQqIF9fY3MsIGludCYgX19sZW4pIGNvbnN0CisgICAgeworICAgICAgX0NoYXJUKiBfX3AgPSBzdGQ6Ol9fYWRkX2dyb3VwaW5nKF9fbmV3LCBfX3NlcCwgX19ncm91cGluZywKKwkJCQkJX19ncm91cGluZ19zaXplLCBfX2NzLCBfX2NzICsgX19sZW4pOworICAgICAgX19sZW4gPSBfX3AgLSBfX25ldzsKKyAgICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZVQ+CisgICAgICBfT3V0SXRlcgorICAgICAgbnVtX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgICBfTV9pbnNlcnRfaW50KF9PdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9faW8sIF9DaGFyVCBfX2ZpbGwsCisJCSAgICBfVmFsdWVUIF9fdikgY29uc3QKKyAgICAgIHsKKwl1c2luZyBfX2dudV9jeHg6Ol9fYWRkX3Vuc2lnbmVkOworCXR5cGVkZWYgdHlwZW5hbWUgX19hZGRfdW5zaWduZWQ8X1ZhbHVlVD46Ol9fdHlwZSBfX3Vuc2lnbmVkX3R5cGU7CisJdHlwZWRlZiBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4JICAgICAgICAgICAgIF9fY2FjaGVfdHlwZTsKKwlfX3VzZV9jYWNoZTxfX2NhY2hlX3R5cGU+IF9fdWM7CisJY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisJY29uc3QgX19jYWNoZV90eXBlKiBfX2xjID0gX191YyhfX2xvYyk7CisJY29uc3QgX0NoYXJUKiBfX2xpdCA9IF9fbGMtPl9NX2F0b21zX291dDsKKwljb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faW8uZmxhZ3MoKTsKKworCS8vIExvbmcgZW5vdWdoIHRvIGhvbGQgaGV4LCBkZWMsIGFuZCBvY3RhbCByZXByZXNlbnRhdGlvbnMuCisJY29uc3QgaW50IF9faWxlbiA9IDUgKiBzaXplb2YoX1ZhbHVlVCk7CisJX0NoYXJUKiBfX2NzID0gc3RhdGljX2Nhc3Q8X0NoYXJUKj4oX19idWlsdGluX2FsbG9jYShzaXplb2YoX0NoYXJUKQorCQkJCQkJCSAgICAgKiBfX2lsZW4pKTsKKworCS8vIFsyMi4yLjIuMi4yXSBTdGFnZSAxLCBudW1lcmljIGNvbnZlcnNpb24gdG8gY2hhcmFjdGVyLgorCS8vIFJlc3VsdCBpcyByZXR1cm5lZCByaWdodC1qdXN0aWZpZWQgaW4gdGhlIGJ1ZmZlci4KKwljb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19iYXNlZmllbGQgPSBfX2ZsYWdzICYgaW9zX2Jhc2U6OmJhc2VmaWVsZDsKKwljb25zdCBib29sIF9fZGVjID0gKF9fYmFzZWZpZWxkICE9IGlvc19iYXNlOjpvY3QKKwkJCSAgICAmJiBfX2Jhc2VmaWVsZCAhPSBpb3NfYmFzZTo6aGV4KTsKKwljb25zdCBfX3Vuc2lnbmVkX3R5cGUgX191ID0gKChfX3YgPiAwIHx8ICFfX2RlYykKKwkJCQkgICAgID8gX191bnNpZ25lZF90eXBlKF9fdikKKwkJCQkgICAgIDogLV9fdW5zaWduZWRfdHlwZShfX3YpKTsKKyAJaW50IF9fbGVuID0gX19pbnRfdG9fY2hhcihfX2NzICsgX19pbGVuLCBfX3UsIF9fbGl0LCBfX2ZsYWdzLCBfX2RlYyk7CisJX19jcyArPSBfX2lsZW4gLSBfX2xlbjsKKworCS8vIEFkZCBncm91cGluZywgaWYgbmVjZXNzYXJ5LgorCWlmIChfX2xjLT5fTV91c2VfZ3JvdXBpbmcpCisJICB7CisJICAgIC8vIEdyb3VwaW5nIGNhbiBhZGQgKGFsbW9zdCkgYXMgbWFueSBzZXBhcmF0b3JzIGFzIHRoZSBudW1iZXIKKwkgICAgLy8gb2YgZGlnaXRzICsgc3BhY2UgaXMgcmVzZXJ2ZWQgZm9yIG51bWVyaWMgYmFzZSBvciBzaWduLgorCSAgICBfQ2hhclQqIF9fY3MyID0gc3RhdGljX2Nhc3Q8X0NoYXJUKj4oX19idWlsdGluX2FsbG9jYShzaXplb2YoX0NoYXJUKQorCQkJCQkJCQkgICogKF9fbGVuICsgMSkKKwkJCQkJCQkJICAqIDIpKTsKKwkgICAgX01fZ3JvdXBfaW50KF9fbGMtPl9NX2dyb3VwaW5nLCBfX2xjLT5fTV9ncm91cGluZ19zaXplLAorCQkJIF9fbGMtPl9NX3Rob3VzYW5kc19zZXAsIF9faW8sIF9fY3MyICsgMiwgX19jcywgX19sZW4pOworCSAgICBfX2NzID0gX19jczIgKyAyOworCSAgfQorCisJLy8gQ29tcGxldGUgU3RhZ2UgMSwgcHJlcGVuZCBudW1lcmljIGJhc2Ugb3Igc2lnbi4KKwlpZiAoX19idWlsdGluX2V4cGVjdChfX2RlYywgdHJ1ZSkpCisJICB7CisJICAgIC8vIERlY2ltYWwuCisJICAgIGlmIChfX3YgPj0gMCkKKwkgICAgICB7CisJCWlmIChib29sKF9fZmxhZ3MgJiBpb3NfYmFzZTo6c2hvd3BvcykKKwkJICAgICYmIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUPjo6X19pc19zaWduZWQpCisJCSAgKi0tX19jcyA9IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX29wbHVzXSwgKytfX2xlbjsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICAqLS1fX2NzID0gX19saXRbX19udW1fYmFzZTo6X1Nfb21pbnVzXSwgKytfX2xlbjsKKwkgIH0KKwllbHNlIGlmIChib29sKF9fZmxhZ3MgJiBpb3NfYmFzZTo6c2hvd2Jhc2UpICYmIF9fdikKKwkgIHsKKwkgICAgaWYgKF9fYmFzZWZpZWxkID09IGlvc19iYXNlOjpvY3QpCisJICAgICAgKi0tX19jcyA9IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX29kaWdpdHNdLCArK19fbGVuOworCSAgICBlbHNlCisJICAgICAgeworCQkvLyAneCcgb3IgJ1gnCisJCWNvbnN0IGJvb2wgX191cHBlcmNhc2UgPSBfX2ZsYWdzICYgaW9zX2Jhc2U6OnVwcGVyY2FzZTsKKwkJKi0tX19jcyA9IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX294ICsgX191cHBlcmNhc2VdOworCQkvLyAnMCcKKwkJKi0tX19jcyA9IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX29kaWdpdHNdOworCQlfX2xlbiArPSAyOworCSAgICAgIH0KKwkgIH0KKworCS8vIFBhZC4KKwljb25zdCBzdHJlYW1zaXplIF9fdyA9IF9faW8ud2lkdGgoKTsKKwlpZiAoX193ID4gc3RhdGljX2Nhc3Q8c3RyZWFtc2l6ZT4oX19sZW4pKQorCSAgeworCSAgICBfQ2hhclQqIF9fY3MzID0gc3RhdGljX2Nhc3Q8X0NoYXJUKj4oX19idWlsdGluX2FsbG9jYShzaXplb2YoX0NoYXJUKQorCQkJCQkJCQkgICogX193KSk7CisJICAgIF9NX3BhZChfX2ZpbGwsIF9fdywgX19pbywgX19jczMsIF9fY3MsIF9fbGVuKTsKKwkgICAgX19jcyA9IF9fY3MzOworCSAgfQorCV9faW8ud2lkdGgoMCk7CisKKwkvLyBbMjIuMi4yLjIuMl0gU3RhZ2UgNC4KKwkvLyBXcml0ZSByZXN1bHRpbmcsIGZ1bGx5LWZvcm1hdHRlZCBzdHJpbmcgdG8gb3V0cHV0IGl0ZXJhdG9yLgorCXJldHVybiBzdGQ6Ol9fd3JpdGUoX19zLCBfX2NzLCBfX2xlbik7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICB2b2lkCisgICAgbnVtX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgX01fZ3JvdXBfZmxvYXQoY29uc3QgY2hhciogX19ncm91cGluZywgc2l6ZV90IF9fZ3JvdXBpbmdfc2l6ZSwKKwkJICAgX0NoYXJUIF9fc2VwLCBjb25zdCBfQ2hhclQqIF9fcCwgX0NoYXJUKiBfX25ldywKKwkJICAgX0NoYXJUKiBfX2NzLCBpbnQmIF9fbGVuKSBjb25zdAorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDI4Mi4gV2hhdCB0eXBlcyBkb2VzIG51bXB1bmN0IGdyb3VwaW5nIHJlZmVyIHRvPworICAgICAgLy8gQWRkIGdyb3VwaW5nLCBpZiBuZWNlc3NhcnkuCisgICAgICBjb25zdCBpbnQgX19kZWNsZW4gPSBfX3AgPyBfX3AgLSBfX2NzIDogX19sZW47CisgICAgICBfQ2hhclQqIF9fcDIgPSBzdGQ6Ol9fYWRkX2dyb3VwaW5nKF9fbmV3LCBfX3NlcCwgX19ncm91cGluZywKKwkJCQkJIF9fZ3JvdXBpbmdfc2l6ZSwKKwkJCQkJIF9fY3MsIF9fY3MgKyBfX2RlY2xlbik7CisKKyAgICAgIC8vIFRhY2sgb24gZGVjaW1hbCBwYXJ0LgorICAgICAgaW50IF9fbmV3bGVuID0gX19wMiAtIF9fbmV3OworICAgICAgaWYgKF9fcCkKKwl7CisJICBjaGFyX3RyYWl0czxfQ2hhclQ+Ojpjb3B5KF9fcDIsIF9fcCwgX19sZW4gLSBfX2RlY2xlbik7CisJICBfX25ld2xlbiArPSBfX2xlbiAtIF9fZGVjbGVuOworCX0KKyAgICAgIF9fbGVuID0gX19uZXdsZW47CisgICAgfQorCisgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSB1c2VzIHZzbnByaW50ZiAob3IgdnNwcmludGYoKSwgd2hlbgorICAvLyBfR0xJQkNYWF9VU0VfQzk5IGlzIG5vdCBkZWZpbmVkKSB0byBjb252ZXJ0IGZsb2F0aW5nIHBvaW50IHZhbHVlcworICAvLyBmb3IgaW5zZXJ0aW9uIGludG8gYSBzdHJlYW0uICBBbiBvcHRpbWl6YXRpb24gd291bGQgYmUgdG8gcmVwbGFjZQorICAvLyB0aGVtIHdpdGggY29kZSB0aGF0IHdvcmtzIGRpcmVjdGx5IG9uIGEgd2lkZSBidWZmZXIgYW5kIHRoZW4gdXNlCisgIC8vIF9fcGFkIHRvIGRvIHRoZSBwYWRkaW5nLiAgSXQgd291bGQgYmUgZ29vZCB0byByZXBsYWNlIHRoZW0gYW55d2F5CisgIC8vIHRvIGdhaW4gYmFjayB0aGUgZWZmaWNpZW5jeSB0aGF0IEMrKyBwcm92aWRlcyBieSBrbm93aW5nIHVwIGZyb250CisgIC8vIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZXMgdG8gaW5zZXJ0LiAgQWxzbywgc3ByaW50ZiBpcyBkYW5nZXJvdXMKKyAgLy8gc2luY2UgbWF5IGxlYWQgdG8gYWNjaWRlbnRhbCBidWZmZXIgb3ZlcnJ1bnMuICBUaGlzCisgIC8vIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIEMrKyBzdGFuZGFyZCBmYWlybHkgZGlyZWN0bHkgYXMKKyAgLy8gb3V0bGluZWQgaW4gMjIuMi4yLjIgW2xpYi5sb2NhbGUubnVtLnB1dF0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVUPgorICAgICAgX091dEl0ZXIKKyAgICAgIG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgICAgX01faW5zZXJ0X2Zsb2F0KF9PdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9faW8sIF9DaGFyVCBfX2ZpbGwsIGNoYXIgX19tb2QsCisJCSAgICAgICBfVmFsdWVUIF9fdikgY29uc3QKKyAgICAgIHsKKwl0eXBlZGVmIF9fbnVtcHVuY3RfY2FjaGU8X0NoYXJUPiAgICAgICAgICAgICAgICBfX2NhY2hlX3R5cGU7CisJX191c2VfY2FjaGU8X19jYWNoZV90eXBlPiBfX3VjOworCWNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCWNvbnN0IF9fY2FjaGVfdHlwZSogX19sYyA9IF9fdWMoX19sb2MpOworCisJLy8gVXNlIGRlZmF1bHQgcHJlY2lzaW9uIGlmIG91dCBvZiByYW5nZS4KKwljb25zdCBzdHJlYW1zaXplIF9fcHJlYyA9IF9faW8ucHJlY2lzaW9uKCkgPCAwID8gNiA6IF9faW8ucHJlY2lzaW9uKCk7CisKKwljb25zdCBpbnQgX19tYXhfZGlnaXRzID0KKwkgIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUPjo6X19kaWdpdHMxMDsKKworCS8vIFsyMi4yLjIuMi4yXSBTdGFnZSAxLCBudW1lcmljIGNvbnZlcnNpb24gdG8gY2hhcmFjdGVyLgorCWludCBfX2xlbjsKKwkvLyBMb25nIGVub3VnaCBmb3IgdGhlIG1heCBmb3JtYXQgc3BlYy4KKwljaGFyIF9fZmJ1ZlsxNl07CisJX19udW1fYmFzZTo6X1NfZm9ybWF0X2Zsb2F0KF9faW8sIF9fZmJ1ZiwgX19tb2QpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OQorCS8vIEZpcnN0IHRyeSBhIGJ1ZmZlciBwZXJoYXBzIGJpZyBlbm91Z2ggKG1vc3QgcHJvYmFibHkgc3VmZmljaWVudAorCS8vIGZvciBub24taW9zX2Jhc2U6OmZpeGVkIG91dHB1dHMpCisJaW50IF9fY3Nfc2l6ZSA9IF9fbWF4X2RpZ2l0cyAqIDM7CisJY2hhciogX19jcyA9IHN0YXRpY19jYXN0PGNoYXIqPihfX2J1aWx0aW5fYWxsb2NhKF9fY3Nfc2l6ZSkpOworCV9fbGVuID0gc3RkOjpfX2NvbnZlcnRfZnJvbV92KF9TX2dldF9jX2xvY2FsZSgpLCBfX2NzLCBfX2NzX3NpemUsCisJCQkJICAgICAgX19mYnVmLCBfX3ByZWMsIF9fdik7CisKKwkvLyBJZiB0aGUgYnVmZmVyIHdhcyBub3QgbGFyZ2UgZW5vdWdoLCB0cnkgYWdhaW4gd2l0aCB0aGUgY29ycmVjdCBzaXplLgorCWlmIChfX2xlbiA+PSBfX2NzX3NpemUpCisJICB7CisJICAgIF9fY3Nfc2l6ZSA9IF9fbGVuICsgMTsKKwkgICAgX19jcyA9IHN0YXRpY19jYXN0PGNoYXIqPihfX2J1aWx0aW5fYWxsb2NhKF9fY3Nfc2l6ZSkpOworCSAgICBfX2xlbiA9IHN0ZDo6X19jb252ZXJ0X2Zyb21fdihfU19nZXRfY19sb2NhbGUoKSwgX19jcywgX19jc19zaXplLAorCQkJCQkgIF9fZmJ1ZiwgX19wcmVjLCBfX3YpOworCSAgfQorI2Vsc2UKKwkvLyBDb25zaWRlciB0aGUgcG9zc2liaWxpdHkgb2YgbG9uZyBpb3NfYmFzZTo6Zml4ZWQgb3V0cHV0cworCWNvbnN0IGJvb2wgX19maXhlZCA9IF9faW8uZmxhZ3MoKSAmIGlvc19iYXNlOjpmaXhlZDsKKwljb25zdCBpbnQgX19tYXhfZXhwID0KKwkgIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUPjo6X19tYXhfZXhwb25lbnQxMDsKKworCS8vIFRoZSBzaXplIG9mIHRoZSBvdXRwdXQgc3RyaW5nIGlzIGNvbXB1dGVkIGFzIGZvbGxvd3MuCisJLy8gaW9zX2Jhc2U6OmZpeGVkIG91dHB1dHMgbWF5IG5lZWQgdXAgdG8gX19tYXhfZXhwICsgMSBjaGFycworCS8vIGZvciB0aGUgaW50ZWdlciBwYXJ0ICsgX19wcmVjIGNoYXJzIGZvciB0aGUgZnJhY3Rpb25hbCBwYXJ0CisJLy8gKyAzIGNoYXJzIGZvciBzaWduLCBkZWNpbWFsIHBvaW50LCAnXDAnLiBPbiB0aGUgb3RoZXIgaGFuZCwKKwkvLyBmb3Igbm9uLWZpeGVkIG91dHB1dHMgX19tYXhfZGlnaXRzICogMiArIF9fcHJlYyBjaGFycyBhcmUKKwkvLyBsYXJnZWx5IHN1ZmZpY2llbnQuCisJY29uc3QgaW50IF9fY3Nfc2l6ZSA9IF9fZml4ZWQgPyBfX21heF9leHAgKyBfX3ByZWMgKyA0CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX21heF9kaWdpdHMgKiAyICsgX19wcmVjOworCWNoYXIqIF9fY3MgPSBzdGF0aWNfY2FzdDxjaGFyKj4oX19idWlsdGluX2FsbG9jYShfX2NzX3NpemUpKTsKKwlfX2xlbiA9IHN0ZDo6X19jb252ZXJ0X2Zyb21fdihfU19nZXRfY19sb2NhbGUoKSwgX19jcywgMCwgX19mYnVmLCAKKwkJCQkgICAgICBfX3ByZWMsIF9fdik7CisjZW5kaWYKKworCS8vIFsyMi4yLjIuMi4yXSBTdGFnZSAyLCBjb252ZXJ0IHRvIGNoYXJfdHlwZSwgdXNpbmcgY29ycmVjdAorCS8vIG51bXB1bmN0LmRlY2ltYWxfcG9pbnQoKSB2YWx1ZXMgZm9yICcuJyBhbmQgYWRkaW5nIGdyb3VwaW5nLgorCWNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKwkKKwlfQ2hhclQqIF9fd3MgPSBzdGF0aWNfY2FzdDxfQ2hhclQqPihfX2J1aWx0aW5fYWxsb2NhKHNpemVvZihfQ2hhclQpCisJCQkJCQkJICAgICAqIF9fbGVuKSk7CisJX19jdHlwZS53aWRlbihfX2NzLCBfX2NzICsgX19sZW4sIF9fd3MpOworCQorCS8vIFJlcGxhY2UgZGVjaW1hbCBwb2ludC4KKwlfQ2hhclQqIF9fd3AgPSAwOworCWNvbnN0IGNoYXIqIF9fcCA9IGNoYXJfdHJhaXRzPGNoYXI+OjpmaW5kKF9fY3MsIF9fbGVuLCAnLicpOworCWlmIChfX3ApCisJICB7CisJICAgIF9fd3AgPSBfX3dzICsgKF9fcCAtIF9fY3MpOworCSAgICAqX193cCA9IF9fbGMtPl9NX2RlY2ltYWxfcG9pbnQ7CisJICB9CisJCisJLy8gQWRkIGdyb3VwaW5nLCBpZiBuZWNlc3NhcnkuCisJLy8gTi5CLiBNYWtlIHN1cmUgdG8gbm90IGdyb3VwIHRoaW5ncyBsaWtlIDJlMjAsIGkuZS4sIG5vIGRlY2ltYWwKKwkvLyBwb2ludCwgc2NpZW50aWZpYyBub3RhdGlvbi4KKwlpZiAoX19sYy0+X01fdXNlX2dyb3VwaW5nCisJICAgICYmIChfX3dwIHx8IF9fbGVuIDwgMyB8fCAoX19jc1sxXSA8PSAnOScgJiYgX19jc1syXSA8PSAnOScKKwkJCQkgICAgICAmJiBfX2NzWzFdID49ICcwJyAmJiBfX2NzWzJdID49ICcwJykpKQorCSAgeworCSAgICAvLyBHcm91cGluZyBjYW4gYWRkIChhbG1vc3QpIGFzIG1hbnkgc2VwYXJhdG9ycyBhcyB0aGUKKwkgICAgLy8gbnVtYmVyIG9mIGRpZ2l0cywgYnV0IG5vIG1vcmUuCisJICAgIF9DaGFyVCogX193czIgPSBzdGF0aWNfY2FzdDxfQ2hhclQqPihfX2J1aWx0aW5fYWxsb2NhKHNpemVvZihfQ2hhclQpCisJCQkJCQkJCSAgKiBfX2xlbiAqIDIpKTsKKwkgICAgCisJICAgIHN0cmVhbXNpemUgX19vZmYgPSAwOworCSAgICBpZiAoX19jc1swXSA9PSAnLScgfHwgX19jc1swXSA9PSAnKycpCisJICAgICAgeworCQlfX29mZiA9IDE7CisJCV9fd3MyWzBdID0gX193c1swXTsKKwkJX19sZW4gLT0gMTsKKwkgICAgICB9CisJICAgIAorCSAgICBfTV9ncm91cF9mbG9hdChfX2xjLT5fTV9ncm91cGluZywgX19sYy0+X01fZ3JvdXBpbmdfc2l6ZSwKKwkJCSAgIF9fbGMtPl9NX3Rob3VzYW5kc19zZXAsIF9fd3AsIF9fd3MyICsgX19vZmYsCisJCQkgICBfX3dzICsgX19vZmYsIF9fbGVuKTsKKwkgICAgX19sZW4gKz0gX19vZmY7CisJICAgIAorCSAgICBfX3dzID0gX193czI7CisJICB9CisKKwkvLyBQYWQuCisJY29uc3Qgc3RyZWFtc2l6ZSBfX3cgPSBfX2lvLndpZHRoKCk7CisJaWYgKF9fdyA+IHN0YXRpY19jYXN0PHN0cmVhbXNpemU+KF9fbGVuKSkKKwkgIHsKKwkgICAgX0NoYXJUKiBfX3dzMyA9IHN0YXRpY19jYXN0PF9DaGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkKKwkJCQkJCQkJICAqIF9fdykpOworCSAgICBfTV9wYWQoX19maWxsLCBfX3csIF9faW8sIF9fd3MzLCBfX3dzLCBfX2xlbik7CisJICAgIF9fd3MgPSBfX3dzMzsKKwkgIH0KKwlfX2lvLndpZHRoKDApOworCQorCS8vIFsyMi4yLjIuMi4yXSBTdGFnZSA0LgorCS8vIFdyaXRlIHJlc3VsdGluZywgZnVsbHktZm9ybWF0dGVkIHN0cmluZyB0byBvdXRwdXQgaXRlcmF0b3IuCisJcmV0dXJuIHN0ZDo6X193cml0ZShfX3MsIF9fd3MsIF9fbGVuKTsKKyAgICAgIH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgX091dEl0ZXIKKyAgICBudW1fcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGJvb2wgX192KSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pby5mbGFncygpOworICAgICAgaWYgKChfX2ZsYWdzICYgaW9zX2Jhc2U6OmJvb2xhbHBoYSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGxvbmcgX19sID0gX192OworICAgICAgICAgIF9fcyA9IF9NX2luc2VydF9pbnQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fbCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgdHlwZWRlZiBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4gICAgICAgICAgICAgIF9fY2FjaGVfdHlwZTsKKwkgIF9fdXNlX2NhY2hlPF9fY2FjaGVfdHlwZT4gX191YzsKKwkgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCSAgY29uc3QgX19jYWNoZV90eXBlKiBfX2xjID0gX191YyhfX2xvYyk7CisKKwkgIGNvbnN0IF9DaGFyVCogX19uYW1lID0gX192ID8gX19sYy0+X01fdHJ1ZW5hbWUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19sYy0+X01fZmFsc2VuYW1lOworCSAgaW50IF9fbGVuID0gX192ID8gX19sYy0+X01fdHJ1ZW5hbWVfc2l6ZQorCSAgICAgICAgICAgICAgICAgIDogX19sYy0+X01fZmFsc2VuYW1lX3NpemU7CisKKwkgIGNvbnN0IHN0cmVhbXNpemUgX193ID0gX19pby53aWR0aCgpOworCSAgaWYgKF9fdyA+IHN0YXRpY19jYXN0PHN0cmVhbXNpemU+KF9fbGVuKSkKKwkgICAgeworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19wbGVuID0gX193IC0gX19sZW47CisJICAgICAgX0NoYXJUKiBfX3BzCisJCT0gc3RhdGljX2Nhc3Q8X0NoYXJUKj4oX19idWlsdGluX2FsbG9jYShzaXplb2YoX0NoYXJUKQorCQkJCQkJCSogX19wbGVuKSk7CisKKwkgICAgICBjaGFyX3RyYWl0czxfQ2hhclQ+Ojphc3NpZ24oX19wcywgX19wbGVuLCBfX2ZpbGwpOworCSAgICAgIF9faW8ud2lkdGgoMCk7CisKKwkgICAgICBpZiAoKF9fZmxhZ3MgJiBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpID09IGlvc19iYXNlOjpsZWZ0KQorCQl7CisJCSAgX19zID0gc3RkOjpfX3dyaXRlKF9fcywgX19uYW1lLCBfX2xlbik7CisJCSAgX19zID0gc3RkOjpfX3dyaXRlKF9fcywgX19wcywgX19wbGVuKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fcHMsIF9fcGxlbik7CisJCSAgX19zID0gc3RkOjpfX3dyaXRlKF9fcywgX19uYW1lLCBfX2xlbik7CisJCX0KKwkgICAgICByZXR1cm4gX19zOworCSAgICB9CisJICBfX2lvLndpZHRoKDApOworCSAgX19zID0gc3RkOjpfX3dyaXRlKF9fcywgX19uYW1lLCBfX2xlbik7CisJfQorICAgICAgcmV0dXJuIF9fczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBfT3V0SXRlcgorICAgIG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwgZG91YmxlIF9fdikgY29uc3QKKyAgICB7IHJldHVybiBfTV9pbnNlcnRfZmxvYXQoX19zLCBfX2lvLCBfX2ZpbGwsIGNoYXIoKSwgX192KTsgfQorCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgX091dEl0ZXIKKyAgICBudW1fcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBfX2RvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwgZG91YmxlIF9fdikgY29uc3QKKyAgICB7IHJldHVybiBfTV9pbnNlcnRfZmxvYXQoX19zLCBfX2lvLCBfX2ZpbGwsIGNoYXIoKSwgX192KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBfT3V0SXRlcgorICAgIG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkgICBsb25nIGRvdWJsZSBfX3YpIGNvbnN0CisgICAgeyByZXR1cm4gX01faW5zZXJ0X2Zsb2F0KF9fcywgX19pbywgX19maWxsLCAnTCcsIF9fdik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIF9PdXRJdGVyCisgICAgbnVtX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorICAgICAgICAgICBjb25zdCB2b2lkKiBfX3YpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lvLmZsYWdzKCk7CisgICAgICBjb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbXQgPSB+KGlvc19iYXNlOjpiYXNlZmllbGQKKwkJCQkJIHwgaW9zX2Jhc2U6OnVwcGVyY2FzZSk7CisgICAgICBfX2lvLmZsYWdzKChfX2ZsYWdzICYgX19mbXQpIHwgKGlvc19iYXNlOjpoZXggfCBpb3NfYmFzZTo6c2hvd2Jhc2UpKTsKKworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTwoc2l6ZW9mKGNvbnN0IHZvaWQqKQorCQkJCQkgICAgIDw9IHNpemVvZih1bnNpZ25lZCBsb25nKSksCisJdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyBsb25nPjo6X190eXBlIF9VSW50UHRyVHlwZTsgICAgICAgCisKKyAgICAgIF9fcyA9IF9NX2luc2VydF9pbnQoX19zLCBfX2lvLCBfX2ZpbGwsCisJCQkgIHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPihfX3YpKTsKKyAgICAgIF9faW8uZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19zOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9MREJMCisKKyAgLy8gQ29uc3RydWN0IGNvcnJlY3RseSBwYWRkZWQgc3RyaW5nLCBhcyBwZXIgMjIuMi4yLjIuMgorICAvLyBBc3N1bWVzCisgIC8vIF9fbmV3bGVuID4gX19vbGRsZW4KKyAgLy8gX19uZXdzIGlzIGFsbG9jYXRlZCBmb3IgX19uZXdsZW4gc2l6ZQorCisgIC8vIE5COiBPZiB0aGUgdHdvIHBhcmFtZXRlcnMsIF9DaGFyVCBjYW4gYmUgZGVkdWNlZCBmcm9tIHRoZQorICAvLyBmdW5jdGlvbiBhcmd1bWVudHMuIFRoZSBvdGhlciAoX1RyYWl0cykgaGFzIHRvIGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdm9pZAorICAgIF9fcGFkPF9DaGFyVCwgX1RyYWl0cz46Ol9TX3BhZChpb3NfYmFzZSYgX19pbywgX0NoYXJUIF9fZmlsbCwKKwkJCQkgICBfQ2hhclQqIF9fbmV3cywgY29uc3QgX0NoYXJUKiBfX29sZHMsCisJCQkJICAgc3RyZWFtc2l6ZSBfX25ld2xlbiwgc3RyZWFtc2l6ZSBfX29sZGxlbikKKyAgICB7CisgICAgICBjb25zdCBzaXplX3QgX19wbGVuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX25ld2xlbiAtIF9fb2xkbGVuKTsKKyAgICAgIGNvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBfX2FkanVzdCA9IF9faW8uZmxhZ3MoKSAmIGlvc19iYXNlOjphZGp1c3RmaWVsZDsKKworICAgICAgLy8gUGFkZGluZyBsYXN0LgorICAgICAgaWYgKF9fYWRqdXN0ID09IGlvc19iYXNlOjpsZWZ0KQorCXsKKwkgIF9UcmFpdHM6OmNvcHkoX19uZXdzLCBfX29sZHMsIF9fb2xkbGVuKTsKKwkgIF9UcmFpdHM6OmFzc2lnbihfX25ld3MgKyBfX29sZGxlbiwgX19wbGVuLCBfX2ZpbGwpOworCSAgcmV0dXJuOworCX0KKworICAgICAgc2l6ZV90IF9fbW9kID0gMDsKKyAgICAgIGlmIChfX2FkanVzdCA9PSBpb3NfYmFzZTo6aW50ZXJuYWwpCisJeworCSAgLy8gUGFkIGFmdGVyIHRoZSBzaWduLCBpZiB0aGVyZSBpcyBvbmUuCisJICAvLyBQYWQgYWZ0ZXIgMFt4WF0sIGlmIHRoZXJlIGlzIG9uZS4KKwkgIC8vIFdobyBjYW1lIHVwIHdpdGggdGhlc2UgcnVsZXMsIGFueXdheT8gSmVlemUuCisgICAgICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisJICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisKKwkgIGlmIChfX2N0eXBlLndpZGVuKCctJykgPT0gX19vbGRzWzBdCisJICAgICAgfHwgX19jdHlwZS53aWRlbignKycpID09IF9fb2xkc1swXSkKKwkgICAgeworCSAgICAgIF9fbmV3c1swXSA9IF9fb2xkc1swXTsKKwkgICAgICBfX21vZCA9IDE7CisJICAgICAgKytfX25ld3M7CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fY3R5cGUud2lkZW4oJzAnKSA9PSBfX29sZHNbMF0KKwkJICAgJiYgX19vbGRsZW4gPiAxCisJCSAgICYmIChfX2N0eXBlLndpZGVuKCd4JykgPT0gX19vbGRzWzFdCisJCSAgICAgICB8fCBfX2N0eXBlLndpZGVuKCdYJykgPT0gX19vbGRzWzFdKSkKKwkgICAgeworCSAgICAgIF9fbmV3c1swXSA9IF9fb2xkc1swXTsKKwkgICAgICBfX25ld3NbMV0gPSBfX29sZHNbMV07CisJICAgICAgX19tb2QgPSAyOworCSAgICAgIF9fbmV3cyArPSAyOworCSAgICB9CisJICAvLyBlbHNlIFBhZGRpbmcgZmlyc3QuCisJfQorICAgICAgX1RyYWl0czo6YXNzaWduKF9fbmV3cywgX19wbGVuLCBfX2ZpbGwpOworICAgICAgX1RyYWl0czo6Y29weShfX25ld3MgKyBfX3BsZW4sIF9fb2xkcyArIF9fbW9kLCBfX29sZGxlbiAtIF9fbW9kKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIF9DaGFyVCoKKyAgICBfX2FkZF9ncm91cGluZyhfQ2hhclQqIF9fcywgX0NoYXJUIF9fc2VwLAorCQkgICBjb25zdCBjaGFyKiBfX2diZWcsIHNpemVfdCBfX2dzaXplLAorCQkgICBjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0KQorICAgIHsKKyAgICAgIHNpemVfdCBfX2lkeCA9IDA7CisgICAgICBzaXplX3QgX19jdHIgPSAwOworCisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IF9fZ2JlZ1tfX2lkeF0KKwkgICAgICYmIHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPihfX2diZWdbX19pZHhdKSA+IDAKKwkgICAgICYmIF9fZ2JlZ1tfX2lkeF0gIT0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGNoYXI+OjpfX21heCkKKwl7CisJICBfX2xhc3QgLT0gX19nYmVnW19faWR4XTsKKwkgIF9faWR4IDwgX19nc2l6ZSAtIDEgPyArK19faWR4IDogKytfX2N0cjsKKwl9CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkqX19zKysgPSAqX19maXJzdCsrOworCisgICAgICB3aGlsZSAoX19jdHItLSkKKwl7CisJICAqX19zKysgPSBfX3NlcDsJICAKKwkgIGZvciAoY2hhciBfX2kgPSBfX2diZWdbX19pZHhdOyBfX2kgPiAwOyAtLV9faSkKKwkgICAgKl9fcysrID0gKl9fZmlyc3QrKzsKKwl9CisKKyAgICAgIHdoaWxlIChfX2lkeC0tKQorCXsKKwkgICpfX3MrKyA9IF9fc2VwOwkgIAorCSAgZm9yIChjaGFyIF9faSA9IF9fZ2JlZ1tfX2lkeF07IF9faSA+IDA7IC0tX19pKQorCSAgICAqX19zKysgPSAqX19maXJzdCsrOworCX0KKworICAgICAgcmV0dXJuIF9fczsKKyAgICB9CisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBudW1wdW5jdDxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG51bXB1bmN0X2J5bmFtZTxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9HTElCQ1hYX05BTUVTUEFDRV9MREJMIG51bV9nZXQ8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTCBudW1fcHV0PGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgY3R5cGVfYnluYW1lPGNoYXI+OworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IGN0eXBlPGNoYXI+JgorICAgIHVzZV9mYWNldDxjdHlwZTxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG51bXB1bmN0PGNoYXI+JgorICAgIHVzZV9mYWNldDxudW1wdW5jdDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG51bV9wdXQ8Y2hhcj4mCisgICAgdXNlX2ZhY2V0PG51bV9wdXQ8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBudW1fZ2V0PGNoYXI+JgorICAgIHVzZV9mYWNldDxudW1fZ2V0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxjdHlwZTxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8bnVtcHVuY3Q8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG51bV9wdXQ8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG51bV9nZXQ8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBudW1wdW5jdDx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG51bXB1bmN0X2J5bmFtZTx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9HTElCQ1hYX05BTUVTUEFDRV9MREJMIG51bV9nZXQ8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTCBudW1fcHV0PHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgY3R5cGVfYnluYW1lPHdjaGFyX3Q+OworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IGN0eXBlPHdjaGFyX3Q+JgorICAgIHVzZV9mYWNldDxjdHlwZTx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG51bXB1bmN0PHdjaGFyX3Q+JgorICAgIHVzZV9mYWNldDxudW1wdW5jdDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG51bV9wdXQ8d2NoYXJfdD4mCisgICAgdXNlX2ZhY2V0PG51bV9wdXQ8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBudW1fZ2V0PHdjaGFyX3Q+JgorICAgIHVzZV9mYWNldDxudW1fZ2V0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PGN0eXBlPHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxudW1wdW5jdDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8bnVtX3B1dDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8bnVtX2dldDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVfZmFjZXRzX25vbmlvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbG9jYWxlX2ZhY2V0c19ub25pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjFkMmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbG9jYWxlX2ZhY2V0c19ub25pby5oCkBAIC0wLDAgKzEsMTkwNSBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvbG9jYWxlX2ZhY2V0c19ub25pby5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4xICBMb2NhbGVzCisvLworCisjaWZuZGVmIF9MT0NBTEVfRkFDRVRTX05PTklPX0gKKyNkZWZpbmUgX0xPQ0FMRV9GQUNFVFNfTk9OSU9fSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGN0aW1lPgkvLyBGb3Igc3RydWN0IHRtCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiAgVGltZSBmb3JtYXQgb3JkZXJpbmcgZGF0YS4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIFRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gZW51bSByZXByZXNlbnRpbmcgZGlmZmVyZW50IG9yZGVyaW5ncyBvZgorICAgKiAgdGltZTogZGF5LCBtb250aCwgYW5kIHllYXIuCisgICovCisgIGNsYXNzIHRpbWVfYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICBlbnVtIGRhdGVvcmRlciB7IG5vX29yZGVyLCBkbXksIG1keSwgeW1kLCB5ZG0gfTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgc3RydWN0IF9fdGltZXB1bmN0X2NhY2hlIDogcHVibGljIGxvY2FsZTo6ZmFjZXQKKyAgICB7CisgICAgICAvLyBMaXN0IG9mIGFsbCBrbm93biB0aW1lem9uZXMsIHdpdGggR01UIGZpcnN0LgorICAgICAgc3RhdGljIGNvbnN0IF9DaGFyVCoJCV9TX3RpbWV6b25lc1sxNF07CisKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9kYXRlX2Zvcm1hdDsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9kYXRlX2VyYV9mb3JtYXQ7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fdGltZV9mb3JtYXQ7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fdGltZV9lcmFfZm9ybWF0OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2RhdGVfdGltZV9mb3JtYXQ7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fZGF0ZV90aW1lX2VyYV9mb3JtYXQ7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW07CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fcG07CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW1fcG1fZm9ybWF0OworCisgICAgICAvLyBEYXkgbmFtZXMsIHN0YXJ0aW5nIHdpdGggIkMiJ3MgU3VuZGF5LgorICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2RheTE7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fZGF5MjsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9kYXkzOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2RheTQ7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fZGF5NTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9kYXk2OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2RheTc7CisKKyAgICAgIC8vIEFiYnJldmlhdGVkIGRheSBuYW1lcywgc3RhcnRpbmcgd2l0aCAiQyIncyBTdW4uCisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYWRheTE7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYWRheTI7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYWRheTM7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYWRheTQ7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYWRheTU7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYWRheTY7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYWRheTc7CisKKyAgICAgIC8vIE1vbnRoIG5hbWVzLCBzdGFydGluZyB3aXRoICJDIidzIEphbnVhcnkuCisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fbW9udGgwMTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9tb250aDAyOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX21vbnRoMDM7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fbW9udGgwNDsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9tb250aDA1OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX21vbnRoMDY7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fbW9udGgwNzsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9tb250aDA4OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX21vbnRoMDk7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fbW9udGgxMDsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9tb250aDExOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX21vbnRoMTI7CisKKyAgICAgIC8vIEFiYnJldmlhdGVkIG1vbnRoIG5hbWVzLCBzdGFydGluZyB3aXRoICJDIidzIEphbi4KKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbW9udGgwMTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbW9udGgwMjsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbW9udGgwMzsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbW9udGgwNDsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbW9udGgwNTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbW9udGgwNjsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbW9udGgwNzsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbW9udGgwODsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbW9udGgwOTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbW9udGgxMDsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbW9udGgxMTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbW9udGgxMjsKKworICAgICAgYm9vbAkJCQlfTV9hbGxvY2F0ZWQ7CisKKyAgICAgIF9fdGltZXB1bmN0X2NhY2hlKHNpemVfdCBfX3JlZnMgPSAwKSA6IGZhY2V0KF9fcmVmcyksCisgICAgICBfTV9kYXRlX2Zvcm1hdCgwKSwgX01fZGF0ZV9lcmFfZm9ybWF0KDApLCBfTV90aW1lX2Zvcm1hdCgwKSwKKyAgICAgIF9NX3RpbWVfZXJhX2Zvcm1hdCgwKSwgX01fZGF0ZV90aW1lX2Zvcm1hdCgwKSwKKyAgICAgIF9NX2RhdGVfdGltZV9lcmFfZm9ybWF0KDApLCBfTV9hbSgwKSwgX01fcG0oMCksCisgICAgICBfTV9hbV9wbV9mb3JtYXQoMCksIF9NX2RheTEoMCksIF9NX2RheTIoMCksIF9NX2RheTMoMCksCisgICAgICBfTV9kYXk0KDApLCBfTV9kYXk1KDApLCBfTV9kYXk2KDApLCBfTV9kYXk3KDApLAorICAgICAgX01fYWRheTEoMCksIF9NX2FkYXkyKDApLCBfTV9hZGF5MygwKSwgX01fYWRheTQoMCksCisgICAgICBfTV9hZGF5NSgwKSwgX01fYWRheTYoMCksIF9NX2FkYXk3KDApLCBfTV9tb250aDAxKDApLAorICAgICAgX01fbW9udGgwMigwKSwgX01fbW9udGgwMygwKSwgX01fbW9udGgwNCgwKSwgX01fbW9udGgwNSgwKSwKKyAgICAgIF9NX21vbnRoMDYoMCksIF9NX21vbnRoMDcoMCksIF9NX21vbnRoMDgoMCksIF9NX21vbnRoMDkoMCksCisgICAgICBfTV9tb250aDEwKDApLCBfTV9tb250aDExKDApLCBfTV9tb250aDEyKDApLCBfTV9hbW9udGgwMSgwKSwKKyAgICAgIF9NX2Ftb250aDAyKDApLCBfTV9hbW9udGgwMygwKSwgX01fYW1vbnRoMDQoMCksCisgICAgICBfTV9hbW9udGgwNSgwKSwgX01fYW1vbnRoMDYoMCksIF9NX2Ftb250aDA3KDApLAorICAgICAgX01fYW1vbnRoMDgoMCksIF9NX2Ftb250aDA5KDApLCBfTV9hbW9udGgxMCgwKSwKKyAgICAgIF9NX2Ftb250aDExKDApLCBfTV9hbW9udGgxMigwKSwgX01fYWxsb2NhdGVkKGZhbHNlKQorICAgICAgeyB9CisKKyAgICAgIH5fX3RpbWVwdW5jdF9jYWNoZSgpOworCisgICAgICB2b2lkCisgICAgICBfTV9jYWNoZShjb25zdCBsb2NhbGUmIF9fbG9jKTsKKworICAgIHByaXZhdGU6CisgICAgICBfX3RpbWVwdW5jdF9jYWNoZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX3RpbWVwdW5jdF9jYWNoZSYpOworICAgICAgCisgICAgICBleHBsaWNpdAorICAgICAgX190aW1lcHVuY3RfY2FjaGUoY29uc3QgX190aW1lcHVuY3RfY2FjaGUmKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfX3RpbWVwdW5jdF9jYWNoZTxfQ2hhclQ+Ojp+X190aW1lcHVuY3RfY2FjaGUoKQorICAgIHsKKyAgICAgIGlmIChfTV9hbGxvY2F0ZWQpCisJeworCSAgLy8gVW51c2VkLgorCX0KKyAgICB9CisKKyAgLy8gU3BlY2lhbGl6YXRpb25zLgorICB0ZW1wbGF0ZTw+CisgICAgY29uc3QgY2hhcioKKyAgICBfX3RpbWVwdW5jdF9jYWNoZTxjaGFyPjo6X1NfdGltZXpvbmVzWzE0XTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICBjb25zdCB3Y2hhcl90KgorICAgIF9fdGltZXB1bmN0X2NhY2hlPHdjaGFyX3Q+OjpfU190aW1lem9uZXNbMTRdOworI2VuZGlmCisKKyAgLy8gR2VuZXJpYy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNvbnN0IF9DaGFyVCogX190aW1lcHVuY3RfY2FjaGU8X0NoYXJUPjo6X1NfdGltZXpvbmVzWzE0XTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgX190aW1lcHVuY3QgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJX19jaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+CV9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIF9fdGltZXB1bmN0X2NhY2hlPF9DaGFyVD4JX19jYWNoZV90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgX19jYWNoZV90eXBlKgkJCV9NX2RhdGE7CisgICAgICBfX2NfbG9jYWxlCQkJX01fY19sb2NhbGVfdGltZXB1bmN0OworICAgICAgY29uc3QgY2hhcioJCQlfTV9uYW1lX3RpbWVwdW5jdDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBOdW1wdW5jdCBmYWNldCBpZC4KKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkCQkJaWQ7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX3RpbWVwdW5jdChzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX3RpbWVwdW5jdChfX2NhY2hlX3R5cGUqIF9fY2FjaGUsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnRlcm5hbCBjb25zdHJ1Y3Rvci4gTm90IGZvciBnZW5lcmFsIHVzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZvciB1c2UgYnkgdGhlIGxpYnJhcnkgaXRzZWxmIHRvIHNldCB1cCBuZXcKKyAgICAgICAqICBsb2NhbGVzLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jbG9jICBUaGUgQyBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIG5hbWUgb2YgYSBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtIHJlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgX190aW1lcHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MsIGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgICAvLyBGSVhNRTogZm9yIGVycm9yIGNoZWNraW5nIHB1cnBvc2VzIF9NX3B1dCBzaG91bGQgcmV0dXJuIHRoZSByZXR1cm4KKyAgICAgIC8vIHZhbHVlIG9mIHN0cmZ0aW1lL3djc2Z0aW1lLgorICAgICAgdm9pZAorICAgICAgX01fcHV0KF9DaGFyVCogX19zLCBzaXplX3QgX19tYXhsZW4sIGNvbnN0IF9DaGFyVCogX19mb3JtYXQsCisJICAgICBjb25zdCB0bSogX190bSkgY29uc3QgdGhyb3cgKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RhdGVfZm9ybWF0cyhjb25zdCBfQ2hhclQqKiBfX2RhdGUpIGNvbnN0CisgICAgICB7CisJLy8gQWx3YXlzIGhhdmUgZGVmYXVsdCBmaXJzdC4KKwlfX2RhdGVbMF0gPSBfTV9kYXRhLT5fTV9kYXRlX2Zvcm1hdDsKKwlfX2RhdGVbMV0gPSBfTV9kYXRhLT5fTV9kYXRlX2VyYV9mb3JtYXQ7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3RpbWVfZm9ybWF0cyhjb25zdCBfQ2hhclQqKiBfX3RpbWUpIGNvbnN0CisgICAgICB7CisJLy8gQWx3YXlzIGhhdmUgZGVmYXVsdCBmaXJzdC4KKwlfX3RpbWVbMF0gPSBfTV9kYXRhLT5fTV90aW1lX2Zvcm1hdDsKKwlfX3RpbWVbMV0gPSBfTV9kYXRhLT5fTV90aW1lX2VyYV9mb3JtYXQ7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RhdGVfdGltZV9mb3JtYXRzKGNvbnN0IF9DaGFyVCoqIF9fZHQpIGNvbnN0CisgICAgICB7CisJLy8gQWx3YXlzIGhhdmUgZGVmYXVsdCBmaXJzdC4KKwlfX2R0WzBdID0gX01fZGF0YS0+X01fZGF0ZV90aW1lX2Zvcm1hdDsKKwlfX2R0WzFdID0gX01fZGF0YS0+X01fZGF0ZV90aW1lX2VyYV9mb3JtYXQ7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2FtX3BtX2Zvcm1hdChjb25zdCBfQ2hhclQqIF9fYW1wbSkgY29uc3QKKyAgICAgIHsgX19hbXBtID0gX01fZGF0YS0+X01fYW1fcG1fZm9ybWF0OyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2FtX3BtKGNvbnN0IF9DaGFyVCoqIF9fYW1wbSkgY29uc3QKKyAgICAgIHsKKwlfX2FtcG1bMF0gPSBfTV9kYXRhLT5fTV9hbTsKKwlfX2FtcG1bMV0gPSBfTV9kYXRhLT5fTV9wbTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZGF5cyhjb25zdCBfQ2hhclQqKiBfX2RheXMpIGNvbnN0CisgICAgICB7CisJX19kYXlzWzBdID0gX01fZGF0YS0+X01fZGF5MTsKKwlfX2RheXNbMV0gPSBfTV9kYXRhLT5fTV9kYXkyOworCV9fZGF5c1syXSA9IF9NX2RhdGEtPl9NX2RheTM7CisJX19kYXlzWzNdID0gX01fZGF0YS0+X01fZGF5NDsKKwlfX2RheXNbNF0gPSBfTV9kYXRhLT5fTV9kYXk1OworCV9fZGF5c1s1XSA9IF9NX2RhdGEtPl9NX2RheTY7CisJX19kYXlzWzZdID0gX01fZGF0YS0+X01fZGF5NzsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZGF5c19hYmJyZXZpYXRlZChjb25zdCBfQ2hhclQqKiBfX2RheXMpIGNvbnN0CisgICAgICB7CisJX19kYXlzWzBdID0gX01fZGF0YS0+X01fYWRheTE7CisJX19kYXlzWzFdID0gX01fZGF0YS0+X01fYWRheTI7CisJX19kYXlzWzJdID0gX01fZGF0YS0+X01fYWRheTM7CisJX19kYXlzWzNdID0gX01fZGF0YS0+X01fYWRheTQ7CisJX19kYXlzWzRdID0gX01fZGF0YS0+X01fYWRheTU7CisJX19kYXlzWzVdID0gX01fZGF0YS0+X01fYWRheTY7CisJX19kYXlzWzZdID0gX01fZGF0YS0+X01fYWRheTc7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX21vbnRocyhjb25zdCBfQ2hhclQqKiBfX21vbnRocykgY29uc3QKKyAgICAgIHsKKwlfX21vbnRoc1swXSA9IF9NX2RhdGEtPl9NX21vbnRoMDE7CisJX19tb250aHNbMV0gPSBfTV9kYXRhLT5fTV9tb250aDAyOworCV9fbW9udGhzWzJdID0gX01fZGF0YS0+X01fbW9udGgwMzsKKwlfX21vbnRoc1szXSA9IF9NX2RhdGEtPl9NX21vbnRoMDQ7CisJX19tb250aHNbNF0gPSBfTV9kYXRhLT5fTV9tb250aDA1OworCV9fbW9udGhzWzVdID0gX01fZGF0YS0+X01fbW9udGgwNjsKKwlfX21vbnRoc1s2XSA9IF9NX2RhdGEtPl9NX21vbnRoMDc7CisJX19tb250aHNbN10gPSBfTV9kYXRhLT5fTV9tb250aDA4OworCV9fbW9udGhzWzhdID0gX01fZGF0YS0+X01fbW9udGgwOTsKKwlfX21vbnRoc1s5XSA9IF9NX2RhdGEtPl9NX21vbnRoMTA7CisJX19tb250aHNbMTBdID0gX01fZGF0YS0+X01fbW9udGgxMTsKKwlfX21vbnRoc1sxMV0gPSBfTV9kYXRhLT5fTV9tb250aDEyOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9tb250aHNfYWJicmV2aWF0ZWQoY29uc3QgX0NoYXJUKiogX19tb250aHMpIGNvbnN0CisgICAgICB7CisJX19tb250aHNbMF0gPSBfTV9kYXRhLT5fTV9hbW9udGgwMTsKKwlfX21vbnRoc1sxXSA9IF9NX2RhdGEtPl9NX2Ftb250aDAyOworCV9fbW9udGhzWzJdID0gX01fZGF0YS0+X01fYW1vbnRoMDM7CisJX19tb250aHNbM10gPSBfTV9kYXRhLT5fTV9hbW9udGgwNDsKKwlfX21vbnRoc1s0XSA9IF9NX2RhdGEtPl9NX2Ftb250aDA1OworCV9fbW9udGhzWzVdID0gX01fZGF0YS0+X01fYW1vbnRoMDY7CisJX19tb250aHNbNl0gPSBfTV9kYXRhLT5fTV9hbW9udGgwNzsKKwlfX21vbnRoc1s3XSA9IF9NX2RhdGEtPl9NX2Ftb250aDA4OworCV9fbW9udGhzWzhdID0gX01fZGF0YS0+X01fYW1vbnRoMDk7CisJX19tb250aHNbOV0gPSBfTV9kYXRhLT5fTV9hbW9udGgxMDsKKwlfX21vbnRoc1sxMF0gPSBfTV9kYXRhLT5fTV9hbW9udGgxMTsKKwlfX21vbnRoc1sxMV0gPSBfTV9kYXRhLT5fTV9hbW9udGgxMjsKKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5fX3RpbWVwdW5jdCgpOworCisgICAgICAvLyBGb3IgdXNlIGF0IGNvbnN0cnVjdGlvbiB0aW1lIG9ubHkuCisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplX3RpbWVwdW5jdChfX2NfbG9jYWxlIF9fY2xvYyA9IDApOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGxvY2FsZTo6aWQgX190aW1lcHVuY3Q8X0NoYXJUPjo6aWQ7CisKKyAgLy8gU3BlY2lhbGl6YXRpb25zLgorICB0ZW1wbGF0ZTw+CisgICAgdm9pZAorICAgIF9fdGltZXB1bmN0PGNoYXI+OjpfTV9pbml0aWFsaXplX3RpbWVwdW5jdChfX2NfbG9jYWxlIF9fY2xvYyk7CisKKyAgdGVtcGxhdGU8PgorICAgIHZvaWQKKyAgICBfX3RpbWVwdW5jdDxjaGFyPjo6X01fcHV0KGNoYXIqLCBzaXplX3QsIGNvbnN0IGNoYXIqLCBjb25zdCB0bSopIGNvbnN0IHRocm93ICgpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIHZvaWQKKyAgICBfX3RpbWVwdW5jdDx3Y2hhcl90Pjo6X01faW5pdGlhbGl6ZV90aW1lcHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MpOworCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgX190aW1lcHVuY3Q8d2NoYXJfdD46Ol9NX3B1dCh3Y2hhcl90Kiwgc2l6ZV90LCBjb25zdCB3Y2hhcl90KiwKKwkJCQkgY29uc3QgdG0qKSBjb25zdCB0aHJvdyAoKTsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyAgLy8gSW5jbHVkZSBob3N0IGFuZCBjb25maWd1cmF0aW9uIHNwZWNpZmljIHRpbWVwdW5jdCBmdW5jdGlvbnMuCisgICNpbmNsdWRlIDxiaXRzL3RpbWVfbWVtYmVycy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgdGltZV9nZXQuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIGZhY2V0IGVuY2Fwc3VsYXRlcyB0aGUgY29kZSB0byBwYXJzZSBhbmQgcmV0dXJuIGEgZGF0ZSBvcgorICAgKiAgdGltZSBmcm9tIGEgc3RyaW5nLiAgSXQgaXMgdXNlZCBieSB0aGUgaXN0cmVhbSBudW1lcmljCisgICAqICBleHRyYWN0aW9uIG9wZXJhdG9ycy4KKyAgICoKKyAgICogIFRoZSB0aW1lX2dldCB0ZW1wbGF0ZSB1c2VzIHByb3RlY3RlZCB2aXJ0dWFsIGZ1bmN0aW9ucyB0byBwcm92aWRlIHRoZQorICAgKiAgYWN0dWFsIHJlc3VsdHMuICBUaGUgcHVibGljIGFjY2Vzc29ycyBmb3J3YXJkIHRoZSBjYWxsIHRvIHRoZSB2aXJ0dWFsCisgICAqICBmdW5jdGlvbnMuICBUaGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgaG9va3MgZm9yIGRldmVsb3BlcnMgdG8KKyAgICogIGltcGxlbWVudCB0aGUgYmVoYXZpb3IgdGhleSByZXF1aXJlIGZyb20gdGhlIHRpbWVfZ2V0IGZhY2V0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgY2xhc3MgdGltZV9nZXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIHRpbWVfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfSW5JdGVyCQkJaXRlcl90eXBlOworICAgICAgLy9AfQorICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPglfX3N0cmluZ190eXBlOworCisgICAgICAvLy8gTnVtcHVuY3QgZmFjZXQgaWQuCisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJCWlkOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX3JlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgdGltZV9nZXQoc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IGZhY2V0IChfX3JlZnMpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBwcmVmZXJyZWQgb3JkZXIgb2YgbW9udGgsIGRheSwgYW5kIHllYXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlbnVtIGZyb20gdGltZWJhc2U6OmRhdGVvcmRlciBnaXZpbmcgdGhlCisgICAgICAgKiAgcHJlZmVycmVkIG9yZGVyaW5nIGlmIHRoZSBmb3JtYXQgQGEgeCBnaXZlbiB0byB0aW1lX3B1dDo6cHV0KCkgb25seQorICAgICAgICogIHVzZXMgbW9udGgsIGRheSwgYW5kIHllYXIuICBJZiB0aGUgZm9ybWF0IEBhIHggZm9yIHRoZSBhc3NvY2lhdGVkCisgICAgICAgKiAgbG9jYWxlIHVzZXMgb3RoZXIgZmllbGRzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgICAgICAqICB0aW1lYmFzZTo6ZGF0ZW9yZGVyOjpub29yZGVyLgorICAgICAgICoKKyAgICAgICAqICBOT1RFOiBUaGUgbGlicmFyeSBhbHdheXMgcmV0dXJucyBub29yZGVyIGF0IHRoZSBtb21lbnQuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEEgbWVtYmVyIG9mIHRpbWViYXNlOjpkYXRlb3JkZXIuCisgICAgICAqLworICAgICAgZGF0ZW9yZGVyCisgICAgICBkYXRlX29yZGVyKCkgIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19kYXRlX29yZGVyKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQYXJzZSBpbnB1dCB0aW1lIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgYSB0aW1lIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IEBhIFggYW5kIHB1dHMgdGhlCisgICAgICAgKiAgcmVzdWx0cyBpbnRvIGEgdXNlci1zdXBwbGllZCBzdHJ1Y3QgdG0uICBUaGUgcmVzdWx0IGlzIHJldHVybmVkIGJ5CisgICAgICAgKiAgY2FsbGluZyB0aW1lX2dldDo6ZG9fZ2V0X3RpbWUoKS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlcmUgaXMgYSB2YWxpZCB0aW1lIHN0cmluZyBhY2NvcmRpbmcgdG8gZm9ybWF0IEBhIFgsIEBhIHRtIHdpbGwKKyAgICAgICAqICBiZSBmaWxsZWQgaW4gYWNjb3JkaW5nbHkgYW5kIHRoZSByZXR1cm5lZCBpdGVyYXRvciB3aWxsIHBvaW50IHRvIHRoZQorICAgICAgICogIGZpcnN0IGNoYXJhY3RlciBiZXlvbmQgdGhlIHRpbWUgc3RyaW5nLiAgSWYgYW4gZXJyb3Igb2NjdXJzIGJlZm9yZQorICAgICAgICogIHRoZSBlbmQsIGVyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdC4gIElmIHBhcnNpbmcgcmVhZHMgYWxsIHRoZQorICAgICAgICogIGNoYXJhY3RlcnMsIGVyciB8PSBpb3NfYmFzZTo6ZW9mYml0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fYmVnICBTdGFydCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2VuZCAgRW5kIG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiB0aGUgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgX19lcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fdG0gIFBvaW50ZXIgdG8gc3RydWN0IHRtIHRvIGZpbGwgaW4uCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgdG8gZmlyc3QgY2hhciBiZXlvbmQgdGltZSBzdHJpbmcuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBnZXRfdGltZShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pICBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0X3RpbWUoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX190bSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQYXJzZSBpbnB1dCBkYXRlIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgYSBkYXRlIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IEBhIHggYW5kIHB1dHMgdGhlCisgICAgICAgKiAgcmVzdWx0cyBpbnRvIGEgdXNlci1zdXBwbGllZCBzdHJ1Y3QgdG0uICBUaGUgcmVzdWx0IGlzIHJldHVybmVkIGJ5CisgICAgICAgKiAgY2FsbGluZyB0aW1lX2dldDo6ZG9fZ2V0X2RhdGUoKS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlcmUgaXMgYSB2YWxpZCBkYXRlIHN0cmluZyBhY2NvcmRpbmcgdG8gZm9ybWF0IEBhIHgsIEBhIHRtIHdpbGwKKyAgICAgICAqICBiZSBmaWxsZWQgaW4gYWNjb3JkaW5nbHkgYW5kIHRoZSByZXR1cm5lZCBpdGVyYXRvciB3aWxsIHBvaW50IHRvIHRoZQorICAgICAgICogIGZpcnN0IGNoYXJhY3RlciBiZXlvbmQgdGhlIGRhdGUgc3RyaW5nLiAgSWYgYW4gZXJyb3Igb2NjdXJzIGJlZm9yZQorICAgICAgICogIHRoZSBlbmQsIGVyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdC4gIElmIHBhcnNpbmcgcmVhZHMgYWxsIHRoZQorICAgICAgICogIGNoYXJhY3RlcnMsIGVyciB8PSBpb3NfYmFzZTo6ZW9mYml0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fYmVnICBTdGFydCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2VuZCAgRW5kIG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiB0aGUgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgX19lcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fdG0gIFBvaW50ZXIgdG8gc3RydWN0IHRtIHRvIGZpbGwgaW4uCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgdG8gZmlyc3QgY2hhciBiZXlvbmQgZGF0ZSBzdHJpbmcuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBnZXRfZGF0ZShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pICBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0X2RhdGUoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX190bSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQYXJzZSBpbnB1dCB3ZWVrZGF5IHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgYSB3ZWVrZGF5IG5hbWUgYW5kIHB1dHMgdGhlIHJlc3VsdHMgaW50byBhCisgICAgICAgKiAgdXNlci1zdXBwbGllZCBzdHJ1Y3QgdG0uICBUaGUgcmVzdWx0IGlzIHJldHVybmVkIGJ5IGNhbGxpbmcKKyAgICAgICAqICB0aW1lX2dldDo6ZG9fZ2V0X3dlZWtkYXkoKS4KKyAgICAgICAqCisgICAgICAgKiAgUGFyc2luZyBzdGFydHMgYnkgcGFyc2luZyBhbiBhYmJyZXZpYXRlZCB3ZWVrZGF5IG5hbWUuICBJZiBhIHZhbGlkCisgICAgICAgKiAgYWJicmV2aWF0aW9uIGlzIGZvbGxvd2VkIGJ5IGEgY2hhcmFjdGVyIHRoYXQgd291bGQgbGVhZCB0byB0aGUgZnVsbAorICAgICAgICogIHdlZWtkYXkgbmFtZSwgcGFyc2luZyBjb250aW51ZXMgdW50aWwgdGhlIGZ1bGwgbmFtZSBpcyBmb3VuZCBvciBhbgorICAgICAgICogIGVycm9yIG9jY3Vycy4gIE90aGVyd2lzZSBwYXJzaW5nIGZpbmlzaGVzIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICAgKiAgYWJicmV2aWF0ZWQgbmFtZS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYW4gZXJyb3Igb2NjdXJzIGJlZm9yZSB0aGUgZW5kLCBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQuICBJZgorICAgICAgICogIHBhcnNpbmcgcmVhZHMgYWxsIHRoZSBjaGFyYWN0ZXJzLCBlcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2JlZyAgU3RhcnQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgdGhlIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3RtICBQb2ludGVyIHRvIHN0cnVjdCB0bSB0byBmaWxsIGluLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHRvIGZpcnN0IGNoYXIgYmV5b25kIHdlZWtkYXkgbmFtZS4KKyAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldF93ZWVrZGF5KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0X3dlZWtkYXkoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX190bSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQYXJzZSBpbnB1dCBtb250aCBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgbW9udGggbmFtZSBhbmQgcHV0cyB0aGUgcmVzdWx0cyBpbnRvIGEKKyAgICAgICAqICB1c2VyLXN1cHBsaWVkIHN0cnVjdCB0bS4gIFRoZSByZXN1bHQgaXMgcmV0dXJuZWQgYnkgY2FsbGluZworICAgICAgICogIHRpbWVfZ2V0Ojpkb19nZXRfbW9udGhuYW1lKCkuCisgICAgICAgKgorICAgICAgICogIFBhcnNpbmcgc3RhcnRzIGJ5IHBhcnNpbmcgYW4gYWJicmV2aWF0ZWQgbW9udGggbmFtZS4gIElmIGEgdmFsaWQKKyAgICAgICAqICBhYmJyZXZpYXRpb24gaXMgZm9sbG93ZWQgYnkgYSBjaGFyYWN0ZXIgdGhhdCB3b3VsZCBsZWFkIHRvIHRoZSBmdWxsCisgICAgICAgKiAgbW9udGggbmFtZSwgcGFyc2luZyBjb250aW51ZXMgdW50aWwgdGhlIGZ1bGwgbmFtZSBpcyBmb3VuZCBvciBhbgorICAgICAgICogIGVycm9yIG9jY3Vycy4gIE90aGVyd2lzZSBwYXJzaW5nIGZpbmlzaGVzIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICAgKiAgYWJicmV2aWF0ZWQgbmFtZS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYW4gZXJyb3Igb2NjdXJzIGJlZm9yZSB0aGUgZW5kLCBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQuICBJZgorICAgICAgICogIHBhcnNpbmcgcmVhZHMgYWxsIHRoZSBjaGFyYWN0ZXJzLCBlcnIgfD0KKyAgICAgICAqICBpb3NfYmFzZTo6ZW9mYml0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fYmVnICBTdGFydCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2VuZCAgRW5kIG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiB0aGUgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgX19lcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fdG0gIFBvaW50ZXIgdG8gc3RydWN0IHRtIHRvIGZpbGwgaW4uCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgdG8gZmlyc3QgY2hhciBiZXlvbmQgbW9udGggbmFtZS4KKyAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldF9tb250aG5hbWUoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCQkgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldF9tb250aG5hbWUoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX190bSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQYXJzZSBpbnB1dCB5ZWFyIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZWFkcyB1cCB0byA0IGNoYXJhY3RlcnMgdG8gcGFyc2UgYSB5ZWFyIHN0cmluZyBhbmQKKyAgICAgICAqICBwdXRzIHRoZSByZXN1bHRzIGludG8gYSB1c2VyLXN1cHBsaWVkIHN0cnVjdCB0bS4gIFRoZSByZXN1bHQgaXMKKyAgICAgICAqICByZXR1cm5lZCBieSBjYWxsaW5nIHRpbWVfZ2V0Ojpkb19nZXRfeWVhcigpLgorICAgICAgICoKKyAgICAgICAqICA0IGNvbnNlY3V0aXZlIGRpZ2l0cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYSBmdWxsIHllYXIuICBJZiB0aGVyZSBhcmUKKyAgICAgICAqICBleGFjdGx5IDIgY29uc2VjdXRpdmUgZGlnaXRzLCB0aGUgbGlicmFyeSBpbnRlcnByZXRzIHRoaXMgYXMgdGhlCisgICAgICAgKiAgbnVtYmVyIG9mIHllYXJzIHNpbmNlIDE5MDAuCisgICAgICAgKgorICAgICAgICogIElmIGFuIGVycm9yIG9jY3VycyBiZWZvcmUgdGhlIGVuZCwgZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0LiAgSWYKKyAgICAgICAqICBwYXJzaW5nIHJlYWRzIGFsbCB0aGUgY2hhcmFjdGVycywgZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19iZWcgIFN0YXJ0IG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIHRoZSBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBfX2VyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgX190bSAgUG9pbnRlciB0byBzdHJ1Y3QgdG0gdG8gZmlsbCBpbi4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciB0byBmaXJzdCBjaGFyIGJleW9uZCB5ZWFyLgorICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0X3llYXIoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0X3llYXIoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX190bSk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBEZXN0cnVjdG9yLgorICAgICAgdmlydHVhbAorICAgICAgfnRpbWVfZ2V0KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIHByZWZlcnJlZCBvcmRlciBvZiBtb250aCwgZGF5LCBhbmQgeWVhci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVudW0gZnJvbSB0aW1lYmFzZTo6ZGF0ZW9yZGVyIGdpdmluZyB0aGUKKyAgICAgICAqICBwcmVmZXJyZWQgb3JkZXJpbmcgaWYgdGhlIGZvcm1hdCBAYSB4IGdpdmVuIHRvIHRpbWVfcHV0OjpwdXQoKSBvbmx5CisgICAgICAgKiAgdXNlcyBtb250aCwgZGF5LCBhbmQgeWVhci4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkCisgICAgICAgKiAgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBBIG1lbWJlciBvZiB0aW1lYmFzZTo6ZGF0ZW9yZGVyLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgZGF0ZW9yZGVyCisgICAgICBkb19kYXRlX29yZGVyKCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUGFyc2UgaW5wdXQgdGltZSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgdGltZSBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBAYSB4IGFuZCBwdXRzIHRoZQorICAgICAgICogIHJlc3VsdHMgaW50byBhIHVzZXItc3VwcGxpZWQgc3RydWN0IHRtLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yCisgICAgICAgKiAgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuICBAc2VlIGdldF90aW1lKCkgZm9yCisgICAgICAgKiAgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2JlZyAgU3RhcnQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgdGhlIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3RtICBQb2ludGVyIHRvIHN0cnVjdCB0bSB0byBmaWxsIGluLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHRvIGZpcnN0IGNoYXIgYmV5b25kIHRpbWUgc3RyaW5nLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXRfdGltZShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUGFyc2UgaW5wdXQgZGF0ZSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgZGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBAYSBYIGFuZCBwdXRzIHRoZQorICAgICAgICogIHJlc3VsdHMgaW50byBhIHVzZXItc3VwcGxpZWQgc3RydWN0IHRtLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yCisgICAgICAgKiAgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuICBAc2VlIGdldF9kYXRlKCkgZm9yCisgICAgICAgKiAgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2JlZyAgU3RhcnQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgdGhlIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3RtICBQb2ludGVyIHRvIHN0cnVjdCB0bSB0byBmaWxsIGluLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHRvIGZpcnN0IGNoYXIgYmV5b25kIGRhdGUgc3RyaW5nLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXRfZGF0ZShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUGFyc2UgaW5wdXQgd2Vla2RheSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgd2Vla2RheSBuYW1lIGFuZCBwdXRzIHRoZSByZXN1bHRzIGludG8gYQorICAgICAgICogIHVzZXItc3VwcGxpZWQgc3RydWN0IHRtLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQKKyAgICAgICAqICBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuICBAc2VlIGdldF93ZWVrZGF5KCkgZm9yCisgICAgICAgKiAgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2JlZyAgU3RhcnQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgdGhlIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3RtICBQb2ludGVyIHRvIHN0cnVjdCB0bSB0byBmaWxsIGluLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHRvIGZpcnN0IGNoYXIgYmV5b25kIHdlZWtkYXkgbmFtZS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0X3dlZWtkYXkoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiwKKwkJICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQYXJzZSBpbnB1dCBtb250aCBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgbW9udGggbmFtZSBhbmQgcHV0cyB0aGUgcmVzdWx0cyBpbnRvIGEKKyAgICAgICAqICB1c2VyLXN1cHBsaWVkIHN0cnVjdCB0bS4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkCisgICAgICAgKiAgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLiAgQHNlZSBnZXRfbW9udGhuYW1lKCkgZm9yCisgICAgICAgKiAgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2JlZyAgU3RhcnQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgdGhlIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3RtICBQb2ludGVyIHRvIHN0cnVjdCB0bSB0byBmaWxsIGluLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHRvIGZpcnN0IGNoYXIgYmV5b25kIG1vbnRoIG5hbWUuCisgICAgICAqLworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldF9tb250aG5hbWUoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiwKKwkJICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFBhcnNlIGlucHV0IHllYXIgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHVwIHRvIDQgY2hhcmFjdGVycyB0byBwYXJzZSBhIHllYXIgc3RyaW5nIGFuZAorICAgICAgICogIHB1dHMgdGhlIHJlc3VsdHMgaW50byBhIHVzZXItc3VwcGxpZWQgc3RydWN0IHRtLiAgVGhpcyBmdW5jdGlvbiBpcyBhCisgICAgICAgKiAgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuICBAc2VlCisgICAgICAgKiAgZ2V0X3llYXIoKSBmb3IgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2JlZyAgU3RhcnQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgdGhlIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3RtICBQb2ludGVyIHRvIHN0cnVjdCB0bSB0byBmaWxsIGluLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHRvIGZpcnN0IGNoYXIgYmV5b25kIHllYXIuCisgICAgICAqLworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldF95ZWFyKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdDsKKworICAgICAgLy8gRXh0cmFjdCBudW1lcmljIGNvbXBvbmVudCBvZiBsZW5ndGggX19sZW4uCisgICAgICBpdGVyX3R5cGUKKyAgICAgIF9NX2V4dHJhY3RfbnVtKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpbnQmIF9fbWVtYmVyLAorCQkgICAgIGludCBfX21pbiwgaW50IF9fbWF4LCBzaXplX3QgX19sZW4sCisJCSAgICAgaW9zX2Jhc2UmIF9faW8sIGlvc19iYXNlOjppb3N0YXRlJiBfX2VycikgY29uc3Q7CisKKyAgICAgIC8vIEV4dHJhY3QgYW55IHVuaXF1ZSBhcnJheSBvZiBzdHJpbmcgbGl0ZXJhbHMgaW4gYSBjb25zdCBfQ2hhclQqIGFycmF5LgorICAgICAgaXRlcl90eXBlCisgICAgICBfTV9leHRyYWN0X25hbWUoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGludCYgX19tZW1iZXIsCisJCSAgICAgIGNvbnN0IF9DaGFyVCoqIF9fbmFtZXMsIHNpemVfdCBfX2luZGV4bGVuLAorCQkgICAgICBpb3NfYmFzZSYgX19pbywgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyKSBjb25zdDsKKworICAgICAgLy8gRXh0cmFjdCBkYXkgb3IgbW9udGggbmFtZSBpbiBhIGNvbnN0IF9DaGFyVCogYXJyYXkuCisgICAgICBpdGVyX3R5cGUKKyAgICAgIF9NX2V4dHJhY3Rfd2RheV9vcl9tb250aChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW50JiBfX21lbWJlciwKKwkJCSAgICAgICBjb25zdCBfQ2hhclQqKiBfX25hbWVzLCBzaXplX3QgX19pbmRleGxlbiwKKwkJCSAgICAgICBpb3NfYmFzZSYgX19pbywgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyKSBjb25zdDsKKworICAgICAgLy8gRXh0cmFjdCBvbiBhIGNvbXBvbmVudC1ieS1jb21wb25lbnQgYmFzaXMsIHZpYSBfX2Zvcm1hdCBhcmd1bWVudC4KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgX01fZXh0cmFjdF92aWFfZm9ybWF0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkJCSAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtLAorCQkJICAgIGNvbnN0IF9DaGFyVCogX19mb3JtYXQpIGNvbnN0OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIGxvY2FsZTo6aWQgdGltZV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6aWQ7CisKKyAgLy8vIGNsYXNzIHRpbWVfZ2V0X2J5bmFtZSBbMjIuMi41LjJdLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgY2xhc3MgdGltZV9nZXRfYnluYW1lIDogcHVibGljIHRpbWVfZ2V0PF9DaGFyVCwgX0luSXRlcj4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0luSXRlcgkJCWl0ZXJfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHRpbWVfZ2V0X2J5bmFtZShjb25zdCBjaGFyKiwgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IHRpbWVfZ2V0PF9DaGFyVCwgX0luSXRlcj4oX19yZWZzKSB7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH50aW1lX2dldF9ieW5hbWUoKSB7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIHRpbWVfcHV0LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBmYWNldCBlbmNhcHN1bGF0ZXMgdGhlIGNvZGUgdG8gZm9ybWF0IGFuZCBvdXRwdXQgZGF0ZXMgYW5kIHRpbWVzCisgICAqICBhY2NvcmRpbmcgdG8gZm9ybWF0cyB1c2VkIGJ5IHN0cmZ0aW1lKCkuCisgICAqCisgICAqICBUaGUgdGltZV9wdXQgdGVtcGxhdGUgdXNlcyBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMgdG8gcHJvdmlkZSB0aGUKKyAgICogIGFjdHVhbCByZXN1bHRzLiAgVGhlIHB1YmxpYyBhY2Nlc3NvcnMgZm9yd2FyZCB0aGUgY2FsbCB0byB0aGUgdmlydHVhbAorICAgKiAgZnVuY3Rpb25zLiAgVGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGhvb2tzIGZvciBkZXZlbG9wZXJzIHRvCisgICAqICBpbXBsZW1lbnQgdGhlIGJlaGF2aW9yIHRoZXkgcmVxdWlyZSBmcm9tIHRoZSB0aW1lX3B1dCBmYWNldC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBjbGFzcyB0aW1lX3B1dCA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcworICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9PdXRJdGVyCQkJaXRlcl90eXBlOworICAgICAgLy9AfQorCisgICAgICAvLy8gTnVtcHVuY3QgZmFjZXQgaWQuCisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJCWlkOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX3JlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgdGltZV9wdXQoc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IGZhY2V0KF9fcmVmcykgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRm9ybWF0IGFuZCBvdXRwdXQgYSB0aW1lIG9yIGRhdGUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZm9ybWF0cyB0aGUgZGF0YSBpbiBzdHJ1Y3QgdG0gYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICogIHByb3ZpZGVkIGZvcm1hdCBzdHJpbmcuICBUaGUgZm9ybWF0IHN0cmluZyBpcyBpbnRlcnByZXRlZCBhcyBieQorICAgICAgICogIHN0cmZ0aW1lKCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlsbCAgY2hhcl90eXBlIHRvIHVzZSBmb3IgcGFkZGluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fdG0gIFN0cnVjdCB0bSB3aXRoIGRhdGUgYW5kIHRpbWUgaW5mbyB0byBmb3JtYXQuCisgICAgICAgKiAgQHBhcmFtICBfX2JlZyAgU3RhcnQgb2YgZm9ybWF0IHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2YgZm9ybWF0IHN0cmluZy4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciB3cml0aW5nLgorICAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwgY29uc3QgdG0qIF9fdG0sCisJICBjb25zdCBfQ2hhclQqIF9fYmVnLCBjb25zdCBfQ2hhclQqIF9fZW5kKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGb3JtYXQgYW5kIG91dHB1dCBhIHRpbWUgb3IgZGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmb3JtYXRzIHRoZSBkYXRhIGluIHN0cnVjdCB0bSBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgKiAgcHJvdmlkZWQgZm9ybWF0IGNoYXIgYW5kIG9wdGlvbmFsIG1vZGlmaWVyLiAgVGhlIGZvcm1hdCBhbmQgbW9kaWZpZXIKKyAgICAgICAqICBhcmUgaW50ZXJwcmV0ZWQgYXMgYnkgc3RyZnRpbWUoKS4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nCisgICAgICAgKiAgdGltZV9wdXQ6OmRvX3B1dCgpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIHN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpbGwgIGNoYXJfdHlwZSB0byB1c2UgZm9yIHBhZGRpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3RtICBTdHJ1Y3QgdG0gd2l0aCBkYXRlIGFuZCB0aW1lIGluZm8gdG8gZm9ybWF0LgorICAgICAgICogIEBwYXJhbSAgX19mb3JtYXQgIEZvcm1hdCBjaGFyLgorICAgICAgICogIEBwYXJhbSAgX19tb2QgIE9wdGlvbmFsIG1vZGlmaWVyIGNoYXIuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICBjb25zdCB0bSogX190bSwgY2hhciBfX2Zvcm1hdCwgY2hhciBfX21vZCA9IDApIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19wdXQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fdG0sIF9fZm9ybWF0LCBfX21vZCk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBEZXN0cnVjdG9yLgorICAgICAgdmlydHVhbAorICAgICAgfnRpbWVfcHV0KCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZvcm1hdCBhbmQgb3V0cHV0IGEgdGltZSBvciBkYXRlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZvcm1hdHMgdGhlIGRhdGEgaW4gc3RydWN0IHRtIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAqICBwcm92aWRlZCBmb3JtYXQgY2hhciBhbmQgb3B0aW9uYWwgbW9kaWZpZXIuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vaworICAgICAgICogIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgcHV0KCkgZm9yCisgICAgICAgKiAgbW9yZSBkZXRhaWxzLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIHN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpbGwgIGNoYXJfdHlwZSB0byB1c2UgZm9yIHBhZGRpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3RtICBTdHJ1Y3QgdG0gd2l0aCBkYXRlIGFuZCB0aW1lIGluZm8gdG8gZm9ybWF0LgorICAgICAgICogIEBwYXJhbSAgX19mb3JtYXQgIEZvcm1hdCBjaGFyLgorICAgICAgICogIEBwYXJhbSAgX19tb2QgIE9wdGlvbmFsIG1vZGlmaWVyIGNoYXIuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgICAqLworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwgY29uc3QgdG0qIF9fdG0sCisJICAgICBjaGFyIF9fZm9ybWF0LCBjaGFyIF9fbW9kKSBjb25zdDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgbG9jYWxlOjppZCB0aW1lX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6aWQ7CisKKyAgLy8vIGNsYXNzIHRpbWVfcHV0X2J5bmFtZSBbMjIuMi41LjRdLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIGNsYXNzIHRpbWVfcHV0X2J5bmFtZSA6IHB1YmxpYyB0aW1lX3B1dDxfQ2hhclQsIF9PdXRJdGVyPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfT3V0SXRlcgkJCWl0ZXJfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHRpbWVfcHV0X2J5bmFtZShjb25zdCBjaGFyKiwgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IHRpbWVfcHV0PF9DaGFyVCwgX091dEl0ZXI+KF9fcmVmcykKKyAgICAgIHsgfTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH50aW1lX3B1dF9ieW5hbWUoKSB7IH0KKyAgICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1vbmV5IGZvcm1hdCBvcmRlcmluZyBkYXRhLgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBjbGFzcyBjb250YWlucyBhbiBvcmRlcmVkIGFycmF5IG9mIDQgZmllbGRzIHRvIHJlcHJlc2VudCB0aGUKKyAgICogIHBhdHRlcm4gZm9yIGZvcm1hdHRpbmcgYSBtb25leSBhbW91bnQuICBFYWNoIGZpZWxkIG1heSBjb250YWluIG9uZSBlbnRyeQorICAgKiAgZnJvbSB0aGUgcGFydCBlbnVtLiAgc3ltYm9sLCBzaWduLCBhbmQgdmFsdWUgbXVzdCBiZSBwcmVzZW50IGFuZCB0aGUKKyAgICogIHJlbWFpbmluZyBmaWVsZCBtdXN0IGNvbnRhaW4gZWl0aGVyIG5vbmUgb3Igc3BhY2UuICBAc2VlCisgICAqICBtb25leXB1bmN0Ojpwb3NfZm9ybWF0KCkgYW5kIG1vbmV5cHVuY3Q6Om5lZ19mb3JtYXQoKSBmb3IgZGV0YWlscyBvZiBob3cKKyAgICogIHRoZXNlIGZpZWxkcyBhcmUgaW50ZXJwcmV0ZWQuCisgICovCisgIGNsYXNzIG1vbmV5X2Jhc2UKKyAgeworICBwdWJsaWM6CisgICAgZW51bSBwYXJ0IHsgbm9uZSwgc3BhY2UsIHN5bWJvbCwgc2lnbiwgdmFsdWUgfTsKKyAgICBzdHJ1Y3QgcGF0dGVybiB7IGNoYXIgZmllbGRbNF07IH07CisKKyAgICBzdGF0aWMgY29uc3QgcGF0dGVybiBfU19kZWZhdWx0X3BhdHRlcm47CisKKyAgICBlbnVtCisgICAgeworICAgICAgX1NfbWludXMsCisgICAgICBfU196ZXJvLAorICAgICAgX1NfZW5kID0gMTEKKyAgICB9OworCisgICAgLy8gU3RyaW5nIGxpdGVyYWwgb2YgYWNjZXB0YWJsZSAobmFycm93KSBpbnB1dC9vdXRwdXQsIGZvcgorICAgIC8vIG1vbmV5X2dldC9tb25leV9wdXQuICItMDEyMzQ1Njc4OSIKKyAgICBzdGF0aWMgY29uc3QgY2hhciogX1NfYXRvbXM7CisKKyAgICAvLyBDb25zdHJ1Y3QgYW5kIHJldHVybiB2YWxpZCBwYXR0ZXJuIGNvbnNpc3Rpbmcgb2Ygc29tZSBjb21iaW5hdGlvbiBvZjoKKyAgICAvLyBzcGFjZSBub25lIHN5bWJvbCBzaWduIHZhbHVlCisgICAgX0dMSUJDWFhfQ09OU1Qgc3RhdGljIHBhdHRlcm4KKyAgICBfU19jb25zdHJ1Y3RfcGF0dGVybihjaGFyIF9fcHJlY2VkZXMsIGNoYXIgX19zcGFjZSwgY2hhciBfX3Bvc24pIHRocm93ICgpOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgYm9vbCBfSW50bD4KKyAgICBzdHJ1Y3QgX19tb25leXB1bmN0X2NhY2hlIDogcHVibGljIGxvY2FsZTo6ZmFjZXQKKyAgICB7CisgICAgICBjb25zdCBjaGFyKgkJCV9NX2dyb3VwaW5nOworICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2dyb3VwaW5nX3NpemU7CisgICAgICBib29sCQkJCV9NX3VzZV9ncm91cGluZzsKKyAgICAgIF9DaGFyVAkJCQlfTV9kZWNpbWFsX3BvaW50OworICAgICAgX0NoYXJUCQkJCV9NX3Rob3VzYW5kc19zZXA7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fY3Vycl9zeW1ib2w7CisgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fY3Vycl9zeW1ib2xfc2l6ZTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9wb3NpdGl2ZV9zaWduOworICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3Bvc2l0aXZlX3NpZ25fc2l6ZTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9uZWdhdGl2ZV9zaWduOworICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX25lZ2F0aXZlX3NpZ25fc2l6ZTsKKyAgICAgIGludAkJCQlfTV9mcmFjX2RpZ2l0czsKKyAgICAgIG1vbmV5X2Jhc2U6OnBhdHRlcm4JCV9NX3Bvc19mb3JtYXQ7CisgICAgICBtb25leV9iYXNlOjpwYXR0ZXJuCSAgICAgICAgX01fbmVnX2Zvcm1hdDsKKworICAgICAgLy8gQSBsaXN0IG9mIHZhbGlkIG51bWVyaWMgbGl0ZXJhbHMgZm9yIGlucHV0IGFuZCBvdXRwdXQ6IGluIHRoZSBzdGFuZGFyZAorICAgICAgLy8gIkMiIGxvY2FsZSwgdGhpcyBpcyAiLTAxMjM0NTY3ODkiLiBUaGlzIGFycmF5IGNvbnRhaW5zIHRoZSBjaGFycyBhZnRlcgorICAgICAgLy8gaGF2aW5nIGJlZW4gcGFzc2VkIHRocm91Z2ggdGhlIGN1cnJlbnQgbG9jYWxlJ3MgY3R5cGU8X0NoYXJUPi53aWRlbigpLgorICAgICAgX0NoYXJUCQkJCV9NX2F0b21zW21vbmV5X2Jhc2U6Ol9TX2VuZF07CisKKyAgICAgIGJvb2wJCQkJX01fYWxsb2NhdGVkOworCisgICAgICBfX21vbmV5cHVuY3RfY2FjaGUoc2l6ZV90IF9fcmVmcyA9IDApIDogZmFjZXQoX19yZWZzKSwKKyAgICAgIF9NX2dyb3VwaW5nKDApLCBfTV9ncm91cGluZ19zaXplKDApLCBfTV91c2VfZ3JvdXBpbmcoZmFsc2UpLAorICAgICAgX01fZGVjaW1hbF9wb2ludChfQ2hhclQoKSksIF9NX3Rob3VzYW5kc19zZXAoX0NoYXJUKCkpLAorICAgICAgX01fY3Vycl9zeW1ib2woMCksIF9NX2N1cnJfc3ltYm9sX3NpemUoMCksCisgICAgICBfTV9wb3NpdGl2ZV9zaWduKDApLCBfTV9wb3NpdGl2ZV9zaWduX3NpemUoMCksCisgICAgICBfTV9uZWdhdGl2ZV9zaWduKDApLCBfTV9uZWdhdGl2ZV9zaWduX3NpemUoMCksCisgICAgICBfTV9mcmFjX2RpZ2l0cygwKSwKKyAgICAgIF9NX3Bvc19mb3JtYXQobW9uZXlfYmFzZTo6cGF0dGVybigpKSwKKyAgICAgIF9NX25lZ19mb3JtYXQobW9uZXlfYmFzZTo6cGF0dGVybigpKSwgX01fYWxsb2NhdGVkKGZhbHNlKQorICAgICAgeyB9CisKKyAgICAgIH5fX21vbmV5cHVuY3RfY2FjaGUoKTsKKworICAgICAgdm9pZAorICAgICAgX01fY2FjaGUoY29uc3QgbG9jYWxlJiBfX2xvYyk7CisKKyAgICBwcml2YXRlOgorICAgICAgX19tb25leXB1bmN0X2NhY2hlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9fbW9uZXlwdW5jdF9jYWNoZSYpOworICAgICAgCisgICAgICBleHBsaWNpdAorICAgICAgX19tb25leXB1bmN0X2NhY2hlKGNvbnN0IF9fbW9uZXlwdW5jdF9jYWNoZSYpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsPgorICAgIF9fbW9uZXlwdW5jdF9jYWNoZTxfQ2hhclQsIF9JbnRsPjo6fl9fbW9uZXlwdW5jdF9jYWNoZSgpCisgICAgeworICAgICAgaWYgKF9NX2FsbG9jYXRlZCkKKwl7CisJICBkZWxldGUgW10gX01fZ3JvdXBpbmc7CisJICBkZWxldGUgW10gX01fY3Vycl9zeW1ib2w7CisJICBkZWxldGUgW10gX01fcG9zaXRpdmVfc2lnbjsKKwkgIGRlbGV0ZSBbXSBfTV9uZWdhdGl2ZV9zaWduOworCX0KKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgbW9uZXlwdW5jdC4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIFRoaXMgZmFjZXQgZW5jYXBzdWxhdGVzIHRoZSBwdW5jdHVhdGlvbiwgZ3JvdXBpbmcgYW5kIG90aGVyIGZvcm1hdHRpbmcKKyAgICogIGZlYXR1cmVzIG9mIG1vbmV5IGFtb3VudCBzdHJpbmcgcmVwcmVzZW50YXRpb25zLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIGJvb2wgX0ludGw+CisgICAgY2xhc3MgbW9uZXlwdW5jdCA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgbW9uZXlfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPglzdHJpbmdfdHlwZTsKKyAgICAgIC8vQH0KKyAgICAgIHR5cGVkZWYgX19tb25leXB1bmN0X2NhY2hlPF9DaGFyVCwgX0ludGw+ICAgICBfX2NhY2hlX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgX19jYWNoZV90eXBlKgkJCV9NX2RhdGE7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gVGhpcyB2YWx1ZSBpcyBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQsIGJ1dCBubyByZWFzb24gZm9yIGl0cworICAgICAgLy8vIGV4aXN0ZW5jZS4KKyAgICAgIHN0YXRpYyBjb25zdCBib29sCQkJaW50bCA9IF9JbnRsOworICAgICAgLy8vIE51bXB1bmN0IGZhY2V0IGlkLgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19yZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG1vbmV5cHVuY3Qoc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2RhdGEoMCkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9tb25leXB1bmN0KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBjb25zdHJ1Y3Rvci4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fY2FjaGUgIENhY2hlIGZvciBvcHRpbWl6YXRpb24uCisgICAgICAgKiAgQHBhcmFtIF9fcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBtb25leXB1bmN0KF9fY2FjaGVfdHlwZSogX19jYWNoZSwgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2RhdGEoX19jYWNoZSkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9tb25leXB1bmN0KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnRlcm5hbCBjb25zdHJ1Y3Rvci4gTm90IGZvciBnZW5lcmFsIHVzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZvciB1c2UgYnkgdGhlIGxpYnJhcnkgaXRzZWxmIHRvIHNldCB1cCBuZXcKKyAgICAgICAqICBsb2NhbGVzLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jbG9jICBUaGUgQyBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIG5hbWUgb2YgYSBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtIF9fcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBtb25leXB1bmN0KF9fY19sb2NhbGUgX19jbG9jLCBjb25zdCBjaGFyKiBfX3MsIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9kYXRhKDApCisgICAgICB7IF9NX2luaXRpYWxpemVfbW9uZXlwdW5jdChfX2Nsb2MsIF9fcyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gZGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGNoYXJfdHlwZSB0byB1c2UgYXMgYSBkZWNpbWFsIHBvaW50LiAgSXQKKyAgICAgICAqICBkb2VzIHNvIGJ5IHJldHVybmluZyByZXR1cm5pbmcKKyAgICAgICAqICBtb25leXB1bmN0PGNoYXJfdHlwZT46OmRvX2RlY2ltYWxfcG9pbnQoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQGEgY2hhcl90eXBlIHJlcHJlc2VudGluZyBhIGRlY2ltYWwgcG9pbnQuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICBkZWNpbWFsX3BvaW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2RlY2ltYWxfcG9pbnQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiB0aG91c2FuZHMgc2VwYXJhdG9yIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgY2hhcl90eXBlIHRvIHVzZSBhcyBhIHRob3VzYW5kcworICAgICAgICogIHNlcGFyYXRvci4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nIHJldHVybmluZworICAgICAgICogIG1vbmV5cHVuY3Q8Y2hhcl90eXBlPjo6ZG9fdGhvdXNhbmRzX3NlcCgpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBjaGFyX3R5cGUgcmVwcmVzZW50aW5nIGEgdGhvdXNhbmRzIHNlcGFyYXRvci4KKyAgICAgICovCisgICAgICBjaGFyX3R5cGUKKyAgICAgIHRob3VzYW5kc19zZXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdGhvdXNhbmRzX3NlcCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGdyb3VwaW5nIHNwZWNpZmljYXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgZ3JvdXBpbmdzIGZvciB0aGUKKyAgICAgICAqICBpbnRlZ2VyIHBhcnQgb2YgYW4gYW1vdW50LiAgR3JvdXBpbmdzIGluZGljYXRlIHdoZXJlIHRob3VzYW5kcworICAgICAgICogIHNlcGFyYXRvcnMgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBFYWNoIGNoYXIgaW4gdGhlIHJldHVybiBzdHJpbmcgaXMgaW50ZXJwcmV0IGFzIGFuIGludGVnZXIgcmF0aGVyCisgICAgICAgKiAgdGhhbiBhIGNoYXJhY3Rlci4gIFRoZXNlIG51bWJlcnMgcmVwcmVzZW50IHRoZSBudW1iZXIgb2YgZGlnaXRzIGluIGEKKyAgICAgICAqICBncm91cC4gIFRoZSBmaXJzdCBjaGFyIGluIHRoZSBzdHJpbmcgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGRpZ2l0cworICAgICAgICogIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBncm91cC4gIElmIGEgY2hhciBpcyBuZWdhdGl2ZSwgaXQgaW5kaWNhdGVzCisgICAgICAgKiAgYW4gdW5saW1pdGVkIG51bWJlciBvZiBkaWdpdHMgZm9yIHRoZSBncm91cC4gIElmIG1vcmUgY2hhcnMgZnJvbSB0aGUKKyAgICAgICAqICBzdHJpbmcgYXJlIHJlcXVpcmVkIHRvIGdyb3VwIGEgbnVtYmVyLCB0aGUgbGFzdCBjaGFyIGlzIHVzZWQKKyAgICAgICAqICByZXBlYXRlZGx5LgorICAgICAgICoKKyAgICAgICAqICBGb3IgZXhhbXBsZSwgaWYgdGhlIGdyb3VwaW5nKCkgcmV0dXJucyA8Y29kZT5cMDAzXDAwMjwvY29kZT4KKyAgICAgICAqICBhbmQgaXMgYXBwbGllZCB0byB0aGUgbnVtYmVyIDEyMzQ1Njc4OSwgdGhpcyBjb3JyZXNwb25kcyB0bworICAgICAgICogIDEyLDM0LDU2LDc4OS4gIE5vdGUgdGhhdCBpZiB0aGUgc3RyaW5nIHdhcyA8Y29kZT4zMjwvY29kZT4sIHRoaXMgd291bGQKKyAgICAgICAqICBwdXQgbW9yZSB0aGFuIDUwIGRpZ2l0cyBpbnRvIHRoZSBsZWFzdCBzaWduaWZpY2FudCBncm91cCBpZgorICAgICAgICogIHRoZSBjaGFyYWN0ZXIgc2V0IGlzIEFTQ0lJLgorICAgICAgICoKKyAgICAgICAqICBUaGUgc3RyaW5nIGlzIHJldHVybmVkIGJ5IGNhbGxpbmcKKyAgICAgICAqICBtb25leXB1bmN0PGNoYXJfdHlwZT46OmRvX2dyb3VwaW5nKCkuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIHN0cmluZyByZXByZXNlbnRpbmcgZ3JvdXBpbmcgc3BlY2lmaWNhdGlvbi4KKyAgICAgICovCisgICAgICBzdHJpbmcKKyAgICAgIGdyb3VwaW5nKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dyb3VwaW5nKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gY3VycmVuY3kgc3ltYm9sIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nX3R5cGUgdG8gdXNlIGFzIGEgY3VycmVuY3kgc3ltYm9sLiAgSXQKKyAgICAgICAqICBkb2VzIHNvIGJ5IHJldHVybmluZyByZXR1cm5pbmcKKyAgICAgICAqICBtb25leXB1bmN0PGNoYXJfdHlwZT46OmRvX2N1cnJfc3ltYm9sKCkuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIHN0cmluZ190eXBlIHJlcHJlc2VudGluZyBhIGN1cnJlbmN5IHN5bWJvbC4KKyAgICAgICovCisgICAgICBzdHJpbmdfdHlwZQorICAgICAgY3Vycl9zeW1ib2woKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fY3Vycl9zeW1ib2woKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBwb3NpdGl2ZSBzaWduIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nX3R5cGUgdG8gdXNlIGFzIGEgc2lnbiBmb3IgcG9zaXRpdmUKKyAgICAgICAqICBhbW91bnRzLiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcgcmV0dXJuaW5nCisgICAgICAgKiAgbW9uZXlwdW5jdDxjaGFyX3R5cGU+Ojpkb19wb3NpdGl2ZV9zaWduKCkuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSByZXR1cm4gdmFsdWUgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIsIHRoZSBmaXJzdAorICAgICAgICogIGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSBwb3NpdGlvbiBpbmRpY2F0ZWQgYnkgcG9zX2Zvcm1hdCgpIGFuZCB0aGUKKyAgICAgICAqICByZW1haW5kZXIgYXBwZWFyIGF0IHRoZSBlbmQgb2YgdGhlIGZvcm1hdHRlZCBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIHN0cmluZ190eXBlIHJlcHJlc2VudGluZyBhIHBvc2l0aXZlIHNpZ24uCisgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIHBvc2l0aXZlX3NpZ24oKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcG9zaXRpdmVfc2lnbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIG5lZ2F0aXZlIHNpZ24gc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmdfdHlwZSB0byB1c2UgYXMgYSBzaWduIGZvciBuZWdhdGl2ZQorICAgICAgICogIGFtb3VudHMuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZyByZXR1cm5pbmcKKyAgICAgICAqICBtb25leXB1bmN0PGNoYXJfdHlwZT46OmRvX25lZ2F0aXZlX3NpZ24oKS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIHJldHVybiB2YWx1ZSBjb250YWlucyBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciwgdGhlIGZpcnN0CisgICAgICAgKiAgY2hhcmFjdGVyIGFwcGVhcnMgaW4gdGhlIHBvc2l0aW9uIGluZGljYXRlZCBieSBuZWdfZm9ybWF0KCkgYW5kIHRoZQorICAgICAgICogIHJlbWFpbmRlciBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZm9ybWF0dGVkIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQGEgc3RyaW5nX3R5cGUgcmVwcmVzZW50aW5nIGEgbmVnYXRpdmUgc2lnbi4KKyAgICAgICovCisgICAgICBzdHJpbmdfdHlwZQorICAgICAgbmVnYXRpdmVfc2lnbigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19uZWdhdGl2ZV9zaWduKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gbnVtYmVyIG9mIGRpZ2l0cyBpbiBmcmFjdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBleGFjdCBudW1iZXIgb2YgZGlnaXRzIHRoYXQgbWFrZSB1cCB0aGUKKyAgICAgICAqICBmcmFjdGlvbmFsIHBhcnQgb2YgYSBtb25leSBhbW91bnQuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZworICAgICAgICogIHJldHVybmluZyBtb25leXB1bmN0PGNoYXJfdHlwZT46OmRvX2ZyYWNfZGlnaXRzKCkuCisgICAgICAgKgorICAgICAgICogIFRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgYSBtb25leSBhbW91bnQgaXMgb3B0aW9uYWwuICBCdXQgaWYgaXQgaXMKKyAgICAgICAqICBwcmVzZW50LCB0aGVyZSBtdXN0IGJlIGZyYWNfZGlnaXRzKCkgZGlnaXRzLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBOdW1iZXIgb2YgZGlnaXRzIGluIGFtb3VudCBmcmFjdGlvbi4KKyAgICAgICovCisgICAgICBpbnQKKyAgICAgIGZyYWNfZGlnaXRzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2ZyYWNfZGlnaXRzKCk7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gcGF0dGVybiBmb3IgbW9uZXkgdmFsdWVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGZvcm1hdHRpbmcgb2YgYQorICAgICAgICogIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIHZhbHVlZCBtb25leSBhbW91bnQuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZworICAgICAgICogIHJldHVybmluZyBtb25leXB1bmN0PGNoYXJfdHlwZT46OmRvX3Bvc19mb3JtYXQoKSBvcgorICAgICAgICogIG1vbmV5cHVuY3Q8Y2hhcl90eXBlPjo6ZG9fbmVnX2Zvcm1hdCgpLgorICAgICAgICoKKyAgICAgICAqICBUaGUgcGF0dGVybiBoYXMgNCBmaWVsZHMgZGVzY3JpYmluZyB0aGUgb3JkZXJpbmcgb2Ygc3ltYm9sLCBzaWduLAorICAgICAgICogIHZhbHVlLCBhbmQgbm9uZSBvciBzcGFjZS4gIFRoZXJlIG11c3QgYmUgb25lIG9mIGVhY2ggaW4gdGhlIHBhdHRlcm4uCisgICAgICAgKiAgVGhlIG5vbmUgYW5kIHNwYWNlIGVudW1zIG1heSBub3QgYXBwZWFyIGluIHRoZSBmaXJzdCBmaWVsZCBhbmQgc3BhY2UKKyAgICAgICAqICBtYXkgbm90IGFwcGVhciBpbiB0aGUgZmluYWwgZmllbGQuCisgICAgICAgKgorICAgICAgICogIFRoZSBwYXJ0cyBvZiBhIG1vbmV5IHN0cmluZyBtdXN0IGFwcGVhciBpbiB0aGUgb3JkZXIgaW5kaWNhdGVkIGJ5CisgICAgICAgKiAgdGhlIGZpZWxkcyBvZiB0aGUgcGF0dGVybi4gIFRoZSBzeW1ib2wgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlCisgICAgICAgKiAgdmFsdWUgb2YgY3Vycl9zeW1ib2woKSBtYXkgYmUgcHJlc2VudC4gIFRoZSBzaWduIGZpZWxkIGluZGljYXRlcworICAgICAgICogIHRoYXQgdGhlIHZhbHVlIG9mIHBvc2l0aXZlX3NpZ24oKSBvciBuZWdhdGl2ZV9zaWduKCkgbXVzdCBiZQorICAgICAgICogIHByZXNlbnQuICBUaGUgdmFsdWUgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZQorICAgICAgICogIG1vbmV5IGFtb3VudCBpcyBwcmVzZW50LiAgbm9uZSBpbmRpY2F0ZXMgMCBvciBtb3JlIHdoaXRlc3BhY2UKKyAgICAgICAqICBjaGFyYWN0ZXJzLCBleGNlcHQgYXQgdGhlIGVuZCwgd2hlcmUgaXQgcGVybWl0cyBubyB3aGl0ZXNwYWNlLgorICAgICAgICogIHNwYWNlIGluZGljYXRlcyB0aGF0IDEgb3IgbW9yZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgbXVzdCBiZQorICAgICAgICogIHByZXNlbnQuCisgICAgICAgKgorICAgICAgICogIEZvciBleGFtcGxlLCBmb3IgdGhlIFVTIGxvY2FsZSBhbmQgcG9zX2Zvcm1hdCgpIHBhdHRlcm4KKyAgICAgICAqICB7c3ltYm9sLHNpZ24sdmFsdWUsbm9uZX0sIGN1cnJfc3ltYm9sKCkgPT0gJmFwb3M7JCZhcG9zOworICAgICAgICogIHBvc2l0aXZlX3NpZ24oKSA9PSAmYXBvczsrJmFwb3M7LCBhbmQgdmFsdWUgMTAuMDEsIGFuZAorICAgICAgICogIG9wdGlvbnMgc2V0IHRvIGZvcmNlIHRoZSBzeW1ib2wsIHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZyBpcworICAgICAgICogIDxjb2RlPiQrMTAuMDE8L2NvZGU+LgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBQYXR0ZXJuIGZvciBtb25leSB2YWx1ZXMuCisgICAgICAqLworICAgICAgcGF0dGVybgorICAgICAgcG9zX2Zvcm1hdCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19wb3NfZm9ybWF0KCk7IH0KKworICAgICAgcGF0dGVybgorICAgICAgbmVnX2Zvcm1hdCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19uZWdfZm9ybWF0KCk7IH0KKyAgICAgIC8vQH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBEZXN0cnVjdG9yLgorICAgICAgdmlydHVhbAorICAgICAgfm1vbmV5cHVuY3QoKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gZGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBjaGFyX3R5cGUgdG8gdXNlIGFzIGEgZGVjaW1hbCBwb2ludC4gIFRoaXMgZnVuY3Rpb24gaXMgYQorICAgICAgICogIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBAYSBjaGFyX3R5cGUgcmVwcmVzZW50aW5nIGEgZGVjaW1hbCBwb2ludC4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fZGVjaW1hbF9wb2ludCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhLT5fTV9kZWNpbWFsX3BvaW50OyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIHRob3VzYW5kcyBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgY2hhcl90eXBlIHRvIHVzZSBhcyBhIHRob3VzYW5kcyBzZXBhcmF0b3IuICBUaGlzIGZ1bmN0aW9uCisgICAgICAgKiAgaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQGEgY2hhcl90eXBlIHJlcHJlc2VudGluZyBhIHRob3VzYW5kcyBzZXBhcmF0b3IuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3Rob3VzYW5kc19zZXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fdGhvdXNhbmRzX3NlcDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBncm91cGluZyBzcGVjaWZpY2F0aW9uLgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyBncm91cGluZ3MgZm9yIHRoZSBpbnRlZ2VyIHBhcnQgb2YgYQorICAgICAgICogIG51bWJlci4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZQorICAgICAgICogIHZhbHVlIHJldHVybmVkLiAgQHNlZSBncm91cGluZygpIGZvciBkZXRhaWxzLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBTdHJpbmcgcmVwcmVzZW50aW5nIGdyb3VwaW5nIHNwZWNpZmljYXRpb24uCisgICAgICAqLworICAgICAgdmlydHVhbCBzdHJpbmcKKyAgICAgIGRvX2dyb3VwaW5nKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX2dyb3VwaW5nOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGN1cnJlbmN5IHN5bWJvbCBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZ190eXBlIHRvIHVzZSBhcyBhIGN1cnJlbmN5IHN5bWJvbC4KKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUKKyAgICAgICAqICByZXR1cm5lZC4gIEBzZWUgY3Vycl9zeW1ib2woKSBmb3IgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQGEgc3RyaW5nX3R5cGUgcmVwcmVzZW50aW5nIGEgY3VycmVuY3kgc3ltYm9sLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgc3RyaW5nX3R5cGUKKyAgICAgIGRvX2N1cnJfc3ltYm9sKCkgICBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fY3Vycl9zeW1ib2w7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gcG9zaXRpdmUgc2lnbiBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZ190eXBlIHRvIHVzZSBhcyBhIHNpZ24gZm9yIHBvc2l0aXZlCisgICAgICAgKiAgYW1vdW50cy4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZQorICAgICAgICogIHZhbHVlIHJldHVybmVkLiAgQHNlZSBwb3NpdGl2ZV9zaWduKCkgZm9yIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIHN0cmluZ190eXBlIHJlcHJlc2VudGluZyBhIHBvc2l0aXZlIHNpZ24uCisgICAgICAqLworICAgICAgdmlydHVhbCBzdHJpbmdfdHlwZQorICAgICAgZG9fcG9zaXRpdmVfc2lnbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhLT5fTV9wb3NpdGl2ZV9zaWduOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIG5lZ2F0aXZlIHNpZ24gc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmdfdHlwZSB0byB1c2UgYXMgYSBzaWduIGZvciBuZWdhdGl2ZQorICAgICAgICogIGFtb3VudHMuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUKKyAgICAgICAqICB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgbmVnYXRpdmVfc2lnbigpIGZvciBkZXRhaWxzLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBAYSBzdHJpbmdfdHlwZSByZXByZXNlbnRpbmcgYSBuZWdhdGl2ZSBzaWduLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgc3RyaW5nX3R5cGUKKyAgICAgIGRvX25lZ2F0aXZlX3NpZ24oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fbmVnYXRpdmVfc2lnbjsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBudW1iZXIgb2YgZGlnaXRzIGluIGZyYWN0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGV4YWN0IG51bWJlciBvZiBkaWdpdHMgdGhhdCBtYWtlIHVwIHRoZQorICAgICAgICogIGZyYWN0aW9uYWwgcGFydCBvZiBhIG1vbmV5IGFtb3VudC4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvcgorICAgICAgICogIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLiAgQHNlZSBmcmFjX2RpZ2l0cygpCisgICAgICAgKiAgZm9yIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIE51bWJlciBvZiBkaWdpdHMgaW4gYW1vdW50IGZyYWN0aW9uLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBkb19mcmFjX2RpZ2l0cygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhLT5fTV9mcmFjX2RpZ2l0czsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBwYXR0ZXJuIGZvciBtb25leSB2YWx1ZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBhdHRlcm4gZGVzY3JpYmluZyB0aGUgZm9ybWF0dGluZyBvZiBhCisgICAgICAgKiAgcG9zaXRpdmUgdmFsdWVkIG1vbmV5IGFtb3VudC4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkCisgICAgICAgKiAgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLiAgQHNlZSBwb3NfZm9ybWF0KCkgZm9yCisgICAgICAgKiAgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgUGF0dGVybiBmb3IgbW9uZXkgdmFsdWVzLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgcGF0dGVybgorICAgICAgZG9fcG9zX2Zvcm1hdCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhLT5fTV9wb3NfZm9ybWF0OyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIHBhdHRlcm4gZm9yIG1vbmV5IHZhbHVlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcGF0dGVybiBkZXNjcmliaW5nIHRoZSBmb3JtYXR0aW5nIG9mIGEKKyAgICAgICAqICBuZWdhdGl2ZSB2YWx1ZWQgbW9uZXkgYW1vdW50LiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQKKyAgICAgICAqICBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuICBAc2VlIG5lZ19mb3JtYXQoKSBmb3IKKyAgICAgICAqICBkZXRhaWxzLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBQYXR0ZXJuIGZvciBtb25leSB2YWx1ZXMuCisgICAgICAqLworICAgICAgdmlydHVhbCBwYXR0ZXJuCisgICAgICBkb19uZWdfZm9ybWF0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX25lZ19mb3JtYXQ7IH0KKworICAgICAgLy8gRm9yIHVzZSBhdCBjb25zdHJ1Y3Rpb24gdGltZSBvbmx5LgorICAgICAgIHZvaWQKKyAgICAgICBfTV9pbml0aWFsaXplX21vbmV5cHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MgPSAwLAorCQkJCWNvbnN0IGNoYXIqIF9fbmFtZSA9IDApOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsPgorICAgIGxvY2FsZTo6aWQgbW9uZXlwdW5jdDxfQ2hhclQsIF9JbnRsPjo6aWQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsPgorICAgIGNvbnN0IGJvb2wgbW9uZXlwdW5jdDxfQ2hhclQsIF9JbnRsPjo6aW50bDsKKworICB0ZW1wbGF0ZTw+CisgICAgbW9uZXlwdW5jdDxjaGFyLCB0cnVlPjo6fm1vbmV5cHVuY3QoKTsKKworICB0ZW1wbGF0ZTw+CisgICAgbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT46On5tb25leXB1bmN0KCk7CisKKyAgdGVtcGxhdGU8PgorICAgIHZvaWQKKyAgICBtb25leXB1bmN0PGNoYXIsIHRydWU+OjpfTV9pbml0aWFsaXplX21vbmV5cHVuY3QoX19jX2xvY2FsZSwgY29uc3QgY2hhciopOworCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT46Ol9NX2luaXRpYWxpemVfbW9uZXlwdW5jdChfX2NfbG9jYWxlLCBjb25zdCBjaGFyKik7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgbW9uZXlwdW5jdDx3Y2hhcl90LCB0cnVlPjo6fm1vbmV5cHVuY3QoKTsKKworICB0ZW1wbGF0ZTw+CisgICAgbW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT46On5tb25leXB1bmN0KCk7CisKKyAgdGVtcGxhdGU8PgorICAgIHZvaWQKKyAgICBtb25leXB1bmN0PHdjaGFyX3QsIHRydWU+OjpfTV9pbml0aWFsaXplX21vbmV5cHVuY3QoX19jX2xvY2FsZSwKKwkJCQkJCQljb25zdCBjaGFyKik7CisKKyAgdGVtcGxhdGU8PgorICAgIHZvaWQKKyAgICBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPjo6X01faW5pdGlhbGl6ZV9tb25leXB1bmN0KF9fY19sb2NhbGUsCisJCQkJCQkJIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorCisgIC8vLyBjbGFzcyBtb25leXB1bmN0X2J5bmFtZSBbMjIuMi42LjRdLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIGJvb2wgX0ludGw+CisgICAgY2xhc3MgbW9uZXlwdW5jdF9ieW5hbWUgOiBwdWJsaWMgbW9uZXlwdW5jdDxfQ2hhclQsIF9JbnRsPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4Jc3RyaW5nX3R5cGU7CisKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIGludGwgPSBfSW50bDsKKworICAgICAgZXhwbGljaXQKKyAgICAgIG1vbmV5cHVuY3RfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IG1vbmV5cHVuY3Q8X0NoYXJULCBfSW50bD4oX19yZWZzKQorICAgICAgeworCWlmIChfX2J1aWx0aW5fc3RyY21wKF9fcywgIkMiKSAhPSAwCisJICAgICYmIF9fYnVpbHRpbl9zdHJjbXAoX19zLCAiUE9TSVgiKSAhPSAwKQorCSAgeworCSAgICBfX2NfbG9jYWxlIF9fdG1wOworCSAgICB0aGlzLT5fU19jcmVhdGVfY19sb2NhbGUoX190bXAsIF9fcyk7CisJICAgIHRoaXMtPl9NX2luaXRpYWxpemVfbW9uZXlwdW5jdChfX3RtcCk7CisJICAgIHRoaXMtPl9TX2Rlc3Ryb3lfY19sb2NhbGUoX190bXApOworCSAgfQorICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfm1vbmV5cHVuY3RfYnluYW1lKCkgeyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIGJvb2wgX0ludGw+CisgICAgY29uc3QgYm9vbCBtb25leXB1bmN0X2J5bmFtZTxfQ2hhclQsIF9JbnRsPjo6aW50bDsKKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0xEQkwKKworICAvKioKKyAgICogIEBicmllZiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBtb25leV9nZXQuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIGZhY2V0IGVuY2Fwc3VsYXRlcyB0aGUgY29kZSB0byBwYXJzZSBhbmQgcmV0dXJuIGEgbW9uZXRhcnkKKyAgICogIGFtb3VudCBmcm9tIGEgc3RyaW5nLgorICAgKgorICAgKiAgVGhlIG1vbmV5X2dldCB0ZW1wbGF0ZSB1c2VzIHByb3RlY3RlZCB2aXJ0dWFsIGZ1bmN0aW9ucyB0bworICAgKiAgcHJvdmlkZSB0aGUgYWN0dWFsIHJlc3VsdHMuICBUaGUgcHVibGljIGFjY2Vzc29ycyBmb3J3YXJkIHRoZQorICAgKiAgY2FsbCB0byB0aGUgdmlydHVhbCBmdW5jdGlvbnMuICBUaGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUKKyAgICogIGhvb2tzIGZvciBkZXZlbG9wZXJzIHRvIGltcGxlbWVudCB0aGUgYmVoYXZpb3IgdGhleSByZXF1aXJlIGZyb20KKyAgICogIHRoZSBtb25leV9nZXQgZmFjZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBjbGFzcyBtb25leV9nZXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfSW5JdGVyCQkJaXRlcl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPglzdHJpbmdfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy8vIE51bXB1bmN0IGZhY2V0IGlkLgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19yZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG1vbmV5X2dldChzaXplX3QgX19yZWZzID0gMCkgOiBmYWNldChfX3JlZnMpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlYWQgYW5kIHBhcnNlIGEgbW9uZXRhcnkgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgY2hhcmFjdGVycyBmcm9tIEBhIF9fcywgaW50ZXJwcmV0cyB0aGVtIGFzIGEKKyAgICAgICAqICBtb25ldGFyeSB2YWx1ZSBhY2NvcmRpbmcgdG8gbW9uZXlwdW5jdCBhbmQgY3R5cGUgZmFjZXRzIHJldHJpZXZlZAorICAgICAgICogIGZyb20gaW8uZ2V0bG9jKCksIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgaW4gQGEgdW5pdHMgYXMgYW4gaW50ZWdyYWwKKyAgICAgICAqICB2YWx1ZSBtb25leXB1bmN0OjpmcmFjX2RpZ2l0cygpICogdGhlIGFjdHVhbCBhbW91bnQuICBGb3IgZXhhbXBsZSwKKyAgICAgICAqICB0aGUgc3RyaW5nICQxMC4wMSBpbiBhIFVTIGxvY2FsZSB3b3VsZCBzdG9yZSAxMDAxIGluIEBhIHVuaXRzLgorICAgICAgICoKKyAgICAgICAqICBBbnkgY2hhcmFjdGVycyBub3QgcGFydCBvZiBhIHZhbGlkIG1vbmV5IGFtb3VudCBhcmUgbm90IGNvbnN1bWVkLgorICAgICAgICoKKyAgICAgICAqICBJZiBhIG1vbmV5IHZhbHVlIGNhbm5vdCBiZSBwYXJzZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBzZXRzCisgICAgICAgKiAgZXJyPShlcnJ8aW8uZmFpbGJpdCkuICBJZiB0aGUgc3RyZWFtIGlzIGNvbnN1bWVkIGJlZm9yZSBmaW5pc2hpbmcKKyAgICAgICAqICBwYXJzaW5nLCAgc2V0cyBlcnI9KGVycnxpby5mYWlsYml0fGlvLmVvZmJpdCkuICBAYSB1bml0cyBpcworICAgICAgICogIHVuY2hhbmdlZCBpZiBwYXJzaW5nIGZhaWxzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdvcmtzIGJ5IHJldHVybmluZyB0aGUgcmVzdWx0IG9mIGRvX2dldCgpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcyAgU3RhcnQgb2YgY2hhcmFjdGVycyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2YgY2hhcmFjdGVycyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9faW50bCAgUGFyYW1ldGVyIHRvIHVzZV9mYWNldDxtb25leXB1bmN0PENoYXJULGludGw+ID4uCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgZmFjZXRzIGFuZCBpbyBzdGF0ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmaWVsZCB0byBzZXQgaWYgcGFyc2luZyBmYWlscy4KKyAgICAgICAqICBAcGFyYW0gIF9fdW5pdHMgIFBsYWNlIHRvIHN0b3JlIHJlc3VsdCBvZiBwYXJzaW5nLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGZpcnN0IGNoYXJhY3RlciBiZXlvbmQgdmFsaWQgbW9uZXkKKyAgICAgICAqCSAgIGFtb3VudC4KKyAgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBnZXQoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sCisJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcgZG91YmxlJiBfX3VuaXRzKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0KF9fcywgX19lbmQsIF9faW50bCwgX19pbywgX19lcnIsIF9fdW5pdHMpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVhZCBhbmQgcGFyc2UgYSBtb25ldGFyeSB2YWx1ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZWFkcyBjaGFyYWN0ZXJzIGZyb20gQGEgX19zLCBpbnRlcnByZXRzIHRoZW0gYXMKKyAgICAgICAqICBhIG1vbmV0YXJ5IHZhbHVlIGFjY29yZGluZyB0byBtb25leXB1bmN0IGFuZCBjdHlwZSBmYWNldHMKKyAgICAgICAqICByZXRyaWV2ZWQgZnJvbSBpby5nZXRsb2MoKSwgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBpbiBAYQorICAgICAgICogIGRpZ2l0cy4gIEZvciBleGFtcGxlLCB0aGUgc3RyaW5nICQxMC4wMSBpbiBhIFVTIGxvY2FsZSB3b3VsZAorICAgICAgICogIHN0b3JlIDxjb2RlPjEwMDE8L2NvZGU+IGluIEBhIGRpZ2l0cy4KKyAgICAgICAqCisgICAgICAgKiAgQW55IGNoYXJhY3RlcnMgbm90IHBhcnQgb2YgYSB2YWxpZCBtb25leSBhbW91bnQgYXJlIG5vdCBjb25zdW1lZC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYSBtb25leSB2YWx1ZSBjYW5ub3QgYmUgcGFyc2VkIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgc2V0cworICAgICAgICogIGVycj0oZXJyfGlvLmZhaWxiaXQpLiAgSWYgdGhlIHN0cmVhbSBpcyBjb25zdW1lZCBiZWZvcmUgZmluaXNoaW5nCisgICAgICAgKiAgcGFyc2luZywgIHNldHMgZXJyPShlcnJ8aW8uZmFpbGJpdHxpby5lb2ZiaXQpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdvcmtzIGJ5IHJldHVybmluZyB0aGUgcmVzdWx0IG9mIGRvX2dldCgpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcyAgU3RhcnQgb2YgY2hhcmFjdGVycyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2YgY2hhcmFjdGVycyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9faW50bCAgUGFyYW1ldGVyIHRvIHVzZV9mYWNldDxtb25leXB1bmN0PENoYXJULGludGw+ID4uCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgZmFjZXRzIGFuZCBpbyBzdGF0ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmaWVsZCB0byBzZXQgaWYgcGFyc2luZyBmYWlscy4KKyAgICAgICAqICBAcGFyYW0gIF9fZGlnaXRzICBQbGFjZSB0byBzdG9yZSByZXN1bHQgb2YgcGFyc2luZy4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciByZWZlcmVuY2luZyBmaXJzdCBjaGFyYWN0ZXIgYmV5b25kIHZhbGlkIG1vbmV5CisgICAgICAgKgkgICBhbW91bnQuCisgICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSBfX2VuZCwgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19zLCBfX2VuZCwgX19pbnRsLCBfX2lvLCBfX2VyciwgX19kaWdpdHMpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5tb25leV9nZXQoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZWFkIGFuZCBwYXJzZSBhIG1vbmV0YXJ5IHZhbHVlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJlYWRzIGFuZCBwYXJzZXMgY2hhcmFjdGVycyByZXByZXNlbnRpbmcgYSBtb25ldGFyeQorICAgICAgICogIHZhbHVlLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlCisgICAgICAgKiAgdmFsdWUgcmV0dXJuZWQuICBAc2VlIGdldCgpIGZvciBkZXRhaWxzLgorICAgICAgICovCisgICAgICAvLyBYWFggR0xJQkNYWF9BQkkgRGVwcmVjYXRlZAorI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIF9fZG9fZ2V0KGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSBfX2VuZCwgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGRvdWJsZSYgX191bml0cykgY29uc3Q7CisjZWxzZQorICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgX19lbmQsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBkb3VibGUmIF9fdW5pdHMpIGNvbnN0OworI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVhZCBhbmQgcGFyc2UgYSBtb25ldGFyeSB2YWx1ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZWFkcyBhbmQgcGFyc2VzIGNoYXJhY3RlcnMgcmVwcmVzZW50aW5nIGEgbW9uZXRhcnkKKyAgICAgICAqICB2YWx1ZS4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZQorICAgICAgICogIHZhbHVlIHJldHVybmVkLiAgQHNlZSBnZXQoKSBmb3IgZGV0YWlscy4KKyAgICAgICAqLworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgX19lbmQsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgc3RyaW5nX3R5cGUmIF9fZGlnaXRzKSBjb25zdDsKKworICAgICAgLy8gWFhYIEdMSUJDWFhfQUJJIERlcHJlY2F0ZWQKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0xPTkdfRE9VQkxFX0NPTVBBVCAmJiBkZWZpbmVkIF9fTE9OR19ET1VCTEVfMTI4X18KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sCisJICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcgZG91YmxlJiBfX3VuaXRzKSBjb25zdDsKKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTxib29sIF9JbnRsPgorICAgICAgICBpdGVyX3R5cGUKKyAgICAgICAgX01fZXh0cmFjdChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCQkgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHN0cmluZyYgX19kaWdpdHMpIGNvbnN0OyAgICAgCisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgbG9jYWxlOjppZCBtb25leV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6aWQ7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgbW9uZXlfcHV0LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBmYWNldCBlbmNhcHN1bGF0ZXMgdGhlIGNvZGUgdG8gZm9ybWF0IGFuZCBvdXRwdXQgYSBtb25ldGFyeQorICAgKiAgYW1vdW50LgorICAgKgorICAgKiAgVGhlIG1vbmV5X3B1dCB0ZW1wbGF0ZSB1c2VzIHByb3RlY3RlZCB2aXJ0dWFsIGZ1bmN0aW9ucyB0bworICAgKiAgcHJvdmlkZSB0aGUgYWN0dWFsIHJlc3VsdHMuICBUaGUgcHVibGljIGFjY2Vzc29ycyBmb3J3YXJkIHRoZQorICAgKiAgY2FsbCB0byB0aGUgdmlydHVhbCBmdW5jdGlvbnMuICBUaGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUKKyAgICogIGhvb2tzIGZvciBkZXZlbG9wZXJzIHRvIGltcGxlbWVudCB0aGUgYmVoYXZpb3IgdGhleSByZXF1aXJlIGZyb20KKyAgICogIHRoZSBtb25leV9wdXQgZmFjZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgY2xhc3MgbW9uZXlfcHV0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcworICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9PdXRJdGVyCQkJaXRlcl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPglzdHJpbmdfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy8vIE51bXB1bmN0IGZhY2V0IGlkLgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19yZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG1vbmV5X3B1dChzaXplX3QgX19yZWZzID0gMCkgOiBmYWNldChfX3JlZnMpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZvcm1hdCBhbmQgb3V0cHV0IGEgbW9uZXRhcnkgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZm9ybWF0cyBAYSB1bml0cyBhcyBhIG1vbmV0YXJ5IHZhbHVlIGFjY29yZGluZyB0bworICAgICAgICogIG1vbmV5cHVuY3QgYW5kIGN0eXBlIGZhY2V0cyByZXRyaWV2ZWQgZnJvbSBpby5nZXRsb2MoKSwgYW5kIHdyaXRlcworICAgICAgICogIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVycyB0byBAYSBfX3MuICBGb3IgZXhhbXBsZSwgdGhlIHZhbHVlIDEwMDEgaW4gYQorICAgICAgICogIFVTIGxvY2FsZSB3b3VsZCB3cml0ZSA8Y29kZT4kMTAuMDE8L2NvZGU+IHRvIEBhIF9fcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3b3JrcyBieSByZXR1cm5pbmcgdGhlIHJlc3VsdCBvZiBkb19wdXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICAgKiAgQHBhcmFtICBfX2ludGwgIFBhcmFtZXRlciB0byB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxDaGFyVCxpbnRsPiA+LgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIGZhY2V0cyBhbmQgaW8gc3RhdGUuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpbGwgIGNoYXJfdHlwZSB0byB1c2UgZm9yIHBhZGRpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3VuaXRzICBQbGFjZSB0byBzdG9yZSByZXN1bHQgb2YgcGFyc2luZy4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciB3cml0aW5nLgorICAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIHB1dChpdGVyX3R5cGUgX19zLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sCisJICBjaGFyX3R5cGUgX19maWxsLCBsb25nIGRvdWJsZSBfX3VuaXRzKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19pbnRsLCBfX2lvLCBfX2ZpbGwsIF9fdW5pdHMpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRm9ybWF0IGFuZCBvdXRwdXQgYSBtb25ldGFyeSB2YWx1ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmb3JtYXRzIEBhIGRpZ2l0cyBhcyBhIG1vbmV0YXJ5IHZhbHVlCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIG1vbmV5cHVuY3QgYW5kIGN0eXBlIGZhY2V0cyByZXRyaWV2ZWQgZnJvbQorICAgICAgICogIGlvLmdldGxvYygpLCBhbmQgd3JpdGVzIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVycyB0byBAYSBfX3MuCisgICAgICAgKiAgRm9yIGV4YW1wbGUsIHRoZSBzdHJpbmcgPGNvZGU+MTAwMTwvY29kZT4gaW4gYSBVUyBsb2NhbGUKKyAgICAgICAqICB3b3VsZCB3cml0ZSA8Y29kZT4kMTAuMDE8L2NvZGU+IHRvIEBhIF9fcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3b3JrcyBieSByZXR1cm5pbmcgdGhlIHJlc3VsdCBvZiBkb19wdXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICAgKiAgQHBhcmFtICBfX2ludGwgIFBhcmFtZXRlciB0byB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxDaGFyVCxpbnRsPiA+LgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIGZhY2V0cyBhbmQgaW8gc3RhdGUuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpbGwgIGNoYXJfdHlwZSB0byB1c2UgZm9yIHBhZGRpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX2RpZ2l0cyAgUGxhY2UgdG8gc3RvcmUgcmVzdWx0IG9mIHBhcnNpbmcuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBwdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLAorCSAgY2hhcl90eXBlIF9fZmlsbCwgY29uc3Qgc3RyaW5nX3R5cGUmIF9fZGlnaXRzKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19pbnRsLCBfX2lvLCBfX2ZpbGwsIF9fZGlnaXRzKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8vIERlc3RydWN0b3IuCisgICAgICB2aXJ0dWFsCisgICAgICB+bW9uZXlfcHV0KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRm9ybWF0IGFuZCBvdXRwdXQgYSBtb25ldGFyeSB2YWx1ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmb3JtYXRzIEBhIHVuaXRzIGFzIGEgbW9uZXRhcnkgdmFsdWUgYWNjb3JkaW5nIHRvCisgICAgICAgKiAgbW9uZXlwdW5jdCBhbmQgY3R5cGUgZmFjZXRzIHJldHJpZXZlZCBmcm9tIGlvLmdldGxvYygpLCBhbmQgd3JpdGVzCisgICAgICAgKiAgdGhlIHJlc3VsdGluZyBjaGFyYWN0ZXJzIHRvIEBhIF9fcy4gIEZvciBleGFtcGxlLCB0aGUgdmFsdWUgMTAwMSBpbiBhCisgICAgICAgKiAgVVMgbG9jYWxlIHdvdWxkIHdyaXRlIDxjb2RlPiQxMC4wMTwvY29kZT4gdG8gQGEgX19zLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUKKyAgICAgICAqICByZXR1cm5lZC4gIEBzZWUgcHV0KCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgX19pbnRsICBQYXJhbWV0ZXIgdG8gdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8Q2hhclQsaW50bD4gPi4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBmYWNldHMgYW5kIGlvIHN0YXRlLgorICAgICAgICogIEBwYXJhbSAgX19maWxsICBjaGFyX3R5cGUgdG8gdXNlIGZvciBwYWRkaW5nLgorICAgICAgICogIEBwYXJhbSAgX191bml0cyAgUGxhY2UgdG8gc3RvcmUgcmVzdWx0IG9mIHBhcnNpbmcuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgICAqLworICAgICAgLy8gWFhYIEdMSUJDWFhfQUJJIERlcHJlY2F0ZWQKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0xPTkdfRE9VQkxFX0NPTVBBVCAmJiBkZWZpbmVkIF9fTE9OR19ET1VCTEVfMTI4X18KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBfX2RvX3B1dChpdGVyX3R5cGUgX19zLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICAgICAgIGRvdWJsZSBfX3VuaXRzKSBjb25zdDsKKyNlbHNlCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkgICAgIGxvbmcgZG91YmxlIF9fdW5pdHMpIGNvbnN0OworI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRm9ybWF0IGFuZCBvdXRwdXQgYSBtb25ldGFyeSB2YWx1ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmb3JtYXRzIEBhIGRpZ2l0cyBhcyBhIG1vbmV0YXJ5IHZhbHVlCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIG1vbmV5cHVuY3QgYW5kIGN0eXBlIGZhY2V0cyByZXRyaWV2ZWQgZnJvbQorICAgICAgICogIGlvLmdldGxvYygpLCBhbmQgd3JpdGVzIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVycyB0byBAYSBfX3MuCisgICAgICAgKiAgRm9yIGV4YW1wbGUsIHRoZSBzdHJpbmcgPGNvZGU+MTAwMTwvY29kZT4gaW4gYSBVUyBsb2NhbGUKKyAgICAgICAqICB3b3VsZCB3cml0ZSA8Y29kZT4kMTAuMDE8L2NvZGU+IHRvIEBhIF9fcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlCisgICAgICAgKiAgcmV0dXJuZWQuICBAc2VlIHB1dCgpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIHN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIF9faW50bCAgUGFyYW1ldGVyIHRvIHVzZV9mYWNldDxtb25leXB1bmN0PENoYXJULGludGw+ID4uCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgZmFjZXRzIGFuZCBpbyBzdGF0ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlsbCAgY2hhcl90eXBlIHRvIHVzZSBmb3IgcGFkZGluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fZGlnaXRzICBQbGFjZSB0byBzdG9yZSByZXN1bHQgb2YgcGFyc2luZy4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciB3cml0aW5nLgorICAgICAgICovCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkgICAgIGNvbnN0IHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3Q7CisKKyAgICAgIC8vIFhYWCBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkgICAgIGxvbmcgZG91YmxlIF9fdW5pdHMpIGNvbnN0OworI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPGJvb2wgX0ludGw+CisgICAgICAgIGl0ZXJfdHlwZQorICAgICAgICBfTV9pbnNlcnQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJCSAgY29uc3Qgc3RyaW5nX3R5cGUmIF9fZGlnaXRzKSBjb25zdDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgbG9jYWxlOjppZCBtb25leV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OmlkOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0xEQkwKKworICAvKioKKyAgICogIEBicmllZiAgTWVzc2FnZXMgZmFjZXQgYmFzZSBjbGFzcyBwcm92aWRpbmcgY2F0YWxvZyB0eXBlZGVmLgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKi8KKyAgc3RydWN0IG1lc3NhZ2VzX2Jhc2UKKyAgeworICAgIHR5cGVkZWYgaW50IGNhdGFsb2c7CisgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgbWVzc2FnZXMuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIGZhY2V0IGVuY2Fwc3VsYXRlcyB0aGUgY29kZSB0byByZXRyaWV2ZSBtZXNzYWdlcyBmcm9tCisgICAqICBtZXNzYWdlIGNhdGFsb2dzLiAgVGhlIG9ubHkgdGhpbmcgZGVmaW5lZCBieSB0aGUgc3RhbmRhcmQgZm9yIHRoaXMgZmFjZXQKKyAgICogIGlzIHRoZSBpbnRlcmZhY2UuICBBbGwgdW5kZXJseWluZyBmdW5jdGlvbmFsaXR5IGlzCisgICAqICBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorICAgKgorICAgKiAgVGhpcyBsaWJyYXJ5IGN1cnJlbnRseSBpbXBsZW1lbnRzIDMgdmVyc2lvbnMgb2YgdGhlIG1lc3NhZ2UgZmFjZXQuICBUaGUKKyAgICogIGZpcnN0IHZlcnNpb24gKGdudSkgaXMgYSB3cmFwcGVyIGFyb3VuZCBnZXR0ZXh0LCBwcm92aWRlZCBieSBsaWJpbnRsLgorICAgKiAgVGhlIHNlY29uZCB2ZXJzaW9uIChpZWVlKSBpcyBhIHdyYXBwZXIgYXJvdW5kIGNhdGdldHMuICBUaGUgZmluYWwKKyAgICogIHZlcnNpb24gKGRlZmF1bHQpIGRvZXMgbm8gYWN0dWFsIHRyYW5zbGF0aW9uLiAgVGhlc2UgaW1wbGVtZW50YXRpb25zIGFyZQorICAgKiAgb25seSBwcm92aWRlZCBmb3IgY2hhciBhbmQgd2NoYXJfdCBpbnN0YW50aWF0aW9ucy4KKyAgICoKKyAgICogIFRoZSBtZXNzYWdlcyB0ZW1wbGF0ZSB1c2VzIHByb3RlY3RlZCB2aXJ0dWFsIGZ1bmN0aW9ucyB0bworICAgKiAgcHJvdmlkZSB0aGUgYWN0dWFsIHJlc3VsdHMuICBUaGUgcHVibGljIGFjY2Vzc29ycyBmb3J3YXJkIHRoZQorICAgKiAgY2FsbCB0byB0aGUgdmlydHVhbCBmdW5jdGlvbnMuICBUaGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUKKyAgICogIGhvb2tzIGZvciBkZXZlbG9wZXJzIHRvIGltcGxlbWVudCB0aGUgYmVoYXZpb3IgdGhleSByZXF1aXJlIGZyb20KKyAgICogIHRoZSBtZXNzYWdlcyBmYWNldC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIG1lc3NhZ2VzIDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBtZXNzYWdlc19iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcworICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+CXN0cmluZ190eXBlOworICAgICAgLy9AfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gVW5kZXJseWluZyAiQyIgbGlicmFyeSBsb2NhbGUgaW5mb3JtYXRpb24gc2F2ZWQgZnJvbQorICAgICAgLy8gaW5pdGlhbGl6YXRpb24sIG5lZWRlZCBieSBtZXNzYWdlc19ieW5hbWUgYXMgd2VsbC4KKyAgICAgIF9fY19sb2NhbGUJCQlfTV9jX2xvY2FsZV9tZXNzYWdlczsKKyAgICAgIGNvbnN0IGNoYXIqCQkJX01fbmFtZV9tZXNzYWdlczsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBOdW1wdW5jdCBmYWNldCBpZC4KKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkCQkJaWQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHByb3ZpZGVkIGJ5IHRoZSBzdGFuZGFyZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBtZXNzYWdlcyhzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICAgIC8vIE5vbi1zdGFuZGFyZC4KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW50ZXJuYWwgY29uc3RydWN0b3IuICBOb3QgZm9yIGdlbmVyYWwgdXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgY29uc3RydWN0b3IgZm9yIHVzZSBieSB0aGUgbGlicmFyeSBpdHNlbGYgdG8gc2V0IHVwIG5ldworICAgICAgICogIGxvY2FsZXMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19jbG9jICBUaGUgQyBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBuYW1lIG9mIGEgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgX19yZWZzICBSZWZjb3VudCB0byBwYXNzIHRvIHRoZSBiYXNlIGNsYXNzLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbWVzc2FnZXMoX19jX2xvY2FsZSBfX2Nsb2MsIGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgICAvKgorICAgICAgICogIEBicmllZiAgT3BlbiBhIG1lc3NhZ2UgY2F0YWxvZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBvcGVucyBhbmQgcmV0dXJucyBhIGhhbmRsZSB0byBhIG1lc3NhZ2UgY2F0YWxvZyBieQorICAgICAgICogIHJldHVybmluZyBkb19vcGVuKF9fcywgX19sb2MpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIGNhdGFsb2cgdG8gb3Blbi4KKyAgICAgICAqICBAcGFyYW0gIF9fbG9jICBMb2NhbGUgdG8gdXNlIGZvciBjaGFyYWN0ZXIgc2V0IGNvbnZlcnNpb25zLgorICAgICAgICogIEByZXR1cm4gIEhhbmRsZSB0byB0aGUgY2F0YWxvZyBvciB2YWx1ZSA8IDAgaWYgb3BlbiBmYWlscy4KKyAgICAgICovCisgICAgICBjYXRhbG9nCisgICAgICBvcGVuKGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyPiYgX19zLCBjb25zdCBsb2NhbGUmIF9fbG9jKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fb3BlbihfX3MsIF9fbG9jKTsgfQorCisgICAgICAvLyBOb24tc3RhbmRhcmQgYW5kIHVub3J0aG9kb3gsIHlldCBlZmZlY3RpdmUuCisgICAgICAvKgorICAgICAgICogIEBicmllZiAgT3BlbiBhIG1lc3NhZ2UgY2F0YWxvZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBub24tc3RhbmRhcmQgZnVuY3Rpb24gb3BlbnMgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gYSBtZXNzYWdlCisgICAgICAgKiAgY2F0YWxvZyBieSByZXR1cm5pbmcgZG9fb3BlbihzLCBsb2MpLiAgVGhlIHRoaXJkIGFyZ3VtZW50IHByb3ZpZGVzIGEKKyAgICAgICAqICBtZXNzYWdlIGNhdGFsb2cgcm9vdCBkaXJlY3RvcnkgZm9yIGdudSBnZXR0ZXh0IGFuZCBpcyBpZ25vcmVkCisgICAgICAgKiAgb3RoZXJ3aXNlLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIGNhdGFsb2cgdG8gb3Blbi4KKyAgICAgICAqICBAcGFyYW0gIF9fbG9jICBMb2NhbGUgdG8gdXNlIGZvciBjaGFyYWN0ZXIgc2V0IGNvbnZlcnNpb25zLgorICAgICAgICogIEBwYXJhbSAgX19kaXIgIE1lc3NhZ2UgY2F0YWxvZyByb290IGRpcmVjdG9yeS4KKyAgICAgICAqICBAcmV0dXJuICBIYW5kbGUgdG8gdGhlIGNhdGFsb2cgb3IgdmFsdWUgPCAwIGlmIG9wZW4gZmFpbHMuCisgICAgICAqLworICAgICAgY2F0YWxvZworICAgICAgb3Blbihjb25zdCBiYXNpY19zdHJpbmc8Y2hhcj4mLCBjb25zdCBsb2NhbGUmLCBjb25zdCBjaGFyKikgY29uc3Q7CisKKyAgICAgIC8qCisgICAgICAgKiAgQGJyaWVmICBMb29rIHVwIGEgc3RyaW5nIGluIGEgbWVzc2FnZSBjYXRhbG9nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyBhbmQgcmV0dXJucyBhIG1lc3NhZ2UgZnJvbSBhIGNhdGFsb2cgYnkKKyAgICAgICAqICByZXR1cm5pbmcgZG9fZ2V0KGMsIHNldCwgbXNnaWQsIHMpLgorICAgICAgICoKKyAgICAgICAqICBGb3IgZ251LCBAYSBfX3NldCBhbmQgQGEgbXNnaWQgYXJlIGlnbm9yZWQuICBSZXR1cm5zIGdldHRleHQocykuCisgICAgICAgKiAgRm9yIGRlZmF1bHQsIHJldHVybnMgcy4gRm9yIGllZWUsIHJldHVybnMgY2F0Z2V0cyhjLHNldCxtc2dpZCxzKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2MgIFRoZSBjYXRhbG9nIHRvIGFjY2Vzcy4KKyAgICAgICAqICBAcGFyYW0gIF9fc2V0ICBJbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorICAgICAgICogIEBwYXJhbSAgX19tc2dpZCAgSW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgRGVmYXVsdCByZXR1cm4gdmFsdWUgaWYgcmV0cmlldmFsIGZhaWxzLgorICAgICAgICogIEByZXR1cm4gIFJldHJpZXZlZCBtZXNzYWdlIG9yIEBhIF9fcyBpZiBnZXQgZmFpbHMuCisgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIGdldChjYXRhbG9nIF9fYywgaW50IF9fc2V0LCBpbnQgX19tc2dpZCwgY29uc3Qgc3RyaW5nX3R5cGUmIF9fcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2MsIF9fc2V0LCBfX21zZ2lkLCBfX3MpOyB9CisKKyAgICAgIC8qCisgICAgICAgKiAgQGJyaWVmICBDbG9zZSBhIG1lc3NhZ2UgY2F0YWxvZy4KKyAgICAgICAqCisgICAgICAgKiAgQ2xvc2VzIGNhdGFsb2cgQGEgYyBieSBjYWxsaW5nIGRvX2Nsb3NlKGMpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fYyAgVGhlIGNhdGFsb2cgdG8gY2xvc2UuCisgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xvc2UoY2F0YWxvZyBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19jbG9zZShfX2MpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5tZXNzYWdlcygpOworCisgICAgICAvKgorICAgICAgICogIEBicmllZiAgT3BlbiBhIG1lc3NhZ2UgY2F0YWxvZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBvcGVucyBhbmQgcmV0dXJucyBhIGhhbmRsZSB0byBhIG1lc3NhZ2UgY2F0YWxvZyBpbiBhbgorICAgICAgICogIGltcGxlbWVudGF0aW9uLWRlZmluZWQgbWFubmVyLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQKKyAgICAgICAqICBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgY2F0YWxvZyB0byBvcGVuLgorICAgICAgICogIEBwYXJhbSAgX19sb2MgIExvY2FsZSB0byB1c2UgZm9yIGNoYXJhY3RlciBzZXQgY29udmVyc2lvbnMuCisgICAgICAgKiAgQHJldHVybiAgSGFuZGxlIHRvIHRoZSBvcGVuZWQgY2F0YWxvZywgdmFsdWUgPCAwIGlmIG9wZW4gZmFpbGVkLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2F0YWxvZworICAgICAgZG9fb3Blbihjb25zdCBiYXNpY19zdHJpbmc8Y2hhcj4mLCBjb25zdCBsb2NhbGUmKSBjb25zdDsKKworICAgICAgLyoKKyAgICAgICAqICBAYnJpZWYgIExvb2sgdXAgYSBzdHJpbmcgaW4gYSBtZXNzYWdlIGNhdGFsb2cuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIGFuZCByZXR1cm5zIGEgbWVzc2FnZSBmcm9tIGEgY2F0YWxvZyBpbiBhbgorICAgICAgICogIGltcGxlbWVudGF0aW9uLWRlZmluZWQgbWFubmVyLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQKKyAgICAgICAqICBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEZvciBnbnUsIEBhIF9fc2V0IGFuZCBAYSBfX21zZ2lkIGFyZSBpZ25vcmVkLiAgUmV0dXJucyBnZXR0ZXh0KHMpLgorICAgICAgICogIEZvciBkZWZhdWx0LCByZXR1cm5zIHMuIEZvciBpZWVlLCByZXR1cm5zIGNhdGdldHMoYyxzZXQsbXNnaWQscykuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19jICBUaGUgY2F0YWxvZyB0byBhY2Nlc3MuCisgICAgICAgKiAgQHBhcmFtICBfX3NldCAgSW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgICAgICAqICBAcGFyYW0gIF9fbXNnaWQgIEltcGxlbWVudGF0aW9uLWRlZmluZWQuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIERlZmF1bHQgcmV0dXJuIHZhbHVlIGlmIHJldHJpZXZhbCBmYWlscy4KKyAgICAgICAqICBAcmV0dXJuICBSZXRyaWV2ZWQgbWVzc2FnZSBvciBAYSBfX3MgaWYgZ2V0IGZhaWxzLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgc3RyaW5nX3R5cGUKKyAgICAgIGRvX2dldChjYXRhbG9nLCBpbnQsIGludCwgY29uc3Qgc3RyaW5nX3R5cGUmIF9fZGZhdWx0KSBjb25zdDsKKworICAgICAgLyoKKyAgICAgICAqICBAYnJpZWYgIENsb3NlIGEgbWVzc2FnZSBjYXRhbG9nLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fYyAgVGhlIGNhdGFsb2cgdG8gY2xvc2UuCisgICAgICAqLworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBkb19jbG9zZShjYXRhbG9nKSBjb25zdDsKKworICAgICAgLy8gUmV0dXJucyBhIGxvY2FsZSBhbmQgY29kZXNldC1jb252ZXJ0ZWQgc3RyaW5nLCBnaXZlbiBhIGNoYXIqIG1lc3NhZ2UuCisgICAgICBjaGFyKgorICAgICAgX01fY29udmVydF90b19jaGFyKGNvbnN0IHN0cmluZ190eXBlJiBfX21zZykgY29uc3QKKyAgICAgIHsKKwkvLyBYWFgKKwlyZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oY29uc3RfY2FzdDxfQ2hhclQqPihfX21zZy5jX3N0cigpKSk7CisgICAgICB9CisKKyAgICAgIC8vIFJldHVybnMgYSBsb2NhbGUgYW5kIGNvZGVzZXQtY29udmVydGVkIHN0cmluZywgZ2l2ZW4gYSBjaGFyKiBtZXNzYWdlLgorICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIF9NX2NvbnZlcnRfZnJvbV9jaGFyKGNoYXIqKSBjb25zdAorICAgICAgeworCS8vIFhYWAorCXJldHVybiBzdHJpbmdfdHlwZSgpOworICAgICAgfQorICAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBsb2NhbGU6OmlkIG1lc3NhZ2VzPF9DaGFyVD46OmlkOworCisgIC8vLyBTcGVjaWFsaXphdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLgorICB0ZW1wbGF0ZTw+CisgICAgc3RyaW5nCisgICAgbWVzc2FnZXM8Y2hhcj46OmRvX2dldChjYXRhbG9nLCBpbnQsIGludCwgY29uc3Qgc3RyaW5nJikgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgd3N0cmluZworICAgIG1lc3NhZ2VzPHdjaGFyX3Q+Ojpkb19nZXQoY2F0YWxvZywgaW50LCBpbnQsIGNvbnN0IHdzdHJpbmcmKSBjb25zdDsKKyNlbmRpZgorCisgICAvLy8gY2xhc3MgbWVzc2FnZXNfYnluYW1lIFsyMi4yLjcuMl0uCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgbWVzc2FnZXNfYnluYW1lIDogcHVibGljIG1lc3NhZ2VzPF9DaGFyVD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+CXN0cmluZ190eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgbWVzc2FnZXNfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfm1lc3NhZ2VzX2J5bmFtZSgpCisgICAgICB7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKy8vIEluY2x1ZGUgaG9zdCBhbmQgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBtZXNzYWdlcyBmdW5jdGlvbnMuCisjaW5jbHVkZSA8Yml0cy9tZXNzYWdlc19tZW1iZXJzLmg+CisKKy8vIDIyLjIuMS41ICBUZW1wbGF0ZSBjbGFzcyBjb2RlY3Z0CisjaW5jbHVkZSA8Yml0cy9jb2RlY3Z0Lmg+CisKKyNpbmNsdWRlIDxiaXRzL2xvY2FsZV9mYWNldHNfbm9uaW8udGNjPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVfZmFjZXRzX25vbmlvLnRjYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVfZmFjZXRzX25vbmlvLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjJkODNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZV9mYWNldHNfbm9uaW8udGNjCkBAIC0wLDAgKzEsMTM3MyBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvbG9jYWxlX2ZhY2V0c19ub25pby50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworI2lmbmRlZiBfTE9DQUxFX0ZBQ0VUU19OT05JT19UQ0MKKyNkZWZpbmUgX0xPQ0FMRV9GQUNFVFNfTk9OSU9fVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsPgorICAgIHN0cnVjdCBfX3VzZV9jYWNoZTxfX21vbmV5cHVuY3RfY2FjaGU8X0NoYXJULCBfSW50bD4gPgorICAgIHsKKyAgICAgIGNvbnN0IF9fbW9uZXlwdW5jdF9jYWNoZTxfQ2hhclQsIF9JbnRsPioKKyAgICAgIG9wZXJhdG9yKCkgKGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0CisgICAgICB7CisJY29uc3Qgc2l6ZV90IF9faSA9IG1vbmV5cHVuY3Q8X0NoYXJULCBfSW50bD46OmlkLl9NX2lkKCk7CisJY29uc3QgbG9jYWxlOjpmYWNldCoqIF9fY2FjaGVzID0gX19sb2MuX01faW1wbC0+X01fY2FjaGVzOworCWlmICghX19jYWNoZXNbX19pXSkKKwkgIHsKKwkgICAgX19tb25leXB1bmN0X2NhY2hlPF9DaGFyVCwgX0ludGw+KiBfX3RtcCA9IDA7CisJICAgIF9fdHJ5CisJICAgICAgeworCQlfX3RtcCA9IG5ldyBfX21vbmV5cHVuY3RfY2FjaGU8X0NoYXJULCBfSW50bD47CisJCV9fdG1wLT5fTV9jYWNoZShfX2xvYyk7CisJICAgICAgfQorCSAgICBfX2NhdGNoKC4uLikKKwkgICAgICB7CisJCWRlbGV0ZSBfX3RtcDsKKwkJX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgICAgfQorCSAgICBfX2xvYy5fTV9pbXBsLT5fTV9pbnN0YWxsX2NhY2hlKF9fdG1wLCBfX2kpOworCSAgfQorCXJldHVybiBzdGF0aWNfY2FzdDwKKwkgIGNvbnN0IF9fbW9uZXlwdW5jdF9jYWNoZTxfQ2hhclQsIF9JbnRsPio+KF9fY2FjaGVzW19faV0pOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsPgorICAgIHZvaWQKKyAgICBfX21vbmV5cHVuY3RfY2FjaGU8X0NoYXJULCBfSW50bD46Ol9NX2NhY2hlKGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeworICAgICAgX01fYWxsb2NhdGVkID0gdHJ1ZTsKKworICAgICAgY29uc3QgbW9uZXlwdW5jdDxfQ2hhclQsIF9JbnRsPiYgX19tcCA9CisJdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8X0NoYXJULCBfSW50bD4gPihfX2xvYyk7CisKKyAgICAgIF9NX2RlY2ltYWxfcG9pbnQgPSBfX21wLmRlY2ltYWxfcG9pbnQoKTsKKyAgICAgIF9NX3Rob3VzYW5kc19zZXAgPSBfX21wLnRob3VzYW5kc19zZXAoKTsKKyAgICAgIF9NX2ZyYWNfZGlnaXRzID0gX19tcC5mcmFjX2RpZ2l0cygpOworCisgICAgICBjaGFyKiBfX2dyb3VwaW5nID0gMDsKKyAgICAgIF9DaGFyVCogX19jdXJyX3N5bWJvbCA9IDA7CisgICAgICBfQ2hhclQqIF9fcG9zaXRpdmVfc2lnbiA9IDA7CisgICAgICBfQ2hhclQqIF9fbmVnYXRpdmVfc2lnbiA9IDA7ICAgICAKKyAgICAgIF9fdHJ5CisJeworCSAgX01fZ3JvdXBpbmdfc2l6ZSA9IF9fbXAuZ3JvdXBpbmcoKS5zaXplKCk7CisJICBfX2dyb3VwaW5nID0gbmV3IGNoYXJbX01fZ3JvdXBpbmdfc2l6ZV07CisJICBfX21wLmdyb3VwaW5nKCkuY29weShfX2dyb3VwaW5nLCBfTV9ncm91cGluZ19zaXplKTsKKwkgIF9NX2dyb3VwaW5nID0gX19ncm91cGluZzsKKwkgIF9NX3VzZV9ncm91cGluZyA9IChfTV9ncm91cGluZ19zaXplCisJCQkgICAgICYmIHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPihfTV9ncm91cGluZ1swXSkgPiAwCisJCQkgICAgICYmIChfTV9ncm91cGluZ1swXQorCQkJCSAhPSBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8Y2hhcj46Ol9fbWF4KSk7CisKKwkgIF9NX2N1cnJfc3ltYm9sX3NpemUgPSBfX21wLmN1cnJfc3ltYm9sKCkuc2l6ZSgpOworCSAgX19jdXJyX3N5bWJvbCA9IG5ldyBfQ2hhclRbX01fY3Vycl9zeW1ib2xfc2l6ZV07CisJICBfX21wLmN1cnJfc3ltYm9sKCkuY29weShfX2N1cnJfc3ltYm9sLCBfTV9jdXJyX3N5bWJvbF9zaXplKTsKKwkgIF9NX2N1cnJfc3ltYm9sID0gX19jdXJyX3N5bWJvbDsKKworCSAgX01fcG9zaXRpdmVfc2lnbl9zaXplID0gX19tcC5wb3NpdGl2ZV9zaWduKCkuc2l6ZSgpOworCSAgX19wb3NpdGl2ZV9zaWduID0gbmV3IF9DaGFyVFtfTV9wb3NpdGl2ZV9zaWduX3NpemVdOworCSAgX19tcC5wb3NpdGl2ZV9zaWduKCkuY29weShfX3Bvc2l0aXZlX3NpZ24sIF9NX3Bvc2l0aXZlX3NpZ25fc2l6ZSk7CisJICBfTV9wb3NpdGl2ZV9zaWduID0gX19wb3NpdGl2ZV9zaWduOworCisJICBfTV9uZWdhdGl2ZV9zaWduX3NpemUgPSBfX21wLm5lZ2F0aXZlX3NpZ24oKS5zaXplKCk7CisJICBfX25lZ2F0aXZlX3NpZ24gPSBuZXcgX0NoYXJUW19NX25lZ2F0aXZlX3NpZ25fc2l6ZV07CisJICBfX21wLm5lZ2F0aXZlX3NpZ24oKS5jb3B5KF9fbmVnYXRpdmVfc2lnbiwgX01fbmVnYXRpdmVfc2lnbl9zaXplKTsKKwkgIF9NX25lZ2F0aXZlX3NpZ24gPSBfX25lZ2F0aXZlX3NpZ247CisKKwkgIF9NX3Bvc19mb3JtYXQgPSBfX21wLnBvc19mb3JtYXQoKTsKKwkgIF9NX25lZ19mb3JtYXQgPSBfX21wLm5lZ19mb3JtYXQoKTsKKworCSAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdCA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworCSAgX19jdC53aWRlbihtb25leV9iYXNlOjpfU19hdG9tcywKKwkJICAgICBtb25leV9iYXNlOjpfU19hdG9tcyArIG1vbmV5X2Jhc2U6Ol9TX2VuZCwgX01fYXRvbXMpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGRlbGV0ZSBbXSBfX2dyb3VwaW5nOworCSAgZGVsZXRlIFtdIF9fY3Vycl9zeW1ib2w7CisJICBkZWxldGUgW10gX19wb3NpdGl2ZV9zaWduOworCSAgZGVsZXRlIFtdIF9fbmVnYXRpdmVfc2lnbjsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9MREJMCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIHRlbXBsYXRlPGJvb2wgX0ludGw+CisgICAgICBfSW5JdGVyCisgICAgICBtb25leV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgICBfTV9leHRyYWN0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkJIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgc3RyaW5nJiBfX3VuaXRzKSBjb25zdAorICAgICAgeworCXR5cGVkZWYgY2hhcl90cmFpdHM8X0NoYXJUPgkJCSAgX190cmFpdHNfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0cmluZ190eXBlOjpzaXplX3R5cGUJICAgICAgICAgIHNpemVfdHlwZTsJCisJdHlwZWRlZiBtb25leV9iYXNlOjpwYXJ0CQkJICBwYXJ0OworCXR5cGVkZWYgX19tb25leXB1bmN0X2NhY2hlPF9DaGFyVCwgX0ludGw+ICAgICAgICAgX19jYWNoZV90eXBlOworCQorCWNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCWNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKworCV9fdXNlX2NhY2hlPF9fY2FjaGVfdHlwZT4gX191YzsKKwljb25zdCBfX2NhY2hlX3R5cGUqIF9fbGMgPSBfX3VjKF9fbG9jKTsKKwljb25zdCBjaGFyX3R5cGUqIF9fbGl0ID0gX19sYy0+X01fYXRvbXM7CisKKwkvLyBEZWR1Y2VkIHNpZ24uCisJYm9vbCBfX25lZ2F0aXZlID0gZmFsc2U7CisJLy8gU2lnbiBzaXplLgorCXNpemVfdHlwZSBfX3NpZ25fc2l6ZSA9IDA7CisJLy8gVHJ1ZSBpZiBzaWduIGlzIG1hbmRhdG9yeS4KKwljb25zdCBib29sIF9fbWFuZGF0b3J5X3NpZ24gPSAoX19sYy0+X01fcG9zaXRpdmVfc2lnbl9zaXplCisJCQkJICAgICAgICYmIF9fbGMtPl9NX25lZ2F0aXZlX3NpZ25fc2l6ZSk7CisJLy8gU3RyaW5nIG9mIGdyb3VwaW5nIGluZm8gZnJvbSB0aG91c2FuZHNfc2VwIHBsdWNrZWQgZnJvbSBfX3VuaXRzLgorCXN0cmluZyBfX2dyb3VwaW5nX3RtcDsKKwlpZiAoX19sYy0+X01fdXNlX2dyb3VwaW5nKQorCSAgX19ncm91cGluZ190bXAucmVzZXJ2ZSgzMik7CisJLy8gTGFzdCBwb3NpdGlvbiBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQuCisJaW50IF9fbGFzdF9wb3MgPSAwOworCS8vIFNlcGFyYXRvciBwb3NpdGlvbnMsIHRoZW4sIHBvc3NpYmx5LCBmcmFjdGlvbmFsIGRpZ2l0cy4KKwlpbnQgX19uID0gMDsKKwkvLyBJZiBpbnB1dCBpdGVyYXRvciBpcyBpbiBhIHZhbGlkIHN0YXRlLgorCWJvb2wgX190ZXN0dmFsaWQgPSB0cnVlOworCS8vIEZsYWcgbWFya2luZyB3aGVuIGEgZGVjaW1hbCBwb2ludCBpcyBmb3VuZC4KKwlib29sIF9fdGVzdGRlY2ZvdW5kID0gZmFsc2U7CisKKwkvLyBUaGUgdGVudGF0aXZlIHJldHVybmVkIHN0cmluZyBpcyBzdG9yZWQgaGVyZS4KKwlzdHJpbmcgX19yZXM7CisJX19yZXMucmVzZXJ2ZSgzMik7CisKKwljb25zdCBjaGFyX3R5cGUqIF9fbGl0X3plcm8gPSBfX2xpdCArIG1vbmV5X2Jhc2U6Ol9TX3plcm87CisJY29uc3QgbW9uZXlfYmFzZTo6cGF0dGVybiBfX3AgPSBfX2xjLT5fTV9uZWdfZm9ybWF0OworCWZvciAoaW50IF9faSA9IDA7IF9faSA8IDQgJiYgX190ZXN0dmFsaWQ7ICsrX19pKQorCSAgeworCSAgICBjb25zdCBwYXJ0IF9fd2hpY2ggPSBzdGF0aWNfY2FzdDxwYXJ0PihfX3AuZmllbGRbX19pXSk7CisJICAgIHN3aXRjaCAoX193aGljaCkKKwkgICAgICB7CisJICAgICAgY2FzZSBtb25leV9iYXNlOjpzeW1ib2w6CisJCS8vIEFjY29yZGluZyB0byAyMi4yLjYuMS4yLCBwMiwgc3ltYm9sIGlzIHJlcXVpcmVkCisJCS8vIGlmIChfX2lvLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2hvd2Jhc2UpLCBvdGhlcndpc2UKKwkJLy8gaXMgb3B0aW9uYWwgYW5kIGNvbnN1bWVkIG9ubHkgaWYgb3RoZXIgY2hhcmFjdGVycworCQkvLyBhcmUgbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBmb3JtYXQuCisJCWlmIChfX2lvLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2hvd2Jhc2UgfHwgX19zaWduX3NpemUgPiAxCisJCSAgICB8fCBfX2kgPT0gMAorCQkgICAgfHwgKF9faSA9PSAxICYmIChfX21hbmRhdG9yeV9zaWduCisJCQkJICAgICB8fCAoc3RhdGljX2Nhc3Q8cGFydD4oX19wLmZpZWxkWzBdKQorCQkJCQkgPT0gbW9uZXlfYmFzZTo6c2lnbikKKwkJCQkgICAgIHx8IChzdGF0aWNfY2FzdDxwYXJ0PihfX3AuZmllbGRbMl0pCisJCQkJCSA9PSBtb25leV9iYXNlOjpzcGFjZSkpKQorCQkgICAgfHwgKF9faSA9PSAyICYmICgoc3RhdGljX2Nhc3Q8cGFydD4oX19wLmZpZWxkWzNdKQorCQkJCSAgICAgID09IG1vbmV5X2Jhc2U6OnZhbHVlKQorCQkJCSAgICAgfHwgKF9fbWFuZGF0b3J5X3NpZ24KKwkJCQkJICYmIChzdGF0aWNfY2FzdDxwYXJ0PihfX3AuZmllbGRbM10pCisJCQkJCSAgICAgPT0gbW9uZXlfYmFzZTo6c2lnbikpKSkpCisJCSAgeworCQkgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gX19sYy0+X01fY3Vycl9zeW1ib2xfc2l6ZTsKKwkJICAgIHNpemVfdHlwZSBfX2ogPSAwOworCQkgICAgZm9yICg7IF9fYmVnICE9IF9fZW5kICYmIF9faiA8IF9fbGVuCisJCQkgICAmJiAqX19iZWcgPT0gX19sYy0+X01fY3Vycl9zeW1ib2xbX19qXTsKKwkJCSArK19fYmVnLCArK19faik7CisJCSAgICBpZiAoX19qICE9IF9fbGVuCisJCQkmJiAoX19qIHx8IF9faW8uZmxhZ3MoKSAmIGlvc19iYXNlOjpzaG93YmFzZSkpCisJCSAgICAgIF9fdGVzdHZhbGlkID0gZmFsc2U7CisJCSAgfQorCQlicmVhazsKKwkgICAgICBjYXNlIG1vbmV5X2Jhc2U6OnNpZ246CisJCS8vIFNpZ24gbWlnaHQgbm90IGV4aXN0LCBvciBiZSBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciBsb25nLgorCQlpZiAoX19sYy0+X01fcG9zaXRpdmVfc2lnbl9zaXplICYmIF9fYmVnICE9IF9fZW5kCisJCSAgICAmJiAqX19iZWcgPT0gX19sYy0+X01fcG9zaXRpdmVfc2lnblswXSkKKwkJICB7CisJCSAgICBfX3NpZ25fc2l6ZSA9IF9fbGMtPl9NX3Bvc2l0aXZlX3NpZ25fc2l6ZTsKKwkJICAgICsrX19iZWc7CisJCSAgfQorCQllbHNlIGlmIChfX2xjLT5fTV9uZWdhdGl2ZV9zaWduX3NpemUgJiYgX19iZWcgIT0gX19lbmQKKwkJCSAmJiAqX19iZWcgPT0gX19sYy0+X01fbmVnYXRpdmVfc2lnblswXSkKKwkJICB7CisJCSAgICBfX25lZ2F0aXZlID0gdHJ1ZTsKKwkJICAgIF9fc2lnbl9zaXplID0gX19sYy0+X01fbmVnYXRpdmVfc2lnbl9zaXplOworCQkgICAgKytfX2JlZzsKKwkJICB9CisJCWVsc2UgaWYgKF9fbGMtPl9NX3Bvc2l0aXZlX3NpZ25fc2l6ZQorCQkJICYmICFfX2xjLT5fTV9uZWdhdGl2ZV9zaWduX3NpemUpCisJCSAgLy8gIi4uLiBpZiBubyBzaWduIGlzIGRldGVjdGVkLCB0aGUgcmVzdWx0IGlzIGdpdmVuIHRoZSBzaWduCisJCSAgLy8gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc291cmNlIG9mIHRoZSBlbXB0eSBzdHJpbmciCisJCSAgX19uZWdhdGl2ZSA9IHRydWU7CisJCWVsc2UgaWYgKF9fbWFuZGF0b3J5X3NpZ24pCisJCSAgX190ZXN0dmFsaWQgPSBmYWxzZTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBtb25leV9iYXNlOjp2YWx1ZToKKwkJLy8gRXh0cmFjdCBkaWdpdHMsIHJlbW92ZSBhbmQgc3Rhc2ggYXdheSB0aGUKKwkJLy8gZ3JvdXBpbmcgb2YgZm91bmQgdGhvdXNhbmRzIHNlcGFyYXRvcnMuCisJCWZvciAoOyBfX2JlZyAhPSBfX2VuZDsgKytfX2JlZykKKwkJICB7CisJCSAgICBjb25zdCBjaGFyX3R5cGUgX19jID0gKl9fYmVnOworCQkgICAgY29uc3QgY2hhcl90eXBlKiBfX3EgPSBfX3RyYWl0c190eXBlOjpmaW5kKF9fbGl0X3plcm8sIAorCQkJCQkJCSAgICAgICAxMCwgX19jKTsKKwkJICAgIGlmIChfX3EgIT0gMCkKKwkJICAgICAgeworCQkJX19yZXMgKz0gbW9uZXlfYmFzZTo6X1NfYXRvbXNbX19xIC0gX19saXRdOworCQkJKytfX247CisJCSAgICAgIH0KKwkJICAgIGVsc2UgaWYgKF9fYyA9PSBfX2xjLT5fTV9kZWNpbWFsX3BvaW50IAorCQkJICAgICAmJiAhX190ZXN0ZGVjZm91bmQpCisJCSAgICAgIHsKKwkJCWlmIChfX2xjLT5fTV9mcmFjX2RpZ2l0cyA8PSAwKQorCQkJICBicmVhazsKKworCQkJX19sYXN0X3BvcyA9IF9fbjsKKwkJCV9fbiA9IDA7CisJCQlfX3Rlc3RkZWNmb3VuZCA9IHRydWU7CisJCSAgICAgIH0KKwkJICAgIGVsc2UgaWYgKF9fbGMtPl9NX3VzZV9ncm91cGluZworCQkJICAgICAmJiBfX2MgPT0gX19sYy0+X01fdGhvdXNhbmRzX3NlcAorCQkJICAgICAmJiAhX190ZXN0ZGVjZm91bmQpCisJCSAgICAgIHsKKwkJCWlmIChfX24pCisJCQkgIHsKKwkJCSAgICAvLyBNYXJrIHBvc2l0aW9uIGZvciBsYXRlciBhbmFseXNpcy4KKwkJCSAgICBfX2dyb3VwaW5nX3RtcCArPSBzdGF0aWNfY2FzdDxjaGFyPihfX24pOworCQkJICAgIF9fbiA9IDA7CisJCQkgIH0KKwkJCWVsc2UKKwkJCSAgeworCQkJICAgIF9fdGVzdHZhbGlkID0gZmFsc2U7CisJCQkgICAgYnJlYWs7CisJCQkgIH0KKwkJICAgICAgfQorCQkgICAgZWxzZQorCQkgICAgICBicmVhazsKKwkJICB9CisJCWlmIChfX3Jlcy5lbXB0eSgpKQorCQkgIF9fdGVzdHZhbGlkID0gZmFsc2U7CisJCWJyZWFrOworCSAgICAgIGNhc2UgbW9uZXlfYmFzZTo6c3BhY2U6CisJCS8vIEF0IGxlYXN0IG9uZSBzcGFjZSBpcyByZXF1aXJlZC4KKwkJaWYgKF9fYmVnICE9IF9fZW5kICYmIF9fY3R5cGUuaXMoY3R5cGVfYmFzZTo6c3BhY2UsICpfX2JlZykpCisJCSAgKytfX2JlZzsKKwkJZWxzZQorCQkgIF9fdGVzdHZhbGlkID0gZmFsc2U7CisJICAgICAgY2FzZSBtb25leV9iYXNlOjpub25lOgorCQkvLyBPbmx5IGlmIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLgorCQlpZiAoX19pICE9IDMpCisJCSAgZm9yICg7IF9fYmVnICE9IF9fZW5kCisJCQkgJiYgX19jdHlwZS5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgKl9fYmVnKTsgKytfX2JlZyk7CisJCWJyZWFrOworCSAgICAgIH0KKwkgIH0KKworCS8vIE5lZWQgdG8gZ2V0IHRoZSByZXN0IG9mIHRoZSBzaWduIGNoYXJhY3RlcnMsIGlmIHRoZXkgZXhpc3QuCisJaWYgKF9fc2lnbl9zaXplID4gMSAmJiBfX3Rlc3R2YWxpZCkKKwkgIHsKKwkgICAgY29uc3QgY2hhcl90eXBlKiBfX3NpZ24gPSBfX25lZ2F0aXZlID8gX19sYy0+X01fbmVnYXRpdmVfc2lnbgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX2xjLT5fTV9wb3NpdGl2ZV9zaWduOworCSAgICBzaXplX3R5cGUgX19pID0gMTsKKwkgICAgZm9yICg7IF9fYmVnICE9IF9fZW5kICYmIF9faSA8IF9fc2lnbl9zaXplCisJCSAgICYmICpfX2JlZyA9PSBfX3NpZ25bX19pXTsgKytfX2JlZywgKytfX2kpOworCSAgICAKKwkgICAgaWYgKF9faSAhPSBfX3NpZ25fc2l6ZSkKKwkgICAgICBfX3Rlc3R2YWxpZCA9IGZhbHNlOworCSAgfQorCisJaWYgKF9fdGVzdHZhbGlkKQorCSAgeworCSAgICAvLyBTdHJpcCBsZWFkaW5nIHplcm9zLgorCSAgICBpZiAoX19yZXMuc2l6ZSgpID4gMSkKKwkgICAgICB7CisJCWNvbnN0IHNpemVfdHlwZSBfX2ZpcnN0ID0gX19yZXMuZmluZF9maXJzdF9ub3Rfb2YoJzAnKTsKKwkJY29uc3QgYm9vbCBfX29ubHlfemVyb3MgPSBfX2ZpcnN0ID09IHN0cmluZzo6bnBvczsKKwkJaWYgKF9fZmlyc3QpCisJCSAgX19yZXMuZXJhc2UoMCwgX19vbmx5X3plcm9zID8gX19yZXMuc2l6ZSgpIC0gMSA6IF9fZmlyc3QpOworCSAgICAgIH0KKworCSAgICAvLyAyMi4yLjYuMS4yLCBwNAorCSAgICBpZiAoX19uZWdhdGl2ZSAmJiBfX3Jlc1swXSAhPSAnMCcpCisJICAgICAgX19yZXMuaW5zZXJ0KF9fcmVzLmJlZ2luKCksICctJyk7CisJICAgIAorCSAgICAvLyBUZXN0IGZvciBncm91cGluZyBmaWRlbGl0eS4KKwkgICAgaWYgKF9fZ3JvdXBpbmdfdG1wLnNpemUoKSkKKwkgICAgICB7CisJCS8vIEFkZCB0aGUgZW5kaW5nIGdyb3VwaW5nLgorCQlfX2dyb3VwaW5nX3RtcCArPSBzdGF0aWNfY2FzdDxjaGFyPihfX3Rlc3RkZWNmb3VuZCA/IF9fbGFzdF9wb3MKKwkJCQkJCSAgICAgICAgICAgICAgICAgICA6IF9fbik7CisJCWlmICghc3RkOjpfX3ZlcmlmeV9ncm91cGluZyhfX2xjLT5fTV9ncm91cGluZywKKwkJCQkJICAgIF9fbGMtPl9NX2dyb3VwaW5nX3NpemUsCisJCQkJCSAgICBfX2dyb3VwaW5nX3RtcCkpCisJCSAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgICAgfQorCSAgICAKKwkgICAgLy8gSWZmIG5vdCBlbm91Z2ggZGlnaXRzIHdlcmUgc3VwcGxpZWQgYWZ0ZXIgdGhlIGRlY2ltYWwtcG9pbnQuCisJICAgIGlmIChfX3Rlc3RkZWNmb3VuZCAmJiBfX24gIT0gX19sYy0+X01fZnJhY19kaWdpdHMpCisJICAgICAgX190ZXN0dmFsaWQgPSBmYWxzZTsKKwkgIH0KKworCS8vIElmZiB2YWxpZCBzZXF1ZW5jZSBpcyBub3QgcmVjb2duaXplZC4KKwlpZiAoIV9fdGVzdHZhbGlkKQorCSAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJZWxzZQorCSAgX191bml0cy5zd2FwKF9fcmVzKTsKKwkKKwkvLyBJZmYgbm8gbW9yZSBjaGFyYWN0ZXJzIGFyZSBhdmFpbGFibGUuCisJaWYgKF9fYmVnID09IF9fZW5kKQorCSAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwlyZXR1cm4gX19iZWc7CisgICAgICB9CisKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0xPTkdfRE9VQkxFX0NPTVBBVCAmJiBkZWZpbmVkIF9fTE9OR19ET1VCTEVfMTI4X18KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICBtb25leV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgX19kb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgZG91YmxlJiBfX3VuaXRzKSBjb25zdAorICAgIHsKKyAgICAgIHN0cmluZyBfX3N0cjsKKyAgICAgIF9fYmVnID0gX19pbnRsID8gX01fZXh0cmFjdDx0cnVlPihfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3N0cikKKyAgICAgICAgICAgICAgICAgICAgIDogX01fZXh0cmFjdDxmYWxzZT4oX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX19zdHIpOworICAgICAgc3RkOjpfX2NvbnZlcnRfdG9fdihfX3N0ci5jX3N0cigpLCBfX3VuaXRzLCBfX2VyciwgX1NfZ2V0X2NfbG9jYWxlKCkpOworICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgbW9uZXlfZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgIGRvX2dldChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLAorCSAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBkb3VibGUmIF9fdW5pdHMpIGNvbnN0CisgICAgeworICAgICAgc3RyaW5nIF9fc3RyOworICAgICAgX19iZWcgPSBfX2ludGwgPyBfTV9leHRyYWN0PHRydWU+KF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fc3RyKQorCSAgICAgICAgICAgICA6IF9NX2V4dHJhY3Q8ZmFsc2U+KF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fc3RyKTsKKyAgICAgIHN0ZDo6X19jb252ZXJ0X3RvX3YoX19zdHIuY19zdHIoKSwgX191bml0cywgX19lcnIsIF9TX2dldF9jX2xvY2FsZSgpKTsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICBtb25leV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sCisJICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdHJpbmc6OnNpemVfdHlwZSAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisKKyAgICAgIHN0cmluZyBfX3N0cjsKKyAgICAgIF9fYmVnID0gX19pbnRsID8gX01fZXh0cmFjdDx0cnVlPihfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3N0cikKKwkgICAgICAgICAgICAgOiBfTV9leHRyYWN0PGZhbHNlPihfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3N0cik7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX3N0ci5zaXplKCk7CisgICAgICBpZiAoX19sZW4pCisJeworCSAgX19kaWdpdHMucmVzaXplKF9fbGVuKTsKKwkgIF9fY3R5cGUud2lkZW4oX19zdHIuZGF0YSgpLCBfX3N0ci5kYXRhKCkgKyBfX2xlbiwgJl9fZGlnaXRzWzBdKTsKKwl9CisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgdGVtcGxhdGU8Ym9vbCBfSW50bD4KKyAgICAgIF9PdXRJdGVyCisgICAgICBtb25leV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgICAgX01faW5zZXJ0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCQljb25zdCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0CisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBzdHJpbmdfdHlwZTo6c2l6ZV90eXBlCSAgICAgICAgICBzaXplX3R5cGU7CisJdHlwZWRlZiBtb25leV9iYXNlOjpwYXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0OworCXR5cGVkZWYgX19tb25leXB1bmN0X2NhY2hlPF9DaGFyVCwgX0ludGw+ICAgICAgICAgX19jYWNoZV90eXBlOworICAgICAgCisJY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisJY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworCisJX191c2VfY2FjaGU8X19jYWNoZV90eXBlPiBfX3VjOworCWNvbnN0IF9fY2FjaGVfdHlwZSogX19sYyA9IF9fdWMoX19sb2MpOworCWNvbnN0IGNoYXJfdHlwZSogX19saXQgPSBfX2xjLT5fTV9hdG9tczsKKworCS8vIERldGVybWluZSBpZiBuZWdhdGl2ZSBvciBwb3NpdGl2ZSBmb3JtYXRzIGFyZSB0byBiZSB1c2VkLCBhbmQKKwkvLyBkaXNjYXJkIGxlYWRpbmcgbmVnYXRpdmVfc2lnbiBpZiBpdCBpcyBwcmVzZW50LgorCWNvbnN0IGNoYXJfdHlwZSogX19iZWcgPSBfX2RpZ2l0cy5kYXRhKCk7CisKKwltb25leV9iYXNlOjpwYXR0ZXJuIF9fcDsKKwljb25zdCBjaGFyX3R5cGUqIF9fc2lnbjsKKwlzaXplX3R5cGUgX19zaWduX3NpemU7CisJaWYgKCEoKl9fYmVnID09IF9fbGl0W21vbmV5X2Jhc2U6Ol9TX21pbnVzXSkpCisJICB7CisJICAgIF9fcCA9IF9fbGMtPl9NX3Bvc19mb3JtYXQ7CisJICAgIF9fc2lnbiA9IF9fbGMtPl9NX3Bvc2l0aXZlX3NpZ247CisJICAgIF9fc2lnbl9zaXplID0gX19sYy0+X01fcG9zaXRpdmVfc2lnbl9zaXplOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgX19wID0gX19sYy0+X01fbmVnX2Zvcm1hdDsKKwkgICAgX19zaWduID0gX19sYy0+X01fbmVnYXRpdmVfc2lnbjsKKwkgICAgX19zaWduX3NpemUgPSBfX2xjLT5fTV9uZWdhdGl2ZV9zaWduX3NpemU7CisJICAgIGlmIChfX2RpZ2l0cy5zaXplKCkpCisJICAgICAgKytfX2JlZzsKKwkgIH0KKyAgICAgICAKKwkvLyBMb29rIGZvciB2YWxpZCBudW1iZXJzIGluIHRoZSBjdHlwZSBmYWNldCB3aXRoaW4gaW5wdXQgZGlnaXRzLgorCXNpemVfdHlwZSBfX2xlbiA9IF9fY3R5cGUuc2Nhbl9ub3QoY3R5cGVfYmFzZTo6ZGlnaXQsIF9fYmVnLAorCQkJCQkgICBfX2JlZyArIF9fZGlnaXRzLnNpemUoKSkgLSBfX2JlZzsKKwlpZiAoX19sZW4pCisJICB7CisJICAgIC8vIEFzc3VtZSB2YWxpZCBpbnB1dCwgYW5kIGF0dGVtcHQgdG8gZm9ybWF0LgorCSAgICAvLyBCcmVhayBkb3duIGlucHV0IG51bWJlcnMgaW50byBiYXNlIGNvbXBvbmVudHMsIGFzIGZvbGxvd3M6CisJICAgIC8vICAgZmluYWxfdmFsdWUgPSBncm91cGVkIHVuaXRzICsgKGRlY2ltYWwgcG9pbnQpICsgKGRpZ2l0cykKKwkgICAgc3RyaW5nX3R5cGUgX192YWx1ZTsKKwkgICAgX192YWx1ZS5yZXNlcnZlKDIgKiBfX2xlbik7CisKKwkgICAgLy8gQWRkIHRob3VzYW5kcyBzZXBhcmF0b3JzIHRvIG5vbi1kZWNpbWFsIGRpZ2l0cywgcGVyCisJICAgIC8vIGdyb3VwaW5nIHJ1bGVzLgorCSAgICBsb25nIF9fcGFkZGVjID0gX19sZW4gLSBfX2xjLT5fTV9mcmFjX2RpZ2l0czsKKwkgICAgaWYgKF9fcGFkZGVjID4gMCkKKyAgCSAgICAgIHsKKwkJaWYgKF9fbGMtPl9NX2ZyYWNfZGlnaXRzIDwgMCkKKwkJICBfX3BhZGRlYyA9IF9fbGVuOworICAJCWlmIChfX2xjLT5fTV9ncm91cGluZ19zaXplKQorICAJCSAgeworCQkgICAgX192YWx1ZS5hc3NpZ24oMiAqIF9fcGFkZGVjLCBjaGFyX3R5cGUoKSk7CisgCQkgICAgX0NoYXJUKiBfX3ZlbmQgPSAKKwkJICAgICAgc3RkOjpfX2FkZF9ncm91cGluZygmX192YWx1ZVswXSwgX19sYy0+X01fdGhvdXNhbmRzX3NlcCwKKwkJCQkJICBfX2xjLT5fTV9ncm91cGluZywKKwkJCQkJICBfX2xjLT5fTV9ncm91cGluZ19zaXplLAorCQkJCQkgIF9fYmVnLCBfX2JlZyArIF9fcGFkZGVjKTsKKwkJICAgIF9fdmFsdWUuZXJhc2UoX192ZW5kIC0gJl9fdmFsdWVbMF0pOworICAJCSAgfQorICAJCWVsc2UKKwkJICBfX3ZhbHVlLmFzc2lnbihfX2JlZywgX19wYWRkZWMpOworCSAgICAgIH0KKworCSAgICAvLyBEZWFsIHdpdGggZGVjaW1hbCBwb2ludCwgZGVjaW1hbCBkaWdpdHMuCisJICAgIGlmIChfX2xjLT5fTV9mcmFjX2RpZ2l0cyA+IDApCisJICAgICAgeworCQlfX3ZhbHVlICs9IF9fbGMtPl9NX2RlY2ltYWxfcG9pbnQ7CisJCWlmIChfX3BhZGRlYyA+PSAwKQorCQkgIF9fdmFsdWUuYXBwZW5kKF9fYmVnICsgX19wYWRkZWMsIF9fbGMtPl9NX2ZyYWNfZGlnaXRzKTsKKwkJZWxzZQorCQkgIHsKKwkJICAgIC8vIEhhdmUgdG8gcGFkIHplcm9zIGluIHRoZSBkZWNpbWFsIHBvc2l0aW9uLgorCQkgICAgX192YWx1ZS5hcHBlbmQoLV9fcGFkZGVjLCBfX2xpdFttb25leV9iYXNlOjpfU196ZXJvXSk7CisJCSAgICBfX3ZhbHVlLmFwcGVuZChfX2JlZywgX19sZW4pOworCQkgIH0KKyAgCSAgICAgIH0KKyAgCisJICAgIC8vIENhbGN1bGF0ZSBsZW5ndGggb2YgcmVzdWx0aW5nIHN0cmluZy4KKwkgICAgY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZiA9IF9faW8uZmxhZ3MoKSAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkOworCSAgICBfX2xlbiA9IF9fdmFsdWUuc2l6ZSgpICsgX19zaWduX3NpemU7CisJICAgIF9fbGVuICs9ICgoX19pby5mbGFncygpICYgaW9zX2Jhc2U6OnNob3diYXNlKQorCQkgICAgICA/IF9fbGMtPl9NX2N1cnJfc3ltYm9sX3NpemUgOiAwKTsKKworCSAgICBzdHJpbmdfdHlwZSBfX3JlczsKKwkgICAgX19yZXMucmVzZXJ2ZSgyICogX19sZW4pOworCSAgICAKKwkgICAgY29uc3Qgc2l6ZV90eXBlIF9fd2lkdGggPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9faW8ud2lkdGgoKSk7ICAKKwkgICAgY29uc3QgYm9vbCBfX3Rlc3RpcGFkID0gKF9fZiA9PSBpb3NfYmFzZTo6aW50ZXJuYWwKKwkJCQkgICAgICYmIF9fbGVuIDwgX193aWR0aCk7CisJICAgIC8vIEZpdCBmb3JtYXR0ZWQgZGlnaXRzIGludG8gdGhlIHJlcXVpcmVkIHBhdHRlcm4uCisJICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IDQ7ICsrX19pKQorCSAgICAgIHsKKwkJY29uc3QgcGFydCBfX3doaWNoID0gc3RhdGljX2Nhc3Q8cGFydD4oX19wLmZpZWxkW19faV0pOworCQlzd2l0Y2ggKF9fd2hpY2gpCisJCSAgeworCQkgIGNhc2UgbW9uZXlfYmFzZTo6c3ltYm9sOgorCQkgICAgaWYgKF9faW8uZmxhZ3MoKSAmIGlvc19iYXNlOjpzaG93YmFzZSkKKwkJICAgICAgX19yZXMuYXBwZW5kKF9fbGMtPl9NX2N1cnJfc3ltYm9sLAorCQkJCSAgIF9fbGMtPl9NX2N1cnJfc3ltYm9sX3NpemUpOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBtb25leV9iYXNlOjpzaWduOgorCQkgICAgLy8gU2lnbiBtaWdodCBub3QgZXhpc3QsIG9yIGJlIG1vcmUgdGhhbiBvbmUKKwkJICAgIC8vIGNoYXJhY3RlciBsb25nLiBJbiB0aGF0IGNhc2UsIGFkZCBpbiB0aGUgcmVzdAorCQkgICAgLy8gYmVsb3cuCisJCSAgICBpZiAoX19zaWduX3NpemUpCisJCSAgICAgIF9fcmVzICs9IF9fc2lnblswXTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgbW9uZXlfYmFzZTo6dmFsdWU6CisJCSAgICBfX3JlcyArPSBfX3ZhbHVlOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBtb25leV9iYXNlOjpzcGFjZToKKwkJICAgIC8vIEF0IGxlYXN0IG9uZSBzcGFjZSBpcyByZXF1aXJlZCwgYnV0IGlmIGludGVybmFsCisJCSAgICAvLyBmb3JtYXR0aW5nIGlzIHJlcXVpcmVkLCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mCisJCSAgICAvLyBmaWxsIHNwYWNlcyB3aWxsIGJlIG5lY2Vzc2FyeS4KKwkJICAgIGlmIChfX3Rlc3RpcGFkKQorCQkgICAgICBfX3Jlcy5hcHBlbmQoX193aWR0aCAtIF9fbGVuLCBfX2ZpbGwpOworCQkgICAgZWxzZQorCQkgICAgICBfX3JlcyArPSBfX2ZpbGw7CisJCSAgICBicmVhazsKKwkJICBjYXNlIG1vbmV5X2Jhc2U6Om5vbmU6CisJCSAgICBpZiAoX190ZXN0aXBhZCkKKwkJICAgICAgX19yZXMuYXBwZW5kKF9fd2lkdGggLSBfX2xlbiwgX19maWxsKTsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisJICAgIAorCSAgICAvLyBTcGVjaWFsIGNhc2Ugb2YgbXVsdGktcGFydCBzaWduIHBhcnRzLgorCSAgICBpZiAoX19zaWduX3NpemUgPiAxKQorCSAgICAgIF9fcmVzLmFwcGVuZChfX3NpZ24gKyAxLCBfX3NpZ25fc2l6ZSAtIDEpOworCSAgICAKKwkgICAgLy8gUGFkLCBpZiBzdGlsbCBuZWNlc3NhcnkuCisJICAgIF9fbGVuID0gX19yZXMuc2l6ZSgpOworCSAgICBpZiAoX193aWR0aCA+IF9fbGVuKQorCSAgICAgIHsKKwkJaWYgKF9fZiA9PSBpb3NfYmFzZTo6bGVmdCkKKwkJICAvLyBBZnRlci4KKwkJICBfX3Jlcy5hcHBlbmQoX193aWR0aCAtIF9fbGVuLCBfX2ZpbGwpOworCQllbHNlCisJCSAgLy8gQmVmb3JlLgorCQkgIF9fcmVzLmluc2VydCgwLCBfX3dpZHRoIC0gX19sZW4sIF9fZmlsbCk7CisJCV9fbGVuID0gX193aWR0aDsKKwkgICAgICB9CisJICAgIAorCSAgICAvLyBXcml0ZSByZXN1bHRpbmcsIGZ1bGx5LWZvcm1hdHRlZCBzdHJpbmcgdG8gb3V0cHV0IGl0ZXJhdG9yLgorCSAgICBfX3MgPSBzdGQ6Ol9fd3JpdGUoX19zLCBfX3Jlcy5kYXRhKCksIF9fbGVuKTsKKwkgIH0KKwlfX2lvLndpZHRoKDApOworCXJldHVybiBfX3M7ICAgIAorICAgICAgfQorCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgX091dEl0ZXIKKyAgICBtb25leV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgIF9fZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkgICAgIGRvdWJsZSBfX3VuaXRzKSBjb25zdAorICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9faW50bCwgX19pbywgX19maWxsLCAobG9uZyBkb3VibGUpIF9fdW5pdHMpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIF9PdXRJdGVyCisgICAgbW9uZXlfcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgIGxvbmcgZG91YmxlIF9fdW5pdHMpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgbG9jYWxlIF9fbG9jID0gX19pby5nZXRsb2MoKTsKKyAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5CisgICAgICAvLyBGaXJzdCB0cnkgYSBidWZmZXIgcGVyaGFwcyBiaWcgZW5vdWdoLgorICAgICAgaW50IF9fY3Nfc2l6ZSA9IDY0OworICAgICAgY2hhciogX19jcyA9IHN0YXRpY19jYXN0PGNoYXIqPihfX2J1aWx0aW5fYWxsb2NhKF9fY3Nfc2l6ZSkpOworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzI4LiBCYWQgc3ByaW50ZiBmb3JtYXQgbW9kaWZpZXIgaW4gbW9uZXlfcHV0PD46OmRvX3B1dCgpCisgICAgICBpbnQgX19sZW4gPSBzdGQ6Ol9fY29udmVydF9mcm9tX3YoX1NfZ2V0X2NfbG9jYWxlKCksIF9fY3MsIF9fY3Nfc2l6ZSwKKwkJCQkJIiUuKkxmIiwgMCwgX191bml0cyk7CisgICAgICAvLyBJZiB0aGUgYnVmZmVyIHdhcyBub3QgbGFyZ2UgZW5vdWdoLCB0cnkgYWdhaW4gd2l0aCB0aGUgY29ycmVjdCBzaXplLgorICAgICAgaWYgKF9fbGVuID49IF9fY3Nfc2l6ZSkKKwl7CisJICBfX2NzX3NpemUgPSBfX2xlbiArIDE7CisJICBfX2NzID0gc3RhdGljX2Nhc3Q8Y2hhcio+KF9fYnVpbHRpbl9hbGxvY2EoX19jc19zaXplKSk7CisJICBfX2xlbiA9IHN0ZDo6X19jb252ZXJ0X2Zyb21fdihfU19nZXRfY19sb2NhbGUoKSwgX19jcywgX19jc19zaXplLAorCQkJCQkiJS4qTGYiLCAwLCBfX3VuaXRzKTsKKwl9CisjZWxzZQorICAgICAgLy8gbWF4X2V4cG9uZW50MTAgKyAxIGZvciB0aGUgaW50ZWdlciBwYXJ0LCArIDIgZm9yIHNpZ24gYW5kICdcMCcuCisgICAgICBjb25zdCBpbnQgX19jc19zaXplID0KKwlfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8bG9uZyBkb3VibGU+OjpfX21heF9leHBvbmVudDEwICsgMzsKKyAgICAgIGNoYXIqIF9fY3MgPSBzdGF0aWNfY2FzdDxjaGFyKj4oX19idWlsdGluX2FsbG9jYShfX2NzX3NpemUpKTsKKyAgICAgIGludCBfX2xlbiA9IHN0ZDo6X19jb252ZXJ0X2Zyb21fdihfU19nZXRfY19sb2NhbGUoKSwgX19jcywgMCwgIiUuKkxmIiwgCisJCQkJCTAsIF9fdW5pdHMpOworI2VuZGlmCisgICAgICBzdHJpbmdfdHlwZSBfX2RpZ2l0cyhfX2xlbiwgY2hhcl90eXBlKCkpOworICAgICAgX19jdHlwZS53aWRlbihfX2NzLCBfX2NzICsgX19sZW4sICZfX2RpZ2l0c1swXSk7CisgICAgICByZXR1cm4gX19pbnRsID8gX01faW5zZXJ0PHRydWU+KF9fcywgX19pbywgX19maWxsLCBfX2RpZ2l0cykKKwkgICAgICAgICAgICA6IF9NX2luc2VydDxmYWxzZT4oX19zLCBfX2lvLCBfX2ZpbGwsIF9fZGlnaXRzKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBfT3V0SXRlcgorICAgIG1vbmV5X3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0CisgICAgeyByZXR1cm4gX19pbnRsID8gX01faW5zZXJ0PHRydWU+KF9fcywgX19pbywgX19maWxsLCBfX2RpZ2l0cykKKwkgICAgICAgICAgICA6IF9NX2luc2VydDxmYWxzZT4oX19zLCBfX2lvLCBfX2ZpbGwsIF9fZGlnaXRzKTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0xEQkwKKworICAvLyBOQjogTm90IGVzcGVjaWFsbHkgdXNlZnVsLiBXaXRob3V0IGFuIGlvc19iYXNlIG9iamVjdCBvciBzb21lCisgIC8vIGtpbmQgb2YgbG9jYWxlIHJlZmVyZW5jZSwgd2UgYXJlIGxlZnQgY2xhd2luZyBhdCB0aGUgYWlyIHdoZXJlCisgIC8vIHRoZSBzaWRlIG9mIHRoZSBtb3VudGFpbiB1c2VkIHRvIGJlLi4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICB0aW1lX2Jhc2U6OmRhdGVvcmRlcgorICAgIHRpbWVfZ2V0PF9DaGFyVCwgX0luSXRlcj46OmRvX2RhdGVfb3JkZXIoKSBjb25zdAorICAgIHsgcmV0dXJuIHRpbWVfYmFzZTo6bm9fb3JkZXI7IH0KKworICAvLyBFeHBhbmQgYSBzdHJmdGltZSBmb3JtYXQgc3RyaW5nIGFuZCBwYXJzZSBpdC4gIEUuZy4sIGRvX2dldF9kYXRlKCkgbWF5CisgIC8vIHBhc3MgJW0vJWQvJVkgPT4gZXh0cmFjdGVkIGNoYXJhY3RlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgdGltZV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgX01fZXh0cmFjdF92aWFfZm9ybWF0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkJCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSwKKwkJCSAgY29uc3QgX0NoYXJUKiBfX2Zvcm1hdCkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKyAgICAgIGNvbnN0IF9fdGltZXB1bmN0PF9DaGFyVD4mIF9fdHAgPSB1c2VfZmFjZXQ8X190aW1lcHVuY3Q8X0NoYXJUPiA+KF9fbG9jKTsKKyAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKyAgICAgIGNvbnN0IHNpemVfdCBfX2xlbiA9IGNoYXJfdHJhaXRzPF9DaGFyVD46Omxlbmd0aChfX2Zvcm1hdCk7CisKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fdG1wZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICBzaXplX3QgX19pID0gMDsKKyAgICAgIGZvciAoOyBfX2JlZyAhPSBfX2VuZCAmJiBfX2kgPCBfX2xlbiAmJiAhX190bXBlcnI7ICsrX19pKQorCXsKKwkgIGlmIChfX2N0eXBlLm5hcnJvdyhfX2Zvcm1hdFtfX2ldLCAwKSA9PSAnJScpCisJICAgIHsKKwkgICAgICAvLyBWZXJpZnkgdmFsaWQgZm9ybWF0dGluZyBjb2RlLCBhdHRlbXB0IHRvIGV4dHJhY3QuCisJICAgICAgY2hhciBfX2MgPSBfX2N0eXBlLm5hcnJvdyhfX2Zvcm1hdFsrK19faV0sIDApOworCSAgICAgIGludCBfX21lbSA9IDA7CisJICAgICAgaWYgKF9fYyA9PSAnRScgfHwgX19jID09ICdPJykKKwkJX19jID0gX19jdHlwZS5uYXJyb3coX19mb3JtYXRbKytfX2ldLCAwKTsKKwkgICAgICBzd2l0Y2ggKF9fYykKKwkJeworCQkgIGNvbnN0IGNoYXIqIF9fY3M7CisJCSAgX0NoYXJUIF9fd2NzWzEwXTsKKwkJY2FzZSAnYSc6CisJCSAgLy8gQWJicmV2aWF0ZWQgd2Vla2RheSBuYW1lIFt0bV93ZGF5XQorCQkgIGNvbnN0IGNoYXJfdHlwZSogIF9fZGF5czFbN107CisJCSAgX190cC5fTV9kYXlzX2FiYnJldmlhdGVkKF9fZGF5czEpOworCQkgIF9fYmVnID0gX01fZXh0cmFjdF9uYW1lKF9fYmVnLCBfX2VuZCwgX190bS0+dG1fd2RheSwgX19kYXlzMSwKKwkJCQkJICA3LCBfX2lvLCBfX3RtcGVycik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ0EnOgorCQkgIC8vIFdlZWtkYXkgbmFtZSBbdG1fd2RheV0uCisJCSAgY29uc3QgY2hhcl90eXBlKiAgX19kYXlzMls3XTsKKwkJICBfX3RwLl9NX2RheXMoX19kYXlzMik7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X25hbWUoX19iZWcsIF9fZW5kLCBfX3RtLT50bV93ZGF5LCBfX2RheXMyLAorCQkJCQkgIDcsIF9faW8sIF9fdG1wZXJyKTsKKwkJICBicmVhazsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJ2InOgorCQkgIC8vIEFiYnJldmlhdGVkIG1vbnRoIG5hbWUgW3RtX21vbl0KKwkJICBjb25zdCBjaGFyX3R5cGUqICBfX21vbnRoczFbMTJdOworCQkgIF9fdHAuX01fbW9udGhzX2FiYnJldmlhdGVkKF9fbW9udGhzMSk7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X25hbWUoX19iZWcsIF9fZW5kLCBfX3RtLT50bV9tb24sIAorCQkJCQkgIF9fbW9udGhzMSwgMTIsIF9faW8sIF9fdG1wZXJyKTsKKwkJICBicmVhazsKKwkJY2FzZSAnQic6CisJCSAgLy8gTW9udGggbmFtZSBbdG1fbW9uXS4KKwkJICBjb25zdCBjaGFyX3R5cGUqICBfX21vbnRoczJbMTJdOworCQkgIF9fdHAuX01fbW9udGhzKF9fbW9udGhzMik7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X25hbWUoX19iZWcsIF9fZW5kLCBfX3RtLT50bV9tb24sIAorCQkJCQkgIF9fbW9udGhzMiwgMTIsIF9faW8sIF9fdG1wZXJyKTsKKwkJICBicmVhazsKKwkJY2FzZSAnYyc6CisJCSAgLy8gRGVmYXVsdCB0aW1lIGFuZCBkYXRlIHJlcHJlc2VudGF0aW9uLgorCQkgIGNvbnN0IGNoYXJfdHlwZSogIF9fZHRbMl07CisJCSAgX190cC5fTV9kYXRlX3RpbWVfZm9ybWF0cyhfX2R0KTsKKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfdmlhX2Zvcm1hdChfX2JlZywgX19lbmQsIF9faW8sIF9fdG1wZXJyLCAKKwkJCQkJCV9fdG0sIF9fZHRbMF0pOworCQkgIGJyZWFrOworCQljYXNlICdkJzoKKwkJICAvLyBEYXkgWzAxLCAzMV0uIFt0bV9tZGF5XQorCQkgIF9fYmVnID0gX01fZXh0cmFjdF9udW0oX19iZWcsIF9fZW5kLCBfX3RtLT50bV9tZGF5LCAxLCAzMSwgMiwKKwkJCQkJIF9faW8sIF9fdG1wZXJyKTsKKwkJICBicmVhazsKKwkJY2FzZSAnZSc6CisJCSAgLy8gRGF5IFsxLCAzMV0sIHdpdGggc2luZ2xlIGRpZ2l0cyBwcmVjZWRlZCBieQorCQkgIC8vIHNwYWNlLiBbdG1fbWRheV0KKwkJICBpZiAoX19jdHlwZS5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgKl9fYmVnKSkKKwkJICAgIF9fYmVnID0gX01fZXh0cmFjdF9udW0oKytfX2JlZywgX19lbmQsIF9fdG0tPnRtX21kYXksIDEsIDksCisJCQkJCSAgIDEsIF9faW8sIF9fdG1wZXJyKTsKKwkJICBlbHNlCisJCSAgICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKF9fYmVnLCBfX2VuZCwgX190bS0+dG1fbWRheSwgMTAsIDMxLAorCQkJCQkgICAyLCBfX2lvLCBfX3RtcGVycik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ0QnOgorCQkgIC8vIEVxdWl2YWxlbnQgdG8gJW0vJWQvJXkuW3RtX21vbiwgdG1fbWRheSwgdG1feWVhcl0KKwkJICBfX2NzID0gIiVtLyVkLyV5IjsKKwkJICBfX2N0eXBlLndpZGVuKF9fY3MsIF9fY3MgKyA5LCBfX3djcyk7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X3ZpYV9mb3JtYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX3RtcGVyciwgCisJCQkJCQlfX3RtLCBfX3djcyk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ0gnOgorCQkgIC8vIEhvdXIgWzAwLCAyM10uIFt0bV9ob3VyXQorCQkgIF9fYmVnID0gX01fZXh0cmFjdF9udW0oX19iZWcsIF9fZW5kLCBfX3RtLT50bV9ob3VyLCAwLCAyMywgMiwKKwkJCQkJIF9faW8sIF9fdG1wZXJyKTsKKwkJICBicmVhazsKKwkJY2FzZSAnSSc6CisJCSAgLy8gSG91ciBbMDEsIDEyXS4gW3RtX2hvdXJdCisJCSAgX19iZWcgPSBfTV9leHRyYWN0X251bShfX2JlZywgX19lbmQsIF9fdG0tPnRtX2hvdXIsIDEsIDEyLCAyLAorCQkJCQkgX19pbywgX190bXBlcnIpOworCQkgIGJyZWFrOworCQljYXNlICdtJzoKKwkJICAvLyBNb250aCBbMDEsIDEyXS4gW3RtX21vbl0KKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKF9fYmVnLCBfX2VuZCwgX19tZW0sIDEsIDEyLCAyLCAKKwkJCQkJIF9faW8sIF9fdG1wZXJyKTsKKwkJICBpZiAoIV9fdG1wZXJyKQorCQkgICAgX190bS0+dG1fbW9uID0gX19tZW0gLSAxOworCQkgIGJyZWFrOworCQljYXNlICdNJzoKKwkJICAvLyBNaW51dGUgWzAwLCA1OV0uIFt0bV9taW5dCisJCSAgX19iZWcgPSBfTV9leHRyYWN0X251bShfX2JlZywgX19lbmQsIF9fdG0tPnRtX21pbiwgMCwgNTksIDIsCisJCQkJCSBfX2lvLCBfX3RtcGVycik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ24nOgorCQkgIGlmIChfX2N0eXBlLm5hcnJvdygqX19iZWcsIDApID09ICdcbicpCisJCSAgICArK19fYmVnOworCQkgIGVsc2UKKwkJICAgIF9fdG1wZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCQkgIGJyZWFrOworCQljYXNlICdSJzoKKwkJICAvLyBFcXVpdmFsZW50IHRvICglSDolTSkuCisJCSAgX19jcyA9ICIlSDolTSI7CisJCSAgX19jdHlwZS53aWRlbihfX2NzLCBfX2NzICsgNiwgX193Y3MpOworCQkgIF9fYmVnID0gX01fZXh0cmFjdF92aWFfZm9ybWF0KF9fYmVnLCBfX2VuZCwgX19pbywgX190bXBlcnIsIAorCQkJCQkJX190bSwgX193Y3MpOworCQkgIGJyZWFrOworCQljYXNlICdTJzoKKwkJICAvLyBTZWNvbmRzLiBbdG1fc2VjXQorCQkgIC8vIFswMCwgNjBdIGluIEM5OSAob25lIGxlYXAtc2Vjb25kKSwgWzAwLCA2MV0gaW4gQzg5LgorI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTkKKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKF9fYmVnLCBfX2VuZCwgX190bS0+dG1fc2VjLCAwLCA2MCwgMiwKKyNlbHNlCisJCSAgX19iZWcgPSBfTV9leHRyYWN0X251bShfX2JlZywgX19lbmQsIF9fdG0tPnRtX3NlYywgMCwgNjEsIDIsCisjZW5kaWYKKwkJCQkJIF9faW8sIF9fdG1wZXJyKTsKKwkJICBicmVhazsKKwkJY2FzZSAndCc6CisJCSAgaWYgKF9fY3R5cGUubmFycm93KCpfX2JlZywgMCkgPT0gJ1x0JykKKwkJICAgICsrX19iZWc7CisJCSAgZWxzZQorCQkgICAgX190bXBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJCSAgYnJlYWs7CisJCWNhc2UgJ1QnOgorCQkgIC8vIEVxdWl2YWxlbnQgdG8gKCVIOiVNOiVTKS4KKwkJICBfX2NzID0gIiVIOiVNOiVTIjsKKwkJICBfX2N0eXBlLndpZGVuKF9fY3MsIF9fY3MgKyA5LCBfX3djcyk7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X3ZpYV9mb3JtYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX3RtcGVyciwgCisJCQkJCQlfX3RtLCBfX3djcyk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkgIC8vIExvY2FsZSdzIGRhdGUuCisJCSAgY29uc3QgY2hhcl90eXBlKiAgX19kYXRlc1syXTsKKwkJICBfX3RwLl9NX2RhdGVfZm9ybWF0cyhfX2RhdGVzKTsKKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfdmlhX2Zvcm1hdChfX2JlZywgX19lbmQsIF9faW8sIF9fdG1wZXJyLCAKKwkJCQkJCV9fdG0sIF9fZGF0ZXNbMF0pOworCQkgIGJyZWFrOworCQljYXNlICdYJzoKKwkJICAvLyBMb2NhbGUncyB0aW1lLgorCQkgIGNvbnN0IGNoYXJfdHlwZSogIF9fdGltZXNbMl07CisJCSAgX190cC5fTV90aW1lX2Zvcm1hdHMoX190aW1lcyk7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X3ZpYV9mb3JtYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX3RtcGVyciwgCisJCQkJCQlfX3RtLCBfX3RpbWVzWzBdKTsKKwkJICBicmVhazsKKwkJY2FzZSAneSc6CisJCWNhc2UgJ0MnOiAvLyBDOTkKKwkJICAvLyBUd28gZGlnaXQgeWVhci4KKwkJY2FzZSAnWSc6CisJCSAgLy8gWWVhciBbMTkwMCkuCisJCSAgLy8gTkI6IFdlIHBhcnNlIGVpdGhlciB0d28gZGlnaXRzLCBpbXBsaWNpdGx5IHllYXJzIHNpbmNlCisJCSAgLy8gMTkwMCwgb3IgNCBkaWdpdHMsIGZ1bGwgeWVhci4gIEluIGJvdGggY2FzZXMgd2UgY2FuIAorCQkgIC8vIHJlY29uc3RydWN0IFt0bV95ZWFyXS4gIFNlZSBhbHNvIGxpYnN0ZGMrKy8yNjcwMS4KKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKF9fYmVnLCBfX2VuZCwgX19tZW0sIDAsIDk5OTksIDQsCisJCQkJCSBfX2lvLCBfX3RtcGVycik7CisJCSAgaWYgKCFfX3RtcGVycikKKwkJICAgIF9fdG0tPnRtX3llYXIgPSBfX21lbSA8IDAgPyBfX21lbSArIDEwMCA6IF9fbWVtIC0gMTkwMDsKKwkJICBicmVhazsKKwkJY2FzZSAnWic6CisJCSAgLy8gVGltZXpvbmUgaW5mby4KKwkJICBpZiAoX19jdHlwZS5pcyhjdHlwZV9iYXNlOjp1cHBlciwgKl9fYmVnKSkKKwkJICAgIHsKKwkJICAgICAgaW50IF9fdG1wOworCQkgICAgICBfX2JlZyA9IF9NX2V4dHJhY3RfbmFtZShfX2JlZywgX19lbmQsIF9fdG1wLAorCQkJCSAgICAgICBfX3RpbWVwdW5jdF9jYWNoZTxfQ2hhclQ+OjpfU190aW1lem9uZXMsCisJCQkJCSAgICAgIDE0LCBfX2lvLCBfX3RtcGVycik7CisKKwkJICAgICAgLy8gR01UIHJlcXVpcmVzIHNwZWNpYWwgZWZmb3J0LgorCQkgICAgICBpZiAoX19iZWcgIT0gX19lbmQgJiYgIV9fdG1wZXJyICYmIF9fdG1wID09IDAKKwkJCSAgJiYgKCpfX2JlZyA9PSBfX2N0eXBlLndpZGVuKCctJykKKwkJCSAgICAgIHx8ICpfX2JlZyA9PSBfX2N0eXBlLndpZGVuKCcrJykpKQorCQkJeworCQkJICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKF9fYmVnLCBfX2VuZCwgX190bXAsIDAsIDIzLCAyLAorCQkJCQkJIF9faW8sIF9fdG1wZXJyKTsKKwkJCSAgX19iZWcgPSBfTV9leHRyYWN0X251bShfX2JlZywgX19lbmQsIF9fdG1wLCAwLCA1OSwgMiwKKwkJCQkJCSBfX2lvLCBfX3RtcGVycik7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgX190bXBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJCSAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgLy8gTm90IHJlY29nbml6ZWQuCisJCSAgX190bXBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLy8gVmVyaWZ5IGZvcm1hdCBhbmQgaW5wdXQgbWF0Y2gsIGV4dHJhY3QgYW5kIGRpc2NhcmQuCisJICAgICAgaWYgKF9fZm9ybWF0W19faV0gPT0gKl9fYmVnKQorCQkrK19fYmVnOworCSAgICAgIGVsc2UKKwkJX190bXBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChfX3RtcGVyciB8fCBfX2kgIT0gX19sZW4pCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgIAorICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIHRpbWVfZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgIF9NX2V4dHJhY3RfbnVtKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpbnQmIF9fbWVtYmVyLAorCQkgICBpbnQgX19taW4sIGludCBfX21heCwgc2l6ZV90IF9fbGVuLAorCQkgICBpb3NfYmFzZSYgX19pbywgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworCisgICAgICAvLyBBcy1pcyB3b3JrcyBmb3IgX19sZW4gPSAxLCAyLCA0LCB0aGUgdmFsdWVzIGFjdHVhbGx5IHVzZWQuCisgICAgICBpbnQgX19tdWx0ID0gX19sZW4gPT0gMiA/IDEwIDogKF9fbGVuID09IDQgPyAxMDAwIDogMSk7CisKKyAgICAgICsrX19taW47CisgICAgICBzaXplX3QgX19pID0gMDsKKyAgICAgIGludCBfX3ZhbHVlID0gMDsKKyAgICAgIGZvciAoOyBfX2JlZyAhPSBfX2VuZCAmJiBfX2kgPCBfX2xlbjsgKytfX2JlZywgKytfX2kpCisJeworCSAgY29uc3QgY2hhciBfX2MgPSBfX2N0eXBlLm5hcnJvdygqX19iZWcsICcqJyk7CisJICBpZiAoX19jID49ICcwJyAmJiBfX2MgPD0gJzknKQorCSAgICB7CisJICAgICAgX192YWx1ZSA9IF9fdmFsdWUgKiAxMCArIChfX2MgLSAnMCcpOworCSAgICAgIGNvbnN0IGludCBfX3ZhbHVlYyA9IF9fdmFsdWUgKiBfX211bHQ7CisJICAgICAgaWYgKF9fdmFsdWVjID4gX19tYXggfHwgX192YWx1ZWMgKyBfX211bHQgPCBfX21pbikKKwkJYnJlYWs7CisJICAgICAgX19tdWx0IC89IDEwOworCSAgICB9CisJICBlbHNlCisJICAgIGJyZWFrOworCX0KKyAgICAgIGlmIChfX2kgPT0gX19sZW4pCisJX19tZW1iZXIgPSBfX3ZhbHVlOworICAgICAgLy8gU3BlY2lhbCBlbmNvZGluZyBmb3IgZG9fZ2V0X3llYXIsICd5JywgYW5kICdZJyBhYm92ZS4KKyAgICAgIGVsc2UgaWYgKF9fbGVuID09IDQgJiYgX19pID09IDIpCisJX19tZW1iZXIgPSBfX3ZhbHVlIC0gMTAwOworICAgICAgZWxzZQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIC8vIEFzc3VtcHRpb25zOgorICAvLyBBbGwgZWxlbWVudHMgaW4gX19uYW1lcyBhcmUgdW5pcXVlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIHRpbWVfZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgIF9NX2V4dHJhY3RfbmFtZShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW50JiBfX21lbWJlciwKKwkJICAgIGNvbnN0IF9DaGFyVCoqIF9fbmFtZXMsIHNpemVfdCBfX2luZGV4bGVuLAorCQkgICAgaW9zX2Jhc2UmIF9faW8sIGlvc19iYXNlOjppb3N0YXRlJiBfX2VycikgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPF9DaGFyVD4JCV9fdHJhaXRzX3R5cGU7CisgICAgICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKyAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKworICAgICAgaW50KiBfX21hdGNoZXMgPSBzdGF0aWNfY2FzdDxpbnQqPihfX2J1aWx0aW5fYWxsb2NhKHNpemVvZihpbnQpCisJCQkJCQkJICAqIF9faW5kZXhsZW4pKTsKKyAgICAgIHNpemVfdCBfX25tYXRjaGVzID0gMDsKKyAgICAgIHNpemVfdCBfX3BvcyA9IDA7CisgICAgICBib29sIF9fdGVzdHZhbGlkID0gdHJ1ZTsKKyAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19uYW1lOworCisgICAgICAvLyBMb29rIGZvciBpbml0aWFsIG1hdGNoZXMuCisgICAgICAvLyBOQjogU29tZSBvZiB0aGUgbG9jYWxlIGRhdGEgaXMgaW4gdGhlIGZvcm0gb2YgYWxsIGxvd2VyY2FzZQorICAgICAgLy8gbmFtZXMsIGFuZCBzb21lIGlzIGluIHRoZSBmb3JtIG9mIGluaXRpYWxseS1jYXBpdGFsaXplZAorICAgICAgLy8gbmFtZXMuIExvb2sgZm9yIGJvdGguCisgICAgICBpZiAoX19iZWcgIT0gX19lbmQpCisJeworCSAgY29uc3QgY2hhcl90eXBlIF9fYyA9ICpfX2JlZzsKKwkgIGZvciAoc2l6ZV90IF9faTEgPSAwOyBfX2kxIDwgX19pbmRleGxlbjsgKytfX2kxKQorCSAgICBpZiAoX19jID09IF9fbmFtZXNbX19pMV1bMF0KKwkJfHwgX19jID09IF9fY3R5cGUudG91cHBlcihfX25hbWVzW19faTFdWzBdKSkKKwkgICAgICBfX21hdGNoZXNbX19ubWF0Y2hlcysrXSA9IF9faTE7CisJfQorCisgICAgICB3aGlsZSAoX19ubWF0Y2hlcyA+IDEpCisJeworCSAgLy8gRmluZCBzbWFsbGVzdCBtYXRjaGluZyBzdHJpbmcuCisJICBzaXplX3QgX19taW5sZW4gPSBfX3RyYWl0c190eXBlOjpsZW5ndGgoX19uYW1lc1tfX21hdGNoZXNbMF1dKTsKKwkgIGZvciAoc2l6ZV90IF9faTIgPSAxOyBfX2kyIDwgX19ubWF0Y2hlczsgKytfX2kyKQorCSAgICBfX21pbmxlbiA9IHN0ZDo6bWluKF9fbWlubGVuLAorCQkJICAgICAgX190cmFpdHNfdHlwZTo6bGVuZ3RoKF9fbmFtZXNbX19tYXRjaGVzW19faTJdXSkpOworCSAgKytfX2JlZywgKytfX3BvczsKKwkgIGlmIChfX3BvcyA8IF9fbWlubGVuICYmIF9fYmVnICE9IF9fZW5kKQorCSAgICBmb3IgKHNpemVfdCBfX2kzID0gMDsgX19pMyA8IF9fbm1hdGNoZXM7KQorCSAgICAgIHsKKwkJX19uYW1lID0gX19uYW1lc1tfX21hdGNoZXNbX19pM11dOworCQlpZiAoIShfX25hbWVbX19wb3NdID09ICpfX2JlZykpCisJCSAgX19tYXRjaGVzW19faTNdID0gX19tYXRjaGVzWy0tX19ubWF0Y2hlc107CisJCWVsc2UKKwkJICArK19faTM7CisJICAgICAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisKKyAgICAgIGlmIChfX25tYXRjaGVzID09IDEpCisJeworCSAgLy8gTWFrZSBzdXJlIGZvdW5kIG5hbWUgaXMgY29tcGxldGVseSBleHRyYWN0ZWQuCisJICArK19fYmVnLCArK19fcG9zOworCSAgX19uYW1lID0gX19uYW1lc1tfX21hdGNoZXNbMF1dOworCSAgY29uc3Qgc2l6ZV90IF9fbGVuID0gX190cmFpdHNfdHlwZTo6bGVuZ3RoKF9fbmFtZSk7CisJICB3aGlsZSAoX19wb3MgPCBfX2xlbiAmJiBfX2JlZyAhPSBfX2VuZCAmJiBfX25hbWVbX19wb3NdID09ICpfX2JlZykKKwkgICAgKytfX2JlZywgKytfX3BvczsKKworCSAgaWYgKF9fbGVuID09IF9fcG9zKQorCSAgICBfX21lbWJlciA9IF9fbWF0Y2hlc1swXTsKKwkgIGVsc2UKKwkgICAgX190ZXN0dmFsaWQgPSBmYWxzZTsKKwl9CisgICAgICBlbHNlCisJX190ZXN0dmFsaWQgPSBmYWxzZTsKKyAgICAgIGlmICghX190ZXN0dmFsaWQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBfTV9leHRyYWN0X3dkYXlfb3JfbW9udGgoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGludCYgX19tZW1iZXIsCisJCQkgICAgIGNvbnN0IF9DaGFyVCoqIF9fbmFtZXMsIHNpemVfdCBfX2luZGV4bGVuLAorCQkJICAgICBpb3NfYmFzZSYgX19pbywgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8X0NoYXJUPgkJX190cmFpdHNfdHlwZTsKKyAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworCisgICAgICBpbnQqIF9fbWF0Y2hlcyA9IHN0YXRpY19jYXN0PGludCo+KF9fYnVpbHRpbl9hbGxvY2EoMiAqIHNpemVvZihpbnQpCisJCQkJCQkJICAqIF9faW5kZXhsZW4pKTsKKyAgICAgIHNpemVfdCBfX25tYXRjaGVzID0gMDsKKyAgICAgIHNpemVfdCogX19tYXRjaGVzX2xlbmd0aHMgPSAwOworICAgICAgc2l6ZV90IF9fcG9zID0gMDsKKworICAgICAgaWYgKF9fYmVnICE9IF9fZW5kKQorCXsKKwkgIGNvbnN0IGNoYXJfdHlwZSBfX2MgPSAqX19iZWc7CisJICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCAyICogX19pbmRleGxlbjsgKytfX2kpCisJICAgIGlmIChfX2MgPT0gX19uYW1lc1tfX2ldWzBdCisJCXx8IF9fYyA9PSBfX2N0eXBlLnRvdXBwZXIoX19uYW1lc1tfX2ldWzBdKSkKKwkgICAgICBfX21hdGNoZXNbX19ubWF0Y2hlcysrXSA9IF9faTsKKwl9CisKKyAgICAgIGlmIChfX25tYXRjaGVzKQorCXsKKwkgICsrX19iZWcsICsrX19wb3M7CisKKwkgIF9fbWF0Y2hlc19sZW5ndGhzCisJICAgID0gc3RhdGljX2Nhc3Q8c2l6ZV90Kj4oX19idWlsdGluX2FsbG9jYShzaXplb2Yoc2l6ZV90KQorCQkJCQkJICAgICogX19ubWF0Y2hlcykpOworCSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19ubWF0Y2hlczsgKytfX2kpCisJICAgIF9fbWF0Y2hlc19sZW5ndGhzW19faV0KKwkgICAgICA9IF9fdHJhaXRzX3R5cGU6Omxlbmd0aChfX25hbWVzW19fbWF0Y2hlc1tfX2ldXSk7CisJfQorCisgICAgICBmb3IgKDsgX19iZWcgIT0gX19lbmQ7ICsrX19iZWcsICsrX19wb3MpCisJeworCSAgc2l6ZV90IF9fbnNraXBwZWQgPSAwOworCSAgY29uc3QgY2hhcl90eXBlIF9fYyA9ICpfX2JlZzsKKwkgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbm1hdGNoZXM7KQorCSAgICB7CisJICAgICAgY29uc3QgY2hhcl90eXBlKiBfX25hbWUgPSBfX25hbWVzW19fbWF0Y2hlc1tfX2ldXTsKKwkgICAgICBpZiAoX19wb3MgPj0gX19tYXRjaGVzX2xlbmd0aHNbX19pXSkKKwkJKytfX25za2lwcGVkLCArK19faTsKKwkgICAgICBlbHNlIGlmICghKF9fbmFtZVtfX3Bvc10gPT0gX19jKSkKKwkJeworCQkgIC0tX19ubWF0Y2hlczsKKwkJICBfX21hdGNoZXNbX19pXSA9IF9fbWF0Y2hlc1tfX25tYXRjaGVzXTsKKwkJICBfX21hdGNoZXNfbGVuZ3Roc1tfX2ldID0gX19tYXRjaGVzX2xlbmd0aHNbX19ubWF0Y2hlc107CisJCX0KKwkgICAgICBlbHNlCisJCSsrX19pOworCSAgICB9CisJICBpZiAoX19uc2tpcHBlZCA9PSBfX25tYXRjaGVzKQorCSAgICBicmVhazsKKwl9CisKKyAgICAgIGlmICgoX19ubWF0Y2hlcyA9PSAxICYmIF9fbWF0Y2hlc19sZW5ndGhzWzBdID09IF9fcG9zKQorCSAgfHwgKF9fbm1hdGNoZXMgPT0gMiAmJiAoX19tYXRjaGVzX2xlbmd0aHNbMF0gPT0gX19wb3MKKwkJCQkgIHx8IF9fbWF0Y2hlc19sZW5ndGhzWzFdID09IF9fcG9zKSkpCisJX19tZW1iZXIgPSAoX19tYXRjaGVzWzBdID49IF9faW5kZXhsZW4KKwkJICAgID8gX19tYXRjaGVzWzBdIC0gX19pbmRleGxlbiA6IF9fbWF0Y2hlc1swXSk7CisgICAgICBlbHNlCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXRfdGltZShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCWlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0CisgICAgeworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjb25zdCBfX3RpbWVwdW5jdDxfQ2hhclQ+JiBfX3RwID0gdXNlX2ZhY2V0PF9fdGltZXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBjaGFyX3R5cGUqICBfX3RpbWVzWzJdOworICAgICAgX190cC5fTV90aW1lX2Zvcm1hdHMoX190aW1lcyk7CisgICAgICBfX2JlZyA9IF9NX2V4dHJhY3RfdmlhX2Zvcm1hdChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCAKKwkJCQkgICAgX190bSwgX190aW1lc1swXSk7CisgICAgICBpZiAoX19iZWcgPT0gX19lbmQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXRfZGF0ZShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCWlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0CisgICAgeworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjb25zdCBfX3RpbWVwdW5jdDxfQ2hhclQ+JiBfX3RwID0gdXNlX2ZhY2V0PF9fdGltZXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBjaGFyX3R5cGUqICBfX2RhdGVzWzJdOworICAgICAgX190cC5fTV9kYXRlX2Zvcm1hdHMoX19kYXRlcyk7CisgICAgICBfX2JlZyA9IF9NX2V4dHJhY3RfdmlhX2Zvcm1hdChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCAKKwkJCQkgICAgX190bSwgX19kYXRlc1swXSk7CisgICAgICBpZiAoX19iZWcgPT0gX19lbmQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXRfd2Vla2RheShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCSAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBjaGFyX3RyYWl0czxfQ2hhclQ+CQlfX3RyYWl0c190eXBlOworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjb25zdCBfX3RpbWVwdW5jdDxfQ2hhclQ+JiBfX3RwID0gdXNlX2ZhY2V0PF9fdGltZXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBjaGFyX3R5cGUqIF9fZGF5c1sxNF07CisgICAgICBfX3RwLl9NX2RheXNfYWJicmV2aWF0ZWQoX19kYXlzKTsKKyAgICAgIF9fdHAuX01fZGF5cyhfX2RheXMgKyA3KTsKKyAgICAgIGludCBfX3RtcHdkYXk7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX3RtcGVyciA9IGlvc19iYXNlOjpnb29kYml0OworCisgICAgICBfX2JlZyA9IF9NX2V4dHJhY3Rfd2RheV9vcl9tb250aChfX2JlZywgX19lbmQsIF9fdG1wd2RheSwgX19kYXlzLCA3LAorCQkJCSAgICAgICBfX2lvLCBfX3RtcGVycik7CisgICAgICBpZiAoIV9fdG1wZXJyKQorCV9fdG0tPnRtX3dkYXkgPSBfX3RtcHdkYXk7CisgICAgICBlbHNlCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisKKyAgICAgIGlmIChfX2JlZyA9PSBfX2VuZCkKKwlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgcmV0dXJuIF9fYmVnOworICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXRfbW9udGhuYW1lKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9faW8sIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBjaGFyX3RyYWl0czxfQ2hhclQ+CQlfX3RyYWl0c190eXBlOworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjb25zdCBfX3RpbWVwdW5jdDxfQ2hhclQ+JiBfX3RwID0gdXNlX2ZhY2V0PF9fdGltZXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBjaGFyX3R5cGUqICBfX21vbnRoc1syNF07CisgICAgICBfX3RwLl9NX21vbnRoc19hYmJyZXZpYXRlZChfX21vbnRocyk7CisgICAgICBfX3RwLl9NX21vbnRocyhfX21vbnRocyArIDEyKTsKKyAgICAgIGludCBfX3RtcG1vbjsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fdG1wZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisKKyAgICAgIF9fYmVnID0gX01fZXh0cmFjdF93ZGF5X29yX21vbnRoKF9fYmVnLCBfX2VuZCwgX190bXBtb24sIF9fbW9udGhzLCAxMiwKKwkJCQkgICAgICAgX19pbywgX190bXBlcnIpOworICAgICAgaWYgKCFfX3RtcGVycikKKwlfX3RtLT50bV9tb24gPSBfX3RtcG1vbjsKKyAgICAgIGVsc2UKKwlfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKworICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQorCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgdGltZV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0X3llYXIoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCQlpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworICAgICAgaW50IF9fdG1weWVhcjsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fdG1wZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisKKyAgICAgIF9fYmVnID0gX01fZXh0cmFjdF9udW0oX19iZWcsIF9fZW5kLCBfX3RtcHllYXIsIDAsIDk5OTksIDQsCisJCQkgICAgIF9faW8sIF9fdG1wZXJyKTsKKyAgICAgIGlmICghX190bXBlcnIpCisJX190bS0+dG1feWVhciA9IF9fdG1weWVhciA8IDAgPyBfX3RtcHllYXIgKyAxMDAgOiBfX3RtcHllYXIgLSAxOTAwOworICAgICAgZWxzZQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCisgICAgICBpZiAoX19iZWcgPT0gX19lbmQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBfT3V0SXRlcgorICAgIHRpbWVfcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGNvbnN0IHRtKiBfX3RtLAorCWNvbnN0IF9DaGFyVCogX19iZWcsIGNvbnN0IF9DaGFyVCogX19lbmQpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjdHlwZTxfQ2hhclQ+IGNvbnN0JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBmb3IgKDsgX19iZWcgIT0gX19lbmQ7ICsrX19iZWcpCisJaWYgKF9fY3R5cGUubmFycm93KCpfX2JlZywgMCkgIT0gJyUnKQorCSAgeworCSAgICAqX19zID0gKl9fYmVnOworCSAgICArK19fczsKKwkgIH0KKwllbHNlIGlmICgrK19fYmVnICE9IF9fZW5kKQorCSAgeworCSAgICBjaGFyIF9fZm9ybWF0OworCSAgICBjaGFyIF9fbW9kID0gMDsKKwkgICAgY29uc3QgY2hhciBfX2MgPSBfX2N0eXBlLm5hcnJvdygqX19iZWcsIDApOworCSAgICBpZiAoX19jICE9ICdFJyAmJiBfX2MgIT0gJ08nKQorCSAgICAgIF9fZm9ybWF0ID0gX19jOworCSAgICBlbHNlIGlmICgrK19fYmVnICE9IF9fZW5kKQorCSAgICAgIHsKKwkJX19tb2QgPSBfX2M7CisJCV9fZm9ybWF0ID0gX19jdHlwZS5uYXJyb3coKl9fYmVnLCAwKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBicmVhazsKKwkgICAgX19zID0gdGhpcy0+ZG9fcHV0KF9fcywgX19pbywgX19maWxsLCBfX3RtLCBfX2Zvcm1hdCwgX19tb2QpOworCSAgfQorCWVsc2UKKwkgIGJyZWFrOworICAgICAgcmV0dXJuIF9fczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBfT3V0SXRlcgorICAgIHRpbWVfcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSwgY29uc3QgdG0qIF9fdG0sCisJICAgY2hhciBfX2Zvcm1hdCwgY2hhciBfX21vZCkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKyAgICAgIGN0eXBlPF9DaGFyVD4gY29uc3QmIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKyAgICAgIF9fdGltZXB1bmN0PF9DaGFyVD4gY29uc3QmIF9fdHAgPSB1c2VfZmFjZXQ8X190aW1lcHVuY3Q8X0NoYXJUPiA+KF9fbG9jKTsKKworICAgICAgLy8gTkI6IFRoaXMgc2l6ZSBpcyBhcmJpdHJhcnkuIFNob3VsZCB0aGlzIGJlIGEgZGF0YSBtZW1iZXIsCisgICAgICAvLyBpbml0aWFsaXplZCBhdCBjb25zdHJ1Y3Rpb24/CisgICAgICBjb25zdCBzaXplX3QgX19tYXhsZW4gPSAxMjg7CisgICAgICBjaGFyX3R5cGUgX19yZXNbX19tYXhsZW5dOworCisgICAgICAvLyBOQjogSW4gSUVFIDEwMDMuMS0yMDB4LCBhbmQgcGVyaGFwcyBvdGhlciBsb2NhbGUgbW9kZWxzLCBpdAorICAgICAgLy8gaXMgcG9zc2libGUgdGhhdCB0aGUgZm9ybWF0IGNoYXJhY3RlciB3aWxsIGJlIGxvbmdlciB0aGFuIG9uZQorICAgICAgLy8gY2hhcmFjdGVyLiBQb3NzaWJpbGl0aWVzIGluY2x1ZGUgJ0UnIG9yICdPJyBmb2xsb3dlZCBieSBhCisgICAgICAvLyBmb3JtYXQgY2hhcmFjdGVyOiBpZiBfX21vZCBpcyBub3QgdGhlIGRlZmF1bHQgYXJndW1lbnQsIGFzc3VtZQorICAgICAgLy8gaXQncyBhIHZhbGlkIG1vZGlmaWVyLgorICAgICAgY2hhcl90eXBlIF9fZm10WzRdOworICAgICAgX19mbXRbMF0gPSBfX2N0eXBlLndpZGVuKCclJyk7CisgICAgICBpZiAoIV9fbW9kKQorCXsKKwkgIF9fZm10WzFdID0gX19mb3JtYXQ7CisJICBfX2ZtdFsyXSA9IGNoYXJfdHlwZSgpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfX2ZtdFsxXSA9IF9fbW9kOworCSAgX19mbXRbMl0gPSBfX2Zvcm1hdDsKKwkgIF9fZm10WzNdID0gY2hhcl90eXBlKCk7CisJfQorCisgICAgICBfX3RwLl9NX3B1dChfX3JlcywgX19tYXhsZW4sIF9fZm10LCBfX3RtKTsKKworICAgICAgLy8gV3JpdGUgcmVzdWx0aW5nLCBmdWxseS1mb3JtYXR0ZWQgc3RyaW5nIHRvIG91dHB1dCBpdGVyYXRvci4KKyAgICAgIHJldHVybiBzdGQ6Ol9fd3JpdGUoX19zLCBfX3JlcywgY2hhcl90cmFpdHM8Y2hhcl90eXBlPjo6bGVuZ3RoKF9fcmVzKSk7CisgICAgfQorCisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0PGNoYXIsIGZhbHNlPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCBmYWxzZT47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCB0cnVlPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9HTElCQ1hYX05BTUVTUEFDRV9MREJMIG1vbmV5X2dldDxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9HTElCQ1hYX05BTUVTUEFDRV9MREJMIG1vbmV5X3B1dDxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9fdGltZXB1bmN0PGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgdGltZV9wdXQ8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyB0aW1lX3B1dF9ieW5hbWU8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyB0aW1lX2dldDxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIHRpbWVfZ2V0X2J5bmFtZTxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG1lc3NhZ2VzPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbWVzc2FnZXNfYnluYW1lPGNoYXI+OworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT4mCisgICAgdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBtb25leXB1bmN0PGNoYXIsIGZhbHNlPiYKKyAgICB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBtb25leV9wdXQ8Y2hhcj4mCisgICAgdXNlX2ZhY2V0PG1vbmV5X3B1dDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG1vbmV5X2dldDxjaGFyPiYKKyAgICB1c2VfZmFjZXQ8bW9uZXlfZ2V0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgX190aW1lcHVuY3Q8Y2hhcj4mCisgICAgdXNlX2ZhY2V0PF9fdGltZXB1bmN0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgdGltZV9wdXQ8Y2hhcj4mCisgICAgdXNlX2ZhY2V0PHRpbWVfcHV0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgdGltZV9nZXQ8Y2hhcj4mCisgICAgdXNlX2ZhY2V0PHRpbWVfZ2V0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgbWVzc2FnZXM8Y2hhcj4mCisgICAgdXNlX2ZhY2V0PG1lc3NhZ2VzPGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxtb25leXB1bmN0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxtb25leV9wdXQ8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG1vbmV5X2dldDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8X190aW1lcHVuY3Q8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PHRpbWVfcHV0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDx0aW1lX2dldDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8bWVzc2FnZXM8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCBmYWxzZT47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCB0cnVlPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9HTElCQ1hYX05BTUVTUEFDRV9MREJMIG1vbmV5X2dldDx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9HTElCQ1hYX05BTUVTUEFDRV9MREJMIG1vbmV5X3B1dDx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9fdGltZXB1bmN0PHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgdGltZV9wdXQ8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyB0aW1lX3B1dF9ieW5hbWU8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyB0aW1lX2dldDx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIHRpbWVfZ2V0X2J5bmFtZTx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG1lc3NhZ2VzPHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbWVzc2FnZXNfYnluYW1lPHdjaGFyX3Q+OworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT4mCisgICAgdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPiYKKyAgICB1c2VfZmFjZXQ8bW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBtb25leV9wdXQ8d2NoYXJfdD4mCisgICAgdXNlX2ZhY2V0PG1vbmV5X3B1dDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG1vbmV5X2dldDx3Y2hhcl90PiYKKyAgICB1c2VfZmFjZXQ8bW9uZXlfZ2V0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgX190aW1lcHVuY3Q8d2NoYXJfdD4mCisgICAgdXNlX2ZhY2V0PF9fdGltZXB1bmN0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgdGltZV9wdXQ8d2NoYXJfdD4mCisgICAgdXNlX2ZhY2V0PHRpbWVfcHV0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgdGltZV9nZXQ8d2NoYXJfdD4mCisgICAgdXNlX2ZhY2V0PHRpbWVfZ2V0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgbWVzc2FnZXM8d2NoYXJfdD4mCisgICAgdXNlX2ZhY2V0PG1lc3NhZ2VzPHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxtb25leXB1bmN0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxtb25leV9wdXQ8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG1vbmV5X2dldDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8X190aW1lcHVuY3Q8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PHRpbWVfcHV0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDx0aW1lX2dldDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8bWVzc2FnZXM8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZWZ3ZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZWZ3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMDZkYzEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbG9jYWxlZndkLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8vIDxsb2NhbGU+IEZvcndhcmQgZGVjbGFyYXRpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2xvY2FsZWZ3ZC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4xICBMb2NhbGVzCisvLworCisjaWZuZGVmIF9MT0NBTEVfRldEX0gKKyNkZWZpbmUgX0xPQ0FMRV9GV0RfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9jKytsb2NhbGUuaD4gIC8vIERlZmluZXMgX19jX2xvY2FsZSwgY29uZmlnLXNwZWNpZmljIGluY2x1ZGUKKyNpbmNsdWRlIDxpb3Nmd2Q+ICAgICAgICAgICAgLy8gRm9yIG9zdHJlYW1idWZfaXRlcmF0b3IsIGlzdHJlYW1idWZfaXRlcmF0b3IKKyNpbmNsdWRlIDxjY3R5cGU+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKiogCisgICAqICBAZGVmZ3JvdXAgbG9jYWxlcyBMb2NhbGVzCisgICAqCisgICAqICBDbGFzc2VzIGFuZCBmdW5jdGlvbnMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCBsb2NhbGl6YXRpb24uCisgICAqLworCisgIC8vIDIyLjEuMSBMb2NhbGUKKyAgY2xhc3MgbG9jYWxlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICBib29sCisgICAgaGFzX2ZhY2V0KGNvbnN0IGxvY2FsZSYpIHRocm93KCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgIGNvbnN0IF9GYWNldCYKKyAgICB1c2VfZmFjZXQoY29uc3QgbG9jYWxlJik7CisKKyAgLy8gMjIuMS4zIENvbnZlbmllbmNlIGludGVyZmFjZXMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc3NwYWNlKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc3ByaW50KF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc2NudHJsKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc3VwcGVyKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc2xvd2VyKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc2FscGhhKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc2RpZ2l0KF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc3B1bmN0KF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc3hkaWdpdChfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBib29sCisgICAgaXNhbG51bShfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBib29sCisgICAgaXNncmFwaChfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfQ2hhclQKKyAgICB0b3VwcGVyKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIF9DaGFyVAorICAgIHRvbG93ZXIoX0NoYXJULCBjb25zdCBsb2NhbGUmKTsKKworICAvLyAyMi4yLjEgYW5kIDIyLjIuMS4zIGN0eXBlCisgIGNsYXNzIGN0eXBlX2Jhc2U7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBjdHlwZTsKKyAgdGVtcGxhdGU8PiBjbGFzcyBjdHlwZTxjaGFyPjsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+IGNsYXNzIGN0eXBlPHdjaGFyX3Q+OworI2VuZGlmCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBjdHlwZV9ieW5hbWU7CisgIC8vIE5COiBTcGVjaWFsaXplZCBmb3IgY2hhciBhbmQgd2NoYXJfdCBpbiBsb2NhbGVfZmFjZXRzLmguCisKKyAgY2xhc3MgY29kZWN2dF9iYXNlOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZXJuVCwgdHlwZW5hbWUgX0V4dGVyblQsIHR5cGVuYW1lIF9TdGF0ZVQ+CisgICAgY2xhc3MgY29kZWN2dDsKKyAgdGVtcGxhdGU8PiBjbGFzcyBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD47CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PiBjbGFzcyBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD47CisjZW5kaWYKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5ULCB0eXBlbmFtZSBfU3RhdGVUPgorICAgIGNsYXNzIGNvZGVjdnRfYnluYW1lOworCisgIC8vIDIyLjIuMiBhbmQgMjIuMi4zIG51bWVyaWMKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9MREJMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlciA9IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgbnVtX2dldDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlciA9IG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgbnVtX3B1dDsKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfTERCTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+IGNsYXNzIG51bXB1bmN0OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+IGNsYXNzIG51bXB1bmN0X2J5bmFtZTsKKworICAvLyAyMi4yLjQgY29sbGF0aW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBjb2xsYXRlOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+IGNsYXNzCisgICAgY29sbGF0ZV9ieW5hbWU7CisKKyAgLy8gMjIuMi41IGRhdGUgYW5kIHRpbWUKKyAgY2xhc3MgdGltZV9iYXNlOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXIgPSAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyB0aW1lX2dldDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyID0gIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgdGltZV9nZXRfYnluYW1lOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyID0gb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyB0aW1lX3B1dDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlciA9IG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgdGltZV9wdXRfYnluYW1lOworCisgIC8vIDIyLjIuNiBtb25leQorICBjbGFzcyBtb25leV9iYXNlOworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0xEQkwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyID0gIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgbW9uZXlfZ2V0OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyID0gb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyBtb25leV9wdXQ7CitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0xEQkwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsID0gZmFsc2U+CisgICAgY2xhc3MgbW9uZXlwdW5jdDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsID0gZmFsc2U+CisgICAgY2xhc3MgbW9uZXlwdW5jdF9ieW5hbWU7CisKKyAgLy8gMjIuMi43IG1lc3NhZ2UgcmV0cmlldmFsCisgIGNsYXNzIG1lc3NhZ2VzX2Jhc2U7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBtZXNzYWdlczsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIG1lc3NhZ2VzX2J5bmFtZTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbWFza19hcnJheS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL21hc2tfYXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2JlYThhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL21hc2tfYXJyYXkuaApAQCAtMCwwICsxLDIwOCBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gbWFza19hcnJheSBjbGFzcy4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvbWFza19hcnJheS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dmFsYXJyYXl9CisgKi8KKworLy8gV3JpdHRlbiBieSBHYWJyaWVsIERvcyBSZWlzIDxHYWJyaWVsLkRvcy1SZWlzQERQVE1hdGhzLkVOUy1DYWNoYW4uRnI+CisKKyNpZm5kZWYgX01BU0tfQVJSQVlfSAorI2RlZmluZSBfTUFTS19BUlJBWV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIG51bWVyaWNfYXJyYXlzCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWZlcmVuY2UgdG8gc2VsZWN0ZWQgc3Vic2V0IG9mIGFuIGFycmF5LgorICAgKgorICAgKiAgQSBtYXNrX2FycmF5IGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBhY3R1YWwgZWxlbWVudHMgb2YgYW4gYXJyYXkgc3BlY2lmaWVkCisgICAqICBieSBhIGJpdG1hc2sgaW4gdGhlIGZvcm0gb2YgYW4gYXJyYXkgb2YgYm9vbC4gIFRoZSB3YXkgdG8gZ2V0IGEKKyAgICogIG1hc2tfYXJyYXkgaXMgdG8gY2FsbCBvcGVyYXRvcltdKHZhbGFycmF5PGJvb2w+KSBvbiBhIHZhbGFycmF5LiAgVGhlCisgICAqICByZXR1cm5lZCBtYXNrX2FycmF5IHRoZW4gcGVybWl0cyBjYXJyeWluZyBvcGVyYXRpb25zIG91dCBvbiB0aGUKKyAgICogIHJlZmVyZW5jZWQgc3Vic2V0IG9mIGVsZW1lbnRzIGluIHRoZSBvcmlnaW5hbCB2YWxhcnJheS4KKyAgICoKKyAgICogIEZvciBleGFtcGxlLCBpZiBhIG1hc2tfYXJyYXkgaXMgb2J0YWluZWQgdXNpbmcgdGhlIGFycmF5IChmYWxzZSwgdHJ1ZSwKKyAgICogIGZhbHNlLCB0cnVlKSBhcyBhbiBhcmd1bWVudCwgdGhlIG1hc2sgYXJyYXkgaGFzIHR3byBlbGVtZW50cyByZWZlcnJpbmcKKyAgICogIHRvIGFycmF5WzFdIGFuZCBhcnJheVszXSBpbiB0aGUgdW5kZXJseWluZyBhcnJheS4KKyAgICoKKyAgICogIEBwYXJhbSAgVHAgIEVsZW1lbnQgdHlwZS4KKyAgICovCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgY2xhc3MgbWFza19hcnJheQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNTMuIHZhbGFycmF5IGhlbHBlciBmdW5jdGlvbnMgYXJlIGFsbW9zdCBlbnRpcmVseSB1c2VsZXNzCisKKyAgICAgIC8vLyAgQ29weSBjb25zdHJ1Y3Rvci4gIEJvdGggc2xpY2VzIHJlZmVyIHRvIHRoZSBzYW1lIHVuZGVybHlpbmcgYXJyYXkuCisgICAgICBtYXNrX2FycmF5IChjb25zdCBtYXNrX2FycmF5Jik7CisgICAgICAKKyAgICAgIC8vLyAgQXNzaWdubWVudCBvcGVyYXRvci4gIEFzc2lnbnMgZWxlbWVudHMgdG8gY29ycmVzcG9uZGluZyBlbGVtZW50cworICAgICAgLy8vICBvZiBAYSBhLgorICAgICAgbWFza19hcnJheSYgb3BlcmF0b3I9KGNvbnN0IG1hc2tfYXJyYXkmKTsKKworICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBNdWx0aXBseSBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yKj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBEaXZpZGUgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvci89KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTW9kdWxvIHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3IlPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIEFkZCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYgdG8gc2xpY2UgZWxlbWVudHMuCisgICAgICB2b2lkIG9wZXJhdG9yKz0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBTdWJ0cmFjdCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYgZnJvbSBzbGljZSBlbGVtZW50cy4KKyAgICAgIHZvaWQgb3BlcmF0b3ItPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExvZ2ljYWwgeG9yIHNsaWNlIGVsZW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcl49KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTG9naWNhbCBhbmQgc2xpY2UgZWxlbWVudHMgd2l0aCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yJj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMb2dpY2FsIG9yIHNsaWNlIGVsZW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcnw9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTGVmdCBzaGlmdCBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yPDw9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgUmlnaHQgc2hpZnQgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcj4+PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIEFzc2lnbiBhbGwgc2xpY2UgZWxlbWVudHMgdG8gQGEgdC4KKyAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IF9UcCYpIGNvbnN0OworCisgICAgICAgIC8vICAgICAgICB+bWFza19hcnJheSAoKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yKj0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yLz0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yJT0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yKz0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yLT0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yXj0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yJj0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yfD0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yPDw9KGNvbnN0IF9FeHByPF9Eb20sX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcj4+PShjb25zdCBfRXhwcjxfRG9tLF9UcD4mKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICBtYXNrX2FycmF5KF9BcnJheTxfVHA+LCBzaXplX3QsIF9BcnJheTxib29sPik7CisgICAgICBmcmllbmQgY2xhc3MgdmFsYXJyYXk8X1RwPjsKKworICAgICAgY29uc3Qgc2l6ZV90ICAgICAgIF9NX3N6OworICAgICAgY29uc3QgX0FycmF5PGJvb2w+IF9NX21hc2s7CisgICAgICBjb25zdCBfQXJyYXk8X1RwPiAgX01fYXJyYXk7CisKKyAgICAgIC8vIG5vdCBpbXBsZW1lbnRlZAorICAgICAgbWFza19hcnJheSgpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBtYXNrX2FycmF5PF9UcD46Om1hc2tfYXJyYXkoY29uc3QgbWFza19hcnJheTxfVHA+JiBhKQorICAgIDogX01fc3ooYS5fTV9zeiksIF9NX21hc2soYS5fTV9tYXNrKSwgX01fYXJyYXkoYS5fTV9hcnJheSkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lCisgICAgbWFza19hcnJheTxfVHA+OjptYXNrX2FycmF5KF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fcywgX0FycmF5PGJvb2w+IF9fbSkKKyAgICA6IF9NX3N6KF9fcyksIF9NX21hc2soX19tKSwgX01fYXJyYXkoX19hKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgbWFza19hcnJheTxfVHA+JgorICAgIG1hc2tfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYgX19hKQorICAgIHsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9jb3B5KF9fYS5fTV9hcnJheSwgX19hLl9NX21hc2ssCisJCQkgICBfTV9zeiwgX01fYXJyYXksIF9NX21hc2spOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBtYXNrX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICB7IHN0ZDo6X192YWxhcnJheV9maWxsKF9NX2FycmF5LCBfTV9zeiwgX01fbWFzaywgX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIG1hc2tfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikgY29uc3QKKyAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+KF9fdiksIF9fdi5zaXplKCksIF9NX2FycmF5LCBfTV9tYXNrKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRXg+CisgICAgICBpbmxpbmUgdm9pZAorICAgICAgbWFza19hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgX0V4cHI8X0V4LCBfVHA+JiBfX2UpIGNvbnN0CisgICAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5KF9fZSwgX19lLnNpemUoKSwgX01fYXJyYXksIF9NX21hc2spOyB9CisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SCisjZGVmaW5lIF9ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoX09wLCBfTmFtZSkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIGlubGluZSB2b2lkCQkJCQkJCQlcCisgICAgbWFza19hcnJheTxfVHA+OjpvcGVyYXRvciBfT3AjIz0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KSBjb25zdAlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfTV9hcnJheSwgX01fbWFzaywJCQlcCisJCQkgICAgICAgX0FycmF5PF9UcD4oX192KSwgX192LnNpemUoKSk7CQlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgkJCSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlubGluZSB2b2lkCQkJCQkJCVwKKyAgICAgIG1hc2tfYXJyYXk8X1RwPjo6b3BlcmF0b3IgX09wIyM9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSkgY29uc3RcCisgICAgICB7CQkJCQkJCQkJXAorCV9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfTV9hcnJheSwgX01fbWFzaywgX19lLCBfX2Uuc2l6ZSgpKTsgICBcCisgICAgICB9CisKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoKiwgX19tdWx0aXBsaWVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigvLCBfX2RpdmlkZXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCUsIF9fbW9kdWx1cykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoKywgX19wbHVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigtLCBfX21pbnVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUiheLCBfX2JpdHdpc2VfeG9yKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigmLCBfX2JpdHdpc2VfYW5kKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUih8LCBfX2JpdHdpc2Vfb3IpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKDw8LCBfX3NoaWZ0X2xlZnQpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKD4+LCBfX3NoaWZ0X3JpZ2h0KQorCisjdW5kZWYgX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUgorCisgIC8vIEB9IGdyb3VwIG51bWVyaWNfYXJyYXlzCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9NQVNLX0FSUkFZX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9tZW1vcnlmd2QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9tZW1vcnlmd2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzg1OTcwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL21lbW9yeWZ3ZC5oCkBAIC0wLDAgKzEsNzggQEAKKy8vIDxtZW1vcnk+IEZvcndhcmQgZGVjbGFyYXRpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvbWVtb3J5ZndkLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttZW1vcnl9CisgKi8KKworI2lmbmRlZiBfTUVNT1JZRldEX0gKKyNkZWZpbmUgX01FTU9SWUZXRF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgYWxsb2NhdG9ycyBBbGxvY2F0b3JzCisgICAqIEBpbmdyb3VwIG1lbW9yeQorICAgKgorICAgKiBDbGFzc2VzIGVuY2Fwc3VsYXRpbmcgbWVtb3J5IG9wZXJhdGlvbnMuCisgICAqCisgICAqIEB7CisgICAqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIGNsYXNzIGFsbG9jYXRvcjsKKworICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgYWxsb2NhdG9yPHZvaWQ+OworCisgIC8vLyBEZWNsYXJlIHVzZXNfYWxsb2NhdG9yIHNvIGl0IGNhbiBiZSBzcGVjaWFsaXplZCBpbiBcPHF1ZXVlXD4gZXRjLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgc3RydWN0IHVzZXNfYWxsb2NhdG9yOworCisgIC8vLyBAfSBncm91cCBtZW1vcnkKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbW92ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL21vdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjZjNjFmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL21vdmUuaApAQCAtMCwwICsxLDE5OCBAQAorLy8gTW92ZSwgZm9yd2FyZCBhbmQgaWRlbnRpdHkgZm9yIEMrKzB4ICsgc3dhcCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9tb3ZlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt1dGlsaXR5fQorICovCisKKyNpZm5kZWYgX01PVkVfSAorI2RlZmluZSBfTU9WRV9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBVc2VkLCBpbiBDKyswMyBtb2RlIHRvbywgYnkgYWxsb2NhdG9ycywgZXRjLgorICAvKioKKyAgICogIEBicmllZiBTYW1lIGFzIEMrKzExIHN0ZDo6YWRkcmVzc29mCisgICAqICBAaW5ncm91cCB1dGlsaXRpZXMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwKgorICAgIF9fYWRkcmVzc29mKF9UcCYgX19yKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PF9UcCo+CisJKCZjb25zdF9jYXN0PGNoYXImPihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvbGF0aWxlIGNoYXImPihfX3IpKSk7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+IC8vIEJyaW5ncyBpbiBzdGQ6OmRlY2x2YWwgdG9vLgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYWRkdG9ncm91cCB1dGlsaXRpZXMKKyAgICogIEB7CisgICAqLworCisgIC8qKgorICAgKiAgQGJyaWVmICBGb3J3YXJkIGFuIGx2YWx1ZS4KKyAgICogIEByZXR1cm4gVGhlIHBhcmFtZXRlciBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbXBsZW1lbnQgInBlcmZlY3QgZm9yd2FyZGluZyIuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIF9UcCYmCisgICAgZm9yd2FyZCh0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSYgX190KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcCYmPihfX3QpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZvcndhcmQgYW4gcnZhbHVlLgorICAgKiAgQHJldHVybiBUaGUgcGFyYW1ldGVyIGNhc3QgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICAgKgorICAgKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGltcGxlbWVudCAicGVyZmVjdCBmb3J3YXJkaW5nIi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgX1RwJiYKKyAgICBmb3J3YXJkKHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlJiYgX190KSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfbHZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSwgInRlbXBsYXRlIGFyZ3VtZW50IgorCQkgICAgIiBzdWJzdGl0dXRpbmcgX1RwIGlzIGFuIGx2YWx1ZSByZWZlcmVuY2UgdHlwZSIpOworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9UcCYmPihfX3QpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQ29udmVydCBhIHZhbHVlIHRvIGFuIHJ2YWx1ZS4KKyAgICogIEBwYXJhbSAgX190ICBBIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHJldHVybiBUaGUgcGFyYW1ldGVyIGNhc3QgdG8gYW4gcnZhbHVlLXJlZmVyZW5jZSB0byBhbGxvdyBtb3ZpbmcgaXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGUmJgorICAgIG1vdmUoX1RwJiYgX190KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlJiY+KF9fdCk7IH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19tb3ZlX2lmX25vZXhjZXB0X2NvbmQKKyAgICA6IHB1YmxpYyBfX2FuZF88X19ub3RfPGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9UcD4+LAorICAgICAgICAgICAgICAgICAgICBpc19jb3B5X2NvbnN0cnVjdGlibGU8X1RwPj46OnR5cGUgeyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25kaXRpb25hbGx5IGNvbnZlcnQgYSB2YWx1ZSB0byBhbiBydmFsdWUuCisgICAqICBAcGFyYW0gIF9feCAgQSB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEByZXR1cm4gVGhlIHBhcmFtZXRlciwgcG9zc2libHkgY2FzdCB0byBhbiBydmFsdWUtcmVmZXJlbmNlLgorICAgKgorICAgKiAgU2FtZSBhcyBzdGQ6Om1vdmUgdW5sZXNzIHRoZSB0eXBlJ3MgbW92ZSBjb25zdHJ1Y3RvciBjb3VsZCB0aHJvdyBhbmQgdGhlCisgICAqICB0eXBlIGlzIGNvcHlhYmxlLCBpbiB3aGljaCBjYXNlIGFuIGx2YWx1ZS1yZWZlcmVuY2UgaXMgcmV0dXJuZWQgaW5zdGVhZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lCisgICAgY29uZGl0aW9uYWw8X19tb3ZlX2lmX25vZXhjZXB0X2NvbmQ8X1RwPjo6dmFsdWUsIGNvbnN0IF9UcCYsIF9UcCYmPjo6dHlwZQorICAgIG1vdmVfaWZfbm9leGNlcHQoX1RwJiBfX3gpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gc3RkOjptb3ZlKF9feCk7IH0KKworICAvLyBkZWNsdmFsLCBmcm9tIHR5cGVfdHJhaXRzLgorCisgIC8qKgorICAgKiAgQGJyaWVmIFJldHVybnMgdGhlIGFjdHVhbCBhZGRyZXNzIG9mIHRoZSBvYmplY3Qgb3IgZnVuY3Rpb24KKyAgICogICAgICAgICByZWZlcmVuY2VkIGJ5IHIsIGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIGFuIG92ZXJsb2FkZWQKKyAgICogICAgICAgICBvcGVyYXRvciYuCisgICAqICBAcGFyYW0gIF9fciAgUmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvciBmdW5jdGlvbi4KKyAgICogIEByZXR1cm4gICBUaGUgYWN0dWFsIGFkZHJlc3MuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwKgorICAgIGFkZHJlc3NvZihfVHAmIF9fcikgbm9leGNlcHQKKyAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9fcik7IH0KKworICAvLy8gQH0gZ3JvdXAgdXRpbGl0aWVzCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNkZWZpbmUgX0dMSUJDWFhfTU9WRShfX3ZhbCkgc3RkOjptb3ZlKF9fdmFsKQorI2RlZmluZSBfR0xJQkNYWF9GT1JXQVJEKF9UcCwgX192YWwpIHN0ZDo6Zm9yd2FyZDxfVHA+KF9fdmFsKQorI2Vsc2UKKyNkZWZpbmUgX0dMSUJDWFhfTU9WRShfX3ZhbCkgKF9fdmFsKQorI2RlZmluZSBfR0xJQkNYWF9GT1JXQVJEKF9UcCwgX192YWwpIChfX3ZhbCkKKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYWRkdG9ncm91cCB1dGlsaXRpZXMKKyAgICogIEB7CisgICAqLworCisgIC8qKgorICAgKiAgQGJyaWVmIFN3YXBzIHR3byB2YWx1ZXMuCisgICAqICBAcGFyYW0gIF9fYSAgQSB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEBwYXJhbSAgX19iICBBbm90aGVyIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHJldHVybiAgIE5vdGhpbmcuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoX1RwJiBfX2EsIF9UcCYgX19iKQorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBub2V4Y2VwdChfX2FuZF88aXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8X1RwPiwKKwkgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfVHA+Pjo6dmFsdWUpCisjZW5kaWYKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9TR0lBc3NpZ25hYmxlQ29uY2VwdDxfVHA+KQorCisgICAgICBfVHAgX190bXAgPSBfR0xJQkNYWF9NT1ZFKF9fYSk7CisgICAgICBfX2EgPSBfR0xJQkNYWF9NT1ZFKF9fYik7CisgICAgICBfX2IgPSBfR0xJQkNYWF9NT1ZFKF9fdG1wKTsKKyAgICB9CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyBEUiA4MDkuIHN0ZDo6c3dhcCBzaG91bGQgYmUgb3ZlcmxvYWRlZCBmb3IgYXJyYXkgdHlwZXMuCisgIC8vLyBTd2FwIHRoZSBjb250ZW50cyBvZiB0d28gYXJyYXlzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHNpemVfdCBfTm0+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9UcCAoJl9fYSlbX05tXSwgX1RwICgmX19iKVtfTm1dKQorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBub2V4Y2VwdChub2V4Y2VwdChzd2FwKCpfX2EsICpfX2IpKSkKKyNlbmRpZgorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90IF9fbiA9IDA7IF9fbiA8IF9ObTsgKytfX24pCisJc3dhcChfX2FbX19uXSwgX19iW19fbl0pOworICAgIH0KKworICAvLy8gQH0gZ3JvdXAgdXRpbGl0aWVzCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfTU9WRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbmVzdGVkX2V4Y2VwdGlvbi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL25lc3RlZF9leGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWE1ZDBkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL25lc3RlZF9leGNlcHRpb24uaApAQCAtMCwwICsxLDE2NiBAQAorLy8gTmVzdGVkIEV4Y2VwdGlvbiBzdXBwb3J0IGhlYWRlciAobmVzdGVkX2V4Y2VwdGlvbiBjbGFzcykgZm9yIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL25lc3RlZF9leGNlcHRpb24uaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4Y2VwdGlvbn0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX05FU1RFRF9FWENFUFRJT05fSAorI2RlZmluZSBfR0xJQkNYWF9ORVNURURfRVhDRVBUSU9OX0ggMQorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisjaWYgQVRPTUlDX0lOVF9MT0NLX0ZSRUUgPCAyCisjICBlcnJvciBUaGlzIHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgZXhjZXB0aW9uIHByb3BhZ2F0aW9uLgorI2VuZGlmCisKK2V4dGVybiAiQysrIiB7CisKK25hbWVzcGFjZSBzdGQKK3sKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIGV4Y2VwdGlvbnMKKyAgICogQHsKKyAgICovCisKKyAgLy8vIEV4Y2VwdGlvbiBjbGFzcyB3aXRoIGV4Y2VwdGlvbl9wdHIgZGF0YSBtZW1iZXIuCisgIGNsYXNzIG5lc3RlZF9leGNlcHRpb24KKyAgeworICAgIGV4Y2VwdGlvbl9wdHIgX01fcHRyOworCisgIHB1YmxpYzoKKyAgICBuZXN0ZWRfZXhjZXB0aW9uKCkgbm9leGNlcHQgOiBfTV9wdHIoY3VycmVudF9leGNlcHRpb24oKSkgeyB9CisKKyAgICBuZXN0ZWRfZXhjZXB0aW9uKGNvbnN0IG5lc3RlZF9leGNlcHRpb24mKSA9IGRlZmF1bHQ7CisKKyAgICBuZXN0ZWRfZXhjZXB0aW9uJiBvcGVyYXRvcj0oY29uc3QgbmVzdGVkX2V4Y2VwdGlvbiYpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfm5lc3RlZF9leGNlcHRpb24oKSBub2V4Y2VwdDsKKworICAgIHZvaWQKKyAgICByZXRocm93X25lc3RlZCgpIGNvbnN0IF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKQorICAgIHsgcmV0aHJvd19leGNlcHRpb24oX01fcHRyKTsgfQorCisgICAgZXhjZXB0aW9uX3B0cgorICAgIG5lc3RlZF9wdHIoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3B0cjsgfQorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeGNlcHQ+CisgICAgc3RydWN0IF9OZXN0ZWRfZXhjZXB0aW9uIDogcHVibGljIF9FeGNlcHQsIHB1YmxpYyBuZXN0ZWRfZXhjZXB0aW9uCisgICAgeworICAgICAgZXhwbGljaXQgX05lc3RlZF9leGNlcHRpb24oX0V4Y2VwdCYmIF9fZXgpCisgICAgICA6IF9FeGNlcHQoc3RhdGljX2Nhc3Q8X0V4Y2VwdCYmPihfX2V4KSkKKyAgICAgIHsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4PgorICAgIHN0cnVjdCBfX2dldF9uZXN0ZWRfaGVscGVyCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IG5lc3RlZF9leGNlcHRpb24qCisgICAgICBfU19nZXQoY29uc3QgX0V4JiBfX2V4KQorICAgICAgeyByZXR1cm4gZHluYW1pY19jYXN0PGNvbnN0IG5lc3RlZF9leGNlcHRpb24qPigmX19leCk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeD4KKyAgICBzdHJ1Y3QgX19nZXRfbmVzdGVkX2hlbHBlcjxfRXgqPgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBuZXN0ZWRfZXhjZXB0aW9uKgorICAgICAgX1NfZ2V0KGNvbnN0IF9FeCogX19leCkKKyAgICAgIHsgcmV0dXJuIGR5bmFtaWNfY2FzdDxjb25zdCBuZXN0ZWRfZXhjZXB0aW9uKj4oX19leCk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeD4KKyAgICBpbmxpbmUgY29uc3QgbmVzdGVkX2V4Y2VwdGlvbioKKyAgICBfX2dldF9uZXN0ZWRfZXhjZXB0aW9uKGNvbnN0IF9FeCYgX19leCkKKyAgICB7IHJldHVybiBfX2dldF9uZXN0ZWRfaGVscGVyPF9FeD46Ol9TX2dldChfX2V4KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeD4KKyAgICB2b2lkCisgICAgX190aHJvd193aXRoX25lc3RlZChfRXgmJiwgY29uc3QgbmVzdGVkX2V4Y2VwdGlvbiogPSAwKQorICAgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXg+CisgICAgdm9pZAorICAgIF9fdGhyb3dfd2l0aF9uZXN0ZWQoX0V4JiYsIC4uLikgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCisgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCwgYnV0IGlzIG5lZWRlZCB0byBhdm9pZCBhIHdhcm5pbmcKKyAgLy8gYWJvdXQgYW1iaWd1b3VzIGJhc2UgY2xhc3NlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhyb3dfd2l0aF9uZXN0ZWQ8X0V4PigpCisgIC8vIHdpdGggYSB0eXBlIHRoYXQgaGFzIGFuIGFjY2Vzc2libGUgbmVzdGVkX2V4Y2VwdGlvbiBiYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXg+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3Rocm93X3dpdGhfbmVzdGVkKF9FeCYmIF9fZXgsIGNvbnN0IG5lc3RlZF9leGNlcHRpb24qKQorICAgIHsgdGhyb3cgX19leDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdGhyb3dfd2l0aF9uZXN0ZWQoX0V4JiYgX19leCwgLi4uKQorICAgIHsgdGhyb3cgX05lc3RlZF9leGNlcHRpb248X0V4PihzdGF0aWNfY2FzdDxfRXgmJj4oX19leCkpOyB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXg+CisgICAgdm9pZAorICAgIHRocm93X3dpdGhfbmVzdGVkKF9FeCBfX2V4KSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisKKyAgLy8vIElmIEBwIF9fZXggaXMgZGVyaXZlZCBmcm9tIG5lc3RlZF9leGNlcHRpb24sIEBwIF9fZXguIAorICAvLy8gRWxzZSwgYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCBvYmplY3QgZGVyaXZlZCBmcm9tIGJvdGguCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHRocm93X3dpdGhfbmVzdGVkKF9FeCBfX2V4KQorICAgIHsKKyAgICAgIGlmIChfX2dldF9uZXN0ZWRfZXhjZXB0aW9uKF9fZXgpKQorICAgICAgICB0aHJvdyBfX2V4OworICAgICAgX190aHJvd193aXRoX25lc3RlZChzdGF0aWNfY2FzdDxfRXgmJj4oX19leCksICZfX2V4KTsKKyAgICB9CisKKyAgLy8vIElmIEBwIF9fZXggaXMgZGVyaXZlZCBmcm9tIG5lc3RlZF9leGNlcHRpb24sIEBwIF9fZXgucmV0aHJvd19uZXN0ZWQoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4PgorICAgIGlubGluZSB2b2lkCisgICAgcmV0aHJvd19pZl9uZXN0ZWQoY29uc3QgX0V4JiBfX2V4KQorICAgIHsKKyAgICAgIGlmIChjb25zdCBuZXN0ZWRfZXhjZXB0aW9uKiBfX25lc3RlZCA9IF9fZ2V0X25lc3RlZF9leGNlcHRpb24oX19leCkpCisgICAgICAgIF9fbmVzdGVkLT5yZXRocm93X25lc3RlZCgpOworICAgIH0KKworICAvLy8gT3ZlcmxvYWQsIFNlZSBOMjYxOQorICBpbmxpbmUgdm9pZAorICByZXRocm93X2lmX25lc3RlZChjb25zdCBuZXN0ZWRfZXhjZXB0aW9uJiBfX2V4KQorICB7IF9fZXgucmV0aHJvd19uZXN0ZWQoKTsgfQorCisgIC8vIEB9IGdyb3VwIGV4Y2VwdGlvbnMKK30gLy8gbmFtZXNwYWNlIHN0ZAorCit9IC8vIGV4dGVybiAiQysrIgorCisjZW5kaWYgLy8gQysrMTEKKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwb3AKKworI2VuZGlmIC8vIF9HTElCQ1hYX05FU1RFRF9FWENFUFRJT05fSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL29zdHJlYW0udGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL29zdHJlYW0udGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MDRhMjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvb3N0cmVhbS50Y2MKQEAgLTAsMCArMSw0MDcgQEAKKy8vIG9zdHJlYW0gY2xhc3NlcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9vc3RyZWFtLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le29zdHJlYW19CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjYuMiAgT3V0cHV0IHN0cmVhbXMKKy8vCisKKyNpZm5kZWYgX09TVFJFQU1fVENDCisjZGVmaW5lIF9PU1RSRUFNX1RDQyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvY3h4YWJpX2ZvcmNlZC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c2VudHJ5OjoKKyAgICBzZW50cnkoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zKQorICAgIDogX01fb2soZmFsc2UpLCBfTV9vcyhfX29zKQorICAgIHsKKyAgICAgIC8vIFhYWCBNVAorICAgICAgaWYgKF9fb3MudGllKCkgJiYgX19vcy5nb29kKCkpCisJX19vcy50aWUoKS0+Zmx1c2goKTsKKworICAgICAgaWYgKF9fb3MuZ29vZCgpKQorCV9NX29rID0gdHJ1ZTsKKyAgICAgIGVsc2UKKwlfX29zLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZVQ+CisgICAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgICAgX01faW5zZXJ0KF9WYWx1ZVQgX192KQorICAgICAgeworCXNlbnRyeSBfX2NlcmIoKnRoaXMpOworCWlmIChfX2NlcmIpCisJICB7CisJICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICAgIF9fdHJ5CisJICAgICAgeworCQljb25zdCBfX251bV9wdXRfdHlwZSYgX19ucCA9IF9fY2hlY2tfZmFjZXQodGhpcy0+X01fbnVtX3B1dCk7CisJCWlmIChfX25wLnB1dCgqdGhpcywgKnRoaXMsIHRoaXMtPmZpbGwoKSwgX192KS5mYWlsZWQoKSkKKwkJICBfX2VyciB8PSBpb3NfYmFzZTo6YmFkYml0OworCSAgICAgIH0KKwkgICAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICAgIHsKKwkJdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CQkKKwkJX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgICAgfQorCSAgICBfX2NhdGNoKC4uLikKKwkgICAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICAgIGlmIChfX2VycikKKwkgICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJICB9CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBvcGVyYXRvcjw8KHNob3J0IF9fbikKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMTcuIGJhc2ljX29zdHJlYW0gdXNlcyBub25leGlzdGVudCBudW1fcHV0IG1lbWJlciBmdW5jdGlvbnMuCisgICAgICBjb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbXQgPSB0aGlzLT5mbGFncygpICYgaW9zX2Jhc2U6OmJhc2VmaWVsZDsKKyAgICAgIGlmIChfX2ZtdCA9PSBpb3NfYmFzZTo6b2N0IHx8IF9fZm10ID09IGlvc19iYXNlOjpoZXgpCisJcmV0dXJuIF9NX2luc2VydChzdGF0aWNfY2FzdDxsb25nPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oX19uKSkpOworICAgICAgZWxzZQorCXJldHVybiBfTV9pbnNlcnQoc3RhdGljX2Nhc3Q8bG9uZz4oX19uKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBvcGVyYXRvcjw8KGludCBfX24pCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTE3LiBiYXNpY19vc3RyZWFtIHVzZXMgbm9uZXhpc3RlbnQgbnVtX3B1dCBtZW1iZXIgZnVuY3Rpb25zLgorICAgICAgY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZm10ID0gdGhpcy0+ZmxhZ3MoKSAmIGlvc19iYXNlOjpiYXNlZmllbGQ7CisgICAgICBpZiAoX19mbXQgPT0gaW9zX2Jhc2U6Om9jdCB8fCBfX2ZtdCA9PSBpb3NfYmFzZTo6aGV4KQorCXJldHVybiBfTV9pbnNlcnQoc3RhdGljX2Nhc3Q8bG9uZz4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihfX24pKSk7CisgICAgICBlbHNlCisJcmV0dXJuIF9NX2luc2VydChzdGF0aWNfY2FzdDxsb25nPihfX24pKTsKKyAgICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgb3BlcmF0b3I8PChfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiaW4pCisgICAgeworICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMpOworICAgICAgaWYgKF9fY2VyYiAmJiBfX3NiaW4pCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIGlmICghX19jb3B5X3N0cmVhbWJ1ZnMoX19zYmluLCB0aGlzLT5yZGJ1ZigpKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwkJCisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsgfQorCX0KKyAgICAgIGVsc2UgaWYgKCFfX3NiaW4pCisJX19lcnIgfD0gaW9zX2Jhc2U6OmJhZGJpdDsKKyAgICAgIGlmIChfX2VycikKKwl0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBwdXQoY2hhcl90eXBlIF9fYykKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA2MC4gV2hhdCBpcyBhIGZvcm1hdHRlZCBpbnB1dCBmdW5jdGlvbj8KKyAgICAgIC8vIGJhc2ljX29zdHJlYW06OnB1dChjaGFyX3R5cGUpIGlzIGFuIHVuZm9ybWF0dGVkIG91dHB1dCBmdW5jdGlvbi4KKyAgICAgIC8vIERSIDYzLiBFeGNlcHRpb24taGFuZGxpbmcgcG9saWN5IGZvciB1bmZvcm1hdHRlZCBvdXRwdXQuCisgICAgICAvLyBVbmZvcm1hdHRlZCBvdXRwdXQgZnVuY3Rpb25zIHNob3VsZCBjYXRjaCBleGNlcHRpb25zIHRocm93bgorICAgICAgLy8gZnJvbSBzdHJlYW1idWYgbWVtYmVycy4KKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGNvbnN0IGludF90eXBlIF9fcHV0ID0gdGhpcy0+cmRidWYoKS0+c3B1dGMoX19jKTsKKwkgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fcHV0LCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6YmFkYml0OworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsJCQorCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgd3JpdGUoY29uc3QgX0NoYXJUKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDYwLiBXaGF0IGlzIGEgZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uPworICAgICAgLy8gYmFzaWNfb3N0cmVhbTo6d3JpdGUoY29uc3QgY2hhcl90eXBlKiwgc3RyZWFtc2l6ZSkgaXMgYW4KKyAgICAgIC8vIHVuZm9ybWF0dGVkIG91dHB1dCBmdW5jdGlvbi4KKyAgICAgIC8vIERSIDYzLiBFeGNlcHRpb24taGFuZGxpbmcgcG9saWN5IGZvciB1bmZvcm1hdHRlZCBvdXRwdXQuCisgICAgICAvLyBVbmZvcm1hdHRlZCBvdXRwdXQgZnVuY3Rpb25zIHNob3VsZCBjYXRjaCBleGNlcHRpb25zIHRocm93bgorICAgICAgLy8gZnJvbSBzdHJlYW1idWYgbWVtYmVycy4KKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBfX3RyeQorCSAgICB7IF9NX3dyaXRlKF9fcywgX19uKTsgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CQkKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBmbHVzaCgpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgNjAuIFdoYXQgaXMgYSBmb3JtYXR0ZWQgaW5wdXQgZnVuY3Rpb24/CisgICAgICAvLyBiYXNpY19vc3RyZWFtOjpmbHVzaCgpIGlzICpub3QqIGFuIHVuZm9ybWF0dGVkIG91dHB1dCBmdW5jdGlvbi4KKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICBfX3RyeQorCXsKKwkgIGlmICh0aGlzLT5yZGJ1ZigpICYmIHRoaXMtPnJkYnVmKCktPnB1YnN5bmMoKSA9PSAtMSkKKwkgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmJhZGJpdDsKKwl9CisgICAgICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJeworCSAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CQkKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKyAgICAgIGlmIChfX2VycikKKwl0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnBvc190eXBlCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICB0ZWxscCgpCisgICAgeworICAgICAgcG9zX3R5cGUgX19yZXQgPSBwb3NfdHlwZSgtMSk7CisgICAgICBfX3RyeQorCXsKKwkgIGlmICghdGhpcy0+ZmFpbCgpKQorCSAgICBfX3JldCA9IHRoaXMtPnJkYnVmKCktPnB1YnNlZWtvZmYoMCwgaW9zX2Jhc2U6OmN1ciwgaW9zX2Jhc2U6Om91dCk7CisJfQorICAgICAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCXsKKwkgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwkJCisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzZWVrcChwb3NfdHlwZSBfX3BvcykKKyAgICB7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgX190cnkKKwl7CisJICBpZiAoIXRoaXMtPmZhaWwoKSkKKwkgICAgeworCSAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgICAgICAvLyAxMzYuICBzZWVrcCwgc2Vla2cgc2V0dGluZyB3cm9uZyBzdHJlYW1zPworCSAgICAgIGNvbnN0IHBvc190eXBlIF9fcCA9IHRoaXMtPnJkYnVmKCktPnB1YnNlZWtwb3MoX19wb3MsCisJCQkJCQkJICAgICBpb3NfYmFzZTo6b3V0KTsKKworCSAgICAgIC8vIDEyOS4gTmVlZCBlcnJvciBpbmRpY2F0aW9uIGZyb20gc2Vla3AoKSBhbmQgc2Vla2coKQorCSAgICAgIGlmIChfX3AgPT0gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgIH0KKwl9CisgICAgICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJeworCSAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CQkKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKyAgICAgIGlmIChfX2VycikKKwl0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzZWVrcChvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX19kaXIpCisgICAgeworICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIF9fdHJ5CisJeworCSAgaWYgKCF0aGlzLT5mYWlsKCkpCisJICAgIHsKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gMTM2LiAgc2Vla3AsIHNlZWtnIHNldHRpbmcgd3Jvbmcgc3RyZWFtcz8KKwkgICAgICBjb25zdCBwb3NfdHlwZSBfX3AgPSB0aGlzLT5yZGJ1ZigpLT5wdWJzZWVrb2ZmKF9fb2ZmLCBfX2RpciwKKwkJCQkJCQkgICAgIGlvc19iYXNlOjpvdXQpOworCisJICAgICAgLy8gMTI5LiBOZWVkIGVycm9yIGluZGljYXRpb24gZnJvbSBzZWVrcCgpIGFuZCBzZWVrZygpCisJICAgICAgaWYgKF9fcCA9PSBwb3NfdHlwZShvZmZfdHlwZSgtMSkpKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgICAgfQorCX0KKyAgICAgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwl7CisJICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsJCQorCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vdXQsIGNvbnN0IGNoYXIqIF9fcykKKyAgICB7CisgICAgICBpZiAoIV9fcykKKwlfX291dC5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKyAgICAgIGVsc2UKKwl7CisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyAxNjcuICBJbXByb3BlciB1c2Ugb2YgdHJhaXRzX3R5cGU6Omxlbmd0aCgpCisJICBjb25zdCBzaXplX3QgX19jbGVuID0gY2hhcl90cmFpdHM8Y2hhcj46Omxlbmd0aChfX3MpOworCSAgX190cnkKKwkgICAgeworCSAgICAgIHN0cnVjdCBfX3B0cl9ndWFyZAorCSAgICAgIHsKKwkJX0NoYXJUICpfX3A7CisJCV9fcHRyX2d1YXJkIChfQ2hhclQgKl9faXApOiBfX3AoX19pcCkgeyB9CisJCX5fX3B0cl9ndWFyZCgpIHsgZGVsZXRlW10gX19wOyB9CisJCV9DaGFyVCogX19nZXQoKSB7IHJldHVybiBfX3A7IH0KKwkgICAgICB9IF9fcGcgKG5ldyBfQ2hhclRbX19jbGVuXSk7CisKKwkgICAgICBfQ2hhclQgKl9fd3MgPSBfX3BnLl9fZ2V0KCk7CisJICAgICAgZm9yIChzaXplX3QgIF9faSA9IDA7IF9faSA8IF9fY2xlbjsgKytfX2kpCisJCV9fd3NbX19pXSA9IF9fb3V0LndpZGVuKF9fc1tfX2ldKTsKKwkgICAgICBfX29zdHJlYW1faW5zZXJ0KF9fb3V0LCBfX3dzLCBfX2NsZW4pOworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICBfX291dC5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgX19vdXQuX01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwl9CisgICAgICByZXR1cm4gX19vdXQ7CisgICAgfQorCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfb3N0cmVhbTxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIGVuZGwob3N0cmVhbSYpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgZW5kcyhvc3RyZWFtJik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBmbHVzaChvc3RyZWFtJik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBjaGFyKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYsIHVuc2lnbmVkIGNoYXIpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgc2lnbmVkIGNoYXIpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgY29uc3QgY2hhciopOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgY29uc3QgdW5zaWduZWQgY2hhciopOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgY29uc3Qgc2lnbmVkIGNoYXIqKTsKKworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3N0cmVhbTo6X01faW5zZXJ0KGxvbmcpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3N0cmVhbTo6X01faW5zZXJ0KHVuc2lnbmVkIGxvbmcpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3N0cmVhbTo6X01faW5zZXJ0KGJvb2wpOworI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9zdHJlYW06Ol9NX2luc2VydChsb25nIGxvbmcpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3N0cmVhbTo6X01faW5zZXJ0KHVuc2lnbmVkIGxvbmcgbG9uZyk7CisjZW5kaWYKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9zdHJlYW06Ol9NX2luc2VydChkb3VibGUpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3N0cmVhbTo6X01faW5zZXJ0KGxvbmcgZG91YmxlKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9zdHJlYW06Ol9NX2luc2VydChjb25zdCB2b2lkKik7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfb3N0cmVhbTx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBlbmRsKHdvc3RyZWFtJik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgZW5kcyh3b3N0cmVhbSYpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIGZsdXNoKHdvc3RyZWFtJik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgb3BlcmF0b3I8PCh3b3N0cmVhbSYsIHdjaGFyX3QpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIG9wZXJhdG9yPDwod29zdHJlYW0mLCBjaGFyKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBvcGVyYXRvcjw8KHdvc3RyZWFtJiwgY29uc3Qgd2NoYXJfdCopOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIG9wZXJhdG9yPDwod29zdHJlYW0mLCBjb25zdCBjaGFyKik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiB3b3N0cmVhbTo6X01faW5zZXJ0KGxvbmcpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIHdvc3RyZWFtOjpfTV9pbnNlcnQodW5zaWduZWQgbG9uZyk7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgd29zdHJlYW06Ol9NX2luc2VydChib29sKTsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgd29zdHJlYW06Ol9NX2luc2VydChsb25nIGxvbmcpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIHdvc3RyZWFtOjpfTV9pbnNlcnQodW5zaWduZWQgbG9uZyBsb25nKTsKKyNlbmRpZgorICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIHdvc3RyZWFtOjpfTV9pbnNlcnQoZG91YmxlKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiB3b3N0cmVhbTo6X01faW5zZXJ0KGxvbmcgZG91YmxlKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiB3b3N0cmVhbTo6X01faW5zZXJ0KGNvbnN0IHZvaWQqKTsKKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL29zdHJlYW1faW5zZXJ0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvb3N0cmVhbV9pbnNlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmEwOWZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL29zdHJlYW1faW5zZXJ0LmgKQEAgLTAsMCArMSwxMjkgQEAKKy8vIEhlbHBlcnMgZm9yIG9zdHJlYW0gaW5zZXJ0ZXJzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL29zdHJlYW1faW5zZXJ0LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtvc3RyZWFtfQorICovCisKKyNpZm5kZWYgX09TVFJFQU1fSU5TRVJUX0gKKyNkZWZpbmUgX09TVFJFQU1fSU5TRVJUX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8Yml0cy9jeHhhYmlfZm9yY2VkLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX29zdHJlYW1fd3JpdGUoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX291dCwKKwkJICAgIGNvbnN0IF9DaGFyVCogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgICAgICBfX29zdHJlYW1fdHlwZTsgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19wdXQgPSBfX291dC5yZGJ1ZigpLT5zcHV0bihfX3MsIF9fbik7CisgICAgICBpZiAoX19wdXQgIT0gX19uKQorCV9fb3V0LnNldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fb3N0cmVhbV9maWxsKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vdXQsIHN0cmVhbXNpemUgX19uKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgICAgIF9fb3N0cmVhbV90eXBlOyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgX0NoYXJUIF9fYyA9IF9fb3V0LmZpbGwoKTsKKyAgICAgIGZvciAoOyBfX24gPiAwOyAtLV9fbikKKwl7CisJICBjb25zdCB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX3B1dCA9IF9fb3V0LnJkYnVmKCktPnNwdXRjKF9fYyk7CisJICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19wdXQsIF9UcmFpdHM6OmVvZigpKSkKKwkgICAgeworCSAgICAgIF9fb3V0LnNldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgX19vc3RyZWFtX2luc2VydChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LAorCQkgICAgIGNvbnN0IF9DaGFyVCogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgICAgICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjpzZW50cnkgX19jZXJiKF9fb3V0KTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX193ID0gX19vdXQud2lkdGgoKTsKKwkgICAgICBpZiAoX193ID4gX19uKQorCQl7CisJCSAgY29uc3QgYm9vbCBfX2xlZnQgPSAoKF9fb3V0LmZsYWdzKCkKKwkJCQkJJiBfX2lvc19iYXNlOjphZGp1c3RmaWVsZCkKKwkJCQkgICAgICAgPT0gX19pb3NfYmFzZTo6bGVmdCk7CisJCSAgaWYgKCFfX2xlZnQpCisJCSAgICBfX29zdHJlYW1fZmlsbChfX291dCwgX193IC0gX19uKTsKKwkJICBpZiAoX19vdXQuZ29vZCgpKQorCQkgICAgX19vc3RyZWFtX3dyaXRlKF9fb3V0LCBfX3MsIF9fbik7CisJCSAgaWYgKF9fbGVmdCAmJiBfX291dC5nb29kKCkpCisJCSAgICBfX29zdHJlYW1fZmlsbChfX291dCwgX193IC0gX19uKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJX19vc3RyZWFtX3dyaXRlKF9fb3V0LCBfX3MsIF9fbik7CisJICAgICAgX19vdXQud2lkdGgoMCk7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIF9fb3V0Ll9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IF9fb3V0Ll9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwl9CisgICAgICByZXR1cm4gX19vdXQ7CisgICAgfQorCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgX19vc3RyZWFtX2luc2VydChvc3RyZWFtJiwgY29uc3QgY2hhciosIHN0cmVhbXNpemUpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBfX29zdHJlYW1faW5zZXJ0KHdvc3RyZWFtJiwgY29uc3Qgd2NoYXJfdCosCisJCQkJCSAgICAgc3RyZWFtc2l6ZSk7CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX09TVFJFQU1fSU5TRVJUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9wb3N0eXBlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3Bvc3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4ZGZlMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9wb3N0eXBlcy5oCkBAIC0wLDAgKzEsMjQyIEBACisvLyBQb3NpdGlvbiB0eXBlcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9wb3N0eXBlcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zZndkfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy40LjEgLSBUeXBlcworLy8gSVNPIEMrKyAxNDg4MjogMjcuNC4zIC0gVGVtcGxhdGUgY2xhc3MgZnBvcworLy8KKworI2lmbmRlZiBfR0xJQkNYWF9QT1NUWVBFU19ICisjZGVmaW5lIF9HTElCQ1hYX1BPU1RZUEVTX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxjd2NoYXI+IC8vIEZvciBtYnN0YXRlX3QKKworLy8gWFhYIElmIDxzdGRpbnQuaD4gaXMgcmVhbGx5IG5lZWRlZCwgbWFrZSBzdXJlIHRvIGRlZmluZSB0aGUgbWFjcm9zCisvLyBiZWZvcmUgaW5jbHVkaW5nIGl0LCBpbiBvcmRlciBub3QgdG8gYnJlYWsgPHRyMS9jc3RkaW50PiAoYW5kIDxjc3RkaW50PgorLy8gaW4gQysrMHgpLiAgUmVjb25zaWRlciBhbGwgdGhpcyBhcyBzb29uIGFzIHBvc3NpYmxlLi4uCisjaWYgKGRlZmluZWQoX0dMSUJDWFhfSEFWRV9JTlQ2NF9UKSAmJiAhZGVmaW5lZChfR0xJQkNYWF9IQVZFX0lOVDY0X1RfTE9ORykgXAorICAgICAmJiAhZGVmaW5lZChfR0xJQkNYWF9IQVZFX0lOVDY0X1RfTE9OR19MT05HKSkKKworI2lmbmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjIGRlZmluZSBfVU5ERUZfX1NURENfTElNSVRfTUFDUk9TCisjIGRlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjZW5kaWYKKyNpZm5kZWYgX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyBkZWZpbmUgX1VOREVGX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyBkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUworI2VuZGlmCisjaW5jbHVkZSA8c3RkaW50Lmg+IC8vIEZvciBpbnQ2NF90CisjaWZkZWYgX1VOREVGX19TVERDX0xJTUlUX01BQ1JPUworIyB1bmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjIHVuZGVmIF9VTkRFRl9fU1REQ19MSU1JVF9NQUNST1MKKyNlbmRpZgorI2lmZGVmIF9VTkRFRl9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgdW5kZWYgX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyB1bmRlZiBfVU5ERUZfX1NURENfQ09OU1RBTlRfTUFDUk9TCisjZW5kaWYKKworI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBUaGUgdHlwZXMgc3RyZWFtb2ZmLCBzdHJlYW1wb3MgYW5kIHdzdHJlYW1wb3MgYW5kIHRoZSBjbGFzcworICAvLyB0ZW1wbGF0ZSBmcG9zPD4gYXJlIGRlc2NyaWJlZCBpbiBjbGF1c2VzIDIxLjEuMiwgMjEuMS4zLCAyNy4xLjIsCisgIC8vIDI3LjIsIDI3LjQuMSwgMjcuNC4zIGFuZCBELjYuIERlc3BpdGUgYWxsIHRoaXMgdmVyYmlhZ2UsIHRoZQorICAvLyBiZWhhdmlvdXIgb2YgdGhlc2UgdHlwZXMgaXMgbW9zdGx5IGltcGxlbWVudGF0aW9uIGRlZmluZWQgb3IKKyAgLy8gdW5zcGVjaWZpZWQuIFRoZSBiZWhhdmlvdXIgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhcyBub3RlZAorICAvLyBiZWxvdy4KKworICAvKioKKyAgICogIEBicmllZiAgVHlwZSB1c2VkIGJ5IGZwb3MsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbmQgY2hhcl90cmFpdHM8d2NoYXJfdD4uCisgICAqCisgICAqICBJbiBjbGF1c2VzIDIxLjEuMy4xIGFuZCAyNy40LjEgc3RyZWFtb2ZmIGlzIGRlc2NyaWJlZCBhcyBhbgorICAgKiAgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLgorICAgKiAgTm90ZTogSW4gdmVyc2lvbnMgb2YgR0NDIHVwIHRvIGFuZCBpbmNsdWRpbmcgR0NDIDMuMywgc3RyZWFtb2ZmCisgICAqICB3YXMgdHlwZWRlZiBsb25nLgorICAqLyAgCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9JTlQ2NF9UX0xPTkcKKyAgdHlwZWRlZiBsb25nICAgICAgICAgIHN0cmVhbW9mZjsKKyNlbGlmIGRlZmluZWQoX0dMSUJDWFhfSEFWRV9JTlQ2NF9UX0xPTkdfTE9ORykKKyAgdHlwZWRlZiBsb25nIGxvbmcgICAgIHN0cmVhbW9mZjsKKyNlbGlmIGRlZmluZWQoX0dMSUJDWFhfSEFWRV9JTlQ2NF9UKSAKKyAgdHlwZWRlZiBpbnQ2NF90ICAgICAgIHN0cmVhbW9mZjsKKyNlbHNlCisgIHR5cGVkZWYgbG9uZyBsb25nICAgICBzdHJlYW1vZmY7CisjZW5kaWYKKworICAvLy8gSW50ZWdyYWwgdHlwZSBmb3IgSS9PIG9wZXJhdGlvbiBjb3VudHMgYW5kIGJ1ZmZlciBzaXplcy4KKyAgdHlwZWRlZiBwdHJkaWZmX3QJc3RyZWFtc2l6ZTsgLy8gU2lnbmVkIGludGVncmFsIHR5cGUKKworICAvKioKKyAgICogIEBicmllZiAgQ2xhc3MgcmVwcmVzZW50aW5nIHN0cmVhbSBwb3NpdGlvbnMuCisgICAqCisgICAqICBUaGUgc3RhbmRhcmQgcGxhY2VzIG5vIHJlcXVpcmVtZW50cyB1cG9uIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgU3RhdGVULgorICAgKiAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBTdGF0ZVQgbXVzdCBiZSBEZWZhdWx0Q29uc3RydWN0aWJsZSwKKyAgICogIENvcHlDb25zdHJ1Y3RpYmxlIGFuZCBBc3NpZ25hYmxlLiAgVGhlIHN0YW5kYXJkIG9ubHkgcmVxdWlyZXMgdGhhdCBmcG9zCisgICAqICBzaG91bGQgY29udGFpbiBhIG1lbWJlciBvZiB0eXBlIFN0YXRlVC4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBpdCBhbHNvCisgICAqICBjb250YWlucyBhbiBvZmZzZXQgc3RvcmVkIGFzIGEgc2lnbmVkIGludGVnZXIuCisgICAqCisgICAqICBAcGFyYW0gIFN0YXRlVCAgVHlwZSBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGZyb20gc3RhdGUoKS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdGF0ZVQ+CisgICAgY2xhc3MgZnBvcworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgc3RyZWFtb2ZmCSAgICAgICAgICAgICAgICBfTV9vZmY7CisgICAgICBfU3RhdGVUCQkJX01fc3RhdGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBUaGUgc3RhbmRhcmQgZG9lc24ndCByZXF1aXJlIHRoYXQgZnBvcyBvYmplY3RzIGNhbiBiZSBkZWZhdWx0CisgICAgICAvLyBjb25zdHJ1Y3RlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBhIGRlZmF1bHQKKyAgICAgIC8vIGNvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIG9mZnNldCB0byAwIGFuZCBkZWZhdWx0CisgICAgICAvLyBjb25zdHJ1Y3RzIHRoZSBzdGF0ZS4KKyAgICAgIGZwb3MoKQorICAgICAgOiBfTV9vZmYoMCksIF9NX3N0YXRlKCkgeyB9CisKKyAgICAgIC8vIFRoZSBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IGZwb3Mgb2JqZWN0cyBjYW4gYmUgY29uc3RydWN0ZWQKKyAgICAgIC8vIGZyb20gc3RyZWFtb2ZmIG9iamVjdHMgdXNpbmcgdGhlIGNvbnN0cnVjdG9yIHN5bnRheCwgYW5kCisgICAgICAvLyBmYWlscyB0byBnaXZlIGFueSBtZWFuaW5nZnVsIHNlbWFudGljcy4gSW4gdGhpcworICAgICAgLy8gaW1wbGVtZW50YXRpb24gaW1wbGljaXQgY29udmVyc2lvbiBpcyBhbHNvIGFsbG93ZWQsIGFuZCB0aGlzCisgICAgICAvLyBjb25zdHJ1Y3RvciBzdG9yZXMgdGhlIHN0cmVhbW9mZiBhcyB0aGUgb2Zmc2V0IGFuZCBkZWZhdWx0CisgICAgICAvLyBjb25zdHJ1Y3RzIHRoZSBzdGF0ZS4KKyAgICAgIC8vLyBDb25zdHJ1Y3QgcG9zaXRpb24gZnJvbSBvZmZzZXQuCisgICAgICBmcG9zKHN0cmVhbW9mZiBfX29mZikKKyAgICAgIDogX01fb2ZmKF9fb2ZmKSwgX01fc3RhdGUoKSB7IH0KKworICAgICAgLy8vIENvbnZlcnQgdG8gc3RyZWFtb2ZmLgorICAgICAgb3BlcmF0b3Igc3RyZWFtb2ZmKCkgY29uc3QgeyByZXR1cm4gX01fb2ZmOyB9CisKKyAgICAgIC8vLyBSZW1lbWJlciB0aGUgdmFsdWUgb2YgQGEgc3QuCisgICAgICB2b2lkCisgICAgICBzdGF0ZShfU3RhdGVUIF9fc3QpCisgICAgICB7IF9NX3N0YXRlID0gX19zdDsgfQorCisgICAgICAvLy8gUmV0dXJuIHRoZSBsYXN0IHNldCB2YWx1ZSBvZiBAYSBzdC4KKyAgICAgIF9TdGF0ZVQKKyAgICAgIHN0YXRlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3N0YXRlOyB9CisKKyAgICAgIC8vIFRoZSBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IHRoaXMgb3BlcmF0b3IgbXVzdCBiZSBkZWZpbmVkLCBidXQKKyAgICAgIC8vIGdpdmVzIG5vIHNlbWFudGljcy4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBpdCBqdXN0IGFkZHMgaXRzCisgICAgICAvLyBhcmd1bWVudCB0byB0aGUgc3RvcmVkIG9mZnNldCBhbmQgcmV0dXJucyAqdGhpcy4KKyAgICAgIC8vLyBBZGQgb2Zmc2V0IHRvIHRoaXMgcG9zaXRpb24uCisgICAgICBmcG9zJgorICAgICAgb3BlcmF0b3IrPShzdHJlYW1vZmYgX19vZmYpCisgICAgICB7CisJX01fb2ZmICs9IF9fb2ZmOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gVGhlIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgdGhpcyBvcGVyYXRvciBtdXN0IGJlIGRlZmluZWQsIGJ1dAorICAgICAgLy8gZ2l2ZXMgbm8gc2VtYW50aWNzLiBJbiB0aGlzIGltcGxlbWVudGF0aW9uIGl0IGp1c3Qgc3VidHJhY3RzCisgICAgICAvLyBpdHMgYXJndW1lbnQgZnJvbSB0aGUgc3RvcmVkIG9mZnNldCBhbmQgcmV0dXJucyAqdGhpcy4KKyAgICAgIC8vLyBTdWJ0cmFjdCBvZmZzZXQgZnJvbSB0aGlzIHBvc2l0aW9uLgorICAgICAgZnBvcyYKKyAgICAgIG9wZXJhdG9yLT0oc3RyZWFtb2ZmIF9fb2ZmKQorICAgICAgeworCV9NX29mZiAtPSBfX29mZjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIFRoZSBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IHRoaXMgb3BlcmF0b3IgbXVzdCBiZSBkZWZpbmVkLCBidXQKKyAgICAgIC8vIGRlZmluZXMgaXRzIHNlbWFudGljcyBvbmx5IGluIHRlcm1zIG9mIG9wZXJhdG9yLS4gSW4gdGhpcworICAgICAgLy8gaW1wbGVtZW50YXRpb24gaXQgY29uc3RydWN0cyBhIGNvcHkgb2YgKnRoaXMsIGFkZHMgdGhlCisgICAgICAvLyBhcmd1bWVudCB0byB0aGF0IGNvcHkgdXNpbmcgb3BlcmF0b3IrPSBhbmQgdGhlbiByZXR1cm5zIHRoZQorICAgICAgLy8gY29weS4KKyAgICAgIC8vLyBBZGQgcG9zaXRpb24gYW5kIG9mZnNldC4KKyAgICAgIGZwb3MKKyAgICAgIG9wZXJhdG9yKyhzdHJlYW1vZmYgX19vZmYpIGNvbnN0CisgICAgICB7CisJZnBvcyBfX3BvcygqdGhpcyk7CisJX19wb3MgKz0gX19vZmY7CisJcmV0dXJuIF9fcG9zOworICAgICAgfQorCisgICAgICAvLyBUaGUgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCB0aGlzIG9wZXJhdG9yIG11c3QgYmUgZGVmaW5lZCwgYnV0CisgICAgICAvLyBkZWZpbmVzIGl0cyBzZW1hbnRpY3Mgb25seSBpbiB0ZXJtcyBvZiBvcGVyYXRvcisuIEluIHRoaXMKKyAgICAgIC8vIGltcGxlbWVudGF0aW9uIGl0IGNvbnN0cnVjdHMgYSBjb3B5IG9mICp0aGlzLCBzdWJ0cmFjdHMgdGhlCisgICAgICAvLyBhcmd1bWVudCBmcm9tIHRoYXQgY29weSB1c2luZyBvcGVyYXRvci09IGFuZCB0aGVuIHJldHVybnMgdGhlCisgICAgICAvLyBjb3B5LgorICAgICAgLy8vIFN1YnRyYWN0IG9mZnNldCBmcm9tIHBvc2l0aW9uLgorICAgICAgZnBvcworICAgICAgb3BlcmF0b3ItKHN0cmVhbW9mZiBfX29mZikgY29uc3QKKyAgICAgIHsKKwlmcG9zIF9fcG9zKCp0aGlzKTsKKwlfX3BvcyAtPSBfX29mZjsKKwlyZXR1cm4gX19wb3M7CisgICAgICB9CisKKyAgICAgIC8vIFRoZSBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IHRoaXMgb3BlcmF0b3IgbXVzdCBiZSBkZWZpbmVkLCBidXQKKyAgICAgIC8vIGRlZmluZXMgaXRzIHNlbWFudGljcyBvbmx5IGluIHRlcm1zIG9mIG9wZXJhdG9yKy4gSW4gdGhpcworICAgICAgLy8gaW1wbGVtZW50YXRpb24gaXQgcmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBvZmZzZXQKKyAgICAgIC8vIHN0b3JlZCBpbiAqdGhpcyBhbmQgaW4gdGhlIGFyZ3VtZW50LgorICAgICAgLy8vIFN1YnRyYWN0IHBvc2l0aW9uIHRvIHJldHVybiBvZmZzZXQuCisgICAgICBzdHJlYW1vZmYKKyAgICAgIG9wZXJhdG9yLShjb25zdCBmcG9zJiBfX290aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fb2ZmIC0gX19vdGhlci5fTV9vZmY7IH0KKyAgICB9OworCisgIC8vIFRoZSBzdGFuZGFyZCBvbmx5IHJlcXVpcmVzIHRoYXQgb3BlcmF0b3I9PSBtdXN0IGJlIGFuCisgIC8vIGVxdWl2YWxlbmNlIHJlbGF0aW9uLiBJbiB0aGlzIGltcGxlbWVudGF0aW9uIHR3byBmcG9zPFN0YXRlVD4KKyAgLy8gb2JqZWN0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MgaWYgdGhlIGNvbnRhaW5lZAorICAvLyBvZmZzZXRzIGNvbXBhcmUgZXF1YWwuCisgIC8vLyBUZXN0IGlmIGVxdWl2YWxlbnQgdG8gYW5vdGhlciBwb3NpdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1N0YXRlVD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZnBvczxfU3RhdGVUPiYgX19saHMsIGNvbnN0IGZwb3M8X1N0YXRlVD4mIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0cmVhbW9mZihfX2xocykgPT0gc3RyZWFtb2ZmKF9fcmhzKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdGF0ZVQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGZwb3M8X1N0YXRlVD4mIF9fbGhzLCBjb25zdCBmcG9zPF9TdGF0ZVQ+JiBfX3JocykKKyAgICB7IHJldHVybiBzdHJlYW1vZmYoX19saHMpICE9IHN0cmVhbW9mZihfX3Jocyk7IH0KKworICAvLyBDbGF1c2VzIDIxLjEuMy4xIGFuZCAyMS4xLjMuMiBkZXNjcmliZSBzdHJlYW1wb3MgYW5kIHdzdHJlYW1wb3MKKyAgLy8gYXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlcywgYnV0IGNsYXVzZSAyNy4yIHJlcXVpcmVzIHRoYXQKKyAgLy8gdGhleSBtdXN0IGJvdGggYmUgdHlwZWRlZnMgZm9yIGZwb3M8bWJzdGF0ZV90PgorICAvLy8gRmlsZSBwb3NpdGlvbiBmb3IgY2hhciBzdHJlYW1zLgorICB0eXBlZGVmIGZwb3M8bWJzdGF0ZV90PiBzdHJlYW1wb3M7CisgIC8vLyBGaWxlIHBvc2l0aW9uIGZvciB3Y2hhcl90IHN0cmVhbXMuCisgIHR5cGVkZWYgZnBvczxtYnN0YXRlX3Q+IHdzdHJlYW1wb3M7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8vLyBGaWxlIHBvc2l0aW9uIGZvciBjaGFyMTZfdCBzdHJlYW1zLgorICB0eXBlZGVmIGZwb3M8bWJzdGF0ZV90PiB1MTZzdHJlYW1wb3M7CisgIC8vLyBGaWxlIHBvc2l0aW9uIGZvciBjaGFyMzJfdCBzdHJlYW1zLgorICB0eXBlZGVmIGZwb3M8bWJzdGF0ZV90PiB1MzJzdHJlYW1wb3M7CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9wdHJfdHJhaXRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcHRyX3RyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODVmYjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcHRyX3RyYWl0cy5oCkBAIC0wLDAgKzEsMTgyIEBACisvLyBQb2ludGVyIFRyYWl0cyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9wdHJfdHJhaXRzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttZW1vcnl9CisgKi8KKworI2lmbmRlZiBfUFRSX1RSQUlUU19ICisjZGVmaW5lIF9QVFJfVFJBSVRTX0ggMQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+IC8vIEZvciBfR0xJQkNYWF9IQVNfTkVTVEVEX1RZUEUKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCitfR0xJQkNYWF9IQVNfTkVTVEVEX1RZUEUoZWxlbWVudF90eXBlKQorX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFKGRpZmZlcmVuY2VfdHlwZSkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgPSBfX2hhc19lbGVtZW50X3R5cGU8X1RwPjo6dmFsdWU+CisgICAgc3RydWN0IF9fcHRydHJfZWx0X3R5cGU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3B0cnRyX2VsdF90eXBlPF9UcCwgdHJ1ZT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcDo6ZWxlbWVudF90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZS4uLj4gY2xhc3MgX1NvbWVQdHIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX3B0cnRyX2VsdF90eXBlPF9Tb21lUHRyPF9UcCwgX0FyZ3MuLi4+LCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgPSBfX2hhc19kaWZmZXJlbmNlX3R5cGU8X1RwPjo6dmFsdWU+CisgICAgc3RydWN0IF9fcHRydHJfZGlmZl90eXBlCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHA6OmRpZmZlcmVuY2VfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fcHRydHJfZGlmZl90eXBlPF9UcCwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1B0ciwgdHlwZW5hbWUgX1VwPgorICAgIGNsYXNzIF9fcHRydHJfcmViaW5kX2hlbHBlcgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHIyLCB0eXBlbmFtZSBfVXAyPgorCXN0YXRpYyBjb25zdGV4cHIgYm9vbAorICAgICAgIAlfU19jaGsodHlwZW5hbWUgX1B0cjI6OnRlbXBsYXRlIHJlYmluZDxfVXAyPiopCisgICAgICAgCXsgcmV0dXJuIHRydWU7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wKKyAgICAgICAJX1NfY2hrKC4uLikKKyAgICAgICAJeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9fdmFsdWUgPSBfU19jaGs8X1B0ciwgX1VwPihudWxscHRyKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHIsIHR5cGVuYW1lIF9VcD4KKyAgICBjb25zdCBib29sIF9fcHRydHJfcmViaW5kX2hlbHBlcjxfUHRyLCBfVXA+OjpfX3ZhbHVlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwLAorICAgICAgICAgICBib29sID0gX19wdHJ0cl9yZWJpbmRfaGVscGVyPF9UcCwgX1VwPjo6X192YWx1ZT4KKyAgICBzdHJ1Y3QgX19wdHJ0cl9yZWJpbmQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgc3RydWN0IF9fcHRydHJfcmViaW5kPF9UcCwgX1VwLCB0cnVlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwOjp0ZW1wbGF0ZSByZWJpbmQ8X1VwPiBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWUuLi4+IGNsYXNzIF9Tb21lUHRyLCB0eXBlbmFtZSBfVXAsCisgICAgICAgICAgICB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX3B0cnRyX3JlYmluZDxfU29tZVB0cjxfVHAsIF9BcmdzLi4uPiwgX1VwLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9Tb21lUHRyPF9VcCwgX0FyZ3MuLi4+IF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSB0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT4KKyAgICBzdHJ1Y3QgX19wdHJ0cl9ub3Rfdm9pZAorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19wdHJ0cl9ub3Rfdm9pZDxfVHAsIHZvaWQ+CisgICAgeworICAgICAgc3RydWN0IF9fdHlwZSB7IH07CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyPgorICAgIGNsYXNzIF9fcHRydHJfcG9pbnRlcl90bworICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19wdHJ0cl9lbHRfdHlwZTxfUHRyPjo6X190eXBlICAgX19vcmlnX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcHRydHJfbm90X3ZvaWQ8X19vcmlnX3R5cGU+OjpfX3R5cGUgX19lbGVtZW50X3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgX1B0ciBwb2ludGVyX3RvKF9fZWxlbWVudF90eXBlJiBfX2UpCisgICAgICB7IHJldHVybiBfUHRyOjpwb2ludGVyX3RvKF9fZSk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgIFVuaWZvcm0gaW50ZXJmYWNlIHRvIGFsbCBwb2ludGVyLWxpa2UgdHlwZXMKKyAgICogQGluZ3JvdXAgcG9pbnRlcl9hYnN0cmFjdGlvbnMKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1B0cj4KKyAgICBzdHJ1Y3QgcG9pbnRlcl90cmFpdHMgOiBfX3B0cnRyX3BvaW50ZXJfdG88X1B0cj4KKyAgICB7CisgICAgICAvLy8gVGhlIHBvaW50ZXIgdHlwZQorICAgICAgdHlwZWRlZiBfUHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgLy8vIFRoZSB0eXBlIHBvaW50ZWQgdG8KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19wdHJ0cl9lbHRfdHlwZTxfUHRyPjo6X190eXBlICAgZWxlbWVudF90eXBlOworICAgICAgLy8vIFR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gcG9pbnRlcnMKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19wdHJ0cl9kaWZmX3R5cGU8X1B0cj46Ol9fdHlwZSAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHVzaW5nIHJlYmluZCA9IHR5cGVuYW1lIF9fcHRydHJfcmViaW5kPF9QdHIsIF9VcD46Ol9fdHlwZTsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIGJ1aWx0LWluIHBvaW50ZXJzLgorICAgKiBAaW5ncm91cCBwb2ludGVyX2Fic3RyYWN0aW9ucworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHBvaW50ZXJfdHJhaXRzPF9UcCo+CisgICAgeworICAgICAgLy8vIFRoZSBwb2ludGVyIHR5cGUKKyAgICAgIHR5cGVkZWYgX1RwKiBwb2ludGVyOworICAgICAgLy8vIFRoZSB0eXBlIHBvaW50ZWQgdG8KKyAgICAgIHR5cGVkZWYgX1RwICBlbGVtZW50X3R5cGU7CisgICAgICAvLy8gVHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb2ludGVycworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHVzaW5nIHJlYmluZCA9IF9VcCo7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgT2J0YWluIGEgcG9pbnRlciB0byBhbiBvYmplY3QKKyAgICAgICAqICBAcGFyYW0gIF9fciAgQSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IG9mIHR5cGUgQGMgZWxlbWVudF90eXBlCisgICAgICAgKiAgQHJldHVybiBAYyBhZGRyZXNzb2YoX19yKQorICAgICAgKi8KKyAgICAgIHN0YXRpYyBwb2ludGVyCisgICAgICBwb2ludGVyX3RvKHR5cGVuYW1lIF9fcHRydHJfbm90X3ZvaWQ8ZWxlbWVudF90eXBlPjo6X190eXBlJiBfX3IpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6OmFkZHJlc3NvZihfX3IpOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JhbmRvbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzN2QyZjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmFuZG9tLmgKQEAgLTAsMCArMSw2MDY5IEBACisvLyByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiBAZmlsZSBiaXRzL3JhbmRvbS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7cmFuZG9tfQorICovCisKKyNpZm5kZWYgX1JBTkRPTV9ICisjZGVmaW5lIF9SQU5ET01fSCAxCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBbMjYuNF0gUmFuZG9tIG51bWJlciBnZW5lcmF0aW9uCisKKyAgLyoqCisgICAqIEBkZWZncm91cCByYW5kb20gUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisgICAqIEBpbmdyb3VwIG51bWVyaWNzCisgICAqCisgICAqIEEgZmFjaWxpdHkgZm9yIGdlbmVyYXRpbmcgcmFuZG9tIG51bWJlcnMgb24gc2VsZWN0ZWQgZGlzdHJpYnV0aW9ucy4KKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIEBicmllZiBBIGZ1bmN0aW9uIHRlbXBsYXRlIGZvciBjb252ZXJ0aW5nIHRoZSBvdXRwdXQgb2YgYSAoaW50ZWdyYWwpCisgICAqIHVuaWZvcm0gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdG8gYSBmbG9hdG5nIHBvaW50IHJlc3VsdCBpbiB0aGUgcmFuZ2UKKyAgICogWzAtMSkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHNpemVfdCBfX2JpdHMsCisJICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgX1JlYWxUeXBlCisgICAgZ2VuZXJhdGVfY2Fub25pY2FsKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX2cpOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKgorICAgKiBJbXBsZW1lbnRhdGlvbi1zcGFjZSBkZXRhaWxzLgorICAgKi8KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywKKwkgICAgIGJvb2wgPSBfX3cgPCBzdGF0aWNfY2FzdDxzaXplX3Q+CisJCQkgIChzdGQ6Om51bWVyaWNfbGltaXRzPF9VSW50VHlwZT46OmRpZ2l0cyk+CisgICAgICBzdHJ1Y3QgX1NoaWZ0CisgICAgICB7IHN0YXRpYyBjb25zdCBfVUludFR5cGUgX192YWx1ZSA9IDA7IH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3c+CisgICAgICBzdHJ1Y3QgX1NoaWZ0PF9VSW50VHlwZSwgX193LCB0cnVlPgorICAgICAgeyBzdGF0aWMgY29uc3QgX1VJbnRUeXBlIF9fdmFsdWUgPSBfVUludFR5cGUoMSkgPDwgX193OyB9OworCisgICAgdGVtcGxhdGU8aW50IF9fcywKKwkgICAgIGludCBfX3doaWNoID0gKChfX3MgPD0gX19DSEFSX0JJVF9fICogc2l6ZW9mIChpbnQpKQorCQkJICAgICsgKF9fcyA8PSBfX0NIQVJfQklUX18gKiBzaXplb2YgKGxvbmcpKQorCQkJICAgICsgKF9fcyA8PSBfX0NIQVJfQklUX18gKiBzaXplb2YgKGxvbmcgbG9uZykpCisJCQkgICAgLyogYXNzdW1lIGxvbmcgbG9uZyBubyBiaWdnZXIgdGhhbiBfX2ludDEyOCAqLworCQkJICAgICsgKF9fcyA8PSAxMjgpKT4KKyAgICAgIHN0cnVjdCBfU2VsZWN0X3VpbnRfbGVhc3RfdAorICAgICAgeworCXN0YXRpY19hc3NlcnQoX193aGljaCA8IDAsIC8qIG5lZWRzIHRvIGJlIGRlcGVuZGVudCAqLworCQkgICAgICAic29ycnksIHdvdWxkIGJlIHRvbyBtdWNoIHRyb3VibGUgZm9yIGEgc2xvdyByZXN1bHQiKTsKKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTxpbnQgX19zPgorICAgICAgc3RydWN0IF9TZWxlY3RfdWludF9sZWFzdF90PF9fcywgND4KKyAgICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBpbnQgdHlwZTsgfTsKKworICAgIHRlbXBsYXRlPGludCBfX3M+CisgICAgICBzdHJ1Y3QgX1NlbGVjdF91aW50X2xlYXN0X3Q8X19zLCAzPgorICAgICAgeyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdHlwZTsgfTsKKworICAgIHRlbXBsYXRlPGludCBfX3M+CisgICAgICBzdHJ1Y3QgX1NlbGVjdF91aW50X2xlYXN0X3Q8X19zLCAyPgorICAgICAgeyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlOyB9OworCisjaWZkZWYgX0dMSUJDWFhfVVNFX0lOVDEyOAorICAgIHRlbXBsYXRlPGludCBfX3M+CisgICAgICBzdHJ1Y3QgX1NlbGVjdF91aW50X2xlYXN0X3Q8X19zLCAxPgorICAgICAgeyB0eXBlZGVmIHVuc2lnbmVkIF9faW50MTI4IHR5cGU7IH07CisjZW5kaWYKKworICAgIC8vIEFzc3VtZSBhICE9IDAsIGEgPCBtLCBjIDwgbSwgeCA8IG0uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX19tLCBfVHAgX19hLCBfVHAgX19jLAorCSAgICAgYm9vbCBfX2JpZ19lbm91Z2ggPSAoIShfX20gJiAoX19tIC0gMSkpCisJCQkJICB8fCAoX1RwKC0xKSAtIF9fYykgLyBfX2EgPj0gX19tIC0gMSksCisgICAgICAgICAgICAgYm9vbCBfX3NjaHJhZ2Vfb2sgPSBfX20gJSBfX2EgPCBfX20gLyBfX2E+CisgICAgICBzdHJ1Y3QgX01vZAorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX1NlbGVjdF91aW50X2xlYXN0X3Q8c3RkOjpfX2xnKF9fYSkKKwkJCQkJICAgICAgKyBzdGQ6Ol9fbGcoX19tKSArIDI+Ojp0eXBlIF9UcDI7CisJc3RhdGljIF9UcAorCV9fY2FsYyhfVHAgX194KQorCXsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oKF9UcDIoX19hKSAqIF9feCArIF9fYykgJSBfX20pOyB9CisgICAgICB9OworCisgICAgLy8gU2NocmFnZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9UcCBfX20sIF9UcCBfX2EsIF9UcCBfX2M+CisgICAgICBzdHJ1Y3QgX01vZDxfVHAsIF9fbSwgX19hLCBfX2MsIGZhbHNlLCB0cnVlPgorICAgICAgeworCXN0YXRpYyBfVHAKKwlfX2NhbGMoX1RwIF9feCk7CisgICAgICB9OworCisgICAgLy8gU3BlY2lhbCBjYXNlczoKKyAgICAvLyAtIGZvciBtID09IDJebiBvciBtID09IDAsIHVuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgaXMgc2FmZS4KKyAgICAvLyAtIGEgKiAobSAtIDEpICsgYyBmaXRzIGluIF9UcCwgdGhlcmUgaXMgbm8gb3ZlcmZsb3cuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX19tLCBfVHAgX19hLCBfVHAgX19jLCBib29sIF9fcz4KKyAgICAgIHN0cnVjdCBfTW9kPF9UcCwgX19tLCBfX2EsIF9fYywgdHJ1ZSwgX19zPgorICAgICAgeworCXN0YXRpYyBfVHAKKwlfX2NhbGMoX1RwIF9feCkKKwl7CisJICBfVHAgX19yZXMgPSBfX2EgKiBfX3ggKyBfX2M7CisJICBpZiAoX19tKQorCSAgICBfX3JlcyAlPSBfX207CisJICByZXR1cm4gX19yZXM7CisJfQorICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX1RwIF9fbSwgX1RwIF9fYSA9IDEsIF9UcCBfX2MgPSAwPgorICAgICAgaW5saW5lIF9UcAorICAgICAgX19tb2QoX1RwIF9feCkKKyAgICAgIHsgcmV0dXJuIF9Nb2Q8X1RwLCBfX20sIF9fYSwgX19jPjo6X19jYWxjKF9feCk7IH0KKworICAgIC8qIERldGVybWluZSB3aGV0aGVyIG51bWJlciBpcyBhIHBvd2VyIG9mIDIuICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGlubGluZSBib29sCisgICAgICBfUG93ZXJfb2ZfMihfVHAgX194KQorICAgICAgeworCXJldHVybiAoKF9feCAtIDEpICYgX194KSA9PSAwOworICAgICAgfTsKKworICAgIC8qCisgICAgICogQW4gYWRhcHRvciBjbGFzcyBmb3IgY29udmVydGluZyB0aGUgb3V0cHV0IG9mIGFueSBHZW5lcmF0b3IgaW50bworICAgICAqIHRoZSBpbnB1dCBmb3IgYSBzcGVjaWZpYyBEaXN0cmlidXRpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0VuZ2luZSwgdHlwZW5hbWUgX0RJbnB1dFR5cGU+CisgICAgICBzdHJ1Y3QgX0FkYXB0b3IKKyAgICAgIHsKKworICAgICAgcHVibGljOgorCV9BZGFwdG9yKF9FbmdpbmUmIF9fZykKKwk6IF9NX2coX19nKSB7IH0KKworCV9ESW5wdXRUeXBlCisJbWluKCkgY29uc3QKKwl7IHJldHVybiBfRElucHV0VHlwZSgwKTsgfQorCisJX0RJbnB1dFR5cGUKKwltYXgoKSBjb25zdAorCXsgcmV0dXJuIF9ESW5wdXRUeXBlKDEpOyB9CisKKwkvKgorCSAqIENvbnZlcnRzIGEgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBhZGFwdGVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisJICogaW50byBhIHZhbHVlIGluIHRoZSBpbnB1dCBkb21haW4gZm9yIHRoZSBkZXBlbmRlbnQgcmFuZG9tIG51bWJlcgorCSAqIGRpc3RyaWJ1dGlvbi4KKwkgKi8KKwlfRElucHV0VHlwZQorCW9wZXJhdG9yKCkoKQorCXsKKwkgIHJldHVybiBzdGQ6OmdlbmVyYXRlX2Nhbm9uaWNhbDxfRElucHV0VHlwZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxfRElucHV0VHlwZT46OmRpZ2l0cywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0VuZ2luZT4oX01fZyk7CisJfQorCisgICAgICBwcml2YXRlOgorCV9FbmdpbmUmIF9NX2c7CisgICAgICB9OworCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCByYW5kb21fZ2VuZXJhdG9ycyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvcnMKKyAgICogQGluZ3JvdXAgcmFuZG9tCisgICAqCisgICAqIFRoZXNlIGNsYXNzZXMgZGVmaW5lIG9iamVjdHMgd2hpY2ggcHJvdmlkZSByYW5kb20gb3IgcHNldWRvcmFuZG9tCisgICAqIG51bWJlcnMsIGVpdGhlciBmcm9tIGEgZGlzY3JldGUgb3IgYSBjb250aW51b3VzIGludGVydmFsLiAgVGhlCisgICAqIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHN1cHBsaWVkIGFzIGEgcGFydCBvZiB0aGlzIGxpYnJhcnkgYXJlCisgICAqIGFsbCB1bmlmb3JtIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9ycyB3aGljaCBwcm92aWRlIGEgc2VxdWVuY2Ugb2YKKyAgICogcmFuZG9tIG51bWJlciB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgb3ZlciB0aGVpciByYW5nZS4KKyAgICoKKyAgICogQSBudW1iZXIgZ2VuZXJhdG9yIGlzIGEgZnVuY3Rpb24gb2JqZWN0IHdpdGggYW4gb3BlcmF0b3IoKSB0aGF0CisgICAqIHRha2VzIHplcm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIGEgbnVtYmVyLgorICAgKgorICAgKiBBIGNvbXBsaWFudCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBtdXN0IHNhdGlzZnkgdGhlIGZvbGxvd2luZworICAgKiByZXF1aXJlbWVudHMuICA8dGFibGUgYm9yZGVyPTEgY2VsbHBhZGRpbmc9MTAgY2VsbHNwYWNpbmc9MD4KKyAgICogPGNhcHRpb24gYWxpZ249dG9wPlJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIFJlcXVpcmVtZW50czwvY2FwdGlvbj4KKyAgICogPHRyPjx0ZD5UbyBiZSBkb2N1bWVudGVkLjwvdGQ+PC90cj4gPC90YWJsZT4KKyAgICoKKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIEBicmllZiBBIG1vZGVsIG9mIGEgbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICoKKyAgICogQSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0aGF0IHByb2R1Y2VzIHBzZXVkb3JhbmRvbSBudW1iZXJzIHZpYQorICAgKiBsaW5lYXIgZnVuY3Rpb246CisgICAqIEBmWworICAgKiAgICAgeF97aSsxfVxsZWZ0YXJyb3coYXhfe2l9ICsgYykgXGJtb2QgbSAKKyAgICogQGZdCisgICAqCisgICAqIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgQHAgX1VJbnRUeXBlIG11c3QgYmUgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZQorICAgKiBsYXJnZSBlbm91Z2ggdG8gc3RvcmUgdmFsdWVzIHVwIHRvIChfX20tMSkuIElmIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIKKyAgICogQHAgX19tIGlzIDAsIHRoZSBtb2R1bHVzIEBwIF9fbSB1c2VkIGlzCisgICAqIHN0ZDo6bnVtZXJpY19saW1pdHM8X1VJbnRUeXBlPjo6bWF4KCkgcGx1cyAxLiBPdGhlcndpc2UsIHRoZSB0ZW1wbGF0ZQorICAgKiBwYXJhbWV0ZXJzIEBwIF9fYSBhbmQgQHAgX19jIG11c3QgYmUgbGVzcyB0aGFuIEBwIF9fbS4KKyAgICoKKyAgICogVGhlIHNpemUgb2YgdGhlIHN0YXRlIGlzIEBmJDFAZiQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgY2xhc3MgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdW5zaWduZWQ8X1VJbnRUeXBlPjo6dmFsdWUsICJ0ZW1wbGF0ZSBhcmd1bWVudCAiCisJCSAgICAic3Vic3RpdHV0aW5nIF9VSW50VHlwZSBub3QgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSIpOworICAgICAgc3RhdGljX2Fzc2VydChfX20gPT0gMHUgfHwgKF9fYSA8IF9fbSAmJiBfX2MgPCBfX20pLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyBfX20gb3V0IG9mIGJvdW5kcyIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIHZhbHVlLiAqLworICAgICAgdHlwZWRlZiBfVUludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8qKiBUaGUgbXVsdGlwbGllci4gKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbXVsdGlwbGllciAgID0gX19hOworICAgICAgLyoqIEFuIGluY3JlbWVudC4gKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgaW5jcmVtZW50ICAgID0gX19jOworICAgICAgLyoqIFRoZSBtb2R1bHVzLiAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBtb2R1bHVzICAgICAgPSBfX207CisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIGRlZmF1bHRfc2VlZCA9IDF1OworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgJWxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICBnZW5lcmF0b3IgZW5naW5lIHdpdGggc2VlZCBAcCBfX3MuICBUaGUgZGVmYXVsdCBzZWVkIHZhbHVlCisgICAgICAgKiAgICAgICAgaXMgMS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19zIFRoZSBpbml0aWFsIHNlZWQgdmFsdWUuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZShyZXN1bHRfdHlwZSBfX3MgPSBkZWZhdWx0X3NlZWQpCisgICAgICB7IHNlZWQoX19zKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgJWxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICBnZW5lcmF0b3IgZW5naW5lIHNlZWRlZCBmcm9tIHRoZSBzZWVkIHNlcXVlbmNlIEBwIF9fcS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19xIHRoZSBzZWVkIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCXN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3NhbWU8X1NzZXEsIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPjo6dmFsdWU+CisJICAgICAgIDo6dHlwZT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUoX1NzZXEmIF9fcSkKKyAgICAgICAgeyBzZWVkKF9fcSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZWVkcyB0aGUgJWxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgZW5naW5lIHNlcXVlbmNlIHRvIHRoZSBzZWVkIEBwIF9fcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19zIFRoZSBuZXcgc2VlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZChyZXN1bHRfdHlwZSBfX3MgPSBkZWZhdWx0X3NlZWQpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNlZWRzIHRoZSAlbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICBlbmdpbmUKKyAgICAgICAqIHNlcXVlbmNlIHVzaW5nIHZhbHVlcyBmcm9tIHRoZSBzZWVkIHNlcXVlbmNlIEBwIF9fcS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19xIHRoZSBzZWVkIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcT4KKyAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jbGFzczxfU3NlcT46OnZhbHVlPjo6dHlwZQorICAgICAgICBzZWVkKF9Tc2VxJiBfX3EpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSB2YWx1ZSBpbiB0aGUgb3V0cHV0IHJhbmdlLgorICAgICAgICoKKyAgICAgICAqIFRoZSBtaW5pbXVtIGRlcGVuZHMgb24gdGhlIEBwIF9fYyBwYXJhbWV0ZXI6IGlmIGl0IGlzIHplcm8sIHRoZQorICAgICAgICogbWluaW11bSBnZW5lcmF0ZWQgbXVzdCBiZSA+IDAsIG90aGVyd2lzZSAwIGlzIGFsbG93ZWQuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpCisgICAgICB7IHJldHVybiBfX2MgPT0gMHUgPyAxdSA6IDB1OyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIGxhcmdlc3QgcG9zc2libGUgdmFsdWUgaW4gdGhlIG91dHB1dCByYW5nZS4KKyAgICAgICAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWF4KCkKKyAgICAgIHsgcmV0dXJuIF9fbSAtIDF1OyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERpc2NhcmQgYSBzZXF1ZW5jZSBvZiByYW5kb20gbnVtYmVycy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgZGlzY2FyZCh1bnNpZ25lZCBsb25nIGxvbmcgX196KQorICAgICAgeworCWZvciAoOyBfX3ogIT0gMFVMTDsgLS1fX3opCisJICAoKnRoaXMpKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG5leHQgcmFuZG9tIG51bWJlciBpbiB0aGUgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKCkKKyAgICAgIHsKKwlfTV94ID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgX19tLCBfX2EsIF9fYz4oX01feCk7CisJcmV0dXJuIF9NX3g7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbXBhcmVzIHR3byBsaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbmZpbml0ZSBzZXF1ZW5jZXMgb2YgZ2VuZXJhdGVkIHZhbHVlcworICAgICAgICogICAgICAgICAgd291bGQgYmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUmIF9fbGhzLAorCQkgY29uc3QgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUmIF9fcmhzKQorICAgICAgeyByZXR1cm4gX19saHMuX01feCA9PSBfX3Jocy5fTV94OyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFdyaXRlcyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdGUgeChpKSBvZiB4IHRvCisgICAgICAgKiAgICAgICAgQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyAgVGhlIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX19sY3IgQSAlIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHJldHVybnMgX19vcy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlMSwgX1VJbnRUeXBlMSBfX2ExLCBfVUludFR5cGUxIF9fYzEsCisJICAgICAgIF9VSW50VHlwZTEgX19tMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdGQ6OmxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZTEsCisJCSAgIF9fYTEsIF9fYzEsIF9fbTE+JiBfX2xjcik7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBlbmdpbmUgYnkgcmVhZGluZyBpdHMgdGV4dHVhbAorICAgICAgICogICAgICAgIHJlcHJlc2VudGF0aW9uIGZyb20gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBUaGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHdyaXR0ZW4gdXNpbmcKKyAgICAgICAqIGFuIG91dHB1dCBzdHJlYW0gd2hvc2UgaW1idWVkIGxvY2FsZSBhbmQgd2hvc2UgdHlwZSdzIHRlbXBsYXRlCisgICAgICAgKiBzcGVjaWFsaXphdGlvbiBhcmd1bWVudHMgX0NoYXJUIGFuZCBfVHJhaXRzIHdlcmUgdGhlIHNhbWUgYXMgdGhvc2UKKyAgICAgICAqIG9mIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgIFRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX19sY3IgQSAlIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHJldHVybnMgX19pcy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlMSwgX1VJbnRUeXBlMSBfX2ExLCBfVUludFR5cGUxIF9fYzEsCisJICAgICAgIF9VSW50VHlwZTEgX19tMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdGQ6OmxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZTEsIF9fYTEsCisJCSAgIF9fYzEsIF9fbTE+JiBfX2xjcik7CisKKyAgICBwcml2YXRlOgorICAgICAgX1VJbnRUeXBlIF9NX3g7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIENvbXBhcmVzIHR3byBsaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAqIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICoKKyAgICogQHBhcmFtIF9fbGhzIEEgbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICogICAgICAgICAgd291bGQgYmUgZGlmZmVyZW50LCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6bGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsCisJICAgICAgIF9fYywgX19tPiYgX19saHMsCisJICAgICAgIGNvbnN0IHN0ZDo6bGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsCisJICAgICAgIF9fYywgX19tPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworCisgIC8qKgorICAgKiBBIGdlbmVyYWxpemVkIGZlZWRiYWNrIHNoaWZ0IHJlZ2lzdGVyIGRpc2NyZXRlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgKgorICAgKiBUaGlzIGFsZ29yaXRobSBhdm9pZHMgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIGFuZCBpcyBkZXNpZ25lZCB0byBiZQorICAgKiBmcmllbmRseSB0byBhIHBpcGVsaW5lZCBhcmNoaXRlY3R1cmUuICBJZiB0aGUgcGFyYW1ldGVycyBhcmUgY2hvc2VuCisgICAqIGNvcnJlY3RseSwgdGhpcyBnZW5lcmF0b3Igd2lsbCBwcm9kdWNlIG51bWJlcnMgd2l0aCBhIHZlcnkgbG9uZyBwZXJpb2QgYW5kCisgICAqIGZhaXJseSBnb29kIGFwcGFyZW50IGVudHJvcHksIGFsdGhvdWdoIHN0aWxsIG5vdCBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcuCisgICAqCisgICAqIFRoZSBiZXN0IHdheSB0byB1c2UgdGhpcyBnZW5lcmF0b3IgaXMgd2l0aCB0aGUgcHJlZGVmaW5lZCBtdDE5OTM3IGNsYXNzLgorICAgKgorICAgKiBUaGlzIGFsZ29yaXRobSB3YXMgb3JpZ2luYWxseSBpbnZlbnRlZCBieSBNYWtvdG8gTWF0c3Vtb3RvIGFuZAorICAgKiBUYWt1amkgTmlzaGltdXJhLgorICAgKgorICAgKiBAdHBhcmFtIF9fdyAgV29yZCBzaXplLCB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gZWFjaCBlbGVtZW50IG9mIAorICAgKiAgICAgICAgICAgICAgdGhlIHN0YXRlIHZlY3Rvci4KKyAgICogQHRwYXJhbSBfX24gIFRoZSBkZWdyZWUgb2YgcmVjdXJzaW9uLgorICAgKiBAdHBhcmFtIF9fbSAgVGhlIHBlcmlvZCBwYXJhbWV0ZXIuCisgICAqIEB0cGFyYW0gX19yICBUaGUgc2VwYXJhdGlvbiBwb2ludCBiaXQgaW5kZXguCisgICAqIEB0cGFyYW0gX19hICBUaGUgbGFzdCByb3cgb2YgdGhlIHR3aXN0IG1hdHJpeC4KKyAgICogQHRwYXJhbSBfX3UgIFRoZSBmaXJzdCByaWdodC1zaGlmdCB0ZW1wZXJpbmcgbWF0cml4IHBhcmFtZXRlci4KKyAgICogQHRwYXJhbSBfX2QgIFRoZSBmaXJzdCByaWdodC1zaGlmdCB0ZW1wZXJpbmcgbWF0cml4IG1hc2suCisgICAqIEB0cGFyYW0gX19zICBUaGUgZmlyc3QgbGVmdC1zaGlmdCB0ZW1wZXJpbmcgbWF0cml4IHBhcmFtZXRlci4KKyAgICogQHRwYXJhbSBfX2IgIFRoZSBmaXJzdCBsZWZ0LXNoaWZ0IHRlbXBlcmluZyBtYXRyaXggbWFzay4KKyAgICogQHRwYXJhbSBfX3QgIFRoZSBzZWNvbmQgbGVmdC1zaGlmdCB0ZW1wZXJpbmcgbWF0cml4IHBhcmFtZXRlci4KKyAgICogQHRwYXJhbSBfX2MgIFRoZSBzZWNvbmQgbGVmdC1zaGlmdCB0ZW1wZXJpbmcgbWF0cml4IG1hc2suCisgICAqIEB0cGFyYW0gX19sICBUaGUgc2Vjb25kIHJpZ2h0LXNoaWZ0IHRlbXBlcmluZyBtYXRyaXggcGFyYW1ldGVyLgorICAgKiBAdHBhcmFtIF9fZiAgSW5pdGlhbGl6YXRpb24gbXVsdGlwbGllci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywKKwkgICBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwKKwkgICBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLCBfVUludFR5cGUgX19mPgorICAgIGNsYXNzIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3Vuc2lnbmVkPF9VSW50VHlwZT46OnZhbHVlLCAidGVtcGxhdGUgYXJndW1lbnQgIgorCQkgICAgInN1YnN0aXR1dGluZyBfVUludFR5cGUgbm90IGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoMXUgPD0gX19tICYmIF9fbSA8PSBfX24sCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nIF9fbSBvdXQgb2YgYm91bmRzIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fciA8PSBfX3csICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgIgorCQkgICAgIl9fciBvdXQgb2YgYm91bmQiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX191IDw9IF9fdywgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyAiCisJCSAgICAiX191IG91dCBvZiBib3VuZCIpOworICAgICAgc3RhdGljX2Fzc2VydChfX3MgPD0gX193LCAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nICIKKwkJICAgICJfX3Mgb3V0IG9mIGJvdW5kIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fdCA8PSBfX3csICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgIgorCQkgICAgIl9fdCBvdXQgb2YgYm91bmQiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19sIDw9IF9fdywgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyAiCisJCSAgICAiX19sIG91dCBvZiBib3VuZCIpOworICAgICAgc3RhdGljX2Fzc2VydChfX3cgPD0gc3RkOjpudW1lcmljX2xpbWl0czxfVUludFR5cGU+OjpkaWdpdHMsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nIF9fdyBvdXQgb2YgYm91bmQiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19hIDw9IChfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZSAtIDEpLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyBfX2Egb3V0IG9mIGJvdW5kIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fYiA8PSAoX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWUgLSAxKSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX19iIG91dCBvZiBib3VuZCIpOworICAgICAgc3RhdGljX2Fzc2VydChfX2MgPD0gKF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlIC0gMSksCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nIF9fYyBvdXQgb2YgYm91bmQiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19kIDw9IChfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZSAtIDEpLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyBfX2Qgb3V0IG9mIGJvdW5kIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fZiA8PSAoX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWUgLSAxKSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX19mIG91dCBvZiBib3VuZCIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIHZhbHVlLiAqLworICAgICAgdHlwZWRlZiBfVUludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8vIHBhcmFtZXRlciB2YWx1ZXMKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90ICAgICAgd29yZF9zaXplICAgICAgICAgICAgICAgICA9IF9fdzsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90ICAgICAgc3RhdGVfc2l6ZSAgICAgICAgICAgICAgICA9IF9fbjsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90ICAgICAgc2hpZnRfc2l6ZSAgICAgICAgICAgICAgICA9IF9fbTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90ICAgICAgbWFza19iaXRzICAgICAgICAgICAgICAgICA9IF9fcjsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgeG9yX21hc2sgICAgICAgICAgICAgICAgICA9IF9fYTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90ICAgICAgdGVtcGVyaW5nX3UgICAgICAgICAgICAgICA9IF9fdTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgdGVtcGVyaW5nX2QgICAgICAgICAgICAgICA9IF9fZDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90ICAgICAgdGVtcGVyaW5nX3MgICAgICAgICAgICAgICA9IF9fczsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgdGVtcGVyaW5nX2IgICAgICAgICAgICAgICA9IF9fYjsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90ICAgICAgdGVtcGVyaW5nX3QgICAgICAgICAgICAgICA9IF9fdDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgdGVtcGVyaW5nX2MgICAgICAgICAgICAgICA9IF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90ICAgICAgdGVtcGVyaW5nX2wgICAgICAgICAgICAgICA9IF9fbDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgaW5pdGlhbGl6YXRpb25fbXVsdGlwbGllciA9IF9fZjsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgZGVmYXVsdF9zZWVkID0gNTQ4OXU7CisKKyAgICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgbWVtYmVyIGZ1bmN0aW9uCisgICAgICBleHBsaWNpdAorICAgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUocmVzdWx0X3R5cGUgX19zZCA9IGRlZmF1bHRfc2VlZCkKKyAgICAgIHsgc2VlZChfX3NkKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgJW1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgZW5naW5lIHNlZWRlZCBmcm9tIHRoZSBzZWVkIHNlcXVlbmNlIEBwIF9fcS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19xIHRoZSBzZWVkIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19zYW1lPF9Tc2VxLCBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZT46OnZhbHVlPgorCSAgICAgICA6OnR5cGU+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lKF9Tc2VxJiBfX3EpCisgICAgICAgIHsgc2VlZChfX3EpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNlZWQocmVzdWx0X3R5cGUgX19zZCA9IGRlZmF1bHRfc2VlZCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Tc2VxPgorCXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY2xhc3M8X1NzZXE+Ojp2YWx1ZT46OnR5cGUKKyAgICAgICAgc2VlZChfU3NlcSYgX19xKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgc21hbGxlc3QgcG9zc2libGUgdmFsdWUgaW4gdGhlIG91dHB1dCByYW5nZS4KKyAgICAgICAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWluKCkKKyAgICAgIHsgcmV0dXJuIDA7IH07CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIGxhcmdlc3QgcG9zc2libGUgdmFsdWUgaW4gdGhlIG91dHB1dCByYW5nZS4KKyAgICAgICAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWF4KCkKKyAgICAgIHsgcmV0dXJuIF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlIC0gMTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEaXNjYXJkIGEgc2VxdWVuY2Ugb2YgcmFuZG9tIG51bWJlcnMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIF9feik7CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbXBhcmVzIHR3byAlIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGZvciBlcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAlIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJSBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZSByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgICAgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbmZpbml0ZSBzZXF1ZW5jZXMgb2YgZ2VuZXJhdGVkIHZhbHVlcworICAgICAgICogICAgICAgICAgd291bGQgYmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUmIF9fbGhzLAorCQkgY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUmIF9fcmhzKQorICAgICAgeyByZXR1cm4gKHN0ZDo6ZXF1YWwoX19saHMuX01feCwgX19saHMuX01feCArIHN0YXRlX3NpemUsIF9fcmhzLl9NX3gpCisJCSYmIF9fbGhzLl9NX3AgPT0gX19yaHMuX01fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUKKyAgICAgICAqICAgICAgICByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAqICAgICAgICBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUxLAorCSAgICAgICBzaXplX3QgX193MSwgc2l6ZV90IF9fbjEsCisJICAgICAgIHNpemVfdCBfX20xLCBzaXplX3QgX19yMSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2ExLCBzaXplX3QgX191MSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2QxLCBzaXplX3QgX19zMSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2IxLCBzaXplX3QgX190MSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2MxLCBzaXplX3QgX19sMSwgX1VJbnRUeXBlMSBfX2YxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHN0ZDo6bWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlMSwgX193MSwgX19uMSwKKwkJICAgX19tMSwgX19yMSwgX19hMSwgX191MSwgX19kMSwgX19zMSwgX19iMSwgX190MSwgX19jMSwKKwkJICAgX19sMSwgX19mMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZQorICAgICAgICogICAgICAgIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgKiAgICAgICAgQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUxLAorCSAgICAgICBzaXplX3QgX193MSwgc2l6ZV90IF9fbjEsCisJICAgICAgIHNpemVfdCBfX20xLCBzaXplX3QgX19yMSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2ExLCBzaXplX3QgX191MSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2QxLCBzaXplX3QgX19zMSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2IxLCBzaXplX3QgX190MSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2MxLCBzaXplX3QgX19sMSwgX1VJbnRUeXBlMSBfX2YxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHN0ZDo6bWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlMSwgX193MSwgX19uMSwgX19tMSwKKwkJICAgX19yMSwgX19hMSwgX191MSwgX19kMSwgX19zMSwgX19iMSwgX190MSwgX19jMSwKKwkJICAgX19sMSwgX19mMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZCBfTV9nZW5fcmFuZCgpOworCisgICAgICBfVUludFR5cGUgX01feFtzdGF0ZV9zaXplXTsKKyAgICAgIHNpemVfdCAgICBfTV9wOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBDb21wYXJlcyB0d28gJSBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgKiAgICAgICAgb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGZvciBpbmVxdWFsaXR5LgorICAgKgorICAgKiBAcGFyYW0gX19saHMgQSAlIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUgcmFuZG9tIG51bWJlcgorICAgKiAgICAgICAgICAgICAgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICogICAgICAgICAgd291bGQgYmUgZGlmZmVyZW50LCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csCisJICAgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsCisJICAgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwgX1VJbnRUeXBlIF9fZj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjptZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sCisJICAgICAgIF9fciwgX19hLCBfX3UsIF9fZCwgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdGQ6Om1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwKKwkgICAgICAgX19yLCBfX2EsIF9fdSwgX19kLCBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgVGhlIE1hcnNhZ2xpYS1aYW1hbiBnZW5lcmF0b3IuCisgICAqCisgICAqIFRoaXMgaXMgYSBtb2RlbCBvZiBhIEdlbmVyYWxpemVkIEZpYm9uYWNjaSBkaXNjcmV0ZSByYW5kb20gbnVtYmVyCisgICAqIGdlbmVyYXRvciwgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHRoZSBTV0MgZ2VuZXJhdG9yLgorICAgKgorICAgKiBBIGRpc2NyZXRlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRoYXQgcHJvZHVjZXMgcHNldWRvcmFuZG9tCisgICAqIG51bWJlcnMgdXNpbmc6CisgICAqIEBmWworICAgKiAgICAgeF97aX1cbGVmdGFycm93KHhfe2kgLSBzfSAtIHhfe2kgLSByfSAtIGNhcnJ5X3tpLTF9KSBcYm1vZCBtIAorICAgKiBAZl0KKyAgICoKKyAgICogVGhlIHNpemUgb2YgdGhlIHN0YXRlIGlzIEBmJHJAZiQKKyAgICogYW5kIHRoZSBtYXhpbXVtIHBlcmlvZCBvZiB0aGUgZ2VuZXJhdG9yIGlzIEBmJChtXnIgLSBtXnMgLSAxKUBmJC4KKyAgICoKKyAgICogQHZhciBfTV94ICAgICBUaGUgc3RhdGUgb2YgdGhlIGdlbmVyYXRvci4gIFRoaXMgaXMgYSByaW5nIGJ1ZmZlci4KKyAgICogQHZhciBfTV9jYXJyeSBUaGUgY2FycnkuCisgICAqIEB2YXIgX01fcCAgICAgQ3VycmVudCBpbmRleCBvZiB4KGkgLSByKS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fcywgc2l6ZV90IF9fcj4KKyAgICBjbGFzcyBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZQorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc191bnNpZ25lZDxfVUludFR5cGU+Ojp2YWx1ZSwgInRlbXBsYXRlIGFyZ3VtZW50ICIKKwkJICAgICJzdWJzdGl0dXRpbmcgX1VJbnRUeXBlIG5vdCBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KDB1IDwgX19zICYmIF9fcyA8IF9fciwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX19zIG91dCBvZiBib3VuZHMiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoMHUgPCBfX3cgJiYgX193IDw9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1VJbnRUeXBlPjo6ZGlnaXRzLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyBfX3cgb3V0IG9mIGJvdW5kcyIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIHZhbHVlLiAqLworICAgICAgdHlwZWRlZiBfVUludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8vIHBhcmFtZXRlciB2YWx1ZXMKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90ICAgICAgd29yZF9zaXplICAgID0gX193OworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgICAgICBzaG9ydF9sYWcgICAgPSBfX3M7CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCAgICAgIGxvbmdfbGFnICAgICA9IF9fcjsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgZGVmYXVsdF9zZWVkID0gMTk3ODA1MDN1OworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGFuIGV4cGxpY2l0bHkgc2VlZGVkICUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUKKyAgICAgICAqICAgICAgICByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lKHJlc3VsdF90eXBlIF9fc2QgPSBkZWZhdWx0X3NlZWQpCisgICAgICB7IHNlZWQoX19zZCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhICVzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSByYW5kb20gbnVtYmVyIGVuZ2luZQorICAgICAgICogICAgICAgIHNlZWRlZCBmcm9tIHRoZSBzZWVkIHNlcXVlbmNlIEBwIF9fcS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19xIHRoZSBzZWVkIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19zYW1lPF9Tc2VxLCBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZT46OnZhbHVlPgorCSAgICAgICA6OnR5cGU+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lKF9Tc2VxJiBfX3EpCisgICAgICAgIHsgc2VlZChfX3EpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNlZWRzIHRoZSBpbml0aWFsIHN0YXRlIEBmJHhfMEBmJCBvZiB0aGUgcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgIGdlbmVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiBOMTY4OFs0LjE5XSBtb2RpZmllcyB0aGlzIGFzIGZvbGxvd3MuICBJZiBAcCBfX3ZhbHVlID09IDAsCisgICAgICAgKiBzZXRzIHZhbHVlIHRvIDE5NzgwNTAzLiAgSW4gYW55IGNhc2UsIHdpdGggYSBsaW5lYXIKKyAgICAgICAqIGNvbmdydWVudGlhbCBnZW5lcmF0b3IgbGNnKGkpIGhhdmluZyBwYXJhbWV0ZXJzIEBmJCBtX3tsY2d9ID0KKyAgICAgICAqIDIxNDc0ODM1NjMsIGFfe2xjZ30gPSA0MDAxNCwgY197bGNnfSA9IDAsIGFuZCBsY2coMCkgPSB2YWx1ZQorICAgICAgICogQGYkLCBzZXRzIEBmJCB4X3stcn0gXGRvdHMgeF97LTF9IEBmJCB0byBAZiQgbGNnKDEpIFxibW9kIG0KKyAgICAgICAqIFxkb3RzIGxjZyhyKSBcYm1vZCBtIEBmJCByZXNwZWN0aXZlbHkuICBJZiBAZiQgeF97LTF9ID0gMCBAZiQKKyAgICAgICAqIHNldCBjYXJyeSB0byAxLCBvdGhlcndpc2Ugc2V0cyBjYXJyeSB0byAwLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzZWVkKHJlc3VsdF90eXBlIF9fc2QgPSBkZWZhdWx0X3NlZWQpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZWVkcyB0aGUgaW5pdGlhbCBzdGF0ZSBAZiR4XzBAZiQgb2YgdGhlCisgICAgICAgKiAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcT4KKwl0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NsYXNzPF9Tc2VxPjo6dmFsdWU+Ojp0eXBlCisgICAgICAgIHNlZWQoX1NzZXEmIF9fcSk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIGluY2x1c2l2ZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSByYW5nZSBvZiByYW5kb20KKyAgICAgICAqIGludGVnZXJzIHJldHVybmVkIGJ5IHRoaXMgZ2VuZXJhdG9yLgorICAgICAgICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgICBtaW4oKQorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBpbmNsdXNpdmUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2Ugb2YgcmFuZG9tCisgICAgICAgKiBpbnRlZ2VycyByZXR1cm5lZCBieSB0aGlzIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWF4KCkKKyAgICAgIHsgcmV0dXJuIF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlIC0gMTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEaXNjYXJkIGEgc2VxdWVuY2Ugb2YgcmFuZG9tIG51bWJlcnMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIF9feikKKyAgICAgIHsKKwlmb3IgKDsgX196ICE9IDBVTEw7IC0tX196KQorCSAgKCp0aGlzKSgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBuZXh0IHJhbmRvbSBudW1iZXIgaW4gdGhlIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyB0d28gJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgZ2VuZXJhdG9yIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUgcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICAgIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICAgICAqICAgICAgICAgIHdvdWxkIGJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUmIF9fbGhzLAorCQkgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUmIF9fcmhzKQorICAgICAgeyByZXR1cm4gKHN0ZDo6ZXF1YWwoX19saHMuX01feCwgX19saHMuX01feCArIGxvbmdfbGFnLCBfX3Jocy5fTV94KQorCQkmJiBfX2xocy5fTV9jYXJyeSA9PSBfX3Jocy5fTV9jYXJyeQorCQkmJiBfX2xocy5fTV9wID09IF9fcmhzLl9NX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lCisgICAgICAgKiAgICAgICAgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgKiAgICAgICAgQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlMSwgc2l6ZV90IF9fdzEsIHNpemVfdCBfX3MxLCBzaXplX3QgX19yMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgY29uc3Qgc3RkOjpzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUxLCBfX3cxLAorCQkgICBfX3MxLCBfX3IxPiYpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUKKyAgICAgICAqICAgICAgICByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbQorICAgICAgICogICAgICAgIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggZXh0cmFjdGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlMSwgc2l6ZV90IF9fdzEsIHNpemVfdCBfX3MxLCBzaXplX3QgX19yMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgc3RkOjpzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUxLCBfX3cxLAorCQkgICBfX3MxLCBfX3IxPiYpOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9VSW50VHlwZSAgX01feFtsb25nX2xhZ107CisgICAgICBfVUludFR5cGUgIF9NX2NhcnJ5OworICAgICAgc2l6ZV90ICAgICBfTV9wOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBDb21wYXJlcyB0d28gJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSByYW5kb20gbnVtYmVyCisgICAqICAgICAgICBnZW5lcmF0b3Igb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGZvciBpbmVxdWFsaXR5LgorICAgKgorICAgKiBAcGFyYW0gX19saHMgQSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUgcmFuZG9tIG51bWJlcgorICAgKiAgICAgICAgICAgICAgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICogICAgICAgICAgd291bGQgYmUgZGlmZmVyZW50LCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6c3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlLCBfX3csCisJICAgICAgIF9fcywgX19yPiYgX19saHMsCisJICAgICAgIGNvbnN0IHN0ZDo6c3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlLCBfX3csCisJICAgICAgIF9fcywgX19yPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworCisgIC8qKgorICAgKiBQcm9kdWNlcyByYW5kb20gbnVtYmVycyBmcm9tIHNvbWUgYmFzZSBlbmdpbmUgYnkgZGlzY2FyZGluZyBibG9ja3Mgb2YKKyAgICogZGF0YS4KKyAgICoKKyAgICogMCA8PSBAcCBfX3IgPD0gQHAgX19wCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19wLCBzaXplX3QgX19yPgorICAgIGNsYXNzIGRpc2NhcmRfYmxvY2tfZW5naW5lCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydCgxIDw9IF9fciAmJiBfX3IgPD0gX19wLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyBfX3Igb3V0IG9mIGJvdW5kcyIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIHZhbHVlLiAqLworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKworICAgICAgLy8gcGFyYW1ldGVyIHZhbHVlcworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgYmxvY2tfc2l6ZSA9IF9fcDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IHVzZWRfYmxvY2sgPSBfX3I7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBkZWZhdWx0ICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogVGhlIHVuZGVybHlpbmcgZW5naW5lIGlzIGRlZmF1bHQgY29uc3RydWN0ZWQgYXMgd2VsbC4KKyAgICAgICAqLworICAgICAgZGlzY2FyZF9ibG9ja19lbmdpbmUoKQorICAgICAgOiBfTV9iKCksIF9NX24oMCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHkgY29uc3RydWN0cyBhICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQ29waWVzIGFuIGV4aXN0aW5nIGJhc2UgY2xhc3MgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKiBAcGFyYW0gX19ybmcgQW4gZXhpc3RpbmcgKGJhc2UgY2xhc3MpIGVuZ2luZSBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBkaXNjYXJkX2Jsb2NrX2VuZ2luZShjb25zdCBfUmFuZG9tTnVtYmVyRW5naW5lJiBfX3JuZykKKyAgICAgIDogX01fYihfX3JuZyksIF9NX24oMCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIE1vdmUgY29uc3RydWN0cyBhICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQ29waWVzIGFuIGV4aXN0aW5nIGJhc2UgY2xhc3MgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKiBAcGFyYW0gX19ybmcgQW4gZXhpc3RpbmcgKGJhc2UgY2xhc3MpIGVuZ2luZSBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBkaXNjYXJkX2Jsb2NrX2VuZ2luZShfUmFuZG9tTnVtYmVyRW5naW5lJiYgX19ybmcpCisgICAgICA6IF9NX2Ioc3RkOjptb3ZlKF9fcm5nKSksIF9NX24oMCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNlZWQgY29uc3RydWN0cyBhICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQ29uc3RydWN0cyB0aGUgdW5kZXJseWluZyBnZW5lcmF0b3IgZW5naW5lIHNlZWRlZCB3aXRoIEBwIF9fcy4KKyAgICAgICAqIEBwYXJhbSBfX3MgQSBzZWVkIHZhbHVlIGZvciB0aGUgYmFzZSBjbGFzcyBlbmdpbmUuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBkaXNjYXJkX2Jsb2NrX2VuZ2luZShyZXN1bHRfdHlwZSBfX3MpCisgICAgICA6IF9NX2IoX19zKSwgX01fbigwKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdG9yIGNvbnN0cnVjdCBhICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcSBBIHNlZWQgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Tc2VxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTxfU3NlcSwgZGlzY2FyZF9ibG9ja19lbmdpbmU+Ojp2YWx1ZQorCQkgICAgICAgJiYgIXN0ZDo6aXNfc2FtZTxfU3NlcSwgX1JhbmRvbU51bWJlckVuZ2luZT46OnZhbHVlPgorCSAgICAgICA6OnR5cGU+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIGRpc2NhcmRfYmxvY2tfZW5naW5lKF9Tc2VxJiBfX3EpCisJOiBfTV9iKF9fcSksIF9NX24oMCkKKyAgICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdAorICAgICAgICogICAgICAgIHNlZWQgZm9yIHRoZSB1bmRlcmx5aW5nIGJhc2UgY2xhc3MgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZCgpCisgICAgICB7CisJX01fYi5zZWVkKCk7CisJX01fbiA9IDA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdAorICAgICAgICogICAgICAgIHNlZWQgZm9yIHRoZSB1bmRlcmx5aW5nIGJhc2UgY2xhc3MgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZChyZXN1bHRfdHlwZSBfX3MpCisgICAgICB7CisJX01fYi5zZWVkKF9fcyk7CisJX01fbiA9IDA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gc2VlZAorICAgICAgICogICAgICAgIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIF9fcSBBIHNlZWQgZ2VuZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcT4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9Tc2VxJiBfX3EpCisgICAgICAgIHsKKwkgIF9NX2Iuc2VlZChfX3EpOworCSAgX01fbiA9IDA7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIGdlbmVyYXRvciBlbmdpbmUKKyAgICAgICAqICAgICAgICBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IF9SYW5kb21OdW1iZXJFbmdpbmUmCisgICAgICBiYXNlKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2I7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbWluaW11bSB2YWx1ZSBpbiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpCisgICAgICB7IHJldHVybiBfUmFuZG9tTnVtYmVyRW5naW5lOjptaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlciByYW5nZS4KKyAgICAgICAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWF4KCkKKyAgICAgIHsgcmV0dXJuIF9SYW5kb21OdW1iZXJFbmdpbmU6Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERpc2NhcmQgYSBzZXF1ZW5jZSBvZiByYW5kb20gbnVtYmVycy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgZGlzY2FyZCh1bnNpZ25lZCBsb25nIGxvbmcgX196KQorICAgICAgeworCWZvciAoOyBfX3ogIT0gMFVMTDsgLS1fX3opCisJICAoKnRoaXMpKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyB0d28gJWRpc2NhcmRfYmxvY2tfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGZvciBlcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJWRpc2NhcmRfYmxvY2tfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluZmluaXRlIHNlcXVlbmNlcyBvZiBnZW5lcmF0ZWQgdmFsdWVzCisgICAgICAgKiAgICAgICAgICB3b3VsZCBiZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZSYgX19saHMsCisJCSBjb25zdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZSYgX19yaHMpCisgICAgICB7IHJldHVybiBfX2xocy5fTV9iID09IF9fcmhzLl9NX2IgJiYgX19saHMuX01fbiA9PSBfX3Jocy5fTV9uOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgcmFuZG9tCisgICAgICAgKiAgICAgICAgbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAqICAgICAgICBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZTEsIHNpemVfdCBfX3AxLCBzaXplX3QgX19yMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdGQ6OmRpc2NhcmRfYmxvY2tfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUxLAorCQkgICBfX3AxLCBfX3IxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lCisgICAgICAgKiAgICAgICAgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAqICAgICAgICBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWRpc2NhcmRfYmxvY2tfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lMSwgc2l6ZV90IF9fcDEsIHNpemVfdCBfX3IxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHN0ZDo6ZGlzY2FyZF9ibG9ja19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZTEsCisJCSAgIF9fcDEsIF9fcjE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9SYW5kb21OdW1iZXJFbmdpbmUgX01fYjsKKyAgICAgIHNpemVfdCBfTV9uOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBDb21wYXJlcyB0d28gJWRpc2NhcmRfYmxvY2tfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAqICAgICAgICBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGluZXF1YWxpdHkuCisgICAqCisgICAqIEBwYXJhbSBfX2xocyBBICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbmZpbml0ZSBzZXF1ZW5jZXMgb2YgZ2VuZXJhdGVkIHZhbHVlcworICAgKiAgICAgICAgICB3b3VsZCBiZSBkaWZmZXJlbnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3AsIHNpemVfdCBfX3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6ZGlzY2FyZF9ibG9ja19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwgX19wLAorCSAgICAgICBfX3I+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3RkOjpkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX3AsCisJICAgICAgIF9fcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKworICAvKioKKyAgICogUHJvZHVjZXMgcmFuZG9tIG51bWJlcnMgYnkgY29tYmluaW5nIHJhbmRvbSBudW1iZXJzIGZyb20gc29tZSBiYXNlCisgICAqIGVuZ2luZSB0byBwcm9kdWNlIHJhbmRvbSBudW1iZXJzIHdpdGggYSBzcGVjaWZpZXMgbnVtYmVyIG9mIGJpdHMgQHAgX193LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9fdywgdHlwZW5hbWUgX1VJbnRUeXBlPgorICAgIGNsYXNzIGluZGVwZW5kZW50X2JpdHNfZW5naW5lCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3Vuc2lnbmVkPF9VSW50VHlwZT46OnZhbHVlLCAidGVtcGxhdGUgYXJndW1lbnQgIgorCQkgICAgInN1YnN0aXR1dGluZyBfVUludFR5cGUgbm90IGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoMHUgPCBfX3cgJiYgX193IDw9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1VJbnRUeXBlPjo6ZGlnaXRzLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyBfX3cgb3V0IG9mIGJvdW5kcyIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIHZhbHVlLiAqLworICAgICAgdHlwZWRlZiBfVUludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBkZWZhdWx0ICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogVGhlIHVuZGVybHlpbmcgZW5naW5lIGlzIGRlZmF1bHQgY29uc3RydWN0ZWQgYXMgd2VsbC4KKyAgICAgICAqLworICAgICAgaW5kZXBlbmRlbnRfYml0c19lbmdpbmUoKQorICAgICAgOiBfTV9iKCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHkgY29uc3RydWN0cyBhICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQ29waWVzIGFuIGV4aXN0aW5nIGJhc2UgY2xhc3MgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKiBAcGFyYW0gX19ybmcgQW4gZXhpc3RpbmcgKGJhc2UgY2xhc3MpIGVuZ2luZSBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZShjb25zdCBfUmFuZG9tTnVtYmVyRW5naW5lJiBfX3JuZykKKyAgICAgIDogX01fYihfX3JuZykgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIE1vdmUgY29uc3RydWN0cyBhICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQ29waWVzIGFuIGV4aXN0aW5nIGJhc2UgY2xhc3MgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKiBAcGFyYW0gX19ybmcgQW4gZXhpc3RpbmcgKGJhc2UgY2xhc3MpIGVuZ2luZSBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZShfUmFuZG9tTnVtYmVyRW5naW5lJiYgX19ybmcpCisgICAgICA6IF9NX2Ioc3RkOjptb3ZlKF9fcm5nKSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNlZWQgY29uc3RydWN0cyBhICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQ29uc3RydWN0cyB0aGUgdW5kZXJseWluZyBnZW5lcmF0b3IgZW5naW5lIHNlZWRlZCB3aXRoIEBwIF9fcy4KKyAgICAgICAqIEBwYXJhbSBfX3MgQSBzZWVkIHZhbHVlIGZvciB0aGUgYmFzZSBjbGFzcyBlbmdpbmUuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZShyZXN1bHRfdHlwZSBfX3MpCisgICAgICA6IF9NX2IoX19zKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdG9yIGNvbnN0cnVjdCBhICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcSBBIHNlZWQgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Tc2VxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTxfU3NlcSwgaW5kZXBlbmRlbnRfYml0c19lbmdpbmU+Ojp2YWx1ZQorCQkgICAgICAgJiYgIXN0ZDo6aXNfc2FtZTxfU3NlcSwgX1JhbmRvbU51bWJlckVuZ2luZT46OnZhbHVlPgorICAgICAgICAgICAgICAgOjp0eXBlPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZShfU3NlcSYgX19xKQorICAgICAgICA6IF9NX2IoX19xKQorICAgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZWVkcyB0aGUgJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0CisgICAgICAgKiAgICAgICAgc2VlZCBmb3IgdGhlIHVuZGVybHlpbmcgYmFzZSBjbGFzcyBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzZWVkKCkKKyAgICAgIHsgX01fYi5zZWVkKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZWVkcyB0aGUgJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0CisgICAgICAgKiAgICAgICAgc2VlZCBmb3IgdGhlIHVuZGVybHlpbmcgYmFzZSBjbGFzcyBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzZWVkKHJlc3VsdF90eXBlIF9fcykKKyAgICAgIHsgX01fYi5zZWVkKF9fcyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZWVkcyB0aGUgJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIG9iamVjdCB3aXRoIHRoZSBnaXZlbgorICAgICAgICogICAgICAgIHNlZWQgc2VxdWVuY2UuCisgICAgICAgKiBAcGFyYW0gX19xIEEgc2VlZCBnZW5lcmF0b3IgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Tc2VxPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX1NzZXEmIF9fcSkKKyAgICAgICAgeyBfTV9iLnNlZWQoX19xKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIGdlbmVyYXRvciBlbmdpbmUKKyAgICAgICAqICAgICAgICBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IF9SYW5kb21OdW1iZXJFbmdpbmUmCisgICAgICBiYXNlKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2I7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbWluaW11bSB2YWx1ZSBpbiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpCisgICAgICB7IHJldHVybiAwVTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlciByYW5nZS4KKyAgICAgICAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWF4KCkKKyAgICAgIHsgcmV0dXJuIF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlIC0gMTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEaXNjYXJkIGEgc2VxdWVuY2Ugb2YgcmFuZG9tIG51bWJlcnMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIF9feikKKyAgICAgIHsKKwlmb3IgKDsgX196ICE9IDBVTEw7IC0tX196KQorCSAgKCp0aGlzKSgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlciBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGZvciBlcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICAgICAqICAgICAgICAgIHdvdWxkIGJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGluZGVwZW5kZW50X2JpdHNfZW5naW5lJiBfX2xocywKKwkJIGNvbnN0IGluZGVwZW5kZW50X2JpdHNfZW5naW5lJiBfX3JocykKKyAgICAgIHsgcmV0dXJuIF9fbGhzLl9NX2IgPT0gX19yaHMuX01fYjsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUKKyAgICAgICAqICAgICAgICByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbQorICAgICAgICogICAgICAgIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4KKyAgICAgICAqICAgICAgICAgIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHN0ZDo6aW5kZXBlbmRlbnRfYml0c19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwKKwkJICAgX193LCBfVUludFR5cGU+JiBfX3gpCisJeworCSAgX19pcyA+PiBfX3guX01fYjsKKwkgIHJldHVybiBfX2lzOworCX0KKworICAgIHByaXZhdGU6CisgICAgICBfUmFuZG9tTnVtYmVyRW5naW5lIF9NX2I7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIENvbXBhcmVzIHR3byAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICogb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGZvciBpbmVxdWFsaXR5LgorICAgKgorICAgKiBAcGFyYW0gX19saHMgQSAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAqCisgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluZmluaXRlIHNlcXVlbmNlcyBvZiBnZW5lcmF0ZWQgdmFsdWVzCisgICAqICAgICAgICAgIHdvdWxkIGJlIGRpZmZlcmVudCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9fdywgdHlwZW5hbWUgX1VJbnRUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmluZGVwZW5kZW50X2JpdHNfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsIF9fdywKKwkgICAgICAgX1VJbnRUeXBlPiYgX19saHMsCisJICAgICAgIGNvbnN0IHN0ZDo6aW5kZXBlbmRlbnRfYml0c19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwgX193LAorCSAgICAgICBfVUludFR5cGU+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5zZXJ0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSByYW5kb20KKyAgICogICAgICAgIG51bWJlciBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAqCisgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggIEEgJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAqICAgICAgICAgIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9fdywgdHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdGQ6OmluZGVwZW5kZW50X2JpdHNfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsCisJICAgICAgIF9fdywgX1VJbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIF9fb3MgPDwgX194LmJhc2UoKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgUHJvZHVjZXMgcmFuZG9tIG51bWJlcnMgYnkgY29tYmluaW5nIHJhbmRvbSBudW1iZXJzIGZyb20gc29tZQorICAgKiBiYXNlIGVuZ2luZSB0byBwcm9kdWNlIHJhbmRvbSBudW1iZXJzIHdpdGggYSBzcGVjaWZpZXMgbnVtYmVyIG9mIGJpdHMKKyAgICogQHAgX193LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9faz4KKyAgICBjbGFzcyBzaHVmZmxlX29yZGVyX2VuZ2luZQorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoMXUgPD0gX19rLCAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nICIKKwkJICAgICJfX2sgb3V0IG9mIGJvdW5kIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCByYW5kb20gdmFsdWUuICovCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmU6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworCisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCB0YWJsZV9zaXplID0gX19rOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgZGVmYXVsdCAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIFRoZSB1bmRlcmx5aW5nIGVuZ2luZSBpcyBkZWZhdWx0IGNvbnN0cnVjdGVkIGFzIHdlbGwuCisgICAgICAgKi8KKyAgICAgIHNodWZmbGVfb3JkZXJfZW5naW5lKCkKKyAgICAgIDogX01fYigpCisgICAgICB7IF9NX2luaXRpYWxpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5IGNvbnN0cnVjdHMgYSAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvcGllcyBhbiBleGlzdGluZyBiYXNlIGNsYXNzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHBhcmFtIF9fcm5nIEFuIGV4aXN0aW5nIChiYXNlIGNsYXNzKSBlbmdpbmUgb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgc2h1ZmZsZV9vcmRlcl9lbmdpbmUoY29uc3QgX1JhbmRvbU51bWJlckVuZ2luZSYgX19ybmcpCisgICAgICA6IF9NX2IoX19ybmcpCisgICAgICB7IF9NX2luaXRpYWxpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBNb3ZlIGNvbnN0cnVjdHMgYSAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvcGllcyBhbiBleGlzdGluZyBiYXNlIGNsYXNzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHBhcmFtIF9fcm5nIEFuIGV4aXN0aW5nIChiYXNlIGNsYXNzKSBlbmdpbmUgb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgc2h1ZmZsZV9vcmRlcl9lbmdpbmUoX1JhbmRvbU51bWJlckVuZ2luZSYmIF9fcm5nKQorICAgICAgOiBfTV9iKHN0ZDo6bW92ZShfX3JuZykpCisgICAgICB7IF9NX2luaXRpYWxpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZWVkIGNvbnN0cnVjdHMgYSAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvbnN0cnVjdHMgdGhlIHVuZGVybHlpbmcgZ2VuZXJhdG9yIGVuZ2luZSBzZWVkZWQgd2l0aCBAcCBfX3MuCisgICAgICAgKiBAcGFyYW0gX19zIEEgc2VlZCB2YWx1ZSBmb3IgdGhlIGJhc2UgY2xhc3MgZW5naW5lLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgc2h1ZmZsZV9vcmRlcl9lbmdpbmUocmVzdWx0X3R5cGUgX19zKQorICAgICAgOiBfTV9iKF9fcykKKyAgICAgIHsgX01faW5pdGlhbGl6ZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRvciBjb25zdHJ1Y3QgYSAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3EgQSBzZWVkIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCXN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3NhbWU8X1NzZXEsIHNodWZmbGVfb3JkZXJfZW5naW5lPjo6dmFsdWUKKwkJICAgICAgICYmICFzdGQ6OmlzX3NhbWU8X1NzZXEsIF9SYW5kb21OdW1iZXJFbmdpbmU+Ojp2YWx1ZT4KKwkgICAgICAgOjp0eXBlPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBzaHVmZmxlX29yZGVyX2VuZ2luZShfU3NlcSYgX19xKQorICAgICAgICA6IF9NX2IoX19xKQorICAgICAgICB7IF9NX2luaXRpYWxpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNlZWRzIHRoZSAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQgc2VlZAorICAgICAgICAgICAgICAgIGZvciB0aGUgdW5kZXJseWluZyBiYXNlIGNsYXNzIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNlZWQoKQorICAgICAgeworCV9NX2Iuc2VlZCgpOworCV9NX2luaXRpYWxpemUoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZWVkcyB0aGUgJXNodWZmbGVfb3JkZXJfZW5naW5lIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0IHNlZWQKKyAgICAgICAqICAgICAgICBmb3IgdGhlIHVuZGVybHlpbmcgYmFzZSBjbGFzcyBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzZWVkKHJlc3VsdF90eXBlIF9fcykKKyAgICAgIHsKKwlfTV9iLnNlZWQoX19zKTsKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVzaHVmZmxlX29yZGVyX2VuZ2luZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gc2VlZAorICAgICAgICogICAgICAgIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIF9fcSBBIHNlZWQgZ2VuZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcT4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9Tc2VxJiBfX3EpCisgICAgICAgIHsKKwkgIF9NX2Iuc2VlZChfX3EpOworCSAgX01faW5pdGlhbGl6ZSgpOworCX0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIGdlbmVyYXRvciBlbmdpbmUgb2JqZWN0LgorICAgICAgICovCisgICAgICBjb25zdCBfUmFuZG9tTnVtYmVyRW5naW5lJgorICAgICAgYmFzZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9iOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbWluaW11bSB2YWx1ZSBpbiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpCisgICAgICB7IHJldHVybiBfUmFuZG9tTnVtYmVyRW5naW5lOjptaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHJhbmdlLgorICAgICAgICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgICBtYXgoKQorICAgICAgeyByZXR1cm4gX1JhbmRvbU51bWJlckVuZ2luZTo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBEaXNjYXJkIGEgc2VxdWVuY2Ugb2YgcmFuZG9tIG51bWJlcnMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIF9feikKKyAgICAgIHsKKwlmb3IgKDsgX196ICE9IDBVTEw7IC0tX196KQorCSAgKCp0aGlzKSgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpOworCisgICAgICAvKioKKyAgICAgICAqIENvbXBhcmVzIHR3byAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0cworICAgICAgICogb2YgdGhlIHNhbWUgdHlwZSBmb3IgZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJXNodWZmbGVfb3JkZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICVzaHVmZmxlX29yZGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbmZpbml0ZSBzZXF1ZW5jZXMgb2YgZ2VuZXJhdGVkIHZhbHVlcworICAgICAgICogICAgICAgICAgd291bGQgYmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBzaHVmZmxlX29yZGVyX2VuZ2luZSYgX19saHMsCisJCSBjb25zdCBzaHVmZmxlX29yZGVyX2VuZ2luZSYgX19yaHMpCisgICAgICB7IHJldHVybiAoX19saHMuX01fYiA9PSBfX3Jocy5fTV9iCisJCSYmIHN0ZDo6ZXF1YWwoX19saHMuX01fdiwgX19saHMuX01fdiArIF9faywgX19yaHMuX01fdikKKwkJJiYgX19saHMuX01feSA9PSBfX3Jocy5fTV95KTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJXNodWZmbGVfb3JkZXJfZW5naW5lIHJhbmRvbQorICAgICAgICogICAgICAgIG51bWJlciBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtCisJQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUxLCBzaXplX3QgX19rMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdGQ6OnNodWZmbGVfb3JkZXJfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUxLAorCQkgICBfX2sxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lCisgICAgICAgKiAgICAgICAgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAqICAgICAgICBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXNodWZmbGVfb3JkZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lMSwgc2l6ZV90IF9fazEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpzaHVmZmxlX29yZGVyX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lMSwgX19rMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZCBfTV9pbml0aWFsaXplKCkKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX2s7ICsrX19pKQorCSAgX01fdltfX2ldID0gX01fYigpOworCV9NX3kgPSBfTV9iKCk7CisgICAgICB9CisKKyAgICAgIF9SYW5kb21OdW1iZXJFbmdpbmUgX01fYjsKKyAgICAgIHJlc3VsdF90eXBlIF9NX3ZbX19rXTsKKyAgICAgIHJlc3VsdF90eXBlIF9NX3k7CisgICAgfTsKKworICAvKioKKyAgICogQ29tcGFyZXMgdHdvICVzaHVmZmxlX29yZGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3RzCisgICAqIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGluZXF1YWxpdHkuCisgICAqCisgICAqIEBwYXJhbSBfX2xocyBBICVzaHVmZmxlX29yZGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICVzaHVmZmxlX29yZGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbmZpbml0ZSBzZXF1ZW5jZXMgb2YgZ2VuZXJhdGVkIHZhbHVlcworICAgKiAgICAgICAgICB3b3VsZCBiZSBkaWZmZXJlbnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX2s+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6c2h1ZmZsZV9vcmRlcl9lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwKKwkgICAgICAgX19rPiYgX19saHMsCisJICAgICAgIGNvbnN0IHN0ZDo6c2h1ZmZsZV9vcmRlcl9lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwKKwkgICAgICAgX19rPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworCisgIC8qKgorICAgKiBUaGUgY2xhc3NpYyBNaW5pbXVtIFN0YW5kYXJkIHJhbmQwIG9mIExld2lzLCBHb29kbWFuLCBhbmQgTWlsbGVyLgorICAgKi8KKyAgdHlwZWRlZiBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTx1aW50X2Zhc3QzMl90LCAxNjgwN1VMLCAwVUwsIDIxNDc0ODM2NDdVTD4KKyAgbWluc3RkX3JhbmQwOworCisgIC8qKgorICAgKiBBbiBhbHRlcm5hdGl2ZSBMQ1IgKExlaG1lciBHZW5lcmF0b3IgZnVuY3Rpb24pLgorICAgKi8KKyAgdHlwZWRlZiBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTx1aW50X2Zhc3QzMl90LCA0ODI3MVVMLCAwVUwsIDIxNDc0ODM2NDdVTD4KKyAgbWluc3RkX3JhbmQ7CisKKyAgLyoqCisgICAqIFRoZSBjbGFzc2ljIE1lcnNlbm5lIFR3aXN0ZXIuCisgICAqCisgICAqIFJlZmVyZW5jZToKKyAgICogTS4gTWF0c3Vtb3RvIGFuZCBULiBOaXNoaW11cmEsIE1lcnNlbm5lIFR3aXN0ZXI6IEEgNjIzLURpbWVuc2lvbmFsbHkKKyAgICogRXF1aWRpc3RyaWJ1dGVkIFVuaWZvcm0gUHNldWRvLVJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yLCBBQ00gVHJhbnNhY3Rpb25zCisgICAqIG9uIE1vZGVsaW5nIGFuZCBDb21wdXRlciBTaW11bGF0aW9uLCBWb2wuIDgsIE5vLiAxLCBKYW51YXJ5IDE5OTgsIHBwIDMtMzAuCisgICAqLworICB0eXBlZGVmIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPAorICAgIHVpbnRfZmFzdDMyX3QsCisgICAgMzIsIDYyNCwgMzk3LCAzMSwKKyAgICAweDk5MDhiMGRmVUwsIDExLAorICAgIDB4ZmZmZmZmZmZVTCwgNywKKyAgICAweDlkMmM1NjgwVUwsIDE1LAorICAgIDB4ZWZjNjAwMDBVTCwgMTgsIDE4MTI0MzMyNTNVTD4gbXQxOTkzNzsKKworICAvKioKKyAgICogQW4gYWx0ZXJuYXRpdmUgTWVyc2VubmUgVHdpc3Rlci4KKyAgICovCisgIHR5cGVkZWYgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8CisgICAgdWludF9mYXN0NjRfdCwKKyAgICA2NCwgMzEyLCAxNTYsIDMxLAorICAgIDB4YjUwMjZmNWFhOTY2MTllOVVMTCwgMjksCisgICAgMHg1NTU1NTU1NTU1NTU1NTU1VUxMLCAxNywKKyAgICAweDcxZDY3ZmZmZWRhNjAwMDBVTEwsIDM3LAorICAgIDB4ZmZmN2VlZTAwMDAwMDAwMFVMTCwgNDMsCisgICAgNjM2NDEzNjIyMzg0Njc5MzAwNVVMTD4gbXQxOTkzN182NDsKKworICB0eXBlZGVmIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPHVpbnRfZmFzdDMyX3QsIDI0LCAxMCwgMjQ+CisgICAgcmFubHV4MjRfYmFzZTsKKworICB0eXBlZGVmIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPHVpbnRfZmFzdDY0X3QsIDQ4LCA1LCAxMj4KKyAgICByYW5sdXg0OF9iYXNlOworCisgIHR5cGVkZWYgZGlzY2FyZF9ibG9ja19lbmdpbmU8cmFubHV4MjRfYmFzZSwgMjIzLCAyMz4gcmFubHV4MjQ7CisKKyAgdHlwZWRlZiBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxyYW5sdXg0OF9iYXNlLCAzODksIDExPiByYW5sdXg0ODsKKworICB0eXBlZGVmIHNodWZmbGVfb3JkZXJfZW5naW5lPG1pbnN0ZF9yYW5kMCwgMjU2PiBrbnV0aF9iOworCisgIHR5cGVkZWYgbWluc3RkX3JhbmQwIGRlZmF1bHRfcmFuZG9tX2VuZ2luZTsKKworICAvKioKKyAgICogQSBzdGFuZGFyZCBpbnRlcmZhY2UgdG8gYSBwbGF0Zm9ybS1zcGVjaWZpYyBub24tZGV0ZXJtaW5pc3RpYworICAgKiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAoaWYgYW55IGFyZSBhdmFpbGFibGUpLgorICAgKi8KKyAgY2xhc3MgcmFuZG9tX2RldmljZQorICB7CisgIHB1YmxpYzoKKyAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCByYW5kb20gdmFsdWUuICovCisgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVzdWx0X3R5cGU7CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBtZW1iZXIgZnVuY3Rpb25zCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfUkFORE9NX1RSMQorCisgICAgZXhwbGljaXQKKyAgICByYW5kb21fZGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3Rva2VuID0gImRlZmF1bHQiKQorICAgIHsKKyAgICAgIF9NX2luaXQoX190b2tlbik7CisgICAgfQorCisgICAgfnJhbmRvbV9kZXZpY2UoKQorICAgIHsgX01fZmluaSgpOyB9CisKKyNlbHNlCisKKyAgICBleHBsaWNpdAorICAgIHJhbmRvbV9kZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIF9fdG9rZW4gPSAibXQxOTkzNyIpCisgICAgeyBfTV9pbml0X3ByZXRyMShfX3Rva2VuKTsgfQorCisgIHB1YmxpYzoKKworI2VuZGlmCisKKyAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgbWluKCkKKyAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWluKCk7IH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICBtYXgoKQorICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgZG91YmxlCisgICAgZW50cm9weSgpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gMC4wOyB9CisKKyAgICByZXN1bHRfdHlwZQorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfUkFORE9NX1RSMQorICAgICAgcmV0dXJuIHRoaXMtPl9NX2dldHZhbCgpOworI2Vsc2UKKyAgICAgIHJldHVybiB0aGlzLT5fTV9nZXR2YWxfcHJldHIxKCk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBObyBjb3B5IGZ1bmN0aW9ucy4KKyAgICByYW5kb21fZGV2aWNlKGNvbnN0IHJhbmRvbV9kZXZpY2UmKSA9IGRlbGV0ZTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCByYW5kb21fZGV2aWNlJikgPSBkZWxldGU7CisKKyAgcHJpdmF0ZToKKworICAgIHZvaWQgX01faW5pdChjb25zdCBzdGQ6OnN0cmluZyYgX190b2tlbik7CisgICAgdm9pZCBfTV9pbml0X3ByZXRyMShjb25zdCBzdGQ6OnN0cmluZyYgX190b2tlbik7CisgICAgdm9pZCBfTV9maW5pKCk7CisKKyAgICByZXN1bHRfdHlwZSBfTV9nZXR2YWwoKTsKKyAgICByZXN1bHRfdHlwZSBfTV9nZXR2YWxfcHJldHIxKCk7CisKKyAgICB1bmlvbgorICAgIHsKKyAgICBGSUxFKiAgICAgICAgX01fZmlsZTsKKyAgICBtdDE5OTM3ICAgICAgX01fbXQ7CisgIH07CisgIH07CisKKyAgLyogQH0gKi8gLy8gZ3JvdXAgcmFuZG9tX2dlbmVyYXRvcnMKKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgcmFuZG9tX2Rpc3RyaWJ1dGlvbnMgUmFuZG9tIE51bWJlciBEaXN0cmlidXRpb25zCisgICAqIEBpbmdyb3VwIHJhbmRvbQorICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgcmFuZG9tX2Rpc3RyaWJ1dGlvbnNfdW5pZm9ybSBVbmlmb3JtIERpc3RyaWJ1dGlvbnMKKyAgICogQGluZ3JvdXAgcmFuZG9tX2Rpc3RyaWJ1dGlvbnMKKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIEBicmllZiBVbmlmb3JtIGRpc2NyZXRlIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqIEEgZGlzY3JldGUgcmFuZG9tIGRpc3RyaWJ1dGlvbiBvbiB0aGUgcmFuZ2UgQGYkW21pbiwgbWF4XUBmJCB3aXRoIGVxdWFsCisgICAqIHByb2JhYmlsaXR5IHRocm91Z2hvdXQgdGhlIHJhbmdlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUgPSBpbnQ+CisgICAgY2xhc3MgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2ludGVncmFsPF9JbnRUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGFuIGludGVncmFsIHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX0ludFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfSW50VHlwZSBfX2EgPSAwLAorCQkgICBfSW50VHlwZSBfX2IgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9JbnRUeXBlPjo6bWF4KCkpCisJOiBfTV9hKF9fYSksIF9NX2IoX19iKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9hIDw9IF9NX2IpOworCX0KKworCXJlc3VsdF90eXBlCisJYSgpIGNvbnN0CisJeyByZXR1cm4gX01fYTsgfQorCisJcmVzdWx0X3R5cGUKKwliKCkgY29uc3QKKwl7IHJldHVybiBfTV9iOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX2EgPT0gX19wMi5fTV9hICYmIF9fcDEuX01fYiA9PSBfX3AyLl9NX2I7IH0KKworICAgICAgcHJpdmF0ZToKKwlfSW50VHlwZSBfTV9hOworCV9JbnRUeXBlIF9NX2I7CisgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbihfSW50VHlwZSBfX2EgPSAwLAorCQkJICAgX0ludFR5cGUgX19iID0gc3RkOjpudW1lcmljX2xpbWl0czxfSW50VHlwZT46Om1heCgpKQorICAgICAgOiBfTV9wYXJhbShfX2EsIF9fYikKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqIERvZXMgbm90aGluZyBmb3IgdGhlIHVuaWZvcm0gaW50ZWdlciBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgeyB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmEoKTsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgYigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5iKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGluY2x1c2l2ZSBsb3dlciBib3VuZCBvZiB0aGUgZGlzdHJpYnV0aW9uIHJhbmdlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmEoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBpbmNsdXNpdmUgdXBwZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbiByYW5nZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5iKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgICB7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byB1bmlmb3JtIGludGVnZXIgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycy4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIHVuaWZvcm0gaW50ZWdlciBkaXN0cmlidXRpb25zIGhhdmUKKyAgICogICAgICAgIGRpZmZlcmVudCBwYXJhbWV0ZXJzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5zZXJ0cyBhICV1bmlmb3JtX2ludF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgKiAgICAgICAgZGlzdHJpYnV0aW9uIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIG9zLgorICAgKgorICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194ICBBICV1bmlmb3JtX2ludF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJICAgICAgIGNvbnN0IHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYpOworCisgIC8qKgorICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAldW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICoKKyAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194ICBBICV1bmlmb3JtX2ludF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJICAgICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYpOworCisKKyAgLyoqCisgICAqIEBicmllZiBVbmlmb3JtIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogQSBjb250aW51b3VzIHJhbmRvbSBkaXN0cmlidXRpb24gb24gdGhlIHJhbmdlIFttaW4sIG1heCkgd2l0aCBlcXVhbAorICAgKiBwcm9iYWJpbGl0eSB0aHJvdWdob3V0IHRoZSByYW5nZS4gIFRoZSBVUk5HIHNob3VsZCBiZSByZWFsLXZhbHVlZCBhbmQKKyAgICogZGVsaXZlciBudW1iZXIgaW4gdGhlIHJhbmdlIFswLCAxKS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19hID0gX1JlYWxUeXBlKDApLAorCQkgICBfUmVhbFR5cGUgX19iID0gX1JlYWxUeXBlKDEpKQorCTogX01fYShfX2EpLCBfTV9iKF9fYikKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fYSA8PSBfTV9iKTsKKwl9CisKKwlyZXN1bHRfdHlwZQorCWEoKSBjb25zdAorCXsgcmV0dXJuIF9NX2E7IH0KKworCXJlc3VsdF90eXBlCisJYigpIGNvbnN0CisJeyByZXR1cm4gX01fYjsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9hID09IF9fcDIuX01fYSAmJiBfX3AxLl9NX2IgPT0gX19wMi5fTV9iOyB9CisKKyAgICAgIHByaXZhdGU6CisJX1JlYWxUeXBlIF9NX2E7CisJX1JlYWxUeXBlIF9NX2I7CisgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb24gb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2EgW0lOXSAgVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19iIFtJTl0gIFRoZSB1cHBlciBib3VuZCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbihfUmVhbFR5cGUgX19hID0gX1JlYWxUeXBlKDApLAorCQkJCV9SZWFsVHlwZSBfX2IgPSBfUmVhbFR5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fYSwgX19iKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqIERvZXMgbm90aGluZyBmb3IgdGhlIHVuaWZvcm0gcmVhbCBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgeyB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmEoKTsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgYigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5iKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGluY2x1c2l2ZSBsb3dlciBib3VuZCBvZiB0aGUgZGlzdHJpYnV0aW9uIHJhbmdlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmEoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBpbmNsdXNpdmUgdXBwZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbiByYW5nZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5iKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgICB7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeworCSAgX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgICAgX19hdXJuZyhfX3VybmcpOworCSAgcmV0dXJuIChfX2F1cm5nKCkgKiAoX19wLmIoKSAtIF9fcC5hKCkpKSArIF9fcC5hKCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byB1bmlmb3JtIHJlYWwgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycy4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb24mIF9fZDIpCisgICAgICB7IHJldHVybiBfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW07IH0KKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gdW5pZm9ybSByZWFsIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgKiAgICAgICAgZGlmZmVyZW50IHBhcmFtZXRlcnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluc2VydHMgYSAldW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAqICAgICAgICBkaXN0cmlidXRpb24gQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICoKKyAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAldW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAqICAgICAgICAgIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJICAgICAgIGNvbnN0IHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+Jik7CisKKyAgLyoqCisgICAqIEBicmllZiBFeHRyYWN0cyBhICV1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICoKKyAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194ICBBICV1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkgICAgICAgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mKTsKKworICAvKiBAfSAqLyAvLyBncm91cCByYW5kb21fZGlzdHJpYnV0aW9uc191bmlmb3JtCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zX25vcm1hbCBOb3JtYWwgRGlzdHJpYnV0aW9ucworICAgKiBAaW5ncm91cCByYW5kb21fZGlzdHJpYnV0aW9ucworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogQGJyaWVmIEEgbm9ybWFsIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpcworICAgKiBAZlsKKyAgICogICAgIHAoeHxcbXUsXHNpZ21hKSA9IFxmcmFjezF9e1xzaWdtYSBcc3FydHsyIFxwaX19CisgICAqICAgICAgICAgICAgZV57LSBcZnJhY3t7eCAtIFxtdX1eIHsyfX17MiBcc2lnbWEgXiB7Mn19IH0gCisgICAqIEBmXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIG5vcm1hbF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX21lYW4gPSBfUmVhbFR5cGUoMCksCisJCSAgIF9SZWFsVHlwZSBfX3N0ZGRldiA9IF9SZWFsVHlwZSgxKSkKKwk6IF9NX21lYW4oX19tZWFuKSwgX01fc3RkZGV2KF9fc3RkZGV2KQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9zdGRkZXYgPiBfUmVhbFR5cGUoMCkpOworCX0KKworCV9SZWFsVHlwZQorCW1lYW4oKSBjb25zdAorCXsgcmV0dXJuIF9NX21lYW47IH0KKworCV9SZWFsVHlwZQorCXN0ZGRldigpIGNvbnN0CisJeyByZXR1cm4gX01fc3RkZGV2OyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiAoX19wMS5fTV9tZWFuID09IF9fcDIuX01fbWVhbgorCQkgICYmIF9fcDEuX01fc3RkZGV2ID09IF9fcDIuX01fc3RkZGV2KTsgfQorCisgICAgICBwcml2YXRlOgorCV9SZWFsVHlwZSBfTV9tZWFuOworCV9SZWFsVHlwZSBfTV9zdGRkZXY7CisgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiB3aXRoIHBhcmFtZXRlcnMgQGYkbWVhbkBmJCBhbmQKKyAgICAgICAqIHN0YW5kYXJkIGRldmlhdGlvbi4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG5vcm1hbF9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19tZWFuID0gcmVzdWx0X3R5cGUoMCksCisJCQkgIHJlc3VsdF90eXBlIF9fc3RkZGV2ID0gcmVzdWx0X3R5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fbWVhbiwgX19zdGRkZXYpLCBfTV9zYXZlZF9hdmFpbGFibGUoZmFsc2UpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIG5vcm1hbF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLCBfTV9zYXZlZF9hdmFpbGFibGUoZmFsc2UpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fc2F2ZWRfYXZhaWxhYmxlID0gZmFsc2U7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbWVhbiBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIG1lYW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ubWVhbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIHN0ZGRldigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5zdGRkZXYoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bG93ZXN0KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIG5vcm1hbCBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQKKyAgICAgICAqICAgICAgICBiZSBnZW5lcmF0ZWQgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxPgorCWZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3Qgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX2QxLAorCQkgICBjb25zdCBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9fZDIpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJW5vcm1hbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJW5vcm1hbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJW5vcm1hbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvcgorICAgICAgICogICAgICAgICAgc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgIF9NX3BhcmFtOworICAgICAgcmVzdWx0X3R5cGUgX01fc2F2ZWQ7CisgICAgICBib29sICAgICAgICBfTV9zYXZlZF9hdmFpbGFibGU7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBub3JtYWwgZGlzdHJpYnV0aW9ucyBhcmUgZGlmZmVyZW50LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcworICAgKiBAZlsKKyAgICogICAgIHAoeHxtLHMpID0gXGZyYWN7MX17c3hcc3FydHsyXHBpfX0KKyAgICogICAgICAgICAgICAgICAgXGV4cHstXGZyYWN7KFxsbnt4fSAtIG0pXjJ9ezJzXjJ9fSAKKyAgICogQGZdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX1JlYWxUeXBlIF9fbSA9IF9SZWFsVHlwZSgwKSwKKwkJICAgX1JlYWxUeXBlIF9fcyA9IF9SZWFsVHlwZSgxKSkKKwk6IF9NX20oX19tKSwgX01fcyhfX3MpCisJeyB9CisKKwlfUmVhbFR5cGUKKwltKCkgY29uc3QKKwl7IHJldHVybiBfTV9tOyB9CisKKwlfUmVhbFR5cGUKKwlzKCkgY29uc3QKKwl7IHJldHVybiBfTV9zOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX20gPT0gX19wMi5fTV9tICYmIF9fcDEuX01fcyA9PSBfX3AyLl9NX3M7IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fbTsKKwlfUmVhbFR5cGUgX01fczsKKyAgICAgIH07CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBsb2dub3JtYWxfZGlzdHJpYnV0aW9uKF9SZWFsVHlwZSBfX20gPSBfUmVhbFR5cGUoMCksCisJCQkgICAgIF9SZWFsVHlwZSBfX3MgPSBfUmVhbFR5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fbSwgX19zKSwgX01fbmQoKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBsb2dub3JtYWxfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKSwgX01fbmQoKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fbmQucmVzZXQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5tKCk7IH0KKworICAgICAgX1JlYWxUeXBlCisgICAgICBzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLnMoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICAgIHsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgICAgeyByZXR1cm4gc3RkOjpleHAoX19wLnMoKSAqIF9NX25kKF9fdXJuZykgKyBfX3AubSgpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBsb2dub3JtYWwgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkCisgICAgICAgKiAgICAgICAgYmUgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IGxvZ25vcm1hbF9kaXN0cmlidXRpb24mIF9fZDIpCisgICAgICB7IHJldHVybiAoX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtCisJCSYmIF9fZDEuX01fbmQgPT0gX19kMi5fTV9uZCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVsb2dub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVsb2dub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3Qgc3RkOjpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVsb2dub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCBBICVsb2dub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdGQ6OmxvZ25vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfTV9uZDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGxvZ25vcm1hbCBkaXN0cmlidXRpb25zIGFyZSBkaWZmZXJlbnQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6bG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OmxvZ25vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBnYW1tYSBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgZ2FtbWEgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpczoKKyAgICogQGZbCisgICAqICAgICBwKHh8XGFscGhhLFxiZXRhKSA9IFxmcmFjezF9e1xiZXRhXEdhbW1hKFxhbHBoYSl9CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICh4L1xiZXRhKV57XGFscGhhIC0gMX0gZV57LXgvXGJldGF9IAorICAgKiBAZl0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBnYW1tYV9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgZ2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisJZnJpZW5kIGNsYXNzIGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX2FscGhhX3ZhbCA9IF9SZWFsVHlwZSgxKSwKKwkJICAgX1JlYWxUeXBlIF9fYmV0YV92YWwgPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9hbHBoYShfX2FscGhhX3ZhbCksIF9NX2JldGEoX19iZXRhX3ZhbCkKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fYWxwaGEgPiBfUmVhbFR5cGUoMCkpOworCSAgX01faW5pdGlhbGl6ZSgpOworCX0KKworCV9SZWFsVHlwZQorCWFscGhhKCkgY29uc3QKKwl7IHJldHVybiBfTV9hbHBoYTsgfQorCisJX1JlYWxUeXBlCisJYmV0YSgpIGNvbnN0CisJeyByZXR1cm4gX01fYmV0YTsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gKF9fcDEuX01fYWxwaGEgPT0gX19wMi5fTV9hbHBoYQorCQkgICYmIF9fcDEuX01fYmV0YSA9PSBfX3AyLl9NX2JldGEpOyB9CisKKyAgICAgIHByaXZhdGU6CisJdm9pZAorCV9NX2luaXRpYWxpemUoKTsKKworCV9SZWFsVHlwZSBfTV9hbHBoYTsKKwlfUmVhbFR5cGUgX01fYmV0YTsKKworCV9SZWFsVHlwZSBfTV9tYWxwaGEsIF9NX2EyOworICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBnYW1tYSBkaXN0cmlidXRpb24gd2l0aCBwYXJhbWV0ZXJzCisgICAgICAgKiBAZiRcYWxwaGFAZiQgYW5kIEBmJFxiZXRhQGYkLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZ2FtbWFfZGlzdHJpYnV0aW9uKF9SZWFsVHlwZSBfX2FscGhhX3ZhbCA9IF9SZWFsVHlwZSgxKSwKKwkJCSBfUmVhbFR5cGUgX19iZXRhX3ZhbCA9IF9SZWFsVHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19hbHBoYV92YWwsIF9fYmV0YV92YWwpLCBfTV9uZCgpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGdhbW1hX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksIF9NX25kKCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyBfTV9uZC5yZXNldCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIEBmJFxhbHBoYUBmJCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIGFscGhhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmFscGhhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgQGYkXGJldGFAZiQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBiZXRhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmJldGEoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gZ2FtbWEgZGlzdHJpYnV0aW9ucyBoYXZlIHRoZSBzYW1lCisgICAgICAgKiAgICAgICAgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZAorICAgICAgICogICAgICAgIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgZ2FtbWFfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgZ2FtbWFfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gKF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbQorCQkmJiBfX2QxLl9NX25kID09IF9fZDIuX01fbmQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlZ2FtbWFfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVnYW1tYV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlZ2FtbWFfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlZ2FtbWFfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworCisgICAgICBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX25kOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gZ2FtbWEgZGlzdHJpYnV0aW9ucyBhcmUgZGlmZmVyZW50LgorICAgKi8KKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICAgaW5saW5lIGJvb2wKKyAgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCQljb25zdCBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBIGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcworICAgKiBAZiRwKHh8bikgPSBcZnJhY3t4Xnsobi8yKSAtIDF9ZV57LXgvMn19e1xHYW1tYShuLzIpIDJee24vMn19QGYkCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX24gPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9uKF9fbikKKwl7IH0KKworCV9SZWFsVHlwZQorCW4oKSBjb25zdAorCXsgcmV0dXJuIF9NX247IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fbiA9PSBfX3AyLl9NX247IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fbjsKKyAgICAgIH07CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb24oX1JlYWxUeXBlIF9fbiA9IF9SZWFsVHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19uKSwgX01fZ2QoX19uIC8gMikKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKSwgX01fZ2QoX19wLm4oKSAvIDIpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fZ2QucmVzZXQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5uKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gcmVzdWx0X3R5cGUoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIDIgKiBfTV9nZChfX3VybmcpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+OjpwYXJhbV90eXBlCisJICAgIHBhcmFtX3R5cGU7CisJICByZXR1cm4gMiAqIF9NX2dkKF9fdXJuZywgcGFyYW1fdHlwZShfX3AubigpIC8gMikpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgICB7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHR5cGVuYW1lIHN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPjo6cGFyYW1fdHlwZQorCSAgICBfX3AyKF9fcC5uKCkgLyAyKTsKKwkgIHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3AyKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgICB7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0eXBlbmFtZSBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUKKwkgICAgX19wMihfX3AubigpIC8gMik7CisJICB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wMik7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIENoaS1zcXVhcmVkIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgICAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMgYW5kIHRoZSBzZXF1ZW5jZXMgdGhhdCB3b3VsZCBiZQorICAgICAgICogICAgICAgIGdlbmVyYXRlZCBhcmUgZXF1YWwuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbSAmJiBfX2QxLl9NX2dkID09IF9fZDIuX01fZ2Q7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVjaGlfc3F1YXJlZF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHN0ZDo6Y2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVjaGlfc3F1YXJlZF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194IEEgJWNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpjaGlfc3F1YXJlZF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgdHlwZW5hbWUKKwkJCXN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPjo6cGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX2dkOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gQ2hpLXNxdWFyZWQgZGlzdHJpYnV0aW9ucyBhcmUgZGlmZmVyZW50LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OmNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBIGNhdWNoeV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMKKyAgICogQGYkcCh4fGEsYikgPSAoXHBpIGIgKDEgKyAoXGZyYWN7eC1hfXtifSleMikpXnstMX1AZiQKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBjYXVjaHlfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIGNhdWNoeV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19hID0gX1JlYWxUeXBlKDApLAorCQkgICBfUmVhbFR5cGUgX19iID0gX1JlYWxUeXBlKDEpKQorCTogX01fYShfX2EpLCBfTV9iKF9fYikKKwl7IH0KKworCV9SZWFsVHlwZQorCWEoKSBjb25zdAorCXsgcmV0dXJuIF9NX2E7IH0KKworCV9SZWFsVHlwZQorCWIoKSBjb25zdAorCXsgcmV0dXJuIF9NX2I7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fYSA9PSBfX3AyLl9NX2EgJiYgX19wMS5fTV9iID09IF9fcDIuX01fYjsgfQorCisgICAgICBwcml2YXRlOgorCV9SZWFsVHlwZSBfTV9hOworCV9SZWFsVHlwZSBfTV9iOworICAgICAgfTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIGNhdWNoeV9kaXN0cmlidXRpb24oX1JlYWxUeXBlIF9fYSA9IF9SZWFsVHlwZSgwKSwKKwkJCSAgX1JlYWxUeXBlIF9fYiA9IF9SZWFsVHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19hLCBfX2IpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGNhdWNoeV9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5hKCk7IH0KKworICAgICAgX1JlYWxUeXBlCisgICAgICBiKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bG93ZXN0KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIENhdWNoeSBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBjYXVjaHlfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgY2F1Y2h5X2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBDYXVjaHkgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAqICAgICAgICBkaWZmZXJlbnQgcGFyYW1ldGVycy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpjYXVjaHlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6Y2F1Y2h5X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVjYXVjaHlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAqCisgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggIEEgJWNhdWNoeV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHN0ZDo6Y2F1Y2h5X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpOworCisgIC8qKgorICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlY2F1Y2h5X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAqCisgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCBBICVjYXVjaHlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHN0ZDo6Y2F1Y2h5X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpOworCisKKyAgLyoqCisgICAqIEBicmllZiBBIGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcworICAgKiBAZlsKKyAgICogICAgIHAoeHxtLG4pID0gXGZyYWN7XEdhbW1hKChtK24pLzIpfXtcR2FtbWEobS8yKVxHYW1tYShuLzIpfQorICAgKiAgICAgICAgICAgICAgICAoXGZyYWN7bX17bn0pXnttLzJ9IHheeyhtLzIpLTF9CisgICAqICAgICAgICAgICAgICAgICgxICsgXGZyYWN7bXh9e259KV57LShtK24pLzJ9IAorICAgKiBAZl0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBmaXNoZXJfZl9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX1JlYWxUeXBlIF9fbSA9IF9SZWFsVHlwZSgxKSwKKwkJICAgX1JlYWxUeXBlIF9fbiA9IF9SZWFsVHlwZSgxKSkKKwk6IF9NX20oX19tKSwgX01fbihfX24pCisJeyB9CisKKwlfUmVhbFR5cGUKKwltKCkgY29uc3QKKwl7IHJldHVybiBfTV9tOyB9CisKKwlfUmVhbFR5cGUKKwluKCkgY29uc3QKKwl7IHJldHVybiBfTV9uOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX20gPT0gX19wMi5fTV9tICYmIF9fcDEuX01fbiA9PSBfX3AyLl9NX247IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fbTsKKwlfUmVhbFR5cGUgX01fbjsKKyAgICAgIH07CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBmaXNoZXJfZl9kaXN0cmlidXRpb24oX1JlYWxUeXBlIF9fbSA9IF9SZWFsVHlwZSgxKSwKKwkJCSAgICBfUmVhbFR5cGUgX19uID0gX1JlYWxUeXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX20sIF9fbiksIF9NX2dkX3goX19tIC8gMiksIF9NX2dkX3koX19uIC8gMikKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKSwgX01fZ2RfeChfX3AubSgpIC8gMiksIF9NX2dkX3koX19wLm4oKSAvIDIpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsKKwlfTV9nZF94LnJlc2V0KCk7CisJX01fZ2RfeS5yZXNldCgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5tKCk7IH0KKworICAgICAgX1JlYWxUeXBlCisgICAgICBuKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gKF9NX2dkX3goX191cm5nKSAqIG4oKSkgLyAoX01fZ2RfeShfX3VybmcpICogbSgpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPjo6cGFyYW1fdHlwZQorCSAgICBwYXJhbV90eXBlOworCSAgcmV0dXJuICgoX01fZ2RfeChfX3VybmcsIHBhcmFtX3R5cGUoX19wLm0oKSAvIDIpKSAqIG4oKSkKKwkJICAvIChfTV9nZF95KF9fdXJuZywgcGFyYW1fdHlwZShfX3AubigpIC8gMikpICogbSgpKSk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZyk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBGaXNoZXIgZiBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQKKyAgICAgICAqICAgICAgICBiZSBnZW5lcmF0ZWQgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBmaXNoZXJfZl9kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCBmaXNoZXJfZl9kaXN0cmlidXRpb24mIF9fZDIpCisgICAgICB7IHJldHVybiAoX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtCisJCSYmIF9fZDEuX01fZ2RfeCA9PSBfX2QyLl9NX2dkX3gKKwkJJiYgX19kMS5fTV9nZF95ID09IF9fZDIuX01fZ2RfeSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVmaXNoZXJfZl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWZpc2hlcl9mX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHN0ZDo6ZmlzaGVyX2ZfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVmaXNoZXJfZl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194IEEgJWZpc2hlcl9mX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpmaXNoZXJfZl9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX2dkX3gsIF9NX2dkX3k7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBGaXNoZXIgZiBkaXN0cmlidXRpb25zIGFyZSBkaWZlcmVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpmaXNoZXJfZl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpmaXNoZXJfZl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworICAvKioKKyAgICogQGJyaWVmIEEgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpczoKKyAgICogQGZbCisgICAqICAgICBwKHh8bikgPSBcZnJhY3sxfXtcc3FydChuXHBpKX0gXGZyYWN7XEdhbW1hKChuKzEpLzIpfXtcR2FtbWEobi8yKX0KKyAgICogICAgICAgICAgICAgICgxICsgXGZyYWN7eF4yfXtufSkgXnstKG4rMSkvMn0gCisgICAqIEBmXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIHN0dWRlbnRfdF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX24gPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9uKF9fbikKKwl7IH0KKworCV9SZWFsVHlwZQorCW4oKSBjb25zdAorCXsgcmV0dXJuIF9NX247IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fbiA9PSBfX3AyLl9NX247IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fbjsKKyAgICAgIH07CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBzdHVkZW50X3RfZGlzdHJpYnV0aW9uKF9SZWFsVHlwZSBfX24gPSBfUmVhbFR5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fbiksIF9NX25kKCksIF9NX2dkKF9fbiAvIDIsIDIpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHN0dWRlbnRfdF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLCBfTV9uZCgpLCBfTV9nZChfX3AubigpIC8gMiwgMikKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeworCV9NX25kLnJlc2V0KCk7CisJX01fZ2QucmVzZXQoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIG4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ubigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+Ojpsb3dlc3QoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgICB7IHJldHVybiBfTV9uZChfX3VybmcpICogc3RkOjpzcXJ0KG4oKSAvIF9NX2dkKF9fdXJuZykpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+OjpwYXJhbV90eXBlCisJICAgIHBhcmFtX3R5cGU7CisJCisJICBjb25zdCByZXN1bHRfdHlwZSBfX2cgPSBfTV9nZChfX3VybmcsIHBhcmFtX3R5cGUoX19wLm4oKSAvIDIsIDIpKTsKKwkgIHJldHVybiBfTV9uZChfX3VybmcpICogc3RkOjpzcXJ0KF9fcC5uKCkgLyBfX2cpOworICAgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZyk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIFN0dWRlbnQgdCBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQKKyAgICAgICAqICAgICAgICBiZSBnZW5lcmF0ZWQgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBzdHVkZW50X3RfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3Qgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIChfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW0KKwkJJiYgX19kMS5fTV9uZCA9PSBfX2QyLl9NX25kICYmIF9fZDEuX01fZ2QgPT0gX19kMi5fTV9nZCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVzdHVkZW50X3RfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVzdHVkZW50X3RfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3Qgc3RkOjpzdHVkZW50X3RfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVzdHVkZW50X3RfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCBBICVzdHVkZW50X3RfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdGQ6OnN0dWRlbnRfdF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisKKyAgICAgIHN0ZDo6bm9ybWFsX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX01fbmQ7CisgICAgICBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX01fZ2Q7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBTdHVkZW50IHQgZGlzdHJpYnV0aW9ucyBhcmUgZGlmZmVyZW50LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OnN0dWRlbnRfdF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpzdHVkZW50X3RfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKiBAfSAqLyAvLyBncm91cCByYW5kb21fZGlzdHJpYnV0aW9uc19ub3JtYWwKKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgcmFuZG9tX2Rpc3RyaWJ1dGlvbnNfYmVybm91bGxpIEJlcm5vdWxsaSBEaXN0cmlidXRpb25zCisgICAqIEBpbmdyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiBAYnJpZWYgQSBCZXJub3VsbGkgcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIEdlbmVyYXRlcyBhIHNlcXVlbmNlIG9mIHRydWUgYW5kIGZhbHNlIHZhbHVlcyB3aXRoIGxpa2VsaWhvb2QgQGYkcEBmJAorICAgKiB0aGF0IHRydWUgd2lsbCBjb21lIHVwIGFuZCBAZiQoMSAtIHApQGYkIHRoYXQgZmFsc2Ugd2lsbCBhcHBlYXIuCisgICAqLworICBjbGFzcyBiZXJub3VsbGlfZGlzdHJpYnV0aW9uCisgIHsKKyAgcHVibGljOgorICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgeworICAgICAgdHlwZWRlZiBiZXJub3VsbGlfZGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbl90eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgcGFyYW1fdHlwZShkb3VibGUgX19wID0gMC41KQorICAgICAgOiBfTV9wKF9fcCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoKF9NX3AgPj0gMC4wKSAmJiAoX01fcCA8PSAxLjApKTsKKyAgICAgIH0KKworICAgICAgZG91YmxlCisgICAgICBwKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3A7IH0KKworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKyAgICAgIHsgcmV0dXJuIF9fcDEuX01fcCA9PSBfX3AyLl9NX3A7IH0KKworICAgIHByaXZhdGU6CisgICAgICBkb3VibGUgX01fcDsKKyAgICB9OworCisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIEJlcm5vdWxsaSBkaXN0cmlidXRpb24gd2l0aCBsaWtlbGlob29kIEBwIHAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gX19wICBbSU5dICBUaGUgbGlrZWxpaG9vZCBvZiBhIHRydWUgcmVzdWx0IGJlaW5nIHJldHVybmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgIE11c3QgYmUgaW4gdGhlIGludGVydmFsIEBmJFswLCAxXUBmJC4KKyAgICAgKi8KKyAgICBleHBsaWNpdAorICAgIGJlcm5vdWxsaV9kaXN0cmlidXRpb24oZG91YmxlIF9fcCA9IDAuNSkKKyAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICB7IH0KKworICAgIGV4cGxpY2l0CisgICAgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgOiBfTV9wYXJhbShfX3ApCisgICAgeyB9CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICoKKyAgICAgKiBEb2VzIG5vdGhpbmcgZm9yIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvbi4KKyAgICAgKi8KKyAgICB2b2lkCisgICAgcmVzZXQoKSB7IH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBAcCBwIHBhcmFtZXRlciBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAqLworICAgIGRvdWJsZQorICAgIHAoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3BhcmFtLnAoKTsgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgKi8KKyAgICBwYXJhbV90eXBlCisgICAgcGFyYW0oKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAqLworICAgIHZvaWQKKyAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgKi8KKyAgICByZXN1bHRfdHlwZQorICAgIG1pbigpIGNvbnN0CisgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1pbigpOyB9CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgKi8KKyAgICByZXN1bHRfdHlwZQorICAgIG1heCgpIGNvbnN0CisgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgZG91YmxlPgorCSAgX19hdXJuZyhfX3VybmcpOworCWlmICgoX19hdXJuZygpIC0gX19hdXJuZy5taW4oKSkKKwkgICAgIDwgX19wLnAoKSAqIChfX2F1cm5nLm1heCgpIC0gX19hdXJuZy5taW4oKSkpCisJICByZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gQmVybm91bGxpIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIGZyaWVuZCBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBiZXJub3VsbGlfZGlzdHJpYnV0aW9uJiBfX2QxLAorCSAgICAgICBjb25zdCBiZXJub3VsbGlfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgIHsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbTsgfQorCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gQmVybm91bGxpIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgKiAgICAgICAgZGlmZmVyZW50IHBhcmFtZXRlcnMuCisgICAqLworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6YmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkgICAgIGNvbnN0IHN0ZDo6YmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBJbnNlcnRzIGEgJWJlcm5vdWxsaV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICoKKyAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAlYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAqIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHN0ZDo6YmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgX194KTsKKworICAvKioKKyAgICogQGJyaWVmIEV4dHJhY3RzIGEgJWJlcm5vdWxsaV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgKgorICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggIEEgJWJlcm5vdWxsaV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBzdGQ6OmJlcm5vdWxsaV9kaXN0cmlidXRpb24mIF9feCkKKyAgICB7CisgICAgICBkb3VibGUgX19wOworICAgICAgX19pcyA+PiBfX3A7CisgICAgICBfX3gucGFyYW0oYmVybm91bGxpX2Rpc3RyaWJ1dGlvbjo6cGFyYW1fdHlwZShfX3ApKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBkaXNjcmV0ZSBiaW5vbWlhbCByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBiaW5vbWlhbCBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGlzCisgICAqIEBmJHAoaXx0LHApID0gXGJpbm9te3R9e2l9IHBeaSAoMSAtIHApXnt0IC0gaX1AZiQgd2hlcmUgQGYkdEBmJAorICAgKiBhbmQgQGYkcEBmJCBhcmUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlID0gaW50PgorICAgIGNsYXNzIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxfSW50VHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhbiBpbnRlZ3JhbCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9JbnRUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisJZnJpZW5kIGNsYXNzIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT47CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX0ludFR5cGUgX190ID0gX0ludFR5cGUoMSksIGRvdWJsZSBfX3AgPSAwLjUpCisJOiBfTV90KF9fdCksIF9NX3AoX19wKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCgoX01fdCA+PSBfSW50VHlwZSgwKSkKKwkJCQkmJiAoX01fcCA+PSAwLjApCisJCQkJJiYgKF9NX3AgPD0gMS4wKSk7CisJICBfTV9pbml0aWFsaXplKCk7CisJfQorCisJX0ludFR5cGUKKwl0KCkgY29uc3QKKwl7IHJldHVybiBfTV90OyB9CisKKwlkb3VibGUKKwlwKCkgY29uc3QKKwl7IHJldHVybiBfTV9wOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX3QgPT0gX19wMi5fTV90ICYmIF9fcDEuX01fcCA9PSBfX3AyLl9NX3A7IH0KKworICAgICAgcHJpdmF0ZToKKwl2b2lkCisJX01faW5pdGlhbGl6ZSgpOworCisJX0ludFR5cGUgX01fdDsKKwlkb3VibGUgX01fcDsKKworCWRvdWJsZSBfTV9xOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKwlkb3VibGUgX01fZDEsIF9NX2QyLCBfTV9zMSwgX01fczIsIF9NX2MsCisJICAgICAgIF9NX2ExLCBfTV9hMTIzLCBfTV9zLCBfTV9sZiwgX01fbHAxcDsKKyNlbmRpZgorCWJvb2wgICBfTV9lYXN5OworICAgICAgfTsKKworICAgICAgLy8gY29uc3RydWN0b3JzIGFuZCBtZW1iZXIgZnVuY3Rpb24KKyAgICAgIGV4cGxpY2l0CisgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb24oX0ludFR5cGUgX190ID0gX0ludFR5cGUoMSksCisJCQkgICAgZG91YmxlIF9fcCA9IDAuNSkKKyAgICAgIDogX01fcGFyYW0oX190LCBfX3ApLCBfTV9uZCgpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksIF9NX25kKCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyBfTV9uZC5yZXNldCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGRpc3RyaWJ1dGlvbiBAcCB0IHBhcmFtZXRlci4KKyAgICAgICAqLworICAgICAgX0ludFR5cGUKKyAgICAgIHQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0udCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGRpc3RyaWJ1dGlvbiBAcCBwIHBhcmFtZXRlci4KKyAgICAgICAqLworICAgICAgZG91YmxlCisgICAgICBwKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLnAoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0udCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBiaW5vbWlhbCBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQKKyAgICAgICAqICAgICAgICBiZSBnZW5lcmF0ZWQgYXJlIGVxdWFsLgorICAgICAgICovCisJZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBiaW5vbWlhbF9kaXN0cmlidXRpb24mIF9fZDEsCisJCSAgIGNvbnN0IGJpbm9taWFsX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtICYmIF9fZDEuX01fbmQgPT0gX19kMi5fTV9uZDsgfQorI2Vsc2UKKyAgICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICViaW5vbWlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWJpbm9taWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3Qgc3RkOjpiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlYmlub21pYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlYmlub21pYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvcgorICAgICAgICogICAgICAgICAgc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdGQ6OmJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJX01fd2FpdGluZyhfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBfSW50VHlwZSBfX3QsIGRvdWJsZSBfX3EpOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworCisgICAgICAvLyBOQjogVW51c2VkIHdoZW4gX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMSBpcyB1bmRlZmluZWQuCisgICAgICBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248ZG91YmxlPiBfTV9uZDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGJpbm9taWFsIGRpc3RyaWJ1dGlvbnMgYXJlIGRpZmZlcmVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6Ymlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBkaXNjcmV0ZSBnZW9tZXRyaWMgcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgZ2VvbWV0cmljIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXMKKyAgICogQGYkcChpfHApID0gcCgxIC0gcClee2l9QGYkIHdoZXJlIEBmJHBAZiQgaXMgdGhlIHBhcmFtZXRlciBvZiB0aGUKKyAgICogZGlzdHJpYnV0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUgPSBpbnQ+CisgICAgY2xhc3MgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxfSW50VHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhbiBpbnRlZ3JhbCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9JbnRUeXBlICByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKwlmcmllbmQgY2xhc3MgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT47CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoZG91YmxlIF9fcCA9IDAuNSkKKwk6IF9NX3AoX19wKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCgoX01fcCA+IDAuMCkgJiYgKF9NX3AgPCAxLjApKTsKKwkgIF9NX2luaXRpYWxpemUoKTsKKwl9CisKKwlkb3VibGUKKwlwKCkgY29uc3QKKwl7IHJldHVybiBfTV9wOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX3AgPT0gX19wMi5fTV9wOyB9CisKKyAgICAgIHByaXZhdGU6CisJdm9pZAorCV9NX2luaXRpYWxpemUoKQorCXsgX01fbG9nXzFfcCA9IHN0ZDo6bG9nKDEuMCAtIF9NX3ApOyB9CisKKwlkb3VibGUgX01fcDsKKworCWRvdWJsZSBfTV9sb2dfMV9wOworICAgICAgfTsKKworICAgICAgLy8gY29uc3RydWN0b3JzIGFuZCBtZW1iZXIgZnVuY3Rpb24KKyAgICAgIGV4cGxpY2l0CisgICAgICBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uKGRvdWJsZSBfX3AgPSAwLjUpCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiBEb2VzIG5vdGhpbmcgZm9yIHRoZSBnZW9tZXRyaWMgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBkaXN0cmlidXRpb24gcGFyYW1ldGVyIEBwIHAuCisgICAgICAgKi8KKyAgICAgIGRvdWJsZQorICAgICAgcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5wKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gZ2VvbWV0cmljIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgICAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGdlb21ldHJpY19kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGdlb21ldHJpYyBkaXN0cmlidXRpb25zIGhhdmUKKyAgICogICAgICAgIGRpZmZlcmVudCBwYXJhbWV0ZXJzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6Z2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6Z2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBJbnNlcnRzIGEgJWdlb21ldHJpY19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICoKKyAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAlZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAqIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHN0ZDo6Z2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9feCk7CisKKyAgLyoqCisgICAqIEBicmllZiBFeHRyYWN0cyBhICVnZW9tZXRyaWNfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICoKKyAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194ICBBICVnZW9tZXRyaWNfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgc3RkOjpnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KTsKKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgbmVnYXRpdmUgYmlub21pYWwgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcworICAgKiBAZiRwKGkpID0gXGJpbm9te259e2l9IHBeaSAoMSAtIHApXnt0IC0gaX1AZiQgd2hlcmUgQGYkdEBmJAorICAgKiBhbmQgQGYkcEBmJCBhcmUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlID0gaW50PgorICAgIGNsYXNzIG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxfSW50VHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhbiBpbnRlZ3JhbCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9JbnRUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX0ludFR5cGUgX19rID0gMSwgZG91YmxlIF9fcCA9IDAuNSkKKwk6IF9NX2soX19rKSwgX01fcChfX3ApCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKChfTV9rID4gMCkgJiYgKF9NX3AgPiAwLjApICYmIChfTV9wIDw9IDEuMCkpOworCX0KKworCV9JbnRUeXBlCisJaygpIGNvbnN0CisJeyByZXR1cm4gX01fazsgfQorCisJZG91YmxlCisJcCgpIGNvbnN0CisJeyByZXR1cm4gX01fcDsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9rID09IF9fcDIuX01fayAmJiBfX3AxLl9NX3AgPT0gX19wMi5fTV9wOyB9CisKKyAgICAgIHByaXZhdGU6CisJX0ludFR5cGUgX01fazsKKwlkb3VibGUgX01fcDsKKyAgICAgIH07CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb24oX0ludFR5cGUgX19rID0gMSwgZG91YmxlIF9fcCA9IDAuNSkKKyAgICAgIDogX01fcGFyYW0oX19rLCBfX3ApLCBfTV9nZChfX2ssICgxLjAgLSBfX3ApIC8gX19wKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLCBfTV9nZChfX3AuaygpLCAoMS4wIC0gX19wLnAoKSkgLyBfX3AucCgpKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IF9NX2dkLnJlc2V0KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBAZiRrQGYkIHBhcmFtZXRlciBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfSW50VHlwZQorICAgICAgaygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5rKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBAZiRwQGYkIHBhcmFtZXRlciBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBkb3VibGUKKyAgICAgIHAoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ucCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJlc3VsdF90eXBlKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gbmVnYXRpdmUgYmlub21pYWwgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkIGJlCisgICAgICAgKiAgICAgICAgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtICYmIF9fZDEuX01fZ2QgPT0gX19kMi5fTV9nZDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJW5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20KKyAgICAgICAqICAgICAgICBudW1iZXIgZGlzdHJpYnV0aW9uIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJW5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgICBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiAgICAgICAgICBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHN0ZDo6bmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJW5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgZGlzdHJpYnV0aW9uIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194IEEgJW5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdGQ6Om5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZyk7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworCisgICAgICBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxkb3VibGU+IF9NX2dkOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gbmVnYXRpdmUgYmlub21pYWwgZGlzdHJpYnV0aW9ucyBhcmUgZGlmZmVyZW50LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6bmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyogQH0gKi8gLy8gZ3JvdXAgcmFuZG9tX2Rpc3RyaWJ1dGlvbnNfYmVybm91bGxpCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zX3BvaXNzb24gUG9pc3NvbiBEaXN0cmlidXRpb25zCisgICAqIEBpbmdyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiBAYnJpZWYgQSBkaXNjcmV0ZSBQb2lzc29uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIFBvaXNzb24gcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpcworICAgKiBAZiRwKGl8XG11KSA9IFxmcmFje1xtdV5pfXtpIX0gZV57LVxtdX1AZiQgd2hlcmUgQGYkXG11QGYkIGlzIHRoZQorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlID0gaW50PgorICAgIGNsYXNzIHBvaXNzb25fZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2ludGVncmFsPF9JbnRUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGFuIGludGVncmFsIHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX0ludFR5cGUgIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKwlmcmllbmQgY2xhc3MgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGU+OworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKGRvdWJsZSBfX21lYW4gPSAxLjApCisJOiBfTV9tZWFuKF9fbWVhbikKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fbWVhbiA+IDAuMCk7CisJICBfTV9pbml0aWFsaXplKCk7CisJfQorCisJZG91YmxlCisJbWVhbigpIGNvbnN0CisJeyByZXR1cm4gX01fbWVhbjsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9tZWFuID09IF9fcDIuX01fbWVhbjsgfQorCisgICAgICBwcml2YXRlOgorCS8vIEhvc3RzIGVpdGhlciBsb2cobWVhbikgb3IgdGhlIHRocmVzaG9sZCBvZiB0aGUgc2ltcGxlIG1ldGhvZC4KKwl2b2lkCisJX01faW5pdGlhbGl6ZSgpOworCisJZG91YmxlIF9NX21lYW47CisKKwlkb3VibGUgX01fbG1fdGhyOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKwlkb3VibGUgX01fbGZtLCBfTV9zbSwgX01fZCwgX01fc2N4LCBfTV8xY3gsIF9NX2MyYiwgX01fY2I7CisjZW5kaWYKKyAgICAgIH07CisKKyAgICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgbWVtYmVyIGZ1bmN0aW9uCisgICAgICBleHBsaWNpdAorICAgICAgcG9pc3Nvbl9kaXN0cmlidXRpb24oZG91YmxlIF9fbWVhbiA9IDEuMCkKKyAgICAgIDogX01fcGFyYW0oX19tZWFuKSwgX01fbmQoKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBwb2lzc29uX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksIF9NX25kKCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyBfTV9uZC5yZXNldCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGRpc3RyaWJ1dGlvbiBwYXJhbWV0ZXIgQHAgbWVhbi4KKyAgICAgICAqLworICAgICAgZG91YmxlCisgICAgICBtZWFuKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm1lYW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgICAvKioKKwkqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gUG9pc3NvbiBkaXN0cmlidXRpb25zIGhhdmUgdGhlIHNhbWUKKwkqICAgICAgICBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQgYmUgZ2VuZXJhdGVkCisJKiAgICAgICAgYXJlIGVxdWFsLgorCSovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBwb2lzc29uX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IHBvaXNzb25fZGlzdHJpYnV0aW9uJiBfX2QyKQorI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIHsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbSAmJiBfX2QxLl9NX25kID09IF9fZDIuX01fbmQ7IH0KKyNlbHNlCisgICAgICB7IHJldHVybiBfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW07IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJXBvaXNzb25fZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVwb2lzc29uX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3Qgc3RkOjpwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVwb2lzc29uX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXBvaXNzb25fZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvcgorICAgICAgICogICAgICAgICAgc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdGQ6OnBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgLy8gTkI6IFVudXNlZCB3aGVuIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEgaXMgdW5kZWZpbmVkLgorICAgICAgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gX01fbmQ7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBQb2lzc29uIGRpc3RyaWJ1dGlvbnMgYXJlIGRpZmZlcmVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OnBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEFuIGV4cG9uZW50aWFsIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBleHBvbmVudGlhbCBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGlzCisgICAqIEBmJHAoeHxcbGFtYmRhKSA9IFxsYW1iZGEgZV57LVxsYW1iZGEgeH1AZiQuCisgICAqCisgICAqIDx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0xMCBjZWxsc3BhY2luZz0wPgorICAgKiA8Y2FwdGlvbiBhbGlnbj10b3A+RGlzdHJpYnV0aW9uIFN0YXRpc3RpY3M8L2NhcHRpb24+CisgICAqIDx0cj48dGQ+TWVhbjwvdGQ+PHRkPkBmJFxmcmFjezF9e1xsYW1iZGF9QGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPk1lZGlhbjwvdGQ+PHRkPkBmJFxmcmFje1xsbiAyfXtcbGFtYmRhfUBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5Nb2RlPC90ZD48dGQ+QGYkemVyb0BmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5SYW5nZTwvdGQ+PHRkPkBmJFswLCBcaW5mdHldQGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPlN0YW5kYXJkIERldmlhdGlvbjwvdGQ+PHRkPkBmJFxmcmFjezF9e1xsYW1iZGF9QGYkPC90ZD48L3RyPgorICAgKiA8L3RhYmxlPgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBleHBvbmVudGlhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19sYW1iZGEgPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9sYW1iZGEoX19sYW1iZGEpCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX2xhbWJkYSA+IF9SZWFsVHlwZSgwKSk7CisJfQorCisJX1JlYWxUeXBlCisJbGFtYmRhKCkgY29uc3QKKwl7IHJldHVybiBfTV9sYW1iZGE7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fbGFtYmRhID09IF9fcDIuX01fbGFtYmRhOyB9CisKKyAgICAgIHByaXZhdGU6CisJX1JlYWxUeXBlIF9NX2xhbWJkYTsKKyAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGFuIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbiB3aXRoIGludmVyc2Ugc2NhbGUKKyAgICAgICAqICAgICAgICBwYXJhbWV0ZXIgQGYkXGxhbWJkYUBmJC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbihjb25zdCByZXN1bHRfdHlwZSYgX19sYW1iZGEgPSByZXN1bHRfdHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19sYW1iZGEpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiBIYXMgbm8gZWZmZWN0IG9uIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbnMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGludmVyc2Ugc2NhbGUgcGFyYW1ldGVyIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgbGFtYmRhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmxhbWJkYSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJlc3VsdF90eXBlKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsKKwkgIF9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICAgIF9fYXVybmcoX191cm5nKTsKKwkgIHJldHVybiAtc3RkOjpsb2cocmVzdWx0X3R5cGUoMSkgLSBfX2F1cm5nKCkpIC8gX19wLmxhbWJkYSgpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9ucyBoYXZlIHRoZSBzYW1lCisgICAgICAgKiAgICAgICAgcGFyYW1ldGVycy4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbnMgaGF2ZSBkaWZmZXJlbnQKKyAgICogICAgICAgIHBhcmFtZXRlcnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6ZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6ZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBJbnNlcnRzIGEgJWV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgKgorICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194ICBBICVleHBvbmVudGlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHN0ZDo6ZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCk7CisKKyAgLyoqCisgICAqIEBicmllZiBFeHRyYWN0cyBhICVleHBvbmVudGlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgKgorICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggQSAlZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHN0ZDo6ZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCk7CisKKworICAvKioKKyAgICogQGJyaWVmIEEgd2VpYnVsbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXM6CisgICAqIEBmWworICAgKiAgICAgcCh4fFxhbHBoYSxcYmV0YSkgPSBcZnJhY3tcYWxwaGF9e1xiZXRhfSAoXGZyYWN7eH17XGJldGF9KV57XGFscGhhLTF9CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgIFxleHB7KC0oXGZyYWN7eH17XGJldGF9KV5cYWxwaGEpfSAKKyAgICogQGZdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3Mgd2VpYnVsbF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgd2VpYnVsbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19hID0gX1JlYWxUeXBlKDEpLAorCQkgICBfUmVhbFR5cGUgX19iID0gX1JlYWxUeXBlKDEpKQorCTogX01fYShfX2EpLCBfTV9iKF9fYikKKwl7IH0KKworCV9SZWFsVHlwZQorCWEoKSBjb25zdAorCXsgcmV0dXJuIF9NX2E7IH0KKworCV9SZWFsVHlwZQorCWIoKSBjb25zdAorCXsgcmV0dXJuIF9NX2I7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fYSA9PSBfX3AyLl9NX2EgJiYgX19wMS5fTV9iID09IF9fcDIuX01fYjsgfQorCisgICAgICBwcml2YXRlOgorCV9SZWFsVHlwZSBfTV9hOworCV9SZWFsVHlwZSBfTV9iOworICAgICAgfTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHdlaWJ1bGxfZGlzdHJpYnV0aW9uKF9SZWFsVHlwZSBfX2EgPSBfUmVhbFR5cGUoMSksCisJCQkgICBfUmVhbFR5cGUgX19iID0gX1JlYWxUeXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX2EsIF9fYikKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgd2VpYnVsbF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdGhlIEBmJGFAZiQgcGFyYW1ldGVyIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5hKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBAZiRiQGYkIHBhcmFtZXRlciBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIGIoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJlc3VsdF90eXBlKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBXZWlidWxsIGRpc3RyaWJ1dGlvbnMgaGF2ZSB0aGUgc2FtZQorICAgICAgICogICAgICAgIHBhcmFtZXRlcnMuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHdlaWJ1bGxfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3Qgd2VpYnVsbF9kaXN0cmlidXRpb24mIF9fZDIpCisgICAgICB7IHJldHVybiBfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW07IH0KKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgIC8qKgorICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBXZWlidWxsIGRpc3RyaWJ1dGlvbnMgaGF2ZSBkaWZmZXJlbnQKKyAgICAqICAgICAgICBwYXJhbWV0ZXJzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjp3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OndlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBJbnNlcnRzIGEgJXdlaWJ1bGxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAqCisgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggIEEgJXdlaWJ1bGxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICogYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdGQ6OndlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCk7CisKKyAgLyoqCisgICAqIEBicmllZiBFeHRyYWN0cyBhICV3ZWlidWxsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAqCisgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCBBICV3ZWlidWxsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBzdGQ6OndlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCk7CisKKworICAvKioKKyAgICogQGJyaWVmIEEgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMKKyAgICogQGZbCisgICAqICAgICBwKHh8YSxiKSA9IFxmcmFjezF9e2J9CisgICAqICAgICAgICAgICAgICAgIFxleHAoIFxmcmFje2EteH17Yn0gLSBcZXhwKFxmcmFje2EteH17Yn0pKSAKKyAgICogQGZdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19hID0gX1JlYWxUeXBlKDApLAorCQkgICBfUmVhbFR5cGUgX19iID0gX1JlYWxUeXBlKDEpKQorCTogX01fYShfX2EpLCBfTV9iKF9fYikKKwl7IH0KKworCV9SZWFsVHlwZQorCWEoKSBjb25zdAorCXsgcmV0dXJuIF9NX2E7IH0KKworCV9SZWFsVHlwZQorCWIoKSBjb25zdAorCXsgcmV0dXJuIF9NX2I7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fYSA9PSBfX3AyLl9NX2EgJiYgX19wMS5fTV9iID09IF9fcDIuX01fYjsgfQorCisgICAgICBwcml2YXRlOgorCV9SZWFsVHlwZSBfTV9hOworCV9SZWFsVHlwZSBfTV9iOworICAgICAgfTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uKF9SZWFsVHlwZSBfX2EgPSBfUmVhbFR5cGUoMCksCisJCQkJIF9SZWFsVHlwZSBfX2IgPSBfUmVhbFR5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fYSwgX19iKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0aGUgQGYkYUBmJCBwYXJhbWV0ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmEoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdGhlIEBmJGJAZiQgcGFyYW1ldGVyIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgYigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5iKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Omxvd2VzdCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBleHRyZW1lIHZhbHVlIGRpc3RyaWJ1dGlvbnMgaGF2ZSB0aGUgc2FtZQorICAgICAgICogICAgICAgIHBhcmFtZXRlcnMuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24mIF9fZDIpCisgICAgICB7IHJldHVybiBfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW07IH0KKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgLyoqCisgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGV4dHJlbWUgdmFsdWUgZGlzdHJpYnV0aW9ucyBoYXZlIGRpZmZlcmVudAorICAgICogICAgICAgIHBhcmFtZXRlcnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6ZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgKgorICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194ICBBICVleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAqIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3Qgc3RkOjpleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpOworCisgIC8qKgorICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgKiAgICAgICAgZGlzdHJpYnV0aW9uIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICoKKyAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194IEEgJWV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHN0ZDo6ZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KTsKKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBkaXNjcmV0ZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgZGlzY3JldGUgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcworICAgKgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUgPSBpbnQ+CisgICAgY2xhc3MgZGlzY3JldGVfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2ludGVncmFsPF9JbnRUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGFuIGludGVncmFsIHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX0ludFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKwlmcmllbmQgY2xhc3MgZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjsKKworCXBhcmFtX3R5cGUoKQorCTogX01fcHJvYigpLCBfTV9jcCgpCisJeyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwkgIHBhcmFtX3R5cGUoX0lucHV0SXRlcmF0b3IgX193YmVnaW4sCisJCSAgICAgX0lucHV0SXRlcmF0b3IgX193ZW5kKQorCSAgOiBfTV9wcm9iKF9fd2JlZ2luLCBfX3dlbmQpLCBfTV9jcCgpCisJICB7IF9NX2luaXRpYWxpemUoKTsgfQorCisJcGFyYW1fdHlwZShpbml0aWFsaXplcl9saXN0PGRvdWJsZT4gX193aWwpCisJOiBfTV9wcm9iKF9fd2lsLmJlZ2luKCksIF9fd2lsLmVuZCgpKSwgX01fY3AoKQorCXsgX01faW5pdGlhbGl6ZSgpOyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKwkgIHBhcmFtX3R5cGUoc2l6ZV90IF9fbncsIGRvdWJsZSBfX3htaW4sIGRvdWJsZSBfX3htYXgsCisJCSAgICAgX0Z1bmMgX19mdyk7CisKKwkvLyBTZWU6IGh0dHA6Ly9jcHAtbmV4dC5jb20vYXJjaGl2ZS8yMDEwLzEwL2ltcGxpY2l0LW1vdmUtbXVzdC1nby8KKwlwYXJhbV90eXBlKGNvbnN0IHBhcmFtX3R5cGUmKSA9IGRlZmF1bHQ7CisJcGFyYW1fdHlwZSYgb3BlcmF0b3I9KGNvbnN0IHBhcmFtX3R5cGUmKSA9IGRlZmF1bHQ7CisKKwlzdGQ6OnZlY3Rvcjxkb3VibGU+CisJcHJvYmFiaWxpdGllcygpIGNvbnN0CisJeyByZXR1cm4gX01fcHJvYi5lbXB0eSgpID8gc3RkOjp2ZWN0b3I8ZG91YmxlPigxLCAxLjApIDogX01fcHJvYjsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9wcm9iID09IF9fcDIuX01fcHJvYjsgfQorCisgICAgICBwcml2YXRlOgorCXZvaWQKKwlfTV9pbml0aWFsaXplKCk7CisKKwlzdGQ6OnZlY3Rvcjxkb3VibGU+IF9NX3Byb2I7CisJc3RkOjp2ZWN0b3I8ZG91YmxlPiBfTV9jcDsKKyAgICAgIH07CisKKyAgICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbigpCisgICAgICA6IF9NX3BhcmFtKCkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwlkaXNjcmV0ZV9kaXN0cmlidXRpb24oX0lucHV0SXRlcmF0b3IgX193YmVnaW4sCisJCQkgICAgICBfSW5wdXRJdGVyYXRvciBfX3dlbmQpCisJOiBfTV9wYXJhbShfX3diZWdpbiwgX193ZW5kKQorCXsgfQorCisgICAgICBkaXNjcmV0ZV9kaXN0cmlidXRpb24oaW5pdGlhbGl6ZXJfbGlzdDxkb3VibGU+IF9fd2wpCisgICAgICA6IF9NX3BhcmFtKF9fd2wpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmM+CisJZGlzY3JldGVfZGlzdHJpYnV0aW9uKHNpemVfdCBfX253LCBkb3VibGUgX194bWluLCBkb3VibGUgX194bWF4LAorCQkJICAgICAgX0Z1bmMgX19mdykKKwk6IF9NX3BhcmFtKF9fbncsIF9feG1pbiwgX194bWF4LCBfX2Z3KQorCXsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgZGlzY3JldGVfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcHJvYmFiaWxpdGllcyBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+CisgICAgICBwcm9iYWJpbGl0aWVzKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX01fcGFyYW0uX01fcHJvYi5lbXB0eSgpCisJICA/IHN0ZDo6dmVjdG9yPGRvdWJsZT4oMSwgMS4wKSA6IF9NX3BhcmFtLl9NX3Byb2I7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJlc3VsdF90eXBlKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeworCXJldHVybiBfTV9wYXJhbS5fTV9wcm9iLmVtcHR5KCkKKwkgID8gcmVzdWx0X3R5cGUoMCkgOiByZXN1bHRfdHlwZShfTV9wYXJhbS5fTV9wcm9iLnNpemUoKSAtIDEpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gZGlzY3JldGUgZGlzdHJpYnV0aW9ucyBoYXZlIHRoZSBzYW1lCisgICAgICAgKiAgICAgICAgcGFyYW1ldGVycy4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgZGlzY3JldGVfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgZGlzY3JldGVfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlZGlzY3JldGVfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVkaXNjcmV0ZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHN0ZDo6ZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJWRpc2NyZXRlX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggQSAlZGlzY3JldGVfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvcgorICAgICAgICogICAgICAgICAgc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdGQ6OmRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisgICAgfTsKKworICAvKioKKyAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gZGlzY3JldGUgZGlzdHJpYnV0aW9ucyBoYXZlIGRpZmZlcmVudAorICAgICogICAgICAgIHBhcmFtZXRlcnMuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6ZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpkaXNjcmV0ZV9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgcGllY2V3aXNlIGNvbnN0YW50IHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMKKyAgICoKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKwlmcmllbmQgY2xhc3MgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OworCisJcGFyYW1fdHlwZSgpCisJOiBfTV9pbnQoKSwgX01fZGVuKCksIF9NX2NwKCkKKwl7IH0KKworCXRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yQiwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3JXPgorCSAgcGFyYW1fdHlwZShfSW5wdXRJdGVyYXRvckIgX19iZmlyc3QsCisJCSAgICAgX0lucHV0SXRlcmF0b3JCIF9fYmVuZCwKKwkJICAgICBfSW5wdXRJdGVyYXRvclcgX193YmVnaW4pOworCisJdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmM+CisJICBwYXJhbV90eXBlKGluaXRpYWxpemVyX2xpc3Q8X1JlYWxUeXBlPiBfX2JpLCBfRnVuYyBfX2Z3KTsKKworCXRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorCSAgcGFyYW1fdHlwZShzaXplX3QgX19udywgX1JlYWxUeXBlIF9feG1pbiwgX1JlYWxUeXBlIF9feG1heCwKKwkJICAgICBfRnVuYyBfX2Z3KTsKKworCS8vIFNlZTogaHR0cDovL2NwcC1uZXh0LmNvbS9hcmNoaXZlLzIwMTAvMTAvaW1wbGljaXQtbW92ZS1tdXN0LWdvLworCXBhcmFtX3R5cGUoY29uc3QgcGFyYW1fdHlwZSYpID0gZGVmYXVsdDsKKwlwYXJhbV90eXBlJiBvcGVyYXRvcj0oY29uc3QgcGFyYW1fdHlwZSYpID0gZGVmYXVsdDsKKworCXN0ZDo6dmVjdG9yPF9SZWFsVHlwZT4KKwlpbnRlcnZhbHMoKSBjb25zdAorCXsKKwkgIGlmIChfTV9pbnQuZW1wdHkoKSkKKwkgICAgeworCSAgICAgIHN0ZDo6dmVjdG9yPF9SZWFsVHlwZT4gX190bXAoMik7CisJICAgICAgX190bXBbMV0gPSBfUmVhbFR5cGUoMSk7CisJICAgICAgcmV0dXJuIF9fdG1wOworCSAgICB9CisJICBlbHNlCisJICAgIHJldHVybiBfTV9pbnQ7CisJfQorCisJc3RkOjp2ZWN0b3I8ZG91YmxlPgorCWRlbnNpdGllcygpIGNvbnN0CisJeyByZXR1cm4gX01fZGVuLmVtcHR5KCkgPyBzdGQ6OnZlY3Rvcjxkb3VibGU+KDEsIDEuMCkgOiBfTV9kZW47IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01faW50ID09IF9fcDIuX01faW50ICYmIF9fcDEuX01fZGVuID09IF9fcDIuX01fZGVuOyB9CisKKyAgICAgIHByaXZhdGU6CisJdm9pZAorCV9NX2luaXRpYWxpemUoKTsKKworCXN0ZDo6dmVjdG9yPF9SZWFsVHlwZT4gX01faW50OworCXN0ZDo6dmVjdG9yPGRvdWJsZT4gX01fZGVuOworCXN0ZDo6dmVjdG9yPGRvdWJsZT4gX01fY3A7CisgICAgICB9OworCisgICAgICBleHBsaWNpdAorICAgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbigpCisgICAgICA6IF9NX3BhcmFtKCkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvckIsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yVz4KKwlwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uKF9JbnB1dEl0ZXJhdG9yQiBfX2JmaXJzdCwKKwkJCQkJX0lucHV0SXRlcmF0b3JCIF9fYmVuZCwKKwkJCQkJX0lucHV0SXRlcmF0b3JXIF9fd2JlZ2luKQorCTogX01fcGFyYW0oX19iZmlyc3QsIF9fYmVuZCwgX193YmVnaW4pCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorCXBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb24oaW5pdGlhbGl6ZXJfbGlzdDxfUmVhbFR5cGU+IF9fYmwsCisJCQkJCV9GdW5jIF9fZncpCisJOiBfTV9wYXJhbShfX2JsLCBfX2Z3KQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKwlwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uKHNpemVfdCBfX253LAorCQkJCQlfUmVhbFR5cGUgX194bWluLCBfUmVhbFR5cGUgX194bWF4LAorCQkJCQlfRnVuYyBfX2Z3KQorCTogX01fcGFyYW0oX19udywgX194bWluLCBfX3htYXgsIF9fZncpCisJeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyBhIHZlY3RvciBvZiB0aGUgaW50ZXJ2YWxzLgorICAgICAgICovCisgICAgICBzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+CisgICAgICBpbnRlcnZhbHMoKSBjb25zdAorICAgICAgeworCWlmIChfTV9wYXJhbS5fTV9pbnQuZW1wdHkoKSkKKwkgIHsKKwkgICAgc3RkOjp2ZWN0b3I8X1JlYWxUeXBlPiBfX3RtcCgyKTsKKwkgICAgX190bXBbMV0gPSBfUmVhbFR5cGUoMSk7CisJICAgIHJldHVybiBfX3RtcDsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gX01fcGFyYW0uX01faW50OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIGEgdmVjdG9yIG9mIHRoZSBwcm9iYWJpbGl0eSBkZW5zaXRpZXMuCisgICAgICAgKi8KKyAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4KKyAgICAgIGRlbnNpdGllcygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9NX3BhcmFtLl9NX2Rlbi5lbXB0eSgpCisJICA/IHN0ZDo6dmVjdG9yPGRvdWJsZT4oMSwgMS4wKSA6IF9NX3BhcmFtLl9NX2RlbjsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeworCXJldHVybiBfTV9wYXJhbS5fTV9pbnQuZW1wdHkoKQorCSAgPyByZXN1bHRfdHlwZSgwKSA6IF9NX3BhcmFtLl9NX2ludC5mcm9udCgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX01fcGFyYW0uX01faW50LmVtcHR5KCkKKwkgID8gcmVzdWx0X3R5cGUoMSkgOiBfTV9wYXJhbS5fTV9pbnQuYmFjaygpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gcGllY2V3aXNlIGNvbnN0YW50IGRpc3RyaWJ1dGlvbnMgaGF2ZSB0aGUKKyAgICAgICAqICAgICAgICBzYW1lIHBhcmFtZXRlcnMuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlcGllY2V3aXNlX2NvbnN0YW5fZGlzdHJpYnV0aW9uIHJhbmRvbQorICAgICAgICogICAgICAgIG51bWJlciBkaXN0cmlidXRpb24gQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlcGllY2V3aXNlX2NvbnN0YW5fZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHN0ZDo6cGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlcGllY2V3aXNlX2NvbnN0YW5fZGlzdHJpYnV0aW9uIHJhbmRvbQorICAgICAgICogICAgICAgIG51bWJlciBkaXN0cmlidXRpb24gQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggQSAlcGllY2V3aXNlX2NvbnN0YW5fZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvcgorICAgICAgICogICAgICAgICAgc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisgICAgfTsKKworICAvKioKKyAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gcGllY2V3aXNlIGNvbnN0YW50IGRpc3RyaWJ1dGlvbnMgaGF2ZSAKKyAgICAqICAgICAgICBkaWZmZXJlbnQgcGFyYW1ldGVycy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6cGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIHBpZWNld2lzZSBsaW5lYXIgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcworICAgKgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisJZnJpZW5kIGNsYXNzIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT47CisKKwlwYXJhbV90eXBlKCkKKwk6IF9NX2ludCgpLCBfTV9kZW4oKSwgX01fY3AoKSwgX01fbSgpCisJeyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvckIsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yVz4KKwkgIHBhcmFtX3R5cGUoX0lucHV0SXRlcmF0b3JCIF9fYmZpcnN0LAorCQkgICAgIF9JbnB1dEl0ZXJhdG9yQiBfX2JlbmQsCisJCSAgICAgX0lucHV0SXRlcmF0b3JXIF9fd2JlZ2luKTsKKworCXRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorCSAgcGFyYW1fdHlwZShpbml0aWFsaXplcl9saXN0PF9SZWFsVHlwZT4gX19ibCwgX0Z1bmMgX19mdyk7CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKwkgIHBhcmFtX3R5cGUoc2l6ZV90IF9fbncsIF9SZWFsVHlwZSBfX3htaW4sIF9SZWFsVHlwZSBfX3htYXgsCisJCSAgICAgX0Z1bmMgX19mdyk7CisKKwkvLyBTZWU6IGh0dHA6Ly9jcHAtbmV4dC5jb20vYXJjaGl2ZS8yMDEwLzEwL2ltcGxpY2l0LW1vdmUtbXVzdC1nby8KKwlwYXJhbV90eXBlKGNvbnN0IHBhcmFtX3R5cGUmKSA9IGRlZmF1bHQ7CisJcGFyYW1fdHlwZSYgb3BlcmF0b3I9KGNvbnN0IHBhcmFtX3R5cGUmKSA9IGRlZmF1bHQ7CisKKwlzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+CisJaW50ZXJ2YWxzKCkgY29uc3QKKwl7CisJICBpZiAoX01faW50LmVtcHR5KCkpCisJICAgIHsKKwkgICAgICBzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+IF9fdG1wKDIpOworCSAgICAgIF9fdG1wWzFdID0gX1JlYWxUeXBlKDEpOworCSAgICAgIHJldHVybiBfX3RtcDsKKwkgICAgfQorCSAgZWxzZQorCSAgICByZXR1cm4gX01faW50OworCX0KKworCXN0ZDo6dmVjdG9yPGRvdWJsZT4KKwlkZW5zaXRpZXMoKSBjb25zdAorCXsgcmV0dXJuIF9NX2Rlbi5lbXB0eSgpID8gc3RkOjp2ZWN0b3I8ZG91YmxlPigyLCAxLjApIDogX01fZGVuOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiAoX19wMS5fTV9pbnQgPT0gX19wMi5fTV9pbnQKKwkJICAmJiBfX3AxLl9NX2RlbiA9PSBfX3AyLl9NX2Rlbik7IH0KKworICAgICAgcHJpdmF0ZToKKwl2b2lkCisJX01faW5pdGlhbGl6ZSgpOworCisJc3RkOjp2ZWN0b3I8X1JlYWxUeXBlPiBfTV9pbnQ7CisJc3RkOjp2ZWN0b3I8ZG91YmxlPiBfTV9kZW47CisJc3RkOjp2ZWN0b3I8ZG91YmxlPiBfTV9jcDsKKwlzdGQ6OnZlY3Rvcjxkb3VibGU+IF9NX207CisgICAgICB9OworCisgICAgICBleHBsaWNpdAorICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24oKQorICAgICAgOiBfTV9wYXJhbSgpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3JCLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvclc+CisJcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24oX0lucHV0SXRlcmF0b3JCIF9fYmZpcnN0LAorCQkJCSAgICAgIF9JbnB1dEl0ZXJhdG9yQiBfX2JlbmQsCisJCQkJICAgICAgX0lucHV0SXRlcmF0b3JXIF9fd2JlZ2luKQorCTogX01fcGFyYW0oX19iZmlyc3QsIF9fYmVuZCwgX193YmVnaW4pCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorCXBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uKGluaXRpYWxpemVyX2xpc3Q8X1JlYWxUeXBlPiBfX2JsLAorCQkJCSAgICAgIF9GdW5jIF9fZncpCisJOiBfTV9wYXJhbShfX2JsLCBfX2Z3KQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKwlwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbihzaXplX3QgX19udywKKwkJCQkgICAgICBfUmVhbFR5cGUgX194bWluLCBfUmVhbFR5cGUgX194bWF4LAorCQkJCSAgICAgIF9GdW5jIF9fZncpCisJOiBfTV9wYXJhbShfX253LCBfX3htaW4sIF9feG1heCwgX19mdykKKwl7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdGhlIGludGVydmFscyBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+CisgICAgICBpbnRlcnZhbHMoKSBjb25zdAorICAgICAgeworCWlmIChfTV9wYXJhbS5fTV9pbnQuZW1wdHkoKSkKKwkgIHsKKwkgICAgc3RkOjp2ZWN0b3I8X1JlYWxUeXBlPiBfX3RtcCgyKTsKKwkgICAgX190bXBbMV0gPSBfUmVhbFR5cGUoMSk7CisJICAgIHJldHVybiBfX3RtcDsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gX01fcGFyYW0uX01faW50OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gYSB2ZWN0b3Igb2YgdGhlIHByb2JhYmlsaXR5IGRlbnNpdGllcyBvZiB0aGUKKyAgICAgICAqICAgICAgICBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4KKyAgICAgIGRlbnNpdGllcygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9NX3BhcmFtLl9NX2Rlbi5lbXB0eSgpCisJICA/IHN0ZDo6dmVjdG9yPGRvdWJsZT4oMiwgMS4wKSA6IF9NX3BhcmFtLl9NX2RlbjsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeworCXJldHVybiBfTV9wYXJhbS5fTV9pbnQuZW1wdHkoKQorCSAgPyByZXN1bHRfdHlwZSgwKSA6IF9NX3BhcmFtLl9NX2ludC5mcm9udCgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX01fcGFyYW0uX01faW50LmVtcHR5KCkKKwkgID8gcmVzdWx0X3R5cGUoMSkgOiBfTV9wYXJhbS5fTV9pbnQuYmFjaygpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gcGllY2V3aXNlIGxpbmVhciBkaXN0cmlidXRpb25zIGhhdmUgdGhlCisgICAgICAgKiAgICAgICAgc2FtZSBwYXJhbWV0ZXJzLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgIGRpc3RyaWJ1dGlvbiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgICBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiAgICAgICAgICBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdGQ6OnBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgZGlzdHJpYnV0aW9uIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yCisgICAgICAgKiAgICAgICAgICBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdGQ6OnBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisgICAgfTsKKworICAvKioKKyAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gcGllY2V3aXNlIGxpbmVhciBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAqICAgICAgICBkaWZmZXJlbnQgcGFyYW1ldGVycy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OnBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKiBAfSAqLyAvLyBncm91cCByYW5kb21fZGlzdHJpYnV0aW9uc19wb2lzc29uCisKKyAgLyogQH0gKi8gLy8gZ3JvdXAgcmFuZG9tX2Rpc3RyaWJ1dGlvbnMKKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgcmFuZG9tX3V0aWxpdGllcyBSYW5kb20gTnVtYmVyIFV0aWxpdGllcworICAgKiBAaW5ncm91cCByYW5kb20KKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIEBicmllZiBUaGUgc2VlZF9zZXEgY2xhc3MgZ2VuZXJhdGVzIHNlcXVlbmNlcyBvZiBzZWVkcyBmb3IgcmFuZG9tCisgICAqICAgICAgICBudW1iZXIgZ2VuZXJhdG9ycy4KKyAgICovCisgIGNsYXNzIHNlZWRfc2VxCisgIHsKKworICBwdWJsaWM6CisgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBzZWVkIHZhbGVzLiAqLworICAgIHR5cGVkZWYgdWludF9sZWFzdDMyX3QgcmVzdWx0X3R5cGU7CisKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KKyAgICBzZWVkX3NlcSgpCisgICAgOiBfTV92KCkKKyAgICB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgICAgc2VlZF9zZXEoc3RkOjppbml0aWFsaXplcl9saXN0PF9JbnRUeXBlPiBpbCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHNlZWRfc2VxKF9JbnB1dEl0ZXJhdG9yIF9fYmVnaW4sIF9JbnB1dEl0ZXJhdG9yIF9fZW5kKTsKKworICAgIC8vIGdlbmVyYXRpbmcgZnVuY3Rpb25zCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgZ2VuZXJhdGUoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fYmVnaW4sIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2VuZCk7CisKKyAgICAvLyBwcm9wZXJ0eSBmdW5jdGlvbnMKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fdi5zaXplKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE91dHB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgcGFyYW0oT3V0cHV0SXRlcmF0b3IgX19kZXN0KSBjb25zdAorICAgICAgeyBzdGQ6OmNvcHkoX01fdi5iZWdpbigpLCBfTV92LmVuZCgpLCBfX2Rlc3QpOyB9CisKKyAgcHJpdmF0ZToKKyAgICAvLy8KKyAgICBzdGQ6OnZlY3RvcjxyZXN1bHRfdHlwZT4gX01fdjsKKyAgfTsKKworICAvKiBAfSAqLyAvLyBncm91cCByYW5kb21fdXRpbGl0aWVzCisKKyAgLyogQH0gKi8gLy8gZ3JvdXAgcmFuZG9tCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JhbmRvbS50Y2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmFuZG9tLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGM2NTUwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JhbmRvbS50Y2MKQEAgLTAsMCArMSwzNDg2IEBACisvLyByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gKG91dCBvZiBsaW5lKSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9yYW5kb20udGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7cmFuZG9tfQorICovCisKKyNpZm5kZWYgX1JBTkRPTV9UQ0MKKyNkZWZpbmUgX1JBTkRPTV9UQ0MgMQorCisjaW5jbHVkZSA8bnVtZXJpYz4gLy8gc3RkOjphY2N1bXVsYXRlIGFuZCBzdGQ6OnBhcnRpYWxfc3VtCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworICAvKgorICAgKiAoRnVydGhlcikgaW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgICovCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvLyBHZW5lcmFsIGNhc2UgZm9yIHggPSAoYXggKyBjKSBtb2QgbSAtLSB1c2UgU2NocmFnZSdzIGFsZ29yaXRobQorICAgIC8vIHRvIGF2b2lkIGludGVnZXIgb3ZlcmZsb3cuCisgICAgLy8KKyAgICAvLyBQcmVjb25kaXRpb25zOiAgYSA+IDAsIG0gPiAwLgorICAgIC8vCisgICAgLy8gTm90ZTogb25seSB3b3JrcyBjb3JyZWN0bHkgZm9yIF9fbSAlIF9fYSA8IF9fbSAvIF9fYS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9UcCBfX20sIF9UcCBfX2EsIF9UcCBfX2M+CisgICAgICBfVHAKKyAgICAgIF9Nb2Q8X1RwLCBfX20sIF9fYSwgX19jLCBmYWxzZSwgdHJ1ZT46OgorICAgICAgX19jYWxjKF9UcCBfX3gpCisgICAgICB7CisJaWYgKF9fYSA9PSAxKQorCSAgX194ICU9IF9fbTsKKwllbHNlCisJICB7CisJICAgIHN0YXRpYyBjb25zdCBfVHAgX19xID0gX19tIC8gX19hOworCSAgICBzdGF0aWMgY29uc3QgX1RwIF9fciA9IF9fbSAlIF9fYTsKKworCSAgICBfVHAgX190MSA9IF9fYSAqIChfX3ggJSBfX3EpOworCSAgICBfVHAgX190MiA9IF9fciAqIChfX3ggLyBfX3EpOworCSAgICBpZiAoX190MSA+PSBfX3QyKQorCSAgICAgIF9feCA9IF9fdDEgLSBfX3QyOworCSAgICBlbHNlCisJICAgICAgX194ID0gX19tIC0gX190MiArIF9fdDE7CisJICB9CisKKwlpZiAoX19jICE9IDApCisJICB7CisJICAgIGNvbnN0IF9UcCBfX2QgPSBfX20gLSBfX3g7CisJICAgIGlmIChfX2QgPiBfX2MpCisJICAgICAgX194ICs9IF9fYzsKKwkgICAgZWxzZQorCSAgICAgIF9feCA9IF9fYyAtIF9fZDsKKwkgIH0KKwlyZXR1cm4gX194OworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9UcD4KKyAgICAgIF9PdXRwdXRJdGVyYXRvcgorICAgICAgX19ub3JtYWxpemUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgY29uc3QgX1RwJiBfX2ZhY3RvcikKKyAgICAgIHsKKwlmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX3Jlc3VsdCkKKwkgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0IC8gX19mYWN0b3I7CisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICBjb25zdGV4cHIgX1VJbnRUeXBlCisgICAgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPjo6bXVsdGlwbGllcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgY29uc3RleHByIF9VSW50VHlwZQorICAgIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46OmluY3JlbWVudDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgY29uc3RleHByIF9VSW50VHlwZQorICAgIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46Om1vZHVsdXM7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIGNvbnN0ZXhwciBfVUludFR5cGUKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjpkZWZhdWx0X3NlZWQ7CisKKyAgLyoqCisgICAqIFNlZWRzIHRoZSBMQ1Igd2l0aCBpbnRlZ3JhbCB2YWx1ZSBAcCBfX3MsIGFkanVzdGVkIHNvIHRoYXQgdGhlCisgICAqIHJpbmcgaWRlbnRpdHkgaXMgbmV2ZXIgYSBtZW1iZXIgb2YgdGhlIGNvbnZlcmdlbmNlIHNldC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICB2b2lkCisgICAgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPjo6CisgICAgc2VlZChyZXN1bHRfdHlwZSBfX3MpCisgICAgeworICAgICAgaWYgKChfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLCBfX20+KF9fYykgPT0gMCkKKwkgICYmIChfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLCBfX20+KF9fcykgPT0gMCkpCisJX01feCA9IDE7CisgICAgICBlbHNlCisJX01feCA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIF9fbT4oX19zKTsKKyAgICB9CisKKyAgLyoqCisgICAqIFNlZWRzIHRoZSBMQ1IgZW5naW5lIHdpdGggYSB2YWx1ZSBnZW5lcmF0ZWQgYnkgQHAgX19xLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Tc2VxPgorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jbGFzczxfU3NlcT46OnZhbHVlPjo6dHlwZQorICAgICAgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPjo6CisgICAgICBzZWVkKF9Tc2VxJiBfX3EpCisgICAgICB7CisJY29uc3QgX1VJbnRUeXBlIF9fazAgPSBfX20gPT0gMCA/IHN0ZDo6bnVtZXJpY19saW1pdHM8X1VJbnRUeXBlPjo6ZGlnaXRzCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0ZDo6X19sZyhfX20pOworCWNvbnN0IF9VSW50VHlwZSBfX2sgPSAoX19rMCArIDMxKSAvIDMyOworCXVpbnRfbGVhc3QzMl90IF9fYXJyW19fayArIDNdOworCV9fcS5nZW5lcmF0ZShfX2FyciArIDAsIF9fYXJyICsgX19rICsgMyk7CisJX1VJbnRUeXBlIF9fZmFjdG9yID0gMXU7CisJX1VJbnRUeXBlIF9fc3VtID0gMHU7CisJZm9yIChzaXplX3QgX19qID0gMDsgX19qIDwgX19rOyArK19faikKKwkgIHsKKwkgICAgX19zdW0gKz0gX19hcnJbX19qICsgM10gKiBfX2ZhY3RvcjsKKwkgICAgX19mYWN0b3IgKj0gX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIDMyPjo6X192YWx1ZTsKKwkgIH0KKwlzZWVkKF9fc3VtKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20sCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZSwKKwkJCQkJCV9fYSwgX19jLCBfX20+JiBfX2xjcikKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OmZpeGVkIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19vcy53aWRlbignICcpKTsKKworICAgICAgX19vcyA8PCBfX2xjci5fTV94OworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+JiBfX2xjcikKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyk7CisKKyAgICAgIF9faXMgPj4gX19sY3IuX01feDsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6d29yZF9zaXplOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6c3RhdGVfc2l6ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OnNoaWZ0X3NpemU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIHNpemVfdAorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjptYXNrX2JpdHM7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIF9VSW50VHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+Ojp4b3JfbWFzazsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OnRlbXBlcmluZ191OworICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBfVUludFR5cGUKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6dGVtcGVyaW5nX2Q7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIHNpemVfdAorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+Ojp0ZW1wZXJpbmdfczsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgX1VJbnRUeXBlCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OnRlbXBlcmluZ19iOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6dGVtcGVyaW5nX3Q7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIF9VSW50VHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+Ojp0ZW1wZXJpbmdfYzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OnRlbXBlcmluZ19sOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBfVUludFR5cGUKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25fbXVsdGlwbGllcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgX1VJbnRUeXBlCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OmRlZmF1bHRfc2VlZDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICB2b2lkCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OgorICAgIHNlZWQocmVzdWx0X3R5cGUgX19zZCkKKyAgICB7CisgICAgICBfTV94WzBdID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwKKwlfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZT4oX19zZCk7CisKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDE7IF9faSA8IHN0YXRlX3NpemU7ICsrX19pKQorCXsKKwkgIF9VSW50VHlwZSBfX3ggPSBfTV94W19faSAtIDFdOworCSAgX194IF49IF9feCA+PiAoX193IC0gMik7CisJICBfX3ggKj0gX19mOworCSAgX194ICs9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIF9fbj4oX19pKTsKKwkgIF9NX3hbX19pXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsCisJICAgIF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlPihfX3gpOworCX0KKyAgICAgIF9NX3AgPSBzdGF0ZV9zaXplOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcT4KKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY2xhc3M8X1NzZXE+Ojp2YWx1ZT46OnR5cGUKKyAgICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OgorICAgICAgc2VlZChfU3NlcSYgX19xKQorICAgICAgeworCWNvbnN0IF9VSW50VHlwZSBfX3VwcGVyX21hc2sgPSAofl9VSW50VHlwZSgpKSA8PCBfX3I7CisJY29uc3Qgc2l6ZV90IF9fayA9IChfX3cgKyAzMSkgLyAzMjsKKwl1aW50X2xlYXN0MzJfdCBfX2FycltfX24gKiBfX2tdOworCV9fcS5nZW5lcmF0ZShfX2FyciArIDAsIF9fYXJyICsgX19uICogX19rKTsKKworCWJvb2wgX196ZXJvID0gdHJ1ZTsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBzdGF0ZV9zaXplOyArK19faSkKKwkgIHsKKwkgICAgX1VJbnRUeXBlIF9fZmFjdG9yID0gMXU7CisJICAgIF9VSW50VHlwZSBfX3N1bSA9IDB1OworCSAgICBmb3IgKHNpemVfdCBfX2ogPSAwOyBfX2ogPCBfX2s7ICsrX19qKQorCSAgICAgIHsKKwkJX19zdW0gKz0gX19hcnJbX19rICogX19pICsgX19qXSAqIF9fZmFjdG9yOworCQlfX2ZhY3RvciAqPSBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgMzI+OjpfX3ZhbHVlOworCSAgICAgIH0KKwkgICAgX01feFtfX2ldID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwKKwkgICAgICBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZT4oX19zdW0pOworCisJICAgIGlmIChfX3plcm8pCisJICAgICAgeworCQlpZiAoX19pID09IDApCisJCSAgeworCQkgICAgaWYgKChfTV94WzBdICYgX191cHBlcl9tYXNrKSAhPSAwdSkKKwkJICAgICAgX196ZXJvID0gZmFsc2U7CisJCSAgfQorCQllbHNlIGlmIChfTV94W19faV0gIT0gMHUpCisJCSAgX196ZXJvID0gZmFsc2U7CisJICAgICAgfQorCSAgfQorICAgICAgICBpZiAoX196ZXJvKQorICAgICAgICAgIF9NX3hbMF0gPSBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193IC0gMT46Ol9fdmFsdWU7CisJX01fcCA9IHN0YXRlX3NpemU7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LAorCSAgIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgdm9pZAorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjoKKyAgICBfTV9nZW5fcmFuZCh2b2lkKQorICAgIHsKKyAgICAgIGNvbnN0IF9VSW50VHlwZSBfX3VwcGVyX21hc2sgPSAofl9VSW50VHlwZSgpKSA8PCBfX3I7CisgICAgICBjb25zdCBfVUludFR5cGUgX19sb3dlcl9tYXNrID0gfl9fdXBwZXJfbWFzazsKKworICAgICAgZm9yIChzaXplX3QgX19rID0gMDsgX19rIDwgKF9fbiAtIF9fbSk7ICsrX19rKQorICAgICAgICB7CisJICBfVUludFR5cGUgX195ID0gKChfTV94W19fa10gJiBfX3VwcGVyX21hc2spCisJCQkgICB8IChfTV94W19fayArIDFdICYgX19sb3dlcl9tYXNrKSk7CisJICBfTV94W19fa10gPSAoX01feFtfX2sgKyBfX21dIF4gKF9feSA+PiAxKQorCQkgICAgICAgXiAoKF9feSAmIDB4MDEpID8gX19hIDogMCkpOworICAgICAgICB9CisKKyAgICAgIGZvciAoc2l6ZV90IF9fayA9IChfX24gLSBfX20pOyBfX2sgPCAoX19uIC0gMSk7ICsrX19rKQorCXsKKwkgIF9VSW50VHlwZSBfX3kgPSAoKF9NX3hbX19rXSAmIF9fdXBwZXJfbWFzaykKKwkJCSAgIHwgKF9NX3hbX19rICsgMV0gJiBfX2xvd2VyX21hc2spKTsKKwkgIF9NX3hbX19rXSA9IChfTV94W19fayArIChfX20gLSBfX24pXSBeIChfX3kgPj4gMSkKKwkJICAgICAgIF4gKChfX3kgJiAweDAxKSA/IF9fYSA6IDApKTsKKwl9CisKKyAgICAgIF9VSW50VHlwZSBfX3kgPSAoKF9NX3hbX19uIC0gMV0gJiBfX3VwcGVyX21hc2spCisJCSAgICAgICB8IChfTV94WzBdICYgX19sb3dlcl9tYXNrKSk7CisgICAgICBfTV94W19fbiAtIDFdID0gKF9NX3hbX19tIC0gMV0gXiAoX195ID4+IDEpCisJCSAgICAgICBeICgoX195ICYgMHgwMSkgPyBfX2EgOiAwKSk7CisgICAgICBfTV9wID0gMDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LAorCSAgIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgdm9pZAorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjoKKyAgICBkaXNjYXJkKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3opCisgICAgeworICAgICAgd2hpbGUgKF9feiA+IHN0YXRlX3NpemUgLSBfTV9wKQorCXsKKwkgIF9feiAtPSBzdGF0ZV9zaXplIC0gX01fcDsKKwkgIF9NX2dlbl9yYW5kKCk7CisJfQorICAgICAgX01fcCArPSBfX3o7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywKKwkgICBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIHR5cGVuYW1lCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OnJlc3VsdF90eXBlCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIC8vIFJlbG9hZCB0aGUgdmVjdG9yIC0gY29zdCBpcyBPKG4pIGFtb3J0aXplZCBvdmVyIG4gY2FsbHMuCisgICAgICBpZiAoX01fcCA+PSBzdGF0ZV9zaXplKQorCV9NX2dlbl9yYW5kKCk7CisKKyAgICAgIC8vIENhbGN1bGF0ZSBvKHgoaSkpLgorICAgICAgcmVzdWx0X3R5cGUgX196ID0gX01feFtfTV9wKytdOworICAgICAgX196IF49IChfX3ogPj4gX191KSAmIF9fZDsKKyAgICAgIF9feiBePSAoX196IDw8IF9fcykgJiBfX2I7CisgICAgICBfX3ogXj0gKF9feiA8PCBfX3QpICYgX19jOworICAgICAgX196IF49IChfX3ogPj4gX19sKTsKKworICAgICAgcmV0dXJuIF9fejsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LAorCSAgIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2YsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sCisJICAgICAgIF9fciwgX19hLCBfX3UsIF9fZCwgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6Zml4ZWQgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwlfX29zIDw8IF9feC5fTV94W19faV0gPDwgX19zcGFjZTsKKyAgICAgIF9fb3MgPDwgX194Ll9NX3A7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csCisJICAgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZiwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwKKwkgICAgICAgX19yLCBfX2EsIF9fdSwgX19kLCBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwlfX2lzID4+IF9feC5fTV94W19faV07CisgICAgICBfX2lzID4+IF9feC5fTV9wOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19zLCBfX3I+Ojp3b3JkX3NpemU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19zLCBfX3I+OjpzaG9ydF9sYWc7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19zLCBfX3I+Ojpsb25nX2xhZzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+CisgICAgY29uc3RleHByIF9VSW50VHlwZQorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj46OmRlZmF1bHRfc2VlZDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+CisgICAgdm9pZAorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj46OgorICAgIHNlZWQocmVzdWx0X3R5cGUgX192YWx1ZSkKKyAgICB7CisgICAgICBzdGQ6OmxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPHJlc3VsdF90eXBlLCA0MDAxNHUsIDB1LCAyMTQ3NDgzNTYzdT4KKwlfX2xjZyhfX3ZhbHVlID09IDB1ID8gZGVmYXVsdF9zZWVkIDogX192YWx1ZSk7CisKKyAgICAgIGNvbnN0IHNpemVfdCBfX24gPSAoX193ICsgMzEpIC8gMzI7CisKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IGxvbmdfbGFnOyArK19faSkKKwl7CisJICBfVUludFR5cGUgX19zdW0gPSAwdTsKKwkgIF9VSW50VHlwZSBfX2ZhY3RvciA9IDF1OworCSAgZm9yIChzaXplX3QgX19qID0gMDsgX19qIDwgX19uOyArK19faikKKwkgICAgeworCSAgICAgIF9fc3VtICs9IF9fZGV0YWlsOjpfX21vZDx1aW50X2xlYXN0MzJfdCwKKwkJICAgICAgIF9fZGV0YWlsOjpfU2hpZnQ8dWludF9sZWFzdDMyX3QsIDMyPjo6X192YWx1ZT4KKwkJCSAoX19sY2coKSkgKiBfX2ZhY3RvcjsKKwkgICAgICBfX2ZhY3RvciAqPSBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgMzI+OjpfX3ZhbHVlOworCSAgICB9CisJICBfTV94W19faV0gPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLAorCSAgICBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZT4oX19zdW0pOworCX0KKyAgICAgIF9NX2NhcnJ5ID0gKF9NX3hbbG9uZ19sYWcgLSAxXSA9PSAwKSA/IDEgOiAwOworICAgICAgX01fcCA9IDA7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fcywgc2l6ZV90IF9fcj4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcT4KKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY2xhc3M8X1NzZXE+Ojp2YWx1ZT46OnR5cGUKKyAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj46OgorICAgICAgc2VlZChfU3NlcSYgX19xKQorICAgICAgeworCWNvbnN0IHNpemVfdCBfX2sgPSAoX193ICsgMzEpIC8gMzI7CisJdWludF9sZWFzdDMyX3QgX19hcnJbX19yICogX19rXTsKKwlfX3EuZ2VuZXJhdGUoX19hcnIgKyAwLCBfX2FyciArIF9fciAqIF9fayk7CisKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBsb25nX2xhZzsgKytfX2kpCisJICB7CisJICAgIF9VSW50VHlwZSBfX3N1bSA9IDB1OworCSAgICBfVUludFR5cGUgX19mYWN0b3IgPSAxdTsKKwkgICAgZm9yIChzaXplX3QgX19qID0gMDsgX19qIDwgX19rOyArK19faikKKwkgICAgICB7CisJCV9fc3VtICs9IF9fYXJyW19fayAqIF9faSArIF9fal0gKiBfX2ZhY3RvcjsKKwkJX19mYWN0b3IgKj0gX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIDMyPjo6X192YWx1ZTsKKwkgICAgICB9CisJICAgIF9NX3hbX19pXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsCisJICAgICAgX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWU+KF9fc3VtKTsKKwkgIH0KKwlfTV9jYXJyeSA9IChfTV94W2xvbmdfbGFnIC0gMV0gPT0gMCkgPyAxIDogMDsKKwlfTV9wID0gMDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+CisgICAgdHlwZW5hbWUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fcywgX19yPjo6CisJICAgICByZXN1bHRfdHlwZQorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIC8vIERlcml2ZSBzaG9ydCBsYWcgaW5kZXggZnJvbSBjdXJyZW50IGluZGV4LgorICAgICAgbG9uZyBfX3BzID0gX01fcCAtIHNob3J0X2xhZzsKKyAgICAgIGlmIChfX3BzIDwgMCkKKwlfX3BzICs9IGxvbmdfbGFnOworCisgICAgICAvLyBDYWxjdWxhdGUgbmV3IHgoaSkgd2l0aG91dCBvdmVyZmxvdyBvciBkaXZpc2lvbi4KKyAgICAgIC8vIE5COiBUaGFua3MgdG8gdGhlIHJlcXVpcmVtZW50cyBmb3IgX1VJbnRUeXBlLCBfTV94W19NX3BdICsgX01fY2FycnkKKyAgICAgIC8vIGNhbm5vdCBvdmVyZmxvdy4KKyAgICAgIF9VSW50VHlwZSBfX3hpOworICAgICAgaWYgKF9NX3hbX19wc10gPj0gX01feFtfTV9wXSArIF9NX2NhcnJ5KQorCXsKKwkgIF9feGkgPSBfTV94W19fcHNdIC0gX01feFtfTV9wXSAtIF9NX2NhcnJ5OworCSAgX01fY2FycnkgPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfX3hpID0gKF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlCisJCSAgLSBfTV94W19NX3BdIC0gX01fY2FycnkgKyBfTV94W19fcHNdKTsKKwkgIF9NX2NhcnJ5ID0gMTsKKwl9CisgICAgICBfTV94W19NX3BdID0gX194aTsKKworICAgICAgLy8gQWRqdXN0IGN1cnJlbnQgaW5kZXggdG8gbG9vcCBhcm91bmQgaW4gcmluZyBidWZmZXIuCisgICAgICBpZiAoKytfTV9wID49IGxvbmdfbGFnKQorCV9NX3AgPSAwOworCisgICAgICByZXR1cm4gX194aTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsCisJCQkJCQlfX3csIF9fcywgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZCB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3I7ICsrX19pKQorCV9fb3MgPDwgX194Ll9NX3hbX19pXSA8PCBfX3NwYWNlOworICAgICAgX19vcyA8PCBfX3guX01fY2FycnkgPDwgX19zcGFjZSA8PCBfX3guX01fcDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fcywgc2l6ZV90IF9fciwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fcywgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19yOyArK19faSkKKwlfX2lzID4+IF9feC5fTV94W19faV07CisgICAgICBfX2lzID4+IF9feC5fTV9jYXJyeTsKKyAgICAgIF9faXMgPj4gX194Ll9NX3A7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19wLCBzaXplX3QgX19yPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX3AsIF9fcj46OmJsb2NrX3NpemU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9fcCwgc2l6ZV90IF9fcj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgZGlzY2FyZF9ibG9ja19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwgX19wLCBfX3I+Ojp1c2VkX2Jsb2NrOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3AsIHNpemVfdCBfX3I+CisgICAgdHlwZW5hbWUgZGlzY2FyZF9ibG9ja19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwKKwkJCSAgIF9fcCwgX19yPjo6cmVzdWx0X3R5cGUKKyAgICBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX3AsIF9fcj46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIGlmIChfTV9uID49IHVzZWRfYmxvY2spCisJeworCSAgX01fYi5kaXNjYXJkKGJsb2NrX3NpemUgLSBfTV9uKTsKKwkgIF9NX24gPSAwOworCX0KKyAgICAgICsrX01fbjsKKyAgICAgIHJldHVybiBfTV9iKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3AsIHNpemVfdCBfX3IsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGRpc2NhcmRfYmxvY2tfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsCisJICAgICAgIF9fcCwgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZCB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBfX29zIDw8IF9feC5iYXNlKCkgPDwgX19zcGFjZSA8PCBfX3guX01fbjsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3AsIHNpemVfdCBfX3IsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGRpc2NhcmRfYmxvY2tfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsIF9fcCwgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX19pcyA+PiBfX3guX01fYiA+PiBfX3guX01fbjsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3csIHR5cGVuYW1lIF9VSW50VHlwZT4KKyAgICB0eXBlbmFtZSBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX3csIF9VSW50VHlwZT46OgorICAgICAgcmVzdWx0X3R5cGUKKyAgICBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX3csIF9VSW50VHlwZT46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZTo6cmVzdWx0X3R5cGUgX0VyZXN1bHRfdHlwZTsKKyAgICAgIGNvbnN0IF9FcmVzdWx0X3R5cGUgX19yCisJPSAoX01fYi5tYXgoKSAtIF9NX2IubWluKCkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9FcmVzdWx0X3R5cGU+OjptYXgoKQorCSAgID8gX01fYi5tYXgoKSAtIF9NX2IubWluKCkgKyAxIDogMCk7CisgICAgICBjb25zdCB1bnNpZ25lZCBfX2VkaWcgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9FcmVzdWx0X3R5cGU+OjpkaWdpdHM7CisgICAgICBjb25zdCB1bnNpZ25lZCBfX20gPSBfX3IgPyBzdGQ6Ol9fbGcoX19yKSA6IF9fZWRpZzsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbW1vbl90eXBlPF9FcmVzdWx0X3R5cGUsIHJlc3VsdF90eXBlPjo6dHlwZQorCV9fY3R5cGU7CisgICAgICBjb25zdCB1bnNpZ25lZCBfX2NkaWcgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9fY3R5cGU+OjpkaWdpdHM7CisKKyAgICAgIHVuc2lnbmVkIF9fbiwgX19uMDsKKyAgICAgIF9fY3R5cGUgX19zMCwgX19zMSwgX195MCwgX195MTsKKworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgMjsgKytfX2kpCisJeworCSAgX19uID0gKF9fdyArIF9fbSAtIDEpIC8gX19tICsgX19pOworCSAgX19uMCA9IF9fbiAtIF9fdyAlIF9fbjsKKwkgIGNvbnN0IHVuc2lnbmVkIF9fdzAgPSBfX3cgLyBfX247ICAvLyBfX3cwIDw9IF9fbQorCisJICBfX3MwID0gMDsKKwkgIF9fczEgPSAwOworCSAgaWYgKF9fdzAgPCBfX2NkaWcpCisJICAgIHsKKwkgICAgICBfX3MwID0gX19jdHlwZSgxKSA8PCBfX3cwOworCSAgICAgIF9fczEgPSBfX3MwIDw8IDE7CisJICAgIH0KKworCSAgX195MCA9IDA7CisJICBfX3kxID0gMDsKKwkgIGlmIChfX3IpCisJICAgIHsKKwkgICAgICBfX3kwID0gX19zMCAqIChfX3IgLyBfX3MwKTsKKwkgICAgICBpZiAoX19zMSkKKwkJX195MSA9IF9fczEgKiAoX19yIC8gX19zMSk7CisKKwkgICAgICBpZiAoX19yIC0gX195MCA8PSBfX3kwIC8gX19uKQorCQlicmVhazsKKwkgICAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisKKyAgICAgIHJlc3VsdF90eXBlIF9fc3VtID0gMDsKKyAgICAgIGZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9fbjA7ICsrX19rKQorCXsKKwkgIF9fY3R5cGUgX191OworCSAgZG8KKwkgICAgX191ID0gX01fYigpIC0gX01fYi5taW4oKTsKKwkgIHdoaWxlIChfX3kwICYmIF9fdSA+PSBfX3kwKTsKKwkgIF9fc3VtID0gX19zMCAqIF9fc3VtICsgKF9fczAgPyBfX3UgJSBfX3MwIDogX191KTsKKwl9CisgICAgICBmb3IgKHNpemVfdCBfX2sgPSBfX24wOyBfX2sgPCBfX247ICsrX19rKQorCXsKKwkgIF9fY3R5cGUgX191OworCSAgZG8KKwkgICAgX191ID0gX01fYigpIC0gX01fYi5taW4oKTsKKwkgIHdoaWxlIChfX3kxICYmIF9fdSA+PSBfX3kxKTsKKwkgIF9fc3VtID0gX19zMSAqIF9fc3VtICsgKF9fczEgPyBfX3UgJSBfX3MxIDogX191KTsKKwl9CisgICAgICByZXR1cm4gX19zdW07CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9faz4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgc2h1ZmZsZV9vcmRlcl9lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwgX19rPjo6dGFibGVfc2l6ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19rPgorICAgIHR5cGVuYW1lIHNodWZmbGVfb3JkZXJfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsIF9faz46OnJlc3VsdF90eXBlCisgICAgc2h1ZmZsZV9vcmRlcl9lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwgX19rPjo6CisgICAgb3BlcmF0b3IoKSgpCisgICAgeworICAgICAgc2l6ZV90IF9faiA9IF9fayAqICgoX01feSAtIF9NX2IubWluKCkpCisJCQkgIC8gKF9NX2IubWF4KCkgLSBfTV9iLm1pbigpICsgMS4wTCkpOworICAgICAgX01feSA9IF9NX3ZbX19qXTsKKyAgICAgIF9NX3ZbX19qXSA9IF9NX2IoKTsKKworICAgICAgcmV0dXJuIF9NX3k7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX2ssCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHNodWZmbGVfb3JkZXJfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsIF9faz4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6Zml4ZWQgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgX19vcyA8PCBfX3guYmFzZSgpOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19rOyArK19faSkKKwlfX29zIDw8IF9fc3BhY2UgPDwgX194Ll9NX3ZbX19pXTsKKyAgICAgIF9fb3MgPDwgX19zcGFjZSA8PCBfX3guX01feTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX2ssCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHNodWZmbGVfb3JkZXJfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsIF9faz4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9faXMgPj4gX194Ll9NX2I7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX2s7ICsrX19pKQorCV9faXMgPj4gX194Ll9NX3ZbX19pXTsKKyAgICAgIF9faXMgPj4gX194Ll9NX3k7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnJlc3VsdF90eXBlCisgICAgICB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjo6cmVzdWx0X3R5cGUKKwkgIF9HcmVzdWx0X3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Om1ha2VfdW5zaWduZWQ8cmVzdWx0X3R5cGU+Ojp0eXBlIF9fdXR5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbW1vbl90eXBlPF9HcmVzdWx0X3R5cGUsIF9fdXR5cGU+Ojp0eXBlCisJICBfX3VjdHlwZTsKKworCWNvbnN0IF9fdWN0eXBlIF9fdXJuZ21pbiA9IF9fdXJuZy5taW4oKTsKKwljb25zdCBfX3VjdHlwZSBfX3VybmdtYXggPSBfX3VybmcubWF4KCk7CisJY29uc3QgX191Y3R5cGUgX191cm5ncmFuZ2UgPSBfX3VybmdtYXggLSBfX3VybmdtaW47CisJY29uc3QgX191Y3R5cGUgX191cmFuZ2UKKwkgID0gX191Y3R5cGUoX19wYXJhbS5iKCkpIC0gX191Y3R5cGUoX19wYXJhbS5hKCkpOworCisJX191Y3R5cGUgX19yZXQ7CisKKwlpZiAoX191cm5ncmFuZ2UgPiBfX3VyYW5nZSkKKwkgIHsKKwkgICAgLy8gZG93bnNjYWxpbmcKKwkgICAgY29uc3QgX191Y3R5cGUgX191ZXJhbmdlID0gX191cmFuZ2UgKyAxOyAvLyBfX3VyYW5nZSBjYW4gYmUgemVybworCSAgICBjb25zdCBfX3VjdHlwZSBfX3NjYWxpbmcgPSBfX3VybmdyYW5nZSAvIF9fdWVyYW5nZTsKKwkgICAgY29uc3QgX191Y3R5cGUgX19wYXN0ID0gX191ZXJhbmdlICogX19zY2FsaW5nOworCSAgICBkbworCSAgICAgIF9fcmV0ID0gX191Y3R5cGUoX191cm5nKCkpIC0gX191cm5nbWluOworCSAgICB3aGlsZSAoX19yZXQgPj0gX19wYXN0KTsKKwkgICAgX19yZXQgLz0gX19zY2FsaW5nOworCSAgfQorCWVsc2UgaWYgKF9fdXJuZ3JhbmdlIDwgX191cmFuZ2UpCisJICB7CisJICAgIC8vIHVwc2NhbGluZworCSAgICAvKgorCSAgICAgIE5vdGUgdGhhdCBldmVyeSB2YWx1ZSBpbiBbMCwgdXJhbmdlXQorCSAgICAgIGNhbiBiZSB3cml0dGVuIHVuaXF1ZWx5IGFzCisKKwkgICAgICAodXJuZ3JhbmdlICsgMSkgKiBoaWdoICsgbG93CisKKwkgICAgICB3aGVyZQorCisJICAgICAgaGlnaCBpbiBbMCwgdXJhbmdlIC8gKHVybmdyYW5nZSArIDEpXQorCisJICAgICAgYW5kCisJCisJICAgICAgbG93IGluIFswLCB1cm5ncmFuZ2VdLgorCSAgICAqLworCSAgICBfX3VjdHlwZSBfX3RtcDsgLy8gd3JhcGFyb3VuZCBjb250cm9sCisJICAgIGRvCisJICAgICAgeworCQljb25zdCBfX3VjdHlwZSBfX3Vlcm5ncmFuZ2UgPSBfX3VybmdyYW5nZSArIDE7CisJCV9fdG1wID0gKF9fdWVybmdyYW5nZSAqIG9wZXJhdG9yKCkKKwkJCSAoX191cm5nLCBwYXJhbV90eXBlKDAsIF9fdXJhbmdlIC8gX191ZXJuZ3JhbmdlKSkpOworCQlfX3JldCA9IF9fdG1wICsgKF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbik7CisJICAgICAgfQorCSAgICB3aGlsZSAoX19yZXQgPiBfX3VyYW5nZSB8fCBfX3JldCA8IF9fdG1wKTsKKwkgIH0KKwllbHNlCisJICBfX3JldCA9IF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbjsKKworCXJldHVybiBfX3JldCArIF9fcGFyYW0uYSgpOworICAgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwl0eXBlZGVmIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yOjpyZXN1bHRfdHlwZQorCSAgX0dyZXN1bHRfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6bWFrZV91bnNpZ25lZDxyZXN1bHRfdHlwZT46OnR5cGUgX191dHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29tbW9uX3R5cGU8X0dyZXN1bHRfdHlwZSwgX191dHlwZT46OnR5cGUKKwkgIF9fdWN0eXBlOworCisJY29uc3QgX191Y3R5cGUgX191cm5nbWluID0gX191cm5nLm1pbigpOworCWNvbnN0IF9fdWN0eXBlIF9fdXJuZ21heCA9IF9fdXJuZy5tYXgoKTsKKwljb25zdCBfX3VjdHlwZSBfX3VybmdyYW5nZSA9IF9fdXJuZ21heCAtIF9fdXJuZ21pbjsKKwljb25zdCBfX3VjdHlwZSBfX3VyYW5nZQorCSAgPSBfX3VjdHlwZShfX3BhcmFtLmIoKSkgLSBfX3VjdHlwZShfX3BhcmFtLmEoKSk7CisKKwlfX3VjdHlwZSBfX3JldDsKKworCWlmIChfX3VybmdyYW5nZSA+IF9fdXJhbmdlKQorCSAgeworCSAgICBpZiAoX19kZXRhaWw6Ol9Qb3dlcl9vZl8yKF9fdXJuZ3JhbmdlICsgMSkKKwkJJiYgX19kZXRhaWw6Ol9Qb3dlcl9vZl8yKF9fdXJhbmdlICsgMSkpCisJICAgICAgeworCQl3aGlsZSAoX19mICE9IF9fdCkKKwkJICB7CisJCSAgICBfX3JldCA9IF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbjsKKwkJICAgICpfX2YrKyA9IChfX3JldCAmIF9fdXJhbmdlKSArIF9fcGFyYW0uYSgpOworCQkgIH0KKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8vIGRvd25zY2FsaW5nCisJCWNvbnN0IF9fdWN0eXBlIF9fdWVyYW5nZSA9IF9fdXJhbmdlICsgMTsgLy8gX191cmFuZ2UgY2FuIGJlIHplcm8KKwkJY29uc3QgX191Y3R5cGUgX19zY2FsaW5nID0gX191cm5ncmFuZ2UgLyBfX3VlcmFuZ2U7CisJCWNvbnN0IF9fdWN0eXBlIF9fcGFzdCA9IF9fdWVyYW5nZSAqIF9fc2NhbGluZzsKKwkJd2hpbGUgKF9fZiAhPSBfX3QpCisJCSAgeworCQkgICAgZG8KKwkJICAgICAgX19yZXQgPSBfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW47CisJCSAgICB3aGlsZSAoX19yZXQgPj0gX19wYXN0KTsKKwkJICAgICpfX2YrKyA9IF9fcmV0IC8gX19zY2FsaW5nICsgX19wYXJhbS5hKCk7CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKwllbHNlIGlmIChfX3VybmdyYW5nZSA8IF9fdXJhbmdlKQorCSAgeworCSAgICAvLyB1cHNjYWxpbmcKKwkgICAgLyoKKwkgICAgICBOb3RlIHRoYXQgZXZlcnkgdmFsdWUgaW4gWzAsIHVyYW5nZV0KKwkgICAgICBjYW4gYmUgd3JpdHRlbiB1bmlxdWVseSBhcworCisJICAgICAgKHVybmdyYW5nZSArIDEpICogaGlnaCArIGxvdworCisJICAgICAgd2hlcmUKKworCSAgICAgIGhpZ2ggaW4gWzAsIHVyYW5nZSAvICh1cm5ncmFuZ2UgKyAxKV0KKworCSAgICAgIGFuZAorCisJICAgICAgbG93IGluIFswLCB1cm5ncmFuZ2VdLgorCSAgICAqLworCSAgICBfX3VjdHlwZSBfX3RtcDsgLy8gd3JhcGFyb3VuZCBjb250cm9sCisJICAgIHdoaWxlIChfX2YgIT0gX190KQorCSAgICAgIHsKKwkJZG8KKwkJICB7CisJCSAgICBjb25zdCBfX3VjdHlwZSBfX3Vlcm5ncmFuZ2UgPSBfX3VybmdyYW5nZSArIDE7CisJCSAgICBfX3RtcCA9IChfX3Vlcm5ncmFuZ2UgKiBvcGVyYXRvcigpCisJCQkgICAgIChfX3VybmcsIHBhcmFtX3R5cGUoMCwgX191cmFuZ2UgLyBfX3Vlcm5ncmFuZ2UpKSk7CisJCSAgICBfX3JldCA9IF9fdG1wICsgKF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbik7CisJCSAgfQorCQl3aGlsZSAoX19yZXQgPiBfX3VyYW5nZSB8fCBfX3JldCA8IF9fdG1wKTsKKwkJKl9fZisrID0gX19yZXQ7CisJICAgICAgfQorCSAgfQorCWVsc2UKKwkgIHdoaWxlIChfX2YgIT0gX190KQorCSAgICAqX19mKysgPSBfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW4gKyBfX3BhcmFtLmEoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBfX29zIDw8IF9feC5hKCkgPDwgX19zcGFjZSA8PCBfX3guYigpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfSW50VHlwZSBfX2EsIF9fYjsKKyAgICAgIF9faXMgPj4gX19hID4+IF9fYjsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX2EsIF9fYikpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisJYXV0byBfX3JhbmdlID0gX19wLmIoKSAtIF9fcC5hKCk7CisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICAqX19mKysgPSBfX2F1cm5nKCkgKiBfX3JhbmdlICsgX19wLmEoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guYSgpIDw8IF9fc3BhY2UgPDwgX194LmIoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fYSwgX19iOworICAgICAgX19pcyA+PiBfX2EgPj4gX19iOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19hLCBfX2IpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgdm9pZAorICAgIHN0ZDo6YmVybm91bGxpX2Rpc3RyaWJ1dGlvbjo6CisgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgeworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBkb3VibGU+CisJX19hdXJuZyhfX3VybmcpOworICAgICAgYXV0byBfX2xpbWl0ID0gX19wLnAoKSAqIChfX2F1cm5nLm1heCgpIC0gX19hdXJuZy5taW4oKSk7CisKKyAgICAgIHdoaWxlIChfX2YgIT0gX190KQorCSpfX2YrKyA9IChfX2F1cm5nKCkgLSBfX2F1cm5nLm1pbigpKSA8IF9fbGltaXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBiZXJub3VsbGlfZGlzdHJpYnV0aW9uJiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fb3Mud2lkZW4oJyAnKSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LnAoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIGdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJLy8gQWJvdXQgdGhlIGVwc2lsb24gdGhpbmcgc2VlIHRoaXMgdGhyZWFkOgorCS8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9nY2MtcGF0Y2hlcy8yMDA2LTEwL21zZzAwOTcxLmh0bWwKKwljb25zdCBkb3VibGUgX19uYWYgPQorCSAgKDEgLSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmVwc2lsb24oKSkgLyAyOworCS8vIFRoZSBsYXJnZXN0IF9SZWFsVHlwZSBjb252ZXJ0aWJsZSB0byBfSW50VHlwZS4KKwljb25zdCBkb3VibGUgX190aHIgPQorCSAgc3RkOjpudW1lcmljX2xpbWl0czxfSW50VHlwZT46Om1heCgpICsgX19uYWY7CisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBkb3VibGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKwlkb3VibGUgX19jYW5kOworCWRvCisJICBfX2NhbmQgPSBzdGQ6OmZsb29yKHN0ZDo6bG9nKDEuMCAtIF9fYXVybmcoKSkgLyBfX3BhcmFtLl9NX2xvZ18xX3ApOworCXdoaWxlIChfX2NhbmQgPj0gX190aHIpOworCisJcmV0dXJuIHJlc3VsdF90eXBlKF9fY2FuZCArIF9fbmFmKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwkvLyBBYm91dCB0aGUgZXBzaWxvbiB0aGluZyBzZWUgdGhpcyB0aHJlYWQ6CisJLy8gaHR0cDovL2djYy5nbnUub3JnL21sL2djYy1wYXRjaGVzLzIwMDYtMTAvbXNnMDA5NzEuaHRtbAorCWNvbnN0IGRvdWJsZSBfX25hZiA9CisJICAoMSAtIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZXBzaWxvbigpKSAvIDI7CisJLy8gVGhlIGxhcmdlc3QgX1JlYWxUeXBlIGNvbnZlcnRpYmxlIHRvIF9JbnRUeXBlLgorCWNvbnN0IGRvdWJsZSBfX3RociA9CisJICBzdGQ6Om51bWVyaWNfbGltaXRzPF9JbnRUeXBlPjo6bWF4KCkgKyBfX25hZjsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGRvdWJsZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworCXdoaWxlIChfX2YgIT0gX190KQorCSAgeworCSAgICBkb3VibGUgX19jYW5kOworCSAgICBkbworCSAgICAgIF9fY2FuZCA9IHN0ZDo6Zmxvb3Ioc3RkOjpsb2coMS4wIC0gX19hdXJuZygpKQorCQkJCSAgLyBfX3BhcmFtLl9NX2xvZ18xX3ApOworCSAgICB3aGlsZSAoX19jYW5kID49IF9fdGhyKTsKKworCSAgICAqX19mKysgPSBfX2NhbmQgKyBfX25hZjsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19vcy53aWRlbignICcpKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gucCgpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBkb3VibGUgX19wOworICAgICAgX19pcyA+PiBfX3A7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnBhcmFtX3R5cGUoX19wKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKyAgLy8gVGhpcyBpcyBMZWdlcidzIGFsZ29yaXRobSwgYWxzbyBpbiBEZXZyb3llLCBDaC4gWCwgRXhhbXBsZSAxLjUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgeworCWNvbnN0IGRvdWJsZSBfX3kgPSBfTV9nZChfX3VybmcpOworCisJLy8gWFhYIElzIHRoZSBjb25zdHJ1Y3RvciB0b28gc2xvdz8KKwlzdGQ6OnBvaXNzb25fZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfX3BvaXNzb24oX195KTsKKwlyZXR1cm4gX19wb2lzc29uKF9fdXJuZyk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxkb3VibGU+OjpwYXJhbV90eXBlCisJICBwYXJhbV90eXBlOworCQorCWNvbnN0IGRvdWJsZSBfX3kgPQorCSAgX01fZ2QoX191cm5nLCBwYXJhbV90eXBlKF9fcC5rKCksICgxLjAgLSBfX3AucCgpKSAvIF9fcC5wKCkpKTsKKworCXN0ZDo6cG9pc3Nvbl9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9fcG9pc3NvbihfX3kpOworCXJldHVybiBfX3BvaXNzb24oX191cm5nKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCXdoaWxlIChfX2YgIT0gX190KQorCSAgeworCSAgICBjb25zdCBkb3VibGUgX195ID0gX01fZ2QoX191cm5nKTsKKworCSAgICAvLyBYWFggSXMgdGhlIGNvbnN0cnVjdG9yIHRvbyBzbG93PworCSAgICBzdGQ6OnBvaXNzb25fZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfX3BvaXNzb24oX195KTsKKwkgICAgKl9fZisrID0gX19wb2lzc29uKF9fdXJuZyk7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCXR5cGVuYW1lIHN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPjo6cGFyYW1fdHlwZQorCSAgX19wMihfX3AuaygpLCAoMS4wIC0gX19wLnAoKSkgLyBfX3AucCgpKTsKKworCXdoaWxlIChfX2YgIT0gX190KQorCSAgeworCSAgICBjb25zdCBkb3VibGUgX195ID0gX01fZ2QoX191cm5nLCBfX3AyKTsKKworCSAgICBzdGQ6OnBvaXNzb25fZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfX3BvaXNzb24oX195KTsKKwkgICAgKl9fZisrID0gX19wb2lzc29uKF9fdXJuZyk7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19vcy53aWRlbignICcpKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guaygpIDw8IF9fc3BhY2UgPDwgX194LnAoKQorCSAgIDw8IF9fc3BhY2UgPDwgX194Ll9NX2dkOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfSW50VHlwZSBfX2s7CisgICAgICBkb3VibGUgX19wOworICAgICAgX19pcyA+PiBfX2sgPj4gX19wID4+IF9feC5fTV9nZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX2ssIF9fcCkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdm9pZAorICAgIHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgX01faW5pdGlhbGl6ZSgpCisgICAgeworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIGlmIChfTV9tZWFuID49IDEyKQorCXsKKwkgIGNvbnN0IGRvdWJsZSBfX20gPSBzdGQ6OmZsb29yKF9NX21lYW4pOworCSAgX01fbG1fdGhyID0gc3RkOjpsb2coX01fbWVhbik7CisJICBfTV9sZm0gPSBzdGQ6OmxnYW1tYShfX20gKyAxKTsKKwkgIF9NX3NtID0gc3RkOjpzcXJ0KF9fbSk7CisKKwkgIGNvbnN0IGRvdWJsZSBfX3BpXzQgPSAwLjc4NTM5ODE2MzM5NzQ0ODMwOTYxNTY2MDg0NTgxOTg3NTdMOworCSAgY29uc3QgZG91YmxlIF9fZHggPSBzdGQ6OnNxcnQoMiAqIF9fbSAqIHN0ZDo6bG9nKDMyICogX19tCisJCQkJCQkJICAgICAgLyBfX3BpXzQpKTsKKwkgIF9NX2QgPSBzdGQ6OnJvdW5kKHN0ZDo6bWF4KDYuMCwgc3RkOjptaW4oX19tLCBfX2R4KSkpOworCSAgY29uc3QgZG91YmxlIF9fY3ggPSAyICogX19tICsgX01fZDsKKwkgIF9NX3NjeCA9IHN0ZDo6c3FydChfX2N4IC8gMik7CisJICBfTV8xY3ggPSAxIC8gX19jeDsKKworCSAgX01fYzJiID0gc3RkOjpzcXJ0KF9fcGlfNCAqIF9fY3gpICogc3RkOjpleHAoX01fMWN4KTsKKwkgIF9NX2NiID0gMiAqIF9fY3ggKiBzdGQ6OmV4cCgtX01fZCAqIF9NXzFjeCAqICgxICsgX01fZCAvIDIpKQorCQkvIF9NX2Q7CisJfQorICAgICAgZWxzZQorI2VuZGlmCisJX01fbG1fdGhyID0gc3RkOjpleHAoLV9NX21lYW4pOworICAgICAgfQorCisgIC8qKgorICAgKiBBIHJlamVjdGlvbiBhbGdvcml0aG0gd2hlbiBtZWFuID49IDEyIGFuZCBhIHNpbXBsZSBtZXRob2QgYmFzZWQKKyAgICogdXBvbiB0aGUgbXVsdGlwbGljYXRpb24gb2YgdW5pZm9ybSByYW5kb20gdmFyaWF0ZXMgb3RoZXJ3aXNlLgorICAgKiBOQjogVGhlIGZvcm1lciBpcyBhdmFpbGFibGUgb25seSBpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAqIGlzIGRlZmluZWQuCisgICAqCisgICAqIFJlZmVyZW5jZToKKyAgICogRGV2cm95ZSwgTC4gTm9uLVVuaWZvcm0gUmFuZG9tIFZhcmlhdGVzIEdlbmVyYXRpb24uIFNwcmluZ2VyLVZlcmxhZywKKyAgICogTmV3IFlvcmssIDE5ODYsIENoLiBYLCBTZWN0cy4gMy4zICYgMy40ICgrIEVycmF0YSEpLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnJlc3VsdF90eXBlCisgICAgICBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGRvdWJsZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJaWYgKF9fcGFyYW0ubWVhbigpID49IDEyKQorCSAgeworCSAgICBkb3VibGUgX194OworCisJICAgIC8vIFNlZSBjb21tZW50cyBhYm92ZS4uLgorCSAgICBjb25zdCBkb3VibGUgX19uYWYgPQorCSAgICAgICgxIC0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjplcHNpbG9uKCkpIC8gMjsKKwkgICAgY29uc3QgZG91YmxlIF9fdGhyID0KKwkgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPF9JbnRUeXBlPjo6bWF4KCkgKyBfX25hZjsKKworCSAgICBjb25zdCBkb3VibGUgX19tID0gc3RkOjpmbG9vcihfX3BhcmFtLm1lYW4oKSk7CisJICAgIC8vIHNxcnQocGkgLyAyKQorCSAgICBjb25zdCBkb3VibGUgX19zcGlfMiA9IDEuMjUzMzE0MTM3MzE1NTAwMjUxMjA3ODgyNjQyNDA1NTIyNkw7CisJICAgIGNvbnN0IGRvdWJsZSBfX2MxID0gX19wYXJhbS5fTV9zbSAqIF9fc3BpXzI7CisJICAgIGNvbnN0IGRvdWJsZSBfX2MyID0gX19wYXJhbS5fTV9jMmIgKyBfX2MxOworCSAgICBjb25zdCBkb3VibGUgX19jMyA9IF9fYzIgKyAxOworCSAgICBjb25zdCBkb3VibGUgX19jNCA9IF9fYzMgKyAxOworCSAgICAvLyBlXigxIC8gNzgpCisJICAgIGNvbnN0IGRvdWJsZSBfX2UxNzggPSAxLjAxMjkwMzA0NzkzMjAwMTg1ODMxODU1MTQ3Nzc1MTI5ODNMOworCSAgICBjb25zdCBkb3VibGUgX19jNSA9IF9fYzQgKyBfX2UxNzg7CisJICAgIGNvbnN0IGRvdWJsZSBfX2MgPSBfX3BhcmFtLl9NX2NiICsgX19jNTsKKwkgICAgY29uc3QgZG91YmxlIF9fMmN4ID0gMiAqICgyICogX19tICsgX19wYXJhbS5fTV9kKTsKKworCSAgICBib29sIF9fcmVqZWN0ID0gdHJ1ZTsKKwkgICAgZG8KKwkgICAgICB7CisJCWNvbnN0IGRvdWJsZSBfX3UgPSBfX2MgKiBfX2F1cm5nKCk7CisJCWNvbnN0IGRvdWJsZSBfX2UgPSAtc3RkOjpsb2coMS4wIC0gX19hdXJuZygpKTsKKworCQlkb3VibGUgX193ID0gMC4wOworCisJCWlmIChfX3UgPD0gX19jMSkKKwkJICB7CisJCSAgICBjb25zdCBkb3VibGUgX19uID0gX01fbmQoX191cm5nKTsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX3kgPSAtc3RkOjphYnMoX19uKSAqIF9fcGFyYW0uX01fc20gLSAxOworCQkgICAgX194ID0gc3RkOjpmbG9vcihfX3kpOworCQkgICAgX193ID0gLV9fbiAqIF9fbiAvIDI7CisJCSAgICBpZiAoX194IDwgLV9fbSkKKwkJICAgICAgY29udGludWU7CisJCSAgfQorCQllbHNlIGlmIChfX3UgPD0gX19jMikKKwkJICB7CisJCSAgICBjb25zdCBkb3VibGUgX19uID0gX01fbmQoX191cm5nKTsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX3kgPSAxICsgc3RkOjphYnMoX19uKSAqIF9fcGFyYW0uX01fc2N4OworCQkgICAgX194ID0gc3RkOjpjZWlsKF9feSk7CisJCSAgICBfX3cgPSBfX3kgKiAoMiAtIF9feSkgKiBfX3BhcmFtLl9NXzFjeDsKKwkJICAgIGlmIChfX3ggPiBfX3BhcmFtLl9NX2QpCisJCSAgICAgIGNvbnRpbnVlOworCQkgIH0KKwkJZWxzZSBpZiAoX191IDw9IF9fYzMpCisJCSAgLy8gTkI6IFRoaXMgY2FzZSBub3QgaW4gdGhlIGJvb2ssIG5vciBpbiB0aGUgRXJyYXRhLAorCQkgIC8vIGJ1dCBzaG91bGQgYmUgb2suLi4KKwkJICBfX3ggPSAtMTsKKwkJZWxzZSBpZiAoX191IDw9IF9fYzQpCisJCSAgX194ID0gMDsKKwkJZWxzZSBpZiAoX191IDw9IF9fYzUpCisJCSAgX194ID0gMTsKKwkJZWxzZQorCQkgIHsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX3YgPSAtc3RkOjpsb2coMS4wIC0gX19hdXJuZygpKTsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX3kgPSBfX3BhcmFtLl9NX2QKKwkJCQkgICAgICsgX192ICogX18yY3ggLyBfX3BhcmFtLl9NX2Q7CisJCSAgICBfX3ggPSBzdGQ6OmNlaWwoX195KTsKKwkJICAgIF9fdyA9IC1fX3BhcmFtLl9NX2QgKiBfX3BhcmFtLl9NXzFjeCAqICgxICsgX195IC8gMik7CisJCSAgfQorCisJCV9fcmVqZWN0ID0gKF9fdyAtIF9fZSAtIF9feCAqIF9fcGFyYW0uX01fbG1fdGhyCisJCQkgICAgPiBfX3BhcmFtLl9NX2xmbSAtIHN0ZDo6bGdhbW1hKF9feCArIF9fbSArIDEpKTsKKworCQlfX3JlamVjdCB8PSBfX3ggKyBfX20gPj0gX190aHI7CisKKwkgICAgICB9IHdoaWxlIChfX3JlamVjdCk7CisKKwkgICAgcmV0dXJuIHJlc3VsdF90eXBlKF9feCArIF9fbSArIF9fbmFmKTsKKwkgIH0KKwllbHNlCisjZW5kaWYKKwkgIHsKKwkgICAgX0ludFR5cGUgICAgIF9feCA9IDA7CisJICAgIGRvdWJsZSBfX3Byb2QgPSAxLjA7CisKKwkgICAgZG8KKwkgICAgICB7CisJCV9fcHJvZCAqPSBfX2F1cm5nKCk7CisJCV9feCArPSAxOworCSAgICAgIH0KKwkgICAgd2hpbGUgKF9fcHJvZCA+IF9fcGFyYW0uX01fbG1fdGhyKTsKKworCSAgICByZXR1cm4gX194IC0gMTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJLy8gV2UgY291bGQgZHVwbGljYXRlIGV2ZXJ5dGhpbmcgZnJvbSBvcGVyYXRvcigpLi4uCisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICAqX19mKysgPSB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX19wYXJhbSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5tZWFuKCkgPDwgX19zcGFjZSA8PCBfX3guX01fbmQ7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBkb3VibGUgX19tZWFuOworICAgICAgX19pcyA+PiBfX21lYW4gPj4gX194Ll9NX25kOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6cGFyYW1fdHlwZShfX21lYW4pKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHZvaWQKKyAgICBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjpwYXJhbV90eXBlOjoKKyAgICBfTV9pbml0aWFsaXplKCkKKyAgICB7CisgICAgICBjb25zdCBkb3VibGUgX19wMTIgPSBfTV9wIDw9IDAuNSA/IF9NX3AgOiAxLjAgLSBfTV9wOworCisgICAgICBfTV9lYXN5ID0gdHJ1ZTsKKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIGlmIChfTV90ICogX19wMTIgPj0gOCkKKwl7CisJICBfTV9lYXN5ID0gZmFsc2U7CisJICBjb25zdCBkb3VibGUgX19ucCA9IHN0ZDo6Zmxvb3IoX01fdCAqIF9fcDEyKTsKKwkgIGNvbnN0IGRvdWJsZSBfX3BhID0gX19ucCAvIF9NX3Q7CisJICBjb25zdCBkb3VibGUgX18xcCA9IDEgLSBfX3BhOworCisJICBjb25zdCBkb3VibGUgX19waV80ID0gMC43ODUzOTgxNjMzOTc0NDgzMDk2MTU2NjA4NDU4MTk4NzU3TDsKKwkgIGNvbnN0IGRvdWJsZSBfX2QxeCA9CisJICAgIHN0ZDo6c3FydChfX25wICogX18xcCAqIHN0ZDo6bG9nKDMyICogX19ucAorCQkJCQkgICAgIC8gKDgxICogX19waV80ICogX18xcCkpKTsKKwkgIF9NX2QxID0gc3RkOjpyb3VuZChzdGQ6Om1heCgxLjAsIF9fZDF4KSk7CisJICBjb25zdCBkb3VibGUgX19kMnggPQorCSAgICBzdGQ6OnNxcnQoX19ucCAqIF9fMXAgKiBzdGQ6OmxvZygzMiAqIF9NX3QgKiBfXzFwCisJCQkJCSAgICAgLyAoX19waV80ICogX19wYSkpKTsKKwkgIF9NX2QyID0gc3RkOjpyb3VuZChzdGQ6Om1heCgxLjAsIF9fZDJ4KSk7CisKKwkgIC8vIHNxcnQocGkgLyAyKQorCSAgY29uc3QgZG91YmxlIF9fc3BpXzIgPSAxLjI1MzMxNDEzNzMxNTUwMDI1MTIwNzg4MjY0MjQwNTUyMjZMOworCSAgX01fczEgPSBzdGQ6OnNxcnQoX19ucCAqIF9fMXApICogKDEgKyBfTV9kMSAvICg0ICogX19ucCkpOworCSAgX01fczIgPSBzdGQ6OnNxcnQoX19ucCAqIF9fMXApICogKDEgKyBfTV9kMiAvICg0ICogX01fdCAqIF9fMXApKTsKKwkgIF9NX2MgPSAyICogX01fZDEgLyBfX25wOworCSAgX01fYTEgPSBzdGQ6OmV4cChfTV9jKSAqIF9NX3MxICogX19zcGlfMjsKKwkgIGNvbnN0IGRvdWJsZSBfX2ExMiA9IF9NX2ExICsgX01fczIgKiBfX3NwaV8yOworCSAgY29uc3QgZG91YmxlIF9fczFzID0gX01fczEgKiBfTV9zMTsKKwkgIF9NX2ExMjMgPSBfX2ExMiArIChzdGQ6OmV4cChfTV9kMSAvIChfTV90ICogX18xcCkpCisJCQkgICAgICogMiAqIF9fczFzIC8gX01fZDEKKwkJCSAgICAgKiBzdGQ6OmV4cCgtX01fZDEgKiBfTV9kMSAvICgyICogX19zMXMpKSk7CisJICBjb25zdCBkb3VibGUgX19zMnMgPSBfTV9zMiAqIF9NX3MyOworCSAgX01fcyA9IChfTV9hMTIzICsgMiAqIF9fczJzIC8gX01fZDIKKwkJICAqIHN0ZDo6ZXhwKC1fTV9kMiAqIF9NX2QyIC8gKDIgKiBfX3MycykpKTsKKwkgIF9NX2xmID0gKHN0ZDo6bGdhbW1hKF9fbnAgKyAxKQorCQkgICArIHN0ZDo6bGdhbW1hKF9NX3QgLSBfX25wICsgMSkpOworCSAgX01fbHAxcCA9IHN0ZDo6bG9nKF9fcGEgLyBfXzFwKTsKKworCSAgX01fcSA9IC1zdGQ6OmxvZygxIC0gKF9fcDEyIC0gX19wYSkgLyBfXzFwKTsKKwl9CisgICAgICBlbHNlCisjZW5kaWYKKwlfTV9xID0gLXN0ZDo6bG9nKDEgLSBfX3AxMik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OgorICAgICAgX01fd2FpdGluZyhfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgX0ludFR5cGUgX190LCBkb3VibGUgX19xKQorICAgICAgeworCV9JbnRUeXBlIF9feCA9IDA7CisJZG91YmxlIF9fc3VtID0gMC4wOworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgZG91YmxlPgorCSAgX19hdXJuZyhfX3VybmcpOworCisJZG8KKwkgIHsKKwkgICAgaWYgKF9fdCA9PSBfX3gpCisJICAgICAgcmV0dXJuIF9feDsKKwkgICAgY29uc3QgZG91YmxlIF9fZSA9IC1zdGQ6OmxvZygxLjAgLSBfX2F1cm5nKCkpOworCSAgICBfX3N1bSArPSBfX2UgLyAoX190IC0gX194KTsKKwkgICAgX194ICs9IDE7CisJICB9CisJd2hpbGUgKF9fc3VtIDw9IF9fcSk7CisKKwlyZXR1cm4gX194IC0gMTsKKyAgICAgIH0KKworICAvKioKKyAgICogQSByZWplY3Rpb24gYWxnb3JpdGhtIHdoZW4gdCAqIHAgPj0gOCBhbmQgYSBzaW1wbGUgd2FpdGluZyB0aW1lCisgICAqIG1ldGhvZCAtIHRoZSBzZWNvbmQgaW4gdGhlIHJlZmVyZW5jZWQgYm9vayAtIG90aGVyd2lzZS4KKyAgICogTkI6IFRoZSBmb3JtZXIgaXMgYXZhaWxhYmxlIG9ubHkgaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgKiBpcyBkZWZpbmVkLgorICAgKgorICAgKiBSZWZlcmVuY2U6CisgICAqIERldnJveWUsIEwuIE5vbi1Vbmlmb3JtIFJhbmRvbSBWYXJpYXRlcyBHZW5lcmF0aW9uLiBTcHJpbmdlci1WZXJsYWcsCisgICAqIE5ldyBZb3JrLCAxOTg2LCBDaC4gWCwgU2VjdC4gNCAoKyBFcnJhdGEhKS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlyZXN1bHRfdHlwZSBfX3JldDsKKwljb25zdCBfSW50VHlwZSBfX3QgPSBfX3BhcmFtLnQoKTsKKwljb25zdCBkb3VibGUgX19wID0gX19wYXJhbS5wKCk7CisJY29uc3QgZG91YmxlIF9fcDEyID0gX19wIDw9IDAuNSA/IF9fcCA6IDEuMCAtIF9fcDsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGRvdWJsZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKwlpZiAoIV9fcGFyYW0uX01fZWFzeSkKKwkgIHsKKwkgICAgZG91YmxlIF9feDsKKworCSAgICAvLyBTZWUgY29tbWVudHMgYWJvdmUuLi4KKwkgICAgY29uc3QgZG91YmxlIF9fbmFmID0KKwkgICAgICAoMSAtIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZXBzaWxvbigpKSAvIDI7CisJICAgIGNvbnN0IGRvdWJsZSBfX3RociA9CisJICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxfSW50VHlwZT46Om1heCgpICsgX19uYWY7CisKKwkgICAgY29uc3QgZG91YmxlIF9fbnAgPSBzdGQ6OmZsb29yKF9fdCAqIF9fcDEyKTsKKworCSAgICAvLyBzcXJ0KHBpIC8gMikKKwkgICAgY29uc3QgZG91YmxlIF9fc3BpXzIgPSAxLjI1MzMxNDEzNzMxNTUwMDI1MTIwNzg4MjY0MjQwNTUyMjZMOworCSAgICBjb25zdCBkb3VibGUgX19hMSA9IF9fcGFyYW0uX01fYTE7CisJICAgIGNvbnN0IGRvdWJsZSBfX2ExMiA9IF9fYTEgKyBfX3BhcmFtLl9NX3MyICogX19zcGlfMjsKKwkgICAgY29uc3QgZG91YmxlIF9fYTEyMyA9IF9fcGFyYW0uX01fYTEyMzsKKwkgICAgY29uc3QgZG91YmxlIF9fczFzID0gX19wYXJhbS5fTV9zMSAqIF9fcGFyYW0uX01fczE7CisJICAgIGNvbnN0IGRvdWJsZSBfX3MycyA9IF9fcGFyYW0uX01fczIgKiBfX3BhcmFtLl9NX3MyOworCisJICAgIGJvb2wgX19yZWplY3Q7CisJICAgIGRvCisJICAgICAgeworCQljb25zdCBkb3VibGUgX191ID0gX19wYXJhbS5fTV9zICogX19hdXJuZygpOworCisJCWRvdWJsZSBfX3Y7CisKKwkJaWYgKF9fdSA8PSBfX2ExKQorCQkgIHsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX24gPSBfTV9uZChfX3VybmcpOworCQkgICAgY29uc3QgZG91YmxlIF9feSA9IF9fcGFyYW0uX01fczEgKiBzdGQ6OmFicyhfX24pOworCQkgICAgX19yZWplY3QgPSBfX3kgPj0gX19wYXJhbS5fTV9kMTsKKwkJICAgIGlmICghX19yZWplY3QpCisJCSAgICAgIHsKKwkJCWNvbnN0IGRvdWJsZSBfX2UgPSAtc3RkOjpsb2coMS4wIC0gX19hdXJuZygpKTsKKwkJCV9feCA9IHN0ZDo6Zmxvb3IoX195KTsKKwkJCV9fdiA9IC1fX2UgLSBfX24gKiBfX24gLyAyICsgX19wYXJhbS5fTV9jOworCQkgICAgICB9CisJCSAgfQorCQllbHNlIGlmIChfX3UgPD0gX19hMTIpCisJCSAgeworCQkgICAgY29uc3QgZG91YmxlIF9fbiA9IF9NX25kKF9fdXJuZyk7CisJCSAgICBjb25zdCBkb3VibGUgX195ID0gX19wYXJhbS5fTV9zMiAqIHN0ZDo6YWJzKF9fbik7CisJCSAgICBfX3JlamVjdCA9IF9feSA+PSBfX3BhcmFtLl9NX2QyOworCQkgICAgaWYgKCFfX3JlamVjdCkKKwkJICAgICAgeworCQkJY29uc3QgZG91YmxlIF9fZSA9IC1zdGQ6OmxvZygxLjAgLSBfX2F1cm5nKCkpOworCQkJX194ID0gc3RkOjpmbG9vcigtX195KTsKKwkJCV9fdiA9IC1fX2UgLSBfX24gKiBfX24gLyAyOworCQkgICAgICB9CisJCSAgfQorCQllbHNlIGlmIChfX3UgPD0gX19hMTIzKQorCQkgIHsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX2UxID0gLXN0ZDo6bG9nKDEuMCAtIF9fYXVybmcoKSk7CisJCSAgICBjb25zdCBkb3VibGUgX19lMiA9IC1zdGQ6OmxvZygxLjAgLSBfX2F1cm5nKCkpOworCisJCSAgICBjb25zdCBkb3VibGUgX195ID0gX19wYXJhbS5fTV9kMQorCQkJCSAgICAgKyAyICogX19zMXMgKiBfX2UxIC8gX19wYXJhbS5fTV9kMTsKKwkJICAgIF9feCA9IHN0ZDo6Zmxvb3IoX195KTsKKwkJICAgIF9fdiA9ICgtX19lMiArIF9fcGFyYW0uX01fZDEgKiAoMSAvIChfX3QgLSBfX25wKQorCQkJCQkJICAgIC1fX3kgLyAoMiAqIF9fczFzKSkpOworCQkgICAgX19yZWplY3QgPSBmYWxzZTsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBjb25zdCBkb3VibGUgX19lMSA9IC1zdGQ6OmxvZygxLjAgLSBfX2F1cm5nKCkpOworCQkgICAgY29uc3QgZG91YmxlIF9fZTIgPSAtc3RkOjpsb2coMS4wIC0gX19hdXJuZygpKTsKKworCQkgICAgY29uc3QgZG91YmxlIF9feSA9IF9fcGFyYW0uX01fZDIKKwkJCQkgICAgICsgMiAqIF9fczJzICogX19lMSAvIF9fcGFyYW0uX01fZDI7CisJCSAgICBfX3ggPSBzdGQ6OmZsb29yKC1fX3kpOworCQkgICAgX192ID0gLV9fZTIgLSBfX3BhcmFtLl9NX2QyICogX195IC8gKDIgKiBfX3Mycyk7CisJCSAgICBfX3JlamVjdCA9IGZhbHNlOworCQkgIH0KKworCQlfX3JlamVjdCA9IF9fcmVqZWN0IHx8IF9feCA8IC1fX25wIHx8IF9feCA+IF9fdCAtIF9fbnA7CisJCWlmICghX19yZWplY3QpCisJCSAgeworCQkgICAgY29uc3QgZG91YmxlIF9fbGZ4ID0KKwkJICAgICAgc3RkOjpsZ2FtbWEoX19ucCArIF9feCArIDEpCisJCSAgICAgICsgc3RkOjpsZ2FtbWEoX190IC0gKF9fbnAgKyBfX3gpICsgMSk7CisJCSAgICBfX3JlamVjdCA9IF9fdiA+IF9fcGFyYW0uX01fbGYgLSBfX2xmeAorCQkJICAgICArIF9feCAqIF9fcGFyYW0uX01fbHAxcDsKKwkJICB9CisKKwkJX19yZWplY3QgfD0gX194ICsgX19ucCA+PSBfX3RocjsKKwkgICAgICB9CisJICAgIHdoaWxlIChfX3JlamVjdCk7CisKKwkgICAgX194ICs9IF9fbnAgKyBfX25hZjsKKworCSAgICBjb25zdCBfSW50VHlwZSBfX3ogPSBfTV93YWl0aW5nKF9fdXJuZywgX190IC0gX0ludFR5cGUoX194KSwKKwkJCQkJICAgIF9fcGFyYW0uX01fcSk7CisJICAgIF9fcmV0ID0gX0ludFR5cGUoX194KSArIF9fejsKKwkgIH0KKwllbHNlCisjZW5kaWYKKwkgIF9fcmV0ID0gX01fd2FpdGluZyhfX3VybmcsIF9fdCwgX19wYXJhbS5fTV9xKTsKKworCWlmIChfX3AxMiAhPSBfX3ApCisJICBfX3JldCA9IF9fdCAtIF9fcmV0OworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCS8vIFdlIGNvdWxkIGR1cGxpY2F0ZSBldmVyeXRoaW5nIGZyb20gb3BlcmF0b3IoKS4uLgorCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9fcGFyYW0pOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LnQoKSA8PCBfX3NwYWNlIDw8IF9feC5wKCkKKwkgICA8PCBfX3NwYWNlIDw8IF9feC5fTV9uZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfSW50VHlwZSBfX3Q7CisgICAgICBkb3VibGUgX19wOworICAgICAgX19pcyA+PiBfX3QgPj4gX19wID4+IF9feC5fTV9uZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX3QsIF9fcCkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHN0ZDo6ZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorCSAgX19hdXJuZyhfX3VybmcpOworCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gLXN0ZDo6bG9nKHJlc3VsdF90eXBlKDEpIC0gX19hdXJuZygpKSAvIF9fcC5sYW1iZGEoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBleHBvbmVudGlhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX29zLndpZGVuKCcgJykpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5sYW1iZGEoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfUmVhbFR5cGUgX19sYW1iZGE7CisgICAgICBfX2lzID4+IF9fbGFtYmRhOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX2xhbWJkYSkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgLyoqCisgICAqIFBvbGFyIG1ldGhvZCBkdWUgdG8gTWFyc2FnbGlhLgorICAgKgorICAgKiBEZXZyb3llLCBMLiBOb24tVW5pZm9ybSBSYW5kb20gVmFyaWF0ZXMgR2VuZXJhdGlvbi4gU3ByaW5nZXItVmVybGFnLAorICAgKiBOZXcgWW9yaywgMTk4NiwgQ2guIFYsIFNlY3QuIDQuNC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCXJlc3VsdF90eXBlIF9fcmV0OworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKwlpZiAoX01fc2F2ZWRfYXZhaWxhYmxlKQorCSAgeworCSAgICBfTV9zYXZlZF9hdmFpbGFibGUgPSBmYWxzZTsKKwkgICAgX19yZXQgPSBfTV9zYXZlZDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHJlc3VsdF90eXBlIF9feCwgX195LCBfX3IyOworCSAgICBkbworCSAgICAgIHsKKwkJX194ID0gcmVzdWx0X3R5cGUoMi4wKSAqIF9fYXVybmcoKSAtIDEuMDsKKwkJX195ID0gcmVzdWx0X3R5cGUoMi4wKSAqIF9fYXVybmcoKSAtIDEuMDsKKwkJX19yMiA9IF9feCAqIF9feCArIF9feSAqIF9feTsKKwkgICAgICB9CisJICAgIHdoaWxlIChfX3IyID4gMS4wIHx8IF9fcjIgPT0gMC4wKTsKKworCSAgICBjb25zdCByZXN1bHRfdHlwZSBfX211bHQgPSBzdGQ6OnNxcnQoLTIgKiBzdGQ6OmxvZyhfX3IyKSAvIF9fcjIpOworCSAgICBfTV9zYXZlZCA9IF9feCAqIF9fbXVsdDsKKwkgICAgX01fc2F2ZWRfYXZhaWxhYmxlID0gdHJ1ZTsKKwkgICAgX19yZXQgPSBfX3kgKiBfX211bHQ7CisJICB9CisKKwlfX3JldCA9IF9fcmV0ICogX19wYXJhbS5zdGRkZXYoKSArIF9fcGFyYW0ubWVhbigpOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCisJaWYgKF9fZiA9PSBfX3QpCisJICByZXR1cm47CisKKwlpZiAoX01fc2F2ZWRfYXZhaWxhYmxlKQorCSAgeworCSAgICBfTV9zYXZlZF9hdmFpbGFibGUgPSBmYWxzZTsKKwkgICAgKl9fZisrID0gX01fc2F2ZWQgKiBfX3BhcmFtLnN0ZGRldigpICsgX19wYXJhbS5tZWFuKCk7CisKKwkgICAgaWYgKF9fZiA9PSBfX3QpCisJICAgICAgcmV0dXJuOworCSAgfQorCisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworCXdoaWxlIChfX2YgKyAxIDwgX190KQorCSAgeworCSAgICByZXN1bHRfdHlwZSBfX3gsIF9feSwgX19yMjsKKwkgICAgZG8KKwkgICAgICB7CisJCV9feCA9IHJlc3VsdF90eXBlKDIuMCkgKiBfX2F1cm5nKCkgLSAxLjA7CisJCV9feSA9IHJlc3VsdF90eXBlKDIuMCkgKiBfX2F1cm5nKCkgLSAxLjA7CisJCV9fcjIgPSBfX3ggKiBfX3ggKyBfX3kgKiBfX3k7CisJICAgICAgfQorCSAgICB3aGlsZSAoX19yMiA+IDEuMCB8fCBfX3IyID09IDAuMCk7CisKKwkgICAgY29uc3QgcmVzdWx0X3R5cGUgX19tdWx0ID0gc3RkOjpzcXJ0KC0yICogc3RkOjpsb2coX19yMikgLyBfX3IyKTsKKwkgICAgKl9fZisrID0gX195ICogX19tdWx0ICogX19wYXJhbS5zdGRkZXYoKSArIF9fcGFyYW0ubWVhbigpOworCSAgICAqX19mKysgPSBfX3ggKiBfX211bHQgKiBfX3BhcmFtLnN0ZGRldigpICsgX19wYXJhbS5tZWFuKCk7CisJICB9CisKKwlpZiAoX19mICE9IF9fdCkKKwkgIHsKKwkgICAgcmVzdWx0X3R5cGUgX194LCBfX3ksIF9fcjI7CisJICAgIGRvCisJICAgICAgeworCQlfX3ggPSByZXN1bHRfdHlwZSgyLjApICogX19hdXJuZygpIC0gMS4wOworCQlfX3kgPSByZXN1bHRfdHlwZSgyLjApICogX19hdXJuZygpIC0gMS4wOworCQlfX3IyID0gX194ICogX194ICsgX195ICogX195OworCSAgICAgIH0KKwkgICAgd2hpbGUgKF9fcjIgPiAxLjAgfHwgX19yMiA9PSAwLjApOworCisJICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fbXVsdCA9IHN0ZDo6c3FydCgtMiAqIHN0ZDo6bG9nKF9fcjIpIC8gX19yMik7CisJICAgIF9NX3NhdmVkID0gX194ICogX19tdWx0OworCSAgICBfTV9zYXZlZF9hdmFpbGFibGUgPSB0cnVlOworCSAgICAqX19mID0gX195ICogX19tdWx0ICogX19wYXJhbS5zdGRkZXYoKSArIF9fcGFyYW0ubWVhbigpOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeworICAgICAgaWYgKF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbQorCSAgJiYgX19kMS5fTV9zYXZlZF9hdmFpbGFibGUgPT0gX19kMi5fTV9zYXZlZF9hdmFpbGFibGUpCisJeworCSAgaWYgKF9fZDEuX01fc2F2ZWRfYXZhaWxhYmxlCisJICAgICAgJiYgX19kMS5fTV9zYXZlZCA9PSBfX2QyLl9NX3NhdmVkKQorCSAgICByZXR1cm4gdHJ1ZTsKKwkgIGVsc2UgaWYoIV9fZDEuX01fc2F2ZWRfYXZhaWxhYmxlKQorCSAgICByZXR1cm4gdHJ1ZTsKKwkgIGVsc2UKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5tZWFuKCkgPDwgX19zcGFjZSA8PCBfX3guc3RkZGV2KCkKKwkgICA8PCBfX3NwYWNlIDw8IF9feC5fTV9zYXZlZF9hdmFpbGFibGU7CisgICAgICBpZiAoX194Ll9NX3NhdmVkX2F2YWlsYWJsZSkKKwlfX29zIDw8IF9fc3BhY2UgPDwgX194Ll9NX3NhdmVkOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBkb3VibGUgX19tZWFuLCBfX3N0ZGRldjsKKyAgICAgIF9faXMgPj4gX19tZWFuID4+IF9fc3RkZGV2CisJICAgPj4gX194Ll9NX3NhdmVkX2F2YWlsYWJsZTsKKyAgICAgIGlmIChfX3guX01fc2F2ZWRfYXZhaWxhYmxlKQorCV9faXMgPj4gX194Ll9NX3NhdmVkOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19tZWFuLCBfX3N0ZGRldikpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGxvZ25vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCSAgd2hpbGUgKF9fZiAhPSBfX3QpCisJICAgICpfX2YrKyA9IHN0ZDo6ZXhwKF9fcC5zKCkgKiBfTV9uZChfX3VybmcpICsgX19wLm0oKSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194Lm0oKSA8PCBfX3NwYWNlIDw8IF9feC5zKCkKKwkgICA8PCBfX3NwYWNlIDw8IF9feC5fTV9uZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGxvZ25vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fbSwgX19zOworICAgICAgX19pcyA+PiBfX20gPj4gX19zID4+IF9feC5fTV9uZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fbSwgX19zKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHN0ZDo6Y2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICAqX19mKysgPSAyICogX01fZ2QoX191cm5nKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgc3RkOjpjaGlfc3F1YXJlZF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCB0eXBlbmFtZQorCQkgICAgICBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICAqX19mKysgPSAyICogX01fZ2QoX191cm5nLCBfX3ApOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194Lm4oKSA8PCBfX3NwYWNlIDw8IF9feC5fTV9nZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfUmVhbFR5cGUgX19uOworICAgICAgX19pcyA+PiBfX24gPj4gX194Ll9NX2dkOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX24pKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIGNhdWNoeV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIGNhdWNoeV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICB7CisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKwlfUmVhbFR5cGUgX191OworCWRvCisJICBfX3UgPSBfX2F1cm5nKCk7CisJd2hpbGUgKF9fdSA9PSAwLjUpOworCisJY29uc3QgX1JlYWxUeXBlIF9fcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjlMOworCXJldHVybiBfX3AuYSgpICsgX19wLmIoKSAqIHN0ZDo6dGFuKF9fcGkgKiBfX3UpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBjYXVjaHlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwljb25zdCBfUmVhbFR5cGUgX19waSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyOUw7CisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgIHsKKwkgICAgX1JlYWxUeXBlIF9fdTsKKwkgICAgZG8KKwkgICAgICBfX3UgPSBfX2F1cm5nKCk7CisJICAgIHdoaWxlIChfX3UgPT0gMC41KTsKKworCSAgICAqX19mKysgPSBfX3AuYSgpICsgX19wLmIoKSAqIHN0ZDo6dGFuKF9fcGkgKiBfX3UpOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGNhdWNoeV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5hKCkgPDwgX19zcGFjZSA8PCBfX3guYigpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgY2F1Y2h5X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfUmVhbFR5cGUgX19hLCBfX2I7CisgICAgICBfX2lzID4+IF9fYSA+PiBfX2I7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgY2F1Y2h5X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX2EsIF9fYikpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHN0ZDo6ZmlzaGVyX2ZfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICAqX19mKysgPSAoKF9NX2dkX3goX191cm5nKSAqIG4oKSkgLyAoX01fZ2RfeShfX3VybmcpICogbSgpKSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHN0ZDo6ZmlzaGVyX2ZfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPjo6cGFyYW1fdHlwZQorCSAgcGFyYW1fdHlwZTsKKwlwYXJhbV90eXBlIF9fcDEoX19wLm0oKSAvIDIpOworCXBhcmFtX3R5cGUgX19wMihfX3AubigpIC8gMik7CisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICAqX19mKysgPSAoKF9NX2dkX3goX191cm5nLCBfX3AxKSAqIG4oKSkKKwkJICAgIC8gKF9NX2dkX3koX191cm5nLCBfX3AyKSAqIG0oKSkpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194Lm0oKSA8PCBfX3NwYWNlIDw8IF9feC5uKCkKKwkgICA8PCBfX3NwYWNlIDw8IF9feC5fTV9nZF94IDw8IF9fc3BhY2UgPDwgX194Ll9NX2dkX3k7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBmaXNoZXJfZl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fbSwgX19uOworICAgICAgX19pcyA+PiBfX20gPj4gX19uID4+IF9feC5fTV9nZF94ID4+IF9feC5fTV9nZF95OworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX20sIF9fbikpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHN0ZDo6c3R1ZGVudF90X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gX01fbmQoX191cm5nKSAqIHN0ZDo6c3FydChuKCkgLyBfTV9nZChfX3VybmcpKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgc3RkOjpzdHVkZW50X3RfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwl0eXBlbmFtZSBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUKKwkgIF9fcDIoX19wLm4oKSAvIDIsIDIpOworCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gIF9NX25kKF9fdXJuZykgKiBzdGQ6OnNxcnQoX19wLm4oKSAvIF9NX2dkKF9fdXJuZywgX19wMikpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHN0dWRlbnRfdF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5uKCkgPDwgX19zcGFjZSA8PCBfX3guX01fbmQgPDwgX19zcGFjZSA8PCBfX3guX01fZ2Q7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBzdHVkZW50X3RfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX247CisgICAgICBfX2lzID4+IF9fbiA+PiBfX3guX01fbmQgPj4gX194Ll9NX2dkOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIHN0dWRlbnRfdF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZShfX24pKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB2b2lkCisgICAgZ2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnBhcmFtX3R5cGU6OgorICAgIF9NX2luaXRpYWxpemUoKQorICAgIHsKKyAgICAgIF9NX21hbHBoYSA9IF9NX2FscGhhIDwgMS4wID8gX01fYWxwaGEgKyBfUmVhbFR5cGUoMS4wKSA6IF9NX2FscGhhOworCisgICAgICBjb25zdCBfUmVhbFR5cGUgX19hMSA9IF9NX21hbHBoYSAtIF9SZWFsVHlwZSgxLjApIC8gX1JlYWxUeXBlKDMuMCk7CisgICAgICBfTV9hMiA9IF9SZWFsVHlwZSgxLjApIC8gc3RkOjpzcXJ0KF9SZWFsVHlwZSg5LjApICogX19hMSk7CisgICAgfQorCisgIC8qKgorICAgKiBNYXJzYWdsaWEsIEcuIGFuZCBUc2FuZywgVy4gVy4KKyAgICogIkEgU2ltcGxlIE1ldGhvZCBmb3IgR2VuZXJhdGluZyBHYW1tYSBWYXJpYWJsZXMiCisgICAqIEFDTSBUcmFuc2FjdGlvbnMgb24gTWF0aGVtYXRpY2FsIFNvZnR3YXJlLCAyNiwgMywgMzYzLTM3MiwgMjAwMC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgZ2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorCSAgX19hdXJuZyhfX3VybmcpOworCisJcmVzdWx0X3R5cGUgX191LCBfX3YsIF9fbjsKKwljb25zdCByZXN1bHRfdHlwZSBfX2ExID0gKF9fcGFyYW0uX01fbWFscGhhCisJCQkJICAtIF9SZWFsVHlwZSgxLjApIC8gX1JlYWxUeXBlKDMuMCkpOworCisJZG8KKwkgIHsKKwkgICAgZG8KKwkgICAgICB7CisJCV9fbiA9IF9NX25kKF9fdXJuZyk7CisJCV9fdiA9IHJlc3VsdF90eXBlKDEuMCkgKyBfX3BhcmFtLl9NX2EyICogX19uOyAKKwkgICAgICB9CisJICAgIHdoaWxlIChfX3YgPD0gMC4wKTsKKworCSAgICBfX3YgPSBfX3YgKiBfX3YgKiBfX3Y7CisJICAgIF9fdSA9IF9fYXVybmcoKTsKKwkgIH0KKwl3aGlsZSAoX191ID4gcmVzdWx0X3R5cGUoMS4wKSAtIDAuMzMxICogX19uICogX19uICogX19uICogX19uCisJICAgICAgICYmIChzdGQ6OmxvZyhfX3UpID4gKDAuNSAqIF9fbiAqIF9fbiArIF9fYTEKKwkJCQkgICAgKiAoMS4wIC0gX192ICsgc3RkOjpsb2coX192KSkpKSk7CisKKwlpZiAoX19wYXJhbS5hbHBoYSgpID09IF9fcGFyYW0uX01fbWFscGhhKQorCSAgcmV0dXJuIF9fYTEgKiBfX3YgKiBfX3BhcmFtLmJldGEoKTsKKwllbHNlCisJICB7CisJICAgIGRvCisJICAgICAgX191ID0gX19hdXJuZygpOworCSAgICB3aGlsZSAoX191ID09IDAuMCk7CisJICAgIAorCSAgICByZXR1cm4gKHN0ZDo6cG93KF9fdSwgcmVzdWx0X3R5cGUoMS4wKSAvIF9fcGFyYW0uYWxwaGEoKSkKKwkJICAgICogX19hMSAqIF9fdiAqIF9fcGFyYW0uYmV0YSgpKTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgZ2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworCXJlc3VsdF90eXBlIF9fdSwgX192LCBfX247CisJY29uc3QgcmVzdWx0X3R5cGUgX19hMSA9IChfX3BhcmFtLl9NX21hbHBoYQorCQkJCSAgLSBfUmVhbFR5cGUoMS4wKSAvIF9SZWFsVHlwZSgzLjApKTsKKworCWlmIChfX3BhcmFtLmFscGhhKCkgPT0gX19wYXJhbS5fTV9tYWxwaGEpCisJICB3aGlsZSAoX19mICE9IF9fdCkKKwkgICAgeworCSAgICAgIGRvCisJCXsKKwkJICBkbworCQkgICAgeworCQkgICAgICBfX24gPSBfTV9uZChfX3VybmcpOworCQkgICAgICBfX3YgPSByZXN1bHRfdHlwZSgxLjApICsgX19wYXJhbS5fTV9hMiAqIF9fbjsKKwkJICAgIH0KKwkJICB3aGlsZSAoX192IDw9IDAuMCk7CisKKwkJICBfX3YgPSBfX3YgKiBfX3YgKiBfX3Y7CisJCSAgX191ID0gX19hdXJuZygpOworCQl9CisJICAgICAgd2hpbGUgKF9fdSA+IHJlc3VsdF90eXBlKDEuMCkgLSAwLjMzMSAqIF9fbiAqIF9fbiAqIF9fbiAqIF9fbgorCQkgICAgICYmIChzdGQ6OmxvZyhfX3UpID4gKDAuNSAqIF9fbiAqIF9fbiArIF9fYTEKKwkJCQkJICAqICgxLjAgLSBfX3YgKyBzdGQ6OmxvZyhfX3YpKSkpKTsKKworCSAgICAgICpfX2YrKyA9IF9fYTEgKiBfX3YgKiBfX3BhcmFtLmJldGEoKTsKKwkgICAgfQorCWVsc2UKKwkgIHdoaWxlIChfX2YgIT0gX190KQorCSAgICB7CisJICAgICAgZG8KKwkJeworCQkgIGRvCisJCSAgICB7CisJCSAgICAgIF9fbiA9IF9NX25kKF9fdXJuZyk7CisJCSAgICAgIF9fdiA9IHJlc3VsdF90eXBlKDEuMCkgKyBfX3BhcmFtLl9NX2EyICogX19uOworCQkgICAgfQorCQkgIHdoaWxlIChfX3YgPD0gMC4wKTsKKworCQkgIF9fdiA9IF9fdiAqIF9fdiAqIF9fdjsKKwkJICBfX3UgPSBfX2F1cm5nKCk7CisJCX0KKwkgICAgICB3aGlsZSAoX191ID4gcmVzdWx0X3R5cGUoMS4wKSAtIDAuMzMxICogX19uICogX19uICogX19uICogX19uCisJCSAgICAgJiYgKHN0ZDo6bG9nKF9fdSkgPiAoMC41ICogX19uICogX19uICsgX19hMQorCQkJCQkgICogKDEuMCAtIF9fdiArIHN0ZDo6bG9nKF9fdikpKSkpOworCisJICAgICAgZG8KKwkJX191ID0gX19hdXJuZygpOworCSAgICAgIHdoaWxlIChfX3UgPT0gMC4wKTsKKworCSAgICAgICpfX2YrKyA9IChzdGQ6OnBvdyhfX3UsIHJlc3VsdF90eXBlKDEuMCkgLyBfX3BhcmFtLmFscGhhKCkpCisJCQkqIF9fYTEgKiBfX3YgKiBfX3BhcmFtLmJldGEoKSk7CisJICAgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5hbHBoYSgpIDw8IF9fc3BhY2UgPDwgX194LmJldGEoKQorCSAgIDw8IF9fc3BhY2UgPDwgX194Ll9NX25kOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgZ2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX2FscGhhX3ZhbCwgX19iZXRhX3ZhbDsKKyAgICAgIF9faXMgPj4gX19hbHBoYV92YWwgPj4gX19iZXRhX3ZhbCA+PiBfX3guX01fbmQ7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgZ2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fYWxwaGFfdmFsLCBfX2JldGFfdmFsKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSB3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgd2VpYnVsbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICB7CisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKwlyZXR1cm4gX19wLmIoKSAqIHN0ZDo6cG93KC1zdGQ6OmxvZyhyZXN1bHRfdHlwZSgxKSAtIF9fYXVybmcoKSksCisJCQkJICByZXN1bHRfdHlwZSgxKSAvIF9fcC5hKCkpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICB3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKwlhdXRvIF9faW52X2EgPSByZXN1bHRfdHlwZSgxKSAvIF9fcC5hKCk7CisKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgICpfX2YrKyA9IF9fcC5iKCkgKiBzdGQ6OnBvdygtc3RkOjpsb2cocmVzdWx0X3R5cGUoMSkgLSBfX2F1cm5nKCkpLAorCQkJCSAgICAgIF9faW52X2EpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHdlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guYSgpIDw8IF9fc3BhY2UgPDwgX194LmIoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHdlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX2EsIF9fYjsKKyAgICAgIF9faXMgPj4gX19hID4+IF9fYjsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSB3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX2EsIF9fYikpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisJcmV0dXJuIF9fcC5hKCkgLSBfX3AuYigpICogc3RkOjpsb2coLXN0ZDo6bG9nKHJlc3VsdF90eXBlKDEpCisJCQkJCQkgICAgICAtIF9fYXVybmcoKSkpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gX19wLmEoKSAtIF9fcC5iKCkgKiBzdGQ6OmxvZygtc3RkOjpsb2cocmVzdWx0X3R5cGUoMSkKKwkJCQkJCQkgIC0gX19hdXJuZygpKSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5hKCkgPDwgX19zcGFjZSA8PCBfX3guYigpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fYSwgX19iOworICAgICAgX19pcyA+PiBfX2EgPj4gX19iOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fYSwgX19iKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB2b2lkCisgICAgZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgX01faW5pdGlhbGl6ZSgpCisgICAgeworICAgICAgaWYgKF9NX3Byb2Iuc2l6ZSgpIDwgMikKKwl7CisJICBfTV9wcm9iLmNsZWFyKCk7CisJICByZXR1cm47CisJfQorCisgICAgICBjb25zdCBkb3VibGUgX19zdW0gPSBzdGQ6OmFjY3VtdWxhdGUoX01fcHJvYi5iZWdpbigpLAorCQkJCQkgICBfTV9wcm9iLmVuZCgpLCAwLjApOworICAgICAgLy8gTm93IG5vcm1hbGl6ZSB0aGUgcHJvYmFiaWxpdGVzLgorICAgICAgX19kZXRhaWw6Ol9fbm9ybWFsaXplKF9NX3Byb2IuYmVnaW4oKSwgX01fcHJvYi5lbmQoKSwgX01fcHJvYi5iZWdpbigpLAorCQkJICAgIF9fc3VtKTsKKyAgICAgIC8vIEFjY3VtdWxhdGUgcGFydGlhbCBzdW1zLgorICAgICAgX01fY3AucmVzZXJ2ZShfTV9wcm9iLnNpemUoKSk7CisgICAgICBzdGQ6OnBhcnRpYWxfc3VtKF9NX3Byb2IuYmVnaW4oKSwgX01fcHJvYi5lbmQoKSwKKwkJICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihfTV9jcCkpOworICAgICAgLy8gTWFrZSBzdXJlIHRoZSBsYXN0IGN1bXVsYXRpdmUgcHJvYmFiaWxpdHkgaXMgb25lLgorICAgICAgX01fY3BbX01fY3Auc2l6ZSgpIC0gMV0gPSAxLjA7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorICAgICAgZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgICBwYXJhbV90eXBlKHNpemVfdCBfX253LCBkb3VibGUgX194bWluLCBkb3VibGUgX194bWF4LCBfRnVuYyBfX2Z3KQorICAgICAgOiBfTV9wcm9iKCksIF9NX2NwKCkKKyAgICAgIHsKKwljb25zdCBzaXplX3QgX19uID0gX19udyA9PSAwID8gMSA6IF9fbnc7CisJY29uc3QgZG91YmxlIF9fZGVsdGEgPSAoX194bWF4IC0gX194bWluKSAvIF9fbjsKKworCV9NX3Byb2IucmVzZXJ2ZShfX24pOworCWZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9fbnc7ICsrX19rKQorCSAgX01fcHJvYi5wdXNoX2JhY2soX19mdyhfX3htaW4gKyBfX2sgKiBfX2RlbHRhICsgMC41ICogX19kZWx0YSkpOworCisJX01faW5pdGlhbGl6ZSgpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlpZiAoX19wYXJhbS5fTV9jcC5lbXB0eSgpKQorCSAgcmV0dXJuIHJlc3VsdF90eXBlKDApOworCisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBkb3VibGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKwljb25zdCBkb3VibGUgX19wID0gX19hdXJuZygpOworCWF1dG8gX19wb3MgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fcGFyYW0uX01fY3AuYmVnaW4oKSwKKwkJCQkgICAgICBfX3BhcmFtLl9NX2NwLmVuZCgpLCBfX3ApOworCisJcmV0dXJuIF9fcG9zIC0gX19wYXJhbS5fTV9jcC5iZWdpbigpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisKKwlpZiAoX19wYXJhbS5fTV9jcC5lbXB0eSgpKQorCSAgeworCSAgICB3aGlsZSAoX19mICE9IF9fdCkKKwkgICAgICAqX19mKysgPSByZXN1bHRfdHlwZSgwKTsKKwkgICAgcmV0dXJuOworCSAgfQorCisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBkb3VibGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgIHsKKwkgICAgY29uc3QgZG91YmxlIF9fcCA9IF9fYXVybmcoKTsKKwkgICAgYXV0byBfX3BvcyA9IHN0ZDo6bG93ZXJfYm91bmQoX19wYXJhbS5fTV9jcC5iZWdpbigpLAorCQkJCQkgIF9fcGFyYW0uX01fY3AuZW5kKCksIF9fcCk7CisKKwkgICAgKl9fZisrID0gX19wb3MgLSBfX3BhcmFtLl9NX2NwLmJlZ2luKCk7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBkaXNjcmV0ZV9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gX19wcm9iID0gX194LnByb2JhYmlsaXRpZXMoKTsKKyAgICAgIF9fb3MgPDwgX19wcm9iLnNpemUoKTsKKyAgICAgIGZvciAoYXV0byBfX2RpdCA9IF9fcHJvYi5iZWdpbigpOyBfX2RpdCAhPSBfX3Byb2IuZW5kKCk7ICsrX19kaXQpCisJX19vcyA8PCBfX3NwYWNlIDw8ICpfX2RpdDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgc2l6ZV90IF9fbjsKKyAgICAgIF9faXMgPj4gX19uOworCisgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IF9fcHJvYl92ZWM7CisgICAgICBfX3Byb2JfdmVjLnJlc2VydmUoX19uKTsKKyAgICAgIGZvciAoOyBfX24gIT0gMDsgLS1fX24pCisJeworCSAgZG91YmxlIF9fcHJvYjsKKwkgIF9faXMgPj4gX19wcm9iOworCSAgX19wcm9iX3ZlYy5wdXNoX2JhY2soX19wcm9iKTsKKwl9CisKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBkaXNjcmV0ZV9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX3Byb2JfdmVjLmJlZ2luKCksIF9fcHJvYl92ZWMuZW5kKCkpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB2b2lkCisgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpwYXJhbV90eXBlOjoKKyAgICBfTV9pbml0aWFsaXplKCkKKyAgICB7CisgICAgICBpZiAoX01faW50LnNpemUoKSA8IDIKKwkgIHx8IChfTV9pbnQuc2l6ZSgpID09IDIKKwkgICAgICAmJiBfTV9pbnRbMF0gPT0gX1JlYWxUeXBlKDApCisJICAgICAgJiYgX01faW50WzFdID09IF9SZWFsVHlwZSgxKSkpCisJeworCSAgX01faW50LmNsZWFyKCk7CisJICBfTV9kZW4uY2xlYXIoKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGNvbnN0IGRvdWJsZSBfX3N1bSA9IHN0ZDo6YWNjdW11bGF0ZShfTV9kZW4uYmVnaW4oKSwKKwkJCQkJICAgX01fZGVuLmVuZCgpLCAwLjApOworCisgICAgICBfX2RldGFpbDo6X19ub3JtYWxpemUoX01fZGVuLmJlZ2luKCksIF9NX2Rlbi5lbmQoKSwgX01fZGVuLmJlZ2luKCksCisJCQkgICAgX19zdW0pOworCisgICAgICBfTV9jcC5yZXNlcnZlKF9NX2Rlbi5zaXplKCkpOworICAgICAgc3RkOjpwYXJ0aWFsX3N1bShfTV9kZW4uYmVnaW4oKSwgX01fZGVuLmVuZCgpLAorCQkgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKF9NX2NwKSk7CisKKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgbGFzdCBjdW11bGF0aXZlIHByb2JhYmlsaXR5IGlzIG9uZS4KKyAgICAgIF9NX2NwW19NX2NwLnNpemUoKSAtIDFdID0gMS4wOworCisgICAgICBmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2sgPCBfTV9kZW4uc2l6ZSgpOyArK19faykKKwlfTV9kZW5bX19rXSAvPSBfTV9pbnRbX19rICsgMV0gLSBfTV9pbnRbX19rXTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yQiwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3JXPgorICAgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpwYXJhbV90eXBlOjoKKyAgICAgIHBhcmFtX3R5cGUoX0lucHV0SXRlcmF0b3JCIF9fYmJlZ2luLAorCQkgX0lucHV0SXRlcmF0b3JCIF9fYmVuZCwKKwkJIF9JbnB1dEl0ZXJhdG9yVyBfX3diZWdpbikKKyAgICAgIDogX01faW50KCksIF9NX2RlbigpLCBfTV9jcCgpCisgICAgICB7CisJaWYgKF9fYmJlZ2luICE9IF9fYmVuZCkKKwkgIHsKKwkgICAgZm9yICg7OykKKwkgICAgICB7CisJCV9NX2ludC5wdXNoX2JhY2soKl9fYmJlZ2luKTsKKwkJKytfX2JiZWdpbjsKKwkJaWYgKF9fYmJlZ2luID09IF9fYmVuZCkKKwkJICBicmVhazsKKworCQlfTV9kZW4ucHVzaF9iYWNrKCpfX3diZWdpbik7CisJCSsrX193YmVnaW47CisJICAgICAgfQorCSAgfQorCisJX01faW5pdGlhbGl6ZSgpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKyAgICAgIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgICBwYXJhbV90eXBlKGluaXRpYWxpemVyX2xpc3Q8X1JlYWxUeXBlPiBfX2JsLCBfRnVuYyBfX2Z3KQorICAgICAgOiBfTV9pbnQoKSwgX01fZGVuKCksIF9NX2NwKCkKKyAgICAgIHsKKwlfTV9pbnQucmVzZXJ2ZShfX2JsLnNpemUoKSk7CisJZm9yIChhdXRvIF9fYml0ZXIgPSBfX2JsLmJlZ2luKCk7IF9fYml0ZXIgIT0gX19ibC5lbmQoKTsgKytfX2JpdGVyKQorCSAgX01faW50LnB1c2hfYmFjaygqX19iaXRlcik7CisKKwlfTV9kZW4ucmVzZXJ2ZShfTV9pbnQuc2l6ZSgpIC0gMSk7CisJZm9yIChzaXplX3QgX19rID0gMDsgX19rIDwgX01faW50LnNpemUoKSAtIDE7ICsrX19rKQorCSAgX01fZGVuLnB1c2hfYmFjayhfX2Z3KDAuNSAqIChfTV9pbnRbX19rICsgMV0gKyBfTV9pbnRbX19rXSkpKTsKKworCV9NX2luaXRpYWxpemUoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmM+CisgICAgICBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnBhcmFtX3R5cGU6OgorICAgICAgcGFyYW1fdHlwZShzaXplX3QgX19udywgX1JlYWxUeXBlIF9feG1pbiwgX1JlYWxUeXBlIF9feG1heCwgX0Z1bmMgX19mdykKKyAgICAgIDogX01faW50KCksIF9NX2RlbigpLCBfTV9jcCgpCisgICAgICB7CisJY29uc3Qgc2l6ZV90IF9fbiA9IF9fbncgPT0gMCA/IDEgOiBfX253OworCWNvbnN0IF9SZWFsVHlwZSBfX2RlbHRhID0gKF9feG1heCAtIF9feG1pbikgLyBfX247CisKKwlfTV9pbnQucmVzZXJ2ZShfX24gKyAxKTsKKwlmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2sgPD0gX19udzsgKytfX2spCisJICBfTV9pbnQucHVzaF9iYWNrKF9feG1pbiArIF9fayAqIF9fZGVsdGEpOworCisJX01fZGVuLnJlc2VydmUoX19uKTsKKwlmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2sgPCBfX253OyArK19faykKKwkgIF9NX2Rlbi5wdXNoX2JhY2soX19mdyhfTV9pbnRbX19rXSArIDAuNSAqIF9fZGVsdGEpKTsKKworCV9NX2luaXRpYWxpemUoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGRvdWJsZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworCWNvbnN0IGRvdWJsZSBfX3AgPSBfX2F1cm5nKCk7CisJaWYgKF9fcGFyYW0uX01fY3AuZW1wdHkoKSkKKwkgIHJldHVybiBfX3A7CisKKwlhdXRvIF9fcG9zID0gc3RkOjpsb3dlcl9ib3VuZChfX3BhcmFtLl9NX2NwLmJlZ2luKCksCisJCQkJICAgICAgX19wYXJhbS5fTV9jcC5lbmQoKSwgX19wKTsKKwljb25zdCBzaXplX3QgX19pID0gX19wb3MgLSBfX3BhcmFtLl9NX2NwLmJlZ2luKCk7CisKKwljb25zdCBkb3VibGUgX19wcmVmID0gX19pID4gMCA/IF9fcGFyYW0uX01fY3BbX19pIC0gMV0gOiAwLjA7CisKKwlyZXR1cm4gX19wYXJhbS5fTV9pbnRbX19pXSArIChfX3AgLSBfX3ByZWYpIC8gX19wYXJhbS5fTV9kZW5bX19pXTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgZG91YmxlPgorCSAgX19hdXJuZyhfX3VybmcpOworCisJaWYgKF9fcGFyYW0uX01fY3AuZW1wdHkoKSkKKwkgIHsKKwkgICAgd2hpbGUgKF9fZiAhPSBfX3QpCisJICAgICAgKl9fZisrID0gX19hdXJuZygpOworCSAgICByZXR1cm47CisJICB9CisKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgIHsKKwkgICAgY29uc3QgZG91YmxlIF9fcCA9IF9fYXVybmcoKTsKKworCSAgICBhdXRvIF9fcG9zID0gc3RkOjpsb3dlcl9ib3VuZChfX3BhcmFtLl9NX2NwLmJlZ2luKCksCisJCQkJCSAgX19wYXJhbS5fTV9jcC5lbmQoKSwgX19wKTsKKwkgICAgY29uc3Qgc2l6ZV90IF9faSA9IF9fcG9zIC0gX19wYXJhbS5fTV9jcC5iZWdpbigpOworCisJICAgIGNvbnN0IGRvdWJsZSBfX3ByZWYgPSBfX2kgPiAwID8gX19wYXJhbS5fTV9jcFtfX2kgLSAxXSA6IDAuMDsKKworCSAgICAqX19mKysgPSAoX19wYXJhbS5fTV9pbnRbX19pXQorCQkgICAgICArIChfX3AgLSBfX3ByZWYpIC8gX19wYXJhbS5fTV9kZW5bX19pXSk7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIHN0ZDo6dmVjdG9yPF9SZWFsVHlwZT4gX19pbnQgPSBfX3guaW50ZXJ2YWxzKCk7CisgICAgICBfX29zIDw8IF9faW50LnNpemUoKSAtIDE7CisKKyAgICAgIGZvciAoYXV0byBfX3hpdCA9IF9faW50LmJlZ2luKCk7IF9feGl0ICE9IF9faW50LmVuZCgpOyArK19feGl0KQorCV9fb3MgPDwgX19zcGFjZSA8PCAqX194aXQ7CisKKyAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gX19kZW4gPSBfX3guZGVuc2l0aWVzKCk7CisgICAgICBmb3IgKGF1dG8gX19kaXQgPSBfX2Rlbi5iZWdpbigpOyBfX2RpdCAhPSBfX2Rlbi5lbmQoKTsgKytfX2RpdCkKKwlfX29zIDw8IF9fc3BhY2UgPDwgKl9fZGl0OworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBzaXplX3QgX19uOworICAgICAgX19pcyA+PiBfX247CisKKyAgICAgIHN0ZDo6dmVjdG9yPF9SZWFsVHlwZT4gX19pbnRfdmVjOworICAgICAgX19pbnRfdmVjLnJlc2VydmUoX19uICsgMSk7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPD0gX19uOyArK19faSkKKwl7CisJICBfUmVhbFR5cGUgX19pbnQ7CisJICBfX2lzID4+IF9faW50OworCSAgX19pbnRfdmVjLnB1c2hfYmFjayhfX2ludCk7CisJfQorCisgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IF9fZGVuX3ZlYzsKKyAgICAgIF9fZGVuX3ZlYy5yZXNlcnZlKF9fbik7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCXsKKwkgIGRvdWJsZSBfX2RlbjsKKwkgIF9faXMgPj4gX19kZW47CisJICBfX2Rlbl92ZWMucHVzaF9iYWNrKF9fZGVuKTsKKwl9CisKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCSAgcGFyYW1fdHlwZShfX2ludF92ZWMuYmVnaW4oKSwgX19pbnRfdmVjLmVuZCgpLCBfX2Rlbl92ZWMuYmVnaW4oKSkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHZvaWQKKyAgICBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpwYXJhbV90eXBlOjoKKyAgICBfTV9pbml0aWFsaXplKCkKKyAgICB7CisgICAgICBpZiAoX01faW50LnNpemUoKSA8IDIKKwkgIHx8IChfTV9pbnQuc2l6ZSgpID09IDIKKwkgICAgICAmJiBfTV9pbnRbMF0gPT0gX1JlYWxUeXBlKDApCisJICAgICAgJiYgX01faW50WzFdID09IF9SZWFsVHlwZSgxKQorCSAgICAgICYmIF9NX2RlblswXSA9PSBfTV9kZW5bMV0pKQorCXsKKwkgIF9NX2ludC5jbGVhcigpOworCSAgX01fZGVuLmNsZWFyKCk7CisJICByZXR1cm47CisJfQorCisgICAgICBkb3VibGUgX19zdW0gPSAwLjA7CisgICAgICBfTV9jcC5yZXNlcnZlKF9NX2ludC5zaXplKCkgLSAxKTsKKyAgICAgIF9NX20ucmVzZXJ2ZShfTV9pbnQuc2l6ZSgpIC0gMSk7CisgICAgICBmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2sgPCBfTV9pbnQuc2l6ZSgpIC0gMTsgKytfX2spCisJeworCSAgY29uc3QgX1JlYWxUeXBlIF9fZGVsdGEgPSBfTV9pbnRbX19rICsgMV0gLSBfTV9pbnRbX19rXTsKKwkgIF9fc3VtICs9IDAuNSAqIChfTV9kZW5bX19rICsgMV0gKyBfTV9kZW5bX19rXSkgKiBfX2RlbHRhOworCSAgX01fY3AucHVzaF9iYWNrKF9fc3VtKTsKKwkgIF9NX20ucHVzaF9iYWNrKChfTV9kZW5bX19rICsgMV0gLSBfTV9kZW5bX19rXSkgLyBfX2RlbHRhKTsKKwl9CisKKyAgICAgIC8vICBOb3cgbm9ybWFsaXplIHRoZSBkZW5zaXRpZXMuLi4KKyAgICAgIF9fZGV0YWlsOjpfX25vcm1hbGl6ZShfTV9kZW4uYmVnaW4oKSwgX01fZGVuLmVuZCgpLCBfTV9kZW4uYmVnaW4oKSwKKwkJCSAgICBfX3N1bSk7CisgICAgICAvLyAgLi4uIGFuZCBwYXJ0aWFsIHN1bXMuLi4gCisgICAgICBfX2RldGFpbDo6X19ub3JtYWxpemUoX01fY3AuYmVnaW4oKSwgX01fY3AuZW5kKCksIF9NX2NwLmJlZ2luKCksIF9fc3VtKTsKKyAgICAgIC8vICAuLi4gYW5kIHNsb3Blcy4KKyAgICAgIF9fZGV0YWlsOjpfX25vcm1hbGl6ZShfTV9tLmJlZ2luKCksIF9NX20uZW5kKCksIF9NX20uYmVnaW4oKSwgX19zdW0pOworCisgICAgICAvLyAgTWFrZSBzdXJlIHRoZSBsYXN0IGN1bXVsYXRpdmUgcHJvYmFibGlsaXR5IGlzIG9uZS4KKyAgICAgIF9NX2NwW19NX2NwLnNpemUoKSAtIDFdID0gMS4wOworICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yQiwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3JXPgorICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgICBwYXJhbV90eXBlKF9JbnB1dEl0ZXJhdG9yQiBfX2JiZWdpbiwKKwkJIF9JbnB1dEl0ZXJhdG9yQiBfX2JlbmQsCisJCSBfSW5wdXRJdGVyYXRvclcgX193YmVnaW4pCisgICAgICA6IF9NX2ludCgpLCBfTV9kZW4oKSwgX01fY3AoKSwgX01fbSgpCisgICAgICB7CisJZm9yICg7IF9fYmJlZ2luICE9IF9fYmVuZDsgKytfX2JiZWdpbiwgKytfX3diZWdpbikKKwkgIHsKKwkgICAgX01faW50LnB1c2hfYmFjaygqX19iYmVnaW4pOworCSAgICBfTV9kZW4ucHVzaF9iYWNrKCpfX3diZWdpbik7CisJICB9CisKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgICBwYXJhbV90eXBlKGluaXRpYWxpemVyX2xpc3Q8X1JlYWxUeXBlPiBfX2JsLCBfRnVuYyBfX2Z3KQorICAgICAgOiBfTV9pbnQoKSwgX01fZGVuKCksIF9NX2NwKCksIF9NX20oKQorICAgICAgeworCV9NX2ludC5yZXNlcnZlKF9fYmwuc2l6ZSgpKTsKKwlfTV9kZW4ucmVzZXJ2ZShfX2JsLnNpemUoKSk7CisJZm9yIChhdXRvIF9fYml0ZXIgPSBfX2JsLmJlZ2luKCk7IF9fYml0ZXIgIT0gX19ibC5lbmQoKTsgKytfX2JpdGVyKQorCSAgeworCSAgICBfTV9pbnQucHVzaF9iYWNrKCpfX2JpdGVyKTsKKwkgICAgX01fZGVuLnB1c2hfYmFjayhfX2Z3KCpfX2JpdGVyKSk7CisJICB9CisKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgICBwYXJhbV90eXBlKHNpemVfdCBfX253LCBfUmVhbFR5cGUgX194bWluLCBfUmVhbFR5cGUgX194bWF4LCBfRnVuYyBfX2Z3KQorICAgICAgOiBfTV9pbnQoKSwgX01fZGVuKCksIF9NX2NwKCksIF9NX20oKQorICAgICAgeworCWNvbnN0IHNpemVfdCBfX24gPSBfX253ID09IDAgPyAxIDogX19udzsKKwljb25zdCBfUmVhbFR5cGUgX19kZWx0YSA9IChfX3htYXggLSBfX3htaW4pIC8gX19uOworCisJX01faW50LnJlc2VydmUoX19uICsgMSk7CisJX01fZGVuLnJlc2VydmUoX19uICsgMSk7CisJZm9yIChzaXplX3QgX19rID0gMDsgX19rIDw9IF9fbnc7ICsrX19rKQorCSAgeworCSAgICBfTV9pbnQucHVzaF9iYWNrKF9feG1pbiArIF9fayAqIF9fZGVsdGEpOworCSAgICBfTV9kZW4ucHVzaF9iYWNrKF9fZncoX01faW50W19fa10gKyBfX2RlbHRhKSk7CisJICB9CisKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGRvdWJsZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworCWNvbnN0IGRvdWJsZSBfX3AgPSBfX2F1cm5nKCk7CisJaWYgKF9fcGFyYW0uX01fY3AuZW1wdHkoKSkKKwkgIHJldHVybiBfX3A7CisKKwlhdXRvIF9fcG9zID0gc3RkOjpsb3dlcl9ib3VuZChfX3BhcmFtLl9NX2NwLmJlZ2luKCksCisJCQkJICAgICAgX19wYXJhbS5fTV9jcC5lbmQoKSwgX19wKTsKKwljb25zdCBzaXplX3QgX19pID0gX19wb3MgLSBfX3BhcmFtLl9NX2NwLmJlZ2luKCk7CisKKwljb25zdCBkb3VibGUgX19wcmVmID0gX19pID4gMCA/IF9fcGFyYW0uX01fY3BbX19pIC0gMV0gOiAwLjA7CisKKwljb25zdCBkb3VibGUgX19hID0gMC41ICogX19wYXJhbS5fTV9tW19faV07CisJY29uc3QgZG91YmxlIF9fYiA9IF9fcGFyYW0uX01fZGVuW19faV07CisJY29uc3QgZG91YmxlIF9fY20gPSBfX3AgLSBfX3ByZWY7CisKKwlfUmVhbFR5cGUgX194ID0gX19wYXJhbS5fTV9pbnRbX19pXTsKKwlpZiAoX19hID09IDApCisJICBfX3ggKz0gX19jbSAvIF9fYjsKKwllbHNlCisJICB7CisJICAgIGNvbnN0IGRvdWJsZSBfX2QgPSBfX2IgKiBfX2IgKyA0LjAgKiBfX2EgKiBfX2NtOworCSAgICBfX3ggKz0gMC41ICogKHN0ZDo6c3FydChfX2QpIC0gX19iKSAvIF9fYTsKKyAgICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIF9feDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwkvLyBXZSBjb3VsZCBkdXBsaWNhdGUgZXZlcnl0aGluZyBmcm9tIG9wZXJhdG9yKCkuLi4KKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgICpfX2YrKyA9IHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfX3BhcmFtKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIHN0ZDo6dmVjdG9yPF9SZWFsVHlwZT4gX19pbnQgPSBfX3guaW50ZXJ2YWxzKCk7CisgICAgICBfX29zIDw8IF9faW50LnNpemUoKSAtIDE7CisKKyAgICAgIGZvciAoYXV0byBfX3hpdCA9IF9faW50LmJlZ2luKCk7IF9feGl0ICE9IF9faW50LmVuZCgpOyArK19feGl0KQorCV9fb3MgPDwgX19zcGFjZSA8PCAqX194aXQ7CisKKyAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gX19kZW4gPSBfX3guZGVuc2l0aWVzKCk7CisgICAgICBmb3IgKGF1dG8gX19kaXQgPSBfX2Rlbi5iZWdpbigpOyBfX2RpdCAhPSBfX2Rlbi5lbmQoKTsgKytfX2RpdCkKKwlfX29zIDw8IF9fc3BhY2UgPDwgKl9fZGl0OworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgc2l6ZV90IF9fbjsKKyAgICAgIF9faXMgPj4gX19uOworCisgICAgICBzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+IF9faW50X3ZlYzsKKyAgICAgIF9faW50X3ZlYy5yZXNlcnZlKF9fbiArIDEpOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDw9IF9fbjsgKytfX2kpCisJeworCSAgX1JlYWxUeXBlIF9faW50OworCSAgX19pcyA+PiBfX2ludDsKKwkgIF9faW50X3ZlYy5wdXNoX2JhY2soX19pbnQpOworCX0KKworICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBfX2Rlbl92ZWM7CisgICAgICBfX2Rlbl92ZWMucmVzZXJ2ZShfX24gKyAxKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8PSBfX247ICsrX19pKQorCXsKKwkgIGRvdWJsZSBfX2RlbjsKKwkgIF9faXMgPj4gX19kZW47CisJICBfX2Rlbl92ZWMucHVzaF9iYWNrKF9fZGVuKTsKKwl9CisKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkgIHBhcmFtX3R5cGUoX19pbnRfdmVjLmJlZ2luKCksIF9faW50X3ZlYy5lbmQoKSwgX19kZW5fdmVjLmJlZ2luKCkpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHNlZWRfc2VxOjpzZWVkX3NlcShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X0ludFR5cGU+IF9faWwpCisgICAgeworICAgICAgZm9yIChhdXRvIF9faXRlciA9IF9faWwuYmVnaW4oKTsgX19pdGVyICE9IF9faWwuZW5kKCk7ICsrX19pdGVyKQorCV9NX3YucHVzaF9iYWNrKF9fZGV0YWlsOjpfX21vZDxyZXN1bHRfdHlwZSwKKwkJICAgICAgIF9fZGV0YWlsOjpfU2hpZnQ8cmVzdWx0X3R5cGUsIDMyPjo6X192YWx1ZT4oKl9faXRlcikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBzZWVkX3NlcTo6c2VlZF9zZXEoX0lucHV0SXRlcmF0b3IgX19iZWdpbiwgX0lucHV0SXRlcmF0b3IgX19lbmQpCisgICAgeworICAgICAgZm9yIChfSW5wdXRJdGVyYXRvciBfX2l0ZXIgPSBfX2JlZ2luOyBfX2l0ZXIgIT0gX19lbmQ7ICsrX19pdGVyKQorCV9NX3YucHVzaF9iYWNrKF9fZGV0YWlsOjpfX21vZDxyZXN1bHRfdHlwZSwKKwkJICAgICAgIF9fZGV0YWlsOjpfU2hpZnQ8cmVzdWx0X3R5cGUsIDMyPjo6X192YWx1ZT4oKl9faXRlcikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIHNlZWRfc2VxOjpnZW5lcmF0ZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19iZWdpbiwKKwkJICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2VuZCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisgICAgICAgIF9UeXBlOworCisgICAgICBpZiAoX19iZWdpbiA9PSBfX2VuZCkKKwlyZXR1cm47CisKKyAgICAgIHN0ZDo6ZmlsbChfX2JlZ2luLCBfX2VuZCwgX1R5cGUoMHg4YjhiOGI4YnUpKTsKKworICAgICAgY29uc3Qgc2l6ZV90IF9fbiA9IF9fZW5kIC0gX19iZWdpbjsKKyAgICAgIGNvbnN0IHNpemVfdCBfX3MgPSBfTV92LnNpemUoKTsKKyAgICAgIGNvbnN0IHNpemVfdCBfX3QgPSAoX19uID49IDYyMykgPyAxMQorCQkgICAgICAgOiAoX19uID49ICA2OCkgPyA3CisJCSAgICAgICA6IChfX24gPj0gIDM5KSA/IDUKKwkJICAgICAgIDogKF9fbiA+PSAgIDcpID8gMworCQkgICAgICAgOiAoX19uIC0gMSkgLyAyOworICAgICAgY29uc3Qgc2l6ZV90IF9fcCA9IChfX24gLSBfX3QpIC8gMjsKKyAgICAgIGNvbnN0IHNpemVfdCBfX3EgPSBfX3AgKyBfX3Q7CisgICAgICBjb25zdCBzaXplX3QgX19tID0gc3RkOjptYXgoc2l6ZV90KF9fcyArIDEpLCBfX24pOworCisgICAgICBmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2sgPCBfX207ICsrX19rKQorCXsKKwkgIF9UeXBlIF9fYXJnID0gKF9fYmVnaW5bX19rICUgX19uXQorCQkJIF4gX19iZWdpblsoX19rICsgX19wKSAlIF9fbl0KKwkJCSBeIF9fYmVnaW5bKF9fayAtIDEpICUgX19uXSk7CisJICBfVHlwZSBfX3IxID0gX19hcmcgXiAoX19hcmcgPj4gMjcpOworCSAgX19yMSA9IF9fZGV0YWlsOjpfX21vZDxfVHlwZSwKKwkJICAgIF9fZGV0YWlsOjpfU2hpZnQ8X1R5cGUsIDMyPjo6X192YWx1ZT4oMTY2NDUyNXUgKiBfX3IxKTsKKwkgIF9UeXBlIF9fcjIgPSBfX3IxOworCSAgaWYgKF9fayA9PSAwKQorCSAgICBfX3IyICs9IF9fczsKKwkgIGVsc2UgaWYgKF9fayA8PSBfX3MpCisJICAgIF9fcjIgKz0gX19rICUgX19uICsgX01fdltfX2sgLSAxXTsKKwkgIGVsc2UKKwkgICAgX19yMiArPSBfX2sgJSBfX247CisJICBfX3IyID0gX19kZXRhaWw6Ol9fbW9kPF9UeXBlLAorCSAgICAgICAgICAgX19kZXRhaWw6Ol9TaGlmdDxfVHlwZSwgMzI+OjpfX3ZhbHVlPihfX3IyKTsKKwkgIF9fYmVnaW5bKF9fayArIF9fcCkgJSBfX25dICs9IF9fcjE7CisJICBfX2JlZ2luWyhfX2sgKyBfX3EpICUgX19uXSArPSBfX3IyOworCSAgX19iZWdpbltfX2sgJSBfX25dID0gX19yMjsKKwl9CisKKyAgICAgIGZvciAoc2l6ZV90IF9fayA9IF9fbTsgX19rIDwgX19tICsgX19uOyArK19faykKKwl7CisJICBfVHlwZSBfX2FyZyA9IChfX2JlZ2luW19fayAlIF9fbl0KKwkJCSArIF9fYmVnaW5bKF9fayArIF9fcCkgJSBfX25dCisJCQkgKyBfX2JlZ2luWyhfX2sgLSAxKSAlIF9fbl0pOworCSAgX1R5cGUgX19yMyA9IF9fYXJnIF4gKF9fYXJnID4+IDI3KTsKKwkgIF9fcjMgPSBfX2RldGFpbDo6X19tb2Q8X1R5cGUsCisJCSAgIF9fZGV0YWlsOjpfU2hpZnQ8X1R5cGUsIDMyPjo6X192YWx1ZT4oMTU2NjA4Mzk0MXUgKiBfX3IzKTsKKwkgIF9UeXBlIF9fcjQgPSBfX3IzIC0gX19rICUgX19uOworCSAgX19yNCA9IF9fZGV0YWlsOjpfX21vZDxfVHlwZSwKKwkgICAgICAgICAgIF9fZGV0YWlsOjpfU2hpZnQ8X1R5cGUsIDMyPjo6X192YWx1ZT4oX19yNCk7CisJICBfX2JlZ2luWyhfX2sgKyBfX3ApICUgX19uXSBePSBfX3IzOworCSAgX19iZWdpblsoX19rICsgX19xKSAlIF9fbl0gXj0gX19yNDsKKwkgIF9fYmVnaW5bX19rICUgX19uXSA9IF9fcjQ7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHNpemVfdCBfX2JpdHMsCisJICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgX1JlYWxUeXBlCisgICAgZ2VuZXJhdGVfY2Fub25pY2FsKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90IF9fYgorCT0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8c2l6ZV90PihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46OmRpZ2l0cyksCisgICAgICAgICAgICAgICAgICAgX19iaXRzKTsKKyAgICAgIGNvbnN0IGxvbmcgZG91YmxlIF9fciA9IHN0YXRpY19jYXN0PGxvbmcgZG91YmxlPihfX3VybmcubWF4KCkpCisJCQkgICAgLSBzdGF0aWNfY2FzdDxsb25nIGRvdWJsZT4oX191cm5nLm1pbigpKSArIDEuMEw7CisgICAgICBjb25zdCBzaXplX3QgX19sb2cyciA9IHN0ZDo6bG9nKF9fcikgLyBzdGQ6OmxvZygyLjBMKTsKKyAgICAgIHNpemVfdCBfX2sgPSBzdGQ6Om1heDxzaXplX3Q+KDFVTCwgKF9fYiArIF9fbG9nMnIgLSAxVUwpIC8gX19sb2cycik7CisgICAgICBfUmVhbFR5cGUgX19zdW0gPSBfUmVhbFR5cGUoMCk7CisgICAgICBfUmVhbFR5cGUgX190bXAgPSBfUmVhbFR5cGUoMSk7CisgICAgICBmb3IgKDsgX19rICE9IDA7IC0tX19rKQorCXsKKwkgIF9fc3VtICs9IF9SZWFsVHlwZShfX3VybmcoKSAtIF9fdXJuZy5taW4oKSkgKiBfX3RtcDsKKwkgIF9fdG1wICo9IF9fcjsKKwl9CisgICAgICByZXR1cm4gX19zdW0gLyBfX3RtcDsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmFuZ2VfYWNjZXNzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmFuZ2VfYWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhNzk1OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yYW5nZV9hY2Nlc3MuaApAQCAtMCwwICsxLDEwNSBAQAorLy8gPHJhbmdlX2FjY2Vzcy5oPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9yYW5nZV9hY2Nlc3MuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2l0ZXJhdG9yfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUkFOR0VfQUNDRVNTX0gKKyNkZWZpbmUgX0dMSUJDWFhfUkFOR0VfQUNDRVNTX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSBjb250YWluZXIuCisgICAqICBAcGFyYW0gIF9fY29udCAgQ29udGFpbmVyLgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYXV0bworICAgIGJlZ2luKF9Db250YWluZXImIF9fY29udCkgLT4gZGVjbHR5cGUoX19jb250LmJlZ2luKCkpCisgICAgeyByZXR1cm4gX19jb250LmJlZ2luKCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSBjb25zdCBjb250YWluZXIuCisgICAqICBAcGFyYW0gIF9fY29udCAgQ29udGFpbmVyLgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYXV0bworICAgIGJlZ2luKGNvbnN0IF9Db250YWluZXImIF9fY29udCkgLT4gZGVjbHR5cGUoX19jb250LmJlZ2luKCkpCisgICAgeyByZXR1cm4gX19jb250LmJlZ2luKCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQgb2YKKyAgICogICAgICAgICAgdGhlIGNvbnRhaW5lci4KKyAgICogIEBwYXJhbSAgX19jb250ICBDb250YWluZXIuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfQ29udGFpbmVyPgorICAgIGlubGluZSBhdXRvCisgICAgZW5kKF9Db250YWluZXImIF9fY29udCkgLT4gZGVjbHR5cGUoX19jb250LmVuZCgpKQorICAgIHsgcmV0dXJuIF9fY29udC5lbmQoKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudCBvZgorICAgKiAgICAgICAgICB0aGUgY29uc3QgY29udGFpbmVyLgorICAgKiAgQHBhcmFtICBfX2NvbnQgIENvbnRhaW5lci4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9Db250YWluZXI+CisgICAgaW5saW5lIGF1dG8KKyAgICBlbmQoY29uc3QgX0NvbnRhaW5lciYgX19jb250KSAtPiBkZWNsdHlwZShfX2NvbnQuZW5kKCkpCisgICAgeyByZXR1cm4gX19jb250LmVuZCgpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkuCisgICAqICBAcGFyYW0gIF9fYXJyICBBcnJheS4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9UcCwgc2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgX1RwKgorICAgIGJlZ2luKF9UcCAoJl9fYXJyKVtfTm1dKQorICAgIHsgcmV0dXJuIF9fYXJyOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50CisgICAqICAgICAgICAgIG9mIHRoZSBhcnJheS4KKyAgICogIEBwYXJhbSAgX19hcnIgIEFycmF5LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1RwLCBzaXplX3QgX05tPgorICAgIGlubGluZSBfVHAqCisgICAgZW5kKF9UcCAoJl9fYXJyKVtfTm1dKQorICAgIHsgcmV0dXJuIF9fYXJyICsgX05tOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9SQU5HRV9BQ0NFU1NfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDE5MjVhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4LmgKQEAgLTAsMCArMSwyNDg1IEBACisvLyBjbGFzcyB0ZW1wbGF0ZSByZWdleCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqICBAZmlsZSBiaXRzL3JlZ2V4LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtyZWdleH0KKyAqLworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHJlZ2V4CisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiBAYnJpZWYgQ2xhc3MgcmVnZXhfdHJhaXRzLiBEZXNjcmliZXMgYXNwZWN0cyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICoKKyAgICogQSByZWd1bGFyIGV4cHJlc3Npb24gdHJhaXRzIGNsYXNzIHRoYXQgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMgb2YgCisgICAqIHNlY3Rpb24gWzI4LjddLgorICAgKgorICAgKiBUaGUgY2xhc3MgJXJlZ2V4IGlzIHBhcmFtZXRlcml6ZWQgYXJvdW5kIGEgc2V0IG9mIHJlbGF0ZWQgdHlwZXMgYW5kCisgICAqIGZ1bmN0aW9ucyB1c2VkIHRvIGNvbXBsZXRlIHRoZSBkZWZpbml0aW9uIG9mIGl0cyBzZW1hbnRpY3MuICBUaGlzIGNsYXNzCisgICAqIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnRzIG9mIHN1Y2ggYSB0cmFpdHMgY2xhc3MuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZT4KKyAgICBzdHJ1Y3QgcmVnZXhfdHJhaXRzCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NoX3R5cGUgICAgICAgICAgICAgICAgICAgICAJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyX3R5cGU+IAlzdHJpbmdfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpsb2NhbGUgICAgICAgICAgICAgICAgICAJbG9jYWxlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Y3R5cGVfYmFzZTo6bWFzayAgICAgICAgCWNoYXJfY2xhc3NfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBkZWZhdWx0IHRyYWl0cyBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3RyYWl0cygpIHsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHaXZlcyB0aGUgbGVuZ3RoIG9mIGEgQy1zdHlsZSBzdHJpbmcgc3RhcnRpbmcgYXQgQHAgX19wLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3AgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYmV0d2VlbiBAcCAqX19wIGFuZCB0aGUgZmlyc3QKKyAgICAgICAqIGRlZmF1bHQtaW5pdGlhbGl6ZWQgdmFsdWUgb2YgdHlwZSBAcCBjaGFyX3R5cGUuICBJbiBvdGhlciB3b3JkcywgdXNlcworICAgICAgICogdGhlIEMtc3RyaW5nIGFsZ29yaXRobSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGxlbmd0aCBvZiBhIHNlcXVlbmNlIG9mCisgICAgICAgKiBjaGFyYWN0ZXJzLgorICAgICAgICovCisgICAgICBzdGF0aWMgc3RkOjpzaXplX3QKKyAgICAgIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcCkKKyAgICAgIHsgcmV0dXJuIHN0cmluZ190eXBlOjp0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUGVyZm9ybXMgdGhlIGlkZW50aXR5IHRyYW5zbGF0aW9uLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2MgQSBjaGFyYWN0ZXIgdG8gdGhlIGxvY2FsZS1zcGVjaWZpYyBjaGFyYWN0ZXIgc2V0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIF9fYy4KKyAgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB0cmFuc2xhdGUoY2hhcl90eXBlIF9fYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fYzsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBUcmFuc2xhdGVzIGEgY2hhcmFjdGVyIGludG8gYSBjYXNlLWluc2Vuc2l0aXZlIGVxdWl2YWxlbnQuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fYyBBIGNoYXJhY3RlciB0byB0aGUgbG9jYWxlLXNwZWNpZmljIGNoYXJhY3RlciBzZXQuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBsb3dlci1jYXNlIGVxdWl2YWxlbnQgb2YgX19jLgorICAgICAgICogQHRocm93cyBzdGQ6OmJhZF9jYXN0IGlmIHRoZSBpbWJ1ZWQgbG9jYWxlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGN0eXBlCisgICAgICAgKiAgICAgICAgIGZhY2V0LgorICAgICAgICovCisgICAgICBjaGFyX3R5cGUKKyAgICAgIHRyYW5zbGF0ZV9ub2Nhc2UoY2hhcl90eXBlIF9fYykgY29uc3QKKyAgICAgIHsgCisJdHlwZWRlZiBzdGQ6OmN0eXBlPGNoYXJfdHlwZT4gX19jdHlwZV90eXBlOworCWNvbnN0IF9fY3R5cGVfdHlwZSYgX19mY3R5cCh1c2VfZmFjZXQ8X19jdHlwZV90eXBlPihfTV9sb2NhbGUpKTsKKwlyZXR1cm4gX19mY3R5cC50b2xvd2VyKF9fYyk7IAorICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgc29ydCBrZXkgZm9yIGEgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2ZpcnN0IGJlZ2lubmluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIF9fbGFzdCAgb25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIFJldHVybnMgYSBzb3J0IGtleSBmb3IgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBkZXNpZ25hdGVkIGJ5IHRoZQorICAgICAgICogaXRlcmF0b3IgcmFuZ2UgW0YxLCBGMikgc3VjaCB0aGF0IGlmIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgW0cxLCBHMikKKyAgICAgICAqIHNvcnRzIGJlZm9yZSB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIFtIMSwgSDIpIHRoZW4KKyAgICAgICAqIHYudHJhbnNmb3JtKEcxLCBHMikgPCB2LnRyYW5zZm9ybShIMSwgSDIpLgorICAgICAgICoKKyAgICAgICAqIFdoYXQgdGhpcyByZWFsbHkgZG9lcyBpcyBwcm92aWRlIGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGNvbXBhcmUgYQorICAgICAgICogc3RyaW5nIHRvIG11bHRpcGxlIG90aGVyIHN0cmluZ3MgaW4gbG9jYWxlcyB3aXRoIGZhbmN5IGNvbGxhdGlvbgorICAgICAgICogcnVsZXMgYW5kIGVxdWl2YWxlbmNlIGNsYXNzZXMuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgYSBsb2NhbGUtc3BlY2lmaWMgc29ydCBrZXkgZXF1aXZhbGVudCB0byB0aGUgaW5wdXQgcmFuZ2UuCisgICAgICAgKgorICAgICAgICogQHRocm93cyBzdGQ6OmJhZF9jYXN0IGlmIHRoZSBjdXJyZW50IGxvY2FsZSBkb2VzIG5vdCBoYXZlIGEgY29sbGF0ZQorICAgICAgICogICAgICAgICBmYWNldC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZF9pdGVyPgorICAgICAgICBzdHJpbmdfdHlwZQorICAgICAgICB0cmFuc2Zvcm0oX0Z3ZF9pdGVyIF9fZmlyc3QsIF9Gd2RfaXRlciBfX2xhc3QpIGNvbnN0CisgICAgICAgIHsKKwkgIHR5cGVkZWYgc3RkOjpjb2xsYXRlPGNoYXJfdHlwZT4gX19jb2xsYXRlX3R5cGU7CisJICBjb25zdCBfX2NvbGxhdGVfdHlwZSYgX19mY2x0KHVzZV9mYWNldDxfX2NvbGxhdGVfdHlwZT4oX01fbG9jYWxlKSk7CisJICBzdHJpbmdfdHlwZSBfX3MoX19maXJzdCwgX19sYXN0KTsKKwkgIHJldHVybiBfX2ZjbHQudHJhbnNmb3JtKF9fcy5kYXRhKCksIF9fcy5kYXRhKCkgKyBfX3Muc2l6ZSgpKTsKKwl9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYSBzb3J0IGtleSBmb3IgYSBjaGFyYWN0ZXIgc2VxdWVuY2UsIGluZGVwZW5kZW50IG9mIGNhc2UuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fZmlyc3QgYmVnaW5uaW5nIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKiBAcGFyYW0gX19sYXN0ICBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogRWZmZWN0czogaWYgdHlwZWlkKHVzZV9mYWNldDxjb2xsYXRlPF9DaF90eXBlPiA+KSA9PQorICAgICAgICogdHlwZWlkKGNvbGxhdGVfYnluYW1lPF9DaF90eXBlPikgYW5kIHRoZSBmb3JtIG9mIHRoZSBzb3J0IGtleQorICAgICAgICogcmV0dXJuZWQgYnkgY29sbGF0ZV9ieW5hbWU8X0NoX3R5cGU+Ojp0cmFuc2Zvcm0oX19maXJzdCwgX19sYXN0KSAKKyAgICAgICAqIGlzIGtub3duIGFuZCBjYW4gYmUgY29udmVydGVkIGludG8gYSBwcmltYXJ5IHNvcnQga2V5CisgICAgICAgKiB0aGVuIHJldHVybnMgdGhhdCBrZXksIG90aGVyd2lzZSByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZF9pdGVyPgorICAgICAgICBzdHJpbmdfdHlwZQorICAgICAgICB0cmFuc2Zvcm1fcHJpbWFyeShfRndkX2l0ZXIgX19maXJzdCwgX0Z3ZF9pdGVyIF9fbGFzdCkgY29uc3QKKyAgICAgICAgeyByZXR1cm4gc3RyaW5nX3R5cGUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgY29sbGF0aW9uIGVsZW1lbnQgYnkgbmFtZS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19maXJzdCBiZWdpbm5pbmcgb2YgdGhlIGNvbGxhdGlvbiBlbGVtZW50IG5hbWUuCisgICAgICAgKiBAcGFyYW0gX19sYXN0ICBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBjb2xsYXRpb24gZWxlbWVudCBuYW1lLgorICAgICAgICogCisgICAgICAgKiBAcmV0dXJucyBhIHNlcXVlbmNlIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgdGhhdCByZXByZXNlbnRzIHRoZQorICAgICAgICogY29sbGF0aW5nIGVsZW1lbnQgY29uc2lzdGluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGRlc2lnbmF0ZWQgYnkKKyAgICAgICAqIHRoZSBpdGVyYXRvciByYW5nZSBbX19maXJzdCwgX19sYXN0KS4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlCisgICAgICAgKiBjaGFyYWN0ZXIgc2VxdWVuY2UgaXMgbm90IGEgdmFsaWQgY29sbGF0aW5nIGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RfaXRlcj4KKyAgICAgICAgc3RyaW5nX3R5cGUKKyAgICAgICAgbG9va3VwX2NvbGxhdGVuYW1lKF9Gd2RfaXRlciBfX2ZpcnN0LCBfRndkX2l0ZXIgX19sYXN0KSBjb25zdAorICAgICAgICB7IHJldHVybiBzdHJpbmdfdHlwZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIE1hcHMgb25lIG9yIG1vcmUgY2hhcmFjdGVycyB0byBhIG5hbWVkIGNoYXJhY3RlcgorICAgICAgICogICAgICAgIGNsYXNzaWZpY2F0aW9uLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2ZpcnN0IGJlZ2lubmluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIF9fbGFzdCAgb25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIF9faWNhc2UgaWdub3JlcyB0aGUgY2FzZSBvZiB0aGUgY2xhc3NpZmljYXRpb24gbmFtZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBhbiB1bnNwZWNpZmllZCB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYXJhY3RlcgorICAgICAgICogY2xhc3NpZmljYXRpb24gbmFtZWQgYnkgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBkZXNpZ25hdGVkIGJ5CisgICAgICAgKiB0aGUgaXRlcmF0b3IgcmFuZ2UgW19fZmlyc3QsIF9fbGFzdCkuIElmIEBwIGljYXNlIGlzIHRydWUsCisgICAgICAgKiB0aGUgcmV0dXJuZWQgbWFzayBpZGVudGlmaWVzIHRoZSBjbGFzc2lmaWNhdGlvbiByZWdhcmRsZXNzIG9mCisgICAgICAgKiB0aGUgY2FzZSBvZiB0aGUgY2hhcmFjdGVycyB0byBiZSBtYXRjaGVkIChmb3IgZXhhbXBsZSwKKyAgICAgICAqIFtbOmxvd2VyOl1dIGlzIHRoZSBzYW1lIGFzIFtbOmFscGhhOl1dKSwgb3RoZXJ3aXNlIGEKKyAgICAgICAqIGNhc2UtZGVwZW5kZW50IGNsYXNzaWZpY2F0aW9uIGlzIHJldHVybmVkLiAgVGhlIHZhbHVlCisgICAgICAgKiByZXR1cm5lZCBzaGFsbCBiZSBpbmRlcGVuZGVudCBvZiB0aGUgY2FzZSBvZiB0aGUgY2hhcmFjdGVycworICAgICAgICogaW4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4gSWYgdGhlIG5hbWUgaXMgbm90IHJlY29nbml6ZWQgdGhlbgorICAgICAgICogcmV0dXJucyBhIHZhbHVlIHRoYXQgY29tcGFyZXMgZXF1YWwgdG8gMC4KKyAgICAgICAqCisgICAgICAgKiBBdCBsZWFzdCB0aGUgZm9sbG93aW5nIG5hbWVzIChvciB0aGVpciB3aWRlLWNoYXJhY3RlciBlcXVpdmFsZW50KSBhcmUKKyAgICAgICAqIHN1cHBvcnRlZC4KKyAgICAgICAqIC0gZAorICAgICAgICogLSB3CisgICAgICAgKiAtIHMKKyAgICAgICAqIC0gYWxudW0KKyAgICAgICAqIC0gYWxwaGEKKyAgICAgICAqIC0gYmxhbmsKKyAgICAgICAqIC0gY250cmwKKyAgICAgICAqIC0gZGlnaXQKKyAgICAgICAqIC0gZ3JhcGgKKyAgICAgICAqIC0gbG93ZXIKKyAgICAgICAqIC0gcHJpbnQKKyAgICAgICAqIC0gcHVuY3QKKyAgICAgICAqIC0gc3BhY2UKKyAgICAgICAqIC0gdXBwZXIKKyAgICAgICAqIC0geGRpZ2l0CisgICAgICAgKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RfaXRlcj4KKyAgICAgICAgY2hhcl9jbGFzc190eXBlCisgICAgICAgIGxvb2t1cF9jbGFzc25hbWUoX0Z3ZF9pdGVyIF9fZmlyc3QsIF9Gd2RfaXRlciBfX2xhc3QsCisJICAgICAgICAgICAgICAgICBib29sIF9faWNhc2UgPSBmYWxzZSkgY29uc3QKKwl7IHJldHVybiAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERldGVybWluZXMgaWYgQHAgYyBpcyBhIG1lbWJlciBvZiBhbiBpZGVudGlmaWVkIGNsYXNzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2MgYSBjaGFyYWN0ZXIuCisgICAgICAgKiBAcGFyYW0gX19mIGEgY2xhc3MgdHlwZSAoYXMgcmV0dXJuZWQgZnJvbSBsb29rdXBfY2xhc3NuYW1lKS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgQHAgX19jIGlzIGEgbWVtYmVyIG9mIHRoZSBjbGFzc2lmaWNhdGlvbgorICAgICAgICogcmVwcmVzZW50ZWQgYnkgQHAgX19mLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKgorICAgICAgICogQHRocm93cyBzdGQ6OmJhZF9jYXN0IGlmIHRoZSBjdXJyZW50IGxvY2FsZSBkb2VzIG5vdCBoYXZlIGEgY3R5cGUKKyAgICAgICAqICAgICAgICAgZmFjZXQuCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGlzY3R5cGUoX0NoX3R5cGUgX19jLCBjaGFyX2NsYXNzX3R5cGUgX19mKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29udmVydHMgYSBkaWdpdCB0byBhbiBpbnQuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fY2ggICAgYSBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIGEgZGlnaXQuCisgICAgICAgKiBAcGFyYW0gX19yYWRpeCB0aGUgcmFkaXggaWYgdGhlIG51bWVyaWMgY29udmVyc2lvbiAobGltaXRlZCB0byA4LCAxMCwKKyAgICAgICAqICAgICAgICAgICAgICBvciAxNikuCisgICAgICAgKiAKKyAgICAgICAqIEByZXR1cm5zIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgZGlnaXQgX19jaCBpbiBiYXNlIHJhZGl4IGlmIHRoZQorICAgICAgICogY2hhcmFjdGVyIF9fY2ggaXMgYSB2YWxpZCBkaWdpdCBpbiBiYXNlIHJhZGl4OyBvdGhlcndpc2UgcmV0dXJucyAtMS4KKyAgICAgICAqLworICAgICAgaW50CisgICAgICB2YWx1ZShfQ2hfdHlwZSBfX2NoLCBpbnQgX19yYWRpeCkgY29uc3Q7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEltYnVlcyB0aGUgcmVnZXhfdHJhaXRzIG9iamVjdCB3aXRoIGEgY29weSBvZiBhIG5ldyBsb2NhbGUuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbG9jIEEgbG9jYWxlLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIGEgY29weSBvZiB0aGUgcHJldmlvdXMgbG9jYWxlIGluIHVzZSBieSB0aGUgcmVnZXhfdHJhaXRzCisgICAgICAgKiAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQG5vdGUgQ2FsbGluZyBpbWJ1ZSB3aXRoIGEgZGlmZmVyZW50IGxvY2FsZSB0aGFuIHRoZSBvbmUgY3VycmVudGx5IGluCisgICAgICAgKiAgICAgICB1c2UgaW52YWxpZGF0ZXMgYWxsIGNhY2hlZCBkYXRhIGhlbGQgYnkgKnRoaXMuCisgICAgICAgKi8KKyAgICAgIGxvY2FsZV90eXBlCisgICAgICBpbWJ1ZShsb2NhbGVfdHlwZSBfX2xvYykKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fbG9jYWxlLCBfX2xvYyk7CisJcmV0dXJuIF9fbG9jOworICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgY29weSBvZiB0aGUgY3VycmVudCBsb2NhbGUgaW4gdXNlIGJ5IHRoZSByZWdleF90cmFpdHMKKyAgICAgICAqIG9iamVjdC4KKyAgICAgICAqLworICAgICAgbG9jYWxlX3R5cGUKKyAgICAgIGdldGxvYygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9sb2NhbGU7IH0KKyAgICAgIAorICAgIHByb3RlY3RlZDoKKyAgICAgIGxvY2FsZV90eXBlIF9NX2xvY2FsZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlPgorICAgIGJvb2wKKyAgICByZWdleF90cmFpdHM8X0NoX3R5cGU+OjoKKyAgICBpc2N0eXBlKF9DaF90eXBlIF9fYywgY2hhcl9jbGFzc190eXBlIF9fZikgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6Y3R5cGU8Y2hhcl90eXBlPiBfX2N0eXBlX3R5cGU7CisgICAgICBjb25zdCBfX2N0eXBlX3R5cGUmIF9fZmN0eXAodXNlX2ZhY2V0PF9fY3R5cGVfdHlwZT4oX01fbG9jYWxlKSk7CisgICAgICAKKyAgICAgIGlmIChfX2ZjdHlwLmlzKF9fZiwgX19jKSkKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIAorICAgICAgLy8gc3BlY2lhbCBjYXNlIG9mIHVuZGVyc2NvcmUgaW4gW1s6dzpdXQorICAgICAgaWYgKF9fYyA9PSBfX2ZjdHlwLndpZGVuKCdfJykpCisJeworCSAgY29uc3QgY2hhciBfX3diW10gPSAidyI7CisJICBjaGFyX2NsYXNzX3R5cGUgX193dCA9IHRoaXMtPmxvb2t1cF9jbGFzc25hbWUoX193YiwKKwkJCQkJCQlfX3diICsgc2l6ZW9mKF9fd2IpKTsKKwkgIGlmIChfX2YgfCBfX3d0KQorCSAgICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgCisgICAgICAvLyBzcGVjaWFsIGNhc2Ugb2YgW1s6c3BhY2U6XV0gaW4gW1s6Ymxhbms6XV0KKyAgICAgIGlmIChfX2ZjdHlwLmlzKHN0ZDo6Y3R5cGVfYmFzZTo6c3BhY2UsIF9fYykpCisJeworCSAgY29uc3QgY2hhciBfX2JiW10gPSAiYmxhbmsiOworCSAgY2hhcl9jbGFzc190eXBlIF9fYnQgPSB0aGlzLT5sb29rdXBfY2xhc3NuYW1lKF9fYmIsCisJCQkJCQkJX19iYiArIHNpemVvZihfX2JiKSk7CisJICBpZiAoX19mIHwgX19idCkKKwkgICAgcmV0dXJuIHRydWU7CisJfQorICAgICAgCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlPgorICAgIGludAorICAgIHJlZ2V4X3RyYWl0czxfQ2hfdHlwZT46OgorICAgIHZhbHVlKF9DaF90eXBlIF9fY2gsIGludCBfX3JhZGl4KSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6YmFzaWNfaXN0cmluZ3N0cmVhbTxjaGFyX3R5cGU+IF9faXMoc3RyaW5nX3R5cGUoMSwgX19jaCkpOworICAgICAgaW50IF9fdjsKKyAgICAgIGlmIChfX3JhZGl4ID09IDgpCisJX19pcyA+PiBzdGQ6Om9jdDsKKyAgICAgIGVsc2UgaWYgKF9fcmFkaXggPT0gMTYpCisJX19pcyA+PiBzdGQ6OmhleDsKKyAgICAgIF9faXMgPj4gX192OworICAgICAgcmV0dXJuIF9faXMuZmFpbCgpID8gLTEgOiBfX3Y7CisgICAgfQorCisgIC8vIFs3LjhdIENsYXNzIGJhc2ljX3JlZ2V4CisgIC8qKgorICAgKiBPYmplY3RzIG9mIHNwZWNpYWxpemF0aW9ucyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCByZWd1bGFyIGV4cHJlc3Npb25zCisgICAqIGNvbnN0cnVjdGVkIGZyb20gc2VxdWVuY2VzIG9mIGNoYXJhY3RlciB0eXBlIEBwIF9DaF90eXBlLgorICAgKgorICAgKiBTdG9yYWdlIGZvciB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIGFsbG9jYXRlZCBhbmQgZGVhbGxvY2F0ZWQgYXMKKyAgICogbmVjZXNzYXJ5IGJ5IHRoZSBtZW1iZXIgZnVuY3Rpb25zIG9mIHRoaXMgY2xhc3MuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cyA9IHJlZ2V4X3RyYWl0czxfQ2hfdHlwZT4gPgorICAgIGNsYXNzIGJhc2ljX3JlZ2V4CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfUnhfdHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnN0cmluZ190eXBlICAgc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGZsYWdfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmxvY2FsZV90eXBlICAgbG9jYWxlX3R5cGU7CisKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgQ29uc3RhbnRzCisgICAgICAgKiBzdGQgWzI4LjguMV0oMSkKKyAgICAgICAqLworICAgICAgLy9AeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBmbGFnX3R5cGUgaWNhc2UgPSByZWdleF9jb25zdGFudHM6OmljYXNlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBmbGFnX3R5cGUgbm9zdWJzID0gcmVnZXhfY29uc3RhbnRzOjpub3N1YnM7CisgICAgICBzdGF0aWMgY29uc3RleHByIGZsYWdfdHlwZSBvcHRpbWl6ZSA9IHJlZ2V4X2NvbnN0YW50czo6b3B0aW1pemU7CisgICAgICBzdGF0aWMgY29uc3RleHByIGZsYWdfdHlwZSBjb2xsYXRlID0gcmVnZXhfY29uc3RhbnRzOjpjb2xsYXRlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBmbGFnX3R5cGUgRUNNQVNjcmlwdCA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgZmxhZ190eXBlIGJhc2ljID0gcmVnZXhfY29uc3RhbnRzOjpiYXNpYzsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgZmxhZ190eXBlIGV4dGVuZGVkID0gcmVnZXhfY29uc3RhbnRzOjpleHRlbmRlZDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgZmxhZ190eXBlIGF3ayA9IHJlZ2V4X2NvbnN0YW50czo6YXdrOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBmbGFnX3R5cGUgZ3JlcCA9IHJlZ2V4X2NvbnN0YW50czo6Z3JlcDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgZmxhZ190eXBlIGVncmVwID0gcmVnZXhfY29uc3RhbnRzOjplZ3JlcDsKKyAgICAgIC8vQH0KKworICAgICAgLy8gWzcuOC4yXSBjb25zdHJ1Y3QvY29weS9kZXN0cm95CisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBkb2VzIG5vdCBtYXRjaCBhbnkKKyAgICAgICAqIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgoKQorICAgICAgOiBfTV9mbGFncyhFQ01BU2NyaXB0KSwKKyAgICAgICAgX01fYXV0b21hdG9uKF9fZGV0YWlsOjpfX2NvbXBpbGU8Y29uc3QgX0NoX3R5cGUqLCBfUnhfdHJhaXRzPigwLCAwLAorICAgICAgICAgICAgICAgICAgICAgX01fdHJhaXRzLCBfTV9mbGFncykpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZQorICAgICAgICogc2VxdWVuY2UgW19fcCwgX19wICsgY2hhcl90cmFpdHM8X0NoX3R5cGU+OjpsZW5ndGgoX19wKSkKKyAgICAgICAqIGludGVycHJldGVkIGFjY29yZGluZyB0byB0aGUgZmxhZ3MgaW4gQHAgX19mLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3AgQSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZworICAgICAgICogICAgICAgICAgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBfX2YgRmxhZ3MgaW5kaWNhdGluZyB0aGUgc3ludGF4IHJ1bGVzIGFuZCBvcHRpb25zLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgQHAgX19wIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX3JlZ2V4KGNvbnN0IF9DaF90eXBlKiBfX3AsIGZsYWdfdHlwZSBfX2YgPSBFQ01BU2NyaXB0KQorICAgICAgOiBfTV9mbGFncyhfX2YpLAorICAgICAgICBfTV9hdXRvbWF0b24oX19kZXRhaWw6Ol9fY29tcGlsZShfX3AsIF9fcCArIF9SeF90cmFpdHM6Omxlbmd0aChfX3ApLAorICAgICAgICAJCQkJX01fdHJhaXRzLCBfTV9mbGFncykpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSBzZXF1ZW5jZQorICAgICAgICogW3AsIHAgKyBsZW4pIGludGVycHJldGVkIGFjY29yZGluZyB0byB0aGUgZmxhZ3MgaW4gQHAgZi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19wICAgQSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhcgorICAgICAgICogICAgICAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gX19sZW4gVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgICAgICBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIF9fZiAgIEZsYWdzIGluZGljYXRpbmcgdGhlIHN5bnRheCBydWxlcyBhbmQgb3B0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIEBwIF9fcCBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4KGNvbnN0IF9DaF90eXBlKiBfX3AsIHN0ZDo6c2l6ZV90IF9fbGVuLCBmbGFnX3R5cGUgX19mKQorICAgICAgOiBfTV9mbGFncyhfX2YpLAorICAgICAgICBfTV9hdXRvbWF0b24oX19kZXRhaWw6Ol9fY29tcGlsZShfX3AsIF9fcCArIF9fbGVuLCBfTV90cmFpdHMsIF9NX2ZsYWdzKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5LWNvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcmhzIEEgQHAgcmVnZXggb2JqZWN0LgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleChjb25zdCBiYXNpY19yZWdleCYgX19yaHMpCisgICAgICA6IF9NX2ZsYWdzKF9fcmhzLl9NX2ZsYWdzKSwgX01fdHJhaXRzKF9fcmhzLl9NX3RyYWl0cyksCisgICAgICAgIF9NX2F1dG9tYXRvbihfX3Jocy5fTV9hdXRvbWF0b24pCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgTW92ZS1jb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3JocyBBIEBwIHJlZ2V4IG9iamVjdC4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgoY29uc3QgYmFzaWNfcmVnZXgmJiBfX3Jocykgbm9leGNlcHQKKyAgICAgIDogX01fZmxhZ3MoX19yaHMuX01fZmxhZ3MpLCBfTV90cmFpdHMoX19yaHMuX01fdHJhaXRzKSwKKyAgICAgICAgX01fYXV0b21hdG9uKHN0ZDo6bW92ZShfX3Jocy5fTV9hdXRvbWF0b24pKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgc3RyaW5nCisgICAgICAgKiBAcCBzIGludGVycHJldGVkIGFjY29yZGluZyB0byB0aGUgZmxhZ3MgaW4gQHAgZi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19zIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gX19mIEZsYWdzIGluZGljYXRpbmcgdGhlIHN5bnRheCBydWxlcyBhbmQgb3B0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIEBwIF9fcyBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgYmFzaWNfcmVnZXgoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8X0NoX3R5cGUsIF9DaF90cmFpdHMsIAorCQkJCQkgICAgX0NoX2FsbG9jPiYgX19zLAorCQkgICAgZmxhZ190eXBlIF9fZiA9IEVDTUFTY3JpcHQpCisJOiBfTV9mbGFncyhfX2YpLAorCSAgX01fYXV0b21hdG9uKF9fZGV0YWlsOjpfX2NvbXBpbGUoX19zLmJlZ2luKCksIF9fcy5lbmQoKSwKKwkgIAkJCQkgIF9NX3RyYWl0cywgX01fZmxhZ3MpKQorICAgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSByYW5nZQorICAgICAgICogW2ZpcnN0LCBsYXN0KSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZsYWdzIGluIEBwIGYuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fZmlyc3QgVGhlIHN0YXJ0IG9mIGEgcmFuZ2UgY29udGFpbmluZyBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gX19sYXN0ICBUaGUgZW5kIG9mIGEgcmFuZ2UgY29udGFpbmluZyBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gX19mICAgICBUaGUgZm9ybWF0IGZsYWdzIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBbX19maXJzdCwgX19sYXN0KSBpcyBub3QgYSB2YWxpZCByZWd1bGFyCisgICAgICAgKiAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBiYXNpY19yZWdleChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIAorCQkgICAgZmxhZ190eXBlIF9fZiA9IEVDTUFTY3JpcHQpCisJOiBfTV9mbGFncyhfX2YpLAorCSAgX01fYXV0b21hdG9uKF9fZGV0YWlsOjpfX2NvbXBpbGUoX19maXJzdCwgX19sYXN0LCBfTV90cmFpdHMsIF9NX2ZsYWdzKSkKKyAgICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2wgIFRoZSBpbml0aWFsaXplciBsaXN0LgorICAgICAgICogQHBhcmFtIF9fZiAgVGhlIGZvcm1hdCBmbGFncyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgQHAgX19sIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgoaW5pdGlhbGl6ZXJfbGlzdDxfQ2hfdHlwZT4gX19sLAorCQkgIGZsYWdfdHlwZSBfX2YgPSBFQ01BU2NyaXB0KQorICAgICAgOiBfTV9mbGFncyhfX2YpLAorICAgICAgICBfTV9hdXRvbWF0b24oX19kZXRhaWw6Ol9fY29tcGlsZShfX2wuYmVnaW4oKSwgX19sLmVuZCgpLAorICAgICAgICAJCQkJX01fdHJhaXRzLCBfTV9mbGFncykpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRGVzdHJveXMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIH5iYXNpY19yZWdleCgpCisgICAgICB7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBvbmUgcmVndWxhciBleHByZXNzaW9uIHRvIGFub3RoZXIuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGJhc2ljX3JlZ2V4JiBfX3JocykKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihfX3Jocyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgTW92ZS1hc3NpZ25zIG9uZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gYW5vdGhlci4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgmCisgICAgICBvcGVyYXRvcj0oYmFzaWNfcmVnZXgmJiBfX3Jocykgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihzdGQ6Om1vdmUoX19yaHMpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXBsYWNlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIGEgbmV3IG9uZSBjb25zdHJ1Y3RlZCBmcm9tCisgICAgICAgKiBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19wIEEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBudWxsLXRlcm1pbmF0ZWQgQy1zdHlsZSBzdHJpbmcKKyAgICAgICAqICAgICAgICBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfQ2hfdHlwZSogX19wKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fcCwgZmxhZ3MoKSk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVwbGFjZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCBhIG5ldyBvbmUgY29uc3RydWN0ZWQgZnJvbQorICAgICAgICogYSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcyBBIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGVyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBiYXNpY19yZWdleCYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwgX0NoX3R5cGVyYWl0cywgX0FsbG9jPiYgX19zKQorICAgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19zLCBmbGFncygpKTsgfQorCisgICAgICAvLyBbNy44LjNdIGFzc2lnbgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgdGhlIHJlYWwgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIGFzc2lnbihjb25zdCBiYXNpY19yZWdleCYgX19yaHMpCisgICAgICB7CisJYmFzaWNfcmVnZXggX190bXAoX19yaHMpOworCXRoaXMtPnN3YXAoX190bXApOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgVGhlIG1vdmUtYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIGFzc2lnbihiYXNpY19yZWdleCYmIF9fcmhzKSBub2V4Y2VwdAorICAgICAgeworCWJhc2ljX3JlZ2V4IF9fdG1wKHN0ZDo6bW92ZShfX3JocykpOworCXRoaXMtPnN3YXAoX190bXApOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gdG8gYSByZWdleCBvYmplY3QgZnJvbSBhCisgICAgICAgKiBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICogcGF0dGVybi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19wICAgICBBIHBvaW50ZXIgdG8gYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZworICAgICAgICogICAgICAgICAgICAgIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCisgICAgICAgKiBAcGFyYW0gX19mbGFncyBTeW50YXggb3B0aW9uIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgX19wIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCByZWd1bGFyCisgICAgICAgKiBleHByZXNzaW9uIHBhdHRlcm4gaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIEBwIF9fZmxhZ3MuICBJZgorICAgICAgICogcmVnZXhfZXJyb3IgaXMgdGhyb3duLCAqdGhpcyByZW1haW5zIHVuY2hhbmdlZC4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgmCisgICAgICBhc3NpZ24oY29uc3QgX0NoX3R5cGUqIF9fcCwgZmxhZ190eXBlIF9fZmxhZ3MgPSBFQ01BU2NyaXB0KQorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKHN0cmluZ190eXBlKF9fcCksIF9fZmxhZ3MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgYSBuZXcgcmVndWxhciBleHByZXNzaW9uIHRvIGEgcmVnZXggb2JqZWN0IGZyb20gYQorICAgICAgICogQy1zdHlsZSBzdHJpbmcgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3AgICAgIEEgcG9pbnRlciB0byBhIEMtc3R5bGUgc3RyaW5nIGNvbnRhaW5pbmcgYQorICAgICAgICogICAgICAgICAgICAgICAgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCisgICAgICAgKiBAcGFyYW0gX19sZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBzdHJpbmcuCisgICAgICAgKiBAcGFyYW0gX19mbGFncyBTeW50YXggb3B0aW9uIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgcCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcmVndWxhcgorICAgICAgICogZXhwcmVzc2lvbiBwYXR0ZXJuIGludGVycHJldGVkIGFjY29yZGluZyB0byBAcCBfX2ZsYWdzLiAgSWYKKyAgICAgICAqIHJlZ2V4X2Vycm9yIGlzIHRocm93biwgKnRoaXMgcmVtYWlucyB1bmNoYW5nZWQuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgYXNzaWduKGNvbnN0IF9DaF90eXBlKiBfX3AsIHN0ZDo6c2l6ZV90IF9fbGVuLCBmbGFnX3R5cGUgX19mbGFncykKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihzdHJpbmdfdHlwZShfX3AsIF9fbGVuKSwgX19mbGFncyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gdG8gYSByZWdleCBvYmplY3QgZnJvbSBhIAorICAgICAgICogc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19zICAgICBBIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCisgICAgICAgKiBAcGFyYW0gX19mbGFncyBTeW50YXggb3B0aW9uIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgX19zIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCByZWd1bGFyCisgICAgICAgKiBleHByZXNzaW9uIHBhdHRlcm4gaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIEBwIF9fZmxhZ3MuICBJZgorICAgICAgICogcmVnZXhfZXJyb3IgaXMgdGhyb3duLCAqdGhpcyByZW1haW5zIHVuY2hhbmdlZC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGVyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBiYXNpY19yZWdleCYKKyAgICAgICAgYXNzaWduKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwgX0NoX3R5cGVyYWl0cywgX0FsbG9jPiYgX19zLAorCSAgICAgICBmbGFnX3R5cGUgX19mbGFncyA9IEVDTUFTY3JpcHQpCisgICAgICAgIHsgCisJICBiYXNpY19yZWdleCBfX3RtcChfX3MsIF9fZmxhZ3MpOworCSAgdGhpcy0+c3dhcChfX3RtcCk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIGEgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhIHJlZ2V4IG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19maXJzdCBUaGUgc3RhcnQgb2YgYSByYW5nZSBjb250YWluaW5nIGEgdmFsaWQgcmVndWxhcgorICAgICAgICogICAgICAgICAgICAgICAgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBfX2xhc3QgIFRoZSBlbmQgb2YgYSByYW5nZSBjb250YWluaW5nIGEgdmFsaWQgcmVndWxhcgorICAgICAgICogICAgICAgICAgICAgICAgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBfX2ZsYWdzIFN5bnRheCBvcHRpb24gZmxhZ3MuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBwIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCByZWd1bGFyCisgICAgICAgKiBleHByZXNzaW9uIHBhdHRlcm4gaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIEBwIF9fZmxhZ3MuICBJZgorICAgICAgICogcmVnZXhfZXJyb3IgaXMgdGhyb3duLCB0aGUgb2JqZWN0IHJlbWFpbnMgdW5jaGFuZ2VkLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgYmFzaWNfcmVnZXgmCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgIGZsYWdfdHlwZSBfX2ZsYWdzID0gRUNNQVNjcmlwdCkKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKHN0cmluZ190eXBlKF9fZmlyc3QsIF9fbGFzdCksIF9fZmxhZ3MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgYSBuZXcgcmVndWxhciBleHByZXNzaW9uIHRvIGEgcmVnZXggb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2wgICAgIEFuIGluaXRpYWxpemVyIGxpc3QgcmVwcmVzZW50aW5nIGEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIF9fZmxhZ3MgU3ludGF4IG9wdGlvbiBmbGFncy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIEBwIF9fbCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQKKyAgICAgICAqIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIGludGVycHJldGVkIGFjY29yZGluZyB0byBAcAorICAgICAgICogX19mbGFncy4gIElmIHJlZ2V4X2Vycm9yIGlzIHRocm93biwgdGhlIG9iamVjdCByZW1haW5zCisgICAgICAgKiB1bmNoYW5nZWQuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8X0NoX3R5cGU+IF9fbCwgZmxhZ190eXBlIF9fZmxhZ3MgPSBFQ01BU2NyaXB0KQorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksIF9fZmxhZ3MpOyB9CisKKyAgICAgIC8vIFs3LjguNF0gY29uc3Qgb3BlcmF0aW9ucworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbnVtYmVyIG9mIG1hcmtlZCBzdWJleHByZXNzaW9ucyB3aXRoaW4gdGhlIHJlZ3VsYXIKKyAgICAgICAqIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGludAorICAgICAgbWFya19jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9hdXRvbWF0b24tPl9NX3N1Yl9jb3VudCgpIC0gMTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBmbGFncyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgKiBvciBpbiB0aGUgbGFzdCBjYWxsIHRvIGFzc2lnbigpLgorICAgICAgICovCisgICAgICBmbGFnX3R5cGUKKyAgICAgIGZsYWdzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2ZsYWdzOyB9CisgICAgICAKKyAgICAgIC8vIFs3LjguNV0gbG9jYWxlCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbWJ1ZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbG9jYWxlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xvYyBBIGxvY2FsZS4KKyAgICAgICAqLworICAgICAgbG9jYWxlX3R5cGUKKyAgICAgIGltYnVlKGxvY2FsZV90eXBlIF9fbG9jKQorICAgICAgeyByZXR1cm4gX01fdHJhaXRzLmltYnVlKF9fbG9jKTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBsb2NhbGUgY3VycmVudGx5IGltYnVlZCBpbiB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgKiAgICAgICAgb2JqZWN0LgorICAgICAgICovCisgICAgICBsb2NhbGVfdHlwZQorICAgICAgZ2V0bG9jKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3RyYWl0cy5nZXRsb2MoKTsgfQorICAgICAgCisgICAgICAvLyBbNy44LjZdIHN3YXAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFN3YXBzIHRoZSBjb250ZW50cyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIG9iamVjdHMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgcmVndWxhciBleHByZXNzaW9uIG9iamVjdC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3dhcChiYXNpY19yZWdleCYgX19yaHMpCisgICAgICB7CisJc3RkOjpzd2FwKF9NX2ZsYWdzLCBfX3Jocy5fTV9mbGFncyk7CisJc3RkOjpzd2FwKF9NX3RyYWl0cywgX19yaHMuX01fdHJhaXRzKTsKKwlzdGQ6OnN3YXAoX01fYXV0b21hdG9uLCBfX3Jocy5fTV9hdXRvbWF0b24pOworICAgICAgfQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvdChzdGQ6Om9zdHJlYW0mIF9fb3N0cikKKyAgICAgIHsgX01fYXV0b21hdG9uLT5fTV9kb3QoX19vc3RyKTsgfQorI2VuZGlmCisgICAgICAKKyAgICAgIGNvbnN0IF9fZGV0YWlsOjpfQXV0b21hdG9uUHRyJgorICAgICAgX01fZ2V0X2F1dG9tYXRvbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9hdXRvbWF0b247IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIGZsYWdfdHlwZSAgICAgICAgICAgICAgX01fZmxhZ3M7CisgICAgICBfUnhfdHJhaXRzICAgICAgICAgICAgIF9NX3RyYWl0czsKKyAgICAgIF9fZGV0YWlsOjpfQXV0b21hdG9uUHRyIF9NX2F1dG9tYXRvbjsKKyAgICB9OworICAKKyAgLyoqIEBicmllZiBTdGFuZGFyZCByZWd1bGFyIGV4cHJlc3Npb25zLiAqLworICB0eXBlZGVmIGJhc2ljX3JlZ2V4PGNoYXI+ICAgIHJlZ2V4OworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgLyoqIEBicmllZiBTdGFuZGFyZCB3aWRlLWNoYXJhY3RlciByZWd1bGFyIGV4cHJlc3Npb25zLiAqLworICB0eXBlZGVmIGJhc2ljX3JlZ2V4PHdjaGFyX3Q+IHdyZWdleDsKKyNlbmRpZgorCisKKyAgLy8gWzcuOC42XSBiYXNpY19yZWdleCBzd2FwCisgIC8qKgorICAgKiBAYnJpZWYgU3dhcHMgdGhlIGNvbnRlbnRzIG9mIHR3byByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0cy4KKyAgICogQHBhcmFtIF9fbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICogQHBhcmFtIF9fcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX2xocywKKwkgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKKworICAvLyBbNy45XSBDbGFzcyB0ZW1wbGF0ZSBzdWJfbWF0Y2gKKyAgLyoqCisgICAqIEEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBtYXRjaGVkIGJ5IGEgcGFydGljdWxhciBtYXJrZWQgc3ViLWV4cHJlc3Npb24uCisgICAqCisgICAqIEFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGVzc2VudGlhbGx5IGEgcGFpciBvZiBpdGVyYXRvcnMgbWFya2luZyBhCisgICAqIG1hdGNoZWQgc3ViZXhwcmVzc2lvbiB3aXRoaW4gYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBtYXRjaC4gU3VjaAorICAgKiBvYmplY3RzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYW5kIGNvbXBhcmVkIHdpdGggc3RkOjpiYXNpY19zdHJpbmcgb2JqZWN0cworICAgKiBvZiBhIHNpbWlsYXIgYmFzZSBjaGFyYWN0ZXIgdHlwZSBhcyB0aGUgcGF0dGVybiBtYXRjaGVkIGJ5IHRoZSByZWd1bGFyCisgICAqIGV4cHJlc3Npb24uCisgICAqCisgICAqIFRoZSBpdGVyYXRvcnMgdGhhdCBtYWtlIHVwIHRoZSBwYWlyIGFyZSB0aGUgdXN1YWwgaGFsZi1vcGVuIGludGVydmFsCisgICAqIHJlZmVyZW5jaW5nIHRoZSBhY3R1YWwgb3JpZ2luYWwgcGF0dGVybiBtYXRjaGVkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBjbGFzcyBzdWJfbWF0Y2ggOiBwdWJsaWMgc3RkOjpwYWlyPF9CaUl0ZXIsIF9CaUl0ZXI+CisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0JpSXRlcj4JCQlfX2l0ZXJfdHJhaXRzOworCQorICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pdGVyX3RyYWl0czo6dmFsdWVfdHlwZSAgICAgIAl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2l0ZXJfdHJhaXRzOjpkaWZmZXJlbmNlX3R5cGUgCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0JpSXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfc3RyaW5nPHZhbHVlX3R5cGU+ICAgICAgICAgICAgIHN0cmluZ190eXBlOworCisgICAgICBib29sIG1hdGNoZWQ7CisgICAgICAKKyAgICAgIGNvbnN0ZXhwciBzdWJfbWF0Y2goKSA6IG1hdGNoZWQoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoaW5nIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICBkaWZmZXJlbmNlX3R5cGUKKyAgICAgIGxlbmd0aCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5tYXRjaGVkID8gc3RkOjpkaXN0YW5jZSh0aGlzLT5maXJzdCwgdGhpcy0+c2Vjb25kKSA6IDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbWF0Y2hpbmcgc2VxdWVuY2UgYXMgYSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdGhlIG1hdGNoaW5nIHNlcXVlbmNlIGFzIGEgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqIFRoaXMgaXMgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gb3BlcmF0b3IuICBJdCBpcyBpZGVudGljYWwgdG8gdGhlCisgICAgICAgKiBzdHIoKSBtZW1iZXIgZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgd2lsbCB3YW50IHRvIHBvcCB1cCBpbgorICAgICAgICogdW5leHBlY3RlZCBwbGFjZXMgYW5kIGNhdXNlIGEgZ3JlYXQgZGVhbCBvZiBjb25mdXNpb24gYW5kIGN1cnNpbmcKKyAgICAgICAqIGZyb20gdGhlIHVud2FyeS4KKyAgICAgICAqLworICAgICAgb3BlcmF0b3Igc3RyaW5nX3R5cGUoKSBjb25zdAorICAgICAgeworCXJldHVybiB0aGlzLT5tYXRjaGVkCisJICA/IHN0cmluZ190eXBlKHRoaXMtPmZpcnN0LCB0aGlzLT5zZWNvbmQpCisJICA6IHN0cmluZ190eXBlKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG1hdGNoaW5nIHNlcXVlbmNlIGFzIGEgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRoZSBtYXRjaGluZyBzZXF1ZW5jZSBhcyBhIHN0cmluZy4KKyAgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIHN0cigpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRoaXMtPm1hdGNoZWQKKwkgID8gc3RyaW5nX3R5cGUodGhpcy0+Zmlyc3QsIHRoaXMtPnNlY29uZCkKKwkgIDogc3RyaW5nX3R5cGUoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdGhpcyBhbmQgYW5vdGhlciBtYXRjaGVkIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3MgQW5vdGhlciBtYXRjaGVkIHNlcXVlbmNlIHRvIGNvbXBhcmUgdG8gdGhpcyBvbmUuCisgICAgICAgKgorICAgICAgICogQHJldHZhbCA8MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2Ugd2lsbCBjb2xsYXRlIGJlZm9yZSBAcCBfX3MuCisgICAgICAgKiBAcmV0dmFsID0wIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSBpcyBlcXVpdmFsZW50IHRvIEBwIF9fcy4KKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBhZnRlciBAcCBfX3MuCisgICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShjb25zdCBzdWJfbWF0Y2gmIF9fcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnN0cigpLmNvbXBhcmUoX19zLnN0cigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyB0aGlzIHN1Yl9tYXRjaCB0byBhIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19zIEEgc3RyaW5nIHRvIGNvbXBhcmUgdG8gdGhpcyBzdWJfbWF0Y2guCisgICAgICAgKgorICAgICAgICogQHJldHZhbCA8MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2Ugd2lsbCBjb2xsYXRlIGJlZm9yZSBAcCBfX3MuCisgICAgICAgKiBAcmV0dmFsID0wIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSBpcyBlcXVpdmFsZW50IHRvIEBwIF9fcy4KKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBhZnRlciBAcCBfX3MuCisgICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShjb25zdCBzdHJpbmdfdHlwZSYgX19zKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+c3RyKCkuY29tcGFyZShfX3MpOyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbXBhcmVzIHRoaXMgc3ViX21hdGNoIHRvIGEgQy1zdHlsZSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcyBBIEMtc3R5bGUgc3RyaW5nIHRvIGNvbXBhcmUgdG8gdGhpcyBzdWJfbWF0Y2guCisgICAgICAgKgorICAgICAgICogQHJldHZhbCA8MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2Ugd2lsbCBjb2xsYXRlIGJlZm9yZSBAcCBfX3MuCisgICAgICAgKiBAcmV0dmFsID0wIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSBpcyBlcXVpdmFsZW50IHRvIEBwIF9fcy4KKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBhZnRlciBAcCBfX3MuCisgICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShjb25zdCB2YWx1ZV90eXBlKiBfX3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5zdHIoKS5jb21wYXJlKF9fcyk7IH0KKyAgICB9OworICAKKyAgCisgIC8qKiBAYnJpZWYgU3RhbmRhcmQgcmVnZXggc3VibWF0Y2ggb3ZlciBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gKi8KKyAgdHlwZWRlZiBzdWJfbWF0Y2g8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNzdWJfbWF0Y2g7CisKKyAgLyoqIEBicmllZiBTdGFuZGFyZCByZWdleCBzdWJtYXRjaCBvdmVyIGEgc3RhbmRhcmQgc3RyaW5nLiAqLworICB0eXBlZGVmIHN1Yl9tYXRjaDxzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiAgc3N1Yl9tYXRjaDsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8qKiBAYnJpZWYgUmVnZXggc3VibWF0Y2ggb3ZlciBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLiAqLworICB0eXBlZGVmIHN1Yl9tYXRjaDxjb25zdCB3Y2hhcl90Kj4gICAgICAgICAgd2NzdWJfbWF0Y2g7CisKKyAgLyoqIEBicmllZiBSZWdleCBzdWJtYXRjaCBvdmVyIGEgc3RhbmRhcmQgd2lkZSBzdHJpbmcuICovCisgIHR5cGVkZWYgc3ViX21hdGNoPHdzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiB3c3N1Yl9tYXRjaDsKKyNlbmRpZgorCisgIC8vIFs3LjkuMl0gc3ViX21hdGNoIG5vbi1tZW1iZXIgb3BlcmF0b3JzCisgIAorICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBfX2xocyBGaXJzdCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLCBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID09IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIHR3byByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2hlcy4KKyAgICogQHBhcmFtIF9fbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgIGlzIG5vdCBlcXVpdmFsZW50IHRvIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLCBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpICE9IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBfX2xocyBGaXJzdCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIHByZWNlZGVzIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19saHMsIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPCAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gX19saHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgU2Vjb25kIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBkb2VzIG5vdCBzdWNjZWVkIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLCBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpIDw9IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBfX2xocyBGaXJzdCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaUl0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19saHMsIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPj0gMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIHR3byByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2hlcy4KKyAgICogQHBhcmFtIF9fbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgc3VjY2VlZHMgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaUl0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX2xocywgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+IDA7IH0KKworICAvLyBBbGlhcyBmb3Igc3ViX21hdGNoJ2Qgc3RyaW5nLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIHVzaW5nIF9fc3ViX21hdGNoX3N0cmluZyA9IGJhc2ljX3N0cmluZzwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+OworCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiAgICAgICAgc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX2xocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIF9fcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX3N1Yl9tYXRjaF9zdHJpbmc8X0JpX2l0ZXIsIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzLmNfc3RyKCkpID09IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiAgICAgICAgc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX2xocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIF9fcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzICBpcyBub3QgZXF1aXZhbGVudCB0byBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX19zdWJfbWF0Y2hfc3RyaW5nPF9CaV9pdGVyLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX2xocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIF9fcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIHByZWNlZGVzIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9fc3ViX21hdGNoX3N0cmluZzxfQmlfaXRlciwgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMuY19zdHIoKSkgPiAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3JocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBzdWNjZWVkcyBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfX3N1Yl9tYXRjaF9zdHJpbmc8X0JpX2l0ZXIsIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzIDwgX19saHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX2xocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIF9fcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9fc3ViX21hdGNoX3N0cmluZzxfQmlfaXRlciwgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX2xocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIF9fcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9fc3ViX21hdGNoX3N0cmluZzxfQmlfaXRlciwgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYQorICAgKiAgICAgICAgc3RyaW5nLgorICAgKiBAcGFyYW0gX19saHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBpcyBlcXVpdmFsZW50IHRvIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19zdWJfbWF0Y2hfc3RyaW5nPF9CaV9pdGVyLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzLmNfc3RyKCkpID09IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhCisgICAqICAgICAgICBzdHJpbmcuCisgICAqIEBwYXJhbSBfX2xocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIGlzIG5vdCBlcXVpdmFsZW50IHRvIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19zdWJfbWF0Y2hfc3RyaW5nPF9CaV9pdGVyLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgcHJlY2VkZXMgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCBjbGFzcyBfQ2hfdHJhaXRzLCBjbGFzcyBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgY29uc3QgX19zdWJfbWF0Y2hfc3RyaW5nPF9CaV9pdGVyLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzLmNfc3RyKCkpIDwgMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgc3VjY2VlZHMgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCBjbGFzcyBfQ2hfdHJhaXRzLCBjbGFzcyBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgY29uc3QgX19zdWJfbWF0Y2hfc3RyaW5nPF9CaV9pdGVyLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3JocyA8IF9fbGhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19saHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBkb2VzIG5vdCBwcmVjZWRlIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0NoX3RyYWl0cywgY2xhc3MgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19zdWJfbWF0Y2hfc3RyaW5nPF9CaV9pdGVyLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzIDwgX19yaHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19saHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBkb2VzIG5vdCBzdWNjZWVkIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0NoX3RyYWl0cywgY2xhc3MgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19zdWJfbWF0Y2hfc3RyaW5nPF9CaV9pdGVyLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fcmhzIDwgX19saHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSBDIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogICAgICAgIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSBDIHN0cmluZy4KKyAgICogQHBhcmFtIF9fcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID09IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGFuIGl0ZXJhdG9yIHZhbHVlIGFuZCBhIHJlZ3VsYXIKKyAgICogICAgICAgIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX2xocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIGlzIG5vdCBlcXVpdmFsZW50IHRvIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3JocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBwcmVjZWRlcyBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwodHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19saHMsCisJICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocykgPiAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3JocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBzdWNjZWVkcyBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19saHMsCisJICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMgPCBfX2xoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19yaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgZG9lcyBub3QgcHJlY2VkZSBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzIDwgX19yaHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3JocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBkb2VzIG5vdCBzdWNjZWVkIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYQorICAgKiAgICAgICAgc3RyaW5nLgorICAgKiBAcGFyYW0gX19saHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBBIHBvaW50ZXIgdG8gYSBzdHJpbmc/CisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgIGlzIGVxdWl2YWxlbnQgdG8gQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPT0gMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBwb2ludGVyIHRvIGEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIGlzIG5vdCBlcXVpdmFsZW50IHRvIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19saHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBwcmVjZWRlcyBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPCAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19saHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBzdWNjZWVkcyBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMgPCBfX2xoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgZG9lcyBub3QgcHJlY2VkZSBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzIDwgX19yaHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19saHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBkb2VzIG5vdCBzdWNjZWVkIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogICAgICAgIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3JocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBpcyBlcXVpdmFsZW50IHRvIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3ViX21hdGNoPF9CaV9pdGVyPjo6c3RyaW5nX3R5cGUgc3RyaW5nX3R5cGU7CisgICAgICByZXR1cm4gX19yaHMuY29tcGFyZShzdHJpbmdfdHlwZSgxLCBfX2xocykpID09IDA7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uCisgICAqICAgICAgICBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19yaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgaXMgbm90IGVxdWl2YWxlbnQgdG8gQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX2xocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIF9fcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIHByZWNlZGVzIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPCh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX2xocywKKwkgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN1Yl9tYXRjaDxfQmlfaXRlcj46OnN0cmluZ190eXBlIHN0cmluZ190eXBlOworICAgICAgcmV0dXJuIF9fcmhzLmNvbXBhcmUoc3RyaW5nX3R5cGUoMSwgX19saHMpKSA+IDA7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19yaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgc3VjY2VlZHMgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzIDwgX19saHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX2xocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIF9fcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA8IF9fcmhzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19yaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgZG9lcyBub3Qgc3VjY2VlZCBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fcmhzIDwgX19saHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBjb25zdCBzdHJpbmcgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fcmhzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3ViX21hdGNoPF9CaV9pdGVyPjo6c3RyaW5nX3R5cGUgc3RyaW5nX3R5cGU7CisgICAgICByZXR1cm4gX19saHMuY29tcGFyZShzdHJpbmdfdHlwZSgxLCBfX3JocykpID09IDA7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBjb25zdCBzdHJpbmcgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIGlzIG5vdCBlcXVpdmFsZW50IHRvIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19saHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgcHJlY2VkZXMgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fcmhzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3ViX21hdGNoPF9CaV9pdGVyPjo6c3RyaW5nX3R5cGUgc3RyaW5nX3R5cGU7CisgICAgICByZXR1cm4gX19saHMuY29tcGFyZShzdHJpbmdfdHlwZSgxLCBfX3JocykpIDwgMDsKKyAgICB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19saHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgc3VjY2VlZHMgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzIDwgX19saHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX2xocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fcmhzIEEgY29uc3Qgc3RyaW5nIHJlZmVyZW5jZS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBkb2VzIG5vdCBwcmVjZWRlIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX2xocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fcmhzIEEgY29uc3Qgc3RyaW5nIHJlZmVyZW5jZS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBkb2VzIG5vdCBzdWNjZWVkIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluc2VydHMgYSBtYXRjaGVkIHN0cmluZyBpbnRvIGFuIG91dHB1dCBzdHJlYW0uCisgICAqCisgICAqIEBwYXJhbSBfX29zIFRoZSBvdXRwdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX19tICBBIHN1Ym1hdGNoIHN0cmluZy4KKyAgICoKKyAgICogQHJldHVybnMgdGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3VibWF0Y2ggc3RyaW5nIGluc2VydGVkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZQorICAgIGJhc2ljX29zdHJlYW08X0NoX3R5cGUsIF9DaF90cmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hfdHlwZSwgX0NoX3RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbSkKKyAgICB7IHJldHVybiBfX29zIDw8IF9fbS5zdHIoKTsgfQorCisgIC8vIFs3LjEwXSBDbGFzcyB0ZW1wbGF0ZSBtYXRjaF9yZXN1bHRzCisKKyAgLyoKKyAgICogU3BlY2lhbCBzdWJfbWF0Y2ggb2JqZWN0IHJlcHJlc2VudGluZyBhbiB1bm1hdGNoZWQgc3ViLWV4cHJlc3Npb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYKKyAgICBfX3VubWF0Y2hlZF9zdWIoKQorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+IF9fdW5tYXRjaGVkID0gc3ViX21hdGNoPF9CaV9pdGVyPigpOworICAgICAgcmV0dXJuIF9fdW5tYXRjaGVkOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIFRoZSByZXN1bHRzIG9mIGEgbWF0Y2ggb3Igc2VhcmNoIG9wZXJhdGlvbi4KKyAgICoKKyAgICogQSBjb2xsZWN0aW9uIG9mIGNoYXJhY3RlciBzZXF1ZW5jZXMgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgYSByZWd1bGFyCisgICAqIGV4cHJlc3Npb24gbWF0Y2guICBTdG9yYWdlIGZvciB0aGUgY29sbGVjdGlvbiBpcyBhbGxvY2F0ZWQgYW5kIGZyZWVkIGFzCisgICAqIG5lY2Vzc2FyeSBieSB0aGUgbWVtYmVyIGZ1bmN0aW9ucyBvZiBjbGFzcyB0ZW1wbGF0ZSBtYXRjaF9yZXN1bHRzLgorICAgKgorICAgKiBUaGlzIGNsYXNzIHNhdGlzZmllcyB0aGUgU2VxdWVuY2UgcmVxdWlyZW1lbnRzLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdAorICAgKiBvbmx5IHRoZSBvcGVyYXRpb25zIGRlZmluZWQgZm9yIGEgY29uc3QtcXVhbGlmaWVkIFNlcXVlbmNlIGFyZSBzdXBwb3J0ZWQuCisgICAqCisgICAqIFRoZSBzdWJfbWF0Y2ggb2JqZWN0IHN0b3JlZCBhdCBpbmRleCAwIHJlcHJlc2VudHMgc3ViLWV4cHJlc3Npb24gMCwgaS5lLgorICAgKiB0aGUgd2hvbGUgbWF0Y2guIEluIHRoaXMgY2FzZSB0aGUgJXN1Yl9tYXRjaCBtZW1iZXIgbWF0Y2hlZCBpcyBhbHdheXMgdHJ1ZS4KKyAgICogVGhlIHN1Yl9tYXRjaCBvYmplY3Qgc3RvcmVkIGF0IGluZGV4IG4gZGVub3RlcyB3aGF0IG1hdGNoZWQgdGhlIG1hcmtlZAorICAgKiBzdWItZXhwcmVzc2lvbiBuIHdpdGhpbiB0aGUgbWF0Y2hlZCBleHByZXNzaW9uLiBJZiB0aGUgc3ViLWV4cHJlc3Npb24gbgorICAgKiBwYXJ0aWNpcGF0ZWQgaW4gYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggdGhlbiB0aGUgJXN1Yl9tYXRjaCBtZW1iZXIKKyAgICogbWF0Y2hlZCBldmFsdWF0ZXMgdG8gdHJ1ZSwgYW5kIG1lbWJlcnMgZmlyc3QgYW5kIHNlY29uZCBkZW5vdGUgdGhlIHJhbmdlCisgICAqIG9mIGNoYXJhY3RlcnMgW2ZpcnN0LCBzZWNvbmQpIHdoaWNoIGZvcm1lZCB0aGF0IG1hdGNoLiBPdGhlcndpc2UgbWF0Y2hlZAorICAgKiBpcyBmYWxzZSwgYW5kIG1lbWJlcnMgZmlyc3QgYW5kIHNlY29uZCBwb2ludCB0byB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZQorICAgKiB0aGF0IHdhcyBzZWFyY2hlZC4KKyAgICoKKyAgICogQG5vc3ViZ3JvdXBpbmcKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IGFsbG9jYXRvcjxzdWJfbWF0Y2g8X0JpX2l0ZXI+ID4gPgorICAgIGNsYXNzIG1hdGNoX3Jlc3VsdHMKKyAgICA6IHByaXZhdGUgc3RkOjp2ZWN0b3I8c3ViX21hdGNoPF9CaV9pdGVyPiwgX0FsbG9jPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgLyoKKyAgICAgICAqIFRoZSB2ZWN0b3IgYmFzZSBpcyBlbXB0eSBpZiB0aGlzIGRvZXMgbm90IHJlcHJlc2VudCBhIHN1Y2Nlc3NmdWwgbWF0Y2guCisgICAgICAgKiBPdGhlcndpc2UgaXQgY29udGFpbnMgbiszIGVsZW1lbnRzIHdoZXJlIG4gaXMgdGhlIG51bWJlciBvZiBtYXJrZWQKKyAgICAgICAqIHN1Yi1leHByZXNzaW9uczoKKyAgICAgICAqIFswXSBlbnRpcmUgbWF0Y2gKKyAgICAgICAqIFsxXSAxc3QgbWFya2VkIHN1YmV4cHJlc3Npb24KKyAgICAgICAqIC4uLgorICAgICAgICogW25dIG50aCBtYXJrZWQgc3ViZXhwcmVzc2lvbgorICAgICAgICogW24rMV0gcHJlZml4CisgICAgICAgKiBbbisyXSBzdWZmaXgKKyAgICAgICAqLworICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdWJfbWF0Y2g8X0JpX2l0ZXI+LCBfQWxsb2M+ICAgICBfQmFzZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj4gICAJICAgCSAgIF9faXRlcl90cmFpdHM7CisgICAgICB0eXBlZGVmIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlCQkgICBtYXRjaF9mbGFnX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLj8gUHVibGljIFR5cGVzCisgICAgICAgKi8KKyAgICAgIC8vQHsKKyAgICAgIHR5cGVkZWYgX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHN1Yl9tYXRjaDxfQmlfaXRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3RfcmVmZXJlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXRlcl90cmFpdHM6OmRpZmZlcmVuY2VfdHlwZQkgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXRlcl90cmFpdHM6OnZhbHVlX3R5cGUgCSAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+OjpzaXplX3R5cGUgc2l6ZV90eXBlOworCisKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiAgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisgICAgICAvL0B9CisgIAorICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgMjguMTAuMSBDb25zdHJ1Y3Rpb24sIENvcHlpbmcsIGFuZCBEZXN0cnVjdGlvbgorICAgICAgICovCisgICAgICAvL0B7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBkZWZhdWx0ICVtYXRjaF9yZXN1bHRzIGNvbnRhaW5lci4KKyAgICAgICAqIEBwb3N0IHNpemUoKSByZXR1cm5zIDAgYW5kIHN0cigpIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbWF0Y2hfcmVzdWx0cyhjb25zdCBfQWxsb2MmIF9fYSA9IF9BbGxvYygpKQorICAgICAgOiBfQmFzZV90eXBlKF9fYSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5IGNvbnN0cnVjdHMgYSAlbWF0Y2hfcmVzdWx0cy4KKyAgICAgICAqLworICAgICAgbWF0Y2hfcmVzdWx0cyhjb25zdCBtYXRjaF9yZXN1bHRzJiBfX3JocykKKyAgICAgIDogX0Jhc2VfdHlwZShfX3JocykKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBNb3ZlIGNvbnN0cnVjdHMgYSAlbWF0Y2hfcmVzdWx0cy4KKyAgICAgICAqLworICAgICAgbWF0Y2hfcmVzdWx0cyhtYXRjaF9yZXN1bHRzJiYgX19yaHMpIG5vZXhjZXB0CisgICAgICA6IF9CYXNlX3R5cGUoc3RkOjptb3ZlKF9fcmhzKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIHJocyB0byAqdGhpcy4KKyAgICAgICAqLworICAgICAgbWF0Y2hfcmVzdWx0cyYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBtYXRjaF9yZXN1bHRzJiBfX3JocykKKyAgICAgIHsKKwltYXRjaF9yZXN1bHRzKF9fcmhzKS5zd2FwKCp0aGlzKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIE1vdmUtYXNzaWducyByaHMgdG8gKnRoaXMuCisgICAgICAgKi8KKyAgICAgIG1hdGNoX3Jlc3VsdHMmCisgICAgICBvcGVyYXRvcj0obWF0Y2hfcmVzdWx0cyYmIF9fcmhzKQorICAgICAgeworCW1hdGNoX3Jlc3VsdHMoc3RkOjptb3ZlKF9fcmhzKSkuc3dhcCgqdGhpcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEZXN0cm95cyBhICVtYXRjaF9yZXN1bHRzIG9iamVjdC4KKyAgICAgICAqLworICAgICAgfm1hdGNoX3Jlc3VsdHMoKQorICAgICAgeyB9CisgICAgICAKKyAgICAgIC8vQH0KKworICAgICAgLy8gMjguMTAuMiwgc3RhdGU6CisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbmRpY2F0ZXMgaWYgdGhlICVtYXRjaF9yZXN1bHRzIGlzIHJlYWR5LgorICAgICAgICogQHJldHZhbCB0cnVlICAgVGhlIG9iamVjdCBoYXMgYSBmdWxseS1lc3RhYmxpc2hlZCByZXN1bHQgc3RhdGUuCisgICAgICAgKiBAcmV0dmFsIGZhbHNlICBUaGUgb2JqZWN0IGlzIG5vdCByZWFkeS4KKyAgICAgICAqLworICAgICAgYm9vbCByZWFkeSgpIGNvbnN0IHsgcmV0dXJuICFfQmFzZV90eXBlOjplbXB0eSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgMjguMTAuMiBTaXplCisgICAgICAgKi8KKyAgICAgIC8vQHsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbnVtYmVyIG9mIG1hdGNoZXMgYW5kIHN1Ym1hdGNoZXMuCisgICAgICAgKgorICAgICAgICogVGhlIG51bWJlciBvZiBtYXRjaGVzIGZvciBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aWxsIGJlIGVpdGhlciAwCisgICAgICAgKiBpZiB0aGVyZSB3YXMgbm8gbWF0Y2ggb3IgbWFya19jb3VudCgpICsgMSBpZiBhIG1hdGNoIHdhcyBzdWNjZXNzZnVsLgorICAgICAgICogU29tZSBtYXRjaGVzIG1heSBiZSBlbXB0eS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1hdGNoZXMgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7CisgICAgICAJc2l6ZV90eXBlIF9fc2l6ZSA9IF9CYXNlX3R5cGU6OnNpemUoKTsKKyAgICAgIAlyZXR1cm4gKF9fc2l6ZSAmJiBfQmFzZV90eXBlOjpvcGVyYXRvcltdKDApLm1hdGNoZWQpID8gX19zaXplIC0gMiA6IDA7CisgICAgICB9CisgICAgICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2VfdHlwZTo6bWF4X3NpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbmRpY2F0ZXMgaWYgdGhlICVtYXRjaF9yZXN1bHRzIGNvbnRhaW5zIG5vIHJlc3VsdHMuCisgICAgICAgKiBAcmV0dmFsIHRydWUgVGhlICVtYXRjaF9yZXN1bHRzIG9iamVjdCBpcyBlbXB0eS4KKyAgICAgICAqIEByZXR2YWwgZmFsc2UgVGhlICVtYXRjaF9yZXN1bHRzIG9iamVjdCBpcyBub3QgZW1wdHkuCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisgICAgICAKKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiBAbmFtZSAxMC4zIEVsZW1lbnQgQWNjZXNzCisgICAgICAgKi8KKyAgICAgIC8vQHsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRpY2F0ZWQgc3VibWF0Y2guCisgICAgICAgKiBAcGFyYW0gX19zdWIgaW5kaWNhdGVzIHRoZSBzdWJtYXRjaC4KKyAgICAgICAqIEBwcmUgICByZWFkeSgpID09IHRydWUKKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgaW5kaWNhdGVkIHN1Ym1hdGNoLCBvciB0aGUKKyAgICAgICAqIGxlbmd0aCBvZiB0aGUgZW50aXJlIG1hdGNoIGlmIEBwIF9fc3ViIGlzIHplcm8gKHRoZSBkZWZhdWx0KS4KKyAgICAgICAqLworICAgICAgZGlmZmVyZW5jZV90eXBlCisgICAgICBsZW5ndGgoc2l6ZV90eXBlIF9fc3ViID0gMCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICgqdGhpcylbX19zdWJdLmxlbmd0aCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbmRpY2F0ZWQgc3VibWF0Y2guCisgICAgICAgKiBAcGFyYW0gX19zdWIgaW5kaWNhdGVzIHRoZSBzdWJtYXRjaC4KKyAgICAgICAqIEBwcmUgICByZWFkeSgpID09IHRydWUKKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhcmdldAorICAgICAgICogc2VxdWVuY2UgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3VibWF0Y2gsIHVubGVzcyB0aGUgdmFsdWUgb2YgQHAgX19zdWIKKyAgICAgICAqIGlzIHplcm8gKHRoZSBkZWZhdWx0KSwgaW4gd2hpY2ggY2FzZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9mZnNldAorICAgICAgICogZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YXJnZXQgc2VxdWVuY2UgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgICAqIG1hdGNoLgorICAgICAgICoKKyAgICAgICAqIFJldHVybnMgLTEgaWYgQHAgX19zdWIgaXMgb3V0IG9mIHJhbmdlLgorICAgICAgICovCisgICAgICBkaWZmZXJlbmNlX3R5cGUKKyAgICAgIHBvc2l0aW9uKHNpemVfdHlwZSBfX3N1YiA9IDApIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9fc3ViIDwgc2l6ZSgpID8gc3RkOjpkaXN0YW5jZSh0aGlzLT5wcmVmaXgoKS5maXJzdCwKKwkJCQkJICAgICAgKCp0aGlzKVtfX3N1Yl0uZmlyc3QpIDogLTE7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG1hdGNoIG9yIHN1Ym1hdGNoIGNvbnZlcnRlZCB0byBhIHN0cmluZyB0eXBlLgorICAgICAgICogQHBhcmFtIF9fc3ViIGluZGljYXRlcyB0aGUgc3VibWF0Y2guCisgICAgICAgKiBAcHJlICAgcmVhZHkoKSA9PSB0cnVlCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBzdWJtYXRjaCAob3IgbWF0Y2gsIGlmIEBwIF9fc3ViIGlzCisgICAgICAgKiB6ZXJvKSBleHRyYWN0ZWQgZnJvbSB0aGUgdGFyZ2V0IHJhbmdlIGFuZCBjb252ZXJ0ZWQgdG8gdGhlCisgICAgICAgKiBhc3NvY2lhdGVkIHN0cmluZyB0eXBlLgorICAgICAgICovCisgICAgICBzdHJpbmdfdHlwZQorICAgICAgc3RyKHNpemVfdHlwZSBfX3N1YiA9IDApIGNvbnN0CisgICAgICB7IHJldHVybiAoKnRoaXMpW19fc3ViXS5zdHIoKTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgJXN1Yl9tYXRjaCByZWZlcmVuY2UgZm9yIHRoZSBtYXRjaCBvciBzdWJtYXRjaC4KKyAgICAgICAqIEBwYXJhbSBfX3N1YiBpbmRpY2F0ZXMgdGhlIHN1Ym1hdGNoLgorICAgICAgICogQHByZSAgIHJlYWR5KCkgPT0gdHJ1ZQorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgaW5kaWNhdGVkIHN1Ym1hdGNoLCBvcgorICAgICAgICogdGhlIGVudGlyZSBtYXRjaCBpZiBAcCBfX3N1YiBpcyB6ZXJvLgorICAgICAgICoKKyAgICAgICAqIElmIEBwIF9fc3ViID49IHNpemUoKSB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhICVzdWJfbWF0Y2ggd2l0aCBhCisgICAgICAgKiBzcGVjaWFsIHZhbHVlIGluZGljYXRpbmcgbm8gc3VibWF0Y2guCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19zdWIpIGNvbnN0CisgICAgICB7IAorICAgICAgCV9HTElCQ1hYX0RFQlVHX0FTU0VSVCggcmVhZHkoKSApOworICAgICAgCXJldHVybiBfX3N1YiA8IHNpemUoKQorCSAgICAgICA/ICBfQmFzZV90eXBlOjpvcGVyYXRvcltdKF9fc3ViKQorCSAgICAgICA6IF9fdW5tYXRjaGVkX3N1YjxfQmlfaXRlcj4oKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhICVzdWJfbWF0Y2ggcmVwcmVzZW50aW5nIHRoZSBtYXRjaCBwcmVmaXguCisgICAgICAgKiBAcHJlICAgcmVhZHkoKSA9PSB0cnVlCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgJXN1Yl9tYXRjaCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZQorICAgICAgICogcGFydCBvZiB0aGUgdGFyZ2V0IHJhbmdlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZSB0YXJnZXQgcmFuZ2UgYW5kIHRoZQorICAgICAgICogc3RhcnQgb2YgdGhlIG1hdGNoLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHByZWZpeCgpIGNvbnN0CisgICAgICB7CisgICAgICAJX0dMSUJDWFhfREVCVUdfQVNTRVJUKCByZWFkeSgpICk7CisgICAgICAJcmV0dXJuICFlbXB0eSgpCisgICAgICAJICAgICAgID8gX0Jhc2VfdHlwZTo6b3BlcmF0b3JbXShfQmFzZV90eXBlOjpzaXplKCkgLSAyKQorCSAgICAgICA6IF9fdW5tYXRjaGVkX3N1YjxfQmlfaXRlcj4oKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhICVzdWJfbWF0Y2ggcmVwcmVzZW50aW5nIHRoZSBtYXRjaCBzdWZmaXguCisgICAgICAgKiBAcHJlICAgcmVhZHkoKSA9PSB0cnVlCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgJXN1Yl9tYXRjaCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZQorICAgICAgICogcGFydCBvZiB0aGUgdGFyZ2V0IHJhbmdlIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgbWF0Y2ggYW5kIHRoZSBlbmQgb2YKKyAgICAgICAqIHRoZSB0YXJnZXQgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgc3VmZml4KCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoIHJlYWR5KCkgKTsKKwlyZXR1cm4gIWVtcHR5KCkKKwkgICAgICAgPyBfQmFzZV90eXBlOjpvcGVyYXRvcltdKF9CYXNlX3R5cGU6OnNpemUoKSAtIDEpCisJICAgICAgIDogX191bm1hdGNoZWRfc3ViPF9CaV9pdGVyPigpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGFuIGl0ZXJhdG9yIHRvIHRoZSBzdGFydCBvZiB0aGUgJXN1Yl9tYXRjaCBjb2xsZWN0aW9uLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2VfdHlwZTo6YmVnaW4oKTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGFuIGl0ZXJhdG9yIHRvIHRoZSBzdGFydCBvZiB0aGUgJXN1Yl9tYXRjaCBjb2xsZWN0aW9uLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6OmNiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYW4gaXRlcmF0b3IgdG8gb25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiAhZW1wdHkoKSA/IF9CYXNlX3R5cGU6OmVuZCgpIC0gMiA6IF9CYXNlX3R5cGU6OmVuZCgpOyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYW4gaXRlcmF0b3IgdG8gb25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gZW5kKCk7IH0KKworICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLjQgRm9ybWF0dGluZworICAgICAgICoKKyAgICAgICAqIFRoZXNlIGZ1bmN0aW9ucyBwZXJmb3JtIGZvcm1hdHRlZCBzdWJzdGl0dXRpb24gb2YgdGhlIG1hdGNoZWQKKyAgICAgICAqIGNoYXJhY3RlciBzZXF1ZW5jZXMgaW50byB0aGVpciB0YXJnZXQuICBUaGUgZm9ybWF0IHNwZWNpZmllcnMgYW5kCisgICAgICAgKiBlc2NhcGUgc2VxdWVuY2VzIGFjY2VwdGVkIGJ5IHRoZXNlIGZ1bmN0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieQorICAgICAgICogdGhlaXIgQHAgZmxhZ3MgcGFyYW1ldGVyIGFzIGRvY3VtZW50ZWQgYWJvdmUuCisgICAgICAgKi8KKyAgICAgICAvL0B7CisKKyAgICAgIC8qKgorICAgICAgICogQHByZSAgIHJlYWR5KCkgPT0gdHJ1ZQorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRfaXRlcj4KKyAgICAgICAgX091dF9pdGVyCisgICAgICAgIGZvcm1hdChfT3V0X2l0ZXIgX19vdXQsIGNvbnN0IGNoYXJfdHlwZSogX19mbXRfZmlyc3QsCisJICAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19mbXRfbGFzdCwKKwkgICAgICAgbWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MgPSByZWdleF9jb25zdGFudHM6OmZvcm1hdF9kZWZhdWx0KSBjb25zdAorICAgICAgICB7IHJldHVybiBfX291dDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBwcmUgICByZWFkeSgpID09IHRydWUKKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX091dF9pdGVyLCB0eXBlbmFtZSBfU3QsIHR5cGVuYW1lIF9TYT4KKyAgICAgICAgX091dF9pdGVyCisgICAgICAgIGZvcm1hdChfT3V0X2l0ZXIgX19vdXQsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIF9TdCwgX1NhPiYgX19mbXQsCisJICAgICAgIG1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjpmb3JtYXRfZGVmYXVsdCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBmb3JtYXQoX19vdXQsIF9fZm10LmRhdGEoKSwgX19mbXQuZGF0YSgpICsgX19mbXQuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mbGFncyk7CisgICAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAcHJlICAgcmVhZHkoKSA9PSB0cnVlCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRfaXRlciwgdHlwZW5hbWUgX1N0LCB0eXBlbmFtZSBfU2E+CisgICAgICAgIGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIF9TdCwgX1NhPgorICAgICAgICBmb3JtYXQoY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgX1N0LCBfU2E+JiBfX2ZtdCwKKwkgICAgICAgbWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MgPSByZWdleF9jb25zdGFudHM6OmZvcm1hdF9kZWZhdWx0KSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgX1N0LCBfU2E+IF9fcmVzdWx0OworICAgICAgICAgIGZvcm1hdChzdGQ6OmJhY2tfaW5zZXJ0ZXIoX19yZXN1bHQpLCBfX2ZtdCwgX19mbGFncyk7CisgICAgICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQHByZSAgIHJlYWR5KCkgPT0gdHJ1ZQorICAgICAgICovCisgICAgICBzdHJpbmdfdHlwZQorICAgICAgZm9ybWF0KGNvbnN0IGNoYXJfdHlwZSogX19mbXQsCisJICAgICBtYXRjaF9mbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6Zm9ybWF0X2RlZmF1bHQpIGNvbnN0CisgICAgICB7CisgICAgICAgIHN0cmluZ190eXBlIF9fcmVzdWx0OworICAgICAgICBmb3JtYXQoc3RkOjpiYWNrX2luc2VydGVyKF9fcmVzdWx0KSwKKyAgICAgICAgICAgICAgIF9fZm10ICsgY2hhcl90cmFpdHM8Y2hhcl90eXBlPjo6bGVuZ3RoKF9fZm10KSwKKyAgICAgICAgICAgICAgIF9fZmxhZ3MpOworICAgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIC8vQH0gCisKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgMTAuNSBBbGxvY2F0b3IKKyAgICAgICAqLworICAgICAgLy9AeyAKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhIGNvcHkgb2YgdGhlIGFsbG9jYXRvci4KKyAgICAgICAqLworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2VfdHlwZTo6Z2V0X2FsbG9jYXRvcigpOyB9CisgICAgICAKKyAgICAgIC8vQH0gCisKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgMTAuNiBTd2FwCisgICAgICAgKi8KKyAgICAgICAvL0B7IAorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTd2FwcyB0aGUgY29udGVudHMgb2YgdHdvIG1hdGNoX3Jlc3VsdHMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobWF0Y2hfcmVzdWx0cyYgX190aGF0KQorICAgICAgeyBfQmFzZV90eXBlOjpzd2FwKF9fdGhhdCk7IH0KKyAgICAgIC8vQH0gCisgICAgICAKKyAgICBwcml2YXRlOgorICAgICAgZnJpZW5kIGNsYXNzIF9fZGV0YWlsOjpfU3BlY2lhbGl6ZWRSZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2M+OworICAgIH07CisgIAorICB0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNtYXRjaDsKKyAgdHlwZWRlZiBtYXRjaF9yZXN1bHRzPHN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICBzbWF0Y2g7CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdHlwZWRlZiBtYXRjaF9yZXN1bHRzPGNvbnN0IHdjaGFyX3QqPiAgICAgICAgICB3Y21hdGNoOworICB0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzbWF0Y2g7CisjZW5kaWYKKworICAvLyBtYXRjaF9yZXN1bHRzIGNvbXBhcmlzb25zCisgIC8qKgorICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvIG1hdGNoX3Jlc3VsdHMgZm9yIGVxdWFsaXR5LgorICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyByZWZlciB0byB0aGUgc2FtZSBtYXRjaCwKKyAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jPiYgX19tMSwKKwkgICAgICAgY29uc3QgbWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jPiYgX19tMikKKyAgICB7CisgICAgICBpZiAoX19tMS5yZWFkeSgpICE9IF9fbTIucmVhZHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFfX20xLnJlYWR5KCkpICAvLyBib3RoIGFyZSBub3QgcmVhZHkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBpZiAoX19tMS5lbXB0eSgpICE9IF9fbTIuZW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKF9fbTEuZW1wdHkoKSkgICAvLyBib3RoIGFyZSBlbXB0eQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIHJldHVybiBfX20xLnByZWZpeCgpID09IF9fbTIucHJlZml4KCkKKyAgICAgICAgJiYgX19tMS5zaXplKCkgPT0gX19tMi5zaXplKCkKKyAgICAgICAgJiYgc3RkOjplcXVhbChfX20xLmJlZ2luKCksIF9fbTEuZW5kKCksIF9fbTIuYmVnaW4oKSkKKyAgICAgICAgJiYgX19tMS5zdWZmaXgoKSA9PSBfX20yLnN1ZmZpeCgpOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIENvbXBhcmVzIHR3byBtYXRjaF9yZXN1bHRzIGZvciBpbmVxdWFsaXR5LgorICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBkbyBub3QgcmVmZXIgdG8gdGhlIHNhbWUgbWF0Y2gsCisgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvYz4mIF9fbTEsCisJICAgICAgIGNvbnN0IG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvYz4mIF9fbTIpCisgICAgeyByZXR1cm4gIShfX20xID09IF9fbTIpOyB9CisKKyAgLy8gWzcuMTAuNl0gbWF0Y2hfcmVzdWx0cyBzd2FwCisgIC8qKgorICAgKiBAYnJpZWYgU3dhcHMgdHdvIG1hdGNoIHJlc3VsdHMuCisgICAqIEBwYXJhbSBfX2xocyBBIG1hdGNoIHJlc3VsdC4KKyAgICogQHBhcmFtIF9fcmhzIEEgbWF0Y2ggcmVzdWx0LgorICAgKgorICAgKiBUaGUgY29udGVudHMgb2YgdGhlIHR3byBtYXRjaF9yZXN1bHRzIG9iamVjdHMgYXJlIHN3YXBwZWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChtYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2M+JiBfX2xocywKKwkgbWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCisgIC8vIFs3LjExLjJdIEZ1bmN0aW9uIHRlbXBsYXRlIHJlZ2V4X21hdGNoCisgIC8qKgorICAgKiBAbmFtZSBNYXRjaGluZywgU2VhcmNoaW5nLCBhbmQgUmVwbGFjaW5nCisgICAqLworICAvL0B7CisKKyAgLyoqCisgICAqIEBicmllZiBEZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIEBwIGUKKyAgICogYW5kIGFsbCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIFtmaXJzdCwgbGFzdCkuCisgICAqCisgICAqIEBwYXJhbSBfX3MgICAgIFN0YXJ0IG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBfX2UgICAgIE9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogQHBhcmFtIF9fbSAgICAgVGhlIG1hdGNoIHJlc3VsdHMuCisgICAqIEBwYXJhbSBfX3JlICAgIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBfX2ZsYWdzIENvbnRyb2xzIGhvdyB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQuCisgICAqCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCBleGlzdHMuCisgICAqIEByZXR2YWwgZmFsc2UgT3RoZXJ3aXNlLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKgorICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgYm9vbAorICAgIHJlZ2V4X21hdGNoKF9CaV9pdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLAorICAgICAgICAgICAgICAgIF9CaV9pdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lLAorICAgICAgICAgICAgICAgIG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvYz4mICAgICBfX20sCisgICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorICAgICAgICAgICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlICAgICAgICAgX19mbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsKKyAgICAgIF9fZGV0YWlsOjpfQXV0b21hdG9uUHRyIF9fYSA9IF9fcmUuX01fZ2V0X2F1dG9tYXRvbigpOworICAgICAgX19kZXRhaWw6Ol9BdXRvbWF0b246Ol9TaXplVCBfX3N6ID0gX19hLT5fTV9zdWJfY291bnQoKTsKKyAgICAgIF9fZGV0YWlsOjpfU3BlY2lhbGl6ZWRDdXJzb3I8X0JpX2l0ZXI+IF9fY3MoX19zLCBfX2UpOworICAgICAgX19kZXRhaWw6Ol9TcGVjaWFsaXplZFJlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvYz4gX19yKF9fc3osIF9fY3MsIF9fbSk7CisgICAgICBfX2RldGFpbDo6X0dyZXBfbWF0Y2hlciBfX21hdGNoZXIoX19jcywgX19yLCBfX2EsIF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9fbVswXS5tYXRjaGVkOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIEluZGljYXRlcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhbGwgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBbZmlyc3QsIGxhc3QpLgorICAgKgorICAgKiBAcGFyYW0gX19maXJzdCBCZWdpbm5pbmcgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogQHBhcmFtIF9fbGFzdCAgT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIHRvIG1hdGNoLgorICAgKiBAcGFyYW0gX19yZSAgICBUaGUgcmVndWxhciBleHByZXNzaW9uLgorICAgKiBAcGFyYW0gX19mbGFncyBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBib29sCisgICAgcmVnZXhfbWF0Y2goX0JpX2l0ZXIgX19maXJzdCwgX0JpX2l0ZXIgX19sYXN0LAorCQljb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fcmUsCisJCXJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyAKKyAgICAgIG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXI+IF9fd2hhdDsKKyAgICAgIHJldHVybiByZWdleF9tYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fd2hhdCwgX19yZSwgX19mbGFncyk7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtIF9fcyAgVGhlIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byBtYXRjaC4KKyAgICogQHBhcmFtIF9fbSAgVGhlIG1hdGNoIHJlc3VsdHMuCisgICAqIEBwYXJhbSBfX3JlIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBfX2YgIENvbnRyb2xzIGhvdyB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQuCisgICAqCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCBleGlzdHMuCisgICAqIEByZXR2YWwgZmFsc2UgT3RoZXJ3aXNlLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X21hdGNoKGNvbnN0IF9DaF90eXBlKiBfX3MsCisJCW1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NoX3R5cGUqLCBfQWxsb2M+JiBfX20sCisJCWNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mCisJCT0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X21hdGNoKF9fcywgX19zICsgX1J4X3RyYWl0czo6bGVuZ3RoKF9fcyksIF9fbSwgX19yZSwgX19mKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhIHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtIF9fcyAgICAgVGhlIHN0cmluZyB0byBtYXRjaC4KKyAgICogQHBhcmFtIF9fbSAgICAgVGhlIG1hdGNoIHJlc3VsdHMuCisgICAqIEBwYXJhbSBfX3JlICAgIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBfX2ZsYWdzIENvbnRyb2xzIGhvdyB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQuCisgICAqCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCBleGlzdHMuCisgICAqIEByZXR2YWwgZmFsc2UgT3RoZXJ3aXNlLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9tYXRjaChjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcywKKwkJbWF0Y2hfcmVzdWx0czx0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIAorCQlfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+Ojpjb25zdF9pdGVyYXRvciwgX0FsbG9jPiYgX19tLAorCQljb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fcmUsCisJCXJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfbWF0Y2goX19zLmJlZ2luKCksIF9fcy5lbmQoKSwgX19tLCBfX3JlLCBfX2ZsYWdzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5kaWNhdGVzIGlmIHRoZXJlIGlzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIEBwIGUKKyAgICogYW5kIGEgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gX19zICBUaGUgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIG1hdGNoLgorICAgKiBAcGFyYW0gX19yZSBUaGUgcmVndWxhciBleHByZXNzaW9uLgorICAgKiBAcGFyYW0gX19mICBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCBjbGFzcyBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfbWF0Y2goY29uc3QgX0NoX3R5cGUqIF9fcywKKwkJY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQlyZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2YKKwkJPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfbWF0Y2goX19zLCBfX3MgKyBfUnhfdHJhaXRzOjpsZW5ndGgoX19zKSwgX19yZSwgX19mKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5kaWNhdGVzIGlmIHRoZXJlIGlzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIEBwIGUKKyAgICogYW5kIGEgc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gX19zICAgICBbSU5dIFRoZSBzdHJpbmcgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBfX3JlICAgIFtJTl0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICogQHBhcmFtIF9fZmxhZ3MgW0lOXSBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9TdHJfYWxsb2NhdG9yLAorCSAgIHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfbWF0Y2goY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLCBfU3RyX2FsbG9jYXRvcj4mIF9fcywKKwkJY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQlyZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJCT0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X21hdGNoKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fcmUsIF9fZmxhZ3MpOyB9CisKKyAgLy8gWzcuMTEuM10gRnVuY3Rpb24gdGVtcGxhdGUgcmVnZXhfc2VhcmNoCisgIC8qKgorICAgKiBTZWFyY2hlcyBmb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aGluIGEgcmFuZ2UuCisgICAqIEBwYXJhbSBfX2ZpcnN0IFtJTl0gIFRoZSBzdGFydCBvZiB0aGUgc3RyaW5nIHRvIHNlYXJjaC4KKyAgICogQHBhcmFtIF9fbGFzdCAgW0lOXSAgT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgc3RyaW5nIHRvIHNlYXJjaC4KKyAgICogQHBhcmFtIF9fbSAgICAgW09VVF0gVGhlIG1hdGNoIHJlc3VsdHMuCisgICAqIEBwYXJhbSBfX3JlICAgIFtJTl0gIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICogQHBhcmFtIF9fZmxhZ3MgW0lOXSAgU2VhcmNoIHBvbGljeSBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcsIHRoZSBjb250ZW50IG9mICVtIGlzCisgICAqICAgICAgICAgICAgICAgdW5kZWZpbmVkLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKgorICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9zZWFyY2goX0JpX2l0ZXIgX19maXJzdCwgX0JpX2l0ZXIgX19sYXN0LAorCQkgbWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jPiYgX19tLAorCQkgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQkgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworICAvKioKKyAgICogU2VhcmNoZXMgZm9yIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIHJhbmdlLgorICAgKiBAcGFyYW0gX19maXJzdCBbSU5dICBUaGUgc3RhcnQgb2YgdGhlIHN0cmluZyB0byBzZWFyY2guCisgICAqIEBwYXJhbSBfX2xhc3QgIFtJTl0gIE9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIHN0cmluZyB0byBzZWFyY2guCisgICAqIEBwYXJhbSBfX3JlICAgIFtJTl0gIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICogQHBhcmFtIF9fZmxhZ3MgW0lOXSAgU2VhcmNoIHBvbGljeSBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEBkb2N0b2RvCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9zZWFyY2goX0JpX2l0ZXIgX19maXJzdCwgX0JpX2l0ZXIgX19sYXN0LAorCQkgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQkgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeworICAgICAgbWF0Y2hfcmVzdWx0czxfQmlfaXRlcj4gX193aGF0OworICAgICAgcmV0dXJuIHJlZ2V4X3NlYXJjaChfX2ZpcnN0LCBfX2xhc3QsIF9fd2hhdCwgX19yZSwgX19mbGFncyk7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgU2VhcmNoZXMgZm9yIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIEMtc3RyaW5nLgorICAgKiBAcGFyYW0gX19zIFtJTl0gIEEgQy1zdHJpbmcgdG8gc2VhcmNoIGZvciB0aGUgcmVnZXguCisgICAqIEBwYXJhbSBfX20gW09VVF0gVGhlIHNldCBvZiByZWdleCBtYXRjaGVzLgorICAgKiBAcGFyYW0gX19lIFtJTl0gIFRoZSByZWdleCB0byBzZWFyY2ggZm9yIGluIEBwIHMuCisgICAqIEBwYXJhbSBfX2YgW0lOXSAgVGhlIHNlYXJjaCBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcsIHRoZSBjb250ZW50IG9mICVtIGlzCisgICAqICAgICAgICAgICAgICAgdW5kZWZpbmVkLgorICAgKiBAZG9jdG9kbworICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGUsIGNsYXNzIF9BbGxvYywgY2xhc3MgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBfQ2hfdHlwZSogX19zLAorCQkgbWF0Y2hfcmVzdWx0czxjb25zdCBfQ2hfdHlwZSosIF9BbGxvYz4mIF9fbSwKKwkJIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19lLAorCQkgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mCisJCSA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7IHJldHVybiByZWdleF9zZWFyY2goX19zLCBfX3MgKyBfUnhfdHJhaXRzOjpsZW5ndGgoX19zKSwgX19tLCBfX2UsIF9fZik7IH0KKworICAvKioKKyAgICogQGJyaWVmIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSBDLXN0cmluZy4KKyAgICogQHBhcmFtIF9fcyBbSU5dICBUaGUgQy1zdHJpbmcgdG8gc2VhcmNoLgorICAgKiBAcGFyYW0gX19lIFtJTl0gIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICogQHBhcmFtIF9fZiBbSU5dICBTZWFyY2ggcG9saWN5IGZsYWdzLgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAcmV0dmFsIGZhbHNlIE5vIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQGRvY3RvZG8KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfc2VhcmNoKGNvbnN0IF9DaF90eXBlKiBfX3MsCisJCSBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZgorCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfc2VhcmNoKF9fcywgX19zICsgX1J4X3RyYWl0czo6bGVuZ3RoKF9fcyksIF9fZSwgX19mKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgU2VhcmNoZXMgZm9yIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIHN0cmluZy4KKyAgICogQHBhcmFtIF9fcyAgICAgW0lOXSAgVGhlIHN0cmluZyB0byBzZWFyY2guCisgICAqIEBwYXJhbSBfX2UgICAgIFtJTl0gIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICogQHBhcmFtIF9fZmxhZ3MgW0lOXSAgU2VhcmNoIHBvbGljeSBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEBkb2N0b2RvCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfU3RyaW5nX2FsbG9jYXRvciwKKwkgICB0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIF9DaF90cmFpdHMsCisJCSBfU3RyaW5nX2FsbG9jYXRvcj4mIF9fcywKKwkJIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19lLAorCQkgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfc2VhcmNoKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fZSwgX19mbGFncyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3MgW0lOXSAgQSBDKysgc3RyaW5nIHRvIHNlYXJjaCBmb3IgdGhlIHJlZ2V4LgorICAgKiBAcGFyYW0gX19tIFtPVVRdIFRoZSBzZXQgb2YgcmVnZXggbWF0Y2hlcy4KKyAgICogQHBhcmFtIF9fZSBbSU5dICBUaGUgcmVnZXggdG8gc2VhcmNoIGZvciBpbiBAcCBzLgorICAgKiBAcGFyYW0gX19mIFtJTl0gIFRoZSBzZWFyY2ggZmxhZ3MuCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEByZXR2YWwgZmFsc2UgTm8gbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLCB0aGUgY29udGVudCBvZiAlbSBpcworICAgKiAgICAgICAgICAgICAgIHVuZGVmaW5lZC4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYywKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9DaF90eXBlLAorCSAgIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9zZWFyY2goY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3MsCisJCSBtYXRjaF9yZXN1bHRzPHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwKKwkJIF9DaF90cmFpdHMsIF9DaF9hbGxvYz46OmNvbnN0X2l0ZXJhdG9yLCBfQWxsb2M+JiBfX20sCisJCSBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZgorCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfc2VhcmNoKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fbSwgX19lLCBfX2YpOyB9CisKKyAgLy8gc3RkIFsyOC4xMS40XSBGdW5jdGlvbiB0ZW1wbGF0ZSByZWdleF9yZXBsYWNlCisgIC8qKgorICAgKiBAZG9jdG9kbworICAgKiBAcGFyYW0gX19vdXQKKyAgICogQHBhcmFtIF9fZmlyc3QKKyAgICogQHBhcmFtIF9fbGFzdAorICAgKiBAcGFyYW0gX19lCisgICAqIEBwYXJhbSBfX2ZtdAorICAgKiBAcGFyYW0gX19mbGFncworICAgKgorICAgKiBAcmV0dXJucyBvdXQKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICoKKyAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0X2l0ZXIsIHR5cGVuYW1lIF9CaV9pdGVyLAorCSAgIHR5cGVuYW1lIF9SeF90cmFpdHMsIHR5cGVuYW1lIF9DaF90eXBlPgorICAgIGlubGluZSBfT3V0X2l0ZXIKKyAgICByZWdleF9yZXBsYWNlKF9PdXRfaXRlciBfX291dCwgX0JpX2l0ZXIgX19maXJzdCwgX0JpX2l0ZXIgX19sYXN0LAorCQkgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19lLAorCQkgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZT4mIF9fZm10LAorCQkgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7IHJldHVybiBfX291dDsgfQorCisgIC8qKgorICAgKiBAZG9jdG9kbworICAgKiBAcGFyYW0gX19zCisgICAqIEBwYXJhbSBfX2UKKyAgICogQHBhcmFtIF9fZm10CisgICAqIEBwYXJhbSBfX2ZsYWdzCisgICAqCisgICAqIEByZXR1cm5zIGEgY29weSBvZiBzdHJpbmcgQHAgcyB3aXRoIHJlcGxhY2VtZW50cy4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SeF90cmFpdHMsIHR5cGVuYW1lIF9DaF90eXBlPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoX3R5cGU+CisgICAgcmVnZXhfcmVwbGFjZShjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGU+JiBfX3MsCisJCSAgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX2UsCisJCSAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlPiYgX19mbXQsCisJCSAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQkgID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsKKyAgICAgIGJhc2ljX3N0cmluZzxfQ2hfdHlwZT4gX19yZXN1bHQ7CisgICAgICByZWdleF9yZXBsYWNlKHN0ZDo6YmFja19pbnNlcnRlcihfX3Jlc3VsdCksCisJCSAgICBfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX2UsIF9fZm10LCBfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgLy9AfQorCisgIC8vIHN0ZCBbMjguMTJdIENsYXNzIHRlbXBsYXRlIHJlZ2V4X2l0ZXJhdG9yCisgIC8qKgorICAgKiBBbiBpdGVyYXRvciBhZGFwdG9yIHRoYXQgd2lsbCBwcm92aWRlIHJlcGVhdGVkIGNhbGxzIG9mIHJlZ2V4X3NlYXJjaCBvdmVyIAorICAgKiBhIHJhbmdlIHVudGlsIG5vIG1vcmUgbWF0Y2hlcyByZW1haW4uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwKKwkgICB0eXBlbmFtZSBfQ2hfdHlwZSA9IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgdHlwZW5hbWUgX1J4X3RyYWl0cyA9IHJlZ2V4X3RyYWl0czxfQ2hfdHlwZT4gPgorICAgIGNsYXNzIHJlZ2V4X2l0ZXJhdG9yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+ICByZWdleF90eXBlOworICAgICAgdHlwZWRlZiBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyPiAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBQcm92aWRlcyBhIHNpbmd1bGFyIGl0ZXJhdG9yLCB1c2VmdWwgZm9yIGluZGljYXRpbmcKKyAgICAgICAqIG9uZS1wYXN0LXRoZS1lbmQgb2YgYSByYW5nZS4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3IoKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgJXJlZ2V4X2l0ZXJhdG9yLi4uCisgICAgICAgKiBAcGFyYW0gX19hICBbSU5dIFRoZSBzdGFydCBvZiBhIHRleHQgcmFuZ2UgdG8gc2VhcmNoLgorICAgICAgICogQHBhcmFtIF9fYiAgW0lOXSBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSB0ZXh0IHJhbmdlIHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSBfX3JlIFtJTl0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaC4KKyAgICAgICAqIEBwYXJhbSBfX20gIFtJTl0gUG9saWN5IGZsYWdzIGZvciBtYXRjaCBydWxlcy4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3IoX0JpX2l0ZXIgX19hLCBfQmlfaXRlciBfX2IsIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsCisJCSAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tCisJCSAgICAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgICAgICAvKioKKyAgICAgICAqIENvcHkgY29uc3RydWN0cyBhICVyZWdleF9pdGVyYXRvci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3IoY29uc3QgcmVnZXhfaXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBjb25zdCB2YWx1ZV90eXBlJgorICAgICAgb3BlcmF0b3IqKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBjb25zdCB2YWx1ZV90eXBlKgorICAgICAgb3BlcmF0b3ItPigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpOworICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIHRoZXNlIG1lbWJlcnMgYXJlIHNob3duIGZvciBleHBvc2l0aW9uIG9ubHk6CisgICAgICBfQmlfaXRlciAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjsKKyAgICAgIF9CaV9pdGVyICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgIGNvbnN0IHJlZ2V4X3R5cGUqICAgICAgICAgICAgICAgIHByZWdleDsKKyAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIGZsYWdzOworICAgICAgbWF0Y2hfcmVzdWx0czxfQmlfaXRlcj4gICAgICAgICAgbWF0Y2g7CisgICAgfTsKKyAgCisgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNyZWdleF9pdGVyYXRvcjsKKyAgdHlwZWRlZiByZWdleF9pdGVyYXRvcjxzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiAgc3JlZ2V4X2l0ZXJhdG9yOworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8Y29uc3Qgd2NoYXJfdCo+ICAgICAgICAgIHdjcmVnZXhfaXRlcmF0b3I7CisgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzcmVnZXhfaXRlcmF0b3I7CisjZW5kaWYKKworICAvLyBbNy4xMi4yXSBDbGFzcyB0ZW1wbGF0ZSByZWdleF90b2tlbl9pdGVyYXRvcgorICAvKioKKyAgICogSXRlcmF0ZXMgb3ZlciBzdWJtYXRjaGVzIGluIGEgcmFuZ2UgKG9yIEBhIHNwbGl0cyBhIHRleHQgc3RyaW5nKS4KKyAgICoKKyAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBpdGVyYXRvciBpcyB0byBlbnVtZXJhdGUgYWxsLCBvciBhbGwgc3BlY2lmaWVkLAorICAgKiBtYXRjaGVzIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIHRleHQgcmFuZ2UuICBUaGUgZGVyZWZlcmVuY2VkCisgICAqIHZhbHVlIG9mIGFuIGl0ZXJhdG9yIG9mIHRoaXMgY2xhc3MgaXMgYSBzdGQ6OnN1Yl9tYXRjaCBvYmplY3QuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwKKwkgICB0eXBlbmFtZSBfQ2hfdHlwZSA9IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgdHlwZW5hbWUgX1J4X3RyYWl0cyA9IHJlZ2V4X3RyYWl0czxfQ2hfdHlwZT4gPgorICAgIGNsYXNzIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+IHJlZ2V4X3R5cGU7CisgICAgICB0eXBlZGVmIHN1Yl9tYXRjaDxfQmlfaXRlcj4gICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3RzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiAKKyAgICAgICAqIEEgZGVmYXVsdC1jb25zdHJ1Y3RlZCAlcmVnZXhfdG9rZW5faXRlcmF0b3IgaXMgYSBzaW5ndWxhciBpdGVyYXRvcgorICAgICAgICogdGhhdCB3aWxsIGNvbXBhcmUgZXF1YWwgdG8gdGhlIG9uZS1wYXN0LXRoZS1lbmQgdmFsdWUgZm9yIGFueQorICAgICAgICogaXRlcmF0b3Igb2YgdGhlIHNhbWUgdHlwZS4KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLi4uCisgICAgICAgKiBAcGFyYW0gX19hICAgICAgICAgIFtJTl0gVGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSBfX2IgICAgICAgICAgW0lOXSBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSBfX3JlICAgICAgICAgW0lOXSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiBAcGFyYW0gX19zdWJtYXRjaCAgIFtJTl0gV2hpY2ggc3VibWF0Y2ggdG8gcmV0dXJuLiAgVGhlcmUgYXJlIHNvbWUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCB2YWx1ZXMgZm9yIHRoaXMgcGFyYW1ldGVyOgorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAtIC0xIGVhY2ggZW51bWVyYXRlZCBzdWJleHByZXNzaW9uIGRvZXMgTk9UCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAoYWthIGZpZWxkCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXR0aW5nKQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAtIDAgdGhlIGVudGlyZSBzdHJpbmcgbWF0Y2hpbmcgdGhlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZXhwcmVzc2lvbiBpcyByZXR1cm5lZCBmb3IgZWFjaCBtYXRjaAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgdGV4dC4KKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLSA+MCBlbnVtZXJhdGVzIG9ubHkgdGhlIGluZGljYXRlZAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmV4cHJlc3Npb24gZnJvbSBhIG1hdGNoIHdpdGhpbiB0aGUgdGV4dC4KKyAgICAgICAqIEBwYXJhbSBfX20gICAgICAgICAgW0lOXSBQb2xpY3kgZmxhZ3MgZm9yIG1hdGNoIHJ1bGVzLgorICAgICAgICoKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoX0JpX2l0ZXIgX19hLCBfQmlfaXRlciBfX2IsIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsCisJCQkgICBpbnQgX19zdWJtYXRjaCA9IDAsCisJCQkgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX20KKwkJCSAgID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLi4uCisgICAgICAgKiBAcGFyYW0gX19hICAgICAgICAgIFtJTl0gVGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSBfX2IgICAgICAgICAgW0lOXSBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSBfX3JlICAgICAgICAgW0lOXSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiBAcGFyYW0gX19zdWJtYXRjaGVzIFtJTl0gQSBsaXN0IG9mIHN1YmV4cHJlc3Npb25zIHRvIHJldHVybiBmb3IgZWFjaAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggd2l0aGluIHRoZSB0ZXh0LgorICAgICAgICogQHBhcmFtIF9fbSAgICAgICAgICBbSU5dIFBvbGljeSBmbGFncyBmb3IgbWF0Y2ggcnVsZXMuCisgICAgICAgKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF90b2tlbl9pdGVyYXRvcihfQmlfaXRlciBfX2EsIF9CaV9pdGVyIF9fYiwKKwkJCSAgIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsCisJCQkgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBfX3N1Ym1hdGNoZXMsCisJCQkgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX20KKwkJCSAgICAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuLi4KKyAgICAgICAqIEBwYXJhbSBfX2EgICAgICAgICAgW0lOXSBUaGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gc2VhcmNoLgorICAgICAgICogQHBhcmFtIF9fYiAgICAgICAgICBbSU5dIE9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIHRleHQgdG8gc2VhcmNoLgorICAgICAgICogQHBhcmFtIF9fcmUgICAgICAgICBbSU5dIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICAgICAqIEBwYXJhbSBfX3N1Ym1hdGNoZXMgW0lOXSBBIGxpc3Qgb2Ygc3ViZXhwcmVzc2lvbnMgdG8gcmV0dXJuIGZvciBlYWNoCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIHdpdGhpbiB0aGUgdGV4dC4KKyAgICAgICAqIEBwYXJhbSBfX20gICAgICAgICAgW0lOXSBQb2xpY3kgZmxhZ3MgZm9yIG1hdGNoIHJ1bGVzLgorICAgICAgIAorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfTm0+CisgICAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKF9CaV9pdGVyIF9fYSwgX0JpX2l0ZXIgX19iLAorCQkJICAgICBjb25zdCByZWdleF90eXBlJiBfX3JlLAorCQkJICAgICBjb25zdCBpbnQgKCZfX3N1Ym1hdGNoZXMpW19ObV0sCisJCQkgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fbQorCQkJICAgICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHkgY29uc3RydWN0cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBbSU5dIEEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yIHRvIGNvcHkuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoY29uc3QgcmVnZXhfdG9rZW5faXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhICVyZWdleF90b2tlbl9pdGVyYXRvciB0byBhbm90aGVyLgorICAgICAgICogQHBhcmFtIF9fcmhzIFtJTl0gQSAlcmVnZXhfdG9rZW5faXRlcmF0b3IgdG8gY29weS4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICByZWdleF90b2tlbl9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCByZWdleF90b2tlbl9pdGVyYXRvciYgX19yaHMpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyBhICVyZWdleF90b2tlbl9pdGVyYXRvciB0byBhbm90aGVyIGZvciBlcXVhbGl0eS4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbXBhcmVzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yIHRvIGFub3RoZXIgZm9yIGluZXF1YWxpdHkuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCByZWdleF90b2tlbl9pdGVyYXRvciYgX19yaHMpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEZXJlZmVyZW5jZXMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3QgdmFsdWVfdHlwZSYKKyAgICAgIG9wZXJhdG9yKigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZWxlY3RzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yIG1lbWJlci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICBjb25zdCB2YWx1ZV90eXBlKgorICAgICAgb3BlcmF0b3ItPigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbmNyZW1lbnRzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBQb3N0aW5jcmVtZW50cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICByZWdleF90b2tlbl9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpOworICAgICAgCisgICAgcHJpdmF0ZTogLy8gZGF0YSBtZW1iZXJzIGZvciBleHBvc2l0aW9uIG9ubHk6CisgICAgICB0eXBlZGVmIHJlZ2V4X2l0ZXJhdG9yPF9CaV9pdGVyLCBfQ2hfdHlwZSwgX1J4X3RyYWl0cz4gcG9zaXRpb25faXRlcmF0b3I7CisKKyAgICAgIHBvc2l0aW9uX2l0ZXJhdG9yIF9fcG9zaXRpb247CisgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX3Jlc3VsdDsKKyAgICAgIHZhbHVlX3R5cGUgICAgICAgIF9fc3VmZml4OworICAgICAgc3RkOjpzaXplX3QgICAgICAgX19uOworICAgICAgc3RkOjp2ZWN0b3I8aW50PiAgX19zdWJzOworICAgIH07CisKKyAgLyoqIEBicmllZiBUb2tlbiBpdGVyYXRvciBmb3IgQy1zdHlsZSBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5ncy4gKi8KKyAgdHlwZWRlZiByZWdleF90b2tlbl9pdGVyYXRvcjxjb25zdCBjaGFyKj4gICAgICAgICAgICAgY3JlZ2V4X3Rva2VuX2l0ZXJhdG9yOworCisgIC8qKiBAYnJpZWYgVG9rZW4gaXRlcmF0b3IgZm9yIHN0YW5kYXJkIHN0cmluZ3MuICovCisgIHR5cGVkZWYgcmVnZXhfdG9rZW5faXRlcmF0b3I8c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gIHNyZWdleF90b2tlbl9pdGVyYXRvcjsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8qKiBAYnJpZWYgVG9rZW4gaXRlcmF0b3IgZm9yIEMtc3R5bGUgTlVMTC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5ncy4gKi8KKyAgdHlwZWRlZiByZWdleF90b2tlbl9pdGVyYXRvcjxjb25zdCB3Y2hhcl90Kj4gICAgICAgICAgd2NyZWdleF90b2tlbl9pdGVyYXRvcjsKKworICAvKiogQGJyaWVmIFRva2VuIGl0ZXJhdG9yIGZvciBzdGFuZGFyZCB3aWRlLWNoYXJhY3RlciBzdHJpbmdzLiAqLworICB0eXBlZGVmIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yPHdzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiB3c3JlZ2V4X3Rva2VuX2l0ZXJhdG9yOworI2VuZGlmCisgIAorICAvL0B9IC8vIGdyb3VwIHJlZ2V4CitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9jb21waWxlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X2NvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlMDk0OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9jb21waWxlci5oCkBAIC0wLDAgKzEsMTExMCBAQAorLy8gY2xhc3MgdGVtcGxhdGUgcmVnZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiAgQGZpbGUgYml0cy9yZWdleF9jb21waWxlci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7cmVnZXh9CisgKi8KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZXRhaWwKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHJlZ2V4LWRldGFpbAorICAgKiBAeworICAgKi8KKworICAvLy8gQmFzZSBjbGFzcyBmb3Igc2Nhbm5lci4KKyAgc3RydWN0IF9TY2FubmVyX2Jhc2UKKyAgeworICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IF9TdGF0ZVQ7CisKKyAgICBzdGF0aWMgY29uc3RleHByIF9TdGF0ZVQgX1Nfc3RhdGVfYXRfc3RhcnQgICAgPSAxIDw8IDA7CisgICAgc3RhdGljIGNvbnN0ZXhwciBfU3RhdGVUIF9TX3N0YXRlX2luX2JyYWNlICAgID0gMSA8PCAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgX1N0YXRlVCBfU19zdGF0ZV9pbl9icmFja2V0ICA9IDEgPDwgMzsKKworICAgIHZpcnR1YWwgfl9TY2FubmVyX2Jhc2UoKSB7IH07CisgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBzdHJ1Y3QgX1NjYW5uZXIuIFNjYW5zIGFuIGlucHV0IHJhbmdlIGZvciByZWdleCB0b2tlbnMuCisgICAqCisgICAqIFRoZSAlX1NjYW5uZXIgY2xhc3MgaW50ZXJwcmV0cyB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gaW4KKyAgICogdGhlIGlucHV0IHJhbmdlIHBhc3NlZCB0byBpdHMgY29uc3RydWN0b3IgYXMgYSBzZXF1ZW5jZSBvZiBwYXJzZQorICAgKiB0b2tlbnMgcGFzc2VkIHRvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gY29tcGlsZXIuICBUaGUgc2VxdWVuY2UKKyAgICogb2YgdG9rZW5zIHByb3ZpZGVkIGRlcGVuZHMgb24gdGhlIGZsYWcgc2V0dGluZ3MgcGFzc2VkIHRvIHRoZQorICAgKiBjb25zdHJ1Y3RvcjogZGlmZmVyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbiBncmFtbWFycyB3aWxsIGludGVycHJldAorICAgKiB0aGUgc2FtZSBpbnB1dCBwYXR0ZXJuIGluIHN5bnRhY3RpY2FsbHkgZGlmZmVyZW50IHdheXMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBjbGFzcyBfU2Nhbm5lcjogcHVibGljIF9TY2FubmVyX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfSW5wdXRJdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSXRlcmF0b3JUOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3JUPjo6dmFsdWVfdHlwZSBfQ2hhclQ7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TdHJpbmdUOworICAgICAgdHlwZWRlZiByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSAgICAgICAgICAgICAgICAgICBfRmxhZ1Q7CisgICAgICB0eXBlZGVmIGNvbnN0IHN0ZDo6Y3R5cGU8X0NoYXJUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DdHlwZVQ7CisKKyAgICAgIC8vLyBUb2tlbiB0eXBlcyByZXR1cm5lZCBmcm9tIHRoZSBzY2FubmVyLgorICAgICAgZW51bSBfVG9rZW5UCisgICAgICB7CisJX1NfdG9rZW5fYW55Y2hhciwKKwlfU190b2tlbl9iYWNrcmVmLAorCV9TX3Rva2VuX2JyYWNrZXRfYmVnaW4sCisJX1NfdG9rZW5fYnJhY2tldF9lbmQsCisJX1NfdG9rZW5faW52ZXJzZV9jbGFzcywKKwlfU190b2tlbl9jaGFyX2NsYXNzX25hbWUsCisJX1NfdG9rZW5fY2xvc3VyZTAsCisJX1NfdG9rZW5fY2xvc3VyZTEsCisJX1NfdG9rZW5fY29sbGVsZW1fbXVsdGksCisJX1NfdG9rZW5fY29sbGVsZW1fc2luZ2xlLAorCV9TX3Rva2VuX2NvbGxzeW1ib2wsCisJX1NfdG9rZW5fY29tbWEsCisJX1NfdG9rZW5fZGFzaCwKKwlfU190b2tlbl9kdXBfY291bnQsCisJX1NfdG9rZW5fZW9mLAorCV9TX3Rva2VuX2VxdWl2X2NsYXNzX25hbWUsCisJX1NfdG9rZW5faW50ZXJ2YWxfYmVnaW4sCisJX1NfdG9rZW5faW50ZXJ2YWxfZW5kLAorCV9TX3Rva2VuX2xpbmVfYmVnaW4sCisJX1NfdG9rZW5fbGluZV9lbmQsCisJX1NfdG9rZW5fb3B0LAorCV9TX3Rva2VuX29yLAorCV9TX3Rva2VuX29yZF9jaGFyLAorCV9TX3Rva2VuX3F1b3RlZF9jaGFyLAorCV9TX3Rva2VuX3N1YmV4cHJfYmVnaW4sCisJX1NfdG9rZW5fc3ViZXhwcl9lbmQsCisJX1NfdG9rZW5fd29yZF9iZWdpbiwKKwlfU190b2tlbl93b3JkX2VuZCwKKwlfU190b2tlbl91bmtub3duCisgICAgICB9OworCisgICAgICBfU2Nhbm5lcihfSXRlcmF0b3JUIF9fYmVnaW4sIF9JdGVyYXRvclQgX19lbmQsIF9GbGFnVCBfX2ZsYWdzLAorCSAgICAgICBzdGQ6OmxvY2FsZSBfX2xvYykKKyAgICAgIDogX01fY3VycmVudChfX2JlZ2luKSAsIF9NX2VuZChfX2VuZCkgLCBfTV9mbGFncyhfX2ZsYWdzKSwKKyAgICAgICAgX01fY3R5cGUoc3RkOjp1c2VfZmFjZXQ8X0N0eXBlVD4oX19sb2MpKSwgX01fc3RhdGUoX1Nfc3RhdGVfYXRfc3RhcnQpCisgICAgICB7IF9NX2FkdmFuY2UoKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hZHZhbmNlKCk7CisKKyAgICAgIF9Ub2tlblQKKyAgICAgIF9NX3Rva2VuKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1clRva2VuOyB9CisKKyAgICAgIGNvbnN0IF9TdHJpbmdUJgorICAgICAgX01fdmFsdWUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VyVmFsdWU7IH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICBzdGQ6Om9zdHJlYW0mCisgICAgICBfTV9wcmludChzdGQ6Om9zdHJlYW0mKTsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2VhdF9lc2NhcGUoKTsKKworICAgICAgdm9pZAorICAgICAgX01fc2Nhbl9pbl9icmFjZSgpOworCisgICAgICB2b2lkCisgICAgICBfTV9zY2FuX2luX2JyYWNrZXQoKTsKKworICAgICAgdm9pZAorICAgICAgX01fZWF0X2NoYXJjbGFzcygpOworCisgICAgICB2b2lkCisgICAgICBfTV9lYXRfZXF1aXZjbGFzcygpOworCisgICAgICB2b2lkCisgICAgICBfTV9lYXRfY29sbHN5bWJvbCgpOworCisgICAgICBfSXRlcmF0b3JUICBfTV9jdXJyZW50OworICAgICAgX0l0ZXJhdG9yVCAgX01fZW5kOworICAgICAgX0ZsYWdUICAgICAgX01fZmxhZ3M7CisgICAgICBfQ3R5cGVUJiAgICBfTV9jdHlwZTsKKyAgICAgIF9Ub2tlblQgICAgIF9NX2N1clRva2VuOworICAgICAgX1N0cmluZ1QgICAgX01fY3VyVmFsdWU7CisgICAgICBfU3RhdGVUICAgICBfTV9zdGF0ZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfU2Nhbm5lcjxfSW5wdXRJdGVyYXRvcj46OgorICAgIF9NX2FkdmFuY2UoKQorICAgIHsKKyAgICAgIGlmIChfTV9jdXJyZW50ID09IF9NX2VuZCkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2VvZjsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIF9DaGFyVCBfX2MgPSAqX01fY3VycmVudDsKKyAgICAgIGlmIChfTV9zdGF0ZSAmIF9TX3N0YXRlX2luX2JyYWNrZXQpCisJeworCSAgX01fc2Nhbl9pbl9icmFja2V0KCk7CisJICByZXR1cm47CisJfQorICAgICAgaWYgKF9NX3N0YXRlICYgX1Nfc3RhdGVfaW5fYnJhY2UpCisJeworCSAgX01fc2Nhbl9pbl9icmFjZSgpOworCSAgcmV0dXJuOworCX0KKyNpZiAwCisgICAgICAvLyBUT0RPOiByZS1lbmFibGUgbGluZSBhbmNob3JzIHdoZW4gX01fYXNzZXJ0aW9uIGlzIGltcGxlbWVudGVkLgorICAgICAgLy8gU2VlIFBSIGxpYnN0ZGMrKy80NzcyNAorICAgICAgZWxzZSBpZiAoX01fc3RhdGUgJiBfU19zdGF0ZV9hdF9zdGFydCAmJiBfX2MgPT0gX01fY3R5cGUud2lkZW4oJ14nKSkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2xpbmVfYmVnaW47CisJICArK19NX2N1cnJlbnQ7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCckJykpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9saW5lX2VuZDsKKwkgICsrX01fY3VycmVudDsKKwkgIHJldHVybjsKKwl9CisjZW5kaWYKKyAgICAgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbignLicpKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fYW55Y2hhcjsKKwkgICsrX01fY3VycmVudDsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJyonKSkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2Nsb3N1cmUwOworCSAgKytfTV9jdXJyZW50OworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbignKycpKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fY2xvc3VyZTE7CisJICArK19NX2N1cnJlbnQ7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCd8JykpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9vcjsKKwkgICsrX01fY3VycmVudDsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJ1snKSkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2JyYWNrZXRfYmVnaW47CisJICBfTV9zdGF0ZSB8PSAoX1Nfc3RhdGVfaW5fYnJhY2tldCB8IF9TX3N0YXRlX2F0X3N0YXJ0KTsKKwkgICsrX01fY3VycmVudDsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJ1xcJykpCisJeworCSAgX01fZWF0X2VzY2FwZSgpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKCEoX01fZmxhZ3MgJiAocmVnZXhfY29uc3RhbnRzOjpiYXNpYyB8IHJlZ2V4X2NvbnN0YW50czo6Z3JlcCkpKQorCXsKKwkgIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJygnKSkKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fc3ViZXhwcl9iZWdpbjsKKwkgICAgICArK19NX2N1cnJlbnQ7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJyknKSkKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fc3ViZXhwcl9lbmQ7CisJICAgICAgKytfTV9jdXJyZW50OworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCd7JykpCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2ludGVydmFsX2JlZ2luOworCSAgICAgIF9NX3N0YXRlIHw9IF9TX3N0YXRlX2luX2JyYWNlOworCSAgICAgICsrX01fY3VycmVudDsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwl9CisKKyAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fb3JkX2NoYXI7CisgICAgICBfTV9jdXJWYWx1ZS5hc3NpZ24oMSwgX19jKTsKKyAgICAgICsrX01fY3VycmVudDsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX1NjYW5uZXI8X0lucHV0SXRlcmF0b3I+OjoKKyAgICBfTV9zY2FuX2luX2JyYWNlKCkKKyAgICB7CisgICAgICBpZiAoX01fY3R5cGUuaXMoX0N0eXBlVDo6ZGlnaXQsICpfTV9jdXJyZW50KSkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2R1cF9jb3VudDsKKwkgIF9NX2N1clZhbHVlLmFzc2lnbigxLCAqX01fY3VycmVudCk7CisJICArK19NX2N1cnJlbnQ7CisJICB3aGlsZSAoX01fY3VycmVudCAhPSBfTV9lbmQKKwkJICYmIF9NX2N0eXBlLmlzKF9DdHlwZVQ6OmRpZ2l0LCAqX01fY3VycmVudCkpCisJICAgIHsKKwkgICAgICBfTV9jdXJWYWx1ZSArPSAqX01fY3VycmVudDsKKwkgICAgICArK19NX2N1cnJlbnQ7CisJICAgIH0KKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmICgqX01fY3VycmVudCA9PSBfTV9jdHlwZS53aWRlbignLCcpKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fY29tbWE7CisJICArK19NX2N1cnJlbnQ7CisJICByZXR1cm47CisJfQorICAgICAgaWYgKF9NX2ZsYWdzICYgKHJlZ2V4X2NvbnN0YW50czo6YmFzaWMgfCByZWdleF9jb25zdGFudHM6OmdyZXApKQorCXsKKwkgIGlmICgqX01fY3VycmVudCA9PSBfTV9jdHlwZS53aWRlbignXFwnKSkKKwkgICAgX01fZWF0X2VzY2FwZSgpOworCX0KKyAgICAgIGVsc2UgCisJeworCSAgaWYgKCpfTV9jdXJyZW50ID09IF9NX2N0eXBlLndpZGVuKCd9JykpCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2ludGVydmFsX2VuZDsKKwkgICAgICBfTV9zdGF0ZSAmPSB+X1Nfc3RhdGVfaW5fYnJhY2U7CisJICAgICAgKytfTV9jdXJyZW50OworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9TY2FubmVyPF9JbnB1dEl0ZXJhdG9yPjo6CisgICAgX01fc2Nhbl9pbl9icmFja2V0KCkKKyAgICB7CisgICAgICBpZiAoX01fc3RhdGUgJiBfU19zdGF0ZV9hdF9zdGFydCAmJiAqX01fY3VycmVudCA9PSBfTV9jdHlwZS53aWRlbignXicpKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5faW52ZXJzZV9jbGFzczsKKwkgIF9NX3N0YXRlICY9IH5fU19zdGF0ZV9hdF9zdGFydDsKKwkgICsrX01fY3VycmVudDsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmICgqX01fY3VycmVudCA9PSBfTV9jdHlwZS53aWRlbignWycpKQorCXsKKwkgICsrX01fY3VycmVudDsKKwkgIGlmIChfTV9jdXJyZW50ID09IF9NX2VuZCkKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fZW9mOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCisJICBpZiAoKl9NX2N1cnJlbnQgPT0gX01fY3R5cGUud2lkZW4oJy4nKSkKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fY29sbHN5bWJvbDsKKwkgICAgICBfTV9lYXRfY29sbHN5bWJvbCgpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgZWxzZSBpZiAoKl9NX2N1cnJlbnQgPT0gX01fY3R5cGUud2lkZW4oJzonKSkKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fY2hhcl9jbGFzc19uYW1lOworCSAgICAgIF9NX2VhdF9jaGFyY2xhc3MoKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIGVsc2UgaWYgKCpfTV9jdXJyZW50ID09IF9NX2N0eXBlLndpZGVuKCc9JykpCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2VxdWl2X2NsYXNzX25hbWU7CisJICAgICAgX01fZWF0X2VxdWl2Y2xhc3MoKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmICgqX01fY3VycmVudCA9PSBfTV9jdHlwZS53aWRlbignLScpKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fZGFzaDsKKwkgICsrX01fY3VycmVudDsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmICgqX01fY3VycmVudCA9PSBfTV9jdHlwZS53aWRlbignXScpKQorCXsKKwkgIGlmICghKF9NX2ZsYWdzICYgcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorCSAgICAgIHx8ICEoX01fc3RhdGUgJiBfU19zdGF0ZV9hdF9zdGFydCkpCisJICAgIHsKKwkgICAgICAvLyBzcGVjaWFsIGNhc2U6IG9ubHkgaWYgIF9ub3RfIGNociBmaXJzdCBhZnRlcgorCSAgICAgIC8vICdbJyBvciAnW14nIGFuZCBpZiBub3QgRUNNQXNjcmlwdAorCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fYnJhY2tldF9lbmQ7CisJICAgICAgKytfTV9jdXJyZW50OworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKyAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fY29sbGVsZW1fc2luZ2xlOworICAgICAgX01fY3VyVmFsdWUuYXNzaWduKDEsICpfTV9jdXJyZW50KTsKKyAgICAgICsrX01fY3VycmVudDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9TY2FubmVyPF9JbnB1dEl0ZXJhdG9yPjo6CisgICAgX01fZWF0X2VzY2FwZSgpCisgICAgeworICAgICAgKytfTV9jdXJyZW50OworICAgICAgaWYgKF9NX2N1cnJlbnQgPT0gX01fZW5kKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fZW9mOworCSAgcmV0dXJuOworCX0KKyAgICAgIF9DaGFyVCBfX2MgPSAqX01fY3VycmVudDsKKyAgICAgICsrX01fY3VycmVudDsKKworICAgICAgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbignKCcpKQorCXsKKwkgIGlmICghKF9NX2ZsYWdzICYgKHJlZ2V4X2NvbnN0YW50czo6YmFzaWMgfCByZWdleF9jb25zdGFudHM6OmdyZXApKSkKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fb3JkX2NoYXI7CisJICAgICAgX01fY3VyVmFsdWUuYXNzaWduKDEsIF9fYyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9zdWJleHByX2JlZ2luOworCX0KKyAgICAgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbignKScpKQorCXsKKwkgIGlmICghKF9NX2ZsYWdzICYgKHJlZ2V4X2NvbnN0YW50czo6YmFzaWMgfCByZWdleF9jb25zdGFudHM6OmdyZXApKSkKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fb3JkX2NoYXI7CisJICAgICAgX01fY3VyVmFsdWUuYXNzaWduKDEsIF9fYyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9zdWJleHByX2VuZDsKKwl9CisgICAgICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJ3snKSkKKwl7CisJICBpZiAoIShfTV9mbGFncyAmIChyZWdleF9jb25zdGFudHM6OmJhc2ljIHwgcmVnZXhfY29uc3RhbnRzOjpncmVwKSkpCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX29yZF9jaGFyOworCSAgICAgIF9NX2N1clZhbHVlLmFzc2lnbigxLCBfX2MpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2ludGVydmFsX2JlZ2luOworCSAgICAgIF9NX3N0YXRlIHw9IF9TX3N0YXRlX2luX2JyYWNlOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCd9JykpCisJeworCSAgaWYgKCEoX01fZmxhZ3MgJiAocmVnZXhfY29uc3RhbnRzOjpiYXNpYyB8IHJlZ2V4X2NvbnN0YW50czo6Z3JlcCkpKQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9vcmRfY2hhcjsKKwkgICAgICBfTV9jdXJWYWx1ZS5hc3NpZ24oMSwgX19jKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCEoX01fc3RhdGUgJiYgX1Nfc3RhdGVfaW5fYnJhY2UpKQorCQlfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYmFkYnJhY2UpOworCSAgICAgIF9NX3N0YXRlICY9IH5fU19zdGF0ZV9pbl9icmFjZTsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2ludGVydmFsX2VuZDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbigneCcpKQorCXsKKwkgICsrX01fY3VycmVudDsKKwkgIGlmIChfTV9jdXJyZW50ID09IF9NX2VuZCkKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fZW9mOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgaWYgKF9NX2N0eXBlLmlzKF9DdHlwZVQ6OmRpZ2l0LCAqX01fY3VycmVudCkpCisJICAgIHsKKwkgICAgICBfTV9jdXJWYWx1ZS5hc3NpZ24oMSwgKl9NX2N1cnJlbnQpOworCSAgICAgICsrX01fY3VycmVudDsKKwkgICAgICBpZiAoX01fY3VycmVudCA9PSBfTV9lbmQpCisJCXsKKwkJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2VvZjsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICBpZiAoX01fY3R5cGUuaXMoX0N0eXBlVDo6ZGlnaXQsICpfTV9jdXJyZW50KSkKKwkJeworCQkgIF9NX2N1clZhbHVlICs9ICpfTV9jdXJyZW50OworCQkgICsrX01fY3VycmVudDsKKwkJICByZXR1cm47CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbignXicpCisJICAgICAgIHx8IF9fYyA9PSBfTV9jdHlwZS53aWRlbignLicpCisJICAgICAgIHx8IF9fYyA9PSBfTV9jdHlwZS53aWRlbignKicpCisJICAgICAgIHx8IF9fYyA9PSBfTV9jdHlwZS53aWRlbignJCcpCisJICAgICAgIHx8IF9fYyA9PSBfTV9jdHlwZS53aWRlbignXFwnKSkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX29yZF9jaGFyOworCSAgX01fY3VyVmFsdWUuYXNzaWduKDEsIF9fYyk7CisJfQorICAgICAgZWxzZSBpZiAoX01fY3R5cGUuaXMoX0N0eXBlVDo6ZGlnaXQsIF9fYykpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9iYWNrcmVmOworCSAgX01fY3VyVmFsdWUuYXNzaWduKDEsIF9fYyk7CisJfQorICAgICAgZWxzZQorCV9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9lc2NhcGUpOworICAgIH0KKworCisgIC8vIEVhdHMgYSBjaGFyYWN0ZXIgY2xhc3Mgb3IgdGhyb3ducyBhbiBleGNlcHRpb24uCisgIC8vIGN1cnJlbnQgcG9pbnQgdG8gJzonIGRlbGltaXRlciBvbiBlbnRyeSwgY2hhciBhZnRlciAnXScgb24gcmV0dXJuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfU2Nhbm5lcjxfSW5wdXRJdGVyYXRvcj46OgorICAgIF9NX2VhdF9jaGFyY2xhc3MoKQorICAgIHsKKyAgICAgICsrX01fY3VycmVudDsgLy8gc2tpcCAnOicKKyAgICAgIGlmIChfTV9jdXJyZW50ID09IF9NX2VuZCkKKwlfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfY3R5cGUpOworICAgICAgZm9yIChfTV9jdXJWYWx1ZS5jbGVhcigpOworCSAgIF9NX2N1cnJlbnQgIT0gX01fZW5kICYmICpfTV9jdXJyZW50ICE9IF9NX2N0eXBlLndpZGVuKCc6Jyk7CisJICAgKytfTV9jdXJyZW50KQorCV9NX2N1clZhbHVlICs9ICpfTV9jdXJyZW50OworICAgICAgaWYgKF9NX2N1cnJlbnQgPT0gX01fZW5kKQorCV9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9jdHlwZSk7CisgICAgICArK19NX2N1cnJlbnQ7IC8vIHNraXAgJzonCisgICAgICBpZiAoKl9NX2N1cnJlbnQgIT0gX01fY3R5cGUud2lkZW4oJ10nKSkKKwlfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfY3R5cGUpOworICAgICAgKytfTV9jdXJyZW50OyAvLyBza2lwICddJworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfU2Nhbm5lcjxfSW5wdXRJdGVyYXRvcj46OgorICAgIF9NX2VhdF9lcXVpdmNsYXNzKCkKKyAgICB7CisgICAgICArK19NX2N1cnJlbnQ7IC8vIHNraXAgJz0nCisgICAgICBpZiAoX01fY3VycmVudCA9PSBfTV9lbmQpCisJX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2NvbGxhdGUpOworICAgICAgZm9yIChfTV9jdXJWYWx1ZS5jbGVhcigpOworCSAgIF9NX2N1cnJlbnQgIT0gX01fZW5kICYmICpfTV9jdXJyZW50ICE9IF9NX2N0eXBlLndpZGVuKCc9Jyk7CisJICAgKytfTV9jdXJyZW50KQorCV9NX2N1clZhbHVlICs9ICpfTV9jdXJyZW50OworICAgICAgaWYgKF9NX2N1cnJlbnQgPT0gX01fZW5kKQorCV9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9jb2xsYXRlKTsKKyAgICAgICsrX01fY3VycmVudDsgLy8gc2tpcCAnPScKKyAgICAgIGlmICgqX01fY3VycmVudCAhPSBfTV9jdHlwZS53aWRlbignXScpKQorCV9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9jb2xsYXRlKTsKKyAgICAgICsrX01fY3VycmVudDsgLy8gc2tpcCAnXScKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX1NjYW5uZXI8X0lucHV0SXRlcmF0b3I+OjoKKyAgICBfTV9lYXRfY29sbHN5bWJvbCgpCisgICAgeworICAgICAgKytfTV9jdXJyZW50OyAvLyBza2lwICcuJworICAgICAgaWYgKF9NX2N1cnJlbnQgPT0gX01fZW5kKQorCV9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9jb2xsYXRlKTsKKyAgICAgIGZvciAoX01fY3VyVmFsdWUuY2xlYXIoKTsKKwkgICBfTV9jdXJyZW50ICE9IF9NX2VuZCAmJiAqX01fY3VycmVudCAhPSBfTV9jdHlwZS53aWRlbignLicpOworCSAgICsrX01fY3VycmVudCkKKwlfTV9jdXJWYWx1ZSArPSAqX01fY3VycmVudDsKKyAgICAgIGlmIChfTV9jdXJyZW50ID09IF9NX2VuZCkKKwlfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfY29sbGF0ZSk7CisgICAgICArK19NX2N1cnJlbnQ7IC8vIHNraXAgJy4nCisgICAgICBpZiAoKl9NX2N1cnJlbnQgIT0gX01fY3R5cGUud2lkZW4oJ10nKSkKKwlfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfY29sbGF0ZSk7CisgICAgICArK19NX2N1cnJlbnQ7IC8vIHNraXAgJ10nCisgICAgfQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgc3RkOjpvc3RyZWFtJgorICAgIF9TY2FubmVyPF9JbnB1dEl0ZXJhdG9yPjo6CisgICAgX01fcHJpbnQoc3RkOjpvc3RyZWFtJiBvc3RyKQorICAgIHsKKyAgICAgIHN3aXRjaCAoX01fY3VyVG9rZW4pCisgICAgICB7CisJY2FzZSBfU190b2tlbl9hbnljaGFyOgorCSAgb3N0ciA8PCAiYW55LWNoYXJhY3RlclxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fYmFja3JlZjoKKwkgIG9zdHIgPDwgImJhY2tyZWZcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2JyYWNrZXRfYmVnaW46CisJICBvc3RyIDw8ICJicmFja2V0LWJlZ2luXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9icmFja2V0X2VuZDoKKwkgIG9zdHIgPDwgImJyYWNrZXQtZW5kXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9jaGFyX2NsYXNzX25hbWU6CisJICBvc3RyIDw8ICJjaGFyLWNsYXNzLW5hbWUgXCIiIDw8IF9NX2N1clZhbHVlIDw8ICJcIlxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fY2xvc3VyZTA6CisJICBvc3RyIDw8ICJjbG9zdXJlMFxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fY2xvc3VyZTE6CisJICBvc3RyIDw8ICJjbG9zdXJlMVxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fY29sbGVsZW1fbXVsdGk6CisJICBvc3RyIDw8ICJjb2xsLWVsZW0tbXVsdGkgXCIiIDw8IF9NX2N1clZhbHVlIDw8ICJcIlxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fY29sbGVsZW1fc2luZ2xlOgorCSAgb3N0ciA8PCAiY29sbC1lbGVtLXNpbmdsZSBcIiIgPDwgX01fY3VyVmFsdWUgPDwgIlwiXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9jb2xsc3ltYm9sOgorCSAgb3N0ciA8PCAiY29sbHN5bWJvbCBcIiIgPDwgX01fY3VyVmFsdWUgPDwgIlwiXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9jb21tYToKKwkgIG9zdHIgPDwgImNvbW1hXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9kYXNoOgorCSAgb3N0ciA8PCAiZGFzaFxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fZHVwX2NvdW50OgorCSAgb3N0ciA8PCAiZHVwIGNvdW50OiAiIDw8IF9NX2N1clZhbHVlIDw8ICJcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2VvZjoKKwkgIG9zdHIgPDwgIkVPRlxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fZXF1aXZfY2xhc3NfbmFtZToKKwkgIG9zdHIgPDwgImVxdWl2LWNsYXNzLW5hbWUgXCIiIDw8IF9NX2N1clZhbHVlIDw8ICJcIlxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5faW50ZXJ2YWxfYmVnaW46CisJICBvc3RyIDw8ICJpbnRlcnZhbCBiZWdpblxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5faW50ZXJ2YWxfZW5kOgorCSAgb3N0ciA8PCAiaW50ZXJ2YWwgZW5kXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9saW5lX2JlZ2luOgorCSAgb3N0ciA8PCAibGluZSBiZWdpblxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fbGluZV9lbmQ6CisJICBvc3RyIDw8ICJsaW5lIGVuZFxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fb3B0OgorCSAgb3N0ciA8PCAib3B0XG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9vcjoKKwkgIG9zdHIgPDwgIm9yXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9vcmRfY2hhcjoKKwkgIG9zdHIgPDwgIm9yZGluYXJ5IGNoYXJhY3RlcjogXCIiIDw8IF9NX3ZhbHVlKCkgPDwgIlwiXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9xdW90ZWRfY2hhcjoKKwkgIG9zdHIgPDwgInF1b3RlZCBjaGFyXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9zdWJleHByX2JlZ2luOgorCSAgb3N0ciA8PCAic3ViZXhwciBiZWdpblxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fc3ViZXhwcl9lbmQ6CisJICBvc3RyIDw8ICJzdWJleHByIGVuZFxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fd29yZF9iZWdpbjoKKwkgIG9zdHIgPDwgIndvcmQgYmVnaW5cbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX3dvcmRfZW5kOgorCSAgb3N0ciA8PCAid29yZCBlbmRcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX3Vua25vd246CisJICBvc3RyIDw8ICItLSB1bmtub3duIHRva2VuIC0tXG4iOworCSAgYnJlYWs7CisgICAgICB9CisgICAgICByZXR1cm4gb3N0cjsKKyAgICB9CisjZW5kaWYKKworICAvLy8gQnVpbGRzIGFuIE5GQSBmcm9tIGFuIGlucHV0IGl0ZXJhdG9yIGludGVydmFsLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBjbGFzcyBfQ29tcGlsZXIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfSW5JdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSXRlclQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9Jbkl0ZXI+Ojp2YWx1ZV90eXBlIF9DaGFyVDsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJUPiAgICAgICAgICAgICAgICAgICAgICAgICAgX1N0cmluZ1Q7CisgICAgICB0eXBlZGVmIHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlICAgICAgICAgICAgICAgIF9GbGFnVDsKKworICAgICAgX0NvbXBpbGVyKGNvbnN0IF9Jbkl0ZXImIF9fYiwgY29uc3QgX0luSXRlciYgX19lLAorCQlfVHJhaXRzVCYgX190cmFpdHMsIF9GbGFnVCBfX2ZsYWdzKTsKKworICAgICAgY29uc3QgX05mYSYKKyAgICAgIF9NX25mYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9zdGF0ZV9zdG9yZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX1NjYW5uZXI8X0luSXRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU2Nhbm5lclQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TY2FubmVyVDo6X1Rva2VuVCAgICAgICAgICAgICAgICAgICAgX1Rva2VuVDsKKyAgICAgIHR5cGVkZWYgc3RkOjpzdGFjazxfU3RhdGVTZXEsIHN0ZDo6dmVjdG9yPF9TdGF0ZVNlcT4gPiBfU3RhY2tUOworICAgICAgdHlwZWRlZiBfUmFuZ2VNYXRjaGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPiAgICAgICAgICAgICAgIF9STWF0Y2hlclQ7CisKKyAgICAgIC8vIGFjY2VwdHMgYSBzcGVjaWZpYyB0b2tlbiBvciByZXR1cm5zIGZhbHNlLgorICAgICAgYm9vbAorICAgICAgX01fbWF0Y2hfdG9rZW4oX1Rva2VuVCBfX3Rva2VuKTsKKworICAgICAgdm9pZAorICAgICAgX01fZGlzanVuY3Rpb24oKTsKKworICAgICAgYm9vbAorICAgICAgX01fYWx0ZXJuYXRpdmUoKTsKKworICAgICAgYm9vbAorICAgICAgX01fdGVybSgpOworCisgICAgICBib29sCisgICAgICBfTV9hc3NlcnRpb24oKTsKKworICAgICAgYm9vbAorICAgICAgX01fcXVhbnRpZmllcigpOworCisgICAgICBib29sCisgICAgICBfTV9hdG9tKCk7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2JyYWNrZXRfZXhwcmVzc2lvbigpOworCisgICAgICBib29sCisgICAgICBfTV9icmFja2V0X2xpc3QoX1JNYXRjaGVyVCYgX19tYXRjaGVyKTsKKworICAgICAgYm9vbAorICAgICAgX01fZm9sbG93X2xpc3QoX1JNYXRjaGVyVCYgX19tYXRjaGVyKTsKKworICAgICAgYm9vbAorICAgICAgX01fZm9sbG93X2xpc3QyKF9STWF0Y2hlclQmIF9fbWF0Y2hlcik7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2V4cHJlc3Npb25fdGVybShfUk1hdGNoZXJUJiBfX21hdGNoZXIpOworCisgICAgICBib29sCisgICAgICBfTV9yYW5nZV9leHByZXNzaW9uKF9STWF0Y2hlclQmIF9fbWF0Y2hlcik7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX3N0YXJ0X3JhbmdlKF9STWF0Y2hlclQmIF9fbWF0Y2hlcik7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2NvbGxhdGluZ19zeW1ib2woX1JNYXRjaGVyVCYgX19tYXRjaGVyKTsKKworICAgICAgYm9vbAorICAgICAgX01fZXF1aXZhbGVuY2VfY2xhc3MoX1JNYXRjaGVyVCYgX19tYXRjaGVyKTsKKworICAgICAgYm9vbAorICAgICAgX01fY2hhcmFjdGVyX2NsYXNzKF9STWF0Y2hlclQmIF9fbWF0Y2hlcik7CisKKyAgICAgIGludAorICAgICAgX01fY3VyX2ludF92YWx1ZShpbnQgX19yYWRpeCk7CisKKyAgICAgIF9UcmFpdHNUJiAgICAgIF9NX3RyYWl0czsKKyAgICAgIF9TY2FubmVyVCAgICAgIF9NX3NjYW5uZXI7CisgICAgICBfU3RyaW5nVCAgICAgICBfTV9jdXJfdmFsdWU7CisgICAgICBfTmZhICAgICAgICAgICBfTV9zdGF0ZV9zdG9yZTsKKyAgICAgIF9TdGFja1QgICAgICAgIF9NX3N0YWNrOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX0NvbXBpbGVyKGNvbnN0IF9Jbkl0ZXImIF9fYiwgY29uc3QgX0luSXRlciYgX19lLCBfVHJhaXRzVCYgX190cmFpdHMsCisJICAgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6X0ZsYWdUIF9fZmxhZ3MpCisgICAgOiBfTV90cmFpdHMoX190cmFpdHMpLCBfTV9zY2FubmVyKF9fYiwgX19lLCBfX2ZsYWdzLCBfTV90cmFpdHMuZ2V0bG9jKCkpLAorICAgICAgX01fc3RhdGVfc3RvcmUoX19mbGFncykKKyAgICB7CisgICAgICB0eXBlZGVmIF9TdGFydFRhZ2dlcjxfSW5JdGVyLCBfVHJhaXRzVD4gX1N0YXJ0OworICAgICAgdHlwZWRlZiBfRW5kVGFnZ2VyPF9Jbkl0ZXIsIF9UcmFpdHNUPiBfRW5kOworCisgICAgICBfU3RhdGVTZXEgX19yKF9NX3N0YXRlX3N0b3JlLAorICAgICAgCQkgICAgX01fc3RhdGVfc3RvcmUuX01faW5zZXJ0X3N1YmV4cHJfYmVnaW4oX1N0YXJ0KDApKSk7CisgICAgICBfTV9kaXNqdW5jdGlvbigpOworICAgICAgaWYgKCFfTV9zdGFjay5lbXB0eSgpKQorCXsKKwkgIF9fci5fTV9hcHBlbmQoX01fc3RhY2sudG9wKCkpOworCSAgX01fc3RhY2sucG9wKCk7CisJfQorICAgICAgX19yLl9NX2FwcGVuZChfTV9zdGF0ZV9zdG9yZS5fTV9pbnNlcnRfc3ViZXhwcl9lbmQoMCwgX0VuZCgwKSkpOworICAgICAgX19yLl9NX2FwcGVuZChfTV9zdGF0ZV9zdG9yZS5fTV9pbnNlcnRfYWNjZXB0KCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fbWF0Y2hfdG9rZW4oX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6X1Rva2VuVCB0b2tlbikKKyAgICB7IAorICAgICAgaWYgKHRva2VuID09IF9NX3NjYW5uZXIuX01fdG9rZW4oKSkKKwl7CisJICBfTV9jdXJfdmFsdWUgPSBfTV9zY2FubmVyLl9NX3ZhbHVlKCk7CisJICBfTV9zY2FubmVyLl9NX2FkdmFuY2UoKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgdm9pZAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX2Rpc2p1bmN0aW9uKCkKKyAgICB7CisgICAgICB0aGlzLT5fTV9hbHRlcm5hdGl2ZSgpOworICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fb3IpKQorCXsKKwkgIF9TdGF0ZVNlcSBfX2FsdDEgPSBfTV9zdGFjay50b3AoKTsgX01fc3RhY2sucG9wKCk7CisJICB0aGlzLT5fTV9kaXNqdW5jdGlvbigpOworCSAgX1N0YXRlU2VxIF9fYWx0MiA9IF9NX3N0YWNrLnRvcCgpOyBfTV9zdGFjay5wb3AoKTsKKwkgIF9NX3N0YWNrLnB1c2goX1N0YXRlU2VxKF9fYWx0MSwgX19hbHQyKSk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fYWx0ZXJuYXRpdmUoKQorICAgIHsKKyAgICAgIGlmICh0aGlzLT5fTV90ZXJtKCkpCisJeworCSAgX1N0YXRlU2VxIF9fcmUgPSBfTV9zdGFjay50b3AoKTsgX01fc3RhY2sucG9wKCk7CisJICB0aGlzLT5fTV9hbHRlcm5hdGl2ZSgpOworCSAgaWYgKCFfTV9zdGFjay5lbXB0eSgpKQorCSAgICB7CisJICAgICAgX19yZS5fTV9hcHBlbmQoX01fc3RhY2sudG9wKCkpOworCSAgICAgIF9NX3N0YWNrLnBvcCgpOworCSAgICB9CisJICBfTV9zdGFjay5wdXNoKF9fcmUpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fdGVybSgpCisgICAgeworICAgICAgaWYgKHRoaXMtPl9NX2Fzc2VydGlvbigpKQorCXJldHVybiB0cnVlOworICAgICAgaWYgKHRoaXMtPl9NX2F0b20oKSkKKwl7CisJICB0aGlzLT5fTV9xdWFudGlmaWVyKCk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9hc3NlcnRpb24oKQorICAgIHsKKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2xpbmVfYmVnaW4pKQorCXsKKwkgIC8vIF9fbS5wdXNoKF9NYXRjaGVyOjpfU19vcGNvZGVfbGluZV9iZWdpbik7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9saW5lX2VuZCkpCisJeworCSAgLy8gX19tLnB1c2goX01hdGNoZXI6Ol9TX29wY29kZV9saW5lX2VuZCk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl93b3JkX2JlZ2luKSkKKwl7CisJICAvLyBfX20ucHVzaChfTWF0Y2hlcjo6X1Nfb3Bjb2RlX3dvcmRfYmVnaW4pOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fd29yZF9lbmQpKQorCXsKKwkgIC8vIF9fbS5wdXNoKF9NYXRjaGVyOjpfU19vcGNvZGVfd29yZF9lbmQpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fcXVhbnRpZmllcigpCisgICAgeworICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fY2xvc3VyZTApKQorCXsKKwkgIGlmIChfTV9zdGFjay5lbXB0eSgpKQorCSAgICBfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYmFkcmVwZWF0KTsKKwkgIF9TdGF0ZVNlcSBfX3IoX01fc3RhY2sudG9wKCksIC0xKTsKKwkgIF9fci5fTV9hcHBlbmQoX19yLl9NX2Zyb250KCkpOworCSAgX01fc3RhY2sucG9wKCk7CisJICBfTV9zdGFjay5wdXNoKF9fcik7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9jbG9zdXJlMSkpCisJeworCSAgaWYgKF9NX3N0YWNrLmVtcHR5KCkpCisJICAgIF9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9iYWRyZXBlYXQpOworCSAgX1N0YXRlU2VxIF9fcihfTV9zdGF0ZV9zdG9yZSwKKwkJCV9NX3N0YXRlX3N0b3JlLgorCQkJX01faW5zZXJ0X2FsdChfU19pbnZhbGlkX3N0YXRlX2lkLAorCQkJCSAgICAgIF9NX3N0YWNrLnRvcCgpLl9NX2Zyb250KCkpKTsKKwkgIF9NX3N0YWNrLnRvcCgpLl9NX2FwcGVuZChfX3IpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fb3B0KSkKKwl7CisJICBpZiAoX01fc3RhY2suZW1wdHkoKSkKKwkgIF9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9iYWRyZXBlYXQpOworCSAgX1N0YXRlU2VxIF9fcihfTV9zdGFjay50b3AoKSwgLTEpOworCSAgX01fc3RhY2sucG9wKCk7CisJICBfTV9zdGFjay5wdXNoKF9fcik7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9pbnRlcnZhbF9iZWdpbikpCisJeworCSAgaWYgKF9NX3N0YWNrLmVtcHR5KCkpCisJICAgIF9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9iYWRyZXBlYXQpOworCSAgaWYgKCFfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2R1cF9jb3VudCkpCisJICAgIF9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9iYWRicmFjZSk7CisJICBfU3RhdGVTZXEgX19yKF9NX3N0YWNrLnRvcCgpKTsKKwkgIGludCBfX21pbl9yZXAgPSBfTV9jdXJfaW50X3ZhbHVlKDEwKTsKKwkgIGZvciAoaW50IF9faSA9IDE7IF9faSA8IF9fbWluX3JlcDsgKytfX2kpCisJICAgIF9NX3N0YWNrLnRvcCgpLl9NX2FwcGVuZChfX3IuX01fY2xvbmUoKSk7IAorCSAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fY29tbWEpKQorCSAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9kdXBfY291bnQpKQorCSAgICAgIHsKKwkJaW50IF9fbiA9IF9NX2N1cl9pbnRfdmFsdWUoMTApIC0gX19taW5fcmVwOworCQlpZiAoX19uIDwgMCkKKwkJICBfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYmFkYnJhY2UpOworCQlmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCQkgIHsKKwkJICAgIF9TdGF0ZVNlcSBfX3IoX01fc3RhdGVfc3RvcmUsCisJCQkJICBfTV9zdGF0ZV9zdG9yZS4KKwkJCQkgIF9NX2luc2VydF9hbHQoX1NfaW52YWxpZF9zdGF0ZV9pZCwKKwkJCQkJCV9NX3N0YWNrLnRvcCgpLl9NX2Zyb250KCkpKTsKKwkJICAgIF9NX3N0YWNrLnRvcCgpLl9NX2FwcGVuZChfX3IpOworCQkgIH0KKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCV9TdGF0ZVNlcSBfX3IoX01fc3RhY2sudG9wKCksIC0xKTsKKwkJX19yLl9NX3B1c2hfYmFjayhfX3IuX01fZnJvbnQoKSk7CisJCV9NX3N0YWNrLnBvcCgpOworCQlfTV9zdGFjay5wdXNoKF9fcik7CisJICAgICAgfQorCSAgaWYgKCFfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2ludGVydmFsX2VuZCkpCisJICAgIF9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9icmFjZSk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9hdG9tKCkKKyAgICB7CisgICAgICB0eXBlZGVmIF9DaGFyTWF0Y2hlcjxfSW5JdGVyLCBfVHJhaXRzVD4gX0NNYXRjaGVyOworICAgICAgdHlwZWRlZiBfU3RhcnRUYWdnZXI8X0luSXRlciwgX1RyYWl0c1Q+IF9TdGFydDsKKyAgICAgIHR5cGVkZWYgX0VuZFRhZ2dlcjxfSW5JdGVyLCBfVHJhaXRzVD4gX0VuZDsKKworICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fYW55Y2hhcikpCisJeworCSAgX01fc3RhY2sucHVzaChfU3RhdGVTZXEoX01fc3RhdGVfc3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fc3RhdGVfc3RvcmUuX01faW5zZXJ0X21hdGNoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX0FueU1hdGNoZXIpKSk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9vcmRfY2hhcikpCisJeworCSAgX01fc3RhY2sucHVzaChfU3RhdGVTZXEoX01fc3RhdGVfc3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fc3RhdGVfc3RvcmUuX01faW5zZXJ0X21hdGNoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX0NNYXRjaGVyKF9NX2N1cl92YWx1ZVswXSwgX01fdHJhaXRzKSkpKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX3F1b3RlZF9jaGFyKSkKKwl7CisJICAvLyBub3RlIHRoYXQgaW4gdGhlIEVDTUEgZ3JhbW1hciwgdGhpcyBjYXNlIGNvdmVycyBiYWNrcmVmcy4KKwkgIF9NX3N0YWNrLnB1c2goX1N0YXRlU2VxKF9NX3N0YXRlX3N0b3JlLAorCQkJCSAgX01fc3RhdGVfc3RvcmUuX01faW5zZXJ0X21hdGNoZXIKKwkJCQkgIChfQ01hdGNoZXIoX01fY3VyX3ZhbHVlWzBdLCBfTV90cmFpdHMpKSkpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fYmFja3JlZikpCisJeworCSAgLy8gX19tLnB1c2goX01hdGNoZXI6Ol9TX29wY29kZV9vcmRjaGFyLCBfTV9jdXJfdmFsdWUpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fc3ViZXhwcl9iZWdpbikpCisJeworCSAgaW50IF9fbWFyayA9IF9NX3N0YXRlX3N0b3JlLl9NX3N1Yl9jb3VudCgpOworCSAgX1N0YXRlU2VxIF9fcihfTV9zdGF0ZV9zdG9yZSwKKwkJCV9NX3N0YXRlX3N0b3JlLgorCQkJX01faW5zZXJ0X3N1YmV4cHJfYmVnaW4oX1N0YXJ0KF9fbWFyaykpKTsKKwkgIHRoaXMtPl9NX2Rpc2p1bmN0aW9uKCk7CisJICBpZiAoIV9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fc3ViZXhwcl9lbmQpKQorCSAgICBfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfcGFyZW4pOworCSAgaWYgKCFfTV9zdGFjay5lbXB0eSgpKQorCSAgICB7CisJICAgICAgX19yLl9NX2FwcGVuZChfTV9zdGFjay50b3AoKSk7CisJICAgICAgX01fc3RhY2sucG9wKCk7CisJICAgIH0KKwkgIF9fci5fTV9hcHBlbmQoX01fc3RhdGVfc3RvcmUuX01faW5zZXJ0X3N1YmV4cHJfZW5kCisJCQkoX19tYXJrLCBfRW5kKF9fbWFyaykpKTsKKwkgIF9NX3N0YWNrLnB1c2goX19yKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHJldHVybiBfTV9icmFja2V0X2V4cHJlc3Npb24oKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX2JyYWNrZXRfZXhwcmVzc2lvbigpCisgICAgeworICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fYnJhY2tldF9iZWdpbikpCisJeworCSAgX1JNYXRjaGVyVCBfX21hdGNoZXIoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9saW5lX2JlZ2luKSwKKwkJCSAgICAgICBfTV90cmFpdHMpOworCSAgaWYgKCFfTV9icmFja2V0X2xpc3QoX19tYXRjaGVyKQorCSAgICAgIHx8ICFfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2JyYWNrZXRfZW5kKSkKKwkgICAgX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2JyYWNrKTsKKwkgIF9NX3N0YWNrLnB1c2goX1N0YXRlU2VxKF9NX3N0YXRlX3N0b3JlLAorCQkJCSAgX01fc3RhdGVfc3RvcmUuX01faW5zZXJ0X21hdGNoZXIoX19tYXRjaGVyKSkpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvLyBJZiB0aGUgZGFzaCBpcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJyYWNrZXQgZXhwcmVzc2lvbiwgaXQgaXMgbm90CisgIC8vIHNwZWNpYWwuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9icmFja2V0X2xpc3QoX1JNYXRjaGVyVCYgX19tYXRjaGVyKQorICAgIHsKKyAgICAgIGlmIChfTV9mb2xsb3dfbGlzdChfX21hdGNoZXIpKQorCXsKKwkgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2Rhc2gpKQorCSAgICBfX21hdGNoZXIuX01fYWRkX2NoYXIoX01fY3VyX3ZhbHVlWzBdKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX2ZvbGxvd19saXN0KF9STWF0Y2hlclQmIF9fbWF0Y2hlcikKKyAgICB7IHJldHVybiBfTV9leHByZXNzaW9uX3Rlcm0oX19tYXRjaGVyKSAmJiBfTV9mb2xsb3dfbGlzdDIoX19tYXRjaGVyKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9mb2xsb3dfbGlzdDIoX1JNYXRjaGVyVCYgX19tYXRjaGVyKQorICAgIHsKKyAgICAgIGlmIChfTV9leHByZXNzaW9uX3Rlcm0oX19tYXRjaGVyKSkKKwlyZXR1cm4gX01fZm9sbG93X2xpc3QyKF9fbWF0Y2hlcik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX2V4cHJlc3Npb25fdGVybShfUk1hdGNoZXJUJiBfX21hdGNoZXIpCisgICAgeworICAgICAgcmV0dXJuIChfTV9jb2xsYXRpbmdfc3ltYm9sKF9fbWF0Y2hlcikKKwkgICAgICB8fCBfTV9jaGFyYWN0ZXJfY2xhc3MoX19tYXRjaGVyKQorCSAgICAgIHx8IF9NX2VxdWl2YWxlbmNlX2NsYXNzKF9fbWF0Y2hlcikKKwkgICAgICB8fCAoX01fc3RhcnRfcmFuZ2UoX19tYXRjaGVyKQorCQkgICYmIF9NX3JhbmdlX2V4cHJlc3Npb24oX19tYXRjaGVyKSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fcmFuZ2VfZXhwcmVzc2lvbihfUk1hdGNoZXJUJiBfX21hdGNoZXIpCisgICAgeworICAgICAgaWYgKCFfTV9jb2xsYXRpbmdfc3ltYm9sKF9fbWF0Y2hlcikpCisJaWYgKCFfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2Rhc2gpKQorCSAgX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX3JhbmdlKTsKKyAgICAgIF9fbWF0Y2hlci5fTV9tYWtlX3JhbmdlKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX3N0YXJ0X3JhbmdlKF9STWF0Y2hlclQmIF9fbWF0Y2hlcikKKyAgICB7IHJldHVybiBfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2Rhc2gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX2NvbGxhdGluZ19zeW1ib2woX1JNYXRjaGVyVCYgX19tYXRjaGVyKQorICAgIHsKKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2NvbGxlbGVtX3NpbmdsZSkpCisJeworCSAgX19tYXRjaGVyLl9NX2FkZF9jaGFyKF9NX2N1cl92YWx1ZVswXSk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9jb2xsc3ltYm9sKSkKKwl7CisJICBfX21hdGNoZXIuX01fYWRkX2NvbGxhdGluZ19lbGVtZW50KF9NX2N1cl92YWx1ZSk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9lcXVpdmFsZW5jZV9jbGFzcyhfUk1hdGNoZXJUJiBfX21hdGNoZXIpCisgICAgeworICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fZXF1aXZfY2xhc3NfbmFtZSkpCisJeworCSAgX19tYXRjaGVyLl9NX2FkZF9lcXVpdmFsZW5jZV9jbGFzcyhfTV9jdXJfdmFsdWUpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fY2hhcmFjdGVyX2NsYXNzKF9STWF0Y2hlclQmIF9fbWF0Y2hlcikKKyAgICB7CisgICAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9jaGFyX2NsYXNzX25hbWUpKQorCXsKKwkgIF9fbWF0Y2hlci5fTV9hZGRfY2hhcmFjdGVyX2NsYXNzKF9NX2N1cl92YWx1ZSk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGludAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX2N1cl9pbnRfdmFsdWUoaW50IF9fcmFkaXgpCisgICAgeworICAgICAgaW50IF9fdiA9IDA7CisgICAgICBmb3IgKHR5cGVuYW1lIF9TdHJpbmdUOjpzaXplX3R5cGUgX19pID0gMDsKKwkgICBfX2kgPCBfTV9jdXJfdmFsdWUubGVuZ3RoKCk7ICsrX19pKQorCV9fdiA9X192ICogX19yYWRpeCArIF9NX3RyYWl0cy52YWx1ZShfTV9jdXJfdmFsdWVbX19pXSwgX19yYWRpeCk7CisgICAgICByZXR1cm4gX192OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBfQXV0b21hdG9uUHRyCisgICAgX19jb21waWxlKGNvbnN0IF9Jbkl0ZXImIF9fYiwgY29uc3QgX0luSXRlciYgX19lLCBfVHJhaXRzVCYgX190LAorCSAgICAgIHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIF9fZikKKyAgICB7IHJldHVybiBfQXV0b21hdG9uUHRyKG5ldyBfTmZhKF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD4oX19iLCBfX2UsIF9fdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2YpLl9NX25mYSgpKSk7IH0KKworIC8vQH0gcmVnZXgtZGV0YWlsCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIF9fZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBzdGQKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9jb25zdGFudHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9jb25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWEyYTViCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X2NvbnN0YW50cy5oCkBAIC0wLDAgKzEsMzEwIEBACisvLyBjbGFzcyB0ZW1wbGF0ZSByZWdleCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqICBAZmlsZSBiaXRzL3JlZ2V4X2NvbnN0YW50cy5oCisgKiAgQGJyaWVmIENvbnN0YW50IGRlZmluaXRpb25zIGZvciB0aGUgc3RkIHJlZ2V4IGxpYnJhcnkuCisgKgorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3JlZ2V4fQorICovCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworLyoqCisgKiBAZGVmZ3JvdXAgcmVnZXggUmVndWxhciBFeHByZXNzaW9ucworICoKKyAqIEEgZmFjaWxpdHkgZm9yIHBlcmZvcm1pbmcgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gbWF0Y2hpbmcuCisgKiBAeworICovCisKKy8qKgorICogQG5hbWVzcGFjZSBzdGQ6OnJlZ2V4X2NvbnN0YW50cworICogQGJyaWVmIElTTyBDKystMHggZW50aXRpZXMgc3ViIG5hbWVzcGFjZSBmb3IgcmVnZXguCisgKi8KK25hbWVzcGFjZSByZWdleF9jb25zdGFudHMKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBuYW1lIDUuMSBSZWd1bGFyIEV4cHJlc3Npb24gU3ludGF4IE9wdGlvbnMKKyAgICovCisgIC8vQHsKKyAgZW51bSBfX3N5bnRheF9vcHRpb24KKyAgICB7CisgICAgICBfU19pY2FzZSwKKyAgICAgIF9TX25vc3VicywKKyAgICAgIF9TX29wdGltaXplLAorICAgICAgX1NfY29sbGF0ZSwKKyAgICAgIF9TX0VDTUFTY3JpcHQsCisgICAgICBfU19iYXNpYywKKyAgICAgIF9TX2V4dGVuZGVkLAorICAgICAgX1NfYXdrLAorICAgICAgX1NfZ3JlcCwKKyAgICAgIF9TX2VncmVwLAorICAgICAgX1Nfc3ludGF4X2xhc3QKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgVGhpcyBpcyBhIGJpdG1hc2sgdHlwZSBpbmRpY2F0aW5nIGhvdyB0byBpbnRlcnByZXQgdGhlIHJlZ2V4LgorICAgKgorICAgKiBUaGUgQGMgc3ludGF4X29wdGlvbl90eXBlIGlzIGltcGxlbWVudGF0aW9uIGRlZmluZWQgYnV0IGl0IGlzIHZhbGlkIHRvCisgICAqIHBlcmZvcm0gYml0d2lzZSBvcGVyYXRpb25zIG9uIHRoZXNlIHZhbHVlcyBhbmQgZXhwZWN0IHRoZSByaWdodCB0aGluZyB0bworICAgKiBoYXBwZW4uCisgICAqCisgICAqIEEgdmFsaWQgdmFsdWUgb2YgdHlwZSBzeW50YXhfb3B0aW9uX3R5cGUgc2hhbGwgaGF2ZSBleGFjdGx5IG9uZSBvZiB0aGUKKyAgICogZWxlbWVudHMgQGMgRUNNQVNjcmlwdCwgQGMgYmFzaWMsIEBjIGV4dGVuZGVkLCBAYyBhd2ssIEBjIGdyZXAsIEBjIGVncmVwCisgICAqICVzZXQuCisgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIGludCBzeW50YXhfb3B0aW9uX3R5cGU7CisKKyAgLyoqIAorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgbWF0Y2hpbmcgb2YgcmVndWxhciBleHByZXNzaW9ucyBhZ2FpbnN0IGEgY2hhcmFjdGVyCisgICAqIHNlcXVlbmNlIHNoYWxsIGJlIHBlcmZvcm1lZCB3aXRob3V0IHJlZ2FyZCB0byBjYXNlLgorICAgKi8KKyAgY29uc3RleHByIHN5bnRheF9vcHRpb25fdHlwZSBpY2FzZSAgICAgID0gMSA8PCBfU19pY2FzZTsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgd2hlbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkIGFnYWluc3QgYSBjaGFyYWN0ZXIKKyAgICogY29udGFpbmVyIHNlcXVlbmNlLCBubyBzdWItZXhwcmVzc2lvbiBtYXRjaGVzIGFyZSB0byBiZSBzdG9yZWQgaW4gdGhlCisgICAqIHN1cHBsaWVkIG1hdGNoX3Jlc3VsdHMgc3RydWN0dXJlLgorICAgKi8KKyAgY29uc3RleHByIHN5bnRheF9vcHRpb25fdHlwZSBub3N1YnMgICAgID0gMSA8PCBfU19ub3N1YnM7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIHNob3VsZCBwYXkgbW9yZSBhdHRlbnRpb24gdG8KKyAgICogdGhlIHNwZWVkIHdpdGggd2hpY2ggcmVndWxhciBleHByZXNzaW9ucyBhcmUgbWF0Y2hlZCwgYW5kIGxlc3MgdG8gdGhlCisgICAqIHNwZWVkIHdpdGggd2hpY2ggcmVndWxhciBleHByZXNzaW9uIG9iamVjdHMgYXJlIGNvbnN0cnVjdGVkLiBPdGhlcndpc2UKKyAgICogaXQgaGFzIG5vIGRldGVjdGFibGUgZWZmZWN0IG9uIHRoZSBwcm9ncmFtIG91dHB1dC4KKyAgICovCisgIGNvbnN0ZXhwciBzeW50YXhfb3B0aW9uX3R5cGUgb3B0aW1pemUgICA9IDEgPDwgX1Nfb3B0aW1pemU7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IGNoYXJhY3RlciByYW5nZXMgb2YgdGhlIGZvcm0gW2EtYl0gc2hvdWxkIGJlIGxvY2FsZQorICAgKiBzZW5zaXRpdmUuCisgICAqLworICBjb25zdGV4cHIgc3ludGF4X29wdGlvbl90eXBlIGNvbGxhdGUgICAgPSAxIDw8IF9TX2NvbGxhdGU7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFtbWFyIHJlY29nbml6ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgaXMKKyAgICogdGhhdCB1c2VkIGJ5IEVDTUFTY3JpcHQgaW4gRUNNQS0yNjIgW0VjbWEgSW50ZXJuYXRpb25hbCwgRUNNQVNjcmlwdAorICAgKiBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBTdGFuZGFyZCBFY21hLTI2MiwgdGhpcmQgZWRpdGlvbiwgMTk5OV0sIGFzCisgICAqIG1vZGlmaWVkIGluIHNlY3Rpb24gWzI4LjEzXS4gIFRoaXMgZ3JhbW1hciBpcyBzaW1pbGFyIHRvIHRoYXQgZGVmaW5lZAorICAgKiBpbiB0aGUgUEVSTCBzY3JpcHRpbmcgbGFuZ3VhZ2UgYnV0IGV4dGVuZGVkIHdpdGggZWxlbWVudHMgZm91bmQgaW4gdGhlCisgICAqIFBPU0lYIHJlZ3VsYXIgZXhwcmVzc2lvbiBncmFtbWFyLgorICAgKi8KKyAgY29uc3RleHByIHN5bnRheF9vcHRpb25fdHlwZSBFQ01BU2NyaXB0ID0gMSA8PCBfU19FQ01BU2NyaXB0OworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBQT1NJWCBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb25zIGluIElFRUUgU3RkIDEwMDMuMS0yMDAxLAorICAgKiBQb3J0YWJsZSBPcGVyYXRpbmcgU3lzdGVtIEludGVyZmFjZSAoUE9TSVgpLCBCYXNlIERlZmluaXRpb25zIGFuZAorICAgKiBIZWFkZXJzLCBTZWN0aW9uIDksIFJlZ3VsYXIgRXhwcmVzc2lvbnMgW0lFRUUsIEluZm9ybWF0aW9uIFRlY2hub2xvZ3kgLS0KKyAgICogUG9ydGFibGUgT3BlcmF0aW5nIFN5c3RlbSBJbnRlcmZhY2UgKFBPU0lYKSwgSUVFRSBTdGFuZGFyZCAxMDAzLjEtMjAwMV0uCisgICAqLworICBjb25zdGV4cHIgc3ludGF4X29wdGlvbl90eXBlIGJhc2ljICAgICAgPSAxIDw8IF9TX2Jhc2ljOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBQT1NJWCBleHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb25zIGluIElFRUUgU3RkIDEwMDMuMS0yMDAxLAorICAgKiBQb3J0YWJsZSBPcGVyYXRpbmcgU3lzdGVtIEludGVyZmFjZSAoUE9TSVgpLCBCYXNlIERlZmluaXRpb25zIGFuZCBIZWFkZXJzLAorICAgKiBTZWN0aW9uIDksIFJlZ3VsYXIgRXhwcmVzc2lvbnMuCisgICAqLworICBjb25zdGV4cHIgc3ludGF4X29wdGlvbl90eXBlIGV4dGVuZGVkICAgPSAxIDw8IF9TX2V4dGVuZGVkOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBQT1NJWCB1dGlsaXR5IGF3ayBpbiBJRUVFIFN0ZCAxMDAzLjEtMjAwMS4gIFRoaXMgb3B0aW9uIGlzCisgICAqIGlkZW50aWNhbCB0byBzeW50YXhfb3B0aW9uX3R5cGUgZXh0ZW5kZWQsIGV4Y2VwdCB0aGF0IEMtc3R5bGUgZXNjYXBlCisgICAqIHNlcXVlbmNlcyBhcmUgc3VwcG9ydGVkLiAgVGhlc2Ugc2VxdWVuY2VzIGFyZToKKyAgICogXFxcXCwgXFxhLCBcXGIsIFxcZiwgXFxuLCBcXHIsIFxcdCAsIFxcdiwgXFwmYXBvczssICZhcG9zOywKKyAgICogYW5kIFxcZGRkICh3aGVyZSBkZGQgaXMgb25lLCB0d28sIG9yIHRocmVlIG9jdGFsIGRpZ2l0cykuICAKKyAgICovCisgIGNvbnN0ZXhwciBzeW50YXhfb3B0aW9uX3R5cGUgYXdrICAgICAgICA9IDEgPDwgX1NfYXdrOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBQT1NJWCB1dGlsaXR5IGdyZXAgaW4gSUVFRSBTdGQgMTAwMy4xLTIwMDEuICBUaGlzIG9wdGlvbiBpcworICAgKiBpZGVudGljYWwgdG8gc3ludGF4X29wdGlvbl90eXBlIGJhc2ljLCBleGNlcHQgdGhhdCBuZXdsaW5lcyBhcmUgdHJlYXRlZAorICAgKiBhcyB3aGl0ZXNwYWNlLgorICAgKi8KKyAgY29uc3RleHByIHN5bnRheF9vcHRpb25fdHlwZSBncmVwICAgICAgID0gMSA8PCBfU19ncmVwOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBQT1NJWCB1dGlsaXR5IGdyZXAgd2hlbiBnaXZlbiB0aGUgLUUgb3B0aW9uIGluCisgICAqIElFRUUgU3RkIDEwMDMuMS0yMDAxLiAgVGhpcyBvcHRpb24gaXMgaWRlbnRpY2FsIHRvIHN5bnRheF9vcHRpb25fdHlwZSAKKyAgICogZXh0ZW5kZWQsIGV4Y2VwdCB0aGF0IG5ld2xpbmVzIGFyZSB0cmVhdGVkIGFzIHdoaXRlc3BhY2UuCisgICAqLworICBjb25zdGV4cHIgc3ludGF4X29wdGlvbl90eXBlIGVncmVwICAgICAgPSAxIDw8IF9TX2VncmVwOworCisgIC8vQH0KKworICAvKioKKyAgICogQG5hbWUgNS4yIE1hdGNoaW5nIFJ1bGVzCisgICAqCisgICAqIE1hdGNoaW5nIGEgcmVndWxhciBleHByZXNzaW9uIGFnYWluc3QgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIFtmaXJzdCwKKyAgICogbGFzdCkgcHJvY2VlZHMgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgZ3JhbW1hciBzcGVjaWZpZWQgZm9yIHRoZQorICAgKiByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LCBtb2RpZmllZCBhY2NvcmRpbmcgdG8gdGhlIGVmZmVjdHMgbGlzdGVkCisgICAqIGJlbG93IGZvciBhbnkgYml0bWFzayBlbGVtZW50cyBzZXQuCisgICAqCisgICAqLworICAvL0B7CisKKyAgZW51bSBfX21hdGNoX2ZsYWcKKyAgICB7CisgICAgICBfU19ub3RfYm9sLAorICAgICAgX1Nfbm90X2VvbCwKKyAgICAgIF9TX25vdF9ib3csCisgICAgICBfU19ub3RfZW93LAorICAgICAgX1NfYW55LAorICAgICAgX1Nfbm90X251bGwsCisgICAgICBfU19jb250aW51b3VzLAorICAgICAgX1NfcHJldl9hdmFpbCwKKyAgICAgIF9TX3NlZCwKKyAgICAgIF9TX25vX2NvcHksCisgICAgICBfU19maXJzdF9vbmx5LAorICAgICAgX1NfbWF0Y2hfZmxhZ19sYXN0CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFRoaXMgaXMgYSBiaXRtYXNrIHR5cGUgaW5kaWNhdGluZyByZWdleCBtYXRjaGluZyBydWxlcy4KKyAgICoKKyAgICogVGhlIEBjIG1hdGNoX2ZsYWdfdHlwZSBpcyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJ1dCBpdCBpcyB2YWxpZCB0bworICAgKiBwZXJmb3JtIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiB0aGVzZSB2YWx1ZXMgYW5kIGV4cGVjdCB0aGUgcmlnaHQgdGhpbmcgdG8KKyAgICogaGFwcGVuLgorICAgKi8KKyAgdHlwZWRlZiBzdGQ6OmJpdHNldDxfU19tYXRjaF9mbGFnX2xhc3Q+IG1hdGNoX2ZsYWdfdHlwZTsKKworICAvKioKKyAgICogVGhlIGRlZmF1bHQgbWF0Y2hpbmcgcnVsZXMuCisgICAqLworICBjb25zdGV4cHIgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX2RlZmF1bHQgICAgID0gMDsKKworICAvKioKKyAgICogVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc2VxdWVuY2UgW2ZpcnN0LCBsYXN0KSBpcyB0cmVhdGVkIGFzIHRob3VnaCBpdAorICAgKiBpcyBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUsIHNvIHRoZSBjaGFyYWN0ZXIgKF4pIGluIHRoZSByZWd1bGFyCisgICAqIGV4cHJlc3Npb24gc2hhbGwgbm90IG1hdGNoIFtmaXJzdCwgZmlyc3QpLgorICAgKi8KKyAgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9ub3RfYm9sICAgICA9IDEgPDwgX1Nfbm90X2JvbDsKKworICAvKioKKyAgICogVGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzZXF1ZW5jZSBbZmlyc3QsIGxhc3QpIGlzIHRyZWF0ZWQgYXMgdGhvdWdoIGl0CisgICAqIGlzIG5vdCBhdCB0aGUgZW5kIG9mIGEgbGluZSwgc28gdGhlIGNoYXJhY3RlciAoJCkgaW4gdGhlIHJlZ3VsYXIKKyAgICogZXhwcmVzc2lvbiBzaGFsbCBub3QgbWF0Y2ggW2xhc3QsIGxhc3QpLgorICAgKi8KKyAgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9ub3RfZW9sICAgICA9IDEgPDwgX1Nfbm90X2VvbDsKKyAgIAorICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gXFxiIGlzIG5vdCBtYXRjaGVkIGFnYWluc3QgdGhlIHN1Yi1zZXF1ZW5jZQorICAgKiBbZmlyc3QsZmlyc3QpLgorICAgKi8KKyAgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9ub3RfYm93ICAgICA9IDEgPDwgX1Nfbm90X2JvdzsKKyAgIAorICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gXFxiIHNob3VsZCBub3QgYmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBzdWItc2VxdWVuY2UKKyAgICogW2xhc3QsbGFzdCkuCisgICAqLworICBjb25zdGV4cHIgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX25vdF9lb3cgICAgID0gMSA8PCBfU19ub3RfZW93OworICAgCisgIC8qKgorICAgKiBJZiBtb3JlIHRoYW4gb25lIG1hdGNoIGlzIHBvc3NpYmxlIHRoZW4gYW55IG1hdGNoIGlzIGFuIGFjY2VwdGFibGUKKyAgICogcmVzdWx0LgorICAgKi8KKyAgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9hbnkgICAgICAgICA9IDEgPDwgX1NfYW55OworICAgCisgIC8qKgorICAgKiBUaGUgZXhwcmVzc2lvbiBkb2VzIG5vdCBtYXRjaCBhbiBlbXB0eSBzZXF1ZW5jZS4KKyAgICovCisgIGNvbnN0ZXhwciBtYXRjaF9mbGFnX3R5cGUgbWF0Y2hfbm90X251bGwgICAgPSAxIDw8IF9TX25vdF9udWxsOworICAgCisgIC8qKgorICAgKiBUaGUgZXhwcmVzc2lvbiBvbmx5IG1hdGNoZXMgYSBzdWItc2VxdWVuY2UgdGhhdCBiZWdpbnMgYXQgZmlyc3QgLgorICAgKi8KKyAgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9jb250aW51b3VzICA9IDEgPDwgX1NfY29udGludW91czsKKyAgIAorICAvKioKKyAgICogLS1maXJzdCBpcyBhIHZhbGlkIGl0ZXJhdG9yIHBvc2l0aW9uLiAgV2hlbiB0aGlzIGZsYWcgaXMgc2V0IHRoZW4gdGhlCisgICAqIGZsYWdzIG1hdGNoX25vdF9ib2wgYW5kIG1hdGNoX25vdF9ib3cgYXJlIGlnbm9yZWQgYnkgdGhlIHJlZ3VsYXIKKyAgICogZXhwcmVzc2lvbiBhbGdvcml0aG1zIDI4LjExIGFuZCBpdGVyYXRvcnMgMjguMTIuCisgICAqLworICBjb25zdGV4cHIgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX3ByZXZfYXZhaWwgID0gMSA8PCBfU19wcmV2X2F2YWlsOworCisgIC8qKgorICAgKiBXaGVuIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIGlzIHRvIGJlIHJlcGxhY2VkIGJ5IGEgbmV3IHN0cmluZywgdGhlCisgICAqIG5ldyBzdHJpbmcgaXMgY29uc3RydWN0ZWQgdXNpbmcgdGhlIHJ1bGVzIHVzZWQgYnkgdGhlIEVDTUFTY3JpcHQgcmVwbGFjZQorICAgKiBmdW5jdGlvbiBpbiBFQ01BLSAyNjIgW0VjbWEgSW50ZXJuYXRpb25hbCwgRUNNQVNjcmlwdCBMYW5ndWFnZQorICAgKiBTcGVjaWZpY2F0aW9uLCBTdGFuZGFyZCBFY21hLTI2MiwgdGhpcmQgZWRpdGlvbiwgMTk5OV0sIHBhcnQgMTUuNS40LjExCisgICAqIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZS4gSW4gYWRkaXRpb24sIGR1cmluZyBzZWFyY2ggYW5kIHJlcGxhY2UKKyAgICogb3BlcmF0aW9ucyBhbGwgbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogYXJlIGxvY2F0ZWQgYW5kIHJlcGxhY2VkLCBhbmQgc2VjdGlvbnMgb2YgdGhlIGlucHV0IHRoYXQgZGlkIG5vdCBtYXRjaAorICAgKiB0aGUgZXhwcmVzc2lvbiBhcmUgY29waWVkIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0IHN0cmluZy4KKyAgICogCisgICAqIEZvcm1hdCBzdHJpbmdzIChmcm9tIEVDTUEtMjYyIFsxNS41LjQuMTFdKToKKyAgICogQGxpICQkICBUaGUgZG9sbGFyLXNpZ24gaXRzZWxmICgkKQorICAgKiBAbGkgJCYgIFRoZSBtYXRjaGVkIHN1YnN0cmluZy4KKyAgICogQGxpICRgICBUaGUgcG9ydGlvbiBvZiBAYSBzdHJpbmcgdGhhdCBwcmVjZWRlcyB0aGUgbWF0Y2hlZCBzdWJzdHJpbmcuCisgICAqICAgICAgICAgVGhpcyB3b3VsZCBiZSBtYXRjaF9yZXN1bHRzOjpwcmVmaXgoKS4KKyAgICogQGxpICQnICBUaGUgcG9ydGlvbiBvZiBAYSBzdHJpbmcgdGhhdCBmb2xsb3dzIHRoZSBtYXRjaGVkIHN1YnN0cmluZy4KKyAgICogICAgICAgICBUaGlzIHdvdWxkIGJlIG1hdGNoX3Jlc3VsdHM6OnN1ZmZpeCgpLgorICAgKiBAbGkgJG4gIFRoZSBudGggY2FwdHVyZSwgd2hlcmUgbiBpcyBpbiBbMSw5XSBhbmQgJG4gaXMgbm90IGZvbGxvd2VkIGJ5IGEKKyAgICogICAgICAgICBkZWNpbWFsIGRpZ2l0LiAgSWYgbiA8PSBtYXRjaF9yZXN1bHRzOjpzaXplKCkgYW5kIHRoZSBudGggY2FwdHVyZQorICAgKiAgICAgICAgIGlzIHVuZGVmaW5lZCwgdXNlIHRoZSBlbXB0eSBzdHJpbmcgaW5zdGVhZC4gIElmIG4gPgorICAgKiAgICAgICAgIG1hdGNoX3Jlc3VsdHM6OnNpemUoKSwgdGhlIHJlc3VsdCBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorICAgKiBAbGkgJG5uIFRoZSBubnRoIGNhcHR1cmUsIHdoZXJlIG5uIGlzIGEgdHdvLWRpZ2l0IGRlY2ltYWwgbnVtYmVyIG9uCisgICAqICAgICAgICAgWzAxLCA5OV0uICBJZiBubiA8PSBtYXRjaF9yZXN1bHRzOjpzaXplKCkgYW5kIHRoZSBudGggY2FwdHVyZSBpcworICAgKiAgICAgICAgIHVuZGVmaW5lZCwgdXNlIHRoZSBlbXB0eSBzdHJpbmcgaW5zdGVhZC4gSWYKKyAgICogICAgICAgICBubiA+IG1hdGNoX3Jlc3VsdHM6OnNpemUoKSwgdGhlIHJlc3VsdCBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorICAgKi8KKyAgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBmb3JtYXRfZGVmYXVsdCAgICA9IDA7CisKKyAgLyoqCisgICAqIFdoZW4gYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggaXMgdG8gYmUgcmVwbGFjZWQgYnkgYSBuZXcgc3RyaW5nLCB0aGUKKyAgICogbmV3IHN0cmluZyBpcyBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgcnVsZXMgdXNlZCBieSB0aGUgUE9TSVggc2VkIHV0aWxpdHkKKyAgICogaW4gSUVFRSBTdGQgMTAwMy4xLSAyMDAxIFtJRUVFLCBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IC0tIFBvcnRhYmxlCisgICAqIE9wZXJhdGluZyBTeXN0ZW0gSW50ZXJmYWNlIChQT1NJWCksIElFRUUgU3RhbmRhcmQgMTAwMy4xLTIwMDFdLgorICAgKi8KKyAgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBmb3JtYXRfc2VkICAgICAgICA9IDEgPDwgX1Nfc2VkOworCisgIC8qKgorICAgKiBEdXJpbmcgYSBzZWFyY2ggYW5kIHJlcGxhY2Ugb3BlcmF0aW9uLCBzZWN0aW9ucyBvZiB0aGUgY2hhcmFjdGVyCisgICAqIGNvbnRhaW5lciBzZXF1ZW5jZSBiZWluZyBzZWFyY2hlZCB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgcmVndWxhcgorICAgKiBleHByZXNzaW9uIHNoYWxsIG5vdCBiZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBzdHJpbmcuCisgICAqLworICBjb25zdGV4cHIgbWF0Y2hfZmxhZ190eXBlIGZvcm1hdF9ub19jb3B5ICAgID0gMSA8PCBfU19ub19jb3B5OworCisgIC8qKgorICAgKiBXaGVuIHNwZWNpZmllZCBkdXJpbmcgYSBzZWFyY2ggYW5kIHJlcGxhY2Ugb3BlcmF0aW9uLCBvbmx5IHRoZSBmaXJzdAorICAgKiBvY2N1cnJlbmNlIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc2hhbGwgYmUgcmVwbGFjZWQuCisgICAqLworICBjb25zdGV4cHIgbWF0Y2hfZmxhZ190eXBlIGZvcm1hdF9maXJzdF9vbmx5ID0gMSA8PCBfU19maXJzdF9vbmx5OworCisgIC8vQH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSByZWdleF9jb25zdGFudHMKKworLyogQH0gKi8gLy8gZ3JvdXAgcmVnZXgKK30gLy8gbmFtZXNwYWNlIHN0ZAorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfY3Vyc29yLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfY3Vyc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlOWQxZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9jdXJzb3IuaApAQCAtMCwwICsxLDEwMCBAQAorLy8gY2xhc3MgdGVtcGxhdGUgcmVnZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiAgQGZpbGUgYml0cy9yZWdleF9jdXJzb3IuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3JlZ2V4fQorICovCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fZGV0YWlsCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIHJlZ2V4LWRldGFpbCBCYXNlIGFuZCBJbXBsZW1lbnRhdGlvbiBDbGFzc2VzCisgICAqICBAaW5ncm91cCByZWdleAorICAgKiAgQHsKKyAgICovCisKKyAgLy8vIEFCQyBmb3IgcGF0dGVybiBtYXRjaGluZworICBzdHJ1Y3QgX1BhdHRlcm5DdXJzb3IKKyAgeworICAgIHZpcnR1YWwgfl9QYXR0ZXJuQ3Vyc29yKCkgeyB9OworICAgIHZpcnR1YWwgdm9pZCBfTV9uZXh0KCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBfTV9hdF9lbmQoKSBjb25zdCA9IDA7CisgIH07CisKKyAgLy8vIFByb3ZpZGVzIGEgY3Vyc29yIGludG8gdGhlIHNwZWNpZmljIHRhcmdldCBzdHJpbmcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RJdGVyVD4KKyAgICBjbGFzcyBfU3BlY2lhbGl6ZWRDdXJzb3IKKyAgICA6IHB1YmxpYyBfUGF0dGVybkN1cnNvcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBfU3BlY2lhbGl6ZWRDdXJzb3IoY29uc3QgX0Z3ZEl0ZXJUJiBfX2IsIGNvbnN0IF9Gd2RJdGVyVCBfX2UpCisgICAgICA6IF9NX2IoX19iKSwgX01fYyhfX2IpLCBfTV9lKF9fZSkKKyAgICAgIHsgfQorCisgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfRndkSXRlclQ+Ojp2YWx1ZV90eXBlCisgICAgICBfTV9jdXJyZW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpfTV9jOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX25leHQoKQorICAgICAgeyArK19NX2M7IH0KKworICAgICAgX0Z3ZEl0ZXJUCisgICAgICBfTV9wb3MoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYzsgfQorCisgICAgICBjb25zdCBfRndkSXRlclQmCisgICAgICBfTV9iZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9iOyB9CisKKyAgICAgIGNvbnN0IF9Gd2RJdGVyVCYKKyAgICAgIF9NX2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9lOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2F0X2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9jID09IF9NX2U7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfRndkSXRlclQgX01fYjsKKyAgICAgIF9Gd2RJdGVyVCBfTV9jOworICAgICAgX0Z3ZEl0ZXJUIF9NX2U7CisgICAgfTsKKworICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgY3Vyc29yIHNwZWNpYWxpemVkIGZvciBhbiBpdGVyYXRvciBjbGFzcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZEl0ZXJUPgorICAgIGlubGluZSBfU3BlY2lhbGl6ZWRDdXJzb3I8X0Z3ZEl0ZXJUPgorICAgIF9fY3Vyc29yKGNvbnN0IF9Gd2RJdGVyVCYgX19iLCBjb25zdCBfRndkSXRlclQgX19lKQorICAgIHsgcmV0dXJuIF9TcGVjaWFsaXplZEN1cnNvcjxfRndkSXRlclQ+KF9fYiwgX19lKTsgfQorCisgLy9AfSByZWdleC1kZXRhaWwKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKK30gLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfZXJyb3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMGIyMDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfZXJyb3IuaApAQCAtMCwwICsxLDE2NyBAQAorLy8gY2xhc3MgdGVtcGxhdGUgcmVnZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiBAZmlsZSBiaXRzL3JlZ2V4X2Vycm9yLmgKKyAqIEBicmllZiBFcnJvciBhbmQgZXhjZXB0aW9uIG9iamVjdHMgZm9yIHRoZSBzdGQgcmVnZXggbGlicmFyeS4KKyAqCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7cmVnZXh9CisgKi8KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CisvKioKKyAqIEBhZGR0b2dyb3VwIHJlZ2V4CisgKiBAeworICovCisKK25hbWVzcGFjZSByZWdleF9jb25zdGFudHMKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBuYW1lIDUuMyBFcnJvciBUeXBlcworICAgKi8KKyAgLy9AeworIAorICBlbnVtIGVycm9yX3R5cGUKKyAgICB7CisgICAgICBfU19lcnJvcl9jb2xsYXRlLAorICAgICAgX1NfZXJyb3JfY3R5cGUsCisgICAgICBfU19lcnJvcl9lc2NhcGUsCisgICAgICBfU19lcnJvcl9iYWNrcmVmLAorICAgICAgX1NfZXJyb3JfYnJhY2ssCisgICAgICBfU19lcnJvcl9wYXJlbiwKKyAgICAgIF9TX2Vycm9yX2JyYWNlLAorICAgICAgX1NfZXJyb3JfYmFkYnJhY2UsCisgICAgICBfU19lcnJvcl9yYW5nZSwKKyAgICAgIF9TX2Vycm9yX3NwYWNlLAorICAgICAgX1NfZXJyb3JfYmFkcmVwZWF0LAorICAgICAgX1NfZXJyb3JfY29tcGxleGl0eSwKKyAgICAgIF9TX2Vycm9yX3N0YWNrLAorICAgICAgX1NfZXJyb3JfbGFzdAorICAgIH07CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGNvbGxhdGluZyBlbGVtZW50IG5hbWUuICovCisgIGNvbnN0ZXhwciBlcnJvcl90eXBlIGVycm9yX2NvbGxhdGUoX1NfZXJyb3JfY29sbGF0ZSk7CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGNoYXJhY3RlciBjbGFzcyBuYW1lLiAqLworICBjb25zdGV4cHIgZXJyb3JfdHlwZSBlcnJvcl9jdHlwZShfU19lcnJvcl9jdHlwZSk7CisKKyAgLyoqCisgICAqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGVzY2FwZWQgY2hhcmFjdGVyLCBvciBhIHRyYWlsaW5nCisgICAqIGVzY2FwZS4KKyAgICovCisgIGNvbnN0ZXhwciBlcnJvcl90eXBlIGVycm9yX2VzY2FwZShfU19lcnJvcl9lc2NhcGUpOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgYW4gaW52YWxpZCBiYWNrIHJlZmVyZW5jZS4gKi8KKyAgY29uc3RleHByIGVycm9yX3R5cGUgZXJyb3JfYmFja3JlZihfU19lcnJvcl9iYWNrcmVmKTsKKworICAvKiogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIG1pc21hdGNoZWQgWyBhbmQgXS4gKi8KKyAgY29uc3RleHByIGVycm9yX3R5cGUgZXJyb3JfYnJhY2soX1NfZXJyb3JfYnJhY2spOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgbWlzbWF0Y2hlZCAoIGFuZCApLiAqLworICBjb25zdGV4cHIgZXJyb3JfdHlwZSBlcnJvcl9wYXJlbihfU19lcnJvcl9wYXJlbik7CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBtaXNtYXRjaGVkIHsgYW5kIH0gKi8KKyAgY29uc3RleHByIGVycm9yX3R5cGUgZXJyb3JfYnJhY2UoX1NfZXJyb3JfYnJhY2UpOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgYW4gaW52YWxpZCByYW5nZSBpbiBhIHt9IGV4cHJlc3Npb24uICovCisgIGNvbnN0ZXhwciBlcnJvcl90eXBlIGVycm9yX2JhZGJyYWNlKF9TX2Vycm9yX2JhZGJyYWNlKTsKKworICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIGFuIGludmFsaWQgY2hhcmFjdGVyIHJhbmdlLAorICAgKiBzdWNoIGFzIFtiLWFdIGluIG1vc3QgZW5jb2RpbmdzLgorICAgKi8KKyAgY29uc3RleHByIGVycm9yX3R5cGUgZXJyb3JfcmFuZ2UoX1NfZXJyb3JfcmFuZ2UpOworCisgIC8qKgorICAgKiBUaGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBjb252ZXJ0IHRoZSBleHByZXNzaW9uIGludG8gYQorICAgKiBmaW5pdGUgc3RhdGUgbWFjaGluZS4KKyAgICovCisgIGNvbnN0ZXhwciBlcnJvcl90eXBlIGVycm9yX3NwYWNlKF9TX2Vycm9yX3NwYWNlKTsKKworICAvKioKKyAgICogT25lIG9mIDxlbT4qPyt7PC9lbT4gd2FzIG5vdCBwcmVjZWRlZCBieSBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICovCisgIGNvbnN0ZXhwciBlcnJvcl90eXBlIGVycm9yX2JhZHJlcGVhdChfU19lcnJvcl9iYWRyZXBlYXQpOworCisgIC8qKgorICAgKiBUaGUgY29tcGxleGl0eSBvZiBhbiBhdHRlbXB0ZWQgbWF0Y2ggYWdhaW5zdCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiBleGNlZWRlZCBhIHByZS1zZXQgbGV2ZWwuCisgICAqLworICBjb25zdGV4cHIgZXJyb3JfdHlwZSBlcnJvcl9jb21wbGV4aXR5KF9TX2Vycm9yX2NvbXBsZXhpdHkpOworCisgIC8qKgorICAgKiBUaGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUKKyAgICogcmVndWxhciBleHByZXNzaW9uIGNvdWxkIG1hdGNoIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgKi8KKyAgY29uc3RleHByIGVycm9yX3R5cGUgZXJyb3Jfc3RhY2soX1NfZXJyb3Jfc3RhY2spOworCisgIC8vQH0KK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzCisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gWzcuOF0gQ2xhc3MgcmVnZXhfZXJyb3IKKyAgLyoqCisgICAqIEBicmllZiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBleGNlcHRpb24gY2xhc3MuCisgICAqIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICoKKyAgICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaWJyYXJ5IHRocm93cyBvYmplY3RzIG9mIHRoaXMgY2xhc3Mgb24gZXJyb3IuCisgICAqLworICBjbGFzcyByZWdleF9lcnJvciA6IHB1YmxpYyBzdGQ6OnJ1bnRpbWVfZXJyb3IKKyAgeworICAgIHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfdHlwZSBfTV9jb2RlOworCisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIHJlZ2V4X2Vycm9yIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBfX2Vjb2RlIHRoZSByZWdleCBlcnJvciBjb2RlLgorICAgICAqLworICAgIGV4cGxpY2l0CisgICAgcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl90eXBlIF9fZWNvZGUpOworCisgICAgdmlydHVhbCB+cmVnZXhfZXJyb3IoKSB0aHJvdygpOworCisgICAgLyoqCisgICAgICogQGJyaWVmIEdldHMgdGhlIHJlZ2V4IGVycm9yIGNvZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJucyB0aGUgcmVnZXggZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICByZWdleF9jb25zdGFudHM6OmVycm9yX3R5cGUKKyAgICBjb2RlKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9jb2RlOyB9CisgIH07CisKKyAgLy9AfSAvLyBncm91cCByZWdleAorCisgIHZvaWQKKyAgX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX3R5cGUgX19lY29kZSk7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfZ3JlcF9tYXRjaGVyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfZ3JlcF9tYXRjaGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5N2ZjMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9ncmVwX21hdGNoZXIuaApAQCAtMCwwICsxLDEzOCBAQAorLy8gY2xhc3MgdGVtcGxhdGUgcmVnZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiAgQGZpbGUgYml0cy9yZWdleF9ncmVwX21hdGNoZXIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3JlZ2V4fQorICovCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGNsYXNzIHN1Yl9tYXRjaDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBjbGFzcyBtYXRjaF9yZXN1bHRzOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgCituYW1lc3BhY2UgX19kZXRhaWwKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAZGVmZ3JvdXAgcmVnZXgtZGV0YWlsIEJhc2UgYW5kIEltcGxlbWVudGF0aW9uIENsYXNzZXMKKyAgICogIEBpbmdyb3VwIHJlZ2V4CisgICAqICBAeworICAgKi8KKworICAvLy8gQSBfUmVzdWx0cyBmYWNhZGUgc3BlY2lhbGl6ZWQgZm9yIHdyYXBwaW5nIGEgdGVtcGxhdGVkIG1hdGNoX3Jlc3VsdHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RJdGVyVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIF9TcGVjaWFsaXplZFJlc3VsdHMKKyAgICA6IHB1YmxpYyBfUmVzdWx0cworICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBfU3BlY2lhbGl6ZWRSZXN1bHRzKGNvbnN0IF9BdXRvbWF0b246Ol9TaXplVCBfX3NpemUsCisJCQkgIGNvbnN0IF9TcGVjaWFsaXplZEN1cnNvcjxfRndkSXRlclQ+JiBfX2N1cnNvciwKKwkJCSAgbWF0Y2hfcmVzdWx0czxfRndkSXRlclQsIF9BbGxvYz4mIF9fbSk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3NldF9wb3MoaW50IF9faSwgaW50IF9faiwgY29uc3QgX1BhdHRlcm5DdXJzb3ImIF9fcGMpOworCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfbWF0Y2hlZChpbnQgX19pLCBib29sIF9faXNfbWF0Y2hlZCkKKyAgICAgIHsgX01fcmVzdWx0cy5hdChfX2kpLm1hdGNoZWQgPSBfX2lzX21hdGNoZWQ7IH0KKworICAgIHByaXZhdGU6CisgICAgICBtYXRjaF9yZXN1bHRzPF9Gd2RJdGVyVCwgX0FsbG9jPiYgX01fcmVzdWx0czsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RJdGVyVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9TcGVjaWFsaXplZFJlc3VsdHM8X0Z3ZEl0ZXJULCBfQWxsb2M+OjoKKyAgICBfU3BlY2lhbGl6ZWRSZXN1bHRzKGNvbnN0IF9BdXRvbWF0b246Ol9TaXplVCBfX3NpemUsCisgICAgCQkJY29uc3QgX1NwZWNpYWxpemVkQ3Vyc29yPF9Gd2RJdGVyVD4mIF9fY3Vyc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfcmVzdWx0czxfRndkSXRlclQsIF9BbGxvYz4mIF9fbSkKKyAgICA6IF9NX3Jlc3VsdHMoX19tKQorICAgIHsKKyAgICAgIF9NX3Jlc3VsdHMuY2xlYXIoKTsKKyAgICAgIF9NX3Jlc3VsdHMucmVzZXJ2ZShfX3NpemUgKyAyKTsKKyAgICAgIF9NX3Jlc3VsdHMucmVzaXplKF9fc2l6ZSk7CisgICAgICB0eXBlbmFtZSBtYXRjaF9yZXN1bHRzPF9Gd2RJdGVyVCwgX0FsbG9jPjo6dmFsdWVfdHlwZSBfX3NtOworICAgICAgX19zbS5maXJzdCA9IF9fc20uc2Vjb25kID0gX19jdXJzb3IuX01fYmVnaW4oKTsKKyAgICAgIF9NX3Jlc3VsdHMucHVzaF9iYWNrKF9fc20pOworICAgICAgX19zbS5maXJzdCA9IF9fc20uc2Vjb25kID0gX19jdXJzb3IuX01fZW5kKCk7CisgICAgICBfTV9yZXN1bHRzLnB1c2hfYmFjayhfX3NtKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZEl0ZXJULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9TcGVjaWFsaXplZFJlc3VsdHM8X0Z3ZEl0ZXJULCBfQWxsb2M+OjoKKyAgICBfTV9zZXRfcG9zKGludCBfX2ksIGludCBfX2osIGNvbnN0IF9QYXR0ZXJuQ3Vyc29yJiBfX3BjKQorICAgIHsgCisgICAgICB0eXBlZGVmIGNvbnN0IF9TcGVjaWFsaXplZEN1cnNvcjxfRndkSXRlclQ+JiBfQ3Vyc29yVDsKKyAgICAgIF9DdXJzb3JUIF9fYyA9IHN0YXRpY19jYXN0PF9DdXJzb3JUPihfX3BjKTsKKyAgICAgIGlmIChfX2ogPT0gMCkKKwlfTV9yZXN1bHRzLmF0KF9faSkuZmlyc3QgPSBfX2MuX01fcG9zKCk7CisgICAgICBlbHNlCisJX01fcmVzdWx0cy5hdChfX2kpLnNlY29uZCA9IF9fYy5fTV9wb3MoKSsxOworICAgIH0KKworICAvLy8gQSBzdGFjayBvZiBzdGF0ZXMgdXNlZCBpbiBldmFsdWF0aW5nIHRoZSBORkEuCisgIHR5cGVkZWYgc3RkOjpzdGFjazxfU3RhdGVJZFQsIHN0ZDo6dmVjdG9yPF9TdGF0ZUlkVD4gPiBfU3RhdGVTdGFjazsKKworICAvLy8gRXhlY3V0ZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gTkZBL0RGQSBvdmVyIGEgcmFuZ2UgdXNpbmcgYQorICAvLy8gdmFyaWFudCBvZiB0aGUgcGFyYWxsZWwgZXhlY3V0aW9uIGFsZ29yaXRobSBmZWF0dXJlZCBpbiB0aGUgZ3JlcAorICAvLy8gdXRpbGl0eSwgbW9kaWZpZWQgdG8gdXNlIExhdXJpa2FyaSB0YWdzLgorICBjbGFzcyBfR3JlcF9tYXRjaGVyCisgIHsKKyAgcHVibGljOgorICAgIF9HcmVwX21hdGNoZXIoX1BhdHRlcm5DdXJzb3ImICAgICAgICAgICAgICAgICAgIF9fcCwKKwkJICBfUmVzdWx0cyYgICAgICAgICAgICAgICAgICAgICAgICAgX19yLAorCQkgIGNvbnN0IF9BdXRvbWF0b25QdHImICAgICAgICAgICAgICBfX2F1dG9tYXRvbiwKKwkJICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSAgX19mbGFncyk7CisKKyAgcHJpdmF0ZToKKyAgICBfU3RhdGVTZXQKKyAgICBfTV9lX2Nsb3N1cmUoX1N0YXRlSWRUIF9faSk7CisKKyAgICBfU3RhdGVTZXQKKyAgICBfTV9lX2Nsb3N1cmUoY29uc3QgX1N0YXRlU2V0JiBfX3MpOworCisgICAgX1N0YXRlU2V0CisgICAgX01fZV9jbG9zdXJlKF9TdGF0ZVN0YWNrJiBfX3N0YWNrLCBjb25zdCBfU3RhdGVTZXQmIF9fcyk7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X05mYT4gICAgICAgIF9NX25mYTsKKyAgICBfUGF0dGVybkN1cnNvciYgICAgICAgICAgICAgICAgICAgIF9NX3BhdHRlcm47CisgICAgX1Jlc3VsdHMmICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9yZXN1bHRzOworICB9OworCisgLy9AfSByZWdleC1kZXRhaWwKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjaW5jbHVkZSA8Yml0cy9yZWdleF9ncmVwX21hdGNoZXIudGNjPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X2dyZXBfbWF0Y2hlci50Y2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfZ3JlcF9tYXRjaGVyLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTM4MmQ1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X2dyZXBfbWF0Y2hlci50Y2MKQEAgLTAsMCArMSwxNzkgQEAKKy8vIGNsYXNzIHRlbXBsYXRlIHJlZ2V4IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogIEBmaWxlIGJpdHMvcmVnZXhfZ3JlcF9tYXRjaGVyLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3JlZ2V4fQorICovCisKKyNpbmNsdWRlIDxyZWdleD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UKK3sKKyAgLy8gQSBzdGFjayBvZiBzdGF0ZXMgdXNlZCBpbiBldmFsdWF0aW5nIHRoZSBORkEuCisgIHR5cGVkZWYgc3RkOjpzdGFjazxzdGQ6Ol9fZGV0YWlsOjpfU3RhdGVJZFQsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6Ol9fZGV0YWlsOjpfU3RhdGVJZFQ+CisJCSAgICAgPiBfU3RhdGVTdGFjazsKKworICAvLyBPYnRhaW5zIHRoZSBuZXh0IHN0YXRlIHNldCBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZSBzZXQgX19zIGFuZCB0aGUgY3VycmVudAorICAvLyBpbnB1dCBjaGFyYWN0ZXIuCisgIGlubGluZSBzdGQ6Ol9fZGV0YWlsOjpfU3RhdGVTZXQKKyAgX19tb3ZlKGNvbnN0IHN0ZDo6X19kZXRhaWw6Ol9QYXR0ZXJuQ3Vyc29yJiBfX3AsCisgICAgICAgICBjb25zdCBzdGQ6Ol9fZGV0YWlsOjpfTmZhJiBfX25mYSwKKyAgICAgICAgIGNvbnN0IHN0ZDo6X19kZXRhaWw6Ol9TdGF0ZVNldCYgX19zKQorICB7CisgICAgc3RkOjpfX2RldGFpbDo6X1N0YXRlU2V0IF9fbTsKKyAgICBmb3IgKHN0ZDo6X19kZXRhaWw6Ol9TdGF0ZVNldDo6Y29uc3RfaXRlcmF0b3IgX19pID0gX19zLmJlZ2luKCk7CisJIF9faSAhPSBfX3MuZW5kKCk7ICsrX19pKQorICAgICAgeworCWlmICgqX19pID09IHN0ZDo6X19kZXRhaWw6Ol9TX2ludmFsaWRfc3RhdGVfaWQpCisJICBjb250aW51ZTsKKworCWNvbnN0IHN0ZDo6X19kZXRhaWw6Ol9TdGF0ZSYgX19zdGF0ZSA9IF9fbmZhWypfX2ldOworCWlmIChfX3N0YXRlLl9NX29wY29kZSA9PSBzdGQ6Ol9fZGV0YWlsOjpfU19vcGNvZGVfbWF0Y2gKKwkgICAgJiYgX19zdGF0ZS5fTV9tYXRjaGVzKF9fcCkpCisJICBfX20uaW5zZXJ0KF9fc3RhdGUuX01fbmV4dCk7CisgICAgICB9CisgICAgcmV0dXJuIF9fbTsKKyAgfQorCisgIC8vIHJldHVybnMgdHJ1ZSBpZiAoX19zIGludGVyc2VjdCBfX3QpIGlzIG5vdCBlbXB0eQorICBpbmxpbmUgYm9vbAorICBfX2luY2x1ZGVzX3NvbWUoY29uc3Qgc3RkOjpfX2RldGFpbDo6X1N0YXRlU2V0JiBfX3MsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Ol9fZGV0YWlsOjpfU3RhdGVTZXQmIF9fdCkKKyAgeworICAgIGlmIChfX3Muc2l6ZSgpID4gMCAmJiBfX3Quc2l6ZSgpID4gMCkKKyAgICAgIHsKKwlzdGQ6Ol9fZGV0YWlsOjpfU3RhdGVTZXQ6OmNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QgPSBfX3MuYmVnaW4oKTsKKwlzdGQ6Ol9fZGV0YWlsOjpfU3RhdGVTZXQ6OmNvbnN0X2l0ZXJhdG9yIF9fc2Vjb25kID0gX190LmJlZ2luKCk7CisJd2hpbGUgKF9fZmlyc3QgIT0gX19zLmVuZCgpICYmIF9fc2Vjb25kICE9IF9fdC5lbmQoKSkKKwkgIHsKKwkgICAgaWYgKCpfX2ZpcnN0IDwgKl9fc2Vjb25kKQorCSAgICAgICsrX19maXJzdDsKKwkgICAgZWxzZSBpZiAoKl9fc2Vjb25kIDwgKl9fZmlyc3QpCisJICAgICAgKytfX3NlY29uZDsKKwkgICAgZWxzZQorCSAgICAgIHJldHVybiB0cnVlOworCSAgfQorICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIElmIGFuIGlkZW50aWZpZWQgc3RhdGUgX191IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBjdXJyZW50IHN0YXRlIHNldCBfX2UsCisgIC8vIGluc2VydCBpdCBhbmQgcHVzaCBpdCBvbiB0aGUgY3VycmVudCBzdGF0ZSBzdGFjayBfX3MuCisgIGlubGluZSB2b2lkCisgIF9fYWRkX3Zpc2l0ZWRfc3RhdGUoY29uc3Qgc3RkOjpfX2RldGFpbDo6X1N0YXRlSWRUIF9fdSwKKyAgICAgICAgICAgICAgICAgICAgICBfU3RhdGVTdGFjayYgICAgICAgICAgICAgICAgICBfX3MsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpfX2RldGFpbDo6X1N0YXRlU2V0JiAgICAgIF9fZSkKKyAgeworICAgIGlmIChfX2UuY291bnQoX191KSA9PSAwKQorICAgICAgeworCV9fZS5pbnNlcnQoX191KTsKKwlfX3MucHVzaChfX3UpOworICAgICAgfQorICB9CisKK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCituYW1lc3BhY2UgX19kZXRhaWwKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgaW5saW5lIF9HcmVwX21hdGNoZXI6OgorICBfR3JlcF9tYXRjaGVyKF9QYXR0ZXJuQ3Vyc29yJiBfX3AsIF9SZXN1bHRzJiBfX3IsCisJCWNvbnN0IF9BdXRvbWF0b25QdHImIF9fbmZhLAorCQlyZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzKQorICA6IF9NX25mYShzdGF0aWNfcG9pbnRlcl9jYXN0PF9OZmE+KF9fbmZhKSksIF9NX3BhdHRlcm4oX19wKSwgX01fcmVzdWx0cyhfX3IpCisgIHsKKyAgICBfX2RldGFpbDo6X1N0YXRlU2V0IF9fdCA9IHRoaXMtPl9NX2VfY2xvc3VyZShfTV9uZmEtPl9NX3N0YXJ0KCkpOworICAgIGZvciAoOyAhX01fcGF0dGVybi5fTV9hdF9lbmQoKTsgX01fcGF0dGVybi5fTV9uZXh0KCkpCisgICAgICBfX3QgPSB0aGlzLT5fTV9lX2Nsb3N1cmUoX19tb3ZlKF9NX3BhdHRlcm4sICpfTV9uZmEsIF9fdCkpOworCisgICAgX01fcmVzdWx0cy5fTV9zZXRfbWF0Y2hlZCgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pbmNsdWRlc19zb21lKF9NX25mYS0+X01fZmluYWxfc3RhdGVzKCksIF9fdCkpOworICB9CisKKyAgLy8gQ3JlYXRlcyB0aGUgZS1jbG9zdXJlIHNldCBmb3IgdGhlIGluaXRpYWwgc3RhdGUgX19pLgorICBpbmxpbmUgX1N0YXRlU2V0IF9HcmVwX21hdGNoZXI6OgorICBfTV9lX2Nsb3N1cmUoX1N0YXRlSWRUIF9faSkKKyAgeworICAgIF9TdGF0ZVNldCBfX3M7CisgICAgX19zLmluc2VydChfX2kpOworICAgIF9TdGF0ZVN0YWNrIF9fc3RhY2s7CisgICAgX19zdGFjay5wdXNoKF9faSk7CisgICAgcmV0dXJuIHRoaXMtPl9NX2VfY2xvc3VyZShfX3N0YWNrLCBfX3MpOworICB9CisKKyAgLy8gQ3JlYXRlcyB0aGUgZS1jbG9zdXJlIHNldCBmb3IgYW4gYXJiaXRyYXJ5IHN0YXRlIHNldCBfX3MuCisgIGlubGluZSBfU3RhdGVTZXQgX0dyZXBfbWF0Y2hlcjo6CisgIF9NX2VfY2xvc3VyZShjb25zdCBfU3RhdGVTZXQmIF9fcykKKyAgeworICAgIF9TdGF0ZVN0YWNrIF9fc3RhY2s7CisgICAgZm9yIChfU3RhdGVTZXQ6OmNvbnN0X2l0ZXJhdG9yIF9faSA9IF9fcy5iZWdpbigpOyBfX2kgIT0gX19zLmVuZCgpOyArK19faSkKKyAgICAgIF9fc3RhY2sucHVzaCgqX19pKTsKKyAgICByZXR1cm4gdGhpcy0+X01fZV9jbG9zdXJlKF9fc3RhY2ssIF9fcyk7CisgIH0KKworICBpbmxpbmUgX1N0YXRlU2V0IF9HcmVwX21hdGNoZXI6OgorICBfTV9lX2Nsb3N1cmUoX1N0YXRlU3RhY2smIF9fc3RhY2ssIGNvbnN0IF9TdGF0ZVNldCYgX19zKQorICB7CisgICAgX1N0YXRlU2V0IF9fZSA9IF9fczsKKyAgICB3aGlsZSAoIV9fc3RhY2suZW1wdHkoKSkKKyAgICAgIHsKKwlfU3RhdGVJZFQgX190ID0gX19zdGFjay50b3AoKTsgX19zdGFjay5wb3AoKTsKKwlpZiAoX190ID09IF9TX2ludmFsaWRfc3RhdGVfaWQpCisJICBjb250aW51ZTsKKwkvLyBmb3IgZWFjaCBfX3Ugd2l0aCBlZGdlIGZyb20gX190IHRvIF9fdSBsYWJlbGVkIGUgZG8gLi4uCisJY29uc3QgX1N0YXRlJiBfX3N0YXRlID0gX01fbmZhLT5vcGVyYXRvcltdKF9fdCk7CisJc3dpdGNoIChfX3N0YXRlLl9NX29wY29kZSkKKwkgIHsKKwkgIGNhc2UgX1Nfb3Bjb2RlX2FsdGVybmF0aXZlOgorCSAgICBfX2FkZF92aXNpdGVkX3N0YXRlKF9fc3RhdGUuX01fbmV4dCwgX19zdGFjaywgX19lKTsKKwkgICAgX19hZGRfdmlzaXRlZF9zdGF0ZShfX3N0YXRlLl9NX2FsdCwgX19zdGFjaywgX19lKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIF9TX29wY29kZV9zdWJleHByX2JlZ2luOgorCSAgICBfX2FkZF92aXNpdGVkX3N0YXRlKF9fc3RhdGUuX01fbmV4dCwgX19zdGFjaywgX19lKTsKKwkgICAgX19zdGF0ZS5fTV90YWdnZXIoX01fcGF0dGVybiwgX01fcmVzdWx0cyk7CisJICAgIGJyZWFrOworCSAgY2FzZSBfU19vcGNvZGVfc3ViZXhwcl9lbmQ6CisJICAgIF9fYWRkX3Zpc2l0ZWRfc3RhdGUoX19zdGF0ZS5fTV9uZXh0LCBfX3N0YWNrLCBfX2UpOworCSAgICBfX3N0YXRlLl9NX3RhZ2dlcihfTV9wYXR0ZXJuLCBfTV9yZXN1bHRzKTsKKwkgICAgX01fcmVzdWx0cy5fTV9zZXRfbWF0Y2hlZChfX3N0YXRlLl9NX3N1YmV4cHIsIHRydWUpOworCSAgICBicmVhazsKKwkgIGNhc2UgX1Nfb3Bjb2RlX2FjY2VwdDoKKwkgICAgX19hZGRfdmlzaXRlZF9zdGF0ZShfX3N0YXRlLl9NX25leHQsIF9fc3RhY2ssIF9fZSk7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJICB9CisgICAgICB9CisgICAgcmV0dXJuIF9fZTsKKyAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIF9fZGV0YWlsCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X25mYS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X25mYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMzAyMzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfbmZhLmgKQEAgLTAsMCArMSw0MTUgQEAKKy8vIGNsYXNzIHRlbXBsYXRlIHJlZ2V4IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogIEBmaWxlIGJpdHMvcmVnZXhfbmZhLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtyZWdleH0KKyAqLworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX2RldGFpbAoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgcmVnZXgtZGV0YWlsCisgICAqIEB7CisgICAqLworCisgIC8vLyBCYXNlIGNsYXNzIGZvciwgdW0sIGF1dG9tYXRhLiAgQ291bGQgYmUgYW4gTkZBIG9yIGEgREZBLiAgWW91ciBjaG9pY2UuCisgIGNsYXNzIF9BdXRvbWF0b24KKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgX1NpemVUOworCisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsCisgICAgfl9BdXRvbWF0b24oKSB7IH0KKworICAgIHZpcnR1YWwgX1NpemVUCisgICAgX01fc3ViX2NvdW50KCkgY29uc3QgPSAwOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYKKyAgICBfTV9kb3Qoc3RkOjpvc3RyZWFtJiBfX29zdHIpIGNvbnN0ID0gMDsKKyNlbmRpZgorICB9OworCisgIC8vLyBHZW5lcmljIHNoYXJlZCBwb2ludGVyIHRvIGFuIGF1dG9tYXRvbi4gIAorICB0eXBlZGVmIHN0ZDo6c2hhcmVkX3B0cjxfQXV0b21hdG9uPiBfQXV0b21hdG9uUHRyOworCisgIC8vLyBPcGVyYXRpb24gY29kZXMgdGhhdCBkZWZpbmUgdGhlIHR5cGUgb2YgdHJhbnNpdGlvbnMgd2l0aGluIHRoZSBiYXNlIE5GQQorICAvLy8gdGhhdCByZXByZXNlbnRzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgIGVudW0gX09wY29kZQorICB7CisgICAgICBfU19vcGNvZGVfdW5rbm93biAgICAgICA9ICAgMCwKKyAgICAgIF9TX29wY29kZV9hbHRlcm5hdGl2ZSAgID0gICAxLAorICAgICAgX1Nfb3Bjb2RlX3N1YmV4cHJfYmVnaW4gPSAgIDQsCisgICAgICBfU19vcGNvZGVfc3ViZXhwcl9lbmQgICA9ICAgNSwKKyAgICAgIF9TX29wY29kZV9tYXRjaCAgICAgICAgID0gMTAwLAorICAgICAgX1Nfb3Bjb2RlX2FjY2VwdCAgICAgICAgPSAyNTUKKyAgfTsKKworICAvLy8gUHJvdmlkZXMgYSBnZW5lcmljIGZhY2FkZSBmb3IgYSB0ZW1wbGF0ZWQgbWF0Y2hfcmVzdWx0cy4KKyAgc3RydWN0IF9SZXN1bHRzCisgIHsKKyAgICB2aXJ0dWFsIHZvaWQgX01fc2V0X3BvcyhpbnQgX19pLCBpbnQgX19qLCBjb25zdCBfUGF0dGVybkN1cnNvciYgX19wKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIF9NX3NldF9tYXRjaGVkKGludCBfX2ksIGJvb2wgX19pc19tYXRjaGVkKSA9IDA7CisgIH07CisKKyAgLy8vIFRhZ3MgY3VycmVudCBzdGF0ZSAoZm9yIHN1YmV4cHIgYmVnaW4vZW5kKS4KKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQgKGNvbnN0IF9QYXR0ZXJuQ3Vyc29yJiwgX1Jlc3VsdHMmKT4gX1RhZ2dlcjsKKworICAvLy8gU3RhcnQgc3RhdGUgdGFnLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkSXRlclQsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIHN0cnVjdCBfU3RhcnRUYWdnZXIKKyAgICB7CisgICAgICBleHBsaWNpdAorICAgICAgX1N0YXJ0VGFnZ2VyKGludCBfX2kpCisgICAgICA6IF9NX2luZGV4KF9faSkKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9QYXR0ZXJuQ3Vyc29yJiBfX3BjLCBfUmVzdWx0cyYgX19yKQorICAgICAgeyBfX3IuX01fc2V0X3BvcyhfTV9pbmRleCwgMCwgX19wYyk7IH0KKworICAgICAgaW50ICAgICAgIF9NX2luZGV4OworICAgIH07CisKKyAgLy8vIEVuZCBzdGF0ZSB0YWcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RJdGVyVCwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgc3RydWN0IF9FbmRUYWdnZXIKKyAgICB7CisgICAgICBleHBsaWNpdAorICAgICAgX0VuZFRhZ2dlcihpbnQgX19pKQorICAgICAgOiBfTV9pbmRleChfX2kpCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfUGF0dGVybkN1cnNvciYgX19wYywgX1Jlc3VsdHMmIF9fcikKKyAgICAgIHsgX19yLl9NX3NldF9wb3MoX01faW5kZXgsIDEsIF9fcGMpOyB9CisKKyAgICAgIGludCAgICAgICBfTV9pbmRleDsKKyAgICAgIF9Gd2RJdGVyVCBfTV9wb3M7CisgICAgfTsKKworICAvLy8gSW5kaWNhdGVzIGlmIGN1cnJlbnQgc3RhdGUgbWF0Y2hlcyBjdXJzb3IgY3VycmVudC4KKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGJvb2wgKGNvbnN0IF9QYXR0ZXJuQ3Vyc29yJik+IF9NYXRjaGVyOworCisgIC8vLyBNYXRjaGVzIGFueSBjaGFyYWN0ZXIKKyAgaW5saW5lIGJvb2wKKyAgX0FueU1hdGNoZXIoY29uc3QgX1BhdHRlcm5DdXJzb3ImKQorICB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIE1hdGNoZXMgYSBzaW5nbGUgY2hhcmFjdGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXJULCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBzdHJ1Y3QgX0NoYXJNYXRjaGVyCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVDo6Y2hhcl90eXBlIGNoYXJfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9DaGFyTWF0Y2hlcihjaGFyX3R5cGUgX19jLCBjb25zdCBfVHJhaXRzVCYgX190ID0gX1RyYWl0c1QoKSkKKyAgICAgIDogX01fdHJhaXRzKF9fdCksIF9NX2MoX01fdHJhaXRzLnRyYW5zbGF0ZShfX2MpKQorICAgICAgeyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1BhdHRlcm5DdXJzb3ImIF9fcGMpIGNvbnN0CisgICAgICB7CisJdHlwZWRlZiBjb25zdCBfU3BlY2lhbGl6ZWRDdXJzb3I8X0luSXRlclQ+JiBfQ3Vyc29yVDsKKwlfQ3Vyc29yVCBfX2MgPSBzdGF0aWNfY2FzdDxfQ3Vyc29yVD4oX19wYyk7CisJcmV0dXJuIF9NX3RyYWl0cy50cmFuc2xhdGUoX19jLl9NX2N1cnJlbnQoKSkgPT0gX01fYzsKKyAgICAgIH0KKworICAgICAgY29uc3QgX1RyYWl0c1QmIF9NX3RyYWl0czsKKyAgICAgIGNoYXJfdHlwZSAgICAgICBfTV9jOworICAgIH07CisKKyAgLy8vIE1hdGNoZXMgYSBjaGFyYWN0ZXIgcmFuZ2UgKGJyYWNrZXQgZXhwcmVzc2lvbikKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlclQsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIHN0cnVjdCBfUmFuZ2VNYXRjaGVyCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVDo6Y2hhcl90eXBlIF9DaGFyVDsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJUPiAgICBfU3RyaW5nVDsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9SYW5nZU1hdGNoZXIoYm9vbCBfX2lzX25vbl9tYXRjaGluZywgY29uc3QgX1RyYWl0c1QmIF9fdCA9IF9UcmFpdHNUKCkpCisgICAgICA6IF9NX3RyYWl0cyhfX3QpLCBfTV9pc19ub25fbWF0Y2hpbmcoX19pc19ub25fbWF0Y2hpbmcpCisgICAgICB7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfUGF0dGVybkN1cnNvciYgX19wYykgY29uc3QKKyAgICAgIHsKKwl0eXBlZGVmIGNvbnN0IF9TcGVjaWFsaXplZEN1cnNvcjxfSW5JdGVyVD4mIF9DdXJzb3JUOworCV9DdXJzb3JUIF9fYyA9IHN0YXRpY19jYXN0PF9DdXJzb3JUPihfX3BjKTsKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fYWRkX2NoYXIoX0NoYXJUIF9fYykKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hZGRfY29sbGF0aW5nX2VsZW1lbnQoY29uc3QgX1N0cmluZ1QmIF9fcykKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hZGRfZXF1aXZhbGVuY2VfY2xhc3MoY29uc3QgX1N0cmluZ1QmIF9fcykKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hZGRfY2hhcmFjdGVyX2NsYXNzKGNvbnN0IF9TdHJpbmdUJiBfX3MpCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fbWFrZV9yYW5nZSgpCisgICAgICB7IH0KKworICAgICAgY29uc3QgX1RyYWl0c1QmIF9NX3RyYWl0czsKKyAgICAgIGJvb2wgICAgICAgICAgICBfTV9pc19ub25fbWF0Y2hpbmc7CisgICAgfTsKKworICAvLy8gSWRlbnRpZmllcyBhIHN0YXRlIGluIHRoZSBORkEuCisgIHR5cGVkZWYgaW50IF9TdGF0ZUlkVDsKKworICAvLy8gVGhlIHNwZWNpYWwgY2FzZSBpbiB3aGljaCBhIHN0YXRlIGlkZW50aWZpZXIgaXMgbm90IGFuIGluZGV4LgorICBzdGF0aWMgY29uc3QgX1N0YXRlSWRUIF9TX2ludmFsaWRfc3RhdGVfaWQgID0gLTE7CisKKworICAvKioKKyAgICogQGJyaWVmIHN0cnVjdCBfU3RhdGUKKyAgICoKKyAgICogQW4gaW5kaXZpZHVhbCBzdGF0ZSBpbiBhbiBORkEKKyAgICoKKyAgICogSW4gdGhpcyBjYXNlIGEgInN0YXRlIiBpcyBhbiBlbnRyeSBpbiB0aGUgTkZBIGRlZmluaXRpb24gY291cGxlZAorICAgKiB3aXRoIGl0cyBvdXRnb2luZyB0cmFuc2l0aW9uKHMpLiAgQWxsIHN0YXRlcyBoYXZlIGEgc2luZ2xlIG91dGdvaW5nCisgICAqIHRyYW5zaXRpb24sIGV4Y2VwdCBmb3IgYWNjZXB0aW5nIHN0YXRlcyAod2hpY2ggaGF2ZSBubyBvdXRnb2luZworICAgKiB0cmFuc2l0aW9ucykgYW5kIGFsdCBzdGF0ZXMsIHdoaWNoIGhhdmUgdHdvIG91dGdvaW5nIHRyYW5zaXRpb25zLgorICAgKi8KKyAgc3RydWN0IF9TdGF0ZQorICB7CisgICAgdHlwZWRlZiBpbnQgIF9PcGNvZGVUOworCisgICAgX09wY29kZVQgICAgIF9NX29wY29kZTsgICAgLy8gdHlwZSBvZiBvdXRnb2luZyB0cmFuc2l0aW9uCisgICAgX1N0YXRlSWRUICAgIF9NX25leHQ7ICAgICAgLy8gb3V0Z29pbmcgdHJhbnNpdGlvbgorICAgIF9TdGF0ZUlkVCAgICBfTV9hbHQ7ICAgICAgIC8vIGZvciBfU19vcGNvZGVfYWx0ZXJuYXRpdmUKKyAgICB1bnNpZ25lZCBpbnQgX01fc3ViZXhwcjsgICAvLyBmb3IgX1Nfb3Bjb2RlX3N1YmV4cHJfKgorICAgIF9UYWdnZXIgICAgICBfTV90YWdnZXI7ICAgIC8vIGZvciBfU19vcGNvZGVfc3ViZXhwcl8qCisgICAgX01hdGNoZXIgICAgIF9NX21hdGNoZXM7ICAgLy8gZm9yIF9TX29wY29kZV9tYXRjaAorCisgICAgZXhwbGljaXQgX1N0YXRlKF9PcGNvZGVUIF9fb3Bjb2RlKQorICAgIDogX01fb3Bjb2RlKF9fb3Bjb2RlKSwgX01fbmV4dChfU19pbnZhbGlkX3N0YXRlX2lkKQorICAgIHsgfQorCisgICAgX1N0YXRlKGNvbnN0IF9NYXRjaGVyJiBfX20pCisgICAgOiBfTV9vcGNvZGUoX1Nfb3Bjb2RlX21hdGNoKSwgX01fbmV4dChfU19pbnZhbGlkX3N0YXRlX2lkKSwgX01fbWF0Y2hlcyhfX20pCisgICAgeyB9CisKKyAgICBfU3RhdGUoX09wY29kZVQgX19vcGNvZGUsIHVuc2lnbmVkIGludCBfX3MsIGNvbnN0IF9UYWdnZXImIF9fdCkKKyAgICA6IF9NX29wY29kZShfX29wY29kZSksIF9NX25leHQoX1NfaW52YWxpZF9zdGF0ZV9pZCksIF9NX3N1YmV4cHIoX19zKSwKKyAgICAgIF9NX3RhZ2dlcihfX3QpCisgICAgeyB9CisKKyAgICBfU3RhdGUoX1N0YXRlSWRUIF9fbmV4dCwgX1N0YXRlSWRUIF9fYWx0KQorICAgIDogX01fb3Bjb2RlKF9TX29wY29kZV9hbHRlcm5hdGl2ZSksIF9NX25leHQoX19uZXh0KSwgX01fYWx0KF9fYWx0KQorICAgIHsgfQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICBzdGQ6Om9zdHJlYW0mCisgICAgX01fcHJpbnQoc3RkOjpvc3RyZWFtJiBvc3RyKSBjb25zdDsKKworICAgIC8vIFByaW50cyBncmFwaHZpeiBkb3QgY29tbWFuZHMgZm9yIHN0YXRlLgorICAgIHN0ZDo6b3N0cmVhbSYKKyAgICBfTV9kb3Qoc3RkOjpvc3RyZWFtJiBfX29zdHIsIF9TdGF0ZUlkVCBfX2lkKSBjb25zdDsKKyNlbmRpZgorICB9OworCisgIAorICAvLy8gVGhlIEdyZXAgTWF0Y2hlciB3b3JrcyBvbiBzZXRzIG9mIHN0YXRlcy4gIEhlcmUgYXJlIHNldHMgb2Ygc3RhdGVzLgorICB0eXBlZGVmIHN0ZDo6c2V0PF9TdGF0ZUlkVD4gX1N0YXRlU2V0OworCisgIC8qKgorICAgKiBAYnJpZWYgc3RydWN0IF9OZmEKKyAgICoKKyAgICogQSBjb2xsZWN0aW9uIG9mIGFsbCBzdGF0ZXMgbWFraW5nIHVwIGFuIE5GQS4KKyAgICoKKyAgICogQW4gTkZBIGlzIGEgNC10dXBsZSBNID0gKEssIFMsIHMsIEYpLCB3aGVyZQorICAgKiAgICBLIGlzIGEgZmluaXRlIHNldCBvZiBzdGF0ZXMsCisgICAqICAgIFMgaXMgdGhlIGFscGhhYmV0IG9mIHRoZSBORkEsCisgICAqICAgIHMgaXMgdGhlIGluaXRpYWwgc3RhdGUsCisgICAqICAgIEYgaXMgYSBzZXQgb2YgZmluYWwgKGFjY2VwdGluZykgc3RhdGVzLgorICAgKgorICAgKiBUaGlzIE5GQSBjbGFzcyBpcyB0ZW1wbGF0ZWQgb24gUywgYSB0eXBlIHRoYXQgd2lsbCBob2xkIHZhbHVlcyBvZiB0aGUKKyAgICogdW5kZXJseWluZyBhbHBoYWJldCAod2l0aG91dCByZWdhcmQgdG8gc2VtYW50aWNzIG9mIHRoYXQgYWxwaGFiZXQpLiAgVGhlCisgICAqIG90aGVyIGVsZW1lbnRzIG9mIHRoZSB0dXBsZSBhcmUgZ2VuZXJhdGVkIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgdGhlIE5GQQorICAgKiBhbmQgYXJlIGF2YWlsYWJsZSB0aHJvdWdoIGFjY2Vzc29yIG1lbWJlciBmdW5jdGlvbnMuCisgICAqLworICBjbGFzcyBfTmZhCisgIDogcHVibGljIF9BdXRvbWF0b24sIHB1YmxpYyBzdGQ6OnZlY3RvcjxfU3RhdGU+CisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX1N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1N0YXRlVDsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgICAgIF9TaXplVDsKKyAgICB0eXBlZGVmIHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIF9GbGFnVDsKKworICAgIF9OZmEoX0ZsYWdUIF9fZikKKyAgICA6IF9NX2ZsYWdzKF9fZiksIF9NX3N0YXJ0X3N0YXRlKDApLCBfTV9zdWJleHByX2NvdW50KDApCisgICAgeyB9CisKKyAgICB+X05mYSgpCisgICAgeyB9CisKKyAgICBfRmxhZ1QKKyAgICBfTV9vcHRpb25zKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9mbGFnczsgfQorCisgICAgX1N0YXRlSWRUCisgICAgX01fc3RhcnQoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3N0YXJ0X3N0YXRlOyB9CisKKyAgICBjb25zdCBfU3RhdGVTZXQmCisgICAgX01fZmluYWxfc3RhdGVzKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9hY2NlcHRpbmdfc3RhdGVzOyB9CisKKyAgICBfU2l6ZVQKKyAgICBfTV9zdWJfY291bnQoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3N1YmV4cHJfY291bnQ7IH0KKworICAgIF9TdGF0ZUlkVAorICAgIF9NX2luc2VydF9hY2NlcHQoKQorICAgIHsKKyAgICAgIHRoaXMtPnB1c2hfYmFjayhfU3RhdGVUKF9TX29wY29kZV9hY2NlcHQpKTsKKyAgICAgIF9NX2FjY2VwdGluZ19zdGF0ZXMuaW5zZXJ0KHRoaXMtPnNpemUoKS0xKTsKKyAgICAgIHJldHVybiB0aGlzLT5zaXplKCktMTsKKyAgICB9CisKKyAgICBfU3RhdGVJZFQKKyAgICBfTV9pbnNlcnRfYWx0KF9TdGF0ZUlkVCBfX25leHQsIF9TdGF0ZUlkVCBfX2FsdCkKKyAgICB7CisgICAgICB0aGlzLT5wdXNoX2JhY2soX1N0YXRlVChfX25leHQsIF9fYWx0KSk7CisgICAgICByZXR1cm4gdGhpcy0+c2l6ZSgpLTE7CisgICAgfQorCisgICAgX1N0YXRlSWRUCisgICAgX01faW5zZXJ0X21hdGNoZXIoX01hdGNoZXIgX19tKQorICAgIHsKKyAgICAgIHRoaXMtPnB1c2hfYmFjayhfU3RhdGVUKF9fbSkpOworICAgICAgcmV0dXJuIHRoaXMtPnNpemUoKS0xOworICAgIH0KKworICAgIF9TdGF0ZUlkVAorICAgIF9NX2luc2VydF9zdWJleHByX2JlZ2luKGNvbnN0IF9UYWdnZXImIF9fdCkKKyAgICB7CisgICAgICB0aGlzLT5wdXNoX2JhY2soX1N0YXRlVChfU19vcGNvZGVfc3ViZXhwcl9iZWdpbiwgX01fc3ViZXhwcl9jb3VudCsrLAorCQkJICAgICAgX190KSk7CisgICAgICByZXR1cm4gdGhpcy0+c2l6ZSgpLTE7CisgICAgfQorCisgICAgX1N0YXRlSWRUIAorICAgIF9NX2luc2VydF9zdWJleHByX2VuZCh1bnNpZ25lZCBpbnQgX19pLCBjb25zdCBfVGFnZ2VyJiBfX3QpCisgICAgeworICAgICAgdGhpcy0+cHVzaF9iYWNrKF9TdGF0ZVQoX1Nfb3Bjb2RlX3N1YmV4cHJfZW5kLCBfX2ksIF9fdCkpOworICAgICAgcmV0dXJuIHRoaXMtPnNpemUoKS0xOworICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgc3RkOjpvc3RyZWFtJgorICAgIF9NX2RvdChzdGQ6Om9zdHJlYW0mIF9fb3N0cikgY29uc3Q7CisjZW5kaWYKKworICBwcml2YXRlOgorICAgIF9GbGFnVCAgICAgX01fZmxhZ3M7CisgICAgX1N0YXRlSWRUICBfTV9zdGFydF9zdGF0ZTsKKyAgICBfU3RhdGVTZXQgIF9NX2FjY2VwdGluZ19zdGF0ZXM7CisgICAgX1NpemVUICAgICBfTV9zdWJleHByX2NvdW50OworICB9OworCisgIC8vLyBEZXNjcmliZXMgYSBzZXF1ZW5jZSBvZiBvbmUgb3IgbW9yZSAlX1N0YXRlLCBpdHMgY3VycmVudCBzdGFydAorICAvLy8gYW5kIGVuZChzKS4gIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGZyYWdtZW50cyBvZiBhbiBORkEgZHVyaW5nCisgIC8vLyBjb25zdHJ1Y3Rpb24uCisgIGNsYXNzIF9TdGF0ZVNlcQorICB7CisgIHB1YmxpYzoKKyAgICAvLyBDb25zdHJ1Y3RzIGEgc2luZ2xlLW5vZGUgc2VxdWVuY2UKKyAgICBfU3RhdGVTZXEoX05mYSYgX19zcywgX1N0YXRlSWRUIF9fcywgX1N0YXRlSWRUIF9fZSA9IF9TX2ludmFsaWRfc3RhdGVfaWQpCisgICAgOiBfTV9uZmEoX19zcyksIF9NX3N0YXJ0KF9fcyksIF9NX2VuZDEoX19zKSwgX01fZW5kMihfX2UpCisgICAgeyB9CisgICAgLy8gQ29uc3RydWN0cyBhIHNwbGl0IHNlcXVlbmNlIGZyb20gdHdvIG90aGVyIHNlcXVlbmNjZXMKKyAgICBfU3RhdGVTZXEoY29uc3QgX1N0YXRlU2VxJiBfX2UxLCBjb25zdCBfU3RhdGVTZXEmIF9fZTIpCisgICAgOiBfTV9uZmEoX19lMS5fTV9uZmEpLAorICAgICAgX01fc3RhcnQoX01fbmZhLl9NX2luc2VydF9hbHQoX19lMS5fTV9zdGFydCwgX19lMi5fTV9zdGFydCkpLAorICAgICAgX01fZW5kMShfX2UxLl9NX2VuZDEpLCBfTV9lbmQyKF9fZTIuX01fZW5kMSkKKyAgICB7IH0KKworICAgIC8vIENvbnN0cnVjdHMgYSBzcGxpdCBzZXF1ZW5jZSBmcm9tIGEgc2luZ2xlIHNlcXVlbmNlCisgICAgX1N0YXRlU2VxKGNvbnN0IF9TdGF0ZVNlcSYgX19lLCBfU3RhdGVJZFQgX19pZCkKKyAgICA6IF9NX25mYShfX2UuX01fbmZhKSwKKyAgICAgIF9NX3N0YXJ0KF9NX25mYS5fTV9pbnNlcnRfYWx0KF9faWQsIF9fZS5fTV9zdGFydCkpLAorICAgICAgX01fZW5kMShfX2lkKSwgX01fZW5kMihfX2UuX01fZW5kMSkKKyAgICB7IH0KKworICAgIC8vIENvbnN0cnVjdHMgYSBjb3B5IG9mIGEgJV9TdGF0ZVNlcQorICAgIF9TdGF0ZVNlcShjb25zdCBfU3RhdGVTZXEmIF9fcmhzKQorICAgIDogX01fbmZhKF9fcmhzLl9NX25mYSksIF9NX3N0YXJ0KF9fcmhzLl9NX3N0YXJ0KSwKKyAgICAgIF9NX2VuZDEoX19yaHMuX01fZW5kMSksIF9NX2VuZDIoX19yaHMuX01fZW5kMikKKyAgICB7IH0KKworCisgICAgX1N0YXRlU2VxJiBvcGVyYXRvcj0oY29uc3QgX1N0YXRlU2VxJiBfX3Jocyk7CisKKyAgICBfU3RhdGVJZFQKKyAgICBfTV9mcm9udCgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fc3RhcnQ7IH0KKworICAgIC8vIEV4dGVuZHMgYSBzZXF1ZW5jZSBieSBvbmUuCisgICAgdm9pZAorICAgIF9NX3B1c2hfYmFjayhfU3RhdGVJZFQgX19pZCk7CisKKyAgICAvLyBFeHRlbmRzIGFuZCBtYXliZSBqb2lucyBhIHNlcXVlbmNlLgorICAgIHZvaWQKKyAgICBfTV9hcHBlbmQoX1N0YXRlSWRUIF9faWQpOworCisgICAgdm9pZAorICAgIF9NX2FwcGVuZChfU3RhdGVTZXEmIF9fcmhzKTsKKworICAgIC8vIENsb25lcyBhbiBlbnRpcmUgc2VxdWVuY2UuCisgICAgX1N0YXRlSWRUCisgICAgX01fY2xvbmUoKTsKKworICBwcml2YXRlOgorICAgIF9OZmEmICAgICBfTV9uZmE7CisgICAgX1N0YXRlSWRUIF9NX3N0YXJ0OworICAgIF9TdGF0ZUlkVCBfTV9lbmQxOworICAgIF9TdGF0ZUlkVCBfTV9lbmQyOworCisgIH07CisKKyAvL0B9IHJlZ2V4LWRldGFpbAorX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNpbmNsdWRlIDxiaXRzL3JlZ2V4X25mYS50Y2M+CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9uZmEudGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X25mYS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyNzdmOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9uZmEudGNjCkBAIC0wLDAgKzEsMTc0IEBACisvLyBjbGFzcyB0ZW1wbGF0ZSByZWdleCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqIEBmaWxlIGJpdHMvcmVnZXhfbmZhLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3JlZ2V4fQorICovCisjaW5jbHVkZSA8cmVnZXg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fZGV0YWlsCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKK2lubGluZSBzdGQ6Om9zdHJlYW0mIF9TdGF0ZTo6CitfTV9wcmludChzdGQ6Om9zdHJlYW0mIG9zdHIpIGNvbnN0Cit7CisgIHN3aXRjaCAoX01fb3Bjb2RlKQorICB7CisgICAgY2FzZSBfU19vcGNvZGVfYWx0ZXJuYXRpdmU6CisgICAgICBvc3RyIDw8ICJhbHQgbmV4dD0iIDw8IF9NX25leHQgPDwgIiBhbHQ9IiA8PCBfTV9hbHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIF9TX29wY29kZV9zdWJleHByX2JlZ2luOgorICAgICAgb3N0ciA8PCAic3ViZXhwciBiZWdpbiBuZXh0PSIgPDwgX01fbmV4dCA8PCAiIGluZGV4PSIgPDwgX01fc3ViZXhwcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgX1Nfb3Bjb2RlX3N1YmV4cHJfZW5kOgorICAgICAgb3N0ciA8PCAic3ViZXhwciBlbmQgbmV4dD0iIDw8IF9NX25leHQgPDwgIiBpbmRleD0iIDw8IF9NX3N1YmV4cHI7CisgICAgICBicmVhazsKKyAgICBjYXNlIF9TX29wY29kZV9tYXRjaDoKKyAgICAgIG9zdHIgPDwgIm1hdGNoIG5leHQ9IiA8PCBfTV9uZXh0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBfU19vcGNvZGVfYWNjZXB0OgorICAgICAgb3N0ciA8PCAiYWNjZXB0IG5leHQ9IiA8PCBfTV9uZXh0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG9zdHIgPDwgInVua25vd24gbmV4dD0iIDw8IF9NX25leHQ7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gb3N0cjsKK30KKworLy8gUHJpbnRzIGdyYXBodml6IGRvdCBjb21tYW5kcyBmb3Igc3RhdGUuCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBfU3RhdGU6OgorX01fZG90KHN0ZDo6b3N0cmVhbSYgX19vc3RyLCBfU3RhdGVJZFQgX19pZCkgY29uc3QKK3sKKyAgc3dpdGNoIChfTV9vcGNvZGUpCisgIHsKKyAgICBjYXNlIF9TX29wY29kZV9hbHRlcm5hdGl2ZToKKyAgICAgIF9fb3N0ciA8PCBfX2lkIDw8ICIgW2xhYmVsPVwiIiA8PCBfX2lkIDw8ICJcXG5BTFRcIl07XG4iIAorICAgICAgICAgICAgIDw8IF9faWQgPDwgIiAtPiAiIDw8IF9NX25leHQKKyAgICAgICAgICAgICA8PCAiIFtsYWJlbD1cImVwc2lsb25cIiwgdGFpbHBvcnQ9XCJzXCJdO1xuIgorICAgICAgICAgICAgIDw8IF9faWQgPDwgIiAtPiAiIDw8IF9NX2FsdCAKKyAgICAgICAgICAgICA8PCAiIFtsYWJlbD1cImVwc2lsb25cIiwgdGFpbHBvcnQ9XCJuXCJdO1xuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgX1Nfb3Bjb2RlX3N1YmV4cHJfYmVnaW46CisgICAgICBfX29zdHIgPDwgX19pZCA8PCAiIFtsYWJlbD1cIiIgPDwgX19pZCA8PCAiXFxuU0JFR0lOICIKKyAgICAgICAgICAgICA8PCBfTV9zdWJleHByIDw8ICJcIl07XG4iIAorICAgICAgICAgICAgIDw8IF9faWQgPDwgIiAtPiAiIDw8IF9NX25leHQgPDwgIiBbbGFiZWw9XCJlcHNpbG9uXCJdO1xuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgX1Nfb3Bjb2RlX3N1YmV4cHJfZW5kOgorICAgICAgX19vc3RyIDw8IF9faWQgPDwgIiBbbGFiZWw9XCIiIDw8IF9faWQgPDwgIlxcblNFTkQgIgorICAgICAgICAgICAgIDw8IF9NX3N1YmV4cHIgPDwgIlwiXTtcbiIgCisgICAgICAgICAgICAgPDwgX19pZCA8PCAiIC0+ICIgPDwgX01fbmV4dCA8PCAiIFtsYWJlbD1cImVwc2lsb25cIl07XG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBfU19vcGNvZGVfbWF0Y2g6CisgICAgICBfX29zdHIgPDwgX19pZCA8PCAiIFtsYWJlbD1cIiIgPDwgX19pZCA8PCAiXFxuTUFUQ0hcIl07XG4iIAorICAgICAgICAgICAgIDw8IF9faWQgPDwgIiAtPiAiIDw8IF9NX25leHQgPDwgIiBbbGFiZWw9XCI8bWF0Y2g+XCJdO1xuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgX1Nfb3Bjb2RlX2FjY2VwdDoKKyAgICAgIF9fb3N0ciA8PCBfX2lkIDw8ICIgW2xhYmVsPVwiIiA8PCBfX2lkIDw8ICJcXG5BQ0NcIl07XG4iIDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfX29zdHIgPDwgX19pZCA8PCAiIFtsYWJlbD1cIiIgPDwgX19pZCA8PCAiXFxuVU5LXCJdO1xuIiAKKyAgICAgICAgICAgICA8PCBfX2lkIDw8ICIgLT4gIiA8PCBfTV9uZXh0IDw8ICIgW2xhYmVsPVwiP1wiXTtcbiI7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gX19vc3RyOworfQorCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBfTmZhOjoKK19NX2RvdChzdGQ6Om9zdHJlYW0mIF9fb3N0cikgY29uc3QKK3sKKyAgX19vc3RyIDw8ICJkaWdyYXBoIF9OZmEge1xuIgorICAgPDwgIiAgcmFua2Rpcj1MUjtcbiI7CisgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDA7IF9faSA8IHRoaXMtPnNpemUoKTsgKytfX2kpCisgIHsgdGhpcy0+YXQoX19pKS5fTV9kb3QoX19vc3RyLCBfX2kpOyB9CisgIF9fb3N0ciA8PCAifVxuIjsKKyAgcmV0dXJuIF9fb3N0cjsKK30KKyNlbmRpZgorCitpbmxpbmUgX1N0YXRlU2VxJiBfU3RhdGVTZXE6Ogorb3BlcmF0b3I9KGNvbnN0IF9TdGF0ZVNlcSYgX19yaHMpCit7CisgIF9NX3N0YXJ0ID0gX19yaHMuX01fc3RhcnQ7CisgIF9NX2VuZDEgID0gX19yaHMuX01fZW5kMTsKKyAgX01fZW5kMiAgPSBfX3Jocy5fTV9lbmQyOworICByZXR1cm4gKnRoaXM7Cit9CisKK2lubGluZSB2b2lkIF9TdGF0ZVNlcTo6CitfTV9wdXNoX2JhY2soX1N0YXRlSWRUIF9faWQpCit7CisgIGlmIChfTV9lbmQxICE9IF9TX2ludmFsaWRfc3RhdGVfaWQpCisgICAgX01fbmZhW19NX2VuZDFdLl9NX25leHQgPSBfX2lkOworICBfTV9lbmQxID0gX19pZDsKK30KKworaW5saW5lIHZvaWQgX1N0YXRlU2VxOjoKK19NX2FwcGVuZChfU3RhdGVJZFQgX19pZCkKK3sKKyAgaWYgKF9NX2VuZDIgIT0gX1NfaW52YWxpZF9zdGF0ZV9pZCkKKyAgeworICAgIGlmIChfTV9lbmQyID09IF9NX2VuZDEpCisgICAgICBfTV9uZmFbX01fZW5kMl0uX01fYWx0ID0gX19pZDsKKyAgICBlbHNlCisgICAgICBfTV9uZmFbX01fZW5kMl0uX01fbmV4dCA9IF9faWQ7CisgICAgX01fZW5kMiA9IF9TX2ludmFsaWRfc3RhdGVfaWQ7CisgIH0KKyAgaWYgKF9NX2VuZDEgIT0gX1NfaW52YWxpZF9zdGF0ZV9pZCkKKyAgICBfTV9uZmFbX01fZW5kMV0uX01fbmV4dCA9IF9faWQ7CisgIF9NX2VuZDEgPSBfX2lkOworfQorCitpbmxpbmUgdm9pZCBfU3RhdGVTZXE6OgorX01fYXBwZW5kKF9TdGF0ZVNlcSYgX19yaHMpCit7CisgIGlmIChfTV9lbmQyICE9IF9TX2ludmFsaWRfc3RhdGVfaWQpCisgIHsKKyAgICBpZiAoX01fZW5kMiA9PSBfTV9lbmQxKQorICAgICAgX01fbmZhW19NX2VuZDJdLl9NX2FsdCA9IF9fcmhzLl9NX3N0YXJ0OworICAgIGVsc2UKKyAgICAgIF9NX25mYVtfTV9lbmQyXS5fTV9uZXh0ID0gX19yaHMuX01fc3RhcnQ7CisgICAgX01fZW5kMiA9IF9TX2ludmFsaWRfc3RhdGVfaWQ7CisgIH0KKyAgaWYgKF9fcmhzLl9NX2VuZDIgIT0gX1NfaW52YWxpZF9zdGF0ZV9pZCkKKyAgICBfTV9lbmQyID0gX19yaHMuX01fZW5kMjsKKyAgaWYgKF9NX2VuZDEgIT0gX1NfaW52YWxpZF9zdGF0ZV9pZCkKKyAgICBfTV9uZmFbX01fZW5kMV0uX01fbmV4dCA9IF9fcmhzLl9NX3N0YXJ0OworICBfTV9lbmQxID0gX19yaHMuX01fZW5kMTsKK30KKworLy8gQHRvZG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCitpbmxpbmUgX1N0YXRlSWRUIF9TdGF0ZVNlcTo6CitfTV9jbG9uZSgpCit7IHJldHVybiAwOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKK30gLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc2hhcmVkX3B0ci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3NoYXJlZF9wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWYxYjY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3NoYXJlZF9wdHIuaApAQCAtMCwwICsxLDYzMiBAQAorLy8gc2hhcmVkX3B0ciBhbmQgd2Vha19wdHIgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gR0NDIE5vdGU6IEJhc2VkIG9uIGZpbGVzIGZyb20gdmVyc2lvbiAxLjMyLjAgb2YgdGhlIEJvb3N0IGxpYnJhcnkuCisKKy8vICBzaGFyZWRfY291bnQuaHBwCisvLyAgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzIFBldGVyIERpbW92IGFuZCBNdWx0aSBNZWRpYSBMdGQuCisKKy8vICBzaGFyZWRfcHRyLmhwcAorLy8gIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBHcmVnIENvbHZpbiBhbmQgQmVtYW4gRGF3ZXMuCisvLyAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIFBldGVyIERpbW92CisKKy8vICB3ZWFrX3B0ci5ocHAKKy8vICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMgUGV0ZXIgRGltb3YKKworLy8gIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzLmhwcAorLy8gIENvcHlyaWdodCAoQykgMjAwMiBQZXRlciBEaW1vdgorCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKKy8vIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8qKiBAZmlsZSBiaXRzL3NoYXJlZF9wdHIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNkZWZpbmUgX1NIQVJFRF9QVFJfSCAxCisKKyNpbmNsdWRlIDxiaXRzL3NoYXJlZF9wdHJfYmFzZS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHBvaW50ZXJfYWJzdHJhY3Rpb25zCisgICAqIEB7CisgICAqLworCisgIC8vLyAyLjIuMy43IHNoYXJlZF9wdHIgSS9PCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaCwgdHlwZW5hbWUgX1RyLCB0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2gsIF9Ucj4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoLCBfVHI+JiBfX29zLAorCSAgICAgICBjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX3ApCisgICAgeworICAgICAgX19vcyA8PCBfX3AuZ2V0KCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgLy8vIDIuMi4zLjEwIHNoYXJlZF9wdHIgZ2V0X2RlbGV0ZXIgKGV4cGVyaW1lbnRhbCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0RlbCwgdHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBfRGVsKgorICAgIGdldF9kZWxldGVyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fcCkgbm9leGNlcHQKKyAgICB7CisjaWZkZWYgX19HWFhfUlRUSQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9EZWwqPihfX3AuX01fZ2V0X2RlbGV0ZXIodHlwZWlkKF9EZWwpKSk7CisjZWxzZQorICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICB9CisKKworICAvKioKKyAgICogIEBicmllZiAgQSBzbWFydCBwb2ludGVyIHdpdGggcmVmZXJlbmNlLWNvdW50ZWQgY29weSBzZW1hbnRpY3MuCisgICAqCisgICAqICBUaGUgb2JqZWN0IHBvaW50ZWQgdG8gaXMgZGVsZXRlZCB3aGVuIHRoZSBsYXN0IHNoYXJlZF9wdHIgcG9pbnRpbmcgdG8KKyAgICogIGl0IGlzIGRlc3Ryb3llZCBvciByZXNldC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHNoYXJlZF9wdHIgOiBwdWJsaWMgX19zaGFyZWRfcHRyPF9UcD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYW4gZW1wdHkgJXNoYXJlZF9wdHIuCisgICAgICAgKiAgQHBvc3QgICB1c2VfY291bnQoKT09MCAmJiBnZXQoKT09MAorICAgICAgICovCisgICAgICBjb25zdGV4cHIgc2hhcmVkX3B0cigpIG5vZXhjZXB0CisgICAgICA6IF9fc2hhcmVkX3B0cjxfVHA+KCkgeyB9CisKKyAgICAgIHNoYXJlZF9wdHIoY29uc3Qgc2hhcmVkX3B0ciYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYSAlc2hhcmVkX3B0ciB0aGF0IG93bnMgdGhlIHBvaW50ZXIgQGEgX19wLgorICAgICAgICogIEBwYXJhbSAgX19wICBBIHBvaW50ZXIgdGhhdCBpcyBjb252ZXJ0aWJsZSB0byBlbGVtZW50X3R5cGUqLgorICAgICAgICogIEBwb3N0ICAgdXNlX2NvdW50KCkgPT0gMSAmJiBnZXQoKSA9PSBfX3AKKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6YmFkX2FsbG9jLCBpbiB3aGljaCBjYXNlIEBjIGRlbGV0ZSBAYSBfX3AgaXMgY2FsbGVkLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCWV4cGxpY2l0IHNoYXJlZF9wdHIoX1RwMSogX19wKQorICAgICAgICA6IF9fc2hhcmVkX3B0cjxfVHA+KF9fcCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IGEgJXNoYXJlZF9wdHIgdGhhdCBvd25zIHRoZSBwb2ludGVyIEBhIF9fcAorICAgICAgICogICAgICAgICAgYW5kIHRoZSBkZWxldGVyIEBhIF9fZC4KKyAgICAgICAqICBAcGFyYW0gIF9fcCAgQSBwb2ludGVyLgorICAgICAgICogIEBwYXJhbSAgX19kICBBIGRlbGV0ZXIuCisgICAgICAgKiAgQHBvc3QgICB1c2VfY291bnQoKSA9PSAxICYmIGdldCgpID09IF9fcAorICAgICAgICogIEB0aHJvdyAgc3RkOjpiYWRfYWxsb2MsIGluIHdoaWNoIGNhc2UgQGEgX19kKF9fcCkgaXMgY2FsbGVkLgorICAgICAgICoKKyAgICAgICAqICBSZXF1aXJlbWVudHM6IF9EZWxldGVyJ3MgY29weSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBtdXN0CisgICAgICAgKiAgbm90IHRocm93CisgICAgICAgKgorICAgICAgICogIF9fc2hhcmVkX3B0ciB3aWxsIHJlbGVhc2UgX19wIGJ5IGNhbGxpbmcgX19kKF9fcCkKKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbGV0ZXI+CisJc2hhcmVkX3B0cihfVHAxKiBfX3AsIF9EZWxldGVyIF9fZCkKKyAgICAgICAgOiBfX3NoYXJlZF9wdHI8X1RwPihfX3AsIF9fZCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IGEgJXNoYXJlZF9wdHIgdGhhdCBvd25zIGEgbnVsbCBwb2ludGVyCisgICAgICAgKiAgICAgICAgICBhbmQgdGhlIGRlbGV0ZXIgQGEgX19kLgorICAgICAgICogIEBwYXJhbSAgX19wICBBIG51bGwgcG9pbnRlciBjb25zdGFudC4KKyAgICAgICAqICBAcGFyYW0gIF9fZCAgQSBkZWxldGVyLgorICAgICAgICogIEBwb3N0ICAgdXNlX2NvdW50KCkgPT0gMSAmJiBnZXQoKSA9PSBfX3AKKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6YmFkX2FsbG9jLCBpbiB3aGljaCBjYXNlIEBhIF9fZChfX3ApIGlzIGNhbGxlZC4KKyAgICAgICAqCisgICAgICAgKiAgUmVxdWlyZW1lbnRzOiBfRGVsZXRlcidzIGNvcHkgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgbXVzdAorICAgICAgICogIG5vdCB0aHJvdworICAgICAgICoKKyAgICAgICAqICBUaGUgbGFzdCBvd25lciB3aWxsIGNhbGwgX19kKF9fcCkKKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0RlbGV0ZXI+CisJc2hhcmVkX3B0cihudWxscHRyX3QgX19wLCBfRGVsZXRlciBfX2QpCisgICAgICAgIDogX19zaGFyZWRfcHRyPF9UcD4oX19wLCBfX2QpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBhICVzaGFyZWRfcHRyIHRoYXQgb3ducyB0aGUgcG9pbnRlciBAYSBfX3AKKyAgICAgICAqICAgICAgICAgIGFuZCB0aGUgZGVsZXRlciBAYSBfX2QuCisgICAgICAgKiAgQHBhcmFtICBfX3AgIEEgcG9pbnRlci4KKyAgICAgICAqICBAcGFyYW0gIF9fZCAgQSBkZWxldGVyLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3IuCisgICAgICAgKiAgQHBvc3QgICB1c2VfY291bnQoKSA9PSAxICYmIGdldCgpID09IF9fcAorICAgICAgICogIEB0aHJvdyAgc3RkOjpiYWRfYWxsb2MsIGluIHdoaWNoIGNhc2UgQGEgX19kKF9fcCkgaXMgY2FsbGVkLgorICAgICAgICoKKyAgICAgICAqICBSZXF1aXJlbWVudHM6IF9EZWxldGVyJ3MgY29weSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBtdXN0CisgICAgICAgKiAgbm90IHRocm93IF9BbGxvYydzIGNvcHkgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgbXVzdCBub3QKKyAgICAgICAqICB0aHJvdy4KKyAgICAgICAqCisgICAgICAgKiAgX19zaGFyZWRfcHRyIHdpbGwgcmVsZWFzZSBfX3AgYnkgY2FsbGluZyBfX2QoX19wKQorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfRGVsZXRlciwgdHlwZW5hbWUgX0FsbG9jPgorCXNoYXJlZF9wdHIoX1RwMSogX19wLCBfRGVsZXRlciBfX2QsIF9BbGxvYyBfX2EpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3AsIF9fZCwgc3RkOjptb3ZlKF9fYSkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBhICVzaGFyZWRfcHRyIHRoYXQgb3ducyBhIG51bGwgcG9pbnRlcgorICAgICAgICogICAgICAgICAgYW5kIHRoZSBkZWxldGVyIEBhIF9fZC4KKyAgICAgICAqICBAcGFyYW0gIF9fcCAgQSBudWxsIHBvaW50ZXIgY29uc3RhbnQuCisgICAgICAgKiAgQHBhcmFtICBfX2QgIEEgZGVsZXRlci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICogIEBwb3N0ICAgdXNlX2NvdW50KCkgPT0gMSAmJiBnZXQoKSA9PSBfX3AKKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6YmFkX2FsbG9jLCBpbiB3aGljaCBjYXNlIEBhIF9fZChfX3ApIGlzIGNhbGxlZC4KKyAgICAgICAqCisgICAgICAgKiAgUmVxdWlyZW1lbnRzOiBfRGVsZXRlcidzIGNvcHkgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgbXVzdAorICAgICAgICogIG5vdCB0aHJvdyBfQWxsb2MncyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG11c3Qgbm90CisgICAgICAgKiAgdGhyb3cuCisgICAgICAgKgorICAgICAgICogIFRoZSBsYXN0IG93bmVyIHdpbGwgY2FsbCBfX2QoX19wKQorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRGVsZXRlciwgdHlwZW5hbWUgX0FsbG9jPgorCXNoYXJlZF9wdHIobnVsbHB0cl90IF9fcCwgX0RlbGV0ZXIgX19kLCBfQWxsb2MgX19hKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19wLCBfX2QsIHN0ZDo6bW92ZShfX2EpKSB7IH0KKworICAgICAgLy8gQWxpYXNpbmcgY29uc3RydWN0b3IKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RzIGEgJXNoYXJlZF9wdHIgaW5zdGFuY2UgdGhhdCBzdG9yZXMgQGEgX19wCisgICAgICAgKiAgICAgICAgICBhbmQgc2hhcmVzIG93bmVyc2hpcCB3aXRoIEBhIF9fci4KKyAgICAgICAqICBAcGFyYW0gIF9fciAgQSAlc2hhcmVkX3B0ci4KKyAgICAgICAqICBAcGFyYW0gIF9fcCAgQSBwb2ludGVyIHRoYXQgd2lsbCByZW1haW4gdmFsaWQgd2hpbGUgQGEgKl9fciBpcyB2YWxpZC4KKyAgICAgICAqICBAcG9zdCAgIGdldCgpID09IF9fcCAmJiB1c2VfY291bnQoKSA9PSBfX3IudXNlX2NvdW50KCkKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgYSBAYyBzaGFyZWRfcHRyIHRvIGEgc3ViLW9iamVjdAorICAgICAgICogIG9mIGFuIG9iamVjdCBtYW5hZ2VkIGJ5IGFuIGV4aXN0aW5nIEBjIHNoYXJlZF9wdHIuCisgICAgICAgKgorICAgICAgICogQGNvZGUKKyAgICAgICAqIHNoYXJlZF9wdHI8IHBhaXI8aW50LGludD4gPiBwaWkobmV3IHBhaXI8aW50LGludD4oKSk7CisgICAgICAgKiBzaGFyZWRfcHRyPGludD4gcGkocGlpLCAmcGlpLT5maXJzdCk7CisgICAgICAgKiBhc3NlcnQocGlpLnVzZV9jb3VudCgpID09IDIpOworICAgICAgICogQGVuZGNvZGUKKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fciwgX1RwKiBfX3ApIG5vZXhjZXB0CisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3IsIF9fcCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSWYgQGEgX19yIGlzIGVtcHR5LCBjb25zdHJ1Y3RzIGFuIGVtcHR5ICVzaGFyZWRfcHRyOworICAgICAgICogICAgICAgICAgb3RoZXJ3aXNlIGNvbnN0cnVjdCBhICVzaGFyZWRfcHRyIHRoYXQgc2hhcmVzIG93bmVyc2hpcAorICAgICAgICogICAgICAgICAgd2l0aCBAYSBfX3IuCisgICAgICAgKiAgQHBhcmFtICBfX3IgIEEgJXNoYXJlZF9wdHIuCisgICAgICAgKiAgQHBvc3QgICBnZXQoKSA9PSBfX3IuZ2V0KCkgJiYgdXNlX2NvdW50KCkgPT0gX19yLnVzZV9jb3VudCgpCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxfVHAxKiwgX1RwKj46OnZhbHVlPjo6dHlwZT4KKwlzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fcikgbm9leGNlcHQKKyAgICAgICAgOiBfX3NoYXJlZF9wdHI8X1RwPihfX3IpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmUtY29uc3RydWN0cyBhICVzaGFyZWRfcHRyIGluc3RhbmNlIGZyb20gQGEgX19yLgorICAgICAgICogIEBwYXJhbSAgX19yICBBICVzaGFyZWRfcHRyIHJ2YWx1ZS4KKyAgICAgICAqICBAcG9zdCAgICp0aGlzIGNvbnRhaW5zIHRoZSBvbGQgdmFsdWUgb2YgQGEgX19yLCBAYSBfX3IgaXMgZW1wdHkuCisgICAgICAgKi8KKyAgICAgIHNoYXJlZF9wdHIoc2hhcmVkX3B0ciYmIF9fcikgbm9leGNlcHQKKyAgICAgIDogX19zaGFyZWRfcHRyPF9UcD4oc3RkOjptb3ZlKF9fcikpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmUtY29uc3RydWN0cyBhICVzaGFyZWRfcHRyIGluc3RhbmNlIGZyb20gQGEgX19yLgorICAgICAgICogIEBwYXJhbSAgX19yICBBICVzaGFyZWRfcHRyIHJ2YWx1ZS4KKyAgICAgICAqICBAcG9zdCAgICp0aGlzIGNvbnRhaW5zIHRoZSBvbGQgdmFsdWUgb2YgQGEgX19yLCBAYSBfX3IgaXMgZW1wdHkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxfVHAxKiwgX1RwKj46OnZhbHVlPjo6dHlwZT4KKwlzaGFyZWRfcHRyKHNoYXJlZF9wdHI8X1RwMT4mJiBfX3IpIG5vZXhjZXB0CisJOiBfX3NoYXJlZF9wdHI8X1RwPihzdGQ6Om1vdmUoX19yKSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0cyBhICVzaGFyZWRfcHRyIHRoYXQgc2hhcmVzIG93bmVyc2hpcCB3aXRoIEBhIF9fcgorICAgICAgICogICAgICAgICAgYW5kIHN0b3JlcyBhIGNvcHkgb2YgdGhlIHBvaW50ZXIgc3RvcmVkIGluIEBhIF9fci4KKyAgICAgICAqICBAcGFyYW0gIF9fciAgQSB3ZWFrX3B0ci4KKyAgICAgICAqICBAcG9zdCAgIHVzZV9jb3VudCgpID09IF9fci51c2VfY291bnQoKQorICAgICAgICogIEB0aHJvdyAgYmFkX3dlYWtfcHRyIHdoZW4gX19yLmV4cGlyZWQoKSwKKyAgICAgICAqICAgICAgICAgIGluIHdoaWNoIGNhc2UgdGhlIGNvbnN0cnVjdG9yIGhhcyBubyBlZmZlY3QuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJZXhwbGljaXQgc2hhcmVkX3B0cihjb25zdCB3ZWFrX3B0cjxfVHAxPiYgX19yKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19yKSB7IH0KKworI2lmIF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXNoYXJlZF9wdHIoc3RkOjphdXRvX3B0cjxfVHAxPiYmIF9fcik7CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbD4KKwlzaGFyZWRfcHRyKHN0ZDo6dW5pcXVlX3B0cjxfVHAxLCBfRGVsPiYmIF9fcikKKwk6IF9fc2hhcmVkX3B0cjxfVHA+KHN0ZDo6bW92ZShfX3IpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYW4gZW1wdHkgJXNoYXJlZF9wdHIuCisgICAgICAgKiAgQHBhcmFtICBfX3AgIEEgbnVsbCBwb2ludGVyIGNvbnN0YW50LgorICAgICAgICogIEBwb3N0ICAgdXNlX2NvdW50KCkgPT0gMCAmJiBnZXQoKSA9PSBudWxscHRyCisgICAgICAgKi8KKyAgICAgIGNvbnN0ZXhwciBzaGFyZWRfcHRyKG51bGxwdHJfdCBfX3ApIG5vZXhjZXB0CisgICAgICA6IF9fc2hhcmVkX3B0cjxfVHA+KF9fcCkgeyB9CisKKyAgICAgIHNoYXJlZF9wdHImIG9wZXJhdG9yPShjb25zdCBzaGFyZWRfcHRyJikgbm9leGNlcHQgPSBkZWZhdWx0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXNoYXJlZF9wdHImCisJb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fcikgbm9leGNlcHQKKwl7CisJICB0aGlzLT5fX3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KF9fcik7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisjaWYgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJc2hhcmVkX3B0ciYKKwlvcGVyYXRvcj0oc3RkOjphdXRvX3B0cjxfVHAxPiYmIF9fcikKKwl7CisJICB0aGlzLT5fX3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KHN0ZDo6bW92ZShfX3IpKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisjZW5kaWYKKworICAgICAgc2hhcmVkX3B0ciYKKyAgICAgIG9wZXJhdG9yPShzaGFyZWRfcHRyJiYgX19yKSBub2V4Y2VwdAorICAgICAgeworCXRoaXMtPl9fc2hhcmVkX3B0cjxfVHA+OjpvcGVyYXRvcj0oc3RkOjptb3ZlKF9fcikpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1RwMT4KKwlzaGFyZWRfcHRyJgorCW9wZXJhdG9yPShzaGFyZWRfcHRyPF9UcDE+JiYgX19yKSBub2V4Y2VwdAorCXsKKwkgIHRoaXMtPl9fc2hhcmVkX3B0cjxfVHA+OjpvcGVyYXRvcj0oc3RkOjptb3ZlKF9fcikpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbD4KKwlzaGFyZWRfcHRyJgorCW9wZXJhdG9yPShzdGQ6OnVuaXF1ZV9wdHI8X1RwMSwgX0RlbD4mJiBfX3IpCisJeworCSAgdGhpcy0+X19zaGFyZWRfcHRyPF9UcD46Om9wZXJhdG9yPShzdGQ6Om1vdmUoX19yKSk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgbm9uLXN0YW5kYXJkLCBpdCBpcyB1c2VkIGJ5IGFsbG9jYXRlX3NoYXJlZC4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FyZ3M+CisJc2hhcmVkX3B0cihfU3BfbWFrZV9zaGFyZWRfdGFnIF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkJICAgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3RhZywgX19hLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FyZ3M+CisJZnJpZW5kIHNoYXJlZF9wdHI8X1RwMT4KKwlhbGxvY2F0ZV9zaGFyZWQoY29uc3QgX0FsbG9jJiBfX2EsIF9BcmdzJiYuLi4gX19hcmdzKTsKKyAgICB9OworCisgIC8vIDIwLjcuMi4yLjcgc2hhcmVkX3B0ciBjb21wYXJpc29ucworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX2EsCisJICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8X1RwMj4mIF9fYikgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EuZ2V0KCkgPT0gX19iLmdldCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9fYSwgbnVsbHB0cl90KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICFfX2E7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KG51bGxwdHJfdCwgY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIV9fYTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fYSwKKwkgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxfVHAyPiYgX19iKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS5nZXQoKSAhPSBfX2IuZ2V0KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX19hLCBudWxscHRyX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gKGJvb2wpX19hOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShudWxscHRyX3QsIGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX19hKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIChib29sKV9fYTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19hLAorCSAgICAgIGNvbnN0IHNoYXJlZF9wdHI8X1RwMj4mIF9fYikgbm9leGNlcHQKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29tbW9uX3R5cGU8X1RwMSosIF9UcDIqPjo6dHlwZSBfQ1Q7CisgICAgICByZXR1cm4gc3RkOjpsZXNzPF9DVD4oKShfX2EuZ2V0KCksIF9fYi5nZXQoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9fYSwgbnVsbHB0cl90KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHN0ZDo6bGVzczxfVHAqPigpKF9fYS5nZXQoKSwgbnVsbHB0cik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwobnVsbHB0cl90LCBjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9fYSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBzdGQ6Omxlc3M8X1RwKj4oKShudWxscHRyLCBfX2EuZ2V0KCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19hLAorCSAgICAgICBjb25zdCBzaGFyZWRfcHRyPF9UcDI+JiBfX2IpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIShfX2IgPCBfX2EpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9fYSwgbnVsbHB0cl90KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICEobnVsbHB0ciA8IF9fYSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KG51bGxwdHJfdCwgY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIShfX2EgPCBudWxscHRyKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19hLAorCSAgICAgIGNvbnN0IHNoYXJlZF9wdHI8X1RwMj4mIF9fYikgbm9leGNlcHQKKyAgICB7IHJldHVybiAoX19iIDwgX19hKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9fYSwgbnVsbHB0cl90KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHN0ZDo6bGVzczxfVHAqPigpKG51bGxwdHIsIF9fYS5nZXQoKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4obnVsbHB0cl90LCBjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9fYSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBzdGQ6Omxlc3M8X1RwKj4oKShfX2EuZ2V0KCksIG51bGxwdHIpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19hLAorCSAgICAgICBjb25zdCBzaGFyZWRfcHRyPF9UcDI+JiBfX2IpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIShfX2EgPCBfX2IpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9fYSwgbnVsbHB0cl90KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICEoX19hIDwgbnVsbHB0cik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KG51bGxwdHJfdCwgY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIShudWxscHRyIDwgX19hKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbGVzczxzaGFyZWRfcHRyPF9UcD4+IDogcHVibGljIF9TcF9sZXNzPHNoYXJlZF9wdHI8X1RwPj4KKyAgICB7IH07CisKKyAgLy8gMjAuNy4yLjIuOCBzaGFyZWRfcHRyIHNwZWNpYWxpemVkIGFsZ29yaXRobXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoc2hhcmVkX3B0cjxfVHA+JiBfX2EsIHNoYXJlZF9wdHI8X1RwPiYgX19iKSBub2V4Y2VwdAorICAgIHsgX19hLnN3YXAoX19iKTsgfQorCisgIC8vIDIwLjcuMi4yLjkgc2hhcmVkX3B0ciBjYXN0cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHAxPgorICAgIGlubGluZSBzaGFyZWRfcHRyPF9UcD4KKyAgICBzdGF0aWNfcG9pbnRlcl9jYXN0KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fcikgbm9leGNlcHQKKyAgICB7IHJldHVybiBzaGFyZWRfcHRyPF9UcD4oX19yLCBzdGF0aWNfY2FzdDxfVHAqPihfX3IuZ2V0KCkpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMT4KKyAgICBpbmxpbmUgc2hhcmVkX3B0cjxfVHA+CisgICAgY29uc3RfcG9pbnRlcl9jYXN0KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fcikgbm9leGNlcHQKKyAgICB7IHJldHVybiBzaGFyZWRfcHRyPF9UcD4oX19yLCBjb25zdF9jYXN0PF9UcCo+KF9fci5nZXQoKSkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHAxPgorICAgIGlubGluZSBzaGFyZWRfcHRyPF9UcD4KKyAgICBkeW5hbWljX3BvaW50ZXJfY2FzdChjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpIG5vZXhjZXB0CisgICAgeworICAgICAgaWYgKF9UcCogX19wID0gZHluYW1pY19jYXN0PF9UcCo+KF9fci5nZXQoKSkpCisJcmV0dXJuIHNoYXJlZF9wdHI8X1RwPihfX3IsIF9fcCk7CisgICAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KCk7CisgICAgfQorCisKKyAgLyoqCisgICAqICBAYnJpZWYgIEEgc21hcnQgcG9pbnRlciB3aXRoIHdlYWsgc2VtYW50aWNzLgorICAgKgorICAgKiAgV2l0aCBmb3J3YXJkaW5nIGNvbnN0cnVjdG9ycyBhbmQgYXNzaWdubWVudCBvcGVyYXRvcnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3Mgd2Vha19wdHIgOiBwdWJsaWMgX193ZWFrX3B0cjxfVHA+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGNvbnN0ZXhwciB3ZWFrX3B0cigpIG5vZXhjZXB0CisgICAgICA6IF9fd2Vha19wdHI8X1RwPigpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1RwMSosIF9UcCo+Ojp2YWx1ZT46OnR5cGU+CisJd2Vha19wdHIoY29uc3Qgd2Vha19wdHI8X1RwMT4mIF9fcikgbm9leGNlcHQKKwk6IF9fd2Vha19wdHI8X1RwPihfX3IpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1RwMSosIF9UcCo+Ojp2YWx1ZT46OnR5cGU+CisJd2Vha19wdHIoY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yKSBub2V4Y2VwdAorCTogX193ZWFrX3B0cjxfVHA+KF9fcikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJd2Vha19wdHImCisJb3BlcmF0b3I9KGNvbnN0IHdlYWtfcHRyPF9UcDE+JiBfX3IpIG5vZXhjZXB0CisJeworCSAgdGhpcy0+X193ZWFrX3B0cjxfVHA+OjpvcGVyYXRvcj0oX19yKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJd2Vha19wdHImCisJb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fcikgbm9leGNlcHQKKwl7CisJICB0aGlzLT5fX3dlYWtfcHRyPF9UcD46Om9wZXJhdG9yPShfX3IpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgc2hhcmVkX3B0cjxfVHA+CisgICAgICBsb2NrKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKyNpZmRlZiBfX0dUSFJFQURTCisJaWYgKHRoaXMtPmV4cGlyZWQoKSkKKwkgIHJldHVybiBzaGFyZWRfcHRyPF9UcD4oKTsKKworCV9fdHJ5CisJICB7CisJICAgIHJldHVybiBzaGFyZWRfcHRyPF9UcD4oKnRoaXMpOworCSAgfQorCV9fY2F0Y2goY29uc3QgYmFkX3dlYWtfcHRyJikKKwkgIHsKKwkgICAgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPigpOworCSAgfQorI2Vsc2UKKwlyZXR1cm4gdGhpcy0+ZXhwaXJlZCgpID8gc2hhcmVkX3B0cjxfVHA+KCkgOiBzaGFyZWRfcHRyPF9UcD4oKnRoaXMpOworI2VuZGlmCisgICAgICB9CisgICAgfTsKKworICAvLyAyMC43LjIuMy42IHdlYWtfcHRyIHNwZWNpYWxpemVkIGFsZ29yaXRobXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAod2Vha19wdHI8X1RwPiYgX19hLCB3ZWFrX3B0cjxfVHA+JiBfX2IpIG5vZXhjZXB0CisgICAgeyBfX2Euc3dhcChfX2IpOyB9CisKKworICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZSBvd25lcl9sZXNzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3Qgb3duZXJfbGVzczsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiBvd25lcl9sZXNzIGZvciBzaGFyZWRfcHRyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG93bmVyX2xlc3M8c2hhcmVkX3B0cjxfVHA+PgorICAgIDogcHVibGljIF9TcF9vd25lcl9sZXNzPHNoYXJlZF9wdHI8X1RwPiwgd2Vha19wdHI8X1RwPj4KKyAgICB7IH07CisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb2Ygb3duZXJfbGVzcyBmb3Igd2Vha19wdHIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3Qgb3duZXJfbGVzczx3ZWFrX3B0cjxfVHA+PgorICAgIDogcHVibGljIF9TcF9vd25lcl9sZXNzPHdlYWtfcHRyPF9UcD4sIHNoYXJlZF9wdHI8X1RwPj4KKyAgICB7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQmFzZSBjbGFzcyBhbGxvd2luZyB1c2Ugb2YgbWVtYmVyIGZ1bmN0aW9uIHNoYXJlZF9mcm9tX3RoaXMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgY29uc3RleHByIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzKCkgbm9leGNlcHQgeyB9CisKKyAgICAgIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzKGNvbnN0IGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzJikgbm9leGNlcHQgeyB9CisKKyAgICAgIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzJikgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIH5lbmFibGVfc2hhcmVkX2Zyb21fdGhpcygpIHsgfQorCisgICAgcHVibGljOgorICAgICAgc2hhcmVkX3B0cjxfVHA+CisgICAgICBzaGFyZWRfZnJvbV90aGlzKCkKKyAgICAgIHsgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPih0aGlzLT5fTV93ZWFrX3RoaXMpOyB9CisKKyAgICAgIHNoYXJlZF9wdHI8Y29uc3QgX1RwPgorICAgICAgc2hhcmVkX2Zyb21fdGhpcygpIGNvbnN0CisgICAgICB7IHJldHVybiBzaGFyZWRfcHRyPGNvbnN0IF9UcD4odGhpcy0+X01fd2Vha190aGlzKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJdm9pZAorCV9NX3dlYWtfYXNzaWduKF9UcDEqIF9fcCwgY29uc3QgX19zaGFyZWRfY291bnQ8PiYgX19uKSBjb25zdCBub2V4Y2VwdAorCXsgX01fd2Vha190aGlzLl9NX2Fzc2lnbihfX3AsIF9fbik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlmcmllbmQgdm9pZAorCV9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKGNvbnN0IF9fc2hhcmVkX2NvdW50PD4mIF9fcG4sCisJCQkJCSBjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyogX19wZSwKKwkJCQkJIGNvbnN0IF9UcDEqIF9fcHgpIG5vZXhjZXB0CisJeworCSAgaWYgKF9fcGUgIT0gMCkKKwkgICAgX19wZS0+X01fd2Vha19hc3NpZ24oY29uc3RfY2FzdDxfVHAxKj4oX19weCksIF9fcG4pOworCX0KKworICAgICAgbXV0YWJsZSB3ZWFrX3B0cjxfVHA+ICBfTV93ZWFrX3RoaXM7CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgQ3JlYXRlIGFuIG9iamVjdCB0aGF0IGlzIG93bmVkIGJ5IGEgc2hhcmVkX3B0ci4KKyAgICogIEBwYXJhbSAgX19hICAgICBBbiBhbGxvY2F0b3IuCisgICAqICBAcGFyYW0gIF9fYXJncyAgQXJndW1lbnRzIGZvciB0aGUgQGEgX1RwIG9iamVjdCdzIGNvbnN0cnVjdG9yLgorICAgKiAgQHJldHVybiBBIHNoYXJlZF9wdHIgdGhhdCBvd25zIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdC4KKyAgICogIEB0aHJvdyAgQW4gZXhjZXB0aW9uIHRocm93biBmcm9tIEBhIF9BbGxvYzo6YWxsb2NhdGUgb3IgZnJvbSB0aGUKKyAgICogICAgICAgICAgY29uc3RydWN0b3Igb2YgQGEgX1RwLgorICAgKgorICAgKiAgQSBjb3B5IG9mIEBhIF9fYSB3aWxsIGJlIHVzZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2hhcmVkX3B0cgorICAgKiAgYW5kIHRoZSBuZXcgb2JqZWN0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZSBzaGFyZWRfcHRyPF9UcD4KKyAgICBhbGxvY2F0ZV9zaGFyZWQoY29uc3QgX0FsbG9jJiBfX2EsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHJldHVybiBzaGFyZWRfcHRyPF9UcD4oX1NwX21ha2Vfc2hhcmVkX3RhZygpLCBfX2EsCisJCQkgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBDcmVhdGUgYW4gb2JqZWN0IHRoYXQgaXMgb3duZWQgYnkgYSBzaGFyZWRfcHRyLgorICAgKiAgQHBhcmFtICBfX2FyZ3MgIEFyZ3VtZW50cyBmb3IgdGhlIEBhIF9UcCBvYmplY3QncyBjb25zdHJ1Y3Rvci4KKyAgICogIEByZXR1cm4gQSBzaGFyZWRfcHRyIHRoYXQgb3ducyB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QuCisgICAqICBAdGhyb3cgIHN0ZDo6YmFkX2FsbG9jLCBvciBhbiBleGNlcHRpb24gdGhyb3duIGZyb20gdGhlCisgICAqICAgICAgICAgIGNvbnN0cnVjdG9yIG9mIEBhIF9UcC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lIHNoYXJlZF9wdHI8X1RwPgorICAgIG1ha2Vfc2hhcmVkKF9BcmdzJiYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8X1RwPjo6dHlwZSBfVHBfbmM7CisgICAgICByZXR1cm4gc3RkOjphbGxvY2F0ZV9zaGFyZWQ8X1RwPihzdGQ6OmFsbG9jYXRvcjxfVHBfbmM+KCksCisJCQkJICAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgfQorCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHNoYXJlZF9wdHIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzaDxzaGFyZWRfcHRyPF9UcD4+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBzaGFyZWRfcHRyPF9UcD4+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX19zKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpoYXNoPF9UcCo+KCkoX19zLmdldCgpKTsgfQorICAgIH07CisKKyAgLy8gQH0gZ3JvdXAgcG9pbnRlcl9hYnN0cmFjdGlvbnMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX1NIQVJFRF9QVFJfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3NoYXJlZF9wdHJfYmFzZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3NoYXJlZF9wdHJfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NjFiNjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc2hhcmVkX3B0cl9iYXNlLmgKQEAgLTAsMCArMSwxNDI0IEBACisvLyBzaGFyZWRfcHRyIGFuZCB3ZWFrX3B0ciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIEdDQyBOb3RlOiBCYXNlZCBvbiBmaWxlcyBmcm9tIHZlcnNpb24gMS4zMi4wIG9mIHRoZSBCb29zdCBsaWJyYXJ5LgorCisvLyAgc2hhcmVkX2NvdW50LmhwcAorLy8gIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMyBQZXRlciBEaW1vdiBhbmQgTXVsdGkgTWVkaWEgTHRkLgorCisvLyAgc2hhcmVkX3B0ci5ocHAKKy8vICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgR3JlZyBDb2x2aW4gYW5kIEJlbWFuIERhd2VzLgorLy8gIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMyBQZXRlciBEaW1vdgorCisvLyAgd2Vha19wdHIuaHBwCisvLyAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIFBldGVyIERpbW92CisKKy8vICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcy5ocHAKKy8vICBDb3B5cmlnaHQgKEMpIDIwMDIgUGV0ZXIgRGltb3YKKworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlCisvLyBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvKiogQGZpbGUgYml0cy9zaGFyZWRfcHRyX2Jhc2UuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9TSEFSRURfUFRSX0JBU0VfSAorI2RlZmluZSBfU0hBUkVEX1BUUl9CQVNFX0ggMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyNpZiBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorICB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgYXV0b19wdHI7CisjZW5kaWYKKworIC8qKgorICAgKiAgQGJyaWVmICBFeGNlcHRpb24gcG9zc2libHkgdGhyb3duIGJ5IEBjIHNoYXJlZF9wdHIuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqLworICBjbGFzcyBiYWRfd2Vha19wdHIgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KKyAgeworICBwdWJsaWM6CisgICAgdmlydHVhbCBjaGFyIGNvbnN0KgorICAgIHdoYXQoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHZpcnR1YWwgfmJhZF93ZWFrX3B0cigpIG5vZXhjZXB0OyAgICAKKyAgfTsKKworICAvLyBTdWJzdGl0dXRlIGZvciBiYWRfd2Vha19wdHIgb2JqZWN0IGluIHRoZSBjYXNlIG9mIC1mbm8tZXhjZXB0aW9ucy4KKyAgaW5saW5lIHZvaWQKKyAgX190aHJvd19iYWRfd2Vha19wdHIoKQorICB7IF9HTElCQ1hYX1RIUk9XX09SX0FCT1JUKGJhZF93ZWFrX3B0cigpKTsgfQorCisgIHVzaW5nIF9fZ251X2N4eDo6X0xvY2tfcG9saWN5OworICB1c2luZyBfX2dudV9jeHg6Ol9fZGVmYXVsdF9sb2NrX3BvbGljeTsKKyAgdXNpbmcgX19nbnVfY3h4OjpfU19zaW5nbGU7CisgIHVzaW5nIF9fZ251X2N4eDo6X1NfbXV0ZXg7CisgIHVzaW5nIF9fZ251X2N4eDo6X1NfYXRvbWljOworCisgIC8vIEVtcHR5IGhlbHBlciBjbGFzcyBleGNlcHQgd2hlbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgaXMgX1NfbXV0ZXguCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX011dGV4X2Jhc2UKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gVGhlIGF0b21pYyBwb2xpY3kgdXNlcyBmdWxseS1mZW5jZWQgYnVpbHRpbnMsIHNpbmdsZSBkb2Vzbid0IGNhcmUuCisgICAgICBlbnVtIHsgX1NfbmVlZF9iYXJyaWVycyA9IDAgfTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBfTXV0ZXhfYmFzZTxfU19tdXRleD4KKyAgICA6IHB1YmxpYyBfX2dudV9jeHg6Ol9fbXV0ZXgKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gVGhpcyBwb2xpY3kgaXMgdXNlZCB3aGVuIGF0b21pYyBidWlsdGlucyBhcmUgbm90IGF2YWlsYWJsZS4KKyAgICAgIC8vIFRoZSByZXBsYWNlbWVudCBhdG9taWMgb3BlcmF0aW9ucyBtaWdodCBub3QgaGF2ZSB0aGUgbmVjZXNzYXJ5CisgICAgICAvLyBtZW1vcnkgYmFycmllcnMuCisgICAgICBlbnVtIHsgX1NfbmVlZF9iYXJyaWVycyA9IDEgfTsKKyAgICB9OworCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHAgPSBfX2RlZmF1bHRfbG9ja19wb2xpY3k+CisgICAgY2xhc3MgX1NwX2NvdW50ZWRfYmFzZQorICAgIDogcHVibGljIF9NdXRleF9iYXNlPF9McD4KKyAgICB7CisgICAgcHVibGljOiAgCisgICAgICBfU3BfY291bnRlZF9iYXNlKCkgbm9leGNlcHQKKyAgICAgIDogX01fdXNlX2NvdW50KDEpLCBfTV93ZWFrX2NvdW50KDEpIHsgfQorICAgICAgCisgICAgICB2aXJ0dWFsCisgICAgICB+X1NwX2NvdW50ZWRfYmFzZSgpIG5vZXhjZXB0CisgICAgICB7IH0KKyAgCisgICAgICAvLyBDYWxsZWQgd2hlbiBfTV91c2VfY291bnQgZHJvcHMgdG8gemVybywgdG8gcmVsZWFzZSB0aGUgcmVzb3VyY2VzCisgICAgICAvLyBtYW5hZ2VkIGJ5ICp0aGlzLgorICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9kaXNwb3NlKCkgbm9leGNlcHQgPSAwOworICAgICAgCisgICAgICAvLyBDYWxsZWQgd2hlbiBfTV93ZWFrX2NvdW50IGRyb3BzIHRvIHplcm8uCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3koKSBub2V4Y2VwdAorICAgICAgeyBkZWxldGUgdGhpczsgfQorICAgICAgCisgICAgICB2aXJ0dWFsIHZvaWQqCisgICAgICBfTV9nZXRfZGVsZXRlcihjb25zdCBzdGQ6OnR5cGVfaW5mbyYpID0gMDsKKworICAgICAgdm9pZAorICAgICAgX01fYWRkX3JlZl9jb3B5KCkKKyAgICAgIHsgX19nbnVfY3h4OjpfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9NX3VzZV9jb3VudCwgMSk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBfTV9hZGRfcmVmX2xvY2soKTsKKyAgICAgIAorICAgICAgdm9pZAorICAgICAgX01fcmVsZWFzZSgpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIC8vIEJlIHJhY2UtZGV0ZWN0b3ItZnJpZW5kbHkuICBGb3IgbW9yZSBpbmZvIHNlZSBiaXRzL2MrK2NvbmZpZy4KKyAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKCZfTV91c2VfY291bnQpOworCWlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmX01fdXNlX2NvdW50LCAtMSkgPT0gMSkKKwkgIHsKKyAgICAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZfTV91c2VfY291bnQpOworCSAgICBfTV9kaXNwb3NlKCk7CisJICAgIC8vIFRoZXJlIG11c3QgYmUgYSBtZW1vcnkgYmFycmllciBiZXR3ZWVuIGRpc3Bvc2UoKSBhbmQgZGVzdHJveSgpCisJICAgIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBlZmZlY3RzIG9mIGRpc3Bvc2UoKSBhcmUgb2JzZXJ2ZWQgaW4gdGhlCisJICAgIC8vIHRocmVhZCB0aGF0IHJ1bnMgZGVzdHJveSgpLgorCSAgICAvLyBTZWUgaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDA1LTExL21zZzAwMTM2Lmh0bWwKKwkgICAgaWYgKF9NdXRleF9iYXNlPF9McD46Ol9TX25lZWRfYmFycmllcnMpCisJICAgICAgeworCSAgICAgICAgX0dMSUJDWFhfUkVBRF9NRU1fQkFSUklFUjsKKwkgICAgICAgIF9HTElCQ1hYX1dSSVRFX01FTV9CQVJSSUVSOworCSAgICAgIH0KKworICAgICAgICAgICAgLy8gQmUgcmFjZS1kZXRlY3Rvci1mcmllbmRseS4gIEZvciBtb3JlIGluZm8gc2VlIGJpdHMvYysrY29uZmlnLgorICAgICAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKCZfTV93ZWFrX2NvdW50KTsKKwkgICAgaWYgKF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZfTV93ZWFrX2NvdW50LAorCQkJCQkJICAgICAgIC0xKSA9PSAxKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoJl9NX3dlYWtfY291bnQpOworCSAgICAgICAgX01fZGVzdHJveSgpOworICAgICAgICAgICAgICB9CisJICB9CisgICAgICB9CisgIAorICAgICAgdm9pZAorICAgICAgX01fd2Vha19hZGRfcmVmKCkgbm9leGNlcHQKKyAgICAgIHsgX19nbnVfY3h4OjpfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9NX3dlYWtfY291bnQsIDEpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3dlYWtfcmVsZWFzZSgpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIC8vIEJlIHJhY2UtZGV0ZWN0b3ItZnJpZW5kbHkuIEZvciBtb3JlIGluZm8gc2VlIGJpdHMvYysrY29uZmlnLgorICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoJl9NX3dlYWtfY291bnQpOworCWlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmX01fd2Vha19jb3VudCwgLTEpID09IDEpCisJICB7CisgICAgICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUigmX01fd2Vha19jb3VudCk7CisJICAgIGlmIChfTXV0ZXhfYmFzZTxfTHA+OjpfU19uZWVkX2JhcnJpZXJzKQorCSAgICAgIHsKKwkgICAgICAgIC8vIFNlZSBfTV9yZWxlYXNlKCksCisJICAgICAgICAvLyBkZXN0cm95KCkgbXVzdCBvYnNlcnZlIHJlc3VsdHMgb2YgZGlzcG9zZSgpCisJICAgICAgICBfR0xJQkNYWF9SRUFEX01FTV9CQVJSSUVSOworCSAgICAgICAgX0dMSUJDWFhfV1JJVEVfTUVNX0JBUlJJRVI7CisJICAgICAgfQorCSAgICBfTV9kZXN0cm95KCk7CisJICB9CisgICAgICB9CisgIAorICAgICAgbG9uZworICAgICAgX01fZ2V0X3VzZV9jb3VudCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIC8vIE5vIG1lbW9yeSBiYXJyaWVyIGlzIHVzZWQgaGVyZSBzbyB0aGVyZSBpcyBubyBzeW5jaHJvbml6YXRpb24KKyAgICAgICAgLy8gd2l0aCBvdGhlciB0aHJlYWRzLgorICAgICAgICByZXR1cm4gX19hdG9taWNfbG9hZF9uKCZfTV91c2VfY291bnQsIF9fQVRPTUlDX1JFTEFYRUQpOworICAgICAgfQorCisgICAgcHJpdmF0ZTogIAorICAgICAgX1NwX2NvdW50ZWRfYmFzZShfU3BfY291bnRlZF9iYXNlIGNvbnN0JikgPSBkZWxldGU7CisgICAgICBfU3BfY291bnRlZF9iYXNlJiBvcGVyYXRvcj0oX1NwX2NvdW50ZWRfYmFzZSBjb25zdCYpID0gZGVsZXRlOworCisgICAgICBfQXRvbWljX3dvcmQgIF9NX3VzZV9jb3VudDsgICAgIC8vICNzaGFyZWQKKyAgICAgIF9BdG9taWNfd29yZCAgX01fd2Vha19jb3VudDsgICAgLy8gI3dlYWsgKyAoI3NoYXJlZCAhPSAwKQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSB2b2lkCisgICAgX1NwX2NvdW50ZWRfYmFzZTxfU19zaW5nbGU+OjoKKyAgICBfTV9hZGRfcmVmX2xvY2soKQorICAgIHsKKyAgICAgIGlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmX01fdXNlX2NvdW50LCAxKSA9PSAwKQorCXsKKwkgIF9NX3VzZV9jb3VudCA9IDA7CisJICBfX3Rocm93X2JhZF93ZWFrX3B0cigpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSB2b2lkCisgICAgX1NwX2NvdW50ZWRfYmFzZTxfU19tdXRleD46OgorICAgIF9NX2FkZF9yZWZfbG9jaygpCisgICAgeworICAgICAgX19nbnVfY3h4OjpfX3Njb3BlZF9sb2NrIHNlbnRyeSgqdGhpcyk7CisgICAgICBpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3VzZV9jb3VudCwgMSkgPT0gMCkKKwl7CisJICBfTV91c2VfY291bnQgPSAwOworCSAgX190aHJvd19iYWRfd2Vha19wdHIoKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPD4gCisgICAgaW5saW5lIHZvaWQKKyAgICBfU3BfY291bnRlZF9iYXNlPF9TX2F0b21pYz46OgorICAgIF9NX2FkZF9yZWZfbG9jaygpCisgICAgeworICAgICAgLy8gUGVyZm9ybSBsb2NrLWZyZWUgYWRkLWlmLW5vdC16ZXJvIG9wZXJhdGlvbi4KKyAgICAgIF9BdG9taWNfd29yZCBfX2NvdW50ID0gX01fZ2V0X3VzZV9jb3VudCgpOworICAgICAgZG8KKwl7CisJICBpZiAoX19jb3VudCA9PSAwKQorCSAgICBfX3Rocm93X2JhZF93ZWFrX3B0cigpOworCSAgLy8gUmVwbGFjZSB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlIHdpdGggdGhlIG9sZCB2YWx1ZSArIDEsIGFzCisJICAvLyBsb25nIGFzIGl0J3Mgbm90IGNoYW5nZWQgbWVhbndoaWxlLiAKKwl9CisgICAgICB3aGlsZSAoIV9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbigmX01fdXNlX2NvdW50LCAmX19jb3VudCwgX19jb3VudCArIDEsCisJCQkJCSAgdHJ1ZSwgX19BVE9NSUNfQUNRX1JFTCwgCisJCQkJCSAgX19BVE9NSUNfUkVMQVhFRCkpOworICAgIH0KKworCisgIC8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHAgPSBfX2RlZmF1bHRfbG9ja19wb2xpY3k+CisgICAgY2xhc3MgX19zaGFyZWRfcHRyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McCA9IF9fZGVmYXVsdF9sb2NrX3BvbGljeT4KKyAgICBjbGFzcyBfX3dlYWtfcHRyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McCA9IF9fZGVmYXVsdF9sb2NrX3BvbGljeT4KKyAgICBjbGFzcyBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBzaGFyZWRfcHRyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyB3ZWFrX3B0cjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG93bmVyX2xlc3M7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzOworCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHAgPSBfX2RlZmF1bHRfbG9ja19wb2xpY3k+CisgICAgY2xhc3MgX193ZWFrX2NvdW50OworCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHAgPSBfX2RlZmF1bHRfbG9ja19wb2xpY3k+CisgICAgY2xhc3MgX19zaGFyZWRfY291bnQ7CisKKworICAvLyBDb3VudGVkIHB0ciB3aXRoIG5vIGRlbGV0ZXIgb3IgYWxsb2NhdG9yIHN1cHBvcnQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1B0ciwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfU3BfY291bnRlZF9wdHIgZmluYWwgOiBwdWJsaWMgX1NwX2NvdW50ZWRfYmFzZTxfTHA+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBfU3BfY291bnRlZF9wdHIoX1B0ciBfX3ApCisgICAgICA6IF9NX3B0cihfX3ApIHsgfQorCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIF9NX2Rpc3Bvc2UoKSBub2V4Y2VwdAorICAgICAgeyBkZWxldGUgX01fcHRyOyB9CisKKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgX01fZGVzdHJveSgpIG5vZXhjZXB0CisgICAgICB7IGRlbGV0ZSB0aGlzOyB9CisKKyAgICAgIHZpcnR1YWwgdm9pZCoKKyAgICAgIF9NX2dldF9kZWxldGVyKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJikKKyAgICAgIHsgcmV0dXJuIDA7IH0KKworICAgICAgX1NwX2NvdW50ZWRfcHRyKGNvbnN0IF9TcF9jb3VudGVkX3B0ciYpID0gZGVsZXRlOworICAgICAgX1NwX2NvdW50ZWRfcHRyJiBvcGVyYXRvcj0oY29uc3QgX1NwX2NvdW50ZWRfcHRyJikgPSBkZWxldGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfUHRyICAgICAgICAgICAgIF9NX3B0cjsgIC8vIGNvcHkgY29uc3RydWN0b3IgbXVzdCBub3QgdGhyb3cKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9TcF9jb3VudGVkX3B0cjxudWxscHRyX3QsIF9TX3NpbmdsZT46Ol9NX2Rpc3Bvc2UoKSBub2V4Y2VwdCB7IH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHZvaWQKKyAgICBfU3BfY291bnRlZF9wdHI8bnVsbHB0cl90LCBfU19tdXRleD46Ol9NX2Rpc3Bvc2UoKSBub2V4Y2VwdCB7IH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHZvaWQKKyAgICBfU3BfY291bnRlZF9wdHI8bnVsbHB0cl90LCBfU19hdG9taWM+OjpfTV9kaXNwb3NlKCkgbm9leGNlcHQgeyB9CisKKyAgLy8gU3VwcG9ydCBmb3IgY3VzdG9tIGRlbGV0ZXIgYW5kL29yIGFsbG9jYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyLCB0eXBlbmFtZSBfRGVsZXRlciwgdHlwZW5hbWUgX0FsbG9jLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9TcF9jb3VudGVkX2RlbGV0ZXIgZmluYWwgOiBwdWJsaWMgX1NwX2NvdW50ZWRfYmFzZTxfTHA+CisgICAgeworICAgICAgLy8gSGVscGVyIGNsYXNzIHRoYXQgc3RvcmVzIHRoZSBEZWxldGVyIGFuZCBhbHNvIGFjdHMgYXMgYW4gYWxsb2NhdG9yLgorICAgICAgLy8gVXNlZCB0byBkaXNwb3NlIG9mIHRoZSBvd25lZCBwb2ludGVyIGFuZCB0aGUgaW50ZXJuYWwgcmVmY291bnQKKyAgICAgIC8vIFJlcXVpcmVzIHRoYXQgY29waWVzIG9mIF9BbGxvYyBjYW4gZnJlZSBlYWNoIG90aGVyJ3MgbWVtb3J5LgorICAgICAgc3RydWN0IF9NeV9EZWxldGVyCisgICAgICA6IHB1YmxpYyBfQWxsb2MgICAgICAgICAgIC8vIGNvcHkgY29uc3RydWN0b3IgbXVzdCBub3QgdGhyb3cKKyAgICAgIHsKKwlfRGVsZXRlciBfTV9kZWw7ICAgICAgICAvLyBjb3B5IGNvbnN0cnVjdG9yIG11c3Qgbm90IHRocm93CisJX015X0RlbGV0ZXIoX0RlbGV0ZXIgX19kLCBjb25zdCBfQWxsb2MmIF9fYSkKKwk6IF9BbGxvYyhfX2EpLCBfTV9kZWwoX19kKSB7IH0KKyAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBfX2QoX19wKSBtdXN0IG5vdCB0aHJvdy4KKyAgICAgIF9TcF9jb3VudGVkX2RlbGV0ZXIoX1B0ciBfX3AsIF9EZWxldGVyIF9fZCkKKyAgICAgIDogX01fcHRyKF9fcCksIF9NX2RlbChfX2QsIF9BbGxvYygpKSB7IH0KKworICAgICAgLy8gX19kKF9fcCkgbXVzdCBub3QgdGhyb3cuCisgICAgICBfU3BfY291bnRlZF9kZWxldGVyKF9QdHIgX19wLCBfRGVsZXRlciBfX2QsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgOiBfTV9wdHIoX19wKSwgX01fZGVsKF9fZCwgX19hKSB7IH0KKworICAgICAgfl9TcF9jb3VudGVkX2RlbGV0ZXIoKSBub2V4Y2VwdCB7IH0KKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9kaXNwb3NlKCkgbm9leGNlcHQKKyAgICAgIHsgX01fZGVsLl9NX2RlbChfTV9wdHIpOyB9CisKKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgX01fZGVzdHJveSgpIG5vZXhjZXB0CisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46OnRlbXBsYXRlCisJICByZWJpbmRfdHJhaXRzPF9TcF9jb3VudGVkX2RlbGV0ZXI+IF9BbGxvY190cmFpdHM7CisJdHlwZW5hbWUgX0FsbG9jX3RyYWl0czo6YWxsb2NhdG9yX3R5cGUgX19hKF9NX2RlbCk7CisJX0FsbG9jX3RyYWl0czo6ZGVzdHJveShfX2EsIHRoaXMpOworCV9BbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hLCB0aGlzLCAxKTsKKyAgICAgIH0KKworICAgICAgdmlydHVhbCB2b2lkKgorICAgICAgX01fZ2V0X2RlbGV0ZXIoY29uc3Qgc3RkOjp0eXBlX2luZm8mIF9fdGkpCisgICAgICB7CisjaWZkZWYgX19HWFhfUlRUSQorICAgICAgICByZXR1cm4gX190aSA9PSB0eXBlaWQoX0RlbGV0ZXIpID8gJl9NX2RlbC5fTV9kZWwgOiAwOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9QdHIgICAgICAgICAgICAgX01fcHRyOyAgLy8gY29weSBjb25zdHJ1Y3RvciBtdXN0IG5vdCB0aHJvdworICAgICAgX015X0RlbGV0ZXIgICAgICBfTV9kZWw7ICAvLyBjb3B5IGNvbnN0cnVjdG9yIG11c3Qgbm90IHRocm93CisgICAgfTsKKworICAvLyBoZWxwZXJzIGZvciBtYWtlX3NoYXJlZCAvIGFsbG9jYXRlX3NoYXJlZAorCisgIHN0cnVjdCBfU3BfbWFrZV9zaGFyZWRfdGFnIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYywgX0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfU3BfY291bnRlZF9wdHJfaW5wbGFjZSBmaW5hbCA6IHB1YmxpYyBfU3BfY291bnRlZF9iYXNlPF9McD4KKyAgICB7CisgICAgICAvLyBIZWxwZXIgY2xhc3MgdGhhdCBzdG9yZXMgdGhlIHBvaW50ZXIgYW5kIGFsc28gYWN0cyBhcyBhbiBhbGxvY2F0b3IuCisgICAgICAvLyBVc2VkIHRvIGRpc3Bvc2Ugb2YgdGhlIG93bmVkIHBvaW50ZXIgYW5kIHRoZSBpbnRlcm5hbCByZWZjb3VudAorICAgICAgLy8gUmVxdWlyZXMgdGhhdCBjb3BpZXMgb2YgX0FsbG9jIGNhbiBmcmVlIGVhY2ggb3RoZXIncyBtZW1vcnkuCisgICAgICBzdHJ1Y3QgX0ltcGwKKyAgICAgIDogcHVibGljIF9BbGxvYyAgICAgICAgICAgLy8gY29weSBjb25zdHJ1Y3RvciBtdXN0IG5vdCB0aHJvdworICAgICAgeworCV9JbXBsKF9BbGxvYyBfX2EpIDogX0FsbG9jKF9fYSksIF9NX3B0cigpIHsgfQorCV9UcCogX01fcHRyOworICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCV9TcF9jb3VudGVkX3B0cl9pbnBsYWNlKF9BbGxvYyBfX2EsIF9BcmdzJiYuLi4gX19hcmdzKQorCTogX01faW1wbChfX2EpCisJeworCSAgX01faW1wbC5fTV9wdHIgPSBzdGF0aWNfY2FzdDxfVHAqPihzdGF0aWNfY2FzdDx2b2lkKj4oJl9NX3N0b3JhZ2UpKTsKKwkgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgIC8vIDIwNzAuICBhbGxvY2F0ZV9zaGFyZWQgc2hvdWxkIHVzZSBhbGxvY2F0b3JfdHJhaXRzPEE+Ojpjb25zdHJ1Y3QKKwkgIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPjo6Y29uc3RydWN0KF9fYSwgX01faW1wbC5fTV9wdHIsCisJICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgLy8gbWlnaHQgdGhyb3cKKwl9CisKKyAgICAgIH5fU3BfY291bnRlZF9wdHJfaW5wbGFjZSgpIG5vZXhjZXB0IHsgfQorCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIF9NX2Rpc3Bvc2UoKSBub2V4Y2VwdAorICAgICAgeyBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46OmRlc3Ryb3koX01faW1wbCwgX01faW1wbC5fTV9wdHIpOyB9CisKKyAgICAgIC8vIE92ZXJyaWRlIGJlY2F1c2UgdGhlIGFsbG9jYXRvciBuZWVkcyB0byBrbm93IHRoZSBkeW5hbWljIHR5cGUKKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgX01fZGVzdHJveSgpIG5vZXhjZXB0CisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46OnRlbXBsYXRlCisJICByZWJpbmRfdHJhaXRzPF9TcF9jb3VudGVkX3B0cl9pbnBsYWNlPiBfQWxsb2NfdHJhaXRzOworCXR5cGVuYW1lIF9BbGxvY190cmFpdHM6OmFsbG9jYXRvcl90eXBlIF9fYShfTV9pbXBsKTsKKwlfQWxsb2NfdHJhaXRzOjpkZXN0cm95KF9fYSwgdGhpcyk7CisJX0FsbG9jX3RyYWl0czo6ZGVhbGxvY2F0ZShfX2EsIHRoaXMsIDEpOworICAgICAgfQorCisgICAgICAvLyBTbmVha3kgdHJpY2sgc28gX19zaGFyZWRfcHRyIGNhbiBnZXQgdGhlIG1hbmFnZWQgcG9pbnRlcgorICAgICAgdmlydHVhbCB2b2lkKgorICAgICAgX01fZ2V0X2RlbGV0ZXIoY29uc3Qgc3RkOjp0eXBlX2luZm8mIF9fdGkpIG5vZXhjZXB0CisgICAgICB7CisjaWZkZWYgX19HWFhfUlRUSQorCXJldHVybiBfX3RpID09IHR5cGVpZChfU3BfbWFrZV9zaGFyZWRfdGFnKQorCSAgICAgICA/IHN0YXRpY19jYXN0PHZvaWQqPigmX01fc3RvcmFnZSkKKwkgICAgICAgOiAwOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICBfSW1wbCBfTV9pbXBsOworICAgICAgdHlwZW5hbWUgYWxpZ25lZF9zdG9yYWdlPHNpemVvZihfVHApLCBhbGlnbm1lbnRfb2Y8X1RwPjo6dmFsdWU+Ojp0eXBlCisJX01fc3RvcmFnZTsKKyAgICB9OworCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX19zaGFyZWRfY291bnQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIF9fc2hhcmVkX2NvdW50KCkgbm9leGNlcHQgOiBfTV9waSgwKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHI+CisgICAgICAgIGV4cGxpY2l0CisJX19zaGFyZWRfY291bnQoX1B0ciBfX3ApIDogX01fcGkoMCkKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgX01fcGkgPSBuZXcgX1NwX2NvdW50ZWRfcHRyPF9QdHIsIF9McD4oX19wKTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBkZWxldGUgX19wOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyLCB0eXBlbmFtZSBfRGVsZXRlcj4KKwlfX3NoYXJlZF9jb3VudChfUHRyIF9fcCwgX0RlbGV0ZXIgX19kKQorCTogX19zaGFyZWRfY291bnQoX19wLCBzdGQ6Om1vdmUoX19kKSwgYWxsb2NhdG9yPGludD4oKSkKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1B0ciwgdHlwZW5hbWUgX0RlbGV0ZXIsIHR5cGVuYW1lIF9BbGxvYz4KKwlfX3NoYXJlZF9jb3VudChfUHRyIF9fcCwgX0RlbGV0ZXIgX19kLCBfQWxsb2MgX19hKSA6IF9NX3BpKDApCisJeworCSAgdHlwZWRlZiBfU3BfY291bnRlZF9kZWxldGVyPF9QdHIsIF9EZWxldGVyLCBfQWxsb2MsIF9McD4gX1NwX2NkX3R5cGU7CisJICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPjo6dGVtcGxhdGUKKwkgICAgcmViaW5kX3RyYWl0czxfU3BfY2RfdHlwZT4gX0FsbG9jX3RyYWl0czsKKwkgIHR5cGVuYW1lIF9BbGxvY190cmFpdHM6OmFsbG9jYXRvcl90eXBlIF9fYTIoX19hKTsKKwkgIF9TcF9jZF90eXBlKiBfX21lbSA9IDA7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgX19tZW0gPSBfQWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfX2EyLCAxKTsKKwkgICAgICBfQWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19hMiwgX19tZW0sCisJCSAgX19wLCBzdGQ6Om1vdmUoX19kKSwgc3RkOjptb3ZlKF9fYSkpOworCSAgICAgIF9NX3BpID0gX19tZW07CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX19kKF9fcCk7IC8vIENhbGwgX0RlbGV0ZXIgb24gX19wLgorCSAgICAgIGlmIChfX21lbSkKKwkgICAgICAgIF9BbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hMiwgX19tZW0sIDEpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FyZ3M+CisJX19zaGFyZWRfY291bnQoX1NwX21ha2Vfc2hhcmVkX3RhZywgX1RwKiwgY29uc3QgX0FsbG9jJiBfX2EsCisJCSAgICAgICBfQXJncyYmLi4uIF9fYXJncykKKwk6IF9NX3BpKDApCisJeworCSAgdHlwZWRlZiBfU3BfY291bnRlZF9wdHJfaW5wbGFjZTxfVHAsIF9BbGxvYywgX0xwPiBfU3BfY3BfdHlwZTsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+Ojp0ZW1wbGF0ZQorCSAgICByZWJpbmRfdHJhaXRzPF9TcF9jcF90eXBlPiBfQWxsb2NfdHJhaXRzOworCSAgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czo6YWxsb2NhdG9yX3R5cGUgX19hMihfX2EpOworCSAgX1NwX2NwX3R5cGUqIF9fbWVtID0gX0FsbG9jX3RyYWl0czo6YWxsb2NhdGUoX19hMiwgMSk7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgX0FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYTIsIF9fbWVtLCBzdGQ6Om1vdmUoX19hKSwKKwkJICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICAgICAgX01fcGkgPSBfX21lbTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfQWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYTIsIF9fbWVtLCAxKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKworI2lmIF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGF1dG9fcHRyPF9UcD4gdG8gcHJvdmlkZSB0aGUgc3Ryb25nIGd1YXJhbnRlZS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgZXhwbGljaXQKKwlfX3NoYXJlZF9jb3VudChzdGQ6OmF1dG9fcHRyPF9UcD4mJiBfX3IpOworI2VuZGlmCisKKyAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdW5pcXVlX3B0cjxfVHAsX0RlbD4gdG8gcHJvdmlkZSB0aGUgc3Ryb25nIGd1YXJhbnRlZS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RlbD4KKyAgICAgICAgZXhwbGljaXQKKwlfX3NoYXJlZF9jb3VudChzdGQ6OnVuaXF1ZV9wdHI8X1RwLCBfRGVsPiYmIF9fcikgOiBfTV9waSgwKQorCXsKKwkgIHVzaW5nIF9QdHIgPSB0eXBlbmFtZSB1bmlxdWVfcHRyPF9UcCwgX0RlbD46OnBvaW50ZXI7CisJICB1c2luZyBfRGVsMiA9IHR5cGVuYW1lIGNvbmRpdGlvbmFsPGlzX3JlZmVyZW5jZTxfRGVsPjo6dmFsdWUsCisJICAgICAgcmVmZXJlbmNlX3dyYXBwZXI8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRGVsPjo6dHlwZT4sCisJICAgICAgX0RlbD46OnR5cGU7CisJICB1c2luZyBfU3BfY2RfdHlwZQorCSAgICA9IF9TcF9jb3VudGVkX2RlbGV0ZXI8X1B0ciwgX0RlbDIsIGFsbG9jYXRvcjx2b2lkPiwgX0xwPjsKKwkgIHVzaW5nIF9BbGxvYyA9IGFsbG9jYXRvcjxfU3BfY2RfdHlwZT47CisJICB1c2luZyBfQWxsb2NfdHJhaXRzID0gYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+OworCSAgX0FsbG9jIF9fYTsKKwkgIF9TcF9jZF90eXBlKiBfX21lbSA9IF9BbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fYSwgMSk7CisJICBfQWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19hLCBfX21lbSwgX19yLnJlbGVhc2UoKSwKKwkJCQkgICBfX3IuZ2V0X2RlbGV0ZXIoKSk7ICAvLyBub24tdGhyb3dpbmcKKwkgIF9NX3BpID0gX19tZW07CisJfQorCisgICAgICAvLyBUaHJvdyBiYWRfd2Vha19wdHIgd2hlbiBfX3IuX01fZ2V0X3VzZV9jb3VudCgpID09IDAuCisgICAgICBleHBsaWNpdCBfX3NoYXJlZF9jb3VudChjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19yKTsKKworICAgICAgfl9fc2hhcmVkX2NvdW50KCkgbm9leGNlcHQKKyAgICAgIHsKKwlpZiAoX01fcGkgIT0gbnVsbHB0cikKKwkgIF9NX3BpLT5fTV9yZWxlYXNlKCk7CisgICAgICB9CisKKyAgICAgIF9fc2hhcmVkX2NvdW50KGNvbnN0IF9fc2hhcmVkX2NvdW50JiBfX3IpIG5vZXhjZXB0CisgICAgICA6IF9NX3BpKF9fci5fTV9waSkKKyAgICAgIHsKKwlpZiAoX01fcGkgIT0gMCkKKwkgIF9NX3BpLT5fTV9hZGRfcmVmX2NvcHkoKTsKKyAgICAgIH0KKworICAgICAgX19zaGFyZWRfY291bnQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX19zaGFyZWRfY291bnQmIF9fcikgbm9leGNlcHQKKyAgICAgIHsKKwlfU3BfY291bnRlZF9iYXNlPF9McD4qIF9fdG1wID0gX19yLl9NX3BpOworCWlmIChfX3RtcCAhPSBfTV9waSkKKwkgIHsKKwkgICAgaWYgKF9fdG1wICE9IDApCisJICAgICAgX190bXAtPl9NX2FkZF9yZWZfY29weSgpOworCSAgICBpZiAoX01fcGkgIT0gMCkKKwkgICAgICBfTV9waS0+X01fcmVsZWFzZSgpOworCSAgICBfTV9waSA9IF9fdG1wOworCSAgfQorCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fc3dhcChfX3NoYXJlZF9jb3VudCYgX19yKSBub2V4Y2VwdAorICAgICAgeworCV9TcF9jb3VudGVkX2Jhc2U8X0xwPiogX190bXAgPSBfX3IuX01fcGk7CisJX19yLl9NX3BpID0gX01fcGk7CisJX01fcGkgPSBfX3RtcDsKKyAgICAgIH0KKworICAgICAgbG9uZworICAgICAgX01fZ2V0X3VzZV9jb3VudCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9waSAhPSAwID8gX01fcGktPl9NX2dldF91c2VfY291bnQoKSA6IDA7IH0KKworICAgICAgYm9vbAorICAgICAgX01fdW5pcXVlKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2dldF91c2VfY291bnQoKSA9PSAxOyB9CisKKyAgICAgIHZvaWQqCisgICAgICBfTV9nZXRfZGVsZXRlcihjb25zdCBzdGQ6OnR5cGVfaW5mbyYgX190aSkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3BpID8gX01fcGktPl9NX2dldF9kZWxldGVyKF9fdGkpIDogMDsgfQorCisgICAgICBib29sCisgICAgICBfTV9sZXNzKGNvbnN0IF9fc2hhcmVkX2NvdW50JiBfX3JocykgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bGVzczxfU3BfY291bnRlZF9iYXNlPF9McD4qPigpKHRoaXMtPl9NX3BpLCBfX3Jocy5fTV9waSk7IH0KKworICAgICAgYm9vbAorICAgICAgX01fbGVzcyhjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19yaHMpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Omxlc3M8X1NwX2NvdW50ZWRfYmFzZTxfTHA+Kj4oKSh0aGlzLT5fTV9waSwgX19yaHMuX01fcGkpOyB9CisKKyAgICAgIC8vIEZyaWVuZCBmdW5jdGlvbiBpbmplY3RlZCBpbnRvIGVuY2xvc2luZyBuYW1lc3BhY2UgYW5kIGZvdW5kIGJ5IEFETAorICAgICAgZnJpZW5kIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9fc2hhcmVkX2NvdW50JiBfX2EsIGNvbnN0IF9fc2hhcmVkX2NvdW50JiBfX2IpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2EuX01fcGkgPT0gX19iLl9NX3BpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgZnJpZW5kIGNsYXNzIF9fd2Vha19jb3VudDxfTHA+OworCisgICAgICBfU3BfY291bnRlZF9iYXNlPF9McD4qICBfTV9waTsKKyAgICB9OworCisKKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfX3dlYWtfY291bnQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIF9fd2Vha19jb3VudCgpIG5vZXhjZXB0IDogX01fcGkoMCkKKyAgICAgIHsgfQorCisgICAgICBfX3dlYWtfY291bnQoY29uc3QgX19zaGFyZWRfY291bnQ8X0xwPiYgX19yKSBub2V4Y2VwdAorICAgICAgOiBfTV9waShfX3IuX01fcGkpCisgICAgICB7CisJaWYgKF9NX3BpICE9IDApCisJICBfTV9waS0+X01fd2Vha19hZGRfcmVmKCk7CisgICAgICB9CisKKyAgICAgIF9fd2Vha19jb3VudChjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19yKSBub2V4Y2VwdAorICAgICAgOiBfTV9waShfX3IuX01fcGkpCisgICAgICB7CisJaWYgKF9NX3BpICE9IDApCisJICBfTV9waS0+X01fd2Vha19hZGRfcmVmKCk7CisgICAgICB9CisKKyAgICAgIH5fX3dlYWtfY291bnQoKSBub2V4Y2VwdAorICAgICAgeworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX3dlYWtfcmVsZWFzZSgpOworICAgICAgfQorCisgICAgICBfX3dlYWtfY291bnQ8X0xwPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX3IpIG5vZXhjZXB0CisgICAgICB7CisJX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiBfX3RtcCA9IF9fci5fTV9waTsKKwlpZiAoX190bXAgIT0gMCkKKwkgIF9fdG1wLT5fTV93ZWFrX2FkZF9yZWYoKTsKKwlpZiAoX01fcGkgIT0gMCkKKwkgIF9NX3BpLT5fTV93ZWFrX3JlbGVhc2UoKTsKKwlfTV9waSA9IF9fdG1wOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX193ZWFrX2NvdW50PF9McD4mCisgICAgICBvcGVyYXRvcj0oY29uc3QgX193ZWFrX2NvdW50PF9McD4mIF9fcikgbm9leGNlcHQKKyAgICAgIHsKKwlfU3BfY291bnRlZF9iYXNlPF9McD4qIF9fdG1wID0gX19yLl9NX3BpOworCWlmIChfX3RtcCAhPSAwKQorCSAgX190bXAtPl9NX3dlYWtfYWRkX3JlZigpOworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX3dlYWtfcmVsZWFzZSgpOworCV9NX3BpID0gX190bXA7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9fd2Vha19jb3VudDxfTHA+JiBfX3IpIG5vZXhjZXB0CisgICAgICB7CisJX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiBfX3RtcCA9IF9fci5fTV9waTsKKwlfX3IuX01fcGkgPSBfTV9waTsKKwlfTV9waSA9IF9fdG1wOworICAgICAgfQorCisgICAgICBsb25nCisgICAgICBfTV9nZXRfdXNlX2NvdW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3BpICE9IDAgPyBfTV9waS0+X01fZ2V0X3VzZV9jb3VudCgpIDogMDsgfQorCisgICAgICBib29sCisgICAgICBfTV9sZXNzKGNvbnN0IF9fd2Vha19jb3VudCYgX19yaHMpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Omxlc3M8X1NwX2NvdW50ZWRfYmFzZTxfTHA+Kj4oKSh0aGlzLT5fTV9waSwgX19yaHMuX01fcGkpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2xlc3MoY29uc3QgX19zaGFyZWRfY291bnQ8X0xwPiYgX19yaHMpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Omxlc3M8X1NwX2NvdW50ZWRfYmFzZTxfTHA+Kj4oKSh0aGlzLT5fTV9waSwgX19yaHMuX01fcGkpOyB9CisKKyAgICAgIC8vIEZyaWVuZCBmdW5jdGlvbiBpbmplY3RlZCBpbnRvIGVuY2xvc2luZyBuYW1lc3BhY2UgYW5kIGZvdW5kIGJ5IEFETAorICAgICAgZnJpZW5kIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9fd2Vha19jb3VudCYgX19hLCBjb25zdCBfX3dlYWtfY291bnQmIF9fYikgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYS5fTV9waSA9PSBfX2IuX01fcGk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBmcmllbmQgY2xhc3MgX19zaGFyZWRfY291bnQ8X0xwPjsKKworICAgICAgX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiAgX01fcGk7CisgICAgfTsKKworICAvLyBOb3cgdGhhdCBfX3dlYWtfY291bnQgaXMgZGVmaW5lZCB3ZSBjYW4gZGVmaW5lIHRoaXMgY29uc3RydWN0b3I6CisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIF9fc2hhcmVkX2NvdW50PF9McD46OiBfX3NoYXJlZF9jb3VudChjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19yKQorICAgIDogX01fcGkoX19yLl9NX3BpKQorICAgIHsKKyAgICAgIGlmIChfTV9waSAhPSAwKQorCV9NX3BpLT5fTV9hZGRfcmVmX2xvY2soKTsKKyAgICAgIGVsc2UKKwlfX3Rocm93X2JhZF93ZWFrX3B0cigpOworICAgIH0KKworCisgIC8vIFN1cHBvcnQgZm9yIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzLgorCisgIC8vIEZyaWVuZCBvZiBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzLgorICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwLCB0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgIHZvaWQKKyAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiwKKwkJCQkgICAgIGNvbnN0IF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8X1RwMSwKKwkJCQkgICAgIF9McD4qLCBjb25zdCBfVHAyKikgbm9leGNlcHQ7CisKKyAgLy8gRnJpZW5kIG9mIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgIHZvaWQKKyAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihjb25zdCBfX3NoYXJlZF9jb3VudDw+JiwKKwkJCQkgICAgIGNvbnN0IGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPF9UcDE+KiwKKwkJCQkgICAgIGNvbnN0IF9UcDIqKSBub2V4Y2VwdDsKKworICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSB2b2lkCisgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoY29uc3QgX19zaGFyZWRfY291bnQ8X0xwPiYsIC4uLikgbm9leGNlcHQKKyAgICB7IH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfX3NoYXJlZF9wdHIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgICBlbGVtZW50X3R5cGU7CisKKyAgICAgIGNvbnN0ZXhwciBfX3NoYXJlZF9wdHIoKSBub2V4Y2VwdAorICAgICAgOiBfTV9wdHIoMCksIF9NX3JlZmNvdW50KCkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCWV4cGxpY2l0IF9fc2hhcmVkX3B0cihfVHAxKiBfX3ApCisgICAgICAgIDogX01fcHRyKF9fcCksIF9NX3JlZmNvdW50KF9fcCkKKwl7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisJICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoX1RwMSkgPiAwLCAiaW5jb21wbGV0ZSB0eXBlIiApOworCSAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9fcCwgX19wKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9EZWxldGVyPgorCV9fc2hhcmVkX3B0cihfVHAxKiBfX3AsIF9EZWxldGVyIF9fZCkKKwk6IF9NX3B0cihfX3ApLCBfTV9yZWZjb3VudChfX3AsIF9fZCkKKwl7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisJICAvLyBUT0RPIHJlcXVpcmVzIF9EZWxldGVyIENvcHlDb25zdHJ1Y3RpYmxlIGFuZCBfX2QoX19wKSB3ZWxsLWZvcm1lZAorCSAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9fcCwgX19wKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9EZWxldGVyLCB0eXBlbmFtZSBfQWxsb2M+CisJX19zaGFyZWRfcHRyKF9UcDEqIF9fcCwgX0RlbGV0ZXIgX19kLCBfQWxsb2MgX19hKQorCTogX01fcHRyKF9fcCksIF9NX3JlZmNvdW50KF9fcCwgX19kLCBzdGQ6Om1vdmUoX19hKSkKKwl7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisJICAvLyBUT0RPIHJlcXVpcmVzIF9EZWxldGVyIENvcHlDb25zdHJ1Y3RpYmxlIGFuZCBfX2QoX19wKSB3ZWxsLWZvcm1lZAorCSAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9fcCwgX19wKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9EZWxldGVyPgorCV9fc2hhcmVkX3B0cihudWxscHRyX3QgX19wLCBfRGVsZXRlciBfX2QpCisJOiBfTV9wdHIoMCksIF9NX3JlZmNvdW50KF9fcCwgX19kKQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRGVsZXRlciwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBfX3NoYXJlZF9wdHIobnVsbHB0cl90IF9fcCwgX0RlbGV0ZXIgX19kLCBfQWxsb2MgX19hKQorCTogX01fcHRyKDApLCBfTV9yZWZjb3VudChfX3AsIF9fZCwgc3RkOjptb3ZlKF9fYSkpCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJX19zaGFyZWRfcHRyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IsIF9UcCogX19wKSBub2V4Y2VwdAorCTogX01fcHRyKF9fcCksIF9NX3JlZmNvdW50KF9fci5fTV9yZWZjb3VudCkgLy8gbmV2ZXIgdGhyb3dzCisJeyB9CisKKyAgICAgIF9fc2hhcmVkX3B0cihjb25zdCBfX3NoYXJlZF9wdHImKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBfX3NoYXJlZF9wdHImIG9wZXJhdG9yPShjb25zdCBfX3NoYXJlZF9wdHImKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICB+X19zaGFyZWRfcHRyKCkgPSBkZWZhdWx0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1RwMSosIF9UcCo+Ojp2YWx1ZT46OnR5cGU+CisJX19zaGFyZWRfcHRyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IpIG5vZXhjZXB0CisJOiBfTV9wdHIoX19yLl9NX3B0ciksIF9NX3JlZmNvdW50KF9fci5fTV9yZWZjb3VudCkKKwl7IH0KKworICAgICAgX19zaGFyZWRfcHRyKF9fc2hhcmVkX3B0ciYmIF9fcikgbm9leGNlcHQKKyAgICAgIDogX01fcHRyKF9fci5fTV9wdHIpLCBfTV9yZWZjb3VudCgpCisgICAgICB7CisJX01fcmVmY291bnQuX01fc3dhcChfX3IuX01fcmVmY291bnQpOworCV9fci5fTV9wdHIgPSAwOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1RwMSosIF9UcCo+Ojp2YWx1ZT46OnR5cGU+CisJX19zaGFyZWRfcHRyKF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiYgX19yKSBub2V4Y2VwdAorCTogX01fcHRyKF9fci5fTV9wdHIpLCBfTV9yZWZjb3VudCgpCisJeworCSAgX01fcmVmY291bnQuX01fc3dhcChfX3IuX01fcmVmY291bnQpOworCSAgX19yLl9NX3B0ciA9IDA7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCWV4cGxpY2l0IF9fc2hhcmVkX3B0cihjb25zdCBfX3dlYWtfcHRyPF9UcDEsIF9McD4mIF9fcikKKwk6IF9NX3JlZmNvdW50KF9fci5fTV9yZWZjb3VudCkgLy8gbWF5IHRocm93CisJeworCSAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwMSosIF9UcCo+KQorCisJICAvLyBJdCBpcyBub3cgc2FmZSB0byBjb3B5IF9fci5fTV9wdHIsIGFzCisJICAvLyBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIGRpZCBub3QgdGhyb3cuCisJICBfTV9wdHIgPSBfX3IuX01fcHRyOworCX0KKworICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biB0aGlzIGNvbnN0cnVjdG9yIGhhcyBubyBlZmZlY3QuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfRGVsPgorCV9fc2hhcmVkX3B0cihzdGQ6OnVuaXF1ZV9wdHI8X1RwMSwgX0RlbD4mJiBfX3IpCisJOiBfTV9wdHIoX19yLmdldCgpKSwgX01fcmVmY291bnQoKQorCXsKKwkgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcDEqLCBfVHAqPikKKwkgIGF1dG8gX190bXAgPSBfX3IuZ2V0KCk7CisJICBfTV9yZWZjb3VudCA9IF9fc2hhcmVkX2NvdW50PF9McD4oc3RkOjptb3ZlKF9fcikpOworCSAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9fdG1wLCBfX3RtcCk7CisJfQorCisjaWYgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyAgICAgIC8vIFBvc3Rjb25kaXRpb246IHVzZV9jb3VudCgpID09IDEgYW5kIF9fci5nZXQoKSA9PSAwCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCV9fc2hhcmVkX3B0cihzdGQ6OmF1dG9fcHRyPF9UcDE+JiYgX19yKTsKKyNlbmRpZgorCisgICAgICAvKiBUT0RPOiB1c2UgZGVsZWdhdGluZyBjb25zdHJ1Y3RvciAqLworICAgICAgY29uc3RleHByIF9fc2hhcmVkX3B0cihudWxscHRyX3QpIG5vZXhjZXB0CisgICAgICA6IF9NX3B0cigwKSwgX01fcmVmY291bnQoKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJX19zaGFyZWRfcHRyJgorCW9wZXJhdG9yPShjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKSBub2V4Y2VwdAorCXsKKwkgIF9NX3B0ciA9IF9fci5fTV9wdHI7CisJICBfTV9yZWZjb3VudCA9IF9fci5fTV9yZWZjb3VudDsgLy8gX19zaGFyZWRfY291bnQ6Om9wPSBkb2Vzbid0IHRocm93CisJICByZXR1cm4gKnRoaXM7CisJfQorCisjaWYgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJX19zaGFyZWRfcHRyJgorCW9wZXJhdG9yPShzdGQ6OmF1dG9fcHRyPF9UcDE+JiYgX19yKQorCXsKKwkgIF9fc2hhcmVkX3B0cihzdGQ6Om1vdmUoX19yKSkuc3dhcCgqdGhpcyk7CisJICByZXR1cm4gKnRoaXM7CisJfQorI2VuZGlmCisKKyAgICAgIF9fc2hhcmVkX3B0ciYKKyAgICAgIG9wZXJhdG9yPShfX3NoYXJlZF9wdHImJiBfX3IpIG5vZXhjZXB0CisgICAgICB7CisJX19zaGFyZWRfcHRyKHN0ZDo6bW92ZShfX3IpKS5zd2FwKCp0aGlzKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9UcDE+CisJX19zaGFyZWRfcHRyJgorCW9wZXJhdG9yPShfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYmIF9fcikgbm9leGNlcHQKKwl7CisJICBfX3NoYXJlZF9wdHIoc3RkOjptb3ZlKF9fcikpLnN3YXAoKnRoaXMpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbD4KKwlfX3NoYXJlZF9wdHImCisJb3BlcmF0b3I9KHN0ZDo6dW5pcXVlX3B0cjxfVHAxLCBfRGVsPiYmIF9fcikKKwl7CisJICBfX3NoYXJlZF9wdHIoc3RkOjptb3ZlKF9fcikpLnN3YXAoKnRoaXMpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdm9pZAorICAgICAgcmVzZXQoKSBub2V4Y2VwdAorICAgICAgeyBfX3NoYXJlZF9wdHIoKS5zd2FwKCp0aGlzKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXZvaWQKKwlyZXNldChfVHAxKiBfX3ApIC8vIF9UcDEgbXVzdCBiZSBjb21wbGV0ZS4KKwl7CisJICAvLyBDYXRjaCBzZWxmLXJlc2V0IGVycm9ycy4KKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfX3AgPT0gMCB8fCBfX3AgIT0gX01fcHRyKTsKKwkgIF9fc2hhcmVkX3B0cihfX3ApLnN3YXAoKnRoaXMpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbGV0ZXI+CisJdm9pZAorCXJlc2V0KF9UcDEqIF9fcCwgX0RlbGV0ZXIgX19kKQorCXsgX19zaGFyZWRfcHRyKF9fcCwgX19kKS5zd2FwKCp0aGlzKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfRGVsZXRlciwgdHlwZW5hbWUgX0FsbG9jPgorCXZvaWQKKyAgICAgICAgcmVzZXQoX1RwMSogX19wLCBfRGVsZXRlciBfX2QsIF9BbGxvYyBfX2EpCisgICAgICAgIHsgX19zaGFyZWRfcHRyKF9fcCwgX19kLCBzdGQ6Om1vdmUoX19hKSkuc3dhcCgqdGhpcyk7IH0KKworICAgICAgLy8gQWxsb3cgY2xhc3MgaW5zdGFudGlhdGlvbiB3aGVuIF9UcCBpcyBbY3YtcXVhbF0gdm9pZC4KKyAgICAgIHR5cGVuYW1lIHN0ZDo6YWRkX2x2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fcHRyICE9IDApOworCXJldHVybiAqX01fcHRyOworICAgICAgfQorCisgICAgICBfVHAqCisgICAgICBvcGVyYXRvci0+KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fcHRyICE9IDApOworCXJldHVybiBfTV9wdHI7CisgICAgICB9CisKKyAgICAgIF9UcCoKKyAgICAgIGdldCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9wdHI7IH0KKworICAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeyByZXR1cm4gX01fcHRyID09IDAgPyBmYWxzZSA6IHRydWU7IH0KKworICAgICAgYm9vbAorICAgICAgdW5pcXVlKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX3VuaXF1ZSgpOyB9CisKKyAgICAgIGxvbmcKKyAgICAgIHVzZV9jb3VudCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9yZWZjb3VudC5fTV9nZXRfdXNlX2NvdW50KCk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX290aGVyKSBub2V4Y2VwdAorICAgICAgeworCXN0ZDo6c3dhcChfTV9wdHIsIF9fb3RoZXIuX01fcHRyKTsKKwlfTV9yZWZjb3VudC5fTV9zd2FwKF9fb3RoZXIuX01fcmVmY291bnQpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCWJvb2wKKwlvd25lcl9iZWZvcmUoX19zaGFyZWRfcHRyPF9UcDEsIF9McD4gY29uc3QmIF9fcmhzKSBjb25zdAorCXsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2xlc3MoX19yaHMuX01fcmVmY291bnQpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJYm9vbAorCW93bmVyX2JlZm9yZShfX3dlYWtfcHRyPF9UcDEsIF9McD4gY29uc3QmIF9fcmhzKSBjb25zdAorCXsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2xlc3MoX19yaHMuX01fcmVmY291bnQpOyB9CisKKyNpZmRlZiBfX0dYWF9SVFRJCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyBub24tc3RhbmRhcmQsIGl0IGlzIHVzZWQgYnkgYWxsb2NhdGVfc2hhcmVkLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZS4uLiBfQXJncz4KKwlfX3NoYXJlZF9wdHIoX1NwX21ha2Vfc2hhcmVkX3RhZyBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsCisJCSAgICAgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJOiBfTV9wdHIoKSwgX01fcmVmY291bnQoX190YWcsIChfVHAqKTAsIF9fYSwKKwkJCQlzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pCisJeworCSAgLy8gX01fcHRyIG5lZWRzIHRvIHBvaW50IHRvIHRoZSBuZXdseSBjb25zdHJ1Y3RlZCBvYmplY3QuCisJICAvLyBUaGlzIHJlbGllcyBvbiBfU3BfY291bnRlZF9wdHJfaW5wbGFjZTo6X01fZ2V0X2RlbGV0ZXIuCisJICB2b2lkKiBfX3AgPSBfTV9yZWZjb3VudC5fTV9nZXRfZGVsZXRlcih0eXBlaWQoX190YWcpKTsKKwkgIF9NX3B0ciA9IHN0YXRpY19jYXN0PF9UcCo+KF9fcCk7CisJICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihfTV9yZWZjb3VudCwgX01fcHRyLCBfTV9wdHIpOworCX0KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgICAgIHN0cnVjdCBfRGVsZXRlcgorICAgICAgICB7CisgICAgICAgICAgdm9pZCBvcGVyYXRvcigpKF9UcCogX19wdHIpCisgICAgICAgICAgeworCSAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPiBfQWxsb2NfdHJhaXRzOworCSAgICBfQWxsb2NfdHJhaXRzOjpkZXN0cm95KF9NX2FsbG9jLCBfX3B0cik7CisJICAgIF9BbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX01fYWxsb2MsIF9fcHRyLCAxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgX0FsbG9jIF9NX2FsbG9jOworICAgICAgICB9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9BcmdzPgorCV9fc2hhcmVkX3B0cihfU3BfbWFrZV9zaGFyZWRfdGFnIF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkJICAgICBfQXJncyYmLi4uIF9fYXJncykKKwk6IF9NX3B0cigpLCBfTV9yZWZjb3VudCgpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1RwPjo6b3RoZXIgX0FsbG9jMjsKKyAgICAgICAgICBfRGVsZXRlcjxfQWxsb2MyPiBfX2RlbCA9IHsgX0FsbG9jMihfX2EpIH07CisJICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jMj4gX190cmFpdHM7CisgICAgICAgICAgX01fcHRyID0gX190cmFpdHM6OmFsbG9jYXRlKF9fZGVsLl9NX2FsbG9jLCAxKTsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gMjA3MC4gYWxsb2NhdGVfc2hhcmVkIHNob3VsZCB1c2UgYWxsb2NhdG9yX3RyYWl0czxBPjo6Y29uc3RydWN0CisJICAgICAgX190cmFpdHM6OmNvbnN0cnVjdChfX2RlbC5fTV9hbGxvYywgX01fcHRyLAorCQkgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIF9fdHJhaXRzOjpkZWFsbG9jYXRlKF9fZGVsLl9NX2FsbG9jLCBfTV9wdHIsIDEpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisgICAgICAgICAgX19zaGFyZWRfY291bnQ8X0xwPiBfX2NvdW50KF9NX3B0ciwgX19kZWwsIF9fZGVsLl9NX2FsbG9jKTsKKyAgICAgICAgICBfTV9yZWZjb3VudC5fTV9zd2FwKF9fY291bnQpOworCSAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9NX3B0ciwgX01fcHRyKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHAxLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgICAgIHR5cGVuYW1lLi4uIF9BcmdzPgorCWZyaWVuZCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwMT4KKwlfX2FsbG9jYXRlX3NoYXJlZChjb25zdCBfQWxsb2MmIF9fYSwgX0FyZ3MmJi4uLiBfX2FyZ3MpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQqCisgICAgICBfTV9nZXRfZGVsZXRlcihjb25zdCBzdGQ6OnR5cGVfaW5mbyYgX190aSkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2dldF9kZWxldGVyKF9fdGkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHAxPiBmcmllbmQgY2xhc3MgX19zaGFyZWRfcHRyOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McDE+IGZyaWVuZCBjbGFzcyBfX3dlYWtfcHRyOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRGVsLCB0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwMT4KKwlmcmllbmQgX0RlbCogZ2V0X2RlbGV0ZXIoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McDE+Jikgbm9leGNlcHQ7CisKKyAgICAgIF9UcCoJICAgCSAgIF9NX3B0cjsgICAgICAgICAvLyBDb250YWluZWQgcG9pbnRlci4KKyAgICAgIF9fc2hhcmVkX2NvdW50PF9McD4gIF9NX3JlZmNvdW50OyAgICAvLyBSZWZlcmVuY2UgY291bnRlci4KKyAgICB9OworCisKKyAgLy8gMjAuNy4yLjIuNyBzaGFyZWRfcHRyIGNvbXBhcmlzb25zCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDIsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX2EsCisJICAgICAgIGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAyLCBfTHA+JiBfX2IpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLmdldCgpID09IF9fYi5nZXQoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19hLCBudWxscHRyX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIV9fYTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0obnVsbHB0cl90LCBjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIV9fYTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDIsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX2EsCisJICAgICAgIGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAyLCBfTHA+JiBfX2IpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLmdldCgpICE9IF9fYi5nZXQoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19hLCBudWxscHRyX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gKGJvb2wpX19hOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShudWxscHRyX3QsIGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fYSkgbm9leGNlcHQKKyAgICB7IHJldHVybiAoYm9vbClfX2E7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX2EsCisJICAgICAgY29uc3QgX19zaGFyZWRfcHRyPF9UcDIsIF9McD4mIF9fYikgbm9leGNlcHQKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29tbW9uX3R5cGU8X1RwMSosIF9UcDIqPjo6dHlwZSBfQ1Q7CisgICAgICByZXR1cm4gc3RkOjpsZXNzPF9DVD4oKShfX2EuZ2V0KCksIF9fYi5nZXQoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2EsIG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBzdGQ6Omxlc3M8X1RwKj4oKShfX2EuZ2V0KCksIG51bGxwdHIpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KG51bGxwdHJfdCwgY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19hKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHN0ZDo6bGVzczxfVHAqPigpKG51bGxwdHIsIF9fYS5nZXQoKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19hLAorCSAgICAgICBjb25zdCBfX3NoYXJlZF9wdHI8X1RwMiwgX0xwPiYgX19iKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICEoX19iIDwgX19hKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19hLCBudWxscHRyX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIShudWxscHRyIDwgX19hKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0obnVsbHB0cl90LCBjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIShfX2EgPCBudWxscHRyKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDIsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fYSwKKwkgICAgICBjb25zdCBfX3NoYXJlZF9wdHI8X1RwMiwgX0xwPiYgX19iKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIChfX2IgPCBfX2EpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fYSwgbnVsbHB0cl90KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHN0ZDo6bGVzczxfVHAqPigpKG51bGxwdHIsIF9fYS5nZXQoKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4obnVsbHB0cl90LCBjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gc3RkOjpsZXNzPF9UcCo+KCkoX19hLmdldCgpLCBudWxscHRyKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDIsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX2EsCisJICAgICAgIGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAyLCBfTHA+JiBfX2IpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIShfX2EgPCBfX2IpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2EsIG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiAhKF9fYSA8IG51bGxwdHIpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShudWxscHRyX3QsIGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fYSkgbm9leGNlcHQKKyAgICB7IHJldHVybiAhKG51bGxwdHIgPCBfX2EpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NwPgorICAgIHN0cnVjdCBfU3BfbGVzcyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1NwLCBfU3AsIGJvb2w+CisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfU3AmIF9fbGhzLCBjb25zdCBfU3AmIF9fcmhzKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX1NwOjplbGVtZW50X3R5cGUgZWxlbWVudF90eXBlOworCXJldHVybiBzdGQ6Omxlc3M8ZWxlbWVudF90eXBlKj4oKShfX2xocy5nZXQoKSwgX19yaHMuZ2V0KCkpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIHN0cnVjdCBsZXNzPF9fc2hhcmVkX3B0cjxfVHAsIF9McD4+CisgICAgOiBwdWJsaWMgX1NwX2xlc3M8X19zaGFyZWRfcHRyPF9UcCwgX0xwPj4KKyAgICB7IH07CisKKyAgLy8gMi4yLjMuOCBzaGFyZWRfcHRyIHNwZWNpYWxpemVkIGFsZ29yaXRobXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19hLCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2IpIG5vZXhjZXB0CisgICAgeyBfX2Euc3dhcChfX2IpOyB9CisKKyAgLy8gMi4yLjMuOSBzaGFyZWRfcHRyIGNhc3RzCisKKyAgLy8gVGhlIHNlZW1pbmdseSBlcXVpdmFsZW50IGNvZGU6CisgIC8vIHNoYXJlZF9wdHI8X1RwLCBfTHA+KHN0YXRpY19jYXN0PF9UcCo+KF9fci5nZXQoKSkpCisgIC8vIHdpbGwgZXZlbnR1YWxseSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW91ciwgYXR0ZW1wdGluZyB0bworICAvLyBkZWxldGUgdGhlIHNhbWUgb2JqZWN0IHR3aWNlLgorICAvLy8gc3RhdGljX3BvaW50ZXJfY2FzdAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4KKyAgICBzdGF0aWNfcG9pbnRlcl9jYXN0KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19zaGFyZWRfcHRyPF9UcCwgX0xwPihfX3IsIHN0YXRpY19jYXN0PF9UcCo+KF9fci5nZXQoKSkpOyB9CisKKyAgLy8gVGhlIHNlZW1pbmdseSBlcXVpdmFsZW50IGNvZGU6CisgIC8vIHNoYXJlZF9wdHI8X1RwLCBfTHA+KGNvbnN0X2Nhc3Q8X1RwKj4oX19yLmdldCgpKSkKKyAgLy8gd2lsbCBldmVudHVhbGx5IHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3VyLCBhdHRlbXB0aW5nIHRvCisgIC8vIGRlbGV0ZSB0aGUgc2FtZSBvYmplY3QgdHdpY2UuCisgIC8vLyBjb25zdF9wb2ludGVyX2Nhc3QKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+CisgICAgY29uc3RfcG9pbnRlcl9jYXN0KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19zaGFyZWRfcHRyPF9UcCwgX0xwPihfX3IsIGNvbnN0X2Nhc3Q8X1RwKj4oX19yLmdldCgpKSk7IH0KKworICAvLyBUaGUgc2VlbWluZ2x5IGVxdWl2YWxlbnQgY29kZToKKyAgLy8gc2hhcmVkX3B0cjxfVHAsIF9McD4oZHluYW1pY19jYXN0PF9UcCo+KF9fci5nZXQoKSkpCisgIC8vIHdpbGwgZXZlbnR1YWxseSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW91ciwgYXR0ZW1wdGluZyB0bworICAvLyBkZWxldGUgdGhlIHNhbWUgb2JqZWN0IHR3aWNlLgorICAvLy8gZHluYW1pY19wb2ludGVyX2Nhc3QKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+CisgICAgZHluYW1pY19wb2ludGVyX2Nhc3QoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikgbm9leGNlcHQKKyAgICB7CisgICAgICBpZiAoX1RwKiBfX3AgPSBkeW5hbWljX2Nhc3Q8X1RwKj4oX19yLmdldCgpKSkKKwlyZXR1cm4gX19zaGFyZWRfcHRyPF9UcCwgX0xwPihfX3IsIF9fcCk7CisgICAgICByZXR1cm4gX19zaGFyZWRfcHRyPF9UcCwgX0xwPigpOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfX3dlYWtfcHRyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwIGVsZW1lbnRfdHlwZTsKKworICAgICAgY29uc3RleHByIF9fd2Vha19wdHIoKSBub2V4Y2VwdAorICAgICAgOiBfTV9wdHIoMCksIF9NX3JlZmNvdW50KCkKKyAgICAgIHsgfQorCisgICAgICBfX3dlYWtfcHRyKGNvbnN0IF9fd2Vha19wdHImKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBfX3dlYWtfcHRyJiBvcGVyYXRvcj0oY29uc3QgX193ZWFrX3B0ciYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5fX3dlYWtfcHRyKCkgPSBkZWZhdWx0OworCisgICAgICAvLyBUaGUgIm9idmlvdXMiIGNvbnZlcnRpbmcgY29uc3RydWN0b3IgaW1wbGVtZW50YXRpb246CisgICAgICAvLworICAgICAgLy8gIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAvLyAgICBfX3dlYWtfcHRyKGNvbnN0IF9fd2Vha19wdHI8X1RwMSwgX0xwPiYgX19yKQorICAgICAgLy8gICAgOiBfTV9wdHIoX19yLl9NX3B0ciksIF9NX3JlZmNvdW50KF9fci5fTV9yZWZjb3VudCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICAvLyAgICB7IH0KKyAgICAgIC8vCisgICAgICAvLyBoYXMgYSBzZXJpb3VzIHByb2JsZW0uCisgICAgICAvLworICAgICAgLy8gIF9fci5fTV9wdHIgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGludmFsaWRhdGVkLiBUaGUgX01fcHRyKF9fci5fTV9wdHIpCisgICAgICAvLyAgY29udmVyc2lvbiBtYXkgcmVxdWlyZSBhY2Nlc3MgdG8gKl9fci5fTV9wdHIgKHZpcnR1YWwgaW5oZXJpdGFuY2UpLgorICAgICAgLy8KKyAgICAgIC8vIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBhdm9pZCBzcHVyaW91cyBhY2Nlc3MgdmlvbGF0aW9ucyBzaW5jZQorICAgICAgLy8gaW4gbXVsdGl0aHJlYWRlZCBwcm9ncmFtcyBfX3IuX01fcHRyIG1heSBiZSBpbnZhbGlkYXRlZCBhdCBhbnkgcG9pbnQuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1RwMSosIF9UcCo+Ojp2YWx1ZT46OnR5cGU+CisJX193ZWFrX3B0cihjb25zdCBfX3dlYWtfcHRyPF9UcDEsIF9McD4mIF9fcikgbm9leGNlcHQKKwk6IF9NX3JlZmNvdW50KF9fci5fTV9yZWZjb3VudCkKKyAgICAgICAgeyBfTV9wdHIgPSBfX3IubG9jaygpLmdldCgpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxfVHAxKiwgX1RwKj46OnZhbHVlPjo6dHlwZT4KKwlfX3dlYWtfcHRyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IpIG5vZXhjZXB0CisJOiBfTV9wdHIoX19yLl9NX3B0ciksIF9NX3JlZmNvdW50KF9fci5fTV9yZWZjb3VudCkKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlfX3dlYWtfcHRyJgorCW9wZXJhdG9yPShjb25zdCBfX3dlYWtfcHRyPF9UcDEsIF9McD4mIF9fcikgbm9leGNlcHQKKwl7CisJICBfTV9wdHIgPSBfX3IubG9jaygpLmdldCgpOworCSAgX01fcmVmY291bnQgPSBfX3IuX01fcmVmY291bnQ7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCV9fd2Vha19wdHImCisJb3BlcmF0b3I9KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IpIG5vZXhjZXB0CisJeworCSAgX01fcHRyID0gX19yLl9NX3B0cjsKKwkgIF9NX3JlZmNvdW50ID0gX19yLl9NX3JlZmNvdW50OworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgX19zaGFyZWRfcHRyPF9UcCwgX0xwPgorICAgICAgbG9jaygpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisjaWZkZWYgX19HVEhSRUFEUworCS8vIE9wdGltaXphdGlvbjogYXZvaWQgdGhyb3cgb3ZlcmhlYWQuCisJaWYgKGV4cGlyZWQoKSkKKwkgIHJldHVybiBfX3NoYXJlZF9wdHI8ZWxlbWVudF90eXBlLCBfTHA+KCk7CisKKwlfX3RyeQorCSAgeworCSAgICByZXR1cm4gX19zaGFyZWRfcHRyPGVsZW1lbnRfdHlwZSwgX0xwPigqdGhpcyk7CisJICB9CisJX19jYXRjaChjb25zdCBiYWRfd2Vha19wdHImKQorCSAgeworCSAgICAvLyBROiBIb3cgY2FuIHdlIGdldCBoZXJlPworCSAgICAvLyBBOiBBbm90aGVyIHRocmVhZCBtYXkgaGF2ZSBpbnZhbGlkYXRlZCByIGFmdGVyIHRoZQorCSAgICAvLyAgICB1c2VfY291bnQgdGVzdCBhYm92ZS4KKwkgICAgcmV0dXJuIF9fc2hhcmVkX3B0cjxlbGVtZW50X3R5cGUsIF9McD4oKTsKKwkgIH0KKworI2Vsc2UKKwkvLyBPcHRpbWl6YXRpb246IGF2b2lkIHRyeS9jYXRjaCBvdmVyaGVhZCB3aGVuIHNpbmdsZSB0aHJlYWRlZC4KKwlyZXR1cm4gZXhwaXJlZCgpID8gX19zaGFyZWRfcHRyPGVsZW1lbnRfdHlwZSwgX0xwPigpCisJCQkgOiBfX3NoYXJlZF9wdHI8ZWxlbWVudF90eXBlLCBfTHA+KCp0aGlzKTsKKworI2VuZGlmCisgICAgICB9IC8vIFhYWCBNVAorCisgICAgICBsb25nCisgICAgICB1c2VfY291bnQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fcmVmY291bnQuX01fZ2V0X3VzZV9jb3VudCgpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGV4cGlyZWQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fcmVmY291bnQuX01fZ2V0X3VzZV9jb3VudCgpID09IDA7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlib29sCisJb3duZXJfYmVmb3JlKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3JocykgY29uc3QKKwl7IHJldHVybiBfTV9yZWZjb3VudC5fTV9sZXNzKF9fcmhzLl9NX3JlZmNvdW50KTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCWJvb2wKKwlvd25lcl9iZWZvcmUoY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3JocykgY29uc3QKKwl7IHJldHVybiBfTV9yZWZjb3VudC5fTV9sZXNzKF9fcmhzLl9NX3JlZmNvdW50KTsgfQorCisgICAgICB2b2lkCisgICAgICByZXNldCgpIG5vZXhjZXB0CisgICAgICB7IF9fd2Vha19wdHIoKS5zd2FwKCp0aGlzKTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKF9fd2Vha19wdHImIF9fcykgbm9leGNlcHQKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fcHRyLCBfX3MuX01fcHRyKTsKKwlfTV9yZWZjb3VudC5fTV9zd2FwKF9fcy5fTV9yZWZjb3VudCk7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gVXNlZCBieSBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzLgorICAgICAgdm9pZAorICAgICAgX01fYXNzaWduKF9UcCogX19wdHIsIGNvbnN0IF9fc2hhcmVkX2NvdW50PF9McD4mIF9fcmVmY291bnQpIG5vZXhjZXB0CisgICAgICB7CisJX01fcHRyID0gX19wdHI7CisJX01fcmVmY291bnQgPSBfX3JlZmNvdW50OworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwMT4gZnJpZW5kIGNsYXNzIF9fc2hhcmVkX3B0cjsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHAxPiBmcmllbmQgY2xhc3MgX193ZWFrX3B0cjsKKyAgICAgIGZyaWVuZCBjbGFzcyBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzPF9UcCwgX0xwPjsKKyAgICAgIGZyaWVuZCBjbGFzcyBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczxfVHA+OworCisgICAgICBfVHAqCSAJIF9NX3B0cjsgICAgICAgICAvLyBDb250YWluZWQgcG9pbnRlci4KKyAgICAgIF9fd2Vha19jb3VudDxfTHA+ICBfTV9yZWZjb3VudDsgICAgLy8gUmVmZXJlbmNlIGNvdW50ZXIuCisgICAgfTsKKworICAvLyAyMC43LjIuMy42IHdlYWtfcHRyIHNwZWNpYWxpemVkIGFsZ29yaXRobXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoX193ZWFrX3B0cjxfVHAsIF9McD4mIF9fYSwgX193ZWFrX3B0cjxfVHAsIF9McD4mIF9fYikgbm9leGNlcHQKKyAgICB7IF9fYS5zd2FwKF9fYik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDE+CisgICAgc3RydWN0IF9TcF9vd25lcl9sZXNzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4KKyAgICB7CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX19saHMsIGNvbnN0IF9UcCYgX19yaHMpIGNvbnN0CisgICAgICB7IHJldHVybiBfX2xocy5vd25lcl9iZWZvcmUoX19yaHMpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX2xocywgY29uc3QgX1RwMSYgX19yaHMpIGNvbnN0CisgICAgICB7IHJldHVybiBfX2xocy5vd25lcl9iZWZvcmUoX19yaHMpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwMSYgX19saHMsIGNvbnN0IF9UcCYgX19yaHMpIGNvbnN0CisgICAgICB7IHJldHVybiBfX2xocy5vd25lcl9iZWZvcmUoX19yaHMpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgc3RydWN0IG93bmVyX2xlc3M8X19zaGFyZWRfcHRyPF9UcCwgX0xwPj4KKyAgICA6IHB1YmxpYyBfU3Bfb3duZXJfbGVzczxfX3NoYXJlZF9wdHI8X1RwLCBfTHA+LCBfX3dlYWtfcHRyPF9UcCwgX0xwPj4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIHN0cnVjdCBvd25lcl9sZXNzPF9fd2Vha19wdHI8X1RwLCBfTHA+PgorICAgIDogcHVibGljIF9TcF9vd25lcl9sZXNzPF9fd2Vha19wdHI8X1RwLCBfTHA+LCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+PgorICAgIHsgfTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIGNvbnN0ZXhwciBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzKCkgbm9leGNlcHQgeyB9CisKKyAgICAgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoY29uc3QgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYpIG5vZXhjZXB0IHsgfQorCisgICAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgfl9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4KKyAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKQorICAgICAgeyByZXR1cm4gX19zaGFyZWRfcHRyPF9UcCwgX0xwPih0aGlzLT5fTV93ZWFrX3RoaXMpOyB9CisKKyAgICAgIF9fc2hhcmVkX3B0cjxjb25zdCBfVHAsIF9McD4KKyAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSBjb25zdAorICAgICAgeyByZXR1cm4gX19zaGFyZWRfcHRyPGNvbnN0IF9UcCwgX0xwPih0aGlzLT5fTV93ZWFrX3RoaXMpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwl2b2lkCisJX01fd2Vha19hc3NpZ24oX1RwMSogX19wLCBjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX24pIGNvbnN0IG5vZXhjZXB0CisJeyBfTV93ZWFrX3RoaXMuX01fYXNzaWduKF9fcCwgX19uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCWZyaWVuZCB2b2lkCisJX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoY29uc3QgX19zaGFyZWRfY291bnQ8X0xwPiYgX19wbiwKKwkJCQkJIGNvbnN0IF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMqIF9fcGUsCisJCQkJCSBjb25zdCBfVHAxKiBfX3B4KSBub2V4Y2VwdAorCXsKKwkgIGlmIChfX3BlICE9IDApCisJICAgIF9fcGUtPl9NX3dlYWtfYXNzaWduKGNvbnN0X2Nhc3Q8X1RwMSo+KF9fcHgpLCBfX3BuKTsKKwl9CisKKyAgICAgIG11dGFibGUgX193ZWFrX3B0cjxfVHAsIF9McD4gIF9NX3dlYWtfdGhpczsKKyAgICB9OworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZSBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+CisgICAgX19hbGxvY2F0ZV9zaGFyZWQoY29uc3QgX0FsbG9jJiBfX2EsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHJldHVybiBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+KF9TcF9tYWtlX3NoYXJlZF90YWcoKSwgX19hLAorCQkJCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZSBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+CisgICAgX19tYWtlX3NoYXJlZChfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PF9UcD46OnR5cGUgX1RwX25jOworICAgICAgcmV0dXJuIHN0ZDo6X19hbGxvY2F0ZV9zaGFyZWQ8X1RwLCBfTHA+KHN0ZDo6YWxsb2NhdG9yPF9UcF9uYz4oKSwKKwkJCQkJICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgX19zaGFyZWRfcHRyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgc3RydWN0IGhhc2g8X19zaGFyZWRfcHRyPF9UcCwgX0xwPj4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fcykgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6aGFzaDxfVHAqPigpKF9fcy5nZXQoKSk7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBfU0hBUkVEX1BUUl9CQVNFX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zbGljZV9hcnJheS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3NsaWNlX2FycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0ZDBmZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zbGljZV9hcnJheS5oCkBAIC0wLDAgKzEsMjc0IEBACisvLyBUaGUgdGVtcGxhdGUgYW5kIGlubGluZXMgZm9yIHRoZSAtKi0gQysrIC0qLSBzbGljZV9hcnJheSBjbGFzcy4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvc2xpY2VfYXJyYXkuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3ZhbGFycmF5fQorICovCisKKy8vIFdyaXR0ZW4gYnkgR2FicmllbCBEb3MgUmVpcyA8R2FicmllbC5Eb3MtUmVpc0BEUFRNYXRocy5FTlMtQ2FjaGFuLkZyPgorCisjaWZuZGVmIF9TTElDRV9BUlJBWV9ICisjZGVmaW5lIF9TTElDRV9BUlJBWV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIG51bWVyaWNfYXJyYXlzCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiAgQGJyaWVmICBDbGFzcyBkZWZpbmluZyBvbmUtZGltZW5zaW9uYWwgc3Vic2V0IG9mIGFuIGFycmF5LgorICAgKgorICAgKiAgVGhlIHNsaWNlIGNsYXNzIHJlcHJlc2VudHMgYSBvbmUtZGltZW5zaW9uYWwgc3Vic2V0IG9mIGFuIGFycmF5LAorICAgKiAgc3BlY2lmaWVkIGJ5IHRocmVlIHBhcmFtZXRlcnM6IHN0YXJ0IG9mZnNldCwgc2l6ZSwgYW5kIHN0cmlkZS4gIFRoZQorICAgKiAgc3RhcnQgb2Zmc2V0IGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgdGhhdCBpcyBwYXJ0CisgICAqICBvZiB0aGUgc3Vic2V0LiAgVGhlIHNpemUgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc3Vic2V0LgorICAgKiAgU3RyaWRlIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGVhY2ggc3VjY2Vzc2l2ZSBhcnJheSBlbGVtZW50IHRvIGluY2x1ZGUKKyAgICogIGluIHRoZSBzdWJzZXQuCisgICAqCisgICAqICBGb3IgZXhhbXBsZSwgd2l0aCBhbiBhcnJheSBvZiBzaXplIDEwLCBhbmQgYSBzbGljZSB3aXRoIG9mZnNldCAxLCBzaXplIDMKKyAgICogIGFuZCBzdHJpZGUgMiwgdGhlIHN1YnNldCBjb25zaXN0cyBvZiBhcnJheSBlbGVtZW50cyAxLCAzLCBhbmQgNS4KKyAgICovCisgIGNsYXNzIHNsaWNlCisgIHsKKyAgcHVibGljOgorICAgIC8vLyAgQ29uc3RydWN0IGFuIGVtcHR5IHNsaWNlLgorICAgIHNsaWNlKCk7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYSBzbGljZS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIF9fbyAgT2Zmc2V0IGluIGFycmF5IG9mIGZpcnN0IGVsZW1lbnQuCisgICAgICogIEBwYXJhbSAgX19kICBOdW1iZXIgb2YgZWxlbWVudHMgaW4gc2xpY2UuCisgICAgICogIEBwYXJhbSAgX19zICBTdHJpZGUgYmV0d2VlbiBhcnJheSBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBzbGljZShzaXplX3QgX19vLCBzaXplX3QgX19kLCBzaXplX3QgX19zKTsKKworICAgIC8vLyAgUmV0dXJuIGFycmF5IG9mZnNldCBvZiBmaXJzdCBzbGljZSBlbGVtZW50LgorICAgIHNpemVfdCBzdGFydCgpIGNvbnN0OworICAgIC8vLyAgUmV0dXJuIHNpemUgb2Ygc2xpY2UuCisgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKKyAgICAvLy8gIFJldHVybiBhcnJheSBzdHJpZGUgb2Ygc2xpY2UuCisgICAgc2l6ZV90IHN0cmlkZSgpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgc2l6ZV90IF9NX29mZjsgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgc2l6ZV90IF9NX3N6OwkJCS8vIHNpemUKKyAgICBzaXplX3QgX01fc3Q7CQkJLy8gc3RyaWRlIHVuaXQKKyAgfTsKKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIDU0My4gdmFsYXJyYXkgc2xpY2UgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmxpbmUKKyAgc2xpY2U6OnNsaWNlKCkgCisgIDogX01fb2ZmKDApLCBfTV9zeigwKSwgX01fc3QoMCkge30KKworICBpbmxpbmUKKyAgc2xpY2U6OnNsaWNlKHNpemVfdCBfX28sIHNpemVfdCBfX2QsIHNpemVfdCBfX3MpCisgIDogX01fb2ZmKF9fbyksIF9NX3N6KF9fZCksIF9NX3N0KF9fcykge30KKworICBpbmxpbmUgc2l6ZV90CisgIHNsaWNlOjpzdGFydCgpIGNvbnN0CisgIHsgcmV0dXJuIF9NX29mZjsgfQorCisgIGlubGluZSBzaXplX3QKKyAgc2xpY2U6OnNpemUoKSBjb25zdAorICB7IHJldHVybiBfTV9zejsgfQorCisgIGlubGluZSBzaXplX3QKKyAgc2xpY2U6OnN0cmlkZSgpIGNvbnN0CisgIHsgcmV0dXJuIF9NX3N0OyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJlZmVyZW5jZSB0byBvbmUtZGltZW5zaW9uYWwgc3Vic2V0IG9mIGFuIGFycmF5LgorICAgKgorICAgKiAgQSBzbGljZV9hcnJheSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgYWN0dWFsIGVsZW1lbnRzIG9mIGFuIGFycmF5CisgICAqICBzcGVjaWZpZWQgYnkgYSBzbGljZS4gIFRoZSB3YXkgdG8gZ2V0IGEgc2xpY2VfYXJyYXkgaXMgdG8gY2FsbAorICAgKiAgb3BlcmF0b3JbXShzbGljZSkgb24gYSB2YWxhcnJheS4gIFRoZSByZXR1cm5lZCBzbGljZV9hcnJheSB0aGVuIHBlcm1pdHMKKyAgICogIGNhcnJ5aW5nIG9wZXJhdGlvbnMgb3V0IG9uIHRoZSByZWZlcmVuY2VkIHN1YnNldCBvZiBlbGVtZW50cyBpbiB0aGUKKyAgICogIG9yaWdpbmFsIHZhbGFycmF5LiAgRm9yIGV4YW1wbGUsIG9wZXJhdG9yKz0odmFsYXJyYXkpIHdpbGwgYWRkIHZhbHVlcworICAgKiAgdG8gdGhlIHN1YnNldCBvZiBlbGVtZW50cyBpbiB0aGUgdW5kZXJseWluZyB2YWxhcnJheSB0aGlzIHNsaWNlX2FycmF5CisgICAqICByZWZlcnMgdG8uCisgICAqCisgICAqICBAcGFyYW0gIFRwICBFbGVtZW50IHR5cGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3Mgc2xpY2VfYXJyYXkKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjUzLiB2YWxhcnJheSBoZWxwZXIgZnVuY3Rpb25zIGFyZSBhbG1vc3QgZW50aXJlbHkgdXNlbGVzcworCisgICAgICAvLy8gIENvcHkgY29uc3RydWN0b3IuICBCb3RoIHNsaWNlcyByZWZlciB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIGFycmF5LgorICAgICAgc2xpY2VfYXJyYXkoY29uc3Qgc2xpY2VfYXJyYXkmKTsKKworICAgICAgLy8vICBBc3NpZ25tZW50IG9wZXJhdG9yLiAgQXNzaWducyBzbGljZSBlbGVtZW50cyB0byBjb3JyZXNwb25kaW5nCisgICAgICAvLy8gIGVsZW1lbnRzIG9mIEBhIGEuCisgICAgICBzbGljZV9hcnJheSYgb3BlcmF0b3I9KGNvbnN0IHNsaWNlX2FycmF5Jik7CisKKyAgICAgIC8vLyAgQXNzaWduIHNsaWNlIGVsZW1lbnRzIHRvIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTXVsdGlwbHkgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcio9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgRGl2aWRlIHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3IvPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIE1vZHVsbyBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yJT0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBBZGQgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IHRvIHNsaWNlIGVsZW1lbnRzLgorICAgICAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgU3VidHJhY3QgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IGZyb20gc2xpY2UgZWxlbWVudHMuCisgICAgICB2b2lkIG9wZXJhdG9yLT0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMb2dpY2FsIHhvciBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3JePShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExvZ2ljYWwgYW5kIHNsaWNlIGVsZW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvciY9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTG9naWNhbCBvciBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3J8PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExlZnQgc2hpZnQgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIFJpZ2h0IHNoaWZ0IHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBBc3NpZ24gYWxsIHNsaWNlIGVsZW1lbnRzIHRvIEBhIHQuCisgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBfVHAgJikgY29uc3Q7CisgICAgICAvLyAgICAgICAgfnNsaWNlX2FycmF5ICgpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZvaWQgb3BlcmF0b3IqPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZvaWQgb3BlcmF0b3IvPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZvaWQgb3BlcmF0b3IlPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZvaWQgb3BlcmF0b3IrPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZvaWQgb3BlcmF0b3ItPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZvaWQgb3BlcmF0b3JePShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZvaWQgb3BlcmF0b3ImPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZvaWQgb3BlcmF0b3J8PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZvaWQgb3BlcmF0b3I8PD0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yPj49KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICBmcmllbmQgY2xhc3MgdmFsYXJyYXk8X1RwPjsKKyAgICAgIHNsaWNlX2FycmF5KF9BcnJheTxfVHA+LCBjb25zdCBzbGljZSYpOworCisgICAgICBjb25zdCBzaXplX3QgICAgICBfTV9zejsKKyAgICAgIGNvbnN0IHNpemVfdCAgICAgIF9NX3N0cmlkZTsKKyAgICAgIGNvbnN0IF9BcnJheTxfVHA+IF9NX2FycmF5OworCisgICAgICAvLyBub3QgaW1wbGVtZW50ZWQKKyAgICAgIHNsaWNlX2FycmF5KCk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lCisgICAgc2xpY2VfYXJyYXk8X1RwPjo6c2xpY2VfYXJyYXkoX0FycmF5PF9UcD4gX19hLCBjb25zdCBzbGljZSYgX19zKQorICAgIDogX01fc3ooX19zLnNpemUoKSksIF9NX3N0cmlkZShfX3Muc3RyaWRlKCkpLAorICAgICAgX01fYXJyYXkoX19hLmJlZ2luKCkgKyBfX3Muc3RhcnQoKSkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lCisgICAgc2xpY2VfYXJyYXk8X1RwPjo6c2xpY2VfYXJyYXkoY29uc3Qgc2xpY2VfYXJyYXk8X1RwPiYgYSkKKyAgICA6IF9NX3N6KGEuX01fc3opLCBfTV9zdHJpZGUoYS5fTV9zdHJpZGUpLCBfTV9hcnJheShhLl9NX2FycmF5KSB7fQorCisgIC8vICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgLy8gICAgaW5saW5lIHNsaWNlX2FycmF5PF9UcD46On5zbGljZV9hcnJheSAoKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc2xpY2VfYXJyYXk8X1RwPiYKKyAgICBzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3Qgc2xpY2VfYXJyYXk8X1RwPiYgX19hKQorICAgIHsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9jb3B5KF9fYS5fTV9hcnJheSwgX19hLl9NX3N6LCBfX2EuX01fc3RyaWRlLAorCQkJICAgX01fYXJyYXksIF9NX3N0cmlkZSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHNsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICB7IHN0ZDo6X192YWxhcnJheV9maWxsKF9NX2FycmF5LCBfTV9zeiwgX01fc3RyaWRlLCBfX3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikgY29uc3QKKyAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+KF9fdiksIF9NX2FycmF5LCBfTV9zeiwgX01fc3RyaWRlKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHNsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBfRXhwcjxfRG9tLF9UcD4mIF9fZSkgY29uc3QKKyAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5KF9fZSwgX01fc3osIF9NX2FycmF5LCBfTV9zdHJpZGUpOyB9CisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SCisjZGVmaW5lIF9ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoX09wLF9OYW1lKQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCQkJCQlcCisgICAgaW5saW5lIHZvaWQJCQkJCQkJCVwKKyAgICBzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvciBfT3AjIz0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KSBjb25zdAlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfTV9hcnJheSwgX01fc3osIF9NX3N0cmlkZSwgX0FycmF5PF9UcD4oX192KSk7XAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4JCQkJICAgICAgICAgICAgICAgIFwKKyAgICAgIGlubGluZSB2b2lkCQkJCQkJCVwKKyAgICAgIHNsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yIF9PcCMjPShjb25zdCBfRXhwcjxfRG9tLF9UcD4mIF9fZSkgY29uc3RcCisgICAgICB7CQkJCQkJCQkJXAorCSAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9NX2FycmF5LCBfTV9zdHJpZGUsIF9fZSwgX01fc3opOwlcCisgICAgICB9CisKKworX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigqLCBfX211bHRpcGxpZXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKC8sIF9fZGl2aWRlcykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoJSwgX19tb2R1bHVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigrLCBfX3BsdXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKC0sIF9fbWludXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKF4sIF9fYml0d2lzZV94b3IpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCYsIF9fYml0d2lzZV9hbmQpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKHwsIF9fYml0d2lzZV9vcikKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoPDwsIF9fc2hpZnRfbGVmdCkKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoPj4sIF9fc2hpZnRfcmlnaHQpCisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SCisKKyAgLy8gQH0gZ3JvdXAgbnVtZXJpY19hcnJheXMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1NMSUNFX0FSUkFZX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zc3RyZWFtLnRjYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zc3RyZWFtLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODNiNGZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3NzdHJlYW0udGNjCkBAIC0wLDAgKzEsMjg4IEBACisvLyBTdHJpbmcgYmFzZWQgc3RyZWFtcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9zc3RyZWFtLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3NzdHJlYW19CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjcgIFN0cmluZy1iYXNlZCBzdHJlYW1zCisvLworCisjaWZuZGVmIF9TU1RSRUFNX1RDQworI2RlZmluZSBfU1NUUkVBTV9UQ0MgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6aW50X3R5cGUKKyAgICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBwYmFja2ZhaWwoaW50X3R5cGUgX19jKQorICAgIHsKKyAgICAgIGludF90eXBlIF9fcmV0ID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgaWYgKHRoaXMtPmViYWNrKCkgPCB0aGlzLT5ncHRyKCkpCisJeworCSAgLy8gVHJ5IHRvIHB1dCBiYWNrIF9fYyBpbnRvIGlucHV0IHNlcXVlbmNlIGluIG9uZSBvZiB0aHJlZSB3YXlzLgorCSAgLy8gT3JkZXIgdGhlc2UgdGVzdHMgZG9uZSBpbiBpcyB1bnNwZWNpZmllZCBieSB0aGUgc3RhbmRhcmQuCisJICBjb25zdCBib29sIF9fdGVzdGVvZiA9IHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fcmV0KTsKKwkgIGlmICghX190ZXN0ZW9mKQorCSAgICB7CisJICAgICAgY29uc3QgYm9vbCBfX3Rlc3RlcSA9IHRyYWl0c190eXBlOjplcSh0cmFpdHNfdHlwZTo6CisJCQkJCQkgICAgdG9fY2hhcl90eXBlKF9fYyksCisJCQkJCQkgICAgdGhpcy0+Z3B0cigpWy0xXSk7CSAgCisJICAgICAgY29uc3QgYm9vbCBfX3Rlc3RvdXQgPSB0aGlzLT5fTV9tb2RlICYgaW9zX2Jhc2U6Om91dDsKKwkgICAgICBpZiAoX190ZXN0ZXEgfHwgX190ZXN0b3V0KQorCQl7CisJCSAgdGhpcy0+Z2J1bXAoLTEpOworCQkgIGlmICghX190ZXN0ZXEpCisJCSAgICAqdGhpcy0+Z3B0cigpID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgIF9fcmV0ID0gX19jOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHRoaXMtPmdidW1wKC0xKTsKKwkgICAgICBfX3JldCA9IHRyYWl0c190eXBlOjpub3RfZW9mKF9fYyk7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjppbnRfdHlwZQorICAgIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIG92ZXJmbG93KGludF90eXBlIF9fYykKKyAgICB7CisgICAgICBjb25zdCBib29sIF9fdGVzdG91dCA9IHRoaXMtPl9NX21vZGUgJiBpb3NfYmFzZTo6b3V0OworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoIV9fdGVzdG91dCwgZmFsc2UpKQorCXJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0ZW9mID0gdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgdHJhaXRzX3R5cGU6OmVvZigpKTsKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KF9fdGVzdGVvZiwgZmFsc2UpKQorCXJldHVybiB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOworCisgICAgICBjb25zdCBfX3NpemVfdHlwZSBfX2NhcGFjaXR5ID0gX01fc3RyaW5nLmNhcGFjaXR5KCk7CisgICAgICBjb25zdCBfX3NpemVfdHlwZSBfX21heF9zaXplID0gX01fc3RyaW5nLm1heF9zaXplKCk7CisgICAgICBjb25zdCBib29sIF9fdGVzdHB1dCA9IHRoaXMtPnBwdHIoKSA8IHRoaXMtPmVwcHRyKCk7CisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCghX190ZXN0cHV0ICYmIF9fY2FwYWNpdHkgPT0gX19tYXhfc2l6ZSwgZmFsc2UpKQorCXJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisKKyAgICAgIC8vIFRyeSB0byBhcHBlbmQgX19jIGludG8gb3V0cHV0IHNlcXVlbmNlIGluIG9uZSBvZiB0d28gd2F5cy4KKyAgICAgIC8vIE9yZGVyIHRoZXNlIHRlc3RzIGRvbmUgaW4gaXMgdW5zcGVjaWZpZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgY29uc3QgY2hhcl90eXBlIF9fY29udiA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKyAgICAgIGlmICghX190ZXN0cHV0KQorCXsKKwkgIC8vIE5COiBTdGFydCBvc3RyaW5nc3RyZWFtIGJ1ZmZlcnMgYXQgNTEyIGNoYXJzLiAgVGhpcyBpcyBhbgorCSAgLy8gZXhwZXJpbWVudGFsIHZhbHVlIChwcm9ub3VuY2VkICJhcmJpdHJhcnkiIGluIHNvbWUgb2YgdGhlCisJICAvLyBoaXBwZXIgRW5nbGlzaC1zcGVha2luZyBjb3VudHJpZXMpLCBhbmQgY2FuIGJlIGNoYW5nZWQgdG8KKwkgIC8vIHN1aXQgcGFydGljdWxhciBuZWVkcy4KKwkgIC8vCisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyAxNjkuIEJhZCBlZmZpY2llbmN5IG9mIG92ZXJmbG93KCkgbWFuZGF0ZWQKKwkgIC8vIDQzMi4gc3RyaW5nYnVmOjpvdmVyZmxvdygpIG1ha2VzIG9ubHkgb25lIHdyaXRlIHBvc2l0aW9uCisJICAvLyAgICAgIGF2YWlsYWJsZQorCSAgY29uc3QgX19zaXplX3R5cGUgX19vcHRfbGVuID0gc3RkOjptYXgoX19zaXplX3R5cGUoMiAqIF9fY2FwYWNpdHkpLAorCQkJCQkJIF9fc2l6ZV90eXBlKDUxMikpOworCSAgY29uc3QgX19zaXplX3R5cGUgX19sZW4gPSBzdGQ6Om1pbihfX29wdF9sZW4sIF9fbWF4X3NpemUpOworCSAgX19zdHJpbmdfdHlwZSBfX3RtcDsKKwkgIF9fdG1wLnJlc2VydmUoX19sZW4pOworCSAgaWYgKHRoaXMtPnBiYXNlKCkpCisJICAgIF9fdG1wLmFzc2lnbih0aGlzLT5wYmFzZSgpLCB0aGlzLT5lcHB0cigpIC0gdGhpcy0+cGJhc2UoKSk7CisJICBfX3RtcC5wdXNoX2JhY2soX19jb252KTsKKwkgIF9NX3N0cmluZy5zd2FwKF9fdG1wKTsKKwkgIF9NX3N5bmMoY29uc3RfY2FzdDxjaGFyX3R5cGUqPihfTV9zdHJpbmcuZGF0YSgpKSwKKwkJICB0aGlzLT5ncHRyKCkgLSB0aGlzLT5lYmFjaygpLCB0aGlzLT5wcHRyKCkgLSB0aGlzLT5wYmFzZSgpKTsKKwl9CisgICAgICBlbHNlCisJKnRoaXMtPnBwdHIoKSA9IF9fY29udjsKKyAgICAgIHRoaXMtPnBidW1wKDEpOworICAgICAgcmV0dXJuIF9fYzsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OmludF90eXBlCisgICAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgdW5kZXJmbG93KCkKKyAgICB7CisgICAgICBpbnRfdHlwZSBfX3JldCA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0aW4gPSB0aGlzLT5fTV9tb2RlICYgaW9zX2Jhc2U6OmluOworICAgICAgaWYgKF9fdGVzdGluKQorCXsKKwkgIC8vIFVwZGF0ZSBlZ3B0cigpIHRvIG1hdGNoIHRoZSBhY3R1YWwgc3RyaW5nIGVuZC4KKwkgIF9NX3VwZGF0ZV9lZ3B0cigpOworCisJICBpZiAodGhpcy0+Z3B0cigpIDwgdGhpcy0+ZWdwdHIoKSkKKwkgICAgX19yZXQgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKnRoaXMtPmdwdHIoKSk7CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6cG9zX3R5cGUKKyAgICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBzZWVrb2ZmKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX3dheSwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKKyAgICB7CisgICAgICBwb3NfdHlwZSBfX3JldCA9ICBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOworICAgICAgYm9vbCBfX3Rlc3RpbiA9IChpb3NfYmFzZTo6aW4gJiB0aGlzLT5fTV9tb2RlICYgX19tb2RlKSAhPSAwOworICAgICAgYm9vbCBfX3Rlc3RvdXQgPSAoaW9zX2Jhc2U6Om91dCAmIHRoaXMtPl9NX21vZGUgJiBfX21vZGUpICE9IDA7CisgICAgICBjb25zdCBib29sIF9fdGVzdGJvdGggPSBfX3Rlc3RpbiAmJiBfX3Rlc3RvdXQgJiYgX193YXkgIT0gaW9zX2Jhc2U6OmN1cjsKKyAgICAgIF9fdGVzdGluICY9ICEoX19tb2RlICYgaW9zX2Jhc2U6Om91dCk7CisgICAgICBfX3Rlc3RvdXQgJj0gIShfX21vZGUgJiBpb3NfYmFzZTo6aW4pOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0NTMuIGJhc2ljX3N0cmluZ2J1Zjo6c2Vla29mZiBuZWVkIG5vdCBhbHdheXMgZmFpbCBmb3IgYW4gZW1wdHkgc3RyZWFtLgorICAgICAgY29uc3QgY2hhcl90eXBlKiBfX2JlZyA9IF9fdGVzdGluID8gdGhpcy0+ZWJhY2soKSA6IHRoaXMtPnBiYXNlKCk7CisgICAgICBpZiAoKF9fYmVnIHx8ICFfX29mZikgJiYgKF9fdGVzdGluIHx8IF9fdGVzdG91dCB8fCBfX3Rlc3Rib3RoKSkKKwl7CisJICBfTV91cGRhdGVfZWdwdHIoKTsKKworCSAgb2ZmX3R5cGUgX19uZXdvZmZpID0gX19vZmY7CisJICBvZmZfdHlwZSBfX25ld29mZm8gPSBfX25ld29mZmk7CisJICBpZiAoX193YXkgPT0gaW9zX2Jhc2U6OmN1cikKKwkgICAgeworCSAgICAgIF9fbmV3b2ZmaSArPSB0aGlzLT5ncHRyKCkgLSBfX2JlZzsKKwkgICAgICBfX25ld29mZm8gKz0gdGhpcy0+cHB0cigpIC0gX19iZWc7CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fd2F5ID09IGlvc19iYXNlOjplbmQpCisJICAgIF9fbmV3b2ZmbyA9IF9fbmV3b2ZmaSArPSB0aGlzLT5lZ3B0cigpIC0gX19iZWc7CisKKwkgIGlmICgoX190ZXN0aW4gfHwgX190ZXN0Ym90aCkKKwkgICAgICAmJiBfX25ld29mZmkgPj0gMAorCSAgICAgICYmIHRoaXMtPmVncHRyKCkgLSBfX2JlZyA+PSBfX25ld29mZmkpCisJICAgIHsKKwkgICAgICB0aGlzLT5zZXRnKHRoaXMtPmViYWNrKCksIHRoaXMtPmViYWNrKCkgKyBfX25ld29mZmksCisJCQkgdGhpcy0+ZWdwdHIoKSk7CisJICAgICAgX19yZXQgPSBwb3NfdHlwZShfX25ld29mZmkpOworCSAgICB9CisJICBpZiAoKF9fdGVzdG91dCB8fCBfX3Rlc3Rib3RoKQorCSAgICAgICYmIF9fbmV3b2ZmbyA+PSAwCisJICAgICAgJiYgdGhpcy0+ZWdwdHIoKSAtIF9fYmVnID49IF9fbmV3b2ZmbykKKwkgICAgeworCSAgICAgIF9NX3BidW1wKHRoaXMtPnBiYXNlKCksIHRoaXMtPmVwcHRyKCksIF9fbmV3b2Zmbyk7CisJICAgICAgX19yZXQgPSBwb3NfdHlwZShfX25ld29mZm8pOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6cG9zX3R5cGUKKyAgICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBzZWVrcG9zKHBvc190eXBlIF9fc3AsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgeworICAgICAgcG9zX3R5cGUgX19yZXQgPSAgcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0aW4gPSAoaW9zX2Jhc2U6OmluICYgdGhpcy0+X01fbW9kZSAmIF9fbW9kZSkgIT0gMDsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0b3V0ID0gKGlvc19iYXNlOjpvdXQgJiB0aGlzLT5fTV9tb2RlICYgX19tb2RlKSAhPSAwOworCisgICAgICBjb25zdCBjaGFyX3R5cGUqIF9fYmVnID0gX190ZXN0aW4gPyB0aGlzLT5lYmFjaygpIDogdGhpcy0+cGJhc2UoKTsKKyAgICAgIGlmICgoX19iZWcgfHwgIW9mZl90eXBlKF9fc3ApKSAmJiAoX190ZXN0aW4gfHwgX190ZXN0b3V0KSkKKwl7CisJICBfTV91cGRhdGVfZWdwdHIoKTsKKworCSAgY29uc3Qgb2ZmX3R5cGUgX19wb3MoX19zcCk7CisJICBjb25zdCBib29sIF9fdGVzdHBvcyA9ICgwIDw9IF9fcG9zCisJCQkJICAmJiBfX3BvcyA8PSB0aGlzLT5lZ3B0cigpIC0gX19iZWcpOworCSAgaWYgKF9fdGVzdHBvcykKKwkgICAgeworCSAgICAgIGlmIChfX3Rlc3RpbikKKwkJdGhpcy0+c2V0Zyh0aGlzLT5lYmFjaygpLCB0aGlzLT5lYmFjaygpICsgX19wb3MsCisJCQkgICB0aGlzLT5lZ3B0cigpKTsKKwkgICAgICBpZiAoX190ZXN0b3V0KQorCQlfTV9wYnVtcCh0aGlzLT5wYmFzZSgpLCB0aGlzLT5lcHB0cigpLCBfX3Bvcyk7CisJICAgICAgX19yZXQgPSBfX3NwOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX3N5bmMoY2hhcl90eXBlKiBfX2Jhc2UsIF9fc2l6ZV90eXBlIF9faSwgX19zaXplX3R5cGUgX19vKQorICAgIHsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0aW4gPSBfTV9tb2RlICYgaW9zX2Jhc2U6OmluOworICAgICAgY29uc3QgYm9vbCBfX3Rlc3RvdXQgPSBfTV9tb2RlICYgaW9zX2Jhc2U6Om91dDsKKyAgICAgIGNoYXJfdHlwZSogX19lbmRnID0gX19iYXNlICsgX01fc3RyaW5nLnNpemUoKTsKKyAgICAgIGNoYXJfdHlwZSogX19lbmRwID0gX19iYXNlICsgX01fc3RyaW5nLmNhcGFjaXR5KCk7CisKKyAgICAgIGlmIChfX2Jhc2UgIT0gX01fc3RyaW5nLmRhdGEoKSkKKwl7CisJICAvLyBzZXRidWY6IF9faSA9PSBzaXplIG9mIGJ1ZmZlciBhcmVhIChfTV9zdHJpbmcuc2l6ZSgpID09IDApLgorCSAgX19lbmRnICs9IF9faTsKKwkgIF9faSA9IDA7CisJICBfX2VuZHAgPSBfX2VuZGc7CisJfQorCisgICAgICBpZiAoX190ZXN0aW4pCisJdGhpcy0+c2V0ZyhfX2Jhc2UsIF9fYmFzZSArIF9faSwgX19lbmRnKTsKKyAgICAgIGlmIChfX3Rlc3RvdXQpCisJeworCSAgX01fcGJ1bXAoX19iYXNlLCBfX2VuZHAsIF9fbyk7CisJICAvLyBlZ3B0cigpIGFsd2F5cyB0cmFja3MgdGhlIHN0cmluZyBlbmQuICBXaGVuICFfX3Rlc3RpbiwKKwkgIC8vIGZvciB0aGUgY29ycmVjdCBmdW5jdGlvbmluZyBvZiB0aGUgc3RyZWFtYnVmIGlubGluZXMKKwkgIC8vIHRoZSBvdGhlciBnZXQgYXJlYSBwb2ludGVycyBhcmUgaWRlbnRpY2FsLgorCSAgaWYgKCFfX3Rlc3RpbikKKwkgICAgdGhpcy0+c2V0ZyhfX2VuZGcsIF9fZW5kZywgX19lbmRnKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyAgICB2b2lkCisgICAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fcGJ1bXAoY2hhcl90eXBlKiBfX3BiZWcsIGNoYXJfdHlwZSogX19wZW5kLCBvZmZfdHlwZSBfX29mZikKKyAgICB7CisgICAgICB0aGlzLT5zZXRwKF9fcGJlZywgX19wZW5kKTsKKyAgICAgIHdoaWxlIChfX29mZiA+IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21heCkKKwl7CisJICB0aGlzLT5wYnVtcChfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8aW50Pjo6X19tYXgpOworCSAgX19vZmYgLT0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGludD46Ol9fbWF4OworCX0KKyAgICAgIHRoaXMtPnBidW1wKF9fb2ZmKTsKKyAgICB9CisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmdidWY8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19pc3RyaW5nc3RyZWFtPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfb3N0cmluZ3N0cmVhbTxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3N0cmluZ3N0cmVhbTxjaGFyPjsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmdidWY8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19pc3RyaW5nc3RyZWFtPHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfb3N0cmluZ3N0cmVhbTx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3N0cmluZ3N0cmVhbTx3Y2hhcl90PjsKKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9hbGdvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2FsZ28uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmE3MTMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9hbGdvLmgKQEAgLTAsMCArMSw2MzI0IEBACisvLyBBbGdvcml0aG0gaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9hbGdvLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXthbGdvcml0aG19CisgKi8KKworI2lmbmRlZiBfU1RMX0FMR09fSAorI2RlZmluZSBfU1RMX0FMR09fSCAxCisKKyNpbmNsdWRlIDxjc3RkbGliPiAgICAgICAgICAgICAvLyBmb3IgcmFuZAorI2luY2x1ZGUgPGJpdHMvYWxnb3JpdGhtZndkLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaGVhcC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3RlbXBidWYuaD4gIC8vIGZvciBfVGVtcG9yYXJ5X2J1ZmZlcgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPHJhbmRvbT4gICAgIC8vIGZvciBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+IC8vIGZvciBzdGQ6OmJpbmQKKyNlbmRpZgorCisvLyBTZWUgY29uY2VwdF9jaGVjay5oIGZvciB0aGUgX19nbGliY3h4XypfcmVxdWlyZXMgbWFjcm9zLgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8vIFN3YXBzIHRoZSBtZWRpYW4gdmFsdWUgb2YgKl9fYSwgKl9fYiBhbmQgKl9fYyB0byAqX19yZXN1bHQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX21vdmVfbWVkaWFuX3RvX2ZpcnN0KF9JdGVyYXRvciBfX3Jlc3VsdCwgX0l0ZXJhdG9yIF9fYSwKKwkJCSAgIF9JdGVyYXRvciBfX2IsIF9JdGVyYXRvciBfX2MpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorCisgICAgICBpZiAoKl9fYSA8ICpfX2IpCisJeworCSAgaWYgKCpfX2IgPCAqX19jKQorCSAgICBzdGQ6Oml0ZXJfc3dhcChfX3Jlc3VsdCwgX19iKTsKKwkgIGVsc2UgaWYgKCpfX2EgPCAqX19jKQorCSAgICBzdGQ6Oml0ZXJfc3dhcChfX3Jlc3VsdCwgX19jKTsKKwkgIGVsc2UKKwkgICAgc3RkOjppdGVyX3N3YXAoX19yZXN1bHQsIF9fYSk7CisJfQorICAgICAgZWxzZSBpZiAoKl9fYSA8ICpfX2MpCisgICAgICAJc3RkOjppdGVyX3N3YXAoX19yZXN1bHQsIF9fYSk7CisgICAgICBlbHNlIGlmICgqX19iIDwgKl9fYykKKwlzdGQ6Oml0ZXJfc3dhcChfX3Jlc3VsdCwgX19jKTsKKyAgICAgIGVsc2UKKwlzdGQ6Oml0ZXJfc3dhcChfX3Jlc3VsdCwgX19iKTsKKyAgICB9CisKKyAgLy8vIFN3YXBzIHRoZSBtZWRpYW4gdmFsdWUgb2YgKl9fYSwgKl9fYiBhbmQgKl9fYyB1bmRlciBfX2NvbXAgdG8gKl9fcmVzdWx0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fbW92ZV9tZWRpYW5fdG9fZmlyc3QoX0l0ZXJhdG9yIF9fcmVzdWx0LCBfSXRlcmF0b3IgX19hLAorCQkJICAgX0l0ZXJhdG9yIF9fYiwgX0l0ZXJhdG9yIF9fYywKKwkJCSAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlGdW5jdGlvbkNvbmNlcHQ8X0NvbXBhcmUsIGJvb2wsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisKKyAgICAgIGlmIChfX2NvbXAoKl9fYSwgKl9fYikpCisJeworCSAgaWYgKF9fY29tcCgqX19iLCAqX19jKSkKKwkgICAgc3RkOjppdGVyX3N3YXAoX19yZXN1bHQsIF9fYik7CisJICBlbHNlIGlmIChfX2NvbXAoKl9fYSwgKl9fYykpCisJICAgIHN0ZDo6aXRlcl9zd2FwKF9fcmVzdWx0LCBfX2MpOworCSAgZWxzZQorCSAgICBzdGQ6Oml0ZXJfc3dhcChfX3Jlc3VsdCwgX19hKTsKKwl9CisgICAgICBlbHNlIGlmIChfX2NvbXAoKl9fYSwgKl9fYykpCisJc3RkOjppdGVyX3N3YXAoX19yZXN1bHQsIF9fYSk7CisgICAgICBlbHNlIGlmIChfX2NvbXAoKl9fYiwgKl9fYykpCisJc3RkOjppdGVyX3N3YXAoX19yZXN1bHQsIF9fYyk7CisgICAgICBlbHNlCisJc3RkOjppdGVyX3N3YXAoX19yZXN1bHQsIF9fYik7CisgICAgfQorCisgIC8vIGZvcl9lYWNoCisKKyAgLy8vIFRoaXMgaXMgYW4gb3ZlcmxvYWQgdXNlZCBieSBmaW5kKCkgZm9yIHRoZSBJbnB1dCBJdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfSW5wdXRJdGVyYXRvcgorICAgIF9fZmluZChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgY29uc3QgX1RwJiBfX3ZhbCwgaW5wdXRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhKCpfX2ZpcnN0ID09IF9fdmFsKSkKKwkrK19fZmlyc3Q7CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYW4gb3ZlcmxvYWQgdXNlZCBieSBmaW5kX2lmKCkgZm9yIHRoZSBJbnB1dCBJdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0lucHV0SXRlcmF0b3IKKyAgICBfX2ZpbmRfaWYoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBpbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICFib29sKF9fcHJlZCgqX19maXJzdCkpKQorCSsrX19maXJzdDsKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAvLy8gVGhpcyBpcyBhbiBvdmVybG9hZCB1c2VkIGJ5IGZpbmQoKSBmb3IgdGhlIFJBSSBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBfX2ZpbmQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgY29uc3QgX1RwJiBfX3ZhbCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9fdHJpcF9jb3VudCA9IChfX2xhc3QgLSBfX2ZpcnN0KSA+PiAyOworCisgICAgICBmb3IgKDsgX190cmlwX2NvdW50ID4gMDsgLS1fX3RyaXBfY291bnQpCisJeworCSAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKworCSAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKworCSAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKworCSAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKwl9CisKKyAgICAgIHN3aXRjaCAoX19sYXN0IC0gX19maXJzdCkKKwl7CisJY2FzZSAzOgorCSAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKwljYXNlIDI6CisJICBpZiAoKl9fZmlyc3QgPT0gX192YWwpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCWNhc2UgMToKKwkgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJICByZXR1cm4gX19sYXN0OworCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYW4gb3ZlcmxvYWQgdXNlZCBieSBmaW5kX2lmKCkgZm9yIHRoZSBSQUkgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorICAgIF9fZmluZF9pZihfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9fdHJpcF9jb3VudCA9IChfX2xhc3QgLSBfX2ZpcnN0KSA+PiAyOworCisgICAgICBmb3IgKDsgX190cmlwX2NvdW50ID4gMDsgLS1fX3RyaXBfY291bnQpCisJeworCSAgaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCisJICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisKKwkgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKworCSAgaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCX0KKworICAgICAgc3dpdGNoIChfX2xhc3QgLSBfX2ZpcnN0KQorCXsKKwljYXNlIDM6CisJICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJY2FzZSAyOgorCSAgaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCWNhc2UgMToKKwkgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkgIHJldHVybiBfX2xhc3Q7CisJfQorICAgIH0KKworICAvLy8gVGhpcyBpcyBhbiBvdmVybG9hZCB1c2VkIGJ5IGZpbmRfaWZfbm90KCkgZm9yIHRoZSBJbnB1dCBJdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0lucHV0SXRlcmF0b3IKKyAgICBfX2ZpbmRfaWZfbm90KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICBfUHJlZGljYXRlIF9fcHJlZCwgaW5wdXRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiBib29sKF9fcHJlZCgqX19maXJzdCkpKQorCSsrX19maXJzdDsKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAvLy8gVGhpcyBpcyBhbiBvdmVybG9hZCB1c2VkIGJ5IGZpbmRfaWZfbm90KCkgZm9yIHRoZSBSQUkgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorICAgIF9fZmluZF9pZl9ub3QoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJCSAgX1ByZWRpY2F0ZSBfX3ByZWQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfX3RyaXBfY291bnQgPSAoX19sYXN0IC0gX19maXJzdCkgPj4gMjsKKworICAgICAgZm9yICg7IF9fdHJpcF9jb3VudCA+IDA7IC0tX190cmlwX2NvdW50KQorCXsKKwkgIGlmICghYm9vbChfX3ByZWQoKl9fZmlyc3QpKSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisKKwkgIGlmICghYm9vbChfX3ByZWQoKl9fZmlyc3QpKSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisKKwkgIGlmICghYm9vbChfX3ByZWQoKl9fZmlyc3QpKSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisKKwkgIGlmICghYm9vbChfX3ByZWQoKl9fZmlyc3QpKSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJfQorCisgICAgICBzd2l0Y2ggKF9fbGFzdCAtIF9fZmlyc3QpCisJeworCWNhc2UgMzoKKwkgIGlmICghYm9vbChfX3ByZWQoKl9fZmlyc3QpKSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJY2FzZSAyOgorCSAgaWYgKCFib29sKF9fcHJlZCgqX19maXJzdCkpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKwljYXNlIDE6CisJICBpZiAoIWJvb2woX19wcmVkKCpfX2ZpcnN0KSkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCWNhc2UgMDoKKwlkZWZhdWx0OgorCSAgcmV0dXJuIF9fbGFzdDsKKwl9CisgICAgfQorCisgIC8vLyBQcm92aWRlZCBmb3Igc3RhYmxlX3BhcnRpdGlvbiB0byB1c2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfSW5wdXRJdGVyYXRvcgorICAgIF9fZmluZF9pZl9ub3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIHJldHVybiBzdGQ6Ol9fZmluZF9pZl9ub3QoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsCisJCQkJc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKyAgLy8vIExpa2UgZmluZF9pZl9ub3QoKSwgYnV0IHVzZXMgYW5kIHVwZGF0ZXMgYSBjb3VudCBvZiB0aGUKKyAgLy8vIHJlbWFpbmluZyByYW5nZSBsZW5ndGggaW5zdGVhZCBvZiBjb21wYXJpbmcgYWdhaW5zdCBhbiBlbmQKKyAgLy8vIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIF9JbnB1dEl0ZXJhdG9yCisgICAgX19maW5kX2lmX25vdF9uKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9EaXN0YW5jZSYgX19sZW4sIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIGZvciAoOyBfX2xlbjsgLS1fX2xlbiwgKytfX2ZpcnN0KQorCWlmICghYm9vbChfX3ByZWQoKl9fZmlyc3QpKSkKKwkgIGJyZWFrOworICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisgIC8vIHNldF9kaWZmZXJlbmNlCisgIC8vIHNldF9pbnRlcnNlY3Rpb24KKyAgLy8gc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlCisgIC8vIHNldF91bmlvbgorICAvLyBmb3JfZWFjaAorICAvLyBmaW5kCisgIC8vIGZpbmRfaWYKKyAgLy8gZmluZF9maXJzdF9vZgorICAvLyBhZGphY2VudF9maW5kCisgIC8vIGNvdW50CisgIC8vIGNvdW50X2lmCisgIC8vIHNlYXJjaAorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZAorICAgKiAgc2VhcmNoX24oX0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvciwgX0ludGVnZXIsIGNvbnN0IF9UcCYpCisgICAqICBvdmVybG9hZGVkIGZvciBmb3J3YXJkIGl0ZXJhdG9ycy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX19zZWFyY2hfbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsLAorCSAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIF9fZmlyc3QgPSBfR0xJQkNYWF9TVERfQTo6ZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCSAgICBfX24gPSBfX2NvdW50OworCSAgX0ZvcndhcmRJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworCSAgKytfX2k7CisJICB3aGlsZSAoX19pICE9IF9fbGFzdCAmJiBfX24gIT0gMSAmJiAqX19pID09IF9fdmFsKQorCSAgICB7CisJICAgICAgKytfX2k7CisJICAgICAgLS1fX247CisJICAgIH0KKwkgIGlmIChfX24gPT0gMSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICBpZiAoX19pID09IF9fbGFzdCkKKwkgICAgcmV0dXJuIF9fbGFzdDsKKwkgIF9fZmlyc3QgPSBfR0xJQkNYWF9TVERfQTo6ZmluZCgrK19faSwgX19sYXN0LCBfX3ZhbCk7CisJfQorICAgICAgcmV0dXJuIF9fbGFzdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIHVnbGlmaWVkCisgICAqICBzZWFyY2hfbihfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yLCBfSW50ZWdlciwgY29uc3QgX1RwJikKKyAgICogIG92ZXJsb2FkZWQgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcgorICAgIF9fc2VhcmNoX24oX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAorCSAgICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsLCAKKwkgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICBfRGlzdGFuY2VUeXBlIF9fdGFpbFNpemUgPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgICAgX0Rpc3RhbmNlVHlwZSBfX3JlbWFpbmRlciA9IF9fY291bnQ7CisKKyAgICAgIHdoaWxlIChfX3JlbWFpbmRlciA8PSBfX3RhaWxTaXplKSAvLyB0aGUgbWFpbiBsb29wLi4uCisJeworCSAgX19maXJzdCArPSBfX3JlbWFpbmRlcjsKKwkgIF9fdGFpbFNpemUgLT0gX19yZW1haW5kZXI7CisJICAvLyBfX2ZpcnN0IGhlcmUgaXMgYWx3YXlzIHBvaW50aW5nIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQgb2YKKwkgIC8vIG5leHQgcG9zc2libGUgbWF0Y2guCisJICBfUmFuZG9tQWNjZXNzSXRlciBfX2JhY2tUcmFjayA9IF9fZmlyc3Q7IAorCSAgd2hpbGUgKCotLV9fYmFja1RyYWNrID09IF9fdmFsKQorCSAgICB7CisJICAgICAgaWYgKC0tX19yZW1haW5kZXIgPT0gMCkKKwkgICAgICAgIHJldHVybiAoX19maXJzdCAtIF9fY291bnQpOyAvLyBTdWNjZXNzCisJICAgIH0KKwkgIF9fcmVtYWluZGVyID0gX19jb3VudCArIDEgLSAoX19maXJzdCAtIF9fYmFja1RyYWNrKTsKKwl9CisgICAgICByZXR1cm4gX19sYXN0OyAvLyBGYWlsdXJlCisgICAgfQorCisgIC8vIHNlYXJjaF9uCisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIHVnbGlmaWVkCisgICAqICBzZWFyY2hfbihfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yLCBfSW50ZWdlciwgY29uc3QgX1RwJiwKKyAgICoJICAgICAgIF9CaW5hcnlQcmVkaWNhdGUpCisgICAqICBvdmVybG9hZGVkIGZvciBmb3J3YXJkIGl0ZXJhdG9ycy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX19zZWFyY2hfbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsLAorCSAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICFib29sKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsIF9fdmFsKSkpCisgICAgICAgICsrX19maXJzdDsKKworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJICAgIF9fbiA9IF9fY291bnQ7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9faSA9IF9fZmlyc3Q7CisJICArK19faTsKKwkgIHdoaWxlIChfX2kgIT0gX19sYXN0ICYmIF9fbiAhPSAxICYmIGJvb2woX19iaW5hcnlfcHJlZCgqX19pLCBfX3ZhbCkpKQorCSAgICB7CisJICAgICAgKytfX2k7CisJICAgICAgLS1fX247CisJICAgIH0KKwkgIGlmIChfX24gPT0gMSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICBpZiAoX19pID09IF9fbGFzdCkKKwkgICAgcmV0dXJuIF9fbGFzdDsKKwkgIF9fZmlyc3QgPSArK19faTsKKwkgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdAorCQkgJiYgIWJvb2woX19iaW5hcnlfcHJlZCgqX19maXJzdCwgX192YWwpKSkKKwkgICAgKytfX2ZpcnN0OworCX0KKyAgICAgIHJldHVybiBfX2xhc3Q7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZAorICAgKiAgc2VhcmNoX24oX0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvciwgX0ludGVnZXIsIGNvbnN0IF9UcCYsCisgICAqCSAgICAgICBfQmluYXJ5UHJlZGljYXRlKQorICAgKiAgb3ZlcmxvYWRlZCBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyLCB0eXBlbmFtZSBfSW50ZWdlciwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXIKKyAgICBfX3NlYXJjaF9uKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKwkgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCwKKwkgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLCBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIF9EaXN0YW5jZVR5cGUgX190YWlsU2l6ZSA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICBfRGlzdGFuY2VUeXBlIF9fcmVtYWluZGVyID0gX19jb3VudDsKKworICAgICAgd2hpbGUgKF9fcmVtYWluZGVyIDw9IF9fdGFpbFNpemUpIC8vIHRoZSBtYWluIGxvb3AuLi4KKwl7CisJICBfX2ZpcnN0ICs9IF9fcmVtYWluZGVyOworCSAgX190YWlsU2l6ZSAtPSBfX3JlbWFpbmRlcjsKKwkgIC8vIF9fZmlyc3QgaGVyZSBpcyBhbHdheXMgcG9pbnRpbmcgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudCBvZgorCSAgLy8gbmV4dCBwb3NzaWJsZSBtYXRjaC4KKwkgIF9SYW5kb21BY2Nlc3NJdGVyIF9fYmFja1RyYWNrID0gX19maXJzdDsgCisJICB3aGlsZSAoX19iaW5hcnlfcHJlZCgqLS1fX2JhY2tUcmFjaywgX192YWwpKQorCSAgICB7CisJICAgICAgaWYgKC0tX19yZW1haW5kZXIgPT0gMCkKKwkgICAgICAgIHJldHVybiAoX19maXJzdCAtIF9fY291bnQpOyAvLyBTdWNjZXNzCisJICAgIH0KKwkgIF9fcmVtYWluZGVyID0gX19jb3VudCArIDEgLSAoX19maXJzdCAtIF9fYmFja1RyYWNrKTsKKwl9CisgICAgICByZXR1cm4gX19sYXN0OyAvLyBGYWlsdXJlCisgICAgfQorCisgIC8vIGZpbmRfZW5kIGZvciBmb3J3YXJkIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IxCisgICAgX19maW5kX2VuZChfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcmF0b3IyIF9fbGFzdDIsCisJICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnLCBmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKwlyZXR1cm4gX19sYXN0MTsKKyAgICAgIGVsc2UKKwl7CisJICBfRm9yd2FyZEl0ZXJhdG9yMSBfX3Jlc3VsdCA9IF9fbGFzdDE7CisJICB3aGlsZSAoMSkKKwkgICAgeworCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbmV3X3Jlc3VsdAorCQk9IF9HTElCQ1hYX1NURF9BOjpzZWFyY2goX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyKTsKKwkgICAgICBpZiAoX19uZXdfcmVzdWx0ID09IF9fbGFzdDEpCisJCXJldHVybiBfX3Jlc3VsdDsKKwkgICAgICBlbHNlCisJCXsKKwkJICBfX3Jlc3VsdCA9IF9fbmV3X3Jlc3VsdDsKKwkJICBfX2ZpcnN0MSA9IF9fbmV3X3Jlc3VsdDsKKwkJICArK19fZmlyc3QxOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IxCisgICAgX19maW5kX2VuZChfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcmF0b3IyIF9fbGFzdDIsCisJICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnLCBmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKwkgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXApCisgICAgeworICAgICAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisJcmV0dXJuIF9fbGFzdDE7CisgICAgICBlbHNlCisJeworCSAgX0ZvcndhcmRJdGVyYXRvcjEgX19yZXN1bHQgPSBfX2xhc3QxOworCSAgd2hpbGUgKDEpCisJICAgIHsKKwkgICAgICBfRm9yd2FyZEl0ZXJhdG9yMSBfX25ld19yZXN1bHQKKwkJPSBfR0xJQkNYWF9TVERfQTo6c2VhcmNoKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwKKwkJCQkJIF9fbGFzdDIsIF9fY29tcCk7CisJICAgICAgaWYgKF9fbmV3X3Jlc3VsdCA9PSBfX2xhc3QxKQorCQlyZXR1cm4gX19yZXN1bHQ7CisJICAgICAgZWxzZQorCQl7CisJCSAgX19yZXN1bHQgPSBfX25ld19yZXN1bHQ7CisJCSAgX19maXJzdDEgPSBfX25ld19yZXN1bHQ7CisJCSAgKytfX2ZpcnN0MTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAvLyBmaW5kX2VuZCBmb3IgYmlkaXJlY3Rpb25hbCBpdGVyYXRvcnMgKG11Y2ggZmFzdGVyKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEsIHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyPgorICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxCisgICAgX19maW5kX2VuZChfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX2ZpcnN0MSwKKwkgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIgX19maXJzdDIsCisJICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyIF9fbGFzdDIsCisJICAgICAgIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjI+KQorCisgICAgICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcjE+IF9SZXZJdGVyYXRvcjE7CisgICAgICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcjI+IF9SZXZJdGVyYXRvcjI7CisKKyAgICAgIF9SZXZJdGVyYXRvcjEgX19ybGFzdDEoX19maXJzdDEpOworICAgICAgX1Jldkl0ZXJhdG9yMiBfX3JsYXN0MihfX2ZpcnN0Mik7CisgICAgICBfUmV2SXRlcmF0b3IxIF9fcnJlc3VsdCA9IF9HTElCQ1hYX1NURF9BOjpzZWFyY2goX1Jldkl0ZXJhdG9yMShfX2xhc3QxKSwKKwkJCQkJCSAgICAgICBfX3JsYXN0MSwKKwkJCQkJCSAgICAgICBfUmV2SXRlcmF0b3IyKF9fbGFzdDIpLAorCQkJCQkJICAgICAgIF9fcmxhc3QyKTsKKworICAgICAgaWYgKF9fcnJlc3VsdCA9PSBfX3JsYXN0MSkKKwlyZXR1cm4gX19sYXN0MTsKKyAgICAgIGVsc2UKKwl7CisJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX3Jlc3VsdCA9IF9fcnJlc3VsdC5iYXNlKCk7CisJICBzdGQ6OmFkdmFuY2UoX19yZXN1bHQsIC1zdGQ6OmRpc3RhbmNlKF9fZmlyc3QyLCBfX2xhc3QyKSk7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMQorICAgIF9fZmluZF9lbmQoX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19maXJzdDEsCisJICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fbGFzdDEsCisJICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyIF9fZmlyc3QyLAorCSAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX2xhc3QyLAorCSAgICAgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsCisJICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMj4pCisKKyAgICAgIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMT4gX1Jldkl0ZXJhdG9yMTsKKyAgICAgIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMj4gX1Jldkl0ZXJhdG9yMjsKKworICAgICAgX1Jldkl0ZXJhdG9yMSBfX3JsYXN0MShfX2ZpcnN0MSk7CisgICAgICBfUmV2SXRlcmF0b3IyIF9fcmxhc3QyKF9fZmlyc3QyKTsKKyAgICAgIF9SZXZJdGVyYXRvcjEgX19ycmVzdWx0ID0gc3RkOjpzZWFyY2goX1Jldkl0ZXJhdG9yMShfX2xhc3QxKSwgX19ybGFzdDEsCisJCQkJCSAgICBfUmV2SXRlcmF0b3IyKF9fbGFzdDIpLCBfX3JsYXN0MiwKKwkJCQkJICAgIF9fY29tcCk7CisKKyAgICAgIGlmIChfX3JyZXN1bHQgPT0gX19ybGFzdDEpCisJcmV0dXJuIF9fbGFzdDE7CisgICAgICBlbHNlCisJeworCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19yZXN1bHQgPSBfX3JyZXN1bHQuYmFzZSgpOworCSAgc3RkOjphZHZhbmNlKF9fcmVzdWx0LCAtc3RkOjpkaXN0YW5jZShfX2ZpcnN0MiwgX19sYXN0MikpOworCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBtYXRjaGluZyBzdWJzZXF1ZW5jZSBpbiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIFN0YXJ0IG9mIHJhbmdlIHRvIHNlYXJjaC4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEVuZCBvZiByYW5nZSB0byBzZWFyY2guCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBTdGFydCBvZiBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogIEBwYXJhbSAgX19sYXN0MiAgIEVuZCBvZiBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogIEByZXR1cm4gICBUaGUgbGFzdCBpdGVyYXRvciBAYyBpIGluIHRoZSByYW5nZQorICAgKiAgQHAgW19fZmlyc3QxLF9fbGFzdDEtKF9fbGFzdDItX19maXJzdDIpKSBzdWNoIHRoYXQgQGMgKihpK04pID09CisgICAqICBAcCAqKF9fZmlyc3QyK04pIGZvciBlYWNoIEBjIE4gaW4gdGhlIHJhbmdlIEBwCisgICAqICBbMCxfX2xhc3QyLV9fZmlyc3QyKSwgb3IgQHAgX19sYXN0MSBpZiBubyBzdWNoIGl0ZXJhdG9yIGV4aXN0cy4KKyAgICoKKyAgICogIFNlYXJjaGVzIHRoZSByYW5nZSBAcCBbX19maXJzdDEsX19sYXN0MSkgZm9yIGEgc3ViLXNlcXVlbmNlIHRoYXQKKyAgICogIGNvbXBhcmVzIGVxdWFsIHZhbHVlLWJ5LXZhbHVlIHdpdGggdGhlIHNlcXVlbmNlIGdpdmVuIGJ5IEBwCisgICAqICBbX19maXJzdDIsX19sYXN0MikgYW5kIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIF9fZmlyc3QKKyAgICogIGVsZW1lbnQgb2YgdGhlIHN1Yi1zZXF1ZW5jZSwgb3IgQHAgX19sYXN0MSBpZiB0aGUgc3ViLXNlcXVlbmNlCisgICAqICBpcyBub3QgZm91bmQuICBUaGUgc3ViLXNlcXVlbmNlIHdpbGwgYmUgdGhlIGxhc3Qgc3VjaAorICAgKiAgc3Vic2VxdWVuY2UgY29udGFpbmVkIGluIFtfX2ZpcnN0LF9fbGFzdDEpLgorICAgKgorICAgKiAgQmVjYXVzZSB0aGUgc3ViLXNlcXVlbmNlIG11c3QgbGllIGNvbXBsZXRlbHkgd2l0aGluIHRoZSByYW5nZSBAcAorICAgKiAgW19fZmlyc3QxLF9fbGFzdDEpIGl0IG11c3Qgc3RhcnQgYXQgYSBwb3NpdGlvbiBsZXNzIHRoYW4gQHAKKyAgICogIF9fbGFzdDEtKF9fbGFzdDItX19maXJzdDIpIHdoZXJlIEBwIF9fbGFzdDItX19maXJzdDIgaXMgdGhlCisgICAqICBsZW5ndGggb2YgdGhlIHN1Yi1zZXF1ZW5jZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmV0dXJuZWQKKyAgICogIGl0ZXJhdG9yIEBjIGkgd2lsbCBiZSBpbiB0aGUgcmFuZ2UgQHAKKyAgICogIFtfX2ZpcnN0MSxfX2xhc3QxLShfX2xhc3QyLV9fZmlyc3QyKSkKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyPgorICAgIGlubGluZSBfRm9yd2FyZEl0ZXJhdG9yMQorICAgIGZpbmRfZW5kKF9Gb3J3YXJkSXRlcmF0b3IxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcmF0b3IyIF9fbGFzdDIpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbE9wQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IxPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IyPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19maW5kX2VuZChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsCisJCQkgICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0MSksCisJCQkgICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0MikpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgRmluZCBsYXN0IG1hdGNoaW5nIHN1YnNlcXVlbmNlIGluIGEgc2VxdWVuY2UgdXNpbmcgYSBwcmVkaWNhdGUuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgU3RhcnQgb2YgcmFuZ2UgdG8gc2VhcmNoLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgRW5kIG9mIHJhbmdlIHRvIHNlYXJjaC4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIFN0YXJ0IG9mIHNlcXVlbmNlIHRvIG1hdGNoLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgRW5kIG9mIHNlcXVlbmNlIHRvIG1hdGNoLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICAgVGhlIHByZWRpY2F0ZSB0byB1c2UuCisgICAqICBAcmV0dXJuIFRoZSBsYXN0IGl0ZXJhdG9yIEBjIGkgaW4gdGhlIHJhbmdlIEBwCisgICAqICBbX19maXJzdDEsX19sYXN0MS0oX19sYXN0Mi1fX2ZpcnN0MikpIHN1Y2ggdGhhdCBAYworICAgKiAgcHJlZGljYXRlKCooaStOKSwgQHAgKF9fZmlyc3QyK04pKSBpcyB0cnVlIGZvciBlYWNoIEBjIE4gaW4gdGhlCisgICAqICByYW5nZSBAcCBbMCxfX2xhc3QyLV9fZmlyc3QyKSwgb3IgQHAgX19sYXN0MSBpZiBubyBzdWNoIGl0ZXJhdG9yCisgICAqICBleGlzdHMuCisgICAqCisgICAqICBTZWFyY2hlcyB0aGUgcmFuZ2UgQHAgW19fZmlyc3QxLF9fbGFzdDEpIGZvciBhIHN1Yi1zZXF1ZW5jZSB0aGF0CisgICAqICBjb21wYXJlcyBlcXVhbCB2YWx1ZS1ieS12YWx1ZSB3aXRoIHRoZSBzZXF1ZW5jZSBnaXZlbiBieSBAcAorICAgKiAgW19fZmlyc3QyLF9fbGFzdDIpIHVzaW5nIGNvbXAgYXMgYSBwcmVkaWNhdGUgYW5kIHJldHVybnMgYW4KKyAgICogIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBzdWItc2VxdWVuY2UsIG9yIEBwIF9fbGFzdDEKKyAgICogIGlmIHRoZSBzdWItc2VxdWVuY2UgaXMgbm90IGZvdW5kLiAgVGhlIHN1Yi1zZXF1ZW5jZSB3aWxsIGJlIHRoZQorICAgKiAgbGFzdCBzdWNoIHN1YnNlcXVlbmNlIGNvbnRhaW5lZCBpbiBbX19maXJzdCxfX2xhc3QxKS4KKyAgICoKKyAgICogIEJlY2F1c2UgdGhlIHN1Yi1zZXF1ZW5jZSBtdXN0IGxpZSBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgcmFuZ2UgQHAKKyAgICogIFtfX2ZpcnN0MSxfX2xhc3QxKSBpdCBtdXN0IHN0YXJ0IGF0IGEgcG9zaXRpb24gbGVzcyB0aGFuIEBwCisgICAqICBfX2xhc3QxLShfX2xhc3QyLV9fZmlyc3QyKSB3aGVyZSBAcCBfX2xhc3QyLV9fZmlyc3QyIGlzIHRoZQorICAgKiAgbGVuZ3RoIG9mIHRoZSBzdWItc2VxdWVuY2UuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHJldHVybmVkCisgICAqICBpdGVyYXRvciBAYyBpIHdpbGwgYmUgaW4gdGhlIHJhbmdlIEBwCisgICAqICBbX19maXJzdDEsX19sYXN0MS0oX19sYXN0Mi1fX2ZpcnN0MikpCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGlubGluZSBfRm9yd2FyZEl0ZXJhdG9yMQorICAgIGZpbmRfZW5kKF9Gb3J3YXJkSXRlcmF0b3IxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcmF0b3IyIF9fbGFzdDIsCisJICAgICBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0JpbmFyeVByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IxPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IyPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19maW5kX2VuZChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsCisJCQkgICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0MSksCisJCQkgICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0MiksCisJCQkgICAgIF9fY29tcCk7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvKioKKyAgICogIEBicmllZiAgQ2hlY2tzIHRoYXQgYSBwcmVkaWNhdGUgaXMgdHJ1ZSBmb3IgYWxsIHRoZSBlbGVtZW50cworICAgKiAgICAgICAgICBvZiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcHJlZCAgICBBIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgdGhlIGNoZWNrIGlzIHRydWUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICoKKyAgICogIFJldHVybnMgdHJ1ZSBpZiBAcCBfX3ByZWQgaXMgdHJ1ZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZQorICAgKiAgQHAgW19fZmlyc3QsX19sYXN0KSwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBhbGxfb2YoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7IHJldHVybiBfX2xhc3QgPT0gc3RkOjpmaW5kX2lmX25vdChfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgQ2hlY2tzIHRoYXQgYSBwcmVkaWNhdGUgaXMgZmFsc2UgZm9yIGFsbCB0aGUgZWxlbWVudHMKKyAgICogICAgICAgICAgb2YgYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICAgQSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIHRoZSBjaGVjayBpcyB0cnVlLCBmYWxzZSBvdGhlcndpc2UuCisgICAqCisgICAqICBSZXR1cm5zIHRydWUgaWYgQHAgX19wcmVkIGlzIGZhbHNlIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbX19maXJzdCxfX2xhc3QpLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG5vbmVfb2YoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7IHJldHVybiBfX2xhc3QgPT0gX0dMSUJDWFhfU1REX0E6OmZpbmRfaWYoX19maXJzdCwgX19sYXN0LCBfX3ByZWQpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrcyB0aGF0IGEgcHJlZGljYXRlIGlzIGZhbHNlIGZvciBhdCBsZWFzdCBhbiBlbGVtZW50CisgICAqICAgICAgICAgIG9mIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19wcmVkICAgIEEgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiB0aGUgY2hlY2sgaXMgdHJ1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKgorICAgKiAgUmV0dXJucyB0cnVlIGlmIGFuIGVsZW1lbnQgZXhpc3RzIGluIHRoZSByYW5nZSBAcAorICAgKiAgW19fZmlyc3QsX19sYXN0KSBzdWNoIHRoYXQgQHAgX19wcmVkIGlzIHRydWUsIGFuZCBmYWxzZQorICAgKiAgb3RoZXJ3aXNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIGFueV9vZihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsgcmV0dXJuICFzdGQ6Om5vbmVfb2YoX19maXJzdCwgX19sYXN0LCBfX3ByZWQpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZpbmQgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYSBzZXF1ZW5jZSBmb3Igd2hpY2ggYQorICAgKiAgICAgICAgICBwcmVkaWNhdGUgaXMgZmFsc2UuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcHJlZCAgIEEgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgIFRoZSBmaXJzdCBpdGVyYXRvciBAYyBpIGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpCisgICAqICBzdWNoIHRoYXQgQHAgX19wcmVkKCppKSBpcyBmYWxzZSwgb3IgQHAgX19sYXN0IGlmIG5vIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0lucHV0SXRlcmF0b3IKKyAgICBmaW5kX2lmX25vdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCV9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfVW5hcnlQcmVkaWNhdGVDb25jZXB0PF9QcmVkaWNhdGUsCisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIHJldHVybiBzdGQ6Ol9fZmluZF9pZl9ub3QoX19maXJzdCwgX19sYXN0LCBfX3ByZWQpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNlcXVlbmNlIGlzIHBhcnRpdGlvbmVkLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcHJlZCAgIEEgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBpcyBwYXJ0aW9uZWQgYnkgQHAgX19wcmVkLAorICAgKiAgaS5lLiBpZiBhbGwgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IEBwIF9fcHJlZCBhcHBlYXIgYmVmb3JlIHRob3NlIHRoYXQKKyAgICogIGRvIG5vdC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc19wYXJ0aXRpb25lZChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIF9fZmlyc3QgPSBzdGQ6OmZpbmRfaWZfbm90KF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkKTsKKyAgICAgIHJldHVybiBzdGQ6Om5vbmVfb2YoX19maXJzdCwgX19sYXN0LCBfX3ByZWQpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgRmluZCB0aGUgcGFydGl0aW9uIHBvaW50IG9mIGEgcGFydGl0aW9uZWQgcmFuZ2UuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcHJlZCAgICBBIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIEBwIG1pZCBzdWNoIHRoYXQgQHAgYWxsX29mKF9fZmlyc3QsIG1pZCwgX19wcmVkKQorICAgKiAgICAgICAgICAgYW5kIEBwIG5vbmVfb2YobWlkLCBfX2xhc3QsIF9fcHJlZCkgYXJlIGJvdGggdHJ1ZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgcGFydGl0aW9uX3BvaW50KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCSAgICBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorCisgICAgICAvLyBBIHNwZWNpZmljIGRlYnVnLW1vZGUgdGVzdCB3aWxsIGJlIG5lY2Vzc2FyeS4uLgorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICBfRGlzdGFuY2VUeXBlIF9fbGVuID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgX0Rpc3RhbmNlVHlwZSBfX2hhbGY7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkZGxlOworCisgICAgICB3aGlsZSAoX19sZW4gPiAwKQorCXsKKwkgIF9faGFsZiA9IF9fbGVuID4+IDE7CisJICBfX21pZGRsZSA9IF9fZmlyc3Q7CisJICBzdGQ6OmFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CisJICBpZiAoX19wcmVkKCpfX21pZGRsZSkpCisJICAgIHsKKwkgICAgICBfX2ZpcnN0ID0gX19taWRkbGU7CisJICAgICAgKytfX2ZpcnN0OworCSAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOworCSAgICB9CisJICBlbHNlCisJICAgIF9fbGVuID0gX19oYWxmOworCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKyNlbmRpZgorCisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29weSBhIHNlcXVlbmNlLCByZW1vdmluZyBlbGVtZW50cyBvZiBhIGdpdmVuIHZhbHVlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX192YWx1ZSAgIFRoZSB2YWx1ZSB0byBiZSByZW1vdmVkLgorICAgKiAgQHJldHVybiAgIEFuIGl0ZXJhdG9yIGRlc2lnbmF0aW5nIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZS4KKyAgICoKKyAgICogIENvcGllcyBlYWNoIGVsZW1lbnQgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgbm90IGVxdWFsCisgICAqICB0byBAcCBfX3ZhbHVlIHRvIHRoZSByYW5nZSBiZWdpbm5pbmcgYXQgQHAgX19yZXN1bHQuCisgICAqICByZW1vdmVfY29weSgpIGlzIHN0YWJsZSwgc28gdGhlIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQKKyAgICogIGFyZSBjb3BpZWQgaXMgdW5jaGFuZ2VkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgcmVtb3ZlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQlfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbE9wQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwgX1RwPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlpZiAoISgqX19maXJzdCA9PSBfX3ZhbHVlKSkKKwkgIHsKKwkgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisJICAgICsrX19yZXN1bHQ7CisJICB9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgYSBzZXF1ZW5jZSwgcmVtb3ZpbmcgZWxlbWVudHMgZm9yIHdoaWNoIGEgcHJlZGljYXRlIGlzIHRydWUuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICAgQSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuICAgQW4gaXRlcmF0b3IgZGVzaWduYXRpbmcgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLgorICAgKgorICAgKiAgQ29waWVzIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBmb3Igd2hpY2gKKyAgICogIEBwIF9fcHJlZCByZXR1cm5zIGZhbHNlIHRvIHRoZSByYW5nZSBiZWdpbm5pbmcgYXQgQHAgX19yZXN1bHQuCisgICAqCisgICAqICByZW1vdmVfY29weV9pZigpIGlzIHN0YWJsZSwgc28gdGhlIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgYXJlCisgICAqICBjb3BpZWQgaXMgdW5jaGFuZ2VkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgcmVtb3ZlX2NvcHlfaWYoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5UHJlZGljYXRlQ29uY2VwdDxfUHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlpZiAoIWJvb2woX19wcmVkKCpfX2ZpcnN0KSkpCisJICB7CisJICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworCSAgICArK19fcmVzdWx0OworCSAgfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLyoqCisgICAqICBAYnJpZWYgQ29weSB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBmb3Igd2hpY2ggYSBwcmVkaWNhdGUgaXMgdHJ1ZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0ICBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcHJlZCAgICBBIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBkZXNpZ25hdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBDb3BpZXMgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIGZvciB3aGljaAorICAgKiAgQHAgX19wcmVkIHJldHVybnMgdHJ1ZSB0byB0aGUgcmFuZ2UgYmVnaW5uaW5nIGF0IEBwIF9fcmVzdWx0LgorICAgKgorICAgKiAgY29weV9pZigpIGlzIHN0YWJsZSwgc28gdGhlIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgYXJlCisgICAqICBjb3BpZWQgaXMgdW5jaGFuZ2VkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgY29weV9pZihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfVW5hcnlQcmVkaWNhdGVDb25jZXB0PF9QcmVkaWNhdGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCWlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKwkgICAgKytfX3Jlc3VsdDsKKwkgIH0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX2NvcHlfbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sCisJICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIGlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX19uID4gMCkKKwl7CisJICB3aGlsZSAodHJ1ZSkKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworCSAgICAgICsrX19yZXN1bHQ7CisJICAgICAgaWYgKC0tX19uID4gMCkKKwkJKytfX2ZpcnN0OworCSAgICAgIGVsc2UKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX2NvcHlfbihfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLAorCSAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7IHJldHVybiBzdGQ6OmNvcHkoX19maXJzdCwgX19maXJzdCArIF9fbiwgX19yZXN1bHQpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29waWVzIHRoZSByYW5nZSBbZmlyc3QsZmlyc3QrbikgaW50byBbcmVzdWx0LHJlc3VsdCtuKS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbiAgICAgIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gY29weS4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgcmVzdWx0K24uCisgICAqCisgICAqICBUaGlzIGlubGluZSBmdW5jdGlvbiB3aWxsIGJvaWwgZG93biB0byBhIGNhbGwgdG8gQGMgbWVtbW92ZSB3aGVuZXZlcgorICAgKiAgcG9zc2libGUuICBGYWlsaW5nIHRoYXQsIGlmIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzIGFyZSBwYXNzZWQsIHRoZW4gdGhlCisgICAqICBsb29wIGNvdW50IHdpbGwgYmUga25vd24gKGFuZCB0aGVyZWZvcmUgYSBjYW5kaWRhdGUgZm9yIGNvbXBpbGVyCisgICAqICBvcHRpbWl6YXRpb25zIHN1Y2ggYXMgdW5yb2xsaW5nKS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIGNvcHlfbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorCisgICAgICByZXR1cm4gc3RkOjpfX2NvcHlfbihfX2ZpcnN0LCBfX24sIF9fcmVzdWx0LAorCQkJICAgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29weSB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSB0byBzZXBhcmF0ZSBvdXRwdXQgc2VxdWVuY2VzCisgICAqICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSB0cnV0aCB2YWx1ZSBvZiBhIHByZWRpY2F0ZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fb3V0X3RydWUgICBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fb3V0X2ZhbHNlICBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcHJlZCAgICBBIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gICBBIHBhaXIgZGVzaWduYXRpbmcgdGhlIGVuZHMgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZXMuCisgICAqCisgICAqICBDb3BpZXMgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIGZvciB3aGljaAorICAgKiAgQHAgX19wcmVkIHJldHVybnMgdHJ1ZSB0byB0aGUgcmFuZ2UgYmVnaW5uaW5nIGF0IEBwIG91dF90cnVlCisgICAqICBhbmQgZWFjaCBlbGVtZW50IGZvciB3aGljaCBAcCBfX3ByZWQgcmV0dXJucyBmYWxzZSB0byBAcCBfX291dF9mYWxzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcjEsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBwYWlyPF9PdXRwdXRJdGVyYXRvcjEsIF9PdXRwdXRJdGVyYXRvcjI+CisgICAgcGFydGl0aW9uX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICBfT3V0cHV0SXRlcmF0b3IxIF9fb3V0X3RydWUsIF9PdXRwdXRJdGVyYXRvcjIgX19vdXRfZmFsc2UsCisJCSAgIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvcjEsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yMiwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5UHJlZGljYXRlQ29uY2VwdDxfUHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgCisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgIHsKKwkgICAgKl9fb3V0X3RydWUgPSAqX19maXJzdDsKKwkgICAgKytfX291dF90cnVlOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgKl9fb3V0X2ZhbHNlID0gKl9fZmlyc3Q7CisJICAgICsrX19vdXRfZmFsc2U7CisJICB9CisKKyAgICAgIHJldHVybiBwYWlyPF9PdXRwdXRJdGVyYXRvcjEsIF9PdXRwdXRJdGVyYXRvcjI+KF9fb3V0X3RydWUsIF9fb3V0X2ZhbHNlKTsKKyAgICB9CisjZW5kaWYKKworICAvKioKKyAgICogIEBicmllZiBSZW1vdmUgZWxlbWVudHMgZnJvbSBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fdmFsdWUgIFRoZSB2YWx1ZSB0byBiZSByZW1vdmVkLgorICAgKiAgQHJldHVybiAgIEFuIGl0ZXJhdG9yIGRlc2lnbmF0aW5nIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZS4KKyAgICoKKyAgICogIEFsbCBlbGVtZW50cyBlcXVhbCB0byBAcCBfX3ZhbHVlIGFyZSByZW1vdmVkIGZyb20gdGhlIHJhbmdlCisgICAqICBAcCBbX19maXJzdCxfX2xhc3QpLgorICAgKgorICAgKiAgcmVtb3ZlKCkgaXMgc3RhYmxlLCBzbyB0aGUgcmVsYXRpdmUgb3JkZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUKKyAgICogIG5vdCByZW1vdmVkIGlzIHVuY2hhbmdlZC4KKyAgICoKKyAgICogIEVsZW1lbnRzIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlIGFuZCBAcCBfX2xhc3QKKyAgICogIGFyZSBzdGlsbCBwcmVzZW50LCBidXQgdGhlaXIgdmFsdWUgaXMgdW5zcGVjaWZpZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgcmVtb3ZlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbE9wQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLCBfVHA+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIF9fZmlyc3QgPSBfR0xJQkNYWF9TVERfQTo6ZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsdWUpOworICAgICAgaWYoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgIHJldHVybiBfX2ZpcnN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgICArK19fZmlyc3Q7CisgICAgICBmb3IoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICBpZighKCpfX2ZpcnN0ID09IF9fdmFsdWUpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICpfX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QpOworICAgICAgICAgICAgKytfX3Jlc3VsdDsKKyAgICAgICAgICB9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJlbW92ZSBlbGVtZW50cyBmcm9tIGEgc2VxdWVuY2UgdXNpbmcgYSBwcmVkaWNhdGUuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICBBIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBkZXNpZ25hdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBBbGwgZWxlbWVudHMgZm9yIHdoaWNoIEBwIF9fcHJlZCByZXR1cm5zIHRydWUgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0LF9fbGFzdCkuCisgICAqCisgICAqICByZW1vdmVfaWYoKSBpcyBzdGFibGUsIHNvIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGFyZQorICAgKiAgbm90IHJlbW92ZWQgaXMgdW5jaGFuZ2VkLgorICAgKgorICAgKiAgRWxlbWVudHMgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UgYW5kIEBwIF9fbGFzdAorICAgKiAgYXJlIHN0aWxsIHByZXNlbnQsIGJ1dCB0aGVpciB2YWx1ZSBpcyB1bnNwZWNpZmllZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgcmVtb3ZlX2lmKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5UHJlZGljYXRlQ29uY2VwdDxfUHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIF9fZmlyc3QgPSBfR0xJQkNYWF9TVERfQTo6ZmluZF9pZihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCk7CisgICAgICBpZihfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgICAgICsrX19maXJzdDsKKyAgICAgIGZvcig7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgIGlmKCFib29sKF9fcHJlZCgqX19maXJzdCkpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICpfX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QpOworICAgICAgICAgICAgKytfX3Jlc3VsdDsKKyAgICAgICAgICB9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJlbW92ZSBjb25zZWN1dGl2ZSBkdXBsaWNhdGUgdmFsdWVzIGZyb20gYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBkZXNpZ25hdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBSZW1vdmVzIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSBlYWNoIGdyb3VwIG9mIGNvbnNlY3V0aXZlCisgICAqICB2YWx1ZXMgdGhhdCBjb21wYXJlIGVxdWFsLgorICAgKiAgdW5pcXVlKCkgaXMgc3RhYmxlLCBzbyB0aGUgcmVsYXRpdmUgb3JkZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUKKyAgICogIG5vdCByZW1vdmVkIGlzIHVuY2hhbmdlZC4KKyAgICogIEVsZW1lbnRzIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlIGFuZCBAcCBfX2xhc3QKKyAgICogIGFyZSBzdGlsbCBwcmVzZW50LCBidXQgdGhlaXIgdmFsdWUgaXMgdW5zcGVjaWZpZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIHVuaXF1ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbGl0eUNvbXBhcmFibGVDb25jZXB0PAorCQkgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgLy8gU2tpcCB0aGUgYmVnaW5uaW5nLCBpZiBhbHJlYWR5IHVuaXF1ZS4KKyAgICAgIF9fZmlyc3QgPSBfR0xJQkNYWF9TVERfQTo6YWRqYWNlbnRfZmluZChfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2xhc3Q7CisKKyAgICAgIC8vIERvIHRoZSByZWFsIGNvcHkgd29yay4KKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19kZXN0ID0gX19maXJzdDsKKyAgICAgICsrX19maXJzdDsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCWlmICghKCpfX2Rlc3QgPT0gKl9fZmlyc3QpKQorCSAgKisrX19kZXN0ID0gX0dMSUJDWFhfTU9WRSgqX19maXJzdCk7CisgICAgICByZXR1cm4gKytfX2Rlc3Q7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJlbW92ZSBjb25zZWN1dGl2ZSB2YWx1ZXMgZnJvbSBhIHNlcXVlbmNlIHVzaW5nIGEgcHJlZGljYXRlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgICAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICAgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19iaW5hcnlfcHJlZCAgQSBiaW5hcnkgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgZGVzaWduYXRpbmcgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLgorICAgKgorICAgKiAgUmVtb3ZlcyBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IGZyb20gZWFjaCBncm91cCBvZiBjb25zZWN1dGl2ZQorICAgKiAgdmFsdWVzIGZvciB3aGljaCBAcCBfX2JpbmFyeV9wcmVkIHJldHVybnMgdHJ1ZS4KKyAgICogIHVuaXF1ZSgpIGlzIHN0YWJsZSwgc28gdGhlIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgYXJlCisgICAqICBub3QgcmVtb3ZlZCBpcyB1bmNoYW5nZWQuCisgICAqICBFbGVtZW50cyBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZSBhbmQgQHAgX19sYXN0CisgICAqICBhcmUgc3RpbGwgcHJlc2VudCwgYnV0IHRoZWlyIHZhbHVlIGlzIHVuc3BlY2lmaWVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICB1bmlxdWUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9CaW5hcnlQcmVkaWNhdGUsCisJCXR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkJdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICAvLyBTa2lwIHRoZSBiZWdpbm5pbmcsIGlmIGFscmVhZHkgdW5pcXVlLgorICAgICAgX19maXJzdCA9IF9HTElCQ1hYX1NURF9BOjphZGphY2VudF9maW5kKF9fZmlyc3QsIF9fbGFzdCwgX19iaW5hcnlfcHJlZCk7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fbGFzdDsKKworICAgICAgLy8gRG8gdGhlIHJlYWwgY29weSB3b3JrLgorICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2Rlc3QgPSBfX2ZpcnN0OworICAgICAgKytfX2ZpcnN0OworICAgICAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisJaWYgKCFib29sKF9fYmluYXJ5X3ByZWQoKl9fZGVzdCwgKl9fZmlyc3QpKSkKKwkgICorK19fZGVzdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QpOworICAgICAgcmV0dXJuICsrX19kZXN0OworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gdWdsaWZpZWQgdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IsIF9JbnB1dEl0ZXJhdG9yLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IpCisgICAqICBvdmVybG9hZGVkIGZvciBmb3J3YXJkIGl0ZXJhdG9ycyBhbmQgb3V0cHV0IGl0ZXJhdG9yIGFzIHJlc3VsdC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fdW5pcXVlX2NvcHkoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisJCSAgZm9yd2FyZF9pdGVyYXRvcl90YWcsIG91dHB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMgLS0gdGFrZW4gY2FyZSBvZiBpbiBkaXNwYXRjaGluZyBmdW5jdGlvbgorICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgICB3aGlsZSAoKytfX25leHQgIT0gX19sYXN0KQorCWlmICghKCpfX2ZpcnN0ID09ICpfX25leHQpKQorCSAgeworCSAgICBfX2ZpcnN0ID0gX19uZXh0OworCSAgICAqKytfX3Jlc3VsdCA9ICpfX2ZpcnN0OworCSAgfQorICAgICAgcmV0dXJuICsrX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZCB1bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciwgX0lucHV0SXRlcmF0b3IsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvcikKKyAgICogIG92ZXJsb2FkZWQgZm9yIGlucHV0IGl0ZXJhdG9ycyBhbmQgb3V0cHV0IGl0ZXJhdG9yIGFzIHJlc3VsdC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3VuaXF1ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisJCSAgaW5wdXRfaXRlcmF0b3JfdGFnLCBvdXRwdXRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzIC0tIHRha2VuIGNhcmUgb2YgaW4gZGlzcGF0Y2hpbmcgZnVuY3Rpb24KKyAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUgX192YWx1ZSA9ICpfX2ZpcnN0OworICAgICAgKl9fcmVzdWx0ID0gX192YWx1ZTsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCWlmICghKF9fdmFsdWUgPT0gKl9fZmlyc3QpKQorCSAgeworCSAgICBfX3ZhbHVlID0gKl9fZmlyc3Q7CisJICAgICorK19fcmVzdWx0ID0gX192YWx1ZTsKKwkgIH0KKyAgICAgIHJldHVybiArK19fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gdWdsaWZpZWQgdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IsIF9JbnB1dEl0ZXJhdG9yLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IpCisgICAqICBvdmVybG9hZGVkIGZvciBpbnB1dCBpdGVyYXRvcnMgYW5kIGZvcndhcmQgaXRlcmF0b3IgYXMgcmVzdWx0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX191bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJICBpbnB1dF9pdGVyYXRvcl90YWcsIGZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzIC0tIHRha2VuIGNhcmUgb2YgaW4gZGlzcGF0Y2hpbmcgZnVuY3Rpb24KKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisJaWYgKCEoKl9fcmVzdWx0ID09ICpfX2ZpcnN0KSkKKwkgICorK19fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgICByZXR1cm4gKytfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIHVnbGlmaWVkCisgICAqICB1bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciwgX0lucHV0SXRlcmF0b3IsIF9PdXRwdXRJdGVyYXRvciwKKyAgICogICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUpCisgICAqICBvdmVybG9hZGVkIGZvciBmb3J3YXJkIGl0ZXJhdG9ycyBhbmQgb3V0cHV0IGl0ZXJhdG9yIGFzIHJlc3VsdC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX191bmlxdWVfY29weShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLAorCQkgIGZvcndhcmRfaXRlcmF0b3JfdGFnLCBvdXRwdXRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzIC0tIGl0ZXJhdG9ycyBhbHJlYWR5IGNoZWNrZWQKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQmluYXJ5UHJlZGljYXRlLAorCSAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgICB3aGlsZSAoKytfX25leHQgIT0gX19sYXN0KQorCWlmICghYm9vbChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkpCisJICB7CisJICAgIF9fZmlyc3QgPSBfX25leHQ7CisJICAgICorK19fcmVzdWx0ID0gKl9fZmlyc3Q7CisJICB9CisgICAgICByZXR1cm4gKytfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIHVnbGlmaWVkCisgICAqICB1bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciwgX0lucHV0SXRlcmF0b3IsIF9PdXRwdXRJdGVyYXRvciwKKyAgICogICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUpCisgICAqICBvdmVybG9hZGVkIGZvciBpbnB1dCBpdGVyYXRvcnMgYW5kIG91dHB1dCBpdGVyYXRvciBhcyByZXN1bHQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3VuaXF1ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwKKwkJICBpbnB1dF9pdGVyYXRvcl90YWcsIG91dHB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMgLS0gaXRlcmF0b3JzIGFscmVhZHkgY2hlY2tlZAorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9CaW5hcnlQcmVkaWNhdGUsCisJICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisKKyAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUgX192YWx1ZSA9ICpfX2ZpcnN0OworICAgICAgKl9fcmVzdWx0ID0gX192YWx1ZTsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCWlmICghYm9vbChfX2JpbmFyeV9wcmVkKF9fdmFsdWUsICpfX2ZpcnN0KSkpCisJICB7CisJICAgIF9fdmFsdWUgPSAqX19maXJzdDsKKwkgICAgKisrX19yZXN1bHQgPSBfX3ZhbHVlOworCSAgfQorICAgICAgcmV0dXJuICsrX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZAorICAgKiAgdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IsIF9JbnB1dEl0ZXJhdG9yLCBfT3V0cHV0SXRlcmF0b3IsCisgICAqICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlKQorICAgKiAgb3ZlcmxvYWRlZCBmb3IgaW5wdXQgaXRlcmF0b3JzIGFuZCBmb3J3YXJkIGl0ZXJhdG9yIGFzIHJlc3VsdC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX191bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLAorCQkgIGlucHV0X2l0ZXJhdG9yX3RhZywgZm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMgLS0gaXRlcmF0b3JzIGFscmVhZHkgY2hlY2tlZAorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9CaW5hcnlQcmVkaWNhdGUsCisJICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKworICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwlpZiAoIWJvb2woX19iaW5hcnlfcHJlZCgqX19yZXN1bHQsICpfX2ZpcnN0KSkpCisJICAqKytfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICAgcmV0dXJuICsrX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZCByZXZlcnNlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcikKKyAgICogIG92ZXJsb2FkZWQgZm9yIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX3JldmVyc2UoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICB3aGlsZSAodHJ1ZSkKKwlpZiAoX19maXJzdCA9PSBfX2xhc3QgfHwgX19maXJzdCA9PSAtLV9fbGFzdCkKKwkgIHJldHVybjsKKwllbHNlCisJICB7CisJICAgIHN0ZDo6aXRlcl9zd2FwKF9fZmlyc3QsIF9fbGFzdCk7CisJICAgICsrX19maXJzdDsKKwkgIH0KKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIHVnbGlmaWVkIHJldmVyc2UoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yKQorICAgKiAgb3ZlcmxvYWRlZCBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX19yZXZlcnNlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCSAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm47CisgICAgICAtLV9fbGFzdDsKKyAgICAgIHdoaWxlIChfX2ZpcnN0IDwgX19sYXN0KQorCXsKKwkgIHN0ZDo6aXRlcl9zd2FwKF9fZmlyc3QsIF9fbGFzdCk7CisJICArK19fZmlyc3Q7CisJICAtLV9fbGFzdDsKKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJldmVyc2UgYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBBIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgcmV2ZXJzZSgpIHJldHVybnMgbm8gdmFsdWUuCisgICAqCisgICAqICBSZXZlcnNlcyB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpLAorICAgKiAgc28gdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBiZWNvbWVzIHRoZSBsYXN0IGV0Yy4KKyAgICogIEZvciBldmVyeSBAYyBpIHN1Y2ggdGhhdCBAcCAwPD1pPD0oX19sYXN0LV9fZmlyc3QpLzIpLCBAcCByZXZlcnNlKCkKKyAgICogIHN3YXBzIEBwICooX19maXJzdCtpKSBhbmQgQHAgKihfX2xhc3QtKGkrMSkpCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICByZXZlcnNlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIHN0ZDo6X19yZXZlcnNlKF9fZmlyc3QsIF9fbGFzdCwgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29weSBhIHNlcXVlbmNlLCByZXZlcnNpbmcgaXRzIGVsZW1lbnRzLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgZGVzaWduYXRpbmcgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLgorICAgKgorICAgKiAgQ29waWVzIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSB0byB0aGUKKyAgICogIHJhbmdlIEBwIFtfX3Jlc3VsdCxfX3Jlc3VsdCsoX19sYXN0LV9fZmlyc3QpKSBzdWNoIHRoYXQgdGhlCisgICAqICBvcmRlciBvZiB0aGUgZWxlbWVudHMgaXMgcmV2ZXJzZWQuICBGb3IgZXZlcnkgQGMgaSBzdWNoIHRoYXQgQHAKKyAgICogIDA8PWk8PShfX2xhc3QtX19maXJzdCksIEBwIHJldmVyc2VfY29weSgpIHBlcmZvcm1zIHRoZQorICAgKiAgYXNzaWdubWVudCBAcCAqKF9fcmVzdWx0KyhfX2xhc3QtX19maXJzdCktMS1pKSA9ICooX19maXJzdCtpKS4KKyAgICogIFRoZSByYW5nZXMgQHAgW19fZmlyc3QsX19sYXN0KSBhbmQgQHAKKyAgICogIFtfX3Jlc3VsdCxfX3Jlc3VsdCsoX19sYXN0LV9fZmlyc3QpKSBtdXN0IG5vdCBvdmVybGFwLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgcmV2ZXJzZV9jb3B5KF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsCisJCSBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQl0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICAtLV9fbGFzdDsKKwkgICpfX3Jlc3VsdCA9ICpfX2xhc3Q7CisJICArK19fcmVzdWx0OworCX0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgcm90YXRlIGFsZ29yaXRobSBzcGVjaWFsaXplZCBvbiBSQUlzLgorICAgKiAgSXQgcmV0dXJucyB0aGUgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3Igb2YgdHdvIGludGVnZXIgdmFsdWVzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXVjbGlkZWFuUmluZ0VsZW1lbnQ+CisgICAgX0V1Y2xpZGVhblJpbmdFbGVtZW50CisgICAgX19nY2QoX0V1Y2xpZGVhblJpbmdFbGVtZW50IF9fbSwgX0V1Y2xpZGVhblJpbmdFbGVtZW50IF9fbikKKyAgICB7CisgICAgICB3aGlsZSAoX19uICE9IDApCisJeworCSAgX0V1Y2xpZGVhblJpbmdFbGVtZW50IF9fdCA9IF9fbSAlIF9fbjsKKwkgIF9fbSA9IF9fbjsKKwkgIF9fbiA9IF9fdDsKKwl9CisgICAgICByZXR1cm4gX19tOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHJvdGF0ZSBhbGdvcml0aG0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9fcm90YXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWRkbGUsCisJICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlIHx8IF9fbGFzdCAgPT0gX19taWRkbGUpCisJcmV0dXJuOworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QyID0gX19taWRkbGU7CisgICAgICBkbworCXsKKwkgIHN0ZDo6aXRlcl9zd2FwKF9fZmlyc3QsIF9fZmlyc3QyKTsKKwkgICsrX19maXJzdDsKKwkgICsrX19maXJzdDI7CisJICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSkKKwkgICAgX19taWRkbGUgPSBfX2ZpcnN0MjsKKwl9CisgICAgICB3aGlsZSAoX19maXJzdDIgIT0gX19sYXN0KTsKKworICAgICAgX19maXJzdDIgPSBfX21pZGRsZTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QyICE9IF9fbGFzdCkKKwl7CisJICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX2ZpcnN0Mik7CisJICArK19fZmlyc3Q7CisJICArK19fZmlyc3QyOworCSAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUpCisJICAgIF9fbWlkZGxlID0gX19maXJzdDI7CisJICBlbHNlIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QpCisJICAgIF9fZmlyc3QyID0gX19taWRkbGU7CisJfQorICAgIH0KKworICAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSByb3RhdGUgYWxnb3JpdGhtLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX3JvdGF0ZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbWlkZGxlLAorCSAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsCisJICAgICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4pCisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlIHx8IF9fbGFzdCAgPT0gX19taWRkbGUpCisJcmV0dXJuOworCisgICAgICBzdGQ6Ol9fcmV2ZXJzZShfX2ZpcnN0LCAgX19taWRkbGUsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKCkpOworICAgICAgc3RkOjpfX3JldmVyc2UoX19taWRkbGUsIF9fbGFzdCwgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19taWRkbGUgJiYgX19taWRkbGUgIT0gX19sYXN0KQorCXsKKwkgIHN0ZDo6aXRlcl9zd2FwKF9fZmlyc3QsIC0tX19sYXN0KTsKKwkgICsrX19maXJzdDsKKwl9CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlKQorCXN0ZDo6X19yZXZlcnNlKF9fbWlkZGxlLCBfX2xhc3QsICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7CisgICAgICBlbHNlCisJc3RkOjpfX3JldmVyc2UoX19maXJzdCwgIF9fbWlkZGxlLCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpKTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSByb3RhdGUgYWxnb3JpdGhtLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9fcm90YXRlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbWlkZGxlLAorCSAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUgfHwgX19sYXN0ICA9PSBfX21pZGRsZSkKKwlyZXR1cm47CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICBfRGlzdGFuY2UgX19uID0gX19sYXN0ICAgLSBfX2ZpcnN0OworICAgICAgX0Rpc3RhbmNlIF9fayA9IF9fbWlkZGxlIC0gX19maXJzdDsKKworICAgICAgaWYgKF9fayA9PSBfX24gLSBfX2spCisJeworCSAgc3RkOjpzd2FwX3JhbmdlcyhfX2ZpcnN0LCBfX21pZGRsZSwgX19taWRkbGUpOworCSAgcmV0dXJuOworCX0KKworICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcCA9IF9fZmlyc3Q7CisKKyAgICAgIGZvciAoOzspCisJeworCSAgaWYgKF9fayA8IF9fbiAtIF9faykKKwkgICAgeworCSAgICAgIGlmIChfX2lzX3BvZChfVmFsdWVUeXBlKSAmJiBfX2sgPT0gMSkKKwkJeworCQkgIF9WYWx1ZVR5cGUgX190ID0gX0dMSUJDWFhfTU9WRSgqX19wKTsKKwkJICBfR0xJQkNYWF9NT1ZFMyhfX3AgKyAxLCBfX3AgKyBfX24sIF9fcCk7CisJCSAgKihfX3AgKyBfX24gLSAxKSA9IF9HTElCQ1hYX01PVkUoX190KTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19xID0gX19wICsgX19rOworCSAgICAgIGZvciAoX0Rpc3RhbmNlIF9faSA9IDA7IF9faSA8IF9fbiAtIF9fazsgKysgX19pKQorCQl7CisJCSAgc3RkOjppdGVyX3N3YXAoX19wLCBfX3EpOworCQkgICsrX19wOworCQkgICsrX19xOworCQl9CisJICAgICAgX19uICU9IF9fazsKKwkgICAgICBpZiAoX19uID09IDApCisJCXJldHVybjsKKwkgICAgICBzdGQ6OnN3YXAoX19uLCBfX2spOworCSAgICAgIF9fayA9IF9fbiAtIF9fazsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgX19rID0gX19uIC0gX19rOworCSAgICAgIGlmIChfX2lzX3BvZChfVmFsdWVUeXBlKSAmJiBfX2sgPT0gMSkKKwkJeworCQkgIF9WYWx1ZVR5cGUgX190ID0gX0dMSUJDWFhfTU9WRSgqKF9fcCArIF9fbiAtIDEpKTsKKwkJICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX3AsIF9fcCArIF9fbiAtIDEsIF9fcCArIF9fbik7CisJCSAgKl9fcCA9IF9HTElCQ1hYX01PVkUoX190KTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19xID0gX19wICsgX19uOworCSAgICAgIF9fcCA9IF9fcSAtIF9fazsKKwkgICAgICBmb3IgKF9EaXN0YW5jZSBfX2kgPSAwOyBfX2kgPCBfX24gLSBfX2s7ICsrIF9faSkKKwkJeworCQkgIC0tX19wOworCQkgIC0tX19xOworCQkgIHN0ZDo6aXRlcl9zd2FwKF9fcCwgX19xKTsKKwkJfQorCSAgICAgIF9fbiAlPSBfX2s7CisJICAgICAgaWYgKF9fbiA9PSAwKQorCQlyZXR1cm47CisJICAgICAgc3RkOjpzd2FwKF9fbiwgX19rKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgUm90YXRlIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX21pZGRsZSAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFJvdGF0ZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIGJ5IAorICAgKiAgQHAgKF9fbWlkZGxlIC0gX19maXJzdCkgcG9zaXRpb25zIHNvIHRoYXQgdGhlIGVsZW1lbnQgYXQgQHAgX19taWRkbGUKKyAgICogIGlzIG1vdmVkIHRvIEBwIF9fZmlyc3QsIHRoZSBlbGVtZW50IGF0IEBwIF9fbWlkZGxlKzEgaXMgbW92ZWQgdG8KKyAgICogIEBwIF9fZmlyc3QrMSBhbmQgc28gb24gZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0LF9fbGFzdCkuCisgICAqCisgICAqICBUaGlzIGVmZmVjdGl2ZWx5IHN3YXBzIHRoZSByYW5nZXMgQHAgW19fZmlyc3QsX19taWRkbGUpIGFuZAorICAgKiAgQHAgW19fbWlkZGxlLF9fbGFzdCkuCisgICAqCisgICAqICBQZXJmb3JtcworICAgKiAgIEBwICooX19maXJzdCsobisoX19sYXN0LV9fbWlkZGxlKSklKF9fbGFzdC1fX2ZpcnN0KSk9KihfX2ZpcnN0K24pCisgICAqICBmb3IgZWFjaCBAcCBuIGluIHRoZSByYW5nZSBAcCBbMCxfX2xhc3QtX19maXJzdCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICByb3RhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkZGxlLAorCSAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbWlkZGxlKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX21pZGRsZSwgX19sYXN0KTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5CisJX0l0ZXJUeXBlOworICAgICAgc3RkOjpfX3JvdGF0ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfSXRlclR5cGUoKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgYSBzZXF1ZW5jZSwgcm90YXRpbmcgaXRzIGVsZW1lbnRzLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX21pZGRsZSAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIEFuIGl0ZXJhdG9yIGRlc2lnbmF0aW5nIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZS4KKyAgICoKKyAgICogIENvcGllcyB0aGUgZWxlbWVudHMgb2YgdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgdG8gdGhlCisgICAqICByYW5nZSBiZWdpbm5pbmcgYXQgQHJlc3VsdCwgcm90YXRpbmcgdGhlIGNvcGllZCBlbGVtZW50cyBieSAKKyAgICogIEBwIChfX21pZGRsZS1fX2ZpcnN0KSBwb3NpdGlvbnMgc28gdGhhdCB0aGUgZWxlbWVudCBhdCBAcCBfX21pZGRsZQorICAgKiAgaXMgbW92ZWQgdG8gQHAgX19yZXN1bHQsIHRoZSBlbGVtZW50IGF0IEBwIF9fbWlkZGxlKzEgaXMgbW92ZWQKKyAgICogIHRvIEBwIF9fcmVzdWx0KzEgYW5kIHNvIG9uIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHJhbmdlIEBwCisgICAqICBbX19maXJzdCxfX2xhc3QpLgorICAgKgorICAgKiAgUGVyZm9ybXMgCisgICAqICBAcCAqKF9fcmVzdWx0KyhuKyhfX2xhc3QtX19taWRkbGUpKSUoX19sYXN0LV9fZmlyc3QpKT0qKF9fZmlyc3QrbikKKyAgICogIGZvciBlYWNoIEBwIG4gaW4gdGhlIHJhbmdlIEBwIFswLF9fbGFzdC1fX2ZpcnN0KS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHJvdGF0ZV9jb3B5KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCXR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19taWRkbGUpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fbWlkZGxlLCBfX2xhc3QpOworCisgICAgICByZXR1cm4gc3RkOjpjb3B5KF9fZmlyc3QsIF9fbWlkZGxlLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvcHkoX19taWRkbGUsIF9fbGFzdCwgX19yZXN1bHQpKTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24uLi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX19wYXJ0aXRpb24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJX1ByZWRpY2F0ZSBfX3ByZWQsIGZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19maXJzdDsKKworICAgICAgd2hpbGUgKF9fcHJlZCgqX19maXJzdCkpCisJaWYgKCsrX19maXJzdCA9PSBfX2xhc3QpCisJICByZXR1cm4gX19maXJzdDsKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworCisgICAgICB3aGlsZSAoKytfX25leHQgIT0gX19sYXN0KQorCWlmIChfX3ByZWQoKl9fbmV4dCkpCisJICB7CisJICAgIHN0ZDo6aXRlcl9zd2FwKF9fZmlyc3QsIF9fbmV4dCk7CisJICAgICsrX19maXJzdDsKKwkgIH0KKworICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uLi4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcgorICAgIF9fcGFydGl0aW9uKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsCisJCV9QcmVkaWNhdGUgX19wcmVkLCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICB3aGlsZSAodHJ1ZSkKKwl7CisJICB3aGlsZSAodHJ1ZSkKKwkgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgICAgIHJldHVybiBfX2ZpcnN0OworCSAgICBlbHNlIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgICAgICsrX19maXJzdDsKKwkgICAgZWxzZQorCSAgICAgIGJyZWFrOworCSAgLS1fX2xhc3Q7CisJICB3aGlsZSAodHJ1ZSkKKwkgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgICAgIHJldHVybiBfX2ZpcnN0OworCSAgICBlbHNlIGlmICghYm9vbChfX3ByZWQoKl9fbGFzdCkpKQorCSAgICAgIC0tX19sYXN0OworCSAgICBlbHNlCisJICAgICAgYnJlYWs7CisJICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX2xhc3QpOworCSAgKytfX2ZpcnN0OworCX0KKyAgICB9CisKKyAgLy8gcGFydGl0aW9uCisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24uLi4KKyAgLy8vIFJlcXVpcmVzIF9fbGVuICE9IDAgYW5kICFfX3ByZWQoKl9fZmlyc3QpLAorICAvLy8gc2FtZSBhcyBfX3N0YWJsZV9wYXJ0aXRpb25fYWRhcHRpdmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX19pbnBsYWNlX3N0YWJsZV9wYXJ0aXRpb24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBfRGlzdGFuY2UgX19sZW4pCisgICAgeworICAgICAgaWYgKF9fbGVuID09IDEpCisJcmV0dXJuIF9fZmlyc3Q7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkZGxlID0gX19maXJzdDsKKyAgICAgIHN0ZDo6YWR2YW5jZShfX21pZGRsZSwgX19sZW4gLyAyKTsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sZWZ0X3NwbGl0ID0KKwlzdGQ6Ol9faW5wbGFjZV9zdGFibGVfcGFydGl0aW9uKF9fZmlyc3QsIF9fcHJlZCwgX19sZW4gLyAyKTsKKyAgICAgIC8vIEFkdmFuY2UgcGFzdCB0cnVlLXByZWRpY2F0ZSB2YWx1ZXMgdG8gc2F0aXNmeSB0aGlzCisgICAgICAvLyBmdW5jdGlvbidzIHByZWNvbmRpdGlvbnMuCisgICAgICBfRGlzdGFuY2UgX19yaWdodF9sZW4gPSBfX2xlbiAtIF9fbGVuIC8gMjsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yaWdodF9zcGxpdCA9CisJc3RkOjpfX2ZpbmRfaWZfbm90X24oX19taWRkbGUsIF9fcmlnaHRfbGVuLCBfX3ByZWQpOworICAgICAgaWYgKF9fcmlnaHRfbGVuKQorCV9fcmlnaHRfc3BsaXQgPSBzdGQ6Ol9faW5wbGFjZV9zdGFibGVfcGFydGl0aW9uKF9fbWlkZGxlLAorCQkJCQkJCV9fcHJlZCwKKwkJCQkJCQlfX3JpZ2h0X2xlbik7CisgICAgICBzdGQ6OnJvdGF0ZShfX2xlZnRfc3BsaXQsIF9fbWlkZGxlLCBfX3JpZ2h0X3NwbGl0KTsKKyAgICAgIHN0ZDo6YWR2YW5jZShfX2xlZnRfc3BsaXQsIHN0ZDo6ZGlzdGFuY2UoX19taWRkbGUsIF9fcmlnaHRfc3BsaXQpKTsKKyAgICAgIHJldHVybiBfX2xlZnRfc3BsaXQ7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uLi4uCisgIC8vLyBSZXF1aXJlcyBfX2ZpcnN0ICE9IF9fbGFzdCBhbmQgIV9fcHJlZCgqX19maXJzdCkKKyAgLy8vIGFuZCBfX2xlbiA9PSBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpLgorICAvLy8KKyAgLy8vICFfX3ByZWQoKl9fZmlyc3QpIGFsbG93cyB1cyB0byBndWFyYW50ZWUgdGhhdCB3ZSBkb24ndAorICAvLy8gbW92ZS1hc3NpZ24gYW4gZWxlbWVudCBvbnRvIGl0c2VsZi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1BvaW50ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGUsCisJICAgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3N0YWJsZV9wYXJ0aXRpb25fYWRhcHRpdmUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkJCV9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkJCV9QcmVkaWNhdGUgX19wcmVkLCBfRGlzdGFuY2UgX19sZW4sCisJCQkJX1BvaW50ZXIgX19idWZmZXIsCisJCQkJX0Rpc3RhbmNlIF9fYnVmZmVyX3NpemUpCisgICAgeworICAgICAgaWYgKF9fbGVuIDw9IF9fYnVmZmVyX3NpemUpCisJeworCSAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdDEgPSBfX2ZpcnN0OworCSAgX1BvaW50ZXIgX19yZXN1bHQyID0gX19idWZmZXI7CisJICAvLyBUaGUgcHJlY29uZGl0aW9uIGd1YXJhbnRlZXMgdGhhdCAhX19wcmVkKCpfX2ZpcnN0KSwgc28KKwkgIC8vIG1vdmUgdGhhdCBlbGVtZW50IHRvIHRoZSBidWZmZXIgYmVmb3JlIHN0YXJ0aW5nIHRoZSBsb29wLgorCSAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugb25seSBjYWxsIF9fcHJlZCBvbmNlIHBlciBlbGVtZW50LgorCSAgKl9fcmVzdWx0MiA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QpOworCSAgKytfX3Jlc3VsdDI7CisJICArK19fZmlyc3Q7CisJICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwkgICAgaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICAgICAgeworCQkqX19yZXN1bHQxID0gX0dMSUJDWFhfTU9WRSgqX19maXJzdCk7CisJCSsrX19yZXN1bHQxOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJKl9fcmVzdWx0MiA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QpOworCQkrK19fcmVzdWx0MjsKKwkgICAgICB9CisJICBfR0xJQkNYWF9NT1ZFMyhfX2J1ZmZlciwgX19yZXN1bHQyLCBfX3Jlc3VsdDEpOworCSAgcmV0dXJuIF9fcmVzdWx0MTsKKwl9CisgICAgICBlbHNlCisJeworCSAgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3Q7CisJICBzdGQ6OmFkdmFuY2UoX19taWRkbGUsIF9fbGVuIC8gMik7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGVmdF9zcGxpdCA9CisJICAgIHN0ZDo6X19zdGFibGVfcGFydGl0aW9uX2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX3ByZWQsCisJCQkJCSAgICAgX19sZW4gLyAyLCBfX2J1ZmZlciwKKwkJCQkJICAgICBfX2J1ZmZlcl9zaXplKTsKKwkgIC8vIEFkdmFuY2UgcGFzdCB0cnVlLXByZWRpY2F0ZSB2YWx1ZXMgdG8gc2F0aXNmeSB0aGlzCisJICAvLyBmdW5jdGlvbidzIHByZWNvbmRpdGlvbnMuCisJICBfRGlzdGFuY2UgX19yaWdodF9sZW4gPSBfX2xlbiAtIF9fbGVuIC8gMjsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19yaWdodF9zcGxpdCA9CisJICAgIHN0ZDo6X19maW5kX2lmX25vdF9uKF9fbWlkZGxlLCBfX3JpZ2h0X2xlbiwgX19wcmVkKTsKKwkgIGlmIChfX3JpZ2h0X2xlbikKKwkgICAgX19yaWdodF9zcGxpdCA9CisJICAgICAgc3RkOjpfX3N0YWJsZV9wYXJ0aXRpb25fYWRhcHRpdmUoX19yaWdodF9zcGxpdCwgX19sYXN0LCBfX3ByZWQsCisJCQkJCSAgICAgICBfX3JpZ2h0X2xlbiwKKwkJCQkJICAgICAgIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplKTsKKwkgIHN0ZDo6cm90YXRlKF9fbGVmdF9zcGxpdCwgX19taWRkbGUsIF9fcmlnaHRfc3BsaXQpOworCSAgc3RkOjphZHZhbmNlKF9fbGVmdF9zcGxpdCwgc3RkOjpkaXN0YW5jZShfX21pZGRsZSwgX19yaWdodF9zcGxpdCkpOworCSAgcmV0dXJuIF9fbGVmdF9zcGxpdDsKKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIE1vdmUgZWxlbWVudHMgZm9yIHdoaWNoIGEgcHJlZGljYXRlIGlzIHRydWUgdG8gdGhlIGJlZ2lubmluZworICAgKiAgICAgICAgIG9mIGEgc2VxdWVuY2UsIHByZXNlcnZpbmcgcmVsYXRpdmUgb3JkZXJpbmcuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcHJlZCAgICBBIHByZWRpY2F0ZSBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgQHAgbWlkZGxlIHN1Y2ggdGhhdCBAcCBfX3ByZWQoaSkgaXMgdHJ1ZSBmb3IgZWFjaAorICAgKiAgaXRlcmF0b3IgQHAgaSBpbiB0aGUgcmFuZ2UgQHAgW2ZpcnN0LG1pZGRsZSkgYW5kIGZhbHNlIGZvciBlYWNoIEBwIGkKKyAgICogIGluIHRoZSByYW5nZSBAcCBbbWlkZGxlLGxhc3QpLgorICAgKgorICAgKiAgUGVyZm9ybXMgdGhlIHNhbWUgZnVuY3Rpb24gYXMgQHAgcGFydGl0aW9uKCkgd2l0aCB0aGUgYWRkaXRpb25hbAorICAgKiAgZ3VhcmFudGVlIHRoYXQgdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIGVsZW1lbnRzIGluIGVhY2ggZ3JvdXAgaXMKKyAgICogIHByZXNlcnZlZCwgc28gYW55IHR3byBlbGVtZW50cyBAcCB4IGFuZCBAcCB5IGluIHRoZSByYW5nZQorICAgKiAgQHAgW19fZmlyc3QsX19sYXN0KSBzdWNoIHRoYXQgQHAgX19wcmVkKHgpPT1fX3ByZWQoeSkgd2lsbCBoYXZlIHRoZSBzYW1lCisgICAqICByZWxhdGl2ZSBvcmRlcmluZyBhZnRlciBjYWxsaW5nIEBwIHN0YWJsZV9wYXJ0aXRpb24oKS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgc3RhYmxlX3BhcnRpdGlvbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBfX2ZpcnN0ID0gc3RkOjpfX2ZpbmRfaWZfbm90KF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkKTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2ZpcnN0OworICAgICAgZWxzZQorCXsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJICAgIF9WYWx1ZVR5cGU7CisJICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJICAgIF9EaXN0YW5jZVR5cGU7CisKKwkgIF9UZW1wb3JhcnlfYnVmZmVyPF9Gb3J3YXJkSXRlcmF0b3IsIF9WYWx1ZVR5cGU+IF9fYnVmKF9fZmlyc3QsCisJCQkJCQkJCV9fbGFzdCk7CisJaWYgKF9fYnVmLnNpemUoKSA+IDApCisJICByZXR1cm4KKwkgICAgc3RkOjpfX3N0YWJsZV9wYXJ0aXRpb25fYWRhcHRpdmUoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsCisJCQkJCSAgX0Rpc3RhbmNlVHlwZShfX2J1Zi5yZXF1ZXN0ZWRfc2l6ZSgpKSwKKwkJCQkJICBfX2J1Zi5iZWdpbigpLAorCQkJCQkgIF9EaXN0YW5jZVR5cGUoX19idWYuc2l6ZSgpKSk7CisJZWxzZQorCSAgcmV0dXJuCisJICAgIHN0ZDo6X19pbnBsYWNlX3N0YWJsZV9wYXJ0aXRpb24oX19maXJzdCwgX19wcmVkLAorCQkJCQkgX0Rpc3RhbmNlVHlwZShfX2J1Zi5yZXF1ZXN0ZWRfc2l6ZSgpKSk7CisJfQorICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX19oZWFwX3NlbGVjdChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19taWRkbGUsCisJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBzdGQ6Om1ha2VfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSk7CisgICAgICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2kgPSBfX21pZGRsZTsgX19pIDwgX19sYXN0OyArK19faSkKKwlpZiAoKl9faSA8ICpfX2ZpcnN0KQorCSAgc3RkOjpfX3BvcF9oZWFwKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2kpOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9faGVhcF9zZWxlY3QoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbWlkZGxlLAorCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBzdGQ6Om1ha2VfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSwgX19jb21wKTsKKyAgICAgIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faSA9IF9fbWlkZGxlOyBfX2kgPCBfX2xhc3Q7ICsrX19pKQorCWlmIChfX2NvbXAoKl9faSwgKl9fZmlyc3QpKQorCSAgc3RkOjpfX3BvcF9oZWFwKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2ksIF9fY29tcCk7CisgICAgfQorCisgIC8vIHBhcnRpYWxfc29ydAorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgdGhlIHNtYWxsZXN0IGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yZXN1bHRfZmlyc3QgICBBIHJhbmRvbS1hY2Nlc3MgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0X2xhc3QgICAgQW5vdGhlciByYW5kb20tYWNjZXNzIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIEFuIGl0ZXJhdG9yIGluZGljYXRpbmcgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLgorICAgKgorICAgKiAgQ29waWVzIGFuZCBzb3J0cyB0aGUgc21hbGxlc3QgTiB2YWx1ZXMgZnJvbSB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KQorICAgKiAgdG8gdGhlIHJhbmdlIGJlZ2lubmluZyBhdCBAcCBfX3Jlc3VsdF9maXJzdCwgd2hlcmUgdGhlIG51bWJlciBvZgorICAgKiAgZWxlbWVudHMgdG8gYmUgY29waWVkLCBAcCBOLCBpcyB0aGUgc21hbGxlciBvZiBAcCAoX19sYXN0LV9fZmlyc3QpIGFuZAorICAgKiAgQHAgKF9fcmVzdWx0X2xhc3QtX19yZXN1bHRfZmlyc3QpLgorICAgKiAgQWZ0ZXIgdGhlIHNvcnQgaWYgQGUgaSBhbmQgQGUgaiBhcmUgaXRlcmF0b3JzIGluIHRoZSByYW5nZQorICAgKiAgQHAgW19fcmVzdWx0X2ZpcnN0LF9fcmVzdWx0X2ZpcnN0K04pIHN1Y2ggdGhhdCBpIHByZWNlZGVzIGogdGhlbgorICAgKiAgKmo8KmkgaXMgZmFsc2UuCisgICAqICBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgQHAgX19yZXN1bHRfZmlyc3QrTi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBwYXJ0aWFsX3NvcnRfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdF9maXJzdCwKKwkJICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcmVzdWx0X2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX0lucHV0VmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9PdXRwdXRWYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfSW5wdXRWYWx1ZVR5cGUsCisJCQkJICBfT3V0cHV0VmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X0lucHV0VmFsdWVUeXBlLAorCQkJCSAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRWYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9PdXRwdXRWYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X2xhc3QpOworCisgICAgICBpZiAoX19yZXN1bHRfZmlyc3QgPT0gX19yZXN1bHRfbGFzdCkKKwlyZXR1cm4gX19yZXN1bHRfbGFzdDsKKyAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdF9yZWFsX2xhc3QgPSBfX3Jlc3VsdF9maXJzdDsKKyAgICAgIHdoaWxlKF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fcmVzdWx0X3JlYWxfbGFzdCAhPSBfX3Jlc3VsdF9sYXN0KQorCXsKKwkgICpfX3Jlc3VsdF9yZWFsX2xhc3QgPSAqX19maXJzdDsKKwkgICsrX19yZXN1bHRfcmVhbF9sYXN0OworCSAgKytfX2ZpcnN0OworCX0KKyAgICAgIHN0ZDo6bWFrZV9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9yZWFsX2xhc3QpOworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIGlmICgqX19maXJzdCA8ICpfX3Jlc3VsdF9maXJzdCkKKwkgICAgc3RkOjpfX2FkanVzdF9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfRGlzdGFuY2VUeXBlKDApLAorCQkJICAgICAgIF9EaXN0YW5jZVR5cGUoX19yZXN1bHRfcmVhbF9sYXN0CisJCQkJCSAgICAgLSBfX3Jlc3VsdF9maXJzdCksCisJCQkgICAgICAgX0lucHV0VmFsdWVUeXBlKCpfX2ZpcnN0KSk7CisJICArK19fZmlyc3Q7CisJfQorICAgICAgc3RkOjpzb3J0X2hlYXAoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X3JlYWxfbGFzdCk7CisgICAgICByZXR1cm4gX19yZXN1bHRfcmVhbF9sYXN0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBDb3B5IHRoZSBzbWFsbGVzdCBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHVzaW5nIGEgcHJlZGljYXRlIGZvcgorICAgKiAgICAgICAgIGNvbXBhcmlzb24uCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yZXN1bHRfZmlyc3QgICBBIHJhbmRvbS1hY2Nlc3MgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0X2xhc3QgICAgQW5vdGhlciByYW5kb20tYWNjZXNzIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICAgQSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcmV0dXJuICAgQW4gaXRlcmF0b3IgaW5kaWNhdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBDb3BpZXMgYW5kIHNvcnRzIHRoZSBzbWFsbGVzdCBOIHZhbHVlcyBmcm9tIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpCisgICAqICB0byB0aGUgcmFuZ2UgYmVnaW5uaW5nIGF0IEBwIHJlc3VsdF9maXJzdCwgd2hlcmUgdGhlIG51bWJlciBvZgorICAgKiAgZWxlbWVudHMgdG8gYmUgY29waWVkLCBAcCBOLCBpcyB0aGUgc21hbGxlciBvZiBAcCAoX19sYXN0LV9fZmlyc3QpIGFuZAorICAgKiAgQHAgKF9fcmVzdWx0X2xhc3QtX19yZXN1bHRfZmlyc3QpLgorICAgKiAgQWZ0ZXIgdGhlIHNvcnQgaWYgQGUgaSBhbmQgQGUgaiBhcmUgaXRlcmF0b3JzIGluIHRoZSByYW5nZQorICAgKiAgQHAgW19fcmVzdWx0X2ZpcnN0LF9fcmVzdWx0X2ZpcnN0K04pIHN1Y2ggdGhhdCBpIHByZWNlZGVzIGogdGhlbgorICAgKiAgQHAgX19jb21wKCpqLCppKSBpcyBmYWxzZS4KKyAgICogIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBAcCBfX3Jlc3VsdF9maXJzdCtOLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBwYXJ0aWFsX3NvcnRfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdF9maXJzdCwKKwkJICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcmVzdWx0X2xhc3QsCisJCSAgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfSW5wdXRWYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX091dHB1dFZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X0lucHV0VmFsdWVUeXBlLAorCQkJCSAgX091dHB1dFZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfSW5wdXRWYWx1ZVR5cGUsIF9PdXRwdXRWYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX091dHB1dFZhbHVlVHlwZSwgX091dHB1dFZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX3Jlc3VsdF9maXJzdCwgX19yZXN1bHRfbGFzdCk7CisKKyAgICAgIGlmIChfX3Jlc3VsdF9maXJzdCA9PSBfX3Jlc3VsdF9sYXN0KQorCXJldHVybiBfX3Jlc3VsdF9sYXN0OworICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcmVzdWx0X3JlYWxfbGFzdCA9IF9fcmVzdWx0X2ZpcnN0OworICAgICAgd2hpbGUoX19maXJzdCAhPSBfX2xhc3QgJiYgX19yZXN1bHRfcmVhbF9sYXN0ICE9IF9fcmVzdWx0X2xhc3QpCisJeworCSAgKl9fcmVzdWx0X3JlYWxfbGFzdCA9ICpfX2ZpcnN0OworCSAgKytfX3Jlc3VsdF9yZWFsX2xhc3Q7CisJICArK19fZmlyc3Q7CisJfQorICAgICAgc3RkOjptYWtlX2hlYXAoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X3JlYWxfbGFzdCwgX19jb21wKTsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICBpZiAoX19jb21wKCpfX2ZpcnN0LCAqX19yZXN1bHRfZmlyc3QpKQorCSAgICBzdGQ6Ol9fYWRqdXN0X2hlYXAoX19yZXN1bHRfZmlyc3QsIF9EaXN0YW5jZVR5cGUoMCksCisJCQkgICAgICAgX0Rpc3RhbmNlVHlwZShfX3Jlc3VsdF9yZWFsX2xhc3QKKwkJCQkJICAgICAtIF9fcmVzdWx0X2ZpcnN0KSwKKwkJCSAgICAgICBfSW5wdXRWYWx1ZVR5cGUoKl9fZmlyc3QpLAorCQkJICAgICAgIF9fY29tcCk7CisJICArK19fZmlyc3Q7CisJfQorICAgICAgc3RkOjpzb3J0X2hlYXAoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X3JlYWxfbGFzdCwgX19jb21wKTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdF9yZWFsX2xhc3Q7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc29ydCByb3V0aW5lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9fdW5ndWFyZGVkX2xpbmVhcl9pbnNlcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9fdmFsID0gX0dMSUJDWFhfTU9WRSgqX19sYXN0KTsKKyAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX25leHQgPSBfX2xhc3Q7CisgICAgICAtLV9fbmV4dDsKKyAgICAgIHdoaWxlIChfX3ZhbCA8ICpfX25leHQpCisJeworCSAgKl9fbGFzdCA9IF9HTElCQ1hYX01PVkUoKl9fbmV4dCk7CisJICBfX2xhc3QgPSBfX25leHQ7CisJICAtLV9fbmV4dDsKKwl9CisgICAgICAqX19sYXN0ID0gX0dMSUJDWFhfTU9WRShfX3ZhbCk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc29ydCByb3V0aW5lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX3VuZ3VhcmRlZF9saW5lYXJfaW5zZXJ0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJCQkgICAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfX3ZhbCA9IF9HTElCQ1hYX01PVkUoKl9fbGFzdCk7CisgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19uZXh0ID0gX19sYXN0OworICAgICAgLS1fX25leHQ7CisgICAgICB3aGlsZSAoX19jb21wKF9fdmFsLCAqX19uZXh0KSkKKwl7CisJICAqX19sYXN0ID0gX0dMSUJDWFhfTU9WRSgqX19uZXh0KTsKKwkgIF9fbGFzdCA9IF9fbmV4dDsKKwkgIC0tX19uZXh0OworCX0KKyAgICAgICpfX2xhc3QgPSBfR0xJQkNYWF9NT1ZFKF9fdmFsKTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzb3J0IHJvdXRpbmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX19pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm47CisKKyAgICAgIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKKwl7CisJICBpZiAoKl9faSA8ICpfX2ZpcnN0KQorCSAgICB7CisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwkJX192YWwgPSBfR0xJQkNYWF9NT1ZFKCpfX2kpOworCSAgICAgIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKF9fZmlyc3QsIF9faSwgX19pICsgMSk7CisJICAgICAgKl9fZmlyc3QgPSBfR0xJQkNYWF9NT1ZFKF9fdmFsKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBzdGQ6Ol9fdW5ndWFyZGVkX2xpbmVhcl9pbnNlcnQoX19pKTsKKwl9CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc29ydCByb3V0aW5lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX2luc2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsKKworICAgICAgZm9yIChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19pID0gX19maXJzdCArIDE7IF9faSAhPSBfX2xhc3Q7ICsrX19pKQorCXsKKwkgIGlmIChfX2NvbXAoKl9faSwgKl9fZmlyc3QpKQorCSAgICB7CisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwkJX192YWwgPSBfR0xJQkNYWF9NT1ZFKCpfX2kpOworCSAgICAgIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKF9fZmlyc3QsIF9faSwgX19pICsgMSk7CisJICAgICAgKl9fZmlyc3QgPSBfR0xJQkNYWF9NT1ZFKF9fdmFsKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBzdGQ6Ol9fdW5ndWFyZGVkX2xpbmVhcl9pbnNlcnQoX19pLCBfX2NvbXApOworCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzb3J0IHJvdXRpbmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdW5ndWFyZGVkX2luc2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faSA9IF9fZmlyc3Q7IF9faSAhPSBfX2xhc3Q7ICsrX19pKQorCXN0ZDo6X191bmd1YXJkZWRfbGluZWFyX2luc2VydChfX2kpOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdW5ndWFyZGVkX2luc2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgZm9yIChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19pID0gX19maXJzdDsgX19pICE9IF9fbGFzdDsgKytfX2kpCisJc3RkOjpfX3VuZ3VhcmRlZF9saW5lYXJfaW5zZXJ0KF9faSwgX19jb21wKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAZG9jdG9kbworICAgKiAgVGhpcyBjb250cm9scyBzb21lIGFzcGVjdCBvZiB0aGUgc29ydCByb3V0aW5lcy4KKyAgKi8KKyAgZW51bSB7IF9TX3RocmVzaG9sZCA9IDE2IH07CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzb3J0IHJvdXRpbmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX19maW5hbF9pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgaWYgKF9fbGFzdCAtIF9fZmlyc3QgPiBpbnQoX1NfdGhyZXNob2xkKSkKKwl7CisJICBzdGQ6Ol9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19maXJzdCArIGludChfU190aHJlc2hvbGQpKTsKKwkgIHN0ZDo6X191bmd1YXJkZWRfaW5zZXJ0aW9uX3NvcnQoX19maXJzdCArIGludChfU190aHJlc2hvbGQpLCBfX2xhc3QpOworCX0KKyAgICAgIGVsc2UKKwlzdGQ6Ol9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0KTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzb3J0IHJvdXRpbmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fZmluYWxfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgaWYgKF9fbGFzdCAtIF9fZmlyc3QgPiBpbnQoX1NfdGhyZXNob2xkKSkKKwl7CisJICBzdGQ6Ol9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19maXJzdCArIGludChfU190aHJlc2hvbGQpLCBfX2NvbXApOworCSAgc3RkOjpfX3VuZ3VhcmRlZF9pbnNlcnRpb25fc29ydChfX2ZpcnN0ICsgaW50KF9TX3RocmVzaG9sZCksIF9fbGFzdCwKKwkJCQkJICBfX2NvbXApOworCX0KKyAgICAgIGVsc2UKKwlzdGQ6Ol9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbi4uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBfX3VuZ3VhcmRlZF9wYXJ0aXRpb24oX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9UcCYgX19waXZvdCkKKyAgICB7CisgICAgICB3aGlsZSAodHJ1ZSkKKwl7CisJICB3aGlsZSAoKl9fZmlyc3QgPCBfX3Bpdm90KQorCSAgICArK19fZmlyc3Q7CisJICAtLV9fbGFzdDsKKwkgIHdoaWxlIChfX3Bpdm90IDwgKl9fbGFzdCkKKwkgICAgLS1fX2xhc3Q7CisJICBpZiAoIShfX2ZpcnN0IDwgX19sYXN0KSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX2xhc3QpOworCSAgKytfX2ZpcnN0OworCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24uLi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorICAgIF9fdW5ndWFyZGVkX3BhcnRpdGlvbihfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgY29uc3QgX1RwJiBfX3Bpdm90LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgd2hpbGUgKHRydWUpCisJeworCSAgd2hpbGUgKF9fY29tcCgqX19maXJzdCwgX19waXZvdCkpCisJICAgICsrX19maXJzdDsKKwkgIC0tX19sYXN0OworCSAgd2hpbGUgKF9fY29tcChfX3Bpdm90LCAqX19sYXN0KSkKKwkgICAgLS1fX2xhc3Q7CisJICBpZiAoIShfX2ZpcnN0IDwgX19sYXN0KSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX2xhc3QpOworCSAgKytfX2ZpcnN0OworCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24uLi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBfX3VuZ3VhcmRlZF9wYXJ0aXRpb25fcGl2b3QoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkJX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpIC8gMjsKKyAgICAgIHN0ZDo6X19tb3ZlX21lZGlhbl90b19maXJzdChfX2ZpcnN0LCBfX2ZpcnN0ICsgMSwgX19taWQsIF9fbGFzdCAtIDEpOworICAgICAgcmV0dXJuIHN0ZDo6X191bmd1YXJkZWRfcGFydGl0aW9uKF9fZmlyc3QgKyAxLCBfX2xhc3QsICpfX2ZpcnN0KTsKKyAgICB9CisKKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbi4uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBfX3VuZ3VhcmRlZF9wYXJ0aXRpb25fcGl2b3QoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkJX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZCA9IF9fZmlyc3QgKyAoX19sYXN0IC0gX19maXJzdCkgLyAyOworICAgICAgc3RkOjpfX21vdmVfbWVkaWFuX3RvX2ZpcnN0KF9fZmlyc3QsIF9fZmlyc3QgKyAxLCBfX21pZCwgX19sYXN0IC0gMSwKKwkJCQkgIF9fY29tcCk7CisgICAgICByZXR1cm4gc3RkOjpfX3VuZ3VhcmRlZF9wYXJ0aXRpb24oX19maXJzdCArIDEsIF9fbGFzdCwgKl9fZmlyc3QsIF9fY29tcCk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc29ydCByb3V0aW5lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplPgorICAgIHZvaWQKKyAgICBfX2ludHJvc29ydF9sb29wKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgX1NpemUgX19kZXB0aF9saW1pdCkKKyAgICB7CisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IGludChfU190aHJlc2hvbGQpKQorCXsKKwkgIGlmIChfX2RlcHRoX2xpbWl0ID09IDApCisJICAgIHsKKwkgICAgICBfR0xJQkNYWF9TVERfQTo6cGFydGlhbF9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19sYXN0KTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIC0tX19kZXB0aF9saW1pdDsKKwkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2N1dCA9CisJICAgIHN0ZDo6X191bmd1YXJkZWRfcGFydGl0aW9uX3Bpdm90KF9fZmlyc3QsIF9fbGFzdCk7CisJICBzdGQ6Ol9faW50cm9zb3J0X2xvb3AoX19jdXQsIF9fbGFzdCwgX19kZXB0aF9saW1pdCk7CisJICBfX2xhc3QgPSBfX2N1dDsKKwl9CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc29ydCByb3V0aW5lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19pbnRyb3NvcnRfbG9vcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCQkgICAgIF9TaXplIF9fZGVwdGhfbGltaXQsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IGludChfU190aHJlc2hvbGQpKQorCXsKKwkgIGlmIChfX2RlcHRoX2xpbWl0ID09IDApCisJICAgIHsKKwkgICAgICBfR0xJQkNYWF9TVERfQTo6cGFydGlhbF9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19sYXN0LCBfX2NvbXApOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgLS1fX2RlcHRoX2xpbWl0OworCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fY3V0ID0KKwkgICAgc3RkOjpfX3VuZ3VhcmRlZF9wYXJ0aXRpb25fcGl2b3QoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworCSAgc3RkOjpfX2ludHJvc29ydF9sb29wKF9fY3V0LCBfX2xhc3QsIF9fZGVwdGhfbGltaXQsIF9fY29tcCk7CisJICBfX2xhc3QgPSBfX2N1dDsKKwl9CisgICAgfQorCisgIC8vIHNvcnQKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplPgorICAgIHZvaWQKKyAgICBfX2ludHJvc2VsZWN0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19udGgsCisJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX1NpemUgX19kZXB0aF9saW1pdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPiAzKQorCXsKKwkgIGlmIChfX2RlcHRoX2xpbWl0ID09IDApCisJICAgIHsKKwkgICAgICBzdGQ6Ol9faGVhcF9zZWxlY3QoX19maXJzdCwgX19udGggKyAxLCBfX2xhc3QpOworCisJICAgICAgLy8gUGxhY2UgdGhlIG50aCBsYXJnZXN0IGVsZW1lbnQgaW4gaXRzIGZpbmFsIHBvc2l0aW9uLgorCSAgICAgIHN0ZDo6aXRlcl9zd2FwKF9fZmlyc3QsIF9fbnRoKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIC0tX19kZXB0aF9saW1pdDsKKwkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2N1dCA9CisJICAgIHN0ZDo6X191bmd1YXJkZWRfcGFydGl0aW9uX3Bpdm90KF9fZmlyc3QsIF9fbGFzdCk7CisJICBpZiAoX19jdXQgPD0gX19udGgpCisJICAgIF9fZmlyc3QgPSBfX2N1dDsKKwkgIGVsc2UKKwkgICAgX19sYXN0ID0gX19jdXQ7CisJfQorICAgICAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX2ludHJvc2VsZWN0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19udGgsCisJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX1NpemUgX19kZXB0aF9saW1pdCwKKwkJICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0ID4gMykKKwl7CisJICBpZiAoX19kZXB0aF9saW1pdCA9PSAwKQorCSAgICB7CisJICAgICAgc3RkOjpfX2hlYXBfc2VsZWN0KF9fZmlyc3QsIF9fbnRoICsgMSwgX19sYXN0LCBfX2NvbXApOworCSAgICAgIC8vIFBsYWNlIHRoZSBudGggbGFyZ2VzdCBlbGVtZW50IGluIGl0cyBmaW5hbCBwb3NpdGlvbi4KKwkgICAgICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX250aCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICAtLV9fZGVwdGhfbGltaXQ7CisJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19jdXQgPQorCSAgICBzdGQ6Ol9fdW5ndWFyZGVkX3BhcnRpdGlvbl9waXZvdChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7CisJICBpZiAoX19jdXQgPD0gX19udGgpCisJICAgIF9fZmlyc3QgPSBfX2N1dDsKKwkgIGVsc2UKKwkgICAgX19sYXN0ID0gX19jdXQ7CisJfQorICAgICAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKKyAgICB9CisKKyAgLy8gbnRoX2VsZW1lbnQKKworICAvLyBsb3dlcl9ib3VuZCBtb3ZlZCB0byBzdGxfYWxnb2Jhc2UuaAorCisgIC8qKgorICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiB3aGljaCBAcCBfX3ZhbCBjb3VsZCBiZSBpbnNlcnRlZAorICAgKiAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG9yZGVyaW5nLgorICAgKiAgQGluZ3JvdXAgYmluYXJ5X3NlYXJjaF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fdmFsICAgICBUaGUgc2VhcmNoIHRlcm0uCisgICAqICBAcGFyYW0gIF9fY29tcCAgICBBIGZ1bmN0b3IgdG8gdXNlIGZvciBjb21wYXJpc29ucy4KKyAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgPGVtPm5vdCBsZXNzCisgICAqICAgICAgICAgICB0aGFuPC9lbT4gQHAgX192YWwsIG9yIGVuZCgpIGlmIGV2ZXJ5IGVsZW1lbnQgaXMgbGVzcworICAgKiAgICAgICAgICAgdGhhbiBAcCBfX3ZhbC4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gc2hvdWxkIGhhdmUgdGhlIHNhbWUgZWZmZWN0cyBvbiBvcmRlcmluZyBhcworICAgKiAgdGhlIGZ1bmN0aW9uIHVzZWQgZm9yIHRoZSBpbml0aWFsIHNvcnQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIGxvd2VyX2JvdW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCWNvbnN0IF9UcCYgX192YWwsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUsIF9UcD4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfbG93ZXJfcHJlZChfX2ZpcnN0LCBfX2xhc3QsCisJCQkJCQlfX3ZhbCwgX19jb21wKTsKKworICAgICAgX0Rpc3RhbmNlVHlwZSBfX2xlbiA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgd2hpbGUgKF9fbGVuID4gMCkKKwl7CisJICBfRGlzdGFuY2VUeXBlIF9faGFsZiA9IF9fbGVuID4+IDE7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkZGxlID0gX19maXJzdDsKKwkgIHN0ZDo6YWR2YW5jZShfX21pZGRsZSwgX19oYWxmKTsKKwkgIGlmIChfX2NvbXAoKl9fbWlkZGxlLCBfX3ZhbCkpCisJICAgIHsKKwkgICAgICBfX2ZpcnN0ID0gX19taWRkbGU7CisJICAgICAgKytfX2ZpcnN0OworCSAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOworCSAgICB9CisJICBlbHNlCisJICAgIF9fbGVuID0gX19oYWxmOworCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kcyB0aGUgbGFzdCBwb3NpdGlvbiBpbiB3aGljaCBAcCBfX3ZhbCBjb3VsZCBiZSBpbnNlcnRlZAorICAgKiAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG9yZGVyaW5nLgorICAgKiAgQGluZ3JvdXAgYmluYXJ5X3NlYXJjaF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fdmFsICAgICBUaGUgc2VhcmNoIHRlcm0uCisgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCBncmVhdGVyIHRoYW4gQHAgX192YWwsCisgICAqICAgICAgICAgICBvciBlbmQoKSBpZiBubyBlbGVtZW50cyBhcmUgZ3JlYXRlciB0aGFuIEBwIF9fdmFsLgorICAgKiAgQGluZ3JvdXAgYmluYXJ5X3NlYXJjaF9hbGdvcml0aG1zCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgdXBwZXJfYm91bmQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1RwLCBfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF91cHBlcihfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKKworICAgICAgX0Rpc3RhbmNlVHlwZSBfX2xlbiA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgd2hpbGUgKF9fbGVuID4gMCkKKwl7CisJICBfRGlzdGFuY2VUeXBlIF9faGFsZiA9IF9fbGVuID4+IDE7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkZGxlID0gX19maXJzdDsKKwkgIHN0ZDo6YWR2YW5jZShfX21pZGRsZSwgX19oYWxmKTsKKwkgIGlmIChfX3ZhbCA8ICpfX21pZGRsZSkKKwkgICAgX19sZW4gPSBfX2hhbGY7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfX2ZpcnN0ID0gX19taWRkbGU7CisJICAgICAgKytfX2ZpcnN0OworCSAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBsYXN0IHBvc2l0aW9uIGluIHdoaWNoIEBwIF9fdmFsIGNvdWxkIGJlIGluc2VydGVkCisgICAqICAgICAgICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgb3JkZXJpbmcuCisgICAqICBAaW5ncm91cCBiaW5hcnlfc2VhcmNoX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX192YWwgICAgIFRoZSBzZWFyY2ggdGVybS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIEEgZnVuY3RvciB0byB1c2UgZm9yIGNvbXBhcmlzb25zLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgZ3JlYXRlciB0aGFuIEBwIF9fdmFsLAorICAgKiAgICAgICAgICAgb3IgZW5kKCkgaWYgbm8gZWxlbWVudHMgYXJlIGdyZWF0ZXIgdGhhbiBAcCBfX3ZhbC4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gc2hvdWxkIGhhdmUgdGhlIHNhbWUgZWZmZWN0cyBvbiBvcmRlcmluZyBhcworICAgKiAgdGhlIGZ1bmN0aW9uIHVzZWQgZm9yIHRoZSBpbml0aWFsIHNvcnQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIHVwcGVyX2JvdW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCWNvbnN0IF9UcCYgX192YWwsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9UcCwgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfdXBwZXJfcHJlZChfX2ZpcnN0LCBfX2xhc3QsCisJCQkJCQlfX3ZhbCwgX19jb21wKTsKKworICAgICAgX0Rpc3RhbmNlVHlwZSBfX2xlbiA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgd2hpbGUgKF9fbGVuID4gMCkKKwl7CisJICBfRGlzdGFuY2VUeXBlIF9faGFsZiA9IF9fbGVuID4+IDE7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkZGxlID0gX19maXJzdDsKKwkgIHN0ZDo6YWR2YW5jZShfX21pZGRsZSwgX19oYWxmKTsKKwkgIGlmIChfX2NvbXAoX192YWwsICpfX21pZGRsZSkpCisJICAgIF9fbGVuID0gX19oYWxmOworCSAgZWxzZQorCSAgICB7CisJICAgICAgX19maXJzdCA9IF9fbWlkZGxlOworCSAgICAgICsrX19maXJzdDsKKwkgICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kcyB0aGUgbGFyZ2VzdCBzdWJyYW5nZSBpbiB3aGljaCBAcCBfX3ZhbCBjb3VsZCBiZSBpbnNlcnRlZAorICAgKiAgICAgICAgIGF0IGFueSBwbGFjZSBpbiBpdCB3aXRob3V0IGNoYW5naW5nIHRoZSBvcmRlcmluZy4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ZhbCAgICAgVGhlIHNlYXJjaCB0ZXJtLgorICAgKiAgQHJldHVybiAgQW4gcGFpciBvZiBpdGVyYXRvcnMgZGVmaW5pbmcgdGhlIHN1YnJhbmdlLgorICAgKiAgQGluZ3JvdXAgYmluYXJ5X3NlYXJjaF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICogIEBjb2RlCisgICAqICAgIHN0ZDo6bWFrZV9wYWlyKGxvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwpLAorICAgKiAgICAgICAgICAgICAgICAgICB1cHBlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKSkKKyAgICogIEBlbmRjb2RlCisgICAqICBidXQgZG9lcyBub3QgYWN0dWFsbHkgY2FsbCB0aG9zZSBmdW5jdGlvbnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgZXF1YWxfcmFuZ2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZSwgX1RwPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1RwLCBfVmFsdWVUeXBlPikJCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfbG93ZXIoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfdXBwZXIoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7ICAgICAgCisKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgCisgICAgICB3aGlsZSAoX19sZW4gPiAwKQorCXsKKwkgIF9EaXN0YW5jZVR5cGUgX19oYWxmID0gX19sZW4gPj4gMTsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWRkbGUgPSBfX2ZpcnN0OworCSAgc3RkOjphZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOworCSAgaWYgKCpfX21pZGRsZSA8IF9fdmFsKQorCSAgICB7CisJICAgICAgX19maXJzdCA9IF9fbWlkZGxlOworCSAgICAgICsrX19maXJzdDsKKwkgICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKwkgICAgfQorCSAgZWxzZSBpZiAoX192YWwgPCAqX19taWRkbGUpCisJICAgIF9fbGVuID0gX19oYWxmOworCSAgZWxzZQorCSAgICB7CisJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xlZnQgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbWlkZGxlLAorCQkJCQkJCSBfX3ZhbCk7CisJICAgICAgc3RkOjphZHZhbmNlKF9fZmlyc3QsIF9fbGVuKTsKKwkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmlnaHQgPSBzdGQ6OnVwcGVyX2JvdW5kKCsrX19taWRkbGUsIF9fZmlyc3QsCisJCQkJCQkJICBfX3ZhbCk7CisJICAgICAgcmV0dXJuIHBhaXI8X0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvcj4oX19sZWZ0LCBfX3JpZ2h0KTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+KF9fZmlyc3QsIF9fZmlyc3QpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kcyB0aGUgbGFyZ2VzdCBzdWJyYW5nZSBpbiB3aGljaCBAcCBfX3ZhbCBjb3VsZCBiZSBpbnNlcnRlZAorICAgKiAgICAgICAgIGF0IGFueSBwbGFjZSBpbiBpdCB3aXRob3V0IGNoYW5naW5nIHRoZSBvcmRlcmluZy4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX192YWwgICAgIFRoZSBzZWFyY2ggdGVybS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIEEgZnVuY3RvciB0byB1c2UgZm9yIGNvbXBhcmlzb25zLgorICAgKiAgQHJldHVybiAgQW4gcGFpciBvZiBpdGVyYXRvcnMgZGVmaW5pbmcgdGhlIHN1YnJhbmdlLgorICAgKiAgQGluZ3JvdXAgYmluYXJ5X3NlYXJjaF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICogIEBjb2RlCisgICAqICAgIHN0ZDo6bWFrZV9wYWlyKGxvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsIF9fY29tcCksCisgICAqICAgICAgICAgICAgICAgICAgIHVwcGVyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsIF9fY29tcCkpCisgICAqICBAZW5kY29kZQorICAgKiAgYnV0IGRvZXMgbm90IGFjdHVhbGx5IGNhbGwgdGhvc2UgZnVuY3Rpb25zLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHBhaXI8X0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBlcXVhbF9yYW5nZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQljb25zdCBfVHAmIF9fdmFsLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlLCBfVHA+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1RwLCBfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF9sb3dlcl9wcmVkKF9fZmlyc3QsIF9fbGFzdCwKKwkJCQkJCV9fdmFsLCBfX2NvbXApOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX3VwcGVyX3ByZWQoX19maXJzdCwgX19sYXN0LAorCQkJCQkJX192YWwsIF9fY29tcCk7CisKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApCisJeworCSAgX0Rpc3RhbmNlVHlwZSBfX2hhbGYgPSBfX2xlbiA+PiAxOworCSAgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3Q7CisJICBzdGQ6OmFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CisJICBpZiAoX19jb21wKCpfX21pZGRsZSwgX192YWwpKQorCSAgICB7CisJICAgICAgX19maXJzdCA9IF9fbWlkZGxlOworCSAgICAgICsrX19maXJzdDsKKwkgICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKwkgICAgfQorCSAgZWxzZSBpZiAoX19jb21wKF9fdmFsLCAqX19taWRkbGUpKQorCSAgICBfX2xlbiA9IF9faGFsZjsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sZWZ0ID0gc3RkOjpsb3dlcl9ib3VuZChfX2ZpcnN0LCBfX21pZGRsZSwKKwkJCQkJCQkgX192YWwsIF9fY29tcCk7CisJICAgICAgc3RkOjphZHZhbmNlKF9fZmlyc3QsIF9fbGVuKTsKKwkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmlnaHQgPSBzdGQ6OnVwcGVyX2JvdW5kKCsrX19taWRkbGUsIF9fZmlyc3QsCisJCQkJCQkJICBfX3ZhbCwgX19jb21wKTsKKwkgICAgICByZXR1cm4gcGFpcjxfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yPihfX2xlZnQsIF9fcmlnaHQpOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIHBhaXI8X0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvcj4oX19maXJzdCwgX19maXJzdCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIERldGVybWluZXMgd2hldGhlciBhbiBlbGVtZW50IGV4aXN0cyBpbiBhIHJhbmdlLgorICAgKiAgQGluZ3JvdXAgYmluYXJ5X3NlYXJjaF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fdmFsICAgICBUaGUgc2VhcmNoIHRlcm0uCisgICAqICBAcmV0dXJuIFRydWUgaWYgQHAgX192YWwgKG9yIGl0cyBlcXVpdmFsZW50KSBpcyBpbiBbQHAKKyAgICogIF9fZmlyc3QsQHAgX19sYXN0IF0uCisgICAqCisgICAqICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhY3R1YWxseSByZXR1cm4gYW4gaXRlcmF0b3IgdG8gQHAgX192YWwuICBGb3IKKyAgICogIHRoYXQsIHVzZSBzdGQ6OmZpbmQgb3IgYSBjb250YWluZXIncyBzcGVjaWFsaXplZCBmaW5kIG1lbWJlciBmdW5jdGlvbnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBib29sCisgICAgYmluYXJ5X3NlYXJjaChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9UcCwgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfbG93ZXIoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfdXBwZXIoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19pID0gc3RkOjpsb3dlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKKyAgICAgIHJldHVybiBfX2kgIT0gX19sYXN0ICYmICEoX192YWwgPCAqX19pKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGVsZW1lbnQgZXhpc3RzIGluIGEgcmFuZ2UuCisgICAqICBAaW5ncm91cCBiaW5hcnlfc2VhcmNoX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX192YWwgICAgIFRoZSBzZWFyY2ggdGVybS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIEEgZnVuY3RvciB0byB1c2UgZm9yIGNvbXBhcmlzb25zLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAcCBfX3ZhbCAob3IgaXRzIGVxdWl2YWxlbnQpIGlzIGluIEBwIFtfX2ZpcnN0LF9fbGFzdF0uCisgICAqCisgICAqICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhY3R1YWxseSByZXR1cm4gYW4gaXRlcmF0b3IgdG8gQHAgX192YWwuICBGb3IKKyAgICogIHRoYXQsIHVzZSBzdGQ6OmZpbmQgb3IgYSBjb250YWluZXIncyBzcGVjaWFsaXplZCBmaW5kIG1lbWJlciBmdW5jdGlvbnMuCisgICAqCisgICAqICBUaGUgY29tcGFyaXNvbiBmdW5jdGlvbiBzaG91bGQgaGF2ZSB0aGUgc2FtZSBlZmZlY3RzIG9uIG9yZGVyaW5nIGFzCisgICAqICB0aGUgZnVuY3Rpb24gdXNlZCBmb3IgdGhlIGluaXRpYWwgc29ydC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sCisgICAgYmluYXJ5X3NlYXJjaChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9UcCwgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfbG93ZXJfcHJlZChfX2ZpcnN0LCBfX2xhc3QsCisJCQkJCQlfX3ZhbCwgX19jb21wKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF91cHBlcl9wcmVkKF9fZmlyc3QsIF9fbGFzdCwKKwkJCQkJCV9fdmFsLCBfX2NvbXApOworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9faSA9IHN0ZDo6bG93ZXJfYm91bmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCwgX19jb21wKTsKKyAgICAgIHJldHVybiBfX2kgIT0gX19sYXN0ICYmICFib29sKF9fY29tcChfX3ZhbCwgKl9faSkpOworICAgIH0KKworICAvLyBtZXJnZQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgX19tZXJnZV9hZGFwdGl2ZSByb3V0aW5lcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX21vdmVfbWVyZ2VfYWRhcHRpdmUoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJCSAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkJCSAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJeworCSAgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QyKTsKKwkgICAgICArK19fZmlyc3QyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0MSk7CisJICAgICAgKytfX2ZpcnN0MTsKKwkgICAgfQorCSAgKytfX3Jlc3VsdDsKKwl9CisgICAgICBpZiAoX19maXJzdDEgIT0gX19sYXN0MSkKKwlfR0xJQkNYWF9NT1ZFMyhfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIF9fbWVyZ2VfYWRhcHRpdmUgcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fbW92ZV9tZXJnZV9hZGFwdGl2ZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkJICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkJICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCXsKKwkgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gX0dMSUJDWFhfTU9WRSgqX19maXJzdDIpOworCSAgICAgICsrX19maXJzdDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QxKTsKKwkgICAgICArK19fZmlyc3QxOworCSAgICB9CisJICArK19fcmVzdWx0OworCX0KKyAgICAgIGlmIChfX2ZpcnN0MSAhPSBfX2xhc3QxKQorCV9HTElCQ1hYX01PVkUzKF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgX19tZXJnZV9hZGFwdGl2ZSByb3V0aW5lcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEsIHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IzPgorICAgIHZvaWQKKyAgICBfX21vdmVfbWVyZ2VfYWRhcHRpdmVfYmFja3dhcmQoX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19maXJzdDEsCisJCQkJICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19sYXN0MSwKKwkJCQkgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX2ZpcnN0MiwKKwkJCQkgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkJCSAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IzIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKQorCXsKKwkgIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCk7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKwlyZXR1cm47CisKKyAgICAgIC0tX19sYXN0MTsKKyAgICAgIC0tX19sYXN0MjsKKyAgICAgIHdoaWxlICh0cnVlKQorCXsKKwkgIGlmICgqX19sYXN0MiA8ICpfX2xhc3QxKQorCSAgICB7CisJICAgICAgKi0tX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2xhc3QxKTsKKwkgICAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKKwkJeworCQkgIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKF9fZmlyc3QyLCArK19fbGFzdDIsIF9fcmVzdWx0KTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICAtLV9fbGFzdDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICotLV9fcmVzdWx0ID0gX0dMSUJDWFhfTU9WRSgqX19sYXN0Mik7CisJICAgICAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisJCXJldHVybjsKKwkgICAgICAtLV9fbGFzdDI7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgX19tZXJnZV9hZGFwdGl2ZSByb3V0aW5lcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEsIHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IzLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19tb3ZlX21lcmdlX2FkYXB0aXZlX2JhY2t3YXJkKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fZmlyc3QxLAorCQkJCSAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fbGFzdDEsCisJCQkJICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIgX19maXJzdDIsCisJCQkJICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIgX19sYXN0MiwKKwkJCQkgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMyBfX3Jlc3VsdCwKKwkJCQkgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCisJeworCSAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0KTsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorCXJldHVybjsKKworICAgICAgLS1fX2xhc3QxOworICAgICAgLS1fX2xhc3QyOworICAgICAgd2hpbGUgKHRydWUpCisJeworCSAgaWYgKF9fY29tcCgqX19sYXN0MiwgKl9fbGFzdDEpKQorCSAgICB7CisJICAgICAgKi0tX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2xhc3QxKTsKKwkgICAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKKwkJeworCQkgIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKF9fZmlyc3QyLCArK19fbGFzdDIsIF9fcmVzdWx0KTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICAtLV9fbGFzdDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICotLV9fcmVzdWx0ID0gX0dMSUJDWFhfTU9WRSgqX19sYXN0Mik7CisJICAgICAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisJCXJldHVybjsKKwkgICAgICAtLV9fbGFzdDI7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgbWVyZ2Ugcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxLCB0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEKKyAgICBfX3JvdGF0ZV9hZGFwdGl2ZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX2ZpcnN0LAorCQkgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX21pZGRsZSwKKwkJICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19sYXN0LAorCQkgICAgICBfRGlzdGFuY2UgX19sZW4xLCBfRGlzdGFuY2UgX19sZW4yLAorCQkgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX2J1ZmZlciwKKwkJICAgICAgX0Rpc3RhbmNlIF9fYnVmZmVyX3NpemUpCisgICAgeworICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIgX19idWZmZXJfZW5kOworICAgICAgaWYgKF9fbGVuMSA+IF9fbGVuMiAmJiBfX2xlbjIgPD0gX19idWZmZXJfc2l6ZSkKKwl7CisJICBpZiAoX19sZW4yKQorCSAgICB7CisJICAgICAgX19idWZmZXJfZW5kID0gX0dMSUJDWFhfTU9WRTMoX19taWRkbGUsIF9fbGFzdCwgX19idWZmZXIpOworCSAgICAgIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QpOworCSAgICAgIHJldHVybiBfR0xJQkNYWF9NT1ZFMyhfX2J1ZmZlciwgX19idWZmZXJfZW5kLCBfX2ZpcnN0KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICByZXR1cm4gX19maXJzdDsKKwl9CisgICAgICBlbHNlIGlmIChfX2xlbjEgPD0gX19idWZmZXJfc2l6ZSkKKwl7CisJICBpZiAoX19sZW4xKQorCSAgICB7CisJICAgICAgX19idWZmZXJfZW5kID0gX0dMSUJDWFhfTU9WRTMoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyKTsKKwkgICAgICBfR0xJQkNYWF9NT1ZFMyhfX21pZGRsZSwgX19sYXN0LCBfX2ZpcnN0KTsKKwkgICAgICByZXR1cm4gX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19idWZmZXIsIF9fYnVmZmVyX2VuZCwgX19sYXN0KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICByZXR1cm4gX19sYXN0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzdGQ6OnJvdGF0ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0KTsKKwkgIHN0ZDo6YWR2YW5jZShfX2ZpcnN0LCBzdGQ6OmRpc3RhbmNlKF9fbWlkZGxlLCBfX2xhc3QpKTsKKwkgIHJldHVybiBfX2ZpcnN0OworCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBtZXJnZSByb3V0aW5lcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlLAorCSAgIHR5cGVuYW1lIF9Qb2ludGVyPgorICAgIHZvaWQKKyAgICBfX21lcmdlX2FkYXB0aXZlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19taWRkbGUsCisJCSAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgX0Rpc3RhbmNlIF9fbGVuMSwgX0Rpc3RhbmNlIF9fbGVuMiwKKwkJICAgICBfUG9pbnRlciBfX2J1ZmZlciwgX0Rpc3RhbmNlIF9fYnVmZmVyX3NpemUpCisgICAgeworICAgICAgaWYgKF9fbGVuMSA8PSBfX2xlbjIgJiYgX19sZW4xIDw9IF9fYnVmZmVyX3NpemUpCisJeworCSAgX1BvaW50ZXIgX19idWZmZXJfZW5kID0gX0dMSUJDWFhfTU9WRTMoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyKTsKKwkgIHN0ZDo6X19tb3ZlX21lcmdlX2FkYXB0aXZlKF9fYnVmZmVyLCBfX2J1ZmZlcl9lbmQsIF9fbWlkZGxlLCBfX2xhc3QsCisJCQkJICAgICBfX2ZpcnN0KTsKKwl9CisgICAgICBlbHNlIGlmIChfX2xlbjIgPD0gX19idWZmZXJfc2l6ZSkKKwl7CisJICBfUG9pbnRlciBfX2J1ZmZlcl9lbmQgPSBfR0xJQkNYWF9NT1ZFMyhfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlcik7CisJICBzdGQ6Ol9fbW92ZV9tZXJnZV9hZGFwdGl2ZV9iYWNrd2FyZChfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIsCisJCQkJCSAgICAgIF9fYnVmZmVyX2VuZCwgX19sYXN0KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0X2N1dCA9IF9fZmlyc3Q7CisJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fc2Vjb25kX2N1dCA9IF9fbWlkZGxlOworCSAgX0Rpc3RhbmNlIF9fbGVuMTEgPSAwOworCSAgX0Rpc3RhbmNlIF9fbGVuMjIgPSAwOworCSAgaWYgKF9fbGVuMSA+IF9fbGVuMikKKwkgICAgeworCSAgICAgIF9fbGVuMTEgPSBfX2xlbjEgLyAyOworCSAgICAgIHN0ZDo6YWR2YW5jZShfX2ZpcnN0X2N1dCwgX19sZW4xMSk7CisJICAgICAgX19zZWNvbmRfY3V0ID0gc3RkOjpsb3dlcl9ib3VuZChfX21pZGRsZSwgX19sYXN0LAorCQkJCQkgICAgICAqX19maXJzdF9jdXQpOworCSAgICAgIF9fbGVuMjIgPSBzdGQ6OmRpc3RhbmNlKF9fbWlkZGxlLCBfX3NlY29uZF9jdXQpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfX2xlbjIyID0gX19sZW4yIC8gMjsKKwkgICAgICBzdGQ6OmFkdmFuY2UoX19zZWNvbmRfY3V0LCBfX2xlbjIyKTsKKwkgICAgICBfX2ZpcnN0X2N1dCA9IHN0ZDo6dXBwZXJfYm91bmQoX19maXJzdCwgX19taWRkbGUsCisJCQkJCSAgICAgKl9fc2Vjb25kX2N1dCk7CisJICAgICAgX19sZW4xMSA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19maXJzdF9jdXQpOworCSAgICB9CisJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbmV3X21pZGRsZSA9CisJICAgIHN0ZDo6X19yb3RhdGVfYWRhcHRpdmUoX19maXJzdF9jdXQsIF9fbWlkZGxlLCBfX3NlY29uZF9jdXQsCisJCQkJICAgX19sZW4xIC0gX19sZW4xMSwgX19sZW4yMiwgX19idWZmZXIsCisJCQkJICAgX19idWZmZXJfc2l6ZSk7CisJICBzdGQ6Ol9fbWVyZ2VfYWRhcHRpdmUoX19maXJzdCwgX19maXJzdF9jdXQsIF9fbmV3X21pZGRsZSwgX19sZW4xMSwKKwkJCQlfX2xlbjIyLCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSk7CisJICBzdGQ6Ol9fbWVyZ2VfYWRhcHRpdmUoX19uZXdfbWlkZGxlLCBfX3NlY29uZF9jdXQsIF9fbGFzdCwKKwkJCQlfX2xlbjEgLSBfX2xlbjExLAorCQkJCV9fbGVuMiAtIF9fbGVuMjIsIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplKTsKKwl9CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgbWVyZ2Ugcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZSwgCisJICAgdHlwZW5hbWUgX1BvaW50ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX21lcmdlX2FkYXB0aXZlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19taWRkbGUsCisJCSAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgX0Rpc3RhbmNlIF9fbGVuMSwgX0Rpc3RhbmNlIF9fbGVuMiwKKwkJICAgICBfUG9pbnRlciBfX2J1ZmZlciwgX0Rpc3RhbmNlIF9fYnVmZmVyX3NpemUsCisJCSAgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGlmIChfX2xlbjEgPD0gX19sZW4yICYmIF9fbGVuMSA8PSBfX2J1ZmZlcl9zaXplKQorCXsKKwkgIF9Qb2ludGVyIF9fYnVmZmVyX2VuZCA9IF9HTElCQ1hYX01PVkUzKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlcik7CisJICBzdGQ6Ol9fbW92ZV9tZXJnZV9hZGFwdGl2ZShfX2J1ZmZlciwgX19idWZmZXJfZW5kLCBfX21pZGRsZSwgX19sYXN0LAorCQkJCSAgICAgX19maXJzdCwgX19jb21wKTsKKwl9CisgICAgICBlbHNlIGlmIChfX2xlbjIgPD0gX19idWZmZXJfc2l6ZSkKKwl7CisJICBfUG9pbnRlciBfX2J1ZmZlcl9lbmQgPSBfR0xJQkNYWF9NT1ZFMyhfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlcik7CisJICBzdGQ6Ol9fbW92ZV9tZXJnZV9hZGFwdGl2ZV9iYWNrd2FyZChfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIsCisJCQkJCSAgICAgIF9fYnVmZmVyX2VuZCwgX19sYXN0LCBfX2NvbXApOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3RfY3V0ID0gX19maXJzdDsKKwkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19zZWNvbmRfY3V0ID0gX19taWRkbGU7CisJICBfRGlzdGFuY2UgX19sZW4xMSA9IDA7CisJICBfRGlzdGFuY2UgX19sZW4yMiA9IDA7CisJICBpZiAoX19sZW4xID4gX19sZW4yKQorCSAgICB7CisJICAgICAgX19sZW4xMSA9IF9fbGVuMSAvIDI7CisJICAgICAgc3RkOjphZHZhbmNlKF9fZmlyc3RfY3V0LCBfX2xlbjExKTsKKwkgICAgICBfX3NlY29uZF9jdXQgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fbWlkZGxlLCBfX2xhc3QsICpfX2ZpcnN0X2N1dCwKKwkJCQkJICAgICAgX19jb21wKTsKKwkgICAgICBfX2xlbjIyID0gc3RkOjpkaXN0YW5jZShfX21pZGRsZSwgX19zZWNvbmRfY3V0KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgX19sZW4yMiA9IF9fbGVuMiAvIDI7CisJICAgICAgc3RkOjphZHZhbmNlKF9fc2Vjb25kX2N1dCwgX19sZW4yMik7CisJICAgICAgX19maXJzdF9jdXQgPSBzdGQ6OnVwcGVyX2JvdW5kKF9fZmlyc3QsIF9fbWlkZGxlLCAqX19zZWNvbmRfY3V0LAorCQkJCQkgICAgIF9fY29tcCk7CisJICAgICAgX19sZW4xMSA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19maXJzdF9jdXQpOworCSAgICB9CisJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbmV3X21pZGRsZSA9CisJICAgIHN0ZDo6X19yb3RhdGVfYWRhcHRpdmUoX19maXJzdF9jdXQsIF9fbWlkZGxlLCBfX3NlY29uZF9jdXQsCisJCQkJICAgX19sZW4xIC0gX19sZW4xMSwgX19sZW4yMiwgX19idWZmZXIsCisJCQkJICAgX19idWZmZXJfc2l6ZSk7CisJICBzdGQ6Ol9fbWVyZ2VfYWRhcHRpdmUoX19maXJzdCwgX19maXJzdF9jdXQsIF9fbmV3X21pZGRsZSwgX19sZW4xMSwKKwkJCQlfX2xlbjIyLCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSwgX19jb21wKTsKKwkgIHN0ZDo6X19tZXJnZV9hZGFwdGl2ZShfX25ld19taWRkbGUsIF9fc2Vjb25kX2N1dCwgX19sYXN0LAorCQkJCV9fbGVuMSAtIF9fbGVuMTEsCisJCQkJX19sZW4yIC0gX19sZW4yMiwgX19idWZmZXIsCisJCQkJX19idWZmZXJfc2l6ZSwgX19jb21wKTsKKwl9CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgbWVyZ2Ugcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICB2b2lkCisgICAgX19tZXJnZV93aXRob3V0X2J1ZmZlcihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbWlkZGxlLAorCQkJICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsCisJCQkgICBfRGlzdGFuY2UgX19sZW4xLCBfRGlzdGFuY2UgX19sZW4yKQorICAgIHsKKyAgICAgIGlmIChfX2xlbjEgPT0gMCB8fCBfX2xlbjIgPT0gMCkKKwlyZXR1cm47CisgICAgICBpZiAoX19sZW4xICsgX19sZW4yID09IDIpCisJeworCSAgaWYgKCpfX21pZGRsZSA8ICpfX2ZpcnN0KQorCSAgICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX21pZGRsZSk7CisJICByZXR1cm47CisJfQorICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0X2N1dCA9IF9fZmlyc3Q7CisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fc2Vjb25kX2N1dCA9IF9fbWlkZGxlOworICAgICAgX0Rpc3RhbmNlIF9fbGVuMTEgPSAwOworICAgICAgX0Rpc3RhbmNlIF9fbGVuMjIgPSAwOworICAgICAgaWYgKF9fbGVuMSA+IF9fbGVuMikKKwl7CisJICBfX2xlbjExID0gX19sZW4xIC8gMjsKKwkgIHN0ZDo6YWR2YW5jZShfX2ZpcnN0X2N1dCwgX19sZW4xMSk7CisJICBfX3NlY29uZF9jdXQgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fbWlkZGxlLCBfX2xhc3QsICpfX2ZpcnN0X2N1dCk7CisJICBfX2xlbjIyID0gc3RkOjpkaXN0YW5jZShfX21pZGRsZSwgX19zZWNvbmRfY3V0KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgX19sZW4yMiA9IF9fbGVuMiAvIDI7CisJICBzdGQ6OmFkdmFuY2UoX19zZWNvbmRfY3V0LCBfX2xlbjIyKTsKKwkgIF9fZmlyc3RfY3V0ID0gc3RkOjp1cHBlcl9ib3VuZChfX2ZpcnN0LCBfX21pZGRsZSwgKl9fc2Vjb25kX2N1dCk7CisJICBfX2xlbjExID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2ZpcnN0X2N1dCk7CisJfQorICAgICAgc3RkOjpyb3RhdGUoX19maXJzdF9jdXQsIF9fbWlkZGxlLCBfX3NlY29uZF9jdXQpOworICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX25ld19taWRkbGUgPSBfX2ZpcnN0X2N1dDsKKyAgICAgIHN0ZDo6YWR2YW5jZShfX25ld19taWRkbGUsIHN0ZDo6ZGlzdGFuY2UoX19taWRkbGUsIF9fc2Vjb25kX2N1dCkpOworICAgICAgc3RkOjpfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fZmlyc3QsIF9fZmlyc3RfY3V0LCBfX25ld19taWRkbGUsCisJCQkJICBfX2xlbjExLCBfX2xlbjIyKTsKKyAgICAgIHN0ZDo6X19tZXJnZV93aXRob3V0X2J1ZmZlcihfX25ld19taWRkbGUsIF9fc2Vjb25kX2N1dCwgX19sYXN0LAorCQkJCSAgX19sZW4xIC0gX19sZW4xMSwgX19sZW4yIC0gX19sZW4yMik7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgbWVyZ2Ugcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZSwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19tZXJnZV93aXRob3V0X2J1ZmZlcihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbWlkZGxlLAorCQkJICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsCisJCQkgICBfRGlzdGFuY2UgX19sZW4xLCBfRGlzdGFuY2UgX19sZW4yLAorCQkJICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGlmIChfX2xlbjEgPT0gMCB8fCBfX2xlbjIgPT0gMCkKKwlyZXR1cm47CisgICAgICBpZiAoX19sZW4xICsgX19sZW4yID09IDIpCisJeworCSAgaWYgKF9fY29tcCgqX19taWRkbGUsICpfX2ZpcnN0KSkKKwkgICAgc3RkOjppdGVyX3N3YXAoX19maXJzdCwgX19taWRkbGUpOworCSAgcmV0dXJuOworCX0KKyAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdF9jdXQgPSBfX2ZpcnN0OworICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX3NlY29uZF9jdXQgPSBfX21pZGRsZTsKKyAgICAgIF9EaXN0YW5jZSBfX2xlbjExID0gMDsKKyAgICAgIF9EaXN0YW5jZSBfX2xlbjIyID0gMDsKKyAgICAgIGlmIChfX2xlbjEgPiBfX2xlbjIpCisJeworCSAgX19sZW4xMSA9IF9fbGVuMSAvIDI7CisJICBzdGQ6OmFkdmFuY2UoX19maXJzdF9jdXQsIF9fbGVuMTEpOworCSAgX19zZWNvbmRfY3V0ID0gc3RkOjpsb3dlcl9ib3VuZChfX21pZGRsZSwgX19sYXN0LCAqX19maXJzdF9jdXQsCisJCQkJCSAgX19jb21wKTsKKwkgIF9fbGVuMjIgPSBzdGQ6OmRpc3RhbmNlKF9fbWlkZGxlLCBfX3NlY29uZF9jdXQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfX2xlbjIyID0gX19sZW4yIC8gMjsKKwkgIHN0ZDo6YWR2YW5jZShfX3NlY29uZF9jdXQsIF9fbGVuMjIpOworCSAgX19maXJzdF9jdXQgPSBzdGQ6OnVwcGVyX2JvdW5kKF9fZmlyc3QsIF9fbWlkZGxlLCAqX19zZWNvbmRfY3V0LAorCQkJCQkgX19jb21wKTsKKwkgIF9fbGVuMTEgPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fZmlyc3RfY3V0KTsKKwl9CisgICAgICBzdGQ6OnJvdGF0ZShfX2ZpcnN0X2N1dCwgX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7CisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbmV3X21pZGRsZSA9IF9fZmlyc3RfY3V0OworICAgICAgc3RkOjphZHZhbmNlKF9fbmV3X21pZGRsZSwgc3RkOjpkaXN0YW5jZShfX21pZGRsZSwgX19zZWNvbmRfY3V0KSk7CisgICAgICBzdGQ6Ol9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX19maXJzdCwgX19maXJzdF9jdXQsIF9fbmV3X21pZGRsZSwKKwkJCQkgIF9fbGVuMTEsIF9fbGVuMjIsIF9fY29tcCk7CisgICAgICBzdGQ6Ol9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX19uZXdfbWlkZGxlLCBfX3NlY29uZF9jdXQsIF9fbGFzdCwKKwkJCQkgIF9fbGVuMSAtIF9fbGVuMTEsIF9fbGVuMiAtIF9fbGVuMjIsIF9fY29tcCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIE1lcmdlcyB0d28gc29ydGVkIHJhbmdlcyBpbiBwbGFjZS4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbWlkZGxlICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBNZXJnZXMgdHdvIHNvcnRlZCBhbmQgY29uc2VjdXRpdmUgcmFuZ2VzLCBbX19maXJzdCxfX21pZGRsZSkgYW5kCisgICAqICBbX19taWRkbGUsX19sYXN0KSwgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbiBbX19maXJzdCxfX2xhc3QpLiAgVGhlCisgICAqICBvdXRwdXQgd2lsbCBiZSBzb3J0ZWQuICBUaGUgc29ydCBpcyBAZSBzdGFibGUsIHRoYXQgaXMsIGZvcgorICAgKiAgZXF1aXZhbGVudCBlbGVtZW50cyBpbiB0aGUgdHdvIHJhbmdlcywgZWxlbWVudHMgZnJvbSB0aGUgZmlyc3QKKyAgICogIHJhbmdlIHdpbGwgYWx3YXlzIGNvbWUgYmVmb3JlIGVsZW1lbnRzIGZyb20gdGhlIHNlY29uZC4KKyAgICoKKyAgICogIElmIGVub3VnaCBhZGRpdGlvbmFsIG1lbW9yeSBpcyBhdmFpbGFibGUsIHRoaXMgdGFrZXMgKF9fbGFzdC1fX2ZpcnN0KS0xCisgICAqICBjb21wYXJpc29ucy4gIE90aGVyd2lzZSBhbiBObG9nTiBhbGdvcml0aG0gaXMgdXNlZCwgd2hlcmUgTiBpcworICAgKiAgZGlzdGFuY2UoX19maXJzdCxfX2xhc3QpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBpbnBsYWNlX21lcmdlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwKKwkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbWlkZGxlLAorCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisgICAgICAgICAgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICAgICAgICBfRGlzdGFuY2VUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZChfX2ZpcnN0LCBfX21pZGRsZSk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkKF9fbWlkZGxlLCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSB8fCBfX21pZGRsZSA9PSBfX2xhc3QpCisJcmV0dXJuOworCisgICAgICBfRGlzdGFuY2VUeXBlIF9fbGVuMSA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19taWRkbGUpOworICAgICAgX0Rpc3RhbmNlVHlwZSBfX2xlbjIgPSBzdGQ6OmRpc3RhbmNlKF9fbWlkZGxlLCBfX2xhc3QpOworCisgICAgICBfVGVtcG9yYXJ5X2J1ZmZlcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfVmFsdWVUeXBlPiBfX2J1ZihfX2ZpcnN0LAorCQkJCQkJCQkgIF9fbGFzdCk7CisgICAgICBpZiAoX19idWYuYmVnaW4oKSA9PSAwKQorCXN0ZDo6X19tZXJnZV93aXRob3V0X2J1ZmZlcihfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfX2xlbjEsIF9fbGVuMik7CisgICAgICBlbHNlCisJc3RkOjpfX21lcmdlX2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9fbGVuMSwgX19sZW4yLAorCQkJICAgICAgX19idWYuYmVnaW4oKSwgX0Rpc3RhbmNlVHlwZShfX2J1Zi5zaXplKCkpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgTWVyZ2VzIHR3byBzb3J0ZWQgcmFuZ2VzIGluIHBsYWNlLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19taWRkbGUgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICAgQSBmdW5jdG9yIHRvIHVzZSBmb3IgY29tcGFyaXNvbnMuCisgICAqICBAcmV0dXJuICBOb3RoaW5nLgorICAgKgorICAgKiAgTWVyZ2VzIHR3byBzb3J0ZWQgYW5kIGNvbnNlY3V0aXZlIHJhbmdlcywgW19fZmlyc3QsX19taWRkbGUpIGFuZAorICAgKiAgW21pZGRsZSxsYXN0KSwgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbiBbX19maXJzdCxfX2xhc3QpLiAgVGhlIG91dHB1dCB3aWxsCisgICAqICBiZSBzb3J0ZWQuICBUaGUgc29ydCBpcyBAZSBzdGFibGUsIHRoYXQgaXMsIGZvciBlcXVpdmFsZW50CisgICAqICBlbGVtZW50cyBpbiB0aGUgdHdvIHJhbmdlcywgZWxlbWVudHMgZnJvbSB0aGUgZmlyc3QgcmFuZ2Ugd2lsbCBhbHdheXMKKyAgICogIGNvbWUgYmVmb3JlIGVsZW1lbnRzIGZyb20gdGhlIHNlY29uZC4KKyAgICoKKyAgICogIElmIGVub3VnaCBhZGRpdGlvbmFsIG1lbW9yeSBpcyBhdmFpbGFibGUsIHRoaXMgdGFrZXMgKF9fbGFzdC1fX2ZpcnN0KS0xCisgICAqICBjb21wYXJpc29ucy4gIE90aGVyd2lzZSBhbiBObG9nTiBhbGdvcml0aG0gaXMgdXNlZCwgd2hlcmUgTiBpcworICAgKiAgZGlzdGFuY2UoX19maXJzdCxfX2xhc3QpLgorICAgKgorICAgKiAgVGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gc2hvdWxkIGhhdmUgdGhlIHNhbWUgZWZmZWN0cyBvbiBvcmRlcmluZyBhcworICAgKiAgdGhlIGZ1bmN0aW9uIHVzZWQgZm9yIHRoZSBpbml0aWFsIHNvcnQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBpbnBsYWNlX21lcmdlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwKKwkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbWlkZGxlLAorCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LAorCQkgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorICAgICAgICAgIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICAgICAgX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PAorCSAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkgICAgX1ZhbHVlVHlwZSwgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3ByZWQoX19maXJzdCwgX19taWRkbGUsIF9fY29tcCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3ByZWQoX19taWRkbGUsIF9fbGFzdCwgX19jb21wKTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUgfHwgX19taWRkbGUgPT0gX19sYXN0KQorCXJldHVybjsKKworICAgICAgY29uc3QgX0Rpc3RhbmNlVHlwZSBfX2xlbjEgPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbWlkZGxlKTsKKyAgICAgIGNvbnN0IF9EaXN0YW5jZVR5cGUgX19sZW4yID0gc3RkOjpkaXN0YW5jZShfX21pZGRsZSwgX19sYXN0KTsKKworICAgICAgX1RlbXBvcmFyeV9idWZmZXI8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX1ZhbHVlVHlwZT4gX19idWYoX19maXJzdCwKKwkJCQkJCQkJICBfX2xhc3QpOworICAgICAgaWYgKF9fYnVmLmJlZ2luKCkgPT0gMCkKKwlzdGQ6Ol9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX19sZW4xLAorCQkJCSAgICBfX2xlbjIsIF9fY29tcCk7CisgICAgICBlbHNlCisJc3RkOjpfX21lcmdlX2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9fbGVuMSwgX19sZW4yLAorCQkJICAgICAgX19idWYuYmVnaW4oKSwgX0Rpc3RhbmNlVHlwZShfX2J1Zi5zaXplKCkpLAorCQkJICAgICAgX19jb21wKTsKKyAgICB9CisKKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIF9fbWVyZ2Vfc29ydF9sb29wIHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19tb3ZlX21lcmdlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCSBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJeworCSAgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QyKTsKKwkgICAgICArK19fZmlyc3QyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0MSk7CisJICAgICAgKytfX2ZpcnN0MTsKKwkgICAgfQorCSAgKytfX3Jlc3VsdDsKKwl9CisgICAgICByZXR1cm4gX0dMSUJDWFhfTU9WRTMoX19maXJzdDIsIF9fbGFzdDIsCisJCQkgICAgX0dMSUJDWFhfTU9WRTMoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCSAgIF9fcmVzdWx0KSk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgX19tZXJnZV9zb3J0X2xvb3Agcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19tb3ZlX21lcmdlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCSBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwl7CisJICBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QyKTsKKwkgICAgICArK19fZmlyc3QyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0MSk7CisJICAgICAgKytfX2ZpcnN0MTsKKwkgICAgfQorCSAgKytfX3Jlc3VsdDsKKwl9CisgICAgICByZXR1cm4gX0dMSUJDWFhfTU9WRTMoX19maXJzdDIsIF9fbGFzdDIsCisJCQkgICAgX0dMSUJDWFhfTU9WRTMoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCSAgIF9fcmVzdWx0KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEsIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIHZvaWQKKyAgICBfX21lcmdlX3NvcnRfbG9vcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IxIF9fZmlyc3QsCisJCSAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgX19sYXN0LAorCQkgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyIF9fcmVzdWx0LAorCQkgICAgICBfRGlzdGFuY2UgX19zdGVwX3NpemUpCisgICAgeworICAgICAgY29uc3QgX0Rpc3RhbmNlIF9fdHdvX3N0ZXAgPSAyICogX19zdGVwX3NpemU7CisKKyAgICAgIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0ID49IF9fdHdvX3N0ZXApCisJeworCSAgX19yZXN1bHQgPSBzdGQ6Ol9fbW92ZV9tZXJnZShfX2ZpcnN0LCBfX2ZpcnN0ICsgX19zdGVwX3NpemUsCisJCQkJICAgICAgIF9fZmlyc3QgKyBfX3N0ZXBfc2l6ZSwKKwkJCQkgICAgICAgX19maXJzdCArIF9fdHdvX3N0ZXAsIF9fcmVzdWx0KTsKKwkgIF9fZmlyc3QgKz0gX190d29fc3RlcDsKKwl9CisKKyAgICAgIF9fc3RlcF9zaXplID0gc3RkOjptaW4oX0Rpc3RhbmNlKF9fbGFzdCAtIF9fZmlyc3QpLCBfX3N0ZXBfc2l6ZSk7CisgICAgICBzdGQ6Ol9fbW92ZV9tZXJnZShfX2ZpcnN0LCBfX2ZpcnN0ICsgX19zdGVwX3NpemUsCisJCQlfX2ZpcnN0ICsgX19zdGVwX3NpemUsIF9fbGFzdCwgX19yZXN1bHQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxLCB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9EaXN0YW5jZSwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fbWVyZ2Vfc29ydF9sb29wKF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgX19maXJzdCwKKwkJICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMSBfX2xhc3QsCisJCSAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19yZXN1bHQsIF9EaXN0YW5jZSBfX3N0ZXBfc2l6ZSwKKwkJICAgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGNvbnN0IF9EaXN0YW5jZSBfX3R3b19zdGVwID0gMiAqIF9fc3RlcF9zaXplOworCisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+PSBfX3R3b19zdGVwKQorCXsKKwkgIF9fcmVzdWx0ID0gc3RkOjpfX21vdmVfbWVyZ2UoX19maXJzdCwgX19maXJzdCArIF9fc3RlcF9zaXplLAorCQkJCSAgICAgICBfX2ZpcnN0ICsgX19zdGVwX3NpemUsCisJCQkJICAgICAgIF9fZmlyc3QgKyBfX3R3b19zdGVwLAorCQkJCSAgICAgICBfX3Jlc3VsdCwgX19jb21wKTsKKwkgIF9fZmlyc3QgKz0gX190d29fc3RlcDsKKwl9CisgICAgICBfX3N0ZXBfc2l6ZSA9IHN0ZDo6bWluKF9EaXN0YW5jZShfX2xhc3QgLSBfX2ZpcnN0KSwgX19zdGVwX3NpemUpOworCisgICAgICBzdGQ6Ol9fbW92ZV9tZXJnZShfX2ZpcnN0LF9fZmlyc3QgKyBfX3N0ZXBfc2l6ZSwKKwkJCV9fZmlyc3QgKyBfX3N0ZXBfc2l6ZSwgX19sYXN0LCBfX3Jlc3VsdCwgX19jb21wKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgdm9pZAorICAgIF9fY2h1bmtfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCQkJICAgX0Rpc3RhbmNlIF9fY2h1bmtfc2l6ZSkKKyAgICB7CisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+PSBfX2NodW5rX3NpemUpCisJeworCSAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fZmlyc3QgKyBfX2NodW5rX3NpemUpOworCSAgX19maXJzdCArPSBfX2NodW5rX3NpemU7CisJfQorICAgICAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX2NodW5rX2luc2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIF9EaXN0YW5jZSBfX2NodW5rX3NpemUsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+PSBfX2NodW5rX3NpemUpCisJeworCSAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fZmlyc3QgKyBfX2NodW5rX3NpemUsIF9fY29tcCk7CisJICBfX2ZpcnN0ICs9IF9fY2h1bmtfc2l6ZTsKKwl9CisgICAgICBzdGQ6Ol9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworICAgIH0KKworICBlbnVtIHsgX1NfY2h1bmtfc2l6ZSA9IDcgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Qb2ludGVyPgorICAgIHZvaWQKKyAgICBfX21lcmdlX3NvcnRfd2l0aF9idWZmZXIoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Qb2ludGVyIF9fYnVmZmVyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZTsKKworICAgICAgY29uc3QgX0Rpc3RhbmNlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgIGNvbnN0IF9Qb2ludGVyIF9fYnVmZmVyX2xhc3QgPSBfX2J1ZmZlciArIF9fbGVuOworCisgICAgICBfRGlzdGFuY2UgX19zdGVwX3NpemUgPSBfU19jaHVua19zaXplOworICAgICAgc3RkOjpfX2NodW5rX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19zdGVwX3NpemUpOworCisgICAgICB3aGlsZSAoX19zdGVwX3NpemUgPCBfX2xlbikKKwl7CisJICBzdGQ6Ol9fbWVyZ2Vfc29ydF9sb29wKF9fZmlyc3QsIF9fbGFzdCwgX19idWZmZXIsIF9fc3RlcF9zaXplKTsKKwkgIF9fc3RlcF9zaXplICo9IDI7CisJICBzdGQ6Ol9fbWVyZ2Vfc29ydF9sb29wKF9fYnVmZmVyLCBfX2J1ZmZlcl9sYXN0LCBfX2ZpcnN0LCBfX3N0ZXBfc2l6ZSk7CisJICBfX3N0ZXBfc2l6ZSAqPSAyOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfUG9pbnRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fbWVyZ2Vfc29ydF93aXRoX2J1ZmZlcihfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1BvaW50ZXIgX19idWZmZXIsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2U7CisKKyAgICAgIGNvbnN0IF9EaXN0YW5jZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICBjb25zdCBfUG9pbnRlciBfX2J1ZmZlcl9sYXN0ID0gX19idWZmZXIgKyBfX2xlbjsKKworICAgICAgX0Rpc3RhbmNlIF9fc3RlcF9zaXplID0gX1NfY2h1bmtfc2l6ZTsKKyAgICAgIHN0ZDo6X19jaHVua19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fc3RlcF9zaXplLCBfX2NvbXApOworCisgICAgICB3aGlsZSAoX19zdGVwX3NpemUgPCBfX2xlbikKKwl7CisJICBzdGQ6Ol9fbWVyZ2Vfc29ydF9sb29wKF9fZmlyc3QsIF9fbGFzdCwgX19idWZmZXIsCisJCQkJIF9fc3RlcF9zaXplLCBfX2NvbXApOworCSAgX19zdGVwX3NpemUgKj0gMjsKKwkgIHN0ZDo6X19tZXJnZV9zb3J0X2xvb3AoX19idWZmZXIsIF9fYnVmZmVyX2xhc3QsIF9fZmlyc3QsCisJCQkJIF9fc3RlcF9zaXplLCBfX2NvbXApOworCSAgX19zdGVwX3NpemUgKj0gMjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1BvaW50ZXIsCisJICAgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIHZvaWQKKyAgICBfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Qb2ludGVyIF9fYnVmZmVyLCBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSkKKyAgICB7CisgICAgICBjb25zdCBfRGlzdGFuY2UgX19sZW4gPSAoX19sYXN0IC0gX19maXJzdCArIDEpIC8gMjsKKyAgICAgIGNvbnN0IF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3QgKyBfX2xlbjsKKyAgICAgIGlmIChfX2xlbiA+IF9fYnVmZmVyX3NpemUpCisJeworCSAgc3RkOjpfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLAorCQkJCSAgICAgIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplKTsKKwkgIHN0ZDo6X19zdGFibGVfc29ydF9hZGFwdGl2ZShfX21pZGRsZSwgX19sYXN0LAorCQkJCSAgICAgIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RkOjpfX21lcmdlX3NvcnRfd2l0aF9idWZmZXIoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyKTsKKwkgIHN0ZDo6X19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9fbWlkZGxlLCBfX2xhc3QsIF9fYnVmZmVyKTsKKwl9CisgICAgICBzdGQ6Ol9fbWVyZ2VfYWRhcHRpdmUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwKKwkJCSAgICBfRGlzdGFuY2UoX19taWRkbGUgLSBfX2ZpcnN0KSwKKwkJCSAgICBfRGlzdGFuY2UoX19sYXN0IC0gX19taWRkbGUpLAorCQkJICAgIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfUG9pbnRlciwKKwkgICB0eXBlbmFtZSBfRGlzdGFuY2UsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Qb2ludGVyIF9fYnVmZmVyLCBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBjb25zdCBfRGlzdGFuY2UgX19sZW4gPSAoX19sYXN0IC0gX19maXJzdCArIDEpIC8gMjsKKyAgICAgIGNvbnN0IF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3QgKyBfX2xlbjsKKyAgICAgIGlmIChfX2xlbiA+IF9fYnVmZmVyX3NpemUpCisJeworCSAgc3RkOjpfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwKKwkJCQkgICAgICBfX2J1ZmZlcl9zaXplLCBfX2NvbXApOworCSAgc3RkOjpfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9fbWlkZGxlLCBfX2xhc3QsIF9fYnVmZmVyLAorCQkJCSAgICAgIF9fYnVmZmVyX3NpemUsIF9fY29tcCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN0ZDo6X19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwgX19jb21wKTsKKwkgIHN0ZDo6X19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9fbWlkZGxlLCBfX2xhc3QsIF9fYnVmZmVyLCBfX2NvbXApOworCX0KKyAgICAgIHN0ZDo6X19tZXJnZV9hZGFwdGl2ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAorCQkJICAgIF9EaXN0YW5jZShfX21pZGRsZSAtIF9fZmlyc3QpLAorCQkJICAgIF9EaXN0YW5jZShfX2xhc3QgLSBfX21pZGRsZSksCisJCQkgICAgX19idWZmZXIsIF9fYnVmZmVyX3NpemUsCisJCQkgICAgX19jb21wKTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzdGFibGUgc29ydGluZyByb3V0aW5lcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgaWYgKF9fbGFzdCAtIF9fZmlyc3QgPCAxNSkKKwl7CisJICBzdGQ6Ol9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0KTsKKwkgIHJldHVybjsKKwl9CisgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19taWRkbGUgPSBfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpIC8gMjsKKyAgICAgIHN0ZDo6X19pbnBsYWNlX3N0YWJsZV9zb3J0KF9fZmlyc3QsIF9fbWlkZGxlKTsKKyAgICAgIHN0ZDo6X19pbnBsYWNlX3N0YWJsZV9zb3J0KF9fbWlkZGxlLCBfX2xhc3QpOworICAgICAgc3RkOjpfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsCisJCQkJICBfX21pZGRsZSAtIF9fZmlyc3QsCisJCQkJICBfX2xhc3QgLSBfX21pZGRsZSk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc3RhYmxlIHNvcnRpbmcgcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9faW5wbGFjZV9zdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGlmIChfX2xhc3QgLSBfX2ZpcnN0IDwgMTUpCisJeworCSAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19taWRkbGUgPSBfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpIC8gMjsKKyAgICAgIHN0ZDo6X19pbnBsYWNlX3N0YWJsZV9zb3J0KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2NvbXApOworICAgICAgc3RkOjpfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19taWRkbGUsIF9fbGFzdCwgX19jb21wKTsKKyAgICAgIHN0ZDo6X19tZXJnZV93aXRob3V0X2J1ZmZlcihfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAorCQkJCSAgX19taWRkbGUgLSBfX2ZpcnN0LAorCQkJCSAgX19sYXN0IC0gX19taWRkbGUsCisJCQkJICBfX2NvbXApOworICAgIH0KKworICAvLyBzdGFibGVfc29ydAorCisgIC8vIFNldCBhbGdvcml0aG1zOiBpbmNsdWRlcywgc2V0X3VuaW9uLCBzZXRfaW50ZXJzZWN0aW9uLCBzZXRfZGlmZmVyZW5jZSwKKyAgLy8gc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlLiAgQWxsIG9mIHRoZXNlIGFsZ29yaXRobXMgaGF2ZSB0aGUgcHJlY29uZGl0aW9uCisgIC8vIHRoYXQgdGhlaXIgaW5wdXQgcmFuZ2VzIGFyZSBzb3J0ZWQgYW5kIHRoZSBwb3N0Y29uZGl0aW9uIHRoYXQgdGhlaXIgb3V0cHV0CisgIC8vIHJhbmdlcyBhcmUgc29ydGVkLgorCisgIC8qKgorICAgKiAgQGJyaWVmIERldGVybWluZXMgd2hldGhlciBhbGwgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBleGlzdHMgaW4gYSByYW5nZS4KKyAgICogIEBwYXJhbSAgX19maXJzdDEgIFN0YXJ0IG9mIHNlYXJjaCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEVuZCBvZiBzZWFyY2ggcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBTdGFydCBvZiBzZXF1ZW5jZQorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgRW5kIG9mIHNlcXVlbmNlLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBlYWNoIGVsZW1lbnQgaW4gW19fZmlyc3QyLF9fbGFzdDIpIGlzIGNvbnRhaW5lZCBpbiBvcmRlcgorICAgKiAgd2l0aGluIFtfX2ZpcnN0MSxfX2xhc3QxKS4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBleHBlY3RzIGJvdGggW19fZmlyc3QxLF9fbGFzdDEpIGFuZAorICAgKiAgW19fZmlyc3QyLF9fbGFzdDIpIHRvIGJlIHNvcnRlZC4gIFNlYXJjaGVzIGZvciB0aGUgcHJlc2VuY2Ugb2YKKyAgICogIGVhY2ggZWxlbWVudCBpbiBbX19maXJzdDIsX19sYXN0Mikgd2l0aGluIFtfX2ZpcnN0MSxfX2xhc3QxKS4KKyAgICogIFRoZSBpdGVyYXRvcnMgb3ZlciBlYWNoIHJhbmdlIG9ubHkgbW92ZSBmb3J3YXJkLCBzbyB0aGlzIGlzIGEKKyAgICogIGxpbmVhciBhbGdvcml0aG0uICBJZiBhbiBlbGVtZW50IGluIFtfX2ZpcnN0MixfX2xhc3QyKSBpcyBub3QKKyAgICogIGZvdW5kIGJlZm9yZSB0aGUgc2VhcmNoIGl0ZXJhdG9yIHJlYWNoZXMgQHAgX19sYXN0MiwgZmFsc2UgaXMKKyAgICogIHJldHVybmVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMj4KKyAgICBib29sCisgICAgaW5jbHVkZXMoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgIHJldHVybiBmYWxzZTsKKwllbHNlIGlmKCpfX2ZpcnN0MSA8ICpfX2ZpcnN0MikKKwkgICsrX19maXJzdDE7CisJZWxzZQorCSAgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MjsKKworICAgICAgcmV0dXJuIF9fZmlyc3QyID09IF9fbGFzdDI7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIERldGVybWluZXMgd2hldGhlciBhbGwgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBleGlzdHMgaW4gYSByYW5nZQorICAgKiAgdXNpbmcgY29tcGFyaXNvbi4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBTdGFydCBvZiBzZWFyY2ggcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBFbmQgb2Ygc2VhcmNoIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgU3RhcnQgb2Ygc2VxdWVuY2UKKyAgICogIEBwYXJhbSAgX19sYXN0MiAgIEVuZCBvZiBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIENvbXBhcmlzb24gZnVuY3Rpb24gdG8gdXNlLgorICAgKiAgQHJldHVybiBUcnVlIGlmIGVhY2ggZWxlbWVudCBpbiBbX19maXJzdDIsX19sYXN0MikgaXMgY29udGFpbmVkCisgICAqICBpbiBvcmRlciB3aXRoaW4gW19fZmlyc3QxLF9fbGFzdDEpIGFjY29yZGluZyB0byBjb21wLiAgRmFsc2UKKyAgICogIG90aGVyd2lzZS4gIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBleHBlY3RzIGJvdGggW19fZmlyc3QxLF9fbGFzdDEpIGFuZAorICAgKiAgW19fZmlyc3QyLF9fbGFzdDIpIHRvIGJlIHNvcnRlZC4gIFNlYXJjaGVzIGZvciB0aGUgcHJlc2VuY2Ugb2YKKyAgICogIGVhY2ggZWxlbWVudCBpbiBbX19maXJzdDIsX19sYXN0Mikgd2l0aGluIFtfX2ZpcnN0MSxfX2xhc3QxKSwKKyAgICogIHVzaW5nIGNvbXAgdG8gZGVjaWRlLiAgVGhlIGl0ZXJhdG9ycyBvdmVyIGVhY2ggcmFuZ2Ugb25seSBtb3ZlCisgICAqICBmb3J3YXJkLCBzbyB0aGlzIGlzIGEgbGluZWFyIGFsZ29yaXRobS4gIElmIGFuIGVsZW1lbnQgaW4KKyAgICogIFtfX2ZpcnN0MixfX2xhc3QyKSBpcyBub3QgZm91bmQgYmVmb3JlIHRoZSBzZWFyY2ggaXRlcmF0b3IKKyAgICogIHJlYWNoZXMgQHAgX19sYXN0MiwgZmFsc2UgaXMgcmV0dXJuZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGJvb2wKKyAgICBpbmNsdWRlcyhfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1ZhbHVlVHlwZTIsIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0X3ByZWQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2NvbXApOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfX2ZpcnN0MiwgX19sYXN0MiwgX19maXJzdDEsIF9fY29tcCk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisJICByZXR1cm4gZmFsc2U7CisJZWxzZSBpZihfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKQorCSAgKytfX2ZpcnN0MTsKKwllbHNlCisJICArK19fZmlyc3QxLCArK19fZmlyc3QyOworCisgICAgICByZXR1cm4gX19maXJzdDIgPT0gX19sYXN0MjsKKyAgICB9CisKKyAgLy8gbnRoX2VsZW1lbnQKKyAgLy8gbWVyZ2UKKyAgLy8gc2V0X2RpZmZlcmVuY2UKKyAgLy8gc2V0X2ludGVyc2VjdGlvbgorICAvLyBzZXRfdW5pb24KKyAgLy8gc3RhYmxlX3NvcnQKKyAgLy8gc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlCisgIC8vIG1pbl9lbGVtZW50CisgIC8vIG1heF9lbGVtZW50CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFBlcm11dGUgcmFuZ2UgaW50byB0aGUgbmV4dCBAZSBkaWN0aW9uYXJ5IG9yZGVyaW5nLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcmV0dXJuICBGYWxzZSBpZiB3cmFwcGVkIHRvIGZpcnN0IHBlcm11dGF0aW9uLCB0cnVlIG90aGVyd2lzZS4KKyAgICoKKyAgICogIFRyZWF0cyBhbGwgcGVybXV0YXRpb25zIG9mIHRoZSByYW5nZSBhcyBhIHNldCBvZiBAZSBkaWN0aW9uYXJ5IHNvcnRlZAorICAgKiAgc2VxdWVuY2VzLiAgUGVybXV0ZXMgdGhlIGN1cnJlbnQgc2VxdWVuY2UgaW50byB0aGUgbmV4dCBvbmUgb2YgdGhpcyBzZXQuCisgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUgc2VxdWVuY2VzIHRvIGdlbmVyYXRlLiAgSWYgdGhlIHNlcXVlbmNlCisgICAqICBpcyB0aGUgbGFyZ2VzdCBvZiB0aGUgc2V0LCB0aGUgc21hbGxlc3QgaXMgZ2VuZXJhdGVkIGFuZCBmYWxzZSByZXR1cm5lZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4KKyAgICBib29sCisgICAgbmV4dF9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsCisJCSAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faSA9IF9fZmlyc3Q7CisgICAgICArK19faTsKKyAgICAgIGlmIChfX2kgPT0gX19sYXN0KQorCXJldHVybiBmYWxzZTsKKyAgICAgIF9faSA9IF9fbGFzdDsKKyAgICAgIC0tX19pOworCisgICAgICBmb3IoOzspCisJeworCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2lpID0gX19pOworCSAgLS1fX2k7CisJICBpZiAoKl9faSA8ICpfX2lpKQorCSAgICB7CisJICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ogPSBfX2xhc3Q7CisJICAgICAgd2hpbGUgKCEoKl9faSA8ICotLV9faikpCisJCXt9CisJICAgICAgc3RkOjppdGVyX3N3YXAoX19pLCBfX2opOworCSAgICAgIHN0ZDo6cmV2ZXJzZShfX2lpLCBfX2xhc3QpOworCSAgICAgIHJldHVybiB0cnVlOworCSAgICB9CisJICBpZiAoX19pID09IF9fZmlyc3QpCisJICAgIHsKKwkgICAgICBzdGQ6OnJldmVyc2UoX19maXJzdCwgX19sYXN0KTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBQZXJtdXRlIHJhbmdlIGludG8gdGhlIG5leHQgQGUgZGljdGlvbmFyeSBvcmRlcmluZyB1c2luZworICAgKiAgICAgICAgICBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgQSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcmV0dXJuICBGYWxzZSBpZiB3cmFwcGVkIHRvIGZpcnN0IHBlcm11dGF0aW9uLCB0cnVlIG90aGVyd2lzZS4KKyAgICoKKyAgICogIFRyZWF0cyBhbGwgcGVybXV0YXRpb25zIG9mIHRoZSByYW5nZSBbX19maXJzdCxfX2xhc3QpIGFzIGEgc2V0IG9mCisgICAqICBAZSBkaWN0aW9uYXJ5IHNvcnRlZCBzZXF1ZW5jZXMgb3JkZXJlZCBieSBAcCBfX2NvbXAuICBQZXJtdXRlcyB0aGUgY3VycmVudAorICAgKiAgc2VxdWVuY2UgaW50byB0aGUgbmV4dCBvbmUgb2YgdGhpcyBzZXQuICBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUKKyAgICogIHNlcXVlbmNlcyB0byBnZW5lcmF0ZS4gIElmIHRoZSBzZXF1ZW5jZSBpcyB0aGUgbGFyZ2VzdCBvZiB0aGUgc2V0LCB0aGUKKyAgICogIHNtYWxsZXN0IGlzIGdlbmVyYXRlZCBhbmQgZmFsc2UgcmV0dXJuZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGJvb2wKKyAgICBuZXh0X3Blcm11dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwKKwkJICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faSA9IF9fZmlyc3Q7CisgICAgICArK19faTsKKyAgICAgIGlmIChfX2kgPT0gX19sYXN0KQorCXJldHVybiBmYWxzZTsKKyAgICAgIF9faSA9IF9fbGFzdDsKKyAgICAgIC0tX19pOworCisgICAgICBmb3IoOzspCisJeworCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2lpID0gX19pOworCSAgLS1fX2k7CisJICBpZiAoX19jb21wKCpfX2ksICpfX2lpKSkKKwkgICAgeworCSAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19qID0gX19sYXN0OworCSAgICAgIHdoaWxlICghYm9vbChfX2NvbXAoKl9faSwgKi0tX19qKSkpCisJCXt9CisJICAgICAgc3RkOjppdGVyX3N3YXAoX19pLCBfX2opOworCSAgICAgIHN0ZDo6cmV2ZXJzZShfX2lpLCBfX2xhc3QpOworCSAgICAgIHJldHVybiB0cnVlOworCSAgICB9CisJICBpZiAoX19pID09IF9fZmlyc3QpCisJICAgIHsKKwkgICAgICBzdGQ6OnJldmVyc2UoX19maXJzdCwgX19sYXN0KTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBQZXJtdXRlIHJhbmdlIGludG8gdGhlIHByZXZpb3VzIEBlIGRpY3Rpb25hcnkgb3JkZXJpbmcuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEByZXR1cm4gIEZhbHNlIGlmIHdyYXBwZWQgdG8gbGFzdCBwZXJtdXRhdGlvbiwgdHJ1ZSBvdGhlcndpc2UuCisgICAqCisgICAqICBUcmVhdHMgYWxsIHBlcm11dGF0aW9ucyBvZiB0aGUgcmFuZ2UgYXMgYSBzZXQgb2YgQGUgZGljdGlvbmFyeSBzb3J0ZWQKKyAgICogIHNlcXVlbmNlcy4gIFBlcm11dGVzIHRoZSBjdXJyZW50IHNlcXVlbmNlIGludG8gdGhlIHByZXZpb3VzIG9uZSBvZiB0aGlzCisgICAqICBzZXQuICBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUgc2VxdWVuY2VzIHRvIGdlbmVyYXRlLiAgSWYgdGhlCisgICAqICBzZXF1ZW5jZSBpcyB0aGUgc21hbGxlc3Qgb2YgdGhlIHNldCwgdGhlIGxhcmdlc3QgaXMgZ2VuZXJhdGVkIGFuZCBmYWxzZQorICAgKiAgcmV0dXJuZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+CisgICAgYm9vbAorICAgIHByZXZfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LAorCQkgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIGZhbHNlOworICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworICAgICAgKytfX2k7CisgICAgICBpZiAoX19pID09IF9fbGFzdCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBfX2kgPSBfX2xhc3Q7CisgICAgICAtLV9faTsKKworICAgICAgZm9yKDs7KQorCXsKKwkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19paSA9IF9faTsKKwkgIC0tX19pOworCSAgaWYgKCpfX2lpIDwgKl9faSkKKwkgICAgeworCSAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19qID0gX19sYXN0OworCSAgICAgIHdoaWxlICghKCotLV9faiA8ICpfX2kpKQorCQl7fQorCSAgICAgIHN0ZDo6aXRlcl9zd2FwKF9faSwgX19qKTsKKwkgICAgICBzdGQ6OnJldmVyc2UoX19paSwgX19sYXN0KTsKKwkgICAgICByZXR1cm4gdHJ1ZTsKKwkgICAgfQorCSAgaWYgKF9faSA9PSBfX2ZpcnN0KQorCSAgICB7CisJICAgICAgc3RkOjpyZXZlcnNlKF9fZmlyc3QsIF9fbGFzdCk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUGVybXV0ZSByYW5nZSBpbnRvIHRoZSBwcmV2aW91cyBAZSBkaWN0aW9uYXJ5IG9yZGVyaW5nIHVzaW5nCisgICAqICAgICAgICAgIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgRW5kIG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIEZhbHNlIGlmIHdyYXBwZWQgdG8gbGFzdCBwZXJtdXRhdGlvbiwgdHJ1ZSBvdGhlcndpc2UuCisgICAqCisgICAqICBUcmVhdHMgYWxsIHBlcm11dGF0aW9ucyBvZiB0aGUgcmFuZ2UgW19fZmlyc3QsX19sYXN0KSBhcyBhIHNldCBvZgorICAgKiAgQGUgZGljdGlvbmFyeSBzb3J0ZWQgc2VxdWVuY2VzIG9yZGVyZWQgYnkgQHAgX19jb21wLiAgUGVybXV0ZXMgdGhlIGN1cnJlbnQKKyAgICogIHNlcXVlbmNlIGludG8gdGhlIHByZXZpb3VzIG9uZSBvZiB0aGlzIHNldC4gIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUKKyAgICogIG1vcmUgc2VxdWVuY2VzIHRvIGdlbmVyYXRlLiAgSWYgdGhlIHNlcXVlbmNlIGlzIHRoZSBzbWFsbGVzdCBvZiB0aGUgc2V0LAorICAgKiAgdGhlIGxhcmdlc3QgaXMgZ2VuZXJhdGVkIGFuZCBmYWxzZSByZXR1cm5lZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgYm9vbAorICAgIHByZXZfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LAorCQkgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBmYWxzZTsKKyAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19pID0gX19maXJzdDsKKyAgICAgICsrX19pOworICAgICAgaWYgKF9faSA9PSBfX2xhc3QpCisJcmV0dXJuIGZhbHNlOworICAgICAgX19pID0gX19sYXN0OworICAgICAgLS1fX2k7CisKKyAgICAgIGZvcig7OykKKwl7CisJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faWkgPSBfX2k7CisJICAtLV9faTsKKwkgIGlmIChfX2NvbXAoKl9faWksICpfX2kpKQorCSAgICB7CisJICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ogPSBfX2xhc3Q7CisJICAgICAgd2hpbGUgKCFib29sKF9fY29tcCgqLS1fX2osICpfX2kpKSkKKwkJe30KKwkgICAgICBzdGQ6Oml0ZXJfc3dhcChfX2ksIF9faik7CisJICAgICAgc3RkOjpyZXZlcnNlKF9faWksIF9fbGFzdCk7CisJICAgICAgcmV0dXJuIHRydWU7CisJICAgIH0KKwkgIGlmIChfX2kgPT0gX19maXJzdCkKKwkgICAgeworCSAgICAgIHN0ZDo6cmV2ZXJzZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLy8gcmVwbGFjZQorICAvLyByZXBsYWNlX2lmCisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29weSBhIHNlcXVlbmNlLCByZXBsYWNpbmcgZWFjaCBlbGVtZW50IG9mIG9uZSB2YWx1ZSB3aXRoIGFub3RoZXIKKyAgICogICAgICAgICB2YWx1ZS4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0ICAgICBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fb2xkX3ZhbHVlICBUaGUgdmFsdWUgdG8gYmUgcmVwbGFjZWQuCisgICAqICBAcGFyYW0gIF9fbmV3X3ZhbHVlICBUaGUgcmVwbGFjZW1lbnQgdmFsdWUuCisgICAqICBAcmV0dXJuICAgVGhlIGVuZCBvZiB0aGUgb3V0cHV0IHNlcXVlbmNlLCBAcCByZXN1bHQrKGxhc3QtZmlyc3QpLgorICAgKgorICAgKiAgQ29waWVzIGVhY2ggZWxlbWVudCBpbiB0aGUgaW5wdXQgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSB0byB0aGUKKyAgICogIG91dHB1dCByYW5nZSBAcCBbX19yZXN1bHQsX19yZXN1bHQrKF9fbGFzdC1fX2ZpcnN0KSkgcmVwbGFjaW5nIGVsZW1lbnRzCisgICAqICBlcXVhbCB0byBAcCBfX29sZF92YWx1ZSB3aXRoIEBwIF9fbmV3X3ZhbHVlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgcmVwbGFjZV9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJIGNvbnN0IF9UcCYgX19vbGRfdmFsdWUsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxPcENvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUsIF9UcD4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19yZXN1bHQpCisJaWYgKCpfX2ZpcnN0ID09IF9fb2xkX3ZhbHVlKQorCSAgKl9fcmVzdWx0ID0gX19uZXdfdmFsdWU7CisJZWxzZQorCSAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgYSBzZXF1ZW5jZSwgcmVwbGFjaW5nIGVhY2ggdmFsdWUgZm9yIHdoaWNoIGEgcHJlZGljYXRlCisgICAqICAgICAgICAgcmV0dXJucyB0cnVlIHdpdGggYW5vdGhlciB2YWx1ZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0ICAgICBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcHJlZCAgICAgICBBIHByZWRpY2F0ZS4KKyAgICogIEBwYXJhbSAgX19uZXdfdmFsdWUgIFRoZSByZXBsYWNlbWVudCB2YWx1ZS4KKyAgICogIEByZXR1cm4gICBUaGUgZW5kIG9mIHRoZSBvdXRwdXQgc2VxdWVuY2UsIEBwIF9fcmVzdWx0KyhfX2xhc3QtX19maXJzdCkuCisgICAqCisgICAqICBDb3BpZXMgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIHRvIHRoZSByYW5nZQorICAgKiAgQHAgW19fcmVzdWx0LF9fcmVzdWx0KyhfX2xhc3QtX19maXJzdCkpIHJlcGxhY2luZyBlbGVtZW50cyBmb3Igd2hpY2gKKyAgICogIEBwIF9fcHJlZCByZXR1cm5zIHRydWUgd2l0aCBAcCBfX25ld192YWx1ZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfVHA+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgcmVwbGFjZV9jb3B5X2lmKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJICAgIF9QcmVkaWNhdGUgX19wcmVkLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5UHJlZGljYXRlQ29uY2VwdDxfUHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX3Jlc3VsdCkKKwlpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgICpfX3Jlc3VsdCA9IF9fbmV3X3ZhbHVlOworCWVsc2UKKwkgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLyoqCisgICAqICBAYnJpZWYgIERldGVybWluZXMgd2hldGhlciB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBhcmUgc29ydGVkLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIHRoZSBlbGVtZW50cyBhcmUgc29ydGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc19zb3J0ZWQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7IHJldHVybiBzdGQ6OmlzX3NvcnRlZF91bnRpbChfX2ZpcnN0LCBfX2xhc3QpID09IF9fbGFzdDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgYXJlIHNvcnRlZAorICAgKiAgICAgICAgICBhY2NvcmRpbmcgdG8gYSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiB0aGUgZWxlbWVudHMgYXJlIHNvcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX3NvcnRlZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7IHJldHVybiBzdGQ6OmlzX3NvcnRlZF91bnRpbChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCkgPT0gX19sYXN0OyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIERldGVybWluZXMgdGhlIGVuZCBvZiBhIHNvcnRlZCBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgaXRlcmF0b3IgaSBpbiBbX19maXJzdCwgX19sYXN0KQorICAgKiAgICAgICAgICAgZm9yIHdoaWNoIHRoZSByYW5nZSBbX19maXJzdCwgaSkgaXMgc29ydGVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBpc19zb3J0ZWRfdW50aWwoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19sYXN0OworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBmb3IgKCsrX19uZXh0OyBfX25leHQgIT0gX19sYXN0OyBfX2ZpcnN0ID0gX19uZXh0LCArK19fbmV4dCkKKwlpZiAoKl9fbmV4dCA8ICpfX2ZpcnN0KQorCSAgcmV0dXJuIF9fbmV4dDsKKyAgICAgIHJldHVybiBfX25leHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBEZXRlcm1pbmVzIHRoZSBlbmQgb2YgYSBzb3J0ZWQgc2VxdWVuY2UgdXNpbmcgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fY29tcCAgICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGl0ZXJhdG9yIGkgaW4gW19fZmlyc3QsIF9fbGFzdCkKKyAgICogICAgICAgICAgIGZvciB3aGljaCB0aGUgcmFuZ2UgW19fZmlyc3QsIGkpIGlzIHNvcnRlZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIGlzX3NvcnRlZF91bnRpbChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fbGFzdDsKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgZm9yICgrK19fbmV4dDsgX19uZXh0ICE9IF9fbGFzdDsgX19maXJzdCA9IF9fbmV4dCwgKytfX25leHQpCisJaWYgKF9fY29tcCgqX19uZXh0LCAqX19maXJzdCkpCisJICByZXR1cm4gX19uZXh0OworICAgICAgcmV0dXJuIF9fbmV4dDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIERldGVybWluZXMgbWluIGFuZCBtYXggYXQgb25jZSBhcyBhbiBvcmRlcmVkIHBhaXIuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19hICBBIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHBhcmFtICBfX2IgIEFub3RoZXIgdGhpbmcgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcmV0dXJuIEEgcGFpcihfX2IsIF9fYSkgaWYgX19iIGlzIHNtYWxsZXIgdGhhbiBfX2EsIHBhaXIoX19hLAorICAgKiAgX19iKSBvdGhlcndpc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcGFpcjxjb25zdCBfVHAmLCBjb25zdCBfVHAmPgorICAgIG1pbm1heChjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDxfVHA+KQorCisgICAgICByZXR1cm4gX19iIDwgX19hID8gcGFpcjxjb25zdCBfVHAmLCBjb25zdCBfVHAmPihfX2IsIF9fYSkKKwkgICAgICAgICAgICAgICA6IHBhaXI8Y29uc3QgX1RwJiwgY29uc3QgX1RwJj4oX19hLCBfX2IpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgRGV0ZXJtaW5lcyBtaW4gYW5kIG1heCBhdCBvbmNlIGFzIGFuIG9yZGVyZWQgcGFpci4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2EgIEEgdGhpbmcgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcGFyYW0gIF9fYiAgQW5vdGhlciB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEBwYXJhbSAgX19jb21wICBBIEBsaW5rIGNvbXBhcmlzb25fZnVuY3RvcnMgY29tcGFyaXNvbiBmdW5jdG9yIEBlbmRsaW5rLgorICAgKiAgQHJldHVybiBBIHBhaXIoX19iLCBfX2EpIGlmIF9fYiBpcyBzbWFsbGVyIHRoYW4gX19hLCBwYWlyKF9fYSwKKyAgICogIF9fYikgb3RoZXJ3aXNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBwYWlyPGNvbnN0IF9UcCYsIGNvbnN0IF9UcCY+CisgICAgbWlubWF4KGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHJldHVybiBfX2NvbXAoX19iLCBfX2EpID8gcGFpcjxjb25zdCBfVHAmLCBjb25zdCBfVHAmPihfX2IsIF9fYSkKKwkgICAgICAgICAgICAgICAgICAgICAgOiBwYWlyPGNvbnN0IF9UcCYsIGNvbnN0IF9UcCY+KF9fYSwgX19iKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhIHBhaXIgb2YgaXRlcmF0b3JzIHBvaW50aW5nIHRvIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtCisgICAqICAgICAgICAgIGVsZW1lbnRzIGluIGEgcmFuZ2UuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEByZXR1cm4gIG1ha2VfcGFpcihtLCBNKSwgd2hlcmUgbSBpcyB0aGUgZmlyc3QgaXRlcmF0b3IgaSBpbiAKKyAgICogICAgICAgICAgIFtfX2ZpcnN0LCBfX2xhc3QpIHN1Y2ggdGhhdCBubyBvdGhlciBlbGVtZW50IGluIHRoZSByYW5nZSBpcworICAgKiAgICAgICAgICAgc21hbGxlciwgYW5kIHdoZXJlIE0gaXMgdGhlIGxhc3QgaXRlcmF0b3IgaSBpbiBbX19maXJzdCwgX19sYXN0KQorICAgKiAgICAgICAgICAgc3VjaCB0aGF0IG5vIG90aGVyIGVsZW1lbnQgaW4gdGhlIHJhbmdlIGlzIGxhcmdlci4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgbWlubWF4X2VsZW1lbnQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdAorCSAgfHwgKytfX25leHQgPT0gX19sYXN0KQorCXJldHVybiBzdGQ6Om1ha2VfcGFpcihfX2ZpcnN0LCBfX2ZpcnN0KTsKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pbiwgX19tYXg7CisgICAgICBpZiAoKl9fbmV4dCA8ICpfX2ZpcnN0KQorCXsKKwkgIF9fbWluID0gX19uZXh0OworCSAgX19tYXggPSBfX2ZpcnN0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfX21pbiA9IF9fZmlyc3Q7CisJICBfX21heCA9IF9fbmV4dDsKKwl9CisKKyAgICAgIF9fZmlyc3QgPSBfX25leHQ7CisgICAgICArK19fZmlyc3Q7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICBfX25leHQgPSBfX2ZpcnN0OworCSAgaWYgKCsrX19uZXh0ID09IF9fbGFzdCkKKwkgICAgeworCSAgICAgIGlmICgqX19maXJzdCA8ICpfX21pbikKKwkJX19taW4gPSBfX2ZpcnN0OworCSAgICAgIGVsc2UgaWYgKCEoKl9fZmlyc3QgPCAqX19tYXgpKQorCQlfX21heCA9IF9fZmlyc3Q7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgaWYgKCpfX25leHQgPCAqX19maXJzdCkKKwkgICAgeworCSAgICAgIGlmICgqX19uZXh0IDwgKl9fbWluKQorCQlfX21pbiA9IF9fbmV4dDsKKwkgICAgICBpZiAoISgqX19maXJzdCA8ICpfX21heCkpCisJCV9fbWF4ID0gX19maXJzdDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCpfX2ZpcnN0IDwgKl9fbWluKQorCQlfX21pbiA9IF9fZmlyc3Q7CisJICAgICAgaWYgKCEoKl9fbmV4dCA8ICpfX21heCkpCisJCV9fbWF4ID0gX19uZXh0OworCSAgICB9CisKKwkgIF9fZmlyc3QgPSBfX25leHQ7CisJICArK19fZmlyc3Q7CisJfQorCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoX19taW4sIF9fbWF4KTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhIHBhaXIgb2YgaXRlcmF0b3JzIHBvaW50aW5nIHRvIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtCisgICAqICAgICAgICAgIGVsZW1lbnRzIGluIGEgcmFuZ2UuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgQ29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgbWFrZV9wYWlyKG0sIE0pLCB3aGVyZSBtIGlzIHRoZSBmaXJzdCBpdGVyYXRvciBpIGluIAorICAgKiAgICAgICAgICAgW19fZmlyc3QsIF9fbGFzdCkgc3VjaCB0aGF0IG5vIG90aGVyIGVsZW1lbnQgaW4gdGhlIHJhbmdlIGlzCisgICAqICAgICAgICAgICBzbWFsbGVyLCBhbmQgd2hlcmUgTSBpcyB0aGUgbGFzdCBpdGVyYXRvciBpIGluIFtfX2ZpcnN0LCBfX2xhc3QpCisgICAqICAgICAgICAgICBzdWNoIHRoYXQgbm8gb3RoZXIgZWxlbWVudCBpbiB0aGUgcmFuZ2UgaXMgbGFyZ2VyLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgbWlubWF4X2VsZW1lbnQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QKKwkgIHx8ICsrX19uZXh0ID09IF9fbGFzdCkKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoX19maXJzdCwgX19maXJzdCk7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taW4sIF9fbWF4OworICAgICAgaWYgKF9fY29tcCgqX19uZXh0LCAqX19maXJzdCkpCisJeworCSAgX19taW4gPSBfX25leHQ7CisJICBfX21heCA9IF9fZmlyc3Q7CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9fbWluID0gX19maXJzdDsKKwkgIF9fbWF4ID0gX19uZXh0OworCX0KKworICAgICAgX19maXJzdCA9IF9fbmV4dDsKKyAgICAgICsrX19maXJzdDsKKworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIF9fbmV4dCA9IF9fZmlyc3Q7CisJICBpZiAoKytfX25leHQgPT0gX19sYXN0KQorCSAgICB7CisJICAgICAgaWYgKF9fY29tcCgqX19maXJzdCwgKl9fbWluKSkKKwkJX19taW4gPSBfX2ZpcnN0OworCSAgICAgIGVsc2UgaWYgKCFfX2NvbXAoKl9fZmlyc3QsICpfX21heCkpCisJCV9fbWF4ID0gX19maXJzdDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICBpZiAoX19jb21wKCpfX25leHQsICpfX2ZpcnN0KSkKKwkgICAgeworCSAgICAgIGlmIChfX2NvbXAoKl9fbmV4dCwgKl9fbWluKSkKKwkJX19taW4gPSBfX25leHQ7CisJICAgICAgaWYgKCFfX2NvbXAoKl9fZmlyc3QsICpfX21heCkpCisJCV9fbWF4ID0gX19maXJzdDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKF9fY29tcCgqX19maXJzdCwgKl9fbWluKSkKKwkJX19taW4gPSBfX2ZpcnN0OworCSAgICAgIGlmICghX19jb21wKCpfX25leHQsICpfX21heCkpCisJCV9fbWF4ID0gX19uZXh0OworCSAgICB9CisKKwkgIF9fZmlyc3QgPSBfX25leHQ7CisJICArK19fZmlyc3Q7CisJfQorCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoX19taW4sIF9fbWF4KTsKKyAgICB9CisKKyAgLy8gTjI3MjIgKyBEUiA5MTUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgbWluKGluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2wpCisgICAgeyByZXR1cm4gKnN0ZDo6bWluX2VsZW1lbnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfVHAKKyAgICBtaW4oaW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9fbCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsgcmV0dXJuICpzdGQ6Om1pbl9lbGVtZW50KF9fbC5iZWdpbigpLCBfX2wuZW5kKCksIF9fY29tcCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIG1heChpbml0aWFsaXplcl9saXN0PF9UcD4gX19sKQorICAgIHsgcmV0dXJuICpzdGQ6Om1heF9lbGVtZW50KF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX1RwCisgICAgbWF4KGluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2wsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7IHJldHVybiAqc3RkOjptYXhfZWxlbWVudChfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfX2NvbXApOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBwYWlyPF9UcCwgX1RwPgorICAgIG1pbm1heChpbml0aWFsaXplcl9saXN0PF9UcD4gX19sKQorICAgIHsKKyAgICAgIHBhaXI8Y29uc3QgX1RwKiwgY29uc3QgX1RwKj4gX19wID0KKwlzdGQ6Om1pbm1heF9lbGVtZW50KF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCpfX3AuZmlyc3QsICpfX3Auc2Vjb25kKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgcGFpcjxfVHAsIF9UcD4KKyAgICBtaW5tYXgoaW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9fbCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHBhaXI8Y29uc3QgX1RwKiwgY29uc3QgX1RwKj4gX19wID0KKwlzdGQ6Om1pbm1heF9lbGVtZW50KF9fbC5iZWdpbigpLCBfX2wuZW5kKCksIF9fY29tcCk7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoKl9fcC5maXJzdCwgKl9fcC5zZWNvbmQpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgYSBwZXJtdXRhaW9uIG9mIHRoZSBzZWNvbmQgc2VxdWVuY2UgaXMgZXF1YWwKKyAgICogICAgICAgICAgdG8gdGhlIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIFN0YXJ0IG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgRW5kIG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgU3RhcnQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHJldHVybiB0cnVlIGlmIHRoZXJlIGV4aXN0cyBhIHBlcm11dGF0aW9uIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UKKyAgICogICAgICAgICAgW19fZmlyc3QyLCBfX2ZpcnN0MiArIChfX2xhc3QxIC0gX19maXJzdDEpKSwgYmVnaW5uaW5nIHdpdGggCisgICAqICAgICAgICAgIEZvcndhcmRJdGVyYXRvcjIgYmVnaW4sIHN1Y2ggdGhhdCBlcXVhbChfX2ZpcnN0MSwgX19sYXN0MSwgYmVnaW4pCisgICAqICAgICAgICAgIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjI+CisgICAgYm9vbAorICAgIGlzX3Blcm11dGF0aW9uKF9Gb3J3YXJkSXRlcmF0b3IxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MikKKyAgICB7CisgICAgICAvLyBFZmZpY2llbnRseSBjb21wYXJlIGlkZW50aWNhbCBwcmVmaXhlczogIE8oTikgaWYgc2VxdWVuY2VzCisgICAgICAvLyBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLgorICAgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIpCisJaWYgKCEoKl9fZmlyc3QxID09ICpfX2ZpcnN0MikpCisJICBicmVhazsKKworICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCisJcmV0dXJuIHRydWU7CisKKyAgICAgIC8vIEVzdGFibGlzaCBfX2xhc3QyIGFzc3VtaW5nIGVxdWFsIHJhbmdlcyBieSBpdGVyYXRpbmcgb3ZlciB0aGUKKyAgICAgIC8vIHJlc3Qgb2YgdGhlIGxpc3QuCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyID0gX19maXJzdDI7CisgICAgICBzdGQ6OmFkdmFuY2UoX19sYXN0Miwgc3RkOjpkaXN0YW5jZShfX2ZpcnN0MSwgX19sYXN0MSkpOworICAgICAgZm9yIChfRm9yd2FyZEl0ZXJhdG9yMSBfX3NjYW4gPSBfX2ZpcnN0MTsgX19zY2FuICE9IF9fbGFzdDE7ICsrX19zY2FuKQorCXsKKwkgIGlmIChfX3NjYW4gIT0gX0dMSUJDWFhfU1REX0E6OmZpbmQoX19maXJzdDEsIF9fc2NhbiwgKl9fc2NhbikpCisJICAgIGNvbnRpbnVlOyAvLyBXZSd2ZSBzZWVuIHRoaXMgb25lIGJlZm9yZS4KKworCSAgYXV0byBfX21hdGNoZXMgPSBzdGQ6OmNvdW50KF9fZmlyc3QyLCBfX2xhc3QyLCAqX19zY2FuKTsKKwkgIGlmICgwID09IF9fbWF0Y2hlcworCSAgICAgIHx8IHN0ZDo6Y291bnQoX19zY2FuLCBfX2xhc3QxLCAqX19zY2FuKSAhPSBfX21hdGNoZXMpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIGEgcGVybXV0YXRpb24gb2YgdGhlIHNlY29uZCBzZXF1ZW5jZSBpcyBlcXVhbAorICAgKiAgICAgICAgICB0byB0aGUgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgU3RhcnQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBFbmQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBTdGFydCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fcHJlZCAgICBBIGJpbmFyeSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuIHRydWUgaWYgdGhlcmUgZXhpc3RzIGEgcGVybXV0YXRpb24gb2YgdGhlIGVsZW1lbnRzIGluCisgICAqICAgICAgICAgIHRoZSByYW5nZSBbX19maXJzdDIsIF9fZmlyc3QyICsgKF9fbGFzdDEgLSBfX2ZpcnN0MSkpLAorICAgKiAgICAgICAgICBiZWdpbm5pbmcgd2l0aCBGb3J3YXJkSXRlcmF0b3IyIGJlZ2luLCBzdWNoIHRoYXQKKyAgICogICAgICAgICAgZXF1YWwoX19maXJzdDEsIF9fbGFzdDEsIF9fYmVnaW4sIF9fcHJlZCkgcmV0dXJucyB0cnVlOworICAgKiAgICAgICAgICBvdGhlcndpc2UsIHJldHVybnMgZmFsc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGJvb2wKKyAgICBpc19wZXJtdXRhdGlvbihfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKwkJICAgX0ZvcndhcmRJdGVyYXRvcjIgX19maXJzdDIsIF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIC8vIEVmZmljaWVudGx5IGNvbXBhcmUgaWRlbnRpY2FsIHByZWZpeGVzOiAgTyhOKSBpZiBzZXF1ZW5jZXMKKyAgICAgIC8vIGhhdmUgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuCisgICAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKwlpZiAoIWJvb2woX19wcmVkKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkpCisJICBicmVhazsKKworICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCisJcmV0dXJuIHRydWU7CisKKyAgICAgIC8vIEVzdGFibGlzaCBfX2xhc3QyIGFzc3VtaW5nIGVxdWFsIHJhbmdlcyBieSBpdGVyYXRpbmcgb3ZlciB0aGUKKyAgICAgIC8vIHJlc3Qgb2YgdGhlIGxpc3QuCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyID0gX19maXJzdDI7CisgICAgICBzdGQ6OmFkdmFuY2UoX19sYXN0Miwgc3RkOjpkaXN0YW5jZShfX2ZpcnN0MSwgX19sYXN0MSkpOworICAgICAgZm9yIChfRm9yd2FyZEl0ZXJhdG9yMSBfX3NjYW4gPSBfX2ZpcnN0MTsgX19zY2FuICE9IF9fbGFzdDE7ICsrX19zY2FuKQorCXsKKwkgIHVzaW5nIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMTsKKworCSAgaWYgKF9fc2NhbiAhPSBfR0xJQkNYWF9TVERfQTo6ZmluZF9pZihfX2ZpcnN0MSwgX19zY2FuLAorCQkJCQkJc3RkOjpiaW5kKF9fcHJlZCwgXzEsICpfX3NjYW4pKSkKKwkgICAgY29udGludWU7IC8vIFdlJ3ZlIHNlZW4gdGhpcyBvbmUgYmVmb3JlLgorCSAgCisJICBhdXRvIF9fbWF0Y2hlcyA9IHN0ZDo6Y291bnRfaWYoX19maXJzdDIsIF9fbGFzdDIsCisJCQkJCSBzdGQ6OmJpbmQoX19wcmVkLCBfMSwgKl9fc2NhbikpOworCSAgaWYgKDAgPT0gX19tYXRjaGVzCisJICAgICAgfHwgc3RkOjpjb3VudF9pZihfX3NjYW4sIF9fbGFzdDEsCisJCQkgICAgICAgc3RkOjpiaW5kKF9fcHJlZCwgXzEsICpfX3NjYW4pKSAhPSBfX21hdGNoZXMpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKyAgLyoqCisgICAqICBAYnJpZWYgU2h1ZmZsZSB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSB1c2luZyBhIHVuaWZvcm0gcmFuZG9tCisgICAqICAgICAgICAgbnVtYmVyIGdlbmVyYXRvci4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19nICAgICAgIEEgVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciAoMjYuNS4xLjMpLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFJlb3JkZXJzIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSB1c2luZyBAcCBfX2cgdG8KKyAgICogIHByb3ZpZGUgcmFuZG9tIG51bWJlcnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICB2b2lkCisgICAgc2h1ZmZsZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImJiBfX2cpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Om1ha2VfdW5zaWduZWQ8X0Rpc3RhbmNlVHlwZT46OnR5cGUgX191ZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfX3VkX3R5cGU+IF9fZGlzdHJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kaXN0cl90eXBlOjpwYXJhbV90eXBlIF9fcF90eXBlOworICAgICAgX19kaXN0cl90eXBlIF9fZDsKKworICAgICAgZm9yIChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19pID0gX19maXJzdCArIDE7IF9faSAhPSBfX2xhc3Q7ICsrX19pKQorCXN0ZDo6aXRlcl9zd2FwKF9faSwgX19maXJzdCArIF9fZChfX2csIF9fcF90eXBlKDAsIF9faSAtIF9fZmlyc3QpKSk7CisgICAgfQorI2VuZGlmCisKKyNlbmRpZiAvLyBDKysxMQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0FMR08KKworICAvKioKKyAgICogIEBicmllZiBBcHBseSBhIGZ1bmN0aW9uIHRvIGV2ZXJ5IGVsZW1lbnQgb2YgYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19mICAgICAgQSB1bmFyeSBmdW5jdGlvbiBvYmplY3QuCisgICAqICBAcmV0dXJuICAgQHAgX19mIChzdGQ6Om1vdmUoQHAgX19mKSBpbiBDKysweCkuCisgICAqCisgICAqICBBcHBsaWVzIHRoZSBmdW5jdGlvbiBvYmplY3QgQHAgX19mIHRvIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtmaXJzdCxsYXN0KS4gIEBwIF9fZiBtdXN0IG5vdCBtb2RpZnkgdGhlIG9yZGVyIG9mIHRoZSBzZXF1ZW5jZS4KKyAgICogIElmIEBwIF9fZiBoYXMgYSByZXR1cm4gdmFsdWUgaXQgaXMgaWdub3JlZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9GdW5jdGlvbj4KKyAgICBfRnVuY3Rpb24KKyAgICBmb3JfZWFjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9GdW5jdGlvbiBfX2YpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlfX2YoKl9fZmlyc3QpOworICAgICAgcmV0dXJuIF9HTElCQ1hYX01PVkUoX19mKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHZhbHVlIGluIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fdmFsICAgIFRoZSB2YWx1ZSB0byBmaW5kLgorICAgKiAgQHJldHVybiAgIFRoZSBmaXJzdCBpdGVyYXRvciBAYyBpIGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpCisgICAqICBzdWNoIHRoYXQgQGMgKmkgPT0gQHAgX192YWwsIG9yIEBwIF9fbGFzdCBpZiBubyBzdWNoIGl0ZXJhdG9yIGV4aXN0cy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0lucHV0SXRlcmF0b3IKKyAgICBmaW5kKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCQl0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlLCBfVHA+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICByZXR1cm4gc3RkOjpfX2ZpbmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCwKKwkJICAgICAgICAgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZCB0aGUgZmlyc3QgZWxlbWVudCBpbiBhIHNlcXVlbmNlIGZvciB3aGljaCBhCisgICAqICAgICAgICAgcHJlZGljYXRlIGlzIHRydWUuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcHJlZCAgIEEgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgIFRoZSBmaXJzdCBpdGVyYXRvciBAYyBpIGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpCisgICAqICBzdWNoIHRoYXQgQHAgX19wcmVkKCppKSBpcyB0cnVlLCBvciBAcCBfX2xhc3QgaWYgbm8gc3VjaCBpdGVyYXRvciBleGlzdHMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfSW5wdXRJdGVyYXRvcgorICAgIGZpbmRfaWYoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5UHJlZGljYXRlQ29uY2VwdDxfUHJlZGljYXRlLAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICByZXR1cm4gc3RkOjpfX2ZpbmRfaWYoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsCisJCQkgICAgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZpbmQgZWxlbWVudCBmcm9tIGEgc2V0IGluIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgU3RhcnQgb2YgcmFuZ2UgdG8gc2VhcmNoLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgRW5kIG9mIHJhbmdlIHRvIHNlYXJjaC4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIFN0YXJ0IG9mIG1hdGNoIGNhbmRpZGF0ZXMuCisgICAqICBAcGFyYW0gIF9fbGFzdDIgICBFbmQgb2YgbWF0Y2ggY2FuZGlkYXRlcy4KKyAgICogIEByZXR1cm4gICBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0MSxfX2xhc3QxKSBzdWNoIHRoYXQgQGMgKmkgPT0gQHAgKihpMikgc3VjaCB0aGF0IGkyIGlzIGFuCisgICAqICBpdGVyYXRvciBpbiBbX19maXJzdDIsX19sYXN0MiksIG9yIEBwIF9fbGFzdDEgaWYgbm8gc3VjaCBpdGVyYXRvciBleGlzdHMuCisgICAqCisgICAqICBTZWFyY2hlcyB0aGUgcmFuZ2UgQHAgW19fZmlyc3QxLF9fbGFzdDEpIGZvciBhbiBlbGVtZW50IHRoYXQgaXMKKyAgICogIGVxdWFsIHRvIHNvbWUgZWxlbWVudCBpbiB0aGUgcmFuZ2UgW19fZmlyc3QyLF9fbGFzdDIpLiAgSWYKKyAgICogIGZvdW5kLCByZXR1cm5zIGFuIGl0ZXJhdG9yIGluIHRoZSByYW5nZSBbX19maXJzdDEsX19sYXN0MSksCisgICAqICBvdGhlcndpc2UgcmV0dXJucyBAcCBfX2xhc3QxLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBfSW5wdXRJdGVyYXRvcgorICAgIGZpbmRfZmlyc3Rfb2YoX0lucHV0SXRlcmF0b3IgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdDEsCisJCSAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QyKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxPcENvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKTsKKworICAgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEpCisJZm9yIChfRm9yd2FyZEl0ZXJhdG9yIF9faXRlciA9IF9fZmlyc3QyOyBfX2l0ZXIgIT0gX19sYXN0MjsgKytfX2l0ZXIpCisJICBpZiAoKl9fZmlyc3QxID09ICpfX2l0ZXIpCisJICAgIHJldHVybiBfX2ZpcnN0MTsKKyAgICAgIHJldHVybiBfX2xhc3QxOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgRmluZCBlbGVtZW50IGZyb20gYSBzZXQgaW4gYSBzZXF1ZW5jZSB1c2luZyBhIHByZWRpY2F0ZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBTdGFydCBvZiByYW5nZSB0byBzZWFyY2guCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBFbmQgb2YgcmFuZ2UgdG8gc2VhcmNoLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgU3RhcnQgb2YgbWF0Y2ggY2FuZGlkYXRlcy4KKyAgICogIEBwYXJhbSAgX19sYXN0MiAgIEVuZCBvZiBtYXRjaCBjYW5kaWRhdGVzLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICAgUHJlZGljYXRlIHRvIHVzZS4KKyAgICogIEByZXR1cm4gICBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0MSxfX2xhc3QxKSBzdWNoIHRoYXQgQGMgY29tcCgqaSwgQHAgKihpMikpIGlzIHRydWUKKyAgICogIGFuZCBpMiBpcyBhbiBpdGVyYXRvciBpbiBbX19maXJzdDIsX19sYXN0MiksIG9yIEBwIF9fbGFzdDEgaWYgbm8KKyAgICogIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAgKgorCisgICAqICBTZWFyY2hlcyB0aGUgcmFuZ2UgQHAgW19fZmlyc3QxLF9fbGFzdDEpIGZvciBhbiBlbGVtZW50IHRoYXQgaXMKKyAgICogIGVxdWFsIHRvIHNvbWUgZWxlbWVudCBpbiB0aGUgcmFuZ2UgW19fZmlyc3QyLF9fbGFzdDIpLiAgSWYKKyAgICogIGZvdW5kLCByZXR1cm5zIGFuIGl0ZXJhdG9yIGluIHRoZSByYW5nZSBbX19maXJzdDEsX19sYXN0MSksCisgICAqICBvdGhlcndpc2UgcmV0dXJucyBAcCBfX2xhc3QxLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9JbnB1dEl0ZXJhdG9yCisgICAgZmluZF9maXJzdF9vZihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IgX19sYXN0MSwKKwkJICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdDIsCisJCSAgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9CaW5hcnlQcmVkaWNhdGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKTsKKworICAgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEpCisJZm9yIChfRm9yd2FyZEl0ZXJhdG9yIF9faXRlciA9IF9fZmlyc3QyOyBfX2l0ZXIgIT0gX19sYXN0MjsgKytfX2l0ZXIpCisJICBpZiAoX19jb21wKCpfX2ZpcnN0MSwgKl9faXRlcikpCisJICAgIHJldHVybiBfX2ZpcnN0MTsKKyAgICAgIHJldHVybiBfX2xhc3QxOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kIHR3byBhZGphY2VudCB2YWx1ZXMgaW4gYSBzZXF1ZW5jZSB0aGF0IGFyZSBlcXVhbC4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIFRoZSBmaXJzdCBpdGVyYXRvciBAYyBpIHN1Y2ggdGhhdCBAYyBpIGFuZCBAYyBpKzEgYXJlIGJvdGgKKyAgICogIHZhbGlkIGl0ZXJhdG9ycyBpbiBAcCBbX19maXJzdCxfX2xhc3QpIGFuZCBzdWNoIHRoYXQgQGMgKmkgPT0gQGMgKihpKzEpLAorICAgKiAgb3IgQHAgX19sYXN0IGlmIG5vIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBhZGphY2VudF9maW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxpdHlDb21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2xhc3Q7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICB3aGlsZSgrK19fbmV4dCAhPSBfX2xhc3QpCisJeworCSAgaWYgKCpfX2ZpcnN0ID09ICpfX25leHQpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgX19maXJzdCA9IF9fbmV4dDsKKwl9CisgICAgICByZXR1cm4gX19sYXN0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kIHR3byBhZGphY2VudCB2YWx1ZXMgaW4gYSBzZXF1ZW5jZSB1c2luZyBhIHByZWRpY2F0ZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICAgICAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICAgICAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fYmluYXJ5X3ByZWQgICBBIGJpbmFyeSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuICAgVGhlIGZpcnN0IGl0ZXJhdG9yIEBjIGkgc3VjaCB0aGF0IEBjIGkgYW5kIEBjIGkrMSBhcmUgYm90aAorICAgKiAgdmFsaWQgaXRlcmF0b3JzIGluIEBwIFtfX2ZpcnN0LF9fbGFzdCkgYW5kIHN1Y2ggdGhhdAorICAgKiAgQHAgX19iaW5hcnlfcHJlZCgqaSwqKGkrMSkpIGlzIHRydWUsIG9yIEBwIF9fbGFzdCBpZiBubyBzdWNoIGl0ZXJhdG9yCisgICAqICBleGlzdHMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIGFkamFjZW50X2ZpbmQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQmluYXJ5UHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19sYXN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgd2hpbGUoKytfX25leHQgIT0gX19sYXN0KQorCXsKKwkgIGlmIChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICBfX2ZpcnN0ID0gX19uZXh0OworCX0KKyAgICAgIHJldHVybiBfX2xhc3Q7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvdW50IHRoZSBudW1iZXIgb2YgY29waWVzIG9mIGEgdmFsdWUgaW4gYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX192YWx1ZSAgVGhlIHZhbHVlIHRvIGJlIGNvdW50ZWQuCisgICAqICBAcmV0dXJuICAgVGhlIG51bWJlciBvZiBpdGVyYXRvcnMgQGMgaSBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KQorICAgKiAgZm9yIHdoaWNoIEBjICppID09IEBwIF9fdmFsdWUKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBjb3VudChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCXR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUsIF9UcD4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX24gPSAwOworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJaWYgKCpfX2ZpcnN0ID09IF9fdmFsdWUpCisJICArK19fbjsKKyAgICAgIHJldHVybiBfX247CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvdW50IHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIGZvciB3aGljaCBhIHByZWRpY2F0ZSBpcyB0cnVlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICBBIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gICBUaGUgbnVtYmVyIG9mIGl0ZXJhdG9ycyBAYyBpIGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpCisgICAqICBmb3Igd2hpY2ggQHAgX19wcmVkKCppKSBpcyB0cnVlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBjb3VudF9pZihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfVW5hcnlQcmVkaWNhdGVDb25jZXB0PF9QcmVkaWNhdGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19uID0gMDsKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCWlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgKytfX247CisgICAgICByZXR1cm4gX19uOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBTZWFyY2ggYSBzZXF1ZW5jZSBmb3IgYSBtYXRjaGluZyBzdWItc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UgQHAKKyAgICogIFtfX2ZpcnN0MSxfX2xhc3QxLShfX2xhc3QyLV9fZmlyc3QyKSkgc3VjaCB0aGF0IEBjICooaStOKSA9PSBAcAorICAgKiAgKihfX2ZpcnN0MitOKSBmb3IgZWFjaCBAYyBOIGluIHRoZSByYW5nZSBAcAorICAgKiAgWzAsX19sYXN0Mi1fX2ZpcnN0MiksIG9yIEBwIF9fbGFzdDEgaWYgbm8gc3VjaCBpdGVyYXRvciBleGlzdHMuCisgICAqCisgICAqICBTZWFyY2hlcyB0aGUgcmFuZ2UgQHAgW19fZmlyc3QxLF9fbGFzdDEpIGZvciBhIHN1Yi1zZXF1ZW5jZSB0aGF0CisgICAqICBjb21wYXJlcyBlcXVhbCB2YWx1ZS1ieS12YWx1ZSB3aXRoIHRoZSBzZXF1ZW5jZSBnaXZlbiBieSBAcAorICAgKiAgW19fZmlyc3QyLF9fbGFzdDIpIGFuZCByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50CisgICAqICBvZiB0aGUgc3ViLXNlcXVlbmNlLCBvciBAcCBfX2xhc3QxIGlmIHRoZSBzdWItc2VxdWVuY2UgaXMgbm90CisgICAqICBmb3VuZC4KKyAgICoKKyAgICogIEJlY2F1c2UgdGhlIHN1Yi1zZXF1ZW5jZSBtdXN0IGxpZSBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgcmFuZ2UgQHAKKyAgICogIFtfX2ZpcnN0MSxfX2xhc3QxKSBpdCBtdXN0IHN0YXJ0IGF0IGEgcG9zaXRpb24gbGVzcyB0aGFuIEBwCisgICAqICBfX2xhc3QxLShfX2xhc3QyLV9fZmlyc3QyKSB3aGVyZSBAcCBfX2xhc3QyLV9fZmlyc3QyIGlzIHRoZQorICAgKiAgbGVuZ3RoIG9mIHRoZSBzdWItc2VxdWVuY2UuCisgICAqCisgICAqICBUaGlzIG1lYW5zIHRoYXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yIEBjIGkgd2lsbCBiZSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0MSxfX2xhc3QxLShfX2xhc3QyLV9fZmlyc3QyKSkKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IxCisgICAgc2VhcmNoKF9Gb3J3YXJkSXRlcmF0b3IxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxPcENvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MiwgX19sYXN0Mik7CisKKyAgICAgIC8vIFRlc3QgZm9yIGVtcHR5IHJhbmdlcworICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEgfHwgX19maXJzdDIgPT0gX19sYXN0MikKKwlyZXR1cm4gX19maXJzdDE7CisKKyAgICAgIC8vIFRlc3QgZm9yIGEgcGF0dGVybiBvZiBsZW5ndGggMS4KKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fcDEoX19maXJzdDIpOworICAgICAgaWYgKCsrX19wMSA9PSBfX2xhc3QyKQorCXJldHVybiBfR0xJQkNYWF9TVERfQTo6ZmluZChfX2ZpcnN0MSwgX19sYXN0MSwgKl9fZmlyc3QyKTsKKworICAgICAgLy8gR2VuZXJhbCBjYXNlLgorICAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19wOworICAgICAgX0ZvcndhcmRJdGVyYXRvcjEgX19jdXJyZW50ID0gX19maXJzdDE7CisKKyAgICAgIGZvciAoOzspCisJeworCSAgX19maXJzdDEgPSBfR0xJQkNYWF9TVERfQTo6ZmluZChfX2ZpcnN0MSwgX19sYXN0MSwgKl9fZmlyc3QyKTsKKwkgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKQorCSAgICByZXR1cm4gX19sYXN0MTsKKworCSAgX19wID0gX19wMTsKKwkgIF9fY3VycmVudCA9IF9fZmlyc3QxOworCSAgaWYgKCsrX19jdXJyZW50ID09IF9fbGFzdDEpCisJICAgIHJldHVybiBfX2xhc3QxOworCisJICB3aGlsZSAoKl9fY3VycmVudCA9PSAqX19wKQorCSAgICB7CisJICAgICAgaWYgKCsrX19wID09IF9fbGFzdDIpCisJCXJldHVybiBfX2ZpcnN0MTsKKwkgICAgICBpZiAoKytfX2N1cnJlbnQgPT0gX19sYXN0MSkKKwkJcmV0dXJuIF9fbGFzdDE7CisJICAgIH0KKwkgICsrX19maXJzdDE7CisJfQorICAgICAgcmV0dXJuIF9fZmlyc3QxOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBTZWFyY2ggYSBzZXF1ZW5jZSBmb3IgYSBtYXRjaGluZyBzdWItc2VxdWVuY2UgdXNpbmcgYSBwcmVkaWNhdGUuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWRpY2F0ZSAgQSBiaW5hcnkgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgIFRoZSBmaXJzdCBpdGVyYXRvciBAYyBpIGluIHRoZSByYW5nZQorICAgKiAgQHAgW19fZmlyc3QxLF9fbGFzdDEtKF9fbGFzdDItX19maXJzdDIpKSBzdWNoIHRoYXQKKyAgICogIEBwIF9fcHJlZGljYXRlKCooaStOKSwqKF9fZmlyc3QyK04pKSBpcyB0cnVlIGZvciBlYWNoIEBjIE4gaW4gdGhlIHJhbmdlCisgICAqICBAcCBbMCxfX2xhc3QyLV9fZmlyc3QyKSwgb3IgQHAgX19sYXN0MSBpZiBubyBzdWNoIGl0ZXJhdG9yIGV4aXN0cy4KKyAgICoKKyAgICogIFNlYXJjaGVzIHRoZSByYW5nZSBAcCBbX19maXJzdDEsX19sYXN0MSkgZm9yIGEgc3ViLXNlcXVlbmNlIHRoYXQKKyAgICogIGNvbXBhcmVzIGVxdWFsIHZhbHVlLWJ5LXZhbHVlIHdpdGggdGhlIHNlcXVlbmNlIGdpdmVuIGJ5IEBwCisgICAqICBbX19maXJzdDIsX19sYXN0MiksIHVzaW5nIEBwIF9fcHJlZGljYXRlIHRvIGRldGVybWluZSBlcXVhbGl0eSwKKyAgICogIGFuZCByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZQorICAgKiAgc3ViLXNlcXVlbmNlLCBvciBAcCBfX2xhc3QxIGlmIG5vIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAgKgorICAgKiAgQHNlZSBzZWFyY2goX0ZvcndhcmRJdGVyMSwgX0ZvcndhcmRJdGVyMSwgX0ZvcndhcmRJdGVyMiwgX0ZvcndhcmRJdGVyMikKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0ZvcndhcmRJdGVyYXRvcjEKKyAgICBzZWFyY2goX0ZvcndhcmRJdGVyYXRvcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbGFzdDEsCisJICAgX0ZvcndhcmRJdGVyYXRvcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcmF0b3IyIF9fbGFzdDIsCisJICAgX0JpbmFyeVByZWRpY2F0ZSAgX19wcmVkaWNhdGUpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9CaW5hcnlQcmVkaWNhdGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MiwgX19sYXN0Mik7CisKKyAgICAgIC8vIFRlc3QgZm9yIGVtcHR5IHJhbmdlcworICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEgfHwgX19maXJzdDIgPT0gX19sYXN0MikKKwlyZXR1cm4gX19maXJzdDE7CisKKyAgICAgIC8vIFRlc3QgZm9yIGEgcGF0dGVybiBvZiBsZW5ndGggMS4KKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fcDEoX19maXJzdDIpOworICAgICAgaWYgKCsrX19wMSA9PSBfX2xhc3QyKQorCXsKKwkgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxCisJCSAmJiAhYm9vbChfX3ByZWRpY2F0ZSgqX19maXJzdDEsICpfX2ZpcnN0MikpKQorCSAgICArK19fZmlyc3QxOworCSAgcmV0dXJuIF9fZmlyc3QxOworCX0KKworICAgICAgLy8gR2VuZXJhbCBjYXNlLgorICAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19wOworICAgICAgX0ZvcndhcmRJdGVyYXRvcjEgX19jdXJyZW50ID0gX19maXJzdDE7CisKKyAgICAgIGZvciAoOzspCisJeworCSAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEKKwkJICYmICFib29sKF9fcHJlZGljYXRlKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkpCisJICAgICsrX19maXJzdDE7CisJICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKKwkgICAgcmV0dXJuIF9fbGFzdDE7CisKKwkgIF9fcCA9IF9fcDE7CisJICBfX2N1cnJlbnQgPSBfX2ZpcnN0MTsKKwkgIGlmICgrK19fY3VycmVudCA9PSBfX2xhc3QxKQorCSAgICByZXR1cm4gX19sYXN0MTsKKworCSAgd2hpbGUgKF9fcHJlZGljYXRlKCpfX2N1cnJlbnQsICpfX3ApKQorCSAgICB7CisJICAgICAgaWYgKCsrX19wID09IF9fbGFzdDIpCisJCXJldHVybiBfX2ZpcnN0MTsKKwkgICAgICBpZiAoKytfX2N1cnJlbnQgPT0gX19sYXN0MSkKKwkJcmV0dXJuIF9fbGFzdDE7CisJICAgIH0KKwkgICsrX19maXJzdDE7CisJfQorICAgICAgcmV0dXJuIF9fZmlyc3QxOworICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIFNlYXJjaCBhIHNlcXVlbmNlIGZvciBhIG51bWJlciBvZiBjb25zZWN1dGl2ZSB2YWx1ZXMuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19jb3VudCAgVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSB2YWx1ZXMuCisgICAqICBAcGFyYW0gIF9fdmFsICAgIFRoZSB2YWx1ZSB0byBmaW5kLgorICAgKiAgQHJldHVybiBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UgQHAKKyAgICogIFtfX2ZpcnN0LF9fbGFzdC1fX2NvdW50KSBzdWNoIHRoYXQgQGMgKihpK04pID09IEBwIF9fdmFsIGZvcgorICAgKiAgZWFjaCBAYyBOIGluIHRoZSByYW5nZSBAcCBbMCxfX2NvdW50KSwgb3IgQHAgX19sYXN0IGlmIG5vIHN1Y2gKKyAgICogIGl0ZXJhdG9yIGV4aXN0cy4KKyAgICoKKyAgICogIFNlYXJjaGVzIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIGZvciBAcCBjb3VudCBjb25zZWN1dGl2ZSBlbGVtZW50cworICAgKiAgZXF1YWwgdG8gQHAgX192YWwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHA+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIHNlYXJjaF9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCXR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwgX1RwPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19jb3VudCA8PSAwKQorCXJldHVybiBfX2ZpcnN0OworICAgICAgaWYgKF9fY291bnQgPT0gMSkKKwlyZXR1cm4gX0dMSUJDWFhfU1REX0E6OmZpbmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CisgICAgICByZXR1cm4gc3RkOjpfX3NlYXJjaF9uKF9fZmlyc3QsIF9fbGFzdCwgX19jb3VudCwgX192YWwsCisJCQkgICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCisKKyAgLyoqCisgICAqICBAYnJpZWYgU2VhcmNoIGEgc2VxdWVuY2UgZm9yIGEgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHZhbHVlcyB1c2luZyBhCisgICAqICAgICAgICAgcHJlZGljYXRlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgICAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fY291bnQgICAgICAgIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgdmFsdWVzLgorICAgKiAgQHBhcmFtICBfX3ZhbCAgICAgICAgICBUaGUgdmFsdWUgdG8gZmluZC4KKyAgICogIEBwYXJhbSAgX19iaW5hcnlfcHJlZCAgQSBiaW5hcnkgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UgQHAKKyAgICogIFtfX2ZpcnN0LF9fbGFzdC1fX2NvdW50KSBzdWNoIHRoYXQgQHAKKyAgICogIF9fYmluYXJ5X3ByZWQoKihpK04pLF9fdmFsKSBpcyB0cnVlIGZvciBlYWNoIEBjIE4gaW4gdGhlIHJhbmdlCisgICAqICBAcCBbMCxfX2NvdW50KSwgb3IgQHAgX19sYXN0IGlmIG5vIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAgKgorICAgKiAgU2VhcmNoZXMgdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgZm9yIEBwIF9fY291bnQKKyAgICogIGNvbnNlY3V0aXZlIGVsZW1lbnRzIGZvciB3aGljaCB0aGUgcHJlZGljYXRlIHJldHVybnMgdHJ1ZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgc2VhcmNoX24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIF9JbnRlZ2VyIF9fY291bnQsIGNvbnN0IF9UcCYgX192YWwsCisJICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQmluYXJ5UHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsIF9UcD4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fY291bnQgPD0gMCkKKwlyZXR1cm4gX19maXJzdDsKKyAgICAgIGlmIChfX2NvdW50ID09IDEpCisJeworCSAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICFib29sKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsIF9fdmFsKSkpCisJICAgICsrX19maXJzdDsKKwkgIHJldHVybiBfX2ZpcnN0OworCX0KKyAgICAgIHJldHVybiBzdGQ6Ol9fc2VhcmNoX24oX19maXJzdCwgX19sYXN0LCBfX2NvdW50LCBfX3ZhbCwgX19iaW5hcnlfcHJlZCwKKwkJCSAgICAgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKworICAvKioKKyAgICogIEBicmllZiBQZXJmb3JtIGFuIG9wZXJhdGlvbiBvbiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0ICAgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX191bmFyeV9vcCAgQSB1bmFyeSBvcGVyYXRvci4KKyAgICogIEByZXR1cm4gICBBbiBvdXRwdXQgaXRlcmF0b3IgZXF1YWwgdG8gQHAgX19yZXN1bHQrKF9fbGFzdC1fX2ZpcnN0KS4KKyAgICoKKyAgICogIEFwcGxpZXMgdGhlIG9wZXJhdG9yIHRvIGVhY2ggZWxlbWVudCBpbiB0aGUgaW5wdXQgcmFuZ2UgYW5kIGFzc2lnbnMKKyAgICogIHRoZSByZXN1bHRzIHRvIHN1Y2Nlc3NpdmUgZWxlbWVudHMgb2YgdGhlIG91dHB1dCBzZXF1ZW5jZS4KKyAgICogIEV2YWx1YXRlcyBAcCAqKF9fcmVzdWx0K04pPXVuYXJ5X29wKCooX19maXJzdCtOKSkgZm9yIGVhY2ggQGMgTiBpbiB0aGUKKyAgICogIHJhbmdlIEBwIFswLF9fbGFzdC1fX2ZpcnN0KS4KKyAgICoKKyAgICogIEBwIHVuYXJ5X29wIG11c3Qgbm90IGFsdGVyIGl0cyBhcmd1bWVudC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfVW5hcnlPcGVyYXRpb24+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgdHJhbnNmb3JtKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9VbmFyeU9wZXJhdGlvbiBfX3VuYXJ5X29wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgIC8vICJ0aGUgdHlwZSByZXR1cm5lZCBieSBhIF9VbmFyeU9wZXJhdGlvbiIKKyAgICAgICAgICAgIF9fdHlwZW9mX18oX191bmFyeV9vcCgqX19maXJzdCkpPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX3Jlc3VsdCkKKwkqX19yZXN1bHQgPSBfX3VuYXJ5X29wKCpfX2ZpcnN0KTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgUGVyZm9ybSBhbiBvcGVyYXRpb24gb24gY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiB0d28gc2VxdWVuY2VzLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCAgICAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2JpbmFyeV9vcCAgQSBiaW5hcnkgb3BlcmF0b3IuCisgICAqICBAcmV0dXJuICAgQW4gb3V0cHV0IGl0ZXJhdG9yIGVxdWFsIHRvIEBwIHJlc3VsdCsobGFzdC1maXJzdCkuCisgICAqCisgICAqICBBcHBsaWVzIHRoZSBvcGVyYXRvciB0byB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbiB0aGUgdHdvCisgICAqICBpbnB1dCByYW5nZXMgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdHMgdG8gc3VjY2Vzc2l2ZSBlbGVtZW50cyBvZiB0aGUKKyAgICogIG91dHB1dCBzZXF1ZW5jZS4KKyAgICogIEV2YWx1YXRlcyBAcAorICAgKiAgKihfX3Jlc3VsdCtOKT1fX2JpbmFyeV9vcCgqKF9fZmlyc3QxK04pLCooX19maXJzdDIrTikpIGZvciBlYWNoCisgICAqICBAYyBOIGluIHRoZSByYW5nZSBAcCBbMCxfX2xhc3QxLV9fZmlyc3QxKS4KKyAgICoKKyAgICogIEBwIGJpbmFyeV9vcCBtdXN0IG5vdCBhbHRlciBlaXRoZXIgb2YgaXRzIGFyZ3VtZW50cy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHRyYW5zZm9ybShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorCSAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgIC8vICJ0aGUgdHlwZSByZXR1cm5lZCBieSBhIF9CaW5hcnlPcGVyYXRpb24iCisgICAgICAgICAgICBfX3R5cGVvZl9fKF9fYmluYXJ5X29wKCpfX2ZpcnN0MSwqX19maXJzdDIpKT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworCisgICAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MiwgKytfX3Jlc3VsdCkKKwkqX19yZXN1bHQgPSBfX2JpbmFyeV9vcCgqX19maXJzdDEsICpfX2ZpcnN0Mik7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJlcGxhY2UgZWFjaCBvY2N1cnJlbmNlIG9mIG9uZSB2YWx1ZSBpbiBhIHNlcXVlbmNlIHdpdGggYW5vdGhlcgorICAgKiAgICAgICAgIHZhbHVlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX29sZF92YWx1ZSAgVGhlIHZhbHVlIHRvIGJlIHJlcGxhY2VkLgorICAgKiAgQHBhcmFtICBfX25ld192YWx1ZSAgVGhlIHJlcGxhY2VtZW50IHZhbHVlLgorICAgKiAgQHJldHVybiAgIHJlcGxhY2UoKSByZXR1cm5zIG5vIHZhbHVlLgorICAgKgorICAgKiAgRm9yIGVhY2ggaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBpZiBAYyAqaSA9PQorICAgKiAgQHAgX19vbGRfdmFsdWUgdGhlbiB0aGUgYXNzaWdubWVudCBAYyAqaSA9IEBwIF9fbmV3X3ZhbHVlIGlzIHBlcmZvcm1lZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICByZXBsYWNlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgIGNvbnN0IF9UcCYgX19vbGRfdmFsdWUsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsIF9UcD4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJaWYgKCpfX2ZpcnN0ID09IF9fb2xkX3ZhbHVlKQorCSAgKl9fZmlyc3QgPSBfX25ld192YWx1ZTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgUmVwbGFjZSBlYWNoIHZhbHVlIGluIGEgc2VxdWVuY2UgZm9yIHdoaWNoIGEgcHJlZGljYXRlIHJldHVybnMKKyAgICogICAgICAgICB0cnVlIHdpdGggYW5vdGhlciB2YWx1ZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19wcmVkICAgICAgIEEgcHJlZGljYXRlLgorICAgKiAgQHBhcmFtICBfX25ld192YWx1ZSAgVGhlIHJlcGxhY2VtZW50IHZhbHVlLgorICAgKiAgQHJldHVybiAgIHJlcGxhY2VfaWYoKSByZXR1cm5zIG5vIHZhbHVlLgorICAgKgorICAgKiAgRm9yIGVhY2ggaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBpZiBAcCBfX3ByZWQoKmkpCisgICAqICBpcyB0cnVlIHRoZW4gdGhlIGFzc2lnbm1lbnQgQGMgKmkgPSBAcCBfX25ld192YWx1ZSBpcyBwZXJmb3JtZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgcmVwbGFjZV9pZihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgY29uc3QgX1RwJiBfX25ld192YWx1ZSkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcCwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfVW5hcnlQcmVkaWNhdGVDb25jZXB0PF9QcmVkaWNhdGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICAqX19maXJzdCA9IF9fbmV3X3ZhbHVlOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBBc3NpZ24gdGhlIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIG9iamVjdCB0byBlYWNoIHZhbHVlIGluIGEKKyAgICogICAgICAgICBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fZ2VuICAgIEEgZnVuY3Rpb24gb2JqZWN0IHRha2luZyBubyBhcmd1bWVudHMgYW5kIHJldHVybmluZworICAgKiAgICAgICAgICAgICAgICAgc3RkOjppdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKyAgICogIEByZXR1cm4gICBnZW5lcmF0ZSgpIHJldHVybnMgbm8gdmFsdWUuCisgICAqCisgICAqICBQZXJmb3JtcyB0aGUgYXNzaWdubWVudCBAYyAqaSA9IEBwIF9fZ2VuKCkgZm9yIGVhY2ggQGMgaSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0LF9fbGFzdCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgdm9pZAorICAgIGdlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICBfR2VuZXJhdG9yIF9fZ2VuKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0dlbmVyYXRvckNvbmNlcHQ8X0dlbmVyYXRvciwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwkqX19maXJzdCA9IF9fZ2VuKCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEFzc2lnbiB0aGUgcmVzdWx0IG9mIGEgZnVuY3Rpb24gb2JqZWN0IHRvIGVhY2ggdmFsdWUgaW4gYQorICAgKiAgICAgICAgIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbiAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLgorICAgKiAgQHBhcmFtICBfX2dlbiAgICBBIGZ1bmN0aW9uIG9iamVjdCB0YWtpbmcgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5pbmcKKyAgICogICAgICAgICAgICAgICAgIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisgICAqICBAcmV0dXJuICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsIEBwIF9fZmlyc3QrX19uCisgICAqCisgICAqICBQZXJmb3JtcyB0aGUgYXNzaWdubWVudCBAYyAqaSA9IEBwIF9fZ2VuKCkgZm9yIGVhY2ggQGMgaSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0LF9fZmlyc3QrX19uKS4KKyAgICoKKyAgICogIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICogIERSIDg2NS4gTW9yZSBhbGdvcml0aG1zIHRoYXQgdGhyb3cgYXdheSBpbmZvcm1hdGlvbgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIGdlbmVyYXRlX24oX091dHB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwgX0dlbmVyYXRvciBfX2dlbikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICAgLy8gInRoZSB0eXBlIHJldHVybmVkIGJ5IGEgX0dlbmVyYXRvciIKKyAgICAgICAgICAgIF9fdHlwZW9mX18oX19nZW4oKSk+KQorCisgICAgICBmb3IgKF9fZGVjbHR5cGUoX19uICsgMCkgX19uaXRlciA9IF9fbjsKKwkgICBfX25pdGVyID4gMDsgLS1fX25pdGVyLCArK19fZmlyc3QpCisJKl9fZmlyc3QgPSBfX2dlbigpOworICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29weSBhIHNlcXVlbmNlLCByZW1vdmluZyBjb25zZWN1dGl2ZSBkdXBsaWNhdGUgdmFsdWVzLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBkZXNpZ25hdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBDb3BpZXMgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIHRvIHRoZSByYW5nZQorICAgKiAgYmVnaW5uaW5nIGF0IEBwIF9fcmVzdWx0LCBleGNlcHQgdGhhdCBvbmx5IHRoZSBmaXJzdCBlbGVtZW50IGlzIGNvcGllZAorICAgKiAgZnJvbSBncm91cHMgb2YgY29uc2VjdXRpdmUgZWxlbWVudHMgdGhhdCBjb21wYXJlIGVxdWFsLgorICAgKiAgdW5pcXVlX2NvcHkoKSBpcyBzdGFibGUsIHNvIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGFyZQorICAgKiAgY29waWVkIGlzIHVuY2hhbmdlZC4KKyAgICoKKyAgICogIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICogIERSIDI0MS4gRG9lcyB1bmlxdWVfY29weSgpIHJlcXVpcmUgQ29weUNvbnN0cnVjdGlibGUgYW5kIEFzc2lnbmFibGU/CisgICAqICAKKyAgICogIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICogIERSIDUzOC4gMjQxIGFnYWluOiBEb2VzIHVuaXF1ZV9jb3B5KCkgcmVxdWlyZSBDb3B5Q29uc3RydWN0aWJsZSBhbmQgCisgICAqICBBc3NpZ25hYmxlPworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICB1bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCV9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbGl0eUNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgcmV0dXJuIHN0ZDo6X191bmlxdWVfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAorCQkJCXN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSwKKwkJCQlzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19yZXN1bHQpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29weSBhIHNlcXVlbmNlLCByZW1vdmluZyBjb25zZWN1dGl2ZSB2YWx1ZXMgdXNpbmcgYSBwcmVkaWNhdGUuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICAgICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgICAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgICAgICAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2JpbmFyeV9wcmVkICBBIGJpbmFyeSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuICAgQW4gaXRlcmF0b3IgZGVzaWduYXRpbmcgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLgorICAgKgorICAgKiAgQ29waWVzIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSB0byB0aGUgcmFuZ2UKKyAgICogIGJlZ2lubmluZyBhdCBAcCBfX3Jlc3VsdCwgZXhjZXB0IHRoYXQgb25seSB0aGUgZmlyc3QgZWxlbWVudCBpcyBjb3BpZWQKKyAgICogIGZyb20gZ3JvdXBzIG9mIGNvbnNlY3V0aXZlIGVsZW1lbnRzIGZvciB3aGljaCBAcCBfX2JpbmFyeV9wcmVkIHJldHVybnMKKyAgICogIHRydWUuCisgICAqICB1bmlxdWVfY29weSgpIGlzIHN0YWJsZSwgc28gdGhlIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgYXJlCisgICAqICBjb3BpZWQgaXMgdW5jaGFuZ2VkLgorICAgKgorICAgKiAgX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgKiAgRFIgMjQxLiBEb2VzIHVuaXF1ZV9jb3B5KCkgcmVxdWlyZSBDb3B5Q29uc3RydWN0aWJsZSBhbmQgQXNzaWduYWJsZT8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICB1bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCV9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzIC0tIHByZWRpY2F0ZXMgY2hlY2tlZCBsYXRlcgorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICByZXR1cm4gc3RkOjpfX3VuaXF1ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9fYmluYXJ5X3ByZWQsCisJCQkJc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpLAorCQkJCXN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX3Jlc3VsdCkpOworICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIFJhbmRvbWx5IHNodWZmbGUgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICBOb3RoaW5nLgorICAgKgorICAgKiAgUmVvcmRlciB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgdXNpbmcgYSByYW5kb20KKyAgICogIGRpc3RyaWJ1dGlvbiwgc28gdGhhdCBldmVyeSBwb3NzaWJsZSBvcmRlcmluZyBvZiB0aGUgc2VxdWVuY2UgaXMKKyAgICogIGVxdWFsbHkgbGlrZWx5LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICByYW5kb21fc2h1ZmZsZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisJZm9yIChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19pID0gX19maXJzdCArIDE7IF9faSAhPSBfX2xhc3Q7ICsrX19pKQorCSAgc3RkOjppdGVyX3N3YXAoX19pLCBfX2ZpcnN0ICsgKHN0ZDo6cmFuZCgpICUgKChfX2kgLSBfX2ZpcnN0KSArIDEpKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFNodWZmbGUgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgdXNpbmcgYSByYW5kb20gbnVtYmVyCisgICAqICAgICAgICAgZ2VuZXJhdG9yLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3JhbmQgICAgVGhlIFJORyBmdW5jdG9yIG9yIGZ1bmN0aW9uLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFJlb3JkZXJzIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSB1c2luZyBAcCBfX3JhbmQgdG8KKyAgICogIHByb3ZpZGUgYSByYW5kb20gZGlzdHJpYnV0aW9uLiBDYWxsaW5nIEBwIF9fcmFuZChOKSBmb3IgYSBwb3NpdGl2ZQorICAgKiAgaW50ZWdlciBAcCBOIHNob3VsZCByZXR1cm4gYSByYW5kb21seSBjaG9zZW4gaW50ZWdlciBmcm9tIHRoZQorICAgKiAgcmFuZ2UgWzAsTikuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICB2b2lkCisgICAgcmFuZG9tX3NodWZmbGUoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCQkgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiYgX19yYW5kKQorI2Vsc2UKKwkJICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kKQorI2VuZGlmCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybjsKKyAgICAgIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKKwlzdGQ6Oml0ZXJfc3dhcChfX2ksIF9fZmlyc3QgKyBfX3JhbmQoKF9faSAtIF9fZmlyc3QpICsgMSkpOworICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIE1vdmUgZWxlbWVudHMgZm9yIHdoaWNoIGEgcHJlZGljYXRlIGlzIHRydWUgdG8gdGhlIGJlZ2lubmluZworICAgKiAgICAgICAgIG9mIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcHJlZCAgICBBIHByZWRpY2F0ZSBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgQHAgbWlkZGxlIHN1Y2ggdGhhdCBAcCBfX3ByZWQoaSkgaXMgdHJ1ZSBmb3IgZWFjaAorICAgKiAgaXRlcmF0b3IgQHAgaSBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsbWlkZGxlKSBhbmQgZmFsc2UgZm9yIGVhY2ggQHAgaQorICAgKiAgaW4gdGhlIHJhbmdlIEBwIFttaWRkbGUsX19sYXN0KS4KKyAgICoKKyAgICogIEBwIF9fcHJlZCBtdXN0IG5vdCBtb2RpZnkgaXRzIG9wZXJhbmQuIEBwIHBhcnRpdGlvbigpIGRvZXMgbm90IHByZXNlcnZlCisgICAqICB0aGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgZWxlbWVudHMgaW4gZWFjaCBncm91cCwgdXNlCisgICAqICBAcCBzdGFibGVfcGFydGl0aW9uKCkgaWYgdGhpcyBpcyBuZWVkZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBwYXJ0aXRpb24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBfUHJlZGljYXRlICAgX19wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICByZXR1cm4gc3RkOjpfX3BhcnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwKKwkJCSAgICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCisKKworICAvKioKKyAgICogIEBicmllZiBTb3J0IHRoZSBzbWFsbGVzdCBlbGVtZW50cyBvZiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19taWRkbGUgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFNvcnRzIHRoZSBzbWFsbGVzdCBAcCAoX19taWRkbGUtX19maXJzdCkgZWxlbWVudHMgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbZmlyc3QsbGFzdCkgYW5kIG1vdmVzIHRoZW0gdG8gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbWlkZGxlKS4gVGhlCisgICAqICBvcmRlciBvZiB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGluIHRoZSByYW5nZSBAcCBbX19taWRkbGUsX19sYXN0KSBpcworICAgKiAgdW5kZWZpbmVkLgorICAgKiAgQWZ0ZXIgdGhlIHNvcnQgaWYgQGUgaSBhbmQgQGUgaiBhcmUgaXRlcmF0b3JzIGluIHRoZSByYW5nZQorICAgKiAgQHAgW19fZmlyc3QsX19taWRkbGUpIHN1Y2ggdGhhdCBpIHByZWNlZGVzIGogYW5kIEBlIGsgaXMgYW4gaXRlcmF0b3IgaW4KKyAgICogIHRoZSByYW5nZSBAcCBbX19taWRkbGUsX19sYXN0KSB0aGVuICpqPCppIGFuZCAqazwqaSBhcmUgYm90aCBmYWxzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgcGFydGlhbF9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbWlkZGxlLAorCQkgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8X1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19taWRkbGUpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fbWlkZGxlLCBfX2xhc3QpOworCisgICAgICBzdGQ6Ol9faGVhcF9zZWxlY3QoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCk7CisgICAgICBzdGQ6OnNvcnRfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFNvcnQgdGhlIHNtYWxsZXN0IGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgdXNpbmcgYSBwcmVkaWNhdGUKKyAgICogICAgICAgICBmb3IgY29tcGFyaXNvbi4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbWlkZGxlICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFNvcnRzIHRoZSBzbWFsbGVzdCBAcCAoX19taWRkbGUtX19maXJzdCkgZWxlbWVudHMgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbX19maXJzdCxfX2xhc3QpIGFuZCBtb3ZlcyB0aGVtIHRvIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX21pZGRsZSkuIFRoZQorICAgKiAgb3JkZXIgb2YgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW19fbWlkZGxlLF9fbGFzdCkgaXMKKyAgICogIHVuZGVmaW5lZC4KKyAgICogIEFmdGVyIHRoZSBzb3J0IGlmIEBlIGkgYW5kIEBlIGogYXJlIGl0ZXJhdG9ycyBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0LF9fbWlkZGxlKSBzdWNoIHRoYXQgaSBwcmVjZWRlcyBqIGFuZCBAZSBrIGlzIGFuIGl0ZXJhdG9yIGluCisgICAqICB0aGUgcmFuZ2UgQHAgW19fbWlkZGxlLF9fbGFzdCkgdGhlbiBAcCAqX19jb21wKGosKmkpIGFuZCBAcCBfX2NvbXAoKmssKmkpCisgICAqICBhcmUgYm90aCBmYWxzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHBhcnRpYWxfc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZGRsZSwKKwkJIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJCSBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1ZhbHVlVHlwZSwgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19taWRkbGUpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fbWlkZGxlLCBfX2xhc3QpOworCisgICAgICBzdGQ6Ol9faGVhcF9zZWxlY3QoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX19jb21wKTsKKyAgICAgIHN0ZDo6c29ydF9oZWFwKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2NvbXApOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBTb3J0IGEgc2VxdWVuY2UganVzdCBlbm91Z2ggdG8gZmluZCBhIHBhcnRpY3VsYXIgcG9zaXRpb24uCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX250aCAgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICBOb3RoaW5nLgorICAgKgorICAgKiAgUmVhcnJhbmdlcyB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgc28gdGhhdCBAcCAqX19udGgKKyAgICogIGlzIHRoZSBzYW1lIGVsZW1lbnQgdGhhdCB3b3VsZCBoYXZlIGJlZW4gaW4gdGhhdCBwb3NpdGlvbiBoYWQgdGhlCisgICAqICB3aG9sZSBzZXF1ZW5jZSBiZWVuIHNvcnRlZC4gVGhlIGVsZW1lbnRzIGVpdGhlciBzaWRlIG9mIEBwICpfX250aCBhcmUKKyAgICogIG5vdCBjb21wbGV0ZWx5IHNvcnRlZCwgYnV0IGZvciBhbnkgaXRlcmF0b3IgQGUgaSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0LF9fbnRoKSBhbmQgYW55IGl0ZXJhdG9yIEBlIGogaW4gdGhlIHJhbmdlIEBwIFtfX250aCxfX2xhc3QpIGl0CisgICAqICBob2xkcyB0aGF0ICpqIDwgKmkgaXMgZmFsc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIG50aF9lbGVtZW50KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19udGgsCisJCV9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDxfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX250aCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19udGgsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCB8fCBfX250aCA9PSBfX2xhc3QpCisJcmV0dXJuOworCisgICAgICBzdGQ6Ol9faW50cm9zZWxlY3QoX19maXJzdCwgX19udGgsIF9fbGFzdCwKKwkJCSBzdGQ6Ol9fbGcoX19sYXN0IC0gX19maXJzdCkgKiAyKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgU29ydCBhIHNlcXVlbmNlIGp1c3QgZW5vdWdoIHRvIGZpbmQgYSBwYXJ0aWN1bGFyIHBvc2l0aW9uCisgICAqICAgICAgICAgdXNpbmcgYSBwcmVkaWNhdGUgZm9yIGNvbXBhcmlzb24uCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX250aCAgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fY29tcCAgICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBSZWFycmFuZ2VzIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBzbyB0aGF0IEBwICpfX250aAorICAgKiAgaXMgdGhlIHNhbWUgZWxlbWVudCB0aGF0IHdvdWxkIGhhdmUgYmVlbiBpbiB0aGF0IHBvc2l0aW9uIGhhZCB0aGUKKyAgICogIHdob2xlIHNlcXVlbmNlIGJlZW4gc29ydGVkLiBUaGUgZWxlbWVudHMgZWl0aGVyIHNpZGUgb2YgQHAgKl9fbnRoIGFyZQorICAgKiAgbm90IGNvbXBsZXRlbHkgc29ydGVkLCBidXQgZm9yIGFueSBpdGVyYXRvciBAZSBpIGluIHRoZSByYW5nZQorICAgKiAgQHAgW19fZmlyc3QsX19udGgpIGFuZCBhbnkgaXRlcmF0b3IgQGUgaiBpbiB0aGUgcmFuZ2UgQHAgW19fbnRoLF9fbGFzdCkgaXQKKyAgICogIGhvbGRzIHRoYXQgQHAgX19jb21wKCpqLCppKSBpcyBmYWxzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIG50aF9lbGVtZW50KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19udGgsCisJCV9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1ZhbHVlVHlwZSwgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19udGgpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fbnRoLCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QgfHwgX19udGggPT0gX19sYXN0KQorCXJldHVybjsKKworICAgICAgc3RkOjpfX2ludHJvc2VsZWN0KF9fZmlyc3QsIF9fbnRoLCBfX2xhc3QsCisJCQkgc3RkOjpfX2xnKF9fbGFzdCAtIF9fZmlyc3QpICogMiwgX19jb21wKTsKKyAgICB9CisKKworICAvKioKKyAgICogIEBicmllZiBTb3J0IHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICBOb3RoaW5nLgorICAgKgorICAgKiAgU29ydHMgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIGluIGFzY2VuZGluZyBvcmRlciwKKyAgICogIHN1Y2ggdGhhdCBmb3IgZWFjaCBpdGVyYXRvciBAZSBpIGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QtMSksICAKKyAgICogICooaSsxKTwqaSBpcyBmYWxzZS4KKyAgICoKKyAgICogIFRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiBlcXVpdmFsZW50IGVsZW1lbnRzIGlzIG5vdCBwcmVzZXJ2ZWQsIHVzZQorICAgKiAgQHAgc3RhYmxlX3NvcnQoKSBpZiB0aGlzIGlzIG5lZWRlZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8X1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIHN0ZDo6X19pbnRyb3NvcnRfbG9vcChfX2ZpcnN0LCBfX2xhc3QsCisJCQkJc3RkOjpfX2xnKF9fbGFzdCAtIF9fZmlyc3QpICogMik7CisJICBzdGQ6Ol9fZmluYWxfaW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0KTsKKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFNvcnQgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgdXNpbmcgYSBwcmVkaWNhdGUgZm9yIGNvbXBhcmlzb24uCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFNvcnRzIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBpbiBhc2NlbmRpbmcgb3JkZXIsCisgICAqICBzdWNoIHRoYXQgQHAgX19jb21wKCooaSsxKSwqaSkgaXMgZmFsc2UgZm9yIGV2ZXJ5IGl0ZXJhdG9yIEBlIGkgaW4gdGhlCisgICAqICByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QtMSkuCisgICAqCisgICAqICBUaGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgZXF1aXZhbGVudCBlbGVtZW50cyBpcyBub3QgcHJlc2VydmVkLCB1c2UKKyAgICogIEBwIHN0YWJsZV9zb3J0KCkgaWYgdGhpcyBpcyBuZWVkZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBzb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCSBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLCBfVmFsdWVUeXBlLAorCQkJCSAgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIHN0ZDo6X19pbnRyb3NvcnRfbG9vcChfX2ZpcnN0LCBfX2xhc3QsCisJCQkJc3RkOjpfX2xnKF9fbGFzdCAtIF9fZmlyc3QpICogMiwgX19jb21wKTsKKwkgIHN0ZDo6X19maW5hbF9pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBNZXJnZXMgdHdvIHNvcnRlZCByYW5nZXMuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdDIgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgbWVyZ2VkIHJhbmdlLgorICAgKiAgQHJldHVybiAgICAgICAgIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IDxlbT5ub3QgbGVzcworICAgKiAgICAgICAgICAgICAgICAgIHRoYW48L2VtPiBAZSB2YWwuCisgICAqCisgICAqICBNZXJnZXMgdGhlIHJhbmdlcyBAcCBbX19maXJzdDEsX19sYXN0MSkgYW5kIEBwIFtfX2ZpcnN0MixfX2xhc3QyKSBpbnRvCisgICAqICB0aGUgc29ydGVkIHJhbmdlIEBwIFtfX3Jlc3VsdCwgX19yZXN1bHQgKyAoX19sYXN0MS1fX2ZpcnN0MSkgKworICAgKiAgKF9fbGFzdDItX19maXJzdDIpKS4gIEJvdGggaW5wdXQgcmFuZ2VzIG11c3QgYmUgc29ydGVkLCBhbmQgdGhlCisgICAqICBvdXRwdXQgcmFuZ2UgbXVzdCBub3Qgb3ZlcmxhcCB3aXRoIGVpdGhlciBvZiB0aGUgaW5wdXQgcmFuZ2VzLgorICAgKiAgVGhlIHNvcnQgaXMgQGUgc3RhYmxlLCB0aGF0IGlzLCBmb3IgZXF1aXZhbGVudCBlbGVtZW50cyBpbiB0aGUKKyAgICogIHR3byByYW5nZXMsIGVsZW1lbnRzIGZyb20gdGhlIGZpcnN0IHJhbmdlIHdpbGwgYWx3YXlzIGNvbWUKKyAgICogIGJlZm9yZSBlbGVtZW50cyBmcm9tIHRoZSBzZWNvbmQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBtZXJnZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJeworCSAgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MjsKKwkgICAgICArK19fZmlyc3QyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisJICAgICAgKytfX2ZpcnN0MTsKKwkgICAgfQorCSAgKytfX3Jlc3VsdDsKKwl9CisgICAgICByZXR1cm4gc3RkOjpjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBzdGQ6OmNvcHkoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCQkgICAgX19yZXN1bHQpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgTWVyZ2VzIHR3byBzb3J0ZWQgcmFuZ2VzLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIG1lcmdlZCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIEEgZnVuY3RvciB0byB1c2UgZm9yIGNvbXBhcmlzb25zLgorICAgKiAgQHJldHVybiAgICAgICAgIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50ICJub3QgbGVzcworICAgKiAgICAgICAgICAgICAgICAgIHRoYW4iIEBlIHZhbC4KKyAgICoKKyAgICogIE1lcmdlcyB0aGUgcmFuZ2VzIEBwIFtfX2ZpcnN0MSxfX2xhc3QxKSBhbmQgQHAgW19fZmlyc3QyLF9fbGFzdDIpIGludG8KKyAgICogIHRoZSBzb3J0ZWQgcmFuZ2UgQHAgW19fcmVzdWx0LCBfX3Jlc3VsdCArIChfX2xhc3QxLV9fZmlyc3QxKSArCisgICAqICAoX19sYXN0Mi1fX2ZpcnN0MikpLiAgQm90aCBpbnB1dCByYW5nZXMgbXVzdCBiZSBzb3J0ZWQsIGFuZCB0aGUKKyAgICogIG91dHB1dCByYW5nZSBtdXN0IG5vdCBvdmVybGFwIHdpdGggZWl0aGVyIG9mIHRoZSBpbnB1dCByYW5nZXMuCisgICAqICBUaGUgc29ydCBpcyBAZSBzdGFibGUsIHRoYXQgaXMsIGZvciBlcXVpdmFsZW50IGVsZW1lbnRzIGluIHRoZQorICAgKiAgdHdvIHJhbmdlcywgZWxlbWVudHMgZnJvbSB0aGUgZmlyc3QgcmFuZ2Ugd2lsbCBhbHdheXMgY29tZQorICAgKiAgYmVmb3JlIGVsZW1lbnRzIGZyb20gdGhlIHNlY29uZC4KKyAgICoKKyAgICogIFRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIHNob3VsZCBoYXZlIHRoZSBzYW1lIGVmZmVjdHMgb24gb3JkZXJpbmcgYXMKKyAgICogIHRoZSBmdW5jdGlvbiB1c2VkIGZvciB0aGUgaW5pdGlhbCBzb3J0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIG1lcmdlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCSAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQkJCSAgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQkJCSAgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1ZhbHVlVHlwZTIsIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0X3ByZWQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2NvbXApOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfX2ZpcnN0MiwgX19sYXN0MiwgX19maXJzdDEsIF9fY29tcCk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJeworCSAgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7CisJICAgICAgKytfX2ZpcnN0MjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICAgICsrX19maXJzdDE7CisJICAgIH0KKwkgICsrX19yZXN1bHQ7CisJfQorICAgICAgcmV0dXJuIHN0ZDo6Y29weShfX2ZpcnN0MiwgX19sYXN0Miwgc3RkOjpjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLAorCQkJCQkJICAgIF9fcmVzdWx0KSk7CisgICAgfQorCisKKyAgLyoqCisgICAqICBAYnJpZWYgU29ydCB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSwgcHJlc2VydmluZyB0aGUgcmVsYXRpdmUgb3JkZXIKKyAgICogICAgICAgICBvZiBlcXVpdmFsZW50IGVsZW1lbnRzLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICBOb3RoaW5nLgorICAgKgorICAgKiAgU29ydHMgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIGluIGFzY2VuZGluZyBvcmRlciwKKyAgICogIHN1Y2ggdGhhdCBmb3IgZWFjaCBpdGVyYXRvciBAcCBpIGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QtMSksCisgICAqICBAcCAqKGkrMSk8KmkgaXMgZmFsc2UuCisgICAqCisgICAqICBUaGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgZXF1aXZhbGVudCBlbGVtZW50cyBpcyBwcmVzZXJ2ZWQsIHNvIGFueSB0d28KKyAgICogIGVsZW1lbnRzIEBwIHggYW5kIEBwIHkgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgc3VjaCB0aGF0CisgICAqICBAcCB4PHkgaXMgZmFsc2UgYW5kIEBwIHk8eCBpcyBmYWxzZSB3aWxsIGhhdmUgdGhlIHNhbWUgcmVsYXRpdmUKKyAgICogIG9yZGVyaW5nIGFmdGVyIGNhbGxpbmcgQHAgc3RhYmxlX3NvcnQoKS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDxfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBfVGVtcG9yYXJ5X2J1ZmZlcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9WYWx1ZVR5cGU+IF9fYnVmKF9fZmlyc3QsCisJCQkJCQkJCSBfX2xhc3QpOworICAgICAgaWYgKF9fYnVmLmJlZ2luKCkgPT0gMCkKKwlzdGQ6Ol9faW5wbGFjZV9zdGFibGVfc29ydChfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgZWxzZQorCXN0ZDo6X19zdGFibGVfc29ydF9hZGFwdGl2ZShfX2ZpcnN0LCBfX2xhc3QsIF9fYnVmLmJlZ2luKCksCisJCQkJICAgIF9EaXN0YW5jZVR5cGUoX19idWYuc2l6ZSgpKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFNvcnQgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgdXNpbmcgYSBwcmVkaWNhdGUgZm9yIGNvbXBhcmlzb24sCisgICAqICAgICAgICAgcHJlc2VydmluZyB0aGUgcmVsYXRpdmUgb3JkZXIgb2YgZXF1aXZhbGVudCBlbGVtZW50cy4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICAgQSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcmV0dXJuICBOb3RoaW5nLgorICAgKgorICAgKiAgU29ydHMgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIGluIGFzY2VuZGluZyBvcmRlciwKKyAgICogIHN1Y2ggdGhhdCBmb3IgZWFjaCBpdGVyYXRvciBAcCBpIGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QtMSksCisgICAqICBAcCBfX2NvbXAoKihpKzEpLCppKSBpcyBmYWxzZS4KKyAgICoKKyAgICogIFRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiBlcXVpdmFsZW50IGVsZW1lbnRzIGlzIHByZXNlcnZlZCwgc28gYW55IHR3bworICAgKiAgZWxlbWVudHMgQHAgeCBhbmQgQHAgeSBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBzdWNoIHRoYXQKKyAgICogIEBwIF9fY29tcCh4LHkpIGlzIGZhbHNlIGFuZCBAcCBfX2NvbXAoeSx4KSBpcyBmYWxzZSB3aWxsIGhhdmUgdGhlIHNhbWUKKyAgICogIHJlbGF0aXZlIG9yZGVyaW5nIGFmdGVyIGNhbGxpbmcgQHAgc3RhYmxlX3NvcnQoKS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN0YWJsZV9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCQlfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUsCisJCQkJICBfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBfVGVtcG9yYXJ5X2J1ZmZlcjxfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIF9WYWx1ZVR5cGU+IF9fYnVmKF9fZmlyc3QsCisJCQkJCQkJCSBfX2xhc3QpOworICAgICAgaWYgKF9fYnVmLmJlZ2luKCkgPT0gMCkKKwlzdGQ6Ol9faW5wbGFjZV9zdGFibGVfc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7CisgICAgICBlbHNlCisJc3RkOjpfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9fZmlyc3QsIF9fbGFzdCwgX19idWYuYmVnaW4oKSwKKwkJCQkgICAgX0Rpc3RhbmNlVHlwZShfX2J1Zi5zaXplKCkpLCBfX2NvbXApOworICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIFJldHVybiB0aGUgdW5pb24gb2YgdHdvIHNvcnRlZCByYW5nZXMuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgU3RhcnQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBFbmQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBTdGFydCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDIgICBFbmQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHJldHVybiAgRW5kIG9mIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gaXRlcmF0ZXMgb3ZlciBib3RoIHJhbmdlcywgY29weWluZyBlbGVtZW50cyBwcmVzZW50IGluCisgICAqICBlYWNoIHJhbmdlIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQgcmFuZ2UuICBJdGVyYXRvcnMgaW5jcmVtZW50IGZvciBlYWNoCisgICAqICByYW5nZS4gIFdoZW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiBvbmUgcmFuZ2UgaXMgbGVzcyB0aGFuIHRoZSBvdGhlciwKKyAgICogIHRoYXQgZWxlbWVudCBpcyBjb3BpZWQgYW5kIHRoZSBpdGVyYXRvciBhZHZhbmNlZC4gIElmIGFuIGVsZW1lbnQgaXMKKyAgICogIGNvbnRhaW5lZCBpbiBib3RoIHJhbmdlcywgdGhlIGVsZW1lbnQgZnJvbSB0aGUgZmlyc3QgcmFuZ2UgaXMgY29waWVkIGFuZAorICAgKiAgYm90aCByYW5nZXMgYWR2YW5jZS4gIFRoZSBvdXRwdXQgcmFuZ2UgbWF5IG5vdCBvdmVybGFwIGVpdGhlciBpbnB1dAorICAgKiAgcmFuZ2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfdW5pb24oX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCSAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDIsIF9fbGFzdDIsIF9fZmlyc3QxKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwl7CisJICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICAgICsrX19maXJzdDE7CisJICAgIH0KKwkgIGVsc2UgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MjsKKwkgICAgICArK19fZmlyc3QyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisJICAgICAgKytfX2ZpcnN0MTsKKwkgICAgICArK19fZmlyc3QyOworCSAgICB9CisJICArK19fcmVzdWx0OworCX0KKyAgICAgIHJldHVybiBzdGQ6OmNvcHkoX19maXJzdDIsIF9fbGFzdDIsIHN0ZDo6Y29weShfX2ZpcnN0MSwgX19sYXN0MSwKKwkJCQkJCSAgICBfX3Jlc3VsdCkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBSZXR1cm4gdGhlIHVuaW9uIG9mIHR3byBzb3J0ZWQgcmFuZ2VzIHVzaW5nIGEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIFN0YXJ0IG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgRW5kIG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgU3RhcnQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgRW5kIG9mIHNlY29uZCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIFRoZSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcmV0dXJuICBFbmQgb2YgdGhlIG91dHB1dCByYW5nZS4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBpdGVyYXRlcyBvdmVyIGJvdGggcmFuZ2VzLCBjb3B5aW5nIGVsZW1lbnRzIHByZXNlbnQgaW4KKyAgICogIGVhY2ggcmFuZ2UgaW4gb3JkZXIgdG8gdGhlIG91dHB1dCByYW5nZS4gIEl0ZXJhdG9ycyBpbmNyZW1lbnQgZm9yIGVhY2gKKyAgICogIHJhbmdlLiAgV2hlbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIG9uZSByYW5nZSBpcyBsZXNzIHRoYW4gdGhlIG90aGVyCisgICAqICBhY2NvcmRpbmcgdG8gQHAgX19jb21wLCB0aGF0IGVsZW1lbnQgaXMgY29waWVkIGFuZCB0aGUgaXRlcmF0b3IgYWR2YW5jZWQuCisgICAqICBJZiBhbiBlcXVpdmFsZW50IGVsZW1lbnQgYWNjb3JkaW5nIHRvIEBwIF9fY29tcCBpcyBjb250YWluZWQgaW4gYm90aAorICAgKiAgcmFuZ2VzLCB0aGUgZWxlbWVudCBmcm9tIHRoZSBmaXJzdCByYW5nZSBpcyBjb3BpZWQgYW5kIGJvdGggcmFuZ2VzCisgICAqICBhZHZhbmNlLiAgVGhlIG91dHB1dCByYW5nZSBtYXkgbm90IG92ZXJsYXAgZWl0aGVyIGlucHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF91bmlvbihfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQkJCSAgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQkJCSAgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19jb21wKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0X3ByZWQoX19maXJzdDIsIF9fbGFzdDIsIF9fZmlyc3QxLCBfX2NvbXApOworCisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCXsKKwkgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICAgICsrX19maXJzdDE7CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7CisJICAgICAgKytfX2ZpcnN0MjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICAgICsrX19maXJzdDE7CisJICAgICAgKytfX2ZpcnN0MjsKKwkgICAgfQorCSAgKytfX3Jlc3VsdDsKKwl9CisgICAgICByZXR1cm4gc3RkOjpjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBzdGQ6OmNvcHkoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCQkgICAgX19yZXN1bHQpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIHNvcnRlZCByYW5nZXMuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgU3RhcnQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBFbmQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBTdGFydCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDIgICBFbmQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHJldHVybiAgRW5kIG9mIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gaXRlcmF0ZXMgb3ZlciBib3RoIHJhbmdlcywgY29weWluZyBlbGVtZW50cyBwcmVzZW50IGluCisgICAqICBib3RoIHJhbmdlcyBpbiBvcmRlciB0byB0aGUgb3V0cHV0IHJhbmdlLiAgSXRlcmF0b3JzIGluY3JlbWVudCBmb3IgZWFjaAorICAgKiAgcmFuZ2UuICBXaGVuIHRoZSBjdXJyZW50IGVsZW1lbnQgb2Ygb25lIHJhbmdlIGlzIGxlc3MgdGhhbiB0aGUgb3RoZXIsCisgICAqICB0aGF0IGl0ZXJhdG9yIGFkdmFuY2VzLiAgSWYgYW4gZWxlbWVudCBpcyBjb250YWluZWQgaW4gYm90aCByYW5nZXMsIHRoZQorICAgKiAgZWxlbWVudCBmcm9tIHRoZSBmaXJzdCByYW5nZSBpcyBjb3BpZWQgYW5kIGJvdGggcmFuZ2VzIGFkdmFuY2UuICBUaGUKKyAgICogIG91dHB1dCByYW5nZSBtYXkgbm90IG92ZXJsYXAgZWl0aGVyIGlucHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X2ludGVyc2VjdGlvbihfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJCSAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZTIsIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0Mik7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldChfX2ZpcnN0MiwgX19sYXN0MiwgX19maXJzdDEpOworCisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCWlmICgqX19maXJzdDEgPCAqX19maXJzdDIpCisJICArK19fZmlyc3QxOworCWVsc2UgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgICsrX19maXJzdDI7CisJZWxzZQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisJICAgICsrX19maXJzdDE7CisJICAgICsrX19maXJzdDI7CisJICAgICsrX19yZXN1bHQ7CisJICB9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJldHVybiB0aGUgaW50ZXJzZWN0aW9uIG9mIHR3byBzb3J0ZWQgcmFuZ2VzIHVzaW5nIGNvbXBhcmlzb24KKyAgICogIGZ1bmN0b3IuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgU3RhcnQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBFbmQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBTdGFydCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDIgICBFbmQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICAgVGhlIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIEVuZCBvZiB0aGUgb3V0cHV0IHJhbmdlLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIGl0ZXJhdGVzIG92ZXIgYm90aCByYW5nZXMsIGNvcHlpbmcgZWxlbWVudHMgcHJlc2VudCBpbgorICAgKiAgYm90aCByYW5nZXMgaW4gb3JkZXIgdG8gdGhlIG91dHB1dCByYW5nZS4gIEl0ZXJhdG9ycyBpbmNyZW1lbnQgZm9yIGVhY2gKKyAgICogIHJhbmdlLiAgV2hlbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIG9uZSByYW5nZSBpcyBsZXNzIHRoYW4gdGhlIG90aGVyCisgICAqICBhY2NvcmRpbmcgdG8gQHAgX19jb21wLCB0aGF0IGl0ZXJhdG9yIGFkdmFuY2VzLiAgSWYgYW4gZWxlbWVudCBpcworICAgKiAgY29udGFpbmVkIGluIGJvdGggcmFuZ2VzIGFjY29yZGluZyB0byBAcCBfX2NvbXAsIHRoZSBlbGVtZW50IGZyb20gdGhlCisgICAqICBmaXJzdCByYW5nZSBpcyBjb3BpZWQgYW5kIGJvdGggcmFuZ2VzIGFkdmFuY2UuICBUaGUgb3V0cHV0IHJhbmdlIG1heSBub3QKKyAgICogIG92ZXJsYXAgZWl0aGVyIGlucHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9pbnRlcnNlY3Rpb24oX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fY29tcCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSwgX19jb21wKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwlpZiAoX19jb21wKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKKwkgICsrX19maXJzdDE7CisJZWxzZSBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKwkgICsrX19maXJzdDI7CisJZWxzZQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisJICAgICsrX19maXJzdDE7CisJICAgICsrX19maXJzdDI7CisJICAgICsrX19yZXN1bHQ7CisJICB9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJldHVybiB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc29ydGVkIHJhbmdlcy4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBTdGFydCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEVuZCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIFN0YXJ0IG9mIHNlY29uZCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0MiAgIEVuZCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcmV0dXJuICBFbmQgb2YgdGhlIG91dHB1dCByYW5nZS4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBpdGVyYXRlcyBvdmVyIGJvdGggcmFuZ2VzLCBjb3B5aW5nIGVsZW1lbnRzIHByZXNlbnQgaW4KKyAgICogIHRoZSBmaXJzdCByYW5nZSBidXQgbm90IHRoZSBzZWNvbmQgaW4gb3JkZXIgdG8gdGhlIG91dHB1dCByYW5nZS4KKyAgICogIEl0ZXJhdG9ycyBpbmNyZW1lbnQgZm9yIGVhY2ggcmFuZ2UuICBXaGVuIHRoZSBjdXJyZW50IGVsZW1lbnQgb2YgdGhlCisgICAqICBmaXJzdCByYW5nZSBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZCwgdGhhdCBlbGVtZW50IGlzIGNvcGllZCBhbmQgdGhlCisgICAqICBpdGVyYXRvciBhZHZhbmNlcy4gIElmIHRoZSBjdXJyZW50IGVsZW1lbnQgb2YgdGhlIHNlY29uZCByYW5nZSBpcyBsZXNzLAorICAgKiAgdGhlIGl0ZXJhdG9yIGFkdmFuY2VzLCBidXQgbm8gZWxlbWVudCBpcyBjb3BpZWQuICBJZiBhbiBlbGVtZW50IGlzCisgICAqICBjb250YWluZWQgaW4gYm90aCByYW5nZXMsIG5vIGVsZW1lbnRzIGFyZSBjb3BpZWQgYW5kIGJvdGggcmFuZ2VzCisgICAqICBhZHZhbmNlLiAgVGhlIG91dHB1dCByYW5nZSBtYXkgbm90IG92ZXJsYXAgZWl0aGVyIGlucHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X2RpZmZlcmVuY2UoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkJICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZTIsIF9WYWx1ZVR5cGUxPikJCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDIsIF9fbGFzdDIsIF9fZmlyc3QxKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwlpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisJICAgICsrX19maXJzdDE7CisJICAgICsrX19yZXN1bHQ7CisJICB9CisJZWxzZSBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQorCSAgKytfX2ZpcnN0MjsKKwllbHNlCisJICB7CisJICAgICsrX19maXJzdDE7CisJICAgICsrX19maXJzdDI7CisJICB9CisgICAgICByZXR1cm4gc3RkOjpjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHNvcnRlZCByYW5nZXMgdXNpbmcgY29tcGFyaXNvbgorICAgKiAgZnVuY3Rvci4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBTdGFydCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEVuZCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIFN0YXJ0IG9mIHNlY29uZCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0MiAgIEVuZCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fY29tcCAgICBUaGUgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgRW5kIG9mIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gaXRlcmF0ZXMgb3ZlciBib3RoIHJhbmdlcywgY29weWluZyBlbGVtZW50cyBwcmVzZW50IGluCisgICAqICB0aGUgZmlyc3QgcmFuZ2UgYnV0IG5vdCB0aGUgc2Vjb25kIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAqICBJdGVyYXRvcnMgaW5jcmVtZW50IGZvciBlYWNoIHJhbmdlLiAgV2hlbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZQorICAgKiAgZmlyc3QgcmFuZ2UgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQgYWNjb3JkaW5nIHRvIEBwIF9fY29tcCwgdGhhdCBlbGVtZW50CisgICAqICBpcyBjb3BpZWQgYW5kIHRoZSBpdGVyYXRvciBhZHZhbmNlcy4gIElmIHRoZSBjdXJyZW50IGVsZW1lbnQgb2YgdGhlCisgICAqICBzZWNvbmQgcmFuZ2UgaXMgbGVzcywgbm8gZWxlbWVudCBpcyBjb3BpZWQgYW5kIHRoZSBpdGVyYXRvciBhZHZhbmNlcy4KKyAgICogIElmIGFuIGVsZW1lbnQgaXMgY29udGFpbmVkIGluIGJvdGggcmFuZ2VzIGFjY29yZGluZyB0byBAcCBfX2NvbXAsIG5vCisgICAqICBlbGVtZW50cyBhcmUgY29waWVkIGFuZCBib3RoIHJhbmdlcyBhZHZhbmNlLiAgVGhlIG91dHB1dCByYW5nZSBtYXkgbm90CisgICAqICBvdmVybGFwIGVpdGhlciBpbnB1dCByYW5nZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfZGlmZmVyZW5jZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1ZhbHVlVHlwZTIsIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0X3ByZWQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2NvbXApOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfX2ZpcnN0MiwgX19sYXN0MiwgX19maXJzdDEsIF9fY29tcCk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpCisJICB7CisJICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKwkgICAgKytfX2ZpcnN0MTsKKwkgICAgKytfX3Jlc3VsdDsKKwkgIH0KKwllbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorCSAgKytfX2ZpcnN0MjsKKwllbHNlCisJICB7CisJICAgICsrX19maXJzdDE7CisJICAgICsrX19maXJzdDI7CisJICB9CisgICAgICByZXR1cm4gc3RkOjpjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlIG9mIHR3byBzb3J0ZWQgcmFuZ2VzLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIFN0YXJ0IG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgRW5kIG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgU3RhcnQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgRW5kIG9mIHNlY29uZCByYW5nZS4KKyAgICogIEByZXR1cm4gIEVuZCBvZiB0aGUgb3V0cHV0IHJhbmdlLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIGl0ZXJhdGVzIG92ZXIgYm90aCByYW5nZXMsIGNvcHlpbmcgZWxlbWVudHMgcHJlc2VudCBpbgorICAgKiAgb25lIHJhbmdlIGJ1dCBub3QgdGhlIG90aGVyIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQgcmFuZ2UuICBJdGVyYXRvcnMKKyAgICogIGluY3JlbWVudCBmb3IgZWFjaCByYW5nZS4gIFdoZW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiBvbmUgcmFuZ2UgaXMgbGVzcworICAgKiAgdGhhbiB0aGUgb3RoZXIsIHRoYXQgZWxlbWVudCBpcyBjb3BpZWQgYW5kIHRoZSBpdGVyYXRvciBhZHZhbmNlcy4gIElmIGFuCisgICAqICBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiBib3RoIHJhbmdlcywgbm8gZWxlbWVudHMgYXJlIGNvcGllZCBhbmQgYm90aAorICAgKiAgcmFuZ2VzIGFkdmFuY2UuICBUaGUgb3V0cHV0IHJhbmdlIG1heSBub3Qgb3ZlcmxhcCBlaXRoZXIgaW5wdXQgcmFuZ2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJCSAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkJCSAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZTIsIF9WYWx1ZVR5cGUxPikJCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDIsIF9fbGFzdDIsIF9fZmlyc3QxKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwlpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisJICAgICsrX19maXJzdDE7CisJICAgICsrX19yZXN1bHQ7CisJICB9CisJZWxzZSBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7CisJICAgICsrX19maXJzdDI7CisJICAgICsrX19yZXN1bHQ7CisJICB9CisJZWxzZQorCSAgeworCSAgICArK19fZmlyc3QxOworCSAgICArK19fZmlyc3QyOworCSAgfQorICAgICAgcmV0dXJuIHN0ZDo6Y29weShfX2ZpcnN0MiwgX19sYXN0Miwgc3RkOjpjb3B5KF9fZmlyc3QxLAorCQkJCQkJICAgIF9fbGFzdDEsIF9fcmVzdWx0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlIG9mIHR3byBzb3J0ZWQgcmFuZ2VzIHVzaW5nCisgICAqICBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgU3RhcnQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBFbmQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBTdGFydCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDIgICBFbmQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICAgVGhlIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIEVuZCBvZiB0aGUgb3V0cHV0IHJhbmdlLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIGl0ZXJhdGVzIG92ZXIgYm90aCByYW5nZXMsIGNvcHlpbmcgZWxlbWVudHMgcHJlc2VudCBpbgorICAgKiAgb25lIHJhbmdlIGJ1dCBub3QgdGhlIG90aGVyIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQgcmFuZ2UuICBJdGVyYXRvcnMKKyAgICogIGluY3JlbWVudCBmb3IgZWFjaCByYW5nZS4gIFdoZW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiBvbmUgcmFuZ2UgaXMgbGVzcworICAgKiAgdGhhbiB0aGUgb3RoZXIgYWNjb3JkaW5nIHRvIEBwIGNvbXAsIHRoYXQgZWxlbWVudCBpcyBjb3BpZWQgYW5kIHRoZQorICAgKiAgaXRlcmF0b3IgYWR2YW5jZXMuICBJZiBhbiBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiBib3RoIHJhbmdlcyBhY2NvcmRpbmcKKyAgICogIHRvIEBwIF9fY29tcCwgbm8gZWxlbWVudHMgYXJlIGNvcGllZCBhbmQgYm90aCByYW5nZXMgYWR2YW5jZS4gIFRoZSBvdXRwdXQKKyAgICogIHJhbmdlIG1heSBub3Qgb3ZlcmxhcCBlaXRoZXIgaW5wdXQgcmFuZ2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCQkgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJCQkgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJCSAgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fY29tcCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSwgX19jb21wKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwlpZiAoX19jb21wKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKKwkgIHsKKwkgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICArK19fZmlyc3QxOworCSAgICArK19fcmVzdWx0OworCSAgfQorCWVsc2UgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisJICB7CisJICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MjsKKwkgICAgKytfX2ZpcnN0MjsKKwkgICAgKytfX3Jlc3VsdDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgICsrX19maXJzdDE7CisJICAgICsrX19maXJzdDI7CisJICB9CisgICAgICByZXR1cm4gc3RkOjpjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCAKKwkJICAgICAgIHN0ZDo6Y29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpKTsKKyAgICB9CisKKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIHRoZSBtaW5pbXVtIGVsZW1lbnQgaW4gYSByYW5nZS4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgRW5kIG9mIHJhbmdlLgorICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBzbWFsbGVzdCB2YWx1ZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgbWluX2VsZW1lbnQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19maXJzdDsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQgPSBfX2ZpcnN0OworICAgICAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisJaWYgKCpfX2ZpcnN0IDwgKl9fcmVzdWx0KQorCSAgX19yZXN1bHQgPSBfX2ZpcnN0OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIHRoZSBtaW5pbXVtIGVsZW1lbnQgaW4gYSByYW5nZSB1c2luZyBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgQ29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBzbWFsbGVzdCB2YWx1ZQorICAgKiAgYWNjb3JkaW5nIHRvIF9fY29tcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIG1pbl9lbGVtZW50KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCV9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2ZpcnN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwlpZiAoX19jb21wKCpfX2ZpcnN0LCAqX19yZXN1bHQpKQorCSAgX19yZXN1bHQgPSBfX2ZpcnN0OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIHRoZSBtYXhpbXVtIGVsZW1lbnQgaW4gYSByYW5nZS4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgRW5kIG9mIHJhbmdlLgorICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBsYXJnZXN0IHZhbHVlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBtYXhfZWxlbWVudChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2ZpcnN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwlpZiAoKl9fcmVzdWx0IDwgKl9fZmlyc3QpCisJICBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gdGhlIG1heGltdW0gZWxlbWVudCBpbiBhIHJhbmdlIHVzaW5nIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgRW5kIG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICBDb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcmV0dXJuICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIGxhcmdlc3QgdmFsdWUKKyAgICogIGFjY29yZGluZyB0byBfX2NvbXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBtYXhfZWxlbWVudChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQlfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuIF9fZmlyc3Q7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCWlmIChfX2NvbXAoKl9fcmVzdWx0LCAqX19maXJzdCkpCisJICBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0FMR08KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX1NUTF9BTEdPX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfYWxnb2Jhc2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfYWxnb2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2RkMTcxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9hbGdvYmFzZS5oCkBAIC0wLDAgKzEsMTIyNCBAQAorLy8gQ29yZSBhbGdvcml0aG1pYyBmYWNpbGl0aWVzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9hbGdvYmFzZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7YWxnb3JpdGhtfQorICovCisKKyNpZm5kZWYgX1NUTF9BTEdPQkFTRV9ICisjZGVmaW5lIF9TVExfQUxHT0JBU0VfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGV4dC9udW1lcmljX3RyYWl0cy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3BhaXIuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX3R5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4gLy8gRm9yIHN0ZDo6c3dhcCBhbmQgX0dMSUJDWFhfTU9WRQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgLy8gU2VlIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwNC0wOC9tc2cwMDE2Ny5odG1sOiBpbiBhCisgIC8vIG51dHNoZWxsLCB3ZSBhcmUgcGFydGlhbGx5IGltcGxlbWVudGluZyB0aGUgcmVzb2x1dGlvbiBvZiBEUiAxODcsCisgIC8vIHdoZW4gaXQncyBzYWZlLCBpLmUuLCB0aGUgdmFsdWVfdHlwZXMgYXJlIGVxdWFsLgorICB0ZW1wbGF0ZTxib29sIF9Cb29sVHlwZT4KKyAgICBzdHJ1Y3QgX19pdGVyX3N3YXAKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjI+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIGl0ZXJfc3dhcChfRm9yd2FyZEl0ZXJhdG9yMSBfX2EsIF9Gb3J3YXJkSXRlcmF0b3IyIF9fYikKKyAgICAgICAgeworICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IxPjo6dmFsdWVfdHlwZQorICAgICAgICAgICAgX1ZhbHVlVHlwZTE7CisgICAgICAgICAgX1ZhbHVlVHlwZTEgX190bXAgPSBfR0xJQkNYWF9NT1ZFKCpfX2EpOworICAgICAgICAgICpfX2EgPSBfR0xJQkNYWF9NT1ZFKCpfX2IpOworICAgICAgICAgICpfX2IgPSBfR0xJQkNYWF9NT1ZFKF9fdG1wKTsKKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXRlcl9zd2FwPHRydWU+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyPgorICAgICAgICBzdGF0aWMgdm9pZCAKKyAgICAgICAgaXRlcl9zd2FwKF9Gb3J3YXJkSXRlcmF0b3IxIF9fYSwgX0ZvcndhcmRJdGVyYXRvcjIgX19iKQorICAgICAgICB7CisgICAgICAgICAgc3dhcCgqX19hLCAqX19iKTsKKyAgICAgICAgfQorICAgIH07CisjZW5kaWYKKworICAvKioKKyAgICogIEBicmllZiBTd2FwcyB0aGUgY29udGVudHMgb2YgdHdvIGl0ZXJhdG9ycy4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19hICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19iICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIE5vdGhpbmcuCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIHN3YXBzIHRoZSB2YWx1ZXMgcG9pbnRlZCB0byBieSB0d28gaXRlcmF0b3JzLCBub3QgdGhlCisgICAqICBpdGVyYXRvcnMgdGhlbXNlbHZlcy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyPgorICAgIGlubGluZSB2b2lkCisgICAgaXRlcl9zd2FwKF9Gb3J3YXJkSXRlcmF0b3IxIF9fYSwgX0ZvcndhcmRJdGVyYXRvcjIgX19iKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0ZvcndhcmRJdGVyYXRvcjI+KQorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVmFsdWVUeXBlMSwKKwkJCQkgIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9WYWx1ZVR5cGUyLAorCQkJCSAgX1ZhbHVlVHlwZTE+KQorCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46OnJlZmVyZW5jZQorCV9SZWZlcmVuY2VUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IyPjo6cmVmZXJlbmNlCisJX1JlZmVyZW5jZVR5cGUyOworICAgICAgc3RkOjpfX2l0ZXJfc3dhcDxfX2FyZV9zYW1lPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj46Ol9fdmFsdWUKKwkmJiBfX2FyZV9zYW1lPF9WYWx1ZVR5cGUxJiwgX1JlZmVyZW5jZVR5cGUxPjo6X192YWx1ZQorCSYmIF9fYXJlX3NhbWU8X1ZhbHVlVHlwZTImLCBfUmVmZXJlbmNlVHlwZTI+OjpfX3ZhbHVlPjo6CisJaXRlcl9zd2FwKF9fYSwgX19iKTsKKyNlbHNlCisgICAgICBzd2FwKCpfX2EsICpfX2IpOworI2VuZGlmCisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFN3YXAgdGhlIGVsZW1lbnRzIG9mIHR3byBzZXF1ZW5jZXMuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgQW4gaXRlcmF0b3IgZXF1YWwgdG8gQHAgZmlyc3QyKyhsYXN0MS1maXJzdDEpLgorICAgKgorICAgKiAgU3dhcHMgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZSBAcCBbZmlyc3QxLGxhc3QxKSB3aXRoIHRoZQorICAgKiAgY29ycmVzcG9uZGluZyBlbGVtZW50IGluIHRoZSByYW5nZSBAcCBbZmlyc3QyLChsYXN0MS1maXJzdDEpKS4KKyAgICogIFRoZSByYW5nZXMgbXVzdCBub3Qgb3ZlcmxhcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IyCisgICAgc3dhcF9yYW5nZXMoX0ZvcndhcmRJdGVyYXRvcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbGFzdDEsCisJCV9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0ZvcndhcmRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKworICAgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIpCisJc3RkOjppdGVyX3N3YXAoX19maXJzdDEsIF9fZmlyc3QyKTsKKyAgICAgIHJldHVybiBfX2ZpcnN0MjsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgVGhpcyBkb2VzIHdoYXQgeW91IHRoaW5rIGl0IGRvZXMuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19hICBBIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHBhcmFtICBfX2IgIEFub3RoZXIgdGhpbmcgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcmV0dXJuICAgVGhlIGxlc3NlciBvZiB0aGUgcGFyYW1ldGVycy4KKyAgICoKKyAgICogIFRoaXMgaXMgdGhlIHNpbXBsZSBjbGFzc2ljIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uICBJdCB3aWxsIHdvcmsgb24KKyAgICogIHRlbXBvcmFyeSBleHByZXNzaW9ucywgc2luY2UgdGhleSBhcmUgb25seSBldmFsdWF0ZWQgb25jZSwgdW5saWtlIGEKKyAgICogIHByZXByb2Nlc3NvciBtYWNyby4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb25zdCBfVHAmCisgICAgbWluKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9UcD4pCisgICAgICAvL3JldHVybiBfX2IgPCBfX2EgPyBfX2IgOiBfX2E7CisgICAgICBpZiAoX19iIDwgX19hKQorCXJldHVybiBfX2I7CisgICAgICByZXR1cm4gX19hOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBUaGlzIGRvZXMgd2hhdCB5b3UgdGhpbmsgaXQgZG9lcy4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2EgIEEgdGhpbmcgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcGFyYW0gIF9fYiAgQW5vdGhlciB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEByZXR1cm4gICBUaGUgZ3JlYXRlciBvZiB0aGUgcGFyYW1ldGVycy4KKyAgICoKKyAgICogIFRoaXMgaXMgdGhlIHNpbXBsZSBjbGFzc2ljIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uICBJdCB3aWxsIHdvcmsgb24KKyAgICogIHRlbXBvcmFyeSBleHByZXNzaW9ucywgc2luY2UgdGhleSBhcmUgb25seSBldmFsdWF0ZWQgb25jZSwgdW5saWtlIGEKKyAgICogIHByZXByb2Nlc3NvciBtYWNyby4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb25zdCBfVHAmCisgICAgbWF4KGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9UcD4pCisgICAgICAvL3JldHVybiAgX19hIDwgX19iID8gX19iIDogX19hOworICAgICAgaWYgKF9fYSA8IF9fYikKKwlyZXR1cm4gX19iOworICAgICAgcmV0dXJuIF9fYTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgVGhpcyBkb2VzIHdoYXQgeW91IHRoaW5rIGl0IGRvZXMuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19hICBBIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHBhcmFtICBfX2IgIEFub3RoZXIgdGhpbmcgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcGFyYW0gIF9fY29tcCAgQSBAbGluayBjb21wYXJpc29uX2Z1bmN0b3JzIGNvbXBhcmlzb24gZnVuY3RvckBlbmRsaW5rLgorICAgKiAgQHJldHVybiAgIFRoZSBsZXNzZXIgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAqCisgICAqICBUaGlzIHdpbGwgd29yayBvbiB0ZW1wb3JhcnkgZXhwcmVzc2lvbnMsIHNpbmNlIHRoZXkgYXJlIG9ubHkgZXZhbHVhdGVkCisgICAqICBvbmNlLCB1bmxpa2UgYSBwcmVwcm9jZXNzb3IgbWFjcm8uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIGNvbnN0IF9UcCYKKyAgICBtaW4oY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy9yZXR1cm4gX19jb21wKF9fYiwgX19hKSA/IF9fYiA6IF9fYTsKKyAgICAgIGlmIChfX2NvbXAoX19iLCBfX2EpKQorCXJldHVybiBfX2I7CisgICAgICByZXR1cm4gX19hOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBUaGlzIGRvZXMgd2hhdCB5b3UgdGhpbmsgaXQgZG9lcy4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2EgIEEgdGhpbmcgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcGFyYW0gIF9fYiAgQW5vdGhlciB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEBwYXJhbSAgX19jb21wICBBIEBsaW5rIGNvbXBhcmlzb25fZnVuY3RvcnMgY29tcGFyaXNvbiBmdW5jdG9yQGVuZGxpbmsuCisgICAqICBAcmV0dXJuICAgVGhlIGdyZWF0ZXIgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAqCisgICAqICBUaGlzIHdpbGwgd29yayBvbiB0ZW1wb3JhcnkgZXhwcmVzc2lvbnMsIHNpbmNlIHRoZXkgYXJlIG9ubHkgZXZhbHVhdGVkCisgICAqICBvbmNlLCB1bmxpa2UgYSBwcmVwcm9jZXNzb3IgbWFjcm8uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIGNvbnN0IF9UcCYKKyAgICBtYXgoY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy9yZXR1cm4gX19jb21wKF9fYSwgX19iKSA/IF9fYiA6IF9fYTsKKyAgICAgIGlmIChfX2NvbXAoX19hLCBfX2IpKQorCXJldHVybiBfX2I7CisgICAgICByZXR1cm4gX19hOworICAgIH0KKworICAvLyBJZiBfSXRlcmF0b3IgaXMgYSBfX25vcm1hbF9pdGVyYXRvciByZXR1cm4gaXRzIGJhc2UgKGEgcGxhaW4gcG9pbnRlciwKKyAgLy8gbm9ybWFsbHkpIG90aGVyd2lzZSByZXR1cm4gaXQgdW50b3VjaGVkLiAgU2VlIGNvcHksIGZpbGwsIC4uLiAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIHN0cnVjdCBfTml0ZXJfYmFzZQorICAgIDogX0l0ZXJfYmFzZTxfSXRlcmF0b3IsIF9faXNfbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvcj46Ol9fdmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX05pdGVyX2Jhc2U8X0l0ZXJhdG9yPjo6aXRlcmF0b3JfdHlwZQorICAgIF9fbml0ZXJfYmFzZShfSXRlcmF0b3IgX19pdCkKKyAgICB7IHJldHVybiBzdGQ6Ol9OaXRlcl9iYXNlPF9JdGVyYXRvcj46Ol9TX2Jhc2UoX19pdCk7IH0KKworICAvLyBMaWtld2lzZSwgZm9yIG1vdmVfaXRlcmF0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBzdHJ1Y3QgX01pdGVyX2Jhc2UKKyAgICA6IF9JdGVyX2Jhc2U8X0l0ZXJhdG9yLCBfX2lzX21vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPjo6X192YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSB0eXBlbmFtZSBfTWl0ZXJfYmFzZTxfSXRlcmF0b3I+OjppdGVyYXRvcl90eXBlCisgICAgX19taXRlcl9iYXNlKF9JdGVyYXRvciBfX2l0KQorICAgIHsgcmV0dXJuIHN0ZDo6X01pdGVyX2Jhc2U8X0l0ZXJhdG9yPjo6X1NfYmFzZShfX2l0KTsgfQorCisgIC8vIEFsbCBvZiB0aGVzZSBhdXhpbGlhcnkgc3RydWN0cyBzZXJ2ZSB0d28gcHVycG9zZXMuICAoMSkgUmVwbGFjZQorICAvLyBjYWxscyB0byBjb3B5IHdpdGggbWVtbW92ZSB3aGVuZXZlciBwb3NzaWJsZS4gIChNZW1tb3ZlLCBub3QgbWVtY3B5LAorICAvLyBiZWNhdXNlIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHJhbmdlcyBhcmUgcGVybWl0dGVkIHRvIG92ZXJsYXAuKQorICAvLyAoMikgSWYgd2UncmUgdXNpbmcgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMsIHRoZW4gd3JpdGUgdGhlIGxvb3AgYXMKKyAgLy8gYSBmb3IgbG9vcCB3aXRoIGFuIGV4cGxpY2l0IGNvdW50LgorCisgIHRlbXBsYXRlPGJvb2wsIGJvb2wsIHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2NvcHlfbW92ZQorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSSwgdHlwZW5hbWUgX09JPgorICAgICAgICBzdGF0aWMgX09JCisgICAgICAgIF9fY29weV9tKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0LCBfT0kgX19yZXN1bHQpCisgICAgICAgIHsKKwkgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3Jlc3VsdCwgKytfX2ZpcnN0KQorCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NhdGVnb3J5PgorICAgIHN0cnVjdCBfX2NvcHlfbW92ZTx0cnVlLCBmYWxzZSwgX0NhdGVnb3J5PgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSSwgdHlwZW5hbWUgX09JPgorICAgICAgICBzdGF0aWMgX09JCisgICAgICAgIF9fY29weV9tKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0LCBfT0kgX19yZXN1bHQpCisgICAgICAgIHsKKwkgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3Jlc3VsdCwgKytfX2ZpcnN0KQorCSAgICAqX19yZXN1bHQgPSBzdGQ6Om1vdmUoKl9fZmlyc3QpOworCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9OworI2VuZGlmCisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2NvcHlfbW92ZTxmYWxzZSwgZmFsc2UsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSSwgdHlwZW5hbWUgX09JPgorICAgICAgICBzdGF0aWMgX09JCisgICAgICAgIF9fY29weV9tKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0LCBfT0kgX19yZXN1bHQpCisgICAgICAgIHsgCisJICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUk+OjpkaWZmZXJlbmNlX3R5cGUgX0Rpc3RhbmNlOworCSAgZm9yKF9EaXN0YW5jZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OyBfX24gPiAwOyAtLV9fbikKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworCSAgICAgICsrX19maXJzdDsKKwkgICAgICArK19fcmVzdWx0OworCSAgICB9CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgIH07CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19jb3B5X21vdmU8dHJ1ZSwgZmFsc2UsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSSwgdHlwZW5hbWUgX09JPgorICAgICAgICBzdGF0aWMgX09JCisgICAgICAgIF9fY29weV9tKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0LCBfT0kgX19yZXN1bHQpCisgICAgICAgIHsgCisJICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUk+OjpkaWZmZXJlbmNlX3R5cGUgX0Rpc3RhbmNlOworCSAgZm9yKF9EaXN0YW5jZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OyBfX24gPiAwOyAtLV9fbikKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9IHN0ZDo6bW92ZSgqX19maXJzdCk7CisJICAgICAgKytfX2ZpcnN0OworCSAgICAgICsrX19yZXN1bHQ7CisJICAgIH0KKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZT4KKyAgICBzdHJ1Y3QgX19jb3B5X21vdmU8X0lzTW92ZSwgdHJ1ZSwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgX1RwKgorICAgICAgICBfX2NvcHlfbShjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LCBfVHAqIF9fcmVzdWx0KQorICAgICAgICB7CisJICBjb25zdCBwdHJkaWZmX3QgX051bSA9IF9fbGFzdCAtIF9fZmlyc3Q7CisJICBpZiAoX051bSkKKwkgICAgX19idWlsdGluX21lbW1vdmUoX19yZXN1bHQsIF9fZmlyc3QsIHNpemVvZihfVHApICogX051bSk7CisJICByZXR1cm4gX19yZXN1bHQgKyBfTnVtOworCX0KKyAgICB9OworCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZSwgdHlwZW5hbWUgX0lJLCB0eXBlbmFtZSBfT0k+CisgICAgaW5saW5lIF9PSQorICAgIF9fY29weV9tb3ZlX2EoX0lJIF9fZmlyc3QsIF9JSSBfX2xhc3QsIF9PSSBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUk+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGVJOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X09JPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlTzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JST46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKKyAgICAgIGNvbnN0IGJvb2wgX19zaW1wbGUgPSAoX19pc190cml2aWFsKF9WYWx1ZVR5cGVJKQorCSAgICAgICAgICAgICAgICAgICAgICYmIF9faXNfcG9pbnRlcjxfSUk+OjpfX3ZhbHVlCisJICAgICAgICAgICAgICAgICAgICAgJiYgX19pc19wb2ludGVyPF9PST46Ol9fdmFsdWUKKwkJCSAgICAgJiYgX19hcmVfc2FtZTxfVmFsdWVUeXBlSSwgX1ZhbHVlVHlwZU8+OjpfX3ZhbHVlKTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19jb3B5X21vdmU8X0lzTW92ZSwgX19zaW1wbGUsCisJICAgICAgICAgICAgICAgICAgICAgIF9DYXRlZ29yeT46Ol9fY29weV9tKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOworICAgIH0KKworICAvLyBIZWxwZXJzIGZvciBzdHJlYW1idWYgaXRlcmF0b3JzIChlaXRoZXIgaXN0cmVhbSBvciBvc3RyZWFtKS4KKyAgLy8gTkI6IGF2b2lkIGluY2x1ZGluZyA8aW9zZndkPiwgcmVsYXRpdmVseSBsYXJnZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHN0cnVjdCBjaGFyX3RyYWl0czsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgaXN0cmVhbWJ1Zl9pdGVyYXRvcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3Mgb3N0cmVhbWJ1Zl9pdGVyYXRvcjsKKworICB0ZW1wbGF0ZTxib29sIF9Jc01vdmUsIHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfY2hhcjxfQ2hhclQ+OjpfX3ZhbHVlLCAKKwkgICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+ID4gPjo6X190eXBlCisgICAgX19jb3B5X21vdmVfYTIoX0NoYXJUKiwgX0NoYXJUKiwKKwkJICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPik7CisKKyAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlLCB0eXBlbmFtZSBfQ2hhclQ+CisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUPjo6X192YWx1ZSwgCisJICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+ID46Ol9fdHlwZQorICAgIF9fY29weV9tb3ZlX2EyKGNvbnN0IF9DaGFyVCosIGNvbnN0IF9DaGFyVCosCisJCSAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+ID4pOworCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZSwgdHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVD46Ol9fdmFsdWUsCisJCQkJICAgIF9DaGFyVCo+OjpfX3R5cGUKKyAgICBfX2NvcHlfbW92ZV9hMihpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+LAorCQkgICBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+LCBfQ2hhclQqKTsKKworICB0ZW1wbGF0ZTxib29sIF9Jc01vdmUsIHR5cGVuYW1lIF9JSSwgdHlwZW5hbWUgX09JPgorICAgIGlubGluZSBfT0kKKyAgICBfX2NvcHlfbW92ZV9hMihfSUkgX19maXJzdCwgX0lJIF9fbGFzdCwgX09JIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHJldHVybiBfT0koc3RkOjpfX2NvcHlfbW92ZV9hPF9Jc01vdmU+KHN0ZDo6X19uaXRlcl9iYXNlKF9fZmlyc3QpLAorCQkJCQkgICAgIHN0ZDo6X19uaXRlcl9iYXNlKF9fbGFzdCksCisJCQkJCSAgICAgc3RkOjpfX25pdGVyX2Jhc2UoX19yZXN1bHQpKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcGllcyB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIGludG8gcmVzdWx0LgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0IEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICByZXN1bHQgKyAoZmlyc3QgLSBsYXN0KQorICAgKgorICAgKiAgVGhpcyBpbmxpbmUgZnVuY3Rpb24gd2lsbCBib2lsIGRvd24gdG8gYSBjYWxsIHRvIEBjIG1lbW1vdmUgd2hlbmV2ZXIKKyAgICogIHBvc3NpYmxlLiAgRmFpbGluZyB0aGF0LCBpZiByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycyBhcmUgcGFzc2VkLCB0aGVuIHRoZQorICAgKiAgbG9vcCBjb3VudCB3aWxsIGJlIGtub3duIChhbmQgdGhlcmVmb3JlIGEgY2FuZGlkYXRlIGZvciBjb21waWxlcgorICAgKiAgb3B0aW1pemF0aW9ucyBzdWNoIGFzIHVucm9sbGluZykuICBSZXN1bHQgbWF5IG5vdCBiZSBjb250YWluZWQgd2l0aGluCisgICAqICBbZmlyc3QsbGFzdCk7IHRoZSBjb3B5X2JhY2t3YXJkIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisgICAqCisgICAqICBOb3RlIHRoYXQgdGhlIGVuZCBvZiB0aGUgb3V0cHV0IHJhbmdlIGlzIHBlcm1pdHRlZCB0byBiZSBjb250YWluZWQKKyAgICogIHdpdGhpbiBbZmlyc3QsbGFzdCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSSwgdHlwZW5hbWUgX09JPgorICAgIGlubGluZSBfT0kKKyAgICBjb3B5KF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0LCBfT0kgX19yZXN1bHQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lJPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PSSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JST46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHJldHVybiAoc3RkOjpfX2NvcHlfbW92ZV9hMjxfX2lzX21vdmVfaXRlcmF0b3I8X0lJPjo6X192YWx1ZT4KKwkgICAgICAoc3RkOjpfX21pdGVyX2Jhc2UoX19maXJzdCksIHN0ZDo6X19taXRlcl9iYXNlKF9fbGFzdCksCisJICAgICAgIF9fcmVzdWx0KSk7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvKioKKyAgICogIEBicmllZiBNb3ZlcyB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIGludG8gcmVzdWx0LgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0IEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICByZXN1bHQgKyAoZmlyc3QgLSBsYXN0KQorICAgKgorICAgKiAgVGhpcyBpbmxpbmUgZnVuY3Rpb24gd2lsbCBib2lsIGRvd24gdG8gYSBjYWxsIHRvIEBjIG1lbW1vdmUgd2hlbmV2ZXIKKyAgICogIHBvc3NpYmxlLiAgRmFpbGluZyB0aGF0LCBpZiByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycyBhcmUgcGFzc2VkLCB0aGVuIHRoZQorICAgKiAgbG9vcCBjb3VudCB3aWxsIGJlIGtub3duIChhbmQgdGhlcmVmb3JlIGEgY2FuZGlkYXRlIGZvciBjb21waWxlcgorICAgKiAgb3B0aW1pemF0aW9ucyBzdWNoIGFzIHVucm9sbGluZykuICBSZXN1bHQgbWF5IG5vdCBiZSBjb250YWluZWQgd2l0aGluCisgICAqICBbZmlyc3QsbGFzdCk7IHRoZSBtb3ZlX2JhY2t3YXJkIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisgICAqCisgICAqICBOb3RlIHRoYXQgdGhlIGVuZCBvZiB0aGUgb3V0cHV0IHJhbmdlIGlzIHBlcm1pdHRlZCB0byBiZSBjb250YWluZWQKKyAgICogIHdpdGhpbiBbZmlyc3QsbGFzdCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSSwgdHlwZW5hbWUgX09JPgorICAgIGlubGluZSBfT0kKKyAgICBtb3ZlKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0LCBfT0kgX19yZXN1bHQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lJPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PSSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JST46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fY29weV9tb3ZlX2EyPHRydWU+KHN0ZDo6X19taXRlcl9iYXNlKF9fZmlyc3QpLAorCQkJCSAgICAgICBzdGQ6Ol9fbWl0ZXJfYmFzZShfX2xhc3QpLCBfX3Jlc3VsdCk7CisgICAgfQorCisjZGVmaW5lIF9HTElCQ1hYX01PVkUzKF9UcCwgX1VwLCBfVnApIHN0ZDo6bW92ZShfVHAsIF9VcCwgX1ZwKQorI2Vsc2UKKyNkZWZpbmUgX0dMSUJDWFhfTU9WRTMoX1RwLCBfVXAsIF9WcCkgc3RkOjpjb3B5KF9UcCwgX1VwLCBfVnApCisjZW5kaWYKKworICB0ZW1wbGF0ZTxib29sLCBib29sLCB0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19jb3B5X21vdmVfYmFja3dhcmQKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkkxLCB0eXBlbmFtZSBfQkkyPgorICAgICAgICBzdGF0aWMgX0JJMgorICAgICAgICBfX2NvcHlfbW92ZV9iKF9CSTEgX19maXJzdCwgX0JJMSBfX2xhc3QsIF9CSTIgX19yZXN1bHQpCisgICAgICAgIHsKKwkgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgICAgKi0tX19yZXN1bHQgPSAqLS1fX2xhc3Q7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgIH07CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DYXRlZ29yeT4KKyAgICBzdHJ1Y3QgX19jb3B5X21vdmVfYmFja3dhcmQ8dHJ1ZSwgZmFsc2UsIF9DYXRlZ29yeT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkkxLCB0eXBlbmFtZSBfQkkyPgorICAgICAgICBzdGF0aWMgX0JJMgorICAgICAgICBfX2NvcHlfbW92ZV9iKF9CSTEgX19maXJzdCwgX0JJMSBfX2xhc3QsIF9CSTIgX19yZXN1bHQpCisgICAgICAgIHsKKwkgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgICAgKi0tX19yZXN1bHQgPSBzdGQ6Om1vdmUoKi0tX19sYXN0KTsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19jb3B5X21vdmVfYmFja3dhcmQ8ZmFsc2UsIGZhbHNlLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZz4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkkxLCB0eXBlbmFtZSBfQkkyPgorICAgICAgICBzdGF0aWMgX0JJMgorICAgICAgICBfX2NvcHlfbW92ZV9iKF9CSTEgX19maXJzdCwgX0JJMSBfX2xhc3QsIF9CSTIgX19yZXN1bHQpCisgICAgICAgIHsKKwkgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQkkxPjo6ZGlmZmVyZW5jZV90eXBlIF9fbjsKKwkgIGZvciAoX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1fX24pCisJICAgICotLV9fcmVzdWx0ID0gKi0tX19sYXN0OworCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fY29weV9tb3ZlX2JhY2t3YXJkPHRydWUsIGZhbHNlLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZz4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkkxLCB0eXBlbmFtZSBfQkkyPgorICAgICAgICBzdGF0aWMgX0JJMgorICAgICAgICBfX2NvcHlfbW92ZV9iKF9CSTEgX19maXJzdCwgX0JJMSBfX2xhc3QsIF9CSTIgX19yZXN1bHQpCisgICAgICAgIHsKKwkgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQkkxPjo6ZGlmZmVyZW5jZV90eXBlIF9fbjsKKwkgIGZvciAoX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1fX24pCisJICAgICotLV9fcmVzdWx0ID0gc3RkOjptb3ZlKCotLV9fbGFzdCk7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgIH07CisjZW5kaWYKKworICB0ZW1wbGF0ZTxib29sIF9Jc01vdmU+CisgICAgc3RydWN0IF9fY29weV9tb3ZlX2JhY2t3YXJkPF9Jc01vdmUsIHRydWUsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIF9UcCoKKyAgICAgICAgX19jb3B5X21vdmVfYihjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LCBfVHAqIF9fcmVzdWx0KQorICAgICAgICB7CisJICBjb25zdCBwdHJkaWZmX3QgX051bSA9IF9fbGFzdCAtIF9fZmlyc3Q7CisJICBpZiAoX051bSkKKwkgICAgX19idWlsdGluX21lbW1vdmUoX19yZXN1bHQgLSBfTnVtLCBfX2ZpcnN0LCBzaXplb2YoX1RwKSAqIF9OdW0pOworCSAgcmV0dXJuIF9fcmVzdWx0IC0gX051bTsKKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTxib29sIF9Jc01vdmUsIHR5cGVuYW1lIF9CSTEsIHR5cGVuYW1lIF9CSTI+CisgICAgaW5saW5lIF9CSTIKKyAgICBfX2NvcHlfbW92ZV9iYWNrd2FyZF9hKF9CSTEgX19maXJzdCwgX0JJMSBfX2xhc3QsIF9CSTIgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JJMT46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQkkyPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CSTE+OjppdGVyYXRvcl9jYXRlZ29yeSBfQ2F0ZWdvcnk7CisgICAgICBjb25zdCBib29sIF9fc2ltcGxlID0gKF9faXNfdHJpdmlhbChfVmFsdWVUeXBlMSkKKwkgICAgICAgICAgICAgICAgICAgICAmJiBfX2lzX3BvaW50ZXI8X0JJMT46Ol9fdmFsdWUKKwkgICAgICAgICAgICAgICAgICAgICAmJiBfX2lzX3BvaW50ZXI8X0JJMj46Ol9fdmFsdWUKKwkJCSAgICAgJiYgX19hcmVfc2FtZTxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+OjpfX3ZhbHVlKTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19jb3B5X21vdmVfYmFja3dhcmQ8X0lzTW92ZSwgX19zaW1wbGUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DYXRlZ29yeT46Ol9fY29weV9tb3ZlX2IoX19maXJzdCwKKwkJCQkJCQkJIF9fbGFzdCwKKwkJCQkJCQkJIF9fcmVzdWx0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlLCB0eXBlbmFtZSBfQkkxLCB0eXBlbmFtZSBfQkkyPgorICAgIGlubGluZSBfQkkyCisgICAgX19jb3B5X21vdmVfYmFja3dhcmRfYTIoX0JJMSBfX2ZpcnN0LCBfQkkxIF9fbGFzdCwgX0JJMiBfX3Jlc3VsdCkKKyAgICB7CisgICAgICByZXR1cm4gX0JJMihzdGQ6Ol9fY29weV9tb3ZlX2JhY2t3YXJkX2E8X0lzTW92ZT4KKwkJICAoc3RkOjpfX25pdGVyX2Jhc2UoX19maXJzdCksIHN0ZDo6X19uaXRlcl9iYXNlKF9fbGFzdCksCisJCSAgIHN0ZDo6X19uaXRlcl9iYXNlKF9fcmVzdWx0KSkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBDb3BpZXMgdGhlIHJhbmdlIFtmaXJzdCxsYXN0KSBpbnRvIHJlc3VsdC4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBBIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0IEEgYmlkaXJlY3Rpb25hbCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICByZXN1bHQgLSAoZmlyc3QgLSBsYXN0KQorICAgKgorICAgKiAgVGhlIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgY29weSwgYnV0IHN0YXJ0cyBhdCB0aGUgZW5kIG9mIHRoZQorICAgKiAgcmFuZ2UgYW5kIHdvcmtzIGl0cyB3YXkgdG8gdGhlIHN0YXJ0LCByZXR1cm5pbmcgdGhlIHN0YXJ0IG9mIHRoZSByZXN1bHQuCisgICAqICBUaGlzIGlubGluZSBmdW5jdGlvbiB3aWxsIGJvaWwgZG93biB0byBhIGNhbGwgdG8gQGMgbWVtbW92ZSB3aGVuZXZlcgorICAgKiAgcG9zc2libGUuICBGYWlsaW5nIHRoYXQsIGlmIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzIGFyZSBwYXNzZWQsIHRoZW4gdGhlCisgICAqICBsb29wIGNvdW50IHdpbGwgYmUga25vd24gKGFuZCB0aGVyZWZvcmUgYSBjYW5kaWRhdGUgZm9yIGNvbXBpbGVyCisgICAqICBvcHRpbWl6YXRpb25zIHN1Y2ggYXMgdW5yb2xsaW5nKS4KKyAgICoKKyAgICogIFJlc3VsdCBtYXkgbm90IGJlIGluIHRoZSByYW5nZSAoZmlyc3QsbGFzdF0uICBVc2UgY29weSBpbnN0ZWFkLiAgTm90ZQorICAgKiAgdGhhdCB0aGUgc3RhcnQgb2YgdGhlIG91dHB1dCByYW5nZSBtYXkgb3ZlcmxhcCBbZmlyc3QsbGFzdCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSTEsIHR5cGVuYW1lIF9CSTI+CisgICAgaW5saW5lIF9CSTIKKyAgICBjb3B5X2JhY2t3YXJkKF9CSTEgX19maXJzdCwgX0JJMSBfX2xhc3QsIF9CSTIgX19yZXN1bHQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDxfQkkxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PF9CSTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQkkxPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CSTI+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICByZXR1cm4gKHN0ZDo6X19jb3B5X21vdmVfYmFja3dhcmRfYTI8X19pc19tb3ZlX2l0ZXJhdG9yPF9CSTE+OjpfX3ZhbHVlPgorCSAgICAgIChzdGQ6Ol9fbWl0ZXJfYmFzZShfX2ZpcnN0KSwgc3RkOjpfX21pdGVyX2Jhc2UoX19sYXN0KSwKKwkgICAgICAgX19yZXN1bHQpKTsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8qKgorICAgKiAgQGJyaWVmIE1vdmVzIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgaW50byByZXN1bHQuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEEgYmlkaXJlY3Rpb25hbCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCBBIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgcmVzdWx0IC0gKGZpcnN0IC0gbGFzdCkKKyAgICoKKyAgICogIFRoZSBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIG1vdmUsIGJ1dCBzdGFydHMgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICogIHJhbmdlIGFuZCB3b3JrcyBpdHMgd2F5IHRvIHRoZSBzdGFydCwgcmV0dXJuaW5nIHRoZSBzdGFydCBvZiB0aGUgcmVzdWx0LgorICAgKiAgVGhpcyBpbmxpbmUgZnVuY3Rpb24gd2lsbCBib2lsIGRvd24gdG8gYSBjYWxsIHRvIEBjIG1lbW1vdmUgd2hlbmV2ZXIKKyAgICogIHBvc3NpYmxlLiAgRmFpbGluZyB0aGF0LCBpZiByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycyBhcmUgcGFzc2VkLCB0aGVuIHRoZQorICAgKiAgbG9vcCBjb3VudCB3aWxsIGJlIGtub3duIChhbmQgdGhlcmVmb3JlIGEgY2FuZGlkYXRlIGZvciBjb21waWxlcgorICAgKiAgb3B0aW1pemF0aW9ucyBzdWNoIGFzIHVucm9sbGluZykuCisgICAqCisgICAqICBSZXN1bHQgbWF5IG5vdCBiZSBpbiB0aGUgcmFuZ2UgKGZpcnN0LGxhc3RdLiAgVXNlIG1vdmUgaW5zdGVhZC4gIE5vdGUKKyAgICogIHRoYXQgdGhlIHN0YXJ0IG9mIHRoZSBvdXRwdXQgcmFuZ2UgbWF5IG92ZXJsYXAgW2ZpcnN0LGxhc3QpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkkxLCB0eXBlbmFtZSBfQkkyPgorICAgIGlubGluZSBfQkkyCisgICAgbW92ZV9iYWNrd2FyZChfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LCBfQkkyIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8X0JJMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDxfQkkyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JJMT46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQkkyPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19jb3B5X21vdmVfYmFja3dhcmRfYTI8dHJ1ZT4oc3RkOjpfX21pdGVyX2Jhc2UoX19maXJzdCksCisJCQkJCQlzdGQ6Ol9fbWl0ZXJfYmFzZShfX2xhc3QpLAorCQkJCQkJX19yZXN1bHQpOworICAgIH0KKworI2RlZmluZSBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfVHAsIF9VcCwgX1ZwKSBzdGQ6Om1vdmVfYmFja3dhcmQoX1RwLCBfVXAsIF9WcCkKKyNlbHNlCisjZGVmaW5lIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKF9UcCwgX1VwLCBfVnApIHN0ZDo6Y29weV9iYWNrd2FyZChfVHAsIF9VcCwgX1ZwKQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8IV9faXNfc2NhbGFyPF9UcD46Ol9fdmFsdWUsIHZvaWQ+OjpfX3R5cGUKKyAgICBfX2ZpbGxfYShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorIAkgICAgIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwkqX19maXJzdCA9IF9fdmFsdWU7CisgICAgfQorICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lCisgICAgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX3NjYWxhcjxfVHA+OjpfX3ZhbHVlLCB2b2lkPjo6X190eXBlCisgICAgX19maWxsX2EoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICBjb25zdCBfVHAgX190bXAgPSBfX3ZhbHVlOworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJKl9fZmlyc3QgPSBfX3RtcDsKKyAgICB9CisKKyAgLy8gU3BlY2lhbGl6YXRpb246IGZvciBjaGFyIHR5cGVzIHdlIGNhbiB1c2UgbWVtc2V0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lCisgICAgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2J5dGU8X1RwPjo6X192YWx1ZSwgdm9pZD46Ol9fdHlwZQorICAgIF9fZmlsbF9hKF9UcCogX19maXJzdCwgX1RwKiBfX2xhc3QsIGNvbnN0IF9UcCYgX19jKQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX3RtcCA9IF9fYzsKKyAgICAgIF9fYnVpbHRpbl9tZW1zZXQoX19maXJzdCwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oX190bXApLAorCQkgICAgICAgX19sYXN0IC0gX19maXJzdCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEZpbGxzIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgd2l0aCBjb3BpZXMgb2YgdmFsdWUuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ZhbHVlICBBIHJlZmVyZW5jZS10by1jb25zdCBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEByZXR1cm4gICBOb3RoaW5nLgorICAgKgorICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhIHJhbmdlIHdpdGggY29waWVzIG9mIHRoZSBzYW1lIHZhbHVlLiAgRm9yIGNoYXIKKyAgICogIHR5cGVzIGZpbGxpbmcgY29udGlndW91cyBhcmVhcyBvZiBtZW1vcnksIHRoaXMgYmVjb21lcyBhbiBpbmxpbmUgY2FsbAorICAgKiAgdG8gQGMgbWVtc2V0IG9yIEBjIHdtZW1zZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGZpbGwoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHN0ZDo6X19maWxsX2Eoc3RkOjpfX25pdGVyX2Jhc2UoX19maXJzdCksIHN0ZDo6X19uaXRlcl9iYXNlKF9fbGFzdCksCisJCSAgICBfX3ZhbHVlKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8IV9faXNfc2NhbGFyPF9UcD46Ol9fdmFsdWUsIF9PdXRwdXRJdGVyYXRvcj46Ol9fdHlwZQorICAgIF9fZmlsbF9uX2EoX091dHB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIGZvciAoX19kZWNsdHlwZShfX24gKyAwKSBfX25pdGVyID0gX19uOworCSAgIF9fbml0ZXIgPiAwOyAtLV9fbml0ZXIsICsrX19maXJzdCkKKwkqX19maXJzdCA9IF9fdmFsdWU7CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19zY2FsYXI8X1RwPjo6X192YWx1ZSwgX091dHB1dEl0ZXJhdG9yPjo6X190eXBlCisgICAgX19maWxsX25fYShfT3V0cHV0SXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUpCisgICAgeworICAgICAgY29uc3QgX1RwIF9fdG1wID0gX192YWx1ZTsKKyAgICAgIGZvciAoX19kZWNsdHlwZShfX24gKyAwKSBfX25pdGVyID0gX19uOworCSAgIF9fbml0ZXIgPiAwOyAtLV9fbml0ZXIsICsrX19maXJzdCkKKwkqX19maXJzdCA9IF9fdG1wOworICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lCisgICAgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2J5dGU8X1RwPjo6X192YWx1ZSwgX1RwKj46Ol9fdHlwZQorICAgIF9fZmlsbF9uX2EoX1RwKiBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX19jKQorICAgIHsKKyAgICAgIHN0ZDo6X19maWxsX2EoX19maXJzdCwgX19maXJzdCArIF9fbiwgX19jKTsKKyAgICAgIHJldHVybiBfX2ZpcnN0ICsgX19uOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaWxscyB0aGUgcmFuZ2UgW2ZpcnN0LGZpcnN0K24pIHdpdGggY29waWVzIG9mIHZhbHVlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbiAgICAgIFRoZSBjb3VudCBvZiBjb3BpZXMgdG8gcGVyZm9ybS4KKyAgICogIEBwYXJhbSAgX192YWx1ZSAgQSByZWZlcmVuY2UtdG8tY29uc3Qgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcmV0dXJuICAgVGhlIGl0ZXJhdG9yIGF0IGZpcnN0K24uCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgcmFuZ2Ugd2l0aCBjb3BpZXMgb2YgdGhlIHNhbWUgdmFsdWUuICBGb3IgY2hhcgorICAgKiAgdHlwZXMgZmlsbGluZyBjb250aWd1b3VzIGFyZWFzIG9mIG1lbW9yeSwgdGhpcyBiZWNvbWVzIGFuIGlubGluZSBjYWxsCisgICAqICB0byBAYyBtZW1zZXQgb3IgQCB3bWVtc2V0LgorICAgKgorICAgKiAgX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgKiAgRFIgODY1LiBNb3JlIGFsZ29yaXRobXMgdGhhdCB0aHJvdyBhd2F5IGluZm9ybWF0aW9uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PSSwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX09JCisgICAgZmlsbF9uKF9PSSBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X09JLCBfVHA+KQorCisgICAgICByZXR1cm4gX09JKHN0ZDo6X19maWxsX25fYShzdGQ6Ol9fbml0ZXJfYmFzZShfX2ZpcnN0KSwgX19uLCBfX3ZhbHVlKSk7CisgICAgfQorCisgIHRlbXBsYXRlPGJvb2wgX0Jvb2xUeXBlPgorICAgIHN0cnVjdCBfX2VxdWFsCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJMSwgdHlwZW5hbWUgX0lJMj4KKyAgICAgICAgc3RhdGljIGJvb2wKKyAgICAgICAgZXF1YWwoX0lJMSBfX2ZpcnN0MSwgX0lJMSBfX2xhc3QxLCBfSUkyIF9fZmlyc3QyKQorICAgICAgICB7CisJICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKwkgICAgaWYgKCEoKl9fZmlyc3QxID09ICpfX2ZpcnN0MikpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2VxdWFsPHRydWU+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgYm9vbAorICAgICAgICBlcXVhbChjb25zdCBfVHAqIF9fZmlyc3QxLCBjb25zdCBfVHAqIF9fbGFzdDEsIGNvbnN0IF9UcCogX19maXJzdDIpCisgICAgICAgIHsKKwkgIHJldHVybiAhX19idWlsdGluX21lbWNtcChfX2ZpcnN0MSwgX19maXJzdDIsIHNpemVvZihfVHApCisJCQkJICAgKiAoX19sYXN0MSAtIF9fZmlyc3QxKSk7CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJMSwgdHlwZW5hbWUgX0lJMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fZXF1YWxfYXV4KF9JSTEgX19maXJzdDEsIF9JSTEgX19sYXN0MSwgX0lJMiBfX2ZpcnN0MikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkxPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSTI+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworICAgICAgY29uc3QgYm9vbCBfX3NpbXBsZSA9ICgoX19pc19pbnRlZ2VyPF9WYWx1ZVR5cGUxPjo6X192YWx1ZQorCQkJICAgICAgfHwgX19pc19wb2ludGVyPF9WYWx1ZVR5cGUxPjo6X192YWx1ZSkKKwkgICAgICAgICAgICAgICAgICAgICAmJiBfX2lzX3BvaW50ZXI8X0lJMT46Ol9fdmFsdWUKKwkgICAgICAgICAgICAgICAgICAgICAmJiBfX2lzX3BvaW50ZXI8X0lJMj46Ol9fdmFsdWUKKwkJCSAgICAgJiYgX19hcmVfc2FtZTxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+OjpfX3ZhbHVlKTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19lcXVhbDxfX3NpbXBsZT46OmVxdWFsKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0Mik7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2xjX3JhaQorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSTEsIHR5cGVuYW1lIF9JSTI+CisgICAgICAgIHN0YXRpYyBfSUkxCisgICAgICAgIF9fbmV3bGFzdDEoX0lJMSwgX0lJMSBfX2xhc3QxLCBfSUkyLCBfSUkyKQorICAgICAgICB7IHJldHVybiBfX2xhc3QxOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JST4KKyAgICAgICAgc3RhdGljIGJvb2wKKyAgICAgICAgX19jbmQyKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0KQorICAgICAgICB7IHJldHVybiBfX2ZpcnN0ICE9IF9fbGFzdDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2xjX3JhaTxyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSTEsIHR5cGVuYW1lIF9SQUkyPgorICAgICAgICBzdGF0aWMgX1JBSTEKKyAgICAgICAgX19uZXdsYXN0MShfUkFJMSBfX2ZpcnN0MSwgX1JBSTEgX19sYXN0MSwKKwkJICAgX1JBSTIgX19maXJzdDIsIF9SQUkyIF9fbGFzdDIpCisgICAgICAgIHsKKwkgIGNvbnN0IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUkFJMT46OmRpZmZlcmVuY2VfdHlwZQorCSAgICBfX2RpZmYxID0gX19sYXN0MSAtIF9fZmlyc3QxOworCSAgY29uc3QgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SQUkyPjo6ZGlmZmVyZW5jZV90eXBlCisJICAgIF9fZGlmZjIgPSBfX2xhc3QyIC0gX19maXJzdDI7CisJICByZXR1cm4gX19kaWZmMiA8IF9fZGlmZjEgPyBfX2ZpcnN0MSArIF9fZGlmZjIgOiBfX2xhc3QxOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBST4KKyAgICAgICAgc3RhdGljIGJvb2wKKyAgICAgICAgX19jbmQyKF9SQUksIF9SQUkpCisgICAgICAgIHsgcmV0dXJuIHRydWU7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGJvb2wgX0Jvb2xUeXBlPgorICAgIHN0cnVjdCBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJMSwgdHlwZW5hbWUgX0lJMj4KKyAgICAgICAgc3RhdGljIGJvb2wgX19sYyhfSUkxLCBfSUkxLCBfSUkyLCBfSUkyKTsKKyAgICB9OworCisgIHRlbXBsYXRlPGJvb2wgX0Jvb2xUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSTEsIHR5cGVuYW1lIF9JSTI+CisgICAgICBib29sCisgICAgICBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlPF9Cb29sVHlwZT46OgorICAgICAgX19sYyhfSUkxIF9fZmlyc3QxLCBfSUkxIF9fbGFzdDEsIF9JSTIgX19maXJzdDIsIF9JSTIgX19sYXN0MikKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkxPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5MTsKKwl0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkyPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5MjsKKwl0eXBlZGVmIHN0ZDo6X19sY19yYWk8X0NhdGVnb3J5MSwgX0NhdGVnb3J5Mj4gCV9fcmFpX3R5cGU7CisJCisJX19sYXN0MSA9IF9fcmFpX3R5cGU6Ol9fbmV3bGFzdDEoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCSBfX2ZpcnN0MiwgX19sYXN0Mik7CisJZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19yYWlfdHlwZTo6X19jbmQyKF9fZmlyc3QyLCBfX2xhc3QyKTsKKwkgICAgICsrX19maXJzdDEsICsrX19maXJzdDIpCisJICB7CisJICAgIGlmICgqX19maXJzdDEgPCAqX19maXJzdDIpCisJICAgICAgcmV0dXJuIHRydWU7CisJICAgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgfQorCXJldHVybiBfX2ZpcnN0MSA9PSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDI7CisgICAgICB9CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlPHRydWU+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgICAgIHN0YXRpYyBib29sCisgICAgICAgIF9fbGMoY29uc3QgX1RwKiBfX2ZpcnN0MSwgY29uc3QgX1RwKiBfX2xhc3QxLAorCSAgICAgY29uc3QgX1VwKiBfX2ZpcnN0MiwgY29uc3QgX1VwKiBfX2xhc3QyKQorCXsKKwkgIGNvbnN0IHNpemVfdCBfX2xlbjEgPSBfX2xhc3QxIC0gX19maXJzdDE7CisJICBjb25zdCBzaXplX3QgX19sZW4yID0gX19sYXN0MiAtIF9fZmlyc3QyOworCSAgY29uc3QgaW50IF9fcmVzdWx0ID0gX19idWlsdGluX21lbWNtcChfX2ZpcnN0MSwgX19maXJzdDIsCisJCQkJCQlzdGQ6Om1pbihfX2xlbjEsIF9fbGVuMikpOworCSAgcmV0dXJuIF9fcmVzdWx0ICE9IDAgPyBfX3Jlc3VsdCA8IDAgOiBfX2xlbjEgPCBfX2xlbjI7CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJMSwgdHlwZW5hbWUgX0lJMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfYXV4KF9JSTEgX19maXJzdDEsIF9JSTEgX19sYXN0MSwKKwkJCQkgIF9JSTIgX19maXJzdDIsIF9JSTIgX19sYXN0MikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkxPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSTI+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworICAgICAgY29uc3QgYm9vbCBfX3NpbXBsZSA9CisJKF9faXNfYnl0ZTxfVmFsdWVUeXBlMT46Ol9fdmFsdWUgJiYgX19pc19ieXRlPF9WYWx1ZVR5cGUyPjo6X192YWx1ZQorCSAmJiAhX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPF9WYWx1ZVR5cGUxPjo6X19pc19zaWduZWQKKwkgJiYgIV9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUeXBlMj46Ol9faXNfc2lnbmVkCisJICYmIF9faXNfcG9pbnRlcjxfSUkxPjo6X192YWx1ZQorCSAmJiBfX2lzX3BvaW50ZXI8X0lJMj46Ol9fdmFsdWUpOworCisgICAgICByZXR1cm4gc3RkOjpfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlPF9fc2ltcGxlPjo6X19sYyhfX2ZpcnN0MSwgX19sYXN0MSwKKwkJCQkJCQkgICAgX19maXJzdDIsIF9fbGFzdDIpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kcyB0aGUgZmlyc3QgcG9zaXRpb24gaW4gd2hpY2ggQGEgdmFsIGNvdWxkIGJlIGluc2VydGVkCisgICAqICAgICAgICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgb3JkZXJpbmcuCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fdmFsICAgICBUaGUgc2VhcmNoIHRlcm0uCisgICAqICBAcmV0dXJuICAgICAgICAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgPGVtPm5vdCBsZXNzCisgICAqICAgICAgICAgICAgICAgICAgdGhhbjwvZW0+IEBhIHZhbCwgb3IgZW5kKCkgaWYgZXZlcnkgZWxlbWVudCBpcyBsZXNzIHRoYW4gCisgICAqICAgICAgICAgICAgICAgICAgQGEgdmFsLgorICAgKiAgQGluZ3JvdXAgYmluYXJ5X3NlYXJjaF9hbGdvcml0aG1zCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgbG93ZXJfYm91bmQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisjaWZkZWYgX0dMSUJDWFhfQ09OQ0VQVF9DSEVDS1MKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKyNlbmRpZgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUsIF9UcD4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfbG93ZXIoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CisKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApCisJeworCSAgX0Rpc3RhbmNlVHlwZSBfX2hhbGYgPSBfX2xlbiA+PiAxOworCSAgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3Q7CisJICBzdGQ6OmFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CisJICBpZiAoKl9fbWlkZGxlIDwgX192YWwpCisJICAgIHsKKwkgICAgICBfX2ZpcnN0ID0gX19taWRkbGU7CisJICAgICAgKytfX2ZpcnN0OworCSAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOworCSAgICB9CisJICBlbHNlCisJICAgIF9fbGVuID0gX19oYWxmOworCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZXMgYW5kIGZvciByYW5kb20udGNjLgorICAvLyAgUHJlY29uZGl0aW9uOiBfX24gPiAwLgorICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGludAorICBfX2xnKGludCBfX24pCisgIHsgcmV0dXJuIHNpemVvZihpbnQpICogX19DSEFSX0JJVF9fICAtIDEgLSBfX2J1aWx0aW5fY2x6KF9fbik7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkCisgIF9fbGcodW5zaWduZWQgX19uKQorICB7IHJldHVybiBzaXplb2YoaW50KSAqIF9fQ0hBUl9CSVRfXyAgLSAxIC0gX19idWlsdGluX2NseihfX24pOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nCisgIF9fbGcobG9uZyBfX24pCisgIHsgcmV0dXJuIHNpemVvZihsb25nKSAqIF9fQ0hBUl9CSVRfXyAtIDEgLSBfX2J1aWx0aW5fY2x6bChfX24pOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nCisgIF9fbGcodW5zaWduZWQgbG9uZyBfX24pCisgIHsgcmV0dXJuIHNpemVvZihsb25nKSAqIF9fQ0hBUl9CSVRfXyAtIDEgLSBfX2J1aWx0aW5fY2x6bChfX24pOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGxvbmcKKyAgX19sZyhsb25nIGxvbmcgX19uKQorICB7IHJldHVybiBzaXplb2YobG9uZyBsb25nKSAqIF9fQ0hBUl9CSVRfXyAtIDEgLSBfX2J1aWx0aW5fY2x6bGwoX19uKTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgbG9uZyBsb25nCisgIF9fbGcodW5zaWduZWQgbG9uZyBsb25nIF9fbikKKyAgeyByZXR1cm4gc2l6ZW9mKGxvbmcgbG9uZykgKiBfX0NIQVJfQklUX18gLSAxIC0gX19idWlsdGluX2NsemxsKF9fbik7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9BTEdPCisKKyAgLyoqCisgICAqICBAYnJpZWYgVGVzdHMgYSByYW5nZSBmb3IgZWxlbWVudC13aXNlIGVxdWFsaXR5LgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBBIGJvb2xlYW4gdHJ1ZSBvciBmYWxzZS4KKyAgICoKKyAgICogIFRoaXMgY29tcGFyZXMgdGhlIGVsZW1lbnRzIG9mIHR3byByYW5nZXMgdXNpbmcgQGMgPT0gYW5kIHJldHVybnMgdHJ1ZSBvcgorICAgKiAgZmFsc2UgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYWxsIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIHRoZQorICAgKiAgcmFuZ2VzIGFyZSBlcXVhbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJMSwgdHlwZW5hbWUgX0lJMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIGVxdWFsKF9JSTEgX19maXJzdDEsIF9JSTEgX19sYXN0MSwgX0lJMiBfX2ZpcnN0MikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSUkxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lJMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJMT46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkyPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworCisgICAgICByZXR1cm4gc3RkOjpfX2VxdWFsX2F1eChzdGQ6Ol9fbml0ZXJfYmFzZShfX2ZpcnN0MSksCisJCQkgICAgICBzdGQ6Ol9fbml0ZXJfYmFzZShfX2xhc3QxKSwKKwkJCSAgICAgIHN0ZDo6X19uaXRlcl9iYXNlKF9fZmlyc3QyKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFRlc3RzIGEgcmFuZ2UgZm9yIGVsZW1lbnQtd2lzZSBlcXVhbGl0eS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gX19iaW5hcnlfcHJlZCBBIGJpbmFyeSBwcmVkaWNhdGUgQGxpbmsgZnVuY3RvcnMKKyAgICogICAgICAgICAgICAgICAgICBmdW5jdG9yQGVuZGxpbmsuCisgICAqICBAcmV0dXJuICAgICAgICAgQSBib29sZWFuIHRydWUgb3IgZmFsc2UuCisgICAqCisgICAqICBUaGlzIGNvbXBhcmVzIHRoZSBlbGVtZW50cyBvZiB0d28gcmFuZ2VzIHVzaW5nIHRoZSBiaW5hcnlfcHJlZAorICAgKiAgcGFyYW1ldGVyLCBhbmQgcmV0dXJucyB0cnVlIG9yCisgICAqICBmYWxzZSBkZXBlbmRpbmcgb24gd2hldGhlciBhbGwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhlCisgICAqICByYW5nZXMgYXJlIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGlubGluZSBib29sCisgICAgZXF1YWwoX0lJdGVyMSBfX2ZpcnN0MSwgX0lJdGVyMSBfX2xhc3QxLAorCSAgX0lJdGVyMiBfX2ZpcnN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JSXRlcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSUl0ZXIyPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQorCWlmICghYm9vbChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkpCisJICByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgUGVyZm9ybXMgQGIgZGljdGlvbmFyeSBjb21wYXJpc29uIG9uIHJhbmdlcy4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgQSBib29sZWFuIHRydWUgb3IgZmFsc2UuCisgICAqCisgICAqICA8ZW0+UmV0dXJucyB0cnVlIGlmIHRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBkZWZpbmVkIGJ5IHRoZSByYW5nZQorICAgKiAgW2ZpcnN0MSxsYXN0MSkgaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuIHRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cworICAgKiAgZGVmaW5lZCBieSB0aGUgcmFuZ2UgW2ZpcnN0MixsYXN0MikuICBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS48L2VtPgorICAgKiAgKFF1b3RlZCBmcm9tIFsyNS4zLjhdLzEuKSAgSWYgdGhlIGl0ZXJhdG9ycyBhcmUgYWxsIGNoYXJhY3RlciBwb2ludGVycywKKyAgICogIHRoZW4gdGhpcyBpcyBhbiBpbmxpbmUgY2FsbCB0byBAYyBtZW1jbXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSTEsIHR5cGVuYW1lIF9JSTI+CisgICAgaW5saW5lIGJvb2wKKyAgICBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSUkxIF9fZmlyc3QxLCBfSUkxIF9fbGFzdDEsCisJCQkgICAgX0lJMiBfX2ZpcnN0MiwgX0lJMiBfX2xhc3QyKQorICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9DT05DRVBUX0NIRUNLUworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSTE+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJMj46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTI7CisjZW5kaWYKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lJMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JSTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MiwgX19sYXN0Mik7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfYXV4KHN0ZDo6X19uaXRlcl9iYXNlKF9fZmlyc3QxKSwKKwkJCQkJCXN0ZDo6X19uaXRlcl9iYXNlKF9fbGFzdDEpLAorCQkJCQkJc3RkOjpfX25pdGVyX2Jhc2UoX19maXJzdDIpLAorCQkJCQkJc3RkOjpfX25pdGVyX2Jhc2UoX19sYXN0MikpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBQZXJmb3JtcyBAYiBkaWN0aW9uYXJ5IGNvbXBhcmlzb24gb24gcmFuZ2VzLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdDIgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19jb21wICBBIEBsaW5rIGNvbXBhcmlzb25fZnVuY3RvcnMgY29tcGFyaXNvbiBmdW5jdG9yQGVuZGxpbmsuCisgICAqICBAcmV0dXJuICAgQSBib29sZWFuIHRydWUgb3IgZmFsc2UuCisgICAqCisgICAqICBUaGUgc2FtZSBhcyB0aGUgZm91ci1wYXJhbWV0ZXIgQGMgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUsIGJ1dCB1c2VzIHRoZQorICAgKiAgY29tcCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiBAYyA8LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUkxLCB0eXBlbmFtZSBfSUkyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sCisgICAgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lJMSBfX2ZpcnN0MSwgX0lJMSBfX2xhc3QxLAorCQkJICAgIF9JSTIgX19maXJzdDIsIF9JSTIgX19sYXN0MiwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSTE+OjppdGVyYXRvcl9jYXRlZ29yeSBfQ2F0ZWdvcnkxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJMj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTI7CisgICAgICB0eXBlZGVmIHN0ZDo6X19sY19yYWk8X0NhdGVnb3J5MSwgX0NhdGVnb3J5Mj4gCV9fcmFpX3R5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JSTE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSUkyPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpOworCisgICAgICBfX2xhc3QxID0gX19yYWlfdHlwZTo6X19uZXdsYXN0MShfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOworICAgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19yYWlfdHlwZTo6X19jbmQyKF9fZmlyc3QyLCBfX2xhc3QyKTsKKwkgICArK19fZmlyc3QxLCArK19fZmlyc3QyKQorCXsKKwkgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKQorCSAgICByZXR1cm4gdHJ1ZTsKKwkgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgcmV0dXJuIF9fZmlyc3QxID09IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MjsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZHMgdGhlIHBsYWNlcyBpbiByYW5nZXMgd2hpY2ggZG9uJ3QgbWF0Y2guCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIEEgcGFpciBvZiBpdGVyYXRvcnMgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IG1pc21hdGNoLgorICAgKgorICAgKiAgVGhpcyBjb21wYXJlcyB0aGUgZWxlbWVudHMgb2YgdHdvIHJhbmdlcyB1c2luZyBAYyA9PSBhbmQgcmV0dXJucyBhIHBhaXIKKyAgICogIG9mIGl0ZXJhdG9ycy4gIFRoZSBmaXJzdCBpdGVyYXRvciBwb2ludHMgaW50byB0aGUgZmlyc3QgcmFuZ2UsIHRoZQorICAgKiAgc2Vjb25kIGl0ZXJhdG9yIHBvaW50cyBpbnRvIHRoZSBzZWNvbmQgcmFuZ2UsIGFuZCB0aGUgZWxlbWVudHMgcG9pbnRlZAorICAgKiAgdG8gYnkgdGhlIGl0ZXJhdG9ycyBhcmUgbm90IGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMj4KKyAgICBwYWlyPF9JbnB1dEl0ZXJhdG9yMSwgX0lucHV0SXRlcmF0b3IyPgorICAgIG1pc21hdGNoKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxPcENvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworCisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiAqX19maXJzdDEgPT0gKl9fZmlyc3QyKQorICAgICAgICB7CisJICArK19fZmlyc3QxOworCSAgKytfX2ZpcnN0MjsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIHBhaXI8X0lucHV0SXRlcmF0b3IxLCBfSW5wdXRJdGVyYXRvcjI+KF9fZmlyc3QxLCBfX2ZpcnN0Mik7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBwbGFjZXMgaW4gcmFuZ2VzIHdoaWNoIGRvbid0IG1hdGNoLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSBfX2JpbmFyeV9wcmVkIEEgYmluYXJ5IHByZWRpY2F0ZSBAbGluayBmdW5jdG9ycworICAgKiAgICAgICAgIGZ1bmN0b3JAZW5kbGluay4KKyAgICogIEByZXR1cm4gICBBIHBhaXIgb2YgaXRlcmF0b3JzIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBtaXNtYXRjaC4KKyAgICoKKyAgICogIFRoaXMgY29tcGFyZXMgdGhlIGVsZW1lbnRzIG9mIHR3byByYW5nZXMgdXNpbmcgdGhlIGJpbmFyeV9wcmVkCisgICAqICBwYXJhbWV0ZXIsIGFuZCByZXR1cm5zIGEgcGFpcgorICAgKiAgb2YgaXRlcmF0b3JzLiAgVGhlIGZpcnN0IGl0ZXJhdG9yIHBvaW50cyBpbnRvIHRoZSBmaXJzdCByYW5nZSwgdGhlCisgICAqICBzZWNvbmQgaXRlcmF0b3IgcG9pbnRzIGludG8gdGhlIHNlY29uZCByYW5nZSwgYW5kIHRoZSBlbGVtZW50cyBwb2ludGVkCisgICAqICB0byBieSB0aGUgaXRlcmF0b3JzIGFyZSBub3QgZXF1YWwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgcGFpcjxfSW5wdXRJdGVyYXRvcjEsIF9JbnB1dEl0ZXJhdG9yMj4KKyAgICBtaXNtYXRjaChfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIGJvb2woX19iaW5hcnlfcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpKQorICAgICAgICB7CisJICArK19fZmlyc3QxOworCSAgKytfX2ZpcnN0MjsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIHBhaXI8X0lucHV0SXRlcmF0b3IxLCBfSW5wdXRJdGVyYXRvcjI+KF9fZmlyc3QxLCBfX2ZpcnN0Mik7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0FMR08KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisvLyBOQjogVGhpcyBmaWxlIGlzIGluY2x1ZGVkIHdpdGhpbiBtYW55IG90aGVyIEMrKyBpbmNsdWRlcywgYXMgYSB3YXkKKy8vIG9mIGdldHRpbmcgdGhlIGJhc2UgYWxnb3JpdGhtcy4gU28sIG1ha2Ugc3VyZSB0aGF0IHBhcmFsbGVsIGJpdHMKKy8vIGNvbWUgaW4gdG9vIGlmIHJlcXVlc3RlZC4gCisjaWZkZWYgX0dMSUJDWFhfUEFSQUxMRUwKKyMgaW5jbHVkZSA8cGFyYWxsZWwvYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfYnZlY3Rvci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9idmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyYTk4YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfYnZlY3Rvci5oCkBAIC0wLDAgKzEsMTE1NSBAQAorLy8gdmVjdG9yPGJvb2w+IHNwZWNpYWxpemF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9idmVjdG9yLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2ZWN0b3J9CisgKi8KKworI2lmbmRlZiBfU1RMX0JWRUNUT1JfSAorI2RlZmluZSBfU1RMX0JWRUNUT1JfSCAxCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX0JpdF90eXBlOworICBlbnVtIHsgX1Nfd29yZF9iaXQgPSBpbnQoX19DSEFSX0JJVF9fICogc2l6ZW9mKF9CaXRfdHlwZSkpIH07CisKKyAgc3RydWN0IF9CaXRfcmVmZXJlbmNlCisgIHsKKyAgICBfQml0X3R5cGUgKiBfTV9wOworICAgIF9CaXRfdHlwZSBfTV9tYXNrOworCisgICAgX0JpdF9yZWZlcmVuY2UoX0JpdF90eXBlICogX194LCBfQml0X3R5cGUgX195KQorICAgIDogX01fcChfX3gpLCBfTV9tYXNrKF9feSkgeyB9CisKKyAgICBfQml0X3JlZmVyZW5jZSgpIF9HTElCQ1hYX05PRVhDRVBUIDogX01fcCgwKSwgX01fbWFzaygwKSB7IH0KKworICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuICEhKCpfTV9wICYgX01fbWFzayk7IH0KKworICAgIF9CaXRfcmVmZXJlbmNlJgorICAgIG9wZXJhdG9yPShib29sIF9feCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBpZiAoX194KQorCSpfTV9wIHw9IF9NX21hc2s7CisgICAgICBlbHNlCisJKl9NX3AgJj0gfl9NX21hc2s7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgX0JpdF9yZWZlcmVuY2UmCisgICAgb3BlcmF0b3I9KGNvbnN0IF9CaXRfcmVmZXJlbmNlJiBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gKnRoaXMgPSBib29sKF9feCk7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9CaXRfcmVmZXJlbmNlJiBfX3gpIGNvbnN0CisgICAgeyByZXR1cm4gYm9vbCgqdGhpcykgPT0gYm9vbChfX3gpOyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9CaXRfcmVmZXJlbmNlJiBfX3gpIGNvbnN0CisgICAgeyByZXR1cm4gIWJvb2woKnRoaXMpICYmIGJvb2woX194KTsgfQorCisgICAgdm9pZAorICAgIGZsaXAoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgKl9NX3AgXj0gX01fbWFzazsgfQorICB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICBpbmxpbmUgdm9pZAorICBzd2FwKF9CaXRfcmVmZXJlbmNlIF9feCwgX0JpdF9yZWZlcmVuY2UgX195KSBub2V4Y2VwdAorICB7CisgICAgYm9vbCBfX3RtcCA9IF9feDsKKyAgICBfX3ggPSBfX3k7CisgICAgX195ID0gX190bXA7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBzd2FwKF9CaXRfcmVmZXJlbmNlIF9feCwgYm9vbCYgX195KSBub2V4Y2VwdAorICB7CisgICAgYm9vbCBfX3RtcCA9IF9feDsKKyAgICBfX3ggPSBfX3k7CisgICAgX195ID0gX190bXA7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBzd2FwKGJvb2wmIF9feCwgX0JpdF9yZWZlcmVuY2UgX195KSBub2V4Y2VwdAorICB7CisgICAgYm9vbCBfX3RtcCA9IF9feDsKKyAgICBfX3ggPSBfX3k7CisgICAgX195ID0gX190bXA7CisgIH0KKyNlbmRpZgorCisgIHN0cnVjdCBfQml0X2l0ZXJhdG9yX2Jhc2UKKyAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBib29sPgorICB7CisgICAgX0JpdF90eXBlICogX01fcDsKKyAgICB1bnNpZ25lZCBpbnQgX01fb2Zmc2V0OworCisgICAgX0JpdF9pdGVyYXRvcl9iYXNlKF9CaXRfdHlwZSAqIF9feCwgdW5zaWduZWQgaW50IF9feSkKKyAgICA6IF9NX3AoX194KSwgX01fb2Zmc2V0KF9feSkgeyB9CisKKyAgICB2b2lkCisgICAgX01fYnVtcF91cCgpCisgICAgeworICAgICAgaWYgKF9NX29mZnNldCsrID09IGludChfU193b3JkX2JpdCkgLSAxKQorCXsKKwkgIF9NX29mZnNldCA9IDA7CisJICArK19NX3A7CisJfQorICAgIH0KKworICAgIHZvaWQKKyAgICBfTV9idW1wX2Rvd24oKQorICAgIHsKKyAgICAgIGlmIChfTV9vZmZzZXQtLSA9PSAwKQorCXsKKwkgIF9NX29mZnNldCA9IGludChfU193b3JkX2JpdCkgLSAxOworCSAgLS1fTV9wOworCX0KKyAgICB9CisKKyAgICB2b2lkCisgICAgX01faW5jcihwdHJkaWZmX3QgX19pKQorICAgIHsKKyAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2kgKyBfTV9vZmZzZXQ7CisgICAgICBfTV9wICs9IF9fbiAvIGludChfU193b3JkX2JpdCk7CisgICAgICBfX24gPSBfX24gJSBpbnQoX1Nfd29yZF9iaXQpOworICAgICAgaWYgKF9fbiA8IDApCisJeworCSAgX19uICs9IGludChfU193b3JkX2JpdCk7CisJICAtLV9NX3A7CisJfQorICAgICAgX01fb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihfX24pOworICAgIH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX19pKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3AgPT0gX19pLl9NX3AgJiYgX01fb2Zmc2V0ID09IF9faS5fTV9vZmZzZXQ7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX2kpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIF9NX3AgPCBfX2kuX01fcAorCSAgICAgfHwgKF9NX3AgPT0gX19pLl9NX3AgJiYgX01fb2Zmc2V0IDwgX19pLl9NX29mZnNldCk7CisgICAgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX2kpIGNvbnN0CisgICAgeyByZXR1cm4gISgqdGhpcyA9PSBfX2kpOyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX19pKSBjb25zdAorICAgIHsgcmV0dXJuIF9faSA8ICp0aGlzOyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9faSkgY29uc3QKKyAgICB7IHJldHVybiAhKF9faSA8ICp0aGlzKTsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX2kpIGNvbnN0CisgICAgeyByZXR1cm4gISgqdGhpcyA8IF9faSk7IH0KKyAgfTsKKworICBpbmxpbmUgcHRyZGlmZl90CisgIG9wZXJhdG9yLShjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feCwgY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3kpCisgIHsKKyAgICByZXR1cm4gKGludChfU193b3JkX2JpdCkgKiAoX194Ll9NX3AgLSBfX3kuX01fcCkKKwkgICAgKyBfX3guX01fb2Zmc2V0IC0gX195Ll9NX29mZnNldCk7CisgIH0KKworICBzdHJ1Y3QgX0JpdF9pdGVyYXRvciA6IHB1YmxpYyBfQml0X2l0ZXJhdG9yX2Jhc2UKKyAgeworICAgIHR5cGVkZWYgX0JpdF9yZWZlcmVuY2UgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIF9CaXRfcmVmZXJlbmNlKiBwb2ludGVyOworICAgIHR5cGVkZWYgX0JpdF9pdGVyYXRvciAgIGl0ZXJhdG9yOworCisgICAgX0JpdF9pdGVyYXRvcigpIDogX0JpdF9pdGVyYXRvcl9iYXNlKDAsIDApIHsgfQorCisgICAgX0JpdF9pdGVyYXRvcihfQml0X3R5cGUgKiBfX3gsIHVuc2lnbmVkIGludCBfX3kpCisgICAgOiBfQml0X2l0ZXJhdG9yX2Jhc2UoX194LCBfX3kpIHsgfQorCisgICAgcmVmZXJlbmNlCisgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICB7IHJldHVybiByZWZlcmVuY2UoX01fcCwgMVVMIDw8IF9NX29mZnNldCk7IH0KKworICAgIGl0ZXJhdG9yJgorICAgIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgIF9NX2J1bXBfdXAoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpdGVyYXRvcgorICAgIG9wZXJhdG9yKysoaW50KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisgICAgICBfTV9idW1wX3VwKCk7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorCisgICAgaXRlcmF0b3ImCisgICAgb3BlcmF0b3ItLSgpCisgICAgeworICAgICAgX01fYnVtcF9kb3duKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgaXRlcmF0b3IKKyAgICBvcGVyYXRvci0tKGludCkKKyAgICB7CisgICAgICBpdGVyYXRvciBfX3RtcCA9ICp0aGlzOworICAgICAgX01fYnVtcF9kb3duKCk7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorCisgICAgaXRlcmF0b3ImCisgICAgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19pKQorICAgIHsKKyAgICAgIF9NX2luY3IoX19pKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpdGVyYXRvciYKKyAgICBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBfX2kpCisgICAgeworICAgICAgKnRoaXMgKz0gLV9faTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpdGVyYXRvcgorICAgIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19pKSBjb25zdAorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisgICAgICByZXR1cm4gX190bXAgKz0gX19pOworICAgIH0KKworICAgIGl0ZXJhdG9yCisgICAgb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX2kpIGNvbnN0CisgICAgeworICAgICAgaXRlcmF0b3IgX190bXAgPSAqdGhpczsKKyAgICAgIHJldHVybiBfX3RtcCAtPSBfX2k7CisgICAgfQorCisgICAgcmVmZXJlbmNlCisgICAgb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgX19pKSBjb25zdAorICAgIHsgcmV0dXJuICooKnRoaXMgKyBfX2kpOyB9CisgIH07CisKKyAgaW5saW5lIF9CaXRfaXRlcmF0b3IKKyAgb3BlcmF0b3IrKHB0cmRpZmZfdCBfX24sIGNvbnN0IF9CaXRfaXRlcmF0b3ImIF9feCkKKyAgeyByZXR1cm4gX194ICsgX19uOyB9CisKKyAgc3RydWN0IF9CaXRfY29uc3RfaXRlcmF0b3IgOiBwdWJsaWMgX0JpdF9pdGVyYXRvcl9iYXNlCisgIHsKKyAgICB0eXBlZGVmIGJvb2wgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGJvb2wgICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IGJvb2wqICAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiBfQml0X2NvbnN0X2l0ZXJhdG9yICBjb25zdF9pdGVyYXRvcjsKKworICAgIF9CaXRfY29uc3RfaXRlcmF0b3IoKSA6IF9CaXRfaXRlcmF0b3JfYmFzZSgwLCAwKSB7IH0KKworICAgIF9CaXRfY29uc3RfaXRlcmF0b3IoX0JpdF90eXBlICogX194LCB1bnNpZ25lZCBpbnQgX195KQorICAgIDogX0JpdF9pdGVyYXRvcl9iYXNlKF9feCwgX195KSB7IH0KKworICAgIF9CaXRfY29uc3RfaXRlcmF0b3IoY29uc3QgX0JpdF9pdGVyYXRvciYgX194KQorICAgIDogX0JpdF9pdGVyYXRvcl9iYXNlKF9feC5fTV9wLCBfX3guX01fb2Zmc2V0KSB7IH0KKworICAgIGNvbnN0X3JlZmVyZW5jZQorICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgeyByZXR1cm4gX0JpdF9yZWZlcmVuY2UoX01fcCwgMVVMIDw8IF9NX29mZnNldCk7IH0KKworICAgIGNvbnN0X2l0ZXJhdG9yJgorICAgIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgIF9NX2J1bXBfdXAoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBjb25zdF9pdGVyYXRvcgorICAgIG9wZXJhdG9yKysoaW50KQorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisgICAgICBfTV9idW1wX3VwKCk7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3ImCisgICAgb3BlcmF0b3ItLSgpCisgICAgeworICAgICAgX01fYnVtcF9kb3duKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3IKKyAgICBvcGVyYXRvci0tKGludCkKKyAgICB7CisgICAgICBjb25zdF9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworICAgICAgX01fYnVtcF9kb3duKCk7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3ImCisgICAgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19pKQorICAgIHsKKyAgICAgIF9NX2luY3IoX19pKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBjb25zdF9pdGVyYXRvciYKKyAgICBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBfX2kpCisgICAgeworICAgICAgKnRoaXMgKz0gLV9faTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBjb25zdF9pdGVyYXRvciAKKyAgICBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9faSkgY29uc3QKKyAgICB7CisgICAgICBjb25zdF9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworICAgICAgcmV0dXJuIF9fdG1wICs9IF9faTsKKyAgICB9CisKKyAgICBjb25zdF9pdGVyYXRvcgorICAgIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5cGUgX19pKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisgICAgICByZXR1cm4gX190bXAgLT0gX19pOworICAgIH0KKworICAgIGNvbnN0X3JlZmVyZW5jZQorICAgIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIF9faSkgY29uc3QKKyAgICB7IHJldHVybiAqKCp0aGlzICsgX19pKTsgfQorICB9OworCisgIGlubGluZSBfQml0X2NvbnN0X2l0ZXJhdG9yCisgIG9wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfQml0X2NvbnN0X2l0ZXJhdG9yJiBfX3gpCisgIHsgcmV0dXJuIF9feCArIF9fbjsgfQorCisgIGlubGluZSB2b2lkCisgIF9fZmlsbF9idmVjdG9yKF9CaXRfaXRlcmF0b3IgX19maXJzdCwgX0JpdF9pdGVyYXRvciBfX2xhc3QsIGJvb2wgX194KQorICB7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAqX19maXJzdCA9IF9feDsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIGZpbGwoX0JpdF9pdGVyYXRvciBfX2ZpcnN0LCBfQml0X2l0ZXJhdG9yIF9fbGFzdCwgY29uc3QgYm9vbCYgX194KQorICB7CisgICAgaWYgKF9fZmlyc3QuX01fcCAhPSBfX2xhc3QuX01fcCkKKyAgICAgIHsKKwlzdGQ6OmZpbGwoX19maXJzdC5fTV9wICsgMSwgX19sYXN0Ll9NX3AsIF9feCA/IH4wIDogMCk7CisJX19maWxsX2J2ZWN0b3IoX19maXJzdCwgX0JpdF9pdGVyYXRvcihfX2ZpcnN0Ll9NX3AgKyAxLCAwKSwgX194KTsKKwlfX2ZpbGxfYnZlY3RvcihfQml0X2l0ZXJhdG9yKF9fbGFzdC5fTV9wLCAwKSwgX19sYXN0LCBfX3gpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fZmlsbF9idmVjdG9yKF9fZmlyc3QsIF9fbGFzdCwgX194KTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX0J2ZWN0b3JfYmFzZQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X0JpdF90eXBlPjo6b3RoZXIKKyAgICAgICAgX0JpdF9hbGxvY190eXBlOworICAgICAgCisgICAgICBzdHJ1Y3QgX0J2ZWN0b3JfaW1wbAorICAgICAgOiBwdWJsaWMgX0JpdF9hbGxvY190eXBlCisgICAgICB7CisJX0JpdF9pdGVyYXRvciAJX01fc3RhcnQ7CisJX0JpdF9pdGVyYXRvciAJX01fZmluaXNoOworCV9CaXRfdHlwZSogCV9NX2VuZF9vZl9zdG9yYWdlOworCisJX0J2ZWN0b3JfaW1wbCgpCisJOiBfQml0X2FsbG9jX3R5cGUoKSwgX01fc3RhcnQoKSwgX01fZmluaXNoKCksIF9NX2VuZF9vZl9zdG9yYWdlKDApCisJeyB9CisgCisJX0J2ZWN0b3JfaW1wbChjb25zdCBfQml0X2FsbG9jX3R5cGUmIF9fYSkKKwk6IF9CaXRfYWxsb2NfdHlwZShfX2EpLCBfTV9zdGFydCgpLCBfTV9maW5pc2goKSwgX01fZW5kX29mX3N0b3JhZ2UoMCkKKwl7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwlfQnZlY3Rvcl9pbXBsKF9CaXRfYWxsb2NfdHlwZSYmIF9fYSkKKwk6IF9CaXRfYWxsb2NfdHlwZShzdGQ6Om1vdmUoX19hKSksIF9NX3N0YXJ0KCksIF9NX2ZpbmlzaCgpLAorCSAgX01fZW5kX29mX3N0b3JhZ2UoMCkKKwl7IH0KKyNlbmRpZgorICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0FsbG9jIGFsbG9jYXRvcl90eXBlOworCisgICAgICBfQml0X2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfQml0X2FsbG9jYXRvcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X0JpdF9hbGxvY190eXBlKj4oJnRoaXMtPl9NX2ltcGwpOyB9CisKKyAgICAgIGNvbnN0IF9CaXRfYWxsb2NfdHlwZSYKKyAgICAgIF9NX2dldF9CaXRfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfQml0X2FsbG9jX3R5cGUqPigmdGhpcy0+X01faW1wbCk7IH0KKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUoX01fZ2V0X0JpdF9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgX0J2ZWN0b3JfYmFzZSgpCisgICAgICA6IF9NX2ltcGwoKSB7IH0KKyAgICAgIAorICAgICAgX0J2ZWN0b3JfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfTV9pbXBsKF9fYSkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBfQnZlY3Rvcl9iYXNlKF9CdmVjdG9yX2Jhc2UmJiBfX3gpIG5vZXhjZXB0CisgICAgICA6IF9NX2ltcGwoc3RkOjptb3ZlKF9feC5fTV9nZXRfQml0X2FsbG9jYXRvcigpKSkKKyAgICAgIHsKKwl0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX194Ll9NX2ltcGwuX01fc3RhcnQ7CisJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX3guX01faW1wbC5fTV9maW5pc2g7CisJdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IF9feC5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlOworCV9feC5fTV9pbXBsLl9NX3N0YXJ0ID0gX0JpdF9pdGVyYXRvcigpOworCV9feC5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9CaXRfaXRlcmF0b3IoKTsKKwlfX3guX01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IDA7CisgICAgICB9CisjZW5kaWYKKworICAgICAgfl9CdmVjdG9yX2Jhc2UoKQorICAgICAgeyB0aGlzLT5fTV9kZWFsbG9jYXRlKCk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9CdmVjdG9yX2ltcGwgX01faW1wbDsKKworICAgICAgX0JpdF90eXBlKgorICAgICAgX01fYWxsb2NhdGUoc2l6ZV90IF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2ltcGwuYWxsb2NhdGUoX1NfbndvcmQoX19uKSk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZGVhbGxvY2F0ZSgpCisgICAgICB7CisJaWYgKF9NX2ltcGwuX01fc3RhcnQuX01fcCkKKwkgIF9NX2ltcGwuZGVhbGxvY2F0ZShfTV9pbXBsLl9NX3N0YXJ0Ll9NX3AsCisJCQkgICAgIF9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgLSBfTV9pbXBsLl9NX3N0YXJ0Ll9NX3ApOworICAgICAgfQorCisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBfU19ud29yZChzaXplX3QgX19uKQorICAgICAgeyByZXR1cm4gKF9fbiArIGludChfU193b3JkX2JpdCkgLSAxKSAvIGludChfU193b3JkX2JpdCk7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKy8vIERlY2xhcmUgYSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIHZlY3RvcjxULCBBbGxvYz4uCisjaW5jbHVkZSA8Yml0cy9zdGxfdmVjdG9yLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIC8qKgorICAgKiAgQGJyaWVmICBBIHNwZWNpYWxpemF0aW9uIG9mIHZlY3RvciBmb3IgYm9vbGVhbnMgd2hpY2ggb2ZmZXJzIGZpeGVkIHRpbWUKKyAgICogIGFjY2VzcyB0byBpbmRpdmlkdWFsIGVsZW1lbnRzIGluIGFueSBvcmRlci4KKyAgICoKKyAgICogIEBpbmdyb3VwIHNlcXVlbmNlcworICAgKgorICAgKiAgQHRwYXJhbSBfQWxsb2MgIEFsbG9jYXRvciB0eXBlLgorICAgKgorICAgKiAgTm90ZSB0aGF0IHZlY3Rvcjxib29sPiBkb2VzIG5vdCBhY3R1YWxseSBtZWV0IHRoZSByZXF1aXJlbWVudHMgZm9yIGJlaW5nCisgICAqICBhIGNvbnRhaW5lci4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGFuZCBwb2ludGVyIHR5cGVzIGFyZSBub3QKKyAgICogIHJlYWxseSByZWZlcmVuY2VzIGFuZCBwb2ludGVycyB0byBib29sLiAgU2VlIERSOTYgZm9yIGRldGFpbHMuICBAc2VlCisgICAqICB2ZWN0b3IgZm9yIGZ1bmN0aW9uIGRvY3VtZW50YXRpb24uCisgICAqCisgICAqICBJbiBzb21lIHRlcm1pbm9sb2d5IGEgJXZlY3RvciBjYW4gYmUgZGVzY3JpYmVkIGFzIGEgZHluYW1pYworICAgKiAgQy1zdHlsZSBhcnJheSwgaXQgb2ZmZXJzIGZhc3QgYW5kIGVmZmljaWVudCBhY2Nlc3MgdG8gaW5kaXZpZHVhbAorICAgKiAgZWxlbWVudHMgaW4gYW55IG9yZGVyIGFuZCBzYXZlcyB0aGUgdXNlciBmcm9tIHdvcnJ5aW5nIGFib3V0CisgICAqICBtZW1vcnkgYW5kIHNpemUgYWxsb2NhdGlvbi4gIFN1YnNjcmlwdGluZyAoIEBjIFtdICkgYWNjZXNzIGlzCisgICAqICBhbHNvIHByb3ZpZGVkIGFzIHdpdGggQy1zdHlsZSBhcnJheXMuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgIGNsYXNzIHZlY3Rvcjxib29sLCBfQWxsb2M+IDogcHJvdGVjdGVkIF9CdmVjdG9yX2Jhc2U8X0FsbG9jPgorICB7CisgICAgdHlwZWRlZiBfQnZlY3Rvcl9iYXNlPF9BbGxvYz4JCQkgX0Jhc2U7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdGVtcGxhdGU8dHlwZW5hbWU+IGZyaWVuZCBzdHJ1Y3QgaGFzaDsKKyNlbmRpZgorCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiBfQml0X3JlZmVyZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiBfQml0X3JlZmVyZW5jZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgY29uc3QgYm9vbCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIF9CaXRfaXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgX0JpdF9jb25zdF9pdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgIAkJIGFsbG9jYXRvcl90eXBlOworCisgICAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgeyByZXR1cm4gX0Jhc2U6OmdldF9hbGxvY2F0b3IoKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICB1c2luZyBfQmFzZTo6X01fYWxsb2NhdGU7CisgICAgdXNpbmcgX0Jhc2U6Ol9NX2RlYWxsb2NhdGU7CisgICAgdXNpbmcgX0Jhc2U6Ol9TX253b3JkOworICAgIHVzaW5nIF9CYXNlOjpfTV9nZXRfQml0X2FsbG9jYXRvcjsKKworICBwdWJsaWM6CisgICAgdmVjdG9yKCkKKyAgICA6IF9CYXNlKCkgeyB9CisKKyAgICBleHBsaWNpdAorICAgIHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX0Jhc2UoX19hKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBleHBsaWNpdAorICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IHZlY3RvcihfX24sIGZhbHNlLCBfX2EpCisgICAgeyB9CisKKyAgICB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgYm9vbCYgX192YWx1ZSwgCisJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfQmFzZShfX2EpCisgICAgeworICAgICAgX01faW5pdGlhbGl6ZShfX24pOworICAgICAgc3RkOjpmaWxsKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fcCwgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSwgCisJCV9fdmFsdWUgPyB+MCA6IDApOworICAgIH0KKyNlbHNlCisgICAgZXhwbGljaXQKKyAgICB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgYm9vbCYgX192YWx1ZSA9IGJvb2woKSwgCisJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfQmFzZShfX2EpCisgICAgeworICAgICAgX01faW5pdGlhbGl6ZShfX24pOworICAgICAgc3RkOjpmaWxsKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fcCwgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSwgCisJCV9fdmFsdWUgPyB+MCA6IDApOworICAgIH0KKyNlbmRpZgorCisgICAgdmVjdG9yKGNvbnN0IHZlY3RvciYgX194KQorICAgIDogX0Jhc2UoX194Ll9NX2dldF9CaXRfYWxsb2NhdG9yKCkpCisgICAgeworICAgICAgX01faW5pdGlhbGl6ZShfX3guc2l6ZSgpKTsKKyAgICAgIF9NX2NvcHlfYWxpZ25lZChfX3guYmVnaW4oKSwgX194LmVuZCgpLCB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdmVjdG9yKHZlY3RvciYmIF9feCkgbm9leGNlcHQKKyAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKSB7IH0KKworICAgIHZlY3Rvcihpbml0aWFsaXplcl9saXN0PGJvb2w+IF9fbCwKKwkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9CYXNlKF9fYSkKKyAgICB7CisgICAgICBfTV9pbml0aWFsaXplX3JhbmdlKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksCisJCQkgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCkpOworICAgIH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeyBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX19mYWxzZV90eXBlKCkpOyB9CisjZWxzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdmVjdG9yKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2EpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgfnZlY3RvcigpIF9HTElCQ1hYX05PRVhDRVBUIHsgfQorCisgICAgdmVjdG9yJgorICAgIG9wZXJhdG9yPShjb25zdCB2ZWN0b3ImIF9feCkKKyAgICB7CisgICAgICBpZiAoJl9feCA9PSB0aGlzKQorCXJldHVybiAqdGhpczsKKyAgICAgIGlmIChfX3guc2l6ZSgpID4gY2FwYWNpdHkoKSkKKwl7CisJICB0aGlzLT5fTV9kZWFsbG9jYXRlKCk7CisJICBfTV9pbml0aWFsaXplKF9feC5zaXplKCkpOworCX0KKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX01fY29weV9hbGlnbmVkKF9feC5iZWdpbigpLCBfX3guZW5kKCksCisJCQkJCQliZWdpbigpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdmVjdG9yJgorICAgIG9wZXJhdG9yPSh2ZWN0b3ImJiBfX3gpCisgICAgeworICAgICAgLy8gTkI6IERSIDEyMDQuCisgICAgICAvLyBOQjogRFIgNjc1LgorICAgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIHRoaXMtPnN3YXAoX194KTsgCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdmVjdG9yJgorICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PGJvb2w+IF9fbCkKKyAgICB7CisgICAgICB0aGlzLT5hc3NpZ24gKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gYXNzaWduKCksIGEgZ2VuZXJhbGl6ZWQgYXNzaWdubWVudCBtZW1iZXIgZnVuY3Rpb24uICBUd28KKyAgICAvLyB2ZXJzaW9uczogb25lIHRoYXQgdGFrZXMgYSBjb3VudCwgYW5kIG9uZSB0aGF0IHRha2VzIGEgcmFuZ2UuCisgICAgLy8gVGhlIHJhbmdlIHZlcnNpb24gaXMgYSBtZW1iZXIgdGVtcGxhdGUsIHNvIHdlIGRpc3BhdGNoIG9uIHdoZXRoZXIKKyAgICAvLyBvciBub3QgdGhlIHR5cGUgaXMgYW4gaW50ZWdlci4KKyAgICB2b2lkCisgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IGJvb2wmIF9feCkKKyAgICB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX194KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fZmFsc2VfdHlwZSgpKTsgfQorI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICAgICAgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdm9pZAorICAgIGFzc2lnbihpbml0aWFsaXplcl9saXN0PGJvb2w+IF9fbCkKKyAgICB7IHRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICBpdGVyYXRvcgorICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OyB9CisKKyAgICBjb25zdF9pdGVyYXRvcgorICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OyB9CisKKyAgICBpdGVyYXRvcgorICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7IH0KKworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsgfQorCisgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgIHJiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBjb25zdF9pdGVyYXRvcgorICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9zdGFydDsgfQorCisgICAgY29uc3RfaXRlcmF0b3IKKyAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsgfQorCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgc2l6ZV90eXBlCisgICAgc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gc2l6ZV90eXBlKGVuZCgpIC0gYmVnaW4oKSk7IH0KKworICAgIHNpemVfdHlwZQorICAgIG1heF9zaXplKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19pc2l6ZSA9CisJX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGRpZmZlcmVuY2VfdHlwZT46Ol9fbWF4CisJLSBpbnQoX1Nfd29yZF9iaXQpICsgMTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2FzaXplID0gX01fZ2V0X0JpdF9hbGxvY2F0b3IoKS5tYXhfc2l6ZSgpOworICAgICAgcmV0dXJuIChfX2FzaXplIDw9IF9faXNpemUgLyBpbnQoX1Nfd29yZF9iaXQpCisJICAgICAgPyBfX2FzaXplICogaW50KF9TX3dvcmRfYml0KSA6IF9faXNpemUpOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIGNhcGFjaXR5KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBzaXplX3R5cGUoY29uc3RfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSwgMCkKKwkJICAgICAgIC0gYmVnaW4oKSk7IH0KKworICAgIGJvb2wKKyAgICBlbXB0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQorCisgICAgcmVmZXJlbmNlCisgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIHJldHVybiAqaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9wCisJCSAgICAgICArIF9fbiAvIGludChfU193b3JkX2JpdCksIF9fbiAlIGludChfU193b3JkX2JpdCkpOworICAgIH0KKworICAgIGNvbnN0X3JlZmVyZW5jZQorICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gKmNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fcAorCQkJICAgICArIF9fbiAvIGludChfU193b3JkX2JpdCksIF9fbiAlIGludChfU193b3JkX2JpdCkpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgdm9pZAorICAgIF9NX3JhbmdlX2NoZWNrKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgaWYgKF9fbiA+PSB0aGlzLT5zaXplKCkpCisgICAgICAgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigidmVjdG9yPGJvb2w+OjpfTV9yYW5nZV9jaGVjayIpKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHJlZmVyZW5jZQorICAgIGF0KHNpemVfdHlwZSBfX24pCisgICAgeyBfTV9yYW5nZV9jaGVjayhfX24pOyByZXR1cm4gKCp0aGlzKVtfX25dOyB9CisKKyAgICBjb25zdF9yZWZlcmVuY2UKKyAgICBhdChzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsgX01fcmFuZ2VfY2hlY2soX19uKTsgcmV0dXJuICgqdGhpcylbX19uXTsgfQorCisgICAgdm9pZAorICAgIHJlc2VydmUoc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBpZiAoX19uID4gbWF4X3NpemUoKSkKKwlfX3Rocm93X2xlbmd0aF9lcnJvcihfX04oInZlY3Rvcjo6cmVzZXJ2ZSIpKTsKKyAgICAgIGlmIChjYXBhY2l0eSgpIDwgX19uKQorCV9NX3JlYWxsb2NhdGUoX19uKTsKKyAgICB9CisKKyAgICByZWZlcmVuY2UKKyAgICBmcm9udCgpCisgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KKworICAgIGNvbnN0X3JlZmVyZW5jZQorICAgIGZyb250KCkgY29uc3QKKyAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorCisgICAgcmVmZXJlbmNlCisgICAgYmFjaygpCisgICAgeyByZXR1cm4gKihlbmQoKSAtIDEpOyB9CisKKyAgICBjb25zdF9yZWZlcmVuY2UKKyAgICBiYWNrKCkgY29uc3QKKyAgICB7IHJldHVybiAqKGVuZCgpIC0gMSk7IH0KKworICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAvLyBEUiA0NjQuIFN1Z2dlc3Rpb24gZm9yIG5ldyBtZW1iZXIgZnVuY3Rpb25zIGluIHN0YW5kYXJkIGNvbnRhaW5lcnMuCisgICAgLy8gTi5CLiBEUiA0NjQgc2F5cyBub3RoaW5nIGFib3V0IHZlY3Rvcjxib29sPiBidXQgd2UgbmVlZCBzb21ldGhpbmcKKyAgICAvLyBoZXJlIGR1ZSB0byB0aGUgd2F5IHdlIGFyZSBpbXBsZW1lbnRpbmcgRFIgNDY0IGluIHRoZSBkZWJ1Zy1tb2RlCisgICAgLy8gdmVjdG9yIGNsYXNzLgorICAgIHZvaWQKKyAgICBkYXRhKCkgX0dMSUJDWFhfTk9FWENFUFQgeyB9CisKKyAgICB2b2lkCisgICAgcHVzaF9iYWNrKGJvb2wgX194KQorICAgIHsKKyAgICAgIGlmICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9wICE9IHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UpCisgICAgICAgICp0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCsrID0gX194OworICAgICAgZWxzZQorICAgICAgICBfTV9pbnNlcnRfYXV4KGVuZCgpLCBfX3gpOworICAgIH0KKworICAgIHZvaWQKKyAgICBzd2FwKHZlY3RvciYgX194KQorICAgIHsKKyAgICAgIHN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCBfX3guX01faW1wbC5fTV9zdGFydCk7CisgICAgICBzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9maW5pc2gsIF9feC5fTV9pbXBsLl9NX2ZpbmlzaCk7CisgICAgICBzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSwgCisJCV9feC5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlKTsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDMxLiBTd2FwcGluZyBjb250YWluZXJzIHdpdGggdW5lcXVhbCBhbGxvY2F0b3JzLgorICAgICAgc3RkOjpfX2FsbG9jX3N3YXA8dHlwZW5hbWUgX0Jhc2U6Ol9CaXRfYWxsb2NfdHlwZT46OgorCV9TX2RvX2l0KF9NX2dldF9CaXRfYWxsb2NhdG9yKCksIF9feC5fTV9nZXRfQml0X2FsbG9jYXRvcigpKTsKKyAgICB9CisKKyAgICAvLyBbMjMuMi41XS8xLCB0aGlyZC10by1sYXN0IGVudHJ5IGluIHN5bm9wc2lzIGxpc3RpbmcKKyAgICBzdGF0aWMgdm9pZAorICAgIHN3YXAocmVmZXJlbmNlIF9feCwgcmVmZXJlbmNlIF9feSkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBib29sIF9fdG1wID0gX194OworICAgICAgX194ID0gX195OworICAgICAgX195ID0gX190bXA7CisgICAgfQorCisgICAgaXRlcmF0b3IKKyAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgYm9vbCYgX194ID0gYm9vbCgpKQorICAgIHsKKyAgICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX3Bvc2l0aW9uIC0gYmVnaW4oKTsKKyAgICAgIGlmICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9wICE9IHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UKKwkgICYmIF9fcG9zaXRpb24gPT0gZW5kKCkpCisgICAgICAgICp0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCsrID0gX194OworICAgICAgZWxzZQorICAgICAgICBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24sIF9feCk7CisgICAgICByZXR1cm4gYmVnaW4oKSArIF9fbjsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sCisJICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9NX2luc2VydF9kaXNwYXRjaChfX3Bvc2l0aW9uLCBfX2ZpcnN0LCBfX2xhc3QsIF9fZmFsc2VfdHlwZSgpKTsgfQorI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLAorCSAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCV9NX2luc2VydF9kaXNwYXRjaChfX3Bvc2l0aW9uLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgdm9pZAorICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCBib29sJiBfX3gpCisgICAgeyBfTV9maWxsX2luc2VydChfX3Bvc2l0aW9uLCBfX24sIF9feCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB2b2lkIGluc2VydChpdGVyYXRvciBfX3AsIGluaXRpYWxpemVyX2xpc3Q8Ym9vbD4gX19sKQorICAgIHsgdGhpcy0+aW5zZXJ0KF9fcCwgX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgdm9pZAorICAgIHBvcF9iYWNrKCkKKyAgICB7IC0tdGhpcy0+X01faW1wbC5fTV9maW5pc2g7IH0KKworICAgIGl0ZXJhdG9yCisgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICB7CisgICAgICBpZiAoX19wb3NpdGlvbiArIDEgIT0gZW5kKCkpCisgICAgICAgIHN0ZDo6Y29weShfX3Bvc2l0aW9uICsgMSwgZW5kKCksIF9fcG9zaXRpb24pOworICAgICAgLS10aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKyAgICAgIHJldHVybiBfX3Bvc2l0aW9uOworICAgIH0KKworICAgIGl0ZXJhdG9yCisgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwlfTV9lcmFzZV9hdF9lbmQoc3RkOjpjb3B5KF9fbGFzdCwgZW5kKCksIF9fZmlyc3QpKTsKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAgIHZvaWQKKyAgICByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGJvb2wgX194ID0gYm9vbCgpKQorICAgIHsKKyAgICAgIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKQorICAgICAgICBfTV9lcmFzZV9hdF9lbmQoYmVnaW4oKSArIGRpZmZlcmVuY2VfdHlwZShfX25ld19zaXplKSk7CisgICAgICBlbHNlCisgICAgICAgIGluc2VydChlbmQoKSwgX19uZXdfc2l6ZSAtIHNpemUoKSwgX194KTsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdm9pZAorICAgIHNocmlua190b19maXQoKQorICAgIHsgX01fc2hyaW5rX3RvX2ZpdCgpOyB9CisjZW5kaWYKKworICAgIHZvaWQKKyAgICBmbGlwKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBmb3IgKF9CaXRfdHlwZSAqIF9fcCA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fcDsKKwkgICBfX3AgIT0gdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZTsgKytfX3ApCisgICAgICAgICpfX3AgPSB+Kl9fcDsKKyAgICB9CisKKyAgICB2b2lkCisgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgX01fZXJhc2VfYXRfZW5kKGJlZ2luKCkpOyB9CisKKyAgIAorICBwcm90ZWN0ZWQ6CisgICAgLy8gUHJlY29uZGl0aW9uOiBfX2ZpcnN0Ll9NX29mZnNldCA9PSAwICYmIF9fcmVzdWx0Ll9NX29mZnNldCA9PSAwLgorICAgIGl0ZXJhdG9yCisgICAgX01fY29weV9hbGlnbmVkKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCwKKwkJICAgIGl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIF9CaXRfdHlwZSogX19xID0gc3RkOjpjb3B5KF9fZmlyc3QuX01fcCwgX19sYXN0Ll9NX3AsIF9fcmVzdWx0Ll9NX3ApOworICAgICAgcmV0dXJuIHN0ZDo6Y29weShjb25zdF9pdGVyYXRvcihfX2xhc3QuX01fcCwgMCksIF9fbGFzdCwKKwkJICAgICAgIGl0ZXJhdG9yKF9fcSwgMCkpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfTV9pbml0aWFsaXplKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX0JpdF90eXBlKiBfX3EgPSB0aGlzLT5fTV9hbGxvY2F0ZShfX24pOworICAgICAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IF9fcSArIF9TX253b3JkKF9fbik7CisgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gaXRlcmF0b3IoX19xLCAwKTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gdGhpcy0+X01faW1wbC5fTV9zdGFydCArIGRpZmZlcmVuY2VfdHlwZShfX24pOworICAgIH0KKworICAgIHZvaWQKKyAgICBfTV9yZWFsbG9jYXRlKHNpemVfdHlwZSBfX24pOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIGJvb2wKKyAgICBfTV9zaHJpbmtfdG9fZml0KCk7CisjZW5kaWYKKworICAgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorCisgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgIC8vIDQzOC4gQW1iaWd1aXR5IGluIHRoZSAiZG8gdGhlIHJpZ2h0IHRoaW5nIiBjbGF1c2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsIF9fdHJ1ZV90eXBlKQorICAgICAgeworCV9NX2luaXRpYWxpemUoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX24pKTsKKwlzdGQ6OmZpbGwodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9wLCAKKwkJICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlLCBfX3ggPyB+MCA6IDApOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkIAorICAgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgICAgIF9fZmFsc2VfdHlwZSkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIAorCQkJICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZV9yYW5nZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCWZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgcHVzaF9iYWNrKCpfX2ZpcnN0KTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplX3JhbmdlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCQkgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fbiA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKwlfTV9pbml0aWFsaXplKF9fbik7CisJc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisgICAgICB9CisKKyAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlZ2VyPgorICAgICAgdm9pZAorICAgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIF9fdHJ1ZV90eXBlKQorICAgICAgeyBfTV9maWxsX2Fzc2lnbihfX24sIF9fdmFsKTsgfQorCisgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJIF9fZmFsc2VfdHlwZSkKKyAgICAgIHsgX01fYXNzaWduX2F1eChfX2ZpcnN0LCBfX2xhc3QsIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7IH0KKworICAgIHZvaWQKKyAgICBfTV9maWxsX2Fzc2lnbihzaXplX3QgX19uLCBib29sIF9feCkKKyAgICB7CisgICAgICBpZiAoX19uID4gc2l6ZSgpKQorCXsKKwkgIHN0ZDo6ZmlsbCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX3AsIAorCQkgICAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSwgX194ID8gfjAgOiAwKTsKKwkgIGluc2VydChlbmQoKSwgX19uIC0gc2l6ZSgpLCBfX3gpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfTV9lcmFzZV9hdF9lbmQoYmVnaW4oKSArIF9fbik7CisJICBzdGQ6OmZpbGwodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9wLCAKKwkJICAgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UsIF9feCA/IH4wIDogMCk7CisJfQorICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwlpdGVyYXRvciBfX2N1ciA9IGJlZ2luKCk7CisJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fY3VyICE9IGVuZCgpOyArK19fY3VyLCArK19fZmlyc3QpCisJICAqX19jdXIgPSAqX19maXJzdDsKKwlpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJICBfTV9lcmFzZV9hdF9lbmQoX19jdXIpOworCWVsc2UKKwkgIGluc2VydChlbmQoKSwgX19maXJzdCwgX19sYXN0KTsKKyAgICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwljb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisJaWYgKF9fbGVuIDwgc2l6ZSgpKQorCSAgX01fZXJhc2VfYXRfZW5kKHN0ZDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCkpKTsKKwllbHNlCisJICB7CisJICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OworCSAgICBzdGQ6OmFkdmFuY2UoX19taWQsIHNpemUoKSk7CisJICAgIHN0ZDo6Y29weShfX2ZpcnN0LCBfX21pZCwgYmVnaW4oKSk7CisJICAgIGluc2VydChlbmQoKSwgX19taWQsIF9fbGFzdCk7CisJICB9CisgICAgICB9CisKKyAgICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKworICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisgICAgICB2b2lkCisgICAgICBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LAorCQkJIF9fdHJ1ZV90eXBlKQorICAgICAgeyBfTV9maWxsX2luc2VydChfX3BvcywgX19uLCBfX3gpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywKKwkJCSBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgX19mYWxzZV90eXBlKQorICAgICAgeyBfTV9pbnNlcnRfcmFuZ2UoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwKKwkJCXN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7IH0KKworICAgIHZvaWQKKyAgICBfTV9maWxsX2luc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBib29sIF9feCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2luc2VydF9yYW5nZShpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgCisJCSAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgICB7CisJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJICB7CisJICAgIF9fcG9zID0gaW5zZXJ0KF9fcG9zLCAqX19maXJzdCk7CisJICAgICsrX19wb3M7CisJICB9CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX01faW5zZXJ0X3JhbmdlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgCisJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKTsKKworICAgIHZvaWQKKyAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGJvb2wgX194KTsKKworICAgIHNpemVfdHlwZQorICAgIF9NX2NoZWNrX2xlbihzaXplX3R5cGUgX19uLCBjb25zdCBjaGFyKiBfX3MpIGNvbnN0CisgICAgeworICAgICAgaWYgKG1heF9zaXplKCkgLSBzaXplKCkgPCBfX24pCisJX190aHJvd19sZW5ndGhfZXJyb3IoX19OKF9fcykpOworCisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzaXplKCkgKyBzdGQ6Om1heChzaXplKCksIF9fbik7CisgICAgICByZXR1cm4gKF9fbGVuIDwgc2l6ZSgpIHx8IF9fbGVuID4gbWF4X3NpemUoKSkgPyBtYXhfc2l6ZSgpIDogX19sZW47CisgICAgfQorCisgICAgdm9pZAorICAgIF9NX2VyYXNlX2F0X2VuZChpdGVyYXRvciBfX3BvcykKKyAgICB7IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19wb3M7IH0KKyAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjaW5jbHVkZSA8Yml0cy9mdW5jdGlvbmFsX2hhc2guaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIERSIDExODIuCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHZlY3Rvcjxib29sPi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBoYXNoPF9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8Ym9vbCwgX0FsbG9jPj4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8Ym9vbCwgX0FsbG9jPj4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0dMSUJDWFhfU1REX0M6OnZlY3Rvcjxib29sLCBfQWxsb2M+JikgY29uc3Qgbm9leGNlcHQ7CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Ly8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2NvbnN0cnVjdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9jb25zdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTg2M2U2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9jb25zdHJ1Y3QuaApAQCAtMCwwICsxLDE1OCBAQAorLy8gbm9uc3RhbmRhcmQgY29uc3RydWN0IGFuZCBkZXN0cm95IGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfY29uc3RydWN0LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttZW1vcnl9CisgKi8KKworI2lmbmRlZiBfU1RMX0NPTlNUUlVDVF9ICisjZGVmaW5lIF9TVExfQ09OU1RSVUNUX0ggMQorCisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGJpdHMvbW92ZS5oPgorI2luY2x1ZGUgPGV4dC9hbGxvY190cmFpdHMuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGFuIG9iamVjdCBpbiBleGlzdGluZyBtZW1vcnkgYnkgaW52b2tpbmcgYW4gYWxsb2NhdGVkCisgICAqIG9iamVjdCdzIGNvbnN0cnVjdG9yIHdpdGggYW4gaW5pdGlhbGl6ZXIuCisgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9Db25zdHJ1Y3QoX1QxKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgIHsgOjpuZXcoc3RhdGljX2Nhc3Q8dm9pZCo+KF9fcCkpIF9UMShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9Db25zdHJ1Y3QoX1QxKiBfX3AsIGNvbnN0IF9UMiYgX192YWx1ZSkKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MDIuIHdyb25nIG5ldyBleHByZXNzaW9uIGluIFtzb21lX11hbGxvY2F0b3I6OmNvbnN0cnVjdAorICAgICAgOjpuZXcoc3RhdGljX2Nhc3Q8dm9pZCo+KF9fcCkpIF9UMShfX3ZhbHVlKTsKKyAgICB9CisjZW5kaWYKKworICAvKioKKyAgICogRGVzdHJveSB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgYSBwb2ludGVyIHR5cGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfRGVzdHJveShfVHAqIF9fcG9pbnRlcikKKyAgICB7IF9fcG9pbnRlci0+fl9UcCgpOyB9CisKKyAgdGVtcGxhdGU8Ym9vbD4KKyAgICBzdHJ1Y3QgX0Rlc3Ryb3lfYXV4CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX19kZXN0cm95KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisJeworCSAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJICAgIHN0ZDo6X0Rlc3Ryb3koc3RkOjpfX2FkZHJlc3NvZigqX19maXJzdCkpOworCX0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX0Rlc3Ryb3lfYXV4PHRydWU+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX19kZXN0cm95KF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3IpIHsgfQorICAgIH07CisKKyAgLyoqCisgICAqIERlc3Ryb3kgYSByYW5nZSBvZiBvYmplY3RzLiAgSWYgdGhlIHZhbHVlX3R5cGUgb2YgdGhlIG9iamVjdCBoYXMKKyAgICogYSB0cml2aWFsIGRlc3RydWN0b3IsIHRoZSBjb21waWxlciBzaG91bGQgb3B0aW1pemUgYWxsIG9mIHRoaXMKKyAgICogYXdheSwgb3RoZXJ3aXNlIHRoZSBvYmplY3RzJyBkZXN0cnVjdG9ycyBtdXN0IGJlIGludm9rZWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgX0Rlc3Ryb3koX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICBfVmFsdWVfdHlwZTsKKyAgICAgIHN0ZDo6X0Rlc3Ryb3lfYXV4PF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihfVmFsdWVfdHlwZSk+OjoKKwlfX2Rlc3Ryb3koX19maXJzdCwgX19sYXN0KTsKKyAgICB9CisKKyAgLyoqCisgICAqIERlc3Ryb3kgYSByYW5nZSBvZiBvYmplY3RzIHVzaW5nIHRoZSBzdXBwbGllZCBhbGxvY2F0b3IuICBGb3IKKyAgICogbm9uZGVmYXVsdCBhbGxvY2F0b3JzIHdlIGRvIG5vdCBvcHRpbWl6ZSBhd2F5IGludm9jYXRpb24gb2YgCisgICAqIGRlc3Ryb3koKSBldmVuIGlmIF9UcCBoYXMgYSB0cml2aWFsIGRlc3RydWN0b3IuCisgICAqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgdm9pZAorICAgIF9EZXN0cm95KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICBfQWxsb2NhdG9yJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2FsbG9jX3RyYWl0czxfQWxsb2NhdG9yPiBfX3RyYWl0czsKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCV9fdHJhaXRzOjpkZXN0cm95KF9fYWxsb2MsIHN0ZDo6X19hZGRyZXNzb2YoKl9fZmlyc3QpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX0Rlc3Ryb3koX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIGFsbG9jYXRvcjxfVHA+JikKKyAgICB7CisgICAgICBfRGVzdHJveShfX2ZpcnN0LCBfX2xhc3QpOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9TVExfQ09OU1RSVUNUX0ggKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9kZXF1ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9kZXF1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwN2JjNGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2RlcXVlLmgKQEAgLTAsMCArMSwyMDE5IEBACisvLyBEZXF1ZSBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX2RlcXVlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtkZXF1ZX0KKyAqLworCisjaWZuZGVmIF9TVExfREVRVUVfSAorI2RlZmluZSBfU1RMX0RFUVVFX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfZnVuY3MuaD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICAvKioKKyAgICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGNvbnRyb2xzIHRoZSBzaXplIG9mIG1lbW9yeSBub2Rlcy4KKyAgICogIEBwYXJhbSAgX19zaXplICBUaGUgc2l6ZSBvZiBhbiBlbGVtZW50LgorICAgKiAgQHJldHVybiAgIFRoZSBudW1iZXIgKG5vdCBieXRlIHNpemUpIG9mIGVsZW1lbnRzIHBlciBub2RlLgorICAgKgorICAgKiAgVGhpcyBmdW5jdGlvbiBzdGFydGVkIG9mZiBhcyBhIGNvbXBpbGVyIGtsdWRnZSBmcm9tIFNHSSwgYnV0CisgICAqICBzZWVtcyB0byBiZSBhIHVzZWZ1bCB3cmFwcGVyIGFyb3VuZCBhIHJlcGVhdGVkIGNvbnN0YW50CisgICAqICBleHByZXNzaW9uLiAgVGhlIEBiIDUxMiBpcyB0dW5hYmxlIChhbmQgbm8gb3RoZXIgY29kZSBuZWVkcyB0bworICAgKiAgY2hhbmdlKSwgYnV0IG5vIGludmVzdGlnYXRpb24gaGFzIGJlZW4gZG9uZSBzaW5jZSBpbmhlcml0aW5nIHRoZQorICAgKiAgU0dJIGNvZGUuICBUb3VjaCBfR0xJQkNYWF9ERVFVRV9CVUZfU0laRSBvbmx5IGlmIHlvdSBrbm93IHdoYXQKKyAgICogIHlvdSBhcmUgZG9pbmcsIGhvd2V2ZXI6IGNoYW5naW5nIGl0IGJyZWFrcyB0aGUgYmluYXJ5CisgICAqICBjb21wYXRpYmlsaXR5ISEKKyAgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERVFVRV9CVUZfU0laRQorI2RlZmluZSBfR0xJQkNYWF9ERVFVRV9CVUZfU0laRSA1MTIKKyNlbmRpZgorCisgIGlubGluZSBzaXplX3QKKyAgX19kZXF1ZV9idWZfc2l6ZShzaXplX3QgX19zaXplKQorICB7IHJldHVybiAoX19zaXplIDwgX0dMSUJDWFhfREVRVUVfQlVGX1NJWkUKKwkgICAgPyBzaXplX3QoX0dMSUJDWFhfREVRVUVfQlVGX1NJWkUgLyBfX3NpemUpIDogc2l6ZV90KDEpKTsgfQorCisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBkZXF1ZTo6aXRlcmF0b3IuCisgICAqCisgICAqICBRdWl0ZSBhIGJpdCBvZiBpbnRlbGxpZ2VuY2UgaGVyZS4gIE11Y2ggb2YgdGhlIGZ1bmN0aW9uYWxpdHkgb2YKKyAgICogIGRlcXVlIGlzIGFjdHVhbGx5IHBhc3NlZCBvZmYgdG8gdGhpcyBjbGFzcy4gIEEgZGVxdWUgaG9sZHMgdHdvCisgICAqICBvZiB0aGVzZSBpbnRlcm5hbGx5LCBtYXJraW5nIGl0cyB2YWxpZCByYW5nZS4gIEFjY2VzcyB0bworICAgKiAgZWxlbWVudHMgaXMgZG9uZSBhcyBvZmZzZXRzIG9mIGVpdGhlciBvZiB0aG9zZSB0d28sIHJlbHlpbmcgb24KKyAgICogIG9wZXJhdG9yIG92ZXJsb2FkaW5nIGluIHRoaXMgY2xhc3MuCisgICAqCisgICAqICBBbGwgdGhlIGZ1bmN0aW9ucyBhcmUgb3Agb3ZlcmxvYWRzIGV4Y2VwdCBmb3IgX01fc2V0X25vZGUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZiwgdHlwZW5hbWUgX1B0cj4KKyAgICBzdHJ1Y3QgX0RlcXVlX2l0ZXJhdG9yCisgICAgeworICAgICAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4gY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHN0YXRpYyBzaXplX3QgX1NfYnVmZmVyX3NpemUoKQorICAgICAgeyByZXR1cm4gX19kZXF1ZV9idWZfc2l6ZShzaXplb2YoX1RwKSk7IH0KKworICAgICAgdHlwZWRlZiBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9QdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1JlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiogICAgICAgICAgICAgICAgICAgICAgICAgICBfTWFwX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvciAgICAgICAgICAgICAgICAgX1NlbGY7CisKKyAgICAgIF9UcCogX01fY3VyOworICAgICAgX1RwKiBfTV9maXJzdDsKKyAgICAgIF9UcCogX01fbGFzdDsKKyAgICAgIF9NYXBfcG9pbnRlciBfTV9ub2RlOworCisgICAgICBfRGVxdWVfaXRlcmF0b3IoX1RwKiBfX3gsIF9NYXBfcG9pbnRlciBfX3kpCisgICAgICA6IF9NX2N1cihfX3gpLCBfTV9maXJzdCgqX195KSwKKyAgICAgICAgX01fbGFzdCgqX195ICsgX1NfYnVmZmVyX3NpemUoKSksIF9NX25vZGUoX195KSB7IH0KKworICAgICAgX0RlcXVlX2l0ZXJhdG9yKCkKKyAgICAgIDogX01fY3VyKDApLCBfTV9maXJzdCgwKSwgX01fbGFzdCgwKSwgX01fbm9kZSgwKSB7IH0KKworICAgICAgX0RlcXVlX2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX3gpCisgICAgICA6IF9NX2N1cihfX3guX01fY3VyKSwgX01fZmlyc3QoX194Ll9NX2ZpcnN0KSwKKyAgICAgICAgX01fbGFzdChfX3guX01fbGFzdCksIF9NX25vZGUoX194Ll9NX25vZGUpIHsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiAqX01fY3VyOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VyOyB9CisKKyAgICAgIF9TZWxmJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJKytfTV9jdXI7CisJaWYgKF9NX2N1ciA9PSBfTV9sYXN0KQorCSAgeworCSAgICBfTV9zZXRfbm9kZShfTV9ub2RlICsgMSk7CisJICAgIF9NX2N1ciA9IF9NX2ZpcnN0OworCSAgfQorCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJKysqdGhpczsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIF9TZWxmJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJaWYgKF9NX2N1ciA9PSBfTV9maXJzdCkKKwkgIHsKKwkgICAgX01fc2V0X25vZGUoX01fbm9kZSAtIDEpOworCSAgICBfTV9jdXIgPSBfTV9sYXN0OworCSAgfQorCS0tX01fY3VyOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJLS0qdGhpczsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIF9TZWxmJgorICAgICAgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19uKQorICAgICAgeworCWNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX29mZnNldCA9IF9fbiArIChfTV9jdXIgLSBfTV9maXJzdCk7CisJaWYgKF9fb2Zmc2V0ID49IDAgJiYgX19vZmZzZXQgPCBkaWZmZXJlbmNlX3R5cGUoX1NfYnVmZmVyX3NpemUoKSkpCisJICBfTV9jdXIgKz0gX19uOworCWVsc2UKKwkgIHsKKwkgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fbm9kZV9vZmZzZXQgPQorCSAgICAgIF9fb2Zmc2V0ID4gMCA/IF9fb2Zmc2V0IC8gZGlmZmVyZW5jZV90eXBlKF9TX2J1ZmZlcl9zaXplKCkpCisJICAgICAgICAgICAgICAgICAgIDogLWRpZmZlcmVuY2VfdHlwZSgoLV9fb2Zmc2V0IC0gMSkKKwkJCQkJICAgICAgLyBfU19idWZmZXJfc2l6ZSgpKSAtIDE7CisJICAgIF9NX3NldF9ub2RlKF9NX25vZGUgKyBfX25vZGVfb2Zmc2V0KTsKKwkgICAgX01fY3VyID0gX01fZmlyc3QgKyAoX19vZmZzZXQgLSBfX25vZGVfb2Zmc2V0CisJCQkJICogZGlmZmVyZW5jZV90eXBlKF9TX2J1ZmZlcl9zaXplKCkpKTsKKwkgIH0KKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCXJldHVybiBfX3RtcCArPSBfX247CisgICAgICB9CisKKyAgICAgIF9TZWxmJgorICAgICAgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gKnRoaXMgKz0gLV9fbjsgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJX1NlbGYgX190bXAgPSAqdGhpczsKKwlyZXR1cm4gX190bXAgLT0gX19uOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuICooKnRoaXMgKyBfX24pOyB9CisKKyAgICAgIC8qKiAKKyAgICAgICAqICBQcmVwYXJlcyB0byB0cmF2ZXJzZSBuZXdfbm9kZS4gIFNldHMgZXZlcnl0aGluZyBleGNlcHQKKyAgICAgICAqICBfTV9jdXIsIHdoaWNoIHNob3VsZCB0aGVyZWZvcmUgYmUgc2V0IGJ5IHRoZSBjYWxsZXIKKyAgICAgICAqICBpbW1lZGlhdGVseSBhZnRlcndhcmRzLCBiYXNlZCBvbiBfTV9maXJzdCBhbmQgX01fbGFzdC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgX01fc2V0X25vZGUoX01hcF9wb2ludGVyIF9fbmV3X25vZGUpCisgICAgICB7CisJX01fbm9kZSA9IF9fbmV3X25vZGU7CisJX01fZmlyc3QgPSAqX19uZXdfbm9kZTsKKwlfTV9sYXN0ID0gX01fZmlyc3QgKyBkaWZmZXJlbmNlX3R5cGUoX1NfYnVmZmVyX3NpemUoKSk7CisgICAgICB9CisgICAgfTsKKworICAvLyBOb3RlOiB3ZSBhbHNvIHByb3ZpZGUgb3ZlcmxvYWRzIHdob3NlIG9wZXJhbmRzIGFyZSBvZiB0aGUgc2FtZSB0eXBlIGluCisgIC8vIG9yZGVyIHRvIGF2b2lkIGFtYmlndW91cyBvdmVybG9hZCByZXNvbHV0aW9uIHdoZW4gc3RkOjpyZWxfb3BzIG9wZXJhdG9ycworICAvLyBhcmUgaW4gc2NvcGUgKGZvciBhZGRpdGlvbmFsIGRldGFpbHMsIHNlZSBsaWJzdGRjKysvMzYyOCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmLCB0eXBlbmFtZSBfUHRyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX194LAorCSAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9jdXIgPT0gX195Ll9NX2N1cjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZkwsIHR5cGVuYW1lIF9QdHJMLAorCSAgIHR5cGVuYW1lIF9SZWZSLCB0eXBlbmFtZSBfUHRyUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZkwsIF9QdHJMPiYgX194LAorCSAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmUiwgX1B0clI+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2N1ciA9PSBfX3kuX01fY3VyOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmLCB0eXBlbmFtZSBfUHRyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX194LAorCSAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWZMLCB0eXBlbmFtZSBfUHRyTCwKKwkgICB0eXBlbmFtZSBfUmVmUiwgdHlwZW5hbWUgX1B0clI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZMLCBfUHRyTD4mIF9feCwKKwkgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZlIsIF9QdHJSPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWYsIHR5cGVuYW1lIF9QdHI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feCwKKwkgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX195KQorICAgIHsgcmV0dXJuIChfX3guX01fbm9kZSA9PSBfX3kuX01fbm9kZSkgPyAoX194Ll9NX2N1ciA8IF9feS5fTV9jdXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChfX3guX01fbm9kZSA8IF9feS5fTV9ub2RlKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZkwsIHR5cGVuYW1lIF9QdHJMLAorCSAgIHR5cGVuYW1lIF9SZWZSLCB0eXBlbmFtZSBfUHRyUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmTCwgX1B0ckw+JiBfX3gsCisJICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZlIsIF9QdHJSPiYgX195KQorICAgIHsgcmV0dXJuIChfX3guX01fbm9kZSA9PSBfX3kuX01fbm9kZSkgPyAoX194Ll9NX2N1ciA8IF9feS5fTV9jdXIpCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9feC5fTV9ub2RlIDwgX195Ll9NX25vZGUpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmLCB0eXBlbmFtZSBfUHRyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3gsCisJICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWZMLCB0eXBlbmFtZSBfUHRyTCwKKwkgICB0eXBlbmFtZSBfUmVmUiwgdHlwZW5hbWUgX1B0clI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZkwsIF9QdHJMPiYgX194LAorCSAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZSLCBfUHRyUj4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWYsIHR5cGVuYW1lIF9QdHI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3gsCisJICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmTCwgdHlwZW5hbWUgX1B0ckwsCisJICAgdHlwZW5hbWUgX1JlZlIsIHR5cGVuYW1lIF9QdHJSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmTCwgX1B0ckw+JiBfX3gsCisJICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZSLCBfUHRyUj4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWYsIHR5cGVuYW1lIF9QdHI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3gsCisJICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmTCwgdHlwZW5hbWUgX1B0ckwsCisJICAgdHlwZW5hbWUgX1JlZlIsIHR5cGVuYW1lIF9QdHJSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmTCwgX1B0ckw+JiBfX3gsCisJICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZSLCBfUHRyUj4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIEFjY29yZGluZyB0byB0aGUgcmVzb2x1dGlvbiBvZiBEUjE3OSBub3Qgb25seSB0aGUgdmFyaW91cyBjb21wYXJpc29uCisgIC8vIG9wZXJhdG9ycyBidXQgYWxzbyBvcGVyYXRvci0gbXVzdCBhY2NlcHQgbWl4ZWQgaXRlcmF0b3IvY29uc3RfaXRlcmF0b3IKKyAgLy8gcGFyYW1ldGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmLCB0eXBlbmFtZSBfUHRyPgorICAgIGlubGluZSB0eXBlbmFtZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgb3BlcmF0b3ItKGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3gsCisJICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feSkKKyAgICB7CisgICAgICByZXR1cm4gdHlwZW5hbWUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj46OmRpZmZlcmVuY2VfdHlwZQorCShfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPjo6X1NfYnVmZmVyX3NpemUoKSkKKwkqIChfX3guX01fbm9kZSAtIF9feS5fTV9ub2RlIC0gMSkgKyAoX194Ll9NX2N1ciAtIF9feC5fTV9maXJzdCkKKwkrIChfX3kuX01fbGFzdCAtIF9feS5fTV9jdXIpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWZMLCB0eXBlbmFtZSBfUHRyTCwKKwkgICB0eXBlbmFtZSBfUmVmUiwgdHlwZW5hbWUgX1B0clI+CisgICAgaW5saW5lIHR5cGVuYW1lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZMLCBfUHRyTD46OmRpZmZlcmVuY2VfdHlwZQorICAgIG9wZXJhdG9yLShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmTCwgX1B0ckw+JiBfX3gsCisJICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZlIsIF9QdHJSPiYgX195KQorICAgIHsKKyAgICAgIHJldHVybiB0eXBlbmFtZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmTCwgX1B0ckw+OjpkaWZmZXJlbmNlX3R5cGUKKwkoX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZkwsIF9QdHJMPjo6X1NfYnVmZmVyX3NpemUoKSkKKwkqIChfX3guX01fbm9kZSAtIF9feS5fTV9ub2RlIC0gMSkgKyAoX194Ll9NX2N1ciAtIF9feC5fTV9maXJzdCkKKwkrIChfX3kuX01fbGFzdCAtIF9feS5fTV9jdXIpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWYsIHR5cGVuYW1lIF9QdHI+CisgICAgaW5saW5lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+CisgICAgb3BlcmF0b3IrKHB0cmRpZmZfdCBfX24sIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3gpCisgICAgeyByZXR1cm4gX194ICsgX19uOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBmaWxsKGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+JiwKKwkgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4mLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4KKyAgICBjb3B5KF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+LAorCSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiwKKwkgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4KKyAgICBjb3B5KF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fZmlyc3QsCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fbGFzdCwKKwkgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gX19yZXN1bHQpCisgICAgeyByZXR1cm4gc3RkOjpjb3B5KF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+KF9fZmlyc3QpLAorCQkgICAgICAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4oX19sYXN0KSwKKwkJICAgICAgIF9fcmVzdWx0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPgorICAgIGNvcHlfYmFja3dhcmQoX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4sCisJCSAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4sCisJCSAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4KKyAgICBjb3B5X2JhY2t3YXJkKF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fZmlyc3QsCisJCSAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gX19sYXN0LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fcmVzdWx0KQorICAgIHsgcmV0dXJuIHN0ZDo6Y29weV9iYWNrd2FyZChfRGVxdWVfaXRlcmF0b3I8X1RwLAorCQkJCWNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+KF9fZmlyc3QpLAorCQkJCV9EZXF1ZV9pdGVyYXRvcjxfVHAsCisJCQkJY29uc3QgX1RwJiwgY29uc3QgX1RwKj4oX19sYXN0KSwKKwkJCQlfX3Jlc3VsdCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgbW92ZShfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiwKKwkgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4sCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+KTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgbW92ZShfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX2ZpcnN0LAorCSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX2xhc3QsCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fcmVzdWx0KQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPihfX2ZpcnN0KSwKKwkJICAgICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+KF9fbGFzdCksCisJCSAgICAgICBfX3Jlc3VsdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4KKyAgICBtb3ZlX2JhY2t3YXJkKF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+KTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgbW92ZV9iYWNrd2FyZChfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX2ZpcnN0LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fbGFzdCwKKwkJICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX3Jlc3VsdCkKKyAgICB7IHJldHVybiBzdGQ6Om1vdmVfYmFja3dhcmQoX0RlcXVlX2l0ZXJhdG9yPF9UcCwKKwkJCQljb25zdCBfVHAmLCBjb25zdCBfVHAqPihfX2ZpcnN0KSwKKwkJCQlfRGVxdWVfaXRlcmF0b3I8X1RwLAorCQkJCWNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+KF9fbGFzdCksCisJCQkJX19yZXN1bHQpOyB9CisjZW5kaWYKKworICAvKioKKyAgICogIERlcXVlIGJhc2UgY2xhc3MuICBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSB1bmlmaWVkIGZhY2UgZm9yICVkZXF1ZSdzCisgICAqICBhbGxvY2F0aW9uLiAgVGhpcyBjbGFzcydzIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIGFsbG9jYXRlIGFuZAorICAgKiAgZGVhbGxvY2F0ZSAoYnV0IGRvIG5vdCBpbml0aWFsaXplKSBzdG9yYWdlLiAgVGhpcyBtYWtlcyAlZXhjZXB0aW9uCisgICAqICBzYWZldHkgZWFzaWVyLgorICAgKgorICAgKiAgTm90aGluZyBpbiB0aGlzIGNsYXNzIGV2ZXIgY29uc3RydWN0cyBvciBkZXN0cm95cyBhbiBhY3R1YWwgVHAgZWxlbWVudC4KKyAgICogIChEZXF1ZSBoYW5kbGVzIHRoYXQgaXRzZWxmLikgIE9ubHkvQWxsIG1lbW9yeSBtYW5hZ2VtZW50IGlzIHBlcmZvcm1lZAorICAgKiAgaGVyZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgX0RlcXVlX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUoX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsgfQorCisgICAgICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+ICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBjb25zdF9pdGVyYXRvcjsKKworICAgICAgX0RlcXVlX2Jhc2UoKQorICAgICAgOiBfTV9pbXBsKCkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9tYXAoMCk7IH0KKworICAgICAgX0RlcXVlX2Jhc2Uoc2l6ZV90IF9fbnVtX2VsZW1lbnRzKQorICAgICAgOiBfTV9pbXBsKCkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9tYXAoX19udW1fZWxlbWVudHMpOyB9CisKKyAgICAgIF9EZXF1ZV9iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EsIHNpemVfdCBfX251bV9lbGVtZW50cykKKyAgICAgIDogX01faW1wbChfX2EpCisgICAgICB7IF9NX2luaXRpYWxpemVfbWFwKF9fbnVtX2VsZW1lbnRzKTsgfQorCisgICAgICBfRGVxdWVfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfTV9pbXBsKF9fYSkKKyAgICAgIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgX0RlcXVlX2Jhc2UoX0RlcXVlX2Jhc2UmJiBfX3gpCisgICAgICA6IF9NX2ltcGwoc3RkOjptb3ZlKF9feC5fTV9nZXRfVHBfYWxsb2NhdG9yKCkpKQorICAgICAgeworCV9NX2luaXRpYWxpemVfbWFwKDApOworCWlmIChfX3guX01faW1wbC5fTV9tYXApCisJICB7CisJICAgIHN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCBfX3guX01faW1wbC5fTV9zdGFydCk7CisJICAgIHN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwgX194Ll9NX2ltcGwuX01fZmluaXNoKTsKKwkgICAgc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fbWFwLCBfX3guX01faW1wbC5fTV9tYXApOworCSAgICBzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9tYXBfc2l6ZSwgX194Ll9NX2ltcGwuX01fbWFwX3NpemUpOworCSAgfQorICAgICAgfQorI2VuZGlmCisKKyAgICAgIH5fRGVxdWVfYmFzZSgpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgLy9UaGlzIHN0cnVjdCBlbmNhcHN1bGF0ZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdGQ6OmRlcXVlCisgICAgICAvL3N0YW5kYXJkIGNvbnRhaW5lciBhbmQgYXQgdGhlIHNhbWUgdGltZSBtYWtlcyB1c2Ugb2YgdGhlIEVCTworICAgICAgLy9mb3IgZW1wdHkgYWxsb2NhdG9ycy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1RwKj46Om90aGVyIF9NYXBfYWxsb2NfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfVHA+OjpvdGhlciAgX1RwX2FsbG9jX3R5cGU7CisKKyAgICAgIHN0cnVjdCBfRGVxdWVfaW1wbAorICAgICAgOiBwdWJsaWMgX1RwX2FsbG9jX3R5cGUKKyAgICAgIHsKKwlfVHAqKiBfTV9tYXA7CisJc2l6ZV90IF9NX21hcF9zaXplOworCWl0ZXJhdG9yIF9NX3N0YXJ0OworCWl0ZXJhdG9yIF9NX2ZpbmlzaDsKKworCV9EZXF1ZV9pbXBsKCkKKwk6IF9UcF9hbGxvY190eXBlKCksIF9NX21hcCgwKSwgX01fbWFwX3NpemUoMCksCisJICBfTV9zdGFydCgpLCBfTV9maW5pc2goKQorCXsgfQorCisJX0RlcXVlX2ltcGwoY29uc3QgX1RwX2FsbG9jX3R5cGUmIF9fYSkKKwk6IF9UcF9hbGxvY190eXBlKF9fYSksIF9NX21hcCgwKSwgX01fbWFwX3NpemUoMCksCisJICBfTV9zdGFydCgpLCBfTV9maW5pc2goKQorCXsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCV9EZXF1ZV9pbXBsKF9UcF9hbGxvY190eXBlJiYgX19hKQorCTogX1RwX2FsbG9jX3R5cGUoc3RkOjptb3ZlKF9fYSkpLCBfTV9tYXAoMCksIF9NX21hcF9zaXplKDApLAorCSAgX01fc3RhcnQoKSwgX01fZmluaXNoKCkKKwl7IH0KKyNlbmRpZgorICAgICAgfTsKKworICAgICAgX1RwX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxfVHBfYWxsb2NfdHlwZSo+KCZ0aGlzLT5fTV9pbXBsKTsgfQorCisgICAgICBjb25zdCBfVHBfYWxsb2NfdHlwZSYKKyAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9UcF9hbGxvY190eXBlKj4oJnRoaXMtPl9NX2ltcGwpOyB9CisKKyAgICAgIF9NYXBfYWxsb2NfdHlwZQorICAgICAgX01fZ2V0X21hcF9hbGxvY2F0b3IoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01hcF9hbGxvY190eXBlKF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgX1RwKgorICAgICAgX01fYWxsb2NhdGVfbm9kZSgpCisgICAgICB7IAorCXJldHVybiBfTV9pbXBsLl9UcF9hbGxvY190eXBlOjphbGxvY2F0ZShfX2RlcXVlX2J1Zl9zaXplKHNpemVvZihfVHApKSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZShfVHAqIF9fcCkKKyAgICAgIHsKKwlfTV9pbXBsLl9UcF9hbGxvY190eXBlOjpkZWFsbG9jYXRlKF9fcCwgX19kZXF1ZV9idWZfc2l6ZShzaXplb2YoX1RwKSkpOworICAgICAgfQorCisgICAgICBfVHAqKgorICAgICAgX01fYWxsb2NhdGVfbWFwKHNpemVfdCBfX24pCisgICAgICB7IHJldHVybiBfTV9nZXRfbWFwX2FsbG9jYXRvcigpLmFsbG9jYXRlKF9fbik7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZGVhbGxvY2F0ZV9tYXAoX1RwKiogX19wLCBzaXplX3QgX19uKQorICAgICAgeyBfTV9nZXRfbWFwX2FsbG9jYXRvcigpLmRlYWxsb2NhdGUoX19wLCBfX24pOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2b2lkIF9NX2luaXRpYWxpemVfbWFwKHNpemVfdCk7CisgICAgICB2b2lkIF9NX2NyZWF0ZV9ub2RlcyhfVHAqKiBfX25zdGFydCwgX1RwKiogX19uZmluaXNoKTsKKyAgICAgIHZvaWQgX01fZGVzdHJveV9ub2RlcyhfVHAqKiBfX25zdGFydCwgX1RwKiogX19uZmluaXNoKTsKKyAgICAgIGVudW0geyBfU19pbml0aWFsX21hcF9zaXplID0gOCB9OworCisgICAgICBfRGVxdWVfaW1wbCBfTV9pbXBsOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+OjoKKyAgICB+X0RlcXVlX2Jhc2UoKQorICAgIHsKKyAgICAgIGlmICh0aGlzLT5fTV9pbXBsLl9NX21hcCkKKwl7CisJICBfTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSwKKwkJCSAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyAxKTsKKwkgIF9NX2RlYWxsb2NhdGVfbWFwKHRoaXMtPl9NX2ltcGwuX01fbWFwLCB0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplKTsKKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIExheW91dCBzdG9yYWdlLgorICAgKiAgQHBhcmFtICBfX251bV9lbGVtZW50cyAgVGhlIGNvdW50IG9mIFQncyBmb3Igd2hpY2ggdG8gYWxsb2NhdGUgc3BhY2UKKyAgICogICAgICAgICAgICAgICAgICAgICAgICBhdCBmaXJzdC4KKyAgICogIEByZXR1cm4gICBOb3RoaW5nLgorICAgKgorICAgKiAgVGhlIGluaXRpYWwgdW5kZXJseWluZyBtZW1vcnkgbGF5b3V0IGlzIGEgYml0IGNvbXBsaWNhdGVkLi4uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX2luaXRpYWxpemVfbWFwKHNpemVfdCBfX251bV9lbGVtZW50cykKKyAgICB7CisgICAgICBjb25zdCBzaXplX3QgX19udW1fbm9kZXMgPSAoX19udW1fZWxlbWVudHMvIF9fZGVxdWVfYnVmX3NpemUoc2l6ZW9mKF9UcCkpCisJCQkJICArIDEpOworCisgICAgICB0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplID0gc3RkOjptYXgoKHNpemVfdCkgX1NfaW5pdGlhbF9tYXBfc2l6ZSwKKwkJCQkJICAgc2l6ZV90KF9fbnVtX25vZGVzICsgMikpOworICAgICAgdGhpcy0+X01faW1wbC5fTV9tYXAgPSBfTV9hbGxvY2F0ZV9tYXAodGhpcy0+X01faW1wbC5fTV9tYXBfc2l6ZSk7CisKKyAgICAgIC8vIEZvciAic21hbGwiIG1hcHMgKG5lZWRpbmcgbGVzcyB0aGFuIF9NX21hcF9zaXplIG5vZGVzKSwgYWxsb2NhdGlvbgorICAgICAgLy8gc3RhcnRzIGluIHRoZSBtaWRkbGUgZWxlbWVudHMgYW5kIGdyb3dzIG91dHdhcmRzLiAgU28gbnN0YXJ0IG1heSBiZQorICAgICAgLy8gdGhlIGJlZ2lubmluZyBvZiBfTV9tYXAsIGJ1dCBmb3Igc21hbGwgbWFwcyBpdCBtYXkgYmUgYXMgZmFyIGluIGFzCisgICAgICAvLyBfTV9tYXArMy4KKworICAgICAgX1RwKiogX19uc3RhcnQgPSAodGhpcy0+X01faW1wbC5fTV9tYXAKKwkJCSsgKHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUgLSBfX251bV9ub2RlcykgLyAyKTsKKyAgICAgIF9UcCoqIF9fbmZpbmlzaCA9IF9fbnN0YXJ0ICsgX19udW1fbm9kZXM7CisKKyAgICAgIF9fdHJ5CisJeyBfTV9jcmVhdGVfbm9kZXMoX19uc3RhcnQsIF9fbmZpbmlzaCk7IH0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIF9NX2RlYWxsb2NhdGVfbWFwKHRoaXMtPl9NX2ltcGwuX01fbWFwLCB0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplKTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fbWFwID0gMDsKKwkgIHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUgPSAwOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorCisgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX3NldF9ub2RlKF9fbnN0YXJ0KTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX3NldF9ub2RlKF9fbmZpbmlzaCAtIDEpOworICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIgPSBfTV9pbXBsLl9NX3N0YXJ0Ll9NX2ZpcnN0OworICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyID0gKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2ZpcnN0CisJCQkJCSsgX19udW1fZWxlbWVudHMKKwkJCQkJJSBfX2RlcXVlX2J1Zl9zaXplKHNpemVvZihfVHApKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX2NyZWF0ZV9ub2RlcyhfVHAqKiBfX25zdGFydCwgX1RwKiogX19uZmluaXNoKQorICAgIHsKKyAgICAgIF9UcCoqIF9fY3VyOworICAgICAgX190cnkKKwl7CisJICBmb3IgKF9fY3VyID0gX19uc3RhcnQ7IF9fY3VyIDwgX19uZmluaXNoOyArK19fY3VyKQorCSAgICAqX19jdXIgPSB0aGlzLT5fTV9hbGxvY2F0ZV9ub2RlKCk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgX01fZGVzdHJveV9ub2RlcyhfX25zdGFydCwgX19jdXIpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9kZXN0cm95X25vZGVzKF9UcCoqIF9fbnN0YXJ0LCBfVHAqKiBfX25maW5pc2gpCisgICAgeworICAgICAgZm9yIChfVHAqKiBfX24gPSBfX25zdGFydDsgX19uIDwgX19uZmluaXNoOyArK19fbikKKwlfTV9kZWFsbG9jYXRlX25vZGUoKl9fbik7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBBIHN0YW5kYXJkIGNvbnRhaW5lciB1c2luZyBmaXhlZC1zaXplIG1lbW9yeSBhbGxvY2F0aW9uIGFuZAorICAgKiAgY29uc3RhbnQtdGltZSBtYW5pcHVsYXRpb24gb2YgZWxlbWVudHMgYXQgZWl0aGVyIGVuZC4KKyAgICoKKyAgICogIEBpbmdyb3VwIHNlcXVlbmNlcworICAgKgorICAgKiAgQHRwYXJhbSBfVHAgIFR5cGUgb2YgZWxlbWVudC4KKyAgICogIEB0cGFyYW0gX0FsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gYWxsb2NhdG9yPF9UcD4uCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY2Ij5yZXZlcnNpYmxlIGNvbnRhaW5lcjwvYT4sIGFuZCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NyI+c2VxdWVuY2U8L2E+LCBpbmNsdWRpbmcgdGhlCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2OCI+b3B0aW9uYWwgc2VxdWVuY2UgcmVxdWlyZW1lbnRzPC9hPi4KKyAgICoKKyAgICogIEluIHByZXZpb3VzIEhQL1NHSSB2ZXJzaW9ucyBvZiBkZXF1ZSwgdGhlcmUgd2FzIGFuIGV4dHJhIHRlbXBsYXRlCisgICAqICBwYXJhbWV0ZXIgc28gdXNlcnMgY291bGQgY29udHJvbCB0aGUgbm9kZSBzaXplLiAgVGhpcyBleHRlbnNpb24gdHVybmVkCisgICAqICBvdXQgdG8gdmlvbGF0ZSB0aGUgQysrIHN0YW5kYXJkIChpdCBjYW4gYmUgZGV0ZWN0ZWQgdXNpbmcgdGVtcGxhdGUKKyAgICogIHRlbXBsYXRlIHBhcmFtZXRlcnMpLCBhbmQgaXQgd2FzIHJlbW92ZWQuCisgICAqCisgICAqICBIZXJlJ3MgaG93IGEgZGVxdWU8VHA+IG1hbmFnZXMgbWVtb3J5LiAgRWFjaCBkZXF1ZSBoYXMgNCBtZW1iZXJzOgorICAgKgorICAgKiAgLSBUcCoqICAgICAgICBfTV9tYXAKKyAgICogIC0gc2l6ZV90ICAgICAgX01fbWFwX3NpemUKKyAgICogIC0gaXRlcmF0b3IgICAgX01fc3RhcnQsIF9NX2ZpbmlzaAorICAgKgorICAgKiAgbWFwX3NpemUgaXMgYXQgbGVhc3QgOC4gICVtYXAgaXMgYW4gYXJyYXkgb2YgbWFwX3NpemUKKyAgICogIHBvaW50ZXJzLXRvLUBhIG5vZGVzLiAgKFRoZSBuYW1lICVtYXAgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUKKyAgICogIHN0ZDo6bWFwIGNsYXNzLCBhbmQgQGIgbm9kZXMgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoCisgICAqICBzdGQ6Omxpc3QncyB1c2FnZSBvZiBAYSBub2RlLikKKyAgICoKKyAgICogIEEgQGEgbm9kZSBoYXMgbm8gc3BlY2lmaWMgdHlwZSBuYW1lIGFzIHN1Y2gsIGJ1dCBpdCBpcyByZWZlcnJlZAorICAgKiAgdG8gYXMgQGEgbm9kZSBpbiB0aGlzIGZpbGUuICBJdCBpcyBhIHNpbXBsZSBhcnJheS1vZi1UcC4gIElmIFRwCisgICAqICBpcyB2ZXJ5IGxhcmdlLCB0aGVyZSB3aWxsIGJlIG9uZSBUcCBlbGVtZW50IHBlciBub2RlIChpLmUuLCBhbgorICAgKiAgQGEgYXJyYXkgb2Ygb25lKS4gIEZvciBub24taHVnZSBUcCdzLCBub2RlIHNpemUgaXMgaW52ZXJzZWx5CisgICAqICByZWxhdGVkIHRvIFRwIHNpemU6IHRoZSBsYXJnZXIgdGhlIFRwLCB0aGUgZmV3ZXIgVHAncyB3aWxsIGZpdAorICAgKiAgaW4gYSBub2RlLiAgVGhlIGdvYWwgaGVyZSBpcyB0byBrZWVwIHRoZSB0b3RhbCBzaXplIG9mIGEgbm9kZQorICAgKiAgcmVsYXRpdmVseSBzbWFsbCBhbmQgY29uc3RhbnQgb3ZlciBkaWZmZXJlbnQgVHAncywgdG8gaW1wcm92ZQorICAgKiAgYWxsb2NhdG9yIGVmZmljaWVuY3kuCisgICAqCisgICAqICBOb3QgZXZlcnkgcG9pbnRlciBpbiB0aGUgJW1hcCBhcnJheSB3aWxsIHBvaW50IHRvIGEgbm9kZS4gIElmCisgICAqICB0aGUgaW5pdGlhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGRlcXVlIGlzIHNtYWxsLCB0aGUKKyAgICogIC9taWRkbGUvICVtYXAgcG9pbnRlcnMgd2lsbCBiZSB2YWxpZCwgYW5kIHRoZSBvbmVzIGF0IHRoZSBlZGdlcworICAgKiAgd2lsbCBiZSB1bnVzZWQuICBUaGlzIHNhbWUgc2l0dWF0aW9uIHdpbGwgYXJpc2UgYXMgdGhlICVtYXAKKyAgICogIGdyb3dzOiBhdmFpbGFibGUgJW1hcCBwb2ludGVycywgaWYgYW55LCB3aWxsIGJlIG9uIHRoZSBlbmRzLiAgQXMKKyAgICogIG5ldyBub2RlcyBhcmUgY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiB0aGUgJW1hcCdzIHBvaW50ZXJzIG5lZWQKKyAgICogIHRvIGJlIGNvcGllZCBAYSBvdXR3YXJkLgorICAgKgorICAgKiAgQ2xhc3MgaW52YXJpYW50czoKKyAgICogLSBGb3IgYW55IG5vbnNpbmd1bGFyIGl0ZXJhdG9yIGk6CisgICAqICAgIC0gaS5ub2RlIHBvaW50cyB0byBhIG1lbWJlciBvZiB0aGUgJW1hcCBhcnJheS4gIChZZXMsIHlvdSByZWFkIHRoYXQKKyAgICogICAgICBjb3JyZWN0bHk6ICBpLm5vZGUgZG9lcyBub3QgYWN0dWFsbHkgcG9pbnQgdG8gYSBub2RlLikgIFRoZSBtZW1iZXIgb2YKKyAgICogICAgICB0aGUgJW1hcCBhcnJheSBpcyB3aGF0IGFjdHVhbGx5IHBvaW50cyB0byB0aGUgbm9kZS4KKyAgICogICAgLSBpLmZpcnN0ID09ICooaS5ub2RlKSAgICAoVGhpcyBwb2ludHMgdG8gdGhlIG5vZGUgKGZpcnN0IFRwIGVsZW1lbnQpLikKKyAgICogICAgLSBpLmxhc3QgID09IGkuZmlyc3QgKyBub2RlX3NpemUKKyAgICogICAgLSBpLmN1ciBpcyBhIHBvaW50ZXIgaW4gdGhlIHJhbmdlIFtpLmZpcnN0LCBpLmxhc3QpLiAgTk9URToKKyAgICogICAgICB0aGUgaW1wbGljYXRpb24gb2YgdGhpcyBpcyB0aGF0IGkuY3VyIGlzIGFsd2F5cyBhIGRlcmVmZXJlbmNlYWJsZQorICAgKiAgICAgIHBvaW50ZXIsIGV2ZW4gaWYgaSBpcyBhIHBhc3QtdGhlLWVuZCBpdGVyYXRvci4KKyAgICogLSBTdGFydCBhbmQgRmluaXNoIGFyZSBhbHdheXMgbm9uc2luZ3VsYXIgaXRlcmF0b3JzLiAgTk9URTogdGhpcworICAgKiBtZWFucyB0aGF0IGFuIGVtcHR5IGRlcXVlIG11c3QgaGF2ZSBvbmUgbm9kZSwgYSBkZXF1ZSB3aXRoIDxOCisgICAqIGVsZW1lbnRzICh3aGVyZSBOIGlzIHRoZSBub2RlIGJ1ZmZlciBzaXplKSBtdXN0IGhhdmUgb25lIG5vZGUsIGEKKyAgICogZGVxdWUgd2l0aCBOIHRocm91Z2ggKDJOLTEpIGVsZW1lbnRzIG11c3QgaGF2ZSB0d28gbm9kZXMsIGV0Yy4KKyAgICogLSBGb3IgZXZlcnkgbm9kZSBvdGhlciB0aGFuIHN0YXJ0Lm5vZGUgYW5kIGZpbmlzaC5ub2RlLCBldmVyeQorICAgKiBlbGVtZW50IGluIHRoZSBub2RlIGlzIGFuIGluaXRpYWxpemVkIG9iamVjdC4gIElmIHN0YXJ0Lm5vZGUgPT0KKyAgICogZmluaXNoLm5vZGUsIHRoZW4gW3N0YXJ0LmN1ciwgZmluaXNoLmN1cikgYXJlIGluaXRpYWxpemVkCisgICAqIG9iamVjdHMsIGFuZCB0aGUgZWxlbWVudHMgb3V0c2lkZSB0aGF0IHJhbmdlIGFyZSB1bmluaXRpYWxpemVkCisgICAqIHN0b3JhZ2UuICBPdGhlcndpc2UsIFtzdGFydC5jdXIsIHN0YXJ0Lmxhc3QpIGFuZCBbZmluaXNoLmZpcnN0LAorICAgKiBmaW5pc2guY3VyKSBhcmUgaW5pdGlhbGl6ZWQgb2JqZWN0cywgYW5kIFtzdGFydC5maXJzdCwgc3RhcnQuY3VyKQorICAgKiBhbmQgW2ZpbmlzaC5jdXIsIGZpbmlzaC5sYXN0KSBhcmUgdW5pbml0aWFsaXplZCBzdG9yYWdlLgorICAgKiAtIFslbWFwLCAlbWFwICsgbWFwX3NpemUpIGlzIGEgdmFsaWQsIG5vbi1lbXB0eSByYW5nZS4KKyAgICogLSBbc3RhcnQubm9kZSwgZmluaXNoLm5vZGVdIGlzIGEgdmFsaWQgcmFuZ2UgY29udGFpbmVkIHdpdGhpbgorICAgKiAgIFslbWFwLCAlbWFwICsgbWFwX3NpemUpLgorICAgKiAtIEEgcG9pbnRlciBpbiB0aGUgcmFuZ2UgWyVtYXAsICVtYXAgKyBtYXBfc2l6ZSkgcG9pbnRzIHRvIGFuIGFsbG9jYXRlZAorICAgKiAgIG5vZGUgaWYgYW5kIG9ubHkgaWYgdGhlIHBvaW50ZXIgaXMgaW4gdGhlIHJhbmdlCisgICAqICAgW3N0YXJ0Lm5vZGUsIGZpbmlzaC5ub2RlXS4KKyAgICoKKyAgICogIEhlcmUncyB0aGUgbWFnaWM6ICBub3RoaW5nIGluIGRlcXVlIGlzIEBiIGF3YXJlIG9mIHRoZSBkaXNjb250aWd1b3VzCisgICAqICBzdG9yYWdlIQorICAgKgorICAgKiAgVGhlIG1lbW9yeSBzZXR1cCBhbmQgbGF5b3V0IG9jY3VycyBpbiB0aGUgcGFyZW50LCBfQmFzZSwgYW5kIHRoZSBpdGVyYXRvcgorICAgKiAgY2xhc3MgaXMgZW50aXJlbHkgcmVzcG9uc2libGUgZm9yIEBhIGxlYXBpbmcgZnJvbSBvbmUgbm9kZSB0byB0aGUgbmV4dC4KKyAgICogIEFsbCB0aGUgaW1wbGVtZW50YXRpb24gcm91dGluZXMgZm9yIGRlcXVlIGl0c2VsZiB3b3JrIG9ubHkgdGhyb3VnaCB0aGUKKyAgICogIHN0YXJ0IGFuZCBmaW5pc2ggaXRlcmF0b3JzLiAgVGhpcyBrZWVwcyB0aGUgcm91dGluZXMgc2ltcGxlIGFuZCBzYW5lLAorICAgKiAgYW5kIHdlIGNhbiB1c2Ugb3RoZXIgc3RhbmRhcmQgYWxnb3JpdGhtcyBhcyB3ZWxsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGRlcXVlIDogcHJvdGVjdGVkIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPgorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSAgICAgICAgX0FsbG9jX3ZhbHVlX3R5cGU7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1RwLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMyKF9UcCwgX0FsbG9jX3ZhbHVlX3R5cGUsIF9TYW1lVHlwZUNvbmNlcHQpCisKKyAgICAgIHR5cGVkZWYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+ICAgICAgICAgICBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9UcF9hbGxvY190eXBlCSBfVHBfYWxsb2NfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpwb2ludGVyICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHBfYWxsb2NfdHlwZTo6Y29uc3RfcG9pbnRlciAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwX2FsbG9jX3R5cGU6OnJlZmVyZW5jZSAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwX2FsbG9jX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBwb2ludGVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NYXBfcG9pbnRlcjsKKworICAgICAgc3RhdGljIHNpemVfdCBfU19idWZmZXJfc2l6ZSgpCisgICAgICB7IHJldHVybiBfX2RlcXVlX2J1Zl9zaXplKHNpemVvZihfVHApKTsgfQorCisgICAgICAvLyBGdW5jdGlvbnMgY29udHJvbGxpbmcgbWVtb3J5IGxheW91dCwgYW5kIG5vdGhpbmcgZWxzZS4KKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9pbml0aWFsaXplX21hcDsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9jcmVhdGVfbm9kZXM7CisgICAgICB1c2luZyBfQmFzZTo6X01fZGVzdHJveV9ub2RlczsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9hbGxvY2F0ZV9ub2RlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2RlYWxsb2NhdGVfbm9kZTsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9hbGxvY2F0ZV9tYXA7CisgICAgICB1c2luZyBfQmFzZTo6X01fZGVhbGxvY2F0ZV9tYXA7CisgICAgICB1c2luZyBfQmFzZTo6X01fZ2V0X1RwX2FsbG9jYXRvcjsKKworICAgICAgLyoqIAorICAgICAgICogIEEgdG90YWwgb2YgZm91ciBkYXRhIG1lbWJlcnMgYWNjdW11bGF0ZWQgZG93biB0aGUgaGllcmFyY2h5LgorICAgICAgICogIE1heSBiZSBhY2Nlc3NlZCB2aWEgX01faW1wbC4qCisgICAgICAgKi8KKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9pbXBsOworCisgICAgcHVibGljOgorICAgICAgLy8gWzIzLjIuMS4xXSBjb25zdHJ1Y3QvY29weS9kZXN0cm95CisgICAgICAvLyAoYXNzaWduKCkgYW5kIGdldF9hbGxvY2F0b3IoKSBhcmUgYWxzbyBsaXN0ZWQgaW4gdGhpcyBzZWN0aW9uKQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgbm8gZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIGRlcXVlKCkKKyAgICAgIDogX0Jhc2UoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJWRlcXVlIHdpdGggbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBkZXF1ZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfQmFzZShfX2EsIDApIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJWRlcXVlIHdpdGggZGVmYXVsdCBjb25zdHJ1Y3RlZCBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBpbml0aWFsbHkgY3JlYXRlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSAlZGVxdWUgd2l0aCBAYSBuIGRlZmF1bHQKKyAgICAgICAqICBjb25zdHJ1Y3RlZCBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGRlcXVlKHNpemVfdHlwZSBfX24pCisgICAgICA6IF9CYXNlKF9fbikKKyAgICAgIHsgX01fZGVmYXVsdF9pbml0aWFsaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJWRlcXVlIHdpdGggY29waWVzIG9mIGFuIGV4ZW1wbGFyIGVsZW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsdWUgIEFuIGVsZW1lbnQgdG8gY29weS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSAlZGVxdWUgd2l0aCBAYSBfX24gY29waWVzIG9mIEBhIF9fdmFsdWUuCisgICAgICAgKi8KKyAgICAgIGRlcXVlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsdWUsCisJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2EsIF9fbikKKyAgICAgIHsgX01fZmlsbF9pbml0aWFsaXplKF9fdmFsdWUpOyB9CisjZWxzZQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJWRlcXVlIHdpdGggY29waWVzIG9mIGFuIGV4ZW1wbGFyIGVsZW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsdWUgIEFuIGVsZW1lbnQgdG8gY29weS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSAlZGVxdWUgd2l0aCBAYSBfX24gY29waWVzIG9mIEBhIF9fdmFsdWUuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbHVlID0gdmFsdWVfdHlwZSgpLAorCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hLCBfX24pCisgICAgICB7IF9NX2ZpbGxfaW5pdGlhbGl6ZShfX3ZhbHVlKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJURlcXVlIGNvcHkgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJWRlcXVlIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVkZXF1ZSB1c2VzIGEgY29weSBvZiB0aGUgYWxsb2NhdGlvbiBvYmplY3QgdXNlZAorICAgICAgICogIGJ5IEBhIF9feC4KKyAgICAgICAqLworICAgICAgZGVxdWUoY29uc3QgZGVxdWUmIF9feCkKKyAgICAgIDogX0Jhc2UoX194Ll9NX2dldF9UcF9hbGxvY2F0b3IoKSwgX194LnNpemUoKSkKKyAgICAgIHsgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9feC5iZWdpbigpLCBfX3guZW5kKCksIAorCQkJCSAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVEZXF1ZSBtb3ZlIGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVkZXF1ZSBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlZGVxdWUgY29udGFpbnMgdGhlIGV4YWN0IGNvbnRlbnRzIG9mIEBhIF9feC4KKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgX194IGFyZSBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgJWRlcXVlLgorICAgICAgICovCisgICAgICBkZXF1ZShkZXF1ZSYmIF9feCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVkZXF1ZSBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVkZXF1ZSBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgaW5pdGlhbGl6ZXJfbGlzdCBAYSBfX2wuCisgICAgICAgKgorICAgICAgICogIFRoaXMgd2lsbCBjYWxsIHRoZSBlbGVtZW50IHR5cGUncyBjb3B5IGNvbnN0cnVjdG9yIE4gdGltZXMKKyAgICAgICAqICAod2hlcmUgTiBpcyBfX2wuc2l6ZSgpKSBhbmQgZG8gbm8gbWVtb3J5IHJlYWxsb2NhdGlvbi4KKyAgICAgICAqLworICAgICAgZGVxdWUoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2EpCisgICAgICB7CisJX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2wuYmVnaW4oKSwgX19sLmVuZCgpLAorCQkJICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCkpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJWRlcXVlIGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGEgJWRlcXVlIGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tIFtfX2ZpcnN0LAorICAgICAgICogIF9fbGFzdCkuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBpdGVyYXRvcnMgYXJlIGZvcndhcmQsIGJpZGlyZWN0aW9uYWwsIG9yIHJhbmRvbS1hY2Nlc3MsIHRoZW4KKyAgICAgICAqICB0aGlzIHdpbGwgY2FsbCB0aGUgZWxlbWVudHMnIGNvcHkgY29uc3RydWN0b3IgTiB0aW1lcyAod2hlcmUgTiBpcworICAgICAgICogIGRpc3RhbmNlKF9fZmlyc3QsX19sYXN0KSkgYW5kIGRvIG5vIG1lbW9yeSByZWFsbG9jYXRpb24uICBCdXQgaWYgb25seQorICAgICAgICogIGlucHV0IGl0ZXJhdG9ycyBhcmUgdXNlZCwgdGhlbiB0aGlzIHdpbGwgZG8gYXQgbW9zdCAyTiBjYWxscyB0byB0aGUKKyAgICAgICAqICBjb3B5IGNvbnN0cnVjdG9yLCBhbmQgbG9nTiBtZW1vcnkgcmVhbGxvY2F0aW9ucy4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorICAgICAgICBkZXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2EpCisgICAgICAgIHsgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fZmFsc2VfdHlwZSgpKTsgfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBkZXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2EpCisgICAgICAgIHsKKwkgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworCX0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBUaGUgZHRvciBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCBub3RlIHRoYXQgaWYgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkKKyAgICAgICAqICB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB+ZGVxdWUoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyBfTV9kZXN0cm95X2RhdGEoYmVnaW4oKSwgZW5kKCksIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlRGVxdWUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlZGVxdWUgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgQWxsIHRoZSBlbGVtZW50cyBvZiBAYSB4IGFyZSBjb3BpZWQsIGJ1dCB1bmxpa2UgdGhlIGNvcHkgY29uc3RydWN0b3IsCisgICAgICAgKiAgdGhlIGFsbG9jYXRvciBvYmplY3QgaXMgbm90IGNvcGllZC4KKyAgICAgICAqLworICAgICAgZGVxdWUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgZGVxdWUmIF9feCk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVEZXF1ZSBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJWRlcXVlIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSBfX3ggYXJlIG1vdmVkIGludG8gdGhpcyBkZXF1ZSAod2l0aG91dCBjb3B5aW5nKS4KKyAgICAgICAqICBAYSBfX3ggaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICVkZXF1ZS4KKyAgICAgICAqLworICAgICAgZGVxdWUmCisgICAgICBvcGVyYXRvcj0oZGVxdWUmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhbiBpbml0aWFsaXplciBsaXN0IHRvIGEgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJWRlcXVlIHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplcl9saXN0IEBhIF9fbC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJWRlcXVlIGFuZCB0aGF0IHRoZQorICAgICAgICogIHJlc3VsdGluZyAlZGVxdWUncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKKyAgICAgICAqICBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICBkZXF1ZSYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5hc3NpZ24oX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhIGdpdmVuIHZhbHVlIHRvIGEgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgYXNzaWduZWQuCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbCAgVmFsdWUgdG8gYmUgYXNzaWduZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlZGVxdWUgd2l0aCBAYSBuIGNvcGllcyBvZiB0aGUgZ2l2ZW4KKyAgICAgICAqICB2YWx1ZS4gIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlCisgICAgICAgKiAgJWRlcXVlIGFuZCB0aGF0IHRoZSByZXN1bHRpbmcgJWRlcXVlJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcworICAgICAgICogIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKQorICAgICAgeyBfTV9maWxsX2Fzc2lnbihfX24sIF9fdmFsKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYSByYW5nZSB0byBhICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlZGVxdWUgd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIHJhbmdlIFtfX2ZpcnN0LF9fbGFzdCkuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICVkZXF1ZSBhbmQgdGhhdCB0aGUKKyAgICAgICAqICByZXN1bHRpbmcgJWRlcXVlJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCisgICAgICAgKiAgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX19mYWxzZV90eXBlKCkpOyB9CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisJfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYW4gaW5pdGlhbGl6ZXIgbGlzdCB0byBhICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICVkZXF1ZSB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgaW5pdGlhbGl6ZXJfbGlzdCBAYSBfX2wuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICVkZXF1ZSBhbmQgdGhhdCB0aGUKKyAgICAgICAqICByZXN1bHRpbmcgJWRlcXVlJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCisgICAgICAgKiAgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyB0aGlzLT5hc3NpZ24oX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgICAvLy8gR2V0IGEgY29weSBvZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gb2JqZWN0LgorICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX0Jhc2U6OmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICAvLyBpdGVyYXRvcnMKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZQorICAgICAgICogICVkZXF1ZS4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5IGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlZGVxdWUuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9zdGFydDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVkZXF1ZS4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5CisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QKKyAgICAgICAqICB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSAlZGVxdWUuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIG9yZGluYXJ5IGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBsYXN0IGVsZW1lbnQgaW4gdGhlICVkZXF1ZS4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIHJldmVyc2UKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSAlZGVxdWUuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9maW5pc2gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gb25lCisgICAgICAgKiAgYmVmb3JlIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSAlZGVxdWUuICBJdGVyYXRpb24gaXMgZG9uZQorICAgICAgICogIGluIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gb25lIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgJWRlcXVlLiAgSXRlcmF0aW9uIGlzCisgICAgICAgKiAgZG9uZSBpbiByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVkZXF1ZS4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5IGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9zdGFydDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QKKyAgICAgICAqICB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSAlZGVxdWUuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIG9yZGluYXJ5IGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJWRlcXVlLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byBvbmUgYmVmb3JlIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSAlZGVxdWUuICBJdGVyYXRpb24gaXMKKyAgICAgICAqICBkb25lIGluIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsgfQorI2VuZGlmCisKKyAgICAgIC8vIFsyMy4yLjEuMl0gY2FwYWNpdHkKKyAgICAgIC8qKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSAlZGVxdWUuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydDsgfQorCisgICAgICAvKiogIFJldHVybnMgdGhlIHNpemUoKSBvZiB0aGUgbGFyZ2VzdCBwb3NzaWJsZSAlZGVxdWUuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV9nZXRfVHBfYWxsb2NhdG9yKCkubWF4X3NpemUoKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXNpemVzIHRoZSAlZGVxdWUgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX25ld19zaXplICBOdW1iZXIgb2YgZWxlbWVudHMgdGhlICVkZXF1ZSBzaG91bGQgY29udGFpbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICVkZXF1ZSB0byB0aGUgc3BlY2lmaWVkCisgICAgICAgKiAgbnVtYmVyIG9mIGVsZW1lbnRzLiAgSWYgdGhlIG51bWJlciBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICAgICAgKiAgJWRlcXVlJ3MgY3VycmVudCBzaXplIHRoZSAlZGVxdWUgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UKKyAgICAgICAqICBkZWZhdWx0IGNvbnN0cnVjdGVkIGVsZW1lbnRzIGFyZSBhcHBlbmRlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKQorICAgICAgeworCWNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKKwlpZiAoX19uZXdfc2l6ZSA+IF9fbGVuKQorCSAgX01fZGVmYXVsdF9hcHBlbmQoX19uZXdfc2l6ZSAtIF9fbGVuKTsKKwllbHNlIGlmIChfX25ld19zaXplIDwgX19sZW4pCisJICBfTV9lcmFzZV9hdF9lbmQodGhpcy0+X01faW1wbC5fTV9zdGFydAorCQkJICArIGRpZmZlcmVuY2VfdHlwZShfX25ld19zaXplKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVzaXplcyB0aGUgJWRlcXVlIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uZXdfc2l6ZSAgTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAlZGVxdWUgc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgd2l0aCB3aGljaCBuZXcgZWxlbWVudHMgc2hvdWxkIGJlIHBvcHVsYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICVkZXF1ZSB0byB0aGUgc3BlY2lmaWVkCisgICAgICAgKiAgbnVtYmVyIG9mIGVsZW1lbnRzLiAgSWYgdGhlIG51bWJlciBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICAgICAgKiAgJWRlcXVlJ3MgY3VycmVudCBzaXplIHRoZSAlZGVxdWUgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UgdGhlCisgICAgICAgKiAgJWRlcXVlIGlzIGV4dGVuZGVkIGFuZCBuZXcgZWxlbWVudHMgYXJlIHBvcHVsYXRlZCB3aXRoIGdpdmVuCisgICAgICAgKiAgZGF0YS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpOworCWlmIChfX25ld19zaXplID4gX19sZW4pCisJICBpbnNlcnQodGhpcy0+X01faW1wbC5fTV9maW5pc2gsIF9fbmV3X3NpemUgLSBfX2xlbiwgX194KTsKKwllbHNlIGlmIChfX25ld19zaXplIDwgX19sZW4pCisJICBfTV9lcmFzZV9hdF9lbmQodGhpcy0+X01faW1wbC5fTV9zdGFydAorCQkJICArIGRpZmZlcmVuY2VfdHlwZShfX25ld19zaXplKSk7CisgICAgICB9CisjZWxzZQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXNpemVzIHRoZSAlZGVxdWUgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX25ld19zaXplICBOdW1iZXIgb2YgZWxlbWVudHMgdGhlICVkZXF1ZSBzaG91bGQgY29udGFpbi4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB3aXRoIHdoaWNoIG5ldyBlbGVtZW50cyBzaG91bGQgYmUgcG9wdWxhdGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgJXJlc2l6ZSB0aGUgJWRlcXVlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBudW1iZXIgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICAqICAlZGVxdWUncyBjdXJyZW50IHNpemUgdGhlICVkZXF1ZSBpcyB0cnVuY2F0ZWQsIG90aGVyd2lzZSB0aGUKKyAgICAgICAqICAlZGVxdWUgaXMgZXh0ZW5kZWQgYW5kIG5ldyBlbGVtZW50cyBhcmUgcG9wdWxhdGVkIHdpdGggZ2l2ZW4KKyAgICAgICAqICBkYXRhLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIHZhbHVlX3R5cGUgX194ID0gdmFsdWVfdHlwZSgpKQorICAgICAgeworCWNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKKwlpZiAoX19uZXdfc2l6ZSA+IF9fbGVuKQorCSAgaW5zZXJ0KHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLCBfX25ld19zaXplIC0gX19sZW4sIF9feCk7CisJZWxzZSBpZiAoX19uZXdfc2l6ZSA8IF9fbGVuKQorCSAgX01fZXJhc2VfYXRfZW5kKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQKKwkJCSAgKyBkaWZmZXJlbmNlX3R5cGUoX19uZXdfc2l6ZSkpOworICAgICAgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKiogIEEgbm9uLWJpbmRpbmcgcmVxdWVzdCB0byByZWR1Y2UgbWVtb3J5IHVzZS4gICovCisgICAgICB2b2lkCisgICAgICBzaHJpbmtfdG9fZml0KCkKKyAgICAgIHsgX01fc2hyaW5rX3RvX2ZpdCgpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSAlZGVxdWUgaXMgZW1wdHkuICAoVGh1cyBiZWdpbigpIHdvdWxkCisgICAgICAgKiAgZXF1YWwgZW5kKCkuKQorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9PSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OyB9CisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgU3Vic2NyaXB0IGFjY2VzcyB0byB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gX19uIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUKKyAgICAgICAqICBhY2Nlc3NlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkL3dyaXRlIHJlZmVyZW5jZSB0byBkYXRhLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdG9yIGFsbG93cyBmb3IgZWFzeSwgYXJyYXktc3R5bGUsIGRhdGEgYWNjZXNzLgorICAgICAgICogIE5vdGUgdGhhdCBkYXRhIGFjY2VzcyB3aXRoIHRoaXMgb3BlcmF0b3IgaXMgdW5jaGVja2VkIGFuZAorICAgICAgICogIG91dF9vZl9yYW5nZSBsb29rdXBzIGFyZSBub3QgZGVmaW5lZC4gKEZvciBjaGVja2VkIGxvb2t1cHMKKyAgICAgICAqICBzZWUgYXQoKS4pCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9zdGFydFtkaWZmZXJlbmNlX3R5cGUoX19uKV07IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFN1YnNjcmlwdCBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtIF9fbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlCisgICAgICAgKiAgYWNjZXNzZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIGRhdGEuCisgICAgICAgKgorICAgICAgICogIFRoaXMgb3BlcmF0b3IgYWxsb3dzIGZvciBlYXN5LCBhcnJheS1zdHlsZSwgZGF0YSBhY2Nlc3MuCisgICAgICAgKiAgTm90ZSB0aGF0IGRhdGEgYWNjZXNzIHdpdGggdGhpcyBvcGVyYXRvciBpcyB1bmNoZWNrZWQgYW5kCisgICAgICAgKiAgb3V0X29mX3JhbmdlIGxvb2t1cHMgYXJlIG5vdCBkZWZpbmVkLiAoRm9yIGNoZWNrZWQgbG9va3VwcworICAgICAgICogIHNlZSBhdCgpLikKKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0W2RpZmZlcmVuY2VfdHlwZShfX24pXTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8vIFNhZmV0eSBjaGVjayB1c2VkIG9ubHkgZnJvbSBhdCgpLgorICAgICAgdm9pZAorICAgICAgX01fcmFuZ2VfY2hlY2soc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlpZiAoX19uID49IHRoaXMtPnNpemUoKSkKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiZGVxdWU6Ol9NX3JhbmdlX2NoZWNrIikpOworICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtIF9fbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlCisgICAgICAgKiAgYWNjZXNzZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC93cml0ZSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX24gaXMgYW4gaW52YWxpZCBpbmRleC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBmb3Igc2FmZXIgZGF0YSBhY2Nlc3MuICBUaGUgcGFyYW1ldGVyCisgICAgICAgKiAgaXMgZmlyc3QgY2hlY2tlZCB0aGF0IGl0IGlzIGluIHRoZSByYW5nZSBvZiB0aGUgZGVxdWUuICBUaGUKKyAgICAgICAqICBmdW5jdGlvbiB0aHJvd3Mgb3V0X29mX3JhbmdlIGlmIHRoZSBjaGVjayBmYWlscy4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBhdChzaXplX3R5cGUgX19uKQorICAgICAgeworCV9NX3JhbmdlX2NoZWNrKF9fbik7CisJcmV0dXJuICgqdGhpcylbX19uXTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtIF9fbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlCisgICAgICAgKiAgYWNjZXNzZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIGRhdGEuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19uIGlzIGFuIGludmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIHNhZmVyIGRhdGEgYWNjZXNzLiAgVGhlIHBhcmFtZXRlciBpcyBmaXJzdAorICAgICAgICogIGNoZWNrZWQgdGhhdCBpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIGRlcXVlLiAgVGhlIGZ1bmN0aW9uIHRocm93cworICAgICAgICogIG91dF9vZl9yYW5nZSBpZiB0aGUgY2hlY2sgZmFpbHMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlfTV9yYW5nZV9jaGVjayhfX24pOworCXJldHVybiAoKnRoaXMpW19fbl07CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlZGVxdWUuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlZGVxdWUuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlCisgICAgICAgKiAgJWRlcXVlLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGJhY2soKQorICAgICAgeworCWl0ZXJhdG9yIF9fdG1wID0gZW5kKCk7CisJLS1fX3RtcDsKKwlyZXR1cm4gKl9fdG1wOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJWRlcXVlLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeworCWNvbnN0X2l0ZXJhdG9yIF9fdG1wID0gZW5kKCk7CisJLS1fX3RtcDsKKwlyZXR1cm4gKl9fdG1wOworICAgICAgfQorCisgICAgICAvLyBbMjMuMi4xLjJdIG1vZGlmaWVycworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBZGQgZGF0YSB0byB0aGUgZnJvbnQgb2YgdGhlICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBhZGRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgc3RhY2sgb3BlcmF0aW9uLiAgVGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYW4KKyAgICAgICAqICBlbGVtZW50IGF0IHRoZSBmcm9udCBvZiB0aGUgJWRlcXVlIGFuZCBhc3NpZ25zIHRoZSBnaXZlbgorICAgICAgICogIGRhdGEgdG8gaXQuICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBhICVkZXF1ZSB0aGlzIG9wZXJhdGlvbgorICAgICAgICogIGNhbiBiZSBkb25lIGluIGNvbnN0YW50IHRpbWUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCWlmICh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1ciAhPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2ZpcnN0KQorCSAgeworCSAgICB0aGlzLT5fTV9pbXBsLmNvbnN0cnVjdCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1ciAtIDEsIF9feCk7CisJICAgIC0tdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXI7CisJICB9CisJZWxzZQorCSAgX01fcHVzaF9mcm9udF9hdXgoX194KTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgZW1wbGFjZV9mcm9udChzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgZW1wbGFjZV9mcm9udChfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBZGQgZGF0YSB0byB0aGUgZW5kIG9mIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgdG8gYmUgYWRkZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsIHN0YWNrIG9wZXJhdGlvbi4gIFRoZSBmdW5jdGlvbiBjcmVhdGVzIGFuCisgICAgICAgKiAgZWxlbWVudCBhdCB0aGUgZW5kIG9mIHRoZSAlZGVxdWUgYW5kIGFzc2lnbnMgdGhlIGdpdmVuIGRhdGEKKyAgICAgICAqICB0byBpdC4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWRlcXVlIHRoaXMgb3BlcmF0aW9uIGNhbiBiZQorICAgICAgICogIGRvbmUgaW4gY29uc3RhbnQgdGltZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyCisJICAgICE9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2xhc3QgLSAxKQorCSAgeworCSAgICB0aGlzLT5fTV9pbXBsLmNvbnN0cnVjdCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIsIF9feCk7CisJICAgICsrdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyOworCSAgfQorCWVsc2UKKwkgIF9NX3B1c2hfYmFja19hdXgoX194KTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfYmFjayh2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyBlbXBsYWNlX2JhY2soc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2VfYmFjayhfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmVzIGZpcnN0IGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsIHN0YWNrIG9wZXJhdGlvbi4gIEl0IHNocmlua3MgdGhlICVkZXF1ZSBieSBvbmUuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCBubyBkYXRhIGlzIHJldHVybmVkLCBhbmQgaWYgdGhlIGZpcnN0IGVsZW1lbnQncyBkYXRhIGlzCisgICAgICAgKiAgbmVlZGVkLCBpdCBzaG91bGQgYmUgcmV0cmlldmVkIGJlZm9yZSBwb3BfZnJvbnQoKSBpcyBjYWxsZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBvcF9mcm9udCgpCisgICAgICB7CisJaWYgKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyCisJICAgICE9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbGFzdCAtIDEpCisJICB7CisJICAgIHRoaXMtPl9NX2ltcGwuZGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1cik7CisJICAgICsrdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXI7CisJICB9CisJZWxzZQorCSAgX01fcG9wX2Zyb250X2F1eCgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZXMgbGFzdCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCBzdGFjayBvcGVyYXRpb24uICBJdCBzaHJpbmtzIHRoZSAlZGVxdWUgYnkgb25lLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgbm8gZGF0YSBpcyByZXR1cm5lZCwgYW5kIGlmIHRoZSBsYXN0IGVsZW1lbnQncyBkYXRhIGlzCisgICAgICAgKiAgbmVlZGVkLCBpdCBzaG91bGQgYmUgcmV0cmlldmVkIGJlZm9yZSBwb3BfYmFjaygpIGlzIGNhbGxlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcG9wX2JhY2soKQorICAgICAgeworCWlmICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIKKwkgICAgIT0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fZmlyc3QpCisJICB7CisJICAgIC0tdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyOworCSAgICB0aGlzLT5fTV9pbXBsLmRlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyKTsKKwkgIH0KKwllbHNlCisJICBfTV9wb3BfYmFja19hdXgoKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBhbiBvYmplY3QgaW4gJWRlcXVlIGJlZm9yZSBzcGVjaWZpZWQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBfX2FyZ3MgIEFyZ3VtZW50cy4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhbiBvYmplY3Qgb2YgdHlwZSBUIGNvbnN0cnVjdGVkCisgICAgICAgKiAgd2l0aCBUKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikgYmVmb3JlIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBlbXBsYWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmdzJiYuLi4gX19hcmdzKTsKKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgZ2l2ZW4gdmFsdWUgaW50byAlZGVxdWUgYmVmb3JlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIGNvcHkgb2YgdGhlIGdpdmVuIHZhbHVlIGJlZm9yZSB0aGUKKyAgICAgICAqICBzcGVjaWZpZWQgbG9jYXRpb24uCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBnaXZlbiBydmFsdWUgaW50byAlZGVxdWUgYmVmb3JlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIGNvcHkgb2YgdGhlIGdpdmVuIHJ2YWx1ZSBiZWZvcmUgdGhlCisgICAgICAgKiAgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBlbXBsYWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgYW4gaW5pdGlhbGl6ZXIgbGlzdCBpbnRvIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBfX3AgIEFuIGl0ZXJhdG9yIGludG8gdGhlICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBjb3BpZXMgb2YgdGhlIGRhdGEgaW4gdGhlCisgICAgICAgKiAgaW5pdGlhbGl6ZXJfbGlzdCBAYSBfX2wgaW50byB0aGUgJWRlcXVlIGJlZm9yZSB0aGUgbG9jYXRpb24KKyAgICAgICAqICBzcGVjaWZpZWQgYnkgQGEgX19wLiAgVGhpcyBpcyBrbm93biBhcyA8ZW0+bGlzdCBpbnNlcnQ8L2VtPi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IHRoaXMtPmluc2VydChfX3AsIF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGEgbnVtYmVyIG9mIGNvcGllcyBvZiBnaXZlbiBkYXRhIGludG8gdGhlICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX194ICBEYXRhIHRvIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGEgc3BlY2lmaWVkIG51bWJlciBvZiBjb3BpZXMgb2YgdGhlIGdpdmVuCisgICAgICAgKiAgZGF0YSBiZWZvcmUgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBAYSBfX3Bvc2l0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyBfTV9maWxsX2luc2VydChfX3Bvc2l0aW9uLCBfX24sIF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGEgcmFuZ2UgaW50byB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBjb3BpZXMgb2YgdGhlIGRhdGEgaW4gdGhlIHJhbmdlCisgICAgICAgKiAgW19fZmlyc3QsX19sYXN0KSBpbnRvIHRoZSAlZGVxdWUgYmVmb3JlIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKKyAgICAgICAqICBieSBAYSBfX3Bvc2l0aW9uLiAgVGhpcyBpcyBrbm93biBhcyA8ZW0+cmFuZ2UgaW5zZXJ0PC9lbT4uCisgICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkgICAgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IF9NX2luc2VydF9kaXNwYXRjaChfX3Bvc2l0aW9uLCBfX2ZpcnN0LCBfX2xhc3QsIF9fZmFsc2VfdHlwZSgpKTsgfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9pbnNlcnRfZGlzcGF0Y2goX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisJfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGVsZW1lbnQgYXQgZ2l2ZW4gcG9zaXRpb24uCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBJdGVyYXRvciBwb2ludGluZyB0byBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbmV4dCBlbGVtZW50IChvciBlbmQoKSkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBlcmFzZSB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRodXMKKyAgICAgICAqICBzaG9ydGVuIHRoZSAlZGVxdWUgYnkgb25lLgorICAgICAgICoKKyAgICAgICAqICBUaGUgdXNlciBpcyBjYXV0aW9uZWQgdGhhdAorICAgICAgICogIHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50IGlzCisgICAgICAgKiAgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuCisgICAgICAgKiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhIHJhbmdlIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50IHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgcG9pbnRlZCB0byBieSBAYSBsYXN0CisgICAgICAgKiAgICAgICAgICAgcHJpb3IgdG8gZXJhc2luZyAob3IgZW5kKCkpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgZXJhc2UgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZQorICAgICAgICogIFtfX2ZpcnN0LF9fbGFzdCkgYW5kIHNob3J0ZW4gdGhlICVkZXF1ZSBhY2NvcmRpbmdseS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHVzZXIgaXMgY2F1dGlvbmVkIHRoYXQKKyAgICAgICAqICB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkKKyAgICAgICAqICB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJWRlcXVlIG9mIHRoZSBzYW1lIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBleGNoYW5nZXMgdGhlIGVsZW1lbnRzIGJldHdlZW4gdHdvIGRlcXVlcyBpbiBjb25zdGFudCB0aW1lLgorICAgICAgICogIChGb3VyIHBvaW50ZXJzLCBzbyBpdCBzaG91bGQgYmUgcXVpdGUgZmFzdC4pCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBnbG9iYWwgc3RkOjpzd2FwKCkgZnVuY3Rpb24gaXMgc3BlY2lhbGl6ZWQgc3VjaCB0aGF0CisgICAgICAgKiAgc3RkOjpzd2FwKGQxLGQyKSB3aWxsIGZlZWQgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3dhcChkZXF1ZSYgX194KQorICAgICAgeworCXN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCBfX3guX01faW1wbC5fTV9zdGFydCk7CisJc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLCBfX3guX01faW1wbC5fTV9maW5pc2gpOworCXN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX21hcCwgX194Ll9NX2ltcGwuX01fbWFwKTsKKwlzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9tYXBfc2l6ZSwgX194Ll9NX2ltcGwuX01fbWFwX3NpemUpOworCisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDQzMS4gU3dhcHBpbmcgY29udGFpbmVycyB3aXRoIHVuZXF1YWwgYWxsb2NhdG9ycy4KKwlzdGQ6Ol9fYWxsb2Nfc3dhcDxfVHBfYWxsb2NfdHlwZT46Ol9TX2RvX2l0KF9NX2dldF9UcF9hbGxvY2F0b3IoKSwKKwkJCQkJCSAgICBfX3guX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgRXJhc2VzIGFsbCB0aGUgZWxlbWVudHMuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUKKyAgICAgICAqICBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUKKyAgICAgICAqICBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMKKyAgICAgICAqICB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX2VyYXNlX2F0X2VuZChiZWdpbigpKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gSW50ZXJuYWwgY29uc3RydWN0b3IgZnVuY3Rpb25zIGZvbGxvdy4KKworICAgICAgLy8gY2FsbGVkIGJ5IHRoZSByYW5nZSBjb25zdHJ1Y3RvciB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBfX3RydWVfdHlwZSkKKyAgICAgICAgeworCSAgX01faW5pdGlhbGl6ZV9tYXAoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX24pKTsKKwkgIF9NX2ZpbGxfaW5pdGlhbGl6ZShfX3gpOworCX0KKworICAgICAgLy8gY2FsbGVkIGJ5IHRoZSByYW5nZSBjb25zdHJ1Y3RvciB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgICAgICAgX19mYWxzZV90eXBlKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6CisJICAgIGl0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyQ2F0ZWdvcnk7CisJICBfTV9yYW5nZV9pbml0aWFsaXplKF9fZmlyc3QsIF9fbGFzdCwgX0l0ZXJDYXRlZ29yeSgpKTsKKwl9CisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgc2Vjb25kIGluaXRpYWxpemVfZGlzcGF0Y2ggYWJvdmUKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaWxscyB0aGUgZGVxdWUgd2l0aCB3aGF0ZXZlciBpcyBpbiBbZmlyc3QsbGFzdCkuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHJldHVybiAgIE5vdGhpbmcuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBpdGVyYXRvcnMgYXJlIGFjdHVhbGx5IGZvcndhcmQgaXRlcmF0b3JzIChvciBiZXR0ZXIpLCB0aGVuIHRoZQorICAgICAgICogIG1lbW9yeSBsYXlvdXQgY2FuIGJlIGRvbmUgYWxsIGF0IG9uY2UuICBFbHNlIHdlIG1vdmUgZm9yd2FyZCB1c2luZworICAgICAgICogIHB1c2hfYmFjayBvbiBlYWNoIHZhbHVlIGZyb20gdGhlIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZyk7CisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgc2Vjb25kIGluaXRpYWxpemVfZGlzcGF0Y2ggYWJvdmUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkJICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpOworICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmlsbHMgdGhlICVkZXF1ZSB3aXRoIGNvcGllcyBvZiB2YWx1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsdWUgIEluaXRpYWwgdmFsdWUuCisgICAgICAgKiAgQHJldHVybiAgIE5vdGhpbmcuCisgICAgICAgKiAgQHByZSBfTV9zdGFydCBhbmQgX01fZmluaXNoIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLAorICAgICAgICogIGJ1dCBub25lIG9mIHRoZSAlZGVxdWUncyBlbGVtZW50cyBoYXZlIHlldCBiZWVuIGNvbnN0cnVjdGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIHVzZXIgcHJvdmlkZXMgYW4gZXhwbGljaXQgc2l6ZQorICAgICAgICogICh3aXRoIG9yIHdpdGhvdXQgYW4gZXhwbGljaXQgZXhlbXBsYXIgdmFsdWUpLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBfTV9maWxsX2luaXRpYWxpemUoY29uc3QgdmFsdWVfdHlwZSYgX192YWx1ZSk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBjYWxsZWQgYnkgZGVxdWUobikuCisgICAgICB2b2lkCisgICAgICBfTV9kZWZhdWx0X2luaXRpYWxpemUoKTsKKyNlbmRpZgorCisgICAgICAvLyBJbnRlcm5hbCBhc3NpZ24gZnVuY3Rpb25zIGZvbGxvdy4gIFRoZSAqX2F1eCBmdW5jdGlvbnMgZG8gdGhlIGFjdHVhbAorICAgICAgLy8gYXNzaWdubWVudCB3b3JrIGZvciB0aGUgcmFuZ2UgdmVyc2lvbnMuCisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgcmFuZ2UgYXNzaWduIHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzOC4gQW1iaWd1aXR5IGluIHRoZSAiZG8gdGhlIHJpZ2h0IHRoaW5nIiBjbGF1c2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlZ2VyPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLCBfX3RydWVfdHlwZSkKKyAgICAgICAgeyBfTV9maWxsX2Fzc2lnbihfX24sIF9fdmFsKTsgfQorCisgICAgICAvLyBjYWxsZWQgYnkgdGhlIHJhbmdlIGFzc2lnbiB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIF9fZmFsc2VfdHlwZSkKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OgorCSAgICBpdGVyYXRvcl9jYXRlZ29yeSBfSXRlckNhdGVnb3J5OworCSAgX01fYXNzaWduX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9JdGVyQ2F0ZWdvcnkoKSk7CisJfQorCisgICAgICAvLyBjYWxsZWQgYnkgdGhlIHNlY29uZCBhc3NpZ25fZGlzcGF0Y2ggYWJvdmUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2Fzc2lnbl9hdXgoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZyk7CisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgc2Vjb25kIGFzc2lnbl9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9hc3NpZ25fYXV4KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICAgIHsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKwkgIGlmIChfX2xlbiA+IHNpemUoKSkKKwkgICAgeworCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OworCSAgICAgIHN0ZDo6YWR2YW5jZShfX21pZCwgc2l6ZSgpKTsKKwkgICAgICBzdGQ6OmNvcHkoX19maXJzdCwgX19taWQsIGJlZ2luKCkpOworCSAgICAgIGluc2VydChlbmQoKSwgX19taWQsIF9fbGFzdCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgX01fZXJhc2VfYXRfZW5kKHN0ZDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCkpKTsKKwl9CisKKyAgICAgIC8vIENhbGxlZCBieSBhc3NpZ24obix0KSwgYW5kIHRoZSByYW5nZSBhc3NpZ24gd2hlbiBpdCB0dXJucyBvdXQKKyAgICAgIC8vIHRvIGJlIHRoZSBzYW1lIHRoaW5nLgorICAgICAgdm9pZAorICAgICAgX01fZmlsbF9hc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpCisgICAgICB7CisJaWYgKF9fbiA+IHNpemUoKSkKKwkgIHsKKwkgICAgc3RkOjpmaWxsKGJlZ2luKCksIGVuZCgpLCBfX3ZhbCk7CisJICAgIGluc2VydChlbmQoKSwgX19uIC0gc2l6ZSgpLCBfX3ZhbCk7CisJICB9CisJZWxzZQorCSAgeworCSAgICBfTV9lcmFzZV9hdF9lbmQoYmVnaW4oKSArIGRpZmZlcmVuY2VfdHlwZShfX24pKTsKKwkgICAgc3RkOjpmaWxsKGJlZ2luKCksIGVuZCgpLCBfX3ZhbCk7CisJICB9CisgICAgICB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBwdXNoXyogYW5kIHBvcF8qLgorI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAgICAgdm9pZCBfTV9wdXNoX2JhY2tfYXV4KGNvbnN0IHZhbHVlX3R5cGUmKTsKKworICAgICAgdm9pZCBfTV9wdXNoX2Zyb250X2F1eChjb25zdCB2YWx1ZV90eXBlJik7CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQgX01fcHVzaF9iYWNrX2F1eChfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkIF9NX3B1c2hfZnJvbnRfYXV4KF9BcmdzJiYuLi4gX19hcmdzKTsKKyNlbmRpZgorCisgICAgICB2b2lkIF9NX3BvcF9iYWNrX2F1eCgpOworCisgICAgICB2b2lkIF9NX3BvcF9mcm9udF9hdXgoKTsKKyAgICAgIC8vQH0KKworICAgICAgLy8gSW50ZXJuYWwgaW5zZXJ0IGZ1bmN0aW9ucyBmb2xsb3cuICBUaGUgKl9hdXggZnVuY3Rpb25zIGRvIHRoZSBhY3R1YWwKKyAgICAgIC8vIGluc2VydGlvbiB3b3JrIHdoZW4gYWxsIHNob3J0Y3V0cyBmYWlsLgorCisgICAgICAvLyBjYWxsZWQgYnkgdGhlIHJhbmdlIGluc2VydCB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCisJCQkgICBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgX190cnVlX3R5cGUpCisgICAgICAgIHsgX01fZmlsbF9pbnNlcnQoX19wb3MsIF9fbiwgX194KTsgfQorCisgICAgICAvLyBjYWxsZWQgYnkgdGhlIHJhbmdlIGluc2VydCB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLAorCQkJICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJICAgX19mYWxzZV90eXBlKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6CisJICAgIGl0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyQ2F0ZWdvcnk7CisgICAgICAgICAgX01fcmFuZ2VfaW5zZXJ0X2F1eChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSXRlckNhdGVnb3J5KCkpOworCX0KKworICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBzZWNvbmQgaW5zZXJ0X2Rpc3BhdGNoIGFib3ZlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9yYW5nZV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpOworCisgICAgICAvLyBjYWxsZWQgYnkgdGhlIHNlY29uZCBpbnNlcnRfZGlzcGF0Y2ggYWJvdmUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fcmFuZ2VfaW5zZXJ0X2F1eChpdGVyYXRvciBfX3BvcywgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IGluc2VydChwLG4seCksIGFuZCB0aGUgcmFuZ2UgaW5zZXJ0IHdoZW4gaXQgdHVybnMgb3V0IHRvIGJlCisgICAgICAvLyB0aGUgc2FtZSB0aGluZy4gIENhbiB1c2UgZmlsbCBmdW5jdGlvbnMgaW4gb3B0aW1hbCBzaXR1YXRpb25zLAorICAgICAgLy8gb3RoZXJ3aXNlIHBhc3NlcyBvZmYgdG8gaW5zZXJ0X2F1eChwLG4seCkuCisgICAgICB2b2lkCisgICAgICBfTV9maWxsX2luc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKworICAgICAgLy8gY2FsbGVkIGJ5IGluc2VydChwLHgpCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2VuZGlmCisKKyAgICAgIC8vIGNhbGxlZCBieSBpbnNlcnQocCxuLHgpIHZpYSBmaWxsX2luc2VydAorICAgICAgdm9pZAorICAgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKworICAgICAgLy8gY2FsbGVkIGJ5IHJhbmdlX2luc2VydF9hdXggZm9yIGZvcndhcmQgaXRlcmF0b3JzCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsCisJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIHNpemVfdHlwZSBfX24pOworCisKKyAgICAgIC8vIEludGVybmFsIGVyYXNlIGZ1bmN0aW9ucyBmb2xsb3cuCisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3lfZGF0YV9hdXgoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IH5kZXF1ZSgpLgorICAgICAgLy8gTkI6IERvZXNuJ3QgZGVhbGxvY2F0ZSB0aGUgbm9kZXMuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MxPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2Rlc3Ryb3lfZGF0YShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9BbGxvYzEmKQorICAgICAgICB7IF9NX2Rlc3Ryb3lfZGF0YV9hdXgoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kZXN0cm95X2RhdGEoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LAorCQkgICAgICBjb25zdCBzdGQ6OmFsbG9jYXRvcjxfVHA+JikKKyAgICAgIHsKKwlpZiAoIV9faGFzX3RyaXZpYWxfZGVzdHJ1Y3Rvcih2YWx1ZV90eXBlKSkKKwkgIF9NX2Rlc3Ryb3lfZGF0YV9hdXgoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIH0KKworICAgICAgLy8gQ2FsbGVkIGJ5IGVyYXNlKHExLCBxMikuCisgICAgICB2b2lkCisgICAgICBfTV9lcmFzZV9hdF9iZWdpbihpdGVyYXRvciBfX3BvcykKKyAgICAgIHsKKwlfTV9kZXN0cm95X2RhdGEoYmVnaW4oKSwgX19wb3MsIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJX01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX25vZGUsIF9fcG9zLl9NX25vZGUpOworCXRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX3BvczsKKyAgICAgIH0KKworICAgICAgLy8gQ2FsbGVkIGJ5IGVyYXNlKHExLCBxMiksIHJlc2l6ZSgpLCBjbGVhcigpLCBfTV9hc3NpZ25fYXV4LAorICAgICAgLy8gX01fZmlsbF9hc3NpZ24sIG9wZXJhdG9yPS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2VyYXNlX2F0X2VuZChpdGVyYXRvciBfX3BvcykKKyAgICAgIHsKKwlfTV9kZXN0cm95X2RhdGEoX19wb3MsIGVuZCgpLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCV9NX2Rlc3Ryb3lfbm9kZXMoX19wb3MuX01fbm9kZSArIDEsCisJCQkgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSArIDEpOworCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19wb3M7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBDYWxsZWQgYnkgcmVzaXplKHN6KS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlZmF1bHRfYXBwZW5kKHNpemVfdHlwZSBfX24pOworCisgICAgICBib29sCisgICAgICBfTV9zaHJpbmtfdG9fZml0KCk7CisjZW5kaWYKKworICAgICAgLy9AeworICAgICAgLy8vIE1lbW9yeS1oYW5kbGluZyBoZWxwZXJzIGZvciB0aGUgcHJldmlvdXMgaW50ZXJuYWwgaW5zZXJ0IGZ1bmN0aW9ucy4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KHNpemVfdHlwZSBfX24pCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fdmFjYW5jaWVzID0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fZmlyc3Q7CisJaWYgKF9fbiA+IF9fdmFjYW5jaWVzKQorCSAgX01fbmV3X2VsZW1lbnRzX2F0X2Zyb250KF9fbiAtIF9fdmFjYW5jaWVzKTsKKwlyZXR1cm4gdGhpcy0+X01faW1wbC5fTV9zdGFydCAtIGRpZmZlcmVuY2VfdHlwZShfX24pOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fdmFjYW5jaWVzID0gKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2xhc3QKKwkJCQkgICAgICAgLSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIpIC0gMTsKKwlpZiAoX19uID4gX192YWNhbmNpZXMpCisJICBfTV9uZXdfZWxlbWVudHNfYXRfYmFjayhfX24gLSBfX3ZhY2FuY2llcyk7CisJcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICsgZGlmZmVyZW5jZV90eXBlKF9fbik7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX25ld19lbGVtZW50c19hdF9mcm9udChzaXplX3R5cGUgX19uZXdfZWxlbWVudHMpOworCisgICAgICB2b2lkCisgICAgICBfTV9uZXdfZWxlbWVudHNfYXRfYmFjayhzaXplX3R5cGUgX19uZXdfZWxlbWVudHMpOworICAgICAgLy9AfQorCisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBNZW1vcnktaGFuZGxpbmcgaGVscGVycyBmb3IgdGhlIG1ham9yICVtYXAuCisgICAgICAgKgorICAgICAgICogIE1ha2VzIHN1cmUgdGhlIF9NX21hcCBoYXMgc3BhY2UgZm9yIG5ldyBub2Rlcy4gIERvZXMgbm90CisgICAgICAgKiAgYWN0dWFsbHkgYWRkIHRoZSBub2Rlcy4gIENhbiBpbnZhbGlkYXRlIF9NX21hcCBwb2ludGVycy4KKyAgICAgICAqICAoQW5kIGNvbnNlcXVlbnRseSwgJWRlcXVlIGl0ZXJhdG9ycy4pCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIF9NX3Jlc2VydmVfbWFwX2F0X2JhY2soc2l6ZV90eXBlIF9fbm9kZXNfdG9fYWRkID0gMSkKKyAgICAgIHsKKwlpZiAoX19ub2Rlc190b19hZGQgKyAxID4gdGhpcy0+X01faW1wbC5fTV9tYXBfc2l6ZQorCSAgICAtICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlIC0gdGhpcy0+X01faW1wbC5fTV9tYXApKQorCSAgX01fcmVhbGxvY2F0ZV9tYXAoX19ub2Rlc190b19hZGQsIGZhbHNlKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fcmVzZXJ2ZV9tYXBfYXRfZnJvbnQoc2l6ZV90eXBlIF9fbm9kZXNfdG9fYWRkID0gMSkKKyAgICAgIHsKKwlpZiAoX19ub2Rlc190b19hZGQgPiBzaXplX3R5cGUodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlCisJCQkJICAgICAgIC0gdGhpcy0+X01faW1wbC5fTV9tYXApKQorCSAgX01fcmVhbGxvY2F0ZV9tYXAoX19ub2Rlc190b19hZGQsIHRydWUpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9yZWFsbG9jYXRlX21hcChzaXplX3R5cGUgX19ub2Rlc190b19hZGQsIGJvb2wgX19hZGRfYXRfZnJvbnQpOworICAgICAgLy9AfQorICAgIH07CisKKworICAvKioKKyAgICogIEBicmllZiAgRGVxdWUgZXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICVkZXF1ZS4KKyAgICogIEBwYXJhbSAgX195ICBBICVkZXF1ZSBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIF9feC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIHRoZSBzaXplIGFuZCBlbGVtZW50cyBvZiB0aGUgZGVxdWVzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBkZXF1ZXMuICBEZXF1ZXMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiB0aGVpciBzaXplcyBhcmUgZXF1YWwsCisgICAqICBhbmQgaWYgY29ycmVzcG9uZGluZyBlbGVtZW50cyBjb21wYXJlIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194LnNpemUoKSA9PSBfX3kuc2l6ZSgpCisgICAgICAgICAgICAgJiYgc3RkOjplcXVhbChfX3guYmVnaW4oKSwgX194LmVuZCgpLCBfX3kuYmVnaW4oKSk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgRGVxdWUgb3JkZXJpbmcgcmVsYXRpb24uCisgICAqICBAcGFyYW0gIF9feCAgQSAlZGVxdWUuCisgICAqICBAcGFyYW0gIF9feSAgQSAlZGVxdWUgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSBfX3guCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiBAYSB4IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSBfX3kuCisgICAqCisgICAqICBUaGlzIGlzIGEgdG90YWwgb3JkZXJpbmcgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBkZXF1ZXMuICBUaGUgZWxlbWVudHMgbXVzdCBiZSBjb21wYXJhYmxlIHdpdGggQGMgPC4KKyAgICoKKyAgICogIFNlZSBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKCkgZm9yIGhvdyB0aGUgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9feC5iZWdpbigpLCBfX3guZW5kKCksCisJCQkJCSAgX195LmJlZ2luKCksIF9feS5lbmQoKSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I9PQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgLy8vIFNlZSBzdGQ6OmRlcXVlOjpzd2FwKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChkZXF1ZTxfVHAsX0FsbG9jPiYgX194LCBkZXF1ZTxfVHAsX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisjdW5kZWYgX0dMSUJDWFhfREVRVUVfQlVGX1NJWkUKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX1NUTF9ERVFVRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2Z1bmN0aW9uLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2Z1bmN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1MjlkZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfZnVuY3Rpb24uaApAQCAtMCwwICsxLDczNCBAQAorLy8gRnVuY3RvciBpbXBsZW1lbnRhdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX2Z1bmN0aW9uLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtmdW5jdGlvbmFsfQorICovCisKKyNpZm5kZWYgX1NUTF9GVU5DVElPTl9ICisjZGVmaW5lIF9TVExfRlVOQ1RJT05fSCAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyAyMC4zLjEgYmFzZSBjbGFzc2VzCisgIC8qKiBAZGVmZ3JvdXAgZnVuY3RvcnMgRnVuY3Rpb24gT2JqZWN0cworICAgKiBAaW5ncm91cCB1dGlsaXRpZXMKKyAgICoKKyAgICogIEZ1bmN0aW9uIG9iamVjdHMsIG9yIEBlIGZ1bmN0b3JzLCBhcmUgb2JqZWN0cyB3aXRoIGFuIEBjIG9wZXJhdG9yKCkKKyAgICogIGRlZmluZWQgYW5kIGFjY2Vzc2libGUuICBUaGV5IGNhbiBiZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIGFsZ29yaXRobQorICAgKiAgdGVtcGxhdGVzIGFuZCB1c2VkIGluIHBsYWNlIG9mIGEgZnVuY3Rpb24gcG9pbnRlci4gIE5vdCBvbmx5IGlzIHRoZQorICAgKiAgcmVzdWx0aW5nIGV4cHJlc3NpdmVuZXNzIG9mIHRoZSBsaWJyYXJ5IGluY3JlYXNlZCwgYnV0IHRoZSBnZW5lcmF0ZWQKKyAgICogIGNvZGUgY2FuIGJlIG1vcmUgZWZmaWNpZW50IHRoYW4gd2hhdCB5b3UgbWlnaHQgd3JpdGUgYnkgaGFuZC4gIFdoZW4gd2UKKyAgICogIHJlZmVyIHRvIEBhIGZ1bmN0b3JzLCB0aGVuLCBnZW5lcmFsbHkgd2UgaW5jbHVkZSBmdW5jdGlvbiBwb2ludGVycyBpbgorICAgKiAgdGhlIGRlc2NyaXB0aW9uIGFzIHdlbGwuCisgICAqCisgICAqICBPZnRlbiwgZnVuY3RvcnMgYXJlIG9ubHkgY3JlYXRlZCBhcyB0ZW1wb3JhcmllcyBwYXNzZWQgdG8gYWxnb3JpdGhtCisgICAqICBjYWxscywgcmF0aGVyIHRoYW4gYmVpbmcgY3JlYXRlZCBhcyBuYW1lZCB2YXJpYWJsZXMuCisgICAqCisgICAqICBUd28gZXhhbXBsZXMgdGFrZW4gZnJvbSB0aGUgc3RhbmRhcmQgaXRzZWxmIGZvbGxvdy4gIFRvIHBlcmZvcm0gYQorICAgKiAgYnktZWxlbWVudCBhZGRpdGlvbiBvZiB0d28gdmVjdG9ycyBAYyBhIGFuZCBAYyBiIGNvbnRhaW5pbmcgQGMgZG91YmxlLAorICAgKiAgYW5kIHB1dCB0aGUgcmVzdWx0IGluIEBjIGEsIHVzZQorICAgKiAgXGNvZGUKKyAgICogIHRyYW5zZm9ybSAoYS5iZWdpbigpLCBhLmVuZCgpLCBiLmJlZ2luKCksIGEuYmVnaW4oKSwgcGx1czxkb3VibGU+KCkpOworICAgKiAgXGVuZGNvZGUKKyAgICogIFRvIG5lZ2F0ZSBldmVyeSBlbGVtZW50IGluIEBjIGEsIHVzZQorICAgKiAgXGNvZGUKKyAgICogIHRyYW5zZm9ybShhLmJlZ2luKCksIGEuZW5kKCksIGEuYmVnaW4oKSwgbmVnYXRlPGRvdWJsZT4oKSk7CisgICAqICBcZW5kY29kZQorICAgKiAgVGhlIGFkZGl0aW9uIGFuZCBuZWdhdGlvbiBmdW5jdGlvbnMgd2lsbCBiZSBpbmxpbmVkIGRpcmVjdGx5LgorICAgKgorICAgKiAgVGhlIHN0YW5kYXJkIGZ1bmN0b3JzIGFyZSBkZXJpdmVkIGZyb20gc3RydWN0cyBuYW1lZCBAYyB1bmFyeV9mdW5jdGlvbgorICAgKiAgYW5kIEBjIGJpbmFyeV9mdW5jdGlvbi4gIFRoZXNlIHR3byBjbGFzc2VzIGNvbnRhaW4gbm90aGluZyBidXQgdHlwZWRlZnMsCisgICAqICB0byBhaWQgaW4gZ2VuZXJpYyAodGVtcGxhdGUpIHByb2dyYW1taW5nLiAgSWYgeW91IHdyaXRlIHlvdXIgb3duCisgICAqICBmdW5jdG9ycywgeW91IG1pZ2h0IGNvbnNpZGVyIGRvaW5nIHRoZSBzYW1lLgorICAgKgorICAgKiAgQHsKKyAgICovCisgIC8qKgorICAgKiAgVGhpcyBpcyBvbmUgb2YgdGhlIEBsaW5rIGZ1bmN0b3JzIGZ1bmN0b3IgYmFzZSBjbGFzc2VzQGVuZGxpbmsuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZSBfUmVzdWx0PgorICAgIHN0cnVjdCB1bmFyeV9mdW5jdGlvbgorICAgIHsKKyAgICAgIC8vLyBAYyBhcmd1bWVudF90eXBlIGlzIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudAorICAgICAgdHlwZWRlZiBfQXJnIAlhcmd1bWVudF90eXBlOyAgIAorCisgICAgICAvLy8gQGMgcmVzdWx0X3R5cGUgaXMgdGhlIHJldHVybiB0eXBlCisgICAgICB0eXBlZGVmIF9SZXN1bHQgCXJlc3VsdF90eXBlOyAgCisgICAgfTsKKworICAvKioKKyAgICogIFRoaXMgaXMgb25lIG9mIHRoZSBAbGluayBmdW5jdG9ycyBmdW5jdG9yIGJhc2UgY2xhc3Nlc0BlbmRsaW5rLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZzEsIHR5cGVuYW1lIF9BcmcyLCB0eXBlbmFtZSBfUmVzdWx0PgorICAgIHN0cnVjdCBiaW5hcnlfZnVuY3Rpb24KKyAgICB7CisgICAgICAvLy8gQGMgZmlyc3RfYXJndW1lbnRfdHlwZSBpcyB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgYXJndW1lbnQKKyAgICAgIHR5cGVkZWYgX0FyZzEgCWZpcnN0X2FyZ3VtZW50X3R5cGU7IAorCisgICAgICAvLy8gQGMgc2Vjb25kX2FyZ3VtZW50X3R5cGUgaXMgdGhlIHR5cGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudAorICAgICAgdHlwZWRlZiBfQXJnMiAJc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisKKyAgICAgIC8vLyBAYyByZXN1bHRfdHlwZSBpcyB0aGUgcmV0dXJuIHR5cGUKKyAgICAgIHR5cGVkZWYgX1Jlc3VsdCAJcmVzdWx0X3R5cGU7CisgICAgfTsKKyAgLyoqIEB9ICAqLworCisgIC8vIDIwLjMuMiBhcml0aG1ldGljCisgIC8qKiBAZGVmZ3JvdXAgYXJpdGhtZXRpY19mdW5jdG9ycyBBcml0aG1ldGljIENsYXNzZXMKKyAgICogQGluZ3JvdXAgZnVuY3RvcnMKKyAgICoKKyAgICogIEJlY2F1c2UgYmFzaWMgbWF0aCBvZnRlbiBuZWVkcyB0byBiZSBkb25lIGR1cmluZyBhbiBhbGdvcml0aG0sCisgICAqICB0aGUgbGlicmFyeSBwcm92aWRlcyBmdW5jdG9ycyBmb3IgdGhvc2Ugb3BlcmF0aW9ucy4gIFNlZSB0aGUKKyAgICogIGRvY3VtZW50YXRpb24gZm9yIEBsaW5rIGZ1bmN0b3JzIHRoZSBiYXNlIGNsYXNzZXNAZW5kbGluaworICAgKiAgZm9yIGV4YW1wbGVzIG9mIHRoZWlyIHVzZS4KKyAgICoKKyAgICogIEB7CisgICAqLworICAvLy8gT25lIG9mIHRoZSBAbGluayBhcml0aG1ldGljX2Z1bmN0b3JzIG1hdGggZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBwbHVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPgorICAgIHsKKyAgICAgIF9UcAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggKyBfX3k7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGFyaXRobWV0aWNfZnVuY3RvcnMgbWF0aCBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG1pbnVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPgorICAgIHsKKyAgICAgIF9UcAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggLSBfX3k7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGFyaXRobWV0aWNfZnVuY3RvcnMgbWF0aCBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG11bHRpcGxpZXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+CisgICAgeworICAgICAgX1RwCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAqIF9feTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgYXJpdGhtZXRpY19mdW5jdG9ycyBtYXRoIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgZGl2aWRlcyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KKyAgICB7CisgICAgICBfVHAKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IC8gX195OyB9CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBhcml0aG1ldGljX2Z1bmN0b3JzIG1hdGggZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBtb2R1bHVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPgorICAgIHsKKyAgICAgIF9UcAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggJSBfX3k7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGFyaXRobWV0aWNfZnVuY3RvcnMgbWF0aCBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG5lZ2F0ZSA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsIF9UcD4KKyAgICB7CisgICAgICBfVHAKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiAtX194OyB9CisgICAgfTsKKyAgLyoqIEB9ICAqLworCisgIC8vIDIwLjMuMyBjb21wYXJpc29ucworICAvKiogQGRlZmdyb3VwIGNvbXBhcmlzb25fZnVuY3RvcnMgQ29tcGFyaXNvbiBDbGFzc2VzCisgICAqIEBpbmdyb3VwIGZ1bmN0b3JzCisgICAqCisgICAqICBUaGUgbGlicmFyeSBwcm92aWRlcyBzaXggd3JhcHBlciBmdW5jdG9ycyBmb3IgYWxsIHRoZSBiYXNpYyBjb21wYXJpc29ucworICAgKiAgaW4gQysrLCBsaWtlIEBjIDwuCisgICAqCisgICAqICBAeworICAgKi8KKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgY29tcGFyaXNvbl9mdW5jdG9ycyBjb21wYXJpc29uIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgZXF1YWxfdG8gOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ID09IF9feTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgY29tcGFyaXNvbl9mdW5jdG9ycyBjb21wYXJpc29uIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3Qgbm90X2VxdWFsX3RvIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4KKyAgICB7CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAhPSBfX3k7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGNvbXBhcmlzb25fZnVuY3RvcnMgY29tcGFyaXNvbiBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGdyZWF0ZXIgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ID4gX195OyB9CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBjb21wYXJpc29uX2Z1bmN0b3JzIGNvbXBhcmlzb24gZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBsZXNzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4KKyAgICB7CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCA8IF9feTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgY29tcGFyaXNvbl9mdW5jdG9ycyBjb21wYXJpc29uIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgZ3JlYXRlcl9lcXVhbCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+CisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggPj0gX195OyB9CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBjb21wYXJpc29uX2Z1bmN0b3JzIGNvbXBhcmlzb24gZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBsZXNzX2VxdWFsIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4KKyAgICB7CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCA8PSBfX3k7IH0KKyAgICB9OworICAvKiogQH0gICovCisKKyAgLy8gMjAuMy40IGxvZ2ljYWwgb3BlcmF0aW9ucworICAvKiogQGRlZmdyb3VwIGxvZ2ljYWxfZnVuY3RvcnMgQm9vbGVhbiBPcGVyYXRpb25zIENsYXNzZXMKKyAgICogQGluZ3JvdXAgZnVuY3RvcnMKKyAgICoKKyAgICogIEhlcmUgYXJlIHdyYXBwZXIgZnVuY3RvcnMgZm9yIEJvb2xlYW4gb3BlcmF0aW9uczogQGMgJiYsIEBjIHx8LAorICAgKiAgYW5kIEBjICEuCisgICAqCisgICAqICBAeworICAgKi8KKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbG9naWNhbF9mdW5jdG9ycyBCb29sZWFuIG9wZXJhdGlvbnMgZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBsb2dpY2FsX2FuZCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+CisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggJiYgX195OyB9CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBsb2dpY2FsX2Z1bmN0b3JzIEJvb2xlYW4gb3BlcmF0aW9ucyBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGxvZ2ljYWxfb3IgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IHx8IF9feTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbG9naWNhbF9mdW5jdG9ycyBCb29sZWFuIG9wZXJhdGlvbnMgZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBsb2dpY2FsX25vdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsIGJvb2w+CisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICFfX3g7IH0KKyAgICB9OworICAvKiogQH0gICovCisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyBEUiA2NjAuIE1pc3NpbmcgQml0d2lzZSBPcGVyYXRpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGJpdF9hbmQgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+CisgICAgeworICAgICAgX1RwCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAmIF9feTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBiaXRfb3IgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+CisgICAgeworICAgICAgX1RwCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCB8IF9feTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBiaXRfeG9yIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPgorICAgIHsKKyAgICAgIF9UcAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggXiBfX3k7IH0KKyAgICB9OworCisgIC8vIDIwLjMuNSBuZWdhdG9ycworICAvKiogQGRlZmdyb3VwIG5lZ2F0b3JzIE5lZ2F0b3JzCisgICAqIEBpbmdyb3VwIGZ1bmN0b3JzCisgICAqCisgICAqICBUaGUgZnVuY3Rpb25zIEBjIG5vdDEgYW5kIEBjIG5vdDIgZWFjaCB0YWtlIGEgcHJlZGljYXRlIGZ1bmN0b3IKKyAgICogIGFuZCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgQGMgdW5hcnlfbmVnYXRlIG9yCisgICAqICBAYyBiaW5hcnlfbmVnYXRlLCByZXNwZWN0aXZlbHkuICBUaGVzZSBjbGFzc2VzIGFyZSBmdW5jdG9ycyB3aG9zZQorICAgKiAgQGMgb3BlcmF0b3IoKSBwZXJmb3JtcyB0aGUgc3RvcmVkIHByZWRpY2F0ZSBmdW5jdGlvbiBhbmQgdGhlbiByZXR1cm5zCisgICAqICB0aGUgbmVnYXRpb24gb2YgdGhlIHJlc3VsdC4KKyAgICoKKyAgICogIEZvciBleGFtcGxlLCBnaXZlbiBhIHZlY3RvciBvZiBpbnRlZ2VycyBhbmQgYSB0cml2aWFsIHByZWRpY2F0ZSwKKyAgICogIFxjb2RlCisgICAqICBzdHJ1Y3QgSW50R3JlYXRlclRoYW5UaHJlZQorICAgKiAgICA6IHB1YmxpYyBzdGQ6OnVuYXJ5X2Z1bmN0aW9uPGludCwgYm9vbD4KKyAgICogIHsKKyAgICogICAgICBib29sIG9wZXJhdG9yKCkgKGludCB4KSB7IHJldHVybiB4ID4gMzsgfQorICAgKiAgfTsKKyAgICoKKyAgICogIHN0ZDo6ZmluZF9pZiAodi5iZWdpbigpLCB2LmVuZCgpLCBub3QxKEludEdyZWF0ZXJUaGFuVGhyZWUoKSkpOworICAgKiAgXGVuZGNvZGUKKyAgICogIFRoZSBjYWxsIHRvIEBjIGZpbmRfaWYgd2lsbCBsb2NhdGUgdGhlIGZpcnN0IGluZGV4IChpKSBvZiBAYyB2IGZvciB3aGljaAorICAgKiAgPGNvZGU+ISh2W2ldID4gMyk8L2NvZGU+IGlzIHRydWUuCisgICAqCisgICAqICBUaGUgbm90MS91bmFyeV9uZWdhdGUgY29tYmluYXRpb24gd29ya3Mgb24gcHJlZGljYXRlcyB0YWtpbmcgYSBzaW5nbGUKKyAgICogIGFyZ3VtZW50LiAgVGhlIG5vdDIvYmluYXJ5X25lZ2F0ZSBjb21iaW5hdGlvbiB3b3JrcyBvbiBwcmVkaWNhdGVzIHdoaWNoCisgICAqICB0YWtlIHR3byBhcmd1bWVudHMuCisgICAqCisgICAqICBAeworICAgKi8KKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbmVnYXRvcnMgbmVnYXRpb24gZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBjbGFzcyB1bmFyeV9uZWdhdGUKKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfUHJlZGljYXRlOjphcmd1bWVudF90eXBlLCBib29sPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfUHJlZGljYXRlIF9NX3ByZWQ7CisKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgdW5hcnlfbmVnYXRlKGNvbnN0IF9QcmVkaWNhdGUmIF9feCkgOiBfTV9wcmVkKF9feCkgeyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgX1ByZWRpY2F0ZTo6YXJndW1lbnRfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gIV9NX3ByZWQoX194KTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbmVnYXRvcnMgbmVnYXRpb24gZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgdW5hcnlfbmVnYXRlPF9QcmVkaWNhdGU+CisgICAgbm90MShjb25zdCBfUHJlZGljYXRlJiBfX3ByZWQpCisgICAgeyByZXR1cm4gdW5hcnlfbmVnYXRlPF9QcmVkaWNhdGU+KF9fcHJlZCk7IH0KKworICAvLy8gT25lIG9mIHRoZSBAbGluayBuZWdhdG9ycyBuZWdhdGlvbiBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGNsYXNzIGJpbmFyeV9uZWdhdGUKKyAgICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX1ByZWRpY2F0ZTo6Zmlyc3RfYXJndW1lbnRfdHlwZSwKKwkJCSAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZTo6c2Vjb25kX2FyZ3VtZW50X3R5cGUsIGJvb2w+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9QcmVkaWNhdGUgX01fcHJlZDsKKworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBiaW5hcnlfbmVnYXRlKGNvbnN0IF9QcmVkaWNhdGUmIF9feCkgOiBfTV9wcmVkKF9feCkgeyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgX1ByZWRpY2F0ZTo6Zmlyc3RfYXJndW1lbnRfdHlwZSYgX194LAorCQkgY29uc3QgdHlwZW5hbWUgX1ByZWRpY2F0ZTo6c2Vjb25kX2FyZ3VtZW50X3R5cGUmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuICFfTV9wcmVkKF9feCwgX195KTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbmVnYXRvcnMgbmVnYXRpb24gZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYmluYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPgorICAgIG5vdDIoY29uc3QgX1ByZWRpY2F0ZSYgX19wcmVkKQorICAgIHsgcmV0dXJuIGJpbmFyeV9uZWdhdGU8X1ByZWRpY2F0ZT4oX19wcmVkKTsgfQorICAvKiogQH0gICovCisKKyAgLy8gMjAuMy43IGFkYXB0b3JzIHBvaW50ZXJzIGZ1bmN0aW9ucworICAvKiogQGRlZmdyb3VwIHBvaW50ZXJfYWRhcHRvcnMgQWRhcHRvcnMgZm9yIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucworICAgKiBAaW5ncm91cCBmdW5jdG9ycworICAgKgorICAgKiAgVGhlIGFkdmFudGFnZSBvZiBmdW5jdGlvbiBvYmplY3RzIG92ZXIgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGlzIHRoYXQKKyAgICogIHRoZSBvYmplY3RzIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGRlY2xhcmUgbmVzdGVkIHR5cGVkZWZzIGRlc2NyaWJpbmcKKyAgICogIHRoZWlyIGFyZ3VtZW50IGFuZCByZXN1bHQgdHlwZXMgd2l0aCB1bmlmb3JtIG5hbWVzIChlLmcuLCBAYyByZXN1bHRfdHlwZQorICAgKiAgZnJvbSB0aGUgYmFzZSBjbGFzc2VzIEBjIHVuYXJ5X2Z1bmN0aW9uIGFuZCBAYyBiaW5hcnlfZnVuY3Rpb24pLgorICAgKiAgU29tZXRpbWVzIHRob3NlIHR5cGVkZWZzIGFyZSByZXF1aXJlZCwgbm90IGp1c3Qgb3B0aW9uYWwuCisgICAqCisgICAqICBBZGFwdG9ycyBhcmUgcHJvdmlkZWQgdG8gdHVybiBwb2ludGVycyB0byB1bmFyeSAoc2luZ2xlLWFyZ3VtZW50KSBhbmQKKyAgICogIGJpbmFyeSAoZG91YmxlLWFyZ3VtZW50KSBmdW5jdGlvbnMgaW50byBmdW5jdGlvbiBvYmplY3RzLiAgVGhlCisgICAqICBsb25nLXdpbmRlZCBmdW5jdG9yIEBjIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24gaXMgY29uc3RydWN0ZWQgd2l0aCBhCisgICAqICBmdW5jdGlvbiBwb2ludGVyIEBjIGYsIGFuZCBpdHMgQGMgb3BlcmF0b3IoKSBjYWxsZWQgd2l0aCBhcmd1bWVudCBAYyB4CisgICAqICByZXR1cm5zIEBjIGYoeCkuICBUaGUgZnVuY3RvciBAYyBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbiBkb2VzIHRoZSBzYW1lCisgICAqICB0aGluZywgYnV0IHdpdGggYSBkb3VibGUtYXJndW1lbnQgQGMgZiBhbmQgQGMgb3BlcmF0b3IoKS4KKyAgICoKKyAgICogIFRoZSBmdW5jdGlvbiBAYyBwdHJfZnVuIHRha2VzIGEgcG9pbnRlci10by1mdW5jdGlvbiBAYyBmIGFuZCBjb25zdHJ1Y3RzCisgICAqICBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rvci4KKyAgICoKKyAgICogIEB7CisgICAqLworICAvLy8gT25lIG9mIHRoZSBAbGluayBwb2ludGVyX2FkYXB0b3JzIGFkYXB0b3JzIGZvciBmdW5jdGlvbiBwb2ludGVyc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZSBfUmVzdWx0PgorICAgIGNsYXNzIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24gOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X0FyZywgX1Jlc3VsdD4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX1Jlc3VsdCAoKl9NX3B0cikoX0FyZyk7CisKKyAgICBwdWJsaWM6CisgICAgICBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uKF9SZXN1bHQgKCpfX3gpKF9BcmcpKQorICAgICAgOiBfTV9wdHIoX194KSB7IH0KKworICAgICAgX1Jlc3VsdAorICAgICAgb3BlcmF0b3IoKShfQXJnIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3B0cihfX3gpOyB9CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBwb2ludGVyX2FkYXB0b3JzIGFkYXB0b3JzIGZvciBmdW5jdGlvbiBwb2ludGVyc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZSBfUmVzdWx0PgorICAgIGlubGluZSBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uPF9BcmcsIF9SZXN1bHQ+CisgICAgcHRyX2Z1bihfUmVzdWx0ICgqX194KShfQXJnKSkKKyAgICB7IHJldHVybiBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uPF9BcmcsIF9SZXN1bHQ+KF9feCk7IH0KKworICAvLy8gT25lIG9mIHRoZSBAbGluayBwb2ludGVyX2FkYXB0b3JzIGFkYXB0b3JzIGZvciBmdW5jdGlvbiBwb2ludGVyc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnMSwgdHlwZW5hbWUgX0FyZzIsIHR5cGVuYW1lIF9SZXN1bHQ+CisgICAgY2xhc3MgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24KKyAgICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X0FyZzEsIF9BcmcyLCBfUmVzdWx0PgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfUmVzdWx0ICgqX01fcHRyKShfQXJnMSwgX0FyZzIpOworCisgICAgcHVibGljOgorICAgICAgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24oKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKF9SZXN1bHQgKCpfX3gpKF9BcmcxLCBfQXJnMikpCisgICAgICA6IF9NX3B0cihfX3gpIHsgfQorCisgICAgICBfUmVzdWx0CisgICAgICBvcGVyYXRvcigpKF9BcmcxIF9feCwgX0FyZzIgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcHRyKF9feCwgX195KTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgcG9pbnRlcl9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZzEsIHR5cGVuYW1lIF9BcmcyLCB0eXBlbmFtZSBfUmVzdWx0PgorICAgIGlubGluZSBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxfQXJnMSwgX0FyZzIsIF9SZXN1bHQ+CisgICAgcHRyX2Z1bihfUmVzdWx0ICgqX194KShfQXJnMSwgX0FyZzIpKQorICAgIHsgcmV0dXJuIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLCBfQXJnMiwgX1Jlc3VsdD4oX194KTsgfQorICAvKiogQH0gICovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfSWRlbnRpdHkKKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsX1RwPgorICAgIHsKKyAgICAgIF9UcCYKKyAgICAgIG9wZXJhdG9yKCkoX1RwJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3g7IH0KKworICAgICAgY29uc3QgX1RwJgorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXI+CisgICAgc3RydWN0IF9TZWxlY3Qxc3QKKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfUGFpciwgdHlwZW5hbWUgX1BhaXI6OmZpcnN0X3R5cGU+CisgICAgeworICAgICAgdHlwZW5hbWUgX1BhaXI6OmZpcnN0X3R5cGUmCisgICAgICBvcGVyYXRvcigpKF9QYWlyJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3guZmlyc3Q7IH0KKworICAgICAgY29uc3QgdHlwZW5hbWUgX1BhaXI6OmZpcnN0X3R5cGUmCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9QYWlyJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3guZmlyc3Q7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyMj4KKyAgICAgICAgdHlwZW5hbWUgX1BhaXIyOjpmaXJzdF90eXBlJgorICAgICAgICBvcGVyYXRvcigpKF9QYWlyMiYgX194KSBjb25zdAorICAgICAgICB7IHJldHVybiBfX3guZmlyc3Q7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIyPgorICAgICAgICBjb25zdCB0eXBlbmFtZSBfUGFpcjI6OmZpcnN0X3R5cGUmCisgICAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1BhaXIyJiBfX3gpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9feC5maXJzdDsgfQorI2VuZGlmCisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpcj4KKyAgICBzdHJ1Y3QgX1NlbGVjdDJuZAorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9QYWlyLCB0eXBlbmFtZSBfUGFpcjo6c2Vjb25kX3R5cGU+CisgICAgeworICAgICAgdHlwZW5hbWUgX1BhaXI6OnNlY29uZF90eXBlJgorICAgICAgb3BlcmF0b3IoKShfUGFpciYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194LnNlY29uZDsgfQorCisgICAgICBjb25zdCB0eXBlbmFtZSBfUGFpcjo6c2Vjb25kX3R5cGUmCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9QYWlyJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3guc2Vjb25kOyB9CisgICAgfTsKKworICAvLyAyMC4zLjggYWRhcHRvcnMgcG9pbnRlcnMgbWVtYmVycworICAvKiogQGRlZmdyb3VwIG1lbW9yeV9hZGFwdG9ycyBBZGFwdG9ycyBmb3IgcG9pbnRlcnMgdG8gbWVtYmVycworICAgKiBAaW5ncm91cCBmdW5jdG9ycworICAgKgorICAgKiAgVGhlcmUgYXJlIGEgdG90YWwgb2YgOCA9IDJeMyBmdW5jdGlvbiBvYmplY3RzIGluIHRoaXMgZmFtaWx5LgorICAgKiAgICgxKSBNZW1iZXIgZnVuY3Rpb25zIHRha2luZyBubyBhcmd1bWVudHMgdnMgbWVtYmVyIGZ1bmN0aW9ucyB0YWtpbmcKKyAgICogICAgICAgIG9uZSBhcmd1bWVudC4KKyAgICogICAoMikgQ2FsbCB0aHJvdWdoIHBvaW50ZXIgdnMgY2FsbCB0aHJvdWdoIHJlZmVyZW5jZS4KKyAgICogICAoMykgQ29uc3QgdnMgbm9uLWNvbnN0IG1lbWJlciBmdW5jdGlvbi4KKyAgICoKKyAgICogIEFsbCBvZiB0aGlzIGNvbXBsZXhpdHkgaXMgaW4gdGhlIGZ1bmN0aW9uIG9iamVjdHMgdGhlbXNlbHZlcy4gIFlvdSBjYW4KKyAgICogICBpZ25vcmUgaXQgYnkgdXNpbmcgdGhlIGhlbHBlciBmdW5jdGlvbiBtZW1fZnVuIGFuZCBtZW1fZnVuX3JlZiwKKyAgICogICB3aGljaCBjcmVhdGUgd2hpY2hldmVyIHR5cGUgb2YgYWRhcHRvciBpcyBhcHByb3ByaWF0ZS4KKyAgICoKKyAgICogIEB7CisgICAqLworICAvLy8gT25lIG9mIHRoZSBAbGluayBtZW1vcnlfYWRhcHRvcnMgYWRhcHRvcnMgZm9yIG1lbWJlcgorICAvLy8gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIG1lbV9mdW5fdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAqLCBfUmV0PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgbWVtX2Z1bl90KF9SZXQgKF9UcDo6Kl9fcGYpKCkpCisgICAgICA6IF9NX2YoX19wZikgeyB9CisKKyAgICAgIF9SZXQKKyAgICAgIG9wZXJhdG9yKCkoX1RwKiBfX3ApIGNvbnN0CisgICAgICB7IHJldHVybiAoX19wLT4qX01fZikoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9SZXQgKF9UcDo6Kl9NX2YpKCk7CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBtZW1vcnlfYWRhcHRvcnMgYWRhcHRvcnMgZm9yIG1lbWJlcgorICAvLy8gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGNvbnN0X21lbV9mdW5fdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxjb25zdCBfVHAqLCBfUmV0PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgY29uc3RfbWVtX2Z1bl90KF9SZXQgKF9UcDo6Kl9fcGYpKCkgY29uc3QpCisgICAgICA6IF9NX2YoX19wZikgeyB9CisKKyAgICAgIF9SZXQKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwKiBfX3ApIGNvbnN0CisgICAgICB7IHJldHVybiAoX19wLT4qX01fZikoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9SZXQgKF9UcDo6Kl9NX2YpKCkgY29uc3Q7CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBtZW1vcnlfYWRhcHRvcnMgYWRhcHRvcnMgZm9yIG1lbWJlcgorICAvLy8gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIG1lbV9mdW5fcmVmX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLCBfUmV0PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgbWVtX2Z1bl9yZWZfdChfUmV0IChfVHA6OipfX3BmKSgpKQorICAgICAgOiBfTV9mKF9fcGYpIHsgfQorCisgICAgICBfUmV0CisgICAgICBvcGVyYXRvcigpKF9UcCYgX19yKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fci4qX01fZikoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9SZXQgKF9UcDo6Kl9NX2YpKCk7CisgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbWVtb3J5X2FkYXB0b3JzIGFkYXB0b3JzIGZvciBtZW1iZXIKKyAgLy8vIHBvaW50ZXJzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBjb25zdF9tZW1fZnVuX3JlZl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCwgX1JldD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIGNvbnN0X21lbV9mdW5fcmVmX3QoX1JldCAoX1RwOjoqX19wZikoKSBjb25zdCkKKyAgICAgIDogX01fZihfX3BmKSB7IH0KKworICAgICAgX1JldAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX3IuKl9NX2YpKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfUmV0IChfVHA6OipfTV9mKSgpIGNvbnN0OworICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbWVtb3J5X2FkYXB0b3JzIGFkYXB0b3JzIGZvciBtZW1iZXIKKyAgLy8vIHBvaW50ZXJzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FyZz4KKyAgICBjbGFzcyBtZW1fZnVuMV90IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAqLCBfQXJnLCBfUmV0PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgbWVtX2Z1bjFfdChfUmV0IChfVHA6OipfX3BmKShfQXJnKSkKKyAgICAgIDogX01fZihfX3BmKSB7IH0KKworICAgICAgX1JldAorICAgICAgb3BlcmF0b3IoKShfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19wLT4qX01fZikoX194KTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9SZXQgKF9UcDo6Kl9NX2YpKF9BcmcpOworICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbWVtb3J5X2FkYXB0b3JzIGFkYXB0b3JzIGZvciBtZW1iZXIKKyAgLy8vIHBvaW50ZXJzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FyZz4KKyAgICBjbGFzcyBjb25zdF9tZW1fZnVuMV90IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxjb25zdCBfVHAqLCBfQXJnLCBfUmV0PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgY29uc3RfbWVtX2Z1bjFfdChfUmV0IChfVHA6OipfX3BmKShfQXJnKSBjb25zdCkKKyAgICAgIDogX01fZihfX3BmKSB7IH0KKworICAgICAgX1JldAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19wLT4qX01fZikoX194KTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9SZXQgKF9UcDo6Kl9NX2YpKF9BcmcpIGNvbnN0OworICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbWVtb3J5X2FkYXB0b3JzIGFkYXB0b3JzIGZvciBtZW1iZXIKKyAgLy8vIHBvaW50ZXJzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FyZz4KKyAgICBjbGFzcyBtZW1fZnVuMV9yZWZfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfQXJnLCBfUmV0PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgbWVtX2Z1bjFfcmVmX3QoX1JldCAoX1RwOjoqX19wZikoX0FyZykpCisgICAgICA6IF9NX2YoX19wZikgeyB9CisKKyAgICAgIF9SZXQKKyAgICAgIG9wZXJhdG9yKCkoX1RwJiBfX3IsIF9BcmcgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fci4qX01fZikoX194KTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9SZXQgKF9UcDo6Kl9NX2YpKF9BcmcpOworICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbWVtb3J5X2FkYXB0b3JzIGFkYXB0b3JzIGZvciBtZW1iZXIKKyAgLy8vIHBvaW50ZXJzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FyZz4KKyAgICBjbGFzcyBjb25zdF9tZW1fZnVuMV9yZWZfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfQXJnLCBfUmV0PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgY29uc3RfbWVtX2Z1bjFfcmVmX3QoX1JldCAoX1RwOjoqX19wZikoX0FyZykgY29uc3QpCisgICAgICA6IF9NX2YoX19wZikgeyB9CisKKyAgICAgIF9SZXQKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3IsIF9BcmcgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fci4qX01fZikoX194KTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9SZXQgKF9UcDo6Kl9NX2YpKF9BcmcpIGNvbnN0OworICAgIH07CisKKyAgLy8gTWVtX2Z1biBhZGFwdG9yIGhlbHBlciBmdW5jdGlvbnMuICBUaGVyZSBhcmUgb25seSB0d286CisgIC8vIG1lbV9mdW4gYW5kIG1lbV9mdW5fcmVmLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIG1lbV9mdW5fdDxfUmV0LCBfVHA+CisgICAgbWVtX2Z1bihfUmV0IChfVHA6OipfX2YpKCkpCisgICAgeyByZXR1cm4gbWVtX2Z1bl90PF9SZXQsIF9UcD4oX19mKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29uc3RfbWVtX2Z1bl90PF9SZXQsIF9UcD4KKyAgICBtZW1fZnVuKF9SZXQgKF9UcDo6Kl9fZikoKSBjb25zdCkKKyAgICB7IHJldHVybiBjb25zdF9tZW1fZnVuX3Q8X1JldCwgX1RwPihfX2YpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBtZW1fZnVuX3JlZl90PF9SZXQsIF9UcD4KKyAgICBtZW1fZnVuX3JlZihfUmV0IChfVHA6OipfX2YpKCkpCisgICAgeyByZXR1cm4gbWVtX2Z1bl9yZWZfdDxfUmV0LCBfVHA+KF9fZik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbnN0X21lbV9mdW5fcmVmX3Q8X1JldCwgX1RwPgorICAgIG1lbV9mdW5fcmVmKF9SZXQgKF9UcDo6Kl9fZikoKSBjb25zdCkKKyAgICB7IHJldHVybiBjb25zdF9tZW1fZnVuX3JlZl90PF9SZXQsIF9UcD4oX19mKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FyZz4KKyAgICBpbmxpbmUgbWVtX2Z1bjFfdDxfUmV0LCBfVHAsIF9Bcmc+CisgICAgbWVtX2Z1bihfUmV0IChfVHA6OipfX2YpKF9BcmcpKQorICAgIHsgcmV0dXJuIG1lbV9mdW4xX3Q8X1JldCwgX1RwLCBfQXJnPihfX2YpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIGlubGluZSBjb25zdF9tZW1fZnVuMV90PF9SZXQsIF9UcCwgX0FyZz4KKyAgICBtZW1fZnVuKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpCisgICAgeyByZXR1cm4gY29uc3RfbWVtX2Z1bjFfdDxfUmV0LCBfVHAsIF9Bcmc+KF9fZik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgaW5saW5lIG1lbV9mdW4xX3JlZl90PF9SZXQsIF9UcCwgX0FyZz4KKyAgICBtZW1fZnVuX3JlZihfUmV0IChfVHA6OipfX2YpKF9BcmcpKQorICAgIHsgcmV0dXJuIG1lbV9mdW4xX3JlZl90PF9SZXQsIF9UcCwgX0FyZz4oX19mKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FyZz4KKyAgICBpbmxpbmUgY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1JldCwgX1RwLCBfQXJnPgorICAgIG1lbV9mdW5fcmVmKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpCisgICAgeyByZXR1cm4gY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1JldCwgX1RwLCBfQXJnPihfX2YpOyB9CisKKyAgLyoqIEB9ICAqLworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpZiAoX19jcGx1c3BsdXMgPCAyMDExMDNMKSB8fCBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorIyBpbmNsdWRlIDxiYWNrd2FyZC9iaW5kZXJzLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExfRlVOQ1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9oZWFwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2hlYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDdhOGNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9oZWFwLmgKQEAgLTAsMCArMSw1OTIgQEAKKy8vIEhlYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX2hlYXAuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3F1ZXVlfQorICovCisKKyNpZm5kZWYgX1NUTF9IRUFQX0gKKyNkZWZpbmUgX1NUTF9IRUFQX0ggMQorCisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgaGVhcF9hbGdvcml0aG1zIEhlYXAKKyAgICogQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIF9EaXN0YW5jZQorICAgIF9faXNfaGVhcF91bnRpbChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX0Rpc3RhbmNlIF9fbikKKyAgICB7CisgICAgICBfRGlzdGFuY2UgX19wYXJlbnQgPSAwOworICAgICAgZm9yIChfRGlzdGFuY2UgX19jaGlsZCA9IDE7IF9fY2hpbGQgPCBfX247ICsrX19jaGlsZCkKKwl7CisJICBpZiAoX19maXJzdFtfX3BhcmVudF0gPCBfX2ZpcnN0W19fY2hpbGRdKQorCSAgICByZXR1cm4gX19jaGlsZDsKKwkgIGlmICgoX19jaGlsZCAmIDEpID09IDApCisJICAgICsrX19wYXJlbnQ7CisJfQorICAgICAgcmV0dXJuIF9fbjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2UsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0Rpc3RhbmNlCisgICAgX19pc19oZWFwX3VudGlsKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfRGlzdGFuY2UgX19uLAorCQkgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIF9EaXN0YW5jZSBfX3BhcmVudCA9IDA7CisgICAgICBmb3IgKF9EaXN0YW5jZSBfX2NoaWxkID0gMTsgX19jaGlsZCA8IF9fbjsgKytfX2NoaWxkKQorCXsKKwkgIGlmIChfX2NvbXAoX19maXJzdFtfX3BhcmVudF0sIF9fZmlyc3RbX19jaGlsZF0pKQorCSAgICByZXR1cm4gX19jaGlsZDsKKwkgIGlmICgoX19jaGlsZCAmIDEpID09IDApCisJICAgICsrX19wYXJlbnQ7CisJfQorICAgICAgcmV0dXJuIF9fbjsKKyAgICB9CisKKyAgLy8gX19pc19oZWFwLCBhIHByZWRpY2F0ZSB0ZXN0aW5nIHdoZXRoZXIgb3Igbm90IGEgcmFuZ2UgaXMgYSBoZWFwLgorICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGFuIGV4dGVuc2lvbiwgbm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2lzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9EaXN0YW5jZSBfX24pCisgICAgeyByZXR1cm4gc3RkOjpfX2lzX2hlYXBfdW50aWwoX19maXJzdCwgX19uKSA9PSBfX247IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlLAorCSAgIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9faXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX0NvbXBhcmUgX19jb21wLCBfRGlzdGFuY2UgX19uKQorICAgIHsgcmV0dXJuIHN0ZDo6X19pc19oZWFwX3VudGlsKF9fZmlyc3QsIF9fbiwgX19jb21wKSA9PSBfX247IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2lzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeyByZXR1cm4gc3RkOjpfX2lzX2hlYXAoX19maXJzdCwgc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2lzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsgcmV0dXJuIHN0ZDo6X19pc19oZWFwKF9fZmlyc3QsIF9fY29tcCwgc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpKTsgfQorCisgIC8vIEhlYXAtbWFuaXB1bGF0aW9uIGZ1bmN0aW9uczogcHVzaF9oZWFwLCBwb3BfaGVhcCwgbWFrZV9oZWFwLCBzb3J0X2hlYXAsCisgIC8vICsgaXNfaGVhcCBhbmQgaXNfaGVhcF91bnRpbCBpbiBDKysweC4KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZSwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3B1c2hfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJX0Rpc3RhbmNlIF9faG9sZUluZGV4LCBfRGlzdGFuY2UgX190b3BJbmRleCwgX1RwIF9fdmFsdWUpCisgICAgeworICAgICAgX0Rpc3RhbmNlIF9fcGFyZW50ID0gKF9faG9sZUluZGV4IC0gMSkgLyAyOworICAgICAgd2hpbGUgKF9faG9sZUluZGV4ID4gX190b3BJbmRleCAmJiAqKF9fZmlyc3QgKyBfX3BhcmVudCkgPCBfX3ZhbHVlKQorCXsKKwkgICooX19maXJzdCArIF9faG9sZUluZGV4KSA9IF9HTElCQ1hYX01PVkUoKihfX2ZpcnN0ICsgX19wYXJlbnQpKTsKKwkgIF9faG9sZUluZGV4ID0gX19wYXJlbnQ7CisJICBfX3BhcmVudCA9IChfX2hvbGVJbmRleCAtIDEpIC8gMjsKKwl9CisgICAgICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSBfR0xJQkNYWF9NT1ZFKF9fdmFsdWUpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUHVzaCBhbiBlbGVtZW50IG9udG8gYSBoZWFwLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiBoZWFwLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgaGVhcCArIGVsZW1lbnQuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIHB1c2hlcyB0aGUgZWxlbWVudCBhdCBsYXN0LTEgb250byB0aGUgdmFsaWQgaGVhcAorICAgKiAgb3ZlciB0aGUgcmFuZ2UgW19fZmlyc3QsX19sYXN0LTEpLiAgQWZ0ZXIgY29tcGxldGlvbiwKKyAgICogIFtfX2ZpcnN0LF9fbGFzdCkgaXMgYSB2YWxpZCBoZWFwLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBwdXNoX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCSAgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCSAgX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8X1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19oZWFwKF9fZmlyc3QsIF9fbGFzdCAtIDEpOworCisgICAgICBfVmFsdWVUeXBlIF9fdmFsdWUgPSBfR0xJQkNYWF9NT1ZFKCooX19sYXN0IC0gMSkpOworICAgICAgc3RkOjpfX3B1c2hfaGVhcChfX2ZpcnN0LCBfRGlzdGFuY2VUeXBlKChfX2xhc3QgLSBfX2ZpcnN0KSAtIDEpLAorCQkgICAgICAgX0Rpc3RhbmNlVHlwZSgwKSwgX0dMSUJDWFhfTU9WRShfX3ZhbHVlKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlLCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fcHVzaF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfRGlzdGFuY2UgX19ob2xlSW5kZXgsCisJCV9EaXN0YW5jZSBfX3RvcEluZGV4LCBfVHAgX192YWx1ZSwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIF9EaXN0YW5jZSBfX3BhcmVudCA9IChfX2hvbGVJbmRleCAtIDEpIC8gMjsKKyAgICAgIHdoaWxlIChfX2hvbGVJbmRleCA+IF9fdG9wSW5kZXgKKwkgICAgICYmIF9fY29tcCgqKF9fZmlyc3QgKyBfX3BhcmVudCksIF9fdmFsdWUpKQorCXsKKwkgICooX19maXJzdCArIF9faG9sZUluZGV4KSA9IF9HTElCQ1hYX01PVkUoKihfX2ZpcnN0ICsgX19wYXJlbnQpKTsKKwkgIF9faG9sZUluZGV4ID0gX19wYXJlbnQ7CisJICBfX3BhcmVudCA9IChfX2hvbGVJbmRleCAtIDEpIC8gMjsKKwl9CisgICAgICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSBfR0xJQkNYWF9NT1ZFKF9fdmFsdWUpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUHVzaCBhbiBlbGVtZW50IG9udG8gYSBoZWFwIHVzaW5nIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgaGVhcC4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgRW5kIG9mIGhlYXAgKyBlbGVtZW50LgorICAgKiAgQHBhcmFtICBfX2NvbXAgICBDb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIHB1c2hlcyB0aGUgZWxlbWVudCBhdCBfX2xhc3QtMSBvbnRvIHRoZSB2YWxpZAorICAgKiAgaGVhcCBvdmVyIHRoZSByYW5nZSBbX19maXJzdCxfX2xhc3QtMSkuICBBZnRlciBjb21wbGV0aW9uLAorICAgKiAgW19fZmlyc3QsX19sYXN0KSBpcyBhIHZhbGlkIGhlYXAuICBDb21wYXJlIG9wZXJhdGlvbnMgYXJlCisgICAqICBwZXJmb3JtZWQgdXNpbmcgY29tcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHB1c2hfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCSAgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCSAgX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19oZWFwX3ByZWQoX19maXJzdCwgX19sYXN0IC0gMSwgX19jb21wKTsKKworICAgICAgX1ZhbHVlVHlwZSBfX3ZhbHVlID0gX0dMSUJDWFhfTU9WRSgqKF9fbGFzdCAtIDEpKTsKKyAgICAgIHN0ZDo6X19wdXNoX2hlYXAoX19maXJzdCwgX0Rpc3RhbmNlVHlwZSgoX19sYXN0IC0gX19maXJzdCkgLSAxKSwKKwkJICAgICAgIF9EaXN0YW5jZVR5cGUoMCksIF9HTElCQ1hYX01PVkUoX192YWx1ZSksIF9fY29tcCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fYWRqdXN0X2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9EaXN0YW5jZSBfX2hvbGVJbmRleCwKKwkJICBfRGlzdGFuY2UgX19sZW4sIF9UcCBfX3ZhbHVlKQorICAgIHsKKyAgICAgIGNvbnN0IF9EaXN0YW5jZSBfX3RvcEluZGV4ID0gX19ob2xlSW5kZXg7CisgICAgICBfRGlzdGFuY2UgX19zZWNvbmRDaGlsZCA9IF9faG9sZUluZGV4OworICAgICAgd2hpbGUgKF9fc2Vjb25kQ2hpbGQgPCAoX19sZW4gLSAxKSAvIDIpCisJeworCSAgX19zZWNvbmRDaGlsZCA9IDIgKiAoX19zZWNvbmRDaGlsZCArIDEpOworCSAgaWYgKCooX19maXJzdCArIF9fc2Vjb25kQ2hpbGQpIDwgKihfX2ZpcnN0ICsgKF9fc2Vjb25kQ2hpbGQgLSAxKSkpCisJICAgIF9fc2Vjb25kQ2hpbGQtLTsKKwkgICooX19maXJzdCArIF9faG9sZUluZGV4KSA9IF9HTElCQ1hYX01PVkUoKihfX2ZpcnN0ICsgX19zZWNvbmRDaGlsZCkpOworCSAgX19ob2xlSW5kZXggPSBfX3NlY29uZENoaWxkOworCX0KKyAgICAgIGlmICgoX19sZW4gJiAxKSA9PSAwICYmIF9fc2Vjb25kQ2hpbGQgPT0gKF9fbGVuIC0gMikgLyAyKQorCXsKKwkgIF9fc2Vjb25kQ2hpbGQgPSAyICogKF9fc2Vjb25kQ2hpbGQgKyAxKTsKKwkgICooX19maXJzdCArIF9faG9sZUluZGV4KSA9IF9HTElCQ1hYX01PVkUoKihfX2ZpcnN0CisJCQkJCQkgICAgICsgKF9fc2Vjb25kQ2hpbGQgLSAxKSkpOworCSAgX19ob2xlSW5kZXggPSBfX3NlY29uZENoaWxkIC0gMTsKKwl9CisgICAgICBzdGQ6Ol9fcHVzaF9oZWFwKF9fZmlyc3QsIF9faG9sZUluZGV4LCBfX3RvcEluZGV4LAorCQkgICAgICAgX0dMSUJDWFhfTU9WRShfX3ZhbHVlKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fcG9wX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIF9WYWx1ZVR5cGUgX192YWx1ZSA9IF9HTElCQ1hYX01PVkUoKl9fcmVzdWx0KTsKKyAgICAgICpfX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QpOworICAgICAgc3RkOjpfX2FkanVzdF9oZWFwKF9fZmlyc3QsIF9EaXN0YW5jZVR5cGUoMCksCisJCQkgX0Rpc3RhbmNlVHlwZShfX2xhc3QgLSBfX2ZpcnN0KSwKKwkJCSBfR0xJQkNYWF9NT1ZFKF9fdmFsdWUpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFBvcCBhbiBlbGVtZW50IG9mZiBhIGhlYXAuCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIGhlYXAuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiBoZWFwLgorICAgKiAgQHByZSAgICBbX19maXJzdCwgX19sYXN0KSBpcyBhIHZhbGlkLCBub24tZW1wdHkgcmFuZ2UuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIHBvcHMgdGhlIHRvcCBvZiB0aGUgaGVhcC4gIFRoZSBlbGVtZW50cyBfX2ZpcnN0CisgICAqICBhbmQgX19sYXN0LTEgYXJlIHN3YXBwZWQgYW5kIFtfX2ZpcnN0LF9fbGFzdC0xKSBpcyBtYWRlIGludG8gYQorICAgKiAgaGVhcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgcG9wX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX25vbl9lbXB0eV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcChfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19sYXN0IC0gX19maXJzdCA+IDEpCisJeworCSAgLS1fX2xhc3Q7CisJICBzdGQ6Ol9fcG9wX2hlYXAoX19maXJzdCwgX19sYXN0LCBfX2xhc3QpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2UsCisJICAgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19hZGp1c3RfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX0Rpc3RhbmNlIF9faG9sZUluZGV4LAorCQkgIF9EaXN0YW5jZSBfX2xlbiwgX1RwIF9fdmFsdWUsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBjb25zdCBfRGlzdGFuY2UgX190b3BJbmRleCA9IF9faG9sZUluZGV4OworICAgICAgX0Rpc3RhbmNlIF9fc2Vjb25kQ2hpbGQgPSBfX2hvbGVJbmRleDsKKyAgICAgIHdoaWxlIChfX3NlY29uZENoaWxkIDwgKF9fbGVuIC0gMSkgLyAyKQorCXsKKwkgIF9fc2Vjb25kQ2hpbGQgPSAyICogKF9fc2Vjb25kQ2hpbGQgKyAxKTsKKwkgIGlmIChfX2NvbXAoKihfX2ZpcnN0ICsgX19zZWNvbmRDaGlsZCksCisJCSAgICAgKihfX2ZpcnN0ICsgKF9fc2Vjb25kQ2hpbGQgLSAxKSkpKQorCSAgICBfX3NlY29uZENoaWxkLS07CisJICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSBfR0xJQkNYWF9NT1ZFKCooX19maXJzdCArIF9fc2Vjb25kQ2hpbGQpKTsKKwkgIF9faG9sZUluZGV4ID0gX19zZWNvbmRDaGlsZDsKKwl9CisgICAgICBpZiAoKF9fbGVuICYgMSkgPT0gMCAmJiBfX3NlY29uZENoaWxkID09IChfX2xlbiAtIDIpIC8gMikKKwl7CisJICBfX3NlY29uZENoaWxkID0gMiAqIChfX3NlY29uZENoaWxkICsgMSk7CisJICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSBfR0xJQkNYWF9NT1ZFKCooX19maXJzdAorCQkJCQkJICAgICArIChfX3NlY29uZENoaWxkIC0gMSkpKTsKKwkgIF9faG9sZUluZGV4ID0gX19zZWNvbmRDaGlsZCAtIDE7CisJfQorICAgICAgc3RkOjpfX3B1c2hfaGVhcChfX2ZpcnN0LCBfX2hvbGVJbmRleCwgX190b3BJbmRleCwgCisJCSAgICAgICBfR0xJQkNYWF9NT1ZFKF9fdmFsdWUpLCBfX2NvbXApOyAgICAgIAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSB2b2lkCisgICAgX19wb3BfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICBfVmFsdWVUeXBlIF9fdmFsdWUgPSBfR0xJQkNYWF9NT1ZFKCpfX3Jlc3VsdCk7CisgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0KTsKKyAgICAgIHN0ZDo6X19hZGp1c3RfaGVhcChfX2ZpcnN0LCBfRGlzdGFuY2VUeXBlKDApLAorCQkJIF9EaXN0YW5jZVR5cGUoX19sYXN0IC0gX19maXJzdCksCisJCQkgX0dMSUJDWFhfTU9WRShfX3ZhbHVlKSwgX19jb21wKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFBvcCBhbiBlbGVtZW50IG9mZiBhIGhlYXAgdXNpbmcgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiBoZWFwLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgaGVhcC4KKyAgICogIEBwYXJhbSAgX19jb21wICAgQ29tcGFyaXNvbiBmdW5jdG9yIHRvIHVzZS4KKyAgICogIEBpbmdyb3VwIGhlYXBfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gcG9wcyB0aGUgdG9wIG9mIHRoZSBoZWFwLiAgVGhlIGVsZW1lbnRzIF9fZmlyc3QKKyAgICogIGFuZCBfX2xhc3QtMSBhcmUgc3dhcHBlZCBhbmQgW19fZmlyc3QsX19sYXN0LTEpIGlzIG1hZGUgaW50byBhCisgICAqICBoZWFwLiAgQ29tcGFyaXNvbnMgYXJlIG1hZGUgdXNpbmcgY29tcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHBvcF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfbm9uX2VtcHR5X3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcF9wcmVkKF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKKworICAgICAgaWYgKF9fbGFzdCAtIF9fZmlyc3QgPiAxKQorCXsKKwkgIC0tX19sYXN0OworCSAgc3RkOjpfX3BvcF9oZWFwKF9fZmlyc3QsIF9fbGFzdCwgX19sYXN0LCBfX2NvbXApOworCX0KKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnN0cnVjdCBhIGhlYXAgb3ZlciBhIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiBoZWFwLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgaGVhcC4KKyAgICogIEBpbmdyb3VwIGhlYXBfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gbWFrZXMgdGhlIGVsZW1lbnRzIGluIFtfX2ZpcnN0LF9fbGFzdCkgaW50byBhIGhlYXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgbWFrZV9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwkgIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwkgIF9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2xhc3QgLSBfX2ZpcnN0IDwgMikKKwlyZXR1cm47CisKKyAgICAgIGNvbnN0IF9EaXN0YW5jZVR5cGUgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgICAgX0Rpc3RhbmNlVHlwZSBfX3BhcmVudCA9IChfX2xlbiAtIDIpIC8gMjsKKyAgICAgIHdoaWxlICh0cnVlKQorCXsKKwkgIF9WYWx1ZVR5cGUgX192YWx1ZSA9IF9HTElCQ1hYX01PVkUoKihfX2ZpcnN0ICsgX19wYXJlbnQpKTsKKwkgIHN0ZDo6X19hZGp1c3RfaGVhcChfX2ZpcnN0LCBfX3BhcmVudCwgX19sZW4sIF9HTElCQ1hYX01PVkUoX192YWx1ZSkpOworCSAgaWYgKF9fcGFyZW50ID09IDApCisJICAgIHJldHVybjsKKwkgIF9fcGFyZW50LS07CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQ29uc3RydWN0IGEgaGVhcCBvdmVyIGEgcmFuZ2UgdXNpbmcgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiBoZWFwLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgaGVhcC4KKyAgICogIEBwYXJhbSAgX19jb21wICAgQ29tcGFyaXNvbiBmdW5jdG9yIHRvIHVzZS4KKyAgICogIEBpbmdyb3VwIGhlYXBfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gbWFrZXMgdGhlIGVsZW1lbnRzIGluIFtfX2ZpcnN0LF9fbGFzdCkgaW50byBhIGhlYXAuCisgICAqICBDb21wYXJpc29ucyBhcmUgbWFkZSB1c2luZyBfX2NvbXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIG1ha2VfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCSAgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCSAgX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fbGFzdCAtIF9fZmlyc3QgPCAyKQorCXJldHVybjsKKworICAgICAgY29uc3QgX0Rpc3RhbmNlVHlwZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICBfRGlzdGFuY2VUeXBlIF9fcGFyZW50ID0gKF9fbGVuIC0gMikgLyAyOworICAgICAgd2hpbGUgKHRydWUpCisJeworCSAgX1ZhbHVlVHlwZSBfX3ZhbHVlID0gX0dMSUJDWFhfTU9WRSgqKF9fZmlyc3QgKyBfX3BhcmVudCkpOworCSAgc3RkOjpfX2FkanVzdF9oZWFwKF9fZmlyc3QsIF9fcGFyZW50LCBfX2xlbiwgX0dMSUJDWFhfTU9WRShfX3ZhbHVlKSwKKwkJCSAgICAgX19jb21wKTsKKwkgIGlmIChfX3BhcmVudCA9PSAwKQorCSAgICByZXR1cm47CisJICBfX3BhcmVudC0tOworCX0KKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFNvcnQgYSBoZWFwLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiBoZWFwLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgaGVhcC4KKyAgICogIEBpbmdyb3VwIGhlYXBfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gc29ydHMgdGhlIHZhbGlkIGhlYXAgaW4gdGhlIHJhbmdlIFtfX2ZpcnN0LF9fbGFzdCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgc29ydF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19oZWFwKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0ID4gMSkKKwl7CisJICAtLV9fbGFzdDsKKwkgIHN0ZDo6X19wb3BfaGVhcChfX2ZpcnN0LCBfX2xhc3QsIF9fbGFzdCk7CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgU29ydCBhIGhlYXAgdXNpbmcgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiBoZWFwLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgaGVhcC4KKyAgICogIEBwYXJhbSAgX19jb21wICAgQ29tcGFyaXNvbiBmdW5jdG9yIHRvIHVzZS4KKyAgICogIEBpbmdyb3VwIGhlYXBfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gc29ydHMgdGhlIHZhbGlkIGhlYXAgaW4gdGhlIHJhbmdlIFtfX2ZpcnN0LF9fbGFzdCkuCisgICAqICBDb21wYXJpc29ucyBhcmUgbWFkZSB1c2luZyBfX2NvbXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIHNvcnRfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19oZWFwX3ByZWQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworCisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IDEpCisJeworCSAgLS1fX2xhc3Q7CisJICBzdGQ6Ol9fcG9wX2hlYXAoX19maXJzdCwgX19sYXN0LCBfX2xhc3QsIF9fY29tcCk7CisJfQorICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLyoqCisgICAqICBAYnJpZWYgIFNlYXJjaCB0aGUgZW5kIG9mIGEgaGVhcC4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IG5vdCBpbiB0aGUgaGVhcC4KKyAgICogIEBpbmdyb3VwIGhlYXBfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gcmV0dXJucyB0aGUgbGFzdCBpdGVyYXRvciBpIGluIFtfX2ZpcnN0LCBfX2xhc3QpIGZvciB3aGljaAorICAgKiAgdGhlIHJhbmdlIFtfX2ZpcnN0LCBpKSBpcyBhIGhlYXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgaXNfaGVhcF91bnRpbChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICByZXR1cm4gX19maXJzdCArIHN0ZDo6X19pc19oZWFwX3VudGlsKF9fZmlyc3QsIHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwKKwkJCQkJCQkJICAgX19sYXN0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBTZWFyY2ggdGhlIGVuZCBvZiBhIGhlYXAgdXNpbmcgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgRW5kIG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICBDb21wYXJpc29uIGZ1bmN0b3IgdG8gdXNlLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgbm90IGluIHRoZSBoZWFwLgorICAgKiAgQGluZ3JvdXAgaGVhcF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBsYXN0IGl0ZXJhdG9yIGkgaW4gW19fZmlyc3QsIF9fbGFzdCkgZm9yIHdoaWNoCisgICAqICB0aGUgcmFuZ2UgW19fZmlyc3QsIGkpIGlzIGEgaGVhcC4gIENvbXBhcmlzb25zIGFyZSBtYWRlIHVzaW5nIF9fY29tcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgaXNfaGVhcF91bnRpbChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkJICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHJldHVybiBfX2ZpcnN0ICsgc3RkOjpfX2lzX2hlYXBfdW50aWwoX19maXJzdCwgc3RkOjpkaXN0YW5jZShfX2ZpcnN0LAorCQkJCQkJCQkgICBfX2xhc3QpLAorCQkJCQkgICAgX19jb21wKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIERldGVybWluZXMgd2hldGhlciBhIHJhbmdlIGlzIGEgaGVhcC4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgcmFuZ2UgaXMgYSBoZWFwLCBmYWxzZSBvdGhlcndpc2UuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgaXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7IHJldHVybiBzdGQ6OmlzX2hlYXBfdW50aWwoX19maXJzdCwgX19sYXN0KSA9PSBfX2xhc3Q7IH0KKworICAvKioKKyAgICogIEBicmllZiAgRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcmFuZ2UgaXMgYSBoZWFwIHVzaW5nIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgQ29tcGFyaXNvbiBmdW5jdG9yIHRvIHVzZS4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgcmFuZ2UgaXMgYSBoZWFwLCBmYWxzZSBvdGhlcndpc2UuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7IHJldHVybiBzdGQ6OmlzX2hlYXBfdW50aWwoX19maXJzdCwgX19sYXN0LCBfX2NvbXApID09IF9fbGFzdDsgfQorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9TVExfSEVBUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2l0ZXJhdG9yLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0ZjM3ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfaXRlcmF0b3IuaApAQCAtMCwwICsxLDExNDggQEAKKy8vIEl0ZXJhdG9ycyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk4CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfaXRlcmF0b3IuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2l0ZXJhdG9yfQorICoKKyAqICBUaGlzIGZpbGUgaW1wbGVtZW50cyByZXZlcnNlX2l0ZXJhdG9yLCBiYWNrX2luc2VydF9pdGVyYXRvciwKKyAqICBmcm9udF9pbnNlcnRfaXRlcmF0b3IsIGluc2VydF9pdGVyYXRvciwgX19ub3JtYWxfaXRlcmF0b3IsIGFuZCB0aGVpcgorICogIHN1cHBvcnRpbmcgZnVuY3Rpb25zIGFuZCBvdmVybG9hZGVkIG9wZXJhdG9ycy4KKyAqLworCisjaWZuZGVmIF9TVExfSVRFUkFUT1JfSAorI2RlZmluZSBfU1RMX0lURVJBVE9SX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jcHBfdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBpdGVyYXRvcnMKKyAgICogQHsKKyAgICovCisKKyAgLy8gMjQuNC4xIFJldmVyc2UgaXRlcmF0b3JzCisgIC8qKgorICAgKiAgQmlkaXJlY3Rpb25hbCBhbmQgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMgaGF2ZSBjb3JyZXNwb25kaW5nIHJldmVyc2UKKyAgICogICVpdGVyYXRvciBhZGFwdG9ycyB0aGF0IGl0ZXJhdGUgdGhyb3VnaCB0aGUgZGF0YSBzdHJ1Y3R1cmUgaW4gdGhlCisgICAqICBvcHBvc2l0ZSBkaXJlY3Rpb24uICBUaGV5IGhhdmUgdGhlIHNhbWUgc2lnbmF0dXJlcyBhcyB0aGUgY29ycmVzcG9uZGluZworICAgKiAgaXRlcmF0b3JzLiAgVGhlIGZ1bmRhbWVudGFsIHJlbGF0aW9uIGJldHdlZW4gYSByZXZlcnNlICVpdGVyYXRvciBhbmQgaXRzCisgICAqICBjb3JyZXNwb25kaW5nICVpdGVyYXRvciBAYyBpIGlzIGVzdGFibGlzaGVkIGJ5IHRoZSBpZGVudGl0eToKKyAgICogIEBjb2RlCisgICAqICAgICAgJioocmV2ZXJzZV9pdGVyYXRvcihpKSkgPT0gJiooaSAtIDEpCisgICAqICBAZW5kY29kZQorICAgKgorICAgKiAgPGVtPlRoaXMgbWFwcGluZyBpcyBkaWN0YXRlZCBieSB0aGUgZmFjdCB0aGF0IHdoaWxlIHRoZXJlIGlzIGFsd2F5cyBhCisgICAqICBwb2ludGVyIHBhc3QgdGhlIGVuZCBvZiBhbiBhcnJheSwgdGhlcmUgbWlnaHQgbm90IGJlIGEgdmFsaWQgcG9pbnRlcgorICAgKiAgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgYW4gYXJyYXkuPC9lbT4gWzI0LjQuMV0vMSwyCisgICAqCisgICAqICBSZXZlcnNlIGl0ZXJhdG9ycyBjYW4gYmUgdHJpY2t5IGFuZCBzdXJwcmlzaW5nIGF0IGZpcnN0LiAgVGhlaXIKKyAgICogIHNlbWFudGljcyBtYWtlIHNlbnNlLCBob3dldmVyLCBhbmQgdGhlIHRyaWNraW5lc3MgaXMgYSBzaWRlIGVmZmVjdCBvZgorICAgKiAgdGhlIHJlcXVpcmVtZW50IHRoYXQgdGhlIGl0ZXJhdG9ycyBtdXN0IGJlIHNhZmUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBjbGFzcyByZXZlcnNlX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5LAorCQkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSwKKwkJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnJlZmVyZW5jZT4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX0l0ZXJhdG9yIGN1cnJlbnQ7CisKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj4JCV9fdHJhaXRzX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9JdGVyYXRvcgkJCQkJaXRlcmF0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6ZGlmZmVyZW5jZV90eXBlCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6cG9pbnRlcgkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6cmVmZXJlbmNlCQlyZWZlcmVuY2U7CisKKyAgICAgIC8qKgorICAgICAgICogIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIHZhbHVlLWluaXRpYWxpemVzIG1lbWJlciBAcCBjdXJyZW50LgorICAgICAgICogIElmIGl0IGlzIGEgcG9pbnRlciwgdGhhdCBtZWFucyBpdCBpcyB6ZXJvLWluaXRpYWxpemVkLgorICAgICAgKi8KKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIzNSBObyBzcGVjaWZpY2F0aW9uIG9mIGRlZmF1bHQgY3RvciBmb3IgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmV2ZXJzZV9pdGVyYXRvcigpIDogY3VycmVudCgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBUaGlzICVpdGVyYXRvciB3aWxsIG1vdmUgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiB0aGF0IEBwIHggZG9lcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgcmV2ZXJzZV9pdGVyYXRvcihpdGVyYXRvcl90eXBlIF9feCkgOiBjdXJyZW50KF9feCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFRoZSBjb3B5IGNvbnN0cnVjdG9yIGlzIG5vcm1hbC4KKyAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yKGNvbnN0IHJldmVyc2VfaXRlcmF0b3ImIF9feCkKKyAgICAgIDogY3VycmVudChfX3guY3VycmVudCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEEgJXJldmVyc2VfaXRlcmF0b3IgYWNyb3NzIG90aGVyIHR5cGVzIGNhbiBiZSBjb3BpZWQgaWYgdGhlCisgICAgICAgKiAgdW5kZXJseWluZyAlaXRlcmF0b3IgY2FuIGJlIGNvbnZlcnRlZCB0byB0aGUgdHlwZSBvZiBAYyBjdXJyZW50LgorICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyPgorICAgICAgICByZXZlcnNlX2l0ZXJhdG9yKGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXI+JiBfX3gpCisJOiBjdXJyZW50KF9feC5iYXNlKCkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBAYyBjdXJyZW50LCB0aGUgJWl0ZXJhdG9yIHVzZWQgZm9yIHVuZGVybHlpbmcgd29yay4KKyAgICAgICovCisgICAgICBpdGVyYXRvcl90eXBlCisgICAgICBiYXNlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGN1cnJlbnQ7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgQSByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIGF0IEBjIC0tY3VycmVudAorICAgICAgICoKKyAgICAgICAqICBUaGlzIHJlcXVpcmVzIHRoYXQgQGMgLS1jdXJyZW50IGlzIGRlcmVmZXJlbmNlYWJsZS4KKyAgICAgICAqCisgICAgICAgKiAgQHdhcm5pbmcgVGhpcyBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGF0IGZvciBhbiBpdGVyYXRvciBvZiB0aGUKKyAgICAgICAqICAgICAgICAgICB1bmRlcmx5aW5nIGl0ZXJhdG9yIHR5cGUsIEBjIHgsIGEgcmVmZXJlbmNlIG9idGFpbmVkIGJ5CisgICAgICAgKiAgICAgICAgICAgQGMgKnggcmVtYWlucyB2YWxpZCBhZnRlciBAYyB4IGhhcyBiZWVuIG1vZGlmaWVkIG9yCisgICAgICAgKiAgICAgICAgICAgZGVzdHJveWVkLiBUaGlzIGlzIGEgYnVnOiBodHRwOi8vZ2NjLmdudS5vcmcvUFI1MTgyMworICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfSXRlcmF0b3IgX190bXAgPSBjdXJyZW50OworCXJldHVybiAqLS1fX3RtcDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgQSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBhdCBAYyAtLWN1cnJlbnQKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyByZXF1aXJlcyB0aGF0IEBjIC0tY3VycmVudCBpcyBkZXJlZmVyZW5jZWFibGUuCisgICAgICAqLworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBAYyAqdGhpcworICAgICAgICoKKyAgICAgICAqICBEZWNyZW1lbnRzIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yLgorICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwktLWN1cnJlbnQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBUaGUgb3JpZ2luYWwgdmFsdWUgb2YgQGMgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgRGVjcmVtZW50cyB0aGUgdW5kZXJseWluZyBpdGVyYXRvci4KKyAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlyZXZlcnNlX2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisJLS1jdXJyZW50OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgQGMgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgSW5jcmVtZW50cyB0aGUgdW5kZXJseWluZyBpdGVyYXRvci4KKyAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJKytjdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgQSByZXZlcnNlX2l0ZXJhdG9yIHdpdGggdGhlIHByZXZpb3VzIHZhbHVlIG9mIEBjICp0aGlzCisgICAgICAgKgorICAgICAgICogIEluY3JlbWVudHMgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IuCisgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7CisJcmV2ZXJzZV9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworCSsrY3VycmVudDsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEByZXR1cm4gIEEgcmV2ZXJzZV9pdGVyYXRvciB0aGF0IHJlZmVycyB0byBAYyBjdXJyZW50IC0gQGEgX19uCisgICAgICAgKgorICAgICAgICogIFRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIG11c3QgYmUgYSBSYW5kb20gQWNjZXNzIEl0ZXJhdG9yLgorICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihjdXJyZW50IC0gX19uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBNb3ZlcyB0aGUgdW5kZXJseWluZyBpdGVyYXRvciBiYWNrd2FyZHMgQGEgX19uIHN0ZXBzLgorICAgICAgICogIFRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIG11c3QgYmUgYSBSYW5kb20gQWNjZXNzIEl0ZXJhdG9yLgorICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBfX24pCisgICAgICB7CisJY3VycmVudCAtPSBfX247CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBBIHJldmVyc2VfaXRlcmF0b3IgdGhhdCByZWZlcnMgdG8gQGMgY3VycmVudCAtIEBhIF9fbgorICAgICAgICoKKyAgICAgICAqICBUaGUgdW5kZXJseWluZyBpdGVyYXRvciBtdXN0IGJlIGEgUmFuZG9tIEFjY2VzcyBJdGVyYXRvci4KKyAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoY3VycmVudCArIF9fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgTW92ZXMgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IgZm9yd2FyZHMgQGEgX19uIHN0ZXBzLgorICAgICAgICogIFRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIG11c3QgYmUgYSBSYW5kb20gQWNjZXNzIEl0ZXJhdG9yLgorICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBfX24pCisgICAgICB7CisJY3VycmVudCArPSBfX247CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBUaGUgdmFsdWUgYXQgQGMgY3VycmVudCAtIEBhIF9fbiAtIDEKKyAgICAgICAqCisgICAgICAgKiAgVGhlIHVuZGVybHlpbmcgaXRlcmF0b3IgbXVzdCBiZSBhIFJhbmRvbSBBY2Nlc3MgSXRlcmF0b3IuCisgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiAqKCp0aGlzICsgX19uKTsgfQorICAgIH07CisKKyAgLy9AeworICAvKioKKyAgICogIEBwYXJhbSAgX194ICBBICVyZXZlcnNlX2l0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3kgIEEgJXJldmVyc2VfaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICBBIHNpbXBsZSBib29sLgorICAgKgorICAgKiAgUmV2ZXJzZSBpdGVyYXRvcnMgZm9yd2FyZCBtYW55IG9wZXJhdGlvbnMgdG8gdGhlaXIgdW5kZXJseWluZyBiYXNlKCkKKyAgICogIGl0ZXJhdG9ycy4gIE90aGVycyBhcmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2Ygb25lIGFub3RoZXIuCisgICAqCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5iYXNlKCkgPT0gX195LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiBfX3kuYmFzZSgpIDwgX194LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSB0eXBlbmFtZSByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIG9wZXJhdG9yLShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiBfX3kuYmFzZSgpIC0gX194LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+CisgICAgb3BlcmF0b3IrKHR5cGVuYW1lIHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbiwKKwkgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCkKKyAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4oX194LmJhc2UoKSAtIF9fbik7IH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIERSIDI4MC4gQ29tcGFyaXNvbiBvZiByZXZlcnNlX2l0ZXJhdG9yIHRvIGNvbnN0IHJldmVyc2VfaXRlcmF0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JSPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5iYXNlKCkgPT0gX195LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyAgICB7IHJldHVybiBfX3kuYmFzZSgpIDwgX194LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JSPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUj4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgLy8gRFIgNjg1LgorICAgIGlubGluZSBhdXRvCisgICAgb3BlcmF0b3ItKGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgLT4gZGVjbHR5cGUoX195LmJhc2UoKSAtIF9feC5iYXNlKCkpCisjZWxzZQorICAgIGlubGluZSB0eXBlbmFtZSByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvckw+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBvcGVyYXRvci0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyNlbmRpZgorICAgIHsgcmV0dXJuIF9feS5iYXNlKCkgLSBfX3guYmFzZSgpOyB9CisgIC8vQH0KKworICAvLyAyNC40LjIuMi4xIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yCisgIC8qKgorICAgKiAgQGJyaWVmICBUdXJucyBhc3NpZ25tZW50IGludG8gaW5zZXJ0aW9uLgorICAgKgorICAgKiAgVGhlc2UgYXJlIG91dHB1dCBpdGVyYXRvcnMsIGNvbnN0cnVjdGVkIGZyb20gYSBjb250YWluZXItb2YtVC4KKyAgICogIEFzc2lnbmluZyBhIFQgdG8gdGhlIGl0ZXJhdG9yIGFwcGVuZHMgaXQgdG8gdGhlIGNvbnRhaW5lciB1c2luZworICAgKiAgcHVzaF9iYWNrLgorICAgKgorICAgKiAgVGlwOiAgVXNpbmcgdGhlIGJhY2tfaW5zZXJ0ZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZXNlIGl0ZXJhdG9ycyBjYW4KKyAgICogIHNhdmUgdHlwaW5nLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGNsYXNzIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX0NvbnRhaW5lciogY29udGFpbmVyOworCisgICAgcHVibGljOgorICAgICAgLy8vIEEgbmVzdGVkIHR5cGVkZWYgZm9yIHRoZSB0eXBlIG9mIHdoYXRldmVyIGNvbnRhaW5lciB5b3UgdXNlZC4KKyAgICAgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKworICAgICAgLy8vIFRoZSBvbmx5IHdheSB0byBjcmVhdGUgdGhpcyAlaXRlcmF0b3IgaXMgd2l0aCBhIGNvbnRhaW5lci4KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYWNrX2luc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcGFyYW0gIF9fdmFsdWUgIEFuIGluc3RhbmNlIG9mIHdoYXRldmVyIHR5cGUKKyAgICAgICAqICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGlzOyBwcmVzdW1hYmx5IGEKKyAgICAgICAqICAgICAgICAgICAgICAgICByZWZlcmVuY2UtdG8tY29uc3QgVCBmb3IgY29udGFpbmVyPFQ+LgorICAgICAgICogIEByZXR1cm4gIFRoaXMgJWl0ZXJhdG9yLCBmb3IgY2hhaW5lZCBvcGVyYXRpb25zLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGtpbmQgb2YgJWl0ZXJhdG9yIGRvZXNuJ3QgcmVhbGx5IGhhdmUgYSBAYSBwb3NpdGlvbiBpbiB0aGUKKyAgICAgICAqICBjb250YWluZXIgKHlvdSBjYW4gdGhpbmsgb2YgdGhlIHBvc2l0aW9uIGFzIGJlaW5nIHBlcm1hbmVudGx5IGF0CisgICAgICAgKiAgdGhlIGVuZCwgaWYgeW91IGxpa2UpLiAgQXNzaWduaW5nIGEgdmFsdWUgdG8gdGhlICVpdGVyYXRvciB3aWxsCisgICAgICAgKiAgYWx3YXlzIGFwcGVuZCB0aGUgdmFsdWUgdG8gdGhlIGVuZCBvZiB0aGUgY29udGFpbmVyLgorICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgICAgIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KHR5cGVuYW1lIF9Db250YWluZXI6OmNvbnN0X3JlZmVyZW5jZSBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+cHVzaF9iYWNrKF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbHNlCisgICAgICBiYWNrX2luc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+cHVzaF9iYWNrKF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYmFja19pbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0odHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYmIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5wdXNoX2JhY2soc3RkOjptb3ZlKF9fdmFsdWUpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8vIFNpbXBseSByZXR1cm5zICp0aGlzLgorICAgICAgYmFja19pbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgLy8vIFNpbXBseSByZXR1cm5zICp0aGlzLiAgKFRoaXMgJWl0ZXJhdG9yIGRvZXMgbm90IEBhIG1vdmUuKQorICAgICAgYmFja19pbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIC8vLyBTaW1wbHkgcmV0dXJucyAqdGhpcy4gIChUaGlzICVpdGVyYXRvciBkb2VzIG5vdCBAYSBtb3ZlLikKKyAgICAgIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICAvKioKKyAgICogIEBwYXJhbSAgX194ICBBIGNvbnRhaW5lciBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEByZXR1cm4gIEFuIGluc3RhbmNlIG9mIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yIHdvcmtpbmcgb24gQHAgX194LgorICAgKgorICAgKiAgVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGhlbHBzIGluIGNyZWF0aW5nIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yIGluc3RhbmNlcy4KKyAgICogIFR5cGluZyB0aGUgbmFtZSBvZiB0aGUgJWl0ZXJhdG9yIHJlcXVpcmVzIGtub3dpbmcgdGhlIHByZWNpc2UgZnVsbAorICAgKiAgdHlwZSBvZiB0aGUgY29udGFpbmVyLCB3aGljaCBjYW4gYmUgdGVkaW91cyBhbmQgaW1wZWRlcyBnZW5lcmljCisgICAqICBwcm9ncmFtbWluZy4gIFVzaW5nIHRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgdGFrZSBhZHZhbnRhZ2Ugb2YgYXV0b21hdGljCisgICAqICB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVkdWN0aW9uLCBtYWtpbmcgdGhlIGNvbXBpbGVyIG1hdGNoIHRoZSBjb3JyZWN0CisgICAqICB0eXBlcyBmb3IgeW91LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPgorICAgIGJhY2tfaW5zZXJ0ZXIoX0NvbnRhaW5lciYgX194KQorICAgIHsgcmV0dXJuIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+KF9feCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVHVybnMgYXNzaWdubWVudCBpbnRvIGluc2VydGlvbi4KKyAgICoKKyAgICogIFRoZXNlIGFyZSBvdXRwdXQgaXRlcmF0b3JzLCBjb25zdHJ1Y3RlZCBmcm9tIGEgY29udGFpbmVyLW9mLVQuCisgICAqICBBc3NpZ25pbmcgYSBUIHRvIHRoZSBpdGVyYXRvciBwcmVwZW5kcyBpdCB0byB0aGUgY29udGFpbmVyIHVzaW5nCisgICAqICBwdXNoX2Zyb250LgorICAgKgorICAgKiAgVGlwOiAgVXNpbmcgdGhlIGZyb250X2luc2VydGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGVzZSBpdGVyYXRvcnMgY2FuCisgICAqICBzYXZlIHR5cGluZy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBjbGFzcyBmcm9udF9pbnNlcnRfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjxvdXRwdXRfaXRlcmF0b3JfdGFnLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gQSBuZXN0ZWQgdHlwZWRlZiBmb3IgdGhlIHR5cGUgb2Ygd2hhdGV2ZXIgY29udGFpbmVyIHlvdSB1c2VkLgorICAgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworCisgICAgICAvLy8gVGhlIG9ubHkgd2F5IHRvIGNyZWF0ZSB0aGlzICVpdGVyYXRvciBpcyB3aXRoIGEgY29udGFpbmVyLgorICAgICAgZXhwbGljaXQgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBwYXJhbSAgX192YWx1ZSAgQW4gaW5zdGFuY2Ugb2Ygd2hhdGV2ZXIgdHlwZQorICAgICAgICogICAgICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlOjpjb25zdF9yZWZlcmVuY2UgaXM7IHByZXN1bWFibHkgYQorICAgICAgICogICAgICAgICAgICAgICAgIHJlZmVyZW5jZS10by1jb25zdCBUIGZvciBjb250YWluZXI8VD4uCisgICAgICAgKiAgQHJldHVybiAgVGhpcyAlaXRlcmF0b3IsIGZvciBjaGFpbmVkIG9wZXJhdGlvbnMuCisgICAgICAgKgorICAgICAgICogIFRoaXMga2luZCBvZiAlaXRlcmF0b3IgZG9lc24ndCByZWFsbHkgaGF2ZSBhIEBhIHBvc2l0aW9uIGluIHRoZQorICAgICAgICogIGNvbnRhaW5lciAoeW91IGNhbiB0aGluayBvZiB0aGUgcG9zaXRpb24gYXMgYmVpbmcgcGVybWFuZW50bHkgYXQKKyAgICAgICAqICB0aGUgZnJvbnQsIGlmIHlvdSBsaWtlKS4gIEFzc2lnbmluZyBhIHZhbHVlIHRvIHRoZSAlaXRlcmF0b3Igd2lsbAorICAgICAgICogIGFsd2F5cyBwcmVwZW5kIHRoZSB2YWx1ZSB0byB0aGUgZnJvbnQgb2YgdGhlIGNvbnRhaW5lci4KKyAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICBmcm9udF9pbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0odHlwZW5hbWUgX0NvbnRhaW5lcjo6Y29uc3RfcmVmZXJlbmNlIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5wdXNoX2Zyb250KF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbHNlCisgICAgICBmcm9udF9pbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkKKyAgICAgIHsKKwljb250YWluZXItPnB1c2hfZnJvbnQoX192YWx1ZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBmcm9udF9pbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0odHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYmIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5wdXNoX2Zyb250KHN0ZDo6bW92ZShfX3ZhbHVlKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vLyBTaW1wbHkgcmV0dXJucyAqdGhpcy4KKyAgICAgIGZyb250X2luc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICAvLy8gU2ltcGx5IHJldHVybnMgKnRoaXMuICAoVGhpcyAlaXRlcmF0b3IgZG9lcyBub3QgQGEgbW92ZS4pCisgICAgICBmcm9udF9pbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIC8vLyBTaW1wbHkgcmV0dXJucyAqdGhpcy4gIChUaGlzICVpdGVyYXRvciBkb2VzIG5vdCBAYSBtb3ZlLikKKyAgICAgIGZyb250X2luc2VydF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAcGFyYW0gIF9feCAgQSBjb250YWluZXIgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcmV0dXJuICBBbiBpbnN0YW5jZSBvZiBmcm9udF9pbnNlcnRfaXRlcmF0b3Igd29ya2luZyBvbiBAcCB4LgorICAgKgorICAgKiAgVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGhlbHBzIGluIGNyZWF0aW5nIGZyb250X2luc2VydF9pdGVyYXRvciBpbnN0YW5jZXMuCisgICAqICBUeXBpbmcgdGhlIG5hbWUgb2YgdGhlICVpdGVyYXRvciByZXF1aXJlcyBrbm93aW5nIHRoZSBwcmVjaXNlIGZ1bGwKKyAgICogIHR5cGUgb2YgdGhlIGNvbnRhaW5lciwgd2hpY2ggY2FuIGJlIHRlZGlvdXMgYW5kIGltcGVkZXMgZ2VuZXJpYworICAgKiAgcHJvZ3JhbW1pbmcuICBVc2luZyB0aGlzIGZ1bmN0aW9uIGxldHMgeW91IHRha2UgYWR2YW50YWdlIG9mIGF1dG9tYXRpYworICAgKiAgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZHVjdGlvbiwgbWFraW5nIHRoZSBjb21waWxlciBtYXRjaCB0aGUgY29ycmVjdAorICAgKiAgdHlwZXMgZm9yIHlvdS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+CisgICAgZnJvbnRfaW5zZXJ0ZXIoX0NvbnRhaW5lciYgX194KQorICAgIHsgcmV0dXJuIGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFR1cm5zIGFzc2lnbm1lbnQgaW50byBpbnNlcnRpb24uCisgICAqCisgICAqICBUaGVzZSBhcmUgb3V0cHV0IGl0ZXJhdG9ycywgY29uc3RydWN0ZWQgZnJvbSBhIGNvbnRhaW5lci1vZi1ULgorICAgKiAgQXNzaWduaW5nIGEgVCB0byB0aGUgaXRlcmF0b3IgaW5zZXJ0cyBpdCBpbiB0aGUgY29udGFpbmVyIGF0IHRoZQorICAgKiAgJWl0ZXJhdG9yJ3MgcG9zaXRpb24sIHJhdGhlciB0aGFuIG92ZXJ3cml0aW5nIHRoZSB2YWx1ZSBhdCB0aGF0CisgICAqICBwb3NpdGlvbi4KKyAgICoKKyAgICogIChTZXF1ZW5jZXMgd2lsbCBhY3R1YWxseSBpbnNlcnQgYSBAZSBjb3B5IG9mIHRoZSB2YWx1ZSBiZWZvcmUgdGhlCisgICAqICAlaXRlcmF0b3IncyBwb3NpdGlvbi4pCisgICAqCisgICAqICBUaXA6ICBVc2luZyB0aGUgaW5zZXJ0ZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZXNlIGl0ZXJhdG9ycyBjYW4KKyAgICogIHNhdmUgdHlwaW5nLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGNsYXNzIGluc2VydF9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKyAgICAgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gQSBuZXN0ZWQgdHlwZWRlZiBmb3IgdGhlIHR5cGUgb2Ygd2hhdGV2ZXIgY29udGFpbmVyIHlvdSB1c2VkLgorICAgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworCisgICAgICAvKioKKyAgICAgICAqICBUaGUgb25seSB3YXkgdG8gY3JlYXRlIHRoaXMgJWl0ZXJhdG9yIGlzIHdpdGggYSBjb250YWluZXIgYW5kIGFuCisgICAgICAgKiAgaW5pdGlhbCBwb3NpdGlvbiAoYSBub3JtYWwgJWl0ZXJhdG9yIGludG8gdGhlIGNvbnRhaW5lcikuCisgICAgICAqLworICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgX19pKQorICAgICAgOiBjb250YWluZXIoJl9feCksIGl0ZXIoX19pKSB7fQorCisgICAgICAvKioKKyAgICAgICAqICBAcGFyYW0gIF9fdmFsdWUgIEFuIGluc3RhbmNlIG9mIHdoYXRldmVyIHR5cGUKKyAgICAgICAqICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGlzOyBwcmVzdW1hYmx5IGEKKyAgICAgICAqICAgICAgICAgICAgICAgICByZWZlcmVuY2UtdG8tY29uc3QgVCBmb3IgY29udGFpbmVyPFQ+LgorICAgICAgICogIEByZXR1cm4gIFRoaXMgJWl0ZXJhdG9yLCBmb3IgY2hhaW5lZCBvcGVyYXRpb25zLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGtpbmQgb2YgJWl0ZXJhdG9yIG1haW50YWlucyBpdHMgb3duIHBvc2l0aW9uIGluIHRoZQorICAgICAgICogIGNvbnRhaW5lci4gIEFzc2lnbmluZyBhIHZhbHVlIHRvIHRoZSAlaXRlcmF0b3Igd2lsbCBpbnNlcnQgdGhlCisgICAgICAgKiAgdmFsdWUgaW50byB0aGUgY29udGFpbmVyIGF0IHRoZSBwbGFjZSBiZWZvcmUgdGhlICVpdGVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHBvc2l0aW9uIGlzIG1haW50YWluZWQgc3VjaCB0aGF0IHN1YnNlcXVlbnQgYXNzaWdubWVudHMgd2lsbAorICAgICAgICogIGluc2VydCB2YWx1ZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwKKyAgICAgICAqICBAY29kZQorICAgICAgICogICAgIC8vIHZlY3RvciB2IGNvbnRhaW5zIEEgYW5kIFoKKyAgICAgICAqCisgICAgICAgKiAgICAgaW5zZXJ0X2l0ZXJhdG9yIGkgKHYsICsrdi5iZWdpbigpKTsKKyAgICAgICAqICAgICBpID0gMTsKKyAgICAgICAqICAgICBpID0gMjsKKyAgICAgICAqICAgICBpID0gMzsKKyAgICAgICAqCisgICAgICAgKiAgICAgLy8gdmVjdG9yIHYgY29udGFpbnMgQSwgMSwgMiwgMywgYW5kIFoKKyAgICAgICAqICBAZW5kY29kZQorICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgICAgIGluc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPSh0eXBlbmFtZSBfQ29udGFpbmVyOjpjb25zdF9yZWZlcmVuY2UgX192YWx1ZSkKKyAgICAgIHsKKwlpdGVyID0gY29udGFpbmVyLT5pbnNlcnQoaXRlciwgX192YWx1ZSk7CisJKytpdGVyOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbHNlCisgICAgICBpbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkKKyAgICAgIHsKKwlpdGVyID0gY29udGFpbmVyLT5pbnNlcnQoaXRlciwgX192YWx1ZSk7CisJKytpdGVyOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmJiBfX3ZhbHVlKQorICAgICAgeworCWl0ZXIgPSBjb250YWluZXItPmluc2VydChpdGVyLCBzdGQ6Om1vdmUoX192YWx1ZSkpOworCSsraXRlcjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8vIFNpbXBseSByZXR1cm5zICp0aGlzLgorICAgICAgaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIC8vLyBTaW1wbHkgcmV0dXJucyAqdGhpcy4gIChUaGlzICVpdGVyYXRvciBkb2VzIG5vdCBAYSBtb3ZlLikKKyAgICAgIGluc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgLy8vIFNpbXBseSByZXR1cm5zICp0aGlzLiAgKFRoaXMgJWl0ZXJhdG9yIGRvZXMgbm90IEBhIG1vdmUuKQorICAgICAgaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAcGFyYW0gX194ICBBIGNvbnRhaW5lciBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEByZXR1cm4gIEFuIGluc3RhbmNlIG9mIGluc2VydF9pdGVyYXRvciB3b3JraW5nIG9uIEBwIF9feC4KKyAgICoKKyAgICogIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBoZWxwcyBpbiBjcmVhdGluZyBpbnNlcnRfaXRlcmF0b3IgaW5zdGFuY2VzLgorICAgKiAgVHlwaW5nIHRoZSBuYW1lIG9mIHRoZSAlaXRlcmF0b3IgcmVxdWlyZXMga25vd2luZyB0aGUgcHJlY2lzZSBmdWxsCisgICAqICB0eXBlIG9mIHRoZSBjb250YWluZXIsIHdoaWNoIGNhbiBiZSB0ZWRpb3VzIGFuZCBpbXBlZGVzIGdlbmVyaWMKKyAgICogIHByb2dyYW1taW5nLiAgVXNpbmcgdGhpcyBmdW5jdGlvbiBsZXRzIHlvdSB0YWtlIGFkdmFudGFnZSBvZiBhdXRvbWF0aWMKKyAgICogIHRlbXBsYXRlIHBhcmFtZXRlciBkZWR1Y3Rpb24sIG1ha2luZyB0aGUgY29tcGlsZXIgbWF0Y2ggdGhlIGNvcnJlY3QKKyAgICogIHR5cGVzIGZvciB5b3UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db250YWluZXIsIHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+CisgICAgaW5zZXJ0ZXIoX0NvbnRhaW5lciYgX194LCBfSXRlcmF0b3IgX19pKQorICAgIHsKKyAgICAgIHJldHVybiBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4oX194LAorCQkJCQkgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IoX19pKSk7CisgICAgfQorCisgIC8vIEB9IGdyb3VwIGl0ZXJhdG9ycworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBUaGlzIGl0ZXJhdG9yIGFkYXB0ZXIgaXMgQGEgbm9ybWFsIGluIHRoZSBzZW5zZSB0aGF0IGl0IGRvZXMgbm90CisgIC8vIGNoYW5nZSB0aGUgc2VtYW50aWNzIG9mIGFueSBvZiB0aGUgb3BlcmF0b3JzIG9mIGl0cyBpdGVyYXRvcgorICAvLyBwYXJhbWV0ZXIuICBJdHMgcHJpbWFyeSBwdXJwb3NlIGlzIHRvIGNvbnZlcnQgYW4gaXRlcmF0b3IgdGhhdCBpcworICAvLyBub3QgYSBjbGFzcywgZS5nLiBhIHBvaW50ZXIsIGludG8gYW4gaXRlcmF0b3IgdGhhdCBpcyBhIGNsYXNzLgorICAvLyBUaGUgX0NvbnRhaW5lciBwYXJhbWV0ZXIgZXhpc3RzIHNvbGVseSBzbyB0aGF0IGRpZmZlcmVudCBjb250YWluZXJzCisgIC8vIHVzaW5nIHRoaXMgdGVtcGxhdGUgY2FuIGluc3RhbnRpYXRlIGRpZmZlcmVudCB0eXBlcywgZXZlbiBpZiB0aGUKKyAgLy8gX0l0ZXJhdG9yIHBhcmFtZXRlciBpcyB0aGUgc2FtZS4KKyAgdXNpbmcgc3RkOjppdGVyYXRvcl90cmFpdHM7CisgIHVzaW5nIHN0ZDo6aXRlcmF0b3I7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBjbGFzcyBfX25vcm1hbF9pdGVyYXRvcgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfSXRlcmF0b3IgX01fY3VycmVudDsKKworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPgkJX190cmFpdHNfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yCQkJCQlpdGVyYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjppdGVyYXRvcl9jYXRlZ29yeSBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6dmFsdWVfdHlwZSAgCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6OmRpZmZlcmVuY2VfdHlwZSAJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpyZWZlcmVuY2UgCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6cG9pbnRlciAgIAlwb2ludGVyOworCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgX19ub3JtYWxfaXRlcmF0b3IoKSA6IF9NX2N1cnJlbnQoX0l0ZXJhdG9yKCkpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgX19ub3JtYWxfaXRlcmF0b3IoY29uc3QgX0l0ZXJhdG9yJiBfX2kpIDogX01fY3VycmVudChfX2kpIHsgfQorCisgICAgICAvLyBBbGxvdyBpdGVyYXRvciB0byBjb25zdF9pdGVyYXRvciBjb252ZXJzaW9uCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcj4KKyAgICAgICAgX19ub3JtYWxfaXRlcmF0b3IoY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXIsCisJCQkgIHR5cGVuYW1lIF9fZW5hYmxlX2lmPAorICAgICAgCSAgICAgICAoc3RkOjpfX2FyZV9zYW1lPF9JdGVyLCB0eXBlbmFtZSBfQ29udGFpbmVyOjpwb2ludGVyPjo6X192YWx1ZSksCisJCSAgICAgIF9Db250YWluZXI+OjpfX3R5cGU+JiBfX2kpCisgICAgICAgIDogX01fY3VycmVudChfX2kuYmFzZSgpKSB7IH0KKworICAgICAgLy8gRm9yd2FyZCBpdGVyYXRvciByZXF1aXJlbWVudHMKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpfTV9jdXJyZW50OyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VycmVudDsgfQorCisgICAgICBfX25vcm1hbF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCSsrX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuIF9fbm9ybWFsX2l0ZXJhdG9yKF9NX2N1cnJlbnQrKyk7IH0KKworICAgICAgLy8gQmlkaXJlY3Rpb25hbCBpdGVyYXRvciByZXF1aXJlbWVudHMKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJLS1fTV9jdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX19ub3JtYWxfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeyByZXR1cm4gX19ub3JtYWxfaXRlcmF0b3IoX01fY3VycmVudC0tKTsgfQorCisgICAgICAvLyBSYW5kb20gYWNjZXNzIGl0ZXJhdG9yIHJlcXVpcmVtZW50cworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VycmVudFtfX25dOyB9CisKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrPShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikKKyAgICAgIHsgX01fY3VycmVudCArPSBfX247IHJldHVybiAqdGhpczsgfQorCisgICAgICBfX25vcm1hbF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX19ub3JtYWxfaXRlcmF0b3IoX01fY3VycmVudCArIF9fbik7IH0KKworICAgICAgX19ub3JtYWxfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvci09KGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKQorICAgICAgeyBfTV9jdXJyZW50IC09IF9fbjsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvci0oY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfX25vcm1hbF9pdGVyYXRvcihfTV9jdXJyZW50IC0gX19uKTsgfQorCisgICAgICBjb25zdCBfSXRlcmF0b3ImCisgICAgICBiYXNlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKyAgICB9OworCisgIC8vIE5vdGU6IEluIHdoYXQgZm9sbG93cywgdGhlIGxlZnQtIGFuZCByaWdodC1oYW5kLXNpZGUgaXRlcmF0b3JzIGFyZQorICAvLyBhbGxvd2VkIHRvIHZhcnkgaW4gdHlwZXMgKGNvbmNlcHR1YWxseSBpbiBjdi1xdWFsaWZpY2F0aW9uKSBzbyB0aGF0CisgIC8vIGNvbXBhcmlzb24gYmV0d2VlbiBjdi1xdWFsaWZpZWQgYW5kIG5vbi1jdi1xdWFsaWZpZWQgaXRlcmF0b3JzIGJlCisgIC8vIHZhbGlkLiAgSG93ZXZlciwgdGhlIGdyZWVkeSBhbmQgdW5mcmllbmRseSBvcGVyYXRvcnMgaW4gc3RkOjpyZWxfb3BzCisgIC8vIHdpbGwgbWFrZSBvdmVybG9hZCByZXNvbHV0aW9uIGFtYmlndW91cyAod2hlbiBpbiBzY29wZSkgaWYgd2UgZG9uJ3QKKyAgLy8gcHJvdmlkZSBvdmVybG9hZHMgd2hvc2Ugb3BlcmFuZHMgYXJlIG9mIHRoZSBzYW1lIHR5cGUuICBDYW4gc29tZW9uZQorICAvLyByZW1pbmQgbWUgd2hhdCBnZW5lcmljIHByb2dyYW1taW5nIGlzIGFib3V0PyAtLSBHYWJ5CisKKyAgLy8gRm9yd2FyZCBpdGVyYXRvciByZXF1aXJlbWVudHMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpID09IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA9PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9Db250YWluZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgIT0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpICE9IF9fcmhzLmJhc2UoKTsgfQorCisgIC8vIFJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IgcmVxdWlyZW1lbnRzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9Db250YWluZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPCBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpIDwgX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX0NvbnRhaW5lcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA+IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+JiBfX2xocywKKwkgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPiBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9Db250YWluZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPD0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpIDw9IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9Db250YWluZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX0NvbnRhaW5lcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA+PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPj0gX19yaHMuYmFzZSgpOyB9CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyBBY2NvcmRpbmcgdG8gdGhlIHJlc29sdXRpb24gb2YgRFIxNzkgbm90IG9ubHkgdGhlIHZhcmlvdXMgY29tcGFyaXNvbgorICAvLyBvcGVyYXRvcnMgYnV0IGFsc28gb3BlcmF0b3ItIG11c3QgYWNjZXB0IG1peGVkIGl0ZXJhdG9yL2NvbnN0X2l0ZXJhdG9yCisgIC8vIHBhcmFtZXRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9Db250YWluZXI+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIC8vIERSIDY4NS4KKyAgICBpbmxpbmUgYXV0bworICAgIG9wZXJhdG9yLShjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX0NvbnRhaW5lcj4mIF9fcmhzKQorICAgIC0+IGRlY2x0eXBlKF9fbGhzLmJhc2UoKSAtIF9fcmhzLmJhc2UoKSkKKyNlbHNlCisgICAgaW5saW5lIHR5cGVuYW1lIF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9Db250YWluZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBvcGVyYXRvci0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9Db250YWluZXI+JiBfX3JocykKKyNlbmRpZgorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSAtIF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgb3BlcmF0b3ItKGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSAtIF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPgorICAgIG9wZXJhdG9yKyh0eXBlbmFtZSBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+OjpkaWZmZXJlbmNlX3R5cGUKKwkgICAgICBfX24sIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9faSkKKyAgICB7IHJldHVybiBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+KF9faS5iYXNlKCkgKyBfX24pOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBpdGVyYXRvcnMKKyAgICogQHsKKyAgICovCisKKyAgLy8gMjQuNC4zICBNb3ZlIGl0ZXJhdG9ycworICAvKioKKyAgICogIENsYXNzIHRlbXBsYXRlIG1vdmVfaXRlcmF0b3IgaXMgYW4gaXRlcmF0b3IgYWRhcHRlciB3aXRoIHRoZSBzYW1lCisgICAqICBiZWhhdmlvciBhcyB0aGUgdW5kZXJseWluZyBpdGVyYXRvciBleGNlcHQgdGhhdCBpdHMgZGVyZWZlcmVuY2UKKyAgICogIG9wZXJhdG9yIGltcGxpY2l0bHkgY29udmVydHMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSB1bmRlcmx5aW5nCisgICAqICBpdGVyYXRvcidzIGRlcmVmZXJlbmNlIG9wZXJhdG9yIHRvIGFuIHJ2YWx1ZSByZWZlcmVuY2UuICBTb21lCisgICAqICBnZW5lcmljIGFsZ29yaXRobXMgY2FuIGJlIGNhbGxlZCB3aXRoIG1vdmUgaXRlcmF0b3JzIHRvIHJlcGxhY2UKKyAgICogIGNvcHlpbmcgd2l0aCBtb3ZpbmcuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgY2xhc3MgbW92ZV9pdGVyYXRvcgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfSXRlcmF0b3IgX01fY3VycmVudDsKKworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPgkJX190cmFpdHNfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yCQkJCQlpdGVyYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjppdGVyYXRvcl9jYXRlZ29yeSBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6dmFsdWVfdHlwZSAgCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6OmRpZmZlcmVuY2VfdHlwZQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICAvLyBOQjogRFIgNjgwLgorICAgICAgdHlwZWRlZiBfSXRlcmF0b3IJCQkJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUmJgkJCQlyZWZlcmVuY2U7CisKKyAgICAgIG1vdmVfaXRlcmF0b3IoKQorICAgICAgOiBfTV9jdXJyZW50KCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBtb3ZlX2l0ZXJhdG9yKGl0ZXJhdG9yX3R5cGUgX19pKQorICAgICAgOiBfTV9jdXJyZW50KF9faSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyPgorCW1vdmVfaXRlcmF0b3IoY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcj4mIF9faSkKKwk6IF9NX2N1cnJlbnQoX19pLmJhc2UoKSkgeyB9CisKKyAgICAgIGl0ZXJhdG9yX3R5cGUKKyAgICAgIGJhc2UoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VycmVudDsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om1vdmUoKl9NX2N1cnJlbnQpOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VycmVudDsgfQorCisgICAgICBtb3ZlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJKytfTV9jdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgbW92ZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJbW92ZV9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworCSsrX01fY3VycmVudDsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIG1vdmVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKwktLV9NX2N1cnJlbnQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBtb3ZlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwltb3ZlX2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisJLS1fTV9jdXJyZW50OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgbW92ZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBtb3ZlX2l0ZXJhdG9yKF9NX2N1cnJlbnQgKyBfX24pOyB9CisKKyAgICAgIG1vdmVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBfX24pCisgICAgICB7CisJX01fY3VycmVudCArPSBfX247CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBtb3ZlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1vdmVfaXRlcmF0b3IoX01fY3VycmVudCAtIF9fbik7IH0KKyAgICAKKyAgICAgIG1vdmVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBfX24pCisgICAgICB7IAorCV9NX2N1cnJlbnQgLT0gX19uOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om1vdmUoX01fY3VycmVudFtfX25dKTsgfQorICAgIH07CisKKyAgLy8gTm90ZTogU2VlIF9fbm9ybWFsX2l0ZXJhdG9yIG9wZXJhdG9ycyBub3RlIGZyb20gR2FieSB0byB1bmRlcnN0YW5kCisgIC8vIHdoeSB0aGVyZSBhcmUgYWx3YXlzIDIgdmVyc2lvbnMgZm9yIG1vc3Qgb2YgdGhlIG1vdmVfaXRlcmF0b3IKKyAgLy8gb3BlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvckw+JiBfX3gsCisJICAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYmFzZSgpID09IF9feS5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAorCSAgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYmFzZSgpID09IF9feS5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvckw+JiBfX3gsCisJICAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYmFzZSgpIDwgX195LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYmFzZSgpIDwgX195LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3JSPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgLy8gRFIgNjg1LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBhdXRvCisgICAgb3BlcmF0b3ItKGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgLT4gZGVjbHR5cGUoX194LmJhc2UoKSAtIF9feS5iYXNlKCkpCisgICAgeyByZXR1cm4gX194LmJhc2UoKSAtIF9feS5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGF1dG8KKyAgICBvcGVyYXRvci0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgLT4gZGVjbHR5cGUoX194LmJhc2UoKSAtIF9feS5iYXNlKCkpCisgICAgeyByZXR1cm4gX194LmJhc2UoKSAtIF9feS5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPgorICAgIG9wZXJhdG9yKyh0eXBlbmFtZSBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX24sCisJICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gpCisgICAgeyByZXR1cm4gX194ICsgX19uOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4KKyAgICBtYWtlX21vdmVfaXRlcmF0b3IoX0l0ZXJhdG9yIF9faSkKKyAgICB7IHJldHVybiBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4oX19pKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1JldHVyblR5cGUKKyAgICA9IHR5cGVuYW1lIGNvbmRpdGlvbmFsPF9fbW92ZV9pZl9ub2V4Y2VwdF9jb25kCisgICAgICA8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnZhbHVlX3R5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICBfSXRlcmF0b3IsIG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPj46OnR5cGU+CisgICAgaW5saW5lIF9SZXR1cm5UeXBlCisgICAgX19tYWtlX21vdmVfaWZfbm9leGNlcHRfaXRlcmF0b3IoX0l0ZXJhdG9yIF9faSkKKyAgICB7IHJldHVybiBfUmV0dXJuVHlwZShfX2kpOyB9CisKKyAgLy8gQH0gZ3JvdXAgaXRlcmF0b3JzCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2RlZmluZSBfR0xJQkNYWF9NQUtFX01PVkVfSVRFUkFUT1IoX0l0ZXIpIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKF9JdGVyKQorI2RlZmluZSBfR0xJQkNYWF9NQUtFX01PVkVfSUZfTk9FWENFUFRfSVRFUkFUT1IoX0l0ZXIpIFwKKyAgc3RkOjpfX21ha2VfbW92ZV9pZl9ub2V4Y2VwdF9pdGVyYXRvcihfSXRlcikKKyNlbHNlCisjZGVmaW5lIF9HTElCQ1hYX01BS0VfTU9WRV9JVEVSQVRPUihfSXRlcikgKF9JdGVyKQorI2RlZmluZSBfR0xJQkNYWF9NQUtFX01PVkVfSUZfTk9FWENFUFRfSVRFUkFUT1IoX0l0ZXIpIChfSXRlcikKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9pdGVyYXRvcl9iYXNlX2Z1bmNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3MWUyNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oCkBAIC0wLDAgKzEsMjA1IEBACisvLyBGdW5jdGlvbnMgdXNlZCBieSBpdGVyYXRvcnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfZnVuY3MuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2l0ZXJhdG9yfQorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIG9mIHRoZSBnZW5lcmFsIGl0ZXJhdG9yLXJlbGF0ZWQgdXRpbGl0eQorICogIGZ1bmN0aW9ucywgc3VjaCBhcyBkaXN0YW5jZSgpIGFuZCBhZHZhbmNlKCkuCisgKi8KKworI2lmbmRlZiBfU1RMX0lURVJBVE9SX0JBU0VfRlVOQ1NfSAorI2RlZmluZSBfU1RMX0lURVJBVE9SX0JBU0VfRlVOQ1NfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19kaXN0YW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorCisgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19uID0gMDsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICArK19fZmlyc3Q7CisJICArK19fbjsKKwl9CisgICAgICByZXR1cm4gX19uOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBfX2Rpc3RhbmNlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIHJldHVybiBfX2xhc3QgLSBfX2ZpcnN0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBBIGdlbmVyYWxpemF0aW9uIG9mIHBvaW50ZXIgYXJpdGhtZXRpYy4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0aGVtLgorICAgKgorICAgKiAgUmV0dXJucyBAYyBuIHN1Y2ggdGhhdCBfX2ZpcnN0ICsgbiA9PSBfX2xhc3QuICBUaGlzIHJlcXVpcmVzCisgICAqICB0aGF0IEBwIF9fbGFzdCBtdXN0IGJlIHJlYWNoYWJsZSBmcm9tIEBwIF9fZmlyc3QuICBOb3RlIHRoYXQgQGMKKyAgICogIG4gbWF5IGJlIG5lZ2F0aXZlLgorICAgKgorICAgKiAgRm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLCB0aGlzIHVzZXMgdGhlaXIgQGMgKyBhbmQgQGMgLSBvcGVyYXRpb25zCisgICAqICBhbmQgYXJlIGNvbnN0YW50IHRpbWUuICBGb3Igb3RoZXIgJWl0ZXJhdG9yIGNsYXNzZXMgdGhleSBhcmUgbGluZWFyIHRpbWUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIGlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBkaXN0YW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMgLS0gdGFrZW4gY2FyZSBvZiBpbiBfX2Rpc3RhbmNlCisgICAgICByZXR1cm4gc3RkOjpfX2Rpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwKKwkJCSAgICAgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fYWR2YW5jZShfSW5wdXRJdGVyYXRvciYgX19pLCBfRGlzdGFuY2UgX19uLCBpbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9fbiA+PSAwKTsKKyAgICAgIHdoaWxlIChfX24tLSkKKwkrK19faTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIGlubGluZSB2b2lkCisgICAgX19hZHZhbmNlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3ImIF9faSwgX0Rpc3RhbmNlIF9fbiwKKwkgICAgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4pCisgICAgICBpZiAoX19uID4gMCkKKyAgICAgICAgd2hpbGUgKF9fbi0tKQorCSAgKytfX2k7CisgICAgICBlbHNlCisgICAgICAgIHdoaWxlIChfX24rKykKKwkgIC0tX19pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fYWR2YW5jZShfUmFuZG9tQWNjZXNzSXRlcmF0b3ImIF9faSwgX0Rpc3RhbmNlIF9fbiwKKyAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9faSArPSBfX247CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEEgZ2VuZXJhbGl6YXRpb24gb2YgcG9pbnRlciBhcml0aG1ldGljLgorICAgKiAgQHBhcmFtICBfX2kgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX24gIFRoZSBAYSBkZWx0YSBieSB3aGljaCB0byBjaGFuZ2UgQHAgX19pLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFRoaXMgaW5jcmVtZW50cyBAcCBpIGJ5IEBwIG4uICBGb3IgYmlkaXJlY3Rpb25hbCBhbmQgcmFuZG9tIGFjY2VzcworICAgKiAgaXRlcmF0b3JzLCBAcCBfX24gbWF5IGJlIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIEBwIF9faSBpcyBkZWNyZW1lbnRlZC4KKyAgICoKKyAgICogIEZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycywgdGhpcyB1c2VzIHRoZWlyIEBjICsgYW5kIEBjIC0gb3BlcmF0aW9ucworICAgKiAgYW5kIGFyZSBjb25zdGFudCB0aW1lLiAgRm9yIG90aGVyICVpdGVyYXRvciBjbGFzc2VzIHRoZXkgYXJlIGxpbmVhciB0aW1lLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIGlubGluZSB2b2lkCisgICAgYWR2YW5jZShfSW5wdXRJdGVyYXRvciYgX19pLCBfRGlzdGFuY2UgX19uKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzIC0tIHRha2VuIGNhcmUgb2YgaW4gX19hZHZhbmNlCisgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19kID0gX19uOworICAgICAgc3RkOjpfX2FkdmFuY2UoX19pLCBfX2QsIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2kpKTsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX0ZvcndhcmRJdGVyYXRvcgorICAgIG5leHQoX0ZvcndhcmRJdGVyYXRvciBfX3gsIHR5cGVuYW1lCisJIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbiA9IDEpCisgICAgeworICAgICAgc3RkOjphZHZhbmNlKF9feCwgX19uKTsKKyAgICAgIHJldHVybiBfX3g7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+CisgICAgaW5saW5lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IKKyAgICBwcmV2KF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX194LCB0eXBlbmFtZQorCSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX24gPSAxKSAKKyAgICB7CisgICAgICBzdGQ6OmFkdmFuY2UoX194LCAtX19uKTsKKyAgICAgIHJldHVybiBfX3g7CisgICAgfQorCisjZW5kaWYgLy8gQysrMTEKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1NUTF9JVEVSQVRPUl9CQVNFX0ZVTkNTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9pdGVyYXRvcl9iYXNlX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlNWY3YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oCkBAIC0wLDAgKzEsMjM2IEBACisvLyBUeXBlcyB1c2VkIGluIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX3R5cGVzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpdGVyYXRvcn0KKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBvZiB0aGUgZ2VuZXJhbCBpdGVyYXRvci1yZWxhdGVkIHV0aWxpdHkgdHlwZXMsCisgKiAgc3VjaCBhcyBpdGVyYXRvcl90cmFpdHMgYW5kIHN0cnVjdCBpdGVyYXRvci4KKyAqLworCisjaWZuZGVmIF9TVExfSVRFUkFUT1JfQkFTRV9UWVBFU19ICisjZGVmaW5lIF9TVExfSVRFUkFUT1JfQkFTRV9UWVBFU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgaW5jbHVkZSA8dHlwZV90cmFpdHM+ICAvLyBGb3IgX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFLCBpc19jb252ZXJ0aWJsZQorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBkZWZncm91cCBpdGVyYXRvcnMgSXRlcmF0b3JzCisgICAqICBBYnN0cmFjdGlvbnMgZm9yIHVuaWZvcm0gaXRlcmF0aW5nIHRocm91Z2ggdmFyaW91cyB1bmRlcmx5aW5nIHR5cGVzLgorICAqLworICAvL0B7IAorCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIGl0ZXJhdG9yX3RhZ3MgSXRlcmF0b3IgVGFncworICAgKiAgVGhlc2UgYXJlIGVtcHR5IHR5cGVzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpdGVyYXRvcnMuICBUaGUKKyAgICogIGRpc3RpbmN0aW9uIGlzIG5vdCBtYWRlIGJ5IHdoYXQgdGhleSBjb250YWluLCBidXQgc2ltcGx5IGJ5IHdoYXQgdGhleQorICAgKiAgYXJlLiAgRGlmZmVyZW50IHVuZGVybHlpbmcgYWxnb3JpdGhtcyBjYW4gdGhlbiBiZSB1c2VkIGJhc2VkIG9uIHRoZQorICAgKiAgZGlmZmVyZW50IG9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IGRpZmZlcmVudCBpdGVyYXRvciB0eXBlcy4KKyAgKi8KKyAgLy9AeyAKKyAgLy8vICBNYXJraW5nIGlucHV0IGl0ZXJhdG9ycy4KKyAgc3RydWN0IGlucHV0X2l0ZXJhdG9yX3RhZyB7IH07CisKKyAgLy8vICBNYXJraW5nIG91dHB1dCBpdGVyYXRvcnMuCisgIHN0cnVjdCBvdXRwdXRfaXRlcmF0b3JfdGFnIHsgfTsKKworICAvLy8gRm9yd2FyZCBpdGVyYXRvcnMgc3VwcG9ydCBhIHN1cGVyc2V0IG9mIGlucHV0IGl0ZXJhdG9yIG9wZXJhdGlvbnMuCisgIHN0cnVjdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyA6IHB1YmxpYyBpbnB1dF9pdGVyYXRvcl90YWcgeyB9OworCisgIC8vLyBCaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycyBzdXBwb3J0IGEgc3VwZXJzZXQgb2YgZm9yd2FyZCBpdGVyYXRvcgorICAvLy8gb3BlcmF0aW9ucy4KKyAgc3RydWN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIDogcHVibGljIGZvcndhcmRfaXRlcmF0b3JfdGFnIHsgfTsKKworICAvLy8gUmFuZG9tLWFjY2VzcyBpdGVyYXRvcnMgc3VwcG9ydCBhIHN1cGVyc2V0IG9mIGJpZGlyZWN0aW9uYWwKKyAgLy8vIGl0ZXJhdG9yIG9wZXJhdGlvbnMuCisgIHN0cnVjdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyA6IHB1YmxpYyBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyB7IH07CisgIC8vQH0KKworICAvKioKKyAgICogIEBicmllZiAgQ29tbW9uICVpdGVyYXRvciBjbGFzcy4KKyAgICoKKyAgICogIFRoaXMgY2xhc3MgZG9lcyBub3RoaW5nIGJ1dCBkZWZpbmUgbmVzdGVkIHR5cGVkZWZzLiAgJUl0ZXJhdG9yIGNsYXNzZXMKKyAgICogIGNhbiBpbmhlcml0IGZyb20gdGhpcyBjbGFzcyB0byBzYXZlIHNvbWUgd29yay4gIFRoZSB0eXBlZGVmcyBhcmUgdGhlbgorICAgKiAgdXNlZCBpbiBzcGVjaWFsaXphdGlvbnMgYW5kIG92ZXJsb2FkaW5nLgorICAgKgorICAgKiAgSW4gcGFydGljdWxhciwgdGhlcmUgYXJlIG5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHJlcXVpcmVtZW50cworICAgKiAgc3VjaCBhcyBAYyBvcGVyYXRvcisrIGFuZCB0aGUgbGlrZS4gIChIb3cgY291bGQgdGhlcmUgYmU/KQorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2F0ZWdvcnksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0Rpc3RhbmNlID0gcHRyZGlmZl90LAorICAgICAgICAgICB0eXBlbmFtZSBfUG9pbnRlciA9IF9UcCosIHR5cGVuYW1lIF9SZWZlcmVuY2UgPSBfVHAmPgorICAgIHN0cnVjdCBpdGVyYXRvcgorICAgIHsKKyAgICAgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGl0ZXJhdG9yX3RhZ3MgdGFnIHR5cGVzQGVuZGxpbmsuCisgICAgICB0eXBlZGVmIF9DYXRlZ29yeSAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICAvLy8gVGhlIHR5cGUgInBvaW50ZWQgdG8iIGJ5IHRoZSBpdGVyYXRvci4KKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOworICAgICAgLy8vIERpc3RhbmNlIGJldHdlZW4gaXRlcmF0b3JzIGlzIHJlcHJlc2VudGVkIGFzIHRoaXMgdHlwZS4KKyAgICAgIHR5cGVkZWYgX0Rpc3RhbmNlICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICAvLy8gVGhpcyB0eXBlIHJlcHJlc2VudHMgYSBwb2ludGVyLXRvLXZhbHVlX3R5cGUuCisgICAgICB0eXBlZGVmIF9Qb2ludGVyICAgcG9pbnRlcjsKKyAgICAgIC8vLyBUaGlzIHR5cGUgcmVwcmVzZW50cyBhIHJlZmVyZW5jZS10by12YWx1ZV90eXBlLgorICAgICAgdHlwZWRlZiBfUmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBUcmFpdHMgY2xhc3MgZm9yIGl0ZXJhdG9ycy4KKyAgICoKKyAgICogIFRoaXMgY2xhc3MgZG9lcyBub3RoaW5nIGJ1dCBkZWZpbmUgbmVzdGVkIHR5cGVkZWZzLiAgVGhlIGdlbmVyYWwKKyAgICogIHZlcnNpb24gc2ltcGx5IEBhIGZvcndhcmRzIHRoZSBuZXN0ZWQgdHlwZWRlZnMgZnJvbSB0aGUgSXRlcmF0b3IKKyAgICogIGFyZ3VtZW50LiAgU3BlY2lhbGl6ZWQgdmVyc2lvbnMgZm9yIHBvaW50ZXJzIGFuZCBwb2ludGVycy10by1jb25zdAorICAgKiAgcHJvdmlkZSB0aWdodGVyLCBtb3JlIGNvcnJlY3Qgc2VtYW50aWNzLgorICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFKGl0ZXJhdG9yX2NhdGVnb3J5KQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwKKwkgICBib29sID0gX19oYXNfaXRlcmF0b3JfY2F0ZWdvcnk8X0l0ZXJhdG9yPjo6dmFsdWU+CisgICAgc3RydWN0IF9faXRlcmF0b3JfdHJhaXRzIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgc3RydWN0IF9faXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvciwgdHJ1ZT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6dmFsdWVfdHlwZSAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yOjpkaWZmZXJlbmNlX3R5cGUgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6cG9pbnRlciAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yOjpyZWZlcmVuY2UgICAgICAgICByZWZlcmVuY2U7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgc3RydWN0IGl0ZXJhdG9yX3RyYWl0cworICAgIDogcHVibGljIF9faXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj4geyB9OworI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIHN0cnVjdCBpdGVyYXRvcl90cmFpdHMKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6dmFsdWVfdHlwZSAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yOjpkaWZmZXJlbmNlX3R5cGUgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6cG9pbnRlciAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yOjpyZWZlcmVuY2UgICAgICAgICByZWZlcmVuY2U7CisgICAgfTsKKyNlbmRpZgorCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBwb2ludGVyIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGl0ZXJhdG9yX3RyYWl0czxfVHAqPgorICAgIHsKKyAgICAgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1RwJiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB9OworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBjb25zdCBwb2ludGVyIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGl0ZXJhdG9yX3RyYWl0czxjb25zdCBfVHAqPgorICAgIHsKKyAgICAgIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB9OworCisgIC8qKgorICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgYSBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQgYnV0IGlzIHN5bnRhY3RpYworICAgKiAgc3VnYXIgZm9yIGludGVybmFsIGxpYnJhcnkgdXNlIG9ubHkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyPgorICAgIGlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeQorICAgIF9faXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX0l0ZXImKQorICAgIHsgcmV0dXJuIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5KCk7IH0KKworICAvL0B9CisKKyAgLy8gSWYgX0l0ZXJhdG9yIGhhcyBhIGJhc2UgcmV0dXJucyBpdCBvdGhlcndpc2UgX0l0ZXJhdG9yIGlzIHJldHVybmVkCisgIC8vIHVudG91Y2hlZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIGJvb2wgX0hhc0Jhc2U+CisgICAgc3RydWN0IF9JdGVyX2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIF9JdGVyYXRvciBpdGVyYXRvcl90eXBlOworICAgICAgc3RhdGljIGl0ZXJhdG9yX3R5cGUgX1NfYmFzZShfSXRlcmF0b3IgX19pdCkKKyAgICAgIHsgcmV0dXJuIF9faXQ7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBzdHJ1Y3QgX0l0ZXJfYmFzZTxfSXRlcmF0b3IsIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6Oml0ZXJhdG9yX3R5cGUgaXRlcmF0b3JfdHlwZTsKKyAgICAgIHN0YXRpYyBpdGVyYXRvcl90eXBlIF9TX2Jhc2UoX0l0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBfX2l0LmJhc2UoKTsgfQorICAgIH07CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgdXNpbmcgX1JlcXVpcmVJbnB1dEl0ZXIgPSB0eXBlbmFtZQorICAgICAgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPHR5cGVuYW1lCisJCWl0ZXJhdG9yX3RyYWl0czxfSW5JdGVyPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisJCQkgICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnPjo6dmFsdWU+Ojp0eXBlOworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9TVExfSVRFUkFUT1JfQkFTRV9UWVBFU19IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfbGlzdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2NzYwYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfbGlzdC5oCkBAIC0wLDAgKzEsMTY2OCBAQAorLy8gTGlzdCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfbGlzdC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bGlzdH0KKyAqLworCisjaWZuZGVmIF9TVExfTElTVF9ICisjZGVmaW5lIF9TVExfTElTVF9IIDEKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLy8gU3VwcG9ydGluZyBzdHJ1Y3R1cmVzIGFyZSBzcGxpdCBpbnRvIGNvbW1vbiBhbmQgdGVtcGxhdGVkCisgICAgLy8gdHlwZXM7IHRoZSBsYXR0ZXIgcHVibGljbHkgaW5oZXJpdHMgZnJvbSB0aGUgZm9ybWVyIGluIGFuCisgICAgLy8gZWZmb3J0IHRvIHJlZHVjZSBjb2RlIGR1cGxpY2F0aW9uLiAgVGhpcyByZXN1bHRzIGluIHNvbWUKKyAgICAvLyAibmVlZGxlc3MiIHN0YXRpY19jYXN0J2luZyBsYXRlciBvbiwgYnV0IGl0J3MgYWxsIHNhZmUKKyAgICAvLyBkb3duY2FzdGluZy4KKworICAgIC8vLyBDb21tb24gcGFydCBvZiBhIG5vZGUgaW4gdGhlICVsaXN0LiAKKyAgICBzdHJ1Y3QgX0xpc3Rfbm9kZV9iYXNlCisgICAgeworICAgICAgX0xpc3Rfbm9kZV9iYXNlKiBfTV9uZXh0OworICAgICAgX0xpc3Rfbm9kZV9iYXNlKiBfTV9wcmV2OworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgc3dhcChfTGlzdF9ub2RlX2Jhc2UmIF9feCwgX0xpc3Rfbm9kZV9iYXNlJiBfX3kpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKworICAgICAgdm9pZAorICAgICAgX01fdHJhbnNmZXIoX0xpc3Rfbm9kZV9iYXNlKiBjb25zdCBfX2ZpcnN0LAorCQkgIF9MaXN0X25vZGVfYmFzZSogY29uc3QgX19sYXN0KSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3JldmVyc2UoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2hvb2soX0xpc3Rfbm9kZV9iYXNlKiBjb25zdCBfX3Bvc2l0aW9uKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3VuaG9vaygpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyAgICB9OworCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIC8vLyBBbiBhY3R1YWwgbm9kZSBpbiB0aGUgJWxpc3QuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0xpc3Rfbm9kZSA6IHB1YmxpYyBfX2RldGFpbDo6X0xpc3Rfbm9kZV9iYXNlCisgICAgeworICAgICAgLy8vPCBVc2VyJ3MgZGF0YS4KKyAgICAgIF9UcCBfTV9kYXRhOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIF9MaXN0X25vZGUoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJOiBfX2RldGFpbDo6X0xpc3Rfbm9kZV9iYXNlKCksIF9NX2RhdGEoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSAKKyAgICAgICAgeyB9CisjZW5kaWYKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgbGlzdDo6aXRlcmF0b3IuCisgICAqCisgICAqICBBbGwgdGhlIGZ1bmN0aW9ucyBhcmUgb3Agb3ZlcmxvYWRzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9MaXN0X2l0ZXJhdG9yCisgICAgeworICAgICAgdHlwZWRlZiBfTGlzdF9pdGVyYXRvcjxfVHA+ICAgICAgICAgICAgICAgIF9TZWxmOworICAgICAgdHlwZWRlZiBfTGlzdF9ub2RlPF9UcD4gICAgICAgICAgICAgICAgICAgIF9Ob2RlOworCisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1RwJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgICAgIF9MaXN0X2l0ZXJhdG9yKCkKKyAgICAgIDogX01fbm9kZSgpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgX0xpc3RfaXRlcmF0b3IoX19kZXRhaWw6Ol9MaXN0X25vZGVfYmFzZSogX194KQorICAgICAgOiBfTV9ub2RlKF9feCkgeyB9CisKKyAgICAgIC8vIE11c3QgZG93bmNhc3QgZnJvbSBfTGlzdF9ub2RlX2Jhc2UgdG8gX0xpc3Rfbm9kZSB0byBnZXQgdG8gX01fZGF0YS4KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9Ob2RlKj4oX01fbm9kZSktPl9NX2RhdGE7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHN0YXRpY19jYXN0PF9Ob2RlKj4oX01fbm9kZSktPl9NX2RhdGEpOyB9CisKKyAgICAgIF9TZWxmJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX1NlbGYgX190bXAgPSAqdGhpczsKKwlfTV9ub2RlID0gX01fbm9kZS0+X01fbmV4dDsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIF9TZWxmJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJX01fbm9kZSA9IF9NX25vZGUtPl9NX3ByZXY7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7CisJX1NlbGYgX190bXAgPSAqdGhpczsKKwlfTV9ub2RlID0gX01fbm9kZS0+X01fcHJldjsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1NlbGYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGUgPT0gX194Ll9NX25vZGU7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBfU2VsZiYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZSAhPSBfX3guX01fbm9kZTsgfQorCisgICAgICAvLyBUaGUgb25seSBtZW1iZXIgcG9pbnRzIHRvIHRoZSAlbGlzdCBlbGVtZW50LgorICAgICAgX19kZXRhaWw6Ol9MaXN0X25vZGVfYmFzZSogX01fbm9kZTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgbGlzdDo6Y29uc3RfaXRlcmF0b3IuCisgICAqCisgICAqICBBbGwgdGhlIGZ1bmN0aW9ucyBhcmUgb3Agb3ZlcmxvYWRzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9MaXN0X2NvbnN0X2l0ZXJhdG9yCisgICAgeworICAgICAgdHlwZWRlZiBfTGlzdF9jb25zdF9pdGVyYXRvcjxfVHA+ICAgICAgICAgIF9TZWxmOworICAgICAgdHlwZWRlZiBjb25zdCBfTGlzdF9ub2RlPF9UcD4gICAgICAgICAgICAgIF9Ob2RlOworICAgICAgdHlwZWRlZiBfTGlzdF9pdGVyYXRvcjxfVHA+ICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCogICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJiAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgICAgIF9MaXN0X2NvbnN0X2l0ZXJhdG9yKCkKKyAgICAgIDogX01fbm9kZSgpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgX0xpc3RfY29uc3RfaXRlcmF0b3IoY29uc3QgX19kZXRhaWw6Ol9MaXN0X25vZGVfYmFzZSogX194KQorICAgICAgOiBfTV9ub2RlKF9feCkgeyB9CisKKyAgICAgIF9MaXN0X2NvbnN0X2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX3gpCisgICAgICA6IF9NX25vZGUoX194Ll9NX25vZGUpIHsgfQorCisgICAgICAvLyBNdXN0IGRvd25jYXN0IGZyb20gTGlzdF9ub2RlX2Jhc2UgdG8gX0xpc3Rfbm9kZSB0byBnZXQgdG8KKyAgICAgIC8vIF9NX2RhdGEuCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfTm9kZSo+KF9NX25vZGUpLT5fTV9kYXRhOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihzdGF0aWNfY2FzdDxfTm9kZSo+KF9NX25vZGUpLT5fTV9kYXRhKTsgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9NX25vZGUgPSBfTV9ub2RlLT5fTV9uZXh0OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCV9NX25vZGUgPSBfTV9ub2RlLT5fTV9wcmV2OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJX01fbm9kZSA9IF9NX25vZGUtPl9NX3ByZXY7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ub2RlID09IF9feC5fTV9ub2RlOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgX1NlbGYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGUgIT0gX194Ll9NX25vZGU7IH0KKworICAgICAgLy8gVGhlIG9ubHkgbWVtYmVyIHBvaW50cyB0byB0aGUgJWxpc3QgZWxlbWVudC4KKyAgICAgIGNvbnN0IF9fZGV0YWlsOjpfTGlzdF9ub2RlX2Jhc2UqIF9NX25vZGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfTGlzdF9pdGVyYXRvcjxfVmFsPiYgX194LAorCSAgICAgICBjb25zdCBfTGlzdF9jb25zdF9pdGVyYXRvcjxfVmFsPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9ub2RlID09IF9feS5fTV9ub2RlOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX0xpc3RfaXRlcmF0b3I8X1ZhbD4mIF9feCwKKyAgICAgICAgICAgICAgIGNvbnN0IF9MaXN0X2NvbnN0X2l0ZXJhdG9yPF9WYWw+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX25vZGUgIT0gX195Ll9NX25vZGU7IH0KKworCisgIC8vLyBTZWUgYml0cy9zdGxfZGVxdWUuaCdzIF9EZXF1ZV9iYXNlIGZvciBhbiBleHBsYW5hdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgX0xpc3RfYmFzZQorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyBOT1RBIEJFTkUKKyAgICAgIC8vIFRoZSBzdG9yZWQgaW5zdGFuY2UgaXMgbm90IGFjdHVhbGx5IG9mICJhbGxvY2F0b3JfdHlwZSIncworICAgICAgLy8gdHlwZS4gIEluc3RlYWQgd2UgcmViaW5kIHRoZSB0eXBlIHRvCisgICAgICAvLyBBbGxvY2F0b3I8TGlzdF9ub2RlPFRwPj4sIHdoaWNoIGFjY29yZGluZyB0byBbMjAuMS41XS80CisgICAgICAvLyBzaG91bGQgcHJvYmFibHkgYmUgdGhlIHNhbWUuICBMaXN0X25vZGU8VHA+IGlzIG5vdCB0aGUgc2FtZQorICAgICAgLy8gc2l6ZSBhcyBUcCAoaXQncyB0d28gcG9pbnRlcnMgbGFyZ2VyKSwgYW5kIHNwZWNpYWxpemF0aW9ucyBvbgorICAgICAgLy8gVHAgbWF5IGdvIHVudXNlZCBiZWNhdXNlIExpc3Rfbm9kZTxUcD4gaXMgYmVpbmcgYm91bmQKKyAgICAgIC8vIGluc3RlYWQuCisgICAgICAvLworICAgICAgLy8gV2UgcHV0IHRoaXMgdG8gdGhlIHRlc3QgaW4gdGhlIGNvbnN0cnVjdG9ycyBhbmQgaW4KKyAgICAgIC8vIGdldF9hbGxvY2F0b3IsIHdoZXJlIHdlIHVzZSBjb252ZXJzaW9ucyBiZXR3ZWVuCisgICAgICAvLyBhbGxvY2F0b3JfdHlwZSBhbmQgX05vZGVfYWxsb2NfdHlwZS4gVGhlIGNvbnZlcnNpb24gaXMKKyAgICAgIC8vIHJlcXVpcmVkIGJ5IHRhYmxlIDMyIGluIFsyMC4xLjVdLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfTGlzdF9ub2RlPF9UcD4gPjo6b3RoZXIKKyAgICAgICAgX05vZGVfYWxsb2NfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfVHA+OjpvdGhlciBfVHBfYWxsb2NfdHlwZTsKKworICAgICAgc3RydWN0IF9MaXN0X2ltcGwKKyAgICAgIDogcHVibGljIF9Ob2RlX2FsbG9jX3R5cGUKKyAgICAgIHsKKwlfX2RldGFpbDo6X0xpc3Rfbm9kZV9iYXNlIF9NX25vZGU7CisKKwlfTGlzdF9pbXBsKCkKKwk6IF9Ob2RlX2FsbG9jX3R5cGUoKSwgX01fbm9kZSgpCisJeyB9CisKKwlfTGlzdF9pbXBsKGNvbnN0IF9Ob2RlX2FsbG9jX3R5cGUmIF9fYSkKKwk6IF9Ob2RlX2FsbG9jX3R5cGUoX19hKSwgX01fbm9kZSgpCisJeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisJX0xpc3RfaW1wbChfTm9kZV9hbGxvY190eXBlJiYgX19hKQorCTogX05vZGVfYWxsb2NfdHlwZShzdGQ6Om1vdmUoX19hKSksIF9NX25vZGUoKQorCXsgfQorI2VuZGlmCisgICAgICB9OworCisgICAgICBfTGlzdF9pbXBsIF9NX2ltcGw7CisKKyAgICAgIF9MaXN0X25vZGU8X1RwPioKKyAgICAgIF9NX2dldF9ub2RlKCkKKyAgICAgIHsgcmV0dXJuIF9NX2ltcGwuX05vZGVfYWxsb2NfdHlwZTo6YWxsb2NhdGUoMSk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fcHV0X25vZGUoX0xpc3Rfbm9kZTxfVHA+KiBfX3ApCisgICAgICB7IF9NX2ltcGwuX05vZGVfYWxsb2NfdHlwZTo6ZGVhbGxvY2F0ZShfX3AsIDEpOyB9CisKKyAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIF9Ob2RlX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9Ob2RlX2FsbG9jX3R5cGUqPigmX01faW1wbCk7IH0KKworICAgICAgY29uc3QgX05vZGVfYWxsb2NfdHlwZSYKKyAgICAgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX05vZGVfYWxsb2NfdHlwZSo+KCZfTV9pbXBsKTsgfQorCisgICAgICBfVHBfYWxsb2NfdHlwZQorICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfVHBfYWxsb2NfdHlwZShfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUoX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIF9MaXN0X2Jhc2UoKQorICAgICAgOiBfTV9pbXBsKCkKKyAgICAgIHsgX01faW5pdCgpOyB9CisKKyAgICAgIF9MaXN0X2Jhc2UoY29uc3QgX05vZGVfYWxsb2NfdHlwZSYgX19hKQorICAgICAgOiBfTV9pbXBsKF9fYSkKKyAgICAgIHsgX01faW5pdCgpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBfTGlzdF9iYXNlKF9MaXN0X2Jhc2UmJiBfX3gpCisgICAgICA6IF9NX2ltcGwoc3RkOjptb3ZlKF9feC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSkpCisgICAgICB7CisJX01faW5pdCgpOworCV9fZGV0YWlsOjpfTGlzdF9ub2RlX2Jhc2U6OnN3YXAoX01faW1wbC5fTV9ub2RlLCBfX3guX01faW1wbC5fTV9ub2RlKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvLyBUaGlzIGlzIHdoYXQgYWN0dWFsbHkgZGVzdHJveXMgdGhlIGxpc3QuCisgICAgICB+X0xpc3RfYmFzZSgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX2NsZWFyKCk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fY2xlYXIoKTsKKworICAgICAgdm9pZAorICAgICAgX01faW5pdCgpCisgICAgICB7CisgICAgICAgIHRoaXMtPl9NX2ltcGwuX01fbm9kZS5fTV9uZXh0ID0gJnRoaXMtPl9NX2ltcGwuX01fbm9kZTsKKyAgICAgICAgdGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX3ByZXYgPSAmdGhpcy0+X01faW1wbC5fTV9ub2RlOworICAgICAgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgd2l0aCBsaW5lYXIgdGltZSBhY2Nlc3MgdG8gZWxlbWVudHMsCisgICAqICBhbmQgZml4ZWQgdGltZSBpbnNlcnRpb24vZGVsZXRpb24gYXQgYW55IHBvaW50IGluIHRoZSBzZXF1ZW5jZS4KKyAgICoKKyAgICogIEBpbmdyb3VwIHNlcXVlbmNlcworICAgKgorICAgKiAgQHRwYXJhbSBfVHAgIFR5cGUgb2YgZWxlbWVudC4KKyAgICogIEB0cGFyYW0gX0FsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gYWxsb2NhdG9yPF9UcD4uCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY2Ij5yZXZlcnNpYmxlIGNvbnRhaW5lcjwvYT4sIGFuZCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NyI+c2VxdWVuY2U8L2E+LCBpbmNsdWRpbmcgdGhlCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2OCI+b3B0aW9uYWwgc2VxdWVuY2UgcmVxdWlyZW1lbnRzPC9hPiB3aXRoIHRoZQorICAgKiAgJWV4Y2VwdGlvbiBvZiBAYyBhdCBhbmQgQGMgb3BlcmF0b3JbXS4KKyAgICoKKyAgICogIFRoaXMgaXMgYSBAZSBkb3VibHkgQGUgbGlua2VkICVsaXN0LiAgVHJhdmVyc2FsIHVwIGFuZCBkb3duIHRoZQorICAgKiAgJWxpc3QgcmVxdWlyZXMgbGluZWFyIHRpbWUsIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIGVsZW1lbnRzIChvcgorICAgKiAgQGUgbm9kZXMpIGlzIGRvbmUgaW4gY29uc3RhbnQgdGltZSwgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGUKKyAgICogIGNoYW5nZSB0YWtlcyBwbGFjZS4gIFVubGlrZSBzdGQ6OnZlY3RvciBhbmQgc3RkOjpkZXF1ZSwKKyAgICogIHJhbmRvbS1hY2Nlc3MgaXRlcmF0b3JzIGFyZSBub3QgcHJvdmlkZWQsIHNvIHN1YnNjcmlwdGluZyAoIEBjCisgICAqICBbXSApIGFjY2VzcyBpcyBub3QgYWxsb3dlZC4gIEZvciBhbGdvcml0aG1zIHdoaWNoIG9ubHkgbmVlZAorICAgKiAgc2VxdWVudGlhbCBhY2Nlc3MsIHRoaXMgbGFjayBtYWtlcyBubyBkaWZmZXJlbmNlLgorICAgKgorICAgKiAgQWxzbyB1bmxpa2UgdGhlIG90aGVyIHN0YW5kYXJkIGNvbnRhaW5lcnMsIHN0ZDo6bGlzdCBwcm92aWRlcworICAgKiAgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcyAldW5pcXVlIHRvIGxpbmtlZCBsaXN0cywgc3VjaCBhcworICAgKiAgc3BsaWNpbmcsIHNvcnRpbmcsIGFuZCBpbi1wbGFjZSByZXZlcnNhbC4KKyAgICoKKyAgICogIEEgY291cGxlIHBvaW50cyBvbiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgbGlzdDxUcD46CisgICAqCisgICAqICBGaXJzdCwgd2UgbmV2ZXIgYWN0dWFsbHkgYWxsb2NhdGUgYSBUcCwgd2UgYWxsb2NhdGUKKyAgICogIExpc3Rfbm9kZTxUcD4ncyBhbmQgdHJ1c3QgWzIwLjEuNV0vNCB0byBEVFJULiAgVGhpcyBpcyB0byBlbnN1cmUKKyAgICogIHRoYXQgYWZ0ZXIgZWxlbWVudHMgZnJvbSAlbGlzdDxYLEFsbG9jMT4gYXJlIHNwbGljZWQgaW50bworICAgKiAgJWxpc3Q8WCxBbGxvYzI+LCBkZXN0cm95aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHNlY29uZCAlbGlzdCBpcyBhCisgICAqICB2YWxpZCBvcGVyYXRpb24sIGkuZS4sIEFsbG9jMSBnaXZldGggYW5kIEFsbG9jMiB0YWtldGggYXdheS4KKyAgICoKKyAgICogIFNlY29uZCwgYSAlbGlzdCBjb25jZXB0dWFsbHkgcmVwcmVzZW50ZWQgYXMKKyAgICogIEBjb2RlCisgICAqICAgIEEgPC0tLT4gQiA8LS0tPiBDIDwtLS0+IEQKKyAgICogIEBlbmRjb2RlCisgICAqICBpcyBhY3R1YWxseSBjaXJjdWxhcjsgYSBsaW5rIGV4aXN0cyBiZXR3ZWVuIEEgYW5kIEQuICBUaGUgJWxpc3QKKyAgICogIGNsYXNzIGhvbGRzIChhcyBpdHMgb25seSBkYXRhIG1lbWJlcikgYSBwcml2YXRlIGxpc3Q6Oml0ZXJhdG9yCisgICAqICBwb2ludGluZyB0byBAZSBELCBub3QgdG8gQGUgQSEgIFRvIGdldCB0byB0aGUgaGVhZCBvZiB0aGUgJWxpc3QsCisgICAqICB3ZSBzdGFydCBhdCB0aGUgdGFpbCBhbmQgbW92ZSBmb3J3YXJkIGJ5IG9uZS4gIFdoZW4gdGhpcyBtZW1iZXIKKyAgICogIGl0ZXJhdG9yJ3MgbmV4dC9wcmV2aW91cyBwb2ludGVycyByZWZlciB0byBpdHNlbGYsIHRoZSAlbGlzdCBpcworICAgKiAgJWVtcHR5LiAKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBsaXN0IDogcHJvdGVjdGVkIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+CisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp2YWx1ZV90eXBlICAgICAgICAgICAgICAgIF9BbGxvY192YWx1ZV90eXBlOworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9UcCwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMihfVHAsIF9BbGxvY192YWx1ZV90eXBlLCBfU2FtZVR5cGVDb25jZXB0KQorCisgICAgICB0eXBlZGVmIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+ICAgICAgICAgICAgICAgICAgICBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9UcF9hbGxvY190eXBlCQkgX1RwX2FsbG9jX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpfTm9kZV9hbGxvY190eXBlCQkgX05vZGVfYWxsb2NfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpwb2ludGVyICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHBfYWxsb2NfdHlwZTo6Y29uc3RfcG9pbnRlciAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwX2FsbG9jX3R5cGU6OnJlZmVyZW5jZSAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwX2FsbG9jX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfTGlzdF9jb25zdF9pdGVyYXRvcjxfVHA+ICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gTm90ZSB0aGF0IHBvaW50ZXJzLXRvLV9Ob2RlJ3MgY2FuIGJlIGN0b3ItY29udmVydGVkIHRvCisgICAgICAvLyBpdGVyYXRvciB0eXBlcy4KKyAgICAgIHR5cGVkZWYgX0xpc3Rfbm9kZTxfVHA+CQkJCSBfTm9kZTsKKworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2ltcGw7CisgICAgICB1c2luZyBfQmFzZTo6X01fcHV0X25vZGU7CisgICAgICB1c2luZyBfQmFzZTo6X01fZ2V0X25vZGU7CisgICAgICB1c2luZyBfQmFzZTo6X01fZ2V0X1RwX2FsbG9jYXRvcjsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9nZXRfTm9kZV9hbGxvY2F0b3I7CisKKyAgICAgIC8qKgorICAgICAgICogIEBwYXJhbSAgX19hcmdzICBBbiBpbnN0YW5jZSBvZiB1c2VyIGRhdGEuCisgICAgICAgKgorICAgICAgICogIEFsbG9jYXRlcyBzcGFjZSBmb3IgYSBuZXcgbm9kZSBhbmQgY29uc3RydWN0cyBhIGNvcHkgb2YKKyAgICAgICAqICBAYSBfX2FyZ3MgaW4gaXQuCisgICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgICAgIF9Ob2RlKgorICAgICAgX01fY3JlYXRlX25vZGUoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCV9Ob2RlKiBfX3AgPSB0aGlzLT5fTV9nZXRfbm9kZSgpOworCV9fdHJ5CisJICB7CisJICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKS5jb25zdHJ1Y3QKKwkgICAgICAoc3RkOjpfX2FkZHJlc3NvZihfX3AtPl9NX2RhdGEpLCBfX3gpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9wdXRfbm9kZShfX3ApOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKwlyZXR1cm4gX19wOworICAgICAgfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBfTm9kZSoKKyAgICAgICAgX01fY3JlYXRlX25vZGUoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX05vZGUqIF9fcCA9IHRoaXMtPl9NX2dldF9ub2RlKCk7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkuY29uc3RydWN0KF9fcCwKKwkJCQkJCXN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX01fcHV0X25vZGUoX19wKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgcmV0dXJuIF9fcDsKKwl9CisjZW5kaWYKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIFsyMy4yLjIuMV0gY29uc3RydWN0L2NvcHkvZGVzdHJveQorICAgICAgLy8gKGFzc2lnbigpIGFuZCBnZXRfYWxsb2NhdG9yKCkgYXJlIGFsc28gbGlzdGVkIGluIHRoaXMgc2VjdGlvbikKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICovCisgICAgICBsaXN0KCkKKyAgICAgIDogX0Jhc2UoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJWxpc3Qgd2l0aCBubyBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGxpc3QoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX0Jhc2UoX05vZGVfYWxsb2NfdHlwZShfX2EpKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVsaXN0IHdpdGggZGVmYXVsdCBjb25zdHJ1Y3RlZCBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBpbml0aWFsbHkgY3JlYXRlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSAlbGlzdCB3aXRoIEBhIF9fbiBkZWZhdWx0CisgICAgICAgKiAgY29uc3RydWN0ZWQgZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBsaXN0KHNpemVfdHlwZSBfX24pCisgICAgICA6IF9CYXNlKCkKKyAgICAgIHsgX01fZGVmYXVsdF9pbml0aWFsaXplKF9fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJWxpc3Qgd2l0aCBjb3BpZXMgb2YgYW4gZXhlbXBsYXIgZWxlbWVudC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBpbml0aWFsbHkgY3JlYXRlLgorICAgICAgICogIEBwYXJhbSAgX192YWx1ZSAgQW4gZWxlbWVudCB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSAlbGlzdCB3aXRoIEBhIF9fbiBjb3BpZXMgb2YgQGEgX192YWx1ZS4KKyAgICAgICAqLworICAgICAgbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbHVlLAorCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfTm9kZV9hbGxvY190eXBlKF9fYSkpCisgICAgICB7IF9NX2ZpbGxfaW5pdGlhbGl6ZShfX24sIF9fdmFsdWUpOyB9CisjZWxzZQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJWxpc3Qgd2l0aCBjb3BpZXMgb2YgYW4gZXhlbXBsYXIgZWxlbWVudC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBpbml0aWFsbHkgY3JlYXRlLgorICAgICAgICogIEBwYXJhbSAgX192YWx1ZSAgQW4gZWxlbWVudCB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSAlbGlzdCB3aXRoIEBhIF9fbiBjb3BpZXMgb2YgQGEgX192YWx1ZS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWx1ZSA9IHZhbHVlX3R5cGUoKSwKKwkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX05vZGVfYWxsb2NfdHlwZShfX2EpKQorICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoX19uLCBfX3ZhbHVlKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJUxpc3QgY29weSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbGlzdCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlbGlzdCB1c2VzIGEgY29weSBvZiB0aGUgYWxsb2NhdGlvbiBvYmplY3QgdXNlZAorICAgICAgICogIGJ5IEBhIF9feC4KKyAgICAgICAqLworICAgICAgbGlzdChjb25zdCBsaXN0JiBfX3gpCisgICAgICA6IF9CYXNlKF9feC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX3guYmVnaW4oKSwgX194LmVuZCgpLCBfX2ZhbHNlX3R5cGUoKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJUxpc3QgbW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbGlzdCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlbGlzdCBjb250YWlucyB0aGUgZXhhY3QgY29udGVudHMgb2YgQGEgX194LgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSBfX3ggYXJlIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCAlbGlzdC4KKyAgICAgICAqLworICAgICAgbGlzdChsaXN0JiYgX194KSBub2V4Y2VwdAorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJWxpc3QgZnJvbSBhbiBpbml0aWFsaXplcl9saXN0CisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3Qgb2YgdmFsdWVfdHlwZS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGEgJWxpc3QgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyX2xpc3QgQGEgX19sLiAgVGhpcyBpcyBsaW5lYXIgaW4gX19sLnNpemUoKS4KKyAgICAgICAqLworICAgICAgbGlzdChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKyAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9Ob2RlX2FsbG9jX3R5cGUoX19hKSkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfX2ZhbHNlX3R5cGUoKSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVsaXN0IGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGEgJWxpc3QgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAgICAqICBbQGEgX19maXJzdCxAYSBfX2xhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiAod2hlcmUgTiBpcworICAgICAgICogIGRpc3RhbmNlKEBhIF9fZmlyc3QsQGEgX19sYXN0KSkuCisgICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgICAgbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9Ob2RlX2FsbG9jX3R5cGUoX19hKSkKKyAgICAgICAgeyBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX19mYWxzZV90eXBlKCkpOyB9CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGxpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfTm9kZV9hbGxvY190eXBlKF9fYSkpCisgICAgICAgIHsgCisJICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKwl9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgTm8gZXhwbGljaXQgZHRvciBuZWVkZWQgYXMgdGhlIF9CYXNlIGR0b3IgdGFrZXMgY2FyZSBvZgorICAgICAgICogIHRoaW5ncy4gIFRoZSBfQmFzZSBkdG9yIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIG5vdGUKKyAgICAgICAqICB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8KKyAgICAgICAqICBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzCisgICAgICAgKiAgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVMaXN0IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJWxpc3Qgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgQWxsIHRoZSBlbGVtZW50cyBvZiBAYSBfX3ggYXJlIGNvcGllZCwgYnV0IHVubGlrZSB0aGUgY29weQorICAgICAgICogIGNvbnN0cnVjdG9yLCB0aGUgYWxsb2NhdG9yIG9iamVjdCBpcyBub3QgY29waWVkLgorICAgICAgICovCisgICAgICBsaXN0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGxpc3QmIF9feCk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVMaXN0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbGlzdCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgX194IGFyZSBtb3ZlZCBpbnRvIHRoaXMgJWxpc3QgKHdpdGhvdXQgY29weWluZykuCisgICAgICAgKiAgQGEgX194IGlzIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCAlbGlzdAorICAgICAgICovCisgICAgICBsaXN0JgorICAgICAgb3BlcmF0b3I9KGxpc3QmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJUxpc3QgaW5pdGlhbGl6ZXIgbGlzdCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0IG9mIHZhbHVlX3R5cGUuCisgICAgICAgKgorICAgICAgICogIFJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoZSAlbGlzdCB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMKKyAgICAgICAqICBpbiB0aGUgaW5pdGlhbGl6ZXJfbGlzdCBAYSBfX2wuICBUaGlzIGlzIGxpbmVhciBpbiBsLnNpemUoKS4KKyAgICAgICAqLworICAgICAgbGlzdCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5hc3NpZ24oX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhIGdpdmVuIHZhbHVlIHRvIGEgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBlbGVtZW50cyB0byBiZSBhc3NpZ25lZC4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsICBWYWx1ZSB0byBiZSBhc3NpZ25lZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICVsaXN0IHdpdGggQGEgX19uIGNvcGllcyBvZiB0aGUgZ2l2ZW4KKyAgICAgICAqICB2YWx1ZS4gIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICVsaXN0CisgICAgICAgKiAgYW5kIHRoYXQgdGhlIHJlc3VsdGluZyAlbGlzdCdzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlcgorICAgICAgICogIG9mIGVsZW1lbnRzIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKKyAgICAgIHsgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ25zIGEgcmFuZ2UgdG8gYSAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlbGlzdCB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgcmFuZ2UgW0BhIF9fZmlyc3QsQGEgX19sYXN0KS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJWxpc3QgYW5kCisgICAgICAgKiAgdGhhdCB0aGUgcmVzdWx0aW5nICVsaXN0J3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mCisgICAgICAgKiAgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX19mYWxzZV90eXBlKCkpOyB9CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwkgIF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKwl9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhbiBpbml0aWFsaXplcl9saXN0IHRvIGEgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3Qgb2YgdmFsdWVfdHlwZS4KKyAgICAgICAqCisgICAgICAgKiAgUmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhlICVsaXN0IHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cworICAgICAgICogIGluIHRoZSBpbml0aWFsaXplcl9saXN0IEBhIF9fbC4gIFRoaXMgaXMgbGluZWFyIGluIF9fbC5zaXplKCkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8vIEdldCBhIGNvcHkgb2YgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG9iamVjdC4KKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9CYXNlOjpnZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgLy8gaXRlcmF0b3JzCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUKKyAgICAgICAqICAlbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5IGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX25vZGUuX01fbmV4dCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX25leHQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJWxpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeSBlbGVtZW50CisgICAgICAgKiAgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoJnRoaXMtPl9NX2ltcGwuX01fbm9kZSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0CisgICAgICAgKiAgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJWxpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJnRoaXMtPl9NX2ltcGwuX01fbm9kZSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gcmV2ZXJzZSBlbGVtZW50CisgICAgICAgKiAgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0bworICAgICAgICogIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gcmV2ZXJzZQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIG9uZQorICAgICAgICogIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgJWxpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIG9uZQorICAgICAgICogIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgJWxpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiByZXZlcnNlCisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlCisgICAgICAgKiAgZmlyc3QgZWxlbWVudCBpbiB0aGUgJWxpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX25leHQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdAorICAgICAgICogIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcigmdGhpcy0+X01faW1wbC5fTV9ub2RlKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0bworICAgICAgICogIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gcmV2ZXJzZQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gb25lCisgICAgICAgKiAgYmVmb3JlIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSAlbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIHJldmVyc2UKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gWzIzLjIuMi4yXSBjYXBhY2l0eQorICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSAlbGlzdCBpcyBlbXB0eS4gIChUaHVzIGJlZ2luKCkgd291bGQgZXF1YWwKKyAgICAgICAqICBlbmQoKS4pCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fbm9kZS5fTV9uZXh0ID09ICZ0aGlzLT5fTV9pbXBsLl9NX25vZGU7IH0KKworICAgICAgLyoqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlICVsaXN0LiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6OmRpc3RhbmNlKGJlZ2luKCksIGVuZCgpKTsgfQorCisgICAgICAvKiogIFJldHVybnMgdGhlIHNpemUoKSBvZiB0aGUgbGFyZ2VzdCBwb3NzaWJsZSAlbGlzdC4gICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLm1heF9zaXplKCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBSZXNpemVzIHRoZSAlbGlzdCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gX19uZXdfc2l6ZSBOdW1iZXIgb2YgZWxlbWVudHMgdGhlICVsaXN0IHNob3VsZCBjb250YWluLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgJXJlc2l6ZSB0aGUgJWxpc3QgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cy4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZSAlbGlzdCdzCisgICAgICAgKiAgY3VycmVudCBzaXplIHRoZSAlbGlzdCBpcyB0cnVuY2F0ZWQsIG90aGVyd2lzZSBkZWZhdWx0CisgICAgICAgKiAgY29uc3RydWN0ZWQgZWxlbWVudHMgYXJlIGFwcGVuZGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgUmVzaXplcyB0aGUgJWxpc3QgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtIF9fbmV3X3NpemUgTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAlbGlzdCBzaG91bGQgY29udGFpbi4KKyAgICAgICAqICBAcGFyYW0gX194IERhdGEgd2l0aCB3aGljaCBuZXcgZWxlbWVudHMgc2hvdWxkIGJlIHBvcHVsYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICVsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUgJWxpc3QncworICAgICAgICogIGN1cnJlbnQgc2l6ZSB0aGUgJWxpc3QgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UgdGhlICVsaXN0IGlzCisgICAgICAgKiAgZXh0ZW5kZWQgYW5kIG5ldyBlbGVtZW50cyBhcmUgcG9wdWxhdGVkIHdpdGggZ2l2ZW4gZGF0YS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBSZXNpemVzIHRoZSAlbGlzdCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gX19uZXdfc2l6ZSBOdW1iZXIgb2YgZWxlbWVudHMgdGhlICVsaXN0IHNob3VsZCBjb250YWluLgorICAgICAgICogIEBwYXJhbSBfX3ggRGF0YSB3aXRoIHdoaWNoIG5ldyBlbGVtZW50cyBzaG91bGQgYmUgcG9wdWxhdGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgJXJlc2l6ZSB0aGUgJWxpc3QgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cy4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZSAlbGlzdCdzCisgICAgICAgKiAgY3VycmVudCBzaXplIHRoZSAlbGlzdCBpcyB0cnVuY2F0ZWQsIG90aGVyd2lzZSB0aGUgJWxpc3QgaXMKKyAgICAgICAqICBleHRlbmRlZCBhbmQgbmV3IGVsZW1lbnRzIGFyZSBwb3B1bGF0ZWQgd2l0aCBnaXZlbiBkYXRhLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIHZhbHVlX3R5cGUgX194ID0gdmFsdWVfdHlwZSgpKTsKKyNlbmRpZgorCisgICAgICAvLyBlbGVtZW50IGFjY2VzcworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVsaXN0LgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGZyb250KCkKKyAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJWxpc3QuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBsYXN0IGVsZW1lbnQKKyAgICAgICAqICBvZiB0aGUgJWxpc3QuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgYmFjaygpCisgICAgICB7IAorCWl0ZXJhdG9yIF9fdG1wID0gZW5kKCk7CisJLS1fX3RtcDsKKwlyZXR1cm4gKl9fdG1wOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJWxpc3QuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7IAorCWNvbnN0X2l0ZXJhdG9yIF9fdG1wID0gZW5kKCk7CisJLS1fX3RtcDsKKwlyZXR1cm4gKl9fdG1wOworICAgICAgfQorCisgICAgICAvLyBbMjMuMi4yLjNdIG1vZGlmaWVycworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBZGQgZGF0YSB0byB0aGUgZnJvbnQgb2YgdGhlICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX194ICBEYXRhIHRvIGJlIGFkZGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCBzdGFjayBvcGVyYXRpb24uICBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhbgorICAgICAgICogIGVsZW1lbnQgYXQgdGhlIGZyb250IG9mIHRoZSAlbGlzdCBhbmQgYXNzaWducyB0aGUgZ2l2ZW4gZGF0YQorICAgICAgICogIHRvIGl0LiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4gYmUKKyAgICAgICAqICBkb25lIGluIGNvbnN0YW50IHRpbWUsIGFuZCBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBhbmQKKyAgICAgICAqICByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgdGhpcy0+X01faW5zZXJ0KGJlZ2luKCksIF9feCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgdGhpcy0+X01faW5zZXJ0KGJlZ2luKCksIHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlX2Zyb250KF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7IHRoaXMtPl9NX2luc2VydChiZWdpbigpLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmVzIGZpcnN0IGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsIHN0YWNrIG9wZXJhdGlvbi4gIEl0IHNocmlua3MgdGhlICVsaXN0IGJ5CisgICAgICAgKiAgb25lLiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4gYmUgZG9uZQorICAgICAgICogIGluIGNvbnN0YW50IHRpbWUsIGFuZCBvbmx5IGludmFsaWRhdGVzIGl0ZXJhdG9ycy9yZWZlcmVuY2VzIHRvCisgICAgICAgKiAgdGhlIGVsZW1lbnQgYmVpbmcgcmVtb3ZlZC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IG5vIGRhdGEgaXMgcmV0dXJuZWQsIGFuZCBpZiB0aGUgZmlyc3QgZWxlbWVudCdzIGRhdGEKKyAgICAgICAqICBpcyBuZWVkZWQsIGl0IHNob3VsZCBiZSByZXRyaWV2ZWQgYmVmb3JlIHBvcF9mcm9udCgpIGlzCisgICAgICAgKiAgY2FsbGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwb3BfZnJvbnQoKQorICAgICAgeyB0aGlzLT5fTV9lcmFzZShiZWdpbigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFkZCBkYXRhIHRvIHRoZSBlbmQgb2YgdGhlICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX194ICBEYXRhIHRvIGJlIGFkZGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCBzdGFjayBvcGVyYXRpb24uICBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhbgorICAgICAgICogIGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgJWxpc3QgYW5kIGFzc2lnbnMgdGhlIGdpdmVuIGRhdGEgdG8KKyAgICAgICAqICBpdC4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWxpc3QgdGhpcyBvcGVyYXRpb24gY2FuIGJlIGRvbmUKKyAgICAgICAqICBpbiBjb25zdGFudCB0aW1lLCBhbmQgZG9lcyBub3QgaW52YWxpZGF0ZSBpdGVyYXRvcnMgYW5kCisgICAgICAgKiAgcmVmZXJlbmNlcy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgdGhpcy0+X01faW5zZXJ0KGVuZCgpLCBfX3gpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2sodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgdGhpcy0+X01faW5zZXJ0KGVuZCgpLCBzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgZW1wbGFjZV9iYWNrKF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7IHRoaXMtPl9NX2luc2VydChlbmQoKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlcyBsYXN0IGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsIHN0YWNrIG9wZXJhdGlvbi4gIEl0IHNocmlua3MgdGhlICVsaXN0IGJ5CisgICAgICAgKiAgb25lLiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4gYmUgZG9uZQorICAgICAgICogIGluIGNvbnN0YW50IHRpbWUsIGFuZCBvbmx5IGludmFsaWRhdGVzIGl0ZXJhdG9ycy9yZWZlcmVuY2VzIHRvCisgICAgICAgKiAgdGhlIGVsZW1lbnQgYmVpbmcgcmVtb3ZlZC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IG5vIGRhdGEgaXMgcmV0dXJuZWQsIGFuZCBpZiB0aGUgbGFzdCBlbGVtZW50J3MgZGF0YQorICAgICAgICogIGlzIG5lZWRlZCwgaXQgc2hvdWxkIGJlIHJldHJpZXZlZCBiZWZvcmUgcG9wX2JhY2soKSBpcyBjYWxsZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBvcF9iYWNrKCkKKyAgICAgIHsgdGhpcy0+X01fZXJhc2UoaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX3ByZXYpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RzIG9iamVjdCBpbiAlbGlzdCBiZWZvcmUgc3BlY2lmaWVkIGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQSBjb25zdF9pdGVyYXRvciBpbnRvIHRoZSAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fYXJncyAgQXJndW1lbnRzLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBkYXRhLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGFuIG9iamVjdCBvZiB0eXBlIFQgY29uc3RydWN0ZWQKKyAgICAgICAqICB3aXRoIFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSBiZWZvcmUgdGhlIHNwZWNpZmllZAorICAgICAgICogIGxvY2F0aW9uLiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4KKyAgICAgICAqICBiZSBkb25lIGluIGNvbnN0YW50IHRpbWUsIGFuZCBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycworICAgICAgICogIGFuZCByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGdpdmVuIHZhbHVlIGludG8gJWxpc3QgYmVmb3JlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX194ICBEYXRhIHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBkYXRhLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGEgY29weSBvZiB0aGUgZ2l2ZW4gdmFsdWUgYmVmb3JlCisgICAgICAgKiAgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWxpc3QgdGhpcworICAgICAgICogIG9wZXJhdGlvbiBjYW4gYmUgZG9uZSBpbiBjb25zdGFudCB0aW1lLCBhbmQgZG9lcyBub3QKKyAgICAgICAqICBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGdpdmVuIHJ2YWx1ZSBpbnRvICVsaXN0IGJlZm9yZSBzcGVjaWZpZWQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIGNvcHkgb2YgdGhlIGdpdmVuIHJ2YWx1ZSBiZWZvcmUKKyAgICAgICAqICB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlbGlzdCB0aGlzCisgICAgICAgKiAgb3BlcmF0aW9uIGNhbiBiZSBkb25lIGluIGNvbnN0YW50IHRpbWUsIGFuZCBkb2VzIG5vdAorICAgICAgICogIGludmFsaWRhdGUgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzLgorICAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyByZXR1cm4gZW1wbGFjZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIHRoZSBjb250ZW50cyBvZiBhbiBpbml0aWFsaXplcl9saXN0IGludG8gJWxpc3QKKyAgICAgICAqICAgICAgICAgIGJlZm9yZSBzcGVjaWZpZWQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3AgIEFuIGl0ZXJhdG9yIGludG8gdGhlICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0IG9mIHZhbHVlX3R5cGUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgY29waWVzIG9mIHRoZSBkYXRhIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyX2xpc3QgQGEgbCBpbnRvIHRoZSAlbGlzdCBiZWZvcmUgdGhlIGxvY2F0aW9uCisgICAgICAgKiAgc3BlY2lmaWVkIGJ5IEBhIHAuCisgICAgICAgKgorICAgICAgICogIFRoaXMgb3BlcmF0aW9uIGlzIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluc2VydGVkIGFuZAorICAgICAgICogIGRvZXMgbm90IGludmFsaWRhdGUgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wLCBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgdGhpcy0+aW5zZXJ0KF9fcCwgX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgYSBudW1iZXIgb2YgY29waWVzIG9mIGdpdmVuIGRhdGEgaW50byB0aGUgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX194ICBEYXRhIHRvIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGEgc3BlY2lmaWVkIG51bWJlciBvZiBjb3BpZXMgb2YgdGhlCisgICAgICAgKiAgZ2l2ZW4gZGF0YSBiZWZvcmUgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBAYSBwb3NpdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRpb24gaXMgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW5zZXJ0ZWQgYW5kCisgICAgICAgKiAgZG9lcyBub3QgaW52YWxpZGF0ZSBpdGVyYXRvcnMgYW5kIHJlZmVyZW5jZXMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJbGlzdCBfX3RtcChfX24sIF9feCwgZ2V0X2FsbG9jYXRvcigpKTsKKwlzcGxpY2UoX19wb3NpdGlvbiwgX190bXApOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgYSByYW5nZSBpbnRvIHRoZSAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBjb3BpZXMgb2YgdGhlIGRhdGEgaW4gdGhlIHJhbmdlIFtAYQorICAgICAgICogIGZpcnN0LEBhIGxhc3QpIGludG8gdGhlICVsaXN0IGJlZm9yZSB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5CisgICAgICAgKiAgQGEgcG9zaXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgb3BlcmF0aW9uIGlzIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluc2VydGVkIGFuZAorICAgICAgICogIGRvZXMgbm90IGludmFsaWRhdGUgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzLgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkgICAgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBsaXN0IF9fdG1wKF9fZmlyc3QsIF9fbGFzdCwgZ2V0X2FsbG9jYXRvcigpKTsKKwkgIHNwbGljZShfX3Bvc2l0aW9uLCBfX3RtcCk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBlbGVtZW50IGF0IGdpdmVuIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIG5leHQgZWxlbWVudCAob3IgZW5kKCkpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgZXJhc2UgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCB0aHVzCisgICAgICAgKiAgc2hvcnRlbiB0aGUgJWxpc3QgYnkgb25lLgorICAgICAgICoKKyAgICAgICAqICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBhICVsaXN0IHRoaXMgb3BlcmF0aW9uIGNhbiBiZSBkb25lIGluCisgICAgICAgKiAgY29uc3RhbnQgdGltZSwgYW5kIG9ubHkgaW52YWxpZGF0ZXMgaXRlcmF0b3JzL3JlZmVyZW5jZXMgdG8KKyAgICAgICAqICB0aGUgZWxlbWVudCBiZWluZyByZW1vdmVkLiAgVGhlIHVzZXIgaXMgYWxzbyBjYXV0aW9uZWQgdGhhdAorICAgICAgICogIHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50CisgICAgICAgKiAgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluCisgICAgICAgKiAgYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgYSByYW5nZSBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudCB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHBvaW50ZWQgdG8gYnkgQGEgbGFzdAorICAgICAgICogICAgICAgICAgIHByaW9yIHRvIGVyYXNpbmcgKG9yIGVuZCgpKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGVyYXNlIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQGEKKyAgICAgICAqICBbZmlyc3QsbGFzdCkgYW5kIHNob3J0ZW4gdGhlICVsaXN0IGFjY29yZGluZ2x5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdGlvbiBpcyBsaW5lYXIgdGltZSBpbiB0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UgYW5kIG9ubHkKKyAgICAgICAqICBpbnZhbGlkYXRlcyBpdGVyYXRvcnMvcmVmZXJlbmNlcyB0byB0aGUgZWxlbWVudCBiZWluZyByZW1vdmVkLgorICAgICAgICogIFRoZSB1c2VyIGlzIGFsc28gY2F1dGlvbmVkIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUKKyAgICAgICAqICBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUKKyAgICAgICAqICBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIKKyAgICAgICAqICBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCXdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgIF9fZmlyc3QgPSBlcmFzZShfX2ZpcnN0KTsKKwlyZXR1cm4gX19sYXN0OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXBzIGRhdGEgd2l0aCBhbm90aGVyICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVsaXN0IG9mIHRoZSBzYW1lIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBleGNoYW5nZXMgdGhlIGVsZW1lbnRzIGJldHdlZW4gdHdvIGxpc3RzIGluIGNvbnN0YW50CisgICAgICAgKiAgdGltZS4gIE5vdGUgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzCisgICAgICAgKiAgc3BlY2lhbGl6ZWQgc3VjaCB0aGF0IHN0ZDo6c3dhcChsMSxsMikgd2lsbCBmZWVkIHRvIHRoaXMKKyAgICAgICAqICBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3dhcChsaXN0JiBfX3gpCisgICAgICB7CisJX19kZXRhaWw6Ol9MaXN0X25vZGVfYmFzZTo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX25vZGUsIAorCQkJCQlfX3guX01faW1wbC5fTV9ub2RlKTsKKworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyA0MzEuIFN3YXBwaW5nIGNvbnRhaW5lcnMgd2l0aCB1bmVxdWFsIGFsbG9jYXRvcnMuCisJc3RkOjpfX2FsbG9jX3N3YXA8dHlwZW5hbWUgX0Jhc2U6Ol9Ob2RlX2FsbG9jX3R5cGU+OjoKKwkgIF9TX2RvX2l0KF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLCBfX3guX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBFcmFzZXMgYWxsIHRoZSBlbGVtZW50cy4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzCisgICAgICAgKiAgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUKKyAgICAgICAqICBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuCisgICAgICAgKiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworICAgICAgICBfQmFzZTo6X01fY2xlYXIoKTsKKyAgICAgICAgX0Jhc2U6Ol9NX2luaXQoKTsKKyAgICAgIH0KKworICAgICAgLy8gWzIzLjIuMi40XSBsaXN0IG9wZXJhdGlvbnMKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGNvbnRlbnRzIG9mIGFub3RoZXIgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZWxlbWVudCB0byBpbnNlcnQgYmVmb3JlLgorICAgICAgICogIEBwYXJhbSAgX194ICBTb3VyY2UgbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGVsZW1lbnRzIG9mIEBhIF9feCBhcmUgaW5zZXJ0ZWQgaW4gY29uc3RhbnQgdGltZSBpbiBmcm9udCBvZgorICAgICAgICogIHRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgQGEgX19wb3NpdGlvbi4gIEBhIF9feCBiZWNvbWVzIGFuIGVtcHR5CisgICAgICAgKiAgbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgUmVxdWlyZXMgdGhpcyAhPSBAYSBfX3guCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYmIF9feCkKKyNlbHNlCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194KQorI2VuZGlmCisgICAgICB7CisJaWYgKCFfX3guZW1wdHkoKSkKKwkgIHsKKwkgICAgX01fY2hlY2tfZXF1YWxfYWxsb2NhdG9ycyhfX3gpOworCisJICAgIHRoaXMtPl9NX3RyYW5zZmVyKF9fcG9zaXRpb24sIF9feC5iZWdpbigpLCBfX3guZW5kKCkpOworCSAgfQorICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCkKKyAgICAgIHsgc3BsaWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGVsZW1lbnQgZnJvbSBhbm90aGVyICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnQgdG8gaW5zZXJ0IGJlZm9yZS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgU291cmNlIGxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2kgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBlbGVtZW50IHRvIG1vdmUuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGVsZW1lbnQgaW4gbGlzdCBAYSBfX3ggcmVmZXJlbmNlZCBieSBAYSBfX2kgYW5kCisgICAgICAgKiAgaW5zZXJ0cyBpdCBpbnRvIHRoZSBjdXJyZW50IGxpc3QgYmVmb3JlIEBhIF9fcG9zaXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYmIF9feCwgaXRlcmF0b3IgX19pKQorI2Vsc2UKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gsIGl0ZXJhdG9yIF9faSkKKyNlbmRpZgorICAgICAgeworCWl0ZXJhdG9yIF9faiA9IF9faTsKKwkrK19fajsKKwlpZiAoX19wb3NpdGlvbiA9PSBfX2kgfHwgX19wb3NpdGlvbiA9PSBfX2opCisJICByZXR1cm47CisKKwlpZiAodGhpcyAhPSAmX194KQorCSAgX01fY2hlY2tfZXF1YWxfYWxsb2NhdG9ycyhfX3gpOworCisJdGhpcy0+X01fdHJhbnNmZXIoX19wb3NpdGlvbiwgX19pLCBfX2opOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19pKQorICAgICAgeyBzcGxpY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCksIF9faSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCByYW5nZSBmcm9tIGFub3RoZXIgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZWxlbWVudCB0byBpbnNlcnQgYmVmb3JlLgorICAgICAgICogIEBwYXJhbSAgX194ICBTb3VyY2UgbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBzdGFydCBvZiByYW5nZSBpbiB4LgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZW5kIG9mIHJhbmdlIGluIHguCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgZWxlbWVudHMgaW4gdGhlIHJhbmdlIFtfX2ZpcnN0LF9fbGFzdCkgYW5kIGluc2VydHMgdGhlbQorICAgICAgICogIGJlZm9yZSBAYSBfX3Bvc2l0aW9uIGluIGNvbnN0YW50IHRpbWUuCisgICAgICAgKgorICAgICAgICogIFVuZGVmaW5lZCBpZiBAYSBfX3Bvc2l0aW9uIGlzIGluIFtfX2ZpcnN0LF9fbGFzdCkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYmIF9feCwgaXRlcmF0b3IgX19maXJzdCwKKwkgICAgIGl0ZXJhdG9yIF9fbGFzdCkKKyNlbHNlCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194LCBpdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgaXRlcmF0b3IgX19sYXN0KQorI2VuZGlmCisgICAgICB7CisJaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorCSAgeworCSAgICBpZiAodGhpcyAhPSAmX194KQorCSAgICAgIF9NX2NoZWNrX2VxdWFsX2FsbG9jYXRvcnMoX194KTsKKworCSAgICB0aGlzLT5fTV90cmFuc2ZlcihfX3Bvc2l0aW9uLCBfX2ZpcnN0LCBfX2xhc3QpOworCSAgfQorICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBzcGxpY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCksIF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhbGwgZWxlbWVudHMgZXF1YWwgdG8gdmFsdWUuCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbHVlICBUaGUgdmFsdWUgdG8gcmVtb3ZlLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIGxpc3QgZXF1YWwgdG8gQGEgdmFsdWUuCisgICAgICAgKiAgUmVtYWluaW5nIGVsZW1lbnRzIHN0YXkgaW4gbGlzdCBvcmRlci4gIE5vdGUgdGhhdCB0aGlzCisgICAgICAgKiAgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMKKyAgICAgICAqICB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdAorICAgICAgICogIHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVtb3ZlKGNvbnN0IF9UcCYgX192YWx1ZSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGFsbCBlbGVtZW50cyBzYXRpc2Z5aW5nIGEgcHJlZGljYXRlLgorICAgICAgICogIEB0cGFyYW0gIF9QcmVkaWNhdGUgIFVuYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbiBvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgZXZlcnkgZWxlbWVudCBpbiB0aGUgbGlzdCBmb3Igd2hpY2ggdGhlIHByZWRpY2F0ZQorICAgICAgICogIHJldHVybnMgdHJ1ZS4gIFJlbWFpbmluZyBlbGVtZW50cyBzdGF5IGluIGxpc3Qgb3JkZXIuICBOb3RlCisgICAgICAgKiAgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlCisgICAgICAgKiAgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcworICAgICAgICogIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICAgIHZvaWQKKyAgICAgICAgcmVtb3ZlX2lmKF9QcmVkaWNhdGUpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBjb25zZWN1dGl2ZSBkdXBsaWNhdGUgZWxlbWVudHMuCisgICAgICAgKgorICAgICAgICogIEZvciBlYWNoIGNvbnNlY3V0aXZlIHNldCBvZiBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIHZhbHVlLAorICAgICAgICogIHJlbW92ZSBhbGwgYnV0IHRoZSBmaXJzdCBvbmUuICBSZW1haW5pbmcgZWxlbWVudHMgc3RheSBpbgorICAgICAgICogIGxpc3Qgb3JkZXIuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUKKyAgICAgICAqICBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLAorICAgICAgICogIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcKKyAgICAgICAqICB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICB1bmlxdWUoKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgY29uc2VjdXRpdmUgZWxlbWVudHMgc2F0aXNmeWluZyBhIHByZWRpY2F0ZS4KKyAgICAgICAqICBAdHBhcmFtIF9CaW5hcnlQcmVkaWNhdGUgIEJpbmFyeSBwcmVkaWNhdGUgZnVuY3Rpb24gb3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBGb3IgZWFjaCBjb25zZWN1dGl2ZSBzZXQgb2YgZWxlbWVudHMgW2ZpcnN0LGxhc3QpIHRoYXQKKyAgICAgICAqICBzYXRpc2Z5IHByZWRpY2F0ZShmaXJzdCxpKSB3aGVyZSBpIGlzIGFuIGl0ZXJhdG9yIGluCisgICAgICAgKiAgW2ZpcnN0LGxhc3QpLCByZW1vdmUgYWxsIGJ1dCB0aGUgZmlyc3Qgb25lLiAgUmVtYWluaW5nCisgICAgICAgKiAgZWxlbWVudHMgc3RheSBpbiBsaXN0IG9yZGVyLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seQorICAgICAgICogIGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZQorICAgICAgICogIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4KKyAgICAgICAqICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgICAgICB2b2lkCisgICAgICAgIHVuaXF1ZShfQmluYXJ5UHJlZGljYXRlKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNZXJnZSBzb3J0ZWQgbGlzdHMuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIFNvcnRlZCBsaXN0IHRvIG1lcmdlLgorICAgICAgICoKKyAgICAgICAqICBBc3N1bWVzIHRoYXQgYm90aCBAYSBfX3ggYW5kIHRoaXMgbGlzdCBhcmUgc29ydGVkIGFjY29yZGluZyB0bworICAgICAgICogIG9wZXJhdG9yPCgpLiAgTWVyZ2VzIGVsZW1lbnRzIG9mIEBhIF9feCBpbnRvIHRoaXMgbGlzdCBpbgorICAgICAgICogIHNvcnRlZCBvcmRlciwgbGVhdmluZyBAYSBfX3ggZW1wdHkgd2hlbiBjb21wbGV0ZS4gIEVsZW1lbnRzIGluCisgICAgICAgKiAgdGhpcyBsaXN0IHByZWNlZGUgZWxlbWVudHMgaW4gQGEgX194IHRoYXQgYXJlIGVxdWFsLgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgbWVyZ2UobGlzdCYmIF9feCk7CisKKyAgICAgIHZvaWQKKyAgICAgIG1lcmdlKGxpc3QmIF9feCkKKyAgICAgIHsgbWVyZ2Uoc3RkOjptb3ZlKF9feCkpOyB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgbWVyZ2UobGlzdCYgX194KTsKKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1lcmdlIHNvcnRlZCBsaXN0cyBhY2NvcmRpbmcgdG8gY29tcGFyaXNvbiBmdW5jdGlvbi4KKyAgICAgICAqICBAdHBhcmFtIF9TdHJpY3RXZWFrT3JkZXJpbmcgQ29tcGFyaXNvbiBmdW5jdGlvbiBkZWZpbmluZworICAgICAgICogIHNvcnQgb3JkZXIuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIFNvcnRlZCBsaXN0IHRvIG1lcmdlLgorICAgICAgICogIEBwYXJhbSAgX19jb21wICBDb21wYXJpc29uIGZ1bmN0b3IuCisgICAgICAgKgorICAgICAgICogIEFzc3VtZXMgdGhhdCBib3RoIEBhIF9feCBhbmQgdGhpcyBsaXN0IGFyZSBzb3J0ZWQgYWNjb3JkaW5nIHRvCisgICAgICAgKiAgU3RyaWN0V2Vha09yZGVyaW5nLiAgTWVyZ2VzIGVsZW1lbnRzIG9mIEBhIF9feCBpbnRvIHRoaXMgbGlzdAorICAgICAgICogIGluIHNvcnRlZCBvcmRlciwgbGVhdmluZyBAYSBfX3ggZW1wdHkgd2hlbiBjb21wbGV0ZS4gIEVsZW1lbnRzCisgICAgICAgKiAgaW4gdGhpcyBsaXN0IHByZWNlZGUgZWxlbWVudHMgaW4gQGEgX194IHRoYXQgYXJlIGVxdWl2YWxlbnQKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gU3RyaWN0V2Vha09yZGVyaW5nKCkuCisgICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgICB2b2lkCisgICAgICAgIG1lcmdlKGxpc3QmJiBfX3gsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICAgICAgdm9pZAorICAgICAgICBtZXJnZShsaXN0JiBfX3gsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorICAgICAgICB7IG1lcmdlKHN0ZDo6bW92ZShfX3gpLCBfX2NvbXApOyB9CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICAgICAgdm9pZAorICAgICAgICBtZXJnZShsaXN0JiBfX3gsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKTsKKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldmVyc2UgdGhlIGVsZW1lbnRzIGluIGxpc3QuCisgICAgICAgKgorICAgICAgICogIFJldmVyc2UgdGhlIG9yZGVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IGluIGxpbmVhciB0aW1lLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXZlcnNlKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgdGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX3JldmVyc2UoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNvcnQgdGhlIGVsZW1lbnRzLgorICAgICAgICoKKyAgICAgICAqICBTb3J0cyB0aGUgZWxlbWVudHMgb2YgdGhpcyBsaXN0IGluIE5sb2dOIHRpbWUuICBFcXVpdmFsZW50CisgICAgICAgKiAgZWxlbWVudHMgcmVtYWluIGluIGxpc3Qgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNvcnQoKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTb3J0IHRoZSBlbGVtZW50cyBhY2NvcmRpbmcgdG8gY29tcGFyaXNvbiBmdW5jdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgU29ydHMgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCBpbiBObG9nTiB0aW1lLiAgRXF1aXZhbGVudAorICAgICAgICogIGVsZW1lbnRzIHJlbWFpbiBpbiBsaXN0IG9yZGVyLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgICB2b2lkCisgICAgICAgIHNvcnQoX1N0cmljdFdlYWtPcmRlcmluZyk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyBJbnRlcm5hbCBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgZm9sbG93LgorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIHJhbmdlIGNvbnN0cnVjdG9yIHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzOC4gQW1iaWd1aXR5IGluIHRoZSAiZG8gdGhlIHJpZ2h0IHRoaW5nIiBjbGF1c2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlZ2VyPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsIF9fdHJ1ZV90eXBlKQorICAgICAgICB7IF9NX2ZpbGxfaW5pdGlhbGl6ZShzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fbiksIF9feCk7IH0KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSByYW5nZSBjb25zdHJ1Y3RvciB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgICAgICAgX19mYWxzZV90eXBlKQorICAgICAgICB7CisJICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisJICAgIGVtcGxhY2VfYmFjaygqX19maXJzdCk7CisjZWxzZQorCSAgICBwdXNoX2JhY2soKl9fZmlyc3QpOworI2VuZGlmCisJfQorCisgICAgICAvLyBDYWxsZWQgYnkgbGlzdChuLHYsYSksIGFuZCB0aGUgcmFuZ2UgY29uc3RydWN0b3Igd2hlbiBpdCB0dXJucyBvdXQKKyAgICAgIC8vIHRvIGJlIHRoZSBzYW1lIHRoaW5nLgorICAgICAgdm9pZAorICAgICAgX01fZmlsbF9pbml0aWFsaXplKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlmb3IgKDsgX19uOyAtLV9fbikKKwkgIHB1c2hfYmFjayhfX3gpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gQ2FsbGVkIGJ5IGxpc3QobikuCisgICAgICB2b2lkCisgICAgICBfTV9kZWZhdWx0X2luaXRpYWxpemUoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlmb3IgKDsgX19uOyAtLV9fbikKKwkgIGVtcGxhY2VfYmFjaygpOworICAgICAgfQorCisgICAgICAvLyBDYWxsZWQgYnkgcmVzaXplKHN6KS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlZmF1bHRfYXBwZW5kKHNpemVfdHlwZSBfX24pOworI2VuZGlmCisKKyAgICAgIC8vIEludGVybmFsIGFzc2lnbiBmdW5jdGlvbnMgZm9sbG93LgorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIHJhbmdlIGFzc2lnbiB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwgX190cnVlX3R5cGUpCisgICAgICAgIHsgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7IH0KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSByYW5nZSBhc3NpZ24gdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgICBfX2ZhbHNlX3R5cGUpOworCisgICAgICAvLyBDYWxsZWQgYnkgYXNzaWduKG4sdCksIGFuZCB0aGUgcmFuZ2UgYXNzaWduIHdoZW4gaXQgdHVybnMgb3V0CisgICAgICAvLyB0byBiZSB0aGUgc2FtZSB0aGluZy4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2ZpbGxfYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKTsKKworCisgICAgICAvLyBNb3ZlcyB0aGUgZWxlbWVudHMgZnJvbSBbZmlyc3QsbGFzdCkgYmVmb3JlIHBvc2l0aW9uLgorICAgICAgdm9pZAorICAgICAgX01fdHJhbnNmZXIoaXRlcmF0b3IgX19wb3NpdGlvbiwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBfX3Bvc2l0aW9uLl9NX25vZGUtPl9NX3RyYW5zZmVyKF9fZmlyc3QuX01fbm9kZSwgX19sYXN0Ll9NX25vZGUpOyB9CisKKyAgICAgIC8vIEluc2VydHMgbmV3IGVsZW1lbnQgYXQgcG9zaXRpb24gZ2l2ZW4gYW5kIHdpdGggdmFsdWUgZ2l2ZW4uCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBfTV9pbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworICAgICAgICBfTm9kZSogX190bXAgPSBfTV9jcmVhdGVfbm9kZShfX3gpOworICAgICAgICBfX3RtcC0+X01faG9vayhfX3Bvc2l0aW9uLl9NX25vZGUpOworICAgICAgfQorI2Vsc2UKKyAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgdm9pZAorICAgICAgIF9NX2luc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICB7CisJIF9Ob2RlKiBfX3RtcCA9IF9NX2NyZWF0ZV9ub2RlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJIF9fdG1wLT5fTV9ob29rKF9fcG9zaXRpb24uX01fbm9kZSk7CisgICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIEVyYXNlcyBlbGVtZW50IGF0IHBvc2l0aW9uIGdpdmVuLgorICAgICAgdm9pZAorICAgICAgX01fZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKyAgICAgICAgX19wb3NpdGlvbi5fTV9ub2RlLT5fTV91bmhvb2soKTsKKyAgICAgICAgX05vZGUqIF9fbiA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19wb3NpdGlvbi5fTV9ub2RlKTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLmRlc3Ryb3koX19uKTsKKyNlbHNlCisJX01fZ2V0X1RwX2FsbG9jYXRvcigpLmRlc3Ryb3koc3RkOjpfX2FkZHJlc3NvZihfX24tPl9NX2RhdGEpKTsKKyNlbmRpZgorICAgICAgICBfTV9wdXRfbm9kZShfX24pOworICAgICAgfQorCisgICAgICAvLyBUbyBpbXBsZW1lbnQgdGhlIHNwbGljZSAoYW5kIG1lcmdlKSBiaXRzIG9mIE4xNTk5LgorICAgICAgdm9pZAorICAgICAgX01fY2hlY2tfZXF1YWxfYWxsb2NhdG9ycyhsaXN0JiBfX3gpCisgICAgICB7CisJaWYgKHN0ZDo6X19hbGxvY19uZXE8dHlwZW5hbWUgX0Jhc2U6Ol9Ob2RlX2FsbG9jX3R5cGU+OjoKKwkgICAgX1NfZG9faXQoX01fZ2V0X05vZGVfYWxsb2NhdG9yKCksIF9feC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSkpCisJICBfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJsaXN0OjpfTV9jaGVja19lcXVhbF9hbGxvY2F0b3JzIikpOworICAgICAgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIExpc3QgZXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICVsaXN0LgorICAgKiAgQHBhcmFtICBfX3kgIEEgJWxpc3Qgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSBfX3guCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiB0aGUgc2l6ZSBhbmQgZWxlbWVudHMgb2YgdGhlIGxpc3RzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YKKyAgICogIHRoZSBsaXN0cy4gIExpc3RzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgdGhlaXIgc2l6ZXMgYXJlCisgICAqICBlcXVhbCwgYW5kIGlmIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgY29tcGFyZSBlcXVhbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBsaXN0PF9UcCwgX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICBjb25zdF9pdGVyYXRvciBfX2VuZDEgPSBfX3guZW5kKCk7CisgICAgICBjb25zdF9pdGVyYXRvciBfX2VuZDIgPSBfX3kuZW5kKCk7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9faTEgPSBfX3guYmVnaW4oKTsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9faTIgPSBfX3kuYmVnaW4oKTsKKyAgICAgIHdoaWxlIChfX2kxICE9IF9fZW5kMSAmJiBfX2kyICE9IF9fZW5kMiAmJiAqX19pMSA9PSAqX19pMikKKwl7CisJICArK19faTE7CisJICArK19faTI7CisJfQorICAgICAgcmV0dXJuIF9faTEgPT0gX19lbmQxICYmIF9faTIgPT0gX19lbmQyOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgTGlzdCBvcmRlcmluZyByZWxhdGlvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICVsaXN0LgorICAgKiAgQHBhcmFtICBfX3kgIEEgJWxpc3Qgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSBfX3guCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiBAYSBfX3ggaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuIEBhIF9feS4KKyAgICoKKyAgICogIFRoaXMgaXMgYSB0b3RhbCBvcmRlcmluZyByZWxhdGlvbi4gIEl0IGlzIGxpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUKKyAgICogIGxpc3RzLiAgVGhlIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSB3aXRoIEBjIDwuCisgICAqCisgICAqICBTZWUgc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgpIGZvciBob3cgdGhlIGRldGVybWluYXRpb24gaXMgbWFkZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9feC5iZWdpbigpLCBfX3guZW5kKCksCisJCQkJCSAgX195LmJlZ2luKCksIF9feS5lbmQoKSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I9PQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICAvLy8gU2VlIHN0ZDo6bGlzdDo6c3dhcCgpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobGlzdDxfVHAsIF9BbGxvYz4mIF9feCwgbGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX1NUTF9MSVNUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfbWFwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNWU0YjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX21hcC5oCkBAIC0wLDAgKzEsMTAyMSBAQAorLy8gTWFwIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9tYXAuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21hcH0KKyAqLworCisjaWZuZGVmIF9TVExfTUFQX0gKKyNkZWZpbmUgX1NUTF9NQVBfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8dHVwbGU+CisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgbWFkZSB1cCBvZiAoa2V5LHZhbHVlKSBwYWlycywgd2hpY2ggY2FuIGJlCisgICAqICByZXRyaWV2ZWQgYmFzZWQgb24gYSBrZXksIGluIGxvZ2FyaXRobWljIHRpbWUuCisgICAqCisgICAqICBAaW5ncm91cCBhc3NvY2lhdGl2ZV9jb250YWluZXJzCisgICAqCisgICAqICBAdHBhcmFtIF9LZXkgIFR5cGUgb2Yga2V5IG9iamVjdHMuCisgICAqICBAdHBhcmFtICBfVHAgIFR5cGUgb2YgbWFwcGVkIG9iamVjdHMuCisgICAqICBAdHBhcmFtIF9Db21wYXJlICBDb21wYXJpc29uIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBsZXNzPF9LZXk+LgorICAgKiAgQHRwYXJhbSBfQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byAKKyAgICogICAgICAgICAgICAgICAgICBhbGxvY2F0b3I8cGFpcjxjb25zdCBfS2V5LCBfVHA+LgorICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NiI+cmV2ZXJzaWJsZSBjb250YWluZXI8L2E+LCBhbmQgYW4KKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY5Ij5hc3NvY2lhdGl2ZSBjb250YWluZXI8L2E+ICh1c2luZyB1bmlxdWUga2V5cykuCisgICAqICBGb3IgYSBAYyBtYXA8S2V5LFQ+IHRoZSBrZXlfdHlwZSBpcyBLZXksIHRoZSBtYXBwZWRfdHlwZSBpcyBULCBhbmQgdGhlCisgICAqICB2YWx1ZV90eXBlIGlzIHN0ZDo6cGFpcjxjb25zdCBLZXksVD4uCisgICAqCisgICAqICBNYXBzIHN1cHBvcnQgYmlkaXJlY3Rpb25hbCBpdGVyYXRvcnMuCisgICAqCisgICAqICBUaGUgcHJpdmF0ZSB0cmVlIGRhdGEgaXMgZGVjbGFyZWQgZXhhY3RseSB0aGUgc2FtZSB3YXkgZm9yIG1hcCBhbmQKKyAgICogIG11bHRpbWFwOyB0aGUgZGlzdGluY3Rpb24gaXMgbWFkZSBlbnRpcmVseSBpbiBob3cgdGhlIHRyZWUgZnVuY3Rpb25zIGFyZQorICAgKiAgY2FsbGVkICgqX3VuaXF1ZSB2ZXJzdXMgKl9lcXVhbCwgc2FtZSBhcyB0aGUgc3RhbmRhcmQpLgorICAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZSA9IHN0ZDo6bGVzczxfS2V5PiwKKyAgICAgICAgICAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIG1hcAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp2YWx1ZV90eXBlICAgICAgICAgICAgICAgICAgIF9BbGxvY192YWx1ZV90eXBlOworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9UcCwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzNChfQ29tcGFyZSwgYm9vbCwgX0tleSwgX0tleSwKKwkJCQlfQmluYXJ5RnVuY3Rpb25Db25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMih2YWx1ZV90eXBlLCBfQWxsb2NfdmFsdWVfdHlwZSwgX1NhbWVUeXBlQ29uY2VwdCkKKworICAgIHB1YmxpYzoKKyAgICAgIGNsYXNzIHZhbHVlX2NvbXBhcmUKKyAgICAgIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPHZhbHVlX3R5cGUsIHZhbHVlX3R5cGUsIGJvb2w+CisgICAgICB7CisJZnJpZW5kIGNsYXNzIG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+OworICAgICAgcHJvdGVjdGVkOgorCV9Db21wYXJlIGNvbXA7CisKKwl2YWx1ZV9jb21wYXJlKF9Db21wYXJlIF9fYykKKwk6IGNvbXAoX19jKSB7IH0KKworICAgICAgcHVibGljOgorCWJvb2wgb3BlcmF0b3IoKShjb25zdCB2YWx1ZV90eXBlJiBfX3gsIGNvbnN0IHZhbHVlX3R5cGUmIF9feSkgY29uc3QKKwl7IHJldHVybiBjb21wKF9feC5maXJzdCwgX195LmZpcnN0KTsgfQorICAgICAgfTsKKworICAgIHByaXZhdGU6CisgICAgICAvLy8gVGhpcyB0dXJucyBhIHJlZC1ibGFjayB0cmVlIGludG8gYSBbbXVsdGldbWFwLiAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8dmFsdWVfdHlwZT46Om90aGVyIAorICAgICAgICBfUGFpcl9hbGxvY190eXBlOworCisgICAgICB0eXBlZGVmIF9SYl90cmVlPGtleV90eXBlLCB2YWx1ZV90eXBlLCBfU2VsZWN0MXN0PHZhbHVlX3R5cGU+LAorCQkgICAgICAga2V5X2NvbXBhcmUsIF9QYWlyX2FsbG9jX3R5cGU+IF9SZXBfdHlwZTsKKworICAgICAgLy8vIFRoZSBhY3R1YWwgdHJlZSBzdHJ1Y3R1cmUuCisgICAgICBfUmVwX3R5cGUgX01fdDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIG1hbnkgb2YgdGhlc2UgYXJlIHNwZWNpZmllZCBkaWZmZXJlbnRseSBpbiBJU08sIGJ1dCB0aGUgZm9sbG93aW5nIGFyZQorICAgICAgLy8gImZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUGFpcl9hbGxvY190eXBlOjpwb2ludGVyICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXJfYWxsb2NfdHlwZTo6Y29uc3RfcG9pbnRlciAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9QYWlyX2FsbG9jX3R5cGU6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9QYWlyX2FsbG9jX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6aXRlcmF0b3IgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnNpemVfdHlwZSAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIFsyMy4zLjEuMV0gY29uc3RydWN0L2NvcHkvZGVzdHJveQorICAgICAgLy8gKGdldF9hbGxvY2F0b3IoKSBpcyBub3JtYWxseSBsaXN0ZWQgaW4gdGhpcyBzZWN0aW9uLCBidXQgc2VlbXMgdG8gaGF2ZQorICAgICAgLy8gYmVlbiBhY2NpZGVudGFsbHkgb21pdHRlZCBpbiB0aGUgcHJpbnRlZCBzdGFuZGFyZCkKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICovCisgICAgICBtYXAoKQorICAgICAgOiBfTV90KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVtYXAgd2l0aCBubyBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fY29tcCAgQSBjb21wYXJpc29uIG9iamVjdC4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wLAorCSAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX3QoX19jb21wLCBfUGFpcl9hbGxvY190eXBlKF9fYSkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVNYXAgY29weSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbWFwIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVtYXAgdXNlcyBhIGNvcHkgb2YgdGhlIGFsbG9jYXRpb24gb2JqZWN0CisgICAgICAgKiAgdXNlZCBieSBAYSBfX3guCisgICAgICAgKi8KKyAgICAgIG1hcChjb25zdCBtYXAmIF9feCkKKyAgICAgIDogX01fdChfX3guX01fdCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVNYXAgbW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbWFwIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVtYXAgY29udGFpbnMgdGhlIGV4YWN0IGNvbnRlbnRzIG9mIEBhIF9feC4KKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgX194IGFyZSBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgJW1hcC4KKyAgICAgICAqLworICAgICAgbWFwKG1hcCYmIF9feCkKKyAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPF9Db21wYXJlPjo6dmFsdWUpCisgICAgICA6IF9NX3Qoc3RkOjptb3ZlKF9feC5fTV90KSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJW1hcCBmcm9tIGFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2NvbXAgIEEgY29tcGFyaXNvbiBvYmplY3QuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVtYXAgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyX2xpc3QgQGEgX19sLgorICAgICAgICogIFRoaXMgaXMgbGluZWFyIGluIE4gaWYgdGhlIHJhbmdlIGlzIGFscmVhZHkgc29ydGVkLCBhbmQgTmxvZ04KKyAgICAgICAqICBvdGhlcndpc2UgKHdoZXJlIE4gaXMgQGEgX19sLnNpemUoKSkuCisgICAgICAgKi8KKyAgICAgIG1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX3QoX19jb21wLCBfUGFpcl9hbGxvY190eXBlKF9fYSkpCisgICAgICB7IF9NX3QuX01faW5zZXJ0X3VuaXF1ZShfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJW1hcCBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVtYXAgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAgICAqICBbX19maXJzdCxfX2xhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiBpZiB0aGUgcmFuZ2UgaXMKKyAgICAgICAqICBhbHJlYWR5IHNvcnRlZCwgYW5kIE5sb2dOIG90aGVyd2lzZSAod2hlcmUgTiBpcworICAgICAgICogIGRpc3RhbmNlKF9fZmlyc3QsX19sYXN0KSkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBtYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorCTogX01fdCgpCisgICAgICAgIHsgX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlbWFwIGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fY29tcCAgQSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVtYXAgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAgICAqICBbX19maXJzdCxfX2xhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiBpZiB0aGUgcmFuZ2UgaXMKKyAgICAgICAqICBhbHJlYWR5IHNvcnRlZCwgYW5kIE5sb2dOIG90aGVyd2lzZSAod2hlcmUgTiBpcworICAgICAgICogIGRpc3RhbmNlKF9fZmlyc3QsX19sYXN0KSkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBtYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX3QoX19jb21wLCBfUGFpcl9hbGxvY190eXBlKF9fYSkpCisgICAgICAgIHsgX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLy8gRklYTUUgVGhlcmUgaXMgbm8gZHRvciBkZWNsYXJlZCwgYnV0IHdlIHNob3VsZCBoYXZlIHNvbWV0aGluZworICAgICAgLy8gZ2VuZXJhdGVkIGJ5IERveHlnZW4uICBJIGRvbid0IGtub3cgd2hhdCB0YWdzIHRvIGFkZCB0byB0aGlzCisgICAgICAvLyBwYXJhZ3JhcGggdG8gbWFrZSB0aGF0IGhhcHBlbjoKKyAgICAgIC8qKgorICAgICAgICogIFRoZSBkdG9yIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIG5vdGUgdGhhdCBpZiB0aGUgZWxlbWVudHMKKyAgICAgICAqICB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueQorICAgICAgICogIHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTWFwIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJW1hcCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBBbGwgdGhlIGVsZW1lbnRzIG9mIEBhIF9feCBhcmUgY29waWVkLCBidXQgdW5saWtlIHRoZSBjb3B5CisgICAgICAgKiAgY29uc3RydWN0b3IsIHRoZSBhbGxvY2F0b3Igb2JqZWN0IGlzIG5vdCBjb3BpZWQuCisgICAgICAgKi8KKyAgICAgIG1hcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBtYXAmIF9feCkKKyAgICAgIHsKKwlfTV90ID0gX194Ll9NX3Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTWFwIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbWFwIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSBfX3ggYXJlIG1vdmVkIGludG8gdGhpcyBtYXAgKHdpdGhvdXQgY29weWluZykuCisgICAgICAgKiAgQGEgX194IGlzIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCAlbWFwLgorICAgICAgICovCisgICAgICBtYXAmCisgICAgICBvcGVyYXRvcj0obWFwJiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVNYXAgbGlzdCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJW1hcCB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgaW5pdGlhbGl6ZXIgbGlzdCBAYSBfX2wuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICVtYXAgYW5kCisgICAgICAgKiAgdGhhdCB0aGUgcmVzdWx0aW5nICVtYXAncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICBtYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vLyBHZXQgYSBjb3B5IG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBvYmplY3QuCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfTV90LmdldF9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgLy8gaXRlcmF0b3JzCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgcGFpciBpbiB0aGUKKyAgICAgICAqICAlbWFwLgorICAgICAgICogIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBwYWlyCisgICAgICAgKiAgaW4gdGhlICVtYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICogIGtleXMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBwYWlyIGluIHRoZSAlbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgcGFpciBpbiB0aGUgJW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8KKyAgICAgICAqICB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGxhc3QgcGFpciBpbgorICAgICAgICogIHRoZSAlbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgKiAga2V5cy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlCisgICAgICAgKiAgbGFzdCBwYWlyIGluIHRoZSAlbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUgYmVmb3JlIHRoZQorICAgICAgICogIGZpcnN0IHBhaXIgaW4gdGhlICVtYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIG9uZQorICAgICAgICogIGJlZm9yZSB0aGUgZmlyc3QgcGFpciBpbiB0aGUgJW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcKKyAgICAgICAqICBvcmRlciBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgcGFpcgorICAgICAgICogIGluIHRoZSAlbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAqICBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBwYWlyIGluIHRoZSAlbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0bworICAgICAgICogIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV90LmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgcGFpciBpbiB0aGUgJW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUKKyAgICAgICAqICBiZWZvcmUgdGhlIGZpcnN0IHBhaXIgaW4gdGhlICVtYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nCisgICAgICAgKiAgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV90LnJlbmQoKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIGNhcGFjaXR5CisgICAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSAlbWFwIGlzIGVtcHR5LiAgKFRodXMgYmVnaW4oKSB3b3VsZCBlcXVhbAorICAgICAgICogIGVuZCgpLikKKyAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmVtcHR5KCk7IH0KKworICAgICAgLyoqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlICVtYXAuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3Quc2l6ZSgpOyB9CisKKyAgICAgIC8qKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlICVtYXAuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90Lm1heF9zaXplKCk7IH0KKworICAgICAgLy8gWzIzLjMuMS4yXSBlbGVtZW50IGFjY2VzcworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdWJzY3JpcHQgKCBAYyBbXSApIGFjY2VzcyB0byAlbWFwIGRhdGEuCisgICAgICAgKiAgQHBhcmFtICBfX2sgIFRoZSBrZXkgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHJpZXZlZC4KKyAgICAgICAqICBAcmV0dXJuICBBIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBvZiB0aGUgKGtleSxkYXRhKSAlcGFpci4KKyAgICAgICAqCisgICAgICAgKiAgQWxsb3dzIGZvciBlYXN5IGxvb2t1cCB3aXRoIHRoZSBzdWJzY3JpcHQgKCBAYyBbXSApCisgICAgICAgKiAgb3BlcmF0b3IuICBSZXR1cm5zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgc3BlY2lmaWVkIGluCisgICAgICAgKiAgc3Vic2NyaXB0LiAgSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCwgYSBwYWlyIHdpdGggdGhhdCBrZXkKKyAgICAgICAqICBpcyBjcmVhdGVkIHVzaW5nIGRlZmF1bHQgdmFsdWVzLCB3aGljaCBpcyB0aGVuIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBMb29rdXAgcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZS4KKyAgICAgICAqLworICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgICB7CisJLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0RlZmF1bHRDb25zdHJ1Y3RpYmxlQ29uY2VwdDxtYXBwZWRfdHlwZT4pCisKKwlpdGVyYXRvciBfX2kgPSBsb3dlcl9ib3VuZChfX2spOworCS8vIF9faS0+Zmlyc3QgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWl2YWxlbnQgdG8gX19rLgorCWlmIChfX2kgPT0gZW5kKCkgfHwga2V5X2NvbXAoKShfX2ssICgqX19pKS5maXJzdCkpCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCSAgX19pID0gX01fdC5fTV9lbXBsYWNlX2hpbnRfdW5pcXVlKF9faSwgc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LAorCQkJCQkgICAgc3RkOjp0dXBsZTxjb25zdCBrZXlfdHlwZSY+KF9fayksCisJCQkJCSAgICBzdGQ6OnR1cGxlPD4oKSk7CisjZWxzZQorICAgICAgICAgIF9faSA9IGluc2VydChfX2ksIHZhbHVlX3R5cGUoX19rLCBtYXBwZWRfdHlwZSgpKSk7CisjZW5kaWYKKwlyZXR1cm4gKCpfX2kpLnNlY29uZDsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIG1hcHBlZF90eXBlJgorICAgICAgb3BlcmF0b3JbXShrZXlfdHlwZSYmIF9faykKKyAgICAgIHsKKwkvLyBjb25jZXB0IHJlcXVpcmVtZW50cworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRGVmYXVsdENvbnN0cnVjdGlibGVDb25jZXB0PG1hcHBlZF90eXBlPikKKworCWl0ZXJhdG9yIF9faSA9IGxvd2VyX2JvdW5kKF9fayk7CisJLy8gX19pLT5maXJzdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1aXZhbGVudCB0byBfX2suCisJaWYgKF9faSA9PSBlbmQoKSB8fCBrZXlfY29tcCgpKF9faywgKCpfX2kpLmZpcnN0KSkKKwkgIF9faSA9IF9NX3QuX01fZW1wbGFjZV9oaW50X3VuaXF1ZShfX2ksIHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwKKwkJCQkJc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6bW92ZShfX2spKSwKKwkJCQkJc3RkOjp0dXBsZTw+KCkpOworCXJldHVybiAoKl9faSkuc2Vjb25kOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDQ2NC4gU3VnZ2VzdGlvbiBmb3IgbmV3IG1lbWJlciBmdW5jdGlvbnMgaW4gc3RhbmRhcmQgY29udGFpbmVycy4KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWNjZXNzIHRvICVtYXAgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gIF9fayAgVGhlIGtleSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0cmlldmVkLgorICAgICAgICogIEByZXR1cm4gIEEgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIHdob3NlIGtleSBpcyBlcXVpdmFsZW50IHRvIEBhIF9faywgaWYKKyAgICAgICAqICAgICAgICAgICBzdWNoIGEgZGF0YSBpcyBwcmVzZW50IGluIHRoZSAlbWFwLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIG5vIHN1Y2ggZGF0YSBpcyBwcmVzZW50LgorICAgICAgICovCisgICAgICBtYXBwZWRfdHlwZSYKKyAgICAgIGF0KGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgICB7CisJaXRlcmF0b3IgX19pID0gbG93ZXJfYm91bmQoX19rKTsKKwlpZiAoX19pID09IGVuZCgpIHx8IGtleV9jb21wKCkoX19rLCAoKl9faSkuZmlyc3QpKQorCSAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJtYXA6OmF0IikpOworCXJldHVybiAoKl9faSkuc2Vjb25kOworICAgICAgfQorCisgICAgICBjb25zdCBtYXBwZWRfdHlwZSYKKyAgICAgIGF0KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICB7CisJY29uc3RfaXRlcmF0b3IgX19pID0gbG93ZXJfYm91bmQoX19rKTsKKwlpZiAoX19pID09IGVuZCgpIHx8IGtleV9jb21wKCkoX19rLCAoKl9faSkuZmlyc3QpKQorCSAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJtYXA6OmF0IikpOworCXJldHVybiAoKl9faSkuc2Vjb25kOworICAgICAgfQorCisgICAgICAvLyBtb2RpZmllcnMKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gYnVpbGQgYW5kIGluc2VydCBhIHN0ZDo6cGFpciBpbnRvIHRoZSAlbWFwLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19hcmdzICBBcmd1bWVudHMgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBwYWlyIGluc3RhbmNlIChzZWUKKyAgICAgICAqCSAgICAgICAgc3RkOjpwaWVjZXdpc2VfY29udHJ1Y3QgZm9yIHBhc3NpbmcgYXJndW1lbnRzIHRvIGVhY2gKKyAgICAgICAqCSAgICAgICAgcGFydCBvZiB0aGUgcGFpciBjb25zdHJ1Y3RvcikuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEEgcGFpciwgb2Ygd2hpY2ggdGhlIGZpcnN0IGVsZW1lbnQgaXMgYW4gaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICAgICAgICAgICB0byB0aGUgcG9zc2libHkgaW5zZXJ0ZWQgcGFpciwgYW5kIHRoZSBzZWNvbmQgaXMgYSBib29sIHRoYXQKKyAgICAgICAqICAgICAgICAgICBpcyB0cnVlIGlmIHRoZSBwYWlyIHdhcyBhY3R1YWxseSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBidWlsZCBhbmQgaW5zZXJ0IGEgKGtleSwgdmFsdWUpICVwYWlyIGludG8KKyAgICAgICAqICB0aGUgJW1hcC4KKyAgICAgICAqICBBICVtYXAgcmVsaWVzIG9uIHVuaXF1ZSBrZXlzIGFuZCB0aHVzIGEgJXBhaXIgaXMgb25seSBpbnNlcnRlZCBpZiBpdHMKKyAgICAgICAqICBmaXJzdCBlbGVtZW50ICh0aGUga2V5KSBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSAlbWFwLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01fdC5fTV9lbXBsYWNlX3VuaXF1ZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBidWlsZCBhbmQgaW5zZXJ0IGEgc3RkOjpwYWlyIGludG8gdGhlICVtYXAuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUgcGFpcgorICAgICAgICogICAgICAgICAgICAgICAgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX19hcmdzICBBcmd1bWVudHMgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBwYWlyIGluc3RhbmNlIChzZWUKKyAgICAgICAqCSAgICAgICAgIHN0ZDo6cGllY2V3aXNlX2NvbnRydWN0IGZvciBwYXNzaW5nIGFyZ3VtZW50cyB0byBlYWNoCisgICAgICAgKgkgICAgICAgICBwYXJ0IG9mIHRoZSBwYWlyIGNvbnN0cnVjdG9yKS4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBlbGVtZW50IHdpdGgga2V5IG9mIHRoZQorICAgICAgICogICAgICAgICAgc3RkOjpwYWlyIGJ1aWx0IGZyb20gQGEgX19hcmdzIChtYXkgb3IgbWF5IG5vdCBiZSB0aGF0CisgICAgICAgKiAgICAgICAgICBzdGQ6OnBhaXIpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjb25jZXJuZWQgYWJvdXQgd2hldGhlciB0aGUgaW5zZXJ0aW9uIHRvb2sgcGxhY2UsCisgICAgICAgKiAgYW5kIHRodXMgZG9lcyBub3QgcmV0dXJuIGEgYm9vbGVhbiBsaWtlIHRoZSBzaW5nbGUtYXJndW1lbnQgZW1wbGFjZSgpCisgICAgICAgKiAgZG9lcy4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBvbmx5IGEgaGludCBhbmQgY2FuIHBvdGVudGlhbGx5CisgICAgICAgKiAgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGluc2VydGlvbiBwcm9jZXNzLiBBIGJhZCBoaW50IHdvdWxkCisgICAgICAgKiAgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgU2VlCisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwN2NoMTcuaHRtbAorICAgICAgICogIGZvciBtb3JlIG9uIEBhIGhpbnRpbmcuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBsb2dhcml0aG1pYyB0aW1lIChpZiB0aGUgaGludCBpcyBub3QgdGFrZW4pLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgcmV0dXJuIF9NX3QuX01fZW1wbGFjZV9oaW50X3VuaXF1ZShfX3BvcywKKwkJCQkJICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGEgc3RkOjpwYWlyIGludG8gdGhlICVtYXAuCisKKyAgICAgICAqICBAcGFyYW0gX194IFBhaXIgdG8gYmUgaW5zZXJ0ZWQgKHNlZSBzdGQ6Om1ha2VfcGFpciBmb3IgZWFzeQorICAgICAgICoJICAgICBjcmVhdGlvbiBvZiBwYWlycykuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEEgcGFpciwgb2Ygd2hpY2ggdGhlIGZpcnN0IGVsZW1lbnQgaXMgYW4gaXRlcmF0b3IgdGhhdCAKKyAgICAgICAqICAgICAgICAgICBwb2ludHMgdG8gdGhlIHBvc3NpYmx5IGluc2VydGVkIHBhaXIsIGFuZCB0aGUgc2Vjb25kIGlzIAorICAgICAgICogICAgICAgICAgIGEgYm9vbCB0aGF0IGlzIHRydWUgaWYgdGhlIHBhaXIgd2FzIGFjdHVhbGx5IGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGluc2VydCBhIChrZXksIHZhbHVlKSAlcGFpciBpbnRvIHRoZSAlbWFwLgorICAgICAgICogIEEgJW1hcCByZWxpZXMgb24gdW5pcXVlIGtleXMgYW5kIHRodXMgYSAlcGFpciBpcyBvbmx5IGluc2VydGVkIGlmIGl0cworICAgICAgICogIGZpcnN0IGVsZW1lbnQgKHRoZSBrZXkpIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlICVtYXAuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBsb2dhcml0aG1pYyB0aW1lLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9feCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgICAgaW5zZXJ0KF9QYWlyJiYgX194KQorICAgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF91bmlxdWUoc3RkOjpmb3J3YXJkPF9QYWlyPihfX3gpKTsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGEgbGlzdCBvZiBzdGQ6OnBhaXJzIGludG8gdGhlICVtYXAuCisgICAgICAgKiAgQHBhcmFtICBfX2xpc3QgIEEgc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IG9mIHBhaXJzIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19saXN0KQorICAgICAgeyBpbnNlcnQoX19saXN0LmJlZ2luKCksIF9fbGlzdC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGEgc3RkOjpwYWlyIGludG8gdGhlICVtYXAuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciB0aGF0IHNlcnZlcyBhcyBhIGhpbnQgYXMgdG8gd2hlcmUgdGhlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgcGFpciBzaG91bGQgYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIFBhaXIgdG8gYmUgaW5zZXJ0ZWQgKHNlZSBzdGQ6Om1ha2VfcGFpciBmb3IgZWFzeSBjcmVhdGlvbgorICAgICAgICogICAgICAgICAgICAgICBvZiBwYWlycykuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZWxlbWVudCB3aXRoIGtleSBvZgorICAgICAgICogICAgICAgICAgIEBhIF9feCAobWF5IG9yIG1heSBub3QgYmUgdGhlICVwYWlyIHBhc3NlZCBpbikuCisgICAgICAgKgorCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgY29uY2VybmVkIGFib3V0IHdoZXRoZXIgdGhlIGluc2VydGlvbgorICAgICAgICogIHRvb2sgcGxhY2UsIGFuZCB0aHVzIGRvZXMgbm90IHJldHVybiBhIGJvb2xlYW4gbGlrZSB0aGUKKyAgICAgICAqICBzaW5nbGUtYXJndW1lbnQgaW5zZXJ0KCkgZG9lcy4gIE5vdGUgdGhhdCB0aGUgZmlyc3QKKyAgICAgICAqICBwYXJhbWV0ZXIgaXMgb25seSBhIGhpbnQgYW5kIGNhbiBwb3RlbnRpYWxseSBpbXByb3ZlIHRoZQorICAgICAgICogIHBlcmZvcm1hbmNlIG9mIHRoZSBpbnNlcnRpb24gcHJvY2Vzcy4gIEEgYmFkIGhpbnQgd291bGQKKyAgICAgICAqICBjYXVzZSBubyBnYWlucyBpbiBlZmZpY2llbmN5LgorICAgICAgICoKKyAgICAgICAqICBTZWUKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKiAgZm9yIG1vcmUgb24gQGEgaGludGluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUgKGlmIHRoZSBoaW50IGlzIG5vdCB0YWtlbikuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbHNlCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2VuZGlmCisgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF91bmlxdWVfKF9fcG9zaXRpb24sIF9feCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfUGFpciYmIF9feCkKKyAgICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfdW5pcXVlXyhfX3Bvc2l0aW9uLAorCQkJCQlzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgYXR0ZW1wdHMgdG8gaW5zZXJ0IGEgcmFuZ2Ugb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSByYW5nZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyBfTV90Ll9NX2luc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMTMwLiBBc3NvY2lhdGl2ZSBlcmFzZSBzaG91bGQgcmV0dXJuIGFuIGl0ZXJhdG9yLgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhbiBlbGVtZW50IGZyb20gYSAlbWFwLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nCisgICAgICAgKiAgICAgICAgICBAYSBwb3NpdGlvbiBwcmlvciB0byB0aGUgZWxlbWVudCBiZWluZyBlcmFzZWQuIElmIG5vIHN1Y2ggCisgICAgICAgKiAgICAgICAgICBlbGVtZW50IGV4aXN0cywgZW5kKCkgaXMgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFuIGVsZW1lbnQsIHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuCisgICAgICAgKiAgaXRlcmF0b3IsIGZyb20gYSAlbWFwLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMKKyAgICAgICAqICB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwKKyAgICAgICAqICB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nCisgICAgICAgKiAgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CisKKyAgICAgIC8vIExXRyAyMDU5CisgICAgICBfR0xJQkNYWF9BQklfVEFHX0NYWDExCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXJhc2UoX19wb3NpdGlvbik7IH0KKyNlbHNlCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGFuIGVsZW1lbnQgZnJvbSBhICVtYXAuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFuIGVsZW1lbnQsIHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuCisgICAgICAgKiAgaXRlcmF0b3IsIGZyb20gYSAlbWFwLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMKKyAgICAgICAqICB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwKKyAgICAgICAqICB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nCisgICAgICAgKiAgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgX01fdC5lcmFzZShfX3Bvc2l0aW9uKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYWxsIHRoZSBlbGVtZW50cyBsb2NhdGVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQorICAgICAgICogIGEgJW1hcC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX3gpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGEgW2ZpcnN0LGxhc3QpIHJhbmdlIG9mIGVsZW1lbnRzIGZyb20gYSAlbWFwLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEBwYXJhbSBfX2xhc3QgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UgdG8KKyAgICAgICAqICAgICAgICAgICAgICAgIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIFRoZSBpdGVyYXRvciBAYSBfX2xhc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZnJvbSBhICVtYXAuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbHNlCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGEgW19fZmlyc3QsX19sYXN0KSByYW5nZSBvZiBlbGVtZW50cyBmcm9tIGEgJW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gX19sYXN0IEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvCisgICAgICAgKiAgICAgICAgICAgICAgICBiZSBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZnJvbSBhICVtYXAuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX01fdC5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAlbWFwLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVtYXAgb2YgdGhlIHNhbWUgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGV4Y2hhbmdlcyB0aGUgZWxlbWVudHMgYmV0d2VlbiB0d28gbWFwcyBpbiBjb25zdGFudAorICAgICAgICogIHRpbWUuICAoSXQgaXMgb25seSBzd2FwcGluZyBhIHBvaW50ZXIsIGFuIGludGVnZXIsIGFuZCBhbgorICAgICAgICogIGluc3RhbmNlIG9mIHRoZSBAYyBDb21wYXJlIHR5cGUgKHdoaWNoIGl0c2VsZiBpcyBvZnRlbgorICAgICAgICogIHN0YXRlbGVzcyBhbmQgZW1wdHkpLCBzbyBpdCBzaG91bGQgYmUgcXVpdGUgZmFzdC4pICBOb3RlCisgICAgICAgKiAgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzIHNwZWNpYWxpemVkIHN1Y2gKKyAgICAgICAqICB0aGF0IHN0ZDo6c3dhcChtMSxtMikgd2lsbCBmZWVkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobWFwJiBfX3gpCisgICAgICB7IF9NX3Quc3dhcChfX3guX01fdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgRXJhc2VzIGFsbCBlbGVtZW50cyBpbiBhICVtYXAuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5CisgICAgICAgKiAgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlCisgICAgICAgKiAgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LgorICAgICAgICogIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX01fdC5jbGVhcigpOyB9CisKKyAgICAgIC8vIG9ic2VydmVycworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyB0aGUga2V5IGNvbXBhcmlzb24gb2JqZWN0IG91dCBvZiB3aGljaCB0aGUgJW1hcCB3YXMKKyAgICAgICAqICBjb25zdHJ1Y3RlZC4KKyAgICAgICAqLworICAgICAga2V5X2NvbXBhcmUKKyAgICAgIGtleV9jb21wKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgdmFsdWUgY29tcGFyaXNvbiBvYmplY3QsIGJ1aWx0IGZyb20gdGhlIGtleSBjb21wYXJpc29uCisgICAgICAgKiAgb2JqZWN0IG91dCBvZiB3aGljaCB0aGUgJW1hcCB3YXMgY29uc3RydWN0ZWQuCisgICAgICAgKi8KKyAgICAgIHZhbHVlX2NvbXBhcmUKKyAgICAgIHZhbHVlX2NvbXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gdmFsdWVfY29tcGFyZShfTV90LmtleV9jb21wKCkpOyB9CisKKyAgICAgIC8vIFsyMy4zLjEuM10gbWFwIG9wZXJhdGlvbnMKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUcmllcyB0byBsb2NhdGUgYW4gZWxlbWVudCBpbiBhICVtYXAuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiAoa2V5LCB2YWx1ZSkgJXBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyB0byBzb3VnaHQtYWZ0ZXIgZWxlbWVudCwgb3IgZW5kKCkgaWYgbm90CisgICAgICAgKiAgICAgICAgICAgZm91bmQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBrZXkgYW5kIHRyaWVzIHRvIGxvY2F0ZSB0aGUgZWxlbWVudCB3aXRoIHdoaWNoCisgICAgICAgKiAgdGhlIGtleSBtYXRjaGVzLiAgSWYgc3VjY2Vzc2Z1bCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpdGVyYXRvcgorICAgICAgICogIHBvaW50aW5nIHRvIHRoZSBzb3VnaHQgYWZ0ZXIgJXBhaXIuICBJZiB1bnN1Y2Nlc3NmdWwgaXQgcmV0dXJucyB0aGUKKyAgICAgICAqICBwYXN0LXRoZS1lbmQgKCBAYyBlbmQoKSApIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRyaWVzIHRvIGxvY2F0ZSBhbiBlbGVtZW50IGluIGEgJW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSAlcGFpciB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHNvdWdodC1hZnRlcgorICAgICAgICogICAgICAgICAgIGVsZW1lbnQsIG9yIGVuZCgpIGlmIG5vdCBmb3VuZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGtleSBhbmQgdHJpZXMgdG8gbG9jYXRlIHRoZSBlbGVtZW50IHdpdGggd2hpY2gKKyAgICAgICAqICB0aGUga2V5IG1hdGNoZXMuICBJZiBzdWNjZXNzZnVsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgY29uc3RhbnQKKyAgICAgICAqICBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgc291Z2h0IGFmdGVyICVwYWlyLiBJZiB1bnN1Y2Nlc3NmdWwgaXQKKyAgICAgICAqICByZXR1cm5zIHRoZSBwYXN0LXRoZS1lbmQgKCBAYyBlbmQoKSApIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXJzIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgTnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggc3BlY2lmaWVkIGtleS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBvbmx5IG1ha2VzIHNlbnNlIGZvciBtdWx0aW1hcHM7IGZvciBtYXAgdGhlIHJlc3VsdCB3aWxsCisgICAgICAgKiAgZWl0aGVyIGJlIDAgKG5vdCBwcmVzZW50KSBvciAxIChwcmVzZW50KS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5maW5kKF9feCkgPT0gX01fdC5lbmQoKSA/IDAgOiAxOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyB0byBmaXJzdCBlbGVtZW50IGVxdWFsIHRvIG9yIGdyZWF0ZXIKKyAgICAgICAqICAgICAgICAgICB0aGFuIGtleSwgb3IgZW5kKCkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIHN1YnNlcXVlbmNlIG9mIGVsZW1lbnRzCisgICAgICAgKiAgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBrZXkuICBJZiB1bnN1Y2Nlc3NmdWwgaXQgcmV0dXJucyBhbiBpdGVyYXRvcgorICAgICAgICogIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaGFzIGEgZ3JlYXRlciB2YWx1ZSB0aGFuIGdpdmVuIGtleQorICAgICAgICogIG9yIGVuZCgpIGlmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciBwb2ludGluZyB0byBmaXJzdCBlbGVtZW50CisgICAgICAgKiAgICAgICAgICAgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIGtleSwgb3IgZW5kKCkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIHN1YnNlcXVlbmNlIG9mIGVsZW1lbnRzCisgICAgICAgKiAgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBrZXkuICBJZiB1bnN1Y2Nlc3NmdWwgaXQgcmV0dXJucyBhbiBpdGVyYXRvcgorICAgICAgICogIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaGFzIGEgZ3JlYXRlciB2YWx1ZSB0aGFuIGdpdmVuIGtleQorICAgICAgICogIG9yIGVuZCgpIGlmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgZW5kIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50CisgICAgICAgKiAgICAgICAgICBncmVhdGVyIHRoYW4ga2V5LCBvciBlbmQoKS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBlbmQgb2YgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiAoa2V5LCB2YWx1ZSkgcGFpciB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHBvaW50aW5nIHRvIGZpcnN0IGl0ZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgZ3JlYXRlciB0aGFuIGtleSwgb3IgZW5kKCkuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlycyB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIFBhaXIgb2YgaXRlcmF0b3JzIHRoYXQgcG9zc2libHkgcG9pbnRzIHRvIHRoZSBzdWJzZXF1ZW5jZQorICAgICAgICogICAgICAgICAgIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvCisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICAgIHN0ZDo6bWFrZV9wYWlyKGMubG93ZXJfYm91bmQodmFsKSwKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGMudXBwZXJfYm91bmQodmFsKSkKKyAgICAgICAqICBAZW5kY29kZQorICAgICAgICogIChidXQgaXMgZmFzdGVyIHRoYW4gbWFraW5nIHRoZSBjYWxscyBzZXBhcmF0ZWx5KS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwcm9iYWJseSBvbmx5IG1ha2VzIHNlbnNlIGZvciBtdWx0aW1hcHMuCisgICAgICAgKi8KKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlycyB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIFBhaXIgb2YgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3JzIHRoYXQgcG9zc2libHkgcG9pbnRzCisgICAgICAgKiAgICAgICAgICAgdG8gdGhlIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvCisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICAgIHN0ZDo6bWFrZV9wYWlyKGMubG93ZXJfYm91bmQodmFsKSwKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGMudXBwZXJfYm91bmQodmFsKSkKKyAgICAgICAqICBAZW5kY29kZQorICAgICAgICogIChidXQgaXMgZmFzdGVyIHRoYW4gbWFraW5nIHRoZSBjYWxscyBzZXBhcmF0ZWx5KS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwcm9iYWJseSBvbmx5IG1ha2VzIHNlbnNlIGZvciBtdWx0aW1hcHMuCisgICAgICAgKi8KKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LMSwgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfQzEsIHR5cGVuYW1lIF9BMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBtYXA8X0sxLCBfVDEsIF9DMSwgX0ExPiYsCisJCSAgIGNvbnN0IG1hcDxfSzEsIF9UMSwgX0MxLCBfQTE+Jik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LMSwgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfQzEsIHR5cGVuYW1lIF9BMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I8KGNvbnN0IG1hcDxfSzEsIF9UMSwgX0MxLCBfQTE+JiwKKwkJICBjb25zdCBtYXA8X0sxLCBfVDEsIF9DMSwgX0ExPiYpOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1hcCBlcXVhbGl0eSBjb21wYXJpc29uLgorICAgKiAgQHBhcmFtICBfX3ggIEEgJW1hcC4KKyAgICogIEBwYXJhbSAgX195ICBBICVtYXAgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSB4LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgdGhlIHNpemUgYW5kIGVsZW1lbnRzIG9mIHRoZSBtYXBzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBtYXBzLiAgTWFwcyBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IGlmIHRoZWlyIHNpemVzIGFyZSBlcXVhbCwKKyAgICogIGFuZCBpZiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGNvbXBhcmUgZXF1YWwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX3QgPT0gX195Ll9NX3Q7IH0KKworICAvKioKKyAgICogIEBicmllZiAgTWFwIG9yZGVyaW5nIHJlbGF0aW9uLgorICAgKiAgQHBhcmFtICBfX3ggIEEgJW1hcC4KKyAgICogIEBwYXJhbSAgX195ICBBICVtYXAgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSB4LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgQGEgeCBpcyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4gQGEgeS4KKyAgICoKKyAgICogIFRoaXMgaXMgYSB0b3RhbCBvcmRlcmluZyByZWxhdGlvbi4gIEl0IGlzIGxpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUKKyAgICogIG1hcHMuICBUaGUgZWxlbWVudHMgbXVzdCBiZSBjb21wYXJhYmxlIHdpdGggQGMgPC4KKyAgICoKKyAgICogIFNlZSBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKCkgZm9yIGhvdyB0aGUgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fdCA8IF9feS5fTV90OyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPT0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIC8vLyBTZWUgc3RkOjptYXA6OnN3YXAoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfU1RMX01BUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX211bHRpbWFwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX211bHRpbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5ZWE1NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfbXVsdGltYXAuaApAQCAtMCwwICsxLDkyMyBAQAorLy8gTXVsdGltYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX211bHRpbWFwLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttYXB9CisgKi8KKworI2lmbmRlZiBfU1RMX01VTFRJTUFQX0gKKyNkZWZpbmUgX1NUTF9NVUxUSU1BUF9IIDEKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIG1hZGUgdXAgb2YgKGtleSx2YWx1ZSkgcGFpcnMsIHdoaWNoIGNhbiBiZQorICAgKiAgcmV0cmlldmVkIGJhc2VkIG9uIGEga2V5LCBpbiBsb2dhcml0aG1pYyB0aW1lLgorICAgKgorICAgKiAgQGluZ3JvdXAgYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgQHRwYXJhbSBfS2V5ICBUeXBlIG9mIGtleSBvYmplY3RzLgorICAgKiAgQHRwYXJhbSAgX1RwICBUeXBlIG9mIG1hcHBlZCBvYmplY3RzLgorICAgKiAgQHRwYXJhbSBfQ29tcGFyZSAgQ29tcGFyaXNvbiBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gbGVzczxfS2V5Pi4KKyAgICogIEB0cGFyYW0gX0FsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gCisgICAqICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yPHBhaXI8Y29uc3QgX0tleSwgX1RwPi4KKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjYiPnJldmVyc2libGUgY29udGFpbmVyPC9hPiwgYW5kIGFuCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2OSI+YXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPiAodXNpbmcgZXF1aXZhbGVudAorICAgKiAga2V5cykuICBGb3IgYSBAYyBtdWx0aW1hcDxLZXksVD4gdGhlIGtleV90eXBlIGlzIEtleSwgdGhlIG1hcHBlZF90eXBlCisgICAqICBpcyBULCBhbmQgdGhlIHZhbHVlX3R5cGUgaXMgc3RkOjpwYWlyPGNvbnN0IEtleSxUPi4KKyAgICoKKyAgICogIE11bHRpbWFwcyBzdXBwb3J0IGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzLgorICAgKgorICAgKiAgVGhlIHByaXZhdGUgdHJlZSBkYXRhIGlzIGRlY2xhcmVkIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGZvciBtYXAgYW5kCisgICAqICBtdWx0aW1hcDsgdGhlIGRpc3RpbmN0aW9uIGlzIG1hZGUgZW50aXJlbHkgaW4gaG93IHRoZSB0cmVlIGZ1bmN0aW9ucyBhcmUKKyAgICogIGNhbGxlZCAoKl91bmlxdWUgdmVyc3VzICpfZXF1YWwsIHNhbWUgYXMgdGhlIHN0YW5kYXJkKS4KKyAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICAgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIG11bHRpbWFwCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUgICAgICAgICAgICAgICAgICAgX0FsbG9jX3ZhbHVlX3R5cGU7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1RwLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXM0KF9Db21wYXJlLCBib29sLCBfS2V5LCBfS2V5LAorCQkJCV9CaW5hcnlGdW5jdGlvbkNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMyKHZhbHVlX3R5cGUsIF9BbGxvY192YWx1ZV90eXBlLCBfU2FtZVR5cGVDb25jZXB0KQorCisgICAgcHVibGljOgorICAgICAgY2xhc3MgdmFsdWVfY29tcGFyZQorICAgICAgOiBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248dmFsdWVfdHlwZSwgdmFsdWVfdHlwZSwgYm9vbD4KKyAgICAgIHsKKwlmcmllbmQgY2xhc3MgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPjsKKyAgICAgIHByb3RlY3RlZDoKKwlfQ29tcGFyZSBjb21wOworCisJdmFsdWVfY29tcGFyZShfQ29tcGFyZSBfX2MpCisJOiBjb21wKF9fYykgeyB9CisKKyAgICAgIHB1YmxpYzoKKwlib29sIG9wZXJhdG9yKCkoY29uc3QgdmFsdWVfdHlwZSYgX194LCBjb25zdCB2YWx1ZV90eXBlJiBfX3kpIGNvbnN0CisJeyByZXR1cm4gY29tcChfX3guZmlyc3QsIF9feS5maXJzdCk7IH0KKyAgICAgIH07CisKKyAgICBwcml2YXRlOgorICAgICAgLy8vIFRoaXMgdHVybnMgYSByZWQtYmxhY2sgdHJlZSBpbnRvIGEgW211bHRpXW1hcC4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8dmFsdWVfdHlwZT46Om90aGVyIAorICAgICAgICBfUGFpcl9hbGxvY190eXBlOworCisgICAgICB0eXBlZGVmIF9SYl90cmVlPGtleV90eXBlLCB2YWx1ZV90eXBlLCBfU2VsZWN0MXN0PHZhbHVlX3R5cGU+LAorCQkgICAgICAga2V5X2NvbXBhcmUsIF9QYWlyX2FsbG9jX3R5cGU+IF9SZXBfdHlwZTsKKyAgICAgIC8vLyBUaGUgYWN0dWFsIHRyZWUgc3RydWN0dXJlLgorICAgICAgX1JlcF90eXBlIF9NX3Q7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBtYW55IG9mIHRoZXNlIGFyZSBzcGVjaWZpZWQgZGlmZmVyZW50bHkgaW4gSVNPLCBidXQgdGhlIGZvbGxvd2luZyBhcmUKKyAgICAgIC8vICJmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCIKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXJfYWxsb2NfdHlwZTo6cG9pbnRlciAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9QYWlyX2FsbG9jX3R5cGU6OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUGFpcl9hbGxvY190eXBlOjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUGFpcl9hbGxvY190eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6Oml0ZXJhdG9yICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpzaXplX3R5cGUgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyBbMjMuMy4yXSBjb25zdHJ1Y3QvY29weS9kZXN0cm95CisgICAgICAvLyAoZ2V0X2FsbG9jYXRvcigpIGlzIGFsc28gbGlzdGVkIGluIHRoaXMgc2VjdGlvbikKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICovCisgICAgICBtdWx0aW1hcCgpCisgICAgICA6IF9NX3QoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJW11bHRpbWFwIHdpdGggbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2NvbXAgIEEgY29tcGFyaXNvbiBvYmplY3QuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBtdWx0aW1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01fdChfX2NvbXAsIF9QYWlyX2FsbG9jX3R5cGUoX19hKSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU11bHRpbWFwIGNvcHkgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJW11bHRpbWFwIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVtdWx0aW1hcCB1c2VzIGEgY29weSBvZiB0aGUgYWxsb2NhdGlvbiBvYmplY3QKKyAgICAgICAqICB1c2VkIGJ5IEBhIF9feC4KKyAgICAgICAqLworICAgICAgbXVsdGltYXAoY29uc3QgbXVsdGltYXAmIF9feCkKKyAgICAgIDogX01fdChfX3guX01fdCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVNdWx0aW1hcCBtb3ZlIGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSAgIF9feCAgQSAlbXVsdGltYXAgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJW11bHRpbWFwIGNvbnRhaW5zIHRoZSBleGFjdCBjb250ZW50cyBvZiBAYSBfX3guCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIF9feCBhcmUgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICVtdWx0aW1hcC4KKyAgICAgICAqLworICAgICAgbXVsdGltYXAobXVsdGltYXAmJiBfX3gpCisgICAgICBub2V4Y2VwdChpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxfQ29tcGFyZT46OnZhbHVlKQorICAgICAgOiBfTV90KHN0ZDo6bW92ZShfX3guX01fdCkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVtdWx0aW1hcCBmcm9tIGFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2NvbXAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlbXVsdGltYXAgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAgICAqICB0aGUgaW5pdGlhbGl6ZXJfbGlzdC4gIFRoaXMgaXMgbGluZWFyIGluIE4gaWYgdGhlIGxpc3QgaXMgYWxyZWFkeQorICAgICAgICogIHNvcnRlZCwgYW5kIE5sb2dOIG90aGVyd2lzZSAod2hlcmUgTiBpcyBAYSBfX2wuc2l6ZSgpKS4KKyAgICAgICAqLworICAgICAgbXVsdGltYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01fdChfX2NvbXAsIF9QYWlyX2FsbG9jX3R5cGUoX19hKSkKKyAgICAgIHsgX01fdC5fTV9pbnNlcnRfZXF1YWwoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVtdWx0aW1hcCBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVtdWx0aW1hcCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgZnJvbQorICAgICAgICogIFtfX2ZpcnN0LF9fbGFzdCkuICBUaGlzIGlzIGxpbmVhciBpbiBOIGlmIHRoZSByYW5nZSBpcyBhbHJlYWR5IHNvcnRlZCwKKyAgICAgICAqICBhbmQgTmxvZ04gb3RoZXJ3aXNlICh3aGVyZSBOIGlzIGRpc3RhbmNlKF9fZmlyc3QsX19sYXN0KSkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBtdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisJOiBfTV90KCkKKyAgICAgICAgeyBfTV90Ll9NX2luc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJW11bHRpbWFwIGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fY29tcCAgQSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVtdWx0aW1hcCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgZnJvbQorICAgICAgICogIFtfX2ZpcnN0LF9fbGFzdCkuICBUaGlzIGlzIGxpbmVhciBpbiBOIGlmIHRoZSByYW5nZSBpcyBhbHJlYWR5IHNvcnRlZCwKKyAgICAgICAqICBhbmQgTmxvZ04gb3RoZXJ3aXNlICh3aGVyZSBOIGlzIGRpc3RhbmNlKF9fZmlyc3QsX19sYXN0KSkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBtdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV90KF9fY29tcCwgX1BhaXJfYWxsb2NfdHlwZShfX2EpKQorICAgICAgICB7IF9NX3QuX01faW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLy8gRklYTUUgVGhlcmUgaXMgbm8gZHRvciBkZWNsYXJlZCwgYnV0IHdlIHNob3VsZCBoYXZlIHNvbWV0aGluZyBnZW5lcmF0ZWQKKyAgICAgIC8vIGJ5IERveHlnZW4uICBJIGRvbid0IGtub3cgd2hhdCB0YWdzIHRvIGFkZCB0byB0aGlzIHBhcmFncmFwaCB0byBtYWtlCisgICAgICAvLyB0aGF0IGhhcHBlbjoKKyAgICAgIC8qKgorICAgICAgICogIFRoZSBkdG9yIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIG5vdGUgdGhhdCBpZiB0aGUgZWxlbWVudHMKKyAgICAgICAqICB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueQorICAgICAgICogIHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTXVsdGltYXAgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbXVsdGltYXAgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgQWxsIHRoZSBlbGVtZW50cyBvZiBAYSBfX3ggYXJlIGNvcGllZCwgYnV0IHVubGlrZSB0aGUgY29weQorICAgICAgICogIGNvbnN0cnVjdG9yLCB0aGUgYWxsb2NhdG9yIG9iamVjdCBpcyBub3QgY29waWVkLgorICAgICAgICovCisgICAgICBtdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBtdWx0aW1hcCYgX194KQorICAgICAgeworCV9NX3QgPSBfX3guX01fdDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVNdWx0aW1hcCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJW11bHRpbWFwIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSBfX3ggYXJlIG1vdmVkIGludG8gdGhpcyBtdWx0aW1hcCAod2l0aG91dCBjb3B5aW5nKS4KKyAgICAgICAqICBAYSBfX3ggaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkIG11bHRpbWFwLgorICAgICAgICovCisgICAgICBtdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPShtdWx0aW1hcCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+c3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTXVsdGltYXAgbGlzdCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJW11bHRpbWFwIHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cworICAgICAgICogIGluIHRoZSBpbml0aWFsaXplciBsaXN0IEBhIF9fbC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJW11bHRpbWFwIGFuZAorICAgICAgICogIHRoYXQgdGhlIHJlc3VsdGluZyAlbXVsdGltYXAncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICBtdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8vIEdldCBhIGNvcHkgb2YgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG9iamVjdC4KKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQgCisgICAgICB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfTV90LmdldF9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgLy8gaXRlcmF0b3JzCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgcGFpciBpbiB0aGUKKyAgICAgICAqICAlbXVsdGltYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICogIGtleXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBwYWlyCisgICAgICAgKiAgaW4gdGhlICVtdWx0aW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8KKyAgICAgICAqICB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBwYWlyIGluCisgICAgICAgKiAgdGhlICVtdWx0aW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgKiAga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogIHBhaXIgaW4gdGhlICVtdWx0aW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcKKyAgICAgICAqICB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGxhc3QgcGFpciBpbgorICAgICAgICogIHRoZSAlbXVsdGltYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAqICBrZXlzLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBsYXN0IHBhaXIgaW4gdGhlICVtdWx0aW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gb25lIGJlZm9yZSB0aGUKKyAgICAgICAqICBmaXJzdCBwYWlyIGluIHRoZSAlbXVsdGltYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIG9uZQorICAgICAgICogIGJlZm9yZSB0aGUgZmlyc3QgcGFpciBpbiB0aGUgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICBkZXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LnJlbmQoKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBwYWlyCisgICAgICAgKiAgaW4gdGhlICVtdWx0aW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8KKyAgICAgICAqICB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgcGFpciBpbiB0aGUgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZworICAgICAgICogIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV90LmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgcGFpciBpbiB0aGUgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIG9uZQorICAgICAgICogIGJlZm9yZSB0aGUgZmlyc3QgcGFpciBpbiB0aGUgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICBkZXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKyNlbmRpZgorCisgICAgICAvLyBjYXBhY2l0eQorICAgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgJW11bHRpbWFwIGlzIGVtcHR5LiAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsgfQorCisgICAgICAvKiogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgJW11bHRpbWFwLiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LnNpemUoKTsgfQorCisgICAgICAvKiogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSAlbXVsdGltYXAuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90Lm1heF9zaXplKCk7IH0KKworICAgICAgLy8gbW9kaWZpZXJzCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEJ1aWxkIGFuZCBpbnNlcnQgYSBzdGQ6OnBhaXIgaW50byB0aGUgJW11bHRpbWFwLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19hcmdzICBBcmd1bWVudHMgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBwYWlyIGluc3RhbmNlIChzZWUKKyAgICAgICAqCSAgICAgICAgc3RkOjpwaWVjZXdpc2VfY29udHJ1Y3QgZm9yIHBhc3NpbmcgYXJndW1lbnRzIHRvIGVhY2gKKyAgICAgICAqCSAgICAgICAgcGFydCBvZiB0aGUgcGFpciBjb25zdHJ1Y3RvcikuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIChrZXksdmFsdWUpIHBhaXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYnVpbGRzIGFuZCBpbnNlcnRzIGEgKGtleSwgdmFsdWUpICVwYWlyIGludG8gdGhlCisgICAgICAgKiAgJW11bHRpbWFwLgorICAgICAgICogIENvbnRyYXJ5IHRvIGEgc3RkOjptYXAgdGhlICVtdWx0aW1hcCBkb2VzIG5vdCByZWx5IG9uIHVuaXF1ZSBrZXlzIGFuZAorICAgICAgICogIHRodXMgbXVsdGlwbGUgcGFpcnMgd2l0aCB0aGUgc2FtZSBrZXkgY2FuIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsgcmV0dXJuIF9NX3QuX01fZW1wbGFjZV9lcXVhbChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBCdWlsZHMgYW5kIGluc2VydHMgYSBzdGQ6OnBhaXIgaW50byB0aGUgJW11bHRpbWFwLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBBbiBpdGVyYXRvciB0aGF0IHNlcnZlcyBhcyBhIGhpbnQgYXMgdG8gd2hlcmUgdGhlIHBhaXIKKyAgICAgICAqICAgICAgICAgICAgICAgIHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fYXJncyAgQXJndW1lbnRzIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgcGFpciBpbnN0YW5jZSAoc2VlCisgICAgICAgKgkgICAgICAgICBzdGQ6OnBpZWNld2lzZV9jb250cnVjdCBmb3IgcGFzc2luZyBhcmd1bWVudHMgdG8gZWFjaAorICAgICAgICoJICAgICAgICAgcGFydCBvZiB0aGUgcGFpciBjb25zdHJ1Y3RvcikuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgKGtleSx2YWx1ZSkgcGFpci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpbnNlcnRzIGEgKGtleSwgdmFsdWUpIHBhaXIgaW50byB0aGUgJW11bHRpbWFwLgorICAgICAgICogIENvbnRyYXJ5IHRvIGEgc3RkOjptYXAgdGhlICVtdWx0aW1hcCBkb2VzIG5vdCByZWx5IG9uIHVuaXF1ZSBrZXlzIGFuZAorICAgICAgICogIHRodXMgbXVsdGlwbGUgcGFpcnMgd2l0aCB0aGUgc2FtZSBrZXkgY2FuIGJlIGluc2VydGVkLgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4gcG90ZW50aWFsbHkKKyAgICAgICAqICBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuICBBIGJhZCBoaW50IHdvdWxkCisgICAgICAgKiAgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIG1vcmUgb24gQGEgaGludGluZywgc2VlOgorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDdjaDE3Lmh0bWwKKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUgKGlmIHRoZSBoaW50IGlzIG5vdCB0YWtlbikuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICByZXR1cm4gX01fdC5fTV9lbXBsYWNlX2hpbnRfZXF1YWwoX19wb3MsCisJCQkJCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSW5zZXJ0cyBhIHN0ZDo6cGFpciBpbnRvIHRoZSAlbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIFBhaXIgdG8gYmUgaW5zZXJ0ZWQgKHNlZSBzdGQ6Om1ha2VfcGFpciBmb3IgZWFzeSBjcmVhdGlvbgorICAgICAgICogICAgICAgICAgICAgb2YgcGFpcnMpLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIChrZXksdmFsdWUpIHBhaXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBhIChrZXksIHZhbHVlKSBwYWlyIGludG8gdGhlICVtdWx0aW1hcC4KKyAgICAgICAqICBDb250cmFyeSB0byBhIHN0ZDo6bWFwIHRoZSAlbXVsdGltYXAgZG9lcyBub3QgcmVseSBvbiB1bmlxdWUga2V5cyBhbmQKKyAgICAgICAqICB0aHVzIG11bHRpcGxlIHBhaXJzIHdpdGggdGhlIHNhbWUga2V5IGNhbiBiZSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfZXF1YWwoX194KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0KF9QYWlyJiYgX194KQorICAgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF9lcXVhbChzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEluc2VydHMgYSBzdGQ6OnBhaXIgaW50byB0aGUgJW11bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgcGFpciBzaG91bGQgYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIFBhaXIgdG8gYmUgaW5zZXJ0ZWQgKHNlZSBzdGQ6Om1ha2VfcGFpciBmb3IgZWFzeSBjcmVhdGlvbgorICAgICAgICogICAgICAgICAgICAgICBvZiBwYWlycykuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgKGtleSx2YWx1ZSkgcGFpci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpbnNlcnRzIGEgKGtleSwgdmFsdWUpIHBhaXIgaW50byB0aGUgJW11bHRpbWFwLgorICAgICAgICogIENvbnRyYXJ5IHRvIGEgc3RkOjptYXAgdGhlICVtdWx0aW1hcCBkb2VzIG5vdCByZWx5IG9uIHVuaXF1ZSBrZXlzIGFuZAorICAgICAgICogIHRodXMgbXVsdGlwbGUgcGFpcnMgd2l0aCB0aGUgc2FtZSBrZXkgY2FuIGJlIGluc2VydGVkLgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4gcG90ZW50aWFsbHkKKyAgICAgICAqICBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuICBBIGJhZCBoaW50IHdvdWxkCisgICAgICAgKiAgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIG1vcmUgb24gQGEgaGludGluZywgc2VlOgorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDdjaDE3Lmh0bWwKKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUgKGlmIHRoZSBoaW50IGlzIG5vdCB0YWtlbikuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbHNlCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2VuZGlmCisgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF9lcXVhbF8oX19wb3NpdGlvbiwgX194KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIF9QYWlyJiYgX194KQorICAgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF9lcXVhbF8oX19wb3NpdGlvbiwKKwkJCQkgICAgICAgc3RkOjpmb3J3YXJkPF9QYWlyPihfX3gpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgYXR0ZW1wdHMgdG8gaW5zZXJ0IGEgcmFuZ2UKKyAgICAgICAqICBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZS4KKyAgICAgICAqCisgICAgICAgKiAgQ29tcGxleGl0eSBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIHJhbmdlIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IF9NX3QuX01faW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBpbnNlcnQgYSBsaXN0IG9mIHN0ZDo6cGFpcnMgaW50byB0aGUgJW11bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgX19sICBBIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBvZiBwYWlycyB0byBiZQorICAgICAgICogICAgICAgICAgICAgICBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgQ29tcGxleGl0eSBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIHJhbmdlIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IHRoaXMtPmluc2VydChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGFuIGVsZW1lbnQgZnJvbSBhICVtdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZworICAgICAgICogICAgICAgICAgQGEgcG9zaXRpb24gcHJpb3IgdG8gdGhlIGVsZW1lbnQgYmVpbmcgZXJhc2VkLiBJZiBubyBzdWNoIAorICAgICAgICogICAgICAgICAgZWxlbWVudCBleGlzdHMsIGVuZCgpIGlzIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbiBlbGVtZW50LCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpdGVyYXRvciwKKyAgICAgICAqICBmcm9tIGEgJW11bHRpbWFwLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsCisgICAgICAgKiAgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzCisgICAgICAgKiAgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CisKKyAgICAgIC8vIExXRyAyMDU5LgorICAgICAgX0dMSUJDWFhfQUJJX1RBR19DWFgxMQorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CisjZWxzZQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhbiBlbGVtZW50IGZyb20gYSAlbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFuIGVsZW1lbnQsIHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIGl0ZXJhdG9yLAorICAgICAgICogIGZyb20gYSAlbXVsdGltYXAuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwKKyAgICAgICAqICBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMKKyAgICAgICAqICBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyBfTV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBlbGVtZW50cyBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbGwgZWxlbWVudHMgbG9jYXRlZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20gYQorICAgICAgICogICVtdWx0aW1hcC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX3gpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGEgW2ZpcnN0LGxhc3QpIHJhbmdlIG9mIGVsZW1lbnRzIGZyb20gYSAlbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBlcmFzZWQuCisgICAgICAgKiAgQHBhcmFtIF9fbGFzdCBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgZXJhc2VkIC4KKyAgICAgICAqICBAcmV0dXJuIFRoZSBpdGVyYXRvciBAYSBfX2xhc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZnJvbSBhICVtdWx0aW1hcC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90CisgICAgICAgKiAgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZWxzZQorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMTMwLiBBc3NvY2lhdGl2ZSBlcmFzZSBzaG91bGQgcmV0dXJuIGFuIGl0ZXJhdG9yLgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhIFtmaXJzdCxsYXN0KSByYW5nZSBvZiBlbGVtZW50cyBmcm9tIGEgJW11bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gX19sYXN0IEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvCisgICAgICAgKiAgICAgICAgICAgICAgICBiZSBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZnJvbSBhICVtdWx0aW1hcC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90CisgICAgICAgKiAgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3dhcHMgZGF0YSB3aXRoIGFub3RoZXIgJW11bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVtdWx0aW1hcCBvZiB0aGUgc2FtZSBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZXhjaGFuZ2VzIHRoZSBlbGVtZW50cyBiZXR3ZWVuIHR3byBtdWx0aW1hcHMgaW4gY29uc3RhbnQgdGltZS4KKyAgICAgICAqICAoSXQgaXMgb25seSBzd2FwcGluZyBhIHBvaW50ZXIsIGFuIGludGVnZXIsIGFuZCBhbiBpbnN0YW5jZSBvZgorICAgICAgICogIHRoZSBAYyBDb21wYXJlIHR5cGUgKHdoaWNoIGl0c2VsZiBpcyBvZnRlbiBzdGF0ZWxlc3MgYW5kIGVtcHR5KSwgc28gaXQKKyAgICAgICAqICBzaG91bGQgYmUgcXVpdGUgZmFzdC4pCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBnbG9iYWwgc3RkOjpzd2FwKCkgZnVuY3Rpb24gaXMgc3BlY2lhbGl6ZWQgc3VjaCB0aGF0CisgICAgICAgKiAgc3RkOjpzd2FwKG0xLG0yKSB3aWxsIGZlZWQgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3dhcChtdWx0aW1hcCYgX194KQorICAgICAgeyBfTV90LnN3YXAoX194Ll9NX3QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEVyYXNlcyBhbGwgZWxlbWVudHMgaW4gYSAlbXVsdGltYXAuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5CisgICAgICAgKiAgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLAorICAgICAgICogIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIKKyAgICAgICAqICBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX3QuY2xlYXIoKTsgfQorCisgICAgICAvLyBvYnNlcnZlcnMKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdGhlIGtleSBjb21wYXJpc29uIG9iamVjdCBvdXQgb2Ygd2hpY2ggdGhlICVtdWx0aW1hcAorICAgICAgICogIHdhcyBjb25zdHJ1Y3RlZC4KKyAgICAgICAqLworICAgICAga2V5X2NvbXBhcmUKKyAgICAgIGtleV9jb21wKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgdmFsdWUgY29tcGFyaXNvbiBvYmplY3QsIGJ1aWx0IGZyb20gdGhlIGtleSBjb21wYXJpc29uCisgICAgICAgKiAgb2JqZWN0IG91dCBvZiB3aGljaCB0aGUgJW11bHRpbWFwIHdhcyBjb25zdHJ1Y3RlZC4KKyAgICAgICAqLworICAgICAgdmFsdWVfY29tcGFyZQorICAgICAgdmFsdWVfY29tcCgpIGNvbnN0CisgICAgICB7IHJldHVybiB2YWx1ZV9jb21wYXJlKF9NX3Qua2V5X2NvbXAoKSk7IH0KKworICAgICAgLy8gbXVsdGltYXAgb3BlcmF0aW9ucworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRyaWVzIHRvIGxvY2F0ZSBhbiBlbGVtZW50IGluIGEgJW11bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyB0byBzb3VnaHQtYWZ0ZXIgZWxlbWVudCwKKyAgICAgICAqICAgICAgICAgICBvciBlbmQoKSBpZiBub3QgZm91bmQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBrZXkgYW5kIHRyaWVzIHRvIGxvY2F0ZSB0aGUgZWxlbWVudCB3aXRoIHdoaWNoCisgICAgICAgKiAgdGhlIGtleSBtYXRjaGVzLiAgSWYgc3VjY2Vzc2Z1bCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpdGVyYXRvcgorICAgICAgICogIHBvaW50aW5nIHRvIHRoZSBzb3VnaHQgYWZ0ZXIgJXBhaXIuICBJZiB1bnN1Y2Nlc3NmdWwgaXQgcmV0dXJucyB0aGUKKyAgICAgICAqICBwYXN0LXRoZS1lbmQgKCBAYyBlbmQoKSApIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRyaWVzIHRvIGxvY2F0ZSBhbiBlbGVtZW50IGluIGEgJW11bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciBwb2ludGluZyB0byBzb3VnaHQtYWZ0ZXIKKyAgICAgICAqICAgICAgICAgICBlbGVtZW50LCBvciBlbmQoKSBpZiBub3QgZm91bmQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBrZXkgYW5kIHRyaWVzIHRvIGxvY2F0ZSB0aGUgZWxlbWVudCB3aXRoIHdoaWNoCisgICAgICAgKiAgdGhlIGtleSBtYXRjaGVzLiAgSWYgc3VjY2Vzc2Z1bCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGNvbnN0YW50CisgICAgICAgKiAgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHNvdWdodCBhZnRlciAlcGFpci4gIElmIHVuc3VjY2Vzc2Z1bCBpdAorICAgICAgICogIHJldHVybnMgdGhlIHBhc3QtdGhlLWVuZCAoIEBjIGVuZCgpICkgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlycyB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggc3BlY2lmaWVkIGtleS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5jb3VudChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyB0byBmaXJzdCBlbGVtZW50IGVxdWFsIHRvIG9yIGdyZWF0ZXIKKyAgICAgICAqICAgICAgICAgICB0aGFuIGtleSwgb3IgZW5kKCkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIHN1YnNlcXVlbmNlIG9mIGVsZW1lbnRzCisgICAgICAgKiAgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBrZXkuICBJZiB1bnN1Y2Nlc3NmdWwgaXQgcmV0dXJucyBhbiBpdGVyYXRvcgorICAgICAgICogIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaGFzIGEgZ3JlYXRlciB2YWx1ZSB0aGFuIGdpdmVuIGtleQorICAgICAgICogIG9yIGVuZCgpIGlmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciBwb2ludGluZyB0byBmaXJzdCBlbGVtZW50CisgICAgICAgKiAgICAgICAgICAgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIGtleSwgb3IgZW5kKCkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIHN1YnNlcXVlbmNlIG9mCisgICAgICAgKiAgZWxlbWVudHMgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBrZXkuICBJZiB1bnN1Y2Nlc3NmdWwgdGhlCisgICAgICAgKiAgaXRlcmF0b3Igd2lsbCBwb2ludCB0byB0aGUgbmV4dCBncmVhdGVzdCBlbGVtZW50IG9yLCBpZiBubworICAgICAgICogIHN1Y2ggZ3JlYXRlciBlbGVtZW50IGV4aXN0cywgdG8gZW5kKCkuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgZW5kIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50CisgICAgICAgKiAgICAgICAgICBncmVhdGVyIHRoYW4ga2V5LCBvciBlbmQoKS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBlbmQgb2YgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiAoa2V5LCB2YWx1ZSkgcGFpciB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHBvaW50aW5nIHRvIGZpcnN0IGl0ZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgZ3JlYXRlciB0aGFuIGtleSwgb3IgZW5kKCkuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlycyB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIFBhaXIgb2YgaXRlcmF0b3JzIHRoYXQgcG9zc2libHkgcG9pbnRzIHRvIHRoZSBzdWJzZXF1ZW5jZQorICAgICAgICogICAgICAgICAgIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvCisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICAgIHN0ZDo6bWFrZV9wYWlyKGMubG93ZXJfYm91bmQodmFsKSwKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGMudXBwZXJfYm91bmQodmFsKSkKKyAgICAgICAqICBAZW5kY29kZQorICAgICAgICogIChidXQgaXMgZmFzdGVyIHRoYW4gbWFraW5nIHRoZSBjYWxscyBzZXBhcmF0ZWx5KS4KKyAgICAgICAqLworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXJzIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgUGFpciBvZiByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvcnMgdGhhdCBwb3NzaWJseSBwb2ludHMKKyAgICAgICAqICAgICAgICAgICB0byB0aGUgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgICAqICBAY29kZQorICAgICAgICogICAgc3RkOjptYWtlX3BhaXIoYy5sb3dlcl9ib3VuZCh2YWwpLAorICAgICAgICogICAgICAgICAgICAgICAgICAgYy51cHBlcl9ib3VuZCh2YWwpKQorICAgICAgICogIEBlbmRjb2RlCisgICAgICAgKiAgKGJ1dCBpcyBmYXN0ZXIgdGhhbiBtYWtpbmcgdGhlIGNhbGxzIHNlcGFyYXRlbHkpLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSzEsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX0MxLCB0eXBlbmFtZSBfQTE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgbXVsdGltYXA8X0sxLCBfVDEsIF9DMSwgX0ExPiYsCisJCSAgIGNvbnN0IG11bHRpbWFwPF9LMSwgX1QxLCBfQzEsIF9BMT4mKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0sxLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9DMSwgdHlwZW5hbWUgX0ExPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcjwoY29uc3QgbXVsdGltYXA8X0sxLCBfVDEsIF9DMSwgX0ExPiYsCisJCSAgY29uc3QgbXVsdGltYXA8X0sxLCBfVDEsIF9DMSwgX0ExPiYpOworICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBNdWx0aW1hcCBlcXVhbGl0eSBjb21wYXJpc29uLgorICAgKiAgQHBhcmFtICBfX3ggIEEgJW11bHRpbWFwLgorICAgKiAgQHBhcmFtICBfX3kgIEEgJW11bHRpbWFwIG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgX194LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgdGhlIHNpemUgYW5kIGVsZW1lbnRzIG9mIHRoZSBtYXBzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBtdWx0aW1hcHMuICBNdWx0aW1hcHMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiB0aGVpciBzaXplcyBhcmUgZXF1YWwsCisgICAqICBhbmQgaWYgY29ycmVzcG9uZGluZyBlbGVtZW50cyBjb21wYXJlIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fdCA9PSBfX3kuX01fdDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBNdWx0aW1hcCBvcmRlcmluZyByZWxhdGlvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICVtdWx0aW1hcC4KKyAgICogIEBwYXJhbSAgX195ICBBICVtdWx0aW1hcCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIF9feC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIEBhIHggaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuIEBhIHkuCisgICAqCisgICAqICBUaGlzIGlzIGEgdG90YWwgb3JkZXJpbmcgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBtdWx0aW1hcHMuICBUaGUgZWxlbWVudHMgbXVzdCBiZSBjb21wYXJhYmxlIHdpdGggQGMgPC4KKyAgICoKKyAgICogIFNlZSBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKCkgZm9yIGhvdyB0aGUgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX3QgPCBfX3kuX01fdDsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcj09CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgLy8vIFNlZSBzdGQ6Om11bHRpbWFwOjpzd2FwKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfU1RMX01VTFRJTUFQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfbXVsdGlzZXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfbXVsdGlzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2ViMDJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9tdWx0aXNldC5oCkBAIC0wLDAgKzEsNzk4IEBACisvLyBNdWx0aXNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX211bHRpc2V0LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtzZXR9CisgKi8KKworI2lmbmRlZiBfU1RMX01VTFRJU0VUX0gKKyNkZWZpbmUgX1NUTF9NVUxUSVNFVF9IIDEKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIG1hZGUgdXAgb2YgZWxlbWVudHMsIHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQKKyAgICogIGluIGxvZ2FyaXRobWljIHRpbWUuCisgICAqCisgICAqICBAaW5ncm91cCBhc3NvY2lhdGl2ZV9jb250YWluZXJzCisgICAqCisgICAqCisgICAqICBAdHBhcmFtIF9LZXkgIFR5cGUgb2Yga2V5IG9iamVjdHMuCisgICAqICBAdHBhcmFtIF9Db21wYXJlICBDb21wYXJpc29uIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBsZXNzPF9LZXk+LgorICAgKiAgQHRwYXJhbSBfQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8X0tleT4uCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY2Ij5yZXZlcnNpYmxlIGNvbnRhaW5lcjwvYT4sIGFuZCBhbgorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjkiPmFzc29jaWF0aXZlIGNvbnRhaW5lcjwvYT4gKHVzaW5nIGVxdWl2YWxlbnQKKyAgICogIGtleXMpLiAgRm9yIGEgQGMgbXVsdGlzZXQ8S2V5PiB0aGUga2V5X3R5cGUgYW5kIHZhbHVlX3R5cGUgYXJlIEtleS4KKyAgICoKKyAgICogIE11bHRpc2V0cyBzdXBwb3J0IGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzLgorICAgKgorICAgKiAgVGhlIHByaXZhdGUgdHJlZSBkYXRhIGlzIGRlY2xhcmVkIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGZvciBzZXQgYW5kCisgICAqICBtdWx0aXNldDsgdGhlIGRpc3RpbmN0aW9uIGlzIG1hZGUgZW50aXJlbHkgaW4gaG93IHRoZSB0cmVlIGZ1bmN0aW9ucyBhcmUKKyAgICogIGNhbGxlZCAoKl91bmlxdWUgdmVyc3VzICpfZXF1YWwsIHNhbWUgYXMgdGhlIHN0YW5kYXJkKS4KKyAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXk+LAorCSAgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfS2V5PiA+CisgICAgY2xhc3MgbXVsdGlzZXQKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUgICAgICAgICAgICAgICAgICAgX0FsbG9jX3ZhbHVlX3R5cGU7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX0tleSwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzNChfQ29tcGFyZSwgYm9vbCwgX0tleSwgX0tleSwKKwkJCQlfQmluYXJ5RnVuY3Rpb25Db25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMihfS2V5LCBfQWxsb2NfdmFsdWVfdHlwZSwgX1NhbWVUeXBlQ29uY2VwdCkJCisKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlZGVmczoKKyAgICAgIHR5cGVkZWYgX0tleSAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9LZXkgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlIGtleV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZSB2YWx1ZV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2MgICBhbGxvY2F0b3JfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICAvLy8gVGhpcyB0dXJucyBhIHJlZC1ibGFjayB0cmVlIGludG8gYSBbbXVsdGldc2V0LgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfS2V5Pjo6b3RoZXIgX0tleV9hbGxvY190eXBlOworCisgICAgICB0eXBlZGVmIF9SYl90cmVlPGtleV90eXBlLCB2YWx1ZV90eXBlLCBfSWRlbnRpdHk8dmFsdWVfdHlwZT4sCisJCSAgICAgICBrZXlfY29tcGFyZSwgX0tleV9hbGxvY190eXBlPiBfUmVwX3R5cGU7CisgICAgICAvLy8gVGhlIGFjdHVhbCB0cmVlIHN0cnVjdHVyZS4KKyAgICAgIF9SZXBfdHlwZSBfTV90OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfS2V5X2FsbG9jX3R5cGU6OnBvaW50ZXIgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0tleV9hbGxvY190eXBlOjpjb25zdF9wb2ludGVyICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9LZXlfYWxsb2NfdHlwZTo6cmVmZXJlbmNlICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9LZXlfYWxsb2NfdHlwZTo6Y29uc3RfcmVmZXJlbmNlICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMDMuIHNldDo6aXRlcmF0b3IgaXMgcmVxdWlyZWQgdG8gYmUgbW9kaWZpYWJsZSwKKyAgICAgIC8vIGJ1dCB0aGlzIGFsbG93cyBtb2RpZmljYXRpb24gb2Yga2V5cy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpzaXplX3R5cGUgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgLy8gYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICovCisgICAgICBtdWx0aXNldCgpCisgICAgICA6IF9NX3QoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJW11bHRpc2V0IHdpdGggbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2NvbXAgIENvbXBhcmF0b3IgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbXVsdGlzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX3QoX19jb21wLCBfS2V5X2FsbG9jX3R5cGUoX19hKSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJW11bHRpc2V0IGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGEgJW11bHRpc2V0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgW2ZpcnN0LGxhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiBpZiB0aGUgcmFuZ2UgaXMgYWxyZWFkeSBzb3J0ZWQsCisgICAgICAgKiAgYW5kIE5sb2dOIG90aGVyd2lzZSAod2hlcmUgTiBpcyBkaXN0YW5jZShfX2ZpcnN0LF9fbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorCTogX01fdCgpCisgICAgICAgIHsgX01fdC5fTV9pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVtdWx0aXNldCBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2NvbXAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlbXVsdGlzZXQgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAgICAqICBbX19maXJzdCxfX2xhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiBpZiB0aGUgcmFuZ2UgaXMgYWxyZWFkeSBzb3J0ZWQsCisgICAgICAgKiAgYW5kIE5sb2dOIG90aGVyd2lzZSAod2hlcmUgTiBpcyBkaXN0YW5jZShfX2ZpcnN0LF9fbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01fdChfX2NvbXAsIF9LZXlfYWxsb2NfdHlwZShfX2EpKQorICAgICAgICB7IF9NX3QuX01faW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTXVsdGlzZXQgY29weSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbXVsdGlzZXQgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJW11bHRpc2V0IHVzZXMgYSBjb3B5IG9mIHRoZSBhbGxvY2F0aW9uIG9iamVjdCB1c2VkCisgICAgICAgKiAgYnkgQGEgX194LgorICAgICAgICovCisgICAgICBtdWx0aXNldChjb25zdCBtdWx0aXNldCYgX194KQorICAgICAgOiBfTV90KF9feC5fTV90KSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTXVsdGlzZXQgbW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbXVsdGlzZXQgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJW11bHRpc2V0IGNvbnRhaW5zIHRoZSBleGFjdCBjb250ZW50cyBvZiBAYSBfX3guCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIF9feCBhcmUgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICVtdWx0aXNldC4KKyAgICAgICAqLworICAgICAgbXVsdGlzZXQobXVsdGlzZXQmJiBfX3gpCisgICAgICBub2V4Y2VwdChpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxfQ29tcGFyZT46OnZhbHVlKQorICAgICAgOiBfTV90KHN0ZDo6bW92ZShfX3guX01fdCkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVtdWx0aXNldCBmcm9tIGFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2NvbXAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlbXVsdGlzZXQgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAgICAqICB0aGUgbGlzdC4gIFRoaXMgaXMgbGluZWFyIGluIE4gaWYgdGhlIGxpc3QgaXMgYWxyZWFkeSBzb3J0ZWQsCisgICAgICAgKiAgYW5kIE5sb2dOIG90aGVyd2lzZSAod2hlcmUgTiBpcyBAYSBfX2wuc2l6ZSgpKS4KKyAgICAgICAqLworICAgICAgbXVsdGlzZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01fdChfX2NvbXAsIF9LZXlfYWxsb2NfdHlwZShfX2EpKQorICAgICAgeyBfTV90Ll9NX2luc2VydF9lcXVhbChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU11bHRpc2V0IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJW11bHRpc2V0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgZWxlbWVudHMgb2YgQGEgX194IGFyZSBjb3BpZWQsIGJ1dCB1bmxpa2UgdGhlIGNvcHkKKyAgICAgICAqICBjb25zdHJ1Y3RvciwgdGhlIGFsbG9jYXRvciBvYmplY3QgaXMgbm90IGNvcGllZC4KKyAgICAgICAqLworICAgICAgbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbXVsdGlzZXQmIF9feCkKKyAgICAgIHsKKwlfTV90ID0gX194Ll9NX3Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTXVsdGlzZXQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVtdWx0aXNldCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgX194IGFyZSBtb3ZlZCBpbnRvIHRoaXMgJW11bHRpc2V0CisgICAgICAgKiAgKHdpdGhvdXQgY29weWluZykuICBAYSBfX3ggaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkCisgICAgICAgKiAgJW11bHRpc2V0LgorICAgICAgICovCisgICAgICBtdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShtdWx0aXNldCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+c3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTXVsdGlzZXQgbGlzdCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJW11bHRpc2V0IHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplciBsaXN0IEBhIF9fbC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJW11bHRpc2V0IGFuZAorICAgICAgICogIHRoYXQgdGhlIHJlc3VsdGluZyAlbXVsdGlzZXQncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICBtdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gYWNjZXNzb3JzOgorCisgICAgICAvLy8gIFJldHVybnMgdGhlIGNvbXBhcmlzb24gb2JqZWN0LgorICAgICAga2V5X2NvbXBhcmUKKyAgICAgIGtleV9jb21wKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorICAgICAgLy8vICBSZXR1cm5zIHRoZSBjb21wYXJpc29uIG9iamVjdC4KKyAgICAgIHZhbHVlX2NvbXBhcmUKKyAgICAgIHZhbHVlX2NvbXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9CisgICAgICAvLy8gIFJldHVybnMgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG9iamVjdC4KKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX3QuZ2V0X2FsbG9jYXRvcigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJW11bHRpc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVtdWx0aXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgZWxlbWVudCBpbiB0aGUgJW11bHRpc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlCisgICAgICAgKiAgbGFzdCBlbGVtZW50IGluIHRoZSAlbXVsdGlzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJW11bHRpc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlbXVsdGlzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlCisgICAgICAgKiAgbGFzdCBlbGVtZW50IGluIHRoZSAlbXVsdGlzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlCisgICAgICAgKiAgbGFzdCBlbGVtZW50IGluIHRoZSAlbXVsdGlzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV90LnJlbmQoKTsgfQorI2VuZGlmCisKKyAgICAgIC8vLyAgUmV0dXJucyB0cnVlIGlmIHRoZSAlc2V0IGlzIGVtcHR5LgorICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5lbXB0eSgpOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgJXNldC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LnNpemUoKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgJXNldC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3dhcHMgZGF0YSB3aXRoIGFub3RoZXIgJW11bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVtdWx0aXNldCBvZiB0aGUgc2FtZSBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZXhjaGFuZ2VzIHRoZSBlbGVtZW50cyBiZXR3ZWVuIHR3byBtdWx0aXNldHMgaW4gY29uc3RhbnQgdGltZS4KKyAgICAgICAqICAoSXQgaXMgb25seSBzd2FwcGluZyBhIHBvaW50ZXIsIGFuIGludGVnZXIsIGFuZCBhbiBpbnN0YW5jZSBvZiB0aGUgQGMKKyAgICAgICAqICBDb21wYXJlIHR5cGUgKHdoaWNoIGl0c2VsZiBpcyBvZnRlbiBzdGF0ZWxlc3MgYW5kIGVtcHR5KSwgc28gaXQgc2hvdWxkCisgICAgICAgKiAgYmUgcXVpdGUgZmFzdC4pCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBnbG9iYWwgc3RkOjpzd2FwKCkgZnVuY3Rpb24gaXMgc3BlY2lhbGl6ZWQgc3VjaCB0aGF0CisgICAgICAgKiAgc3RkOjpzd2FwKHMxLHMyKSB3aWxsIGZlZWQgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3dhcChtdWx0aXNldCYgX194KQorICAgICAgeyBfTV90LnN3YXAoX194Ll9NX3QpOyB9CisKKyAgICAgIC8vIGluc2VydC9lcmFzZQorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBCdWlsZHMgYW5kIGluc2VydHMgYW4gZWxlbWVudCBpbnRvIHRoZSAlbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX2FyZ3MgIEFyZ3VtZW50cyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBlbGVtZW50IGluc3RhbmNlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpbnNlcnRzIGFuIGVsZW1lbnQgaW50byB0aGUgJW11bHRpc2V0LiAgQ29udHJhcnkKKyAgICAgICAqICB0byBhIHN0ZDo6c2V0IHRoZSAlbXVsdGlzZXQgZG9lcyBub3QgcmVseSBvbiB1bmlxdWUga2V5cyBhbmQgdGh1cworICAgICAgICogIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSBlbGVtZW50IGNhbiBiZSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7IHJldHVybiBfTV90Ll9NX2VtcGxhY2VfZXF1YWwoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQnVpbGRzIGFuZCBpbnNlcnRzIGFuIGVsZW1lbnQgaW50byB0aGUgJW11bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUKKyAgICAgICAqICAgICAgICAgICAgICAgIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX19hcmdzICBBcmd1bWVudHMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZWxlbWVudCBpbnN0YW5jZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBhbiBlbGVtZW50IGludG8gdGhlICVtdWx0aXNldC4gIENvbnRyYXJ5CisgICAgICAgKiAgdG8gYSBzdGQ6OnNldCB0aGUgJW11bHRpc2V0IGRvZXMgbm90IHJlbHkgb24gdW5pcXVlIGtleXMgYW5kIHRodXMKKyAgICAgICAqICBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgZWxlbWVudCBjYW4gYmUgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4gcG90ZW50aWFsbHkKKyAgICAgICAqICBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuICBBIGJhZCBoaW50IHdvdWxkCisgICAgICAgKiAgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgU2VlIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDdjaDE3Lmh0bWwKKyAgICAgICAqICBmb3IgbW9yZSBvbiBAYSBoaW50aW5nLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZSAoaWYgdGhlIGhpbnQgaXMgbm90IHRha2VuKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHJldHVybiBfTV90Ll9NX2VtcGxhY2VfaGludF9lcXVhbChfX3BvcywKKwkJCQkJICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJbnNlcnRzIGFuIGVsZW1lbnQgaW50byB0aGUgJW11bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX194ICBFbGVtZW50IHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBhbiBlbGVtZW50IGludG8gdGhlICVtdWx0aXNldC4gIENvbnRyYXJ5CisgICAgICAgKiAgdG8gYSBzdGQ6OnNldCB0aGUgJW11bHRpc2V0IGRvZXMgbm90IHJlbHkgb24gdW5pcXVlIGtleXMgYW5kIHRodXMKKyAgICAgICAqICBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgZWxlbWVudCBjYW4gYmUgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBsb2dhcml0aG1pYyB0aW1lLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X2VxdWFsKF9feCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X2VxdWFsKHN0ZDo6bW92ZShfX3gpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJbnNlcnRzIGFuIGVsZW1lbnQgaW50byB0aGUgJW11bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZQorICAgICAgICogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX194ICBFbGVtZW50IHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBhbiBlbGVtZW50IGludG8gdGhlICVtdWx0aXNldC4gIENvbnRyYXJ5CisgICAgICAgKiAgdG8gYSBzdGQ6OnNldCB0aGUgJW11bHRpc2V0IGRvZXMgbm90IHJlbHkgb24gdW5pcXVlIGtleXMgYW5kIHRodXMKKyAgICAgICAqICBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgZWxlbWVudCBjYW4gYmUgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4gcG90ZW50aWFsbHkKKyAgICAgICAqICBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuICBBIGJhZCBoaW50IHdvdWxkCisgICAgICAgKiAgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgU2VlIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDdjaDE3Lmh0bWwKKyAgICAgICAqICBmb3IgbW9yZSBvbiBAYSBoaW50aW5nLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZSAoaWYgdGhlIGhpbnQgaXMgbm90IHRha2VuKS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF9lcXVhbF8oX19wb3NpdGlvbiwgX194KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfZXF1YWxfKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgdHJpZXMgdG8gaW5zZXJ0IGEgcmFuZ2Ugb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSByYW5nZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyBfTV90Ll9NX2luc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGEgbGlzdCBvZiBlbGVtZW50cyBpbnRvIHRoZSAlbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEEgc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IG9mIGVsZW1lbnRzCisgICAgICAgKiAgICAgICAgICAgICAgIHRvIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgdGhpcy0+aW5zZXJ0KF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDEzMC4gQXNzb2NpYXRpdmUgZXJhc2Ugc2hvdWxkIHJldHVybiBhbiBpdGVyYXRvci4KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYW4gZWxlbWVudCBmcm9tIGEgJW11bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nCisgICAgICAgKiAgICAgICAgICBAYSBwb3NpdGlvbiBwcmlvciB0byB0aGUgZWxlbWVudCBiZWluZyBlcmFzZWQuIElmIG5vIHN1Y2ggCisgICAgICAgKiAgICAgICAgICBlbGVtZW50IGV4aXN0cywgZW5kKCkgaXMgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFuIGVsZW1lbnQsIHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIGl0ZXJhdG9yLAorICAgICAgICogIGZyb20gYSAlbXVsdGlzZXQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwKKyAgICAgICAqICBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMKKyAgICAgICAqICBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBfR0xJQkNYWF9BQklfVEFHX0NYWDExCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXJhc2UoX19wb3NpdGlvbik7IH0KKyNlbHNlCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGFuIGVsZW1lbnQgZnJvbSBhICVtdWx0aXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYW4gZWxlbWVudCwgcG9pbnRlZCB0byBieSB0aGUgZ2l2ZW4gaXRlcmF0b3IsCisgICAgICAgKiAgZnJvbSBhICVtdWx0aXNldC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LAorICAgICAgICogIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcworICAgICAgICogIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IF9NX3QuZXJhc2UoX19wb3NpdGlvbik7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFsbCBlbGVtZW50cyBsb2NhdGVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbSBhCisgICAgICAgKiAgJW11bHRpc2V0LgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZgorICAgICAgICogIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZAorICAgICAgICogIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9feCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDEzMC4gQXNzb2NpYXRpdmUgZXJhc2Ugc2hvdWxkIHJldHVybiBhbiBpdGVyYXRvci4KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYSBbZmlyc3QsbGFzdCkgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhICVtdWx0aXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gX19sYXN0IEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvCisgICAgICAgKiAgICAgICAgICAgICAgICBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiBUaGUgaXRlcmF0b3IgQGEgbGFzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBmcm9tIGEgJW11bHRpc2V0LgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QKKyAgICAgICAqICB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIF9HTElCQ1hYX0FCSV9UQUdfQ1hYMTEKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbHNlCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGEgW2ZpcnN0LGxhc3QpIHJhbmdlIG9mIGVsZW1lbnRzIGZyb20gYSAlbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBmaXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvIGJlIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBmcm9tIGEgJW11bHRpc2V0LgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QKKyAgICAgICAqICB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX01fdC5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgRXJhc2VzIGFsbCBlbGVtZW50cyBpbiBhICVtdWx0aXNldC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkKKyAgICAgICAqICBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsCisgICAgICAgKiAgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlcgorICAgICAgICogIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX01fdC5jbGVhcigpOyB9CisKKyAgICAgIC8vIG11bHRpc2V0IG9wZXJhdGlvbnM6CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgZWxlbWVudHMgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyB3aXRoIHNwZWNpZmllZCBrZXkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuY291bnQoX194KTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuICBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVHJpZXMgdG8gbG9jYXRlIGFuIGVsZW1lbnQgaW4gYSAlc2V0LgorICAgICAgICogIEBwYXJhbSAgX194ICBFbGVtZW50IHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gc291Z2h0LWFmdGVyIGVsZW1lbnQsIG9yIGVuZCgpIGlmIG5vdAorICAgICAgICogICAgICAgICAgIGZvdW5kLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEga2V5IGFuZCB0cmllcyB0byBsb2NhdGUgdGhlIGVsZW1lbnQgd2l0aCB3aGljaAorICAgICAgICogIHRoZSBrZXkgbWF0Y2hlcy4gIElmIHN1Y2Nlc3NmdWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaXRlcmF0b3IKKyAgICAgICAqICBwb2ludGluZyB0byB0aGUgc291Z2h0IGFmdGVyIGVsZW1lbnQuICBJZiB1bnN1Y2Nlc3NmdWwgaXQgcmV0dXJucyB0aGUKKyAgICAgICAqICBwYXN0LXRoZS1lbmQgKCBAYyBlbmQoKSApIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyB0byBmaXJzdCBlbGVtZW50IGVxdWFsIHRvIG9yIGdyZWF0ZXIKKyAgICAgICAqICAgICAgICAgICB0aGFuIGtleSwgb3IgZW5kKCkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIHN1YnNlcXVlbmNlIG9mIGVsZW1lbnRzCisgICAgICAgKiAgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBrZXkuICBJZiB1bnN1Y2Nlc3NmdWwgaXQgcmV0dXJucyBhbiBpdGVyYXRvcgorICAgICAgICogIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaGFzIGEgZ3JlYXRlciB2YWx1ZSB0aGFuIGdpdmVuIGtleQorICAgICAgICogIG9yIGVuZCgpIGlmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgZW5kIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50CisgICAgICAgKiAgICAgICAgICBncmVhdGVyIHRoYW4ga2V5LCBvciBlbmQoKS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBQYWlyIG9mIGl0ZXJhdG9ycyB0aGF0IHBvc3NpYmx5IHBvaW50cyB0byB0aGUgc3Vic2VxdWVuY2UKKyAgICAgICAqICAgICAgICAgICBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0bworICAgICAgICogIEBjb2RlCisgICAgICAgKiAgICBzdGQ6Om1ha2VfcGFpcihjLmxvd2VyX2JvdW5kKHZhbCksCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBjLnVwcGVyX2JvdW5kKHZhbCkpCisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICAqICAoYnV0IGlzIGZhc3RlciB0aGFuIG1ha2luZyB0aGUgY2FsbHMgc2VwYXJhdGVseSkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvYmFibHkgb25seSBtYWtlcyBzZW5zZSBmb3IgbXVsdGlzZXRzLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSzEsIHR5cGVuYW1lIF9DMSwgdHlwZW5hbWUgX0ExPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IG11bHRpc2V0PF9LMSwgX0MxLCBfQTE+JiwKKwkJICAgY29uc3QgbXVsdGlzZXQ8X0sxLCBfQzEsIF9BMT4mKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0sxLCB0eXBlbmFtZSBfQzEsIHR5cGVuYW1lIF9BMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I8IChjb25zdCBtdWx0aXNldDxfSzEsIF9DMSwgX0ExPiYsCisJCSAgIGNvbnN0IG11bHRpc2V0PF9LMSwgX0MxLCBfQTE+Jik7CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgTXVsdGlzZXQgZXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICVtdWx0aXNldC4KKyAgICogIEBwYXJhbSAgX195ICBBICVtdWx0aXNldCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIF9feC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIHRoZSBzaXplIGFuZCBlbGVtZW50cyBvZiB0aGUgbXVsdGlzZXRzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBtdWx0aXNldHMuCisgICAqICBNdWx0aXNldHMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiB0aGVpciBzaXplcyBhcmUgZXF1YWwsIGFuZCBpZgorICAgKiAgY29ycmVzcG9uZGluZyBlbGVtZW50cyBjb21wYXJlIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV90ID09IF9feS5fTV90OyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE11bHRpc2V0IG9yZGVyaW5nIHJlbGF0aW9uLgorICAgKiAgQHBhcmFtICBfX3ggIEEgJW11bHRpc2V0LgorICAgKiAgQHBhcmFtICBfX3kgIEEgJW11bHRpc2V0IG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgX194LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgQGEgX194IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSBfX3kuCisgICAqCisgICAqICBUaGlzIGlzIGEgdG90YWwgb3JkZXJpbmcgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBtYXBzLiAgVGhlIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSB3aXRoIEBjIDwuCisgICAqCisgICAqICBTZWUgc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgpIGZvciBob3cgdGhlIGRldGVybWluYXRpb24gaXMgbWFkZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX3QgPCBfX3kuX01fdDsgfQorCisgIC8vLyAgUmV0dXJucyAhKHggPT0geSkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIC8vLyAgUmV0dXJucyB5IDwgeC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBtdWx0aXNldDxfS2V5LF9Db21wYXJlLF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LF9Db21wYXJlLF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICAvLy8gIFJldHVybnMgISh5IDwgeCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICAvLy8gIFJldHVybnMgISh4IDwgeSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICAvLy8gU2VlIHN0ZDo6bXVsdGlzZXQ6OnN3YXAoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX1NUTF9NVUxUSVNFVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX251bWVyaWMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfbnVtZXJpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlODhjMWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX251bWVyaWMuaApAQCAtMCwwICsxLDM4NyBAQAorLy8gTnVtZXJpYyBmdW5jdGlvbnMgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX251bWVyaWMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le251bWVyaWN9CisgKi8KKworI2lmbmRlZiBfU1RMX05VTUVSSUNfSAorI2RlZmluZSBfU1RMX05VTUVSSUNfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPGJpdHMvbW92ZS5oPiAvLyBGb3IgX0dMSUJDWFhfTU9WRQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgIENyZWF0ZSBhIHJhbmdlIG9mIHNlcXVlbnRpYWxseSBpbmNyZWFzaW5nIHZhbHVlcy4KKyAgICoKKyAgICogIEZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KSBhc3NpZ25zIEBwIHZhbHVlIGFuZAorICAgKiAgaW5jcmVtZW50cyBAcCB2YWx1ZSBhcyBpZiBieSBAcCArK3ZhbHVlLgorICAgKgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0ICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fdmFsdWUgIFN0YXJ0aW5nIHZhbHVlLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgaW90YShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfVHAgX192YWx1ZSkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcCwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwl7CisJICAqX19maXJzdCA9IF9fdmFsdWU7CisJICArK19fdmFsdWU7CisJfQorICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0FMR08KKworICAvKioKKyAgICogIEBicmllZiAgQWNjdW11bGF0ZSB2YWx1ZXMgaW4gYSByYW5nZS4KKyAgICoKKyAgICogIEFjY3VtdWxhdGVzIHRoZSB2YWx1ZXMgaW4gdGhlIHJhbmdlIFtmaXJzdCxsYXN0KSB1c2luZyBvcGVyYXRvcisoKS4gIFRoZQorICAgKiAgaW5pdGlhbCB2YWx1ZSBpcyBAYSBpbml0LiAgVGhlIHZhbHVlcyBhcmUgcHJvY2Vzc2VkIGluIG9yZGVyLgorICAgKgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0ICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9faW5pdCAgU3RhcnRpbmcgdmFsdWUgdG8gYWRkIG90aGVyIHZhbHVlcyB0by4KKyAgICogIEByZXR1cm4gIFRoZSBmaW5hbCBzdW0uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBhY2N1bXVsYXRlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1RwIF9faW5pdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJX19pbml0ID0gX19pbml0ICsgKl9fZmlyc3Q7CisgICAgICByZXR1cm4gX19pbml0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQWNjdW11bGF0ZSB2YWx1ZXMgaW4gYSByYW5nZSB3aXRoIG9wZXJhdGlvbi4KKyAgICoKKyAgICogIEFjY3VtdWxhdGVzIHRoZSB2YWx1ZXMgaW4gdGhlIHJhbmdlIFtmaXJzdCxsYXN0KSB1c2luZyB0aGUgZnVuY3Rpb24KKyAgICogIG9iamVjdCBAcCBfX2JpbmFyeV9vcC4gIFRoZSBpbml0aWFsIHZhbHVlIGlzIEBwIF9faW5pdC4gIFRoZSB2YWx1ZXMgYXJlCisgICAqICBwcm9jZXNzZWQgaW4gb3JkZXIuCisgICAqCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgIEVuZCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19pbml0ICBTdGFydGluZyB2YWx1ZSB0byBhZGQgb3RoZXIgdmFsdWVzIHRvLgorICAgKiAgQHBhcmFtICBfX2JpbmFyeV9vcCAgRnVuY3Rpb24gb2JqZWN0IHRvIGFjY3VtdWxhdGUgd2l0aC4KKyAgICogIEByZXR1cm4gIFRoZSBmaW5hbCBzdW0uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIGlubGluZSBfVHAKKyAgICBhY2N1bXVsYXRlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1RwIF9faW5pdCwKKwkgICAgICAgX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJX19pbml0ID0gX19iaW5hcnlfb3AoX19pbml0LCAqX19maXJzdCk7CisgICAgICByZXR1cm4gX19pbml0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQ29tcHV0ZSBpbm5lciBwcm9kdWN0IG9mIHR3byByYW5nZXMuCisgICAqCisgICAqICBTdGFydGluZyB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgQHAgX19pbml0LCBtdWx0aXBsaWVzIHN1Y2Nlc3NpdmUKKyAgICogIGVsZW1lbnRzIGZyb20gdGhlIHR3byByYW5nZXMgYW5kIGFkZHMgZWFjaCBwcm9kdWN0IGludG8gdGhlIGFjY3VtdWxhdGVkCisgICAqICB2YWx1ZSB1c2luZyBvcGVyYXRvcisoKS4gIFRoZSB2YWx1ZXMgaW4gdGhlIHJhbmdlcyBhcmUgcHJvY2Vzc2VkIGluCisgICAqICBvcmRlci4KKyAgICoKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIFN0YXJ0IG9mIHJhbmdlIDEuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgIEVuZCBvZiByYW5nZSAxLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgU3RhcnQgb2YgcmFuZ2UgMi4KKyAgICogIEBwYXJhbSAgX19pbml0ICBTdGFydGluZyB2YWx1ZSB0byBhZGQgb3RoZXIgdmFsdWVzIHRvLgorICAgKiAgQHJldHVybiAgVGhlIGZpbmFsIGlubmVyIHByb2R1Y3QuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBpbm5lcl9wcm9kdWN0KF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCSAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfVHAgX19pbml0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworCisgICAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKwlfX2luaXQgPSBfX2luaXQgKyAoKl9fZmlyc3QxICogKl9fZmlyc3QyKTsKKyAgICAgIHJldHVybiBfX2luaXQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBDb21wdXRlIGlubmVyIHByb2R1Y3Qgb2YgdHdvIHJhbmdlcy4KKyAgICoKKyAgICogIFN0YXJ0aW5nIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiBAcCBfX2luaXQsIGFwcGxpZXMgQHAgX19iaW5hcnlfb3AyIHRvCisgICAqICBzdWNjZXNzaXZlIGVsZW1lbnRzIGZyb20gdGhlIHR3byByYW5nZXMgYW5kIGFjY3VtdWxhdGVzIGVhY2ggcmVzdWx0IGludG8KKyAgICogIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZSB1c2luZyBAcCBfX2JpbmFyeV9vcDEuICBUaGUgdmFsdWVzIGluIHRoZSByYW5nZXMgYXJlCisgICAqICBwcm9jZXNzZWQgaW4gb3JkZXIuCisgICAqCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBTdGFydCBvZiByYW5nZSAxLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICBFbmQgb2YgcmFuZ2UgMS4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIFN0YXJ0IG9mIHJhbmdlIDIuCisgICAqICBAcGFyYW0gIF9faW5pdCAgU3RhcnRpbmcgdmFsdWUgdG8gYWRkIG90aGVyIHZhbHVlcyB0by4KKyAgICogIEBwYXJhbSAgX19iaW5hcnlfb3AxICBGdW5jdGlvbiBvYmplY3QgdG8gYWNjdW11bGF0ZSB3aXRoLgorICAgKiAgQHBhcmFtICBfX2JpbmFyeV9vcDIgIEZ1bmN0aW9uIG9iamVjdCB0byBhcHBseSB0byBwYWlycyBvZiBpbnB1dCB2YWx1ZXMuCisgICAqICBAcmV0dXJuICBUaGUgZmluYWwgaW5uZXIgcHJvZHVjdC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbjEsIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24yPgorICAgIGlubGluZSBfVHAKKyAgICBpbm5lcl9wcm9kdWN0KF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCSAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfVHAgX19pbml0LAorCQkgIF9CaW5hcnlPcGVyYXRpb24xIF9fYmluYXJ5X29wMSwKKwkJICBfQmluYXJ5T3BlcmF0aW9uMiBfX2JpbmFyeV9vcDIpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQorCV9faW5pdCA9IF9fYmluYXJ5X29wMShfX2luaXQsIF9fYmluYXJ5X29wMigqX19maXJzdDEsICpfX2ZpcnN0MikpOworICAgICAgcmV0dXJuIF9faW5pdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBsaXN0IG9mIHBhcnRpYWwgc3VtcworICAgKgorICAgKiAgQWNjdW11bGF0ZXMgdGhlIHZhbHVlcyBpbiB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIHVzaW5nIHRoZSBAYyArIG9wZXJhdG9yLgorICAgKiAgQXMgZWFjaCBzdWNjZXNzaXZlIGlucHV0IHZhbHVlIGlzIGFkZGVkIGludG8gdGhlIHRvdGFsLCB0aGF0IHBhcnRpYWwgc3VtCisgICAqICBpcyB3cml0dGVuIHRvIEBwIF9fcmVzdWx0LiAgVGhlcmVmb3JlLCB0aGUgZmlyc3QgdmFsdWUgaW4gQHAgX19yZXN1bHQgaXMKKyAgICogIHRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgaW5wdXQsIHRoZSBzZWNvbmQgdmFsdWUgaW4gQHAgX19yZXN1bHQgaXMgdGhlIHN1bQorICAgKiAgb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgaW5wdXQgdmFsdWVzLCBhbmQgc28gb24uCisgICAqCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIGlucHV0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgIEVuZCBvZiBpbnB1dCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgIE91dHB1dCBzdW0uCisgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyBqdXN0IGJleW9uZCB0aGUgdmFsdWVzIHdyaXR0ZW4gdG8gX19yZXN1bHQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHBhcnRpYWxfc3VtKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgIF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICBfVmFsdWVUeXBlIF9fdmFsdWUgPSAqX19maXJzdDsKKyAgICAgICpfX3Jlc3VsdCA9IF9fdmFsdWU7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICBfX3ZhbHVlID0gX192YWx1ZSArICpfX2ZpcnN0OworCSAgKisrX19yZXN1bHQgPSBfX3ZhbHVlOworCX0KKyAgICAgIHJldHVybiArK19fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGxpc3Qgb2YgcGFydGlhbCBzdW1zCisgICAqCisgICAqICBBY2N1bXVsYXRlcyB0aGUgdmFsdWVzIGluIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgdXNpbmcgQHAgX19iaW5hcnlfb3AuCisgICAqICBBcyBlYWNoIHN1Y2Nlc3NpdmUgaW5wdXQgdmFsdWUgaXMgYWRkZWQgaW50byB0aGUgdG90YWwsIHRoYXQgcGFydGlhbCBzdW0KKyAgICogIGlzIHdyaXR0ZW4gdG8gQHAgX19yZXN1bHQuICBUaGVyZWZvcmUsIHRoZSBmaXJzdCB2YWx1ZSBpbiBAcCBfX3Jlc3VsdCBpcworICAgKiAgdGhlIGZpcnN0IHZhbHVlIG9mIHRoZSBpbnB1dCwgdGhlIHNlY29uZCB2YWx1ZSBpbiBAcCBfX3Jlc3VsdCBpcyB0aGUgc3VtCisgICAqICBvZiB0aGUgZmlyc3QgYW5kIHNlY29uZCBpbnB1dCB2YWx1ZXMsIGFuZCBzbyBvbi4KKyAgICoKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgaW5wdXQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgRW5kIG9mIGlucHV0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCAgT3V0cHV0IHN1bS4KKyAgICogIEBwYXJhbSAgX19iaW5hcnlfb3AgIEZ1bmN0aW9uIG9iamVjdC4KKyAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHBvaW50aW5nIGp1c3QgYmV5b25kIHRoZSB2YWx1ZXMgd3JpdHRlbiB0byBfX3Jlc3VsdC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBwYXJ0aWFsX3N1bShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCV9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICBfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgX1ZhbHVlVHlwZSBfX3ZhbHVlID0gKl9fZmlyc3Q7CisgICAgICAqX19yZXN1bHQgPSBfX3ZhbHVlOworICAgICAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgX192YWx1ZSA9IF9fYmluYXJ5X29wKF9fdmFsdWUsICpfX2ZpcnN0KTsKKwkgICorK19fcmVzdWx0ID0gX192YWx1ZTsKKwl9CisgICAgICByZXR1cm4gKytfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBkaWZmZXJlbmNlcyBiZXR3ZWVuIGFkamFjZW50IHZhbHVlcy4KKyAgICoKKyAgICogIENvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYWRqYWNlbnQgdmFsdWVzIGluIHRoZSByYW5nZQorICAgKiAgW2ZpcnN0LGxhc3QpIHVzaW5nIG9wZXJhdG9yLSgpIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byBAcCBfX3Jlc3VsdC4KKyAgICoKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgaW5wdXQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgRW5kIG9mIGlucHV0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCAgT3V0cHV0IHN1bXMuCisgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyBqdXN0IGJleW9uZCB0aGUgdmFsdWVzIHdyaXR0ZW4gdG8gcmVzdWx0LgorICAgKgorICAgKiAgX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgKiAgRFIgNTM5LiBwYXJ0aWFsX3N1bSBhbmQgYWRqYWNlbnRfZGlmZmVyZW5jZSBzaG91bGQgbWVudGlvbiByZXF1aXJlbWVudHMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgYWRqYWNlbnRfZGlmZmVyZW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCQkJX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIF9WYWx1ZVR5cGUgX192YWx1ZSA9ICpfX2ZpcnN0OworICAgICAgKl9fcmVzdWx0ID0gX192YWx1ZTsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIF9WYWx1ZVR5cGUgX190bXAgPSAqX19maXJzdDsKKwkgICorK19fcmVzdWx0ID0gX190bXAgLSBfX3ZhbHVlOworCSAgX192YWx1ZSA9IF9HTElCQ1hYX01PVkUoX190bXApOworCX0KKyAgICAgIHJldHVybiArK19fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGRpZmZlcmVuY2VzIGJldHdlZW4gYWRqYWNlbnQgdmFsdWVzLgorICAgKgorICAgKiAgQ29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhZGphY2VudCB2YWx1ZXMgaW4gdGhlIHJhbmdlCisgICAqICBbX19maXJzdCxfX2xhc3QpIHVzaW5nIHRoZSBmdW5jdGlvbiBvYmplY3QgQHAgX19iaW5hcnlfb3AgYW5kIHdyaXRlcyB0aGUKKyAgICogIHJlc3VsdCB0byBAcCBfX3Jlc3VsdC4KKyAgICoKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgaW5wdXQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgRW5kIG9mIGlucHV0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCAgT3V0cHV0IHN1bS4KKyAgICogIEBwYXJhbSAgX19iaW5hcnlfb3AgRnVuY3Rpb24gb2JqZWN0LgorICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcganVzdCBiZXlvbmQgdGhlIHZhbHVlcyB3cml0dGVuIHRvIHJlc3VsdC4KKyAgICoKKyAgICogIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICogIERSIDUzOS4gcGFydGlhbF9zdW0gYW5kIGFkamFjZW50X2RpZmZlcmVuY2Ugc2hvdWxkIG1lbnRpb24gcmVxdWlyZW1lbnRzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgYWRqYWNlbnRfZGlmZmVyZW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQlfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIF9WYWx1ZVR5cGUgX192YWx1ZSA9ICpfX2ZpcnN0OworICAgICAgKl9fcmVzdWx0ID0gX192YWx1ZTsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIF9WYWx1ZVR5cGUgX190bXAgPSAqX19maXJzdDsKKwkgICorK19fcmVzdWx0ID0gX19iaW5hcnlfb3AoX190bXAsIF9fdmFsdWUpOworCSAgX192YWx1ZSA9IF9HTElCQ1hYX01PVkUoX190bXApOworCX0KKyAgICAgIHJldHVybiArK19fcmVzdWx0OworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9TVExfTlVNRVJJQ19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3BhaXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfcGFpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMjUwMTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3BhaXIuaApAQCAtMCwwICsxLDI5NSBAQAorLy8gUGFpciBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfcGFpci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dXRpbGl0eX0KKyAqLworCisjaWZuZGVmIF9TVExfUEFJUl9ICisjZGVmaW5lIF9TVExfUEFJUl9IIDEKKworI2luY2x1ZGUgPGJpdHMvbW92ZS5oPiAvLyBmb3Igc3RkOjptb3ZlIC8gc3RkOjpmb3J3YXJkLCBhbmQgc3RkOjpzd2FwCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+IC8vIGZvciBzdGQ6Ol9fZGVjYXlfYW5kX3N0cmlwIHRvbworI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBhZGR0b2dyb3VwIHV0aWxpdGllcworICAgKiAgQHsKKyAgICovCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8vLyBwaWVjZXdpc2VfY29uc3RydWN0X3QKKyAgc3RydWN0IHBpZWNld2lzZV9jb25zdHJ1Y3RfdCB7IH07CisKKyAgLy8vIHBpZWNld2lzZV9jb25zdHJ1Y3QKKyAgY29uc3RleHByIHBpZWNld2lzZV9jb25zdHJ1Y3RfdCBwaWVjZXdpc2VfY29uc3RydWN0ID0gcGllY2V3aXNlX2NvbnN0cnVjdF90KCk7CisKKyAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uPgorICAgIGNsYXNzIHR1cGxlOworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90Li4uPgorICAgIHN0cnVjdCBfSW5kZXhfdHVwbGU7CisjZW5kaWYKKworIC8qKgorICAgKiAgQGJyaWVmIFN0cnVjdCBob2xkaW5nIHR3byBvYmplY3RzIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKgorICAgKiAgQHRwYXJhbSBfVDEgIFR5cGUgb2YgZmlyc3Qgb2JqZWN0LgorICAgKiAgQHRwYXJhbSBfVDIgIFR5cGUgb2Ygc2Vjb25kIG9iamVjdC4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIHN0cnVjdCBwYWlyCisgICAgeworICAgICAgdHlwZWRlZiBfVDEgZmlyc3RfdHlwZTsgICAgLy8vIEBjIGZpcnN0X3R5cGUgaXMgdGhlIGZpcnN0IGJvdW5kIHR5cGUKKyAgICAgIHR5cGVkZWYgX1QyIHNlY29uZF90eXBlOyAgIC8vLyBAYyBzZWNvbmRfdHlwZSBpcyB0aGUgc2Vjb25kIGJvdW5kIHR5cGUKKworICAgICAgX1QxIGZpcnN0OyAgICAgICAgICAgICAgICAgLy8vIEBjIGZpcnN0IGlzIGEgY29weSBvZiB0aGUgZmlyc3Qgb2JqZWN0CisgICAgICBfVDIgc2Vjb25kOyAgICAgICAgICAgICAgICAvLy8gQGMgc2Vjb25kIGlzIGEgY29weSBvZiB0aGUgc2Vjb25kIG9iamVjdAorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNjUuICBzdGQ6OnBhaXI6OnBhaXIoKSBlZmZlY3RzIG92ZXJseSByZXN0cmljdGl2ZQorICAgICAgLyoqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgQGMgZmlyc3QgYW5kIEBjIHNlY29uZCB1c2luZyB0aGVpcgorICAgICAgICogIHJlc3BlY3RpdmUgZGVmYXVsdCBjb25zdHJ1Y3RvcnMuICAqLworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIHBhaXIoKQorICAgICAgOiBmaXJzdCgpLCBzZWNvbmQoKSB7IH0KKworICAgICAgLyoqIFR3byBvYmplY3RzIG1heSBiZSBwYXNzZWQgdG8gYSBAYyBwYWlyIGNvbnN0cnVjdG9yIHRvIGJlIGNvcGllZC4gICovCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgcGFpcihjb25zdCBfVDEmIF9fYSwgY29uc3QgX1QyJiBfX2IpCisgICAgICA6IGZpcnN0KF9fYSksIHNlY29uZChfX2IpIHsgfQorCisgICAgICAvKiogVGhlcmUgaXMgYWxzbyBhIHRlbXBsYXRlZCBjb3B5IGN0b3IgZm9yIHRoZSBAYyBwYWlyIGNsYXNzIGl0c2VsZi4gICovCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMj4KKwlwYWlyKGNvbnN0IHBhaXI8X1UxLCBfVTI+JiBfX3ApCisJOiBmaXJzdChfX3AuZmlyc3QpLCBzZWNvbmQoX19wLnNlY29uZCkgeyB9CisjZWxzZQorICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyBfVTIsIGNsYXNzID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPF9fYW5kXzxpc19jb252ZXJ0aWJsZTxjb25zdCBfVTEmLCBfVDE+LAorCQkJCWlzX2NvbnZlcnRpYmxlPGNvbnN0IF9VMiYsIF9UMj4+Ojp2YWx1ZT46OnR5cGU+CisJY29uc3RleHByIHBhaXIoY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9fcCkKKwk6IGZpcnN0KF9fcC5maXJzdCksIHNlY29uZChfX3Auc2Vjb25kKSB7IH0KKworICAgICAgY29uc3RleHByIHBhaXIoY29uc3QgcGFpciYpID0gZGVmYXVsdDsKKyAgICAgIGNvbnN0ZXhwciBwYWlyKHBhaXImJikgPSBkZWZhdWx0OworCisgICAgICAvLyBEUiA4MTEuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPF9VMSwgX1QxPjo6dmFsdWU+Ojp0eXBlPgorCWNvbnN0ZXhwciBwYWlyKF9VMSYmIF9feCwgY29uc3QgX1QyJiBfX3kpCisJOiBmaXJzdChzdGQ6OmZvcndhcmQ8X1UxPihfX3gpKSwgc2Vjb25kKF9feSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9VMiwgY2xhc3MgPSB0eXBlbmFtZQorCSAgICAgICBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1UyLCBfVDI+Ojp2YWx1ZT46OnR5cGU+CisJY29uc3RleHByIHBhaXIoY29uc3QgX1QxJiBfX3gsIF9VMiYmIF9feSkKKwk6IGZpcnN0KF9feCksIHNlY29uZChzdGQ6OmZvcndhcmQ8X1UyPihfX3kpKSB7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyBfVTIsIGNsYXNzID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPF9fYW5kXzxpc19jb252ZXJ0aWJsZTxfVTEsIF9UMT4sCisJCQkJaXNfY29udmVydGlibGU8X1UyLCBfVDI+Pjo6dmFsdWU+Ojp0eXBlPgorCWNvbnN0ZXhwciBwYWlyKF9VMSYmIF9feCwgX1UyJiYgX195KQorCTogZmlyc3Qoc3RkOjpmb3J3YXJkPF9VMT4oX194KSksIHNlY29uZChzdGQ6OmZvcndhcmQ8X1UyPihfX3kpKSB7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyBfVTIsIGNsYXNzID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPF9fYW5kXzxpc19jb252ZXJ0aWJsZTxfVTEsIF9UMT4sCisJCQkJaXNfY29udmVydGlibGU8X1UyLCBfVDI+Pjo6dmFsdWU+Ojp0eXBlPgorCWNvbnN0ZXhwciBwYWlyKHBhaXI8X1UxLCBfVTI+JiYgX19wKQorCTogZmlyc3Qoc3RkOjpmb3J3YXJkPF9VMT4oX19wLmZpcnN0KSksCisJICBzZWNvbmQoc3RkOjpmb3J3YXJkPF9VMj4oX19wLnNlY29uZCkpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJnczEsIHR5cGVuYW1lLi4uIF9BcmdzMj4KKyAgICAgICAgcGFpcihwaWVjZXdpc2VfY29uc3RydWN0X3QsIHR1cGxlPF9BcmdzMS4uLj4sIHR1cGxlPF9BcmdzMi4uLj4pOworCisgICAgICBwYWlyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHBhaXImIF9fcCkKKyAgICAgIHsKKwlmaXJzdCA9IF9fcC5maXJzdDsKKwlzZWNvbmQgPSBfX3Auc2Vjb25kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcGFpciYKKyAgICAgIG9wZXJhdG9yPShwYWlyJiYgX19wKQorICAgICAgbm9leGNlcHQoX19hbmRfPGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9UMT4sCisJICAgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfVDI+Pjo6dmFsdWUpCisgICAgICB7CisJZmlyc3QgPSBzdGQ6OmZvcndhcmQ8Zmlyc3RfdHlwZT4oX19wLmZpcnN0KTsKKwlzZWNvbmQgPSBzdGQ6OmZvcndhcmQ8c2Vjb25kX3R5cGU+KF9fcC5zZWNvbmQpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyBfVTI+CisJcGFpciYKKwlvcGVyYXRvcj0oY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9fcCkKKwl7CisJICBmaXJzdCA9IF9fcC5maXJzdDsKKwkgIHNlY29uZCA9IF9fcC5zZWNvbmQ7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMj4KKwlwYWlyJgorCW9wZXJhdG9yPShwYWlyPF9VMSwgX1UyPiYmIF9fcCkKKwl7CisJICBmaXJzdCA9IHN0ZDo6Zm9yd2FyZDxfVTE+KF9fcC5maXJzdCk7CisJICBzZWNvbmQgPSBzdGQ6OmZvcndhcmQ8X1UyPihfX3Auc2Vjb25kKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAocGFpciYgX19wKQorICAgICAgbm9leGNlcHQobm9leGNlcHQoc3dhcChmaXJzdCwgX19wLmZpcnN0KSkKKwkgICAgICAgJiYgbm9leGNlcHQoc3dhcChzZWNvbmQsIF9fcC5zZWNvbmQpKSkKKyAgICAgIHsKKwl1c2luZyBzdGQ6OnN3YXA7CisJc3dhcChmaXJzdCwgX19wLmZpcnN0KTsKKwlzd2FwKHNlY29uZCwgX19wLnNlY29uZCk7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MxLCBzdGQ6OnNpemVfdC4uLiBfSW5kZXhlczEsCisgICAgICAgICAgICAgICB0eXBlbmFtZS4uLiBfQXJnczIsIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzMj4KKyAgICAgICAgcGFpcih0dXBsZTxfQXJnczEuLi4+JiwgdHVwbGU8X0FyZ3MyLi4uPiYsCisgICAgICAgICAgICAgX0luZGV4X3R1cGxlPF9JbmRleGVzMS4uLj4sIF9JbmRleF90dXBsZTxfSW5kZXhlczIuLi4+KTsKKyNlbmRpZgorICAgIH07CisKKyAgLy8vIFR3byBwYWlycyBvZiB0aGUgc2FtZSB0eXBlIGFyZSBlcXVhbCBpZmYgdGhlaXIgbWVtYmVycyBhcmUgZXF1YWwuCisgIHRlbXBsYXRlPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guZmlyc3QgPT0gX195LmZpcnN0ICYmIF9feC5zZWNvbmQgPT0gX195LnNlY29uZDsgfQorCisgIC8vLyA8aHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC91dGlsaXRpZXMuaHRtbD4KKyAgdGVtcGxhdGU8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3kpCisgICAgeyByZXR1cm4gX194LmZpcnN0IDwgX195LmZpcnN0CisJICAgICB8fCAoIShfX3kuZmlyc3QgPCBfX3guZmlyc3QpICYmIF9feC5zZWNvbmQgPCBfX3kuc2Vjb25kKTsgfQorCisgIC8vLyBVc2VzIEBjIG9wZXJhdG9yPT0gdG8gZmluZCB0aGUgcmVzdWx0LgorICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIC8vLyBVc2VzIEBjIG9wZXJhdG9yPCB0byBmaW5kIHRoZSByZXN1bHQuCisgIHRlbXBsYXRlPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIC8vLyBVc2VzIEBjIG9wZXJhdG9yPCB0byBmaW5kIHRoZSByZXN1bHQuCisgIHRlbXBsYXRlPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICAvLy8gVXNlcyBAYyBvcGVyYXRvcjwgdG8gZmluZCB0aGUgcmVzdWx0LgorICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8vLyBTZWUgc3RkOjpwYWlyOjpzd2FwKCkuCisgIC8vIE5vdGU6ICBubyBzdGQ6OnN3YXAgb3ZlcmxvYWRzIGluIEMrKzAzIG1vZGUsIHRoaXMgaGFzIHBlcmZvcm1hbmNlCisgIC8vICAgICAgICBpbXBsaWNhdGlvbnMsIHNlZSwgZWcsIGxpYnN0ZGMrKy8zODQ2Ni4KKyAgdGVtcGxhdGU8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHBhaXI8X1QxLCBfVDI+JiBfX3gsIHBhaXI8X1QxLCBfVDI+JiBfX3kpCisgICAgbm9leGNlcHQobm9leGNlcHQoX194LnN3YXAoX195KSkpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisjZW5kaWYKKworICAvKioKKyAgICogIEBicmllZiBBIGNvbnZlbmllbmNlIHdyYXBwZXIgZm9yIGNyZWF0aW5nIGEgcGFpciBmcm9tIHR3byBvYmplY3RzLgorICAgKiAgQHBhcmFtICBfX3ggIFRoZSBmaXJzdCBvYmplY3QuCisgICAqICBAcGFyYW0gIF9feSAgVGhlIHNlY29uZCBvYmplY3QuCisgICAqICBAcmV0dXJuICAgQSBuZXdseS1jb25zdHJ1Y3RlZCBwYWlyPD4gb2JqZWN0IG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgorICAgKgorICAgKiAgVGhlIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgdGhlIG9iamVjdHMgYmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS10by1jb25zdCwKKyAgICogIGJ1dCBMV0cgaXNzdWUgIzE4MSBzYXlzIHRoZXkgc2hvdWxkIGJlIHBhc3NlZCBieSBjb25zdCB2YWx1ZS4gIFdlIGZvbGxvdworICAgKiAgdGhlIExXRyBieSBkZWZhdWx0LgorICAgKi8KKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyAxODEuICBtYWtlX3BhaXIoKSB1bmludGVuZGVkIGJlaGF2aW9yCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvLyBOQjogRFIgNzA2LgorICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBjb25zdGV4cHIgcGFpcjx0eXBlbmFtZSBfX2RlY2F5X2FuZF9zdHJpcDxfVDE+OjpfX3R5cGUsCisgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19kZWNheV9hbmRfc3RyaXA8X1QyPjo6X190eXBlPgorICAgIG1ha2VfcGFpcihfVDEmJiBfX3gsIF9UMiYmIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZGVjYXlfYW5kX3N0cmlwPF9UMT46Ol9fdHlwZSBfX2RzX3R5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlY2F5X2FuZF9zdHJpcDxfVDI+OjpfX3R5cGUgX19kc190eXBlMjsKKyAgICAgIHR5cGVkZWYgcGFpcjxfX2RzX3R5cGUxLCBfX2RzX3R5cGUyPiAJICAgICAgX19wYWlyX3R5cGU7CisgICAgICByZXR1cm4gX19wYWlyX3R5cGUoc3RkOjpmb3J3YXJkPF9UMT4oX194KSwgc3RkOjpmb3J3YXJkPF9UMj4oX195KSk7CisgICAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgaW5saW5lIHBhaXI8X1QxLCBfVDI+CisgICAgbWFrZV9wYWlyKF9UMSBfX3gsIF9UMiBfX3kpCisgICAgeyByZXR1cm4gcGFpcjxfVDEsIF9UMj4oX194LCBfX3kpOyB9CisjZW5kaWYKKworICAvLy8gQH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9TVExfUEFJUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3F1ZXVlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyYzA1MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfcXVldWUuaApAQCAtMCwwICsxLDU2OSBAQAorLy8gUXVldWUgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX3F1ZXVlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtxdWV1ZX0KKyAqLworCisjaWZuZGVmIF9TVExfUVVFVUVfSAorI2RlZmluZSBfU1RMX1FVRVVFX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmICBBIHN0YW5kYXJkIGNvbnRhaW5lciBnaXZpbmcgRklGTyBiZWhhdmlvci4KKyAgICoKKyAgICogIEBpbmdyb3VwIHNlcXVlbmNlcworICAgKgorICAgKiAgQHRwYXJhbSBfVHAgIFR5cGUgb2YgZWxlbWVudC4KKyAgICogIEB0cGFyYW0gX1NlcXVlbmNlICBUeXBlIG9mIHVuZGVybHlpbmcgc2VxdWVuY2UsIGRlZmF1bHRzIHRvIGRlcXVlPF9UcD4uCisgICAqCisgICAqICBNZWV0cyBtYW55IG9mIHRoZSByZXF1aXJlbWVudHMgb2YgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sCisgICAqICBidXQgZG9lcyBub3QgZGVmaW5lIGFueXRoaW5nIHRvIGRvIHdpdGggaXRlcmF0b3JzLiAgVmVyeSBmZXcgb2YgdGhlCisgICAqICBvdGhlciBzdGFuZGFyZCBjb250YWluZXIgaW50ZXJmYWNlcyBhcmUgZGVmaW5lZC4KKyAgICoKKyAgICogIFRoaXMgaXMgbm90IGEgdHJ1ZSBjb250YWluZXIsIGJ1dCBhbiBAZSBhZGFwdG9yLiAgSXQgaG9sZHMgYW5vdGhlcgorICAgKiAgY29udGFpbmVyLCBhbmQgcHJvdmlkZXMgYSB3cmFwcGVyIGludGVyZmFjZSB0byB0aGF0IGNvbnRhaW5lci4gIFRoZQorICAgKiAgd3JhcHBlciBpcyB3aGF0IGVuZm9yY2VzIHN0cmljdCBmaXJzdC1pbi1maXJzdC1vdXQgJXF1ZXVlIGJlaGF2aW9yLgorICAgKgorICAgKiAgVGhlIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZworICAgKiAgc2VxdWVuY2UvY29udGFpbmVyLiAgSXQgZGVmYXVsdHMgdG8gc3RkOjpkZXF1ZSwgYnV0IGl0IGNhbiBiZSBhbnkgdHlwZQorICAgKiAgdGhhdCBzdXBwb3J0cyBAYyBmcm9udCwgQGMgYmFjaywgQGMgcHVzaF9iYWNrLCBhbmQgQGMgcG9wX2Zyb250LAorICAgKiAgc3VjaCBhcyBzdGQ6Omxpc3Qgb3IgYW4gYXBwcm9wcmlhdGUgdXNlci1kZWZpbmVkIHR5cGUuCisgICAqCisgICAqICBNZW1iZXJzIG5vdCBmb3VuZCBpbiBAYSBub3JtYWwgY29udGFpbmVycyBhcmUgQGMgY29udGFpbmVyX3R5cGUsCisgICAqICB3aGljaCBpcyBhIHR5cGVkZWYgZm9yIHRoZSBzZWNvbmQgU2VxdWVuY2UgcGFyYW1ldGVyLCBhbmQgQGMgcHVzaCBhbmQKKyAgICogIEBjIHBvcCwgd2hpY2ggYXJlIHN0YW5kYXJkICVxdWV1ZS9GSUZPIG9wZXJhdGlvbnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcXVlbmNlID0gZGVxdWU8X1RwPiA+CisgICAgY2xhc3MgcXVldWUKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgX1NlcXVlbmNlX3ZhbHVlX3R5cGU7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1RwLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1NlcXVlbmNlLCBfRnJvbnRJbnNlcnRpb25TZXF1ZW5jZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1NlcXVlbmNlLCBfQmFja0luc2VydGlvblNlcXVlbmNlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczIoX1RwLCBfU2VxdWVuY2VfdmFsdWVfdHlwZSwgX1NhbWVUeXBlQ29uY2VwdCkKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1NlcTE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgcXVldWU8X1RwMSwgX1NlcTE+JiwgY29uc3QgcXVldWU8X1RwMSwgX1NlcTE+Jik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9TZXExPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcjwoY29uc3QgcXVldWU8X1RwMSwgX1NlcTE+JiwgY29uc3QgcXVldWU8X1RwMSwgX1NlcTE+Jik7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZSAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnJlZmVyZW5jZSAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnNpemVfdHlwZSAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiAgICAgICAgICBfU2VxdWVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvKioKKyAgICAgICAqICAnYycgaXMgdGhlIHVuZGVybHlpbmcgY29udGFpbmVyLiAgTWFpbnRhaW5lcnMgd29uZGVyaW5nIHdoeQorICAgICAgICogIHRoaXMgaXNuJ3QgdWdsaWZpZWQgYXMgcGVyIHN0eWxlIGd1aWRlbGluZXMgc2hvdWxkIG5vdGUgdGhhdAorICAgICAgICogIHRoaXMgbmFtZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHN0YW5kYXJkLCBbMjMuMi4zLjFdLiAgKFdoeT8KKyAgICAgICAqICBQcmVzdW1hYmx5IGZvciB0aGUgc2FtZSByZWFzb24gdGhhdCBpdCdzIHByb3RlY3RlZCBpbnN0ZWFkCisgICAgICAgKiAgb2YgcHJpdmF0ZTogdG8gYWxsb3cgZGVyaXZhdGlvbi4gIEJ1dCBub25lIG9mIHRoZSBvdGhlcgorICAgICAgICogIGNvbnRhaW5lcnMgYWxsb3cgZm9yIGRlcml2YXRpb24uICBPZGQuKQorICAgICAgICovCisgICAgICBfU2VxdWVuY2UgYzsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICBleHBsaWNpdAorICAgICAgcXVldWUoY29uc3QgX1NlcXVlbmNlJiBfX2MgPSBfU2VxdWVuY2UoKSkKKyAgICAgIDogYyhfX2MpIHsgfQorI2Vsc2UKKyAgICAgIGV4cGxpY2l0CisgICAgICBxdWV1ZShjb25zdCBfU2VxdWVuY2UmIF9fYykKKyAgICAgIDogYyhfX2MpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgcXVldWUoX1NlcXVlbmNlJiYgX19jID0gX1NlcXVlbmNlKCkpCisgICAgICA6IGMoc3RkOjptb3ZlKF9fYykpIHsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXF1ZXVlIGlzIGVtcHR5LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBjLmVtcHR5KCk7IH0KKworICAgICAgLyoqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlICVxdWV1ZS4gICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gYy5zaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVxdWV1ZS4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX25vbmVtcHR5KCk7CisJcmV0dXJuIGMuZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlcXVldWUuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19ub25lbXB0eSgpOworCXJldHVybiBjLmZyb250KCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVxdWV1ZS4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBiYWNrKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfbm9uZW1wdHkoKTsKKwlyZXR1cm4gYy5iYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlcXVldWUuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX25vbmVtcHR5KCk7CisJcmV0dXJuIGMuYmFjaygpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFkZCBkYXRhIHRvIHRoZSBlbmQgb2YgdGhlICVxdWV1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBhZGRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgJXF1ZXVlIG9wZXJhdGlvbi4gIFRoZSBmdW5jdGlvbiBjcmVhdGVzIGFuCisgICAgICAgKiAgZWxlbWVudCBhdCB0aGUgZW5kIG9mIHRoZSAlcXVldWUgYW5kIGFzc2lnbnMgdGhlIGdpdmVuIGRhdGEKKyAgICAgICAqICB0byBpdC4gIFRoZSB0aW1lIGNvbXBsZXhpdHkgb2YgdGhlIG9wZXJhdGlvbiBkZXBlbmRzIG9uIHRoZQorICAgICAgICogIHVuZGVybHlpbmcgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHB1c2goY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyBjLnB1c2hfYmFjayhfX3gpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBwdXNoKHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IGMucHVzaF9iYWNrKHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsgYy5lbXBsYWNlX2JhY2soc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlcyBmaXJzdCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCAlcXVldWUgb3BlcmF0aW9uLiAgSXQgc2hyaW5rcyB0aGUgJXF1ZXVlIGJ5IG9uZS4KKyAgICAgICAqICBUaGUgdGltZSBjb21wbGV4aXR5IG9mIHRoZSBvcGVyYXRpb24gZGVwZW5kcyBvbiB0aGUgdW5kZXJseWluZworICAgICAgICogIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgbm8gZGF0YSBpcyByZXR1cm5lZCwgYW5kIGlmIHRoZSBmaXJzdCBlbGVtZW50J3MKKyAgICAgICAqICBkYXRhIGlzIG5lZWRlZCwgaXQgc2hvdWxkIGJlIHJldHJpZXZlZCBiZWZvcmUgcG9wKCkgaXMKKyAgICAgICAqICBjYWxsZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBvcCgpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX25vbmVtcHR5KCk7CisJYy5wb3BfZnJvbnQoKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAocXVldWUmIF9fcSkKKyAgICAgIG5vZXhjZXB0KG5vZXhjZXB0KHN3YXAoYywgX19xLmMpKSkKKyAgICAgIHsKKwl1c2luZyBzdGQ6OnN3YXA7CisJc3dhcChjLCBfX3EuYyk7CisgICAgICB9CisjZW5kaWYKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBRdWV1ZSBlcXVhbGl0eSBjb21wYXJpc29uLgorICAgKiAgQHBhcmFtICBfX3ggIEEgJXF1ZXVlLgorICAgKiAgQHBhcmFtICBfX3kgIEEgJXF1ZXVlIG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgX194LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgdGhlIHNpemUgYW5kIGVsZW1lbnRzIG9mIHRoZSBxdWV1ZXMgYXJlIGVxdWFsLgorICAgKgorICAgKiAgVGhpcyBpcyBhbiBlcXVpdmFsZW5jZSByZWxhdGlvbi4gIENvbXBsZXhpdHkgYW5kIHNlbWFudGljcyBkZXBlbmQgb24gdGhlCisgICAqICB1bmRlcmx5aW5nIHNlcXVlbmNlIHR5cGUsIGJ1dCB0aGUgZXhwZWN0ZWQgcnVsZXMgYXJlOiAgdGhpcyByZWxhdGlvbiBpcworICAgKiAgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZSBzZXF1ZW5jZXMsIGFuZCBxdWV1ZXMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudAorICAgKiAgaWYgdGhlaXIgc2VxdWVuY2VzIGNvbXBhcmUgZXF1YWwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgcXVldWU8X1RwLCBfU2VxPiYgX194LCBjb25zdCBxdWV1ZTxfVHAsIF9TZXE+JiBfX3kpCisgICAgeyByZXR1cm4gX194LmMgPT0gX195LmM7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUXVldWUgb3JkZXJpbmcgcmVsYXRpb24uCisgICAqICBAcGFyYW0gIF9feCAgQSAlcXVldWUuCisgICAqICBAcGFyYW0gIF9feSAgQSAlcXVldWUgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSB4LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgQGEgX194IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSBfX3kuCisgICAqCisgICAqICBUaGlzIGlzIGFuIHRvdGFsIG9yZGVyaW5nIHJlbGF0aW9uLiAgQ29tcGxleGl0eSBhbmQgc2VtYW50aWNzCisgICAqICBkZXBlbmQgb24gdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UgdHlwZSwgYnV0IHRoZSBleHBlY3RlZCBydWxlcworICAgKiAgYXJlOiB0aGlzIHJlbGF0aW9uIGlzIGxpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgc2VxdWVuY2VzLCB0aGUKKyAgICogIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSB3aXRoIEBjIDwsIGFuZAorICAgKiAgc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgpIGlzIHVzdWFsbHkgdXNlZCB0byBtYWtlIHRoZQorICAgKiAgZGV0ZXJtaW5hdGlvbi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHF1ZXVlPF9UcCwgX1NlcT4mIF9feCwgY29uc3QgcXVldWU8X1RwLCBfU2VxPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5jIDwgX195LmM7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I9PQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHF1ZXVlPF9UcCwgX1NlcT4mIF9feCwgY29uc3QgcXVldWU8X1RwLCBfU2VxPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBxdWV1ZTxfVHAsIF9TZXE+JiBfX3gsIGNvbnN0IHF1ZXVlPF9UcCwgX1NlcT4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgcXVldWU8X1RwLCBfU2VxPiYgX194LCBjb25zdCBxdWV1ZTxfVHAsIF9TZXE+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHF1ZXVlPF9UcCwgX1NlcT4mIF9feCwgY29uc3QgcXVldWU8X1RwLCBfU2VxPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHF1ZXVlPF9UcCwgX1NlcT4mIF9feCwgcXVldWU8X1RwLCBfU2VxPiYgX195KQorICAgIG5vZXhjZXB0KG5vZXhjZXB0KF9feC5zd2FwKF9feSkpKQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB1c2VzX2FsbG9jYXRvcjxxdWV1ZTxfVHAsIF9TZXE+LCBfQWxsb2M+CisgICAgOiBwdWJsaWMgdXNlc19hbGxvY2F0b3I8X1NlcSwgX0FsbG9jPjo6dHlwZSB7IH07CisjZW5kaWYKKworICAvKioKKyAgICogIEBicmllZiAgQSBzdGFuZGFyZCBjb250YWluZXIgYXV0b21hdGljYWxseSBzb3J0aW5nIGl0cyBjb250ZW50cy4KKyAgICoKKyAgICogIEBpbmdyb3VwIHNlcXVlbmNlcworICAgKgorICAgKiAgQHRwYXJhbSBfVHAgIFR5cGUgb2YgZWxlbWVudC4KKyAgICogIEB0cGFyYW0gX1NlcXVlbmNlICBUeXBlIG9mIHVuZGVybHlpbmcgc2VxdWVuY2UsIGRlZmF1bHRzIHRvIHZlY3RvcjxfVHA+LgorICAgKiAgQHRwYXJhbSBfQ29tcGFyZSAgQ29tcGFyaXNvbiBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gCisgICAqICAgICAgICAgICAgICAgICAgICBsZXNzPF9TZXF1ZW5jZTo6dmFsdWVfdHlwZT4uCisgICAqCisgICAqICBUaGlzIGlzIG5vdCBhIHRydWUgY29udGFpbmVyLCBidXQgYW4gQGUgYWRhcHRvci4gIEl0IGhvbGRzCisgICAqICBhbm90aGVyIGNvbnRhaW5lciwgYW5kIHByb3ZpZGVzIGEgd3JhcHBlciBpbnRlcmZhY2UgdG8gdGhhdAorICAgKiAgY29udGFpbmVyLiAgVGhlIHdyYXBwZXIgaXMgd2hhdCBlbmZvcmNlcyBwcmlvcml0eS1iYXNlZCBzb3J0aW5nIAorICAgKiAgYW5kICVxdWV1ZSBiZWhhdmlvci4gIFZlcnkgZmV3IG9mIHRoZSBzdGFuZGFyZCBjb250YWluZXIvc2VxdWVuY2UKKyAgICogIGludGVyZmFjZSByZXF1aXJlbWVudHMgYXJlIG1ldCAoZS5nLiwgaXRlcmF0b3JzKS4KKyAgICoKKyAgICogIFRoZSBzZWNvbmQgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcKKyAgICogIHNlcXVlbmNlL2NvbnRhaW5lci4gIEl0IGRlZmF1bHRzIHRvIHN0ZDo6dmVjdG9yLCBidXQgaXQgY2FuIGJlCisgICAqICBhbnkgdHlwZSB0aGF0IHN1cHBvcnRzIEBjIGZyb250KCksIEBjIHB1c2hfYmFjaywgQGMgcG9wX2JhY2ssCisgICAqICBhbmQgcmFuZG9tLWFjY2VzcyBpdGVyYXRvcnMsIHN1Y2ggYXMgc3RkOjpkZXF1ZSBvciBhbgorICAgKiAgYXBwcm9wcmlhdGUgdXNlci1kZWZpbmVkIHR5cGUuCisgICAqCisgICAqICBUaGUgdGhpcmQgdGVtcGxhdGUgcGFyYW1ldGVyIHN1cHBsaWVzIHRoZSBtZWFucyBvZiBtYWtpbmcKKyAgICogIHByaW9yaXR5IGNvbXBhcmlzb25zLiAgSXQgZGVmYXVsdHMgdG8gQGMgbGVzczx2YWx1ZV90eXBlPiBidXQKKyAgICogIGNhbiBiZSBhbnl0aGluZyBkZWZpbmluZyBhIHN0cmljdCB3ZWFrIG9yZGVyaW5nLgorICAgKgorICAgKiAgTWVtYmVycyBub3QgZm91bmQgaW4gQGEgbm9ybWFsIGNvbnRhaW5lcnMgYXJlIEBjIGNvbnRhaW5lcl90eXBlLAorICAgKiAgd2hpY2ggaXMgYSB0eXBlZGVmIGZvciB0aGUgc2Vjb25kIFNlcXVlbmNlIHBhcmFtZXRlciwgYW5kIEBjCisgICAqICBwdXNoLCBAYyBwb3AsIGFuZCBAYyB0b3AsIHdoaWNoIGFyZSBzdGFuZGFyZCAlcXVldWUgb3BlcmF0aW9ucy4KKyAgICoKKyAgICogIEBub3RlIE5vIGVxdWFsaXR5L2NvbXBhcmlzb24gb3BlcmF0b3JzIGFyZSBwcm92aWRlZCBmb3IKKyAgICogICVwcmlvcml0eV9xdWV1ZS4KKyAgICoKKyAgICogIEBub3RlIFNvcnRpbmcgb2YgdGhlIGVsZW1lbnRzIHRha2VzIHBsYWNlIGFzIHRoZXkgYXJlIGFkZGVkIHRvLAorICAgKiAgYW5kIHJlbW92ZWQgZnJvbSwgdGhlICVwcmlvcml0eV9xdWV1ZSB1c2luZyB0aGUKKyAgICogICVwcmlvcml0eV9xdWV1ZSdzIG1lbWJlciBmdW5jdGlvbnMuICBJZiB5b3UgYWNjZXNzIHRoZSBlbGVtZW50cworICAgKiAgYnkgb3RoZXIgbWVhbnMsIGFuZCBjaGFuZ2UgdGhlaXIgZGF0YSBzdWNoIHRoYXQgdGhlIHNvcnRpbmcKKyAgICogIG9yZGVyIHdvdWxkIGJlIGRpZmZlcmVudCwgdGhlICVwcmlvcml0eV9xdWV1ZSB3aWxsIG5vdCByZS1zb3J0CisgICAqICB0aGUgZWxlbWVudHMgZm9yIHlvdS4gIChIb3cgY291bGQgaXQga25vdyB0byBkbyBzbz8pCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcXVlbmNlID0gdmVjdG9yPF9UcD4sCisJICAgdHlwZW5hbWUgX0NvbXBhcmUgID0gbGVzczx0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGU+ID4KKyAgICBjbGFzcyBwcmlvcml0eV9xdWV1ZQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZSBfU2VxdWVuY2VfdmFsdWVfdHlwZTsKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVHAsIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfU2VxdWVuY2UsIF9TZXF1ZW5jZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1NlcXVlbmNlLCBfUmFuZG9tQWNjZXNzQ29udGFpbmVyQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczIoX1RwLCBfU2VxdWVuY2VfdmFsdWVfdHlwZSwgX1NhbWVUeXBlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczQoX0NvbXBhcmUsIGJvb2wsIF9UcCwgX1RwLAorCQkJCV9CaW5hcnlGdW5jdGlvbkNvbmNlcHQpCisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZSAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnJlZmVyZW5jZSAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnNpemVfdHlwZSAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiAgICAgICAgICBfU2VxdWVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyAgU2VlIHF1ZXVlOjpjIGZvciBub3RlcyBvbiB0aGVzZSBuYW1lcy4KKyAgICAgIF9TZXF1ZW5jZSAgYzsKKyAgICAgIF9Db21wYXJlICAgY29tcDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICBleHBsaWNpdAorICAgICAgcHJpb3JpdHlfcXVldWUoY29uc3QgX0NvbXBhcmUmIF9feCA9IF9Db21wYXJlKCksCisJCSAgICAgY29uc3QgX1NlcXVlbmNlJiBfX3MgPSBfU2VxdWVuY2UoKSkKKyAgICAgIDogYyhfX3MpLCBjb21wKF9feCkKKyAgICAgIHsgc3RkOjptYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsgfQorI2Vsc2UKKyAgICAgIGV4cGxpY2l0CisgICAgICBwcmlvcml0eV9xdWV1ZShjb25zdCBfQ29tcGFyZSYgX194LAorCQkgICAgIGNvbnN0IF9TZXF1ZW5jZSYgX19zKQorICAgICAgOiBjKF9fcyksIGNvbXAoX194KQorICAgICAgeyBzdGQ6Om1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBwcmlvcml0eV9xdWV1ZShjb25zdCBfQ29tcGFyZSYgX194ID0gX0NvbXBhcmUoKSwKKwkJICAgICBfU2VxdWVuY2UmJiBfX3MgPSBfU2VxdWVuY2UoKSkKKyAgICAgIDogYyhzdGQ6Om1vdmUoX19zKSksIGNvbXAoX194KQorICAgICAgeyBzdGQ6Om1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlcXVldWUgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBIGNvbXBhcmlzb24gZnVuY3RvciBkZXNjcmliaW5nIGEgc3RyaWN0IHdlYWsgb3JkZXJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIEFuIGluaXRpYWwgc2VxdWVuY2Ugd2l0aCB3aGljaCB0byBzdGFydC4KKyAgICAgICAqCisgICAgICAgKiAgQmVnaW5zIGJ5IGNvcHlpbmcgQGEgX19zLCBpbnNlcnRpbmcgYSBjb3B5IG9mIHRoZSBlbGVtZW50cworICAgICAgICogIGZyb20gQGEgW2ZpcnN0LGxhc3QpIGludG8gdGhlIGNvcHkgb2YgQGEgX19zLCB0aGVuIG9yZGVyaW5nCisgICAgICAgKiAgdGhlIGNvcHkgYWNjb3JkaW5nIHRvIEBhIF9feC4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZnVuY3Rpb24gb2JqZWN0cywgc2VlIHRoZQorICAgICAgICogIGRvY3VtZW50YXRpb24gb24gQGxpbmsgZnVuY3RvcnMgZnVuY3RvciBiYXNlCisgICAgICAgKiAgY2xhc3Nlc0BlbmRsaW5rLgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgcHJpb3JpdHlfcXVldWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICAgICAgY29uc3QgX0NvbXBhcmUmIF9feCA9IF9Db21wYXJlKCksCisJCSAgICAgICBjb25zdCBfU2VxdWVuY2UmIF9fcyA9IF9TZXF1ZW5jZSgpKQorCTogYyhfX3MpLCBjb21wKF9feCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBjLmluc2VydChjLmVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOworCSAgc3RkOjptYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKKwl9CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHByaW9yaXR5X3F1ZXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX3gsCisJCSAgICAgICBjb25zdCBfU2VxdWVuY2UmIF9fcykKKwk6IGMoX19zKSwgY29tcChfX3gpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgYy5pbnNlcnQoYy5lbmQoKSwgX19maXJzdCwgX19sYXN0KTsKKwkgIHN0ZDo6bWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgcHJpb3JpdHlfcXVldWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICAgICAgY29uc3QgX0NvbXBhcmUmIF9feCA9IF9Db21wYXJlKCksCisJCSAgICAgICBfU2VxdWVuY2UmJiBfX3MgPSBfU2VxdWVuY2UoKSkKKwk6IGMoc3RkOjptb3ZlKF9fcykpLCBjb21wKF9feCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBjLmluc2VydChjLmVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOworCSAgc3RkOjptYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKKwl9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSAlcXVldWUgaXMgZW1wdHkuCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGMuZW1wdHkoKTsgfQorCisgICAgICAvKiogIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgJXF1ZXVlLiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBjLnNpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVxdWV1ZS4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICB0b3AoKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19ub25lbXB0eSgpOworCXJldHVybiBjLmZyb250KCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWRkIGRhdGEgdG8gdGhlICVxdWV1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBhZGRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgJXF1ZXVlIG9wZXJhdGlvbi4KKyAgICAgICAqICBUaGUgdGltZSBjb21wbGV4aXR5IG9mIHRoZSBvcGVyYXRpb24gZGVwZW5kcyBvbiB0aGUgdW5kZXJseWluZworICAgICAgICogIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwljLnB1c2hfYmFjayhfX3gpOworCXN0ZDo6cHVzaF9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBwdXNoKHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7CisJYy5wdXNoX2JhY2soc3RkOjptb3ZlKF9feCkpOworCXN0ZDo6cHVzaF9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgYy5lbXBsYWNlX2JhY2soc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIHN0ZDo6cHVzaF9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7CisJfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlcyBmaXJzdCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCAlcXVldWUgb3BlcmF0aW9uLiAgSXQgc2hyaW5rcyB0aGUgJXF1ZXVlCisgICAgICAgKiAgYnkgb25lLiAgVGhlIHRpbWUgY29tcGxleGl0eSBvZiB0aGUgb3BlcmF0aW9uIGRlcGVuZHMgb24gdGhlCisgICAgICAgKiAgdW5kZXJseWluZyBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IG5vIGRhdGEgaXMgcmV0dXJuZWQsIGFuZCBpZiB0aGUgZmlyc3QgZWxlbWVudCdzCisgICAgICAgKiAgZGF0YSBpcyBuZWVkZWQsIGl0IHNob3VsZCBiZSByZXRyaWV2ZWQgYmVmb3JlIHBvcCgpIGlzCisgICAgICAgKiAgY2FsbGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwb3AoKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19ub25lbXB0eSgpOworCXN0ZDo6cG9wX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKKwljLnBvcF9iYWNrKCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBzd2FwKHByaW9yaXR5X3F1ZXVlJiBfX3BxKQorICAgICAgbm9leGNlcHQobm9leGNlcHQoc3dhcChjLCBfX3BxLmMpKSAmJiBub2V4Y2VwdChzd2FwKGNvbXAsIF9fcHEuY29tcCkpKQorICAgICAgeworCXVzaW5nIHN0ZDo6c3dhcDsKKwlzd2FwKGMsIF9fcHEuYyk7CisJc3dhcChjb21wLCBfX3BxLmNvbXApOworICAgICAgfQorI2VuZGlmCisgICAgfTsKKworICAvLyBObyBlcXVhbGl0eS9jb21wYXJpc29uIG9wZXJhdG9ycyBhcmUgcHJvdmlkZWQgZm9yIHByaW9yaXR5X3F1ZXVlLgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXF1ZW5jZSwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHByaW9yaXR5X3F1ZXVlPF9UcCwgX1NlcXVlbmNlLCBfQ29tcGFyZT4mIF9feCwKKwkgcHJpb3JpdHlfcXVldWU8X1RwLCBfU2VxdWVuY2UsIF9Db21wYXJlPiYgX195KQorICAgIG5vZXhjZXB0KG5vZXhjZXB0KF9feC5zd2FwKF9feSkpKQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcXVlbmNlLCB0eXBlbmFtZSBfQ29tcGFyZSwKKwkgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHVzZXNfYWxsb2NhdG9yPHByaW9yaXR5X3F1ZXVlPF9UcCwgX1NlcXVlbmNlLCBfQ29tcGFyZT4sIF9BbGxvYz4KKyAgICA6IHB1YmxpYyB1c2VzX2FsbG9jYXRvcjxfU2VxdWVuY2UsIF9BbGxvYz46OnR5cGUgeyB9OworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9TVExfUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9yYXdfc3RvcmFnZV9pdGVyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3Jhd19zdG9yYWdlX2l0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDVjMTFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9yYXdfc3RvcmFnZV9pdGVyLmgKQEAgLTAsMCArMSwxMDggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfcmF3X3N0b3JhZ2VfaXRlci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWVtb3J5fQorICovCisKKyNpZm5kZWYgX1NUTF9SQVdfU1RPUkFHRV9JVEVSQVRPUl9ICisjZGVmaW5lIF9TVExfUkFXX1NUT1JBR0VfSVRFUkFUT1JfSCAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIFRoaXMgaXRlcmF0b3IgY2xhc3MgbGV0cyBhbGdvcml0aG1zIHN0b3JlIHRoZWlyIHJlc3VsdHMgaW50bworICAgKiAgdW5pbml0aWFsaXplZCBtZW1vcnkuCisgICovCisgIHRlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlcmF0b3IsIGNsYXNzIF9UcD4KKyAgICBjbGFzcyByYXdfc3RvcmFnZV9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9PdXRwdXRJdGVyYXRvciBfTV9pdGVyOworCisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIHJhd19zdG9yYWdlX2l0ZXJhdG9yKF9PdXRwdXRJdGVyYXRvciBfX3gpCisgICAgICA6IF9NX2l0ZXIoX194KSB7fQorCisgICAgICByYXdfc3RvcmFnZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIHJhd19zdG9yYWdlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9UcCYgX19lbGVtZW50KQorICAgICAgeworCXN0ZDo6X0NvbnN0cnVjdChzdGQ6Ol9fYWRkcmVzc29mKCpfTV9pdGVyKSwgX19lbGVtZW50KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHJhd19zdG9yYWdlX2l0ZXJhdG9yPF9PdXRwdXRJdGVyYXRvciwgX1RwPiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCSsrX01faXRlcjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHJhd19zdG9yYWdlX2l0ZXJhdG9yPF9PdXRwdXRJdGVyYXRvciwgX1RwPgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJcmF3X3N0b3JhZ2VfaXRlcmF0b3I8X091dHB1dEl0ZXJhdG9yLCBfVHA+IF9fdG1wID0gKnRoaXM7CisJKytfTV9pdGVyOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9yZWxvcHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfcmVsb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3MDhkNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfcmVsb3BzLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8vIHN0ZDo6cmVsX29wcyBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX3JlbG9wcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dXRpbGl0eX0KKyAqCisgKiAgSW5jbHVzaW9uIG9mIHRoaXMgZmlsZSBoYXMgYmVlbiByZW1vdmVkIGZyb20KKyAqICBhbGwgb2YgdGhlIG90aGVyIFNUTCBoZWFkZXJzIGZvciBzYWZldHkgcmVhc29ucywgZXhjZXB0IHN0ZF91dGlsaXR5LmguCisgKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgdGhyZWFkIG9mIGFib3V0IHR3ZW50eSBtZXNzYWdlcyBzdGFydGluZworICogIHdpdGggaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAxLTAxL21zZzAwMjIzLmh0bWwsIG9yCisgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL2ZhcS5odG1sI2ZhcS5hbWJpZ3VvdXNfb3ZlcmxvYWRzCisgKgorICogIFNob3J0IHN1bW1hcnk6IHRoZSByZWxfb3BzIG9wZXJhdG9ycyBzaG91bGQgYmUgYXZvaWRlZCBmb3IgdGhlIHByZXNlbnQuCisgKi8KKworI2lmbmRlZiBfU1RMX1JFTE9QU19ICisjZGVmaW5lIF9TVExfUkVMT1BTX0ggMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKKyAgbmFtZXNwYWNlIHJlbF9vcHMKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLyoqIEBuYW1lc3BhY2Ugc3RkOjpyZWxfb3BzCisgICAgICogIEBicmllZiAgVGhlIGdlbmVyYXRlZCByZWxhdGlvbmFsIG9wZXJhdG9ycyBhcmUgc2VxdWVzdGVyZWQgaGVyZS4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgRGVmaW5lcyBAYyAhPSBmb3IgYXJiaXRyYXJ5IHR5cGVzLCBpbiB0ZXJtcyBvZiBAYyA9PS4KKyAgICAgKiAgQHBhcmFtICBfX3ggIEEgdGhpbmcuCisgICAgICogIEBwYXJhbSAgX195ICBBbm90aGVyIHRoaW5nLgorICAgICAqICBAcmV0dXJuICAgX194ICE9IF9feQorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gdXNlcyBAYyA9PSB0byBkZXRlcm1pbmUgaXRzIHJlc3VsdC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KQorICAgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiBEZWZpbmVzIEBjID4gZm9yIGFyYml0cmFyeSB0eXBlcywgaW4gdGVybXMgb2YgQGMgPC4KKyAgICAgKiAgQHBhcmFtICBfX3ggIEEgdGhpbmcuCisgICAgICogIEBwYXJhbSAgX195ICBBbm90aGVyIHRoaW5nLgorICAgICAqICBAcmV0dXJuICAgX194ID4gX195CisgICAgICoKKyAgICAgKiAgVGhpcyBmdW5jdGlvbiB1c2VzIEBjIDwgdG8gZGV0ZXJtaW5lIGl0cyByZXN1bHQuCisgICAgICovCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj4oY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KQorICAgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmIERlZmluZXMgQGMgPD0gZm9yIGFyYml0cmFyeSB0eXBlcywgaW4gdGVybXMgb2YgQGMgPC4KKyAgICAgKiAgQHBhcmFtICBfX3ggIEEgdGhpbmcuCisgICAgICogIEBwYXJhbSAgX195ICBBbm90aGVyIHRoaW5nLgorICAgICAqICBAcmV0dXJuICAgX194IDw9IF9feQorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gdXNlcyBAYyA8IHRvIGRldGVybWluZSBpdHMgcmVzdWx0LgorICAgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I8PShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpCisgICAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgRGVmaW5lcyBAYyA+PSBmb3IgYXJiaXRyYXJ5IHR5cGVzLCBpbiB0ZXJtcyBvZiBAYyA8LgorICAgICAqICBAcGFyYW0gIF9feCAgQSB0aGluZy4KKyAgICAgKiAgQHBhcmFtICBfX3kgIEFub3RoZXIgdGhpbmcuCisgICAgICogIEByZXR1cm4gICBfX3ggPj0gX195CisgICAgICoKKyAgICAgKiAgVGhpcyBmdW5jdGlvbiB1c2VzIEBjIDwgdG8gZGV0ZXJtaW5lIGl0cyByZXN1bHQuCisgICAgICovCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj49KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkKKyAgICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSByZWxfb3BzCisKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX1NUTF9SRUxPUFNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9zZXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlYjU4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfc2V0LmgKQEAgLTAsMCArMSw4MTEgQEAKKy8vIFNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfc2V0LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtzZXR9CisgKi8KKworI2lmbmRlZiBfU1RMX1NFVF9ICisjZGVmaW5lIF9TVExfU0VUX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgbWFkZSB1cCBvZiB1bmlxdWUga2V5cywgd2hpY2ggY2FuIGJlCisgICAqICByZXRyaWV2ZWQgaW4gbG9nYXJpdGhtaWMgdGltZS4KKyAgICoKKyAgICogIEBpbmdyb3VwIGFzc29jaWF0aXZlX2NvbnRhaW5lcnMKKyAgICoKKyAgICogIEB0cGFyYW0gX0tleSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEB0cGFyYW0gX0NvbXBhcmUgIENvbXBhcmlzb24gZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGxlc3M8X0tleT4uCisgICAqICBAdHBhcmFtIF9BbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxfS2V5Pi4KKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjYiPnJldmVyc2libGUgY29udGFpbmVyPC9hPiwgYW5kIGFuCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2OSI+YXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPiAodXNpbmcgdW5pcXVlIGtleXMpLgorICAgKgorICAgKiAgU2V0cyBzdXBwb3J0IGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzLgorICAgKgorICAgKiAgVGhlIHByaXZhdGUgdHJlZSBkYXRhIGlzIGRlY2xhcmVkIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGZvciBzZXQgYW5kCisgICAqICBtdWx0aXNldDsgdGhlIGRpc3RpbmN0aW9uIGlzIG1hZGUgZW50aXJlbHkgaW4gaG93IHRoZSB0cmVlIGZ1bmN0aW9ucyBhcmUKKyAgICogIGNhbGxlZCAoKl91bmlxdWUgdmVyc3VzICpfZXF1YWwsIHNhbWUgYXMgdGhlIHN0YW5kYXJkKS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X0tleT4gPgorICAgIGNsYXNzIHNldAorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSAgICAgICAgICAgICAgICAgICBfQWxsb2NfdmFsdWVfdHlwZTsKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfS2V5LCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXM0KF9Db21wYXJlLCBib29sLCBfS2V5LCBfS2V5LAorCQkJCV9CaW5hcnlGdW5jdGlvbkNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMyKF9LZXksIF9BbGxvY192YWx1ZV90eXBlLCBfU2FtZVR5cGVDb25jZXB0KQorCisgICAgcHVibGljOgorICAgICAgLy8gdHlwZWRlZnM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzLgorICAgICAgdHlwZWRlZiBfS2V5ICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0tleSAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlIHZhbHVlX2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvYyAgIGFsbG9jYXRvcl90eXBlOworICAgICAgLy9AfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X0tleT46Om90aGVyIF9LZXlfYWxsb2NfdHlwZTsKKworICAgICAgdHlwZWRlZiBfUmJfdHJlZTxrZXlfdHlwZSwgdmFsdWVfdHlwZSwgX0lkZW50aXR5PHZhbHVlX3R5cGU+LAorCQkgICAgICAga2V5X2NvbXBhcmUsIF9LZXlfYWxsb2NfdHlwZT4gX1JlcF90eXBlOworICAgICAgX1JlcF90eXBlIF9NX3Q7ICAvLyBSZWQtYmxhY2sgdHJlZSByZXByZXNlbnRpbmcgc2V0LgorCisgICAgcHVibGljOgorICAgICAgLy9AeworICAgICAgLy8vICBJdGVyYXRvci1yZWxhdGVkIHR5cGVkZWZzLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfS2V5X2FsbG9jX3R5cGU6OnBvaW50ZXIgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0tleV9hbGxvY190eXBlOjpjb25zdF9wb2ludGVyICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9LZXlfYWxsb2NfdHlwZTo6cmVmZXJlbmNlICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9LZXlfYWxsb2NfdHlwZTo6Y29uc3RfcmVmZXJlbmNlICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMDMuIHNldDo6aXRlcmF0b3IgaXMgcmVxdWlyZWQgdG8gYmUgbW9kaWZpYWJsZSwKKyAgICAgIC8vIGJ1dCB0aGlzIGFsbG93cyBtb2RpZmljYXRpb24gb2Yga2V5cy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpzaXplX3R5cGUgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy8gYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICovCisgICAgICBzZXQoKQorICAgICAgOiBfTV90KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVzZXQgd2l0aCBubyBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fY29tcCAgQ29tcGFyYXRvciB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV90KF9fY29tcCwgX0tleV9hbGxvY190eXBlKF9fYSkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVzZXQgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlc2V0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgW19fZmlyc3QsX19sYXN0KS4gIFRoaXMgaXMgbGluZWFyIGluIE4gaWYgdGhlIHJhbmdlIGlzCisgICAgICAgKiAgYWxyZWFkeSBzb3J0ZWQsIGFuZCBObG9nTiBvdGhlcndpc2UgKHdoZXJlIE4gaXMKKyAgICAgICAqICBkaXN0YW5jZShfX2ZpcnN0LF9fbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorCTogX01fdCgpCisJeyBfTV90Ll9NX2luc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVzZXQgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19jb21wICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGEgJXNldCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgZnJvbQorICAgICAgICogIFtfX2ZpcnN0LF9fbGFzdCkuICBUaGlzIGlzIGxpbmVhciBpbiBOIGlmIHRoZSByYW5nZSBpcworICAgICAgICogIGFscmVhZHkgc29ydGVkLCBhbmQgTmxvZ04gb3RoZXJ3aXNlICh3aGVyZSBOIGlzCisgICAgICAgKiAgZGlzdGFuY2UoX19maXJzdCxfX2xhc3QpKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV90KF9fY29tcCwgX0tleV9hbGxvY190eXBlKF9fYSkpCisgICAgICAgIHsgX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlU2V0IGNvcHkgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJXNldCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlc2V0IHVzZXMgYSBjb3B5IG9mIHRoZSBhbGxvY2F0aW9uIG9iamVjdCB1c2VkCisgICAgICAgKiAgYnkgQGEgX194LgorICAgICAgICovCisgICAgICBzZXQoY29uc3Qgc2V0JiBfX3gpCisgICAgICA6IF9NX3QoX194Ll9NX3QpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgJVNldCBtb3ZlIGNvbnN0cnVjdG9yCisgICAgICAgKiAgQHBhcmFtIF9feCAgQSAlc2V0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVzZXQgY29udGFpbnMgdGhlIGV4YWN0IGNvbnRlbnRzIG9mIEBhIHguCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIHggYXJlIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCAlc2V0LgorICAgICAgICovCisgICAgICBzZXQoc2V0JiYgX194KQorICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X0NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgIDogX01fdChzdGQ6Om1vdmUoX194Ll9NX3QpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlc2V0IGZyb20gYW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fY29tcCAgQSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVzZXQgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgICAgICogIFRoaXMgaXMgbGluZWFyIGluIE4gaWYgdGhlIGxpc3QgaXMgYWxyZWFkeSBzb3J0ZWQsIGFuZCBObG9nTgorICAgICAgICogIG90aGVyd2lzZSAod2hlcmUgTiBpcyBAYSBfX2wuc2l6ZSgpKS4KKyAgICAgICAqLworICAgICAgc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01fdChfX2NvbXAsIF9LZXlfYWxsb2NfdHlwZShfX2EpKQorICAgICAgeyBfTV90Ll9NX2luc2VydF91bmlxdWUoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVTZXQgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlc2V0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgZWxlbWVudHMgb2YgQGEgX194IGFyZSBjb3BpZWQsIGJ1dCB1bmxpa2UgdGhlIGNvcHkKKyAgICAgICAqICBjb25zdHJ1Y3RvciwgdGhlIGFsbG9jYXRvciBvYmplY3QgaXMgbm90IGNvcGllZC4KKyAgICAgICAqLworICAgICAgc2V0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHNldCYgX194KQorICAgICAgeworCV9NX3QgPSBfX3guX01fdDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgJVNldCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9feCAgQSAlc2V0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSBfX3ggYXJlIG1vdmVkIGludG8gdGhpcyAlc2V0ICh3aXRob3V0IGNvcHlpbmcpLgorICAgICAgICogIEBhIF9feCBpcyBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgJXNldC4KKyAgICAgICAqLworICAgICAgc2V0JgorICAgICAgb3BlcmF0b3I9KHNldCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+c3dhcChfX3gpOworICAgICAgCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlU2V0IGxpc3QgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICVzZXQgd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyIGxpc3QgQGEgX19sLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAlc2V0IGFuZAorICAgICAgICogIHRoYXQgdGhlIHJlc3VsdGluZyAlc2V0J3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgc2V0JgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvLyBhY2Nlc3NvcnM6CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgY29tcGFyaXNvbiBvYmplY3Qgd2l0aCB3aGljaCB0aGUgJXNldCB3YXMgY29uc3RydWN0ZWQuCisgICAgICBrZXlfY29tcGFyZQorICAgICAga2V5X2NvbXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9CisgICAgICAvLy8gIFJldHVybnMgdGhlIGNvbXBhcmlzb24gb2JqZWN0IHdpdGggd2hpY2ggdGhlICVzZXQgd2FzIGNvbnN0cnVjdGVkLgorICAgICAgdmFsdWVfY29tcGFyZQorICAgICAgdmFsdWVfY29tcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgYWxsb2NhdG9yIG9iamVjdCB3aXRoIHdoaWNoIHRoZSAlc2V0IHdhcyBjb25zdHJ1Y3RlZC4KKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX3QuZ2V0X2FsbG9jYXRvcigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcKKyAgICAgICAqICB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZworICAgICAgICogIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nCisgICAgICAgKiAgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgcGFpciBpbiB0aGUgJXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZworICAgICAgICogIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZworICAgICAgICogIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV90LmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZworICAgICAgICogIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlCisgICAgICAgKiAgbGFzdCBwYWlyIGluIHRoZSAlc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKyNlbmRpZgorCisgICAgICAvLy8gIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXNldCBpcyBlbXB0eS4KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIHNpemUgb2YgdGhlICVzZXQuCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5zaXplKCk7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlICVzZXQuCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXBzIGRhdGEgd2l0aCBhbm90aGVyICVzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJXNldCBvZiB0aGUgc2FtZSBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZXhjaGFuZ2VzIHRoZSBlbGVtZW50cyBiZXR3ZWVuIHR3byBzZXRzIGluIGNvbnN0YW50CisgICAgICAgKiAgdGltZS4gIChJdCBpcyBvbmx5IHN3YXBwaW5nIGEgcG9pbnRlciwgYW4gaW50ZWdlciwgYW5kIGFuCisgICAgICAgKiAgaW5zdGFuY2Ugb2YgdGhlIEBjIENvbXBhcmUgdHlwZSAod2hpY2ggaXRzZWxmIGlzIG9mdGVuCisgICAgICAgKiAgc3RhdGVsZXNzIGFuZCBlbXB0eSksIHNvIGl0IHNob3VsZCBiZSBxdWl0ZSBmYXN0LikgIE5vdGUKKyAgICAgICAqICB0aGF0IHRoZSBnbG9iYWwgc3RkOjpzd2FwKCkgZnVuY3Rpb24gaXMgc3BlY2lhbGl6ZWQgc3VjaAorICAgICAgICogIHRoYXQgc3RkOjpzd2FwKHMxLHMyKSB3aWxsIGZlZWQgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3dhcChzZXQmIF9feCkKKyAgICAgIHsgX01fdC5zd2FwKF9feC5fTV90KTsgfQorCisgICAgICAvLyBpbnNlcnQvZXJhc2UKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gYnVpbGQgYW5kIGluc2VydCBhbiBlbGVtZW50IGludG8gdGhlICVzZXQuCisgICAgICAgKiAgQHBhcmFtIF9fYXJncyAgQXJndW1lbnRzIHVzZWQgdG8gZ2VuZXJhdGUgYW4gZWxlbWVudC4KKyAgICAgICAqICBAcmV0dXJuICBBIHBhaXIsIG9mIHdoaWNoIHRoZSBmaXJzdCBlbGVtZW50IGlzIGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgICAgICAgICAgdG8gdGhlIHBvc3NpYmx5IGluc2VydGVkIGVsZW1lbnQsIGFuZCB0aGUgc2Vjb25kIGlzIGEgYm9vbAorICAgICAgICogICAgICAgICAgIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgZWxlbWVudCB3YXMgYWN0dWFsbHkgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gYnVpbGQgYW5kIGluc2VydCBhbiBlbGVtZW50IGludG8gdGhlICVzZXQuCisgICAgICAgKiAgQSAlc2V0IHJlbGllcyBvbiB1bmlxdWUga2V5cyBhbmQgdGh1cyBhbiBlbGVtZW50IGlzIG9ubHkgaW5zZXJ0ZWQgaWYKKyAgICAgICAqICBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSAlc2V0LgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01fdC5fTV9lbXBsYWNlX3VuaXF1ZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZSAlc2V0LgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUKKyAgICAgICAqICAgICAgICAgICAgICAgIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX19hcmdzICBBcmd1bWVudHMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZWxlbWVudCB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGVsZW1lbnQgd2l0aCBrZXkgZXF1aXZhbGVudCB0bworICAgICAgICogICAgICAgICAgdGhlIG9uZSBnZW5lcmF0ZWQgZnJvbSBAYSBfX2FyZ3MgKG1heSBvciBtYXkgbm90IGJlIHRoZQorICAgICAgICogICAgICAgICAgZWxlbWVudCBpdHNlbGYpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjb25jZXJuZWQgYWJvdXQgd2hldGhlciB0aGUgaW5zZXJ0aW9uIHRvb2sgcGxhY2UsCisgICAgICAgKiAgYW5kIHRodXMgZG9lcyBub3QgcmV0dXJuIGEgYm9vbGVhbiBsaWtlIHRoZSBzaW5nbGUtYXJndW1lbnQgZW1wbGFjZSgpCisgICAgICAgKiAgZG9lcy4gIE5vdGUgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4KKyAgICAgICAqICBwb3RlbnRpYWxseSBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuICBBIGJhZAorICAgICAgICogIGhpbnQgd291bGQgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIG1vcmUgb24gQGEgaGludGluZywgc2VlOgorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDdjaDE3Lmh0bWwKKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUgKGlmIHRoZSBoaW50IGlzIG5vdCB0YWtlbikuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICByZXR1cm4gX01fdC5fTV9lbXBsYWNlX2hpbnRfdW5pcXVlKF9fcG9zLAorCQkJCQkgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZSAlc2V0LgorICAgICAgICogIEBwYXJhbSAgX194ICBFbGVtZW50IHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gIEEgcGFpciwgb2Ygd2hpY2ggdGhlIGZpcnN0IGVsZW1lbnQgaXMgYW4gaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICAgICAgICAgICB0byB0aGUgcG9zc2libHkgaW5zZXJ0ZWQgZWxlbWVudCwgYW5kIHRoZSBzZWNvbmQgaXMgYSBib29sCisgICAgICAgKiAgICAgICAgICAgdGhhdCBpcyB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBhY3R1YWxseSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZSAlc2V0LiAgQSAlc2V0CisgICAgICAgKiAgcmVsaWVzIG9uIHVuaXF1ZSBrZXlzIGFuZCB0aHVzIGFuIGVsZW1lbnQgaXMgb25seSBpbnNlcnRlZCBpZiBpdCBpcworICAgICAgICogIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlICVzZXQuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBsb2dhcml0aG1pYyB0aW1lLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCXN0ZDo6cGFpcjx0eXBlbmFtZSBfUmVwX3R5cGU6Oml0ZXJhdG9yLCBib29sPiBfX3AgPQorCSAgX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9feCk7CisJcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4oX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydCh2YWx1ZV90eXBlJiYgX194KQorICAgICAgeworCXN0ZDo6cGFpcjx0eXBlbmFtZSBfUmVwX3R5cGU6Oml0ZXJhdG9yLCBib29sPiBfX3AgPQorCSAgX01fdC5fTV9pbnNlcnRfdW5pcXVlKHN0ZDo6bW92ZShfX3gpKTsKKwlyZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihfX3AuZmlyc3QsIF9fcC5zZWNvbmQpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZSAlc2V0LgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZQorICAgICAgICogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX194ICBFbGVtZW50IHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGVsZW1lbnQgd2l0aCBrZXkgb2YKKyAgICAgICAqICAgICAgICAgICBAYSBfX3ggKG1heSBvciBtYXkgbm90IGJlIHRoZSBlbGVtZW50IHBhc3NlZCBpbikuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgbm90IGNvbmNlcm5lZCBhYm91dCB3aGV0aGVyIHRoZSBpbnNlcnRpb24gdG9vayBwbGFjZSwKKyAgICAgICAqICBhbmQgdGh1cyBkb2VzIG5vdCByZXR1cm4gYSBib29sZWFuIGxpa2UgdGhlIHNpbmdsZS1hcmd1bWVudCBpbnNlcnQoKQorICAgICAgICogIGRvZXMuICBOb3RlIHRoYXQgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBvbmx5IGEgaGludCBhbmQgY2FuCisgICAgICAgKiAgcG90ZW50aWFsbHkgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGluc2VydGlvbiBwcm9jZXNzLiAgQSBiYWQKKyAgICAgICAqICBoaW50IHdvdWxkIGNhdXNlIG5vIGdhaW5zIGluIGVmZmljaWVuY3kuCisgICAgICAgKgorICAgICAgICogIEZvciBtb3JlIG9uIEBhIGhpbnRpbmcsIHNlZToKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBsb2dhcml0aG1pYyB0aW1lIChpZiB0aGUgaGludCBpcyBub3QgdGFrZW4pLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X3VuaXF1ZV8oX19wb3NpdGlvbiwgX194KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfdW5pcXVlXyhfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQSB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGF0dGVtcHRzIHRvIGluc2VydCBhIHJhbmdlCisgICAgICAgKiAgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSByYW5nZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdm9pZAorCWluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisJeyBfTV90Ll9NX2luc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhIGxpc3Qgb2YgZWxlbWVudHMgaW50byB0aGUgJXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQSBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gb2YgZWxlbWVudHMKKyAgICAgICAqICAgICAgICAgICAgICAgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSByYW5nZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyB0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMTMwLiBBc3NvY2lhdGl2ZSBlcmFzZSBzaG91bGQgcmV0dXJuIGFuIGl0ZXJhdG9yLgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhbiBlbGVtZW50IGZyb20gYSAlc2V0LgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nCisgICAgICAgKiAgICAgICAgICBAYSBfX3Bvc2l0aW9uIHByaW9yIHRvIHRoZSBlbGVtZW50IGJlaW5nIGVyYXNlZC4gSWYgbm8gc3VjaAorICAgICAgICogICAgICAgICAgZWxlbWVudCBleGlzdHMsIGVuZCgpIGlzIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbiBlbGVtZW50LCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpdGVyYXRvciwKKyAgICAgICAqICBmcm9tIGEgJXNldC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQKKyAgICAgICAqICB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QKKyAgICAgICAqICB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIF9HTElCQ1hYX0FCSV9UQUdfQ1hYMTEKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX3Bvc2l0aW9uKTsgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYW4gZWxlbWVudCBmcm9tIGEgJXNldC4KKyAgICAgICAqICBAcGFyYW0gIHBvc2l0aW9uICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFuIGVsZW1lbnQsIHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIGl0ZXJhdG9yLAorICAgICAgICogIGZyb20gYSAlc2V0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZAorICAgICAgICogIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdAorICAgICAgICogIHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgX01fdC5lcmFzZShfX3Bvc2l0aW9uKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYWxsIHRoZSBlbGVtZW50cyBsb2NhdGVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQorICAgICAgICogIGEgJXNldC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX3gpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGEgW19fZmlyc3QsX19sYXN0KSByYW5nZSBvZiBlbGVtZW50cyBmcm9tIGEgJXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICBlcmFzZWQuCisKKyAgICAgICAqICBAcGFyYW0gX19sYXN0IEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvCisgICAgICAgKiAgYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gVGhlIGl0ZXJhdG9yIEBhIF9fbGFzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBmcm9tIGEgJXNldC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgX0dMSUJDWFhfQUJJX1RBR19DWFgxMQorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYSBbZmlyc3QsbGFzdCkgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhICVzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEBwYXJhbSBfX2xhc3QgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UgdG8KKyAgICAgICAqICBiZSBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZnJvbSBhICVzZXQuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX01fdC5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgRXJhc2VzIGFsbCBlbGVtZW50cyBpbiBhICVzZXQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcworICAgICAgICogIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUKKyAgICAgICAqICBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMKKyAgICAgICAqICB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX3QuY2xlYXIoKTsgfQorCisgICAgICAvLyBzZXQgb3BlcmF0aW9uczoKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX194ICBFbGVtZW50IHRvIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgTnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggc3BlY2lmaWVkIGtleS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBvbmx5IG1ha2VzIHNlbnNlIGZvciBtdWx0aXNldHM7IGZvciBzZXQgdGhlIHJlc3VsdCB3aWxsCisgICAgICAgKiAgZWl0aGVyIGJlIDAgKG5vdCBwcmVzZW50KSBvciAxIChwcmVzZW50KS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5maW5kKF9feCkgPT0gX01fdC5lbmQoKSA/IDAgOiAxOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUcmllcyB0byBsb2NhdGUgYW4gZWxlbWVudCBpbiBhICVzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEVsZW1lbnQgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyB0byBzb3VnaHQtYWZ0ZXIgZWxlbWVudCwgb3IgZW5kKCkgaWYgbm90CisgICAgICAgKiAgICAgICAgICAgZm91bmQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBrZXkgYW5kIHRyaWVzIHRvIGxvY2F0ZSB0aGUgZWxlbWVudCB3aXRoIHdoaWNoCisgICAgICAgKiAgdGhlIGtleSBtYXRjaGVzLiAgSWYgc3VjY2Vzc2Z1bCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpdGVyYXRvcgorICAgICAgICogIHBvaW50aW5nIHRvIHRoZSBzb3VnaHQgYWZ0ZXIgZWxlbWVudC4gIElmIHVuc3VjY2Vzc2Z1bCBpdCByZXR1cm5zIHRoZQorICAgICAgICogIHBhc3QtdGhlLWVuZCAoIEBjIGVuZCgpICkgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHBvaW50aW5nIHRvIGZpcnN0IGVsZW1lbnQgZXF1YWwgdG8gb3IgZ3JlYXRlcgorICAgICAgICogICAgICAgICAgIHRoYW4ga2V5LCBvciBlbmQoKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgc3Vic2VxdWVuY2Ugb2YgZWxlbWVudHMKKyAgICAgICAqICB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGtleS4gIElmIHVuc3VjY2Vzc2Z1bCBpdCByZXR1cm5zIGFuIGl0ZXJhdG9yCisgICAgICAgKiAgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBoYXMgYSBncmVhdGVyIHZhbHVlIHRoYW4gZ2l2ZW4ga2V5CisgICAgICAgKiAgb3IgZW5kKCkgaWYgbm8gc3VjaCBlbGVtZW50IGV4aXN0cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBlbmQgb2YgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQKKyAgICAgICAqICAgICAgICAgIGdyZWF0ZXIgdGhhbiBrZXksIG9yIGVuZCgpLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIFBhaXIgb2YgaXRlcmF0b3JzIHRoYXQgcG9zc2libHkgcG9pbnRzIHRvIHRoZSBzdWJzZXF1ZW5jZQorICAgICAgICogICAgICAgICAgIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvCisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICAgIHN0ZDo6bWFrZV9wYWlyKGMubG93ZXJfYm91bmQodmFsKSwKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGMudXBwZXJfYm91bmQodmFsKSkKKyAgICAgICAqICBAZW5kY29kZQorICAgICAgICogIChidXQgaXMgZmFzdGVyIHRoYW4gbWFraW5nIHRoZSBjYWxscyBzZXBhcmF0ZWx5KS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwcm9iYWJseSBvbmx5IG1ha2VzIHNlbnNlIGZvciBtdWx0aXNldHMuCisgICAgICAgKi8KKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOyB9CisgICAgICAvL0B9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LMSwgdHlwZW5hbWUgX0MxLCB0eXBlbmFtZSBfQTE+CisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHNldDxfSzEsIF9DMSwgX0ExPiYsIGNvbnN0IHNldDxfSzEsIF9DMSwgX0ExPiYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSzEsIHR5cGVuYW1lIF9DMSwgdHlwZW5hbWUgX0ExPgorCWZyaWVuZCBib29sCisJb3BlcmF0b3I8KGNvbnN0IHNldDxfSzEsIF9DMSwgX0ExPiYsIGNvbnN0IHNldDxfSzEsIF9DMSwgX0ExPiYpOworICAgIH07CisKKworICAvKioKKyAgICogIEBicmllZiAgU2V0IGVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqICBAcGFyYW0gIF9feCAgQSAlc2V0LgorICAgKiAgQHBhcmFtICBfX3kgIEEgJXNldCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiB0aGUgc2l6ZSBhbmQgZWxlbWVudHMgb2YgdGhlIHNldHMgYXJlIGVxdWFsLgorICAgKgorICAgKiAgVGhpcyBpcyBhbiBlcXVpdmFsZW5jZSByZWxhdGlvbi4gIEl0IGlzIGxpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgc2V0cy4KKyAgICogIFNldHMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiB0aGVpciBzaXplcyBhcmUgZXF1YWwsIGFuZCBpZgorICAgKiAgY29ycmVzcG9uZGluZyBlbGVtZW50cyBjb21wYXJlIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX3QgPT0gX195Ll9NX3Q7IH0KKworICAvKioKKyAgICogIEBicmllZiAgU2V0IG9yZGVyaW5nIHJlbGF0aW9uLgorICAgKiAgQHBhcmFtICBfX3ggIEEgJXNldC4KKyAgICogIEBwYXJhbSAgX195ICBBICVzZXQgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSB4LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgQGEgX194IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSBfX3kuCisgICAqCisgICAqICBUaGlzIGlzIGEgdG90YWwgb3JkZXJpbmcgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBtYXBzLiAgVGhlIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSB3aXRoIEBjIDwuCisgICAqCisgICAqICBTZWUgc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgpIGZvciBob3cgdGhlIGRldGVybWluYXRpb24gaXMgbWFkZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fdCA8IF9feS5fTV90OyB9CisKKyAgLy8vICBSZXR1cm5zICEoeCA9PSB5KS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAvLy8gIFJldHVybnMgeSA8IHguCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgLy8vICBSZXR1cm5zICEoeSA8IHgpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICAvLy8gIFJldHVybnMgISh4IDwgeSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIC8vLyBTZWUgc3RkOjpzZXQ6OnN3YXAoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsIHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvL25hbWVzcGFjZSBzdGQKKyNlbmRpZiAvKiBfU1RMX1NFVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3N0YWNrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3N0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjYTA0YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfc3RhY2suaApAQCAtMCwwICsxLDMwMyBAQAorLy8gU3RhY2sgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX3N0YWNrLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtzdGFja30KKyAqLworCisjaWZuZGVmIF9TVExfU1RBQ0tfSAorI2RlZmluZSBfU1RMX1NUQUNLX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmICBBIHN0YW5kYXJkIGNvbnRhaW5lciBnaXZpbmcgRklMTyBiZWhhdmlvci4KKyAgICoKKyAgICogIEBpbmdyb3VwIHNlcXVlbmNlcworICAgKgorICAgKiAgQHRwYXJhbSBfVHAgIFR5cGUgb2YgZWxlbWVudC4KKyAgICogIEB0cGFyYW0gX1NlcXVlbmNlICBUeXBlIG9mIHVuZGVybHlpbmcgc2VxdWVuY2UsIGRlZmF1bHRzIHRvIGRlcXVlPF9UcD4uCisgICAqCisgICAqICBNZWV0cyBtYW55IG9mIHRoZSByZXF1aXJlbWVudHMgb2YgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sCisgICAqICBidXQgZG9lcyBub3QgZGVmaW5lIGFueXRoaW5nIHRvIGRvIHdpdGggaXRlcmF0b3JzLiAgVmVyeSBmZXcgb2YgdGhlCisgICAqICBvdGhlciBzdGFuZGFyZCBjb250YWluZXIgaW50ZXJmYWNlcyBhcmUgZGVmaW5lZC4KKyAgICoKKyAgICogIFRoaXMgaXMgbm90IGEgdHJ1ZSBjb250YWluZXIsIGJ1dCBhbiBAZSBhZGFwdG9yLiAgSXQgaG9sZHMKKyAgICogIGFub3RoZXIgY29udGFpbmVyLCBhbmQgcHJvdmlkZXMgYSB3cmFwcGVyIGludGVyZmFjZSB0byB0aGF0CisgICAqICBjb250YWluZXIuICBUaGUgd3JhcHBlciBpcyB3aGF0IGVuZm9yY2VzIHN0cmljdAorICAgKiAgZmlyc3QtaW4tbGFzdC1vdXQgJXN0YWNrIGJlaGF2aW9yLgorICAgKgorICAgKiAgVGhlIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZworICAgKiAgc2VxdWVuY2UvY29udGFpbmVyLiAgSXQgZGVmYXVsdHMgdG8gc3RkOjpkZXF1ZSwgYnV0IGl0IGNhbiBiZQorICAgKiAgYW55IHR5cGUgdGhhdCBzdXBwb3J0cyBAYyBiYWNrLCBAYyBwdXNoX2JhY2ssIGFuZCBAYyBwb3BfZnJvbnQsCisgICAqICBzdWNoIGFzIHN0ZDo6bGlzdCwgc3RkOjp2ZWN0b3IsIG9yIGFuIGFwcHJvcHJpYXRlIHVzZXItZGVmaW5lZAorICAgKiAgdHlwZS4KKyAgICoKKyAgICogIE1lbWJlcnMgbm90IGZvdW5kIGluIEBhIG5vcm1hbCBjb250YWluZXJzIGFyZSBAYyBjb250YWluZXJfdHlwZSwKKyAgICogIHdoaWNoIGlzIGEgdHlwZWRlZiBmb3IgdGhlIHNlY29uZCBTZXF1ZW5jZSBwYXJhbWV0ZXIsIGFuZCBAYworICAgKiAgcHVzaCwgQGMgcG9wLCBhbmQgQGMgdG9wLCB3aGljaCBhcmUgc3RhbmRhcmQgJXN0YWNrL0ZJTE8KKyAgICogIG9wZXJhdGlvbnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcXVlbmNlID0gZGVxdWU8X1RwPiA+CisgICAgY2xhc3Mgc3RhY2sKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgX1NlcXVlbmNlX3ZhbHVlX3R5cGU7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1RwLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1NlcXVlbmNlLCBfQmFja0luc2VydGlvblNlcXVlbmNlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczIoX1RwLCBfU2VxdWVuY2VfdmFsdWVfdHlwZSwgX1NhbWVUeXBlQ29uY2VwdCkKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1NlcTE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3Qgc3RhY2s8X1RwMSwgX1NlcTE+JiwgY29uc3Qgc3RhY2s8X1RwMSwgX1NlcTE+Jik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9TZXExPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcjwoY29uc3Qgc3RhY2s8X1RwMSwgX1NlcTE+JiwgY29uc3Qgc3RhY2s8X1RwMSwgX1NlcTE+Jik7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZSAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnJlZmVyZW5jZSAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnNpemVfdHlwZSAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiAgICAgICAgICBfU2VxdWVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyAgU2VlIHF1ZXVlOjpjIGZvciBub3RlcyBvbiB0aGlzIG5hbWUuCisgICAgICBfU2VxdWVuY2UgYzsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIFhYWCByZW1vdmVkIG9sZCBkZWYgY3RvciwgYWRkZWQgZGVmIGFyZyB0byB0aGlzIG9uZSB0byBtYXRjaCAxNDg4MgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgbm8gZWxlbWVudHMuCisgICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgICAgIGV4cGxpY2l0CisgICAgICBzdGFjayhjb25zdCBfU2VxdWVuY2UmIF9fYyA9IF9TZXF1ZW5jZSgpKQorICAgICAgOiBjKF9fYykgeyB9CisjZWxzZQorICAgICAgZXhwbGljaXQKKyAgICAgIHN0YWNrKGNvbnN0IF9TZXF1ZW5jZSYgX19jKQorICAgICAgOiBjKF9fYykgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBzdGFjayhfU2VxdWVuY2UmJiBfX2MgPSBfU2VxdWVuY2UoKSkKKyAgICAgIDogYyhzdGQ6Om1vdmUoX19jKSkgeyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSAlc3RhY2sgaXMgZW1wdHkuCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGMuZW1wdHkoKTsgfQorCisgICAgICAvKiogIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgJXN0YWNrLiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBjLnNpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXN0YWNrLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIHRvcCgpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX25vbmVtcHR5KCk7CisJcmV0dXJuIGMuYmFjaygpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVzdGFjay4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICB0b3AoKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19ub25lbXB0eSgpOworCXJldHVybiBjLmJhY2soKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBZGQgZGF0YSB0byB0aGUgdG9wIG9mIHRoZSAlc3RhY2suCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgdG8gYmUgYWRkZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsICVzdGFjayBvcGVyYXRpb24uICBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhbgorICAgICAgICogIGVsZW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgJXN0YWNrIGFuZCBhc3NpZ25zIHRoZSBnaXZlbiBkYXRhCisgICAgICAgKiAgdG8gaXQuICBUaGUgdGltZSBjb21wbGV4aXR5IG9mIHRoZSBvcGVyYXRpb24gZGVwZW5kcyBvbiB0aGUKKyAgICAgICAqICB1bmRlcmx5aW5nIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgYy5wdXNoX2JhY2soX194KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgcHVzaCh2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyBjLnB1c2hfYmFjayhzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7IGMuZW1wbGFjZV9iYWNrKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZXMgZmlyc3QgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgJXN0YWNrIG9wZXJhdGlvbi4gIEl0IHNocmlua3MgdGhlICVzdGFjaworICAgICAgICogIGJ5IG9uZS4gIFRoZSB0aW1lIGNvbXBsZXhpdHkgb2YgdGhlIG9wZXJhdGlvbiBkZXBlbmRzIG9uIHRoZQorICAgICAgICogIHVuZGVybHlpbmcgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCBubyBkYXRhIGlzIHJldHVybmVkLCBhbmQgaWYgdGhlIGZpcnN0IGVsZW1lbnQncworICAgICAgICogIGRhdGEgaXMgbmVlZGVkLCBpdCBzaG91bGQgYmUgcmV0cmlldmVkIGJlZm9yZSBwb3AoKSBpcworICAgICAgICogIGNhbGxlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcG9wKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfbm9uZW1wdHkoKTsKKwljLnBvcF9iYWNrKCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBzd2FwKHN0YWNrJiBfX3MpCisgICAgICBub2V4Y2VwdChub2V4Y2VwdChzd2FwKGMsIF9fcy5jKSkpCisgICAgICB7CisJdXNpbmcgc3RkOjpzd2FwOworCXN3YXAoYywgX19zLmMpOworICAgICAgfQorI2VuZGlmCisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgU3RhY2sgZXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICVzdGFjay4KKyAgICogIEBwYXJhbSAgX195ICBBICVzdGFjayBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIF9feC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIHRoZSBzaXplIGFuZCBlbGVtZW50cyBvZiB0aGUgc3RhY2tzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBDb21wbGV4aXR5IGFuZCBzZW1hbnRpY3MKKyAgICogIGRlcGVuZCBvbiB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZSB0eXBlLCBidXQgdGhlIGV4cGVjdGVkIHJ1bGVzCisgICAqICBhcmU6IHRoaXMgcmVsYXRpb24gaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZSBzZXF1ZW5jZXMsIGFuZAorICAgKiAgc3RhY2tzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgdGhlaXIgc2VxdWVuY2VzIGNvbXBhcmUKKyAgICogIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHN0YWNrPF9UcCwgX1NlcT4mIF9feCwgY29uc3Qgc3RhY2s8X1RwLCBfU2VxPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5jID09IF9feS5jOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFN0YWNrIG9yZGVyaW5nIHJlbGF0aW9uLgorICAgKiAgQHBhcmFtICBfX3ggIEEgJXN0YWNrLgorICAgKiAgQHBhcmFtICBfX3kgIEEgJXN0YWNrIG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgeC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIEBhIHggaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuIEBhIF9feS4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gdG90YWwgb3JkZXJpbmcgcmVsYXRpb24uICBDb21wbGV4aXR5IGFuZCBzZW1hbnRpY3MKKyAgICogIGRlcGVuZCBvbiB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZSB0eXBlLCBidXQgdGhlIGV4cGVjdGVkIHJ1bGVzCisgICAqICBhcmU6IHRoaXMgcmVsYXRpb24gaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZSBzZXF1ZW5jZXMsIHRoZQorICAgKiAgZWxlbWVudHMgbXVzdCBiZSBjb21wYXJhYmxlIHdpdGggQGMgPCwgYW5kCisgICAqICBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKCkgaXMgdXN1YWxseSB1c2VkIHRvIG1ha2UgdGhlCisgICAqICBkZXRlcm1pbmF0aW9uLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc3RhY2s8X1RwLCBfU2VxPiYgX194LCBjb25zdCBzdGFjazxfVHAsIF9TZXE+JiBfX3kpCisgICAgeyByZXR1cm4gX194LmMgPCBfX3kuYzsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcj09CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RhY2s8X1RwLCBfU2VxPiYgX194LCBjb25zdCBzdGFjazxfVHAsIF9TZXE+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHN0YWNrPF9UcCwgX1NlcT4mIF9feCwgY29uc3Qgc3RhY2s8X1RwLCBfU2VxPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzdGFjazxfVHAsIF9TZXE+JiBfX3gsIGNvbnN0IHN0YWNrPF9UcCwgX1NlcT4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3RhY2s8X1RwLCBfU2VxPiYgX194LCBjb25zdCBzdGFjazxfVHAsIF9TZXE+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoc3RhY2s8X1RwLCBfU2VxPiYgX194LCBzdGFjazxfVHAsIF9TZXE+JiBfX3kpCisgICAgbm9leGNlcHQobm9leGNlcHQoX194LnN3YXAoX195KSkpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHVzZXNfYWxsb2NhdG9yPHN0YWNrPF9UcCwgX1NlcT4sIF9BbGxvYz4KKyAgICA6IHB1YmxpYyB1c2VzX2FsbG9jYXRvcjxfU2VxLCBfQWxsb2M+Ojp0eXBlIHsgfTsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfU1RMX1NUQUNLX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfdGVtcGJ1Zi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF90ZW1wYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlNzA1YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfdGVtcGJ1Zi5oCkBAIC0wLDAgKzEsMjcxIEBACisvLyBUZW1wb3JhcnkgYnVmZmVyIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF90ZW1wYnVmLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttZW1vcnl9CisgKi8KKworI2lmbmRlZiBfU1RMX1RFTVBCVUZfSAorI2RlZmluZSBfU1RMX1RFTVBCVUZfSCAxCisKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2NvbnN0cnVjdC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgQWxsb2NhdGVzIGEgdGVtcG9yYXJ5IGJ1ZmZlci4KKyAgICogIEBwYXJhbSAgX19sZW4gIFRoZSBudW1iZXIgb2Ygb2JqZWN0cyBvZiB0eXBlIFRwLgorICAgKiAgQHJldHVybiBTZWUgZnVsbCBkZXNjcmlwdGlvbi4KKyAgICoKKyAgICogIFJlaW52ZW50aW5nIHRoZSB3aGVlbCwgYnV0IHRoaXMgdGltZSB3aXRoIHByZXR0aWVyIHNwb2tlcyEKKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gb2J0YWluIHN0b3JhZ2UgZm9yIEBjIF9fbGVuIGFkamFjZW50IFRwCisgICAqICBvYmplY3RzLiAgVGhlIG9iamVjdHMgdGhlbXNlbHZlcyBhcmUgbm90IGNvbnN0cnVjdGVkLCBvZiBjb3Vyc2UuCisgICAqICBBIHBhaXI8PiBpcyByZXR1cm5lZCBjb250YWluaW5nIDxlbT50aGUgYnVmZmVyIHMgYWRkcmVzcyBhbmQKKyAgICogIGNhcGFjaXR5IChpbiB0aGUgdW5pdHMgb2Ygc2l6ZW9mKF9UcCkpLCBvciBhIHBhaXIgb2YgMCB2YWx1ZXMgaWYKKyAgICogIG5vIHN0b3JhZ2UgY2FuIGJlIG9idGFpbmVkLjwvZW0+ICBOb3RlIHRoYXQgdGhlIGNhcGFjaXR5IG9idGFpbmVkCisgICAqICBtYXkgYmUgbGVzcyB0aGFuIHRoYXQgcmVxdWVzdGVkIGlmIHRoZSBtZW1vcnkgaXMgdW5hdmFpbGFibGU7CisgICAqICB5b3Ugc2hvdWxkIGNvbXBhcmUgbGVuIHdpdGggdGhlIC5zZWNvbmQgcmV0dXJuIHZhbHVlLgorICAgKgorICAgKiBQcm92aWRlcyB0aGUgbm90aHJvdyBleGNlcHRpb24gZ3VhcmFudGVlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHBhaXI8X1RwKiwgcHRyZGlmZl90PgorICAgIGdldF90ZW1wb3JhcnlfYnVmZmVyKHB0cmRpZmZfdCBfX2xlbikgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBjb25zdCBwdHJkaWZmX3QgX19tYXggPQorCV9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxwdHJkaWZmX3Q+OjpfX21heCAvIHNpemVvZihfVHApOworICAgICAgaWYgKF9fbGVuID4gX19tYXgpCisJX19sZW4gPSBfX21heDsKKyAgICAgIAorICAgICAgd2hpbGUgKF9fbGVuID4gMCkgCisJeworCSAgX1RwKiBfX3RtcCA9IHN0YXRpY19jYXN0PF9UcCo+KDo6b3BlcmF0b3IgbmV3KF9fbGVuICogc2l6ZW9mKF9UcCksIAorCQkJCQkJCXN0ZDo6bm90aHJvdykpOworCSAgaWYgKF9fdG1wICE9IDApCisJICAgIHJldHVybiBzdGQ6OnBhaXI8X1RwKiwgcHRyZGlmZl90PihfX3RtcCwgX19sZW4pOworCSAgX19sZW4gLz0gMjsKKwl9CisgICAgICByZXR1cm4gc3RkOjpwYWlyPF9UcCosIHB0cmRpZmZfdD4oc3RhdGljX2Nhc3Q8X1RwKj4oMCksIDApOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBUaGUgY29tcGFuaW9uIHRvIGdldF90ZW1wb3JhcnlfYnVmZmVyKCkuCisgICAqICBAcGFyYW0gIF9fcCAgQSBidWZmZXIgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgZ2V0X3RlbXBvcmFyeV9idWZmZXIuCisgICAqICBAcmV0dXJuICAgTm9uZS4KKyAgICoKKyAgICogIEZyZWVzIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBfX3AuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICByZXR1cm5fdGVtcG9yYXJ5X2J1ZmZlcihfVHAqIF9fcCkKKyAgICB7IDo6b3BlcmF0b3IgZGVsZXRlKF9fcCwgc3RkOjpub3Rocm93KTsgfQorCisKKyAgLyoqCisgICAqICBUaGlzIGNsYXNzIGlzIHVzZWQgaW4gdHdvIHBsYWNlczogc3RsX2FsZ28uaCBhbmQgZXh0L21lbW9yeSwKKyAgICogIHdoZXJlIGl0IGlzIHdyYXBwZWQgYXMgdGhlIHRlbXBvcmFyeV9idWZmZXIgY2xhc3MuICBTZWUKKyAgICogIHRlbXBvcmFyeV9idWZmZXIgZG9jcyBmb3IgbW9yZSBub3Rlcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfVGVtcG9yYXJ5X2J1ZmZlcgorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQpCisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUqIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHBvaW50ZXIgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICBzaXplX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBzaXplX3R5cGUgIF9NX29yaWdpbmFsX2xlbjsKKyAgICAgIHNpemVfdHlwZSAgX01fbGVuOworICAgICAgcG9pbnRlciAgICBfTV9idWZmZXI7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gQXMgcGVyIFRhYmxlIG11bWJsZS4KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9sZW47IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIHNpemUgcmVxdWVzdGVkIGJ5IHRoZSBjb25zdHJ1Y3RvcjsgbWF5IGJlID5zaXplKCkuCisgICAgICBzaXplX3R5cGUKKyAgICAgIHJlcXVlc3RlZF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX29yaWdpbmFsX2xlbjsgfQorCisgICAgICAvLy8gQXMgcGVyIFRhYmxlIG11bWJsZS4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBfTV9idWZmZXI7IH0KKworICAgICAgLy8vIEFzIHBlciBUYWJsZSBtdW1ibGUuCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIF9NX2J1ZmZlciArIF9NX2xlbjsgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSB0ZW1wb3JhcnkgYnVmZmVyIG9mIGEgc2l6ZSBzb21ld2hlcmUgYmV0d2VlbgorICAgICAgICogemVybyBhbmQgdGhlIHNpemUgb2YgdGhlIGdpdmVuIHJhbmdlLgorICAgICAgICovCisgICAgICBfVGVtcG9yYXJ5X2J1ZmZlcihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KTsKKworICAgICAgfl9UZW1wb3JhcnlfYnVmZmVyKCkKKyAgICAgIHsKKwlzdGQ6Ol9EZXN0cm95KF9NX2J1ZmZlciwgX01fYnVmZmVyICsgX01fbGVuKTsKKwlzdGQ6OnJldHVybl90ZW1wb3JhcnlfYnVmZmVyKF9NX2J1ZmZlcik7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gRGlzYWJsZSBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgX1RlbXBvcmFyeV9idWZmZXIoY29uc3QgX1RlbXBvcmFyeV9idWZmZXImKTsKKworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9UZW1wb3JhcnlfYnVmZmVyJik7CisgICAgfTsKKworCisgIHRlbXBsYXRlPGJvb2w+CisgICAgc3RydWN0IF9fdW5pbml0aWFsaXplZF9jb25zdHJ1Y3RfYnVmX2Rpc3BhdGNoCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BvaW50ZXIsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fdWNyKF9Qb2ludGVyIF9fZmlyc3QsIF9Qb2ludGVyIF9fbGFzdCwKKwkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fc2VlZCkKKyAgICAgICAgeworCSAgaWYoX19maXJzdCA9PSBfX2xhc3QpCisJICAgIHJldHVybjsKKworCSAgX1BvaW50ZXIgX19jdXIgPSBfX2ZpcnN0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIHN0ZDo6X0NvbnN0cnVjdChzdGQ6Ol9fYWRkcmVzc29mKCpfX2ZpcnN0KSwKKwkJCSAgICAgIF9HTElCQ1hYX01PVkUoKl9fc2VlZCkpOworCSAgICAgIF9Qb2ludGVyIF9fcHJldiA9IF9fY3VyOworCSAgICAgICsrX19jdXI7CisJICAgICAgZm9yKDsgX19jdXIgIT0gX19sYXN0OyArK19fY3VyLCArK19fcHJldikKKwkJc3RkOjpfQ29uc3RydWN0KHN0ZDo6X19hZGRyZXNzb2YoKl9fY3VyKSwKKwkJCQlfR0xJQkNYWF9NT1ZFKCpfX3ByZXYpKTsKKwkgICAgICAqX19zZWVkID0gX0dMSUJDWFhfTU9WRSgqX19wcmV2KTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QsIF9fY3VyKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX191bmluaXRpYWxpemVkX2NvbnN0cnVjdF9idWZfZGlzcGF0Y2g8dHJ1ZT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUG9pbnRlciwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX191Y3IoX1BvaW50ZXIsIF9Qb2ludGVyLCBfRm9yd2FyZEl0ZXJhdG9yKSB7IH0KKyAgICB9OworCisgIC8vIENvbnN0cnVjdHMgb2JqZWN0cyBpbiB0aGUgcmFuZ2UgW2ZpcnN0LCBsYXN0KS4KKyAgLy8gTm90ZSB0aGF0IHdoaWxlIHRoZXNlIG5ldyBvYmplY3RzIHdpbGwgdGFrZSB2YWxpZCB2YWx1ZXMsCisgIC8vIHRoZWlyIGV4YWN0IHZhbHVlIGlzIG5vdCBkZWZpbmVkLiBJbiBwYXJ0aWN1bGFyIHRoZXkgbWF5CisgIC8vIGJlICdtb3ZlZCBmcm9tJy4KKyAgLy8KKyAgLy8gV2hpbGUgKl9fc2VlZCBtYXkgYmUgYWx0ZXJlZCBkdXJpbmcgdGhpcyBhbGdvcml0aG0sIGl0IHdpbGwgaGF2ZQorICAvLyB0aGUgc2FtZSB2YWx1ZSB3aGVuIHRoZSBhbGdvcml0aG0gZmluaXNoZXMsIHVubGVzcyBvbmUgb2YgdGhlCisgIC8vIGNvbnN0cnVjdGlvbnMgdGhyb3dzLgorICAvLworICAvLyBSZXF1aXJlbWVudHM6IF9Qb2ludGVyOjp2YWx1ZV90eXBlKF9UcCYmKSBpcyB2YWxpZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1BvaW50ZXIsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3VuaW5pdGlhbGl6ZWRfY29uc3RydWN0X2J1ZihfUG9pbnRlciBfX2ZpcnN0LCBfUG9pbnRlciBfX2xhc3QsCisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yIF9fc2VlZCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9Qb2ludGVyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2NvbnN0cnVjdF9idWZfZGlzcGF0Y2g8CisgICAgICAgIF9faGFzX3RyaXZpYWxfY29uc3RydWN0b3IoX1ZhbHVlVHlwZSk+OjoKKwkgIF9fdWNyKF9fZmlyc3QsIF9fbGFzdCwgX19zZWVkKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIF9UZW1wb3JhcnlfYnVmZmVyPF9Gb3J3YXJkSXRlcmF0b3IsIF9UcD46OgorICAgIF9UZW1wb3JhcnlfYnVmZmVyKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgOiBfTV9vcmlnaW5hbF9sZW4oc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpKSwKKyAgICAgIF9NX2xlbigwKSwgX01fYnVmZmVyKDApCisgICAgeworICAgICAgX190cnkKKwl7CisJICBzdGQ6OnBhaXI8cG9pbnRlciwgc2l6ZV90eXBlPiBfX3Aoc3RkOjpnZXRfdGVtcG9yYXJ5X2J1ZmZlcjwKKwkJCQkJICAgIHZhbHVlX3R5cGU+KF9NX29yaWdpbmFsX2xlbikpOworCSAgX01fYnVmZmVyID0gX19wLmZpcnN0OworCSAgX01fbGVuID0gX19wLnNlY29uZDsKKwkgIGlmIChfTV9idWZmZXIpCisJICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2NvbnN0cnVjdF9idWYoX01fYnVmZmVyLCBfTV9idWZmZXIgKyBfTV9sZW4sCisJCQkJCSAgICAgICBfX2ZpcnN0KTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6OnJldHVybl90ZW1wb3JhcnlfYnVmZmVyKF9NX2J1ZmZlcik7CisJICBfTV9idWZmZXIgPSAwOworCSAgX01fbGVuID0gMDsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9TVExfVEVNUEJVRl9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfdHJlZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF90cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiZjRkZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfdHJlZS5oCkBAIC0wLDAgKzEsMTg2NyBAQAorLy8gUkIgdHJlZSBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF90cmVlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttYXAsc2V0fQorICovCisKKyNpZm5kZWYgX1NUTF9UUkVFX0gKKyNkZWZpbmUgX1NUTF9UUkVFX0ggMQorCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+CisjaW5jbHVkZSA8Yml0cy9jcHBfdHlwZV90cmFpdHMuaD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8Yml0cy9hbGxvY190cmFpdHMuaD4KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gUmVkLWJsYWNrIHRyZWUgY2xhc3MsIGRlc2lnbmVkIGZvciB1c2UgaW4gaW1wbGVtZW50aW5nIFNUTAorICAvLyBhc3NvY2lhdGl2ZSBjb250YWluZXJzIChzZXQsIG11bHRpc2V0LCBtYXAsIGFuZCBtdWx0aW1hcCkuIFRoZQorICAvLyBpbnNlcnRpb24gYW5kIGRlbGV0aW9uIGFsZ29yaXRobXMgYXJlIGJhc2VkIG9uIHRob3NlIGluIENvcm1lbiwKKyAgLy8gTGVpc2Vyc29uLCBhbmQgUml2ZXN0LCBJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtcyAoTUlUIFByZXNzLAorICAvLyAxOTkwKSwgZXhjZXB0IHRoYXQKKyAgLy8KKyAgLy8gKDEpIHRoZSBoZWFkZXIgY2VsbCBpcyBtYWludGFpbmVkIHdpdGggbGlua3Mgbm90IG9ubHkgdG8gdGhlIHJvb3QKKyAgLy8gYnV0IGFsc28gdG8gdGhlIGxlZnRtb3N0IG5vZGUgb2YgdGhlIHRyZWUsIHRvIGVuYWJsZSBjb25zdGFudAorICAvLyB0aW1lIGJlZ2luKCksIGFuZCB0byB0aGUgcmlnaHRtb3N0IG5vZGUgb2YgdGhlIHRyZWUsIHRvIGVuYWJsZQorICAvLyBsaW5lYXIgdGltZSBwZXJmb3JtYW5jZSB3aGVuIHVzZWQgd2l0aCB0aGUgZ2VuZXJpYyBzZXQgYWxnb3JpdGhtcworICAvLyAoc2V0X3VuaW9uLCBldGMuKQorICAvLyAKKyAgLy8gKDIpIHdoZW4gYSBub2RlIGJlaW5nIGRlbGV0ZWQgaGFzIHR3byBjaGlsZHJlbiBpdHMgc3VjY2Vzc29yIG5vZGUKKyAgLy8gaXMgcmVsaW5rZWQgaW50byBpdHMgcGxhY2UsIHJhdGhlciB0aGFuIGNvcGllZCwgc28gdGhhdCB0aGUgb25seQorICAvLyBpdGVyYXRvcnMgaW52YWxpZGF0ZWQgYXJlIHRob3NlIHJlZmVycmluZyB0byB0aGUgZGVsZXRlZCBub2RlLgorCisgIGVudW0gX1JiX3RyZWVfY29sb3IgeyBfU19yZWQgPSBmYWxzZSwgX1NfYmxhY2sgPSB0cnVlIH07CisKKyAgc3RydWN0IF9SYl90cmVlX25vZGVfYmFzZQorICB7CisgICAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9CYXNlX3B0cjsKKyAgICB0eXBlZGVmIGNvbnN0IF9SYl90cmVlX25vZGVfYmFzZSogX0NvbnN0X0Jhc2VfcHRyOworCisgICAgX1JiX3RyZWVfY29sb3IJX01fY29sb3I7CisgICAgX0Jhc2VfcHRyCQlfTV9wYXJlbnQ7CisgICAgX0Jhc2VfcHRyCQlfTV9sZWZ0OworICAgIF9CYXNlX3B0cgkJX01fcmlnaHQ7CisKKyAgICBzdGF0aWMgX0Jhc2VfcHRyCisgICAgX1NfbWluaW11bShfQmFzZV9wdHIgX194KQorICAgIHsKKyAgICAgIHdoaWxlIChfX3gtPl9NX2xlZnQgIT0gMCkgX194ID0gX194LT5fTV9sZWZ0OworICAgICAgcmV0dXJuIF9feDsKKyAgICB9CisKKyAgICBzdGF0aWMgX0NvbnN0X0Jhc2VfcHRyCisgICAgX1NfbWluaW11bShfQ29uc3RfQmFzZV9wdHIgX194KQorICAgIHsKKyAgICAgIHdoaWxlIChfX3gtPl9NX2xlZnQgIT0gMCkgX194ID0gX194LT5fTV9sZWZ0OworICAgICAgcmV0dXJuIF9feDsKKyAgICB9CisKKyAgICBzdGF0aWMgX0Jhc2VfcHRyCisgICAgX1NfbWF4aW11bShfQmFzZV9wdHIgX194KQorICAgIHsKKyAgICAgIHdoaWxlIChfX3gtPl9NX3JpZ2h0ICE9IDApIF9feCA9IF9feC0+X01fcmlnaHQ7CisgICAgICByZXR1cm4gX194OworICAgIH0KKworICAgIHN0YXRpYyBfQ29uc3RfQmFzZV9wdHIKKyAgICBfU19tYXhpbXVtKF9Db25zdF9CYXNlX3B0ciBfX3gpCisgICAgeworICAgICAgd2hpbGUgKF9feC0+X01fcmlnaHQgIT0gMCkgX194ID0gX194LT5fTV9yaWdodDsKKyAgICAgIHJldHVybiBfX3g7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWw+CisgICAgc3RydWN0IF9SYl90cmVlX25vZGUgOiBwdWJsaWMgX1JiX3RyZWVfbm9kZV9iYXNlCisgICAgeworICAgICAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlPF9WYWw+KiBfTGlua190eXBlOworICAgICAgX1ZhbCBfTV92YWx1ZV9maWVsZDsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBfUmJfdHJlZV9ub2RlKF9BcmdzJiYuLi4gX19hcmdzKQorCTogX1JiX3RyZWVfbm9kZV9iYXNlKCksCisJICBfTV92YWx1ZV9maWVsZChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pIHsgfQorI2VuZGlmCisgICAgfTsKKworICBfR0xJQkNYWF9QVVJFIF9SYl90cmVlX25vZGVfYmFzZSoKKyAgX1JiX3RyZWVfaW5jcmVtZW50KF9SYl90cmVlX25vZGVfYmFzZSogX194KSB0aHJvdyAoKTsKKworICBfR0xJQkNYWF9QVVJFIGNvbnN0IF9SYl90cmVlX25vZGVfYmFzZSoKKyAgX1JiX3RyZWVfaW5jcmVtZW50KGNvbnN0IF9SYl90cmVlX25vZGVfYmFzZSogX194KSB0aHJvdyAoKTsKKworICBfR0xJQkNYWF9QVVJFIF9SYl90cmVlX25vZGVfYmFzZSoKKyAgX1JiX3RyZWVfZGVjcmVtZW50KF9SYl90cmVlX25vZGVfYmFzZSogX194KSB0aHJvdyAoKTsKKworICBfR0xJQkNYWF9QVVJFIGNvbnN0IF9SYl90cmVlX25vZGVfYmFzZSoKKyAgX1JiX3RyZWVfZGVjcmVtZW50KGNvbnN0IF9SYl90cmVlX25vZGVfYmFzZSogX194KSB0aHJvdyAoKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SYl90cmVlX2l0ZXJhdG9yCisgICAgeworICAgICAgdHlwZWRlZiBfVHAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCYgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAqIHBvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiBfUmJfdHJlZV9pdGVyYXRvcjxfVHA+ICAgICAgICBfU2VsZjsKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlOjpfQmFzZV9wdHIgX0Jhc2VfcHRyOworICAgICAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlPF9UcD4qICAgICAgICAgICBfTGlua190eXBlOworCisgICAgICBfUmJfdHJlZV9pdGVyYXRvcigpCisgICAgICA6IF9NX25vZGUoKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9SYl90cmVlX2l0ZXJhdG9yKF9MaW5rX3R5cGUgX194KQorICAgICAgOiBfTV9ub2RlKF9feCkgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+KF9NX25vZGUpLT5fTV92YWx1ZV9maWVsZDsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2Yoc3RhdGljX2Nhc3Q8X0xpbmtfdHlwZT4KKwkJCQkoX01fbm9kZSktPl9NX3ZhbHVlX2ZpZWxkKTsgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9NX25vZGUgPSBfUmJfdHJlZV9pbmNyZW1lbnQoX01fbm9kZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX1NlbGYgX190bXAgPSAqdGhpczsKKwlfTV9ub2RlID0gX1JiX3RyZWVfaW5jcmVtZW50KF9NX25vZGUpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKwlfTV9ub2RlID0gX1JiX3RyZWVfZGVjcmVtZW50KF9NX25vZGUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJX01fbm9kZSA9IF9SYl90cmVlX2RlY3JlbWVudChfTV9ub2RlKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1NlbGYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGUgPT0gX194Ll9NX25vZGU7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBfU2VsZiYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZSAhPSBfX3guX01fbm9kZTsgfQorCisgICAgICBfQmFzZV9wdHIgX01fbm9kZTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SYl90cmVlX2NvbnN0X2l0ZXJhdG9yCisgICAgeworICAgICAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqIHBvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWVfaXRlcmF0b3I8X1RwPiBpdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmIF9SYl90cmVlX2NvbnN0X2l0ZXJhdG9yPF9UcD4gICAgICAgIF9TZWxmOworICAgICAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9Db25zdF9CYXNlX3B0ciBfQmFzZV9wdHI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9SYl90cmVlX25vZGU8X1RwPiogICAgICAgICAgIF9MaW5rX3R5cGU7CisKKyAgICAgIF9SYl90cmVlX2NvbnN0X2l0ZXJhdG9yKCkKKyAgICAgIDogX01fbm9kZSgpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgX1JiX3RyZWVfY29uc3RfaXRlcmF0b3IoX0xpbmtfdHlwZSBfX3gpCisgICAgICA6IF9NX25vZGUoX194KSB7IH0KKworICAgICAgX1JiX3RyZWVfY29uc3RfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9faXQpCisgICAgICA6IF9NX25vZGUoX19pdC5fTV9ub2RlKSB7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2NvbnN0X2Nhc3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8dHlwZW5hbWUgaXRlcmF0b3I6Ol9MaW5rX3R5cGU+CisJCQkoY29uc3RfY2FzdDx0eXBlbmFtZSBpdGVyYXRvcjo6X0Jhc2VfcHRyPihfTV9ub2RlKSkpOyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+KF9NX25vZGUpLT5fTV92YWx1ZV9maWVsZDsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2Yoc3RhdGljX2Nhc3Q8X0xpbmtfdHlwZT4KKwkJCQkoX01fbm9kZSktPl9NX3ZhbHVlX2ZpZWxkKTsgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9NX25vZGUgPSBfUmJfdHJlZV9pbmNyZW1lbnQoX01fbm9kZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX1NlbGYgX190bXAgPSAqdGhpczsKKwlfTV9ub2RlID0gX1JiX3RyZWVfaW5jcmVtZW50KF9NX25vZGUpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKwlfTV9ub2RlID0gX1JiX3RyZWVfZGVjcmVtZW50KF9NX25vZGUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJX01fbm9kZSA9IF9SYl90cmVlX2RlY3JlbWVudChfTV9ub2RlKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1NlbGYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGUgPT0gX194Ll9NX25vZGU7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBfU2VsZiYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZSAhPSBfX3guX01fbm9kZTsgfQorCisgICAgICBfQmFzZV9wdHIgX01fbm9kZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWw+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9SYl90cmVlX2l0ZXJhdG9yPF9WYWw+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBfUmJfdHJlZV9jb25zdF9pdGVyYXRvcjxfVmFsPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9ub2RlID09IF9feS5fTV9ub2RlOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX1JiX3RyZWVfaXRlcmF0b3I8X1ZhbD4mIF9feCwKKyAgICAgICAgICAgICAgIGNvbnN0IF9SYl90cmVlX2NvbnN0X2l0ZXJhdG9yPF9WYWw+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX25vZGUgIT0gX195Ll9NX25vZGU7IH0KKworICB2b2lkCisgIF9SYl90cmVlX2luc2VydF9hbmRfcmViYWxhbmNlKGNvbnN0IGJvb2wgX19pbnNlcnRfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYl90cmVlX25vZGVfYmFzZSogX19wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UmIF9faGVhZGVyKSB0aHJvdyAoKTsKKworICBfUmJfdHJlZV9ub2RlX2Jhc2UqCisgIF9SYl90cmVlX3JlYmFsYW5jZV9mb3JfZXJhc2UoX1JiX3RyZWVfbm9kZV9iYXNlKiBjb25zdCBfX3osCisJCQkgICAgICAgX1JiX3RyZWVfbm9kZV9iYXNlJiBfX2hlYWRlcikgdGhyb3cgKCk7CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYyA9IGFsbG9jYXRvcjxfVmFsPiA+CisgICAgY2xhc3MgX1JiX3RyZWUKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9SYl90cmVlX25vZGU8X1ZhbD4gPjo6b3RoZXIKKyAgICAgICAgICAgICAgX05vZGVfYWxsb2NhdG9yOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlX2Jhc2UqIAkJX0Jhc2VfcHRyOworICAgICAgdHlwZWRlZiBjb25zdCBfUmJfdHJlZV9ub2RlX2Jhc2UqIAlfQ29uc3RfQmFzZV9wdHI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9LZXkgCQkJCWtleV90eXBlOworICAgICAgdHlwZWRlZiBfVmFsIAkJCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAJCQlwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiAJCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUmIAkJCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgCQljb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9SYl90cmVlX25vZGU8X1ZhbD4qIAkJX0xpbmtfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1JiX3RyZWVfbm9kZTxfVmFsPioJX0NvbnN0X0xpbmtfdHlwZTsKKyAgICAgIHR5cGVkZWYgc2l6ZV90IAkJCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAJCQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYyAJCQkJYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIF9Ob2RlX2FsbG9jYXRvciYKKyAgICAgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X05vZGVfYWxsb2NhdG9yKj4oJnRoaXMtPl9NX2ltcGwpOyB9CisgICAgICAKKyAgICAgIGNvbnN0IF9Ob2RlX2FsbG9jYXRvciYKKyAgICAgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX05vZGVfYWxsb2NhdG9yKj4oJnRoaXMtPl9NX2ltcGwpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgX0xpbmtfdHlwZQorICAgICAgX01fZ2V0X25vZGUoKQorICAgICAgeyByZXR1cm4gX01faW1wbC5fTm9kZV9hbGxvY2F0b3I6OmFsbG9jYXRlKDEpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3B1dF9ub2RlKF9MaW5rX3R5cGUgX19wKQorICAgICAgeyBfTV9pbXBsLl9Ob2RlX2FsbG9jYXRvcjo6ZGVhbGxvY2F0ZShfX3AsIDEpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgICAgIF9MaW5rX3R5cGUKKyAgICAgIF9NX2NyZWF0ZV9ub2RlKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlfTGlua190eXBlIF9fdG1wID0gX01fZ2V0X25vZGUoKTsKKwlfX3RyeQorCSAgeyBnZXRfYWxsb2NhdG9yKCkuY29uc3RydWN0CisJICAgICAgKHN0ZDo6X19hZGRyZXNzb2YoX190bXAtPl9NX3ZhbHVlX2ZpZWxkKSwgX194KTsgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9wdXRfbm9kZShfX3RtcCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZGVzdHJveV9ub2RlKF9MaW5rX3R5cGUgX19wKQorICAgICAgeworCWdldF9hbGxvY2F0b3IoKS5kZXN0cm95KHN0ZDo6X19hZGRyZXNzb2YoX19wLT5fTV92YWx1ZV9maWVsZCkpOworCV9NX3B1dF9ub2RlKF9fcCk7CisgICAgICB9CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIF9MaW5rX3R5cGUKKyAgICAgICAgX01fY3JlYXRlX25vZGUoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX0xpbmtfdHlwZSBfX3RtcCA9IF9NX2dldF9ub2RlKCk7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgYWxsb2NhdG9yX3RyYWl0czxfTm9kZV9hbGxvY2F0b3I+OjoKKwkJY29uc3RydWN0KF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLCBfX3RtcCwKKwkJCSAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfTV9wdXRfbm9kZShfX3RtcCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIHJldHVybiBfX3RtcDsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3lfbm9kZShfTGlua190eXBlIF9fcCkKKyAgICAgIHsKKwlfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKS5kZXN0cm95KF9fcCk7CisJX01fcHV0X25vZGUoX19wKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBfTGlua190eXBlCisgICAgICBfTV9jbG9uZV9ub2RlKF9Db25zdF9MaW5rX3R5cGUgX194KQorICAgICAgeworCV9MaW5rX3R5cGUgX190bXAgPSBfTV9jcmVhdGVfbm9kZShfX3gtPl9NX3ZhbHVlX2ZpZWxkKTsKKwlfX3RtcC0+X01fY29sb3IgPSBfX3gtPl9NX2NvbG9yOworCV9fdG1wLT5fTV9sZWZ0ID0gMDsKKwlfX3RtcC0+X01fcmlnaHQgPSAwOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXlfY29tcGFyZSwgCisJICAgICAgIGJvb2wgX0lzX3BvZF9jb21wYXJhdG9yID0gX19pc19wb2QoX0tleV9jb21wYXJlKT4KKyAgICAgICAgc3RydWN0IF9SYl90cmVlX2ltcGwgOiBwdWJsaWMgX05vZGVfYWxsb2NhdG9yCisgICAgICAgIHsKKwkgIF9LZXlfY29tcGFyZQkJX01fa2V5X2NvbXBhcmU7CisJICBfUmJfdHJlZV9ub2RlX2Jhc2UgCV9NX2hlYWRlcjsKKwkgIHNpemVfdHlwZSAJCV9NX25vZGVfY291bnQ7IC8vIEtlZXBzIHRyYWNrIG9mIHNpemUgb2YgdHJlZS4KKworCSAgX1JiX3RyZWVfaW1wbCgpCisJICA6IF9Ob2RlX2FsbG9jYXRvcigpLCBfTV9rZXlfY29tcGFyZSgpLCBfTV9oZWFkZXIoKSwKKwkgICAgX01fbm9kZV9jb3VudCgwKQorCSAgeyBfTV9pbml0aWFsaXplKCk7IH0KKworCSAgX1JiX3RyZWVfaW1wbChjb25zdCBfS2V5X2NvbXBhcmUmIF9fY29tcCwgY29uc3QgX05vZGVfYWxsb2NhdG9yJiBfX2EpCisJICA6IF9Ob2RlX2FsbG9jYXRvcihfX2EpLCBfTV9rZXlfY29tcGFyZShfX2NvbXApLCBfTV9oZWFkZXIoKSwKKwkgICAgX01fbm9kZV9jb3VudCgwKQorCSAgeyBfTV9pbml0aWFsaXplKCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkgIF9SYl90cmVlX2ltcGwoY29uc3QgX0tleV9jb21wYXJlJiBfX2NvbXAsIF9Ob2RlX2FsbG9jYXRvciYmIF9fYSkKKwkgIDogX05vZGVfYWxsb2NhdG9yKHN0ZDo6bW92ZShfX2EpKSwgX01fa2V5X2NvbXBhcmUoX19jb21wKSwKKwkgICAgX01faGVhZGVyKCksIF9NX25vZGVfY291bnQoMCkKKwkgIHsgX01faW5pdGlhbGl6ZSgpOyB9CisjZW5kaWYKKworCXByaXZhdGU6CisJICB2b2lkCisJICBfTV9pbml0aWFsaXplKCkKKwkgIHsKKwkgICAgdGhpcy0+X01faGVhZGVyLl9NX2NvbG9yID0gX1NfcmVkOworCSAgICB0aGlzLT5fTV9oZWFkZXIuX01fcGFyZW50ID0gMDsKKwkgICAgdGhpcy0+X01faGVhZGVyLl9NX2xlZnQgPSAmdGhpcy0+X01faGVhZGVyOworCSAgICB0aGlzLT5fTV9oZWFkZXIuX01fcmlnaHQgPSAmdGhpcy0+X01faGVhZGVyOworCSAgfQkgICAgCisJfTsKKworICAgICAgX1JiX3RyZWVfaW1wbDxfQ29tcGFyZT4gX01faW1wbDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9CYXNlX3B0ciYKKyAgICAgIF9NX3Jvb3QoKQorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9oZWFkZXIuX01fcGFyZW50OyB9CisKKyAgICAgIF9Db25zdF9CYXNlX3B0cgorICAgICAgX01fcm9vdCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2hlYWRlci5fTV9wYXJlbnQ7IH0KKworICAgICAgX0Jhc2VfcHRyJgorICAgICAgX01fbGVmdG1vc3QoKQorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9oZWFkZXIuX01fbGVmdDsgfQorCisgICAgICBfQ29uc3RfQmFzZV9wdHIKKyAgICAgIF9NX2xlZnRtb3N0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01faGVhZGVyLl9NX2xlZnQ7IH0KKworICAgICAgX0Jhc2VfcHRyJgorICAgICAgX01fcmlnaHRtb3N0KCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01faGVhZGVyLl9NX3JpZ2h0OyB9CisKKyAgICAgIF9Db25zdF9CYXNlX3B0cgorICAgICAgX01fcmlnaHRtb3N0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01faGVhZGVyLl9NX3JpZ2h0OyB9CisKKyAgICAgIF9MaW5rX3R5cGUKKyAgICAgIF9NX2JlZ2luKCkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+KHRoaXMtPl9NX2ltcGwuX01faGVhZGVyLl9NX3BhcmVudCk7IH0KKworICAgICAgX0NvbnN0X0xpbmtfdHlwZQorICAgICAgX01fYmVnaW4oKSBjb25zdAorICAgICAgeworCXJldHVybiBzdGF0aWNfY2FzdDxfQ29uc3RfTGlua190eXBlPgorCSAgKHRoaXMtPl9NX2ltcGwuX01faGVhZGVyLl9NX3BhcmVudCk7CisgICAgICB9CisKKyAgICAgIF9MaW5rX3R5cGUKKyAgICAgIF9NX2VuZCgpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfTGlua190eXBlPigmdGhpcy0+X01faW1wbC5fTV9oZWFkZXIpOyB9CisKKyAgICAgIF9Db25zdF9MaW5rX3R5cGUKKyAgICAgIF9NX2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfQ29uc3RfTGlua190eXBlPigmdGhpcy0+X01faW1wbC5fTV9oZWFkZXIpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdF9yZWZlcmVuY2UKKyAgICAgIF9TX3ZhbHVlKF9Db25zdF9MaW5rX3R5cGUgX194KQorICAgICAgeyByZXR1cm4gX194LT5fTV92YWx1ZV9maWVsZDsgfQorCisgICAgICBzdGF0aWMgY29uc3QgX0tleSYKKyAgICAgIF9TX2tleShfQ29uc3RfTGlua190eXBlIF9feCkKKyAgICAgIHsgcmV0dXJuIF9LZXlPZlZhbHVlKCkoX1NfdmFsdWUoX194KSk7IH0KKworICAgICAgc3RhdGljIF9MaW5rX3R5cGUKKyAgICAgIF9TX2xlZnQoX0Jhc2VfcHRyIF9feCkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+KF9feC0+X01fbGVmdCk7IH0KKworICAgICAgc3RhdGljIF9Db25zdF9MaW5rX3R5cGUKKyAgICAgIF9TX2xlZnQoX0NvbnN0X0Jhc2VfcHRyIF9feCkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9Db25zdF9MaW5rX3R5cGU+KF9feC0+X01fbGVmdCk7IH0KKworICAgICAgc3RhdGljIF9MaW5rX3R5cGUKKyAgICAgIF9TX3JpZ2h0KF9CYXNlX3B0ciBfX3gpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfTGlua190eXBlPihfX3gtPl9NX3JpZ2h0KTsgfQorCisgICAgICBzdGF0aWMgX0NvbnN0X0xpbmtfdHlwZQorICAgICAgX1NfcmlnaHQoX0NvbnN0X0Jhc2VfcHRyIF9feCkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9Db25zdF9MaW5rX3R5cGU+KF9feC0+X01fcmlnaHQpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdF9yZWZlcmVuY2UKKyAgICAgIF9TX3ZhbHVlKF9Db25zdF9CYXNlX3B0ciBfX3gpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfQ29uc3RfTGlua190eXBlPihfX3gpLT5fTV92YWx1ZV9maWVsZDsgfQorCisgICAgICBzdGF0aWMgY29uc3QgX0tleSYKKyAgICAgIF9TX2tleShfQ29uc3RfQmFzZV9wdHIgX194KQorICAgICAgeyByZXR1cm4gX0tleU9mVmFsdWUoKShfU192YWx1ZShfX3gpKTsgfQorCisgICAgICBzdGF0aWMgX0Jhc2VfcHRyCisgICAgICBfU19taW5pbXVtKF9CYXNlX3B0ciBfX3gpCisgICAgICB7IHJldHVybiBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21pbmltdW0oX194KTsgfQorCisgICAgICBzdGF0aWMgX0NvbnN0X0Jhc2VfcHRyCisgICAgICBfU19taW5pbXVtKF9Db25zdF9CYXNlX3B0ciBfX3gpCisgICAgICB7IHJldHVybiBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21pbmltdW0oX194KTsgfQorCisgICAgICBzdGF0aWMgX0Jhc2VfcHRyCisgICAgICBfU19tYXhpbXVtKF9CYXNlX3B0ciBfX3gpCisgICAgICB7IHJldHVybiBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21heGltdW0oX194KTsgfQorCisgICAgICBzdGF0aWMgX0NvbnN0X0Jhc2VfcHRyCisgICAgICBfU19tYXhpbXVtKF9Db25zdF9CYXNlX3B0ciBfX3gpCisgICAgICB7IHJldHVybiBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21heGltdW0oX194KTsgfQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmJfdHJlZV9pdGVyYXRvcjx2YWx1ZV90eXBlPiAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWVfY29uc3RfaXRlcmF0b3I8dmFsdWVfdHlwZT4gY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICBwcml2YXRlOgorICAgICAgcGFpcjxfQmFzZV9wdHIsIF9CYXNlX3B0cj4KKyAgICAgIF9NX2dldF9pbnNlcnRfdW5pcXVlX3Bvcyhjb25zdCBrZXlfdHlwZSYgX19rKTsKKworICAgICAgcGFpcjxfQmFzZV9wdHIsIF9CYXNlX3B0cj4KKyAgICAgIF9NX2dldF9pbnNlcnRfZXF1YWxfcG9zKGNvbnN0IGtleV90eXBlJiBfX2spOworCisgICAgICBwYWlyPF9CYXNlX3B0ciwgX0Jhc2VfcHRyPgorICAgICAgX01fZ2V0X2luc2VydF9oaW50X3VuaXF1ZV9wb3MoY29uc3RfaXRlcmF0b3IgX19wb3MsCisJCQkJICAgIGNvbnN0IGtleV90eXBlJiBfX2spOworCisgICAgICBwYWlyPF9CYXNlX3B0ciwgX0Jhc2VfcHRyPgorICAgICAgX01fZ2V0X2luc2VydF9oaW50X2VxdWFsX3Bvcyhjb25zdF9pdGVyYXRvciBfX3BvcywKKwkJCQkgICBjb25zdCBrZXlfdHlwZSYgX19rKTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIF9NX2luc2VydF8oX0Jhc2VfcHRyIF9feCwgX0Jhc2VfcHRyIF9feSwgX0FyZyYmIF9fdik7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnRfbm9kZShfQmFzZV9wdHIgX194LCBfQmFzZV9wdHIgX195LCBfTGlua190eXBlIF9feik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIF9NX2luc2VydF9sb3dlcihfQmFzZV9wdHIgX195LCBfQXJnJiYgX192KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgX01faW5zZXJ0X2VxdWFsX2xvd2VyKF9BcmcmJiBfX3gpOworCisgICAgICBpdGVyYXRvcgorICAgICAgX01faW5zZXJ0X2xvd2VyX25vZGUoX0Jhc2VfcHRyIF9fcCwgX0xpbmtfdHlwZSBfX3opOworCisgICAgICBpdGVyYXRvcgorICAgICAgX01faW5zZXJ0X2VxdWFsX2xvd2VyX25vZGUoX0xpbmtfdHlwZSBfX3opOworI2Vsc2UKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnRfKF9CYXNlX3B0ciBfX3gsIF9CYXNlX3B0ciBfX3ksCisJCSBjb25zdCB2YWx1ZV90eXBlJiBfX3YpOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMzMuIEluc2VydGlvbiBoaW50cyBpbiBhc3NvY2lhdGl2ZSBjb250YWluZXJzLgorICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2luc2VydF9sb3dlcihfQmFzZV9wdHIgX195LCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpOworCisgICAgICBpdGVyYXRvcgorICAgICAgX01faW5zZXJ0X2VxdWFsX2xvd2VyKGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisjZW5kaWYKKworICAgICAgX0xpbmtfdHlwZQorICAgICAgX01fY29weShfQ29uc3RfTGlua190eXBlIF9feCwgX0xpbmtfdHlwZSBfX3ApOworCisgICAgICB2b2lkCisgICAgICBfTV9lcmFzZShfTGlua190eXBlIF9feCk7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9sb3dlcl9ib3VuZChfTGlua190eXBlIF9feCwgX0xpbmtfdHlwZSBfX3ksCisJCSAgICAgY29uc3QgX0tleSYgX19rKTsKKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIF9NX2xvd2VyX2JvdW5kKF9Db25zdF9MaW5rX3R5cGUgX194LCBfQ29uc3RfTGlua190eXBlIF9feSwKKwkJICAgICBjb25zdCBfS2V5JiBfX2spIGNvbnN0OworCisgICAgICBpdGVyYXRvcgorICAgICAgX01fdXBwZXJfYm91bmQoX0xpbmtfdHlwZSBfX3gsIF9MaW5rX3R5cGUgX195LAorCQkgICAgIGNvbnN0IF9LZXkmIF9fayk7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBfTV91cHBlcl9ib3VuZChfQ29uc3RfTGlua190eXBlIF9feCwgX0NvbnN0X0xpbmtfdHlwZSBfX3ksCisJCSAgICAgY29uc3QgX0tleSYgX19rKSBjb25zdDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCisgICAgICBfUmJfdHJlZSgpIHsgfQorCisgICAgICBfUmJfdHJlZShjb25zdCBfQ29tcGFyZSYgX19jb21wLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01faW1wbChfX2NvbXAsIF9Ob2RlX2FsbG9jYXRvcihfX2EpKSB7IH0KKworICAgICAgX1JiX3RyZWUoY29uc3QgX1JiX3RyZWUmIF9feCkKKyAgICAgIDogX01faW1wbChfX3guX01faW1wbC5fTV9rZXlfY29tcGFyZSwgX194Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKQorICAgICAgeworCWlmIChfX3guX01fcm9vdCgpICE9IDApCisJICB7CisJICAgIF9NX3Jvb3QoKSA9IF9NX2NvcHkoX194Ll9NX2JlZ2luKCksIF9NX2VuZCgpKTsKKwkgICAgX01fbGVmdG1vc3QoKSA9IF9TX21pbmltdW0oX01fcm9vdCgpKTsKKwkgICAgX01fcmlnaHRtb3N0KCkgPSBfU19tYXhpbXVtKF9NX3Jvb3QoKSk7CisJICAgIF9NX2ltcGwuX01fbm9kZV9jb3VudCA9IF9feC5fTV9pbXBsLl9NX25vZGVfY291bnQ7CisJICB9CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBfUmJfdHJlZShfUmJfdHJlZSYmIF9feCk7CisjZW5kaWYKKworICAgICAgfl9SYl90cmVlKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX01fZXJhc2UoX01fYmVnaW4oKSk7IH0KKworICAgICAgX1JiX3RyZWUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1JiX3RyZWUmIF9feCk7CisKKyAgICAgIC8vIEFjY2Vzc29ycy4KKyAgICAgIF9Db21wYXJlCisgICAgICBrZXlfY29tcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9pbXBsLl9NX2tleV9jb21wYXJlOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IAorCXJldHVybiBpdGVyYXRvcihzdGF0aWNfY2FzdDxfTGlua190eXBlPgorCQkJKHRoaXMtPl9NX2ltcGwuX01faGVhZGVyLl9NX2xlZnQpKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgCisJcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHN0YXRpY19jYXN0PF9Db25zdF9MaW5rX3R5cGU+CisJCQkgICAgICAodGhpcy0+X01faW1wbC5fTV9oZWFkZXIuX01fbGVmdCkpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+KCZ0aGlzLT5fTV9pbXBsLl9NX2hlYWRlcikpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyAKKwlyZXR1cm4gY29uc3RfaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8X0NvbnN0X0xpbmtfdHlwZT4KKwkJCSAgICAgICgmdGhpcy0+X01faW1wbC5fTV9oZWFkZXIpKTsKKyAgICAgIH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX2ltcGwuX01fbm9kZV9jb3VudCA9PSAwOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUIAorICAgICAgeyByZXR1cm4gX01faW1wbC5fTV9ub2RlX2NvdW50OyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkubWF4X3NpemUoKTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKF9SYl90cmVlJiBfX3QpOyAgICAgIAorCisgICAgICAvLyBJbnNlcnQvZXJhc2UuCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgICAgX01faW5zZXJ0X3VuaXF1ZShfQXJnJiYgX194KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgX01faW5zZXJ0X2VxdWFsKF9BcmcmJiBfX3gpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBfTV9pbnNlcnRfdW5pcXVlXyhjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJnJiYgX194KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgX01faW5zZXJ0X2VxdWFsXyhjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJnJiYgX194KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJcGFpcjxpdGVyYXRvciwgYm9vbD4KKwlfTV9lbXBsYWNlX3VuaXF1ZShfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJX01fZW1wbGFjZV9lcXVhbChfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJX01fZW1wbGFjZV9oaW50X3VuaXF1ZShjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCV9NX2VtcGxhY2VfaGludF9lcXVhbChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2Vsc2UKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBfTV9pbnNlcnRfdW5pcXVlKGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2luc2VydF91bmlxdWVfKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnRfZXF1YWxfKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5zZXJ0X3VuaXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnNlcnRfZXF1YWwoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9lcmFzZV9hdXgoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbik7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2VyYXNlX2F1eChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpOworCisgICAgcHVibGljOgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDEzMC4gQXNzb2NpYXRpdmUgZXJhc2Ugc2hvdWxkIHJldHVybiBhbiBpdGVyYXRvci4KKyAgICAgIF9HTElCQ1hYX0FCSV9UQUdfQ1hYMTEKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCWNvbnN0X2l0ZXJhdG9yIF9fcmVzdWx0ID0gX19wb3NpdGlvbjsKKwkrK19fcmVzdWx0OworCV9NX2VyYXNlX2F1eChfX3Bvc2l0aW9uKTsKKwlyZXR1cm4gX19yZXN1bHQuX01fY29uc3RfY2FzdCgpOworICAgICAgfQorCisgICAgICAvLyBMV0cgMjA1OS4KKyAgICAgIF9HTElCQ1hYX0FCSV9UQUdfQ1hYMTEKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCWl0ZXJhdG9yIF9fcmVzdWx0ID0gX19wb3NpdGlvbjsKKwkrK19fcmVzdWx0OworCV9NX2VyYXNlX2F1eChfX3Bvc2l0aW9uKTsKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgX01fZXJhc2VfYXV4KF9fcG9zaXRpb24pOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IF9NX2VyYXNlX2F1eChfX3Bvc2l0aW9uKTsgfQorI2VuZGlmCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMTMwLiBBc3NvY2lhdGl2ZSBlcmFzZSBzaG91bGQgcmV0dXJuIGFuIGl0ZXJhdG9yLgorICAgICAgX0dMSUJDWFhfQUJJX1RBR19DWFgxMQorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlfTV9lcmFzZV9hdXgoX19maXJzdCwgX19sYXN0KTsKKwlyZXR1cm4gX19sYXN0Ll9NX2NvbnN0X2Nhc3QoKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9NX2VyYXNlX2F1eChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX01fZXJhc2VfYXV4KF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorICAgICAgdm9pZAorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUqIF9fZmlyc3QsIGNvbnN0IGtleV90eXBlKiBfX2xhc3QpOworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisgICAgICAgIF9NX2VyYXNlKF9NX2JlZ2luKCkpOworICAgICAgICBfTV9sZWZ0bW9zdCgpID0gX01fZW5kKCk7CisgICAgICAgIF9NX3Jvb3QoKSA9IDA7CisgICAgICAgIF9NX3JpZ2h0bW9zdCgpID0gX01fZW5kKCk7CisgICAgICAgIF9NX2ltcGwuX01fbm9kZV9jb3VudCA9IDA7CisgICAgICB9CisKKyAgICAgIC8vIFNldCBvcGVyYXRpb25zLgorICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fayk7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0OworCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0OworCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgIHsgcmV0dXJuIF9NX2xvd2VyX2JvdW5kKF9NX2JlZ2luKCksIF9NX2VuZCgpLCBfX2spOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbG93ZXJfYm91bmQoX01fYmVnaW4oKSwgX01fZW5kKCksIF9fayk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgICB7IHJldHVybiBfTV91cHBlcl9ib3VuZChfTV9iZWdpbigpLCBfTV9lbmQoKSwgX19rKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3VwcGVyX2JvdW5kKF9NX2JlZ2luKCksIF9NX2VuZCgpLCBfX2spOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fayk7CisKKyAgICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Q7CisKKyAgICAgIC8vIERlYnVnZ2luZy4KKyAgICAgIGJvb2wKKyAgICAgIF9fcmJfdmVyaWZ5KCkgY29uc3Q7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsKKyAgICAgIHJldHVybiBfX3guc2l6ZSgpID09IF9feS5zaXplKCkKKwkgICAgICYmIHN0ZDo6ZXF1YWwoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX195LmJlZ2luKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7CisgICAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfX3guYmVnaW4oKSwgX194LmVuZCgpLCAKKwkJCQkJICBfX3kuYmVnaW4oKSwgX195LmVuZCgpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX1JiX3RyZWUoX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiYgX194KQorICAgIDogX01faW1wbChfX3guX01faW1wbC5fTV9rZXlfY29tcGFyZSwKKwkgICAgICBzdGQ6Om1vdmUoX194Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKSkKKyAgICB7CisgICAgICBpZiAoX194Ll9NX3Jvb3QoKSAhPSAwKQorCXsKKwkgIF9NX3Jvb3QoKSA9IF9feC5fTV9yb290KCk7CisJICBfTV9sZWZ0bW9zdCgpID0gX194Ll9NX2xlZnRtb3N0KCk7CisJICBfTV9yaWdodG1vc3QoKSA9IF9feC5fTV9yaWdodG1vc3QoKTsKKwkgIF9NX3Jvb3QoKS0+X01fcGFyZW50ID0gX01fZW5kKCk7CisKKwkgIF9feC5fTV9yb290KCkgPSAwOworCSAgX194Ll9NX2xlZnRtb3N0KCkgPSBfX3guX01fZW5kKCk7CisJICBfX3guX01fcmlnaHRtb3N0KCkgPSBfX3guX01fZW5kKCk7CisKKwkgIHRoaXMtPl9NX2ltcGwuX01fbm9kZV9jb3VudCA9IF9feC5fTV9pbXBsLl9NX25vZGVfY291bnQ7CisJICBfX3guX01faW1wbC5fTV9ub2RlX2NvdW50ID0gMDsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgb3BlcmF0b3I9KGNvbnN0IF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194KQorICAgIHsKKyAgICAgIGlmICh0aGlzICE9ICZfX3gpCisJeworCSAgLy8gTm90ZSB0aGF0IF9LZXkgbWF5IGJlIGEgY29uc3RhbnQgdHlwZS4KKwkgIGNsZWFyKCk7CisJICBfTV9pbXBsLl9NX2tleV9jb21wYXJlID0gX194Ll9NX2ltcGwuX01fa2V5X2NvbXBhcmU7CisJICBpZiAoX194Ll9NX3Jvb3QoKSAhPSAwKQorCSAgICB7CisJICAgICAgX01fcm9vdCgpID0gX01fY29weShfX3guX01fYmVnaW4oKSwgX01fZW5kKCkpOworCSAgICAgIF9NX2xlZnRtb3N0KCkgPSBfU19taW5pbXVtKF9NX3Jvb3QoKSk7CisJICAgICAgX01fcmlnaHRtb3N0KCkgPSBfU19tYXhpbXVtKF9NX3Jvb3QoKSk7CisJICAgICAgX01faW1wbC5fTV9ub2RlX2NvdW50ID0gX194Ll9NX2ltcGwuX01fbm9kZV9jb3VudDsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisjZW5kaWYKKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgX01faW5zZXJ0XyhfQmFzZV9wdHIgX194LCBfQmFzZV9wdHIgX19wLCBfQXJnJiYgX192KQorI2Vsc2UKKyAgICBfTV9pbnNlcnRfKF9CYXNlX3B0ciBfX3gsIF9CYXNlX3B0ciBfX3AsIGNvbnN0IF9WYWwmIF9fdikKKyNlbmRpZgorICAgIHsKKyAgICAgIGJvb2wgX19pbnNlcnRfbGVmdCA9IChfX3ggIT0gMCB8fCBfX3AgPT0gX01fZW5kKCkKKwkJCSAgICB8fCBfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9LZXlPZlZhbHVlKCkoX192KSwKKwkJCQkJCSAgICAgIF9TX2tleShfX3ApKSk7CisKKyAgICAgIF9MaW5rX3R5cGUgX196ID0gX01fY3JlYXRlX25vZGUoX0dMSUJDWFhfRk9SV0FSRChfQXJnLCBfX3YpKTsKKworICAgICAgX1JiX3RyZWVfaW5zZXJ0X2FuZF9yZWJhbGFuY2UoX19pbnNlcnRfbGVmdCwgX196LCBfX3AsCisJCQkJICAgIHRoaXMtPl9NX2ltcGwuX01faGVhZGVyKTsKKyAgICAgICsrX01faW1wbC5fTV9ub2RlX2NvdW50OworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9feik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorI2VuZGlmCisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIF9NX2luc2VydF9sb3dlcihfQmFzZV9wdHIgX19wLCBfQXJnJiYgX192KQorI2Vsc2UKKyAgICBfTV9pbnNlcnRfbG93ZXIoX0Jhc2VfcHRyIF9fcCwgY29uc3QgX1ZhbCYgX192KQorI2VuZGlmCisgICAgeworICAgICAgYm9vbCBfX2luc2VydF9sZWZ0ID0gKF9fcCA9PSBfTV9lbmQoKQorCQkJICAgIHx8ICFfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleShfX3ApLAorCQkJCQkJICAgICAgIF9LZXlPZlZhbHVlKCkoX192KSkpOworCisgICAgICBfTGlua190eXBlIF9feiA9IF9NX2NyZWF0ZV9ub2RlKF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisKKyAgICAgIF9SYl90cmVlX2luc2VydF9hbmRfcmViYWxhbmNlKF9faW5zZXJ0X2xlZnQsIF9feiwgX19wLAorCQkJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2hlYWRlcik7CisgICAgICArK19NX2ltcGwuX01fbm9kZV9jb3VudDsKKyAgICAgIHJldHVybiBpdGVyYXRvcihfX3opOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyNlbmRpZgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBfTV9pbnNlcnRfZXF1YWxfbG93ZXIoX0FyZyYmIF9fdikKKyNlbHNlCisgICAgX01faW5zZXJ0X2VxdWFsX2xvd2VyKGNvbnN0IF9WYWwmIF9fdikKKyNlbmRpZgorICAgIHsKKyAgICAgIF9MaW5rX3R5cGUgX194ID0gX01fYmVnaW4oKTsKKyAgICAgIF9MaW5rX3R5cGUgX195ID0gX01fZW5kKCk7CisgICAgICB3aGlsZSAoX194ICE9IDApCisJeworCSAgX195ID0gX194OworCSAgX194ID0gIV9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9feCksIF9LZXlPZlZhbHVlKCkoX192KSkgPworCSAgICAgICAgX1NfbGVmdChfX3gpIDogX1NfcmlnaHQoX194KTsKKwl9CisgICAgICByZXR1cm4gX01faW5zZXJ0X2xvd2VyKF9feSwgX0dMSUJDWFhfRk9SV0FSRChfQXJnLCBfX3YpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tvViwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS29WLCBfQ29tcGFyZSwgX0FsbG9jPjo6X0xpbmtfdHlwZQorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9Lb1YsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBfTV9jb3B5KF9Db25zdF9MaW5rX3R5cGUgX194LCBfTGlua190eXBlIF9fcCkKKyAgICB7CisgICAgICAvLyBTdHJ1Y3R1cmFsIGNvcHkuICBfX3ggYW5kIF9fcCBtdXN0IGJlIG5vbi1udWxsLgorICAgICAgX0xpbmtfdHlwZSBfX3RvcCA9IF9NX2Nsb25lX25vZGUoX194KTsKKyAgICAgIF9fdG9wLT5fTV9wYXJlbnQgPSBfX3A7CisKKyAgICAgIF9fdHJ5CisJeworCSAgaWYgKF9feC0+X01fcmlnaHQpCisJICAgIF9fdG9wLT5fTV9yaWdodCA9IF9NX2NvcHkoX1NfcmlnaHQoX194KSwgX190b3ApOworCSAgX19wID0gX190b3A7CisJICBfX3ggPSBfU19sZWZ0KF9feCk7CisKKwkgIHdoaWxlIChfX3ggIT0gMCkKKwkgICAgeworCSAgICAgIF9MaW5rX3R5cGUgX195ID0gX01fY2xvbmVfbm9kZShfX3gpOworCSAgICAgIF9fcC0+X01fbGVmdCA9IF9feTsKKwkgICAgICBfX3ktPl9NX3BhcmVudCA9IF9fcDsKKwkgICAgICBpZiAoX194LT5fTV9yaWdodCkKKwkJX195LT5fTV9yaWdodCA9IF9NX2NvcHkoX1NfcmlnaHQoX194KSwgX195KTsKKwkgICAgICBfX3AgPSBfX3k7CisJICAgICAgX194ID0gX1NfbGVmdChfX3gpOworCSAgICB9CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgX01fZXJhc2UoX190b3ApOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgcmV0dXJuIF9fdG9wOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBfTV9lcmFzZShfTGlua190eXBlIF9feCkKKyAgICB7CisgICAgICAvLyBFcmFzZSB3aXRob3V0IHJlYmFsYW5jaW5nLgorICAgICAgd2hpbGUgKF9feCAhPSAwKQorCXsKKwkgIF9NX2VyYXNlKF9TX3JpZ2h0KF9feCkpOworCSAgX0xpbmtfdHlwZSBfX3kgPSBfU19sZWZ0KF9feCk7CisJICBfTV9kZXN0cm95X25vZGUoX194KTsKKwkgIF9feCA9IF9feTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkgICAgICBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX2xvd2VyX2JvdW5kKF9MaW5rX3R5cGUgX194LCBfTGlua190eXBlIF9feSwKKwkJICAgY29uc3QgX0tleSYgX19rKQorICAgIHsKKyAgICAgIHdoaWxlIChfX3ggIT0gMCkKKwlpZiAoIV9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9feCksIF9faykpCisJICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKKwllbHNlCisJICBfX3ggPSBfU19yaWdodChfX3gpOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9feSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkgICAgICBfQ29tcGFyZSwgX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX2xvd2VyX2JvdW5kKF9Db25zdF9MaW5rX3R5cGUgX194LCBfQ29uc3RfTGlua190eXBlIF9feSwKKwkJICAgY29uc3QgX0tleSYgX19rKSBjb25zdAorICAgIHsKKyAgICAgIHdoaWxlIChfX3ggIT0gMCkKKwlpZiAoIV9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9feCksIF9faykpCisJICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKKwllbHNlCisJICBfX3ggPSBfU19yaWdodChfX3gpOworICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9feSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkgICAgICBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX3VwcGVyX2JvdW5kKF9MaW5rX3R5cGUgX194LCBfTGlua190eXBlIF9feSwKKwkJICAgY29uc3QgX0tleSYgX19rKQorICAgIHsKKyAgICAgIHdoaWxlIChfX3ggIT0gMCkKKwlpZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfX2ssIF9TX2tleShfX3gpKSkKKwkgIF9feSA9IF9feCwgX194ID0gX1NfbGVmdChfX3gpOworCWVsc2UKKwkgIF9feCA9IF9TX3JpZ2h0KF9feCk7CisgICAgICByZXR1cm4gaXRlcmF0b3IoX195KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCSAgICAgIF9Db21wYXJlLCBfQWxsb2M+Ojpjb25zdF9pdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01fdXBwZXJfYm91bmQoX0NvbnN0X0xpbmtfdHlwZSBfX3gsIF9Db25zdF9MaW5rX3R5cGUgX195LAorCQkgICBjb25zdCBfS2V5JiBfX2spIGNvbnN0CisgICAgeworICAgICAgd2hpbGUgKF9feCAhPSAwKQorCWlmIChfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KF9feCkpKQorCSAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7CisJZWxzZQorCSAgX194ID0gX1NfcmlnaHQoX194KTsKKyAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihfX3kpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBwYWlyPHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkJICAgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yLAorCSB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJCSAgIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcj4KKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIGVxdWFsX3JhbmdlKGNvbnN0IF9LZXkmIF9faykKKyAgICB7CisgICAgICBfTGlua190eXBlIF9feCA9IF9NX2JlZ2luKCk7CisgICAgICBfTGlua190eXBlIF9feSA9IF9NX2VuZCgpOworICAgICAgd2hpbGUgKF9feCAhPSAwKQorCXsKKwkgIGlmIChfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleShfX3gpLCBfX2spKQorCSAgICBfX3ggPSBfU19yaWdodChfX3gpOworCSAgZWxzZSBpZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfX2ssIF9TX2tleShfX3gpKSkKKwkgICAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfTGlua190eXBlIF9feHUoX194KSwgX195dShfX3kpOworCSAgICAgIF9feSA9IF9feCwgX194ID0gX1NfbGVmdChfX3gpOworCSAgICAgIF9feHUgPSBfU19yaWdodChfX3h1KTsKKwkgICAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwKKwkJICAgICAgICAgIGl0ZXJhdG9yPihfTV9sb3dlcl9ib3VuZChfX3gsIF9feSwgX19rKSwKKwkJCQkgICAgX01fdXBwZXJfYm91bmQoX194dSwgX195dSwgX19rKSk7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+KGl0ZXJhdG9yKF9feSksCisJCQkJICAgICAgaXRlcmF0b3IoX195KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHBhaXI8dHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCQkgICBfQ29tcGFyZSwgX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IsCisJIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkJICAgX0NvbXBhcmUsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yPgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgZXF1YWxfcmFuZ2UoY29uc3QgX0tleSYgX19rKSBjb25zdAorICAgIHsKKyAgICAgIF9Db25zdF9MaW5rX3R5cGUgX194ID0gX01fYmVnaW4oKTsKKyAgICAgIF9Db25zdF9MaW5rX3R5cGUgX195ID0gX01fZW5kKCk7CisgICAgICB3aGlsZSAoX194ICE9IDApCisJeworCSAgaWYgKF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9feCksIF9faykpCisJICAgIF9feCA9IF9TX3JpZ2h0KF9feCk7CisJICBlbHNlIGlmIChfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KF9feCkpKQorCSAgICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9Db25zdF9MaW5rX3R5cGUgX194dShfX3gpLCBfX3l1KF9feSk7CisJICAgICAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7CisJICAgICAgX194dSA9IF9TX3JpZ2h0KF9feHUpOworCSAgICAgIHJldHVybiBwYWlyPGNvbnN0X2l0ZXJhdG9yLAorCQkgICAgICAgICAgY29uc3RfaXRlcmF0b3I+KF9NX2xvd2VyX2JvdW5kKF9feCwgX195LCBfX2spLAorCQkJCQkgIF9NX3VwcGVyX2JvdW5kKF9feHUsIF9feXUsIF9faykpOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPihjb25zdF9pdGVyYXRvcihfX3kpLAorCQkJCQkJICBjb25zdF9pdGVyYXRvcihfX3kpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgc3dhcChfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9fdCkKKyAgICB7CisgICAgICBpZiAoX01fcm9vdCgpID09IDApCisJeworCSAgaWYgKF9fdC5fTV9yb290KCkgIT0gMCkKKwkgICAgeworCSAgICAgIF9NX3Jvb3QoKSA9IF9fdC5fTV9yb290KCk7CisJICAgICAgX01fbGVmdG1vc3QoKSA9IF9fdC5fTV9sZWZ0bW9zdCgpOworCSAgICAgIF9NX3JpZ2h0bW9zdCgpID0gX190Ll9NX3JpZ2h0bW9zdCgpOworCSAgICAgIF9NX3Jvb3QoKS0+X01fcGFyZW50ID0gX01fZW5kKCk7CisJICAgICAgCisJICAgICAgX190Ll9NX3Jvb3QoKSA9IDA7CisJICAgICAgX190Ll9NX2xlZnRtb3N0KCkgPSBfX3QuX01fZW5kKCk7CisJICAgICAgX190Ll9NX3JpZ2h0bW9zdCgpID0gX190Ll9NX2VuZCgpOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoX190Ll9NX3Jvb3QoKSA9PSAwKQorCXsKKwkgIF9fdC5fTV9yb290KCkgPSBfTV9yb290KCk7CisJICBfX3QuX01fbGVmdG1vc3QoKSA9IF9NX2xlZnRtb3N0KCk7CisJICBfX3QuX01fcmlnaHRtb3N0KCkgPSBfTV9yaWdodG1vc3QoKTsKKwkgIF9fdC5fTV9yb290KCktPl9NX3BhcmVudCA9IF9fdC5fTV9lbmQoKTsKKwkgIAorCSAgX01fcm9vdCgpID0gMDsKKwkgIF9NX2xlZnRtb3N0KCkgPSBfTV9lbmQoKTsKKwkgIF9NX3JpZ2h0bW9zdCgpID0gX01fZW5kKCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN0ZDo6c3dhcChfTV9yb290KCksX190Ll9NX3Jvb3QoKSk7CisJICBzdGQ6OnN3YXAoX01fbGVmdG1vc3QoKSxfX3QuX01fbGVmdG1vc3QoKSk7CisJICBzdGQ6OnN3YXAoX01fcmlnaHRtb3N0KCksX190Ll9NX3JpZ2h0bW9zdCgpKTsKKwkgIAorCSAgX01fcm9vdCgpLT5fTV9wYXJlbnQgPSBfTV9lbmQoKTsKKwkgIF9fdC5fTV9yb290KCktPl9NX3BhcmVudCA9IF9fdC5fTV9lbmQoKTsKKwl9CisgICAgICAvLyBObyBuZWVkIHRvIHN3YXAgaGVhZGVyJ3MgY29sb3IgYXMgaXQgZG9lcyBub3QgY2hhbmdlLgorICAgICAgc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fbm9kZV9jb3VudCwgX190Ll9NX2ltcGwuX01fbm9kZV9jb3VudCk7CisgICAgICBzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9rZXlfY29tcGFyZSwgX190Ll9NX2ltcGwuX01fa2V5X2NvbXBhcmUpOworICAgICAgCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzEuIFN3YXBwaW5nIGNvbnRhaW5lcnMgd2l0aCB1bmVxdWFsIGFsbG9jYXRvcnMuCisgICAgICBzdGQ6Ol9fYWxsb2Nfc3dhcDxfTm9kZV9hbGxvY2F0b3I+OjoKKwlfU19kb19pdChfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSwgX190Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgcGFpcjx0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJCSAgIF9Db21wYXJlLCBfQWxsb2M+OjpfQmFzZV9wdHIsCisJIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkJICAgX0NvbXBhcmUsIF9BbGxvYz46Ol9CYXNlX3B0cj4KKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX2dldF9pbnNlcnRfdW5pcXVlX3Bvcyhjb25zdCBrZXlfdHlwZSYgX19rKQorICAgIHsKKyAgICAgIHR5cGVkZWYgcGFpcjxfQmFzZV9wdHIsIF9CYXNlX3B0cj4gX1JlczsKKyAgICAgIF9MaW5rX3R5cGUgX194ID0gX01fYmVnaW4oKTsKKyAgICAgIF9MaW5rX3R5cGUgX195ID0gX01fZW5kKCk7CisgICAgICBib29sIF9fY29tcCA9IHRydWU7CisgICAgICB3aGlsZSAoX194ICE9IDApCisJeworCSAgX195ID0gX194OworCSAgX19jb21wID0gX01faW1wbC5fTV9rZXlfY29tcGFyZShfX2ssIF9TX2tleShfX3gpKTsKKwkgIF9feCA9IF9fY29tcCA/IF9TX2xlZnQoX194KSA6IF9TX3JpZ2h0KF9feCk7CisJfQorICAgICAgaXRlcmF0b3IgX19qID0gaXRlcmF0b3IoX195KTsKKyAgICAgIGlmIChfX2NvbXApCisJeworCSAgaWYgKF9faiA9PSBiZWdpbigpKQorCSAgICByZXR1cm4gX1JlcyhfX3gsIF9feSk7CisJICBlbHNlCisJICAgIC0tX19qOworCX0KKyAgICAgIGlmIChfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleShfX2ouX01fbm9kZSksIF9faykpCisJcmV0dXJuIF9SZXMoX194LCBfX3kpOworICAgICAgcmV0dXJuIF9SZXMoX19qLl9NX25vZGUsIDApOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBwYWlyPHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkJICAgX0NvbXBhcmUsIF9BbGxvYz46Ol9CYXNlX3B0ciwKKwkgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCQkgICBfQ29tcGFyZSwgX0FsbG9jPjo6X0Jhc2VfcHRyPgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01fZ2V0X2luc2VydF9lcXVhbF9wb3MoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICB7CisgICAgICB0eXBlZGVmIHBhaXI8X0Jhc2VfcHRyLCBfQmFzZV9wdHI+IF9SZXM7CisgICAgICBfTGlua190eXBlIF9feCA9IF9NX2JlZ2luKCk7CisgICAgICBfTGlua190eXBlIF9feSA9IF9NX2VuZCgpOworICAgICAgd2hpbGUgKF9feCAhPSAwKQorCXsKKwkgIF9feSA9IF9feDsKKwkgIF9feCA9IF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX19rLCBfU19rZXkoX194KSkgPworCSAgICAgICAgX1NfbGVmdChfX3gpIDogX1NfcmlnaHQoX194KTsKKwl9CisgICAgICByZXR1cm4gX1JlcyhfX3gsIF9feSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorI2VuZGlmCisgICAgcGFpcjx0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJCSAgIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvciwgYm9vbD4KKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBfTV9pbnNlcnRfdW5pcXVlKF9BcmcmJiBfX3YpCisjZWxzZQorICAgIF9NX2luc2VydF91bmlxdWUoY29uc3QgX1ZhbCYgX192KQorI2VuZGlmCisgICAgeworICAgICAgdHlwZWRlZiBwYWlyPGl0ZXJhdG9yLCBib29sPiBfUmVzOworICAgICAgcGFpcjxfQmFzZV9wdHIsIF9CYXNlX3B0cj4gX19yZXMKKwk9IF9NX2dldF9pbnNlcnRfdW5pcXVlX3BvcyhfS2V5T2ZWYWx1ZSgpKF9fdikpOworCisgICAgICBpZiAoX19yZXMuc2Vjb25kKQorCXJldHVybiBfUmVzKF9NX2luc2VydF8oX19yZXMuZmlyc3QsIF9fcmVzLnNlY29uZCwKKwkJCSAgICAgICBfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpLAorCQkgICAgdHJ1ZSk7CisKKyAgICAgIHJldHVybiBfUmVzKGl0ZXJhdG9yKHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+KF9fcmVzLmZpcnN0KSksIGZhbHNlKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisjZW5kaWYKKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgX01faW5zZXJ0X2VxdWFsKF9BcmcmJiBfX3YpCisjZWxzZQorICAgIF9NX2luc2VydF9lcXVhbChjb25zdCBfVmFsJiBfX3YpCisjZW5kaWYKKyAgICB7CisgICAgICBwYWlyPF9CYXNlX3B0ciwgX0Jhc2VfcHRyPiBfX3JlcworCT0gX01fZ2V0X2luc2VydF9lcXVhbF9wb3MoX0tleU9mVmFsdWUoKShfX3YpKTsKKyAgICAgIHJldHVybiBfTV9pbnNlcnRfKF9fcmVzLmZpcnN0LCBfX3Jlcy5zZWNvbmQsIF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHBhaXI8dHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCQkgICBfQ29tcGFyZSwgX0FsbG9jPjo6X0Jhc2VfcHRyLAorICAgICAgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCQkgICBfQ29tcGFyZSwgX0FsbG9jPjo6X0Jhc2VfcHRyPgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01fZ2V0X2luc2VydF9oaW50X3VuaXF1ZV9wb3MoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwKKwkJCQkgIGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgaXRlcmF0b3IgX19wb3MgPSBfX3Bvc2l0aW9uLl9NX2NvbnN0X2Nhc3QoKTsKKyAgICAgIHR5cGVkZWYgcGFpcjxfQmFzZV9wdHIsIF9CYXNlX3B0cj4gX1JlczsKKworICAgICAgLy8gZW5kKCkKKyAgICAgIGlmIChfX3Bvcy5fTV9ub2RlID09IF9NX2VuZCgpKQorCXsKKwkgIGlmIChzaXplKCkgPiAwCisJICAgICAgJiYgX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX01fcmlnaHRtb3N0KCkpLCBfX2spKQorCSAgICByZXR1cm4gX1JlcygwLCBfTV9yaWdodG1vc3QoKSk7CisJICBlbHNlCisJICAgIHJldHVybiBfTV9nZXRfaW5zZXJ0X3VuaXF1ZV9wb3MoX19rKTsKKwl9CisgICAgICBlbHNlIGlmIChfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KF9fcG9zLl9NX25vZGUpKSkKKwl7CisJICAvLyBGaXJzdCwgdHJ5IGJlZm9yZS4uLgorCSAgaXRlcmF0b3IgX19iZWZvcmUgPSBfX3BvczsKKwkgIGlmIChfX3Bvcy5fTV9ub2RlID09IF9NX2xlZnRtb3N0KCkpIC8vIGJlZ2luKCkKKwkgICAgcmV0dXJuIF9SZXMoX01fbGVmdG1vc3QoKSwgX01fbGVmdG1vc3QoKSk7CisJICBlbHNlIGlmIChfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleSgoLS1fX2JlZm9yZSkuX01fbm9kZSksIF9faykpCisJICAgIHsKKwkgICAgICBpZiAoX1NfcmlnaHQoX19iZWZvcmUuX01fbm9kZSkgPT0gMCkKKwkJcmV0dXJuIF9SZXMoMCwgX19iZWZvcmUuX01fbm9kZSk7CisJICAgICAgZWxzZQorCQlyZXR1cm4gX1JlcyhfX3Bvcy5fTV9ub2RlLCBfX3Bvcy5fTV9ub2RlKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICByZXR1cm4gX01fZ2V0X2luc2VydF91bmlxdWVfcG9zKF9fayk7CisJfQorICAgICAgZWxzZSBpZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX19wb3MuX01fbm9kZSksIF9faykpCisJeworCSAgLy8gLi4uIHRoZW4gdHJ5IGFmdGVyLgorCSAgaXRlcmF0b3IgX19hZnRlciA9IF9fcG9zOworCSAgaWYgKF9fcG9zLl9NX25vZGUgPT0gX01fcmlnaHRtb3N0KCkpCisJICAgIHJldHVybiBfUmVzKDAsIF9NX3JpZ2h0bW9zdCgpKTsKKwkgIGVsc2UgaWYgKF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX19rLCBfU19rZXkoKCsrX19hZnRlcikuX01fbm9kZSkpKQorCSAgICB7CisJICAgICAgaWYgKF9TX3JpZ2h0KF9fcG9zLl9NX25vZGUpID09IDApCisJCXJldHVybiBfUmVzKDAsIF9fcG9zLl9NX25vZGUpOworCSAgICAgIGVsc2UKKwkJcmV0dXJuIF9SZXMoX19hZnRlci5fTV9ub2RlLCBfX2FmdGVyLl9NX25vZGUpOworCSAgICB9CisJICBlbHNlCisJICAgIHJldHVybiBfTV9nZXRfaW5zZXJ0X3VuaXF1ZV9wb3MoX19rKTsKKwl9CisgICAgICBlbHNlCisJLy8gRXF1aXZhbGVudCBrZXlzLgorCXJldHVybiBfUmVzKF9fcG9zLl9NX25vZGUsIDApOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyNlbmRpZgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBfTV9pbnNlcnRfdW5pcXVlXyhjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJnJiYgX192KQorI2Vsc2UKKyAgICBfTV9pbnNlcnRfdW5pcXVlXyhjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBfVmFsJiBfX3YpCisjZW5kaWYKKyAgICB7CisgICAgICBwYWlyPF9CYXNlX3B0ciwgX0Jhc2VfcHRyPiBfX3JlcworCT0gX01fZ2V0X2luc2VydF9oaW50X3VuaXF1ZV9wb3MoX19wb3NpdGlvbiwgX0tleU9mVmFsdWUoKShfX3YpKTsKKworICAgICAgaWYgKF9fcmVzLnNlY29uZCkKKwlyZXR1cm4gX01faW5zZXJ0XyhfX3Jlcy5maXJzdCwgX19yZXMuc2Vjb25kLAorCQkJICBfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+KF9fcmVzLmZpcnN0KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHBhaXI8dHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCQkgICBfQ29tcGFyZSwgX0FsbG9jPjo6X0Jhc2VfcHRyLAorICAgICAgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCQkgICBfQ29tcGFyZSwgX0FsbG9jPjo6X0Jhc2VfcHRyPgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01fZ2V0X2luc2VydF9oaW50X2VxdWFsX3Bvcyhjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBrZXlfdHlwZSYgX19rKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9fcG9zID0gX19wb3NpdGlvbi5fTV9jb25zdF9jYXN0KCk7CisgICAgICB0eXBlZGVmIHBhaXI8X0Jhc2VfcHRyLCBfQmFzZV9wdHI+IF9SZXM7CisKKyAgICAgIC8vIGVuZCgpCisgICAgICBpZiAoX19wb3MuX01fbm9kZSA9PSBfTV9lbmQoKSkKKwl7CisJICBpZiAoc2l6ZSgpID4gMAorCSAgICAgICYmICFfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KF9NX3JpZ2h0bW9zdCgpKSkpCisJICAgIHJldHVybiBfUmVzKDAsIF9NX3JpZ2h0bW9zdCgpKTsKKwkgIGVsc2UKKwkgICAgcmV0dXJuIF9NX2dldF9pbnNlcnRfZXF1YWxfcG9zKF9fayk7CisJfQorICAgICAgZWxzZSBpZiAoIV9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9fcG9zLl9NX25vZGUpLCBfX2spKQorCXsKKwkgIC8vIEZpcnN0LCB0cnkgYmVmb3JlLi4uCisJICBpdGVyYXRvciBfX2JlZm9yZSA9IF9fcG9zOworCSAgaWYgKF9fcG9zLl9NX25vZGUgPT0gX01fbGVmdG1vc3QoKSkgLy8gYmVnaW4oKQorCSAgICByZXR1cm4gX1JlcyhfTV9sZWZ0bW9zdCgpLCBfTV9sZWZ0bW9zdCgpKTsKKwkgIGVsc2UgaWYgKCFfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KCgtLV9fYmVmb3JlKS5fTV9ub2RlKSkpCisJICAgIHsKKwkgICAgICBpZiAoX1NfcmlnaHQoX19iZWZvcmUuX01fbm9kZSkgPT0gMCkKKwkJcmV0dXJuIF9SZXMoMCwgX19iZWZvcmUuX01fbm9kZSk7CisJICAgICAgZWxzZQorCQlyZXR1cm4gX1JlcyhfX3Bvcy5fTV9ub2RlLCBfX3Bvcy5fTV9ub2RlKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICByZXR1cm4gX01fZ2V0X2luc2VydF9lcXVhbF9wb3MoX19rKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLy8gLi4uIHRoZW4gdHJ5IGFmdGVyLiAgCisJICBpdGVyYXRvciBfX2FmdGVyID0gX19wb3M7CisJICBpZiAoX19wb3MuX01fbm9kZSA9PSBfTV9yaWdodG1vc3QoKSkKKwkgICAgcmV0dXJuIF9SZXMoMCwgX01fcmlnaHRtb3N0KCkpOworCSAgZWxzZSBpZiAoIV9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KCgrK19fYWZ0ZXIpLl9NX25vZGUpLCBfX2spKQorCSAgICB7CisJICAgICAgaWYgKF9TX3JpZ2h0KF9fcG9zLl9NX25vZGUpID09IDApCisJCXJldHVybiBfUmVzKDAsIF9fcG9zLl9NX25vZGUpOworCSAgICAgIGVsc2UKKwkJcmV0dXJuIF9SZXMoX19hZnRlci5fTV9ub2RlLCBfX2FmdGVyLl9NX25vZGUpOworCSAgICB9CisJICBlbHNlCisJICAgIHJldHVybiBfUmVzKDAsIDApOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisjZW5kaWYKKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgX01faW5zZXJ0X2VxdWFsXyhjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJnJiYgX192KQorI2Vsc2UKKyAgICBfTV9pbnNlcnRfZXF1YWxfKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9WYWwmIF9fdikKKyNlbmRpZgorICAgIHsKKyAgICAgIHBhaXI8X0Jhc2VfcHRyLCBfQmFzZV9wdHI+IF9fcmVzCisJPSBfTV9nZXRfaW5zZXJ0X2hpbnRfZXF1YWxfcG9zKF9fcG9zaXRpb24sIF9LZXlPZlZhbHVlKCkoX192KSk7CisKKyAgICAgIGlmIChfX3Jlcy5zZWNvbmQpCisJcmV0dXJuIF9NX2luc2VydF8oX19yZXMuZmlyc3QsIF9fcmVzLnNlY29uZCwKKwkJCSAgX0dMSUJDWFhfRk9SV0FSRChfQXJnLCBfX3YpKTsKKworICAgICAgcmV0dXJuIF9NX2luc2VydF9lcXVhbF9sb3dlcihfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01faW5zZXJ0X25vZGUoX0Jhc2VfcHRyIF9feCwgX0Jhc2VfcHRyIF9fcCwgX0xpbmtfdHlwZSBfX3opCisgICAgeworICAgICAgYm9vbCBfX2luc2VydF9sZWZ0ID0gKF9feCAhPSAwIHx8IF9fcCA9PSBfTV9lbmQoKQorCQkJICAgIHx8IF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9feiksCisJCQkJCQkgICAgICBfU19rZXkoX19wKSkpOworCisgICAgICBfUmJfdHJlZV9pbnNlcnRfYW5kX3JlYmFsYW5jZShfX2luc2VydF9sZWZ0LCBfX3osIF9fcCwKKwkJCQkgICAgdGhpcy0+X01faW1wbC5fTV9oZWFkZXIpOworICAgICAgKytfTV9pbXBsLl9NX25vZGVfY291bnQ7CisgICAgICByZXR1cm4gaXRlcmF0b3IoX196KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01faW5zZXJ0X2xvd2VyX25vZGUoX0Jhc2VfcHRyIF9fcCwgX0xpbmtfdHlwZSBfX3opCisgICAgeworICAgICAgYm9vbCBfX2luc2VydF9sZWZ0ID0gKF9fcCA9PSBfTV9lbmQoKQorCQkJICAgIHx8ICFfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleShfX3ApLAorCQkJCQkJICAgICAgIF9TX2tleShfX3opKSk7CisKKyAgICAgIF9SYl90cmVlX2luc2VydF9hbmRfcmViYWxhbmNlKF9faW5zZXJ0X2xlZnQsIF9feiwgX19wLAorCQkJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2hlYWRlcik7CisgICAgICArK19NX2ltcGwuX01fbm9kZV9jb3VudDsKKyAgICAgIHJldHVybiBpdGVyYXRvcihfX3opOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBfTV9pbnNlcnRfZXF1YWxfbG93ZXJfbm9kZShfTGlua190eXBlIF9feikKKyAgICB7CisgICAgICBfTGlua190eXBlIF9feCA9IF9NX2JlZ2luKCk7CisgICAgICBfTGlua190eXBlIF9feSA9IF9NX2VuZCgpOworICAgICAgd2hpbGUgKF9feCAhPSAwKQorCXsKKwkgIF9feSA9IF9feDsKKwkgIF9feCA9ICFfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleShfX3gpLCBfU19rZXkoX196KSkgPworCSAgICAgICAgX1NfbGVmdChfX3gpIDogX1NfcmlnaHQoX194KTsKKwl9CisgICAgICByZXR1cm4gX01faW5zZXJ0X2xvd2VyX25vZGUoX195LCBfX3opOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHBhaXI8dHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCQkgICAgIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvciwgYm9vbD4KKyAgICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgICBfTV9lbXBsYWNlX3VuaXF1ZShfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwlfTGlua190eXBlIF9feiA9IF9NX2NyZWF0ZV9ub2RlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisKKwlfX3RyeQorCSAgeworCSAgICB0eXBlZGVmIHBhaXI8aXRlcmF0b3IsIGJvb2w+IF9SZXM7CisJICAgIGF1dG8gX19yZXMgPSBfTV9nZXRfaW5zZXJ0X3VuaXF1ZV9wb3MoX1Nfa2V5KF9feikpOworCSAgICBpZiAoX19yZXMuc2Vjb25kKQorCSAgICAgIHJldHVybiBfUmVzKF9NX2luc2VydF9ub2RlKF9fcmVzLmZpcnN0LCBfX3Jlcy5zZWNvbmQsIF9feiksIHRydWUpOworCQorCSAgICBfTV9kZXN0cm95X25vZGUoX196KTsKKwkgICAgcmV0dXJuIF9SZXMoaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8X0xpbmtfdHlwZT4oX19yZXMuZmlyc3QpKSwgZmFsc2UpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9kZXN0cm95X25vZGUoX196KTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgICAgX01fZW1wbGFjZV9lcXVhbChfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwlfTGlua190eXBlIF9feiA9IF9NX2NyZWF0ZV9ub2RlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisKKwlfX3RyeQorCSAgeworCSAgICBhdXRvIF9fcmVzID0gX01fZ2V0X2luc2VydF9lcXVhbF9wb3MoX1Nfa2V5KF9feikpOworCSAgICByZXR1cm4gX01faW5zZXJ0X25vZGUoX19yZXMuZmlyc3QsIF9fcmVzLnNlY29uZCwgX196KTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX01fZGVzdHJveV9ub2RlKF9feik7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICAgIF9NX2VtcGxhY2VfaGludF91bmlxdWUoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgeworCV9MaW5rX3R5cGUgX196ID0gX01fY3JlYXRlX25vZGUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKworCV9fdHJ5CisJICB7CisJICAgIGF1dG8gX19yZXMgPSBfTV9nZXRfaW5zZXJ0X2hpbnRfdW5pcXVlX3BvcyhfX3BvcywgX1Nfa2V5KF9feikpOworCisJICAgIGlmIChfX3Jlcy5zZWNvbmQpCisJICAgICAgcmV0dXJuIF9NX2luc2VydF9ub2RlKF9fcmVzLmZpcnN0LCBfX3Jlcy5zZWNvbmQsIF9feik7CisKKwkgICAgX01fZGVzdHJveV9ub2RlKF9feik7CisJICAgIHJldHVybiBpdGVyYXRvcihzdGF0aWNfY2FzdDxfTGlua190eXBlPihfX3Jlcy5maXJzdCkpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9kZXN0cm95X25vZGUoX196KTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgICAgX01fZW1wbGFjZV9oaW50X2VxdWFsKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwlfTGlua190eXBlIF9feiA9IF9NX2NyZWF0ZV9ub2RlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisKKwlfX3RyeQorCSAgeworCSAgICBhdXRvIF9fcmVzID0gX01fZ2V0X2luc2VydF9oaW50X2VxdWFsX3BvcyhfX3BvcywgX1Nfa2V5KF9feikpOworCisJICAgIGlmIChfX3Jlcy5zZWNvbmQpCisJICAgICAgcmV0dXJuIF9NX2luc2VydF9ub2RlKF9fcmVzLmZpcnN0LCBfX3Jlcy5zZWNvbmQsIF9feik7CisKKwkgICAgcmV0dXJuIF9NX2luc2VydF9lcXVhbF9sb3dlcl9ub2RlKF9feik7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9NX2Rlc3Ryb3lfbm9kZShfX3opOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9Lb1YsCisgICAgICAgICAgIHR5cGVuYW1lIF9DbXAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfSUk+CisgICAgICB2b2lkCisgICAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS29WLCBfQ21wLCBfQWxsb2M+OjoKKyAgICAgIF9NX2luc2VydF91bmlxdWUoX0lJIF9fZmlyc3QsIF9JSSBfX2xhc3QpCisgICAgICB7CisJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJICBfTV9pbnNlcnRfdW5pcXVlXyhlbmQoKSwgKl9fZmlyc3QpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9Lb1YsCisgICAgICAgICAgIHR5cGVuYW1lIF9DbXAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfSUk+CisgICAgICB2b2lkCisgICAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS29WLCBfQ21wLCBfQWxsb2M+OjoKKyAgICAgIF9NX2luc2VydF9lcXVhbChfSUkgX19maXJzdCwgX0lJIF9fbGFzdCkKKyAgICAgIHsKKwlmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwkgIF9NX2luc2VydF9lcXVhbF8oZW5kKCksICpfX2ZpcnN0KTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBfTV9lcmFzZV9hdXgoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICB7CisgICAgICBfTGlua190eXBlIF9feSA9CisJc3RhdGljX2Nhc3Q8X0xpbmtfdHlwZT4oX1JiX3RyZWVfcmViYWxhbmNlX2Zvcl9lcmFzZQorCQkJCShjb25zdF9jYXN0PF9CYXNlX3B0cj4oX19wb3NpdGlvbi5fTV9ub2RlKSwKKwkJCQkgdGhpcy0+X01faW1wbC5fTV9oZWFkZXIpKTsKKyAgICAgIF9NX2Rlc3Ryb3lfbm9kZShfX3kpOworICAgICAgLS1fTV9pbXBsLl9NX25vZGVfY291bnQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX2VyYXNlX2F1eChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgaWYgKF9fZmlyc3QgPT0gYmVnaW4oKSAmJiBfX2xhc3QgPT0gZW5kKCkpCisJY2xlYXIoKTsKKyAgICAgIGVsc2UKKwl3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJICBlcmFzZShfX2ZpcnN0KyspOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgZXJhc2UoY29uc3QgX0tleSYgX194KQorICAgIHsKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBfX3AgPSBlcXVhbF9yYW5nZShfX3gpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBzaXplKCk7CisgICAgICBlcmFzZShfX3AuZmlyc3QsIF9fcC5zZWNvbmQpOworICAgICAgcmV0dXJuIF9fb2xkX3NpemUgLSBzaXplKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIGVyYXNlKGNvbnN0IF9LZXkqIF9fZmlyc3QsIGNvbnN0IF9LZXkqIF9fbGFzdCkKKyAgICB7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJZXJhc2UoKl9fZmlyc3QrKyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkgICAgICBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIGZpbmQoY29uc3QgX0tleSYgX19rKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9faiA9IF9NX2xvd2VyX2JvdW5kKF9NX2JlZ2luKCksIF9NX2VuZCgpLCBfX2spOworICAgICAgcmV0dXJuIChfX2ogPT0gZW5kKCkKKwkgICAgICB8fCBfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9faywKKwkJCQkJX1Nfa2V5KF9fai5fTV9ub2RlKSkpID8gZW5kKCkgOiBfX2o7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkgICAgICBfQ29tcGFyZSwgX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIGZpbmQoY29uc3QgX0tleSYgX19rKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9faiA9IF9NX2xvd2VyX2JvdW5kKF9NX2JlZ2luKCksIF9NX2VuZCgpLCBfX2spOworICAgICAgcmV0dXJuIChfX2ogPT0gZW5kKCkKKwkgICAgICB8fCBfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9faywgCisJCQkJCV9TX2tleShfX2ouX01fbm9kZSkpKSA/IGVuZCgpIDogX19qOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgY291bnQoY29uc3QgX0tleSYgX19rKSBjb25zdAorICAgIHsKKyAgICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBfX3AgPSBlcXVhbF9yYW5nZShfX2spOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IHN0ZDo6ZGlzdGFuY2UoX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICAgIHJldHVybiBfX247CisgICAgfQorCisgIF9HTElCQ1hYX1BVUkUgdW5zaWduZWQgaW50CisgIF9SYl90cmVlX2JsYWNrX2NvdW50KGNvbnN0IF9SYl90cmVlX25vZGVfYmFzZSogX19ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9fcm9vdCkgdGhyb3cgKCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYm9vbAorICAgIF9SYl90cmVlPF9LZXksX1ZhbCxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+OjpfX3JiX3ZlcmlmeSgpIGNvbnN0CisgICAgeworICAgICAgaWYgKF9NX2ltcGwuX01fbm9kZV9jb3VudCA9PSAwIHx8IGJlZ2luKCkgPT0gZW5kKCkpCisJcmV0dXJuIF9NX2ltcGwuX01fbm9kZV9jb3VudCA9PSAwICYmIGJlZ2luKCkgPT0gZW5kKCkKKwkgICAgICAgJiYgdGhpcy0+X01faW1wbC5fTV9oZWFkZXIuX01fbGVmdCA9PSBfTV9lbmQoKQorCSAgICAgICAmJiB0aGlzLT5fTV9pbXBsLl9NX2hlYWRlci5fTV9yaWdodCA9PSBfTV9lbmQoKTsKKworICAgICAgdW5zaWduZWQgaW50IF9fbGVuID0gX1JiX3RyZWVfYmxhY2tfY291bnQoX01fbGVmdG1vc3QoKSwgX01fcm9vdCgpKTsKKyAgICAgIGZvciAoY29uc3RfaXRlcmF0b3IgX19pdCA9IGJlZ2luKCk7IF9faXQgIT0gZW5kKCk7ICsrX19pdCkKKwl7CisJICBfQ29uc3RfTGlua190eXBlIF9feCA9IHN0YXRpY19jYXN0PF9Db25zdF9MaW5rX3R5cGU+KF9faXQuX01fbm9kZSk7CisJICBfQ29uc3RfTGlua190eXBlIF9fTCA9IF9TX2xlZnQoX194KTsKKwkgIF9Db25zdF9MaW5rX3R5cGUgX19SID0gX1NfcmlnaHQoX194KTsKKworCSAgaWYgKF9feC0+X01fY29sb3IgPT0gX1NfcmVkKQorCSAgICBpZiAoKF9fTCAmJiBfX0wtPl9NX2NvbG9yID09IF9TX3JlZCkKKwkJfHwgKF9fUiAmJiBfX1ItPl9NX2NvbG9yID09IF9TX3JlZCkpCisJICAgICAgcmV0dXJuIGZhbHNlOworCisJICBpZiAoX19MICYmIF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9feCksIF9TX2tleShfX0wpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgaWYgKF9fUiAmJiBfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleShfX1IpLCBfU19rZXkoX194KSkpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgaWYgKCFfX0wgJiYgIV9fUiAmJiBfUmJfdHJlZV9ibGFja19jb3VudChfX3gsIF9NX3Jvb3QoKSkgIT0gX19sZW4pCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmIChfTV9sZWZ0bW9zdCgpICE9IF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWluaW11bShfTV9yb290KCkpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmIChfTV9yaWdodG1vc3QoKSAhPSBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21heGltdW0oX01fcm9vdCgpKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3VuaW5pdGlhbGl6ZWQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfdW5pbml0aWFsaXplZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMGIxNjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3VuaW5pdGlhbGl6ZWQuaApAQCAtMCwwICsxLDY1NiBAQAorLy8gUmF3IG1lbW9yeSBtYW5pcHVsYXRvcnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX3VuaW5pdGlhbGl6ZWQuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9TVExfVU5JTklUSUFMSVpFRF9ICisjZGVmaW5lIF9TVExfVU5JTklUSUFMSVpFRF9IIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPGJvb2wgX1RyaXZpYWxWYWx1ZVR5cGVzPgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfY29weQorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBzdGF0aWMgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3VuaW5pdF9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICAgICAgeworCSAgX0ZvcndhcmRJdGVyYXRvciBfX2N1ciA9IF9fcmVzdWx0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCArK19fY3VyKQorCQlzdGQ6Ol9Db25zdHJ1Y3Qoc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpLCAqX19maXJzdCk7CisJICAgICAgcmV0dXJuIF9fY3VyOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIHN0ZDo6X0Rlc3Ryb3koX19yZXN1bHQsIF9fY3VyKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX191bmluaXRpYWxpemVkX2NvcHk8dHJ1ZT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgc3RhdGljIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX191bmluaXRfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQpCisgICAgICAgIHsgcmV0dXJuIHN0ZDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29waWVzIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgaW50byByZXN1bHQuCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIF9fcmVzdWx0ICsgKF9fZmlyc3QgLSBfX2xhc3QpCisgICAqCisgICAqICBMaWtlIGNvcHkoKSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgYW4gaW5pdGlhbGl6ZWQgb3V0cHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX0ZvcndhcmRJdGVyYXRvcgorICAgIHVuaW5pdGlhbGl6ZWRfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgcmV0dXJuIHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHk8KF9faXNfdHJpdmlhbChfVmFsdWVUeXBlMSkKKwkJCQkJJiYgX19pc190cml2aWFsKF9WYWx1ZVR5cGUyKSk+OjoKKwlfX3VuaW5pdF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOworICAgIH0KKworCisgIHRlbXBsYXRlPGJvb2wgX1RyaXZpYWxWYWx1ZVR5cGU+CisgICAgc3RydWN0IF9fdW5pbml0aWFsaXplZF9maWxsCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgdm9pZAorICAgICAgICBfX3VuaW5pdF9maWxsKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIGNvbnN0IF9UcCYgX194KQorICAgICAgICB7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19maXJzdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBmb3IgKDsgX19jdXIgIT0gX19sYXN0OyArK19fY3VyKQorCQlzdGQ6Ol9Db25zdHJ1Y3Qoc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpLCBfX3gpOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIHN0ZDo6X0Rlc3Ryb3koX19maXJzdCwgX19jdXIpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfZmlsbDx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX191bmluaXRfZmlsbChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgICBjb25zdCBfVHAmIF9feCkKKyAgICAgICAgeyBzdGQ6OmZpbGwoX19maXJzdCwgX19sYXN0LCBfX3gpOyB9CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBDb3BpZXMgdGhlIHZhbHVlIHggaW50byB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9feCAgICAgIFRoZSBzb3VyY2UgdmFsdWUuCisgICAqICBAcmV0dXJuICAgTm90aGluZy4KKyAgICoKKyAgICogIExpa2UgZmlsbCgpLCBidXQgZG9lcyBub3QgcmVxdWlyZSBhbiBpbml0aWFsaXplZCBvdXRwdXQgcmFuZ2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHVuaW5pdGlhbGl6ZWRfZmlsbChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgICAgY29uc3QgX1RwJiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsPF9faXNfdHJpdmlhbChfVmFsdWVUeXBlKT46OgorCV9fdW5pbml0X2ZpbGwoX19maXJzdCwgX19sYXN0LCBfX3gpOworICAgIH0KKworCisgIHRlbXBsYXRlPGJvb2wgX1RyaXZpYWxWYWx1ZVR5cGU+CisgICAgc3RydWN0IF9fdW5pbml0aWFsaXplZF9maWxsX24KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgdm9pZAorICAgICAgICBfX3VuaW5pdF9maWxsX24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sCisJCQljb25zdCBfVHAmIF9feCkKKyAgICAgICAgeworCSAgX0ZvcndhcmRJdGVyYXRvciBfX2N1ciA9IF9fZmlyc3Q7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgZm9yICg7IF9fbiA+IDA7IC0tX19uLCArK19fY3VyKQorCQlzdGQ6Ol9Db25zdHJ1Y3Qoc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpLCBfX3gpOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIHN0ZDo6X0Rlc3Ryb3koX19maXJzdCwgX19jdXIpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uPHRydWU+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX191bmluaXRfZmlsbF9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLAorCQkJY29uc3QgX1RwJiBfX3gpCisgICAgICAgIHsgc3RkOjpmaWxsX24oX19maXJzdCwgX19uLCBfX3gpOyB9CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBDb3BpZXMgdGhlIHZhbHVlIHggaW50byB0aGUgcmFuZ2UgW2ZpcnN0LGZpcnN0K24pLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19uICAgICAgVGhlIG51bWJlciBvZiBjb3BpZXMgdG8gbWFrZS4KKyAgICogIEBwYXJhbSAgX194ICAgICAgVGhlIHNvdXJjZSB2YWx1ZS4KKyAgICogIEByZXR1cm4gICBOb3RoaW5nLgorICAgKgorICAgKiAgTGlrZSBmaWxsX24oKSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgYW4gaW5pdGlhbGl6ZWQgb3V0cHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgdW5pbml0aWFsaXplZF9maWxsX24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uPF9faXNfdHJpdmlhbChfVmFsdWVUeXBlKT46OgorCV9fdW5pbml0X2ZpbGxfbihfX2ZpcnN0LCBfX24sIF9feCk7CisgICAgfQorCisgIC8vIEV4dGVuc2lvbnM6IHZlcnNpb25zIG9mIHVuaW5pdGlhbGl6ZWRfY29weSwgdW5pbml0aWFsaXplZF9maWxsLAorICAvLyAgYW5kIHVuaW5pdGlhbGl6ZWRfZmlsbF9uIHRoYXQgdGFrZSBhbiBhbGxvY2F0b3IgcGFyYW1ldGVyLgorICAvLyAgV2UgZGlzcGF0Y2ggYmFjayB0byB0aGUgc3RhbmRhcmQgdmVyc2lvbnMgd2hlbiB3ZSdyZSBnaXZlbiB0aGUKKyAgLy8gIGRlZmF1bHQgYWxsb2NhdG9yLiAgRm9yIG5vbmRlZmF1bHQgYWxsb2NhdG9ycyB3ZSBkbyBub3QgdXNlIAorICAvLyAgYW55IG9mIHRoZSBQT0Qgb3B0aW1pemF0aW9ucy4KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsIF9BbGxvY2F0b3ImIF9fYWxsb2MpCisgICAgeworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2N1ciA9IF9fcmVzdWx0OworICAgICAgX190cnkKKwl7CisJICB0eXBlZGVmIF9fZ251X2N4eDo6X19hbGxvY190cmFpdHM8X0FsbG9jYXRvcj4gX190cmFpdHM7CisJICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX2N1cikKKwkgICAgX190cmFpdHM6OmNvbnN0cnVjdChfX2FsbG9jLCBzdGQ6Ol9fYWRkcmVzc29mKCpfX2N1ciksICpfX2ZpcnN0KTsKKwkgIHJldHVybiBfX2N1cjsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fcmVzdWx0LCBfX2N1ciwgX19hbGxvYyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsIGFsbG9jYXRvcjxfVHA+JikKKyAgICB7IHJldHVybiBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsIF9BbGxvY2F0b3ImIF9fYWxsb2MpCisgICAgeworICAgICAgcmV0dXJuIHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfR0xJQkNYWF9NQUtFX01PVkVfSVRFUkFUT1IoX19maXJzdCksCisJCQkJCSBfR0xJQkNYWF9NQUtFX01PVkVfSVRFUkFUT1IoX19sYXN0KSwKKwkJCQkJIF9fcmVzdWx0LCBfX2FsbG9jKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgX0ZvcndhcmRJdGVyYXRvcgorICAgIF9fdW5pbml0aWFsaXplZF9tb3ZlX2lmX25vZXhjZXB0X2EoX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkJCQkgICAgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJCSAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LAorCQkJCSAgICAgICBfQWxsb2NhdG9yJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIHJldHVybiBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EKKwkoX0dMSUJDWFhfTUFLRV9NT1ZFX0lGX05PRVhDRVBUX0lURVJBVE9SKF9fZmlyc3QpLAorCSBfR0xJQkNYWF9NQUtFX01PVkVfSUZfTk9FWENFUFRfSVRFUkFUT1IoX19sYXN0KSwgX19yZXN1bHQsIF9fYWxsb2MpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9maWxsX2EoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIGNvbnN0IF9UcCYgX194LCBfQWxsb2NhdG9yJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19jdXIgPSBfX2ZpcnN0OworICAgICAgX190cnkKKwl7CisJICB0eXBlZGVmIF9fZ251X2N4eDo6X19hbGxvY190cmFpdHM8X0FsbG9jYXRvcj4gX190cmFpdHM7CisJICBmb3IgKDsgX19jdXIgIT0gX19sYXN0OyArK19fY3VyKQorCSAgICBfX3RyYWl0czo6Y29uc3RydWN0KF9fYWxsb2MsIHN0ZDo6X19hZGRyZXNzb2YoKl9fY3VyKSwgX194KTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QsIF9fY3VyLCBfX2FsbG9jKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHAyPgorICAgIGlubGluZSB2b2lkCisgICAgX191bmluaXRpYWxpemVkX2ZpbGxfYShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkJICAgY29uc3QgX1RwJiBfX3gsIGFsbG9jYXRvcjxfVHAyPiYpCisgICAgeyBzdGQ6OnVuaW5pdGlhbGl6ZWRfZmlsbChfX2ZpcnN0LCBfX2xhc3QsIF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9maWxsX25fYShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwgCisJCQkgICAgIGNvbnN0IF9UcCYgX194LCBfQWxsb2NhdG9yJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19jdXIgPSBfX2ZpcnN0OworICAgICAgX190cnkKKwl7CisJICB0eXBlZGVmIF9fZ251X2N4eDo6X19hbGxvY190cmFpdHM8X0FsbG9jYXRvcj4gX190cmFpdHM7CisJICBmb3IgKDsgX19uID4gMDsgLS1fX24sICsrX19jdXIpCisJICAgIF9fdHJhaXRzOjpjb25zdHJ1Y3QoX19hbGxvYywgc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpLCBfX3gpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6X0Rlc3Ryb3koX19maXJzdCwgX19jdXIsIF9fYWxsb2MpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9UcDI+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2EoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sIAorCQkJICAgICBjb25zdCBfVHAmIF9feCwgYWxsb2NhdG9yPF9UcDI+JikKKyAgICB7IHN0ZDo6dW5pbml0aWFsaXplZF9maWxsX24oX19maXJzdCwgX19uLCBfX3gpOyB9CisKKworICAvLyBFeHRlbnNpb25zOiBfX3VuaW5pdGlhbGl6ZWRfY29weV9tb3ZlLCBfX3VuaW5pdGlhbGl6ZWRfbW92ZV9jb3B5LAorICAvLyBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9tb3ZlLCBfX3VuaW5pdGlhbGl6ZWRfbW92ZV9maWxsLgorICAvLyBBbGwgb2YgdGhlc2UgYWxnb3JpdGhtcyB0YWtlIGEgdXNlci1zdXBwbGllZCBhbGxvY2F0b3IsIHdoaWNoIGlzIHVzZWQKKyAgLy8gZm9yIGNvbnN0cnVjdGlvbiBhbmQgZGVzdHJ1Y3Rpb24uCisKKyAgLy8gX191bmluaXRpYWxpemVkX2NvcHlfbW92ZQorICAvLyBDb3BpZXMgW2ZpcnN0MSwgbGFzdDEpIGludG8gW3Jlc3VsdCwgcmVzdWx0ICsgKGxhc3QxIC0gZmlyc3QxKSksIGFuZAorICAvLyAgbW92ZSBbZmlyc3QyLCBsYXN0MikgaW50bworICAvLyAgW3Jlc3VsdCwgcmVzdWx0ICsgKGxhc3QxIC0gZmlyc3QxKSArIChsYXN0MiAtIGZpcnN0MikpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX191bmluaXRpYWxpemVkX2NvcHlfbW92ZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsCisJCQkgICAgICBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJCSAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwKKwkJCSAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJCSAgICAgIF9BbGxvY2F0b3ImIF9fYWxsb2MpCisgICAgeworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX2ZpcnN0MSwgX19sYXN0MSwKKwkJCQkJCQkgICBfX3Jlc3VsdCwKKwkJCQkJCQkgICBfX2FsbG9jKTsKKyAgICAgIF9fdHJ5CisJeworCSAgcmV0dXJuIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYShfX2ZpcnN0MiwgX19sYXN0MiwgX19taWQsIF9fYWxsb2MpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6X0Rlc3Ryb3koX19yZXN1bHQsIF9fbWlkLCBfX2FsbG9jKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgLy8gX191bmluaXRpYWxpemVkX21vdmVfY29weQorICAvLyBNb3ZlcyBbZmlyc3QxLCBsYXN0MSkgaW50byBbcmVzdWx0LCByZXN1bHQgKyAobGFzdDEgLSBmaXJzdDEpKSwgYW5kCisgIC8vICBjb3BpZXMgW2ZpcnN0MiwgbGFzdDIpIGludG8KKyAgLy8gIFtyZXN1bHQsIHJlc3VsdCArIChsYXN0MSAtIGZpcnN0MSkgKyAobGFzdDIgLSBmaXJzdDIpKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgX0ZvcndhcmRJdGVyYXRvcgorICAgIF9fdW5pbml0aWFsaXplZF9tb3ZlX2NvcHkoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLAorCQkJICAgICAgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCQkgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsCisJCQkgICAgICBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsCisJCQkgICAgICBfQWxsb2NhdG9yJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCQkJICAgX19yZXN1bHQsCisJCQkJCQkJICAgX19hbGxvYyk7CisgICAgICBfX3RyeQorCXsKKwkgIHJldHVybiBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX19maXJzdDIsIF9fbGFzdDIsIF9fbWlkLCBfX2FsbG9jKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fcmVzdWx0LCBfX21pZCwgX19hbGxvYyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorICAKKyAgLy8gX191bmluaXRpYWxpemVkX2ZpbGxfbW92ZQorICAvLyBGaWxscyBbcmVzdWx0LCBtaWQpIHdpdGggeCwgYW5kIG1vdmVzIFtmaXJzdCwgbGFzdCkgaW50bworICAvLyAgW21pZCwgbWlkICsgKGxhc3QgLSBmaXJzdCkpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9tb3ZlKF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQsCisJCQkgICAgICBjb25zdCBfVHAmIF9feCwgX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX0FsbG9jYXRvciYgX19hbGxvYykKKyAgICB7CisgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX2EoX19yZXN1bHQsIF9fbWlkLCBfX3gsIF9fYWxsb2MpOworICAgICAgX190cnkKKwl7CisJICByZXR1cm4gc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9fZmlyc3QsIF9fbGFzdCwgX19taWQsIF9fYWxsb2MpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6X0Rlc3Ryb3koX19yZXN1bHQsIF9fbWlkLCBfX2FsbG9jKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgLy8gX191bmluaXRpYWxpemVkX21vdmVfZmlsbAorICAvLyBNb3ZlcyBbZmlyc3QxLCBsYXN0MSkgaW50byBbZmlyc3QyLCBmaXJzdDIgKyAobGFzdDEgLSBmaXJzdDEpKSwgYW5kCisgIC8vICBmaWxscyBbZmlyc3QyICsgKGxhc3QxIC0gZmlyc3QxKSwgbGFzdDIpIHdpdGggeC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgX191bmluaXRpYWxpemVkX21vdmVfZmlsbChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IgX19sYXN0MSwKKwkJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdDIsCisJCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdDIsIGNvbnN0IF9UcCYgX194LAorCQkJICAgICAgX0FsbG9jYXRvciYgX19hbGxvYykKKyAgICB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkMiA9IHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYShfX2ZpcnN0MSwgX19sYXN0MSwKKwkJCQkJCQkgICAgX19maXJzdDIsCisJCQkJCQkJICAgIF9fYWxsb2MpOworICAgICAgX190cnkKKwl7CisJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX2EoX19taWQyLCBfX2xhc3QyLCBfX3gsIF9fYWxsb2MpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6X0Rlc3Ryb3koX19maXJzdDIsIF9fbWlkMiwgX19hbGxvYyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvLyBFeHRlbnNpb25zOiBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdCwgX191bmluaXRpYWxpemVkX2RlZmF1bHRfbiwKKyAgLy8gX191bmluaXRpYWxpemVkX2RlZmF1bHRfYSwgX191bmluaXRpYWxpemVkX2RlZmF1bHRfbl9hLgorCisgIHRlbXBsYXRlPGJvb2wgX1RyaXZpYWxWYWx1ZVR5cGU+CisgICAgc3RydWN0IF9fdW5pbml0aWFsaXplZF9kZWZhdWx0XzEKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBzdGF0aWMgdm9pZAorICAgICAgICBfX3VuaW5pdF9kZWZhdWx0KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19jdXIgPSBfX2ZpcnN0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGZvciAoOyBfX2N1ciAhPSBfX2xhc3Q7ICsrX19jdXIpCisJCXN0ZDo6X0NvbnN0cnVjdChzdGQ6Ol9fYWRkcmVzc29mKCpfX2N1cikpOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIHN0ZDo6X0Rlc3Ryb3koX19maXJzdCwgX19jdXIpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF8xPHRydWU+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX191bmluaXRfZGVmYXVsdChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCSAgICBfVmFsdWVUeXBlOworCisJICBzdGQ6OmZpbGwoX19maXJzdCwgX19sYXN0LCBfVmFsdWVUeXBlKCkpOworCX0KKyAgICB9OworCisgIHRlbXBsYXRlPGJvb2wgX1RyaXZpYWxWYWx1ZVR5cGU+CisgICAgc3RydWN0IF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X25fMQorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplPgorICAgICAgICBzdGF0aWMgdm9pZAorICAgICAgICBfX3VuaW5pdF9kZWZhdWx0X24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24pCisgICAgICAgIHsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19jdXIgPSBfX2ZpcnN0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGZvciAoOyBfX24gPiAwOyAtLV9fbiwgKytfX2N1cikKKwkJc3RkOjpfQ29uc3RydWN0KHN0ZDo6X19hZGRyZXNzb2YoKl9fY3VyKSk7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgc3RkOjpfRGVzdHJveShfX2ZpcnN0LCBfX2N1cik7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X25fMTx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplPgorICAgICAgICBzdGF0aWMgdm9pZAorICAgICAgICBfX3VuaW5pdF9kZWZhdWx0X24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24pCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJICAgIF9WYWx1ZVR5cGU7CisKKwkgIHN0ZDo6ZmlsbF9uKF9fZmlyc3QsIF9fbiwgX1ZhbHVlVHlwZSgpKTsKKwl9CisgICAgfTsKKworICAvLyBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdAorICAvLyBGaWxscyBbZmlyc3QsIGxhc3QpIHdpdGggc3RkOjpkaXN0YW5jZShmaXJzdCwgbGFzdCkgZGVmYXVsdAorICAvLyBjb25zdHJ1Y3RlZCB2YWx1ZV90eXBlcyhzKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2RlZmF1bHRfMTxfX2lzX3RyaXZpYWwoX1ZhbHVlVHlwZSk+OjoKKwlfX3VuaW5pdF9kZWZhdWx0KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorCisgIC8vIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X24KKyAgLy8gRmlsbHMgW2ZpcnN0LCBmaXJzdCArIG4pIHdpdGggbiBkZWZhdWx0IGNvbnN0cnVjdGVkIHZhbHVlX3R5cGUocykuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplPgorICAgIGlubGluZSB2b2lkCisgICAgX191bmluaXRpYWxpemVkX2RlZmF1bHRfbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2RlZmF1bHRfbl8xPF9faXNfdHJpdmlhbChfVmFsdWVUeXBlKT46OgorCV9fdW5pbml0X2RlZmF1bHRfbihfX2ZpcnN0LCBfX24pOworICAgIH0KKworCisgIC8vIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X2EKKyAgLy8gRmlsbHMgW2ZpcnN0LCBsYXN0KSB3aXRoIHN0ZDo6ZGlzdGFuY2UoZmlyc3QsIGxhc3QpIGRlZmF1bHQKKyAgLy8gY29uc3RydWN0ZWQgdmFsdWVfdHlwZXMocyksIGNvbnN0cnVjdGVkIHdpdGggdGhlIGFsbG9jYXRvciBhbGxvYy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICB2b2lkCisgICAgX191bmluaXRpYWxpemVkX2RlZmF1bHRfYShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgICAgIF9BbGxvY2F0b3ImIF9fYWxsb2MpCisgICAgeworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2N1ciA9IF9fZmlyc3Q7CisgICAgICBfX3RyeQorCXsKKwkgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2FsbG9jX3RyYWl0czxfQWxsb2NhdG9yPiBfX3RyYWl0czsKKwkgIGZvciAoOyBfX2N1ciAhPSBfX2xhc3Q7ICsrX19jdXIpCisJICAgIF9fdHJhaXRzOjpjb25zdHJ1Y3QoX19hbGxvYywgc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QsIF9fY3VyLCBfX2FsbG9jKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX191bmluaXRpYWxpemVkX2RlZmF1bHRfYShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgICAgIGFsbG9jYXRvcjxfVHA+JikKKyAgICB7IHN0ZDo6X191bmluaXRpYWxpemVkX2RlZmF1bHQoX19maXJzdCwgX19sYXN0KTsgfQorCisKKyAgLy8gX191bmluaXRpYWxpemVkX2RlZmF1bHRfbl9hCisgIC8vIEZpbGxzIFtmaXJzdCwgZmlyc3QgKyBuKSB3aXRoIG4gZGVmYXVsdCBjb25zdHJ1Y3RlZCB2YWx1ZV90eXBlcyhzKSwKKyAgLy8gY29uc3RydWN0ZWQgd2l0aCB0aGUgYWxsb2NhdG9yIGFsbG9jLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICB2b2lkCisgICAgX191bmluaXRpYWxpemVkX2RlZmF1bHRfbl9hKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLCAKKwkJCQlfQWxsb2NhdG9yJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19jdXIgPSBfX2ZpcnN0OworICAgICAgX190cnkKKwl7CisJICB0eXBlZGVmIF9fZ251X2N4eDo6X19hbGxvY190cmFpdHM8X0FsbG9jYXRvcj4gX190cmFpdHM7CisJICBmb3IgKDsgX19uID4gMDsgLS1fX24sICsrX19jdXIpCisJICAgIF9fdHJhaXRzOjpjb25zdHJ1Y3QoX19hbGxvYywgc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QsIF9fY3VyLCBfX2FsbG9jKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X25fYShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwgCisJCQkJYWxsb2NhdG9yPF9UcD4mKQorICAgIHsgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uKF9fZmlyc3QsIF9fbik7IH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwKKwkgICB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaW5pdGlhbGl6ZWRfY29weV9uKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwKKwkJCSAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsIGlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19yZXN1bHQ7CisgICAgICBfX3RyeQorCXsKKwkgIGZvciAoOyBfX24gPiAwOyAtLV9fbiwgKytfX2ZpcnN0LCArK19fY3VyKQorCSAgICBzdGQ6Ol9Db25zdHJ1Y3Qoc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpLCAqX19maXJzdCk7CisJICByZXR1cm4gX19jdXI7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgc3RkOjpfRGVzdHJveShfX3Jlc3VsdCwgX19jdXIpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLAorCSAgIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaW5pdGlhbGl6ZWRfY29weV9uKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sCisJCQkgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LAorCQkJICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeyByZXR1cm4gc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19maXJzdCArIF9fbiwgX19yZXN1bHQpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29waWVzIHRoZSByYW5nZSBbZmlyc3QsZmlyc3QrbikgaW50byByZXN1bHQuCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX24gICAgICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNvcHkuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0IEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIF9fcmVzdWx0ICsgX19uCisgICAqCisgICAqICBMaWtlIGNvcHlfbigpLCBidXQgZG9lcyBub3QgcmVxdWlyZSBhbiBpbml0aWFsaXplZCBvdXRwdXQgcmFuZ2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX0ZvcndhcmRJdGVyYXRvcgorICAgIHVuaW5pdGlhbGl6ZWRfY29weV9uKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwKKwkJCSBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsgcmV0dXJuIHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfbihfX2ZpcnN0LCBfX24sIF9fcmVzdWx0LAorCQkJCQkgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsgfQorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9TVExfVU5JTklUSUFMSVpFRF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3ZlY3Rvci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF92ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGRlNDYxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF92ZWN0b3IuaApAQCAtMCwwICsxLDE0NTggQEAKKy8vIFZlY3RvciBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF92ZWN0b3IuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3ZlY3Rvcn0KKyAqLworCisjaWZuZGVmIF9TVExfVkVDVE9SX0gKKyNkZWZpbmUgX1NUTF9WRUNUT1JfSCAxCisKKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX2Z1bmNzLmg+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIC8vLyBTZWUgYml0cy9zdGxfZGVxdWUuaCdzIF9EZXF1ZV9iYXNlIGZvciBhbiBleHBsYW5hdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9WZWN0b3JfYmFzZQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2FsbG9jX3RyYWl0czxfQWxsb2M+Ojp0ZW1wbGF0ZQorICAgICAgICByZWJpbmQ8X1RwPjo6b3RoZXIgX1RwX2FsbG9jX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19hbGxvY190cmFpdHM8X1RwX2FsbG9jX3R5cGU+Ojpwb2ludGVyCisgICAgICAgCXBvaW50ZXI7CisKKyAgICAgIHN0cnVjdCBfVmVjdG9yX2ltcGwgCisgICAgICA6IHB1YmxpYyBfVHBfYWxsb2NfdHlwZQorICAgICAgeworCXBvaW50ZXIgX01fc3RhcnQ7CisJcG9pbnRlciBfTV9maW5pc2g7CisJcG9pbnRlciBfTV9lbmRfb2Zfc3RvcmFnZTsKKworCV9WZWN0b3JfaW1wbCgpCisJOiBfVHBfYWxsb2NfdHlwZSgpLCBfTV9zdGFydCgwKSwgX01fZmluaXNoKDApLCBfTV9lbmRfb2Zfc3RvcmFnZSgwKQorCXsgfQorCisJX1ZlY3Rvcl9pbXBsKF9UcF9hbGxvY190eXBlIGNvbnN0JiBfX2EpCisJOiBfVHBfYWxsb2NfdHlwZShfX2EpLCBfTV9zdGFydCgwKSwgX01fZmluaXNoKDApLCBfTV9lbmRfb2Zfc3RvcmFnZSgwKQorCXsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCV9WZWN0b3JfaW1wbChfVHBfYWxsb2NfdHlwZSYmIF9fYSkKKwk6IF9UcF9hbGxvY190eXBlKHN0ZDo6bW92ZShfX2EpKSwKKwkgIF9NX3N0YXJ0KDApLCBfTV9maW5pc2goMCksIF9NX2VuZF9vZl9zdG9yYWdlKDApCisJeyB9CisjZW5kaWYKKworCXZvaWQgX01fc3dhcF9kYXRhKF9WZWN0b3JfaW1wbCYgX194KQorCXsKKwkgIHN0ZDo6c3dhcChfTV9zdGFydCwgX194Ll9NX3N0YXJ0KTsKKwkgIHN0ZDo6c3dhcChfTV9maW5pc2gsIF9feC5fTV9maW5pc2gpOworCSAgc3RkOjpzd2FwKF9NX2VuZF9vZl9zdG9yYWdlLCBfX3guX01fZW5kX29mX3N0b3JhZ2UpOworCX0KKyAgICAgIH07CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgX1RwX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxfVHBfYWxsb2NfdHlwZSo+KCZ0aGlzLT5fTV9pbXBsKTsgfQorCisgICAgICBjb25zdCBfVHBfYWxsb2NfdHlwZSYKKyAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9UcF9hbGxvY190eXBlKj4oJnRoaXMtPl9NX2ltcGwpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgX1ZlY3Rvcl9iYXNlKCkKKyAgICAgIDogX01faW1wbCgpIHsgfQorCisgICAgICBfVmVjdG9yX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX01faW1wbChfX2EpIHsgfQorCisgICAgICBfVmVjdG9yX2Jhc2Uoc2l6ZV90IF9fbikKKyAgICAgIDogX01faW1wbCgpCisgICAgICB7IF9NX2NyZWF0ZV9zdG9yYWdlKF9fbik7IH0KKworICAgICAgX1ZlY3Rvcl9iYXNlKHNpemVfdCBfX24sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IF9NX2ltcGwoX19hKQorICAgICAgeyBfTV9jcmVhdGVfc3RvcmFnZShfX24pOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBfVmVjdG9yX2Jhc2UoX1RwX2FsbG9jX3R5cGUmJiBfX2EpCisgICAgICA6IF9NX2ltcGwoc3RkOjptb3ZlKF9fYSkpIHsgfQorCisgICAgICBfVmVjdG9yX2Jhc2UoX1ZlY3Rvcl9iYXNlJiYgX194KQorICAgICAgOiBfTV9pbXBsKHN0ZDo6bW92ZShfX3guX01fZ2V0X1RwX2FsbG9jYXRvcigpKSkKKyAgICAgIHsgdGhpcy0+X01faW1wbC5fTV9zd2FwX2RhdGEoX194Ll9NX2ltcGwpOyB9CisKKyAgICAgIF9WZWN0b3JfYmFzZShfVmVjdG9yX2Jhc2UmJiBfX3gsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IF9NX2ltcGwoX19hKQorICAgICAgeworCWlmIChfX3guZ2V0X2FsbG9jYXRvcigpID09IF9fYSkKKwkgIHRoaXMtPl9NX2ltcGwuX01fc3dhcF9kYXRhKF9feC5fTV9pbXBsKTsKKwllbHNlCisJICB7CisJICAgIHNpemVfdCBfX24gPSBfX3guX01faW1wbC5fTV9maW5pc2ggLSBfX3guX01faW1wbC5fTV9zdGFydDsKKwkgICAgX01fY3JlYXRlX3N0b3JhZ2UoX19uKTsKKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB+X1ZlY3Rvcl9iYXNlKCkKKyAgICAgIHsgX01fZGVhbGxvY2F0ZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCSAgICAgIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydCk7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIF9WZWN0b3JfaW1wbCBfTV9pbXBsOworCisgICAgICBwb2ludGVyCisgICAgICBfTV9hbGxvY2F0ZShzaXplX3QgX19uKQorICAgICAgeyByZXR1cm4gX19uICE9IDAgPyBfTV9pbXBsLmFsbG9jYXRlKF9fbikgOiAwOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdCBfX24pCisgICAgICB7CisJaWYgKF9fcCkKKwkgIF9NX2ltcGwuZGVhbGxvY2F0ZShfX3AsIF9fbik7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01fY3JlYXRlX3N0b3JhZ2Uoc2l6ZV90IF9fbikKKyAgICAgIHsKKwl0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gdGhpcy0+X01fYWxsb2NhdGUoX19uKTsKKwl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQ7CisJdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX247CisgICAgICB9CisgICAgfTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIHdoaWNoIG9mZmVycyBmaXhlZCB0aW1lIGFjY2VzcyB0bworICAgKiAgaW5kaXZpZHVhbCBlbGVtZW50cyBpbiBhbnkgb3JkZXIuCisgICAqCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIEB0cGFyYW0gX1RwICBUeXBlIG9mIGVsZW1lbnQuCisgICAqICBAdHBhcmFtIF9BbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxfVHA+LgorICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NiI+cmV2ZXJzaWJsZSBjb250YWluZXI8L2E+LCBhbmQgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjciPnNlcXVlbmNlPC9hPiwgaW5jbHVkaW5nIHRoZQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjgiPm9wdGlvbmFsIHNlcXVlbmNlIHJlcXVpcmVtZW50czwvYT4gd2l0aCB0aGUKKyAgICogICVleGNlcHRpb24gb2YgQGMgcHVzaF9mcm9udCBhbmQgQGMgcG9wX2Zyb250LgorICAgKgorICAgKiAgSW4gc29tZSB0ZXJtaW5vbG9neSBhICV2ZWN0b3IgY2FuIGJlIGRlc2NyaWJlZCBhcyBhIGR5bmFtaWMKKyAgICogIEMtc3R5bGUgYXJyYXksIGl0IG9mZmVycyBmYXN0IGFuZCBlZmZpY2llbnQgYWNjZXNzIHRvIGluZGl2aWR1YWwKKyAgICogIGVsZW1lbnRzIGluIGFueSBvcmRlciBhbmQgc2F2ZXMgdGhlIHVzZXIgZnJvbSB3b3JyeWluZyBhYm91dAorICAgKiAgbWVtb3J5IGFuZCBzaXplIGFsbG9jYXRpb24uICBTdWJzY3JpcHRpbmcgKCBAYyBbXSApIGFjY2VzcyBpcworICAgKiAgYWxzbyBwcm92aWRlZCBhcyB3aXRoIEMtc3R5bGUgYXJyYXlzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIHZlY3RvciA6IHByb3RlY3RlZCBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+CisgICAgeworICAgICAgLy8gQ29uY2VwdCByZXF1aXJlbWVudHMuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSAgICAgICAgICAgICAgICBfQWxsb2NfdmFsdWVfdHlwZTsKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVHAsIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczIoX1RwLCBfQWxsb2NfdmFsdWVfdHlwZSwgX1NhbWVUeXBlQ29uY2VwdCkKKyAgICAgIAorICAgICAgdHlwZWRlZiBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+CQkJIF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6X1RwX2FsbG9jX3R5cGUJCSBfVHBfYWxsb2NfdHlwZTsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2FsbG9jX3RyYWl0czxfVHBfYWxsb2NfdHlwZT4gIF9BbGxvY190cmFpdHM7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcAkJCQkJIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzOjpjb25zdF9wb2ludGVyICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czo6cmVmZXJlbmNlICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czo6Y29uc3RfcmVmZXJlbmNlICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX25vcm1hbF9pdGVyYXRvcjxwb2ludGVyLCB2ZWN0b3I+IGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fbm9ybWFsX2l0ZXJhdG9yPGNvbnN0X3BvaW50ZXIsIHZlY3Rvcj4KKyAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+CQkgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc2l6ZV90CQkJCQkgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QJCQkJCSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgIAkJIGFsbG9jYXRvcl90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2FsbG9jYXRlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2RlYWxsb2NhdGU7CisgICAgICB1c2luZyBfQmFzZTo6X01faW1wbDsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9nZXRfVHBfYWxsb2NhdG9yOworCisgICAgcHVibGljOgorICAgICAgLy8gWzIzLjIuNC4xXSBjb25zdHJ1Y3QvY29weS9kZXN0cm95CisgICAgICAvLyAoYXNzaWduKCkgYW5kIGdldF9hbGxvY2F0b3IoKSBhcmUgYWxzbyBsaXN0ZWQgaW4gdGhpcyBzZWN0aW9uKQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgbm8gZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIHZlY3RvcigpCisgICAgICA6IF9CYXNlKCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICV2ZWN0b3Igd2l0aCBubyBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfQmFzZShfX2EpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJXZlY3RvciB3aXRoIGRlZmF1bHQgY29uc3RydWN0ZWQgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSAldmVjdG9yIHdpdGggQGEgX19uIGRlZmF1bHQKKyAgICAgICAqICBjb25zdHJ1Y3RlZCBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2EpCisgICAgICB7IF9NX2RlZmF1bHRfaW5pdGlhbGl6ZShfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICV2ZWN0b3Igd2l0aCBjb3BpZXMgb2YgYW4gZXhlbXBsYXIgZWxlbWVudC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBpbml0aWFsbHkgY3JlYXRlLgorICAgICAgICogIEBwYXJhbSAgX192YWx1ZSAgQW4gZWxlbWVudCB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgY29uc3RydWN0b3IgZmlsbHMgdGhlICV2ZWN0b3Igd2l0aCBAYSBfX24gY29waWVzIG9mIEBhIF9fdmFsdWUuCisgICAgICAgKi8KKyAgICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbHVlLAorCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19hKQorICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoX19uLCBfX3ZhbHVlKTsgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICV2ZWN0b3Igd2l0aCBjb3BpZXMgb2YgYW4gZXhlbXBsYXIgZWxlbWVudC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBpbml0aWFsbHkgY3JlYXRlLgorICAgICAgICogIEBwYXJhbSAgX192YWx1ZSAgQW4gZWxlbWVudCB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgY29uc3RydWN0b3IgZmlsbHMgdGhlICV2ZWN0b3Igd2l0aCBAYSBfX24gY29waWVzIG9mIEBhIF9fdmFsdWUuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWx1ZSA9IHZhbHVlX3R5cGUoKSwKKwkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9fYSkKKyAgICAgIHsgX01fZmlsbF9pbml0aWFsaXplKF9fbiwgX192YWx1ZSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVWZWN0b3IgY29weSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAldmVjdG9yIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICV2ZWN0b3IgdXNlcyBhIGNvcHkgb2YgdGhlIGFsbG9jYXRpb24KKyAgICAgICAqICBvYmplY3QgdXNlZCBieSBAYSBfX3guICBBbGwgdGhlIGVsZW1lbnRzIG9mIEBhIF9feCBhcmUgY29waWVkLAorICAgICAgICogIGJ1dCBhbnkgZXh0cmEgbWVtb3J5IGluCisgICAgICAgKiAgQGEgX194IChmb3IgZmFzdCBleHBhbnNpb24pIHdpbGwgbm90IGJlIGNvcGllZC4KKyAgICAgICAqLworICAgICAgdmVjdG9yKGNvbnN0IHZlY3RvciYgX194KQorICAgICAgOiBfQmFzZShfX3guc2l6ZSgpLAorICAgICAgICBfQWxsb2NfdHJhaXRzOjpfU19zZWxlY3Rfb25fY29weShfX3guX01fZ2V0X1RwX2FsbG9jYXRvcigpKSkKKyAgICAgIHsgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPQorCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9feC5iZWdpbigpLCBfX3guZW5kKCksCisJCQkJICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlVmVjdG9yIG1vdmUgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJXZlY3RvciBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAldmVjdG9yIGNvbnRhaW5zIHRoZSBleGFjdCBjb250ZW50cyBvZiBAYSBfX3guCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIF9feCBhcmUgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICV2ZWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZlY3Rvcih2ZWN0b3ImJiBfX3gpIG5vZXhjZXB0CisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKSB7IH0KKworICAgICAgLy8vIENvcHkgY29uc3RydWN0b3Igd2l0aCBhbHRlcm5hdGl2ZSBhbGxvY2F0b3IKKyAgICAgIHZlY3Rvcihjb25zdCB2ZWN0b3ImIF9feCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX0Jhc2UoX194LnNpemUoKSwgX19hKQorICAgICAgeyB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9CisJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX194LmJlZ2luKCksIF9feC5lbmQoKSwKKwkJCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJCSAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisgICAgICB9CisKKyAgICAgIC8vLyBNb3ZlIGNvbnN0cnVjdG9yIHdpdGggYWx0ZXJuYXRpdmUgYWxsb2NhdG9yCisgICAgICB2ZWN0b3IodmVjdG9yJiYgX19ydiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fbSkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9fcnYpLCBfX20pCisgICAgICB7CisJaWYgKF9fcnYuZ2V0X2FsbG9jYXRvcigpICE9IF9fbSkKKwkgIHsKKwkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPQorCSAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYShfX3J2LmJlZ2luKCksIF9fcnYuZW5kKCksCisJCQkJCSAgdGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICBfX3J2LmNsZWFyKCk7CisJICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJXZlY3RvciBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvci4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGEgJXZlY3RvciBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgaW5pdGlhbGl6ZXJfbGlzdCBAYSBfX2wuCisgICAgICAgKgorICAgICAgICogIFRoaXMgd2lsbCBjYWxsIHRoZSBlbGVtZW50IHR5cGUncyBjb3B5IGNvbnN0cnVjdG9yIE4gdGltZXMKKyAgICAgICAqICAod2hlcmUgTiBpcyBAYSBfX2wuc2l6ZSgpKSBhbmQgZG8gbm8gbWVtb3J5IHJlYWxsb2NhdGlvbi4KKyAgICAgICAqLworICAgICAgdmVjdG9yKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fYSkKKyAgICAgIHsKKwlfTV9yYW5nZV9pbml0aWFsaXplKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksCisJCQkgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAldmVjdG9yIGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAldmVjdG9yIGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgW2ZpcnN0LGxhc3QpLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgaXRlcmF0b3JzIGFyZSBmb3J3YXJkLCBiaWRpcmVjdGlvbmFsLCBvcgorICAgICAgICogIHJhbmRvbS1hY2Nlc3MsIHRoZW4gdGhpcyB3aWxsIGNhbGwgdGhlIGVsZW1lbnRzJyBjb3B5CisgICAgICAgKiAgY29uc3RydWN0b3IgTiB0aW1lcyAod2hlcmUgTiBpcyBkaXN0YW5jZShmaXJzdCxsYXN0KSkgYW5kIGRvCisgICAgICAgKiAgbm8gbWVtb3J5IHJlYWxsb2NhdGlvbi4gIEJ1dCBpZiBvbmx5IGlucHV0IGl0ZXJhdG9ycyBhcmUKKyAgICAgICAqICB1c2VkLCB0aGVuIHRoaXMgd2lsbCBkbyBhdCBtb3N0IDJOIGNhbGxzIHRvIHRoZSBjb3B5CisgICAgICAgKiAgY29uc3RydWN0b3IsIGFuZCBsb2dOIG1lbW9yeSByZWFsbG9jYXRpb25zLgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisgICAgICAgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19hKQorICAgICAgICB7IF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfX2ZhbHNlX3R5cGUoKSk7IH0KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdmVjdG9yKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2EpCisgICAgICAgIHsKKwkgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworCX0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBUaGUgZHRvciBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCBub3RlIHRoYXQgaWYgdGhlCisgICAgICAgKiAgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcworICAgICAgICogIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIH52ZWN0b3IoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyBzdGQ6Ol9EZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJVZlY3RvciBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICV2ZWN0b3Igb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgQWxsIHRoZSBlbGVtZW50cyBvZiBAYSBfX3ggYXJlIGNvcGllZCwgYnV0IGFueSBleHRyYSBtZW1vcnkgaW4KKyAgICAgICAqICBAYSBfX3ggKGZvciBmYXN0IGV4cGFuc2lvbikgd2lsbCBub3QgYmUgY29waWVkLiAgVW5saWtlIHRoZQorICAgICAgICogIGNvcHkgY29uc3RydWN0b3IsIHRoZSBhbGxvY2F0b3Igb2JqZWN0IGlzIG5vdCBjb3BpZWQuCisgICAgICAgKi8KKyAgICAgIHZlY3RvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB2ZWN0b3ImIF9feCk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVWZWN0b3IgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICV2ZWN0b3Igb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIF9feCBhcmUgbW92ZWQgaW50byB0aGlzICV2ZWN0b3IgKHdpdGhvdXQgY29weWluZywKKyAgICAgICAqICBpZiB0aGUgYWxsb2NhdG9ycyBwZXJtaXQgaXQpLgorICAgICAgICogIEBhIF9feCBpcyBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgJXZlY3Rvci4KKyAgICAgICAqLworICAgICAgdmVjdG9yJgorICAgICAgb3BlcmF0b3I9KHZlY3RvciYmIF9feCkgbm9leGNlcHQoX0FsbG9jX3RyYWl0czo6X1Nfbm90aHJvd19tb3ZlKCkpCisgICAgICB7CisgICAgICAgIGNvbnN0ZXhwciBib29sIF9fbW92ZV9zdG9yYWdlID0KKyAgICAgICAgICBfQWxsb2NfdHJhaXRzOjpfU19wcm9wYWdhdGVfb25fbW92ZV9hc3NpZ24oKQorICAgICAgICAgIHx8IF9BbGxvY190cmFpdHM6Ol9TX2Fsd2F5c19lcXVhbCgpOworICAgICAgICBfTV9tb3ZlX2Fzc2lnbihzdGQ6Om1vdmUoX194KSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19tb3ZlX3N0b3JhZ2U+KCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlVmVjdG9yIGxpc3QgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICV2ZWN0b3Igd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyIGxpc3QgQGEgX19sLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAldmVjdG9yIGFuZAorICAgICAgICogIHRoYXQgdGhlIHJlc3VsdGluZyAldmVjdG9yJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgdmVjdG9yJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ25zIGEgZ2l2ZW4gdmFsdWUgdG8gYSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgYXNzaWduZWQuCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbCAgVmFsdWUgdG8gYmUgYXNzaWduZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAldmVjdG9yIHdpdGggQGEgX19uIGNvcGllcyBvZiB0aGUgZ2l2ZW4KKyAgICAgICAqICB2YWx1ZS4gIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlCisgICAgICAgKiAgJXZlY3RvciBhbmQgdGhhdCB0aGUgcmVzdWx0aW5nICV2ZWN0b3IncyBzaXplIGlzIHRoZSBzYW1lIGFzCisgICAgICAgKiAgdGhlIG51bWJlciBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpCisgICAgICB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhIHJhbmdlIHRvIGEgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAldmVjdG9yIHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICByYW5nZSBbX19maXJzdCxfX2xhc3QpLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAldmVjdG9yIGFuZAorICAgICAgICogIHRoYXQgdGhlIHJlc3VsdGluZyAldmVjdG9yJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX19mYWxzZV90eXBlKCkpOyB9CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwkgIF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKwl9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhbiBpbml0aWFsaXplciBsaXN0IHRvIGEgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICV2ZWN0b3Igd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyIGxpc3QgQGEgX19sLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAldmVjdG9yIGFuZAorICAgICAgICogIHRoYXQgdGhlIHJlc3VsdGluZyAldmVjdG9yJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyB0aGlzLT5hc3NpZ24oX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgICAvLy8gR2V0IGEgY29weSBvZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gb2JqZWN0LgorICAgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisKKyAgICAgIC8vIGl0ZXJhdG9ycworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5CisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBmaXJzdCBlbGVtZW50IGluIHRoZSAldmVjdG9yLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9zdGFydCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAldmVjdG9yLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QKKyAgICAgICAqICB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSAldmVjdG9yLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICBvcmRpbmFyeSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIHJldmVyc2UKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSAldmVjdG9yLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIG9uZQorICAgICAgICogIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbiBpcyBkb25lCisgICAgICAgKiAgaW4gcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byBvbmUgYmVmb3JlIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSAldmVjdG9yLiAgSXRlcmF0aW9uCisgICAgICAgKiAgaXMgZG9uZSBpbiByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGZpcnN0IGVsZW1lbnQgaW4gdGhlICV2ZWN0b3IuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9zdGFydCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0CisgICAgICAgKiAgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgb3JkaW5hcnkgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9maW5pc2gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gb25lIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbgorICAgICAgICogIGlzIGRvbmUgaW4gcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gWzIzLjIuNC4yXSBjYXBhY2l0eQorICAgICAgLyoqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlICV2ZWN0b3IuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHNpemVfdHlwZSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOyB9CisKKyAgICAgIC8qKiAgUmV0dXJucyB0aGUgc2l6ZSgpIG9mIHRoZSBsYXJnZXN0IHBvc3NpYmxlICV2ZWN0b3IuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfQWxsb2NfdHJhaXRzOjptYXhfc2l6ZShfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2l6ZXMgdGhlICV2ZWN0b3IgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX25ld19zaXplICBOdW1iZXIgb2YgZWxlbWVudHMgdGhlICV2ZWN0b3Igc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAldmVjdG9yIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBudW1iZXIgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICAqICAldmVjdG9yJ3MgY3VycmVudCBzaXplIHRoZSAldmVjdG9yIGlzIHRydW5jYXRlZCwgb3RoZXJ3aXNlCisgICAgICAgKiAgZGVmYXVsdCBjb25zdHJ1Y3RlZCBlbGVtZW50cyBhcmUgYXBwZW5kZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkKKyAgICAgIHsKKwlpZiAoX19uZXdfc2l6ZSA+IHNpemUoKSkKKwkgIF9NX2RlZmF1bHRfYXBwZW5kKF9fbmV3X3NpemUgLSBzaXplKCkpOworCWVsc2UgaWYgKF9fbmV3X3NpemUgPCBzaXplKCkpCisJICBfTV9lcmFzZV9hdF9lbmQodGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9fbmV3X3NpemUpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2l6ZXMgdGhlICV2ZWN0b3IgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX25ld19zaXplICBOdW1iZXIgb2YgZWxlbWVudHMgdGhlICV2ZWN0b3Igc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgd2l0aCB3aGljaCBuZXcgZWxlbWVudHMgc2hvdWxkIGJlIHBvcHVsYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICV2ZWN0b3IgdG8gdGhlIHNwZWNpZmllZAorICAgICAgICogIG51bWJlciBvZiBlbGVtZW50cy4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZQorICAgICAgICogICV2ZWN0b3IncyBjdXJyZW50IHNpemUgdGhlICV2ZWN0b3IgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UKKyAgICAgICAqICB0aGUgJXZlY3RvciBpcyBleHRlbmRlZCBhbmQgbmV3IGVsZW1lbnRzIGFyZSBwb3B1bGF0ZWQgd2l0aAorICAgICAgICogIGdpdmVuIGRhdGEuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCWlmIChfX25ld19zaXplID4gc2l6ZSgpKQorCSAgaW5zZXJ0KGVuZCgpLCBfX25ld19zaXplIC0gc2l6ZSgpLCBfX3gpOworCWVsc2UgaWYgKF9fbmV3X3NpemUgPCBzaXplKCkpCisJICBfTV9lcmFzZV9hdF9lbmQodGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9fbmV3X3NpemUpOworICAgICAgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVzaXplcyB0aGUgJXZlY3RvciB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fbmV3X3NpemUgIE51bWJlciBvZiBlbGVtZW50cyB0aGUgJXZlY3RvciBzaG91bGQgY29udGFpbi4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB3aXRoIHdoaWNoIG5ldyBlbGVtZW50cyBzaG91bGQgYmUgcG9wdWxhdGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgJXJlc2l6ZSB0aGUgJXZlY3RvciB0byB0aGUgc3BlY2lmaWVkCisgICAgICAgKiAgbnVtYmVyIG9mIGVsZW1lbnRzLiAgSWYgdGhlIG51bWJlciBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICAgICAgKiAgJXZlY3RvcidzIGN1cnJlbnQgc2l6ZSB0aGUgJXZlY3RvciBpcyB0cnVuY2F0ZWQsIG90aGVyd2lzZQorICAgICAgICogIHRoZSAldmVjdG9yIGlzIGV4dGVuZGVkIGFuZCBuZXcgZWxlbWVudHMgYXJlIHBvcHVsYXRlZCB3aXRoCisgICAgICAgKiAgZ2l2ZW4gZGF0YS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCB2YWx1ZV90eXBlIF9feCA9IHZhbHVlX3R5cGUoKSkKKyAgICAgIHsKKwlpZiAoX19uZXdfc2l6ZSA+IHNpemUoKSkKKwkgIGluc2VydChlbmQoKSwgX19uZXdfc2l6ZSAtIHNpemUoKSwgX194KTsKKwllbHNlIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKQorCSAgX01fZXJhc2VfYXRfZW5kKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX25ld19zaXplKTsKKyAgICAgIH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqICBBIG5vbi1iaW5kaW5nIHJlcXVlc3QgdG8gcmVkdWNlIGNhcGFjaXR5KCkgdG8gc2l6ZSgpLiAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNocmlua190b19maXQoKQorICAgICAgeyBfTV9zaHJpbmtfdG9fZml0KCk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCB0aGUgJXZlY3RvciBjYW4KKyAgICAgICAqICBob2xkIGJlZm9yZSBuZWVkaW5nIHRvIGFsbG9jYXRlIG1vcmUgbWVtb3J5LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNhcGFjaXR5KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHNpemVfdHlwZSh0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQkgLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlICV2ZWN0b3IgaXMgZW1wdHkuICAoVGh1cyBiZWdpbigpIHdvdWxkCisgICAgICAgKiAgZXF1YWwgZW5kKCkuKQorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBiZWdpbigpID09IGVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXR0ZW1wdCB0byBwcmVhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IGZvciBzcGVjaWZpZWQgbnVtYmVyIG9mCisgICAgICAgKiAgICAgICAgICBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVpcmVkLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIEBhIG4gZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIHJlc2VydmUgZW5vdWdoIG1lbW9yeSBmb3IgdGhlCisgICAgICAgKiAgJXZlY3RvciB0byBob2xkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLiAgSWYgdGhlCisgICAgICAgKiAgbnVtYmVyIHJlcXVlc3RlZCBpcyBtb3JlIHRoYW4gbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzCisgICAgICAgKiAgdGhyb3duLgorICAgICAgICoKKyAgICAgICAqICBUaGUgYWR2YW50YWdlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhhdCBpZiBvcHRpbWFsIGNvZGUgaXMgYQorICAgICAgICogIG5lY2Vzc2l0eSBhbmQgdGhlIHVzZXIgY2FuIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCisgICAgICAgKiAgdGhhdCB3aWxsIGJlIHJlcXVpcmVkLCB0aGUgdXNlciBjYW4gcmVzZXJ2ZSB0aGUgbWVtb3J5IGluCisgICAgICAgKiAgJWFkdmFuY2UsIGFuZCB0aHVzIHByZXZlbnQgYSBwb3NzaWJsZSByZWFsbG9jYXRpb24gb2YgbWVtb3J5CisgICAgICAgKiAgYW5kIGNvcHlpbmcgb2YgJXZlY3RvciBkYXRhLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNlcnZlKHNpemVfdHlwZSBfX24pOworCisgICAgICAvLyBlbGVtZW50IGFjY2VzcworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdWJzY3JpcHQgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19uIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUKKyAgICAgICAqICBhY2Nlc3NlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkL3dyaXRlIHJlZmVyZW5jZSB0byBkYXRhLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdG9yIGFsbG93cyBmb3IgZWFzeSwgYXJyYXktc3R5bGUsIGRhdGEgYWNjZXNzLgorICAgICAgICogIE5vdGUgdGhhdCBkYXRhIGFjY2VzcyB3aXRoIHRoaXMgb3BlcmF0b3IgaXMgdW5jaGVja2VkIGFuZAorICAgICAgICogIG91dF9vZl9yYW5nZSBsb29rdXBzIGFyZSBub3QgZGVmaW5lZC4gKEZvciBjaGVja2VkIGxvb2t1cHMKKyAgICAgICAqICBzZWUgYXQoKS4pCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gKih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN1YnNjcmlwdCBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSBfX24gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGZvciB3aGljaCBkYXRhIHNob3VsZCBiZQorICAgICAgICogIGFjY2Vzc2VkLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byBkYXRhLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdG9yIGFsbG93cyBmb3IgZWFzeSwgYXJyYXktc3R5bGUsIGRhdGEgYWNjZXNzLgorICAgICAgICogIE5vdGUgdGhhdCBkYXRhIGFjY2VzcyB3aXRoIHRoaXMgb3BlcmF0b3IgaXMgdW5jaGVja2VkIGFuZAorICAgICAgICogIG91dF9vZl9yYW5nZSBsb29rdXBzIGFyZSBub3QgZGVmaW5lZC4gKEZvciBjaGVja2VkIGxvb2t1cHMKKyAgICAgICAqICBzZWUgYXQoKS4pCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gKih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19uKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8vIFNhZmV0eSBjaGVjayB1c2VkIG9ubHkgZnJvbSBhdCgpLgorICAgICAgdm9pZAorICAgICAgX01fcmFuZ2VfY2hlY2soc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlpZiAoX19uID49IHRoaXMtPnNpemUoKSkKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigidmVjdG9yOjpfTV9yYW5nZV9jaGVjayIpKTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19uIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUKKyAgICAgICAqICBhY2Nlc3NlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkL3dyaXRlIHJlZmVyZW5jZSB0byBkYXRhLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fbiBpcyBhbiBpbnZhbGlkIGluZGV4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBzYWZlciBkYXRhIGFjY2Vzcy4gIFRoZSBwYXJhbWV0ZXIKKyAgICAgICAqICBpcyBmaXJzdCBjaGVja2VkIHRoYXQgaXQgaXMgaW4gdGhlIHJhbmdlIG9mIHRoZSB2ZWN0b3IuICBUaGUKKyAgICAgICAqICBmdW5jdGlvbiB0aHJvd3Mgb3V0X29mX3JhbmdlIGlmIHRoZSBjaGVjayBmYWlscy4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBhdChzaXplX3R5cGUgX19uKQorICAgICAgeworCV9NX3JhbmdlX2NoZWNrKF9fbik7CisJcmV0dXJuICgqdGhpcylbX19uXTsgCisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19uIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUKKyAgICAgICAqICBhY2Nlc3NlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX24gaXMgYW4gaW52YWxpZCBpbmRleC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBmb3Igc2FmZXIgZGF0YSBhY2Nlc3MuICBUaGUgcGFyYW1ldGVyCisgICAgICAgKiAgaXMgZmlyc3QgY2hlY2tlZCB0aGF0IGl0IGlzIGluIHRoZSByYW5nZSBvZiB0aGUgdmVjdG9yLiAgVGhlCisgICAgICAgKiAgZnVuY3Rpb24gdGhyb3dzIG91dF9vZl9yYW5nZSBpZiB0aGUgY2hlY2sgZmFpbHMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlfTV9yYW5nZV9jaGVjayhfX24pOworCXJldHVybiAoKnRoaXMpW19fbl07CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAldmVjdG9yLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGZyb250KCkKKyAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXZlY3Rvci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAldmVjdG9yLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGJhY2soKQorICAgICAgeyByZXR1cm4gKihlbmQoKSAtIDEpOyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlCisgICAgICAgKiAgbGFzdCBlbGVtZW50IG9mIHRoZSAldmVjdG9yLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeyByZXR1cm4gKihlbmQoKSAtIDEpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDQ2NC4gU3VnZ2VzdGlvbiBmb3IgbmV3IG1lbWJlciBmdW5jdGlvbnMgaW4gc3RhbmRhcmQgY29udGFpbmVycy4KKyAgICAgIC8vIGRhdGEgYWNjZXNzCisgICAgICAvKioKKyAgICAgICAqICAgUmV0dXJucyBhIHBvaW50ZXIgc3VjaCB0aGF0IFtkYXRhKCksIGRhdGEoKSArIHNpemUoKSkgaXMgYSB2YWxpZAorICAgICAgICogICByYW5nZS4gIEZvciBhIG5vbi1lbXB0eSAldmVjdG9yLCBkYXRhKCkgPT0gJmZyb250KCkuCisgICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBfVHAqCisjZWxzZQorICAgICAgcG9pbnRlcgorI2VuZGlmCisgICAgICBkYXRhKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoZnJvbnQoKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0IF9UcCoKKyNlbHNlCisgICAgICBjb25zdF9wb2ludGVyCisjZW5kaWYKKyAgICAgIGRhdGEoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihmcm9udCgpKTsgfQorCisgICAgICAvLyBbMjMuMi40LjNdIG1vZGlmaWVycworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBZGQgZGF0YSB0byB0aGUgZW5kIG9mIHRoZSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBEYXRhIHRvIGJlIGFkZGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCBzdGFjayBvcGVyYXRpb24uICBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhbgorICAgICAgICogIGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgJXZlY3RvciBhbmQgYXNzaWducyB0aGUgZ2l2ZW4gZGF0YQorICAgICAgICogIHRvIGl0LiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAldmVjdG9yIHRoaXMgb3BlcmF0aW9uIGNhbiBiZQorICAgICAgICogIGRvbmUgaW4gY29uc3RhbnQgdGltZSBpZiB0aGUgJXZlY3RvciBoYXMgcHJlYWxsb2NhdGVkIHNwYWNlCisgICAgICAgKiAgYXZhaWxhYmxlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCWlmICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAhPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlKQorCSAgeworCSAgICBfQWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QodGhpcy0+X01faW1wbCwgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3gpOworCSAgICArK3RoaXMtPl9NX2ltcGwuX01fZmluaXNoOworCSAgfQorCWVsc2UKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisJICBfTV9lbXBsYWNlX2JhY2tfYXV4KF9feCk7CisjZWxzZQorCSAgX01faW5zZXJ0X2F1eChlbmQoKSwgX194KTsKKyNlbmRpZgorICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IGVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgZW1wbGFjZV9iYWNrKF9BcmdzJiYuLi4gX19hcmdzKTsKKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZXMgbGFzdCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCBzdGFjayBvcGVyYXRpb24uIEl0IHNocmlua3MgdGhlICV2ZWN0b3IgYnkgb25lLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgbm8gZGF0YSBpcyByZXR1cm5lZCwgYW5kIGlmIHRoZSBsYXN0IGVsZW1lbnQncworICAgICAgICogIGRhdGEgaXMgbmVlZGVkLCBpdCBzaG91bGQgYmUgcmV0cmlldmVkIGJlZm9yZSBwb3BfYmFjaygpIGlzCisgICAgICAgKiAgY2FsbGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwb3BfYmFjaygpCisgICAgICB7CisJLS10aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKwlfQWxsb2NfdHJhaXRzOjpkZXN0cm95KHRoaXMtPl9NX2ltcGwsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBhbiBvYmplY3QgaW4gJXZlY3RvciBiZWZvcmUgc3BlY2lmaWVkIGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYXJncyAgQXJndW1lbnRzLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBkYXRhLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGFuIG9iamVjdCBvZiB0eXBlIFQgY29uc3RydWN0ZWQKKyAgICAgICAqICB3aXRoIFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSBiZWZvcmUgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBraW5kIG9mIG9wZXJhdGlvbiBjb3VsZCBiZSBleHBlbnNpdmUgZm9yIGEgJXZlY3RvcgorICAgICAgICogIGFuZCBpZiBpdCBpcyBmcmVxdWVudGx5IHVzZWQgdGhlIHVzZXIgc2hvdWxkIGNvbnNpZGVyIHVzaW5nCisgICAgICAgKiAgc3RkOjpsaXN0LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGdpdmVuIHZhbHVlIGludG8gJXZlY3RvciBiZWZvcmUgc3BlY2lmaWVkIGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIGNvcHkgb2YgdGhlIGdpdmVuIHZhbHVlIGJlZm9yZQorICAgICAgICogIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uICBOb3RlIHRoYXQgdGhpcyBraW5kIG9mIG9wZXJhdGlvbgorICAgICAgICogIGNvdWxkIGJlIGV4cGVuc2l2ZSBmb3IgYSAldmVjdG9yIGFuZCBpZiBpdCBpcyBmcmVxdWVudGx5CisgICAgICAgKiAgdXNlZCB0aGUgdXNlciBzaG91bGQgY29uc2lkZXIgdXNpbmcgc3RkOjpsaXN0LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgZ2l2ZW4gcnZhbHVlIGludG8gJXZlY3RvciBiZWZvcmUgc3BlY2lmaWVkIGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIGNvcHkgb2YgdGhlIGdpdmVuIHJ2YWx1ZSBiZWZvcmUKKyAgICAgICAqICB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAgTm90ZSB0aGF0IHRoaXMga2luZCBvZiBvcGVyYXRpb24KKyAgICAgICAqICBjb3VsZCBiZSBleHBlbnNpdmUgZm9yIGEgJXZlY3RvciBhbmQgaWYgaXQgaXMgZnJlcXVlbnRseQorICAgICAgICogIHVzZWQgdGhlIHVzZXIgc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHN0ZDo6bGlzdC4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyByZXR1cm4gZW1wbGFjZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGFuIGluaXRpYWxpemVyX2xpc3QgaW50byB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgY29waWVzIG9mIHRoZSBkYXRhIGluIHRoZSAKKyAgICAgICAqICBpbml0aWFsaXplcl9saXN0IEBhIGwgaW50byB0aGUgJXZlY3RvciBiZWZvcmUgdGhlIGxvY2F0aW9uCisgICAgICAgKiAgc3BlY2lmaWVkIGJ5IEBhIHBvc2l0aW9uLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBraW5kIG9mIG9wZXJhdGlvbiBjb3VsZCBiZSBleHBlbnNpdmUgZm9yIGEKKyAgICAgICAqICAldmVjdG9yIGFuZCBpZiBpdCBpcyBmcmVxdWVudGx5IHVzZWQgdGhlIHVzZXIgc2hvdWxkCisgICAgICAgKiAgY29uc2lkZXIgdXNpbmcgc3RkOjpsaXN0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IHRoaXMtPmluc2VydChfX3Bvc2l0aW9uLCBfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBhIG51bWJlciBvZiBjb3BpZXMgb2YgZ2l2ZW4gZGF0YSBpbnRvIHRoZSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX194ICBEYXRhIHRvIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGEgc3BlY2lmaWVkIG51bWJlciBvZiBjb3BpZXMgb2YKKyAgICAgICAqICB0aGUgZ2l2ZW4gZGF0YSBiZWZvcmUgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBAYSBwb3NpdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMga2luZCBvZiBvcGVyYXRpb24gY291bGQgYmUgZXhwZW5zaXZlIGZvciBhCisgICAgICAgKiAgJXZlY3RvciBhbmQgaWYgaXQgaXMgZnJlcXVlbnRseSB1c2VkIHRoZSB1c2VyIHNob3VsZAorICAgICAgICogIGNvbnNpZGVyIHVzaW5nIHN0ZDo6bGlzdC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgX01fZmlsbF9pbnNlcnQoX19wb3NpdGlvbiwgX19uLCBfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBhIHJhbmdlIGludG8gdGhlICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBjb3BpZXMgb2YgdGhlIGRhdGEgaW4gdGhlIHJhbmdlCisgICAgICAgKiAgW19fZmlyc3QsX19sYXN0KSBpbnRvIHRoZSAldmVjdG9yIGJlZm9yZSB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCisgICAgICAgKiAgYnkgQGEgcG9zLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBraW5kIG9mIG9wZXJhdGlvbiBjb3VsZCBiZSBleHBlbnNpdmUgZm9yIGEKKyAgICAgICAqICAldmVjdG9yIGFuZCBpZiBpdCBpcyBmcmVxdWVudGx5IHVzZWQgdGhlIHVzZXIgc2hvdWxkCisgICAgICAgKiAgY29uc2lkZXIgdXNpbmcgc3RkOjpsaXN0LgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyBfTV9pbnNlcnRfZGlzcGF0Y2goX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0LCBfX2ZhbHNlX3R5cGUoKSk7IH0KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkgICAgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworCX0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBlbGVtZW50IGF0IGdpdmVuIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIG5leHQgZWxlbWVudCAob3IgZW5kKCkpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgZXJhc2UgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCB0aHVzCisgICAgICAgKiAgc2hvcnRlbiB0aGUgJXZlY3RvciBieSBvbmUuCisgICAgICAgKgorICAgICAgICogIE5vdGUgVGhpcyBvcGVyYXRpb24gY291bGQgYmUgZXhwZW5zaXZlIGFuZCBpZiBpdCBpcworICAgICAgICogIGZyZXF1ZW50bHkgdXNlZCB0aGUgdXNlciBzaG91bGQgY29uc2lkZXIgdXNpbmcgc3RkOjpsaXN0LgorICAgICAgICogIFRoZSB1c2VyIGlzIGFsc28gY2F1dGlvbmVkIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcworICAgICAgICogIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLAorICAgICAgICogIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcKKyAgICAgICAqICB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbik7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGEgcmFuZ2Ugb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHBvaW50ZWQgdG8gYnkgQGEgX19sYXN0CisgICAgICAgKiAgICAgICAgICAgcHJpb3IgdG8gZXJhc2luZyAob3IgZW5kKCkpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgZXJhc2UgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZQorICAgICAgICogIFtfX2ZpcnN0LF9fbGFzdCkgYW5kIHNob3J0ZW4gdGhlICV2ZWN0b3IgYWNjb3JkaW5nbHkuCisgICAgICAgKgorICAgICAgICogIE5vdGUgVGhpcyBvcGVyYXRpb24gY291bGQgYmUgZXhwZW5zaXZlIGFuZCBpZiBpdCBpcworICAgICAgICogIGZyZXF1ZW50bHkgdXNlZCB0aGUgdXNlciBzaG91bGQgY29uc2lkZXIgdXNpbmcgc3RkOjpsaXN0LgorICAgICAgICogIFRoZSB1c2VyIGlzIGFsc28gY2F1dGlvbmVkIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcworICAgICAgICogIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlCisgICAgICAgKiAgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LgorICAgICAgICogIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXBzIGRhdGEgd2l0aCBhbm90aGVyICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJXZlY3RvciBvZiB0aGUgc2FtZSBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZXhjaGFuZ2VzIHRoZSBlbGVtZW50cyBiZXR3ZWVuIHR3byB2ZWN0b3JzIGluIGNvbnN0YW50IHRpbWUuCisgICAgICAgKiAgKFRocmVlIHBvaW50ZXJzLCBzbyBpdCBzaG91bGQgYmUgcXVpdGUgZmFzdC4pCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBnbG9iYWwgc3RkOjpzd2FwKCkgZnVuY3Rpb24gaXMgc3BlY2lhbGl6ZWQgc3VjaCB0aGF0CisgICAgICAgKiAgc3RkOjpzd2FwKHYxLHYyKSB3aWxsIGZlZWQgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3dhcCh2ZWN0b3ImIF9feCkKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisJCQlub2V4Y2VwdChfQWxsb2NfdHJhaXRzOjpfU19ub3Rocm93X3N3YXAoKSkKKyNlbmRpZgorICAgICAgeworCXRoaXMtPl9NX2ltcGwuX01fc3dhcF9kYXRhKF9feC5fTV9pbXBsKTsKKwlfQWxsb2NfdHJhaXRzOjpfU19vbl9zd2FwKF9NX2dldF9UcF9hbGxvY2F0b3IoKSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIF9feC5fTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBFcmFzZXMgYWxsIHRoZSBlbGVtZW50cy4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZQorICAgICAgICogIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZQorICAgICAgICogIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcworICAgICAgICogIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX01fZXJhc2VfYXRfZW5kKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvKioKKyAgICAgICAqICBNZW1vcnkgZXhwYW5zaW9uIGhhbmRsZXIuICBVc2VzIHRoZSBtZW1iZXIgYWxsb2NhdGlvbiBmdW5jdGlvbiB0bworICAgICAgICogIG9idGFpbiBAYSBuIGJ5dGVzIG9mIG1lbW9yeSwgYW5kIHRoZW4gY29waWVzIFtmaXJzdCxsYXN0KSBpbnRvIGl0LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBwb2ludGVyCisgICAgICAgIF9NX2FsbG9jYXRlX2FuZF9jb3B5KHNpemVfdHlwZSBfX24sCisJCQkgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIHBvaW50ZXIgX19yZXN1bHQgPSB0aGlzLT5fTV9hbGxvY2F0ZShfX24pOworCSAgX190cnkKKwkgICAgeworCSAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAorCQkJCQkgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICAgICAgcmV0dXJuIF9fcmVzdWx0OworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIF9NX2RlYWxsb2NhdGUoX19yZXN1bHQsIF9fbik7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisKKworICAgICAgLy8gSW50ZXJuYWwgY29uc3RydWN0b3IgZnVuY3Rpb25zIGZvbGxvdy4KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSByYW5nZSBjb25zdHJ1Y3RvciB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWx1ZSwgX190cnVlX3R5cGUpCisgICAgICAgIHsKKwkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfTV9hbGxvY2F0ZShzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fbikpOworCSAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9CisJICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fbik7CisJICBfTV9maWxsX2luaXRpYWxpemUoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX24pLCBfX3ZhbHVlKTsKKwl9CisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgcmFuZ2UgY29uc3RydWN0b3IgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJICAgICAgIF9fZmFsc2VfdHlwZSkKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OgorCSAgICBpdGVyYXRvcl9jYXRlZ29yeSBfSXRlckNhdGVnb3J5OworCSAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2ZpcnN0LCBfX2xhc3QsIF9JdGVyQ2F0ZWdvcnkoKSk7CisJfQorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIHNlY29uZCBpbml0aWFsaXplX2Rpc3BhdGNoIGFib3ZlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgICAgeworCSAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCSAgICBlbXBsYWNlX2JhY2soKl9fZmlyc3QpOworI2Vsc2UKKwkgICAgcHVzaF9iYWNrKCpfX2ZpcnN0KTsKKyNlbmRpZgorCX0KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSBzZWNvbmQgaW5pdGlhbGl6ZV9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgICAgeworCSAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSB0aGlzLT5fTV9hbGxvY2F0ZShfX24pOworCSAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX247CisJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9CisJICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX2ZpcnN0LCBfX2xhc3QsCisJCQkJCXRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJfQorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIGZpcnN0IGluaXRpYWxpemVfZGlzcGF0Y2ggYWJvdmUgYW5kIGJ5IHRoZQorICAgICAgLy8gdmVjdG9yKG4sdmFsdWUsYSkgY29uc3RydWN0b3IuCisgICAgICB2b2lkCisgICAgICBfTV9maWxsX2luaXRpYWxpemUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWx1ZSkKKyAgICAgIHsKKwlzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX25fYSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCBfX24sIF9fdmFsdWUsIAorCQkJCSAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSB2ZWN0b3IobikgY29uc3RydWN0b3IuCisgICAgICB2b2lkCisgICAgICBfTV9kZWZhdWx0X2luaXRpYWxpemUoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlzdGQ6Ol9fdW5pbml0aWFsaXplZF9kZWZhdWx0X25fYSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCBfX24sIAorCQkJCQkgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2U7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gSW50ZXJuYWwgYXNzaWduIGZ1bmN0aW9ucyBmb2xsb3cuICBUaGUgKl9hdXggZnVuY3Rpb25zIGRvIHRoZSBhY3R1YWwKKyAgICAgIC8vIGFzc2lnbm1lbnQgd29yayBmb3IgdGhlIHJhbmdlIHZlcnNpb25zLgorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIHJhbmdlIGFzc2lnbiB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwgX190cnVlX3R5cGUpCisgICAgICAgIHsgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7IH0KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSByYW5nZSBhc3NpZ24gdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgICBfX2ZhbHNlX3R5cGUpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjoKKwkgICAgaXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJDYXRlZ29yeTsKKwkgIF9NX2Fzc2lnbl9hdXgoX19maXJzdCwgX19sYXN0LCBfSXRlckNhdGVnb3J5KCkpOworCX0KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSBzZWNvbmQgYXNzaWduX2Rpc3BhdGNoIGFib3ZlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9hc3NpZ25fYXV4KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpOworCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIHNlY29uZCBhc3NpZ25fZGlzcGF0Y2ggYWJvdmUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IGFzc2lnbihuLHQpLCBhbmQgdGhlIHJhbmdlIGFzc2lnbiB3aGVuIGl0IHR1cm5zIG91dAorICAgICAgLy8gdG8gYmUgdGhlIHNhbWUgdGhpbmcuCisgICAgICB2b2lkCisgICAgICBfTV9maWxsX2Fzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCk7CisKKworICAgICAgLy8gSW50ZXJuYWwgaW5zZXJ0IGZ1bmN0aW9ucyBmb2xsb3cuCisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgcmFuZ2UgaW5zZXJ0IHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzOC4gQW1iaWd1aXR5IGluIHRoZSAiZG8gdGhlIHJpZ2h0IHRoaW5nIiBjbGF1c2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlZ2VyPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwKKwkJCSAgIF9fdHJ1ZV90eXBlKQorICAgICAgICB7IF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCBfX24sIF9fdmFsKTsgfQorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIHJhbmdlIGluc2VydCB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfX2ZhbHNlX3R5cGUpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjoKKwkgICAgaXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJDYXRlZ29yeTsKKwkgIF9NX3JhbmdlX2luc2VydChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSXRlckNhdGVnb3J5KCkpOworCX0KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSBzZWNvbmQgaW5zZXJ0X2Rpc3BhdGNoIGFib3ZlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9yYW5nZV9pbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCisJCQlfSW5wdXRJdGVyYXRvciBfX2xhc3QsIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSBzZWNvbmQgaW5zZXJ0X2Rpc3BhdGNoIGFib3ZlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX3JhbmdlX2luc2VydChpdGVyYXRvciBfX3BvcywgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkJX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpOworCisgICAgICAvLyBDYWxsZWQgYnkgaW5zZXJ0KHAsbix4KSwgYW5kIHRoZSByYW5nZSBpbnNlcnQgd2hlbiBpdCB0dXJucyBvdXQgdG8gYmUKKyAgICAgIC8vIHRoZSBzYW1lIHRoaW5nLgorICAgICAgdm9pZAorICAgICAgX01fZmlsbF9pbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBDYWxsZWQgYnkgcmVzaXplKG4pLgorICAgICAgdm9pZAorICAgICAgX01fZGVmYXVsdF9hcHBlbmQoc2l6ZV90eXBlIF9fbik7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX3Nocmlua190b19maXQoKTsKKyNlbmRpZgorCisgICAgICAvLyBDYWxsZWQgYnkgaW5zZXJ0KHAseCkKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmdzJiYuLi4gX19hcmdzKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fZW1wbGFjZV9iYWNrX2F1eChfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYKKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSBsYXR0ZXIuCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2NoZWNrX2xlbihzaXplX3R5cGUgX19uLCBjb25zdCBjaGFyKiBfX3MpIGNvbnN0CisgICAgICB7CisJaWYgKG1heF9zaXplKCkgLSBzaXplKCkgPCBfX24pCisJICBfX3Rocm93X2xlbmd0aF9lcnJvcihfX04oX19zKSk7CisKKwljb25zdCBzaXplX3R5cGUgX19sZW4gPSBzaXplKCkgKyBzdGQ6Om1heChzaXplKCksIF9fbik7CisJcmV0dXJuIChfX2xlbiA8IHNpemUoKSB8fCBfX2xlbiA+IG1heF9zaXplKCkpID8gbWF4X3NpemUoKSA6IF9fbGVuOworICAgICAgfQorCisgICAgICAvLyBJbnRlcm5hbCBlcmFzZSBmdW5jdGlvbnMgZm9sbG93LgorCisgICAgICAvLyBDYWxsZWQgYnkgZXJhc2UocTEscTIpLCBjbGVhcigpLCByZXNpemUoKSwgX01fZmlsbF9hc3NpZ24sCisgICAgICAvLyBfTV9hc3NpZ25fYXV4LgorICAgICAgdm9pZAorICAgICAgX01fZXJhc2VfYXRfZW5kKHBvaW50ZXIgX19wb3MpCisgICAgICB7CisJc3RkOjpfRGVzdHJveShfX3BvcywgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX3BvczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBwcml2YXRlOgorICAgICAgLy8gQ29uc3RhbnQtdGltZSBtb3ZlIGFzc2lnbm1lbnQgd2hlbiBzb3VyY2Ugb2JqZWN0J3MgbWVtb3J5IGNhbiBiZQorICAgICAgLy8gbW92ZWQsIGVpdGhlciBiZWNhdXNlIHRoZSBzb3VyY2UncyBhbGxvY2F0b3Igd2lsbCBtb3ZlIHRvbworICAgICAgLy8gb3IgYmVjYXVzZSB0aGUgYWxsb2NhdG9ycyBhcmUgZXF1YWwuCisgICAgICB2b2lkCisgICAgICBfTV9tb3ZlX2Fzc2lnbih2ZWN0b3ImJiBfX3gsIHN0ZDo6dHJ1ZV90eXBlKSBub2V4Y2VwdAorICAgICAgeworCXZlY3RvciBfX3RtcChnZXRfYWxsb2NhdG9yKCkpOworCXRoaXMtPl9NX2ltcGwuX01fc3dhcF9kYXRhKF9fdG1wLl9NX2ltcGwpOworCXRoaXMtPl9NX2ltcGwuX01fc3dhcF9kYXRhKF9feC5fTV9pbXBsKTsKKwlpZiAoX0FsbG9jX3RyYWl0czo6X1NfcHJvcGFnYXRlX29uX21vdmVfYXNzaWduKCkpCisJICBzdGQ6Ol9fYWxsb2Nfb25fbW92ZShfTV9nZXRfVHBfYWxsb2NhdG9yKCksCisJCQkgICAgICAgX194Ll9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisgICAgICB9CisKKyAgICAgIC8vIERvIG1vdmUgYXNzaWdubWVudCB3aGVuIGl0IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZSB0byBtb3ZlIHNvdXJjZQorICAgICAgLy8gb2JqZWN0J3MgbWVtb3J5LCByZXN1bHRpbmcgaW4gYSBsaW5lYXItdGltZSBvcGVyYXRpb24uCisgICAgICB2b2lkCisgICAgICBfTV9tb3ZlX2Fzc2lnbih2ZWN0b3ImJiBfX3gsIHN0ZDo6ZmFsc2VfdHlwZSkKKyAgICAgIHsKKwlpZiAoX194Ll9NX2dldF9UcF9hbGxvY2F0b3IoKSA9PSB0aGlzLT5fTV9nZXRfVHBfYWxsb2NhdG9yKCkpCisJICBfTV9tb3ZlX2Fzc2lnbihzdGQ6Om1vdmUoX194KSwgc3RkOjp0cnVlX3R5cGUoKSk7CisJZWxzZQorCSAgeworCSAgICAvLyBUaGUgcnZhbHVlJ3MgYWxsb2NhdG9yIGNhbm5vdCBiZSBtb3ZlZCBhbmQgaXMgbm90IGVxdWFsLAorCSAgICAvLyBzbyB3ZSBuZWVkIHRvIGluZGl2aWR1YWxseSBtb3ZlIGVhY2ggZWxlbWVudC4KKwkgICAgdGhpcy0+YXNzaWduKHN0ZDo6X19tYWtlX21vdmVfaWZfbm9leGNlcHRfaXRlcmF0b3IoX194LmJlZ2luKCkpLAorCQkJIHN0ZDo6X19tYWtlX21vdmVfaWZfbm9leGNlcHRfaXRlcmF0b3IoX194LmVuZCgpKSk7CisJICAgIF9feC5jbGVhcigpOworCSAgfQorICAgICAgfQorI2VuZGlmCisgICAgfTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmICBWZWN0b3IgZXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICV2ZWN0b3IuCisgICAqICBAcGFyYW0gIF9feSAgQSAldmVjdG9yIG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgX194LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgdGhlIHNpemUgYW5kIGVsZW1lbnRzIG9mIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICB2ZWN0b3JzLiAgVmVjdG9ycyBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IGlmIHRoZWlyIHNpemVzIGFyZSBlcXVhbCwKKyAgICogIGFuZCBpZiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGNvbXBhcmUgZXF1YWwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAoX194LnNpemUoKSA9PSBfX3kuc2l6ZSgpCisJICAgICAgJiYgc3RkOjplcXVhbChfX3guYmVnaW4oKSwgX194LmVuZCgpLCBfX3kuYmVnaW4oKSkpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFZlY3RvciBvcmRlcmluZyByZWxhdGlvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICV2ZWN0b3IuCisgICAqICBAcGFyYW0gIF9feSAgQSAldmVjdG9yIG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgX194LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgQGEgX194IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSBfX3kuCisgICAqCisgICAqICBUaGlzIGlzIGEgdG90YWwgb3JkZXJpbmcgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICB2ZWN0b3JzLiAgVGhlIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSB3aXRoIEBjIDwuCisgICAqCisgICAqICBTZWUgc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgpIGZvciBob3cgdGhlIGRldGVybWluYXRpb24gaXMgbWFkZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfX3guYmVnaW4oKSwgX194LmVuZCgpLAorCQkJCQkgIF9feS5iZWdpbigpLCBfX3kuZW5kKCkpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPT0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIC8vLyBTZWUgc3RkOjp2ZWN0b3I6OnN3YXAoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfU1RMX1ZFQ1RPUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RyZWFtX2l0ZXJhdG9yLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RyZWFtX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3NDdhOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdHJlYW1faXRlcmF0b3IuaApAQCAtMCwwICsxLDIyMSBAQAorLy8gU3RyZWFtIGl0ZXJhdG9ycworCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9zdHJlYW1faXRlcmF0b3IuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2l0ZXJhdG9yfQorICovCisKKyNpZm5kZWYgX1NUUkVBTV9JVEVSQVRPUl9ICisjZGVmaW5lIF9TVFJFQU1fSVRFUkFUT1JfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgaXRlcmF0b3JzCisgICAqIEB7CisgICAqLworCisgIC8vLyBQcm92aWRlcyBpbnB1dCBpdGVyYXRvciBzZW1hbnRpY3MgZm9yIHN0cmVhbXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NoYXJUID0gY2hhciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sIHR5cGVuYW1lIF9EaXN0ID0gcHRyZGlmZl90PgorICAgIGNsYXNzIGlzdHJlYW1faXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjxpbnB1dF9pdGVyYXRvcl90YWcsIF9UcCwgX0Rpc3QsIGNvbnN0IF9UcCosIGNvbnN0IF9UcCY+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gaXN0cmVhbV90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIGlzdHJlYW1fdHlwZSoJX01fc3RyZWFtOworICAgICAgX1RwCQlfTV92YWx1ZTsKKyAgICAgIGJvb2wJCV9NX29rOworCisgICAgcHVibGljOgorICAgICAgLy8vICBDb25zdHJ1Y3QgZW5kIG9mIGlucHV0IHN0cmVhbSBpdGVyYXRvci4KKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBpc3RyZWFtX2l0ZXJhdG9yKCkKKyAgICAgIDogX01fc3RyZWFtKDApLCBfTV92YWx1ZSgpLCBfTV9vayhmYWxzZSkge30KKworICAgICAgLy8vICBDb25zdHJ1Y3Qgc3RhcnQgb2YgaW5wdXQgc3RyZWFtIGl0ZXJhdG9yLgorICAgICAgaXN0cmVhbV9pdGVyYXRvcihpc3RyZWFtX3R5cGUmIF9fcykKKyAgICAgIDogX01fc3RyZWFtKCZfX3MpCisgICAgICB7IF9NX3JlYWQoKTsgfQorCisgICAgICBpc3RyZWFtX2l0ZXJhdG9yKGNvbnN0IGlzdHJlYW1faXRlcmF0b3ImIF9fb2JqKQorICAgICAgOiBfTV9zdHJlYW0oX19vYmouX01fc3RyZWFtKSwgX01fdmFsdWUoX19vYmouX01fdmFsdWUpLAorICAgICAgICBfTV9vayhfX29iai5fTV9vaykKKyAgICAgIHsgfQorCisgICAgICBjb25zdCBfVHAmCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19jb25kKF9NX29rLAorCQkJCV9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2RlcmVmX2lzdHJlYW0pCisJCQkJLl9NX2l0ZXJhdG9yKCp0aGlzKSk7CisJcmV0dXJuIF9NX3ZhbHVlOworICAgICAgfQorCisgICAgICBjb25zdCBfVHAqCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KKworICAgICAgaXN0cmVhbV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19jb25kKF9NX29rLAorCQkJCV9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2luY19pc3RyZWFtKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCV9NX3JlYWQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlzdHJlYW1faXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19jb25kKF9NX29rLAorCQkJCV9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2luY19pc3RyZWFtKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCWlzdHJlYW1faXRlcmF0b3IgX190bXAgPSAqdGhpczsKKwlfTV9yZWFkKCk7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBfTV9lcXVhbChjb25zdCBpc3RyZWFtX2l0ZXJhdG9yJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiAoX01fb2sgPT0gX194Ll9NX29rKSAmJiAoIV9NX29rIHx8IF9NX3N0cmVhbSA9PSBfX3guX01fc3RyZWFtKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX3JlYWQoKQorICAgICAgeworCV9NX29rID0gKF9NX3N0cmVhbSAmJiAqX01fc3RyZWFtKSA/IHRydWUgOiBmYWxzZTsKKwlpZiAoX01fb2spCisJICB7CisJICAgICpfTV9zdHJlYW0gPj4gX01fdmFsdWU7CisJICAgIF9NX29rID0gKl9NX3N0cmVhbSA/IHRydWUgOiBmYWxzZTsKKwkgIH0KKyAgICAgIH0KKyAgICB9OworCisgIC8vLyAgUmV0dXJuIHRydWUgaWYgeCBhbmQgeSBhcmUgYm90aCBlbmQgb3Igbm90IGVuZCwgb3IgeCBhbmQgeSBhcmUgdGhlIHNhbWUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfRGlzdD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgaXN0cmVhbV9pdGVyYXRvcjxfVHAsIF9DaGFyVCwgX1RyYWl0cywgX0Rpc3Q+JiBfX3gsCisJICAgICAgIGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8X1RwLCBfQ2hhclQsIF9UcmFpdHMsIF9EaXN0PiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9lcXVhbChfX3kpOyB9CisKKyAgLy8vICBSZXR1cm4gZmFsc2UgaWYgeCBhbmQgeSBhcmUgYm90aCBlbmQgb3Igbm90IGVuZCwgb3IgeCBhbmQgeSBhcmUgdGhlIHNhbWUuCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0Rpc3Q+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8X1RwLCBfQ2hhclQsIF9UcmFpdHMsIF9EaXN0PiYgX194LAorCSAgICAgICBjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0NoYXJULCBfVHJhaXRzLCBfRGlzdD4mIF9feSkKKyAgICB7IHJldHVybiAhX194Ll9NX2VxdWFsKF9feSk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUHJvdmlkZXMgb3V0cHV0IGl0ZXJhdG9yIHNlbWFudGljcyBmb3Igc3RyZWFtcy4KKyAgICoKKyAgICogIFRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gaXRlcmF0b3IgdG8gd3JpdGUgdG8gYW4gb3N0cmVhbS4gIFRoZSB0eXBlIFRwIGlzCisgICAqICB0aGUgb25seSB0eXBlIHdyaXR0ZW4gYnkgdGhpcyBpdGVyYXRvciBhbmQgdGhlcmUgbXVzdCBiZSBhbgorICAgKiAgb3BlcmF0b3I8PChUcCkgZGVmaW5lZC4KKyAgICoKKyAgICogIEB0cGFyYW0gIF9UcCAgVGhlIHR5cGUgdG8gd3JpdGUgdG8gdGhlIG9zdHJlYW0uCisgICAqICBAdHBhcmFtICBfQ2hhclQgIFRoZSBvc3RyZWFtIGNoYXJfdHlwZS4KKyAgICogIEB0cGFyYW0gIF9UcmFpdHMgIFRoZSBvc3RyZWFtIGNoYXJfdHJhaXRzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DaGFyVCA9IGNoYXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBvc3RyZWFtX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmCisgICAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IG9zdHJlYW1fdHlwZTsKKyAgICAgIC8vQH0KKworICAgIHByaXZhdGU6CisgICAgICBvc3RyZWFtX3R5cGUqCV9NX3N0cmVhbTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJX01fc3RyaW5nOworCisgICAgcHVibGljOgorICAgICAgLy8vIENvbnN0cnVjdCBmcm9tIGFuIG9zdHJlYW0uCisgICAgICBvc3RyZWFtX2l0ZXJhdG9yKG9zdHJlYW1fdHlwZSYgX19zKSA6IF9NX3N0cmVhbSgmX19zKSwgX01fc3RyaW5nKDApIHt9CisKKyAgICAgIC8qKgorICAgICAgICogIENvbnN0cnVjdCBmcm9tIGFuIG9zdHJlYW0uCisgICAgICAgKgorICAgICAgICogIFRoZSBkZWxpbWl0ZXIgc3RyaW5nIEBhIGMgaXMgd3JpdHRlbiB0byB0aGUgc3RyZWFtIGFmdGVyIGV2ZXJ5IFRwCisgICAgICAgKiAgd3JpdHRlbiB0byB0aGUgc3RyZWFtLiAgVGhlIGRlbGltaXRlciBpcyBub3QgY29waWVkLCBhbmQgdGh1cyBtdXN0CisgICAgICAgKiAgbm90IGJlIGRlc3Ryb3llZCB3aGlsZSB0aGlzIGl0ZXJhdG9yIGlzIGluIHVzZS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFVuZGVybHlpbmcgb3N0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIF9fYyAgQ2hhclQgZGVsaW1pdGVyIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAqLworICAgICAgb3N0cmVhbV9pdGVyYXRvcihvc3RyZWFtX3R5cGUmIF9fcywgY29uc3QgX0NoYXJUKiBfX2MpCisgICAgICA6IF9NX3N0cmVhbSgmX19zKSwgX01fc3RyaW5nKF9fYykgIHsgfQorCisgICAgICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgIG9zdHJlYW1faXRlcmF0b3IoY29uc3Qgb3N0cmVhbV9pdGVyYXRvciYgX19vYmopCisgICAgICA6IF9NX3N0cmVhbShfX29iai5fTV9zdHJlYW0pLCBfTV9zdHJpbmcoX19vYmouX01fc3RyaW5nKSAgeyB9CisKKyAgICAgIC8vLyBXcml0ZXMgQGEgdmFsdWUgdG8gdW5kZXJseWluZyBvc3RyZWFtIHVzaW5nIG9wZXJhdG9yPDwuICBJZgorICAgICAgLy8vIGNvbnN0cnVjdGVkIHdpdGggZGVsaW1pdGVyIHN0cmluZywgd3JpdGVzIGRlbGltaXRlciB0byBvc3RyZWFtLgorICAgICAgb3N0cmVhbV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfVHAmIF9fdmFsdWUpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX2NvbmQoX01fc3RyZWFtICE9IDAsCisJCQkJX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfb3V0cHV0X29zdHJlYW0pCisJCQkJLl9NX2l0ZXJhdG9yKCp0aGlzKSk7CisJKl9NX3N0cmVhbSA8PCBfX3ZhbHVlOworCWlmIChfTV9zdHJpbmcpICpfTV9zdHJlYW0gPDwgX01fc3RyaW5nOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgb3N0cmVhbV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBvc3RyZWFtX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBvc3RyZWFtX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgLy8gQH0gZ3JvdXAgaXRlcmF0b3JzCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RyZWFtYnVmLnRjYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdHJlYW1idWYudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZDQ1NjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RyZWFtYnVmLnRjYwpAQCAtMCwwICsxLDE3NSBAQAorLy8gU3RyZWFtIGJ1ZmZlciBjbGFzc2VzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3N0cmVhbWJ1Zi50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtzdHJlYW1idWZ9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjUgIFN0cmVhbSBidWZmZXJzCisvLworCisjaWZuZGVmIF9TVFJFQU1CVUZfVENDCisjZGVmaW5lIF9TVFJFQU1CVUZfVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cmVhbXNpemUKKyAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgeHNnZXRuKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICBzdHJlYW1zaXplIF9fcmV0ID0gMDsKKyAgICAgIHdoaWxlIChfX3JldCA8IF9fbikKKwl7CisJICBjb25zdCBzdHJlYW1zaXplIF9fYnVmX2xlbiA9IHRoaXMtPmVncHRyKCkgLSB0aGlzLT5ncHRyKCk7CisJICBpZiAoX19idWZfbGVuKQorCSAgICB7CisJICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX3JlbWFpbmluZyA9IF9fbiAtIF9fcmV0OworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19sZW4gPSBzdGQ6Om1pbihfX2J1Zl9sZW4sIF9fcmVtYWluaW5nKTsKKwkgICAgICB0cmFpdHNfdHlwZTo6Y29weShfX3MsIHRoaXMtPmdwdHIoKSwgX19sZW4pOworCSAgICAgIF9fcmV0ICs9IF9fbGVuOworCSAgICAgIF9fcyArPSBfX2xlbjsKKwkgICAgICB0aGlzLT5fX3NhZmVfZ2J1bXAoX19sZW4pOworCSAgICB9CisKKwkgIGlmIChfX3JldCA8IF9fbikKKwkgICAgeworCSAgICAgIGNvbnN0IGludF90eXBlIF9fYyA9IHRoaXMtPnVmbG93KCk7CisJICAgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorCQl7CisJCSAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19zKyssIHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKSk7CisJCSAgKytfX3JldDsKKwkJfQorCSAgICAgIGVsc2UKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJlYW1zaXplCisgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHhzcHV0bihjb25zdCBjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgc3RyZWFtc2l6ZSBfX3JldCA9IDA7CisgICAgICB3aGlsZSAoX19yZXQgPCBfX24pCisJeworCSAgY29uc3Qgc3RyZWFtc2l6ZSBfX2J1Zl9sZW4gPSB0aGlzLT5lcHB0cigpIC0gdGhpcy0+cHB0cigpOworCSAgaWYgKF9fYnVmX2xlbikKKwkgICAgeworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19yZW1haW5pbmcgPSBfX24gLSBfX3JldDsKKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fbGVuID0gc3RkOjptaW4oX19idWZfbGVuLCBfX3JlbWFpbmluZyk7CisJICAgICAgdHJhaXRzX3R5cGU6OmNvcHkodGhpcy0+cHB0cigpLCBfX3MsIF9fbGVuKTsKKwkgICAgICBfX3JldCArPSBfX2xlbjsKKwkgICAgICBfX3MgKz0gX19sZW47CisJICAgICAgdGhpcy0+X19zYWZlX3BidW1wKF9fbGVuKTsKKwkgICAgfQorCisJICBpZiAoX19yZXQgPCBfX24pCisJICAgIHsKKwkgICAgICBpbnRfdHlwZSBfX2MgPSB0aGlzLT5vdmVyZmxvdyh0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKl9fcykpOworCSAgICAgIGlmICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKKwkJeworCQkgICsrX19yZXQ7CisJCSAgKytfX3M7CisJCX0KKwkgICAgICBlbHNlCisJCWJyZWFrOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICAvLyBDb25jZWl2YWJseSwgdGhpcyBjb3VsZCBiZSB1c2VkIHRvIGltcGxlbWVudCBidWZmZXItdG8tYnVmZmVyCisgIC8vIGNvcGllcywgaWYgdGhpcyB3YXMgZXZlciBkZXNpcmVkIGluIGFuIHVuLWFtYmlndW91cyB3YXkgYnkgdGhlCisgIC8vIHN0YW5kYXJkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RyZWFtc2l6ZQorICAgIF9fY29weV9zdHJlYW1idWZzX2VvZihiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zYmluLAorCQkJICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zYm91dCwKKwkJCSAgYm9vbCYgX19pbmVvZikKKyAgICB7CisgICAgICBzdHJlYW1zaXplIF9fcmV0ID0gMDsKKyAgICAgIF9faW5lb2YgPSB0cnVlOworICAgICAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX19jID0gX19zYmluLT5zZ2V0YygpOworICAgICAgd2hpbGUgKCFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9UcmFpdHM6OmVvZigpKSkKKwl7CisJICBfX2MgPSBfX3Nib3V0LT5zcHV0YyhfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSk7CisJICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfVHJhaXRzOjplb2YoKSkpCisJICAgIHsKKwkgICAgICBfX2luZW9mID0gZmFsc2U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICsrX19yZXQ7CisJICBfX2MgPSBfX3NiaW4tPnNuZXh0YygpOworCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBzdHJlYW1zaXplCisgICAgX19jb3B5X3N0cmVhbWJ1ZnMoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2JpbiwKKwkJICAgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2JvdXQpCisgICAgeworICAgICAgYm9vbCBfX2luZW9mOworICAgICAgcmV0dXJuIF9fY29weV9zdHJlYW1idWZzX2VvZihfX3NiaW4sIF9fc2JvdXQsIF9faW5lb2YpOworICAgIH0KKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgc3RyZWFtc2l6ZQorICAgIF9fY29weV9zdHJlYW1idWZzKGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPiosCisJCSAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPiopOworICBleHRlcm4gdGVtcGxhdGUKKyAgICBzdHJlYW1zaXplCisgICAgX19jb3B5X3N0cmVhbWJ1ZnNfZW9mKGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPiosCisJCQkgIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPiosIGJvb2wmKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJlYW1idWY8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIHN0cmVhbXNpemUKKyAgICBfX2NvcHlfc3RyZWFtYnVmcyhiYXNpY19zdHJlYW1idWY8d2NoYXJfdD4qLAorCQkgICAgICBiYXNpY19zdHJlYW1idWY8d2NoYXJfdD4qKTsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgc3RyZWFtc2l6ZQorICAgIF9fY29weV9zdHJlYW1idWZzX2VvZihiYXNpY19zdHJlYW1idWY8d2NoYXJfdD4qLAorCQkJICBiYXNpY19zdHJlYW1idWY8d2NoYXJfdD4qLCBib29sJik7CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdHJlYW1idWZfaXRlcmF0b3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdHJlYW1idWZfaXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWJlNmU4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0cmVhbWJ1Zl9pdGVyYXRvci5oCkBAIC0wLDAgKzEsNDEyIEBACisvLyBTdHJlYW1idWYgaXRlcmF0b3JzCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3N0cmVhbWJ1Zl9pdGVyYXRvci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aXRlcmF0b3J9CisgKi8KKworI2lmbmRlZiBfU1RSRUFNQlVGX0lURVJBVE9SX0gKKyNkZWZpbmUgX1NUUkVBTUJVRl9JVEVSQVRPUl9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8c3RyZWFtYnVmPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyAgICAgCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBpdGVyYXRvcnMKKyAgICogQHsKKyAgICovCisKKyAgLy8gMjQuNS4zIFRlbXBsYXRlIGNsYXNzIGlzdHJlYW1idWZfaXRlcmF0b3IKKyAgLy8vIFByb3ZpZGVzIGlucHV0IGl0ZXJhdG9yIHNlbWFudGljcyBmb3Igc3RyZWFtYnVmcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIGlzdHJlYW1idWZfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjxpbnB1dF9pdGVyYXRvcl90YWcsIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgX0NoYXJUKiwKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgLy8gTFdHIDQ0NS4KKwkJICAgICAgX0NoYXJUPgorI2Vsc2UKKwkJICAgICAgX0NoYXJUJj4KKyNlbmRpZgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMJCQkJCXRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZQkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+CQlzdHJlYW1idWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CQlpc3RyZWFtX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVDI+CisJZnJpZW5kIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVDI+OjpfX3ZhbHVlLAorCQkgICAgICAgICAgICAgICAgICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4gPjo6X190eXBlCisJY29weShpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+LAorCSAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPik7CisKKyAgICAgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZSwgdHlwZW5hbWUgX0NoYXJUMj4KKwlmcmllbmQgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUMj46Ol9fdmFsdWUsIAorCQkJCQkgICAgICAgX0NoYXJUMio+OjpfX3R5cGUKKwlfX2NvcHlfbW92ZV9hMihpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+LAorCQkgICAgICAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiwgX0NoYXJUMiopOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQyPgorCWZyaWVuZCB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfY2hhcjxfQ2hhclQyPjo6X192YWx1ZSwKKwkJCSAgICAgICAgICAgIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4gPjo6X190eXBlCisJZmluZChpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+LAorCSAgICAgY29uc3QgX0NoYXJUMiYpOworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIDI0LjUuMyBpc3RyZWFtYnVmX2l0ZXJhdG9yCisgICAgICAvLyBwIDEKKyAgICAgIC8vIElmIHRoZSBlbmQgb2Ygc3RyZWFtIGlzIHJlYWNoZWQgKHN0cmVhbWJ1Zl90eXBlOjpzZ2V0YygpCisgICAgICAvLyByZXR1cm5zIHRyYWl0c190eXBlOjplb2YoKSksIHRoZSBpdGVyYXRvciBiZWNvbWVzIGVxdWFsIHRvCisgICAgICAvLyB0aGUgImVuZCBvZiBzdHJlYW0iIGl0ZXJhdG9yIHZhbHVlLgorICAgICAgLy8gTkI6IFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGUgImVuZCBvZiBzdHJlYW0iIHZhbHVlCisgICAgICAvLyBpcyBFT0YsIG9yIC0xLgorICAgICAgbXV0YWJsZSBzdHJlYW1idWZfdHlwZSoJX01fc2J1ZjsKKyAgICAgIG11dGFibGUgaW50X3R5cGUJCV9NX2M7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gIENvbnN0cnVjdCBlbmQgb2YgaW5wdXQgc3RyZWFtIGl0ZXJhdG9yLgorICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGlzdHJlYW1idWZfaXRlcmF0b3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIDogX01fc2J1ZigwKSwgX01fYyh0cmFpdHNfdHlwZTo6ZW9mKCkpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXN0cmVhbWJ1Zl9pdGVyYXRvcihjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yJikgbm9leGNlcHQgPSBkZWZhdWx0OworCisgICAgICB+aXN0cmVhbWJ1Zl9pdGVyYXRvcigpID0gZGVmYXVsdDsKKyNlbmRpZgorCisgICAgICAvLy8gIENvbnN0cnVjdCBzdGFydCBvZiBpbnB1dCBzdHJlYW0gaXRlcmF0b3IuCisgICAgICBpc3RyZWFtYnVmX2l0ZXJhdG9yKGlzdHJlYW1fdHlwZSYgX19zKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIDogX01fc2J1ZihfX3MucmRidWYoKSksIF9NX2ModHJhaXRzX3R5cGU6OmVvZigpKSB7IH0KKworICAgICAgLy8vICBDb25zdHJ1Y3Qgc3RhcnQgb2Ygc3RyZWFtYnVmIGl0ZXJhdG9yLgorICAgICAgaXN0cmVhbWJ1Zl9pdGVyYXRvcihzdHJlYW1idWZfdHlwZSogX19zKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIDogX01fc2J1ZihfX3MpLCBfTV9jKHRyYWl0c190eXBlOjplb2YoKSkgeyB9CisKKyAgICAgIC8vLyAgUmV0dXJuIHRoZSBjdXJyZW50IGNoYXJhY3RlciBwb2ludGVkIHRvIGJ5IGl0ZXJhdG9yLiAgVGhpcyByZXR1cm5zCisgICAgICAvLy8gIHN0cmVhbWJ1Zi5zZ2V0YygpLiAgSXQgY2Fubm90IGJlIGFzc2lnbmVkLiAgTkI6IFRoZSByZXN1bHQgb2YKKyAgICAgIC8vLyAgb3BlcmF0b3IqKCkgb24gYW4gZW5kIG9mIHN0cmVhbSBpcyB1bmRlZmluZWQuCisgICAgICBjaGFyX3R5cGUKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisjaWZkZWYgX0dMSUJDWFhfREVCVUdfUEVEQU5USUMKKwkvLyBEZXJlZmVyZW5jaW5nIGEgcGFzdC10aGUtZW5kIGlzdHJlYW1idWZfaXRlcmF0b3IgaXMgYQorCS8vIGxpYnN0ZGMrKyBleHRlbnNpb24KKwlfX2dsaWJjeHhfcmVxdWlyZXNfY29uZCghX01fYXRfZW9mKCksCisJCQkJX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfZGVyZWZfaXN0cmVhbWJ1ZikKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMpKTsKKyNlbmRpZgorCXJldHVybiB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9NX2dldCgpKTsKKyAgICAgIH0KKworICAgICAgLy8vIEFkdmFuY2UgdGhlIGl0ZXJhdG9yLiAgQ2FsbHMgc3RyZWFtYnVmLnNidW1wYygpLgorICAgICAgaXN0cmVhbWJ1Zl9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19jb25kKCFfTV9hdF9lb2YoKSwKKwkJCQlfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19pbmNfaXN0cmVhbWJ1ZikKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMpKTsKKwlpZiAoX01fc2J1ZikKKwkgIHsKKwkgICAgX01fc2J1Zi0+c2J1bXBjKCk7CisJICAgIF9NX2MgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisJICB9CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLy8gQWR2YW5jZSB0aGUgaXRlcmF0b3IuICBDYWxscyBzdHJlYW1idWYuc2J1bXBjKCkuCisgICAgICBpc3RyZWFtYnVmX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfY29uZCghX01fYXRfZW9mKCksCisJCQkJX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfaW5jX2lzdHJlYW1idWYpCisJCQkJLl9NX2l0ZXJhdG9yKCp0aGlzKSk7CisKKwlpc3RyZWFtYnVmX2l0ZXJhdG9yIF9fb2xkID0gKnRoaXM7CisJaWYgKF9NX3NidWYpCisJICB7CisJICAgIF9fb2xkLl9NX2MgPSBfTV9zYnVmLT5zYnVtcGMoKTsKKwkgICAgX01fYyA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgIH0KKwlyZXR1cm4gX19vbGQ7CisgICAgICB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDExMCBpc3RyZWFtYnVmX2l0ZXJhdG9yOjplcXVhbCBub3QgY29uc3QKKyAgICAgIC8vIE5COiB0aGVyZSBpcyBhbHNvIG51bWJlciAxMTEgKE5BRCwgRnV0dXJlKSBwZW5kaW5nIG9uIHRoaXMgZnVuY3Rpb24uCisgICAgICAvLy8gUmV0dXJuIHRydWUgYm90aCBpdGVyYXRvcnMgYXJlIGVuZCBvciBib3RoIGFyZSBub3QgZW5kLgorICAgICAgYm9vbAorICAgICAgZXF1YWwoY29uc3QgaXN0cmVhbWJ1Zl9pdGVyYXRvciYgX19iKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYXRfZW9mKCkgPT0gX19iLl9NX2F0X2VvZigpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgaW50X3R5cGUKKyAgICAgIF9NX2dldCgpIGNvbnN0CisgICAgICB7CisJY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisJaW50X3R5cGUgX19yZXQgPSBfX2VvZjsKKwlpZiAoX01fc2J1ZikKKwkgIHsKKwkgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX01fYywgX19lb2YpKQorCSAgICAgIF9fcmV0ID0gX01fYzsKKwkgICAgZWxzZSBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZSgoX19yZXQgPSBfTV9zYnVmLT5zZ2V0YygpKSwKKwkJCQkJICAgICAgIF9fZW9mKSkKKwkgICAgICBfTV9jID0gX19yZXQ7CisJICAgIGVsc2UKKwkgICAgICBfTV9zYnVmID0gMDsKKwkgIH0KKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2F0X2VvZigpIGNvbnN0CisgICAgICB7CisJY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisJcmV0dXJuIHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfTV9nZXQoKSwgX19lb2YpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9fYSwKKwkgICAgICAgY29uc3QgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+JiBfX2IpCisgICAgeyByZXR1cm4gX19hLmVxdWFsKF9fYik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYgX19hLAorCSAgICAgICBjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9fYikKKyAgICB7IHJldHVybiAhX19hLmVxdWFsKF9fYik7IH0KKworICAvLy8gUHJvdmlkZXMgb3V0cHV0IGl0ZXJhdG9yIHNlbWFudGljcyBmb3Igc3RyZWFtYnVmcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIG9zdHJlYW1idWZfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjxvdXRwdXRfaXRlcmF0b3JfdGFnLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4gc3RyZWFtYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgIG9zdHJlYW1fdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUMj4KKwlmcmllbmQgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUMj46Ol9fdmFsdWUsCisJCSAgICAgICAgICAgICAgICAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiA+OjpfX3R5cGUKKwljb3B5KGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4sIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4sCisJICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+KTsKKworICAgIHByaXZhdGU6CisgICAgICBzdHJlYW1idWZfdHlwZSoJX01fc2J1ZjsKKyAgICAgIGJvb2wJCV9NX2ZhaWxlZDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyAgQ29uc3RydWN0IG91dHB1dCBpdGVyYXRvciBmcm9tIG9zdHJlYW0uCisgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yKG9zdHJlYW1fdHlwZSYgX19zKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIDogX01fc2J1ZihfX3MucmRidWYoKSksIF9NX2ZhaWxlZCghX01fc2J1ZikgeyB9CisKKyAgICAgIC8vLyAgQ29uc3RydWN0IG91dHB1dCBpdGVyYXRvciBmcm9tIHN0cmVhbWJ1Zi4KKyAgICAgIG9zdHJlYW1idWZfaXRlcmF0b3Ioc3RyZWFtYnVmX3R5cGUqIF9fcykgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICA6IF9NX3NidWYoX19zKSwgX01fZmFpbGVkKCFfTV9zYnVmKSB7IH0KKworICAgICAgLy8vICBXcml0ZSBjaGFyYWN0ZXIgdG8gc3RyZWFtYnVmLiAgQ2FsbHMgc3RyZWFtYnVmLnNwdXRjKCkuCisgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KF9DaGFyVCBfX2MpCisgICAgICB7CisJaWYgKCFfTV9mYWlsZWQgJiYKKwkgICAgX1RyYWl0czo6ZXFfaW50X3R5cGUoX01fc2J1Zi0+c3B1dGMoX19jKSwgX1RyYWl0czo6ZW9mKCkpKQorCSAgX01fZmFpbGVkID0gdHJ1ZTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyBSZXR1cm4gKnRoaXMuCisgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIC8vLyBSZXR1cm4gKnRoaXMuCisgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICAvLy8gUmV0dXJuICp0aGlzLgorICAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgLy8vIFJldHVybiB0cnVlIGlmIHByZXZpb3VzIG9wZXJhdG9yPSgpIGZhaWxlZC4KKyAgICAgIGJvb2wKKyAgICAgIGZhaWxlZCgpIGNvbnN0IF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fZmFpbGVkOyB9CisKKyAgICAgIG9zdHJlYW1idWZfaXRlcmF0b3ImCisgICAgICBfTV9wdXQoY29uc3QgX0NoYXJUKiBfX3dzLCBzdHJlYW1zaXplIF9fbGVuKQorICAgICAgeworCWlmIChfX2J1aWx0aW5fZXhwZWN0KCFfTV9mYWlsZWQsIHRydWUpCisJICAgICYmIF9fYnVpbHRpbl9leHBlY3QodGhpcy0+X01fc2J1Zi0+c3B1dG4oX193cywgX19sZW4pICE9IF9fbGVuLAorCQkJCWZhbHNlKSkKKwkgIF9NX2ZhaWxlZCA9IHRydWU7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgLy8gT3ZlcmxvYWRzIGZvciBzdHJlYW1idWYgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUPjo6X192YWx1ZSwKKyAgICAJICAgICAgICAgICAgICAgICAJICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+OjpfX3R5cGUKKyAgICBjb3B5KGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiBfX2ZpcnN0LAorCSBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gX19sYXN0LAorCSBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gX19yZXN1bHQpCisgICAgeworICAgICAgaWYgKF9fZmlyc3QuX01fc2J1ZiAmJiAhX19sYXN0Ll9NX3NidWYgJiYgIV9fcmVzdWx0Ll9NX2ZhaWxlZCkKKwl7CisJICBib29sIF9faW5lb2Y7CisJICBfX2NvcHlfc3RyZWFtYnVmc19lb2YoX19maXJzdC5fTV9zYnVmLCBfX3Jlc3VsdC5fTV9zYnVmLCBfX2luZW9mKTsKKwkgIGlmICghX19pbmVvZikKKwkgICAgX19yZXN1bHQuX01fZmFpbGVkID0gdHJ1ZTsKKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZSwgdHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVD46Ol9fdmFsdWUsIAorICAgIAkJCQkgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID46Ol9fdHlwZQorICAgIF9fY29weV9tb3ZlX2EyKF9DaGFyVCogX19maXJzdCwgX0NoYXJUKiBfX2xhc3QsCisJCSAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiBfX3Jlc3VsdCkKKyAgICB7CisgICAgICBjb25zdCBzdHJlYW1zaXplIF9fbnVtID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgIGlmIChfX251bSA+IDApCisJX19yZXN1bHQuX01fcHV0KF9fZmlyc3QsIF9fbnVtKTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlLCB0eXBlbmFtZSBfQ2hhclQ+CisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUPjo6X192YWx1ZSwKKwkJCQkgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID46Ol9fdHlwZQorICAgIF9fY29weV9tb3ZlX2EyKGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QsCisJCSAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiBfX3Jlc3VsdCkKKyAgICB7CisgICAgICBjb25zdCBzdHJlYW1zaXplIF9fbnVtID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgIGlmIChfX251bSA+IDApCisJX19yZXN1bHQuX01fcHV0KF9fZmlyc3QsIF9fbnVtKTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlLCB0eXBlbmFtZSBfQ2hhclQ+CisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUPjo6X192YWx1ZSwgCisgICAgCQkJCSAgICBfQ2hhclQqPjo6X190eXBlCisgICAgX19jb3B5X21vdmVfYTIoaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+IF9fZmlyc3QsCisJCSAgIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiBfX2xhc3QsIF9DaGFyVCogX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gICAgICAgICAgICAgICAgICBfX2lzX2l0ZXJhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXNfaXRlcmF0b3JfdHlwZTo6dHJhaXRzX3R5cGUgICAgIHRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzX2l0ZXJhdG9yX3R5cGU6OnN0cmVhbWJ1Zl90eXBlICBzdHJlYW1idWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlICAgICAgICAgICAgICAgaW50X3R5cGU7CisKKyAgICAgIGlmIChfX2ZpcnN0Ll9NX3NidWYgJiYgIV9fbGFzdC5fTV9zYnVmKQorCXsKKwkgIHN0cmVhbWJ1Zl90eXBlKiBfX3NiID0gX19maXJzdC5fTV9zYnVmOworCSAgaW50X3R5cGUgX19jID0gX19zYi0+c2dldGMoKTsKKwkgIHdoaWxlICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKKwkgICAgeworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19uID0gX19zYi0+ZWdwdHIoKSAtIF9fc2ItPmdwdHIoKTsKKwkgICAgICBpZiAoX19uID4gMSkKKwkJeworCQkgIHRyYWl0c190eXBlOjpjb3B5KF9fcmVzdWx0LCBfX3NiLT5ncHRyKCksIF9fbik7CisJCSAgX19zYi0+X19zYWZlX2didW1wKF9fbik7CisJCSAgX19yZXN1bHQgKz0gX19uOworCQkgIF9fYyA9IF9fc2ItPnVuZGVyZmxvdygpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgKl9fcmVzdWx0KysgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisJCSAgX19jID0gX19zYi0+c25leHRjKCk7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVD46Ol9fdmFsdWUsCisJCSAgCQkgICAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID46Ol9fdHlwZQorICAgIGZpbmQoaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+IF9fZmlyc3QsCisJIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiBfX2xhc3QsIGNvbnN0IF9DaGFyVCYgX192YWwpCisgICAgeworICAgICAgdHlwZWRlZiBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gICAgICAgICAgICAgICAgICBfX2lzX2l0ZXJhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXNfaXRlcmF0b3JfdHlwZTo6dHJhaXRzX3R5cGUgICAgIHRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzX2l0ZXJhdG9yX3R5cGU6OnN0cmVhbWJ1Zl90eXBlICBzdHJlYW1idWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlICAgICAgICAgICAgICAgaW50X3R5cGU7CisKKyAgICAgIGlmIChfX2ZpcnN0Ll9NX3NidWYgJiYgIV9fbGFzdC5fTV9zYnVmKQorCXsKKwkgIGNvbnN0IGludF90eXBlIF9faXZhbCA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZShfX3ZhbCk7CisJICBzdHJlYW1idWZfdHlwZSogX19zYiA9IF9fZmlyc3QuX01fc2J1ZjsKKwkgIGludF90eXBlIF9fYyA9IF9fc2ItPnNnZXRjKCk7CisJICB3aGlsZSAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIHRyYWl0c190eXBlOjplb2YoKSkKKwkJICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2l2YWwpKQorCSAgICB7CisJICAgICAgc3RyZWFtc2l6ZSBfX24gPSBfX3NiLT5lZ3B0cigpIC0gX19zYi0+Z3B0cigpOworCSAgICAgIGlmIChfX24gPiAxKQorCQl7CisJCSAgY29uc3QgX0NoYXJUKiBfX3AgPSB0cmFpdHNfdHlwZTo6ZmluZChfX3NiLT5ncHRyKCksCisJCQkJCQkJX19uLCBfX3ZhbCk7CisJCSAgaWYgKF9fcCkKKwkJICAgIF9fbiA9IF9fcCAtIF9fc2ItPmdwdHIoKTsKKwkJICBfX3NiLT5fX3NhZmVfZ2J1bXAoX19uKTsKKwkJICBfX2MgPSBfX3NiLT5zZ2V0YygpOworCQl9CisJICAgICAgZWxzZQorCQlfX2MgPSBfX3NiLT5zbmV4dGMoKTsKKwkgICAgfQorCisJICBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIHRyYWl0c190eXBlOjplb2YoKSkpCisJICAgIF9fZmlyc3QuX01fYyA9IF9fYzsKKwkgIGVsc2UKKwkgICAgX19maXJzdC5fTV9zYnVmID0gMDsKKwl9CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKy8vIEB9IGdyb3VwIGl0ZXJhdG9ycworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0cmluZ2Z3ZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0cmluZ2Z3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDExMTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RyaW5nZndkLmgKQEAgLTAsMCArMSw4OSBAQAorLy8gPHN0cmluZz4gRm9yd2FyZCBkZWNsYXJhdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvc3RyaW5nZndkLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtzdHJpbmd9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIxIFN0cmluZ3MgbGlicmFyeQorLy8KKworI2lmbmRlZiBfU1RSSU5HRldEX0gKKyNkZWZpbmUgX1NUUklOR0ZXRF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL21lbW9yeWZ3ZC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAZGVmZ3JvdXAgc3RyaW5ncyBTdHJpbmdzCisgICAqCisgICAqICBAeworICAqLworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVD4KKyAgICBzdHJ1Y3QgY2hhcl90cmFpdHM7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0FsbG9jID0gYWxsb2NhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX3N0cmluZzsKKworICB0ZW1wbGF0ZTw+IHN0cnVjdCBjaGFyX3RyYWl0czxjaGFyPjsKKworICAvLy8gQSBzdHJpbmcgb2YgQGMgY2hhcgorICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyPiAgICBzdHJpbmc7ICAgCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+IHN0cnVjdCBjaGFyX3RyYWl0czx3Y2hhcl90PjsKKworICAvLy8gQSBzdHJpbmcgb2YgQGMgd2NoYXJfdAorICB0eXBlZGVmIGJhc2ljX3N0cmluZzx3Y2hhcl90PiB3c3RyaW5nOyAgIAorI2VuZGlmCisKKyNpZiAoKF9fY3BsdXNwbHVzID49IDIwMTEwM0wpIFwKKyAgICAgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEpKQorCisgIHRlbXBsYXRlPD4gc3RydWN0IGNoYXJfdHJhaXRzPGNoYXIxNl90PjsKKyAgdGVtcGxhdGU8PiBzdHJ1Y3QgY2hhcl90cmFpdHM8Y2hhcjMyX3Q+OworCisgIC8vLyBBIHN0cmluZyBvZiBAYyBjaGFyMTZfdAorICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyMTZfdD4gdTE2c3RyaW5nOyAKKworICAvLy8gQSBzdHJpbmcgb2YgQGMgY2hhcjMyX3QKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcjMyX3Q+IHUzMnN0cmluZzsgCisKKyNlbmRpZgorICAvKiogQH0gICovCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgkvLyBfU1RSSU5HRldEX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy91bmlxdWVfcHRyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdW5pcXVlX3B0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDczYjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdW5pcXVlX3B0ci5oCkBAIC0wLDAgKzEsNjE1IEBACisvLyB1bmlxdWVfcHRyIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3VuaXF1ZV9wdHIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9VTklRVUVfUFRSX0gKKyNkZWZpbmUgX1VOSVFVRV9QVFJfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx0dXBsZT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBwb2ludGVyX2Fic3RyYWN0aW9ucworICAgKiBAeworICAgKi8KKworI2lmIF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgIHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcyBhdXRvX3B0cjsKKyNlbmRpZgorCisgIC8vLyBQcmltYXJ5IHRlbXBsYXRlLCBkZWZhdWx0X2RlbGV0ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBkZWZhdWx0X2RlbGV0ZQorICAgIHsKKyAgICAgIGNvbnN0ZXhwciBkZWZhdWx0X2RlbGV0ZSgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTxfVXAqLCBfVHAqPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBkZWZhdWx0X2RlbGV0ZShjb25zdCBkZWZhdWx0X2RlbGV0ZTxfVXA+Jikgbm9leGNlcHQgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoX1RwKiBfX3B0cikgY29uc3QKKyAgICAgIHsKKwlzdGF0aWNfYXNzZXJ0KHNpemVvZihfVHApPjAsCisJCSAgICAgICJjYW4ndCBkZWxldGUgcG9pbnRlciB0byBpbmNvbXBsZXRlIHR5cGUiKTsKKwlkZWxldGUgX19wdHI7CisgICAgICB9CisgICAgfTsKKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIERSIDc0MCAtIG9taXQgc3BlY2lhbGl6YXRpb24gZm9yIGFycmF5IG9iamVjdHMgd2l0aCBhIGNvbXBpbGUgdGltZSBsZW5ndGgKKyAgLy8vIFNwZWNpYWxpemF0aW9uLCBkZWZhdWx0X2RlbGV0ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBkZWZhdWx0X2RlbGV0ZTxfVHBbXT4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKwl1c2luZyBfX3JlbW92ZV9jdiA9IHR5cGVuYW1lIHJlbW92ZV9jdjxfVXA+Ojp0eXBlOworCisgICAgICAvLyBMaWtlIGlzX2Jhc2Vfb2Y8X1RwLCBfVXA+IGJ1dCBmYWxzZSBpZiB1bnF1YWxpZmllZCB0eXBlcyBhcmUgdGhlIHNhbWUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKwl1c2luZyBfX2lzX2Rlcml2ZWRfVHAKKwkgID0gX19hbmRfPCBpc19iYXNlX29mPF9UcCwgX1VwPiwKKwkJICAgIF9fbm90Xzxpc19zYW1lPF9fcmVtb3ZlX2N2PF9UcD4sIF9fcmVtb3ZlX2N2PF9VcD4+PiA+OworCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIGRlZmF1bHRfZGVsZXRlKCkgbm9leGNlcHQgPSBkZWZhdWx0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPCFfX2lzX2Rlcml2ZWRfVHA8X1VwPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBkZWZhdWx0X2RlbGV0ZShjb25zdCBkZWZhdWx0X2RlbGV0ZTxfVXBbXT4mKSBub2V4Y2VwdCB7IH0KKworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShfVHAqIF9fcHRyKSBjb25zdAorICAgICAgeworCXN0YXRpY19hc3NlcnQoc2l6ZW9mKF9UcCk+MCwKKwkJICAgICAgImNhbid0IGRlbGV0ZSBwb2ludGVyIHRvIGluY29tcGxldGUgdHlwZSIpOworCWRlbGV0ZSBbXSBfX3B0cjsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorCXR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2Rlcml2ZWRfVHA8X1VwPjo6dmFsdWU+Ojp0eXBlCisJb3BlcmF0b3IoKShfVXAqKSBjb25zdCA9IGRlbGV0ZTsKKyAgICB9OworCisgIC8vLyAyMC43LjEuMiB1bmlxdWVfcHRyIGZvciBzaW5nbGUgb2JqZWN0cy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwID0gZGVmYXVsdF9kZWxldGU8X1RwPiA+CisgICAgY2xhc3MgdW5pcXVlX3B0cgorICAgIHsKKyAgICAgIC8vIHVzZSBTRklOQUUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgX0RlbDo6cG9pbnRlciBleGlzdHMKKyAgICAgIGNsYXNzIF9Qb2ludGVyCisgICAgICB7CisJdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorCSAgc3RhdGljIHR5cGVuYW1lIF9VcDo6cG9pbnRlciBfX3Rlc3QodHlwZW5hbWUgX1VwOjpwb2ludGVyKik7CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisJICBzdGF0aWMgX1RwKiBfX3Rlc3QoLi4uKTsKKworCXR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRHA+Ojp0eXBlIF9EZWw7CisKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIGRlY2x0eXBlKF9fdGVzdDxfRGVsPigwKSkgdHlwZTsKKyAgICAgIH07CisKKyAgICAgIHR5cGVkZWYgc3RkOjp0dXBsZTx0eXBlbmFtZSBfUG9pbnRlcjo6dHlwZSwgX0RwPiAgX190dXBsZV90eXBlOworICAgICAgX190dXBsZV90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV90OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUG9pbnRlcjo6dHlwZSAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlOworICAgICAgdHlwZWRlZiBfRHAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZXJfdHlwZTsKKworICAgICAgLy8gQ29uc3RydWN0b3JzLgorICAgICAgY29uc3RleHByIHVuaXF1ZV9wdHIoKSBub2V4Y2VwdAorICAgICAgOiBfTV90KCkKKyAgICAgIHsgc3RhdGljX2Fzc2VydCghaXNfcG9pbnRlcjxkZWxldGVyX3R5cGU+Ojp2YWx1ZSwKKwkJICAgICAiY29uc3RydWN0ZWQgd2l0aCBudWxsIGZ1bmN0aW9uIHBvaW50ZXIgZGVsZXRlciIpOyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bmlxdWVfcHRyKHBvaW50ZXIgX19wKSBub2V4Y2VwdAorICAgICAgOiBfTV90KF9fcCwgZGVsZXRlcl90eXBlKCkpCisgICAgICB7IHN0YXRpY19hc3NlcnQoIWlzX3BvaW50ZXI8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJCSAgICAgImNvbnN0cnVjdGVkIHdpdGggbnVsbCBmdW5jdGlvbiBwb2ludGVyIGRlbGV0ZXIiKTsgfQorCisgICAgICB1bmlxdWVfcHRyKHBvaW50ZXIgX19wLAorCSAgdHlwZW5hbWUgY29uZGl0aW9uYWw8aXNfcmVmZXJlbmNlPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorCSAgICBkZWxldGVyX3R5cGUsIGNvbnN0IGRlbGV0ZXJfdHlwZSY+Ojp0eXBlIF9fZCkgbm9leGNlcHQKKyAgICAgIDogX01fdChfX3AsIF9fZCkgeyB9CisKKyAgICAgIHVuaXF1ZV9wdHIocG9pbnRlciBfX3AsCisJICB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPGRlbGV0ZXJfdHlwZT46OnR5cGUmJiBfX2QpIG5vZXhjZXB0CisgICAgICA6IF9NX3Qoc3RkOjptb3ZlKF9fcCksIHN0ZDo6bW92ZShfX2QpKQorICAgICAgeyBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3JlZmVyZW5jZTxkZWxldGVyX3R5cGU+Ojp2YWx1ZSwKKwkJICAgICAgInJ2YWx1ZSBkZWxldGVyIGJvdW5kIHRvIHJlZmVyZW5jZSIpOyB9CisKKyAgICAgIGNvbnN0ZXhwciB1bmlxdWVfcHRyKG51bGxwdHJfdCkgbm9leGNlcHQgOiB1bmlxdWVfcHRyKCkgeyB9CisKKyAgICAgIC8vIE1vdmUgY29uc3RydWN0b3JzLgorICAgICAgdW5pcXVlX3B0cih1bmlxdWVfcHRyJiYgX191KSBub2V4Y2VwdAorICAgICAgOiBfTV90KF9fdS5yZWxlYXNlKCksIHN0ZDo6Zm9yd2FyZDxkZWxldGVyX3R5cGU+KF9fdS5nZXRfZGVsZXRlcigpKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgX0VwLCB0eXBlbmFtZSA9IF9SZXF1aXJlPAorCSAgICAgICBpc19jb252ZXJ0aWJsZTx0eXBlbmFtZSB1bmlxdWVfcHRyPF9VcCwgX0VwPjo6cG9pbnRlciwgcG9pbnRlcj4sCisJICAgICAgIF9fbm90Xzxpc19hcnJheTxfVXA+PiwKKwkgICAgICAgdHlwZW5hbWUgY29uZGl0aW9uYWw8aXNfcmVmZXJlbmNlPF9EcD46OnZhbHVlLAorCQkJCSAgICBpc19zYW1lPF9FcCwgX0RwPiwKKwkJCQkgICAgaXNfY29udmVydGlibGU8X0VwLCBfRHA+Pjo6dHlwZT4+CisJdW5pcXVlX3B0cih1bmlxdWVfcHRyPF9VcCwgX0VwPiYmIF9fdSkgbm9leGNlcHQKKwk6IF9NX3QoX191LnJlbGVhc2UoKSwgc3RkOjpmb3J3YXJkPF9FcD4oX191LmdldF9kZWxldGVyKCkpKQorCXsgfQorCisjaWYgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgPSBfUmVxdWlyZTwKKwkgICAgICAgaXNfY29udmVydGlibGU8X1VwKiwgX1RwKj4sIGlzX3NhbWU8X0RwLCBkZWZhdWx0X2RlbGV0ZTxfVHA+Pj4+CisJdW5pcXVlX3B0cihhdXRvX3B0cjxfVXA+JiYgX191KSBub2V4Y2VwdDsKKyNlbmRpZgorCisgICAgICAvLyBEZXN0cnVjdG9yLgorICAgICAgfnVuaXF1ZV9wdHIoKSBub2V4Y2VwdAorICAgICAgeworCWF1dG8mIF9fcHRyID0gc3RkOjpnZXQ8MD4oX01fdCk7CisJaWYgKF9fcHRyICE9IG51bGxwdHIpCisJICBnZXRfZGVsZXRlcigpKF9fcHRyKTsKKwlfX3B0ciA9IHBvaW50ZXIoKTsKKyAgICAgIH0KKworICAgICAgLy8gQXNzaWdubWVudC4KKyAgICAgIHVuaXF1ZV9wdHImCisgICAgICBvcGVyYXRvcj0odW5pcXVlX3B0ciYmIF9fdSkgbm9leGNlcHQKKyAgICAgIHsKKwlyZXNldChfX3UucmVsZWFzZSgpKTsKKwlnZXRfZGVsZXRlcigpID0gc3RkOjpmb3J3YXJkPGRlbGV0ZXJfdHlwZT4oX191LmdldF9kZWxldGVyKCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfRXA+CisJdHlwZW5hbWUgZW5hYmxlX2lmPCBfX2FuZF88CisJICBpc19jb252ZXJ0aWJsZTx0eXBlbmFtZSB1bmlxdWVfcHRyPF9VcCwgX0VwPjo6cG9pbnRlciwgcG9pbnRlcj4sCisJICBfX25vdF88aXNfYXJyYXk8X1VwPj4KKwkgID46OnZhbHVlLAorCSAgdW5pcXVlX3B0ciY+Ojp0eXBlCisJb3BlcmF0b3I9KHVuaXF1ZV9wdHI8X1VwLCBfRXA+JiYgX191KSBub2V4Y2VwdAorCXsKKwkgIHJlc2V0KF9fdS5yZWxlYXNlKCkpOworCSAgZ2V0X2RlbGV0ZXIoKSA9IHN0ZDo6Zm9yd2FyZDxfRXA+KF9fdS5nZXRfZGVsZXRlcigpKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHVuaXF1ZV9wdHImCisgICAgICBvcGVyYXRvcj0obnVsbHB0cl90KSBub2V4Y2VwdAorICAgICAgeworCXJlc2V0KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBPYnNlcnZlcnMuCisgICAgICB0eXBlbmFtZSBhZGRfbHZhbHVlX3JlZmVyZW5jZTxlbGVtZW50X3R5cGU+Ojp0eXBlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChnZXQoKSAhPSBwb2ludGVyKCkpOworCXJldHVybiAqZ2V0KCk7CisgICAgICB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChnZXQoKSAhPSBwb2ludGVyKCkpOworCXJldHVybiBnZXQoKTsKKyAgICAgIH0KKworICAgICAgcG9pbnRlcgorICAgICAgZ2V0KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6Z2V0PDA+KF9NX3QpOyB9CisKKyAgICAgIGRlbGV0ZXJfdHlwZSYKKyAgICAgIGdldF9kZWxldGVyKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6Z2V0PDE+KF9NX3QpOyB9CisKKyAgICAgIGNvbnN0IGRlbGV0ZXJfdHlwZSYKKyAgICAgIGdldF9kZWxldGVyKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6Z2V0PDE+KF9NX3QpOyB9CisKKyAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gZ2V0KCkgPT0gcG9pbnRlcigpID8gZmFsc2UgOiB0cnVlOyB9CisKKyAgICAgIC8vIE1vZGlmaWVycy4KKyAgICAgIHBvaW50ZXIKKyAgICAgIHJlbGVhc2UoKSBub2V4Y2VwdAorICAgICAgeworCXBvaW50ZXIgX19wID0gZ2V0KCk7CisJc3RkOjpnZXQ8MD4oX01fdCkgPSBwb2ludGVyKCk7CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzZXQocG9pbnRlciBfX3AgPSBwb2ludGVyKCkpIG5vZXhjZXB0CisgICAgICB7CisJdXNpbmcgc3RkOjpzd2FwOworCXN3YXAoc3RkOjpnZXQ8MD4oX01fdCksIF9fcCk7CisJaWYgKF9fcCAhPSBwb2ludGVyKCkpCisJICBnZXRfZGVsZXRlcigpKF9fcCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodW5pcXVlX3B0ciYgX191KSBub2V4Y2VwdAorICAgICAgeworCXVzaW5nIHN0ZDo6c3dhcDsKKwlzd2FwKF9NX3QsIF9fdS5fTV90KTsKKyAgICAgIH0KKworICAgICAgLy8gRGlzYWJsZSBjb3B5IGZyb20gbHZhbHVlLgorICAgICAgdW5pcXVlX3B0cihjb25zdCB1bmlxdWVfcHRyJikgPSBkZWxldGU7CisgICAgICB1bmlxdWVfcHRyJiBvcGVyYXRvcj0oY29uc3QgdW5pcXVlX3B0ciYpID0gZGVsZXRlOworICB9OworCisgIC8vLyAyMC43LjEuMyB1bmlxdWVfcHRyIGZvciBhcnJheSBvYmplY3RzIHdpdGggYSBydW50aW1lIGxlbmd0aAorICAvLyBbdW5pcXVlLnB0ci5ydW50aW1lXQorICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIERSIDc0MCAtIG9taXQgc3BlY2lhbGl6YXRpb24gZm9yIGFycmF5IG9iamVjdHMgd2l0aCBhIGNvbXBpbGUgdGltZSBsZW5ndGgKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgY2xhc3MgdW5pcXVlX3B0cjxfVHBbXSwgX0RwPgorICAgIHsKKyAgICAgIC8vIHVzZSBTRklOQUUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgX0RlbDo6cG9pbnRlciBleGlzdHMKKyAgICAgIGNsYXNzIF9Qb2ludGVyCisgICAgICB7CisJdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorCSAgc3RhdGljIHR5cGVuYW1lIF9VcDo6cG9pbnRlciBfX3Rlc3QodHlwZW5hbWUgX1VwOjpwb2ludGVyKik7CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisJICBzdGF0aWMgX1RwKiBfX3Rlc3QoLi4uKTsKKworCXR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRHA+Ojp0eXBlIF9EZWw7CisKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIGRlY2x0eXBlKF9fdGVzdDxfRGVsPigwKSkgdHlwZTsKKyAgICAgIH07CisKKyAgICAgIHR5cGVkZWYgc3RkOjp0dXBsZTx0eXBlbmFtZSBfUG9pbnRlcjo6dHlwZSwgX0RwPiAgX190dXBsZV90eXBlOworICAgICAgX190dXBsZV90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV90OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisJdXNpbmcgX19yZW1vdmVfY3YgPSB0eXBlbmFtZSByZW1vdmVfY3Y8X1VwPjo6dHlwZTsKKworICAgICAgLy8gbGlrZSBpc19iYXNlX29mPF9UcCwgX1VwPiBidXQgZmFsc2UgaWYgdW5xdWFsaWZpZWQgdHlwZXMgYXJlIHRoZSBzYW1lCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisJdXNpbmcgX19pc19kZXJpdmVkX1RwCisJICA9IF9fYW5kXzwgaXNfYmFzZV9vZjxfVHAsIF9VcD4sCisJCSAgICBfX25vdF88aXNfc2FtZTxfX3JlbW92ZV9jdjxfVHA+LCBfX3JlbW92ZV9jdjxfVXA+Pj4gPjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfRXAsCisJICAgICAgIHR5cGVuYW1lIF9UcF9wb2ludGVyID0gdHlwZW5hbWUgX1BvaW50ZXI6OnR5cGUsCisJICAgICAgIHR5cGVuYW1lIF9VcF9wb2ludGVyID0gdHlwZW5hbWUgdW5pcXVlX3B0cjxfVXAsIF9FcD46OnBvaW50ZXI+CisJdXNpbmcgX19zYWZlX2NvbnZlcnNpb24gPSBfX2FuZF88CisJICAgIGlzX2NvbnZlcnRpYmxlPF9VcF9wb2ludGVyLCBfVHBfcG9pbnRlcj4sCisJICAgIGlzX2FycmF5PF9VcD4sCisJICAgIF9fb3JfPF9fbm90Xzxpc19wb2ludGVyPF9VcF9wb2ludGVyPj4sCisJCSAgX19ub3RfPGlzX3BvaW50ZXI8X1RwX3BvaW50ZXI+PiwKKwkJICBfX25vdF88X19pc19kZXJpdmVkX1RwPHR5cGVuYW1lIHJlbW92ZV9leHRlbnQ8X1VwPjo6dHlwZT4+CisJICAgID4KKwkgID47CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Qb2ludGVyOjp0eXBlCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcAkJIAllbGVtZW50X3R5cGU7CisgICAgICB0eXBlZGVmIF9EcCAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlcl90eXBlOworCisgICAgICAvLyBDb25zdHJ1Y3RvcnMuCisgICAgICBjb25zdGV4cHIgdW5pcXVlX3B0cigpIG5vZXhjZXB0CisgICAgICA6IF9NX3QoKQorICAgICAgeyBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3BvaW50ZXI8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJCSAgICAgICJjb25zdHJ1Y3RlZCB3aXRoIG51bGwgZnVuY3Rpb24gcG9pbnRlciBkZWxldGVyIik7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHVuaXF1ZV9wdHIocG9pbnRlciBfX3ApIG5vZXhjZXB0CisgICAgICA6IF9NX3QoX19wLCBkZWxldGVyX3R5cGUoKSkKKyAgICAgIHsgc3RhdGljX2Fzc2VydCghaXNfcG9pbnRlcjxkZWxldGVyX3R5cGU+Ojp2YWx1ZSwKKwkJICAgICAgImNvbnN0cnVjdGVkIHdpdGggbnVsbCBmdW5jdGlvbiBwb2ludGVyIGRlbGV0ZXIiKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lID0gX1JlcXVpcmU8aXNfcG9pbnRlcjxwb2ludGVyPiwKKwkgICAgICAgaXNfY29udmVydGlibGU8X1VwKiwgcG9pbnRlcj4sIF9faXNfZGVyaXZlZF9UcDxfVXA+Pj4KKwlleHBsaWNpdAorCXVuaXF1ZV9wdHIoX1VwKiBfX3ApID0gZGVsZXRlOworCisgICAgICB1bmlxdWVfcHRyKHBvaW50ZXIgX19wLAorCSAgdHlwZW5hbWUgY29uZGl0aW9uYWw8aXNfcmVmZXJlbmNlPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorCSAgICAgIGRlbGV0ZXJfdHlwZSwgY29uc3QgZGVsZXRlcl90eXBlJj46OnR5cGUgX19kKSBub2V4Y2VwdAorICAgICAgOiBfTV90KF9fcCwgX19kKSB7IH0KKworICAgICAgdW5pcXVlX3B0cihwb2ludGVyIF9fcCwgdHlwZW5hbWUKKwkJIHJlbW92ZV9yZWZlcmVuY2U8ZGVsZXRlcl90eXBlPjo6dHlwZSYmIF9fZCkgbm9leGNlcHQKKyAgICAgIDogX01fdChzdGQ6Om1vdmUoX19wKSwgc3RkOjptb3ZlKF9fZCkpCisgICAgICB7IHN0YXRpY19hc3NlcnQoIWlzX3JlZmVyZW5jZTxkZWxldGVyX3R5cGU+Ojp2YWx1ZSwKKwkJICAgICAgInJ2YWx1ZSBkZWxldGVyIGJvdW5kIHRvIHJlZmVyZW5jZSIpOyB9CisKKyAgICAgIC8vIE1vdmUgY29uc3RydWN0b3IuCisgICAgICB1bmlxdWVfcHRyKHVuaXF1ZV9wdHImJiBfX3UpIG5vZXhjZXB0CisgICAgICA6IF9NX3QoX191LnJlbGVhc2UoKSwgc3RkOjpmb3J3YXJkPGRlbGV0ZXJfdHlwZT4oX191LmdldF9kZWxldGVyKCkpKSB7IH0KKworICAgICAgY29uc3RleHByIHVuaXF1ZV9wdHIobnVsbHB0cl90KSBub2V4Y2VwdCA6IHVuaXF1ZV9wdHIoKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfRXAsCisJICAgICAgIHR5cGVuYW1lID0gX1JlcXVpcmU8X19zYWZlX2NvbnZlcnNpb248X1VwLCBfRXA+LAorCQkgdHlwZW5hbWUgY29uZGl0aW9uYWw8aXNfcmVmZXJlbmNlPF9EcD46OnZhbHVlLAorCQkJCSAgICAgIGlzX3NhbWU8X0VwLCBfRHA+LAorCQkJCSAgICAgIGlzX2NvbnZlcnRpYmxlPF9FcCwgX0RwPj46OnR5cGUKKwkgICAgICAgPj4KKwl1bmlxdWVfcHRyKHVuaXF1ZV9wdHI8X1VwLCBfRXA+JiYgX191KSBub2V4Y2VwdAorCTogX01fdChfX3UucmVsZWFzZSgpLCBzdGQ6OmZvcndhcmQ8X0VwPihfX3UuZ2V0X2RlbGV0ZXIoKSkpCisJeyB9CisKKyAgICAgIC8vIERlc3RydWN0b3IuCisgICAgICB+dW5pcXVlX3B0cigpCisgICAgICB7CisJYXV0byYgX19wdHIgPSBzdGQ6OmdldDwwPihfTV90KTsKKwlpZiAoX19wdHIgIT0gbnVsbHB0cikKKwkgIGdldF9kZWxldGVyKCkoX19wdHIpOworCV9fcHRyID0gcG9pbnRlcigpOworICAgICAgfQorCisgICAgICAvLyBBc3NpZ25tZW50LgorICAgICAgdW5pcXVlX3B0ciYKKyAgICAgIG9wZXJhdG9yPSh1bmlxdWVfcHRyJiYgX191KSBub2V4Y2VwdAorICAgICAgeworCXJlc2V0KF9fdS5yZWxlYXNlKCkpOworCWdldF9kZWxldGVyKCkgPSBzdGQ6OmZvcndhcmQ8ZGVsZXRlcl90eXBlPihfX3UuZ2V0X2RlbGV0ZXIoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9FcD4KKwl0eXBlbmFtZQorCWVuYWJsZV9pZjxfX3NhZmVfY29udmVyc2lvbjxfVXAsIF9FcD46OnZhbHVlLCB1bmlxdWVfcHRyJj46OnR5cGUKKwlvcGVyYXRvcj0odW5pcXVlX3B0cjxfVXAsIF9FcD4mJiBfX3UpIG5vZXhjZXB0CisJeworCSAgcmVzZXQoX191LnJlbGVhc2UoKSk7CisJICBnZXRfZGVsZXRlcigpID0gc3RkOjpmb3J3YXJkPF9FcD4oX191LmdldF9kZWxldGVyKCkpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdW5pcXVlX3B0ciYKKyAgICAgIG9wZXJhdG9yPShudWxscHRyX3QpIG5vZXhjZXB0CisgICAgICB7CisJcmVzZXQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIE9ic2VydmVycy4KKyAgICAgIHR5cGVuYW1lIHN0ZDo6YWRkX2x2YWx1ZV9yZWZlcmVuY2U8ZWxlbWVudF90eXBlPjo6dHlwZQorICAgICAgb3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChnZXQoKSAhPSBwb2ludGVyKCkpOworCXJldHVybiBnZXQoKVtfX2ldOworICAgICAgfQorCisgICAgICBwb2ludGVyCisgICAgICBnZXQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpnZXQ8MD4oX01fdCk7IH0KKworICAgICAgZGVsZXRlcl90eXBlJgorICAgICAgZ2V0X2RlbGV0ZXIoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpnZXQ8MT4oX01fdCk7IH0KKworICAgICAgY29uc3QgZGVsZXRlcl90eXBlJgorICAgICAgZ2V0X2RlbGV0ZXIoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpnZXQ8MT4oX01fdCk7IH0KKworICAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBnZXQoKSA9PSBwb2ludGVyKCkgPyBmYWxzZSA6IHRydWU7IH0KKworICAgICAgLy8gTW9kaWZpZXJzLgorICAgICAgcG9pbnRlcgorICAgICAgcmVsZWFzZSgpIG5vZXhjZXB0CisgICAgICB7CisJcG9pbnRlciBfX3AgPSBnZXQoKTsKKwlzdGQ6OmdldDwwPihfTV90KSA9IHBvaW50ZXIoKTsKKwlyZXR1cm4gX19wOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXNldCgpIG5vZXhjZXB0CisgICAgICB7IHJlc2V0KHBvaW50ZXIoKSk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzZXQocG9pbnRlciBfX3ApIG5vZXhjZXB0CisgICAgICB7CisJdXNpbmcgc3RkOjpzd2FwOworCXN3YXAoc3RkOjpnZXQ8MD4oX01fdCksIF9fcCk7CisJaWYgKF9fcCAhPSBudWxscHRyKQorCSAgZ2V0X2RlbGV0ZXIoKShfX3ApOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lID0gX1JlcXVpcmU8aXNfcG9pbnRlcjxwb2ludGVyPiwKKwkgICAgICAgaXNfY29udmVydGlibGU8X1VwKiwgcG9pbnRlcj4sIF9faXNfZGVyaXZlZF9UcDxfVXA+Pj4KKwl2b2lkIHJlc2V0KF9VcCopID0gZGVsZXRlOworCisgICAgICB2b2lkCisgICAgICBzd2FwKHVuaXF1ZV9wdHImIF9fdSkgbm9leGNlcHQKKyAgICAgIHsKKwl1c2luZyBzdGQ6OnN3YXA7CisJc3dhcChfTV90LCBfX3UuX01fdCk7CisgICAgICB9CisKKyAgICAgIC8vIERpc2FibGUgY29weSBmcm9tIGx2YWx1ZS4KKyAgICAgIHVuaXF1ZV9wdHIoY29uc3QgdW5pcXVlX3B0ciYpID0gZGVsZXRlOworICAgICAgdW5pcXVlX3B0ciYgb3BlcmF0b3I9KGNvbnN0IHVuaXF1ZV9wdHImKSA9IGRlbGV0ZTsKKworICAgICAgLy8gRGlzYWJsZSBjb25zdHJ1Y3Rpb24gZnJvbSBjb252ZXJ0aWJsZSBwb2ludGVyIHR5cGVzLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZSA9IF9SZXF1aXJlPGlzX3BvaW50ZXI8cG9pbnRlcj4sCisJICAgICAgIGlzX2NvbnZlcnRpYmxlPF9VcCosIHBvaW50ZXI+LCBfX2lzX2Rlcml2ZWRfVHA8X1VwPj4+CisJdW5pcXVlX3B0cihfVXAqLCB0eXBlbmFtZQorCQkgICBjb25kaXRpb25hbDxpc19yZWZlcmVuY2U8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJCSAgIGRlbGV0ZXJfdHlwZSwgY29uc3QgZGVsZXRlcl90eXBlJj46OnR5cGUpID0gZGVsZXRlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lID0gX1JlcXVpcmU8aXNfcG9pbnRlcjxwb2ludGVyPiwKKwkgICAgICAgaXNfY29udmVydGlibGU8X1VwKiwgcG9pbnRlcj4sIF9faXNfZGVyaXZlZF9UcDxfVXA+Pj4KKwl1bmlxdWVfcHRyKF9VcCosIHR5cGVuYW1lCisJCSAgIHJlbW92ZV9yZWZlcmVuY2U8ZGVsZXRlcl90eXBlPjo6dHlwZSYmKSA9IGRlbGV0ZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX194LAorCSB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX195KSBub2V4Y2VwdAorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwLAorCSAgIHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgX0VwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX194LAorCSAgICAgICBjb25zdCB1bmlxdWVfcHRyPF9VcCwgX0VwPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5nZXQoKSA9PSBfX3kuZ2V0KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCwgbnVsbHB0cl90KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICFfX3g7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0obnVsbHB0cl90LCBjb25zdCB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX194KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICFfX3g7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcCwKKwkgICB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9FcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCwKKwkgICAgICAgY29uc3QgdW5pcXVlX3B0cjxfVXAsIF9FcD4mIF9feSkKKyAgICB7IHJldHVybiBfX3guZ2V0KCkgIT0gX195LmdldCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsIG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiAoYm9vbClfX3g7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0obnVsbHB0cl90LCBjb25zdCB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX194KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIChib29sKV9feDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwLAorCSAgIHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgX0VwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsCisJICAgICAgY29uc3QgdW5pcXVlX3B0cjxfVXAsIF9FcD4mIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisJc3RkOjpjb21tb25fdHlwZTx0eXBlbmFtZSB1bmlxdWVfcHRyPF9UcCwgX0RwPjo6cG9pbnRlciwKKwkgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHVuaXF1ZV9wdHI8X1VwLCBfRXA+Ojpwb2ludGVyPjo6dHlwZSBfQ1Q7CisgICAgICByZXR1cm4gc3RkOjpsZXNzPF9DVD4oKShfX3guZ2V0KCksIF9feS5nZXQoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsIG51bGxwdHJfdCkKKyAgICB7IHJldHVybiBzdGQ6Omxlc3M8dHlwZW5hbWUgdW5pcXVlX3B0cjxfVHAsIF9EcD46OnBvaW50ZXI+KCkoX194LmdldCgpLAorCQkJCQkJCQkgbnVsbHB0cik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChudWxscHRyX3QsIGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gpCisgICAgeyByZXR1cm4gc3RkOjpsZXNzPHR5cGVuYW1lIHVuaXF1ZV9wdHI8X1RwLCBfRHA+Ojpwb2ludGVyPigpKG51bGxwdHIsCisJCQkJCQkJCSBfX3guZ2V0KCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHAsCisJICAgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfRXA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsCisJICAgICAgIGNvbnN0IHVuaXF1ZV9wdHI8X1VwLCBfRXA+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsIG51bGxwdHJfdCkKKyAgICB7IHJldHVybiAhKG51bGxwdHIgPCBfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KG51bGxwdHJfdCwgY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCkKKyAgICB7IHJldHVybiAhKF9feCA8IG51bGxwdHIpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHAsCisJICAgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfRXA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCwKKwkgICAgICBjb25zdCB1bmlxdWVfcHRyPF9VcCwgX0VwPiYgX195KQorICAgIHsgcmV0dXJuIChfX3kgPCBfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCwgbnVsbHB0cl90KQorICAgIHsgcmV0dXJuIHN0ZDo6bGVzczx0eXBlbmFtZSB1bmlxdWVfcHRyPF9UcCwgX0RwPjo6cG9pbnRlcj4oKShudWxscHRyLAorCQkJCQkJCQkgX194LmdldCgpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KG51bGxwdHJfdCwgY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCkKKyAgICB7IHJldHVybiBzdGQ6Omxlc3M8dHlwZW5hbWUgdW5pcXVlX3B0cjxfVHAsIF9EcD46OnBvaW50ZXI+KCkoX194LmdldCgpLAorCQkJCQkJCQkgbnVsbHB0cik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcCwKKwkgICB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9FcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCwKKwkgICAgICAgY29uc3QgdW5pcXVlX3B0cjxfVXAsIF9FcD4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCwgbnVsbHB0cl90KQorICAgIHsgcmV0dXJuICEoX194IDwgbnVsbHB0cik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0obnVsbHB0cl90LCBjb25zdCB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX194KQorICAgIHsgcmV0dXJuICEobnVsbHB0ciA8IF9feCk7IH0KKworICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciB1bmlxdWVfcHRyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcD4KKyAgICBzdHJ1Y3QgaGFzaDx1bmlxdWVfcHRyPF9UcCwgX0RwPj4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIHVuaXF1ZV9wdHI8X1RwLCBfRHA+PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX191KSBjb25zdCBub2V4Y2VwdAorICAgICAgeworCXR5cGVkZWYgdW5pcXVlX3B0cjxfVHAsIF9EcD4gX1VQOworCXJldHVybiBzdGQ6Omhhc2g8dHlwZW5hbWUgX1VQOjpwb2ludGVyPigpKF9fdS5nZXQoKSk7CisgICAgICB9CisgICAgfTsKKworICAvLyBAfSBncm91cCBwb2ludGVyX2Fic3RyYWN0aW9ucworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfVU5JUVVFX1BUUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdW5vcmRlcmVkX21hcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3Vub3JkZXJlZF9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDg1ZTI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3Vub3JkZXJlZF9tYXAuaApAQCAtMCwwICsxLDE0MTMgQEAKKy8vIHVub3JkZXJlZF9tYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvdW5vcmRlcmVkX21hcC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dW5vcmRlcmVkX21hcH0KKyAqLworCisjaWZuZGVmIF9VTk9SREVSRURfTUFQX0gKKyNkZWZpbmUgX1VOT1JERVJFRF9NQVBfSAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICAvLy8gQmFzZSB0eXBlcyBmb3IgdW5vcmRlcmVkX21hcC4KKyAgdGVtcGxhdGU8Ym9vbCBfQ2FjaGU+CisgICAgdXNpbmcgX191bWFwX3RyYWl0cyA9IF9fZGV0YWlsOjpfSGFzaHRhYmxlX3RyYWl0czxfQ2FjaGUsIGZhbHNlLCB0cnVlPjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LAorCSAgIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfSGFzaCA9IGhhc2g8X0tleT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4sCisJICAgdHlwZW5hbWUgX1RyID0gX191bWFwX3RyYWl0czxfX2NhY2hlX2RlZmF1bHQ8X0tleSwgX0hhc2g+Ojp2YWx1ZT4+CisgICAgdXNpbmcgX191bWFwX2hhc2h0YWJsZSA9IF9IYXNodGFibGU8X0tleSwgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FsbG9jLCBfX2RldGFpbDo6X1NlbGVjdDFzdCwKKwkJCQkgICAgICAgIF9QcmVkLCBfSGFzaCwKKwkJCQkgICAgICAgIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcsCisJCQkJICAgICAgICBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQkJICAgICAgICBfX2RldGFpbDo6X1ByaW1lX3JlaGFzaF9wb2xpY3ksIF9Ucj47CisKKyAgLy8vIEJhc2UgdHlwZXMgZm9yIHVub3JkZXJlZF9tdWx0aW1hcC4KKyAgdGVtcGxhdGU8Ym9vbCBfQ2FjaGU+CisgICAgdXNpbmcgX191bW1hcF90cmFpdHMgPSBfX2RldGFpbDo6X0hhc2h0YWJsZV90cmFpdHM8X0NhY2hlLCBmYWxzZSwgZmFsc2U+OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksCisJICAgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9IYXNoID0gaGFzaDxfS2V5PiwKKwkgICB0eXBlbmFtZSBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiwKKwkgICB0eXBlbmFtZSBfVHIgPSBfX3VtbWFwX3RyYWl0czxfX2NhY2hlX2RlZmF1bHQ8X0tleSwgX0hhc2g+Ojp2YWx1ZT4+CisgICAgdXNpbmcgX191bW1hcF9oYXNodGFibGUgPSBfSGFzaHRhYmxlPF9LZXksIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+LAorCQkJCQkgX0FsbG9jLCBfX2RldGFpbDo6X1NlbGVjdDFzdCwKKwkJCQkJIF9QcmVkLCBfSGFzaCwKKwkJCQkJIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcsCisJCQkJCSBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQkJCSBfX2RldGFpbDo6X1ByaW1lX3JlaGFzaF9wb2xpY3ksIF9Ucj47CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgY29tcG9zZWQgb2YgdW5pcXVlIGtleXMgKGNvbnRhaW5pbmcKKyAgICogIGF0IG1vc3Qgb25lIG9mIGVhY2gga2V5IHZhbHVlKSB0aGF0IGFzc29jaWF0ZXMgdmFsdWVzIG9mIGFub3RoZXIgdHlwZQorICAgKiAgd2l0aCB0aGUga2V5cy4KKyAgICoKKyAgICogIEBpbmdyb3VwIHVub3JkZXJlZF9hc3NvY2lhdGl2ZV9jb250YWluZXJzCisgICAqCisgICAqICBAdHBhcmFtICBfS2V5ICBUeXBlIG9mIGtleSBvYmplY3RzLgorICAgKiAgQHRwYXJhbSAgX1RwICBUeXBlIG9mIG1hcHBlZCBvYmplY3RzLgorICAgKiAgQHRwYXJhbSAgX0hhc2ggIEhhc2hpbmcgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGhhc2g8X1ZhbHVlPi4KKyAgICogIEB0cGFyYW0gIF9QcmVkICBQcmVkaWNhdGUgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzCisgICAqICAgICAgICAgICAgICAgICAgdG8gZXF1YWxfdG88X1ZhbHVlPi4KKyAgICogIEB0cGFyYW0gIF9BbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxfS2V5Pi4KKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYW5kCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCN4eCI+dW5vcmRlcmVkIGFzc29jaWF0aXZlIGNvbnRhaW5lcjwvYT4KKyAgICoKKyAgICogVGhlIHJlc3VsdGluZyB2YWx1ZSB0eXBlIG9mIHRoZSBjb250YWluZXIgaXMgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4uCisgICAqCisgICAqICBCYXNlIGlzIF9IYXNodGFibGUsIGRpc3BhdGNoZWQgYXQgY29tcGlsZSB0aW1lIHZpYSB0ZW1wbGF0ZQorICAgKiAgYWxpYXMgX191bWFwX2hhc2h0YWJsZS4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X0tleT4sCisJICAgY2xhc3MgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9tYXAgOiBfX2NoZWNrX2NvcHlfY29uc3RydWN0aWJsZTxfQWxsb2M+CisgICAgeworICAgICAgdHlwZWRlZiBfX3VtYXBfaGFzaHRhYmxlPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+ICBfSGFzaHRhYmxlOworICAgICAgX0hhc2h0YWJsZSBfTV9oOworCisgICAgcHVibGljOgorICAgICAgLy8gdHlwZWRlZnM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjprZXlfdHlwZQlrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6dmFsdWVfdHlwZQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjptYXBwZWRfdHlwZQltYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6aGFzaGVyCWhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6a2V5X2VxdWFsCWtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8vLyAgSXRlcmF0b3ItcmVsYXRlZCB0eXBlZGVmcy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnBvaW50ZXIJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpjb25zdF9wb2ludGVyCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpyZWZlcmVuY2UJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcmVmZXJlbmNlCWNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6aXRlcmF0b3IJCWl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjpjb25zdF9pdGVyYXRvcgljb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6bG9jYWxfaXRlcmF0b3IJbG9jYWxfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmNvbnN0X2xvY2FsX2l0ZXJhdG9yCWNvbnN0X2xvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjpzaXplX3R5cGUJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6ZGlmZmVyZW5jZV90eXBlCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy9jb25zdHJ1Y3QvZGVzdHJveS9jb3B5CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSBfX24gIEluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgICAgKiAgQHBhcmFtIF9faGYgIEEgaGFzaCBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2VxbCAgQSBrZXkgZXF1YWxpdHkgZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgdW5vcmRlcmVkX21hcChzaXplX3R5cGUgX19uID0gMTAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV9oKF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhbiAldW5vcmRlcmVkX21hcCBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTWluaW1hbCBpbml0aWFsIG51bWJlciBvZiBidWNrZXRzLgorICAgICAgICogIEBwYXJhbSBfX2hmICBBIGhhc2ggZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19lcWwgIEEga2V5IGVxdWFsaXR5IGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGFuICV1bm9yZGVyZWRfbWFwIGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgW19fZmlyc3QsX19sYXN0KS4gIFRoaXMgaXMgbGluZWFyIGluIE4gKHdoZXJlIE4gaXMKKyAgICAgICAqICBkaXN0YW5jZShfX2ZpcnN0LF9fbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl1bm9yZGVyZWRfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkgICAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9oKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisJeyB9CisKKyAgICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgorICAgICAgdW5vcmRlcmVkX21hcChjb25zdCB1bm9yZGVyZWRfbWFwJikgPSBkZWZhdWx0OworCisgICAgICAvLy8gTW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgIHVub3JkZXJlZF9tYXAodW5vcmRlcmVkX21hcCYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGFuICV1bm9yZGVyZWRfbWFwIGZyb20gYW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gX19uICBNaW5pbWFsIGluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgICAgKiAgQHBhcmFtIF9faGYgIEEgaGFzaCBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2VxbCAgQSBrZXkgZXF1YWxpdHkgZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGFuICV1bm9yZGVyZWRfbWFwIGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICBsaXN0LiBUaGlzIGlzIGxpbmVhciBpbiBOICh3aGVyZSBOIGlzIEBhIF9fbC5zaXplKCkpLgorICAgICAgICovCisgICAgICB1bm9yZGVyZWRfbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkgICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faChfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICAvLy8gQ29weSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgdW5vcmRlcmVkX21hcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB1bm9yZGVyZWRfbWFwJikgPSBkZWZhdWx0OworCisgICAgICAvLy8gTW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgdW5vcmRlcmVkX21hcCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfbWFwJiYpID0gZGVmYXVsdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlVW5vcmRlcmVkX21hcCBsaXN0IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYW4gJXVub3JkZXJlZF9tYXAgd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluCisgICAgICAgKiAgdGhlIGluaXRpYWxpemVyIGxpc3QgQGEgX19sLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAldW5vcmRlcmVkX21hcCBhbmQKKyAgICAgICAqICB0aGF0IHRoZSByZXN1bHRpbmcgJXVub3JkZXJlZF9tYXAncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICB1bm9yZGVyZWRfbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9NX2ggPSBfX2w7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIGFsbG9jYXRvciBvYmplY3Qgd2l0aCB3aGljaCB0aGUgJXVub3JkZXJlZF9tYXAgd2FzCisgICAgICAvLy8gIGNvbnN0cnVjdGVkLgorICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgLy8gc2l6ZSBhbmQgY2FwYWNpdHk6CisKKyAgICAgIC8vLyAgUmV0dXJucyB0cnVlIGlmIHRoZSAldW5vcmRlcmVkX21hcCBpcyBlbXB0eS4KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZW1wdHkoKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIHNpemUgb2YgdGhlICV1bm9yZGVyZWRfbWFwLgorICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guc2l6ZSgpOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSAldW5vcmRlcmVkX21hcC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8vIGl0ZXJhdG9ycy4KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlCisgICAgICAgKiAgJXVub3JkZXJlZF9tYXAuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKCk7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICV1bm9yZGVyZWRfbWFwLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5iZWdpbigpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5iZWdpbigpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQgaW4KKyAgICAgICAqICB0aGUgJXVub3JkZXJlZF9tYXAuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5lbmQoKTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmVuZCgpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZW5kKCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy8gbW9kaWZpZXJzLgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gYnVpbGQgYW5kIGluc2VydCBhIHN0ZDo6cGFpciBpbnRvIHRoZSAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYXJncyAgQXJndW1lbnRzIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgcGFpciBpbnN0YW5jZSAoc2VlCisgICAgICAgKgkgICAgICAgIHN0ZDo6cGllY2V3aXNlX2NvbnRydWN0IGZvciBwYXNzaW5nIGFyZ3VtZW50cyB0byBlYWNoCisgICAgICAgKgkgICAgICAgIHBhcnQgb2YgdGhlIHBhaXIgY29uc3RydWN0b3IpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBBIHBhaXIsIG9mIHdoaWNoIHRoZSBmaXJzdCBlbGVtZW50IGlzIGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgICAgICAgICAgdG8gdGhlIHBvc3NpYmx5IGluc2VydGVkIHBhaXIsIGFuZCB0aGUgc2Vjb25kIGlzIGEgYm9vbCB0aGF0CisgICAgICAgKiAgICAgICAgICAgaXMgdHJ1ZSBpZiB0aGUgcGFpciB3YXMgYWN0dWFsbHkgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gYnVpbGQgYW5kIGluc2VydCBhIChrZXksIHZhbHVlKSAlcGFpciBpbnRvCisgICAgICAgKiAgdGhlICV1bm9yZGVyZWRfbWFwLgorICAgICAgICogIEFuICV1bm9yZGVyZWRfbWFwIHJlbGllcyBvbiB1bmlxdWUga2V5cyBhbmQgdGh1cyBhICVwYWlyIGlzIG9ubHkKKyAgICAgICAqICBpbnNlcnRlZCBpZiBpdHMgZmlyc3QgZWxlbWVudCAodGhlIGtleSkgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUKKyAgICAgICAqICAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7IHJldHVybiBfTV9oLmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gYnVpbGQgYW5kIGluc2VydCBhIHN0ZDo6cGFpciBpbnRvIHRoZSAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZSBwYWlyCisgICAgICAgKiAgICAgICAgICAgICAgICBzaG91bGQgYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX2FyZ3MgIEFyZ3VtZW50cyB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IHBhaXIgaW5zdGFuY2UgKHNlZQorICAgICAgICoJICAgICAgICAgc3RkOjpwaWVjZXdpc2VfY29udHJ1Y3QgZm9yIHBhc3NpbmcgYXJndW1lbnRzIHRvIGVhY2gKKyAgICAgICAqCSAgICAgICAgIHBhcnQgb2YgdGhlIHBhaXIgY29uc3RydWN0b3IpLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGVsZW1lbnQgd2l0aCBrZXkgb2YgdGhlCisgICAgICAgKiAgICAgICAgICBzdGQ6OnBhaXIgYnVpbHQgZnJvbSBAYSBfX2FyZ3MgKG1heSBvciBtYXkgbm90IGJlIHRoYXQKKyAgICAgICAqICAgICAgICAgIHN0ZDo6cGFpcikuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgbm90IGNvbmNlcm5lZCBhYm91dCB3aGV0aGVyIHRoZSBpbnNlcnRpb24gdG9vayBwbGFjZSwKKyAgICAgICAqICBhbmQgdGh1cyBkb2VzIG5vdCByZXR1cm4gYSBib29sZWFuIGxpa2UgdGhlIHNpbmdsZS1hcmd1bWVudCBlbXBsYWNlKCkKKyAgICAgICAqICBkb2VzLgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4gcG90ZW50aWFsbHkKKyAgICAgICAqICBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuIEEgYmFkIGhpbnQgd291bGQKKyAgICAgICAqICBjYXVzZSBubyBnYWlucyBpbiBlZmZpY2llbmN5LgorICAgICAgICoKKyAgICAgICAqICBTZWUKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKiAgZm9yIG1vcmUgb24gQGEgaGludGluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01faC5lbXBsYWNlX2hpbnQoX19wb3MsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhIHN0ZDo6cGFpciBpbnRvIHRoZSAldW5vcmRlcmVkX21hcC4KKworICAgICAgICogIEBwYXJhbSBfX3ggUGFpciB0byBiZSBpbnNlcnRlZCAoc2VlIHN0ZDo6bWFrZV9wYWlyIGZvciBlYXN5CisgICAgICAgKgkgICAgIGNyZWF0aW9uIG9mIHBhaXJzKS4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQSBwYWlyLCBvZiB3aGljaCB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbiBpdGVyYXRvciB0aGF0IAorICAgICAgICogICAgICAgICAgIHBvaW50cyB0byB0aGUgcG9zc2libHkgaW5zZXJ0ZWQgcGFpciwgYW5kIHRoZSBzZWNvbmQgaXMgCisgICAgICAgKiAgICAgICAgICAgYSBib29sIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgcGFpciB3YXMgYWN0dWFsbHkgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gaW5zZXJ0IGEgKGtleSwgdmFsdWUpICVwYWlyIGludG8gdGhlCisgICAgICAgKiAgJXVub3JkZXJlZF9tYXAuIEFuICV1bm9yZGVyZWRfbWFwIHJlbGllcyBvbiB1bmlxdWUga2V5cyBhbmQgdGh1cyBhCisgICAgICAgKiAgJXBhaXIgaXMgb25seSBpbnNlcnRlZCBpZiBpdHMgZmlyc3QgZWxlbWVudCAodGhlIGtleSkgaXMgbm90IGFscmVhZHkKKyAgICAgICAqICBwcmVzZW50IGluIHRoZSAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01faC5pbnNlcnQoX194KTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKwlpbnNlcnQoX1BhaXImJiBfX3gpCisgICAgICAgIHsgcmV0dXJuIF9NX2guaW5zZXJ0KHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX194KSk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhIHN0ZDo6cGFpciBpbnRvIHRoZSAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqICBAcGFyYW0gIF9faGludCAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZQorICAgICAgICogICAgICAgICAgICAgICAgIHBhaXIgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX194ICBQYWlyIHRvIGJlIGluc2VydGVkIChzZWUgc3RkOjptYWtlX3BhaXIgZm9yIGVhc3kgY3JlYXRpb24KKyAgICAgICAqICAgICAgICAgICAgICAgb2YgcGFpcnMpLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGVsZW1lbnQgd2l0aCBrZXkgb2YKKyAgICAgICAqICAgICAgICAgICBAYSBfX3ggKG1heSBvciBtYXkgbm90IGJlIHRoZSAlcGFpciBwYXNzZWQgaW4pLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjb25jZXJuZWQgYWJvdXQgd2hldGhlciB0aGUgaW5zZXJ0aW9uIHRvb2sgcGxhY2UsCisgICAgICAgKiAgYW5kIHRodXMgZG9lcyBub3QgcmV0dXJuIGEgYm9vbGVhbiBsaWtlIHRoZSBzaW5nbGUtYXJndW1lbnQgaW5zZXJ0KCkKKyAgICAgICAqICBkb2VzLiAgTm90ZSB0aGF0IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgb25seSBhIGhpbnQgYW5kIGNhbgorICAgICAgICogIHBvdGVudGlhbGx5IGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBpbnNlcnRpb24gcHJvY2Vzcy4gIEEgYmFkCisgICAgICAgKiAgaGludCB3b3VsZCBjYXVzZSBubyBnYWlucyBpbiBlZmZpY2llbmN5LgorICAgICAgICoKKyAgICAgICAqICBTZWUKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKiAgZm9yIG1vcmUgb24gQGEgaGludGluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01faC5pbnNlcnQoX19oaW50LCBfX3gpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisJaXRlcmF0b3IKKwlpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBfUGFpciYmIF9feCkKKwl7IHJldHVybiBfTV9oLmluc2VydChfX2hpbnQsIHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX194KSk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEEgdGVtcGxhdGUgZnVuY3Rpb24gdGhhdCBhdHRlbXB0cyB0byBpbnNlcnQgYSByYW5nZSBvZgorICAgICAgICogIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXZvaWQKKwlpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorCXsgX01faC5pbnNlcnQoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGEgbGlzdCBvZiBlbGVtZW50cyBpbnRvIHRoZSAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQSBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gb2YgZWxlbWVudHMKKyAgICAgICAqICAgICAgICAgICAgICAgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSByYW5nZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyBfTV9oLmluc2VydChfX2wpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYW4gZWxlbWVudCBmcm9tIGFuICV1bm9yZGVyZWRfbWFwLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nCisgICAgICAgKiAgICAgICAgICBAYSBfX3Bvc2l0aW9uIHByaW9yIHRvIHRoZSBlbGVtZW50IGJlaW5nIGVyYXNlZC4gSWYgbm8gc3VjaAorICAgICAgICogICAgICAgICAgZWxlbWVudCBleGlzdHMsIGVuZCgpIGlzIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbiBlbGVtZW50LCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpdGVyYXRvciwKKyAgICAgICAqICBmcm9tIGFuICV1bm9yZGVyZWRfbWFwLgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZiB0aGUKKyAgICAgICAqICBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbgorICAgICAgICogIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIF9NX2guZXJhc2UoX19wb3NpdGlvbik7IH0KKworICAgICAgLy8gTFdHIDIwNTkuCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZXJhc2UoX19pdCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBlbGVtZW50cyBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbGwgdGhlIGVsZW1lbnRzIGxvY2F0ZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCisgICAgICAgKiAgYW4gJXVub3JkZXJlZF9tYXAuIEZvciBhbiAldW5vcmRlcmVkX21hcCB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24KKyAgICAgICAqICBjYW4gb25seSBiZSAwIChub3QgcHJlc2VudCkgb3IgMSAocHJlc2VudCkuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmIHRoZQorICAgICAgICogIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluCisgICAgICAgKiAgYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZXJhc2UoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGEgW19fZmlyc3QsX19sYXN0KSByYW5nZSBvZiBlbGVtZW50cyBmcm9tIGFuCisgICAgICAgKiAgJXVub3JkZXJlZF9tYXAuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gX19sYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZSB0bworICAgICAgICogICAgICAgICAgICAgICAgYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gVGhlIGl0ZXJhdG9yIEBhIF9fbGFzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBmcm9tIGFuICV1bm9yZGVyZWRfbWFwLgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBFcmFzZXMgYWxsIGVsZW1lbnRzIGluIGFuICV1bm9yZGVyZWRfbWFwLgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlCisgICAgICAgKiAgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZAorICAgICAgICogIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIG5vZXhjZXB0CisgICAgICB7IF9NX2guY2xlYXIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXBzIGRhdGEgd2l0aCBhbm90aGVyICV1bm9yZGVyZWRfbWFwLgorICAgICAgICogIEBwYXJhbSAgX194ICBBbiAldW5vcmRlcmVkX21hcCBvZiB0aGUgc2FtZSBlbGVtZW50IGFuZCBhbGxvY2F0b3IKKyAgICAgICAqICB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBleGNoYW5nZXMgdGhlIGVsZW1lbnRzIGJldHdlZW4gdHdvICV1bm9yZGVyZWRfbWFwIGluIGNvbnN0YW50IHRpbWUuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBnbG9iYWwgc3RkOjpzd2FwKCkgZnVuY3Rpb24gaXMgc3BlY2lhbGl6ZWQgc3VjaCB0aGF0CisgICAgICAgKiAgc3RkOjpzd2FwKG0xLG0yKSB3aWxsIGZlZWQgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3dhcCh1bm9yZGVyZWRfbWFwJiBfX3gpCisgICAgICB7IF9NX2guc3dhcChfX3guX01faCk7IH0KKworICAgICAgLy8gb2JzZXJ2ZXJzLgorCisgICAgICAvLy8gIFJldHVybnMgdGhlIGhhc2ggZnVuY3RvciBvYmplY3Qgd2l0aCB3aGljaCB0aGUgJXVub3JkZXJlZF9tYXAgd2FzCisgICAgICAvLy8gIGNvbnN0cnVjdGVkLgorICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0aW9uKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guaGFzaF9mdW5jdGlvbigpOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUga2V5IGNvbXBhcmlzb24gb2JqZWN0IHdpdGggd2hpY2ggdGhlICV1bm9yZGVyZWRfbWFwIHdhcworICAgICAgLy8vICBjb25zdHJ1Y3RlZC4KKyAgICAgIGtleV9lcXVhbAorICAgICAga2V5X2VxKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gua2V5X2VxKCk7IH0KKworICAgICAgLy8gbG9va3VwLgorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVHJpZXMgdG8gbG9jYXRlIGFuIGVsZW1lbnQgaW4gYW4gJXVub3JkZXJlZF9tYXAuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHNvdWdodC1hZnRlciBlbGVtZW50LCBvciBlbmQoKSBpZiBub3QKKyAgICAgICAqICAgICAgICAgICBmb3VuZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGtleSBhbmQgdHJpZXMgdG8gbG9jYXRlIHRoZSBlbGVtZW50IHdpdGggd2hpY2gKKyAgICAgICAqICB0aGUga2V5IG1hdGNoZXMuICBJZiBzdWNjZXNzZnVsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGl0ZXJhdG9yCisgICAgICAgKiAgcG9pbnRpbmcgdG8gdGhlIHNvdWdodCBhZnRlciBlbGVtZW50LiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgdGhlCisgICAgICAgKiAgcGFzdC10aGUtZW5kICggQGMgZW5kKCkgKSBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZmluZChfX3gpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmZpbmQoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSB0byBjb3VudC4KKyAgICAgICAqICBAcmV0dXJuICBOdW1iZXIgb2YgZWxlbWVudHMgd2l0aCBzcGVjaWZpZWQga2V5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIG9ubHkgbWFrZXMgc2Vuc2UgZm9yICV1bm9yZGVyZWRfbXVsdGltYXA7IGZvcgorICAgICAgICogICV1bm9yZGVyZWRfbWFwIHRoZSByZXN1bHQgd2lsbCBlaXRoZXIgYmUgMCAobm90IHByZXNlbnQpIG9yIDEKKyAgICAgICAqICAocHJlc2VudCkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guY291bnQoX194KTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIFBhaXIgb2YgaXRlcmF0b3JzIHRoYXQgcG9zc2libHkgcG9pbnRzIHRvIHRoZSBzdWJzZXF1ZW5jZQorICAgICAgICogICAgICAgICAgIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwcm9iYWJseSBvbmx5IG1ha2VzIHNlbnNlIGZvciAldW5vcmRlcmVkX211bHRpbWFwLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZXF1YWxfcmFuZ2UoX194KTsgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guZXF1YWxfcmFuZ2UoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN1YnNjcmlwdCAoIEBjIFtdICkgYWNjZXNzIHRvICV1bm9yZGVyZWRfbWFwIGRhdGEuCisgICAgICAgKiAgQHBhcmFtICBfX2sgIFRoZSBrZXkgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHJpZXZlZC4KKyAgICAgICAqICBAcmV0dXJuICBBIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBvZiB0aGUgKGtleSxkYXRhKSAlcGFpci4KKyAgICAgICAqCisgICAgICAgKiAgQWxsb3dzIGZvciBlYXN5IGxvb2t1cCB3aXRoIHRoZSBzdWJzY3JpcHQgKCBAYyBbXSApb3BlcmF0b3IuICBSZXR1cm5zCisgICAgICAgKiAgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBzcGVjaWZpZWQgaW4gc3Vic2NyaXB0LiAgSWYgdGhlIGtleSBkb2VzCisgICAgICAgKiAgbm90IGV4aXN0LCBhIHBhaXIgd2l0aCB0aGF0IGtleSBpcyBjcmVhdGVkIHVzaW5nIGRlZmF1bHQgdmFsdWVzLCB3aGljaAorICAgICAgICogIGlzIHRoZW4gcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIExvb2t1cCByZXF1aXJlcyBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICBtYXBwZWRfdHlwZSYKKyAgICAgIG9wZXJhdG9yW10oY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgIHsgcmV0dXJuIF9NX2hbX19rXTsgfQorCisgICAgICBtYXBwZWRfdHlwZSYKKyAgICAgIG9wZXJhdG9yW10oa2V5X3R5cGUmJiBfX2spCisgICAgICB7IHJldHVybiBfTV9oW3N0ZDo6bW92ZShfX2spXTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFjY2VzcyB0byAldW5vcmRlcmVkX21hcCBkYXRhLgorICAgICAgICogIEBwYXJhbSAgX19rICBUaGUga2V5IGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXRyaWV2ZWQuCisgICAgICAgKiAgQHJldHVybiAgQSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgd2hvc2Uga2V5IGlzIGVxdWFsIHRvIEBhIF9faywgaWYKKyAgICAgICAqICAgICAgICAgICBzdWNoIGEgZGF0YSBpcyBwcmVzZW50IGluIHRoZSAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBubyBzdWNoIGRhdGEgaXMgcHJlc2VudC4KKyAgICAgICAqLworICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBhdChjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgeyByZXR1cm4gX01faC5hdChfX2spOyB9CisKKyAgICAgIGNvbnN0IG1hcHBlZF90eXBlJgorICAgICAgYXQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guYXQoX19rKTsgfQorICAgICAgLy9AfQorCisgICAgICAvLyBidWNrZXQgaW50ZXJmYWNlLgorCisgICAgICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgb2YgdGhlICV1bm9yZGVyZWRfbWFwLgorICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfY291bnQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5idWNrZXRfY291bnQoKTsgfQorCisgICAgICAvLy8gUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnVja2V0cyBvZiB0aGUgJXVub3JkZXJlZF9tYXAuCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgLyoKKyAgICAgICAqIEBicmllZiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgZ2l2ZW4gYnVja2V0LgorICAgICAgICogQHBhcmFtICBfX24gIEEgYnVja2V0IGluZGV4LgorICAgICAgICogQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYnVja2V0LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmJ1Y2tldF9zaXplKF9fbik7IH0KKworICAgICAgLyoKKyAgICAgICAqIEBicmllZiAgUmV0dXJucyB0aGUgYnVja2V0IGluZGV4IG9mIGEgZ2l2ZW4gZWxlbWVudC4KKyAgICAgICAqIEBwYXJhbSAgX19rZXkgIEEga2V5IGluc3RhbmNlLgorICAgICAgICogQHJldHVybiAgVGhlIGtleSBidWNrZXQgaW5kZXguCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guYnVja2V0KF9fa2V5KTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBidWNrZXQKKyAgICAgICAqICAgICAgICAgZWxlbWVudC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiBUaGUgYnVja2V0IGluZGV4LgorICAgICAgICogIEByZXR1cm4gIEEgcmVhZC93cml0ZSBsb2NhbCBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX24pCisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKF9fbik7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgICAgICAgIGJ1Y2tldCBlbGVtZW50LgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBidWNrZXQgaW5kZXguCisgICAgICAgKiAgQHJldHVybiAgQSByZWFkLW9ubHkgbG9jYWwgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5iZWdpbihfX24pOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guY2JlZ2luKF9fbik7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogICAgICAgICBidWNrZXQgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX24gVGhlIGJ1Y2tldCBpbmRleC4KKyAgICAgICAqICBAcmV0dXJuICBBIHJlYWQvd3JpdGUgbG9jYWwgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2guZW5kKF9fbik7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QKKyAgICAgICAqICAgICAgICAgdGhlIGxhc3QgYnVja2V0IGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBidWNrZXQgaW5kZXguCisgICAgICAgKiAgQHJldHVybiAgQSByZWFkLW9ubHkgbG9jYWwgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guZW5kKF9fbik7IH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGNlbmQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guY2VuZChfX24pOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vIGhhc2ggcG9saWN5LgorCisgICAgICAvLy8gUmV0dXJucyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgZWxlbWVudHMgcGVyIGJ1Y2tldC4KKyAgICAgIGZsb2F0CisgICAgICBsb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmxvYWRfZmFjdG9yKCk7IH0KKworICAgICAgLy8vIFJldHVybnMgYSBwb3NpdGl2ZSBudW1iZXIgdGhhdCB0aGUgJXVub3JkZXJlZF9tYXAgdHJpZXMgdG8ga2VlcCB0aGUKKyAgICAgIC8vLyBsb2FkIGZhY3RvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8uCisgICAgICBmbG9hdAorICAgICAgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2gubWF4X2xvYWRfZmFjdG9yKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDaGFuZ2UgdGhlICV1bm9yZGVyZWRfbWFwIG1heGltdW0gbG9hZCBmYWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ogVGhlIG5ldyBtYXhpbXVtIGxvYWQgZmFjdG9yLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX196KQorICAgICAgeyBfTV9oLm1heF9sb2FkX2ZhY3RvcihfX3opOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTWF5IHJlaGFzaCB0aGUgJXVub3JkZXJlZF9tYXAuCisgICAgICAgKiAgQHBhcmFtICBfX24gVGhlIG5ldyBudW1iZXIgb2YgYnVja2V0cy4KKyAgICAgICAqCisgICAgICAgKiAgUmVoYXNoIHdpbGwgb2NjdXIgb25seSBpZiB0aGUgbmV3IG51bWJlciBvZiBidWNrZXRzIHJlc3BlY3QgdGhlCisgICAgICAgKiAgJXVub3JkZXJlZF9tYXAgbWF4aW11bSBsb2FkIGZhY3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVoYXNoKHNpemVfdHlwZSBfX24pCisgICAgICB7IF9NX2gucmVoYXNoKF9fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQcmVwYXJlIHRoZSAldW5vcmRlcmVkX21hcCBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mCisgICAgICAgKiAgICAgICAgICBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fbiBOdW1iZXIgb2YgZWxlbWVudHMgcmVxdWlyZWQuCisgICAgICAgKgorICAgICAgICogIFNhbWUgYXMgcmVoYXNoKGNlaWwobiAvIG1heF9sb2FkX2ZhY3RvcigpKSkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2VydmUoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgX01faC5yZXNlcnZlKF9fbik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleTEsIHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9IYXNoMSwgdHlwZW5hbWUgX1ByZWQxLAorCSAgICAgICB0eXBlbmFtZSBfQWxsb2MxPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXkxLCBfVHAxLCBfSGFzaDEsIF9QcmVkMSwgX0FsbG9jMT4mLAorCQkgY29uc3QgdW5vcmRlcmVkX21hcDxfS2V5MSwgX1RwMSwgX0hhc2gxLCBfUHJlZDEsIF9BbGxvYzE+Jik7CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBBIHN0YW5kYXJkIGNvbnRhaW5lciBjb21wb3NlZCBvZiBlcXVpdmFsZW50IGtleXMKKyAgICogIChwb3NzaWJseSBjb250YWluaW5nIG11bHRpcGxlIG9mIGVhY2gga2V5IHZhbHVlKSB0aGF0IGFzc29jaWF0ZXMKKyAgICogIHZhbHVlcyBvZiBhbm90aGVyIHR5cGUgd2l0aCB0aGUga2V5cy4KKyAgICoKKyAgICogIEBpbmdyb3VwIHVub3JkZXJlZF9hc3NvY2lhdGl2ZV9jb250YWluZXJzCisgICAqCisgICAqICBAdHBhcmFtICBfS2V5ICBUeXBlIG9mIGtleSBvYmplY3RzLgorICAgKiAgQHRwYXJhbSAgX1RwICBUeXBlIG9mIG1hcHBlZCBvYmplY3RzLgorICAgKiAgQHRwYXJhbSAgX0hhc2ggIEhhc2hpbmcgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGhhc2g8X1ZhbHVlPi4KKyAgICogIEB0cGFyYW0gIF9QcmVkICBQcmVkaWNhdGUgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzCisgICAqICAgICAgICAgICAgICAgICAgdG8gZXF1YWxfdG88X1ZhbHVlPi4KKyAgICogIEB0cGFyYW0gIF9BbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxfS2V5Pi4KKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYW5kCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCN4eCI+dW5vcmRlcmVkIGFzc29jaWF0aXZlIGNvbnRhaW5lcjwvYT4KKyAgICoKKyAgICogVGhlIHJlc3VsdGluZyB2YWx1ZSB0eXBlIG9mIHRoZSBjb250YWluZXIgaXMgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4uCisgICAqCisgICAqICBCYXNlIGlzIF9IYXNodGFibGUsIGRpc3BhdGNoZWQgYXQgY29tcGlsZSB0aW1lIHZpYSB0ZW1wbGF0ZQorICAgKiAgYWxpYXMgX191bW1hcF9oYXNodGFibGUuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsCisJICAgY2xhc3MgX0hhc2ggPSBoYXNoPF9LZXk+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfbXVsdGltYXAgOiBfX2NoZWNrX2NvcHlfY29uc3RydWN0aWJsZTxfQWxsb2M+CisgICAgeworICAgICAgdHlwZWRlZiBfX3VtbWFwX2hhc2h0YWJsZTxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0hhc2h0YWJsZTsKKyAgICAgIF9IYXNodGFibGUgX01faDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVkZWZzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6a2V5X3R5cGUJa2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OnZhbHVlX3R5cGUJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6bWFwcGVkX3R5cGUJbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6Omhhc2hlcgloYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmtleV9lcXVhbAlrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvLy8gIEl0ZXJhdG9yLXJlbGF0ZWQgdHlwZWRlZnMuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpwb2ludGVyCQlwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcG9pbnRlcgljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6cmVmZXJlbmNlCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmNvbnN0X3JlZmVyZW5jZQljb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6Oml0ZXJhdG9yCQlpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6Y29uc3RfaXRlcmF0b3IJY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmxvY2FsX2l0ZXJhdG9yCWxvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjpjb25zdF9sb2NhbF9pdGVyYXRvcgljb25zdF9sb2NhbF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6c2l6ZV90eXBlCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmRpZmZlcmVuY2VfdHlwZQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vY29uc3RydWN0L2Rlc3Ryb3kvY29weQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gX19uICBJbml0aWFsIG51bWJlciBvZiBidWNrZXRzLgorICAgICAgICogIEBwYXJhbSBfX2hmICBBIGhhc2ggZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19lcWwgIEEga2V5IGVxdWFsaXR5IGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV9oKF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhbiAldW5vcmRlcmVkX211bHRpbWFwIGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gX19uICBNaW5pbWFsIGluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgICAgKiAgQHBhcmFtIF9faGYgIEEgaGFzaCBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2VxbCAgQSBrZXkgZXF1YWxpdHkgZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYW4gJXVub3JkZXJlZF9tdWx0aW1hcCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMKKyAgICAgICAqICBmcm9tIFtfX2ZpcnN0LF9fbGFzdCkuICBUaGlzIGlzIGxpbmVhciBpbiBOICh3aGVyZSBOIGlzCisgICAgICAgKiAgZGlzdGFuY2UoX19maXJzdCxfX2xhc3QpKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdW5vcmRlcmVkX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkJICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faChfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorCXsgfQorCisgICAgICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChjb25zdCB1bm9yZGVyZWRfbXVsdGltYXAmKSA9IGRlZmF1bHQ7CisKKyAgICAgIC8vLyBNb3ZlIGNvbnN0cnVjdG9yLgorICAgICAgdW5vcmRlcmVkX211bHRpbWFwKHVub3JkZXJlZF9tdWx0aW1hcCYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGFuICV1bm9yZGVyZWRfbXVsdGltYXAgZnJvbSBhbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSBfX24gIE1pbmltYWwgaW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cy4KKyAgICAgICAqICBAcGFyYW0gX19oZiAgQSBoYXNoIGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fZXFsICBBIGtleSBlcXVhbGl0eSBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYW4gJXVub3JkZXJlZF9tdWx0aW1hcCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4KKyAgICAgICAqICB0aGUgbGlzdC4gVGhpcyBpcyBsaW5lYXIgaW4gTiAod2hlcmUgTiBpcyBAYSBfX2wuc2l6ZSgpKS4KKyAgICAgICAqLworICAgICAgdW5vcmRlcmVkX211bHRpbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkJIHNpemVfdHlwZSBfX24gPSAwLAorCQkJIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX2goX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgLy8vIENvcHkgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB1bm9yZGVyZWRfbXVsdGltYXAmKSA9IGRlZmF1bHQ7CisKKyAgICAgIC8vLyBNb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0odW5vcmRlcmVkX211bHRpbWFwJiYpID0gZGVmYXVsdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlVW5vcmRlcmVkX211bHRpbWFwIGxpc3QgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhbiAldW5vcmRlcmVkX211bHRpbWFwIHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cworICAgICAgICogIGluIHRoZSBpbml0aWFsaXplciBsaXN0IEBhIF9fbC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcAorICAgICAgICogIGFuZCB0aGF0IHRoZSByZXN1bHRpbmcgJXVub3JkZXJlZF9tdWx0aW1hcCdzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlCisgICAgICAgKiAgbnVtYmVyIG9mIGVsZW1lbnRzIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwlfTV9oID0gX19sOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBhbGxvY2F0b3Igb2JqZWN0IHdpdGggd2hpY2ggdGhlICV1bm9yZGVyZWRfbXVsdGltYXAgd2FzCisgICAgICAvLy8gIGNvbnN0cnVjdGVkLgorICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgLy8gc2l6ZSBhbmQgY2FwYWNpdHk6CisKKyAgICAgIC8vLyAgUmV0dXJucyB0cnVlIGlmIHRoZSAldW5vcmRlcmVkX211bHRpbWFwIGlzIGVtcHR5LgorICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5lbXB0eSgpOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLnNpemUoKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8vIGl0ZXJhdG9ycy4KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlCisgICAgICAgKiAgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guYmVnaW4oKTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guYmVnaW4oKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guYmVnaW4oKTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50IGluCisgICAgICAgKiAgdGhlICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5lbmQoKTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAldW5vcmRlcmVkX211bHRpbWFwLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZW5kKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5lbmQoKTsgfQorICAgICAgLy9AfQorCisgICAgICAvLyBtb2RpZmllcnMuCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBidWlsZCBhbmQgaW5zZXJ0IGEgc3RkOjpwYWlyIGludG8gdGhlCisgICAgICAgKiAgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYXJncyAgQXJndW1lbnRzIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgcGFpciBpbnN0YW5jZSAoc2VlCisgICAgICAgKgkgICAgICAgIHN0ZDo6cGllY2V3aXNlX2NvbnRydWN0IGZvciBwYXNzaW5nIGFyZ3VtZW50cyB0byBlYWNoCisgICAgICAgKgkgICAgICAgIHBhcnQgb2YgdGhlIHBhaXIgY29uc3RydWN0b3IpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgcGFpci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBidWlsZCBhbmQgaW5zZXJ0IGEgKGtleSwgdmFsdWUpICVwYWlyIGludG8KKyAgICAgICAqICB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01faC5lbXBsYWNlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGJ1aWxkIGFuZCBpbnNlcnQgYSBzdGQ6OnBhaXIgaW50byB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZSBwYWlyCisgICAgICAgKiAgICAgICAgICAgICAgICBzaG91bGQgYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX2FyZ3MgIEFyZ3VtZW50cyB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IHBhaXIgaW5zdGFuY2UgKHNlZQorICAgICAgICoJICAgICAgICAgc3RkOjpwaWVjZXdpc2VfY29udHJ1Y3QgZm9yIHBhc3NpbmcgYXJndW1lbnRzIHRvIGVhY2gKKyAgICAgICAqCSAgICAgICAgIHBhcnQgb2YgdGhlIHBhaXIgY29uc3RydWN0b3IpLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGVsZW1lbnQgd2l0aCBrZXkgb2YgdGhlCisgICAgICAgKiAgICAgICAgICBzdGQ6OnBhaXIgYnVpbHQgZnJvbSBAYSBfX2FyZ3MuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4gcG90ZW50aWFsbHkKKyAgICAgICAqICBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuIEEgYmFkIGhpbnQgd291bGQKKyAgICAgICAqICBjYXVzZSBubyBnYWlucyBpbiBlZmZpY2llbmN5LgorICAgICAgICoKKyAgICAgICAqICBTZWUKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKiAgZm9yIG1vcmUgb24gQGEgaGludGluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01faC5lbXBsYWNlX2hpbnQoX19wb3MsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEluc2VydHMgYSBzdGQ6OnBhaXIgaW50byB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gX194IFBhaXIgdG8gYmUgaW5zZXJ0ZWQgKHNlZSBzdGQ6Om1ha2VfcGFpciBmb3IgZWFzeQorICAgICAgICoJICAgICBjcmVhdGlvbiBvZiBwYWlycykuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBwYWlyLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgYW1vcnRpemVkIGNvbnN0YW50IHRpbWUuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01faC5pbnNlcnQoX194KTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorCWl0ZXJhdG9yCisJaW5zZXJ0KF9QYWlyJiYgX194KQorICAgICAgICB7IHJldHVybiBfTV9oLmluc2VydChzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJbnNlcnRzIGEgc3RkOjpwYWlyIGludG8gdGhlICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICBfX2hpbnQgIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUKKyAgICAgICAqICAgICAgICAgICAgICAgICBwYWlyIHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgUGFpciB0byBiZSBpbnNlcnRlZCAoc2VlIHN0ZDo6bWFrZV9wYWlyIGZvciBlYXN5IGNyZWF0aW9uCisgICAgICAgKiAgICAgICAgICAgICAgIG9mIHBhaXJzKS4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBlbGVtZW50IHdpdGgga2V5IG9mCisgICAgICAgKiAgICAgICAgICAgQGEgX194IChtYXkgb3IgbWF5IG5vdCBiZSB0aGUgJXBhaXIgcGFzc2VkIGluKS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgb25seSBhIGhpbnQgYW5kIGNhbiBwb3RlbnRpYWxseQorICAgICAgICogIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBpbnNlcnRpb24gcHJvY2Vzcy4gIEEgYmFkIGhpbnQgd291bGQKKyAgICAgICAqICBjYXVzZSBubyBnYWlucyBpbiBlZmZpY2llbmN5LgorICAgICAgICoKKyAgICAgICAqICBTZWUKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKiAgZm9yIG1vcmUgb24gQGEgaGludGluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01faC5pbnNlcnQoX19oaW50LCBfX3gpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisJaXRlcmF0b3IKKwlpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBfUGFpciYmIF9feCkKKyAgICAgICAgeyByZXR1cm4gX01faC5pbnNlcnQoX19oaW50LCBzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgYXR0ZW1wdHMgdG8gaW5zZXJ0IGEgcmFuZ2Ugb2YKKyAgICAgICAqICBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZS4KKyAgICAgICAqCisgICAgICAgKiAgQ29tcGxleGl0eSBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIHJhbmdlIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl2b2lkCisJaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwl7IF9NX2guaW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhIGxpc3Qgb2YgZWxlbWVudHMgaW50byB0aGUKKyAgICAgICAqICAldW5vcmRlcmVkX211bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgX19sICBBIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBvZiBlbGVtZW50cworICAgICAgICogICAgICAgICAgICAgICB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgQ29tcGxleGl0eSBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIHJhbmdlIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IF9NX2guaW5zZXJ0KF9fbCk7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhbiBlbGVtZW50IGZyb20gYW4gJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZworICAgICAgICogICAgICAgICAgQGEgX19wb3NpdGlvbiBwcmlvciB0byB0aGUgZWxlbWVudCBiZWluZyBlcmFzZWQuIElmIG5vIHN1Y2gKKyAgICAgICAqICAgICAgICAgIGVsZW1lbnQgZXhpc3RzLCBlbmQoKSBpcyByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYW4gZWxlbWVudCwgcG9pbnRlZCB0byBieSB0aGUgZ2l2ZW4gaXRlcmF0b3IsCisgICAgICAgKiAgZnJvbSBhbiAldW5vcmRlcmVkX211bHRpbWFwLgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZiB0aGUKKyAgICAgICAqICBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbgorICAgICAgICogIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIF9NX2guZXJhc2UoX19wb3NpdGlvbik7IH0KKworICAgICAgLy8gTFdHIDIwNTkuCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZXJhc2UoX19pdCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBlbGVtZW50cyBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIGVsZW1lbnRzIHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYWxsIHRoZSBlbGVtZW50cyBsb2NhdGVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQorICAgICAgICogIGFuICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmIHRoZQorICAgICAgICogIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluCisgICAgICAgKiAgYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZXJhc2UoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGEgW19fZmlyc3QsX19sYXN0KSByYW5nZSBvZiBlbGVtZW50cyBmcm9tIGFuCisgICAgICAgKiAgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEBwYXJhbSBfX2xhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvCisgICAgICAgKiAgICAgICAgICAgICAgICBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiBUaGUgaXRlcmF0b3IgQGEgX19sYXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhIHNlcXVlbmNlIG9mIGVsZW1lbnRzIGZyb20gYW4KKyAgICAgICAqICAldW5vcmRlcmVkX211bHRpbWFwLgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBFcmFzZXMgYWxsIGVsZW1lbnRzIGluIGFuICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUKKyAgICAgICAqICBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgbm9leGNlcHQKKyAgICAgIHsgX01faC5jbGVhcigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3dhcHMgZGF0YSB3aXRoIGFub3RoZXIgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQW4gJXVub3JkZXJlZF9tdWx0aW1hcCBvZiB0aGUgc2FtZSBlbGVtZW50IGFuZCBhbGxvY2F0b3IKKyAgICAgICAqICB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBleGNoYW5nZXMgdGhlIGVsZW1lbnRzIGJldHdlZW4gdHdvICV1bm9yZGVyZWRfbXVsdGltYXAgaW4KKyAgICAgICAqICBjb25zdGFudCB0aW1lLgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzIHNwZWNpYWxpemVkIHN1Y2ggdGhhdAorICAgICAgICogIHN0ZDo6c3dhcChtMSxtMikgd2lsbCBmZWVkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodW5vcmRlcmVkX211bHRpbWFwJiBfX3gpCisgICAgICB7IF9NX2guc3dhcChfX3guX01faCk7IH0KKworICAgICAgLy8gb2JzZXJ2ZXJzLgorCisgICAgICAvLy8gIFJldHVybnMgdGhlIGhhc2ggZnVuY3RvciBvYmplY3Qgd2l0aCB3aGljaCB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcAorICAgICAgLy8vICB3YXMgY29uc3RydWN0ZWQuCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3Rpb24oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5oYXNoX2Z1bmN0aW9uKCk7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBrZXkgY29tcGFyaXNvbiBvYmplY3Qgd2l0aCB3aGljaCB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcAorICAgICAgLy8vICB3YXMgY29uc3RydWN0ZWQuCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmtleV9lcSgpOyB9CisKKyAgICAgIC8vIGxvb2t1cC4KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRyaWVzIHRvIGxvY2F0ZSBhbiBlbGVtZW50IGluIGFuICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHNvdWdodC1hZnRlciBlbGVtZW50LCBvciBlbmQoKSBpZiBub3QKKyAgICAgICAqICAgICAgICAgICBmb3VuZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGtleSBhbmQgdHJpZXMgdG8gbG9jYXRlIHRoZSBlbGVtZW50IHdpdGggd2hpY2gKKyAgICAgICAqICB0aGUga2V5IG1hdGNoZXMuICBJZiBzdWNjZXNzZnVsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGl0ZXJhdG9yCisgICAgICAgKiAgcG9pbnRpbmcgdG8gdGhlIHNvdWdodCBhZnRlciBlbGVtZW50LiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgdGhlCisgICAgICAgKiAgcGFzdC10aGUtZW5kICggQGMgZW5kKCkgKSBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZmluZChfX3gpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmZpbmQoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSB0byBjb3VudC4KKyAgICAgICAqICBAcmV0dXJuICBOdW1iZXIgb2YgZWxlbWVudHMgd2l0aCBzcGVjaWZpZWQga2V5LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmNvdW50KF9feCk7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBQYWlyIG9mIGl0ZXJhdG9ycyB0aGF0IHBvc3NpYmx5IHBvaW50cyB0byB0aGUgc3Vic2VxdWVuY2UKKyAgICAgICAqICAgICAgICAgICBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKi8KKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01faC5lcXVhbF9yYW5nZShfX3gpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5lcXVhbF9yYW5nZShfX3gpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vIGJ1Y2tldCBpbnRlcmZhY2UuCisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnVja2V0cyBvZiB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1Y2tldHMgb2YgdGhlICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgLyoKKyAgICAgICAqIEBicmllZiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgZ2l2ZW4gYnVja2V0LgorICAgICAgICogQHBhcmFtICBfX24gIEEgYnVja2V0IGluZGV4LgorICAgICAgICogQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYnVja2V0LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmJ1Y2tldF9zaXplKF9fbik7IH0KKworICAgICAgLyoKKyAgICAgICAqIEBicmllZiAgUmV0dXJucyB0aGUgYnVja2V0IGluZGV4IG9mIGEgZ2l2ZW4gZWxlbWVudC4KKyAgICAgICAqIEBwYXJhbSAgX19rZXkgIEEga2V5IGluc3RhbmNlLgorICAgICAgICogQHJldHVybiAgVGhlIGtleSBidWNrZXQgaW5kZXguCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guYnVja2V0KF9fa2V5KTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBidWNrZXQKKyAgICAgICAqICAgICAgICAgZWxlbWVudC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiBUaGUgYnVja2V0IGluZGV4LgorICAgICAgICogIEByZXR1cm4gIEEgcmVhZC93cml0ZSBsb2NhbCBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX24pCisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKF9fbik7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgICAgICAgIGJ1Y2tldCBlbGVtZW50LgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBidWNrZXQgaW5kZXguCisgICAgICAgKiAgQHJldHVybiAgQSByZWFkLW9ubHkgbG9jYWwgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5iZWdpbihfX24pOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guY2JlZ2luKF9fbik7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogICAgICAgICBidWNrZXQgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX24gVGhlIGJ1Y2tldCBpbmRleC4KKyAgICAgICAqICBAcmV0dXJuICBBIHJlYWQvd3JpdGUgbG9jYWwgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2guZW5kKF9fbik7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QKKyAgICAgICAqICAgICAgICAgdGhlIGxhc3QgYnVja2V0IGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBidWNrZXQgaW5kZXguCisgICAgICAgKiAgQHJldHVybiAgQSByZWFkLW9ubHkgbG9jYWwgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guZW5kKF9fbik7IH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGNlbmQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guY2VuZChfX24pOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vIGhhc2ggcG9saWN5LgorCisgICAgICAvLy8gUmV0dXJucyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgZWxlbWVudHMgcGVyIGJ1Y2tldC4KKyAgICAgIGZsb2F0CisgICAgICBsb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmxvYWRfZmFjdG9yKCk7IH0KKworICAgICAgLy8vIFJldHVybnMgYSBwb3NpdGl2ZSBudW1iZXIgdGhhdCB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcCB0cmllcyB0byBrZWVwCisgICAgICAvLy8gdGhlIGxvYWQgZmFjdG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0by4KKyAgICAgIGZsb2F0CisgICAgICBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5tYXhfbG9hZF9mYWN0b3IoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENoYW5nZSB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcCBtYXhpbXVtIGxvYWQgZmFjdG9yLgorICAgICAgICogIEBwYXJhbSAgX196IFRoZSBuZXcgbWF4aW11bSBsb2FkIGZhY3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9feikKKyAgICAgIHsgX01faC5tYXhfbG9hZF9mYWN0b3IoX196KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1heSByZWhhc2ggdGhlICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICBfX24gVGhlIG5ldyBudW1iZXIgb2YgYnVja2V0cy4KKyAgICAgICAqCisgICAgICAgKiAgUmVoYXNoIHdpbGwgb2NjdXIgb25seSBpZiB0aGUgbmV3IG51bWJlciBvZiBidWNrZXRzIHJlc3BlY3QgdGhlCisgICAgICAgKiAgJXVub3JkZXJlZF9tdWx0aW1hcCBtYXhpbXVtIGxvYWQgZmFjdG9yLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZWhhc2goc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgX01faC5yZWhhc2goX19uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFByZXBhcmUgdGhlICV1bm9yZGVyZWRfbXVsdGltYXAgZm9yIGEgc3BlY2lmaWVkIG51bWJlciBvZgorICAgICAgICogICAgICAgICAgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX24gTnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVpcmVkLgorICAgICAgICoKKyAgICAgICAqICBTYW1lIGFzIHJlaGFzaChjZWlsKG4gLyBtYXhfbG9hZF9mYWN0b3IoKSkpLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNlcnZlKHNpemVfdHlwZSBfX24pCisgICAgICB7IF9NX2gucmVzZXJ2ZShfX24pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXkxLCB0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfSGFzaDEsIHR5cGVuYW1lIF9QcmVkMSwKKwkgICAgICAgdHlwZW5hbWUgX0FsbG9jMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5MSwgX1RwMSwKKwkJCQkJICAgIF9IYXNoMSwgX1ByZWQxLCBfQWxsb2MxPiYsCisJCSAgIGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5MSwgX1RwMSwKKwkJCQkJICAgIF9IYXNoMSwgX1ByZWQxLCBfQWxsb2MxPiYpOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9oLl9NX2VxdWFsKF9feS5fTV9oKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2guX01fZXF1YWwoX195Ll9NX2gpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX1VOT1JERVJFRF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3Vub3JkZXJlZF9zZXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy91bm9yZGVyZWRfc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBjMjMzZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy91bm9yZGVyZWRfc2V0LmgKQEAgLTAsMCArMSwxMjk2IEBACisvLyB1bm9yZGVyZWRfc2V0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3Vub3JkZXJlZF9zZXQuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3Vub3JkZXJlZF9zZXR9CisgKi8KKworI2lmbmRlZiBfVU5PUkRFUkVEX1NFVF9ICisjZGVmaW5lIF9VTk9SREVSRURfU0VUX0gKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLy8vIEJhc2UgdHlwZXMgZm9yIHVub3JkZXJlZF9zZXQuCisgIHRlbXBsYXRlPGJvb2wgX0NhY2hlPgorICAgIHVzaW5nIF9fdXNldF90cmFpdHMgPSBfX2RldGFpbDo6X0hhc2h0YWJsZV90cmFpdHM8X0NhY2hlLCB0cnVlLCB0cnVlPjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0hhc2ggPSBoYXNoPF9WYWx1ZT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9WYWx1ZT4sCisgIAkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVmFsdWU+LAorCSAgIHR5cGVuYW1lIF9UciA9IF9fdXNldF90cmFpdHM8X19jYWNoZV9kZWZhdWx0PF9WYWx1ZSwgX0hhc2g+Ojp2YWx1ZT4+CisgICAgdXNpbmcgX191c2V0X2hhc2h0YWJsZSA9IF9IYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9BbGxvYywKKwkJCQkJX19kZXRhaWw6Ol9JZGVudGl0eSwgX1ByZWQsIF9IYXNoLAorCQkJCQlfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nLAorCQkJCQlfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQkJCV9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwgX1RyPjsKKworICAvLy8gQmFzZSB0eXBlcyBmb3IgdW5vcmRlcmVkX211bHRpc2V0LgorICB0ZW1wbGF0ZTxib29sIF9DYWNoZT4KKyAgICB1c2luZyBfX3Vtc2V0X3RyYWl0cyA9IF9fZGV0YWlsOjpfSGFzaHRhYmxlX3RyYWl0czxfQ2FjaGUsIHRydWUsIGZhbHNlPjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0hhc2ggPSBoYXNoPF9WYWx1ZT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9WYWx1ZT4sCisJICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X1ZhbHVlPiwKKwkgICB0eXBlbmFtZSBfVHIgPSBfX3Vtc2V0X3RyYWl0czxfX2NhY2hlX2RlZmF1bHQ8X1ZhbHVlLCBfSGFzaD46OnZhbHVlPj4KKyAgICB1c2luZyBfX3Vtc2V0X2hhc2h0YWJsZSA9IF9IYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9BbGxvYywKKwkJCQkJIF9fZGV0YWlsOjpfSWRlbnRpdHksCisJCQkJCSBfUHJlZCwgX0hhc2gsCisJCQkJCSBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nLAorCQkJCQkgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJCQkgX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LCBfVHI+OworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIGNvbXBvc2VkIG9mIHVuaXF1ZSBrZXlzIChjb250YWluaW5nCisgICAqICBhdCBtb3N0IG9uZSBvZiBlYWNoIGtleSB2YWx1ZSkgaW4gd2hpY2ggdGhlIGVsZW1lbnRzJyBrZXlzIGFyZQorICAgKiAgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgQHRwYXJhbSAgX1ZhbHVlICBUeXBlIG9mIGtleSBvYmplY3RzLgorICAgKiAgQHRwYXJhbSAgX0hhc2ggIEhhc2hpbmcgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGhhc2g8X1ZhbHVlPi4KKworICAgKiAgQHRwYXJhbSBfUHJlZCBQcmVkaWNhdGUgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvCisgICAqICAgICAgICAgICAgICAgIGVxdWFsX3RvPF9WYWx1ZT4uCisgICAqCisgICAqICBAdHBhcmFtICBfQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8X0tleT4uCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGFuZAorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjeHgiPnVub3JkZXJlZCBhc3NvY2lhdGl2ZSBjb250YWluZXI8L2E+CisgICAqCisgICAqICBCYXNlIGlzIF9IYXNodGFibGUsIGRpc3BhdGNoZWQgYXQgY29tcGlsZSB0aW1lIHZpYSB0ZW1wbGF0ZQorICAgKiAgYWxpYXMgX191c2V0X2hhc2h0YWJsZS4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X1ZhbHVlPiwKKwkgICBjbGFzcyBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X1ZhbHVlPiwKKwkgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVmFsdWU+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfc2V0IDogX19jaGVja19jb3B5X2NvbnN0cnVjdGlibGU8X0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX191c2V0X2hhc2h0YWJsZTxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0hhc2h0YWJsZTsKKyAgICAgIF9IYXNodGFibGUgX01faDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVkZWZzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6a2V5X3R5cGUJa2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OnZhbHVlX3R5cGUJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6aGFzaGVyCWhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6a2V5X2VxdWFsCWtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8vLyAgSXRlcmF0b3ItcmVsYXRlZCB0eXBlZGVmcy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnBvaW50ZXIJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpjb25zdF9wb2ludGVyCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpyZWZlcmVuY2UJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcmVmZXJlbmNlCWNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6aXRlcmF0b3IJCWl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjpjb25zdF9pdGVyYXRvcgljb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6bG9jYWxfaXRlcmF0b3IJbG9jYWxfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmNvbnN0X2xvY2FsX2l0ZXJhdG9yCWNvbnN0X2xvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjpzaXplX3R5cGUJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6ZGlmZmVyZW5jZV90eXBlCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy8gY29uc3RydWN0L2Rlc3Ryb3kvY29weQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgSW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cy4KKyAgICAgICAqICBAcGFyYW0gX19oZiAgQSBoYXNoIGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fZXFsICBBIGtleSBlcXVhbGl0eSBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfc2V0KHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX2goX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGFuICV1bm9yZGVyZWRfc2V0IGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gX19uICBNaW5pbWFsIGluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgICAgKiAgQHBhcmFtIF9faGYgIEEgaGFzaCBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2VxbCAgQSBrZXkgZXF1YWxpdHkgZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYW4gJXVub3JkZXJlZF9zZXQgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAgICAqICBbX19maXJzdCxfX2xhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiAod2hlcmUgTiBpcworICAgICAgICogIGRpc3RhbmNlKF9fZmlyc3QsX19sYXN0KSkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXVub3JkZXJlZF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCSAgICAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX2goX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKwl7IH0KKworICAgICAgLy8vIENvcHkgY29uc3RydWN0b3IuCisgICAgICB1bm9yZGVyZWRfc2V0KGNvbnN0IHVub3JkZXJlZF9zZXQmKSA9IGRlZmF1bHQ7CisKKyAgICAgIC8vLyBNb3ZlIGNvbnN0cnVjdG9yLgorICAgICAgdW5vcmRlcmVkX3NldCh1bm9yZGVyZWRfc2V0JiYpID0gZGVmYXVsdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYW4gJXVub3JkZXJlZF9zZXQgZnJvbSBhbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSBfX24gIE1pbmltYWwgaW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cy4KKyAgICAgICAqICBAcGFyYW0gX19oZiAgQSBoYXNoIGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fZXFsICBBIGtleSBlcXVhbGl0eSBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYW4gJXVub3JkZXJlZF9zZXQgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGxpc3QuIFRoaXMgaXMgbGluZWFyIGluIE4gKHdoZXJlIE4gaXMgQGEgX19sLnNpemUoKSkuCisgICAgICAgKi8KKyAgICAgIHVub3JkZXJlZF9zZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJCSAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9oKF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBDb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICB1bm9yZGVyZWRfc2V0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHVub3JkZXJlZF9zZXQmKSA9IGRlZmF1bHQ7CisKKyAgICAgIC8vLyBNb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICB1bm9yZGVyZWRfc2V0JgorICAgICAgb3BlcmF0b3I9KHVub3JkZXJlZF9zZXQmJikgPSBkZWZhdWx0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVVbm9yZGVyZWRfc2V0IGxpc3QgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhbiAldW5vcmRlcmVkX3NldCB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4KKyAgICAgICAqICB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBAYSBfX2wuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICV1bm9yZGVyZWRfc2V0IGFuZAorICAgICAgICogIHRoYXQgdGhlIHJlc3VsdGluZyAldW5vcmRlcmVkX3NldCdzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlcgorICAgICAgICogIG9mIGVsZW1lbnRzIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyAgICAgIHVub3JkZXJlZF9zZXQmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX01faCA9IF9fbDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgYWxsb2NhdG9yIG9iamVjdCB3aXRoIHdoaWNoIHRoZSAldW5vcmRlcmVkX3NldCB3YXMKKyAgICAgIC8vLyAgY29uc3RydWN0ZWQuCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICAvLyBzaXplIGFuZCBjYXBhY2l0eToKKworICAgICAgLy8vICBSZXR1cm5zIHRydWUgaWYgdGhlICV1bm9yZGVyZWRfc2V0IGlzIGVtcHR5LgorICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5lbXB0eSgpOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgJXVub3JkZXJlZF9zZXQuCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5zaXplKCk7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlICV1bm9yZGVyZWRfc2V0LgorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLm1heF9zaXplKCk7IH0KKworICAgICAgLy8gaXRlcmF0b3JzLgorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXVub3JkZXJlZF9zZXQuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guYmVnaW4oKTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAldW5vcmRlcmVkX3NldC4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmVuZCgpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5lbmQoKTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXVub3JkZXJlZF9zZXQuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5iZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICV1bm9yZGVyZWRfc2V0LgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmVuZCgpOyB9CisKKyAgICAgIC8vIG1vZGlmaWVycy4KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGJ1aWxkIGFuZCBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZQorICAgICAgICogICV1bm9yZGVyZWRfc2V0LgorICAgICAgICogIEBwYXJhbSBfX2FyZ3MgIEFyZ3VtZW50cyB1c2VkIHRvIGdlbmVyYXRlIGFuIGVsZW1lbnQuCisgICAgICAgKiAgQHJldHVybiAgQSBwYWlyLCBvZiB3aGljaCB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbiBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogICAgICAgICAgIHRvIHRoZSBwb3NzaWJseSBpbnNlcnRlZCBlbGVtZW50LCBhbmQgdGhlIHNlY29uZCBpcyBhIGJvb2wKKyAgICAgICAqICAgICAgICAgICB0aGF0IGlzIHRydWUgaWYgdGhlIGVsZW1lbnQgd2FzIGFjdHVhbGx5IGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGJ1aWxkIGFuZCBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZQorICAgICAgICogICV1bm9yZGVyZWRfc2V0LiBBbiAldW5vcmRlcmVkX3NldCByZWxpZXMgb24gdW5pcXVlIGtleXMgYW5kIHRodXMgYW4KKyAgICAgICAqICBlbGVtZW50IGlzIG9ubHkgaW5zZXJ0ZWQgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUKKyAgICAgICAqICAldW5vcmRlcmVkX3NldC4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7IHJldHVybiBfTV9oLmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgJXVub3JkZXJlZF9zZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZQorICAgICAgICogICAgICAgICAgICAgICAgZWxlbWVudCBzaG91bGQgYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX2FyZ3MgIEFyZ3VtZW50cyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBlbGVtZW50IHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZWxlbWVudCB3aXRoIGtleSBlcXVpdmFsZW50IHRvCisgICAgICAgKiAgICAgICAgICB0aGUgb25lIGdlbmVyYXRlZCBmcm9tIEBhIF9fYXJncyAobWF5IG9yIG1heSBub3QgYmUgdGhlCisgICAgICAgKiAgICAgICAgICBlbGVtZW50IGl0c2VsZikuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgbm90IGNvbmNlcm5lZCBhYm91dCB3aGV0aGVyIHRoZSBpbnNlcnRpb24gdG9vayBwbGFjZSwKKyAgICAgICAqICBhbmQgdGh1cyBkb2VzIG5vdCByZXR1cm4gYSBib29sZWFuIGxpa2UgdGhlIHNpbmdsZS1hcmd1bWVudCBlbXBsYWNlKCkKKyAgICAgICAqICBkb2VzLiAgTm90ZSB0aGF0IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgb25seSBhIGhpbnQgYW5kIGNhbgorICAgICAgICogIHBvdGVudGlhbGx5IGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBpbnNlcnRpb24gcHJvY2Vzcy4gIEEgYmFkCisgICAgICAgKiAgaGludCB3b3VsZCBjYXVzZSBubyBnYWlucyBpbiBlZmZpY2llbmN5LgorICAgICAgICoKKyAgICAgICAqICBGb3IgbW9yZSBvbiBAYSBoaW50aW5nLCBzZWU6CisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwN2NoMTcuaHRtbAorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgYW1vcnRpemVkIGNvbnN0YW50IHRpbWUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKwl7IHJldHVybiBfTV9oLmVtcGxhY2VfaGludChfX3Bvcywgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgJXVub3JkZXJlZF9zZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEVsZW1lbnQgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiAgQSBwYWlyLCBvZiB3aGljaCB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbiBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogICAgICAgICAgIHRvIHRoZSBwb3NzaWJseSBpbnNlcnRlZCBlbGVtZW50LCBhbmQgdGhlIHNlY29uZCBpcyBhIGJvb2wKKyAgICAgICAqICAgICAgICAgICB0aGF0IGlzIHRydWUgaWYgdGhlIGVsZW1lbnQgd2FzIGFjdHVhbGx5IGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGluc2VydCBhbiBlbGVtZW50IGludG8gdGhlICV1bm9yZGVyZWRfc2V0LgorICAgICAgICogIEFuICV1bm9yZGVyZWRfc2V0IHJlbGllcyBvbiB1bmlxdWUga2V5cyBhbmQgdGh1cyBhbiBlbGVtZW50IGlzIG9ubHkKKyAgICAgICAqICBpbnNlcnRlZCBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSAldW5vcmRlcmVkX3NldC4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01faC5pbnNlcnQoX194KTsgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guaW5zZXJ0KHN0ZDo6bW92ZShfX3gpKTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgJXVub3JkZXJlZF9zZXQuCisgICAgICAgKiAgQHBhcmFtICBfX2hpbnQgIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUKKyAgICAgICAqICAgICAgICAgICAgICAgICBlbGVtZW50IHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRWxlbWVudCB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBlbGVtZW50IHdpdGgga2V5IG9mCisgICAgICAgKiAgICAgICAgICAgQGEgX194IChtYXkgb3IgbWF5IG5vdCBiZSB0aGUgZWxlbWVudCBwYXNzZWQgaW4pLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjb25jZXJuZWQgYWJvdXQgd2hldGhlciB0aGUgaW5zZXJ0aW9uIHRvb2sgcGxhY2UsCisgICAgICAgKiAgYW5kIHRodXMgZG9lcyBub3QgcmV0dXJuIGEgYm9vbGVhbiBsaWtlIHRoZSBzaW5nbGUtYXJndW1lbnQgaW5zZXJ0KCkKKyAgICAgICAqICBkb2VzLiAgTm90ZSB0aGF0IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgb25seSBhIGhpbnQgYW5kIGNhbgorICAgICAgICogIHBvdGVudGlhbGx5IGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBpbnNlcnRpb24gcHJvY2Vzcy4gIEEgYmFkCisgICAgICAgKiAgaGludCB3b3VsZCBjYXVzZSBubyBnYWlucyBpbiBlZmZpY2llbmN5LgorICAgICAgICoKKyAgICAgICAqICBGb3IgbW9yZSBvbiBAYSBoaW50aW5nLCBzZWU6CisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwN2NoMTcuaHRtbAorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgYW1vcnRpemVkIGNvbnN0YW50LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01faC5pbnNlcnQoX19oaW50LCBfX3gpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyByZXR1cm4gX01faC5pbnNlcnQoX19oaW50LCBzdGQ6Om1vdmUoX194KSk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEEgdGVtcGxhdGUgZnVuY3Rpb24gdGhhdCBhdHRlbXB0cyB0byBpbnNlcnQgYSByYW5nZSBvZgorICAgICAgICogIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXZvaWQKKwlpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorCXsgX01faC5pbnNlcnQoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGEgbGlzdCBvZiBlbGVtZW50cyBpbnRvIHRoZSAldW5vcmRlcmVkX3NldC4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQSBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gb2YgZWxlbWVudHMKKyAgICAgICAqICAgICAgICAgICAgICAgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSByYW5nZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyBfTV9oLmluc2VydChfX2wpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYW4gZWxlbWVudCBmcm9tIGFuICV1bm9yZGVyZWRfc2V0LgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nCisgICAgICAgKiAgICAgICAgICBAYSBfX3Bvc2l0aW9uIHByaW9yIHRvIHRoZSBlbGVtZW50IGJlaW5nIGVyYXNlZC4gSWYgbm8gc3VjaAorICAgICAgICogICAgICAgICAgZWxlbWVudCBleGlzdHMsIGVuZCgpIGlzIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbiBlbGVtZW50LCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpdGVyYXRvciwKKyAgICAgICAqICBmcm9tIGFuICV1bm9yZGVyZWRfc2V0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlCisgICAgICAgKiAgZWxlbWVudCwgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8KKyAgICAgICAqICBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9fcG9zaXRpb24pOyB9CisKKyAgICAgIC8vIExXRyAyMDU5LgorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9faXQpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYWxsIHRoZSBlbGVtZW50cyBsb2NhdGVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQorICAgICAgICogIGFuICV1bm9yZGVyZWRfc2V0LiBGb3IgYW4gJXVub3JkZXJlZF9zZXQgdGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uCisgICAgICAgKiAgY2FuIG9ubHkgYmUgMCAobm90IHByZXNlbnQpIG9yIDEgKHByZXNlbnQpLgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZgorICAgICAgICogIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZAorICAgICAgICogIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhIFtfX2ZpcnN0LF9fbGFzdCkgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhbgorICAgICAgICogICV1bm9yZGVyZWRfc2V0LgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICBlcmFzZWQuCisgICAgICAgKiAgQHBhcmFtIF9fbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UgdG8KKyAgICAgICAqICAgICAgICAgICAgICAgIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIFRoZSBpdGVyYXRvciBAYSBfX2xhc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZnJvbSBhbiAldW5vcmRlcmVkX3NldC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBFcmFzZXMgYWxsIGVsZW1lbnRzIGluIGFuICV1bm9yZGVyZWRfc2V0LiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5CisgICAgICAgKiAgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLAorICAgICAgICogIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiBNYW5hZ2luZyB0aGUgcG9pbnRlcgorICAgICAgICogIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgbm9leGNlcHQKKyAgICAgIHsgX01faC5jbGVhcigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3dhcHMgZGF0YSB3aXRoIGFub3RoZXIgJXVub3JkZXJlZF9zZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEFuICV1bm9yZGVyZWRfc2V0IG9mIHRoZSBzYW1lIGVsZW1lbnQgYW5kIGFsbG9jYXRvcgorICAgICAgICogIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGV4Y2hhbmdlcyB0aGUgZWxlbWVudHMgYmV0d2VlbiB0d28gc2V0cyBpbiBjb25zdGFudCB0aW1lLgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzIHNwZWNpYWxpemVkIHN1Y2ggdGhhdAorICAgICAgICogIHN0ZDo6c3dhcChzMSxzMikgd2lsbCBmZWVkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodW5vcmRlcmVkX3NldCYgX194KQorICAgICAgeyBfTV9oLnN3YXAoX194Ll9NX2gpOyB9CisKKyAgICAgIC8vIG9ic2VydmVycy4KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBoYXNoIGZ1bmN0b3Igb2JqZWN0IHdpdGggd2hpY2ggdGhlICV1bm9yZGVyZWRfc2V0IHdhcworICAgICAgLy8vICBjb25zdHJ1Y3RlZC4KKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdGlvbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmhhc2hfZnVuY3Rpb24oKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIGtleSBjb21wYXJpc29uIG9iamVjdCB3aXRoIHdoaWNoIHRoZSAldW5vcmRlcmVkX3NldCB3YXMKKyAgICAgIC8vLyAgY29uc3RydWN0ZWQuCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmtleV9lcSgpOyB9CisKKyAgICAgIC8vIGxvb2t1cC4KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRyaWVzIHRvIGxvY2F0ZSBhbiBlbGVtZW50IGluIGFuICV1bm9yZGVyZWRfc2V0LgorICAgICAgICogIEBwYXJhbSAgX194ICBFbGVtZW50IHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gc291Z2h0LWFmdGVyIGVsZW1lbnQsIG9yIGVuZCgpIGlmIG5vdAorICAgICAgICogICAgICAgICAgIGZvdW5kLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEga2V5IGFuZCB0cmllcyB0byBsb2NhdGUgdGhlIGVsZW1lbnQgd2l0aCB3aGljaAorICAgICAgICogIHRoZSBrZXkgbWF0Y2hlcy4gIElmIHN1Y2Nlc3NmdWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaXRlcmF0b3IKKyAgICAgICAqICBwb2ludGluZyB0byB0aGUgc291Z2h0IGFmdGVyIGVsZW1lbnQuICBJZiB1bnN1Y2Nlc3NmdWwgaXQgcmV0dXJucyB0aGUKKyAgICAgICAqICBwYXN0LXRoZS1lbmQgKCBAYyBlbmQoKSApIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01faC5maW5kKF9feCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guZmluZChfX3gpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZHMgdGhlIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRWxlbWVudCB0byBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIE51bWJlciBvZiBlbGVtZW50cyB3aXRoIHNwZWNpZmllZCBrZXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gb25seSBtYWtlcyBzZW5zZSBmb3IgdW5vcmRlcmVkX211bHRpc2V0czsgZm9yCisgICAgICAgKiAgdW5vcmRlcmVkX3NldCB0aGUgcmVzdWx0IHdpbGwgZWl0aGVyIGJlIDAgKG5vdCBwcmVzZW50KSBvciAxCisgICAgICAgKiAgKHByZXNlbnQpLgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmNvdW50KF9feCk7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBQYWlyIG9mIGl0ZXJhdG9ycyB0aGF0IHBvc3NpYmx5IHBvaW50cyB0byB0aGUgc3Vic2VxdWVuY2UKKyAgICAgICAqICAgICAgICAgICBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvYmFibHkgb25seSBtYWtlcyBzZW5zZSBmb3IgbXVsdGlzZXRzLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZXF1YWxfcmFuZ2UoX194KTsgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guZXF1YWxfcmFuZ2UoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvLyBidWNrZXQgaW50ZXJmYWNlLgorCisgICAgICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgb2YgdGhlICV1bm9yZGVyZWRfc2V0LgorICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfY291bnQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5idWNrZXRfY291bnQoKTsgfQorCisgICAgICAvLy8gUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnVja2V0cyBvZiB0aGUgJXVub3JkZXJlZF9zZXQuCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgLyoKKyAgICAgICAqIEBicmllZiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgZ2l2ZW4gYnVja2V0LgorICAgICAgICogQHBhcmFtICBfX24gIEEgYnVja2V0IGluZGV4LgorICAgICAgICogQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYnVja2V0LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmJ1Y2tldF9zaXplKF9fbik7IH0KKworICAgICAgLyoKKyAgICAgICAqIEBicmllZiAgUmV0dXJucyB0aGUgYnVja2V0IGluZGV4IG9mIGEgZ2l2ZW4gZWxlbWVudC4KKyAgICAgICAqIEBwYXJhbSAgX19rZXkgIEEga2V5IGluc3RhbmNlLgorICAgICAgICogQHJldHVybiAgVGhlIGtleSBidWNrZXQgaW5kZXguCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guYnVja2V0KF9fa2V5KTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QKKyAgICAgICAqICAgICAgICAgYnVja2V0IGVsZW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBfX24gVGhlIGJ1Y2tldCBpbmRleC4KKyAgICAgICAqICBAcmV0dXJuICBBIHJlYWQtb25seSBsb2NhbCBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX24pCisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKF9fbik7IH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKF9fbik7IH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGNiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5jYmVnaW4oX19uKTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdAorICAgICAgICogICAgICAgICB0aGUgbGFzdCBidWNrZXQgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX24gVGhlIGJ1Y2tldCBpbmRleC4KKyAgICAgICAqICBAcmV0dXJuICBBIHJlYWQtb25seSBsb2NhbCBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgbG9jYWxfaXRlcmF0b3IKKyAgICAgIGVuZChzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gX01faC5lbmQoX19uKTsgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmVuZChfX24pOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmNlbmQoX19uKTsgfQorICAgICAgLy9AfQorCisgICAgICAvLyBoYXNoIHBvbGljeS4KKworICAgICAgLy8vIFJldHVybnMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGVsZW1lbnRzIHBlciBidWNrZXQuCisgICAgICBmbG9hdAorICAgICAgbG9hZF9mYWN0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5sb2FkX2ZhY3RvcigpOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIGEgcG9zaXRpdmUgbnVtYmVyIHRoYXQgdGhlICV1bm9yZGVyZWRfc2V0IHRyaWVzIHRvIGtlZXAgdGhlCisgICAgICAvLy8gbG9hZCBmYWN0b3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvLgorICAgICAgZmxvYXQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLm1heF9sb2FkX2ZhY3RvcigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2hhbmdlIHRoZSAldW5vcmRlcmVkX3NldCBtYXhpbXVtIGxvYWQgZmFjdG9yLgorICAgICAgICogIEBwYXJhbSAgX196IFRoZSBuZXcgbWF4aW11bSBsb2FkIGZhY3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9feikKKyAgICAgIHsgX01faC5tYXhfbG9hZF9mYWN0b3IoX196KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1heSByZWhhc2ggdGhlICV1bm9yZGVyZWRfc2V0LgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBuZXcgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgICAgKgorICAgICAgICogIFJlaGFzaCB3aWxsIG9jY3VyIG9ubHkgaWYgdGhlIG5ldyBudW1iZXIgb2YgYnVja2V0cyByZXNwZWN0IHRoZQorICAgICAgICogICV1bm9yZGVyZWRfc2V0IG1heGltdW0gbG9hZCBmYWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlaGFzaChzaXplX3R5cGUgX19uKQorICAgICAgeyBfTV9oLnJlaGFzaChfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJlcGFyZSB0aGUgJXVub3JkZXJlZF9zZXQgZm9yIGEgc3BlY2lmaWVkIG51bWJlciBvZgorICAgICAgICogICAgICAgICAgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX24gTnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVpcmVkLgorICAgICAgICoKKyAgICAgICAqICBTYW1lIGFzIHJlaGFzaChjZWlsKG4gLyBtYXhfbG9hZF9mYWN0b3IoKSkpLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNlcnZlKHNpemVfdHlwZSBfX24pCisgICAgICB7IF9NX2gucmVzZXJ2ZShfX24pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZTEsIHR5cGVuYW1lIF9IYXNoMSwgdHlwZW5hbWUgX1ByZWQxLAorCSAgICAgICB0eXBlbmFtZSBfQWxsb2MxPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZTEsIF9IYXNoMSwgX1ByZWQxLCBfQWxsb2MxPiYsCisJCSBjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZTEsIF9IYXNoMSwgX1ByZWQxLCBfQWxsb2MxPiYpOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgY29tcG9zZWQgb2YgZXF1aXZhbGVudCBrZXlzCisgICAqICAocG9zc2libHkgY29udGFpbmluZyBtdWx0aXBsZSBvZiBlYWNoIGtleSB2YWx1ZSkgaW4gd2hpY2ggdGhlCisgICAqICBlbGVtZW50cycga2V5cyBhcmUgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgQHRwYXJhbSAgX1ZhbHVlICBUeXBlIG9mIGtleSBvYmplY3RzLgorICAgKiAgQHRwYXJhbSAgX0hhc2ggIEhhc2hpbmcgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGhhc2g8X1ZhbHVlPi4KKyAgICogIEB0cGFyYW0gIF9QcmVkICBQcmVkaWNhdGUgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzCisgICAqICAgICAgICAgICAgICAgICAgdG8gZXF1YWxfdG88X1ZhbHVlPi4KKyAgICogIEB0cGFyYW0gIF9BbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxfS2V5Pi4KKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYW5kCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCN4eCI+dW5vcmRlcmVkIGFzc29jaWF0aXZlIGNvbnRhaW5lcjwvYT4KKyAgICoKKyAgICogIEJhc2UgaXMgX0hhc2h0YWJsZSwgZGlzcGF0Y2hlZCBhdCBjb21waWxlIHRpbWUgdmlhIHRlbXBsYXRlCisgICAqICBhbGlhcyBfX3Vtc2V0X2hhc2h0YWJsZS4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X1ZhbHVlPiwKKwkgICBjbGFzcyBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X1ZhbHVlPiwKKwkgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVmFsdWU+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfbXVsdGlzZXQgOiBfX2NoZWNrX2NvcHlfY29uc3RydWN0aWJsZTxfQWxsb2M+CisgICAgeworICAgICAgdHlwZWRlZiBfX3Vtc2V0X2hhc2h0YWJsZTxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0hhc2h0YWJsZTsKKyAgICAgIF9IYXNodGFibGUgX01faDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVkZWZzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6a2V5X3R5cGUJa2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OnZhbHVlX3R5cGUJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6aGFzaGVyCWhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6a2V5X2VxdWFsCWtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8vLyAgSXRlcmF0b3ItcmVsYXRlZCB0eXBlZGVmcy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnBvaW50ZXIJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpjb25zdF9wb2ludGVyCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpyZWZlcmVuY2UJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcmVmZXJlbmNlCWNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6aXRlcmF0b3IJCWl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjpjb25zdF9pdGVyYXRvcgljb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6bG9jYWxfaXRlcmF0b3IJbG9jYWxfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmNvbnN0X2xvY2FsX2l0ZXJhdG9yCWNvbnN0X2xvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjpzaXplX3R5cGUJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6ZGlmZmVyZW5jZV90eXBlCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy8gY29uc3RydWN0L2Rlc3Ryb3kvY29weQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgSW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cy4KKyAgICAgICAqICBAcGFyYW0gX19oZiAgQSBoYXNoIGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fZXFsICBBIGtleSBlcXVhbGl0eSBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkJIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01faChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYW4gJXVub3JkZXJlZF9tdWx0aXNldCBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTWluaW1hbCBpbml0aWFsIG51bWJlciBvZiBidWNrZXRzLgorICAgICAgICogIEBwYXJhbSBfX2hmICBBIGhhc2ggZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19lcWwgIEEga2V5IGVxdWFsaXR5IGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGFuICV1bm9yZGVyZWRfbXVsdGlzZXQgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgZnJvbSBbX19maXJzdCxfX2xhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiAod2hlcmUgTiBpcworICAgICAgICogIGRpc3RhbmNlKF9fZmlyc3QsX19sYXN0KSkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXVub3JkZXJlZF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJCSAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkJICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX2goX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKwl7IH0KKworICAgICAgLy8vIENvcHkgY29uc3RydWN0b3IuCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoY29uc3QgdW5vcmRlcmVkX211bHRpc2V0JikgPSBkZWZhdWx0OworCisgICAgICAvLy8gTW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldCh1bm9yZGVyZWRfbXVsdGlzZXQmJikgPSBkZWZhdWx0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhbiAldW5vcmRlcmVkX211bHRpc2V0IGZyb20gYW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gX19uICBNaW5pbWFsIGluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgICAgKiAgQHBhcmFtIF9faGYgIEEgaGFzaCBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2VxbCAgQSBrZXkgZXF1YWxpdHkgZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGFuICV1bm9yZGVyZWRfbXVsdGlzZXQgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluCisgICAgICAgKiAgdGhlIGxpc3QuIFRoaXMgaXMgbGluZWFyIGluIE4gKHdoZXJlIE4gaXMgQGEgX19sLnNpemUoKSkuCisgICAgICAgKi8KKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJCSBzaXplX3R5cGUgX19uID0gMCwKKwkJCSBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9oKF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBDb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX211bHRpc2V0JikgPSBkZWZhdWx0OworCisgICAgICAvLy8gTW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgdW5vcmRlcmVkX211bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KHVub3JkZXJlZF9tdWx0aXNldCYmIF9feCkgPSBkZWZhdWx0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVVbm9yZGVyZWRfbXVsdGlzZXQgbGlzdCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGFuICV1bm9yZGVyZWRfbXVsdGlzZXQgd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgaW4gdGhlIGluaXRpYWxpemVyIGxpc3QgQGEgX19sLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAldW5vcmRlcmVkX211bHRpc2V0CisgICAgICAgKiAgYW5kIHRoYXQgdGhlIHJlc3VsdGluZyAldW5vcmRlcmVkX3NldCdzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlcgorICAgICAgICogIG9mIGVsZW1lbnRzIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwlfTV9oID0gX19sOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBhbGxvY2F0b3Igb2JqZWN0IHdpdGggd2hpY2ggdGhlICV1bm9yZGVyZWRfbXVsdGlzZXQgd2FzCisgICAgICAvLy8gIGNvbnN0cnVjdGVkLgorICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgLy8gc2l6ZSBhbmQgY2FwYWNpdHk6CisKKyAgICAgIC8vLyAgUmV0dXJucyB0cnVlIGlmIHRoZSAldW5vcmRlcmVkX211bHRpc2V0IGlzIGVtcHR5LgorICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5lbXB0eSgpOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgJXVub3JkZXJlZF9tdWx0aXNldC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLnNpemUoKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgJXVub3JkZXJlZF9tdWx0aXNldC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8vIGl0ZXJhdG9ycy4KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guYmVnaW4oKTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZW5kKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmVuZCgpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmVuZCgpOyB9CisKKyAgICAgIC8vIG1vZGlmaWVycy4KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEJ1aWxkcyBhbmQgaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgJXVub3JkZXJlZF9tdWx0aXNldC4KKyAgICAgICAqICBAcGFyYW0gX19hcmdzICBBcmd1bWVudHMgdXNlZCB0byBnZW5lcmF0ZSBhbiBlbGVtZW50LgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgYW1vcnRpemVkIGNvbnN0YW50IHRpbWUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7IHJldHVybiBfTV9oLmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSW5zZXJ0cyBhbiBlbGVtZW50IGludG8gdGhlICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZQorICAgICAgICogICAgICAgICAgICAgICAgZWxlbWVudCBzaG91bGQgYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX2FyZ3MgIEFyZ3VtZW50cyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBlbGVtZW50IHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgb25seSBhIGhpbnQgYW5kIGNhbiBwb3RlbnRpYWxseQorICAgICAgICogIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBpbnNlcnRpb24gcHJvY2Vzcy4gIEEgYmFkIGhpbnQgd291bGQKKyAgICAgICAqICBjYXVzZSBubyBnYWlucyBpbiBlZmZpY2llbmN5LgorICAgICAgICoKKyAgICAgICAqICBGb3IgbW9yZSBvbiBAYSBoaW50aW5nLCBzZWU6CisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwN2NoMTcuaHRtbAorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgYW1vcnRpemVkIGNvbnN0YW50IHRpbWUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKwl7IHJldHVybiBfTV9oLmVtcGxhY2VfaGludChfX3Bvcywgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSW5zZXJ0cyBhbiBlbGVtZW50IGludG8gdGhlICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEVsZW1lbnQgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBhbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmluc2VydChfX3gpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guaW5zZXJ0KHN0ZDo6bW92ZShfX3gpKTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSW5zZXJ0cyBhbiBlbGVtZW50IGludG8gdGhlICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX2hpbnQgIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUKKyAgICAgICAqICAgICAgICAgICAgICAgICBlbGVtZW50IHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRWxlbWVudCB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBvbmx5IGEgaGludCBhbmQgY2FuIHBvdGVudGlhbGx5CisgICAgICAgKiAgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGluc2VydGlvbiBwcm9jZXNzLiAgQSBiYWQgaGludCB3b3VsZAorICAgICAgICogIGNhdXNlIG5vIGdhaW5zIGluIGVmZmljaWVuY3kuCisgICAgICAgKgorICAgICAgICogIEZvciBtb3JlIG9uIEBhIGhpbnRpbmcsIHNlZToKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBhbW9ydGl6ZWQgY29uc3RhbnQuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmluc2VydChfX2hpbnQsIF9feCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmluc2VydChfX2hpbnQsIHN0ZDo6bW92ZShfX3gpKTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQSB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGluc2VydHMgYSByYW5nZSBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZS4KKyAgICAgICAqCisgICAgICAgKiAgQ29tcGxleGl0eSBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIHJhbmdlIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl2b2lkCisJaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwl7IF9NX2guaW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEluc2VydHMgYSBsaXN0IG9mIGVsZW1lbnRzIGludG8gdGhlICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEEgc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IG9mIGVsZW1lbnRzIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSByYW5nZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyBfTV9oLmluc2VydChfX2wpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYW4gZWxlbWVudCBmcm9tIGFuICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCBpbW1lZGlhdGVseSBmb2xsb3dpbmcKKyAgICAgICAqICAgICAgICAgIEBhIF9fcG9zaXRpb24gcHJpb3IgdG8gdGhlIGVsZW1lbnQgYmVpbmcgZXJhc2VkLiBJZiBubyBzdWNoCisgICAgICAgKiAgICAgICAgICBlbGVtZW50IGV4aXN0cywgZW5kKCkgaXMgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFuIGVsZW1lbnQsIHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIGl0ZXJhdG9yLAorICAgICAgICogIGZyb20gYW4gJXVub3JkZXJlZF9tdWx0aXNldC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmIHRoZQorICAgICAgICogIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluCisgICAgICAgKiAgYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gX01faC5lcmFzZShfX3Bvc2l0aW9uKTsgfQorCisgICAgICAvLyBMV0cgMjA1OS4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyByZXR1cm4gX01faC5lcmFzZShfX2l0KTsgfQorICAgICAgLy9AfQorCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYWxsIHRoZSBlbGVtZW50cyBsb2NhdGVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQorICAgICAgICogIGFuICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZiB0aGUKKyAgICAgICAqICBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbgorICAgICAgICogIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhIFtfX2ZpcnN0LF9fbGFzdCkgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhbgorICAgICAgICogICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gX19sYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZSB0bworICAgICAgICogICAgICAgICAgICAgICAgYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gVGhlIGl0ZXJhdG9yIEBhIF9fbGFzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBmcm9tIGFuCisgICAgICAgKiAgJXVub3JkZXJlZF9tdWx0aXNldC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgRXJhc2VzIGFsbCBlbGVtZW50cyBpbiBhbiAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZQorICAgICAgICogIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIG5vZXhjZXB0CisgICAgICB7IF9NX2guY2xlYXIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXBzIGRhdGEgd2l0aCBhbm90aGVyICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEFuICV1bm9yZGVyZWRfbXVsdGlzZXQgb2YgdGhlIHNhbWUgZWxlbWVudCBhbmQgYWxsb2NhdG9yCisgICAgICAgKiAgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZXhjaGFuZ2VzIHRoZSBlbGVtZW50cyBiZXR3ZWVuIHR3byBzZXRzIGluIGNvbnN0YW50IHRpbWUuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBnbG9iYWwgc3RkOjpzd2FwKCkgZnVuY3Rpb24gaXMgc3BlY2lhbGl6ZWQgc3VjaCB0aGF0CisgICAgICAgKiAgc3RkOjpzd2FwKHMxLHMyKSB3aWxsIGZlZWQgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGlzZXQmIF9feCkKKyAgICAgIHsgX01faC5zd2FwKF9feC5fTV9oKTsgfQorCisgICAgICAvLyBvYnNlcnZlcnMuCisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgaGFzaCBmdW5jdG9yIG9iamVjdCB3aXRoIHdoaWNoIHRoZSAldW5vcmRlcmVkX211bHRpc2V0CisgICAgICAvLy8gIHdhcyBjb25zdHJ1Y3RlZC4KKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdGlvbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmhhc2hfZnVuY3Rpb24oKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIGtleSBjb21wYXJpc29uIG9iamVjdCB3aXRoIHdoaWNoIHRoZSAldW5vcmRlcmVkX211bHRpc2V0CisgICAgICAvLy8gIHdhcyBjb25zdHJ1Y3RlZC4KKyAgICAgIGtleV9lcXVhbAorICAgICAga2V5X2VxKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gua2V5X2VxKCk7IH0KKworICAgICAgLy8gbG9va3VwLgorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVHJpZXMgdG8gbG9jYXRlIGFuIGVsZW1lbnQgaW4gYW4gJXVub3JkZXJlZF9tdWx0aXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRWxlbWVudCB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHNvdWdodC1hZnRlciBlbGVtZW50LCBvciBlbmQoKSBpZiBub3QKKyAgICAgICAqICAgICAgICAgICBmb3VuZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGtleSBhbmQgdHJpZXMgdG8gbG9jYXRlIHRoZSBlbGVtZW50IHdpdGggd2hpY2gKKyAgICAgICAqICB0aGUga2V5IG1hdGNoZXMuICBJZiBzdWNjZXNzZnVsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGl0ZXJhdG9yCisgICAgICAgKiAgcG9pbnRpbmcgdG8gdGhlIHNvdWdodCBhZnRlciBlbGVtZW50LiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgdGhlCisgICAgICAgKiAgcGFzdC10aGUtZW5kICggQGMgZW5kKCkgKSBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZmluZChfX3gpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmZpbmQoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEVsZW1lbnQgdG8gbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBOdW1iZXIgb2YgZWxlbWVudHMgd2l0aCBzcGVjaWZpZWQga2V5LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmNvdW50KF9feCk7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBQYWlyIG9mIGl0ZXJhdG9ycyB0aGF0IHBvc3NpYmx5IHBvaW50cyB0byB0aGUgc3Vic2VxdWVuY2UKKyAgICAgICAqICAgICAgICAgICBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKi8KKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01faC5lcXVhbF9yYW5nZShfX3gpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5lcXVhbF9yYW5nZShfX3gpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vIGJ1Y2tldCBpbnRlcmZhY2UuCisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnVja2V0cyBvZiB0aGUgJXVub3JkZXJlZF9tdWx0aXNldC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1Y2tldHMgb2YgdGhlICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgLyoKKyAgICAgICAqIEBicmllZiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgZ2l2ZW4gYnVja2V0LgorICAgICAgICogQHBhcmFtICBfX24gIEEgYnVja2V0IGluZGV4LgorICAgICAgICogQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYnVja2V0LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmJ1Y2tldF9zaXplKF9fbik7IH0KKworICAgICAgLyoKKyAgICAgICAqIEBicmllZiAgUmV0dXJucyB0aGUgYnVja2V0IGluZGV4IG9mIGEgZ2l2ZW4gZWxlbWVudC4KKyAgICAgICAqIEBwYXJhbSAgX19rZXkgIEEga2V5IGluc3RhbmNlLgorICAgICAgICogQHJldHVybiAgVGhlIGtleSBidWNrZXQgaW5kZXguCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guYnVja2V0KF9fa2V5KTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QKKyAgICAgICAqICAgICAgICAgYnVja2V0IGVsZW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBfX24gVGhlIGJ1Y2tldCBpbmRleC4KKyAgICAgICAqICBAcmV0dXJuICBBIHJlYWQtb25seSBsb2NhbCBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX24pCisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKF9fbik7IH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKF9fbik7IH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGNiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5jYmVnaW4oX19uKTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdAorICAgICAgICogICAgICAgICB0aGUgbGFzdCBidWNrZXQgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX24gVGhlIGJ1Y2tldCBpbmRleC4KKyAgICAgICAqICBAcmV0dXJuICBBIHJlYWQtb25seSBsb2NhbCBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgbG9jYWxfaXRlcmF0b3IKKyAgICAgIGVuZChzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gX01faC5lbmQoX19uKTsgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmVuZChfX24pOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmNlbmQoX19uKTsgfQorICAgICAgLy9AfQorCisgICAgICAvLyBoYXNoIHBvbGljeS4KKworICAgICAgLy8vIFJldHVybnMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGVsZW1lbnRzIHBlciBidWNrZXQuCisgICAgICBmbG9hdAorICAgICAgbG9hZF9mYWN0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5sb2FkX2ZhY3RvcigpOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIGEgcG9zaXRpdmUgbnVtYmVyIHRoYXQgdGhlICV1bm9yZGVyZWRfbXVsdGlzZXQgdHJpZXMgdG8ga2VlcCB0aGUKKyAgICAgIC8vLyBsb2FkIGZhY3RvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8uCisgICAgICBmbG9hdAorICAgICAgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2gubWF4X2xvYWRfZmFjdG9yKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDaGFuZ2UgdGhlICV1bm9yZGVyZWRfbXVsdGlzZXQgbWF4aW11bSBsb2FkIGZhY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feiBUaGUgbmV3IG1heGltdW0gbG9hZCBmYWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX3opCisgICAgICB7IF9NX2gubWF4X2xvYWRfZmFjdG9yKF9feik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNYXkgcmVoYXNoIHRoZSAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBuZXcgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgICAgKgorICAgICAgICogIFJlaGFzaCB3aWxsIG9jY3VyIG9ubHkgaWYgdGhlIG5ldyBudW1iZXIgb2YgYnVja2V0cyByZXNwZWN0IHRoZQorICAgICAgICogICV1bm9yZGVyZWRfbXVsdGlzZXQgbWF4aW11bSBsb2FkIGZhY3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVoYXNoKHNpemVfdHlwZSBfX24pCisgICAgICB7IF9NX2gucmVoYXNoKF9fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQcmVwYXJlIHRoZSAldW5vcmRlcmVkX211bHRpc2V0IGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YKKyAgICAgICAqICAgICAgICAgIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uIE51bWJlciBvZiBlbGVtZW50cyByZXF1aXJlZC4KKyAgICAgICAqCisgICAgICAgKiAgU2FtZSBhcyByZWhhc2goY2VpbChuIC8gbWF4X2xvYWRfZmFjdG9yKCkpKS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXJ2ZShzaXplX3R5cGUgX19uKQorICAgICAgeyBfTV9oLnJlc2VydmUoX19uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUxLCB0eXBlbmFtZSBfSGFzaDEsIHR5cGVuYW1lIF9QcmVkMSwKKwkgICAgICAgdHlwZW5hbWUgX0FsbG9jMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZTEsIF9IYXNoMSwgX1ByZWQxLCBfQWxsb2MxPiYsCisJCSBjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlMSwgX0hhc2gxLCBfUHJlZDEsIF9BbGxvYzE+Jik7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2guX01fZXF1YWwoX195Ll9NX2gpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01faC5fTV9lcXVhbChfX3kuX01faCk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfVU5PUkRFUkVEX1NFVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdXNlc19hbGxvY2F0b3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy91c2VzX2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OTEzZTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdXNlc19hbGxvY2F0b3IuaApAQCAtMCwwICsxLDEwOSBAQAorLy8gVXNlcy1hbGxvY2F0b3IgQ29uc3RydWN0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyNpZm5kZWYgX1VTRVNfQUxMT0NBVE9SX0gKKyNkZWZpbmUgX1VTRVNfQUxMT0NBVE9SX0ggMQorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8vIFthbGxvY2F0b3IudGFnXQorICBzdHJ1Y3QgYWxsb2NhdG9yX2FyZ190IHsgfTsKKworICBjb25zdGV4cHIgYWxsb2NhdG9yX2FyZ190IGFsbG9jYXRvcl9hcmcgPSBhbGxvY2F0b3JfYXJnX3QoKTsKKworX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFKGFsbG9jYXRvcl90eXBlKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIGJvb2wgPSBfX2hhc19hbGxvY2F0b3JfdHlwZTxfVHA+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX191c2VzX2FsbG9jYXRvcl9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX191c2VzX2FsbG9jYXRvcl9oZWxwZXI8X1RwLCBfQWxsb2MsIHRydWU+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfY29udmVydGlibGU8X0FsbG9jLAorCQkJCSAgICAgdHlwZW5hbWUgX1RwOjphbGxvY2F0b3JfdHlwZT46OnZhbHVlPgorICAgIHsgfTsKKworICAvLy8gW2FsbG9jYXRvci51c2VzLnRyYWl0XQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgdXNlc19hbGxvY2F0b3IKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorCQkJICAgICAgIF9fdXNlc19hbGxvY2F0b3JfaGVscGVyPF9UcCwgX0FsbG9jPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX191c2VzX2FsbG9jYXRvcl9hcmcKKyAgICA6IGlzX2NvbnN0cnVjdGlibGU8X1RwLCBfQWxsb2MsIF9BcmdzLi4uPgorICAgIHsgc3RhdGljX2Fzc2VydCggdXNlc19hbGxvY2F0b3I8X1RwLCBfQWxsb2M+Ojp2YWx1ZSwgInVzZXMgYWxsb2NhdG9yIiApOyB9OworCisgIHN0cnVjdCBfX3VzZXNfYWxsb2NfYmFzZSB7IH07CisgIHN0cnVjdCBfX3VzZXNfYWxsb2MwIDogX191c2VzX2FsbG9jX2Jhc2UKKyAgeyBzdHJ1Y3QgX0FueXRoaW5nIHsgX0FueXRoaW5nKC4uLikgeyB9IH0gX01fYTsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBfX3VzZXNfYWxsb2MxIDogX191c2VzX2FsbG9jX2Jhc2UgeyBjb25zdCBfQWxsb2MqIF9NX2E7IH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX191c2VzX2FsbG9jMiA6IF9fdXNlc19hbGxvY19iYXNlIHsgY29uc3QgX0FsbG9jKiBfTV9hOyB9OworCisgIHRlbXBsYXRlPGJvb2wsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IF9fdXNlc19hbGxvYzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IF9fdXNlc19hbGxvYzx0cnVlLCBfVHAsIF9BbGxvYywgX0FyZ3MuLi4+CisgICAgOiBjb25kaXRpb25hbDwKKyAgICAgICAgaXNfY29uc3RydWN0aWJsZTxfVHAsIGFsbG9jYXRvcl9hcmdfdCwgX0FsbG9jLCBfQXJncy4uLj46OnZhbHVlLAorICAgICAgICBfX3VzZXNfYWxsb2MxPF9BbGxvYz4sCisgICAgICAgCV9fdXNlc19hbGxvYzI8X0FsbG9jPj46OnR5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX3VzZXNfYWxsb2M8ZmFsc2UsIF9UcCwgX0FsbG9jLCBfQXJncy4uLj4KKyAgICA6IF9fdXNlc19hbGxvYzAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX191c2VzX2FsbG9jX2ltcGwKKyAgICA6IF9fdXNlc19hbGxvYzx1c2VzX2FsbG9jYXRvcjxfVHAsIF9BbGxvYz46OnZhbHVlLCBfVHAsICBfQWxsb2MsIF9BcmdzLi4uPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgX191c2VzX2FsbG9jX2ltcGw8X1RwLCBfQWxsb2MsIF9BcmdzLi4uPgorICAgIF9fdXNlX2FsbG9jKGNvbnN0IF9BbGxvYyYgX19hKQorICAgIHsKKyAgICAgIF9fdXNlc19hbGxvY19pbXBsPF9UcCwgX0FsbG9jLCBfQXJncy4uLj4gX19yZXQ7CisgICAgICBfX3JldC5fTV9hID0gJl9fYTsKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdmFsYXJyYXlfYWZ0ZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy92YWxhcnJheV9hZnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOWRkY2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdmFsYXJyYXlfYWZ0ZXIuaApAQCAtMCwwICsxLDU1MSBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gaW50ZXJuYWwgX01ldGEgY2xhc3MuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3ZhbGFycmF5X2FmdGVyLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2YWxhcnJheX0KKyAqLworCisvLyBXcml0dGVuIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPEdhYnJpZWwuRG9zLVJlaXNAY21sYS5lbnMtY2FjaGFuLmZyPgorCisjaWZuZGVmIF9WQUxBUlJBWV9BRlRFUl9ICisjZGVmaW5lIF9WQUxBUlJBWV9BRlRFUl9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8KKyAgLy8gZ3NsaWNlX2FycmF5IGNsb3N1cmUuCisgIC8vCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgY2xhc3MgX0dCYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgCisgICAgICBfR0Jhc2UgKGNvbnN0IF9Eb20mIF9fZSwgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19pKQorICAgICAgOiBfTV9leHByIChfX2UpLCBfTV9pbmRleChfX2kpIHt9CisgICAgICAKKyAgICAgIHZhbHVlX3R5cGUKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHByW19NX2luZGV4W19faV1dOyB9CisgICAgICAKKyAgICAgIHNpemVfdAorICAgICAgc2l6ZSAoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faW5kZXguc2l6ZSgpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgY29uc3QgX0RvbSYJICAgICAgX01fZXhwcjsKKyAgICAgIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9NX2luZGV4OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9HQmFzZTxfQXJyYXk8X1RwPiA+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgICAgICAKKyAgICAgIF9HQmFzZSAoX0FycmF5PF9UcD4gX19hLCBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2kpCisgICAgICA6IF9NX2FycmF5IChfX2EpLCBfTV9pbmRleChfX2kpIHt9CisgICAgICAKKyAgICAgIHZhbHVlX3R5cGUKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9hcnJheS5fTV9kYXRhW19NX2luZGV4W19faV1dOyB9CisgICAgICAKKyAgICAgIHNpemVfdAorICAgICAgc2l6ZSAoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faW5kZXguc2l6ZSgpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgY29uc3QgX0FycmF5PF9UcD4gICAgICAgX01fYXJyYXk7CisgICAgICBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfTV9pbmRleDsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgc3RydWN0IF9HQ2xvczxfRXhwciwgX0RvbT4KKyAgICA6IF9HQmFzZTxfRG9tPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dCYXNlPF9Eb20+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgCisgICAgICBfR0Nsb3MgKGNvbnN0IF9Eb20mIF9fZSwgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19pKQorICAgICAgOiBfQmFzZSAoX19lLCBfX2kpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9HQ2xvczxfVmFsQXJyYXksIF9UcD4KKyAgICA6IF9HQmFzZTxfQXJyYXk8X1RwPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0Jhc2U8X0FycmF5PF9UcD4gPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIAorICAgICAgX0dDbG9zIChfQXJyYXk8X1RwPiBfX2EsIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSkKKyAgICAgIDogX0Jhc2UgKF9fYSwgX19pKSB7fQorICAgIH07CisKKyAgLy8KKyAgLy8gaW5kaXJlY3RfYXJyYXkgY2xvc3VyZQorICAvLworICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgIGNsYXNzIF9JQmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX0lCYXNlIChjb25zdCBfRG9tJiBfX2UsIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSkKKyAgICAgIDogX01fZXhwciAoX19lKSwgX01faW5kZXggKF9faSkge30KKyAgICAgIAorICAgICAgdmFsdWVfdHlwZQorICAgICAgb3BlcmF0b3JbXSAoc2l6ZV90IF9faSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2V4cHJbX01faW5kZXhbX19pXV07IH0KKyAgICAgIAorICAgICAgc2l6ZV90CisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2luZGV4LnNpemUoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9Eb20mCSAgICAgIF9NX2V4cHI7CisgICAgICBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfTV9pbmRleDsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgc3RydWN0IF9JQ2xvczxfRXhwciwgX0RvbT4KKyAgICA6IF9JQmFzZTxfRG9tPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0lCYXNlPF9Eb20+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgCisgICAgICBfSUNsb3MgKGNvbnN0IF9Eb20mIF9fZSwgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19pKQorICAgICAgOiBfQmFzZSAoX19lLCBfX2kpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9JQ2xvczxfVmFsQXJyYXksIF9UcD4KKyAgICA6IF9JQmFzZTx2YWxhcnJheTxfVHA+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9JQmFzZTx2YWxhcnJheTxfVHA+ID4gX0Jhc2U7CisgICAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICAgICAgCisgICAgICBfSUNsb3MgKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fYSwgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19pKQorICAgICAgOiBfQmFzZSAoX19hLCBfX2kpIHt9CisgICAgfTsKKyAgCisgIC8vCisgIC8vIGNsYXNzIF9FeHByCisgIC8vCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX0V4cHIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworICAgICAgX0V4cHIoY29uc3QgX0Nsb3MmKTsKKworICAgICAgY29uc3QgX0Nsb3MmIG9wZXJhdG9yKCkoKSBjb25zdDsKKworICAgICAgdmFsdWVfdHlwZSBvcGVyYXRvcltdKHNpemVfdCkgY29uc3Q7CisgICAgICB2YWxhcnJheTx2YWx1ZV90eXBlPiBvcGVyYXRvcltdKHNsaWNlKSBjb25zdDsKKyAgICAgIHZhbGFycmF5PHZhbHVlX3R5cGU+IG9wZXJhdG9yW10oY29uc3QgZ3NsaWNlJikgY29uc3Q7CisgICAgICB2YWxhcnJheTx2YWx1ZV90eXBlPiBvcGVyYXRvcltdKGNvbnN0IHZhbGFycmF5PGJvb2w+JikgY29uc3Q7CisgICAgICB2YWxhcnJheTx2YWx1ZV90eXBlPiBvcGVyYXRvcltdKGNvbnN0IHZhbGFycmF5PHNpemVfdD4mKSBjb25zdDsKKworICAgICAgX0V4cHI8X1VuQ2xvczxfX3VuYXJ5X3BsdXMsIHN0ZDo6X0V4cHIsIF9DbG9zPiwgdmFsdWVfdHlwZT4KKyAgICAgIG9wZXJhdG9yKygpIGNvbnN0OworCisgICAgICBfRXhwcjxfVW5DbG9zPF9fbmVnYXRlLCBzdGQ6Ol9FeHByLCBfQ2xvcz4sIHZhbHVlX3R5cGU+CisgICAgICBvcGVyYXRvci0oKSBjb25zdDsKKworICAgICAgX0V4cHI8X1VuQ2xvczxfX2JpdHdpc2Vfbm90LCBzdGQ6Ol9FeHByLCBfQ2xvcz4sIHZhbHVlX3R5cGU+CisgICAgICBvcGVyYXRvcn4oKSBjb25zdDsKKworICAgICAgX0V4cHI8X1VuQ2xvczxfX2xvZ2ljYWxfbm90LCBzdGQ6Ol9FeHByLCBfQ2xvcz4sIGJvb2w+CisgICAgICBvcGVyYXRvciEoKSBjb25zdDsKKworICAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKKyAgICAgIHZhbHVlX3R5cGUgc3VtKCkgY29uc3Q7CisKKyAgICAgIHZhbGFycmF5PHZhbHVlX3R5cGU+IHNoaWZ0KGludCkgY29uc3Q7CisgICAgICB2YWxhcnJheTx2YWx1ZV90eXBlPiBjc2hpZnQoaW50KSBjb25zdDsKKworICAgICAgdmFsdWVfdHlwZSBtaW4oKSBjb25zdDsKKyAgICAgIHZhbHVlX3R5cGUgbWF4KCkgY29uc3Q7CisKKyAgICAgIHZhbGFycmF5PHZhbHVlX3R5cGU+IGFwcGx5KHZhbHVlX3R5cGUgKCopKGNvbnN0IHZhbHVlX3R5cGUmKSkgY29uc3Q7CisgICAgICB2YWxhcnJheTx2YWx1ZV90eXBlPiBhcHBseSh2YWx1ZV90eXBlICgqKSh2YWx1ZV90eXBlKSkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgY29uc3QgX0Nsb3MgX01fY2xvc3VyZTsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lCisgICAgX0V4cHI8X0Nsb3MsIF9UcD46Ol9FeHByKGNvbnN0IF9DbG9zJiBfX2MpIDogX01fY2xvc3VyZShfX2MpIHt9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29uc3QgX0Nsb3MmCisgICAgX0V4cHI8X0Nsb3MsIF9UcD46Om9wZXJhdG9yKCkoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2Nsb3N1cmU7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6b3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2Nsb3N1cmVbX19pXTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4KKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6b3BlcmF0b3JbXShzbGljZSBfX3MpIGNvbnN0CisgICAgeworICAgICAgdmFsYXJyYXk8X1RwPiBfX3YgPSB2YWxhcnJheTxfVHA+KCp0aGlzKVtfX3NdOworICAgICAgcmV0dXJuIF9fdjsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPgorICAgIF9FeHByPF9DbG9zLCBfVHA+OjpvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYgX19ncykgY29uc3QKKyAgICB7CisgICAgICB2YWxhcnJheTxfVHA+IF9fdiA9IHZhbGFycmF5PF9UcD4oKnRoaXMpW19fZ3NdOworICAgICAgcmV0dXJuIF9fdjsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPgorICAgIF9FeHByPF9DbG9zLCBfVHA+OjpvcGVyYXRvcltdKGNvbnN0IHZhbGFycmF5PGJvb2w+JiBfX20pIGNvbnN0CisgICAgeworICAgICAgdmFsYXJyYXk8X1RwPiBfX3YgPSB2YWxhcnJheTxfVHA+KCp0aGlzKVtfX21dOworICAgICAgcmV0dXJuIF9fdjsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPgorICAgIF9FeHByPF9DbG9zLCBfVHA+OjpvcGVyYXRvcltdKGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSkgY29uc3QKKyAgICB7CisgICAgICB2YWxhcnJheTxfVHA+IF9fdiA9IHZhbGFycmF5PF9UcD4oKnRoaXMpW19faV07CisgICAgICByZXR1cm4gX192OworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzaXplX3QKKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6c2l6ZSgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fY2xvc3VyZS5zaXplKCk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+CisgICAgX0V4cHI8X0Nsb3MsIF9UcD46OnNoaWZ0KGludCBfX24pIGNvbnN0CisgICAgeworICAgICAgdmFsYXJyYXk8X1RwPiBfX3YgPSB2YWxhcnJheTxfVHA+KCp0aGlzKS5zaGlmdChfX24pOworICAgICAgcmV0dXJuIF9fdjsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPgorICAgIF9FeHByPF9DbG9zLCBfVHA+Ojpjc2hpZnQoaW50IF9fbikgY29uc3QKKyAgICB7CisgICAgICB2YWxhcnJheTxfVHA+IF9fdiA9IHZhbGFycmF5PF9UcD4oKnRoaXMpLmNzaGlmdChfX24pOworICAgICAgcmV0dXJuIF9fdjsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPgorICAgIF9FeHByPF9DbG9zLCBfVHA+OjphcHBseShfVHAgX19mKGNvbnN0IF9UcCYpKSBjb25zdAorICAgIHsKKyAgICAgIHZhbGFycmF5PF9UcD4gX192ID0gdmFsYXJyYXk8X1RwPigqdGhpcykuYXBwbHkoX19mKTsKKyAgICAgIHJldHVybiBfX3Y7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4KKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6YXBwbHkoX1RwIF9fZihfVHApKSBjb25zdAorICAgIHsKKyAgICAgIHZhbGFycmF5PF9UcD4gX192ID0gdmFsYXJyYXk8X1RwPigqdGhpcykuYXBwbHkoX19mKTsKKyAgICAgIHJldHVybiBfX3Y7CisgICAgfQorCisgIC8vIFhYWDogcmVwbGFjZSB0aGlzIHdpdGggYSBtb3JlIHJvYnVzdCBzdW1tYXRpb24gYWxnb3JpdGhtLgorICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6c3VtKCkgY29uc3QKKyAgICB7CisgICAgICBzaXplX3QgX19uID0gX01fY2xvc3VyZS5zaXplKCk7CisgICAgICBpZiAoX19uID09IDApCisJcmV0dXJuIF9UcCgpOworICAgICAgZWxzZQorCXsKKwkgIF9UcCBfX3MgPSBfTV9jbG9zdXJlWy0tX19uXTsKKwkgIHdoaWxlIChfX24gIT0gMCkKKwkgICAgX19zICs9IF9NX2Nsb3N1cmVbLS1fX25dOworCSAgcmV0dXJuIF9fczsKKyAgICAgICAgfQorICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6bWluKCkgY29uc3QKKyAgICB7IHJldHVybiBfX3ZhbGFycmF5X21pbihfTV9jbG9zdXJlKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9FeHByPF9DbG9zLCBfVHA+OjptYXgoKSBjb25zdAorICAgIHsgcmV0dXJuIF9fdmFsYXJyYXlfbWF4KF9NX2Nsb3N1cmUpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfRXhwcjxfVW5DbG9zPF9fbG9naWNhbF9ub3QsIF9FeHByLCBfRG9tPiwgYm9vbD4KKyAgICBfRXhwcjxfRG9tLCBfVHA+OjpvcGVyYXRvciEoKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgX1VuQ2xvczxfX2xvZ2ljYWxfbm90LCBzdGQ6Ol9FeHByLCBfRG9tPiBfQ2xvc3VyZTsKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgYm9vbD4oX0Nsb3N1cmUodGhpcy0+X01fY2xvc3VyZSkpOworICAgIH0KKworI2RlZmluZSBfREVGSU5FX0VYUFJfVU5BUllfT1BFUkFUT1IoX09wLCBfTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20sIHR5cGVuYW1lIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X1VuQ2xvczxfTmFtZSwgc3RkOjpfRXhwciwgX0RvbT4sIF9UcD4gICAgICAgICAgICAgICAgICAgXAorICAgIF9FeHByPF9Eb20sIF9UcD46Om9wZXJhdG9yIF9PcCgpIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgX1VuQ2xvczxfTmFtZSwgc3RkOjpfRXhwciwgX0RvbT4gX0Nsb3N1cmU7ICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVHA+KF9DbG9zdXJlKHRoaXMtPl9NX2Nsb3N1cmUpKTsgICAgICAgICAgICBcCisgICAgfQorCisgICAgX0RFRklORV9FWFBSX1VOQVJZX09QRVJBVE9SKCssIF9fdW5hcnlfcGx1cykKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfT1BFUkFUT1IoLSwgX19uZWdhdGUpCisgICAgX0RFRklORV9FWFBSX1VOQVJZX09QRVJBVE9SKH4sIF9fYml0d2lzZV9ub3QpCisKKyN1bmRlZiBfREVGSU5FX0VYUFJfVU5BUllfT1BFUkFUT1IKKworI2RlZmluZSBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKF9PcCwgX05hbWUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTxjbGFzcyBfRG9tMSwgY2xhc3MgX0RvbTI+CQkJCQlcCisgICAgaW5saW5lIF9FeHByPF9CaW5DbG9zPF9OYW1lLCBfRXhwciwgX0V4cHIsIF9Eb20xLCBfRG9tMj4sICAgICAgICAgICBcCisgICAgICAgICAgIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCB0eXBlbmFtZSBfRG9tMTo6dmFsdWVfdHlwZT46OnJlc3VsdF90eXBlPiBcCisgICAgb3BlcmF0b3IgX09wKGNvbnN0IF9FeHByPF9Eb20xLCB0eXBlbmFtZSBfRG9tMTo6dmFsdWVfdHlwZT4mIF9fdiwgICBcCisJICAgICAgICAgY29uc3QgX0V4cHI8X0RvbTIsIHR5cGVuYW1lIF9Eb20yOjp2YWx1ZV90eXBlPiYgX193KSAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTE6OnZhbHVlX3R5cGUgX0FyZzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19mdW48X05hbWUsIF9Bcmc+OjpyZXN1bHRfdHlwZSBfVmFsdWU7ICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgX0JpbkNsb3M8X05hbWUsIF9FeHByLCBfRXhwciwgX0RvbTEsIF9Eb20yPiBfQ2xvc3VyZTsgICAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1ZhbHVlPihfQ2xvc3VyZShfX3YoKSwgX193KCkpKTsgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X05hbWUsIF9FeHByLCBfQ29uc3RhbnQsIF9Eb20sICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4sICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT46OnJlc3VsdF90eXBlPiBcCisgICAgb3BlcmF0b3IgX09wKGNvbnN0IF9FeHByPF9Eb20sIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+JiBfX3YsICAgICBcCisgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUmIF9fdCkgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUgX0FyZzsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCBfQXJnPjo6cmVzdWx0X3R5cGUgX1ZhbHVlOyAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9OYW1lLCBfRXhwciwgX0NvbnN0YW50LCBfRG9tLCBfQXJnPiBfQ2xvc3VyZTsgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9WYWx1ZT4oX0Nsb3N1cmUoX192KCksIF9fdCkpOyAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIF9FeHByPF9CaW5DbG9zPF9OYW1lLCBfQ29uc3RhbnQsIF9FeHByLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUsIF9Eb20+LCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgdHlwZW5hbWUgX19mdW48X05hbWUsIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+OjpyZXN1bHRfdHlwZT4gXAorICAgIG9wZXJhdG9yIF9PcChjb25zdCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlJiBfX3QsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBjb25zdCBfRXhwcjxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX192KSAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9Bcmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX0FyZz46OnJlc3VsdF90eXBlIF9WYWx1ZTsgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfTmFtZSwgX0NvbnN0YW50LCBfRXhwciwgX0FyZywgX0RvbT4gX0Nsb3N1cmU7ICAgXAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVmFsdWU+KF9DbG9zdXJlKF9fdCwgX192KCkpKTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfTmFtZSwgX0V4cHIsIF9WYWxBcnJheSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiwgICAgICAgICAgICAgXAorICAgICAgICAgICAgIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPjo6cmVzdWx0X3R5cGU+IFwKKyAgICBvcGVyYXRvciBfT3AoY29uc3QgX0V4cHI8X0RvbSx0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX19lLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgY29uc3QgdmFsYXJyYXk8dHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4mIF9fdikgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSBfQXJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19mdW48X05hbWUsIF9Bcmc+OjpyZXN1bHRfdHlwZSBfVmFsdWU7ICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgX0JpbkNsb3M8X05hbWUsIF9FeHByLCBfVmFsQXJyYXksIF9Eb20sIF9Bcmc+IF9DbG9zdXJlOyAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1ZhbHVlPihfQ2xvc3VyZShfX2UoKSwgX192KSk7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X05hbWUsIF9WYWxBcnJheSwgX0V4cHIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSwgX0RvbT4sICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT46OnJlc3VsdF90eXBlPiBcCisgICAgb3BlcmF0b3IgX09wKGNvbnN0IHZhbGFycmF5PHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+JiBfX3YsICAgICAgICBcCisgICAgICAgICAgICAgICAgIGNvbnN0IF9FeHByPF9Eb20sIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+JiBfX2UpICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUgX1RwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCBfVHA+OjpyZXN1bHRfdHlwZSBfVmFsdWU7ICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9OYW1lLCBfVmFsQXJyYXksIF9FeHByLCBfVHAsIF9Eb20+IF9DbG9zdXJlOyAgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9WYWx1ZT4oX0Nsb3N1cmUoX192LCBfX2UgKCkpKTsgICAgICAgICAgICBcCisgICAgfQorCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUigrLCBfX3BsdXMpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUigtLCBfX21pbnVzKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoKiwgX19tdWx0aXBsaWVzKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoLywgX19kaXZpZGVzKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoJSwgX19tb2R1bHVzKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoXiwgX19iaXR3aXNlX3hvcikKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKCYsIF9fYml0d2lzZV9hbmQpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUih8LCBfX2JpdHdpc2Vfb3IpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUig8PCwgX19zaGlmdF9sZWZ0KQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoPj4sIF9fc2hpZnRfcmlnaHQpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUigmJiwgX19sb2dpY2FsX2FuZCkKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKHx8LCBfX2xvZ2ljYWxfb3IpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUig9PSwgX19lcXVhbF90bykKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKCE9LCBfX25vdF9lcXVhbF90bykKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKDwsIF9fbGVzcykKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKD4sIF9fZ3JlYXRlcikKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKDw9LCBfX2xlc3NfZXF1YWwpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUig+PSwgX19ncmVhdGVyX2VxdWFsKQorCisjdW5kZWYgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUgorCisjZGVmaW5lIF9ERUZJTkVfRVhQUl9VTkFSWV9GVU5DVElPTihfTmFtZSwgX1VOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X1VuQ2xvczxfVU5hbWUsIF9FeHByLCBfRG9tPiwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9OYW1lKGNvbnN0IF9FeHByPF9Eb20sIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+JiBfX2UpICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUgX1RwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfVW5DbG9zPF9VTmFtZSwgX0V4cHIsIF9Eb20+IF9DbG9zdXJlOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZShfX2UoKSkpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIF9FeHByPF9VbkNsb3M8X1VOYW1lLCBfVmFsQXJyYXksIF9UcD4sIF9UcD4gICAgICAgICAgICAgICAgICAgXAorICAgIF9OYW1lKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9VbkNsb3M8X1VOYW1lLCBfVmFsQXJyYXksIF9UcD4gX0Nsb3N1cmU7ICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVHA+KF9DbG9zdXJlKF9fdikpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oYWJzLCBfQWJzKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9GVU5DVElPTihjb3MsIF9Db3MpCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKGFjb3MsIF9BY29zKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9GVU5DVElPTihjb3NoLCBfQ29zaCkKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oc2luLCBfU2luKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9GVU5DVElPTihhc2luLCBfQXNpbikKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oc2luaCwgX1NpbmgpCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKHRhbiwgX1RhbikKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04odGFuaCwgX1RhbmgpCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKGF0YW4sIF9BdGFuKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9GVU5DVElPTihleHAsIF9FeHApCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKGxvZywgX0xvZykKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04obG9nMTAsIF9Mb2cxMCkKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oc3FydCwgX1NxcnQpCisKKyN1bmRlZiBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04KKworI2RlZmluZSBfREVGSU5FX0VYUFJfQklOQVJZX0ZVTkNUSU9OKF9GdW4sIF9VRnVuKQkJICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbTEsIGNsYXNzIF9Eb20yPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfVUZ1biwgX0V4cHIsIF9FeHByLCBfRG9tMSwgX0RvbTI+LCAgICAgICAgICBcCisJCSB0eXBlbmFtZSBfRG9tMTo6dmFsdWVfdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX0Z1bihjb25zdCBfRXhwcjxfRG9tMSwgdHlwZW5hbWUgX0RvbTE6OnZhbHVlX3R5cGU+JiBfX2UxLCAgICAgICAgIFwKKwkgY29uc3QgX0V4cHI8X0RvbTIsIHR5cGVuYW1lIF9Eb20yOjp2YWx1ZV90eXBlPiYgX19lMikJICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tMTo6dmFsdWVfdHlwZSBfVHA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9VRnVuLCBfRXhwciwgX0V4cHIsIF9Eb20xLCBfRG9tMj4gX0Nsb3N1cmU7ICAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZShfX2UxKCksIF9fZTIoKSkpOyAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfVUZ1biwgX0V4cHIsIF9WYWxBcnJheSwgX0RvbSwgICAgICAgICAgICAgICBcCisJCQkgIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+LCAgICAgICAgICAgICAgICAgIFwKKwkJIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfRnVuKGNvbnN0IF9FeHByPF9Eb20sIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+JiBfX2UsICAgICAgICAgICAgXAorCSBjb25zdCB2YWxhcnJheTx0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX192KSAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9VRnVuLCBfRXhwciwgX1ZhbEFycmF5LCBfRG9tLCBfVHA+IF9DbG9zdXJlOyAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZShfX2UoKSwgX192KSk7ICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfVUZ1biwgX1ZhbEFycmF5LCBfRXhwciwgICAgICAgICAgICAgICAgICAgICBcCisJCQkgIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUsIF9Eb20+LCAgICAgICAgICAgIFwKKwkJIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfRnVuKGNvbnN0IHZhbGFycmF5PHR5cGVuYW1lIF9Eb206OnZhbGFycmF5PiYgX192LCAgICAgICAgICAgICAgICAgXAorCSBjb25zdCBfRXhwcjxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX19lKSAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9VRnVuLCBfVmFsQXJyYXksIF9FeHByLCBfVHAsIF9Eb20+IF9DbG9zdXJlOyAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZShfX3YsIF9fZSgpKSk7ICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfVUZ1biwgX0V4cHIsIF9Db25zdGFudCwgX0RvbSwgICAgICAgICAgICAgICBcCisJCQkgIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+LCAgICAgICAgICAgICAgICAgIFwKKwkJIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfRnVuKGNvbnN0IF9FeHByPF9Eb20sIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+JiBfX2UsICAgICAgICAgICAgXAorCSBjb25zdCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlJiBfX3QpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9VRnVuLCBfRXhwciwgX0NvbnN0YW50LCBfRG9tLCBfVHA+IF9DbG9zdXJlOyAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZShfX2UoKSwgX190KSk7ICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfVUZ1biwgX0NvbnN0YW50LCBfRXhwciwgICAgICAgICAgICAgICAgICAgICBcCisJCQkgIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUsIF9Eb20+LCAgICAgICAgICAgIFwKKwkJIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfRnVuKGNvbnN0IHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUmIF9fdCwgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSBjb25zdCBfRXhwcjxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX19lKSAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9VRnVuLCBfQ29uc3RhbnQsIF9FeHByLCBfVHAsIF9Eb20+IF9DbG9zdXJlOyAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZShfX3QsIF9fZSgpKSk7ICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfVUZ1biwgX1ZhbEFycmF5LCBfVmFsQXJyYXksIF9UcCwgX1RwPiwgX1RwPiBcCisgICAgX0Z1bihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdykgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfVUZ1biwgX1ZhbEFycmF5LCBfVmFsQXJyYXksIF9UcCwgX1RwPiBfQ2xvc3VyZTtcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX192LCBfX3cpKTsgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9WYWxBcnJheSwgX0NvbnN0YW50LCBfVHAsIF9UcD4sIF9UcD4gXAorICAgIF9GdW4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192LCBjb25zdCBfVHAmIF9fdCkgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgX0JpbkNsb3M8X1VGdW4sIF9WYWxBcnJheSwgX0NvbnN0YW50LCBfVHAsIF9UcD4gX0Nsb3N1cmU7XAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVHA+KF9DbG9zdXJlKF9fdiwgX190KSk7ICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfVUZ1biwgX0NvbnN0YW50LCBfVmFsQXJyYXksIF9UcCwgX1RwPiwgX1RwPiBcCisgICAgX0Z1bihjb25zdCBfVHAmIF9fdCwgY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfVUZ1biwgX0NvbnN0YW50LCBfVmFsQXJyYXksIF9UcCwgX1RwPiBfQ2xvc3VyZTtcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX190LCBfX3YpKTsgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKK19ERUZJTkVfRVhQUl9CSU5BUllfRlVOQ1RJT04oYXRhbjIsIF9BdGFuMikKK19ERUZJTkVfRVhQUl9CSU5BUllfRlVOQ1RJT04ocG93LCBfUG93KQorCisjdW5kZWYgX0RFRklORV9FWFBSX0JJTkFSWV9GVU5DVElPTgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfQ1BQX1ZBTEFSUkFZX0FGVEVSX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy92YWxhcnJheV9hcnJheS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3ZhbGFycmF5X2FycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0ZDQ5YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy92YWxhcnJheV9hcnJheS5oCkBAIC0wLDAgKzEsNjkzIEBACisvLyBUaGUgdGVtcGxhdGUgYW5kIGlubGluZXMgZm9yIHRoZSAtKi0gQysrIC0qLSBpbnRlcm5hbCBfQXJyYXkgaGVscGVyIGNsYXNzLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy92YWxhcnJheV9hcnJheS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dmFsYXJyYXl9CisgKi8KKworLy8gV3JpdHRlbiBieSBHYWJyaWVsIERvcyBSZWlzIDxHYWJyaWVsLkRvcy1SZWlzQERQVE1hdGhzLkVOUy1DYWNoYW4uRnI+CisKKyNpZm5kZWYgX1ZBTEFSUkFZX0FSUkFZX0gKKyNkZWZpbmUgX1ZBTEFSUkFZX0FSUkFZX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxuZXc+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLworICAvLyBIZWxwZXIgZnVuY3Rpb25zIG9uIHJhdyBwb2ludGVycworICAvLworCisgIC8vIFdlIGdldCBtZW1vcnkgYnkgdGhlIG9sZCBmYXNoaW9uIHdheQorICBpbmxpbmUgdm9pZCoKKyAgX192YWxhcnJheV9nZXRfbWVtb3J5KHNpemVfdCBfX24pCisgIHsgcmV0dXJuIG9wZXJhdG9yIG5ldyhfX24pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAqX19yZXN0cmljdF9fCisgICAgX192YWxhcnJheV9nZXRfc3RvcmFnZShzaXplX3QgX19uKQorICAgIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfVHAqX19yZXN0cmljdF9fPgorCShzdGQ6Ol9fdmFsYXJyYXlfZ2V0X21lbW9yeShfX24gKiBzaXplb2YoX1RwKSkpOworICAgIH0KKworICAvLyBSZXR1cm4gbWVtb3J5IHRvIHRoZSBzeXN0ZW0KKyAgaW5saW5lIHZvaWQKKyAgX192YWxhcnJheV9yZWxlYXNlX21lbW9yeSh2b2lkKiBfX3ApCisgIHsgb3BlcmF0b3IgZGVsZXRlKF9fcCk7IH0KKworICAvLyBUdXJuIGEgcmF3LW1lbW9yeSBpbnRvIGFuIGFycmF5IG9mIF9UcCBmaWxsZWQgd2l0aCBfVHAoKQorICAvLyBUaGlzIGlzIHJlcXVpcmVkIGluICd2YWxhcnJheTxUPiB2KG4pOycKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sPgorICAgIHN0cnVjdCBfQXJyYXlfZGVmYXVsdF9jdG9yCisgICAgeworICAgICAgLy8gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzbid0IGV4Y2VwdGlvbiBzYWZlLiAgQnV0CisgICAgICAvLyB2YWxhcnJheXMgYXJlbid0IHJlcXVpcmVkIHRvIGJlIGV4Y2VwdGlvbiBzYWZlLgorICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBfU19kb19pdChfVHAqIF9fYiwgX1RwKiBfX2UpCisgICAgICB7CisJd2hpbGUgKF9fYiAhPSBfX2UpCisJICBuZXcoX19iKyspIF9UcCgpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfQXJyYXlfZGVmYXVsdF9jdG9yPF9UcCwgdHJ1ZT4KKyAgICB7CisgICAgICAvLyBGb3IgZnVuZGFtZW50YWwgdHlwZXMsIGl0IHN1ZmZpY2VzIHRvIHNheSAnbWVtc2V0KCknCisgICAgICBpbmxpbmUgc3RhdGljIHZvaWQKKyAgICAgIF9TX2RvX2l0KF9UcCogX19iLCBfVHAqIF9fZSkKKyAgICAgIHsgX19idWlsdGluX21lbXNldChfX2IsIDAsIChfX2UgLSBfX2IpICogc2l6ZW9mKF9UcCkpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2RlZmF1bHRfY29uc3RydWN0KF9UcCogX19iLCBfVHAqIF9fZSkKKyAgICB7CisgICAgICBfQXJyYXlfZGVmYXVsdF9jdG9yPF9UcCwgX19pc19zY2FsYXI8X1RwPjo6X192YWx1ZT46Ol9TX2RvX2l0KF9fYiwgX19lKTsKKyAgICB9CisKKyAgLy8gVHVybiBhIHJhdy1tZW1vcnkgaW50byBhbiBhcnJheSBvZiBfVHAgZmlsbGVkIHdpdGggX190CisgIC8vIFRoaXMgaXMgdGhlIHJlcXVpcmVkIGluIHZhbGFycmF5PFQ+IHYobiwgdCkuICBBbHNvCisgIC8vIHVzZWQgaW4gdmFsYXJyYXk8Pjo6cmVzaXplKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbD4KKyAgICBzdHJ1Y3QgX0FycmF5X2luaXRfY3RvcgorICAgIHsKKyAgICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpc24ndCBleGNlcHRpb24gc2FmZS4gIEJ1dAorICAgICAgLy8gdmFsYXJyYXlzIGFyZW4ndCByZXF1aXJlZCB0byBiZSBleGNlcHRpb24gc2FmZS4KKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZAorICAgICAgX1NfZG9faXQoX1RwKiBfX2IsIF9UcCogX19lLCBjb25zdCBfVHAgX190KQorICAgICAgeworCXdoaWxlIChfX2IgIT0gX19lKQorCSAgbmV3KF9fYisrKSBfVHAoX190KTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0FycmF5X2luaXRfY3RvcjxfVHAsIHRydWU+CisgICAgeworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBfU19kb19pdChfVHAqIF9fYiwgX1RwKiBfX2UsIGNvbnN0IF9UcCBfX3QpCisgICAgICB7CisJd2hpbGUgKF9fYiAhPSBfX2UpCisJICAqX19iKysgPSBfX3Q7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2ZpbGxfY29uc3RydWN0KF9UcCogX19iLCBfVHAqIF9fZSwgY29uc3QgX1RwIF9fdCkKKyAgICB7CisgICAgICBfQXJyYXlfaW5pdF9jdG9yPF9UcCwgX19pc190cml2aWFsKF9UcCk+OjpfU19kb19pdChfX2IsIF9fZSwgX190KTsKKyAgICB9CisKKyAgLy8KKyAgLy8gY29weS1jb25zdHJ1Y3QgcmF3IGFycmF5IFtfX28sICopIGZyb20gcGxhaW4gYXJyYXkgW19fYiwgX19lKQorICAvLyBXZSBjYW4ndCBqdXN0IHNheSAnbWVtY3B5KCknCisgIC8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbD4KKyAgICBzdHJ1Y3QgX0FycmF5X2NvcHlfY3RvcgorICAgIHsKKyAgICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpc24ndCBleGNlcHRpb24gc2FmZS4gIEJ1dAorICAgICAgLy8gdmFsYXJyYXlzIGFyZW4ndCByZXF1aXJlZCB0byBiZSBleGNlcHRpb24gc2FmZS4KKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZAorICAgICAgX1NfZG9faXQoY29uc3QgX1RwKiBfX2IsIGNvbnN0IF9UcCogX19lLCBfVHAqIF9fcmVzdHJpY3RfXyBfX28pCisgICAgICB7CisJd2hpbGUgKF9fYiAhPSBfX2UpCisJICBuZXcoX19vKyspIF9UcCgqX19iKyspOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfQXJyYXlfY29weV9jdG9yPF9UcCwgdHJ1ZT4KKyAgICB7CisgICAgICBpbmxpbmUgc3RhdGljIHZvaWQKKyAgICAgIF9TX2RvX2l0KGNvbnN0IF9UcCogX19iLCBjb25zdCBfVHAqIF9fZSwgX1RwKiBfX3Jlc3RyaWN0X18gX19vKQorICAgICAgeyBfX2J1aWx0aW5fbWVtY3B5KF9fbywgX19iLCAoX19lIC0gX19iKSAqIHNpemVvZihfVHApKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChjb25zdCBfVHAqIF9fYiwgY29uc3QgX1RwKiBfX2UsCisJCQkgICAgICBfVHAqIF9fcmVzdHJpY3RfXyBfX28pCisgICAgeworICAgICAgX0FycmF5X2NvcHlfY3RvcjxfVHAsIF9faXNfdHJpdmlhbChfVHApPjo6X1NfZG9faXQoX19iLCBfX2UsIF9fbyk7CisgICAgfQorCisgIC8vIGNvcHktY29uc3RydWN0IHJhdyBhcnJheSBbX19vLCAqKSBmcm9tIHN0cmlkZWQgYXJyYXkgX19hWzxfX24gOiBfX3M+XQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0IChjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIHNpemVfdCBfX24sCisJCQkgICAgICAgc2l6ZV90IF9fcywgX1RwKiBfX3Jlc3RyaWN0X18gX19vKQorICAgIHsKKyAgICAgIGlmIChfX2lzX3RyaXZpYWwoX1RwKSkKKwl3aGlsZSAoX19uLS0pCisJICB7CisJICAgICpfX28rKyA9ICpfX2E7CisJICAgIF9fYSArPSBfX3M7CisJICB9CisgICAgICBlbHNlCisJd2hpbGUgKF9fbi0tKQorCSAgeworCSAgICBuZXcoX19vKyspIF9UcCgqX19hKTsKKwkgICAgX19hICs9IF9fczsKKwkgIH0KKyAgICB9CisKKyAgLy8gY29weS1jb25zdHJ1Y3QgcmF3IGFycmF5IFtfX28sICopIGZyb20gaW5kZXhlZCBhcnJheSBfX2FbX19pWzxfX24+XV0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5X2NvbnN0cnVjdCAoY29uc3QgX1RwKiBfX3Jlc3RyaWN0X18gX19hLAorCQkJICAgICAgIGNvbnN0IHNpemVfdCogX19yZXN0cmljdF9fIF9faSwKKwkJCSAgICAgICBfVHAqIF9fcmVzdHJpY3RfXyBfX28sIHNpemVfdCBfX24pCisgICAgeworICAgICAgaWYgKF9faXNfdHJpdmlhbChfVHApKQorCXdoaWxlIChfX24tLSkKKwkgICpfX28rKyA9IF9fYVsqX19pKytdOworICAgICAgZWxzZQorCXdoaWxlIChfX24tLSkKKwkgIG5ldyAoX19vKyspIF9UcChfX2FbKl9faSsrXSk7CisgICAgfQorCisgIC8vIERvIHRoZSBuZWNlc3NhcnkgY2xlYW51cCB3aGVuIHdlJ3JlIGRvbmUgd2l0aCBhcnJheXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfZGVzdHJveV9lbGVtZW50cyhfVHAqIF9fYiwgX1RwKiBfX2UpCisgICAgeworICAgICAgaWYgKCFfX2lzX3RyaXZpYWwoX1RwKSkKKwl3aGlsZSAoX19iICE9IF9fZSkKKwkgIHsKKwkgICAgX19iLT5+X1RwKCk7CisJICAgICsrX19iOworCSAgfQorICAgIH0KKworICAvLyBGaWxsIGEgcGxhaW4gYXJyYXkgX19hWzxfX24+XSB3aXRoIF9fdAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2ZpbGwoX1RwKiBfX3Jlc3RyaWN0X18gX19hLCBzaXplX3QgX19uLCBjb25zdCBfVHAmIF9fdCkKKyAgICB7CisgICAgICB3aGlsZSAoX19uLS0pCisJKl9fYSsrID0gX190OworICAgIH0KKyAgCisgIC8vIGZpbGwgc3RyaWRlZCBhcnJheSBfX2FbPF9fbi0xIDogX19zPl0gd2l0aCBfX3QKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9maWxsKF9UcCogX19yZXN0cmljdF9fIF9fYSwgc2l6ZV90IF9fbiwKKwkJICAgIHNpemVfdCBfX3MsIGNvbnN0IF9UcCYgX190KQorICAgIHsgCisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pLCBfX2EgKz0gX19zKQorCSpfX2EgPSBfX3Q7CisgICAgfQorCisgIC8vIGZpbGwgaW5kaXJlY3QgYXJyYXkgX19hW19faVs8X19uPl1dIHdpdGggX19pCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfZmlsbChfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIGNvbnN0IHNpemVfdCogX19yZXN0cmljdF9fIF9faSwKKwkJICAgIHNpemVfdCBfX24sIGNvbnN0IF9UcCYgX190KQorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90IF9faiA9IDA7IF9faiA8IF9fbjsgKytfX2osICsrX19pKQorCV9fYVsqX19pXSA9IF9fdDsKKyAgICB9CisgIAorICAvLyBjb3B5IHBsYWluIGFycmF5IF9fYVs8X19uPl0gaW4gX19iWzxfX24+XQorICAvLyBGb3Igbm9uLWZ1bmRhbWVudGFsIHR5cGVzLCBpdCBpcyB3cm9uZyB0byBzYXkgJ21lbWNweSgpJworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2w+CisgICAgc3RydWN0IF9BcnJheV9jb3BpZXIKKyAgICB7CisgICAgICBpbmxpbmUgc3RhdGljIHZvaWQKKyAgICAgIF9TX2RvX2l0KGNvbnN0IF9UcCogX19yZXN0cmljdF9fIF9fYSwgc2l6ZV90IF9fbiwgX1RwKiBfX3Jlc3RyaWN0X18gX19iKQorICAgICAgeworCXdoaWxlKF9fbi0tKQorCSAgKl9fYisrID0gKl9fYSsrOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfQXJyYXlfY29waWVyPF9UcCwgdHJ1ZT4KKyAgICB7CisgICAgICBpbmxpbmUgc3RhdGljIHZvaWQKKyAgICAgIF9TX2RvX2l0KGNvbnN0IF9UcCogX19yZXN0cmljdF9fIF9fYSwgc2l6ZV90IF9fbiwgX1RwKiBfX3Jlc3RyaWN0X18gX19iKQorICAgICAgeyBfX2J1aWx0aW5fbWVtY3B5KF9fYiwgX19hLCBfX24gKiBzaXplb2YgKF9UcCkpOyB9CisgICAgfTsKKworICAvLyBDb3B5IGEgcGxhaW4gYXJyYXkgX19hWzxfX24+XSBpbnRvIGEgcGxheSBhcnJheSBfX2JbPD5dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIHNpemVfdCBfX24sCisJCSAgICBfVHAqIF9fcmVzdHJpY3RfXyBfX2IpCisgICAgeworICAgICAgX0FycmF5X2NvcGllcjxfVHAsIF9faXNfdHJpdmlhbChfVHApPjo6X1NfZG9faXQoX19hLCBfX24sIF9fYik7CisgICAgfQorCisgIC8vIENvcHkgc3RyaWRlZCBhcnJheSBfX2FbPF9fbiA6IF9fcz5dIGluIHBsYWluIF9fYls8X19uPl0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KGNvbnN0IF9UcCogX19yZXN0cmljdF9fIF9fYSwgc2l6ZV90IF9fbiwgc2l6ZV90IF9fcywKKwkJICAgIF9UcCogX19yZXN0cmljdF9fIF9fYikKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pLCArK19fYiwgX19hICs9IF9fcykKKwkqX19iID0gKl9fYTsKKyAgICB9CisKKyAgLy8gQ29weSBhIHBsYWluIGFycmF5ICBfX2FbPF9fbj5dIGludG8gYSBzdHJpZGVkIGFycmF5IF9fYls8X19uIDogX19zPl0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KGNvbnN0IF9UcCogX19yZXN0cmljdF9fIF9fYSwgX1RwKiBfX3Jlc3RyaWN0X18gX19iLAorCQkgICAgc2l6ZV90IF9fbiwgc2l6ZV90IF9fcykKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pLCArK19fYSwgX19iICs9IF9fcykKKwkqX19iID0gKl9fYTsKKyAgICB9CisKKyAgLy8gQ29weSBzdHJpZGVkIGFycmF5IF9fc3JjWzxfX24gOiBfX3MxPl0gaW50byBhbm90aGVyCisgIC8vIHN0cmlkZWQgYXJyYXkgX19kc3RbPCA6IF9fczI+XS4gIFRoZWlyIHNpemVzIG11c3QgbWF0Y2guCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX3NyYywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fczEsCisJCSAgICBfVHAqIF9fcmVzdHJpY3RfXyBfX2RzdCwgc2l6ZV90IF9fczIpCisgICAgeworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwlfX2RzdFtfX2kgKiBfX3MyXSA9IF9fc3JjW19faSAqIF9fczFdOworICAgIH0KKworICAvLyBDb3B5IGFuIGluZGV4ZWQgYXJyYXkgX19hW19faVs8X19uPl1dIGluIHBsYWluIGFycmF5IF9fYls8X19uPl0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KGNvbnN0IF9UcCogX19yZXN0cmljdF9fIF9fYSwKKwkJICAgIGNvbnN0IHNpemVfdCogX19yZXN0cmljdF9fIF9faSwKKwkJICAgIF9UcCogX19yZXN0cmljdF9fIF9fYiwgc2l6ZV90IF9fbikKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBfX2ogPSAwOyBfX2ogPCBfX247ICsrX19qLCArK19fYiwgKytfX2kpCisJKl9fYiA9IF9fYVsqX19pXTsKKyAgICB9CisKKyAgLy8gQ29weSBhIHBsYWluIGFycmF5IF9fYVs8X19uPl0gaW4gYW4gaW5kZXhlZCBhcnJheSBfX2JbX19pWzxfX24+XV0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KGNvbnN0IF9UcCogX19yZXN0cmljdF9fIF9fYSwgc2l6ZV90IF9fbiwKKwkJICAgIF9UcCogX19yZXN0cmljdF9fIF9fYiwgY29uc3Qgc2l6ZV90KiBfX3Jlc3RyaWN0X18gX19pKQorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90IF9faiA9IDA7IF9faiA8IF9fbjsgKytfX2osICsrX19hLCArK19faSkKKwlfX2JbKl9faV0gPSAqX19hOworICAgIH0KKworICAvLyBDb3B5IHRoZSBfX24gZmlyc3QgZWxlbWVudHMgb2YgYW4gaW5kZXhlZCBhcnJheSBfX3NyY1s8X19pPl0gaW50bworICAvLyBhbm90aGVyIGluZGV4ZWQgYXJyYXkgX19kc3RbPF9faj5dLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoY29uc3QgX1RwKiBfX3Jlc3RyaWN0X18gX19zcmMsIHNpemVfdCBfX24sCisJCSAgICBjb25zdCBzaXplX3QqIF9fcmVzdHJpY3RfXyBfX2ksCisJCSAgICBfVHAqIF9fcmVzdHJpY3RfXyBfX2RzdCwgY29uc3Qgc2l6ZV90KiBfX3Jlc3RyaWN0X18gX19qKQorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9fbjsgKytfX2spCisJX19kc3RbKl9faisrXSA9IF9fc3JjWypfX2krK107CisgICAgfQorCisgIC8vCisgIC8vIENvbXB1dGUgdGhlIHN1bSBvZiBlbGVtZW50cyBpbiByYW5nZSBbX19mLCBfX2wpCisgIC8vIFRoaXMgaXMgYSBuYWl2ZSBhbGdvcml0aG0uICBJdCBzdWZmZXJzIGZyb20gY2FuY2VsbGluZy4KKyAgLy8gSW4gdGhlIGZ1dHVyZSB0cnkgdG8gc3BlY2lhbGl6ZQorICAvLyBmb3IgX1RwID0gZmxvYXQsIGRvdWJsZSwgbG9uZyBkb3VibGUgdXNpbmcgYSBtb3JlIGFjY3VyYXRlCisgIC8vIGFsZ29yaXRobS4KKyAgLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfX3ZhbGFycmF5X3N1bShjb25zdCBfVHAqIF9fZiwgY29uc3QgX1RwKiBfX2wpCisgICAgeworICAgICAgX1RwIF9fciA9IF9UcCgpOworICAgICAgd2hpbGUgKF9fZiAhPSBfX2wpCisJX19yICs9ICpfX2YrKzsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIC8vIENvbXB1dGUgdGhlIHByb2R1Y3Qgb2YgYWxsIGVsZW1lbnRzIGluIHJhbmdlIFtfX2YsIF9fbCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfX3ZhbGFycmF5X3Byb2R1Y3QoY29uc3QgX1RwKiBfX2YsIGNvbnN0IF9UcCogX19sKQorICAgIHsKKyAgICAgIF9UcCBfX3IgPSBfVHAoMSk7CisgICAgICB3aGlsZSAoX19mICE9IF9fbCkKKwlfX3IgPSBfX3IgKiAqX19mKys7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICAvLyBDb21wdXRlIHRoZSBtaW4vbWF4IG9mIGFuIGFycmF5LWV4cHJlc3Npb24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RhPgorICAgIGlubGluZSB0eXBlbmFtZSBfVGE6OnZhbHVlX3R5cGUKKyAgICBfX3ZhbGFycmF5X21pbihjb25zdCBfVGEmIF9fYSkKKyAgICB7CisgICAgICBzaXplX3QgX19zID0gX19hLnNpemUoKTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RhOjp2YWx1ZV90eXBlIF9WYWx1ZV90eXBlOworICAgICAgX1ZhbHVlX3R5cGUgX19yID0gX19zID09IDAgPyBfVmFsdWVfdHlwZSgpIDogX19hWzBdOworICAgICAgZm9yIChzaXplX3QgX19pID0gMTsgX19pIDwgX19zOyArK19faSkKKwl7CisJICBfVmFsdWVfdHlwZSBfX3QgPSBfX2FbX19pXTsKKwkgIGlmIChfX3QgPCBfX3IpCisJICAgIF9fciA9IF9fdDsKKwl9CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVGE+CisgICAgaW5saW5lIHR5cGVuYW1lIF9UYTo6dmFsdWVfdHlwZQorICAgIF9fdmFsYXJyYXlfbWF4KGNvbnN0IF9UYSYgX19hKQorICAgIHsKKyAgICAgIHNpemVfdCBfX3MgPSBfX2Euc2l6ZSgpOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVGE6OnZhbHVlX3R5cGUgX1ZhbHVlX3R5cGU7CisgICAgICBfVmFsdWVfdHlwZSBfX3IgPSBfX3MgPT0gMCA/IF9WYWx1ZV90eXBlKCkgOiBfX2FbMF07CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAxOyBfX2kgPCBfX3M7ICsrX19pKQorCXsKKwkgIF9WYWx1ZV90eXBlIF9fdCA9IF9fYVtfX2ldOworCSAgaWYgKF9fdCA+IF9fcikKKwkgICAgX19yID0gX190OworCX0KKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIC8vCisgIC8vIEhlbHBlciBjbGFzcyBfQXJyYXksIGZpcnN0IGxheWVyIG9mIHZhbGFycmF5IGFic3RyYWN0aW9uLgorICAvLyBBbGwgb3BlcmF0aW9ucyBvbiB2YWxhcnJheSBzaG91bGQgYmUgZm9yd2FyZGVkIHRvIHRoaXMgY2xhc3MKKyAgLy8gd2hlbmV2ZXIgcG9zc2libGUuIC0tIGdkcgorICAvLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0FycmF5CisgICAgeworICAgICAgZXhwbGljaXQgX0FycmF5KHNpemVfdCk7CisgICAgICBleHBsaWNpdCBfQXJyYXkoX1RwKiBjb25zdCBfX3Jlc3RyaWN0X18pOworICAgICAgZXhwbGljaXQgX0FycmF5KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKyAgICAgIF9BcnJheShjb25zdCBfVHAqIF9fcmVzdHJpY3RfXywgc2l6ZV90KTsKKyAgICAgIAorICAgICAgX1RwKiBiZWdpbigpIGNvbnN0OworICAgICAgCisgICAgICBfVHAqIGNvbnN0IF9fcmVzdHJpY3RfXyBfTV9kYXRhOworICAgIH07CisKKworICAvLyBDb3B5LWNvbnN0cnVjdCBwbGFpbiBhcnJheSBfX2JbPF9fbj5dIGZyb20gaW5kZXhlZCBhcnJheSBfX2FbX19pWzxfX24+XV0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxzaXplX3Q+IF9faSwKKwkJCSAgICAgIF9BcnJheTxfVHA+IF9fYiwgc2l6ZV90IF9fbikKKyAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfX2EuX01fZGF0YSwgX19pLl9NX2RhdGEsCisJCQkJICAgICBfX2IuX01fZGF0YSwgX19uKTsgfQorCisgIC8vIENvcHktY29uc3RydWN0IHBsYWluIGFycmF5IF9fYls8X19uPl0gZnJvbSBzdHJpZGVkIGFycmF5IF9fYVs8X19uIDogX19zPl0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sIHNpemVfdCBfX3MsCisJCQkgICAgICBfQXJyYXk8X1RwPiBfX2IpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX19hLl9NX2RhdGEsIF9fbiwgX19zLCBfX2IuX01fZGF0YSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2ZpbGwgKF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fbiwgY29uc3QgX1RwJiBfX3QpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfZmlsbChfX2EuX01fZGF0YSwgX19uLCBfX3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9maWxsKF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fbiwgc2l6ZV90IF9fcywgY29uc3QgX1RwJiBfX3QpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfZmlsbChfX2EuX01fZGF0YSwgX19uLCBfX3MsIF9fdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2ZpbGwoX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8c2l6ZV90PiBfX2ksCisJCSAgICBzaXplX3QgX19uLCBjb25zdCBfVHAmIF9fdCkKKyAgICB7IHN0ZDo6X192YWxhcnJheV9maWxsKF9fYS5fTV9kYXRhLCBfX2kuX01fZGF0YSwgX19uLCBfX3QpOyB9CisKKyAgLy8gQ29weSBhIHBsYWluIGFycmF5IF9fYVs8X19uPl0gaW50byBhIHBsYXkgYXJyYXkgX19iWzw+XQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBfQXJyYXk8X1RwPiBfX2IpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2EuX01fZGF0YSwgX19uLCBfX2IuX01fZGF0YSk7IH0KKworICAvLyBDb3B5IHN0cmlkZWQgYXJyYXkgX19hWzxfX24gOiBfX3M+XSBpbiBwbGFpbiBfX2JbPF9fbj5dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sIHNpemVfdCBfX3MsIF9BcnJheTxfVHA+IF9fYikKKyAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5KF9fYS5fTV9kYXRhLCBfX24sIF9fcywgX19iLl9NX2RhdGEpOyB9CisKKyAgLy8gQ29weSBhIHBsYWluIGFycmF5ICBfX2FbPF9fbj5dIGludG8gYSBzdHJpZGVkIGFycmF5IF9fYls8X19uIDogX19zPl0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+IF9fYSwgX0FycmF5PF9UcD4gX19iLCBzaXplX3QgX19uLCBzaXplX3QgX19zKQorICAgIHsgX192YWxhcnJheV9jb3B5KF9fYS5fTV9kYXRhLCBfX2IuX01fZGF0YSwgX19uLCBfX3MpOyB9CisKKyAgLy8gQ29weSBzdHJpZGVkIGFycmF5IF9fc3JjWzxfX24gOiBfX3MxPl0gaW50byBhbm90aGVyCisgIC8vIHN0cmlkZWQgYXJyYXkgX19kc3RbPCA6IF9fczI+XS4gIFRoZWlyIHNpemVzIG11c3QgbWF0Y2guCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sIHNpemVfdCBfX3MxLAorICAgICAgICAgICAgICAgICAgICBfQXJyYXk8X1RwPiBfX2IsIHNpemVfdCBfX3MyKQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19hLl9NX2RhdGEsIF9fbiwgX19zMSwgX19iLl9NX2RhdGEsIF9fczIpOyB9CisKKyAgLy8gQ29weSBhbiBpbmRleGVkIGFycmF5IF9fYVtfX2lbPF9fbj5dXSBpbiBwbGFpbiBhcnJheSBfX2JbPF9fbj5dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxzaXplX3Q+IF9faSwKKwkJICAgIF9BcnJheTxfVHA+IF9fYiwgc2l6ZV90IF9fbikKKyAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5KF9fYS5fTV9kYXRhLCBfX2kuX01fZGF0YSwgX19iLl9NX2RhdGEsIF9fbik7IH0KKworICAvLyBDb3B5IGEgcGxhaW4gYXJyYXkgX19hWzxfX24+XSBpbiBhbiBpbmRleGVkIGFycmF5IF9fYltfX2lbPF9fbj5dXQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBfQXJyYXk8X1RwPiBfX2IsCisJCSAgICBfQXJyYXk8c2l6ZV90PiBfX2kpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2EuX01fZGF0YSwgX19uLCBfX2IuX01fZGF0YSwgX19pLl9NX2RhdGEpOyB9CisKKyAgLy8gQ29weSB0aGUgX19uIGZpcnN0IGVsZW1lbnRzIG9mIGFuIGluZGV4ZWQgYXJyYXkgX19zcmNbPF9faT5dIGludG8KKyAgLy8gYW5vdGhlciBpbmRleGVkIGFycmF5IF9fZHN0WzxfX2o+XS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+IF9fc3JjLCBzaXplX3QgX19uLCBfQXJyYXk8c2l6ZV90PiBfX2ksCisgICAgICAgICAgICAgICAgICAgIF9BcnJheTxfVHA+IF9fZHN0LCBfQXJyYXk8c2l6ZV90PiBfX2opCisgICAgeworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19zcmMuX01fZGF0YSwgX19uLCBfX2kuX01fZGF0YSwKKwkJICAgIF9fZHN0Ll9NX2RhdGEsIF9fai5fTV9kYXRhKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIF9BcnJheTxfVHA+OjpfQXJyYXkoc2l6ZV90IF9fbikKKyAgICA6IF9NX2RhdGEoX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fbikpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfZGVmYXVsdF9jb25zdHJ1Y3QoX01fZGF0YSwgX01fZGF0YSArIF9fbik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lCisgICAgX0FycmF5PF9UcD46Ol9BcnJheShfVHAqIGNvbnN0IF9fcmVzdHJpY3RfXyBfX3ApCisgICAgOiBfTV9kYXRhIChfX3ApIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIF9BcnJheTxfVHA+OjpfQXJyYXkoY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KQorICAgIDogX01fZGF0YSAoX192Ll9NX2RhdGEpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIF9BcnJheTxfVHA+OjpfQXJyYXkoY29uc3QgX1RwKiBfX3Jlc3RyaWN0X18gX19iLCBzaXplX3QgX19zKQorICAgIDogX01fZGF0YShfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX19zKSkKKyAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfX2IsIF9fcywgX01fZGF0YSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcCoKKyAgICBfQXJyYXk8X1RwPjo6YmVnaW4gKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9kYXRhOyB9CisKKyNkZWZpbmUgX0RFRklORV9BUlJBWV9GVU5DVElPTihfT3AsIF9OYW1lKQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCSAgICAgICAgCQkJXAorICAgIGlubGluZSB2b2lkCQkJCQkJCQlcCisgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fbiwgY29uc3QgX1RwJiBfX3QpIFwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgZm9yIChfVHAqIF9fcCA9IF9fYS5fTV9kYXRhOyBfX3AgPCBfX2EuX01fZGF0YSArIF9fbjsgKytfX3ApCVwKKyAgICAgICAgKl9fcCBfT3AjIz0gX190OwkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIGlubGluZSB2b2lkCQkJCQkJCQlcCisgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fbiwgX0FycmF5PF9UcD4gX19iKSBcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9UcCogX19wID0gX19hLl9NX2RhdGE7CQkJCQkJXAorICAgICAgZm9yIChfVHAqIF9fcSA9IF9fYi5fTV9kYXRhOyBfX3EgPCBfX2IuX01fZGF0YSArIF9fbjsgKytfX3AsICsrX19xKSBcCisgICAgICAgICpfX3AgX09wIyM9ICpfX3E7CQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgY2xhc3MgX0RvbT4JCQkJCVwKKyAgICB2b2lkCQkJCQkJCQlcCisgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+IF9fYSwJICAgICAgICAJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lLCBzaXplX3QgX19uKQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9UcCogX19wKF9fYS5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pLCArK19fcCkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICpfX3AgX09wIyM9IF9fZVtfX2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sIHNpemVfdCBfX3MsCVwKKwkgICAgICAgICAgICAgICAgICAgICBfQXJyYXk8X1RwPiBfX2IpCQkJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgX1RwKiBfX3EoX19iLl9NX2RhdGEpOwkJCQkJCVwKKyAgICAgIGZvciAoX1RwKiBfX3AgPSBfX2EuX01fZGF0YTsgX19wIDwgX19hLl9NX2RhdGEgKyBfX3MgKiBfX247ICAgICAgIFwKKwkgICBfX3AgKz0gX19zLCArK19fcSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqX19wIF9PcCMjPSAqX19xOwkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIGlubGluZSB2b2lkCQkJCQkJCQlcCisgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+IF9fYSwgX0FycmF5PF9UcD4gX19iLAkJXAorCQkgICAgICAgICAgICAgc2l6ZV90IF9fbiwgc2l6ZV90IF9fcykJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9UcCogX19xKF9fYi5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBmb3IgKF9UcCogX19wID0gX19hLl9NX2RhdGE7IF9fcCA8IF9fYS5fTV9kYXRhICsgX19uOyAgICAgICAgICAgICBcCisJICAgKytfX3AsIF9fcSArPSBfX3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKl9fcCBfT3AjIz0gKl9fcTsJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBjbGFzcyBfRG9tPgkJCQkJXAorICAgIHZvaWQJCQkJCQkJCVwKKyAgICBfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19zLAkJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UsIHNpemVfdCBfX24pCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgX1RwKiBfX3AoX19hLl9NX2RhdGEpOwkJCQkJCVwKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2ksIF9fcCArPSBfX3MpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKl9fcCBfT3AjIz0gX19lW19faV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIGlubGluZSB2b2lkCQkJCQkJCQlcCisgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+IF9fYSwgX0FycmF5PHNpemVfdD4gX19pLAlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BcnJheTxfVHA+IF9fYiwgc2l6ZV90IF9fbikJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgX1RwKiBfX3EoX19iLl9NX2RhdGEpOwkJCQkJCVwKKyAgICAgIGZvciAoc2l6ZV90KiBfX2ogPSBfX2kuX01fZGF0YTsgX19qIDwgX19pLl9NX2RhdGEgKyBfX247ICAgICAgICAgIFwKKyAgICAgICAgICAgKytfX2osICsrX19xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19hLl9NX2RhdGFbKl9fal0gX09wIyM9ICpfX3E7CQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgdm9pZAkJCQkJICAgICAgICAJCVwKKyAgICBfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLAkJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQXJyYXk8X1RwPiBfX2IsIF9BcnJheTxzaXplX3Q+IF9faSkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfVHAqIF9fcChfX2EuX01fZGF0YSk7CQkJCQkJXAorICAgICAgZm9yIChzaXplX3QqIF9faiA9IF9faS5fTV9kYXRhOyBfX2o8X19pLl9NX2RhdGEgKyBfX247ICAgICAgICAgICAgXAorCSAgICsrX19qLCArK19fcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICpfX3AgX09wIyM9IF9fYi5fTV9kYXRhWypfX2pdOwkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgY2xhc3MgX0RvbT4JCQkJCVwKKyAgICB2b2lkCQkJCQkJCQlcCisgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+IF9fYSwgX0FycmF5PHNpemVfdD4gX19pLAlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSwgc2l6ZV90IF9fbikJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBzaXplX3QqIF9faihfX2kuX01fZGF0YSk7CSAgICAgICAgCQkJCVwKKyAgICAgIGZvciAoc2l6ZV90IF9fayA9IDA7IF9fazxfX247ICsrX19rLCArK19faikJCQlcCisgICAgICAgIF9fYS5fTV9kYXRhWypfX2pdIF9PcCMjPSBfX2VbX19rXTsJCQkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCQkJCQlcCisgICAgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxib29sPiBfX20sICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQXJyYXk8X1RwPiBfX2IsIHNpemVfdCBfX24pCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIGJvb2wqIF9fb2soX19tLl9NX2RhdGEpOwkJCQkJCVwKKyAgICAgIF9UcCogX19wKF9fYS5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBmb3IgKF9UcCogX19xID0gX19iLl9NX2RhdGE7IF9fcSA8IF9fYi5fTV9kYXRhICsgX19uOyAgICAgICAgICAgICBcCisJICAgKytfX3EsICsrX19vaywgKytfX3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB3aGlsZSAoISAqX19vaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsJCQkJCQkgICAgICAgIAlcCisgICAgICAgICAgICAgICsrX19vazsJCQkJCQkJXAorICAgICAgICAgICAgICArK19fcDsJCQkJCQkJXAorICAgICAgICAgICAgfQkJCQkJCQkJXAorICAgICAgICAgICpfX3AgX09wIyM9ICpfX3E7CQkJCQkJXAorICAgICAgICB9CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICB2b2lkCQkJCQkJCQlcCisgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fbiwJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FycmF5PF9UcD4gX19iLCBfQXJyYXk8Ym9vbD4gX19tKSAgIAlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIGJvb2wqIF9fb2soX19tLl9NX2RhdGEpOwkJCQkJCVwKKyAgICAgIF9UcCogX19xKF9fYi5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBmb3IgKF9UcCogX19wID0gX19hLl9NX2RhdGE7IF9fcCA8IF9fYS5fTV9kYXRhICsgX19uOyAgICAgICAgICAgICBcCisJICAgKytfX3AsICsrX19vaywgKytfX3EpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB3aGlsZSAoISAqX19vaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsJCQkJCSAgICAgICAgCQlcCisgICAgICAgICAgICAgICsrX19vazsJCQkJCQkJXAorICAgICAgICAgICAgICArK19fcTsJCQkJCQkJXAorICAgICAgICAgICAgfQkJCQkJCQkJXAorICAgICAgICAgICpfX3AgX09wIyM9ICpfX3E7CQkJCQkJXAorICAgICAgICB9CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBjbGFzcyBfRG9tPgkJCQkJXAorICAgIHZvaWQJCQkJCQkJCVwKKyAgICBfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8Ym9vbD4gX19tLCAgCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lLCBzaXplX3QgX19uKQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIGJvb2wqIF9fb2soX19tLl9NX2RhdGEpOwkJCQkJCVwKKyAgICAgIF9UcCogX19wKF9fYS5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pLCArK19fb2ssICsrX19wKSAgICAgICAgICAgICBcCisgICAgICAgIHsJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJXAorICAgICAgICAgIHdoaWxlICghICpfX29rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgewkJICAgICAgICAgCQkJCQlcCisJICAgICAgKytfX29rOwkJCQkJCQlcCisgICAgICAgICAgICAgICsrX19wOwkJCQkJCQlcCisgICAgICAgICAgICB9CQkJCQkJCQlcCisgICAgICAgICAgKl9fcCBfT3AjIz0gX19lW19faV07CQkJCQkJXAorICAgICAgICB9CQkJCQkJCQlcCisgICAgfQorCisgICBfREVGSU5FX0FSUkFZX0ZVTkNUSU9OKCssIF9fcGx1cykKKyAgIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04oLSwgX19taW51cykKKyAgIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04oKiwgX19tdWx0aXBsaWVzKQorICAgX0RFRklORV9BUlJBWV9GVU5DVElPTigvLCBfX2RpdmlkZXMpCisgICBfREVGSU5FX0FSUkFZX0ZVTkNUSU9OKCUsIF9fbW9kdWx1cykKKyAgIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04oXiwgX19iaXR3aXNlX3hvcikKKyAgIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04ofCwgX19iaXR3aXNlX29yKQorICAgX0RFRklORV9BUlJBWV9GVU5DVElPTigmLCBfX2JpdHdpc2VfYW5kKQorICAgX0RFRklORV9BUlJBWV9GVU5DVElPTig8PCwgX19zaGlmdF9sZWZ0KQorICAgX0RFRklORV9BUlJBWV9GVU5DVElPTig+PiwgX19zaGlmdF9yaWdodCkKKworI3VuZGVmIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjIGluY2x1ZGUgPGJpdHMvdmFsYXJyYXlfYXJyYXkudGNjPgorCisjZW5kaWYgLyogX0FSUkFZX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy92YWxhcnJheV9hcnJheS50Y2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdmFsYXJyYXlfYXJyYXkudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODdlNmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdmFsYXJyYXlfYXJyYXkudGNjCkBAIC0wLDAgKzEsMjQ0IEBACisvLyBUaGUgdGVtcGxhdGUgYW5kIGlubGluZXMgZm9yIHRoZSAtKi0gQysrIC0qLSBpbnRlcm5hbCBfQXJyYXkgaGVscGVyIGNsYXNzLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy92YWxhcnJheV9hcnJheS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2YWxhcnJheX0KKyAqLworCisvLyBXcml0dGVuIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPEdhYnJpZWwuRG9zLVJlaXNARFBUTWF0aHMuRU5TLUNhY2hhbi5Gcj4KKworI2lmbmRlZiBfVkFMQVJSQVlfQVJSQVlfVENDCisjZGVmaW5lIF9WQUxBUlJBWV9BUlJBWV9UQ0MgMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3ZhbGFycmF5X2ZpbGwoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBfQXJyYXk8Ym9vbD4gX19tLAorCQkgICAgY29uc3QgX1RwJiBfX3QpCisgICAgeworICAgICAgX1RwKiBfX3AgPSBfX2EuX01fZGF0YTsKKyAgICAgIGJvb2wqIF9fb2sgKF9fbS5fTV9kYXRhKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faT0wOyBfX2kgPCBfX247ICsrX19pLCArK19fb2ssICsrX19wKQorCXsKKwkgIHdoaWxlICghKl9fb2spCisJICB7CisJICAgICsrX19vazsKKwkgICAgKytfX3A7CisJICB9CisJICAqX19wID0gX190OworCX0KKyAgICB9CisKKyAgLy8gQ29weSBuIGVsZW1lbnRzIG9mIGEgaW50byBjb25zZWN1dGl2ZSBlbGVtZW50cyBvZiBiLiAgV2hlbiBtIGlzCisgIC8vIGZhbHNlLCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIGEgaXMgc2tpcHBlZC4gIG0gbXVzdCBjb250YWluCisgIC8vIGF0IGxlYXN0IG4gdHJ1ZSBlbGVtZW50cy4gIGEgbXVzdCBjb250YWluIGF0IGxlYXN0IG4gZWxlbWVudHMgYW5kCisgIC8vIGVub3VnaCBlbGVtZW50cyB0byBtYXRjaCB1cCB3aXRoIG0gdGhyb3VnaCB0aGUgbnRoIHRydWUgZWxlbWVudAorICAvLyBvZiBtLiAgSS5lLiAgaWYgbiBpcyAxMCwgbSBoYXMgMTUgZWxlbWVudHMgd2l0aCA1IGZhbHNlIGZvbGxvd2VkCisgIC8vIGJ5IDEwIHRydWUsIGEgbXVzdCBoYXZlIDE1IGVsZW1lbnRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxib29sPiBfX20sIF9BcnJheTxfVHA+IF9fYiwKKwkJICAgIHNpemVfdCBfX24pCisgICAgeworICAgICAgX1RwKiBfX3AgKF9fYS5fTV9kYXRhKTsKKyAgICAgIGJvb2wqIF9fb2sgKF9fbS5fTV9kYXRhKTsKKyAgICAgIGZvciAoX1RwKiBfX3EgPSBfX2IuX01fZGF0YTsgX19xIDwgX19iLl9NX2RhdGEgKyBfX247CisJICAgKytfX3EsICsrX19vaywgKytfX3ApCisJeworCSAgd2hpbGUgKCEgKl9fb2spCisJICAgIHsKKwkgICAgICArK19fb2s7CisJICAgICAgKytfX3A7CisJICAgIH0KKwkgICpfX3EgPSAqX19wOworCX0KKyAgICB9CisKKyAgLy8gQ29weSBuIGNvbnNlY3V0aXZlIGVsZW1lbnRzIGZyb20gYSBpbnRvIGVsZW1lbnRzIG9mIGIuICBFbGVtZW50cworICAvLyBvZiBiIGFyZSBza2lwcGVkIGlmIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgbSBpcyBmYWxzZS4gIG0KKyAgLy8gbXVzdCBjb250YWluIGF0IGxlYXN0IG4gdHJ1ZSBlbGVtZW50cy4gIGIgbXVzdCBoYXZlIGF0IGxlYXN0IGFzCisgIC8vIG1hbnkgZWxlbWVudHMgYXMgdGhlIGluZGV4IG9mIHRoZSBudGggdHJ1ZSBlbGVtZW50IG9mIG0uICBJLmUuIGlmCisgIC8vIG0gaGFzIDE1IGVsZW1lbnRzIHdpdGggNSBmYWxzZSBmb2xsb3dlZCBieSAxMCB0cnVlLCBiIG11c3QgaGF2ZQorICAvLyBhdCBsZWFzdCAxNSBlbGVtZW50cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBfQXJyYXk8X1RwPiBfX2IsCisJCSAgICBfQXJyYXk8Ym9vbD4gX19tKQorICAgIHsKKyAgICAgIF9UcCogX19xIChfX2IuX01fZGF0YSk7CisgICAgICBib29sKiBfX29rIChfX20uX01fZGF0YSk7CisgICAgICBmb3IgKF9UcCogX19wID0gX19hLl9NX2RhdGE7IF9fcCA8IF9fYS5fTV9kYXRhK19fbjsKKwkgICArK19fcCwgKytfX29rLCArK19fcSkKKwl7CisJICB3aGlsZSAoISAqX19vaykKKwkgICAgeworCSAgICAgICsrX19vazsKKwkgICAgICArK19fcTsKKwkgICAgfQorCSAgKl9fcSA9ICpfX3A7CisJfQorICAgIH0KKworICAvLyBDb3B5IG4gZWxlbWVudHMgZnJvbSBhIGludG8gZWxlbWVudHMgb2YgYi4gIEVsZW1lbnRzIG9mIGEgYXJlCisgIC8vIHNraXBwZWQgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBtIGlzIGZhbHNlLiAgRWxlbWVudHMgb2YKKyAgLy8gYiBhcmUgc2tpcHBlZCBpZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIGsgaXMgZmFsc2UuICBtIGFuZAorICAvLyBrIG11c3QgY29udGFpbiBhdCBsZWFzdCBuIHRydWUgZWxlbWVudHMuICBhIGFuZCBiIG11c3QgaGF2ZSBhdAorICAvLyBsZWFzdCBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBpbmRleCBvZiB0aGUgbnRoIHRydWUgZWxlbWVudCBvZiBtLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxib29sPiBfX20sIHNpemVfdCBfX24sCisJCSAgICBfQXJyYXk8X1RwPiBfX2IsIF9BcnJheTxib29sPiBfX2spCisgICAgeworICAgICAgX1RwKiBfX3AgKF9fYS5fTV9kYXRhKTsKKyAgICAgIF9UcCogX19xIChfX2IuX01fZGF0YSk7CisgICAgICBib29sKiBfX3NyY29rIChfX20uX01fZGF0YSk7CisgICAgICBib29sKiBfX2RzdG9rIChfX2suX01fZGF0YSk7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247CisJICAgKytfX3NyY29rLCArK19fcCwgKytfX2RzdG9rLCArK19fcSwgKytfX2kpCisJeworCSAgd2hpbGUgKCEgKl9fc3Jjb2spCisJICAgIHsKKwkgICAgICArK19fc3Jjb2s7CisJICAgICAgKytfX3A7CisJICAgIH0KKwkgIHdoaWxlICghICpfX2RzdG9rKSAKKwkgICAgeworCSAgICAgICsrX19kc3RvazsKKwkgICAgICArK19fcTsKKwkgICAgfQorCSAgKl9fcSA9ICpfX3A7CisJfQorICAgIH0KKworICAvLyBDb3B5IG4gY29uc2VjdXRpdmUgZWxlbWVudHMgb2YgZSBpbnRvIGNvbnNlY3V0aXZlIGVsZW1lbnRzIG9mIGEuCisgIC8vIEkuZS4gYVtpXSA9IGVbaV0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgY2xhc3MgX0RvbT4KKyAgICB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSwgc2l6ZV90IF9fbiwgX0FycmF5PF9UcD4gX19hKQorICAgIHsKKyAgICAgIF9UcCogX19wIChfX2EuX01fZGF0YSk7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pLCArK19fcCkKKwkqX19wID0gX19lW19faV07CisgICAgfQorCisgIC8vIENvcHkgbiBjb25zZWN1dGl2ZSBlbGVtZW50cyBvZiBlIGludG8gZWxlbWVudHMgb2YgYSB1c2luZyBzdHJpZGUKKyAgLy8gcy4gIEkuZS4sIGFbMF0gPSBlWzBdLCBhW3NdID0gZVsxXSwgYVsyKnNdID0gZVsyXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBjbGFzcyBfRG9tPgorICAgIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lLCBzaXplX3QgX19uLAorCQkgICAgIF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fcykKKyAgICB7CisgICAgICBfVHAqIF9fcCAoX19hLl9NX2RhdGEpOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgX19wICs9IF9fcykKKwkqX19wID0gX19lW19faV07CisgICAgfQorCisgIC8vIENvcHkgbiBjb25zZWN1dGl2ZSBlbGVtZW50cyBvZiBlIGludG8gZWxlbWVudHMgb2YgYSBpbmRleGVkIGJ5CisgIC8vIGNvbnRlbnRzIG9mIGkuICBJLmUuLCBhW2lbMF1dID0gZVswXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBjbGFzcyBfRG9tPgorICAgIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lLCBzaXplX3QgX19uLAorCQkgICAgX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8c2l6ZV90PiBfX2kpCisgICAgeworICAgICAgc2l6ZV90KiBfX2ogKF9faS5fTV9kYXRhKTsKKyAgICAgIGZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9fbjsgKytfX2ssICsrX19qKQorCV9fYS5fTV9kYXRhWypfX2pdID0gX19lW19fa107CisgICAgfQorCisgIC8vIENvcHkgbiBlbGVtZW50cyBvZiBlIGluZGV4ZWQgYnkgY29udGVudHMgb2YgZiBpbnRvIGVsZW1lbnRzIG9mIGEKKyAgLy8gaW5kZXhlZCBieSBjb250ZW50cyBvZiBpLiAgSS5lLiwgYVtpWzBdXSA9IGVbZlswXV0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+IF9fZSwgX0FycmF5PHNpemVfdD4gX19mLAorCQkgICAgc2l6ZV90IF9fbiwgCisJCSAgICBfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxzaXplX3Q+IF9faSkKKyAgICB7CisgICAgICBzaXplX3QqIF9fZyAoX19mLl9NX2RhdGEpOworICAgICAgc2l6ZV90KiBfX2ogKF9faS5fTV9kYXRhKTsKKyAgICAgIGZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9fbjsgKytfX2ssICsrX19qLCArK19fZykgCisJX19hLl9NX2RhdGFbKl9fal0gPSBfX2UuX01fZGF0YVsqX19nXTsKKyAgICB9CisKKyAgLy8gQ29weSBuIGNvbnNlY3V0aXZlIGVsZW1lbnRzIG9mIGUgaW50byBlbGVtZW50cyBvZiBhLiAgRWxlbWVudHMgb2YKKyAgLy8gYSBhcmUgc2tpcHBlZCBpZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIG0gaXMgZmFsc2UuICBtIG11c3QKKyAgLy8gaGF2ZSBhdCBsZWFzdCBuIHRydWUgZWxlbWVudHMgYW5kIGEgbXVzdCBoYXZlIGF0IGxlYXN0IGFzIG1hbnkKKyAgLy8gZWxlbWVudHMgYXMgdGhlIGluZGV4IG9mIHRoZSBudGggdHJ1ZSBlbGVtZW50IG9mIG0uICBJLmUuIGlmIG0KKyAgLy8gaGFzIDUgZmFsc2UgZm9sbG93ZWQgYnkgMTAgdHJ1ZSBlbGVtZW50cyBhbmQgbiA9PSAxMCwgYSBtdXN0IGhhdmUKKyAgLy8gYXQgbGVhc3QgMTUgZWxlbWVudHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgY2xhc3MgX0RvbT4KKyAgICB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSwgc2l6ZV90IF9fbiwKKwkJICAgIF9BcnJheTxfVHA+IF9fYSwgX0FycmF5PGJvb2w+IF9fbSkKKyAgICB7CisgICAgICBib29sKiBfX29rIChfX20uX01fZGF0YSk7CisgICAgICBfVHAqIF9fcCAoX19hLl9NX2RhdGEpOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgKytfX29rLCArK19fcCkKKwl7CisJICB3aGlsZSAoISAqX19vaykKKwkgICAgeworCSAgICAgICsrX19vazsKKwkgICAgICArK19fcDsKKwkgICAgfQorCSAgKl9fcCA9IF9fZVtfX2ldOworCX0KKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGNsYXNzIF9Eb20+CisgICAgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lLCBzaXplX3QgX19uLAorCQkJICAgICAgX0FycmF5PF9UcD4gX19hKQorICAgIHsKKyAgICAgIF9UcCogX19wIChfX2EuX01fZGF0YSk7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pLCArK19fcCkKKwluZXcgKF9fcCkgX1RwKF9fZVtfX2ldKTsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8Ym9vbD4gX19tLAorCQkJICAgICAgX0FycmF5PF9UcD4gX19iLCBzaXplX3QgX19uKQorICAgIHsKKyAgICAgIF9UcCogX19wIChfX2EuX01fZGF0YSk7CisgICAgICBib29sKiBfX29rIChfX20uX01fZGF0YSk7CisgICAgICBmb3IgKF9UcCogX19xID0gX19iLl9NX2RhdGE7IF9fcSA8IF9fYi5fTV9kYXRhK19fbjsgKytfX3EsICsrX19vaywgKytfX3ApCisJeworCSAgd2hpbGUgKCEgKl9fb2spCisJICAgIHsKKwkgICAgICArK19fb2s7CisJICAgICAgKytfX3A7CisJICAgIH0KKwkgIG5ldyAoX19xKSBfVHAoKl9fcCk7CisJfQorICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1ZBTEFSUkFZX0FSUkFZX1RDQyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3ZhbGFycmF5X2JlZm9yZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3ZhbGFycmF5X2JlZm9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNTczMWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdmFsYXJyYXlfYmVmb3JlLmgKQEAgLTAsMCArMSw3MzMgQEAKKy8vIFRoZSB0ZW1wbGF0ZSBhbmQgaW5saW5lcyBmb3IgdGhlIC0qLSBDKysgLSotIGludGVybmFsIF9NZXRhIGNsYXNzLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy92YWxhcnJheV9iZWZvcmUuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3ZhbGFycmF5fQorICovCisKKy8vIFdyaXR0ZW4gYnkgR2FicmllbCBEb3MgUmVpcyA8R2FicmllbC5Eb3MtUmVpc0BjbWxhLmVucy1jYWNoYW4uZnI+CisKKyNpZm5kZWYgX1ZBTEFSUkFZX0JFRk9SRV9ICisjZGVmaW5lIF9WQUxBUlJBWV9CRUZPUkVfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvc2xpY2VfYXJyYXkuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vCisgIC8vIEltcGxlbWVudGluZyBhIGxvb3NlbmVkIHZhbGFycmF5IHJldHVybiB2YWx1ZSBpcyB0cmlja3kuCisgIC8vIEZpcnN0IHdlIG5lZWQgdG8gbWVldCAyNi4zLjEvMzogd2Ugc2hvdWxkIG5vdCBhZGQgbW9yZSB0aGFuCisgIC8vIHR3byBsZXZlbHMgb2YgdGVtcGxhdGUgbmVzdGluZy4gVGhlcmVmb3JlIHdlIHJlc29ydCB0byB0ZW1wbGF0ZQorICAvLyB0ZW1wbGF0ZSB0byAiZmxhdHRlbiIgbG9vc2VuZWQgcmV0dXJuIHZhbHVlIHR5cGVzLgorICAvLyBBdCBzb21lIHBvaW50IHdlIHVzZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIHRvIHJlbW92ZSBvbmUgbGV2ZWwKKyAgLy8gdGVtcGxhdGUgbmVzdGluZyBkdWUgdG8gX0V4cHI8PgorICAvLworCisgIC8vIFRoaXMgY2xhc3MgaXMgTk9UIGRlZmluZWQuIEl0IGRvZXNuJ3QgbmVlZCB0by4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4gY2xhc3MgX0NvbnN0YW50OworCisgIC8vIEltcGxlbWVudGF0aW9ucyBvZiB1bmFyeSBmdW5jdGlvbnMgYXBwbGllZCB0byB2YWxhcnJheTw+cy4KKyAgLy8gSSB1c2UgaGFyZC1jb2RlZCBvYmplY3QgZnVuY3Rpb25zIGhlcmUgaW5zdGVhZCBvZiBhIGdlbmVyaWMKKyAgLy8gYXBwcm9hY2ggbGlrZSBwb2ludGVycyB0byBmdW5jdGlvbjoKKyAgLy8gICAgMSkgY29ycmVjdG5lc3M6IHNvbWUgZnVuY3Rpb25zIHRha2UgcmVmZXJlbmNlcywgb3RoZXJzIHZhbHVlcy4KKyAgLy8gICAgICAgd2UgY2FuJ3QgZGVkdWNlIHRoZSBjb3JyZWN0IHR5cGUgYWZ0ZXJ3YXJkcy4KKyAgLy8gICAgMikgZWZmaWNpZW5jeSAtLSBvYmplY3QgZnVuY3Rpb25zIGNhbiBiZSBlYXNpbHkgaW5saW5lZAorICAvLyAgICAzKSBiZSBLb2VuaWctbG9va3VwLWZyaWVuZGx5CisKKyAgc3RydWN0IF9BYnMKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gYWJzKF9fdCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX0NvcworICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiBjb3MoX190KTsgfQorICB9OworCisgIHN0cnVjdCBfQWNvcworICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiBhY29zKF9fdCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX0Nvc2gKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gY29zaChfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9TaW4KKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gc2luKF9fdCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX0FzaW4KKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gYXNpbihfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9TaW5oCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNpbmgoX190KTsgfQorICB9OworCisgIHN0cnVjdCBfVGFuCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRhbihfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9BdGFuCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGF0YW4oX190KTsgfQorICB9OworCisgIHN0cnVjdCBfVGFuaAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiB0YW5oKF9fdCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX0V4cAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiBleHAoX190KTsgfQorICB9OworCisgIHN0cnVjdCBfTG9nCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGxvZyhfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9Mb2cxMAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiBsb2cxMChfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9TcXJ0CisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNxcnQoX190KTsgfQorICB9OworCisgIC8vIEluIHRoZSBwYXN0LCB3ZSB1c2VkIHRvIHRhaWxvciBvcGVyYXRvciBhcHBsaWNhdGlvbnMgc2VtYW50aWNzCisgIC8vIHRvIHRoZSBzcGVjaWFsaXphdGlvbiBvZiBzdGFuZGFyZCBmdW5jdGlvbiBvYmplY3RzIChpLmUuIHBsdXM8PiwgZXRjLikKKyAgLy8gVGhhdCBpcyBpbmNvcnJlY3QuICBUaGVyZWZvcmUgd2UgcHJvdmlkZSBvdXIgb3duIHN1cnJvZ2F0ZXMuCisKKyAgc3RydWN0IF9fdW5hcnlfcGx1cworICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiArX190OyB9CisgIH07CisKKyAgc3RydWN0IF9fbmVnYXRlCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIC1fX3Q7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19iaXR3aXNlX25vdAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiB+X190OyB9CisgIH07CisKKyAgc3RydWN0IF9fcGx1cworICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ICsgX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fbWludXMKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAtIF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX211bHRpcGxpZXMKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAqIF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX2RpdmlkZXMKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAvIF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX21vZHVsdXMKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAlIF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX2JpdHdpc2VfeG9yCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggXiBfX3k7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19iaXR3aXNlX2FuZAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ICYgX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fYml0d2lzZV9vcgorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IHwgX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fc2hpZnRfbGVmdAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IDw8IF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX3NoaWZ0X3JpZ2h0CisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggPj4gX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fbG9naWNhbF9hbmQKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggJiYgX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fbG9naWNhbF9vcgorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCB8fCBfX3k7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19sb2dpY2FsX25vdAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gIV9feDsgfQorICB9OworCisgIHN0cnVjdCBfX2VxdWFsX3RvCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ID09IF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX25vdF9lcXVhbF90bworICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAhPSBfX3k7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19sZXNzCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IDwgX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fZ3JlYXRlcgorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCA+IF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX2xlc3NfZXF1YWwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggPD0gX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fZ3JlYXRlcl9lcXVhbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCA+PSBfX3k7IH0KKyAgfTsKKworICAvLyBUaGUgZmV3IGJpbmFyeSBmdW5jdGlvbnMgd2UgbWlzcy4KKyAgc3RydWN0IF9BdGFuMgorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gYXRhbjIoX194LCBfX3kpOyB9CisgIH07CisKKyAgc3RydWN0IF9Qb3cKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHBvdyhfX3gsIF9feSk7IH0KKyAgfTsKKworCisgIC8vIFdlIG5lZWQgdGhlc2UgYml0cyBpbiBvcmRlciB0byByZWNvdmVyIHRoZSByZXR1cm4gdHlwZSBvZgorICAvLyBzb21lIGZ1bmN0aW9ucy9vcGVyYXRvcnMgbm93IHRoYXQgd2UncmUgbm8gbG9uZ2VyIHVzaW5nCisgIC8vIGZ1bmN0aW9uIHRlbXBsYXRlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19mdW4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIC8vIHNldmVyYWwgc3BlY2lhbGl6YXRpb25zIGZvciByZWxhdGlvbmFsIG9wZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2Z1bjxfX2xvZ2ljYWxfbm90LCBfVHA+CisgICAgeworICAgICAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2Z1bjxfX2xvZ2ljYWxfYW5kLCBfVHA+CisgICAgeworICAgICAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2Z1bjxfX2xvZ2ljYWxfb3IsIF9UcD4KKyAgICB7CisgICAgICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fZnVuPF9fbGVzcywgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19mdW48X19ncmVhdGVyLCBfVHA+CisgICAgeworICAgICAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2Z1bjxfX2xlc3NfZXF1YWwsIF9UcD4KKyAgICB7CisgICAgICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fZnVuPF9fZ3JlYXRlcl9lcXVhbCwgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19mdW48X19lcXVhbF90bywgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19mdW48X19ub3RfZXF1YWxfdG8sIF9UcD4KKyAgICB7CisgICAgICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICAvLworICAvLyBBcHBseSBmdW5jdGlvbiB0YWtpbmcgYSB2YWx1ZS9jb25zdCByZWZlcmVuY2UgY2xvc3VyZQorICAvLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Eb20sIHR5cGVuYW1lIF9Bcmc+CisgICAgY2xhc3MgX0Z1bkJhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9GdW5CYXNlKGNvbnN0IF9Eb20mIF9fZSwgdmFsdWVfdHlwZSBfX2YoX0FyZykpCisgICAgICA6IF9NX2V4cHIoX19lKSwgX01fZnVuYyhfX2YpIHt9CisKKyAgICAgIHZhbHVlX3R5cGUgb3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZnVuYyAoX01fZXhwcltfX2ldKTsgfQorCisgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2V4cHIuc2l6ZSAoKTt9CisKKyAgICBwcml2YXRlOgorICAgICAgY29uc3QgX0RvbSYgX01fZXhwcjsKKyAgICAgIHZhbHVlX3R5cGUgKCpfTV9mdW5jKShfQXJnKTsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgc3RydWN0IF9WYWxGdW5DbG9zPF9FeHByLF9Eb20+IDogX0Z1bkJhc2U8X0RvbSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5CYXNlPF9Eb20sIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlIF9UcDsKKworICAgICAgX1ZhbEZ1bkNsb3MoY29uc3QgX0RvbSYgX19lLCBfVHAgX19mKF9UcCkpIDogX0Jhc2UoX19lLCBfX2YpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9WYWxGdW5DbG9zPF9WYWxBcnJheSxfVHA+IDogX0Z1bkJhc2U8dmFsYXJyYXk8X1RwPiwgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z1bkJhc2U8dmFsYXJyYXk8X1RwPiwgX1RwPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgICAgIF9WYWxGdW5DbG9zKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdiwgX1RwIF9fZihfVHApKSA6IF9CYXNlKF9fdiwgX19mKSB7fQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICBzdHJ1Y3QgX1JlZkZ1bkNsb3M8X0V4cHIsIF9Eb20+CisgICAgOiBfRnVuQmFzZTxfRG9tLCBjb25zdCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlJj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5CYXNlPF9Eb20sIGNvbnN0IHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUmPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSBfVHA7CisKKyAgICAgIF9SZWZGdW5DbG9zKGNvbnN0IF9Eb20mIF9fZSwgX1RwIF9fZihjb25zdCBfVHAmKSkKKyAgICAgIDogX0Jhc2UoX19lLCBfX2YpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZGdW5DbG9zPF9WYWxBcnJheSwgX1RwPgorICAgIDogX0Z1bkJhc2U8dmFsYXJyYXk8X1RwPiwgY29uc3QgX1RwJj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5CYXNlPHZhbGFycmF5PF9UcD4sIGNvbnN0IF9UcCY+IF9CYXNlOworICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworICAgICAgX1JlZkZ1bkNsb3MoY29uc3QgdmFsYXJyYXk8X1RwPiYgX192LCBfVHAgX19mKGNvbnN0IF9UcCYpKQorICAgICAgOiBfQmFzZShfX3YsIF9fZikge30KKyAgICB9OworCisgIC8vCisgIC8vIFVuYXJ5IGV4cHJlc3Npb24gY2xvc3VyZS4KKyAgLy8KKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgY2xhc3MgX0FyZz4KKyAgICBjbGFzcyBfVW5CYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZzo6dmFsdWVfdHlwZSBfVnQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9PcGVyLCBfVnQ+OjpyZXN1bHRfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfVW5CYXNlKGNvbnN0IF9BcmcmIF9fZSkgOiBfTV9leHByKF9fZSkge30KKworICAgICAgdmFsdWVfdHlwZSBvcGVyYXRvcltdKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICB7IHJldHVybiBfT3BlcigpKF9NX2V4cHJbX19pXSk7IH0KKworICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9leHByLnNpemUoKTsgfQorICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9BcmcmIF9NX2V4cHI7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgY2xhc3MgX0RvbT4KKyAgICBzdHJ1Y3QgX1VuQ2xvczxfT3BlciwgX0V4cHIsIF9Eb20+CisgICAgOiBfVW5CYXNlPF9PcGVyLCBfRG9tPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RvbSBfQXJnOworICAgICAgdHlwZWRlZiBfVW5CYXNlPF9PcGVyLCBfRG9tPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX1VuQ2xvcyhjb25zdCBfQXJnJiBfX2UpIDogX0Jhc2UoX19lKSB7fQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1VuQ2xvczxfT3BlciwgX1ZhbEFycmF5LCBfVHA+CisgICAgOiBfVW5CYXNlPF9PcGVyLCB2YWxhcnJheTxfVHA+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIHZhbGFycmF5PF9UcD4gX0FyZzsKKyAgICAgIHR5cGVkZWYgX1VuQmFzZTxfT3BlciwgdmFsYXJyYXk8X1RwPiA+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfVW5DbG9zKGNvbnN0IF9BcmcmIF9fZSkgOiBfQmFzZShfX2UpIHt9CisgICAgfTsKKworCisgIC8vCisgIC8vIEJpbmFyeSBleHByZXNzaW9uIGNsb3N1cmUuCisgIC8vCisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsIGNsYXNzIF9GaXJzdEFyZywgY2xhc3MgX1NlY29uZEFyZz4KKyAgICBjbGFzcyBfQmluQmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9GaXJzdEFyZzo6dmFsdWVfdHlwZSBfVnQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9PcGVyLCBfVnQ+OjpyZXN1bHRfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQmFzZShjb25zdCBfRmlyc3RBcmcmIF9fZTEsIGNvbnN0IF9TZWNvbmRBcmcmIF9fZTIpCisgICAgICA6IF9NX2V4cHIxKF9fZTEpLCBfTV9leHByMihfX2UyKSB7fQorCisgICAgICB2YWx1ZV90eXBlIG9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9PcGVyKCkoX01fZXhwcjFbX19pXSwgX01fZXhwcjJbX19pXSk7IH0KKworICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9leHByMS5zaXplKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBfRmlyc3RBcmcmIF9NX2V4cHIxOworICAgICAgY29uc3QgX1NlY29uZEFyZyYgX01fZXhwcjI7CisgICAgfTsKKworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCBjbGFzcyBfQ2xvcz4KKyAgICBjbGFzcyBfQmluQmFzZTIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2xvczo6dmFsdWVfdHlwZSBfVnQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9PcGVyLCBfVnQ+OjpyZXN1bHRfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQmFzZTIoY29uc3QgX0Nsb3MmIF9fZSwgY29uc3QgX1Z0JiBfX3QpCisgICAgICA6IF9NX2V4cHIxKF9fZSksIF9NX2V4cHIyKF9fdCkge30KKworICAgICAgdmFsdWVfdHlwZSBvcGVyYXRvcltdKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICB7IHJldHVybiBfT3BlcigpKF9NX2V4cHIxW19faV0sIF9NX2V4cHIyKTsgfQorCisgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2V4cHIxLnNpemUoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9DbG9zJiBfTV9leHByMTsKKyAgICAgIGNvbnN0IF9WdCYgX01fZXhwcjI7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgY2xhc3MgX0Nsb3M+CisgICAgY2xhc3MgX0JpbkJhc2UxCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Nsb3M6OnZhbHVlX3R5cGUgX1Z0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfT3BlciwgX1Z0Pjo6cmVzdWx0X3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX0JpbkJhc2UxKGNvbnN0IF9WdCYgX190LCBjb25zdCBfQ2xvcyYgX19lKQorICAgICAgOiBfTV9leHByMShfX3QpLCBfTV9leHByMihfX2UpIHt9CisKKyAgICAgIHZhbHVlX3R5cGUgb3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdAorICAgICAgeyByZXR1cm4gX09wZXIoKShfTV9leHByMSwgX01fZXhwcjJbX19pXSk7IH0KKworICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9leHByMi5zaXplKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBfVnQmIF9NX2V4cHIxOworICAgICAgY29uc3QgX0Nsb3MmIF9NX2V4cHIyOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsIGNsYXNzIF9Eb20xLCBjbGFzcyBfRG9tMj4KKyAgICBzdHJ1Y3QgX0JpbkNsb3M8X09wZXIsIF9FeHByLCBfRXhwciwgX0RvbTEsIF9Eb20yPgorICAgIDogX0JpbkJhc2U8X09wZXIsIF9Eb20xLCBfRG9tMj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9CaW5CYXNlPF9PcGVyLCBfRG9tMSwgX0RvbTI+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQ2xvcyhjb25zdCBfRG9tMSYgX19lMSwgY29uc3QgX0RvbTImIF9fZTIpIDogX0Jhc2UoX19lMSwgX19lMikge30KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9CaW5DbG9zPF9PcGVyLF9WYWxBcnJheSwgX1ZhbEFycmF5LCBfVHAsIF9UcD4KKyAgICA6IF9CaW5CYXNlPF9PcGVyLCB2YWxhcnJheTxfVHA+LCB2YWxhcnJheTxfVHA+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9CaW5CYXNlPF9PcGVyLCB2YWxhcnJheTxfVHA+LCB2YWxhcnJheTxfVHA+ID4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9CaW5DbG9zKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdiwgY29uc3QgdmFsYXJyYXk8X1RwPiYgX193KQorICAgICAgOiBfQmFzZShfX3YsIF9fdykge30KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCBjbGFzcyBfRG9tPgorICAgIHN0cnVjdCBfQmluQ2xvczxfT3BlciwgX0V4cHIsIF9WYWxBcnJheSwgX0RvbSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4KKyAgICA6IF9CaW5CYXNlPF9PcGVyLCBfRG9tLCB2YWxhcnJheTx0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiA+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsKKyAgICAgIHR5cGVkZWYgX0JpbkJhc2U8X09wZXIsX0RvbSx2YWxhcnJheTxfVHA+ID4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9CaW5DbG9zKGNvbnN0IF9Eb20mIF9fZTEsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fZTIpCisgICAgICA6IF9CYXNlKF9fZTEsIF9fZTIpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgY2xhc3MgX0RvbT4KKyAgICBzdHJ1Y3QgX0JpbkNsb3M8X09wZXIsIF9WYWxBcnJheSwgX0V4cHIsIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUsIF9Eb20+CisgICAgOiBfQmluQmFzZTxfT3BlciwgdmFsYXJyYXk8dHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4sX0RvbT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUgX1RwOworICAgICAgdHlwZWRlZiBfQmluQmFzZTxfT3BlciwgdmFsYXJyYXk8X1RwPiwgX0RvbT4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9CaW5DbG9zKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fZTEsIGNvbnN0IF9Eb20mIF9fZTIpCisgICAgICA6IF9CYXNlKF9fZTEsIF9fZTIpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgY2xhc3MgX0RvbT4KKyAgICBzdHJ1Y3QgX0JpbkNsb3M8X09wZXIsIF9FeHByLCBfQ29uc3RhbnQsIF9Eb20sIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+CisgICAgOiBfQmluQmFzZTI8X09wZXIsIF9Eb20+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsKKyAgICAgIHR5cGVkZWYgX0JpbkJhc2UyPF9PcGVyLF9Eb20+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQ2xvcyhjb25zdCBfRG9tJiBfX2UxLCBjb25zdCBfVHAmIF9fZTIpIDogX0Jhc2UoX19lMSwgX19lMikge30KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCBjbGFzcyBfRG9tPgorICAgIHN0cnVjdCBfQmluQ2xvczxfT3BlciwgX0NvbnN0YW50LCBfRXhwciwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSwgX0RvbT4KKyAgICA6IF9CaW5CYXNlMTxfT3BlciwgX0RvbT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUgX1RwOworICAgICAgdHlwZWRlZiBfQmluQmFzZTE8X09wZXIsIF9Eb20+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQ2xvcyhjb25zdCBfVHAmIF9fZTEsIGNvbnN0IF9Eb20mIF9fZTIpIDogX0Jhc2UoX19lMSwgX19lMikge30KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9CaW5DbG9zPF9PcGVyLCBfVmFsQXJyYXksIF9Db25zdGFudCwgX1RwLCBfVHA+CisgICAgOiBfQmluQmFzZTI8X09wZXIsIHZhbGFycmF5PF9UcD4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0JpbkJhc2UyPF9PcGVyLHZhbGFycmF5PF9UcD4gPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX0JpbkNsb3MoY29uc3QgdmFsYXJyYXk8X1RwPiYgX192LCBjb25zdCBfVHAmIF9fdCkgOiBfQmFzZShfX3YsIF9fdCkge30KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9CaW5DbG9zPF9PcGVyLCBfQ29uc3RhbnQsIF9WYWxBcnJheSwgX1RwLCBfVHA+CisgICAgOiBfQmluQmFzZTE8X09wZXIsIHZhbGFycmF5PF9UcD4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0JpbkJhc2UxPF9PcGVyLCB2YWxhcnJheTxfVHA+ID4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9CaW5DbG9zKGNvbnN0IF9UcCYgX190LCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpIDogX0Jhc2UoX190LCBfX3YpIHt9CisgICAgfTsKKworICAgIC8vCisgICAgLy8gc2xpY2VfYXJyYXkgY2xvc3VyZS4KKyAgICAvLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRG9tPiAKKyAgICBjbGFzcyBfU0Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICAKKyAgICAgIF9TQmFzZSAoY29uc3QgX0RvbSYgX19lLCBjb25zdCBzbGljZSYgX19zKQorICAgICAgOiBfTV9leHByIChfX2UpLCBfTV9zbGljZSAoX19zKSB7fQorICAgICAgICAKKyAgICAgIHZhbHVlX3R5cGUKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHByW19NX3NsaWNlLnN0YXJ0ICgpICsgX19pICogX01fc2xpY2Uuc3RyaWRlICgpXTsgfQorICAgICAgICAKKyAgICAgIHNpemVfdAorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9zbGljZS5zaXplICgpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgY29uc3QgX0RvbSYgX01fZXhwcjsKKyAgICAgIGNvbnN0IHNsaWNlJiBfTV9zbGljZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfU0Jhc2U8X0FycmF5PF9UcD4gPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICAgICAgCisgICAgICBfU0Jhc2UgKF9BcnJheTxfVHA+IF9fYSwgY29uc3Qgc2xpY2UmIF9fcykKKyAgICAgIDogX01fYXJyYXkgKF9fYS5fTV9kYXRhK19fcy5zdGFydCgpKSwgX01fc2l6ZSAoX19zLnNpemUoKSksCisJX01fc3RyaWRlIChfX3Muc3RyaWRlKCkpIHt9CisgICAgICAgIAorICAgICAgdmFsdWVfdHlwZQorICAgICAgb3BlcmF0b3JbXSAoc2l6ZV90IF9faSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2FycmF5Ll9NX2RhdGFbX19pICogX01fc3RyaWRlXTsgfQorICAgICAgCisgICAgICBzaXplX3QKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fc2l6ZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9BcnJheTxfVHA+IF9NX2FycmF5OworICAgICAgY29uc3Qgc2l6ZV90IF9NX3NpemU7CisgICAgICBjb25zdCBzaXplX3QgX01fc3RyaWRlOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICBzdHJ1Y3QgX1NDbG9zPF9FeHByLCBfRG9tPgorICAgIDogX1NCYXNlPF9Eb20+CisgICAgeworICAgICAgdHlwZWRlZiBfU0Jhc2U8X0RvbT4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICAKKyAgICAgIF9TQ2xvcyAoY29uc3QgX0RvbSYgX19lLCBjb25zdCBzbGljZSYgX19zKSA6IF9CYXNlIChfX2UsIF9fcykge30KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1NDbG9zPF9WYWxBcnJheSwgX1RwPgorICAgIDogX1NCYXNlPF9BcnJheTxfVHA+ID4KKyAgICB7CisgICAgICB0eXBlZGVmICBfU0Jhc2U8X0FycmF5PF9UcD4gPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgICAgICAKKyAgICAgIF9TQ2xvcyAoX0FycmF5PF9UcD4gX19hLCBjb25zdCBzbGljZSYgX19zKSA6IF9CYXNlIChfX2EsIF9fcykge30KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfQ1BQX1ZBTEFSUkFZX0JFRk9SRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdmVjdG9yLnRjYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy92ZWN0b3IudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ODJmZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdmVjdG9yLnRjYwpAQCAtMCwwICsxLDg1OCBAQAorLy8gVmVjdG9yIGltcGxlbWVudGF0aW9uIChvdXQgb2YgbGluZSkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzICBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy92ZWN0b3IudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dmVjdG9yfQorICovCisKKyNpZm5kZWYgX1ZFQ1RPUl9UQ0MKKyNkZWZpbmUgX1ZFQ1RPUl9UQ0MgMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgdmVjdG9yPF9UcCwgX0FsbG9jPjo6CisgICAgcmVzZXJ2ZShzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIGlmIChfX24gPiB0aGlzLT5tYXhfc2l6ZSgpKQorCV9fdGhyb3dfbGVuZ3RoX2Vycm9yKF9fTigidmVjdG9yOjpyZXNlcnZlIikpOworICAgICAgaWYgKHRoaXMtPmNhcGFjaXR5KCkgPCBfX24pCisJeworCSAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBzaXplKCk7CisJICBwb2ludGVyIF9fdG1wID0gX01fYWxsb2NhdGVfYW5kX2NvcHkoX19uLAorCSAgICBfR0xJQkNYWF9NQUtFX01PVkVfSUZfTk9FWENFUFRfSVRFUkFUT1IodGhpcy0+X01faW1wbC5fTV9zdGFydCksCisJICAgIF9HTElCQ1hYX01BS0VfTU9WRV9JRl9OT0VYQ0VQVF9JVEVSQVRPUih0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCkpOworCSAgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICBfTV9kZWFsbG9jYXRlKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQl0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQktIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworCSAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9fdG1wOworCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX3RtcCArIF9fb2xkX3NpemU7CisJICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gdGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9fbjsKKwl9CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHZvaWQKKyAgICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgICAgZW1wbGFjZV9iYWNrKF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgeworCWlmICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAhPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlKQorCSAgeworCSAgICBfQWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QodGhpcy0+X01faW1wbCwgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgICArK3RoaXMtPl9NX2ltcGwuX01fZmluaXNoOworCSAgfQorCWVsc2UKKwkgIF9NX2VtcGxhY2VfYmFja19hdXgoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIHZlY3RvcjxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgdmVjdG9yPF9UcCwgX0FsbG9jPjo6CisgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19uID0gX19wb3NpdGlvbiAtIGJlZ2luKCk7CisgICAgICBpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2ggIT0gdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCSAgJiYgX19wb3NpdGlvbiA9PSBlbmQoKSkKKwl7CisJICBfQWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QodGhpcy0+X01faW1wbCwgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsIF9feCk7CisJICArK3RoaXMtPl9NX2ltcGwuX01fZmluaXNoOworCX0KKyAgICAgIGVsc2UKKwl7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCSAgaWYgKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICE9IHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UpCisJICAgIHsKKwkgICAgICBfVHAgX194X2NvcHkgPSBfX3g7CisJICAgICAgX01faW5zZXJ0X2F1eChfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194X2NvcHkpKTsKKwkgICAgfQorCSAgZWxzZQorI2VuZGlmCisJICAgIF9NX2luc2VydF9hdXgoX19wb3NpdGlvbiwgX194KTsKKwl9CisgICAgICByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9fbik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIHZlY3RvcjxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgdmVjdG9yPF9UcCwgX0FsbG9jPjo6CisgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICB7CisgICAgICBpZiAoX19wb3NpdGlvbiArIDEgIT0gZW5kKCkpCisJX0dMSUJDWFhfTU9WRTMoX19wb3NpdGlvbiArIDEsIGVuZCgpLCBfX3Bvc2l0aW9uKTsKKyAgICAgIC0tdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisgICAgICBfQWxsb2NfdHJhaXRzOjpkZXN0cm95KHRoaXMtPl9NX2ltcGwsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoKTsKKyAgICAgIHJldHVybiBfX3Bvc2l0aW9uOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgaWYgKF9fbGFzdCAhPSBlbmQoKSkKKwkgICAgX0dMSUJDWFhfTU9WRTMoX19sYXN0LCBlbmQoKSwgX19maXJzdCk7CisJICBfTV9lcmFzZV9hdF9lbmQoX19maXJzdC5iYXNlKCkgKyAoZW5kKCkgLSBfX2xhc3QpKTsKKwl9CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdmVjdG9yPF9UcCwgX0FsbG9jPiYKKyAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICBvcGVyYXRvcj0oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX194KQorICAgIHsKKyAgICAgIGlmICgmX194ICE9IHRoaXMpCisJeworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkgIGlmIChfQWxsb2NfdHJhaXRzOjpfU19wcm9wYWdhdGVfb25fY29weV9hc3NpZ24oKSkKKwkgICAgeworCSAgICAgIGlmICghX0FsbG9jX3RyYWl0czo6X1NfYWx3YXlzX2VxdWFsKCkKKwkgICAgICAgICAgJiYgX01fZ2V0X1RwX2FsbG9jYXRvcigpICE9IF9feC5fTV9nZXRfVHBfYWxsb2NhdG9yKCkpCisJICAgICAgICB7CisJCSAgLy8gcmVwbGFjZW1lbnQgYWxsb2NhdG9yIGNhbm5vdCBmcmVlIGV4aXN0aW5nIHN0b3JhZ2UKKwkJICB0aGlzLT5jbGVhcigpOworCQkgIF9NX2RlYWxsb2NhdGUodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQl0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQkJLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkJICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gbnVsbHB0cjsKKwkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IG51bGxwdHI7CisJCSAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IG51bGxwdHI7CisJCX0KKwkgICAgICBzdGQ6Ol9fYWxsb2Nfb25fY29weShfTV9nZXRfVHBfYWxsb2NhdG9yKCksCisJCQkJICAgX194Ll9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICAgIH0KKyNlbmRpZgorCSAgY29uc3Qgc2l6ZV90eXBlIF9feGxlbiA9IF9feC5zaXplKCk7CisJICBpZiAoX194bGVuID4gY2FwYWNpdHkoKSkKKwkgICAgeworCSAgICAgIHBvaW50ZXIgX190bXAgPSBfTV9hbGxvY2F0ZV9hbmRfY29weShfX3hsZW4sIF9feC5iZWdpbigpLAorCQkJCQkJICAgX194LmVuZCgpKTsKKwkgICAgICBzdGQ6Ol9EZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICAgICAgX01fZGVhbGxvY2F0ZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJICAgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UKKwkJCSAgICAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX3RtcDsKKwkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gdGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9feGxlbjsKKwkgICAgfQorCSAgZWxzZSBpZiAoc2l6ZSgpID49IF9feGxlbikKKwkgICAgeworCSAgICAgIHN0ZDo6X0Rlc3Ryb3koc3RkOjpjb3B5KF9feC5iZWdpbigpLCBfX3guZW5kKCksIGJlZ2luKCkpLAorCQkJICAgIGVuZCgpLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdGQ6OmNvcHkoX194Ll9NX2ltcGwuX01fc3RhcnQsIF9feC5fTV9pbXBsLl9NX3N0YXJ0ICsgc2l6ZSgpLAorCQkJdGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisJICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9feC5fTV9pbXBsLl9NX3N0YXJ0ICsgc2l6ZSgpLAorCQkJCQkgIF9feC5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICB9CisJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX3hsZW47CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgdmVjdG9yPF9UcCwgX0FsbG9jPjo6CisgICAgX01fZmlsbF9hc3NpZ24oc2l6ZV90IF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpCisgICAgeworICAgICAgaWYgKF9fbiA+IGNhcGFjaXR5KCkpCisJeworCSAgdmVjdG9yIF9fdG1wKF9fbiwgX192YWwsIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICBfX3RtcC5zd2FwKCp0aGlzKTsKKwl9CisgICAgICBlbHNlIGlmIChfX24gPiBzaXplKCkpCisJeworCSAgc3RkOjpmaWxsKGJlZ2luKCksIGVuZCgpLCBfX3ZhbCk7CisJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX25fYSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJX19uIC0gc2l6ZSgpLCBfX3ZhbCwKKwkJCQkJX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IF9fbiAtIHNpemUoKTsKKwl9CisgICAgICBlbHNlCisgICAgICAgIF9NX2VyYXNlX2F0X2VuZChzdGQ6OmZpbGxfbih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCBfX24sIF9fdmFsKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgdmVjdG9yPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9hc3NpZ25fYXV4KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCXBvaW50ZXIgX19jdXIodGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fY3VyICE9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoOworCSAgICAgKytfX2N1ciwgKytfX2ZpcnN0KQorCSAgKl9fY3VyID0gKl9fZmlyc3Q7CisJaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgX01fZXJhc2VfYXRfZW5kKF9fY3VyKTsKKwllbHNlCisJICBpbnNlcnQoZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgICAgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwljb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisKKwlpZiAoX19sZW4gPiBjYXBhY2l0eSgpKQorCSAgeworCSAgICBwb2ludGVyIF9fdG1wKF9NX2FsbG9jYXRlX2FuZF9jb3B5KF9fbGVuLCBfX2ZpcnN0LCBfX2xhc3QpKTsKKwkgICAgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCSAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICAgX01fZGVhbGxvY2F0ZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQkgIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisJICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX3RtcDsKKwkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19sZW47CisJICAgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKwkgIH0KKwllbHNlIGlmIChzaXplKCkgPj0gX19sZW4pCisJICBfTV9lcmFzZV9hdF9lbmQoc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01faW1wbC5fTV9zdGFydCkpOworCWVsc2UKKwkgIHsKKwkgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IF9fZmlyc3Q7CisJICAgIHN0ZDo6YWR2YW5jZShfX21pZCwgc2l6ZSgpKTsKKwkgICAgc3RkOjpjb3B5KF9fZmlyc3QsIF9fbWlkLCB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPQorCSAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX21pZCwgX19sYXN0LAorCQkJCQkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICB9CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdHlwZW5hbWUgdmVjdG9yPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwljb25zdCBzaXplX3R5cGUgX19uID0gX19wb3NpdGlvbiAtIGJlZ2luKCk7CisJaWYgKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICE9IHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UKKwkgICAgJiYgX19wb3NpdGlvbiA9PSBlbmQoKSkKKwkgIHsKKwkgICAgX0FsbG9jX3RyYWl0czo6Y29uc3RydWN0KHRoaXMtPl9NX2ltcGwsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCSAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgICAgKyt0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKwkgIH0KKwllbHNlCisJICBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24sIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX24pOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdm9pZAorICAgICAgdmVjdG9yPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmdzJiYuLi4gX19hcmdzKQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgIF9NX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgX1RwJiBfX3gpCisjZW5kaWYKKyAgICB7CisgICAgICBpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2ggIT0gdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSkKKwl7CisJICBfQWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QodGhpcy0+X01faW1wbCwgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkgICAgICAgICAgIF9HTElCQ1hYX01PVkUoKih0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaAorCQkJCSAgICAgICAgICAgICAgICAgICAtIDEpKSk7CisJICArK3RoaXMtPl9NX2ltcGwuX01fZmluaXNoOworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorCSAgX1RwIF9feF9jb3B5ID0gX194OworI2VuZGlmCisJICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX3Bvc2l0aW9uLmJhc2UoKSwKKwkJCQkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoIC0gMiwKKwkJCQkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoIC0gMSk7CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisJICAqX19wb3NpdGlvbiA9IF9feF9jb3B5OworI2Vsc2UKKwkgICpfX3Bvc2l0aW9uID0gX1RwKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisjZW5kaWYKKwl9CisgICAgICBlbHNlCisJeworCSAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0KKwkgICAgX01fY2hlY2tfbGVuKHNpemVfdHlwZSgxKSwgInZlY3Rvcjo6X01faW5zZXJ0X2F1eCIpOworCSAgY29uc3Qgc2l6ZV90eXBlIF9fZWxlbXNfYmVmb3JlID0gX19wb3NpdGlvbiAtIGJlZ2luKCk7CisJICBwb2ludGVyIF9fbmV3X3N0YXJ0KHRoaXMtPl9NX2FsbG9jYXRlKF9fbGVuKSk7CisJICBwb2ludGVyIF9fbmV3X2ZpbmlzaChfX25ld19zdGFydCk7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgLy8gVGhlIG9yZGVyIG9mIHRoZSB0aHJlZSBvcGVyYXRpb25zIGlzIGRpY3RhdGVkIGJ5IHRoZSBDKysweAorCSAgICAgIC8vIGNhc2UsIHdoZXJlIHRoZSBtb3ZlcyBjb3VsZCBhbHRlciBhIG5ldyBlbGVtZW50IGJlbG9uZ2luZworCSAgICAgIC8vIHRvIHRoZSBleGlzdGluZyB2ZWN0b3IuICBUaGlzIGlzIGFuIGlzc3VlIG9ubHkgZm9yIGNhbGxlcnMKKwkgICAgICAvLyB0YWtpbmcgdGhlIGVsZW1lbnQgYnkgY29uc3QgbHZhbHVlIHJlZiAoc2VlIDIzLjEvMTMpLgorCSAgICAgIF9BbGxvY190cmFpdHM6OmNvbnN0cnVjdCh0aGlzLT5fTV9pbXBsLAorCQkgICAgICAgICAgICAgICAgICAgICAgIF9fbmV3X3N0YXJ0ICsgX19lbGVtc19iZWZvcmUsCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCQkJCSAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworI2Vsc2UKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX194KTsKKyNlbmRpZgorCSAgICAgIF9fbmV3X2ZpbmlzaCA9IDA7CisKKwkgICAgICBfX25ld19maW5pc2gKKwkJPSBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2lmX25vZXhjZXB0X2EKKwkJKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIF9fcG9zaXRpb24uYmFzZSgpLAorCQkgX19uZXdfc3RhcnQsIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisKKwkgICAgICArK19fbmV3X2ZpbmlzaDsKKworCSAgICAgIF9fbmV3X2ZpbmlzaAorCQk9IHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfaWZfbm9leGNlcHRfYQorCQkoX19wb3NpdGlvbi5iYXNlKCksIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkgX19uZXdfZmluaXNoLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICB9CisgICAgICAgICAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBpZiAoIV9fbmV3X2ZpbmlzaCkKKwkJX0FsbG9jX3RyYWl0czo6ZGVzdHJveSh0aGlzLT5fTV9pbXBsLAorCQkgICAgICAgICAgICAgICAgICAgICAgIF9fbmV3X3N0YXJ0ICsgX19lbGVtc19iZWZvcmUpOworCSAgICAgIGVsc2UKKwkJc3RkOjpfRGVzdHJveShfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICAgIF9NX2RlYWxsb2NhdGUoX19uZXdfc3RhcnQsIF9fbGVuKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICBfTV9kZWFsbG9jYXRlKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQl0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQktIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworCSAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gX19uZXdfc3RhcnQgKyBfX2xlbjsKKwl9CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHZvaWQKKyAgICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgICAgX01fZW1wbGFjZV9iYWNrX2F1eChfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwljb25zdCBzaXplX3R5cGUgX19sZW4gPQorCSAgX01fY2hlY2tfbGVuKHNpemVfdHlwZSgxKSwgInZlY3Rvcjo6X01fZW1wbGFjZV9iYWNrX2F1eCIpOworCXBvaW50ZXIgX19uZXdfc3RhcnQodGhpcy0+X01fYWxsb2NhdGUoX19sZW4pKTsKKwlwb2ludGVyIF9fbmV3X2ZpbmlzaChfX25ld19zdGFydCk7CisJX190cnkKKwkgIHsKKwkgICAgX0FsbG9jX3RyYWl0czo6Y29uc3RydWN0KHRoaXMtPl9NX2ltcGwsIF9fbmV3X3N0YXJ0ICsgc2l6ZSgpLAorCQkJCSAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgICAgX19uZXdfZmluaXNoID0gMDsKKworCSAgICBfX25ld19maW5pc2gKKwkgICAgICA9IHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfaWZfbm9leGNlcHRfYQorCSAgICAgICh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkgICAgICAgX19uZXdfc3RhcnQsIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisKKwkgICAgKytfX25ld19maW5pc2g7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIGlmICghX19uZXdfZmluaXNoKQorCSAgICAgIF9BbGxvY190cmFpdHM6OmRlc3Ryb3kodGhpcy0+X01faW1wbCwgX19uZXdfc3RhcnQgKyBzaXplKCkpOworCSAgICBlbHNlCisJICAgICAgc3RkOjpfRGVzdHJveShfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICBfTV9kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LCBfX2xlbik7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCXN0ZDo6X0Rlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydCwgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCSAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJX01fZGVhbGxvY2F0ZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCSAgICAgIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisJdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19uZXdfZmluaXNoOworCXRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSBfX25ld19zdGFydCArIF9fbGVuOworICAgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgIF9NX2ZpbGxfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICB7CisgICAgICBpZiAoX19uICE9IDApCisJeworCSAgaWYgKHNpemVfdHlwZSh0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQktIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoKSA+PSBfX24pCisJICAgIHsKKwkgICAgICB2YWx1ZV90eXBlIF9feF9jb3B5ID0gX194OworCSAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2VsZW1zX2FmdGVyID0gZW5kKCkgLSBfX3Bvc2l0aW9uOworCSAgICAgIHBvaW50ZXIgX19vbGRfZmluaXNoKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoKTsKKwkgICAgICBpZiAoX19lbGVtc19hZnRlciA+IF9fbikKKwkJeworCQkgIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAtIF9fbiwKKwkJCQkJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IF9fbjsKKwkJICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX3Bvc2l0aW9uLmJhc2UoKSwKKwkJCQkJICBfX29sZF9maW5pc2ggLSBfX24sIF9fb2xkX2ZpbmlzaCk7CisJCSAgc3RkOjpmaWxsKF9fcG9zaXRpb24uYmFzZSgpLCBfX3Bvc2l0aW9uLmJhc2UoKSArIF9fbiwKKwkJCSAgICBfX3hfY29weSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX25fYSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJCV9fbiAtIF9fZWxlbXNfYWZ0ZXIsCisJCQkJCQlfX3hfY29weSwKKwkJCQkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggKz0gX19uIC0gX19lbGVtc19hZnRlcjsKKwkJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EoX19wb3NpdGlvbi5iYXNlKCksIF9fb2xkX2ZpbmlzaCwKKwkJCQkJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCSAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggKz0gX19lbGVtc19hZnRlcjsKKwkJICBzdGQ6OmZpbGwoX19wb3NpdGlvbi5iYXNlKCksIF9fb2xkX2ZpbmlzaCwgX194X2NvcHkpOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9CisJCV9NX2NoZWNrX2xlbihfX24sICJ2ZWN0b3I6Ol9NX2ZpbGxfaW5zZXJ0Iik7CisJICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fZWxlbXNfYmVmb3JlID0gX19wb3NpdGlvbiAtIGJlZ2luKCk7CisJICAgICAgcG9pbnRlciBfX25ld19zdGFydCh0aGlzLT5fTV9hbGxvY2F0ZShfX2xlbikpOworCSAgICAgIHBvaW50ZXIgX19uZXdfZmluaXNoKF9fbmV3X3N0YXJ0KTsKKwkgICAgICBfX3RyeQorCQl7CisJCSAgLy8gU2VlIF9NX2luc2VydF9hdXggYWJvdmUuCisJCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2EoX19uZXdfc3RhcnQgKyBfX2VsZW1zX2JlZm9yZSwKKwkJCQkJCV9fbiwgX194LAorCQkJCQkJX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICBfX25ld19maW5pc2ggPSAwOworCisJCSAgX19uZXdfZmluaXNoCisJCSAgICA9IHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfaWZfbm9leGNlcHRfYQorCQkgICAgKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIF9fcG9zaXRpb24uYmFzZSgpLAorCQkgICAgIF9fbmV3X3N0YXJ0LCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCisJCSAgX19uZXdfZmluaXNoICs9IF9fbjsKKworCQkgIF9fbmV3X2ZpbmlzaAorCQkgICAgPSBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2lmX25vZXhjZXB0X2EKKwkJICAgIChfX3Bvc2l0aW9uLmJhc2UoKSwgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCSAgICAgX19uZXdfZmluaXNoLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQl9CisJICAgICAgX19jYXRjaCguLi4pCisJCXsKKwkJICBpZiAoIV9fbmV3X2ZpbmlzaCkKKwkJICAgIHN0ZDo6X0Rlc3Ryb3koX19uZXdfc3RhcnQgKyBfX2VsZW1zX2JlZm9yZSwKKwkJCQkgIF9fbmV3X3N0YXJ0ICsgX19lbGVtc19iZWZvcmUgKyBfX24sCisJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIGVsc2UKKwkJICAgIHN0ZDo6X0Rlc3Ryb3koX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwKKwkJCQkgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgX01fZGVhbGxvY2F0ZShfX25ld19zdGFydCwgX19sZW4pOworCQkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCQl9CisJICAgICAgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICAgIF9NX2RlYWxsb2NhdGUodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQkgICAgLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IF9fbmV3X3N0YXJ0ICsgX19sZW47CisJICAgIH0KKwl9CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgdmVjdG9yPF9UcCwgX0FsbG9jPjo6CisgICAgX01fZGVmYXVsdF9hcHBlbmQoc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBpZiAoX19uICE9IDApCisJeworCSAgaWYgKHNpemVfdHlwZSh0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQktIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoKSA+PSBfX24pCisJICAgIHsKKwkgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9kZWZhdWx0X25fYSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICAgICAgIF9fbiwgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCArPSBfX247CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9CisJCV9NX2NoZWNrX2xlbihfX24sICJ2ZWN0b3I6Ol9NX2RlZmF1bHRfYXBwZW5kIik7CisJICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5zaXplKCk7CisJICAgICAgcG9pbnRlciBfX25ld19zdGFydCh0aGlzLT5fTV9hbGxvY2F0ZShfX2xlbikpOworCSAgICAgIHBvaW50ZXIgX19uZXdfZmluaXNoKF9fbmV3X3N0YXJ0KTsKKwkgICAgICBfX3RyeQorCQl7CisJCSAgX19uZXdfZmluaXNoCisJCSAgICA9IHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfaWZfbm9leGNlcHRfYQorCQkgICAgKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkgICAgIF9fbmV3X3N0YXJ0LCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHN0ZDo6X191bmluaXRpYWxpemVkX2RlZmF1bHRfbl9hKF9fbmV3X2ZpbmlzaCwgX19uLAorCQkJCQkJICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICBfX25ld19maW5pc2ggKz0gX19uOworCQl9CisJICAgICAgX19jYXRjaCguLi4pCisJCXsKKwkJICBzdGQ6Ol9EZXN0cm95KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsCisJCQkJX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICBfTV9kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LCBfX2xlbik7CisJCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJCX0KKwkgICAgICBzdGQ6Ol9EZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICAgICAgX01fZGVhbGxvY2F0ZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJICAgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UKKwkJCSAgICAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKwkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gX19uZXdfc3RhcnQgKyBfX2xlbjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYm9vbAorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgIF9NX3Nocmlua190b19maXQoKQorICAgIHsKKyAgICAgIGlmIChjYXBhY2l0eSgpID09IHNpemUoKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gc3RkOjpfX3Nocmlua190b19maXRfYXV4PHZlY3Rvcj46Ol9TX2RvX2l0KCp0aGlzKTsKKyAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgICAgX01fcmFuZ2VfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCQkgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCWZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgeworCSAgICBfX3BvcyA9IGluc2VydChfX3BvcywgKl9fZmlyc3QpOworCSAgICArK19fcG9zOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3JhbmdlX2luc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCWlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgIHsKKwkgICAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKwkgICAgaWYgKHNpemVfdHlwZSh0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQkgIC0gdGhpcy0+X01faW1wbC5fTV9maW5pc2gpID49IF9fbikKKwkgICAgICB7CisJCWNvbnN0IHNpemVfdHlwZSBfX2VsZW1zX2FmdGVyID0gZW5kKCkgLSBfX3Bvc2l0aW9uOworCQlwb2ludGVyIF9fb2xkX2ZpbmlzaCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7CisJCWlmIChfX2VsZW1zX2FmdGVyID4gX19uKQorCQkgIHsKKwkJICAgIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAtIF9fbiwKKwkJCQkJCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkJdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggKz0gX19uOworCQkgICAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19wb3NpdGlvbi5iYXNlKCksCisJCQkJCSAgICBfX29sZF9maW5pc2ggLSBfX24sIF9fb2xkX2ZpbmlzaCk7CisJCSAgICBzdGQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvc2l0aW9uKTsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKKwkJICAgIHN0ZDo6YWR2YW5jZShfX21pZCwgX19lbGVtc19hZnRlcik7CisJCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX19taWQsIF9fbGFzdCwKKwkJCQkJCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkJX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IF9fbiAtIF9fZWxlbXNfYWZ0ZXI7CisJCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EoX19wb3NpdGlvbi5iYXNlKCksCisJCQkJCQlfX29sZF9maW5pc2gsCisJCQkJCQl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCArPSBfX2VsZW1zX2FmdGVyOworCQkgICAgc3RkOjpjb3B5KF9fZmlyc3QsIF9fbWlkLCBfX3Bvc2l0aW9uKTsKKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQljb25zdCBzaXplX3R5cGUgX19sZW4gPQorCQkgIF9NX2NoZWNrX2xlbihfX24sICJ2ZWN0b3I6Ol9NX3JhbmdlX2luc2VydCIpOworCQlwb2ludGVyIF9fbmV3X3N0YXJ0KHRoaXMtPl9NX2FsbG9jYXRlKF9fbGVuKSk7CisJCXBvaW50ZXIgX19uZXdfZmluaXNoKF9fbmV3X3N0YXJ0KTsKKwkJX190cnkKKwkJICB7CisJCSAgICBfX25ld19maW5pc2gKKwkJICAgICAgPSBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2lmX25vZXhjZXB0X2EKKwkJICAgICAgKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIF9fcG9zaXRpb24uYmFzZSgpLAorCQkgICAgICAgX19uZXdfc3RhcnQsIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgICBfX25ld19maW5pc2gKKwkJICAgICAgPSBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX19maXJzdCwgX19sYXN0LAorCQkJCQkJICAgIF9fbmV3X2ZpbmlzaCwKKwkJCQkJCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgICAgX19uZXdfZmluaXNoCisJCSAgICAgID0gc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9pZl9ub2V4Y2VwdF9hCisJCSAgICAgIChfX3Bvc2l0aW9uLmJhc2UoKSwgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCSAgICAgICBfX25ld19maW5pc2gsIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgfQorCQlfX2NhdGNoKC4uLikKKwkJICB7CisJCSAgICBzdGQ6Ol9EZXN0cm95KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsCisJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgICAgX01fZGVhbGxvY2F0ZShfX25ld19zdGFydCwgX19sZW4pOworCQkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJCSAgfQorCQlzdGQ6Ol9EZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJX01fZGVhbGxvY2F0ZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJICAgICAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkJICAgICAgLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkJdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworCQl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKwkJdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IF9fbmV3X3N0YXJ0ICsgX19sZW47CisJICAgICAgfQorCSAgfQorICAgICAgfQorCisKKyAgLy8gdmVjdG9yPGJvb2w+CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgdmVjdG9yPGJvb2wsIF9BbGxvYz46OgorICAgIF9NX3JlYWxsb2NhdGUoc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfQml0X3R5cGUqIF9fcSA9IHRoaXMtPl9NX2FsbG9jYXRlKF9fbik7CisgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9NX2NvcHlfYWxpZ25lZChiZWdpbigpLCBlbmQoKSwKKwkJCQkJCWl0ZXJhdG9yKF9fcSwgMCkpOworICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOworICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CisgICAgICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gX19xICsgX1NfbndvcmQoX19uKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICB2ZWN0b3I8Ym9vbCwgX0FsbG9jPjo6CisgICAgX01fZmlsbF9pbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgYm9vbCBfX3gpCisgICAgeworICAgICAgaWYgKF9fbiA9PSAwKQorCXJldHVybjsKKyAgICAgIGlmIChjYXBhY2l0eSgpIC0gc2l6ZSgpID49IF9fbikKKwl7CisJICBzdGQ6OmNvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgZW5kKCksCisJCQkgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICsgZGlmZmVyZW5jZV90eXBlKF9fbikpOworCSAgc3RkOjpmaWxsKF9fcG9zaXRpb24sIF9fcG9zaXRpb24gKyBkaWZmZXJlbmNlX3R5cGUoX19uKSwgX194KTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IGRpZmZlcmVuY2VfdHlwZShfX24pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSAKKwkgICAgX01fY2hlY2tfbGVuKF9fbiwgInZlY3Rvcjxib29sPjo6X01fZmlsbF9pbnNlcnQiKTsKKwkgIF9CaXRfdHlwZSAqIF9fcSA9IHRoaXMtPl9NX2FsbG9jYXRlKF9fbGVuKTsKKwkgIGl0ZXJhdG9yIF9faSA9IF9NX2NvcHlfYWxpZ25lZChiZWdpbigpLCBfX3Bvc2l0aW9uLAorCQkJCQkgaXRlcmF0b3IoX19xLCAwKSk7CisJICBzdGQ6OmZpbGwoX19pLCBfX2kgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSwgX194KTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gc3RkOjpjb3B5KF9fcG9zaXRpb24sIGVuZCgpLAorCQkJCQkgICAgICBfX2kgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CisJICB0aGlzLT5fTV9kZWFsbG9jYXRlKCk7CisJICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gX19xICsgX1NfbndvcmQoX19sZW4pOworCSAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHZlY3Rvcjxib29sLCBfQWxsb2M+OjoKKyAgICAgIF9NX2luc2VydF9yYW5nZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIAorCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwlpZiAoX19maXJzdCAhPSBfX2xhc3QpCisJICB7CisJICAgIHNpemVfdHlwZSBfX24gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisJICAgIGlmIChjYXBhY2l0eSgpIC0gc2l6ZSgpID49IF9fbikKKwkgICAgICB7CisJCXN0ZDo6Y29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBlbmQoKSwKKwkJCQkgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaAorCQkJCSAgICsgZGlmZmVyZW5jZV90eXBlKF9fbikpOworCQlzdGQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvc2l0aW9uKTsKKwkJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggKz0gZGlmZmVyZW5jZV90eXBlKF9fbik7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQljb25zdCBzaXplX3R5cGUgX19sZW4gPQorCQkgIF9NX2NoZWNrX2xlbihfX24sICJ2ZWN0b3I8Ym9vbD46Ol9NX2luc2VydF9yYW5nZSIpOworCQlfQml0X3R5cGUgKiBfX3EgPSB0aGlzLT5fTV9hbGxvY2F0ZShfX2xlbik7CisJCWl0ZXJhdG9yIF9faSA9IF9NX2NvcHlfYWxpZ25lZChiZWdpbigpLCBfX3Bvc2l0aW9uLAorCQkJCQkgICAgICAgaXRlcmF0b3IoX19xLCAwKSk7CisJCV9faSA9IHN0ZDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9faSk7CisJCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gc3RkOjpjb3B5KF9fcG9zaXRpb24sIGVuZCgpLCBfX2kpOworCQl0aGlzLT5fTV9kZWFsbG9jYXRlKCk7CisJCXRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSBfX3EgKyBfU19ud29yZChfX2xlbik7CisJCXRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIHZlY3Rvcjxib29sLCBfQWxsb2M+OjoKKyAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGJvb2wgX194KQorICAgIHsKKyAgICAgIGlmICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9wICE9IHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UpCisJeworCSAgc3RkOjpjb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24sIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLCAKKwkJCSAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggKyAxKTsKKwkgICpfX3Bvc2l0aW9uID0gX194OworCSAgKyt0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKwl9CisgICAgICBlbHNlCisJeworCSAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0KKwkgICAgX01fY2hlY2tfbGVuKHNpemVfdHlwZSgxKSwgInZlY3Rvcjxib29sPjo6X01faW5zZXJ0X2F1eCIpOworCSAgX0JpdF90eXBlICogX19xID0gdGhpcy0+X01fYWxsb2NhdGUoX19sZW4pOworCSAgaXRlcmF0b3IgX19pID0gX01fY29weV9hbGlnbmVkKGJlZ2luKCksIF9fcG9zaXRpb24sCisJCQkJCSBpdGVyYXRvcihfX3EsIDApKTsKKwkgICpfX2krKyA9IF9feDsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gc3RkOjpjb3B5KF9fcG9zaXRpb24sIGVuZCgpLCBfX2kpOworCSAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOworCSAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IF9fcSArIF9TX253b3JkKF9fbGVuKTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOworCX0KKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBib29sCisgICAgdmVjdG9yPGJvb2wsIF9BbGxvYz46OgorICAgIF9NX3Nocmlua190b19maXQoKQorICAgIHsKKyAgICAgIGlmIChjYXBhY2l0eSgpIC0gc2l6ZSgpIDwgaW50KF9TX3dvcmRfYml0KSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBfX3RyeQorCXsKKwkgIF9NX3JlYWxsb2NhdGUoc2l6ZSgpKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsgcmV0dXJuIGZhbHNlOyB9CisgICAgfQorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzaXplX3QKKyAgICBoYXNoPF9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8Ym9vbCwgX0FsbG9jPj46OgorICAgIG9wZXJhdG9yKCkoY29uc3QgX0dMSUJDWFhfU1REX0M6OnZlY3Rvcjxib29sLCBfQWxsb2M+JiBfX2IpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgc2l6ZV90IF9faGFzaCA9IDA7CisgICAgICB1c2luZyBfR0xJQkNYWF9TVERfQzo6X1Nfd29yZF9iaXQ7CisgICAgICB1c2luZyBfR0xJQkNYWF9TVERfQzo6X0JpdF90eXBlOworCisgICAgICBjb25zdCBzaXplX3QgX193b3JkcyA9IF9fYi5zaXplKCkgLyBfU193b3JkX2JpdDsKKyAgICAgIGlmIChfX3dvcmRzKQorCXsKKwkgIGNvbnN0IHNpemVfdCBfX2NsZW5ndGggPSBfX3dvcmRzICogc2l6ZW9mKF9CaXRfdHlwZSk7CisJICBfX2hhc2ggPSBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19iLl9NX2ltcGwuX01fc3RhcnQuX01fcCwgX19jbGVuZ3RoKTsKKwl9CisKKyAgICAgIGNvbnN0IHNpemVfdCBfX2V4dHJhYml0cyA9IF9fYi5zaXplKCkgJSBfU193b3JkX2JpdDsKKyAgICAgIGlmIChfX2V4dHJhYml0cykKKwl7CisJICBfQml0X3R5cGUgX19oaXdvcmQgPSAqX19iLl9NX2ltcGwuX01fZmluaXNoLl9NX3A7CisJICBfX2hpd29yZCAmPSB+KCh+c3RhdGljX2Nhc3Q8X0JpdF90eXBlPigwKSkgPDwgX19leHRyYWJpdHMpOworCisJICBjb25zdCBzaXplX3QgX19jbGVuZ3RoCisJICAgID0gKF9fZXh0cmFiaXRzICsgX19DSEFSX0JJVF9fIC0gMSkgLyBfX0NIQVJfQklUX187CisJICBpZiAoX193b3JkcykKKwkgICAgX19oYXNoID0gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKCZfX2hpd29yZCwgX19jbGVuZ3RoLCBfX2hhc2gpOworCSAgZWxzZQorCSAgICBfX2hhc2ggPSBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goJl9faGl3b3JkLCBfX2NsZW5ndGgpOworCX0KKworICAgICAgcmV0dXJuIF9faGFzaDsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLyogX1ZFQ1RPUl9UQ0MgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0c2V0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRhNmJhZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0c2V0CkBAIC0wLDAgKzEsMTU4NSBAQAorLy8gPGJpdHNldD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvYml0c2V0CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0JJVFNFVAorI2RlZmluZSBfR0xJQkNYWF9CSVRTRVQgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPiAgIC8vIEZvciBpbnZhbGlkX2FyZ3VtZW50LCBvdXRfb2ZfcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJmbG93X2Vycm9yCisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGJpdHMvY3h4YWJpX2ZvcmNlZC5oPgorCisjZGVmaW5lIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEICAoX19DSEFSX0JJVF9fICogX19TSVpFT0ZfTE9OR19fKQorI2RlZmluZSBfR0xJQkNYWF9CSVRTRVRfV09SRFMoX19uKSBcCisgICgoX19uKSAvIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEICsgXAorICAgKChfX24pICUgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQgPT0gMCA/IDAgOiAxKSkKKworI2RlZmluZSBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfVUxMIChfX0NIQVJfQklUX18gKiBfX1NJWkVPRl9MT05HX0xPTkdfXykKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLyoqCisgICAqICBCYXNlIGNsYXNzLCBnZW5lcmFsIGNhc2UuICBJdCBpcyBhIGNsYXNzIGludmFyaWFudCB0aGF0IF9OdyB3aWxsIGJlCisgICAqICBub25uZWdhdGl2ZS4KKyAgICoKKyAgICogIFNlZSBkb2N1bWVudGF0aW9uIGZvciBiaXRzZXQuCisgICovCisgIHRlbXBsYXRlPHNpemVfdCBfTnc+CisgICAgc3RydWN0IF9CYXNlX2JpdHNldAorICAgIHsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBfV29yZFQ7CisKKyAgICAgIC8vLyAwIGlzIHRoZSBsZWFzdCBzaWduaWZpY2FudCB3b3JkLgorICAgICAgX1dvcmRUIAkJX01fd1tfTnddOworCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgX0Jhc2VfYml0c2V0KCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIDogX01fdygpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3RleHByIF9CYXNlX2JpdHNldCh1bnNpZ25lZCBsb25nIGxvbmcgX192YWwpIG5vZXhjZXB0CisgICAgICA6IF9NX3d7IF9Xb3JkVChfX3ZhbCkKKyNpZiBfX1NJWkVPRl9MT05HX0xPTkdfXyA+IF9fU0laRU9GX0xPTkdfXworCSAgICAgICAsIF9Xb3JkVChfX3ZhbCA+PiBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRCkKKyNlbmRpZgorICAgICAgIH0geyB9CisjZWxzZQorICAgICAgX0Jhc2VfYml0c2V0KHVuc2lnbmVkIGxvbmcgX192YWwpCisgICAgICA6IF9NX3coKQorICAgICAgeyBfTV93WzBdID0gX192YWw7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpemVfdAorICAgICAgX1Nfd2hpY2h3b3JkKHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9fcG9zIC8gX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQ7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaXplX3QKKyAgICAgIF9TX3doaWNoYnl0ZShzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAoX19wb3MgJSBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRCkgLyBfX0NIQVJfQklUX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaXplX3QKKyAgICAgIF9TX3doaWNoYml0KHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9fcG9zICUgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQ7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfV29yZFQKKyAgICAgIF9TX21hc2tiaXQoc2l6ZV90IF9fcG9zKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKHN0YXRpY19jYXN0PF9Xb3JkVD4oMSkpIDw8IF9TX3doaWNoYml0KF9fcG9zKTsgfQorCisgICAgICBfV29yZFQmCisgICAgICBfTV9nZXR3b3JkKHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3dbX1Nfd2hpY2h3b3JkKF9fcG9zKV07IH0KKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIF9Xb3JkVAorICAgICAgX01fZ2V0d29yZChzaXplX3QgX19wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV93W19TX3doaWNod29yZChfX3BvcyldOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdCBfV29yZFQqCisgICAgICBfTV9nZXRkYXRhKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3c7IH0KKyNlbmRpZgorCisgICAgICBfV29yZFQmCisgICAgICBfTV9oaXdvcmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fd1tfTncgLSAxXTsgfQorCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgX1dvcmRUCisgICAgICBfTV9oaXdvcmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fd1tfTncgLSAxXTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19hbmQoY29uc3QgX0Jhc2VfYml0c2V0PF9Odz4mIF9feCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTnc7IF9faSsrKQorCSAgX01fd1tfX2ldICY9IF9feC5fTV93W19faV07CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX29yKGNvbnN0IF9CYXNlX2JpdHNldDxfTnc+JiBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX053OyBfX2krKykKKwkgIF9NX3dbX19pXSB8PSBfX3guX01fd1tfX2ldOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb194b3IoY29uc3QgX0Jhc2VfYml0c2V0PF9Odz4mIF9feCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTnc7IF9faSsrKQorCSAgX01fd1tfX2ldIF49IF9feC5fTV93W19faV07CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2xlZnRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpIF9HTElCQ1hYX05PRVhDRVBUOworCisgICAgICB2b2lkCisgICAgICBfTV9kb19yaWdodF9zaGlmdChzaXplX3QgX19zaGlmdCkgX0dMSUJDWFhfTk9FWENFUFQ7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2ZsaXAoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OdzsgX19pKyspCisJICBfTV93W19faV0gPSB+X01fd1tfX2ldOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19zZXQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OdzsgX19pKyspCisJICBfTV93W19faV0gPSB+c3RhdGljX2Nhc3Q8X1dvcmRUPigwKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fcmVzZXQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyBfX2J1aWx0aW5fbWVtc2V0KF9NX3csIDAsIF9OdyAqIHNpemVvZihfV29yZFQpKTsgfQorCisgICAgICBib29sCisgICAgICBfTV9pc19lcXVhbChjb25zdCBfQmFzZV9iaXRzZXQ8X053PiYgX194KSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OdzsgKytfX2kpCisJICBpZiAoX01fd1tfX2ldICE9IF9feC5fTV93W19faV0pCisJICAgIHJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICAgICAgYm9vbAorICAgICAgICBfTV9hcmVfYWxsKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgICAgeworCSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX053IC0gMTsgX19pKyspCisJICAgIGlmIChfTV93W19faV0gIT0gfnN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgcmV0dXJuIF9NX2hpd29yZCgpID09ICh+c3RhdGljX2Nhc3Q8X1dvcmRUPigwKQorCQkJCSA+PiAoX053ICogX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQKKwkJCQkgICAgIC0gX05iKSk7CisJfQorCisgICAgICBib29sCisgICAgICBfTV9pc19hbnkoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OdzsgX19pKyspCisJICBpZiAoX01fd1tfX2ldICE9IHN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpCisJICAgIHJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90CisgICAgICBfTV9kb19jb3VudCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJc2l6ZV90IF9fcmVzdWx0ID0gMDsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTnc7IF9faSsrKQorCSAgX19yZXN1bHQgKz0gX19idWlsdGluX3BvcGNvdW50bChfTV93W19faV0pOworCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIH0KKworICAgICAgdW5zaWduZWQgbG9uZworICAgICAgX01fZG9fdG9fdWxvbmcoKSBjb25zdDsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZworICAgICAgX01fZG9fdG9fdWxsb25nKCkgY29uc3Q7CisjZW5kaWYKKworICAgICAgLy8gZmluZCBmaXJzdCAib24iIGJpdAorICAgICAgc2l6ZV90CisgICAgICBfTV9kb19maW5kX2ZpcnN0KHNpemVfdCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQ7CisKKyAgICAgIC8vIGZpbmQgdGhlIG5leHQgIm9uIiBiaXQgdGhhdCBmb2xsb3dzICJwcmV2IgorICAgICAgc2l6ZV90CisgICAgICBfTV9kb19maW5kX25leHQoc2l6ZV90LCBzaXplX3QpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUOworICAgIH07CisKKyAgLy8gRGVmaW5pdGlvbnMgb2Ygbm9uLWlubGluZSBmdW5jdGlvbnMgZnJvbSBfQmFzZV9iaXRzZXQuCisgIHRlbXBsYXRlPHNpemVfdCBfTnc+CisgICAgdm9pZAorICAgIF9CYXNlX2JpdHNldDxfTnc+OjpfTV9kb19sZWZ0X3NoaWZ0KHNpemVfdCBfX3NoaWZ0KSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KF9fc2hpZnQgIT0gMCwgMSkpCisJeworCSAgY29uc3Qgc2l6ZV90IF9fd3NoaWZ0ID0gX19zaGlmdCAvIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEOworCSAgY29uc3Qgc2l6ZV90IF9fb2Zmc2V0ID0gX19zaGlmdCAlIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEOworCisJICBpZiAoX19vZmZzZXQgPT0gMCkKKwkgICAgZm9yIChzaXplX3QgX19uID0gX053IC0gMTsgX19uID49IF9fd3NoaWZ0OyAtLV9fbikKKwkgICAgICBfTV93W19fbl0gPSBfTV93W19fbiAtIF9fd3NoaWZ0XTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0IHNpemVfdCBfX3N1Yl9vZmZzZXQgPSAoX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQgCisJCQkJCSAgIC0gX19vZmZzZXQpOworCSAgICAgIGZvciAoc2l6ZV90IF9fbiA9IF9OdyAtIDE7IF9fbiA+IF9fd3NoaWZ0OyAtLV9fbikKKwkJX01fd1tfX25dID0gKChfTV93W19fbiAtIF9fd3NoaWZ0XSA8PCBfX29mZnNldCkKKwkJCSAgICAgfCAoX01fd1tfX24gLSBfX3dzaGlmdCAtIDFdID4+IF9fc3ViX29mZnNldCkpOworCSAgICAgIF9NX3dbX193c2hpZnRdID0gX01fd1swXSA8PCBfX29mZnNldDsKKwkgICAgfQorCisJICBzdGQ6OmZpbGwoX01fdyArIDAsIF9NX3cgKyBfX3dzaGlmdCwgc3RhdGljX2Nhc3Q8X1dvcmRUPigwKSk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTxzaXplX3QgX053PgorICAgIHZvaWQKKyAgICBfQmFzZV9iaXRzZXQ8X053Pjo6X01fZG9fcmlnaHRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoX19zaGlmdCAhPSAwLCAxKSkKKwl7CisJICBjb25zdCBzaXplX3QgX193c2hpZnQgPSBfX3NoaWZ0IC8gX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQ7CisJICBjb25zdCBzaXplX3QgX19vZmZzZXQgPSBfX3NoaWZ0ICUgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQ7CisJICBjb25zdCBzaXplX3QgX19saW1pdCA9IF9OdyAtIF9fd3NoaWZ0IC0gMTsKKworCSAgaWYgKF9fb2Zmc2V0ID09IDApCisJICAgIGZvciAoc2l6ZV90IF9fbiA9IDA7IF9fbiA8PSBfX2xpbWl0OyArK19fbikKKwkgICAgICBfTV93W19fbl0gPSBfTV93W19fbiArIF9fd3NoaWZ0XTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0IHNpemVfdCBfX3N1Yl9vZmZzZXQgPSAoX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQKKwkJCQkJICAgLSBfX29mZnNldCk7CisJICAgICAgZm9yIChzaXplX3QgX19uID0gMDsgX19uIDwgX19saW1pdDsgKytfX24pCisJCV9NX3dbX19uXSA9ICgoX01fd1tfX24gKyBfX3dzaGlmdF0gPj4gX19vZmZzZXQpCisJCQkgICAgIHwgKF9NX3dbX19uICsgX193c2hpZnQgKyAxXSA8PCBfX3N1Yl9vZmZzZXQpKTsKKwkgICAgICBfTV93W19fbGltaXRdID0gX01fd1tfTnctMV0gPj4gX19vZmZzZXQ7CisJICAgIH0KKwkgIAorCSAgc3RkOjpmaWxsKF9NX3cgKyBfX2xpbWl0ICsgMSwgX01fdyArIF9Odywgc3RhdGljX2Nhc3Q8X1dvcmRUPigwKSk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTxzaXplX3QgX053PgorICAgIHVuc2lnbmVkIGxvbmcKKyAgICBfQmFzZV9iaXRzZXQ8X053Pjo6X01fZG9fdG9fdWxvbmcoKSBjb25zdAorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDE7IF9faSA8IF9OdzsgKytfX2kpCisJaWYgKF9NX3dbX19pXSkKKwkgIF9fdGhyb3dfb3ZlcmZsb3dfZXJyb3IoX19OKCJfQmFzZV9iaXRzZXQ6Ol9NX2RvX3RvX3Vsb25nIikpOworICAgICAgcmV0dXJuIF9NX3dbMF07CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTxzaXplX3QgX053PgorICAgIHVuc2lnbmVkIGxvbmcgbG9uZworICAgIF9CYXNlX2JpdHNldDxfTnc+OjpfTV9kb190b191bGxvbmcoKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IGJvb2wgX19kdyA9IHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpID4gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworICAgICAgZm9yIChzaXplX3QgX19pID0gMSArIF9fZHc7IF9faSA8IF9OdzsgKytfX2kpCisJaWYgKF9NX3dbX19pXSkKKwkgIF9fdGhyb3dfb3ZlcmZsb3dfZXJyb3IoX19OKCJfQmFzZV9iaXRzZXQ6Ol9NX2RvX3RvX3VsbG9uZyIpKTsKKworICAgICAgaWYgKF9fZHcpCisJcmV0dXJuIF9NX3dbMF0gKyAoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihfTV93WzFdKQorCQkJICA8PCBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRCk7CisgICAgICByZXR1cm4gX01fd1swXTsKKyAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTxzaXplX3QgX053PgorICAgIHNpemVfdAorICAgIF9CYXNlX2JpdHNldDxfTnc+OjoKKyAgICBfTV9kb19maW5kX2ZpcnN0KHNpemVfdCBfX25vdF9mb3VuZCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTnc7IF9faSsrKQorCXsKKwkgIF9Xb3JkVCBfX3RoaXN3b3JkID0gX01fd1tfX2ldOworCSAgaWYgKF9fdGhpc3dvcmQgIT0gc3RhdGljX2Nhc3Q8X1dvcmRUPigwKSkKKwkgICAgcmV0dXJuIChfX2kgKiBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRAorCQkgICAgKyBfX2J1aWx0aW5fY3R6bChfX3RoaXN3b3JkKSk7CisJfQorICAgICAgLy8gbm90IGZvdW5kLCBzbyByZXR1cm4gYW4gaW5kaWNhdGlvbiBvZiBmYWlsdXJlLgorICAgICAgcmV0dXJuIF9fbm90X2ZvdW5kOworICAgIH0KKworICB0ZW1wbGF0ZTxzaXplX3QgX053PgorICAgIHNpemVfdAorICAgIF9CYXNlX2JpdHNldDxfTnc+OjoKKyAgICBfTV9kb19maW5kX25leHQoc2l6ZV90IF9fcHJldiwgc2l6ZV90IF9fbm90X2ZvdW5kKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIC8vIG1ha2UgYm91bmQgaW5jbHVzaXZlCisgICAgICArK19fcHJldjsKKworICAgICAgLy8gY2hlY2sgb3V0IG9mIGJvdW5kcworICAgICAgaWYgKF9fcHJldiA+PSBfTncgKiBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRCkKKwlyZXR1cm4gX19ub3RfZm91bmQ7CisKKyAgICAgIC8vIHNlYXJjaCBmaXJzdCB3b3JkCisgICAgICBzaXplX3QgX19pID0gX1Nfd2hpY2h3b3JkKF9fcHJldik7CisgICAgICBfV29yZFQgX190aGlzd29yZCA9IF9NX3dbX19pXTsKKworICAgICAgLy8gbWFzayBvZmYgYml0cyBiZWxvdyBib3VuZAorICAgICAgX190aGlzd29yZCAmPSAofnN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpIDw8IF9TX3doaWNoYml0KF9fcHJldik7CisKKyAgICAgIGlmIChfX3RoaXN3b3JkICE9IHN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpCisJcmV0dXJuIChfX2kgKiBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRAorCQkrIF9fYnVpbHRpbl9jdHpsKF9fdGhpc3dvcmQpKTsKKworICAgICAgLy8gY2hlY2sgc3Vic2VxdWVudCB3b3JkcworICAgICAgX19pKys7CisgICAgICBmb3IgKDsgX19pIDwgX053OyBfX2krKykKKwl7CisJICBfX3RoaXN3b3JkID0gX01fd1tfX2ldOworCSAgaWYgKF9fdGhpc3dvcmQgIT0gc3RhdGljX2Nhc3Q8X1dvcmRUPigwKSkKKwkgICAgcmV0dXJuIChfX2kgKiBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRAorCQkgICAgKyBfX2J1aWx0aW5fY3R6bChfX3RoaXN3b3JkKSk7CisJfQorICAgICAgLy8gbm90IGZvdW5kLCBzbyByZXR1cm4gYW4gaW5kaWNhdGlvbiBvZiBmYWlsdXJlLgorICAgICAgcmV0dXJuIF9fbm90X2ZvdW5kOworICAgIH0gLy8gZW5kIF9NX2RvX2ZpbmRfbmV4dAorCisgIC8qKgorICAgKiAgQmFzZSBjbGFzcywgc3BlY2lhbGl6YXRpb24gZm9yIGEgc2luZ2xlIHdvcmQuCisgICAqCisgICAqICBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgYml0c2V0LgorICAqLworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9CYXNlX2JpdHNldDwxPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBfV29yZFQ7CisgICAgICBfV29yZFQgX01fdzsKKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIF9CYXNlX2JpdHNldCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICA6IF9NX3coMCkKKyAgICAgIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3RleHByIF9CYXNlX2JpdHNldCh1bnNpZ25lZCBsb25nIGxvbmcgX192YWwpIG5vZXhjZXB0CisjZWxzZQorICAgICAgX0Jhc2VfYml0c2V0KHVuc2lnbmVkIGxvbmcgX192YWwpCisjZW5kaWYKKyAgICAgIDogX01fdyhfX3ZhbCkKKyAgICAgIHsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpemVfdAorICAgICAgX1Nfd2hpY2h3b3JkKHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9fcG9zIC8gX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQ7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaXplX3QKKyAgICAgIF9TX3doaWNoYnl0ZShzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAoX19wb3MgJSBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRCkgLyBfX0NIQVJfQklUX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaXplX3QKKyAgICAgIF9TX3doaWNoYml0KHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgIHJldHVybiBfX3BvcyAlIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX1dvcmRUCisgICAgICBfU19tYXNrYml0KHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIChzdGF0aWNfY2FzdDxfV29yZFQ+KDEpKSA8PCBfU193aGljaGJpdChfX3Bvcyk7IH0KKworICAgICAgX1dvcmRUJgorICAgICAgX01fZ2V0d29yZChzaXplX3QpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV93OyB9CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBfV29yZFQKKyAgICAgIF9NX2dldHdvcmQoc2l6ZV90KSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdzsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3QgX1dvcmRUKgorICAgICAgX01fZ2V0ZGF0YSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiAmX01fdzsgfQorI2VuZGlmCisKKyAgICAgIF9Xb3JkVCYKKyAgICAgIF9NX2hpd29yZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV93OyB9CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBfV29yZFQKKyAgICAgIF9NX2hpd29yZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV93OyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2FuZChjb25zdCBfQmFzZV9iaXRzZXQ8MT4mIF9feCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX01fdyAmPSBfX3guX01fdzsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19vcihjb25zdCBfQmFzZV9iaXRzZXQ8MT4mIF9feCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX01fdyB8PSBfX3guX01fdzsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb194b3IoY29uc3QgX0Jhc2VfYml0c2V0PDE+JiBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX3cgXj0gX194Ll9NX3c7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fbGVmdF9zaGlmdChzaXplX3QgX19zaGlmdCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX01fdyA8PD0gX19zaGlmdDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19yaWdodF9zaGlmdChzaXplX3QgX19zaGlmdCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX01fdyA+Pj0gX19zaGlmdDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19mbGlwKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX01fdyA9IH5fTV93OyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3NldCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX3cgPSB+c3RhdGljX2Nhc3Q8X1dvcmRUPigwKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19yZXNldCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX3cgPSAwOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2lzX2VxdWFsKGNvbnN0IF9CYXNlX2JpdHNldDwxPiYgX194KSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdyA9PSBfX3guX01fdzsgfQorCisgICAgICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgICAgICBib29sCisgICAgICAgIF9NX2FyZV9hbGwoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgICB7IHJldHVybiBfTV93ID09ICh+c3RhdGljX2Nhc3Q8X1dvcmRUPigwKQorCQkJICA+PiAoX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQgLSBfTmIpKTsgfQorCisgICAgICBib29sCisgICAgICBfTV9pc19hbnkoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdyAhPSAwOyB9CisKKyAgICAgIHNpemVfdAorICAgICAgX01fZG9fY291bnQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX19idWlsdGluX3BvcGNvdW50bChfTV93KTsgfQorCisgICAgICB1bnNpZ25lZCBsb25nCisgICAgICBfTV9kb190b191bG9uZygpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV93OyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICAgIF9NX2RvX3RvX3VsbG9uZygpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV93OyB9CisjZW5kaWYKKworICAgICAgc2l6ZV90CisgICAgICBfTV9kb19maW5kX2ZpcnN0KHNpemVfdCBfX25vdF9mb3VuZCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKyAgICAgICAgaWYgKF9NX3cgIT0gMCkKKyAgICAgICAgICByZXR1cm4gX19idWlsdGluX2N0emwoX01fdyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gX19ub3RfZm91bmQ7CisgICAgICB9CisKKyAgICAgIC8vIGZpbmQgdGhlIG5leHQgIm9uIiBiaXQgdGhhdCBmb2xsb3dzICJwcmV2IgorICAgICAgc2l6ZV90CisgICAgICBfTV9kb19maW5kX25leHQoc2l6ZV90IF9fcHJldiwgc2l6ZV90IF9fbm90X2ZvdW5kKSBjb25zdAorCV9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJKytfX3ByZXY7CisJaWYgKF9fcHJldiA+PSAoKHNpemVfdCkgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQpKQorCSAgcmV0dXJuIF9fbm90X2ZvdW5kOworCisJX1dvcmRUIF9feCA9IF9NX3cgPj4gX19wcmV2OworCWlmIChfX3ggIT0gMCkKKwkgIHJldHVybiBfX2J1aWx0aW5fY3R6bChfX3gpICsgX19wcmV2OworCWVsc2UKKwkgIHJldHVybiBfX25vdF9mb3VuZDsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQmFzZSBjbGFzcywgc3BlY2lhbGl6YXRpb24gZm9yIG5vIHN0b3JhZ2UgKHplcm8tbGVuZ3RoICViaXRzZXQpLgorICAgKgorICAgKiAgU2VlIGRvY3VtZW50YXRpb24gZm9yIGJpdHNldC4KKyAgKi8KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfQmFzZV9iaXRzZXQ8MD4KKyAgICB7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX1dvcmRUOworCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgX0Jhc2VfYml0c2V0KCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3RleHByIF9CYXNlX2JpdHNldCh1bnNpZ25lZCBsb25nIGxvbmcpIG5vZXhjZXB0CisjZWxzZQorICAgICAgX0Jhc2VfYml0c2V0KHVuc2lnbmVkIGxvbmcpCisjZW5kaWYKKyAgICAgIHsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpemVfdAorICAgICAgX1Nfd2hpY2h3b3JkKHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9fcG9zIC8gX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQ7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaXplX3QKKyAgICAgIF9TX3doaWNoYnl0ZShzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAoX19wb3MgJSBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRCkgLyBfX0NIQVJfQklUX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaXplX3QKKyAgICAgIF9TX3doaWNoYml0KHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgIHJldHVybiBfX3BvcyAlIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX1dvcmRUCisgICAgICBfU19tYXNrYml0KHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIChzdGF0aWNfY2FzdDxfV29yZFQ+KDEpKSA8PCBfU193aGljaGJpdChfX3Bvcyk7IH0KKworICAgICAgLy8gVGhpcyB3b3VsZCBub3JtYWxseSBnaXZlIGFjY2VzcyB0byB0aGUgZGF0YS4gIFRoZSBib3VuZHMtY2hlY2tpbmcKKyAgICAgIC8vIGluIHRoZSBiaXRzZXQgY2xhc3Mgd2lsbCBwcmV2ZW50IHRoZSB1c2VyIGZyb20gZ2V0dGluZyB0aGlzIGZhciwKKyAgICAgIC8vIGJ1dCAoMSkgaXQgbXVzdCBzdGlsbCByZXR1cm4gYW4gbHZhbHVlIHRvIGNvbXBpbGUsIGFuZCAoMikgdGhlCisgICAgICAvLyB1c2VyIG1pZ2h0IGNhbGwgX1VuY2hlY2tlZF9zZXQgZGlyZWN0bHksIGluIHdoaWNoIGNhc2UgdGhpcyAvbmVlZHMvCisgICAgICAvLyB0byBmYWlsLiAgTGV0J3Mgbm90IHBlbmFsaXplIHplcm8tbGVuZ3RoIHVzZXJzIHVubGVzcyB0aGV5IGFjdHVhbGx5CisgICAgICAvLyBtYWtlIGFuIHVuY2hlY2tlZCBjYWxsOyBhbGwgdGhlIG1lbW9yeSB1Z2xpbmVzcyBpcyB0aGVyZWZvcmUKKyAgICAgIC8vIGxvY2FsaXplZCB0byB0aGlzIHNpbmdsZSBzaG91bGQtbmV2ZXItZ2V0LXRoaXMtZmFyIGZ1bmN0aW9uLgorICAgICAgX1dvcmRUJgorICAgICAgX01fZ2V0d29yZChzaXplX3QpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJfQmFzZV9iaXRzZXQ6Ol9NX2dldHdvcmQiKSk7IAorCXJldHVybiAqbmV3IF9Xb3JkVDsKKyAgICAgIH0KKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIF9Xb3JkVAorICAgICAgX01fZ2V0d29yZChzaXplX3QgX19wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAwOyB9CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBfV29yZFQKKyAgICAgIF9NX2hpd29yZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAwOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2FuZChjb25zdCBfQmFzZV9iaXRzZXQ8MD4mKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX29yKGNvbnN0IF9CYXNlX2JpdHNldDwwPiYpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9feG9yKGNvbnN0IF9CYXNlX2JpdHNldDwwPiYpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fbGVmdF9zaGlmdChzaXplX3QpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fcmlnaHRfc2hpZnQoc2l6ZV90KSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2ZsaXAoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3NldCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fcmVzZXQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyB9CisKKyAgICAgIC8vIEFyZSBhbGwgZW1wdHkgYml0c2V0cyBlcXVhbCB0byBlYWNoIG90aGVyPyAgQXJlIHRoZXkgZXF1YWwgdG8KKyAgICAgIC8vIHRoZW1zZWx2ZXM/ICBIb3cgdG8gY29tcGFyZSBhIHRoaW5nIHdoaWNoIGhhcyBubyBzdGF0ZT8gIFdoYXQgaXMKKyAgICAgIC8vIHRoZSBzb3VuZCBvZiBvbmUgemVyby1sZW5ndGggYml0c2V0IGNsYXBwaW5nPworICAgICAgYm9vbAorICAgICAgX01faXNfZXF1YWwoY29uc3QgX0Jhc2VfYml0c2V0PDA+JikgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICAgICAgYm9vbAorICAgICAgICBfTV9hcmVfYWxsKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICBib29sCisgICAgICBfTV9pc19hbnkoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgc2l6ZV90CisgICAgICBfTV9kb19jb3VudCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAwOyB9CisKKyAgICAgIHVuc2lnbmVkIGxvbmcKKyAgICAgIF9NX2RvX3RvX3Vsb25nKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIDA7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZworICAgICAgX01fZG9fdG9fdWxsb25nKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCisgICAgICAvLyBOb3JtYWxseSAibm90IGZvdW5kIiBpcyB0aGUgc2l6ZSwgYnV0IHRoYXQgY291bGQgYWxzbyBiZQorICAgICAgLy8gbWlzaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXggaW4gdGhpcyBjb3JuZXIgY2FzZS4gIE9oIHdlbGwuCisgICAgICBzaXplX3QKKyAgICAgIF9NX2RvX2ZpbmRfZmlyc3Qoc2l6ZV90KSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICBzaXplX3QKKyAgICAgIF9NX2RvX2ZpbmRfbmV4dChzaXplX3QsIHNpemVfdCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIDA7IH0KKyAgICB9OworCisKKyAgLy8gSGVscGVyIGNsYXNzIHRvIHplcm8gb3V0IHRoZSB1bnVzZWQgaGlnaC1vcmRlciBiaXRzIGluIHRoZSBoaWdoZXN0IHdvcmQuCisgIHRlbXBsYXRlPHNpemVfdCBfRXh0cmFiaXRzPgorICAgIHN0cnVjdCBfU2FuaXRpemUKKyAgICB7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX1dvcmRUOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfZG9fc2FuaXRpemUoX1dvcmRUJiBfX3ZhbCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX192YWwgJj0gfigofnN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpIDw8IF9FeHRyYWJpdHMpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9TYW5pdGl6ZTwwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBfV29yZFQ7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19kb19zYW5pdGl6ZShfV29yZFQpIF9HTElCQ1hYX05PRVhDRVBUIHsgfSAKKyAgICB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTxzaXplX3QgX05iLCBib29sID0gX05iIDwgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1VMTD4KKyAgICBzdHJ1Y3QgX1Nhbml0aXplX3ZhbAorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgbG9uZyBsb25nCisgICAgICBfU19kb19zYW5pdGl6ZV92YWwodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKQorICAgICAgeyByZXR1cm4gX192YWw7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgc3RydWN0IF9TYW5pdGl6ZV92YWw8X05iLCB0cnVlPgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgbG9uZyBsb25nCisgICAgICBfU19kb19zYW5pdGl6ZV92YWwodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKQorICAgICAgeyByZXR1cm4gX192YWwgJiB+KCh+c3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPigwKSkgPDwgX05iKTsgfQorICAgIH07CisjZW5kaWYKKworICAvKioKKyAgICogIFRoZSAlYml0c2V0IGNsYXNzIHJlcHJlc2VudHMgYSBAZSBmaXhlZC1zaXplIHNlcXVlbmNlIG9mIGJpdHMuCisgICAqCisgICAqICBAaW5ncm91cCBjb250YWluZXJzCisgICAqCisgICAqICAoTm90ZSB0aGF0ICViaXRzZXQgZG9lcyBAZSBub3QgbWVldCB0aGUgZm9ybWFsIHJlcXVpcmVtZW50cyBvZiBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPi4gIE1haW5seSwgaXQgbGFja3MgaXRlcmF0b3JzLikKKyAgICoKKyAgICogIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCwgQGEgTmIsIG1heSBiZSBhbnkgbm9uLW5lZ2F0aXZlIG51bWJlciwKKyAgICogIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBiaXRzIChlLmcuLCAiMCIsICIxMiIsICIxMDI0KjEwMjQiKS4KKyAgICoKKyAgICogIEluIHRoZSBnZW5lcmFsIHVub3B0aW1pemVkIGNhc2UsIHN0b3JhZ2UgaXMgYWxsb2NhdGVkIGluIHdvcmQtc2l6ZWQKKyAgICogIGJsb2Nrcy4gIExldCBCIGJlIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIHdvcmQsIHRoZW4gKE5iKyhCLTEpKS9CCisgICAqICB3b3JkcyB3aWxsIGJlIHVzZWQgZm9yIHN0b3JhZ2UuICBCIC0gTmIlQiBiaXRzIGFyZSB1bnVzZWQuICAoVGhleSBhcmUKKyAgICogIHRoZSBoaWdoLW9yZGVyIGJpdHMgaW4gdGhlIGhpZ2hlc3Qgd29yZC4pICBJdCBpcyBhIGNsYXNzIGludmFyaWFudAorICAgKiAgdGhhdCB0aG9zZSB1bnVzZWQgYml0cyBhcmUgYWx3YXlzIHplcm8uCisgICAqCisgICAqICBJZiB5b3UgdGhpbmsgb2YgJWJpdHNldCBhcyA8ZW0+YSBzaW1wbGUgYXJyYXkgb2YgYml0czwvZW0+LCBiZQorICAgKiAgYXdhcmUgdGhhdCB5b3VyIG1lbnRhbCBwaWN0dXJlIGlzIHJldmVyc2VkOiBhICViaXRzZXQgYmVoYXZlcworICAgKiAgdGhlIHNhbWUgd2F5IGFzIGJpdHMgaW4gaW50ZWdlcnMgZG8sIHdpdGggdGhlIGJpdCBhdCBpbmRleCAwIGluCisgICAqICB0aGUgPGVtPmxlYXN0IHNpZ25pZmljYW50IC8gcmlnaHQtaGFuZDwvZW0+IHBvc2l0aW9uLCBhbmQgdGhlIGJpdCBhdAorICAgKiAgaW5kZXggTmItMSBpbiB0aGUgPGVtPm1vc3Qgc2lnbmlmaWNhbnQgLyBsZWZ0LWhhbmQ8L2VtPiBwb3NpdGlvbi4KKyAgICogIFRodXMsIHVubGlrZSBvdGhlciBjb250YWluZXJzLCBhICViaXRzZXQncyBpbmRleCA8ZW0+Y291bnRzIGZyb20KKyAgICogIHJpZ2h0IHRvIGxlZnQ8L2VtPiwgdG8gcHV0IGl0IHZlcnkgbG9vc2VseS4KKyAgICoKKyAgICogIFRoaXMgYmVoYXZpb3IgaXMgcHJlc2VydmVkIHdoZW4gdHJhbnNsYXRpbmcgdG8gYW5kIGZyb20gc3RyaW5ncy4gIEZvcgorICAgKiAgZXhhbXBsZSwgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGZvbGxvd2luZyBwcm9ncmFtIHByb2JhYmx5IHByaW50cworICAgKiAgPGVtPmIoJmFwb3M7YSZhcG9zOykgaXMgMDAwMTEwMDAwMTwvZW0+IG9uIGEgbW9kZXJuIEFTQ0lJIHN5c3RlbS4KKyAgICoKKyAgICogIEBjb2RlCisgICAqICAgICAjaW5jbHVkZSA8Yml0c2V0PgorICAgKiAgICAgI2luY2x1ZGUgPGlvc3RyZWFtPgorICAgKiAgICAgI2luY2x1ZGUgPHNzdHJlYW0+CisgICAqCisgICAqICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgKgorICAgKiAgICAgaW50IG1haW4oKQorICAgKiAgICAgeworICAgKiAgICAgICAgIGxvbmcgICAgICAgICBhID0gJ2EnOworICAgKiAgICAgICAgIGJpdHNldDwxMD4gICBiKGEpOworICAgKgorICAgKiAgICAgICAgIGNvdXQgPDwgImIoJ2EnKSBpcyAiIDw8IGIgPDwgZW5kbDsKKyAgICoKKyAgICogICAgICAgICBvc3RyaW5nc3RyZWFtIHM7CisgICAqICAgICAgICAgcyA8PCBiOworICAgKiAgICAgICAgIHN0cmluZyAgc3RyID0gcy5zdHIoKTsKKyAgICogICAgICAgICBjb3V0IDw8ICJpbmRleCAzIGluIHRoZSBzdHJpbmcgaXMgIiA8PCBzdHJbM10gPDwgIiBidXRcbiIKKyAgICogICAgICAgICAgICAgIDw8ICJpbmRleCAzIGluIHRoZSBiaXRzZXQgaXMgIiA8PCBiWzNdIDw8IGVuZGw7CisgICAqICAgICB9CisgICAqICBAZW5kY29kZQorICAgKgorICAgKiAgQWxzbyBzZWU6CisgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDEyY2gzM3MwMi5odG1sCisgICAqICBmb3IgYSBkZXNjcmlwdGlvbiBvZiBleHRlbnNpb25zLgorICAgKgorICAgKiAgTW9zdCBvZiB0aGUgYWN0dWFsIGNvZGUgaXNuJ3QgY29udGFpbmVkIGluICViaXRzZXQ8PiBpdHNlbGYsIGJ1dCBpbiB0aGUKKyAgICogIGJhc2UgY2xhc3MgX0Jhc2VfYml0c2V0LiAgVGhlIGJhc2UgY2xhc3Mgd29ya3Mgd2l0aCB3aG9sZSB3b3Jkcywgbm90IHdpdGgKKyAgICogIGluZGl2aWR1YWwgYml0cy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNwZWNpYWxpemUgX0Jhc2VfYml0c2V0IGZvciB0aGUKKyAgICogIGltcG9ydGFudCBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlICViaXRzZXQgaXMgb25seSBhIHNpbmdsZSB3b3JkLgorICAgKgorICAgKiAgRXh0cmEgY29uZnVzaW9uIGNhbiByZXN1bHQgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIHN0b3JhZ2UgZm9yCisgICAqICBfQmFzZV9iaXRzZXQgQGUgaXMgYSByZWd1bGFyIGFycmF5LCBhbmQgaXMgaW5kZXhlZCBhcyBzdWNoLiAgVGhpcyBpcworICAgKiAgY2FyZWZ1bGx5IGVuY2Fwc3VsYXRlZC4KKyAgKi8KKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBjbGFzcyBiaXRzZXQKKyAgICA6IHByaXZhdGUgX0Jhc2VfYml0c2V0PF9HTElCQ1hYX0JJVFNFVF9XT1JEUyhfTmIpPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfQmFzZV9iaXRzZXQ8X0dMSUJDWFhfQklUU0VUX1dPUkRTKF9OYik+IF9CYXNlOworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9Xb3JkVDsKKworICAgICAgdm9pZAorICAgICAgX01fZG9fc2FuaXRpemUoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyAKKwl0eXBlZGVmIF9TYW5pdGl6ZTxfTmIgJSBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRD4gX19zYW5pdGl6ZV90eXBlOworCV9fc2FuaXRpemVfdHlwZTo6X1NfZG9fc2FuaXRpemUodGhpcy0+X01faGl3b3JkKCkpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWU+IGZyaWVuZCBzdHJ1Y3QgaGFzaDsKKyNlbmRpZgorCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiAgVGhpcyBlbmNhcHN1bGF0ZXMgdGhlIGNvbmNlcHQgb2YgYSBzaW5nbGUgYml0LiAgQW4gaW5zdGFuY2Ugb2YgdGhpcworICAgICAgICogIGNsYXNzIGlzIGEgcHJveHkgZm9yIGFuIGFjdHVhbCBiaXQ7IHRoaXMgd2F5IHRoZSBpbmRpdmlkdWFsIGJpdAorICAgICAgICogIG9wZXJhdGlvbnMgYXJlIGRvbmUgYXMgZmFzdGVyIHdvcmQtc2l6ZSBiaXR3aXNlIGluc3RydWN0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiAgTW9zdCB1c2VycyB3aWxsIG5ldmVyIG5lZWQgdG8gdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHk7IGNvbnZlcnNpb25zCisgICAgICAgKiAgdG8gYW5kIGZyb20gYm9vbCBhcmUgYXV0b21hdGljIGFuZCBzaG91bGQgYmUgdHJhbnNwYXJlbnQuICBPdmVybG9hZGVkCisgICAgICAgKiAgb3BlcmF0b3JzIGhlbHAgdG8gcHJlc2VydmUgdGhlIGlsbHVzaW9uLgorICAgICAgICoKKyAgICAgICAqICAoT24gYSB0eXBpY2FsIHN5c3RlbSwgdGhpcyA8ZW0+Yml0ICVyZWZlcmVuY2U8L2VtPiBpcyA2NAorICAgICAgICogIHRpbWVzIHRoZSBzaXplIG9mIGFuIGFjdHVhbCBiaXQuICBIYS4pCisgICAgICAgKi8KKyAgICAgIGNsYXNzIHJlZmVyZW5jZQorICAgICAgeworCWZyaWVuZCBjbGFzcyBiaXRzZXQ7CisKKwlfV29yZFQqCV9NX3dwOworCXNpemVfdCAJX01fYnBvczsKKwkKKwkvLyBsZWZ0IHVuZGVmaW5lZAorCXJlZmVyZW5jZSgpOworCQorICAgICAgcHVibGljOgorCXJlZmVyZW5jZShiaXRzZXQmIF9fYiwgc2l6ZV90IF9fcG9zKSBfR0xJQkNYWF9OT0VYQ0VQVAorCXsKKwkgIF9NX3dwID0gJl9fYi5fTV9nZXR3b3JkKF9fcG9zKTsKKwkgIF9NX2Jwb3MgPSBfQmFzZTo6X1Nfd2hpY2hiaXQoX19wb3MpOworCX0KKworCX5yZWZlcmVuY2UoKSBfR0xJQkNYWF9OT0VYQ0VQVAorCXsgfQorCisJLy8gRm9yIGJbaV0gPSBfX3g7CisJcmVmZXJlbmNlJgorCW9wZXJhdG9yPShib29sIF9feCkgX0dMSUJDWFhfTk9FWENFUFQKKwl7CisJICBpZiAoX194KQorCSAgICAqX01fd3AgfD0gX0Jhc2U6Ol9TX21hc2tiaXQoX01fYnBvcyk7CisJICBlbHNlCisJICAgICpfTV93cCAmPSB+X0Jhc2U6Ol9TX21hc2tiaXQoX01fYnBvcyk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJLy8gRm9yIGJbaV0gPSBiW19fal07CisJcmVmZXJlbmNlJgorCW9wZXJhdG9yPShjb25zdCByZWZlcmVuY2UmIF9faikgX0dMSUJDWFhfTk9FWENFUFQKKwl7CisJICBpZiAoKCooX19qLl9NX3dwKSAmIF9CYXNlOjpfU19tYXNrYml0KF9fai5fTV9icG9zKSkpCisJICAgICpfTV93cCB8PSBfQmFzZTo6X1NfbWFza2JpdChfTV9icG9zKTsKKwkgIGVsc2UKKwkgICAgKl9NX3dwICY9IH5fQmFzZTo6X1NfbWFza2JpdChfTV9icG9zKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwkvLyBGbGlwcyB0aGUgYml0CisJYm9vbAorCW9wZXJhdG9yfigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisJeyByZXR1cm4gKCooX01fd3ApICYgX0Jhc2U6Ol9TX21hc2tiaXQoX01fYnBvcykpID09IDA7IH0KKworCS8vIEZvciBfX3ggPSBiW2ldOworCW9wZXJhdG9yIGJvb2woKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorCXsgcmV0dXJuICgqKF9NX3dwKSAmIF9CYXNlOjpfU19tYXNrYml0KF9NX2Jwb3MpKSAhPSAwOyB9CisKKwkvLyBGb3IgYltpXS5mbGlwKCk7CisJcmVmZXJlbmNlJgorCWZsaXAoKSBfR0xJQkNYWF9OT0VYQ0VQVAorCXsKKwkgICpfTV93cCBePSBfQmFzZTo6X1NfbWFza2JpdChfTV9icG9zKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisgICAgICB9OworICAgICAgZnJpZW5kIGNsYXNzIHJlZmVyZW5jZTsKKworICAgICAgLy8gMjMuMy41LjEgY29uc3RydWN0b3JzOgorICAgICAgLy8vIEFsbCBiaXRzIHNldCB0byB6ZXJvLgorICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGJpdHNldCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IH0KKworICAgICAgLy8vIEluaXRpYWwgYml0cyBiaXR3aXNlLWNvcGllZCBmcm9tIGEgc2luZ2xlIHdvcmQgKG90aGVycyBzZXQgdG8gemVybykuCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3RleHByIGJpdHNldCh1bnNpZ25lZCBsb25nIGxvbmcgX192YWwpIG5vZXhjZXB0CisgICAgICA6IF9CYXNlKF9TYW5pdGl6ZV92YWw8X05iPjo6X1NfZG9fc2FuaXRpemVfdmFsKF9fdmFsKSkgeyB9CisjZWxzZQorICAgICAgYml0c2V0KHVuc2lnbmVkIGxvbmcgX192YWwpCisgICAgICA6IF9CYXNlKF9fdmFsKQorICAgICAgeyBfTV9kb19zYW5pdGl6ZSgpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgVXNlIGEgc3Vic2V0IG9mIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zICBBIHN0cmluZyBvZiBAYSAwIGFuZCBAYSAxIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBJbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIEBhIF9fcyB0byB1c2U7CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gemVyby4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBwb3MgaXMgYmlnZ2VyIHRoZSBzaXplIG9mIEBhIF9fcy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6aW52YWxpZF9hcmd1bWVudCAgSWYgYSBjaGFyYWN0ZXIgYXBwZWFycyBpbiB0aGUgc3RyaW5nCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIG5laXRoZXIgQGEgMCBub3IgQGEgMS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisJZXhwbGljaXQKKwliaXRzZXQoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MsCisJICAgICAgIHNpemVfdCBfX3Bvc2l0aW9uID0gMCkKKwk6IF9CYXNlKCkKKwl7CisJICBpZiAoX19wb3NpdGlvbiA+IF9fcy5zaXplKCkpCisJICAgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYml0c2V0OjpiaXRzZXQgaW5pdGlhbCBwb3NpdGlvbiAiCisJCQkJICAgICAibm90IHZhbGlkIikpOworCSAgX01fY29weV9mcm9tX3N0cmluZyhfX3MsIF9fcG9zaXRpb24sCisJCQkgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Om5wb3MsCisJCQkgICAgICBfQ2hhclQoJzAnKSwgX0NoYXJUKCcxJykpOworCX0KKworICAgICAgLyoqCisgICAgICAgKiAgVXNlIGEgc3Vic2V0IG9mIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zICBBIHN0cmluZyBvZiBAYSAwIGFuZCBAYSAxIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBJbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIEBhIF9fcyB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtICBfX24gICAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkuCisgICAgICAgKiAgQHRocm93IHN0ZDo6b3V0X29mX3JhbmdlIElmIEBhIF9fcG9zaXRpb24gaXMgYmlnZ2VyIHRoZSBzaXplCisgICAgICAgKiAgb2YgQGEgX19zLgorICAgICAgICogIEB0aHJvdyAgc3RkOjppbnZhbGlkX2FyZ3VtZW50ICBJZiBhIGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSBzdHJpbmcKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgbmVpdGhlciBAYSAwIG5vciBAYSAxLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwliaXRzZXQoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MsCisJICAgICAgIHNpemVfdCBfX3Bvc2l0aW9uLCBzaXplX3QgX19uKQorCTogX0Jhc2UoKQorCXsKKwkgIGlmIChfX3Bvc2l0aW9uID4gX19zLnNpemUoKSkKKwkgICAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJiaXRzZXQ6OmJpdHNldCBpbml0aWFsIHBvc2l0aW9uICIKKwkJCQkgICAgICJub3QgdmFsaWQiKSk7CisJICBfTV9jb3B5X2Zyb21fc3RyaW5nKF9fcywgX19wb3NpdGlvbiwgX19uLCBfQ2hhclQoJzAnKSwgX0NoYXJUKCcxJykpOworCX0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzk2LiB3aGF0IGFyZSBjaGFyYWN0ZXJzIHplcm8gYW5kIG9uZS4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorCWJpdHNldChjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcywKKwkgICAgICAgc2l6ZV90IF9fcG9zaXRpb24sIHNpemVfdCBfX24sCisJICAgICAgIF9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKQorCTogX0Jhc2UoKQorCXsKKwkgIGlmIChfX3Bvc2l0aW9uID4gX19zLnNpemUoKSkKKwkgICAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJiaXRzZXQ6OmJpdHNldCBpbml0aWFsIHBvc2l0aW9uICIKKwkJCQkgICAgICJub3QgdmFsaWQiKSk7CisJICBfTV9jb3B5X2Zyb21fc3RyaW5nKF9fcywgX19wb3NpdGlvbiwgX19uLCBfX3plcm8sIF9fb25lKTsKKwl9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBDb25zdHJ1Y3QgZnJvbSBhIGNoYXJhY3RlciAlYXJyYXkuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgQW4gJWFycmF5IG9mIGNoYXJhY3RlcnMgQGEgemVybyBhbmQgQGEgb25lLgorICAgICAgICogIEBwYXJhbSAgX19uICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtICBfX3plcm8gVGhlIGNoYXJhY3RlciBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZSAwLgorICAgICAgICogIEBwYXJhbSAgX19vbmUgIFRoZSBjaGFyYWN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgdmFsdWUgMS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6aW52YWxpZF9hcmd1bWVudCBJZiBhIGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSBzdHJpbmcKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBpcyBuZWl0aGVyIEBhIF9femVybyBub3IgQGEgX19vbmUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgYml0c2V0KGNvbnN0IF9DaGFyVCogX19zdHIsCisJICAgICAgIHR5cGVuYW1lIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVD46OnNpemVfdHlwZSBfX24KKwkgICAgICAgPSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQ+OjpucG9zLAorCSAgICAgICBfQ2hhclQgX196ZXJvID0gX0NoYXJUKCcwJyksIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKQorICAgICAgICA6IF9CYXNlKCkKKyAgICAgICAgeworCSAgaWYgKCFfX3N0cikKKwkgICAgX190aHJvd19sb2dpY19lcnJvcihfX04oImJpdHNldDo6Yml0c2V0KGNvbnN0IF9DaGFyVCosIC4uLikiKSk7CisKKwkgIGlmIChfX24gPT0gc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJUPjo6bnBvcykKKwkgICAgX19uID0gc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+OjpsZW5ndGgoX19zdHIpOworCSAgX01fY29weV9mcm9tX3B0cjxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPj4oX19zdHIsIF9fbiwgMCwKKwkJCQkJCQkgICAgIF9fbiwgX196ZXJvLAorCQkJCQkJCSAgICAgX19vbmUpOworCX0KKyNlbmRpZgorCisgICAgICAvLyAyMy4zLjUuMiBiaXRzZXQgb3BlcmF0aW9uczoKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIE9wZXJhdGlvbnMgb24gYml0c2V0cy4KKyAgICAgICAqICBAcGFyYW0gIF9fcmhzICBBIHNhbWUtc2l6ZWQgYml0c2V0LgorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBzaG91bGQgYmUgc2VsZi1leHBsYW5hdG9yeS4KKyAgICAgICAqLworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvciY9KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwl0aGlzLT5fTV9kb19hbmQoX19yaHMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvcnw9KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwl0aGlzLT5fTV9kb19vcihfX3Jocyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yXj0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCXRoaXMtPl9NX2RvX3hvcihfX3Jocyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgLy9AfQorICAgICAgCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBPcGVyYXRpb25zIG9uIGJpdHNldHMuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBUaGUgbnVtYmVyIG9mIHBsYWNlcyB0byBzaGlmdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlc2Ugc2hvdWxkIGJlIHNlbGYtZXhwbGFuYXRvcnkuCisgICAgICAgKi8KKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3I8PD0oc2l6ZV90IF9fcG9zaXRpb24pIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX19wb3NpdGlvbiA8IF9OYiwgMSkpCisJICB7CisJICAgIHRoaXMtPl9NX2RvX2xlZnRfc2hpZnQoX19wb3NpdGlvbik7CisJICAgIHRoaXMtPl9NX2RvX3Nhbml0aXplKCk7CisJICB9CisJZWxzZQorCSAgdGhpcy0+X01fZG9fcmVzZXQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3I+Pj0oc2l6ZV90IF9fcG9zaXRpb24pIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX19wb3NpdGlvbiA8IF9OYiwgMSkpCisJICB7CisJICAgIHRoaXMtPl9NX2RvX3JpZ2h0X3NoaWZ0KF9fcG9zaXRpb24pOworCSAgICB0aGlzLT5fTV9kb19zYW5pdGl6ZSgpOworCSAgfQorCWVsc2UKKwkgIHRoaXMtPl9NX2RvX3Jlc2V0KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgLy9AfQorICAgICAgCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBUaGVzZSB2ZXJzaW9ucyBvZiBzaW5nbGUtYml0IHNldCwgcmVzZXQsIGZsaXAsIGFuZCB0ZXN0IGFyZQorICAgICAgICogIGV4dGVuc2lvbnMgZnJvbSB0aGUgU0dJIHZlcnNpb24uICBUaGV5IGRvIG5vIHJhbmdlIGNoZWNraW5nLgorICAgICAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICAgICAqLworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBfVW5jaGVja2VkX3NldChzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJdGhpcy0+X01fZ2V0d29yZChfX3BvcykgfD0gX0Jhc2U6Ol9TX21hc2tiaXQoX19wb3MpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBfVW5jaGVja2VkX3NldChzaXplX3QgX19wb3MsIGludCBfX3ZhbCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlpZiAoX192YWwpCisJICB0aGlzLT5fTV9nZXR3b3JkKF9fcG9zKSB8PSBfQmFzZTo6X1NfbWFza2JpdChfX3Bvcyk7CisJZWxzZQorCSAgdGhpcy0+X01fZ2V0d29yZChfX3BvcykgJj0gfl9CYXNlOjpfU19tYXNrYml0KF9fcG9zKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgX1VuY2hlY2tlZF9yZXNldChzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJdGhpcy0+X01fZ2V0d29yZChfX3BvcykgJj0gfl9CYXNlOjpfU19tYXNrYml0KF9fcG9zKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgX1VuY2hlY2tlZF9mbGlwKHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwl0aGlzLT5fTV9nZXR3b3JkKF9fcG9zKSBePSBfQmFzZTo6X1NfbWFza2JpdChfX3Bvcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgICAgX1VuY2hlY2tlZF90ZXN0KHNpemVfdCBfX3BvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuICgodGhpcy0+X01fZ2V0d29yZChfX3BvcykgJiBfQmFzZTo6X1NfbWFza2JpdChfX3BvcykpCisJCSE9IHN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpOyB9CisgICAgICAvL0B9CisgICAgICAKKyAgICAgIC8vIFNldCwgcmVzZXQsIGFuZCBmbGlwLgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFNldHMgZXZlcnkgYml0IHRvIHRydWUuCisgICAgICAgKi8KKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgc2V0KCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwl0aGlzLT5fTV9kb19zZXQoKTsKKwl0aGlzLT5fTV9kb19zYW5pdGl6ZSgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFNldHMgYSBnaXZlbiBiaXQgdG8gYSBwYXJ0aWN1bGFyIHZhbHVlLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgVGhlIGluZGV4IG9mIHRoZSBiaXQuCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbCAgRWl0aGVyIHRydWUgb3IgZmFsc2UsIGRlZmF1bHRzIHRvIHRydWUuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zIGlzIGJpZ2dlciB0aGUgc2l6ZSBvZiB0aGUgJXNldC4KKyAgICAgICAqLworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBzZXQoc2l6ZV90IF9fcG9zaXRpb24sIGJvb2wgX192YWwgPSB0cnVlKQorICAgICAgeworCWlmIChfX3Bvc2l0aW9uID49IF9OYikKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYml0c2V0OjpzZXQiKSk7CisJcmV0dXJuIF9VbmNoZWNrZWRfc2V0KF9fcG9zaXRpb24sIF9fdmFsKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFNldHMgZXZlcnkgYml0IHRvIGZhbHNlLgorICAgICAgICovCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIHJlc2V0KCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwl0aGlzLT5fTV9kb19yZXNldCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFNldHMgYSBnaXZlbiBiaXQgdG8gZmFsc2UuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBUaGUgaW5kZXggb2YgdGhlIGJpdC4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBwb3MgaXMgYmlnZ2VyIHRoZSBzaXplIG9mIHRoZSAlc2V0LgorICAgICAgICoKKyAgICAgICAqICBTYW1lIGFzIHdyaXRpbmcgQGMgc2V0KHBvcyxmYWxzZSkuCisgICAgICAgKi8KKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgcmVzZXQoc2l6ZV90IF9fcG9zaXRpb24pCisgICAgICB7CisJaWYgKF9fcG9zaXRpb24gPj0gX05iKQorCSAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJiaXRzZXQ6OnJlc2V0IikpOworCXJldHVybiBfVW5jaGVja2VkX3Jlc2V0KF9fcG9zaXRpb24pOworICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVG9nZ2xlcyBldmVyeSBiaXQgdG8gaXRzIG9wcG9zaXRlIHZhbHVlLgorICAgICAgICovCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIGZsaXAoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCXRoaXMtPl9NX2RvX2ZsaXAoKTsKKwl0aGlzLT5fTV9kb19zYW5pdGl6ZSgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRvZ2dsZXMgYSBnaXZlbiBiaXQgdG8gaXRzIG9wcG9zaXRlIHZhbHVlLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgVGhlIGluZGV4IG9mIHRoZSBiaXQuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zIGlzIGJpZ2dlciB0aGUgc2l6ZSBvZiB0aGUgJXNldC4KKyAgICAgICAqLworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBmbGlwKHNpemVfdCBfX3Bvc2l0aW9uKQorICAgICAgeworCWlmIChfX3Bvc2l0aW9uID49IF9OYikKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYml0c2V0OjpmbGlwIikpOworCXJldHVybiBfVW5jaGVja2VkX2ZsaXAoX19wb3NpdGlvbik7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vLyBTZWUgdGhlIG5vLWFyZ3VtZW50IGZsaXAoKS4KKyAgICAgIGJpdHNldDxfTmI+CisgICAgICBvcGVyYXRvcn4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oKnRoaXMpLmZsaXAoKTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFycmF5LWluZGV4aW5nIHN1cHBvcnQuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBJbmRleCBpbnRvIHRoZSAlYml0c2V0LgorICAgICAgICogIEByZXR1cm4gQSBib29sIGZvciBhIDxlbT5jb25zdCAlYml0c2V0PC9lbT4uICBGb3Igbm9uLWNvbnN0CisgICAgICAgKiAgICAgICAgICAgYml0c2V0cywgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlZmVyZW5jZSBwcm94eSBjbGFzcy4KKyAgICAgICAqICBAbm90ZSAgVGhlc2Ugb3BlcmF0b3JzIGRvIG5vIHJhbmdlIGNoZWNraW5nIGFuZCB0aHJvdyBubyBleGNlcHRpb25zLAorICAgICAgICogICAgICAgICBhcyByZXF1aXJlZCBieSBEUiAxMSB0byB0aGUgc3RhbmRhcmQuCisgICAgICAgKgorICAgICAgICogIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMgTm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gYWxyZWFkeQorICAgICAgICogIHJlc29sdmVzIERSIDExIChpdGVtcyAxIGFuZCAyKSwgYnV0IGRvZXMgbm90IGRvIHRoZSByYW5nZS1jaGVja2luZworICAgICAgICogIHJlcXVpcmVkIGJ5IHRoYXQgRFIncyByZXNvbHV0aW9uLiAgLXBtZQorICAgICAgICogIFRoZSBEUiBoYXMgc2luY2UgYmVlbiBjaGFuZ2VkOiAgcmFuZ2UtY2hlY2tpbmcgaXMgYSBwcmVjb25kaXRpb24KKyAgICAgICAqICAodXNlcnMnIHJlc3BvbnNpYmlsaXR5KSwgYW5kIHRoZXNlIGZ1bmN0aW9ucyBtdXN0IG5vdCB0aHJvdy4gIC1wbWUKKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdCBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gcmVmZXJlbmNlKCp0aGlzLCBfX3Bvc2l0aW9uKTsgfQorCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgICAgb3BlcmF0b3JbXShzaXplX3QgX19wb3NpdGlvbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9VbmNoZWNrZWRfdGVzdChfX3Bvc2l0aW9uKTsgfQorICAgICAgLy9AfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgUmV0dXJucyBhIG51bWVyaWNhbCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgJWJpdHNldC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgaW50ZWdyYWwgZXF1aXZhbGVudCBvZiB0aGUgYml0cy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3ZlcmZsb3dfZXJyb3IgIElmIHRoZXJlIGFyZSB0b28gbWFueSBiaXRzIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRlZCBpbiBhbiBAYyB1bnNpZ25lZCBAYyBsb25nLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBsb25nCisgICAgICB0b191bG9uZygpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9kb190b191bG9uZygpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICAgIHRvX3VsbG9uZygpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9kb190b191bGxvbmcoKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBSZXR1cm5zIGEgY2hhcmFjdGVyIGludGVycHJldGF0aW9uIG9mIHRoZSAlYml0c2V0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBzdHJpbmcgZXF1aXZhbGVudCBvZiB0aGUgYml0cy4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGUgb3JkZXJpbmcgb2YgdGhlIGJpdHM6ICBkZWNyZWFzaW5nIGNoYXJhY3RlciBwb3NpdGlvbnMKKyAgICAgICAqICBjb3JyZXNwb25kIHRvIGluY3JlYXNpbmcgYml0IHBvc2l0aW9ucyAoc2VlIHRoZSBtYWluIGNsYXNzIG5vdGVzIGZvcgorICAgICAgICogIGFuIGV4YW1wbGUpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKwl0b19zdHJpbmcoKSBjb25zdAorCXsKKwkgIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfX3Jlc3VsdDsKKwkgIF9NX2NvcHlfdG9fc3RyaW5nKF9fcmVzdWx0LCBfQ2hhclQoJzAnKSwgX0NoYXJUKCcxJykpOworCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzk2LiB3aGF0IGFyZSBjaGFyYWN0ZXJzIHplcm8gYW5kIG9uZS4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorCXN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorCXRvX3N0cmluZyhfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkgY29uc3QKKwl7CisJICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX19yZXN1bHQ7CisJICBfTV9jb3B5X3RvX3N0cmluZyhfX3Jlc3VsdCwgX196ZXJvLCBfX29uZSk7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzQuIGJpdHNldDo6dG9fc3RyaW5nKCkgaGFyZCB0byB1c2UuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisJc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4KKwl0b19zdHJpbmcoKSBjb25zdAorCXsgcmV0dXJuIHRvX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPigpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDg1My4gdG9fc3RyaW5nIG5lZWRzIHVwZGF0aW5nIHdpdGggemVybyBhbmQgb25lLgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorCXN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+CisJdG9fc3RyaW5nKF9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKSBjb25zdAorCXsgcmV0dXJuIHRvX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsCisJICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPihfX3plcm8sIF9fb25lKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CisJc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+CisJdG9fc3RyaW5nKCkgY29uc3QKKwl7CisJICByZXR1cm4gdG9fc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVD4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4KKwl0b19zdHJpbmcoX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpIGNvbnN0CisJeworCSAgcmV0dXJuIHRvX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+KF9femVybywgX19vbmUpOworCX0KKworICAgICAgc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICAgICAgdG9fc3RyaW5nKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gdG9fc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sCisJICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+KCk7CisgICAgICB9CisKKyAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sIHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgICAgIHRvX3N0cmluZyhjaGFyIF9femVybywgY2hhciBfX29uZSA9ICcxJykgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gdG9fc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sCisJICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+KF9femVybywgX19vbmUpOworICAgICAgfQorCisgICAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBzdHJpbmcgb3BlcmF0aW9ucy4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9jb3B5X2Zyb21fcHRyKGNvbnN0IF9DaGFyVCosIHNpemVfdCwgc2l6ZV90LCBzaXplX3QsCisJCQkgX0NoYXJULCBfQ2hhclQpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwl2b2lkCisJX01fY29weV9mcm9tX3N0cmluZyhjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsCisJCQkgICAgX1RyYWl0cywgX0FsbG9jPiYgX19zLCBzaXplX3QgX19wb3MsIHNpemVfdCBfX24sCisJCQkgICAgX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lKQorCXsgX01fY29weV9mcm9tX3B0cjxfQ2hhclQsIF9UcmFpdHM+KF9fcy5kYXRhKCksIF9fcy5zaXplKCksIF9fcG9zLCBfX24sCisJCQkJCSAgICBfX3plcm8sIF9fb25lKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwl2b2lkCisgICAgICAgIF9NX2NvcHlfdG9fc3RyaW5nKHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYsCisJCQkgIF9DaGFyVCwgX0NoYXJUKSBjb25zdDsKKworICAgICAgLy8gTkI6IEJhY2t3YXJkIGNvbXBhdC4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorCXZvaWQKKwlfTV9jb3B5X2Zyb21fc3RyaW5nKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwKKwkJCSAgICBfVHJhaXRzLCBfQWxsb2M+JiBfX3MsIHNpemVfdCBfX3Bvcywgc2l6ZV90IF9fbikKKwl7IF9NX2NvcHlfZnJvbV9zdHJpbmcoX19zLCBfX3BvcywgX19uLCBfQ2hhclQoJzAnKSwgX0NoYXJUKCcxJykpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorCXZvaWQKKyAgICAgICAgX01fY29weV90b19zdHJpbmcoc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLF9BbGxvYz4mIF9fcykgY29uc3QKKwl7IF9NX2NvcHlfdG9fc3RyaW5nKF9fcywgX0NoYXJUKCcwJyksIF9DaGFyVCgnMScpKTsgfQorCisgICAgICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgd2hpY2ggYXJlIHNldC4KKyAgICAgIHNpemVfdAorICAgICAgY291bnQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZG9fY291bnQoKTsgfQorCisgICAgICAvLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJpdHMuCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgc2l6ZV90CisgICAgICBzaXplKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9OYjsgfQorCisgICAgICAvL0B7CisgICAgICAvLy8gVGhlc2UgY29tcGFyaXNvbnMgZm9yIGVxdWFsaXR5L2luZXF1YWxpdHkgYXJlLCB3ZWxsLCBAZSBiaXR3aXNlLgorICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pc19lcXVhbChfX3Jocyk7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAhdGhpcy0+X01faXNfZXF1YWwoX19yaHMpOyB9CisgICAgICAvL0B9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUZXN0cyB0aGUgdmFsdWUgb2YgYSBiaXQuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBUaGUgaW5kZXggb2YgYSBiaXQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHZhbHVlIGF0IEBhIHBvcy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBwb3MgaXMgYmlnZ2VyIHRoZSBzaXplIG9mIHRoZSAlc2V0LgorICAgICAgICovCisgICAgICBib29sCisgICAgICB0ZXN0KHNpemVfdCBfX3Bvc2l0aW9uKSBjb25zdAorICAgICAgeworCWlmIChfX3Bvc2l0aW9uID49IF9OYikKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYml0c2V0Ojp0ZXN0IikpOworCXJldHVybiBfVW5jaGVja2VkX3Rlc3QoX19wb3NpdGlvbik7CisgICAgICB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDY5My4gc3RkOjpiaXRzZXQ6OmFsbCgpIG1pc3NpbmcuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVGVzdHMgd2hldGhlciBhbGwgdGhlIGJpdHMgYXJlIG9uLgorICAgICAgICogIEByZXR1cm4gIFRydWUgaWYgYWxsIHRoZSBiaXRzIGFyZSBzZXQuCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGFsbCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT50ZW1wbGF0ZSBfTV9hcmVfYWxsPF9OYj4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVGVzdHMgd2hldGhlciBhbnkgb2YgdGhlIGJpdHMgYXJlIG9uLgorICAgICAgICogIEByZXR1cm4gIFRydWUgaWYgYXQgbGVhc3Qgb25lIGJpdCBpcyBzZXQuCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGFueSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pc19hbnkoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVGVzdHMgd2hldGhlciBhbnkgb2YgdGhlIGJpdHMgYXJlIG9uLgorICAgICAgICogIEByZXR1cm4gIFRydWUgaWYgbm9uZSBvZiB0aGUgYml0cyBhcmUgc2V0LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBub25lKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuICF0aGlzLT5fTV9pc19hbnkoKTsgfQorCisgICAgICAvL0B7CisgICAgICAvLy8gU2VsZi1leHBsYW5hdG9yeS4KKyAgICAgIGJpdHNldDxfTmI+CisgICAgICBvcGVyYXRvcjw8KHNpemVfdCBfX3Bvc2l0aW9uKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oKnRoaXMpIDw8PSBfX3Bvc2l0aW9uOyB9CisKKyAgICAgIGJpdHNldDxfTmI+CisgICAgICBvcGVyYXRvcj4+KHNpemVfdCBfX3Bvc2l0aW9uKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oKnRoaXMpID4+PSBfX3Bvc2l0aW9uOyB9CisgICAgICAvL0B9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZHMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCAib24iIGJpdC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJpdCBzZXQsIG9yIHNpemUoKSBpZiBub3QgZm91bmQuCisgICAgICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgICAgICogIEBzYSAgX0ZpbmRfbmV4dAorICAgICAgICovCisgICAgICBzaXplX3QKKyAgICAgIF9GaW5kX2ZpcnN0KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2RvX2ZpbmRfZmlyc3QoX05iKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmRzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCAib24iIGJpdCBhZnRlciBwcmV2LgorICAgICAgICogIEByZXR1cm4gIFRoZSBpbmRleCBvZiB0aGUgbmV4dCBiaXQgc2V0LCBvciBzaXplKCkgaWYgbm90IGZvdW5kLgorICAgICAgICogIEBwYXJhbSAgX19wcmV2ICBXaGVyZSB0byBzdGFydCBzZWFyY2hpbmcuCisgICAgICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgICAgICogIEBzYSAgX0ZpbmRfZmlyc3QKKyAgICAgICAqLworICAgICAgc2l6ZV90CisgICAgICBfRmluZF9uZXh0KHNpemVfdCBfX3ByZXYpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9kb19maW5kX25leHQoX19wcmV2LCBfTmIpOyB9CisgICAgfTsKKworICAvLyBEZWZpbml0aW9ucyBvZiBub24taW5saW5lIG1lbWJlciBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgICAgdm9pZAorICAgICAgYml0c2V0PF9OYj46OgorICAgICAgX01fY29weV9mcm9tX3B0cihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90IF9fbGVuLAorCQkgICAgICAgc2l6ZV90IF9fcG9zLCBzaXplX3QgX19uLCBfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUpCisgICAgICB7CisJcmVzZXQoKTsKKwljb25zdCBzaXplX3QgX19uYml0cyA9IHN0ZDo6bWluKF9OYiwgc3RkOjptaW4oX19uLCBzaXplX3QoX19sZW4gLSBfX3BvcykpKTsKKwlmb3IgKHNpemVfdCBfX2kgPSBfX25iaXRzOyBfX2kgPiAwOyAtLV9faSkKKwkgIHsKKwkgICAgY29uc3QgX0NoYXJUIF9fYyA9IF9fc1tfX3BvcyArIF9fbmJpdHMgLSBfX2ldOworCSAgICBpZiAoX1RyYWl0czo6ZXEoX19jLCBfX3plcm8pKQorCSAgICAgIDsKKwkgICAgZWxzZSBpZiAoX1RyYWl0czo6ZXEoX19jLCBfX29uZSkpCisJICAgICAgX1VuY2hlY2tlZF9zZXQoX19pIC0gMSk7CisJICAgIGVsc2UKKwkgICAgICBfX3Rocm93X2ludmFsaWRfYXJndW1lbnQoX19OKCJiaXRzZXQ6Ol9NX2NvcHlfZnJvbV9wdHIiKSk7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyAgICAgIHZvaWQKKyAgICAgIGJpdHNldDxfTmI+OjoKKyAgICAgIF9NX2NvcHlfdG9fc3RyaW5nKHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zLAorCQkJX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lKSBjb25zdAorICAgICAgeworCV9fcy5hc3NpZ24oX05iLCBfX3plcm8pOworCWZvciAoc2l6ZV90IF9faSA9IF9OYjsgX19pID4gMDsgLS1fX2kpCisJICBpZiAoX1VuY2hlY2tlZF90ZXN0KF9faSAtIDEpKQorCSAgICBfVHJhaXRzOjphc3NpZ24oX19zW19OYiAtIF9faV0sIF9fb25lKTsKKyAgICAgIH0KKworICAvLyAyMy4zLjUuMyBiaXRzZXQgb3BlcmF0aW9uczoKKyAgLy9AeworICAvKioKKyAgICogIEBicmllZiAgR2xvYmFsIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiBiaXRzZXRzLgorICAgKiAgQHBhcmFtICBfX3ggIEEgYml0c2V0LgorICAgKiAgQHBhcmFtICBfX3kgIEEgYml0c2V0IG9mIHRoZSBzYW1lIHNpemUgYXMgQGEgX194LgorICAgKiAgQHJldHVybiAgQSBuZXcgYml0c2V0LgorICAgKgorICAgKiAgVGhlc2Ugc2hvdWxkIGJlIHNlbGYtZXhwbGFuYXRvcnkuCisgICovCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgaW5saW5lIGJpdHNldDxfTmI+CisgICAgb3BlcmF0b3ImKGNvbnN0IGJpdHNldDxfTmI+JiBfX3gsIGNvbnN0IGJpdHNldDxfTmI+JiBfX3kpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgYml0c2V0PF9OYj4gX19yZXN1bHQoX194KTsKKyAgICAgIF9fcmVzdWx0ICY9IF9feTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBpbmxpbmUgYml0c2V0PF9OYj4KKyAgICBvcGVyYXRvcnwoY29uc3QgYml0c2V0PF9OYj4mIF9feCwgY29uc3QgYml0c2V0PF9OYj4mIF9feSkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBiaXRzZXQ8X05iPiBfX3Jlc3VsdChfX3gpOworICAgICAgX19yZXN1bHQgfD0gX195OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZSA8c2l6ZV90IF9OYj4KKyAgICBpbmxpbmUgYml0c2V0PF9OYj4KKyAgICBvcGVyYXRvcl4oY29uc3QgYml0c2V0PF9OYj4mIF9feCwgY29uc3QgYml0c2V0PF9OYj4mIF9feSkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBiaXRzZXQ8X05iPiBfX3Jlc3VsdChfX3gpOworICAgICAgX19yZXN1bHQgXj0gX195OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKyAgLy9AfQorCisgIC8vQHsKKyAgLyoqCisgICAqICBAYnJpZWYgR2xvYmFsIEkvTyBvcGVyYXRvcnMgZm9yIGJpdHNldHMuCisgICAqCisgICAqICBEaXJlY3QgSS9PIGJldHdlZW4gc3RyZWFtcyBhbmQgYml0c2V0cyBpcyBzdXBwb3J0ZWQuICBPdXRwdXQgaXMKKyAgICogIHN0cmFpZ2h0Zm9yd2FyZC4gIElucHV0IHdpbGwgc2tpcCB3aGl0ZXNwYWNlLCBvbmx5IGFjY2VwdCBAYSAwIGFuZCBAYSAxCisgICAqICBjaGFyYWN0ZXJzLCBhbmQgd2lsbCBvbmx5IGV4dHJhY3QgYXMgbWFueSBkaWdpdHMgYXMgdGhlICViaXRzZXQgd2lsbAorICAgKiAgaG9sZC4KKyAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBzaXplX3QgX05iPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGJpdHNldDxfTmI+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUgICAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHM+IF9fdG1wOworICAgICAgX190bXAucmVzZXJ2ZShfTmIpOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAzMDMuIEJpdHNldCBpbnB1dCBvcGVyYXRvciB1bmRlcnNwZWNpZmllZAorICAgICAgY29uc3QgY2hhcl90eXBlIF9femVybyA9IF9faXMud2lkZW4oJzAnKTsKKyAgICAgIGNvbnN0IGNoYXJfdHlwZSBfX29uZSA9IF9faXMud2lkZW4oJzEnKTsKKworICAgICAgdHlwZW5hbWUgX19pb3NfYmFzZTo6aW9zdGF0ZSBfX3N0YXRlID0gX19pb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjpzZW50cnkgX19zZW50cnkoX19pcyk7CisgICAgICBpZiAoX19zZW50cnkpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIGZvciAoc2l6ZV90IF9faSA9IF9OYjsgX19pID4gMDsgLS1fX2kpCisJCXsKKwkJICBzdGF0aWMgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX19lb2YgPSBfVHJhaXRzOjplb2YoKTsKKwkJICAKKwkJICB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX2MxID0gX19pcy5yZGJ1ZigpLT5zYnVtcGMoKTsKKwkJICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jMSwgX19lb2YpKQorCQkgICAgeworCQkgICAgICBfX3N0YXRlIHw9IF9faW9zX2Jhc2U6OmVvZmJpdDsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBjb25zdCBjaGFyX3R5cGUgX19jMiA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MxKTsKKwkJICAgICAgaWYgKF9UcmFpdHM6OmVxKF9fYzIsIF9femVybykpCisJCQlfX3RtcC5wdXNoX2JhY2soX196ZXJvKTsKKwkJICAgICAgZWxzZSBpZiAoX1RyYWl0czo6ZXEoX19jMiwgX19vbmUpKQorCQkJX190bXAucHVzaF9iYWNrKF9fb25lKTsKKwkJICAgICAgZWxzZSBpZiAoX1RyYWl0czo6CisJCQkgICAgICAgZXFfaW50X3R5cGUoX19pcy5yZGJ1ZigpLT5zcHV0YmFja2MoX19jMiksCisJCQkJCSAgIF9fZW9mKSkKKwkJCXsKKwkJCSAgX19zdGF0ZSB8PSBfX2lvc19iYXNlOjpmYWlsYml0OworCQkJICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICBfX2lzLl9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CQkKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgX19pcy5fTV9zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOyB9CisJfQorCisgICAgICBpZiAoX190bXAuZW1wdHkoKSAmJiBfTmIpCisJX19zdGF0ZSB8PSBfX2lvc19iYXNlOjpmYWlsYml0OworICAgICAgZWxzZQorCV9feC5fTV9jb3B5X2Zyb21fc3RyaW5nKF9fdG1wLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDApLCBfTmIsCisJCQkJX196ZXJvLCBfX29uZSk7CisgICAgICBpZiAoX19zdGF0ZSkKKwlfX2lzLnNldHN0YXRlKF9fc3RhdGUpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIHNpemVfdCBfTmI+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgYml0c2V0PF9OYj4mIF9feCkKKyAgICB7CisgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHM+IF9fdG1wOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAzOTYuIHdoYXQgYXJlIGNoYXJhY3RlcnMgemVybyBhbmQgb25lLgorICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdCA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19vcy5nZXRsb2MoKSk7CisgICAgICBfX3guX01fY29weV90b19zdHJpbmcoX190bXAsIF9fY3Qud2lkZW4oJzAnKSwgX19jdC53aWRlbignMScpKTsKKyAgICAgIHJldHVybiBfX29zIDw8IF9fdG1wOworICAgIH0KKyAgLy9AfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyN1bmRlZiBfR0xJQkNYWF9CSVRTRVRfV09SRFMKKyN1bmRlZiBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRAorI3VuZGVmIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9VTEwKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworI2luY2x1ZGUgPGJpdHMvZnVuY3Rpb25hbF9oYXNoLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBEUiAxMTgyLgorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBiaXRzZXQuCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgc3RydWN0IGhhc2g8X0dMSUJDWFhfU1REX0M6OmJpdHNldDxfTmI+PgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgX0dMSUJDWFhfU1REX0M6OmJpdHNldDxfTmI+PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfR0xJQkNYWF9TVERfQzo6Yml0c2V0PF9OYj4mIF9fYikgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwljb25zdCBzaXplX3QgX19jbGVuZ3RoID0gKF9OYiArIF9fQ0hBUl9CSVRfXyAtIDEpIC8gX19DSEFSX0JJVF9fOworCXJldHVybiBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19iLl9NX2dldGRhdGEoKSwgX19jbGVuZ3RoKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxfR0xJQkNYWF9TVERfQzo6Yml0c2V0PDA+PgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgX0dMSUJDWFhfU1REX0M6OmJpdHNldDwwPj4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0dMSUJDWFhfU1REX0M6OmJpdHNldDwwPiYpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiAwOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gQysrMTEKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGluY2x1ZGUgPGRlYnVnL2JpdHNldD4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfUFJPRklMRQorIyBpbmNsdWRlIDxwcm9maWxlL2JpdHNldD4KKyNlbmRpZgorCisjZW5kaWYgLyogX0dMSUJDWFhfQklUU0VUICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Nhc3NlcnQgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Nhc3NlcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4NWMyMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2Fzc2VydApAQCAtMCwwICsxLDQzIEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGNhc3NlcnQKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyBhc3NlcnQuaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDE5LjIgIEFzc2VydGlvbnMKKy8vCisKKy8vIE5vIGluY2x1ZGUgZ3VhcmRzIG9uIHRoaXMgaGVhZGVyLi4uCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGFzc2VydC5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jY29tcGxleCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2NvbXBsZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5ODk5MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2NvbXBsZXgKQEAgLTAsMCArMSw0MCBAQAorLy8gPGNjb21wbGV4PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jY29tcGxleAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWZuZGVmIF9HTElCQ1hYX0NDT01QTEVYCisjZGVmaW5lIF9HTElCQ1hYX0NDT01QTEVYIDEKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y29tcGxleD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NjdHlwZSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2N0eXBlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZjg4M2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NjdHlwZQpAQCAtMCwwICsxLDk0IEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY2N0eXBlCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgY3R5cGUuaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDxjY3l0cGU+CisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ0NUWVBFCisjZGVmaW5lIF9HTElCQ1hYX0NDVFlQRSAxCisKKy8vIEdldCByaWQgb2YgdGhvc2UgbWFjcm9zIGRlZmluZWQgaW4gPGN0eXBlLmg+IGluIGxpZXUgb2YgcmVhbCBmdW5jdGlvbnMuCisjdW5kZWYgaXNhbG51bQorI3VuZGVmIGlzYWxwaGEKKyN1bmRlZiBpc2NudHJsCisjdW5kZWYgaXNkaWdpdAorI3VuZGVmIGlzZ3JhcGgKKyN1bmRlZiBpc2xvd2VyCisjdW5kZWYgaXNwcmludAorI3VuZGVmIGlzcHVuY3QKKyN1bmRlZiBpc3NwYWNlCisjdW5kZWYgaXN1cHBlcgorI3VuZGVmIGlzeGRpZ2l0CisjdW5kZWYgdG9sb3dlcgorI3VuZGVmIHRvdXBwZXIKKworbmFtZXNwYWNlIHN0ZAoreworICB1c2luZyA6OmlzYWxudW07CisgIHVzaW5nIDo6aXNhbHBoYTsKKyAgdXNpbmcgOjppc2NudHJsOworICB1c2luZyA6OmlzZGlnaXQ7CisgIHVzaW5nIDo6aXNncmFwaDsKKyAgdXNpbmcgOjppc2xvd2VyOworICB1c2luZyA6OmlzcHJpbnQ7CisgIHVzaW5nIDo6aXNwdW5jdDsKKyAgdXNpbmcgOjppc3NwYWNlOworICB1c2luZyA6OmlzdXBwZXI7CisgIHVzaW5nIDo6aXN4ZGlnaXQ7CisgIHVzaW5nIDo6dG9sb3dlcjsKKyAgdXNpbmcgOjp0b3VwcGVyOworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X0NUWVBFX1RSMQorCisjdW5kZWYgaXNibGFuaworCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6aXNibGFuazsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9DVFlQRV9UUjEKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jZXJybm8gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NlcnJubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzVjYzRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jZXJybm8KQEAgLTAsMCArMSw1MSBAQAorLy8gVGhlIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgY2Vycm5vCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgZXJybm8uaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDE5LjMgIEVycm9yIG51bWJlcnMKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ0VSUk5PCisjZGVmaW5lIF9HTElCQ1hYX0NFUlJOTyAxCisKKy8vIEFkaGVyZSB0byBzZWN0aW9uIDE3LjQuMS4yIGNsYXVzZSA1IG9mIElTTyAxNDg4MjoxOTk4CisjaWZuZGVmIGVycm5vCisjZGVmaW5lIGVycm5vIGVycm5vCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NmZW52IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jZmVudgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjk2YzE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jZmVudgpAQCAtMCwwICsxLDg0IEBACisvLyA8Y2ZlbnY+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2NmZW52CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0NGRU5WCisjZGVmaW5lIF9HTElCQ1hYX0NGRU5WIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKyNpZiBfR0xJQkNYWF9IQVZFX0ZFTlZfSAorIyBpbmNsdWRlIDxmZW52Lmg+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfRkVOVl9UUjEKKworI3VuZGVmIGZlY2xlYXJleGNlcHQKKyN1bmRlZiBmZWdldGV4Y2VwdGZsYWcKKyN1bmRlZiBmZXJhaXNlZXhjZXB0CisjdW5kZWYgZmVzZXRleGNlcHRmbGFnCisjdW5kZWYgZmV0ZXN0ZXhjZXB0CisjdW5kZWYgZmVnZXRyb3VuZAorI3VuZGVmIGZlc2V0cm91bmQKKyN1bmRlZiBmZWdldGVudgorI3VuZGVmIGZlaG9sZGV4Y2VwdAorI3VuZGVmIGZlc2V0ZW52CisjdW5kZWYgZmV1cGRhdGVlbnYKKworbmFtZXNwYWNlIHN0ZAoreworICAvLyB0eXBlcworICB1c2luZyA6OmZlbnZfdDsKKyAgdXNpbmcgOjpmZXhjZXB0X3Q7CisKKyAgLy8gZnVuY3Rpb25zCisgIHVzaW5nIDo6ZmVjbGVhcmV4Y2VwdDsKKyAgdXNpbmcgOjpmZWdldGV4Y2VwdGZsYWc7CisgIHVzaW5nIDo6ZmVyYWlzZWV4Y2VwdDsKKyAgdXNpbmcgOjpmZXNldGV4Y2VwdGZsYWc7CisgIHVzaW5nIDo6ZmV0ZXN0ZXhjZXB0OworCisgIHVzaW5nIDo6ZmVnZXRyb3VuZDsKKyAgdXNpbmcgOjpmZXNldHJvdW5kOworCisgIHVzaW5nIDo6ZmVnZXRlbnY7CisgIHVzaW5nIDo6ZmVob2xkZXhjZXB0OworICB1c2luZyA6OmZlc2V0ZW52OworICB1c2luZyA6OmZldXBkYXRlZW52OworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5X0ZFTlZfVFIxCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfQ0ZFTlYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2Zsb2F0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jZmxvYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiMDYzMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2Zsb2F0CkBAIC0wLDAgKzEsNTUgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jZmxvYXQKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyBmbG9hdC5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMTguMi4yICBJbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzOiBDIGxpYnJhcnkKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ0ZMT0FUCisjZGVmaW5lIF9HTElCQ1hYX0NGTE9BVCAxCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjICBpZm5kZWYgREVDSU1BTF9ESUcKKyMgICAgZGVmaW5lIERFQ0lNQUxfRElHIF9fREVDSU1BTF9ESUdfXworIyAgZW5kaWYKKyMgIGlmbmRlZiBGTFRfRVZBTF9NRVRIT0QKKyMgICAgZGVmaW5lIEZMVF9FVkFMX01FVEhPRCBfX0ZMVF9FVkFMX01FVEhPRF9fCisjICBlbmRpZgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jaHJvbm8gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Nocm9ubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDlkZjdkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jaHJvbm8KQEAgLTAsMCArMSw3ODkgQEAKKy8vIDxjaHJvbm8+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2Nocm9ubworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9DSFJPTk8KKyNkZWZpbmUgX0dMSUJDWFhfQ0hST05PIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPHJhdGlvPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxjdGltZT4KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKKyAgLyoqCisgICAqIEBkZWZncm91cCBjaHJvbm8gVGltZQorICAgKiBAaW5ncm91cCB1dGlsaXRpZXMKKyAgICoKKyAgICogQ2xhc3NlcyBhbmQgZnVuY3Rpb25zIGZvciB0aW1lLgorICAgKiBAeworICAgKi8KKworICAvKiogQG5hbWVzcGFjZSBzdGQ6OmNocm9ubworICAgKiAgQGJyaWVmIElTTyBDKysgMjAxMSBlbnRpdGllcyBzdWItbmFtZXNwYWNlIGZvciB0aW1lIGFuZCBkYXRlLgorICAgKi8KKyAgbmFtZXNwYWNlIGNocm9ubworICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kID0gcmF0aW88MT4+CisgICAgICBzdHJ1Y3QgZHVyYXRpb247CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIgPSB0eXBlbmFtZSBfQ2xvY2s6OmR1cmF0aW9uPgorICAgICAgc3RydWN0IHRpbWVfcG9pbnQ7CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0KKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyAyMC4xMS40LjMgc3BlY2lhbGl6YXRpb24gb2YgY29tbW9uX3R5cGUgKGZvciBkdXJhdGlvbiwgc2ZpbmFlLWZyaWVuZGx5KQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NULCB0eXBlbmFtZSBfUGVyaW9kMSwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgc3RydWN0IF9fZHVyYXRpb25fY29tbW9uX3R5cGVfd3JhcHBlcgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX3N0YXRpY19nY2Q8X1BlcmlvZDE6Om51bSwgX1BlcmlvZDI6Om51bT4gX19nY2RfbnVtOworICAgICAgdHlwZWRlZiBfX3N0YXRpY19nY2Q8X1BlcmlvZDE6OmRlbiwgX1BlcmlvZDI6OmRlbj4gX19nY2RfZGVuOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ1Q6OnR5cGUgX19jcjsKKyAgICAgIHR5cGVkZWYgcmF0aW88X19nY2RfbnVtOjp2YWx1ZSwKKyAgICAgICAgKF9QZXJpb2QxOjpkZW4gLyBfX2djZF9kZW46OnZhbHVlKSAqIF9QZXJpb2QyOjpkZW4+IF9fcjsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9fc3VjY2Vzc190eXBlPGNocm9ubzo6ZHVyYXRpb248X19jciwgX19yPj4gdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QZXJpb2QxLCB0eXBlbmFtZSBfUGVyaW9kMj4KKyAgICBzdHJ1Y3QgX19kdXJhdGlvbl9jb21tb25fdHlwZV93cmFwcGVyPF9fZmFpbHVyZV90eXBlLCBfUGVyaW9kMSwgX1BlcmlvZDI+CisgICAgeyB0eXBlZGVmIF9fZmFpbHVyZV90eXBlIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLCB0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgc3RydWN0IGNvbW1vbl90eXBlPGNocm9ubzo6ZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiwKKyAgICAgICAgICAgICBjaHJvbm86OmR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4+CisgICAgOiBwdWJsaWMgX19kdXJhdGlvbl9jb21tb25fdHlwZV93cmFwcGVyPHR5cGVuYW1lIF9fbWVtYmVyX3R5cGVfd3JhcHBlcjwKKyAgICAgICAgICAgICBjb21tb25fdHlwZTxfUmVwMSwgX1JlcDI+Pjo6dHlwZSwgX1BlcmlvZDEsIF9QZXJpb2QyPjo6dHlwZQorICAgIHsgfTsKKworICAvLyAyMC4xMS40LjMgc3BlY2lhbGl6YXRpb24gb2YgY29tbW9uX3R5cGUgKGZvciB0aW1lX3BvaW50LCBzZmluYWUtZnJpZW5kbHkpCisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1QsIHR5cGVuYW1lIF9DbG9jaz4KKyAgICBzdHJ1Y3QgX190aW1lcG9pbnRfY29tbW9uX3R5cGVfd3JhcHBlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX19zdWNjZXNzX3R5cGU8Y2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgdHlwZW5hbWUgX0NUOjp0eXBlPj4KKyAgICAgICAgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaz4KKyAgICBzdHJ1Y3QgX190aW1lcG9pbnRfY29tbW9uX3R5cGVfd3JhcHBlcjxfX2ZhaWx1cmVfdHlwZSwgX0Nsb2NrPgorICAgIHsgdHlwZWRlZiBfX2ZhaWx1cmVfdHlwZSB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cmF0aW9uMSwgdHlwZW5hbWUgX0R1cmF0aW9uMj4KKyAgICBzdHJ1Y3QgY29tbW9uX3R5cGU8Y2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uMT4sCisgICAgICAgICAgICAgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uMj4+CisgICAgOiBwdWJsaWMgX190aW1lcG9pbnRfY29tbW9uX3R5cGVfd3JhcHBlcjx0eXBlbmFtZSBfX21lbWJlcl90eXBlX3dyYXBwZXI8CisgICAgICAgICAgICAgY29tbW9uX3R5cGU8X0R1cmF0aW9uMSwgX0R1cmF0aW9uMj4+Ojp0eXBlLCBfQ2xvY2s+Ojp0eXBlCisgICAgeyB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKworICBuYW1lc3BhY2UgY2hyb25vCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8vIFByaW1hcnkgdGVtcGxhdGUgZm9yIGR1cmF0aW9uX2Nhc3QgaW1wbC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9EdXIsIHR5cGVuYW1lIF9DRiwgdHlwZW5hbWUgX0NSLAorCSAgICAgYm9vbCBfTnVtSXNPbmUgPSBmYWxzZSwgYm9vbCBfRGVuSXNPbmUgPSBmYWxzZT4KKyAgICAgIHN0cnVjdCBfX2R1cmF0aW9uX2Nhc3RfaW1wbAorICAgICAgeworCXRlbXBsYXRlPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisJICBzdGF0aWMgY29uc3RleHByIF9Ub0R1cgorCSAgX19jYXN0KGNvbnN0IGR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX2QpCisJICB7CisJICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RvRHVyOjpyZXAJCQlfX3RvX3JlcDsKKwkgICAgcmV0dXJuIF9Ub0R1cihzdGF0aWNfY2FzdDxfX3RvX3JlcD4oc3RhdGljX2Nhc3Q8X0NSPihfX2QuY291bnQoKSkKKwkgICAgICAqIHN0YXRpY19jYXN0PF9DUj4oX0NGOjpudW0pCisJICAgICAgLyBzdGF0aWNfY2FzdDxfQ1I+KF9DRjo6ZGVuKSkpOworCSAgfQorICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub0R1ciwgdHlwZW5hbWUgX0NGLCB0eXBlbmFtZSBfQ1I+CisgICAgICBzdHJ1Y3QgX19kdXJhdGlvbl9jYXN0X2ltcGw8X1RvRHVyLCBfQ0YsIF9DUiwgdHJ1ZSwgdHJ1ZT4KKyAgICAgIHsKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorCSAgc3RhdGljIGNvbnN0ZXhwciBfVG9EdXIKKwkgIF9fY2FzdChjb25zdCBkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19kKQorCSAgeworCSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ub0R1cjo6cmVwCQkJX190b19yZXA7CisJICAgIHJldHVybiBfVG9EdXIoc3RhdGljX2Nhc3Q8X190b19yZXA+KF9fZC5jb3VudCgpKSk7CisJICB9CisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RvRHVyLCB0eXBlbmFtZSBfQ0YsIHR5cGVuYW1lIF9DUj4KKyAgICAgIHN0cnVjdCBfX2R1cmF0aW9uX2Nhc3RfaW1wbDxfVG9EdXIsIF9DRiwgX0NSLCB0cnVlLCBmYWxzZT4KKyAgICAgIHsKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorCSAgc3RhdGljIGNvbnN0ZXhwciBfVG9EdXIKKwkgIF9fY2FzdChjb25zdCBkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19kKQorCSAgeworCSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ub0R1cjo6cmVwCQkJX190b19yZXA7CisJICAgIHJldHVybiBfVG9EdXIoc3RhdGljX2Nhc3Q8X190b19yZXA+KAorCSAgICAgIHN0YXRpY19jYXN0PF9DUj4oX19kLmNvdW50KCkpIC8gc3RhdGljX2Nhc3Q8X0NSPihfQ0Y6OmRlbikpKTsKKwkgIH0KKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9EdXIsIHR5cGVuYW1lIF9DRiwgdHlwZW5hbWUgX0NSPgorICAgICAgc3RydWN0IF9fZHVyYXRpb25fY2FzdF9pbXBsPF9Ub0R1ciwgX0NGLCBfQ1IsIGZhbHNlLCB0cnVlPgorICAgICAgeworCXRlbXBsYXRlPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisJICBzdGF0aWMgY29uc3RleHByIF9Ub0R1cgorCSAgX19jYXN0KGNvbnN0IGR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX2QpCisJICB7CisJICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RvRHVyOjpyZXAJCQlfX3RvX3JlcDsKKwkgICAgcmV0dXJuIF9Ub0R1cihzdGF0aWNfY2FzdDxfX3RvX3JlcD4oCisJICAgICAgc3RhdGljX2Nhc3Q8X0NSPihfX2QuY291bnQoKSkgKiBzdGF0aWNfY2FzdDxfQ1I+KF9DRjo6bnVtKSkpOworCSAgfQorICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0cnVjdCBfX2lzX2R1cmF0aW9uCisgICAgICA6IHN0ZDo6ZmFsc2VfdHlwZQorICAgICAgeyB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZD4KKyAgICAgIHN0cnVjdCBfX2lzX2R1cmF0aW9uPGR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+PgorICAgICAgOiBzdGQ6OnRydWVfdHlwZQorICAgICAgeyB9OworCisgICAgLy8vIGR1cmF0aW9uX2Nhc3QKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9EdXIsIHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICBjb25zdGV4cHIgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfZHVyYXRpb248X1RvRHVyPjo6dmFsdWUsCisJCQkJICAgX1RvRHVyPjo6dHlwZQorICAgICAgZHVyYXRpb25fY2FzdChjb25zdCBkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19kKQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX1RvRHVyOjpwZXJpb2QJCQkJX190b19wZXJpb2Q7CisJdHlwZWRlZiB0eXBlbmFtZSBfVG9EdXI6OnJlcAkJCQlfX3RvX3JlcDsKKwl0eXBlZGVmIHJhdGlvX2RpdmlkZTxfUGVyaW9kLCBfX3RvX3BlcmlvZD4gCQlfX2NmOworCXR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X190b19yZXAsIF9SZXAsIGludG1heF90Pjo6dHlwZQorCSAgCQkJCQkJCV9fY3I7CisJdHlwZWRlZiAgX19kdXJhdGlvbl9jYXN0X2ltcGw8X1RvRHVyLCBfX2NmLCBfX2NyLAorCQkJCSAgICAgIF9fY2Y6Om51bSA9PSAxLCBfX2NmOjpkZW4gPT0gMT4gX19kYzsKKwlyZXR1cm4gX19kYzo6X19jYXN0KF9fZCk7CisgICAgICB9CisKKyAgICAvLy8gdHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwPgorICAgICAgc3RydWN0IHRyZWF0X2FzX2Zsb2F0aW5nX3BvaW50CisgICAgICA6IGlzX2Zsb2F0aW5nX3BvaW50PF9SZXA+CisgICAgICB7IH07CisKKyAgICAvLy8gZHVyYXRpb25fdmFsdWVzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcD4KKyAgICAgIHN0cnVjdCBkdXJhdGlvbl92YWx1ZXMKKyAgICAgIHsKKwlzdGF0aWMgY29uc3RleHByIF9SZXAKKwl6ZXJvKCkKKwl7IHJldHVybiBfUmVwKDApOyB9CisKKwlzdGF0aWMgY29uc3RleHByIF9SZXAKKwltYXgoKQorCXsgcmV0dXJuIG51bWVyaWNfbGltaXRzPF9SZXA+OjptYXgoKTsgfQorCisJc3RhdGljIGNvbnN0ZXhwciBfUmVwCisJbWluKCkKKwl7IHJldHVybiBudW1lcmljX2xpbWl0czxfUmVwPjo6bG93ZXN0KCk7IH0KKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdHJ1Y3QgX19pc19yYXRpbworICAgICAgOiBzdGQ6OmZhbHNlX3R5cGUKKyAgICAgIHsgfTsKKworICAgIHRlbXBsYXRlPGludG1heF90IF9OdW0sIGludG1heF90IF9EZW4+CisgICAgICBzdHJ1Y3QgX19pc19yYXRpbzxyYXRpbzxfTnVtLCBfRGVuPj4KKyAgICAgIDogc3RkOjp0cnVlX3R5cGUKKyAgICAgIHsgfTsKKworICAgIC8vLyBkdXJhdGlvbgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICBzdHJ1Y3QgZHVyYXRpb24KKyAgICAgIHsKKwl0eXBlZGVmIF9SZXAJCQkJCQlyZXA7CisJdHlwZWRlZiBfUGVyaW9kIAkJCQkJcGVyaW9kOworCisJc3RhdGljX2Fzc2VydCghX19pc19kdXJhdGlvbjxfUmVwPjo6dmFsdWUsICJyZXAgY2Fubm90IGJlIGEgZHVyYXRpb24iKTsKKwlzdGF0aWNfYXNzZXJ0KF9faXNfcmF0aW88X1BlcmlvZD46OnZhbHVlLAorCQkgICAgICAicGVyaW9kIG11c3QgYmUgYSBzcGVjaWFsaXphdGlvbiBvZiByYXRpbyIpOworCXN0YXRpY19hc3NlcnQoX1BlcmlvZDo6bnVtID4gMCwgInBlcmlvZCBtdXN0IGJlIHBvc2l0aXZlIik7CisKKwkvLyAyMC4xMS41LjEgY29uc3RydWN0aW9uIC8gY29weSAvIGRlc3Ryb3kKKwljb25zdGV4cHIgZHVyYXRpb24oKSA9IGRlZmF1bHQ7CisKKwkvLyBOQjogTWFrZSBjb25zdGV4cHIgaW1wbGljaXQuIFRoaXMgY2Fubm90IGJlIGV4cGxpY2l0bHkKKwkvLyBjb25zdGV4cHIsIGFzIGFueSBVRFQgdGhhdCBpcyBub3QgYSBsaXRlcmFsIHR5cGUgd2l0aCBhCisJLy8gY29uc3RleHByIGNvcHkgY29uc3RydWN0b3Igd2lsbCBiZSBpbGwtZm9ybWVkLgorCWR1cmF0aW9uKGNvbnN0IGR1cmF0aW9uJikgPSBkZWZhdWx0OworCisJdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPF9SZXAyLCByZXA+Ojp2YWx1ZQorCQkJICYmICh0cmVhdF9hc19mbG9hdGluZ19wb2ludDxyZXA+Ojp2YWx1ZQorCQkJICAgICB8fCAhdHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQ8X1JlcDI+Ojp2YWx1ZSk+Ojp0eXBlPgorCSAgY29uc3RleHByIGV4cGxpY2l0IGR1cmF0aW9uKGNvbnN0IF9SZXAyJiBfX3JlcCkKKwkgIDogX19yKHN0YXRpY19jYXN0PHJlcD4oX19yZXApKSB7IH0KKworCXRlbXBsYXRlPHR5cGVuYW1lIF9SZXAyLCB0eXBlbmFtZSBfUGVyaW9kMiwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBlbmFibGVfaWY8dHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQ8cmVwPjo6dmFsdWUKKwkJCSB8fCAocmF0aW9fZGl2aWRlPF9QZXJpb2QyLCBwZXJpb2Q+OjpkZW4gPT0gMQorCQkJICAgICAmJiAhdHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQ8X1JlcDI+Ojp2YWx1ZSk+Ojp0eXBlPgorCSAgY29uc3RleHByIGR1cmF0aW9uKGNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4mIF9fZCkKKwkgIDogX19yKGR1cmF0aW9uX2Nhc3Q8ZHVyYXRpb24+KF9fZCkuY291bnQoKSkgeyB9CisKKwl+ZHVyYXRpb24oKSA9IGRlZmF1bHQ7CisJZHVyYXRpb24mIG9wZXJhdG9yPShjb25zdCBkdXJhdGlvbiYpID0gZGVmYXVsdDsKKworCS8vIDIwLjExLjUuMiBvYnNlcnZlcgorCWNvbnN0ZXhwciByZXAKKwljb3VudCgpIGNvbnN0CisJeyByZXR1cm4gX19yOyB9CisKKwkvLyAyMC4xMS41LjMgYXJpdGhtZXRpYworCWNvbnN0ZXhwciBkdXJhdGlvbgorCW9wZXJhdG9yKygpIGNvbnN0CisJeyByZXR1cm4gKnRoaXM7IH0KKworCWNvbnN0ZXhwciBkdXJhdGlvbgorCW9wZXJhdG9yLSgpIGNvbnN0CisJeyByZXR1cm4gZHVyYXRpb24oLV9fcik7IH0KKworCWR1cmF0aW9uJgorCW9wZXJhdG9yKysoKQorCXsKKwkgICsrX19yOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCWR1cmF0aW9uCisJb3BlcmF0b3IrKyhpbnQpCisJeyByZXR1cm4gZHVyYXRpb24oX19yKyspOyB9CisKKwlkdXJhdGlvbiYKKwlvcGVyYXRvci0tKCkKKwl7CisJICAtLV9fcjsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwlkdXJhdGlvbgorCW9wZXJhdG9yLS0oaW50KQorCXsgcmV0dXJuIGR1cmF0aW9uKF9fci0tKTsgfQorCisJZHVyYXRpb24mCisJb3BlcmF0b3IrPShjb25zdCBkdXJhdGlvbiYgX19kKQorCXsKKwkgIF9fciArPSBfX2QuY291bnQoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwlkdXJhdGlvbiYKKwlvcGVyYXRvci09KGNvbnN0IGR1cmF0aW9uJiBfX2QpCisJeworCSAgX19yIC09IF9fZC5jb3VudCgpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCWR1cmF0aW9uJgorCW9wZXJhdG9yKj0oY29uc3QgcmVwJiBfX3JocykKKwl7CisJICBfX3IgKj0gX19yaHM7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJZHVyYXRpb24mCisJb3BlcmF0b3IvPShjb25zdCByZXAmIF9fcmhzKQorCXsKKwkgIF9fciAvPSBfX3JoczsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwkvLyBEUiA5MzQuCisJdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDIgPSByZXA+CisJICB0eXBlbmFtZSBlbmFibGVfaWY8IXRyZWF0X2FzX2Zsb2F0aW5nX3BvaW50PF9SZXAyPjo6dmFsdWUsCisJCQkgICAgIGR1cmF0aW9uJj46OnR5cGUKKwkgIG9wZXJhdG9yJT0oY29uc3QgcmVwJiBfX3JocykKKwkgIHsKKwkgICAgX19yICU9IF9fcmhzOworCSAgICByZXR1cm4gKnRoaXM7CisJICB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMiA9IHJlcD4KKwkgIHR5cGVuYW1lIGVuYWJsZV9pZjwhdHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQ8X1JlcDI+Ojp2YWx1ZSwKKwkJCSAgICAgZHVyYXRpb24mPjo6dHlwZQorCSAgb3BlcmF0b3IlPShjb25zdCBkdXJhdGlvbiYgX19kKQorCSAgeworCSAgICBfX3IgJT0gX19kLmNvdW50KCk7CisJICAgIHJldHVybiAqdGhpczsKKwkgIH0KKworCS8vIDIwLjExLjUuNCBzcGVjaWFsIHZhbHVlcworCXN0YXRpYyBjb25zdGV4cHIgZHVyYXRpb24KKwl6ZXJvKCkKKwl7IHJldHVybiBkdXJhdGlvbihkdXJhdGlvbl92YWx1ZXM8cmVwPjo6emVybygpKTsgfQorCisJc3RhdGljIGNvbnN0ZXhwciBkdXJhdGlvbgorCW1pbigpCisJeyByZXR1cm4gZHVyYXRpb24oZHVyYXRpb25fdmFsdWVzPHJlcD46Om1pbigpKTsgfQorCisJc3RhdGljIGNvbnN0ZXhwciBkdXJhdGlvbgorCW1heCgpCisJeyByZXR1cm4gZHVyYXRpb24oZHVyYXRpb25fdmFsdWVzPHJlcD46Om1heCgpKTsgfQorCisgICAgICBwcml2YXRlOgorCXJlcCBfX3I7CisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgY29uc3RleHByIHR5cGVuYW1lIGNvbW1vbl90eXBlPGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4sCisJCQkJICAgICBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+Pjo6dHlwZQorICAgICAgb3BlcmF0b3IrKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLAorCQljb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKKyAgICAgIHsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4JCQlfX2R1cjE7CisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+CQkJX19kdXIyOworCXR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X19kdXIxLF9fZHVyMj46OnR5cGUJX19jZDsKKwlyZXR1cm4gX19jZChfX2NkKF9fbGhzKS5jb3VudCgpICsgX19jZChfX3JocykuY291bnQoKSk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZDEsCisJICAgICB0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgICBjb25zdGV4cHIgdHlwZW5hbWUgY29tbW9uX3R5cGU8ZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiwKKwkJCQkgICAgIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4+Ojp0eXBlCisgICAgICBvcGVyYXRvci0oY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsCisJCWNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4mIF9fcmhzKQorICAgICAgeworCXR5cGVkZWYgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPgkJCV9fZHVyMTsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4JCQlfX2R1cjI7CisJdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfX2R1cjEsX19kdXIyPjo6dHlwZQlfX2NkOworCXJldHVybiBfX2NkKF9fY2QoX19saHMpLmNvdW50KCkgLSBfX2NkKF9fcmhzKS5jb3VudCgpKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUmVwMiwgYm9vbCA9CisJICAgICBpc19jb252ZXJ0aWJsZTxfUmVwMiwKKwkJCSAgICB0eXBlbmFtZSBjb21tb25fdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlPjo6dmFsdWU+CisgICAgICBzdHJ1Y3QgX19jb21tb25fcmVwX3R5cGUgeyB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9SZXAyPgorICAgICAgc3RydWN0IF9fY29tbW9uX3JlcF90eXBlPF9SZXAxLCBfUmVwMiwgdHJ1ZT4KKyAgICAgIHsgdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlIHR5cGU7IH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZCwgdHlwZW5hbWUgX1JlcDI+CisgICAgICBjb25zdGV4cHIKKyAgICAgIGR1cmF0aW9uPHR5cGVuYW1lIF9fY29tbW9uX3JlcF90eXBlPF9SZXAxLCBfUmVwMj46OnR5cGUsIF9QZXJpb2Q+CisgICAgICBvcGVyYXRvciooY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2Q+JiBfX2QsIGNvbnN0IF9SZXAyJiBfX3MpCisgICAgICB7CisJdHlwZWRlZiBkdXJhdGlvbjx0eXBlbmFtZSBjb21tb25fdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlLCBfUGVyaW9kPgorCSAgX19jZDsKKwlyZXR1cm4gX19jZChfX2NkKF9fZCkuY291bnQoKSAqIF9fcyk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICBjb25zdGV4cHIKKyAgICAgIGR1cmF0aW9uPHR5cGVuYW1lIF9fY29tbW9uX3JlcF90eXBlPF9SZXAyLCBfUmVwMT46OnR5cGUsIF9QZXJpb2Q+CisgICAgICBvcGVyYXRvciooY29uc3QgX1JlcDEmIF9fcywgY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2Q+JiBfX2QpCisgICAgICB7IHJldHVybiBfX2QgKiBfX3M7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUGVyaW9kLCB0eXBlbmFtZSBfUmVwMj4KKyAgICAgIGNvbnN0ZXhwciBkdXJhdGlvbjx0eXBlbmFtZSBfX2NvbW1vbl9yZXBfdHlwZTxfUmVwMSwgdHlwZW5hbWUKKwllbmFibGVfaWY8IV9faXNfZHVyYXRpb248X1JlcDI+Ojp2YWx1ZSwgX1JlcDI+Ojp0eXBlPjo6dHlwZSwgX1BlcmlvZD4KKyAgICAgIG9wZXJhdG9yLyhjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZD4mIF9fZCwgY29uc3QgX1JlcDImIF9fcykKKyAgICAgIHsKKwl0eXBlZGVmIGR1cmF0aW9uPHR5cGVuYW1lIGNvbW1vbl90eXBlPF9SZXAxLCBfUmVwMj46OnR5cGUsIF9QZXJpb2Q+CisJICBfX2NkOworCXJldHVybiBfX2NkKF9fY2QoX19kKS5jb3VudCgpIC8gX19zKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUGVyaW9kMSwKKwkgICAgIHR5cGVuYW1lIF9SZXAyLCB0eXBlbmFtZSBfUGVyaW9kMj4KKyAgICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBjb21tb25fdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlCisgICAgICBvcGVyYXRvci8oY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsCisJCWNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4mIF9fcmhzKQorICAgICAgeworCXR5cGVkZWYgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPgkJCV9fZHVyMTsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4JCQlfX2R1cjI7CisJdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfX2R1cjEsX19kdXIyPjo6dHlwZQlfX2NkOworCXJldHVybiBfX2NkKF9fbGhzKS5jb3VudCgpIC8gX19jZChfX3JocykuY291bnQoKTsKKyAgICAgIH0KKworICAgIC8vIERSIDkzNC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZCwgdHlwZW5hbWUgX1JlcDI+CisgICAgICBjb25zdGV4cHIgZHVyYXRpb248dHlwZW5hbWUgX19jb21tb25fcmVwX3R5cGU8X1JlcDEsIHR5cGVuYW1lCisJZW5hYmxlX2lmPCFfX2lzX2R1cmF0aW9uPF9SZXAyPjo6dmFsdWUsIF9SZXAyPjo6dHlwZT46OnR5cGUsIF9QZXJpb2Q+CisgICAgICBvcGVyYXRvciUoY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2Q+JiBfX2QsIGNvbnN0IF9SZXAyJiBfX3MpCisgICAgICB7CisJdHlwZWRlZiBkdXJhdGlvbjx0eXBlbmFtZSBjb21tb25fdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlLCBfUGVyaW9kPgorCSAgX19jZDsKKwlyZXR1cm4gX19jZChfX2NkKF9fZCkuY291bnQoKSAlIF9fcyk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZDEsCisJICAgICB0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgICBjb25zdGV4cHIgdHlwZW5hbWUgY29tbW9uX3R5cGU8ZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiwKKwkJCQkgICAgIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4+Ojp0eXBlCisgICAgICBvcGVyYXRvciUoY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsCisJCWNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4mIF9fcmhzKQorICAgICAgeworCXR5cGVkZWYgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPgkJCV9fZHVyMTsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4JCQlfX2R1cjI7CisJdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfX2R1cjEsX19kdXIyPjo6dHlwZQlfX2NkOworCXJldHVybiBfX2NkKF9fY2QoX19saHMpLmNvdW50KCkgJSBfX2NkKF9fcmhzKS5jb3VudCgpKTsKKyAgICAgIH0KKworICAgIC8vIGNvbXBhcmlzb25zCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsCisJCSBjb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKKyAgICAgIHsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4JCQlfX2R1cjE7CisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+CQkJX19kdXIyOworCXR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X19kdXIxLF9fZHVyMj46OnR5cGUJX19jdDsKKwlyZXR1cm4gX19jdChfX2xocykuY291bnQoKSA9PSBfX2N0KF9fcmhzKS5jb3VudCgpOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yPChjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywKKwkJY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCisgICAgICB7CisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+CQkJX19kdXIxOworCXR5cGVkZWYgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPgkJCV9fZHVyMjsKKwl0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9fZHVyMSxfX2R1cjI+Ojp0eXBlCV9fY3Q7CisJcmV0dXJuIF9fY3QoX19saHMpLmNvdW50KCkgPCBfX2N0KF9fcmhzKS5jb3VudCgpOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsCisJCSBjb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZDEsCisJICAgICB0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgICBjb25zdGV4cHIgYm9vbAorICAgICAgb3BlcmF0b3I8PShjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywKKwkJIGNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4mIF9fcmhzKQorICAgICAgeyByZXR1cm4gIShfX3JocyA8IF9fbGhzKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yPihjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywKKwkJY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCisgICAgICB7IHJldHVybiBfX3JocyA8IF9fbGhzOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZDEsCisJICAgICB0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgICBjb25zdGV4cHIgYm9vbAorICAgICAgb3BlcmF0b3I+PShjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywKKwkJIGNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4mIF9fcmhzKQorICAgICAgeyByZXR1cm4gIShfX2xocyA8IF9fcmhzKTsgfQorCisgICAgLy8vIG5hbm9zZWNvbmRzCisgICAgdHlwZWRlZiBkdXJhdGlvbjxpbnQ2NF90LCBuYW5vPiAJbmFub3NlY29uZHM7CisKKyAgICAvLy8gbWljcm9zZWNvbmRzCisgICAgdHlwZWRlZiBkdXJhdGlvbjxpbnQ2NF90LCBtaWNybz4gCW1pY3Jvc2Vjb25kczsKKworICAgIC8vLyBtaWxsaXNlY29uZHMKKyAgICB0eXBlZGVmIGR1cmF0aW9uPGludDY0X3QsIG1pbGxpPiAJbWlsbGlzZWNvbmRzOworCisgICAgLy8vIHNlY29uZHMKKyAgICB0eXBlZGVmIGR1cmF0aW9uPGludDY0X3Q+IAkJc2Vjb25kczsKKworICAgIC8vLyBtaW51dGVzCisgICAgdHlwZWRlZiBkdXJhdGlvbjxpbnQsIHJhdGlvPCA2MD4+IAltaW51dGVzOworCisgICAgLy8vIGhvdXJzCisgICAgdHlwZWRlZiBkdXJhdGlvbjxpbnQsIHJhdGlvPDM2MDA+PiAJaG91cnM7CisKKyAgICAvLy8gdGltZV9wb2ludAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cj4KKyAgICAgIHN0cnVjdCB0aW1lX3BvaW50CisgICAgICB7CisJdHlwZWRlZiBfQ2xvY2sJCQkgIAkJCWNsb2NrOworCXR5cGVkZWYgX0R1cgkJICAJCQkJZHVyYXRpb247CisJdHlwZWRlZiB0eXBlbmFtZSBkdXJhdGlvbjo6cmVwCSAgCQkJcmVwOworCXR5cGVkZWYgdHlwZW5hbWUgZHVyYXRpb246OnBlcmlvZAkJCXBlcmlvZDsKKworCWNvbnN0ZXhwciB0aW1lX3BvaW50KCkgOiBfX2QoZHVyYXRpb246Onplcm8oKSkKKwl7IH0KKworCWNvbnN0ZXhwciBleHBsaWNpdCB0aW1lX3BvaW50KGNvbnN0IGR1cmF0aW9uJiBfX2R1cikKKwk6IF9fZChfX2R1cikKKwl7IH0KKworCS8vIGNvbnZlcnNpb25zCisJdGVtcGxhdGU8dHlwZW5hbWUgX0R1cjI+CisJICBjb25zdGV4cHIgdGltZV9wb2ludChjb25zdCB0aW1lX3BvaW50PGNsb2NrLCBfRHVyMj4mIF9fdCkKKwkgIDogX19kKF9fdC50aW1lX3NpbmNlX2Vwb2NoKCkpCisJICB7IH0KKworCS8vIG9ic2VydmVyCisJY29uc3RleHByIGR1cmF0aW9uCisJdGltZV9zaW5jZV9lcG9jaCgpIGNvbnN0CisJeyByZXR1cm4gX19kOyB9CisKKwkvLyBhcml0aG1ldGljCisJdGltZV9wb2ludCYKKwlvcGVyYXRvcis9KGNvbnN0IGR1cmF0aW9uJiBfX2R1cikKKwl7CisJICBfX2QgKz0gX19kdXI7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJdGltZV9wb2ludCYKKwlvcGVyYXRvci09KGNvbnN0IGR1cmF0aW9uJiBfX2R1cikKKwl7CisJICBfX2QgLT0gX19kdXI7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJLy8gc3BlY2lhbCB2YWx1ZXMKKwlzdGF0aWMgY29uc3RleHByIHRpbWVfcG9pbnQKKwltaW4oKQorCXsgcmV0dXJuIHRpbWVfcG9pbnQoZHVyYXRpb246Om1pbigpKTsgfQorCisJc3RhdGljIGNvbnN0ZXhwciB0aW1lX3BvaW50CisJbWF4KCkKKwl7IHJldHVybiB0aW1lX3BvaW50KGR1cmF0aW9uOjptYXgoKSk7IH0KKworICAgICAgcHJpdmF0ZToKKwlkdXJhdGlvbiBfX2Q7CisgICAgICB9OworCisgICAgLy8vIHRpbWVfcG9pbnRfY2FzdAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub0R1ciwgdHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyPgorICAgICAgY29uc3RleHByIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2R1cmF0aW9uPF9Ub0R1cj46OnZhbHVlLAorCQkJCSAgIHRpbWVfcG9pbnQ8X0Nsb2NrLCBfVG9EdXI+Pjo6dHlwZQorICAgICAgdGltZV9wb2ludF9jYXN0KGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyPiYgX190KQorICAgICAgeworCXR5cGVkZWYgdGltZV9wb2ludDxfQ2xvY2ssIF9Ub0R1cj4gCQkJX190aW1lX3BvaW50OworCXJldHVybiBfX3RpbWVfcG9pbnQoZHVyYXRpb25fY2FzdDxfVG9EdXI+KF9fdC50aW1lX3NpbmNlX2Vwb2NoKCkpKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cjEsCisJICAgICB0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgICBjb25zdGV4cHIgdGltZV9wb2ludDxfQ2xvY2ssCisJdHlwZW5hbWUgY29tbW9uX3R5cGU8X0R1cjEsIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4+Ojp0eXBlPgorICAgICAgb3BlcmF0b3IrKGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMT4mIF9fbGhzLAorCQljb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKKyAgICAgIHsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4JCQlfX2R1cjI7CisJdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfRHVyMSxfX2R1cjI+Ojp0eXBlCV9fY3Q7CisJdHlwZWRlZiB0aW1lX3BvaW50PF9DbG9jaywgX19jdD4gCQkJX190aW1lX3BvaW50OworCXJldHVybiBfX3RpbWVfcG9pbnQoX19saHMudGltZV9zaW5jZV9lcG9jaCgpICsgX19yaHMpOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLAorCSAgICAgdHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyMj4KKyAgICAgIGNvbnN0ZXhwciB0aW1lX3BvaW50PF9DbG9jaywKKwl0eXBlbmFtZSBjb21tb25fdHlwZTxkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+LCBfRHVyMj46OnR5cGU+CisgICAgICBvcGVyYXRvcisoY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsCisJCWNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMj4mIF9fcmhzKQorICAgICAgeyAKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4JCQlfX2R1cjE7CisJdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfX2R1cjEsX0R1cjI+Ojp0eXBlCV9fY3Q7CisJdHlwZWRlZiB0aW1lX3BvaW50PF9DbG9jaywgX19jdD4gCQkJX190aW1lX3BvaW50OworCXJldHVybiBfX3RpbWVfcG9pbnQoX19yaHMudGltZV9zaW5jZV9lcG9jaCgpICsgX19saHMpOyAKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cjEsCisJICAgICB0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgICBjb25zdGV4cHIgdGltZV9wb2ludDxfQ2xvY2ssCisJdHlwZW5hbWUgY29tbW9uX3R5cGU8X0R1cjEsIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4+Ojp0eXBlPgorICAgICAgb3BlcmF0b3ItKGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMT4mIF9fbGhzLAorCQljb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKKyAgICAgIHsgCisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+CQkJX19kdXIyOworCXR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X0R1cjEsX19kdXIyPjo6dHlwZQlfX2N0OworCXR5cGVkZWYgdGltZV9wb2ludDxfQ2xvY2ssIF9fY3Q+IAkJCV9fdGltZV9wb2ludDsKKwlyZXR1cm4gX190aW1lX3BvaW50KF9fbGhzLnRpbWVfc2luY2VfZXBvY2goKSAtX19yaHMpOyAKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cjEsIHR5cGVuYW1lIF9EdXIyPgorICAgICAgY29uc3RleHByIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9EdXIxLCBfRHVyMj46OnR5cGUKKyAgICAgIG9wZXJhdG9yLShjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjE+JiBfX2xocywKKwkJY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIyPiYgX19yaHMpCisgICAgICB7IHJldHVybiBfX2xocy50aW1lX3NpbmNlX2Vwb2NoKCkgLSBfX3Jocy50aW1lX3NpbmNlX2Vwb2NoKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cjEsIHR5cGVuYW1lIF9EdXIyPgorICAgICAgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIxPiYgX19saHMsCisJCSBjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjI+JiBfX3JocykKKyAgICAgIHsgcmV0dXJuIF9fbGhzLnRpbWVfc2luY2VfZXBvY2goKSA9PSBfX3Jocy50aW1lX3NpbmNlX2Vwb2NoKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cjEsIHR5cGVuYW1lIF9EdXIyPgorICAgICAgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIxPiYgX19saHMsCisJCSBjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjI+JiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIxLCB0eXBlbmFtZSBfRHVyMj4KKyAgICAgIGNvbnN0ZXhwciBib29sCisgICAgICBvcGVyYXRvcjwoY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIxPiYgX19saHMsCisJCWNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMj4mIF9fcmhzKQorICAgICAgeyByZXR1cm4gIF9fbGhzLnRpbWVfc2luY2VfZXBvY2goKSA8IF9fcmhzLnRpbWVfc2luY2VfZXBvY2goKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyMSwgdHlwZW5hbWUgX0R1cjI+CisgICAgICBjb25zdGV4cHIgYm9vbAorICAgICAgb3BlcmF0b3I8PShjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjE+JiBfX2xocywKKwkJIGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMj4mIF9fcmhzKQorICAgICAgeyByZXR1cm4gIShfX3JocyA8IF9fbGhzKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyMSwgdHlwZW5hbWUgX0R1cjI+CisgICAgICBjb25zdGV4cHIgYm9vbAorICAgICAgb3BlcmF0b3I+KGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMT4mIF9fbGhzLAorCQljb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjI+JiBfX3JocykKKyAgICAgIHsgcmV0dXJuIF9fcmhzIDwgX19saHM7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cjEsIHR5cGVuYW1lIF9EdXIyPgorICAgICAgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yPj0oY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIxPiYgX19saHMsCisJCSBjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjI+JiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7IH0KKworCisgICAgLy8gQ2xvY2tzLiAKKworICAgIC8vIFdoeSBuYW5vc2Vjb25kIHJlc29sdXRpb24gYXMgdGhlIGRlZmF1bHQ/ICAKKyAgICAvLyBXaHkgaGF2ZSBzdGQ6OnN5c3RlbV9jbG9jayBhbHdheXMgY291bnQgaW4gdGhlIGhpZ2VzdAorICAgIC8vIHJlc29sdXRpb24gKGllIG5hbm9zZWNvbmRzKSwgZXZlbiBpZiBvbiBzb21lIE9TZXMgdGhlIGxvdyAzCisgICAgLy8gb3IgOSBkZWNpbWFsIGRpZ2l0cyB3aWxsIGJlIGFsd2F5cyB6ZXJvPyBUaGlzIGFsbG93cyBsYXRlcgorICAgIC8vIGltcGxlbWVudGF0aW9ucyB0byBjaGFuZ2UgdGhlIHN5c3RlbV9jbG9jazo6bm93KCkKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBhbnkgdGltZSB0byBwcm92aWRlIGJldHRlciByZXNvbHV0aW9uIHdpdGhvdXQKKyAgICAvLyBjaGFuZ2luZyBmdW5jdGlvbiBzaWduYXR1cmUgb3IgdW5pdHMuCisKKyAgICAvLyBUbyBzdXBwb3J0IHRoZSAoZm9yd2FyZCkgZXZvbHV0aW9uIG9mIHRoZSBsaWJyYXJ5J3MgZGVmaW5lZAorICAgIC8vIGNsb2Nrcywgd3JhcCBpbnNpZGUgaW5saW5lIG5hbWVzcGFjZSBzbyB0aGF0IHRoZSBjdXJyZW50CisgICAgLy8gZGVmaW50aW9ucyBvZiBzeXN0ZW1fY2xvY2ssIHN0ZWFkeV9jbG9jaywgYW5kCisgICAgLy8gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrIHR5cGVzIGFyZSB1bmlxdWVseSBtYW5nbGVkLiBUaGlzIHdheSwgbmV3CisgICAgLy8gY29kZSBjYW4gdXNlIHRoZSBsYXRlc3RzIGNsb2Nrcywgd2hpbGUgdGhlIGxpYnJhcnkgY2FuIGNvbnRhaW4KKyAgICAvLyBjb21wYXRpYmlsaXR5IGRlZmluaXRpb25zIGZvciBwcmV2aW91cyB2ZXJzaW9ucy4gIEF0IHNvbWUKKyAgICAvLyBwb2ludCwgd2hlbiB0aGVzZSBjbG9ja3Mgc2V0dGxlIGRvd24sIHRoZSBpbmxpbmVkIG5hbWVzcGFjZXMKKyAgICAvLyBjYW4gYmUgcmVtb3ZlZC4gIFhYWCBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisgICAgaW5saW5lIG5hbWVzcGFjZSBfVjIgeworCisgICAgLyoqCisgICAgICogIEBicmllZiBTeXN0ZW0gY2xvY2suCisgICAgICoKKyAgICAgKiAgVGltZSByZXR1cm5lZCByZXByZXNlbnRzIHdhbGwgdGltZSBmcm9tIHRoZSBzeXN0ZW0td2lkZSBjbG9jay4KKyAgICAqLworICAgICBzdHJ1Y3Qgc3lzdGVtX2Nsb2NrCisgICAgeworICAgICAgdHlwZWRlZiBjaHJvbm86Om5hbm9zZWNvbmRzICAgICAJCQkJZHVyYXRpb247CisgICAgICB0eXBlZGVmIGR1cmF0aW9uOjpyZXAgICAgCQkJCQlyZXA7CisgICAgICB0eXBlZGVmIGR1cmF0aW9uOjpwZXJpb2QgCQkJCQlwZXJpb2Q7CisgICAgICB0eXBlZGVmIGNocm9ubzo6dGltZV9wb2ludDxzeXN0ZW1fY2xvY2ssIGR1cmF0aW9uPiAJdGltZV9wb2ludDsKKworICAgICAgc3RhdGljX2Fzc2VydChzeXN0ZW1fY2xvY2s6OmR1cmF0aW9uOjptaW4oKQorCQkgICAgPCBzeXN0ZW1fY2xvY2s6OmR1cmF0aW9uOjp6ZXJvKCksCisJCSAgICAiYSBjbG9jaydzIG1pbmltdW0gZHVyYXRpb24gY2Fubm90IGJlIGxlc3MgdGhhbiBpdHMgZXBvY2giKTsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX3N0ZWFkeSA9IGZhbHNlOworCisgICAgICBzdGF0aWMgdGltZV9wb2ludAorICAgICAgbm93KCkgbm9leGNlcHQ7CisKKyAgICAgIC8vIE1hcCB0byBDIEFQSQorICAgICAgc3RhdGljIHN0ZDo6dGltZV90CisgICAgICB0b190aW1lX3QoY29uc3QgdGltZV9wb2ludCYgX190KSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBzdGQ6OnRpbWVfdChkdXJhdGlvbl9jYXN0PGNocm9ubzo6c2Vjb25kcz4KKwkJCSAgIChfX3QudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIHRpbWVfcG9pbnQKKyAgICAgIGZyb21fdGltZV90KHN0ZDo6dGltZV90IF9fdCkgbm9leGNlcHQKKyAgICAgIHsKKwl0eXBlZGVmIGNocm9ubzo6dGltZV9wb2ludDxzeXN0ZW1fY2xvY2ssIHNlY29uZHM+CV9fZnJvbTsKKwlyZXR1cm4gdGltZV9wb2ludF9jYXN0PHN5c3RlbV9jbG9jazo6ZHVyYXRpb24+CisJICAgICAgIChfX2Zyb20oY2hyb25vOjpzZWNvbmRzKF9fdCkpKTsKKyAgICAgIH0KKyAgICB9OworCisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmIE1vbm90b25pYyBjbG9jaworICAgICAqCisgICAgICogIFRpbWUgcmV0dXJuZWQgaGFzIHRoZSBwcm9wZXJ0eSBvZiBvbmx5IGluY3JlYXNpbmcgYXQgYSB1bmlmb3JtIHJhdGUuCisgICAgKi8KKyAgICBzdHJ1Y3Qgc3RlYWR5X2Nsb2NrCisgICAgeworICAgICAgdHlwZWRlZiBjaHJvbm86Om5hbm9zZWNvbmRzIAkJCQlkdXJhdGlvbjsKKyAgICAgIHR5cGVkZWYgZHVyYXRpb246OnJlcAkgIAkJCQlyZXA7CisgICAgICB0eXBlZGVmIGR1cmF0aW9uOjpwZXJpb2QJICAJCQkJcGVyaW9kOworICAgICAgdHlwZWRlZiBjaHJvbm86OnRpbWVfcG9pbnQ8c3RlYWR5X2Nsb2NrLCBkdXJhdGlvbj4gCXRpbWVfcG9pbnQ7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19zdGVhZHkgPSB0cnVlOworCisgICAgICBzdGF0aWMgdGltZV9wb2ludAorICAgICAgbm93KCkgbm9leGNlcHQ7CisgICAgfTsKKworCisgICAgLyoqCisgICAgICogIEBicmllZiBIaWdoZXN0LXJlc29sdXRpb24gY2xvY2sKKyAgICAgKgorICAgICAqICBUaGlzIGlzIHRoZSBjbG9jayAid2l0aCB0aGUgc2hvcnRlc3QgdGljayBwZXJpb2QuIiBBbGlhcyB0bworICAgICAqICBzdGQ6OnN5c3RlbV9jbG9jayB1bnRpbCBoaWdoZXItdGhhbi1uYW5vc2Vjb25kIGRlZmluaXRpb25zCisgICAgICogIGJlY29tZSBmZWFzaWJsZS4KKyAgICAqLworICAgIHVzaW5nIGhpZ2hfcmVzb2x1dGlvbl9jbG9jayA9IHN5c3RlbV9jbG9jazsKKworICB9IC8vIGVuZCBpbmxpbmUgbmFtZXNwYWNlIF9WMgorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBjaHJvbm8KKworICAvLyBAfSBncm91cCBjaHJvbm8KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvL19HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vX0dMSUJDWFhfQ0hST05PCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NpbnR0eXBlcyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2ludHR5cGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Yzc0MGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NpbnR0eXBlcwpAQCAtMCwwICsxLDgxIEBACisvLyA8Y2ludHR5cGVzPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jaW50dHlwZXMKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQ0lOVFRZUEVTCisjZGVmaW5lIF9HTElCQ1hYX0NJTlRUWVBFUyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorCisvLyBGb3IgMjcuOS4yLzMgKHNlZSBDOTksIE5vdGUgMTg0KQorI2lmIF9HTElCQ1hYX0hBVkVfSU5UVFlQRVNfSAorIyBpZm5kZWYgX19TVERDX0ZPUk1BVF9NQUNST1MKKyMgIGRlZmluZSBfVU5ERUZfX1NURENfRk9STUFUX01BQ1JPUworIyAgZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjIGVuZGlmCisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjIGlmZGVmIF9VTkRFRl9fU1REQ19GT1JNQVRfTUFDUk9TCisjICB1bmRlZiBfX1NURENfRk9STUFUX01BQ1JPUworIyAgdW5kZWYgX1VOREVGX19TVERDX0ZPUk1BVF9NQUNST1MKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9JTlRUWVBFU19UUjEKKworbmFtZXNwYWNlIHN0ZAoreworICAvLyB0eXBlcworICB1c2luZyA6OmltYXhkaXZfdDsKKworICAvLyBmdW5jdGlvbnMKKyAgdXNpbmcgOjppbWF4YWJzOworICB1c2luZyA6OmltYXhkaXY7CisKKyAgLy8gR0NDIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5kZWQgaW50ZWdlciB0eXBlcworICAvLyBpbnRtYXhfdCBhYnMoaW50bWF4X3QpCisgIC8vIGltYXhkaXZfdCBkaXYoaW50bWF4X3QsIGludG1heF90KQorCisgIHVzaW5nIDo6c3RydG9pbWF4OworICB1c2luZyA6OnN0cnRvdW1heDsKKworI2lmIGRlZmluZWQoX0dMSUJDWFhfVVNFX1dDSEFSX1QpICYmIF9HTElCQ1hYX1VTRV9DOTlfSU5UVFlQRVNfV0NIQVJfVF9UUjEKKyAgdXNpbmcgOjp3Y3N0b2ltYXg7CisgIHVzaW5nIDo6d2NzdG91bWF4OworI2VuZGlmCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9DOTlfSU5UVFlQRVNfVFIxCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfQ0lOVFRZUEVTCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Npc282NDYgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Npc282NDYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiYjNmNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2lzbzY0NgpAQCAtMCwwICsxLDMzIEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGNpc282NDYKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyBpc282NDYuaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2xpbWl0cyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2xpbWl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E1OTE5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jbGltaXRzCkBAIC0wLDAgKzEsNTggQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jbGltaXRzCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgbGltaXRzLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAxOC4yLjIgIEltcGxlbWVudGF0aW9uIHByb3BlcnRpZXM6IEMgbGlicmFyeQorLy8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ0xJTUlUUworI2RlZmluZSBfR0xJQkNYWF9DTElNSVRTIDEKKworI2lmbmRlZiBMTE9OR19NSU4KKyNkZWZpbmUgTExPTkdfTUlOICgtX19MT05HX0xPTkdfTUFYX18gLSAxKQorI2VuZGlmCisKKyNpZm5kZWYgTExPTkdfTUFYCisjZGVmaW5lIExMT05HX01BWCBfX0xPTkdfTE9OR19NQVhfXworI2VuZGlmCisKKyNpZm5kZWYgVUxMT05HX01BWAorI2RlZmluZSBVTExPTkdfTUFYIChfX0xPTkdfTE9OR19NQVhfXyAqIDJVTEwgKyAxKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jbG9jYWxlIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jbG9jYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMzI5ODAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Nsb2NhbGUKQEAgLTAsMCArMSw1OCBAQAorLy8gLSotIEMrKyAtKi0gZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBjbG9jYWxlCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgbG9jYWxlLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAxOC4yLjIgIEltcGxlbWVudGF0aW9uIHByb3BlcnRpZXM6IEMgbGlicmFyeQorLy8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworI2lmbmRlZiBfR0xJQkNYWF9DTE9DQUxFCisjZGVmaW5lIF9HTElCQ1hYX0NMT0NBTEUgMQorCisvLyBHZXQgcmlkIG9mIHRob3NlIG1hY3JvcyBkZWZpbmVkIGluIDxsb2NhbGUuaD4gaW4gbGlldSBvZiByZWFsIGZ1bmN0aW9ucy4KKyN1bmRlZiBzZXRsb2NhbGUKKyN1bmRlZiBsb2NhbGVjb252CisKK25hbWVzcGFjZSBzdGQKK3sKKyAgdXNpbmcgOjpsY29udjsKKyAgdXNpbmcgOjpzZXRsb2NhbGU7CisgIHVzaW5nIDo6bG9jYWxlY29udjsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY21hdGggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NtYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Mzg1ODUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NtYXRoCkBAIC0wLDAgKzEsMTY4NSBAQAorLy8gLSotIEMrKyAtKi0gQyBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY21hdGgKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyBtYXRoLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNi41ICBDIGxpYnJhcnkKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9jcHBfdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ01BVEgKKyNkZWZpbmUgX0dMSUJDWFhfQ01BVEggMQorCisvLyBHZXQgcmlkIG9mIHRob3NlIG1hY3JvcyBkZWZpbmVkIGluIDxtYXRoLmg+IGluIGxpZXUgb2YgcmVhbCBmdW5jdGlvbnMuCisjdW5kZWYgYWJzCisjdW5kZWYgZGl2CisjdW5kZWYgYWNvcworI3VuZGVmIGFzaW4KKyN1bmRlZiBhdGFuCisjdW5kZWYgYXRhbjIKKyN1bmRlZiBjZWlsCisjdW5kZWYgY29zCisjdW5kZWYgY29zaAorI3VuZGVmIGV4cAorI3VuZGVmIGZhYnMKKyN1bmRlZiBmbG9vcgorI3VuZGVmIGZtb2QKKyN1bmRlZiBmcmV4cAorI3VuZGVmIGxkZXhwCisjdW5kZWYgbG9nCisjdW5kZWYgbG9nMTAKKyN1bmRlZiBtb2RmCisjdW5kZWYgcG93CisjdW5kZWYgc2luCisjdW5kZWYgc2luaAorI3VuZGVmIHNxcnQKKyN1bmRlZiB0YW4KKyN1bmRlZiB0YW5oCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBkb3VibGUKKyAgYWJzKGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mYWJzKF9feCk7IH0KKyNlbmRpZgorCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0CisgIGFicyhmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mYWJzZihfX3gpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBhYnMobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmFic2woX194KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgYWJzKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2ZhYnMoX194KTsgfQorCisgIHVzaW5nIDo6YWNvczsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBhY29zKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2Fjb3NmKF9feCk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIGFjb3MobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYWNvc2woX194KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGFjb3MoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fYWNvcyhfX3gpOyB9CisKKyAgdXNpbmcgOjphc2luOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0CisgIGFzaW4oZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYXNpbmYoX194KTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUKKyAgYXNpbihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hc2lubChfX3gpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBhc2luKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2FzaW4oX194KTsgfQorCisgIHVzaW5nIDo6YXRhbjsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBhdGFuKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2F0YW5mKF9feCk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIGF0YW4obG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYXRhbmwoX194KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgYXRhbihfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9hdGFuKF9feCk7IH0KKworICB1c2luZyA6OmF0YW4yOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0CisgIGF0YW4yKGZsb2F0IF9feSwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYXRhbjJmKF9feSwgX194KTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUKKyAgYXRhbjIobG9uZyBkb3VibGUgX195LCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hdGFuMmwoX195LCBfX3gpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIGF0YW4yKF9UcCBfX3ksIF9VcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBhdGFuMihfX3R5cGUoX195KSwgX190eXBlKF9feCkpOworICAgIH0KKworICB1c2luZyA6OmNlaWw7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgY2VpbChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jZWlsZihfX3gpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBjZWlsKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2NlaWxsKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBjZWlsKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2NlaWwoX194KTsgfQorCisgIHVzaW5nIDo6Y29zOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0CisgIGNvcyhmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jb3NmKF9feCk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIGNvcyhsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jb3NsKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGNvcyhfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9jb3MoX194KTsgfQorCisgIHVzaW5nIDo6Y29zaDsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBjb3NoKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2Nvc2hmKF9feCk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIGNvc2gobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fY29zaGwoX194KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgY29zaChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9jb3NoKF9feCk7IH0KKworICB1c2luZyA6OmV4cDsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBleHAoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXhwZihfX3gpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBleHAobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXhwbChfX3gpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBleHAoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZXhwKF9feCk7IH0KKworICB1c2luZyA6OmZhYnM7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgZmFicyhmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mYWJzZihfX3gpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBmYWJzKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZhYnNsKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGZhYnMoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZmFicyhfX3gpOyB9CisKKyAgdXNpbmcgOjpmbG9vcjsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBmbG9vcihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbG9vcmYoX194KTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUKKyAgZmxvb3IobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmxvb3JsKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGZsb29yKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2Zsb29yKF9feCk7IH0KKworICB1c2luZyA6OmZtb2Q7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgZm1vZChmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2Ztb2RmKF9feCwgX195KTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUKKyAgZm1vZChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2Ztb2RsKF9feCwgX195KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUKKyAgICBmbW9kKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBmbW9kKF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIHVzaW5nIDo6ZnJleHA7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBmbG9hdAorICBmcmV4cChmbG9hdCBfX3gsIGludCogX19leHApCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mcmV4cGYoX194LCBfX2V4cCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZnJleHAobG9uZyBkb3VibGUgX194LCBpbnQqIF9fZXhwKQorICB7IHJldHVybiBfX2J1aWx0aW5fZnJleHBsKF9feCwgX19leHApOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgZnJleHAoX1RwIF9feCwgaW50KiBfX2V4cCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZnJleHAoX194LCBfX2V4cCk7IH0KKworICB1c2luZyA6OmxkZXhwOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0CisgIGxkZXhwKGZsb2F0IF9feCwgaW50IF9fZXhwKQorICB7IHJldHVybiBfX2J1aWx0aW5fbGRleHBmKF9feCwgX19leHApOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBsZGV4cChsb25nIGRvdWJsZSBfX3gsIGludCBfX2V4cCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xkZXhwbChfX3gsIF9fZXhwKTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxkZXhwKF9UcCBfX3gsIGludCBfX2V4cCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbGRleHAoX194LCBfX2V4cCk7IH0KKworICB1c2luZyA6OmxvZzsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBsb2coZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nZihfX3gpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBsb2cobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nbChfX3gpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgbG9nKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xvZyhfX3gpOyB9CisKKyAgdXNpbmcgOjpsb2cxMDsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBsb2cxMChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cxMGYoX194KTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUKKyAgbG9nMTAobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMTBsKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxvZzEwKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xvZzEwKF9feCk7IH0KKworICB1c2luZyA6Om1vZGY7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBmbG9hdAorICBtb2RmKGZsb2F0IF9feCwgZmxvYXQqIF9faXB0cikKKyAgeyByZXR1cm4gX19idWlsdGluX21vZGZmKF9feCwgX19pcHRyKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBtb2RmKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUqIF9faXB0cikKKyAgeyByZXR1cm4gX19idWlsdGluX21vZGZsKF9feCwgX19pcHRyKTsgfQorI2VuZGlmCisKKyAgdXNpbmcgOjpwb3c7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgcG93KGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fcG93ZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIHBvdyhsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX3Bvd2woX194LCBfX3kpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyBEUiA1NTAuIFdoYXQgc2hvdWxkIHRoZSByZXR1cm4gdHlwZSBvZiBwb3coZmxvYXQsaW50KSBiZT8KKyAgaW5saW5lIGRvdWJsZQorICBwb3coZG91YmxlIF9feCwgaW50IF9faSkKKyAgeyByZXR1cm4gX19idWlsdGluX3Bvd2koX194LCBfX2kpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIHBvdyhmbG9hdCBfX3gsIGludCBfX24pCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9wb3dpZihfX3gsIF9fbik7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgcG93KGxvbmcgZG91YmxlIF9feCwgaW50IF9fbikKKyAgeyByZXR1cm4gX19idWlsdGluX3Bvd2lsKF9feCwgX19uKTsgfQorI2VuZGlmCisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIHBvdyhfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gcG93KF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIHVzaW5nIDo6c2luOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0CisgIHNpbihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zaW5mKF9feCk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIHNpbihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zaW5sKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBzaW4oX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fc2luKF9feCk7IH0KKworICB1c2luZyA6OnNpbmg7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgc2luaChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zaW5oZihfX3gpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBzaW5oKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NpbmhsKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBzaW5oKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3NpbmgoX194KTsgfQorCisgIHVzaW5nIDo6c3FydDsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBzcXJ0KGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NxcnRmKF9feCk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIHNxcnQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fc3FydGwoX194KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHNxcnQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fc3FydChfX3gpOyB9CisKKyAgdXNpbmcgOjp0YW47CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgdGFuKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RhbmYoX194KTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUKKyAgdGFuKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RhbmwoX194KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHRhbihfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl90YW4oX194KTsgfQorCisgIHVzaW5nIDo6dGFuaDsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICB0YW5oKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RhbmhmKF9feCk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIHRhbmgobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fdGFuaGwoX194KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHRhbmgoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fdGFuaChfX3gpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSAorI2lmICFfR0xJQkNYWF9VU0VfQzk5X0ZQX01BQ1JPU19EWU5BTUlDCisKKy8vIFRoZXNlIGFyZSBwb3NzaWJsZSBtYWNyb3MgaW1wb3J0ZWQgZnJvbSBDOTktbGFuZC4KKyN1bmRlZiBmcGNsYXNzaWZ5CisjdW5kZWYgaXNmaW5pdGUKKyN1bmRlZiBpc2luZgorI3VuZGVmIGlzbmFuCisjdW5kZWYgaXNub3JtYWwKKyN1bmRlZiBzaWduYml0CisjdW5kZWYgaXNncmVhdGVyCisjdW5kZWYgaXNncmVhdGVyZXF1YWwKKyN1bmRlZiBpc2xlc3MKKyN1bmRlZiBpc2xlc3NlcXVhbAorI3VuZGVmIGlzbGVzc2dyZWF0ZXIKKyN1bmRlZiBpc3Vub3JkZXJlZAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIGNvbnN0ZXhwciBpbnQKKyAgZnBjbGFzc2lmeShmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mcGNsYXNzaWZ5KEZQX05BTiwgRlBfSU5GSU5JVEUsIEZQX05PUk1BTCwKKwkJCQlGUF9TVUJOT1JNQUwsIEZQX1pFUk8sIF9feCk7IH0KKworICBjb25zdGV4cHIgaW50CisgIGZwY2xhc3NpZnkoZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZwY2xhc3NpZnkoRlBfTkFOLCBGUF9JTkZJTklURSwgRlBfTk9STUFMLAorCQkJCUZQX1NVQk5PUk1BTCwgRlBfWkVSTywgX194KTsgfQorCisgIGNvbnN0ZXhwciBpbnQKKyAgZnBjbGFzc2lmeShsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mcGNsYXNzaWZ5KEZQX05BTiwgRlBfSU5GSU5JVEUsIEZQX05PUk1BTCwKKwkJCQlGUF9TVUJOT1JNQUwsIEZQX1pFUk8sIF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50Pjo6X190eXBlCisgICAgZnBjbGFzc2lmeShfVHAgX194KQorICAgIHsgcmV0dXJuIF9feCAhPSAwID8gRlBfTk9STUFMIDogRlBfWkVSTzsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzZmluaXRlKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzZmluaXRlKF9feCk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2Zpbml0ZShkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNmaW5pdGUoX194KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzZmluaXRlKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzZmluaXRlKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbD46Ol9fdHlwZQorICAgIGlzZmluaXRlKF9UcCBfX3gpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzaW5mKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzaW5mKF9feCk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2luZihkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNpbmYoX194KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzaW5mKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzaW5mKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbD46Ol9fdHlwZQorICAgIGlzaW5mKF9UcCBfX3gpCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc25hbihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc25hbihfX3gpOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNuYW4oZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzbmFuKF9feCk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc25hbihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc25hbihfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+OjpfX3R5cGUKKyAgICBpc25hbihfVHAgX194KQorICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNub3JtYWwoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNub3JtYWwoX194KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzbm9ybWFsKGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc25vcm1hbChfX3gpOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNub3JtYWwobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNub3JtYWwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sPjo6X190eXBlCisgICAgaXNub3JtYWwoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX3ggIT0gMCA/IHRydWUgOiBmYWxzZTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIHNpZ25iaXQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2lnbmJpdChfX3gpOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgc2lnbmJpdChkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2lnbmJpdChfX3gpOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgc2lnbmJpdChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zaWduYml0KF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbD46Ol9fdHlwZQorICAgIHNpZ25iaXQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX3ggPCAwID8gdHJ1ZSA6IGZhbHNlOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNncmVhdGVyKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNncmVhdGVyKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzZ3JlYXRlcihkb3VibGUgX194LCBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNncmVhdGVyKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzZ3JlYXRlcihsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcihfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUKKyAgICBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPChfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZQorCQkJICAgICYmIF9faXNfYXJpdGhtZXRpYzxfVXA+OjpfX3ZhbHVlKSwgYm9vbD46Ol9fdHlwZQorICAgIGlzZ3JlYXRlcihfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcihfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2dyZWF0ZXJlcXVhbChmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcmVxdWFsKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzZ3JlYXRlcmVxdWFsKGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXJlcXVhbChfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2dyZWF0ZXJlcXVhbChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcmVxdWFsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8KF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlCisJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUpLCBib29sPjo6X190eXBlCisgICAgaXNncmVhdGVyZXF1YWwoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXJlcXVhbChfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2xlc3MoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3MoX194LCBfX3kpOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNsZXNzKGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3MoX194LCBfX3kpOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNsZXNzKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNsZXNzKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8KF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlCisJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUpLCBib29sPjo6X190eXBlCisgICAgaXNsZXNzKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNsZXNzKF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzbGVzc2VxdWFsKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNsZXNzZXF1YWwoX194LCBfX3kpOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNsZXNzZXF1YWwoZG91YmxlIF9feCwgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzbGVzc2VxdWFsKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzbGVzc2VxdWFsKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNsZXNzZXF1YWwoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgY29uc3RleHByIHR5cGVuYW1lCisgICAgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwoX19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUKKwkJCSAgICAmJiBfX2lzX2FyaXRobWV0aWM8X1VwPjo6X192YWx1ZSksIGJvb2w+OjpfX3R5cGUKKyAgICBpc2xlc3NlcXVhbChfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbGVzc2VxdWFsKF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzbGVzc2dyZWF0ZXIoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3NncmVhdGVyKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzbGVzc2dyZWF0ZXIoZG91YmxlIF9feCwgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzbGVzc2dyZWF0ZXIoX194LCBfX3kpOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNsZXNzZ3JlYXRlcihsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzbGVzc2dyZWF0ZXIoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgY29uc3RleHByIHR5cGVuYW1lCisgICAgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwoX19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUKKwkJCSAgICAmJiBfX2lzX2FyaXRobWV0aWM8X1VwPjo6X192YWx1ZSksIGJvb2w+OjpfX3R5cGUKKyAgICBpc2xlc3NncmVhdGVyKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNsZXNzZ3JlYXRlcihfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc3Vub3JkZXJlZChmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzdW5vcmRlcmVkKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzdW5vcmRlcmVkKGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc3Vub3JkZXJlZChfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc3Vub3JkZXJlZChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzdW5vcmRlcmVkKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8KF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlCisJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUpLCBib29sPjo6X190eXBlCisgICAgaXN1bm9yZGVyZWQoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc3Vub3JkZXJlZChfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworI2Vsc2UKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGZwY2xhc3NpZnkoX1RwIF9fZikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2ZwY2xhc3NpZnkoRlBfTkFOLCBGUF9JTkZJTklURSwgRlBfTk9STUFMLAorCQkJCSAgRlBfU1VCTk9STUFMLCBGUF9aRVJPLCBfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNmaW5pdGUoX1RwIF9fZikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzZmluaXRlKF9fdHlwZShfX2YpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc2luZihfVHAgX19mKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNpbmYoX190eXBlKF9fZikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzbmFuKF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc25hbihfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNub3JtYWwoX1RwIF9fZikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbm9ybWFsKF9fdHlwZShfX2YpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBzaWduYml0KF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9zaWduYml0KF9fdHlwZShfX2YpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc2dyZWF0ZXIoX1RwIF9fZjEsIF9UcCBfX2YyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNncmVhdGVyKF9fdHlwZShfX2YxKSwgX190eXBlKF9fZjIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc2dyZWF0ZXJlcXVhbChfVHAgX19mMSwgX1RwIF9fZjIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXJlcXVhbChfX3R5cGUoX19mMSksIF9fdHlwZShfX2YyKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNsZXNzKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbGVzcyhfX3R5cGUoX19mMSksIF9fdHlwZShfX2YyKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNsZXNzZXF1YWwoX1RwIF9fZjEsIF9UcCBfX2YyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNsZXNzZXF1YWwoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzbGVzc2dyZWF0ZXIoX1RwIF9fZjEsIF9UcCBfX2YyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNsZXNzZ3JlYXRlcihfX3R5cGUoX19mMSksIF9fdHlwZShfX2YyKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXN1bm9yZGVyZWQoX1RwIF9fZjEsIF9UcCBfX2YyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXN1bm9yZGVyZWQoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HTElCQ1hYX1VTRV9DOTlfRlBfTUFDUk9TX0RZTkFNSUMgKi8KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCisjdW5kZWYgYWNvc2gKKyN1bmRlZiBhY29zaGYKKyN1bmRlZiBhY29zaGwKKyN1bmRlZiBhc2luaAorI3VuZGVmIGFzaW5oZgorI3VuZGVmIGFzaW5obAorI3VuZGVmIGF0YW5oCisjdW5kZWYgYXRhbmhmCisjdW5kZWYgYXRhbmhsCisjdW5kZWYgY2JydAorI3VuZGVmIGNicnRmCisjdW5kZWYgY2JydGwKKyN1bmRlZiBjb3B5c2lnbgorI3VuZGVmIGNvcHlzaWduZgorI3VuZGVmIGNvcHlzaWdubAorI3VuZGVmIGVyZgorI3VuZGVmIGVyZmYKKyN1bmRlZiBlcmZsCisjdW5kZWYgZXJmYworI3VuZGVmIGVyZmNmCisjdW5kZWYgZXJmY2wKKyN1bmRlZiBleHAyCisjdW5kZWYgZXhwMmYKKyN1bmRlZiBleHAybAorI3VuZGVmIGV4cG0xCisjdW5kZWYgZXhwbTFmCisjdW5kZWYgZXhwbTFsCisjdW5kZWYgZmRpbQorI3VuZGVmIGZkaW1mCisjdW5kZWYgZmRpbWwKKyN1bmRlZiBmbWEKKyN1bmRlZiBmbWFmCisjdW5kZWYgZm1hbAorI3VuZGVmIGZtYXgKKyN1bmRlZiBmbWF4ZgorI3VuZGVmIGZtYXhsCisjdW5kZWYgZm1pbgorI3VuZGVmIGZtaW5mCisjdW5kZWYgZm1pbmwKKyN1bmRlZiBoeXBvdAorI3VuZGVmIGh5cG90ZgorI3VuZGVmIGh5cG90bAorI3VuZGVmIGlsb2diCisjdW5kZWYgaWxvZ2JmCisjdW5kZWYgaWxvZ2JsCisjdW5kZWYgbGdhbW1hCisjdW5kZWYgbGdhbW1hZgorI3VuZGVmIGxnYW1tYWwKKyN1bmRlZiBsbHJpbnQKKyN1bmRlZiBsbHJpbnRmCisjdW5kZWYgbGxyaW50bAorI3VuZGVmIGxscm91bmQKKyN1bmRlZiBsbHJvdW5kZgorI3VuZGVmIGxscm91bmRsCisjdW5kZWYgbG9nMXAKKyN1bmRlZiBsb2cxcGYKKyN1bmRlZiBsb2cxcGwKKyN1bmRlZiBsb2cyCisjdW5kZWYgbG9nMmYKKyN1bmRlZiBsb2cybAorI3VuZGVmIGxvZ2IKKyN1bmRlZiBsb2diZgorI3VuZGVmIGxvZ2JsCisjdW5kZWYgbHJpbnQKKyN1bmRlZiBscmludGYKKyN1bmRlZiBscmludGwKKyN1bmRlZiBscm91bmQKKyN1bmRlZiBscm91bmRmCisjdW5kZWYgbHJvdW5kbAorI3VuZGVmIG5hbgorI3VuZGVmIG5hbmYKKyN1bmRlZiBuYW5sCisjdW5kZWYgbmVhcmJ5aW50CisjdW5kZWYgbmVhcmJ5aW50ZgorI3VuZGVmIG5lYXJieWludGwKKyN1bmRlZiBuZXh0YWZ0ZXIKKyN1bmRlZiBuZXh0YWZ0ZXJmCisjdW5kZWYgbmV4dGFmdGVybAorI3VuZGVmIG5leHR0b3dhcmQKKyN1bmRlZiBuZXh0dG93YXJkZgorI3VuZGVmIG5leHR0b3dhcmRsCisjdW5kZWYgcmVtYWluZGVyCisjdW5kZWYgcmVtYWluZGVyZgorI3VuZGVmIHJlbWFpbmRlcmwKKyN1bmRlZiByZW1xdW8KKyN1bmRlZiByZW1xdW9mCisjdW5kZWYgcmVtcXVvbAorI3VuZGVmIHJpbnQKKyN1bmRlZiByaW50ZgorI3VuZGVmIHJpbnRsCisjdW5kZWYgcm91bmQKKyN1bmRlZiByb3VuZGYKKyN1bmRlZiByb3VuZGwKKyN1bmRlZiBzY2FsYmxuCisjdW5kZWYgc2NhbGJsbmYKKyN1bmRlZiBzY2FsYmxubAorI3VuZGVmIHNjYWxibgorI3VuZGVmIHNjYWxibmYKKyN1bmRlZiBzY2FsYm5sCisjdW5kZWYgdGdhbW1hCisjdW5kZWYgdGdhbW1hZgorI3VuZGVmIHRnYW1tYWwKKyN1bmRlZiB0cnVuYworI3VuZGVmIHRydW5jZgorI3VuZGVmIHRydW5jbAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gdHlwZXMKKyAgdXNpbmcgOjpkb3VibGVfdDsKKyAgdXNpbmcgOjpmbG9hdF90OworCisgIC8vIGZ1bmN0aW9ucworICB1c2luZyA6OmFjb3NoOworICB1c2luZyA6OmFjb3NoZjsKKyAgdXNpbmcgOjphY29zaGw7CisKKyAgdXNpbmcgOjphc2luaDsKKyAgdXNpbmcgOjphc2luaGY7CisgIHVzaW5nIDo6YXNpbmhsOworCisgIHVzaW5nIDo6YXRhbmg7CisgIHVzaW5nIDo6YXRhbmhmOworICB1c2luZyA6OmF0YW5obDsKKworICB1c2luZyA6OmNicnQ7CisgIHVzaW5nIDo6Y2JydGY7CisgIHVzaW5nIDo6Y2JydGw7CisKKyAgdXNpbmcgOjpjb3B5c2lnbjsKKyAgdXNpbmcgOjpjb3B5c2lnbmY7CisgIHVzaW5nIDo6Y29weXNpZ25sOworCisgIHVzaW5nIDo6ZXJmOworICB1c2luZyA6OmVyZmY7CisgIHVzaW5nIDo6ZXJmbDsKKworICB1c2luZyA6OmVyZmM7CisgIHVzaW5nIDo6ZXJmY2Y7CisgIHVzaW5nIDo6ZXJmY2w7CisKKyAgdXNpbmcgOjpleHAyOworICB1c2luZyA6OmV4cDJmOworICB1c2luZyA6OmV4cDJsOworCisgIHVzaW5nIDo6ZXhwbTE7CisgIHVzaW5nIDo6ZXhwbTFmOworICB1c2luZyA6OmV4cG0xbDsKKworICB1c2luZyA6OmZkaW07CisgIHVzaW5nIDo6ZmRpbWY7CisgIHVzaW5nIDo6ZmRpbWw7CisKKyAgdXNpbmcgOjpmbWE7CisgIHVzaW5nIDo6Zm1hZjsKKyAgdXNpbmcgOjpmbWFsOworCisgIHVzaW5nIDo6Zm1heDsKKyAgdXNpbmcgOjpmbWF4ZjsKKyAgdXNpbmcgOjpmbWF4bDsKKworICB1c2luZyA6OmZtaW47CisgIHVzaW5nIDo6Zm1pbmY7CisgIHVzaW5nIDo6Zm1pbmw7CisKKyAgdXNpbmcgOjpoeXBvdDsKKyAgdXNpbmcgOjpoeXBvdGY7CisgIHVzaW5nIDo6aHlwb3RsOworCisgIHVzaW5nIDo6aWxvZ2I7CisgIHVzaW5nIDo6aWxvZ2JmOworICB1c2luZyA6Omlsb2dibDsKKworICB1c2luZyA6OmxnYW1tYTsKKyAgdXNpbmcgOjpsZ2FtbWFmOworICB1c2luZyA6OmxnYW1tYWw7CisKKyAgdXNpbmcgOjpsbHJpbnQ7CisgIHVzaW5nIDo6bGxyaW50ZjsKKyAgdXNpbmcgOjpsbHJpbnRsOworCisgIHVzaW5nIDo6bGxyb3VuZDsKKyAgdXNpbmcgOjpsbHJvdW5kZjsKKyAgdXNpbmcgOjpsbHJvdW5kbDsKKworICB1c2luZyA6OmxvZzFwOworICB1c2luZyA6OmxvZzFwZjsKKyAgdXNpbmcgOjpsb2cxcGw7CisKKyAgdXNpbmcgOjpsb2cyOworICB1c2luZyA6OmxvZzJmOworICB1c2luZyA6OmxvZzJsOworCisgIHVzaW5nIDo6bG9nYjsKKyAgdXNpbmcgOjpsb2diZjsKKyAgdXNpbmcgOjpsb2dibDsKKworICB1c2luZyA6OmxyaW50OworICB1c2luZyA6OmxyaW50ZjsKKyAgdXNpbmcgOjpscmludGw7CisKKyAgdXNpbmcgOjpscm91bmQ7CisgIHVzaW5nIDo6bHJvdW5kZjsKKyAgdXNpbmcgOjpscm91bmRsOworCisgIHVzaW5nIDo6bmFuOworICB1c2luZyA6Om5hbmY7CisgIHVzaW5nIDo6bmFubDsKKworICB1c2luZyA6Om5lYXJieWludDsKKyAgdXNpbmcgOjpuZWFyYnlpbnRmOworICB1c2luZyA6Om5lYXJieWludGw7CisKKyAgdXNpbmcgOjpuZXh0YWZ0ZXI7CisgIHVzaW5nIDo6bmV4dGFmdGVyZjsKKyAgdXNpbmcgOjpuZXh0YWZ0ZXJsOworCisgIHVzaW5nIDo6bmV4dHRvd2FyZDsKKyAgdXNpbmcgOjpuZXh0dG93YXJkZjsKKyAgdXNpbmcgOjpuZXh0dG93YXJkbDsKKworICB1c2luZyA6OnJlbWFpbmRlcjsKKyAgdXNpbmcgOjpyZW1haW5kZXJmOworICB1c2luZyA6OnJlbWFpbmRlcmw7CisKKyAgdXNpbmcgOjpyZW1xdW87CisgIHVzaW5nIDo6cmVtcXVvZjsKKyAgdXNpbmcgOjpyZW1xdW9sOworCisgIHVzaW5nIDo6cmludDsKKyAgdXNpbmcgOjpyaW50ZjsKKyAgdXNpbmcgOjpyaW50bDsKKworICB1c2luZyA6OnJvdW5kOworICB1c2luZyA6OnJvdW5kZjsKKyAgdXNpbmcgOjpyb3VuZGw7CisKKyAgdXNpbmcgOjpzY2FsYmxuOworICB1c2luZyA6OnNjYWxibG5mOworICB1c2luZyA6OnNjYWxibG5sOworCisgIHVzaW5nIDo6c2NhbGJuOworICB1c2luZyA6OnNjYWxibmY7CisgIHVzaW5nIDo6c2NhbGJubDsKKworICB1c2luZyA6OnRnYW1tYTsKKyAgdXNpbmcgOjp0Z2FtbWFmOworICB1c2luZyA6OnRnYW1tYWw7CisKKyAgdXNpbmcgOjp0cnVuYzsKKyAgdXNpbmcgOjp0cnVuY2Y7CisgIHVzaW5nIDo6dHJ1bmNsOworCisgIC8vLyBBZGRpdGlvbmFsIG92ZXJsb2Fkcy4KKyAgY29uc3RleHByIGZsb2F0CisgIGFjb3NoKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2Fjb3NoZihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIGFjb3NoKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2Fjb3NobChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBhY29zaChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9hY29zaChfX3gpOyB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIGFzaW5oKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2FzaW5oZihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIGFzaW5oKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2FzaW5obChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBhc2luaChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9hc2luaChfX3gpOyB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIGF0YW5oKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2F0YW5oZihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIGF0YW5oKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2F0YW5obChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBhdGFuaChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9hdGFuaChfX3gpOyB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIGNicnQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2JydGYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBjYnJ0KGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2NicnRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGNicnQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fY2JydChfX3gpOyB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIGNvcHlzaWduKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fY29weXNpZ25mKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBjb3B5c2lnbihsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2NvcHlzaWdubChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIGNvcHlzaWduKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBjb3B5c2lnbihfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgZXJmKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2VyZmYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBlcmYobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXJmbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBlcmYoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZXJmKF9feCk7IH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgZXJmYyhmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9lcmZjZihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIGVyZmMobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXJmY2woX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgZXJmYyhfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9lcmZjKF9feCk7IH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgZXhwMihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9leHAyZihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIGV4cDIobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXhwMmwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgZXhwMihfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9leHAyKF9feCk7IH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgZXhwbTEoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXhwbTFmKF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgZXhwbTEobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXhwbTFsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGV4cG0xKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2V4cG0xKF9feCk7IH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgZmRpbShmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZkaW1mKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBmZGltKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmRpbWwoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUKKyAgICBmZGltKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBmZGltKF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBmbWEoZmxvYXQgX194LCBmbG9hdCBfX3ksIGZsb2F0IF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2ZtYWYoX194LCBfX3ksIF9feik7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgZm1hKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195LCBsb25nIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWFsKF9feCwgX195LCBfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9WcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMzxfVHAsIF9VcCwgX1ZwPjo6X190eXBlCisgICAgZm1hKF9UcCBfX3gsIF9VcCBfX3ksIF9WcCBfX3opCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8zPF9UcCwgX1VwLCBfVnA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGZtYShfX3R5cGUoX194KSwgX190eXBlKF9feSksIF9fdHlwZShfX3opKTsKKyAgICB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIGZtYXgoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWF4ZihfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgZm1heChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZtYXhsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgZm1heChfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gZm1heChfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgZm1pbihmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZtaW5mKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBmbWluKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fZm1pbmwoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUKKyAgICBmbWluKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBmbWluKF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBoeXBvdChmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2h5cG90ZihfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgaHlwb3QobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9oeXBvdGwoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUKKyAgICBoeXBvdChfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gaHlwb3QoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgY29uc3RleHByIGludAorICBpbG9nYihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pbG9nYmYoX194KTsgfQorCisgIGNvbnN0ZXhwciBpbnQKKyAgaWxvZ2IobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faWxvZ2JsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ+OjpfX3R5cGUKKyAgICBpbG9nYihfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9pbG9nYihfX3gpOyB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIGxnYW1tYShmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sZ2FtbWFmKF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgbGdhbW1hKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xnYW1tYWwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgbGdhbW1hKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xnYW1tYShfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcgbG9uZworICBsbHJpbnQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbGxyaW50ZihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcgbG9uZworICBsbHJpbnQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbGxyaW50bChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxvbmc+OjpfX3R5cGUKKyAgICBsbHJpbnQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbGxyaW50KF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBsb25nCisgIGxscm91bmQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbGxyb3VuZGYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGxvbmcKKyAgbGxyb3VuZChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sbHJvdW5kbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxvbmc+OjpfX3R5cGUKKyAgICBsbHJvdW5kKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xscm91bmQoX194KTsgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBsb2cxcChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cxcGYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBsb2cxcChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cxcGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgbG9nMXAoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMXAoX194KTsgfQorCisgIC8vIERSIDU2OC4KKyAgY29uc3RleHByIGZsb2F0CisgIGxvZzIoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMmYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBsb2cyKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xvZzJsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxvZzIoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMihfX3gpOyB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIGxvZ2IoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nYmYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBsb2diKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xvZ2JsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxvZ2IoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbG9nYihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcKKyAgbHJpbnQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbHJpbnRmKF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZworICBscmludChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9scmludGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZz46Ol9fdHlwZQorICAgIGxyaW50KF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xyaW50KF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZworICBscm91bmQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbHJvdW5kZihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcKKyAgbHJvdW5kKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xyb3VuZGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZz46Ol9fdHlwZQorICAgIGxyb3VuZChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9scm91bmQoX194KTsgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBuZWFyYnlpbnQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbmVhcmJ5aW50ZihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIG5lYXJieWludChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZWFyYnlpbnRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIG5lYXJieWludChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZWFyYnlpbnQoX194KTsgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBuZXh0YWZ0ZXIoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0YWZ0ZXJmKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBuZXh0YWZ0ZXIobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0YWZ0ZXJsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgbmV4dGFmdGVyKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBuZXh0YWZ0ZXIoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIG5leHR0b3dhcmQoZmxvYXQgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0dG93YXJkZihfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgbmV4dHRvd2FyZChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX25leHR0b3dhcmRsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgbmV4dHRvd2FyZChfVHAgX194LCBsb25nIGRvdWJsZSBfX3kpCisgICAgeyByZXR1cm4gX19idWlsdGluX25leHR0b3dhcmQoX194LCBfX3kpOyB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIHJlbWFpbmRlcihmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX3JlbWFpbmRlcmYoX194LCBfX3kpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIHJlbWFpbmRlcihsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX3JlbWFpbmRlcmwoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUKKyAgICByZW1haW5kZXIoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIHJlbWFpbmRlcihfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgcmVtcXVvKGZsb2F0IF9feCwgZmxvYXQgX195LCBpbnQqIF9fcHF1bykKKyAgeyByZXR1cm4gX19idWlsdGluX3JlbXF1b2YoX194LCBfX3ksIF9fcHF1byk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgcmVtcXVvKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195LCBpbnQqIF9fcHF1bykKKyAgeyByZXR1cm4gX19idWlsdGluX3JlbXF1b2woX194LCBfX3ksIF9fcHF1byk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIHJlbXF1byhfVHAgX194LCBfVXAgX195LCBpbnQqIF9fcHF1bykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIHJlbXF1byhfX3R5cGUoX194KSwgX190eXBlKF9feSksIF9fcHF1byk7CisgICAgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICByaW50KGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3JpbnRmKF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgcmludChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yaW50bChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICByaW50KF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3JpbnQoX194KTsgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICByb3VuZChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yb3VuZGYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICByb3VuZChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yb3VuZGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgcm91bmQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fcm91bmQoX194KTsgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBzY2FsYmxuKGZsb2F0IF9feCwgbG9uZyBfX2V4KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2NhbGJsbmYoX194LCBfX2V4KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBzY2FsYmxuKGxvbmcgZG91YmxlIF9feCwgbG9uZyBfX2V4KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2NhbGJsbmwoX194LCBfX2V4KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgc2NhbGJsbihfVHAgX194LCBsb25nIF9fZXgpCisgICAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibG4oX194LCBfX2V4KTsgfQorIAorICBjb25zdGV4cHIgZmxvYXQKKyAgc2NhbGJuKGZsb2F0IF9feCwgaW50IF9fZXgpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zY2FsYm5mKF9feCwgX19leCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgc2NhbGJuKGxvbmcgZG91YmxlIF9feCwgaW50IF9fZXgpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zY2FsYm5sKF9feCwgX19leCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHNjYWxibihfVHAgX194LCBpbnQgX19leCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fc2NhbGJuKF9feCwgX19leCk7IH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgdGdhbW1hKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RnYW1tYWYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICB0Z2FtbWEobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fdGdhbW1hbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICB0Z2FtbWEoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fdGdhbW1hKF9feCk7IH0KKyAKKyAgY29uc3RleHByIGZsb2F0CisgIHRydW5jKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RydW5jZihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIHRydW5jKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RydW5jbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICB0cnVuYyhfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl90cnVuYyhfX3gpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jb21wbGV4IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jb21wbGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOWYyOTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NvbXBsZXgKQEAgLTAsMCArMSwxOTMzIEBACisvLyBUaGUgdGVtcGxhdGUgYW5kIGlubGluZXMgZm9yIHRoZSAtKi0gQysrIC0qLSBjb21wbGV4IG51bWJlciBjbGFzc2VzLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jb21wbGV4CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjYuMiAgQ29tcGxleCBOdW1iZXJzCisvLyBOb3RlOiB0aGlzIGlzIG5vdCBhIGNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb24uCisvLyBJbml0aWFsbHkgaW1wbGVtZW50ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKy8vIEltcHJvdmVkIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPGRvc3JlaXNAY21sYS5lbnMtY2FjaGFuLmZyPgorLy8KKworI2lmbmRlZiBfR0xJQkNYWF9DT01QTEVYCisjZGVmaW5lIF9HTElCQ1hYX0NPTVBMRVggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworLy8gR2V0IHJpZCBvZiBhIG1hY3JvIHBvc3NpYmx5IGRlZmluZWQgaW4gPGNvbXBsZXguaD4KKyN1bmRlZiBjb21wbGV4CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGRlZmdyb3VwIGNvbXBsZXhfbnVtYmVycyBDb21wbGV4IE51bWJlcnMKKyAgICogQGluZ3JvdXAgbnVtZXJpY3MKKyAgICoKKyAgICogQ2xhc3NlcyBhbmQgZnVuY3Rpb25zIGZvciBjb21wbGV4IG51bWJlcnMuCisgICAqIEB7CisgICAqLworCisgIC8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNsYXNzIGNvbXBsZXg7CisgIHRlbXBsYXRlPD4gY2xhc3MgY29tcGxleDxmbG9hdD47CisgIHRlbXBsYXRlPD4gY2xhc3MgY29tcGxleDxkb3VibGU+OworICB0ZW1wbGF0ZTw+IGNsYXNzIGNvbXBsZXg8bG9uZyBkb3VibGU+OworCisgIC8vLyAgUmV0dXJuIG1hZ25pdHVkZSBvZiBAYSB6LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IF9UcCBhYnMoY29uc3QgY29tcGxleDxfVHA+Jik7CisgIC8vLyAgUmV0dXJuIHBoYXNlIGFuZ2xlIG9mIEBhIHouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gX1RwIGFyZyhjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgLy8vICBSZXR1cm4gQGEgeiBtYWduaXR1ZGUgc3F1YXJlZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBfVHAgbm9ybShjb25zdCBjb21wbGV4PF9UcD4mKTsKKworICAvLy8gIFJldHVybiBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBAYSB6LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBjb25qKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gIFJldHVybiBjb21wbGV4IHdpdGggbWFnbml0dWRlIEBhIHJobyBhbmQgYW5nbGUgQGEgdGhldGEuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IHBvbGFyKGNvbnN0IF9UcCYsIGNvbnN0IF9UcCYgPSAwKTsKKworICAvLyBUcmFuc2NlbmRlbnRhbHM6CisgIC8vLyBSZXR1cm4gY29tcGxleCBjb3NpbmUgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gY29zKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gUmV0dXJuIGNvbXBsZXggaHlwZXJib2xpYyBjb3NpbmUgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gY29zaChjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgLy8vIFJldHVybiBjb21wbGV4IGJhc2UgZSBleHBvbmVudGlhbCBvZiBAYSB6LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBleHAoY29uc3QgY29tcGxleDxfVHA+Jik7CisgIC8vLyBSZXR1cm4gY29tcGxleCBuYXR1cmFsIGxvZ2FyaXRobSBvZiBAYSB6LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBsb2coY29uc3QgY29tcGxleDxfVHA+Jik7CisgIC8vLyBSZXR1cm4gY29tcGxleCBiYXNlIDEwIGxvZ2FyaXRobSBvZiBAYSB6LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBsb2cxMChjb25zdCBjb21wbGV4PF9UcD4mKTsKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgLy8gRFIgODQ0LgorICAvLy8gUmV0dXJuIEBhIHggdG8gdGhlIEBhIHkndGggcG93ZXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IHBvdyhjb25zdCBjb21wbGV4PF9UcD4mLCBpbnQpOworI2VuZGlmCisgIC8vLyBSZXR1cm4gQGEgeCB0byB0aGUgQGEgeSd0aCBwb3dlci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gcG93KGNvbnN0IGNvbXBsZXg8X1RwPiYsIGNvbnN0IF9UcCYpOworICAvLy8gUmV0dXJuIEBhIHggdG8gdGhlIEBhIHkndGggcG93ZXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IHBvdyhjb25zdCBjb21wbGV4PF9UcD4mLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gUmV0dXJuIEBhIHggdG8gdGhlIEBhIHkndGggcG93ZXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IHBvdyhjb25zdCBfVHAmLCBjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgLy8vIFJldHVybiBjb21wbGV4IHNpbmUgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gc2luKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gUmV0dXJuIGNvbXBsZXggaHlwZXJib2xpYyBzaW5lIG9mIEBhIHouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IHNpbmgoY29uc3QgY29tcGxleDxfVHA+Jik7CisgIC8vLyBSZXR1cm4gY29tcGxleCBzcXVhcmUgcm9vdCBvZiBAYSB6LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBzcXJ0KGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gUmV0dXJuIGNvbXBsZXggdGFuZ2VudCBvZiBAYSB6LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiB0YW4oY29uc3QgY29tcGxleDxfVHA+Jik7CisgIC8vLyBSZXR1cm4gY29tcGxleCBoeXBlcmJvbGljIHRhbmdlbnQgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gdGFuaChjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgICAKKyAgICAKKyAgLy8gMjYuMi4yICBQcmltYXJ5IHRlbXBsYXRlIGNsYXNzIGNvbXBsZXgKKyAgLyoqCisgICAqICBUZW1wbGF0ZSB0byByZXByZXNlbnQgY29tcGxleCBudW1iZXJzLgorICAgKgorICAgKiAgU3BlY2lhbGl6YXRpb25zIGZvciBmbG9hdCwgZG91YmxlLCBhbmQgbG9uZyBkb3VibGUgYXJlIHBhcnQgb2YgdGhlCisgICAqICBsaWJyYXJ5LiAgUmVzdWx0cyB3aXRoIGFueSBvdGhlciB0eXBlIGFyZSBub3QgZ3VhcmFudGVlZC4KKyAgICoKKyAgICogIEBwYXJhbSAgVHAgIFR5cGUgb2YgcmVhbCBhbmQgaW1hZ2luYXJ5IHZhbHVlcy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBjb21wbGV4CisgICAgeworICAgICAgLy8vIFZhbHVlIHR5cGVkZWYuCisgICAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICAgICAgCisgICAgICAvLy8gIERlZmF1bHQgY29uc3RydWN0b3IuICBGaXJzdCBwYXJhbWV0ZXIgaXMgeCwgc2Vjb25kIHBhcmFtZXRlciBpcyB5LgorICAgICAgLy8vICBVbnNwZWNpZmllZCBwYXJhbWV0ZXJzIGRlZmF1bHQgdG8gMC4KKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBjb21wbGV4KGNvbnN0IF9UcCYgX19yID0gX1RwKCksIGNvbnN0IF9UcCYgX19pID0gX1RwKCkpCisgICAgICA6IF9NX3JlYWwoX19yKSwgX01faW1hZyhfX2kpIHsgfQorCisgICAgICAvLyBMZXRzIHRoZSBjb21waWxlciBzeW50aGVzaXplIHRoZSBjb3B5IGNvbnN0cnVjdG9yICAgCisgICAgICAvLyBjb21wbGV4IChjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgICAgIC8vLyAgQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgoY29uc3QgY29tcGxleDxfVXA+JiBfX3opCisJOiBfTV9yZWFsKF9fei5yZWFsKCkpLCBfTV9pbWFnKF9fei5pbWFnKCkpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMzg3LiBzdGQ6OmNvbXBsZXggb3Zlci1lbmNhcHN1bGF0ZWQuCisgICAgICBfR0xJQkNYWF9BQklfVEFHX0NYWDExCisgICAgICBjb25zdGV4cHIgX1RwIAorICAgICAgcmVhbCgpIHsgcmV0dXJuIF9NX3JlYWw7IH0KKworICAgICAgX0dMSUJDWFhfQUJJX1RBR19DWFgxMQorICAgICAgY29uc3RleHByIF9UcCAKKyAgICAgIGltYWcoKSB7IHJldHVybiBfTV9pbWFnOyB9CisjZWxzZQorICAgICAgLy8vICBSZXR1cm4gcmVhbCBwYXJ0IG9mIGNvbXBsZXggbnVtYmVyLgorICAgICAgX1RwJiAKKyAgICAgIHJlYWwoKSB7IHJldHVybiBfTV9yZWFsOyB9CisKKyAgICAgIC8vLyAgUmV0dXJuIHJlYWwgcGFydCBvZiBjb21wbGV4IG51bWJlci4KKyAgICAgIGNvbnN0IF9UcCYgCisgICAgICByZWFsKCkgY29uc3QgeyByZXR1cm4gX01fcmVhbDsgfQorCisgICAgICAvLy8gIFJldHVybiBpbWFnaW5hcnkgcGFydCBvZiBjb21wbGV4IG51bWJlci4KKyAgICAgIF9UcCYgCisgICAgICBpbWFnKCkgeyByZXR1cm4gX01faW1hZzsgfQorCisgICAgICAvLy8gIFJldHVybiBpbWFnaW5hcnkgcGFydCBvZiBjb21wbGV4IG51bWJlci4KKyAgICAgIGNvbnN0IF9UcCYgCisgICAgICBpbWFnKCkgY29uc3QgeyByZXR1cm4gX01faW1hZzsgfQorI2VuZGlmCisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDM4Ny4gc3RkOjpjb21wbGV4IG92ZXItZW5jYXBzdWxhdGVkLgorICAgICAgdm9pZCAKKyAgICAgIHJlYWwoX1RwIF9fdmFsKSB7IF9NX3JlYWwgPSBfX3ZhbDsgfQorCisgICAgICB2b2lkIAorICAgICAgaW1hZyhfVHAgX192YWwpIHsgX01faW1hZyA9IF9fdmFsOyB9CisKKyAgICAgIC8vLyBBc3NpZ24gdGhpcyBjb21wbGV4IG51bWJlciB0byBzY2FsYXIgQGEgdC4KKyAgICAgIGNvbXBsZXg8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IF9UcCYpOworICAgICAgCisgICAgICAvLy8gQWRkIEBhIHQgdG8gdGhpcyBjb21wbGV4IG51bWJlci4KKyAgICAgIC8vIDI2LjIuNS8xCisgICAgICBjb21wbGV4PF9UcD4mCisgICAgICBvcGVyYXRvcis9KGNvbnN0IF9UcCYgX190KQorICAgICAgeworCV9NX3JlYWwgKz0gX190OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8vIFN1YnRyYWN0IEBhIHQgZnJvbSB0aGlzIGNvbXBsZXggbnVtYmVyLgorICAgICAgLy8gMjYuMi41LzMKKyAgICAgIGNvbXBsZXg8X1RwPiYKKyAgICAgIG9wZXJhdG9yLT0oY29uc3QgX1RwJiBfX3QpCisgICAgICB7CisJX01fcmVhbCAtPSBfX3Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLy8gTXVsdGlwbHkgdGhpcyBjb21wbGV4IG51bWJlciBieSBAYSB0LgorICAgICAgY29tcGxleDxfVHA+JiBvcGVyYXRvcio9KGNvbnN0IF9UcCYpOworICAgICAgLy8vIERpdmlkZSB0aGlzIGNvbXBsZXggbnVtYmVyIGJ5IEBhIHQuCisgICAgICBjb21wbGV4PF9UcD4mIG9wZXJhdG9yLz0oY29uc3QgX1RwJik7CisKKyAgICAgIC8vIExldHMgdGhlIGNvbXBpbGVyIHN5bnRoZXNpemUgdGhlCisgICAgICAvLyBjb3B5IGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgICAvLyBjb21wbGV4PF9UcD4mIG9wZXJhdG9yPSAoY29uc3QgY29tcGxleDxfVHA+Jik7CisgICAgICAvLy8gQXNzaWduIHRoaXMgY29tcGxleCBudW1iZXIgdG8gY29tcGxleCBAYSB6LgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBjb21wbGV4PF9UcD4mIG9wZXJhdG9yPShjb25zdCBjb21wbGV4PF9VcD4mKTsKKyAgICAgIC8vLyBBZGQgQGEgeiB0byB0aGlzIGNvbXBsZXggbnVtYmVyLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBjb21wbGV4PF9UcD4mIG9wZXJhdG9yKz0oY29uc3QgY29tcGxleDxfVXA+Jik7CisgICAgICAvLy8gU3VidHJhY3QgQGEgeiBmcm9tIHRoaXMgY29tcGxleCBudW1iZXIuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIGNvbXBsZXg8X1RwPiYgb3BlcmF0b3ItPShjb25zdCBjb21wbGV4PF9VcD4mKTsKKyAgICAgIC8vLyBNdWx0aXBseSB0aGlzIGNvbXBsZXggbnVtYmVyIGJ5IEBhIHouCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIGNvbXBsZXg8X1RwPiYgb3BlcmF0b3IqPShjb25zdCBjb21wbGV4PF9VcD4mKTsKKyAgICAgIC8vLyBEaXZpZGUgdGhpcyBjb21wbGV4IG51bWJlciBieSBAYSB6LgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBjb21wbGV4PF9UcD4mIG9wZXJhdG9yLz0oY29uc3QgY29tcGxleDxfVXA+Jik7CisKKyAgICAgIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgY29tcGxleCBfX3JlcCgpIGNvbnN0CisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9UcCBfTV9yZWFsOworICAgICAgX1RwIF9NX2ltYWc7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29tcGxleDxfVHA+JgorICAgIGNvbXBsZXg8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9UcCYgX190KQorICAgIHsKKyAgICAgX01fcmVhbCA9IF9fdDsKKyAgICAgX01faW1hZyA9IF9UcCgpOworICAgICByZXR1cm4gKnRoaXM7CisgICAgfSAKKworICAvLyAyNi4yLjUvNQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29tcGxleDxfVHA+JgorICAgIGNvbXBsZXg8X1RwPjo6b3BlcmF0b3IqPShjb25zdCBfVHAmIF9fdCkKKyAgICB7CisgICAgICBfTV9yZWFsICo9IF9fdDsKKyAgICAgIF9NX2ltYWcgKj0gX190OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAvLyAyNi4yLjUvNworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29tcGxleDxfVHA+JgorICAgIGNvbXBsZXg8X1RwPjo6b3BlcmF0b3IvPShjb25zdCBfVHAmIF9fdCkKKyAgICB7CisgICAgICBfTV9yZWFsIC89IF9fdDsKKyAgICAgIF9NX2ltYWcgLz0gX190OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgIGNvbXBsZXg8X1RwPiYKKyAgICBjb21wbGV4PF9UcD46Om9wZXJhdG9yPShjb25zdCBjb21wbGV4PF9VcD4mIF9feikKKyAgICB7CisgICAgICBfTV9yZWFsID0gX196LnJlYWwoKTsKKyAgICAgIF9NX2ltYWcgPSBfX3ouaW1hZygpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAvLyAyNi4yLjUvOQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgIGNvbXBsZXg8X1RwPiYKKyAgICBjb21wbGV4PF9UcD46Om9wZXJhdG9yKz0oY29uc3QgY29tcGxleDxfVXA+JiBfX3opCisgICAgeworICAgICAgX01fcmVhbCArPSBfX3oucmVhbCgpOworICAgICAgX01faW1hZyArPSBfX3ouaW1hZygpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAvLyAyNi4yLjUvMTEKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICBjb21wbGV4PF9UcD4mCisgICAgY29tcGxleDxfVHA+OjpvcGVyYXRvci09KGNvbnN0IGNvbXBsZXg8X1VwPiYgX196KQorICAgIHsKKyAgICAgIF9NX3JlYWwgLT0gX196LnJlYWwoKTsKKyAgICAgIF9NX2ltYWcgLT0gX196LmltYWcoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgLy8gMjYuMi41LzEzCisgIC8vIFhYWDogVGhpcyBpcyBhIGdyYW1tYXIgc2Nob29sIGltcGxlbWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgIGNvbXBsZXg8X1RwPiYKKyAgICBjb21wbGV4PF9UcD46Om9wZXJhdG9yKj0oY29uc3QgY29tcGxleDxfVXA+JiBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9fciA9IF9NX3JlYWwgKiBfX3oucmVhbCgpIC0gX01faW1hZyAqIF9fei5pbWFnKCk7CisgICAgICBfTV9pbWFnID0gX01fcmVhbCAqIF9fei5pbWFnKCkgKyBfTV9pbWFnICogX196LnJlYWwoKTsKKyAgICAgIF9NX3JlYWwgPSBfX3I7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIC8vIDI2LjIuNS8xNQorICAvLyBYWFg6IFRoaXMgaXMgYSBncmFtbWFyIHNjaG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICBjb21wbGV4PF9UcD4mCisgICAgY29tcGxleDxfVHA+OjpvcGVyYXRvci89KGNvbnN0IGNvbXBsZXg8X1VwPiYgX196KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX3IgPSAgX01fcmVhbCAqIF9fei5yZWFsKCkgKyBfTV9pbWFnICogX196LmltYWcoKTsKKyAgICAgIGNvbnN0IF9UcCBfX24gPSBzdGQ6Om5vcm0oX196KTsKKyAgICAgIF9NX2ltYWcgPSAoX01faW1hZyAqIF9fei5yZWFsKCkgLSBfTV9yZWFsICogX196LmltYWcoKSkgLyBfX247CisgICAgICBfTV9yZWFsID0gX19yIC8gX19uOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAKKyAgLy8gT3BlcmF0b3JzOgorICAvL0B7CisgIC8vLyAgUmV0dXJuIG5ldyBjb21wbGV4IHZhbHVlIEBhIHggcGx1cyBAYSB5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yKyhjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeworICAgICAgY29tcGxleDxfVHA+IF9fciA9IF9feDsKKyAgICAgIF9fciArPSBfX3k7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yKyhjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX3kpCisgICAgeworICAgICAgY29tcGxleDxfVHA+IF9fciA9IF9feDsKKyAgICAgIF9fciArPSBfX3k7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yKyhjb25zdCBfVHAmIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeworICAgICAgY29tcGxleDxfVHA+IF9fciA9IF9feTsKKyAgICAgIF9fciArPSBfX3g7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKyAgLy9AfQorCisgIC8vQHsKKyAgLy8vICBSZXR1cm4gbmV3IGNvbXBsZXggdmFsdWUgQGEgeCBtaW51cyBAYSB5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yLShjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeworICAgICAgY29tcGxleDxfVHA+IF9fciA9IF9feDsKKyAgICAgIF9fciAtPSBfX3k7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKyAgICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvci0oY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX195KQorICAgIHsKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3IgPSBfX3g7CisgICAgICBfX3IgLT0gX195OworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvci0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3IoX194LCAtX195LmltYWcoKSk7CisgICAgICBfX3IgLT0gX195LnJlYWwoKTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorICAvL0B9CisKKyAgLy9AeworICAvLy8gIFJldHVybiBuZXcgY29tcGxleCB2YWx1ZSBAYSB4IHRpbWVzIEBhIHkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3IqKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX19yID0gX194OworICAgICAgX19yICo9IF9feTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3IqKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBfVHAmIF9feSkKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX19yID0gX194OworICAgICAgX19yICo9IF9feTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3IqKGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX19yID0gX195OworICAgICAgX19yICo9IF9feDsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorICAvL0B9CisKKyAgLy9AeworICAvLy8gIFJldHVybiBuZXcgY29tcGxleCB2YWx1ZSBAYSB4IGRpdmlkZWQgYnkgQGEgeS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvci8oY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3IgPSBfX3g7CisgICAgICBfX3IgLz0gX195OworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisgICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3IvKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBfVHAmIF9feSkKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX19yID0gX194OworICAgICAgX19yIC89IF9feTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3IvKGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX19yID0gX194OworICAgICAgX19yIC89IF9feTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorICAvL0B9CisKKyAgLy8vICBSZXR1cm4gQGEgeC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvcisoY29uc3QgY29tcGxleDxfVHA+JiBfX3gpCisgICAgeyByZXR1cm4gX194OyB9CisKKyAgLy8vICBSZXR1cm4gY29tcGxleCBuZWdhdGlvbiBvZiBAYSB4LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yLShjb25zdCBjb21wbGV4PF9UcD4mIF9feCkKKyAgICB7ICByZXR1cm4gY29tcGxleDxfVHA+KC1fX3gucmVhbCgpLCAtX194LmltYWcoKSk7IH0KKworICAvL0B7CisgIC8vLyAgUmV0dXJuIHRydWUgaWYgQGEgeCBpcyBlcXVhbCB0byBAYSB5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeyByZXR1cm4gX194LnJlYWwoKSA9PSBfX3kucmVhbCgpICYmIF9feC5pbWFnKCkgPT0gX195LmltYWcoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBfVHAmIF9feSkKKyAgICB7IHJldHVybiBfX3gucmVhbCgpID09IF9feSAmJiBfX3guaW1hZygpID09IF9UcCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsgcmV0dXJuIF9feCA9PSBfX3kucmVhbCgpICYmIF9UcCgpID09IF9feS5pbWFnKCk7IH0KKyAgLy9AfQorCisgIC8vQHsKKyAgLy8vICBSZXR1cm4gZmFsc2UgaWYgQGEgeCBpcyBlcXVhbCB0byBAYSB5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeyByZXR1cm4gX194LnJlYWwoKSAhPSBfX3kucmVhbCgpIHx8IF9feC5pbWFnKCkgIT0gX195LmltYWcoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBfVHAmIF9feSkKKyAgICB7IHJldHVybiBfX3gucmVhbCgpICE9IF9feSB8fCBfX3guaW1hZygpICE9IF9UcCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsgcmV0dXJuIF9feCAhPSBfX3kucmVhbCgpIHx8IF9UcCgpICE9IF9feS5pbWFnKCk7IH0KKyAgLy9AfQorCisgIC8vLyAgRXh0cmFjdGlvbiBvcGVyYXRvciBmb3IgY29tcGxleCB2YWx1ZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgY29tcGxleDxfVHA+JiBfX3gpCisgICAgeworICAgICAgX1RwIF9fcmVfeCwgX19pbV94OworICAgICAgX0NoYXJUIF9fY2g7CisgICAgICBfX2lzID4+IF9fY2g7CisgICAgICBpZiAoX19jaCA9PSAnKCcpIAorCXsKKwkgIF9faXMgPj4gX19yZV94ID4+IF9fY2g7CisJICBpZiAoX19jaCA9PSAnLCcpIAorCSAgICB7CisJICAgICAgX19pcyA+PiBfX2ltX3ggPj4gX19jaDsKKwkgICAgICBpZiAoX19jaCA9PSAnKScpIAorCQlfX3ggPSBjb21wbGV4PF9UcD4oX19yZV94LCBfX2ltX3gpOworCSAgICAgIGVsc2UKKwkJX19pcy5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fY2ggPT0gJyknKSAKKwkgICAgX194ID0gX19yZV94OworCSAgZWxzZQorCSAgICBfX2lzLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKwl9CisgICAgICBlbHNlIAorCXsKKwkgIF9faXMucHV0YmFjayhfX2NoKTsKKwkgIF9faXMgPj4gX19yZV94OworCSAgX194ID0gX19yZV94OworCX0KKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworICAvLy8gIEluc2VydGlvbiBvcGVyYXRvciBmb3IgY29tcGxleCB2YWx1ZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgY29uc3QgY29tcGxleDxfVHA+JiBfX3gpCisgICAgeworICAgICAgYmFzaWNfb3N0cmluZ3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9fczsKKyAgICAgIF9fcy5mbGFncyhfX29zLmZsYWdzKCkpOworICAgICAgX19zLmltYnVlKF9fb3MuZ2V0bG9jKCkpOworICAgICAgX19zLnByZWNpc2lvbihfX29zLnByZWNpc2lvbigpKTsKKyAgICAgIF9fcyA8PCAnKCcgPDwgX194LnJlYWwoKSA8PCAnLCcgPDwgX194LmltYWcoKSA8PCAnKSc7CisgICAgICByZXR1cm4gX19vcyA8PCBfX3Muc3RyKCk7CisgICAgfQorCisgIC8vIFZhbHVlcworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciBfVHAKKyAgICByZWFsKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fei5yZWFsKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIF9UcAorICAgIGltYWcoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX196LmltYWcoKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAmCisgICAgcmVhbChjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX3oucmVhbCgpOyB9CisgICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29uc3QgX1RwJgorICAgIHJlYWwoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX196LnJlYWwoKTsgfQorICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcCYKKyAgICBpbWFnKGNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fei5pbWFnKCk7IH0KKyAgICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb25zdCBfVHAmCisgICAgaW1hZyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX3ouaW1hZygpOyB9CisjZW5kaWYKKworICAvLyAyNi4yLjcvMyBhYnMoX196KTogIFJldHVybnMgdGhlIG1hZ25pdHVkZSBvZiBfX3ouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX19jb21wbGV4X2Ficyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBfVHAgX194ID0gX196LnJlYWwoKTsKKyAgICAgIF9UcCBfX3kgPSBfX3ouaW1hZygpOworICAgICAgY29uc3QgX1RwIF9fcyA9IHN0ZDo6bWF4KGFicyhfX3gpLCBhYnMoX195KSk7CisgICAgICBpZiAoX19zID09IF9UcCgpKSAgLy8gd2VsbCAuLi4KKyAgICAgICAgcmV0dXJuIF9fczsKKyAgICAgIF9feCAvPSBfX3M7IAorICAgICAgX195IC89IF9fczsKKyAgICAgIHJldHVybiBfX3MgKiBzcXJ0KF9feCAqIF9feCArIF9feSAqIF9feSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgIGlubGluZSBmbG9hdAorICBfX2NvbXBsZXhfYWJzKF9fY29tcGxleF9fIGZsb2F0IF9feikgeyByZXR1cm4gX19idWlsdGluX2NhYnNmKF9feik7IH0KKworICBpbmxpbmUgZG91YmxlCisgIF9fY29tcGxleF9hYnMoX19jb21wbGV4X18gZG91YmxlIF9feikgeyByZXR1cm4gX19idWlsdGluX2NhYnMoX196KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfYWJzKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWJzbChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBhYnMoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9hYnMoX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIGFicyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X2FicyhfX3opOyB9CisjZW5kaWYgIAorCisKKyAgLy8gMjYuMi43LzQ6IGFyZyhfX3opOiBSZXR1cm5zIHRoZSBwaGFzZSBhbmdsZSBvZiBfX3ouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX19jb21wbGV4X2FyZyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiAgYXRhbjIoX196LmltYWcoKSwgX196LnJlYWwoKSk7IH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgZmxvYXQKKyAgX19jb21wbGV4X2FyZyhfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXJnZihfX3opOyB9CisKKyAgaW5saW5lIGRvdWJsZQorICBfX2NvbXBsZXhfYXJnKF9fY29tcGxleF9fIGRvdWJsZSBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXJnKF9feik7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2FyZyhjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2FyZ2woX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgYXJnKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfYXJnKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBhcmcoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9hcmcoX196KTsgfQorI2VuZGlmCisKKyAgLy8gMjYuMi43LzU6IG5vcm0oX196KSByZXR1cm5zIHRoZSBzcXVhcmVkIG1hZ25pdHVkZSBvZiBfX3ouCisgIC8vICAgICBBcyBkZWZpbmVkLCBub3JtKCkgaXMgLW5vdC0gYSBub3JtIGlzIHRoZSBjb21tb24gbWF0aGVtYXRpY2FsCisgIC8vICAgICBzZW5zIHVzZWQgaW4gbnVtZXJpY3MuICBUaGUgaGVscGVyIGNsYXNzIF9Ob3JtX2hlbHBlcjw+IHRyaWVzIHRvCisgIC8vICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIGJ1aWx0aW4gZmxvYXRpbmcgcG9pbnQgYW5kIHRoZSByZXN0LCBzbyBhcworICAvLyAgICAgdG8gZGVsaXZlciBhbiBhbnN3ZXIgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIHJlYWwgdmFsdWUuCisgIHRlbXBsYXRlPGJvb2w+CisgICAgc3RydWN0IF9Ob3JtX2hlbHBlcgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIGlubGluZSBfVHAgX1NfZG9faXQoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX194ID0gX196LnJlYWwoKTsKKyAgICAgICAgICBjb25zdCBfVHAgX195ID0gX196LmltYWcoKTsKKyAgICAgICAgICByZXR1cm4gX194ICogX194ICsgX195ICogX195OworICAgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9Ob3JtX2hlbHBlcjx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIGlubGluZSBfVHAgX1NfZG9faXQoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19yZXMgPSBzdGQ6OmFicyhfX3opOworICAgICAgICAgIHJldHVybiBfX3JlcyAqIF9fcmVzOworICAgICAgICB9CisgICAgfTsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgbm9ybShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICByZXR1cm4gX05vcm1faGVscGVyPF9faXNfZmxvYXRpbmc8X1RwPjo6X192YWx1ZSAKKwkmJiAhX0dMSUJDWFhfRkFTVF9NQVRIPjo6X1NfZG9faXQoX196KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBwb2xhcihjb25zdCBfVHAmIF9fcmhvLCBjb25zdCBfVHAmIF9fdGhldGEpCisgICAgeyByZXR1cm4gY29tcGxleDxfVHA+KF9fcmhvICogY29zKF9fdGhldGEpLCBfX3JobyAqIHNpbihfX3RoZXRhKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIGNvbmooY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gY29tcGxleDxfVHA+KF9fei5yZWFsKCksIC1fX3ouaW1hZygpKTsgfQorICAKKyAgLy8gVHJhbnNjZW5kZW50YWxzCisKKyAgLy8gMjYuMi44LzEgY29zKF9feik6ICBSZXR1cm5zIHRoZSBjb3NpbmUgb2YgX196LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9jb3MoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9feCA9IF9fei5yZWFsKCk7CisgICAgICBjb25zdCBfVHAgX195ID0gX196LmltYWcoKTsKKyAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oY29zKF9feCkgKiBjb3NoKF9feSksIC1zaW4oX194KSAqIHNpbmgoX195KSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfY29zKF9fY29tcGxleF9fIGZsb2F0IF9feikgeyByZXR1cm4gX19idWlsdGluX2Njb3NmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9jb3MoX19jb21wbGV4X18gZG91YmxlIF9feikgeyByZXR1cm4gX19idWlsdGluX2Njb3MoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfY29zKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jY29zbChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBjb3MoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9jb3MoX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIGNvcyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X2NvcyhfX3opOyB9CisjZW5kaWYKKworICAvLyAyNi4yLjgvMiBjb3NoKF9feik6IFJldHVybnMgdGhlIGh5cGVyYm9saWMgY29zaW5lIG9mIF9fei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfY29zaChjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX194ID0gX196LnJlYWwoKTsKKyAgICAgIGNvbnN0IF9UcCBfX3kgPSBfX3ouaW1hZygpOworICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihjb3NoKF9feCkgKiBjb3MoX195KSwgc2luaChfX3gpICogc2luKF9feSkpOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2Nvc2goX19jb21wbGV4X18gZmxvYXQgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY2Nvc2hmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9jb3NoKF9fY29tcGxleF9fIGRvdWJsZSBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jY29zaChfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9jb3NoKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jY29zaGwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgY29zaChjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X2Nvc2goX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIGNvc2goY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9jb3NoKF9feik7IH0KKyNlbmRpZgorCisgIC8vIDI2LjIuOC8zIGV4cChfX3opOiBSZXR1cm5zIHRoZSBjb21wbGV4IGJhc2UgZSBleHBvbmVudGlhbCBvZiB4CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2V4cChjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBzdGQ6OnBvbGFyKGV4cChfX3oucmVhbCgpKSwgX196LmltYWcoKSk7IH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2V4cChfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jZXhwZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfZXhwKF9fY29tcGxleF9fIGRvdWJsZSBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jZXhwKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2V4cChjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2V4cGwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgZXhwKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfZXhwKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBleHAoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9leHAoX196KTsgfQorI2VuZGlmCisKKyAgLy8gMjYuMi44LzUgbG9nKF9feik6IFJldHVybnMgdGhlIG5hdHVyYWwgY29tcGxleCBsb2dhcml0aG0gb2YgX196LgorICAvLyAgICAgICAgICAgICAgICAgICAgVGhlIGJyYW5jaCBjdXQgaXMgYWxvbmcgdGhlIG5lZ2F0aXZlIGF4aXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2xvZyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBjb21wbGV4PF9UcD4obG9nKHN0ZDo6YWJzKF9feikpLCBzdGQ6OmFyZyhfX3opKTsgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfbG9nKF9fY29tcGxleF9fIGZsb2F0IF9feikgeyByZXR1cm4gX19idWlsdGluX2Nsb2dmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9sb2coX19jb21wbGV4X18gZG91YmxlIF9feikgeyByZXR1cm4gX19idWlsdGluX2Nsb2coX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfbG9nKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jbG9nbChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBsb2coY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9sb2coX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIGxvZyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X2xvZyhfX3opOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIGxvZzEwKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIHN0ZDo6bG9nKF9feikgLyBsb2coX1RwKDEwLjApKTsgfQorCisgIC8vIDI2LjIuOC8xMCBzaW4oX196KTogUmV0dXJucyB0aGUgc2luZSBvZiBfX3ouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X3Npbihjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX194ID0gX196LnJlYWwoKTsKKyAgICAgIGNvbnN0IF9UcCBfX3kgPSBfX3ouaW1hZygpOworICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihzaW4oX194KSAqIGNvc2goX195KSwgY29zKF9feCkgKiBzaW5oKF9feSkpOyAKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9zaW4oX19jb21wbGV4X18gZmxvYXQgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY3NpbmYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X3NpbihfX2NvbXBsZXhfXyBkb3VibGUgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY3NpbihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9zaW4oY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NzaW5sKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIHNpbihjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X3NpbihfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgc2luKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfc2luKF9feik7IH0KKyNlbmRpZgorCisgIC8vIDI2LjIuOC8xMSBzaW5oKF9feik6IFJldHVybnMgdGhlIGh5cGVyYm9saWMgc2luZSBvZiBfX3ouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X3NpbmgoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9feCA9IF9fei5yZWFsKCk7CisgICAgICBjb25zdCBfVHAgIF9feSA9IF9fei5pbWFnKCk7CisgICAgICByZXR1cm4gY29tcGxleDxfVHA+KHNpbmgoX194KSAqIGNvcyhfX3kpLCBjb3NoKF9feCkgKiBzaW4oX195KSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfc2luaChfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jc2luaGYoX196KTsgfSAgICAgIAorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X3NpbmgoX19jb21wbGV4X18gZG91YmxlIF9feikgeyByZXR1cm4gX19idWlsdGluX2NzaW5oKF9feik7IH0gICAgICAKKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X3NpbmgoY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NzaW5obChfX3opOyB9ICAgICAgCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBzaW5oKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfc2luaChfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgc2luaChjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X3NpbmgoX196KTsgfQorI2VuZGlmCisKKyAgLy8gMjYuMi44LzEzIHNxcnQoX196KTogUmV0dXJucyB0aGUgY29tcGxleCBzcXVhcmUgcm9vdCBvZiBfX3ouCisgIC8vICAgICAgICAgICAgICAgICAgICAgVGhlIGJyYW5jaCBjdXQgaXMgb24gdGhlIG5lZ2F0aXZlIGF4aXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfc3FydChjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBfVHAgX194ID0gX196LnJlYWwoKTsKKyAgICAgIF9UcCBfX3kgPSBfX3ouaW1hZygpOworCisgICAgICBpZiAoX194ID09IF9UcCgpKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fdCA9IHNxcnQoYWJzKF9feSkgLyAyKTsKKyAgICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9fdCwgX195IDwgX1RwKCkgPyAtX190IDogX190KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fdCA9IHNxcnQoMiAqIChzdGQ6OmFicyhfX3opICsgYWJzKF9feCkpKTsKKyAgICAgICAgICBfVHAgX191ID0gX190IC8gMjsKKyAgICAgICAgICByZXR1cm4gX194ID4gX1RwKCkKKyAgICAgICAgICAgID8gY29tcGxleDxfVHA+KF9fdSwgX195IC8gX190KQorICAgICAgICAgICAgOiBjb21wbGV4PF9UcD4oYWJzKF9feSkgLyBfX3QsIF9feSA8IF9UcCgpID8gLV9fdSA6IF9fdSk7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9zcXJ0KF9fY29tcGxleF9fIGZsb2F0IF9feikgeyByZXR1cm4gX19idWlsdGluX2NzcXJ0ZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfc3FydChfX2NvbXBsZXhfXyBkb3VibGUgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY3NxcnQoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfc3FydChjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY3NxcnRsKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIHNxcnQoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9zcXJ0KF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBzcXJ0KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfc3FydChfX3opOyB9CisjZW5kaWYKKworICAvLyAyNi4yLjgvMTQgdGFuKF9feik6ICBSZXR1cm4gdGhlIGNvbXBsZXggdGFuZ2VudCBvZiBfX3ouCisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF90YW4oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gc3RkOjpzaW4oX196KSAvIHN0ZDo6Y29zKF9feik7IH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X3RhbihfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jdGFuZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfdGFuKF9fY29tcGxleF9fIGRvdWJsZSBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jdGFuKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X3Rhbihjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY3RhbmwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgdGFuKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfdGFuKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICB0YW4oY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF90YW4oX196KTsgfQorI2VuZGlmCisKKworICAvLyAyNi4yLjgvMTUgdGFuaChfX3opOiAgUmV0dXJucyB0aGUgaHlwZXJib2xpYyB0YW5nZW50IG9mIF9fei4KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X3RhbmgoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gc3RkOjpzaW5oKF9feikgLyBzdGQ6OmNvc2goX196KTsgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfdGFuaChfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jdGFuaGYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X3RhbmgoX19jb21wbGV4X18gZG91YmxlIF9feikgeyByZXR1cm4gX19idWlsdGluX2N0YW5oKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X3RhbmgoY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2N0YW5obChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICB0YW5oKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfdGFuaChfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgdGFuaChjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X3RhbmgoX196KTsgfQorI2VuZGlmCisKKworICAvLyAyNi4yLjgvOSAgcG93KF9feCwgX195KTogUmV0dXJucyB0aGUgY29tcGxleCBwb3dlciBiYXNlIG9mIF9feAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2VkIHRvIHRoZSBfX3ktdGggcG93ZXIuICBUaGUgYnJhbmNoCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBjdXQgaXMgb24gdGhlIG5lZ2F0aXZlIGF4aXMuCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfcG93X3Vuc2lnbmVkKGNvbXBsZXg8X1RwPiBfX3gsIHVuc2lnbmVkIF9fbikKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX195ID0gX19uICUgMiA/IF9feCA6IGNvbXBsZXg8X1RwPigxKTsKKworICAgICAgd2hpbGUgKF9fbiA+Pj0gMSkKKyAgICAgICAgeworICAgICAgICAgIF9feCAqPSBfX3g7CisgICAgICAgICAgaWYgKF9fbiAlIDIpCisgICAgICAgICAgICBfX3kgKj0gX194OworICAgICAgICB9CisKKyAgICAgIHJldHVybiBfX3k7CisgICAgfQorCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gRFIgODQ0LiBjb21wbGV4IHBvdyByZXR1cm4gdHlwZSBpcyBhbWJpZ3VvdXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgcG93KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196LCBpbnQgX19uKQorICAgIHsKKyAgICAgIHJldHVybiBfX24gPCAwCisJPyBjb21wbGV4PF9UcD4oMSkgLyBzdGQ6Ol9fY29tcGxleF9wb3dfdW5zaWduZWQoX196LCAtKHVuc2lnbmVkKV9fbikKKyAgICAgICAgOiBzdGQ6Ol9fY29tcGxleF9wb3dfdW5zaWduZWQoX196LCBfX24pOworICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb21wbGV4PF9UcD4KKyAgICBwb3coY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX195KQorICAgIHsKKyNpZm5kZWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgICAgICBpZiAoX194ID09IF9UcCgpKQorCXJldHVybiBfVHAoKTsKKyNlbmRpZgorICAgICAgaWYgKF9feC5pbWFnKCkgPT0gX1RwKCkgJiYgX194LnJlYWwoKSA+IF9UcCgpKQorICAgICAgICByZXR1cm4gcG93KF9feC5yZWFsKCksIF9feSk7CisKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3QgPSBzdGQ6OmxvZyhfX3gpOworICAgICAgcmV0dXJuIHN0ZDo6cG9sYXIoZXhwKF9feSAqIF9fdC5yZWFsKCkpLCBfX3kgKiBfX3QuaW1hZygpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfcG93KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7IHJldHVybiBfX3ggPT0gX1RwKCkgPyBfVHAoKSA6IHN0ZDo6ZXhwKF9feSAqIHN0ZDo6bG9nKF9feCkpOyB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9wb3coX19jb21wbGV4X18gZmxvYXQgX194LCBfX2NvbXBsZXhfXyBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jcG93ZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9wb3coX19jb21wbGV4X18gZG91YmxlIF9feCwgX19jb21wbGV4X18gZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2Nwb3coX194LCBfX3kpOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9wb3coY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feCwKKwkJY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2Nwb3dsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgcG93KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfcG93KF9feC5fX3JlcCgpLCBfX3kuX19yZXAoKSk7IH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgcG93KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfcG93KF9feCwgX195KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBwb3coY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsKKyAgICAgIHJldHVybiBfX3ggPiBfVHAoKSA/IHN0ZDo6cG9sYXIocG93KF9feCwgX195LnJlYWwoKSksCisJCQkJICAgICAgX195LmltYWcoKSAqIGxvZyhfX3gpKQorCSAgICAgICAgICAgICAgICAgOiBzdGQ6OnBvdyhjb21wbGV4PF9UcD4oX194KSwgX195KTsKKyAgICB9CisKKyAgLy8vIDI2LjIuMyAgY29tcGxleCBzcGVjaWFsaXphdGlvbnMKKyAgLy8vIGNvbXBsZXg8ZmxvYXQ+IHNwZWNpYWxpemF0aW9uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgY29tcGxleDxmbG9hdD4KKyAgICB7CisgICAgICB0eXBlZGVmIGZsb2F0IHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9fY29tcGxleF9fIGZsb2F0IF9Db21wbGV4VDsKKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgoX0NvbXBsZXhUIF9feikgOiBfTV92YWx1ZShfX3opIHsgfQorCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChmbG9hdCBfX3IgPSAwLjBmLCBmbG9hdCBfX2kgPSAwLjBmKQorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIDogX01fdmFsdWV7IF9fciwgX19pIH0geyB9CisjZWxzZQorICAgICAgeworCV9fcmVhbF9fIF9NX3ZhbHVlID0gX19yOworCV9faW1hZ19fIF9NX3ZhbHVlID0gX19pOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGV4cGxpY2l0IF9HTElCQ1hYX0NPTlNURVhQUiBjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworICAgICAgZXhwbGljaXQgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsJCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAzODcuIHN0ZDo6Y29tcGxleCBvdmVyLWVuY2Fwc3VsYXRlZC4KKyAgICAgIF9fYXR0cmlidXRlICgoX19hYmlfdGFnX18gKCJjeHgxMSIpKSkKKyAgICAgIGNvbnN0ZXhwciBmbG9hdCAKKyAgICAgIHJlYWwoKSB7IHJldHVybiBfX3JlYWxfXyBfTV92YWx1ZTsgfQorCisgICAgICBfX2F0dHJpYnV0ZSAoKF9fYWJpX3RhZ19fICgiY3h4MTEiKSkpCisgICAgICBjb25zdGV4cHIgZmxvYXQgCisgICAgICBpbWFnKCkgeyByZXR1cm4gX19pbWFnX18gX01fdmFsdWU7IH0KKyNlbHNlCisgICAgICBmbG9hdCYgCisgICAgICByZWFsKCkgeyByZXR1cm4gX19yZWFsX18gX01fdmFsdWU7IH0KKworICAgICAgY29uc3QgZmxvYXQmIAorICAgICAgcmVhbCgpIGNvbnN0IHsgcmV0dXJuIF9fcmVhbF9fIF9NX3ZhbHVlOyB9ICAgICAgCisKKyAgICAgIGZsb2F0JiAKKyAgICAgIGltYWcoKSB7IHJldHVybiBfX2ltYWdfXyBfTV92YWx1ZTsgfQorCisgICAgICBjb25zdCBmbG9hdCYgCisgICAgICBpbWFnKCkgY29uc3QgeyByZXR1cm4gX19pbWFnX18gX01fdmFsdWU7IH0KKyNlbmRpZgorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAzODcuIHN0ZDo6Y29tcGxleCBvdmVyLWVuY2Fwc3VsYXRlZC4KKyAgICAgIHZvaWQgCisgICAgICByZWFsKGZsb2F0IF9fdmFsKSB7IF9fcmVhbF9fIF9NX3ZhbHVlID0gX192YWw7IH0KKworICAgICAgdm9pZCAKKyAgICAgIGltYWcoZmxvYXQgX192YWwpIHsgX19pbWFnX18gX01fdmFsdWUgPSBfX3ZhbDsgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3I9KGZsb2F0IF9fZikKKyAgICAgIHsKKwlfTV92YWx1ZSA9IF9fZjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvcis9KGZsb2F0IF9fZikKKyAgICAgIHsKKwlfTV92YWx1ZSArPSBfX2Y7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3ItPShmbG9hdCBfX2YpCisgICAgICB7CisJX01fdmFsdWUgLT0gX19mOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yKj0oZmxvYXQgX19mKQorICAgICAgeworCV9NX3ZhbHVlICo9IF9fZjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvci89KGZsb2F0IF9fZikKKyAgICAgIHsKKwlfTV92YWx1ZSAvPSBfX2Y7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBMZXQgdGhlIGNvbXBpbGVyIHN5bnRoZXNpemUgdGhlIGNvcHkgYW5kIGFzc2lnbm1lbnQKKyAgICAgIC8vIG9wZXJhdG9yLiAgSXQgYWx3YXlzIGRvZXMgYSBwcmV0dHkgZ29vZCBqb2IuCisgICAgICAvLyBjb21wbGV4JiBvcGVyYXRvcj0oY29uc3QgY29tcGxleCYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGNvbXBsZXgmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBjb21wbGV4PF9UcD4mICBfX3opCisJeworCSAgX19yZWFsX18gX01fdmFsdWUgPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX01fdmFsdWUgPSBfX3ouaW1hZygpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb21wbGV4JgorICAgICAgICBvcGVyYXRvcis9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9fcmVhbF9fIF9NX3ZhbHVlICs9IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfTV92YWx1ZSArPSBfX3ouaW1hZygpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgICAgICBjb21wbGV4JgorICAgICAgICBvcGVyYXRvci09KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9fcmVhbF9fIF9NX3ZhbHVlIC09IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfTV92YWx1ZSAtPSBfX3ouaW1hZygpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgICAgICBjb21wbGV4JgorICAgICAgICBvcGVyYXRvcio9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9Db21wbGV4VCBfX3Q7CisJICBfX3JlYWxfXyBfX3QgPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX190ID0gX196LmltYWcoKTsKKwkgIF9NX3ZhbHVlICo9IF9fdDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICAgICAgY29tcGxleCYKKyAgICAgICAgb3BlcmF0b3IvPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfQ29tcGxleFQgX190OworCSAgX19yZWFsX18gX190ID0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9fdCA9IF9fei5pbWFnKCk7CisJICBfTV92YWx1ZSAvPSBfX3Q7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIF9Db21wbGV4VCBfX3JlcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3ZhbHVlOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX0NvbXBsZXhUIF9NX3ZhbHVlOworICAgIH07CisKKyAgLy8vIDI2LjIuMyAgY29tcGxleCBzcGVjaWFsaXphdGlvbnMKKyAgLy8vIGNvbXBsZXg8ZG91YmxlPiBzcGVjaWFsaXphdGlvbgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGNvbXBsZXg8ZG91YmxlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgZG91YmxlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9fY29tcGxleF9fIGRvdWJsZSBfQ29tcGxleFQ7CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBjb21wbGV4KF9Db21wbGV4VCBfX3opIDogX01fdmFsdWUoX196KSB7IH0KKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgoZG91YmxlIF9fciA9IDAuMCwgZG91YmxlIF9faSA9IDAuMCkKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICA6IF9NX3ZhbHVleyBfX3IsIF9faSB9IHsgfQorI2Vsc2UKKyAgICAgIHsKKwlfX3JlYWxfXyBfTV92YWx1ZSA9IF9fcjsKKwlfX2ltYWdfXyBfTV92YWx1ZSA9IF9faTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChjb25zdCBjb21wbGV4PGZsb2F0PiYgX196KQorICAgICAgOiBfTV92YWx1ZShfX3ouX19yZXAoKSkgeyB9CisKKyAgICAgIGV4cGxpY2l0IF9HTElCQ1hYX0NPTlNURVhQUiBjb21wbGV4KGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMzg3LiBzdGQ6OmNvbXBsZXggb3Zlci1lbmNhcHN1bGF0ZWQuCisgICAgICBfX2F0dHJpYnV0ZSAoKF9fYWJpX3RhZ19fICgiY3h4MTEiKSkpCisgICAgICBjb25zdGV4cHIgZG91YmxlIAorICAgICAgcmVhbCgpIHsgcmV0dXJuIF9fcmVhbF9fIF9NX3ZhbHVlOyB9CisKKyAgICAgIF9fYXR0cmlidXRlICgoX19hYmlfdGFnX18gKCJjeHgxMSIpKSkKKyAgICAgIGNvbnN0ZXhwciBkb3VibGUgCisgICAgICBpbWFnKCkgeyByZXR1cm4gX19pbWFnX18gX01fdmFsdWU7IH0KKyNlbHNlCisgICAgICBkb3VibGUmIAorICAgICAgcmVhbCgpIHsgcmV0dXJuIF9fcmVhbF9fIF9NX3ZhbHVlOyB9CisKKyAgICAgIGNvbnN0IGRvdWJsZSYgCisgICAgICByZWFsKCkgY29uc3QgeyByZXR1cm4gX19yZWFsX18gX01fdmFsdWU7IH0KKworICAgICAgZG91YmxlJiAKKyAgICAgIGltYWcoKSB7IHJldHVybiBfX2ltYWdfXyBfTV92YWx1ZTsgfQorCisgICAgICBjb25zdCBkb3VibGUmIAorICAgICAgaW1hZygpIGNvbnN0IHsgcmV0dXJuIF9faW1hZ19fIF9NX3ZhbHVlOyB9CisjZW5kaWYKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMzg3LiBzdGQ6OmNvbXBsZXggb3Zlci1lbmNhcHN1bGF0ZWQuCisgICAgICB2b2lkIAorICAgICAgcmVhbChkb3VibGUgX192YWwpIHsgX19yZWFsX18gX01fdmFsdWUgPSBfX3ZhbDsgfQorCisgICAgICB2b2lkIAorICAgICAgaW1hZyhkb3VibGUgX192YWwpIHsgX19pbWFnX18gX01fdmFsdWUgPSBfX3ZhbDsgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3I9KGRvdWJsZSBfX2QpCisgICAgICB7CisJX01fdmFsdWUgPSBfX2Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3IrPShkb3VibGUgX19kKQorICAgICAgeworCV9NX3ZhbHVlICs9IF9fZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisJCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3ItPShkb3VibGUgX19kKQorICAgICAgeworCV9NX3ZhbHVlIC09IF9fZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvcio9KGRvdWJsZSBfX2QpCisgICAgICB7CisJX01fdmFsdWUgKj0gX19kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yLz0oZG91YmxlIF9fZCkKKyAgICAgIHsKKwlfTV92YWx1ZSAvPSBfX2Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBUaGUgY29tcGlsZXIgd2lsbCBzeW50aGVzaXplIHRoaXMsIGVmZmljaWVudGx5LgorICAgICAgLy8gY29tcGxleCYgb3BlcmF0b3I9KGNvbnN0IGNvbXBsZXgmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb21wbGV4JgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisJeworCSAgX19yZWFsX18gX01fdmFsdWUgPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX01fdmFsdWUgPSBfX3ouaW1hZygpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb21wbGV4JgorICAgICAgICBvcGVyYXRvcis9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9fcmVhbF9fIF9NX3ZhbHVlICs9IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfTV92YWx1ZSArPSBfX3ouaW1hZygpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb21wbGV4JgorICAgICAgICBvcGVyYXRvci09KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9fcmVhbF9fIF9NX3ZhbHVlIC09IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfTV92YWx1ZSAtPSBfX3ouaW1hZygpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb21wbGV4JgorICAgICAgICBvcGVyYXRvcio9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9Db21wbGV4VCBfX3Q7CisJICBfX3JlYWxfXyBfX3QgPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX190ID0gX196LmltYWcoKTsKKwkgIF9NX3ZhbHVlICo9IF9fdDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29tcGxleCYKKyAgICAgICAgb3BlcmF0b3IvPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfQ29tcGxleFQgX190OworCSAgX19yZWFsX18gX190ID0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9fdCA9IF9fei5pbWFnKCk7CisJICBfTV92YWx1ZSAvPSBfX3Q7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIF9Db21wbGV4VCBfX3JlcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3ZhbHVlOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX0NvbXBsZXhUIF9NX3ZhbHVlOworICAgIH07CisKKyAgLy8vIDI2LjIuMyAgY29tcGxleCBzcGVjaWFsaXphdGlvbnMKKyAgLy8vIGNvbXBsZXg8bG9uZyBkb3VibGU+IHNwZWNpYWxpemF0aW9uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgY29tcGxleDxsb25nIGRvdWJsZT4KKyAgICB7CisgICAgICB0eXBlZGVmIGxvbmcgZG91YmxlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9fY29tcGxleF9fIGxvbmcgZG91YmxlIF9Db21wbGV4VDsKKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgoX0NvbXBsZXhUIF9feikgOiBfTV92YWx1ZShfX3opIHsgfQorCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChsb25nIGRvdWJsZSBfX3IgPSAwLjBMLCAKKwkJCQkgbG9uZyBkb3VibGUgX19pID0gMC4wTCkKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICA6IF9NX3ZhbHVleyBfX3IsIF9faSB9IHsgfQorI2Vsc2UKKyAgICAgIHsKKwlfX3JlYWxfXyBfTV92YWx1ZSA9IF9fcjsKKwlfX2ltYWdfXyBfTV92YWx1ZSA9IF9faTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChjb25zdCBjb21wbGV4PGZsb2F0PiYgX196KQorICAgICAgOiBfTV92YWx1ZShfX3ouX19yZXAoKSkgeyB9CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgX196KQorICAgICAgOiBfTV92YWx1ZShfX3ouX19yZXAoKSkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAzODcuIHN0ZDo6Y29tcGxleCBvdmVyLWVuY2Fwc3VsYXRlZC4KKyAgICAgIF9fYXR0cmlidXRlICgoX19hYmlfdGFnX18gKCJjeHgxMSIpKSkKKyAgICAgIGNvbnN0ZXhwciBsb25nIGRvdWJsZSAKKyAgICAgIHJlYWwoKSB7IHJldHVybiBfX3JlYWxfXyBfTV92YWx1ZTsgfQorCisgICAgICBfX2F0dHJpYnV0ZSAoKF9fYWJpX3RhZ19fICgiY3h4MTEiKSkpCisgICAgICBjb25zdGV4cHIgbG9uZyBkb3VibGUgCisgICAgICBpbWFnKCkgeyByZXR1cm4gX19pbWFnX18gX01fdmFsdWU7IH0KKyNlbHNlCisgICAgICBsb25nIGRvdWJsZSYgCisgICAgICByZWFsKCkgeyByZXR1cm4gX19yZWFsX18gX01fdmFsdWU7IH0KKworICAgICAgY29uc3QgbG9uZyBkb3VibGUmIAorICAgICAgcmVhbCgpIGNvbnN0IHsgcmV0dXJuIF9fcmVhbF9fIF9NX3ZhbHVlOyB9CisKKyAgICAgIGxvbmcgZG91YmxlJiAKKyAgICAgIGltYWcoKSB7IHJldHVybiBfX2ltYWdfXyBfTV92YWx1ZTsgfQorCisgICAgICBjb25zdCBsb25nIGRvdWJsZSYgCisgICAgICBpbWFnKCkgY29uc3QgeyByZXR1cm4gX19pbWFnX18gX01fdmFsdWU7IH0KKyNlbmRpZgorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAzODcuIHN0ZDo6Y29tcGxleCBvdmVyLWVuY2Fwc3VsYXRlZC4KKyAgICAgIHZvaWQgCisgICAgICByZWFsKGxvbmcgZG91YmxlIF9fdmFsKSB7IF9fcmVhbF9fIF9NX3ZhbHVlID0gX192YWw7IH0KKworICAgICAgdm9pZCAKKyAgICAgIGltYWcobG9uZyBkb3VibGUgX192YWwpIHsgX19pbWFnX18gX01fdmFsdWUgPSBfX3ZhbDsgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3I9KGxvbmcgZG91YmxlIF9fcikKKyAgICAgIHsKKwlfTV92YWx1ZSA9IF9fcjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvcis9KGxvbmcgZG91YmxlIF9fcikKKyAgICAgIHsKKwlfTV92YWx1ZSArPSBfX3I7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3ItPShsb25nIGRvdWJsZSBfX3IpCisgICAgICB7CisJX01fdmFsdWUgLT0gX19yOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yKj0obG9uZyBkb3VibGUgX19yKQorICAgICAgeworCV9NX3ZhbHVlICo9IF9fcjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvci89KGxvbmcgZG91YmxlIF9fcikKKyAgICAgIHsKKwlfTV92YWx1ZSAvPSBfX3I7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBUaGUgY29tcGlsZXIga25vd3MgaG93IHRvIGRvIHRoaXMgZWZmaWNpZW50bHkKKyAgICAgIC8vIGNvbXBsZXgmIG9wZXJhdG9yPShjb25zdCBjb21wbGV4Jik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29tcGxleCYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9fcmVhbF9fIF9NX3ZhbHVlID0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9NX3ZhbHVlID0gX196LmltYWcoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29tcGxleCYKKwlvcGVyYXRvcis9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9fcmVhbF9fIF9NX3ZhbHVlICs9IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfTV92YWx1ZSArPSBfX3ouaW1hZygpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb21wbGV4JgorCW9wZXJhdG9yLT0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisJeworCSAgX19yZWFsX18gX01fdmFsdWUgLT0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9NX3ZhbHVlIC09IF9fei5pbWFnKCk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGNvbXBsZXgmCisJb3BlcmF0b3IqPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfQ29tcGxleFQgX190OworCSAgX19yZWFsX18gX190ID0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9fdCA9IF9fei5pbWFnKCk7CisJICBfTV92YWx1ZSAqPSBfX3Q7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGNvbXBsZXgmCisJb3BlcmF0b3IvPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfQ29tcGxleFQgX190OworCSAgX19yZWFsX18gX190ID0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9fdCA9IF9fei5pbWFnKCk7CisJICBfTV92YWx1ZSAvPSBfX3Q7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIF9Db21wbGV4VCBfX3JlcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3ZhbHVlOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX0NvbXBsZXhUIF9NX3ZhbHVlOworICAgIH07CisKKyAgLy8gVGhlc2UgYml0cyBoYXZlIHRvIGJlIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLCBzbyB0aGF0IHRoZQorICAvLyBzcGVjaWFsaXphdGlvbnMgaGF2ZSBhbGwgYmVlbiBkZWZpbmVkLgorICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgIGNvbXBsZXg8ZmxvYXQ+Ojpjb21wbGV4KGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYgX196KQorICA6IF9NX3ZhbHVlKF9fei5fX3JlcCgpKSB7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgIGNvbXBsZXg8ZmxvYXQ+Ojpjb21wbGV4KGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiBfX3opCisgIDogX01fdmFsdWUoX196Ll9fcmVwKCkpIHsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgY29tcGxleDxkb3VibGU+Ojpjb21wbGV4KGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+JiBfX3opCisgIDogX01fdmFsdWUoX196Ll9fcmVwKCkpIHsgfQorCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLgorICAvLyBOQjogIFRoaXMgc3ludGF4IGlzIGEgR05VIGV4dGVuc2lvbi4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYsIGNvbXBsZXg8ZmxvYXQ+Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBjb25zdCBjb21wbGV4PGZsb2F0PiYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgY29tcGxleDxkb3VibGU+Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYsIGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiBvcGVyYXRvcj4+KHdpc3RyZWFtJiwgY29tcGxleDxmbG9hdD4mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBvcGVyYXRvcjw8KHdvc3RyZWFtJiwgY29uc3QgY29tcGxleDxmbG9hdD4mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiBvcGVyYXRvcj4+KHdpc3RyZWFtJiwgY29tcGxleDxkb3VibGU+Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgb3BlcmF0b3I8PCh3b3N0cmVhbSYsIGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIG9wZXJhdG9yPj4od2lzdHJlYW0mLCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIG9wZXJhdG9yPDwod29zdHJlYW0mLCBjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworI2VuZGlmCisjZW5kaWYKKworICAvLyBAfSBncm91cCBjb21wbGV4X251bWJlcnMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gU2VlIGV4dC90eXBlX3RyYWl0cy5oIGZvciB0aGUgcHJpbWFyeSB0ZW1wbGF0ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgc3RydWN0IF9fcHJvbW90ZV8yPHN0ZDo6Y29tcGxleDxfVHA+LCBfVXA+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc3RkOjpjb21wbGV4PHR5cGVuYW1lIF9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlPiBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlXzI8X1RwLCBzdGQ6OmNvbXBsZXg8X1VwPiA+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc3RkOjpjb21wbGV4PHR5cGVuYW1lIF9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlPiBfX3R5cGU7CisgICAgfTsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3Byb21vdGVfMjxzdGQ6OmNvbXBsZXg8X1RwPiwgc3RkOjpjb21wbGV4PF9VcD4gPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHN0ZDo6Y29tcGxleDx0eXBlbmFtZSBfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4gX190eXBlOworICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGFjb3MoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBhc2luKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gc3RkOjpjb21wbGV4PF9UcD4gYXRhbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gc3RkOjpjb21wbGV4PF9UcD4gYWNvc2goY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBhc2luaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGF0YW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisgIC8vIERSIDU5NS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBfVHAgICAgICAgICAgICAgICBmYWJzKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hY29zKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4gX190ID0gc3RkOjphc2luKF9feik7CisgICAgICBjb25zdCBfVHAgX19waV8yID0gMS41NzA3OTYzMjY3OTQ4OTY2MTkyMzEzMjE2OTE2Mzk3NTE0TDsKKyAgICAgIHJldHVybiBzdGQ6OmNvbXBsZXg8X1RwPihfX3BpXzIgLSBfX3QucmVhbCgpLCAtX190LmltYWcoKSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMQorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2Fjb3MoX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3NmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9hY29zKF9fY29tcGxleF9fIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWNvcyhfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hY29zKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWNvc2woX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhY29zKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2Fjb3MoX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICAvLy8gYWNvcyhfX3opIFs4LjEuMl0uCisgIC8vICBFZmZlY3RzOiAgQmVoYXZlcyB0aGUgc2FtZSBhcyBDOTkgZnVuY3Rpb24gY2Fjb3MsIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjUuMS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFjb3MoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYWNvcyhfX3opOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2FzaW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBzdGQ6OmNvbXBsZXg8X1RwPiBfX3QoLV9fei5pbWFnKCksIF9fei5yZWFsKCkpOworICAgICAgX190ID0gc3RkOjphc2luaChfX3QpOworICAgICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxfVHA+KF9fdC5pbWFnKCksIC1fX3QucmVhbCgpKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYXNpbihfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXNpbmYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2FzaW4oX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2luKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2FzaW4oY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2lubChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFzaW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXNpbihfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhc2luKF9feikgWzguMS4zXS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYXNpbiwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNS4yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXNpbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hc2luKF9feik7IH0KKyNlbmRpZgorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2F0YW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19yMiA9IF9fei5yZWFsKCkgKiBfX3oucmVhbCgpOworICAgICAgY29uc3QgX1RwIF9feCA9IF9UcCgxLjApIC0gX19yMiAtIF9fei5pbWFnKCkgKiBfX3ouaW1hZygpOworCisgICAgICBfVHAgX19udW0gPSBfX3ouaW1hZygpICsgX1RwKDEuMCk7CisgICAgICBfVHAgX19kZW4gPSBfX3ouaW1hZygpIC0gX1RwKDEuMCk7CisKKyAgICAgIF9fbnVtID0gX19yMiArIF9fbnVtICogX19udW07CisgICAgICBfX2RlbiA9IF9fcjIgKyBfX2RlbiAqIF9fZGVuOworCisgICAgICByZXR1cm4gc3RkOjpjb21wbGV4PF9UcD4oX1RwKDAuNSkgKiBhdGFuMihfVHAoMi4wKSAqIF9fei5yZWFsKCksIF9feCksCisJCQkgICAgICAgX1RwKDAuMjUpICogbG9nKF9fbnVtIC8gX19kZW4pKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYXRhbihfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXRhbmYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2F0YW4oX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhdGFuKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2F0YW4oY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhdGFubChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGF0YW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXRhbihfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhdGFuKF9feikgWzguMS40XS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYXRhbiwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNS4zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXRhbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hdGFuKF9feik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hY29zaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIC8vIEthaGFuJ3MgZm9ybXVsYS4KKyAgICAgIHJldHVybiBfVHAoMi4wKSAqIHN0ZDo6bG9nKHN0ZDo6c3FydChfVHAoMC41KSAqIChfX3ogKyBfVHAoMS4wKSkpCisJCQkJICsgc3RkOjpzcXJ0KF9UcCgwLjUpICogKF9feiAtIF9UcCgxLjApKSkpOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWF9UUjEKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9hY29zaChfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWNvc2hmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9hY29zaChfX2NvbXBsZXhfXyBkb3VibGUgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3NoKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2Fjb3NoKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWNvc2hsKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYWNvc2goY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYWNvc2goX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICAvLy8gYWNvc2goX196KSBbOC4xLjVdLgorICAvLyAgRWZmZWN0czogIEJlaGF2ZXMgdGhlIHNhbWUgYXMgQzk5IGZ1bmN0aW9uIGNhY29zaCwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNi4xLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYWNvc2goY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYWNvc2goX196KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2FzaW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgc3RkOjpjb21wbGV4PF9UcD4gX190KChfX3oucmVhbCgpIC0gX196LmltYWcoKSkKKwkJCSAgICAqIChfX3oucmVhbCgpICsgX196LmltYWcoKSkgKyBfVHAoMS4wKSwKKwkJCSAgICBfVHAoMi4wKSAqIF9fei5yZWFsKCkgKiBfX3ouaW1hZygpKTsKKyAgICAgIF9fdCA9IHN0ZDo6c3FydChfX3QpOworCisgICAgICByZXR1cm4gc3RkOjpsb2coX190ICsgX196KTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYXNpbmgoX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2FzaW5oZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfYXNpbmgoX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2luaChfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hc2luaChjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2FzaW5obChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFzaW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2FzaW5oKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgLy8vIGFzaW5oKF9feikgWzguMS42XS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYXNpbiwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNi4yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXNpbmgoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXNpbmgoX196KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2F0YW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9faTIgPSBfX3ouaW1hZygpICogX196LmltYWcoKTsKKyAgICAgIGNvbnN0IF9UcCBfX3ggPSBfVHAoMS4wKSAtIF9faTIgLSBfX3oucmVhbCgpICogX196LnJlYWwoKTsKKworICAgICAgX1RwIF9fbnVtID0gX1RwKDEuMCkgKyBfX3oucmVhbCgpOworICAgICAgX1RwIF9fZGVuID0gX1RwKDEuMCkgLSBfX3oucmVhbCgpOworCisgICAgICBfX251bSA9IF9faTIgKyBfX251bSAqIF9fbnVtOworICAgICAgX19kZW4gPSBfX2kyICsgX19kZW4gKiBfX2RlbjsKKworICAgICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxfVHA+KF9UcCgwLjI1KSAqIChsb2coX19udW0pIC0gbG9nKF9fZGVuKSksCisJCQkgICAgICAgX1RwKDAuNSkgKiBhdGFuMihfVHAoMi4wKSAqIF9fei5pbWFnKCksIF9feCkpOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWF9UUjEKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9hdGFuaChfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXRhbmhmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9hdGFuaChfX2NvbXBsZXhfXyBkb3VibGUgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2F0YW5oKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2F0YW5oKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXRhbmhsKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXRhbmgoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXRhbmgoX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICAvLy8gYXRhbmgoX196KSBbOC4xLjddLgorICAvLyAgRWZmZWN0czogIEJlaGF2ZXMgdGhlIHNhbWUgYXMgQzk5IGZ1bmN0aW9uIGNhdGFuaCwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNi4zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXRhbmgoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXRhbmgoX196KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICAvLy8gZmFicyhfX3opIFs4LjEuOF0uCisgICAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYWJzLCBkZWZpbmVkCisgICAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjguMS4KKyAgICBmYWJzKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gc3RkOjphYnMoX196KTsgfQorCisgIC8vLyBBZGRpdGlvbmFsIG92ZXJsb2FkcyBbOC4xLjldLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGFyZyhfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyNpZiAoX0dMSUJDWFhfVVNFX0M5OV9NQVRIICYmICFfR0xJQkNYWF9VU0VfQzk5X0ZQX01BQ1JPU19EWU5BTUlDKQorICAgICAgcmV0dXJuIHN0ZDo6c2lnbmJpdChfX3gpID8gX190eXBlKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyOUwpCisJICAgICAgICAgICAgICAgICAgICAgICA6IF9fdHlwZSgpOworI2Vsc2UKKyAgICAgIHJldHVybiBzdGQ6OmFyZyhzdGQ6OmNvbXBsZXg8X190eXBlPihfX3gpKTsKKyNlbmRpZgorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGltYWcoX1RwKQorICAgIHsgcmV0dXJuIF9UcCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBub3JtKF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fdHlwZShfX3gpICogX190eXBlKF9feCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgcmVhbChfVHAgX194KQorICAgIHsgcmV0dXJuIF9feDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb3coY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1VwJiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvdyhzdGQ6OmNvbXBsZXg8X190eXBlPihfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb3coY29uc3QgX1RwJiBfX3gsIGNvbnN0IHN0ZDo6Y29tcGxleDxfVXA+JiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvdyhfX3R5cGUoX194KSwgc3RkOjpjb21wbGV4PF9fdHlwZT4oX195KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb3coY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feCwgY29uc3Qgc3RkOjpjb21wbGV4PF9VcD4mIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIHN0ZDo6cG93KHN0ZDo6Y29tcGxleDxfX3R5cGU+KF9feCksCisJCSAgICAgIHN0ZDo6Y29tcGxleDxfX3R5cGU+KF9feSkpOworICAgIH0KKworICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KKyAgLy8gRFIgNzgxLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IHByb2ooY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfcHJvaihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2RlbiA9IChfX3oucmVhbCgpICogX196LnJlYWwoKQorCQkJICsgX196LmltYWcoKSAqIF9fei5pbWFnKCkgKyBfVHAoMS4wKSk7CisKKyAgICAgIHJldHVybiBzdGQ6OmNvbXBsZXg8X1RwPigoX1RwKDIuMCkgKiBfX3oucmVhbCgpKSAvIF9fZGVuLAorCQkJICAgICAgIChfVHAoMi4wKSAqIF9fei5pbWFnKCkpIC8gX19kZW4pOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X3Byb2ooX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY3Byb2pmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9wcm9qKF9fY29tcGxleF9fIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jcHJvaihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9wcm9qKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jcHJvamwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBwcm9qKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X3Byb2ooX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgcHJvaihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9wcm9qKF9feik7IH0KKyNlbmRpZgorCisgIC8vIERSIDExMzcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgcHJvaihfVHAgX194KQorICAgIHsgcmV0dXJuIF9feDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgY29uaihfVHAgX194KQorICAgIHsgcmV0dXJuIF9feDsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAgLy8gQysrMTEKKworI2VuZGlmICAvKiBfR0xJQkNYWF9DT01QTEVYICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NvbXBsZXguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY29tcGxleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMGU4MmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NvbXBsZXguaApAQCAtMCwwICsxLDQ2IEBACisvLyAtKi0gQysrIC0qLSBjb21wYXRpYmlsaXR5IGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGNvbXBsZXguaAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjIGluY2x1ZGUgPGNjb21wbGV4PgorI2VuZGlmCisKKyNpZiBfR0xJQkNYWF9IQVZFX0NPTVBMRVhfSAorIyBpbmNsdWRlX25leHQgPGNvbXBsZXguaD4KKyMgaWZkZWYgX0dMSUJDWFhfQ09NUExFWAorLy8gU2VlIFBSNTYxMTEsIGtlZXAgdGhlIG1hY3JvIGluIEMrKzAzIGlmIHBvc3NpYmxlLgorIyAgdW5kZWYgY29tcGxleAorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfQ09NUExFWF9ICisjZGVmaW5lIF9HTElCQ1hYX0NPTVBMRVhfSCAxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jb25kaXRpb25fdmFyaWFibGUgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NvbmRpdGlvbl92YXJpYWJsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg0NjU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jb25kaXRpb25fdmFyaWFibGUKQEAgLTAsMCArMSwyODYgQEAKKy8vIDxjb25kaXRpb25fdmFyaWFibGU+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2NvbmRpdGlvbl92YXJpYWJsZQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9DT05ESVRJT05fVkFSSUFCTEUKKyNkZWZpbmUgX0dMSUJDWFhfQ09ORElUSU9OX1ZBUklBQkxFIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxtdXRleD4gLy8gdW5pcXVlX2xvY2sKKworI2lmIGRlZmluZWQoX0dMSUJDWFhfSEFTX0dUSFJFQURTKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMSkKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgY29uZGl0aW9uX3ZhcmlhYmxlcyBDb25kaXRpb24gVmFyaWFibGVzCisgICAqIEBpbmdyb3VwIGNvbmN1cnJlbmN5CisgICAqCisgICAqIENsYXNzZXMgZm9yIGNvbmRpdGlvbl92YXJpYWJsZSBzdXBwb3J0LgorICAgKiBAeworICAgKi8KKworICAvLy8gY3Zfc3RhdHVzCisgIGVudW0gY2xhc3MgY3Zfc3RhdHVzIHsgbm9fdGltZW91dCwgdGltZW91dCB9OworICAKKyAgLy8vIGNvbmRpdGlvbl92YXJpYWJsZQorICBjbGFzcyBjb25kaXRpb25fdmFyaWFibGUKKyAgeworICAgIHR5cGVkZWYgY2hyb25vOjpzeXN0ZW1fY2xvY2sJX19jbG9ja190OworICAgIHR5cGVkZWYgX19ndGhyZWFkX2NvbmRfdAkJX19uYXRpdmVfdHlwZTsKKworI2lmZGVmIF9fR1RIUkVBRF9DT05EX0lOSVQKKyAgICBfX25hdGl2ZV90eXBlCQkJX01fY29uZCA9IF9fR1RIUkVBRF9DT05EX0lOSVQ7CisjZWxzZQorICAgIF9fbmF0aXZlX3R5cGUJCQlfTV9jb25kOworI2VuZGlmCisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX19uYXRpdmVfdHlwZSogCQluYXRpdmVfaGFuZGxlX3R5cGU7CisKKyAgICBjb25kaXRpb25fdmFyaWFibGUoKSBub2V4Y2VwdDsKKyAgICB+Y29uZGl0aW9uX3ZhcmlhYmxlKCkgbm9leGNlcHQ7CisKKyAgICBjb25kaXRpb25fdmFyaWFibGUoY29uc3QgY29uZGl0aW9uX3ZhcmlhYmxlJikgPSBkZWxldGU7CisgICAgY29uZGl0aW9uX3ZhcmlhYmxlJiBvcGVyYXRvcj0oY29uc3QgY29uZGl0aW9uX3ZhcmlhYmxlJikgPSBkZWxldGU7CisKKyAgICB2b2lkCisgICAgbm90aWZ5X29uZSgpIG5vZXhjZXB0OworCisgICAgdm9pZAorICAgIG5vdGlmeV9hbGwoKSBub2V4Y2VwdDsKKworICAgIHZvaWQKKyAgICB3YWl0KHVuaXF1ZV9sb2NrPG11dGV4PiYgX19sb2NrKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICB2b2lkCisgICAgICB3YWl0KHVuaXF1ZV9sb2NrPG11dGV4PiYgX19sb2NrLCBfUHJlZGljYXRlIF9fcCkKKyAgICAgIHsKKwl3aGlsZSAoIV9fcCgpKQorCSAgd2FpdChfX2xvY2spOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0R1cmF0aW9uPgorICAgICAgY3Zfc3RhdHVzCisgICAgICB3YWl0X3VudGlsKHVuaXF1ZV9sb2NrPG11dGV4PiYgX19sb2NrLAorCQkgY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9fY2xvY2tfdCwgX0R1cmF0aW9uPiYgX19hdGltZSkKKyAgICAgIHsgcmV0dXJuIF9fd2FpdF91bnRpbF9pbXBsKF9fbG9jaywgX19hdGltZSk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cmF0aW9uPgorICAgICAgY3Zfc3RhdHVzCisgICAgICB3YWl0X3VudGlsKHVuaXF1ZV9sb2NrPG11dGV4PiYgX19sb2NrLAorCQkgY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hdGltZSkKKyAgICAgIHsKKwkvLyBEUiA4ODcgLSBTeW5jIHVua25vd24gY2xvY2sgdG8ga25vd24gY2xvY2suCisJY29uc3QgdHlwZW5hbWUgX0Nsb2NrOjp0aW1lX3BvaW50IF9fY19lbnRyeSA9IF9DbG9jazo6bm93KCk7CisJY29uc3QgX19jbG9ja190Ojp0aW1lX3BvaW50IF9fc19lbnRyeSA9IF9fY2xvY2tfdDo6bm93KCk7CisJY29uc3QgYXV0byBfX2RlbHRhID0gX19hdGltZSAtIF9fY19lbnRyeTsKKwljb25zdCBhdXRvIF9fc19hdGltZSA9IF9fc19lbnRyeSArIF9fZGVsdGE7CisKKwlyZXR1cm4gX193YWl0X3VudGlsX2ltcGwoX19sb2NrLCBfX3NfYXRpbWUpOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyYXRpb24sIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICBib29sCisgICAgICB3YWl0X3VudGlsKHVuaXF1ZV9sb2NrPG11dGV4PiYgX19sb2NrLAorCQkgY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hdGltZSwKKwkJIF9QcmVkaWNhdGUgX19wKQorICAgICAgeworCXdoaWxlICghX19wKCkpCisJICBpZiAod2FpdF91bnRpbChfX2xvY2ssIF9fYXRpbWUpID09IGN2X3N0YXR1czo6dGltZW91dCkKKwkgICAgcmV0dXJuIF9fcCgpOworCXJldHVybiB0cnVlOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZD4KKyAgICAgIGN2X3N0YXR1cworICAgICAgd2FpdF9mb3IodW5pcXVlX2xvY2s8bXV0ZXg+JiBfX2xvY2ssCisJICAgICAgIGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUpCisgICAgICB7IHJldHVybiB3YWl0X3VudGlsKF9fbG9jaywgX19jbG9ja190Ojpub3coKSArIF9fcnRpbWUpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgYm9vbAorICAgICAgd2FpdF9mb3IodW5pcXVlX2xvY2s8bXV0ZXg+JiBfX2xvY2ssCisJICAgICAgIGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUsCisJICAgICAgIF9QcmVkaWNhdGUgX19wKQorICAgICAgeyByZXR1cm4gd2FpdF91bnRpbChfX2xvY2ssIF9fY2xvY2tfdDo6bm93KCkgKyBfX3J0aW1lLCBzdGQ6Om1vdmUoX19wKSk7IH0KKworICAgIG5hdGl2ZV9oYW5kbGVfdHlwZQorICAgIG5hdGl2ZV9oYW5kbGUoKQorICAgIHsgcmV0dXJuICZfTV9jb25kOyB9CisKKyAgcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRHVyPgorICAgICAgY3Zfc3RhdHVzCisgICAgICBfX3dhaXRfdW50aWxfaW1wbCh1bmlxdWVfbG9jazxtdXRleD4mIF9fbG9jaywKKwkJCWNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfX2Nsb2NrX3QsIF9EdXI+JiBfX2F0aW1lKQorICAgICAgeworCWF1dG8gX19zID0gY2hyb25vOjp0aW1lX3BvaW50X2Nhc3Q8Y2hyb25vOjpzZWNvbmRzPihfX2F0aW1lKTsKKwlhdXRvIF9fbnMgPSBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjpuYW5vc2Vjb25kcz4oX19hdGltZSAtIF9fcyk7CisKKwlfX2d0aHJlYWRfdGltZV90IF9fdHMgPQorCSAgeworCSAgICBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVfdD4oX19zLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKSwKKwkgICAgc3RhdGljX2Nhc3Q8bG9uZz4oX19ucy5jb3VudCgpKQorCSAgfTsKKworCV9fZ3RocmVhZF9jb25kX3RpbWVkd2FpdCgmX01fY29uZCwgX19sb2NrLm11dGV4KCktPm5hdGl2ZV9oYW5kbGUoKSwKKwkJCQkgJl9fdHMpOworCisJcmV0dXJuIChfX2Nsb2NrX3Q6Om5vdygpIDwgX19hdGltZQorCQk/IGN2X3N0YXR1czo6bm9fdGltZW91dCA6IGN2X3N0YXR1czo6dGltZW91dCk7CisgICAgICB9CisgIH07CisKKyAgLy8vIGNvbmRpdGlvbl92YXJpYWJsZV9hbnkKKyAgLy8gTGlrZSBhYm92ZSwgYnV0IG11dGV4IGlzIG5vdCByZXF1aXJlZCB0byBoYXZlIHRyeV9sb2NrLgorICBjbGFzcyBjb25kaXRpb25fdmFyaWFibGVfYW55CisgIHsKKyAgICB0eXBlZGVmIGNocm9ubzo6c3lzdGVtX2Nsb2NrCV9fY2xvY2tfdDsKKyAgICBjb25kaXRpb25fdmFyaWFibGUJCQlfTV9jb25kOworICAgIG11dGV4CQkJCV9NX211dGV4OworCisgICAgLy8gc2NvcGVkIHVubG9jayAtIHVubG9ja3MgaW4gY3RvciwgcmUtbG9ja3MgaW4gZHRvcgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Mb2NrPgorICAgICAgc3RydWN0IF9VbmxvY2sKKyAgICAgIHsKKwlleHBsaWNpdCBfVW5sb2NrKF9Mb2NrJiBfX2xrKSA6IF9NX2xvY2soX19saykgeyBfX2xrLnVubG9jaygpOyB9CisKKwl+X1VubG9jaygpIG5vZXhjZXB0KGZhbHNlKQorCXsKKwkgIGlmICh1bmNhdWdodF9leGNlcHRpb24oKSkKKwkgICAgX190cnkgeyBfTV9sb2NrLmxvY2soKTsgfSBfX2NhdGNoKC4uLikgeyB9CisJICBlbHNlCisJICAgIF9NX2xvY2subG9jaygpOworCX0KKworCV9VbmxvY2soY29uc3QgX1VubG9jayYpID0gZGVsZXRlOworCV9VbmxvY2smIG9wZXJhdG9yPShjb25zdCBfVW5sb2NrJikgPSBkZWxldGU7CisKKwlfTG9jayYgX01fbG9jazsKKyAgICAgIH07CisKKyAgcHVibGljOgorCisgICAgY29uZGl0aW9uX3ZhcmlhYmxlX2FueSgpIG5vZXhjZXB0OworICAgIH5jb25kaXRpb25fdmFyaWFibGVfYW55KCkgbm9leGNlcHQ7CisKKyAgICBjb25kaXRpb25fdmFyaWFibGVfYW55KGNvbnN0IGNvbmRpdGlvbl92YXJpYWJsZV9hbnkmKSA9IGRlbGV0ZTsKKyAgICBjb25kaXRpb25fdmFyaWFibGVfYW55JiBvcGVyYXRvcj0oY29uc3QgY29uZGl0aW9uX3ZhcmlhYmxlX2FueSYpID0gZGVsZXRlOworCisgICAgdm9pZAorICAgIG5vdGlmeV9vbmUoKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IF9fbG9jayhfTV9tdXRleCk7CisgICAgICBfTV9jb25kLm5vdGlmeV9vbmUoKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgbm90aWZ5X2FsbCgpIG5vZXhjZXB0CisgICAgeworICAgICAgbG9ja19ndWFyZDxtdXRleD4gX19sb2NrKF9NX211dGV4KTsKKyAgICAgIF9NX2NvbmQubm90aWZ5X2FsbCgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Mb2NrPgorICAgICAgdm9pZAorICAgICAgd2FpdChfTG9jayYgX19sb2NrKQorICAgICAgeworCXVuaXF1ZV9sb2NrPG11dGV4PiBfX215X2xvY2soX01fbXV0ZXgpOworCV9VbmxvY2s8X0xvY2s+IF9fdW5sb2NrKF9fbG9jayk7CisJLy8gX01fbXV0ZXggbXVzdCBiZSB1bmxvY2tlZCBiZWZvcmUgcmUtbG9ja2luZyBfX2xvY2sgc28gbW92ZQorCS8vIG93bmVyc2hpcCBvZiBfTV9tdXRleCBsb2NrIHRvIGFuIG9iamVjdCB3aXRoIHNob3J0ZXIgbGlmZXRpbWUuCisJdW5pcXVlX2xvY2s8bXV0ZXg+IF9fbXlfbG9jazIoc3RkOjptb3ZlKF9fbXlfbG9jaykpOworCV9NX2NvbmQud2FpdChfX215X2xvY2syKTsKKyAgICAgIH0KKyAgICAgIAorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0xvY2ssIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICB2b2lkCisgICAgICB3YWl0KF9Mb2NrJiBfX2xvY2ssIF9QcmVkaWNhdGUgX19wKQorICAgICAgeworCXdoaWxlICghX19wKCkpCisJICB3YWl0KF9fbG9jayk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTG9jaywgdHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyYXRpb24+CisgICAgICBjdl9zdGF0dXMKKyAgICAgIHdhaXRfdW50aWwoX0xvY2smIF9fbG9jaywKKwkJIGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYXRpbWUpCisgICAgICB7CisJdW5pcXVlX2xvY2s8bXV0ZXg+IF9fbXlfbG9jayhfTV9tdXRleCk7CisJX1VubG9jazxfTG9jaz4gX191bmxvY2soX19sb2NrKTsKKwkvLyBfTV9tdXRleCBtdXN0IGJlIHVubG9ja2VkIGJlZm9yZSByZS1sb2NraW5nIF9fbG9jayBzbyBtb3ZlCisJLy8gb3duZXJzaGlwIG9mIF9NX211dGV4IGxvY2sgdG8gYW4gb2JqZWN0IHdpdGggc2hvcnRlciBsaWZldGltZS4KKwl1bmlxdWVfbG9jazxtdXRleD4gX19teV9sb2NrMihzdGQ6Om1vdmUoX19teV9sb2NrKSk7CisJcmV0dXJuIF9NX2NvbmQud2FpdF91bnRpbChfX215X2xvY2syLCBfX2F0aW1lKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Mb2NrLCB0eXBlbmFtZSBfQ2xvY2ssCisJICAgICB0eXBlbmFtZSBfRHVyYXRpb24sIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICBib29sCisgICAgICB3YWl0X3VudGlsKF9Mb2NrJiBfX2xvY2ssCisJCSBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2F0aW1lLAorCQkgX1ByZWRpY2F0ZSBfX3ApCisgICAgICB7CisJd2hpbGUgKCFfX3AoKSkKKwkgIGlmICh3YWl0X3VudGlsKF9fbG9jaywgX19hdGltZSkgPT0gY3Zfc3RhdHVzOjp0aW1lb3V0KQorCSAgICByZXR1cm4gX19wKCk7CisJcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTG9jaywgdHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZD4KKyAgICAgIGN2X3N0YXR1cworICAgICAgd2FpdF9mb3IoX0xvY2smIF9fbG9jaywgY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19ydGltZSkKKyAgICAgIHsgcmV0dXJuIHdhaXRfdW50aWwoX19sb2NrLCBfX2Nsb2NrX3Q6Om5vdygpICsgX19ydGltZSk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Mb2NrLCB0eXBlbmFtZSBfUmVwLAorCSAgICAgdHlwZW5hbWUgX1BlcmlvZCwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgIGJvb2wKKyAgICAgIHdhaXRfZm9yKF9Mb2NrJiBfX2xvY2ssCisJICAgICAgIGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUsIF9QcmVkaWNhdGUgX19wKQorICAgICAgeyByZXR1cm4gd2FpdF91bnRpbChfX2xvY2ssIF9fY2xvY2tfdDo6bm93KCkgKyBfX3J0aW1lLCBzdGQ6Om1vdmUoX19wKSk7IH0KKyAgfTsKKworICAvLyBAfSBncm91cCBjb25kaXRpb25fdmFyaWFibGVzCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9IQVNfR1RIUkVBRFMgJiYgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfQ09ORElUSU9OX1ZBUklBQkxFCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzZXRqbXAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzZXRqbXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5OWRiMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3NldGptcApAQCAtMCwwICsxLDYxIEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGNzZXRqbXAKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyBzZXRqbXAuaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIwLjQuNiAgQyBsaWJyYXJ5CisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NTRVRKTVAKKyNkZWZpbmUgX0dMSUJDWFhfQ1NFVEpNUCAxCisKKy8vIEdldCByaWQgb2YgdGhvc2UgbWFjcm9zIGRlZmluZWQgaW4gPHNldGptcC5oPiBpbiBsaWV1IG9mIHJlYWwgZnVuY3Rpb25zLgorI3VuZGVmIGxvbmdqbXAKKworLy8gQWRoZXJlIHRvIHNlY3Rpb24gMTcuNC4xLjIgY2xhdXNlIDUgb2YgSVNPIDE0ODgyOjE5OTgKKyNpZm5kZWYgc2V0am1wCisjZGVmaW5lIHNldGptcChlbnYpIHNldGptcCAoZW52KQorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQKK3sKKyAgdXNpbmcgOjpqbXBfYnVmOworICB1c2luZyA6OmxvbmdqbXA7Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzaWduYWwgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzaWduYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0NDZmNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3NpZ25hbApAQCAtMCwwICsxLDU3IEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGNzaWduYWwKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyBzaWduYWwuaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIwLjQuNiAgQyBsaWJyYXJ5CisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NTSUdOQUwKKyNkZWZpbmUgX0dMSUJDWFhfQ1NJR05BTCAxCisKKy8vIEdldCByaWQgb2YgdGhvc2UgbWFjcm9zIGRlZmluZWQgaW4gPHNpZ25hbC5oPiBpbiBsaWV1IG9mIHJlYWwgZnVuY3Rpb25zLgorI3VuZGVmIHJhaXNlCisKK25hbWVzcGFjZSBzdGQKK3sKKyAgdXNpbmcgOjpzaWdfYXRvbWljX3Q7CisgIHVzaW5nIDo6c2lnbmFsOworICB1c2luZyA6OnJhaXNlOworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkYWxpZ24gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRhbGlnbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTAwNTU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkYWxpZ24KQEAgLTAsMCArMSw0NCBAQAorLy8gPGNzdGRhbGlnbj4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY3N0ZGFsaWduCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1NUREFMSUdOCisjZGVmaW5lIF9HTElCQ1hYX0NTVERBTElHTiAxCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjICBpZiBfR0xJQkNYWF9IQVZFX1NUREFMSUdOX0gKKyMgICAgaW5jbHVkZSA8c3RkYWxpZ24uaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2VuZGlmIAorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRhcmcgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRhcmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2OGRlMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0ZGFyZwpAQCAtMCwwICsxLDU3IEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY3N0ZGFyZworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIHN0ZGFyZy5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjAuNC42ICBDIGxpYnJhcnkKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ1NUREFSRworI2RlZmluZSBfR0xJQkNYWF9DU1REQVJHIDEKKworLy8gQWRoZXJlIHRvIHNlY3Rpb24gMTcuNC4xLjIgY2xhdXNlIDUgb2YgSVNPIDE0ODgyOjE5OTgKKyNpZm5kZWYgdmFfZW5kCisjZGVmaW5lIHZhX2VuZChhcCkgdmFfZW5kIChhcCkKKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6dmFfbGlzdDsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0ZGJvb2wgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRib29sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYWJiZWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRib29sCkBAIC0wLDAgKzEsNDQgQEAKKy8vIDxjc3RkYm9vbD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY3N0ZGJvb2wKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmbmRlZiBfR0xJQkNYWF9DU1REQk9PTAorI2RlZmluZSBfR0xJQkNYWF9DU1REQk9PTCAxCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjICBpZiBfR0xJQkNYWF9IQVZFX1NUREJPT0xfSAorIyAgICBpbmNsdWRlIDxzdGRib29sLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkZGVmIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNjYwZjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRkZWYKQEAgLTAsMCArMSw0MiBAQAorLy8gLSotIEMrKyAtKi0gZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBjc3RkZGVmCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgc3RkZGVmLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAxOC4xICBUeXBlcworLy8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0ZGludCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0ZGludApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTQ1ODU5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkaW50CkBAIC0wLDAgKzEsODkgQEAKKy8vIDxjc3RkaW50PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jc3RkaW50CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0NTVERJTlQKKyNkZWZpbmUgX0dMSUJDWFhfQ1NURElOVCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisjaWYgX0dMSUJDWFhfSEFWRV9TVERJTlRfSAorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKK25hbWVzcGFjZSBzdGQKK3sKKyAgdXNpbmcgOjppbnQ4X3Q7CisgIHVzaW5nIDo6aW50MTZfdDsKKyAgdXNpbmcgOjppbnQzMl90OworICB1c2luZyA6OmludDY0X3Q7CisKKyAgdXNpbmcgOjppbnRfZmFzdDhfdDsKKyAgdXNpbmcgOjppbnRfZmFzdDE2X3Q7CisgIHVzaW5nIDo6aW50X2Zhc3QzMl90OworICB1c2luZyA6OmludF9mYXN0NjRfdDsKKworICB1c2luZyA6OmludF9sZWFzdDhfdDsKKyAgdXNpbmcgOjppbnRfbGVhc3QxNl90OworICB1c2luZyA6OmludF9sZWFzdDMyX3Q7CisgIHVzaW5nIDo6aW50X2xlYXN0NjRfdDsKKworICB1c2luZyA6OmludG1heF90OworICB1c2luZyA6OmludHB0cl90OworICAKKyAgdXNpbmcgOjp1aW50OF90OworICB1c2luZyA6OnVpbnQxNl90OworICB1c2luZyA6OnVpbnQzMl90OworICB1c2luZyA6OnVpbnQ2NF90OworCisgIHVzaW5nIDo6dWludF9mYXN0OF90OworICB1c2luZyA6OnVpbnRfZmFzdDE2X3Q7CisgIHVzaW5nIDo6dWludF9mYXN0MzJfdDsKKyAgdXNpbmcgOjp1aW50X2Zhc3Q2NF90OworCisgIHVzaW5nIDo6dWludF9sZWFzdDhfdDsKKyAgdXNpbmcgOjp1aW50X2xlYXN0MTZfdDsKKyAgdXNpbmcgOjp1aW50X2xlYXN0MzJfdDsKKyAgdXNpbmcgOjp1aW50X2xlYXN0NjRfdDsKKworICB1c2luZyA6OnVpbnRtYXhfdDsKKyAgdXNpbmcgOjp1aW50cHRyX3Q7Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX0NTVERJTlQKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0ZGlvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkaW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxZTRiMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0ZGlvCkBAIC0wLDAgKzEsMTg3IEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY3N0ZGlvCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgc3RkaW8uaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjguMiAgQyBMaWJyYXJ5IGZpbGVzCisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ1NURElPCisjZGVmaW5lIF9HTElCQ1hYX0NTVERJTyAxCisKKyNpZm5kZWYgX0dMSUJDWFhfSEFWRV9HRVRTCitleHRlcm4gIkMiIGNoYXIqIGdldHMgKGNoYXIqIF9fcykgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworI2VuZGlmCisKKy8vIEdldCByaWQgb2YgdGhvc2UgbWFjcm9zIGRlZmluZWQgaW4gPHN0ZGlvLmg+IGluIGxpZXUgb2YgcmVhbCBmdW5jdGlvbnMuCisjdW5kZWYgY2xlYXJlcnIKKyN1bmRlZiBmY2xvc2UKKyN1bmRlZiBmZW9mCisjdW5kZWYgZmVycm9yCisjdW5kZWYgZmZsdXNoCisjdW5kZWYgZmdldGMKKyN1bmRlZiBmZ2V0cG9zCisjdW5kZWYgZmdldHMKKyN1bmRlZiBmb3BlbgorI3VuZGVmIGZwcmludGYKKyN1bmRlZiBmcHV0YworI3VuZGVmIGZwdXRzCisjdW5kZWYgZnJlYWQKKyN1bmRlZiBmcmVvcGVuCisjdW5kZWYgZnNjYW5mCisjdW5kZWYgZnNlZWsKKyN1bmRlZiBmc2V0cG9zCisjdW5kZWYgZnRlbGwKKyN1bmRlZiBmd3JpdGUKKyN1bmRlZiBnZXRjCisjdW5kZWYgZ2V0Y2hhcgorI3VuZGVmIGdldHMKKyN1bmRlZiBwZXJyb3IKKyN1bmRlZiBwcmludGYKKyN1bmRlZiBwdXRjCisjdW5kZWYgcHV0Y2hhcgorI3VuZGVmIHB1dHMKKyN1bmRlZiByZW1vdmUKKyN1bmRlZiByZW5hbWUKKyN1bmRlZiByZXdpbmQKKyN1bmRlZiBzY2FuZgorI3VuZGVmIHNldGJ1ZgorI3VuZGVmIHNldHZidWYKKyN1bmRlZiBzcHJpbnRmCisjdW5kZWYgc3NjYW5mCisjdW5kZWYgdG1wZmlsZQorI3VuZGVmIHRtcG5hbQorI3VuZGVmIHVuZ2V0YworI3VuZGVmIHZmcHJpbnRmCisjdW5kZWYgdnByaW50ZgorI3VuZGVmIHZzcHJpbnRmCisKK25hbWVzcGFjZSBzdGQKK3sKKyAgdXNpbmcgOjpGSUxFOworICB1c2luZyA6OmZwb3NfdDsKKworICB1c2luZyA6OmNsZWFyZXJyOworICB1c2luZyA6OmZjbG9zZTsKKyAgdXNpbmcgOjpmZW9mOworICB1c2luZyA6OmZlcnJvcjsKKyAgdXNpbmcgOjpmZmx1c2g7CisgIHVzaW5nIDo6ZmdldGM7CisgIHVzaW5nIDo6ZmdldHBvczsKKyAgdXNpbmcgOjpmZ2V0czsKKyAgdXNpbmcgOjpmb3BlbjsKKyAgdXNpbmcgOjpmcHJpbnRmOworICB1c2luZyA6OmZwdXRjOworICB1c2luZyA6OmZwdXRzOworICB1c2luZyA6OmZyZWFkOworICB1c2luZyA6OmZyZW9wZW47CisgIHVzaW5nIDo6ZnNjYW5mOworICB1c2luZyA6OmZzZWVrOworICB1c2luZyA6OmZzZXRwb3M7CisgIHVzaW5nIDo6ZnRlbGw7CisgIHVzaW5nIDo6ZndyaXRlOworICB1c2luZyA6OmdldGM7CisgIHVzaW5nIDo6Z2V0Y2hhcjsKKyAgdXNpbmcgOjpnZXRzOworICB1c2luZyA6OnBlcnJvcjsKKyAgdXNpbmcgOjpwcmludGY7CisgIHVzaW5nIDo6cHV0YzsKKyAgdXNpbmcgOjpwdXRjaGFyOworICB1c2luZyA6OnB1dHM7CisgIHVzaW5nIDo6cmVtb3ZlOworICB1c2luZyA6OnJlbmFtZTsKKyAgdXNpbmcgOjpyZXdpbmQ7CisgIHVzaW5nIDo6c2NhbmY7CisgIHVzaW5nIDo6c2V0YnVmOworICB1c2luZyA6OnNldHZidWY7CisgIHVzaW5nIDo6c3ByaW50ZjsKKyAgdXNpbmcgOjpzc2NhbmY7CisgIHVzaW5nIDo6dG1wZmlsZTsKKyAgdXNpbmcgOjp0bXBuYW07CisgIHVzaW5nIDo6dW5nZXRjOworICB1c2luZyA6OnZmcHJpbnRmOworICB1c2luZyA6OnZwcmludGY7CisgIHVzaW5nIDo6dnNwcmludGY7Cit9IC8vIG5hbWVzcGFjZQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OQorCisjdW5kZWYgc25wcmludGYKKyN1bmRlZiB2ZnNjYW5mCisjdW5kZWYgdnNjYW5mCisjdW5kZWYgdnNucHJpbnRmCisjdW5kZWYgdnNzY2FuZgorCituYW1lc3BhY2UgX19nbnVfY3h4Cit7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DSEVDSyB8fCBfR0xJQkNYWF9VU0VfQzk5X0RZTkFNSUMKKyAgZXh0ZXJuICJDIiBpbnQKKyAgKHNucHJpbnRmKShjaGFyICogX19yZXN0cmljdCwgc3RkOjpzaXplX3QsIGNvbnN0IGNoYXIgKiBfX3Jlc3RyaWN0LCAuLi4pCisgIHRocm93ICgpOworICBleHRlcm4gIkMiIGludAorICAodmZzY2FuZikoRklMRSAqIF9fcmVzdHJpY3QsIGNvbnN0IGNoYXIgKiBfX3Jlc3RyaWN0LCBfX2dudWNfdmFfbGlzdCk7CisgIGV4dGVybiAiQyIgaW50ICh2c2NhbmYpKGNvbnN0IGNoYXIgKiBfX3Jlc3RyaWN0LCBfX2dudWNfdmFfbGlzdCk7CisgIGV4dGVybiAiQyIgaW50CisgICh2c25wcmludGYpKGNoYXIgKiBfX3Jlc3RyaWN0LCBzdGQ6OnNpemVfdCwgY29uc3QgY2hhciAqIF9fcmVzdHJpY3QsCisJICAgICAgX19nbnVjX3ZhX2xpc3QpIHRocm93ICgpOworICBleHRlcm4gIkMiIGludAorICAodnNzY2FuZikoY29uc3QgY2hhciAqIF9fcmVzdHJpY3QsIGNvbnN0IGNoYXIgKiBfX3Jlc3RyaWN0LCBfX2dudWNfdmFfbGlzdCkKKyAgdGhyb3cgKCk7CisjZW5kaWYKKworI2lmICFfR0xJQkNYWF9VU0VfQzk5X0RZTkFNSUMKKyAgdXNpbmcgOjpzbnByaW50ZjsKKyAgdXNpbmcgOjp2ZnNjYW5mOworICB1c2luZyA6OnZzY2FuZjsKKyAgdXNpbmcgOjp2c25wcmludGY7CisgIHVzaW5nIDo6dnNzY2FuZjsKKyNlbmRpZgorfSAvLyBuYW1lc3BhY2UgX19nbnVfY3h4CisKK25hbWVzcGFjZSBzdGQKK3sKKyAgdXNpbmcgOjpfX2dudV9jeHg6OnNucHJpbnRmOworICB1c2luZyA6Ol9fZ251X2N4eDo6dmZzY2FuZjsKKyAgdXNpbmcgOjpfX2dudV9jeHg6OnZzY2FuZjsKKyAgdXNpbmcgOjpfX2dudV9jeHg6OnZzbnByaW50ZjsKKyAgdXNpbmcgOjpfX2dudV9jeHg6OnZzc2NhbmY7Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9DOTkKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRsaWIgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRsaWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4MDAzNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0ZGxpYgpAQCAtMCwwICsxLDI2MCBAQAorLy8gLSotIEMrKyAtKi0gZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2NzdGRsaWIKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyBzdGRsaWIuaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIwLjQuNiAgQyBsaWJyYXJ5CisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NTVERMSUIKKyNkZWZpbmUgX0dMSUJDWFhfQ1NURExJQiAxCisKKyNpZiAhX0dMSUJDWFhfSE9TVEVECisvLyBUaGUgQyBzdGFuZGFyZCBkb2VzIG5vdCByZXF1aXJlIGEgZnJlZXN0YW5kaW5nIGltcGxlbWVudGF0aW9uIHRvCisvLyBwcm92aWRlIDxzdGRsaWIuaD4uICBIb3dldmVyLCB0aGUgQysrIHN0YW5kYXJkIGRvZXMgc3RpbGwgcmVxdWlyZQorLy8gPGNzdGRsaWI+IC0tIGJ1dCBvbmx5IHRoZSBmdW5jdGlvbmFsaXR5IG1lbnRpb25lZCBpbgorLy8gW2xpYi5zdXBwb3J0LnN0YXJ0LnRlcm1dLgorCisjZGVmaW5lIEVYSVRfU1VDQ0VTUyAwCisjZGVmaW5lIEVYSVRfRkFJTFVSRSAxCisKK25hbWVzcGFjZSBzdGQKK3sKKyAgZXh0ZXJuICJDIiB2b2lkIGFib3J0KHZvaWQpIHRocm93ICgpIF9HTElCQ1hYX05PUkVUVVJOOworICBleHRlcm4gIkMiIGludCBhdGV4aXQodm9pZCAoKikoKSkgdGhyb3cgKCk7CisgIGV4dGVybiAiQyIgdm9pZCBleGl0KGludCkgdGhyb3cgKCkgX0dMSUJDWFhfTk9SRVRVUk47CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyBpZmRlZiBfR0xJQkNYWF9IQVZFX0FUX1FVSUNLX0VYSVQKKyAgZXh0ZXJuICJDIiBpbnQgYXRfcXVpY2tfZXhpdCh2b2lkICgqKSgpKSB0aHJvdyAoKTsKKyMgZW5kaWYKKyMgaWZkZWYgX0dMSUJDWFhfSEFWRV9RVUlDS19FWElUCisgIGV4dGVybiAiQyIgdm9pZCBxdWlja19leGl0KGludCkgdGhyb3coKSBfR0xJQkNYWF9OT1JFVFVSTjsKKyMgZW5kaWYKKyNlbmRpZgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbHNlCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLy8gR2V0IHJpZCBvZiB0aG9zZSBtYWNyb3MgZGVmaW5lZCBpbiA8c3RkbGliLmg+IGluIGxpZXUgb2YgcmVhbCBmdW5jdGlvbnMuCisjdW5kZWYgYWJvcnQKKyN1bmRlZiBhYnMKKyN1bmRlZiBhdGV4aXQKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjIGlmZGVmIF9HTElCQ1hYX0hBVkVfQVRfUVVJQ0tfRVhJVAorIyAgdW5kZWYgYXRfcXVpY2tfZXhpdAorIyBlbmRpZgorI2VuZGlmCisjdW5kZWYgYXRvZgorI3VuZGVmIGF0b2kKKyN1bmRlZiBhdG9sCisjdW5kZWYgYnNlYXJjaAorI3VuZGVmIGNhbGxvYworI3VuZGVmIGRpdgorI3VuZGVmIGV4aXQKKyN1bmRlZiBmcmVlCisjdW5kZWYgZ2V0ZW52CisjdW5kZWYgbGFicworI3VuZGVmIGxkaXYKKyN1bmRlZiBtYWxsb2MKKyN1bmRlZiBtYmxlbgorI3VuZGVmIG1ic3Rvd2NzCisjdW5kZWYgbWJ0b3djCisjdW5kZWYgcXNvcnQKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjIGlmZGVmIF9HTElCQ1hYX0hBVkVfUVVJQ0tfRVhJVAorIyAgdW5kZWYgcXVpY2tfZXhpdAorIyBlbmRpZgorI2VuZGlmCisjdW5kZWYgcmFuZAorI3VuZGVmIHJlYWxsb2MKKyN1bmRlZiBzcmFuZAorI3VuZGVmIHN0cnRvZAorI3VuZGVmIHN0cnRvbAorI3VuZGVmIHN0cnRvdWwKKyN1bmRlZiBzeXN0ZW0KKyN1bmRlZiB3Y3N0b21icworI3VuZGVmIHdjdG9tYgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgOjpkaXZfdDsKKyAgdXNpbmcgOjpsZGl2X3Q7CisKKyAgdXNpbmcgOjphYm9ydDsKKyAgdXNpbmcgOjphYnM7CisgIHVzaW5nIDo6YXRleGl0OworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgaWZkZWYgX0dMSUJDWFhfSEFWRV9BVF9RVUlDS19FWElUCisgIHVzaW5nIDo6YXRfcXVpY2tfZXhpdDsKKyMgZW5kaWYKKyNlbmRpZgorICB1c2luZyA6OmF0b2Y7CisgIHVzaW5nIDo6YXRvaTsKKyAgdXNpbmcgOjphdG9sOworICB1c2luZyA6OmJzZWFyY2g7CisgIHVzaW5nIDo6Y2FsbG9jOworICB1c2luZyA6OmRpdjsKKyAgdXNpbmcgOjpleGl0OworICB1c2luZyA6OmZyZWU7CisgIHVzaW5nIDo6Z2V0ZW52OworICB1c2luZyA6OmxhYnM7CisgIHVzaW5nIDo6bGRpdjsKKyAgdXNpbmcgOjptYWxsb2M7CisjaWZkZWYgX0dMSUJDWFhfSEFWRV9NQlNUQVRFX1QKKyAgdXNpbmcgOjptYmxlbjsKKyAgdXNpbmcgOjptYnN0b3djczsKKyAgdXNpbmcgOjptYnRvd2M7CisjZW5kaWYgLy8gX0dMSUJDWFhfSEFWRV9NQlNUQVRFX1QKKyAgdXNpbmcgOjpxc29ydDsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjIGlmZGVmIF9HTElCQ1hYX0hBVkVfUVVJQ0tfRVhJVAorICB1c2luZyA6OnF1aWNrX2V4aXQ7CisjIGVuZGlmCisjZW5kaWYKKyAgdXNpbmcgOjpyYW5kOworICB1c2luZyA6OnJlYWxsb2M7CisgIHVzaW5nIDo6c3JhbmQ7CisgIHVzaW5nIDo6c3RydG9kOworICB1c2luZyA6OnN0cnRvbDsKKyAgdXNpbmcgOjpzdHJ0b3VsOworICB1c2luZyA6OnN5c3RlbTsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB1c2luZyA6Ondjc3RvbWJzOworICB1c2luZyA6OndjdG9tYjsKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfV0NIQVJfVAorCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1NURExJQl9IX1BST1RPCisgIGlubGluZSBsb25nCisgIGFicyhsb25nIF9faSkgeyByZXR1cm4gX19idWlsdGluX2xhYnMoX19pKTsgfQorCisgIGlubGluZSBsZGl2X3QKKyAgZGl2KGxvbmcgX19pLCBsb25nIF9faikgeyByZXR1cm4gbGRpdihfX2ksIF9faik7IH0KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0xPTkdfTE9ORworICBpbmxpbmUgbG9uZyBsb25nCisgIGFicyhsb25nIGxvbmcgX194KSB7IHJldHVybiBfX2J1aWx0aW5fbGxhYnMgKF9feCk7IH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9JTlQxMjgpCisgIGlubGluZSBfX2ludDEyOAorICBhYnMoX19pbnQxMjggX194KSB7IHJldHVybiBfX3ggPj0gMCA/IF9feCA6IC1fX3g7IH0KKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5CisKKyN1bmRlZiBfRXhpdAorI3VuZGVmIGxsYWJzCisjdW5kZWYgbGxkaXYKKyN1bmRlZiBhdG9sbAorI3VuZGVmIHN0cnRvbGwKKyN1bmRlZiBzdHJ0b3VsbAorI3VuZGVmIHN0cnRvZgorI3VuZGVmIHN0cnRvbGQKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfTE9OR19MT05HX0RZTkFNSUMKKyAgdXNpbmcgOjpsbGRpdl90OworI2VuZGlmCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DSEVDSyB8fCBfR0xJQkNYWF9VU0VfQzk5X0RZTkFNSUMKKyAgZXh0ZXJuICJDIiB2b2lkIChfRXhpdCkoaW50KSB0aHJvdyAoKSBfR0xJQkNYWF9OT1JFVFVSTjsKKyNlbmRpZgorI2lmICFfR0xJQkNYWF9VU0VfQzk5X0RZTkFNSUMKKyAgdXNpbmcgOjpfRXhpdDsKKyNlbmRpZgorCisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfTE9OR19MT05HX0RZTkFNSUMKKyAgdXNpbmcgOjpsbGFiczsKKworICBpbmxpbmUgbGxkaXZfdAorICBkaXYobG9uZyBsb25nIF9fbiwgbG9uZyBsb25nIF9fZCkKKyAgeyBsbGRpdl90IF9fcTsgX19xLnF1b3QgPSBfX24gLyBfX2Q7IF9fcS5yZW0gPSBfX24gJSBfX2Q7IHJldHVybiBfX3E7IH0KKworICB1c2luZyA6OmxsZGl2OworI2VuZGlmCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19DSEVDSyB8fCBfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19EWU5BTUlDCisgIGV4dGVybiAiQyIgbG9uZyBsb25nIGludCAoYXRvbGwpKGNvbnN0IGNoYXIgKikgdGhyb3cgKCk7CisgIGV4dGVybiAiQyIgbG9uZyBsb25nIGludAorICAgIChzdHJ0b2xsKShjb25zdCBjaGFyICogX19yZXN0cmljdCwgY2hhciAqKiBfX3Jlc3RyaWN0LCBpbnQpIHRocm93ICgpOworICBleHRlcm4gIkMiIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKKyAgICAoc3RydG91bGwpKGNvbnN0IGNoYXIgKiBfX3Jlc3RyaWN0LCBjaGFyICoqIF9fcmVzdHJpY3QsIGludCkgdGhyb3cgKCk7CisjZW5kaWYKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfRFlOQU1JQworICB1c2luZyA6OmF0b2xsOworICB1c2luZyA6OnN0cnRvbGw7CisgIHVzaW5nIDo6c3RydG91bGw7CisjZW5kaWYKKyAgdXNpbmcgOjpzdHJ0b2Y7CisgIHVzaW5nIDo6c3RydG9sZDsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBfX2dudV9jeHgKKworbmFtZXNwYWNlIHN0ZAoreworI2lmICFfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19EWU5BTUlDCisgIHVzaW5nIDo6X19nbnVfY3h4OjpsbGRpdl90OworI2VuZGlmCisgIHVzaW5nIDo6X19nbnVfY3h4OjpfRXhpdDsKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfRFlOQU1JQworICB1c2luZyA6Ol9fZ251X2N4eDo6bGxhYnM7CisgIHVzaW5nIDo6X19nbnVfY3h4OjpkaXY7CisgIHVzaW5nIDo6X19nbnVfY3h4OjpsbGRpdjsKKyNlbmRpZgorICB1c2luZyA6Ol9fZ251X2N4eDo6YXRvbGw7CisgIHVzaW5nIDo6X19nbnVfY3h4OjpzdHJ0b2Y7CisgIHVzaW5nIDo6X19nbnVfY3h4OjpzdHJ0b2xsOworICB1c2luZyA6Ol9fZ251X2N4eDo6c3RydG91bGw7CisgIHVzaW5nIDo6X19nbnVfY3h4OjpzdHJ0b2xkOworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5CisKKyNlbmRpZiAvLyAhX0dMSUJDWFhfSE9TVEVECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RyaW5nIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RyaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZGVmYWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdHJpbmcKQEAgLTAsMCArMSwxMjMgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgY3N0cmluZworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIHN0cmluZy5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjAuNC42ICBDIGxpYnJhcnkKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ1NUUklORworI2RlZmluZSBfR0xJQkNYWF9DU1RSSU5HIDEKKworLy8gR2V0IHJpZCBvZiB0aG9zZSBtYWNyb3MgZGVmaW5lZCBpbiA8c3RyaW5nLmg+IGluIGxpZXUgb2YgcmVhbCBmdW5jdGlvbnMuCisjdW5kZWYgbWVtY2hyCisjdW5kZWYgbWVtY21wCisjdW5kZWYgbWVtY3B5CisjdW5kZWYgbWVtbW92ZQorI3VuZGVmIG1lbXNldAorI3VuZGVmIHN0cmNhdAorI3VuZGVmIHN0cmNocgorI3VuZGVmIHN0cmNtcAorI3VuZGVmIHN0cmNvbGwKKyN1bmRlZiBzdHJjcHkKKyN1bmRlZiBzdHJjc3BuCisjdW5kZWYgc3RyZXJyb3IKKyN1bmRlZiBzdHJsZW4KKyN1bmRlZiBzdHJuY2F0CisjdW5kZWYgc3RybmNtcAorI3VuZGVmIHN0cm5jcHkKKyN1bmRlZiBzdHJwYnJrCisjdW5kZWYgc3RycmNocgorI3VuZGVmIHN0cnNwbgorI3VuZGVmIHN0cnN0cgorI3VuZGVmIHN0cnRvaworI3VuZGVmIHN0cnhmcm0KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIDo6bWVtY2hyOworICB1c2luZyA6Om1lbWNtcDsKKyAgdXNpbmcgOjptZW1jcHk7CisgIHVzaW5nIDo6bWVtbW92ZTsKKyAgdXNpbmcgOjptZW1zZXQ7CisgIHVzaW5nIDo6c3RyY2F0OworICB1c2luZyA6OnN0cmNtcDsKKyAgdXNpbmcgOjpzdHJjb2xsOworICB1c2luZyA6OnN0cmNweTsKKyAgdXNpbmcgOjpzdHJjc3BuOworICB1c2luZyA6OnN0cmVycm9yOworICB1c2luZyA6OnN0cmxlbjsKKyAgdXNpbmcgOjpzdHJuY2F0OworICB1c2luZyA6OnN0cm5jbXA7CisgIHVzaW5nIDo6c3RybmNweTsKKyAgdXNpbmcgOjpzdHJzcG47CisgIHVzaW5nIDo6c3RydG9rOworICB1c2luZyA6OnN0cnhmcm07CisgIHVzaW5nIDo6c3RyY2hyOworICB1c2luZyA6OnN0cnBicms7CisgIHVzaW5nIDo6c3RycmNocjsKKyAgdXNpbmcgOjpzdHJzdHI7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HX0hfUFJPVE8KKyAgaW5saW5lIHZvaWQqCisgIG1lbWNocih2b2lkKiBfX3MsIGludCBfX2MsIHNpemVfdCBfX24pCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9tZW1jaHIoX19zLCBfX2MsIF9fbik7IH0KKworICBpbmxpbmUgY2hhcioKKyAgc3RyY2hyKGNoYXIqIF9fcywgaW50IF9fbikKKyAgeyByZXR1cm4gX19idWlsdGluX3N0cmNocihfX3MsIF9fbik7IH0KKworICBpbmxpbmUgY2hhcioKKyAgc3RycGJyayhjaGFyKiBfX3MxLCBjb25zdCBjaGFyKiBfX3MyKQorICB7IHJldHVybiBfX2J1aWx0aW5fc3RycGJyayhfX3MxLCBfX3MyKTsgfQorCisgIGlubGluZSBjaGFyKgorICBzdHJyY2hyKGNoYXIqIF9fcywgaW50IF9fbikKKyAgeyByZXR1cm4gX19idWlsdGluX3N0cnJjaHIoX19zLCBfX24pOyB9CisKKyAgaW5saW5lIGNoYXIqCisgIHN0cnN0cihjaGFyKiBfX3MxLCBjb25zdCBjaGFyKiBfX3MyKQorICB7IHJldHVybiBfX2J1aWx0aW5fc3Ryc3RyKF9fczEsIF9fczIpOyB9CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3RnbWF0aCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3RnbWF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njk5OWJlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jdGdtYXRoCkBAIC0wLDAgKzEsNDEgQEAKKy8vIDxjdGdtYXRoPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jdGdtYXRoCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1RHTUFUSAorI2RlZmluZSBfR0xJQkNYWF9DVEdNQVRIIDEKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyAgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorIyAgaW5jbHVkZSA8Y21hdGg+CisjZW5kaWYKKworI2VuZGlmIAorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2N0aW1lIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jdGltZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmUwNDBmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jdGltZQpAQCAtMCwwICsxLDc1IEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY3RpbWUKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyB0aW1lLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMC41ICBEYXRlIGFuZCB0aW1lCisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmbmRlZiBfR0xJQkNYWF9DVElNRQorI2RlZmluZSBfR0xJQkNYWF9DVElNRSAxCisKKy8vIEdldCByaWQgb2YgdGhvc2UgbWFjcm9zIGRlZmluZWQgaW4gPHRpbWUuaD4gaW4gbGlldSBvZiByZWFsIGZ1bmN0aW9ucy4KKyN1bmRlZiBjbG9jaworI3VuZGVmIGRpZmZ0aW1lCisjdW5kZWYgbWt0aW1lCisjdW5kZWYgdGltZQorI3VuZGVmIGFzY3RpbWUKKyN1bmRlZiBjdGltZQorI3VuZGVmIGdtdGltZQorI3VuZGVmIGxvY2FsdGltZQorI3VuZGVmIHN0cmZ0aW1lCisKK25hbWVzcGFjZSBzdGQKK3sKKyAgdXNpbmcgOjpjbG9ja190OworICB1c2luZyA6OnRpbWVfdDsKKyAgdXNpbmcgOjp0bTsKKworICB1c2luZyA6OmNsb2NrOworICB1c2luZyA6OmRpZmZ0aW1lOworICB1c2luZyA6Om1rdGltZTsKKyAgdXNpbmcgOjp0aW1lOworICB1c2luZyA6OmFzY3RpbWU7CisgIHVzaW5nIDo6Y3RpbWU7CisgIHVzaW5nIDo6Z210aW1lOworICB1c2luZyA6OmxvY2FsdGltZTsKKyAgdXNpbmcgOjpzdHJmdGltZTsKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jd2NoYXIgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2N3Y2hhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGJiNjhmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jd2NoYXIKQEAgLTAsMCArMSwzMDMgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jd2NoYXIKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyB3Y2hhci5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjEuNAorLy8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworI2lmIF9HTElCQ1hYX0hBVkVfV0NIQVJfSAorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9DV0NIQVIKKyNkZWZpbmUgX0dMSUJDWFhfQ1dDSEFSIDEKKworLy8gTmVlZCB0byBkbyBhIGJpdCBvZiB0cmlja2VyeSBoZXJlIHdpdGggbWJzdGF0ZV90IGFzIGNoYXJfdHJhaXRzCisvLyBhc3N1bWVzIGl0IGlzIGluIHdjaGFyLmgsIHJlZ2FyZGxlc3Mgb2Ygd2NoYXJfdCBzcGVjaWFsaXphdGlvbnMuCisjaWZuZGVmIF9HTElCQ1hYX0hBVkVfTUJTVEFURV9UCitleHRlcm4gIkMiCit7CisgIHR5cGVkZWYgc3RydWN0CisgIHsKKyAgICBpbnQgX19maWxsWzZdOworICB9IG1ic3RhdGVfdDsKK30KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6bWJzdGF0ZV90OworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKy8vIEdldCByaWQgb2YgdGhvc2UgbWFjcm9zIGRlZmluZWQgaW4gPHdjaGFyLmg+IGluIGxpZXUgb2YgcmVhbCBmdW5jdGlvbnMuCisjdW5kZWYgYnRvd2MKKyN1bmRlZiBmZ2V0d2MKKyN1bmRlZiBmZ2V0d3MKKyN1bmRlZiBmcHV0d2MKKyN1bmRlZiBmcHV0d3MKKyN1bmRlZiBmd2lkZQorI3VuZGVmIGZ3cHJpbnRmCisjdW5kZWYgZndzY2FuZgorI3VuZGVmIGdldHdjCisjdW5kZWYgZ2V0d2NoYXIKKyN1bmRlZiBtYnJsZW4KKyN1bmRlZiBtYnJ0b3djCisjdW5kZWYgbWJzaW5pdAorI3VuZGVmIG1ic3J0b3djcworI3VuZGVmIHB1dHdjCisjdW5kZWYgcHV0d2NoYXIKKyN1bmRlZiBzd3ByaW50ZgorI3VuZGVmIHN3c2NhbmYKKyN1bmRlZiB1bmdldHdjCisjdW5kZWYgdmZ3cHJpbnRmCisjaWYgX0dMSUJDWFhfSEFWRV9WRldTQ0FORgorIyB1bmRlZiB2ZndzY2FuZgorI2VuZGlmCisjdW5kZWYgdnN3cHJpbnRmCisjaWYgX0dMSUJDWFhfSEFWRV9WU1dTQ0FORgorIyB1bmRlZiB2c3dzY2FuZgorI2VuZGlmCisjdW5kZWYgdndwcmludGYKKyNpZiBfR0xJQkNYWF9IQVZFX1ZXU0NBTkYKKyMgdW5kZWYgdndzY2FuZgorI2VuZGlmCisjdW5kZWYgd2NydG9tYgorI3VuZGVmIHdjc2NhdAorI3VuZGVmIHdjc2NocgorI3VuZGVmIHdjc2NtcAorI3VuZGVmIHdjc2NvbGwKKyN1bmRlZiB3Y3NjcHkKKyN1bmRlZiB3Y3Njc3BuCisjdW5kZWYgd2NzZnRpbWUKKyN1bmRlZiB3Y3NsZW4KKyN1bmRlZiB3Y3NuY2F0CisjdW5kZWYgd2NzbmNtcAorI3VuZGVmIHdjc25jcHkKKyN1bmRlZiB3Y3NwYnJrCisjdW5kZWYgd2NzcmNocgorI3VuZGVmIHdjc3J0b21icworI3VuZGVmIHdjc3NwbgorI3VuZGVmIHdjc3N0cgorI3VuZGVmIHdjc3RvZAorI2lmIF9HTElCQ1hYX0hBVkVfV0NTVE9GCisjIHVuZGVmIHdjc3RvZgorI2VuZGlmCisjdW5kZWYgd2NzdG9rCisjdW5kZWYgd2NzdG9sCisjdW5kZWYgd2NzdG91bAorI3VuZGVmIHdjc3hmcm0KKyN1bmRlZiB3Y3RvYgorI3VuZGVmIHdtZW1jaHIKKyN1bmRlZiB3bWVtY21wCisjdW5kZWYgd21lbWNweQorI3VuZGVmIHdtZW1tb3ZlCisjdW5kZWYgd21lbXNldAorI3VuZGVmIHdwcmludGYKKyN1bmRlZiB3c2NhbmYKKworI2lmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyA6OndpbnRfdDsKKworICB1c2luZyA6OmJ0b3djOworICB1c2luZyA6OmZnZXR3YzsKKyAgdXNpbmcgOjpmZ2V0d3M7CisgIHVzaW5nIDo6ZnB1dHdjOworICB1c2luZyA6OmZwdXR3czsKKyAgdXNpbmcgOjpmd2lkZTsKKyAgdXNpbmcgOjpmd3ByaW50ZjsKKyAgdXNpbmcgOjpmd3NjYW5mOworICB1c2luZyA6OmdldHdjOworICB1c2luZyA6OmdldHdjaGFyOworICB1c2luZyA6Om1icmxlbjsKKyAgdXNpbmcgOjptYnJ0b3djOworICB1c2luZyA6Om1ic2luaXQ7CisgIHVzaW5nIDo6bWJzcnRvd2NzOworICB1c2luZyA6OnB1dHdjOworICB1c2luZyA6OnB1dHdjaGFyOworI2lmbmRlZiBfR0xJQkNYWF9IQVZFX0JST0tFTl9WU1dQUklOVEYKKyAgdXNpbmcgOjpzd3ByaW50ZjsKKyNlbmRpZgorICB1c2luZyA6OnN3c2NhbmY7CisgIHVzaW5nIDo6dW5nZXR3YzsKKyAgdXNpbmcgOjp2ZndwcmludGY7CisjaWYgX0dMSUJDWFhfSEFWRV9WRldTQ0FORgorICB1c2luZyA6OnZmd3NjYW5mOworI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX0hBVkVfQlJPS0VOX1ZTV1BSSU5URgorICB1c2luZyA6OnZzd3ByaW50ZjsKKyNlbmRpZgorI2lmIF9HTElCQ1hYX0hBVkVfVlNXU0NBTkYKKyAgdXNpbmcgOjp2c3dzY2FuZjsKKyNlbmRpZgorICB1c2luZyA6OnZ3cHJpbnRmOworI2lmIF9HTElCQ1hYX0hBVkVfVldTQ0FORgorICB1c2luZyA6OnZ3c2NhbmY7CisjZW5kaWYKKyAgdXNpbmcgOjp3Y3J0b21iOworICB1c2luZyA6Ondjc2NhdDsKKyAgdXNpbmcgOjp3Y3NjbXA7CisgIHVzaW5nIDo6d2NzY29sbDsKKyAgdXNpbmcgOjp3Y3NjcHk7CisgIHVzaW5nIDo6d2NzY3NwbjsKKyAgdXNpbmcgOjp3Y3NmdGltZTsKKyAgdXNpbmcgOjp3Y3NsZW47CisgIHVzaW5nIDo6d2NzbmNhdDsKKyAgdXNpbmcgOjp3Y3NuY21wOworICB1c2luZyA6Ondjc25jcHk7CisgIHVzaW5nIDo6d2NzcnRvbWJzOworICB1c2luZyA6Ondjc3NwbjsKKyAgdXNpbmcgOjp3Y3N0b2Q7CisjaWYgX0dMSUJDWFhfSEFWRV9XQ1NUT0YKKyAgdXNpbmcgOjp3Y3N0b2Y7CisjZW5kaWYKKyAgdXNpbmcgOjp3Y3N0b2s7CisgIHVzaW5nIDo6d2NzdG9sOworICB1c2luZyA6Ondjc3RvdWw7CisgIHVzaW5nIDo6d2NzeGZybTsKKyAgdXNpbmcgOjp3Y3RvYjsKKyAgdXNpbmcgOjp3bWVtY21wOworICB1c2luZyA6OndtZW1jcHk7CisgIHVzaW5nIDo6d21lbW1vdmU7CisgIHVzaW5nIDo6d21lbXNldDsKKyAgdXNpbmcgOjp3cHJpbnRmOworICB1c2luZyA6OndzY2FuZjsKKyAgdXNpbmcgOjp3Y3NjaHI7CisgIHVzaW5nIDo6d2NzcGJyazsKKyAgdXNpbmcgOjp3Y3NyY2hyOworICB1c2luZyA6Ondjc3N0cjsKKyAgdXNpbmcgOjp3bWVtY2hyOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1dDSEFSX0hfUFJPVE8KKyAgaW5saW5lIHdjaGFyX3QqCisgIHdjc2Nocih3Y2hhcl90KiBfX3AsIHdjaGFyX3QgX19jKQorICB7IHJldHVybiB3Y3NjaHIoY29uc3RfY2FzdDxjb25zdCB3Y2hhcl90Kj4oX19wKSwgX19jKTsgfQorCisgIGlubGluZSB3Y2hhcl90KgorICB3Y3NwYnJrKHdjaGFyX3QqIF9fczEsIGNvbnN0IHdjaGFyX3QqIF9fczIpCisgIHsgcmV0dXJuIHdjc3BicmsoY29uc3RfY2FzdDxjb25zdCB3Y2hhcl90Kj4oX19zMSksIF9fczIpOyB9CisKKyAgaW5saW5lIHdjaGFyX3QqCisgIHdjc3JjaHIod2NoYXJfdCogX19wLCB3Y2hhcl90IF9fYykKKyAgeyByZXR1cm4gd2NzcmNocihjb25zdF9jYXN0PGNvbnN0IHdjaGFyX3QqPihfX3ApLCBfX2MpOyB9CisKKyAgaW5saW5lIHdjaGFyX3QqCisgIHdjc3N0cih3Y2hhcl90KiBfX3MxLCBjb25zdCB3Y2hhcl90KiBfX3MyKQorICB7IHJldHVybiB3Y3NzdHIoY29uc3RfY2FzdDxjb25zdCB3Y2hhcl90Kj4oX19zMSksIF9fczIpOyB9CisKKyAgaW5saW5lIHdjaGFyX3QqCisgIHdtZW1jaHIod2NoYXJfdCogX19wLCB3Y2hhcl90IF9fYywgc2l6ZV90IF9fbikKKyAgeyByZXR1cm4gd21lbWNocihjb25zdF9jYXN0PGNvbnN0IHdjaGFyX3QqPihfX3ApLCBfX2MsIF9fbik7IH0KKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5CisKKyN1bmRlZiB3Y3N0b2xkCisjdW5kZWYgd2NzdG9sbAorI3VuZGVmIHdjc3RvdWxsCisKK25hbWVzcGFjZSBfX2dudV9jeHgKK3sKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NIRUNLIHx8IF9HTElCQ1hYX1VTRV9DOTlfRFlOQU1JQworICBleHRlcm4gIkMiIGxvbmcgZG91YmxlCisgICAgKHdjc3RvbGQpKGNvbnN0IHdjaGFyX3QgKiBfX3Jlc3RyaWN0LCB3Y2hhcl90ICoqIF9fcmVzdHJpY3QpIHRocm93ICgpOworI2VuZGlmCisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfRFlOQU1JQworICB1c2luZyA6Ondjc3RvbGQ7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19DSEVDSyB8fCBfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19EWU5BTUlDCisgIGV4dGVybiAiQyIgbG9uZyBsb25nIGludAorICAgICh3Y3N0b2xsKShjb25zdCB3Y2hhcl90ICogX19yZXN0cmljdCwgd2NoYXJfdCAqKiBfX3Jlc3RyaWN0LCBpbnQpIHRocm93ICgpOworICBleHRlcm4gIkMiIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKKyAgICAod2NzdG91bGwpKGNvbnN0IHdjaGFyX3QgKiBfX3Jlc3RyaWN0LCB3Y2hhcl90ICoqIF9fcmVzdHJpY3QsIGludCkgdGhyb3cgKCk7CisjZW5kaWYKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfRFlOQU1JQworICB1c2luZyA6Ondjc3RvbGw7CisgIHVzaW5nIDo6d2NzdG91bGw7CisjZW5kaWYKK30gLy8gbmFtZXNwYWNlIF9fZ251X2N4eAorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6X19nbnVfY3h4Ojp3Y3N0b2xkOworICB1c2luZyA6Ol9fZ251X2N4eDo6d2NzdG9sbDsKKyAgdXNpbmcgOjpfX2dudV9jeHg6Ondjc3RvdWxsOworfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCisKKyNlbmRpZiAvL19HTElCQ1hYX1VTRV9XQ0hBUl9UCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorCituYW1lc3BhY2Ugc3RkCit7CisjaWYgX0dMSUJDWFhfSEFWRV9XQ1NUT0YKKyAgdXNpbmcgc3RkOjp3Y3N0b2Y7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9IQVZFX1ZGV1NDQU5GCisgIHVzaW5nIHN0ZDo6dmZ3c2NhbmY7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9IQVZFX1ZTV1NDQU5GCisgIHVzaW5nIHN0ZDo6dnN3c2NhbmY7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9IQVZFX1ZXU0NBTkYKKyAgdXNpbmcgc3RkOjp2d3NjYW5mOworI2VuZGlmCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5CisgIHVzaW5nIHN0ZDo6d2NzdG9sZDsKKyAgdXNpbmcgc3RkOjp3Y3N0b2xsOworICB1c2luZyBzdGQ6Ondjc3RvdWxsOworI2VuZGlmCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX1dDSEFSX1QKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jd2N0eXBlIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jd2N0eXBlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDU3YzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2N3Y3R5cGUKQEAgLTAsMCArMSwxMTAgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jd2N0eXBlCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgd2N0eXBlLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiA8Y3djdHlwZT4KKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKyNpZiBfR0xJQkNYWF9IQVZFX1dDVFlQRV9ICisKKyNpZiBfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPCAxMAorLy8gV29yayBhcm91bmQgZ2xpYmMgQlogOTY5NAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx3Y3R5cGUuaD4KKyNlbmRpZiAvLyBfR0xJQkNYWF9IQVZFX1dDVFlQRV9ICisKKyNpZm5kZWYgX0dMSUJDWFhfQ1dDVFlQRQorI2RlZmluZSBfR0xJQkNYWF9DV0NUWVBFIDEKKworLy8gR2V0IHJpZCBvZiB0aG9zZSBtYWNyb3MgZGVmaW5lZCBpbiA8d2N0eXBlLmg+IGluIGxpZXUgb2YgcmVhbCBmdW5jdGlvbnMuCisjdW5kZWYgaXN3YWxudW0KKyN1bmRlZiBpc3dhbHBoYQorI2lmIF9HTElCQ1hYX0hBVkVfSVNXQkxBTksKKyMgdW5kZWYgaXN3YmxhbmsKKyNlbmRpZgorI3VuZGVmIGlzd2NudHJsCisjdW5kZWYgaXN3Y3R5cGUKKyN1bmRlZiBpc3dkaWdpdAorI3VuZGVmIGlzd2dyYXBoCisjdW5kZWYgaXN3bG93ZXIKKyN1bmRlZiBpc3dwcmludAorI3VuZGVmIGlzd3B1bmN0CisjdW5kZWYgaXN3c3BhY2UKKyN1bmRlZiBpc3d1cHBlcgorI3VuZGVmIGlzd3hkaWdpdAorI3VuZGVmIHRvd2N0cmFucworI3VuZGVmIHRvd2xvd2VyCisjdW5kZWYgdG93dXBwZXIKKyN1bmRlZiB3Y3RyYW5zCisjdW5kZWYgd2N0eXBlCisKKyNpZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6d2N0cmFuc190OworICB1c2luZyA6OndjdHlwZV90OworICB1c2luZyA6OndpbnRfdDsKKworICB1c2luZyA6Omlzd2FsbnVtOworICB1c2luZyA6Omlzd2FscGhhOworI2lmIF9HTElCQ1hYX0hBVkVfSVNXQkxBTksKKyAgdXNpbmcgOjppc3dibGFuazsKKyNlbmRpZgorICB1c2luZyA6Omlzd2NudHJsOworICB1c2luZyA6Omlzd2N0eXBlOworICB1c2luZyA6Omlzd2RpZ2l0OworICB1c2luZyA6Omlzd2dyYXBoOworICB1c2luZyA6Omlzd2xvd2VyOworICB1c2luZyA6Omlzd3ByaW50OworICB1c2luZyA6Omlzd3B1bmN0OworICB1c2luZyA6Omlzd3NwYWNlOworICB1c2luZyA6Omlzd3VwcGVyOworICB1c2luZyA6Omlzd3hkaWdpdDsKKyAgdXNpbmcgOjp0b3djdHJhbnM7CisgIHVzaW5nIDo6dG93bG93ZXI7CisgIHVzaW5nIDo6dG93dXBwZXI7CisgIHVzaW5nIDo6d2N0cmFuczsKKyAgdXNpbmcgOjp3Y3R5cGU7Cit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy9fR0xJQkNYWF9VU0VfV0NIQVJfVAorCisjZW5kaWYgLy8gX0dMSUJDWFhfQ1dDVFlQRQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jeHhhYmkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3h4YWJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUzMDFjMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3h4YWJpLmgKQEAgLTAsMCArMSw3MDAgQEAKKy8vIEFCSSBTdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKy8vCisvLyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gV3JpdHRlbiBieSBOYXRoYW4gU2lkd2VsbCwgQ29kZXNvdXJjZXJ5IExMQywgPG5hdGhhbkBjb2Rlc291cmNlcnkuY29tPgorCisvKiBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIG5ldyBhYmkgZW50cnkgcG9pbnRzIGludG8gdGhlIHJ1bnRpbWUuIEl0IGlzIG5vdAorICAgbm9ybWFsbHkgbmVjZXNzYXJ5IGZvciB1c2VyIHByb2dyYW1zIHRvIGluY2x1ZGUgdGhpcyBoZWFkZXIsIG9yIHVzZSB0aGUKKyAgIGVudHJ5IHBvaW50cyBkaXJlY3RseS4gSG93ZXZlciwgdGhpcyBoZWFkZXIgaXMgYXZhaWxhYmxlIHNob3VsZCB0aGF0IGJlCisgICBuZWVkZWQuCisKKyAgIFNvbWUgb2YgdGhlIGVudHJ5IHBvaW50cyBhcmUgaW50ZW5kZWQgZm9yIGJvdGggQyBhbmQgQysrLCB0aHVzIHRoaXMgaGVhZGVyCisgICBpcyBpbmNsdWRhYmxlIGZyb20gYm90aCBDIGFuZCBDKysuIFRob3VnaCB0aGUgQysrIHNwZWNpZmljIHBhcnRzIGFyZSBub3QKKyAgIGF2YWlsYWJsZSBpbiBDLCBuYXR1cmFsbHkgZW5vdWdoLiAgKi8KKworLyoqIEBmaWxlIGN4eGFiaS5oCisgKiAgVGhlIGhlYWRlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIEMrKyBBQkkuCisgKi8KKworI2lmbmRlZiBfQ1hYQUJJX0gKKyNkZWZpbmUgX0NYWEFCSV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9jeHhhYmlfdHdlYWtzLmg+CisjaW5jbHVkZSA8Yml0cy9jeHhhYmlfZm9yY2VkLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ0RUT1JfQ0FMTEFCSQorI2RlZmluZSBfR0xJQkNYWF9DRFRPUl9DQUxMQUJJCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCituYW1lc3BhY2UgX19jeHhhYml2MQoreworICBleHRlcm4gIkMiCisgIHsKKyNlbmRpZgorCisgIHR5cGVkZWYgX19jeGFfY2R0b3JfcmV0dXJuX3R5cGUgKCpfX2N4YV9jZHRvcl90eXBlKSh2b2lkICopOworCisgIC8vIEFsbG9jYXRlIGFycmF5LgorICB2b2lkKgorICBfX2N4YV92ZWNfbmV3KHNpemVfdCBfX2VsZW1lbnRfY291bnQsIHNpemVfdCBfX2VsZW1lbnRfc2l6ZSwKKwkJc2l6ZV90IF9fcGFkZGluZ19zaXplLCBfX2N4YV9jZHRvcl90eXBlIF9fY29uc3RydWN0b3IsCisJCV9fY3hhX2NkdG9yX3R5cGUgX19kZXN0cnVjdG9yKTsKKworICB2b2lkKgorICBfX2N4YV92ZWNfbmV3MihzaXplX3QgX19lbGVtZW50X2NvdW50LCBzaXplX3QgX19lbGVtZW50X3NpemUsCisJCSBzaXplX3QgX19wYWRkaW5nX3NpemUsIF9fY3hhX2NkdG9yX3R5cGUgX19jb25zdHJ1Y3RvciwKKwkJIF9fY3hhX2NkdG9yX3R5cGUgX19kZXN0cnVjdG9yLCB2b2lkICooKl9fYWxsb2MpIChzaXplX3QpLAorCQkgdm9pZCAoKl9fZGVhbGxvYykgKHZvaWQqKSk7CisKKyAgdm9pZCoKKyAgX19jeGFfdmVjX25ldzMoc2l6ZV90IF9fZWxlbWVudF9jb3VudCwgc2l6ZV90IF9fZWxlbWVudF9zaXplLAorCQkgc2l6ZV90IF9fcGFkZGluZ19zaXplLCBfX2N4YV9jZHRvcl90eXBlIF9fY29uc3RydWN0b3IsCisJCSBfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3Rvciwgdm9pZCAqKCpfX2FsbG9jKSAoc2l6ZV90KSwKKwkJIHZvaWQgKCpfX2RlYWxsb2MpICh2b2lkKiwgc2l6ZV90KSk7CisKKyAgLy8gQ29uc3RydWN0IGFycmF5LgorICBfX2N4YV92ZWNfY3Rvcl9yZXR1cm5fdHlwZQorICBfX2N4YV92ZWNfY3Rvcih2b2lkKiBfX2FycmF5X2FkZHJlc3MsIHNpemVfdCBfX2VsZW1lbnRfY291bnQsCisJCSBzaXplX3QgX19lbGVtZW50X3NpemUsIF9fY3hhX2NkdG9yX3R5cGUgX19jb25zdHJ1Y3RvciwKKwkJIF9fY3hhX2NkdG9yX3R5cGUgX19kZXN0cnVjdG9yKTsKKworICBfX2N4YV92ZWNfY3Rvcl9yZXR1cm5fdHlwZQorICBfX2N4YV92ZWNfY2N0b3Iodm9pZCogX19kZXN0X2FycmF5LCB2b2lkKiBfX3NyY19hcnJheSwKKwkJICBzaXplX3QgX19lbGVtZW50X2NvdW50LCBzaXplX3QgX19lbGVtZW50X3NpemUsCisJCSAgX19jeGFfY2R0b3JfcmV0dXJuX3R5cGUgKCpfX2NvbnN0cnVjdG9yKSAodm9pZCosIHZvaWQqKSwKKwkJICBfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3Rvcik7CisKKyAgLy8gRGVzdHJ1Y3QgYXJyYXkuCisgIHZvaWQKKyAgX19jeGFfdmVjX2R0b3Iodm9pZCogX19hcnJheV9hZGRyZXNzLCBzaXplX3QgX19lbGVtZW50X2NvdW50LAorCQkgc2l6ZV90IF9fZWxlbWVudF9zaXplLCBfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3Rvcik7CisKKyAgdm9pZAorICBfX2N4YV92ZWNfY2xlYW51cCh2b2lkKiBfX2FycmF5X2FkZHJlc3MsIHNpemVfdCBfX2VsZW1lbnRfY291bnQsIHNpemVfdCBfX3MsCisJCSAgICBfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3RvcikgX0dMSUJDWFhfTk9USFJPVzsKKworICAvLyBEZXN0cnVjdCBhbmQgcmVsZWFzZSBhcnJheS4KKyAgdm9pZAorICBfX2N4YV92ZWNfZGVsZXRlKHZvaWQqIF9fYXJyYXlfYWRkcmVzcywgc2l6ZV90IF9fZWxlbWVudF9zaXplLAorCQkgICBzaXplX3QgX19wYWRkaW5nX3NpemUsIF9fY3hhX2NkdG9yX3R5cGUgX19kZXN0cnVjdG9yKTsKKworICB2b2lkCisgIF9fY3hhX3ZlY19kZWxldGUyKHZvaWQqIF9fYXJyYXlfYWRkcmVzcywgc2l6ZV90IF9fZWxlbWVudF9zaXplLAorCQkgICAgc2l6ZV90IF9fcGFkZGluZ19zaXplLCBfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3RvciwKKwkJICAgIHZvaWQgKCpfX2RlYWxsb2MpICh2b2lkKikpOworCisgIHZvaWQKKyAgX19jeGFfdmVjX2RlbGV0ZTModm9pZCogX19hcnJheV9hZGRyZXNzLCBzaXplX3QgX19lbGVtZW50X3NpemUsCisJCSAgICBzaXplX3QgX19wYWRkaW5nX3NpemUsIF9fY3hhX2NkdG9yX3R5cGUgX19kZXN0cnVjdG9yLAorCQkgICAgdm9pZCAoKl9fZGVhbGxvYykgKHZvaWQqLCBzaXplX3QpKTsKKworICBpbnQKKyAgX19jeGFfZ3VhcmRfYWNxdWlyZShfX2d1YXJkKik7CisKKyAgdm9pZAorICBfX2N4YV9ndWFyZF9yZWxlYXNlKF9fZ3VhcmQqKSBfR0xJQkNYWF9OT1RIUk9XOworCisgIHZvaWQKKyAgX19jeGFfZ3VhcmRfYWJvcnQoX19ndWFyZCopIF9HTElCQ1hYX05PVEhST1c7CisKKyAgLy8gRFNPIGRlc3RydWN0aW9uLgorICBpbnQKKyAgX19jeGFfYXRleGl0KHZvaWQgKCopKHZvaWQqKSwgdm9pZCosIHZvaWQqKSBfR0xJQkNYWF9OT1RIUk9XOworCisgIGludAorICBfX2N4YV9maW5hbGl6ZSh2b2lkKik7CisKKyAgLy8gVExTIGRlc3RydWN0aW9uLgorICBpbnQKKyAgX19jeGFfdGhyZWFkX2F0ZXhpdCh2b2lkICgqKSh2b2lkKiksIHZvaWQqLCB2b2lkICopIF9HTElCQ1hYX05PVEhST1c7CisKKyAgLy8gUHVyZSB2aXJ0dWFsIGZ1bmN0aW9ucy4KKyAgdm9pZAorICBfX2N4YV9wdXJlX3ZpcnR1YWwodm9pZCkgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCisgIHZvaWQKKyAgX19jeGFfZGVsZXRlZF92aXJ0dWFsKHZvaWQpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworICAvLyBFeGNlcHRpb24gaGFuZGxpbmcgYXV4aWxsYXJ5LgorICB2b2lkIAorICBfX2N4YV9iYWRfY2FzdCgpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIHZvaWQgCisgIF9fY3hhX2JhZF90eXBlaWQoKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmIERlbWFuZ2xpbmcgcm91dGluZS4KKyAgICogIEFCSS1tYW5kYXRlZCBlbnRyeSBwb2ludCBpbiB0aGUgQysrIHJ1bnRpbWUgbGlicmFyeSBmb3IgZGVtYW5nbGluZy4KKyAgICoKKyAgICogIEBwYXJhbSBfX21hbmdsZWRfbmFtZSBBIE5VTC10ZXJtaW5hdGVkIGNoYXJhY3RlciBzdHJpbmcKKyAgICogIGNvbnRhaW5pbmcgdGhlIG5hbWUgdG8gYmUgZGVtYW5nbGVkLgorICAgKgorICAgKiAgQHBhcmFtIF9fb3V0cHV0X2J1ZmZlciBBIHJlZ2lvbiBvZiBtZW1vcnksIGFsbG9jYXRlZCB3aXRoCisgICAqICBtYWxsb2MsIG9mIEBhICpfX2xlbmd0aCBieXRlcywgaW50byB3aGljaCB0aGUgZGVtYW5nbGVkIG5hbWUgaXMKKyAgICogIHN0b3JlZC4gIElmIEBhIF9fb3V0cHV0X2J1ZmZlciBpcyBub3QgbG9uZyBlbm91Z2gsIGl0IGlzCisgICAqICBleHBhbmRlZCB1c2luZyByZWFsbG9jLiAgQGEgX19vdXRwdXRfYnVmZmVyIG1heSBpbnN0ZWFkIGJlIE5VTEw7CisgICAqICBpbiB0aGF0IGNhc2UsIHRoZSBkZW1hbmdsZWQgbmFtZSBpcyBwbGFjZWQgaW4gYSByZWdpb24gb2YgbWVtb3J5CisgICAqICBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MuCisgICAqCisgICAqICBAcGFyYW0gX19sZW5ndGggSWYgQGEgX19sZW5ndGggaXMgbm9uLU5VTEwsIHRoZSBsZW5ndGggb2YgdGhlCisgICAqICBidWZmZXIgY29udGFpbmluZyB0aGUgZGVtYW5nbGVkIG5hbWUgaXMgcGxhY2VkIGluIEBhICpfX2xlbmd0aC4KKyAgICoKKyAgICogIEBwYXJhbSBfX3N0YXR1cyBAYSAqX19zdGF0dXMgaXMgc2V0IHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgICogICAwOiBUaGUgZGVtYW5nbGluZyBvcGVyYXRpb24gc3VjY2VlZGVkLgorICAgKiAgLTE6IEEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBvY2N1cnJlZC4KKyAgICogIC0yOiBAYSBtYW5nbGVkX25hbWUgaXMgbm90IGEgdmFsaWQgbmFtZSB1bmRlciB0aGUgQysrIEFCSSBtYW5nbGluZyBydWxlcy4KKyAgICogIC0zOiBPbmUgb2YgdGhlIGFyZ3VtZW50cyBpcyBpbnZhbGlkLgorICAgKgorICAgKiAgQHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBOVUwtdGVybWluYXRlZCBkZW1hbmdsZWQKKyAgICogIG5hbWUsIG9yIE5VTEwgaWYgdGhlIGRlbWFuZ2xpbmcgZmFpbHMuICBUaGUgY2FsbGVyIGlzCisgICAqICByZXNwb25zaWJsZSBmb3IgZGVhbGxvY2F0aW5nIHRoaXMgbWVtb3J5IHVzaW5nIEBjIGZyZWUuCisgICAqCisgICAqICBUaGUgZGVtYW5nbGluZyBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlIEMrKyBBQkkgbWFuZ2xpbmcgcnVsZXMsCisgICAqICB3aXRoIEdOVSBleHRlbnNpb25zLiBGb3IgZXhhbXBsZSwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluCisgICAqICBfX2dudV9jeHg6Ol9fdmVyYm9zZV90ZXJtaW5hdGVfaGFuZGxlci4KKyAgICoKKyAgICogIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDEyY2gzOS5odG1sCisgICAqICBmb3Igb3RoZXIgZXhhbXBsZXMgb2YgdXNlLgorICAgKgorICAgKiAgQG5vdGUgVGhlIHNhbWUgZGVtYW5nbGluZyBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSB2aWEKKyAgICogIGxpYmliZXJ0eSAoQGMgPGxpYmliZXJ0eS9kZW1hbmdsZS5oPiBhbmQgQGMgbGliaWJlcnR5LmEpIGluIEdDQworICAgKiAgMy4xIGFuZCBsYXRlciwgYnV0IHRoYXQgcmVxdWlyZXMgZXhwbGljaXQgaW5zdGFsbGF0aW9uIChAYworICAgKiAgLS1lbmFibGUtaW5zdGFsbC1saWJpYmVydHkpIGFuZCB1c2VzIGEgZGlmZmVyZW50IEFQSSwgYWx0aG91Z2gKKyAgICogIHRoZSBBQkkgaXMgdW5jaGFuZ2VkLgorICAgKi8KKyAgY2hhcioKKyAgX19jeGFfZGVtYW5nbGUoY29uc3QgY2hhciogX19tYW5nbGVkX25hbWUsIGNoYXIqIF9fb3V0cHV0X2J1ZmZlciwKKwkJIHNpemVfdCogX19sZW5ndGgsIGludCogX19zdGF0dXMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorfSAvLyBuYW1lc3BhY2UgX19jeHhhYml2MQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisjaW5jbHVkZSA8dHlwZWluZm8+CisKK25hbWVzcGFjZSBfX2N4eGFiaXYxCit7CisgIC8vIFR5cGUgaW5mb3JtYXRpb24gZm9yIGludCwgZmxvYXQgZXRjLgorICBjbGFzcyBfX2Z1bmRhbWVudGFsX3R5cGVfaW5mbyA6IHB1YmxpYyBzdGQ6OnR5cGVfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdAorICAgIF9fZnVuZGFtZW50YWxfdHlwZV9pbmZvKGNvbnN0IGNoYXIqIF9fbikgOiBzdGQ6OnR5cGVfaW5mbyhfX24pIHsgfQorCisgICAgdmlydHVhbAorICAgIH5fX2Z1bmRhbWVudGFsX3R5cGVfaW5mbygpOworICB9OworCisgIC8vIFR5cGUgaW5mb3JtYXRpb24gZm9yIGFycmF5IG9iamVjdHMuCisgIGNsYXNzIF9fYXJyYXlfdHlwZV9pbmZvIDogcHVibGljIHN0ZDo6dHlwZV9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgX19hcnJheV90eXBlX2luZm8oY29uc3QgY2hhciogX19uKSA6IHN0ZDo6dHlwZV9pbmZvKF9fbikgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfl9fYXJyYXlfdHlwZV9pbmZvKCk7CisgIH07CisKKyAgLy8gVHlwZSBpbmZvcm1hdGlvbiBmb3IgZnVuY3Rpb25zIChib3RoIG1lbWJlciBhbmQgbm9uLW1lbWJlcikuCisgIGNsYXNzIF9fZnVuY3Rpb25fdHlwZV9pbmZvIDogcHVibGljIHN0ZDo6dHlwZV9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgX19mdW5jdGlvbl90eXBlX2luZm8oY29uc3QgY2hhciogX19uKSA6IHN0ZDo6dHlwZV9pbmZvKF9fbikgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfl9fZnVuY3Rpb25fdHlwZV9pbmZvKCk7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIEltcGxlbWVudGF0aW9uIGRlZmluZWQgbWVtYmVyIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgYm9vbAorICAgIF9faXNfZnVuY3Rpb25fcCgpIGNvbnN0OworICB9OworCisgIC8vIFR5cGUgaW5mb3JtYXRpb24gZm9yIGVudW1lcmF0aW9ucy4KKyAgY2xhc3MgX19lbnVtX3R5cGVfaW5mbyA6IHB1YmxpYyBzdGQ6OnR5cGVfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdAorICAgIF9fZW51bV90eXBlX2luZm8oY29uc3QgY2hhciogX19uKSA6IHN0ZDo6dHlwZV9pbmZvKF9fbikgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfl9fZW51bV90eXBlX2luZm8oKTsKKyAgfTsKKworICAvLyBDb21tb24gdHlwZSBpbmZvcm1hdGlvbiBmb3Igc2ltcGxlIHBvaW50ZXJzIGFuZCBwb2ludGVycyB0byBtZW1iZXIuCisgIGNsYXNzIF9fcGJhc2VfdHlwZV9pbmZvIDogcHVibGljIHN0ZDo6dHlwZV9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIHVuc2lnbmVkIGludCAJCV9fZmxhZ3M7IC8vIFF1YWxpZmljYXRpb24gb2YgdGhlIHRhcmdldCBvYmplY3QuCisgICAgY29uc3Qgc3RkOjp0eXBlX2luZm8qIAlfX3BvaW50ZWU7IC8vIFR5cGUgb2YgcG9pbnRlZCB0byBvYmplY3QuCisKKyAgICBleHBsaWNpdAorICAgIF9fcGJhc2VfdHlwZV9pbmZvKGNvbnN0IGNoYXIqIF9fbiwgaW50IF9fcXVhbHMsCisJCSAgICAgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiBfX3R5cGUpCisgICAgOiBzdGQ6OnR5cGVfaW5mbyhfX24pLCBfX2ZsYWdzKF9fcXVhbHMpLCBfX3BvaW50ZWUoX190eXBlKQorICAgIHsgfQorCisgICAgdmlydHVhbAorICAgIH5fX3BiYXNlX3R5cGVfaW5mbygpOworCisgICAgLy8gSW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLgorICAgIGVudW0gX19tYXNrcworICAgICAgeworCV9fY29uc3RfbWFzayA9IDB4MSwKKwlfX3ZvbGF0aWxlX21hc2sgPSAweDIsCisJX19yZXN0cmljdF9tYXNrID0gMHg0LAorCV9faW5jb21wbGV0ZV9tYXNrID0gMHg4LAorCV9faW5jb21wbGV0ZV9jbGFzc19tYXNrID0gMHgxMAorICAgICAgfTsKKworICBwcm90ZWN0ZWQ6CisgICAgX19wYmFzZV90eXBlX2luZm8oY29uc3QgX19wYmFzZV90eXBlX2luZm8mKTsKKworICAgIF9fcGJhc2VfdHlwZV9pbmZvJgorICAgIG9wZXJhdG9yPShjb25zdCBfX3BiYXNlX3R5cGVfaW5mbyYpOworCisgICAgLy8gSW1wbGVtZW50YXRpb24gZGVmaW5lZCBtZW1iZXIgZnVuY3Rpb25zLgorICAgIHZpcnR1YWwgYm9vbAorICAgIF9fZG9fY2F0Y2goY29uc3Qgc3RkOjp0eXBlX2luZm8qIF9fdGhyX3R5cGUsIHZvaWQqKiBfX3Rocl9vYmosCisJICAgICAgIHVuc2lnbmVkIGludCBfX291dGVyKSBjb25zdDsKKworICAgIGlubGluZSB2aXJ0dWFsIGJvb2wKKyAgICBfX3BvaW50ZXJfY2F0Y2goY29uc3QgX19wYmFzZV90eXBlX2luZm8qIF9fdGhyX3R5cGUsIHZvaWQqKiBfX3Rocl9vYmosCisJCSAgICB1bnNpZ25lZCBfX291dGVyKSBjb25zdDsKKyAgfTsKKworICAvLyBUeXBlIGluZm9ybWF0aW9uIGZvciBzaW1wbGUgcG9pbnRlcnMuCisgIGNsYXNzIF9fcG9pbnRlcl90eXBlX2luZm8gOiBwdWJsaWMgX19wYmFzZV90eXBlX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQKKyAgICBfX3BvaW50ZXJfdHlwZV9pbmZvKGNvbnN0IGNoYXIqIF9fbiwgaW50IF9fcXVhbHMsCisJCQljb25zdCBzdGQ6OnR5cGVfaW5mbyogX190eXBlKQorICAgIDogX19wYmFzZV90eXBlX2luZm8gKF9fbiwgX19xdWFscywgX190eXBlKSB7IH0KKworCisgICAgdmlydHVhbAorICAgIH5fX3BvaW50ZXJfdHlwZV9pbmZvKCk7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIEltcGxlbWVudGF0aW9uIGRlZmluZWQgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX2lzX3BvaW50ZXJfcCgpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sCisgICAgX19wb2ludGVyX2NhdGNoKGNvbnN0IF9fcGJhc2VfdHlwZV9pbmZvKiBfX3Rocl90eXBlLCB2b2lkKiogX190aHJfb2JqLAorCQkgICAgdW5zaWduZWQgX19vdXRlcikgY29uc3Q7CisgIH07CisKKyAgY2xhc3MgX19jbGFzc190eXBlX2luZm87CisKKyAgLy8gVHlwZSBpbmZvcm1hdGlvbiBmb3IgYSBwb2ludGVyIHRvIG1lbWJlciB2YXJpYWJsZS4KKyAgY2xhc3MgX19wb2ludGVyX3RvX21lbWJlcl90eXBlX2luZm8gOiBwdWJsaWMgX19wYmFzZV90eXBlX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgX19jbGFzc190eXBlX2luZm8qIF9fY29udGV4dDsgICAvLyBDbGFzcyBvZiB0aGUgbWVtYmVyLgorCisgICAgZXhwbGljaXQKKyAgICBfX3BvaW50ZXJfdG9fbWVtYmVyX3R5cGVfaW5mbyhjb25zdCBjaGFyKiBfX24sIGludCBfX3F1YWxzLAorCQkJCSAgY29uc3Qgc3RkOjp0eXBlX2luZm8qIF9fdHlwZSwKKwkJCQkgIF9fY2xhc3NfdHlwZV9pbmZvKiBfX2tsYXNzKQorICAgIDogX19wYmFzZV90eXBlX2luZm8oX19uLCBfX3F1YWxzLCBfX3R5cGUpLCBfX2NvbnRleHQoX19rbGFzcykgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfl9fcG9pbnRlcl90b19tZW1iZXJfdHlwZV9pbmZvKCk7CisKKyAgcHJvdGVjdGVkOgorICAgIF9fcG9pbnRlcl90b19tZW1iZXJfdHlwZV9pbmZvKGNvbnN0IF9fcG9pbnRlcl90b19tZW1iZXJfdHlwZV9pbmZvJik7CisKKyAgICBfX3BvaW50ZXJfdG9fbWVtYmVyX3R5cGVfaW5mbyYKKyAgICBvcGVyYXRvcj0oY29uc3QgX19wb2ludGVyX3RvX21lbWJlcl90eXBlX2luZm8mKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIGRlZmluZWQgbWVtYmVyIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgYm9vbAorICAgIF9fcG9pbnRlcl9jYXRjaChjb25zdCBfX3BiYXNlX3R5cGVfaW5mbyogX190aHJfdHlwZSwgdm9pZCoqIF9fdGhyX29iaiwKKwkJICAgIHVuc2lnbmVkIF9fb3V0ZXIpIGNvbnN0OworICB9OworCisgIC8vIEhlbHBlciBjbGFzcyBmb3IgX192bWlfY2xhc3NfdHlwZS4KKyAgY2xhc3MgX19iYXNlX2NsYXNzX3R5cGVfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogCV9fYmFzZV90eXBlOyAgLy8gQmFzZSBjbGFzcyB0eXBlLgorI2lmZGVmIF9HTElCQ1hYX0xMUDY0CisgICAgbG9uZyBsb25nCQkJX19vZmZzZXRfZmxhZ3M7ICAvLyBPZmZzZXQgYW5kIGluZm8uCisjZWxzZQorICAgIGxvbmcgCQkJX19vZmZzZXRfZmxhZ3M7ICAvLyBPZmZzZXQgYW5kIGluZm8uCisjZW5kaWYKKworICAgIGVudW0gX19vZmZzZXRfZmxhZ3NfbWFza3MKKyAgICAgIHsKKwlfX3ZpcnR1YWxfbWFzayA9IDB4MSwKKwlfX3B1YmxpY19tYXNrID0gMHgyLAorCV9faHdtX2JpdCA9IDIsCisJX19vZmZzZXRfc2hpZnQgPSA4ICAgICAgICAgIC8vIEJpdHMgdG8gc2hpZnQgb2Zmc2V0LgorICAgICAgfTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIGRlZmluZWQgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgICBib29sCisgICAgX19pc192aXJ0dWFsX3AoKSBjb25zdAorICAgIHsgcmV0dXJuIF9fb2Zmc2V0X2ZsYWdzICYgX192aXJ0dWFsX21hc2s7IH0KKworICAgIGJvb2wKKyAgICBfX2lzX3B1YmxpY19wKCkgY29uc3QKKyAgICB7IHJldHVybiBfX29mZnNldF9mbGFncyAmIF9fcHVibGljX21hc2s7IH0KKworICAgIHB0cmRpZmZfdAorICAgIF9fb2Zmc2V0KCkgY29uc3QKKyAgICB7CisgICAgICAvLyBUaGlzIHNoaWZ0LCBiZWluZyBvZiBhIHNpZ25lZCB0eXBlLCBpcyBpbXBsZW1lbnRhdGlvbgorICAgICAgLy8gZGVmaW5lZC4gR0NDIGltcGxlbWVudHMgc3VjaCBzaGlmdHMgYXMgYXJpdGhtZXRpYywgd2hpY2ggaXMKKyAgICAgIC8vIHdoYXQgd2Ugd2FudC4KKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KF9fb2Zmc2V0X2ZsYWdzKSA+PiBfX29mZnNldF9zaGlmdDsKKyAgICB9CisgIH07CisKKyAgLy8gVHlwZSBpbmZvcm1hdGlvbiBmb3IgYSBjbGFzcy4KKyAgY2xhc3MgX19jbGFzc190eXBlX2luZm8gOiBwdWJsaWMgc3RkOjp0eXBlX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQKKyAgICBfX2NsYXNzX3R5cGVfaW5mbyAoY29uc3QgY2hhciAqX19uKSA6IHR5cGVfaW5mbyhfX24pIHsgfQorCisgICAgdmlydHVhbAorICAgIH5fX2NsYXNzX3R5cGVfaW5mbyAoKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZXMuCisgICAgLy8gVGhlIHR5cGUgc3ViX2tpbmQgdGVsbHMgdXMgYWJvdXQgaG93IGEgYmFzZSBvYmplY3QgaXMgY29udGFpbmVkCisgICAgLy8gd2l0aGluIGEgZGVyaXZlZCBvYmplY3QuIFdlIG9mdGVuIGRvIHRoaXMgbGF6aWx5LCBoZW5jZSB0aGUKKyAgICAvLyBVTktOT1dOIHZhbHVlLiBBdCBvdGhlciB0aW1lcyB3ZSBtYXkgdXNlIE5PVF9DT05UQUlORUQgdG8gbWVhbgorICAgIC8vIG5vdCBwdWJsaWNseSBjb250YWluZWQuCisgICAgZW51bSBfX3N1Yl9raW5kCisgICAgICB7CisJLy8gV2UgaGF2ZSBubyBpZGVhLgorCV9fdW5rbm93biA9IDAsCisKKwkvLyBOb3QgY29udGFpbmVkIHdpdGhpbiB1cyAoaW4gc29tZSBjaXJjdW1zdGFuY2VzIHRoaXMgbWlnaHQKKwkvLyBtZWFuIG5vdCBjb250YWluZWQgcHVibGljbHkpCisJX19ub3RfY29udGFpbmVkLAorCisJLy8gQ29udGFpbmVkIGFtYmlndW91c2x5LgorCV9fY29udGFpbmVkX2FtYmlnLAorCisJLy8gVmlhIGEgdmlydHVhbCBwYXRoLgorCV9fY29udGFpbmVkX3ZpcnR1YWxfbWFzayA9IF9fYmFzZV9jbGFzc190eXBlX2luZm86Ol9fdmlydHVhbF9tYXNrLAorCisJLy8gVmlhIGEgcHVibGljIHBhdGguCisJX19jb250YWluZWRfcHVibGljX21hc2sgPSBfX2Jhc2VfY2xhc3NfdHlwZV9pbmZvOjpfX3B1YmxpY19tYXNrLAorCisJLy8gQ29udGFpbmVkIHdpdGhpbiB1cy4KKwlfX2NvbnRhaW5lZF9tYXNrID0gMSA8PCBfX2Jhc2VfY2xhc3NfdHlwZV9pbmZvOjpfX2h3bV9iaXQsCisKKwlfX2NvbnRhaW5lZF9wcml2YXRlID0gX19jb250YWluZWRfbWFzaywKKwlfX2NvbnRhaW5lZF9wdWJsaWMgPSBfX2NvbnRhaW5lZF9tYXNrIHwgX19jb250YWluZWRfcHVibGljX21hc2sKKyAgICAgIH07CisKKyAgICBzdHJ1Y3QgX191cGNhc3RfcmVzdWx0OworICAgIHN0cnVjdCBfX2R5bmNhc3RfcmVzdWx0OworCisgIHByb3RlY3RlZDoKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG1lbWJlciBmdW5jdGlvbnMuCisgICAgdmlydHVhbCBib29sCisgICAgX19kb191cGNhc3QoY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fZHN0X3R5cGUsIHZvaWQqKl9fb2JqX3B0cikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX2RvX2NhdGNoKGNvbnN0IHR5cGVfaW5mbyogX190aHJfdHlwZSwgdm9pZCoqIF9fdGhyX29iaiwKKwkgICAgICAgdW5zaWduZWQgX19vdXRlcikgY29uc3Q7CisKKyAgcHVibGljOgorICAgIC8vIEhlbHBlciBmb3IgdXBjYXN0LiBTZWUgaWYgRFNUIGlzIHVzLCBvciBvbmUgb2Ygb3VyIGJhc2VzLgorICAgIC8vIFJldHVybiBmYWxzZSBpZiBub3QgZm91bmQsIHRydWUgaWYgZm91bmQuCisgICAgdmlydHVhbCBib29sCisgICAgX19kb191cGNhc3QoY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fZHN0LCBjb25zdCB2b2lkKiBfX29iaiwKKwkJX191cGNhc3RfcmVzdWx0JiBfX3Jlc3RyaWN0IF9fcmVzdWx0KSBjb25zdDsKKworICAgIC8vIEluZGljYXRlIHdoZXRoZXIgU1JDX1BUUiBvZiB0eXBlIFNSQ19UWVBFIGlzIGNvbnRhaW5lZCBwdWJsaWNseQorICAgIC8vIHdpdGhpbiBPQkpfUFRSLiBPQkpfUFRSIHBvaW50cyB0byBhIGJhc2Ugb2JqZWN0IG9mIG91ciB0eXBlLAorICAgIC8vIHdoaWNoIGlzIHRoZSBkZXN0aW5hdGlvbiB0eXBlLiBTUkMyRFNUIGluZGljYXRlcyBob3cgU1JDCisgICAgLy8gb2JqZWN0cyBtaWdodCBiZSBjb250YWluZWQgd2l0aGluIHRoaXMgdHlwZS4gIElmIFNSQ19QVFIgaXMgb25lCisgICAgLy8gb2Ygb3VyIFNSQ19UWVBFIGJhc2VzLCBpbmRpY2F0ZSB0aGUgdmlydHVhbGl0eS4gUmV0dXJucworICAgIC8vIG5vdF9jb250YWluZWQgZm9yIG5vbiBjb250YWlubWVudCBvciBwcml2YXRlIGNvbnRhaW5tZW50LgorICAgIGlubGluZSBfX3N1Yl9raW5kCisgICAgX19maW5kX3B1YmxpY19zcmMocHRyZGlmZl90IF9fc3JjMmRzdCwgY29uc3Qgdm9pZCogX19vYmpfcHRyLAorCQkgICAgICBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19zcmNfdHlwZSwKKwkJICAgICAgY29uc3Qgdm9pZCogX19zcmNfcHRyKSBjb25zdDsKKworICAgIC8vIEhlbHBlciBmb3IgZHluYW1pYyBjYXN0LiBBQ0NFU1NfUEFUSCBnaXZlcyB0aGUgYWNjZXNzIGZyb20gdGhlCisgICAgLy8gbW9zdCBkZXJpdmVkIG9iamVjdCB0byB0aGlzIGJhc2UuIERTVF9UWVBFIGluZGljYXRlcyB0aGUKKyAgICAvLyBkZXNpcmVkIHR5cGUgd2Ugd2FudC4gT0JKX1BUUiBwb2ludHMgdG8gYSBiYXNlIG9mIG91ciB0eXBlCisgICAgLy8gd2l0aGluIHRoZSBjb21wbGV0ZSBvYmplY3QuIFNSQ19UWVBFIGluZGljYXRlcyB0aGUgc3RhdGljIHR5cGUKKyAgICAvLyBzdGFydGVkIGZyb20gYW5kIFNSQ19QVFIgcG9pbnRzIHRvIHRoYXQgYmFzZSB3aXRoaW4gdGhlIG1vc3QKKyAgICAvLyBkZXJpdmVkIG9iamVjdC4gRmlsbCBpbiBSRVNVTFQgd2l0aCB3aGF0IHdlIGZpbmQuIFJldHVybiB0cnVlCisgICAgLy8gaWYgd2UgaGF2ZSBsb2NhdGVkIGFuIGFtYmlndW91cyBtYXRjaC4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX2RvX2R5bmNhc3QocHRyZGlmZl90IF9fc3JjMmRzdCwgX19zdWJfa2luZCBfX2FjY2Vzc19wYXRoLAorCQkgY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fZHN0X3R5cGUsIGNvbnN0IHZvaWQqIF9fb2JqX3B0ciwKKwkJIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX3NyY190eXBlLCBjb25zdCB2b2lkKiBfX3NyY19wdHIsCisJCSBfX2R5bmNhc3RfcmVzdWx0JiBfX3Jlc3VsdCkgY29uc3Q7CisKKyAgICAvLyBIZWxwZXIgZm9yIGZpbmRfcHVibGljX3N1Ym9iai4gU1JDMkRTVCBpbmRpY2F0ZXMgaG93IFNSQ19UWVBFCisgICAgLy8gYmFzZXMgYXJlIGluaGVyaXRlZCBieSB0aGUgdHlwZSBzdGFydGVkIGZyb20gLS0gd2hpY2ggaXMgbm90CisgICAgLy8gbmVjZXNzYXJpbHkgdGhlIGN1cnJlbnQgdHlwZS4gVGhlIGN1cnJlbnQgdHlwZSB3aWxsIGJlIGEgYmFzZQorICAgIC8vIG9mIHRoZSBkZXN0aW5hdGlvbiB0eXBlLiAgT0JKX1BUUiBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYmFzZS4KKyAgICB2aXJ0dWFsIF9fc3ViX2tpbmQKKyAgICBfX2RvX2ZpbmRfcHVibGljX3NyYyhwdHJkaWZmX3QgX19zcmMyZHN0LCBjb25zdCB2b2lkKiBfX29ial9wdHIsCisJCQkgY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fc3JjX3R5cGUsCisJCQkgY29uc3Qgdm9pZCogX19zcmNfcHRyKSBjb25zdDsKKyAgfTsKKworICAvLyBUeXBlIGluZm9ybWF0aW9uIGZvciBhIGNsYXNzIHdpdGggYSBzaW5nbGUgbm9uLXZpcnR1YWwgYmFzZS4KKyAgY2xhc3MgX19zaV9jbGFzc190eXBlX2luZm8gOiBwdWJsaWMgX19jbGFzc190eXBlX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fYmFzZV90eXBlOworCisgICAgZXhwbGljaXQKKyAgICBfX3NpX2NsYXNzX3R5cGVfaW5mbyhjb25zdCBjaGFyICpfX24sIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvICpfX2Jhc2UpCisgICAgOiBfX2NsYXNzX3R5cGVfaW5mbyhfX24pLCBfX2Jhc2VfdHlwZShfX2Jhc2UpIHsgfQorCisgICAgdmlydHVhbAorICAgIH5fX3NpX2NsYXNzX3R5cGVfaW5mbygpOworCisgIHByb3RlY3RlZDoKKyAgICBfX3NpX2NsYXNzX3R5cGVfaW5mbyhjb25zdCBfX3NpX2NsYXNzX3R5cGVfaW5mbyYpOworCisgICAgX19zaV9jbGFzc190eXBlX2luZm8mCisgICAgb3BlcmF0b3I9KGNvbnN0IF9fc2lfY2xhc3NfdHlwZV9pbmZvJik7CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG1lbWJlciBmdW5jdGlvbnMuCisgICAgdmlydHVhbCBib29sCisgICAgX19kb19keW5jYXN0KHB0cmRpZmZfdCBfX3NyYzJkc3QsIF9fc3ViX2tpbmQgX19hY2Nlc3NfcGF0aCwKKwkJIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX2RzdF90eXBlLCBjb25zdCB2b2lkKiBfX29ial9wdHIsCisJCSBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19zcmNfdHlwZSwgY29uc3Qgdm9pZCogX19zcmNfcHRyLAorCQkgX19keW5jYXN0X3Jlc3VsdCYgX19yZXN1bHQpIGNvbnN0OworCisgICAgdmlydHVhbCBfX3N1Yl9raW5kCisgICAgX19kb19maW5kX3B1YmxpY19zcmMocHRyZGlmZl90IF9fc3JjMmRzdCwgY29uc3Qgdm9pZCogX19vYmpfcHRyLAorCQkJIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX3NyY190eXBlLAorCQkJIGNvbnN0IHZvaWQqIF9fc3ViX3B0cikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX2RvX3VwY2FzdChjb25zdCBfX2NsYXNzX3R5cGVfaW5mbypfX2RzdCwgY29uc3Qgdm9pZCpfX29iaiwKKwkJX191cGNhc3RfcmVzdWx0JiBfX3Jlc3RyaWN0IF9fcmVzdWx0KSBjb25zdDsKKyAgfTsKKworICAvLyBUeXBlIGluZm9ybWF0aW9uIGZvciBhIGNsYXNzIHdpdGggbXVsdGlwbGUgYW5kL29yIHZpcnR1YWwgYmFzZXMuCisgIGNsYXNzIF9fdm1pX2NsYXNzX3R5cGVfaW5mbyA6IHB1YmxpYyBfX2NsYXNzX3R5cGVfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICB1bnNpZ25lZCBpbnQgCQlfX2ZsYWdzOyAgLy8gRGV0YWlscyBhYm91dCB0aGUgY2xhc3MgaGllcmFyY2h5LgorICAgIHVuc2lnbmVkIGludCAJCV9fYmFzZV9jb3VudDsgIC8vIE51bWJlciBvZiBkaXJlY3QgYmFzZXMuCisKKyAgICAvLyBUaGUgYXJyYXkgb2YgYmFzZXMgdXNlcyB0aGUgdHJhaWxpbmcgYXJyYXkgc3RydWN0IGhhY2sgc28gdGhpcworICAgIC8vIGNsYXNzIGlzIG5vdCBjb25zdHJ1Y3RhYmxlIHdpdGggYSBub3JtYWwgY29uc3RydWN0b3IuIEl0IGlzCisgICAgLy8gaW50ZXJuYWxseSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLgorICAgIF9fYmFzZV9jbGFzc190eXBlX2luZm8gCV9fYmFzZV9pbmZvWzFdOyAgLy8gQXJyYXkgb2YgYmFzZXMuCisKKyAgICBleHBsaWNpdAorICAgIF9fdm1pX2NsYXNzX3R5cGVfaW5mbyhjb25zdCBjaGFyKiBfX24sIGludCBfX19mbGFncykKKyAgICA6IF9fY2xhc3NfdHlwZV9pbmZvKF9fbiksIF9fZmxhZ3MoX19fZmxhZ3MpLCBfX2Jhc2VfY291bnQoMCkgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfl9fdm1pX2NsYXNzX3R5cGVfaW5mbygpOworCisgICAgLy8gSW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlcy4KKyAgICBlbnVtIF9fZmxhZ3NfbWFza3MKKyAgICAgIHsKKwlfX25vbl9kaWFtb25kX3JlcGVhdF9tYXNrID0gMHgxLCAvLyBEaXN0aW5jdCBpbnN0YW5jZSBvZiByZXBlYXRlZCBiYXNlLgorCV9fZGlhbW9uZF9zaGFwZWRfbWFzayA9IDB4MiwgLy8gRGlhbW9uZCBzaGFwZWQgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCisJX19mbGFnc191bmtub3duX21hc2sgPSAweDEwCisgICAgICB9OworCisgIHByb3RlY3RlZDoKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG1lbWJlciBmdW5jdGlvbnMuCisgICAgdmlydHVhbCBib29sCisgICAgX19kb19keW5jYXN0KHB0cmRpZmZfdCBfX3NyYzJkc3QsIF9fc3ViX2tpbmQgX19hY2Nlc3NfcGF0aCwKKwkJIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX2RzdF90eXBlLCBjb25zdCB2b2lkKiBfX29ial9wdHIsCisJCSBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19zcmNfdHlwZSwgY29uc3Qgdm9pZCogX19zcmNfcHRyLAorCQkgX19keW5jYXN0X3Jlc3VsdCYgX19yZXN1bHQpIGNvbnN0OworCisgICAgdmlydHVhbCBfX3N1Yl9raW5kCisgICAgX19kb19maW5kX3B1YmxpY19zcmMocHRyZGlmZl90IF9fc3JjMmRzdCwgY29uc3Qgdm9pZCogX19vYmpfcHRyLAorCQkJIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX3NyY190eXBlLAorCQkJIGNvbnN0IHZvaWQqIF9fc3JjX3B0cikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX2RvX3VwY2FzdChjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19kc3QsIGNvbnN0IHZvaWQqIF9fb2JqLAorCQlfX3VwY2FzdF9yZXN1bHQmIF9fcmVzdHJpY3QgX19yZXN1bHQpIGNvbnN0OworICB9OworCisgIC8vIEV4Y2VwdGlvbiBoYW5kbGluZyBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KKyAgc3RydWN0IF9fY3hhX2V4Y2VwdGlvbjsKKyAgc3RydWN0IF9fY3hhX3JlZmNvdW50ZWRfZXhjZXB0aW9uOworICBzdHJ1Y3QgX19jeGFfZGVwZW5kZW50X2V4Y2VwdGlvbjsKKyAgc3RydWN0IF9fY3hhX2VoX2dsb2JhbHM7CisKKyAgZXh0ZXJuICJDIgorICB7CisgIC8vIER5bmFtaWMgY2FzdCBydW50aW1lLgorCisgIC8vIHNyYzJkc3QgaGFzIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgdmFsdWVzCisgIC8vICA+LTE6IHNyY190eXBlIGlzIGEgdW5pcXVlIHB1YmxpYyBub24tdmlydHVhbCBiYXNlIG9mIGRzdF90eXBlCisgIC8vICAgICAgIGRzdF9wdHIgKyBzcmMyZHN0ID09IHNyY19wdHIKKyAgLy8gICAtMTogdW5zcGVjaWZpZWQgcmVsYXRpb25zaGlwCisgIC8vICAgLTI6IHNyY190eXBlIGlzIG5vdCBhIHB1YmxpYyBiYXNlIG9mIGRzdF90eXBlCisgIC8vICAgLTM6IHNyY190eXBlIGlzIGEgbXVsdGlwbGUgcHVibGljIG5vbi12aXJ0dWFsIGJhc2Ugb2YgZHN0X3R5cGUKKyAgdm9pZCoKKyAgX19keW5hbWljX2Nhc3QoY29uc3Qgdm9pZCogX19zcmNfcHRyLCAvLyBTdGFydGluZyBvYmplY3QuCisJCSBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19zcmNfdHlwZSwgLy8gU3RhdGljIHR5cGUgb2Ygb2JqZWN0LgorCQkgY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fZHN0X3R5cGUsIC8vIERlc2lyZWQgdGFyZ2V0IHR5cGUuCisJCSBwdHJkaWZmX3QgX19zcmMyZHN0KTsgLy8gSG93IHNyYyBhbmQgZHN0IGFyZSByZWxhdGVkLgorCisKKyAgLy8gRXhjZXB0aW9uIGhhbmRsaW5nIHJ1bnRpbWUuCisKKyAgLy8gVGhlIF9fY3hhX2VoX2dsb2JhbHMgZm9yIHRoZSBjdXJyZW50IHRocmVhZCBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcKKyAgLy8gZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zLiAgVGhlICJmYXN0IiB2ZXJzaW9uIGFzc3VtZXMgYXQgbGVhc3QKKyAgLy8gb25lIHByaW9yIGNhbGwgb2YgX19jeGFfZ2V0X2dsb2JhbHMgaGFzIGJlZW4gbWFkZSBmcm9tIHRoZSBjdXJyZW50CisgIC8vIHRocmVhZCwgc28gbm8gaW5pdGlhbGl6YXRpb24gaXMgbmVjZXNzYXJ5LgorICBfX2N4YV9laF9nbG9iYWxzKgorICBfX2N4YV9nZXRfZ2xvYmFscygpIF9HTElCQ1hYX05PVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisgIF9fY3hhX2VoX2dsb2JhbHMqCisgIF9fY3hhX2dldF9nbG9iYWxzX2Zhc3QoKSBfR0xJQkNYWF9OT1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworICAvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwcmltYXJ5IGV4Y2VwdGlvbiBwbHVzIHRoZSB0aHJvd24gb2JqZWN0LgorICB2b2lkKgorICBfX2N4YV9hbGxvY2F0ZV9leGNlcHRpb24oc2l6ZV90KSBfR0xJQkNYWF9OT1RIUk9XOworCisgIC8vIEZyZWUgdGhlIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIHByaW1hcnkgZXhjZXB0aW9uLgorICB2b2lkIAorICBfX2N4YV9mcmVlX2V4Y2VwdGlvbih2b2lkKikgX0dMSUJDWFhfTk9USFJPVzsKKworICAvLyBUaHJvdyB0aGUgZXhjZXB0aW9uLgorICB2b2lkCisgIF9fY3hhX3Rocm93KHZvaWQqLCBzdGQ6OnR5cGVfaW5mbyosIHZvaWQgKF9HTElCQ1hYX0NEVE9SX0NBTExBQkkgKikgKHZvaWQgKikpCisgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIC8vIFVzZWQgdG8gaW1wbGVtZW50IGV4Y2VwdGlvbiBoYW5kbGVycy4KKyAgdm9pZCoKKyAgX19jeGFfZ2V0X2V4Y2VwdGlvbl9wdHIodm9pZCopIF9HTElCQ1hYX05PVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisKKyAgdm9pZCoKKyAgX19jeGFfYmVnaW5fY2F0Y2godm9pZCopIF9HTElCQ1hYX05PVEhST1c7CisKKyAgdm9pZCAKKyAgX19jeGFfZW5kX2NhdGNoKCk7CisKKyAgdm9pZCAKKyAgX19jeGFfcmV0aHJvdygpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIC8vIFJldHVybnMgdGhlIHR5cGVfaW5mbyBmb3IgdGhlIGN1cnJlbnRseSBoYW5kbGVkIGV4Y2VwdGlvbiBbMTUuMy84XSwgb3IKKyAgLy8gbnVsbCBpZiB0aGVyZSBpcyBub25lLgorICBzdGQ6OnR5cGVfaW5mbyoKKyAgX19jeGFfY3VycmVudF9leGNlcHRpb25fdHlwZSgpIF9HTElCQ1hYX05PVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisKKyAgLy8gR05VIEV4dGVuc2lvbnMuCisKKyAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBhIGRlcGVuZGVudCBleGNlcHRpb24uCisgIF9fY3hhX2RlcGVuZGVudF9leGNlcHRpb24qCisgIF9fY3hhX2FsbG9jYXRlX2RlcGVuZGVudF9leGNlcHRpb24oKSBfR0xJQkNYWF9OT1RIUk9XOworCisgIC8vIEZyZWUgdGhlIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIGRlcGVuZGVudCBleGNlcHRpb24uCisgIHZvaWQKKyAgX19jeGFfZnJlZV9kZXBlbmRlbnRfZXhjZXB0aW9uKF9fY3hhX2RlcGVuZGVudF9leGNlcHRpb24qKSBfR0xJQkNYWF9OT1RIUk9XOworCisgIH0gLy8gZXh0ZXJuICJDIgorCisgIC8vIEEgbWFnaWMgcGxhY2Vob2xkZXIgY2xhc3MgdGhhdCBjYW4gYmUgY2F1Z2h0IGJ5IHJlZmVyZW5jZQorICAvLyB0byByZWNvZ25pemUgZm9yZWlnbiBleGNlcHRpb25zLgorICBjbGFzcyBfX2ZvcmVpZ25fZXhjZXB0aW9uCisgIHsKKyAgICB2aXJ0dWFsIH5fX2ZvcmVpZ25fZXhjZXB0aW9uKCkgdGhyb3coKTsKKyAgICB2aXJ0dWFsIHZvaWQgX19wdXJlX2R1bW15KCkgPSAwOyAvLyBwcmV2ZW50IGNhdGNoIGJ5IHZhbHVlCisgIH07CisKK30gLy8gbmFtZXNwYWNlIF9fY3h4YWJpdjEKKworLyoqIEBuYW1lc3BhY2UgYWJpCisgKiAgQGJyaWVmIFRoZSBjcm9zcy12ZW5kb3IgQysrIEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UuIEEKKyAqICBuYW1lc3BhY2UgYWxpYXMgdG8gX19jeHhhYml2MSwgYnV0IHVzZXIgcHJvZ3JhbXMgc2hvdWxkIHVzZSB0aGUKKyAqICBhbGlhcyAnYWJpJy4KKyAqCisgKiAgQSBicmllZiBvdmVydmlldyBvZiBhbiBBQkkgaXMgZ2l2ZW4gaW4gdGhlIGxpYnN0ZGMrKyBGQVEsIHF1ZXN0aW9uCisgKiAgNS44ICh5b3UgbWF5IGhhdmUgYSBjb3B5IG9mIHRoZSBGQVEgbG9jYWxseSwgb3IgeW91IGNhbiB2aWV3IHRoZSBvbmxpbmUKKyAqICB2ZXJzaW9uIGF0IGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9mYXEuaHRtbCM1XzggKS4KKyAqCisgKiAgR0NDIHN1YnNjcmliZXMgdG8gYSBjcm9zcy12ZW5kb3IgQUJJIGZvciBDKyssIHNvbWV0aW1lcworICogIGNhbGxlZCB0aGUgSUE2NCBBQkkgYmVjYXVzZSBpdCBoYXBwZW5zIHRvIGJlIHRoZSBuYXRpdmUgQUJJIGZvciB0aGF0CisgKiAgcGxhdGZvcm0uICBJdCBpcyBzdW1tYXJpemVkIGF0IGh0dHA6Ly93d3cuY29kZXNvdXJjZXJ5LmNvbS9jeHgtYWJpLworICogIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiAgRm9yIHVzZXJzIG9mIEdDQyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMy54LCBlbnRyeSBwb2ludHMgYXJlCisgKiAgYXZhaWxhYmxlIGluIDxjeHhhYmkuaD4sIHdoaWNoIG5vdGVzLCA8ZW0+J0l0IGlzIG5vdCBub3JtYWxseQorICogIG5lY2Vzc2FyeSBmb3IgdXNlciBwcm9ncmFtcyB0byBpbmNsdWRlIHRoaXMgaGVhZGVyLCBvciB1c2UgdGhlCisgKiAgZW50cnkgcG9pbnRzIGRpcmVjdGx5LiAgSG93ZXZlciwgdGhpcyBoZWFkZXIgaXMgYXZhaWxhYmxlIHNob3VsZAorICogIHRoYXQgYmUgbmVlZGVkLic8L2VtPgorKi8KK25hbWVzcGFjZSBhYmkgPSBfX2N4eGFiaXYxOworCituYW1lc3BhY2UgX19nbnVfY3h4Cit7CisgIC8qKgorICAgKiAgQGJyaWVmIEV4Y2VwdGlvbiB0aHJvd24gYnkgX19jeGFfZ3VhcmRfYWNxdWlyZS4KKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICoKKyAgICogIDYuN1tzdG10LmRjbF0vNDogSWYgY29udHJvbCByZS1lbnRlcnMgdGhlIGRlY2xhcmF0aW9uIChyZWN1cnNpdmVseSkKKyAgICogIHdoaWxlIHRoZSBvYmplY3QgaXMgYmVpbmcgaW5pdGlhbGl6ZWQsIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCisgICAqCisgICAqICBTaW5jZSB3ZSBhbHJlYWR5IGhhdmUgYSBsaWJyYXJ5IGZ1bmN0aW9uIHRvIGhhbmRsZSBsb2NraW5nLCB3ZSBtaWdodAorICAgKiAgYXMgd2VsbCBjaGVjayBmb3IgdGhpcyBzaXR1YXRpb24gYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICogIFdlIHVzZSB0aGUgc2Vjb25kIGJ5dGUgb2YgdGhlIGd1YXJkIHZhcmlhYmxlIHRvIHJlbWVtYmVyIHRoYXQgd2UncmUKKyAgICogIGluIHRoZSBtaWRkbGUgb2YgYW4gaW5pdGlhbGl6YXRpb24uCisgICAqLworICBjbGFzcyByZWN1cnNpdmVfaW5pdF9lcnJvcjogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCisgIHsKKyAgcHVibGljOgorICAgIHJlY3Vyc2l2ZV9pbml0X2Vycm9yKCkgdGhyb3coKSB7IH0KKyAgICB2aXJ0dWFsIH5yZWN1cnNpdmVfaW5pdF9lcnJvcigpIHRocm93ICgpOworICB9OworfQorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcG9wCisKKyNlbmRpZiAvLyBfX0NYWEFCSV9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2FycmF5IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9hcnJheQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2UxMGNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9hcnJheQpAQCAtMCwwICsxLDMwNSBAQAorLy8gRGVidWdnaW5nIGFycmF5IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9hcnJheQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19BUlJBWQorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19BUlJBWSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGRlYnVnL3NhZmVfc2VxdWVuY2UuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBzdHJ1Y3QgYXJyYXkKKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCAJICAgIAkJCSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUqCQkJICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgIAkgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgIAkgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCAgICAgICAgICAgICAgICAgICAgCSAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgCSAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPgkgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gU3VwcG9ydCBmb3IgemVyby1zaXplZCBhcnJheXMgbWFuZGF0b3J5LgorICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6X19hcnJheV90cmFpdHM8X1RwLCBfTm0+IF9BVF9UeXBlOworICAgICAgdHlwZW5hbWUgX0FUX1R5cGU6Ol9UeXBlICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2VsZW1zOworCisgICAgICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfU2l6ZT4KKwlzdHJ1Y3QgX0FycmF5X2NoZWNrX3N1YnNjcmlwdAorIAl7CisJICBzdGQ6OnNpemVfdCBzaXplKCkgeyByZXR1cm4gX1NpemU7IH0KKworCSAgX0FycmF5X2NoZWNrX3N1YnNjcmlwdChzdGQ6OnNpemVfdCBfX2luZGV4KQorCSAgeyBfX2dsaWJjeHhfY2hlY2tfc3Vic2NyaXB0KF9faW5kZXgpOyB9CisgICAgICAgIH07CisKKyAgICAgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9TaXplPgorCXN0cnVjdCBfQXJyYXlfY2hlY2tfbm9uZW1wdHkKKyAJeworCSAgYm9vbCBlbXB0eSgpIHsgcmV0dXJuIF9TaXplID09IDA7IH0KKworCSAgX0FycmF5X2NoZWNrX25vbmVtcHR5KCkKKwkgIHsgX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7IH0KKyAgICAgICAgfTsKKworICAgICAgLy8gTm8gZXhwbGljaXQgY29uc3RydWN0L2NvcHkvZGVzdHJveSBmb3IgYWdncmVnYXRlIHR5cGUuCisKKyAgICAgIC8vIERSIDc3Ni4KKyAgICAgIHZvaWQKKyAgICAgIGZpbGwoY29uc3QgdmFsdWVfdHlwZSYgX191KQorICAgICAgeyBzdGQ6OmZpbGxfbihiZWdpbigpLCBzaXplKCksIF9fdSk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChhcnJheSYgX19vdGhlcikKKyAgICAgIG5vZXhjZXB0KG5vZXhjZXB0KHN3YXAoc3RkOjpkZWNsdmFsPF9UcCY+KCksIHN0ZDo6ZGVjbHZhbDxfVHAmPigpKSkpCisgICAgICB7IHN0ZDo6c3dhcF9yYW5nZXMoYmVnaW4oKSwgZW5kKCksIF9fb3RoZXIuYmVnaW4oKSk7IH0KKworICAgICAgLy8gSXRlcmF0b3JzLgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKGRhdGEoKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGRhdGEoKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihkYXRhKCkgKyBfTm0pOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpICsgX05tKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmJlZ2luKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgCisgICAgICByYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIHJlbmQoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihkYXRhKCkgKyBfTm0pOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIC8vIENhcGFjaXR5LgorICAgICAgY29uc3RleHByIHNpemVfdHlwZSAKKyAgICAgIHNpemUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBfTm07IH0KKworICAgICAgY29uc3RleHByIHNpemVfdHlwZSAKKyAgICAgIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gX05tOyB9CisKKyAgICAgIGNvbnN0ZXhwciBib29sIAorICAgICAgZW1wdHkoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorCisgICAgICAvLyBFbGVtZW50IGFjY2Vzcy4KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19zdWJzY3JpcHQoX19uKTsKKwlyZXR1cm4gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgX19uKTsKKyAgICAgIH0KKworICAgICAgY29uc3RleHByIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBfX24gPCBfTm0gPyBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCBfX24pCisJIDogKF9HTElCQ1hYX1RIUk9XX09SX0FCT1JUKF9BcnJheV9jaGVja19zdWJzY3JpcHQ8X05tPihfX24pKSwKKwkgICAgX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgMCkpOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fbiA+PSBfTm0pCisJICBzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYXJyYXk6OmF0IikpOworCXJldHVybiBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCBfX24pOworICAgICAgfQorCisgICAgICBjb25zdGV4cHIgY29uc3RfcmVmZXJlbmNlCisgICAgICBhdChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeworCS8vIFJlc3VsdCBvZiBjb25kaXRpb25hbCBleHByZXNzaW9uIG11c3QgYmUgYW4gbHZhbHVlIHNvIHVzZQorCS8vIGJvb2xlYW4gPyBsdmFsdWUgOiAodGhyb3ctZXhwciwgbHZhbHVlKQorCXJldHVybiBfX24gPCBfTm0gPyBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCBfX24pCisJICA6IChzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYXJyYXk6OmF0IikpLAorCSAgICAgX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgMCkpOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UgCisgICAgICBmcm9udCgpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuICpiZWdpbigpOworICAgICAgfQorCisgICAgICBjb25zdGV4cHIgY29uc3RfcmVmZXJlbmNlIAorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeworCXJldHVybiBfTm0gPyBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCAwKQorCSAgOiAoX0dMSUJDWFhfVEhST1dfT1JfQUJPUlQoX0FycmF5X2NoZWNrX25vbmVtcHR5PF9ObT4oKSksCisJICAgICBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCAwKSk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZSAKKyAgICAgIGJhY2soKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfTm0gPyAqKGVuZCgpIC0gMSkgOiAqZW5kKCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0ZXhwciBjb25zdF9yZWZlcmVuY2UgCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX05tID8gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgX05tIC0gMSkKKwkgIDogKF9HTElCQ1hYX1RIUk9XX09SX0FCT1JUKF9BcnJheV9jaGVja19ub25lbXB0eTxfTm0+KCkpLAorCSAgICAgX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgMCkpOworICAgICAgfQorCisgICAgICBwb2ludGVyCisgICAgICBkYXRhKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgMCkpOyB9CisKKyAgICAgIGNvbnN0X3BvaW50ZXIKKyAgICAgIGRhdGEoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCAwKSk7IH0KKyAgICB9OworCisgIC8vIEFycmF5IGNvbXBhcmlzb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbCAKKyAgICBvcGVyYXRvcj09KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gc3RkOjplcXVhbChfX29uZS5iZWdpbigpLCBfX29uZS5lbmQoKSwgX190d28uYmVnaW4oKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiAhKF9fb25lID09IF9fdHdvKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19hLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fYikKKyAgICB7IAorICAgICAgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX19hLmJlZ2luKCksIF9fYS5lbmQoKSwKKwkJCQkJICBfX2IuYmVnaW4oKSwgX19iLmVuZCgpKTsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gX190d28gPCBfX29uZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuICEoX19vbmUgPiBfX3R3byk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiAhKF9fb25lIDwgX190d28pOyB9CisKKyAgLy8gU3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgbm9leGNlcHQobm9leGNlcHQoX19vbmUuc3dhcChfX3R3bykpKQorICAgIHsgX19vbmUuc3dhcChfX3R3byk7IH0KKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW50LCB0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBjb25zdGV4cHIgX1RwJgorICAgIGdldChhcnJheTxfVHAsIF9ObT4mIF9fYXJyKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX0ludCA8IF9ObSwgImluZGV4IGlzIG91dCBvZiBib3VuZHMiKTsKKyAgICAgIHJldHVybiBfR0xJQkNYWF9TVERfQzo6X19hcnJheV90cmFpdHM8X1RwLCBfTm0+OjoKKwlfU19yZWYoX19hcnIuX01fZWxlbXMsIF9JbnQpOworICAgIH0KKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW50LCB0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBjb25zdGV4cHIgX1RwJiYKKyAgICBnZXQoYXJyYXk8X1RwLCBfTm0+JiYgX19hcnIpIG5vZXhjZXB0CisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChfSW50IDwgX05tLCAiaW5kZXggaXMgb3V0IG9mIGJvdW5kcyIpOworICAgICAgcmV0dXJuIHN0ZDo6bW92ZShnZXQ8X0ludD4oX19hcnIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgY29uc3RleHByIGNvbnN0IF9UcCYKKyAgICBnZXQoY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX2Fycikgbm9leGNlcHQKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9JbnQgPCBfTm0sICJpbmRleCBpcyBvdXQgb2YgYm91bmRzIik7CisgICAgICByZXR1cm4gX0dMSUJDWFhfU1REX0M6Ol9fYXJyYXlfdHJhaXRzPF9UcCwgX05tPjo6CisJX1NfcmVmKF9fYXJyLl9NX2VsZW1zLCBfSW50KTsKKyAgICB9Cit9IC8vIG5hbWVzcGFjZSBfX2RlYnVnCisKKyAgLy8gVHVwbGUgaW50ZXJmYWNlIHRvIGNsYXNzIHRlbXBsYXRlIGFycmF5LgorCisgIC8vLyB0dXBsZV9zaXplCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIHN0cnVjdCB0dXBsZV9zaXplPF9fZGVidWc6OmFycmF5PF9UcCwgX05tPj4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgX05tPiB7IH07CisKKyAgLy8vIHR1cGxlX2VsZW1lbnQKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8X0ludCwgX19kZWJ1Zzo6YXJyYXk8X1RwLCBfTm0+PgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX0ludCA8IF9ObSwgImluZGV4IGlzIG91dCBvZiBib3VuZHMiKTsKKyAgICAgIHR5cGVkZWYgX1RwIHR5cGU7CisgICAgfTsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0dMSUJDWFhfREVCVUdfQVJSQVkKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvYml0c2V0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9iaXRzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkOTE4NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvYml0c2V0CkBAIC0wLDAgKzEsNDI2IEBACisvLyBEZWJ1Z2dpbmcgYml0c2V0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9iaXRzZXQKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX0JJVFNFVAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19CSVRTRVQKKworI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX2RlYnVnCit7CisgIC8vLyBDbGFzcyBzdGQ6OmJpdHNldCB3aXRoIGFkZGl0aW9uYWwgc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBjbGFzcyBiaXRzZXQKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6Yml0c2V0PF9OYj4KKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgICAsIHB1YmxpYyBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2VfYmFzZQorI2VuZGlmCisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6Yml0c2V0PF9OYj4gX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBJbiBDKysweCB3ZSByZWx5IG9uIG5vcm1hbCByZWZlcmVuY2UgdHlwZSB0byBwcmVzZXJ2ZSB0aGUgcHJvcGVydHkKKyAgICAgIC8vIG9mIGJpdHNldCB0byBiZSB1c2UgYXMgYSBsaXRlcmFsLgorICAgICAgLy8gVE9ETzogRmluZCBhbm90aGVyIHNvbHV0aW9uLgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisjZWxzZQorICAgICAgLy8gYml0IHJlZmVyZW5jZToKKyAgICAgIGNsYXNzIHJlZmVyZW5jZQorICAgICAgOiBwcml2YXRlIF9CYXNlOjpyZWZlcmVuY2UKKyAgICAgICAgLCBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yX2Jhc2UKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgX0Jhc2VfcmVmOworCisJZnJpZW5kIGNsYXNzIGJpdHNldDsKKwlyZWZlcmVuY2UoKTsKKworCXJlZmVyZW5jZShjb25zdCBfQmFzZV9yZWYmIF9fYmFzZSwKKwkJICBiaXRzZXQqIF9fc2VxIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSkgX0dMSUJDWFhfTk9FWENFUFQKKwk6IF9CYXNlX3JlZihfX2Jhc2UpCisJLCBfU2FmZV9pdGVyYXRvcl9iYXNlKF9fc2VxLCBmYWxzZSkKKwl7IH0KKworICAgICAgcHVibGljOgorCXJlZmVyZW5jZShjb25zdCByZWZlcmVuY2UmIF9feCkgX0dMSUJDWFhfTk9FWENFUFQKKwk6IF9CYXNlX3JlZihfX3gpCisJLCBfU2FmZV9pdGVyYXRvcl9iYXNlKF9feCwgZmFsc2UpCisJeyB9CisKKwlyZWZlcmVuY2UmCisJb3BlcmF0b3I9KGJvb2wgX194KSBfR0xJQkNYWF9OT0VYQ0VQVAorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIHRoaXMtPl9NX3Npbmd1bGFyKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19iYWRfYml0c2V0X3dyaXRlKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCSAgKnN0YXRpY19jYXN0PF9CYXNlX3JlZio+KHRoaXMpID0gX194OworCSAgcmV0dXJuICp0aGlzOworCX0KKworCXJlZmVyZW5jZSYKKwlvcGVyYXRvcj0oY29uc3QgcmVmZXJlbmNlJiBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisJeworCSAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX194Ll9NX3Npbmd1bGFyKCksCisJCQkgICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfYmFkX2JpdHNldF9yZWFkKQorCQkJCS5fTV9pdGVyYXRvcihfX3gpKTsKKwkgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIHRoaXMtPl9NX3Npbmd1bGFyKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19iYWRfYml0c2V0X3dyaXRlKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCSAgKnN0YXRpY19jYXN0PF9CYXNlX3JlZio+KHRoaXMpID0gX194OworCSAgcmV0dXJuICp0aGlzOworCX0KKworCWJvb2wKKwlvcGVyYXRvcn4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIHRoaXMtPl9NX3Npbmd1bGFyKCksCisJCQkgICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfYmFkX2JpdHNldF9yZWFkKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCSAgcmV0dXJuIH4oKnN0YXRpY19jYXN0PGNvbnN0IF9CYXNlX3JlZio+KHRoaXMpKTsKKwl9CisKKwlvcGVyYXRvciBib29sKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKwl7CisJICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISB0aGlzLT5fTV9zaW5ndWxhcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfYmFkX2JpdHNldF9yZWFkKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCSAgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfQmFzZV9yZWYqPih0aGlzKTsKKwl9CisKKwlyZWZlcmVuY2UmCisJZmxpcCgpIF9HTElCQ1hYX05PRVhDRVBUCisJeworCSAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgdGhpcy0+X01fc2luZ3VsYXIoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2JhZF9iaXRzZXRfZmxpcCkKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMpKTsKKwkgIF9CYXNlX3JlZjo6ZmxpcCgpOworCSAgcmV0dXJuICp0aGlzOworCX0KKyAgICAgIH07CisjZW5kaWYKKworICAgICAgLy8gMjMuMy41LjEgY29uc3RydWN0b3JzOgorICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGJpdHNldCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICA6IF9CYXNlKCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdGV4cHIgYml0c2V0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCkgbm9leGNlcHQKKyNlbHNlCisgICAgICBiaXRzZXQodW5zaWduZWQgbG9uZyBfX3ZhbCkKKyNlbmRpZgorICAgICAgOiBfQmFzZShfX3ZhbCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBiaXRzZXQoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3N0ciwKKwkgICAgICAgdHlwZW5hbWUgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKwkgICAgICAgX19wb3MgPSAwLAorCSAgICAgICB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorCSAgICAgICBfX24gPSAoc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpucG9zKSkKKwk6IF9CYXNlKF9fc3RyLCBfX3BvcywgX19uKSB7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzk2LiB3aGF0IGFyZSBjaGFyYWN0ZXJzIHplcm8gYW5kIG9uZS4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorCWJpdHNldChjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fc3RyLAorCSAgICAgICB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorCSAgICAgICBfX3BvcywKKwkgICAgICAgdHlwZW5hbWUgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKwkgICAgICAgX19uLAorCSAgICAgICBfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkKKwk6IF9CYXNlKF9fc3RyLCBfX3BvcywgX19uLCBfX3plcm8sIF9fb25lKSB7IH0KKworICAgICAgYml0c2V0KGNvbnN0IF9CYXNlJiBfX3gpIDogX0Jhc2UoX194KSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgYml0c2V0KGNvbnN0IF9DaGFyVCogX19zdHIsCisJICAgICAgIHR5cGVuYW1lIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVD46OnNpemVfdHlwZSBfX24KKwkgICAgICAgPSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQ+OjpucG9zLAorCSAgICAgICBfQ2hhclQgX196ZXJvID0gX0NoYXJUKCcwJyksIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKQorCTogX0Jhc2UoX19zdHIsIF9fbiwgX196ZXJvLCBfX29uZSkgeyB9CisjZW5kaWYKKworICAgICAgLy8gMjMuMy41LjIgYml0c2V0IG9wZXJhdGlvbnM6CisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yJj0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9NX2Jhc2UoKSAmPSBfX3JoczsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3J8PShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX01fYmFzZSgpIHw9IF9fcmhzOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvcl49KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfTV9iYXNlKCkgXj0gX19yaHM7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yPDw9KHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfTV9iYXNlKCkgPDw9IF9fcG9zOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvcj4+PShzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX01fYmFzZSgpID4+PSBfX3BvczsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgc2V0KCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfQmFzZTo6c2V0KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxODYuIGJpdHNldDo6c2V0KCkgc2Vjb25kIHBhcmFtZXRlciBzaG91bGQgYmUgYm9vbAorICAgICAgYml0c2V0PF9OYj4mCisgICAgICBzZXQoc2l6ZV90IF9fcG9zLCBib29sIF9fdmFsID0gdHJ1ZSkKKyAgICAgIHsKKwlfQmFzZTo6c2V0KF9fcG9zLCBfX3ZhbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIHJlc2V0KCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfQmFzZTo6cmVzZXQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgcmVzZXQoc2l6ZV90IF9fcG9zKQorICAgICAgeworCV9CYXNlOjpyZXNldChfX3Bvcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPgorICAgICAgb3BlcmF0b3J+KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGJpdHNldCh+X01fYmFzZSgpKTsgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIGZsaXAoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9CYXNlOjpmbGlwKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIGZsaXAoc2l6ZV90IF9fcG9zKQorICAgICAgeworCV9CYXNlOjpmbGlwKF9fcG9zKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzOgorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTEuIEJpdHNldCBtaW5vciBwcm9ibGVtcworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdCBfX3BvcykKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfc3Vic2NyaXB0KF9fcG9zKTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisJcmV0dXJuIF9NX2Jhc2UoKVtfX3Bvc107CisjZWxzZQorCXJldHVybiByZWZlcmVuY2UoX01fYmFzZSgpW19fcG9zXSwgdGhpcyk7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTEuIEJpdHNldCBtaW5vciBwcm9ibGVtcworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90IF9fcG9zKSBjb25zdAorICAgICAgeworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorCS8vIFRPRE86IENoZWNrIGluIGRlYnVnLW1vZGUgdG9vLgorCV9fZ2xpYmN4eF9jaGVja19zdWJzY3JpcHQoX19wb3MpOworI2VuZGlmCisJcmV0dXJuIF9CYXNlOjpvcGVyYXRvcltdKF9fcG9zKTsKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OnRvX3Vsb25nOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHVzaW5nIF9CYXNlOjp0b191bGxvbmc7CisjZW5kaWYKKworICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICAgICAgdG9fc3RyaW5nKCkgY29uc3QKKyAgICAgICAgeyByZXR1cm4gX01fYmFzZSgpLnRlbXBsYXRlIHRvX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4oKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAzOTYuIHdoYXQgYXJlIGNoYXJhY3RlcnMgemVybyBhbmQgb25lLgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisJc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisJdG9fc3RyaW5nKF9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKSBjb25zdAorCXsKKwkgIHJldHVybiBfTV9iYXNlKCkudGVtcGxhdGUKKwkgICAgdG9fc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPihfX3plcm8sIF9fb25lKTsKKwl9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzNC4gYml0c2V0Ojp0b19zdHJpbmcoKSBoYXJkIHRvIHVzZS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4KKyAgICAgICAgdG9fc3RyaW5nKCkgY29uc3QKKyAgICAgICAgeyByZXR1cm4gdG9fc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+KCk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gODUzLiB0b19zdHJpbmcgbmVlZHMgdXBkYXRpbmcgd2l0aCB6ZXJvIGFuZCBvbmUuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisJc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4KKwl0b19zdHJpbmcoX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpIGNvbnN0CisJeyByZXR1cm4gdG9fc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywKKwkgICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+KF9femVybywgX19vbmUpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICAgICAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorICAgICAgICB0b19zdHJpbmcoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHRvX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPigpOworICAgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVD4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4KKwl0b19zdHJpbmcoX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpIGNvbnN0CisJeworCSAgcmV0dXJuIHRvX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+KF9femVybywgX19vbmUpOworCX0KKworICAgICAgc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICAgICAgdG9fc3RyaW5nKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gdG9fc3RyaW5nPGNoYXIsc3RkOjpjaGFyX3RyYWl0czxjaGFyPixzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+KCk7CisgICAgICB9CisKKyAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sIHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgICAgIHRvX3N0cmluZyhjaGFyIF9femVybywgY2hhciBfX29uZSA9ICcxJykgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gdG9fc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sCisJICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+KF9femVybywgX19vbmUpOworICAgICAgfQorCisgICAgICB1c2luZyBfQmFzZTo6Y291bnQ7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV9iYXNlKCkgPT0gX19yaHM7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV9iYXNlKCkgIT0gX19yaHM7IH0KKworICAgICAgdXNpbmcgX0Jhc2U6OnRlc3Q7CisgICAgICB1c2luZyBfQmFzZTo6YWxsOworICAgICAgdXNpbmcgX0Jhc2U6OmFueTsKKyAgICAgIHVzaW5nIF9CYXNlOjpub25lOworCisgICAgICBiaXRzZXQ8X05iPgorICAgICAgb3BlcmF0b3I8PChzaXplX3QgX19wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBiaXRzZXQ8X05iPihfTV9iYXNlKCkgPDwgX19wb3MpOyB9CisKKyAgICAgIGJpdHNldDxfTmI+CisgICAgICBvcGVyYXRvcj4+KHNpemVfdCBfX3BvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9NX2Jhc2UoKSA+PiBfX3Bvcyk7IH0KKworICAgICAgX0Jhc2UmIAorICAgICAgX01fYmFzZSgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgYml0c2V0PF9OYj4KKyAgICBvcGVyYXRvciYoY29uc3QgYml0c2V0PF9OYj4mIF9feCwgY29uc3QgYml0c2V0PF9OYj4mIF9feSkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBiaXRzZXQ8X05iPihfX3gpICY9IF9feTsgfQorCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgYml0c2V0PF9OYj4KKyAgICBvcGVyYXRvcnwoY29uc3QgYml0c2V0PF9OYj4mIF9feCwgY29uc3QgYml0c2V0PF9OYj4mIF9feSkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBiaXRzZXQ8X05iPihfX3gpIHw9IF9feTsgfQorCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgYml0c2V0PF9OYj4KKyAgICBvcGVyYXRvcl4oY29uc3QgYml0c2V0PF9OYj4mIF9feCwgY29uc3QgYml0c2V0PF9OYj4mIF9feSkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBiaXRzZXQ8X05iPihfX3gpIF49IF9feTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgc2l6ZV90IF9OYj4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBiaXRzZXQ8X05iPiYgX194KQorICAgIHsgcmV0dXJuIF9faXMgPj4gX194Ll9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgc2l6ZV90IF9OYj4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBiaXRzZXQ8X05iPiYgX194KQorICAgIHsgcmV0dXJuIF9fb3MgPDwgX194Ll9NX2Jhc2UoKTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX2RlYnVnCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8vIERSIDExODIuCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIGJpdHNldC4KKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBzdHJ1Y3QgaGFzaDxfX2RlYnVnOjpiaXRzZXQ8X05iPj4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9fZGVidWc6OmJpdHNldDxfTmI+PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX2RlYnVnOjpiaXRzZXQ8X05iPiYgX19iKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpoYXNoPF9HTElCQ1hYX1NURF9DOjpiaXRzZXQ8X05iPj4oKShfX2IuX01fYmFzZSgpKTsgfQorICAgIH07CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9kZWJ1Zy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YWY0MmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2RlYnVnLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8vIERlYnVnZ2luZyBzdXBwb3J0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9kZWJ1Zy5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19NQUNST19TV0lUQ0hfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19NQUNST19TV0lUQ0hfSCAxCisKKy8qKiBNYWNyb3MgYW5kIG5hbWVzcGFjZXMgdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gb3V0c2lkZSBvZiBkZWJ1ZworICogIHdyYXBwZXJzIHRvIHZlcmlmeSBjZXJ0YWluIHByb3BlcnRpZXMuIFRoZSBfX2dsaWJjeHhfcmVxdWlyZXNfeHh4CisgKiAgbWFjcm9zIGFyZSBtZXJlbHkgd3JhcHBlcnMgYXJvdW5kIHRoZSBfX2dsaWJjeHhfY2hlY2tfeHh4IHdyYXBwZXJzCisgKiAgd2hlbiB3ZSBhcmUgY29tcGlsaW5nIHdpdGggZGVidWcgbW9kZSwgYnV0IGRpc2FwcGVhciB3aGVuIHdlIGFyZQorICogIGluIHJlbGVhc2UgbW9kZSBzbyB0aGF0IHRoZXJlIGlzIG5vIGNoZWNraW5nIHBlcmZvcm1lZCBpbiwgZS5nLiwKKyAqICB0aGUgc3RhbmRhcmQgbGlicmFyeSBhbGdvcml0aG1zLgorKi8KKworLy8gRGVidWcgbW9kZSBuYW1lc3BhY2VzLgorCisvKioKKyAqIEBuYW1lc3BhY2Ugc3RkOjpfX2RlYnVnCisgKiBAYnJpZWYgR05VIGRlYnVnIGNvZGUsIHJlcGxhY2VzIHN0YW5kYXJkIGJlaGF2aW9yIHdpdGggZGVidWcgYmVoYXZpb3IuCisgKi8KK25hbWVzcGFjZSBzdGQKK3sgCisgIG5hbWVzcGFjZSBfX2RlYnVnIHsgfSAKK30KKworLyoqIEBuYW1lc3BhY2UgX19nbnVfZGVidWcKKyAqICBAYnJpZWYgR05VIGRlYnVnIGNsYXNzZXMgZm9yIHB1YmxpYyB1c2UuCisqLworbmFtZXNwYWNlIF9fZ251X2RlYnVnCit7CisgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6Ol9fZGVidWc7Cit9CisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUcKKworIyBkZWZpbmUgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9Db25kaXRpb24pCisjIGRlZmluZSBfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX0NvbmRpdGlvbikKKyMgZGVmaW5lIF9HTElCQ1hYX0RFQlVHX09OTFkoX1N0YXRlbWVudCkgOworIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX2NvbmQoX0NvbmQsX01zZykKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfRmlyc3QsX0xhc3QpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfbm9uX2VtcHR5X3JhbmdlKF9GaXJzdCxfTGFzdCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWQoX0ZpcnN0LF9MYXN0KQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9wcmVkKF9GaXJzdCxfTGFzdCxfUHJlZCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9GaXJzdDEsX0xhc3QxLF9GaXJzdDIpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9GaXJzdDEsX0xhc3QxLF9GaXJzdDIsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfbG93ZXIoX0ZpcnN0LF9MYXN0LF9WYWx1ZSkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF91cHBlcihfRmlyc3QsX0xhc3QsX1ZhbHVlKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX2xvd2VyX3ByZWQoX0ZpcnN0LF9MYXN0LF9WYWx1ZSxfUHJlZCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF91cHBlcl9wcmVkKF9GaXJzdCxfTGFzdCxfVmFsdWUsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcChfRmlyc3QsX0xhc3QpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcF9wcmVkKF9GaXJzdCxfTGFzdCxfUHJlZCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19ub25lbXB0eSgpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9TdHJpbmcpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfU3RyaW5nLF9MZW4pCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc3Vic2NyaXB0KF9OKQorCisjZWxzZQorCisjIGluY2x1ZGUgPGRlYnVnL21hY3Jvcy5oPgorCisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfQ29uZGl0aW9uKSBfX2dsaWJjeHhfYXNzZXJ0KF9Db25kaXRpb24pCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVR19QRURBTlRJQworIyBkZWZpbmUgX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9Db25kaXRpb24pIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfQ29uZGl0aW9uKQorI2Vsc2UKKyMgZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfQ29uZGl0aW9uKQorI2VuZGlmCisKKyMgZGVmaW5lIF9HTElCQ1hYX0RFQlVHX09OTFkoX1N0YXRlbWVudCkgX1N0YXRlbWVudAorCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfY29uZChfQ29uZCxfTXNnKSBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX0NvbmQsX01zZykKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfRmlyc3QsX0xhc3QpIFwKKyAgICAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdCxfTGFzdCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19ub25fZW1wdHlfcmFuZ2UoX0ZpcnN0LF9MYXN0KSBcCisgICAgIF9fZ2xpYmN4eF9jaGVja19ub25fZW1wdHlfcmFuZ2UoX0ZpcnN0LF9MYXN0KQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZChfRmlyc3QsX0xhc3QpIFwKKyAgICAgX19nbGliY3h4X2NoZWNrX3NvcnRlZChfRmlyc3QsX0xhc3QpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3ByZWQoX0ZpcnN0LF9MYXN0LF9QcmVkKSBcCisgICAgIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWRfcHJlZChfRmlyc3QsX0xhc3QsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldChfRmlyc3QxLF9MYXN0MSxfRmlyc3QyKSBcCisgICAgIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWRfc2V0KF9GaXJzdDEsX0xhc3QxLF9GaXJzdDIpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9GaXJzdDEsX0xhc3QxLF9GaXJzdDIsX1ByZWQpIFwKKyAgICAgX19nbGliY3h4X2NoZWNrX3NvcnRlZF9zZXRfcHJlZChfRmlyc3QxLF9MYXN0MSxfRmlyc3QyLF9QcmVkKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX2xvd2VyKF9GaXJzdCxfTGFzdCxfVmFsdWUpCVwKKyAgICAgX19nbGliY3h4X2NoZWNrX3BhcnRpdGlvbmVkX2xvd2VyKF9GaXJzdCxfTGFzdCxfVmFsdWUpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfdXBwZXIoX0ZpcnN0LF9MYXN0LF9WYWx1ZSkJXAorICAgICBfX2dsaWJjeHhfY2hlY2tfcGFydGl0aW9uZWRfdXBwZXIoX0ZpcnN0LF9MYXN0LF9WYWx1ZSkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF9sb3dlcl9wcmVkKF9GaXJzdCxfTGFzdCxfVmFsdWUsX1ByZWQpIFwKKyAgICAgX19nbGliY3h4X2NoZWNrX3BhcnRpdGlvbmVkX2xvd2VyX3ByZWQoX0ZpcnN0LF9MYXN0LF9WYWx1ZSxfUHJlZCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF91cHBlcl9wcmVkKF9GaXJzdCxfTGFzdCxfVmFsdWUsX1ByZWQpIFwKKyAgICAgX19nbGliY3h4X2NoZWNrX3BhcnRpdGlvbmVkX3VwcGVyX3ByZWQoX0ZpcnN0LF9MYXN0LF9WYWx1ZSxfUHJlZCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19oZWFwKF9GaXJzdCxfTGFzdCkgXAorICAgICBfX2dsaWJjeHhfY2hlY2tfaGVhcChfRmlyc3QsX0xhc3QpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcF9wcmVkKF9GaXJzdCxfTGFzdCxfUHJlZCkgXAorICAgICBfX2dsaWJjeHhfY2hlY2tfaGVhcF9wcmVkKF9GaXJzdCxfTGFzdCxfUHJlZCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19ub25lbXB0eSgpIF9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9TdHJpbmcpIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX1N0cmluZykKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9TdHJpbmcsX0xlbikJXAorICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nX2xlbihfU3RyaW5nLF9MZW4pCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc3Vic2NyaXB0KF9OKSBfX2dsaWJjeHhfY2hlY2tfc3Vic2NyaXB0KF9OKQorCisjIGluY2x1ZGUgPGRlYnVnL2Z1bmN0aW9ucy5oPgorCisjZW5kaWYKKworI2VuZGlmIC8vIF9HTElCQ1hYX0RFQlVHX01BQ1JPX1NXSVRDSF9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2RlcXVlIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9kZXF1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDQyZWMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9kZXF1ZQpAQCAtMCwwICsxLDU3OSBAQAorLy8gRGVidWdnaW5nIGRlcXVlIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9kZXF1ZQorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfREVRVUUKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfREVRVUUgMQorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9zZXF1ZW5jZS5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjpkZXF1ZSB3aXRoIHNhZmV0eS9jaGVja2luZy9kZWJ1ZyBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGRlcXVlCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OmRlcXVlPF9UcCwgX0FsbG9jYXRvcj4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPGRlcXVlPF9UcCwgX0FsbG9jYXRvcj4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgIF9HTElCQ1hYX1NURF9DOjpkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+IF9CYXNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X0VxdWFsX3RvPF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfRXF1YWw7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLGRlcXVlPgorCQkJCQkJICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsZGVxdWU+CisJCQkJCQkgICAgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmIF9UcAkJCQkgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jYXRvcgkJCSAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyAyMy4yLjEuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQKKyAgICAgIGRlcXVlKGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19hKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGV4cGxpY2l0CisgICAgICBkZXF1ZShzaXplX3R5cGUgX19uKQorICAgICAgOiBfQmFzZShfX24pIHsgfQorCisgICAgICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUsCisJICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpIHsgfQorI2Vsc2UKKyAgICAgIGV4cGxpY2l0CisgICAgICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUgPSBfVHAoKSwKKwkgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX24sIF9fdmFsdWUsIF9fYSkgeyB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIGRlcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisJOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgICAgX19sYXN0KSksCisJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSwgX19hKQorICAgICAgICB7IH0KKworICAgICAgZGVxdWUoY29uc3QgZGVxdWUmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgZGVxdWUoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGRlcXVlKGRlcXVlJiYgX194KQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSkKKyAgICAgIHsgdGhpcy0+X01fc3dhcChfX3gpOyB9CisKKyAgICAgIGRlcXVlKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIH5kZXF1ZSgpIF9HTElCQ1hYX05PRVhDRVBUIHsgfQorCisgICAgICBkZXF1ZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBkZXF1ZSYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgZGVxdWUmCisgICAgICBvcGVyYXRvcj0oZGVxdWUmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwlfX2dsaWJjeHhfY2hlY2tfc2VsZl9tb3ZlX2Fzc2lnbihfX3gpOworCWNsZWFyKCk7CisJc3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgZGVxdWUmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX2w7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIHZvaWQKKyAgICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBfQmFzZTo6YXNzaWduKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdCkKKyAgICAgIHsKKwlfQmFzZTo6YXNzaWduKF9fbiwgX190KTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9CYXNlOjphc3NpZ24oX19sKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2FmdGVyX250aChkaWZmZXJlbmNlX3R5cGUgX19uKQorICAgICAgeworCXR5cGVkZWYgX19nbnVfZGVidWc6Ol9BZnRlcl9udGhfZnJvbTxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX0FmdGVyX250aDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9BZnRlcl9udGgoX19uLCBfQmFzZTo6YmVnaW4oKSkpOworICAgICAgfQorICAgICAgCisgICAgcHVibGljOgorICAgICAgLy8gMjMuMi4xLjIgY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeikKKyAgICAgIHsKKwlib29sIF9faW52YWxpZGF0ZV9hbGwgPSBfX3N6ID4gdGhpcy0+c2l6ZSgpOworCWlmIChfX3N6IDwgdGhpcy0+c2l6ZSgpKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hZnRlcl9udGgoX19zeik7CisKKwlfQmFzZTo6cmVzaXplKF9fc3opOworCisJaWYgKF9faW52YWxpZGF0ZV9hbGwpCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIGNvbnN0IF9UcCYgX19jKQorICAgICAgeworCWJvb2wgX19pbnZhbGlkYXRlX2FsbCA9IF9fc3ogPiB0aGlzLT5zaXplKCk7CisJaWYgKF9fc3ogPCB0aGlzLT5zaXplKCkpCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FmdGVyX250aChfX3N6KTsKKworCV9CYXNlOjpyZXNpemUoX19zeiwgX19jKTsKKworCWlmIChfX2ludmFsaWRhdGVfYWxsKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIF9UcCBfX2MgPSBfVHAoKSkKKyAgICAgIHsKKwlib29sIF9faW52YWxpZGF0ZV9hbGwgPSBfX3N6ID4gdGhpcy0+c2l6ZSgpOworCWlmIChfX3N6IDwgdGhpcy0+c2l6ZSgpKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hZnRlcl9udGgoX19zeik7CisKKwlfQmFzZTo6cmVzaXplKF9fc3osIF9fYyk7CisKKwlpZiAoX19pbnZhbGlkYXRlX2FsbCkKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHNocmlua190b19maXQoKQorICAgICAgeworCWlmIChfQmFzZTo6X01fc2hyaW5rX3RvX2ZpdCgpKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzOgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX3N1YnNjcmlwdChfX24pOworCXJldHVybiBfTV9iYXNlKClbX19uXTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX3N1YnNjcmlwdChfX24pOworCXJldHVybiBfTV9iYXNlKClbX19uXTsKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmF0OworCisgICAgICByZWZlcmVuY2UKKyAgICAgIGZyb250KCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwlyZXR1cm4gX0Jhc2U6OmZyb250KCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6ZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBiYWNrKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwlyZXR1cm4gX0Jhc2U6OmJhY2soKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwlyZXR1cm4gX0Jhc2U6OmJhY2soKTsKKyAgICAgIH0KKworICAgICAgLy8gMjMuMi4xLjMgbW9kaWZpZXJzOgorICAgICAgdm9pZAorICAgICAgcHVzaF9mcm9udChjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6cHVzaF9mcm9udChfX3gpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfYmFjayhjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6cHVzaF9iYWNrKF9feCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoX1RwJiYgX194KQorICAgICAgeyBlbXBsYWNlX2Zyb250KHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2soX1RwJiYgX194KQorICAgICAgeyBlbXBsYWNlX2JhY2soc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2VfZnJvbnQoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX0Jhc2U6OmVtcGxhY2VfZnJvbnQoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlX2JhY2soX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX0Jhc2U6OmVtcGxhY2VfYmFjayhzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBlbXBsYWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJICBfQmFzZV9pdGVyYXRvciBfX3JlcyA9IF9CYXNlOjplbXBsYWNlKF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQkJc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJICByZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworCX0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJX0Jhc2VfaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX3gpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX1RwJiYgX194KQorICAgICAgeyByZXR1cm4gZW1wbGFjZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX0Jhc2U6Omluc2VydChfX3AsIF9fbCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwlfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX24sIF9feCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sCisJICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydF9yYW5nZShfX3Bvc2l0aW9uLCBfX2ZpcnN0LCBfX2xhc3QpOworCSAgX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCQkJICAgX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJfQorCisgICAgICB2b2lkCisgICAgICBwb3BfZnJvbnQoKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9CYXNlOjpiZWdpbigpKSk7CisJX0Jhc2U6OnBvcF9mcm9udCgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBwb3BfYmFjaygpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoLS1fQmFzZTo6ZW5kKCkpKTsKKwlfQmFzZTo6cG9wX2JhY2soKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCV9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX19wb3NpdGlvbi5iYXNlKCk7CisJaWYgKF9fdmljdGltID09IF9CYXNlOjpiZWdpbigpIHx8IF9fdmljdGltID09IF9CYXNlOjplbmQoKS0xKQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fdmljdGltKSwgdGhpcyk7CisJICB9CisJZWxzZQorCSAgeworCSAgICBfQmFzZV9pdGVyYXRvciBfX3JlcyA9IF9CYXNlOjplcmFzZShfX3ZpY3RpbSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJICAgIHJldHVybiBpdGVyYXRvcihfX3JlcywgdGhpcyk7CisJICB9CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKwlpZiAoX19maXJzdC5iYXNlKCkgPT0gX19sYXN0LmJhc2UoKSkKKwkgIHJldHVybiBfX2ZpcnN0OworICAgICAgICBlbHNlIGlmIChfX2ZpcnN0LmJhc2UoKSA9PSBfQmFzZTo6YmVnaW4oKQorCQkgfHwgX19sYXN0LmJhc2UoKSA9PSBfQmFzZTo6ZW5kKCkpCisJICB7CisJICAgIHRoaXMtPl9NX2RldGFjaF9zaW5ndWxhcigpOworCSAgICBmb3IgKF9CYXNlX2l0ZXJhdG9yIF9fcG9zaXRpb24gPSBfX2ZpcnN0LmJhc2UoKTsKKwkJIF9fcG9zaXRpb24gIT0gX19sYXN0LmJhc2UoKTsgKytfX3Bvc2l0aW9uKQorCSAgICAgIHsKKwkJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX19wb3NpdGlvbikpOworCSAgICAgIH0KKwkgICAgX190cnkKKwkgICAgICB7CisJCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpLAorCQkJCXRoaXMpOworCSAgICAgIH0KKwkgICAgX19jYXRjaCguLi4pCisJICAgICAgeworCQl0aGlzLT5fTV9yZXZhbGlkYXRlX3Npbmd1bGFyKCk7CisJCV9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICAgIH0KKwkgIH0KKwllbHNlCisJICB7CisJICAgIF9CYXNlX2l0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLAorCQkJCQkJX19sYXN0LmJhc2UoKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJICAgIHJldHVybiBpdGVyYXRvcihfX3JlcywgdGhpcyk7CisJICB9CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoZGVxdWUmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6c3dhcChfX3gpOworCXRoaXMtPl9NX3N3YXAoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9CYXNlOjpjbGVhcigpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIF9HTElCQ1hYX05PRVhDRVBUICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPCBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoZGVxdWU8X1RwLCBfQWxsb2M+JiBfX2xocywgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fZGVidWcKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvZm9ybWF0dGVyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2Zvcm1hdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjVlMWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2Zvcm1hdHRlci5oCkBAIC0wLDAgKzEsNDYyIEBACisvLyBEZWJ1Zy1tb2RlIGVycm9yIGZvcm1hdHRpbmcgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL2Zvcm1hdHRlci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19GT1JNQVRURVJfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19GT1JNQVRURVJfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8dHlwZWluZm8+CisKK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICB1c2luZyBzdGQ6OnR5cGVfaW5mbzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgYm9vbCBfX2NoZWNrX3Npbmd1bGFyKF9JdGVyYXRvciYpOworCisgIGNsYXNzIF9TYWZlX3NlcXVlbmNlX2Jhc2U7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgY2xhc3MgX1NhZmVfaXRlcmF0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgY2xhc3MgX1NhZmVfbG9jYWxfaXRlcmF0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGNsYXNzIF9TYWZlX3NlcXVlbmNlOworCisgIGVudW0gX0RlYnVnX21zZ19pZAorICB7CisgICAgLy8gR2VuZXJhbCBjaGVja3MKKyAgICBfX21zZ192YWxpZF9yYW5nZSwKKyAgICBfX21zZ19pbnNlcnRfc2luZ3VsYXIsCisgICAgX19tc2dfaW5zZXJ0X2RpZmZlcmVudCwKKyAgICBfX21zZ19lcmFzZV9iYWQsCisgICAgX19tc2dfZXJhc2VfZGlmZmVyZW50LAorICAgIF9fbXNnX3N1YnNjcmlwdF9vb2IsCisgICAgX19tc2dfZW1wdHksCisgICAgX19tc2dfdW5wYXJ0aXRpb25lZCwKKyAgICBfX21zZ191bnBhcnRpdGlvbmVkX3ByZWQsCisgICAgX19tc2dfdW5zb3J0ZWQsCisgICAgX19tc2dfdW5zb3J0ZWRfcHJlZCwKKyAgICBfX21zZ19ub3RfaGVhcCwKKyAgICBfX21zZ19ub3RfaGVhcF9wcmVkLAorICAgIC8vIHN0ZDo6Yml0c2V0IGNoZWNrcworICAgIF9fbXNnX2JhZF9iaXRzZXRfd3JpdGUsCisgICAgX19tc2dfYmFkX2JpdHNldF9yZWFkLAorICAgIF9fbXNnX2JhZF9iaXRzZXRfZmxpcCwKKyAgICAvLyBzdGQ6Omxpc3QgY2hlY2tzCisgICAgX19tc2dfc2VsZl9zcGxpY2UsCisgICAgX19tc2dfc3BsaWNlX2FsbG9jLAorICAgIF9fbXNnX3NwbGljZV9iYWQsCisgICAgX19tc2dfc3BsaWNlX290aGVyLAorICAgIF9fbXNnX3NwbGljZV9vdmVybGFwLAorICAgIC8vIGl0ZXJhdG9yIGNoZWNrcworICAgIF9fbXNnX2luaXRfc2luZ3VsYXIsCisgICAgX19tc2dfaW5pdF9jb3B5X3Npbmd1bGFyLAorICAgIF9fbXNnX2luaXRfY29uc3Rfc2luZ3VsYXIsCisgICAgX19tc2dfY29weV9zaW5ndWxhciwKKyAgICBfX21zZ19iYWRfZGVyZWYsCisgICAgX19tc2dfYmFkX2luYywKKyAgICBfX21zZ19iYWRfZGVjLAorICAgIF9fbXNnX2l0ZXJfc3Vic2NyaXB0X29vYiwKKyAgICBfX21zZ19hZHZhbmNlX29vYiwKKyAgICBfX21zZ19yZXRyZWF0X29vYiwKKyAgICBfX21zZ19pdGVyX2NvbXBhcmVfYmFkLAorICAgIF9fbXNnX2NvbXBhcmVfZGlmZmVyZW50LAorICAgIF9fbXNnX2l0ZXJfb3JkZXJfYmFkLAorICAgIF9fbXNnX29yZGVyX2RpZmZlcmVudCwKKyAgICBfX21zZ19kaXN0YW5jZV9iYWQsCisgICAgX19tc2dfZGlzdGFuY2VfZGlmZmVyZW50LAorICAgIC8vIGlzdHJlYW1faXRlcmF0b3IKKyAgICBfX21zZ19kZXJlZl9pc3RyZWFtLAorICAgIF9fbXNnX2luY19pc3RyZWFtLAorICAgIC8vIG9zdHJlYW1faXRlcmF0b3IKKyAgICBfX21zZ19vdXRwdXRfb3N0cmVhbSwKKyAgICAvLyBpc3RyZWFtYnVmX2l0ZXJhdG9yCisgICAgX19tc2dfZGVyZWZfaXN0cmVhbWJ1ZiwKKyAgICBfX21zZ19pbmNfaXN0cmVhbWJ1ZiwKKyAgICAvLyBmb3J3YXJkX2xpc3QKKyAgICBfX21zZ19pbnNlcnRfYWZ0ZXJfZW5kLAorICAgIF9fbXNnX2VyYXNlX2FmdGVyX2JhZCwKKyAgICBfX21zZ192YWxpZF9yYW5nZTIsCisgICAgLy8gdW5vcmRlcmVkIGNvbnRhaW5lciBsb2NhbCBpdGVyYXRvcnMKKyAgICBfX21zZ19sb2NhbF9pdGVyX2NvbXBhcmVfYmFkLAorICAgIF9fbXNnX25vbl9lbXB0eV9yYW5nZSwKKyAgICAvLyBzZWxmIG1vdmUgYXNzaWduCisgICAgX19tc2dfc2VsZl9tb3ZlX2Fzc2lnbiwKKyAgICAvLyB1bm9yZGVyZWQgY29udGFpbmVyIGJ1Y2tldHMKKyAgICBfX21zZ19idWNrZXRfaW5kZXhfb29iLAorICAgIF9fbXNnX3ZhbGlkX2xvYWRfZmFjdG9yLAorICAgIF9fbXNnX2VxdWFsX2FsbG9jcworICB9OworCisgIGNsYXNzIF9FcnJvcl9mb3JtYXR0ZXIKKyAgeworICAgIC8vLyBXaGV0aGVyIGFuIGl0ZXJhdG9yIGlzIGNvbnN0YW50LCBtdXRhYmxlLCBvciB1bmtub3duCisgICAgZW51bSBfQ29uc3RuZXNzCisgICAgeworICAgICAgX191bmtub3duX2NvbnN0bmVzcywKKyAgICAgIF9fY29uc3RfaXRlcmF0b3IsCisgICAgICBfX211dGFibGVfaXRlcmF0b3IsCisgICAgICBfX2xhc3RfY29uc3RuZXNzCisgICAgfTsKKworICAgIC8vIFRoZSBzdGF0ZSBvZiB0aGUgaXRlcmF0b3IgKGZpbmUtZ3JhaW5lZCksIGlmIHdlIGtub3cgaXQuCisgICAgZW51bSBfSXRlcmF0b3Jfc3RhdGUKKyAgICB7CisgICAgICBfX3Vua25vd25fc3RhdGUsCisgICAgICBfX3Npbmd1bGFyLCAgICAgIC8vIHNpbmd1bGFyLCBtYXkgc3RpbGwgYmUgYXR0YWNoZWQgdG8gYSBzZXF1ZW5jZQorICAgICAgX19iZWdpbiwgICAgICAgICAvLyBkZXJlZmVyZW5jZWFibGUsIGFuZCBhdCB0aGUgYmVnaW5uaW5nCisgICAgICBfX21pZGRsZSwgICAgICAgIC8vIGRlcmVmZXJlbmNlYWJsZSwgbm90IGF0IHRoZSBiZWdpbm5pbmcKKyAgICAgIF9fZW5kLCAgICAgICAgICAgLy8gcGFzdC10aGUtZW5kLCBtYXkgYmUgYXQgYmVnaW5uaW5nIGlmIHNlcXVlbmNlIGVtcHR5CisgICAgICBfX2JlZm9yZV9iZWdpbiwgIC8vIGJlZm9yZSBiZWdpbgorICAgICAgX19sYXN0X3N0YXRlCisgICAgfTsKKworICAgIC8vIFRhZ3MgZGVub3RpbmcgdGhlIHR5cGUgb2YgcGFyYW1ldGVyIGZvciBjb25zdHJ1Y3Rpb24KKyAgICBzdHJ1Y3QgX0lzX2l0ZXJhdG9yIHsgfTsKKyAgICBzdHJ1Y3QgX0lzX3NlcXVlbmNlIHsgfTsKKworICAgIC8vIEEgcGFyYW1ldGVyIHRoYXQgbWF5IGJlIHJlZmVyZW5jZWQgYnkgYW4gZXJyb3IgbWVzc2FnZQorICAgIHN0cnVjdCBfUGFyYW1ldGVyCisgICAgeworICAgICAgZW51bQorICAgICAgeworCV9fdW51c2VkX3BhcmFtLAorCV9faXRlcmF0b3IsCisJX19zZXF1ZW5jZSwKKwlfX2ludGVnZXIsCisJX19zdHJpbmcKKyAgICAgIH0gX01fa2luZDsKKworICAgICAgdW5pb24KKyAgICAgIHsKKwkvLyBXaGVuIF9NX2tpbmQgPT0gX19pdGVyYXRvcgorCXN0cnVjdAorCXsKKwkgIGNvbnN0IGNoYXIqICAgICAgX01fbmFtZTsKKwkgIGNvbnN0IHZvaWQqICAgICAgX01fYWRkcmVzczsKKwkgIGNvbnN0IHR5cGVfaW5mbyogX01fdHlwZTsKKwkgIF9Db25zdG5lc3MgICAgICAgX01fY29uc3RuZXNzOworCSAgX0l0ZXJhdG9yX3N0YXRlICBfTV9zdGF0ZTsKKwkgIGNvbnN0IHZvaWQqICAgICAgX01fc2VxdWVuY2U7CisJICBjb25zdCB0eXBlX2luZm8qIF9NX3NlcV90eXBlOworCX0gX01faXRlcmF0b3I7CisKKwkvLyBXaGVuIF9NX2tpbmQgPT0gX19zZXF1ZW5jZQorCXN0cnVjdAorCXsKKwkgIGNvbnN0IGNoYXIqICAgICAgX01fbmFtZTsKKwkgIGNvbnN0IHZvaWQqICAgICAgX01fYWRkcmVzczsKKwkgIGNvbnN0IHR5cGVfaW5mbyogX01fdHlwZTsKKwl9IF9NX3NlcXVlbmNlOworCisJLy8gV2hlbiBfTV9raW5kID09IF9faW50ZWdlcgorCXN0cnVjdAorCXsKKwkgIGNvbnN0IGNoYXIqIF9NX25hbWU7CisJICBsb25nICAgICAgICBfTV92YWx1ZTsKKwl9IF9NX2ludGVnZXI7CisKKwkvLyBXaGVuIF9NX2tpbmQgPT0gX19zdHJpbmcKKwlzdHJ1Y3QKKwl7CisJICBjb25zdCBjaGFyKiBfTV9uYW1lOworCSAgY29uc3QgY2hhciogX01fdmFsdWU7CisJfSBfTV9zdHJpbmc7CisgICAgICB9IF9NX3ZhcmlhbnQ7CisKKyAgICAgIF9QYXJhbWV0ZXIoKSA6IF9NX2tpbmQoX191bnVzZWRfcGFyYW0pLCBfTV92YXJpYW50KCkgeyB9CisKKyAgICAgIF9QYXJhbWV0ZXIobG9uZyBfX3ZhbHVlLCBjb25zdCBjaGFyKiBfX25hbWUpIAorICAgICAgOiBfTV9raW5kKF9faW50ZWdlciksIF9NX3ZhcmlhbnQoKQorICAgICAgeworCV9NX3ZhcmlhbnQuX01faW50ZWdlci5fTV9uYW1lID0gX19uYW1lOworCV9NX3ZhcmlhbnQuX01faW50ZWdlci5fTV92YWx1ZSA9IF9fdmFsdWU7CisgICAgICB9CisKKyAgICAgIF9QYXJhbWV0ZXIoY29uc3QgY2hhciogX192YWx1ZSwgY29uc3QgY2hhciogX19uYW1lKSAKKyAgICAgIDogX01fa2luZChfX3N0cmluZyksIF9NX3ZhcmlhbnQoKQorICAgICAgeworCV9NX3ZhcmlhbnQuX01fc3RyaW5nLl9NX25hbWUgPSBfX25hbWU7CisJX01fdmFyaWFudC5fTV9zdHJpbmcuX01fdmFsdWUgPSBfX3ZhbHVlOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICAgICAgX1BhcmFtZXRlcihjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9faXQsCisJCSAgIGNvbnN0IGNoYXIqIF9fbmFtZSwgX0lzX2l0ZXJhdG9yKQorCTogX01fa2luZChfX2l0ZXJhdG9yKSwgIF9NX3ZhcmlhbnQoKQorICAgICAgICB7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX25hbWUgPSBfX25hbWU7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX2FkZHJlc3MgPSAmX19pdDsKKyNpZmRlZiBfX0dYWF9SVFRJCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3R5cGUgPSAmdHlwZWlkKF9faXQpOworI2Vsc2UKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fdHlwZSA9IDA7CisjZW5kaWYKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fY29uc3RuZXNzID0KKwkgICAgc3RkOjpfX2FyZV9zYW1lPF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiwKKwkgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9TZXF1ZW5jZTo6aXRlcmF0b3I+OjoKKwkgICAgICBfX3ZhbHVlID8gX19tdXRhYmxlX2l0ZXJhdG9yIDogX19jb25zdF9pdGVyYXRvcjsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc2VxdWVuY2UgPSBfX2l0Ll9NX2dldF9zZXF1ZW5jZSgpOworI2lmZGVmIF9fR1hYX1JUVEkKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc2VxX3R5cGUgPSAmdHlwZWlkKF9TZXF1ZW5jZSk7CisjZWxzZQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zZXFfdHlwZSA9IDA7CisjZW5kaWYKKworCSAgaWYgKF9faXQuX01fc2luZ3VsYXIoKSkKKwkgICAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zdGF0ZSA9IF9fc2luZ3VsYXI7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoX19pdC5fTV9pc19iZWZvcmVfYmVnaW4oKSkKKwkJX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zdGF0ZSA9IF9fYmVmb3JlX2JlZ2luOworCSAgICAgIGVsc2UgaWYgKF9faXQuX01faXNfZW5kKCkpCisJCV9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX2VuZDsKKwkgICAgICBlbHNlIGlmIChfX2l0Ll9NX2lzX2JlZ2luKCkpCisJCV9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX2JlZ2luOworCSAgICAgIGVsc2UKKwkJX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zdGF0ZSA9IF9fbWlkZGxlOworCSAgICB9CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKwlfUGFyYW1ldGVyKGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19pdCwKKwkJICAgY29uc3QgY2hhciogX19uYW1lLCBfSXNfaXRlcmF0b3IpCisJOiBfTV9raW5kKF9faXRlcmF0b3IpLCAgX01fdmFyaWFudCgpCisJeworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9uYW1lID0gX19uYW1lOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9hZGRyZXNzID0gJl9faXQ7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV90eXBlID0gJnR5cGVpZChfX2l0KTsKKyNlbHNlCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3R5cGUgPSAwOworI2VuZGlmCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX2NvbnN0bmVzcyA9CisJICAgIHN0ZDo6X19hcmVfc2FtZTxfU2FmZV9sb2NhbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4sCisJICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU2VxdWVuY2U6OmxvY2FsX2l0ZXJhdG9yPjo6CisJICAgICAgX192YWx1ZSA/IF9fbXV0YWJsZV9pdGVyYXRvciA6IF9fY29uc3RfaXRlcmF0b3I7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcXVlbmNlID0gX19pdC5fTV9nZXRfc2VxdWVuY2UoKTsKKyNpZmRlZiBfX0dYWF9SVFRJCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcV90eXBlID0gJnR5cGVpZChfU2VxdWVuY2UpOworI2Vsc2UKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc2VxX3R5cGUgPSAwOworI2VuZGlmCisKKwkgIGlmIChfX2l0Ll9NX3Npbmd1bGFyKCkpCisJICAgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX3Npbmd1bGFyOworCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKF9faXQuX01faXNfZW5kKCkpCisJCV9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX2VuZDsKKwkgICAgICBlbHNlIGlmIChfX2l0Ll9NX2lzX2JlZ2luKCkpCisJCV9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX2JlZ2luOworCSAgICAgIGVsc2UKKwkJX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zdGF0ZSA9IF9fbWlkZGxlOworCSAgICB9CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHlwZT4KKyAgICAgICAgX1BhcmFtZXRlcihjb25zdCBfVHlwZSomIF9faXQsIGNvbnN0IGNoYXIqIF9fbmFtZSwgX0lzX2l0ZXJhdG9yKQorICAgICAgICA6IF9NX2tpbmQoX19pdGVyYXRvciksIF9NX3ZhcmlhbnQoKQorICAgICAgICB7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX25hbWUgPSBfX25hbWU7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX2FkZHJlc3MgPSAmX19pdDsKKyNpZmRlZiBfX0dYWF9SVFRJCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3R5cGUgPSAmdHlwZWlkKF9faXQpOworI2Vsc2UKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fdHlwZSA9IDA7CisjZW5kaWYKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fY29uc3RuZXNzID0gX19tdXRhYmxlX2l0ZXJhdG9yOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zdGF0ZSA9IF9faXQ/IF9fdW5rbm93bl9zdGF0ZSA6IF9fc2luZ3VsYXI7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcXVlbmNlID0gMDsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc2VxX3R5cGUgPSAwOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1R5cGU+CisgICAgICAgIF9QYXJhbWV0ZXIoX1R5cGUqJiBfX2l0LCBjb25zdCBjaGFyKiBfX25hbWUsIF9Jc19pdGVyYXRvcikKKyAgICAgICAgOiBfTV9raW5kKF9faXRlcmF0b3IpLCBfTV92YXJpYW50KCkKKyAgICAgICAgeworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9uYW1lID0gX19uYW1lOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9hZGRyZXNzID0gJl9faXQ7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV90eXBlID0gJnR5cGVpZChfX2l0KTsKKyNlbHNlCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3R5cGUgPSAwOworI2VuZGlmCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX2NvbnN0bmVzcyA9IF9fY29uc3RfaXRlcmF0b3I7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3N0YXRlID0gX19pdD8gX191bmtub3duX3N0YXRlIDogX19zaW5ndWxhcjsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc2VxdWVuY2UgPSAwOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zZXFfdHlwZSA9IDA7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgICAgIF9QYXJhbWV0ZXIoY29uc3QgX0l0ZXJhdG9yJiBfX2l0LCBjb25zdCBjaGFyKiBfX25hbWUsIF9Jc19pdGVyYXRvcikKKyAgICAgICAgOiBfTV9raW5kKF9faXRlcmF0b3IpLCBfTV92YXJpYW50KCkKKyAgICAgICAgeworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9uYW1lID0gX19uYW1lOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9hZGRyZXNzID0gJl9faXQ7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV90eXBlID0gJnR5cGVpZChfX2l0KTsKKyNlbHNlCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3R5cGUgPSAwOworI2VuZGlmCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX2NvbnN0bmVzcyA9IF9fdW5rbm93bl9jb25zdG5lc3M7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3N0YXRlID0KKwkgICAgX19nbnVfZGVidWc6Ol9fY2hlY2tfc2luZ3VsYXIoX19pdCk/IF9fc2luZ3VsYXIgOiBfX3Vua25vd25fc3RhdGU7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcXVlbmNlID0gMDsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc2VxX3R5cGUgPSAwOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NlcXVlbmNlPgorICAgICAgICBfUGFyYW1ldGVyKGNvbnN0IF9TYWZlX3NlcXVlbmNlPF9TZXF1ZW5jZT4mIF9fc2VxLAorCQkgICBjb25zdCBjaGFyKiBfX25hbWUsIF9Jc19zZXF1ZW5jZSkKKyAgICAgICAgOiBfTV9raW5kKF9fc2VxdWVuY2UpLCBfTV92YXJpYW50KCkKKyAgICAgICAgeworCSAgX01fdmFyaWFudC5fTV9zZXF1ZW5jZS5fTV9uYW1lID0gX19uYW1lOworCSAgX01fdmFyaWFudC5fTV9zZXF1ZW5jZS5fTV9hZGRyZXNzID0KKwkgICAgc3RhdGljX2Nhc3Q8Y29uc3QgX1NlcXVlbmNlKj4oJl9fc2VxKTsKKyNpZmRlZiBfX0dYWF9SVFRJCisJICBfTV92YXJpYW50Ll9NX3NlcXVlbmNlLl9NX3R5cGUgPSAmdHlwZWlkKF9TZXF1ZW5jZSk7CisjZWxzZQorCSAgX01fdmFyaWFudC5fTV9zZXF1ZW5jZS5fTV90eXBlID0gMDsKKyNlbmRpZgorCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NlcXVlbmNlPgorICAgICAgICBfUGFyYW1ldGVyKGNvbnN0IF9TZXF1ZW5jZSYgX19zZXEsIGNvbnN0IGNoYXIqIF9fbmFtZSwgX0lzX3NlcXVlbmNlKQorICAgICAgICA6IF9NX2tpbmQoX19zZXF1ZW5jZSksIF9NX3ZhcmlhbnQoKQorICAgICAgICB7CisJICBfTV92YXJpYW50Ll9NX3NlcXVlbmNlLl9NX25hbWUgPSBfX25hbWU7CisJICBfTV92YXJpYW50Ll9NX3NlcXVlbmNlLl9NX2FkZHJlc3MgPSAmX19zZXE7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgX01fdmFyaWFudC5fTV9zZXF1ZW5jZS5fTV90eXBlID0gJnR5cGVpZChfU2VxdWVuY2UpOworI2Vsc2UKKwkgIF9NX3ZhcmlhbnQuX01fc2VxdWVuY2UuX01fdHlwZSA9IDA7CisjZW5kaWYKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3ByaW50X2ZpZWxkKGNvbnN0IF9FcnJvcl9mb3JtYXR0ZXIqIF9fZm9ybWF0dGVyLAorCQkgICAgIGNvbnN0IGNoYXIqIF9fbmFtZSkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3ByaW50X2Rlc2NyaXB0aW9uKGNvbnN0IF9FcnJvcl9mb3JtYXR0ZXIqIF9fZm9ybWF0dGVyKSBjb25zdDsKKyAgICB9OworCisgICAgZnJpZW5kIHN0cnVjdCBfUGFyYW1ldGVyOworCisgIHB1YmxpYzoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgICBjb25zdCBfRXJyb3JfZm9ybWF0dGVyJgorICAgICAgX01faXRlcmF0b3IoY29uc3QgX0l0ZXJhdG9yJiBfX2l0LCBjb25zdCBjaGFyKiBfX25hbWUgPSAwKSAgY29uc3QKKyAgICAgIHsKKwlpZiAoX01fbnVtX3BhcmFtZXRlcnMgPCBzdGQ6OnNpemVfdChfX21heF9wYXJhbWV0ZXJzKSkKKwkgIF9NX3BhcmFtZXRlcnNbX01fbnVtX3BhcmFtZXRlcnMrK10gPSBfUGFyYW1ldGVyKF9faXQsIF9fbmFtZSwKKwkJCQkJCQkgIF9Jc19pdGVyYXRvcigpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICBjb25zdCBfRXJyb3JfZm9ybWF0dGVyJgorICAgIF9NX2ludGVnZXIobG9uZyBfX3ZhbHVlLCBjb25zdCBjaGFyKiBfX25hbWUgPSAwKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChfTV9udW1fcGFyYW1ldGVycyA8IHN0ZDo6c2l6ZV90KF9fbWF4X3BhcmFtZXRlcnMpKQorCV9NX3BhcmFtZXRlcnNbX01fbnVtX3BhcmFtZXRlcnMrK10gPSBfUGFyYW1ldGVyKF9fdmFsdWUsIF9fbmFtZSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgY29uc3QgX0Vycm9yX2Zvcm1hdHRlciYKKyAgICBfTV9zdHJpbmcoY29uc3QgY2hhciogX192YWx1ZSwgY29uc3QgY2hhciogX19uYW1lID0gMCkgY29uc3QKKyAgICB7CisgICAgICBpZiAoX01fbnVtX3BhcmFtZXRlcnMgPCBzdGQ6OnNpemVfdChfX21heF9wYXJhbWV0ZXJzKSkKKwlfTV9wYXJhbWV0ZXJzW19NX251bV9wYXJhbWV0ZXJzKytdID0gX1BhcmFtZXRlcihfX3ZhbHVlLCBfX25hbWUpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICAgIGNvbnN0IF9FcnJvcl9mb3JtYXR0ZXImCisgICAgICBfTV9zZXF1ZW5jZShjb25zdCBfU2VxdWVuY2UmIF9fc2VxLCBjb25zdCBjaGFyKiBfX25hbWUgPSAwKSBjb25zdAorICAgICAgeworCWlmIChfTV9udW1fcGFyYW1ldGVycyA8IHN0ZDo6c2l6ZV90KF9fbWF4X3BhcmFtZXRlcnMpKQorCSAgX01fcGFyYW1ldGVyc1tfTV9udW1fcGFyYW1ldGVycysrXSA9IF9QYXJhbWV0ZXIoX19zZXEsIF9fbmFtZSwKKwkJCQkJCQkgIF9Jc19zZXF1ZW5jZSgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICBjb25zdCBfRXJyb3JfZm9ybWF0dGVyJgorICAgIF9NX21lc3NhZ2UoY29uc3QgY2hhciogX190ZXh0KSBjb25zdAorICAgIHsgX01fdGV4dCA9IF9fdGV4dDsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBjb25zdCBfRXJyb3JfZm9ybWF0dGVyJgorICAgIF9NX21lc3NhZ2UoX0RlYnVnX21zZ19pZCBfX2lkKSBjb25zdCB0aHJvdyAoKTsKKworICAgIF9HTElCQ1hYX05PUkVUVVJOIHZvaWQKKyAgICBfTV9lcnJvcigpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgX0Vycm9yX2Zvcm1hdHRlcihjb25zdCBjaGFyKiBfX2ZpbGUsIHN0ZDo6c2l6ZV90IF9fbGluZSkKKyAgICA6IF9NX2ZpbGUoX19maWxlKSwgX01fbGluZShfX2xpbmUpLCBfTV9udW1fcGFyYW1ldGVycygwKSwgX01fdGV4dCgwKSwKKyAgICAgIF9NX21heF9sZW5ndGgoNzgpLCBfTV9jb2x1bW4oMSksIF9NX2ZpcnN0X2xpbmUodHJ1ZSksIF9NX3dvcmR3cmFwKGZhbHNlKQorICAgIHsgX01fZ2V0X21heF9sZW5ndGgoKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgdm9pZAorICAgICAgX01fZm9ybWF0X3dvcmQoY2hhciosIGludCwgY29uc3QgY2hhciosIF9UcCkgY29uc3QgdGhyb3cgKCk7CisKKyAgICB2b2lkCisgICAgX01fcHJpbnRfd29yZChjb25zdCBjaGFyKiBfX3dvcmQpIGNvbnN0OworCisgICAgdm9pZAorICAgIF9NX3ByaW50X3N0cmluZyhjb25zdCBjaGFyKiBfX3N0cmluZykgY29uc3Q7CisKKyAgICB2b2lkCisgICAgX01fZ2V0X21heF9sZW5ndGgoKSBjb25zdCB0aHJvdyAoKTsKKworICAgIGVudW0geyBfX21heF9wYXJhbWV0ZXJzID0gOSB9OworCisgICAgY29uc3QgY2hhciogICAgICAgICBfTV9maWxlOworICAgIHN0ZDo6c2l6ZV90ICAgICAgICAgX01fbGluZTsKKyAgICBtdXRhYmxlIF9QYXJhbWV0ZXIgIF9NX3BhcmFtZXRlcnNbX19tYXhfcGFyYW1ldGVyc107CisgICAgbXV0YWJsZSBzdGQ6OnNpemVfdCBfTV9udW1fcGFyYW1ldGVyczsKKyAgICBtdXRhYmxlIGNvbnN0IGNoYXIqIF9NX3RleHQ7CisgICAgbXV0YWJsZSBzdGQ6OnNpemVfdCBfTV9tYXhfbGVuZ3RoOworICAgIGVudW0geyBfTV9pbmRlbnQgPSA0IH0gOworICAgIG11dGFibGUgc3RkOjpzaXplX3QgX01fY29sdW1uOworICAgIG11dGFibGUgYm9vbCAgICAgICAgX01fZmlyc3RfbGluZTsKKyAgICBtdXRhYmxlIGJvb2wgICAgICAgIF9NX3dvcmR3cmFwOworCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgX0Vycm9yX2Zvcm1hdHRlcgorICAgIF9NX2F0KGNvbnN0IGNoYXIqIF9fZmlsZSwgc3RkOjpzaXplX3QgX19saW5lKQorICAgIHsgcmV0dXJuIF9FcnJvcl9mb3JtYXR0ZXIoX19maWxlLCBfX2xpbmUpOyB9CisgIH07Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvZm9yd2FyZF9saXN0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9mb3J3YXJkX2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhMmU5YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvZm9yd2FyZF9saXN0CkBAIC0wLDAgKzEsODAxIEBACisvLyA8Zm9yd2FyZF9saXN0PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvZm9yd2FyZF9saXN0CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19GT1JXQVJEX0xJU1QKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfRk9SV0FSRF9MSVNUIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfc2VxdWVuY2UuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2l0ZXJhdG9yLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fZGVidWcKK3sKKyAgLy8vIENsYXNzIHN0ZDo6Zm9yd2FyZF9saXN0IHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBmb3J3YXJkX2xpc3QKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6Zm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiwKKyAgICAgIHB1YmxpYyBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8Zm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6Zm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiBfQmFzZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgICAgICAgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fYWxsb2NfdHJhaXRzPF9BbGxvYz46OnRlbXBsYXRlCisgICAgICAgIHJlYmluZDxfR0xJQkNYWF9TVERfQzo6X0Z3ZF9saXN0X25vZGU8X1RwPj46Om90aGVyIF9Ob2RlX2FsbG9jX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2FsbG9jX3RyYWl0czxfTm9kZV9hbGxvY190eXBlPiBfTm9kZV9hbGxvY190cmFpdHM7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfaXRlcmF0b3IsCisJCQkJCSAgZm9yd2FyZF9saXN0PiBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLAorCQkJCQkgIGZvcndhcmRfbGlzdD4gY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIC8vIDIzLjIuMy4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdAorICAgICAgZm9yd2FyZF9saXN0KGNvbnN0IF9BbGxvYyYgX19hbCA9IF9BbGxvYygpKQorICAgICAgOiBfQmFzZShfX2FsKSB7IH0KKworICAgICAgZm9yd2FyZF9saXN0KGNvbnN0IGZvcndhcmRfbGlzdCYgX19saXN0LCBjb25zdCBfQWxsb2MmIF9fYWwpCisgICAgICA6IF9CYXNlKF9fbGlzdCwgX19hbCkKKyAgICAgIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3QoZm9yd2FyZF9saXN0JiYgX19saXN0LCBjb25zdCBfQWxsb2MmIF9fYWwpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX2xpc3QuX01fYmFzZSgpKSwgX19hbCkKKyAgICAgIHsKKwlpZiAoX19saXN0LmdldF9hbGxvY2F0b3IoKSA9PSBfX2FsKQorCSAgdGhpcy0+X01fc3dhcChfX2xpc3QpOworCWVsc2UKKwkgIF9fbGlzdC5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisgICAgICBleHBsaWNpdAorICAgICAgZm9yd2FyZF9saXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IF9BbGxvYyYgX19hbCA9IF9BbGxvYygpKQorICAgICAgOiBfQmFzZShfX24sIF9fYWwpCisgICAgICB7IH0KKworICAgICAgZm9yd2FyZF9saXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2FsKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorCWZvcndhcmRfbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgICAgOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgICAgX19sYXN0KSksCisJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSwgX19hbCkKKyAgICAgICAgeyB9CisKKyAgICAgIGZvcndhcmRfbGlzdChjb25zdCBmb3J3YXJkX2xpc3QmIF9fbGlzdCkKKyAgICAgIDogX0Jhc2UoX19saXN0KQorICAgICAgeyB9CisKKyAgICAgIGZvcndhcmRfbGlzdChmb3J3YXJkX2xpc3QmJiBfX2xpc3QpIG5vZXhjZXB0CisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX2xpc3QuX01fYmFzZSgpKSkKKyAgICAgIHsKKwl0aGlzLT5fTV9zd2FwKF9fbGlzdCk7CisgICAgICB9CisKKyAgICAgIGZvcndhcmRfbGlzdChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2lsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BbGxvYyYgX19hbCA9IF9BbGxvYygpKQorICAgICAgOiBfQmFzZShfX2lsLCBfX2FsKQorICAgICAgeyB9CisKKyAgICAgIH5mb3J3YXJkX2xpc3QoKSBub2V4Y2VwdAorICAgICAgeyB9CisKKyAgICAgIGZvcndhcmRfbGlzdCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBmb3J3YXJkX2xpc3QmIF9fbGlzdCkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IF9fbGlzdDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgZm9yd2FyZF9saXN0JgorICAgICAgb3BlcmF0b3I9KGZvcndhcmRfbGlzdCYmIF9fbGlzdCkKKyAgICAgIG5vZXhjZXB0KF9Ob2RlX2FsbG9jX3RyYWl0czo6X1Nfbm90aHJvd19tb3ZlKCkpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX3NlbGZfbW92ZV9hc3NpZ24oX19saXN0KTsKKwlib29sIHhmZXJfbWVtb3J5ID0gX05vZGVfYWxsb2NfdHJhaXRzOjpfU19wcm9wYWdhdGVfb25fbW92ZV9hc3NpZ24oKQorCSAgICB8fCBfX2xpc3QuZ2V0X2FsbG9jYXRvcigpID09IHRoaXMtPmdldF9hbGxvY2F0b3IoKTsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IHN0ZDo6bW92ZShfX2xpc3QpOworCWlmICh4ZmVyX21lbW9yeSkKKwkgIHRoaXMtPl9NX3N3YXAoX19saXN0KTsKKwllbHNlCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9fbGlzdC5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgZm9yd2FyZF9saXN0JgorICAgICAgb3BlcmF0b3I9KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWwpCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBfX2lsOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisJdm9pZAorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwkgIF9CYXNlOjphc3NpZ24oX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKQorICAgICAgeworCV9CYXNlOjphc3NpZ24oX19uLCBfX3ZhbCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgYXNzaWduKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWwpCisgICAgICB7CisJX0Jhc2U6OmFzc2lnbihfX2lsKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorCisgICAgICBpdGVyYXRvcgorICAgICAgYmVmb3JlX2JlZ2luKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWZvcmVfYmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZm9yZV9iZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVmb3JlX2JlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmNiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZm9yZV9iZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6Y2JlZm9yZV9iZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6Y2VuZCgpLCB0aGlzKTsgfQorCisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzOgorCisgICAgICByZWZlcmVuY2UKKyAgICAgIGZyb250KCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwlyZXR1cm4gX0Jhc2U6OmZyb250KCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6ZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgLy8gbW9kae+sgWVyczoKKworICAgICAgdXNpbmcgX0Jhc2U6OmVtcGxhY2VfZnJvbnQ7CisgICAgICB1c2luZyBfQmFzZTo6cHVzaF9mcm9udDsKKworICAgICAgdm9pZAorICAgICAgcG9wX2Zyb250KCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKFt0aGlzXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCSAgeyByZXR1cm4gX19pdCA9PSB0aGlzLT5fTV9iYXNlKCkuY2JlZ2luKCk7IH0pOworCV9CYXNlOjpwb3BfZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X2FmdGVyKF9fcG9zKTsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW1wbGFjZV9hZnRlcihfX3Bvcy5iYXNlKCksCisJCQkJCXN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksCisJCQkgIHRoaXMpOworICAgICAgIAl9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGNvbnN0IF9UcCYgX192YWwpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydF9hZnRlcihfX3Bvcyk7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnRfYWZ0ZXIoX19wb3MuYmFzZSgpLCBfX3ZhbCksIHRoaXMpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfVHAmJiBfX3ZhbCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X2FmdGVyKF9fcG9zKTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydF9hZnRlcihfX3Bvcy5iYXNlKCksIHN0ZDo6bW92ZShfX3ZhbCkpLAorCQkgICAgICAgCXRoaXMpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnRfYWZ0ZXIoX19wb3MpOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0X2FmdGVyKF9fcG9zLmJhc2UoKSwgX19uLCBfX3ZhbCksCisJCSAgICAgICAJdGhpcyk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnRfcmFuZ2VfYWZ0ZXIoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCk7CisJICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydF9hZnRlcihfX3Bvcy5iYXNlKCksCisJCQkJCSAgICAgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQkJCSAgICAgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSksCisJCQkgIHRoaXMpOworICAgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWwpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydF9hZnRlcihfX3Bvcyk7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnRfYWZ0ZXIoX19wb3MuYmFzZSgpLCBfX2lsKSwgdGhpcyk7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgX0Jhc2VfaXRlcmF0b3IKKyAgICAgIF9NX2VyYXNlX2FmdGVyKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fcG9zKQorICAgICAgeworCV9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fbmV4dCA9IHN0ZDo6bmV4dChfX3Bvcyk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihbX19uZXh0XShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCSAgeyByZXR1cm4gX19pdCA9PSBfX25leHQ7IH0pOworCXJldHVybiBfQmFzZTo6ZXJhc2VfYWZ0ZXIoX19wb3MpOworICAgICAgfQorICAgIHB1YmxpYzoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcykKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfYWZ0ZXIoX19wb3MpOworCXJldHVybiBpdGVyYXRvcihfTV9lcmFzZV9hZnRlcihfX3Bvcy5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlX2FmdGVyKF9fcG9zLCBfX2xhc3QpOworCWZvciAoX0Jhc2VfY29uc3RfaXRlcmF0b3IgX192aWN0aW0gPSBzdGQ6Om5leHQoX19wb3MuYmFzZSgpKTsKKwkgICAgX192aWN0aW0gIT0gX19sYXN0LmJhc2UoKTsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdmljdGltICE9IF9CYXNlOjplbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlMikKKwkJCQkgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fcG9zLCAicG9zIikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKFtfX3ZpY3RpbV0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkgICAgICB7IHJldHVybiBfX2l0ID09IF9fdmljdGltOyB9KTsKKwkgIH0KKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlX2FmdGVyKF9fcG9zLmJhc2UoKSwgX19sYXN0LmJhc2UoKSksIHRoaXMpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGZvcndhcmRfbGlzdCYgX19saXN0KQorICAgICAgbm9leGNlcHQoX05vZGVfYWxsb2NfdHJhaXRzOjpfU19ub3Rocm93X3N3YXAoKSkKKyAgICAgIHsKKwlpZiAoIV9Ob2RlX2FsbG9jX3RyYWl0czo6X1NfcHJvcGFnYXRlX29uX3N3YXAoKSkKKwkgIF9fZ2xpYmN4eF9jaGVja19lcXVhbF9hbGxvY3MoX19saXN0KTsKKwlfQmFzZTo6c3dhcChfX2xpc3QpOworCXRoaXMtPl9NX3N3YXAoX19saXN0KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6KQorICAgICAgeworCXRoaXMtPl9NX2RldGFjaF9zaW5ndWxhcigpOworCisJLy8gaWYgX19zeiA8IHNpemUoKSwgaW52YWxpZGF0ZSBhbGwgaXRlcmF0b3JzIGluIFtiZWdpbitfX3N6LCBlbmQoKQorCV9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX0Jhc2U6OmJlZ2luKCk7CisJX0Jhc2VfaXRlcmF0b3IgX19lbmQgPSBfQmFzZTo6ZW5kKCk7CisJZm9yIChzaXplX3R5cGUgX19pID0gX19zejsgX192aWN0aW0gIT0gX19lbmQgJiYgX19pID4gMDsgLS1fX2kpCisJICArK19fdmljdGltOworCisJZm9yICg7IF9fdmljdGltICE9IF9fZW5kOyArK19fdmljdGltKQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKFtfX3ZpY3RpbV0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkgICAgICB7IHJldHVybiBfX2l0ID09IF9fdmljdGltOyB9KTsKKwkgIH0KKworCV9fdHJ5CisJICB7CisJICAgIF9CYXNlOjpyZXNpemUoX19zeik7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIHRoaXMtPl9NX3JldmFsaWRhdGVfc2luZ3VsYXIoKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKQorICAgICAgeworCXRoaXMtPl9NX2RldGFjaF9zaW5ndWxhcigpOworCisJLy8gaWYgX19zeiA8IHNpemUoKSwgaW52YWxpZGF0ZSBhbGwgaXRlcmF0b3JzIGluIFtiZWdpbitfX3N6LCBlbmQoKSkKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9CYXNlOjpiZWdpbigpOworCV9CYXNlX2l0ZXJhdG9yIF9fZW5kID0gX0Jhc2U6OmVuZCgpOworCWZvciAoc2l6ZV90eXBlIF9faSA9IF9fc3o7IF9fdmljdGltICE9IF9fZW5kICYmIF9faSA+IDA7IC0tX19pKQorCSAgKytfX3ZpY3RpbTsKKworCWZvciAoOyBfX3ZpY3RpbSAhPSBfX2VuZDsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihbX192aWN0aW1dKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICAgICAgeyByZXR1cm4gX19pdCA9PSBfX3ZpY3RpbTsgfSk7CisJICB9CisKKwlfX3RyeQorCSAgeworCSAgICBfQmFzZTo6cmVzaXplKF9fc3osIF9fdmFsKTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgdGhpcy0+X01fcmV2YWxpZGF0ZV9zaW5ndWxhcigpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgbm9leGNlcHQKKyAgICAgIHsKKwlfQmFzZTo6Y2xlYXIoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisgICAgICAvLyAyMy4yLjMuNSBmb3J3YXJkX2xpc3Qgb3BlcmF0aW9uczoKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgZm9yd2FyZF9saXN0JiYgX19saXN0KQorICAgICAgeworICAgICAgICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X2FmdGVyKF9fcG9zKTsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoJl9fbGlzdCAhPSB0aGlzLAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc2VsZl9zcGxpY2UpCisJCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikpOworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xpc3QuZ2V0X2FsbG9jYXRvcigpID09IHRoaXMtPmdldF9hbGxvY2F0b3IoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NwbGljZV9hbGxvYykKKwkJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcykKKwkJCSAgICAgIC5fTV9zZXF1ZW5jZShfX2xpc3QsICJfX2xpc3QiKSk7CisJdGhpcy0+X01fdHJhbnNmZXJfZnJvbV9pZihfX2xpc3QsIFsmX19saXN0XShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCSAgeworCSAgICByZXR1cm4gX19pdCAhPSBfX2xpc3QuX01fYmFzZSgpLmNiZWZvcmVfYmVnaW4oKQorCQkgICAmJiBfX2l0ICE9IF9fbGlzdC5fTV9iYXNlKCkuZW5kKCk7CisJICB9KTsKKwlfQmFzZTo6c3BsaWNlX2FmdGVyKF9fcG9zLmJhc2UoKSwgc3RkOjptb3ZlKF9fbGlzdC5fTV9iYXNlKCkpKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBmb3J3YXJkX2xpc3QmIF9fbGlzdCkKKyAgICAgIHsgc3BsaWNlX2FmdGVyKF9fcG9zLCBzdGQ6Om1vdmUoX19saXN0KSk7IH0KKworICAgICAgdm9pZAorICAgICAgc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBmb3J3YXJkX2xpc3QmJiBfX2xpc3QsCisJCSAgIGNvbnN0X2l0ZXJhdG9yIF9faSkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X2FmdGVyKF9fcG9zKTsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19pLl9NX2JlZm9yZV9kZXJlZmVyZW5jZWFibGUoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NwbGljZV9iYWQpCisJCQkgICAgICAuX01faXRlcmF0b3IoX19pLCAiX19pIikpOworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2kuX01fYXR0YWNoZWRfdG8oJl9fbGlzdCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zcGxpY2Vfb3RoZXIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX19pLCAiX19pIikKKwkJCSAgICAgIC5fTV9zZXF1ZW5jZShfX2xpc3QsICJfX2xpc3QiKSk7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGlzdC5nZXRfYWxsb2NhdG9yKCkgPT0gdGhpcy0+Z2V0X2FsbG9jYXRvcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc3BsaWNlX2FsbG9jKQorCQkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzKQorCQkJICAgICAgLl9NX3NlcXVlbmNlKF9fbGlzdCwgIl9fbGlzdCIpKTsKKworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAyNTAuIHNwbGljaW5nIGludmFsaWRhdGVzIGl0ZXJhdG9ycworCV9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fbmV4dCA9IHN0ZDo6bmV4dChfX2kuYmFzZSgpKTsKKwl0aGlzLT5fTV90cmFuc2Zlcl9mcm9tX2lmKF9fbGlzdCwgW19fbmV4dF0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkgIHsgcmV0dXJuIF9faXQgPT0gX19uZXh0OyB9KTsKKwlfQmFzZTo6c3BsaWNlX2FmdGVyKF9fcG9zLmJhc2UoKSwgc3RkOjptb3ZlKF9fbGlzdC5fTV9iYXNlKCkpLAorCQkJICAgIF9faS5iYXNlKCkpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGZvcndhcmRfbGlzdCYgX19saXN0LAorCQkgICBjb25zdF9pdGVyYXRvciBfX2kpCisgICAgICB7IHNwbGljZV9hZnRlcihfX3Bvcywgc3RkOjptb3ZlKF9fbGlzdCksIF9faSk7IH0KKworICAgICAgdm9pZAorICAgICAgc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBmb3J3YXJkX2xpc3QmJiBfX2xpc3QsCisJCSAgIGNvbnN0X2l0ZXJhdG9yIF9fYmVmb3JlLCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisgICAgICAgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnRfYWZ0ZXIoX19wb3MpOworCV9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2JlZm9yZSwgX19sYXN0KTsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19iZWZvcmUuX01fYXR0YWNoZWRfdG8oJl9fbGlzdCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zcGxpY2Vfb3RoZXIpCisJCQkgICAgICAuX01fc2VxdWVuY2UoX19saXN0LCAibGlzdCIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX19iZWZvcmUsICJiZWZvcmUiKSk7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fYmVmb3JlLl9NX2RlcmVmZXJlbmNlYWJsZSgpCisJCQkgICAgICB8fCBfX2JlZm9yZS5fTV9pc19iZWZvcmVfYmVnaW4oKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlMikKKwkJCSAgICAgIC5fTV9zZXF1ZW5jZShfX2xpc3QsICJsaXN0IikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcihfX2JlZm9yZSwgImJlZm9yZSIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19iZWZvcmUgIT0gX19sYXN0LAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UyKQorCQkJICAgICAgLl9NX3NlcXVlbmNlKF9fbGlzdCwgImxpc3QiKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKF9fYmVmb3JlLCAiYmVmb3JlIikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xpc3QuZ2V0X2FsbG9jYXRvcigpID09IHRoaXMtPmdldF9hbGxvY2F0b3IoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NwbGljZV9hbGxvYykKKwkJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcykKKwkJCSAgICAgIC5fTV9zZXF1ZW5jZShfX2xpc3QsICJfX2xpc3QiKSk7CisKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdG1wID0gc3RkOjpuZXh0KF9fYmVmb3JlLmJhc2UoKSk7CisJICAgICBfX3RtcCAhPSBfX2xhc3QuYmFzZSgpOyArK19fdG1wKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX190bXAgIT0gX19saXN0Ll9NX2Jhc2UoKS5lbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlMikKKwkJCQkgIC5fTV9zZXF1ZW5jZShfX2xpc3QsICJsaXN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2JlZm9yZSwgImJlZm9yZSIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCZfX2xpc3QgIT0gdGhpcyB8fCBfX3RtcCAhPSBfX3Bvcy5iYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc3BsaWNlX292ZXJsYXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLl9NX2l0ZXJhdG9yKF9fdG1wLCAicG9zaXRpb24iKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fYmVmb3JlLCAiYmVmb3JlIikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgIC8vIDI1MC4gc3BsaWNpbmcgaW52YWxpZGF0ZXMgaXRlcmF0b3JzCisJICAgIHRoaXMtPl9NX3RyYW5zZmVyX2Zyb21faWYoX19saXN0LCBbX190bXBdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICAgICAgeyByZXR1cm4gX19pdCA9PSBfX3RtcDsgfSk7CisJICB9CisKKwlfQmFzZTo6c3BsaWNlX2FmdGVyKF9fcG9zLmJhc2UoKSwgc3RkOjptb3ZlKF9fbGlzdC5fTV9iYXNlKCkpLAorCQkJICAgIF9fYmVmb3JlLmJhc2UoKSwgX19sYXN0LmJhc2UoKSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgZm9yd2FyZF9saXN0JiBfX2xpc3QsCisJCSAgIGNvbnN0X2l0ZXJhdG9yIF9fYmVmb3JlLCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHNwbGljZV9hZnRlcihfX3Bvcywgc3RkOjptb3ZlKF9fbGlzdCksIF9fYmVmb3JlLCBfX2xhc3QpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlbW92ZShjb25zdCBfVHAmIF9fdmFsKQorICAgICAgeworCV9CYXNlX2l0ZXJhdG9yIF9feCA9IF9CYXNlOjpiZWZvcmVfYmVnaW4oKTsKKwlfQmFzZV9pdGVyYXRvciBfX29sZCA9IF9feCsrOworCXdoaWxlIChfX3ggIT0gX0Jhc2U6OmVuZCgpKQorCSAgeworCSAgICBpZiAoKl9feCA9PSBfX3ZhbCkKKwkgICAgICBfX3ggPSBfTV9lcmFzZV9hZnRlcihfX29sZCk7CisJICAgIGVsc2UKKwkgICAgICBfX29sZCA9IF9feCsrOworCSAgfQorICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZD4KKyAgICAgICAgdm9pZAorICAgICAgICByZW1vdmVfaWYoX1ByZWQgX19wcmVkKQorCXsKKwkgIF9CYXNlX2l0ZXJhdG9yIF9feCA9IF9CYXNlOjpiZWZvcmVfYmVnaW4oKTsKKwkgIF9CYXNlX2l0ZXJhdG9yIF9fb2xkID0gX194Kys7CisJICB3aGlsZSAoX194ICE9IF9CYXNlOjplbmQoKSkKKwkgICAgeworCSAgICAgIGlmIChfX3ByZWQoKl9feCkpCisJCV9feCA9IF9NX2VyYXNlX2FmdGVyKF9fb2xkKTsKKwkgICAgICBlbHNlCisJCV9fb2xkID0gX194Kys7CisJICAgIH0KKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIHVuaXF1ZSgpCisgICAgICB7CisJX0Jhc2VfaXRlcmF0b3IgX19maXJzdCA9IF9CYXNlOjpiZWdpbigpOworCV9CYXNlX2l0ZXJhdG9yIF9fbGFzdCA9IF9CYXNlOjplbmQoKTsKKwlpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJICByZXR1cm47CisJX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gc3RkOjpuZXh0KF9fZmlyc3QpOworCXdoaWxlIChfX25leHQgIT0gX19sYXN0KQorCSAgeworCSAgICBpZiAoKl9fZmlyc3QgPT0gKl9fbmV4dCkKKwkgICAgICBfX25leHQgPSBfTV9lcmFzZV9hZnRlcihfX2ZpcnN0KTsKKwkgICAgZWxzZQorCSAgICAgIF9fZmlyc3QgPSBfX25leHQrKzsKKwkgIH0KKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpblByZWQ+CisgICAgICAgIHZvaWQKKyAgICAgICAgdW5pcXVlKF9CaW5QcmVkIF9fYmluYXJ5X3ByZWQpCisJeworCSAgX0Jhc2VfaXRlcmF0b3IgX19maXJzdCA9IF9CYXNlOjpiZWdpbigpOworCSAgX0Jhc2VfaXRlcmF0b3IgX19sYXN0ID0gX0Jhc2U6OmVuZCgpOworCSAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgICByZXR1cm47CisJICBfQmFzZV9pdGVyYXRvciBfX25leHQgPSBzdGQ6Om5leHQoX19maXJzdCk7CisJICB3aGlsZSAoX19uZXh0ICE9IF9fbGFzdCkKKwkgICAgeworCSAgICAgIGlmIChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkKKwkJX19uZXh0ID0gX01fZXJhc2VfYWZ0ZXIoX19maXJzdCk7CisJICAgICAgZWxzZQorCQlfX2ZpcnN0ID0gX19uZXh0Kys7CisJICAgIH0KKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIG1lcmdlKGZvcndhcmRfbGlzdCYmIF9fbGlzdCkKKyAgICAgIHsKKwlpZiAodGhpcyAhPSAmX19saXN0KQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWQoX0Jhc2U6OmJlZ2luKCksIF9CYXNlOjplbmQoKSk7CisJICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkKF9fbGlzdC5fTV9iYXNlKCkuYmVnaW4oKSwKKwkJCQkgX19saXN0Ll9NX2Jhc2UoKS5lbmQoKSk7CisJICB0aGlzLT5fTV90cmFuc2Zlcl9mcm9tX2lmKF9fbGlzdCwgWyZfX2xpc3RdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICAgIHsKKwkgICAgICByZXR1cm4gX19pdCAhPSBfX2xpc3QuX01fYmFzZSgpLmNiZWZvcmVfYmVnaW4oKQorCQkgICAgICYmIF9faXQgIT0gX19saXN0Ll9NX2Jhc2UoKS5jZW5kKCk7CisJICAgIH0pOworCSAgX0Jhc2U6Om1lcmdlKHN0ZDo6bW92ZShfX2xpc3QuX01fYmFzZSgpKSk7CisJfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBtZXJnZShmb3J3YXJkX2xpc3QmIF9fbGlzdCkKKyAgICAgIHsgbWVyZ2Uoc3RkOjptb3ZlKF9fbGlzdCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db21wPgorICAgICAgICB2b2lkCisgICAgICAgIG1lcmdlKGZvcndhcmRfbGlzdCYmIF9fbGlzdCwgX0NvbXAgX19jb21wKQorCXsKKwkgIGlmICh0aGlzICE9ICZfX2xpc3QpCisJICB7CisJICAgIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWRfcHJlZChfQmFzZTo6YmVnaW4oKSwgX0Jhc2U6OmVuZCgpLCBfX2NvbXApOworCSAgICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkX3ByZWQoX19saXN0Ll9NX2Jhc2UoKS5iZWdpbigpLAorCQkJCQlfX2xpc3QuX01fYmFzZSgpLmVuZCgpLCBfX2NvbXApOworCSAgICB0aGlzLT5fTV90cmFuc2Zlcl9mcm9tX2lmKF9fbGlzdCwKKwkJCQkgICAgICBbJl9fbGlzdF0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkgICAgICB7CisJICAgICAgICByZXR1cm4gX19pdCAhPSBfX2xpc3QuX01fYmFzZSgpLmNiZWZvcmVfYmVnaW4oKQorCQkgICAgICAgJiYgX19pdCAhPSBfX2xpc3QuX01fYmFzZSgpLmNlbmQoKTsKKwkgICAgICB9KTsKKwkgICAgX0Jhc2U6Om1lcmdlKHN0ZDo6bW92ZShfX2xpc3QuX01fYmFzZSgpKSwgX19jb21wKTsKKwkgIH0KKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db21wPgorICAgICAgICB2b2lkCisgICAgICAgIG1lcmdlKGZvcndhcmRfbGlzdCYgX19saXN0LCBfQ29tcCBfX2NvbXApCisgICAgICAgIHsgbWVyZ2Uoc3RkOjptb3ZlKF9fbGlzdCksIF9fY29tcCk7IH0KKworICAgICAgdXNpbmcgX0Jhc2U6OnNvcnQ7CisgICAgICB1c2luZyBfQmFzZTo6cmV2ZXJzZTsKKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgbm9leGNlcHQgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2FsbCgpCisgICAgICB7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihbdGhpc10oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkgIHsKKwkgICAgcmV0dXJuIF9faXQgIT0gdGhpcy0+X01fYmFzZSgpLmNiZWZvcmVfYmVnaW4oKQorCQkgICAmJiBfX2l0ICE9IHRoaXMtPl9NX2Jhc2UoKS5jZW5kKCk7CisJICB9KTsKKyAgICAgIH0KKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yX2Jhc2UgX1NhZmVfaXRlcmF0b3JfYmFzZTsKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfTV9zd2FwX2F1eChmb3J3YXJkX2xpc3QmIF9fbGhzLAorCQkgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UqJiBfX2xoc19pdGVyYXRvcnMsCisJCSAgZm9yd2FyZF9saXN0JiBfX3JocywKKwkJICBfU2FmZV9pdGVyYXRvcl9iYXNlKiYgX19yaHNfaXRlcmF0b3JzKTsKKyAgICAgIHZvaWQgX01fc3dhcChmb3J3YXJkX2xpc3QmIF9fbGlzdCk7CisgICAgfTsKKworICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIF9NX3N3YXBfYXV4KGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCQlfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3JfYmFzZSomIF9fbGhzX2l0ZXJhdG9ycywKKwkJZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19yaHMsCisJCV9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcl9iYXNlKiYgX19yaHNfaXRlcmF0b3JzKQorICAgIHsKKyAgICAgIHVzaW5nIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcl9iYXNlOworICAgICAgX1NhZmVfaXRlcmF0b3JfYmFzZSogX19iYmVnaW5faXRzID0gMDsKKyAgICAgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9fbGFzdF9iYmVnaW4gPSAwOworICAgICAgZm9yIChfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0ZXIgPSBfX2xoc19pdGVyYXRvcnM7IF9faXRlcjspCisJeworCSAgLy8gRXZlbiBpdGVyYXRvciBhcmUgY2FzdGVkIHRvIGNvbnN0X2l0ZXJhdG9yLCBub3QgYSBwcm9ibGVtLgorCSAgY29uc3RfaXRlcmF0b3IqIF9fdmljdGltID0gc3RhdGljX2Nhc3Q8Y29uc3RfaXRlcmF0b3IqPihfX2l0ZXIpOworCSAgX19pdGVyID0gX19pdGVyLT5fTV9uZXh0OworCSAgaWYgKF9fdmljdGltLT5iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpLmNiZWZvcmVfYmVnaW4oKSkKKwkgICAgeworCSAgICAgIF9fdmljdGltLT5fTV91bmxpbmsoKTsKKwkgICAgICBpZiAoX19saHNfaXRlcmF0b3JzID09IF9fdmljdGltKQorCQlfX2xoc19pdGVyYXRvcnMgPSBfX3ZpY3RpbS0+X01fbmV4dDsKKwkgICAgICBpZiAoX19iYmVnaW5faXRzKQorCQl7CisJCSAgX192aWN0aW0tPl9NX25leHQgPSBfX2JiZWdpbl9pdHM7CisJCSAgX19iYmVnaW5faXRzLT5fTV9wcmlvciA9IF9fdmljdGltOworCQl9CisJICAgICAgZWxzZQorCQlfX2xhc3RfYmJlZ2luID0gX192aWN0aW07CisJICAgICAgX19iYmVnaW5faXRzID0gX192aWN0aW07CisJICAgIH0KKwkgIGVsc2UKKwkgICAgX192aWN0aW0tPl9NX3NlcXVlbmNlID0gJl9fbGhzOworCX0KKworICAgICAgaWYgKF9fYmJlZ2luX2l0cykKKwl7CisJICBpZiAoX19yaHNfaXRlcmF0b3JzKQorCSAgICB7CisJICAgICAgX19yaHNfaXRlcmF0b3JzLT5fTV9wcmlvciA9IF9fbGFzdF9iYmVnaW47CisJICAgICAgX19sYXN0X2JiZWdpbi0+X01fbmV4dCA9IF9fcmhzX2l0ZXJhdG9yczsKKwkgICAgfQorCSAgX19yaHNfaXRlcmF0b3JzID0gX19iYmVnaW5faXRzOworCX0KKyAgICB9CisKKyAgLyogU3BlY2lhbCBmb3J3YXJkX2xpc3QgX01fc3dhcCB2ZXJzaW9uIHRoYXQgZG8gbm90IHN3YXAgdGhlCisgICAqIGJlZm9yZS1iZWdpbiBvd25lcnNoaXAuKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIF9NX3N3YXAoZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19saXN0KQorICAgIHsKKyAgICAgIF9fZ251X2N4eDo6X19zY29wZWRfbG9jayBzZW50cnkodGhpcy0+X01fZ2V0X211dGV4KCkpOworICAgICAgc3RkOjpzd2FwKHRoaXMtPl9NX2l0ZXJhdG9ycywgX19saXN0Ll9NX2l0ZXJhdG9ycyk7CisgICAgICBzdGQ6OnN3YXAodGhpcy0+X01fY29uc3RfaXRlcmF0b3JzLCBfX2xpc3QuX01fY29uc3RfaXRlcmF0b3JzKTsKKyAgICAgIC8vIFVzZWxlc3MsIGFsd2F5cyAxIG9uIGZvcndhcmRfbGlzdAorICAgICAgLy9zdGQ6OnN3YXAodGhpcy0+X01fdmVyc2lvbiwgX19saXN0Ll9NX3ZlcnNpb24pOworICAgICAgX1NhZmVfaXRlcmF0b3JfYmFzZSogX190aGlzX2l0cyA9IHRoaXMtPl9NX2l0ZXJhdG9yczsKKyAgICAgIF9NX3N3YXBfYXV4KF9fbGlzdCwgX19saXN0Ll9NX2l0ZXJhdG9ycywgKnRoaXMsIHRoaXMtPl9NX2l0ZXJhdG9ycyk7CisgICAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX3RoaXNfY29uc3RfaXRzID0gdGhpcy0+X01fY29uc3RfaXRlcmF0b3JzOworICAgICAgX01fc3dhcF9hdXgoX19saXN0LCBfX2xpc3QuX01fY29uc3RfaXRlcmF0b3JzLCAqdGhpcywKKwkJICB0aGlzLT5fTV9jb25zdF9pdGVyYXRvcnMpOworICAgICAgX01fc3dhcF9hdXgoKnRoaXMsIF9fdGhpc19pdHMsIF9fbGlzdCwgX19saXN0Ll9NX2l0ZXJhdG9ycyk7CisgICAgICBfTV9zd2FwX2F1eCgqdGhpcywgX190aGlzX2NvbnN0X2l0cywgX19saXN0LCBfX2xpc3QuX01fY29uc3RfaXRlcmF0b3JzKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gX19seC5fTV9iYXNlKCkgPT0gX19seS5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuIF9fbHguX01fYmFzZSgpIDwgX19seS5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gIShfX2x4ID09IF9fbHkpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuIChfX2x5IDwgX19seCk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiAhKF9fbHggPCBfX2x5KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuICEoX19seSA8IF9fbHgpOyB9CisKKyAgLy8vIFNlZSBzdGQ6OmZvcndhcmRfbGlzdDo6c3dhcCgpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKwkgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IF9fbHguc3dhcChfX2x5KTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX2RlYnVnCit9IC8vIG5hbWVzcGFjZSBzdGQKKworbmFtZXNwYWNlIF9fZ251X2RlYnVnCit7CisgIHRlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfQmVmb3JlQmVnaW5IZWxwZXI8c3RkOjpfX2RlYnVnOjpmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6X19kZWJ1Zzo6Zm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiBfU2VxdWVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgX0l0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXQ6Oml0ZXJhdG9yX3R5cGUgX0Jhc2VJdDsKKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX0lzKF9CYXNlSXQgX19pdCwgY29uc3QgX1NlcXVlbmNlKiBfX3NlcSkKKyAgICAgIHsgcmV0dXJuIF9faXQgPT0gX19zZXEtPl9NX2Jhc2UoKS5jYmVmb3JlX2JlZ2luKCk7IH0KKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX0lzX0JlZ2lubmVzdChfQmFzZUl0IF9faXQsIGNvbnN0IF9TZXF1ZW5jZSogX19zZXEpCisgICAgICB7IHJldHVybiBfU19JcyhfX2l0LCBfX3NlcSk7IH0KKyAgICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvZnVuY3Rpb25zLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2Z1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExM2M5OTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2Z1bmN0aW9ucy5oCkBAIC0wLDAgKzEsNDUwIEBACisvLyBEZWJ1Z2dpbmcgc3VwcG9ydCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvZnVuY3Rpb25zLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX0ZVTkNUSU9OU19ICisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX0ZVTkNUSU9OU19IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oPiAvLyBmb3IgaXRlcmF0b3JfdHJhaXRzLCBjYXRlZ29yaWVzIGFuZAorCQkJCQkgIC8vIF9JdGVyX2Jhc2UKKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPiAgICAgICAgIC8vIGZvciBfX2lzX2ludGVnZXIKKyNpbmNsdWRlIDxkZWJ1Zy9mb3JtYXR0ZXIuaD4KKworbmFtZXNwYWNlIF9fZ251X2RlYnVnCit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGNsYXNzIF9TYWZlX2l0ZXJhdG9yOworCisgIC8vIEFuIGFyYml0cmFyeSBpdGVyYXRvciBwb2ludGVyIGlzIG5vdCBzaW5ndWxhci4KKyAgaW5saW5lIGJvb2wKKyAgX19jaGVja19zaW5ndWxhcl9hdXgoY29uc3Qgdm9pZCopIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8gV2UgbWF5IGhhdmUgYW4gaXRlcmF0b3IgdGhhdCBkZXJpdmVzIGZyb20gX1NhZmVfaXRlcmF0b3JfYmFzZSBidXQgaXNuJ3QKKyAgLy8gYSBfU2FmZV9pdGVyYXRvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zaW5ndWxhcihfSXRlcmF0b3ImIF9feCkKKyAgICB7IHJldHVybiBfX2NoZWNrX3Npbmd1bGFyX2F1eCgmX194KTsgfQorCisgIC8qKiBOb24tTlVMTCBwb2ludGVycyBhcmUgbm9uc2luZ3VsYXIuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc2luZ3VsYXIoY29uc3QgX1RwKiBfX3B0cikKKyAgICB7IHJldHVybiBfX3B0ciA9PSAwOyB9CisKKyAgLyoqIFNhZmUgaXRlcmF0b3JzIGtub3cgaWYgdGhleSBhcmUgc2luZ3VsYXIuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zaW5ndWxhcihjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9feCkKKyAgICB7IHJldHVybiBfX3guX01fc2luZ3VsYXIoKTsgfQorCisgIC8qKiBBc3N1bWUgdGhhdCBzb21lIGFyYml0cmFyeSBpdGVyYXRvciBpcyBkZXJlZmVyZW5jZWFibGUsIGJlY2F1c2Ugd2UKKyAgICAgIGNhbid0IHByb3ZlIHRoYXQgaXQgaXNuJ3QuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfZGVyZWZlcmVuY2VhYmxlKF9JdGVyYXRvciYpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8qKiBOb24tTlVMTCBwb2ludGVycyBhcmUgZGVyZWZlcmVuY2VhYmxlLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX2RlcmVmZXJlbmNlYWJsZShjb25zdCBfVHAqIF9fcHRyKQorICAgIHsgcmV0dXJuIF9fcHRyOyB9CisKKyAgLyoqIFNhZmUgaXRlcmF0b3JzIGtub3cgaWYgdGhleSBhcmUgc2luZ3VsYXIuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19kZXJlZmVyZW5jZWFibGUoY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3gpCisgICAgeyByZXR1cm4gX194Ll9NX2RlcmVmZXJlbmNlYWJsZSgpOyB9CisKKyAgLyoqIElmIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycyBpcworICAgKiAgbm9ubmVnYXRpdmUsIGFzc3VtZSB0aGUgcmFuZ2UgaXMgdmFsaWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fdmFsaWRfcmFuZ2VfYXV4Mihjb25zdCBfUmFuZG9tQWNjZXNzSXRlcmF0b3ImIF9fZmlyc3QsCisJCSAgICAgICBjb25zdCBfUmFuZG9tQWNjZXNzSXRlcmF0b3ImIF9fbGFzdCwKKwkJICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeyByZXR1cm4gX19sYXN0IC0gX19maXJzdCA+PSAwOyB9CisKKyAgLyoqIENhbid0IHRlc3QgZm9yIGEgdmFsaWQgcmFuZ2Ugd2l0aCBpbnB1dCBpdGVyYXRvcnMsIGJlY2F1c2UKKyAgICogIGl0ZXJhdGlvbiBtYXkgYmUgZGVzdHJ1Y3RpdmUuIFNvIHdlIGp1c3QgYXNzdW1lIHRoYXQgdGhlIHJhbmdlCisgICAqICBpcyB2YWxpZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX3ZhbGlkX3JhbmdlX2F1eDIoY29uc3QgX0lucHV0SXRlcmF0b3ImLCBjb25zdCBfSW5wdXRJdGVyYXRvciYsCisJCSAgICAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgLyoqIFdlIHNheSB0aGF0IGludGVncmFsIHR5cGVzIGZvciBhIHZhbGlkIHJhbmdlLCBhbmQgZGVmZXIgdG8gb3RoZXIKKyAgICogIHJvdXRpbmVzIHRvIHJlYWxpemUgd2hhdCB0byBkbyB3aXRoIGludGVncmFsIHR5cGVzIGluc3RlYWQgb2YKKyAgICogIGl0ZXJhdG9ycy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVncmFsPgorICAgIGlubGluZSBib29sCisgICAgX192YWxpZF9yYW5nZV9hdXgoY29uc3QgX0ludGVncmFsJiwgY29uc3QgX0ludGVncmFsJiwgc3RkOjpfX3RydWVfdHlwZSkKKyAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgLyoqIFdlIGhhdmUgaXRlcmF0b3JzLCBzbyBmaWd1cmUgb3V0IHdoYXQga2luZCBvZiBpdGVyYXRvcnMgdGhhdCBhcmUKKyAgICogIHRvIHNlZSBpZiB3ZSBjYW4gY2hlY2sgdGhlIHJhbmdlIGFoZWFkIG9mIHRpbWUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgX192YWxpZF9yYW5nZV9hdXgoY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fZmlyc3QsCisJCSAgICAgIGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2xhc3QsIHN0ZDo6X19mYWxzZV90eXBlKQorICB7IHJldHVybiBfX3ZhbGlkX3JhbmdlX2F1eDIoX19maXJzdCwgX19sYXN0LAorCQkJICAgICAgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsgfQorCisgIC8qKiBEb24ndCBrbm93IHdoYXQgdGhlc2UgaXRlcmF0b3JzIGFyZSwgb3IgaWYgdGhleSBhcmUgZXZlbgorICAgKiAgaXRlcmF0b3JzICh3ZSBtYXkgZ2V0IGFuIGludGVncmFsIHR5cGUgZm9yIElucHV0SXRlcmF0b3IpLCBzbworICAgKiAgc2VlIGlmIHRoZXkgYXJlIGludGVncmFsIGFuZCBwYXNzIHRoZW0gb24gdG8gdGhlIG5leHQgcGhhc2UKKyAgICogIG90aGVyd2lzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX3ZhbGlkX3JhbmdlKGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBfSW5wdXRJdGVyYXRvciYgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworICAgICAgcmV0dXJuIF9fdmFsaWRfcmFuZ2VfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICAgIH0KKworICAvKiogU2FmZSBpdGVyYXRvcnMga25vdyBob3cgdG8gY2hlY2sgaWYgdGhleSBmb3JtIGEgdmFsaWQgcmFuZ2UuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgX192YWxpZF9yYW5nZShjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fZmlyc3QsCisJCSAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xhc3QpCisgICAgeyByZXR1cm4gX19maXJzdC5fTV92YWxpZF9yYW5nZShfX2xhc3QpOyB9CisKKyAgLyoqIFNhZmUgbG9jYWwgaXRlcmF0b3JzIGtub3cgaG93IHRvIGNoZWNrIGlmIHRoZXkgZm9ybSBhIHZhbGlkIHJhbmdlLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fdmFsaWRfcmFuZ2UoY29uc3QgX1NhZmVfbG9jYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2ZpcnN0LAorCQkgIGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19sYXN0KQorICAgIHsgcmV0dXJuIF9fZmlyc3QuX01fdmFsaWRfcmFuZ2UoX19sYXN0KTsgfQorCisgIC8qIENoZWNrcyB0aGF0IFtmaXJzdCwgbGFzdCkgaXMgYSB2YWxpZCByYW5nZSwgYW5kIHRoZW4gcmV0dXJucworICAgKiBfX2ZpcnN0LiBUaGlzIHJvdXRpbmUgaXMgdXNlZnVsIHdoZW4gd2UgY2FuJ3QgdXNlIGEgc2VwYXJhdGUKKyAgICogYXNzZXJ0aW9uIHN0YXRlbWVudCBiZWNhdXNlLCBlLmcuLCB3ZSBhcmUgaW4gYSBjb25zdHJ1Y3Rvci4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9JbnB1dEl0ZXJhdG9yCisgICAgX19jaGVja192YWxpZF9yYW5nZShjb25zdCBfSW5wdXRJdGVyYXRvciYgX19maXJzdCwKKwkJCWNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2xhc3QKKwkJCV9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSkKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAvKiogQ2hlY2tzIHRoYXQgX19zIGlzIG5vbi1OVUxMIG9yIF9fbiA9PSAwLCBhbmQgdGhlbiByZXR1cm5zIF9fcy4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICBpbmxpbmUgY29uc3QgX0NoYXJUKgorICAgIF9fY2hlY2tfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLAorCQkgICBjb25zdCBfSW50ZWdlciYgX19uIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSkKKyAgICB7CisjaWZkZWYgX0dMSUJDWFhfREVCVUdfUEVEQU5USUMKKyAgICAgIF9fZ2xpYmN4eF9hc3NlcnQoX19zICE9IDAgfHwgX19uID09IDApOworI2VuZGlmCisgICAgICByZXR1cm4gX19zOworICAgIH0KKworICAvKiogQ2hlY2tzIHRoYXQgX19zIGlzIG5vbi1OVUxMIGFuZCB0aGVuIHJldHVybnMgX19zLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIGNvbnN0IF9DaGFyVCoKKyAgICBfX2NoZWNrX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcykKKyAgICB7CisjaWZkZWYgX0dMSUJDWFhfREVCVUdfUEVEQU5USUMKKyAgICAgIF9fZ2xpYmN4eF9hc3NlcnQoX19zICE9IDApOworI2VuZGlmCisgICAgICByZXR1cm4gX19zOworICAgIH0KKworICAvLyBDYW4ndCBjaGVjayBpZiBhbiBpbnB1dCBpdGVyYXRvciBzZXF1ZW5jZSBpcyBzb3J0ZWQsIGJlY2F1c2Ugd2UKKyAgLy8gY2FuJ3Qgc3RlcCB0aHJvdWdoIHRoZSBzZXF1ZW5jZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3NvcnRlZF9hdXgoY29uc3QgX0lucHV0SXRlcmF0b3ImLCBjb25zdCBfSW5wdXRJdGVyYXRvciYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKworICAvLyBDYW4gdmVyaWZ5IGlmIGEgZm9yd2FyZCBpdGVyYXRvciBzZXF1ZW5jZSBpcyBpbiBmYWN0IHNvcnRlZCB1c2luZworICAvLyBzdGQ6Ol9faXNfc29ydGVkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3NvcnRlZF9hdXgoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBmb3IgKCsrX19uZXh0OyBfX25leHQgIT0gX19sYXN0OyBfX2ZpcnN0ID0gX19uZXh0LCArK19fbmV4dCkKKyAgICAgICAgaWYgKCpfX25leHQgPCAqX19maXJzdCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29uLCBhcyB0aGUgaXRlcmF0b3IgcmFuZ2UgaGFzIGJlZW4gdmFsaWRhdGVkLCBjaGVjayBvbgorICAvLyByYW5kb20gYWNjZXNzIHNhZmUgaXRlcmF0b3JzIGlzIGRvbmUgdXNpbmcgdGhlIGJhc2UgaXRlcmF0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zb3J0ZWRfYXV4KGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19maXJzdCwKKwkJICAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19sYXN0LAorCQkgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBfX3RhZykKKyAgeyByZXR1cm4gX19jaGVja19zb3J0ZWRfYXV4KF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpLCBfX3RhZyk7IH0KKworICAvLyBDYW4ndCBjaGVjayBpZiBhbiBpbnB1dCBpdGVyYXRvciBzZXF1ZW5jZSBpcyBzb3J0ZWQsIGJlY2F1c2Ugd2UgY2FuJ3Qgc3RlcAorICAvLyB0aHJvdWdoIHRoZSBzZXF1ZW5jZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3NvcnRlZF9hdXgoY29uc3QgX0lucHV0SXRlcmF0b3ImLCBjb25zdCBfSW5wdXRJdGVyYXRvciYsCisgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUsIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKworICAvLyBDYW4gdmVyaWZ5IGlmIGEgZm9yd2FyZCBpdGVyYXRvciBzZXF1ZW5jZSBpcyBpbiBmYWN0IHNvcnRlZCB1c2luZworICAvLyBzdGQ6Ol9faXNfc29ydGVkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3NvcnRlZF9hdXgoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgZm9yICgrK19fbmV4dDsgX19uZXh0ICE9IF9fbGFzdDsgX19maXJzdCA9IF9fbmV4dCwgKytfX25leHQpCisgICAgICAgIGlmIChfX3ByZWQoKl9fbmV4dCwgKl9fZmlyc3QpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb24sIGFzIHRoZSBpdGVyYXRvciByYW5nZSBoYXMgYmVlbiB2YWxpZGF0ZWQsIGNoZWNrIG9uCisgIC8vIHJhbmRvbSBhY2Nlc3Mgc2FmZSBpdGVyYXRvcnMgaXMgZG9uZSB1c2luZyB0aGUgYmFzZSBpdGVyYXRvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2UsCisJICAgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkX2F1eChjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fZmlyc3QsCisJCSAgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGFzdCwKKwkJICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLAorCQkgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBfX3RhZykKKyAgeyByZXR1cm4gX19jaGVja19zb3J0ZWRfYXV4KF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpLCBfX3ByZWQsIF9fdGFnKTsgfQorCisgIC8vIERldGVybWluZSBpZiBhIHNlcXVlbmNlIGlzIHNvcnRlZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3NvcnRlZChjb25zdCBfSW5wdXRJdGVyYXRvciYgX19maXJzdCwgY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgPCBvcGVyYXRvciBmb3IgZWxlbWVudHMgaW4gdGhlIHNlcXVlbmNlIGlzIGEKKyAgICAgIC8vIFN0cmljdFdlYWtPcmRlcmluZyBieSBjaGVja2luZyB0aGF0IGl0IGlzIGlycmVmbGV4aXZlLgorICAgICAgX19nbGliY3h4X2Fzc2VydChfX2ZpcnN0ID09IF9fbGFzdCB8fCAhKCpfX2ZpcnN0IDwgKl9fZmlyc3QpKTsKKworICAgICAgcmV0dXJuIF9fY2hlY2tfc29ydGVkX2F1eChfX2ZpcnN0LCBfX2xhc3QsCisJCQkJc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3NvcnRlZChjb25zdCBfSW5wdXRJdGVyYXRvciYgX19maXJzdCwgY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgcHJlZGljYXRlIGlzIFN0cmljdFdlYWtPcmRlcmluZyBieSBjaGVja2luZyB0aGF0IGl0CisgICAgICAvLyBpcyBpcnJlZmxleGl2ZS4KKyAgICAgIF9fZ2xpYmN4eF9hc3NlcnQoX19maXJzdCA9PSBfX2xhc3QgfHwgIV9fcHJlZCgqX19maXJzdCwgKl9fZmlyc3QpKTsKKworICAgICAgcmV0dXJuIF9fY2hlY2tfc29ydGVkX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwKKwkJCQlzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkX3NldF9hdXgoY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fZmlyc3QsCisJCQkgICBjb25zdCBfSW5wdXRJdGVyYXRvciYgX19sYXN0LAorCQkJICAgc3RkOjpfX3RydWVfdHlwZSkKKyAgICB7IHJldHVybiBfX2NoZWNrX3NvcnRlZChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3NvcnRlZF9zZXRfYXV4KGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiwKKwkJCSAgIGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiwKKwkJCSAgIHN0ZDo6X19mYWxzZV90eXBlKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkX3NldF9hdXgoY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fZmlyc3QsCisJCQkgICBjb25zdCBfSW5wdXRJdGVyYXRvciYgX19sYXN0LAorCQkJICAgX1ByZWRpY2F0ZSBfX3ByZWQsIHN0ZDo6X190cnVlX3R5cGUpCisgICAgeyByZXR1cm4gX19jaGVja19zb3J0ZWQoX19maXJzdCwgX19sYXN0LCBfX3ByZWQpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3NvcnRlZF9zZXRfYXV4KGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiwKKwkJCSAgIGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiwgX1ByZWRpY2F0ZSwKKwkJCSAgIHN0ZDo6X19mYWxzZV90eXBlKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKworICAvLyAuLi4gc3BlY2lhbCB2YXJpYW50IHVzZWQgaW4gc3RkOjptZXJnZSwgc3RkOjppbmNsdWRlcywgc3RkOjpzZXRfKi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjI+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3NvcnRlZF9zZXQoY29uc3QgX0lucHV0SXRlcmF0b3IxJiBfX2ZpcnN0LAorCQkgICAgICAgY29uc3QgX0lucHV0SXRlcmF0b3IxJiBfX2xhc3QsCisJCSAgICAgICBjb25zdCBfSW5wdXRJdGVyYXRvcjImKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2FyZV9zYW1lPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj46Ol9fdHlwZQorCV9TYW1lVHlwZTsKKyAgICAgIHJldHVybiBfX2NoZWNrX3NvcnRlZF9zZXRfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX1NhbWVUeXBlKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zb3J0ZWRfc2V0KGNvbnN0IF9JbnB1dEl0ZXJhdG9yMSYgX19maXJzdCwKKwkJICAgICAgIGNvbnN0IF9JbnB1dEl0ZXJhdG9yMSYgX19sYXN0LAorCQkgICAgICAgY29uc3QgX0lucHV0SXRlcmF0b3IyJiwgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9fYXJlX3NhbWU8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPjo6X190eXBlCisJX1NhbWVUeXBlOworICAgICAgcmV0dXJuIF9fY2hlY2tfc29ydGVkX3NldF9hdXgoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsIF9TYW1lVHlwZSgpKTsKKyAgIH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIDI3MC4gQmluYXJ5IHNlYXJjaCByZXF1aXJlbWVudHMgb3Zlcmx5IHN0cmljdAorICAvLyBEZXRlcm1pbmUgaWYgYSBzZXF1ZW5jZSBpcyBwYXJ0aXRpb25lZCB3LnIudC4gdGhpcyBlbGVtZW50LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3BhcnRpdGlvbmVkX2xvd2VyKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsdWUpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICpfX2ZpcnN0IDwgX192YWx1ZSkKKwkrK19fZmlyc3Q7CisgICAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgKytfX2ZpcnN0OworCSAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICEoKl9fZmlyc3QgPCBfX3ZhbHVlKSkKKwkgICAgKytfX2ZpcnN0OworCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0ID09IF9fbGFzdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19wYXJ0aXRpb25lZF91cHBlcihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhKF9fdmFsdWUgPCAqX19maXJzdCkpCisJKytfX2ZpcnN0OworICAgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgICsrX19maXJzdDsKKwkgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX3ZhbHVlIDwgKl9fZmlyc3QpCisJICAgICsrX19maXJzdDsKKwl9CisgICAgICByZXR1cm4gX19maXJzdCA9PSBfX2xhc3Q7CisgICAgfQorCisgIC8vIERldGVybWluZSBpZiBhIHNlcXVlbmNlIGlzIHBhcnRpdGlvbmVkIHcuci50LiB0aGlzIGVsZW1lbnQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1ByZWQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3BhcnRpdGlvbmVkX2xvd2VyKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsdWUsCisJCQkgICAgICBfUHJlZCBfX3ByZWQpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmIGJvb2woX19wcmVkKCpfX2ZpcnN0LCBfX3ZhbHVlKSkpCisJKytfX2ZpcnN0OworICAgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgICsrX19maXJzdDsKKwkgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhYm9vbChfX3ByZWQoKl9fZmlyc3QsIF9fdmFsdWUpKSkKKwkgICAgKytfX2ZpcnN0OworCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0ID09IF9fbGFzdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUHJlZD4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfcGFydGl0aW9uZWRfdXBwZXIoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZSwKKwkJCSAgICAgIF9QcmVkIF9fcHJlZCkKKyAgICB7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgIWJvb2woX19wcmVkKF9fdmFsdWUsICpfX2ZpcnN0KSkpCisJKytfX2ZpcnN0OworICAgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgICsrX19maXJzdDsKKwkgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiBib29sKF9fcHJlZChfX3ZhbHVlLCAqX19maXJzdCkpKQorCSAgICArK19fZmlyc3Q7CisJfQorICAgICAgcmV0dXJuIF9fZmlyc3QgPT0gX19sYXN0OworICAgIH0KKworICAvLyBIZWxwZXIgc3RydWN0IHRvIGRldGVjdCByYW5kb20gYWNjZXNzIHNhZmUgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgc3RydWN0IF9faXNfc2FmZV9yYW5kb21faXRlcmF0b3IKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDAgfTsKKyAgICAgIHR5cGVkZWYgc3RkOjpfX2ZhbHNlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgc3RydWN0IF9faXNfc2FmZV9yYW5kb21faXRlcmF0b3I8X1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+ID4KKyAgICA6IHN0ZDo6X19hcmVfc2FtZTxzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OgorCQkgICAgICBpdGVyYXRvcl9jYXRlZ29yeT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIHN0cnVjdCBfU2l0ZXJfYmFzZQorICAgIDogc3RkOjpfSXRlcl9iYXNlPF9JdGVyYXRvciwgX19pc19zYWZlX3JhbmRvbV9pdGVyYXRvcjxfSXRlcmF0b3I+OjpfX3ZhbHVlPgorICAgIHsgfTsKKworICAvKiogSGVscGVyIGZ1bmN0aW9uIHRvIGV4dHJhY3QgYmFzZSBpdGVyYXRvciBvZiByYW5kb20gYWNjZXNzIHNhZmUgaXRlcmF0b3IKKyAgICAgIGluIG9yZGVyIHRvIHJlZHVjZSBwZXJmb3JtYW5jZSBpbXBhY3Qgb2YgZGVidWcgbW9kZS4gIExpbWl0ZWQgdG8gcmFuZG9tCisgICAgICBhY2Nlc3MgaXRlcmF0b3IgYmVjYXVzZSBpdCBpcyB0aGUgb25seSBjYXRlZ29yeSBmb3Igd2hpY2ggaXQgaXMgcG9zc2libGUKKyAgICAgIHRvIGNoZWNrIGZvciBjb3JyZWN0IGl0ZXJhdG9ycyBvcmRlciBpbiB0aGUgX192YWxpZF9yYW5nZSBmdW5jdGlvbgorICAgICAgdGhhbmtzIHRvIHRoZSA8IG9wZXJhdG9yLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIF9TaXRlcl9iYXNlPF9JdGVyYXRvcj46Oml0ZXJhdG9yX3R5cGUKKyAgICBfX2Jhc2UoX0l0ZXJhdG9yIF9faXQpCisgICAgeyByZXR1cm4gX1NpdGVyX2Jhc2U8X0l0ZXJhdG9yPjo6X1NfYmFzZShfX2l0KTsgfQorfSAvLyBuYW1lc3BhY2UgX19nbnVfZGVidWcKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2xpc3QgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjYzViZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvbGlzdApAQCAtMCwwICsxLDc1NyBAQAorLy8gRGVidWdnaW5nIGxpc3QgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL2xpc3QKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX0xJU1QKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfTElTVCAxCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfc2VxdWVuY2UuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2l0ZXJhdG9yLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fZGVidWcKK3sKKyAgLy8vIENsYXNzIHN0ZDo6bGlzdCB3aXRoIHNhZmV0eS9jaGVja2luZy9kZWJ1ZyBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGxpc3QKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6bGlzdDxfVHAsIF9BbGxvY2F0b3I+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTxsaXN0PF9UcCwgX0FsbG9jYXRvcj4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6Omxpc3Q8X1RwLCBfQWxsb2NhdG9yPiBfQmFzZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgICAgICAgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9FcXVhbF90bzxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX0VxdWFsOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X05vdF9lcXVhbF90bzxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX05vdF9lcXVhbDsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfaXRlcmF0b3IsIGxpc3Q+CisJCQkJCQkgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgbGlzdD4KKwkJCQkJCSAgICBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1RwCQkJCSAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIDIzLjIuMi4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdAorICAgICAgbGlzdChjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fYSkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBleHBsaWNpdAorICAgICAgbGlzdChzaXplX3R5cGUgX19uKQorICAgICAgOiBfQmFzZShfX24pIHsgfQorCisgICAgICBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSwKKwkgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX192YWx1ZSwgX19hKSB7IH0KKyNlbHNlCisgICAgICBleHBsaWNpdAorICAgICAgbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUgPSBfVHAoKSwKKwkgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX192YWx1ZSwgX19hKSB7IH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKwlsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKwk6IF9CYXNlKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19nbnVfZGVidWc6Ol9fY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwKKwkJCQkJCQkJICAgICBfX2xhc3QpKSwKKwkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpLCBfX2EpCisgICAgICAgIHsgfQorCisgICAgICBsaXN0KGNvbnN0IGxpc3QmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgbGlzdChjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgbGlzdChsaXN0JiYgX194KSBub2V4Y2VwdAorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSkKKyAgICAgIHsgdGhpcy0+X01fc3dhcChfX3gpOyB9CisKKyAgICAgIGxpc3QoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICA6IF9CYXNlKF9fbCwgX19hKSB7IH0KKyNlbmRpZgorCisgICAgICB+bGlzdCgpIF9HTElCQ1hYX05PRVhDRVBUIHsgfQorCisgICAgICBsaXN0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGxpc3QmIF9feCkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGxpc3QmCisgICAgICBvcGVyYXRvcj0obGlzdCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCV9fZ2xpYmN4eF9jaGVja19zZWxmX21vdmVfYXNzaWduKF9feCk7CisJY2xlYXIoKTsKKwlzd2FwKF9feCk7CisgICAgICAJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBsaXN0JgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX19sOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX0Jhc2U6OmFzc2lnbihfX2wpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIHZvaWQKKyAgICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBfQmFzZTo6YXNzaWduKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdCkKKyAgICAgIHsKKwlfQmFzZTo6YXNzaWduKF9fbiwgX190KTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIDIzLjIuMi4yIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3opCisgICAgICB7CisJdGhpcy0+X01fZGV0YWNoX3Npbmd1bGFyKCk7CisKKwkvLyBpZiBfX3N6IDwgc2l6ZSgpLCBpbnZhbGlkYXRlIGFsbCBpdGVyYXRvcnMgaW4gW2JlZ2luK19fc3osIGVuZCgpKQorCV9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX0Jhc2U6OmJlZ2luKCk7CisJX0Jhc2VfaXRlcmF0b3IgX19lbmQgPSBfQmFzZTo6ZW5kKCk7CisJZm9yIChzaXplX3R5cGUgX19pID0gX19zejsgX192aWN0aW0gIT0gX19lbmQgJiYgX19pID4gMDsgLS1fX2kpCisJICArK19fdmljdGltOworCisJZm9yICg7IF9fdmljdGltICE9IF9fZW5kOyArK19fdmljdGltKQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgfQorCisJX190cnkKKwkgIHsKKwkgICAgX0Jhc2U6OnJlc2l6ZShfX3N6KTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgdGhpcy0+X01fcmV2YWxpZGF0ZV9zaW5ndWxhcigpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBjb25zdCBfVHAmIF9fYykKKyAgICAgIHsKKwl0aGlzLT5fTV9kZXRhY2hfc2luZ3VsYXIoKTsKKworCS8vIGlmIF9fc3ogPCBzaXplKCksIGludmFsaWRhdGUgYWxsIGl0ZXJhdG9ycyBpbiBbYmVnaW4rX19zeiwgZW5kKCkpCisJX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0gPSBfQmFzZTo6YmVnaW4oKTsKKwlfQmFzZV9pdGVyYXRvciBfX2VuZCA9IF9CYXNlOjplbmQoKTsKKwlmb3IgKHNpemVfdHlwZSBfX2kgPSBfX3N6OyBfX3ZpY3RpbSAhPSBfX2VuZCAmJiBfX2kgPiAwOyAtLV9faSkKKwkgICsrX192aWN0aW07CisKKwlmb3IgKDsgX192aWN0aW0gIT0gX19lbmQ7ICsrX192aWN0aW0pCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICB9CisKKwlfX3RyeQorCSAgeworCSAgICBfQmFzZTo6cmVzaXplKF9fc3osIF9fYyk7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIHRoaXMtPl9NX3JldmFsaWRhdGVfc2luZ3VsYXIoKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBfVHAgX19jID0gX1RwKCkpCisgICAgICB7CisJdGhpcy0+X01fZGV0YWNoX3Npbmd1bGFyKCk7CisKKwkvLyBpZiBfX3N6IDwgc2l6ZSgpLCBpbnZhbGlkYXRlIGFsbCBpdGVyYXRvcnMgaW4gW2JlZ2luK19fc3osIGVuZCgpKQorCV9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX0Jhc2U6OmJlZ2luKCk7CisJX0Jhc2VfaXRlcmF0b3IgX19lbmQgPSBfQmFzZTo6ZW5kKCk7CisJZm9yIChzaXplX3R5cGUgX19pID0gX19zejsgX192aWN0aW0gIT0gX19lbmQgJiYgX19pID4gMDsgLS1fX2kpCisJICArK19fdmljdGltOworCisJZm9yICg7IF9fdmljdGltICE9IF9fZW5kOyArK19fdmljdGltKQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgfQorCisJX190cnkKKwkgIHsKKwkgICAgX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICB0aGlzLT5fTV9yZXZhbGlkYXRlX3Npbmd1bGFyKCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzOgorICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwlyZXR1cm4gX0Jhc2U6OmZyb250KCk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgYmFjaygpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8vIDIzLjIuMi4zIG1vZGlmaWVyczoKKyAgICAgIHVzaW5nIF9CYXNlOjpwdXNoX2Zyb250OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdXNpbmcgX0Jhc2U6OmVtcGxhY2VfZnJvbnQ7CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgcG9wX2Zyb250KCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfQmFzZTo6YmVnaW4oKSkpOworCV9CYXNlOjpwb3BfZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OnB1c2hfYmFjazsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHVzaW5nIF9CYXNlOjplbXBsYWNlX2JhY2s7CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgcG9wX2JhY2soKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKC0tX0Jhc2U6OmVuZCgpKSk7CisJX0Jhc2U6OnBvcF9iYWNrKCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbXBsYWNlKF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQlzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLCB0aGlzKTsKKwl9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX3gpLCB0aGlzKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX1RwJiYgX194KQorICAgICAgeyByZXR1cm4gZW1wbGFjZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX3ApOworCV9CYXNlOjppbnNlcnQoX19wLmJhc2UoKSwgX19sKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwlfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX24sIF9feCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnRfcmFuZ2UoX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0KTsKKwkgIF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQkJCSAgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9CYXNlX2l0ZXJhdG9yCisgICAgICBfTV9lcmFzZShfQmFzZV9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24pKTsKKwlyZXR1cm4gX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24pOworICAgICAgfQorICAgIHB1YmxpYzoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX3Bvc2l0aW9uKTsKKwlyZXR1cm4gaXRlcmF0b3IoX01fZXJhc2UoX19wb3NpdGlvbi5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19wb3NpdGlvbiwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX19wb3NpdGlvbi5iYXNlKCk7CisJICAgICBfX3ZpY3RpbSAhPSBfX2xhc3QuYmFzZSgpOyArK19fdmljdGltKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX192aWN0aW0gIT0gX0Jhc2U6OmVuZCgpLAorCQkJICAgICAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fcG9zaXRpb24sICJwb3NpdGlvbiIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgIH0KKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpLCBfX2xhc3QuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobGlzdCYgX194KQorICAgICAgeworCV9CYXNlOjpzd2FwKF9feCk7CisJdGhpcy0+X01fc3dhcChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX0Jhc2U6OmNsZWFyKCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgLy8gMjMuMi4yLjQgbGlzdCBvcGVyYXRpb25zOgorICAgICAgdm9pZAorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiYgX194KQorI2Vsc2UKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gpCisjZW5kaWYKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoJl9feCAhPSB0aGlzLAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc2VsZl9zcGxpY2UpCisJCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikpOworCXRoaXMtPl9NX3RyYW5zZmVyX2Zyb21faWYoX194LCBfTm90X2VxdWFsKF9feC5fTV9iYXNlKCkuZW5kKCkpKTsKKwlfQmFzZTo6c3BsaWNlKF9fcG9zaXRpb24uYmFzZSgpLCBfR0xJQkNYWF9NT1ZFKF9feC5fTV9iYXNlKCkpKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gpCisgICAgICB7IHNwbGljZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmJiBfX3gsIGl0ZXJhdG9yIF9faSkKKyNlbHNlCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194LCBpdGVyYXRvciBfX2kpCisjZW5kaWYKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCisJLy8gV2UgdXNlZCB0byBwZXJmb3JtIHRoZSBzcGxpY2VfYWxsb2MgY2hlY2s6ICBub3QgYW55bW9yZSwgcmVkdW5kYW50CisJLy8gYWZ0ZXIgaW1wbGVtZW50aW5nIHRoZSByZWxldmFudCBiaXRzIG9mIE4xNTk5LgorCisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9faS5fTV9kZXJlZmVyZW5jZWFibGUoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NwbGljZV9iYWQpCisJCQkgICAgICAuX01faXRlcmF0b3IoX19pLCAiX19pIikpOworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2kuX01fYXR0YWNoZWRfdG8oJl9feCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zcGxpY2Vfb3RoZXIpCisJCQkgICAgIC5fTV9pdGVyYXRvcihfX2ksICJfX2kiKS5fTV9zZXF1ZW5jZShfX3gsICJfX3giKSk7CisKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMjUwLiBzcGxpY2luZyBpbnZhbGlkYXRlcyBpdGVyYXRvcnMKKwl0aGlzLT5fTV90cmFuc2Zlcl9mcm9tX2lmKF9feCwgX0VxdWFsKF9faS5iYXNlKCkpKTsKKwlfQmFzZTo6c3BsaWNlKF9fcG9zaXRpb24uYmFzZSgpLCBfR0xJQkNYWF9NT1ZFKF9feC5fTV9iYXNlKCkpLAorCQkgICAgICBfX2kuYmFzZSgpKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gsIGl0ZXJhdG9yIF9faSkKKyAgICAgIHsgc3BsaWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpLCBfX2kpOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiYgX194LCBpdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgaXRlcmF0b3IgX19sYXN0KQorI2Vsc2UKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gsIGl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICBpdGVyYXRvciBfX2xhc3QpCisjZW5kaWYKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCV9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2ZpcnN0Ll9NX2F0dGFjaGVkX3RvKCZfX3gpLAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc3BsaWNlX290aGVyKQorCQkJICAgICAgLl9NX3NlcXVlbmNlKF9feCwgIngiKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpKTsKKworCS8vIFdlIHVzZWQgdG8gcGVyZm9ybSB0aGUgc3BsaWNlX2FsbG9jIGNoZWNrOiAgbm90IGFueW1vcmUsIHJlZHVuZGFudAorCS8vIGFmdGVyIGltcGxlbWVudGluZyB0aGUgcmVsZXZhbnQgYml0cyBvZiBOMTU5OS4KKworCWZvciAoX0Jhc2VfaXRlcmF0b3IgX190bXAgPSBfX2ZpcnN0LmJhc2UoKTsKKwkgICAgIF9fdG1wICE9IF9fbGFzdC5iYXNlKCk7ICsrX190bXApCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX3RtcCAhPSBfQmFzZTo6ZW5kKCksCisJCQkJICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZSkKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2ZpcnN0LCAiZmlyc3QiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSgmX194ICE9IHRoaXMgfHwgX190bXAgIT0gX19wb3NpdGlvbiwKKwkJCQlfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zcGxpY2Vfb3ZlcmxhcCkKKwkJCQkgIC5fTV9pdGVyYXRvcihfX3RtcCwgInBvc2l0aW9uIikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2ZpcnN0LCAiZmlyc3QiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgICAgLy8gMjUwLiBzcGxpY2luZyBpbnZhbGlkYXRlcyBpdGVyYXRvcnMKKwkgICAgdGhpcy0+X01fdHJhbnNmZXJfZnJvbV9pZihfX3gsIF9FcXVhbChfX3RtcCkpOworCSAgfQorCisJX0Jhc2U6OnNwbGljZShfX3Bvc2l0aW9uLmJhc2UoKSwgX0dMSUJDWFhfTU9WRShfX3guX01fYmFzZSgpKSwKKwkJICAgICAgX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBzcGxpY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCksIF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICByZW1vdmUoY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgICAgeworCWZvciAoX0Jhc2VfaXRlcmF0b3IgX194ID0gX0Jhc2U6OmJlZ2luKCk7IF9feCAhPSBfQmFzZTo6ZW5kKCk7ICkKKwkgIHsKKwkgICAgaWYgKCpfX3ggPT0gX192YWx1ZSkKKwkgICAgICBfX3ggPSBfTV9lcmFzZShfX3gpOworCSAgICBlbHNlCisJICAgICAgKytfX3g7CisJICB9CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9QcmVkaWNhdGU+CisgICAgICAgIHZvaWQKKyAgICAgICAgcmVtb3ZlX2lmKF9QcmVkaWNhdGUgX19wcmVkKQorICAgICAgICB7CisJICBmb3IgKF9CYXNlX2l0ZXJhdG9yIF9feCA9IF9CYXNlOjpiZWdpbigpOyBfX3ggIT0gX0Jhc2U6OmVuZCgpOyApCisJICAgIHsKKwkgICAgICBpZiAoX19wcmVkKCpfX3gpKQorCQlfX3ggPSBfTV9lcmFzZShfX3gpOworCSAgICAgIGVsc2UKKwkJKytfX3g7CisJICAgIH0KKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIHVuaXF1ZSgpCisgICAgICB7CisJX0Jhc2VfaXRlcmF0b3IgX19maXJzdCA9IF9CYXNlOjpiZWdpbigpOworCV9CYXNlX2l0ZXJhdG9yIF9fbGFzdCA9IF9CYXNlOjplbmQoKTsKKwlpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJICByZXR1cm47CisJX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsgKytfX25leHQ7CisJd2hpbGUgKF9fbmV4dCAhPSBfX2xhc3QpCisJICB7CisJICAgIGlmICgqX19maXJzdCA9PSAqX19uZXh0KQorCSAgICAgIF9fbmV4dCA9IF9NX2VyYXNlKF9fbmV4dCk7CisJICAgIGVsc2UKKwkgICAgICBfX2ZpcnN0ID0gX19uZXh0Kys7CisJICB9CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgICAgIHZvaWQKKyAgICAgICAgdW5pcXVlKF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkKKyAgICAgICAgeworCSAgX0Jhc2VfaXRlcmF0b3IgX19maXJzdCA9IF9CYXNlOjpiZWdpbigpOworCSAgX0Jhc2VfaXRlcmF0b3IgX19sYXN0ID0gX0Jhc2U6OmVuZCgpOworCSAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgICByZXR1cm47CisJICBfQmFzZV9pdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OyArK19fbmV4dDsKKwkgIHdoaWxlIChfX25leHQgIT0gX19sYXN0KQorCSAgICB7CisJICAgICAgaWYgKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsICpfX25leHQpKQorCQlfX25leHQgPSBfTV9lcmFzZShfX25leHQpOworCSAgICAgIGVsc2UKKwkJX19maXJzdCA9IF9fbmV4dCsrOworCSAgICB9CisJfQorCisgICAgICB2b2lkCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgbWVyZ2UobGlzdCYmIF9feCkKKyNlbHNlCisgICAgICBtZXJnZShsaXN0JiBfX3gpCisjZW5kaWYKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMzAwLiBsaXN0OjptZXJnZSgpIHNwZWNpZmljYXRpb24gaW5jb21wbGV0ZQorCWlmICh0aGlzICE9ICZfX3gpCisJICB7CisJICAgIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWQoX0Jhc2U6OmJlZ2luKCksIF9CYXNlOjplbmQoKSk7CisJICAgIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWQoX194LmJlZ2luKCkuYmFzZSgpLCBfX3guZW5kKCkuYmFzZSgpKTsKKwkgICAgdGhpcy0+X01fdHJhbnNmZXJfZnJvbV9pZihfX3gsIF9Ob3RfZXF1YWwoX194Ll9NX2Jhc2UoKS5lbmQoKSkpOworCSAgICBfQmFzZTo6bWVyZ2UoX0dMSUJDWFhfTU9WRShfX3guX01fYmFzZSgpKSk7CisJICB9CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBtZXJnZShsaXN0JiBfX3gpCisgICAgICB7IG1lcmdlKHN0ZDo6bW92ZShfX3gpKTsgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Db21wYXJlPgorICAgICAgICB2b2lkCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgICBtZXJnZShsaXN0JiYgX194LCBfQ29tcGFyZSBfX2NvbXApCisjZWxzZQorICAgICAgICBtZXJnZShsaXN0JiBfX3gsIF9Db21wYXJlIF9fY29tcCkKKyNlbmRpZgorICAgICAgICB7CisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyAzMDAuIGxpc3Q6Om1lcmdlKCkgc3BlY2lmaWNhdGlvbiBpbmNvbXBsZXRlCisJICBpZiAodGhpcyAhPSAmX194KQorCSAgICB7CisJICAgICAgX19nbGliY3h4X2NoZWNrX3NvcnRlZF9wcmVkKF9CYXNlOjpiZWdpbigpLCBfQmFzZTo6ZW5kKCksCisJCQkJCSAgX19jb21wKTsKKwkgICAgICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkX3ByZWQoX194LmJlZ2luKCkuYmFzZSgpLCBfX3guZW5kKCkuYmFzZSgpLAorCQkJCQkgIF9fY29tcCk7CisJICAgICAgdGhpcy0+X01fdHJhbnNmZXJfZnJvbV9pZihfX3gsIF9Ob3RfZXF1YWwoX194Ll9NX2Jhc2UoKS5lbmQoKSkpOworCSAgICAgIF9CYXNlOjptZXJnZShfR0xJQkNYWF9NT1ZFKF9feC5fTV9iYXNlKCkpLCBfX2NvbXApOworCSAgICB9CisJfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbXBhcmU+CisgICAgICAgIHZvaWQKKyAgICAgICAgbWVyZ2UobGlzdCYgX194LCBfQ29tcGFyZSBfX2NvbXApCisgICAgICAgIHsgbWVyZ2Uoc3RkOjptb3ZlKF9feCksIF9fY29tcCk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBzb3J0KCkgeyBfQmFzZTo6c29ydCgpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICAgIHZvaWQKKyAgICAgICAgc29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fcHJlZCkgeyBfQmFzZTo6c29ydChfX3ByZWQpOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpyZXZlcnNlOworCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ludmFsaWRhdGVfYWxsKCkKKyAgICAgIHsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9Ob3RfZXF1YWwoX0Jhc2U6OmVuZCgpKSk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgIT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPCBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDw9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX2RlYnVnCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL21hY3Jvcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWJjYWYzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9tYWNyb3MuaApAQCAtMCwwICsxLDM1MyBAQAorLy8gRGVidWdnaW5nIHN1cHBvcnQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL21hY3Jvcy5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19NQUNST1NfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19NQUNST1NfSCAxCisKKy8qKgorICogTWFjcm9zIHVzZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIHRvIHZlcmlmeSBjZXJ0YWluCisgKiBwcm9wZXJ0aWVzLiBUaGVzZSBtYWNyb3MgbWF5IG9ubHkgYmUgdXNlZCBkaXJlY3RseSBieSB0aGUgZGVidWcKKyAqIHdyYXBwZXJzLiBOb3RlIHRoYXQgdGhlc2UgYXJlIG1hY3JvcyAoaW5zdGVhZCBvZiB0aGUgbW9yZSBvYnZpb3VzbHkKKyAqIEBhIGNvcnJlY3QgY2hvaWNlIG9mIG1ha2luZyB0aGVtIGZ1bmN0aW9ucykgYmVjYXVzZSB3ZSBuZWVkIGxpbmUgYW5kCisgKiBmaWxlIGluZm9ybWF0aW9uIGF0IHRoZSBjYWxsIHNpdGUsIHRvIG1pbmltaXplIHRoZSBkaXN0YW5jZSBiZXR3ZWVuCisgKiB0aGUgdXNlciBlcnJvciBhbmQgd2hlcmUgdGhlIGVycm9yIGlzIHJlcG9ydGVkLgorICoKKyAqLworI2RlZmluZSBfR0xJQkNYWF9ERUJVR19WRVJJRllfQVQoX0NvbmRpdGlvbixfRXJyb3JNZXNzYWdlLF9GaWxlLF9MaW5lKQlcCisgIGRvCQkJCQkJCQkJXAorICB7CQkJCQkJCQkJXAorICAgIGlmICghIChfQ29uZGl0aW9uKSkJCQkJCQkJXAorICAgICAgX19nbnVfZGVidWc6Ol9FcnJvcl9mb3JtYXR0ZXI6Ol9NX2F0KF9GaWxlLCBfTGluZSkJCVwKKwkgIC5fRXJyb3JNZXNzYWdlLl9NX2Vycm9yKCk7CQkJCQlcCisgIH0gd2hpbGUgKGZhbHNlKQorCisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfQ29uZGl0aW9uLF9FcnJvck1lc3NhZ2UpCQkJXAorICBfR0xJQkNYWF9ERUJVR19WRVJJRllfQVQoX0NvbmRpdGlvbixfRXJyb3JNZXNzYWdlLF9fRklMRV9fLF9fTElORV9fKQorCisvLyBWZXJpZnkgdGhhdCBbX0ZpcnN0LCBfTGFzdCkgZm9ybXMgYSB2YWxpZCBpdGVyYXRvciByYW5nZS4KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdCxfTGFzdCkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19nbnVfZGVidWc6Ol9fdmFsaWRfcmFuZ2UoX0ZpcnN0LCBfTGFzdCksCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KSkKKworLy8gVmVyaWZ5IHRoYXQgW19GaXJzdCwgX0xhc3QpIGZvcm1zIGEgbm9uLWVtcHR5IGl0ZXJhdG9yIHJhbmdlLgorI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfbm9uX2VtcHR5X3JhbmdlKF9GaXJzdCxfTGFzdCkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX0ZpcnN0ICE9IF9MYXN0LAkJCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19ub25fZW1wdHlfcmFuZ2UpCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KSkKKworLyoqIFZlcmlmeSB0aGF0IHdlIGNhbiBpbnNlcnQgaW50byAqdGhpcyB3aXRoIHRoZSBpdGVyYXRvciBfUG9zaXRpb24uCisgKiAgSW5zZXJ0aW9uIGludG8gYSBjb250YWluZXIgYXQgYSBzcGVjaWZpYyBwb3NpdGlvbiByZXF1aXJlcyB0aGF0CisgKiAgdGhlIGl0ZXJhdG9yIGJlIG5vbnNpbmd1bGFyLCBlaXRoZXIgZGVyZWZlcmVuY2VhYmxlIG9yIHBhc3QtdGhlLWVuZCwKKyAqICBhbmQgdGhhdCBpdCByZWZlcmVuY2UgdGhlIHNlcXVlbmNlIHdlIGFyZSBpbnNlcnRpbmcgaW50by4gTm90ZSB0aGF0CisgKiAgdGhpcyBtYWNybyBpcyBvbmx5IHZhbGlkIHdoZW4gdGhlIGNvbnRhaW5lciBpcyBhX1NhZmVfc2VxdWVuY2UgYW5kCisgKiAgdGhlIGl0ZXJhdG9yIGlzIGEgX1NhZmVfaXRlcmF0b3IuCisqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9Qb3NpdGlvbikJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKCFfUG9zaXRpb24uX01fc2luZ3VsYXIoKSwJCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19pbnNlcnRfc2luZ3VsYXIpIFwKKwkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX1Bvc2l0aW9uLCAjX1Bvc2l0aW9uKSk7CQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX1Bvc2l0aW9uLl9NX2F0dGFjaGVkX3RvKHRoaXMpLAkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfaW5zZXJ0X2RpZmZlcmVudCkgXAorCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfUG9zaXRpb24sICNfUG9zaXRpb24pKQorCisvKiogVmVyaWZ5IHRoYXQgd2UgY2FuIGluc2VydCBpbnRvICp0aGlzIGFmdGVyIHRoZSBpdGVyYXRvciBfUG9zaXRpb24uCisgKiAgSW5zZXJ0aW9uIGludG8gYSBjb250YWluZXIgYWZ0ZXIgYSBzcGVjaWZpYyBwb3NpdGlvbiByZXF1aXJlcyB0aGF0CisgKiAgdGhlIGl0ZXJhdG9yIGJlIG5vbnNpbmd1bGFyLCBlaXRoZXIgZGVyZWZlcmVuY2VhYmxlIG9yIGJlZm9yZS1iZWdpbiwKKyAqICBhbmQgdGhhdCBpdCByZWZlcmVuY2UgdGhlIHNlcXVlbmNlIHdlIGFyZSBpbnNlcnRpbmcgaW50by4gTm90ZSB0aGF0CisgKiAgdGhpcyBtYWNybyBpcyBvbmx5IHZhbGlkIHdoZW4gdGhlIGNvbnRhaW5lciBpcyBhX1NhZmVfc2VxdWVuY2UgYW5kCisgKiAgdGhlIGl0ZXJhdG9yIGlzIGEgX1NhZmVfaXRlcmF0b3IuCisqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X2FmdGVyKF9Qb3NpdGlvbikJCQkJXAorX19nbGliY3h4X2NoZWNrX2luc2VydChfUG9zaXRpb24pOwkJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKCFfUG9zaXRpb24uX01faXNfZW5kKCksCQkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfaW5zZXJ0X2FmdGVyX2VuZCkJXAorCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfUG9zaXRpb24sICNfUG9zaXRpb24pKQorCisvKiogVmVyaWZ5IHRoYXQgd2UgY2FuIGluc2VydCB0aGUgdmFsdWVzIGluIHRoZSBpdGVyYXRvciByYW5nZQorICogIFtfRmlyc3QsIF9MYXN0KSBpbnRvICp0aGlzIHdpdGggdGhlIGl0ZXJhdG9yIF9Qb3NpdGlvbi4gIEluc2VydGlvbgorICogIGludG8gYSBjb250YWluZXIgYXQgYSBzcGVjaWZpYyBwb3NpdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBpdGVyYXRvcgorICogIGJlIG5vbnNpbmd1bGFyIChpLmUuLCBlaXRoZXIgZGVyZWZlcmVuY2VhYmxlIG9yIHBhc3QtdGhlLWVuZCksCisgKiAgdGhhdCBpdCByZWZlcmVuY2UgdGhlIHNlcXVlbmNlIHdlIGFyZSBpbnNlcnRpbmcgaW50bywgYW5kIHRoYXQgdGhlCisgKiAgaXRlcmF0b3IgcmFuZ2UgW19GaXJzdCwgTGFzdCkgaXMgYSB2YWxpZCAocG9zc2libHkgZW1wdHkpCisgKiAgcmFuZ2UuIE5vdGUgdGhhdCB0aGlzIG1hY3JvIGlzIG9ubHkgdmFsaWQgd2hlbiB0aGUgY29udGFpbmVyIGlzIGEKKyAqICBfU2FmZV9zZXF1ZW5jZSBhbmQgdGhlIGl0ZXJhdG9yIGlzIGEgX1NhZmVfaXRlcmF0b3IuCisgKgorICogIEB0b2RvIFdlIHdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byBjaGVjayBmb3Igbm9uaW50ZXJmZXJlbmNlIG9mCisgKiAgX1Bvc2l0aW9uIGFuZCB0aGUgcmFuZ2UgW19GaXJzdCwgX0xhc3QpLCBidXQgdGhhdCBjYW4ndCAoaW4KKyAqICBnZW5lcmFsKSBiZSBkb25lLgorKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX2luc2VydF9yYW5nZShfUG9zaXRpb24sX0ZpcnN0LF9MYXN0KQkJXAorX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdCxfTGFzdCk7CQkJCVwKK19fZ2xpYmN4eF9jaGVja19pbnNlcnQoX1Bvc2l0aW9uKQorCisvKiogVmVyaWZ5IHRoYXQgd2UgY2FuIGluc2VydCB0aGUgdmFsdWVzIGluIHRoZSBpdGVyYXRvciByYW5nZQorICogIFtfRmlyc3QsIF9MYXN0KSBpbnRvICp0aGlzIGFmdGVyIHRoZSBpdGVyYXRvciBfUG9zaXRpb24uICBJbnNlcnRpb24KKyAqICBpbnRvIGEgY29udGFpbmVyIGFmdGVyIGEgc3BlY2lmaWMgcG9zaXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgaXRlcmF0b3IKKyAqICBiZSBub25zaW5ndWxhciAoaS5lLiwgZWl0aGVyIGRlcmVmZXJlbmNlYWJsZSBvciBwYXN0LXRoZS1lbmQpLAorICogIHRoYXQgaXQgcmVmZXJlbmNlIHRoZSBzZXF1ZW5jZSB3ZSBhcmUgaW5zZXJ0aW5nIGludG8sIGFuZCB0aGF0IHRoZQorICogIGl0ZXJhdG9yIHJhbmdlIFtfRmlyc3QsIExhc3QpIGlzIGEgdmFsaWQgKHBvc3NpYmx5IGVtcHR5KQorICogIHJhbmdlLiBOb3RlIHRoYXQgdGhpcyBtYWNybyBpcyBvbmx5IHZhbGlkIHdoZW4gdGhlIGNvbnRhaW5lciBpcyBhCisgKiAgX1NhZmVfc2VxdWVuY2UgYW5kIHRoZSBpdGVyYXRvciBpcyBhIF9TYWZlX2l0ZXJhdG9yLgorICoKKyAqICBAdG9kbyBXZSB3b3VsZCBsaWtlIHRvIGJlIGFibGUgdG8gY2hlY2sgZm9yIG5vbmludGVyZmVyZW5jZSBvZgorICogIF9Qb3NpdGlvbiBhbmQgdGhlIHJhbmdlIFtfRmlyc3QsIF9MYXN0KSwgYnV0IHRoYXQgY2FuJ3QgKGluCisgKiAgZ2VuZXJhbCkgYmUgZG9uZS4KKyovCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19pbnNlcnRfcmFuZ2VfYWZ0ZXIoX1Bvc2l0aW9uLF9GaXJzdCxfTGFzdCkJXAorX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdCxfTGFzdCk7CQkJCVwKK19fZ2xpYmN4eF9jaGVja19pbnNlcnRfYWZ0ZXIoX1Bvc2l0aW9uKQorCisvKiogVmVyaWZ5IHRoYXQgd2UgY2FuIGVyYXNlIHRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGl0ZXJhdG9yCisgKiBfUG9zaXRpb24uIFdlIGNhbiBlcmFzZSB0aGUgZWxlbWVudCBpZiB0aGUgX1Bvc2l0aW9uIGl0ZXJhdG9yIGlzCisgKiBkZXJlZmVyZW5jZWFibGUgYW5kIHJlZmVyZW5jZXMgdGhpcyBzZXF1ZW5jZS4KKyovCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19lcmFzZShfUG9zaXRpb24pCQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfUG9zaXRpb24uX01fZGVyZWZlcmVuY2VhYmxlKCksCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19lcmFzZV9iYWQpCSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9Qb3NpdGlvbiwgI19Qb3NpdGlvbikpOwkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9Qb3NpdGlvbi5fTV9hdHRhY2hlZF90byh0aGlzKSwJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2VyYXNlX2RpZmZlcmVudCkgICAgXAorCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfUG9zaXRpb24sICNfUG9zaXRpb24pKQorCisvKiogVmVyaWZ5IHRoYXQgd2UgY2FuIGVyYXNlIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBpdGVyYXRvcgorICogX1Bvc2l0aW9uLiBXZSBjYW4gZXJhc2UgdGhlIGVsZW1lbnQgaWYgdGhlIF9Qb3NpdGlvbiBpdGVyYXRvciBpcworICogYmVmb3JlIGEgZGVyZWZlcmVuY2VhYmxlIG9uZSBhbmQgcmVmZXJlbmNlcyB0aGlzIHNlcXVlbmNlLgorKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX2VyYXNlX2FmdGVyKF9Qb3NpdGlvbikJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9Qb3NpdGlvbi5fTV9iZWZvcmVfZGVyZWZlcmVuY2VhYmxlKCksCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2VyYXNlX2FmdGVyX2JhZCkJXAorCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfUG9zaXRpb24sICNfUG9zaXRpb24pKTsJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfUG9zaXRpb24uX01fYXR0YWNoZWRfdG8odGhpcyksCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19lcmFzZV9kaWZmZXJlbnQpCVwKKwkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX1Bvc2l0aW9uLCAjX1Bvc2l0aW9uKSkKKworLyoqIFZlcmlmeSB0aGF0IHdlIGNhbiBlcmFzZSB0aGUgZWxlbWVudHMgaW4gdGhlIGl0ZXJhdG9yIHJhbmdlCisgKiAgW19GaXJzdCwgX0xhc3QpLiBXZSBjYW4gZXJhc2UgdGhlIGVsZW1lbnRzIGlmIFtfRmlyc3QsIF9MYXN0KSBpcyBhCisgKiAgdmFsaWQgaXRlcmF0b3IgcmFuZ2Ugd2l0aGluIHRoaXMgc2VxdWVuY2UuCisqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX0ZpcnN0LF9MYXN0KQkJCVwKK19fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfRmlyc3QsX0xhc3QpOwkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX0ZpcnN0Ll9NX2F0dGFjaGVkX3RvKHRoaXMpLAkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfZXJhc2VfZGlmZmVyZW50KSAgICBcCisgICAgICAgICAgICAgICAgICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpKQorCisvKiogVmVyaWZ5IHRoYXQgd2UgY2FuIGVyYXNlIHRoZSBlbGVtZW50cyBpbiB0aGUgaXRlcmF0b3IgcmFuZ2UKKyAqICAoX0ZpcnN0LCBfTGFzdCkuIFdlIGNhbiBlcmFzZSB0aGUgZWxlbWVudHMgaWYgKF9GaXJzdCwgX0xhc3QpIGlzIGEKKyAqICB2YWxpZCBpdGVyYXRvciByYW5nZSB3aXRoaW4gdGhpcyBzZXF1ZW5jZS4KKyovCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZV9hZnRlcihfRmlyc3QsX0xhc3QpCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9GaXJzdC5fTV9jYW5fY29tcGFyZShfTGFzdCksCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19lcmFzZV9kaWZmZXJlbnQpCVwKKwkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpKTsJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX0ZpcnN0Ll9NX2F0dGFjaGVkX3RvKHRoaXMpLAkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfZXJhc2VfZGlmZmVyZW50KQlcCisJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkpOwkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfRmlyc3QgIT0gX0xhc3QsCQkJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlMikJXAorCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkpOwkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfRmlyc3QuX01faW5jcmVtZW50YWJsZSgpLAkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UyKQlcCisJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KSk7CQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKCFfTGFzdC5fTV9pc19iZWZvcmVfYmVnaW4oKSwJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlMikJXAorCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkpCQkJXAorCisvLyBWZXJpZnkgdGhhdCB0aGUgc3Vic2NyaXB0IF9OIGlzIGxlc3MgdGhhbiB0aGUgY29udGFpbmVyJ3Mgc2l6ZS4KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX3N1YnNjcmlwdChfTikJCQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfTiA8IHRoaXMtPnNpemUoKSwJCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zdWJzY3JpcHRfb29iKQlcCisgICAgICAgICAgICAgICAgICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faW50ZWdlcihfTiwgI19OKQkJCQlcCisJCSAgICAgIC5fTV9pbnRlZ2VyKHRoaXMtPnNpemUoKSwgInNpemUiKSkKKworLy8gVmVyaWZ5IHRoYXQgdGhlIGJ1Y2tldCBfTiBpcyBsZXNzIHRoYW4gdGhlIGNvbnRhaW5lcidzIGJ1Y2tldHMgY291bnQuCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX04pCQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfTiA8IHRoaXMtPmJ1Y2tldF9jb3VudCgpLAkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfYnVja2V0X2luZGV4X29vYikJXAorICAgICAgICAgICAgICAgICAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2ludGVnZXIoX04sICNfTikJCQkJXAorCQkgICAgICAuX01faW50ZWdlcih0aGlzLT5idWNrZXRfY291bnQoKSwgInNpemUiKSkKKworLy8gVmVyaWZ5IHRoYXQgdGhlIGNvbnRhaW5lciBpcyBub25lbXB0eQorI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKQkJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgdGhpcy0+ZW1wdHkoKSwJCQkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfZW1wdHkpCSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKSkKKworLy8gVmVyaWZ5IHRoYXQgdGhlIGl0ZXJhdG9yIHJhbmdlIFtfRmlyc3QsIF9MYXN0KSBpcyBzb3J0ZWQKKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX3NvcnRlZChfRmlyc3QsX0xhc3QpCQkJCVwKK19fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfRmlyc3QsX0xhc3QpOwkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19nbnVfZGVidWc6Ol9fY2hlY2tfc29ydGVkKF9GaXJzdCwgX0xhc3QpLAlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3Vuc29ydGVkKQkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpKQorCisvKiogVmVyaWZ5IHRoYXQgdGhlIGl0ZXJhdG9yIHJhbmdlIFtfRmlyc3QsIF9MYXN0KSBpcyBzb3J0ZWQgYnkgdGhlCisgICAgcHJlZGljYXRlIF9QcmVkLiAqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfc29ydGVkX3ByZWQoX0ZpcnN0LF9MYXN0LF9QcmVkKQkJCVwKK19fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfRmlyc3QsX0xhc3QpOwkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19nbnVfZGVidWc6Ol9fY2hlY2tfc29ydGVkKF9GaXJzdCwgX0xhc3QsIF9QcmVkKSwgXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ191bnNvcnRlZF9wcmVkKSAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpCQkJXAorCQkgICAgICAuX01fc3RyaW5nKCNfUHJlZCkpCisKKy8vIFNwZWNpYWwgdmFyaWFudCBmb3Igc3RkOjptZXJnZSwgc3RkOjppbmNsdWRlcywgc3RkOjpzZXRfKgorI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfc29ydGVkX3NldChfRmlyc3QxLF9MYXN0MSxfRmlyc3QyKQkJXAorX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdDEsX0xhc3QxKTsJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dudV9kZWJ1Zzo6X19jaGVja19zb3J0ZWRfc2V0KF9GaXJzdDEsIF9MYXN0MSwgX0ZpcnN0MiksCQlcCisgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3Vuc29ydGVkKQkJCQlcCisgIC5fTV9pdGVyYXRvcihfRmlyc3QxLCAjX0ZpcnN0MSkJCQkJCVwKKyAgLl9NX2l0ZXJhdG9yKF9MYXN0MSwgI19MYXN0MSkpCisKKy8vIExpa2V3aXNlIHdpdGggYSBfUHJlZC4KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX3NvcnRlZF9zZXRfcHJlZChfRmlyc3QxLF9MYXN0MSxfRmlyc3QyLF9QcmVkKQlcCitfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX0ZpcnN0MSxfTGFzdDEpOyAgICAgICAgCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKAkJCQkJCQlcCisgIF9fZ251X2RlYnVnOjpfX2NoZWNrX3NvcnRlZF9zZXQoX0ZpcnN0MSwgX0xhc3QxLCBfRmlyc3QyLCBfUHJlZCksCVwKKyAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdW5zb3J0ZWRfcHJlZCkJCQkJXAorICAuX01faXRlcmF0b3IoX0ZpcnN0MSwgI19GaXJzdDEpCQkJCQlcCisgIC5fTV9pdGVyYXRvcihfTGFzdDEsICNfTGFzdDEpCQkJCQkJXAorICAuX01fc3RyaW5nKCNfUHJlZCkpCisKKy8qKiBWZXJpZnkgdGhhdCB0aGUgaXRlcmF0b3IgcmFuZ2UgW19GaXJzdCwgX0xhc3QpIGlzIHBhcnRpdGlvbmVkCisgICAgdy5yLnQuIHRoZSB2YWx1ZSBfVmFsdWUuICovCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19wYXJ0aXRpb25lZF9sb3dlcihfRmlyc3QsX0xhc3QsX1ZhbHVlKQkJXAorX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdCxfTGFzdCk7CQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2dudV9kZWJ1Zzo6X19jaGVja19wYXJ0aXRpb25lZF9sb3dlcigJCVwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX0ZpcnN0KSwJCQlcCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9MYXN0KSwgX1ZhbHVlKSwJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdW5wYXJ0aXRpb25lZCkgICAgICBcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkJCQlcCisJCSAgICAgIC5fTV9zdHJpbmcoI19WYWx1ZSkpCisKKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX3BhcnRpdGlvbmVkX3VwcGVyKF9GaXJzdCxfTGFzdCxfVmFsdWUpCQlcCitfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX0ZpcnN0LF9MYXN0KTsJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fZ251X2RlYnVnOjpfX2NoZWNrX3BhcnRpdGlvbmVkX3VwcGVyKAkJXAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfRmlyc3QpLAkJCVwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX0xhc3QpLCBfVmFsdWUpLAkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ191bnBhcnRpdGlvbmVkKSAgICAgIFwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KQkJCVwKKwkJICAgICAgLl9NX3N0cmluZygjX1ZhbHVlKSkKKworLyoqIFZlcmlmeSB0aGF0IHRoZSBpdGVyYXRvciByYW5nZSBbX0ZpcnN0LCBfTGFzdCkgaXMgcGFydGl0aW9uZWQKKyAgICB3LnIudC4gdGhlIHZhbHVlIF9WYWx1ZSBhbmQgcHJlZGljYXRlIF9QcmVkLiAqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfcGFydGl0aW9uZWRfbG93ZXJfcHJlZChfRmlyc3QsX0xhc3QsX1ZhbHVlLF9QcmVkKSBcCitfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX0ZpcnN0LF9MYXN0KTsJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fZ251X2RlYnVnOjpfX2NoZWNrX3BhcnRpdGlvbmVkX2xvd2VyKAkJXAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfRmlyc3QpLAkJCVwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX0xhc3QpLCBfVmFsdWUsIF9QcmVkKSwJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ191bnBhcnRpdGlvbmVkX3ByZWQpIFwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KQkJCVwKKwkJICAgICAgLl9NX3N0cmluZygjX1ByZWQpCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAuX01fc3RyaW5nKCNfVmFsdWUpKQorCisvKiogVmVyaWZ5IHRoYXQgdGhlIGl0ZXJhdG9yIHJhbmdlIFtfRmlyc3QsIF9MYXN0KSBpcyBwYXJ0aXRpb25lZAorICAgIHcuci50LiB0aGUgdmFsdWUgX1ZhbHVlIGFuZCBwcmVkaWNhdGUgX1ByZWQuICovCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19wYXJ0aXRpb25lZF91cHBlcl9wcmVkKF9GaXJzdCxfTGFzdCxfVmFsdWUsX1ByZWQpIFwKK19fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfRmlyc3QsX0xhc3QpOwkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19nbnVfZGVidWc6Ol9fY2hlY2tfcGFydGl0aW9uZWRfdXBwZXIoCQlcCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9GaXJzdCksCQkJXAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfTGFzdCksIF9WYWx1ZSwgX1ByZWQpLAlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3VucGFydGl0aW9uZWRfcHJlZCkgXAorCQkgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpCQkJXAorCQkgICAgICAuX01fc3RyaW5nKCNfUHJlZCkJCQkJXAorICAgICAgICAgICAgICAgICAgICAgIC5fTV9zdHJpbmcoI19WYWx1ZSkpCisKKy8vIFZlcmlmeSB0aGF0IHRoZSBpdGVyYXRvciByYW5nZSBbX0ZpcnN0LCBfTGFzdCkgaXMgYSBoZWFwCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19oZWFwKF9GaXJzdCxfTGFzdCkJCQkJXAorICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoc3RkOjpfX2lzX2hlYXAoX19nbnVfZGVidWc6Ol9fYmFzZShfRmlyc3QpLAlcCisJCQkJICAgICAgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX0xhc3QpKSwJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19ub3RfaGVhcCkJICAgICAgICBcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkpCisKKy8qKiBWZXJpZnkgdGhhdCB0aGUgaXRlcmF0b3IgcmFuZ2UgW19GaXJzdCwgX0xhc3QpIGlzIGEgaGVhcAorICAgIHcuci50LiB0aGUgcHJlZGljYXRlIF9QcmVkLiAqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfaGVhcF9wcmVkKF9GaXJzdCxfTGFzdCxfUHJlZCkJCQlcCisgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShzdGQ6Ol9faXNfaGVhcChfX2dudV9kZWJ1Zzo6X19iYXNlKF9GaXJzdCksCVwKKwkJCQkgICAgICAgX19nbnVfZGVidWc6Ol9fYmFzZShfTGFzdCksCVwKKwkJCQkgICAgICAgX1ByZWQpLAkJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX25vdF9oZWFwX3ByZWQpICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkJCQlcCisJCSAgICAgIC5fTV9zdHJpbmcoI19QcmVkKSkKKworLy8gVmVyaWZ5IHRoYXQgdGhlIGNvbnRhaW5lciBpcyBub3Qgc2VsZiBtb3ZlIGFzc2lnbmVkCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19zZWxmX21vdmVfYXNzaWduKF9PdGhlcikJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcyAhPSAmX090aGVyLAkJCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zZWxmX21vdmVfYXNzaWduKQlcCisgICAgICAgICAgICAgICAgICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpKQorCisvLyBWZXJpZnkgdGhhdCBsb2FkIGZhY3RvciBpcyBwb3NpdGlvbgorI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfbWF4X2xvYWRfZmFjdG9yKF9GKQkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX0YgPiAwLjBmLAkJCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9sb2FkX2ZhY3RvcikJXAorICAgICAgICAgICAgICAgICAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKSkKKworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfZXF1YWxfYWxsb2NzKF9PdGhlcikJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcy0+Z2V0X2FsbG9jYXRvcigpID09IF9PdGhlci5nZXRfYWxsb2NhdG9yKCksCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfZXF1YWxfYWxsb2NzKQlcCisJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKSkKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHX1BFREFOVElDCisjICBkZWZpbmUgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfU3RyaW5nKSBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX1N0cmluZyAhPSAwKQorIyAgZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19zdHJpbmdfbGVuKF9TdHJpbmcsX0xlbikgXAorICAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfU3RyaW5nICE9IDAgfHwgX0xlbiA9PSAwKQorI2Vsc2UKKyMgIGRlZmluZSBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9TdHJpbmcpCisjICBkZWZpbmUgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX1N0cmluZyxfTGVuKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9tYXAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjVhODJlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9tYXAKQEAgLTAsMCArMSwzNiBAQAorLy8gRGVidWdnaW5nIG1hcC9tdWx0aW1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvbWFwCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19NQVAKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfTUFQIDEKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxkZWJ1Zy9tYXAuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9tdWx0aW1hcC5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvbWFwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYWM1MzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL21hcC5oCkBAIC0wLDAgKzEsNDkxIEBACisvLyBEZWJ1Z2dpbmcgbWFwIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9tYXAuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfTUFQX0gKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfTUFQX0ggMQorCisjaW5jbHVkZSA8ZGVidWcvc2FmZV9zZXF1ZW5jZS5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX2RlYnVnCit7CisgIC8vLyBDbGFzcyBzdGQ6Om1hcCB3aXRoIHNhZmV0eS9jaGVja2luZy9kZWJ1ZyBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIG1hcAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjptYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6bWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+IF9CYXNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X0VxdWFsX3RvPF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfRXF1YWw7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXM6CisgICAgICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfY29tcGFyZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZSAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9pdGVyYXRvciwgbWFwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsIG1hcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3BvaW50ZXIgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gMjMuMy4xLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0IG1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBtYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorCTogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LAorCQkJCQkJCQkgICAgIF9fbGFzdCkpLAorCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksCisJCV9fY29tcCwgX19hKSB7IH0KKworICAgICAgbWFwKGNvbnN0IG1hcCYgX194KQorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisgICAgICBtYXAoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIG1hcChtYXAmJiBfX3gpCisgICAgICBub2V4Y2VwdChpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxfQ29tcGFyZT46OnZhbHVlKQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSkKKyAgICAgIHsgdGhpcy0+X01fc3dhcChfX3gpOyB9CisKKyAgICAgIG1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgIGNvbnN0IF9Db21wYXJlJiBfX2MgPSBfQ29tcGFyZSgpLAorCSAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19jLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIH5tYXAoKSBfR0xJQkNYWF9OT0VYQ0VQVCB7IH0KKworICAgICAgbWFwJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IG1hcCYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgbWFwJgorICAgICAgb3BlcmF0b3I9KG1hcCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCV9fZ2xpYmN4eF9jaGVja19zZWxmX21vdmVfYXNzaWduKF9feCk7CisJY2xlYXIoKTsKKwlzd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBtYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTMzLiBtYXAgbWlzc2luZyBnZXRfYWxsb2NhdG9yKCkKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvciAKKyAgICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyAgICAgIC8vIDIzLjMuMS4yIGVsZW1lbnQgYWNjZXNzOgorICAgICAgdXNpbmcgX0Jhc2U6Om9wZXJhdG9yW107CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDQ2NC4gU3VnZ2VzdGlvbiBmb3IgbmV3IG1lbWJlciBmdW5jdGlvbnMgaW4gc3RhbmRhcmQgY29udGFpbmVycy4KKyAgICAgIHVzaW5nIF9CYXNlOjphdDsKKworICAgICAgLy8gbW9kaWZpZXJzOgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIGF1dG8gX19yZXMgPSBfQmFzZTo6ZW1wbGFjZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJCQkgICBfX3Jlcy5zZWNvbmQpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3MpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbXBsYWNlX2hpbnQoX19wb3MuYmFzZSgpLAorCQkJCQkgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCQkJICB0aGlzKTsKKwl9CisjZW5kaWYKKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzID0gX0Jhc2U6Omluc2VydChfX3gpOworCXJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCQkJIF9fcmVzLnNlY29uZCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICAgIGluc2VydChfUGFpciYmIF9feCkKKyAgICAgICAgeworCSAgc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcworCSAgICA9IF9CYXNlOjppbnNlcnQoc3RkOjpmb3J3YXJkPF9QYWlyPihfX3gpKTsKKwkgIHJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCQkJICAgX19yZXMuc2Vjb25kKTsKKwl9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19saXN0KQorICAgICAgeyBfQmFzZTo6aW5zZXJ0KF9fbGlzdCk7IH0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZWxzZQorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZgorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9feCksIHRoaXMpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIF9QYWlyJiYgX194KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksCisJCQkJCXN0ZDo6Zm9yd2FyZDxfUGFpcj4oX194KSksIHRoaXMpOworCX0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwkgIF9CYXNlOjppbnNlcnQoX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24uYmFzZSgpKSk7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSksIHRoaXMpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIGVyYXNlKGNvbnN0X2l0ZXJhdG9yKF9fcG9zaXRpb24pKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24uYmFzZSgpKSk7CisJX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0gPSBfQmFzZTo6ZmluZChfX3gpOworCWlmIChfX3ZpY3RpbSA9PSBfQmFzZTo6ZW5kKCkpCisJICByZXR1cm4gMDsKKwllbHNlCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICAgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSk7CisJICAgIHJldHVybiAxOworCSAgfQorICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdmljdGltID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3ZpY3RpbSAhPSBfX2xhc3QuYmFzZSgpOyArK19fdmljdGltKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX192aWN0aW0gIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgfQorCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJZm9yIChfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fZmlyc3QuYmFzZSgpOworCSAgICAgX192aWN0aW0gIT0gX19sYXN0LmJhc2UoKTsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdmljdGltICE9IF9CYXNlOjplbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgIH0KKwlfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobWFwJiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnN3YXAoX194KTsKKwl0aGlzLT5fTV9zd2FwKF9feCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9CYXNlOjpjbGVhcigpOworICAgICAgfQorCisgICAgICAvLyBvYnNlcnZlcnM6CisgICAgICB1c2luZyBfQmFzZTo6a2V5X2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6dmFsdWVfY29tcDsKKworICAgICAgLy8gMjMuMy4xLjMgbWFwIG9wZXJhdGlvbnM6CisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpjb3VudDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisJX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9fcmVzID0KKwlfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIF9HTElCQ1hYX05PRVhDRVBUICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hbGwoKQorICAgICAgeworCXR5cGVkZWYgX19nbnVfZGVidWc6Ol9Ob3RfZXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9Ob3RfZXF1YWw7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfTm90X2VxdWFsKF9NX2Jhc2UoKS5lbmQoKSkpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19kZWJ1ZworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9tdWx0aW1hcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9tdWx0aW1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMzE5OGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL211bHRpbWFwLmgKQEAgLTAsMCArMSw0NzQgQEAKKy8vIERlYnVnZ2luZyBtdWx0aW1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvbXVsdGltYXAuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfTVVMVElNQVBfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19NVUxUSU1BUF9IIDEKKworI2luY2x1ZGUgPGRlYnVnL3NhZmVfc2VxdWVuY2UuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjptdWx0aW1hcCB3aXRoIHNhZmV0eS9jaGVja2luZy9kZWJ1ZyBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIG11bHRpbWFwCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6Om11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTxtdWx0aW1hcDxfS2V5LCBfVHAsCisJCQkJCQkgIF9Db21wYXJlLCBfQWxsb2NhdG9yPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6bXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gX0Jhc2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfRXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9FcXVhbDsKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlczoKKyAgICAgIHR5cGVkZWYgX0tleQkJCQkgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVHAJCQkJICAgICBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfaXRlcmF0b3IsIG11bHRpbWFwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpbWFwPiBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3BvaW50ZXIgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gMjMuMy4xLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0IG11bHRpbWFwKGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCQkJY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgICAgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorCTogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LAorCQkJCQkJCQkgICAgIF9fbGFzdCkpLAorCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksCisJICAgICAgX19jb21wLCBfX2EpIHsgfQorCisgICAgICBtdWx0aW1hcChjb25zdCBtdWx0aW1hcCYgX194KQorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisgICAgICBtdWx0aW1hcChjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgbXVsdGltYXAobXVsdGltYXAmJiBfX3gpCisgICAgICBub2V4Y2VwdChpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxfQ29tcGFyZT46OnZhbHVlKQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSkKKyAgICAgIHsgdGhpcy0+X01fc3dhcChfX3gpOyB9CisKKyAgICAgIG11bHRpbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jID0gX0NvbXBhcmUoKSwKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19jLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIH5tdWx0aW1hcCgpIF9HTElCQ1hYX05PRVhDRVBUIHsgfQorCisgICAgICBtdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBtdWx0aW1hcCYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0obXVsdGltYXAmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwlfX2dsaWJjeHhfY2hlY2tfc2VsZl9tb3ZlX2Fzc2lnbihfX3gpOworCWNsZWFyKCk7CisJc3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisKKyAgICAgIC8vIGl0ZXJhdG9yczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyBjYXBhY2l0eToKKyAgICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisgICAgICAvLyBtb2RpZmllcnM6CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW1wbGFjZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLCB0aGlzKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zKTsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW1wbGFjZV9oaW50KF9fcG9zLmJhc2UoKSwKKwkJCQkJICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwKKwkJCSAgdGhpcyk7CisJfQorI2VuZGlmCisgICAgICAKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3gpLCB0aGlzKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0KF9QYWlyJiYgX194KQorICAgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX194KSksIHRoaXMpOyB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19saXN0KQorICAgICAgeyBfQmFzZTo6aW5zZXJ0KF9fbGlzdCk7IH0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZWxzZQorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZgorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9feCksIHRoaXMpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIF9QYWlyJiYgX194KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksCisJCQkJCXN0ZDo6Zm9yd2FyZDxfUGFpcj4oX194KSksIHRoaXMpOworCX0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwkgIF9CYXNlOjppbnNlcnQoX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24uYmFzZSgpKSk7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSksIHRoaXMpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIGVyYXNlKGNvbnN0X2l0ZXJhdG9yKF9fcG9zaXRpb24pKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24uYmFzZSgpKSk7CisJX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX192aWN0aW1zID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXNpemVfdHlwZSBfX2NvdW50ID0gMDsKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fdmljdGltcy5maXJzdDsKKwl3aGlsZSAoX192aWN0aW0gIT0gIF9fdmljdGltcy5zZWNvbmQpCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICAgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSsrKTsKKwkgICAgKytfX2NvdW50OworCSAgfQorCXJldHVybiBfX2NvdW50OworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdmljdGltID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3ZpY3RpbSAhPSBfX2xhc3QuYmFzZSgpOyArK19fdmljdGltKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX192aWN0aW0gIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgfQorCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJZm9yIChfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fZmlyc3QuYmFzZSgpOworCSAgICAgX192aWN0aW0gIT0gX19sYXN0LmJhc2UoKTsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdmljdGltICE9IF9CYXNlOjplbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgIH0KKwlfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobXVsdGltYXAmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6c3dhcChfX3gpOworCXRoaXMtPl9NX3N3YXAoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJX0Jhc2U6OmNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIC8vIG9ic2VydmVyczoKKyAgICAgIHVzaW5nIF9CYXNlOjprZXlfY29tcDsKKyAgICAgIHVzaW5nIF9CYXNlOjp2YWx1ZV9jb21wOworCisgICAgICAvLyAyMy4zLjEuMyBtdWx0aW1hcCBvcGVyYXRpb25zOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpLCB0aGlzKTsgfQorCisgICAgICB1c2luZyBfQmFzZTo6Y291bnQ7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvcixpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19yZXMgPQorCV9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkgICAgICBpdGVyYXRvcihfX3Jlcy5zZWNvbmQsIHRoaXMpKTsKKyAgICAgIH0KKworICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfY29uc3RfaXRlcmF0b3IsIF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfX3JlcyA9CisJICBfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIF9HTElCQ1hYX05PRVhDRVBUICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hbGwoKQorICAgICAgeworCXR5cGVkZWYgX19nbnVfZGVidWc6Ol9Ob3RfZXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9Ob3RfZXF1YWw7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfTm90X2VxdWFsKF9CYXNlOjplbmQoKSkpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgIT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJIG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fZGVidWcKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvbXVsdGlzZXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvbXVsdGlzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2M3NjFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9tdWx0aXNldC5oCkBAIC0wLDAgKzEsNDYwIEBACisvLyBEZWJ1Z2dpbmcgbXVsdGlzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL211bHRpc2V0LmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX01VTFRJU0VUX0gKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfTVVMVElTRVRfSCAxCisKKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci5oPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fZGVidWcKK3sKKyAgLy8vIENsYXNzIHN0ZDo6bXVsdGlzZXQgd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSA9IHN0ZDo6bGVzczxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8X0tleT4gPgorICAgIGNsYXNzIG11bHRpc2V0CisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6Om11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiwKKyAgICAgIHB1YmxpYyBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8bXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjptdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gX0Jhc2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfRXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9FcXVhbDsKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlczoKKyAgICAgIHR5cGVkZWYgX0tleQkJCQkgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfS2V5CQkJCSAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUJCQkJICAgICBrZXlfY29tcGFyZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUJCQkJICAgICB2YWx1ZV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZQkgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLCBtdWx0aXNldD4KKyAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsCisJCQkJCSAgbXVsdGlzZXQ+IGNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyAyMy4zLjMuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQgbXVsdGlzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJCQljb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fY29tcCwgX19hKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIG11bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCQkgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorCTogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LAorCQkJCQkJCQkgICAgIF9fbGFzdCkpLAorCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksCisJCV9fY29tcCwgX19hKSB7IH0KKworICAgICAgbXVsdGlzZXQoY29uc3QgbXVsdGlzZXQmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgbXVsdGlzZXQoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIG11bHRpc2V0KG11bHRpc2V0JiYgX194KQorICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X0NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IHRoaXMtPl9NX3N3YXAoX194KTsgfQorCisgICAgICBtdWx0aXNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fY29tcCwgX19hKSB7IH0KKyNlbmRpZgorCisgICAgICB+bXVsdGlzZXQoKSBfR0xJQkNYWF9OT0VYQ0VQVCB7IH0KKworICAgICAgbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbXVsdGlzZXQmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIG11bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KG11bHRpc2V0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJX19nbGliY3h4X2NoZWNrX3NlbGZfbW92ZV9hc3NpZ24oX194KTsKKwljbGVhcigpOworCXN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIG11bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworICAgICAgLy8gbW9kaWZpZXJzOgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwgdGhpcyk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvcyk7CisJICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVtcGxhY2VfaGludChfX3Bvcy5iYXNlKCksCisJCQkJCSAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksCisJCQkgIHRoaXMpOworCX0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX194KSwgdGhpcyk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoc3RkOjptb3ZlKF9feCkpLCB0aGlzKTsgfQorI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9feCksIHRoaXMpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIHN0ZDo6bW92ZShfX3gpKSwKKwkJCXRoaXMpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXZvaWQKKwlpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgX0Jhc2U6Omluc2VydChfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwl9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IF9CYXNlOjppbnNlcnQoX19sKTsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX19wb3NpdGlvbik7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX19wb3NpdGlvbi5iYXNlKCkpKTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX19wb3NpdGlvbik7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX19wb3NpdGlvbi5iYXNlKCkpKTsKKwlfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbi5iYXNlKCkpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3ZpY3RpbXMgPQorCSAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJc2l6ZV90eXBlIF9fY291bnQgPSAwOworCV9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX192aWN0aW1zLmZpcnN0OworCXdoaWxlIChfX3ZpY3RpbSAhPSBfX3ZpY3RpbXMuc2Vjb25kKQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgICBfQmFzZTo6ZXJhc2UoX192aWN0aW0rKyk7CisJICAgICsrX19jb3VudDsKKwkgIH0KKwlyZXR1cm4gX19jb3VudDsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJZm9yIChfQmFzZV9jb25zdF9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fZmlyc3QuYmFzZSgpOworCSAgICAgX192aWN0aW0gIT0gX19sYXN0LmJhc2UoKTsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdmljdGltICE9IF9CYXNlOjplbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgIH0KKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCWZvciAoX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0gPSBfX2ZpcnN0LmJhc2UoKTsKKwkgICAgIF9fdmljdGltICE9IF9fbGFzdC5iYXNlKCk7ICsrX192aWN0aW0pCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX3ZpY3RpbSAhPSBfQmFzZTo6ZW5kKCksCisJCQkJICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZSkKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2ZpcnN0LCAiZmlyc3QiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICB9CisJX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBzd2FwKG11bHRpc2V0JiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnN3YXAoX194KTsKKwl0aGlzLT5fTV9zd2FwKF9feCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9CYXNlOjpjbGVhcigpOworICAgICAgfQorCisgICAgICAvLyBvYnNlcnZlcnM6CisgICAgICB1c2luZyBfQmFzZTo6a2V5X2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6dmFsdWVfY29tcDsKKworICAgICAgLy8gbXVsdGlzZXQgb3BlcmF0aW9uczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpLCB0aGlzKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpLCB0aGlzKTsgfQorCisgICAgICB1c2luZyBfQmFzZTo6Y291bnQ7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjp1cHBlcl9ib3VuZChfX3gpLCB0aGlzKTsgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcmVzID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkgICAgICBpdGVyYXRvcihfX3Jlcy5zZWNvbmQsIHRoaXMpKTsKKyAgICAgIH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9fcmVzID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihjb25zdF9pdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkgICAgICBjb25zdF9pdGVyYXRvcihfX3Jlcy5zZWNvbmQsIHRoaXMpKTsKKyAgICAgIH0KKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgX0dMSUJDWFhfTk9FWENFUFQgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2FsbCgpCisgICAgICB7CisJdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X05vdF9lcXVhbF90bzxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX05vdF9lcXVhbDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9Ob3RfZXF1YWwoX0Jhc2U6OmVuZCgpKSk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPCBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICB2b2lkCisgICAgc3dhcChtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKwkgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gX194LnN3YXAoX195KTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX2RlYnVnCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfYmFzZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWFmNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX2Jhc2UuaApAQCAtMCwwICsxLDI1NCBAQAorLy8gU2FmZSBzZXF1ZW5jZS9pdGVyYXRvciBiYXNlIGltcGxlbWVudGF0aW9uICAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvc2FmZV9iYXNlLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1NBRkVfQkFTRV9ICisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1NBRkVfQkFTRV9IIDEKKworI2luY2x1ZGUgPGV4dC9jb25jdXJyZW5jZS5oPgorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgY2xhc3MgX1NhZmVfc2VxdWVuY2VfYmFzZTsKKworICAvKiogXGJyaWVmIEJhc2ljIGZ1bmN0aW9uYWxpdHkgZm9yIGEgQGEgc2FmZSBpdGVyYXRvci4KKyAgICoKKyAgICogIFRoZSAlX1NhZmVfaXRlcmF0b3JfYmFzZSBiYXNlIGNsYXNzIGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uYWxpdHkKKyAgICogIG9mIGEgc2FmZSBpdGVyYXRvciB0aGF0IGlzIG5vdCBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgaXRlcmF0b3IKKyAgICogIHR5cGUuIEl0IGNvbnRhaW5zIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBzZXF1ZW5jZSBpdCByZWZlcmVuY2VzCisgICAqICBhbG9uZyB3aXRoIGl0ZXJhdG9yIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIHBvaW50ZXJzIHRvIGZvcm0gYQorICAgKiAgZG91Ymx5LWxpbmtlZCBsaXN0IG9mIGl0ZXJhdG9ycyByZWZlcmVuY2VkIGJ5IHRoZSBjb250YWluZXIuCisgICAqCisgICAqICBUaGlzIGNsYXNzIG11c3Qgbm90IHBlcmZvcm0gYW55IG9wZXJhdGlvbnMgdGhhdCBjYW4gdGhyb3cgYW4KKyAgICogIGV4Y2VwdGlvbiwgb3IgdGhlIGV4Y2VwdGlvbiBndWFyYW50ZWVzIG9mIGRlcml2ZWQgaXRlcmF0b3JzIHdpbGwKKyAgICogIGJlIGJyb2tlbi4KKyAgICovCisgIGNsYXNzIF9TYWZlX2l0ZXJhdG9yX2Jhc2UKKyAgeworICBwdWJsaWM6CisgICAgLyoqIFRoZSBzZXF1ZW5jZSB0aGlzIGl0ZXJhdG9yIHJlZmVyZW5jZXM7IG1heSBiZSBOVUxMIHRvIGluZGljYXRlCisJYSBzaW5ndWxhciBpdGVyYXRvci4gKi8KKyAgICBfU2FmZV9zZXF1ZW5jZV9iYXNlKiBfTV9zZXF1ZW5jZTsKKworICAgIC8qKiBUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBpdGVyYXRvci4gVGhlIHNlbnRpbmVsIHZhbHVlIDAgaXMKKyAgICAgKiAgdXNlZCB0byBpbmRpY2F0ZSBhbiBpbnZhbGlkYXRlZCBpdGVyYXRvciAoaS5lLiwgb25lIHRoYXQgaXMKKyAgICAgKiAgc2luZ3VsYXIgYmVjYXVzZSBvZiBhbiBvcGVyYXRpb24gb24gdGhlIGNvbnRhaW5lcikuIFRoaXMKKyAgICAgKiAgdmVyc2lvbiBudW1iZXIgbXVzdCBlcXVhbCB0aGUgdmVyc2lvbiBudW1iZXIgaW4gdGhlIHNlcXVlbmNlCisgICAgICogIHJlZmVyZW5jZWQgYnkgX01fc2VxdWVuY2UgZm9yIHRoZSBpdGVyYXRvciB0byBiZQorICAgICAqICBub24tc2luZ3VsYXIuCisgICAgICovCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgX01fdmVyc2lvbjsKKworICAgIC8qKiBQb2ludGVyIHRvIHRoZSBwcmV2aW91cyBpdGVyYXRvciBpbiB0aGUgc2VxdWVuY2UncyBsaXN0IG9mCisJaXRlcmF0b3JzLiBPbmx5IHZhbGlkIHdoZW4gX01fc2VxdWVuY2UgIT0gTlVMTC4gKi8KKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKiBfTV9wcmlvcjsKKworICAgIC8qKiBQb2ludGVyIHRvIHRoZSBuZXh0IGl0ZXJhdG9yIGluIHRoZSBzZXF1ZW5jZSdzIGxpc3Qgb2YKKwlpdGVyYXRvcnMuIE9ubHkgdmFsaWQgd2hlbiBfTV9zZXF1ZW5jZSAhPSBOVUxMLiAqLworICAgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9NX25leHQ7CisKKyAgcHJvdGVjdGVkOgorICAgIC8qKiBJbml0aWFsaXplcyB0aGUgaXRlcmF0b3IgYW5kIG1ha2VzIGl0IHNpbmd1bGFyLiAqLworICAgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UoKQorICAgIDogX01fc2VxdWVuY2UoMCksIF9NX3ZlcnNpb24oMCksIF9NX3ByaW9yKDApLCBfTV9uZXh0KDApCisgICAgeyB9CisKKyAgICAvKiogSW5pdGlhbGl6ZSB0aGUgaXRlcmF0b3IgdG8gcmVmZXJlbmNlIHRoZSBzZXF1ZW5jZSBwb2ludGVkIHRvCisgICAgICogIGJ5IEBwIF9fc2VxLiBAcCBfX2NvbnN0YW50IGlzIHRydWUgd2hlbiB3ZSBhcmUgaW5pdGlhbGl6aW5nIGEKKyAgICAgKiAgY29uc3RhbnQgaXRlcmF0b3IsIGFuZCBmYWxzZSBpZiBpdCBpcyBhIG11dGFibGUgaXRlcmF0b3IuIE5vdGUKKyAgICAgKiAgdGhhdCBAcCBfX3NlcSBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGUgaXRlcmF0b3Igd2lsbCBiZQorICAgICAqICBzaW5ndWxhci4gT3RoZXJ3aXNlLCB0aGUgaXRlcmF0b3Igd2lsbCByZWZlcmVuY2UgQHAgX19zZXEgYW5kCisgICAgICogIGJlIG5vbnNpbmd1bGFyLgorICAgICAqLworICAgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UoY29uc3QgX1NhZmVfc2VxdWVuY2VfYmFzZSogX19zZXEsIGJvb2wgX19jb25zdGFudCkKKyAgICA6IF9NX3NlcXVlbmNlKDApLCBfTV92ZXJzaW9uKDApLCBfTV9wcmlvcigwKSwgX01fbmV4dCgwKQorICAgIHsgdGhpcy0+X01fYXR0YWNoKGNvbnN0X2Nhc3Q8X1NhZmVfc2VxdWVuY2VfYmFzZSo+KF9fc2VxKSwgX19jb25zdGFudCk7IH0KKworICAgIC8qKiBJbml0aWFsaXplcyB0aGUgaXRlcmF0b3IgdG8gcmVmZXJlbmNlIHRoZSBzYW1lIHNlcXVlbmNlIHRoYXQKKwlAcCBfX3ggZG9lcy4gQHAgX19jb25zdGFudCBpcyB0cnVlIGlmIHRoaXMgaXMgYSBjb25zdGFudAorCWl0ZXJhdG9yLCBhbmQgZmFsc2UgaWYgaXQgaXMgbXV0YWJsZS4gKi8KKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKGNvbnN0IF9TYWZlX2l0ZXJhdG9yX2Jhc2UmIF9feCwgYm9vbCBfX2NvbnN0YW50KQorICAgIDogX01fc2VxdWVuY2UoMCksIF9NX3ZlcnNpb24oMCksIF9NX3ByaW9yKDApLCBfTV9uZXh0KDApCisgICAgeyB0aGlzLT5fTV9hdHRhY2goX194Ll9NX3NlcXVlbmNlLCBfX2NvbnN0YW50KTsgfQorCisgICAgX1NhZmVfaXRlcmF0b3JfYmFzZSYKKyAgICBvcGVyYXRvcj0oY29uc3QgX1NhZmVfaXRlcmF0b3JfYmFzZSYpOworCisgICAgZXhwbGljaXQKKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKGNvbnN0IF9TYWZlX2l0ZXJhdG9yX2Jhc2UmKTsKKworICAgIH5fU2FmZV9pdGVyYXRvcl9iYXNlKCkgeyB0aGlzLT5fTV9kZXRhY2goKTsgfQorCisgICAgLyoqIEZvciB1c2UgaW4gX1NhZmVfaXRlcmF0b3IuICovCisgICAgX19nbnVfY3h4OjpfX211dGV4JiBfTV9nZXRfbXV0ZXgoKSB0aHJvdyAoKTsKKworICBwdWJsaWM6CisgICAgLyoqIEF0dGFjaGVzIHRoaXMgaXRlcmF0b3IgdG8gdGhlIGdpdmVuIHNlcXVlbmNlLCBkZXRhY2hpbmcgaXQKKyAgICAgKglmcm9tIHdoYXRldmVyIHNlcXVlbmNlIGl0IHdhcyBhdHRhY2hlZCB0byBvcmlnaW5hbGx5LiBJZiB0aGUKKyAgICAgKgluZXcgc2VxdWVuY2UgaXMgdGhlIE5VTEwgcG9pbnRlciwgdGhlIGl0ZXJhdG9yIGlzIGxlZnQKKyAgICAgKgl1bmF0dGFjaGVkLgorICAgICAqLworICAgIHZvaWQgX01fYXR0YWNoKF9TYWZlX3NlcXVlbmNlX2Jhc2UqIF9fc2VxLCBib29sIF9fY29uc3RhbnQpOworCisgICAgLyoqIExpa2V3aXNlLCBidXQgbm90IHRocmVhZC1zYWZlLiAqLworICAgIHZvaWQgX01fYXR0YWNoX3NpbmdsZShfU2FmZV9zZXF1ZW5jZV9iYXNlKiBfX3NlcSwgYm9vbCBfX2NvbnN0YW50KSB0aHJvdyAoKTsKKworICAgIC8qKiBEZXRhY2ggdGhlIGl0ZXJhdG9yIGZvciB3aGF0ZXZlciBzZXF1ZW5jZSBpdCBpcyBhdHRhY2hlZCB0bywKKyAgICAgKglpZiBhbnkuCisgICAgKi8KKyAgICB2b2lkIF9NX2RldGFjaCgpOworCisgICAgLyoqIExpa2V3aXNlLCBidXQgbm90IHRocmVhZC1zYWZlLiAqLworICAgIHZvaWQgX01fZGV0YWNoX3NpbmdsZSgpIHRocm93ICgpOworCisgICAgLyoqIERldGVybWluZXMgaWYgd2UgYXJlIGF0dGFjaGVkIHRvIHRoZSBnaXZlbiBzZXF1ZW5jZS4gKi8KKyAgICBib29sIF9NX2F0dGFjaGVkX3RvKGNvbnN0IF9TYWZlX3NlcXVlbmNlX2Jhc2UqIF9fc2VxKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3NlcXVlbmNlID09IF9fc2VxOyB9CisKKyAgICAvKiogSXMgdGhpcyBpdGVyYXRvciBzaW5ndWxhcj8gKi8KKyAgICBfR0xJQkNYWF9QVVJFIGJvb2wgX01fc2luZ3VsYXIoKSBjb25zdCB0aHJvdyAoKTsKKworICAgIC8qKiBDYW4gd2UgY29tcGFyZSB0aGlzIGl0ZXJhdG9yIHRvIHRoZSBnaXZlbiBpdGVyYXRvciBAcCBfX3g/CisJUmV0dXJucyB0cnVlIGlmIGJvdGggaXRlcmF0b3JzIGFyZSBub25zaW5ndWxhciBhbmQgcmVmZXJlbmNlCisJdGhlIHNhbWUgc2VxdWVuY2UuICovCisgICAgX0dMSUJDWFhfUFVSRSBib29sIF9NX2Nhbl9jb21wYXJlKGNvbnN0IF9TYWZlX2l0ZXJhdG9yX2Jhc2UmIF9feCkgY29uc3QgdGhyb3cgKCk7CisKKyAgICAvKiogSW52YWxpZGF0ZSB0aGUgaXRlcmF0b3IsIG1ha2luZyBpdCBzaW5ndWxhci4gKi8KKyAgICB2b2lkCisgICAgX01faW52YWxpZGF0ZSgpCisgICAgeyBfTV92ZXJzaW9uID0gMDsgfQorCisgICAgLyoqIFJlc2V0IGFsbCBtZW1iZXIgdmFyaWFibGVzICovCisgICAgdm9pZAorICAgIF9NX3Jlc2V0KCkgdGhyb3cgKCk7CisKKyAgICAvKiogVW5saW5rIGl0c2VsZiAqLworICAgIHZvaWQKKyAgICBfTV91bmxpbmsoKSB0aHJvdyAoKQorICAgIHsKKyAgICAgIGlmIChfTV9wcmlvcikKKwlfTV9wcmlvci0+X01fbmV4dCA9IF9NX25leHQ7CisgICAgICBpZiAoX01fbmV4dCkKKwlfTV9uZXh0LT5fTV9wcmlvciA9IF9NX3ByaW9yOworICAgIH0KKyAgfTsKKworICAvKioKKyAgICogQGJyaWVmIEJhc2UgY2xhc3MgdGhhdCBzdXBwb3J0cyB0cmFja2luZyBvZiBpdGVyYXRvcnMgdGhhdAorICAgKiByZWZlcmVuY2UgYSBzZXF1ZW5jZS4KKyAgICoKKyAgICogVGhlICVfU2FmZV9zZXF1ZW5jZV9iYXNlIGNsYXNzIHByb3ZpZGVzIGJhc2ljIHN1cHBvcnQgZm9yCisgICAqIHRyYWNraW5nIGl0ZXJhdG9ycyBpbnRvIGEgc2VxdWVuY2UuIFNlcXVlbmNlcyB0aGF0IHRyYWNrCisgICAqIGl0ZXJhdG9ycyBtdXN0IGRlcml2ZWQgZnJvbSAlX1NhZmVfc2VxdWVuY2VfYmFzZSBwdWJsaWNseSwgc28KKyAgICogdGhhdCBzYWZlIGl0ZXJhdG9ycyAod2hpY2ggaW5oZXJpdCBfU2FmZV9pdGVyYXRvcl9iYXNlKSBjYW4KKyAgICogYXR0YWNoIHRvIHRoZW0uIFRoaXMgY2xhc3MgY29udGFpbnMgdHdvIGxpbmtlZCBsaXN0cyBvZgorICAgKiBpdGVyYXRvcnMsIG9uZSBmb3IgY29uc3RhbnQgaXRlcmF0b3JzIGFuZCBvbmUgZm9yIG11dGFibGUKKyAgICogaXRlcmF0b3JzLCBhbmQgYSB2ZXJzaW9uIG51bWJlciB0aGF0IGFsbG93cyB2ZXJ5IGZhc3QKKyAgICogaW52YWxpZGF0aW9uIG9mIGFsbCBpdGVyYXRvcnMgdGhhdCByZWZlcmVuY2UgdGhlIGNvbnRhaW5lci4KKyAgICoKKyAgICogVGhpcyBjbGFzcyBtdXN0IGVuc3VyZSB0aGF0IG5vIG9wZXJhdGlvbiBvbiBpdCBtYXkgdGhyb3cgYW4KKyAgICogZXhjZXB0aW9uLCBvdGhlcndpc2UgQGEgc2FmZSBzZXF1ZW5jZXMgbWF5IGZhaWwgdG8gcHJvdmlkZSB0aGUKKyAgICogZXhjZXB0aW9uLXNhZmV0eSBndWFyYW50ZWVzIHJlcXVpcmVkIGJ5IHRoZSBDKysgc3RhbmRhcmQuCisgICAqLworICBjbGFzcyBfU2FmZV9zZXF1ZW5jZV9iYXNlCisgIHsKKyAgcHVibGljOgorICAgIC8vLyBUaGUgbGlzdCBvZiBtdXRhYmxlIGl0ZXJhdG9ycyB0aGF0IHJlZmVyZW5jZSB0aGlzIGNvbnRhaW5lcgorICAgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9NX2l0ZXJhdG9yczsKKworICAgIC8vLyBUaGUgbGlzdCBvZiBjb25zdGFudCBpdGVyYXRvcnMgdGhhdCByZWZlcmVuY2UgdGhpcyBjb250YWluZXIKKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKiBfTV9jb25zdF9pdGVyYXRvcnM7CisKKyAgICAvLy8gVGhlIGNvbnRhaW5lciB2ZXJzaW9uIG51bWJlci4gVGhpcyBudW1iZXIgbWF5IG5ldmVyIGJlIDAuCisgICAgbXV0YWJsZSB1bnNpZ25lZCBpbnQgX01fdmVyc2lvbjsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGEgdmVyc2lvbiBudW1iZXIgb2YgMSBhbmQgbm8gaXRlcmF0b3JzCisgICAgX1NhZmVfc2VxdWVuY2VfYmFzZSgpCisgICAgOiBfTV9pdGVyYXRvcnMoMCksIF9NX2NvbnN0X2l0ZXJhdG9ycygwKSwgX01fdmVyc2lvbigxKQorICAgIHsgfQorCisgICAgLyoqIE5vdGlmeSBhbGwgaXRlcmF0b3JzIHRoYXQgcmVmZXJlbmNlIHRoaXMgc2VxdWVuY2UgdGhhdCB0aGUKKwlzZXF1ZW5jZSBpcyBiZWluZyBkZXN0cm95ZWQuICovCisgICAgfl9TYWZlX3NlcXVlbmNlX2Jhc2UoKQorICAgIHsgdGhpcy0+X01fZGV0YWNoX2FsbCgpOyB9CisKKyAgICAvKiogRGV0YWNoIGFsbCBpdGVyYXRvcnMsIGxlYXZpbmcgdGhlbSBzaW5ndWxhci4gKi8KKyAgICB2b2lkCisgICAgX01fZGV0YWNoX2FsbCgpOworCisgICAgLyoqIERldGFjaCBhbGwgc2luZ3VsYXIgaXRlcmF0b3JzLgorICAgICAqICBAcG9zdCBmb3IgYWxsIGl0ZXJhdG9ycyBpIGF0dGFjaGVkIHRvIHRoaXMgc2VxdWVuY2UsCisgICAgICogICBpLT5fTV92ZXJzaW9uID09IF9NX3ZlcnNpb24uCisgICAgICovCisgICAgdm9pZAorICAgIF9NX2RldGFjaF9zaW5ndWxhcigpOworCisgICAgLyoqIFJldmFsaWRhdGVzIGFsbCBhdHRhY2hlZCBzaW5ndWxhciBpdGVyYXRvcnMuICBUaGlzIG1ldGhvZCBtYXkKKyAgICAgKiAgYmUgdXNlZCB0byB2YWxpZGF0ZSBpdGVyYXRvcnMgdGhhdCB3ZXJlIGludmFsaWRhdGVkIGJlZm9yZQorICAgICAqICAoYnV0IGZvciBzb21lIHJlYXNvbiwgc3VjaCBhcyBhbiBleGNlcHRpb24sIG5lZWQgdG8gYmVjb21lCisgICAgICogIHZhbGlkIGFnYWluKS4KKyAgICAgKi8KKyAgICB2b2lkCisgICAgX01fcmV2YWxpZGF0ZV9zaW5ndWxhcigpOworCisgICAgLyoqIFN3YXAgdGhpcyBzZXF1ZW5jZSB3aXRoIHRoZSBnaXZlbiBzZXF1ZW5jZS4gVGhpcyBvcGVyYXRpb24KKyAgICAgKiAgYWxzbyBzd2FwcyBvd25lcnNoaXAgb2YgdGhlIGl0ZXJhdG9ycywgc28gdGhhdCB3aGVuIHRoZQorICAgICAqICBvcGVyYXRpb24gaXMgY29tcGxldGUgYWxsIGl0ZXJhdG9ycyB0aGF0IG9yaWdpbmFsbHkgcmVmZXJlbmNlZAorICAgICAqICBvbmUgY29udGFpbmVyIG5vdyByZWZlcmVuY2UgdGhlIG90aGVyIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICB2b2lkCisgICAgX01fc3dhcChfU2FmZV9zZXF1ZW5jZV9iYXNlJiBfX3gpOworCisgICAgLyoqIEZvciB1c2UgaW4gX1NhZmVfc2VxdWVuY2UuICovCisgICAgX19nbnVfY3h4OjpfX211dGV4JiBfTV9nZXRfbXV0ZXgoKSB0aHJvdyAoKTsKKworICBwdWJsaWM6CisgICAgLyoqIEludmFsaWRhdGVzIGFsbCBpdGVyYXRvcnMuICovCisgICAgdm9pZAorICAgIF9NX2ludmFsaWRhdGVfYWxsKCkgY29uc3QKKyAgICB7IGlmICgrK19NX3ZlcnNpb24gPT0gMCkgX01fdmVyc2lvbiA9IDE7IH0KKworICAgIC8qKiBBdHRhY2ggYW4gaXRlcmF0b3IgdG8gdGhpcyBzZXF1ZW5jZS4gKi8KKyAgICB2b2lkCisgICAgX01fYXR0YWNoKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXQsIGJvb2wgX19jb25zdGFudCk7CisKKyAgICAvKiogTGlrZXdpc2UgYnV0IG5vdCB0aHJlYWQgc2FmZS4gKi8KKyAgICB2b2lkCisgICAgX01fYXR0YWNoX3NpbmdsZShfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0LCBib29sIF9fY29uc3RhbnQpIHRocm93ICgpOworCisgICAgLyoqIERldGFjaCBhbiBpdGVyYXRvciBmcm9tIHRoaXMgc2VxdWVuY2UgKi8KKyAgICB2b2lkCisgICAgX01fZGV0YWNoKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXQpOworCisgICAgLyoqIExpa2V3aXNlIGJ1dCBub3QgdGhyZWFkIHNhZmUuICovCisgICAgdm9pZAorICAgIF9NX2RldGFjaF9zaW5nbGUoX1NhZmVfaXRlcmF0b3JfYmFzZSogX19pdCkgdGhyb3cgKCk7CisgIH07Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9pdGVyYXRvci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhOTcxYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9pdGVyYXRvci5oCkBAIC0wLDAgKzEsNzE5IEBACisvLyBTYWZlIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uICAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvc2FmZV9pdGVyYXRvci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19TQUZFX0lURVJBVE9SX0gKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfU0FGRV9JVEVSQVRPUl9IIDEKKworI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8ZGVidWcvbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGVidWcvZnVuY3Rpb25zLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfcGFpci5oPgorI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgLyoqIEhlbHBlciBzdHJ1Y3QgdG8gZGVhbCB3aXRoIHNlcXVlbmNlIG9mZmVyaW5nIGEgYmVmb3JlX2JlZ2luCisgICAqICBpdGVyYXRvci4KKyAgICoqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIHN0cnVjdCBfQmVmb3JlQmVnaW5IZWxwZXIKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgX0l0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXQ6Oml0ZXJhdG9yX3R5cGUgX0Jhc2VJdDsKKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX0lzKF9CYXNlSXQsIGNvbnN0IF9TZXF1ZW5jZSopCisgICAgICB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICBzdGF0aWMgYm9vbAorICAgICAgX1NfSXNfQmVnaW5uZXN0KF9CYXNlSXQgX19pdCwgY29uc3QgX1NlcXVlbmNlKiBfX3NlcSkKKyAgICAgIHsgcmV0dXJuIF9faXQgPT0gX19zZXEtPl9NX2Jhc2UoKS5iZWdpbigpOyB9CisgICAgfTsKKworICAvKiogSXRlcmF0b3JzIHRoYXQgZGVyaXZlIGZyb20gX1NhZmVfaXRlcmF0b3JfYmFzZSBidXQgdGhhdCBhcmVuJ3QKKyAgICogIF9TYWZlX2l0ZXJhdG9ycyBjYW4gYmUgZGV0ZXJtaW5lZCBzaW5ndWxhciBvciBub24tc2luZ3VsYXIgdmlhCisgICAqICBfU2FmZV9pdGVyYXRvcl9iYXNlLgorICAgKi8KKyAgaW5saW5lIGJvb2wgCisgIF9fY2hlY2tfc2luZ3VsYXJfYXV4KGNvbnN0IF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9feCkKKyAgeyByZXR1cm4gX194LT5fTV9zaW5ndWxhcigpOyB9CisKKyAgLyoqIFRoZSBwcmVjaXNpb24gdG8gd2hpY2ggd2UgY2FuIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbgorICAgKiAgdHdvIGl0ZXJhdG9ycy4KKyAgICovCisgIGVudW0gX0Rpc3RhbmNlX3ByZWNpc2lvbgorICAgIHsKKyAgICAgIF9fZHBfZXF1YWxpdHksIC8vPCBDYW4gY29tcGFyZSBpdGVyYXRvciBlcXVhbGl0eSwgb25seQorICAgICAgX19kcF9zaWduLCAgICAgLy88IENhbiBkZXRlcm1pbmUgZXF1YWxpdHkgYW5kIG9yZGVyaW5nCisgICAgICBfX2RwX2V4YWN0ICAgICAvLzwgQ2FuIGRldGVybWluZSBkaXN0YW5jZSBwcmVjaXNlbHkKKyAgICB9OworCisgIC8qKiBEZXRlcm1pbmUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIGl0ZXJhdG9ycyB3aXRoIHNvbWUga25vd24KKyAgICoJcHJlY2lzaW9uLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IxLCB0eXBlbmFtZSBfSXRlcmF0b3IyPgorICAgIGlubGluZSBzdGQ6OnBhaXI8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yMT46OmRpZmZlcmVuY2VfdHlwZSwKKwkJICAgICBfRGlzdGFuY2VfcHJlY2lzaW9uPgorICAgIF9fZ2V0X2Rpc3RhbmNlKGNvbnN0IF9JdGVyYXRvcjEmIF9fbGhzLCBjb25zdCBfSXRlcmF0b3IyJiBfX3JocywKKwkJICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7IHJldHVybiBzdGQ6Om1ha2VfcGFpcihfX3JocyAtIF9fbGhzLCBfX2RwX2V4YWN0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcjEsIHR5cGVuYW1lIF9JdGVyYXRvcjI+CisgICAgaW5saW5lIHN0ZDo6cGFpcjx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3IxPjo6ZGlmZmVyZW5jZV90eXBlLAorCQkgICAgIF9EaXN0YW5jZV9wcmVjaXNpb24+CisgICAgX19nZXRfZGlzdGFuY2UoY29uc3QgX0l0ZXJhdG9yMSYgX19saHMsIGNvbnN0IF9JdGVyYXRvcjImIF9fcmhzLAorCQkgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKF9fbGhzID09IF9fcmhzPyAwIDogMSwgX19kcF9lcXVhbGl0eSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IxLCB0eXBlbmFtZSBfSXRlcmF0b3IyPgorICAgIGlubGluZSBzdGQ6OnBhaXI8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yMT46OmRpZmZlcmVuY2VfdHlwZSwKKwkJICAgICBfRGlzdGFuY2VfcHJlY2lzaW9uPgorICAgIF9fZ2V0X2Rpc3RhbmNlKGNvbnN0IF9JdGVyYXRvcjEmIF9fbGhzLCBjb25zdCBfSXRlcmF0b3IyJiBfX3JocykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcjE+OjppdGVyYXRvcl9jYXRlZ29yeQorCSAgX0NhdGVnb3J5OworICAgICAgcmV0dXJuIF9fZ2V0X2Rpc3RhbmNlKF9fbGhzLCBfX3JocywgX0NhdGVnb3J5KCkpOworICAgIH0KKworICAvKiogXGJyaWVmIFNhZmUgaXRlcmF0b3Igd3JhcHBlci4KKyAgICoKKyAgICogIFRoZSBjbGFzcyB0ZW1wbGF0ZSAlX1NhZmVfaXRlcmF0b3IgaXMgYSB3cmFwcGVyIGFyb3VuZCBhbgorICAgKiAgaXRlcmF0b3IgdGhhdCB0cmFja3MgdGhlIGl0ZXJhdG9yJ3MgbW92ZW1lbnQgYW1vbmcgc2VxdWVuY2VzIGFuZAorICAgKiAgY2hlY2tzIHRoYXQgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlICJzYWZlIiBpdGVyYXRvciBhcmUKKyAgICogIGxlZ2FsLiBJbiBhZGRpdGlvbmFsIHRvIHRoZSBiYXNpYyBpdGVyYXRvciBvcGVyYXRpb25zICh3aGljaCBhcmUKKyAgICogIHZhbGlkYXRlZCwgYW5kIHRoZW4gcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yKSwKKyAgICogICVfU2FmZV9pdGVyYXRvciBoYXMgbWVtYmVyIGZ1bmN0aW9ucyBmb3IgaXRlcmF0b3IgaW52YWxpZGF0aW9uLAorICAgKiAgYXR0YWNoaW5nL2RldGFjaGluZyB0aGUgaXRlcmF0b3IgZnJvbSBzZXF1ZW5jZXMsIGFuZCBxdWVyeWluZworICAgKiAgdGhlIGl0ZXJhdG9yJ3Mgc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBjbGFzcyBfU2FmZV9pdGVyYXRvciA6IHB1YmxpYyBfU2FmZV9pdGVyYXRvcl9iYXNlCisgICAgeworICAgICAgdHlwZWRlZiBfU2FmZV9pdGVyYXRvciBfU2VsZjsKKworICAgICAgLy8vIFRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yCisgICAgICBfSXRlcmF0b3IgX01fY3VycmVudDsKKworICAgICAgLy8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgY29uc3RhbnQgaXRlcmF0b3IuCisgICAgICBib29sCisgICAgICBfTV9jb25zdGFudCgpIGNvbnN0CisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCXJldHVybiBzdGQ6Ol9fYXJlX3NhbWU8Y29uc3RfaXRlcmF0b3IsIF9TYWZlX2l0ZXJhdG9yPjo6X192YWx1ZTsKKyAgICAgIH0KKworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+IF9UcmFpdHM7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9JdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjp2YWx1ZV90eXBlICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpkaWZmZXJlbmNlX3R5cGUgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnJlZmVyZW5jZSAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciAgICAgICAgICAgcG9pbnRlcjsKKworICAgICAgLy8vIEBwb3N0IHRoZSBpdGVyYXRvciBpcyBzaW5ndWxhciBhbmQgdW5hdHRhY2hlZAorICAgICAgX1NhZmVfaXRlcmF0b3IoKSA6IF9NX2N1cnJlbnQoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2FmZSBpdGVyYXRvciBjb25zdHJ1Y3Rpb24gZnJvbSBhbiB1bnNhZmUgaXRlcmF0b3IgYW5kCisgICAgICAgKiBpdHMgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogQHByZSBAcCBzZXEgaXMgbm90IE5VTEwKKyAgICAgICAqIEBwb3N0IHRoaXMgaXMgbm90IHNpbmd1bGFyCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2l0ZXJhdG9yKGNvbnN0IF9JdGVyYXRvciYgX19pLCBjb25zdCBfU2VxdWVuY2UqIF9fc2VxKQorICAgICAgOiBfU2FmZV9pdGVyYXRvcl9iYXNlKF9fc2VxLCBfTV9jb25zdGFudCgpKSwgX01fY3VycmVudChfX2kpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgdGhpcy0+X01fc2luZ3VsYXIoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfaW5pdF9zaW5ndWxhcikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHkgY29uc3RydWN0aW9uLgorICAgICAgICovCisgICAgICBfU2FmZV9pdGVyYXRvcihjb25zdCBfU2FmZV9pdGVyYXRvciYgX194KQorICAgICAgOiBfU2FmZV9pdGVyYXRvcl9iYXNlKF9feCwgX01fY29uc3RhbnQoKSksIF9NX2N1cnJlbnQoX194Ll9NX2N1cnJlbnQpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIERSIDQwOC4gSXMgdmVjdG9yPHJldmVyc2VfaXRlcmF0b3I8Y2hhcio+ID4gZm9yYmlkZGVuPworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSghX194Ll9NX3Npbmd1bGFyKCkKKwkJCSAgICAgIHx8IF9feC5fTV9jdXJyZW50ID09IF9JdGVyYXRvcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19pbml0X2NvcHlfc2luZ3VsYXIpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcihfX3gsICJvdGhlciIpKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIE1vdmUgY29uc3RydWN0aW9uLgorICAgICAgICogQHBvc3QgX194IGlzIHNpbmd1bGFyIGFuZCB1bmF0dGFjaGVkCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2l0ZXJhdG9yKF9TYWZlX2l0ZXJhdG9yJiYgX194KSA6IF9NX2N1cnJlbnQoKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSghX194Ll9NX3Npbmd1bGFyKCkKKwkJCSAgICAgIHx8IF9feC5fTV9jdXJyZW50ID09IF9JdGVyYXRvcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19pbml0X2NvcHlfc2luZ3VsYXIpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcihfX3gsICJvdGhlciIpKTsKKwlzdGQ6OnN3YXAoX01fY3VycmVudCwgX194Ll9NX2N1cnJlbnQpOworCXRoaXMtPl9NX2F0dGFjaChfX3guX01fc2VxdWVuY2UpOworCV9feC5fTV9kZXRhY2goKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQ29udmVydGluZyBjb25zdHJ1Y3RvciBmcm9tIGEgbXV0YWJsZSBpdGVyYXRvciB0byBhCisgICAgICAgKiAgY29uc3RhbnQgaXRlcmF0b3IuCisgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX011dGFibGVJdGVyYXRvcj4KKyAgICAgICAgX1NhZmVfaXRlcmF0b3IoCisgICAgICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X011dGFibGVJdGVyYXRvciwKKyAgICAgICAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPChzdGQ6Ol9fYXJlX3NhbWU8X011dGFibGVJdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU2VxdWVuY2U6Oml0ZXJhdG9yOjppdGVyYXRvcl90eXBlPjo6X192YWx1ZSksCisgICAgICAgICAgICAgICAgICAgX1NlcXVlbmNlPjo6X190eXBlPiYgX194KQorCTogX1NhZmVfaXRlcmF0b3JfYmFzZShfX3gsIF9NX2NvbnN0YW50KCkpLCBfTV9jdXJyZW50KF9feC5iYXNlKCkpCisgICAgICAgIHsKKwkgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgIC8vIERSIDQwOC4gSXMgdmVjdG9yPHJldmVyc2VfaXRlcmF0b3I8Y2hhcio+ID4gZm9yYmlkZGVuPworCSAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCFfX3guX01fc2luZ3VsYXIoKQorCQkJCXx8IF9feC5iYXNlKCkgPT0gX0l0ZXJhdG9yKCksCisJCQkJX01fbWVzc2FnZShfX21zZ19pbml0X2NvbnN0X3Npbmd1bGFyKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKQorCQkJCS5fTV9pdGVyYXRvcihfX3gsICJvdGhlciIpKTsKKwl9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHkgYXNzaWdubWVudC4KKyAgICAgICAqLworICAgICAgX1NhZmVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1NhZmVfaXRlcmF0b3ImIF9feCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gRFIgNDA4LiBJcyB2ZWN0b3I8cmV2ZXJzZV9pdGVyYXRvcjxjaGFyKj4gPiBmb3JiaWRkZW4/CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKCFfX3guX01fc2luZ3VsYXIoKQorCQkJICAgICAgfHwgX194Ll9NX2N1cnJlbnQgPT0gX0l0ZXJhdG9yKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2NvcHlfc2luZ3VsYXIpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcihfX3gsICJvdGhlciIpKTsKKwlfTV9jdXJyZW50ID0gX194Ll9NX2N1cnJlbnQ7CisJdGhpcy0+X01fYXR0YWNoKF9feC5fTV9zZXF1ZW5jZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgTW92ZSBhc3NpZ25tZW50LgorICAgICAgICogQHBvc3QgX194IGlzIHNpbmd1bGFyIGFuZCB1bmF0dGFjaGVkCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KF9TYWZlX2l0ZXJhdG9yJiYgX194KQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzICE9ICZfX3gsCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX3NlbGZfbW92ZV9hc3NpZ24pCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikpOworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSghX194Ll9NX3Npbmd1bGFyKCkKKwkJCSAgICAgIHx8IF9feC5fTV9jdXJyZW50ID09IF9JdGVyYXRvcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19jb3B5X3Npbmd1bGFyKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX194LCAib3RoZXIiKSk7CisJX01fY3VycmVudCA9IF9feC5fTV9jdXJyZW50OworCV9NX2F0dGFjaChfX3guX01fc2VxdWVuY2UpOworCV9feC5fTV9kZXRhY2goKTsKKwlfX3guX01fY3VycmVudCA9IF9JdGVyYXRvcigpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSXRlcmF0b3IgZGVyZWZlcmVuY2UuCisgICAgICAgKiAgQHByZSBpdGVyYXRvciBpcyBkZXJlZmVyZW5jZWFibGUKKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9kZXJlZmVyZW5jZWFibGUoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfYmFkX2RlcmVmKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsKKwlyZXR1cm4gKl9NX2N1cnJlbnQ7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJdGVyYXRvciBkZXJlZmVyZW5jZS4KKyAgICAgICAqICBAcHJlIGl0ZXJhdG9yIGlzIGRlcmVmZXJlbmNlYWJsZQorICAgICAgICogIEB0b2RvIE1ha2UgdGhpcyBjb3JyZWN0IHcuci50LiBpdGVyYXRvcnMgdGhhdCByZXR1cm4gcHJveGllcworICAgICAgICogIEB0b2RvIFVzZSBhZGRyZXNzb2YoKSBpbnN0ZWFkIG9mICYgb3BlcmF0b3IKKyAgICAgICAqLworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKHRoaXMtPl9NX2RlcmVmZXJlbmNlYWJsZSgpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19iYWRfZGVyZWYpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikpOworCXJldHVybiAmKl9NX2N1cnJlbnQ7CisgICAgICB9CisKKyAgICAgIC8vIC0tLS0tLSBJbnB1dCBpdGVyYXRvciByZXF1aXJlbWVudHMgLS0tLS0tCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSXRlcmF0b3IgcHJlaW5jcmVtZW50CisgICAgICAgKiAgQHByZSBpdGVyYXRvciBpcyBpbmNyZW1lbnRhYmxlCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKHRoaXMtPl9NX2luY3JlbWVudGFibGUoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfYmFkX2luYykKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKSk7CisJKytfTV9jdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEl0ZXJhdG9yIHBvc3RpbmNyZW1lbnQKKyAgICAgICAqICBAcHJlIGl0ZXJhdG9yIGlzIGluY3JlbWVudGFibGUKKyAgICAgICAqLworICAgICAgX1NhZmVfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9pbmNyZW1lbnRhYmxlKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2JhZF9pbmMpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikpOworCV9TYWZlX2l0ZXJhdG9yIF9fdG1wKCp0aGlzKTsKKwkrK19NX2N1cnJlbnQ7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICAvLyAtLS0tLS0gQmlkaXJlY3Rpb25hbCBpdGVyYXRvciByZXF1aXJlbWVudHMgLS0tLS0tCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSXRlcmF0b3IgcHJlZGVjcmVtZW50CisgICAgICAgKiAgQHByZSBpdGVyYXRvciBpcyBkZWNyZW1lbnRhYmxlCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKHRoaXMtPl9NX2RlY3JlbWVudGFibGUoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfYmFkX2RlYykKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKSk7CisJLS1fTV9jdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEl0ZXJhdG9yIHBvc3RkZWNyZW1lbnQKKyAgICAgICAqICBAcHJlIGl0ZXJhdG9yIGlzIGRlY3JlbWVudGFibGUKKyAgICAgICAqLworICAgICAgX1NhZmVfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9kZWNyZW1lbnRhYmxlKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2JhZF9kZWMpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikpOworCV9TYWZlX2l0ZXJhdG9yIF9fdG1wKCp0aGlzKTsKKwktLV9NX2N1cnJlbnQ7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICAvLyAtLS0tLS0gUmFuZG9tIGFjY2VzcyBpdGVyYXRvciByZXF1aXJlbWVudHMgLS0tLS0tCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKHRoaXMtPl9NX2Nhbl9hZHZhbmNlKF9fbikKKwkJCSAgICAgICYmIHRoaXMtPl9NX2Nhbl9hZHZhbmNlKF9fbisxKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9zdWJzY3JpcHRfb29iKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzKS5fTV9pbnRlZ2VyKF9fbikpOworCisJcmV0dXJuIF9NX2N1cnJlbnRbX19uXTsKKyAgICAgIH0KKworICAgICAgX1NhZmVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcis9KGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9jYW5fYWR2YW5jZShfX24pLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19hZHZhbmNlX29vYikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcykuX01faW50ZWdlcihfX24pKTsKKwlfTV9jdXJyZW50ICs9IF9fbjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TYWZlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisoY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pIGNvbnN0CisgICAgICB7CisJX1NhZmVfaXRlcmF0b3IgX190bXAoKnRoaXMpOworCV9fdG1wICs9IF9fbjsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIF9TYWZlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItPShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcy0+X01fY2FuX2FkdmFuY2UoLV9fbiksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX3JldHJlYXRfb29iKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzKS5fTV9pbnRlZ2VyKF9fbikpOworCV9NX2N1cnJlbnQgKz0gLV9fbjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TYWZlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvci0oY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pIGNvbnN0CisgICAgICB7CisJX1NhZmVfaXRlcmF0b3IgX190bXAoKnRoaXMpOworCV9fdG1wIC09IF9fbjsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIC8vIC0tLS0tLSBVdGlsaXRpZXMgLS0tLS0tCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IKKyAgICAgICAqLworICAgICAgX0l0ZXJhdG9yCisgICAgICBiYXNlKCkgY29uc3QgeyByZXR1cm4gX01fY3VycmVudDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb252ZXJzaW9uIHRvIHVuZGVybHlpbmcgbm9uLWRlYnVnIGl0ZXJhdG9yIHRvIGFsbG93CisgICAgICAgKiBiZXR0ZXIgaW50ZXJhY3Rpb24gd2l0aCBub24tZGVidWcgY29udGFpbmVycy4KKyAgICAgICAqLworICAgICAgb3BlcmF0b3IgX0l0ZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fY3VycmVudDsgfQorCisgICAgICAvKiogQXR0YWNoIGl0ZXJhdG9yIHRvIHRoZSBnaXZlbiBzZXF1ZW5jZS4gKi8KKyAgICAgIHZvaWQKKyAgICAgIF9NX2F0dGFjaChfU2FmZV9zZXF1ZW5jZV9iYXNlKiBfX3NlcSkKKyAgICAgIHsKKwlfU2FmZV9pdGVyYXRvcl9iYXNlOjpfTV9hdHRhY2goX19zZXEsIF9NX2NvbnN0YW50KCkpOworICAgICAgfQorCisgICAgICAvKiogTGlrZXdpc2UsIGJ1dCBub3QgdGhyZWFkLXNhZmUuICovCisgICAgICB2b2lkCisgICAgICBfTV9hdHRhY2hfc2luZ2xlKF9TYWZlX3NlcXVlbmNlX2Jhc2UqIF9fc2VxKQorICAgICAgeworCV9TYWZlX2l0ZXJhdG9yX2Jhc2U6Ol9NX2F0dGFjaF9zaW5nbGUoX19zZXEsIF9NX2NvbnN0YW50KCkpOworICAgICAgfQorCisgICAgICAvLy8gSXMgdGhlIGl0ZXJhdG9yIGRlcmVmZXJlbmNlYWJsZT8KKyAgICAgIGJvb2wKKyAgICAgIF9NX2RlcmVmZXJlbmNlYWJsZSgpIGNvbnN0CisgICAgICB7IHJldHVybiAhdGhpcy0+X01fc2luZ3VsYXIoKSAmJiAhX01faXNfZW5kKCkgJiYgIV9NX2lzX2JlZm9yZV9iZWdpbigpOyB9CisKKyAgICAgIC8vLyBJcyB0aGUgaXRlcmF0b3IgYmVmb3JlIGEgZGVyZWZlcmVuY2VhYmxlIG9uZT8KKyAgICAgIGJvb2wKKyAgICAgIF9NX2JlZm9yZV9kZXJlZmVyZW5jZWFibGUoKSBjb25zdAorICAgICAgeworCWlmICh0aGlzLT5fTV9pbmNyZW1lbnRhYmxlKCkpCisJeworCSAgX0l0ZXJhdG9yIF9fYmFzZSA9IGJhc2UoKTsKKwkgIHJldHVybiArK19fYmFzZSAhPSBfTV9nZXRfc2VxdWVuY2UoKS0+X01fYmFzZSgpLmVuZCgpOworCX0KKwlyZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIC8vLyBJcyB0aGUgaXRlcmF0b3IgaW5jcmVtZW50YWJsZT8KKyAgICAgIGJvb2wKKyAgICAgIF9NX2luY3JlbWVudGFibGUoKSBjb25zdAorICAgICAgeyByZXR1cm4gIXRoaXMtPl9NX3Npbmd1bGFyKCkgJiYgIV9NX2lzX2VuZCgpOyB9CisKKyAgICAgIC8vIElzIHRoZSBpdGVyYXRvciBkZWNyZW1lbnRhYmxlPworICAgICAgYm9vbAorICAgICAgX01fZGVjcmVtZW50YWJsZSgpIGNvbnN0IHsgcmV0dXJuICFfTV9zaW5ndWxhcigpICYmICFfTV9pc19iZWdpbigpOyB9CisKKyAgICAgIC8vIENhbiB3ZSBhZHZhbmNlIHRoZSBpdGVyYXRvciBAcCBfX24gc3RlcHMgKEBwIF9fbiBtYXkgYmUgbmVnYXRpdmUpCisgICAgICBib29sCisgICAgICBfTV9jYW5fYWR2YW5jZShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikgY29uc3Q7CisKKyAgICAgIC8vIElzIHRoZSBpdGVyYXRvciByYW5nZSBbKnRoaXMsIF9fcmhzKSB2YWxpZD8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdGhlcj4KKyAgICAgICAgYm9vbAorICAgICAgICBfTV92YWxpZF9yYW5nZShjb25zdCBfU2FmZV9pdGVyYXRvcjxfT3RoZXIsIF9TZXF1ZW5jZT4mIF9fcmhzKSBjb25zdDsKKworICAgICAgLy8gVGhlIHNlcXVlbmNlIHRoaXMgaXRlcmF0b3IgcmVmZXJlbmNlcy4KKyAgICAgIGNvbnN0IF9TZXF1ZW5jZSoKKyAgICAgIF9NX2dldF9zZXF1ZW5jZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBfU2VxdWVuY2UqPihfTV9zZXF1ZW5jZSk7IH0KKworICAgICAgLy8vIElzIHRoaXMgaXRlcmF0b3IgZXF1YWwgdG8gdGhlIHNlcXVlbmNlJ3MgYmVnaW4oKSBpdGVyYXRvcj8KKyAgICAgIGJvb2wgX01faXNfYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gYmFzZSgpID09IF9NX2dldF9zZXF1ZW5jZSgpLT5fTV9iYXNlKCkuYmVnaW4oKTsgfQorCisgICAgICAvLy8gSXMgdGhpcyBpdGVyYXRvciBlcXVhbCB0byB0aGUgc2VxdWVuY2UncyBlbmQoKSBpdGVyYXRvcj8KKyAgICAgIGJvb2wgX01faXNfZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGJhc2UoKSA9PSBfTV9nZXRfc2VxdWVuY2UoKS0+X01fYmFzZSgpLmVuZCgpOyB9CisKKyAgICAgIC8vLyBJcyB0aGlzIGl0ZXJhdG9yIGVxdWFsIHRvIHRoZSBzZXF1ZW5jZSdzIGJlZm9yZV9iZWdpbigpIGl0ZXJhdG9yIGlmCisgICAgICAvLy8gYW55PworICAgICAgYm9vbCBfTV9pc19iZWZvcmVfYmVnaW4oKSBjb25zdAorICAgICAgeworCXJldHVybiBfQmVmb3JlQmVnaW5IZWxwZXI8X1NlcXVlbmNlPjo6X1NfSXMoYmFzZSgpLCBfTV9nZXRfc2VxdWVuY2UoKSk7CisgICAgICB9CisKKyAgICAgIC8vLyBJcyB0aGlzIGl0ZXJhdG9yIGVxdWFsIHRvIHRoZSBzZXF1ZW5jZSdzIGJlZm9yZV9iZWdpbigpIGl0ZXJhdG9yIGlmCisgICAgICAvLy8gYW55IG9yIGJlZ2luKCkgb3RoZXJ3aXNlPworICAgICAgYm9vbCBfTV9pc19iZWdpbm5lc3QoKSBjb25zdAorICAgICAgeworCXJldHVybiBfQmVmb3JlQmVnaW5IZWxwZXI8X1NlcXVlbmNlPjo6X1NfSXNfQmVnaW5uZXN0KGJhc2UoKSwKKwkJCQkJCQkgIF9NX2dldF9zZXF1ZW5jZSgpKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9jb21wYXJlX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19jb21wYXJlX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgPT0gX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKyAgICAgICAgICAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19pdGVyX2NvbXBhcmVfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2NvbXBhcmVfZGlmZmVyZW50KQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSA9PSBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9jb21wYXJlX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19jb21wYXJlX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgIT0gX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKyAgICAgICAgICAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19pdGVyX2NvbXBhcmVfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2NvbXBhcmVfZGlmZmVyZW50KQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSAhPSBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfb3JkZXJfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX29yZGVyX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgPCBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfb3JkZXJfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX29yZGVyX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgPCBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9vcmRlcl9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfb3JkZXJfZGlmZmVyZW50KQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSA8PSBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGhzLAorICAgICAgICAgICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfb3JkZXJfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX29yZGVyX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgPD0gX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19pdGVyX29yZGVyX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19vcmRlcl9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICByZXR1cm4gX19saHMuYmFzZSgpID4gX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19pdGVyX29yZGVyX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19vcmRlcl9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICByZXR1cm4gX19saHMuYmFzZSgpID4gX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfb3JkZXJfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX29yZGVyX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgPj0gX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKyAgICAgICAgICAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19pdGVyX29yZGVyX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19vcmRlcl9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICByZXR1cm4gX19saHMuYmFzZSgpID49IF9fcmhzLmJhc2UoKTsKKyAgICB9CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyBBY2NvcmRpbmcgdG8gdGhlIHJlc29sdXRpb24gb2YgRFIxNzkgbm90IG9ubHkgdGhlIHZhcmlvdXMgY29tcGFyaXNvbgorICAvLyBvcGVyYXRvcnMgYnV0IGFsc28gb3BlcmF0b3ItIG11c3QgYWNjZXB0IG1peGVkIGl0ZXJhdG9yL2NvbnN0X2l0ZXJhdG9yCisgIC8vIHBhcmFtZXRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgb3BlcmF0b3ItKGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfZGlzdGFuY2VfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2Rpc3RhbmNlX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgLSBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICAgaW5saW5lIHR5cGVuYW1lIF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgIG9wZXJhdG9yLShjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgICB7CisgICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgIF9NX21lc3NhZ2UoX19tc2dfZGlzdGFuY2VfYmFkKQorCQkJICAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICAgX01fbWVzc2FnZShfX21zZ19kaXN0YW5jZV9kaWZmZXJlbnQpCisJCQkgICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgICByZXR1cm4gX19saHMuYmFzZSgpIC0gX19yaHMuYmFzZSgpOworICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPgorICAgIG9wZXJhdG9yKyh0eXBlbmFtZSBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsX1NlcXVlbmNlPjo6ZGlmZmVyZW5jZV90eXBlIF9fbiwKKwkgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9faSkKKyAgICB7IHJldHVybiBfX2kgKyBfX247IH0KK30gLy8gbmFtZXNwYWNlIF9fZ251X2RlYnVnCisKKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2l0ZXJhdG9yLnRjYz4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfaXRlcmF0b3IudGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX2l0ZXJhdG9yLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWE5YzZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX2l0ZXJhdG9yLnRjYwpAQCAtMCwwICsxLDEwNiBAQAorLy8gRGVidWdnaW5nIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIChvdXQgb2YgbGluZSkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3NhZmVfaXRlcmF0b3IudGNjCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19TQUZFX0lURVJBVE9SX1RDQworI2RlZmluZSBfR0xJQkNYWF9ERUJVR19TQUZFX0lURVJBVE9SX1RDQyAxCisKK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBib29sCisgICAgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+OjoKKyAgICBfTV9jYW5fYWR2YW5jZShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfZGVidWdfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnN0X2RlYnVnX2l0ZXJhdG9yOjppdGVyYXRvcl90eXBlIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICBpZiAodGhpcy0+X01fc2luZ3VsYXIoKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoX19uID09IDApCisJcmV0dXJuIHRydWU7CisgICAgICBpZiAoX19uIDwgMCkKKwl7CisJICBjb25zdF9pdGVyYXRvciBfX2JlZ2luID0gX01fZ2V0X3NlcXVlbmNlKCktPl9NX2Jhc2UoKS5iZWdpbigpOworCSAgc3RkOjpwYWlyPGRpZmZlcmVuY2VfdHlwZSwgX0Rpc3RhbmNlX3ByZWNpc2lvbj4gX19kaXN0ID0KKwkgICAgX19nZXRfZGlzdGFuY2UoX19iZWdpbiwgYmFzZSgpKTsKKwkgIGJvb2wgX19vayA9ICAoKF9fZGlzdC5zZWNvbmQgPT0gX19kcF9leGFjdCAmJiBfX2Rpc3QuZmlyc3QgPj0gLV9fbikKKwkJCXx8IChfX2Rpc3Quc2Vjb25kICE9IF9fZHBfZXhhY3QgJiYgX19kaXN0LmZpcnN0ID4gMCkpOworCSAgcmV0dXJuIF9fb2s7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNvbnN0X2l0ZXJhdG9yIF9fZW5kID0gX01fZ2V0X3NlcXVlbmNlKCktPl9NX2Jhc2UoKS5lbmQoKTsKKwkgIHN0ZDo6cGFpcjxkaWZmZXJlbmNlX3R5cGUsIF9EaXN0YW5jZV9wcmVjaXNpb24+IF9fZGlzdCA9CisJICAgIF9fZ2V0X2Rpc3RhbmNlKGJhc2UoKSwgX19lbmQpOworCSAgYm9vbCBfX29rID0gKChfX2Rpc3Quc2Vjb25kID09IF9fZHBfZXhhY3QgJiYgX19kaXN0LmZpcnN0ID49IF9fbikKKwkJICAgICAgIHx8IChfX2Rpc3Quc2Vjb25kICE9IF9fZHBfZXhhY3QgJiYgX19kaXN0LmZpcnN0ID4gMCkpOworCSAgcmV0dXJuIF9fb2s7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3RoZXI+CisgICAgICBib29sCisgICAgICBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT46OgorICAgICAgX01fdmFsaWRfcmFuZ2UoY29uc3QgX1NhZmVfaXRlcmF0b3I8X090aGVyLCBfU2VxdWVuY2U+JiBfX3JocykgY29uc3QKKyAgICAgIHsKKwlpZiAoIV9NX2Nhbl9jb21wYXJlKF9fcmhzKSkKKwkgIHJldHVybiBmYWxzZTsKKworCS8qIERldGVybWluZSBpZiB3ZSBjYW4gb3JkZXIgdGhlIGl0ZXJhdG9ycyB3aXRob3V0IHRoZSBoZWxwIG9mCisJICAgdGhlIGNvbnRhaW5lciAqLworCXN0ZDo6cGFpcjxkaWZmZXJlbmNlX3R5cGUsIF9EaXN0YW5jZV9wcmVjaXNpb24+IF9fZGlzdCA9CisJICBfX2dldF9kaXN0YW5jZShiYXNlKCksIF9fcmhzLmJhc2UoKSk7CisJc3dpdGNoIChfX2Rpc3Quc2Vjb25kKSB7CisJY2FzZSBfX2RwX2VxdWFsaXR5OgorCSAgaWYgKF9fZGlzdC5maXJzdCA9PSAwKQorCSAgICByZXR1cm4gdHJ1ZTsKKwkgIGJyZWFrOworCisJY2FzZSBfX2RwX3NpZ246CisJY2FzZSBfX2RwX2V4YWN0OgorCSAgcmV0dXJuIF9fZGlzdC5maXJzdCA+PSAwOworCX0KKworCS8qIFdlIGNhbiBvbmx5IHRlc3QgZm9yIGVxdWFsaXR5LCBidXQgY2hlY2sgaWYgb25lIG9mIHRoZQorCSAgIGl0ZXJhdG9ycyBpcyBhdCBhbiBleHRyZW1lLiAqLworCS8qIE9wdGltIGZvciBjbGFzc2ljIFtiZWdpbiwgaXQpIG9yIFtpdCwgZW5kKSByYW5nZXMsIGxpbWl0IGNoZWNrcworCSAqIHdoZW4gY29kZSBpcyB2YWxpZC4gIE5vdGUsIGZvciB0aGUgc3BlY2lhbCBjYXNlIG9mIGZvcndhcmRfbGlzdCwKKwkgKiBiZWZvcmVfYmVnaW4gcmVwbGFjZXMgdGhlIHJvbGUgb2YgYmVnaW4uICAqLyAKKwlpZiAoX01faXNfYmVnaW5uZXN0KCkgfHwgX19yaHMuX01faXNfZW5kKCkpCisJICByZXR1cm4gdHJ1ZTsKKwlpZiAoX01faXNfZW5kKCkgfHwgX19yaHMuX01faXNfYmVnaW5uZXN0KCkpCisJICByZXR1cm4gZmFsc2U7CisKKwkvLyBBc3N1bWUgdGhhdCB0aGlzIGlzIGEgdmFsaWQgcmFuZ2U7IHdlIGNhbid0IGNoZWNrIGFueXRoaW5nIGVsc2UKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIH0KK30gLy8gbmFtZXNwYWNlIF9fZ251X2RlYnVnCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfbG9jYWxfaXRlcmF0b3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9sb2NhbF9pdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MjZlZDgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfbG9jYWxfaXRlcmF0b3IuaApAQCAtMCwwICsxLDM2OSBAQAorLy8gU2FmZSBpdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3NhZmVfbG9jYWxfaXRlcmF0b3IuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfU0FGRV9MT0NBTF9JVEVSQVRPUl9ICisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1NBRkVfTE9DQUxfSVRFUkFUT1JfSCAxCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPGRlYnVnL21hY3Jvcy5oPgorI2luY2x1ZGUgPGRlYnVnL2Z1bmN0aW9ucy5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfdW5vcmRlcmVkX2Jhc2UuaD4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKworbmFtZXNwYWNlIF9fZ251X2RlYnVnCit7CisgIC8qKiBcYnJpZWYgU2FmZSBpdGVyYXRvciB3cmFwcGVyLgorICAgKgorICAgKiAgVGhlIGNsYXNzIHRlbXBsYXRlICVfU2FmZV9sb2NhbF9pdGVyYXRvciBpcyBhIHdyYXBwZXIgYXJvdW5kIGFuCisgICAqICBpdGVyYXRvciB0aGF0IHRyYWNrcyB0aGUgaXRlcmF0b3IncyBtb3ZlbWVudCBhbW9uZyBzZXF1ZW5jZXMgYW5kCisgICAqICBjaGVja3MgdGhhdCBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUgInNhZmUiIGl0ZXJhdG9yIGFyZQorICAgKiAgbGVnYWwuIEluIGFkZGl0aW9uYWwgdG8gdGhlIGJhc2ljIGl0ZXJhdG9yIG9wZXJhdGlvbnMgKHdoaWNoIGFyZQorICAgKiAgdmFsaWRhdGVkLCBhbmQgdGhlbiBwYXNzZWQgdG8gdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IpLAorICAgKiAgJV9TYWZlX2xvY2FsX2l0ZXJhdG9yIGhhcyBtZW1iZXIgZnVuY3Rpb25zIGZvciBpdGVyYXRvciBpbnZhbGlkYXRpb24sCisgICAqICBhdHRhY2hpbmcvZGV0YWNoaW5nIHRoZSBpdGVyYXRvciBmcm9tIHNlcXVlbmNlcywgYW5kIHF1ZXJ5aW5nCisgICAqICB0aGUgaXRlcmF0b3IncyBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGNsYXNzIF9TYWZlX2xvY2FsX2l0ZXJhdG9yIDogcHVibGljIF9TYWZlX2xvY2FsX2l0ZXJhdG9yX2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIF9TYWZlX2xvY2FsX2l0ZXJhdG9yIF9TZWxmOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnNpemVfdHlwZSBzaXplX3R5cGU7CisKKyAgICAgIC8vLyBUaGUgdW5kZXJseWluZyBpdGVyYXRvcgorICAgICAgX0l0ZXJhdG9yIF9NX2N1cnJlbnQ7CisKKyAgICAgIC8vLyBUaGUgYnVja2V0IHRoaXMgbG9jYWwgaXRlcmF0b3IgYmVsb25ncyB0byAKKyAgICAgIHNpemVfdHlwZSBfTV9idWNrZXQ7CisKKyAgICAgIC8vLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGNvbnN0YW50IGl0ZXJhdG9yLgorICAgICAgYm9vbAorICAgICAgX01fY29uc3RhbnQoKSBjb25zdAorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpjb25zdF9sb2NhbF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKwlyZXR1cm4gc3RkOjpfX2FyZV9zYW1lPGNvbnN0X2l0ZXJhdG9yLCBfU2FmZV9sb2NhbF9pdGVyYXRvcj46Ol9fdmFsdWU7CisgICAgICB9CisKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPiBfVHJhaXRzOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfSXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6dmFsdWVfdHlwZSAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6ZGlmZmVyZW5jZV90eXBlICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpyZWZlcmVuY2UgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvaW50ZXIgICAgICAgICAgIHBvaW50ZXI7CisKKyAgICAgIC8vLyBAcG9zdCB0aGUgaXRlcmF0b3IgaXMgc2luZ3VsYXIgYW5kIHVuYXR0YWNoZWQKKyAgICAgIF9TYWZlX2xvY2FsX2l0ZXJhdG9yKCkgOiBfTV9jdXJyZW50KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNhZmUgaXRlcmF0b3IgY29uc3RydWN0aW9uIGZyb20gYW4gdW5zYWZlIGl0ZXJhdG9yIGFuZAorICAgICAgICogaXRzIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEBwcmUgQHAgc2VxIGlzIG5vdCBOVUxMCisgICAgICAgKiBAcG9zdCB0aGlzIGlzIG5vdCBzaW5ndWxhcgorICAgICAgICovCisgICAgICBfU2FmZV9sb2NhbF9pdGVyYXRvcihjb25zdCBfSXRlcmF0b3ImIF9faSwgc2l6ZV90eXBlIF9fYnVja2V0LAorCQkJICAgY29uc3QgX1NlcXVlbmNlKiBfX3NlcSkKKyAgICAgIDogX1NhZmVfbG9jYWxfaXRlcmF0b3JfYmFzZShfX3NlcSwgX01fY29uc3RhbnQoKSksIF9NX2N1cnJlbnQoX19pKSwKKwlfTV9idWNrZXQoX19idWNrZXQpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKCF0aGlzLT5fTV9zaW5ndWxhcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19pbml0X3Npbmd1bGFyKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29weSBjb25zdHJ1Y3Rpb24uCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2xvY2FsX2l0ZXJhdG9yKGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yJiBfX3gpCisgICAgICA6IF9TYWZlX2xvY2FsX2l0ZXJhdG9yX2Jhc2UoX194LCBfTV9jb25zdGFudCgpKSwKKwlfTV9jdXJyZW50KF9feC5fTV9jdXJyZW50KSwgX01fYnVja2V0KF9feC5fTV9idWNrZXQpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIERSIDQwOC4gSXMgdmVjdG9yPHJldmVyc2VfaXRlcmF0b3I8Y2hhcio+ID4gZm9yYmlkZGVuPworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSghX194Ll9NX3Npbmd1bGFyKCkKKwkJCSAgICAgIHx8IF9feC5fTV9jdXJyZW50ID09IF9JdGVyYXRvcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19pbml0X2NvcHlfc2luZ3VsYXIpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcihfX3gsICJvdGhlciIpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIENvbnZlcnRpbmcgY29uc3RydWN0b3IgZnJvbSBhIG11dGFibGUgaXRlcmF0b3IgdG8gYQorICAgICAgICogIGNvbnN0YW50IGl0ZXJhdG9yLgorICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9NdXRhYmxlSXRlcmF0b3I+CisJX1NhZmVfbG9jYWxfaXRlcmF0b3IoCisJICBjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvcjxfTXV0YWJsZUl0ZXJhdG9yLAorCSAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxzdGQ6Ol9fYXJlX3NhbWU8CisJICAgICAgX011dGFibGVJdGVyYXRvciwKKwkgICAgICB0eXBlbmFtZSBfU2VxdWVuY2U6OmxvY2FsX2l0ZXJhdG9yOjppdGVyYXRvcl90eXBlPjo6X192YWx1ZSwKKwkJCQkJICBfU2VxdWVuY2U+OjpfX3R5cGU+JiBfX3gpCisJOiBfU2FmZV9sb2NhbF9pdGVyYXRvcl9iYXNlKF9feCwgX01fY29uc3RhbnQoKSksCisJICBfTV9jdXJyZW50KF9feC5iYXNlKCkpLCBfTV9idWNrZXQoX194Ll9NX2J1Y2tldCkKKwl7CisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyBEUiA0MDguIElzIHZlY3RvcjxyZXZlcnNlX2l0ZXJhdG9yPGNoYXIqPiA+IGZvcmJpZGRlbj8KKwkgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghX194Ll9NX3Npbmd1bGFyKCkKKwkJCQl8fCBfX3guYmFzZSgpID09IF9JdGVyYXRvcigpLAorCQkJCV9NX21lc3NhZ2UoX19tc2dfaW5pdF9jb25zdF9zaW5ndWxhcikKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikKKwkJCQkuX01faXRlcmF0b3IoX194LCAib3RoZXIiKSk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5IGFzc2lnbm1lbnQuCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2xvY2FsX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yJiBfX3gpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIERSIDQwOC4gSXMgdmVjdG9yPHJldmVyc2VfaXRlcmF0b3I8Y2hhcio+ID4gZm9yYmlkZGVuPworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSghX194Ll9NX3Npbmd1bGFyKCkKKwkJCSAgICAgIHx8IF9feC5fTV9jdXJyZW50ID09IF9JdGVyYXRvcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19jb3B5X3Npbmd1bGFyKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX194LCAib3RoZXIiKSk7CisJX01fY3VycmVudCA9IF9feC5fTV9jdXJyZW50OworCV9NX2J1Y2tldCA9IF9feC5fTV9idWNrZXQ7CisJdGhpcy0+X01fYXR0YWNoKF9feC5fTV9zZXF1ZW5jZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSXRlcmF0b3IgZGVyZWZlcmVuY2UuCisgICAgICAgKiAgQHByZSBpdGVyYXRvciBpcyBkZXJlZmVyZW5jZWFibGUKKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9kZXJlZmVyZW5jZWFibGUoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfYmFkX2RlcmVmKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsKKwlyZXR1cm4gKl9NX2N1cnJlbnQ7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJdGVyYXRvciBkZXJlZmVyZW5jZS4KKyAgICAgICAqICBAcHJlIGl0ZXJhdG9yIGlzIGRlcmVmZXJlbmNlYWJsZQorICAgICAgICogIEB0b2RvIE1ha2UgdGhpcyBjb3JyZWN0IHcuci50LiBpdGVyYXRvcnMgdGhhdCByZXR1cm4gcHJveGllcworICAgICAgICogIEB0b2RvIFVzZSBhZGRyZXNzb2YoKSBpbnN0ZWFkIG9mICYgb3BlcmF0b3IKKyAgICAgICAqLworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKHRoaXMtPl9NX2RlcmVmZXJlbmNlYWJsZSgpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19iYWRfZGVyZWYpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikpOworCXJldHVybiAmKl9NX2N1cnJlbnQ7CisgICAgICB9CisKKyAgICAgIC8vIC0tLS0tLSBJbnB1dCBpdGVyYXRvciByZXF1aXJlbWVudHMgLS0tLS0tCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSXRlcmF0b3IgcHJlaW5jcmVtZW50CisgICAgICAgKiAgQHByZSBpdGVyYXRvciBpcyBpbmNyZW1lbnRhYmxlCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2xvY2FsX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKHRoaXMtPl9NX2luY3JlbWVudGFibGUoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfYmFkX2luYykKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKSk7CisJKytfTV9jdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEl0ZXJhdG9yIHBvc3RpbmNyZW1lbnQKKyAgICAgICAqICBAcHJlIGl0ZXJhdG9yIGlzIGluY3JlbWVudGFibGUKKyAgICAgICAqLworICAgICAgX1NhZmVfbG9jYWxfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9pbmNyZW1lbnRhYmxlKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2JhZF9pbmMpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikpOworCV9TYWZlX2xvY2FsX2l0ZXJhdG9yIF9fdG1wKCp0aGlzKTsKKwkrK19NX2N1cnJlbnQ7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICAvLyAtLS0tLS0gVXRpbGl0aWVzIC0tLS0tLQorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yCisgICAgICAgKi8KKyAgICAgIF9JdGVyYXRvcgorICAgICAgYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBidWNrZXQKKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXQoKSBjb25zdCB7IHJldHVybiBfTV9idWNrZXQ7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29udmVyc2lvbiB0byB1bmRlcmx5aW5nIG5vbi1kZWJ1ZyBpdGVyYXRvciB0byBhbGxvdworICAgICAgICogYmV0dGVyIGludGVyYWN0aW9uIHdpdGggbm9uLWRlYnVnIGNvbnRhaW5lcnMuCisgICAgICAgKi8KKyAgICAgIG9wZXJhdG9yIF9JdGVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgLyoqIEF0dGFjaCBpdGVyYXRvciB0byB0aGUgZ2l2ZW4gc2VxdWVuY2UuICovCisgICAgICB2b2lkCisgICAgICBfTV9hdHRhY2goX1NhZmVfc2VxdWVuY2VfYmFzZSogX19zZXEpCisgICAgICB7IF9TYWZlX2l0ZXJhdG9yX2Jhc2U6Ol9NX2F0dGFjaChfX3NlcSwgX01fY29uc3RhbnQoKSk7IH0KKworICAgICAgLyoqIExpa2V3aXNlLCBidXQgbm90IHRocmVhZC1zYWZlLiAqLworICAgICAgdm9pZAorICAgICAgX01fYXR0YWNoX3NpbmdsZShfU2FmZV9zZXF1ZW5jZV9iYXNlKiBfX3NlcSkKKyAgICAgIHsgX1NhZmVfaXRlcmF0b3JfYmFzZTo6X01fYXR0YWNoX3NpbmdsZShfX3NlcSwgX01fY29uc3RhbnQoKSk7IH0KKworICAgICAgLy8vIElzIHRoZSBpdGVyYXRvciBkZXJlZmVyZW5jZWFibGU/CisgICAgICBib29sCisgICAgICBfTV9kZXJlZmVyZW5jZWFibGUoKSBjb25zdAorICAgICAgeyByZXR1cm4gIXRoaXMtPl9NX3Npbmd1bGFyKCkgJiYgIV9NX2lzX2VuZCgpOyB9CisKKyAgICAgIC8vLyBJcyB0aGUgaXRlcmF0b3IgaW5jcmVtZW50YWJsZT8KKyAgICAgIGJvb2wKKyAgICAgIF9NX2luY3JlbWVudGFibGUoKSBjb25zdAorICAgICAgeyByZXR1cm4gIXRoaXMtPl9NX3Npbmd1bGFyKCkgJiYgIV9NX2lzX2VuZCgpOyB9CisKKyAgICAgIC8vIElzIHRoZSBpdGVyYXRvciByYW5nZSBbKnRoaXMsIF9fcmhzKSB2YWxpZD8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdGhlcj4KKwlib29sCisJX01fdmFsaWRfcmFuZ2UoY29uc3QgX1NhZmVfbG9jYWxfaXRlcmF0b3I8X090aGVyLAorCQkJCQkJICBfU2VxdWVuY2U+JiBfX3JocykgY29uc3Q7CisKKyAgICAgIC8vIFRoZSBzZXF1ZW5jZSB0aGlzIGl0ZXJhdG9yIHJlZmVyZW5jZXMuCisgICAgICBjb25zdCBfU2VxdWVuY2UqCisgICAgICBfTV9nZXRfc2VxdWVuY2UoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX1NlcXVlbmNlKj4oX01fc2VxdWVuY2UpOyB9CisKKyAgICAgIC8vLyBJcyB0aGlzIGl0ZXJhdG9yIGVxdWFsIHRvIHRoZSBzZXF1ZW5jZSdzIGJlZ2luKCkgaXRlcmF0b3I/CisgICAgICBib29sIF9NX2lzX2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGJhc2UoKSA9PSBfTV9nZXRfc2VxdWVuY2UoKS0+X01fYmFzZSgpLmJlZ2luKF9NX2J1Y2tldCk7IH0KKworICAgICAgLy8vIElzIHRoaXMgaXRlcmF0b3IgZXF1YWwgdG8gdGhlIHNlcXVlbmNlJ3MgZW5kKCkgaXRlcmF0b3I/CisgICAgICBib29sIF9NX2lzX2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBiYXNlKCkgPT0gX01fZ2V0X3NlcXVlbmNlKCktPl9NX2Jhc2UoKS5lbmQoX01fYnVja2V0KTsgfQorCisgICAgICAvLy8gSXMgdGhpcyBpdGVyYXRvciBwYXJ0IG9mIHRoZSBzYW1lIGJ1Y2tldCBhcyB0aGUgb3RoZXIgb25lPworICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9PdGhlcj4KKwlib29sIF9NX2luX3NhbWVfYnVja2V0KGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9PdGhlciwKKwkJCQkJCV9TZXF1ZW5jZT4mIF9fb3RoZXIpIGNvbnN0CisJeyByZXR1cm4gX01fYnVja2V0ID09IF9fb3RoZXIuYnVja2V0KCk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1NhZmVfbG9jYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9jb21wYXJlX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19jb21wYXJlX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19jb21wYXJlX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9pbl9zYW1lX2J1Y2tldChfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19sb2NhbF9pdGVyX2NvbXBhcmVfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSA9PSBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9jb21wYXJlX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19jb21wYXJlX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9pbl9zYW1lX2J1Y2tldChfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19sb2NhbF9pdGVyX2NvbXBhcmVfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSA9PSBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX1NhZmVfbG9jYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9jb21wYXJlX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19jb21wYXJlX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9pbl9zYW1lX2J1Y2tldChfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19sb2NhbF9pdGVyX2NvbXBhcmVfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSAhPSBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9jb21wYXJlX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19jb21wYXJlX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9pbl9zYW1lX2J1Y2tldChfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19sb2NhbF9pdGVyX2NvbXBhcmVfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSAhPSBfX3Jocy5iYXNlKCk7CisgICAgfQorfSAvLyBuYW1lc3BhY2UgX19nbnVfZGVidWcKKworI2luY2x1ZGUgPGRlYnVnL3NhZmVfbG9jYWxfaXRlcmF0b3IudGNjPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9sb2NhbF9pdGVyYXRvci50Y2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfbG9jYWxfaXRlcmF0b3IudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzk3MWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfbG9jYWxfaXRlcmF0b3IudGNjCkBAIC0wLDAgKzEsNzUgQEAKKy8vIERlYnVnZ2luZyBpdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAob3V0IG9mIGxpbmUpIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9zYWZlX2xvY2FsX2l0ZXJhdG9yLnRjYworICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfU0FGRV9MT0NBTF9JVEVSQVRPUl9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfU0FGRV9MT0NBTF9JVEVSQVRPUl9UQ0MgMQorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX090aGVyPgorICAgICAgYm9vbAorICAgICAgX1NhZmVfbG9jYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+OjoKKyAgICAgIF9NX3ZhbGlkX3JhbmdlKGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9PdGhlciwgX1NlcXVlbmNlPiYgX19yaHMpIGNvbnN0CisgICAgICB7CisJaWYgKCFfTV9jYW5fY29tcGFyZShfX3JocykpCisJICByZXR1cm4gZmFsc2U7CisJaWYgKF9NX2J1Y2tldCAhPSBfX3Jocy5fTV9idWNrZXQpCisJICByZXR1cm4gZmFsc2U7CisKKwkvKiBEZXRlcm1pbmUgaWYgd2UgY2FuIG9yZGVyIHRoZSBpdGVyYXRvcnMgd2l0aG91dCB0aGUgaGVscCBvZgorCSAgIHRoZSBjb250YWluZXIgKi8KKwlzdGQ6OnBhaXI8ZGlmZmVyZW5jZV90eXBlLCBfRGlzdGFuY2VfcHJlY2lzaW9uPiBfX2Rpc3QgPQorCSAgX19nZXRfZGlzdGFuY2UoYmFzZSgpLCBfX3Jocy5iYXNlKCkpOworCXN3aXRjaCAoX19kaXN0LnNlY29uZCkKKwl7CisJY2FzZSBfX2RwX2VxdWFsaXR5OgorCSAgaWYgKF9fZGlzdC5maXJzdCA9PSAwKQorCSAgICByZXR1cm4gdHJ1ZTsKKwkgIGJyZWFrOworCisJY2FzZSBfX2RwX3NpZ246CisJY2FzZSBfX2RwX2V4YWN0OgorCSAgcmV0dXJuIF9fZGlzdC5maXJzdCA+PSAwOworCX0KKworCS8qIFdlIGNhbiBvbmx5IHRlc3QgZm9yIGVxdWFsaXR5LCBidXQgY2hlY2sgaWYgb25lIG9mIHRoZQorCSAgIGl0ZXJhdG9ycyBpcyBhdCBhbiBleHRyZW1lLiAqLworCS8qIE9wdGltIGZvciBjbGFzc2ljIFtiZWdpbiwgaXQpIG9yIFtpdCwgZW5kKSByYW5nZXMsIGxpbWl0IGNoZWNrcworCSAqIHdoZW4gY29kZSBpcyB2YWxpZC4gKi8KKwlpZiAoX01faXNfYmVnaW4oKSB8fCBfX3Jocy5fTV9pc19lbmQoKSkKKwkgIHJldHVybiB0cnVlOworCWlmIChfTV9pc19lbmQoKSB8fCBfX3Jocy5fTV9pc19iZWdpbigpKQorCSAgcmV0dXJuIGZhbHNlOworCisJLy8gQXNzdW1lIHRoYXQgdGhpcyBpcyBhIHZhbGlkIHJhbmdlOyB3ZSBjYW4ndCBjaGVjayBhbnl0aGluZyBlbHNlCisJcmV0dXJuIHRydWU7CisgICAgICB9Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9zZXF1ZW5jZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX3NlcXVlbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1N2VkZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9zZXF1ZW5jZS5oCkBAIC0wLDAgKzEsMTM0IEBACisvLyBTYWZlIHNlcXVlbmNlIGltcGxlbWVudGF0aW9uICAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvc2FmZV9zZXF1ZW5jZS5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19TQUZFX1NFUVVFTkNFX0gKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfU0FGRV9TRVFVRU5DRV9IIDEKKworI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8ZGVidWcvbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGVidWcvZnVuY3Rpb25zLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9iYXNlLmg+CisKK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBjbGFzcyBfU2FmZV9pdGVyYXRvcjsKKworICAvKiogQSBzaW1wbGUgZnVuY3Rpb24gb2JqZWN0IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQtaW4KKyAgICogIHZhbHVlIGlzIG5vdCBlcXVhbCB0byB0aGUgc3RvcmVkIHZhbHVlLiBJdCBzYXZlcyB0eXBpbmcgb3ZlcgorICAgKiAgdXNpbmcgYm90aCBiaW5kMXN0IGFuZCBub3RfZXF1YWwuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHlwZT4KKyAgICBjbGFzcyBfTm90X2VxdWFsX3RvCisgICAgeworICAgICAgX1R5cGUgX192YWx1ZTsKKworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0IF9Ob3RfZXF1YWxfdG8oY29uc3QgX1R5cGUmIF9fdikgOiBfX3ZhbHVlKF9fdikgeyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fdmFsdWUgIT0gX194OyB9CisgICAgfTsKKworICAvKiogQSBzaW1wbGUgZnVuY3Rpb24gb2JqZWN0IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQtaW4KKyAgICogIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBzdG9yZWQgdmFsdWUuICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHlwZT4KKyAgICBjbGFzcyBfRXF1YWxfdG8KKyAgICB7CisgICAgICBfVHlwZSBfX3ZhbHVlOworCisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQgX0VxdWFsX3RvKGNvbnN0IF9UeXBlJiBfX3YpIDogX192YWx1ZShfX3YpIHsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UeXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ZhbHVlID09IF9feDsgfQorICAgIH07CisKKyAgLyoqIEEgZnVuY3Rpb24gb2JqZWN0IHRoYXQgcmV0dXJucyB0cnVlIHdoZW4gdGhlIGdpdmVuIHJhbmRvbSBhY2Nlc3MKKyAgICAgIGl0ZXJhdG9yIGlzIGF0IGxlYXN0IEBjIG4gc3RlcHMgYXdheSBmcm9tIHRoZSBnaXZlbiBpdGVyYXRvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGNsYXNzIF9BZnRlcl9udGhfZnJvbQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIF9JdGVyYXRvciBfTV9iYXNlOworICAgICAgZGlmZmVyZW5jZV90eXBlIF9NX247CisKKyAgICBwdWJsaWM6CisgICAgICBfQWZ0ZXJfbnRoX2Zyb20oY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24sIGNvbnN0IF9JdGVyYXRvciYgX19iYXNlKQorICAgICAgOiBfTV9iYXNlKF9fYmFzZSksIF9NX24oX19uKSB7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfSXRlcmF0b3ImIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAtIF9NX2Jhc2UgPj0gX01fbjsgfQorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBCYXNlIGNsYXNzIGZvciBjb25zdHJ1Y3RpbmcgYSBAYSBzYWZlIHNlcXVlbmNlIHR5cGUgdGhhdAorICAgKiB0cmFja3MgaXRlcmF0b3JzIHRoYXQgcmVmZXJlbmNlIGl0LgorICAgKgorICAgKiBUaGUgY2xhc3MgdGVtcGxhdGUgJV9TYWZlX3NlcXVlbmNlIHNpbXBsaWZpZXMgdGhlIGNvbnN0cnVjdGlvbiBvZgorICAgKiBAYSBzYWZlIHNlcXVlbmNlcyB0aGF0IHRyYWNrIHRoZSBpdGVyYXRvcnMgdGhhdCByZWZlcmVuY2UgdGhlCisgICAqIHNlcXVlbmNlLCBzbyB0aGF0IHRoZSBpdGVyYXRvcnMgYXJlIG5vdGlmaWVkIG9mIGNoYW5nZXMgaW4gdGhlCisgICAqIHNlcXVlbmNlIHRoYXQgbWF5IGFmZmVjdCB0aGVpciBvcGVyYXRpb24sIGUuZy4sIGlmIHRoZSBjb250YWluZXIKKyAgICogaW52YWxpZGF0ZXMgaXRzIGl0ZXJhdG9ycyBvciBpcyBkZXN0cnVjdGVkLiBUaGlzIGNsYXNzIHRlbXBsYXRlCisgICAqIG1heSBvbmx5IGJlIHVzZWQgYnkgZGVyaXZpbmcgZnJvbSBpdCBhbmQgcGFzc2luZyB0aGUgbmFtZSBvZiB0aGUKKyAgICogZGVyaXZlZCBjbGFzcyBhcyBpdHMgdGVtcGxhdGUgcGFyYW1ldGVyIHZpYSB0aGUgY3VyaW91c2x5CisgICAqIHJlY3VycmluZyB0ZW1wbGF0ZSBwYXR0ZXJuLiBUaGUgZGVyaXZlZCBjbGFzcyBtdXN0IGhhdmUgQGMKKyAgICogaXRlcmF0b3IgYW5kIEBjIGNvbnN0X2l0ZXJhdG9yIHR5cGVzIHRoYXQgYXJlIGluc3RhbnRpYXRpb25zIG9mCisgICAqIGNsYXNzIHRlbXBsYXRlIF9TYWZlX2l0ZXJhdG9yIGZvciB0aGlzIHNlcXVlbmNlLiBJdGVyYXRvcnMgd2lsbAorICAgKiB0aGVuIGJlIHRyYWNrZWQgYXV0b21hdGljYWxseS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBjbGFzcyBfU2FmZV9zZXF1ZW5jZSA6IHB1YmxpYyBfU2FmZV9zZXF1ZW5jZV9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBJbnZhbGlkYXRlcyBhbGwgaXRlcmF0b3JzIEBjIHggdGhhdCByZWZlcmVuY2UgdGhpcyBzZXF1ZW5jZSwKKwkgIGFyZSBub3Qgc2luZ3VsYXIsIGFuZCBmb3Igd2hpY2ggQGMgX19wcmVkKHgpIHJldHVybnMgQGMKKwkgIHRydWUuIEBjIF9fcHJlZCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgbm9ybWFsIGl0ZXJhdG9ycyBuZXN0ZWQKKwkgIGluIHRoZSBzYWZlIG9uZXMuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2ludmFsaWRhdGVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpOworCisgICAgICAvKiogVHJhbnNmZXJzIGFsbCBpdGVyYXRvcnMgQGMgeCB0aGF0IHJlZmVyZW5jZSBAYyBmcm9tIHNlcXVlbmNlLAorCSAgYXJlIG5vdCBzaW5ndWxhciwgYW5kIGZvciB3aGljaCBAYyBfX3ByZWQoeCkgcmV0dXJucyBAYworCSAgdHJ1ZS4gQGMgX19wcmVkIHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBub3JtYWwgaXRlcmF0b3JzIG5lc3RlZAorCSAgaW4gdGhlIHNhZmUgb25lcy4gKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fdHJhbnNmZXJfZnJvbV9pZihfU2FmZV9zZXF1ZW5jZSYgX19mcm9tLCBfUHJlZGljYXRlIF9fcHJlZCk7CisgICAgfTsKK30gLy8gbmFtZXNwYWNlIF9fZ251X2RlYnVnCisKKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLnRjYz4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfc2VxdWVuY2UudGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX3NlcXVlbmNlLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmY4NzQwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX3NlcXVlbmNlLnRjYwpAQCAtMCwwICsxLDE1MCBAQAorLy8gU2FmZSBzZXF1ZW5jZSBpbXBsZW1lbnRhdGlvbiAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3NhZmVfc2VxdWVuY2UudGNjCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19TQUZFX1NFUVVFTkNFX1RDQworI2RlZmluZSBfR0xJQkNYWF9ERUJVR19TQUZFX1NFUVVFTkNFX1RDQyAxCisKK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgIHZvaWQKKyAgICAgIF9TYWZlX3NlcXVlbmNlPF9TZXF1ZW5jZT46OgorICAgICAgX01faW52YWxpZGF0ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkKKyAgICAgIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKwlfX2dudV9jeHg6Ol9fc2NvcGVkX2xvY2sgc2VudHJ5KHRoaXMtPl9NX2dldF9tdXRleCgpKTsKKyAgICAgICAgZm9yIChfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0ZXIgPSBfTV9pdGVyYXRvcnM7IF9faXRlcjspCisJICB7CisJICAgIGl0ZXJhdG9yKiBfX3ZpY3RpbSA9IHN0YXRpY19jYXN0PGl0ZXJhdG9yKj4oX19pdGVyKTsKKwkgICAgX19pdGVyID0gX19pdGVyLT5fTV9uZXh0OworCSAgICBpZiAoIV9fdmljdGltLT5fTV9zaW5ndWxhcigpICYmIF9fcHJlZChfX3ZpY3RpbS0+YmFzZSgpKSkKKwkgICAgICB7CisJCV9fdmljdGltLT5fTV9pbnZhbGlkYXRlKCk7CisJICAgICAgfQorCSAgfQorCisgICAgICAgIGZvciAoX1NhZmVfaXRlcmF0b3JfYmFzZSogX19pdGVyMiA9IF9NX2NvbnN0X2l0ZXJhdG9yczsgX19pdGVyMjspCisJICB7CisJICAgIGNvbnN0X2l0ZXJhdG9yKiBfX3ZpY3RpbSA9IHN0YXRpY19jYXN0PGNvbnN0X2l0ZXJhdG9yKj4oX19pdGVyMik7CisJICAgIF9faXRlcjIgPSBfX2l0ZXIyLT5fTV9uZXh0OworCSAgICBpZiAoIV9fdmljdGltLT5fTV9zaW5ndWxhcigpICYmIF9fcHJlZChfX3ZpY3RpbS0+YmFzZSgpKSkKKwkgICAgICB7CisJCV9fdmljdGltLT5fTV9pbnZhbGlkYXRlKCk7CisJICAgICAgfQorCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgdm9pZAorICAgICAgX1NhZmVfc2VxdWVuY2U8X1NlcXVlbmNlPjo6CisgICAgICBfTV90cmFuc2Zlcl9mcm9tX2lmKF9TYWZlX3NlcXVlbmNlJiBfX2Zyb20sIF9QcmVkaWNhdGUgX19wcmVkKQorICAgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworCV9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9fdHJhbnNmZXJlZF9pdGVyYXRvcnMgPSAwOworCV9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9fdHJhbnNmZXJlZF9jb25zdF9pdGVyYXRvcnMgPSAwOworCV9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9fbGFzdF9pdGVyYXRvciA9IDA7CisJX1NhZmVfaXRlcmF0b3JfYmFzZSogX19sYXN0X2NvbnN0X2l0ZXJhdG9yID0gMDsKKwl7CisJICAvLyBXZSBsb2NrIF9fZnJvbSBmaXJzdCBhbmQgZGV0YWNoIGl0ZXJhdG9yKHMpIHRvIHRyYW5zZmVyCisJICBfX2dudV9jeHg6Ol9fc2NvcGVkX2xvY2sgc2VudHJ5KF9fZnJvbS5fTV9nZXRfbXV0ZXgoKSk7CisKKyAgICAgICAgICBmb3IgKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXRlciA9IF9fZnJvbS5fTV9pdGVyYXRvcnM7IF9faXRlcjspCisJICAgIHsKKwkgICAgICBpdGVyYXRvciogX192aWN0aW0gPSBzdGF0aWNfY2FzdDxpdGVyYXRvcio+KF9faXRlcik7CisJICAgICAgX19pdGVyID0gX19pdGVyLT5fTV9uZXh0OworCSAgICAgIGlmICghX192aWN0aW0tPl9NX3Npbmd1bGFyKCkgJiYgX19wcmVkKF9fdmljdGltLT5iYXNlKCkpKQorCQl7CisJCSAgX192aWN0aW0tPl9NX2RldGFjaF9zaW5nbGUoKTsKKwkJICBpZiAoX190cmFuc2ZlcmVkX2l0ZXJhdG9ycykKKwkJICAgIHsKKwkJICAgICAgX192aWN0aW0tPl9NX25leHQgPSBfX3RyYW5zZmVyZWRfaXRlcmF0b3JzOworCQkgICAgICBfX3RyYW5zZmVyZWRfaXRlcmF0b3JzLT5fTV9wcmlvciA9IF9fdmljdGltOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIF9fbGFzdF9pdGVyYXRvciA9IF9fdmljdGltOworCQkgIF9fdmljdGltLT5fTV9zZXF1ZW5jZSA9IHRoaXM7CisJCSAgX192aWN0aW0tPl9NX3ZlcnNpb24gPSB0aGlzLT5fTV92ZXJzaW9uOworCQkgIF9fdHJhbnNmZXJlZF9pdGVyYXRvcnMgPSBfX3ZpY3RpbTsKKwkJfQorCSAgICB9CisKKwkgIGZvciAoX1NhZmVfaXRlcmF0b3JfYmFzZSogX19pdGVyMiA9IF9fZnJvbS5fTV9jb25zdF9pdGVyYXRvcnM7CisJCSBfX2l0ZXIyOykKKwkgICAgeworCSAgICAgIGNvbnN0X2l0ZXJhdG9yKiBfX3ZpY3RpbSA9IHN0YXRpY19jYXN0PGNvbnN0X2l0ZXJhdG9yKj4oX19pdGVyMik7CisJICAgICAgX19pdGVyMiA9IF9faXRlcjItPl9NX25leHQ7CisJICAgICAgaWYgKCFfX3ZpY3RpbS0+X01fc2luZ3VsYXIoKSAmJiBfX3ByZWQoX192aWN0aW0tPmJhc2UoKSkpCisJCXsKKwkJICBfX3ZpY3RpbS0+X01fZGV0YWNoX3NpbmdsZSgpOworCQkgIGlmIChfX3RyYW5zZmVyZWRfY29uc3RfaXRlcmF0b3JzKQorCQkgICAgeworCQkgICAgICBfX3ZpY3RpbS0+X01fbmV4dCA9IF9fdHJhbnNmZXJlZF9jb25zdF9pdGVyYXRvcnM7CisJCSAgICAgIF9fdHJhbnNmZXJlZF9jb25zdF9pdGVyYXRvcnMtPl9NX3ByaW9yID0gX192aWN0aW07CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgX19sYXN0X2NvbnN0X2l0ZXJhdG9yID0gX192aWN0aW07CisJCSAgX192aWN0aW0tPl9NX3NlcXVlbmNlID0gdGhpczsKKwkJICBfX3ZpY3RpbS0+X01fdmVyc2lvbiA9IHRoaXMtPl9NX3ZlcnNpb247CisJCSAgX190cmFuc2ZlcmVkX2NvbnN0X2l0ZXJhdG9ycyA9IF9fdmljdGltOworCQl9CisJICAgIH0KKwl9CisKKwkvLyBOb3cgd2UgY2FuIGxvY2sgKnRoaXMgYW5kIGFkZCB0aGUgdHJhbnNmZXJlZCBpdGVyYXRvcnMgaWYgYW55CisJaWYgKF9fbGFzdF9pdGVyYXRvciB8fCBfX2xhc3RfY29uc3RfaXRlcmF0b3IpCisJICB7CisJICAgIF9fZ251X2N4eDo6X19zY29wZWRfbG9jayBzZW50cnkodGhpcy0+X01fZ2V0X211dGV4KCkpOworCSAgICBpZiAoX19sYXN0X2l0ZXJhdG9yKQorCSAgICAgIHsKKwkJaWYgKHRoaXMtPl9NX2l0ZXJhdG9ycykKKwkJICB7CisJCSAgICB0aGlzLT5fTV9pdGVyYXRvcnMtPl9NX3ByaW9yID0gX19sYXN0X2l0ZXJhdG9yOworCQkgICAgX19sYXN0X2l0ZXJhdG9yLT5fTV9uZXh0ID0gdGhpcy0+X01faXRlcmF0b3JzOworCQkgIH0KKwkJdGhpcy0+X01faXRlcmF0b3JzID0gX190cmFuc2ZlcmVkX2l0ZXJhdG9yczsKKwkgICAgICB9CisJICAgIGlmIChfX2xhc3RfY29uc3RfaXRlcmF0b3IpCisJICAgICAgeworCQlpZiAodGhpcy0+X01fY29uc3RfaXRlcmF0b3JzKQorCQkgIHsKKwkJICAgIHRoaXMtPl9NX2NvbnN0X2l0ZXJhdG9ycy0+X01fcHJpb3IgPSBfX2xhc3RfY29uc3RfaXRlcmF0b3I7CisJCSAgICBfX2xhc3RfY29uc3RfaXRlcmF0b3ItPl9NX25leHQgPSB0aGlzLT5fTV9jb25zdF9pdGVyYXRvcnM7CisJCSAgfQorCQl0aGlzLT5fTV9jb25zdF9pdGVyYXRvcnMgPSBfX3RyYW5zZmVyZWRfY29uc3RfaXRlcmF0b3JzOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KK30gLy8gbmFtZXNwYWNlIF9fZ251X2RlYnVnCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX3Vub3JkZXJlZF9iYXNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfdW5vcmRlcmVkX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWNlMDhiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX3Vub3JkZXJlZF9iYXNlLmgKQEAgLTAsMCArMSwxODUgQEAKKy8vIFNhZmUgY29udGFpbmVyL2l0ZXJhdG9yIGJhc2UgaW1wbGVtZW50YXRpb24gIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9zYWZlX3Vub3JkZXJlZF9iYXNlLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1NBRkVfVU5PUkRFUkVEX0JBU0VfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19TQUZFX1VOT1JERVJFRF9CQVNFX0ggMQorCisjaW5jbHVkZSA8ZGVidWcvc2FmZV9iYXNlLmg+CisKK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICBjbGFzcyBfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyX2Jhc2U7CisKKyAgLyoqIFxicmllZiBCYXNpYyBmdW5jdGlvbmFsaXR5IGZvciBhIEBhIHNhZmUgaXRlcmF0b3IuCisgICAqCisgICAqICBUaGUgJV9TYWZlX2xvY2FsX2l0ZXJhdG9yX2Jhc2UgYmFzZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbmFsaXR5CisgICAqICBvZiBhIHNhZmUgbG9jYWwgaXRlcmF0b3IgdGhhdCBpcyBub3Qgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGl0ZXJhdG9yCisgICAqICB0eXBlLiBJdCBjb250YWlucyBhIHBvaW50ZXIgYmFjayB0byB0aGUgY29udGFpbmVyIGl0IHJlZmVyZW5jZXMKKyAgICogIGFsb25nIHdpdGggaXRlcmF0b3IgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgcG9pbnRlcnMgdG8gZm9ybSBhCisgICAqICBkb3VibHktbGlua2VkIGxpc3Qgb2YgbG9jYWwgaXRlcmF0b3JzIHJlZmVyZW5jZWQgYnkgdGhlIGNvbnRhaW5lci4KKyAgICoKKyAgICogIFRoaXMgY2xhc3MgbXVzdCBub3QgcGVyZm9ybSBhbnkgb3BlcmF0aW9ucyB0aGF0IGNhbiB0aHJvdyBhbgorICAgKiAgZXhjZXB0aW9uLCBvciB0aGUgZXhjZXB0aW9uIGd1YXJhbnRlZXMgb2YgZGVyaXZlZCBpdGVyYXRvcnMgd2lsbAorICAgKiAgYmUgYnJva2VuLgorICAgKi8KKyAgY2xhc3MgX1NhZmVfbG9jYWxfaXRlcmF0b3JfYmFzZSA6IHB1YmxpYyBfU2FmZV9pdGVyYXRvcl9iYXNlCisgIHsKKyAgcHJvdGVjdGVkOgorICAgIC8qKiBJbml0aWFsaXplcyB0aGUgaXRlcmF0b3IgYW5kIG1ha2VzIGl0IHNpbmd1bGFyLiAqLworICAgIF9TYWZlX2xvY2FsX2l0ZXJhdG9yX2Jhc2UoKQorICAgIHsgfQorCisgICAgLyoqIEluaXRpYWxpemUgdGhlIGl0ZXJhdG9yIHRvIHJlZmVyZW5jZSB0aGUgY29udGFpbmVyIHBvaW50ZWQgdG8KKyAgICAgKiAgYnkgQHAgX19zZXEuIEBwIF9fY29uc3RhbnQgaXMgdHJ1ZSB3aGVuIHdlIGFyZSBpbml0aWFsaXppbmcgYQorICAgICAqICBjb25zdGFudCBsb2NhbCBpdGVyYXRvciwgYW5kIGZhbHNlIGlmIGl0IGlzIGEgbXV0YWJsZSBsb2NhbCBpdGVyYXRvci4KKyAgICAgKiAgTm90ZSB0aGF0IEBwIF9fc2VxIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIHRoZSBpdGVyYXRvciB3aWxsIGJlCisgICAgICogIHNpbmd1bGFyLiBPdGhlcndpc2UsIHRoZSBpdGVyYXRvciB3aWxsIHJlZmVyZW5jZSBAcCBfX3NlcSBhbmQKKyAgICAgKiAgYmUgbm9uc2luZ3VsYXIuCisgICAgICovCisgICAgX1NhZmVfbG9jYWxfaXRlcmF0b3JfYmFzZShjb25zdCBfU2FmZV9zZXF1ZW5jZV9iYXNlKiBfX3NlcSwgYm9vbCBfX2NvbnN0YW50KQorICAgIHsgdGhpcy0+X01fYXR0YWNoKGNvbnN0X2Nhc3Q8X1NhZmVfc2VxdWVuY2VfYmFzZSo+KF9fc2VxKSwgX19jb25zdGFudCk7IH0KKworICAgIC8qKiBJbml0aWFsaXplcyB0aGUgaXRlcmF0b3IgdG8gcmVmZXJlbmNlIHRoZSBzYW1lIGNvbnRhaW5lciB0aGF0CisJQHAgX194IGRvZXMuIEBwIF9fY29uc3RhbnQgaXMgdHJ1ZSBpZiB0aGlzIGlzIGEgY29uc3RhbnQKKwlpdGVyYXRvciwgYW5kIGZhbHNlIGlmIGl0IGlzIG11dGFibGUuICovCisgICAgX1NhZmVfbG9jYWxfaXRlcmF0b3JfYmFzZShjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvcl9iYXNlJiBfX3gsCisJCQkgICAgICBib29sIF9fY29uc3RhbnQpCisgICAgeyB0aGlzLT5fTV9hdHRhY2goX194Ll9NX3NlcXVlbmNlLCBfX2NvbnN0YW50KTsgfQorCisgICAgX1NhZmVfbG9jYWxfaXRlcmF0b3JfYmFzZSYKKyAgICBvcGVyYXRvcj0oY29uc3QgX1NhZmVfbG9jYWxfaXRlcmF0b3JfYmFzZSYpOworCisgICAgZXhwbGljaXQKKyAgICBfU2FmZV9sb2NhbF9pdGVyYXRvcl9iYXNlKGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yX2Jhc2UmKTsKKworICAgIH5fU2FmZV9sb2NhbF9pdGVyYXRvcl9iYXNlKCkgeyB0aGlzLT5fTV9kZXRhY2goKTsgfQorCisgICAgX1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lcl9iYXNlKgorICAgIF9NX2dldF9jb250YWluZXIoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVDsKKworICBwdWJsaWM6CisgICAgLyoqIEF0dGFjaGVzIHRoaXMgaXRlcmF0b3IgdG8gdGhlIGdpdmVuIGNvbnRhaW5lciwgZGV0YWNoaW5nIGl0CisgICAgICoJZnJvbSB3aGF0ZXZlciBjb250YWluZXIgaXQgd2FzIGF0dGFjaGVkIHRvIG9yaWdpbmFsbHkuIElmIHRoZQorICAgICAqCW5ldyBjb250YWluZXIgaXMgdGhlIE5VTEwgcG9pbnRlciwgdGhlIGl0ZXJhdG9yIGlzIGxlZnQKKyAgICAgKgl1bmF0dGFjaGVkLgorICAgICAqLworICAgIHZvaWQgX01fYXR0YWNoKF9TYWZlX3NlcXVlbmNlX2Jhc2UqIF9fc2VxLCBib29sIF9fY29uc3RhbnQpOworCisgICAgLyoqIExpa2V3aXNlLCBidXQgbm90IHRocmVhZC1zYWZlLiAqLworICAgIHZvaWQgX01fYXR0YWNoX3NpbmdsZShfU2FmZV9zZXF1ZW5jZV9iYXNlKiBfX3NlcSwgYm9vbCBfX2NvbnN0YW50KSB0aHJvdyAoKTsKKworICAgIC8qKiBEZXRhY2ggdGhlIGl0ZXJhdG9yIGZvciB3aGF0ZXZlciBjb250YWluZXIgaXQgaXMgYXR0YWNoZWQgdG8sCisgICAgICoJaWYgYW55LgorICAgICovCisgICAgdm9pZCBfTV9kZXRhY2goKTsKKworICAgIC8qKiBMaWtld2lzZSwgYnV0IG5vdCB0aHJlYWQtc2FmZS4gKi8KKyAgICB2b2lkIF9NX2RldGFjaF9zaW5nbGUoKSB0aHJvdyAoKTsKKyAgfTsKKworICAvKioKKyAgICogQGJyaWVmIEJhc2UgY2xhc3MgdGhhdCBzdXBwb3J0cyB0cmFja2luZyBvZiBsb2NhbCBpdGVyYXRvcnMgdGhhdAorICAgKiByZWZlcmVuY2UgYW4gdW5vcmRlcmVkIGNvbnRhaW5lci4KKyAgICoKKyAgICogVGhlICVfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyX2Jhc2UgY2xhc3MgcHJvdmlkZXMgYmFzaWMgc3VwcG9ydCBmb3IKKyAgICogdHJhY2tpbmcgaXRlcmF0b3JzIGludG8gYW4gdW5vcmRlcmVkIGNvbnRhaW5lci4gQ29udGFpbmVycyB0aGF0IHRyYWNrCisgICAqIGl0ZXJhdG9ycyBtdXN0IGRlcml2ZWQgZnJvbSAlX1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lcl9iYXNlIHB1YmxpY2x5LCBzbworICAgKiB0aGF0IHNhZmUgaXRlcmF0b3JzICh3aGljaCBpbmhlcml0IF9TYWZlX2l0ZXJhdG9yX2Jhc2UpIGNhbgorICAgKiBhdHRhY2ggdG8gdGhlbS4gVGhpcyBjbGFzcyBjb250YWlucyBmb3VyIGxpbmtlZCBsaXN0cyBvZgorICAgKiBpdGVyYXRvcnMsIG9uZSBmb3IgY29uc3RhbnQgaXRlcmF0b3JzLCBvbmUgZm9yIG11dGFibGUKKyAgICogaXRlcmF0b3JzLCBvbmUgZm9yIGNvbnN0YW50IGxvY2FsIGl0ZXJhdG9ycywgb25lIGZvciBtdXRhYmxlIGxvY2FsCisgICAqIGl0ZXJhdG9ycyBhbmQgYSB2ZXJzaW9uIG51bWJlciB0aGF0IGFsbG93cyB2ZXJ5IGZhc3QKKyAgICogaW52YWxpZGF0aW9uIG9mIGFsbCBpdGVyYXRvcnMgdGhhdCByZWZlcmVuY2UgdGhlIGNvbnRhaW5lci4KKyAgICoKKyAgICogVGhpcyBjbGFzcyBtdXN0IGVuc3VyZSB0aGF0IG5vIG9wZXJhdGlvbiBvbiBpdCBtYXkgdGhyb3cgYW4KKyAgICogZXhjZXB0aW9uLCBvdGhlcndpc2UgQGEgc2FmZSBjb250YWluZXJzIG1heSBmYWlsIHRvIHByb3ZpZGUgdGhlCisgICAqIGV4Y2VwdGlvbi1zYWZldHkgZ3VhcmFudGVlcyByZXF1aXJlZCBieSB0aGUgQysrIHN0YW5kYXJkLgorICAgKi8KKyAgY2xhc3MgX1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lcl9iYXNlIDogcHVibGljIF9TYWZlX3NlcXVlbmNlX2Jhc2UKKyAgeworICAgIHR5cGVkZWYgX1NhZmVfc2VxdWVuY2VfYmFzZSBfQmFzZTsKKyAgcHVibGljOgorICAgIC8vLyBUaGUgbGlzdCBvZiBtdXRhYmxlIGxvY2FsIGl0ZXJhdG9ycyB0aGF0IHJlZmVyZW5jZSB0aGlzIGNvbnRhaW5lcgorICAgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9NX2xvY2FsX2l0ZXJhdG9yczsKKworICAgIC8vLyBUaGUgbGlzdCBvZiBjb25zdGFudCBsb2NhbCBpdGVyYXRvcnMgdGhhdCByZWZlcmVuY2UgdGhpcyBjb250YWluZXIKKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKiBfTV9jb25zdF9sb2NhbF9pdGVyYXRvcnM7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIEluaXRpYWxpemUgd2l0aCBhIHZlcnNpb24gbnVtYmVyIG9mIDEgYW5kIG5vIGl0ZXJhdG9ycworICAgIF9TYWZlX3Vub3JkZXJlZF9jb250YWluZXJfYmFzZSgpCisgICAgOiBfTV9sb2NhbF9pdGVyYXRvcnMobnVsbHB0ciksIF9NX2NvbnN0X2xvY2FsX2l0ZXJhdG9ycyhudWxscHRyKQorICAgIHsgfQorCisgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGEgdmVyc2lvbiBudW1iZXIgb2YgMSBhbmQgbm8gaXRlcmF0b3JzCisgICAgX1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lcl9iYXNlKGNvbnN0IF9TYWZlX3Vub3JkZXJlZF9jb250YWluZXJfYmFzZSYpCisgICAgbm9leGNlcHQKKyAgICA6IF9TYWZlX3Vub3JkZXJlZF9jb250YWluZXJfYmFzZSgpIHsgfQorCisgICAgX1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lcl9iYXNlKF9TYWZlX3Vub3JkZXJlZF9jb250YWluZXJfYmFzZSYmIF9feCkKKyAgICBub2V4Y2VwdAorICAgIDogX1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lcl9iYXNlKCkKKyAgICB7IHRoaXMtPl9NX3N3YXAoX194KTsgfQorCisgICAgLyoqIE5vdGlmeSBhbGwgaXRlcmF0b3JzIHRoYXQgcmVmZXJlbmNlIHRoaXMgY29udGFpbmVyIHRoYXQgdGhlCisJY29udGFpbmVyIGlzIGJlaW5nIGRlc3Ryb3llZC4gKi8KKyAgICB+X1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lcl9iYXNlKCkKKyAgICB7IHRoaXMtPl9NX2RldGFjaF9hbGwoKTsgfQorCisgICAgLyoqIERldGFjaCBhbGwgaXRlcmF0b3JzLCBsZWF2aW5nIHRoZW0gc2luZ3VsYXIuICovCisgICAgdm9pZAorICAgIF9NX2RldGFjaF9hbGwoKTsKKworICAgIC8qKiBTd2FwIHRoaXMgY29udGFpbmVyIHdpdGggdGhlIGdpdmVuIGNvbnRhaW5lci4gVGhpcyBvcGVyYXRpb24KKyAgICAgKiAgYWxzbyBzd2FwcyBvd25lcnNoaXAgb2YgdGhlIGl0ZXJhdG9ycywgc28gdGhhdCB3aGVuIHRoZQorICAgICAqICBvcGVyYXRpb24gaXMgY29tcGxldGUgYWxsIGl0ZXJhdG9ycyB0aGF0IG9yaWdpbmFsbHkgcmVmZXJlbmNlZAorICAgICAqICBvbmUgY29udGFpbmVyIG5vdyByZWZlcmVuY2UgdGhlIG90aGVyIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICB2b2lkCisgICAgX01fc3dhcChfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyX2Jhc2UmIF9feCk7CisKKyAgcHVibGljOgorICAgIC8qKiBBdHRhY2ggYW4gaXRlcmF0b3IgdG8gdGhpcyBjb250YWluZXIuICovCisgICAgdm9pZAorICAgIF9NX2F0dGFjaF9sb2NhbChfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0LCBib29sIF9fY29uc3RhbnQpOworCisgICAgLyoqIExpa2V3aXNlIGJ1dCBub3QgdGhyZWFkIHNhZmUuICovCisgICAgdm9pZAorICAgIF9NX2F0dGFjaF9sb2NhbF9zaW5nbGUoX1NhZmVfaXRlcmF0b3JfYmFzZSogX19pdCwgYm9vbCBfX2NvbnN0YW50KSB0aHJvdyAoKTsKKworICAgIC8qKiBEZXRhY2ggYW4gaXRlcmF0b3IgZnJvbSB0aGlzIGNvbnRhaW5lciAqLworICAgIHZvaWQKKyAgICBfTV9kZXRhY2hfbG9jYWwoX1NhZmVfaXRlcmF0b3JfYmFzZSogX19pdCk7CisKKyAgICAvKiogTGlrZXdpc2UgYnV0IG5vdCB0aHJlYWQgc2FmZS4gKi8KKyAgICB2b2lkCisgICAgX01fZGV0YWNoX2xvY2FsX3NpbmdsZShfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0KSB0aHJvdyAoKTsKKyAgfTsKK30gLy8gbmFtZXNwYWNlIF9fZ251X2RlYnVnCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX3Vub3JkZXJlZF9jb250YWluZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV91bm9yZGVyZWRfY29udGFpbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkzNDU0MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV91bm9yZGVyZWRfY29udGFpbmVyLmgKQEAgLTAsMCArMSw4MSBAQAorLy8gU2FmZSBjb250YWluZXIgaW1wbGVtZW50YXRpb24gIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9zYWZlX3Vub3JkZXJlZF9jb250YWluZXIuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfU0FGRV9VTk9SREVSRURfQ09OVEFJTkVSX0gKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfU0FGRV9VTk9SREVSRURfQ09OVEFJTkVSX0ggMQorCisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9tYWNyb3MuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9mdW5jdGlvbnMuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3Vub3JkZXJlZF9iYXNlLmg+CisKK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICAvKioKKyAgICogQGJyaWVmIEJhc2UgY2xhc3MgZm9yIGNvbnN0cnVjdGluZyBhIEBhIHNhZmUgdW5vcmRlcmVkIGNvbnRhaW5lciB0eXBlCisgICAqIHRoYXQgdHJhY2tzIGl0ZXJhdG9ycyB0aGF0IHJlZmVyZW5jZSBpdC4KKyAgICoKKyAgICogVGhlIGNsYXNzIHRlbXBsYXRlICVfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyIHNpbXBsaWZpZXMgdGhlCisgICAqIGNvbnN0cnVjdGlvbiBvZiBAYSBzYWZlIHVub3JkZXJlZCBjb250YWluZXJzIHRoYXQgdHJhY2sgdGhlIGl0ZXJhdG9ycworICAgKiB0aGF0IHJlZmVyZW5jZSB0aGUgY29udGFpbmVyLCBzbyB0aGF0IHRoZSBpdGVyYXRvcnMgYXJlIG5vdGlmaWVkIG9mCisgICAqIGNoYW5nZXMgaW4gdGhlIGNvbnRhaW5lciB0aGF0IG1heSBhZmZlY3QgdGhlaXIgb3BlcmF0aW9uLCBlLmcuLCBpZgorICAgKiB0aGUgY29udGFpbmVyIGludmFsaWRhdGVzIGl0cyBpdGVyYXRvcnMgb3IgaXMgZGVzdHJ1Y3RlZC4gVGhpcyBjbGFzcworICAgKiB0ZW1wbGF0ZSBtYXkgb25seSBiZSB1c2VkIGJ5IGRlcml2aW5nIGZyb20gaXQgYW5kIHBhc3NpbmcgdGhlIG5hbWUKKyAgICogb2YgdGhlIGRlcml2ZWQgY2xhc3MgYXMgaXRzIHRlbXBsYXRlIHBhcmFtZXRlciB2aWEgdGhlIGN1cmlvdXNseQorICAgKiByZWN1cnJpbmcgdGVtcGxhdGUgcGF0dGVybi4gVGhlIGRlcml2ZWQgY2xhc3MgbXVzdCBoYXZlIEBjCisgICAqIGl0ZXJhdG9yIGFuZCBAYyBjb25zdF9pdGVyYXRvciB0eXBlcyB0aGF0IGFyZSBpbnN0YW50aWF0aW9ucyBvZgorICAgKiBjbGFzcyB0ZW1wbGF0ZSBfU2FmZV9pdGVyYXRvciBmb3IgdGhpcyBjb250YWluZXIgYW5kIEBjIGxvY2FsX2l0ZXJhdG9yCisgICAqIGFuZCBAYyBjb25zdF9sb2NhbF9pdGVyYXRvciB0eXBlcyB0aGF0IGFyZSBpbnN0YW50aWF0aW9ucyBvZiBjbGFzcworICAgKiB0ZW1wbGF0ZSBfU2FmZV9sb2NhbF9pdGVyYXRvciBmb3IgdGhpcyBjb250YWluZXIuIEl0ZXJhdG9ycyB3aWxsCisgICAqIHRoZW4gYmUgdHJhY2tlZCBhdXRvbWF0aWNhbGx5LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBjbGFzcyBfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyIDogcHVibGljIF9TYWZlX3Vub3JkZXJlZF9jb250YWluZXJfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvKiogSW52YWxpZGF0ZXMgYWxsIGl0ZXJhdG9ycyBAYyB4IHRoYXQgcmVmZXJlbmNlIHRoaXMgY29udGFpbmVyLAorCSAgYXJlIG5vdCBzaW5ndWxhciwgYW5kIGZvciB3aGljaCBAYyBfX3ByZWQoeCkgcmV0dXJucyBAYworCSAgdHJ1ZS4gQGMgX19wcmVkIHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBub3JtYWwgaXRlcmF0b3JzIG5lc3RlZAorCSAgaW4gdGhlIHNhZmUgb25lcy4gKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisJdm9pZAorCV9NX2ludmFsaWRhdGVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpOworCisgICAgICAvKiogSW52YWxpZGF0ZXMgYWxsIGxvY2FsIGl0ZXJhdG9ycyBAYyB4IHRoYXQgcmVmZXJlbmNlIHRoaXMgY29udGFpbmVyLAorCSAgYXJlIG5vdCBzaW5ndWxhciwgYW5kIGZvciB3aGljaCBAYyBfX3ByZWQoeCkgcmV0dXJucyBAYworCSAgdHJ1ZS4gQGMgX19wcmVkIHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBub3JtYWwgaWxvY2FsIGl0ZXJhdG9ycworCSAgbmVzdGVkIGluIHRoZSBzYWZlIG9uZXMuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZGljYXRlPgorCXZvaWQKKwlfTV9pbnZhbGlkYXRlX2xvY2FsX2lmKF9QcmVkaWNhdGUgX19wcmVkKTsKKyAgICB9OworfSAvLyBuYW1lc3BhY2UgX19nbnVfZGVidWcKKworI2luY2x1ZGUgPGRlYnVnL3NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lci50Y2M+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX3Vub3JkZXJlZF9jb250YWluZXIudGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX3Vub3JkZXJlZF9jb250YWluZXIudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmM2JjYWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lci50Y2MKQEAgLTAsMCArMSwxMDAgQEAKKy8vIFNhZmUgY29udGFpbmVyIGltcGxlbWVudGF0aW9uICAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvc2FmZV91bm9yZGVyZWRfY29udGFpbmVyLnRjYworICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfU0FGRV9VTk9SREVSRURfQ09OVEFJTkVSX1RDQworI2RlZmluZSBfR0xJQkNYWF9ERUJVR19TQUZFX1VOT1JERVJFRF9DT05UQUlORVJfVENDIDEKKworbmFtZXNwYWNlIF9fZ251X2RlYnVnCit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgIHZvaWQKKyAgICAgIF9TYWZlX3Vub3JkZXJlZF9jb250YWluZXI8X0NvbnRhaW5lcj46OgorICAgICAgX01faW52YWxpZGF0ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXJhdG9yOworCXR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKwlfX2dudV9jeHg6Ol9fc2NvcGVkX2xvY2sgc2VudHJ5KHRoaXMtPl9NX2dldF9tdXRleCgpKTsKKwlmb3IgKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXRlciA9IF9NX2l0ZXJhdG9yczsgX19pdGVyOykKKwkgIHsKKwkgICAgaXRlcmF0b3IqIF9fdmljdGltID0gc3RhdGljX2Nhc3Q8aXRlcmF0b3IqPihfX2l0ZXIpOworCSAgICBfX2l0ZXIgPSBfX2l0ZXItPl9NX25leHQ7CisJICAgIGlmICghX192aWN0aW0tPl9NX3Npbmd1bGFyKCkgJiYgX19wcmVkKF9fdmljdGltLT5iYXNlKCkpKQorCSAgICAgIHsKKwkJX192aWN0aW0tPl9NX2ludmFsaWRhdGUoKTsKKwkgICAgICB9CisJICB9CisKKwlmb3IgKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXRlcjIgPSBfTV9jb25zdF9pdGVyYXRvcnM7IF9faXRlcjI7KQorCSAgeworCSAgICBjb25zdF9pdGVyYXRvciogX192aWN0aW0gPSBzdGF0aWNfY2FzdDxjb25zdF9pdGVyYXRvcio+KF9faXRlcjIpOworCSAgICBfX2l0ZXIyID0gX19pdGVyMi0+X01fbmV4dDsKKwkgICAgaWYgKCFfX3ZpY3RpbS0+X01fc2luZ3VsYXIoKSAmJiBfX3ByZWQoX192aWN0aW0tPmJhc2UoKSkpCisJICAgICAgeworCQlfX3ZpY3RpbS0+X01faW52YWxpZGF0ZSgpOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgIHZvaWQKKyAgICAgIF9TYWZlX3Vub3JkZXJlZF9jb250YWluZXI8X0NvbnRhaW5lcj46OgorICAgICAgX01faW52YWxpZGF0ZV9sb2NhbF9pZihfUHJlZGljYXRlIF9fcHJlZCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6OmxvY2FsX2l0ZXJhdG9yIGxvY2FsX2l0ZXJhdG9yOworCXR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6Y29uc3RfbG9jYWxfaXRlcmF0b3IgY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKwlfX2dudV9jeHg6Ol9fc2NvcGVkX2xvY2sgc2VudHJ5KHRoaXMtPl9NX2dldF9tdXRleCgpKTsKKwlmb3IgKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXRlciA9IF9NX2xvY2FsX2l0ZXJhdG9yczsgX19pdGVyOykKKwkgIHsKKwkgICAgbG9jYWxfaXRlcmF0b3IqIF9fdmljdGltID0gc3RhdGljX2Nhc3Q8bG9jYWxfaXRlcmF0b3IqPihfX2l0ZXIpOworCSAgICBfX2l0ZXIgPSBfX2l0ZXItPl9NX25leHQ7CisJICAgIGlmICghX192aWN0aW0tPl9NX3Npbmd1bGFyKCkgJiYgX19wcmVkKF9fdmljdGltLT5iYXNlKCkpKQorCSAgICAgIHsKKwkJX192aWN0aW0tPl9NX2ludmFsaWRhdGUoKTsKKwkgICAgICB9CisJICB9CisKKwlmb3IgKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXRlcjIgPSBfTV9jb25zdF9sb2NhbF9pdGVyYXRvcnM7IF9faXRlcjI7KQorCSAgeworCSAgICBjb25zdF9sb2NhbF9pdGVyYXRvciogX192aWN0aW0gPQorCSAgICAgIHN0YXRpY19jYXN0PGNvbnN0X2xvY2FsX2l0ZXJhdG9yKj4oX19pdGVyMik7CisJICAgIF9faXRlcjIgPSBfX2l0ZXIyLT5fTV9uZXh0OworCSAgICBpZiAoIV9fdmljdGltLT5fTV9zaW5ndWxhcigpICYmIF9fcHJlZChfX3ZpY3RpbS0+YmFzZSgpKSkKKwkgICAgICB7CisJCV9fdmljdGltLT5fTV9pbnZhbGlkYXRlKCk7CisJICAgICAgfQorCSAgfQorICAgICAgfQorCit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2V0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3YjEzYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2V0CkBAIC0wLDAgKzEsMzYgQEAKKy8vIERlYnVnZ2luZyBzZXQvbXVsdGlzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3NldAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfU0VUCisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1NFVCAxCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8ZGVidWcvc2V0Lmg+CisjaW5jbHVkZSA8ZGVidWcvbXVsdGlzZXQuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NldC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWUzZjNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zZXQuaApAQCAtMCwwICsxLDQ2OSBAQAorLy8gRGVidWdnaW5nIHNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvc2V0LmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1NFVF9ICisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1NFVF9IIDEKKworI2luY2x1ZGUgPGRlYnVnL3NhZmVfc2VxdWVuY2UuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpIAoreworbmFtZXNwYWNlIF9fZGVidWcKK3sKKyAgLy8vIENsYXNzIHN0ZDo6c2V0IHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9LZXk+ID4KKyAgICBjbGFzcyBzZXQKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6c2V0PF9LZXksX0NvbXBhcmUsX0FsbG9jYXRvcj4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OnNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gX0Jhc2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfRXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9FcXVhbDsKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlczoKKyAgICAgIHR5cGVkZWYgX0tleQkJCQkgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9LZXkJCQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlCQkJCSAgICBrZXlfY29tcGFyZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUJCQkJICAgIHZhbHVlX2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IJCQkgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfaXRlcmF0b3IsIHNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLCBzZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIDIzLjMuMy4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdCBzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJCSAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19jb21wLCBfX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKwk6IF9CYXNlKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19nbnVfZGVidWc6Ol9fY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwKKwkJCQkJCQkJICAgICBfX2xhc3QpKSwKKwkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpLAorCQlfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIHNldChjb25zdCBzZXQmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgc2V0KGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzZXQoc2V0JiYgX194KQorICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X0NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IHRoaXMtPl9NX3N3YXAoX194KTsgfQorCisgICAgICBzZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICBjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fY29tcCwgX19hKSB7IH0KKyNlbmRpZgorCisgICAgICB+c2V0KCkgX0dMSUJDWFhfTk9FWENFUFQgeyB9CisKKyAgICAgIHNldCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBzZXQmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHNldCYKKyAgICAgIG9wZXJhdG9yPShzZXQmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwlfX2dsaWJjeHhfY2hlY2tfc2VsZl9tb3ZlX2Fzc2lnbihfX3gpOworCWNsZWFyKCk7CisJc3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgc2V0JgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworICAgICAgLy8gbW9kaWZpZXJzOgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIGF1dG8gX19yZXMgPSBfQmFzZTo6ZW1wbGFjZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJCQkgICBfX3Jlcy5zZWNvbmQpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3MpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbXBsYWNlX2hpbnQoX19wb3MuYmFzZSgpLAorCQkJCQkgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCQkJICB0aGlzKTsKKwl9CisjZW5kaWYKKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzID0gX0Jhc2U6Omluc2VydChfX3gpOworCXJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCQkJIF9fcmVzLnNlY29uZCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzCisJICA9IF9CYXNlOjppbnNlcnQoc3RkOjptb3ZlKF9feCkpOworCXJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCQkJIF9fcmVzLnNlY29uZCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX194KSwgdGhpcyk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgc3RkOjptb3ZlKF9feCkpLAorCQkJdGhpcyk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgX0Jhc2U6Omluc2VydChfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwl9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IF9CYXNlOjppbnNlcnQoX19sKTsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX19wb3NpdGlvbik7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX19wb3NpdGlvbi5iYXNlKCkpKTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX19wb3NpdGlvbik7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX19wb3NpdGlvbi5iYXNlKCkpKTsKKwlfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbi5iYXNlKCkpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9CYXNlOjpmaW5kKF9feCk7CisJaWYgKF9fdmljdGltID09IF9CYXNlOjplbmQoKSkKKyAgICAgICAgICByZXR1cm4gMDsKKwllbHNlCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICAgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSk7CisJICAgIHJldHVybiAxOworCSAgfQorICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdmljdGltID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3ZpY3RpbSAhPSBfX2xhc3QuYmFzZSgpOyArK19fdmljdGltKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX192aWN0aW0gIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgfQorCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJZm9yIChfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fZmlyc3QuYmFzZSgpOworCSAgICAgX192aWN0aW0gIT0gX19sYXN0LmJhc2UoKTsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdmljdGltICE9IF9CYXNlOjplbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgIH0KKwlfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoc2V0JiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnN3YXAoX194KTsKKwl0aGlzLT5fTV9zd2FwKF9feCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9CYXNlOjpjbGVhcigpOworICAgICAgfQorCisgICAgICAvLyBvYnNlcnZlcnM6CisgICAgICB1c2luZyBfQmFzZTo6a2V5X2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6dmFsdWVfY29tcDsKKworICAgICAgLy8gc2V0IG9wZXJhdGlvbnM6CisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSwgdGhpcyk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSwgdGhpcyk7IH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmNvdW50OworCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpLCB0aGlzKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisgICAgICAgIF9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkgICAgICBpdGVyYXRvcihfX3Jlcy5zZWNvbmQsIHRoaXMpKTsKKyAgICAgIH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcmVzID0KKyAgICAgICAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ludmFsaWRhdGVfYWxsKCkKKyAgICAgIHsKKwl0eXBlZGVmIF9fZ251X2RlYnVnOjpfTm90X2VxdWFsX3RvPF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfTm90X2VxdWFsOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX05vdF9lcXVhbChfTV9iYXNlKCkuZW5kKCkpKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDw9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIHZvaWQKKyAgICBzd2FwKHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKwkgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5zd2FwKF9feSk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19kZWJ1ZworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zdHJpbmcgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3N0cmluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTViZjliCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zdHJpbmcKQEAgLTAsMCArMSwxMTYxIEBACisvLyBEZWJ1Z2dpbmcgc3RyaW5nIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9zdHJpbmcKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1NUUklORworI2RlZmluZSBfR0xJQkNYWF9ERUJVR19TVFJJTkcgMQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfc2VxdWVuY2UuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2l0ZXJhdG9yLmg+CisKK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjpiYXNpY19zdHJpbmcgd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisgICAgICAgICAgICB0eXBlbmFtZSBfQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfc3RyaW5nCisgICAgOiBwdWJsaWMgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiwKKyAgICAgIHB1YmxpYyBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywKKwkJCQkJCSAgICAgIF9BbGxvY2F0b3I+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4gX0Jhc2U7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTxiYXNpY19zdHJpbmc+ICAgICBfU2FmZV9iYXNlOworCisgIHB1YmxpYzoKKyAgICAvLyB0eXBlczoKKyAgICB0eXBlZGVmIF9UcmFpdHMJCQkJICAgICAgIHRyYWl0c190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlCQkgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9BbGxvY2F0b3IJCQkJICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3BvaW50ZXIgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjx0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IsIGJhc2ljX3N0cmluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjx0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmluZz4gY29uc3RfaXRlcmF0b3I7CisKKyAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICB1c2luZyBfQmFzZTo6bnBvczsKKworICAgIC8vIDIxLjMuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgIGV4cGxpY2l0IGJhc2ljX3N0cmluZyhjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgOiBfQmFzZShfX2EpCisgICAgeyB9CisKKyAgICAvLyBQcm92aWRlcyBjb252ZXJzaW9uIGZyb20gYSByZWxlYXNlLW1vZGUgc3RyaW5nIHRvIGEgZGVidWctbW9kZSBzdHJpbmcKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgX0Jhc2UmIF9fYmFzZSkgOiBfQmFzZShfX2Jhc2UpIHsgfQorCisgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgIC8vIDQyLiBzdHJpbmcgY3RvcnMgc3BlY2lmeSB3cm9uZyBkZWZhdWx0IGFsbG9jYXRvcgorICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIDogX0Jhc2UoX19zdHIsIDAsIF9CYXNlOjpucG9zLCBfX3N0ci5nZXRfYWxsb2NhdG9yKCkpCisgICAgeyB9CisKKyAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgLy8gNDIuIHN0cmluZyBjdG9ycyBzcGVjaWZ5IHdyb25nIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcywKKwkJICAgc2l6ZV90eXBlIF9fbiA9IF9CYXNlOjpucG9zLAorCQkgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgOiBfQmFzZShfX3N0ciwgX19wb3MsIF9fbiwgX19hKQorICAgIHsgfQorCisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLAorCQkgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja19zdHJpbmcoX19zLCBfX24pLCBfX24sIF9fYSkKKyAgICB7IH0KKworICAgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgIDogX0Jhc2UoX19nbnVfZGVidWc6Ol9fY2hlY2tfc3RyaW5nKF9fcyksIF9fYSkKKyAgICB7IHRoaXMtPmFzc2lnbihfX3MpOyB9CisKKyAgICBiYXNpY19zdHJpbmcoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYywKKwkJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgIDogX0Jhc2UoX19uLCBfX2MsIF9fYSkKKyAgICB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgYmFzaWNfc3RyaW5nKF9JbnB1dEl0ZXJhdG9yIF9fYmVnaW4sIF9JbnB1dEl0ZXJhdG9yIF9fZW5kLAorCQkgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19nbnVfZGVidWc6Ol9fY2hlY2tfdmFsaWRfcmFuZ2UoX19iZWdpbiwKKwkJCQkJCQkJICAgX19lbmQpKSwKKwkgICAgICBfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZW5kKSwgX19hKQorICAgICAgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgYmFzaWNfc3RyaW5nKGJhc2ljX3N0cmluZyYmIF9fc3RyKSBub2V4Y2VwdAorICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9fc3RyKSkKKyAgICB7IH0KKworICAgIGJhc2ljX3N0cmluZyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wsCisJCSBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgOiBfQmFzZShfX2wsIF9fYSkKKyAgICB7IH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgfmJhc2ljX3N0cmluZygpIF9HTElCQ1hYX05PRVhDRVBUIHsgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIHsKKyAgICAgICpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX19zdHI7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBvcGVyYXRvcj0oY29uc3QgX0NoYXJUKiBfX3MpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3M7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBvcGVyYXRvcj0oX0NoYXJUIF9fYykKKyAgICB7CisgICAgICAqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9fYzsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIGJhc2ljX3N0cmluZyYKKyAgICBvcGVyYXRvcj0oYmFzaWNfc3RyaW5nJiYgX19zdHIpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3NlbGZfbW92ZV9hc3NpZ24oX19zdHIpOworICAgICAgKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBzdGQ6Om1vdmUoX19zdHIpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgb3BlcmF0b3I9KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICB7CisgICAgICAqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9fbDsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICAvLyAyMS4zLjIgaXRlcmF0b3JzOgorICAgIGl0ZXJhdG9yCisgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgY29uc3RfaXRlcmF0b3IKKyAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICBpdGVyYXRvcgorICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgY29uc3RfaXRlcmF0b3IKKyAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgY29uc3RfaXRlcmF0b3IKKyAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgY29uc3RfaXRlcmF0b3IKKyAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAvLyAyMS4zLjMgY2FwYWNpdHk6CisgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgdXNpbmcgX0Jhc2U6Omxlbmd0aDsKKyAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyAgICB2b2lkCisgICAgcmVzaXplKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgX0Jhc2U6OnJlc2l6ZShfX24sIF9fYyk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgIH0KKworICAgIHZvaWQKKyAgICByZXNpemUoc2l6ZV90eXBlIF9fbikKKyAgICB7IHRoaXMtPnJlc2l6ZShfX24sIF9DaGFyVCgpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHZvaWQKKyAgICBzaHJpbmtfdG9fZml0KCkKKyAgICB7CisgICAgICBpZiAoY2FwYWNpdHkoKSA+IHNpemUoKSkKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgcmVzZXJ2ZSgwKTsKKwkgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB9CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgdXNpbmcgX0Jhc2U6OmNhcGFjaXR5OworICAgIHVzaW5nIF9CYXNlOjpyZXNlcnZlOworCisgICAgdm9pZAorICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBfQmFzZTo6Y2xlYXIoKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorCisgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworCisgICAgLy8gMjEuMy40IGVsZW1lbnQgYWNjZXNzOgorICAgIGNvbnN0X3JlZmVyZW5jZQorICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fcG9zKSBjb25zdAorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX3BvcyA8PSB0aGlzLT5zaXplKCksCisJCQkgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc3Vic2NyaXB0X29vYikKKwkJCSAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikKKwkJCSAgICAuX01faW50ZWdlcihfX3BvcywgIl9fcG9zIikKKwkJCSAgICAuX01faW50ZWdlcih0aGlzLT5zaXplKCksICJzaXplIikpOworICAgICAgcmV0dXJuIF9NX2Jhc2UoKVtfX3Bvc107CisgICAgfQorCisgICAgcmVmZXJlbmNlCisgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19wb3MpCisgICAgeworI2lmZGVmIF9HTElCQ1hYX0RFQlVHX1BFREFOVElDCisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3Vic2NyaXB0KF9fcG9zKTsKKyNlbHNlCisgICAgICAvLyBhcyBhbiBleHRlbnNpb24gdjMgYWxsb3dzIHNbcy5zaXplKCldIHdoZW4gcyBpcyBub24tY29uc3QuCisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19wb3MgPD0gdGhpcy0+c2l6ZSgpLAorCQkJICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3N1YnNjcmlwdF9vb2IpCisJCQkgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCisJCQkgICAgLl9NX2ludGVnZXIoX19wb3MsICJfX3BvcyIpCisJCQkgICAgLl9NX2ludGVnZXIodGhpcy0+c2l6ZSgpLCAic2l6ZSIpKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIF9NX2Jhc2UoKVtfX3Bvc107CisgICAgfQorCisgICAgdXNpbmcgX0Jhc2U6OmF0OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHVzaW5nIF9CYXNlOjpmcm9udDsKKyAgICB1c2luZyBfQmFzZTo6YmFjazsKKyNlbmRpZgorCisgICAgLy8gMjEuMy41IG1vZGlmaWVyczoKKyAgICBiYXNpY19zdHJpbmcmCisgICAgb3BlcmF0b3IrPShjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIHsKKyAgICAgIF9NX2Jhc2UoKSArPSBfX3N0cjsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIG9wZXJhdG9yKz0oY29uc3QgX0NoYXJUKiBfX3MpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgX01fYmFzZSgpICs9IF9fczsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIG9wZXJhdG9yKz0oX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfTV9iYXNlKCkgKz0gX19jOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgYmFzaWNfc3RyaW5nJgorICAgIG9wZXJhdG9yKz0oc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgIHsKKyAgICAgIF9NX2Jhc2UoKSArPSBfX2w7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFwcGVuZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIHsKKyAgICAgIF9CYXNlOjphcHBlbmQoX19zdHIpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgYXBwZW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfQmFzZTo6YXBwZW5kKF9fc3RyLCBfX3BvcywgX19uKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBfQmFzZTo6YXBwZW5kKF9fcywgX19uKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICBfQmFzZTo6YXBwZW5kKF9fcyk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBhcHBlbmQoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfQmFzZTo6YXBwZW5kKF9fbiwgX19jKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhcHBlbmQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCV9CYXNlOjphcHBlbmQoX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJICAgICAgX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAvLyA3LiBzdHJpbmcgY2xhdXNlIG1pbm9yIHByb2JsZW1zCisgICAgdm9pZAorICAgIHB1c2hfYmFjayhfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIF9CYXNlOjpwdXNoX2JhY2soX19jKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFzc2lnbihjb25zdCBiYXNpY19zdHJpbmcmIF9feCkKKyAgICB7CisgICAgICBfQmFzZTo6YXNzaWduKF9feCk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBiYXNpY19zdHJpbmcmCisgICAgYXNzaWduKGJhc2ljX3N0cmluZyYmIF9feCkKKyAgICB7CisgICAgICBfQmFzZTo6YXNzaWduKHN0ZDo6bW92ZShfX3gpKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgYXNzaWduKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfQmFzZTo6YXNzaWduKF9fc3RyLCBfX3BvcywgX19uKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBfQmFzZTo6YXNzaWduKF9fcywgX19uKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICBfQmFzZTo6YXNzaWduKF9fcyk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfQmFzZTo6YXNzaWduKF9fbiwgX19jKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCV9CYXNlOjphc3NpZ24oX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJICAgICAgX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBiYXNpY19zdHJpbmcmCisgICAgYXNzaWduKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICB7CisgICAgICBfQmFzZTo6YXNzaWduKF9fbCk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGluc2VydChzaXplX3R5cGUgX19wb3MxLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIHsKKyAgICAgIF9CYXNlOjppbnNlcnQoX19wb3MxLCBfX3N0cik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKwkgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9CYXNlOjppbnNlcnQoX19wb3MxLCBfX3N0ciwgX19wb3MyLCBfX24pOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgX0Jhc2U6Omluc2VydChfX3BvcywgX19zLCBfX24pOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX0NoYXJUKiBfX3MpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgX0Jhc2U6Omluc2VydChfX3BvcywgX19zKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGluc2VydChzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgX0Jhc2U6Omluc2VydChfX3BvcywgX19uLCBfX2MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpdGVyYXRvcgorICAgIGluc2VydChpdGVyYXRvciBfX3AsIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX3ApOworICAgICAgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX3AuYmFzZSgpLCBfX2MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcihfX3JlcywgdGhpcyk7CisgICAgfQorCisgICAgdm9pZAorICAgIGluc2VydChpdGVyYXRvciBfX3AsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX3ApOworICAgICAgX0Jhc2U6Omluc2VydChfX3AuYmFzZSgpLCBfX24sIF9fYyk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnRfcmFuZ2UoX19wLCBfX2ZpcnN0LCBfX2xhc3QpOworCV9CYXNlOjppbnNlcnQoX19wLmJhc2UoKSwgX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCQkgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB2b2lkCisgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wKTsKKyAgICAgIF9CYXNlOjppbnNlcnQoX19wLmJhc2UoKSwgX19sKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgZXJhc2Uoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IF9CYXNlOjpucG9zKQorICAgIHsKKyAgICAgIF9CYXNlOjplcmFzZShfX3BvcywgX19uKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgaXRlcmF0b3IKKyAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19lcmFzZShfX3Bvc2l0aW9uKTsKKyAgICAgIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfX3JlcyA9IF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICB9CisKKyAgICBpdGVyYXRvcgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorICAgICAgX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksCisJCQkJCQkgICAgICAgX19sYXN0LmJhc2UoKSk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdm9pZAorICAgIHBvcF9iYWNrKCkKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKyAgICAgIF9CYXNlOjpwb3BfYmFjaygpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICB9CisjZW5kaWYgLy8gQysrMTEKKworICAgIGJhc2ljX3N0cmluZyYKKyAgICByZXBsYWNlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIHsKKyAgICAgIF9CYXNlOjpyZXBsYWNlKF9fcG9zMSwgX19uMSwgX19zdHIpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKwkgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpCisgICAgeworICAgICAgX0Jhc2U6OnJlcGxhY2UoX19wb3MxLCBfX24xLCBfX3N0ciwgX19wb3MyLCBfX24yKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgIHNpemVfdHlwZSBfX24yKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmdfbGVuKF9fcywgX19uMik7CisgICAgICBfQmFzZTo6cmVwbGFjZShfX3BvcywgX19uMSwgX19zLCBfX24yKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgX0Jhc2U6OnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcyk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yLCBfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIF9CYXNlOjpyZXBsYWNlKF9fcG9zLCBfX24xLCBfX24yLCBfX2MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2kxLCBfX2kyKTsKKyAgICAgIF9CYXNlOjpyZXBsYWNlKF9faTEuYmFzZSgpLCBfX2kyLmJhc2UoKSwgX19zdHIpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19pMSwgX19pMik7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBfQmFzZTo6cmVwbGFjZShfX2kxLmJhc2UoKSwgX19pMi5iYXNlKCksIF9fcywgX19uKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3QgX0NoYXJUKiBfX3MpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9faTEsIF9faTIpOworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgX0Jhc2U6OnJlcGxhY2UoX19pMS5iYXNlKCksIF9faTIuYmFzZSgpLCBfX3MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2kxLCBfX2kyKTsKKyAgICAgIF9CYXNlOjpyZXBsYWNlKF9faTEuYmFzZSgpLCBfX2kyLmJhc2UoKSwgX19uLCBfX2MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkgICAgICBfSW5wdXRJdGVyYXRvciBfX2oxLCBfSW5wdXRJdGVyYXRvciBfX2oyKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2kxLCBfX2kyKTsKKwlfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19qMSwgX19qMik7CisJX0Jhc2U6OnJlcGxhY2UoX19pMS5iYXNlKCksIF9faTIuYmFzZSgpLCBfX2oxLCBfX2oyKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLAorCQkJICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19pMSwgX19pMik7CisJX0Jhc2U6OnJlcGxhY2UoX19pMS5iYXNlKCksIF9faTIuYmFzZSgpLCBfX2wpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICBzaXplX3R5cGUKKyAgICBjb3B5KF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIHJldHVybiBfQmFzZTo6Y29weShfX3MsIF9fbiwgX19wb3MpOworICAgIH0KKworICAgIHZvaWQKKyAgICBzd2FwKGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX194KQorICAgIHsKKyAgICAgIF9CYXNlOjpzd2FwKF9feCk7CisgICAgICB0aGlzLT5fTV9zd2FwKF9feCk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgX194Ll9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorCisgICAgLy8gMjEuMy42IHN0cmluZyBvcGVyYXRpb25zOgorICAgIGNvbnN0IF9DaGFyVCoKKyAgICBjX3N0cigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgY29uc3QgX0NoYXJUKiBfX3JlcyA9IF9CYXNlOjpjX3N0cigpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiBfX3JlczsKKyAgICB9CisKKyAgICBjb25zdCBfQ2hhclQqCisgICAgZGF0YSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgY29uc3QgX0NoYXJUKiBfX3JlcyA9IF9CYXNlOjpkYXRhKCk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuIF9fcmVzOworICAgIH0KKworICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgc2l6ZV90eXBlCisgICAgZmluZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgICAgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBfQmFzZTo6ZmluZChfX3N0ciwgX19wb3MpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgcmV0dXJuIF9CYXNlOjpmaW5kKF9fcywgX19wb3MsIF9fbik7CisgICAgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OmZpbmQoX19zLCBfX3Bvcyk7CisgICAgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIF9CYXNlOjpmaW5kKF9fYywgX19wb3MpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICByZmluZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSBfQmFzZTo6bnBvcykgY29uc3QKKyAgICAgIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gX0Jhc2U6OnJmaW5kKF9fc3RyLCBfX3Bvcyk7IH0KKworICAgIHNpemVfdHlwZQorICAgIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgcmV0dXJuIF9CYXNlOjpyZmluZChfX3MsIF9fcG9zLCBfX24pOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBfQmFzZTo6bnBvcykgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OnJmaW5kKF9fcywgX19wb3MpOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIHJmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IF9CYXNlOjpucG9zKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIF9CYXNlOjpyZmluZChfX2MsIF9fcG9zKTsgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9maXJzdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgICAgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBfQmFzZTo6ZmluZF9maXJzdF9vZihfX3N0ciwgX19wb3MpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2ZpcnN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgcmV0dXJuIF9CYXNlOjpmaW5kX2ZpcnN0X29mKF9fcywgX19wb3MsIF9fbik7CisgICAgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OmZpbmRfZmlyc3Rfb2YoX19zLCBfX3Bvcyk7CisgICAgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9maXJzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIF9CYXNlOjpmaW5kX2ZpcnN0X29mKF9fYywgX19wb3MpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2xhc3Rfb2YoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgCisJCSBzaXplX3R5cGUgX19wb3MgPSBfQmFzZTo6bnBvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBfQmFzZTo6ZmluZF9sYXN0X29mKF9fc3RyLCBfX3Bvcyk7IH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIHJldHVybiBfQmFzZTo6ZmluZF9sYXN0X29mKF9fcywgX19wb3MsIF9fbik7CisgICAgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBfQmFzZTo6bnBvcykgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OmZpbmRfbGFzdF9vZihfX3MsIF9fcG9zKTsKKyAgICB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2xhc3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gX0Jhc2U6Om5wb3MpIGNvbnN0CisgICAgICBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIF9CYXNlOjpmaW5kX2xhc3Rfb2YoX19jLCBfX3Bvcyk7IH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgICBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIF9CYXNlOjpmaW5kX2ZpcnN0X25vdF9vZihfX3N0ciwgX19wb3MpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIHJldHVybiBfQmFzZTo6ZmluZF9maXJzdF9ub3Rfb2YoX19zLCBfX3BvcywgX19uKTsKKyAgICB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OmZpbmRfZmlyc3Rfbm90X29mKF9fcywgX19wb3MpOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfZmlyc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gX0Jhc2U6OmZpbmRfZmlyc3Rfbm90X29mKF9fYywgX19wb3MpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsCisJCQkJICBzaXplX3R5cGUgX19wb3MgPSBfQmFzZTo6bnBvcykgY29uc3QKKyAgICAgIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gX0Jhc2U6OmZpbmRfbGFzdF9ub3Rfb2YoX19zdHIsIF9fcG9zKTsgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIHJldHVybiBfQmFzZTo6ZmluZF9sYXN0X25vdF9vZihfX3MsIF9fcG9zLCBfX24pOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IF9CYXNlOjpucG9zKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIHJldHVybiBfQmFzZTo6ZmluZF9sYXN0X25vdF9vZihfX3MsIF9fcG9zKTsKKyAgICB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2xhc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IF9CYXNlOjpucG9zKSBjb25zdAorICAgICAgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBfQmFzZTo6ZmluZF9sYXN0X25vdF9vZihfX2MsIF9fcG9zKTsgfQorCisgICAgYmFzaWNfc3RyaW5nCisgICAgc3Vic3RyKHNpemVfdHlwZSBfX3BvcyA9IDAsIHNpemVfdHlwZSBfX24gPSBfQmFzZTo6bnBvcykgY29uc3QKKyAgICB7IHJldHVybiBiYXNpY19zdHJpbmcoX0Jhc2U6OnN1YnN0cihfX3BvcywgX19uKSk7IH0KKworICAgIGludAorICAgIGNvbXBhcmUoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikgY29uc3QKKyAgICB7IHJldHVybiBfQmFzZTo6Y29tcGFyZShfX3N0cik7IH0KKworICAgIGludAorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsCisJCSAgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikgY29uc3QKKyAgICB7IHJldHVybiBfQmFzZTo6Y29tcGFyZShfX3BvczEsIF9fbjEsIF9fc3RyKTsgfQorCisgICAgaW50CisgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKwkgICAgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uMikgY29uc3QKKyAgICB7IHJldHVybiBfQmFzZTo6Y29tcGFyZShfX3BvczEsIF9fbjEsIF9fc3RyLCBfX3BvczIsIF9fbjIpOyB9CisKKyAgICBpbnQKKyAgICBjb21wYXJlKGNvbnN0IF9DaGFyVCogX19zKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIHJldHVybiBfQmFzZTo6Y29tcGFyZShfX3MpOworICAgIH0KKworICAgIC8vICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgLy8gIDUuIHN0cmluZzo6Y29tcGFyZSBzcGVjaWZpY2F0aW9uIHF1ZXN0aW9uYWJsZQorICAgIGludAorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIHJldHVybiBfQmFzZTo6Y29tcGFyZShfX3BvczEsIF9fbjEsIF9fcyk7CisgICAgfQorCisgICAgLy8gIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAvLyAgNS4gc3RyaW5nOjpjb21wYXJlIHNwZWNpZmljYXRpb24gcXVlc3Rpb25hYmxlCisgICAgaW50CisgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSxjb25zdCBfQ2hhclQqIF9fcywKKwkgICAgICBzaXplX3R5cGUgX19uMikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nX2xlbihfX3MsIF9fbjIpOworICAgICAgcmV0dXJuIF9CYXNlOjpjb21wYXJlKF9fcG9zMSwgX19uMSwgX19zLCBfX24yKTsKKyAgICB9CisKKyAgICBfQmFzZSYKKyAgICBfTV9iYXNlKCkgX0dMSUJDWFhfTk9FWENFUFQgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIGNvbnN0IF9CYXNlJgorICAgIF9NX2Jhc2UoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorCisgICAgdXNpbmcgX1NhZmVfYmFzZTo6X01faW52YWxpZGF0ZV9hbGw7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4KKyAgICBvcGVyYXRvcisoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPihfX2xocykgKz0gX19yaHM7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPgorICAgIG9wZXJhdG9yKyhjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX2xocyk7CisgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+KF9fbGhzKSArPSBfX3JoczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4KKyAgICBvcGVyYXRvcisoX0NoYXJUIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+KDEsIF9fbGhzKSArPSBfX3JoczsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+CisgICAgb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcmhzKTsKKyAgICAgIHJldHVybiBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4oX19saHMpICs9IF9fcmhzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPgorICAgIG9wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIF9DaGFyVCBfX3JocykKKyAgICB7IHJldHVybiBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4oX19saHMpICs9IF9fcmhzOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX2xocyk7CisgICAgICByZXR1cm4gX19saHMgPT0gX19yaHMuX01fYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fbGhzKTsKKyAgICAgIHJldHVybiBfX2xocyAhPSBfX3Jocy5fTV9iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcmhzKTsKKyAgICAgIHJldHVybiBfX2xocy5fTV9iYXNlKCkgIT0gX19yaHM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fbGhzKTsKKyAgICAgIHJldHVybiBfX2xocyA8IF9fcmhzLl9NX2Jhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcmhzKTsKKyAgICAgIHJldHVybiBfX2xocy5fTV9iYXNlKCkgPCBfX3JoczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX2xocyk7CisgICAgICByZXR1cm4gX19saHMgPD0gX19yaHMuX01fYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpIDw9IF9fcmhzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fbGhzKTsKKyAgICAgIHJldHVybiBfX2xocyA+PSBfX3Jocy5fTV9iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcmhzKTsKKyAgICAgIHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fbGhzKTsKKyAgICAgIHJldHVybiBfX2xocyA+IF9fcmhzLl9NX2Jhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcmhzKTsKKyAgICAgIHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3JoczsKKyAgICB9CisKKyAgLy8gMjEuMy43Ljg6CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3N0cikKKyAgICB7IHJldHVybiBfX29zIDw8IF9fc3RyLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYgX19pcywKKwkgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3N0cikKKyAgICB7CisgICAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULF9UcmFpdHM+JiBfX3JlcyA9IF9faXMgPj4gX19zdHIuX01fYmFzZSgpOworICAgICAgX19zdHIuX01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiBfX3JlczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsX1RyYWl0cz4mCisgICAgZ2V0bGluZShzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULF9UcmFpdHM+JiBfX2lzLAorCSAgICBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fc3RyLCBfQ2hhclQgX19kZWxpbSkKKyAgICB7CisgICAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULF9UcmFpdHM+JiBfX3JlcyA9IGdldGxpbmUoX19pcywKKwkJCQkJCQkgIF9fc3RyLl9NX2Jhc2UoKSwKKwkJCQkJCQlfX2RlbGltKTsKKyAgICAgIF9fc3RyLl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gX19yZXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULF9UcmFpdHM+JgorICAgIGdldGxpbmUoc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYgX19pcywKKwkgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3N0cikKKyAgICB7CisgICAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULF9UcmFpdHM+JiBfX3JlcyA9IGdldGxpbmUoX19pcywKKwkJCQkJCQkgIF9fc3RyLl9NX2Jhc2UoKSk7CisgICAgICBfX3N0ci5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuIF9fcmVzOworICAgIH0KKworICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyPiAgICBzdHJpbmc7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0eXBlZGVmIGJhc2ljX3N0cmluZzx3Y2hhcl90PiB3c3RyaW5nOworI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIF9fZ251X2RlYnVnCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy91bm9yZGVyZWRfbWFwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy91bm9yZGVyZWRfbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MjZiMDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3Vub3JkZXJlZF9tYXAKQEAgLTAsMCArMSw5MDMgQEAKKy8vIERlYnVnZ2luZyB1bm9yZGVyZWRfbWFwL3Vub3JkZXJlZF9tdWx0aW1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvdW5vcmRlcmVkX21hcAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfVU5PUkRFUkVEX01BUAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19VTk9SREVSRURfTUFQIDEKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3Vub3JkZXJlZF9jb250YWluZXIuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9sb2NhbF9pdGVyYXRvci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX2RlYnVnCit7CisgIC8vLyBDbGFzcyBzdGQ6OnVub3JkZXJlZF9tYXAgd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0hhc2ggPSBzdGQ6Omhhc2g8X0tleT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9LZXk+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfbWFwCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OnVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3Vub3JkZXJlZF9jb250YWluZXI8dW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsCisJCQkJCQkJX0hhc2gsIF9QcmVkLCBfQWxsb2M+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjp1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsCisJCQkJCSAgICBfUHJlZCwgX0FsbG9jPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX3Vub3JkZXJlZF9jb250YWluZXI8dW5vcmRlcmVkX21hcD4gX1NhZmVfYmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9sb2NhbF9pdGVyYXRvciBfQmFzZV9jb25zdF9sb2NhbF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmxvY2FsX2l0ZXJhdG9yIF9CYXNlX2xvY2FsX2l0ZXJhdG9yOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfdHlwZSAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfaXRlcmF0b3IsCisJCQkJCSAgdW5vcmRlcmVkX21hcD4gaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9jb25zdF9pdGVyYXRvciwKKwkJCQkJICB1bm9yZGVyZWRfbWFwPiBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9CYXNlX2xvY2FsX2l0ZXJhdG9yLAorCQkJCQkgIHVub3JkZXJlZF9tYXA+IGxvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfbG9jYWxfaXRlcmF0b3I8X0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IsCisJCQkJCSAgdW5vcmRlcmVkX21hcD4gY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfbWFwKHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19oZiwgX19lcWwsIF9fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXVub3JkZXJlZF9tYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCAKKwkJICAgICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLCAKKwkJICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLCAKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgICAgX19sYXN0KSksCisJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSwgX19uLAorCQlfX2hmLCBfX2VxbCwgX19hKSB7IH0KKworICAgICAgdW5vcmRlcmVkX21hcChjb25zdCB1bm9yZGVyZWRfbWFwJiBfX3gpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX21hcChjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisgICAgICB1bm9yZGVyZWRfbWFwKHVub3JkZXJlZF9tYXAmJiBfX3gpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX21hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJICAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpIHsgfQorCisgICAgICB+dW5vcmRlcmVkX21hcCgpIG5vZXhjZXB0IHsgfQorCisgICAgICB1bm9yZGVyZWRfbWFwJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHVub3JkZXJlZF9tYXAmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX21hcCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfbWFwJiYgX194KQorICAgICAgeworICAgCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJX19nbGliY3h4X2NoZWNrX3NlbGZfbW92ZV9hc3NpZ24oX194KTsKKwljbGVhcigpOworCXN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodW5vcmRlcmVkX21hcCYgX194KQorICAgICAgeworCV9CYXNlOjpzd2FwKF9feCk7CisJX1NhZmVfYmFzZTo6X01fc3dhcChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIG5vZXhjZXB0CisgICAgICB7CisJX0Jhc2U6OmNsZWFyKCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IgCisgICAgICBiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgLy8gbG9jYWwgdmVyc2lvbnMKKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19iKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fYikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKF9CYXNlOjplbmQoX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGVuZChzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmVuZChfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgY2JlZ2luKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfQmFzZTo6Y2JlZ2luKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjZW5kKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfQmFzZTo6Y2VuZChfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBfQmFzZTo6YnVja2V0X3NpemUoX19iKTsKKyAgICAgIH0KKworICAgICAgZmxvYXQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfQmFzZTo6bWF4X2xvYWRfZmFjdG9yKCk7IH0KKworICAgICAgdm9pZAorICAgICAgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9fZikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbWF4X2xvYWRfZmFjdG9yKF9fZik7CisJX0Jhc2U6Om1heF9sb2FkX2ZhY3RvcihfX2YpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwkgIHN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgYm9vbD4gX19yZXMKKwkgICAgPSBfQmFzZTo6ZW1wbGFjZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwgX19yZXMuc2Vjb25kKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX2hpbnQpOworCSAgc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJICBfQmFzZV9pdGVyYXRvciBfX2l0ID0gX0Jhc2U6OmVtcGxhY2VfaGludChfX2hpbnQuYmFzZSgpLAorCQkJCQlzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9faXQsIHRoaXMpOworCX0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCXNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgYm9vbD4gX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9fb2JqKTsKKwlfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwgX19yZXMuc2Vjb25kKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX2l0ID0gX0Jhc2U6Omluc2VydChfX2hpbnQuYmFzZSgpLCBfX29iaik7IAorCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19pdCwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorCWluc2VydChfUGFpciYmIF9fb2JqKQorCXsKKwkgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcyA9CisJICAgIF9CYXNlOjppbnNlcnQoc3RkOjpmb3J3YXJkPF9QYWlyPihfX29iaikpOworCSAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwgX19yZXMuc2Vjb25kKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisJaXRlcmF0b3IKKwlpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBfUGFpciYmIF9fb2JqKQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwkgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgX0Jhc2VfaXRlcmF0b3IgX19pdCA9CisJICAgIF9CYXNlOjppbnNlcnQoX19oaW50LmJhc2UoKSwgc3RkOjpmb3J3YXJkPF9QYWlyPihfX29iaikpOworCSAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9faXQsIHRoaXMpOworCX0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2U6Omluc2VydChfX2wpOworCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdm9pZAorCWluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisJeworCSAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwkgIF9CYXNlOjppbnNlcnQoX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJICBfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZmluZChfX2tleSksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpmaW5kKF9fa2V5KSwgdGhpcyk7IH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisJICBfQmFzZTo6ZXF1YWxfcmFuZ2UoX19rZXkpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkgICAgICBpdGVyYXRvcihfX3Jlcy5zZWNvbmQsIHRoaXMpKTsKKyAgICAgIH0KKworICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfY29uc3RfaXRlcmF0b3IsIF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfX3JlcyA9CisJICBfQmFzZTo6ZXF1YWxfcmFuZ2UoX19rZXkpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihjb25zdF9pdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkgICAgICBjb25zdF9pdGVyYXRvcihfX3Jlcy5zZWNvbmQsIHRoaXMpKTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7CisJc2l6ZV90eXBlIF9fcmV0KDApOworCV9CYXNlX2l0ZXJhdG9yIF9fdmljdGltKF9CYXNlOjpmaW5kKF9fa2V5KSk7CisJaWYgKF9fdmljdGltICE9IF9CYXNlOjplbmQoKSkKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihbX192aWN0aW1dKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJCQkgICAgeyByZXR1cm4gX19pdCA9PSBfX3ZpY3RpbTsgfSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfbG9jYWxfaWYoCisJCQkgICAgW19fdmljdGltXShfQmFzZV9jb25zdF9sb2NhbF9pdGVyYXRvciBfX2l0KQorCQkJICAgIHsgcmV0dXJuIF9faXQuX01fY3VyID09IF9fdmljdGltLl9NX2N1cjsgfSk7CisJICAgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgICBfQmFzZTo6ZXJhc2UoX192aWN0aW0pOworCSAgICBfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJICAgIF9fcmV0ID0gMTsKKwkgIH0KKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2l0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX2l0KTsKKwlfQmFzZV9jb25zdF9pdGVyYXRvciBfX3ZpY3RpbSA9IF9faXQuYmFzZSgpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fdmljdGltXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCQkJeyByZXR1cm4gX19pdCA9PSBfX3ZpY3RpbTsgfSk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9sb2NhbF9pZigKKwkJCVtfX3ZpY3RpbV0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCXsgcmV0dXJuIF9faXQuX01fY3VyID09IF9fdmljdGltLl9NX2N1cjsgfSk7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gX0Jhc2U6OmVyYXNlKF9faXQuYmFzZSgpKTsgCisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBpdGVyYXRvcihfX25leHQsIHRoaXMpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgcmV0dXJuIGVyYXNlKGNvbnN0X2l0ZXJhdG9yKF9faXQpKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCWZvciAoX0Jhc2VfY29uc3RfaXRlcmF0b3IgX190bXAgPSBfX2ZpcnN0LmJhc2UoKTsKKwkgICAgIF9fdG1wICE9IF9fbGFzdC5iYXNlKCk7ICsrX190bXApCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX3RtcCAhPSBfQmFzZTo6ZW5kKCksCisJCQkJICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZSkKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2ZpcnN0LCAiZmlyc3QiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fdG1wXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCQkJICAgIHsgcmV0dXJuIF9faXQgPT0gX190bXA7IH0pOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2xvY2FsX2lmKAorCQkJICAgIFtfX3RtcF0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCSAgICB7IHJldHVybiBfX2l0Ll9NX2N1ciA9PSBfX3RtcC5fTV9jdXI7IH0pOworCSAgfQorCXNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCV9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9CYXNlOjplcmFzZShfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSk7CisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBpdGVyYXRvcihfX25leHQsIHRoaXMpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBub2V4Y2VwdCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ludmFsaWRhdGVfbG9jYWxzKCkKKyAgICAgIHsKKwlfQmFzZV9sb2NhbF9pdGVyYXRvciBfX2xvY2FsX2VuZCA9IF9CYXNlOjplbmQoMCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9sb2NhbF9pZigKKwkJCVtfX2xvY2FsX2VuZF0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCXsgcmV0dXJuIF9faXQgIT0gX19sb2NhbF9lbmQ7IH0pOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2FsbCgpCisgICAgICB7CisJX0Jhc2VfaXRlcmF0b3IgX19lbmQgPSBfQmFzZTo6ZW5kKCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihbX19lbmRdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJCQl7IHJldHVybiBfX2l0ICE9IF9fZW5kOyB9KTsKKwlfTV9pbnZhbGlkYXRlX2xvY2FscygpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jaGVja19yZWhhc2hlZChzaXplX3R5cGUgX19wcmV2X2NvdW50KQorICAgICAgeworCWlmIChfX3ByZXZfY291bnQgIT0gdGhpcy0+YnVja2V0X2NvdW50KCkpCisJICBfTV9pbnZhbGlkYXRlX2xvY2FscygpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9iYXNlKCkgPT0gX195Ll9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisKKyAgLy8vIENsYXNzIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwIHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9IYXNoID0gc3RkOjpoYXNoPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfS2V5PiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX211bHRpbWFwCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OnVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLAorCQkJCQkJX1ByZWQsIF9BbGxvYz4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3Vub3JkZXJlZF9jb250YWluZXI8dW5vcmRlcmVkX211bHRpbWFwPF9LZXksCisJCQkJCQlfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6dW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsCisJCQkJCQkgX1ByZWQsIF9BbGxvYz4gX0Jhc2U7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyPHVub3JkZXJlZF9tdWx0aW1hcD4KKwlfU2FmZV9iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2xvY2FsX2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6bG9jYWxfaXRlcmF0b3IgX0Jhc2VfbG9jYWxfaXRlcmF0b3I7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV90eXBlICAgICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9pdGVyYXRvciwKKwkJCQkJICB1bm9yZGVyZWRfbXVsdGltYXA+IGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsCisJCQkJCSAgdW5vcmRlcmVkX211bHRpbWFwPiBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2xvY2FsX2l0ZXJhdG9yPAorCV9CYXNlX2xvY2FsX2l0ZXJhdG9yLCB1bm9yZGVyZWRfbXVsdGltYXA+IGxvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfbG9jYWxfaXRlcmF0b3I8CisJX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IsIHVub3JkZXJlZF9tdWx0aW1hcD4gY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkJIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdW5vcmRlcmVkX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgCisJCQkgICBzaXplX3R5cGUgX19uID0gMCwKKwkJCSAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLCAKKwkJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwgCisJCQkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19nbnVfZGVidWc6Ol9fY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwKKwkJCQkJCQkJICAgICBfX2xhc3QpKSwKKwkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpLCBfX24sCisJCV9faGYsIF9fZXFsLCBfX2EpIHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAoY29uc3QgdW5vcmRlcmVkX211bHRpbWFwJiBfX3gpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwKGNvbnN0IF9CYXNlJiBfX3gpIAorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAodW5vcmRlcmVkX211bHRpbWFwJiYgX194KSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJCSBzaXplX3R5cGUgX19uID0gMCwKKwkJCSBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7IH0KKworICAgICAgfnVub3JkZXJlZF9tdWx0aW1hcCgpIG5vZXhjZXB0IHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX211bHRpbWFwJiBfX3gpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3g7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfbXVsdGltYXAmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwlfX2dsaWJjeHhfY2hlY2tfc2VsZl9tb3ZlX2Fzc2lnbihfX3gpOworCWNsZWFyKCk7CisJc3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVub3JkZXJlZF9tdWx0aW1hcCYgX194KQorICAgICAgeworCV9CYXNlOjpzd2FwKF9feCk7CisJX1NhZmVfYmFzZTo6X01fc3dhcChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIG5vZXhjZXB0CisgICAgICB7CisJX0Jhc2U6OmNsZWFyKCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IgCisgICAgICBiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgLy8gbG9jYWwgdmVyc2lvbnMKKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19iKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fYikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKF9CYXNlOjplbmQoX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGVuZChzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmVuZChfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgY2JlZ2luKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfQmFzZTo6Y2JlZ2luKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjZW5kKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfQmFzZTo6Y2VuZChfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBfQmFzZTo6YnVja2V0X3NpemUoX19iKTsKKyAgICAgIH0KKworICAgICAgZmxvYXQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfQmFzZTo6bWF4X2xvYWRfZmFjdG9yKCk7IH0KKworICAgICAgdm9pZAorICAgICAgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9fZikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbWF4X2xvYWRfZmFjdG9yKF9fZik7CisJX0Jhc2U6Om1heF9sb2FkX2ZhY3RvcihfX2YpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJICBfQmFzZV9pdGVyYXRvciBfX2l0CisJICAgID0gX0Jhc2U6OmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIF9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwkgIHJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX2hpbnQpOworCSAgc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJICBfQmFzZV9pdGVyYXRvciBfX2l0ID0gX0Jhc2U6OmVtcGxhY2VfaGludChfX2hpbnQuYmFzZSgpLAorCQkJCQlzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9faXQsIHRoaXMpOworCX0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX2l0ID0gX0Jhc2U6Omluc2VydChfX29iaik7CisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX2l0ID0gX0Jhc2U6Omluc2VydChfX2hpbnQuYmFzZSgpLCBfX29iaik7CisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKwlpdGVyYXRvcgorCWluc2VydChfUGFpciYmIF9fb2JqKQorCXsKKwkgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgX0Jhc2VfaXRlcmF0b3IgX19pdCA9IF9CYXNlOjppbnNlcnQoc3RkOjpmb3J3YXJkPF9QYWlyPihfX29iaikpOworCSAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9faXQsIHRoaXMpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKwlpdGVyYXRvcgorCWluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIF9QYWlyJiYgX19vYmopCisJeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX2hpbnQpOworCSAgc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJICBfQmFzZV9pdGVyYXRvciBfX2l0ID0KKwkgICAgX0Jhc2U6Omluc2VydChfX2hpbnQuYmFzZSgpLCBzdGQ6OmZvcndhcmQ8X1BhaXI+KF9fb2JqKSk7CisJICBfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJICByZXR1cm4gaXRlcmF0b3IoX19pdCwgdGhpcyk7CisJfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgX0Jhc2U6Omluc2VydChfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXZvaWQKKwlpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJICBfQmFzZTo6aW5zZXJ0KF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCSAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCX0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX19rZXkpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZmluZChfX2tleSksIHRoaXMpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19yZXMgPQorCSAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9fa2V5KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLCBfQmFzZV9jb25zdF9pdGVyYXRvcj4gX19yZXMgPQorCSAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9fa2V5KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeworCXNpemVfdHlwZSBfX3JldCgwKTsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3BhaXIgPQorCSAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9fa2V5KTsKKwlmb3IgKF9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX19wYWlyLmZpcnN0OyBfX3ZpY3RpbSAhPSBfX3BhaXIuc2Vjb25kOykKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihbX192aWN0aW1dKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJCQkgICAgeyByZXR1cm4gX19pdCA9PSBfX3ZpY3RpbTsgfSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfbG9jYWxfaWYoCisJCQkgICAgW19fdmljdGltXShfQmFzZV9jb25zdF9sb2NhbF9pdGVyYXRvciBfX2l0KQorCQkJICAgIHsgcmV0dXJuIF9faXQuX01fY3VyID09IF9fdmljdGltLl9NX2N1cjsgfSk7CisJICAgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSsrKTsKKwkgICAgKytfX3JldDsKKwkgIH0KKwlfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19pdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX19pdCk7CisJX0Jhc2VfY29uc3RfaXRlcmF0b3IgX192aWN0aW0gPSBfX2l0LmJhc2UoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKFtfX3ZpY3RpbV0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkJCXsgcmV0dXJuIF9faXQgPT0gX192aWN0aW07IH0pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfbG9jYWxfaWYoCisJCQlbX192aWN0aW1dKF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yIF9faXQpCisJCQl7IHJldHVybiBfX2l0Ll9NX2N1ciA9PSBfX3ZpY3RpbS5fTV9jdXI7IH0pOworCXNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCV9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9CYXNlOjplcmFzZShfX2l0LmJhc2UoKSk7CisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBpdGVyYXRvcihfX25leHQsIHRoaXMpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgcmV0dXJuIGVyYXNlKGNvbnN0X2l0ZXJhdG9yKF9faXQpKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCWZvciAoX0Jhc2VfY29uc3RfaXRlcmF0b3IgX190bXAgPSBfX2ZpcnN0LmJhc2UoKTsKKwkgICAgIF9fdG1wICE9IF9fbGFzdC5iYXNlKCk7ICsrX190bXApCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX3RtcCAhPSBfQmFzZTo6ZW5kKCksCisJCQkJICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZSkKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2ZpcnN0LCAiZmlyc3QiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fdG1wXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCQkJICAgIHsgcmV0dXJuIF9faXQgPT0gX190bXA7IH0pOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2xvY2FsX2lmKAorCQkJICAgIFtfX3RtcF0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCSAgICB7IHJldHVybiBfX2l0Ll9NX2N1ciA9PSBfX3RtcC5fTV9jdXI7IH0pOworCSAgfQorCXNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCV9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9CYXNlOjplcmFzZShfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSk7CisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBpdGVyYXRvcihfX25leHQsIHRoaXMpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBub2V4Y2VwdCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ludmFsaWRhdGVfbG9jYWxzKCkKKyAgICAgIHsKKwlfQmFzZV9sb2NhbF9pdGVyYXRvciBfX2xvY2FsX2VuZCA9IF9CYXNlOjplbmQoMCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9sb2NhbF9pZigKKwkJCVtfX2xvY2FsX2VuZF0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCXsgcmV0dXJuIF9faXQgIT0gX19sb2NhbF9lbmQ7IH0pOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2FsbCgpCisgICAgICB7CisJX0Jhc2VfaXRlcmF0b3IgX19lbmQgPSBfQmFzZTo6ZW5kKCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihbX19lbmRdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJCQl7IHJldHVybiBfX2l0ICE9IF9fZW5kOyB9KTsKKwlfTV9pbnZhbGlkYXRlX2xvY2FscygpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jaGVja19yZWhhc2hlZChzaXplX3R5cGUgX19wcmV2X2NvdW50KQorICAgICAgeworCWlmIChfX3ByZXZfY291bnQgIT0gdGhpcy0+YnVja2V0X2NvdW50KCkpCisJICBfTV9pbnZhbGlkYXRlX2xvY2FscygpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2Jhc2UoKSA9PSBfX3kuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX2RlYnVnCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy91bm9yZGVyZWRfc2V0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy91bm9yZGVyZWRfc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlODhhZGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3Vub3JkZXJlZF9zZXQKQEAgLTAsMCArMSw4ODUgQEAKKy8vIERlYnVnZ2luZyB1bm9yZGVyZWRfc2V0L3Vub3JkZXJlZF9tdWx0aXNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvdW5vcmRlcmVkX3NldAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfVU5PUkRFUkVEX1NFVAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19VTk9SREVSRURfU0VUIDEKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3Vub3JkZXJlZF9jb250YWluZXIuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9sb2NhbF9pdGVyYXRvci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX2RlYnVnCit7CisgIC8vLyBDbGFzcyBzdGQ6OnVub3JkZXJlZF9zZXQgd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0hhc2ggPSBzdGQ6Omhhc2g8X1ZhbHVlPiwKKwkgICB0eXBlbmFtZSBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X1ZhbHVlPiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVmFsdWU+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfc2V0CisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OnVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3Vub3JkZXJlZF9jb250YWluZXI8dW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLAorCQkJCQkJICAgICAgIF9QcmVkLCBfQWxsb2M+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjp1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsCisJCQkJCSAgICBfUHJlZCwgX0FsbG9jPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX3Vub3JkZXJlZF9jb250YWluZXI8dW5vcmRlcmVkX3NldD4gX1NhZmVfYmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9sb2NhbF9pdGVyYXRvciBfQmFzZV9jb25zdF9sb2NhbF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmxvY2FsX2l0ZXJhdG9yIF9CYXNlX2xvY2FsX2l0ZXJhdG9yOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfdHlwZSAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfaXRlcmF0b3IsCisJCQkJCSAgdW5vcmRlcmVkX3NldD4gaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9jb25zdF9pdGVyYXRvciwKKwkJCQkJICB1bm9yZGVyZWRfc2V0PiBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9CYXNlX2xvY2FsX2l0ZXJhdG9yLAorCQkJCQkgIHVub3JkZXJlZF9zZXQ+IGxvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfbG9jYWxfaXRlcmF0b3I8X0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IsCisJCQkJCSAgdW5vcmRlcmVkX3NldD4gY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfc2V0KHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19oZiwgX19lcWwsIF9fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB1bm9yZGVyZWRfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgCisJCSAgICAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwgCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwgCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LAorCQkJCQkJCQkgICAgIF9fbGFzdCkpLAorCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksIF9fbiwKKwkJX19oZiwgX19lcWwsIF9fYSkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9zZXQoY29uc3QgdW5vcmRlcmVkX3NldCYgX194KSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9zZXQoY29uc3QgX0Jhc2UmIF9feCkgCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9zZXQodW5vcmRlcmVkX3NldCYmIF9feCkgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkgICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkgeyB9CisKKyAgICAgIH51bm9yZGVyZWRfc2V0KCkgbm9leGNlcHQgeyB9CisKKyAgICAgIHVub3JkZXJlZF9zZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX3NldCYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB1bm9yZGVyZWRfc2V0JgorICAgICAgb3BlcmF0b3I9KHVub3JkZXJlZF9zZXQmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwlfX2dsaWJjeHhfY2hlY2tfc2VsZl9tb3ZlX2Fzc2lnbihfX3gpOworCWNsZWFyKCk7CisJc3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX3NldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3dhcCh1bm9yZGVyZWRfc2V0JiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnN3YXAoX194KTsKKwlfU2FmZV9iYXNlOjpfTV9zd2FwKF9feCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgbm9leGNlcHQKKyAgICAgIHsKKwlfQmFzZTo6Y2xlYXIoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisgICAgICBpdGVyYXRvciAKKyAgICAgIGJlZ2luKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICAvLyBsb2NhbCB2ZXJzaW9ucworICAgICAgbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX2IpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBsb2NhbF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgbG9jYWxfaXRlcmF0b3IKKyAgICAgIGVuZChzaXplX3R5cGUgX19iKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmVuZChfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgYmVnaW4oc2l6ZV90eXBlIF9fYikgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKF9CYXNlOjpiZWdpbihfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfQmFzZTo6ZW5kKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjYmVnaW4oc2l6ZV90eXBlIF9fYikgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKF9CYXNlOjpjYmVnaW4oX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGNlbmQoc2l6ZV90eXBlIF9fYikgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKF9CYXNlOjpjZW5kKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X3NpemUoc2l6ZV90eXBlIF9fYikgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIF9CYXNlOjpidWNrZXRfc2l6ZShfX2IpOworICAgICAgfQorCisgICAgICBmbG9hdAorICAgICAgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9CYXNlOjptYXhfbG9hZF9mYWN0b3IoKTsgfQorCisgICAgICB2b2lkCisgICAgICBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX19mKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19tYXhfbG9hZF9mYWN0b3IoX19mKTsKKwlfQmFzZTo6bWF4X2xvYWRfZmFjdG9yKF9fZik7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcworCSAgICA9IF9CYXNlOjplbXBsYWNlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICBfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLCBfX3Jlcy5zZWNvbmQpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9faGludCk7CisJICBzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwkgIF9CYXNlX2l0ZXJhdG9yIF9faXQgPSBfQmFzZTo6ZW1wbGFjZV9oaW50KF9faGludC5iYXNlKCksCisJCQkJCXN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICBfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJICByZXR1cm4gaXRlcmF0b3IoX19pdCwgdGhpcyk7CisJfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJdHlwZWRlZiBzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcGFpcl90eXBlOworCSAgX19wYWlyX3R5cGUgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9fb2JqKTsKKwlfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwgX19yZXMuc2Vjb25kKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX2l0ID0gX0Jhc2U6Omluc2VydChfX2hpbnQuYmFzZSgpLCBfX29iaik7CisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX29iaikKKyAgICAgIHsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwl0eXBlZGVmIHN0ZDo6cGFpcjx0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IsIGJvb2w+IF9fcGFpcl90eXBlOworCSAgX19wYWlyX3R5cGUgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KHN0ZDo6bW92ZShfX29iaikpOworCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLCBfX3Jlcy5zZWNvbmQpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgdmFsdWVfdHlwZSYmIF9fb2JqKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX2l0ID0gX0Jhc2U6Omluc2VydChfX2hpbnQuYmFzZSgpLCBzdGQ6Om1vdmUoX19vYmopKTsKKwlfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9faXQsIHRoaXMpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZTo6aW5zZXJ0KF9fbCk7CisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl2b2lkCisJaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwkgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgX0Jhc2U6Omluc2VydChfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwkgIF9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwl9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpmaW5kKF9fa2V5KSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX19rZXkpLCB0aGlzKTsgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeworCXR5cGVkZWYgc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19wYWlyX3R5cGU7CisJX19wYWlyX3R5cGUgX19yZXMgPSBfQmFzZTo6ZXF1YWxfcmFuZ2UoX19rZXkpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkgICAgICBpdGVyYXRvcihfX3Jlcy5zZWNvbmQsIHRoaXMpKTsKKyAgICAgIH0KKworICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfY29uc3RfaXRlcmF0b3IsIF9CYXNlX2NvbnN0X2l0ZXJhdG9yPgorCSAgX19yZXMgPSBfQmFzZTo6ZXF1YWxfcmFuZ2UoX19rZXkpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihjb25zdF9pdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkgICAgICBjb25zdF9pdGVyYXRvcihfX3Jlcy5zZWNvbmQsIHRoaXMpKTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7CisJc2l6ZV90eXBlIF9fcmV0KDApOworCV9CYXNlX2l0ZXJhdG9yIF9fdmljdGltKF9CYXNlOjpmaW5kKF9fa2V5KSk7CisJaWYgKF9fdmljdGltICE9IF9CYXNlOjplbmQoKSkKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZigKKwkJCSAgICBbX192aWN0aW1dKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJCQkgICAgeyByZXR1cm4gX19pdCA9PSBfX3ZpY3RpbTsgfSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfbG9jYWxfaWYoCisJCQkgICAgW19fdmljdGltXShfQmFzZV9jb25zdF9sb2NhbF9pdGVyYXRvciBfX2l0KQorCQkJICAgIHsgcmV0dXJuIF9faXQuX01fY3VyID09IF9fdmljdGltLl9NX2N1cjsgfSk7CisJICAgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgICBfQmFzZTo6ZXJhc2UoX192aWN0aW0pOworCSAgICBfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJICAgIF9fcmV0ID0gMTsKKwkgIH0KKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2l0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX2l0KTsKKwlfQmFzZV9jb25zdF9pdGVyYXRvciBfX3ZpY3RpbSA9IF9faXQuYmFzZSgpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoCisJCQlbX192aWN0aW1dKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJCQl7IHJldHVybiBfX2l0ID09IF9fdmljdGltOyB9KTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2xvY2FsX2lmKAorCQkJW19fdmljdGltXShfQmFzZV9jb25zdF9sb2NhbF9pdGVyYXRvciBfX2l0KQorCQkJeyByZXR1cm4gX19pdC5fTV9jdXIgPT0gX192aWN0aW0uX01fY3VyOyB9KTsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX25leHQgPSBfQmFzZTo6ZXJhc2UoX19pdC5iYXNlKCkpOworCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19uZXh0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBlcmFzZShjb25zdF9pdGVyYXRvcihfX2l0KSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdG1wID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3RtcCAhPSBfX2xhc3QuYmFzZSgpOyArK19fdG1wKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX190bXAgIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKAorCQkJICAgIFtfX3RtcF0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkJCSAgICB7IHJldHVybiBfX2l0ID09IF9fdG1wOyB9KTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9sb2NhbF9pZigKKwkJCSAgICBbX190bXBdKF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yIF9faXQpCisJCQkgICAgeyByZXR1cm4gX19pdC5fTV9jdXIgPT0gX190bXAuX01fY3VyOyB9KTsKKwkgIH0KKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX25leHQgPSBfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksCisJCQkJCSAgICAgX19sYXN0LmJhc2UoKSk7CisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBpdGVyYXRvcihfX25leHQsIHRoaXMpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBub2V4Y2VwdCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ludmFsaWRhdGVfbG9jYWxzKCkKKyAgICAgIHsKKwlfQmFzZV9sb2NhbF9pdGVyYXRvciBfX2xvY2FsX2VuZCA9IF9CYXNlOjplbmQoMCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9sb2NhbF9pZigKKwkJCVtfX2xvY2FsX2VuZF0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCXsgcmV0dXJuIF9faXQgIT0gX19sb2NhbF9lbmQ7IH0pOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2FsbCgpCisgICAgICB7CisJX0Jhc2VfaXRlcmF0b3IgX19lbmQgPSBfQmFzZTo6ZW5kKCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZigKKwkJCVtfX2VuZF0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkJCXsgcmV0dXJuIF9faXQgIT0gX19lbmQ7IH0pOworCV9NX2ludmFsaWRhdGVfbG9jYWxzKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NoZWNrX3JlaGFzaGVkKHNpemVfdHlwZSBfX3ByZXZfY291bnQpCisgICAgICB7CisJaWYgKF9fcHJldl9jb3VudCAhPSB0aGlzLT5idWNrZXRfY291bnQoKSkKKwkgIF9NX2ludmFsaWRhdGVfbG9jYWxzKCk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fYmFzZSgpID09IF9feS5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKworICAvLy8gQ2xhc3Mgc3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQgd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0hhc2ggPSBzdGQ6Omhhc2g8X1ZhbHVlPiwKKwkgICB0eXBlbmFtZSBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X1ZhbHVlPiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVmFsdWU+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfbXVsdGlzZXQKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6dW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyPAorCQl1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OnVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLAorCQkJCQkJIF9QcmVkLCBfQWxsb2M+IF9CYXNlOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lcjx1bm9yZGVyZWRfbXVsdGlzZXQ+CisJCV9TYWZlX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfbG9jYWxfaXRlcmF0b3IgX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpsb2NhbF9pdGVyYXRvciBfQmFzZV9sb2NhbF9pdGVyYXRvcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X3R5cGUgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLAorCQkJCQkgIHVub3JkZXJlZF9tdWx0aXNldD4gaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9jb25zdF9pdGVyYXRvciwKKwkJCQkJICB1bm9yZGVyZWRfbXVsdGlzZXQ+IGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfbG9jYWxfaXRlcmF0b3I8CisJX0Jhc2VfbG9jYWxfaXRlcmF0b3IsIHVub3JkZXJlZF9tdWx0aXNldD4gbG9jYWxfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9sb2NhbF9pdGVyYXRvcjwKKwlfQmFzZV9jb25zdF9sb2NhbF9pdGVyYXRvciwgdW5vcmRlcmVkX211bHRpc2V0PiBjb25zdF9sb2NhbF9pdGVyYXRvcjsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgCisJCQkgICBzaXplX3R5cGUgX19uID0gMCwKKwkJCSAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLCAKKwkJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwgCisJCQkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19nbnVfZGVidWc6Ol9fY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwKKwkJCQkJCQkJICAgICBfX2xhc3QpKSwKKwkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpLCBfX24sCisJCV9faGYsIF9fZXFsLCBfX2EpIHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoY29uc3QgdW5vcmRlcmVkX211bHRpc2V0JiBfX3gpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX211bHRpc2V0KGNvbnN0IF9CYXNlJiBfX3gpIAorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQodW5vcmRlcmVkX211bHRpc2V0JiYgX194KSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJCSBzaXplX3R5cGUgX19uID0gMCwKKwkJCSBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7IH0KKworICAgICAgfnVub3JkZXJlZF9tdWx0aXNldCgpIG5vZXhjZXB0IHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX211bHRpc2V0JiBfX3gpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3g7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfbXVsdGlzZXQmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisgICAgICAgIC8vIE5COiBEUiA2NzUuCisJX19nbGliY3h4X2NoZWNrX3NlbGZfbW92ZV9hc3NpZ24oX194KTsKKwljbGVhcigpOworCXN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGlzZXQmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6c3dhcChfX3gpOworCV9TYWZlX2Jhc2U6Ol9NX3N3YXAoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBub2V4Y2VwdAorICAgICAgeworCV9CYXNlOjpjbGVhcigpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgLy8gbG9jYWwgdmVyc2lvbnMKKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19iKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fYikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKF9CYXNlOjplbmQoX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGVuZChzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmVuZChfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgY2JlZ2luKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfQmFzZTo6Y2JlZ2luKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjZW5kKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfQmFzZTo6Y2VuZChfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBfQmFzZTo6YnVja2V0X3NpemUoX19iKTsKKyAgICAgIH0KKworICAgICAgZmxvYXQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfQmFzZTo6bWF4X2xvYWRfZmFjdG9yKCk7IH0KKworICAgICAgdm9pZAorICAgICAgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9fZikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbWF4X2xvYWRfZmFjdG9yKF9fZik7CisJX0Jhc2U6Om1heF9sb2FkX2ZhY3RvcihfX2YpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJICBfQmFzZV9pdGVyYXRvciBfX2l0CisJICAgID0gX0Jhc2U6OmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIF9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwkgIHJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX2hpbnQpOworCSAgc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJICBfQmFzZV9pdGVyYXRvciBfX2l0ID0gX0Jhc2U6OmVtcGxhY2VfaGludChfX2hpbnQuYmFzZSgpLAorCQkJCQlzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9faXQsIHRoaXMpOworCX0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX2l0ID0gX0Jhc2U6Omluc2VydChfX29iaik7CisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX2l0ID0gX0Jhc2U6Omluc2VydChfX2hpbnQuYmFzZSgpLCBfX29iaik7IAorCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19pdCwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9fb2JqKQorICAgICAgeworCXNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCV9CYXNlX2l0ZXJhdG9yIF9faXQgPSBfQmFzZTo6aW5zZXJ0KHN0ZDo6bW92ZShfX29iaikpOyAKKwlfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9faXQsIHRoaXMpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgdmFsdWVfdHlwZSYmIF9fb2JqKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX2l0ID0gX0Jhc2U6Omluc2VydChfX2hpbnQuYmFzZSgpLCBzdGQ6Om1vdmUoX19vYmopKTsgCisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2U6Omluc2VydChfX2wpOworCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdm9pZAorCWluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisJeworCSAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwkgIF9CYXNlOjppbnNlcnQoX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJICBfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZmluZChfX2tleSksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpmaW5kKF9fa2V5KSwgdGhpcyk7IH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsKKwl0eXBlZGVmIHN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcGFpcl90eXBlOworCV9fcGFpcl90eXBlIF9fcmVzID0gX0Jhc2U6OmVxdWFsX3JhbmdlKF9fa2V5KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLCBfQmFzZV9jb25zdF9pdGVyYXRvcj4KKwkgIF9fcmVzID0gX0Jhc2U6OmVxdWFsX3JhbmdlKF9fa2V5KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeworCXNpemVfdHlwZSBfX3JldCgwKTsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3BhaXIgPQorCSAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9fa2V5KTsKKwlmb3IgKF9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX19wYWlyLmZpcnN0OyBfX3ZpY3RpbSAhPSBfX3BhaXIuc2Vjb25kOykKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihbX192aWN0aW1dKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJCQkgICAgeyByZXR1cm4gX19pdCA9PSBfX3ZpY3RpbTsgfSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfbG9jYWxfaWYoCisJCQkgICAgW19fdmljdGltXShfQmFzZV9jb25zdF9sb2NhbF9pdGVyYXRvciBfX2l0KQorCQkJICAgIHsgcmV0dXJuIF9faXQuX01fY3VyID09IF9fdmljdGltLl9NX2N1cjsgfSk7CisJICAgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSsrKTsKKwkgICAgKytfX3JldDsKKwkgIH0KKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2l0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX2l0KTsKKwlfQmFzZV9jb25zdF9pdGVyYXRvciBfX3ZpY3RpbSA9IF9faXQuYmFzZSgpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fdmljdGltXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCQkJeyByZXR1cm4gX19pdCA9PSBfX3ZpY3RpbTsgfSk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9sb2NhbF9pZigKKwkJCVtfX3ZpY3RpbV0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCXsgcmV0dXJuIF9faXQuX01fY3VyID09IF9fdmljdGltLl9NX2N1cjsgfSk7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX2l0LmJhc2UoKSksIHRoaXMpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgcmV0dXJuIGVyYXNlKGNvbnN0X2l0ZXJhdG9yKF9faXQpKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCWZvciAoX0Jhc2VfY29uc3RfaXRlcmF0b3IgX190bXAgPSBfX2ZpcnN0LmJhc2UoKTsKKwkgICAgIF9fdG1wICE9IF9fbGFzdC5iYXNlKCk7ICsrX190bXApCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX3RtcCAhPSBfQmFzZTo6ZW5kKCksCisJCQkJICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZSkKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2ZpcnN0LCAiZmlyc3QiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fdG1wXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCQkJICAgIHsgcmV0dXJuIF9faXQgPT0gX190bXA7IH0pOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2xvY2FsX2lmKAorCQkJICAgIFtfX3RtcF0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCSAgICB7IHJldHVybiBfX2l0Ll9NX2N1ciA9PSBfX3RtcC5fTV9jdXI7IH0pOworCSAgfQorCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksCisJCQkJICAgICBfX2xhc3QuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIG5vZXhjZXB0ICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9sb2NhbHMoKQorICAgICAgeworCV9CYXNlX2xvY2FsX2l0ZXJhdG9yIF9fbG9jYWxfZW5kID0gX0Jhc2U6OmVuZCgwKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2xvY2FsX2lmKAorCQkJW19fbG9jYWxfZW5kXShfQmFzZV9jb25zdF9sb2NhbF9pdGVyYXRvciBfX2l0KQorCQkJeyByZXR1cm4gX19pdCAhPSBfX2xvY2FsX2VuZDsgfSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ludmFsaWRhdGVfYWxsKCkKKyAgICAgIHsKKwlfQmFzZV9pdGVyYXRvciBfX2VuZCA9IF9CYXNlOjplbmQoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKFtfX2VuZF0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkJCXsgcmV0dXJuIF9faXQgIT0gX19lbmQ7IH0pOworCV9NX2ludmFsaWRhdGVfbG9jYWxzKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NoZWNrX3JlaGFzaGVkKHNpemVfdHlwZSBfX3ByZXZfY291bnQpCisgICAgICB7CisJaWYgKF9fcHJldl9jb3VudCAhPSB0aGlzLT5idWNrZXRfY291bnQoKSkKKwkgIF9NX2ludmFsaWRhdGVfbG9jYWxzKCk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9iYXNlKCkgPT0gX195Ll9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fZGVidWcKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3ZlY3RvciBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvdmVjdG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzM2ODYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3ZlY3RvcgpAQCAtMCwwICsxLDY1NSBAQAorLy8gRGVidWdnaW5nIHZlY3RvciBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvdmVjdG9yCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19WRUNUT1IKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfVkVDVE9SIDEKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfc2VxdWVuY2UuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2l0ZXJhdG9yLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fZGVidWcKK3sKKyAgLy8vIENsYXNzIHN0ZDo6dmVjdG9yIHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyB2ZWN0b3IKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6dmVjdG9yPF9UcCwgX0FsbG9jYXRvcj4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPHZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiBfQmFzZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9FcXVhbF90bzxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX0VxdWFsOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fYWxsb2NfdHJhaXRzPF9BbGxvY2F0b3I+ICBfQWxsb2NfdHJhaXRzOworI2VuZGlmCisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfaXRlcmF0b3IsdmVjdG9yPgorICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9jb25zdF9pdGVyYXRvcix2ZWN0b3I+CisgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1RwCQkJCSAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIDIzLjIuNC4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdAorICAgICAgdmVjdG9yKGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19hKSwgX01fZ3VhcmFudGVlZF9jYXBhY2l0eSgwKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGV4cGxpY2l0CisgICAgICB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX24sIF9fYSksIF9NX2d1YXJhbnRlZWRfY2FwYWNpdHkoX19uKSB7IH0KKworICAgICAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSwKKwkgICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpLCBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5KF9fbikgeyB9CisjZWxzZQorICAgICAgZXhwbGljaXQKKyAgICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUgPSBfVHAoKSwKKwkgICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpLCBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5KF9fbikgeyB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgICAgOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgICAgX19sYXN0KSksCisJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSwgX19hKSwKKwkgIF9NX2d1YXJhbnRlZWRfY2FwYWNpdHkoMCkKKyAgICAgICAgeyBfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOyB9CisKKyAgICAgIHZlY3Rvcihjb25zdCB2ZWN0b3ImIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSwgX01fZ3VhcmFudGVlZF9jYXBhY2l0eShfX3guc2l6ZSgpKSB7IH0KKworICAgICAgLy8vIENvbnN0cnVjdGlvbiBmcm9tIGEgcmVsZWFzZS1tb2RlIHZlY3RvcgorICAgICAgdmVjdG9yKGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCksIF9NX2d1YXJhbnRlZWRfY2FwYWNpdHkoX194LnNpemUoKSkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2ZWN0b3IodmVjdG9yJiYgX194KSBub2V4Y2VwdAorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSksCisJX01fZ3VhcmFudGVlZF9jYXBhY2l0eSh0aGlzLT5zaXplKCkpCisgICAgICB7CisJdGhpcy0+X01fc3dhcChfX3gpOworCV9feC5fTV9ndWFyYW50ZWVkX2NhcGFjaXR5ID0gMDsKKyAgICAgIH0KKworICAgICAgdmVjdG9yKGNvbnN0IHZlY3RvciYgX194LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfQmFzZShfX3gsIF9fYSksIF9NX2d1YXJhbnRlZWRfY2FwYWNpdHkoX194LnNpemUoKSkgeyB9CisKKyAgICAgIHZlY3Rvcih2ZWN0b3ImJiBfX3gsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpLCBfX2EpLAorICAgICAgICBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5KHRoaXMtPnNpemUoKSkKKyAgICAgIHsKKwlfX3guX01faW52YWxpZGF0ZV9hbGwoKTsKKwlfX3guX01fZ3VhcmFudGVlZF9jYXBhY2l0eSA9IDA7CisgICAgICB9CisKKyAgICAgIHZlY3Rvcihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fYSksCisJX01fZ3VhcmFudGVlZF9jYXBhY2l0eShfX2wuc2l6ZSgpKSB7IH0KKyNlbmRpZgorCisgICAgICB+dmVjdG9yKCkgX0dMSUJDWFhfTk9FWENFUFQgeyB9CisKKyAgICAgIHZlY3RvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB2ZWN0b3ImIF9feCkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdmVjdG9yJgorICAgICAgb3BlcmF0b3I9KHZlY3RvciYmIF9feCkgbm9leGNlcHQoX0FsbG9jX3RyYWl0czo6X1Nfbm90aHJvd19tb3ZlKCkpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX3NlbGZfbW92ZV9hc3NpZ24oX194KTsKKwlfQmFzZTo6b3BlcmF0b3I9KHN0ZDo6bW92ZShfX3gpKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisJX194Ll9NX2ludmFsaWRhdGVfYWxsKCk7CisJX194Ll9NX2d1YXJhbnRlZWRfY2FwYWNpdHkgPSAwOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdmVjdG9yJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX19sOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIHZvaWQKKyAgICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBfQmFzZTo6YXNzaWduKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwkgIF9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisJfQorCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3UpCisgICAgICB7CisJX0Jhc2U6OmFzc2lnbihfX24sIF9fdSk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9CYXNlOjphc3NpZ24oX19sKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisKKyAgICAgIC8vIGl0ZXJhdG9yczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyAyMy4yLjQuMiBjYXBhY2l0eToKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6KQorICAgICAgeworCWJvb2wgX19yZWFsbG9jID0gX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKF9fc3opOworCWlmIChfX3N6IDwgdGhpcy0+c2l6ZSgpKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hZnRlcl9udGgoX19zeik7CisJX0Jhc2U6OnJlc2l6ZShfX3N6KTsKKwlpZiAoX19yZWFsbG9jKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIGNvbnN0IF9UcCYgX19jKQorICAgICAgeworCWJvb2wgX19yZWFsbG9jID0gX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKF9fc3opOworCWlmIChfX3N6IDwgdGhpcy0+c2l6ZSgpKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hZnRlcl9udGgoX19zeik7CisJX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOworCWlmIChfX3JlYWxsb2MpCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBfVHAgX19jID0gX1RwKCkpCisgICAgICB7CisJYm9vbCBfX3JlYWxsb2MgPSBfTV9yZXF1aXJlc19yZWFsbG9jYXRpb24oX19zeik7CisJaWYgKF9fc3ogPCB0aGlzLT5zaXplKCkpCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FmdGVyX250aChfX3N6KTsKKwlfQmFzZTo6cmVzaXplKF9fc3osIF9fYyk7CisJaWYgKF9fcmVhbGxvYykKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsKKyAgICAgIH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgc2hyaW5rX3RvX2ZpdCgpCisgICAgICB7CisJaWYgKF9CYXNlOjpfTV9zaHJpbmtfdG9fZml0KCkpCisJICB7CisJICAgIF9NX2d1YXJhbnRlZWRfY2FwYWNpdHkgPSBfQmFzZTo6Y2FwYWNpdHkoKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNhcGFjaXR5KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9ERUJVR19QRURBTlRJQworCXJldHVybiBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5OworI2Vsc2UKKwlyZXR1cm4gX0Jhc2U6OmNhcGFjaXR5KCk7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworCisgICAgICB2b2lkCisgICAgICByZXNlcnZlKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJYm9vbCBfX3JlYWxsb2MgPSBfTV9yZXF1aXJlc19yZWFsbG9jYXRpb24oX19uKTsKKwlfQmFzZTo6cmVzZXJ2ZShfX24pOworCWlmIChfX24gPiBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5KQorCSAgX01fZ3VhcmFudGVlZF9jYXBhY2l0eSA9IF9fbjsKKwlpZiAoX19yZWFsbG9jKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfc3Vic2NyaXB0KF9fbik7CisJcmV0dXJuIF9NX2Jhc2UoKVtfX25dOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfc3Vic2NyaXB0KF9fbik7CisJcmV0dXJuIF9NX2Jhc2UoKVtfX25dOworICAgICAgfQorCisgICAgICB1c2luZyBfQmFzZTo6YXQ7CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6ZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIGJhY2soKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6YmFjaygpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6YmFjaygpOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA0NjQuIFN1Z2dlc3Rpb24gZm9yIG5ldyBtZW1iZXIgZnVuY3Rpb25zIGluIHN0YW5kYXJkIGNvbnRhaW5lcnMuCisgICAgICB1c2luZyBfQmFzZTo6ZGF0YTsKKworICAgICAgLy8gMjMuMi40LjMgbW9kaWZpZXJzOgorICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKGNvbnN0IF9UcCYgX194KQorICAgICAgeworCWJvb2wgX19yZWFsbG9jID0gX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKHRoaXMtPnNpemUoKSArIDEpOworCV9CYXNlOjpwdXNoX2JhY2soX194KTsKKwlpZiAoX19yZWFsbG9jKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwID0gX1RwPgorICAgICAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPCFzdGQ6Ol9fYXJlX3NhbWU8X1VwLCBib29sPjo6X192YWx1ZSwKKwkJCQkJdm9pZD46Ol9fdHlwZQorICAgICAgICBwdXNoX2JhY2soX1RwJiYgX194KQorCXsgZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlX2JhY2soX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgYm9vbCBfX3JlYWxsb2MgPSBfTV9yZXF1aXJlc19yZWFsbG9jYXRpb24odGhpcy0+c2l6ZSgpICsgMSk7CisJICBfQmFzZTo6ZW1wbGFjZV9iYWNrKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICBpZiAoX19yZWFsbG9jKQorCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCSAgX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsKKwl9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgcG9wX2JhY2soKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKC0tX0Jhc2U6OmVuZCgpKSk7CisJX0Jhc2U6OnBvcF9iYWNrKCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCSAgYm9vbCBfX3JlYWxsb2MgPSBfTV9yZXF1aXJlc19yZWFsbG9jYXRpb24odGhpcy0+c2l6ZSgpICsgMSk7CisJICBkaWZmZXJlbmNlX3R5cGUgX19vZmZzZXQgPSBfX3Bvc2l0aW9uLmJhc2UoKSAtIF9CYXNlOjpiZWdpbigpOworCSAgX0Jhc2VfaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZW1wbGFjZShfX3Bvc2l0aW9uLmJhc2UoKSwKKwkJCQkJCXN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICBpZiAoX19yZWFsbG9jKQorCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCSAgZWxzZQorCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FmdGVyX250aChfX29mZnNldCk7CisJICBfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKwl9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCWJvb2wgX19yZWFsbG9jID0gX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKHRoaXMtPnNpemUoKSArIDEpOworCWRpZmZlcmVuY2VfdHlwZSBfX29mZnNldCA9IF9fcG9zaXRpb24uYmFzZSgpIC0gX0Jhc2U6OmJlZ2luKCk7CisJX0Jhc2VfaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX3gpOworCWlmIChfX3JlYWxsb2MpCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCWVsc2UKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fb2Zmc2V0KTsKKwlfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworCXJldHVybiBpdGVyYXRvcihfX3JlcywgdGhpcyk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAgPSBfVHA+CisgICAgICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8IXN0ZDo6X19hcmVfc2FtZTxfVXAsIGJvb2w+OjpfX3ZhbHVlLAorCQkJCQlpdGVyYXRvcj46Ol9fdHlwZQorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX1RwJiYgX194KQorICAgICAgICB7IHJldHVybiBlbXBsYWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IHRoaXMtPmluc2VydChfX3Bvc2l0aW9uLCBfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCWJvb2wgX19yZWFsbG9jID0gX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKHRoaXMtPnNpemUoKSArIF9fbik7CisJZGlmZmVyZW5jZV90eXBlIF9fb2Zmc2V0ID0gX19wb3NpdGlvbi5iYXNlKCkgLSBfQmFzZTo6YmVnaW4oKTsKKwlfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX24sIF9feCk7CisJaWYgKF9fcmVhbGxvYykKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJZWxzZQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hZnRlcl9udGgoX19vZmZzZXQpOworCV9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLAorCSAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnRfcmFuZ2UoX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0KTsKKworCSAgLyogSGFyZCB0byBndWVzcyBpZiBpbnZhbGlkYXRpb24gd2lsbCBvY2N1ciwgYmVjYXVzZSBfX2xhc3QKKwkgICAgIC0gX19maXJzdCBjYW4ndCBiZSBjYWxjdWxhdGVkIGluIGFsbCBjYXNlcywgc28gd2UganVzdAorCSAgICAgcHVudCBoZXJlIGJ5IGNoZWNraW5nIGlmIGl0IGRpZCBvY2N1ci4gKi8KKwkgIF9CYXNlX2l0ZXJhdG9yIF9fb2xkX2JlZ2luID0gX01fYmFzZSgpLmJlZ2luKCk7CisJICBkaWZmZXJlbmNlX3R5cGUgX19vZmZzZXQgPSBfX3Bvc2l0aW9uLmJhc2UoKSAtIF9CYXNlOjpiZWdpbigpOworCSAgX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCQkJICAgX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKworCSAgaWYgKF9NX2Jhc2UoKS5iZWdpbigpICE9IF9fb2xkX2JlZ2luKQorCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCSAgZWxzZQorCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FmdGVyX250aChfX29mZnNldCk7CisJICBfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworCX0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCWRpZmZlcmVuY2VfdHlwZSBfX29mZnNldCA9IF9fcG9zaXRpb24uYmFzZSgpIC0gX0Jhc2U6OmJlZ2luKCk7CisJX0Jhc2VfaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbi5iYXNlKCkpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fb2Zmc2V0KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisJaWYgKF9fZmlyc3QuYmFzZSgpICE9IF9fbGFzdC5iYXNlKCkpCisJICB7CisJICAgIGRpZmZlcmVuY2VfdHlwZSBfX29mZnNldCA9IF9fZmlyc3QuYmFzZSgpIC0gX0Jhc2U6OmJlZ2luKCk7CisJICAgIF9CYXNlX2l0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLAorCQkJCQkJX19sYXN0LmJhc2UoKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fb2Zmc2V0KTsKKwkgICAgcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gX19maXJzdDsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3dhcCh2ZWN0b3ImIF9feCkKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisJCQlub2V4Y2VwdChfQWxsb2NfdHJhaXRzOjpfU19ub3Rocm93X3N3YXAoKSkKKyNlbmRpZgorICAgICAgeworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwlpZiAoIV9BbGxvY190cmFpdHM6Ol9TX3Byb3BhZ2F0ZV9vbl9zd2FwKCkpCisJICBfX2dsaWJjeHhfY2hlY2tfZXF1YWxfYWxsb2NzKF9feCk7CisjZW5kaWYKKwlfQmFzZTo6c3dhcChfX3gpOworCXRoaXMtPl9NX3N3YXAoX194KTsKKyAgICAgICAgc3RkOjpzd2FwKF9NX2d1YXJhbnRlZWRfY2FwYWNpdHksIF9feC5fTV9ndWFyYW50ZWVkX2NhcGFjaXR5KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9CYXNlOjpjbGVhcigpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICAgIF9NX2d1YXJhbnRlZWRfY2FwYWNpdHkgPSAwOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdHlwZSBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5OworCisgICAgICBib29sCisgICAgICBfTV9yZXF1aXJlc19yZWFsbG9jYXRpb24oc2l6ZV90eXBlIF9fZWxlbWVudHMpCisgICAgICB7IHJldHVybiBfX2VsZW1lbnRzID4gdGhpcy0+Y2FwYWNpdHkoKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpCisgICAgICB7CisJaWYgKHRoaXMtPnNpemUoKSA+IF9NX2d1YXJhbnRlZWRfY2FwYWNpdHkpCisJICBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5ID0gdGhpcy0+c2l6ZSgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2FmdGVyX250aChkaWZmZXJlbmNlX3R5cGUgX19uKQorICAgICAgeworCXR5cGVkZWYgX19nbnVfZGVidWc6Ol9BZnRlcl9udGhfZnJvbTxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX0FmdGVyX250aDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9BZnRlcl9udGgoX19uLCBfQmFzZTo6YmVnaW4oKSkpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgIT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fZGVidWcKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLy8gRFIgMTE4Mi4KKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgdmVjdG9yPGJvb2w+LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IGhhc2g8X19kZWJ1Zzo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfX2RlYnVnOjp2ZWN0b3I8Ym9vbCwgX0FsbG9jPj4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX19kZWJ1Zzo6dmVjdG9yPGJvb2wsIF9BbGxvYz4mIF9fYikgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6aGFzaDxfR0xJQkNYWF9TVERfQzo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+KCkKKwkgIChfX2IuX01fYmFzZSgpKTsgfQorICAgIH07CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWNpbWFsL2RlY2ltYWwgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlY2ltYWwvZGVjaW1hbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODgwNTM3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWNpbWFsL2RlY2ltYWwKQEAgLTAsMCArMSw0ODUgQEAKKy8vIDxkZWNpbWFsPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWNpbWFsL2RlY2ltYWwKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vIElTTy9JRUMgVFIgMjQ3MzMgCisvLyBXcml0dGVuIGJ5IEphbmlzIEpvaG5zb24gPGphbmlzMTg3QHVzLmlibS5jb20+CisKKyNpZm5kZWYgX0dMSUJDWFhfREVDSU1BTAorI2RlZmluZSBfR0xJQkNYWF9ERUNJTUFMIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworI2lmbmRlZiBfR0xJQkNYWF9VU0VfREVDSU1BTF9GTE9BVAorI2Vycm9yIFRoaXMgZmlsZSByZXF1aXJlcyBjb21waWxlciBhbmQgbGlicmFyeSBzdXBwb3J0IGZvciBJU08vSUVDIFRSIDI0NzMzIFwKK3RoYXQgaXMgY3VycmVudGx5IG5vdCBhdmFpbGFibGUuCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CisgIC8qKgorICAgICogQGRlZmdyb3VwIGRlY2ltYWwgRGVjaW1hbCBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljCisgICAgKiBAaW5ncm91cCBudW1lcmljcworICAgICoKKyAgICAqIENsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmb3IgZGVjaW1hbCBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLgorICAgICogQHsKKyAgICAqLworCisgIC8qKiBAbmFtZXNwYWNlIHN0ZDo6ZGVjaW1hbAorICAgICogQGJyaWVmIElTTy9JRUMgVFIgMjQ3MzMgRGVjaW1hbCBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLgorICAgICovCituYW1lc3BhY2UgZGVjaW1hbAoreworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIGNsYXNzIGRlY2ltYWwzMjsKKyAgY2xhc3MgZGVjaW1hbDY0OworICBjbGFzcyBkZWNpbWFsMTI4OworCisgIC8vIDMuMi41ICBJbml0aWFsaXphdGlvbiBmcm9tIGNvZWZmaWNpZW50IGFuZCBleHBvbmVudC4KKyAgc3RhdGljIGRlY2ltYWwzMiBtYWtlX2RlY2ltYWwzMihsb25nIGxvbmcgX19jb2VmZiwgaW50IF9fZXhwKTsKKyAgc3RhdGljIGRlY2ltYWwzMiBtYWtlX2RlY2ltYWwzMih1bnNpZ25lZCBsb25nIGxvbmcgX19jb2VmZiwgaW50IF9fZXhwKTsKKyAgc3RhdGljIGRlY2ltYWw2NCBtYWtlX2RlY2ltYWw2NChsb25nIGxvbmcgX19jb2VmZiwgaW50IF9fZXhwKTsKKyAgc3RhdGljIGRlY2ltYWw2NCBtYWtlX2RlY2ltYWw2NCh1bnNpZ25lZCBsb25nIGxvbmcgX19jb2VmZiwgaW50IF9fZXhwKTsKKyAgc3RhdGljIGRlY2ltYWwxMjggbWFrZV9kZWNpbWFsMTI4KGxvbmcgbG9uZyBfX2NvZWZmLCBpbnQgX19leHApOworICBzdGF0aWMgZGVjaW1hbDEyOCBtYWtlX2RlY2ltYWwxMjgodW5zaWduZWQgbG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cCk7CisKKyAgLy8vIE5vbi1jb25mb3JtaW5nIGV4dGVuc2lvbjogQ29udmVyc2lvbiB0byBpbnRlZ3JhbCB0eXBlLgorICBsb25nIGxvbmcgZGVjaW1hbDMyX3RvX2xvbmdfbG9uZyhkZWNpbWFsMzIgX19kKTsKKyAgbG9uZyBsb25nIGRlY2ltYWw2NF90b19sb25nX2xvbmcoZGVjaW1hbDY0IF9fZCk7CisgIGxvbmcgbG9uZyBkZWNpbWFsMTI4X3RvX2xvbmdfbG9uZyhkZWNpbWFsMTI4IF9fZCk7CisgIGxvbmcgbG9uZyBkZWNpbWFsX3RvX2xvbmdfbG9uZyhkZWNpbWFsMzIgX19kKTsKKyAgbG9uZyBsb25nIGRlY2ltYWxfdG9fbG9uZ19sb25nKGRlY2ltYWw2NCBfX2QpOworICBsb25nIGxvbmcgZGVjaW1hbF90b19sb25nX2xvbmcoZGVjaW1hbDEyOCBfX2QpOworCisgIC8vIDMuMi42ICBDb252ZXJzaW9uIHRvIGdlbmVyaWMgZmxvYXRpbmctcG9pbnQgdHlwZS4KKyAgZmxvYXQgZGVjaW1hbDMyX3RvX2Zsb2F0KGRlY2ltYWwzMiBfX2QpOworICBmbG9hdCBkZWNpbWFsNjRfdG9fZmxvYXQoZGVjaW1hbDY0IF9fZCk7CisgIGZsb2F0IGRlY2ltYWwxMjhfdG9fZmxvYXQoZGVjaW1hbDEyOCBfX2QpOworICBmbG9hdCBkZWNpbWFsX3RvX2Zsb2F0KGRlY2ltYWwzMiBfX2QpOworICBmbG9hdCBkZWNpbWFsX3RvX2Zsb2F0KGRlY2ltYWw2NCBfX2QpOworICBmbG9hdCBkZWNpbWFsX3RvX2Zsb2F0KGRlY2ltYWwxMjggX19kKTsKKworICBkb3VibGUgZGVjaW1hbDMyX3RvX2RvdWJsZShkZWNpbWFsMzIgX19kKTsKKyAgZG91YmxlIGRlY2ltYWw2NF90b19kb3VibGUoZGVjaW1hbDY0IF9fZCk7CisgIGRvdWJsZSBkZWNpbWFsMTI4X3RvX2RvdWJsZShkZWNpbWFsMTI4IF9fZCk7CisgIGRvdWJsZSBkZWNpbWFsX3RvX2RvdWJsZShkZWNpbWFsMzIgX19kKTsKKyAgZG91YmxlIGRlY2ltYWxfdG9fZG91YmxlKGRlY2ltYWw2NCBfX2QpOworICBkb3VibGUgZGVjaW1hbF90b19kb3VibGUoZGVjaW1hbDEyOCBfX2QpOworCisgIGxvbmcgZG91YmxlIGRlY2ltYWwzMl90b19sb25nX2RvdWJsZShkZWNpbWFsMzIgX19kKTsKKyAgbG9uZyBkb3VibGUgZGVjaW1hbDY0X3RvX2xvbmdfZG91YmxlKGRlY2ltYWw2NCBfX2QpOworICBsb25nIGRvdWJsZSBkZWNpbWFsMTI4X3RvX2xvbmdfZG91YmxlKGRlY2ltYWwxMjggX19kKTsKKyAgbG9uZyBkb3VibGUgZGVjaW1hbF90b19sb25nX2RvdWJsZShkZWNpbWFsMzIgX19kKTsKKyAgbG9uZyBkb3VibGUgZGVjaW1hbF90b19sb25nX2RvdWJsZShkZWNpbWFsNjQgX19kKTsKKyAgbG9uZyBkb3VibGUgZGVjaW1hbF90b19sb25nX2RvdWJsZShkZWNpbWFsMTI4IF9fZCk7CisKKyAgLy8gMy4yLjcgIFVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0b3JzLgorICBkZWNpbWFsMzIgIG9wZXJhdG9yKyhkZWNpbWFsMzIgX19yaHMpOworICBkZWNpbWFsNjQgIG9wZXJhdG9yKyhkZWNpbWFsNjQgX19yaHMpOworICBkZWNpbWFsMTI4IG9wZXJhdG9yKyhkZWNpbWFsMTI4IF9fcmhzKTsKKyAgZGVjaW1hbDMyICBvcGVyYXRvci0oZGVjaW1hbDMyIF9fcmhzKTsKKyAgZGVjaW1hbDY0ICBvcGVyYXRvci0oZGVjaW1hbDY0IF9fcmhzKTsKKyAgZGVjaW1hbDEyOCBvcGVyYXRvci0oZGVjaW1hbDEyOCBfX3Jocyk7CisKKyAgLy8gMy4yLjggIEJpbmFyeSBhcml0aG1ldGljIG9wZXJhdG9ycy4KKyNkZWZpbmUgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoX09wLCBfVDEsIF9UMiwgX1QzKQlcCisgIF9UMSBvcGVyYXRvciBfT3AoX1QyIF9fbGhzLCBfVDMgX19yaHMpOworI2RlZmluZSBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVChfT3AsIF9UcCkJCVwKKyAgX1RwIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIGludCBfX3Jocyk7CQkJXAorICBfVHAgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgdW5zaWduZWQgaW50IF9fcmhzKTsJCVwKKyAgX1RwIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIGxvbmcgX19yaHMpOwkJCVwKKyAgX1RwIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIHVuc2lnbmVkIGxvbmcgX19yaHMpOwkJXAorICBfVHAgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgbG9uZyBsb25nIF9fcmhzKTsJCQlcCisgIF9UcCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCB1bnNpZ25lZCBsb25nIGxvbmcgX19yaHMpOwlcCisgIF9UcCBvcGVyYXRvciBfT3AoaW50IF9fbGhzLCBfVHAgX19yaHMpOwkJCVwKKyAgX1RwIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBpbnQgX19saHMsIF9UcCBfX3Jocyk7CQlcCisgIF9UcCBvcGVyYXRvciBfT3AobG9uZyBfX2xocywgX1RwIF9fcmhzKTsJCQlcCisgIF9UcCBvcGVyYXRvciBfT3AodW5zaWduZWQgbG9uZyBfX2xocywgX1RwIF9fcmhzKTsJCVwKKyAgX1RwIG9wZXJhdG9yIF9PcChsb25nIGxvbmcgX19saHMsIF9UcCBfX3Jocyk7CQkJXAorICBfVHAgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGxvbmcgbG9uZyBfX2xocywgX1RwIF9fcmhzKTsKKworICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsMzIsIGRlY2ltYWwzMiwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgrLCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWw2NCwgZGVjaW1hbDMyLCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKCssIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDEyOCwgZGVjaW1hbDMyLCBkZWNpbWFsMTI4KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQsIGRlY2ltYWwxMjgpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgrLCBkZWNpbWFsMTI4KQorCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWwzMiwgZGVjaW1hbDMyLCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKC0sIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDY0LCBkZWNpbWFsMzIsIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoLSwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIsIGRlY2ltYWwxMjgpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCwgZGVjaW1hbDEyOCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKC0sIGRlY2ltYWwxMjgpCisKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDMyLCBkZWNpbWFsMzIsIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoKiwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsNjQsIGRlY2ltYWwzMiwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgqLCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWwxMjgsIGRlY2ltYWwzMiwgZGVjaW1hbDEyOCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDEyOCwgZGVjaW1hbDY0LCBkZWNpbWFsMTI4KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoKiwgZGVjaW1hbDEyOCkKKworICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsMzIsIGRlY2ltYWwzMiwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgvLCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWw2NCwgZGVjaW1hbDMyLCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKC8sIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDEyOCwgZGVjaW1hbDMyLCBkZWNpbWFsMTI4KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQsIGRlY2ltYWwxMjgpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgvLCBkZWNpbWFsMTI4KQorCisjdW5kZWYgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMKKyN1bmRlZiBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVAorCisgIC8vIDMuMi45ICBDb21wYXJpc29uIG9wZXJhdG9ycy4KKyNkZWZpbmUgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKF9PcCwgX1RwKQkJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgZGVjaW1hbDMyIF9fcmhzKTsJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgZGVjaW1hbDY0IF9fcmhzKTsJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgZGVjaW1hbDEyOCBfX3Jocyk7CQkJXAorICBib29sIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIGludCBfX3Jocyk7CQkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCB1bnNpZ25lZCBpbnQgX19yaHMpOwkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCBsb25nIF9fcmhzKTsJCQkJXAorICBib29sIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIHVuc2lnbmVkIGxvbmcgX19yaHMpOwkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCBsb25nIGxvbmcgX19yaHMpOwkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCB1bnNpZ25lZCBsb25nIGxvbmcgX19yaHMpOwkJXAorICBib29sIG9wZXJhdG9yIF9PcChpbnQgX19saHMsIF9UcCBfX3Jocyk7CQkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AodW5zaWduZWQgaW50IF9fbGhzLCBfVHAgX19yaHMpOwkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AobG9uZyBfX2xocywgX1RwIF9fcmhzKTsJCQkJXAorICBib29sIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBsb25nIF9fbGhzLCBfVHAgX19yaHMpOwkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AobG9uZyBsb25nIF9fbGhzLCBfVHAgX19yaHMpOwkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AodW5zaWduZWQgbG9uZyBsb25nIF9fbGhzLCBfVHAgX19yaHMpOworCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig9PSwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPT0sIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKD09LCBkZWNpbWFsMTI4KQorCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTighPSwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oIT0sIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKCE9LCBkZWNpbWFsMTI4KQorCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig8LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig8LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig8LCBkZWNpbWFsMTI4KQorCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig+PSwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPj0sIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKD49LCBkZWNpbWFsMTI4KQorCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig+LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig+LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig+LCBkZWNpbWFsMTI4KQorCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig+PSwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPj0sIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKD49LCBkZWNpbWFsMTI4KQorCisjdW5kZWYgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OCisKKyAgLy8vIDMuMi4yICBDbGFzcyBkZWNpbWFsMzIuCisgIGNsYXNzIGRlY2ltYWwzMgorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGZsb2F0IF9fZGVjZmxvYXQzMiBfX2F0dHJpYnV0ZV9fKChtb2RlKFNEKSkpOworCisgICAgLy8gMy4yLjIuMiAgQ29uc3RydWN0L2NvcHkvZGVzdHJveS4KKyAgICBkZWNpbWFsMzIoKQkJCQkJOiBfX3ZhbCgwLmUtMTAxREYpIHt9CisKKyAgICAvLyAzLjIuMi4zICBDb252ZXJzaW9uIGZyb20gZmxvYXRpbmctcG9pbnQgdHlwZS4KKyAgICBleHBsaWNpdCBkZWNpbWFsMzIoZGVjaW1hbDY0IF9fZDY0KTsKKyAgICBleHBsaWNpdCBkZWNpbWFsMzIoZGVjaW1hbDEyOCBfX2QxMjgpOworICAgIGV4cGxpY2l0IGRlY2ltYWwzMihmbG9hdCBfX3IpCQk6IF9fdmFsKF9fcikge30KKyAgICBleHBsaWNpdCBkZWNpbWFsMzIoZG91YmxlIF9fcikJCTogX192YWwoX19yKSB7fQorICAgIGV4cGxpY2l0IGRlY2ltYWwzMihsb25nIGRvdWJsZSBfX3IpCQk6IF9fdmFsKF9fcikge30KKworICAgIC8vIDMuMi4yLjQgIENvbnZlcnNpb24gZnJvbSBpbnRlZ3JhbCB0eXBlLgorICAgIGRlY2ltYWwzMihpbnQgX196KQkJCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsMzIodW5zaWduZWQgaW50IF9feikJCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsMzIobG9uZyBfX3opCQkJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWwzMih1bnNpZ25lZCBsb25nIF9feikJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWwzMihsb25nIGxvbmcgX196KQkJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWwzMih1bnNpZ25lZCBsb25nIGxvbmcgX196KQkJOiBfX3ZhbChfX3opIHt9CisKKyAgICAvLy8gQ29uZm9ybWluZyBleHRlbnNpb246IENvbnZlcnNpb24gZnJvbSBzY2FsYXIgZGVjaW1hbCB0eXBlLgorICAgIGRlY2ltYWwzMihfX2RlY2Zsb2F0MzIgX196KQkJCTogX192YWwoX196KSB7fQorCisgICAgLy8gMy4yLjIuNSAgQ29udmVyc2lvbiB0byBpbnRlZ3JhbCB0eXBlLiAoRElTQUJMRUQpCisgICAgLy9vcGVyYXRvciBsb25nIGxvbmcoKSBjb25zdCB7IHJldHVybiAobG9uZyBsb25nKV9fdmFsOyB9CisKKyAgICAvLyAzLjIuMi42ICBJbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBvcGVyYXRvcnMuCisgICAgZGVjaW1hbDMyJiBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICBfX3ZhbCArPSAxOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGRlY2ltYWwzMiBvcGVyYXRvcisrKGludCkKKyAgICB7CisgICAgICBkZWNpbWFsMzIgX190bXAgPSAqdGhpczsKKyAgICAgIF9fdmFsICs9IDE7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorCisgICAgZGVjaW1hbDMyJiBvcGVyYXRvci0tKCkKKyAgICB7CisgICAgICBfX3ZhbCAtPSAxOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGRlY2ltYWwzMiAgIG9wZXJhdG9yLS0oaW50KQorICAgIHsKKyAgICAgIGRlY2ltYWwzMiBfX3RtcCA9ICp0aGlzOworICAgICAgX192YWwgLT0gMTsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgICAvLyAzLjIuMi43ICBDb21wb3VuZCBhc3NpZ25tZW50LgorI2RlZmluZSBfREVDTEFSRV9ERUNJTUFMMzJfQ09NUE9VTkRfQVNTSUdOTUVOVChfT3ApCVwKKyAgICBkZWNpbWFsMzImIG9wZXJhdG9yIF9PcChkZWNpbWFsMzIgX19yaHMpOwkJXAorICAgIGRlY2ltYWwzMiYgb3BlcmF0b3IgX09wKGRlY2ltYWw2NCBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDMyJiBvcGVyYXRvciBfT3AoZGVjaW1hbDEyOCBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDMyJiBvcGVyYXRvciBfT3AoaW50IF9fcmhzKTsJCQlcCisgICAgZGVjaW1hbDMyJiBvcGVyYXRvciBfT3AodW5zaWduZWQgaW50IF9fcmhzKTsJXAorICAgIGRlY2ltYWwzMiYgb3BlcmF0b3IgX09wKGxvbmcgX19yaHMpOwkJXAorICAgIGRlY2ltYWwzMiYgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGxvbmcgX19yaHMpOwlcCisgICAgZGVjaW1hbDMyJiBvcGVyYXRvciBfT3AobG9uZyBsb25nIF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsMzImIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBsb25nIGxvbmcgX19yaHMpOworCisgICAgX0RFQ0xBUkVfREVDSU1BTDMyX0NPTVBPVU5EX0FTU0lHTk1FTlQoKz0pCisgICAgX0RFQ0xBUkVfREVDSU1BTDMyX0NPTVBPVU5EX0FTU0lHTk1FTlQoLT0pCisgICAgX0RFQ0xBUkVfREVDSU1BTDMyX0NPTVBPVU5EX0FTU0lHTk1FTlQoKj0pCisgICAgX0RFQ0xBUkVfREVDSU1BTDMyX0NPTVBPVU5EX0FTU0lHTk1FTlQoLz0pCisjdW5kZWYgX0RFQ0xBUkVfREVDSU1BTDMyX0NPTVBPVU5EX0FTU0lHTk1FTlQKKworICBwcml2YXRlOgorICAgIF9fZGVjZmxvYXQzMiBfX3ZhbDsKKworICBwdWJsaWM6CisgICAgX19kZWNmbG9hdDMyIF9fZ2V0dmFsKHZvaWQpIHsgcmV0dXJuIF9fdmFsOyB9CisgICAgdm9pZCBfX3NldHZhbChfX2RlY2Zsb2F0MzIgX194KSB7IF9fdmFsID0gX194OyB9CisgIH07CisKKyAgLy8vIDMuMi4zICBDbGFzcyBkZWNpbWFsNjQuCisgIGNsYXNzIGRlY2ltYWw2NAorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGZsb2F0IF9fZGVjZmxvYXQ2NCBfX2F0dHJpYnV0ZV9fKChtb2RlKEREKSkpOworCisgICAgLy8gMy4yLjMuMiAgQ29uc3RydWN0L2NvcHkvZGVzdHJveS4KKyAgICBkZWNpbWFsNjQoKQkJCQkJOiBfX3ZhbCgwLmUtMzk4ZGQpIHt9CisKKyAgICAvLyAzLjIuMy4zICBDb252ZXJzaW9uIGZyb20gZmxvYXRpbmctcG9pbnQgdHlwZS4KKwkgICAgIGRlY2ltYWw2NChkZWNpbWFsMzIgZDMyKTsKKyAgICBleHBsaWNpdCBkZWNpbWFsNjQoZGVjaW1hbDEyOCBkMTI4KTsKKyAgICBleHBsaWNpdCBkZWNpbWFsNjQoZmxvYXQgX19yKQkJOiBfX3ZhbChfX3IpIHt9CisgICAgZXhwbGljaXQgZGVjaW1hbDY0KGRvdWJsZSBfX3IpCQk6IF9fdmFsKF9fcikge30KKyAgICBleHBsaWNpdCBkZWNpbWFsNjQobG9uZyBkb3VibGUgX19yKQkJOiBfX3ZhbChfX3IpIHt9CisKKyAgICAvLyAzLjIuMy40ICBDb252ZXJzaW9uIGZyb20gaW50ZWdyYWwgdHlwZS4KKyAgICBkZWNpbWFsNjQoaW50IF9feikJCQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDY0KHVuc2lnbmVkIGludCBfX3opCQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDY0KGxvbmcgX196KQkJCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsNjQodW5zaWduZWQgbG9uZyBfX3opCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsNjQobG9uZyBsb25nIF9feikJCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsNjQodW5zaWduZWQgbG9uZyBsb25nIF9feikJCTogX192YWwoX196KSB7fQorCisgICAgLy8vIENvbmZvcm1pbmcgZXh0ZW5zaW9uOiBDb252ZXJzaW9uIGZyb20gc2NhbGFyIGRlY2ltYWwgdHlwZS4KKyAgICBkZWNpbWFsNjQoX19kZWNmbG9hdDY0IF9feikJCQk6IF9fdmFsKF9feikge30KKworICAgIC8vIDMuMi4zLjUgIENvbnZlcnNpb24gdG8gaW50ZWdyYWwgdHlwZS4gKERJU0FCTEVEKQorICAgIC8vb3BlcmF0b3IgbG9uZyBsb25nKCkgY29uc3QgeyByZXR1cm4gKGxvbmcgbG9uZylfX3ZhbDsgfQorCisgICAgLy8gMy4yLjMuNiAgSW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgb3BlcmF0b3JzLgorICAgIGRlY2ltYWw2NCYgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgX192YWwgKz0gMTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBkZWNpbWFsNjQgb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgZGVjaW1hbDY0IF9fdG1wID0gKnRoaXM7CisgICAgICBfX3ZhbCArPSAxOworICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKworICAgIGRlY2ltYWw2NCYgb3BlcmF0b3ItLSgpCisgICAgeworICAgICAgX192YWwgLT0gMTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBkZWNpbWFsNjQgb3BlcmF0b3ItLShpbnQpCisgICAgeworICAgICAgZGVjaW1hbDY0IF9fdG1wID0gKnRoaXM7CisgICAgICBfX3ZhbCAtPSAxOworICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKworICAgIC8vIDMuMi4zLjcgIENvbXBvdW5kIGFzc2lnbm1lbnQuCisjZGVmaW5lIF9ERUNMQVJFX0RFQ0lNQUw2NF9DT01QT1VORF9BU1NJR05NRU5UKF9PcCkJXAorICAgIGRlY2ltYWw2NCYgb3BlcmF0b3IgX09wKGRlY2ltYWwzMiBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDY0JiBvcGVyYXRvciBfT3AoZGVjaW1hbDY0IF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsNjQmIG9wZXJhdG9yIF9PcChkZWNpbWFsMTI4IF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsNjQmIG9wZXJhdG9yIF9PcChpbnQgX19yaHMpOwkJCVwKKyAgICBkZWNpbWFsNjQmIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBpbnQgX19yaHMpOwlcCisgICAgZGVjaW1hbDY0JiBvcGVyYXRvciBfT3AobG9uZyBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDY0JiBvcGVyYXRvciBfT3AodW5zaWduZWQgbG9uZyBfX3Jocyk7CVwKKyAgICBkZWNpbWFsNjQmIG9wZXJhdG9yIF9PcChsb25nIGxvbmcgX19yaHMpOwkJXAorICAgIGRlY2ltYWw2NCYgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3Jocyk7CisKKyAgICBfREVDTEFSRV9ERUNJTUFMNjRfQ09NUE9VTkRfQVNTSUdOTUVOVCgrPSkKKyAgICBfREVDTEFSRV9ERUNJTUFMNjRfQ09NUE9VTkRfQVNTSUdOTUVOVCgtPSkKKyAgICBfREVDTEFSRV9ERUNJTUFMNjRfQ09NUE9VTkRfQVNTSUdOTUVOVCgqPSkKKyAgICBfREVDTEFSRV9ERUNJTUFMNjRfQ09NUE9VTkRfQVNTSUdOTUVOVCgvPSkKKyN1bmRlZiBfREVDTEFSRV9ERUNJTUFMNjRfQ09NUE9VTkRfQVNTSUdOTUVOVAorCisgIHByaXZhdGU6CisgICAgX19kZWNmbG9hdDY0IF9fdmFsOworCisgIHB1YmxpYzoKKyAgICBfX2RlY2Zsb2F0NjQgX19nZXR2YWwodm9pZCkgeyByZXR1cm4gX192YWw7IH0KKyAgICB2b2lkIF9fc2V0dmFsKF9fZGVjZmxvYXQ2NCBfX3gpIHsgX192YWwgPSBfX3g7IH0KKyAgfTsKKworICAvLy8gMy4yLjQgIENsYXNzIGRlY2ltYWwxMjguCisgIGNsYXNzIGRlY2ltYWwxMjgKKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBmbG9hdCBfX2RlY2Zsb2F0MTI4IF9fYXR0cmlidXRlX18oKG1vZGUoVEQpKSk7CisKKyAgICAvLyAzLjIuNC4yICBDb25zdHJ1Y3QvY29weS9kZXN0cm95LgorICAgIGRlY2ltYWwxMjgoKQkJCQk6IF9fdmFsKDAuZS02MTc2REwpIHt9CisKKyAgICAvLyAzLjIuNC4zICBDb252ZXJzaW9uIGZyb20gZmxvYXRpbmctcG9pbnQgdHlwZS4KKwkgICAgIGRlY2ltYWwxMjgoZGVjaW1hbDMyIGQzMik7CisJICAgICBkZWNpbWFsMTI4KGRlY2ltYWw2NCBkNjQpOworICAgIGV4cGxpY2l0IGRlY2ltYWwxMjgoZmxvYXQgX19yKQkJOiBfX3ZhbChfX3IpIHt9CisgICAgZXhwbGljaXQgZGVjaW1hbDEyOChkb3VibGUgX19yKQkJOiBfX3ZhbChfX3IpIHt9CisgICAgZXhwbGljaXQgZGVjaW1hbDEyOChsb25nIGRvdWJsZSBfX3IpCTogX192YWwoX19yKSB7fQorCisKKyAgICAvLyAzLjIuNC40ICBDb252ZXJzaW9uIGZyb20gaW50ZWdyYWwgdHlwZS4KKyAgICBkZWNpbWFsMTI4KGludCBfX3opCQkJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWwxMjgodW5zaWduZWQgaW50IF9feikJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWwxMjgobG9uZyBfX3opCQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDEyOCh1bnNpZ25lZCBsb25nIF9feikJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWwxMjgobG9uZyBsb25nIF9feikJCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsMTI4KHVuc2lnbmVkIGxvbmcgbG9uZyBfX3opCQk6IF9fdmFsKF9feikge30KKworICAgIC8vLyBDb25mb3JtaW5nIGV4dGVuc2lvbjogQ29udmVyc2lvbiBmcm9tIHNjYWxhciBkZWNpbWFsIHR5cGUuCisgICAgZGVjaW1hbDEyOChfX2RlY2Zsb2F0MTI4IF9feikJCTogX192YWwoX196KSB7fQorCisgICAgLy8gMy4yLjQuNSAgQ29udmVyc2lvbiB0byBpbnRlZ3JhbCB0eXBlLiAoRElTQUJMRUQpCisgICAgLy9vcGVyYXRvciBsb25nIGxvbmcoKSBjb25zdCB7IHJldHVybiAobG9uZyBsb25nKV9fdmFsOyB9CisKKyAgICAvLyAzLjIuNC42ICBJbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBvcGVyYXRvcnMuCisgICAgZGVjaW1hbDEyOCYgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgX192YWwgKz0gMTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBkZWNpbWFsMTI4IG9wZXJhdG9yKysoaW50KQorICAgIHsKKyAgICAgIGRlY2ltYWwxMjggX190bXAgPSAqdGhpczsKKyAgICAgIF9fdmFsICs9IDE7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorCisgICAgZGVjaW1hbDEyOCYgb3BlcmF0b3ItLSgpCisgICAgeworICAgICAgX192YWwgLT0gMTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBkZWNpbWFsMTI4ICAgb3BlcmF0b3ItLShpbnQpCisgICAgeworICAgICAgZGVjaW1hbDEyOCBfX3RtcCA9ICp0aGlzOworICAgICAgX192YWwgLT0gMTsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgICAvLyAzLjIuNC43ICBDb21wb3VuZCBhc3NpZ25tZW50LgorI2RlZmluZSBfREVDTEFSRV9ERUNJTUFMMTI4X0NPTVBPVU5EX0FTU0lHTk1FTlQoX09wKQlcCisgICAgZGVjaW1hbDEyOCYgb3BlcmF0b3IgX09wKGRlY2ltYWwzMiBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDEyOCYgb3BlcmF0b3IgX09wKGRlY2ltYWw2NCBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDEyOCYgb3BlcmF0b3IgX09wKGRlY2ltYWwxMjggX19yaHMpOwkJXAorICAgIGRlY2ltYWwxMjgmIG9wZXJhdG9yIF9PcChpbnQgX19yaHMpOwkJXAorICAgIGRlY2ltYWwxMjgmIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBpbnQgX19yaHMpOwlcCisgICAgZGVjaW1hbDEyOCYgb3BlcmF0b3IgX09wKGxvbmcgX19yaHMpOwkJXAorICAgIGRlY2ltYWwxMjgmIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBsb25nIF9fcmhzKTsJXAorICAgIGRlY2ltYWwxMjgmIG9wZXJhdG9yIF9PcChsb25nIGxvbmcgX19yaHMpOwkJXAorICAgIGRlY2ltYWwxMjgmIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBsb25nIGxvbmcgX19yaHMpOworCisgICAgX0RFQ0xBUkVfREVDSU1BTDEyOF9DT01QT1VORF9BU1NJR05NRU5UKCs9KQorICAgIF9ERUNMQVJFX0RFQ0lNQUwxMjhfQ09NUE9VTkRfQVNTSUdOTUVOVCgtPSkKKyAgICBfREVDTEFSRV9ERUNJTUFMMTI4X0NPTVBPVU5EX0FTU0lHTk1FTlQoKj0pCisgICAgX0RFQ0xBUkVfREVDSU1BTDEyOF9DT01QT1VORF9BU1NJR05NRU5UKC89KQorI3VuZGVmIF9ERUNMQVJFX0RFQ0lNQUwxMjhfQ09NUE9VTkRfQVNTSUdOTUVOVAorCisgIHByaXZhdGU6CisgICAgX19kZWNmbG9hdDEyOCBfX3ZhbDsKKworICBwdWJsaWM6CisgICAgX19kZWNmbG9hdDEyOCBfX2dldHZhbCh2b2lkKSB7IHJldHVybiBfX3ZhbDsgfQorICAgIHZvaWQgX19zZXR2YWwoX19kZWNmbG9hdDEyOCBfX3gpIHsgX192YWwgPSBfX3g7IH0KKyAgfTsKKworI2RlZmluZSBfR0xJQkNYWF9VU0VfREVDSU1BTF8gMQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZGVjaW1hbAorICAvLyBAfSBncm91cCBkZWNpbWFsCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2luY2x1ZGUgPGRlY2ltYWwvZGVjaW1hbC5oPgorCisjZW5kaWYgLyogX0dMSUJDWFhfREVDSU1BTCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWNpbWFsL2RlY2ltYWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVjaW1hbC9kZWNpbWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNjMDY3YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVjaW1hbC9kZWNpbWFsLmgKQEAgLTAsMCArMSw0NjggQEAKKy8vIGRlY2ltYWwgY2xhc3NlcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlY2ltYWwvZGVjaW1hbC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZGVjaW1hbH0KKyAqLworCisvLyBJU08vSUVDIFRSIDI0NzMzCisvLyBXcml0dGVuIGJ5IEphbmlzIEpvaG5zb24gPGphbmlzMTg3QHVzLmlibS5jb20+CisKKyNpZm5kZWYgX0dMSUJDWFhfREVDSU1BTF9JTVBMCisjZGVmaW5lIF9HTElCQ1hYX0RFQ0lNQUxfSU1QTCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgZGVjaW1hbAoreworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIElTTy9JRUMgVFIgMjQ3MzMgIDMuMi5bMjM0XS4xICBDb25zdHJ1Y3QvY29weS9kZXN0cm95LgorCisgIGlubGluZSBkZWNpbWFsMzI6OmRlY2ltYWwzMihkZWNpbWFsNjQgX19yKQk6IF9fdmFsKF9fci5fX2dldHZhbCgpKSB7fQorICBpbmxpbmUgZGVjaW1hbDMyOjpkZWNpbWFsMzIoZGVjaW1hbDEyOCBfX3IpCTogX192YWwoX19yLl9fZ2V0dmFsKCkpIHt9CisgIGlubGluZSBkZWNpbWFsNjQ6OmRlY2ltYWw2NChkZWNpbWFsMzIgX19yKQk6IF9fdmFsKF9fci5fX2dldHZhbCgpKSB7fQorICBpbmxpbmUgZGVjaW1hbDY0OjpkZWNpbWFsNjQoZGVjaW1hbDEyOCBfX3IpCTogX192YWwoX19yLl9fZ2V0dmFsKCkpIHt9CisgIGlubGluZSBkZWNpbWFsMTI4OjpkZWNpbWFsMTI4KGRlY2ltYWwzMiBfX3IpCTogX192YWwoX19yLl9fZ2V0dmFsKCkpIHt9CisgIGlubGluZSBkZWNpbWFsMTI4OjpkZWNpbWFsMTI4KGRlY2ltYWw2NCBfX3IpCTogX192YWwoX19yLl9fZ2V0dmFsKCkpIHt9CisKKyAgLy8gSVNPL0lFQyBUUiAyNDczMyAgMy4yLlsyMzRdLjYgIENvbXBvdW5kIGFzc2lnbm1lbnQuCisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfREVDKF9PcDEsIF9PcDIsIF9UMSwgX1QyKQkgXAorICBpbmxpbmUgX1QxJiBfVDE6Om9wZXJhdG9yIF9PcDEoX1QyIF9fcmhzKQkJCQkgXAorICB7CQkJCQkJCQkJIFwKKyAgICBfX3NldHZhbChfX2dldHZhbCgpIF9PcDIgX19yaHMuX19nZXR2YWwoKSk7CQkJCSBcCisgICAgcmV0dXJuICp0aGlzOwkJCQkJCQkgXAorICB9CisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfSU5UKF9PcDEsIF9PcDIsIF9UMSwgX1QyKQkgXAorICBpbmxpbmUgX1QxJiBfVDE6Om9wZXJhdG9yIF9PcDEoX1QyIF9fcmhzKQkJCQkgXAorICB7CQkJCQkJCQkJIFwKKyAgICBfX3NldHZhbChfX2dldHZhbCgpIF9PcDIgX19yaHMpOwkJCQkJIFwKKyAgICByZXR1cm4gKnRoaXM7CQkJCQkJCSBcCisgIH0KKworI2RlZmluZSBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVFMoX09wMSwgX09wMiwgX1QxKQkJIFwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfREVDKF9PcDEsIF9PcDIsIF9UMSwgZGVjaW1hbDMyKQkgXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVF9ERUMoX09wMSwgX09wMiwgX1QxLCBkZWNpbWFsNjQpCSBcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UX0RFQyhfT3AxLCBfT3AyLCBfVDEsIGRlY2ltYWwxMjgpCSBcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UX0lOVChfT3AxLCBfT3AyLCBfVDEsIGludCkJCSBcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UX0lOVChfT3AxLCBfT3AyLCBfVDEsIHVuc2lnbmVkIGludCkgXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVF9JTlQoX09wMSwgX09wMiwgX1QxLCBsb25nKQkgXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVF9JTlQoX09wMSwgX09wMiwgX1QxLCB1bnNpZ25lZCBsb25nKVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfSU5UKF9PcDEsIF9PcDIsIF9UMSwgbG9uZyBsb25nKQkgXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVF9JTlQoX09wMSwgX09wMiwgX1QxLCB1bnNpZ25lZCBsb25nIGxvbmcpCisKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKCs9LCArLCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UUygtPSwgLSwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVFMoKj0sICosIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKC89LCAvLCBkZWNpbWFsMzIpCisKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKCs9LCArLCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UUygtPSwgLSwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVFMoKj0sICosIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKC89LCAvLCBkZWNpbWFsNjQpCisKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKCs9LCArLCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVFMoLT0sIC0sIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UUygqPSwgKiwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKC89LCAvLCBkZWNpbWFsMTI4KQorCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfREVDCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfSU5UCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTCisKKyAgLy8gRXh0ZW5zaW9uOiBDb252ZXJzaW9uIHRvIGludGVncmFsIHR5cGUuCisKKyAgaW5saW5lIGxvbmcgbG9uZyBkZWNpbWFsMzJfdG9fbG9uZ19sb25nKGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChsb25nIGxvbmcpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nIGRlY2ltYWw2NF90b19sb25nX2xvbmcoZGVjaW1hbDY0IF9fZCkKKyAgeyByZXR1cm4gKGxvbmcgbG9uZylfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBsb25nIGxvbmcgZGVjaW1hbDEyOF90b19sb25nX2xvbmcoZGVjaW1hbDEyOCBfX2QpCisgIHsgcmV0dXJuIChsb25nIGxvbmcpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nIGRlY2ltYWxfdG9fbG9uZ19sb25nKGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChsb25nIGxvbmcpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nIGRlY2ltYWxfdG9fbG9uZ19sb25nKGRlY2ltYWw2NCBfX2QpCisgIHsgcmV0dXJuIChsb25nIGxvbmcpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nIGRlY2ltYWxfdG9fbG9uZ19sb25nKGRlY2ltYWwxMjggX19kKQorICB7IHJldHVybiAobG9uZyBsb25nKV9fZC5fX2dldHZhbCgpOyB9CisKKyAgLy8gSVNPL0lFQyBUUiAyNDczMyAgMy4yLjUgIEluaXRpYWxpemF0aW9uIGZyb20gY29lZmZpY2llbnQgYW5kIGV4cG9uZW50LgorCisgIHN0YXRpYyBkZWNpbWFsMzIgbWFrZV9kZWNpbWFsMzIobG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cG9uZW50KQorICB7CisgICAgZGVjaW1hbDMyIF9fZGVjZXhwID0gMSwgX19tdWx0aXBsaWVyOworCisgICAgaWYgKF9fZXhwb25lbnQgPCAwKQorICAgICAgeworCV9fbXVsdGlwbGllciA9IDEuRS0xREY7CisJX19leHBvbmVudCA9IC1fX2V4cG9uZW50OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fbXVsdGlwbGllciA9IDEuRTFERjsKKworICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fZXhwb25lbnQ7ICsrX19pKQorICAgICAgX19kZWNleHAgKj0gX19tdWx0aXBsaWVyOworCisgICAgcmV0dXJuIF9fY29lZmYgKiBfX2RlY2V4cDsKKyAgfQorCisgIHN0YXRpYyBkZWNpbWFsMzIgbWFrZV9kZWNpbWFsMzIodW5zaWduZWQgbG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cG9uZW50KQorICB7CisgICAgZGVjaW1hbDMyIF9fZGVjZXhwID0gMSwgX19tdWx0aXBsaWVyOworCisgICAgaWYgKF9fZXhwb25lbnQgPCAwKQorICAgICAgeworCV9fbXVsdGlwbGllciA9IDEuRS0xREY7CisJX19leHBvbmVudCA9IC1fX2V4cG9uZW50OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fbXVsdGlwbGllciA9IDEuRTFERjsKKworICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fZXhwb25lbnQ7ICsrX19pKQorICAgICAgX19kZWNleHAgKj0gX19tdWx0aXBsaWVyOworCisgICAgcmV0dXJuIF9fY29lZmYgKiBfX2RlY2V4cDsKKyAgfQorCisgIHN0YXRpYyBkZWNpbWFsNjQgbWFrZV9kZWNpbWFsNjQobG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cG9uZW50KQorICB7CisgICAgZGVjaW1hbDY0IF9fZGVjZXhwID0gMSwgX19tdWx0aXBsaWVyOworCisgICAgaWYgKF9fZXhwb25lbnQgPCAwKQorICAgICAgeworCV9fbXVsdGlwbGllciA9IDEuRS0xREQ7CisJX19leHBvbmVudCA9IC1fX2V4cG9uZW50OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fbXVsdGlwbGllciA9IDEuRTFERDsKKworICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fZXhwb25lbnQ7ICsrX19pKQorICAgICAgX19kZWNleHAgKj0gX19tdWx0aXBsaWVyOworCisgICAgcmV0dXJuIF9fY29lZmYgKiBfX2RlY2V4cDsKKyAgfQorCisgIHN0YXRpYyBkZWNpbWFsNjQgbWFrZV9kZWNpbWFsNjQodW5zaWduZWQgbG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cG9uZW50KQorICB7CisgICAgZGVjaW1hbDY0IF9fZGVjZXhwID0gMSwgX19tdWx0aXBsaWVyOworCisgICAgaWYgKF9fZXhwb25lbnQgPCAwKQorICAgICAgeworCV9fbXVsdGlwbGllciA9IDEuRS0xREQ7CisJX19leHBvbmVudCA9IC1fX2V4cG9uZW50OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fbXVsdGlwbGllciA9IDEuRTFERDsKKworICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fZXhwb25lbnQ7ICsrX19pKQorICAgICAgX19kZWNleHAgKj0gX19tdWx0aXBsaWVyOworCisgICAgcmV0dXJuIF9fY29lZmYgKiBfX2RlY2V4cDsKKyAgfQorCisgIHN0YXRpYyBkZWNpbWFsMTI4IG1ha2VfZGVjaW1hbDEyOChsb25nIGxvbmcgX19jb2VmZiwgaW50IF9fZXhwb25lbnQpCisgIHsKKyAgICBkZWNpbWFsMTI4IF9fZGVjZXhwID0gMSwgX19tdWx0aXBsaWVyOworCisgICAgaWYgKF9fZXhwb25lbnQgPCAwKQorICAgICAgeworCV9fbXVsdGlwbGllciA9IDEuRS0xREw7CisJX19leHBvbmVudCA9IC1fX2V4cG9uZW50OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fbXVsdGlwbGllciA9IDEuRTFETDsKKworICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fZXhwb25lbnQ7ICsrX19pKQorICAgICAgX19kZWNleHAgKj0gX19tdWx0aXBsaWVyOworCisgICAgcmV0dXJuIF9fY29lZmYgKiBfX2RlY2V4cDsKKyAgfQorCisgIHN0YXRpYyBkZWNpbWFsMTI4IG1ha2VfZGVjaW1hbDEyOCh1bnNpZ25lZCBsb25nIGxvbmcgX19jb2VmZiwgaW50IF9fZXhwb25lbnQpCisgIHsKKyAgICBkZWNpbWFsMTI4IF9fZGVjZXhwID0gMSwgX19tdWx0aXBsaWVyOworCisgICAgaWYgKF9fZXhwb25lbnQgPCAwKQorICAgICAgeworCV9fbXVsdGlwbGllciA9IDEuRS0xREw7CisJX19leHBvbmVudCA9IC1fX2V4cG9uZW50OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fbXVsdGlwbGllciA9IDEuRTFETDsKKworICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fZXhwb25lbnQ7ICsrX19pKQorICAgICAgX19kZWNleHAgKj0gX19tdWx0aXBsaWVyOworCisgICAgcmV0dXJuIF9fY29lZmYgKiBfX2RlY2V4cDsKKyAgfQorCisgIC8vIElTTy9JRUMgVFIgMjQ3MzMgIDMuMi42ICBDb252ZXJzaW9uIHRvIGdlbmVyaWMgZmxvYXRpbmctcG9pbnQgdHlwZS4KKworICBpbmxpbmUgZmxvYXQgZGVjaW1hbDMyX3RvX2Zsb2F0KGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChmbG9hdClfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBmbG9hdCBkZWNpbWFsNjRfdG9fZmxvYXQoZGVjaW1hbDY0IF9fZCkKKyAgeyByZXR1cm4gKGZsb2F0KV9fZC5fX2dldHZhbCgpOyB9CisKKyAgaW5saW5lIGZsb2F0IGRlY2ltYWwxMjhfdG9fZmxvYXQoZGVjaW1hbDEyOCBfX2QpCisgIHsgcmV0dXJuIChmbG9hdClfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBmbG9hdCBkZWNpbWFsX3RvX2Zsb2F0KGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChmbG9hdClfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBmbG9hdCBkZWNpbWFsX3RvX2Zsb2F0KGRlY2ltYWw2NCBfX2QpCisgIHsgcmV0dXJuIChmbG9hdClfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBmbG9hdCBkZWNpbWFsX3RvX2Zsb2F0KGRlY2ltYWwxMjggX19kKQorICB7IHJldHVybiAoZmxvYXQpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgZG91YmxlIGRlY2ltYWwzMl90b19kb3VibGUoZGVjaW1hbDMyIF9fZCkKKyAgeyByZXR1cm4gKGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBkb3VibGUgZGVjaW1hbDY0X3RvX2RvdWJsZShkZWNpbWFsNjQgX19kKQorICB7IHJldHVybiAoZG91YmxlKV9fZC5fX2dldHZhbCgpOyB9CisKKyAgaW5saW5lIGRvdWJsZSBkZWNpbWFsMTI4X3RvX2RvdWJsZShkZWNpbWFsMTI4IF9fZCkKKyAgeyByZXR1cm4gKGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBkb3VibGUgZGVjaW1hbF90b19kb3VibGUoZGVjaW1hbDMyIF9fZCkKKyAgeyByZXR1cm4gKGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBkb3VibGUgZGVjaW1hbF90b19kb3VibGUoZGVjaW1hbDY0IF9fZCkKKyAgeyByZXR1cm4gKGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBkb3VibGUgZGVjaW1hbF90b19kb3VibGUoZGVjaW1hbDEyOCBfX2QpCisgIHsgcmV0dXJuIChkb3VibGUpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUgZGVjaW1hbDMyX3RvX2xvbmdfZG91YmxlKGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChsb25nIGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZSBkZWNpbWFsNjRfdG9fbG9uZ19kb3VibGUoZGVjaW1hbDY0IF9fZCkKKyAgeyByZXR1cm4gKGxvbmcgZG91YmxlKV9fZC5fX2dldHZhbCgpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlIGRlY2ltYWwxMjhfdG9fbG9uZ19kb3VibGUoZGVjaW1hbDEyOCBfX2QpCisgIHsgcmV0dXJuIChsb25nIGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZSBkZWNpbWFsX3RvX2xvbmdfZG91YmxlKGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChsb25nIGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZSBkZWNpbWFsX3RvX2xvbmdfZG91YmxlKGRlY2ltYWw2NCBfX2QpCisgIHsgcmV0dXJuIChsb25nIGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZSBkZWNpbWFsX3RvX2xvbmdfZG91YmxlKGRlY2ltYWwxMjggX19kKQorICB7IHJldHVybiAobG9uZyBkb3VibGUpX19kLl9fZ2V0dmFsKCk7IH0KKworICAvLyBJU08vSUVDIFRSIDI0NzMzICAzLjIuNyAgVW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRvcnMuCisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX1VOQVJZX09QKF9PcCwgX1RwKQlcCisgIGlubGluZSBfVHAgb3BlcmF0b3IgX09wKF9UcCBfX3JocykJCVwKKyAgewkJCQkJCVwKKyAgICBfVHAgX190bXA7CQkJCQlcCisgICAgX190bXAuX19zZXR2YWwoX09wIF9fcmhzLl9fZ2V0dmFsKCkpOwlcCisgICAgcmV0dXJuIF9fdG1wOwkJCQlcCisgIH0KKworICBfREVGSU5FX0RFQ0lNQUxfVU5BUllfT1AoKywgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfVU5BUllfT1AoKywgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfVU5BUllfT1AoKywgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX1VOQVJZX09QKC0sIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX1VOQVJZX09QKC0sIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX1VOQVJZX09QKC0sIGRlY2ltYWwxMjgpCisKKyN1bmRlZiBfREVGSU5FX0RFQ0lNQUxfVU5BUllfT1AKKworICAvLyBJU08vSUVDIFRSIDI0NzMzICAzLjIuOCAgQmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0b3JzLgorCisjZGVmaW5lIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoX09wLCBfVDEsIF9UMiwgX1QzKQlcCisgIGlubGluZSBfVDEgb3BlcmF0b3IgX09wKF9UMiBfX2xocywgX1QzIF9fcmhzKQkJCVwKKyAgewkJCQkJCQkJXAorICAgIF9UMSBfX3JldHZhbDsJCQkJCQlcCisgICAgX19yZXR2YWwuX19zZXR2YWwoX19saHMuX19nZXR2YWwoKSBfT3AgX19yaHMuX19nZXR2YWwoKSk7CVwKKyAgICByZXR1cm4gX19yZXR2YWw7CQkJCQkJXAorICB9CisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9CT1RIKF9PcCwgX1QxLCBfVDIsIF9UMykJXAorICBpbmxpbmUgX1QxIG9wZXJhdG9yIF9PcChfVDIgX19saHMsIF9UMyBfX3JocykJCQlcCisgIHsJCQkJCQkJCVwKKyAgICBfVDEgX19yZXR2YWw7CQkJCQkJXAorICAgIF9fcmV0dmFsLl9fc2V0dmFsKF9fbGhzLl9fZ2V0dmFsKCkgX09wIF9fcmhzLl9fZ2V0dmFsKCkpOwlcCisgICAgcmV0dXJuIF9fcmV0dmFsOwkJCQkJCVwKKyAgfQorCisjZGVmaW5lIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfTEhTKF9PcCwgX1QxLCBfVDIpCQlcCisgIGlubGluZSBfVDEgb3BlcmF0b3IgX09wKF9UMSBfX2xocywgX1QyIF9fcmhzKQkJCVwKKyAgewkJCQkJCQkJXAorICAgIF9UMSBfX3JldHZhbDsJCQkJCQlcCisgICAgX19yZXR2YWwuX19zZXR2YWwoX19saHMuX19nZXR2YWwoKSBfT3AgX19yaHMpOwkJXAorICAgIHJldHVybiBfX3JldHZhbDsJCQkJCQlcCisgIH0KKworI2RlZmluZSBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1JIUyhfT3AsIF9UMSwgX1QyKQkJXAorICBpbmxpbmUgX1QxIG9wZXJhdG9yIF9PcChfVDIgX19saHMsIF9UMSBfX3JocykJCQlcCisgIHsJCQkJCQkJCVwKKyAgICBfVDEgX19yZXR2YWw7CQkJCQkJXAorICAgIF9fcmV0dmFsLl9fc2V0dmFsKF9fbGhzIF9PcCBfX3Jocy5fX2dldHZhbCgpKTsJCVwKKyAgICByZXR1cm4gX19yZXR2YWw7CQkJCQkJXAorICB9CisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVChfT3AsIF9UMSkJCVwKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9MSFMoX09wLCBfVDEsIGludCk7CQkJXAorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX0xIUyhfT3AsIF9UMSwgdW5zaWduZWQgaW50KTsJXAorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX0xIUyhfT3AsIF9UMSwgbG9uZyk7CQlcCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfTEhTKF9PcCwgX1QxLCB1bnNpZ25lZCBsb25nKTsJXAorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX0xIUyhfT3AsIF9UMSwgbG9uZyBsb25nKTsJCVwKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9MSFMoX09wLCBfVDEsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CVwKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9SSFMoX09wLCBfVDEsIGludCk7CQkJXAorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1JIUyhfT3AsIF9UMSwgdW5zaWduZWQgaW50KTsJXAorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1JIUyhfT3AsIF9UMSwgbG9uZyk7CQlcCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfUkhTKF9PcCwgX1QxLCB1bnNpZ25lZCBsb25nKTsJXAorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1JIUyhfT3AsIF9UMSwgbG9uZyBsb25nKTsJCVwKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9SSFMoX09wLCBfVDEsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CVwKKworICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWwzMiwgZGVjaW1hbDMyLCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoKywgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWw2NCwgZGVjaW1hbDMyLCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKCssIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIsIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDEyOCwgZGVjaW1hbDY0LCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgrLCBkZWNpbWFsMTI4KQorCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDMyLCBkZWNpbWFsMzIsIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgtLCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDY0LCBkZWNpbWFsMzIsIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoLSwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWwxMjgsIGRlY2ltYWwzMiwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQsIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKC0sIGRlY2ltYWwxMjgpCisKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsMzIsIGRlY2ltYWwzMiwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKCosIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsNjQsIGRlY2ltYWwzMiwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgqLCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDEyOCwgZGVjaW1hbDMyLCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoKiwgZGVjaW1hbDEyOCkKKworICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWwzMiwgZGVjaW1hbDMyLCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoLywgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWw2NCwgZGVjaW1hbDMyLCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKC8sIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIsIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDEyOCwgZGVjaW1hbDY0LCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgvLCBkZWNpbWFsMTI4KQorCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQworI3VuZGVmIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfQk9USAorI3VuZGVmIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfTEhTCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9SSFMKKyN1bmRlZiBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UCisKKyAgLy8gSVNPL0lFQyBUUiAyNDczMyAgMy4yLjkgIENvbXBhcmlzb24gb3BlcmF0b3JzLgorCisjZGVmaW5lIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX0JPVEgoX09wLCBfVDEsIF9UMikJXAorICBpbmxpbmUgYm9vbCBvcGVyYXRvciBfT3AoX1QxIF9fbGhzLCBfVDIgX19yaHMpCVwKKyAgeyByZXR1cm4gX19saHMuX19nZXR2YWwoKSBfT3AgX19yaHMuX19nZXR2YWwoKTsgfQorCisjZGVmaW5lIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX0xIUyhfT3AsIF9UMSwgX1QyKQlcCisgIGlubGluZSBib29sIG9wZXJhdG9yIF9PcChfVDEgX19saHMsIF9UMiBfX3JocykJXAorICB7IHJldHVybiBfX2xocy5fX2dldHZhbCgpIF9PcCBfX3JoczsgfQorCisjZGVmaW5lIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX1JIUyhfT3AsIF9UMSwgX1QyKQlcCisgIGlubGluZSBib29sIG9wZXJhdG9yIF9PcChfVDEgX19saHMsIF9UMiBfX3JocykJXAorICB7IHJldHVybiBfX2xocyBfT3AgX19yaHMuX19nZXR2YWwoKTsgfQorCisjZGVmaW5lIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyhfT3AsIF9UcCkJCQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX0JPVEgoX09wLCBfVHAsIGRlY2ltYWwzMikJCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fQk9USChfT3AsIF9UcCwgZGVjaW1hbDY0KQkJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9CT1RIKF9PcCwgX1RwLCBkZWNpbWFsMTI4KQkJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9MSFMoX09wLCBfVHAsIGludCkJCQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX0xIUyhfT3AsIF9UcCwgdW5zaWduZWQgaW50KQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX0xIUyhfT3AsIF9UcCwgbG9uZykJCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fTEhTKF9PcCwgX1RwLCB1bnNpZ25lZCBsb25nKQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX0xIUyhfT3AsIF9UcCwgbG9uZyBsb25nKQkJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9MSFMoX09wLCBfVHAsIHVuc2lnbmVkIGxvbmcgbG9uZykJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9SSFMoX09wLCBpbnQsIF9UcCkJCQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX1JIUyhfT3AsIHVuc2lnbmVkIGludCwgX1RwKQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX1JIUyhfT3AsIGxvbmcsIF9UcCkJCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fUkhTKF9PcCwgdW5zaWduZWQgbG9uZywgX1RwKQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX1JIUyhfT3AsIGxvbmcgbG9uZywgX1RwKQkJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9SSFMoX09wLCB1bnNpZ25lZCBsb25nIGxvbmcsIF9UcCkKKworICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPT0sIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKD09LCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg9PSwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKCE9LCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyghPSwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoIT0sIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg8LCAgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPCwgIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKDwsICBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPD0sIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKDw9LCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg8PSwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKD4sICBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg+LCAgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPiwgIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg+PSwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPj0sIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKD49LCBkZWNpbWFsMTI4KQorCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fQk9USAorI3VuZGVmIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX0xIUworI3VuZGVmIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX1JIUworI3VuZGVmIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGRlY2ltYWwKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX0dMSUJDWFhfREVDSU1BTF9JTVBMICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlcXVlIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZXF1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzU4OWQ2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZXF1ZQpAQCAtMCwwICsxLDc2IEBACisvLyA8ZGVxdWU+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgaW5jbHVkZS9kZXF1ZQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERVFVRQorI2RlZmluZSBfR0xJQkNYWF9ERVFVRSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9jb25zdHJ1Y3QuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF91bmluaXRpYWxpemVkLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZGVxdWUuaD4KKyNpbmNsdWRlIDxiaXRzL3JhbmdlX2FjY2Vzcy5oPgorI2luY2x1ZGUgPGJpdHMvZGVxdWUudGNjPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyMgaW5jbHVkZSA8ZGVidWcvZGVxdWU+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyMgaW5jbHVkZSA8cHJvZmlsZS9kZXF1ZT4KKyNlbmRpZgorCisjZW5kaWYgLyogX0dMSUJDWFhfREVRVUUgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXhjZXB0aW9uIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leGNlcHRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwY2RhOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXhjZXB0aW9uCkBAIC0wLDAgKzEsMTU2IEBACisvLyBFeGNlcHRpb24gSGFuZGxpbmcgc3VwcG9ydCBoZWFkZXIgZm9yIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5NS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKy8vCisvLyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4Y2VwdGlvbgorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfX0VYQ0VQVElPTl9fCisjZGVmaW5lIF9fRVhDRVBUSU9OX18KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9hdG9taWNfbG9ja2ZyZWVfZGVmaW5lcy5oPgorCitleHRlcm4gIkMrKyIgeworCituYW1lc3BhY2Ugc3RkCit7CisgIC8qKgorICAgKiBAZGVmZ3JvdXAgZXhjZXB0aW9ucyBFeGNlcHRpb25zCisgICAqIEBpbmdyb3VwIGRpYWdub3N0aWNzCisgICAqCisgICAqIENsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmb3IgcmVwb3J0aW5nIGVycm9ycyB2aWEgZXhjZXB0aW9uIGNsYXNzZXMuCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiAgQGJyaWVmIEJhc2UgY2xhc3MgZm9yIGFsbCBsaWJyYXJ5IGV4Y2VwdGlvbnMuCisgICAqCisgICAqICBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIHN0YW5kYXJkCisgICAqICBsaWJyYXJ5LCBhbmQgYnkgY2VydGFpbiBsYW5ndWFnZSBleHByZXNzaW9ucy4gIFlvdSBhcmUgZnJlZSB0byBkZXJpdmUKKyAgICogIHlvdXIgb3duICVleGNlcHRpb24gY2xhc3Nlcywgb3IgdXNlIGEgZGlmZmVyZW50IGhpZXJhcmNoeSwgb3IgdG8KKyAgICogIHRocm93IG5vbi1jbGFzcyBkYXRhIChlLmcuLCBmdW5kYW1lbnRhbCB0eXBlcykuCisgICAqLworICBjbGFzcyBleGNlcHRpb24KKyAgeworICBwdWJsaWM6CisgICAgZXhjZXB0aW9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorICAgIHZpcnR1YWwgfmV4Y2VwdGlvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKworICAgIC8qKiBSZXR1cm5zIGEgQy1zdHlsZSBjaGFyYWN0ZXIgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGdlbmVyYWwgY2F1c2UKKyAgICAgKiAgb2YgdGhlIGN1cnJlbnQgZXJyb3IuICAqLworICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyAgfTsKKworICAvKiogSWYgYW4gJWV4Y2VwdGlvbiBpcyB0aHJvd24gd2hpY2ggaXMgbm90IGxpc3RlZCBpbiBhIGZ1bmN0aW9uJ3MKKyAgICogICVleGNlcHRpb24gc3BlY2lmaWNhdGlvbiwgb25lIG9mIHRoZXNlIG1heSBiZSB0aHJvd24uICAqLworICBjbGFzcyBiYWRfZXhjZXB0aW9uIDogcHVibGljIGV4Y2VwdGlvbgorICB7CisgIHB1YmxpYzoKKyAgICBiYWRfZXhjZXB0aW9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgLy8gVGhpcyBkZWNsYXJhdGlvbiBpcyBub3QgdXNlbGVzczoKKyAgICAvLyBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MtMy4wLjIvZ2NjXzYuaHRtbCNTRUMxMTgKKyAgICB2aXJ0dWFsIH5iYWRfZXhjZXB0aW9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisgICAgLy8gU2VlIGNvbW1lbnQgaW4gZWhfZXhjZXB0aW9uLmNjLgorICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyAgfTsKKworICAvLy8gSWYgeW91IHdyaXRlIGEgcmVwbGFjZW1lbnQgJXRlcm1pbmF0ZSBoYW5kbGVyLCBpdCBtdXN0IGJlIG9mIHRoaXMgdHlwZS4KKyAgdHlwZWRlZiB2b2lkICgqdGVybWluYXRlX2hhbmRsZXIpICgpOworCisgIC8vLyBJZiB5b3Ugd3JpdGUgYSByZXBsYWNlbWVudCAldW5leHBlY3RlZCBoYW5kbGVyLCBpdCBtdXN0IGJlIG9mIHRoaXMgdHlwZS4KKyAgdHlwZWRlZiB2b2lkICgqdW5leHBlY3RlZF9oYW5kbGVyKSAoKTsKKworICAvLy8gVGFrZXMgYSBuZXcgaGFuZGxlciBmdW5jdGlvbiBhcyBhbiBhcmd1bWVudCwgcmV0dXJucyB0aGUgb2xkIGZ1bmN0aW9uLgorICB0ZXJtaW5hdGVfaGFuZGxlciBzZXRfdGVybWluYXRlKHRlcm1pbmF0ZV9oYW5kbGVyKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyAgLyoqIFRoZSBydW50aW1lIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmICVleGNlcHRpb24gaGFuZGxpbmcgbXVzdCBiZQorICAgKiAgYWJhbmRvbmVkIGZvciBhbnkgcmVhc29uLiAgSXQgY2FuIGFsc28gYmUgY2FsbGVkIGJ5IHRoZSB1c2VyLiAgKi8KKyAgdm9pZCB0ZXJtaW5hdGUoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCisgIC8vLyBUYWtlcyBhIG5ldyBoYW5kbGVyIGZ1bmN0aW9uIGFzIGFuIGFyZ3VtZW50LCByZXR1cm5zIHRoZSBvbGQgZnVuY3Rpb24uCisgIHVuZXhwZWN0ZWRfaGFuZGxlciBzZXRfdW5leHBlY3RlZCh1bmV4cGVjdGVkX2hhbmRsZXIpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKworICAvKiogVGhlIHJ1bnRpbWUgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgYW4gJWV4Y2VwdGlvbiBpcyB0aHJvd24gd2hpY2gKKyAgICogIHZpb2xhdGVzIHRoZSBmdW5jdGlvbidzICVleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gICovCisgIHZvaWQgdW5leHBlY3RlZCgpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworICAvKiogWzE4LjYuNF0vMTogICdSZXR1cm5zIHRydWUgYWZ0ZXIgY29tcGxldGluZyBldmFsdWF0aW9uIG9mIGEKKyAgICogIHRocm93LWV4cHJlc3Npb24gdW50aWwgZWl0aGVyIGNvbXBsZXRpbmcgaW5pdGlhbGl6YXRpb24gb2YgdGhlCisgICAqICBleGNlcHRpb24tZGVjbGFyYXRpb24gaW4gdGhlIG1hdGNoaW5nIGhhbmRsZXIgb3IgZW50ZXJpbmcgQGMgdW5leHBlY3RlZCgpCisgICAqICBkdWUgdG8gdGhlIHRocm93OyBvciBhZnRlciBlbnRlcmluZyBAYyB0ZXJtaW5hdGUoKSBmb3IgYW55IHJlYXNvbgorICAgKiAgb3RoZXIgdGhhbiBhbiBleHBsaWNpdCBjYWxsIHRvIEBjIHRlcm1pbmF0ZSgpLiAgW05vdGU6IFRoaXMgaW5jbHVkZXMKKyAgICogIHN0YWNrIHVud2luZGluZyBbMTUuMl0uICBlbmQgbm90ZV0nCisgICAqCisgICAqICAyOiAnV2hlbiBAYyB1bmNhdWdodF9leGNlcHRpb24oKSBpcyB0cnVlLCB0aHJvd2luZyBhbgorICAgKiAgJWV4Y2VwdGlvbiBjYW4gcmVzdWx0IGluIGEgY2FsbCBvZiBAYyB0ZXJtaW5hdGUoKQorICAgKiAgKDE1LjUuMSkuJworICAgKi8KKyAgYm9vbCB1bmNhdWdodF9leGNlcHRpb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisKKyAgLy8gQH0gZ3JvdXAgZXhjZXB0aW9ucworfSAvLyBuYW1lc3BhY2Ugc3RkCisKK25hbWVzcGFjZSBfX2dudV9jeHgKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgQSByZXBsYWNlbWVudCBmb3IgdGhlIHN0YW5kYXJkIHRlcm1pbmF0ZV9oYW5kbGVyIHdoaWNoCisgICAqICBwcmludHMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGVybWluYXRpbmcgZXhjZXB0aW9uIChpZiBhbnkpCisgICAqICBvbiBzdGRlcnIuCisgICAqCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqCisgICAqICBDYWxsCisgICAqICAgQGNvZGUKKyAgICogICAgIHN0ZDo6c2V0X3Rlcm1pbmF0ZShfX2dudV9jeHg6Ol9fdmVyYm9zZV90ZXJtaW5hdGVfaGFuZGxlcikKKyAgICogICBAZW5kY29kZQorICAgKiAgdG8gdXNlLiAgRm9yIG1vcmUgaW5mbywgc2VlCisgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDAyY2gwNnMwMi5odG1sCisgICAqCisgICAqICBJbiAzLjQgYW5kIGxhdGVyLCB0aGlzIGlzIG9uIGJ5IGRlZmF1bHQuCisgICAqLworICB2b2lkIF9fdmVyYm9zZV90ZXJtaW5hdGVfaGFuZGxlcigpOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKK30gLy8gZXh0ZXJuICJDKysiCisKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcG9wCisKKyNpZiAoX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkgJiYgKEFUT01JQ19JTlRfTE9DS19GUkVFID4gMSkKKyNpbmNsdWRlIDxiaXRzL2V4Y2VwdGlvbl9wdHIuaD4KKyNpbmNsdWRlIDxiaXRzL25lc3RlZF9leGNlcHRpb24uaD4KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2FsZ29yaXRobSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2FsZ29yaXRobQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2MzM2I0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvYWxnb3JpdGhtCkBAIC0wLDAgKzEsNjAzIEBACisvLyBBbGdvcml0aG0gZXh0ZW5zaW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGV4dC9hbGdvcml0aG0KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLgorICovCisKKyNpZm5kZWYgX0VYVF9BTEdPUklUSE0KKyNkZWZpbmUgX0VYVF9BTEdPUklUSE0gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OnB0cmRpZmZfdDsKKyAgdXNpbmcgc3RkOjptaW47CisgIHVzaW5nIHN0ZDo6cGFpcjsKKyAgdXNpbmcgc3RkOjppbnB1dF9pdGVyYXRvcl90YWc7CisgIHVzaW5nIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc7CisgIHVzaW5nIHN0ZDo6aXRlcmF0b3JfdHJhaXRzOworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gY29weV9uIChub3QgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIHBhaXI8X0lucHV0SXRlcmF0b3IsIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfX2NvcHlfbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAorCSAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorCSAgICAgaW5wdXRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGZvciAoIDsgX19jb3VudCA+IDA7IC0tX19jb3VudCkKKwl7CisJICAqX19yZXN1bHQgPSAqX19maXJzdDsKKwkgICsrX19maXJzdDsKKwkgICsrX19yZXN1bHQ7CisJfQorICAgICAgcmV0dXJuIHBhaXI8X0lucHV0SXRlcmF0b3IsIF9PdXRwdXRJdGVyYXRvcj4oX19maXJzdCwgX19yZXN1bHQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgcGFpcjxfUkFJdGVyYXRvciwgX091dHB1dEl0ZXJhdG9yPgorICAgIF9fY29weV9uKF9SQUl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCisJICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisJICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBfUkFJdGVyYXRvciBfX2xhc3QgPSBfX2ZpcnN0ICsgX19jb3VudDsKKyAgICAgIHJldHVybiBwYWlyPF9SQUl0ZXJhdG9yLCBfT3V0cHV0SXRlcmF0b3I+KF9fbGFzdCwgc3RkOjpjb3B5KF9fZmlyc3QsCisJCQkJCQkJCSAgX19sYXN0LAorCQkJCQkJCQkgIF9fcmVzdWx0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcGllcyB0aGUgcmFuZ2UgW2ZpcnN0LGZpcnN0K2NvdW50KSBpbnRvIFtyZXN1bHQscmVzdWx0K2NvdW50KS4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fY291bnQgIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gY29weS4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIEEgc3RkOjpwYWlyIGNvbXBvc2VkIG9mIGZpcnN0K2NvdW50IGFuZCByZXN1bHQrY291bnQuCisgICAqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBUaGlzIGlubGluZSBmdW5jdGlvbiB3aWxsIGJvaWwgZG93biB0byBhIGNhbGwgdG8gQGMgbWVtbW92ZSB3aGVuZXZlcgorICAgKiAgcG9zc2libGUuICBGYWlsaW5nIHRoYXQsIGlmIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzIGFyZSBwYXNzZWQsIHRoZW4gdGhlCisgICAqICBsb29wIGNvdW50IHdpbGwgYmUga25vd24gKGFuZCB0aGVyZWZvcmUgYSBjYW5kaWRhdGUgZm9yIGNvbXBpbGVyCisgICAqICBvcHRpbWl6YXRpb25zIHN1Y2ggYXMgdW5yb2xsaW5nKS4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIHBhaXI8X0lucHV0SXRlcmF0b3IsIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBjb3B5X24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19jb3VudCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisKKyAgICAgIHJldHVybiBfX2dudV9jeHg6Ol9fY29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LAorCQkJCSBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMj4KKyAgICBpbnQKKyAgICBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLAorCQkJCSAgIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkJCSAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwKKwkJCQkgICBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MikKKyAgICB7CisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCXsKKwkgIGlmICgqX19maXJzdDEgPCAqX19maXJzdDIpCisJICAgIHJldHVybiAtMTsKKwkgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCisJICAgIHJldHVybiAxOworCSAgKytfX2ZpcnN0MTsKKwkgICsrX19maXJzdDI7CisJfQorICAgICAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisJcmV0dXJuICEoX19maXJzdDEgPT0gX19sYXN0MSk7CisgICAgICBlbHNlCisJcmV0dXJuIC0xOworICAgIH0KKworICBpbmxpbmUgaW50CisgIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2ZpcnN0MSwKKwkJCQkgY29uc3QgdW5zaWduZWQgY2hhciogX19sYXN0MSwKKwkJCQkgY29uc3QgdW5zaWduZWQgY2hhciogX19maXJzdDIsCisJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fbGFzdDIpCisgIHsKKyAgICBjb25zdCBwdHJkaWZmX3QgX19sZW4xID0gX19sYXN0MSAtIF9fZmlyc3QxOworICAgIGNvbnN0IHB0cmRpZmZfdCBfX2xlbjIgPSBfX2xhc3QyIC0gX19maXJzdDI7CisgICAgY29uc3QgaW50IF9fcmVzdWx0ID0gX19idWlsdGluX21lbWNtcChfX2ZpcnN0MSwgX19maXJzdDIsCisJCQkJCSAgbWluKF9fbGVuMSwgX19sZW4yKSk7CisgICAgcmV0dXJuIF9fcmVzdWx0ICE9IDAgPyBfX3Jlc3VsdAorCQkJIDogKF9fbGVuMSA9PSBfX2xlbjIgPyAwIDogKF9fbGVuMSA8IF9fbGVuMiA/IC0xIDogMSkpOworICB9CisKKyAgaW5saW5lIGludAorICBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoY29uc3QgY2hhciogX19maXJzdDEsIGNvbnN0IGNoYXIqIF9fbGFzdDEsCisJCQkJIGNvbnN0IGNoYXIqIF9fZmlyc3QyLCBjb25zdCBjaGFyKiBfX2xhc3QyKQorICB7CisjaWYgQ0hBUl9NQVggPT0gU0NIQVJfTUFYCisgICAgcmV0dXJuIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheSgoY29uc3Qgc2lnbmVkIGNoYXIqKSBfX2ZpcnN0MSwKKwkJCQkJICAoY29uc3Qgc2lnbmVkIGNoYXIqKSBfX2xhc3QxLAorCQkJCQkgIChjb25zdCBzaWduZWQgY2hhciopIF9fZmlyc3QyLAorCQkJCQkgIChjb25zdCBzaWduZWQgY2hhciopIF9fbGFzdDIpOworI2Vsc2UKKyAgICByZXR1cm4gX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19maXJzdDEsCisJCQkJCSAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfX2xhc3QxLAorCQkJCQkgIChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19maXJzdDIsCisJCQkJCSAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfX2xhc3QyKTsKKyNlbmRpZgorICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQGMgbWVtY21wIG9uIHN0ZXJvaWRzLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgQW4gaW50LCBhcyB3aXRoIEBjIG1lbWNtcC4KKyAgICoKKyAgICogIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBsZXNzIHRoYW4gemVybyBpZiB0aGUgZmlyc3QgcmFuZ2UgaXMKKyAgICogIDxlbT5sZXhpZ3JhcGhpY2FsbHkgbGVzcyB0aGFuPC9lbT4gdGhlIHNlY29uZCwgZ3JlYXRlciB0aGFuIHplcm8KKyAgICogIGlmIHRoZSBzZWNvbmQgcmFuZ2UgaXMgPGVtPmxleGlncmFwaGljYWxseSBsZXNzIHRoYW48L2VtPiB0aGUKKyAgICogIGZpcnN0LCBhbmQgemVybyBvdGhlcndpc2UuCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyPgorICAgIGludAorICAgIGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLAorCQkJCSBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJCQkgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLAorCQkJCSBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpOworCisgICAgICByZXR1cm4gX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwKKwkJCQkJICAgIF9fbGFzdDIpOworICAgIH0KKworICAvLyBjb3VudCBhbmQgY291bnRfaWY6IHRoaXMgdmVyc2lvbiwgd2hvc2UgcmV0dXJuIHR5cGUgaXMgdm9pZCwgd2FzIHByZXNlbnQKKyAgLy8gaW4gdGhlIEhQIFNUTCwgYW5kIGlzIHJldGFpbmVkIGFzIGFuIGV4dGVuc2lvbiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NpemU+CisgICAgdm9pZAorICAgIGNvdW50KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgIGNvbnN0IF9UcCYgX192YWx1ZSwKKwkgIF9TaXplJiBfX24pCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbGl0eUNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlID4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsaXR5Q29tcGFyYWJsZUNvbmNlcHQ8X1RwPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJaWYgKCpfX2ZpcnN0ID09IF9fdmFsdWUpCisJICArK19fbjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9TaXplPgorICAgIHZvaWQKKyAgICBjb3VudF9pZihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICBfUHJlZGljYXRlIF9fcHJlZCwKKwkgICAgIF9TaXplJiBfX24pCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCWlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgKytfX247CisgICAgfQorCisgIC8vIHJhbmRvbV9zYW1wbGUgYW5kIHJhbmRvbV9zYW1wbGVfbiAoZXh0ZW5zaW9ucywgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkKS4KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgcmFuZG9tX3NhbXBsZV9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX291dCwgY29uc3QgX0Rpc3RhbmNlIF9fbikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQl0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIF9EaXN0YW5jZSBfX3JlbWFpbmluZyA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9EaXN0YW5jZSBfX20gPSBtaW4oX19uLCBfX3JlbWFpbmluZyk7CisKKyAgICAgIHdoaWxlIChfX20gPiAwKQorCXsKKwkgIGlmICgoc3RkOjpyYW5kKCkgJSBfX3JlbWFpbmluZykgPCBfX20pCisJICAgIHsKKwkgICAgICAqX19vdXQgPSAqX19maXJzdDsKKwkgICAgICArK19fb3V0OworCSAgICAgIC0tX19tOworCSAgICB9CisJICAtLV9fcmVtYWluaW5nOworCSAgKytfX2ZpcnN0OworCX0KKyAgICAgIHJldHVybiBfX291dDsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0Rpc3RhbmNlLCB0eXBlbmFtZSBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHJhbmRvbV9zYW1wbGVfbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX291dCwgY29uc3QgX0Rpc3RhbmNlIF9fbiwKKwkJICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCXR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5RnVuY3Rpb25Db25jZXB0PAorCQlfUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBfRGlzdGFuY2UsIF9EaXN0YW5jZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgX0Rpc3RhbmNlIF9fcmVtYWluaW5nID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgX0Rpc3RhbmNlIF9fbSA9IG1pbihfX24sIF9fcmVtYWluaW5nKTsKKworICAgICAgd2hpbGUgKF9fbSA+IDApCisJeworCSAgaWYgKF9fcmFuZChfX3JlbWFpbmluZykgPCBfX20pCisJICAgIHsKKwkgICAgICAqX19vdXQgPSAqX19maXJzdDsKKwkgICAgICArK19fb3V0OworCSAgICAgIC0tX19tOworCSAgICB9CisJICAtLV9fcmVtYWluaW5nOworCSAgKytfX2ZpcnN0OworCX0KKyAgICAgIHJldHVybiBfX291dDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgX19yYW5kb21fc2FtcGxlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX291dCwKKwkJICAgIGNvbnN0IF9EaXN0YW5jZSBfX24pCisgICAgeworICAgICAgX0Rpc3RhbmNlIF9fbSA9IDA7CisgICAgICBfRGlzdGFuY2UgX190ID0gX19uOworICAgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX20gPCBfX247ICsrX19tLCArK19fZmlyc3QpCisJX19vdXRbX19tXSA9ICpfX2ZpcnN0OworCisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgKytfX3Q7CisJICBfRGlzdGFuY2UgX19NID0gc3RkOjpyYW5kKCkgJSAoX190KTsKKwkgIGlmIChfX00gPCBfX24pCisJICAgIF9fb3V0W19fTV0gPSAqX19maXJzdDsKKwkgICsrX19maXJzdDsKKwl9CisgICAgICByZXR1cm4gX19vdXQgKyBfX207CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JhbmRvbU51bWJlckdlbmVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorICAgIF9fcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19vdXQsCisJCSAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQsCisJCSAgICBjb25zdCBfRGlzdGFuY2UgX19uKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5RnVuY3Rpb25Db25jZXB0PAorCSAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBfRGlzdGFuY2UsIF9EaXN0YW5jZT4pCisKKyAgICAgIF9EaXN0YW5jZSBfX20gPSAwOworICAgICAgX0Rpc3RhbmNlIF9fdCA9IF9fbjsKKyAgICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19tIDwgX19uOyArK19fbSwgKytfX2ZpcnN0KQorCV9fb3V0W19fbV0gPSAqX19maXJzdDsKKworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgICsrX190OworCSAgX0Rpc3RhbmNlIF9fTSA9IF9fcmFuZChfX3QpOworCSAgaWYgKF9fTSA8IF9fbikKKwkgICAgX19vdXRbX19NXSA9ICpfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCX0KKyAgICAgIHJldHVybiBfX291dCArIF9fbTsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICByYW5kb21fc2FtcGxlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19vdXRfZmlyc3QsCisJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fb3V0X2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fb3V0X2ZpcnN0LCBfX291dF9sYXN0KTsKKworICAgICAgcmV0dXJuIF9fcmFuZG9tX3NhbXBsZShfX2ZpcnN0LCBfX2xhc3QsCisJCQkgICAgIF9fb3V0X2ZpcnN0LCBfX291dF9sYXN0IC0gX19vdXRfZmlyc3QpOworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICBpbmxpbmUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fb3V0X2ZpcnN0LAorCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX291dF9sYXN0LAorCQkgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fcmFuZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19vdXRfZmlyc3QsIF9fb3V0X2xhc3QpOworCisgICAgICByZXR1cm4gX19yYW5kb21fc2FtcGxlKF9fZmlyc3QsIF9fbGFzdCwKKwkJCSAgICAgX19vdXRfZmlyc3QsIF9fcmFuZCwKKwkJCSAgICAgX19vdXRfbGFzdCAtIF9fb3V0X2ZpcnN0KTsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHVzaW5nIHN0ZDo6aXNfaGVhcDsKKyNlbHNlCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgaXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19pc19oZWFwKF9fZmlyc3QsIF9fbGFzdCAtIF9fZmlyc3QpOworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1N0cmljdFdlYWtPcmRlcmluZywKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICByZXR1cm4gc3RkOjpfX2lzX2hlYXAoX19maXJzdCwgX19jb21wLCBfX2xhc3QgLSBfX2ZpcnN0KTsKKyAgICB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdXNpbmcgc3RkOjppc19zb3J0ZWQ7CisjZWxzZQorICAvLyBpc19zb3J0ZWQsIGEgcHJlZGljYXRlZCB0ZXN0aW5nIHdoZXRoZXIgYSByYW5nZSBpcyBzb3J0ZWQgaW4KKyAgLy8gbm9uZGVzY2VuZGluZyBvcmRlci4gIFRoaXMgaXMgYW4gZXh0ZW5zaW9uLCBub3QgcGFydCBvZiB0aGUgQysrCisgIC8vIHN0YW5kYXJkLgorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBib29sCisgICAgaXNfc29ydGVkKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIHRydWU7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICAgIGZvciAoKytfX25leHQ7IF9fbmV4dCAhPSBfX2xhc3Q7IF9fZmlyc3QgPSBfX25leHQsICsrX19uZXh0KQorCWlmICgqX19uZXh0IDwgKl9fZmlyc3QpCisJICByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgIGJvb2wKKyAgICBpc19zb3J0ZWQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9TdHJpY3RXZWFrT3JkZXJpbmcsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIHRydWU7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICAgIGZvciAoKytfX25leHQ7IF9fbmV4dCAhPSBfX2xhc3Q7IF9fZmlyc3QgPSBfX25leHQsICsrX19uZXh0KQorCWlmIChfX2NvbXAoKl9fbmV4dCwgKl9fZmlyc3QpKQorCSAgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorI2VuZGlmICAvLyBDKysxMQorCisgIC8qKgorICAgKiAgQGJyaWVmIEZpbmQgdGhlIG1lZGlhbiBvZiB0aHJlZSB2YWx1ZXMuCisgICAqICBAcGFyYW0gIF9fYSAgQSB2YWx1ZS4KKyAgICogIEBwYXJhbSAgX19iICBBIHZhbHVlLgorICAgKiAgQHBhcmFtICBfX2MgIEEgdmFsdWUuCisgICAqICBAcmV0dXJuIE9uZSBvZiBAcCBhLCBAcCBiIG9yIEBwIGMuCisgICAqCisgICAqICBJZiBAYyB7bCxtLG59IGlzIHNvbWUgY29udm9sdXRpb24gb2YgQHAge2EsYixjfSBzdWNoIHRoYXQgQGMgbDw9bTw9bgorICAgKiAgdGhlbiB0aGUgdmFsdWUgcmV0dXJuZWQgd2lsbCBiZSBAYyBtLgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3QgX1RwJgorICAgIF9fbWVkaWFuKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgY29uc3QgX1RwJiBfX2MpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDxfVHA+KQorICAgICAgaWYgKF9fYSA8IF9fYikKKwlpZiAoX19iIDwgX19jKQorCSAgcmV0dXJuIF9fYjsKKwllbHNlIGlmIChfX2EgPCBfX2MpCisJICByZXR1cm4gX19jOworCWVsc2UKKwkgIHJldHVybiBfX2E7CisgICAgICBlbHNlIGlmIChfX2EgPCBfX2MpCisJcmV0dXJuIF9fYTsKKyAgICAgIGVsc2UgaWYgKF9fYiA8IF9fYykKKwlyZXR1cm4gX19jOworICAgICAgZWxzZQorCXJldHVybiBfX2I7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEZpbmQgdGhlIG1lZGlhbiBvZiB0aHJlZSB2YWx1ZXMgdXNpbmcgYSBwcmVkaWNhdGUgZm9yIGNvbXBhcmlzb24uCisgICAqICBAcGFyYW0gIF9fYSAgICAgQSB2YWx1ZS4KKyAgICogIEBwYXJhbSAgX19iICAgICBBIHZhbHVlLgorICAgKiAgQHBhcmFtICBfX2MgICAgIEEgdmFsdWUuCisgICAqICBAcGFyYW0gIF9fY29tcCAgQSBiaW5hcnkgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiBPbmUgb2YgQHAgYSwgQHAgYiBvciBAcCBjLgorICAgKgorICAgKiAgSWYgQGMge2wsbSxufSBpcyBzb21lIGNvbnZvbHV0aW9uIG9mIEBwIHthLGIsY30gc3VjaCB0aGF0IEBwIGNvbXAobCxtKQorICAgKiAgYW5kIEBwIGNvbXAobSxuKSBhcmUgYm90aCB0cnVlIHRoZW4gdGhlIHZhbHVlIHJldHVybmVkIHdpbGwgYmUgQGMgbS4KKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjb25zdCBfVHAmCisgICAgX19tZWRpYW4oY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iLCBjb25zdCBfVHAmIF9fYywgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeUZ1bmN0aW9uQ29uY2VwdDxfQ29tcGFyZSwgYm9vbCwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgX1RwLCBfVHA+KQorICAgICAgaWYgKF9fY29tcChfX2EsIF9fYikpCisJaWYgKF9fY29tcChfX2IsIF9fYykpCisJICByZXR1cm4gX19iOworCWVsc2UgaWYgKF9fY29tcChfX2EsIF9fYykpCisJICByZXR1cm4gX19jOworCWVsc2UKKwkgIHJldHVybiBfX2E7CisgICAgICBlbHNlIGlmIChfX2NvbXAoX19hLCBfX2MpKQorCXJldHVybiBfX2E7CisgICAgICBlbHNlIGlmIChfX2NvbXAoX19iLCBfX2MpKQorCXJldHVybiBfX2M7CisgICAgICBlbHNlCisJcmV0dXJuIF9fYjsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9FWFRfQUxHT1JJVEhNICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9hbGxvY190cmFpdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2FsbG9jX3RyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzQ3M2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9hbGxvY190cmFpdHMuaApAQCAtMCwwICsxLDI0MiBAQAorLy8gQWxsb2NhdG9yIHRyYWl0cyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L2FsbG9jX3RyYWl0cy5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfRVhUX0FMTE9DX1RSQUlUU19ICisjZGVmaW5lIF9FWFRfQUxMT0NfVFJBSVRTX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvbW92ZS5oPgorIyBpbmNsdWRlIDxiaXRzL2FsbG9jX3RyYWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4gIC8vIGZvciBfX2FsbG9jX3N3YXAKKyNlbmRpZgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX19hbGxvY2F0b3JfYWx3YXlzX2NvbXBhcmVzX2VxdWFsCisgICAgeyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjb25zdCBib29sIF9fYWxsb2NhdG9yX2Fsd2F5c19jb21wYXJlc19lcXVhbDxfQWxsb2M+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWxsb2NhdG9yX2Fsd2F5c19jb21wYXJlc19lcXVhbDxzdGQ6OmFsbG9jYXRvcjxfVHA+PgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdCBib29sIF9fYWxsb2NhdG9yX2Fsd2F5c19jb21wYXJlc19lcXVhbDxzdGQ6OmFsbG9jYXRvcjxfVHA+Pjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBzdHJ1Y3QgYXJyYXlfYWxsb2NhdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FycmF5PgorICAgIHN0cnVjdCBfX2FsbG9jYXRvcl9hbHdheXNfY29tcGFyZXNfZXF1YWw8YXJyYXlfYWxsb2NhdG9yPF9UcCwgX0FycmF5Pj4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BcnJheT4KKyAgICBjb25zdCBib29sCisgICAgX19hbGxvY2F0b3JfYWx3YXlzX2NvbXBhcmVzX2VxdWFsPGFycmF5X2FsbG9jYXRvcjxfVHAsIF9BcnJheT4+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IGJpdG1hcF9hbGxvY2F0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FsbG9jYXRvcl9hbHdheXNfY29tcGFyZXNfZXF1YWw8Yml0bWFwX2FsbG9jYXRvcjxfVHA+PgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdCBib29sIF9fYWxsb2NhdG9yX2Fsd2F5c19jb21wYXJlc19lcXVhbDxiaXRtYXBfYWxsb2NhdG9yPF9UcD4+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IG1hbGxvY19hbGxvY2F0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FsbG9jYXRvcl9hbHdheXNfY29tcGFyZXNfZXF1YWw8bWFsbG9jX2FsbG9jYXRvcjxfVHA+PgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdCBib29sIF9fYWxsb2NhdG9yX2Fsd2F5c19jb21wYXJlc19lcXVhbDxtYWxsb2NfYWxsb2NhdG9yPF9UcD4+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IG10X2FsbG9jYXRvcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWxsb2NhdG9yX2Fsd2F5c19jb21wYXJlc19lcXVhbDxtdF9hbGxvY2F0b3I8X1RwPj4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3QgYm9vbCBfX2FsbG9jYXRvcl9hbHdheXNfY29tcGFyZXNfZXF1YWw8bXRfYWxsb2NhdG9yPF9UcD4+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IG5ld19hbGxvY2F0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FsbG9jYXRvcl9hbHdheXNfY29tcGFyZXNfZXF1YWw8bmV3X2FsbG9jYXRvcjxfVHA+PgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdCBib29sIF9fYWxsb2NhdG9yX2Fsd2F5c19jb21wYXJlc19lcXVhbDxuZXdfYWxsb2NhdG9yPF9UcD4+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IHBvb2xfYWxsb2NhdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hbGxvY2F0b3JfYWx3YXlzX2NvbXBhcmVzX2VxdWFsPHBvb2xfYWxsb2NhdG9yPF9UcD4+CisgICAgeyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0IGJvb2wgX19hbGxvY2F0b3JfYWx3YXlzX2NvbXBhcmVzX2VxdWFsPHBvb2xfYWxsb2NhdG9yPF9UcD4+Ojp2YWx1ZTsKKyNlbmRpZgorCisvKioKKyAqIEBicmllZiAgVW5pZm9ybSBpbnRlcmZhY2UgdG8gQysrOTggYW5kIEMrKzB4IGFsbG9jYXRvcnMuCisgKiBAaW5ncm91cCBhbGxvY2F0b3JzCisqLwordGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICBzdHJ1Y3QgX19hbGxvY190cmFpdHMKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIDogc3RkOjphbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4KKyNlbmRpZgorICB7CisgICAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHR5cGVkZWYgc3RkOjphbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4gICAgICAgICAgIF9CYXNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZV90eXBlOjp2YWx1ZV90eXBlICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlX3R5cGU6OnBvaW50ZXIgICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2VfdHlwZTo6Y29uc3RfcG9pbnRlciAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZV90eXBlOjpzaXplX3R5cGUgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2VfdHlwZTo6ZGlmZmVyZW5jZV90eXBlICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAvLyBDKysweCBhbGxvY2F0b3JzIGRvIG5vdCBkZWZpbmUgcmVmZXJlbmNlIG9yIGNvbnN0X3JlZmVyZW5jZQorICAgIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdXNpbmcgX0Jhc2VfdHlwZTo6YWxsb2NhdGU7CisgICAgdXNpbmcgX0Jhc2VfdHlwZTo6ZGVhbGxvY2F0ZTsKKyAgICB1c2luZyBfQmFzZV90eXBlOjpjb25zdHJ1Y3Q7CisgICAgdXNpbmcgX0Jhc2VfdHlwZTo6ZGVzdHJveTsKKyAgICB1c2luZyBfQmFzZV90eXBlOjptYXhfc2l6ZTsKKworICBwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHI+CisgICAgICBzdHJ1Y3QgX19pc19jdXN0b21fcG9pbnRlcgorICAgICAgOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIHN0ZDo6aXNfc2FtZTxwb2ludGVyLCBfUHRyPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc3RkOjppc19wb2ludGVyPF9QdHI+Ojp2YWx1ZT4KKyAgICAgIHsgfTsKKworICBwdWJsaWM6CisgICAgLy8gb3ZlcmxvYWQgY29uc3RydWN0IGZvciBub24tc3RhbmRhcmQgcG9pbnRlciB0eXBlcworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHIsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgc3RhdGljIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPF9faXNfY3VzdG9tX3BvaW50ZXI8X1B0cj46OnZhbHVlPjo6dHlwZQorICAgICAgY29uc3RydWN0KF9BbGxvYyYgX19hLCBfUHRyIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJX0Jhc2VfdHlwZTo6Y29uc3RydWN0KF9fYSwgc3RkOjphZGRyZXNzb2YoKl9fcCksCisJCQkgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgfQorCisgICAgLy8gb3ZlcmxvYWQgZGVzdHJveSBmb3Igbm9uLXN0YW5kYXJkIHBvaW50ZXIgdHlwZXMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyPgorICAgICAgc3RhdGljIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPF9faXNfY3VzdG9tX3BvaW50ZXI8X1B0cj46OnZhbHVlPjo6dHlwZQorICAgICAgZGVzdHJveShfQWxsb2MmIF9fYSwgX1B0ciBfX3ApCisgICAgICB7IF9CYXNlX3R5cGU6OmRlc3Ryb3koX19hLCBzdGQ6OmFkZHJlc3NvZigqX19wKSk7IH0KKworICAgIHN0YXRpYyBfQWxsb2MgX1Nfc2VsZWN0X29uX2NvcHkoY29uc3QgX0FsbG9jJiBfX2EpCisgICAgeyByZXR1cm4gX0Jhc2VfdHlwZTo6c2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbihfX2EpOyB9CisKKyAgICBzdGF0aWMgdm9pZCBfU19vbl9zd2FwKF9BbGxvYyYgX19hLCBfQWxsb2MmIF9fYikKKyAgICB7IHN0ZDo6X19hbGxvY19vbl9zd2FwKF9fYSwgX19iKTsgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9TX3Byb3BhZ2F0ZV9vbl9jb3B5X2Fzc2lnbigpCisgICAgeyByZXR1cm4gX0Jhc2VfdHlwZTo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9jb3B5X2Fzc2lnbm1lbnQ6OnZhbHVlOyB9CisKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgX1NfcHJvcGFnYXRlX29uX21vdmVfYXNzaWduKCkKKyAgICB7IHJldHVybiBfQmFzZV90eXBlOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDo6dmFsdWU7IH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfU19wcm9wYWdhdGVfb25fc3dhcCgpCisgICAgeyByZXR1cm4gX0Jhc2VfdHlwZTo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwOjp2YWx1ZTsgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9TX2Fsd2F5c19lcXVhbCgpCisgICAgeyByZXR1cm4gX19hbGxvY2F0b3JfYWx3YXlzX2NvbXBhcmVzX2VxdWFsPF9BbGxvYz46OnZhbHVlOyB9CisKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgX1Nfbm90aHJvd19tb3ZlKCkKKyAgICB7IHJldHVybiBfU19wcm9wYWdhdGVfb25fbW92ZV9hc3NpZ24oKSB8fCBfU19hbHdheXNfZXF1YWwoKTsgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9TX25vdGhyb3dfc3dhcCgpCisgICAgeworICAgICAgdXNpbmcgc3RkOjpzd2FwOworICAgICAgcmV0dXJuICFfU19wcm9wYWdhdGVfb25fc3dhcCgpCisgICAgICAgCXx8IG5vZXhjZXB0KHN3YXAoc3RkOjpkZWNsdmFsPF9BbGxvYyY+KCksIHN0ZDo6ZGVjbHZhbDxfQWxsb2MmPigpKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgc3RydWN0IHJlYmluZAorICAgICAgeyB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlX3R5cGU6OnRlbXBsYXRlIHJlYmluZF9hbGxvYzxfVHA+IG90aGVyOyB9OworI2Vsc2UKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpwb2ludGVyICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmNvbnN0X3BvaW50ZXIgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpyZWZlcmVuY2UgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcmVmZXJlbmNlICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgIHN0YXRpYyBwb2ludGVyCisgICAgYWxsb2NhdGUoX0FsbG9jJiBfX2EsIHNpemVfdHlwZSBfX24pCisgICAgeyByZXR1cm4gX19hLmFsbG9jYXRlKF9fbik7IH0KKworICAgIHN0YXRpYyB2b2lkIGRlYWxsb2NhdGUoX0FsbG9jJiBfX2EsIHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKQorICAgIHsgX19hLmRlYWxsb2NhdGUoX19wLCBfX24pOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoX0FsbG9jJiBfX2EsIHBvaW50ZXIgX19wLCBjb25zdCBfVHAmIF9fYXJnKQorICAgICAgeyBfX2EuY29uc3RydWN0KF9fcCwgX19hcmcpOyB9CisKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KF9BbGxvYyYgX19hLCBwb2ludGVyIF9fcCkKKyAgICB7IF9fYS5kZXN0cm95KF9fcCk7IH0KKworICAgIHN0YXRpYyBzaXplX3R5cGUgbWF4X3NpemUoY29uc3QgX0FsbG9jJiBfX2EpCisgICAgeyByZXR1cm4gX19hLm1heF9zaXplKCk7IH0KKworICAgIHN0YXRpYyBjb25zdCBfQWxsb2MmIF9TX3NlbGVjdF9vbl9jb3B5KGNvbnN0IF9BbGxvYyYgX19hKSB7IHJldHVybiBfX2E7IH0KKworICAgIHN0YXRpYyB2b2lkIF9TX29uX3N3YXAoX0FsbG9jJiBfX2EsIF9BbGxvYyYgX19iKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzMS4gU3dhcHBpbmcgY29udGFpbmVycyB3aXRoIHVuZXF1YWwgYWxsb2NhdG9ycy4KKyAgICAgIHN0ZDo6X19hbGxvY19zd2FwPF9BbGxvYz46Ol9TX2RvX2l0KF9fYSwgX19iKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdHJ1Y3QgcmViaW5kCisgICAgICB7IHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1RwPjo6b3RoZXIgb3RoZXI7IH07CisjZW5kaWYKKyAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9hcnJheV9hbGxvY2F0b3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2FycmF5X2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YTZhMzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9hcnJheV9hbGxvY2F0b3IuaApAQCAtMCwwICsxLDE3MiBAQAorLy8gYXJyYXkgYWxsb2NhdG9yIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvYXJyYXlfYWxsb2NhdG9yLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9BUlJBWV9BTExPQ0FUT1JfSAorI2RlZmluZSBfQVJSQVlfQUxMT0NBVE9SX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPHRyMS9hcnJheT4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjZW5kaWYKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgdXNpbmcgc3RkOjpzaXplX3Q7CisgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisKKyAgLy8vIEJhc2UgY2xhc3MuCisgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGFycmF5X2FsbG9jYXRvcl9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgIAlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCogICAgICAgCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCogCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJgljb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgCXZhbHVlX3R5cGU7CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX194KTsgfQorCisgICAgICBjb25zdF9wb2ludGVyCisgICAgICBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgdm9pZAorICAgICAgZGVhbGxvY2F0ZShwb2ludGVyLCBzaXplX3R5cGUpCisgICAgICB7IAorCS8vIERvZXMgbm90aGluZy4KKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCAKKyAgICAgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QoX1VwKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsgOjpuZXcoKHZvaWQgKilfX3ApIF9VcChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgdm9pZCAKKyAgICAgICAgZGVzdHJveShfVXAqIF9fcCkgeyBfX3AtPn5fVXAoKTsgfQorI2Vsc2UKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQwMi4gd3JvbmcgbmV3IGV4cHJlc3Npb24gaW4gW3NvbWVfXSBhbGxvY2F0b3I6OmNvbnN0cnVjdAorICAgICAgdm9pZCAKKyAgICAgIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkgCisgICAgICB7IDo6bmV3KCh2b2lkICopX19wKSB2YWx1ZV90eXBlKF9fdmFsKTsgfQorCisgICAgICB2b2lkIAorICAgICAgZGVzdHJveShwb2ludGVyIF9fcCkgeyBfX3AtPn5fVHAoKTsgfQorI2VuZGlmCisgICAgfTsgIAorCisgIC8qKgorICAgKiAgQGJyaWVmICBBbiBhbGxvY2F0b3IgdGhhdCB1c2VzIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeS4KKyAgICogIFRoaXMgbWVtb3J5IGNhbiBiZSBleHRlcm5hbGx5LCBnbG9iYWxseSwgb3Igb3RoZXJ3aXNlIGFsbG9jYXRlZC4KKyAgICogIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FycmF5ID0gc3RkOjp0cjE6OmFycmF5PF9UcCwgMT4gPgorICAgIGNsYXNzIGFycmF5X2FsbG9jYXRvciA6IHB1YmxpYyBhcnJheV9hbGxvY2F0b3JfYmFzZTxfVHA+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgIAlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCogICAgICAgCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCogCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJiAJY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgIAl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQXJyYXkJCWFycmF5X3R5cGU7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTAzLiBzdGQ6OmFsbG9jYXRvciBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudAorICAgICAgdHlwZWRlZiBzdGQ6OnRydWVfdHlwZSBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKyAgICAgIGFycmF5X3R5cGUqIAlfTV9hcnJheTsKKyAgICAgIHNpemVfdHlwZSAJX01fdXNlZDsKKworICAgIHB1YmxpYzoKKyAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0FycmF5MSA9IF9BcnJheT4KKyAgICAgICAgc3RydWN0IHJlYmluZAorICAgICAgICB7IHR5cGVkZWYgYXJyYXlfYWxsb2NhdG9yPF9UcDEsIF9BcnJheTE+IG90aGVyOyB9OworCisgICAgICBhcnJheV9hbGxvY2F0b3IoYXJyYXlfdHlwZSogX19hcnJheSA9IDApIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCAKKyAgICAgIDogX01fYXJyYXkoX19hcnJheSksIF9NX3VzZWQoc2l6ZV90eXBlKCkpIHsgfQorCisgICAgICBhcnJheV9hbGxvY2F0b3IoY29uc3QgYXJyYXlfYWxsb2NhdG9yJiBfX28pIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCAKKyAgICAgIDogX01fYXJyYXkoX19vLl9NX2FycmF5KSwgX01fdXNlZChfX28uX01fdXNlZCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9BcnJheTE+CisgICAgICAgIGFycmF5X2FsbG9jYXRvcihjb25zdCBhcnJheV9hbGxvY2F0b3I8X1RwMSwgX0FycmF5MT4mKQorCV9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorCTogX01fYXJyYXkoMCksIF9NX3VzZWQoc2l6ZV90eXBlKCkpIHsgfQorCisgICAgICB+YXJyYXlfYWxsb2NhdG9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICBwb2ludGVyCisgICAgICBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBjb25zdCB2b2lkKiA9IDApCisgICAgICB7CisJaWYgKF9NX2FycmF5ID09IDAgfHwgX01fdXNlZCArIF9fbiA+IF9NX2FycmF5LT5zaXplKCkpCisJICBzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisJcG9pbnRlciBfX3JldCA9IF9NX2FycmF5LT5iZWdpbigpICsgX01fdXNlZDsKKwlfTV91c2VkICs9IF9fbjsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BcnJheT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgYXJyYXlfYWxsb2NhdG9yPF9UcCwgX0FycmF5PiYsCisJICAgICAgIGNvbnN0IGFycmF5X2FsbG9jYXRvcjxfVHAsIF9BcnJheT4mKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FycmF5PgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBhcnJheV9hbGxvY2F0b3I8X1RwLCBfQXJyYXk+JiwgCisJICAgICAgIGNvbnN0IGFycmF5X2FsbG9jYXRvcjxfVHAsIF9BcnJheT4mKQorICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9hdG9taWNpdHkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2F0b21pY2l0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMzljOTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9hdG9taWNpdHkuaApAQCAtMCwwICsxLDExNyBAQAorLy8gU3VwcG9ydCBmb3IgYXRvbWljIG9wZXJhdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9hdG9taWNpdHkuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQVRPTUlDSVRZX0gKKyNkZWZpbmUgX0dMSUJDWFhfQVRPTUlDSVRZX0gJMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvZ3Roci5oPgorI2luY2x1ZGUgPGJpdHMvYXRvbWljX3dvcmQuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEZ1bmN0aW9ucyBmb3IgcG9ydGFibGUgYXRvbWljIGFjY2Vzcy4KKyAgLy8gVG8gYWJzdHJhY3QgbG9ja2luZyBwcmltaXRpdmVzIGFjcm9zcyBhbGwgdGhyZWFkIHBvbGljaWVzLCB1c2U6CisgIC8vIF9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaAorICAvLyBfX2F0b21pY19hZGRfZGlzcGF0Y2gKKyNpZmRlZiBfR0xJQkNYWF9BVE9NSUNfQlVJTFRJTlMKKyAgc3RhdGljIGlubGluZSBfQXRvbWljX3dvcmQKKyAgX19leGNoYW5nZV9hbmRfYWRkKHZvbGF0aWxlIF9BdG9taWNfd29yZCogX19tZW0sIGludCBfX3ZhbCkKKyAgeyByZXR1cm4gX19hdG9taWNfZmV0Y2hfYWRkKF9fbWVtLCBfX3ZhbCwgX19BVE9NSUNfQUNRX1JFTCk7IH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQKKyAgX19hdG9taWNfYWRkKHZvbGF0aWxlIF9BdG9taWNfd29yZCogX19tZW0sIGludCBfX3ZhbCkKKyAgeyBfX2F0b21pY19mZXRjaF9hZGQoX19tZW0sIF9fdmFsLCBfX0FUT01JQ19BQ1FfUkVMKTsgfQorI2Vsc2UKKyAgX0F0b21pY193b3JkCisgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkKKyAgX19leGNoYW5nZV9hbmRfYWRkKHZvbGF0aWxlIF9BdG9taWNfd29yZCosIGludCkgdGhyb3cgKCk7CisKKyAgdm9pZAorICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisgIF9fYXRvbWljX2FkZCh2b2xhdGlsZSBfQXRvbWljX3dvcmQqLCBpbnQpIHRocm93ICgpOworI2VuZGlmCisKKyAgc3RhdGljIGlubGluZSBfQXRvbWljX3dvcmQKKyAgX19leGNoYW5nZV9hbmRfYWRkX3NpbmdsZShfQXRvbWljX3dvcmQqIF9fbWVtLCBpbnQgX192YWwpCisgIHsKKyAgICBfQXRvbWljX3dvcmQgX19yZXN1bHQgPSAqX19tZW07CisgICAgKl9fbWVtICs9IF9fdmFsOworICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZAorICBfX2F0b21pY19hZGRfc2luZ2xlKF9BdG9taWNfd29yZCogX19tZW0sIGludCBfX3ZhbCkKKyAgeyAqX19tZW0gKz0gX192YWw7IH0KKworICBzdGF0aWMgaW5saW5lIF9BdG9taWNfd29yZAorICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisgIF9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaChfQXRvbWljX3dvcmQqIF9fbWVtLCBpbnQgX192YWwpCisgIHsKKyNpZmRlZiBfX0dUSFJFQURTCisgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorICAgICAgcmV0dXJuIF9fZXhjaGFuZ2VfYW5kX2FkZChfX21lbSwgX192YWwpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBfX2V4Y2hhbmdlX2FuZF9hZGRfc2luZ2xlKF9fbWVtLCBfX3ZhbCk7CisjZWxzZQorICAgIHJldHVybiBfX2V4Y2hhbmdlX2FuZF9hZGRfc2luZ2xlKF9fbWVtLCBfX3ZhbCk7CisjZW5kaWYKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZAorICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisgIF9fYXRvbWljX2FkZF9kaXNwYXRjaChfQXRvbWljX3dvcmQqIF9fbWVtLCBpbnQgX192YWwpCisgIHsKKyNpZmRlZiBfX0dUSFJFQURTCisgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorICAgICAgX19hdG9taWNfYWRkKF9fbWVtLCBfX3ZhbCk7CisgICAgZWxzZQorICAgICAgX19hdG9taWNfYWRkX3NpbmdsZShfX21lbSwgX192YWwpOworI2Vsc2UKKyAgICBfX2F0b21pY19hZGRfc2luZ2xlKF9fbWVtLCBfX3ZhbCk7CisjZW5kaWYKKyAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKy8vIEV2ZW4gaWYgdGhlIENQVSBkb2Vzbid0IG5lZWQgYSBtZW1vcnkgYmFycmllciwgd2UgbmVlZCB0byBlbnN1cmUKKy8vIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgcmVvcmRlciBtZW1vcnkgYWNjZXNzZXMgYWNyb3NzIHRoZQorLy8gYmFycmllcnMuCisjaWZuZGVmIF9HTElCQ1hYX1JFQURfTUVNX0JBUlJJRVIKKyNkZWZpbmUgX0dMSUJDWFhfUkVBRF9NRU1fQkFSUklFUiBfX2FzbSBfX3ZvbGF0aWxlICgiIjo6OiJtZW1vcnkiKQorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1dSSVRFX01FTV9CQVJSSUVSCisjZGVmaW5lIF9HTElCQ1hYX1dSSVRFX01FTV9CQVJSSUVSIF9fYXNtIF9fdm9sYXRpbGUgKCIiOjo6Im1lbW9yeSIpCisjZW5kaWYKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvYml0bWFwX2FsbG9jYXRvci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvYml0bWFwX2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmU4NjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9iaXRtYXBfYWxsb2NhdG9yLmgKQEAgLTAsMCArMSwxMTE5IEBACisvLyBCaXRtYXAgQWxsb2NhdG9yLiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L2JpdG1hcF9hbGxvY2F0b3IuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0JJVE1BUF9BTExPQ0FUT1JfSAorI2RlZmluZSBfQklUTUFQX0FMTE9DQVRPUl9IIDEKKworI2luY2x1ZGUgPHV0aWxpdHk+IC8vIEZvciBzdGQ6OnBhaXIuCisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPiAvLyBGb3IgX190aHJvd19iYWRfYWxsb2MoKS4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPiAvLyBGb3IgZ3JlYXRlcl9lcXVhbCwgYW5kIGxlc3NfZXF1YWwuCisjaW5jbHVkZSA8bmV3PiAvLyBGb3Igb3BlcmF0b3IgbmV3LgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+IC8vIF9HTElCQ1hYX0RFQlVHX0FTU0VSVAorI2luY2x1ZGUgPGV4dC9jb25jdXJyZW5jZS5oPgorI2luY2x1ZGUgPGJpdHMvbW92ZS5oPgorCisvKiogQGJyaWVmIFRoZSBjb25zdGFudCBpbiB0aGUgZXhwcmVzc2lvbiBiZWxvdyBpcyB0aGUgYWxpZ25tZW50CisgKiByZXF1aXJlZCBpbiBieXRlcy4KKyAqLworI2RlZmluZSBfQkFMTE9DX0FMSUdOX0JZVEVTIDgKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CisgIHVzaW5nIHN0ZDo6c2l6ZV90OworICB1c2luZyBzdGQ6OnB0cmRpZmZfdDsKKworICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorICAgIC8qKiBAY2xhc3MgIF9fbWluaV92ZWN0b3IgYml0bWFwX2FsbG9jYXRvci5oIGJpdG1hcF9hbGxvY2F0b3IuaAorICAgICAqCisgICAgICogIEBicmllZiAgX19taW5pX3ZlY3Rvcjw+IGlzIGEgc3RyaXBwZWQgZG93biB2ZXJzaW9uIG9mIHRoZQorICAgICAqICBmdWxsLWZsZWRnZWQgc3RkOjp2ZWN0b3I8Pi4KKyAgICAgKgorICAgICAqICBJdCBpcyB0byBiZSB1c2VkIG9ubHkgZm9yIGJ1aWx0LWluIHR5cGVzIG9yIFBPRHMuIE5vdGFibGUKKyAgICAgKiAgZGlmZmVyZW5jZXMgYXJlOgorICAgICAqIAorICAgICAqICAxLiBOb3QgYWxsIGFjY2Vzc29yIGZ1bmN0aW9ucyBhcmUgcHJlc2VudC4KKyAgICAgKiAgMi4gVXNlZCBPTkxZIGZvciBQT0RzLgorICAgICAqICAzLiBObyBBbGxvY2F0b3IgdGVtcGxhdGUgYXJndW1lbnQuIFVzZXMgOjpvcGVyYXRvciBuZXcoKSB0byBnZXQKKyAgICAgKiAgbWVtb3J5LCBhbmQgOjpvcGVyYXRvciBkZWxldGUoKSB0byBmcmVlIGl0LgorICAgICAqICBDYXZlYXQ6IFRoZSBkdG9yIGRvZXMgTk9UIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQsIHNvIHRoaXMgYQorICAgICAqICBtZW1vcnktbGVha2luZyB2ZWN0b3IhCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgY2xhc3MgX19taW5pX3ZlY3RvcgorICAgICAgeworCV9fbWluaV92ZWN0b3IoY29uc3QgX19taW5pX3ZlY3RvciYpOworCV9fbWluaV92ZWN0b3ImIG9wZXJhdG9yPShjb25zdCBfX21pbmlfdmVjdG9yJik7CisKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCXR5cGVkZWYgX1RwKiBwb2ludGVyOworCXR5cGVkZWYgX1RwJiByZWZlcmVuY2U7CisJdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKKwl0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisJdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworCXR5cGVkZWYgcG9pbnRlciBpdGVyYXRvcjsKKworICAgICAgcHJpdmF0ZToKKwlwb2ludGVyIF9NX3N0YXJ0OworCXBvaW50ZXIgX01fZmluaXNoOworCXBvaW50ZXIgX01fZW5kX29mX3N0b3JhZ2U7CisKKwlzaXplX3R5cGUKKwlfTV9zcGFjZV9sZWZ0KCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fZmluaXNoOyB9CisKKwlwb2ludGVyCisJYWxsb2NhdGUoc2l6ZV90eXBlIF9fbikKKwl7IHJldHVybiBzdGF0aWNfY2FzdDxwb2ludGVyPig6Om9wZXJhdG9yIG5ldyhfX24gKiBzaXplb2YoX1RwKSkpOyB9CisKKwl2b2lkCisJZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlKQorCXsgOjpvcGVyYXRvciBkZWxldGUoX19wKTsgfQorCisgICAgICBwdWJsaWM6CisJLy8gTWVtYmVycyB1c2VkOiBzaXplKCksIHB1c2hfYmFjaygpLCBwb3BfYmFjaygpLAorCS8vIGluc2VydChpdGVyYXRvciwgY29uc3RfcmVmZXJlbmNlKSwgZXJhc2UoaXRlcmF0b3IpLAorCS8vIGJlZ2luKCksIGVuZCgpLCBiYWNrKCksIG9wZXJhdG9yW10uCisKKwlfX21pbmlfdmVjdG9yKCkKKyAgICAgICAgOiBfTV9zdGFydCgwKSwgX01fZmluaXNoKDApLCBfTV9lbmRfb2Zfc3RvcmFnZSgwKSB7IH0KKworCXNpemVfdHlwZQorCXNpemUoKSBjb25zdCB0aHJvdygpCisJeyByZXR1cm4gX01fZmluaXNoIC0gX01fc3RhcnQ7IH0KKworCWl0ZXJhdG9yCisJYmVnaW4oKSBjb25zdCB0aHJvdygpCisJeyByZXR1cm4gdGhpcy0+X01fc3RhcnQ7IH0KKworCWl0ZXJhdG9yCisJZW5kKCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIHRoaXMtPl9NX2ZpbmlzaDsgfQorCisJcmVmZXJlbmNlCisJYmFjaygpIGNvbnN0IHRocm93KCkKKwl7IHJldHVybiAqKHRoaXMtPmVuZCgpIC0gMSk7IH0KKworCXJlZmVyZW5jZQorCW9wZXJhdG9yW10oY29uc3Qgc2l6ZV90eXBlIF9fcG9zKSBjb25zdCB0aHJvdygpCisJeyByZXR1cm4gdGhpcy0+X01fc3RhcnRbX19wb3NdOyB9CisKKwl2b2lkCisJaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdF9yZWZlcmVuY2UgX194KTsKKworCXZvaWQKKwlwdXNoX2JhY2soY29uc3RfcmVmZXJlbmNlIF9feCkKKwl7CisJICBpZiAodGhpcy0+X01fc3BhY2VfbGVmdCgpKQorCSAgICB7CisJICAgICAgKnRoaXMtPmVuZCgpID0gX194OworCSAgICAgICsrdGhpcy0+X01fZmluaXNoOworCSAgICB9CisJICBlbHNlCisJICAgIHRoaXMtPmluc2VydCh0aGlzLT5lbmQoKSwgX194KTsKKwl9CisKKwl2b2lkCisJcG9wX2JhY2soKSB0aHJvdygpCisJeyAtLXRoaXMtPl9NX2ZpbmlzaDsgfQorCisJdm9pZAorCWVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB0aHJvdygpOworCisJdm9pZAorCWNsZWFyKCkgdGhyb3coKQorCXsgdGhpcy0+X01fZmluaXNoID0gdGhpcy0+X01fc3RhcnQ7IH0KKyAgICAgIH07CisKKyAgICAvLyBPdXQgb2YgbGluZSBmdW5jdGlvbiBkZWZpbml0aW9ucy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICB2b2lkIF9fbWluaV92ZWN0b3I8X1RwPjo6CisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X3JlZmVyZW5jZSBfX3gpCisgICAgICB7CisJaWYgKHRoaXMtPl9NX3NwYWNlX2xlZnQoKSkKKwkgIHsKKwkgICAgc2l6ZV90eXBlIF9fdG9fbW92ZSA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fcG9zOworCSAgICBpdGVyYXRvciBfX2Rlc3QgPSB0aGlzLT5lbmQoKTsKKwkgICAgaXRlcmF0b3IgX19zcmMgPSB0aGlzLT5lbmQoKSAtIDE7CisKKwkgICAgKyt0aGlzLT5fTV9maW5pc2g7CisJICAgIHdoaWxlIChfX3RvX21vdmUpCisJICAgICAgeworCQkqX19kZXN0ID0gKl9fc3JjOworCQktLV9fZGVzdDsgLS1fX3NyYzsgLS1fX3RvX21vdmU7CisJICAgICAgfQorCSAgICAqX19wb3MgPSBfX3g7CisJICB9CisJZWxzZQorCSAgeworCSAgICBzaXplX3R5cGUgX19uZXdfc2l6ZSA9IHRoaXMtPnNpemUoKSA/IHRoaXMtPnNpemUoKSAqIDIgOiAxOworCSAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IHRoaXMtPmFsbG9jYXRlKF9fbmV3X3NpemUpOworCSAgICBpdGVyYXRvciBfX2ZpcnN0ID0gdGhpcy0+YmVnaW4oKTsKKwkgICAgaXRlcmF0b3IgX19zdGFydCA9IF9fbmV3X3N0YXJ0OworCSAgICB3aGlsZSAoX19maXJzdCAhPSBfX3BvcykKKwkgICAgICB7CisJCSpfX3N0YXJ0ID0gKl9fZmlyc3Q7CisJCSsrX19zdGFydDsgKytfX2ZpcnN0OworCSAgICAgIH0KKwkgICAgKl9fc3RhcnQgPSBfX3g7CisJICAgICsrX19zdGFydDsKKwkgICAgd2hpbGUgKF9fZmlyc3QgIT0gdGhpcy0+ZW5kKCkpCisJICAgICAgeworCQkqX19zdGFydCA9ICpfX2ZpcnN0OworCQkrK19fc3RhcnQ7ICsrX19maXJzdDsKKwkgICAgICB9CisJICAgIGlmICh0aGlzLT5fTV9zdGFydCkKKwkgICAgICB0aGlzLT5kZWFsbG9jYXRlKHRoaXMtPl9NX3N0YXJ0LCB0aGlzLT5zaXplKCkpOworCisJICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisJICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fc3RhcnQ7CisJICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlID0gdGhpcy0+X01fc3RhcnQgKyBfX25ld19zaXplOworCSAgfQorICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgdm9pZCBfX21pbmlfdmVjdG9yPF9UcD46OgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHRocm93KCkKKyAgICAgIHsKKwl3aGlsZSAoX19wb3MgKyAxICE9IHRoaXMtPmVuZCgpKQorCSAgeworCSAgICAqX19wb3MgPSBfX3Bvc1sxXTsKKwkgICAgKytfX3BvczsKKwkgIH0KKwktLXRoaXMtPl9NX2ZpbmlzaDsKKyAgICAgIH0KKworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgc3RydWN0IF9fbXZfaXRlcl90cmFpdHMKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9UcDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX1RwOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0cnVjdCBfX212X2l0ZXJfdHJhaXRzPF9UcCo+CisgICAgICB7CisJdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKwl0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB9OworCisgICAgZW51bSAKKyAgICAgIHsgCisJYml0c19wZXJfYnl0ZSA9IDgsCisJYml0c19wZXJfYmxvY2sgPSBzaXplb2Yoc2l6ZV90KSAqIHNpemVfdChiaXRzX3Blcl9ieXRlKSAKKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgX19sb3dlcl9ib3VuZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgY29uc3QgX1RwJiBfX3ZhbCwgX0NvbXBhcmUgX19jb21wKQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX19tdl9pdGVyX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJICBfRGlzdGFuY2VUeXBlOworCisJX0Rpc3RhbmNlVHlwZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisJX0Rpc3RhbmNlVHlwZSBfX2hhbGY7CisJX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZTsKKworCXdoaWxlIChfX2xlbiA+IDApCisJICB7CisJICAgIF9faGFsZiA9IF9fbGVuID4+IDE7CisJICAgIF9fbWlkZGxlID0gX19maXJzdDsKKwkgICAgX19taWRkbGUgKz0gX19oYWxmOworCSAgICBpZiAoX19jb21wKCpfX21pZGRsZSwgX192YWwpKQorCSAgICAgIHsKKwkJX19maXJzdCA9IF9fbWlkZGxlOworCQkrK19fZmlyc3Q7CisJCV9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIF9fbGVuID0gX19oYWxmOworCSAgfQorCXJldHVybiBfX2ZpcnN0OworICAgICAgfQorCisgICAgLyoqIEBicmllZiBUaGUgbnVtYmVyIG9mIEJsb2NrcyBwb2ludGVkIHRvIGJ5IHRoZSBhZGRyZXNzIHBhaXIKKyAgICAgKiAgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWRkclBhaXI+CisgICAgICBpbmxpbmUgc2l6ZV90CisgICAgICBfX251bV9ibG9ja3MoX0FkZHJQYWlyIF9fYXApCisgICAgICB7IHJldHVybiAoX19hcC5zZWNvbmQgLSBfX2FwLmZpcnN0KSArIDE7IH0KKworICAgIC8qKiBAYnJpZWYgVGhlIG51bWJlciBvZiBCaXQtbWFwcyBwb2ludGVkIHRvIGJ5IHRoZSBhZGRyZXNzIHBhaXIKKyAgICAgKiAgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWRkclBhaXI+CisgICAgICBpbmxpbmUgc2l6ZV90CisgICAgICBfX251bV9iaXRtYXBzKF9BZGRyUGFpciBfX2FwKQorICAgICAgeyByZXR1cm4gX19udW1fYmxvY2tzKF9fYXApIC8gc2l6ZV90KGJpdHNfcGVyX2Jsb2NrKTsgfQorCisgICAgLy8gX1RwIHNob3VsZCBiZSBhIHBvaW50ZXIgdHlwZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBjbGFzcyBfSW5jbHVzaXZlX2JldHdlZW4gCisgICAgICA6IHB1YmxpYyBzdGQ6OnVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIHN0ZDo6cGFpcjxfVHAsIF9UcD4sIGJvb2w+CisgICAgICB7CisJdHlwZWRlZiBfVHAgcG9pbnRlcjsKKwlwb2ludGVyIF9NX3B0cl92YWx1ZTsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cGFpcjxfVHAsIF9UcD4gX0Jsb2NrX3BhaXI7CisJCisgICAgICBwdWJsaWM6CisJX0luY2x1c2l2ZV9iZXR3ZWVuKHBvaW50ZXIgX19wdHIpIDogX01fcHRyX3ZhbHVlKF9fcHRyKSAKKwl7IH0KKwkKKwlib29sIAorCW9wZXJhdG9yKCkoX0Jsb2NrX3BhaXIgX19icCkgY29uc3QgdGhyb3coKQorCXsKKwkgIGlmIChzdGQ6Omxlc3NfZXF1YWw8cG9pbnRlcj4oKShfTV9wdHJfdmFsdWUsIF9fYnAuc2Vjb25kKSAKKwkgICAgICAmJiBzdGQ6OmdyZWF0ZXJfZXF1YWw8cG9pbnRlcj4oKShfTV9wdHJfdmFsdWUsIF9fYnAuZmlyc3QpKQorCSAgICByZXR1cm4gdHJ1ZTsKKwkgIGVsc2UKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIH07CisgIAorICAgIC8vIFVzZWQgdG8gcGFzcyBhIEZ1bmN0b3IgdG8gZnVuY3Rpb25zIGJ5IHJlZmVyZW5jZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICAgIGNsYXNzIF9GdW5jdG9yX1JlZiAKKyAgICAgIDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX0Z1bmN0b3I6OmFyZ3VtZW50X3R5cGUsIAorCQkJCSAgIHR5cGVuYW1lIF9GdW5jdG9yOjpyZXN1bHRfdHlwZT4KKyAgICAgIHsKKwlfRnVuY3RvciYgX01fZnJlZjsKKwkKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIHR5cGVuYW1lIF9GdW5jdG9yOjphcmd1bWVudF90eXBlIGFyZ3VtZW50X3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBfRnVuY3Rvcjo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7CisKKwlfRnVuY3Rvcl9SZWYoX0Z1bmN0b3ImIF9fZnJlZikgOiBfTV9mcmVmKF9fZnJlZikgCisJeyB9CisKKwlyZXN1bHRfdHlwZSAKKwlvcGVyYXRvcigpKGFyZ3VtZW50X3R5cGUgX19hcmcpIAorCXsgcmV0dXJuIF9NX2ZyZWYoX19hcmcpOyB9CisgICAgICB9OworCisgICAgLyoqIEBjbGFzcyAgX0ZmaXRfZmluZGVyIGJpdG1hcF9hbGxvY2F0b3IuaCBiaXRtYXBfYWxsb2NhdG9yLmgKKyAgICAgKgorICAgICAqICBAYnJpZWYgIFRoZSBjbGFzcyB3aGljaCBhY3RzIGFzIGEgcHJlZGljYXRlIGZvciBhcHBseWluZyB0aGUKKyAgICAgKiAgZmlyc3QtZml0IG1lbW9yeSBhbGxvY2F0aW9uIHBvbGljeSBmb3IgdGhlIGJpdG1hcCBhbGxvY2F0b3IuCisgICAgICovCisgICAgLy8gX1RwIHNob3VsZCBiZSBhIHBvaW50ZXIgdHlwZSwgYW5kIF9BbGxvYyBpcyB0aGUgQWxsb2NhdG9yIGZvcgorICAgIC8vIHRoZSB2ZWN0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgY2xhc3MgX0ZmaXRfZmluZGVyIAorICAgICAgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBzdGQ6OnBhaXI8X1RwLCBfVHA+LCBib29sPgorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjpwYWlyPF9UcCwgX1RwPiBfQmxvY2tfcGFpcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fZGV0YWlsOjpfX21pbmlfdmVjdG9yPF9CbG9ja19wYWlyPiBfQlBWZWN0b3I7CisJdHlwZWRlZiB0eXBlbmFtZSBfQlBWZWN0b3I6OmRpZmZlcmVuY2VfdHlwZSBfQ291bnRlcl90eXBlOworCisJc2l6ZV90KiBfTV9wYml0bWFwOworCV9Db3VudGVyX3R5cGUgX01fZGF0YV9vZmZzZXQ7CisKKyAgICAgIHB1YmxpYzoKKwlfRmZpdF9maW5kZXIoKSA6IF9NX3BiaXRtYXAoMCksIF9NX2RhdGFfb2Zmc2V0KDApCisJeyB9CisKKwlib29sIAorCW9wZXJhdG9yKCkoX0Jsb2NrX3BhaXIgX19icCkgdGhyb3coKQorCXsKKwkgIC8vIFNldCB0aGUgX3JvdmVyIHRvIHRoZSBsYXN0IHBoeXNpY2FsIGxvY2F0aW9uIGJpdG1hcCwKKwkgIC8vIHdoaWNoIGlzIHRoZSBiaXRtYXAgd2hpY2ggYmVsb25ncyB0byB0aGUgZmlyc3QgZnJlZQorCSAgLy8gYmxvY2suIFRodXMsIHRoZSBiaXRtYXBzIGFyZSBpbiBleGFjdCByZXZlcnNlIG9yZGVyIG9mCisJICAvLyB0aGUgYWN0dWFsIG1lbW9yeSBsYXlvdXQuIFNvLCB3ZSBjb3VudCBkb3duIHRoZSBiaXRtYXBzLAorCSAgLy8gd2hpY2ggaXMgdGhlIHNhbWUgYXMgbW92aW5nIHVwIHRoZSBtZW1vcnkuCisKKwkgIC8vIElmIHRoZSB1c2VkIGNvdW50IHN0b3JlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIEJpdCBNYXAgaGVhZGVycworCSAgLy8gaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBPYmplY3RzIHRoYXQgdGhlIGN1cnJlbnQgQmxvY2sgY2FuCisJICAvLyBzdG9yZSwgdGhlbiB0aGVyZSBpcyBkZWZpbml0ZWx5IG5vIHNwYWNlIGZvciBhbm90aGVyIHNpbmdsZQorCSAgLy8gb2JqZWN0LCBzbyBqdXN0IHJldHVybiBmYWxzZS4KKwkgIF9Db3VudGVyX3R5cGUgX19kaWZmID0gX19kZXRhaWw6Ol9fbnVtX2JpdG1hcHMoX19icCk7CisKKwkgIGlmICgqKHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4KKwkJKF9fYnAuZmlyc3QpIC0gKF9fZGlmZiArIDEpKSA9PSBfX2RldGFpbDo6X19udW1fYmxvY2tzKF9fYnApKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIHNpemVfdCogX19yb3ZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4oX19icC5maXJzdCkgLSAxOworCisJICBmb3IgKF9Db3VudGVyX3R5cGUgX19pID0gMDsgX19pIDwgX19kaWZmOyArK19faSkKKwkgICAgeworCSAgICAgIF9NX2RhdGFfb2Zmc2V0ID0gX19pOworCSAgICAgIGlmICgqX19yb3ZlcikKKwkJeworCQkgIF9NX3BiaXRtYXAgPSBfX3JvdmVyOworCQkgIHJldHVybiB0cnVlOworCQl9CisJICAgICAgLS1fX3JvdmVyOworCSAgICB9CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgIAorCXNpemVfdCoKKwlfTV9nZXQoKSBjb25zdCB0aHJvdygpCisJeyByZXR1cm4gX01fcGJpdG1hcDsgfQorCisJX0NvdW50ZXJfdHlwZQorCV9NX29mZnNldCgpIGNvbnN0IHRocm93KCkKKwl7IHJldHVybiBfTV9kYXRhX29mZnNldCAqIHNpemVfdChiaXRzX3Blcl9ibG9jayk7IH0KKyAgICAgIH07CisKKyAgICAvKiogQGNsYXNzICBfQml0bWFwX2NvdW50ZXIgYml0bWFwX2FsbG9jYXRvci5oIGJpdG1hcF9hbGxvY2F0b3IuaAorICAgICAqCisgICAgICogIEBicmllZiAgVGhlIGJpdG1hcCBjb3VudGVyIHdoaWNoIGFjdHMgYXMgdGhlIGJpdG1hcAorICAgICAqICBtYW5pcHVsYXRvciwgYW5kIG1hbmFnZXMgdGhlIGJpdC1tYW5pcHVsYXRpb24gZnVuY3Rpb25zIGFuZAorICAgICAqICB0aGUgc2VhcmNoaW5nIGFuZCBpZGVudGlmaWNhdGlvbiBmdW5jdGlvbnMgb24gdGhlIGJpdC1tYXAuCisgICAgICovCisgICAgLy8gX1RwIHNob3VsZCBiZSBhIHBvaW50ZXIgdHlwZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBjbGFzcyBfQml0bWFwX2NvdW50ZXIKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lCisJX19kZXRhaWw6Ol9fbWluaV92ZWN0b3I8dHlwZW5hbWUgc3RkOjpwYWlyPF9UcCwgX1RwPiA+IF9CUFZlY3RvcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CUFZlY3Rvcjo6c2l6ZV90eXBlIF9JbmRleF90eXBlOworCXR5cGVkZWYgX1RwIHBvaW50ZXI7CisKKwlfQlBWZWN0b3ImIF9NX3ZicDsKKwlzaXplX3QqIF9NX2N1cnJfYm1hcDsKKwlzaXplX3QqIF9NX2xhc3RfYm1hcF9pbl9ibG9jazsKKwlfSW5kZXhfdHlwZSBfTV9jdXJyX2luZGV4OworICAgIAorICAgICAgcHVibGljOgorCS8vIFVzZSB0aGUgMm5kIHBhcmFtZXRlciB3aXRoIGNhcmUuIE1ha2Ugc3VyZSB0aGF0IHN1Y2ggYW4KKwkvLyBlbnRyeSBleGlzdHMgaW4gdGhlIHZlY3RvciBiZWZvcmUgcGFzc2luZyB0aGF0IHBhcnRpY3VsYXIKKwkvLyBpbmRleCB0byB0aGlzIGN0b3IuCisJX0JpdG1hcF9jb3VudGVyKF9CUFZlY3RvciYgUnZicCwgbG9uZyBfX2luZGV4ID0gLTEpIDogX01fdmJwKFJ2YnApCisJeyB0aGlzLT5fTV9yZXNldChfX2luZGV4KTsgfQorICAgIAorCXZvaWQgCisJX01fcmVzZXQobG9uZyBfX2luZGV4ID0gLTEpIHRocm93KCkKKwl7CisJICBpZiAoX19pbmRleCA9PSAtMSkKKwkgICAgeworCSAgICAgIF9NX2N1cnJfYm1hcCA9IDA7CisJICAgICAgX01fY3Vycl9pbmRleCA9IHN0YXRpY19jYXN0PF9JbmRleF90eXBlPigtMSk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisKKwkgIF9NX2N1cnJfaW5kZXggPSBfX2luZGV4OworCSAgX01fY3Vycl9ibWFwID0gcmVpbnRlcnByZXRfY2FzdDxzaXplX3QqPgorCSAgICAoX01fdmJwW19NX2N1cnJfaW5kZXhdLmZpcnN0KSAtIDE7CisJICAKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfX2luZGV4IDw9IChsb25nKV9NX3ZicC5zaXplKCkgLSAxKTsKKwkKKwkgIF9NX2xhc3RfYm1hcF9pbl9ibG9jayA9IF9NX2N1cnJfYm1hcAorCSAgICAtICgoX01fdmJwW19NX2N1cnJfaW5kZXhdLnNlY29uZCAKKwkJLSBfTV92YnBbX01fY3Vycl9pbmRleF0uZmlyc3QgKyAxKSAKKwkgICAgICAgLyBzaXplX3QoYml0c19wZXJfYmxvY2spIC0gMSk7CisJfQorICAgIAorCS8vIERhbmdlcm91cyBGdW5jdGlvbiEgVXNlIHdpdGggZXh0cmVtZSBjYXJlLiBQYXNzIHRvIHRoaXMKKwkvLyBmdW5jdGlvbiBPTkxZIHRob3NlIHZhbHVlcyB0aGF0IGFyZSBrbm93biB0byBiZSBjb3JyZWN0LAorCS8vIG90aGVyd2lzZSB0aGlzIHdpbGwgbWVzcyB1cCBiaWcgdGltZS4KKwl2b2lkCisJX01fc2V0X2ludGVybmFsX2JpdG1hcChzaXplX3QqIF9fbmV3X2ludGVybmFsX21hcmtlcikgdGhyb3coKQorCXsgX01fY3Vycl9ibWFwID0gX19uZXdfaW50ZXJuYWxfbWFya2VyOyB9CisgICAgCisJYm9vbAorCV9NX2ZpbmlzaGVkKCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuKF9NX2N1cnJfYm1hcCA9PSAwKTsgfQorICAgIAorCV9CaXRtYXBfY291bnRlciYKKwlvcGVyYXRvcisrKCkgdGhyb3coKQorCXsKKwkgIGlmIChfTV9jdXJyX2JtYXAgPT0gX01fbGFzdF9ibWFwX2luX2Jsb2NrKQorCSAgICB7CisJICAgICAgaWYgKCsrX01fY3Vycl9pbmRleCA9PSBfTV92YnAuc2l6ZSgpKQorCQlfTV9jdXJyX2JtYXAgPSAwOworCSAgICAgIGVsc2UKKwkJdGhpcy0+X01fcmVzZXQoX01fY3Vycl9pbmRleCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgLS1fTV9jdXJyX2JtYXA7CisJICByZXR1cm4gKnRoaXM7CisJfQorICAgIAorCXNpemVfdCoKKwlfTV9nZXQoKSBjb25zdCB0aHJvdygpCisJeyByZXR1cm4gX01fY3Vycl9ibWFwOyB9CisgICAgCisJcG9pbnRlciAKKwlfTV9iYXNlKCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIF9NX3ZicFtfTV9jdXJyX2luZGV4XS5maXJzdDsgfQorCisJX0luZGV4X3R5cGUKKwlfTV9vZmZzZXQoKSBjb25zdCB0aHJvdygpCisJeworCSAgcmV0dXJuIHNpemVfdChiaXRzX3Blcl9ibG9jaykKKwkgICAgKiAoKHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4odGhpcy0+X01fYmFzZSgpKSAKKwkJLSBfTV9jdXJyX2JtYXApIC0gMSk7CisJfQorICAgIAorCV9JbmRleF90eXBlCisJX01fd2hlcmUoKSBjb25zdCB0aHJvdygpCisJeyByZXR1cm4gX01fY3Vycl9pbmRleDsgfQorICAgICAgfTsKKworICAgIC8qKiBAYnJpZWYgIE1hcmsgYSBtZW1vcnkgYWRkcmVzcyBhcyBhbGxvY2F0ZWQgYnkgcmUtc2V0dGluZyB0aGUKKyAgICAgKiAgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGJpdC1tYXAuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgCisgICAgX19iaXRfYWxsb2NhdGUoc2l6ZV90KiBfX3BibWFwLCBzaXplX3QgX19wb3MpIHRocm93KCkKKyAgICB7CisgICAgICBzaXplX3QgX19tYXNrID0gMSA8PCBfX3BvczsKKyAgICAgIF9fbWFzayA9IH5fX21hc2s7CisgICAgICAqX19wYm1hcCAmPSBfX21hc2s7CisgICAgfQorICAKKyAgICAvKiogQGJyaWVmICBNYXJrIGEgbWVtb3J5IGFkZHJlc3MgYXMgZnJlZSBieSBzZXR0aW5nIHRoZQorICAgICAqICBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgYml0LW1hcC4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCAKKyAgICBfX2JpdF9mcmVlKHNpemVfdCogX19wYm1hcCwgc2l6ZV90IF9fcG9zKSB0aHJvdygpCisgICAgeworICAgICAgc2l6ZV90IF9fbWFzayA9IDEgPDwgX19wb3M7CisgICAgICAqX19wYm1hcCB8PSBfX21hc2s7CisgICAgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKiBAYnJpZWYgIEdlbmVyaWMgVmVyc2lvbiBvZiB0aGUgYnNmIGluc3RydWN0aW9uLgorICAgKi8KKyAgaW5saW5lIHNpemVfdCAKKyAgX0JpdF9zY2FuX2ZvcndhcmQoc2l6ZV90IF9fbnVtKQorICB7IHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fYnVpbHRpbl9jdHpsKF9fbnVtKSk7IH0KKworICAvKiogQGNsYXNzICBmcmVlX2xpc3QgYml0bWFwX2FsbG9jYXRvci5oIGJpdG1hcF9hbGxvY2F0b3IuaAorICAgKgorICAgKiAgQGJyaWVmICBUaGUgZnJlZSBsaXN0IGNsYXNzIGZvciBtYW5hZ2luZyBjaHVua3Mgb2YgbWVtb3J5IHRvIGJlCisgICAqICBnaXZlbiB0byBhbmQgcmV0dXJuZWQgYnkgdGhlIGJpdG1hcF9hbGxvY2F0b3IuCisgICAqLworICBjbGFzcyBmcmVlX2xpc3QKKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzaXplX3QqIAkJCQl2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgX19kZXRhaWw6Ol9fbWluaV92ZWN0b3I8dmFsdWVfdHlwZT4gdmVjdG9yX3R5cGU7CisgICAgdHlwZWRlZiB2ZWN0b3JfdHlwZTo6aXRlcmF0b3IgCQlpdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9fbXV0ZXgJCQkJX19tdXRleF90eXBlOworCisgIHByaXZhdGU6CisgICAgc3RydWN0IF9MVF9wb2ludGVyX2NvbXBhcmUKKyAgICB7CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHNpemVfdCogX19wdWksIAorCQkgY29uc3Qgc2l6ZV90IF9fY3VpKSBjb25zdCB0aHJvdygpCisgICAgICB7IHJldHVybiAqX19wdWkgPCBfX2N1aTsgfQorICAgIH07CisKKyNpZiBkZWZpbmVkIF9fR1RIUkVBRFMKKyAgICBfX211dGV4X3R5cGUmCisgICAgX01fZ2V0X211dGV4KCkKKyAgICB7CisgICAgICBzdGF0aWMgX19tdXRleF90eXBlIF9TX211dGV4OworICAgICAgcmV0dXJuIF9TX211dGV4OworICAgIH0KKyNlbmRpZgorCisgICAgdmVjdG9yX3R5cGUmCisgICAgX01fZ2V0X2ZyZWVfbGlzdCgpCisgICAgeworICAgICAgc3RhdGljIHZlY3Rvcl90eXBlIF9TX2ZyZWVfbGlzdDsKKyAgICAgIHJldHVybiBfU19mcmVlX2xpc3Q7CisgICAgfQorCisgICAgLyoqIEBicmllZiAgUGVyZm9ybXMgdmFsaWRhdGlvbiBvZiBtZW1vcnkgYmFzZWQgb24gdGhlaXIgc2l6ZS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIF9fYWRkciBUaGUgcG9pbnRlciB0byB0aGUgbWVtb3J5IGJsb2NrIHRvIGJlCisgICAgICogIHZhbGlkYXRlZC4KKyAgICAgKgorICAgICAqICBWYWxpZGF0ZXMgdGhlIG1lbW9yeSBibG9jayBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBhbmQKKyAgICAgKiAgYXBwcm9wcmlhdGVseSBwZXJmb3JtcyB0aGUgYWN0aW9uIG9mIG1hbmFnaW5nIHRoZSBmcmVlIGxpc3Qgb2YKKyAgICAgKiAgYmxvY2tzIGJ5IGFkZGluZyB0aGlzIGJsb2NrIHRvIHRoZSBmcmVlIGxpc3Qgb3IgZGVsZXRpbmcgdGhpcworICAgICAqICBvciBsYXJnZXIgYmxvY2tzIGZyb20gdGhlIGZyZWUgbGlzdC4KKyAgICAgKi8KKyAgICB2b2lkCisgICAgX01fdmFsaWRhdGUoc2l6ZV90KiBfX2FkZHIpIHRocm93KCkKKyAgICB7CisgICAgICB2ZWN0b3JfdHlwZSYgX19mcmVlX2xpc3QgPSBfTV9nZXRfZnJlZV9saXN0KCk7CisgICAgICBjb25zdCB2ZWN0b3JfdHlwZTo6c2l6ZV90eXBlIF9fbWF4X3NpemUgPSA2NDsKKyAgICAgIGlmIChfX2ZyZWVfbGlzdC5zaXplKCkgPj0gX19tYXhfc2l6ZSkKKwl7CisJICAvLyBPaywgdGhlIHRocmVzaG9sZCB2YWx1ZSBoYXMgYmVlbiByZWFjaGVkLiAgV2UgZGV0ZXJtaW5lCisJICAvLyB3aGljaCBibG9jayB0byByZW1vdmUgZnJvbSB0aGUgbGlzdCBvZiBmcmVlIGJsb2Nrcy4KKwkgIGlmICgqX19hZGRyID49ICpfX2ZyZWVfbGlzdC5iYWNrKCkpCisJICAgIHsKKwkgICAgICAvLyBPaywgdGhlIG5ldyBibG9jayBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlCisJICAgICAgLy8gbGFzdCBibG9jayBpbiB0aGUgbGlzdCBvZiBmcmVlIGJsb2Nrcy4gV2UganVzdCBmcmVlCisJICAgICAgLy8gdGhlIG5ldyBibG9jay4KKwkgICAgICA6Om9wZXJhdG9yIGRlbGV0ZShzdGF0aWNfY2FzdDx2b2lkKj4oX19hZGRyKSk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvLyBEZWFsbG9jYXRlIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBsaXN0IG9mIGZyZWUgbGlzdHMsCisJICAgICAgLy8gYW5kIGluc2VydCB0aGUgbmV3IG9uZSBpbiBpdHMgY29ycmVjdCBwb3NpdGlvbi4KKwkgICAgICA6Om9wZXJhdG9yIGRlbGV0ZShzdGF0aWNfY2FzdDx2b2lkKj4oX19mcmVlX2xpc3QuYmFjaygpKSk7CisJICAgICAgX19mcmVlX2xpc3QucG9wX2JhY2soKTsKKwkgICAgfQorCX0KKwkgIAorICAgICAgLy8gSnVzdCBhZGQgdGhlIGJsb2NrIHRvIHRoZSBsaXN0IG9mIGZyZWUgbGlzdHMgdW5jb25kaXRpb25hbGx5LgorICAgICAgaXRlcmF0b3IgX190ZW1wID0gX19kZXRhaWw6Ol9fbG93ZXJfYm91bmQKKwkoX19mcmVlX2xpc3QuYmVnaW4oKSwgX19mcmVlX2xpc3QuZW5kKCksIAorCSAqX19hZGRyLCBfTFRfcG9pbnRlcl9jb21wYXJlKCkpOworCisgICAgICAvLyBXZSBtYXkgaW5zZXJ0IHRoZSBuZXcgZnJlZSBsaXN0IGJlZm9yZSBfdGVtcDsKKyAgICAgIF9fZnJlZV9saXN0Lmluc2VydChfX3RlbXAsIF9fYWRkcik7CisgICAgfQorCisgICAgLyoqIEBicmllZiAgRGVjaWRlcyB3aGV0aGVyIHRoZSB3YXN0YWdlIG9mIG1lbW9yeSBpcyBhY2NlcHRhYmxlIGZvcgorICAgICAqICB0aGUgY3VycmVudCBtZW1vcnkgcmVxdWVzdCBhbmQgcmV0dXJucyBhY2NvcmRpbmdseS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gX19ibG9ja19zaXplIFRoZSBzaXplIG9mIHRoZSBibG9jayBhdmFpbGFibGUgaW4gdGhlIGZyZWUKKyAgICAgKiAgbGlzdC4KKyAgICAgKgorICAgICAqICBAcGFyYW0gX19yZXF1aXJlZF9zaXplIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBtZW1vcnkgYmxvY2suCisgICAgICoKKyAgICAgKiAgQHJldHVybiB0cnVlIGlmIHRoZSB3YXN0YWdlIGluY3VycmVkIGlzIGFjY2VwdGFibGUsIGVsc2UgcmV0dXJucworICAgICAqICBmYWxzZS4KKyAgICAgKi8KKyAgICBib29sIAorICAgIF9NX3Nob3VsZF9pX2dpdmUoc2l6ZV90IF9fYmxvY2tfc2l6ZSwgCisJCSAgICAgc2l6ZV90IF9fcmVxdWlyZWRfc2l6ZSkgdGhyb3coKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdCBfX21heF93YXN0YWdlX3BlcmNlbnRhZ2UgPSAzNjsKKyAgICAgIGlmIChfX2Jsb2NrX3NpemUgPj0gX19yZXF1aXJlZF9zaXplICYmIAorCSAgKCgoX19ibG9ja19zaXplIC0gX19yZXF1aXJlZF9zaXplKSAqIDEwMCAvIF9fYmxvY2tfc2l6ZSkKKwkgICA8IF9fbWF4X3dhc3RhZ2VfcGVyY2VudGFnZSkpCisJcmV0dXJuIHRydWU7CisgICAgICBlbHNlCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBwdWJsaWM6CisgICAgLyoqIEBicmllZiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJsb2NrIG9mIG1lbW9yeSB0byB0aGUKKyAgICAgKiAgaW50ZXJuYWwgZnJlZSBsaXN0LgorICAgICAqCisgICAgICogIEBwYXJhbSAgX19hZGRyIFRoZSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgYmxvY2sgdGhhdCB3YXMgZ2l2ZW4KKyAgICAgKiAgYnkgYSBjYWxsIHRvIHRoZSBfTV9nZXQgZnVuY3Rpb24uCisgICAgICovCisgICAgaW5saW5lIHZvaWQgCisgICAgX01faW5zZXJ0KHNpemVfdCogX19hZGRyKSB0aHJvdygpCisgICAgeworI2lmIGRlZmluZWQgX19HVEhSRUFEUworICAgICAgX19zY29wZWRfbG9jayBfX2JmbF9sb2NrKF9NX2dldF9tdXRleCgpKTsKKyNlbmRpZgorICAgICAgLy8gQ2FsbCBfTV92YWxpZGF0ZSB0byBkZWNpZGUgd2hhdCBzaG91bGQgYmUgZG9uZSB3aXRoCisgICAgICAvLyB0aGlzIHBhcnRpY3VsYXIgZnJlZSBsaXN0LgorICAgICAgdGhpcy0+X01fdmFsaWRhdGUocmVpbnRlcnByZXRfY2FzdDxzaXplX3QqPihfX2FkZHIpIC0gMSk7CisgICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBhcyB0byB3aHkgdGhpcyBpcyAxIQorICAgIH0KKyAgICAKKyAgICAvKiogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBibG9jayBvZiBtZW1vcnkgb2YgdGhlIHNwZWNpZmllZAorICAgICAqICBzaXplIGZyb20gdGhlIGZyZWUgbGlzdC4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIF9fc3ogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG1lbW9yeSByZXF1aXJlZC4KKyAgICAgKgorICAgICAqICBAcmV0dXJuICBBIHBvaW50ZXIgdG8gdGhlIG5ldyBtZW1vcnkgYmxvY2sgb2Ygc2l6ZSBhdCBsZWFzdAorICAgICAqICBlcXVhbCB0byB0aGF0IHJlcXVlc3RlZC4KKyAgICAgKi8KKyAgICBzaXplX3QqCisgICAgX01fZ2V0KHNpemVfdCBfX3N6KSB0aHJvdyhzdGQ6OmJhZF9hbGxvYyk7CisKKyAgICAvKiogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGp1c3QgY2xlYXJzIHRoZSBpbnRlcm5hbCBGcmVlIExpc3QsIGFuZAorICAgICAqICBnaXZlcyBiYWNrIGFsbCB0aGUgbWVtb3J5IHRvIHRoZSBPUy4KKyAgICAgKi8KKyAgICB2b2lkIAorICAgIF9NX2NsZWFyKCk7CisgIH07CisKKworICAvLyBGb3J3YXJkIGRlY2xhcmUgdGhlIGNsYXNzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IAorICAgIGNsYXNzIGJpdG1hcF9hbGxvY2F0b3I7CisKKyAgLy8gU3BlY2lhbGl6ZSBmb3Igdm9pZDoKKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIGJpdG1hcF9hbGxvY2F0b3I8dm9pZD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB2b2lkKiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2b2lkKiBjb25zdF9wb2ludGVyOworCisgICAgICAvLyBSZWZlcmVuY2UtdG8tdm9pZCBtZW1iZXJzIGFyZSBpbXBvc3NpYmxlLgorICAgICAgdHlwZWRlZiB2b2lkICB2YWx1ZV90eXBlOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgc3RydWN0IHJlYmluZAorCXsKKwkgIHR5cGVkZWYgYml0bWFwX2FsbG9jYXRvcjxfVHAxPiBvdGhlcjsKKwl9OworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBCaXRtYXAgQWxsb2NhdG9yLCBwcmltYXJ5IHRlbXBsYXRlLgorICAgKiBAaW5ncm91cCBhbGxvY2F0b3JzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgYml0bWFwX2FsbG9jYXRvciA6IHByaXZhdGUgZnJlZV9saXN0CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgIAkJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgCQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCogICAgICAgIAkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwKiAgCQljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAmICAgICAgICAJCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJiAgCQljb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgIAkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgZnJlZV9saXN0OjpfX211dGV4X3R5cGUgCV9fbXV0ZXhfdHlwZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgc3RydWN0IHJlYmluZAorCXsKKwkgIHR5cGVkZWYgYml0bWFwX2FsbG9jYXRvcjxfVHAxPiBvdGhlcjsKKwl9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjEwMy4gcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQKKyAgICAgIHR5cGVkZWYgc3RkOjp0cnVlX3R5cGUgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ7CisjZW5kaWYKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTxzaXplX3QgX0JTaXplLCBzaXplX3QgX0FsaWduU2l6ZT4KKyAgICAgICAgc3RydWN0IGFsaWduZWRfc2l6ZQorCXsKKwkgIGVudW0KKwkgICAgeyAKKwkgICAgICBtb2R1bHVzID0gX0JTaXplICUgX0FsaWduU2l6ZSwKKwkgICAgICB2YWx1ZSA9IF9CU2l6ZSArIChtb2R1bHVzID8gX0FsaWduU2l6ZSAtIChtb2R1bHVzKSA6IDApCisJICAgIH07CisJfTsKKworICAgICAgc3RydWN0IF9BbGxvY19ibG9jaworICAgICAgeworCWNoYXIgX19NX3VudXNlZFthbGlnbmVkX3NpemU8c2l6ZW9mKHZhbHVlX3R5cGUpLAorCQkJX0JBTExPQ19BTElHTl9CWVRFUz46OnZhbHVlXTsKKyAgICAgIH07CisKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnBhaXI8X0FsbG9jX2Jsb2NrKiwgX0FsbG9jX2Jsb2NrKj4gX0Jsb2NrX3BhaXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kZXRhaWw6Ol9fbWluaV92ZWN0b3I8X0Jsb2NrX3BhaXI+IF9CUFZlY3RvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0JQVmVjdG9yOjppdGVyYXRvciBfQlBpdGVyOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgICBzdGF0aWMgX0JQaXRlcgorICAgICAgICBfU19maW5kKF9QcmVkaWNhdGUgX19wKQorICAgICAgICB7CisJICBfQlBpdGVyIF9fZmlyc3QgPSBfU19tZW1fYmxvY2tzLmJlZ2luKCk7CisJICB3aGlsZSAoX19maXJzdCAhPSBfU19tZW1fYmxvY2tzLmVuZCgpICYmICFfX3AoKl9fZmlyc3QpKQorCSAgICArK19fZmlyc3Q7CisJICByZXR1cm4gX19maXJzdDsKKwl9CisKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0RFQlVHCisgICAgICAvLyBDb21wbGV4aXR5OiBPKGxnKE4pKS4gV2hlcmUsIE4gaXMgdGhlIG51bWJlciBvZiBibG9jayBvZiBzaXplCisgICAgICAvLyBzaXplb2YodmFsdWVfdHlwZSkuCisgICAgICB2b2lkIAorICAgICAgX1NfY2hlY2tfZm9yX2ZyZWVfYmxvY2tzKCkgdGhyb3coKQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX19kZXRhaWw6Ol9GZml0X2ZpbmRlcjxfQWxsb2NfYmxvY2sqPiBfRkZGOworCV9CUGl0ZXIgX19icGkgPSBfU19maW5kKF9GRkYoKSk7CisKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19icGkgPT0gX1NfbWVtX2Jsb2Nrcy5lbmQoKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqIEBicmllZiAgUmVzcG9uc2libGUgZm9yIGV4cG9uZW50aWFsbHkgZ3Jvd2luZyB0aGUgaW50ZXJuYWwKKyAgICAgICAqICBtZW1vcnkgcG9vbC4KKyAgICAgICAqCisgICAgICAgKiAgQHRocm93ICBzdGQ6OmJhZF9hbGxvYy4gSWYgbWVtb3J5IGNhbiBub3QgYmUgYWxsb2NhdGVkLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5OiBPKDEpLCBidXQgaW50ZXJuYWxseSBkZXBlbmRzIHVwb24gdGhlCisgICAgICAgKiAgY29tcGxleGl0eSBvZiB0aGUgZnVuY3Rpb24gZnJlZV9saXN0OjpfTV9nZXQuIFRoZSBwYXJ0IHdoZXJlCisgICAgICAgKiAgdGhlIGJpdG1hcCBoZWFkZXJzIGFyZSB3cml0dGVuIGhhcyBjb21wbGV4aXR5OiBPKFgpLHdoZXJlIFgKKyAgICAgICAqICBpcyB0aGUgbnVtYmVyIG9mIGJsb2NrcyBvZiBzaXplIHNpemVvZih2YWx1ZV90eXBlKSB3aXRoaW4KKyAgICAgICAqICB0aGUgbmV3bHkgYWNxdWlyZWQgYmxvY2suIEhhdmluZyBhIHRpZ2h0IGJvdW5kLgorICAgICAgICovCisgICAgICB2b2lkIAorICAgICAgX1NfcmVmaWxsX3Bvb2woKSB0aHJvdyhzdGQ6OmJhZF9hbGxvYykKKyAgICAgIHsKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0RFQlVHCisJX1NfY2hlY2tfZm9yX2ZyZWVfYmxvY2tzKCk7CisjZW5kaWYKKworCWNvbnN0IHNpemVfdCBfX251bV9iaXRtYXBzID0gKF9TX2Jsb2NrX3NpemUKKwkJCQkgICAgICAvIHNpemVfdChfX2RldGFpbDo6Yml0c19wZXJfYmxvY2spKTsKKwljb25zdCBzaXplX3QgX19zaXplX3RvX2FsbG9jYXRlID0gc2l6ZW9mKHNpemVfdCkgCisJICArIF9TX2Jsb2NrX3NpemUgKiBzaXplb2YoX0FsbG9jX2Jsb2NrKSAKKwkgICsgX19udW1fYml0bWFwcyAqIHNpemVvZihzaXplX3QpOworCisJc2l6ZV90KiBfX3RlbXAgPQorCSAgcmVpbnRlcnByZXRfY2FzdDxzaXplX3QqPih0aGlzLT5fTV9nZXQoX19zaXplX3RvX2FsbG9jYXRlKSk7CisJKl9fdGVtcCA9IDA7CisJKytfX3RlbXA7CisKKwkvLyBUaGUgSGVhZGVyIGluZm9ybWF0aW9uIGdvZXMgYXQgdGhlIEJlZ2lubmluZyBvZiB0aGUgQmxvY2suCisJX0Jsb2NrX3BhaXIgX19icCA9IAorCSAgc3RkOjptYWtlX3BhaXIocmVpbnRlcnByZXRfY2FzdDxfQWxsb2NfYmxvY2sqPgorCQkJIChfX3RlbXAgKyBfX251bV9iaXRtYXBzKSwgCisJCQkgcmVpbnRlcnByZXRfY2FzdDxfQWxsb2NfYmxvY2sqPgorCQkJIChfX3RlbXAgKyBfX251bV9iaXRtYXBzKSAKKwkJCSArIF9TX2Jsb2NrX3NpemUgLSAxKTsKKwkKKwkvLyBGaWxsIHRoZSBWZWN0b3Igd2l0aCB0aGlzIGluZm9ybWF0aW9uLgorCV9TX21lbV9ibG9ja3MucHVzaF9iYWNrKF9fYnApOworCisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19udW1fYml0bWFwczsgKytfX2kpCisJICBfX3RlbXBbX19pXSA9IH5zdGF0aWNfY2FzdDxzaXplX3Q+KDApOyAvLyAxIEluZGljYXRlcyBhbGwgRnJlZS4KKworCV9TX2Jsb2NrX3NpemUgKj0gMjsKKyAgICAgIH0KKworICAgICAgc3RhdGljIF9CUFZlY3RvciBfU19tZW1fYmxvY2tzOworICAgICAgc3RhdGljIHNpemVfdCBfU19ibG9ja19zaXplOworICAgICAgc3RhdGljIF9fZGV0YWlsOjpfQml0bWFwX2NvdW50ZXI8X0FsbG9jX2Jsb2NrKj4gX1NfbGFzdF9yZXF1ZXN0OworICAgICAgc3RhdGljIHR5cGVuYW1lIF9CUFZlY3Rvcjo6c2l6ZV90eXBlIF9TX2xhc3RfZGVhbGxvY19pbmRleDsKKyNpZiBkZWZpbmVkIF9fR1RIUkVBRFMKKyAgICAgIHN0YXRpYyBfX211dGV4X3R5cGUgX1NfbXV0OworI2VuZGlmCisKKyAgICBwdWJsaWM6CisKKyAgICAgIC8qKiBAYnJpZWYgIEFsbG9jYXRlcyBtZW1vcnkgZm9yIGEgc2luZ2xlIG9iamVjdCBvZiBzaXplCisgICAgICAgKiAgc2l6ZW9mKF9UcCkuCisgICAgICAgKgorICAgICAgICogIEB0aHJvdyAgc3RkOjpiYWRfYWxsb2MuIElmIG1lbW9yeSBjYW4gbm90IGJlIGFsbG9jYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgQ29tcGxleGl0eTogV29yc3QgY2FzZSBjb21wbGV4aXR5IGlzIE8oTiksIGJ1dCB0aGF0CisgICAgICAgKiAgaXMgaGFyZGx5IGV2ZXIgaGl0LiBJZiBhbmQgd2hlbiB0aGlzIHBhcnRpY3VsYXIgY2FzZSBpcworICAgICAgICogIGVuY291bnRlcmVkLCB0aGUgbmV4dCBmZXcgY2FzZXMgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSBhCisgICAgICAgKiAgd29yc3QgY2FzZSBjb21wbGV4aXR5IG9mIE8oMSkhICBUaGF0J3Mgd2h5IHRoaXMgZnVuY3Rpb24KKyAgICAgICAqICBwZXJmb3JtcyB2ZXJ5IHdlbGwgb24gYXZlcmFnZS4gWW91IGNhbiBjb25zaWRlciB0aGlzCisgICAgICAgKiAgZnVuY3Rpb24gdG8gaGF2ZSBhIGNvbXBsZXhpdHkgcmVmZXJyZWQgdG8gY29tbW9ubHkgYXM6CisgICAgICAgKiAgQW1vcnRpemVkIENvbnN0YW50IHRpbWUuCisgICAgICAgKi8KKyAgICAgIHBvaW50ZXIgCisgICAgICBfTV9hbGxvY2F0ZV9zaW5nbGVfb2JqZWN0KCkgdGhyb3coc3RkOjpiYWRfYWxsb2MpCisgICAgICB7CisjaWYgZGVmaW5lZCBfX0dUSFJFQURTCisJX19zY29wZWRfbG9jayBfX2JpdF9sb2NrKF9TX211dCk7CisjZW5kaWYKKworCS8vIFRoZSBhbGdvcml0aG0gaXMgc29tZXRoaW5nIGxpa2UgdGhpczogVGhlIGxhc3RfcmVxdWVzdAorCS8vIHZhcmlhYmxlIHBvaW50cyB0byB0aGUgbGFzdCBhY2Nlc3NlZCBCaXQgTWFwLiBXaGVuIHN1Y2ggYQorCS8vIGNvbmRpdGlvbiBvY2N1cnMsIHdlIHRyeSB0byBmaW5kIGEgZnJlZSBibG9jayBpbiB0aGUKKwkvLyBjdXJyZW50IGJpdG1hcCwgb3Igc3VjY2VlZGluZyBiaXRtYXBzIHVudGlsIHRoZSBsYXN0IGJpdG1hcAorCS8vIGlzIHJlYWNoZWQuIElmIG5vIGZyZWUgYmxvY2sgdHVybnMgdXAsIHdlIHJlc29ydCB0byBGaXJzdAorCS8vIEZpdCBtZXRob2QuCisKKwkvLyBXQVJOSU5HOiBEbyBub3QgcmUtb3JkZXIgdGhlIGNvbmRpdGlvbiBpbiB0aGUgd2hpbGUKKwkvLyBzdGF0ZW1lbnQgYmVsb3csIGJlY2F1c2UgaXQgcmVsaWVzIG9uIEMrKydzIHNob3J0LWNpcmN1aXQKKwkvLyBldmFsdWF0aW9uLiBUaGUgcmV0dXJuIGZyb20gX1NfbGFzdF9yZXF1ZXN0LT5fTV9nZXQoKSB3aWxsCisJLy8gTk9UIGJlIGRlcmVmZXJlbmNlIGFibGUgaWYgX1NfbGFzdF9yZXF1ZXN0LT5fTV9maW5pc2hlZCgpCisJLy8gcmV0dXJucyB0cnVlLiBUaGlzIHdvdWxkIGluZXZpdGFibHkgbGVhZCB0byBhIE5VTEwgcG9pbnRlcgorCS8vIGRlcmVmZXJlbmNlIGlmIHRpbmtlcmVkIHdpdGguCisJd2hpbGUgKF9TX2xhc3RfcmVxdWVzdC5fTV9maW5pc2hlZCgpID09IGZhbHNlCisJICAgICAgICYmICgqKF9TX2xhc3RfcmVxdWVzdC5fTV9nZXQoKSkgPT0gMCkpCisJICBfU19sYXN0X3JlcXVlc3Qub3BlcmF0b3IrKygpOworCisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX1NfbGFzdF9yZXF1ZXN0Ll9NX2ZpbmlzaGVkKCkgPT0gdHJ1ZSwgZmFsc2UpKQorCSAgeworCSAgICAvLyBGYWxsIEJhY2sgdG8gRmlyc3QgRml0IGFsZ29yaXRobS4KKwkgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RldGFpbDo6X0ZmaXRfZmluZGVyPF9BbGxvY19ibG9jayo+IF9GRkY7CisJICAgIF9GRkYgX19mZmY7CisJICAgIF9CUGl0ZXIgX19icGkgPSBfU19maW5kKF9fZGV0YWlsOjpfRnVuY3Rvcl9SZWY8X0ZGRj4oX19mZmYpKTsKKworCSAgICBpZiAoX19icGkgIT0gX1NfbWVtX2Jsb2Nrcy5lbmQoKSkKKwkgICAgICB7CisJCS8vIFNlYXJjaCB3YXMgc3VjY2Vzc2Z1bC4gT2ssIG5vdyBtYXJrIHRoZSBmaXJzdCBiaXQgZnJvbQorCQkvLyB0aGUgcmlnaHQgYXMgMCwgbWVhbmluZyBBbGxvY2F0ZWQuIFRoaXMgYml0IGlzIG9idGFpbmVkCisJCS8vIGJ5IGNhbGxpbmcgX01fZ2V0KCkgb24gX19mZmYuCisJCXNpemVfdCBfX256X2JpdCA9IF9CaXRfc2Nhbl9mb3J3YXJkKCpfX2ZmZi5fTV9nZXQoKSk7CisJCV9fZGV0YWlsOjpfX2JpdF9hbGxvY2F0ZShfX2ZmZi5fTV9nZXQoKSwgX19uel9iaXQpOworCisJCV9TX2xhc3RfcmVxdWVzdC5fTV9yZXNldChfX2JwaSAtIF9TX21lbV9ibG9ja3MuYmVnaW4oKSk7CisKKwkJLy8gTm93LCBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJpdCB3ZSBtYXJrZWQgYXMgYWxsb2NhdGVkLgorCQlwb2ludGVyIF9fcmV0ID0gcmVpbnRlcnByZXRfY2FzdDxwb2ludGVyPgorCQkgIChfX2JwaS0+Zmlyc3QgKyBfX2ZmZi5fTV9vZmZzZXQoKSArIF9fbnpfYml0KTsKKwkJc2l6ZV90KiBfX3B1c2VfY291bnQgPSAKKwkJICByZWludGVycHJldF9jYXN0PHNpemVfdCo+CisJCSAgKF9fYnBpLT5maXJzdCkgLSAoX19kZXRhaWw6Ol9fbnVtX2JpdG1hcHMoKl9fYnBpKSArIDEpOworCQkKKwkJKysoKl9fcHVzZV9jb3VudCk7CisJCXJldHVybiBfX3JldDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8vIFNlYXJjaCB3YXMgdW5zdWNjZXNzZnVsLiBXZSBBZGQgbW9yZSBtZW1vcnkgdG8gdGhlCisJCS8vIHBvb2wgYnkgY2FsbGluZyBfU19yZWZpbGxfcG9vbCgpLgorCQlfU19yZWZpbGxfcG9vbCgpOworCisJCS8vIF9NX1Jlc2V0IHRoZSBfU19sYXN0X3JlcXVlc3Qgc3RydWN0dXJlIHRvIHRoZSBmaXJzdAorCQkvLyBmcmVlIGJsb2NrJ3MgYml0IG1hcC4KKwkJX1NfbGFzdF9yZXF1ZXN0Ll9NX3Jlc2V0KF9TX21lbV9ibG9ja3Muc2l6ZSgpIC0gMSk7CisKKwkJLy8gTm93LCBtYXJrIHRoYXQgYml0IGFzIGFsbG9jYXRlZC4KKwkgICAgICB9CisJICB9CisKKwkvLyBfU19sYXN0X3JlcXVlc3QgaG9sZHMgYSBwb2ludGVyIHRvIGEgdmFsaWQgYml0IG1hcCwgdGhhdAorCS8vIHBvaW50cyB0byBhIGZyZWUgYmxvY2sgaW4gbWVtb3J5LgorCXNpemVfdCBfX256X2JpdCA9IF9CaXRfc2Nhbl9mb3J3YXJkKCpfU19sYXN0X3JlcXVlc3QuX01fZ2V0KCkpOworCV9fZGV0YWlsOjpfX2JpdF9hbGxvY2F0ZShfU19sYXN0X3JlcXVlc3QuX01fZ2V0KCksIF9fbnpfYml0KTsKKworCXBvaW50ZXIgX19yZXQgPSByZWludGVycHJldF9jYXN0PHBvaW50ZXI+CisJICAoX1NfbGFzdF9yZXF1ZXN0Ll9NX2Jhc2UoKSArIF9TX2xhc3RfcmVxdWVzdC5fTV9vZmZzZXQoKSArIF9fbnpfYml0KTsKKworCXNpemVfdCogX19wdXNlX2NvdW50ID0gcmVpbnRlcnByZXRfY2FzdDxzaXplX3QqPgorCSAgKF9TX21lbV9ibG9ja3NbX1NfbGFzdF9yZXF1ZXN0Ll9NX3doZXJlKCldLmZpcnN0KQorCSAgLSAoX19kZXRhaWw6OgorCSAgICAgX19udW1fYml0bWFwcyhfU19tZW1fYmxvY2tzW19TX2xhc3RfcmVxdWVzdC5fTV93aGVyZSgpXSkgKyAxKTsKKworCSsrKCpfX3B1c2VfY291bnQpOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgLyoqIEBicmllZiAgRGVhbGxvY2F0ZXMgbWVtb3J5IHRoYXQgYmVsb25ncyB0byBhIHNpbmdsZSBvYmplY3Qgb2YKKyAgICAgICAqICBzaXplIHNpemVvZihfVHApLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5OiBPKGxnKE4pKSwgYnV0IHRoZSB3b3JzdCBjYXNlIGlzIG5vdCBoaXQKKyAgICAgICAqICBvZnRlbiEgIFRoaXMgaXMgYmVjYXVzZSBjb250YWluZXJzIHVzdWFsbHkgZGVhbGxvY2F0ZSBtZW1vcnkKKyAgICAgICAqICBjbG9zZSB0byBlYWNoIG90aGVyIGFuZCB0aGlzIGNhc2UgaXMgaGFuZGxlZCBpbiBPKDEpIHRpbWUgYnkKKyAgICAgICAqICB0aGUgZGVhbGxvY2F0ZSBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZCAKKyAgICAgIF9NX2RlYWxsb2NhdGVfc2luZ2xlX29iamVjdChwb2ludGVyIF9fcCkgdGhyb3coKQorICAgICAgeworI2lmIGRlZmluZWQgX19HVEhSRUFEUworCV9fc2NvcGVkX2xvY2sgX19iaXRfbG9jayhfU19tdXQpOworI2VuZGlmCisJX0FsbG9jX2Jsb2NrKiBfX3JlYWxfcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8X0FsbG9jX2Jsb2NrKj4oX19wKTsKKworCXR5cGVkZWYgdHlwZW5hbWUgX0JQVmVjdG9yOjppdGVyYXRvciBfSXRlcmF0b3I7CisJdHlwZWRlZiB0eXBlbmFtZSBfQlBWZWN0b3I6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZV90eXBlOworCisJX0RpZmZlcmVuY2VfdHlwZSBfX2RpZmY7CisJbG9uZyBfX2Rpc3BsYWNlbWVudDsKKworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfU19sYXN0X2RlYWxsb2NfaW5kZXggPj0gMCk7CisKKwlfX2RldGFpbDo6X0luY2x1c2l2ZV9iZXR3ZWVuPF9BbGxvY19ibG9jayo+IF9faWJ0KF9fcmVhbF9wKTsKKwlpZiAoX19pYnQoX1NfbWVtX2Jsb2Nrc1tfU19sYXN0X2RlYWxsb2NfaW5kZXhdKSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9TX2xhc3RfZGVhbGxvY19pbmRleAorCQkJCSAgPD0gX1NfbWVtX2Jsb2Nrcy5zaXplKCkgLSAxKTsKKworCSAgICAvLyBJbml0aWFsIEFzc3VtcHRpb24gd2FzIGNvcnJlY3QhCisJICAgIF9fZGlmZiA9IF9TX2xhc3RfZGVhbGxvY19pbmRleDsKKwkgICAgX19kaXNwbGFjZW1lbnQgPSBfX3JlYWxfcCAtIF9TX21lbV9ibG9ja3NbX19kaWZmXS5maXJzdDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIF9JdGVyYXRvciBfaXRlciA9IF9TX2ZpbmQoX19pYnQpOworCisJICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfaXRlciAhPSBfU19tZW1fYmxvY2tzLmVuZCgpKTsKKworCSAgICBfX2RpZmYgPSBfaXRlciAtIF9TX21lbV9ibG9ja3MuYmVnaW4oKTsKKwkgICAgX19kaXNwbGFjZW1lbnQgPSBfX3JlYWxfcCAtIF9TX21lbV9ibG9ja3NbX19kaWZmXS5maXJzdDsKKwkgICAgX1NfbGFzdF9kZWFsbG9jX2luZGV4ID0gX19kaWZmOworCSAgfQorCisJLy8gR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlcmF0b3IgdGhhdCBoYXMgYmVlbiBmb3VuZC4KKwljb25zdCBzaXplX3QgX19yb3RhdGUgPSAoX19kaXNwbGFjZW1lbnQKKwkJCQkgJSBzaXplX3QoX19kZXRhaWw6OmJpdHNfcGVyX2Jsb2NrKSk7CisJc2l6ZV90KiBfX2JpdG1hcEMgPSAKKwkgIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4KKwkgIChfU19tZW1fYmxvY2tzW19fZGlmZl0uZmlyc3QpIC0gMTsKKwlfX2JpdG1hcEMgLT0gKF9fZGlzcGxhY2VtZW50IC8gc2l6ZV90KF9fZGV0YWlsOjpiaXRzX3Blcl9ibG9jaykpOworICAgICAgCisJX19kZXRhaWw6Ol9fYml0X2ZyZWUoX19iaXRtYXBDLCBfX3JvdGF0ZSk7CisJc2l6ZV90KiBfX3B1c2VfY291bnQgPSByZWludGVycHJldF9jYXN0PHNpemVfdCo+CisJICAoX1NfbWVtX2Jsb2Nrc1tfX2RpZmZdLmZpcnN0KQorCSAgLSAoX19kZXRhaWw6Ol9fbnVtX2JpdG1hcHMoX1NfbWVtX2Jsb2Nrc1tfX2RpZmZdKSArIDEpOworCQorCV9HTElCQ1hYX0RFQlVHX0FTU0VSVCgqX19wdXNlX2NvdW50ICE9IDApOworCisJLS0oKl9fcHVzZV9jb3VudCk7CisKKwlpZiAoX19idWlsdGluX2V4cGVjdCgqX19wdXNlX2NvdW50ID09IDAsIGZhbHNlKSkKKwkgIHsKKwkgICAgX1NfYmxvY2tfc2l6ZSAvPSAyOworCSAgCisJICAgIC8vIFdlIGNhbiBzYWZlbHkgcmVtb3ZlIHRoaXMgYmxvY2suCisJICAgIC8vIF9CbG9ja19wYWlyIF9fYnAgPSBfU19tZW1fYmxvY2tzW19fZGlmZl07CisJICAgIHRoaXMtPl9NX2luc2VydChfX3B1c2VfY291bnQpOworCSAgICBfU19tZW1fYmxvY2tzLmVyYXNlKF9TX21lbV9ibG9ja3MuYmVnaW4oKSArIF9fZGlmZik7CisKKwkgICAgLy8gUmVzZXQgdGhlIF9TX2xhc3RfcmVxdWVzdCB2YXJpYWJsZSB0byByZWZsZWN0IHRoZQorCSAgICAvLyBlcmFzZWQgYmxvY2suIFdlIGRvIHRoaXMgdG8gcHJvdGVjdCBmdXR1cmUgcmVxdWVzdHMKKwkgICAgLy8gYWZ0ZXIgdGhlIGxhc3QgYmxvY2sgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGEgcGFydGljdWxhcgorCSAgICAvLyBtZW1vcnkgQ2h1bmssIHdoaWNoIGluIHR1cm4gaGFzIGJlZW4gcmV0dXJuZWQgdG8gdGhlCisJICAgIC8vIGZyZWUgbGlzdCwgYW5kIGhlbmNlIGhhZCBiZWVuIGVyYXNlZCBmcm9tIHRoZSB2ZWN0b3IsCisJICAgIC8vIHNvIHRoZSBzaXplIG9mIHRoZSB2ZWN0b3IgZ2V0cyByZWR1Y2VkIGJ5IDEuCisJICAgIGlmICgoX0RpZmZlcmVuY2VfdHlwZSlfU19sYXN0X3JlcXVlc3QuX01fd2hlcmUoKSA+PSBfX2RpZmYtLSkKKwkgICAgICBfU19sYXN0X3JlcXVlc3QuX01fcmVzZXQoX19kaWZmKTsgCisKKwkgICAgLy8gSWYgdGhlIEluZGV4IGludG8gdGhlIHZlY3RvciBvZiB0aGUgcmVnaW9uIG9mIG1lbW9yeQorCSAgICAvLyB0aGF0IG1pZ2h0IGhvbGQgdGhlIG5leHQgYWRkcmVzcyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvCisJICAgIC8vIGRlYWxsb2NhdGVkIG1heSBoYXZlIGJlZW4gaW52YWxpZGF0ZWQgZHVlIHRvIHRoZSBhYm92ZQorCSAgICAvLyBlcmFzZSBwcm9jZWR1cmUgYmVpbmcgY2FsbGVkIG9uIHRoZSB2ZWN0b3IsIGhlbmNlIHdlCisJICAgIC8vIHRyeSB0byByZXN0b3JlIHRoaXMgaW52YXJpYW50IHRvby4KKwkgICAgaWYgKF9TX2xhc3RfZGVhbGxvY19pbmRleCA+PSBfU19tZW1fYmxvY2tzLnNpemUoKSkKKwkgICAgICB7CisJCV9TX2xhc3RfZGVhbGxvY19pbmRleCA9KF9fZGlmZiAhPSAtMSA/IF9fZGlmZiA6IDApOworCQlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX1NfbGFzdF9kZWFsbG9jX2luZGV4ID49IDApOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIGJpdG1hcF9hbGxvY2F0b3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgfQorCisgICAgICBiaXRtYXBfYWxsb2NhdG9yKGNvbnN0IGJpdG1hcF9hbGxvY2F0b3ImKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBiaXRtYXBfYWxsb2NhdG9yKGNvbnN0IGJpdG1hcF9hbGxvY2F0b3I8X1RwMT4mKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgICAgeyB9CisKKyAgICAgIH5iaXRtYXBfYWxsb2NhdG9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IH0KKworICAgICAgcG9pbnRlciAKKyAgICAgIGFsbG9jYXRlKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fbiA+IHRoaXMtPm1heF9zaXplKCkpCisJICBzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisKKwlpZiAoX19idWlsdGluX2V4cGVjdChfX24gPT0gMSwgdHJ1ZSkpCisJICByZXR1cm4gdGhpcy0+X01fYWxsb2NhdGVfc2luZ2xlX29iamVjdCgpOworCWVsc2UKKwkgIHsgCisJICAgIGNvbnN0IHNpemVfdHlwZSBfX2IgPSBfX24gKiBzaXplb2YodmFsdWVfdHlwZSk7CisJICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHBvaW50ZXI+KDo6b3BlcmF0b3IgbmV3KF9fYikpOworCSAgfQorICAgICAgfQorCisgICAgICBwb2ludGVyIAorICAgICAgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgdHlwZW5hbWUgYml0bWFwX2FsbG9jYXRvcjx2b2lkPjo6Y29uc3RfcG9pbnRlcikKKyAgICAgIHsgcmV0dXJuIGFsbG9jYXRlKF9fbik7IH0KKworICAgICAgdm9pZCAKKyAgICAgIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pIHRocm93KCkKKyAgICAgIHsKKwlpZiAoX19idWlsdGluX2V4cGVjdChfX3AgIT0gMCwgdHJ1ZSkpCisJICB7CisJICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KF9fbiA9PSAxLCB0cnVlKSkKKwkgICAgICB0aGlzLT5fTV9kZWFsbG9jYXRlX3NpbmdsZV9vYmplY3QoX19wKTsKKwkgICAgZWxzZQorCSAgICAgIDo6b3BlcmF0b3IgZGVsZXRlKF9fcCk7CisJICB9CisgICAgICB9CisKKyAgICAgIHBvaW50ZXIgCisgICAgICBhZGRyZXNzKHJlZmVyZW5jZSBfX3IpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9fcik7IH0KKworICAgICAgY29uc3RfcG9pbnRlciAKKyAgICAgIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9fcikgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX19yKTsgfQorCisgICAgICBzaXplX3R5cGUgCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc2l6ZV90eXBlKC0xKSAvIHNpemVvZih2YWx1ZV90eXBlKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QoX1VwKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsgOjpuZXcoKHZvaWQgKilfX3ApIF9VcChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgdm9pZCAKKyAgICAgICAgZGVzdHJveShfVXAqIF9fcCkKKyAgICAgICAgeyBfX3AtPn5fVXAoKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQgCisgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0X3JlZmVyZW5jZSBfX2RhdGEpCisgICAgICB7IDo6bmV3KCh2b2lkICopX19wKSB2YWx1ZV90eXBlKF9fZGF0YSk7IH0KKworICAgICAgdm9pZCAKKyAgICAgIGRlc3Ryb3kocG9pbnRlciBfX3ApCisgICAgICB7IF9fcC0+fnZhbHVlX3R5cGUoKTsgfQorI2VuZGlmCisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgIGJvb2wgCisgICAgb3BlcmF0b3I9PShjb25zdCBiaXRtYXBfYWxsb2NhdG9yPF9UcDE+JiwgCisJICAgICAgIGNvbnN0IGJpdG1hcF9hbGxvY2F0b3I8X1RwMj4mKSB0aHJvdygpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICBib29sIAorICAgIG9wZXJhdG9yIT0oY29uc3QgYml0bWFwX2FsbG9jYXRvcjxfVHAxPiYsIAorCSAgICAgICBjb25zdCBiaXRtYXBfYWxsb2NhdG9yPF9UcDI+JikgdGhyb3coKSAKKyAgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLyBTdGF0aWMgbWVtYmVyIGRlZmluaXRpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdHlwZW5hbWUgYml0bWFwX2FsbG9jYXRvcjxfVHA+OjpfQlBWZWN0b3IKKyAgICBiaXRtYXBfYWxsb2NhdG9yPF9UcD46Ol9TX21lbV9ibG9ja3M7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHNpemVfdCBiaXRtYXBfYWxsb2NhdG9yPF9UcD46Ol9TX2Jsb2NrX3NpemUgPSAKKyAgICAyICogc2l6ZV90KF9fZGV0YWlsOjpiaXRzX3Blcl9ibG9jayk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHR5cGVuYW1lIGJpdG1hcF9hbGxvY2F0b3I8X1RwPjo6X0JQVmVjdG9yOjpzaXplX3R5cGUgCisgICAgYml0bWFwX2FsbG9jYXRvcjxfVHA+OjpfU19sYXN0X2RlYWxsb2NfaW5kZXggPSAwOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfX2RldGFpbDo6X0JpdG1hcF9jb3VudGVyCisgICAgICA8dHlwZW5hbWUgYml0bWFwX2FsbG9jYXRvcjxfVHA+OjpfQWxsb2NfYmxvY2sqPgorICAgIGJpdG1hcF9hbGxvY2F0b3I8X1RwPjo6X1NfbGFzdF9yZXF1ZXN0KF9TX21lbV9ibG9ja3MpOworCisjaWYgZGVmaW5lZCBfX0dUSFJFQURTCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB0eXBlbmFtZSBiaXRtYXBfYWxsb2NhdG9yPF9UcD46Ol9fbXV0ZXhfdHlwZQorICAgIGJpdG1hcF9hbGxvY2F0b3I8X1RwPjo6X1NfbXV0OworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19nbnVfY3h4CisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvY2FzdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvY2FzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MWE5NjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9jYXN0LmgKQEAgLTAsMCArMSwxMjEgQEAKKy8vIDxjYXN0Lmg+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvY2FzdC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXh0L3BvaW50ZXIuaH0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0NBU1RfSAorI2RlZmluZSBfR0xJQkNYWF9DQVNUX0ggMQorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaGVyZSB0byBhbGxvdyBjb250YWluZXJzIHRvIHN1cHBvcnQgbm9uIHN0YW5kYXJkCisgICAqIHBvaW50ZXIgdHlwZXMuICBGb3Igbm9ybWFsIHBvaW50ZXJzLCB0aGVzZSByZXNvbHZlIHRvIHRoZSB1c2Ugb2YgdGhlCisgICAqIHN0YW5kYXJkIGNhc3Qgb3BlcmF0aW9uLiAgRm9yIG90aGVyIHR5cGVzIHRoZSBmdW5jdGlvbnMgd2lsbCBwZXJmb3JtCisgICAqIHRoZSBhcHBycHJpYXRlIGNhc3QgdG8vZnJvbSB0aGUgY3VzdG9tIHBvaW50ZXIgY2xhc3Mgc28gbG9uZyBhcyB0aGF0CisgICAqIGNsYXNzIG1lZXRzIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAgICogMSkgaGFzIGEgdHlwZWRlZiBlbGVtZW50X3R5cGUgd2hpY2ggbmFtZXMgdGVoZSB0eXBlIGl0IHBvaW50cyB0by4KKyAgICogMikgaGFzIGEgZ2V0KCkgY29uc3QgbWV0aG9kIHdoaWNoIHJldHVybnMgZWxlbWVudF90eXBlKi4KKyAgICogMykgaGFzIGEgY29uc3RydWN0b3Igd2hpY2ggY2FuIHRha2Ugb25lIGVsZW1lbnRfdHlwZSogYXJndW1lbnQuCisgICAqLworCisgIC8qKgorICAgKiBUaGlzIHR5cGUgc3VwcG9ydHMgdGhlIHNlbWFudGljcyBvZiB0aGUgcG9pbnRlciBjYXN0IG9wZXJhdG9ycyAoYmVsb3cuKQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RvVHlwZT4KKyAgICBzdHJ1Y3QgX0Nhc3RlcgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSBfVG9UeXBlOjplbGVtZW50X3R5cGUqICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub1R5cGU+CisgICAgc3RydWN0IF9DYXN0ZXI8X1RvVHlwZSo+CisgICAgeyB0eXBlZGVmIF9Ub1R5cGUqICB0eXBlOyB9OworCisgIC8qKgorICAgKiBDYXN0aW5nIG9wZXJhdGlvbnMgZm9yIGNhc2VzIHdoZXJlIF9Gcm9tVHlwZSBpcyBub3QgYSBzdGFuZGFyZCBwb2ludGVyLgorICAgKiBfVG9UeXBlIGNhbiBiZSBhIHN0YW5kYXJkIG9yIG5vbi1zdGFuZGFyZCBwb2ludGVyLiAgR2l2ZW4gdGhhdCBfRnJvbVR5cGUKKyAgICogaXMgbm90IGEgcG9pbnRlciwgaXQgbXVzdCBoYXZlIGEgZ2V0KCkgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgc3RhbmRhcmQKKyAgICogcG9pbnRlciBlcXVpdmFsZW50IG9mIHRoZSBhZGRyZXNzIGl0IHBvaW50cyB0bywgYW5kIG11c3QgaGF2ZSBhbgorICAgKiBlbGVtZW50X3R5cGUgdHlwZWRlZiB3aGljaCBuYW1lcyB0aGUgdHlwZSBpdCBwb2ludHMgdG8uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9UeXBlLCB0eXBlbmFtZSBfRnJvbVR5cGU+CisgICAgaW5saW5lIF9Ub1R5cGUKKyAgICBfX3N0YXRpY19wb2ludGVyX2Nhc3QoY29uc3QgX0Zyb21UeXBlJiBfX2FyZykKKyAgICB7IHJldHVybiBfVG9UeXBlKHN0YXRpY19jYXN0PHR5cGVuYW1lIF9DYXN0ZXI8X1RvVHlwZT46OgorCQkgICAgIHR5cGU+KF9fYXJnLmdldCgpKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9UeXBlLCB0eXBlbmFtZSBfRnJvbVR5cGU+CisgICAgaW5saW5lIF9Ub1R5cGUKKyAgICBfX2R5bmFtaWNfcG9pbnRlcl9jYXN0KGNvbnN0IF9Gcm9tVHlwZSYgX19hcmcpCisgICAgeyByZXR1cm4gX1RvVHlwZShkeW5hbWljX2Nhc3Q8dHlwZW5hbWUgX0Nhc3RlcjxfVG9UeXBlPjo6CisJCSAgICAgdHlwZT4oX19hcmcuZ2V0KCkpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub1R5cGUsIHR5cGVuYW1lIF9Gcm9tVHlwZT4KKyAgICBpbmxpbmUgX1RvVHlwZQorICAgIF9fY29uc3RfcG9pbnRlcl9jYXN0KGNvbnN0IF9Gcm9tVHlwZSYgX19hcmcpCisgICAgeyByZXR1cm4gX1RvVHlwZShjb25zdF9jYXN0PHR5cGVuYW1lIF9DYXN0ZXI8X1RvVHlwZT46OgorCQkgICAgIHR5cGU+KF9fYXJnLmdldCgpKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9UeXBlLCB0eXBlbmFtZSBfRnJvbVR5cGU+CisgICAgaW5saW5lIF9Ub1R5cGUKKyAgICBfX3JlaW50ZXJwcmV0X3BvaW50ZXJfY2FzdChjb25zdCBfRnJvbVR5cGUmIF9fYXJnKQorICAgIHsgcmV0dXJuIF9Ub1R5cGUocmVpbnRlcnByZXRfY2FzdDx0eXBlbmFtZSBfQ2FzdGVyPF9Ub1R5cGU+OjoKKwkJICAgICB0eXBlPihfX2FyZy5nZXQoKSkpOyB9CisKKyAgLyoqCisgICAqIENhc3Rpbmcgb3BlcmF0aW9ucyBmb3IgY2FzZXMgd2hlcmUgX0Zyb21UeXBlIGlzIGEgc3RhbmRhcmQgcG9pbnRlci4KKyAgICogX1RvVHlwZSBjYW4gYmUgYSBzdGFuZGFyZCBvciBub24tc3RhbmRhcmQgcG9pbnRlci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub1R5cGUsIHR5cGVuYW1lIF9Gcm9tVHlwZT4KKyAgICBpbmxpbmUgX1RvVHlwZQorICAgIF9fc3RhdGljX3BvaW50ZXJfY2FzdChfRnJvbVR5cGUqIF9fYXJnKQorICAgIHsgcmV0dXJuIF9Ub1R5cGUoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgX0Nhc3RlcjxfVG9UeXBlPjo6CisJCSAgICAgdHlwZT4oX19hcmcpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub1R5cGUsIHR5cGVuYW1lIF9Gcm9tVHlwZT4KKyAgICBpbmxpbmUgX1RvVHlwZQorICAgIF9fZHluYW1pY19wb2ludGVyX2Nhc3QoX0Zyb21UeXBlKiBfX2FyZykKKyAgICB7IHJldHVybiBfVG9UeXBlKGR5bmFtaWNfY2FzdDx0eXBlbmFtZSBfQ2FzdGVyPF9Ub1R5cGU+OjoKKwkJICAgICB0eXBlPihfX2FyZykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RvVHlwZSwgdHlwZW5hbWUgX0Zyb21UeXBlPgorICAgIGlubGluZSBfVG9UeXBlCisgICAgX19jb25zdF9wb2ludGVyX2Nhc3QoX0Zyb21UeXBlKiBfX2FyZykKKyAgICB7IHJldHVybiBfVG9UeXBlKGNvbnN0X2Nhc3Q8dHlwZW5hbWUgX0Nhc3RlcjxfVG9UeXBlPjo6CisJCSAgICAgdHlwZT4oX19hcmcpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub1R5cGUsIHR5cGVuYW1lIF9Gcm9tVHlwZT4KKyAgICBpbmxpbmUgX1RvVHlwZQorICAgIF9fcmVpbnRlcnByZXRfcG9pbnRlcl9jYXN0KF9Gcm9tVHlwZSogX19hcmcpCisgICAgeyByZXR1cm4gX1RvVHlwZShyZWludGVycHJldF9jYXN0PHR5cGVuYW1lIF9DYXN0ZXI8X1RvVHlwZT46OgorCQkgICAgIHR5cGU+KF9fYXJnKSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX0dMSUJDWFhfQ0FTVF9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9jbWF0aCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2NtYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxN2E1M2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9jbWF0aApAQCAtMCwwICsxLDE1MiBAQAorLy8gTWF0aCBleHRlbnNpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L2NtYXRoCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfRVhUX0NNQVRICisjZGVmaW5lIF9FWFRfQ01BVEggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBBIGNsYXNzIGZvciBtYXRoIGNvbnN0YW50cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHN0cnVjdCBfX21hdGhfY29uc3RhbnRzCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgICAgLy8gQ29uc3RhbnQgQGYkIFxwaSBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX3BpID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI5TDsKKyAgICAgIC8vIENvbnN0YW50IEBmJCBccGkgLyAyIEBmJC4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1JlYWxUeXBlIF9fcGlfaGFsZiA9IDEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMxMzIxNjkxNjM5NzUxNEw7CisgICAgICAvLyBDb25zdGFudCBAZiQgXHBpIC8gMyBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX3BpX3RoaXJkID0gMS4wNDcxOTc1NTExOTY1OTc3NDYxNTQyMTQ0NjEwOTMxNjc2TDsKKyAgICAgIC8vIENvbnN0YW50IEBmJCBccGkgLyA0IEBmJC4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1JlYWxUeXBlIF9fcGlfcXVhcnRlciA9IDAuNzg1Mzk4MTYzMzk3NDQ4MzA5NjE1NjYwODQ1ODE5ODc1N0w7CisgICAgICAvLyBDb25zdGFudCBAZiQgXHNxcnQoXHBpIC8gMikgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19yb290X3BpX2Rpdl8yID0gMS4yNTMzMTQxMzczMTU1MDAyNTEyMDc4ODI2NDI0MDU1MjI2TDsKKyAgICAgIC8vIENvbnN0YW50IEBmJCAxIC8gXHBpIEBmJC4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1JlYWxUeXBlIF9fb25lX2Rpdl9waSA9IDAuMzE4MzA5ODg2MTgzNzkwNjcxNTM3NzY3NTI2NzQ1MDI4N0w7CisgICAgICAvLyBDb25zdGFudCBAZiQgMiAvIFxwaSBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX3R3b19kaXZfcGkgPSAwLjYzNjYxOTc3MjM2NzU4MTM0MzA3NTUzNTA1MzQ5MDA1NzRMOworICAgICAgLy8gQ29uc3RhbnQgQGYkIDIgLyBcc3FydChccGkpIEBmJC4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1JlYWxUeXBlIF9fdHdvX2Rpdl9yb290X3BpID0gMS4xMjgzNzkxNjcwOTU1MTI1NzM4OTYxNTg5MDMxMjE1NDUyTDsKKworICAgICAgLy8gQ29uc3RhbnQgRXVsZXIncyBudW1iZXIgQGYkIGUgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19lID0gMi43MTgyODE4Mjg0NTkwNDUyMzUzNjAyODc0NzEzNTI2NjI1TDsKKyAgICAgIC8vIENvbnN0YW50IEBmJCAxIC8gZSBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX29uZV9kaXZfZSA9IDAuMzY3ODc5NDQxMTcxNDQyMzIxNTk1NTIzNzcwMTYxNDYwODdMOworICAgICAgLy8gQ29uc3RhbnQgQGYkIFxsb2dfMihlKSBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX2xvZzJfZSA9IDEuNDQyNjk1MDQwODg4OTYzNDA3MzU5OTI0NjgxMDAxODkyMUw7CisgICAgICAvLyBDb25zdGFudCBAZiQgXGxvZ18xMChlKSBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX2xvZzEwX2UgPSAwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1MTEyODkxODkxNjYwNTFMOworICAgICAgLy8gQ29uc3RhbnQgQGYkIFxsbigyKSBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX2xuXzIgPSAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NjZMOworICAgICAgLy8gQ29uc3RhbnQgQGYkIFxsbigzKSBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX2xuXzMgPSAxLjA5ODYxMjI4ODY2ODEwOTY5MTM5NTI0NTIzNjkyMjUyNTdMOworICAgICAgLy8gQ29uc3RhbnQgQGYkIFxsbigxMCkgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19sbl8xMCA9IDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0Mkw7CisKKyAgICAgIC8vIENvbnN0YW50IEV1bGVyLU1hc2NoZXJvbmkgQGYkIFxnYW1tYV9FIEBmJC4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1JlYWxUeXBlIF9fZ2FtbWFfZSA9IDAuNTc3MjE1NjY0OTAxNTMyODYwNjA2NTEyMDkwMDgyNDAyNEw7CisgICAgICAvLyBDb25zdGFudCBHb2xkZW4gUmF0aW8gQGYkIFxwaGkgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19waGkgPSAxLjYxODAzMzk4ODc0OTg5NDg0ODIwNDU4NjgzNDM2NTYzODFMOworCisgICAgICAvLyBDb25zdGFudCBAZiQgXHNxcnQoMikgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19yb290XzIgPSAxLjQxNDIxMzU2MjM3MzA5NTA0ODgwMTY4ODcyNDIwOTY5ODFMOworICAgICAgLy8gQ29uc3RhbnQgQGYkIFxzcXJ0KDMpIEBmJC4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1JlYWxUeXBlIF9fcm9vdF8zID0gMS43MzIwNTA4MDc1Njg4NzcyOTM1Mjc0NDYzNDE1MDU4NzI0TDsKKyAgICAgIC8vIENvbnN0YW50IEBmJCBcc3FydCg1KSBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX3Jvb3RfNSA9IDIuMjM2MDY3OTc3NDk5Nzg5Njk2NDA5MTczNjY4NzMxMjc2Mkw7CisgICAgICAvLyBDb25zdGFudCBAZiQgXHNxcnQoNykgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19yb290XzcgPSAyLjY0NTc1MTMxMTA2NDU5MDU5MDUwMTYxNTc1MzYzOTI2MDRMOworICAgICAgLy8gQ29uc3RhbnQgQGYkIDEgLyBcc3FydCgyKSBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX29uZV9kaXZfcm9vdF8yID0gMC43MDcxMDY3ODExODY1NDc1MjQ0MDA4NDQzNjIxMDQ4NDkwTDsKKyAgICB9OworCisgIC8vIEFuZCB0aGUgdGVtcGxhdGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBjb25zdGFudHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBjb25zdGV4cHIgX1JlYWxUeXBlIF9fbWF0aF9jb25zdGFudHM8X1JlYWxUeXBlPjo6X19waTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX3BpX2hhbGY7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBjb25zdGV4cHIgX1JlYWxUeXBlIF9fbWF0aF9jb25zdGFudHM8X1JlYWxUeXBlPjo6X19waV90aGlyZDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX3BpX3F1YXJ0ZXI7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBjb25zdGV4cHIgX1JlYWxUeXBlIF9fbWF0aF9jb25zdGFudHM8X1JlYWxUeXBlPjo6X19yb290X3BpX2Rpdl8yOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fb25lX2Rpdl9waTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX3R3b19kaXZfcGk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBjb25zdGV4cHIgX1JlYWxUeXBlIF9fbWF0aF9jb25zdGFudHM8X1JlYWxUeXBlPjo6X190d29fZGl2X3Jvb3RfcGk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBjb25zdGV4cHIgX1JlYWxUeXBlIF9fbWF0aF9jb25zdGFudHM8X1JlYWxUeXBlPjo6X19lOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fb25lX2Rpdl9lOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fbG9nMl9lOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fbG9nMTBfZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX2xuXzI7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBjb25zdGV4cHIgX1JlYWxUeXBlIF9fbWF0aF9jb25zdGFudHM8X1JlYWxUeXBlPjo6X19sbl8zOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fbG5fMTA7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBjb25zdGV4cHIgX1JlYWxUeXBlIF9fbWF0aF9jb25zdGFudHM8X1JlYWxUeXBlPjo6X19nYW1tYV9lOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fcGhpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fcm9vdF8yOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fcm9vdF8zOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fcm9vdF81OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fcm9vdF83OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fb25lX2Rpdl9yb290XzI7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19nbnVfY3h4CisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0VYVF9DTUFUSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvY29kZWN2dF9zcGVjaWFsaXphdGlvbnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2NvZGVjdnRfc3BlY2lhbGl6YXRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyZGZjNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2NvZGVjdnRfc3BlY2lhbGl6YXRpb25zLmgKQEAgLTAsMCArMSw1MTIgQEAKKy8vIExvY2FsZSBzdXBwb3J0IChjb2RlY3Z0KSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMi4xLjUgVGVtcGxhdGUgY2xhc3MgY29kZWN2dAorLy8KKworLy8gV3JpdHRlbiBieSBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKworLyoqIEBmaWxlIGV4dC9jb2RlY3Z0X3NwZWNpYWxpemF0aW9ucy5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfRVhUX0NPREVDVlRfU1BFQ0lBTElaQVRJT05TX0gKKyNkZWZpbmUgX0VYVF9DT0RFQ1ZUX1NQRUNJQUxJWkFUSU9OU19IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPGljb252Lmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLy8gRXh0ZW5zaW9uIHRvIHVzZSBpY29udiBmb3IgZGVhbGluZyB3aXRoIGNoYXJhY3RlciBlbmNvZGluZ3MuCisgIC8vIFRoaXMgaW5jbHVkZXMgY29udmVyc2lvbnMgYW5kIGNvbXBhcmlzb25zIGJldHdlZW4gdmFyaW91cyBjaGFyYWN0ZXIKKyAgLy8gc2V0cy4gIFRoaXMgb2JqZWN0IGVuY2Fwc3VsYXRlcyBkYXRhIHRoYXQgbWF5IG5lZWQgdG8gYmUgc2hhcmVkIGJldHdlZW4KKyAgLy8gY2hhcl90cmFpdHMsIGNvZGVjdnQgYW5kIGN0eXBlLgorICBjbGFzcyBlbmNvZGluZ19zdGF0ZQorICB7CisgIHB1YmxpYzoKKyAgICAvLyBUeXBlczogCisgICAgLy8gTkI6IEEgY29udmVyc2lvbiBkZXNjcmlwdG9yIHN1YnN1bWVzIGFuZCBlbmhhbmNlcyB0aGUKKyAgICAvLyBmdW5jdGlvbmFsaXR5IG9mIGEgc2ltcGxlIHN0YXRlIHR5cGUgc3VjaCBhcyBtYnN0YXRlX3QuCisgICAgdHlwZWRlZiBpY29udl90CWRlc2NyaXB0b3JfdHlwZTsKKyAgICAKKyAgcHJvdGVjdGVkOgorICAgIC8vIE5hbWUgb2YgaW50ZXJuYWwgY2hhcmFjdGVyIHNldCBlbmNvZGluZy4KKyAgICBzdGQ6OnN0cmluZwkgICAgICAgCV9NX2ludF9lbmM7CisKKyAgICAvLyBOYW1lIG9mIGV4dGVybmFsIGNoYXJhY3RlciBzZXQgZW5jb2RpbmcuCisgICAgc3RkOjpzdHJpbmcgIAlfTV9leHRfZW5jOworCisgICAgLy8gQ29udmVyc2lvbiBkZXNjcmlwdG9yIGJldHdlZW4gZXh0ZXJuYWwgZW5jb2RpbmcgdG8gaW50ZXJuYWwgZW5jb2RpbmcuCisgICAgZGVzY3JpcHRvcl90eXBlCV9NX2luX2Rlc2M7CisKKyAgICAvLyBDb252ZXJzaW9uIGRlc2NyaXB0b3IgYmV0d2VlbiBpbnRlcm5hbCBlbmNvZGluZyB0byBleHRlcm5hbCBlbmNvZGluZy4KKyAgICBkZXNjcmlwdG9yX3R5cGUJX01fb3V0X2Rlc2M7CisKKyAgICAvLyBUaGUgYnl0ZS1vcmRlciBtYXJrZXIgZm9yIHRoZSBleHRlcm5hbCBlbmNvZGluZywgaWYgbmVjZXNzYXJ5LgorICAgIGludAkJCV9NX2V4dF9ib207CisKKyAgICAvLyBUaGUgYnl0ZS1vcmRlciBtYXJrZXIgZm9yIHRoZSBpbnRlcm5hbCBlbmNvZGluZywgaWYgbmVjZXNzYXJ5LgorICAgIGludAkJCV9NX2ludF9ib207CisKKyAgICAvLyBOdW1iZXIgb2YgZXh0ZXJuYWwgYnl0ZXMgbmVlZGVkIHRvIGNvbnN0cnVjdCBvbmUgY29tcGxldGUKKyAgICAvLyBjaGFyYWN0ZXIgaW4gdGhlIGludGVybmFsIGVuY29kaW5nLgorICAgIC8vIE5COiAtMSBpbmRpY2F0ZXMgdmFyaWFibGUsIG9yIHN0YXRlZnVsLCBlbmNvZGluZ3MuCisgICAgaW50IAkJX01fYnl0ZXM7CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IAorICAgIGVuY29kaW5nX3N0YXRlKCkgCisgICAgOiBfTV9pbl9kZXNjKDApLCBfTV9vdXRfZGVzYygwKSwgX01fZXh0X2JvbSgwKSwgX01faW50X2JvbSgwKSwgX01fYnl0ZXMoMCkKKyAgICB7IH0KKworICAgIGV4cGxpY2l0IAorICAgIGVuY29kaW5nX3N0YXRlKGNvbnN0IGNoYXIqIF9faW50LCBjb25zdCBjaGFyKiBfX2V4dCwgCisJCSAgIGludCBfX2lib20gPSAwLCBpbnQgX19lYm9tID0gMCwgaW50IF9fYnl0ZXMgPSAxKQorICAgIDogX01faW50X2VuYyhfX2ludCksIF9NX2V4dF9lbmMoX19leHQpLCBfTV9pbl9kZXNjKDApLCBfTV9vdXRfZGVzYygwKSwgCisgICAgICBfTV9leHRfYm9tKF9fZWJvbSksIF9NX2ludF9ib20oX19pYm9tKSwgX01fYnl0ZXMoX19ieXRlcykKKyAgICB7IGluaXQoKTsgfQorCisgICAgLy8gMjEuMS4yIHRyYWl0cyB0eXBlZGVmcworICAgIC8vIHA0CisgICAgLy8gdHlwZWRlZiBTVEFURV9UIHN0YXRlX3R5cGUKKyAgICAvLyByZXF1aXJlczogc3RhdGVfdHlwZSBzaGFsbCBtZWV0IHRoZSByZXF1aXJlbWVudHMgb2YKKyAgICAvLyBDb3B5Q29uc3RydWN0aWJsZSB0eXBlcyAoMjAuMS4zKQorICAgIC8vIE5COiBUaGlzIGRvZXMgbm90IHByZXNlcnZlIHRoZSBhY3R1YWwgc3RhdGUgb2YgdGhlIGNvbnZlcnNpb24KKyAgICAvLyBkZXNjcmlwdG9yIG1lbWJlciwgYnV0IGl0IGRvZXMgZHVwbGljYXRlIHRoZSBlbmNvZGluZworICAgIC8vIGluZm9ybWF0aW9uLgorICAgIGVuY29kaW5nX3N0YXRlKGNvbnN0IGVuY29kaW5nX3N0YXRlJiBfX29iaikgOiBfTV9pbl9kZXNjKDApLCBfTV9vdXRfZGVzYygwKQorICAgIHsgY29uc3RydWN0KF9fb2JqKTsgfQorCisgICAgLy8gTmVlZCBhc3NpZ25tZW50IG9wZXJhdG9yIGFzIHdlbGwuCisgICAgZW5jb2Rpbmdfc3RhdGUmCisgICAgb3BlcmF0b3I9KGNvbnN0IGVuY29kaW5nX3N0YXRlJiBfX29iaikKKyAgICB7CisgICAgICBjb25zdHJ1Y3QoX19vYmopOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIH5lbmNvZGluZ19zdGF0ZSgpCisgICAgeyBkZXN0cm95KCk7IH0gCisKKyAgICBib29sCisgICAgZ29vZCgpIGNvbnN0IHRocm93KCkKKyAgICB7IAorICAgICAgY29uc3QgZGVzY3JpcHRvcl90eXBlIF9fZXJyID0gKGljb252X3QpKC0xKTsKKyAgICAgIGJvb2wgX190ZXN0ID0gX01faW5fZGVzYyAmJiBfTV9pbl9kZXNjICE9IF9fZXJyOyAKKyAgICAgIF9fdGVzdCAmPSAgX01fb3V0X2Rlc2MgJiYgX01fb3V0X2Rlc2MgIT0gX19lcnI7CisgICAgICByZXR1cm4gX190ZXN0OworICAgIH0KKyAgICAKKyAgICBpbnQKKyAgICBjaGFyYWN0ZXJfcmF0aW8oKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2J5dGVzOyB9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZworICAgIGludGVybmFsX2VuY29kaW5nKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9pbnRfZW5jOyB9CisKKyAgICBpbnQgCisgICAgaW50ZXJuYWxfYm9tKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9pbnRfYm9tOyB9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZworICAgIGV4dGVybmFsX2VuY29kaW5nKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9leHRfZW5jOyB9CisKKyAgICBpbnQgCisgICAgZXh0ZXJuYWxfYm9tKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9leHRfYm9tOyB9CisKKyAgICBjb25zdCBkZXNjcmlwdG9yX3R5cGUmCisgICAgaW5fZGVzY3JpcHRvcigpIGNvbnN0CisgICAgeyByZXR1cm4gX01faW5fZGVzYzsgfQorCisgICAgY29uc3QgZGVzY3JpcHRvcl90eXBlJgorICAgIG91dF9kZXNjcmlwdG9yKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9vdXRfZGVzYzsgfQorCisgIHByb3RlY3RlZDoKKyAgICB2b2lkCisgICAgaW5pdCgpCisgICAgeworICAgICAgY29uc3QgZGVzY3JpcHRvcl90eXBlIF9fZXJyID0gKGljb252X3QpKC0xKTsKKyAgICAgIGNvbnN0IGJvb2wgX19oYXZlX2VuY29kaW5ncyA9IF9NX2ludF9lbmMuc2l6ZSgpICYmIF9NX2V4dF9lbmMuc2l6ZSgpOworICAgICAgaWYgKCFfTV9pbl9kZXNjICYmIF9faGF2ZV9lbmNvZGluZ3MpCisJeworCSAgX01faW5fZGVzYyA9IGljb252X29wZW4oX01faW50X2VuYy5jX3N0cigpLCBfTV9leHRfZW5jLmNfc3RyKCkpOworCSAgaWYgKF9NX2luX2Rlc2MgPT0gX19lcnIpCisJICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiZW5jb2Rpbmdfc3RhdGU6Ol9NX2luaXQgIgorCQkJCSAgICAiY3JlYXRpbmcgaWNvbnYgaW5wdXQgZGVzY3JpcHRvciBmYWlsZWQiKSk7CisJfQorICAgICAgaWYgKCFfTV9vdXRfZGVzYyAmJiBfX2hhdmVfZW5jb2RpbmdzKQorCXsKKwkgIF9NX291dF9kZXNjID0gaWNvbnZfb3BlbihfTV9leHRfZW5jLmNfc3RyKCksIF9NX2ludF9lbmMuY19zdHIoKSk7CisJICBpZiAoX01fb3V0X2Rlc2MgPT0gX19lcnIpCisJICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiZW5jb2Rpbmdfc3RhdGU6Ol9NX2luaXQgIgorCQkJCSAgImNyZWF0aW5nIGljb252IG91dHB1dCBkZXNjcmlwdG9yIGZhaWxlZCIpKTsKKwl9CisgICAgfQorCisgICAgdm9pZAorICAgIGNvbnN0cnVjdChjb25zdCBlbmNvZGluZ19zdGF0ZSYgX19vYmopCisgICAgeworICAgICAgZGVzdHJveSgpOworICAgICAgX01faW50X2VuYyA9IF9fb2JqLl9NX2ludF9lbmM7CisgICAgICBfTV9leHRfZW5jID0gX19vYmouX01fZXh0X2VuYzsKKyAgICAgIF9NX2V4dF9ib20gPSBfX29iai5fTV9leHRfYm9tOworICAgICAgX01faW50X2JvbSA9IF9fb2JqLl9NX2ludF9ib207CisgICAgICBfTV9ieXRlcyA9IF9fb2JqLl9NX2J5dGVzOworICAgICAgaW5pdCgpOworICAgIH0KKworICAgIHZvaWQKKyAgICBkZXN0cm95KCkgdGhyb3coKQorICAgIHsKKyAgICAgIGNvbnN0IGRlc2NyaXB0b3JfdHlwZSBfX2VyciA9IChpY29udl90KSgtMSk7CisgICAgICBpZiAoX01faW5fZGVzYyAmJiBfTV9pbl9kZXNjICE9IF9fZXJyKSAKKwl7CisJICBpY29udl9jbG9zZShfTV9pbl9kZXNjKTsKKwkgIF9NX2luX2Rlc2MgPSAwOworCX0KKyAgICAgIGlmIChfTV9vdXRfZGVzYyAmJiBfTV9vdXRfZGVzYyAhPSBfX2VycikgCisJeworCSAgaWNvbnZfY2xvc2UoX01fb3V0X2Rlc2MpOworCSAgX01fb3V0X2Rlc2MgPSAwOworCX0KKyAgICB9CisgIH07CisKKyAgLy8vIGVuY29kaW5nX2NoYXJfdHJhaXRzCisgIC8vIEN1c3RvbSB0cmFpdHMgdHlwZSB3aXRoIGVuY29kaW5nX3N0YXRlIGZvciB0aGUgc3RhdGUgdHlwZSwgYW5kIHRoZQorICAvLyBhc3NvY2lhdGVkIGZwb3M8ZW5jb2Rpbmdfc3RhdGU+IGZvciB0aGUgcG9zaXRpb24gdHlwZSwgYWxsIG90aGVyCisgIC8vIGJpdHMgZXF1aXZhbGVudCB0byB0aGUgcmVxdWlyZWQgY2hhcl90cmFpdHMgaW5zdGFudGlhdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBzdHJ1Y3QgZW5jb2RpbmdfY2hhcl90cmFpdHMgOiBwdWJsaWMgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+CisgICAgeworICAgICAgdHlwZWRlZiBlbmNvZGluZ19zdGF0ZQkJCQlzdGF0ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmZwb3M8c3RhdGVfdHlwZT4JCXBvc190eXBlOworICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgX19nbnVfY3h4OjplbmNvZGluZ19zdGF0ZTsKKworICAvLy8gY29kZWN2dDxJbnRlcm5ULCBfRXh0ZXJuVCwgZW5jb2Rpbmdfc3RhdGU+IHNwZWNpYWxpemF0aW9uLgorICAvLyBUaGlzIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gdGFrZXMgYWR2YW50YWdlIG9mIGljb252IHRvIHByb3ZpZGUKKyAgLy8gY29kZSBjb252ZXJzaW9ucyBiZXR3ZWVuIGEgbGFyZ2UgbnVtYmVyIG9mIGNoYXJhY3RlciBlbmNvZGluZ3MuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVD4KKyAgICBjbGFzcyBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgZW5jb2Rpbmdfc3RhdGU+CisgICAgOiBwdWJsaWMgX19jb2RlY3Z0X2Fic3RyYWN0X2Jhc2U8X0ludGVyblQsIF9FeHRlcm5ULCBlbmNvZGluZ19zdGF0ZT4KKyAgICB7CisgICAgcHVibGljOiAgICAgIAorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIGNvZGVjdnRfYmFzZTo6cmVzdWx0CQkJcmVzdWx0OworICAgICAgdHlwZWRlZiBfSW50ZXJuVCAJCQkJCWludGVybl90eXBlOworICAgICAgdHlwZWRlZiBfRXh0ZXJuVCAJCQkJCWV4dGVybl90eXBlOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OmVuY29kaW5nX3N0YXRlIAkJc3RhdGVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RhdGVfdHlwZTo6ZGVzY3JpcHRvcl90eXBlIAkJZGVzY3JpcHRvcl90eXBlOworCisgICAgICAvLyBEYXRhIE1lbWJlcnM6CisgICAgICBzdGF0aWMgbG9jYWxlOjppZCAJCWlkOworCisgICAgICBleHBsaWNpdCAKKyAgICAgIGNvZGVjdnQoc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IF9fY29kZWN2dF9hYnN0cmFjdF9iYXNlPGludGVybl90eXBlLCBleHRlcm5fdHlwZSwgc3RhdGVfdHlwZT4oX19yZWZzKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0IAorICAgICAgY29kZWN2dChzdGF0ZV90eXBlJiBfX2VuYywgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IF9fY29kZWN2dF9hYnN0cmFjdF9iYXNlPGludGVybl90eXBlLCBleHRlcm5fdHlwZSwgc3RhdGVfdHlwZT4oX19yZWZzKQorICAgICAgeyB9CisKKyAgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbCAKKyAgICAgIH5jb2RlY3Z0KCkgeyB9CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb19vdXQoc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbSwgCisJICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKwkgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsCisJICAgICBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb191bnNoaWZ0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGV4dGVybl90eXBlKiBfX3RvLCAKKwkJIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9faW4oc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwgCisJICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgICBpbnRlcm5fdHlwZSogX190bywgaW50ZXJuX3R5cGUqIF9fdG9fZW5kLCAKKwkgICAgaW50ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGludCAKKyAgICAgIGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKTsKKworICAgICAgdmlydHVhbCBib29sIAorICAgICAgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCk7CisKKyAgICAgIHZpcnR1YWwgaW50IAorICAgICAgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLCAKKwkJY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLCBzaXplX3QgX19tYXgpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGludCAKKyAgICAgIGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5UPgorICAgIGxvY2FsZTo6aWQgCisgICAgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPjo6aWQ7CisKKyAgLy8gVGhpcyBhZGFwdG9yIHdvcmtzIGFyb3VuZCB0aGUgc2lnbmF0dXJlIHByb2JsZW1zIG9mIHRoZSBzZWNvbmQKKyAgLy8gYXJndW1lbnQgdG8gaWNvbnYoKTogIFNVU3YyIGFuZCBvdGhlcnMgdXNlICdjb25zdCBjaGFyKionLCBidXQgZ2xpYmMgMi4yCisgIC8vIHVzZXMgJ2NoYXIqKicsIHdoaWNoIG1hdGNoZXMgdGhlIFBPU0lYIDEwMDMuMS0yMDAxIHN0YW5kYXJkLgorICAvLyBVc2luZyB0aGlzIGFkYXB0b3IsIGcrKyB3aWxsIGRvIHRoZSB3b3JrIGZvciB1cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzaXplX3QKKyAgICBfX2ljb252X2FkYXB0b3Ioc2l6ZV90KCpfX2Z1bmMpKGljb252X3QsIF9UcCwgc2l6ZV90KiwgY2hhcioqLCBzaXplX3QqKSwKKyAgICAgICAgICAgICAgICAgICAgaWNvbnZfdCBfX2NkLCBjaGFyKiogX19pbmJ1Ziwgc2l6ZV90KiBfX2luYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIGNoYXIqKiBfX291dGJ1Ziwgc2l6ZV90KiBfX291dGJ5dGVzKQorICAgIHsgcmV0dXJuIF9fZnVuYyhfX2NkLCAoX1RwKV9faW5idWYsIF9faW5ieXRlcywgX19vdXRidWYsIF9fb3V0Ynl0ZXMpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5UPgorICAgIGNvZGVjdnRfYmFzZTo6cmVzdWx0CisgICAgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPjo6CisgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb20sIAorCSAgIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsCisJICAgZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0CisgICAgeworICAgICAgcmVzdWx0IF9fcmV0ID0gY29kZWN2dF9iYXNlOjplcnJvcjsKKyAgICAgIGlmIChfX3N0YXRlLmdvb2QoKSkKKwl7CisJICBjb25zdCBkZXNjcmlwdG9yX3R5cGUmIF9fZGVzYyA9IF9fc3RhdGUub3V0X2Rlc2NyaXB0b3IoKTsKKwkgIGNvbnN0IHNpemVfdCBfX2ZtdWx0aXBsZSA9IHNpemVvZihpbnRlcm5fdHlwZSk7CisJICBzaXplX3QgX19mYnl0ZXMgPSBfX2ZtdWx0aXBsZSAqIChfX2Zyb21fZW5kIC0gX19mcm9tKTsKKwkgIGNvbnN0IHNpemVfdCBfX3RtdWx0aXBsZSA9IHNpemVvZihleHRlcm5fdHlwZSk7CisJICBzaXplX3QgX190Ynl0ZXMgPSBfX3RtdWx0aXBsZSAqIChfX3RvX2VuZCAtIF9fdG8pOyAKKwkgIAorCSAgLy8gQXJndW1lbnQgbGlzdCBmb3IgaWNvbnYgc3BlY2lmaWVzIGEgYnl0ZSBzZXF1ZW5jZS4gVGh1cywKKwkgIC8vIGFsbCB0by9mcm9tIGFycmF5cyBtdXN0IGJlIGJydXRhbGx5IGNhc3RlZCB0byBjaGFyKi4KKwkgIGNoYXIqIF9fY3RvID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX190byk7CisJICBjaGFyKiBfX2Nmcm9tOworCSAgc2l6ZV90IF9fY29udjsKKworCSAgLy8gU29tZSBlbmNvZGluZ3MgbmVlZCBhIGJ5dGUgb3JkZXIgbWFya2VyIGFzIHRoZSBmaXJzdCBpdGVtCisJICAvLyBpbiB0aGUgYnl0ZSBzdHJlYW0sIHRvIGRlc2lnbmF0ZSBlbmRpYW4tbmVzcy4gVGhlIGRlZmF1bHQKKwkgIC8vIHZhbHVlIGZvciB0aGUgYnl0ZSBvcmRlciBtYXJrZXIgaXMgTlVMTCwgc28gaWYgdGhpcyBpcworCSAgLy8gdGhlIGNhc2UsIGl0J3Mgbm90IG5lY2Vzc2FyeSBhbmQgd2UgY2FuIGp1c3QgZ28gb24gb3VyCisJICAvLyBtZXJyeSB3YXkuCisJICBpbnQgX19pbnRfYm9tID0gX19zdGF0ZS5pbnRlcm5hbF9ib20oKTsKKwkgIGlmIChfX2ludF9ib20pCisJICAgIHsJICAKKwkgICAgICBzaXplX3QgX19zaXplID0gX19mcm9tX2VuZCAtIF9fZnJvbTsKKwkgICAgICBpbnRlcm5fdHlwZSogX19jZml4ZWQgPSBzdGF0aWNfY2FzdDxpbnRlcm5fdHlwZSo+CisJCShfX2J1aWx0aW5fYWxsb2NhKHNpemVvZihpbnRlcm5fdHlwZSkgKiAoX19zaXplICsgMSkpKTsKKwkgICAgICBfX2NmaXhlZFswXSA9IHN0YXRpY19jYXN0PGludGVybl90eXBlPihfX2ludF9ib20pOworCSAgICAgIGNoYXJfdHJhaXRzPGludGVybl90eXBlPjo6Y29weShfX2NmaXhlZCArIDEsIF9fZnJvbSwgX19zaXplKTsKKwkgICAgICBfX2Nmcm9tID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX19jZml4ZWQpOworCSAgICAgIF9fY29udiA9IF9faWNvbnZfYWRhcHRvcihpY29udiwgX19kZXNjLCAmX19jZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19mYnl0ZXMsICZfX2N0bywgJl9fdGJ5dGVzKTsgCisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGludGVybl90eXBlKiBfX2NmaXhlZCA9IGNvbnN0X2Nhc3Q8aW50ZXJuX3R5cGUqPihfX2Zyb20pOworCSAgICAgIF9fY2Zyb20gPSByZWludGVycHJldF9jYXN0PGNoYXIqPihfX2NmaXhlZCk7CisJICAgICAgX19jb252ID0gX19pY29udl9hZGFwdG9yKGljb252LCBfX2Rlc2MsICZfX2Nmcm9tLCAmX19mYnl0ZXMsIAorCQkJCSAgICAgICAmX19jdG8sICZfX3RieXRlcyk7IAorCSAgICB9CisKKwkgIGlmIChfX2NvbnYgIT0gc2l6ZV90KC0xKSkKKwkgICAgeworCSAgICAgIF9fZnJvbV9uZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnRlcm5fdHlwZSo+KF9fY2Zyb20pOworCSAgICAgIF9fdG9fbmV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZXh0ZXJuX3R5cGUqPihfX2N0byk7CisJICAgICAgX19yZXQgPSBjb2RlY3Z0X2Jhc2U6Om9rOworCSAgICB9CisJICBlbHNlIAorCSAgICB7CisJICAgICAgaWYgKF9fZmJ5dGVzIDwgX19mbXVsdGlwbGUgKiAoX19mcm9tX2VuZCAtIF9fZnJvbSkpCisJCXsKKwkJICBfX2Zyb21fbmV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50ZXJuX3R5cGUqPihfX2Nmcm9tKTsKKwkJICBfX3RvX25leHQgPSByZWludGVycHJldF9jYXN0PGV4dGVybl90eXBlKj4oX19jdG8pOworCQkgIF9fcmV0ID0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsOworCQl9CisJICAgICAgZWxzZQorCQlfX3JldCA9IGNvZGVjdnRfYmFzZTo6ZXJyb3I7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZXJuVCwgdHlwZW5hbWUgX0V4dGVyblQ+CisgICAgY29kZWN2dF9iYXNlOjpyZXN1bHQKKyAgICBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgZW5jb2Rpbmdfc3RhdGU+OjoKKyAgICBkb191bnNoaWZ0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGV4dGVybl90eXBlKiBfX3RvLCAKKwkgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3QKKyAgICB7CisgICAgICByZXN1bHQgX19yZXQgPSBjb2RlY3Z0X2Jhc2U6OmVycm9yOworICAgICAgaWYgKF9fc3RhdGUuZ29vZCgpKQorCXsKKwkgIGNvbnN0IGRlc2NyaXB0b3JfdHlwZSYgX19kZXNjID0gX19zdGF0ZS5pbl9kZXNjcmlwdG9yKCk7CisJICBjb25zdCBzaXplX3QgX190bXVsdGlwbGUgPSBzaXplb2YoaW50ZXJuX3R5cGUpOworCSAgc2l6ZV90IF9fdGxlbiA9IF9fdG11bHRpcGxlICogKF9fdG9fZW5kIC0gX190byk7IAorCSAgCisJICAvLyBBcmd1bWVudCBsaXN0IGZvciBpY29udiBzcGVjaWZpZXMgYSBieXRlIHNlcXVlbmNlLiBUaHVzLAorCSAgLy8gYWxsIHRvL2Zyb20gYXJyYXlzIG11c3QgYmUgYnJ1dGFsbHkgY2FzdGVkIHRvIGNoYXIqLgorCSAgY2hhciogX19jdG8gPSByZWludGVycHJldF9jYXN0PGNoYXIqPihfX3RvKTsKKwkgIHNpemVfdCBfX2NvbnYgPSBfX2ljb252X2FkYXB0b3IoaWNvbnYsX19kZXNjLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fY3RvLCAmX190bGVuKTsgCisJICAKKwkgIGlmIChfX2NvbnYgIT0gc2l6ZV90KC0xKSkKKwkgICAgeworCSAgICAgIF9fdG9fbmV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZXh0ZXJuX3R5cGUqPihfX2N0byk7CisJICAgICAgaWYgKF9fdGxlbiA9PSBfX3RtdWx0aXBsZSAqIChfX3RvX2VuZCAtIF9fdG8pKQorCQlfX3JldCA9IGNvZGVjdnRfYmFzZTo6bm9jb252OworCSAgICAgIGVsc2UgaWYgKF9fdGxlbiA9PSAwKQorCQlfX3JldCA9IGNvZGVjdnRfYmFzZTo6b2s7CisJICAgICAgZWxzZQorCQlfX3JldCA9IGNvZGVjdnRfYmFzZTo6cGFydGlhbDsKKwkgICAgfQorCSAgZWxzZSAKKwkgICAgX19yZXQgPSBjb2RlY3Z0X2Jhc2U6OmVycm9yOworCX0KKyAgICAgIHJldHVybiBfX3JldDsgCisgICAgfQorICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVD4KKyAgICBjb2RlY3Z0X2Jhc2U6OnJlc3VsdAorICAgIGNvZGVjdnQ8X0ludGVyblQsIF9FeHRlcm5ULCBlbmNvZGluZ19zdGF0ZT46OgorICAgIGRvX2luKHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sIAorCSAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbV9lbmQsIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm9tX25leHQsCisJICBpbnRlcm5fdHlwZSogX190bywgaW50ZXJuX3R5cGUqIF9fdG9fZW5kLCAKKwkgIGludGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdAorICAgIHsgCisgICAgICByZXN1bHQgX19yZXQgPSBjb2RlY3Z0X2Jhc2U6OmVycm9yOworICAgICAgaWYgKF9fc3RhdGUuZ29vZCgpKQorCXsKKwkgIGNvbnN0IGRlc2NyaXB0b3JfdHlwZSYgX19kZXNjID0gX19zdGF0ZS5pbl9kZXNjcmlwdG9yKCk7CisJICBjb25zdCBzaXplX3QgX19mbXVsdGlwbGUgPSBzaXplb2YoZXh0ZXJuX3R5cGUpOworCSAgc2l6ZV90IF9fZmxlbiA9IF9fZm11bHRpcGxlICogKF9fZnJvbV9lbmQgLSBfX2Zyb20pOworCSAgY29uc3Qgc2l6ZV90IF9fdG11bHRpcGxlID0gc2l6ZW9mKGludGVybl90eXBlKTsKKwkgIHNpemVfdCBfX3RsZW4gPSBfX3RtdWx0aXBsZSAqIChfX3RvX2VuZCAtIF9fdG8pOyAKKwkgIAorCSAgLy8gQXJndW1lbnQgbGlzdCBmb3IgaWNvbnYgc3BlY2lmaWVzIGEgYnl0ZSBzZXF1ZW5jZS4gVGh1cywKKwkgIC8vIGFsbCB0by9mcm9tIGFycmF5cyBtdXN0IGJlIGJydXRhbGx5IGNhc3RlZCB0byBjaGFyKi4KKwkgIGNoYXIqIF9fY3RvID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX190byk7CisJICBjaGFyKiBfX2Nmcm9tOworCSAgc2l6ZV90IF9fY29udjsKKworCSAgLy8gU29tZSBlbmNvZGluZ3MgbmVlZCBhIGJ5dGUgb3JkZXIgbWFya2VyIGFzIHRoZSBmaXJzdCBpdGVtCisJICAvLyBpbiB0aGUgYnl0ZSBzdHJlYW0sIHRvIGRlc2lnbmF0ZSBlbmRpYW4tbmVzcy4gVGhlIGRlZmF1bHQKKwkgIC8vIHZhbHVlIGZvciB0aGUgYnl0ZSBvcmRlciBtYXJrZXIgaXMgTlVMTCwgc28gaWYgdGhpcyBpcworCSAgLy8gdGhlIGNhc2UsIGl0J3Mgbm90IG5lY2Vzc2FyeSBhbmQgd2UgY2FuIGp1c3QgZ28gb24gb3VyCisJICAvLyBtZXJyeSB3YXkuCisJICBpbnQgX19leHRfYm9tID0gX19zdGF0ZS5leHRlcm5hbF9ib20oKTsKKwkgIGlmIChfX2V4dF9ib20pCisJICAgIHsJICAKKwkgICAgICBzaXplX3QgX19zaXplID0gX19mcm9tX2VuZCAtIF9fZnJvbTsKKwkgICAgICBleHRlcm5fdHlwZSogX19jZml4ZWQgPSAgc3RhdGljX2Nhc3Q8ZXh0ZXJuX3R5cGUqPgorCQkoX19idWlsdGluX2FsbG9jYShzaXplb2YoZXh0ZXJuX3R5cGUpICogKF9fc2l6ZSArIDEpKSk7CisJICAgICAgX19jZml4ZWRbMF0gPSBzdGF0aWNfY2FzdDxleHRlcm5fdHlwZT4oX19leHRfYm9tKTsKKwkgICAgICBjaGFyX3RyYWl0czxleHRlcm5fdHlwZT46OmNvcHkoX19jZml4ZWQgKyAxLCBfX2Zyb20sIF9fc2l6ZSk7CisJICAgICAgX19jZnJvbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9fY2ZpeGVkKTsKKwkgICAgICBfX2NvbnYgPSBfX2ljb252X2FkYXB0b3IoaWNvbnYsIF9fZGVzYywgJl9fY2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19mbGVuLCAmX19jdG8sICZfX3RsZW4pOyAKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZXh0ZXJuX3R5cGUqIF9fY2ZpeGVkID0gY29uc3RfY2FzdDxleHRlcm5fdHlwZSo+KF9fZnJvbSk7CisJICAgICAgX19jZnJvbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9fY2ZpeGVkKTsKKwkgICAgICBfX2NvbnYgPSBfX2ljb252X2FkYXB0b3IoaWNvbnYsIF9fZGVzYywgJl9fY2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19mbGVuLCAmX19jdG8sICZfX3RsZW4pOyAKKwkgICAgfQorCisJICAKKwkgIGlmIChfX2NvbnYgIT0gc2l6ZV90KC0xKSkKKwkgICAgeworCSAgICAgIF9fZnJvbV9uZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBleHRlcm5fdHlwZSo+KF9fY2Zyb20pOworCSAgICAgIF9fdG9fbmV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50ZXJuX3R5cGUqPihfX2N0byk7CisJICAgICAgX19yZXQgPSBjb2RlY3Z0X2Jhc2U6Om9rOworCSAgICB9CisJICBlbHNlIAorCSAgICB7CisJICAgICAgaWYgKF9fZmxlbiA8IHN0YXRpY19jYXN0PHNpemVfdD4oX19mcm9tX2VuZCAtIF9fZnJvbSkpCisJCXsKKwkJICBfX2Zyb21fbmV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZXh0ZXJuX3R5cGUqPihfX2Nmcm9tKTsKKwkJICBfX3RvX25leHQgPSByZWludGVycHJldF9jYXN0PGludGVybl90eXBlKj4oX19jdG8pOworCQkgIF9fcmV0ID0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsOworCQl9CisJICAgICAgZWxzZQorCQlfX3JldCA9IGNvZGVjdnRfYmFzZTo6ZXJyb3I7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7IAorICAgIH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVD4KKyAgICBpbnQgCisgICAgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPjo6CisgICAgZG9fZW5jb2RpbmcoKSBjb25zdCB0aHJvdygpCisgICAgeworICAgICAgaW50IF9fcmV0ID0gMDsKKyAgICAgIGlmIChzaXplb2YoX0V4dGVyblQpIDw9IHNpemVvZihfSW50ZXJuVCkpCisJX19yZXQgPSBzaXplb2YoX0ludGVyblQpIC8gc2l6ZW9mKF9FeHRlcm5UKTsKKyAgICAgIHJldHVybiBfX3JldDsgCisgICAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5UPgorICAgIGJvb2wgCisgICAgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPjo6CisgICAgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCkKKyAgICB7IHJldHVybiBmYWxzZTsgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5UPgorICAgIGludCAKKyAgICBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgZW5jb2Rpbmdfc3RhdGU+OjoKKyAgICBkb19sZW5ndGgoc3RhdGVfdHlwZSYsIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sIAorCSAgICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwgc2l6ZV90IF9fbWF4KSBjb25zdAorICAgIHsgcmV0dXJuIHN0ZDo6bWluKF9fbWF4LCBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fZW5kIC0gX19mcm9tKSk7IH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIDc0LiAgR2FyYmxlZCB0ZXh0IGZvciBjb2RlY3Z0Ojpkb19tYXhfbGVuZ3RoCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVD4KKyAgICBpbnQgCisgICAgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPjo6CisgICAgZG9fbWF4X2xlbmd0aCgpIGNvbnN0IHRocm93KCkKKyAgICB7IHJldHVybiAxOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9jb25jdXJyZW5jZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvY29uY3VycmVuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGI5NTg5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvY29uY3VycmVuY2UuaApAQCAtMCwwICsxLDMxOCBAQAorLy8gU3VwcG9ydCBmb3IgY29uY3VycmVudCBwcm9ncmFtaW5nIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvY29uY3VycmVuY2UuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0NPTkNVUlJFTkNFX0gKKyNkZWZpbmUgX0NPTkNVUlJFTkNFX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxleGNlcHRpb24+CisjaW5jbHVkZSA8Yml0cy9ndGhyLmg+IAorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gQXZhaWxhYmxlIGxvY2tpbmcgcG9saWNpZXM6CisgIC8vIF9TX3NpbmdsZSAgICBzaW5nbGUtdGhyZWFkZWQgY29kZSB0aGF0IGRvZXNuJ3QgbmVlZCB0byBiZSBsb2NrZWQuCisgIC8vIF9TX211dGV4ICAgICBtdWx0aS10aHJlYWRlZCBjb2RlIHRoYXQgcmVxdWlyZXMgYWRkaXRpb25hbCBzdXBwb3J0CisgIC8vICAgICAgICAgICAgICBmcm9tIGd0aHIuaCBvciBhYnN0cmFjdGlvbiBsYXllcnMgaW4gY29uY3VycmVuY2UuaC4KKyAgLy8gX1NfYXRvbWljICAgIG11bHRpLXRocmVhZGVkIGNvZGUgdXNpbmcgYXRvbWljIG9wZXJhdGlvbnMuCisgIGVudW0gX0xvY2tfcG9saWN5IHsgX1Nfc2luZ2xlLCBfU19tdXRleCwgX1NfYXRvbWljIH07IAorCisgIC8vIENvbXBpbGUgdGltZSBjb25zdGFudCB0aGF0IGluZGljYXRlcyBwcmVmZXJlZCBsb2NraW5nIHBvbGljeSBpbgorICAvLyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorICBzdGF0aWMgY29uc3QgX0xvY2tfcG9saWN5IF9fZGVmYXVsdF9sb2NrX3BvbGljeSA9IAorI2lmZGVmIF9fR1RIUkVBRFMKKyNpZiAoZGVmaW5lZChfX0dDQ19IQVZFX1NZTkNfQ09NUEFSRV9BTkRfU1dBUF8yKSBcCisgICAgICYmIGRlZmluZWQoX19HQ0NfSEFWRV9TWU5DX0NPTVBBUkVfQU5EX1NXQVBfNCkpCisgIF9TX2F0b21pYzsKKyNlbHNlCisgIF9TX211dGV4OworI2VuZGlmCisjZWxzZQorICBfU19zaW5nbGU7CisjZW5kaWYKKworICAvLyBOQjogQXMgdGhpcyBpcyB1c2VkIGluIGxpYnN1cGMrKywgbmVlZCB0byBvbmx5IGRlcGVuZCBvbgorICAvLyBleGNlcHRpb24uIE5vIHN0ZGV4Y2VwdGlvbiBjbGFzc2VzLCBubyB1c2Ugb2Ygc3RkOjpzdHJpbmcuCisgIGNsYXNzIF9fY29uY3VycmVuY2VfbG9ja19lcnJvciA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgorICB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGNoYXIgY29uc3QqCisgICAgd2hhdCgpIGNvbnN0IHRocm93KCkKKyAgICB7IHJldHVybiAiX19nbnVfY3h4OjpfX2NvbmN1cnJlbmNlX2xvY2tfZXJyb3IiOyB9CisgIH07CisKKyAgY2xhc3MgX19jb25jdXJyZW5jZV91bmxvY2tfZXJyb3IgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KKyAgeworICBwdWJsaWM6CisgICAgdmlydHVhbCBjaGFyIGNvbnN0KgorICAgIHdoYXQoKSBjb25zdCB0aHJvdygpCisgICAgeyByZXR1cm4gIl9fZ251X2N4eDo6X19jb25jdXJyZW5jZV91bmxvY2tfZXJyb3IiOyB9CisgIH07CisKKyAgY2xhc3MgX19jb25jdXJyZW5jZV9icm9hZGNhc3RfZXJyb3IgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KKyAgeworICBwdWJsaWM6CisgICAgdmlydHVhbCBjaGFyIGNvbnN0KgorICAgIHdoYXQoKSBjb25zdCB0aHJvdygpCisgICAgeyByZXR1cm4gIl9fZ251X2N4eDo6X19jb25jdXJyZW5jZV9icm9hZGNhc3RfZXJyb3IiOyB9CisgIH07CisKKyAgY2xhc3MgX19jb25jdXJyZW5jZV93YWl0X2Vycm9yIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCisgIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgY2hhciBjb25zdCoKKyAgICB3aGF0KCkgY29uc3QgdGhyb3coKQorICAgIHsgcmV0dXJuICJfX2dudV9jeHg6Ol9fY29uY3VycmVuY2Vfd2FpdF9lcnJvciI7IH0KKyAgfTsKKworICAvLyBTdWJzdGl0dXRlIGZvciBjb25jdXJyZW5jZV9lcnJvciBvYmplY3QgaW4gdGhlIGNhc2Ugb2YgLWZuby1leGNlcHRpb25zLgorICBpbmxpbmUgdm9pZAorICBfX3Rocm93X2NvbmN1cnJlbmNlX2xvY2tfZXJyb3IoKQorICB7IF9HTElCQ1hYX1RIUk9XX09SX0FCT1JUKF9fY29uY3VycmVuY2VfbG9ja19lcnJvcigpKTsgfQorCisgIGlubGluZSB2b2lkCisgIF9fdGhyb3dfY29uY3VycmVuY2VfdW5sb2NrX2Vycm9yKCkKKyAgeyBfR0xJQkNYWF9USFJPV19PUl9BQk9SVChfX2NvbmN1cnJlbmNlX3VubG9ja19lcnJvcigpKTsgfQorCisjaWZkZWYgX19HVEhSRUFEX0hBU19DT05ECisgIGlubGluZSB2b2lkCisgIF9fdGhyb3dfY29uY3VycmVuY2VfYnJvYWRjYXN0X2Vycm9yKCkKKyAgeyBfR0xJQkNYWF9USFJPV19PUl9BQk9SVChfX2NvbmN1cnJlbmNlX2Jyb2FkY2FzdF9lcnJvcigpKTsgfQorCisgIGlubGluZSB2b2lkCisgIF9fdGhyb3dfY29uY3VycmVuY2Vfd2FpdF9lcnJvcigpCisgIHsgX0dMSUJDWFhfVEhST1dfT1JfQUJPUlQoX19jb25jdXJyZW5jZV93YWl0X2Vycm9yKCkpOyB9CisjZW5kaWYKKyAKKyAgY2xhc3MgX19tdXRleCAKKyAgeworICBwcml2YXRlOgorI2lmIF9fR1RIUkVBRFMgJiYgZGVmaW5lZCBfX0dUSFJFQURfTVVURVhfSU5JVAorICAgIF9fZ3RocmVhZF9tdXRleF90IF9NX211dGV4ID0gX19HVEhSRUFEX01VVEVYX0lOSVQ7CisjZWxzZQorICAgIF9fZ3RocmVhZF9tdXRleF90IF9NX211dGV4OworI2VuZGlmCisKKyAgICBfX211dGV4KGNvbnN0IF9fbXV0ZXgmKTsKKyAgICBfX211dGV4JiBvcGVyYXRvcj0oY29uc3QgX19tdXRleCYpOworCisgIHB1YmxpYzoKKyAgICBfX211dGV4KCkgCisgICAgeyAKKyNpZiBfX0dUSFJFQURTICYmICEgZGVmaW5lZCBfX0dUSFJFQURfTVVURVhfSU5JVAorICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCV9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OKCZfTV9tdXRleCk7CisjZW5kaWYKKyAgICB9CisKKyNpZiBfX0dUSFJFQURTICYmICEgZGVmaW5lZCBfX0dUSFJFQURfTVVURVhfSU5JVAorICAgIH5fX211dGV4KCkgCisgICAgeyAKKyAgICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKwlfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSgmX01fbXV0ZXgpOyAKKyAgICB9CisjZW5kaWYgCisKKyAgICB2b2lkIGxvY2soKQorICAgIHsKKyNpZiBfX0dUSFJFQURTCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJeworCSAgaWYgKF9fZ3RocmVhZF9tdXRleF9sb2NrKCZfTV9tdXRleCkgIT0gMCkKKwkgICAgX190aHJvd19jb25jdXJyZW5jZV9sb2NrX2Vycm9yKCk7CisJfQorI2VuZGlmCisgICAgfQorICAgIAorICAgIHZvaWQgdW5sb2NrKCkKKyAgICB7CisjaWYgX19HVEhSRUFEUworICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCXsKKwkgIGlmIChfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfTV9tdXRleCkgIT0gMCkKKwkgICAgX190aHJvd19jb25jdXJyZW5jZV91bmxvY2tfZXJyb3IoKTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyAgICBfX2d0aHJlYWRfbXV0ZXhfdCogZ3RocmVhZF9tdXRleCh2b2lkKQorICAgICAgeyByZXR1cm4gJl9NX211dGV4OyB9CisgIH07CisKKyAgY2xhc3MgX19yZWN1cnNpdmVfbXV0ZXggCisgIHsKKyAgcHJpdmF0ZToKKyNpZiBfX0dUSFJFQURTICYmIGRlZmluZWQgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUCisgICAgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90IF9NX211dGV4ID0gX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUOworI2Vsc2UKKyAgICBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgX01fbXV0ZXg7CisjZW5kaWYKKworICAgIF9fcmVjdXJzaXZlX211dGV4KGNvbnN0IF9fcmVjdXJzaXZlX211dGV4Jik7CisgICAgX19yZWN1cnNpdmVfbXV0ZXgmIG9wZXJhdG9yPShjb25zdCBfX3JlY3Vyc2l2ZV9tdXRleCYpOworCisgIHB1YmxpYzoKKyAgICBfX3JlY3Vyc2l2ZV9tdXRleCgpIAorICAgIHsgCisjaWYgX19HVEhSRUFEUyAmJiAhIGRlZmluZWQgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OKCZfTV9tdXRleCk7CisjZW5kaWYKKyAgICB9CisKKyNpZiBfX0dUSFJFQURTICYmICEgZGVmaW5lZCBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQKKyAgICB+X19yZWN1cnNpdmVfbXV0ZXgoKQorICAgIHsKKyAgICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKwlfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2Rlc3Ryb3koJl9NX211dGV4KTsKKyAgICB9CisjZW5kaWYKKworICAgIHZvaWQgbG9jaygpCisgICAgeyAKKyNpZiBfX0dUSFJFQURTCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJeworCSAgaWYgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfbG9jaygmX01fbXV0ZXgpICE9IDApCisJICAgIF9fdGhyb3dfY29uY3VycmVuY2VfbG9ja19lcnJvcigpOworCX0KKyNlbmRpZgorICAgIH0KKyAgICAKKyAgICB2b2lkIHVubG9jaygpCisgICAgeyAKKyNpZiBfX0dUSFJFQURTCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJeworCSAgaWYgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrKCZfTV9tdXRleCkgIT0gMCkKKwkgICAgX190aHJvd19jb25jdXJyZW5jZV91bmxvY2tfZXJyb3IoKTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyAgICBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QqIGd0aHJlYWRfcmVjdXJzaXZlX211dGV4KHZvaWQpCisgICAgeyByZXR1cm4gJl9NX211dGV4OyB9CisgIH07CisKKyAgLy8vIFNjb3BlZCBsb2NrIGlkaW9tLgorICAvLyBBY3F1aXJlIHRoZSBtdXRleCBoZXJlIHdpdGggYSBjb25zdHJ1Y3RvciBjYWxsLCB0aGVuIHJlbGVhc2Ugd2l0aAorICAvLyB0aGUgZGVzdHJ1Y3RvciBjYWxsIGluIGFjY29yZGFuY2Ugd2l0aCBSQUlJIHN0eWxlLgorICBjbGFzcyBfX3Njb3BlZF9sb2NrCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX19tdXRleCBfX211dGV4X3R5cGU7CisKKyAgcHJpdmF0ZToKKyAgICBfX211dGV4X3R5cGUmIF9NX2RldmljZTsKKworICAgIF9fc2NvcGVkX2xvY2soY29uc3QgX19zY29wZWRfbG9jayYpOworICAgIF9fc2NvcGVkX2xvY2smIG9wZXJhdG9yPShjb25zdCBfX3Njb3BlZF9sb2NrJik7CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IF9fc2NvcGVkX2xvY2soX19tdXRleF90eXBlJiBfX25hbWUpIDogX01fZGV2aWNlKF9fbmFtZSkKKyAgICB7IF9NX2RldmljZS5sb2NrKCk7IH0KKworICAgIH5fX3Njb3BlZF9sb2NrKCkgdGhyb3coKQorICAgIHsgX01fZGV2aWNlLnVubG9jaygpOyB9CisgIH07CisKKyNpZmRlZiBfX0dUSFJFQURfSEFTX0NPTkQKKyAgY2xhc3MgX19jb25kCisgIHsKKyAgcHJpdmF0ZToKKyNpZiBfX0dUSFJFQURTICYmIGRlZmluZWQgX19HVEhSRUFEX0NPTkRfSU5JVAorICAgIF9fZ3RocmVhZF9jb25kX3QgX01fY29uZCA9IF9fR1RIUkVBRF9DT05EX0lOSVQ7CisjZWxzZQorICAgIF9fZ3RocmVhZF9jb25kX3QgX01fY29uZDsKKyNlbmRpZgorCisgICAgX19jb25kKGNvbnN0IF9fY29uZCYpOworICAgIF9fY29uZCYgb3BlcmF0b3I9KGNvbnN0IF9fY29uZCYpOworCisgIHB1YmxpYzoKKyAgICBfX2NvbmQoKSAKKyAgICB7IAorI2lmIF9fR1RIUkVBRFMgJiYgISBkZWZpbmVkIF9fR1RIUkVBRF9DT05EX0lOSVQKKyAgICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKwlfX0dUSFJFQURfQ09ORF9JTklUX0ZVTkNUSU9OKCZfTV9jb25kKTsKKyNlbmRpZgorICAgIH0KKworI2lmIF9fR1RIUkVBRFMgJiYgISBkZWZpbmVkIF9fR1RIUkVBRF9DT05EX0lOSVQKKyAgICB+X19jb25kKCkgCisgICAgeyAKKyAgICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKwlfX2d0aHJlYWRfY29uZF9kZXN0cm95KCZfTV9jb25kKTsgCisgICAgfQorI2VuZGlmIAorCisgICAgdm9pZCBicm9hZGNhc3QoKQorICAgIHsKKyNpZiBfX0dUSFJFQURTCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJeworCSAgaWYgKF9fZ3RocmVhZF9jb25kX2Jyb2FkY2FzdCgmX01fY29uZCkgIT0gMCkKKwkgICAgX190aHJvd19jb25jdXJyZW5jZV9icm9hZGNhc3RfZXJyb3IoKTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyAgICB2b2lkIHdhaXQoX19tdXRleCAqbXV0ZXgpCisgICAgeworI2lmIF9fR1RIUkVBRFMKKyAgICAgIHsKKwkgIGlmIChfX2d0aHJlYWRfY29uZF93YWl0KCZfTV9jb25kLCBtdXRleC0+Z3RocmVhZF9tdXRleCgpKSAhPSAwKQorCSAgICBfX3Rocm93X2NvbmN1cnJlbmNlX3dhaXRfZXJyb3IoKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHZvaWQgd2FpdF9yZWN1cnNpdmUoX19yZWN1cnNpdmVfbXV0ZXggKm11dGV4KQorICAgIHsKKyNpZiBfX0dUSFJFQURTCisgICAgICB7CisJICBpZiAoX19ndGhyZWFkX2NvbmRfd2FpdF9yZWN1cnNpdmUoJl9NX2NvbmQsCisJCQkJCSAgICBtdXRleC0+Z3RocmVhZF9yZWN1cnNpdmVfbXV0ZXgoKSkKKwkgICAgICAhPSAwKQorCSAgICBfX3Rocm93X2NvbmN1cnJlbmNlX3dhaXRfZXJyb3IoKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgfTsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvZGVidWdfYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9kZWJ1Z19hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTkwZDJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvZGVidWdfYWxsb2NhdG9yLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8vIEFsbG9jYXRvcnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgZXh0L2RlYnVnX2FsbG9jYXRvci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfREVCVUdfQUxMT0NBVE9SX0gKKyNkZWZpbmUgX0RFQlVHX0FMTE9DQVRPUl9IIDEKKworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6c2l6ZV90OworCisgIC8qKgorICAgKiAgQGJyaWVmICBBIG1ldGEtYWxsb2NhdG9yIHdpdGggZGVidWdnaW5nIGJpdHMsIGFzIHBlciBbMjAuNF0uCisgICAqICBAaW5ncm91cCBhbGxvY2F0b3JzCisgICAqCisgICAqICBUaGlzIGlzIHByZWNpc2VseSB0aGUgYWxsb2NhdG9yIGRlZmluZWQgaW4gdGhlIEMrKyBTdGFuZGFyZC4gCisgICAqICAgIC0gYWxsIGFsbG9jYXRpb24gY2FsbHMgb3BlcmF0b3IgbmV3CisgICAqICAgIC0gYWxsIGRlYWxsb2NhdGlvbiBjYWxscyBvcGVyYXRvciBkZWxldGUKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBkZWJ1Z19hbGxvY2F0b3IKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAgICAgICAJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cG9pbnRlciAgICAgICAJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpjb25zdF9wb2ludGVyICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cmVmZXJlbmNlICAgICAgIAlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcmVmZXJlbmNlICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSAgICAgICB2YWx1ZV90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIF9NX2V4dHJhIGlzIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlCisgICAgICAvLyBleHRyYSBzcGFjZSB3aGVyZSBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQuCisgICAgICBzaXplX3R5cGUgCQlfTV9leHRyYTsKKyAgICAgIAorICAgICAgX0FsbG9jCQkJX01fYWxsb2NhdG9yOworCisgICAgcHVibGljOgorICAgICAgZGVidWdfYWxsb2NhdG9yKCkKKyAgICAgIHsKKwljb25zdCBzaXplX3QgX19vYmpfc2l6ZSA9IHNpemVvZih2YWx1ZV90eXBlKTsKKwlfTV9leHRyYSA9IChzaXplb2Yoc2l6ZV90eXBlKSArIF9fb2JqX3NpemUgLSAxKSAvIF9fb2JqX3NpemU7IAorICAgICAgfQorICAgICAgCisgICAgICBwb2ludGVyCisgICAgICBhbGxvY2F0ZShzaXplX3R5cGUgX19uKQorICAgICAgeworICAgICAgICBwb2ludGVyIF9fcmVzID0gX01fYWxsb2NhdG9yLmFsbG9jYXRlKF9fbiArIF9NX2V4dHJhKTsgICAgICAKKwlzaXplX3R5cGUqIF9fcHMgPSByZWludGVycHJldF9jYXN0PHNpemVfdHlwZSo+KF9fcmVzKTsKKwkqX19wcyA9IF9fbjsKKyAgICAgICAgcmV0dXJuIF9fcmVzICsgX01fZXh0cmE7CisgICAgICB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqIF9faGludCkKKyAgICAgIHsKKyAgICAgICAgcG9pbnRlciBfX3JlcyA9IF9NX2FsbG9jYXRvci5hbGxvY2F0ZShfX24gKyBfTV9leHRyYSwgX19oaW50KTsKKwlzaXplX3R5cGUqIF9fcHMgPSByZWludGVycHJldF9jYXN0PHNpemVfdHlwZSo+KF9fcmVzKTsKKwkqX19wcyA9IF9fbjsKKyAgICAgICAgcmV0dXJuIF9fcmVzICsgX01fZXh0cmE7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fcCkKKwkgIHsKKwkgICAgcG9pbnRlciBfX3JlYWxfcCA9IF9fcCAtIF9NX2V4dHJhOworCSAgICBpZiAoKnJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90eXBlKj4oX19yZWFsX3ApICE9IF9fbikKKwkgICAgICB7CisJCXRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiZGVidWdfYWxsb2NhdG9yOjpkZWFsbG9jYXRlIgorCQkJCQkgIiB3cm9uZyBzaXplIik7CisJICAgICAgfQorCSAgICBfTV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShfX3JlYWxfcCwgX19uICsgX01fZXh0cmEpOworCSAgfQorCWVsc2UKKwkgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiZGVidWdfYWxsb2NhdG9yOjpkZWFsbG9jYXRlIG51bGwgcG9pbnRlciIpOworICAgICAgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9lbmNfZmlsZWJ1Zi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvZW5jX2ZpbGVidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTFjZGRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvZW5jX2ZpbGVidWYuaApAQCAtMCwwICsxLDY1IEBACisvLyBmaWxlYnVmIHdpdGggZW5jb2Rpbmcgc3RhdGUgdHlwZSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L2VuY19maWxlYnVmLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9FWFRfRU5DX0ZJTEVCVUZfSAorI2RlZmluZSBfRVhUX0VOQ19GSUxFQlVGX0ggMQorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8ZXh0L2NvZGVjdnRfc3BlY2lhbGl6YXRpb25zLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLy8gY2xhc3MgZW5jX2ZpbGVidWYuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBlbmNfZmlsZWJ1ZgorICAgIDogcHVibGljIHN0ZDo6YmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIGVuY29kaW5nX2NoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIGVuY29kaW5nX2NoYXJfdHJhaXRzPF9DaGFyVD4gICAgIAl0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnN0YXRlX3R5cGUJc3RhdGVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlCXBvc190eXBlOworCisgICAgICBlbmNfZmlsZWJ1ZihzdGF0ZV90eXBlJiBfX3N0YXRlKQorICAgICAgOiBzdGQ6OmJhc2ljX2ZpbGVidWY8X0NoYXJULCBlbmNvZGluZ19jaGFyX3RyYWl0czxfQ2hhclQ+ID4oKQorICAgICAgeyB0aGlzLT5fTV9zdGF0ZV9iZWcgPSBfX3N0YXRlOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHM6CisgICAgICAvLyBTZXQgc3RhdGUgdHlwZSB0byBzb21ldGhpbmcgdXNlZnVsLgorICAgICAgLy8gU29tZXRoaW5nIG1vcmUgdGhhbiBjb3B5Y29uc3RydWN0aWJsZSBpcyBuZWVkZWQgaGVyZSwgc28KKyAgICAgIC8vIHJlcXVpcmUgZGVmYXVsdCBhbmQgY29weSBjb25zdHJ1Y3RpYmxlICsgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhzdGF0ZV90eXBlLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2V4dHB0cl9hbGxvY2F0b3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2V4dHB0cl9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjM4MjM1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvZXh0cHRyX2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsMTk3IEBACisvLyA8ZXh0cHRyX2FsbG9jYXRvci5oPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqICBAZmlsZSBleHQvZXh0cHRyX2FsbG9jYXRvci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKgorICogIEBhdXRob3IgQm9iIFdhbHRlcnMKKyAqCisgKiBBbiBleGFtcGxlIGFsbG9jYXRvciB3aGljaCB1c2VzIGFuIGFsdGVybmF0aXZlIHBvaW50ZXIgdHlwZSBmcm9tCisgKiBiaXRzL3BvaW50ZXIuaC4gIFN1cHBvcnRzIHRlc3QgY2FzZXMgd2hpY2ggY29uZmlybSBjb250YWluZXIgc3VwcG9ydAorICogZm9yIGFsdGVybmF0aXZlIHBvaW50ZXJzLgorICovCisKKyNpZm5kZWYgX0VYVFBUUl9BTExPQ0FUT1JfSAorI2RlZmluZSBfRVhUUFRSX0FMTE9DQVRPUl9IIDEKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxleHQvbnVtZXJpY190cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvcG9pbnRlci5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBicmllZiBBbiBleGFtcGxlIGFsbG9jYXRvciB3aGljaCB1c2VzIGEgbm9uLXN0YW5kYXJkIHBvaW50ZXIgdHlwZS4KKyAgICogQGluZ3JvdXAgYWxsb2NhdG9ycworICAgKgorICAgKiBUaGlzIGFsbG9jYXRvciBzcGVjaWZpZXMgdGhhdCBjb250YWluZXJzIHVzZSBhICdyZWxhdGl2ZSBwb2ludGVyJyBhcyBpdCdzCisgICAqIHBvaW50ZXIgdHlwZS4gIChTZWUgZXh0L3BvaW50ZXIuaCkgIE1lbW9yeSBhbGxvY2F0aW9uIGluIHRoaXMgZXhhbXBsZQorICAgKiBpcyBzdGlsbCBwZXJmb3JtZWQgdXNpbmcgc3RkOjphbGxvY2F0b3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX0V4dFB0cl9hbGxvY2F0b3IKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICAvLyBOb3RlIHRoZSBub24tc3RhbmRhcmQgcG9pbnRlciB0eXBlcy4KKyAgICAgIHR5cGVkZWYgX1BvaW50ZXJfYWRhcHRlcjxfUmVsYXRpdmVfcG9pbnRlcl9pbXBsPF9UcD4gPiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBfUG9pbnRlcl9hZGFwdGVyPF9SZWxhdGl2ZV9wb2ludGVyX2ltcGw8Y29uc3QgX1RwPiA+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgX1RwJiAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgc3RydWN0IHJlYmluZAorICAgICAgICB7IHR5cGVkZWYgX0V4dFB0cl9hbGxvY2F0b3I8X1VwPiBvdGhlcjsgfTsKKworICAgICAgX0V4dFB0cl9hbGxvY2F0b3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgCisgICAgICA6IF9NX3JlYWxfYWxsb2MoKSB7IH0KKworICAgICAgX0V4dFB0cl9hbGxvY2F0b3IoY29uc3QgX0V4dFB0cl9hbGxvY2F0b3ImIF9fcmFyZykgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICA6IF9NX3JlYWxfYWxsb2MoX19yYXJnLl9NX3JlYWxfYWxsb2MpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIF9FeHRQdHJfYWxsb2NhdG9yKGNvbnN0IF9FeHRQdHJfYWxsb2NhdG9yPF9VcD4mIF9fcmFyZykKKwlfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgICAgOiBfTV9yZWFsX2FsbG9jKF9fcmFyZy5fTV9nZXRVbmRlcmx5aW5nSW1wKCkpIHsgfQorCisgICAgICB+X0V4dFB0cl9hbGxvY2F0b3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgfQorCisgICAgICBwb2ludGVyIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX194KTsgfQorCisgICAgICBjb25zdF9wb2ludGVyIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX194KTsgfQorCisgICAgICBwb2ludGVyIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIHZvaWQqIF9faGludCA9IDApCisgICAgICB7IHJldHVybiBfTV9yZWFsX2FsbG9jLmFsbG9jYXRlKF9fbixfX2hpbnQpOyB9CisKKyAgICAgIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgX01fcmVhbF9hbGxvYy5kZWFsbG9jYXRlKF9fcC5nZXQoKSwgX19uKTsgfQorCisgICAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9fbnVtZXJpY190cmFpdHM8c2l6ZV90eXBlPjo6X19tYXggLyBzaXplb2YoX1RwKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QoX1VwKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsgOjpuZXcoKHZvaWQgKilfX3ApIF9VcChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyBjb25zdHJ1Y3QoX19wLmdldCgpLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgdm9pZCAKKyAgICAgICAgZGVzdHJveShfVXAqIF9fcCkKKyAgICAgICAgeyBfX3AtPn5fVXAoKTsgfQorCisgICAgICB2b2lkIGRlc3Ryb3kocG9pbnRlciBfX3ApCisgICAgICB7IGRlc3Ryb3koX19wLmdldCgpKTsgfQorCisjZWxzZQorCisgICAgICB2b2lkIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICAgIHsgOjpuZXcoX19wLmdldCgpKSBfVHAoX192YWwpOyB9CisKKyAgICAgIHZvaWQgZGVzdHJveShwb2ludGVyIF9fcCkKKyAgICAgIHsgX19wLT5+X1RwKCk7IH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIGlubGluZSBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgX0V4dFB0cl9hbGxvY2F0b3I8X1VwPiYgX19yYXJnKQorICAgICAgICB7IHJldHVybiBfTV9yZWFsX2FsbG9jID09IF9fcmFyZy5fTV9nZXRVbmRlcmx5aW5nSW1wKCk7IH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX0V4dFB0cl9hbGxvY2F0b3ImIF9fcmFyZykKKyAgICAgIHsgcmV0dXJuIF9NX3JlYWxfYWxsb2MgPT0gX19yYXJnLl9NX3JlYWxfYWxsb2M7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBpbmxpbmUgYm9vbAorICAgICAgICBvcGVyYXRvciE9KGNvbnN0IF9FeHRQdHJfYWxsb2NhdG9yPF9VcD4mIF9fcmFyZykKKyAgICAgICAgeyByZXR1cm4gX01fcmVhbF9hbGxvYyAhPSBfX3JhcmcuX01fZ2V0VW5kZXJseWluZ0ltcCgpOyB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IF9FeHRQdHJfYWxsb2NhdG9yJiBfX3JhcmcpCisgICAgICB7IHJldHVybiBfTV9yZWFsX2FsbG9jICE9IF9fcmFyZy5fTV9yZWFsX2FsbG9jOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgaW5saW5lIGZyaWVuZCB2b2lkCisgICAgICAgIHN3YXAoX0V4dFB0cl9hbGxvY2F0b3I8X1VwPiYsIF9FeHRQdHJfYWxsb2NhdG9yPF9VcD4mKTsKKworICAgICAgLy8gQSBtZXRob2Qgc3BlY2lmaWMgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgIGNvbnN0IHN0ZDo6YWxsb2NhdG9yPF9UcD4mCisgICAgICBfTV9nZXRVbmRlcmx5aW5nSW1wKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3JlYWxfYWxsb2M7IH0KKworICAgIHByaXZhdGU6CisgICAgICBzdGQ6OmFsbG9jYXRvcjxfVHA+ICBfTV9yZWFsX2FsbG9jOworICAgIH07CisKKyAgLy8gX0V4dFB0cl9hbGxvY2F0b3I8dm9pZD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBfRXh0UHRyX2FsbG9jYXRvcjx2b2lkPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90ICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICB2YWx1ZV90eXBlOworCisgICAgICAvLyBOb3RlIHRoZSBub24tc3RhbmRhcmQgcG9pbnRlciB0eXBlcworICAgICAgdHlwZWRlZiBfUG9pbnRlcl9hZGFwdGVyPF9SZWxhdGl2ZV9wb2ludGVyX2ltcGw8dm9pZD4gPiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBfUG9pbnRlcl9hZGFwdGVyPF9SZWxhdGl2ZV9wb2ludGVyX2ltcGw8Y29uc3Qgdm9pZD4gPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKyAgICAgICAgeyB0eXBlZGVmIF9FeHRQdHJfYWxsb2NhdG9yPF9VcD4gb3RoZXI7IH07CisKKyAgICBwcml2YXRlOgorICAgICAgc3RkOjphbGxvY2F0b3I8dm9pZD4gIF9NX3JlYWxfYWxsb2M7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9FeHRQdHJfYWxsb2NhdG9yPF9UcD4mIF9fbGFyZywgX0V4dFB0cl9hbGxvY2F0b3I8X1RwPiYgX19yYXJnKQorICAgIHsKKyAgICAgIHN0ZDo6YWxsb2NhdG9yPF9UcD4gX190bXAoIF9fcmFyZy5fTV9yZWFsX2FsbG9jICk7CisgICAgICBfX3JhcmcuX01fcmVhbF9hbGxvYyA9IF9fbGFyZy5fTV9yZWFsX2FsbG9jOworICAgICAgX19sYXJnLl9NX3JlYWxfYWxsb2MgPSBfX3RtcDsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9FWFRQVFJfQUxMT0NBVE9SX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2Z1bmN0aW9uYWwgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9mdW5jdGlvbmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YzgwMzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9mdW5jdGlvbmFsCkBAIC0wLDAgKzEsNDMwIEBACisvLyBGdW5jdGlvbmFsIGV4dGVuc2lvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBleHQvZnVuY3Rpb25hbAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IChwb3NzaWJseQorICogIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBIUC9TR0kgU1RMIHN1YnNldCkuCisgKi8KKworI2lmbmRlZiBfRVhUX0ZVTkNUSU9OQUwKKyNkZWZpbmUgX0VYVF9GVU5DVElPTkFMIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6c2l6ZV90OworICB1c2luZyBzdGQ6OnVuYXJ5X2Z1bmN0aW9uOworICB1c2luZyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjsKKyAgdXNpbmcgc3RkOjptZW1fZnVuMV90OworICB1c2luZyBzdGQ6OmNvbnN0X21lbV9mdW4xX3Q7CisgIHVzaW5nIHN0ZDo6bWVtX2Z1bjFfcmVmX3Q7CisgIHVzaW5nIHN0ZDo6Y29uc3RfbWVtX2Z1bjFfcmVmX3Q7CisKKyAgLyoqIFRoZSBAYyBpZGVudGl0eV9lbGVtZW50IGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgdGhlIEMrKworICAgKiAgc3RhbmRhcmQ7IFNHSSBwcm92aWRlZCB0aGVtIGFzIGFuIGV4dGVuc2lvbi4gIEl0cyBhcmd1bWVudCBpcyBhbgorICAgKiAgb3BlcmF0aW9uLCBhbmQgaXRzIHJldHVybiB2YWx1ZSBpcyB0aGUgaWRlbnRpdHkgZWxlbWVudCBmb3IgdGhhdAorICAgKiAgb3BlcmF0aW9uLiAgSXQgaXMgb3ZlcmxvYWRlZCBmb3IgYWRkaXRpb24gYW5kIG11bHRpcGxpY2F0aW9uLAorICAgKiAgYW5kIHlvdSBjYW4gb3ZlcmxvYWQgaXQgZm9yIHlvdXIgb3duIG5lZmFyaW91cyBvcGVyYXRpb25zLgorICAgKgorICAgKiAgQGFkZHRvZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQHsKKyAgICovCisgIC8vLyBBbiBcbGluayBTR0lleHRlbnNpb25zIFNHSSBleHRlbnNpb24gXGVuZGxpbmsuCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIGlkZW50aXR5X2VsZW1lbnQoc3RkOjpwbHVzPF9UcD4pCisgICAgeyByZXR1cm4gX1RwKDApOyB9CisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgaWRlbnRpdHlfZWxlbWVudChzdGQ6Om11bHRpcGxpZXM8X1RwPikKKyAgICB7IHJldHVybiBfVHAoMSk7IH0KKyAgLyoqIEB9ICAqLworICAKKyAgLyoqIEFzIGFuIGV4dGVuc2lvbiB0byB0aGUgYmluZGVycywgU0dJIHByb3ZpZGVkIGNvbXBvc2l0aW9uIGZ1bmN0b3JzIGFuZAorICAgKiAgd3JhcHBlciBmdW5jdGlvbnMgdG8gYWlkIGluIHRoZWlyIGNyZWF0aW9uLiAgVGhlIEBjIHVuYXJ5X2NvbXBvc2UKKyAgICogIGZ1bmN0b3IgaXMgY29uc3RydWN0ZWQgZnJvbSB0d28gZnVuY3Rpb25zL2Z1bmN0b3JzLCBAYyBmIGFuZCBAYyBnLgorICAgKiAgQ2FsbGluZyBAYyBvcGVyYXRvcigpIHdpdGggYSBzaW5nbGUgYXJndW1lbnQgQGMgeCByZXR1cm5zIEBjIGYoZyh4KSkuCisgICAqICBUaGUgZnVuY3Rpb24gQGMgY29tcG9zZTEgdGFrZXMgdGhlIHR3byBmdW5jdGlvbnMgYW5kIGNvbnN0cnVjdHMgYQorICAgKiAgQGMgdW5hcnlfY29tcG9zZSB2YXJpYWJsZSBmb3IgeW91LgorICAgKgorICAgKiAgQGMgYmluYXJ5X2NvbXBvc2UgaXMgY29uc3RydWN0ZWQgZnJvbSB0aHJlZSBmdW5jdG9ycywgQGMgZiwgQGMgZzEsCisgICAqICBhbmQgQGMgZzIuICBJdHMgQGMgb3BlcmF0b3IoKSByZXR1cm5zIEBjIGYoZzEoeCksZzIoeCkpLiAgVGhlIGZ1bmN0aW9uCisgICAqICBjb21wb3NlMiB0YWtlcyBmLCBnMSwgYW5kIGcyLCBhbmQgY29uc3RydWN0cyB0aGUgQGMgYmluYXJ5X2NvbXBvc2UKKyAgICogIGluc3RhbmNlIGZvciB5b3UuICBGb3IgZXhhbXBsZSwgaWYgQGMgZiByZXR1cm5zIGFuIGludCwgdGhlbgorICAgKiAgXGNvZGUKKyAgICogIGludCBhbnN3ZXIgPSAoY29tcG9zZTIoZixnMSxnMikpKHgpOworICAgKiAgXGVuZGNvZGUKKyAgICogIGlzIGVxdWl2YWxlbnQgdG8KKyAgICogIFxjb2RlCisgICAqICBpbnQgdGVtcDEgPSBnMSh4KTsKKyAgICogIGludCB0ZW1wMiA9IGcyKHgpOworICAgKiAgaW50IGFuc3dlciA9IGYodGVtcDEsdGVtcDIpOworICAgKiAgXGVuZGNvZGUKKyAgICogIEJ1dCB0aGUgZmlyc3QgZm9ybSBpcyBtb3JlIGNvbXBhY3QsIGFuZCBjYW4gYmUgcGFzc2VkIGFyb3VuZCBhcyBhCisgICAqICBmdW5jdG9yIHRvIG90aGVyIGFsZ29yaXRobXMuCisgICAqCisgICAqICBAYWRkdG9ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAeworICAgKi8KKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMj4KKyAgICBjbGFzcyB1bmFyeV9jb21wb3NlCisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX09wZXJhdGlvbjI6OmFyZ3VtZW50X3R5cGUsCisJCQkgICAgdHlwZW5hbWUgX09wZXJhdGlvbjE6OnJlc3VsdF90eXBlPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfT3BlcmF0aW9uMSBfTV9mbjE7CisgICAgICBfT3BlcmF0aW9uMiBfTV9mbjI7CisKKyAgICBwdWJsaWM6CisgICAgICB1bmFyeV9jb21wb3NlKGNvbnN0IF9PcGVyYXRpb24xJiBfX3gsIGNvbnN0IF9PcGVyYXRpb24yJiBfX3kpCisgICAgICA6IF9NX2ZuMShfX3gpLCBfTV9mbjIoX195KSB7fQorCisgICAgICB0eXBlbmFtZSBfT3BlcmF0aW9uMTo6cmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgX09wZXJhdGlvbjI6OmFyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2ZuMShfTV9mbjIoX194KSk7IH0KKyAgICB9OworCisgIC8vLyBBbiBcbGluayBTR0lleHRlbnNpb25zIFNHSSBleHRlbnNpb24gXGVuZGxpbmsuCisgIHRlbXBsYXRlIDxjbGFzcyBfT3BlcmF0aW9uMSwgY2xhc3MgX09wZXJhdGlvbjI+CisgICAgaW5saW5lIHVuYXJ5X2NvbXBvc2U8X09wZXJhdGlvbjEsIF9PcGVyYXRpb24yPgorICAgIGNvbXBvc2UxKGNvbnN0IF9PcGVyYXRpb24xJiBfX2ZuMSwgY29uc3QgX09wZXJhdGlvbjImIF9fZm4yKQorICAgIHsgcmV0dXJuIHVuYXJ5X2NvbXBvc2U8X09wZXJhdGlvbjEsX09wZXJhdGlvbjI+KF9fZm4xLCBfX2ZuMik7IH0KKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNzIF9PcGVyYXRpb24yLCBjbGFzcyBfT3BlcmF0aW9uMz4KKyAgICBjbGFzcyBiaW5hcnlfY29tcG9zZQorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9PcGVyYXRpb24yOjphcmd1bWVudF90eXBlLAorCQkJICAgIHR5cGVuYW1lIF9PcGVyYXRpb24xOjpyZXN1bHRfdHlwZT4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX09wZXJhdGlvbjEgX01fZm4xOworICAgICAgX09wZXJhdGlvbjIgX01fZm4yOworICAgICAgX09wZXJhdGlvbjMgX01fZm4zOworICAgICAgCisgICAgcHVibGljOgorICAgICAgYmluYXJ5X2NvbXBvc2UoY29uc3QgX09wZXJhdGlvbjEmIF9feCwgY29uc3QgX09wZXJhdGlvbjImIF9feSwKKwkJICAgICBjb25zdCBfT3BlcmF0aW9uMyYgX196KQorICAgICAgOiBfTV9mbjEoX194KSwgX01fZm4yKF9feSksIF9NX2ZuMyhfX3opIHsgfQorCisgICAgICB0eXBlbmFtZSBfT3BlcmF0aW9uMTo6cmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgX09wZXJhdGlvbjI6OmFyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2ZuMShfTV9mbjIoX194KSwgX01fZm4zKF9feCkpOyB9CisgICAgfTsKKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNzIF9PcGVyYXRpb24yLCBjbGFzcyBfT3BlcmF0aW9uMz4KKyAgICBpbmxpbmUgYmluYXJ5X2NvbXBvc2U8X09wZXJhdGlvbjEsIF9PcGVyYXRpb24yLCBfT3BlcmF0aW9uMz4KKyAgICBjb21wb3NlMihjb25zdCBfT3BlcmF0aW9uMSYgX19mbjEsIGNvbnN0IF9PcGVyYXRpb24yJiBfX2ZuMiwKKwkgICAgIGNvbnN0IF9PcGVyYXRpb24zJiBfX2ZuMykKKyAgICB7IHJldHVybiBiaW5hcnlfY29tcG9zZTxfT3BlcmF0aW9uMSwgX09wZXJhdGlvbjIsIF9PcGVyYXRpb24zPgorCShfX2ZuMSwgX19mbjIsIF9fZm4zKTsgfQorICAvKiogQH0gICovCisKKyAgLyoqIEFzIGFuIGV4dGVuc2lvbiwgU0dJIHByb3ZpZGVkIGEgZnVuY3RvciBjYWxsZWQgQGMgaWRlbnRpdHkuICBXaGVuIGEKKyAgICogIGZ1bmN0b3IgaXMgcmVxdWlyZWQgYnV0IG5vIG9wZXJhdGlvbnMgYXJlIGRlc2lyZWQsIHRoaXMgY2FuIGJlIHVzZWQgYXMgYQorICAgKiAgcGFzcy10aHJvdWdoLiAgSXRzIEBjIG9wZXJhdG9yKCkgcmV0dXJucyBpdHMgYXJndW1lbnQgdW5jaGFuZ2VkLgorICAgKgorICAgKiAgQGFkZHRvZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKi8KKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBzdHJ1Y3QgaWRlbnRpdHkKKyAgICA6IHB1YmxpYyBzdGQ6Ol9JZGVudGl0eTxfVHA+IHt9OworCisgIC8qKiBAYyBzZWxlY3Qxc3QgYW5kIEBjIHNlbGVjdDJuZCBhcmUgZXh0ZW5zaW9ucyBwcm92aWRlZCBieSBTR0kuICBUaGVpcgorICAgKiAgQGMgb3BlcmF0b3IoKXMKKyAgICogIHRha2UgYSBAYyBzdGQ6OnBhaXIgYXMgYW4gYXJndW1lbnQsIGFuZCByZXR1cm4gZWl0aGVyIHRoZSBmaXJzdCBtZW1iZXIKKyAgICogIG9yIHRoZSBzZWNvbmQgbWVtYmVyLCByZXNwZWN0aXZlbHkuICBUaGV5IGNhbiBiZSB1c2VkIChlc3BlY2lhbGx5IHdpdGgKKyAgICogIHRoZSBjb21wb3NpdGlvbiBmdW5jdG9ycykgdG8gQGEgc3RyaXAgZGF0YSBmcm9tIGEgc2VxdWVuY2UgYmVmb3JlCisgICAqICBwZXJmb3JtaW5nIHRoZSByZW1haW5kZXIgb2YgYW4gYWxnb3JpdGhtLgorICAgKgorICAgKiAgQGFkZHRvZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQHsKKyAgICovCisgIC8vLyBBbiBcbGluayBTR0lleHRlbnNpb25zIFNHSSBleHRlbnNpb24gXGVuZGxpbmsuCisgIHRlbXBsYXRlIDxjbGFzcyBfUGFpcj4KKyAgICBzdHJ1Y3Qgc2VsZWN0MXN0CisgICAgOiBwdWJsaWMgc3RkOjpfU2VsZWN0MXN0PF9QYWlyPiB7fTsKKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+CisgICAgc3RydWN0IHNlbGVjdDJuZAorICAgIDogcHVibGljIHN0ZDo6X1NlbGVjdDJuZDxfUGFpcj4ge307CisKKyAgLyoqIEB9ICAqLworCisgIC8vIGV4dGVuc2lvbiBkb2N1bWVudGVkIG5leHQKKyAgdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KKyAgICBzdHJ1Y3QgX1Byb2plY3Qxc3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLCBfQXJnMiwgX0FyZzE+CisgICAgeworICAgICAgX0FyZzEKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0FyZzEmIF9feCwgY29uc3QgX0FyZzImKSBjb25zdAorICAgICAgeyByZXR1cm4gX194OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyPgorICAgIHN0cnVjdCBfUHJvamVjdDJuZCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X0FyZzEsIF9BcmcyLCBfQXJnMj4KKyAgICB7CisgICAgICBfQXJnMgorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQXJnMSYsIGNvbnN0IF9BcmcyJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3k7IH0KKyAgICB9OworCisgIC8qKiBUaGUgQGMgb3BlcmF0b3IoKSBvZiB0aGUgQGMgcHJvamVjdDFzdCBmdW5jdG9yIHRha2VzIHR3byBhcmJpdHJhcnkKKyAgICogIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgZmlyc3Qgb25lLCB3aGlsZSBAYyBwcm9qZWN0Mm5kIHJldHVybnMgdGhlCisgICAqICBzZWNvbmQgb25lLiAgVGhleSBhcmUgZXh0ZW5zaW9ucyBwcm92aWRlZCBieSBTR0kuCisgICAqCisgICAqICBAYWRkdG9ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAeworICAgKi8KKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyPgorICAgIHN0cnVjdCBwcm9qZWN0MXN0IDogcHVibGljIF9Qcm9qZWN0MXN0PF9BcmcxLCBfQXJnMj4ge307CisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KKyAgICBzdHJ1Y3QgcHJvamVjdDJuZCA6IHB1YmxpYyBfUHJvamVjdDJuZDxfQXJnMSwgX0FyZzI+IHt9OworICAvKiogQH0gICovCisKKyAgLy8gZXh0ZW5zaW9uIGRvY3VtZW50ZWQgbmV4dAorICB0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdD4KKyAgICBzdHJ1Y3QgX0NvbnN0YW50X3ZvaWRfZnVuCisgICAgeworICAgICAgdHlwZWRlZiBfUmVzdWx0IHJlc3VsdF90eXBlOworICAgICAgcmVzdWx0X3R5cGUgX01fdmFsOworCisgICAgICBfQ29uc3RhbnRfdm9pZF9mdW4oY29uc3QgcmVzdWx0X3R5cGUmIF9fdikgOiBfTV92YWwoX192KSB7fQorCisgICAgICBjb25zdCByZXN1bHRfdHlwZSYKKyAgICAgIG9wZXJhdG9yKCkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdmFsOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX0FyZ3VtZW50PgorICAgIHN0cnVjdCBfQ29uc3RhbnRfdW5hcnlfZnVuCisgICAgeworICAgICAgdHlwZWRlZiBfQXJndW1lbnQgYXJndW1lbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgIF9SZXN1bHQgIHJlc3VsdF90eXBlOworICAgICAgcmVzdWx0X3R5cGUgX01fdmFsOworICAgICAgCisgICAgICBfQ29uc3RhbnRfdW5hcnlfZnVuKGNvbnN0IHJlc3VsdF90eXBlJiBfX3YpIDogX01fdmFsKF9fdikge30KKworICAgICAgY29uc3QgcmVzdWx0X3R5cGUmCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9Bcmd1bWVudCYpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV92YWw7IH0KKyAgICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+CisgICAgc3RydWN0IF9Db25zdGFudF9iaW5hcnlfZnVuCisgICAgeworICAgICAgdHlwZWRlZiAgX0FyZzEgICBmaXJzdF9hcmd1bWVudF90eXBlOworICAgICAgdHlwZWRlZiAgX0FyZzIgICBzZWNvbmRfYXJndW1lbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgIF9SZXN1bHQgcmVzdWx0X3R5cGU7CisgICAgICBfUmVzdWx0IF9NX3ZhbDsKKworICAgICAgX0NvbnN0YW50X2JpbmFyeV9mdW4oY29uc3QgX1Jlc3VsdCYgX192KSA6IF9NX3ZhbChfX3YpIHt9CisgICAgICAKKyAgICAgIGNvbnN0IHJlc3VsdF90eXBlJgorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQXJnMSYsIGNvbnN0IF9BcmcyJikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3ZhbDsgfQorICAgIH07CisKKyAgLyoqIFRoZXNlIHRocmVlIGZ1bmN0b3JzIGFyZSBlYWNoIGNvbnN0cnVjdGVkIGZyb20gYSBzaW5nbGUgYXJiaXRyYXJ5CisgICAqICB2YXJpYWJsZS92YWx1ZS4gIExhdGVyLCB0aGVpciBAYyBvcGVyYXRvcigpcyBjb21wbGV0ZWx5IGlnbm9yZSBhbnkKKyAgICogIGFyZ3VtZW50cyBwYXNzZWQsIGFuZCByZXR1cm4gdGhlIHN0b3JlZCB2YWx1ZS4KKyAgICogIC0gQGMgY29uc3RhbnRfdm9pZF9mdW4ncyBAYyBvcGVyYXRvcigpIHRha2VzIG5vIGFyZ3VtZW50cworICAgKiAgLSBAYyBjb25zdGFudF91bmFyeV9mdW4ncyBAYyBvcGVyYXRvcigpIHRha2VzIG9uZSBhcmd1bWVudCAoaWdub3JlZCkKKyAgICogIC0gQGMgY29uc3RhbnRfYmluYXJ5X2Z1bidzIEBjIG9wZXJhdG9yKCkgdGFrZXMgdHdvIGFyZ3VtZW50cyAoaWdub3JlZCkKKyAgICoKKyAgICogIFRoZSBoZWxwZXIgY3JlYXRvciBmdW5jdGlvbnMgQGMgY29uc3RhbnQwLCBAYyBjb25zdGFudDEsIGFuZAorICAgKiAgQGMgY29uc3RhbnQyIGVhY2ggdGFrZSBhIEBhIHJlc3VsdCBhcmd1bWVudCBhbmQgY29uc3RydWN0IHZhcmlhYmxlcyBvZgorICAgKiAgdGhlIGFwcHJvcHJpYXRlIGZ1bmN0b3IgdHlwZS4KKyAgICoKKyAgICogIEBhZGR0b2dyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEB7CisgICAqLworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdD4KKyAgICBzdHJ1Y3QgY29uc3RhbnRfdm9pZF9mdW4KKyAgICA6IHB1YmxpYyBfQ29uc3RhbnRfdm9pZF9mdW48X1Jlc3VsdD4KKyAgICB7CisgICAgICBjb25zdGFudF92b2lkX2Z1bihjb25zdCBfUmVzdWx0JiBfX3YpCisgICAgICA6IF9Db25zdGFudF92b2lkX2Z1bjxfUmVzdWx0PihfX3YpIHt9CisgICAgfTsKKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX0FyZ3VtZW50ID0gX1Jlc3VsdD4KKyAgICBzdHJ1Y3QgY29uc3RhbnRfdW5hcnlfZnVuIDogcHVibGljIF9Db25zdGFudF91bmFyeV9mdW48X1Jlc3VsdCwgX0FyZ3VtZW50PgorICAgIHsKKyAgICAgIGNvbnN0YW50X3VuYXJ5X2Z1bihjb25zdCBfUmVzdWx0JiBfX3YpCisgICAgICA6IF9Db25zdGFudF91bmFyeV9mdW48X1Jlc3VsdCwgX0FyZ3VtZW50PihfX3YpIHt9CisgICAgfTsKKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX0FyZzEgPSBfUmVzdWx0LCBjbGFzcyBfQXJnMiA9IF9BcmcxPgorICAgIHN0cnVjdCBjb25zdGFudF9iaW5hcnlfZnVuCisgICAgOiBwdWJsaWMgX0NvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCwgX0FyZzEsIF9BcmcyPgorICAgIHsKKyAgICAgIGNvbnN0YW50X2JpbmFyeV9mdW4oY29uc3QgX1Jlc3VsdCYgX192KQorICAgICAgOiBfQ29uc3RhbnRfYmluYXJ5X2Z1bjxfUmVzdWx0LCBfQXJnMSwgX0FyZzI+KF9fdikge30KKyAgICB9OworCisgIC8vLyBBbiBcbGluayBTR0lleHRlbnNpb25zIFNHSSBleHRlbnNpb24gXGVuZGxpbmsuCisgIHRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0PgorICAgIGlubGluZSBjb25zdGFudF92b2lkX2Z1bjxfUmVzdWx0PgorICAgIGNvbnN0YW50MChjb25zdCBfUmVzdWx0JiBfX3ZhbCkKKyAgICB7IHJldHVybiBjb25zdGFudF92b2lkX2Z1bjxfUmVzdWx0PihfX3ZhbCk7IH0KKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdD4KKyAgICBpbmxpbmUgY29uc3RhbnRfdW5hcnlfZnVuPF9SZXN1bHQsIF9SZXN1bHQ+CisgICAgY29uc3RhbnQxKGNvbnN0IF9SZXN1bHQmIF9fdmFsKQorICAgIHsgcmV0dXJuIGNvbnN0YW50X3VuYXJ5X2Z1bjxfUmVzdWx0LCBfUmVzdWx0PihfX3ZhbCk7IH0KKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdD4KKyAgICBpbmxpbmUgY29uc3RhbnRfYmluYXJ5X2Z1bjxfUmVzdWx0LF9SZXN1bHQsX1Jlc3VsdD4KKyAgICBjb25zdGFudDIoY29uc3QgX1Jlc3VsdCYgX192YWwpCisgICAgeyByZXR1cm4gY29uc3RhbnRfYmluYXJ5X2Z1bjxfUmVzdWx0LCBfUmVzdWx0LCBfUmVzdWx0PihfX3ZhbCk7IH0KKyAgLyoqIEB9ICAqLworCisgIC8qKiBUaGUgQGMgc3VidHJhY3RpdmVfcm5nIGNsYXNzIGlzIGRvY3VtZW50ZWQgb24KKyAgICogIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2dpLmNvbS90ZWNoL3N0bC8iPlNHSSdzIHNpdGU8L2E+LgorICAgKiAgTm90ZSB0aGF0IHRoaXMgY29kZSBhc3N1bWVzIHRoYXQgQGMgaW50IGlzIDMyIGJpdHMuCisgICAqCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqLworICBjbGFzcyBzdWJ0cmFjdGl2ZV9ybmcKKyAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQ+CisgIHsKKyAgcHJpdmF0ZToKKyAgICB1bnNpZ25lZCBpbnQgX01fdGFibGVbNTVdOworICAgIHNpemVfdCBfTV9pbmRleDE7CisgICAgc2l6ZV90IF9NX2luZGV4MjsKKworICBwdWJsaWM6CisgICAgLy8vIFJldHVybnMgYSBudW1iZXIgbGVzcyB0aGFuIHRoZSBhcmd1bWVudC4KKyAgICB1bnNpZ25lZCBpbnQKKyAgICBvcGVyYXRvcigpKHVuc2lnbmVkIGludCBfX2xpbWl0KQorICAgIHsKKyAgICAgIF9NX2luZGV4MSA9IChfTV9pbmRleDEgKyAxKSAlIDU1OworICAgICAgX01faW5kZXgyID0gKF9NX2luZGV4MiArIDEpICUgNTU7CisgICAgICBfTV90YWJsZVtfTV9pbmRleDFdID0gX01fdGFibGVbX01faW5kZXgxXSAtIF9NX3RhYmxlW19NX2luZGV4Ml07CisgICAgICByZXR1cm4gX01fdGFibGVbX01faW5kZXgxXSAlIF9fbGltaXQ7CisgICAgfQorCisgICAgdm9pZAorICAgIF9NX2luaXRpYWxpemUodW5zaWduZWQgaW50IF9fc2VlZCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgX19rID0gMTsKKyAgICAgIF9NX3RhYmxlWzU0XSA9IF9fc2VlZDsKKyAgICAgIHNpemVfdCBfX2k7CisgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IDU0OyBfX2krKykKKwl7CisJICBzaXplX3QgX19paSA9ICgyMSAqIChfX2kgKyAxKSAlIDU1KSAtIDE7CisJICBfTV90YWJsZVtfX2lpXSA9IF9fazsKKwkgIF9fayA9IF9fc2VlZCAtIF9fazsKKwkgIF9fc2VlZCA9IF9NX3RhYmxlW19faWldOworCX0KKyAgICAgIGZvciAoaW50IF9fbG9vcCA9IDA7IF9fbG9vcCA8IDQ7IF9fbG9vcCsrKQorCXsKKwkgIGZvciAoX19pID0gMDsgX19pIDwgNTU7IF9faSsrKQorICAgICAgICAgICAgX01fdGFibGVbX19pXSA9IF9NX3RhYmxlW19faV0gLSBfTV90YWJsZVsoMSArIF9faSArIDMwKSAlIDU1XTsKKwl9CisgICAgICBfTV9pbmRleDEgPSAwOworICAgICAgX01faW5kZXgyID0gMzE7CisgICAgfQorCisgICAgLy8vIEN0b3IgYWxsb3dpbmcgeW91IHRvIGluaXRpYWxpemUgdGhlIHNlZWQuCisgICAgc3VidHJhY3RpdmVfcm5nKHVuc2lnbmVkIGludCBfX3NlZWQpCisgICAgeyBfTV9pbml0aWFsaXplKF9fc2VlZCk7IH0KKworICAgIC8vLyBEZWZhdWx0IGN0b3I7IGluaXRpYWxpemVzIGl0cyBzdGF0ZSB3aXRoIHNvbWUgbnVtYmVyIHlvdSBkb24ndCBzZWUuCisgICAgc3VidHJhY3RpdmVfcm5nKCkKKyAgICB7IF9NX2luaXRpYWxpemUoMTYxODAzMzk4dSk7IH0KKyAgfTsKKworICAvLyBNZW1fZnVuIGFkYXB0b3IgaGVscGVyIGZ1bmN0aW9ucyBtZW1fZnVuMSBhbmQgbWVtX2Z1bjFfcmVmLAorICAvLyBwcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhleSBhcmUgbm8gbG9uZ2VyIHBhcnQgb2YKKyAgLy8gdGhlIEMrKyBzdGFuZGFyZC4KKyAgCisgIHRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CisgICAgaW5saW5lIG1lbV9mdW4xX3Q8X1JldCwgX1RwLCBfQXJnPgorICAgIG1lbV9mdW4xKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykpCisgICAgeyByZXR1cm4gbWVtX2Z1bjFfdDxfUmV0LCBfVHAsIF9Bcmc+KF9fZik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorICAgIGlubGluZSBjb25zdF9tZW1fZnVuMV90PF9SZXQsIF9UcCwgX0FyZz4KKyAgICBtZW1fZnVuMShfUmV0IChfVHA6OipfX2YpKF9BcmcpIGNvbnN0KQorICAgIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3Q8X1JldCwgX1RwLCBfQXJnPihfX2YpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KKyAgICBpbmxpbmUgbWVtX2Z1bjFfcmVmX3Q8X1JldCwgX1RwLCBfQXJnPgorICAgIG1lbV9mdW4xX3JlZihfUmV0IChfVHA6OipfX2YpKF9BcmcpKQorICAgIHsgcmV0dXJuIG1lbV9mdW4xX3JlZl90PF9SZXQsIF9UcCwgX0FyZz4oX19mKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CisgICAgaW5saW5lIGNvbnN0X21lbV9mdW4xX3JlZl90PF9SZXQsIF9UcCwgX0FyZz4KKyAgICBtZW1fZnVuMV9yZWYoX1JldCAoX1RwOjoqX19mKShfQXJnKSBjb25zdCkKKyAgICB7IHJldHVybiBjb25zdF9tZW1fZnVuMV9yZWZfdDxfUmV0LCBfVHAsIF9Bcmc+KF9fZik7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvaGFzaF9tYXAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9oYXNoX21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjI4NzFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvaGFzaF9tYXAKQEAgLTAsMCArMSw1OTkgQEAKKy8vIEhhc2hpbmcgbWFwIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisvKiogQGZpbGUgYmFja3dhcmQvaGFzaF9tYXAKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLgorICovCisKKyNpZm5kZWYgX0JBQ0tXQVJEX0hBU0hfTUFQCisjZGVmaW5lIF9CQUNLV0FSRF9IQVNIX01BUCAxCisKKyNpZm5kZWYgX0dMSUJDWFhfUEVSTUlUX0JBQ0tXQVJEX0hBU0gKKyNpbmNsdWRlICJiYWNrd2FyZF93YXJuaW5nLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8YmFja3dhcmQvaGFzaHRhYmxlLmg+CisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OmVxdWFsX3RvOworICB1c2luZyBzdGQ6OmFsbG9jYXRvcjsKKyAgdXNpbmcgc3RkOjpwYWlyOworICB1c2luZyBzdGQ6Ol9TZWxlY3Qxc3Q7CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuID0gaGFzaDxfS2V5PiwKKwkgICBjbGFzcyBfRXF1YWxLZXkgPSBlcXVhbF90bzxfS2V5PiwgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGhhc2hfbWFwCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGhhc2h0YWJsZTxwYWlyPGNvbnN0IF9LZXksIF9UcD4sX0tleSwgX0hhc2hGbiwKKwkJCV9TZWxlY3Qxc3Q8cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4sCisJCQlfRXF1YWxLZXksIF9BbGxvYz4gX0h0OworCisgICAgICBfSHQgX01faHQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCBkYXRhX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIAorICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQorCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgaGFzaF9tYXAoKQorICAgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgCisgICAgICBleHBsaWNpdAorICAgICAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGhhc2hfbWFwKHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisJOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24pCisJOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSBjb25zdCBoYXNoZXImIF9faGYpCisJOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisgICAgICAKKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBzd2FwKGhhc2hfbWFwJiBfX2hzKQorICAgICAgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9LMSwgY2xhc3MgX1QxLCBjbGFzcyBfSEYsIGNsYXNzIF9FcUssIGNsYXNzIF9BbD4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PSAoY29uc3QgaGFzaF9tYXA8X0sxLCBfVDEsIF9IRiwgX0VxSywgX0FsPiYsCisJCSAgICBjb25zdCBoYXNoX21hcDxfSzEsIF9UMSwgX0hGLCBfRXFLLCBfQWw+Jik7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeyByZXR1cm4gX01faHQuaW5zZXJ0X3VuaXF1ZShfX29iaik7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnRfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfdW5pcXVlX25vcmVzaXplKF9fb2JqKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgICAgICBfVHAmCisgICAgICBvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmRfb3JfaW5zZXJ0KHZhbHVlX3R5cGUoX19rZXksIF9UcCgpKSkuc2Vjb25kOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAge3JldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KKworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19pdCk7IH0KKworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wpCisgICAgICB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IF9NX2h0LmNsZWFyKCk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpCisgICAgICB7IF9NX2h0LnJlc2l6ZShfX2hpbnQpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sIGNsYXNzIF9FcWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMSwKKwkgICAgICAgY29uc3QgaGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMikKKyAgICB7IHJldHVybiBfX2htMS5fTV9odCA9PSBfX2htMi5fTV9odDsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgY2xhc3MgX0VxbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0xLAorCSAgICAgICBjb25zdCBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0yKQorICAgIHsgcmV0dXJuICEoX19obTEgPT0gX19obTIpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCBjbGFzcyBfRXFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTEsCisJIGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTIpCisgICAgeyBfX2htMS5zd2FwKF9faG0yKTsgfQorCisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLAorCSAgIGNsYXNzIF9IYXNoRm4gPSBoYXNoPF9LZXk+LAorCSAgIGNsYXNzIF9FcXVhbEtleSA9IGVxdWFsX3RvPF9LZXk+LAorCSAgIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBoYXNoX211bHRpbWFwCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfS2V5LCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1RwLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMzKF9IYXNoRm4sIHNpemVfdCwgX0tleSwgX1VuYXJ5RnVuY3Rpb25Db25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfRXF1YWxLZXksIF9LZXksIF9LZXksIF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0KQorCQorICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGhhc2h0YWJsZTxwYWlyPGNvbnN0IF9LZXksIF9UcD4sIF9LZXksIF9IYXNoRm4sCisJCQlfU2VsZWN0MXN0PHBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LCBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgICBfSHQ7CisKKyAgICAgIF9IdCBfTV9odDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfdHlwZSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwIGRhdGFfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cG9pbnRlciBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICAgICAgCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CisKKyAgICAgIGtleV9lcXVhbAorICAgICAga2V5X2VxKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICBoYXNoX211bHRpbWFwKCkKKyAgICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBoYXNoX211bHRpbWFwKHNpemVfdHlwZSBfX24pCisgICAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBoYXNoX211bHRpbWFwKHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9tdWx0aW1hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKwk6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24pCisJOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYpCisJOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQorCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoaGFzaF9tdWx0aW1hcCYgX19ocykKKyAgICAgIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSzEsIGNsYXNzIF9UMSwgY2xhc3MgX0hGLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWw+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9tdWx0aW1hcDxfSzEsIF9UMSwgX0hGLCBfRXFLLCBfQWw+JiwKKwkJICAgY29uc3QgaGFzaF9tdWx0aW1hcDxfSzEsIF9UMSwgX0hGLCBfRXFLLCBfQWw+Jik7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsKF9fb2JqKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZixfX2wpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IF9NX2h0LmVyYXNlKF9faXQpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sKQorICAgICAgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeyBfTV9odC5jbGVhcigpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19oaW50KQorICAgICAgeyBfTV9odC5yZXNpemUoX19oaW50KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5idWNrZXRfY291bnQoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9CisgICAgICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSEYsIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hGLCBfRXFLZXksIF9BbGxvYz4mIF9faG0xLAorCSAgICAgICBjb25zdCBoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hGLCBfRXFLZXksIF9BbGxvYz4mIF9faG0yKQorICAgIHsgcmV0dXJuIF9faG0xLl9NX2h0ID09IF9faG0yLl9NX2h0OyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSEYsIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hGLCBfRXFLZXksIF9BbGxvYz4mIF9faG0xLAorCSAgICAgICBjb25zdCBoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hGLCBfRXFLZXksIF9BbGxvYz4mIF9faG0yKQorICAgIHsgcmV0dXJuICEoX19obTEgPT0gX19obTIpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCBjbGFzcyBfRXFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMSwKKwkgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0yKQorICAgIHsgX19obTEuc3dhcChfX2htMik7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gU3BlY2lhbGl6YXRpb24gb2YgaW5zZXJ0X2l0ZXJhdG9yIHNvIHRoYXQgaXQgd2lsbCB3b3JrIGZvciBoYXNoX21hcAorICAvLyBhbmQgaGFzaF9tdWx0aW1hcC4KKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCAgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPF9fZ251X2N4eDo6aGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCAKKwkJCQkJICAgICAgX0VxS2V5LCBfQWxsb2M+ID4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Omhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+CisgICAgICAgIF9Db250YWluZXI7CisgICAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgICAgICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICAKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sICBjbGFzcyBfRXFLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X19nbnVfY3h4OjpoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwKKwkJCQkJCSAgIF9FcUtleSwgX0FsbG9jPiA+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+CisgICAgICAgIF9Db250YWluZXI7CisgICAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CisgICAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBpdGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgICAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkKKyAgICAgIHsKKwljb250YWluZXItPmluc2VydChfX3ZhbHVlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvaGFzaF9zZXQgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9oYXNoX3NldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzhlODQ3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvaGFzaF9zZXQKQEAgLTAsMCArMSw1NjcgQEAKKy8vIEhhc2hpbmcgc2V0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisvKiogQGZpbGUgYmFja3dhcmQvaGFzaF9zZXQKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLgorICovCisKKyNpZm5kZWYgX0JBQ0tXQVJEX0hBU0hfU0VUCisjZGVmaW5lIF9CQUNLV0FSRF9IQVNIX1NFVCAxCisKKyNpZm5kZWYgX0dMSUJDWFhfUEVSTUlUX0JBQ0tXQVJEX0hBU0gKKyNpbmNsdWRlICJiYWNrd2FyZF93YXJuaW5nLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8YmFja3dhcmQvaGFzaHRhYmxlLmg+CisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OmVxdWFsX3RvOworICB1c2luZyBzdGQ6OmFsbG9jYXRvcjsKKyAgdXNpbmcgc3RkOjpwYWlyOworICB1c2luZyBzdGQ6Ol9JZGVudGl0eTsKKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuICA9IGhhc2g8X1ZhbHVlPiwKKwkgICBjbGFzcyBfRXF1YWxLZXkgPSBlcXVhbF90bzxfVmFsdWU+LAorCSAgIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxfVmFsdWU+ID4KKyAgICBjbGFzcyBoYXNoX3NldAorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1ZhbHVlLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMzKF9IYXNoRmNuLCBzaXplX3QsIF9WYWx1ZSwgX1VuYXJ5RnVuY3Rpb25Db25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfRXF1YWxLZXksIF9WYWx1ZSwgX1ZhbHVlLCBfQmluYXJ5UHJlZGljYXRlQ29uY2VwdCkKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsdWUsIF9WYWx1ZSwgX0hhc2hGY24sIF9JZGVudGl0eTxfVmFsdWU+LAorCQkJX0VxdWFsS2V5LCBfQWxsb2M+IF9IdDsKKyAgICAgIF9IdCBfTV9odDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfdHlwZSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIAorICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQorCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgaGFzaF9zZXQoKQorICAgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgZXhwbGljaXQKKyAgICAgIGhhc2hfc2V0KHNpemVfdHlwZSBfX24pCisgICAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBoYXNoX3NldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGhhc2hfc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorCTogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorCTogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgY29uc3QgaGFzaGVyJiBfX2hmKQorCTogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQorICAgICAgCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoaGFzaF9zZXQmIF9faHMpCisgICAgICB7IF9NX2h0LnN3YXAoX19ocy5fTV9odCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0hGLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWw+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9zZXQ8X1ZhbCwgX0hGLCBfRXFLLCBfQWw+JiwKKwkJICAgY29uc3QgaGFzaF9zZXQ8X1ZhbCwgX0hGLCBfRXFLLCBfQWw+Jik7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgICAgICAKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlwYWlyPHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IsIGJvb2w+IF9fcCA9IF9NX2h0Lmluc2VydF91bmlxdWUoX19vYmopOworCXJldHVybiBwYWlyPGl0ZXJhdG9yLGJvb2w+KF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCXBhaXI8dHlwZW5hbWUgX0h0OjppdGVyYXRvciwgYm9vbD4gX19wCisJICA9IF9NX2h0Lmluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOworCXJldHVybiBwYWlyPGl0ZXJhdG9yLCBib29sPihfX3AuZmlyc3QsIF9fcC5zZWNvbmQpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHtyZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IF9NX2h0LmVyYXNlKF9faXQpOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sKQorICAgICAgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeyBfTV9odC5jbGVhcigpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19oaW50KQorICAgICAgeyBfTV9odC5yZXNpemUoX19oaW50KTsgfQorICAgICAgCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5idWNrZXRfY291bnQoKTsgfQorICAgICAgCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9CisgICAgICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczEsCisJICAgICAgIGNvbnN0IGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczIpCisgICAgeyByZXR1cm4gX19oczEuX01faHQgPT0gX19oczIuX01faHQ7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgaGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgICAgICAgY29uc3QgaGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IHJldHVybiAhKF9faHMxID09IF9faHMyKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoaGFzaF9zZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczEsCisJIGhhc2hfc2V0PF9WYWwsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMyKQorICAgIHsgX19oczEuc3dhcChfX2hzMik7IH0KKworCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwKKwkgICBjbGFzcyBfSGFzaEZjbiA9IGhhc2g8X1ZhbHVlPiwKKwkgICBjbGFzcyBfRXF1YWxLZXkgPSBlcXVhbF90bzxfVmFsdWU+LAorCSAgIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxfVmFsdWU+ID4KKyAgICBjbGFzcyBoYXNoX211bHRpc2V0CisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVmFsdWUsIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczMoX0hhc2hGY24sIHNpemVfdCwgX1ZhbHVlLCBfVW5hcnlGdW5jdGlvbkNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMzKF9FcXVhbEtleSwgX1ZhbHVlLCBfVmFsdWUsIF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0KQorCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgaGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfSGFzaEZjbiwgX0lkZW50aXR5PF9WYWx1ZT4sCisJCQlfRXF1YWxLZXksIF9BbGxvYz4gX0h0OworICAgICAgX0h0IF9NX2h0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV90eXBlIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cG9pbnRlciBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICAgICAgCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CisgICAgICAKKyAgICAgIGtleV9lcXVhbAorICAgICAga2V5X2VxKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CisgICAgICAKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICBoYXNoX211bHRpc2V0KCkKKyAgICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBoYXNoX211bHRpc2V0KHNpemVfdHlwZSBfX24pCisgICAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBoYXNoX211bHRpc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgICAgIAorICAgICAgaGFzaF9tdWx0aXNldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKwk6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24pCisJOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYpCisJOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQorCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoaGFzaF9tdWx0aXNldCYgaHMpCisgICAgICB7IF9NX2h0LnN3YXAoaHMuX01faHQpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IRiwgY2xhc3MgX0VxSywgY2xhc3MgX0FsPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hGLCBfRXFLLCBfQWw+JiwKKwkJICAgY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSEYsIF9FcUssIF9BbD4mKTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgICAgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsKF9fb2JqKTsgfQorICAKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLF9fbCk7IH0KKyAgCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsX25vcmVzaXplKF9fb2JqKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQorICAKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IF9NX2h0LmVyYXNlKF9faXQpOyB9CisgIAorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wpCisgICAgICB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorICAKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgX01faHQuY2xlYXIoKTsgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9faGludCkKKyAgICAgIHsgX01faHQucmVzaXplKF9faGludCk7IH0KKyAgCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5idWNrZXRfY291bnQoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX211bHRpc2V0PF9WYWwsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMxLAorCSAgICAgICBjb25zdCBoYXNoX211bHRpc2V0PF9WYWwsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMyKQorICAgIHsgcmV0dXJuIF9faHMxLl9NX2h0ID09IF9faHMyLl9NX2h0OyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBoYXNoX211bHRpc2V0PF9WYWwsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMxLAorCSAgICAgICBjb25zdCBoYXNoX211bHRpc2V0PF9WYWwsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMyKQorICAgIHsgcmV0dXJuICEoX19oczEgPT0gX19oczIpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChoYXNoX211bHRpc2V0PF9WYWwsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMxLAorCSBoYXNoX211bHRpc2V0PF9WYWwsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMyKQorICAgIHsgX19oczEuc3dhcChfX2hzMik7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gU3BlY2lhbGl6YXRpb24gb2YgaW5zZXJ0X2l0ZXJhdG9yIHNvIHRoYXQgaXQgd2lsbCB3b3JrIGZvciBoYXNoX3NldAorICAvLyBhbmQgaGFzaF9tdWx0aXNldC4KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPF9fZ251X2N4eDo6aGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwKKwkJCQkJICAgICAgX0VxdWFsS2V5LCBfQWxsb2M+ID4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Omhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPgorICAgICAgICBfQ29udGFpbmVyOworICAgICAgX0NvbnRhaW5lciogY29udGFpbmVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgICAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKyAgICAgIAorICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkKKyAgICAgIHsKKwljb250YWluZXItPmluc2VydChfX3ZhbHVlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgICAgCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgICAKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIGluc2VydF9pdGVyYXRvcjxfX2dudV9jeHg6Omhhc2hfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaEZjbiwKKwkJCQkJCSAgIF9FcXVhbEtleSwgX0FsbG9jPiA+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPgorICAgICAgICBfQ29udGFpbmVyOworICAgICAgX0NvbnRhaW5lciogY29udGFpbmVyOworICAgICAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgaXRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIAorICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisgICAgICAKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5pbnNlcnQoX192YWx1ZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvaXRlcmF0b3IgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9pdGVyYXRvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWI4NWFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvaXRlcmF0b3IKQEAgLTAsMCArMSwxMTYgQEAKKy8vIEhQL1NHSSBpdGVyYXRvciBleHRlbnNpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBleHQvaXRlcmF0b3IKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLgorICovCisKKyNpZm5kZWYgX0VYVF9JVEVSQVRPUgorI2RlZmluZSBfRVhUX0lURVJBVE9SIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBUaGVyZSBhcmUgdHdvIHNpZ25hdHVyZXMgZm9yIGRpc3RhbmNlLiAgSW4gYWRkaXRpb24gdG8gdGhlIG9uZQorICAvLyB0YWtpbmcgdHdvIGl0ZXJhdG9ycyBhbmQgcmV0dXJuaW5nIGEgcmVzdWx0LCB0aGVyZSBpcyBhbm90aGVyCisgIC8vIHRha2luZyB0d28gaXRlcmF0b3JzIGFuZCBhIHJlZmVyZW5jZS10by1yZXN1bHQgdmFyaWFibGUsIGFuZAorICAvLyByZXR1cm5pbmcgbm90aGluZy4gIFRoZSBsYXR0ZXIgc2VlbXMgdG8gYmUgYW4gU0dJIGV4dGVuc2lvbi4KKyAgLy8gLS0gcGVkd2FyZHMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fZGlzdGFuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBfRGlzdGFuY2UmIF9fbiwgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgICsrX19maXJzdDsKKwkgICsrX19uOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX2Rpc3RhbmNlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBfRGlzdGFuY2UmIF9fbiwgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19uICs9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIGRpc3RhbmNlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICBfRGlzdGFuY2UmIF9fbikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cyAtLSB0YWtlbiBjYXJlIG9mIGluIF9fZGlzdGFuY2UKKyAgICAgIF9fZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfX24sIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9tYWxsb2NfYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9tYWxsb2NfYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwOTM0ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L21hbGxvY19hbGxvY2F0b3IuaApAQCAtMCwwICsxLDE1MiBAQAorLy8gQWxsb2NhdG9yIHRoYXQgd3JhcHMgIkMiIG1hbGxvYyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L21hbGxvY19hbGxvY2F0b3IuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX01BTExPQ19BTExPQ0FUT1JfSAorI2RlZmluZSBfTUFMTE9DX0FMTE9DQVRPUl9IIDEKKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjZW5kaWYKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6c2l6ZV90OworICB1c2luZyBzdGQ6OnB0cmRpZmZfdDsKKworICAvKioKKyAgICogIEBicmllZiAgQW4gYWxsb2NhdG9yIHRoYXQgdXNlcyBtYWxsb2MuCisgICAqICBAaW5ncm91cCBhbGxvY2F0b3JzCisgICAqCisgICAqICBUaGlzIGlzIHByZWNpc2VseSB0aGUgYWxsb2NhdG9yIGRlZmluZWQgaW4gdGhlIEMrKyBTdGFuZGFyZC4gCisgICAqICAgIC0gYWxsIGFsbG9jYXRpb24gY2FsbHMgbWFsbG9jCisgICAqICAgIC0gYWxsIGRlYWxsb2NhdGlvbiBjYWxscyBmcmVlCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgbWFsbG9jX2FsbG9jYXRvcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBzdHJ1Y3QgcmViaW5kCisgICAgICAgIHsgdHlwZWRlZiBtYWxsb2NfYWxsb2NhdG9yPF9UcDE+IG90aGVyOyB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjEwMy4gcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQKKyAgICAgIHR5cGVkZWYgc3RkOjp0cnVlX3R5cGUgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ7CisjZW5kaWYKKworICAgICAgbWFsbG9jX2FsbG9jYXRvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgICAgbWFsbG9jX2FsbG9jYXRvcihjb25zdCBtYWxsb2NfYWxsb2NhdG9yJikgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBtYWxsb2NfYWxsb2NhdG9yKGNvbnN0IG1hbGxvY19hbGxvY2F0b3I8X1RwMT4mKQorCV9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgICAgfm1hbGxvY19hbGxvY2F0b3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX194KTsgfQorCisgICAgICBjb25zdF9wb2ludGVyCisgICAgICBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgLy8gTkI6IF9fbiBpcyBwZXJtaXR0ZWQgdG8gYmUgMC4gIFRoZSBDKysgc3RhbmRhcmQgc2F5cyBub3RoaW5nCisgICAgICAvLyBhYm91dCB3aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgd2hlbiBfX24gPT0gMC4KKyAgICAgIHBvaW50ZXIKKyAgICAgIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqID0gMCkKKyAgICAgIHsKKwlpZiAoX19uID4gdGhpcy0+bWF4X3NpemUoKSkKKwkgIHN0ZDo6X190aHJvd19iYWRfYWxsb2MoKTsKKworCXBvaW50ZXIgX19yZXQgPSBzdGF0aWNfY2FzdDxfVHAqPihzdGQ6Om1hbGxvYyhfX24gKiBzaXplb2YoX1RwKSkpOworCWlmICghX19yZXQpCisJICBzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICAvLyBfX3AgaXMgbm90IHBlcm1pdHRlZCB0byBiZSBhIG51bGwgcG9pbnRlci4KKyAgICAgIHZvaWQKKyAgICAgIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSkKKyAgICAgIHsgc3RkOjpmcmVlKHN0YXRpY19jYXN0PHZvaWQqPihfX3ApKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QgX0dMSUJDWFhfVVNFX05PRVhDRVBUIAorICAgICAgeyByZXR1cm4gc2l6ZV90KC0xKSAvIHNpemVvZihfVHApOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGNvbnN0cnVjdChfVXAqIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyA6Om5ldygodm9pZCAqKV9fcCkgX1VwKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICB2b2lkIAorICAgICAgICBkZXN0cm95KF9VcCogX19wKSB7IF9fcC0+fl9VcCgpOyB9CisjZWxzZQorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDAyLiB3cm9uZyBuZXcgZXhwcmVzc2lvbiBpbiBbc29tZV9dIGFsbG9jYXRvcjo6Y29uc3RydWN0CisgICAgICB2b2lkIAorICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdCBfVHAmIF9fdmFsKSAKKyAgICAgIHsgOjpuZXcoKHZvaWQgKilfX3ApIHZhbHVlX3R5cGUoX192YWwpOyB9CisKKyAgICAgIHZvaWQgCisgICAgICBkZXN0cm95KHBvaW50ZXIgX19wKSB7IF9fcC0+fl9UcCgpOyB9CisjZW5kaWYKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbWFsbG9jX2FsbG9jYXRvcjxfVHA+JiwgY29uc3QgbWFsbG9jX2FsbG9jYXRvcjxfVHA+JikKKyAgICB7IHJldHVybiB0cnVlOyB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG1hbGxvY19hbGxvY2F0b3I8X1RwPiYsIGNvbnN0IG1hbGxvY19hbGxvY2F0b3I8X1RwPiYpCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L21lbW9yeSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L21lbW9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTliMGQ3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvbWVtb3J5CkBAIC0wLDAgKzEsMTk3IEBACisvLyBNZW1vcnkgZXh0ZW5zaW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGV4dC9tZW1vcnkKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLgorICovCisKKyNpZm5kZWYgX0VYVF9NRU1PUlkKKyNkZWZpbmUgX0VYVF9NRU1PUlkgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8Yml0cy9zdGxfdGVtcGJ1Zi5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisgIHVzaW5nIHN0ZDo6cGFpcjsKKyAgdXNpbmcgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5OworICB1c2luZyBzdGQ6Ol9UZW1wb3JhcnlfYnVmZmVyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXI+CisgICAgcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+CisgICAgX191bmluaXRpYWxpemVkX2NvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCisJCQkgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIF9Gb3J3YXJkSXRlciBfX2N1ciA9IF9fcmVzdWx0OworICAgICAgX190cnkKKwl7CisJICBmb3IgKDsgX19jb3VudCA+IDAgOyAtLV9fY291bnQsICsrX19maXJzdCwgKytfX2N1cikKKwkgICAgc3RkOjpfQ29uc3RydWN0KCYqX19jdXIsICpfX2ZpcnN0KTsKKwkgIHJldHVybiBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcj4oX19maXJzdCwgX19jdXIpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6X0Rlc3Ryb3koX19yZXN1bHQsIF9fY3VyKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXI+CisgICAgaW5saW5lIHBhaXI8X1JhbmRvbUFjY2Vzc0l0ZXIsIF9Gb3J3YXJkSXRlcj4KKyAgICBfX3VuaW5pdGlhbGl6ZWRfY29weV9uKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCisJCQkgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsCisJCQkgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCA9IF9fZmlyc3QgKyBfX2NvdW50OworICAgICAgcmV0dXJuIChwYWlyPF9SYW5kb21BY2Nlc3NJdGVyLCBfRm9yd2FyZEl0ZXI+CisJICAgICAgKF9fbGFzdCwgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCkpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcj4KKyAgICBpbmxpbmUgcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+CisgICAgX191bmluaXRpYWxpemVkX2NvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCisJCQkgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQpCisgICAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3VuaW5pdGlhbGl6ZWRfY29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LAorCQkJCQkgICAgICAgX19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7IH0KKworICAvKioKKyAgICogIEBicmllZiBDb3BpZXMgdGhlIHJhbmdlIFtmaXJzdCxsYXN0KSBpbnRvIHJlc3VsdC4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fY291bnQgIExlbmd0aAorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgX19yZXN1bHQgKyAoX19maXJzdCArIF9fY291bnQpCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqCisgICAqICBMaWtlIGNvcHkoKSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgYW4gaW5pdGlhbGl6ZWQgb3V0cHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyPgorICAgIGlubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcj4KKyAgICB1bmluaXRpYWxpemVkX2NvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCisJCQkgX0ZvcndhcmRJdGVyIF9fcmVzdWx0KQorICAgIHsgcmV0dXJuIF9fZ251X2N4eDo6X191bmluaXRpYWxpemVkX2NvcHlfbihfX2ZpcnN0LCBfX2NvdW50LCBfX3Jlc3VsdCwKKwkJCQkJICAgICAgIF9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOyB9CisKKworICAvLyBBbiBhbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIHVuaW5pdGlhbGl6ZWRfY29weV9uIHRoYXQgY29uc3RydWN0cworICAvLyBhbmQgZGVzdHJveXMgb2JqZWN0cyB3aXRoIGEgdXNlci1wcm92aWRlZCBhbGxvY2F0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+CisgICAgX191bmluaXRpYWxpemVkX2NvcHlfbl9hKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwKKwkJCSAgICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAorCQkJICAgICBfQWxsb2NhdG9yIF9fYWxsb2MpCisgICAgeworICAgICAgX0ZvcndhcmRJdGVyIF9fY3VyID0gX19yZXN1bHQ7CisgICAgICBfX3RyeQorCXsKKwkgIGZvciAoOyBfX2NvdW50ID4gMCA7IC0tX19jb3VudCwgKytfX2ZpcnN0LCArK19fY3VyKQorCSAgICBfX2FsbG9jLmNvbnN0cnVjdCgmKl9fY3VyLCAqX19maXJzdCk7CisJICByZXR1cm4gcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+KF9fZmlyc3QsIF9fY3VyKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fcmVzdWx0LCBfX2N1ciwgX19hbGxvYyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+CisgICAgX191bmluaXRpYWxpemVkX2NvcHlfbl9hKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwKKwkJCSAgICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAorCQkJICAgICBzdGQ6OmFsbG9jYXRvcjxfVHA+KQorICAgIHsKKyAgICAgIHJldHVybiBfX2dudV9jeHg6OnVuaW5pdGlhbGl6ZWRfY29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0KTsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGNsYXNzIHByb3ZpZGVzIHNpbWlsYXIgYmVoYXZpb3IgYW5kIHNlbWFudGljcyBvZiB0aGUgc3RhbmRhcmQKKyAgICogIGZ1bmN0aW9ucyBnZXRfdGVtcG9yYXJ5X2J1ZmZlcigpIGFuZCByZXR1cm5fdGVtcG9yYXJ5X2J1ZmZlcigpLCBidXQKKyAgICogIGVuY2Fwc3VsYXRlZCBpbiBhIHR5cGUgdmFndWVseSByZXNlbWJsaW5nIGEgc3RhbmRhcmQgY29udGFpbmVyLgorICAgKgorICAgKiAgQnkgZGVmYXVsdCwgYSB0ZW1wb3JhcnlfYnVmZmVyPEl0ZXI+IHN0b3JlcyBzcGFjZSBmb3Igb2JqZWN0cyBvZgorICAgKiAgd2hhdGV2ZXIgdHlwZSB0aGUgSXRlciBpdGVyYXRvciBwb2ludHMgdG8uICBJdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIGEKKyAgICogIHR5cGljYWwgW2ZpcnN0LGxhc3QpIHJhbmdlLCBhbmQgcHJvdmlkZXMgdGhlIGJlZ2luKCksIGVuZCgpLCBzaXplKCkKKyAgICogIGZ1bmN0aW9ucywgYXMgd2VsbCBhcyByZXF1ZXN0ZWRfc2l6ZSgpLiAgRm9yIG5vbi10cml2aWFsIHR5cGVzLCBjb3BpZXMKKyAgICogIG9mICpmaXJzdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc3RvcmFnZS4KKyAgICoKKyAgICogIEBjIG1hbGxvYyBpcyB1c2VkIHRvIG9idGFpbiB1bmRlcmx5aW5nIHN0b3JhZ2UuCisgICAqCisgICAqICBMaWtlIGdldF90ZW1wb3JhcnlfYnVmZmVyKCksIG5vdCBhbGwgdGhlIHJlcXVlc3RlZCBtZW1vcnkgbWF5IGJlCisgICAqICBhdmFpbGFibGUuICBJZGVhbGx5LCB0aGUgY3JlYXRlZCBidWZmZXIgd2lsbCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhCisgICAqICBjb3B5IG9mIFtmaXJzdCxsYXN0KSwgYnV0IGlmIHNpemUoKSBpcyBsZXNzIHRoYW4gcmVxdWVzdGVkX3NpemUoKSwKKyAgICogIHRoZW4gdGhpcyBkaWRuJ3QgaGFwcGVuLgorICAgKgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1RwCisJICAgID0gdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUgPgorICAgIHN0cnVjdCB0ZW1wb3JhcnlfYnVmZmVyIDogcHVibGljIF9UZW1wb3JhcnlfYnVmZmVyPF9Gb3J3YXJkSXRlcmF0b3IsIF9UcD4KKyAgICB7CisgICAgICAvLy8gUmVxdWVzdHMgc3RvcmFnZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIGNvcHkgb2YgW2ZpcnN0LGxhc3QpLgorICAgICAgdGVtcG9yYXJ5X2J1ZmZlcihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgICAgOiBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+KF9fZmlyc3QsIF9fbGFzdCkgeyB9CisgICAgICAKKyAgICAgIC8vLyBEZXN0cm95cyBvYmplY3RzIGFuZCBmcmVlcyBzdG9yYWdlLgorICAgICAgfnRlbXBvcmFyeV9idWZmZXIoKSB7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9tdF9hbGxvY2F0b3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L210X2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjE2MjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9tdF9hbGxvY2F0b3IuaApAQCAtMCwwICsxLDc2NiBAQAorLy8gTVQtb3B0aW1pemVkIGFsbG9jYXRvciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L210X2FsbG9jYXRvci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfTVRfQUxMT0NBVE9SX0gKKyNkZWZpbmUgX01UX0FMTE9DQVRPUl9IIDEKKworI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxleHQvYXRvbWljaXR5Lmg+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisKKyAgdHlwZWRlZiB2b2lkICgqX19kZXN0cm95X2hhbmRsZXIpKHZvaWQqKTsKKworICAvLy8gQmFzZSBjbGFzcyBmb3IgcG9vbCBvYmplY3QuCisgIHN0cnVjdCBfX3Bvb2xfYmFzZQorICB7CisgICAgLy8gVXNpbmcgc2hvcnQgaW50IGFzIHR5cGUgZm9yIHRoZSBiaW5tYXAgaW1wbGllcyB3ZSBhcmUgbmV2ZXIKKyAgICAvLyBjYWNoaW5nIGJsb2NrcyBsYXJnZXIgdGhhbiAzMjc2OCB3aXRoIHRoaXMgYWxsb2NhdG9yLgorICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IF9CaW5tYXBfdHlwZTsKKworICAgIC8vIFZhcmlhYmxlcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGFsbG9jYXRvciwKKyAgICAvLyBhc3NpZ25lZCBhbmQgZXhwbGFpbmVkIGluIGRldGFpbCBiZWxvdy4KKyAgICBzdHJ1Y3QgX1R1bmUKKyAgICAgeworICAgICAgLy8gQ29tcGlsZSB0aW1lIGNvbnN0YW50cyBmb3IgdGhlIGRlZmF1bHQgX1R1bmUgdmFsdWVzLgorICAgICAgZW51bSB7IF9TX2FsaWduID0gOCB9OworICAgICAgZW51bSB7IF9TX21heF9ieXRlcyA9IDEyOCB9OworICAgICAgZW51bSB7IF9TX21pbl9iaW4gPSA4IH07CisgICAgICBlbnVtIHsgX1NfY2h1bmtfc2l6ZSA9IDQwOTYgLSA0ICogc2l6ZW9mKHZvaWQqKSB9OworICAgICAgZW51bSB7IF9TX21heF90aHJlYWRzID0gNDA5NiB9OworICAgICAgZW51bSB7IF9TX2ZyZWVsaXN0X2hlYWRyb29tID0gMTAgfTsKKworICAgICAgLy8gQWxpZ25tZW50IG5lZWRlZC4KKyAgICAgIC8vIE5COiBJbiBhbnkgY2FzZSBtdXN0IGJlID49IHNpemVvZihfQmxvY2tfcmVjb3JkKSwgdGhhdAorICAgICAgLy8gaXMgNCBvbiAzMiBiaXQgbWFjaGluZXMgYW5kIDggb24gNjQgYml0IG1hY2hpbmVzLgorICAgICAgc2l6ZV90CV9NX2FsaWduOworICAgICAgCisgICAgICAvLyBBbGxvY2F0aW9uIHJlcXVlc3RzIChhZnRlciByb3VuZC11cCB0byBwb3dlciBvZiAyKSBiZWxvdworICAgICAgLy8gdGhpcyB2YWx1ZSB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGFsbG9jYXRvci4gQSByYXcgbmV3LworICAgICAgLy8gY2FsbCB3aWxsIGJlIHVzZWQgZm9yIHJlcXVlc3RzIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUuCisgICAgICAvLyBOQjogTXVzdCBiZSBtdWNoIHNtYWxsZXIgdGhhbiBfTV9jaHVua19zaXplIGFuZCBpbiBhbnkKKyAgICAgIC8vIGNhc2UgPD0gMzI3NjguCisgICAgICBzaXplX3QJX01fbWF4X2J5dGVzOyAKKworICAgICAgLy8gU2l6ZSBpbiBieXRlcyBvZiB0aGUgc21hbGxlc3QgYmluLgorICAgICAgLy8gTkI6IE11c3QgYmUgYSBwb3dlciBvZiAyIGFuZCA+PSBfTV9hbGlnbiAoYW5kIG9mIGNvdXJzZQorICAgICAgLy8gbXVjaCBzbWFsbGVyIHRoYW4gX01fbWF4X2J5dGVzKS4KKyAgICAgIHNpemVfdAlfTV9taW5fYmluOworCisgICAgICAvLyBJbiBvcmRlciB0byBhdm9pZCBmcmFnbWVudGluZyBhbmQgbWluaW1pemUgdGhlIG51bWJlciBvZgorICAgICAgLy8gbmV3KCkgY2FsbHMgd2UgYWx3YXlzIHJlcXVlc3QgbmV3IG1lbW9yeSB1c2luZyB0aGlzCisgICAgICAvLyB2YWx1ZS4gQmFzZWQgb24gcHJldmlvdXMgZGlzY3Vzc2lvbnMgb24gdGhlIGxpYnN0ZGMrKworICAgICAgLy8gbWFpbGluZyBsaXN0IHdlIGhhdmUgY2hvc2VuIHRoZSB2YWx1ZSBiZWxvdy4KKyAgICAgIC8vIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvbWwvbGlic3RkYysrLzIwMDEtMDcvbXNnMDAwNzcuaHRtbAorICAgICAgLy8gTkI6IEF0IGxlYXN0IG9uZSBvcmRlciBvZiBtYWduaXR1ZGUgPiBfTV9tYXhfYnl0ZXMuIAorICAgICAgc2l6ZV90CV9NX2NodW5rX3NpemU7CisKKyAgICAgIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgdGhyZWFkcy4gRm9yCisgICAgICAvLyBzaW5nbGUtdGhyZWFkZWQgb3BlcmF0aW9uLCB1c2Ugb25lLiBNYXhpbXVtIHZhbHVlcyB3aWxsCisgICAgICAvLyB2YXJ5IGRlcGVuZGluZyBvbiBkZXRhaWxzIG9mIHRoZSB1bmRlcmx5aW5nIHN5c3RlbS4gKEZvcgorICAgICAgLy8gaW5zdGFuY2UsIExpbnV4IDIuNC4xOCByZXBvcnRzIDQwNzAgaW4KKyAgICAgIC8vIC9wcm9jL3N5cy9rZXJuZWwvdGhyZWFkcy1tYXgsIHdoaWxlIExpbnV4IDIuNi42IHJlcG9ydHMKKyAgICAgIC8vIDY1NTM0KQorICAgICAgc2l6ZV90IAlfTV9tYXhfdGhyZWFkczsKKworICAgICAgLy8gRWFjaCB0aW1lIGEgZGVhbGxvY2F0aW9uIG9jY3VycyBpbiBhIHRocmVhZGVkIGFwcGxpY2F0aW9uCisgICAgICAvLyB3ZSBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuCisgICAgICAvLyBfTV9mcmVlbGlzdF9oZWFkcm9vbSAlIG9mIHVzZWQgbWVtb3J5IG9uIHRoZSBmcmVlbGlzdC4gSWYKKyAgICAgIC8vIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCByZWNvcmRzIGlzIG1vcmUgdGhhbgorICAgICAgLy8gX01fZnJlZWxpc3RfaGVhZHJvb20gJSBvZiB0aGUgZnJlZWxpc3QsIHdlIG1vdmUgdGhlc2UKKyAgICAgIC8vIHJlY29yZHMgYmFjayB0byB0aGUgZ2xvYmFsIHBvb2wuCisgICAgICBzaXplX3QgCV9NX2ZyZWVsaXN0X2hlYWRyb29tOworICAgICAgCisgICAgICAvLyBTZXQgdG8gdHJ1ZSBmb3JjZXMgYWxsIGFsbG9jYXRpb25zIHRvIHVzZSBuZXcoKS4KKyAgICAgIGJvb2wgCV9NX2ZvcmNlX25ldzsgCisgICAgICAKKyAgICAgIGV4cGxpY2l0CisgICAgICBfVHVuZSgpCisgICAgICA6IF9NX2FsaWduKF9TX2FsaWduKSwgX01fbWF4X2J5dGVzKF9TX21heF9ieXRlcyksIF9NX21pbl9iaW4oX1NfbWluX2JpbiksCisgICAgICBfTV9jaHVua19zaXplKF9TX2NodW5rX3NpemUpLCBfTV9tYXhfdGhyZWFkcyhfU19tYXhfdGhyZWFkcyksIAorICAgICAgX01fZnJlZWxpc3RfaGVhZHJvb20oX1NfZnJlZWxpc3RfaGVhZHJvb20pLCAKKyAgICAgIF9NX2ZvcmNlX25ldyhzdGQ6OmdldGVudigiR0xJQkNYWF9GT1JDRV9ORVciKSA/IHRydWUgOiBmYWxzZSkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgX1R1bmUoc2l6ZV90IF9fYWxpZ24sIHNpemVfdCBfX21heGIsIHNpemVfdCBfX21pbmJpbiwgc2l6ZV90IF9fY2h1bmssIAorCSAgICBzaXplX3QgX19tYXh0aHJlYWRzLCBzaXplX3QgX19oZWFkcm9vbSwgYm9vbCBfX2ZvcmNlKSAKKyAgICAgIDogX01fYWxpZ24oX19hbGlnbiksIF9NX21heF9ieXRlcyhfX21heGIpLCBfTV9taW5fYmluKF9fbWluYmluKSwKKyAgICAgIF9NX2NodW5rX3NpemUoX19jaHVuayksIF9NX21heF90aHJlYWRzKF9fbWF4dGhyZWFkcyksCisgICAgICBfTV9mcmVlbGlzdF9oZWFkcm9vbShfX2hlYWRyb29tKSwgX01fZm9yY2VfbmV3KF9fZm9yY2UpCisgICAgICB7IH0KKyAgICB9OworICAgIAorICAgIHN0cnVjdCBfQmxvY2tfYWRkcmVzcworICAgIHsKKyAgICAgIHZvaWQqIAkJCV9NX2luaXRpYWw7CisgICAgICBfQmxvY2tfYWRkcmVzcyogCQlfTV9uZXh0OworICAgIH07CisgICAgCisgICAgY29uc3QgX1R1bmUmCisgICAgX01fZ2V0X29wdGlvbnMoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX29wdGlvbnM7IH0KKworICAgIHZvaWQKKyAgICBfTV9zZXRfb3B0aW9ucyhfVHVuZSBfX3QpCisgICAgeyAKKyAgICAgIGlmICghX01faW5pdCkKKwlfTV9vcHRpb25zID0gX190OworICAgIH0KKworICAgIGJvb2wKKyAgICBfTV9jaGVja190aHJlc2hvbGQoc2l6ZV90IF9fYnl0ZXMpCisgICAgeyByZXR1cm4gX19ieXRlcyA+IF9NX29wdGlvbnMuX01fbWF4X2J5dGVzIHx8IF9NX29wdGlvbnMuX01fZm9yY2VfbmV3OyB9CisKKyAgICBzaXplX3QKKyAgICBfTV9nZXRfYmlubWFwKHNpemVfdCBfX2J5dGVzKQorICAgIHsgcmV0dXJuIF9NX2Jpbm1hcFtfX2J5dGVzXTsgfQorCisgICAgc2l6ZV90CisgICAgX01fZ2V0X2FsaWduKCkKKyAgICB7IHJldHVybiBfTV9vcHRpb25zLl9NX2FsaWduOyB9CisKKyAgICBleHBsaWNpdCAKKyAgICBfX3Bvb2xfYmFzZSgpIAorICAgIDogX01fb3B0aW9ucyhfVHVuZSgpKSwgX01fYmlubWFwKDApLCBfTV9pbml0KGZhbHNlKSB7IH0KKworICAgIGV4cGxpY2l0IAorICAgIF9fcG9vbF9iYXNlKGNvbnN0IF9UdW5lJiBfX29wdGlvbnMpCisgICAgOiBfTV9vcHRpb25zKF9fb3B0aW9ucyksIF9NX2Jpbm1hcCgwKSwgX01faW5pdChmYWxzZSkgeyB9CisKKyAgcHJpdmF0ZToKKyAgICBleHBsaWNpdCAKKyAgICBfX3Bvb2xfYmFzZShjb25zdCBfX3Bvb2xfYmFzZSYpOworCisgICAgX19wb29sX2Jhc2UmCisgICAgb3BlcmF0b3I9KGNvbnN0IF9fcG9vbF9iYXNlJik7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIENvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAgICBfVHVuZSAJICAgICAgIAkJX01fb3B0aW9uczsKKyAgICAKKyAgICBfQmlubWFwX3R5cGUqIAkJX01fYmlubWFwOworCisgICAgLy8gQ29uZmlndXJhdGlvbiBvZiB0aGUgcG9vbCBvYmplY3QgdmlhIF9NX29wdGlvbnMgY2FuIGhhcHBlbgorICAgIC8vIGFmdGVyIGNvbnN0cnVjdGlvbiBidXQgYmVmb3JlIGluaXRpYWxpemF0aW9uLiBBZnRlcgorICAgIC8vIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLCB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byB0cnVlLgorICAgIGJvb2wgCQkJX01faW5pdDsKKyAgfTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmICBEYXRhIGRlc2NyaWJpbmcgdGhlIHVuZGVybHlpbmcgbWVtb3J5IHBvb2wsIHBhcmFtZXRlcml6ZWQgb24KKyAgICogIHRocmVhZGluZyBzdXBwb3J0LgorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfVGhyZWFkPgorICAgIGNsYXNzIF9fcG9vbDsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIHNpbmdsZSB0aHJlYWQuCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBfX3Bvb2w8ZmFsc2U+IDogcHVibGljIF9fcG9vbF9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHVuaW9uIF9CbG9ja19yZWNvcmQKKyAgICAgIHsKKwkvLyBQb2ludHMgdG8gdGhlIGJsb2NrX3JlY29yZCBvZiB0aGUgbmV4dCBmcmVlIGJsb2NrLgorCV9CbG9ja19yZWNvcmQqIAkJCV9NX25leHQ7CisgICAgICB9OworCisgICAgICBzdHJ1Y3QgX0Jpbl9yZWNvcmQKKyAgICAgIHsKKwkvLyBBbiAiYXJyYXkiIG9mIHBvaW50ZXJzIHRvIHRoZSBmaXJzdCBmcmVlIGJsb2NrLgorCV9CbG9ja19yZWNvcmQqKgkJCV9NX2ZpcnN0OworCisJLy8gQSBsaXN0IG9mIHRoZSBpbml0aWFsIGFkZHJlc3NlcyBvZiBhbGwgYWxsb2NhdGVkIGJsb2Nrcy4KKwlfQmxvY2tfYWRkcmVzcyoJCSAgICAgCV9NX2FkZHJlc3M7CisgICAgICB9OworICAgICAgCisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplX29uY2UoKQorICAgICAgeworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9NX2luaXQgPT0gZmFsc2UsIGZhbHNlKSkKKwkgIF9NX2luaXRpYWxpemUoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZGVzdHJveSgpIHRocm93KCk7CisKKyAgICAgIGNoYXIqIAorICAgICAgX01fcmVzZXJ2ZV9ibG9jayhzaXplX3QgX19ieXRlcywgY29uc3Qgc2l6ZV90IF9fdGhyZWFkX2lkKTsKKyAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX3JlY2xhaW1fYmxvY2soY2hhciogX19wLCBzaXplX3QgX19ieXRlcykgdGhyb3cgKCk7CisgICAgCisgICAgICBzaXplX3QgCisgICAgICBfTV9nZXRfdGhyZWFkX2lkKCkgeyByZXR1cm4gMDsgfQorICAgICAgCisgICAgICBjb25zdCBfQmluX3JlY29yZCYKKyAgICAgIF9NX2dldF9iaW4oc2l6ZV90IF9fd2hpY2gpCisgICAgICB7IHJldHVybiBfTV9iaW5bX193aGljaF07IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgX01fYWRqdXN0X2ZyZWVsaXN0KGNvbnN0IF9CaW5fcmVjb3JkJiwgX0Jsb2NrX3JlY29yZCosIHNpemVfdCkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdCBfX3Bvb2woKSAKKyAgICAgIDogX01fYmluKDApLCBfTV9iaW5fc2l6ZSgxKSB7IH0KKworICAgICAgZXhwbGljaXQgX19wb29sKGNvbnN0IF9fcG9vbF9iYXNlOjpfVHVuZSYgX190dW5lKSAKKyAgICAgIDogX19wb29sX2Jhc2UoX190dW5lKSwgX01fYmluKDApLCBfTV9iaW5fc2l6ZSgxKSB7IH0KKworICAgIHByaXZhdGU6CisgICAgICAvLyBBbiAiYXJyYXkiIG9mIGJpbl9yZWNvcmRzIGVhY2ggb2Ygd2hpY2ggcmVwcmVzZW50cyBhIHNwZWNpZmljCisgICAgICAvLyBwb3dlciBvZiAyIHNpemUuIE1lbW9yeSB0byB0aGlzICJhcnJheSIgaXMgYWxsb2NhdGVkIGluCisgICAgICAvLyBfTV9pbml0aWFsaXplKCkuCisgICAgICBfQmluX3JlY29yZCoJCSBfTV9iaW47CisgICAgICAKKyAgICAgIC8vIEFjdHVhbCB2YWx1ZSBjYWxjdWxhdGVkIGluIF9NX2luaXRpYWxpemUoKS4KKyAgICAgIHNpemVfdCAJICAgICAgIAkgICAgIAlfTV9iaW5fc2l6ZTsgICAgIAorCisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplKCk7CisgIH07CisgCisjaWZkZWYgX19HVEhSRUFEUworICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIHRocmVhZCBlbmFibGVkLCB2aWEgZ3RocmVhZHMuaC4KKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIF9fcG9vbDx0cnVlPiA6IHB1YmxpYyBfX3Bvb2xfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBFYWNoIHJlcXVlc3RpbmcgdGhyZWFkIGlzIGFzc2lnbmVkIGFuIGlkIHJhbmdpbmcgZnJvbSAxIHRvCisgICAgICAvLyBfU19tYXhfdGhyZWFkcy4gVGhyZWFkIGlkIDAgaXMgdXNlZCBhcyBhIGdsb2JhbCBtZW1vcnkgcG9vbC4KKyAgICAgIC8vIEluIG9yZGVyIHRvIGdldCBjb25zdGFudCBwZXJmb3JtYW5jZSBvbiB0aGUgdGhyZWFkIGFzc2lnbm1lbnQKKyAgICAgIC8vIHJvdXRpbmUsIHdlIGtlZXAgYSBsaXN0IG9mIGZyZWUgaWRzLiBXaGVuIGEgdGhyZWFkIGZpcnN0CisgICAgICAvLyByZXF1ZXN0cyBtZW1vcnkgd2UgcmVtb3ZlIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhpcyBsaXN0IGFuZAorICAgICAgLy8gc3RvcmVzIHRoZSBhZGRyZXNzIGluIGEgX19ndGhyZWFkX2tleS4gV2hlbiBpbml0aWFsaXppbmcgdGhlCisgICAgICAvLyBfX2d0aHJlYWRfa2V5IHdlIHNwZWNpZnkgYSBkZXN0cnVjdG9yLiBXaGVuIHRoaXMgZGVzdHJ1Y3RvcgorICAgICAgLy8gKGkuZS4gdGhlIHRocmVhZCBkaWVzKSBpcyBjYWxsZWQsIHdlIHJldHVybiB0aGUgdGhyZWFkIGlkIHRvCisgICAgICAvLyB0aGUgZnJvbnQgb2YgdGhpcyBsaXN0LgorICAgICAgc3RydWN0IF9UaHJlYWRfcmVjb3JkCisgICAgICB7CisJLy8gUG9pbnRzIHRvIG5leHQgZnJlZSB0aHJlYWQgaWQgcmVjb3JkLiBOVUxMIGlmIGxhc3QgcmVjb3JkIGluIGxpc3QuCisJX1RocmVhZF9yZWNvcmQqCQkJX01fbmV4dDsKKwkKKwkvLyBUaHJlYWQgaWQgcmFuZ2luZyBmcm9tIDEgdG8gX1NfbWF4X3RocmVhZHMuCisJc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9pZDsKKyAgICAgIH07CisgICAgICAKKyAgICAgIHVuaW9uIF9CbG9ja19yZWNvcmQKKyAgICAgIHsKKwkvLyBQb2ludHMgdG8gdGhlIGJsb2NrX3JlY29yZCBvZiB0aGUgbmV4dCBmcmVlIGJsb2NrLgorCV9CbG9ja19yZWNvcmQqCQkJX01fbmV4dDsKKwkKKwkvLyBUaGUgdGhyZWFkIGlkIG9mIHRoZSB0aHJlYWQgd2hpY2ggaGFzIHJlcXVlc3RlZCB0aGlzIGJsb2NrLgorCXNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgX01fdGhyZWFkX2lkOworICAgICAgfTsKKyAgICAgIAorICAgICAgc3RydWN0IF9CaW5fcmVjb3JkCisgICAgICB7CisJLy8gQW4gImFycmF5IiBvZiBwb2ludGVycyB0byB0aGUgZmlyc3QgZnJlZSBibG9jayBmb3IgZWFjaAorCS8vIHRocmVhZCBpZC4gTWVtb3J5IHRvIHRoaXMgImFycmF5IiBpcyBhbGxvY2F0ZWQgaW4KKwkvLyBfU19pbml0aWFsaXplKCkgZm9yIF9TX21heF90aHJlYWRzICsgZ2xvYmFsIHBvb2wgMC4KKwlfQmxvY2tfcmVjb3JkKioJCQlfTV9maXJzdDsKKwkKKwkvLyBBIGxpc3Qgb2YgdGhlIGluaXRpYWwgYWRkcmVzc2VzIG9mIGFsbCBhbGxvY2F0ZWQgYmxvY2tzLgorCV9CbG9ja19hZGRyZXNzKgkJICAgICAJX01fYWRkcmVzczsKKworCS8vIEFuICJhcnJheSIgb2YgY291bnRlcnMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBhbW91bnQgb2YKKwkvLyBibG9ja3MgdGhhdCBhcmUgb24gdGhlIGZyZWVsaXN0L3VzZWQgZm9yIGVhY2ggdGhyZWFkIGlkLgorCS8vIC0gTm90ZSB0aGF0IHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgYWxsb2NhdGVkIF9NX3VzZWQgImFycmF5IgorCS8vICAgYWN0dWFsbHkgaG9zdHMgKGF0b21pYykgY291bnRlcnMgb2YgcmVjbGFpbWVkIGJsb2NrczogIGluCisJLy8gICBfTV9yZXNlcnZlX2Jsb2NrIGFuZCBpbiBfTV9yZWNsYWltX2Jsb2NrIHRob3NlIG51bWJlcnMgYXJlCisJLy8gICBzdWJ0cmFjdGVkIGZyb20gdGhlIGZpcnN0IG9uZXMgdG8gb2J0YWluIHRoZSBhY3R1YWwgc2l6ZQorCS8vICAgb2YgdGhlICJ3b3JraW5nIHNldCIgb2YgdGhlIGdpdmVuIHRocmVhZC4KKwkvLyAtIE1lbW9yeSB0byB0aGVzZSAiYXJyYXlzIiBpcyBhbGxvY2F0ZWQgaW4gX1NfaW5pdGlhbGl6ZSgpCisJLy8gICBmb3IgX1NfbWF4X3RocmVhZHMgKyBnbG9iYWwgcG9vbCAwLgorCXNpemVfdCoJCQkJX01fZnJlZTsKKwlzaXplX3QqCQkJICAgICAgICBfTV91c2VkOworCQorCS8vIEVhY2ggYmluIGhhcyBpdHMgb3duIG11dGV4IHdoaWNoIGlzIHVzZWQgdG8gZW5zdXJlIGRhdGEKKwkvLyBpbnRlZ3JpdHkgd2hpbGUgY2hhbmdpbmcgIm93bmVyc2hpcCIgb24gYSBibG9jay4gIFRoZSBtdXRleAorCS8vIGlzIGluaXRpYWxpemVkIGluIF9TX2luaXRpYWxpemUoKS4KKwlfX2d0aHJlYWRfbXV0ZXhfdCogICAgICAgICAgICAgIF9NX211dGV4OworICAgICAgfTsKKyAgICAgIAorICAgICAgLy8gWFhYIEdMSUJDWFhfQUJJIERlcHJlY2F0ZWQKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemUoX19kZXN0cm95X2hhbmRsZXIpOworCisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplX29uY2UoKQorICAgICAgeworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9NX2luaXQgPT0gZmFsc2UsIGZhbHNlKSkKKwkgIF9NX2luaXRpYWxpemUoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZGVzdHJveSgpIHRocm93KCk7CisKKyAgICAgIGNoYXIqIAorICAgICAgX01fcmVzZXJ2ZV9ibG9jayhzaXplX3QgX19ieXRlcywgY29uc3Qgc2l6ZV90IF9fdGhyZWFkX2lkKTsKKyAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX3JlY2xhaW1fYmxvY2soY2hhciogX19wLCBzaXplX3QgX19ieXRlcykgdGhyb3cgKCk7CisgICAgCisgICAgICBjb25zdCBfQmluX3JlY29yZCYKKyAgICAgIF9NX2dldF9iaW4oc2l6ZV90IF9fd2hpY2gpCisgICAgICB7IHJldHVybiBfTV9iaW5bX193aGljaF07IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgX01fYWRqdXN0X2ZyZWVsaXN0KGNvbnN0IF9CaW5fcmVjb3JkJiBfX2JpbiwgX0Jsb2NrX3JlY29yZCogX19ibG9jaywgCisJCQkgc2l6ZV90IF9fdGhyZWFkX2lkKQorICAgICAgeworCWlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKwkgIHsKKwkgICAgX19ibG9jay0+X01fdGhyZWFkX2lkID0gX190aHJlYWRfaWQ7CisJICAgIC0tX19iaW4uX01fZnJlZVtfX3RocmVhZF9pZF07CisJICAgICsrX19iaW4uX01fdXNlZFtfX3RocmVhZF9pZF07CisJICB9CisgICAgICB9CisKKyAgICAgIC8vIFhYWCBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisgICAgICBfR0xJQkNYWF9DT05TVCB2b2lkIAorICAgICAgX01fZGVzdHJveV90aHJlYWRfa2V5KHZvaWQqKSB0aHJvdyAoKTsKKworICAgICAgc2l6ZV90IAorICAgICAgX01fZ2V0X3RocmVhZF9pZCgpOworCisgICAgICBleHBsaWNpdCBfX3Bvb2woKSAKKyAgICAgIDogX01fYmluKDApLCBfTV9iaW5fc2l6ZSgxKSwgX01fdGhyZWFkX2ZyZWVsaXN0KDApIAorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0IF9fcG9vbChjb25zdCBfX3Bvb2xfYmFzZTo6X1R1bmUmIF9fdHVuZSkgCisgICAgICA6IF9fcG9vbF9iYXNlKF9fdHVuZSksIF9NX2JpbigwKSwgX01fYmluX3NpemUoMSksIAorCV9NX3RocmVhZF9mcmVlbGlzdCgwKSAKKyAgICAgIHsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIEFuICJhcnJheSIgb2YgYmluX3JlY29yZHMgZWFjaCBvZiB3aGljaCByZXByZXNlbnRzIGEgc3BlY2lmaWMKKyAgICAgIC8vIHBvd2VyIG9mIDIgc2l6ZS4gTWVtb3J5IHRvIHRoaXMgImFycmF5IiBpcyBhbGxvY2F0ZWQgaW4KKyAgICAgIC8vIF9NX2luaXRpYWxpemUoKS4KKyAgICAgIF9CaW5fcmVjb3JkKgkJX01fYmluOworCisgICAgICAvLyBBY3R1YWwgdmFsdWUgY2FsY3VsYXRlZCBpbiBfTV9pbml0aWFsaXplKCkuCisgICAgICBzaXplX3QgCSAgICAgICAJICAgICAJX01fYmluX3NpemU7CisKKyAgICAgIF9UaHJlYWRfcmVjb3JkKiAJCV9NX3RocmVhZF9mcmVlbGlzdDsKKyAgICAgIHZvaWQqCQkJX01fdGhyZWFkX2ZyZWVsaXN0X2luaXRpYWw7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemUoKTsKKyAgICB9OworI2VuZGlmCisKKyAgdGVtcGxhdGU8dGVtcGxhdGUgPGJvb2w+IGNsYXNzIF9Qb29sVHAsIGJvb2wgX1RocmVhZD4KKyAgICBzdHJ1Y3QgX19jb21tb25fcG9vbAorICAgIHsKKyAgICAgIHR5cGVkZWYgX1Bvb2xUcDxfVGhyZWFkPiAJCXBvb2xfdHlwZTsKKyAgICAgIAorICAgICAgc3RhdGljIHBvb2xfdHlwZSYKKyAgICAgIF9TX2dldF9wb29sKCkKKyAgICAgIHsgCisJc3RhdGljIHBvb2xfdHlwZSBfU19wb29sOworCXJldHVybiBfU19wb29sOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dGVtcGxhdGUgPGJvb2w+IGNsYXNzIF9Qb29sVHAsIGJvb2wgX1RocmVhZD4KKyAgICBzdHJ1Y3QgX19jb21tb25fcG9vbF9iYXNlOworCisgIHRlbXBsYXRlPHRlbXBsYXRlIDxib29sPiBjbGFzcyBfUG9vbFRwPgorICAgIHN0cnVjdCBfX2NvbW1vbl9wb29sX2Jhc2U8X1Bvb2xUcCwgZmFsc2U+IAorICAgIDogcHVibGljIF9fY29tbW9uX3Bvb2w8X1Bvb2xUcCwgZmFsc2U+CisgICAgeworICAgICAgdXNpbmcgIF9fY29tbW9uX3Bvb2w8X1Bvb2xUcCwgZmFsc2U+OjpfU19nZXRfcG9vbDsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2luaXRpYWxpemVfb25jZSgpCisgICAgICB7CisJc3RhdGljIGJvb2wgX19pbml0OworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9faW5pdCA9PSBmYWxzZSwgZmFsc2UpKQorCSAgeworCSAgICBfU19nZXRfcG9vbCgpLl9NX2luaXRpYWxpemVfb25jZSgpOyAKKwkgICAgX19pbml0ID0gdHJ1ZTsKKwkgIH0KKyAgICAgIH0KKyAgICB9OworCisjaWZkZWYgX19HVEhSRUFEUworICB0ZW1wbGF0ZTx0ZW1wbGF0ZSA8Ym9vbD4gY2xhc3MgX1Bvb2xUcD4KKyAgICBzdHJ1Y3QgX19jb21tb25fcG9vbF9iYXNlPF9Qb29sVHAsIHRydWU+CisgICAgOiBwdWJsaWMgX19jb21tb25fcG9vbDxfUG9vbFRwLCB0cnVlPgorICAgIHsKKyAgICAgIHVzaW5nICBfX2NvbW1vbl9wb29sPF9Qb29sVHAsIHRydWU+OjpfU19nZXRfcG9vbDsKKyAgICAgIAorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2luaXRpYWxpemUoKSAKKyAgICAgIHsgX1NfZ2V0X3Bvb2woKS5fTV9pbml0aWFsaXplX29uY2UoKTsgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfaW5pdGlhbGl6ZV9vbmNlKCkKKyAgICAgIHsgCisJc3RhdGljIGJvb2wgX19pbml0OworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9faW5pdCA9PSBmYWxzZSwgZmFsc2UpKQorCSAgeworCSAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJICAgICAgeworCQkvLyBPbiBzb21lIHBsYXRmb3JtcywgX19ndGhyZWFkX29uY2VfdCBpcyBhbiBhZ2dyZWdhdGUuCisJCXN0YXRpYyBfX2d0aHJlYWRfb25jZV90IF9fb25jZSA9IF9fR1RIUkVBRF9PTkNFX0lOSVQ7CisJCV9fZ3RocmVhZF9vbmNlKCZfX29uY2UsIF9TX2luaXRpYWxpemUpOworCSAgICAgIH0KKworCSAgICAvLyBEb3VibGUgY2hlY2sgaW5pdGlhbGl6YXRpb24uIE1heSBiZSBuZWNlc3Nhcnkgb24gc29tZQorCSAgICAvLyBzeXN0ZW1zIGZvciBwcm9wZXIgY29uc3RydWN0aW9uIHdoZW4gbm90IGNvbXBpbGluZyB3aXRoCisJICAgIC8vIHRocmVhZCBmbGFncy4KKwkgICAgX1NfZ2V0X3Bvb2woKS5fTV9pbml0aWFsaXplX29uY2UoKTsgCisJICAgIF9faW5pdCA9IHRydWU7CisJICB9CisgICAgICB9CisgICAgfTsKKyNlbmRpZgorCisgIC8vLyBQb2xpY3kgZm9yIHNoYXJlZCBfX3Bvb2wgb2JqZWN0cy4KKyAgdGVtcGxhdGU8dGVtcGxhdGUgPGJvb2w+IGNsYXNzIF9Qb29sVHAsIGJvb2wgX1RocmVhZD4KKyAgICBzdHJ1Y3QgX19jb21tb25fcG9vbF9wb2xpY3kgOiBwdWJsaWMgX19jb21tb25fcG9vbF9iYXNlPF9Qb29sVHAsIF9UaHJlYWQ+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdGVtcGxhdGUgPGJvb2w+IGNsYXNzIF9Qb29sVHAxID0gX1Bvb2xUcCwgCisJICAgICAgIGJvb2wgX1RocmVhZDEgPSBfVGhyZWFkPgorICAgICAgICBzdHJ1Y3QgX01fcmViaW5kCisgICAgICAgIHsgdHlwZWRlZiBfX2NvbW1vbl9wb29sX3BvbGljeTxfUG9vbFRwMSwgX1RocmVhZDE+IG90aGVyOyB9OworCisgICAgICB1c2luZyAgX19jb21tb25fcG9vbF9iYXNlPF9Qb29sVHAsIF9UaHJlYWQ+OjpfU19nZXRfcG9vbDsKKyAgICAgIHVzaW5nICBfX2NvbW1vbl9wb29sX2Jhc2U8X1Bvb2xUcCwgX1RocmVhZD46Ol9TX2luaXRpYWxpemVfb25jZTsKKyAgfTsKKyAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHRlbXBsYXRlIDxib29sPiBjbGFzcyBfUG9vbFRwLCBib29sIF9UaHJlYWQ+CisgICAgc3RydWN0IF9fcGVyX3R5cGVfcG9vbAorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwIAkJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Qb29sVHA8X1RocmVhZD4gCQlwb29sX3R5cGU7CisgICAgICAKKyAgICAgIHN0YXRpYyBwb29sX3R5cGUmCisgICAgICBfU19nZXRfcG9vbCgpCisgICAgICB7IAorCS8vIFNhbmUgZGVmYXVsdHMgZm9yIHRoZSBfUG9vbFRwLgorCXR5cGVkZWYgdHlwZW5hbWUgcG9vbF90eXBlOjpfQmxvY2tfcmVjb3JkIF9CbG9ja19yZWNvcmQ7CisJY29uc3Qgc3RhdGljIHNpemVfdCBfX2EgPSAoX19hbGlnbm9mX18oX1RwKSA+PSBzaXplb2YoX0Jsb2NrX3JlY29yZCkKKwkJCQkgICA/IF9fYWxpZ25vZl9fKF9UcCkgOiBzaXplb2YoX0Jsb2NrX3JlY29yZCkpOworCisJdHlwZWRlZiB0eXBlbmFtZSBfX3Bvb2xfYmFzZTo6X1R1bmUgX1R1bmU7CisJc3RhdGljIF9UdW5lIF9TX3R1bmUoX19hLCBzaXplb2YoX1RwKSAqIDY0LAorCQkJICAgICBzaXplb2YoX1RwKSAqIDIgPj0gX19hID8gc2l6ZW9mKF9UcCkgKiAyIDogX19hLAorCQkJICAgICBzaXplb2YoX1RwKSAqIHNpemVfdChfVHVuZTo6X1NfY2h1bmtfc2l6ZSksCisJCQkgICAgIF9UdW5lOjpfU19tYXhfdGhyZWFkcywKKwkJCSAgICAgX1R1bmU6Ol9TX2ZyZWVsaXN0X2hlYWRyb29tLAorCQkJICAgICBzdGQ6OmdldGVudigiR0xJQkNYWF9GT1JDRV9ORVciKSA/IHRydWUgOiBmYWxzZSk7CisJc3RhdGljIHBvb2xfdHlwZSBfU19wb29sKF9TX3R1bmUpOworCXJldHVybiBfU19wb29sOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0ZW1wbGF0ZSA8Ym9vbD4gY2xhc3MgX1Bvb2xUcCwgYm9vbCBfVGhyZWFkPgorICAgIHN0cnVjdCBfX3Blcl90eXBlX3Bvb2xfYmFzZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHRlbXBsYXRlIDxib29sPiBjbGFzcyBfUG9vbFRwPgorICAgIHN0cnVjdCBfX3Blcl90eXBlX3Bvb2xfYmFzZTxfVHAsIF9Qb29sVHAsIGZhbHNlPiAKKyAgICA6IHB1YmxpYyBfX3Blcl90eXBlX3Bvb2w8X1RwLCBfUG9vbFRwLCBmYWxzZT4gCisgICAgeworICAgICAgdXNpbmcgIF9fcGVyX3R5cGVfcG9vbDxfVHAsIF9Qb29sVHAsIGZhbHNlPjo6X1NfZ2V0X3Bvb2w7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19pbml0aWFsaXplX29uY2UoKQorICAgICAgeworCXN0YXRpYyBib29sIF9faW5pdDsKKwlpZiAoX19idWlsdGluX2V4cGVjdChfX2luaXQgPT0gZmFsc2UsIGZhbHNlKSkKKwkgIHsKKwkgICAgX1NfZ2V0X3Bvb2woKS5fTV9pbml0aWFsaXplX29uY2UoKTsgCisJICAgIF9faW5pdCA9IHRydWU7CisJICB9CisgICAgICB9CisgICAgfTsKKworICNpZmRlZiBfX0dUSFJFQURTCisgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0ZW1wbGF0ZSA8Ym9vbD4gY2xhc3MgX1Bvb2xUcD4KKyAgICBzdHJ1Y3QgX19wZXJfdHlwZV9wb29sX2Jhc2U8X1RwLCBfUG9vbFRwLCB0cnVlPiAKKyAgICA6IHB1YmxpYyBfX3Blcl90eXBlX3Bvb2w8X1RwLCBfUG9vbFRwLCB0cnVlPiAKKyAgICB7CisgICAgICB1c2luZyAgX19wZXJfdHlwZV9wb29sPF9UcCwgX1Bvb2xUcCwgdHJ1ZT46Ol9TX2dldF9wb29sOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfaW5pdGlhbGl6ZSgpIAorICAgICAgeyBfU19nZXRfcG9vbCgpLl9NX2luaXRpYWxpemVfb25jZSgpOyB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19pbml0aWFsaXplX29uY2UoKQorICAgICAgeyAKKwlzdGF0aWMgYm9vbCBfX2luaXQ7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX19pbml0ID09IGZhbHNlLCBmYWxzZSkpCisJICB7CisJICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKwkgICAgICB7CisJCS8vIE9uIHNvbWUgcGxhdGZvcm1zLCBfX2d0aHJlYWRfb25jZV90IGlzIGFuIGFnZ3JlZ2F0ZS4KKwkJc3RhdGljIF9fZ3RocmVhZF9vbmNlX3QgX19vbmNlID0gX19HVEhSRUFEX09OQ0VfSU5JVDsKKwkJX19ndGhyZWFkX29uY2UoJl9fb25jZSwgX1NfaW5pdGlhbGl6ZSk7CisJICAgICAgfQorCisJICAgIC8vIERvdWJsZSBjaGVjayBpbml0aWFsaXphdGlvbi4gTWF5IGJlIG5lY2Vzc2FyeSBvbiBzb21lCisJICAgIC8vIHN5c3RlbXMgZm9yIHByb3BlciBjb25zdHJ1Y3Rpb24gd2hlbiBub3QgY29tcGlsaW5nIHdpdGgKKwkgICAgLy8gdGhyZWFkIGZsYWdzLgorCSAgICBfU19nZXRfcG9vbCgpLl9NX2luaXRpYWxpemVfb25jZSgpOyAKKwkgICAgX19pbml0ID0gdHJ1ZTsKKwkgIH0KKyAgICAgIH0KKyAgICB9OworI2VuZGlmCisKKyAgLy8vIFBvbGljeSBmb3IgaW5kaXZpZHVhbCBfX3Bvb2wgb2JqZWN0cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0ZW1wbGF0ZSA8Ym9vbD4gY2xhc3MgX1Bvb2xUcCwgYm9vbCBfVGhyZWFkPgorICAgIHN0cnVjdCBfX3Blcl90eXBlX3Bvb2xfcG9saWN5IAorICAgIDogcHVibGljIF9fcGVyX3R5cGVfcG9vbF9iYXNlPF9UcCwgX1Bvb2xUcCwgX1RocmVhZD4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0ZW1wbGF0ZSA8Ym9vbD4gY2xhc3MgX1Bvb2xUcDEgPSBfUG9vbFRwLCAKKwkgICAgICAgYm9vbCBfVGhyZWFkMSA9IF9UaHJlYWQ+CisgICAgICAgIHN0cnVjdCBfTV9yZWJpbmQKKyAgICAgICAgeyB0eXBlZGVmIF9fcGVyX3R5cGVfcG9vbF9wb2xpY3k8X1RwMSwgX1Bvb2xUcDEsIF9UaHJlYWQxPiBvdGhlcjsgfTsKKworICAgICAgdXNpbmcgIF9fcGVyX3R5cGVfcG9vbF9iYXNlPF9UcCwgX1Bvb2xUcCwgX1RocmVhZD46Ol9TX2dldF9wb29sOworICAgICAgdXNpbmcgIF9fcGVyX3R5cGVfcG9vbF9iYXNlPF9UcCwgX1Bvb2xUcCwgX1RocmVhZD46Ol9TX2luaXRpYWxpemVfb25jZTsKKyAgfTsKKworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBfVHAgZGVwZW5kZW50IG1lbWJlciBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfX210X2FsbG9jX2Jhc2UgCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCogICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1RwJiAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTAzLiBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudAorICAgICAgdHlwZWRlZiBzdGQ6OnRydWVfdHlwZSBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDsKKyNlbmRpZgorCisgICAgICBwb2ludGVyCisgICAgICBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgY29uc3RfcG9pbnRlcgorICAgICAgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQgCisgICAgICB7IHJldHVybiBzaXplX3QoLTEpIC8gc2l6ZW9mKF9UcCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KF9VcCogX19wLCBfQXJncyYmLi4uIF9fYXJncykKKwl7IDo6bmV3KCh2b2lkICopX19wKSBfVXAoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHZvaWQgCisgICAgICAgIGRlc3Ryb3koX1VwKiBfX3ApIHsgX19wLT5+X1VwKCk7IH0KKyNlbHNlCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MDIuIHdyb25nIG5ldyBleHByZXNzaW9uIGluIFtzb21lX10gYWxsb2NhdG9yOjpjb25zdHJ1Y3QKKyAgICAgIHZvaWQgCisgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0IF9UcCYgX192YWwpIAorICAgICAgeyA6Om5ldygodm9pZCAqKV9fcCkgX1RwKF9fdmFsKTsgfQorCisgICAgICB2b2lkIAorICAgICAgZGVzdHJveShwb2ludGVyIF9fcCkgeyBfX3AtPn5fVHAoKTsgfQorI2VuZGlmCisgICAgfTsKKworI2lmZGVmIF9fR1RIUkVBRFMKKyNkZWZpbmUgX190aHJlYWRfZGVmYXVsdCB0cnVlCisjZWxzZQorI2RlZmluZSBfX3RocmVhZF9kZWZhdWx0IGZhbHNlCisjZW5kaWYKKworICAvKioKKyAgICogIEBicmllZiAgVGhpcyBpcyBhIGZpeGVkIHNpemUgKHBvd2VyIG9mIDIpIGFsbG9jYXRvciB3aGljaCAtIHdoZW4KKyAgICogIGNvbXBpbGVkIHdpdGggdGhyZWFkIHN1cHBvcnQgLSB3aWxsIG1haW50YWluIG9uZSBmcmVlbGlzdCBwZXIKKyAgICogIHNpemUgcGVyIHRocmVhZCBwbHVzIGEgQGEgZ2xvYmFsIG9uZS4gU3RlcHMgYXJlIHRha2VuIHRvIGxpbWl0CisgICAqICB0aGUgcGVyIHRocmVhZCBmcmVlbGlzdCBzaXplcyAoYnkgcmV0dXJuaW5nIGV4Y2VzcyBiYWNrIHRvCisgICAqICB0aGUgQGEgZ2xvYmFsIGxpc3QpLgorICAgKiAgQGluZ3JvdXAgYWxsb2NhdG9ycworICAgKgorICAgKiAgRnVydGhlciBkZXRhaWxzOgorICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQxMmNoMzIuaHRtbAorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCAKKwkgICB0eXBlbmFtZSBfUG9vbHAgPSBfX2NvbW1vbl9wb29sX3BvbGljeTxfX3Bvb2wsIF9fdGhyZWFkX2RlZmF1bHQ+ID4KKyAgICBjbGFzcyBfX210X2FsbG9jIDogcHVibGljIF9fbXRfYWxsb2NfYmFzZTxfVHA+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgIAlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCogICAgICAgICAgICAgICAgICAgICAgCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCogICAgICAgICAgICAgICAgCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICAgICAgICAgCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJiAgICAgICAgICAgICAgICAJY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgIAl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfUG9vbHAgICAgICAJCQlfX3BvbGljeV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUG9vbHA6OnBvb2xfdHlwZQlfX3Bvb2xfdHlwZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1Bvb2xwMSA9IF9Qb29scD4KKyAgICAgICAgc3RydWN0IHJlYmluZAorICAgICAgICB7IAorCSAgdHlwZWRlZiB0eXBlbmFtZSBfUG9vbHAxOjp0ZW1wbGF0ZSBfTV9yZWJpbmQ8X1RwMT46Om90aGVyIHBvbF90eXBlOworCSAgdHlwZWRlZiBfX210X2FsbG9jPF9UcDEsIHBvbF90eXBlPiBvdGhlcjsKKwl9OworCisgICAgICBfX210X2FsbG9jKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICBfX210X2FsbG9jKGNvbnN0IF9fbXRfYWxsb2MmKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9Qb29scDE+CisgICAgICAgIF9fbXRfYWxsb2MoY29uc3QgX19tdF9hbGxvYzxfVHAxLCBfUG9vbHAxPiYpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgICAgfl9fbXRfYWxsb2MoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqID0gMCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pOworCisgICAgICBjb25zdCBfX3Bvb2xfYmFzZTo6X1R1bmUKKyAgICAgIF9NX2dldF9vcHRpb25zKCkKKyAgICAgIHsgCisJLy8gUmV0dXJuIGEgY29weSwgbm90IGEgcmVmZXJlbmNlLCBmb3IgZXh0ZXJuYWwgY29uc3VtcHRpb24uCisJcmV0dXJuIF9fcG9saWN5X3R5cGU6Ol9TX2dldF9wb29sKCkuX01fZ2V0X29wdGlvbnMoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgX01fc2V0X29wdGlvbnMoX19wb29sX2Jhc2U6Ol9UdW5lIF9fdCkKKyAgICAgIHsgX19wb2xpY3lfdHlwZTo6X1NfZ2V0X3Bvb2woKS5fTV9zZXRfb3B0aW9ucyhfX3QpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Qb29scD4KKyAgICB0eXBlbmFtZSBfX210X2FsbG9jPF9UcCwgX1Bvb2xwPjo6cG9pbnRlcgorICAgIF9fbXRfYWxsb2M8X1RwLCBfUG9vbHA+OjoKKyAgICBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBjb25zdCB2b2lkKikKKyAgICB7CisgICAgICBpZiAoX19uID4gdGhpcy0+bWF4X3NpemUoKSkKKwlzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisKKyAgICAgIF9fcG9saWN5X3R5cGU6Ol9TX2luaXRpYWxpemVfb25jZSgpOworCisgICAgICAvLyBSZXF1ZXN0cyBsYXJnZXIgdGhhbiBfTV9tYXhfYnl0ZXMgYXJlIGhhbmRsZWQgYnkgb3BlcmF0b3IKKyAgICAgIC8vIG5ldy9kZWxldGUgZGlyZWN0bHkuCisgICAgICBfX3Bvb2xfdHlwZSYgX19wb29sID0gX19wb2xpY3lfdHlwZTo6X1NfZ2V0X3Bvb2woKTsKKyAgICAgIGNvbnN0IHNpemVfdCBfX2J5dGVzID0gX19uICogc2l6ZW9mKF9UcCk7CisgICAgICBpZiAoX19wb29sLl9NX2NoZWNrX3RocmVzaG9sZChfX2J5dGVzKSkKKwl7CisJICB2b2lkKiBfX3JldCA9IDo6b3BlcmF0b3IgbmV3KF9fYnl0ZXMpOworCSAgcmV0dXJuIHN0YXRpY19jYXN0PF9UcCo+KF9fcmV0KTsKKwl9CisgICAgICAKKyAgICAgIC8vIFJvdW5kIHVwIHRvIHBvd2VyIG9mIDIgYW5kIGZpZ3VyZSBvdXQgd2hpY2ggYmluIHRvIHVzZS4KKyAgICAgIGNvbnN0IHNpemVfdCBfX3doaWNoID0gX19wb29sLl9NX2dldF9iaW5tYXAoX19ieXRlcyk7CisgICAgICBjb25zdCBzaXplX3QgX190aHJlYWRfaWQgPSBfX3Bvb2wuX01fZ2V0X3RocmVhZF9pZCgpOworICAgICAgCisgICAgICAvLyBGaW5kIG91dCBpZiB3ZSBoYXZlIGJsb2NrcyBvbiBvdXIgZnJlZWxpc3QuICBJZiBzbywgZ28gYWhlYWQKKyAgICAgIC8vIGFuZCB1c2UgdGhlbSBkaXJlY3RseSB3aXRob3V0IGhhdmluZyB0byBsb2NrIGFueXRoaW5nLgorICAgICAgY2hhciogX19jOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3Bvb2xfdHlwZTo6X0Jpbl9yZWNvcmQgX0Jpbl9yZWNvcmQ7CisgICAgICBjb25zdCBfQmluX3JlY29yZCYgX19iaW4gPSBfX3Bvb2wuX01fZ2V0X2JpbihfX3doaWNoKTsKKyAgICAgIGlmIChfX2Jpbi5fTV9maXJzdFtfX3RocmVhZF9pZF0pCisJeworCSAgLy8gQWxyZWFkeSByZXNlcnZlZC4KKwkgIHR5cGVkZWYgdHlwZW5hbWUgX19wb29sX3R5cGU6Ol9CbG9ja19yZWNvcmQgX0Jsb2NrX3JlY29yZDsKKwkgIF9CbG9ja19yZWNvcmQqIF9fYmxvY2sgPSBfX2Jpbi5fTV9maXJzdFtfX3RocmVhZF9pZF07CisJICBfX2Jpbi5fTV9maXJzdFtfX3RocmVhZF9pZF0gPSBfX2Jsb2NrLT5fTV9uZXh0OworCSAgCisJICBfX3Bvb2wuX01fYWRqdXN0X2ZyZWVsaXN0KF9fYmluLCBfX2Jsb2NrLCBfX3RocmVhZF9pZCk7CisJICBfX2MgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihfX2Jsb2NrKSArIF9fcG9vbC5fTV9nZXRfYWxpZ24oKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLy8gTnVsbCwgcmVzZXJ2ZS4KKwkgIF9fYyA9IF9fcG9vbC5fTV9yZXNlcnZlX2Jsb2NrKF9fYnl0ZXMsIF9fdGhyZWFkX2lkKTsKKwl9CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwKj4oc3RhdGljX2Nhc3Q8dm9pZCo+KF9fYykpOworICAgIH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1Bvb2xwPgorICAgIHZvaWQKKyAgICBfX210X2FsbG9jPF9UcCwgX1Bvb2xwPjo6CisgICAgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX3AgIT0gMCwgdHJ1ZSkpCisJeworCSAgLy8gUmVxdWVzdHMgbGFyZ2VyIHRoYW4gX01fbWF4X2J5dGVzIGFyZSBoYW5kbGVkIGJ5CisJICAvLyBvcGVyYXRvcnMgbmV3L2RlbGV0ZSBkaXJlY3RseS4KKwkgIF9fcG9vbF90eXBlJiBfX3Bvb2wgPSBfX3BvbGljeV90eXBlOjpfU19nZXRfcG9vbCgpOworCSAgY29uc3Qgc2l6ZV90IF9fYnl0ZXMgPSBfX24gKiBzaXplb2YoX1RwKTsKKwkgIGlmIChfX3Bvb2wuX01fY2hlY2tfdGhyZXNob2xkKF9fYnl0ZXMpKQorCSAgICA6Om9wZXJhdG9yIGRlbGV0ZShfX3ApOworCSAgZWxzZQorCSAgICBfX3Bvb2wuX01fcmVjbGFpbV9ibG9jayhyZWludGVycHJldF9jYXN0PGNoYXIqPihfX3ApLCBfX2J5dGVzKTsKKwl9CisgICAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUG9vbHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fbXRfYWxsb2M8X1RwLCBfUG9vbHA+JiwgY29uc3QgX19tdF9hbGxvYzxfVHAsIF9Qb29scD4mKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1Bvb2xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX210X2FsbG9jPF9UcCwgX1Bvb2xwPiYsIGNvbnN0IF9fbXRfYWxsb2M8X1RwLCBfUG9vbHA+JikKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCisjdW5kZWYgX190aHJlYWRfZGVmYXVsdAorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvbmV3X2FsbG9jYXRvci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvbmV3X2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjZmZWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9uZXdfYWxsb2NhdG9yLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8vIEFsbG9jYXRvciB0aGF0IHdyYXBzIG9wZXJhdG9yIG5ldyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L25ld19hbGxvY2F0b3IuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX05FV19BTExPQ0FUT1JfSAorI2RlZmluZSBfTkVXX0FMTE9DQVRPUl9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjZW5kaWYKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6c2l6ZV90OworICB1c2luZyBzdGQ6OnB0cmRpZmZfdDsKKworICAvKioKKyAgICogIEBicmllZiAgQW4gYWxsb2NhdG9yIHRoYXQgdXNlcyBnbG9iYWwgbmV3LCBhcyBwZXIgWzIwLjRdLgorICAgKiAgQGluZ3JvdXAgYWxsb2NhdG9ycworICAgKgorICAgKiAgVGhpcyBpcyBwcmVjaXNlbHkgdGhlIGFsbG9jYXRvciBkZWZpbmVkIGluIHRoZSBDKysgU3RhbmRhcmQuIAorICAgKiAgICAtIGFsbCBhbGxvY2F0aW9uIGNhbGxzIG9wZXJhdG9yIG5ldworICAgKiAgICAtIGFsbCBkZWFsbG9jYXRpb24gY2FsbHMgb3BlcmF0b3IgZGVsZXRlCisgICAqCisgICAqICBAdHBhcmFtICBfVHAgIFR5cGUgb2YgYWxsb2NhdGVkIG9iamVjdC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBuZXdfYWxsb2NhdG9yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1RwJiAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKyAgICAgICAgeyB0eXBlZGVmIG5ld19hbGxvY2F0b3I8X1RwMT4gb3RoZXI7IH07CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTAzLiBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudAorICAgICAgdHlwZWRlZiBzdGQ6OnRydWVfdHlwZSBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDsKKyNlbmRpZgorCisgICAgICBuZXdfYWxsb2NhdG9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICBuZXdfYWxsb2NhdG9yKGNvbnN0IG5ld19hbGxvY2F0b3ImKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIG5ld19hbGxvY2F0b3IoY29uc3QgbmV3X2FsbG9jYXRvcjxfVHAxPiYpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgICAgfm5ld19hbGxvY2F0b3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX194KTsgfQorCisgICAgICBjb25zdF9wb2ludGVyCisgICAgICBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgLy8gTkI6IF9fbiBpcyBwZXJtaXR0ZWQgdG8gYmUgMC4gIFRoZSBDKysgc3RhbmRhcmQgc2F5cyBub3RoaW5nCisgICAgICAvLyBhYm91dCB3aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgd2hlbiBfX24gPT0gMC4KKyAgICAgIHBvaW50ZXIKKyAgICAgIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqID0gMCkKKyAgICAgIHsgCisJaWYgKF9fbiA+IHRoaXMtPm1heF9zaXplKCkpCisJICBzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8X1RwKj4oOjpvcGVyYXRvciBuZXcoX19uICogc2l6ZW9mKF9UcCkpKTsKKyAgICAgIH0KKworICAgICAgLy8gX19wIGlzIG5vdCBwZXJtaXR0ZWQgdG8gYmUgYSBudWxsIHBvaW50ZXIuCisgICAgICB2b2lkCisgICAgICBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUpCisgICAgICB7IDo6b3BlcmF0b3IgZGVsZXRlKF9fcCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc2l6ZV90KC0xKSAvIHNpemVvZihfVHApOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGNvbnN0cnVjdChfVXAqIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyA6Om5ldygodm9pZCAqKV9fcCkgX1VwKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICB2b2lkIAorICAgICAgICBkZXN0cm95KF9VcCogX19wKSB7IF9fcC0+fl9VcCgpOyB9CisjZWxzZQorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDAyLiB3cm9uZyBuZXcgZXhwcmVzc2lvbiBpbiBbc29tZV9dIGFsbG9jYXRvcjo6Y29uc3RydWN0CisgICAgICB2b2lkIAorICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdCBfVHAmIF9fdmFsKSAKKyAgICAgIHsgOjpuZXcoKHZvaWQgKilfX3ApIF9UcChfX3ZhbCk7IH0KKworICAgICAgdm9pZCAKKyAgICAgIGRlc3Ryb3kocG9pbnRlciBfX3ApIHsgX19wLT5+X1RwKCk7IH0KKyNlbmRpZgorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBuZXdfYWxsb2NhdG9yPF9UcD4mLCBjb25zdCBuZXdfYWxsb2NhdG9yPF9UcD4mKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbmV3X2FsbG9jYXRvcjxfVHA+JiwgY29uc3QgbmV3X2FsbG9jYXRvcjxfVHA+JikKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvbnVtZXJpYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L251bWVyaWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5ZGY3NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L251bWVyaWMKQEAgLTAsMCArMSwxNTIgQEAKKy8vIE51bWVyaWMgZXh0ZW5zaW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGV4dC9udW1lcmljCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4gCisgKi8KKworI2lmbmRlZiBfRVhUX05VTUVSSUMKKyNkZWZpbmUgX0VYVF9OVU1FUklDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgPGV4dC9mdW5jdGlvbmFsPiAvLyBGb3IgaWRlbnRpdHlfZWxlbWVudAorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gUmV0dXJucyBfX3ggKiogX19uLCB3aGVyZSBfX24gPj0gMC4gIF9Ob3RlIHRoYXQgIm11bHRpcGxpY2F0aW9uIgorICAvLyBpcyByZXF1aXJlZCB0byBiZSBhc3NvY2lhdGl2ZSwgYnV0IG5vdCBuZWNlc3NhcmlseSBjb21tdXRhdGl2ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSW50ZWdlciwgdHlwZW5hbWUgX01vbm9pZE9wZXJhdGlvbj4KKyAgICBfVHAKKyAgICBfX3Bvd2VyKF9UcCBfX3gsIF9JbnRlZ2VyIF9fbiwgX01vbm9pZE9wZXJhdGlvbiBfX21vbm9pZF9vcCkKKyAgICB7CisgICAgICBpZiAoX19uID09IDApCisJcmV0dXJuIGlkZW50aXR5X2VsZW1lbnQoX19tb25vaWRfb3ApOworICAgICAgZWxzZQorCXsKKwkgIHdoaWxlICgoX19uICYgMSkgPT0gMCkKKwkgICAgeworCSAgICAgIF9fbiA+Pj0gMTsKKwkgICAgICBfX3ggPSBfX21vbm9pZF9vcChfX3gsIF9feCk7CisJICAgIH0KKworCSAgX1RwIF9fcmVzdWx0ID0gX194OworCSAgX19uID4+PSAxOworCSAgd2hpbGUgKF9fbiAhPSAwKQorCSAgICB7CisJICAgICAgX194ID0gX19tb25vaWRfb3AoX194LCBfX3gpOworCSAgICAgIGlmICgoX19uICYgMSkgIT0gMCkKKwkJX19yZXN1bHQgPSBfX21vbm9pZF9vcChfX3Jlc3VsdCwgX194KTsKKwkgICAgICBfX24gPj49IDE7CisJICAgIH0KKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0ludGVnZXI+CisgICAgaW5saW5lIF9UcAorICAgIF9fcG93ZXIoX1RwIF9feCwgX0ludGVnZXIgX19uKQorICAgIHsgcmV0dXJuIF9fcG93ZXIoX194LCBfX24sIHN0ZDo6bXVsdGlwbGllczxfVHA+KCkpOyB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAqLworICAvLyBBbGlhcyBmb3IgdGhlIGludGVybmFsIG5hbWUgX19wb3dlci4gIE5vdGUgdGhhdCBwb3dlciBpcyBhbiBleHRlbnNpb24sCisgIC8vIG5vdCBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9Nb25vaWRPcGVyYXRpb24+CisgICAgaW5saW5lIF9UcAorICAgIHBvd2VyKF9UcCBfX3gsIF9JbnRlZ2VyIF9fbiwgX01vbm9pZE9wZXJhdGlvbiBfX21vbm9pZF9vcCkKKyAgICB7IHJldHVybiBfX3Bvd2VyKF9feCwgX19uLCBfX21vbm9pZF9vcCk7IH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0ludGVnZXI+CisgICAgaW5saW5lIF9UcAorICAgIHBvd2VyKF9UcCBfX3gsIF9JbnRlZ2VyIF9fbikKKyAgICB7IHJldHVybiBfX3Bvd2VyKF9feCwgX19uKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB1c2luZyBzdGQ6OmlvdGE7CisjZWxzZQorICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIC8vIGlvdGEgaXMgbm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZC4gIEl0IGlzIGFuIGV4dGVuc2lvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIGlvdGEoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIF9UcCBfX3ZhbHVlKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwLAorCSAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXI+Ojp2YWx1ZV90eXBlPikKKworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCSpfX2ZpcnN0KysgPSBfX3ZhbHVlKys7CisgICAgfQorI2VuZGlmICAvLyBDKysxMQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvbnVtZXJpY190cmFpdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L251bWVyaWNfdHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjMTk4NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L251bWVyaWNfdHJhaXRzLmgKQEAgLTAsMCArMSwxMzggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvbnVtZXJpY190cmFpdHMuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0VYVF9OVU1FUklDX1RSQUlUUworI2RlZmluZSBfRVhUX05VTUVSSUNfVFJBSVRTIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jcHBfdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIENvbXBpbGUgdGltZSBjb25zdGFudHMgZm9yIGJ1aWx0aW4gdHlwZXMuCisgIC8vIFNhZGx5IHN0ZDo6bnVtZXJpY19saW1pdHMgbWVtYmVyIGZ1bmN0aW9ucyBjYW5ub3QgYmUgdXNlZCBmb3IgdGhpcy4KKyNkZWZpbmUgX19nbGliY3h4X3NpZ25lZChfVHApICgoX1RwKSgtMSkgPCAwKQorI2RlZmluZSBfX2dsaWJjeHhfZGlnaXRzKF9UcCkgXAorICAoc2l6ZW9mKF9UcCkgKiBfX0NIQVJfQklUX18gLSBfX2dsaWJjeHhfc2lnbmVkKF9UcCkpCisKKyNkZWZpbmUgX19nbGliY3h4X21pbihfVHApIFwKKyAgKF9fZ2xpYmN4eF9zaWduZWQoX1RwKSA/IChfVHApMSA8PCBfX2dsaWJjeHhfZGlnaXRzKF9UcCkgOiAoX1RwKTApCisKKyNkZWZpbmUgX19nbGliY3h4X21heChfVHApIFwKKyAgKF9fZ2xpYmN4eF9zaWduZWQoX1RwKSA/IFwKKyAgICgoKCgoX1RwKTEgPDwgKF9fZ2xpYmN4eF9kaWdpdHMoX1RwKSAtIDEpKSAtIDEpIDw8IDEpICsgMSkgOiB+KF9UcCkwKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBzdHJ1Y3QgX19udW1lcmljX3RyYWl0c19pbnRlZ2VyCisgICAgeworICAgICAgLy8gT25seSBpbnRlZ2VycyBmb3IgaW5pdGlhbGl6YXRpb24gb2YgbWVtYmVyIGNvbnN0YW50LgorICAgICAgc3RhdGljIGNvbnN0IF9WYWx1ZSBfX21pbiA9IF9fZ2xpYmN4eF9taW4oX1ZhbHVlKTsKKyAgICAgIHN0YXRpYyBjb25zdCBfVmFsdWUgX19tYXggPSBfX2dsaWJjeHhfbWF4KF9WYWx1ZSk7CisKKyAgICAgIC8vIE5COiB0aGVzZSB0d28gYWxzbyBhdmFpbGFibGUgaW4gc3RkOjpudW1lcmljX2xpbWl0cyBhcyBjb21waWxlCisgICAgICAvLyB0aW1lIGNvbnN0YW50cywgYnV0IDxsaW1pdHM+IGlzIGJpZyBhbmQgd2UgYXZvaWQgaW5jbHVkaW5nIGl0LgorICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX19pc19zaWduZWQgPSBfX2dsaWJjeHhfc2lnbmVkKF9WYWx1ZSk7CisgICAgICBzdGF0aWMgY29uc3QgaW50IF9fZGlnaXRzID0gX19nbGliY3h4X2RpZ2l0cyhfVmFsdWUpOyAgICAgIAorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIGNvbnN0IF9WYWx1ZSBfX251bWVyaWNfdHJhaXRzX2ludGVnZXI8X1ZhbHVlPjo6X19taW47CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIGNvbnN0IF9WYWx1ZSBfX251bWVyaWNfdHJhaXRzX2ludGVnZXI8X1ZhbHVlPjo6X19tYXg7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIGNvbnN0IGJvb2wgX19udW1lcmljX3RyYWl0c19pbnRlZ2VyPF9WYWx1ZT46Ol9faXNfc2lnbmVkOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBjb25zdCBpbnQgX19udW1lcmljX3RyYWl0c19pbnRlZ2VyPF9WYWx1ZT46Ol9fZGlnaXRzOworCisjdW5kZWYgX19nbGliY3h4X3NpZ25lZAorI3VuZGVmIF9fZ2xpYmN4eF9kaWdpdHMKKyN1bmRlZiBfX2dsaWJjeHhfbWluCisjdW5kZWYgX19nbGliY3h4X21heAorCisjZGVmaW5lIF9fZ2xpYmN4eF9mbG9hdGluZyhfVHAsIF9GdmFsLCBfRHZhbCwgX0xEdmFsKSBcCisgIChzdGQ6Ol9fYXJlX3NhbWU8X1RwLCBmbG9hdD46Ol9fdmFsdWUgPyBfRnZhbCBcCisgICA6IHN0ZDo6X19hcmVfc2FtZTxfVHAsIGRvdWJsZT46Ol9fdmFsdWUgPyBfRHZhbCA6IF9MRHZhbCkKKworI2RlZmluZSBfX2dsaWJjeHhfbWF4X2RpZ2l0czEwKF9UcCkgXAorICAoMiArIF9fZ2xpYmN4eF9mbG9hdGluZyhfVHAsIF9fRkxUX01BTlRfRElHX18sIF9fREJMX01BTlRfRElHX18sIFwKKwkJCSAgX19MREJMX01BTlRfRElHX18pICogNjQzTCAvIDIxMzYpCisKKyNkZWZpbmUgX19nbGliY3h4X2RpZ2l0czEwKF9UcCkgXAorICBfX2dsaWJjeHhfZmxvYXRpbmcoX1RwLCBfX0ZMVF9ESUdfXywgX19EQkxfRElHX18sIF9fTERCTF9ESUdfXykKKworI2RlZmluZSBfX2dsaWJjeHhfbWF4X2V4cG9uZW50MTAoX1RwKSBcCisgIF9fZ2xpYmN4eF9mbG9hdGluZyhfVHAsIF9fRkxUX01BWF8xMF9FWFBfXywgX19EQkxfTUFYXzEwX0VYUF9fLCBcCisJCSAgICAgX19MREJMX01BWF8xMF9FWFBfXykKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisgICAgc3RydWN0IF9fbnVtZXJpY190cmFpdHNfZmxvYXRpbmcKKyAgICB7CisgICAgICAvLyBPbmx5IGZsb2F0aW5nIHBvaW50IHR5cGVzLiBTZWUgTjE4MjIuIAorICAgICAgc3RhdGljIGNvbnN0IGludCBfX21heF9kaWdpdHMxMCA9IF9fZ2xpYmN4eF9tYXhfZGlnaXRzMTAoX1ZhbHVlKTsKKworICAgICAgLy8gU2VlIGFib3ZlIGNvbW1lbnQuLi4KKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9faXNfc2lnbmVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgX19kaWdpdHMxMCA9IF9fZ2xpYmN4eF9kaWdpdHMxMChfVmFsdWUpOworICAgICAgc3RhdGljIGNvbnN0IGludCBfX21heF9leHBvbmVudDEwID0gX19nbGliY3h4X21heF9leHBvbmVudDEwKF9WYWx1ZSk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisgICAgY29uc3QgaW50IF9fbnVtZXJpY190cmFpdHNfZmxvYXRpbmc8X1ZhbHVlPjo6X19tYXhfZGlnaXRzMTA7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIGNvbnN0IGJvb2wgX19udW1lcmljX3RyYWl0c19mbG9hdGluZzxfVmFsdWU+OjpfX2lzX3NpZ25lZDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisgICAgY29uc3QgaW50IF9fbnVtZXJpY190cmFpdHNfZmxvYXRpbmc8X1ZhbHVlPjo6X19kaWdpdHMxMDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisgICAgY29uc3QgaW50IF9fbnVtZXJpY190cmFpdHNfZmxvYXRpbmc8X1ZhbHVlPjo6X19tYXhfZXhwb25lbnQxMDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisgICAgc3RydWN0IF9fbnVtZXJpY190cmFpdHMKKyAgICA6IHB1YmxpYyBfX2NvbmRpdGlvbmFsX3R5cGU8c3RkOjpfX2lzX2ludGVnZXI8X1ZhbHVlPjo6X192YWx1ZSwKKwkJCQlfX251bWVyaWNfdHJhaXRzX2ludGVnZXI8X1ZhbHVlPiwKKwkJCQlfX251bWVyaWNfdHJhaXRzX2Zsb2F0aW5nPF9WYWx1ZT4gPjo6X190eXBlCisgICAgeyB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyN1bmRlZiBfX2dsaWJjeHhfZmxvYXRpbmcKKyN1bmRlZiBfX2dsaWJjeHhfbWF4X2RpZ2l0czEwCisjdW5kZWYgX19nbGliY3h4X2RpZ2l0czEwCisjdW5kZWYgX19nbGliY3h4X21heF9leHBvbmVudDEwCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2Fzc29jX2NvbnRhaW5lci5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNmViYTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwCkBAIC0wLDAgKzEsODYxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGFzc29jX2NvbnRhaW5lci5ocHAKKyAqIENvbnRhaW5zIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMuCisgKi8KKworI2lmbmRlZiBQQl9EU19BU1NPQ19DTlROUl9IUFAKKyNkZWZpbmUgUEJfRFNfQVNTT0NfQ05UTlJfSFBQCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGV4dC90eXBlbGlzdC5oPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3N0YW5kYXJkX3BvbGljaWVzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JyYW5jaF9wb2xpY3kvdHJhaXRzLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgLyoqCisgICAqICBAZGVmZ3JvdXAgY29udGFpbmVycy1wYmRzIENvbnRhaW5lcnMKKyAgICogIEBpbmdyb3VwIHBiZHMKKyAgICogIEB7CisgICAqLworCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIGhhc2gtYmFzZWQgSGFzaC1CYXNlZAorICAgKiAgQGluZ3JvdXAgY29udGFpbmVycy1wYmRzCisgICAqICBAeworICAgKi8KKyNkZWZpbmUgUEJfRFNfSEFTSF9CQVNFIFwKKyAgZGV0YWlsOjpjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIE1hcHBlZCwgX0FsbG9jLCBUYWcsIFwKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6OnR5cGVsaXN0OjphcHBlbmQ8IFwKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjcmVhdGU0PEhhc2hfRm4sIEVxX0ZuLCBSZXNpemVfUG9saWN5LCBcCisgICAgZGV0YWlsOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsIFN0b3JlX0hhc2g+ID46OnR5cGUsIFBvbGljeV9UbD46OnR5cGU+Ojp0eXBlCisKKyAgLyoqCisgICAqICBAZGVmZ3JvdXAgaGFzaC1kZXRhaWwgQmFzZSBhbmQgUG9saWN5IENsYXNzZXMKKyAgICogIEBpbmdyb3VwIGhhc2gtYmFzZWQKKyAgICovCisKKyAgLyoqCisgICAqICBBIGhhc2hlZCBjb250YWluZXIgYWJzdHJhY3Rpb24uCisgICAqCisgICAqICBAdHBhcmFtIEtleSAJICAgIAlLZXkgdHlwZS4KKyAgICogIEB0cGFyYW0gTWFwcGVkIAkgICAgCU1hcCB0eXBlLgorICAgKiAgQHRwYXJhbSBIYXNoX0ZuCSAgICAJSGFzaGluZyBmdW5jdG9yLgorICAgKiAgQHRwYXJhbSBFcV9GbgkgICAgCUVxdWFsIGZ1bmN0b3IuCisgICAqICBAdHBhcmFtIFJlc2l6ZV9Qb2xpY3kgCVJlc2l6ZXMgaGFzaC4KKyAgICogIEB0cGFyYW0gU3RvcmVfSGFzaCAgICAJSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGhhc2ggdmFsdWUKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgYWxvbmcgd2l0aCBlYWNoIGtleS4KKyAgICogIEB0cGFyYW0gVGFnIAkgICAgCUluc3RhbnRpYXRpbmcgZGF0YSBzdHJ1Y3R1cmUgdHlwZSwKKyAgICoJCQkgICAgCXNlZSBjb250YWluZXJfdGFnLgorICAgKiAgQHRwYXJhbSBQb2xpY3lfVEwJICAgIAlQb2xpY3kgdHlwZWxpc3QuCisgICAqICBAdHBhcmFtIF9BbGxvYyAJICAgIAlBbGxvY2F0b3IgdHlwZS4KKyAgICoKKyAgICogIEJhc2UgaXMgZGlzcGF0Y2hlZCBhdCBjb21waWxlIHRpbWUgdmlhIFRhZywgZnJvbSB0aGUgZm9sbG93aW5nCisgICAqICBjaG9pY2VzOiBjY19oYXNoX3RhZywgZ3BfaGFzaF90YWcsIGFuZCBkZXNjZW5kYW50cyBvZiBiYXNpY19oYXNoX3RhZy4KKyAgICoKKyAgICogIEJhc2UgY2hvaWNlcyBhcmU6IGRldGFpbDo6Y2NfaHRfbWFwLCBkZXRhaWw6OmdwX2h0X21hcAorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICB0eXBlbmFtZSBIYXNoX0ZuLAorCSAgIHR5cGVuYW1lIEVxX0ZuLAorCSAgIHR5cGVuYW1lIFJlc2l6ZV9Qb2xpY3ksCisJICAgYm9vbCBTdG9yZV9IYXNoLAorCSAgIHR5cGVuYW1lIFRhZywKKwkgICB0eXBlbmFtZSBQb2xpY3lfVGwsCisJICAgdHlwZW5hbWUgX0FsbG9jPgorICBjbGFzcyBiYXNpY19oYXNoX3RhYmxlIDogcHVibGljIFBCX0RTX0hBU0hfQkFTRQorICB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQQl9EU19IQVNIX0JBU0UgCQliYXNlX3R5cGU7CisKKyAgcHVibGljOgorICAgIHZpcnR1YWwKKyAgICB+YmFzaWNfaGFzaF90YWJsZSgpIHsgfQorCisgIHByb3RlY3RlZDoKKyAgICBiYXNpY19oYXNoX3RhYmxlKCkgeyB9CisKKyAgICBiYXNpY19oYXNoX3RhYmxlKGNvbnN0IGJhc2ljX2hhc2hfdGFibGUmIG90aGVyKQorICAgIDogYmFzZV90eXBlKChjb25zdCBiYXNlX3R5cGUmKW90aGVyKSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQwPgorICAgICAgYmFzaWNfaGFzaF90YWJsZShUMCB0MCkgOiBiYXNlX3R5cGUodDApIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxPgorICAgICAgYmFzaWNfaGFzaF90YWJsZShUMCB0MCwgVDEgdDEpIDogYmFzZV90eXBlKHQwLCB0MSkgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgICAgYmFzaWNfaGFzaF90YWJsZShUMCB0MCwgVDEgdDEsIFQyIHQyKSA6IGJhc2VfdHlwZSh0MCwgdDEsIHQyKSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorICAgICAgYmFzaWNfaGFzaF90YWJsZShUMCB0MCwgVDEgdDEsIFQyIHQyLCBUMyB0MykKKyAgICAgIDogYmFzZV90eXBlKHQwLCB0MSwgdDIsIHQzKSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KKyAgICAgIGJhc2ljX2hhc2hfdGFibGUoVDAgdDAsIFQxIHQxLCBUMiB0MiwgVDMgdDMsIFQ0IHQ0KQorICAgICAgOiBiYXNlX3R5cGUodDAsIHQxLCB0MiwgdDMsIHQ0KSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwKKwkgICAgIHR5cGVuYW1lIFQ1PgorICAgICAgYmFzaWNfaGFzaF90YWJsZShUMCB0MCwgVDEgdDEsIFQyIHQyLCBUMyB0MywgVDQgdDQsIFQ1IHQ1KQorICAgICAgOiBiYXNlX3R5cGUodDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSkgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsCisJICAgICB0eXBlbmFtZSBUNSwgdHlwZW5hbWUgVDY+CisgICAgICBiYXNpY19oYXNoX3RhYmxlKFQwIHQwLCBUMSB0MSwgVDIgdDIsIFQzIHQzLCBUNCB0NCwgVDUgdDUsIFQ2IHQ2KQorICAgICAgOiBiYXNlX3R5cGUodDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYpIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LAorCSAgICAgdHlwZW5hbWUgVDUsIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KKyAgICAgIGJhc2ljX2hhc2hfdGFibGUoVDAgdDAsIFQxIHQxLCBUMiB0MiwgVDMgdDMsIFQ0IHQ0LCBUNSB0NSwgVDYgdDYsIFQ3IHQ3KQorICAgICAgOiBiYXNlX3R5cGUodDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3KSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwKKwkgICAgIHR5cGVuYW1lIFQ1LCB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4PgorICAgICAgYmFzaWNfaGFzaF90YWJsZShUMCB0MCwgVDEgdDEsIFQyIHQyLCBUMyB0MywgVDQgdDQsIFQ1IHQ1LCBUNiB0NiwKKwkJICAgICAgIFQ3IHQ3LCBUOCB0OCkKKyAgICAgIDogYmFzZV90eXBlKHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgdDgpCisgICAgICB7IH0KKworICBwcml2YXRlOgorICAgIGJhc2ljX2hhc2hfdGFibGUmCisgICAgb3BlcmF0b3I9KGNvbnN0IGJhc2VfdHlwZSYpOworICB9OworCisjdW5kZWYgUEJfRFNfSEFTSF9CQVNFCisKKworI2RlZmluZSBQQl9EU19DQ19IQVNIX0JBU0UgXAorICBiYXNpY19oYXNoX3RhYmxlPEtleSwgTWFwcGVkLAlIYXNoX0ZuLCBFcV9GbiwgUmVzaXplX1BvbGljeSwgU3RvcmVfSGFzaCwgXAorCQkgICBjY19oYXNoX3RhZywJXAorCSAgdHlwZW5hbWUgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y3JlYXRlMTxDb21iX0hhc2hfRm4+Ojp0eXBlLCBfQWxsb2M+CisKKworICAvKioKKyAgICogIEEgY29sbGlzaW9uLWNoYWluaW5nIGhhc2gtYmFzZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyLgorICAgKgorICAgKiAgQHRwYXJhbSBLZXkgCSAgICAJS2V5IHR5cGUuCisgICAqICBAdHBhcmFtIE1hcHBlZCAJICAgIAlNYXAgdHlwZS4KKyAgICogIEB0cGFyYW0gSGFzaF9GbgkgICAgCUhhc2hpbmcgZnVuY3Rvci4KKyAgICogIEB0cGFyYW0gRXFfRm4JICAgIAlFcXVhbCBmdW5jdG9yLgorICAgKiAgQHRwYXJhbSBDb21iX0hhc2hfRm4JQ29tYmluaW5nIGhhc2ggZnVuY3Rvci4KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgSGFzaF9GbiBpcyBub3QgbnVsbF90eXBlLCB0aGVuIHRoaXMKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHJhbmdlZC1oYXNoIGZ1bmN0b3I7IG90aGVyd2lzZSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgcmFuZ2UtaGFzaGluZyBmdW5jdG9yLgorICAgKiAgICAgICAgICAgICAgICAgICAgWFhYKFNlZSBEZXNpZ246Okhhc2gtQmFzZWQgQ29udGFpbmVyczo6SGFzaCBQb2xpY2llcy4pCisgICAqICBAdHBhcmFtIFJlc2l6ZV9Qb2xpY3kgCVJlc2l6ZXMgaGFzaC4KKyAgICogIEB0cGFyYW0gU3RvcmVfSGFzaCAgICAJSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGhhc2ggdmFsdWUKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgYWxvbmcgd2l0aCBlYWNoIGtleS4KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgSGFzaF9GbiBpcyBudWxsX3R5cGUsIHRoZW4gdGhlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciB3aWxsIG5vdCBjb21waWxlIGlmIHRoaXMKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgdHJ1ZQorICAgKiAgQHRwYXJhbSBfQWxsb2MgCSAgICAJQWxsb2NhdG9yIHR5cGUuCisgICAqCisgICAqICBCYXNlIHRhZyBjaG9pY2VzIGFyZTogCWNjX2hhc2hfdGFnLgorICAgKgorICAgKiAgQmFzZSBpcyBiYXNpY19oYXNoX3RhYmxlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICB0eXBlbmFtZSBIYXNoX0ZuID0gdHlwZW5hbWUgZGV0YWlsOjpkZWZhdWx0X2hhc2hfZm48S2V5Pjo6dHlwZSwKKwkgICB0eXBlbmFtZSBFcV9GbiA9IHR5cGVuYW1lIGRldGFpbDo6ZGVmYXVsdF9lcV9mbjxLZXk+Ojp0eXBlLAorCSAgIHR5cGVuYW1lIENvbWJfSGFzaF9GbiA9IGRldGFpbDo6ZGVmYXVsdF9jb21iX2hhc2hfZm46OnR5cGUsCisJICAgdHlwZW5hbWUgUmVzaXplX1BvbGljeSA9IHR5cGVuYW1lIGRldGFpbDo6ZGVmYXVsdF9yZXNpemVfcG9saWN5PENvbWJfSGFzaF9Gbj46OnR5cGUsCisJICAgYm9vbCBTdG9yZV9IYXNoID0gZGV0YWlsOjpkZWZhdWx0X3N0b3JlX2hhc2gsCisJICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICBjbGFzcyBjY19oYXNoX3RhYmxlIDogIHB1YmxpYyBQQl9EU19DQ19IQVNIX0JBU0UKKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgUEJfRFNfQ0NfSEFTSF9CQVNFIAkJCWJhc2VfdHlwZTsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBjY19oYXNoX3RhZwkgICAgICAgCQkJY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgSGFzaF9GbiAJCQkJaGFzaF9mbjsKKyAgICB0eXBlZGVmIEVxX0ZuIAkJCQllcV9mbjsKKyAgICB0eXBlZGVmIFJlc2l6ZV9Qb2xpY3kgCQkJcmVzaXplX3BvbGljeTsKKyAgICB0eXBlZGVmIENvbWJfSGFzaF9GbiAJCQljb21iX2hhc2hfZm47CisKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBjY19oYXNoX3RhYmxlKCkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfaGFzaF9mbiB3aWxsIGJlCisgICAgLy8vIGNvcGllZCBieSB0aGUgSGFzaF9GbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgY2NfaGFzaF90YWJsZShjb25zdCBoYXNoX2ZuJiBoKQorICAgIDogYmFzZV90eXBlKGgpIHsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljeSBvYmplY3RzLiByX2hhc2hfZm4gd2lsbCBiZQorICAgIC8vLyBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LCBhbmQKKyAgICAvLy8gcl9lcV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIKKyAgICAvLy8gb2JqZWN0LgorICAgIGNjX2hhc2hfdGFibGUoY29uc3QgaGFzaF9mbiYgaCwgY29uc3QgZXFfZm4mIGUpCisgICAgOiBiYXNlX3R5cGUoaCwgZSkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfaGFzaF9mbiB3aWxsIGJlCisgICAgLy8vIGNvcGllZCBieSB0aGUgaGFzaF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsIHJfZXFfZm4KKyAgICAvLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGVxX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLy8gYW5kIHJfY29tYl9oYXNoX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBjb21iX2hhc2hfZm4gb2JqZWN0CisgICAgLy8vIG9mIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIGNjX2hhc2hfdGFibGUoY29uc3QgaGFzaF9mbiYgaCwgY29uc3QgZXFfZm4mIGUsIGNvbnN0IGNvbWJfaGFzaF9mbiYgY2gpCisgICAgOiBiYXNlX3R5cGUoaCwgZSwgY2gpIHsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljeSBvYmplY3RzLiByX2hhc2hfZm4gd2lsbCBiZQorICAgIC8vLyBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LCByX2VxX2ZuCisgICAgLy8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsCisgICAgLy8vIHJfY29tYl9oYXNoX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBjb21iX2hhc2hfZm4gb2JqZWN0IG9mCisgICAgLy8vIHRoZSBjb250YWluZXIgb2JqZWN0LCBhbmQgcl9yZXNpemVfcG9saWN5IHdpbGwgYmUgY29waWVkIGJ5CisgICAgLy8vIHRoZSByZXNpemVfcG9saWN5IG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICBjY19oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLCBjb25zdCBjb21iX2hhc2hfZm4mIGNoLAorCQkgIGNvbnN0IHJlc2l6ZV9wb2xpY3kmIHJwKQorICAgIDogYmFzZV90eXBlKGgsIGUsIGNoLCBycCkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMuIFRoZQorICAgIC8vLyB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZCBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50bworICAgIC8vLyB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBjY19oYXNoX3RhYmxlKEl0IGZpcnN0LCBJdCBsYXN0KQorICAgIHsgYmFzZV90eXBlOjpjb3B5X2Zyb21fcmFuZ2UoZmlyc3QsIGxhc3QpOyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMgYW5kCisgICAgLy8vIHNvbWUgcG9saWN5IG9iamVjdHMuIFRoZSB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZAorICAgIC8vLyBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBjY19oYXNoX3RhYmxlKEl0IGZpcnN0LCBJdCBsYXN0LCBjb25zdCBoYXNoX2ZuJiBoKQorICAgIDogYmFzZV90eXBlKGgpCisgICAgeyB0aGlzLT5jb3B5X2Zyb21fcmFuZ2UoZmlyc3QsIGxhc3QpOyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMgYW5kCisgICAgLy8vIHNvbWUgcG9saWN5IG9iamVjdHMgVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8vIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250YWluZXIgb2JqZWN0LiByX2hhc2hfZm4KKyAgICAvLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LAorICAgIC8vLyBhbmQgcl9lcV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZQorICAgIC8vLyBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIGNjX2hhc2hfdGFibGUoSXQgZmlyc3QsIEl0IGxhc3QsIGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlKQorICAgIDogYmFzZV90eXBlKGgsIGUpCisgICAgeyB0aGlzLT5jb3B5X2Zyb21fcmFuZ2UoZmlyc3QsIGxhc3QpOyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMgYW5kCisgICAgLy8vIHNvbWUgcG9saWN5IG9iamVjdHMgVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8vIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250YWluZXIgb2JqZWN0LiByX2hhc2hfZm4KKyAgICAvLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LAorICAgIC8vLyByX2VxX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lcgorICAgIC8vLyBvYmplY3QsIGFuZCByX2NvbWJfaGFzaF9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgY29tYl9oYXNoX2ZuCisgICAgLy8vIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBjY19oYXNoX3RhYmxlKEl0IGZpcnN0LCBJdCBsYXN0LCBjb25zdCBoYXNoX2ZuJiBoLCBjb25zdCBlcV9mbiYgZSwKKwkJICBjb25zdCBjb21iX2hhc2hfZm4mIGNoKQorICAgIDogYmFzZV90eXBlKGgsIGUsIGNoKQorICAgIHsgdGhpcy0+Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vLyBzb21lIHBvbGljeSBvYmplY3RzIFRoZSB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZAorICAgIC8vLyBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyIG9iamVjdC4gcl9oYXNoX2ZuCisgICAgLy8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLy8gcl9lcV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIKKyAgICAvLy8gb2JqZWN0LCByX2NvbWJfaGFzaF9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgY29tYl9oYXNoX2ZuCisgICAgLy8vIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgYW5kIHJfcmVzaXplX3BvbGljeSB3aWxsIGJlCisgICAgLy8vIGNvcGllZCBieSB0aGUgcmVzaXplX3BvbGljeSBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgY2NfaGFzaF90YWJsZShJdCBmaXJzdCwgSXQgbGFzdCwgY29uc3QgaGFzaF9mbiYgaCwgY29uc3QgZXFfZm4mIGUsCisJCSAgY29uc3QgY29tYl9oYXNoX2ZuJiBjaCwgY29uc3QgcmVzaXplX3BvbGljeSYgcnApCisgICAgOiBiYXNlX3R5cGUoaCwgZSwgY2gsIHJwKQorICAgIHsgdGhpcy0+Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgY2NfaGFzaF90YWJsZShjb25zdCBjY19oYXNoX3RhYmxlJiBvdGhlcikKKyAgICA6IGJhc2VfdHlwZSgoY29uc3QgYmFzZV90eXBlJilvdGhlcikKKyAgICB7IH0KKworICAgIHZpcnR1YWwKKyAgICB+Y2NfaGFzaF90YWJsZSgpIHsgfQorCisgICAgY2NfaGFzaF90YWJsZSYKKyAgICBvcGVyYXRvcj0oY29uc3QgY2NfaGFzaF90YWJsZSYgb3RoZXIpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0gJm90aGVyKQorCXsKKwkgIGNjX2hhc2hfdGFibGUgdG1wKG90aGVyKTsKKwkgIHN3YXAodG1wKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZAorICAgIHN3YXAoY2NfaGFzaF90YWJsZSYgb3RoZXIpCisgICAgeyBiYXNlX3R5cGU6OnN3YXAob3RoZXIpOyB9CisgIH07CisKKyN1bmRlZiBQQl9EU19DQ19IQVNIX0JBU0UKKworCisjZGVmaW5lIFBCX0RTX0dQX0hBU0hfQkFTRSBcCisgIGJhc2ljX2hhc2hfdGFibGU8S2V5LCBNYXBwZWQsCUhhc2hfRm4sIEVxX0ZuLCBSZXNpemVfUG9saWN5LCBTdG9yZV9IYXNoLCBcCisJCSAgIGdwX2hhc2hfdGFnLCBcCisgIHR5cGVuYW1lIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNyZWF0ZTI8Q29tYl9Qcm9iZV9GbiwgUHJvYmVfRm4+Ojp0eXBlLCBfQWxsb2M+CisKKworICAvKioKKyAgICogIEEgZ2VuZXJhbC1wcm9iaW5nIGhhc2gtYmFzZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyLgorICAgKgorICAgKiAgQHRwYXJhbSBLZXkgCSAgICAJS2V5IHR5cGUuCisgICAqICBAdHBhcmFtIE1hcHBlZCAJICAgIAlNYXAgdHlwZS4KKyAgICogIEB0cGFyYW0gSGFzaF9GbgkgICAgCUhhc2hpbmcgZnVuY3Rvci4KKyAgICogIEB0cGFyYW0gRXFfRm4JICAgIAlFcXVhbCBmdW5jdG9yLgorICAgKiAgQHRwYXJhbSBDb21iX1Byb2JlX0ZuCUNvbWJpbmluZyBwcm9iZSBmdW5jdG9yLgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBIYXNoX0ZuIGlzIG5vdCBudWxsX3R5cGUsIHRoZW4gdGhpcworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgcmFuZ2VkLXByb2JlIGZ1bmN0b3I7IG90aGVyd2lzZSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgcmFuZ2UtaGFzaGluZyBmdW5jdG9yLgorICAgKiAgICAgICAgICAgICAgICAgICAgWFhYIFNlZSBEZXNpZ246Okhhc2gtQmFzZWQgQ29udGFpbmVyczo6SGFzaCBQb2xpY2llcy4KKyAgICogIEB0cGFyYW0gUHJvYmVfRm4JCVByb2JlIGZ1bmN0b3IuCisgICAqICBAdHBhcmFtIFJlc2l6ZV9Qb2xpY3kgCVJlc2l6ZXMgaGFzaC4KKyAgICogIEB0cGFyYW0gU3RvcmVfSGFzaCAgICAJSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGhhc2ggdmFsdWUKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgYWxvbmcgd2l0aCBlYWNoIGtleS4KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgSGFzaF9GbiBpcyBudWxsX3R5cGUsIHRoZW4gdGhlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciB3aWxsIG5vdCBjb21waWxlIGlmIHRoaXMKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgdHJ1ZQorICAgKiAgQHRwYXJhbSBfQWxsb2MgCSAgICAJQWxsb2NhdG9yIHR5cGUuCisgICAqCisgICAqICBCYXNlIHRhZyBjaG9pY2VzIGFyZTogCWdwX2hhc2hfdGFnLgorICAgKgorICAgKiAgQmFzZSBpcyBiYXNpY19oYXNoX3RhYmxlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICB0eXBlbmFtZSBIYXNoX0ZuID0gdHlwZW5hbWUgZGV0YWlsOjpkZWZhdWx0X2hhc2hfZm48S2V5Pjo6dHlwZSwKKwkgICB0eXBlbmFtZSBFcV9GbiA9IHR5cGVuYW1lIGRldGFpbDo6ZGVmYXVsdF9lcV9mbjxLZXk+Ojp0eXBlLAorCSAgIHR5cGVuYW1lIENvbWJfUHJvYmVfRm4gPSBkZXRhaWw6OmRlZmF1bHRfY29tYl9oYXNoX2ZuOjp0eXBlLAorCSAgIHR5cGVuYW1lIFByb2JlX0ZuID0gdHlwZW5hbWUgZGV0YWlsOjpkZWZhdWx0X3Byb2JlX2ZuPENvbWJfUHJvYmVfRm4+Ojp0eXBlLAorCSAgIHR5cGVuYW1lIFJlc2l6ZV9Qb2xpY3kgPSB0eXBlbmFtZSBkZXRhaWw6OmRlZmF1bHRfcmVzaXplX3BvbGljeTxDb21iX1Byb2JlX0ZuPjo6dHlwZSwKKwkgICBib29sIFN0b3JlX0hhc2ggPSBkZXRhaWw6OmRlZmF1bHRfc3RvcmVfaGFzaCwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgIGNsYXNzIGdwX2hhc2hfdGFibGUgOiBwdWJsaWMgUEJfRFNfR1BfSEFTSF9CQVNFCisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIFBCX0RTX0dQX0hBU0hfQkFTRSAJCQliYXNlX3R5cGU7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgZ3BfaGFzaF90YWcJICAgICAgIAkJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIEhhc2hfRm4gCQkJCWhhc2hfZm47CisgICAgdHlwZWRlZiBFcV9GbiAJCQkJZXFfZm47CisgICAgdHlwZWRlZiBDb21iX1Byb2JlX0ZuCQkJY29tYl9wcm9iZV9mbjsKKyAgICB0eXBlZGVmIFByb2JlX0ZuIAkJCQlwcm9iZV9mbjsKKyAgICB0eXBlZGVmIFJlc2l6ZV9Qb2xpY3kgCQkJcmVzaXplX3BvbGljeTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIGdwX2hhc2hfdGFibGUoKSB7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgc29tZSBwb2xpY3kgb2JqZWN0cy4gcl9oYXNoX2ZuIHdpbGwgYmUKKyAgICAvLy8gY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICBncF9oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgpCisgICAgOiBiYXNlX3R5cGUoaCkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfaGFzaF9mbiB3aWxsIGJlCisgICAgLy8vIGNvcGllZCBieSB0aGUgaGFzaF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsIGFuZAorICAgIC8vLyByX2VxX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lcgorICAgIC8vLyBvYmplY3QuCisgICAgZ3BfaGFzaF90YWJsZShjb25zdCBoYXNoX2ZuJiBoLCBjb25zdCBlcV9mbiYgZSkKKyAgICA6IGJhc2VfdHlwZShoLCBlKSB7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgc29tZSBwb2xpY3kgb2JqZWN0cy4gcl9oYXNoX2ZuIHdpbGwgYmUKKyAgICAvLy8gY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgcl9lcV9mbgorICAgIC8vLyB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LAorICAgIC8vLyBhbmQgcl9jb21iX3Byb2JlX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBjb21iX3Byb2JlX2ZuIG9iamVjdAorICAgIC8vLyBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICBncF9oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLCBjb25zdCBjb21iX3Byb2JlX2ZuJiBjcCkKKyAgICA6IGJhc2VfdHlwZShoLCBlLCBjcCkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfaGFzaF9mbiB3aWxsIGJlCisgICAgLy8vIGNvcGllZCBieSB0aGUgaGFzaF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsIHJfZXFfZm4KKyAgICAvLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGVxX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLy8gcl9jb21iX3Byb2JlX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBjb21iX3Byb2JlX2ZuIG9iamVjdCBvZgorICAgIC8vLyB0aGUgY29udGFpbmVyIG9iamVjdCwgYW5kIHJfcHJvYmVfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlCisgICAgLy8vIHByb2JlX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICBncF9oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLCBjb25zdCBjb21iX3Byb2JlX2ZuJiBjcCwKKwkJICBjb25zdCBwcm9iZV9mbiYgcCkKKyAgICA6IGJhc2VfdHlwZShoLCBlLCBjcCwgcCkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfaGFzaF9mbiB3aWxsIGJlCisgICAgLy8vIGNvcGllZCBieSB0aGUgaGFzaF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsIHJfZXFfZm4KKyAgICAvLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGVxX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLy8gcl9jb21iX3Byb2JlX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBjb21iX3Byb2JlX2ZuIG9iamVjdCBvZgorICAgIC8vLyB0aGUgY29udGFpbmVyIG9iamVjdCwgcl9wcm9iZV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUKKyAgICAvLy8gcHJvYmVfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LCBhbmQgcl9yZXNpemVfcG9saWN5CisgICAgLy8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBSZXNpemVfUG9saWN5IG9iamVjdCBvZiB0aGUgY29udGFpbmVyCisgICAgLy8vIG9iamVjdC4KKyAgICBncF9oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLCBjb25zdCBjb21iX3Byb2JlX2ZuJiBjcCwKKwkJICBjb25zdCBwcm9iZV9mbiYgcCwgY29uc3QgcmVzaXplX3BvbGljeSYgcnApCisgICAgOiBiYXNlX3R5cGUoaCwgZSwgY3AsIHAsIHJwKSB7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcy4gVGhlCisgICAgLy8vIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvCisgICAgLy8vIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIGdwX2hhc2hfdGFibGUoSXQgZmlyc3QsIEl0IGxhc3QpCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcyBhbmQKKyAgICAvLy8gc29tZSBwb2xpY3kgb2JqZWN0cy4gVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8vIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250YWluZXIgb2JqZWN0LiByX2hhc2hfZm4KKyAgICAvLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIGdwX2hhc2hfdGFibGUoSXQgZmlyc3QsIEl0IGxhc3QsIGNvbnN0IGhhc2hfZm4mIGgpCisgICAgOiBiYXNlX3R5cGUoaCkKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vLyBzb21lIHBvbGljeSBvYmplY3RzLiBUaGUgdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQKKyAgICAvLy8gbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBvYmplY3QuIHJfaGFzaF9mbgorICAgIC8vLyB3aWxsIGJlIGNvcGllZCBieSB0aGUgaGFzaF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsCisgICAgLy8vIGFuZCByX2VxX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlCisgICAgLy8vIGNvbnRhaW5lciBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgZ3BfaGFzaF90YWJsZShJdCBmaXJzdCwgSXQgbGFzdCwgY29uc3QgaGFzaF9mbiYgaCwgY29uc3QgZXFfZm4mIGUpCisgICAgOiBiYXNlX3R5cGUoaCwgZSkKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vLyBzb21lIHBvbGljeSBvYmplY3RzLiBUaGUgdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQKKyAgICAvLy8gbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBvYmplY3QuIHJfaGFzaF9mbgorICAgIC8vLyB3aWxsIGJlIGNvcGllZCBieSB0aGUgaGFzaF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsCisgICAgLy8vIHJfZXFfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGVxX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyCisgICAgLy8vIG9iamVjdCwgYW5kIHJfY29tYl9wcm9iZV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUKKyAgICAvLy8gY29tYl9wcm9iZV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgZ3BfaGFzaF90YWJsZShJdCBmaXJzdCwgSXQgbGFzdCwgY29uc3QgaGFzaF9mbiYgaCwgY29uc3QgZXFfZm4mIGUsCisJCSAgY29uc3QgY29tYl9wcm9iZV9mbiYgY3ApCisgICAgOiBiYXNlX3R5cGUoaCwgZSwgY3ApCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcyBhbmQKKyAgICAvLy8gc29tZSBwb2xpY3kgb2JqZWN0cy4gVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8vIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250YWluZXIgb2JqZWN0LiByX2hhc2hfZm4KKyAgICAvLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LAorICAgIC8vLyByX2VxX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lcgorICAgIC8vLyBvYmplY3QsIHJfY29tYl9wcm9iZV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgY29tYl9wcm9iZV9mbgorICAgIC8vLyBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsIGFuZCByX3Byb2JlX2ZuIHdpbGwgYmUgY29waWVkCisgICAgLy8vIGJ5IHRoZSBwcm9iZV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgZ3BfaGFzaF90YWJsZShJdCBmaXJzdCwgSXQgbGFzdCwgY29uc3QgaGFzaF9mbiYgaCwgY29uc3QgZXFfZm4mIGUsCisJCSAgY29uc3QgY29tYl9wcm9iZV9mbiYgY3AsIGNvbnN0IHByb2JlX2ZuJiBwKQorICAgIDogYmFzZV90eXBlKGgsIGUsIGNwLCBwKQorICAgIHsgYmFzZV90eXBlOjpjb3B5X2Zyb21fcmFuZ2UoZmlyc3QsIGxhc3QpOyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMgYW5kCisgICAgLy8vIHNvbWUgcG9saWN5IG9iamVjdHMuIFRoZSB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZAorICAgIC8vLyBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyIG9iamVjdC4gcl9oYXNoX2ZuCisgICAgLy8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLy8gcl9lcV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIKKyAgICAvLy8gb2JqZWN0LCByX2NvbWJfcHJvYmVfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGNvbWJfcHJvYmVfZm4KKyAgICAvLy8gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LCByX3Byb2JlX2ZuIHdpbGwgYmUgY29waWVkIGJ5CisgICAgLy8vIHRoZSBwcm9iZV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsIGFuZAorICAgIC8vLyByX3Jlc2l6ZV9wb2xpY3kgd2lsbCBiZSBjb3BpZWQgYnkgdGhlIHJlc2l6ZV9wb2xpY3kgb2JqZWN0IG9mCisgICAgLy8vIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIGdwX2hhc2hfdGFibGUoSXQgZmlyc3QsIEl0IGxhc3QsIGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLAorCQkgIGNvbnN0IGNvbWJfcHJvYmVfZm4mIGNwLCBjb25zdCBwcm9iZV9mbiYgcCwKKwkJICBjb25zdCByZXNpemVfcG9saWN5JiBycCkKKyAgICA6IGJhc2VfdHlwZShoLCBlLCBjcCwgcCwgcnApCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIGdwX2hhc2hfdGFibGUoY29uc3QgZ3BfaGFzaF90YWJsZSYgb3RoZXIpCisgICAgOiBiYXNlX3R5cGUoKGNvbnN0IGJhc2VfdHlwZSYpb3RoZXIpCisgICAgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfmdwX2hhc2hfdGFibGUoKSB7IH0KKworICAgIGdwX2hhc2hfdGFibGUmCisgICAgb3BlcmF0b3I9KGNvbnN0IGdwX2hhc2hfdGFibGUmIG90aGVyKQorICAgIHsKKyAgICAgIGlmICh0aGlzICE9ICZvdGhlcikKKwl7CisJICBncF9oYXNoX3RhYmxlIHRtcChvdGhlcik7CisJICBzd2FwKHRtcCk7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQKKyAgICBzd2FwKGdwX2hhc2hfdGFibGUmIG90aGVyKQorICAgIHsgYmFzZV90eXBlOjpzd2FwKG90aGVyKTsgfQorICB9OworICAvL0B9IGhhc2gtYmFzZWQKKyN1bmRlZiBQQl9EU19HUF9IQVNIX0JBU0UKKworCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIGJyYW5jaC1iYXNlZCBCcmFuY2gtQmFzZWQKKyAgICogIEBpbmdyb3VwIGNvbnRhaW5lcnMtcGJkcworICAgKiAgQHsKKyAgICovCisjZGVmaW5lIFBCX0RTX0JSQU5DSF9CQVNFIFwKKyAgZGV0YWlsOjpjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIE1hcHBlZCwgX0FsbG9jLCBUYWcsIFBvbGljeV9UbD46OnR5cGUKKworICAvKioKKyAgICogIEBkZWZncm91cCBicmFuY2gtZGV0YWlsIEJhc2UgYW5kIFBvbGljeSBDbGFzc2VzCisgICAqICBAaW5ncm91cCBicmFuY2gtYmFzZWQKKyAgICovCisKKyAgLyoqCisgICAqICBBIGJyYW5jaGVkLCB0cmVlLWxpa2UgKHRyZWUsIHRyaWUpIGNvbnRhaW5lciBhYnN0cmFjdGlvbi4KKyAgICoKKyAgICogIEB0cGFyYW0gS2V5IAkgIAlLZXkgdHlwZS4KKyAgICogIEB0cGFyYW0gTWFwcGVkIAkgIAlNYXAgdHlwZS4KKyAgICogIEB0cGFyYW0gVGFnIAkgIAlJbnN0YW50aWF0aW5nIGRhdGEgc3RydWN0dXJlIHR5cGUsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBjb250YWluZXJfdGFnLgorICAgKiAgQHRwYXJhbSBOb2RlX1VwZGF0ZSAJVXBkYXRlcyBub2RlcywgcmVzdG9yZXMgaW52YXJpYW50cy4KKyAgICogIEB0cGFyYW0gUG9saWN5X1RMICAgICAgICAgUG9saWN5IHR5cGVsaXN0LgorICAgKiAgQHRwYXJhbSBfQWxsb2MgCSAgCUFsbG9jYXRvciB0eXBlLgorICAgKgorICAgKiAgQmFzZSBpcyBkaXNwYXRjaGVkIGF0IGNvbXBpbGUgdGltZSB2aWEgVGFnLCBmcm9tIHRoZSBmb2xsb3dpbmcKKyAgICogIGNob2ljZXM6IHRyZWVfdGFnLCB0cmllX3RhZywgYW5kIHRoZWlyIGRlc2NlbmRhbnRzLgorICAgKgorICAgKiAgQmFzZSBjaG9pY2VzIGFyZTogZGV0YWlsOjpvdl90cmVlX21hcCwgZGV0YWlsOjpyYl90cmVlX21hcCwKKyAgICoJCSAgICAgICAJZGV0YWlsOjpzcGxheV90cmVlX21hcCwgYW5kIGRldGFpbDo6cGF0X3RyaWVfbWFwLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIFRhZywKKwkgICB0eXBlbmFtZSBOb2RlX1VwZGF0ZSwgdHlwZW5hbWUgUG9saWN5X1RsLCB0eXBlbmFtZSBfQWxsb2M+CisgIGNsYXNzIGJhc2ljX2JyYW5jaCA6IHB1YmxpYyBQQl9EU19CUkFOQ0hfQkFTRQorICB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQQl9EU19CUkFOQ0hfQkFTRSAJICAgICAgIAliYXNlX3R5cGU7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgTm9kZV9VcGRhdGUgCQkJbm9kZV91cGRhdGU7CisKKyAgICB2aXJ0dWFsCisgICAgfmJhc2ljX2JyYW5jaCgpIHsgfQorCisgIHByb3RlY3RlZDoKKyAgICBiYXNpY19icmFuY2goKSB7IH0KKworICAgIGJhc2ljX2JyYW5jaChjb25zdCBiYXNpY19icmFuY2gmIG90aGVyKQorICAgIDogYmFzZV90eXBlKChjb25zdCBiYXNlX3R5cGUmKW90aGVyKSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQwPgorICAgICAgYmFzaWNfYnJhbmNoKFQwIHQwKSA6IGJhc2VfdHlwZSh0MCkgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+CisgICAgICBiYXNpY19icmFuY2goVDAgdDAsIFQxIHQxKSA6IGJhc2VfdHlwZSh0MCwgdDEpIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICAgIGJhc2ljX2JyYW5jaChUMCB0MCwgVDEgdDEsIFQyIHQyKSA6IGJhc2VfdHlwZSh0MCwgdDEsIHQyKSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorICAgICAgYmFzaWNfYnJhbmNoKFQwIHQwLCBUMSB0MSwgVDIgdDIsIFQzIHQzKQorICAgICAgOiBiYXNlX3R5cGUodDAsIHQxLCB0MiwgdDMpIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorICAgICAgYmFzaWNfYnJhbmNoKFQwIHQwLCBUMSB0MSwgVDIgdDIsIFQzIHQzLCBUNCB0NCkKKyAgICAgIDogYmFzZV90eXBlKHQwLCB0MSwgdDIsIHQzLCB0NCkgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsCisJICAgICB0eXBlbmFtZSBUNT4KKyAgICAgIGJhc2ljX2JyYW5jaChUMCB0MCwgVDEgdDEsIFQyIHQyLCBUMyB0MywgVDQgdDQsIFQ1IHQ1KQorICAgICAgOiBiYXNlX3R5cGUodDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSkgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsCisJICAgICB0eXBlbmFtZSBUNSwgdHlwZW5hbWUgVDY+CisgICAgICBiYXNpY19icmFuY2goVDAgdDAsIFQxIHQxLCBUMiB0MiwgVDMgdDMsIFQ0IHQ0LCBUNSB0NSwgVDYgdDYpCisgICAgICA6IGJhc2VfdHlwZSh0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NikgeyB9CisgIH07CisjdW5kZWYgUEJfRFNfQlJBTkNIX0JBU0UKKworCisjZGVmaW5lIFBCX0RTX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTIFwKKyAgZGV0YWlsOjp0cmVlX3RyYWl0czxLZXksIE1hcHBlZCxDbXBfRm4sTm9kZV9VcGRhdGUsVGFnLF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19UUkVFX0JBU0UgXAorICBiYXNpY19icmFuY2g8S2V5LE1hcHBlZCwgVGFnLCBcCisJICAgICAgIHR5cGVuYW1lIFBCX0RTX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTOjpub2RlX3VwZGF0ZSwgXAorCSAgICAgICB0eXBlbmFtZSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjcmVhdGUyPENtcF9GbiwgXAorCSAgICAgICBQQl9EU19UUkVFX05PREVfQU5EX0lUX1RSQUlUUz46OnR5cGUsIF9BbGxvYz4KKworCisgIC8qKgorICAgKiAgQSB0cmVlLWJhc2VkIGNvbnRhaW5lci4KKyAgICoKKyAgICogIEB0cGFyYW0gS2V5IAkgCUtleSB0eXBlLgorICAgKiAgQHRwYXJhbSBNYXBwZWQgCSAJTWFwIHR5cGUuCisgICAqICBAdHBhcmFtIENtcF9GbgkgCUNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEB0cGFyYW0gVGFnIAkgCUluc3RhbnRpYXRpbmcgZGF0YSBzdHJ1Y3R1cmUgdHlwZSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlIGNvbnRhaW5lcl90YWcuCisgICAqICBAdHBhcmFtIE5vZGVfVXBkYXRlIAlVcGRhdGVzIHRyZWUgaW50ZXJuYWwtbm9kZXMsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVzIGludmFyaWFudHMgd2hlbiBpbnZhbGlkYXRlZC4KKyAgICogICAgICAgICAgICAgICAgICAgICBYWFggU2VlIGRlc2lnbjo6dHJlZS1iYXNlZC1jb250YWluZXJzOjpub2RlIGludmFyaWFudHMuCisgICAqICBAdHBhcmFtIF9BbGxvYyAJIAlBbGxvY2F0b3IgdHlwZS4KKyAgICoKKyAgICogIEJhc2UgdGFnIGNob2ljZXMgYXJlOiBvdl90cmVlX3RhZywgcmJfdHJlZV90YWcsIHNwbGF5X3RyZWVfdGFnLgorICAgKgorICAgKiAgQmFzZSBpcyBiYXNpY19icmFuY2guCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgQ21wX0ZuID0gc3RkOjpsZXNzPEtleT4sCisJICAgdHlwZW5hbWUgVGFnID0gcmJfdHJlZV90YWcsCisJICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLCB0eXBlbmFtZSBOb2RlX0l0ciwKKwkJICAgIHR5cGVuYW1lIENtcF9Gbl8sIHR5cGVuYW1lIF9BbGxvY18+CisJICAgY2xhc3MgTm9kZV9VcGRhdGUgPSBudWxsX25vZGVfdXBkYXRlLAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgY2xhc3MgdHJlZSA6IHB1YmxpYyBQQl9EU19UUkVFX0JBU0UKKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgUEJfRFNfVFJFRV9CQVNFIAkJCWJhc2VfdHlwZTsKKworICBwdWJsaWM6CisgICAgLy8vIENvbXBhcmlzb24gZnVuY3RvciB0eXBlLgorICAgIHR5cGVkZWYgQ21wX0ZuIAkJCQljbXBfZm47CisKKyAgICB0cmVlKCkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfY21wX2ZuIHdpbGwgYmUKKyAgICAvLy8gY29waWVkIGJ5IHRoZSBDbXBfRm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRyZWUoY29uc3QgY21wX2ZuJiBjKQorICAgIDogYmFzZV90eXBlKGMpIHsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzLiBUaGUKKyAgICAvLy8gdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQgbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8KKyAgICAvLy8gdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgdHJlZShJdCBmaXJzdCwgSXQgbGFzdCkKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vLyBzb21lIHBvbGljeSBvYmplY3RzIFRoZSB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZAorICAgIC8vLyBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyIG9iamVjdC4gcl9jbXBfZm4KKyAgICAvLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGNtcF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgdHJlZShJdCBmaXJzdCwgSXQgbGFzdCwgY29uc3QgY21wX2ZuJiBjKQorICAgIDogYmFzZV90eXBlKGMpCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIHRyZWUoY29uc3QgdHJlZSYgb3RoZXIpCisgICAgOiBiYXNlX3R5cGUoKGNvbnN0IGJhc2VfdHlwZSYpb3RoZXIpIHsgfQorCisgICAgdmlydHVhbAorICAgIH50cmVlKCkgeyB9CisKKyAgICB0cmVlJgorICAgIG9wZXJhdG9yPShjb25zdCB0cmVlJiBvdGhlcikKKyAgICB7CisgICAgICBpZiAodGhpcyAhPSAmb3RoZXIpCisJeworCSAgdHJlZSB0bXAob3RoZXIpOworCSAgc3dhcCh0bXApOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkCisgICAgc3dhcCh0cmVlJiBvdGhlcikKKyAgICB7IGJhc2VfdHlwZTo6c3dhcChvdGhlcik7IH0KKyAgfTsKKworI3VuZGVmIFBCX0RTX1RSRUVfQkFTRQorI3VuZGVmIFBCX0RTX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTCisKKworI2RlZmluZSBQQl9EU19UUklFX05PREVfQU5EX0lUX1RSQUlUUyBcCisgIGRldGFpbDo6dHJpZV90cmFpdHM8S2V5LE1hcHBlZCxfQVRyYWl0cyxOb2RlX1VwZGF0ZSxUYWcsX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX1RSSUVfQkFTRSBcCisgIGJhc2ljX2JyYW5jaDxLZXksTWFwcGVkLFRhZywgXAorCSAgICAgICB0eXBlbmFtZSBQQl9EU19UUklFX05PREVfQU5EX0lUX1RSQUlUUzo6bm9kZV91cGRhdGUsIFwKKwkgICAgICAgdHlwZW5hbWUgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y3JlYXRlMjxfQVRyYWl0cywgXAorCSAgICAgICBQQl9EU19UUklFX05PREVfQU5EX0lUX1RSQUlUUyA+Ojp0eXBlLCBfQWxsb2M+CisKKworICAvKioKKyAgICogIEEgdHJpZS1iYXNlZCBjb250YWluZXIuCisgICAqCisgICAqICBAdHBhcmFtIEtleSAJICAJS2V5IHR5cGUuCisgICAqICBAdHBhcmFtIE1hcHBlZCAJICAJTWFwIHR5cGUuCisgICAqICBAdHBhcmFtIF9BVHJhaXRzCSAgCUVsZW1lbnQgYWNjZXNzIHRyYWl0cy4KKyAgICogIEB0cGFyYW0gVGFnIAkgIAlJbnN0YW50aWF0aW5nIGRhdGEgc3RydWN0dXJlIHR5cGUsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBjb250YWluZXJfdGFnLgorICAgKiAgQHRwYXJhbSBOb2RlX1VwZGF0ZSAJVXBkYXRlcyB0cmllIGludGVybmFsLW5vZGVzLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlcyBpbnZhcmlhbnRzIHdoZW4gaW52YWxpZGF0ZWQuCisgICAqICAgICAgICAgICAgICAgICAgICAgWFhYIFNlZSBkZXNpZ246OnRyZWUtYmFzZWQtY29udGFpbmVyczo6bm9kZSBpbnZhcmlhbnRzLgorICAgKiAgQHRwYXJhbSBfQWxsb2MgCSAgCUFsbG9jYXRvciB0eXBlLgorICAgKgorICAgKiAgQmFzZSB0YWcgY2hvaWNlIGlzIHBhdF90cmllX3RhZy4KKyAgICoKKyAgICogIEJhc2UgaXMgYmFzaWNfYnJhbmNoLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICB0eXBlbmFtZSBfQVRyYWl0cyA9IFwKKwkJICAgIHR5cGVuYW1lIGRldGFpbDo6ZGVmYXVsdF90cmllX2FjY2Vzc190cmFpdHM8S2V5Pjo6dHlwZSwKKwkgICB0eXBlbmFtZSBUYWcgPSBwYXRfdHJpZV90YWcsCisJICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLAorCQkgICAgdHlwZW5hbWUgTm9kZV9JdHIsCisJCSAgICB0eXBlbmFtZSBfQVRyYWl0c18sCisJCSAgICB0eXBlbmFtZSBfQWxsb2NfPgorCSAgIGNsYXNzIE5vZGVfVXBkYXRlID0gbnVsbF9ub2RlX3VwZGF0ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgIGNsYXNzIHRyaWUgOiBwdWJsaWMgUEJfRFNfVFJJRV9CQVNFCisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIFBCX0RTX1RSSUVfQkFTRQkJCWJhc2VfdHlwZTsKKworICBwdWJsaWM6CisgICAgLy8vIEVsZW1lbnQgYWNjZXNzIHRyYWl0cyB0eXBlLgorICAgIHR5cGVkZWYgX0FUcmFpdHMgCQkJCWFjY2Vzc190cmFpdHM7CisKKyAgICB0cmllKCkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfYWNjZXNzX3RyYWl0cyB3aWxsCisgICAgLy8vIGJlIGNvcGllZCBieSB0aGUgX0FUcmFpdHMgb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRyaWUoY29uc3QgYWNjZXNzX3RyYWl0cyYgdCkKKyAgICA6IGJhc2VfdHlwZSh0KSB7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcy4gVGhlCisgICAgLy8vIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvCisgICAgLy8vIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIHRyaWUoSXQgZmlyc3QsIEl0IGxhc3QpCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcyBhbmQKKyAgICAvLy8gc29tZSBwb2xpY3kgb2JqZWN0cy4gVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8vIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIHRyaWUoSXQgZmlyc3QsIEl0IGxhc3QsIGNvbnN0IGFjY2Vzc190cmFpdHMmIHQpCisgICAgOiBiYXNlX3R5cGUodCkKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgdHJpZShjb25zdCB0cmllJiBvdGhlcikKKyAgICA6IGJhc2VfdHlwZSgoY29uc3QgYmFzZV90eXBlJilvdGhlcikgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfnRyaWUoKSB7IH0KKworICAgIHRyaWUmCisgICAgb3BlcmF0b3I9KGNvbnN0IHRyaWUmIG90aGVyKQorICAgIHsKKyAgICAgIGlmICh0aGlzICE9ICZvdGhlcikKKwl7CisJICB0cmllIHRtcChvdGhlcik7CisJICBzd2FwKHRtcCk7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQKKyAgICBzd2FwKHRyaWUmIG90aGVyKQorICAgIHsgYmFzZV90eXBlOjpzd2FwKG90aGVyKTsgfQorICB9OworICAvL0B9IGJyYW5jaC1iYXNlZAorI3VuZGVmIFBCX0RTX1RSSUVfQkFTRQorI3VuZGVmIFBCX0RTX1RSSUVfTk9ERV9BTkRfSVRfVFJBSVRTCisKKworICAvKioKKyAgICogIEBkZWZncm91cCBsaXN0LWJhc2VkIExpc3QtQmFzZWQKKyAgICogIEBpbmdyb3VwIGNvbnRhaW5lcnMtcGJkcworICAgKiAgQHsKKyAgICovCisjZGVmaW5lIFBCX0RTX0xVX0JBU0UgXAorICBkZXRhaWw6OmNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgTWFwcGVkLCBfQWxsb2MsIGxpc3RfdXBkYXRlX3RhZywJXAorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNyZWF0ZTI8RXFfRm4sIFVwZGF0ZV9Qb2xpY3k+Ojp0eXBlPjo6dHlwZQorCisKKyAgLyoqCisgICAqICBBIGxpc3QtdXBkYXRlIGJhc2VkIGFzc29jaWF0aXZlIGNvbnRhaW5lci4KKyAgICoKKyAgICogIEB0cGFyYW0gS2V5IAkgICAgCUtleSB0eXBlLgorICAgKiAgQHRwYXJhbSBNYXBwZWQgCSAgICAJTWFwIHR5cGUuCisgICAqICBAdHBhcmFtIEVxX0ZuCSAgICAJRXF1YWwgZnVuY3Rvci4KKyAgICogIEB0cGFyYW0gVXBkYXRlX1BvbGljeQlVcGRhdGUgcG9saWN5LCBkZXRlcm1pbmVzIHdoZW4gYW4gZWxlbWVudAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIG1vdmVkIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdC4KKyAgICogIEB0cGFyYW0gX0FsbG9jIAkgICAgCUFsbG9jYXRvciB0eXBlLgorICAgKgorICAgKiAgQmFzZSBpcyBkZXRhaWw6Omx1X21hcC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgY2xhc3MgRXFfRm4gPSB0eXBlbmFtZSBkZXRhaWw6OmRlZmF1bHRfZXFfZm48S2V5Pjo6dHlwZSwKKwkgICBjbGFzcyBVcGRhdGVfUG9saWN5ID0gZGV0YWlsOjpkZWZhdWx0X3VwZGF0ZV9wb2xpY3k6OnR5cGUsCisJICAgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICBjbGFzcyBsaXN0X3VwZGF0ZSA6IHB1YmxpYyBQQl9EU19MVV9CQVNFCisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFBCX0RTX0xVX0JBU0UgCQliYXNlX3R5cGU7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgbGlzdF91cGRhdGVfdGFnCSAgICAgICAJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIEVxX0ZuIAkJCQllcV9mbjsKKyAgICB0eXBlZGVmIFVwZGF0ZV9Qb2xpY3kgCQkJdXBkYXRlX3BvbGljeTsKKworICAgIGxpc3RfdXBkYXRlKCkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMuIFRoZQorICAgIC8vLyB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZCBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50bworICAgIC8vLyB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBsaXN0X3VwZGF0ZShJdCBmaXJzdCwgSXQgbGFzdCkKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgbGlzdF91cGRhdGUoY29uc3QgbGlzdF91cGRhdGUmIG90aGVyKQorICAgIDogYmFzZV90eXBlKChjb25zdCBiYXNlX3R5cGUmKW90aGVyKSB7IH0KKworICAgIHZpcnR1YWwKKyAgICB+bGlzdF91cGRhdGUoKSB7IH0KKworICAgIGxpc3RfdXBkYXRlJgorICAgIG9wZXJhdG9yPShjb25zdCBsaXN0X3VwZGF0ZSYgb3RoZXIpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0mIG90aGVyKQorCXsKKwkgIGxpc3RfdXBkYXRlIHRtcChvdGhlcik7CisJICBzd2FwKHRtcCk7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQKKyAgICBzd2FwKGxpc3RfdXBkYXRlJiBvdGhlcikKKyAgICB7IGJhc2VfdHlwZTo6c3dhcChvdGhlcik7IH0KKyAgfTsKKyAgLy9AfSBsaXN0LWJhc2VkCisjdW5kZWYgUEJfRFNfTFVfQkFTRQorCisgIC8vIEB9IGdyb3VwIGNvbnRhaW5lcnMtcGJkcworfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2Jpbl9zZWFyY2hfdHJlZV8uaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vYmluX3NlYXJjaF90cmVlXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1ODM5YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2Jpbl9zZWFyY2hfdHJlZV8uaHBwCkBAIC0wLDAgKzEsNDI4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqICBAZmlsZSBiaW5fc2VhcmNoX3RyZWVfL2Jpbl9zZWFyY2hfdHJlZV8uaHBwCisgKiAgQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbmFyeSBzZWFyY2ggdHJlZS4KKyAqLworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2V4Y2VwdGlvbi5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2VxX2J5X2xlc3MuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RyZWVfdHJhY2VfYmFzZS5ocHA+CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2RlYnVnX21hcF9iYXNlLmhwcD4KKyNlbmRpZgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0JJTl9UUkVFX05BTUUgYmluX3NlYXJjaF90cmVlX21hcAorI2VuZGlmCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19CSU5fVFJFRV9OQU1FIGJpbl9zZWFyY2hfdHJlZV9zZXQKKyNlbmRpZgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgQ21wX0ZuLCBcCisJICAgICB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgUEJfRFNfQklOX1RSRUVfTkFNRTxLZXksIE1hcHBlZCwgQ21wX0ZuLCBOb2RlX0FuZF9JdF9UcmFpdHMsIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19CSU5fVFJFRV9UUkFJVFNfQkFTRSBcCisgICAgdHlwZXNfdHJhaXRzPEtleSwgTWFwcGVkLCBfQWxsb2MsIGZhbHNlPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNkZWZpbmUgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgIFwKKyAgICBkZWJ1Z19tYXBfYmFzZTxLZXksCWVxX2J5X2xlc3M8S2V5LCBDbXBfRm4+LCBcCisJICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZT4KKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfVFJFRV9UUkFDRQorI2RlZmluZSBQQl9EU19UUkVFX1RSQUNFX0JBU0VfQ19ERUMgXAorICAgIHRyZWVfdHJhY2VfYmFzZTx0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6Om5vZGVfY29uc3RfaXRlcmF0b3IsIFwKKwkJICAgIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0czo6bm9kZV9pdGVyYXRvciwJICAgICAgXAorCQkgICAgQ21wX0ZuLCB0cnVlLCBfQWxsb2M+CisjZW5kaWYKKworCisgICAgLyoKKyAgICAgKiAgQGJyaWVmIEJpbmFyeSBzZWFyY2ggdHJlZSAoQlNUKS4KKyAgICAgKgorICAgICAqICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYW4gaWRlYSBmcm9tIHRoZSBTR0kgU1RMICh1c2luZyBhIEBhCisgICAgICogIGhlYWRlciBub2RlIHdoaWNoIGlzIG5lZWRlZCBmb3IgZWZmaWNpZW50IGl0ZXJhdGlvbikuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIENtcF9GbiwKKwkgICAgIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIFBCX0RTX0JJTl9UUkVFX05BTUUgOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICBwdWJsaWMgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMsCisjZW5kaWYKKyNpZmRlZiBQQl9EU19UUkVFX1RSQUNFCisgICAgICBwdWJsaWMgUEJfRFNfVFJFRV9UUkFDRV9CQVNFX0NfREVDLAorI2VuZGlmCisgICAgICBwdWJsaWMgQ21wX0ZuLAorICAgICAgcHVibGljIFBCX0RTX0JJTl9UUkVFX1RSQUlUU19CQVNFLAorICAgICAgcHVibGljIE5vZGVfQW5kX0l0X1RyYWl0czo6bm9kZV91cGRhdGUKKyAgICB7CisgICAgICB0eXBlZGVmIE5vZGVfQW5kX0l0X1RyYWl0cyAJCQl0cmFpdHNfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgUEJfRFNfQklOX1RSRUVfVFJBSVRTX0JBU0UgCSAgICAgICAJdHJhaXRzX2Jhc2U7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHR5cGVuYW1lIHRyYWl0c190eXBlOjpub2RlPjo6b3RoZXIKKyAgICAgIG5vZGVfYWxsb2NhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG5vZGVfYWxsb2NhdG9yOjp2YWx1ZV90eXBlIAlub2RlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2FsbG9jYXRvcjo6cG9pbnRlciAJCW5vZGVfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6bnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyCisgICAgICBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXI7CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBjb25kX2RlYWx0b3I8bm9kZSwgX0FsbG9jPiAJCWNvbmRfZGVhbHRvcl90OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHR5cGVkZWYgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgCQlkZWJ1Z19iYXNlOworI2VuZGlmCisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAkJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3R5cGUgCQlrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9wb2ludGVyIAlrZXlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9jb25zdF9wb2ludGVyIAlrZXlfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9yZWZlcmVuY2UgCWtleV9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfY29uc3RfcmVmZXJlbmNlIGtleV9jb25zdF9yZWZlcmVuY2U7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfdHlwZSAJbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfcG9pbnRlciAJbWFwcGVkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfY29uc3RfcG9pbnRlciBtYXBwZWRfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9yZWZlcmVuY2UgCW1hcHBlZF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfY29uc3RfcmVmZXJlbmNlIG1hcHBlZF9jb25zdF9yZWZlcmVuY2U7CisjZW5kaWYKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6dmFsdWVfdHlwZSAJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpwb2ludGVyIAkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpyZWZlcmVuY2UgCQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvaW50X2NvbnN0X2l0ZXJhdG9yIHBvaW50X2NvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHBvaW50X2NvbnN0X2l0ZXJhdG9yIAkJCWNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9pbnRfaXRlcmF0b3IgCXBvaW50X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBwb2ludF9pdGVyYXRvciAJCQkJaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvciAJcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om5vZGVfY29uc3RfaXRlcmF0b3Igbm9kZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om5vZGVfaXRlcmF0b3IgCW5vZGVfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpub2RlX3VwZGF0ZSAJbm9kZV91cGRhdGU7CisKKyAgICAgIHR5cGVkZWYgQ21wX0ZuIAkJCQkJY21wX2ZuOworICAgICAgdHlwZWRlZiBfQWxsb2MgCQkJCQlhbGxvY2F0b3JfdHlwZTsKKworICAgICAgUEJfRFNfQklOX1RSRUVfTkFNRSgpOworCisgICAgICBQQl9EU19CSU5fVFJFRV9OQU1FKGNvbnN0IENtcF9GbiYpOworCisgICAgICBQQl9EU19CSU5fVFJFRV9OQU1FKGNvbnN0IENtcF9GbiYsIGNvbnN0IG5vZGVfdXBkYXRlJik7CisKKyAgICAgIFBCX0RTX0JJTl9UUkVFX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB+UEJfRFNfQklOX1RSRUVfTkFNRSgpOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0OworCisgICAgICBDbXBfRm4mCisgICAgICBnZXRfY21wX2ZuKCk7CisKKyAgICAgIGNvbnN0IENtcF9GbiYKKyAgICAgIGdldF9jbXBfZm4oKSBjb25zdDsKKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIHBvaW50X2NvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChrZXlfY29uc3RfcmVmZXJlbmNlKSBjb25zdDsKKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIHBvaW50X2NvbnN0X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChrZXlfY29uc3RfcmVmZXJlbmNlKSBjb25zdDsKKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgcG9pbnRfY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgYmVnaW4oKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVuZCgpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0OworCisgICAgICBpbmxpbmUgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdDsKKworICAgICAgaW5saW5lIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKTsKKworICAgICAgaW5saW5lIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdDsKKworICAgICAgLy8vIFJldHVybnMgYSBjb25zdCBub2RlX2l0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vZGUgYXQgdGhlCisgICAgICAvLy8gcm9vdCBvZiB0aGUgdHJlZS4KKyAgICAgIGlubGluZSBub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBub2RlX2JlZ2luKCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm5zIGEgbm9kZV9pdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlIGF0IHRoZQorICAgICAgLy8vIHJvb3Qgb2YgdGhlIHRyZWUuCisgICAgICBpbmxpbmUgbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9iZWdpbigpOworCisgICAgICAvLy8gUmV0dXJucyBhIGNvbnN0IG5vZGVfaXRlcmF0b3IgY29ycmVzcG9uZGluZyB0byBhIG5vZGUganVzdAorICAgICAgLy8vIGFmdGVyIGEgbGVhZiBvZiB0aGUgdHJlZS4KKyAgICAgIGlubGluZSBub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBub2RlX2VuZCgpIGNvbnN0OworCisgICAgICAvLy8gUmV0dXJucyBhIG5vZGVfaXRlcmF0b3IgY29ycmVzcG9uZGluZyB0byBhIG5vZGUganVzdAorICAgICAgLy8vIGFmdGVyIGEgbGVhZiBvZiB0aGUgdHJlZS4KKyAgICAgIGlubGluZSBub2RlX2l0ZXJhdG9yCisgICAgICBub2RlX2VuZCgpOworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdm9pZAorICAgICAgdmFsdWVfc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBpbml0aWFsaXplX21pbl9tYXgoKTsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfaW1wX2VtcHR5KGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2xlYWZfbmV3KGNvbnN0X3JlZmVyZW5jZSwgbm9kZV9wb2ludGVyLCBib29sKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgZ2V0X25ld19ub2RlX2Zvcl9sZWFmX2luc2VydChjb25zdF9yZWZlcmVuY2UsIGZhbHNlX3R5cGUpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBnZXRfbmV3X25vZGVfZm9yX2xlYWZfaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSwgdHJ1ZV90eXBlKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGFjdHVhbF9lcmFzZV9ub2RlKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8bm9kZV9wb2ludGVyLCBib29sPgorICAgICAgZXJhc2Uobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHVwZGF0ZV9taW5fbWF4X2Zvcl9lcmFzZWRfbm9kZShub2RlX3BvaW50ZXIpOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgY2xlYXJfaW1wKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnRfbGVhZihjb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcm90YXRlX2xlZnQobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHJvdGF0ZV9yaWdodChub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcm90YXRlX3BhcmVudChub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgYXBwbHlfdXBkYXRlKG5vZGVfcG9pbnRlciwgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGVfPgorCWlubGluZSB2b2lkCisJYXBwbHlfdXBkYXRlKG5vZGVfcG9pbnRlciwgTm9kZV9VcGRhdGVfKik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICB1cGRhdGVfdG9fdG9wKG5vZGVfcG9pbnRlciwgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGVfPgorCWlubGluZSB2b2lkCisJdXBkYXRlX3RvX3RvcChub2RlX3BvaW50ZXIsIE5vZGVfVXBkYXRlXyopOworCisgICAgICBib29sCisgICAgICBqb2luX3ByZXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgam9pbl9maW5pc2goUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgYm9vbAorICAgICAgc3BsaXRfcHJlcChrZXlfY29uc3RfcmVmZXJlbmNlLCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBzcGxpdF9maW5pc2goUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgc2l6ZV90eXBlCisgICAgICByZWN1cnNpdmVfY291bnQobm9kZV9wb2ludGVyKSBjb25zdDsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIHN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChjb25zdCBub2RlX3BvaW50ZXIsIGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyAgICBwcml2YXRlOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfaXRlcmF0b3JzKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfY29uc2lzdGVudF93aXRoX2RlYnVnX2Jhc2UoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnRfd2l0aF9sZWZ0KGNvbnN0IG5vZGVfcG9pbnRlciwKKwkJCQkgICAgICAgY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnRfd2l0aF9yaWdodChjb25zdCBub2RlX3BvaW50ZXIsCisJCQkJCWNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfY29uc2lzdGVudF93aXRoX2RlYnVnX2Jhc2UoY29uc3Qgbm9kZV9wb2ludGVyLAorCQkJCQljb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X21pbihjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X21pbl9pbXAoY29uc3Qgbm9kZV9wb2ludGVyLCBjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X21heChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X21heF9pbXAoY29uc3Qgbm9kZV9wb2ludGVyLCBjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3NpemUoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0X3BvaW50ZXIsIGNvbnN0X3BvaW50ZXI+IG5vZGVfY29uc2lzdGVudF90OworCisgICAgICBub2RlX2NvbnNpc3RlbnRfdAorICAgICAgYXNzZXJ0X25vZGVfY29uc2lzdGVudF8oY29uc3Qgbm9kZV9wb2ludGVyLCBjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBpbml0aWFsaXplKCk7CisKKyAgICAgIG5vZGVfcG9pbnRlcgorICAgICAgcmVjdXJzaXZlX2NvcHlfbm9kZShjb25zdCBub2RlX3BvaW50ZXIpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgbm9kZV9wb2ludGVyIAkJbV9wX2hlYWQ7CisgICAgICBzaXplX3R5cGUgCQltX3NpemU7CisgICAgICBzdGF0aWMgbm9kZV9hbGxvY2F0b3IgCXNfbm9kZV9hbGxvY2F0b3I7CisgICAgfTsKKworI2RlZmluZSBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoWCkJCQkJXAorICBfR0xJQkNYWF9ERUJVR19PTkxZKFguc3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisjZGVmaW5lIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQoX05vZGUpCQkJCVwKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfbm9kZV9jb25zaXN0ZW50KF9Ob2RlLCBfX0ZJTEVfXywgX19MSU5FX18pOykKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9lcmFzZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vZmluZF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaW5mb19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcm90YXRlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwPgorCisjdW5kZWYgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVAorI3VuZGVmIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRAorI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19CSU5fVFJFRV9OQU1FCisjdW5kZWYgUEJfRFNfQklOX1RSRUVfVFJBSVRTX0JBU0UKKyN1bmRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQworCisjaWZkZWYgUEJfRFNfVFJFRV9UUkFDRQorI3VuZGVmIFBCX0RTX1RSRUVfVFJBQ0VfQkFTRV9DX0RFQworI2VuZGlmCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmFhZjQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyMTggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluX3NlYXJjaF90cmVlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2FsbG9jYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfbm9kZV9hbGxvY2F0b3I7CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19CSU5fVFJFRV9OQU1FKCkgOiBtX3BfaGVhZChzX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpKSwgbV9zaXplKDApCit7CisgIGluaXRpYWxpemUoKTsKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19CSU5fVFJFRV9OQU1FKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pIDoKKyAgQ21wX0ZuKHJfY21wX2ZuKSwgbV9wX2hlYWQoc19ub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKSksIG1fc2l6ZSgwKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfQklOX1RSRUVfTkFNRShjb25zdCBDbXBfRm4mIHJfY21wX2ZuLCBjb25zdCBub2RlX3VwZGF0ZSYgcl9ub2RlX3VwZGF0ZSkgOgorICBDbXBfRm4ocl9jbXBfZm4pLAorICBub2RlX3VwZGF0ZShyX25vZGVfdXBkYXRlKSwKKyAgbV9wX2hlYWQoc19ub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKSksCisgIG1fc2l6ZSgwKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfQklOX1RSRUVfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIDoKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICBkZWJ1Z19iYXNlKG90aGVyKSwKKyNlbmRpZiAKKyNpZmRlZiBQQl9EU19UUkVFX1RSQUNFCisgIFBCX0RTX1RSRUVfVFJBQ0VfQkFTRV9DX0RFQyhvdGhlciksCisjZW5kaWYgCisgIENtcF9GbihvdGhlciksCisgIG5vZGVfdXBkYXRlKG90aGVyKSwKKyAgbV9wX2hlYWQoc19ub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKSksCisgIG1fc2l6ZSgwKQoreworICBpbml0aWFsaXplKCk7CisgIG1fc2l6ZSA9IG90aGVyLm1fc2l6ZTsKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKG90aGVyKQorCisgICAgX190cnkKKyAgICAgIHsKKyAgICAgICAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSByZWN1cnNpdmVfY29weV9ub2RlKG90aGVyLm1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgICAgICAgaWYgKG1fcF9oZWFkLT5tX3BfcGFyZW50ICE9IDApCisJICBtX3BfaGVhZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudCA9IG1fcF9oZWFkOworICAgICAgICBtX3NpemUgPSBvdGhlci5tX3NpemU7CisgICAgICAgIGluaXRpYWxpemVfbWluX21heCgpOworICAgICAgfQorICAgIF9fY2F0Y2goLi4uKQorICAgICAgeworICAgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNsZWFyKCk7KQorCXNfbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX3BfaGVhZCwgMSk7CisgICAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgfQorICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKG90aGVyKQorICB2YWx1ZV9zd2FwKG90aGVyKTsKKyAgc3RkOjpzd2FwKChDbXBfRm4mICkoKnRoaXMpLCAoQ21wX0ZuJiApb3RoZXIpOworICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordmFsdWVfc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6c3dhcChvdGhlcik7KQorICBzdGQ6OnN3YXAobV9wX2hlYWQsIG90aGVyLm1fcF9oZWFkKTsKKyAgc3RkOjpzd2FwKG1fc2l6ZSwgb3RoZXIubV9zaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK35QQl9EU19CSU5fVFJFRV9OQU1FKCkKK3sKKyAgY2xlYXIoKTsKKyAgc19ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fcF9oZWFkLCAxKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luaXRpYWxpemUoKQoreworICBtX3BfaGVhZC0+bV9wX3BhcmVudCA9IDA7CisgIG1fcF9oZWFkLT5tX3BfbGVmdCA9IG1fcF9oZWFkOworICBtX3BfaGVhZC0+bV9wX3JpZ2h0ID0gbV9wX2hlYWQ7CisgIG1fc2l6ZSA9IDA7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CityZWN1cnNpdmVfY29weV9ub2RlKGNvbnN0IG5vZGVfcG9pbnRlciBwX25kKQoreworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybiAoMCk7CisKKyAgbm9kZV9wb2ludGVyIHBfcmV0ID0gc19ub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKyAgX190cnkKKyAgICB7CisgICAgICBuZXcgKHBfcmV0KSBub2RlKCpwX25kKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIHNfbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX3JldCwgMSk7CisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9CisKKyAgcF9yZXQtPm1fcF9sZWZ0ID0gcF9yZXQtPm1fcF9yaWdodCA9IDA7CisKKyAgX190cnkKKyAgICB7CisgICAgICBwX3JldC0+bV9wX2xlZnQgPSByZWN1cnNpdmVfY29weV9ub2RlKHBfbmQtPm1fcF9sZWZ0KTsKKyAgICAgIHBfcmV0LT5tX3BfcmlnaHQgPSByZWN1cnNpdmVfY29weV9ub2RlKHBfbmQtPm1fcF9yaWdodCk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBjbGVhcl9pbXAocF9yZXQpOworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorCisgIGlmIChwX3JldC0+bV9wX2xlZnQgIT0gMCkKKyAgICBwX3JldC0+bV9wX2xlZnQtPm1fcF9wYXJlbnQgPSBwX3JldDsKKworICBpZiAocF9yZXQtPm1fcF9yaWdodCAhPSAwKQorICAgIHBfcmV0LT5tX3BfcmlnaHQtPm1fcF9wYXJlbnQgPSBwX3JldDsKKworICBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKHBfcmV0KQorICByZXR1cm4gcF9yZXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citpbml0aWFsaXplX21pbl9tYXgoKQoreworICBpZiAobV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gMCkKKyAgICB7CisgICAgICBtX3BfaGVhZC0+bV9wX2xlZnQgPSBtX3BfaGVhZC0+bV9wX3JpZ2h0ID0gbV9wX2hlYWQ7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHsKKyAgICBub2RlX3BvaW50ZXIgcF9taW4gPSBtX3BfaGVhZC0+bV9wX3BhcmVudDsKKyAgICB3aGlsZSAocF9taW4tPm1fcF9sZWZ0ICE9IDApCisgICAgICBwX21pbiA9IHBfbWluLT5tX3BfbGVmdDsKKyAgICBtX3BfaGVhZC0+bV9wX2xlZnQgPSBwX21pbjsKKyAgfQorCisgIHsKKyAgICBub2RlX3BvaW50ZXIgcF9tYXggPSBtX3BfaGVhZC0+bV9wX3BhcmVudDsKKyAgICB3aGlsZSAocF9tYXgtPm1fcF9yaWdodCAhPSAwKQorICAgICAgcF9tYXggPSBwX21heC0+bV9wX3JpZ2h0OworICAgIG1fcF9oZWFkLT5tX3BfcmlnaHQgPSBwX21heDsKKyAgfQorfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNTZkMjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDI3NyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5fc2VhcmNoX3RyZWVfL2RlYnVnX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIHN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZChfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9jb25zaXN0ZW50X3dpdGhfZGVidWdfYmFzZShfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9zaXplKF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X2l0ZXJhdG9ycyhfX2ZpbGUsIF9fbGluZSk7CisgIGlmIChtX3BfaGVhZC0+bV9wX3BhcmVudCA9PSAwKQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3NpemUgPT0gMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKG1fc2l6ZSA+IDApOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3BfaGVhZCAhPSAwKTsKKyAgaWYgKG1fcF9oZWFkLT5tX3BfcGFyZW50ID09IDApCisgICAgeworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKG1fcF9oZWFkLT5tX3BfbGVmdCA9PSBtX3BfaGVhZCk7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkobV9wX2hlYWQtPm1fcF9yaWdodCA9PSBtX3BfaGVhZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKG1fcF9oZWFkLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50ID09IG1fcF9oZWFkKTsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3BfaGVhZC0+bV9wX2xlZnQgIT0gbV9wX2hlYWQpOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKG1fcF9oZWFkLT5tX3BfcmlnaHQgIT0gbV9wX2hlYWQpOworICAgIH0KKworICBpZiAobV9wX2hlYWQtPm1fcF9wYXJlbnQgIT0gMCkKKyAgICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KG1fcF9oZWFkLT5tX3BfcGFyZW50LCBfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9taW4oX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfbWF4KF9fZmlsZSwgX19saW5lKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9ub2RlX2NvbnNpc3RlbnQoY29uc3Qgbm9kZV9wb2ludGVyIHBfbmQsCisJCSAgICAgICBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnRfKHBfbmQsIF9fZmlsZSwgX19saW5lKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2NvbnNpc3RlbnRfdAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X25vZGVfY29uc2lzdGVudF8oY29uc3Qgbm9kZV9wb2ludGVyIHBfbmQsCisJCQljb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuIChzdGQ6Om1ha2VfcGFpcigoY29uc3RfcG9pbnRlcikwLChjb25zdF9wb2ludGVyKTApKTsKKworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50X3dpdGhfbGVmdChwX25kLCBfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnRfd2l0aF9yaWdodChwX25kLCBfX2ZpbGUsIF9fbGluZSk7CisKKyAgY29uc3Qgc3RkOjpwYWlyPGNvbnN0X3BvaW50ZXIsIGNvbnN0X3BvaW50ZXI+CisgICAgbF9yYW5nZSA9IGFzc2VydF9ub2RlX2NvbnNpc3RlbnRfKHBfbmQtPm1fcF9sZWZ0LCBfX2ZpbGUsIF9fbGluZSk7CisKKyAgaWYgKGxfcmFuZ2Uuc2Vjb25kICE9IDApCisgICAgUEJfRFNfREVCVUdfVkVSSUZZKENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYoKmxfcmFuZ2Uuc2Vjb25kKSwKKwkJCQkJICBQQl9EU19WMkYocF9uZC0+bV92YWx1ZSkpKTsKKworICBjb25zdCBzdGQ6OnBhaXI8Y29uc3RfcG9pbnRlciwgY29uc3RfcG9pbnRlcj4KKyAgICByX3JhbmdlID0gYXNzZXJ0X25vZGVfY29uc2lzdGVudF8ocF9uZC0+bV9wX3JpZ2h0LCBfX2ZpbGUsIF9fbGluZSk7CisKKyAgaWYgKHJfcmFuZ2UuZmlyc3QgIT0gMCkKKyAgICBQQl9EU19ERUJVR19WRVJJRlkoQ21wX0ZuOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSwKKwkJCQkJICAgICBQQl9EU19WMkYoKnJfcmFuZ2UuZmlyc3QpKSk7CisKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKChsX3JhbmdlLmZpcnN0ICE9IDApID8gbF9yYW5nZS5maXJzdCA6ICZwX25kLT5tX3ZhbHVlLAorCQkJKHJfcmFuZ2Uuc2Vjb25kICE9IDApPyByX3JhbmdlLnNlY29uZCA6ICZwX25kLT5tX3ZhbHVlKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9ub2RlX2NvbnNpc3RlbnRfd2l0aF9sZWZ0KGNvbnN0IG5vZGVfcG9pbnRlciBwX25kLAorCQkJCSBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGlmIChwX25kLT5tX3BfbGVmdCA9PSAwKQorICAgIHJldHVybjsKKyAgUEJfRFNfREVCVUdfVkVSSUZZKHBfbmQtPm1fcF9sZWZ0LT5tX3BfcGFyZW50ID09IHBfbmQpOworICBQQl9EU19ERUJVR19WRVJJRlkoIUNtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9uZC0+bV92YWx1ZSksCisJCQkJCSBQQl9EU19WMkYocF9uZC0+bV9wX2xlZnQtPm1fdmFsdWUpKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbm9kZV9jb25zaXN0ZW50X3dpdGhfcmlnaHQoY29uc3Qgbm9kZV9wb2ludGVyIHBfbmQsCisJCQkJICBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGlmIChwX25kLT5tX3BfcmlnaHQgPT0gMCkKKyAgICByZXR1cm47CisgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kLT5tX3BfcmlnaHQtPm1fcF9wYXJlbnQgPT0gcF9uZCk7CisgIFBCX0RTX0RFQlVHX1ZFUklGWSghQ21wX0ZuOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX25kLT5tX3BfcmlnaHQtPm1fdmFsdWUpLAorCQkJCQkgUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbWluKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgYXNzZXJ0X21pbl9pbXAobV9wX2hlYWQtPm1fcF9wYXJlbnQsIF9fZmlsZSwgX19saW5lKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9taW5faW1wKGNvbnN0IG5vZGVfcG9pbnRlciBwX25kLCBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGlmIChwX25kID09IDApCisgICAgeworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKG1fcF9oZWFkLT5tX3BfbGVmdCA9PSBtX3BfaGVhZCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChwX25kLT5tX3BfbGVmdCA9PSAwKQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kID09IG1fcF9oZWFkLT5tX3BfbGVmdCk7CisgICAgICByZXR1cm47CisgICAgfQorICBhc3NlcnRfbWluX2ltcChwX25kLT5tX3BfbGVmdCwgX19maWxlLCBfX2xpbmUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X21heChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGFzc2VydF9tYXhfaW1wKG1fcF9oZWFkLT5tX3BfcGFyZW50LCBfX2ZpbGUsIF9fbGluZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbWF4X2ltcChjb25zdCBub2RlX3BvaW50ZXIgcF9uZCwKKwkgICAgICAgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBpZiAocF9uZCA9PSAwKQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3BfaGVhZC0+bV9wX3JpZ2h0ID09IG1fcF9oZWFkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHBfbmQtPm1fcF9yaWdodCA9PSAwKQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kID09IG1fcF9oZWFkLT5tX3BfcmlnaHQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBhc3NlcnRfbWF4X2ltcChwX25kLT5tX3BfcmlnaHQsIF9fZmlsZSwgX19saW5lKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9pdGVyYXRvcnMoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBzaXplX3R5cGUgaXRlcmF0ZWRfbnVtID0gMDsKKyAgY29uc3RfaXRlcmF0b3IgcHJldl9pdCA9IGVuZCgpOworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsgaXQgIT0gZW5kKCk7ICsraXQpCisgICAgeworICAgICAgKytpdGVyYXRlZF9udW07CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkobG93ZXJfYm91bmQoUEJfRFNfVjJGKCppdCkpLm1fcF9uZCA9PSBpdC5tX3BfbmQpOworICAgICAgY29uc3RfaXRlcmF0b3IgdXBwZXJfYm91bmRfaXQgPSB1cHBlcl9ib3VuZChQQl9EU19WMkYoKml0KSk7CisgICAgICAtLXVwcGVyX2JvdW5kX2l0OworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKHVwcGVyX2JvdW5kX2l0Lm1fcF9uZCA9PSBpdC5tX3BfbmQpOworCisgICAgICBpZiAocHJldl9pdCAhPSBlbmQoKSkKKwlQQl9EU19ERUJVR19WRVJJRlkoQ21wX0ZuOjpvcGVyYXRvcigpKFBCX0RTX1YyRigqcHJldl9pdCksCisJCQkJCSAgICAgIFBCX0RTX1YyRigqaXQpKSk7CisgICAgICBwcmV2X2l0ID0gaXQ7CisgICAgfQorCisgIFBCX0RTX0RFQlVHX1ZFUklGWShpdGVyYXRlZF9udW0gPT0gbV9zaXplKTsKKyAgc2l6ZV90eXBlIHJldmVyc2VfaXRlcmF0ZWRfbnVtID0gMDsKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZXZlcnNlX3ByZXZfaXQgPSByZW5kKCk7CisgIGZvciAoY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZXZlcnNlX2l0ID0gcmJlZ2luKCk7IHJldmVyc2VfaXQgIT0gcmVuZCgpOworICAgICAgICsrcmV2ZXJzZV9pdCkKKyAgICB7CisgICAgICArK3JldmVyc2VfaXRlcmF0ZWRfbnVtOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKGxvd2VyX2JvdW5kKAorCQkJCSAgIFBCX0RTX1YyRigqcmV2ZXJzZV9pdCkpLm1fcF9uZCA9PSByZXZlcnNlX2l0Lm1fcF9uZCk7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kX2l0ID0gdXBwZXJfYm91bmQoUEJfRFNfVjJGKCpyZXZlcnNlX2l0KSk7CisgICAgICAtLXVwcGVyX2JvdW5kX2l0OworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKHVwcGVyX2JvdW5kX2l0Lm1fcF9uZCA9PSByZXZlcnNlX2l0Lm1fcF9uZCk7CisgICAgICBpZiAocmV2ZXJzZV9wcmV2X2l0ICE9IHJlbmQoKSkKKwlQQl9EU19ERUJVR19WRVJJRlkoIUNtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYoKnJldmVyc2VfcHJldl9pdCksCisJCQkJCSAgICAgICBQQl9EU19WMkYoKnJldmVyc2VfaXQpKSk7CisgICAgICByZXZlcnNlX3ByZXZfaXQgPSByZXZlcnNlX2l0OworICAgIH0KKyAgUEJfRFNfREVCVUdfVkVSSUZZKHJldmVyc2VfaXRlcmF0ZWRfbnVtID09IG1fc2l6ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfY29uc2lzdGVudF93aXRoX2RlYnVnX2Jhc2UoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBkZWJ1Z19iYXNlOjpjaGVja19zaXplKG1fc2l6ZSwgX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfY29uc2lzdGVudF93aXRoX2RlYnVnX2Jhc2UobV9wX2hlYWQtPm1fcF9wYXJlbnQsIF9fZmlsZSwgX19saW5lKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9jb25zaXN0ZW50X3dpdGhfZGVidWdfYmFzZShjb25zdCBub2RlX3BvaW50ZXIgcF9uZCwKKwkJCQkgIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm47CisgIGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMoUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLCBfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9jb25zaXN0ZW50X3dpdGhfZGVidWdfYmFzZShwX25kLT5tX3BfbGVmdCwgX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfY29uc2lzdGVudF93aXRoX2RlYnVnX2Jhc2UocF9uZC0+bV9wX3JpZ2h0LCBfX2ZpbGUsIF9fbGluZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfc2l6ZShjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7IFBCX0RTX0RFQlVHX1ZFUklGWShyZWN1cnNpdmVfY291bnQobV9wX2hlYWQtPm1fcF9wYXJlbnQpID09IG1fc2l6ZSk7IH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjkwODMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9lcmFzZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEwMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5fc2VhcmNoX3RyZWVfL2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FjdHVhbF9lcmFzZV9ub2RlKG5vZGVfcG9pbnRlciBwX3opCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3NpemUgPiAwKTsKKyAgLS1tX3NpemU7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6ZXJhc2VfZXhpc3RpbmcoUEJfRFNfVjJGKHBfei0+bV92YWx1ZSkpOykKKyAgcF96LT5+bm9kZSgpOworICBzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF96LCAxKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cGRhdGVfbWluX21heF9mb3JfZXJhc2VkX25vZGUobm9kZV9wb2ludGVyIHBfeikKK3sKKyAgaWYgKG1fc2l6ZSA9PSAxKQorICAgIHsKKyAgICAgIG1fcF9oZWFkLT5tX3BfbGVmdCA9IG1fcF9oZWFkLT5tX3BfcmlnaHQgPSBtX3BfaGVhZDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKG1fcF9oZWFkLT5tX3BfbGVmdCA9PSBwX3opCisgICAgeworICAgICAgaXRlcmF0b3IgaXQocF96KTsKKyAgICAgICsraXQ7CisgICAgICBtX3BfaGVhZC0+bV9wX2xlZnQgPSBpdC5tX3BfbmQ7CisgICAgfQorICBlbHNlIGlmIChtX3BfaGVhZC0+bV9wX3JpZ2h0ID09IHBfeikKKyAgICB7CisgICAgICBpdGVyYXRvciBpdChwX3opOworICAgICAgLS1pdDsKKyAgICAgIG1fcF9oZWFkLT5tX3BfcmlnaHQgPSBpdC5tX3BfbmQ7CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXIoKQoreworICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgY2xlYXJfaW1wKG1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgbV9zaXplID0gMDsKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNsZWFyKCk7KQorICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyX2ltcChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm47CisKKyAgY2xlYXJfaW1wKHBfbmQtPm1fcF9sZWZ0KTsKKyAgY2xlYXJfaW1wKHBfbmQtPm1fcF9yaWdodCk7CisgIHBfbmQtPn5ub2RlKCk7CisgIHNfbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX25kLCAxKTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2ZpbmRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9maW5kX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMWVmOTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9maW5kX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTcxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbl9zZWFyY2hfdHJlZV8vZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2xvd2VyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIG5vZGVfcG9pbnRlciBwX3BvdCA9IG1fcF9oZWFkOworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9oZWFkLT5tX3BfcGFyZW50OworCisgIHdoaWxlIChwX25kICE9IDApCisgICAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9uZC0+bV92YWx1ZSksIHJfa2V5KSkKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisgICAgZWxzZQorICAgICAgeworCXBfcG90ID0gcF9uZDsKKwlwX25kID0gcF9uZC0+bV9wX2xlZnQ7CisgICAgICB9CisgIHJldHVybiBpdGVyYXRvcihwX3BvdCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citsb3dlcl9ib3VuZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreworICBub2RlX3BvaW50ZXIgcF9wb3QgPSBtX3BfaGVhZDsKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3BfaGVhZC0+bV9wX3BhcmVudDsKKworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLCByX2tleSkpCisgICAgICBwX25kID0gcF9uZC0+bV9wX3JpZ2h0OworICAgIGVsc2UKKyAgICAgIHsKKwlwX3BvdCA9IHBfbmQ7CisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICByZXR1cm4gaXRlcmF0b3IocF9wb3QpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9jb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBwZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgbm9kZV9wb2ludGVyIHBfcG90ID0gbV9wX2hlYWQ7CisgIG5vZGVfcG9pbnRlciBwX25kID0gbV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisKKyAgd2hpbGUgKHBfbmQgIT0gMCkKKyAgICBpZiAoQ21wX0ZuOjpvcGVyYXRvcigpKHJfa2V5LCBQQl9EU19WMkYocF9uZC0+bV92YWx1ZSkpKQorICAgICAgeworCXBfcG90ID0gcF9uZDsKKwlwX25kID0gcF9uZC0+bV9wX2xlZnQ7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcF9uZCA9IHBfbmQtPm1fcF9yaWdodDsKKyAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHBfcG90KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwcGVyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIG5vZGVfcG9pbnRlciBwX3BvdCA9IG1fcF9oZWFkOworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9oZWFkLT5tX3BfcGFyZW50OworCisgIHdoaWxlIChwX25kICE9IDApCisgICAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpKSkKKyAgICAgIHsKKwlwX3BvdCA9IHBfbmQ7CisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisgIHJldHVybiBwb2ludF9pdGVyYXRvcihwX3BvdCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBub2RlX3BvaW50ZXIgcF9wb3QgPSBtX3BfaGVhZDsKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3BfaGVhZC0+bV9wX3BhcmVudDsKKworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIGlmICghQ21wX0ZuOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSwgcl9rZXkpKQorICAgICAgeworCXBfcG90ID0gcF9uZDsKKwlwX25kID0gcF9uZC0+bV9wX2xlZnQ7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcF9uZCA9IHBfbmQtPm1fcF9yaWdodDsKKworICBub2RlX3BvaW50ZXIgcmV0ID0gcF9wb3Q7CisgIGlmIChwX3BvdCAhPSBtX3BfaGVhZCkKKyAgICB7CisgICAgICBjb25zdCBib29sIF9fY21wID0gQ21wX0ZuOjpvcGVyYXRvcigpKHJfa2V5LCBQQl9EU19WMkYocF9wb3QtPm1fdmFsdWUpKTsKKyAgICAgIGlmIChfX2NtcCkKKwlyZXQgPSBtX3BfaGVhZDsKKyAgICB9CisgIHJldHVybiBwb2ludF9pdGVyYXRvcihyZXQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9jb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAoreworICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgbm9kZV9wb2ludGVyIHBfcG90ID0gbV9wX2hlYWQ7CisgIG5vZGVfcG9pbnRlciBwX25kID0gbV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisKKyAgd2hpbGUgKHBfbmQgIT0gMCkKKyAgICBpZiAoIUNtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9uZC0+bV92YWx1ZSksIHJfa2V5KSkKKyAgICAgIHsKKwlwX3BvdCA9IHBfbmQ7CisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisKKyAgbm9kZV9wb2ludGVyIHJldCA9IHBfcG90OworICBpZiAocF9wb3QgIT0gbV9wX2hlYWQpCisgICAgeworICAgICAgY29uc3QgYm9vbCBfX2NtcCA9IENtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKHBfcG90LT5tX3ZhbHVlKSk7CisgICAgICBpZiAoX19jbXApCisJcmV0ID0gbV9wX2hlYWQ7CisgICAgfQorICByZXR1cm4gcG9pbnRfY29uc3RfaXRlcmF0b3IocmV0KTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2luZm9fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9pbmZvX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NWM0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9pbmZvX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNjQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluX3NlYXJjaF90cmVlXy9pbmZvX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VtcHR5KCkgY29uc3QKK3sKKyAgcmV0dXJuIChtX3NpemUgPT0gMCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2l6ZSgpIGNvbnN0Cit7CisgIHJldHVybiAobV9zaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CittYXhfc2l6ZSgpIGNvbnN0Cit7CisgIHJldHVybiAoc19ub2RlX2FsbG9jYXRvci5tYXhfc2l6ZSgpKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTdkYjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9pbnNlcnRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxODAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluX3NlYXJjaF90cmVlXy9pbnNlcnRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgc3RkOjpwYWlyPHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvciwgYm9vbD4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydF9sZWFmKGNvbnN0X3JlZmVyZW5jZSByX3ZhbHVlKQoreworICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKworICBpZiAobV9zaXplID09IDApCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGluc2VydF9pbXBfZW1wdHkocl92YWx1ZSksCisJCQkgIHRydWUpOworCisgIG5vZGVfcG9pbnRlciBwX25kID0gbV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisgIG5vZGVfcG9pbnRlciBwX3BvdCA9IG1fcF9oZWFkOworCisgIHdoaWxlIChwX25kICE9IDApCisgICAgaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLAorCQkJICAgIFBCX0RTX1YyRihyX3ZhbHVlKSkpCisgICAgICB7CisJcF9wb3QgPSBwX25kOworCisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisKKyAgaWYgKHBfcG90ID09IG1fcF9oZWFkKQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpbnNlcnRfbGVhZl9uZXcocl92YWx1ZSwgbV9wX2hlYWQtPm1fcF9yaWdodCwgZmFsc2UpLAorCQkJICB0cnVlKTsKKworICBpZiAoIUNtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYocl92YWx1ZSksCisJCQkgIFBCX0RTX1YyRihwX3BvdC0+bV92YWx1ZSkpKQorICAgIHsKKyAgICAgIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhQQl9EU19WMkYocl92YWx1ZSkpCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocF9wb3QsIGZhbHNlKTsKKyAgICB9CisKKyAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKFBCX0RTX1YyRihyX3ZhbHVlKSkKKworICBwX25kID0gcF9wb3QtPm1fcF9sZWZ0OworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpbnNlcnRfbGVhZl9uZXcocl92YWx1ZSwgcF9wb3QsIHRydWUpLAorCQkJICB0cnVlKTsKKworICB3aGlsZSAocF9uZC0+bV9wX3JpZ2h0ICE9IDApCisgICAgcF9uZCA9IHBfbmQtPm1fcF9yaWdodDsKKworICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaW5zZXJ0X2xlYWZfbmV3KHJfdmFsdWUsIHBfbmQsIGZhbHNlKSwKKwkJCXRydWUpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2xlYWZfbmV3KGNvbnN0X3JlZmVyZW5jZSByX3ZhbHVlLCBub2RlX3BvaW50ZXIgcF9uZCwgYm9vbCBsZWZ0X25kKQoreworICBub2RlX3BvaW50ZXIgcF9uZXdfbmQgPQorICAgIGdldF9uZXdfbm9kZV9mb3JfbGVhZl9pbnNlcnQocl92YWx1ZSwKKwkJCQkgdHJhaXRzX2Jhc2U6Om1fbm9fdGhyb3dfY29waWVzX2luZGljYXRvcik7CisKKyAgaWYgKGxlZnRfbmQpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fcF9sZWZ0ID09IDApOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYocl92YWx1ZSksCisJCQkJCSAgICAgICBQQl9EU19WMkYocF9uZC0+bV92YWx1ZSkpKTsKKworICAgICAgcF9uZC0+bV9wX2xlZnQgPSBwX25ld19uZDsKKyAgICAgIGlmIChtX3BfaGVhZC0+bV9wX2xlZnQgPT0gcF9uZCkKKwltX3BfaGVhZC0+bV9wX2xlZnQgPSBwX25ld19uZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX3JpZ2h0ID09IDApOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9uZC0+bV92YWx1ZSksCisJCQkJCSAgICAgICBQQl9EU19WMkYocl92YWx1ZSkpKTsKKworICAgICAgcF9uZC0+bV9wX3JpZ2h0ID0gcF9uZXdfbmQ7CisgICAgICBpZiAobV9wX2hlYWQtPm1fcF9yaWdodCA9PSBwX25kKQorCW1fcF9oZWFkLT5tX3BfcmlnaHQgPSBwX25ld19uZDsKKyAgICB9CisKKyAgcF9uZXdfbmQtPm1fcF9wYXJlbnQgPSBwX25kOworICBwX25ld19uZC0+bV9wX2xlZnQgPSBwX25ld19uZC0+bV9wX3JpZ2h0ID0gMDsKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX25kKQorCisgIHVwZGF0ZV90b190b3AocF9uZXdfbmQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoUEJfRFNfVjJGKHJfdmFsdWUpKTspCisgIHJldHVybiBpdGVyYXRvcihwX25ld19uZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnRfaW1wX2VtcHR5KGNvbnN0X3JlZmVyZW5jZSByX3ZhbHVlKQoreworICBub2RlX3BvaW50ZXIgcF9uZXdfbm9kZSA9CisgICAgZ2V0X25ld19ub2RlX2Zvcl9sZWFmX2luc2VydChyX3ZhbHVlLCB0cmFpdHNfYmFzZTo6bV9ub190aHJvd19jb3BpZXNfaW5kaWNhdG9yKTsKKworICBtX3BfaGVhZC0+bV9wX2xlZnQgPSBtX3BfaGVhZC0+bV9wX3JpZ2h0ID0KKyAgICBtX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfbmV3X25vZGU7CisKKyAgcF9uZXdfbm9kZS0+bV9wX3BhcmVudCA9IG1fcF9oZWFkOworICBwX25ld19ub2RlLT5tX3BfbGVmdCA9IHBfbmV3X25vZGUtPm1fcF9yaWdodCA9IDA7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhQQl9EU19WMkYocl92YWx1ZSkpOykKKworICB1cGRhdGVfdG9fdG9wKG1fcF9oZWFkLT5tX3BfcGFyZW50LCAobm9kZV91cGRhdGUqKXRoaXMpOworICByZXR1cm4gaXRlcmF0b3IocF9uZXdfbm9kZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X25ld19ub2RlX2Zvcl9sZWFmX2luc2VydChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIGZhbHNlX3R5cGUpCit7CisgIG5vZGVfcG9pbnRlciBwX25ld19uZCA9IHNfbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisgIGNvbmRfZGVhbHRvcl90IGNvbmQocF9uZXdfbmQpOworCisgIG5ldyAoY29uc3RfY2FzdDx2b2lkKiA+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqID4oJnBfbmV3X25kLT5tX3ZhbHVlKSkpCisgICAgdHlwZW5hbWUgbm9kZTo6dmFsdWVfdHlwZShyX3ZhbCk7CisKKyAgY29uZC5zZXRfbm9fYWN0aW9uKCk7CisgIHBfbmV3X25kLT5tX3BfbGVmdCA9IHBfbmV3X25kLT5tX3BfcmlnaHQgPSAwOworICArK21fc2l6ZTsKKyAgcmV0dXJuIHBfbmV3X25kOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9uZXdfbm9kZV9mb3JfbGVhZl9pbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCB0cnVlX3R5cGUpCit7CisgIG5vZGVfcG9pbnRlciBwX25ld19uZCA9IHNfbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisKKyAgbmV3IChjb25zdF9jYXN0PHZvaWQqID4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCogPigmcF9uZXdfbmQtPm1fdmFsdWUpKSkKKyAgICB0eXBlbmFtZSBub2RlOjp2YWx1ZV90eXBlKHJfdmFsKTsKKworICBwX25ld19uZC0+bV9wX2xlZnQgPSBwX25ld19uZC0+bV9wX3JpZ2h0ID0gMDsKKyAgKyttX3NpemU7CisgIHJldHVybiBwX25ld19uZDsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWI3YzFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTM2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbl9zZWFyY2hfdHJlZV8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKQoreworICByZXR1cm4gKGl0ZXJhdG9yKG1fcF9oZWFkLT5tX3BfbGVmdCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKSBjb25zdAoreworICByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKG1fcF9oZWFkLT5tX3BfbGVmdCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkKK3sKKyAgcmV0dXJuIChpdGVyYXRvcihtX3BfaGVhZCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkgY29uc3QKK3sKKyAgcmV0dXJuIChjb25zdF9pdGVyYXRvcihtX3BfaGVhZCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CityYmVnaW4oKSBjb25zdAoreworICByZXR1cm4gKGNvbnN0X3JldmVyc2VfaXRlcmF0b3IobV9wX2hlYWQtPm1fcF9yaWdodCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpyZXZlcnNlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CityYmVnaW4oKQoreworICByZXR1cm4gKHJldmVyc2VfaXRlcmF0b3IobV9wX2hlYWQtPm1fcF9yaWdodCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpyZXZlcnNlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CityZW5kKCkKK3sKKyAgcmV0dXJuIChyZXZlcnNlX2l0ZXJhdG9yKG1fcF9oZWFkKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlbmQoKSBjb25zdAoreworICByZXR1cm4gKGNvbnN0X3JldmVyc2VfaXRlcmF0b3IobV9wX2hlYWQpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9jb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm9kZV9iZWdpbigpIGNvbnN0Cit7CisgIHJldHVybiAobm9kZV9jb25zdF9pdGVyYXRvcihtX3BfaGVhZC0+bV9wX3BhcmVudCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citub2RlX2JlZ2luKCkKK3sKKyAgcmV0dXJuIChub2RlX2l0ZXJhdG9yKG1fcF9oZWFkLT5tX3BfcGFyZW50KSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vZGVfZW5kKCkgY29uc3QKK3sKKyAgcmV0dXJuIChub2RlX2NvbnN0X2l0ZXJhdG9yKDApKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm9kZV9lbmQoKQoreworICByZXR1cm4gKG5vZGVfaXRlcmF0b3IoMCkpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9ub2RlX2l0ZXJhdG9ycy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9ub2RlX2l0ZXJhdG9ycy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4N2I4ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL25vZGVfaXRlcmF0b3JzLmhwcApAQCAtMCwwICsxLDE4OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5fc2VhcmNoX3RyZWVfL25vZGVfaXRlcmF0b3JzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworI2lmbmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfTk9ERV9JVEVSQVRPUlNfSFBQCisjZGVmaW5lIFBCX0RTX0JJTl9TRUFSQ0hfVFJFRV9OT0RFX0lURVJBVE9SU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjZGVmaW5lIFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQyBcCisgICAgYmluX3NlYXJjaF90cmVlX2NvbnN0X25vZGVfaXRfPE5vZGUsIENvbnN0X0l0ZXJhdG9yLCBJdGVyYXRvciwgX0FsbG9jPgorCisgICAgLy8vIENvbnN0IG5vZGUgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZSwKKwkgICAgIGNsYXNzIENvbnN0X0l0ZXJhdG9yLAorCSAgICAgY2xhc3MgSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYmluX3NlYXJjaF90cmVlX2NvbnN0X25vZGVfaXRfCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKyAgICAgIE5vZGU+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgbm9kZV9wb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgLy8vIENhdGVnb3J5LgorICAgICAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgLy8vIERpZmZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl9kaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgICAvLy8gSXRlcmF0b3IncyB2YWx1ZSB0eXBlLgorICAgICAgdHlwZWRlZiBDb25zdF9JdGVyYXRvciB2YWx1ZV90eXBlOworCisgICAgICAvLy8gSXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgQ29uc3RfSXRlcmF0b3IgcmVmZXJlbmNlOworCisgICAgICAvLy8gSXRlcmF0b3IncyBfX2NvbnN0IHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiBDb25zdF9JdGVyYXRvciBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIC8vLyBNZXRhZGF0YSB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlOjptZXRhZGF0YV90eXBlIG1ldGFkYXRhX3R5cGU7CisKKyAgICAgIC8vLyBDb25zdCBtZXRhZGF0YSByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPG1ldGFkYXRhX3R5cGU+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlCisgICAgICBtZXRhZGF0YV9jb25zdF9yZWZlcmVuY2U7CisKKworICAgICAgYmluX3NlYXJjaF90cmVlX2NvbnN0X25vZGVfaXRfKGNvbnN0IG5vZGVfcG9pbnRlciBwX25kID0gMCkKKyAgICAgIDogbV9wX25kKGNvbnN0X2Nhc3Q8bm9kZV9wb2ludGVyPihwX25kKSkKKyAgICAgIHsgfQorCisgICAgICAvLy8gQWNjZXNzLgorICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gQ29uc3RfSXRlcmF0b3IobV9wX25kKTsgfQorCisgICAgICAvLy8gTWV0YWRhdGEgYWNjZXNzLgorICAgICAgbWV0YWRhdGFfY29uc3RfcmVmZXJlbmNlCisgICAgICBnZXRfbWV0YWRhdGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX25kLT5nZXRfbWV0YWRhdGEoKTsgfQorCisgICAgICAvLy8gUmV0dXJucyB0aGUgX19jb25zdCBub2RlIGl0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGVmdCBub2RlLgorICAgICAgUEJfRFNfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDCisgICAgICBnZXRfbF9jaGlsZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBQQl9EU19UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMobV9wX25kLT5tX3BfbGVmdCk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIF9fY29uc3Qgbm9kZSBpdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIHJpZ2h0IG5vZGUuCisgICAgICBQQl9EU19UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMKKyAgICAgIGdldF9yX2NoaWxkKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQyhtX3BfbmQtPm1fcF9yaWdodCk7IH0KKworICAgICAgLy8vIENvbXBhcmVzIHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgUEJfRFNfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZCA9PSBvdGhlci5tX3BfbmQ7IH0KKworICAgICAgLy8vIENvbXBhcmVzIChuZWdhdGl2ZWx5KSB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfbmQgIT0gb3RoZXIubV9wX25kOyB9CisKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfbmQ7CisgICAgfTsKKworI2RlZmluZSBQQl9EU19UUkVFX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMgXAorICAgIGJpbl9zZWFyY2hfdHJlZV9ub2RlX2l0XzxOb2RlLCBDb25zdF9JdGVyYXRvciwgSXRlcmF0b3IsIF9BbGxvYz4KKworICAgIC8vLyBOb2RlIGl0ZXJhdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGUsCisJICAgICBjbGFzcyBDb25zdF9JdGVyYXRvciwKKwkgICAgIGNsYXNzIEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIGJpbl9zZWFyY2hfdHJlZV9ub2RlX2l0XworICAgIDogcHVibGljIFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisgICAgICBOb2RlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIG5vZGVfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBJdGVyYXRvcidzIHZhbHVlIHR5cGUuCisgICAgICB0eXBlZGVmIEl0ZXJhdG9yIHZhbHVlX3R5cGU7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiBJdGVyYXRvciByZWZlcmVuY2U7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIF9fY29uc3QgcmVmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmIEl0ZXJhdG9yIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgaW5saW5lCisgICAgICBiaW5fc2VhcmNoX3RyZWVfbm9kZV9pdF8oY29uc3Qgbm9kZV9wb2ludGVyIHBfbmQgPSAwKQorICAgICAgOiBQQl9EU19UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMoY29uc3RfY2FzdDxub2RlX3BvaW50ZXI+KHBfbmQpKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBBY2Nlc3MuCisgICAgICBJdGVyYXRvcgorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIEl0ZXJhdG9yKFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQzo6bV9wX25kKTsgfQorCisgICAgICAvLy8gUmV0dXJucyB0aGUgbm9kZSBpdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGxlZnQgbm9kZS4KKyAgICAgIFBCX0RTX1RSRUVfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQworICAgICAgZ2V0X2xfY2hpbGQoKSBjb25zdAorICAgICAgeworCXJldHVybiBQQl9EU19UUkVFX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMoCisJCQkJCQkgICAgUEJfRFNfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDOjptX3BfbmQtPm1fcF9sZWZ0KTsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIG5vZGUgaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByaWdodCBub2RlLgorICAgICAgUEJfRFNfVFJFRV9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDCisgICAgICBnZXRfcl9jaGlsZCgpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIFBCX0RTX1RSRUVfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQygKKwkJCQkJCSAgICBQQl9EU19UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUM6Om1fcF9uZC0+bV9wX3JpZ2h0KTsKKyAgICAgIH0KKworICAgIH07CisKKyN1bmRlZiBQQl9EU19UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19UUkVFX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfQklOX1NFQVJDSF9UUkVFX05PREVfSVRFUkFUT1JTX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcG9pbnRfaXRlcmF0b3JzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3BvaW50X2l0ZXJhdG9ycy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlNGFiMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3BvaW50X2l0ZXJhdG9ycy5ocHAKQEAgLTAsMCArMSwzNjcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluX3NlYXJjaF90cmVlXy9wb2ludF9pdGVyYXRvcnMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0JJTl9TRUFSQ0hfVFJFRV9GSU5EX0lURVJBVE9SU19IUFAKKyNkZWZpbmUgUEJfRFNfQklOX1NFQVJDSF9UUkVFX0ZJTkRfSVRFUkFUT1JTX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworCisjZGVmaW5lIFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMJCQkJCVwKKyAgICBiaW5fc2VhcmNoX3RyZWVfY29uc3RfaXRfPAkJCQkJCVwKKwkJCQkJCU5vZGVfUG9pbnRlciwJCVwKKwkJCQkJCVZhbHVlX1R5cGUsCQlcCisJCQkJCQlQb2ludGVyLAkJXAorCQkJCQkJQ29uc3RfUG9pbnRlciwJCVwKKwkJCQkJCVJlZmVyZW5jZSwJCVwKKwkJCQkJCUNvbnN0X1JlZmVyZW5jZSwJXAorCQkJCQkJSXNfRm9yd2FyZF9JdGVyYXRvciwJXAorCQkJCQkJX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX1RSRUVfQ09OU1RfT0RJUl9JVF9DX0RFQwkJCQkJXAorICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9pdF88CQkJCQkJXAorCQkJCQkJTm9kZV9Qb2ludGVyLAkJXAorCQkJCQkJVmFsdWVfVHlwZSwJCVwKKwkJCQkJCVBvaW50ZXIsCQlcCisJCQkJCQlDb25zdF9Qb2ludGVyLAkJXAorCQkJCQkJUmVmZXJlbmNlLAkJXAorCQkJCQkJQ29uc3RfUmVmZXJlbmNlLAlcCisJCQkJCQkhSXNfRm9yd2FyZF9JdGVyYXRvciwJXAorCQkJCQkJX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX1RSRUVfSVRfQ19ERUMJCQkJCQlcCisgICAgYmluX3NlYXJjaF90cmVlX2l0XzwJCQkJCQlcCisJCQkJCQlOb2RlX1BvaW50ZXIsCQlcCisJCQkJCQlWYWx1ZV9UeXBlLAkJXAorCQkJCQkJUG9pbnRlciwJCVwKKwkJCQkJCUNvbnN0X1BvaW50ZXIsCQlcCisJCQkJCQlSZWZlcmVuY2UsCQlcCisJCQkJCQlDb25zdF9SZWZlcmVuY2UsCVwKKwkJCQkJCUlzX0ZvcndhcmRfSXRlcmF0b3IsCVwKKwkJCQkJCV9BbGxvYz4KKworI2RlZmluZSBQQl9EU19UUkVFX09ESVJfSVRfQ19ERUMJCQkJCVwKKyAgICBiaW5fc2VhcmNoX3RyZWVfaXRfPAkJCQkJCVwKKwkJCQkJCQlOb2RlX1BvaW50ZXIsCVwKKwkJCQkJCQlWYWx1ZV9UeXBlLAlcCisJCQkJCQkJUG9pbnRlciwJXAorCQkJCQkJCUNvbnN0X1BvaW50ZXIsCVwKKwkJCQkJCQlSZWZlcmVuY2UsCVwKKwkJCQkJCQlDb25zdF9SZWZlcmVuY2UsIFwKKwkJCQkJCQkhSXNfRm9yd2FyZF9JdGVyYXRvciwgXAorCQkJCQkJCV9BbGxvYz4KKworICAgIC8vLyBDb25zdCBpdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1BvaW50ZXIsCisJICAgICB0eXBlbmFtZSBWYWx1ZV9UeXBlLAorCSAgICAgdHlwZW5hbWUgUG9pbnRlciwKKwkgICAgIHR5cGVuYW1lIENvbnN0X1BvaW50ZXIsCisJICAgICB0eXBlbmFtZSBSZWZlcmVuY2UsCisJICAgICB0eXBlbmFtZSBDb25zdF9SZWZlcmVuY2UsCisJICAgICBib29sIElzX0ZvcndhcmRfSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYmluX3NlYXJjaF90cmVlX2NvbnN0X2l0XworICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgCQlpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgVmFsdWVfVHlwZSAJCQkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgUG9pbnRlciAJCQkJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIENvbnN0X1BvaW50ZXIgCQkJCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIFJlZmVyZW5jZSAJCQkJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBDb25zdF9SZWZlcmVuY2UgCQkJCWNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgaW5saW5lCisgICAgICBiaW5fc2VhcmNoX3RyZWVfY29uc3RfaXRfKGNvbnN0IE5vZGVfUG9pbnRlciBwX25kID0gMCkgCisgICAgICA6IG1fcF9uZChjb25zdF9jYXN0PE5vZGVfUG9pbnRlcj4ocF9uZCkpCisgICAgICB7IH0KKworICAgICAgaW5saW5lCisgICAgICBiaW5fc2VhcmNoX3RyZWVfY29uc3RfaXRfKGNvbnN0IFBCX0RTX1RSRUVfQ09OU1RfT0RJUl9JVF9DX0RFQyYgb3RoZXIpIAorICAgICAgOiBtX3BfbmQob3RoZXIubV9wX25kKQorICAgICAgeyB9CisKKyAgICAgIGlubGluZQorICAgICAgUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQyYgCisgICAgICBvcGVyYXRvcj0oY29uc3QgUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQyYgb3RoZXIpCisgICAgICB7CisJbV9wX25kID0gb3RoZXIubV9wX25kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5saW5lCisgICAgICBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDJiAKKyAgICAgIG9wZXJhdG9yPShjb25zdCBQQl9EU19UUkVFX0NPTlNUX09ESVJfSVRfQ19ERUMmIG90aGVyKQorICAgICAgeworCW1fcF9uZCA9IG90aGVyLm1fcF9uZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZSBjb25zdF9wb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX25kICE9IDApOworCXJldHVybiAmbV9wX25kLT5tX3ZhbHVlOworICAgICAgfQorCisgICAgICBpbmxpbmUgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbmQgIT0gMCk7CisJcmV0dXJuIG1fcF9uZC0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQyAmIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX25kID09IG90aGVyLm1fcF9uZDsgfQorCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBQQl9EU19UUkVFX0NPTlNUX09ESVJfSVRfQ19ERUMgJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZCA9PSBvdGhlci5tX3BfbmQ7IH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfbmQgIT0gb3RoZXIubV9wX25kOyB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IFBCX0RTX1RSRUVfQ09OU1RfT0RJUl9JVF9DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfbmQgIT0gb3RoZXIubV9wX25kOyB9CisKKyAgICAgIGlubGluZSBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDJiAKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbmQgIT0gMCk7CisJaW5jKGludGVncmFsX2NvbnN0YW50PGludCxJc19Gb3J3YXJkX0l0ZXJhdG9yPigpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZSBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDIHJldF9pdChtX3BfbmQpOworCW9wZXJhdG9yKysoKTsKKwlyZXR1cm4gcmV0X2l0OworICAgICAgfQorCisgICAgICBpbmxpbmUgUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQyYgCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKwlkZWMoaW50ZWdyYWxfY29uc3RhbnQ8aW50LElzX0ZvcndhcmRfSXRlcmF0b3I+KCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5saW5lIFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeworCVBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMgcmV0X2l0KG1fcF9uZCk7CisJb3BlcmF0b3ItLSgpOworCXJldHVybiByZXRfaXQ7CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBpbmxpbmUgdm9pZAorICAgICAgaW5jKGZhbHNlX3R5cGUpCisgICAgICB7IGRlYyh0cnVlX3R5cGUoKSk7IH0KKworICAgICAgdm9pZAorICAgICAgaW5jKHRydWVfdHlwZSkKKyAgICAgIHsKKwlpZiAobV9wX25kLT5zcGVjaWFsKCkmJiAKKwkgICAgbV9wX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50ID09IG1fcF9uZCkKKwkgIHsKKwkgICAgbV9wX25kID0gbV9wX25kLT5tX3BfbGVmdDsKKwkgICAgcmV0dXJuOworCSAgfQorCisJaWYgKG1fcF9uZC0+bV9wX3JpZ2h0ICE9IDApCisJICB7CisJICAgIG1fcF9uZCA9IG1fcF9uZC0+bV9wX3JpZ2h0OworCSAgICB3aGlsZSAobV9wX25kLT5tX3BfbGVmdCAhPSAwKQorCSAgICAgIG1fcF9uZCA9IG1fcF9uZC0+bV9wX2xlZnQ7CisJICAgIHJldHVybjsKKwkgIH0KKworCU5vZGVfUG9pbnRlciBwX3kgPSBtX3BfbmQtPm1fcF9wYXJlbnQ7CisJd2hpbGUgKG1fcF9uZCA9PSBwX3ktPm1fcF9yaWdodCkKKwkgIHsKKwkgICAgbV9wX25kID0gcF95OworCSAgICBwX3kgPSBwX3ktPm1fcF9wYXJlbnQ7CisJICB9CisKKwlpZiAobV9wX25kLT5tX3BfcmlnaHQgIT0gcF95KQorCSAgbV9wX25kID0gcF95OworICAgICAgfQorCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZGVjKGZhbHNlX3R5cGUpCisgICAgICB7IGluYyh0cnVlX3R5cGUoKSk7IH0KKworICAgICAgdm9pZAorICAgICAgZGVjKHRydWVfdHlwZSkKKyAgICAgIHsKKwlpZiAobV9wX25kLT5zcGVjaWFsKCkgJiYgbV9wX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50ID09IG1fcF9uZCkKKwkgIHsKKwkgICAgbV9wX25kID0gbV9wX25kLT5tX3BfcmlnaHQ7CisJICAgIHJldHVybjsKKwkgIH0KKworCWlmIChtX3BfbmQtPm1fcF9sZWZ0ICE9IDApCisJICB7CisJICAgIE5vZGVfUG9pbnRlciBwX3kgPSBtX3BfbmQtPm1fcF9sZWZ0OworCSAgICB3aGlsZSAocF95LT5tX3BfcmlnaHQgIT0gMCkKKwkgICAgICBwX3kgPSBwX3ktPm1fcF9yaWdodDsKKwkgICAgbV9wX25kID0gcF95OworCSAgICByZXR1cm47CisJICB9CisKKwlOb2RlX1BvaW50ZXIgcF95ID0gbV9wX25kLT5tX3BfcGFyZW50OworCXdoaWxlIChtX3BfbmQgPT0gcF95LT5tX3BfbGVmdCkKKwkgIHsKKwkgICAgbV9wX25kID0gcF95OworCSAgICBwX3kgPSBwX3ktPm1fcF9wYXJlbnQ7CisJICB9CisJaWYgKG1fcF9uZC0+bV9wX2xlZnQgIT0gcF95KQorCSAgbV9wX25kID0gcF95OworICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgTm9kZV9Qb2ludGVyIG1fcF9uZDsKKyAgICB9OworCisgICAgLy8vIEl0ZXJhdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfUG9pbnRlciwKKwkgICAgIHR5cGVuYW1lIFZhbHVlX1R5cGUsCisJICAgICB0eXBlbmFtZSBQb2ludGVyLAorCSAgICAgdHlwZW5hbWUgQ29uc3RfUG9pbnRlciwKKwkgICAgIHR5cGVuYW1lIFJlZmVyZW5jZSwKKwkgICAgIHR5cGVuYW1lIENvbnN0X1JlZmVyZW5jZSwKKwkgICAgIGJvb2wgSXNfRm9yd2FyZF9JdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBiaW5fc2VhcmNoX3RyZWVfaXRfIDogcHVibGljIFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMKKyAgICB7CisgICAgcHVibGljOgorICAgICAgaW5saW5lCisgICAgICBiaW5fc2VhcmNoX3RyZWVfaXRfKGNvbnN0IE5vZGVfUG9pbnRlciBwX25kID0gMCkgCisgICAgICA6IFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMoKE5vZGVfUG9pbnRlcilwX25kKQorICAgICAgeyB9CisKKyAgICAgIGlubGluZQorICAgICAgYmluX3NlYXJjaF90cmVlX2l0Xyhjb25zdCBQQl9EU19UUkVFX09ESVJfSVRfQ19ERUMmIG90aGVyKSAKKyAgICAgIDogUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQyhvdGhlci5tX3BfbmQpCisgICAgICB7IH0KKworICAgICAgaW5saW5lCisgICAgICBQQl9EU19UUkVFX0lUX0NfREVDJiAKKyAgICAgIG9wZXJhdG9yPShjb25zdCBQQl9EU19UUkVFX0lUX0NfREVDJiBvdGhlcikKKyAgICAgIHsKKwliYXNlX2l0X3R5cGU6Om1fcF9uZCA9IG90aGVyLm1fcF9uZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZQorICAgICAgUEJfRFNfVFJFRV9JVF9DX0RFQyYgCisgICAgICBvcGVyYXRvcj0oY29uc3QgUEJfRFNfVFJFRV9PRElSX0lUX0NfREVDJiBvdGhlcikKKyAgICAgIHsKKwliYXNlX2l0X3R5cGU6Om1fcF9uZCA9IG90aGVyLm1fcF9uZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDOjpwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV9pdF90eXBlOjptX3BfbmQgIT0gMCk7CisJcmV0dXJuICZiYXNlX2l0X3R5cGU6Om1fcF9uZC0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUM6OnJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV9pdF90eXBlOjptX3BfbmQgIT0gMCk7CisJcmV0dXJuIGJhc2VfaXRfdHlwZTo6bV9wX25kLT5tX3ZhbHVlOworICAgICAgfQorCisgICAgICBpbmxpbmUgUEJfRFNfVFJFRV9JVF9DX0RFQyYgCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDOjogb3BlcmF0b3IrKygpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5saW5lIFBCX0RTX1RSRUVfSVRfQ19ERUMKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCVBCX0RTX1RSRUVfSVRfQ19ERUMgcmV0X2l0KGJhc2VfaXRfdHlwZTo6bV9wX25kKTsKKwlvcGVyYXRvcisrKCk7CisJcmV0dXJuIHJldF9pdDsKKyAgICAgIH0KKworICAgICAgaW5saW5lIFBCX0RTX1RSRUVfSVRfQ19ERUMmIAorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQzo6IG9wZXJhdG9yLS0oKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZSBQQl9EU19UUkVFX0lUX0NfREVDCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlQQl9EU19UUkVFX0lUX0NfREVDIHJldF9pdChiYXNlX2l0X3R5cGU6Om1fcF9uZCk7CisJb3BlcmF0b3ItLSgpOworCXJldHVybiByZXRfaXQ7CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMgYmFzZV9pdF90eXBlOworICAgIH07CisKKyN1bmRlZiBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDCisjdW5kZWYgUEJfRFNfVFJFRV9DT05TVF9PRElSX0lUX0NfREVDCisjdW5kZWYgUEJfRFNfVFJFRV9JVF9DX0RFQworI3VuZGVmIFBCX0RTX1RSRUVfT0RJUl9JVF9DX0RFQworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTM3ZDFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDUyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbl9zZWFyY2hfdHJlZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK0NtcF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfY21wX2ZuKCkKK3sgcmV0dXJuICgqdGhpcyk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IENtcF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfY21wX2ZuKCkgY29uc3QKK3sgcmV0dXJuICgqdGhpcyk7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcl9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3JfZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3MTEyOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3JfZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluX3NlYXJjaF90cmVlXy9yX2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FjdHVhbF9lcmFzZV9ub2RlKG5vZGVfcG9pbnRlciBwX3opCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3NpemUgPiAwKTsKKyAgLS1tX3NpemU7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZXJhc2VfZXhpc3RpbmcoUEJfRFNfVjJGKHBfei0+bV92YWx1ZSkpOykKKyAgcF96LT5+bm9kZSgpOworICBzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF96LCAxKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cGRhdGVfbWluX21heF9mb3JfZXJhc2VkX25vZGUobm9kZV9wb2ludGVyIHBfeikKK3sKKyAgaWYgKG1fc2l6ZSA9PSAxKQorICAgIHsKKyAgICAgIG1fcF9oZWFkLT5tX3BfbGVmdCA9IG1fcF9oZWFkLT5tX3BfcmlnaHQgPSBtX3BfaGVhZDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKG1fcF9oZWFkLT5tX3BfbGVmdCA9PSBwX3opCisgICAgeworICAgICAgaXRlcmF0b3IgaXQocF96KTsKKyAgICAgICsraXQ7CisgICAgICBtX3BfaGVhZC0+bV9wX2xlZnQgPSBpdC5tX3BfbmQ7CisgICAgfQorICBlbHNlIGlmIChtX3BfaGVhZC0+bV9wX3JpZ2h0ID09IHBfeikKKyAgICB7CisgICAgICBpdGVyYXRvciBpdChwX3opOworICAgICAgLS1pdDsKKyAgICAgIG1fcF9oZWFkLT5tX3BfcmlnaHQgPSBpdC5tX3BfbmQ7CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXIoKQoreworICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgY2xlYXJfaW1wKG1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgbV9zaXplID0gMDsKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNsZWFyKCk7KQorICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyX2ltcChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm47CisKKyAgY2xlYXJfaW1wKHBfbmQtPm1fcF9sZWZ0KTsKKyAgY2xlYXJfaW1wKHBfbmQtPm1fcF9yaWdodCk7CisgIHBfbmQtPn5Ob2RlKCk7CisgIHNfbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX25kLCAxKTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3JvdGF0ZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3JvdGF0ZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmE0YzJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcm90YXRlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTU1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbl9zZWFyY2hfdHJlZV8vcm90YXRlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBzIGZvciByb3RhdGluZyBub2Rlcy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JvdGF0ZV9sZWZ0KG5vZGVfcG9pbnRlciBwX3gpCit7CisgIG5vZGVfcG9pbnRlciBwX3kgPSBwX3gtPm1fcF9yaWdodDsKKworICBwX3gtPm1fcF9yaWdodCA9IHBfeS0+bV9wX2xlZnQ7CisKKyAgaWYgKHBfeS0+bV9wX2xlZnQgIT0gMCkKKyAgICBwX3ktPm1fcF9sZWZ0LT5tX3BfcGFyZW50ID0gcF94OworCisgIHBfeS0+bV9wX3BhcmVudCA9IHBfeC0+bV9wX3BhcmVudDsKKworICBpZiAocF94ID09IG1fcF9oZWFkLT5tX3BfcGFyZW50KQorICAgIG1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcF95OworICBlbHNlIGlmIChwX3ggPT0gcF94LT5tX3BfcGFyZW50LT5tX3BfbGVmdCkKKyAgICBwX3gtPm1fcF9wYXJlbnQtPm1fcF9sZWZ0ID0gcF95OworICBlbHNlCisgICAgcF94LT5tX3BfcGFyZW50LT5tX3BfcmlnaHQgPSBwX3k7CisKKyAgcF95LT5tX3BfbGVmdCA9IHBfeDsKKyAgcF94LT5tX3BfcGFyZW50ID0gcF95OworCisgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF94KQorICBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKHBfeSkKKworICBhcHBseV91cGRhdGUocF94LCAobm9kZV91cGRhdGUqICl0aGlzKTsKKyAgYXBwbHlfdXBkYXRlKHBfeC0+bV9wX3BhcmVudCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorcm90YXRlX3JpZ2h0KG5vZGVfcG9pbnRlciBwX3gpCit7CisgIG5vZGVfcG9pbnRlciBwX3kgPSBwX3gtPm1fcF9sZWZ0OworCisgIHBfeC0+bV9wX2xlZnQgPSBwX3ktPm1fcF9yaWdodDsKKworICBpZiAocF95LT5tX3BfcmlnaHQgIT0gMCkKKyAgICBwX3ktPm1fcF9yaWdodC0+bV9wX3BhcmVudCA9IHBfeDsKKworICBwX3ktPm1fcF9wYXJlbnQgPSBwX3gtPm1fcF9wYXJlbnQ7CisKKyAgaWYgKHBfeCA9PSBtX3BfaGVhZC0+bV9wX3BhcmVudCkKKyAgICBtX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfeTsKKyAgZWxzZSBpZiAocF94ID09IHBfeC0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0KQorICAgIHBfeC0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0ID0gcF95OworICBlbHNlCisgICAgcF94LT5tX3BfcGFyZW50LT5tX3BfbGVmdCA9IHBfeTsKKworICBwX3ktPm1fcF9yaWdodCA9IHBfeDsKKyAgcF94LT5tX3BfcGFyZW50ID0gcF95OworCisgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF94KQorICBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKHBfeSkKKworICBhcHBseV91cGRhdGUocF94LCAobm9kZV91cGRhdGUqICl0aGlzKTsKKyAgYXBwbHlfdXBkYXRlKHBfeC0+bV9wX3BhcmVudCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorcm90YXRlX3BhcmVudChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfcGFyZW50ID0gcF9uZC0+bV9wX3BhcmVudDsKKworICBpZiAocF9uZCA9PSBwX3BhcmVudC0+bV9wX2xlZnQpCisgICAgcm90YXRlX3JpZ2h0KHBfcGFyZW50KTsKKyAgZWxzZQorICAgIHJvdGF0ZV9sZWZ0KHBfcGFyZW50KTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9wYXJlbnQtPm1fcF9wYXJlbnQgPSBwX25kKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fcF9sZWZ0ID09IHBfcGFyZW50IHx8CisJCSAgIHBfbmQtPm1fcF9yaWdodCA9PSBwX3BhcmVudCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXBwbHlfdXBkYXRlKG5vZGVfcG9pbnRlciAvKnBfbmQqLywgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyIC8qcF91cGRhdGUqLykKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGVfPgoraW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FwcGx5X3VwZGF0ZShub2RlX3BvaW50ZXIgcF9uZCwgTm9kZV9VcGRhdGVfKiAgLypwX3VwZGF0ZSovKQoreworICBub2RlX3VwZGF0ZTo6b3BlcmF0b3IoKShub2RlX2l0ZXJhdG9yKHBfbmQpLAorCQkJICBub2RlX2NvbnN0X2l0ZXJhdG9yKHN0YXRpY19jYXN0PG5vZGVfcG9pbnRlcj4oMCkpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlXz4KK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cGRhdGVfdG9fdG9wKG5vZGVfcG9pbnRlciBwX25kLCBOb2RlX1VwZGF0ZV8qIHBfdXBkYXRlKQoreworICB3aGlsZSAocF9uZCAhPSBtX3BfaGVhZCkKKyAgICB7CisgICAgICBhcHBseV91cGRhdGUocF9uZCwgcF91cGRhdGUpOworCisgICAgICBwX25kID0gcF9uZC0+bV9wX3BhcmVudDsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBkYXRlX3RvX3RvcChub2RlX3BvaW50ZXIgLypwX25kKi8sIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlciAvKnBfdXBkYXRlKi8pCit7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlNzQ2NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxNTAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluX3NlYXJjaF90cmVlXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbl9wcmVwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgaWYgKG90aGVyLm1fc2l6ZSA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobV9zaXplID09IDApCisgICAgeworICAgICAgdmFsdWVfc3dhcChvdGhlcik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGNvbnN0IGJvb2wgZ3JlYXRlciA9CisgICAgQ21wX0ZuOjpvcGVyYXRvcigpKFBCX0RTX1YyRihtX3BfaGVhZC0+bV9wX3JpZ2h0LT5tX3ZhbHVlKSwKKwkJICAgICAgIFBCX0RTX1YyRihvdGhlci5tX3BfaGVhZC0+bV9wX2xlZnQtPm1fdmFsdWUpKTsKKworICBjb25zdCBib29sIGxlc3NlciA9CisgICAgQ21wX0ZuOjpvcGVyYXRvcigpKFBCX0RTX1YyRihvdGhlci5tX3BfaGVhZC0+bV9wX3JpZ2h0LT5tX3ZhbHVlKSwKKwkJICAgICAgIFBCX0RTX1YyRihtX3BfaGVhZC0+bV9wX2xlZnQtPm1fdmFsdWUpKTsKKworICBpZiAoIWdyZWF0ZXIgJiYgIWxlc3NlcikKKyAgICBfX3Rocm93X2pvaW5fZXJyb3IoKTsKKworICBpZiAobGVzc2VyKQorICAgIHZhbHVlX3N3YXAob3RoZXIpOworCisgIG1fc2l6ZSArPSBvdGhlci5tX3NpemU7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6am9pbihvdGhlcik7KQorICByZXR1cm4gdHJ1ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW5fZmluaXNoKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgaW5pdGlhbGl6ZV9taW5fbWF4KCk7CisgIG90aGVyLmluaXRpYWxpemUoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2Jvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGl0X3ByZXAoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICBvdGhlci5jbGVhcigpOworCisgIGlmIChtX3NpemUgPT0gMCkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKG1fcF9oZWFkLT5tX3BfbGVmdC0+bV92YWx1ZSkpKQorICAgIHsKKyAgICAgIHZhbHVlX3N3YXAob3RoZXIpOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghQ21wX0ZuOjpvcGVyYXRvcigpKHJfa2V5LCBQQl9EU19WMkYobV9wX2hlYWQtPm1fcF9yaWdodC0+bV92YWx1ZSkpKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAobV9zaXplID09IDEpCisgICAgeworICAgICAgdmFsdWVfc3dhcChvdGhlcik7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpzcGxpdChyX2tleSwoQ21wX0ZuJiApKCp0aGlzKSwgb3RoZXIpOykKKyAgcmV0dXJuIHRydWU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdF9maW5pc2goUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBvdGhlci5pbml0aWFsaXplX21pbl9tYXgoKTsKKyAgb3RoZXIubV9zaXplID0gc3RkOjpkaXN0YW5jZShvdGhlci5iZWdpbigpLCBvdGhlci5lbmQoKSk7CisgIG1fc2l6ZSAtPSBvdGhlci5tX3NpemU7CisgIGluaXRpYWxpemVfbWluX21heCgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjdXJzaXZlX2NvdW50KG5vZGVfcG9pbnRlciBwKSBjb25zdAoreworICBpZiAocCA9PSAwKQorICAgIHJldHVybiAwOworICByZXR1cm4gMSArIHJlY3Vyc2l2ZV9jb3VudChwLT5tX3BfbGVmdCkgKyByZWN1cnNpdmVfY291bnQocC0+bV9wX3JpZ2h0KTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vdHJhaXRzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3RyYWl0cy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1YTdjMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3RyYWl0cy5ocHAKQEAgLTAsMCArMSwyNDEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluX3NlYXJjaF90cmVlXy90cmFpdHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0JJTl9TRUFSQ0hfVFJFRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisjZGVmaW5lIFBCX0RTX0JJTl9TRUFSQ0hfVFJFRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcG9pbnRfaXRlcmF0b3JzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vbm9kZV9pdGVyYXRvcnMuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gQmluYXJ5IHNlYXJjaCB0cmVlIHRyYWl0cywgcHJpbWFyeSB0ZW1wbGF0ZQorICAgIC8vLyBAaW5ncm91cCB0cmFpdHMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgICBjbGFzcyBDbXBfRm4sCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsCisJCSAgICAgIGNsYXNzIE5vZGVfSXRyLAorCQkgICAgICBjbGFzcyBDbXBfRm4sCisJCSAgICAgIHR5cGVuYW1lIF9BbGxvYz4KKwkgICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgY2xhc3MgTm9kZSwKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgYmluX3NlYXJjaF90cmVlX3RyYWl0cworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlc190cmFpdHM8S2V5LCBNYXBwZWQsIF9BbGxvYywgZmFsc2U+IHR5cGVfdHJhaXRzOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBOb2RlIG5vZGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9pdF88CisJdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJbm9kZT46Om90aGVyOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjp2YWx1ZV90eXBlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9wb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpyZWZlcmVuY2UsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3JlZmVyZW5jZSwKKwl0cnVlLAorCV9BbGxvYz4KKyAgICAgIHBvaW50X2NvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBiaW5fc2VhcmNoX3RyZWVfaXRfPAorCXR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCW5vZGU+OjpvdGhlcjo6cG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6dmFsdWVfdHlwZSwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6cG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6Y29uc3RfcG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6cmVmZXJlbmNlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9yZWZlcmVuY2UsCisJdHJ1ZSwKKwlfQWxsb2M+CisgICAgICBwb2ludF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgYmluX3NlYXJjaF90cmVlX2NvbnN0X2l0XzwKKwl0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKwlub2RlPjo6b3RoZXI6OnBvaW50ZXIsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OnZhbHVlX3R5cGUsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OnBvaW50ZXIsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3BvaW50ZXIsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OnJlZmVyZW5jZSwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6Y29uc3RfcmVmZXJlbmNlLAorCWZhbHNlLAorCV9BbGxvYz4KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9pdF88CisJdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJbm9kZT46Om90aGVyOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjp2YWx1ZV90eXBlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9wb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpyZWZlcmVuY2UsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3JlZmVyZW5jZSwKKwlmYWxzZSwKKwlfQWxsb2M+CisgICAgICByZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLy8gVGhpcyBpcyBhbiBpdGVyYXRvciB0byBhbiBpdGVyYXRvcjogaXQgaXRlcmF0ZXMgb3ZlciBub2RlcywKKyAgICAgIC8vLyBhbmQgZGUtcmVmZXJlbmNpbmcgaXQgcmV0dXJucyBvbmUgb2YgdGhlIHRyZWUncyBpdGVyYXRvcnMuCisgICAgICB0eXBlZGVmCisgICAgICBiaW5fc2VhcmNoX3RyZWVfY29uc3Rfbm9kZV9pdF88CisJTm9kZSwKKwlwb2ludF9jb25zdF9pdGVyYXRvciwKKwlwb2ludF9pdGVyYXRvciwKKwlfQWxsb2M+CisgICAgICBub2RlX2NvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBiaW5fc2VhcmNoX3RyZWVfbm9kZV9pdF88CisJTm9kZSwKKwlwb2ludF9jb25zdF9pdGVyYXRvciwKKwlwb2ludF9pdGVyYXRvciwKKwlfQWxsb2M+CisgICAgICBub2RlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBOb2RlX1VwZGF0ZTwKKwlub2RlX2NvbnN0X2l0ZXJhdG9yLAorCW5vZGVfaXRlcmF0b3IsCisJQ21wX0ZuLAorCV9BbGxvYz4KKyAgICAgIG5vZGVfdXBkYXRlOworCisgICAgICB0eXBlZGVmCisgICAgICBfX2dudV9wYmRzOjpudWxsX25vZGVfdXBkYXRlPAorCW5vZGVfY29uc3RfaXRlcmF0b3IsCisJbm9kZV9pdGVyYXRvciwKKwlDbXBfRm4sCisJX0FsbG9jPiogCisgICAgICBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXI7CisgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbi4KKyAgICAvLy8gQGluZ3JvdXAgdHJhaXRzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgY2xhc3MgQ21wX0ZuLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLAorCQkgICAgICBjbGFzcyBOb2RlX0l0ciwKKwkJICAgICAgY2xhc3MgQ21wX0ZuLAorCQkgICAgICB0eXBlbmFtZSBfQWxsb2M+CisJICAgICBjbGFzcyBOb2RlX1VwZGF0ZSwKKwkgICAgIGNsYXNzIE5vZGUsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IGJpbl9zZWFyY2hfdHJlZV90cmFpdHM8CisgICAgICBLZXksCisgICAgICBudWxsX3R5cGUsCisgICAgICBDbXBfRm4sCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIE5vZGUsCisgICAgICBfQWxsb2M+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVzX3RyYWl0czxLZXksIG51bGxfdHlwZSwgX0FsbG9jLCBmYWxzZT4gdHlwZV90cmFpdHM7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIE5vZGUgbm9kZTsKKworICAgICAgdHlwZWRlZgorICAgICAgYmluX3NlYXJjaF90cmVlX2NvbnN0X2l0XzwKKwl0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKwlub2RlPjo6b3RoZXI6OnBvaW50ZXIsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OnZhbHVlX3R5cGUsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OnBvaW50ZXIsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3BvaW50ZXIsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OnJlZmVyZW5jZSwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6Y29uc3RfcmVmZXJlbmNlLAorCXRydWUsCisJX0FsbG9jPgorICAgICAgcG9pbnRfY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgcG9pbnRfY29uc3RfaXRlcmF0b3IgcG9pbnRfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9pdF88CisJdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJbm9kZT46Om90aGVyOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjp2YWx1ZV90eXBlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9wb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpyZWZlcmVuY2UsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3JlZmVyZW5jZSwKKwlmYWxzZSwKKwlfQWxsb2M+CisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8vIFRoaXMgaXMgYW4gaXRlcmF0b3IgdG8gYW4gaXRlcmF0b3I6IGl0IGl0ZXJhdGVzIG92ZXIgbm9kZXMsCisgICAgICAvLy8gYW5kIGRlLXJlZmVyZW5jaW5nIGl0IHJldHVybnMgb25lIG9mIHRoZSB0cmVlJ3MgaXRlcmF0b3JzLgorICAgICAgdHlwZWRlZgorICAgICAgYmluX3NlYXJjaF90cmVlX2NvbnN0X25vZGVfaXRfPAorCU5vZGUsCisJcG9pbnRfY29uc3RfaXRlcmF0b3IsCisJcG9pbnRfaXRlcmF0b3IsCisJX0FsbG9jPgorICAgICAgbm9kZV9jb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBub2RlX2NvbnN0X2l0ZXJhdG9yIG5vZGVfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIE5vZGVfVXBkYXRlPG5vZGVfY29uc3RfaXRlcmF0b3IsIG5vZGVfaXRlcmF0b3IsIENtcF9GbiwgX0FsbG9jPgorICAgICAgbm9kZV91cGRhdGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIF9fZ251X3BiZHM6Om51bGxfbm9kZV91cGRhdGU8CisJbm9kZV9jb25zdF9pdGVyYXRvciwKKwlub2RlX2l0ZXJhdG9yLAorCUNtcF9GbiwKKwlfQWxsb2M+KiAKKyAgICAgIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcjsKKyAgICB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9iaW5hcnlfaGVhcF8uaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9iaW5hcnlfaGVhcF8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjc3MmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2JpbmFyeV9oZWFwXy5ocHAKQEAgLTAsMCArMSwzNTIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluYXJ5X2hlYXBfL2JpbmFyeV9oZWFwXy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbmFyeSBoZWFwLgorICovCisKKyNpZm5kZWYgUEJfRFNfQklOQVJZX0hFQVBfSFBQCisjZGVmaW5lIFBCX0RTX0JJTkFSWV9IRUFQX0hQUAorCisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lbnRyeV9jbXAuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2VudHJ5X3ByZWQuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3Jlc2l6ZV9wb2xpY3kuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3BvaW50X2NvbnN0X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9jb25zdF9pdGVyYXRvci5ocHA+CisjaWZkZWYgUEJfRFNfQklOQVJZX0hFQVBfVFJBQ0VfCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIGJpbmFyeV9oZWFwPFZhbHVlX1R5cGUsIENtcF9GbiwgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX0VOVFJZX0NNUF9ERUMgXAorICAgIGVudHJ5X2NtcDxWYWx1ZV9UeXBlLCBDbXBfRm4sIF9BbGxvYywgaXNfc2ltcGxlPFZhbHVlX1R5cGU+Ojp2YWx1ZT46OnR5cGUKKworI2RlZmluZSBQQl9EU19SRVNJWkVfUE9MSUNZX0RFQwlcCisgICAgX19nbnVfcGJkczo6ZGV0YWlsOjpyZXNpemVfcG9saWN5PHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlPgorCisgICAgLyoqCisgICAgICogIEJpbmFyeSBoZWFwcyBjb21wb3NlZCBvZiByZXNpemUgYW5kIGNvbXBhcmUgcG9saWNpZXMuCisgICAgICoKKyAgICAgKiAgQGluZ3JvdXAgaGVhcC1kZXRhaWwKKyAgICAgKgorICAgICAqICBCYXNlZCBvbiBDTFJTLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIGJpbmFyeV9oZWFwCisgICAgOiBwdWJsaWMgUEJfRFNfRU5UUllfQ01QX0RFQywgcHVibGljIFBCX0RTX1JFU0laRV9QT0xJQ1lfREVDCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgVmFsdWVfVHlwZSAJCQkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgQ21wX0ZuIAkJCQkJY21wX2ZuOworICAgICAgdHlwZWRlZiBfQWxsb2MgCQkJCQlhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIAkJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBQQl9EU19FTlRSWV9DTVBfREVDIAkJZW50cnlfY21wOworICAgICAgdHlwZWRlZiBQQl9EU19SRVNJWkVfUE9MSUNZX0RFQyAJCQlyZXNpemVfcG9saWN5OworICAgICAgdHlwZWRlZiBjb25kX2RlYWx0b3I8dmFsdWVfdHlwZSwgX0FsbG9jPiAJCWNvbmRfZGVhbHRvcl90OworCisgICAgcHJpdmF0ZToKKyAgICAgIGVudW0KKwl7CisJICBzaW1wbGVfdmFsdWUgPSBpc19zaW1wbGU8dmFsdWVfdHlwZT46OnZhbHVlCisJfTsKKworICAgICAgdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxpbnQsIHNpbXBsZV92YWx1ZT4gCW5vX3Rocm93X2NvcGllc190OworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+CV9fcmViaW5kX3Y7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3Y6Om90aGVyIAkJdmFsdWVfYWxsb2NhdG9yOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV9hbGxvY2F0b3I6OnBvaW50ZXIJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHZhbHVlX2FsbG9jYXRvcjo6Y29uc3RfcG9pbnRlcgljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV9hbGxvY2F0b3I6OnJlZmVyZW5jZQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHZhbHVlX2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlCWNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2NvbmRpdGlvbmFsX3R5cGU8c2ltcGxlX3ZhbHVlLAorCQkJCQkgIHZhbHVlX3R5cGUsIHBvaW50ZXI+OjpfX3R5cGUKKyAgICAgIAkJCQkJCQllbnRyeTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxlbnRyeT46Om90aGVyCisgICAgICAJCQkJCQkJZW50cnlfYWxsb2NhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6cG9pbnRlciAJZW50cnlfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiBiaW5hcnlfaGVhcF9wb2ludF9jb25zdF9pdGVyYXRvcl88dmFsdWVfdHlwZSwgZW50cnksCisJCQkJCQlzaW1wbGVfdmFsdWUsIF9BbGxvYz4KKyAgICAgIAkJCQkJCQlwb2ludF9jb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBwb2ludF9jb25zdF9pdGVyYXRvciAJCQlwb2ludF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBiaW5hcnlfaGVhcF9jb25zdF9pdGVyYXRvcl88dmFsdWVfdHlwZSwgZW50cnksCisJCQkJCSAgc2ltcGxlX3ZhbHVlLCBfQWxsb2M+CisgICAgICAJCQkJCQkJY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3IgCQkJCWl0ZXJhdG9yOworCisKKyAgICAgIGJpbmFyeV9oZWFwKCk7CisKKyAgICAgIGJpbmFyeV9oZWFwKGNvbnN0IGNtcF9mbiYpOworCisgICAgICBiaW5hcnlfaGVhcChjb25zdCBiaW5hcnlfaGVhcCYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKGJpbmFyeV9oZWFwJik7CisKKyAgICAgIH5iaW5hcnlfaGVhcCgpOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0OworCisgICAgICBDbXBfRm4mCisgICAgICBnZXRfY21wX2ZuKCk7CisKKyAgICAgIGNvbnN0IENtcF9GbiYKKyAgICAgIGdldF9jbXBfZm4oKSBjb25zdDsKKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBwdXNoKGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIHZvaWQKKyAgICAgIG1vZGlmeShwb2ludF9pdGVyYXRvciwgY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIGNvbnN0X3JlZmVyZW5jZQorICAgICAgdG9wKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBwb3AoKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGVyYXNlKHBvaW50X2l0ZXJhdG9yKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKwlzaXplX3R5cGUKKwllcmFzZV9pZihQcmVkKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGVyYXNlX2F0KGVudHJ5X3BvaW50ZXIsIHNpemVfdHlwZSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBlcmFzZV9hdChlbnRyeV9wb2ludGVyLCBzaXplX3R5cGUsIHRydWVfdHlwZSk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgYmVnaW4oKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVuZCgpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorCXZvaWQKKwlzcGxpdChQcmVkLCBiaW5hcnlfaGVhcCYpOworCisgICAgICB2b2lkCisgICAgICBqb2luKGJpbmFyeV9oZWFwJik7CisKKyNpZmRlZiBQQl9EU19CSU5BUllfSEVBUF9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3Q7CisjZW5kaWYKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorCXZvaWQKKwljb3B5X2Zyb21fcmFuZ2UoSXQsIEl0KTsKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICB2YWx1ZV9zd2FwKGJpbmFyeV9oZWFwJik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBpbnNlcnRfdmFsdWUoY29uc3RfcmVmZXJlbmNlLCBmYWxzZV90eXBlKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGluc2VydF92YWx1ZSh2YWx1ZV90eXBlLCB0cnVlX3R5cGUpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcmVzaXplX2Zvcl9pbnNlcnRfaWZfbmVlZGVkKCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzd2FwX3ZhbHVlX2ltcChlbnRyeV9wb2ludGVyLCB2YWx1ZV90eXBlLCB0cnVlX3R5cGUpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3dhcF92YWx1ZV9pbXAoZW50cnlfcG9pbnRlciwgY29uc3RfcmVmZXJlbmNlLCBmYWxzZV90eXBlKTsKKworICAgICAgdm9pZAorICAgICAgZml4KGVudHJ5X3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgY29uc3RfcmVmZXJlbmNlCisgICAgICB0b3BfaW1wKHRydWVfdHlwZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHRvcF9pbXAoZmFsc2VfdHlwZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzdGF0aWMgc2l6ZV90eXBlCisgICAgICBsZWZ0X2NoaWxkKHNpemVfdHlwZSk7CisKKyAgICAgIGlubGluZSBzdGF0aWMgc2l6ZV90eXBlCisgICAgICByaWdodF9jaGlsZChzaXplX3R5cGUpOworCisgICAgICBpbmxpbmUgc3RhdGljIHNpemVfdHlwZQorICAgICAgcGFyZW50KHNpemVfdHlwZSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICByZXNpemVfZm9yX2VyYXNlX2lmX25lZWRlZCgpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgc2l6ZV90eXBlCisgICAgICBwYXJ0aXRpb24oUHJlZCk7CisKKyAgICAgIHZvaWQKKyAgICAgIG1ha2VfaGVhcCgpCisgICAgICB7CisJY29uc3QgZW50cnlfY21wJiBtX2NtcCA9IHN0YXRpY19jYXN0PGVudHJ5X2NtcCY+KCp0aGlzKTsKKwllbnRyeV9wb2ludGVyIGVuZCA9IG1fYV9lbnRyaWVzICsgbV9zaXplOworCXN0ZDo6bWFrZV9oZWFwKG1fYV9lbnRyaWVzLCBlbmQsIG1fY21wKTsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoaXNfaGVhcCgpKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcHVzaF9oZWFwKCkKKyAgICAgIHsKKwlpZiAoIWlzX2hlYXAoKSkKKwkgIG1ha2VfaGVhcCgpOworCWVsc2UKKwkgIHsKKwkgICAgY29uc3QgZW50cnlfY21wJiBtX2NtcCA9IHN0YXRpY19jYXN0PGVudHJ5X2NtcCY+KCp0aGlzKTsKKwkgICAgZW50cnlfcG9pbnRlciBlbmQgPSBtX2FfZW50cmllcyArIG1fc2l6ZTsKKwkgICAgc3RkOjpwdXNoX2hlYXAobV9hX2VudHJpZXMsIGVuZCwgbV9jbXApOworCSAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBwb3BfaGVhcCgpCisgICAgICB7CisJY29uc3QgZW50cnlfY21wJiBtX2NtcCA9IHN0YXRpY19jYXN0PGVudHJ5X2NtcCY+KCp0aGlzKTsKKwllbnRyeV9wb2ludGVyIGVuZCA9IG1fYV9lbnRyaWVzICsgbV9zaXplOworCXN0ZDo6cG9wX2hlYXAobV9hX2VudHJpZXMsIGVuZCwgbV9jbXApOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBpc19oZWFwKCkKKyAgICAgIHsKKwljb25zdCBlbnRyeV9jbXAmIG1fY21wID0gc3RhdGljX2Nhc3Q8ZW50cnlfY21wJj4oKnRoaXMpOworCWVudHJ5X3BvaW50ZXIgZW5kID0gbV9hX2VudHJpZXMgKyBtX3NpemU7CisJYm9vbCBwID0gc3RkOjpfX2lzX2hlYXAobV9hX2VudHJpZXMsIGVuZCwgbV9jbXApOworCXJldHVybiBwOworICAgICAgfQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfQklOQVJZX0hFQVBfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZV9lbnRyeShjb25zdCBlbnRyeSYsIGZhbHNlX3R5cGUpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICB0cmFjZV9lbnRyeShjb25zdCBlbnRyeSYsIHRydWVfdHlwZSkgY29uc3Q7CisjZW5kaWYKKworICAgICAgc3RhdGljIGVudHJ5X2FsbG9jYXRvciAJc19lbnRyeV9hbGxvY2F0b3I7CisgICAgICBzdGF0aWMgdmFsdWVfYWxsb2NhdG9yIAlzX3ZhbHVlX2FsbG9jYXRvcjsKKyAgICAgIHN0YXRpYyBub190aHJvd19jb3BpZXNfdCAJc19ub190aHJvd19jb3BpZXNfaW5kOworCisgICAgICBzaXplX3R5cGUgCQltX3NpemU7CisgICAgICBzaXplX3R5cGUgCQltX2FjdHVhbF9zaXplOworICAgICAgZW50cnlfcG9pbnRlciAJCW1fYV9lbnRyaWVzOworICAgIH07CisKKyNkZWZpbmUgUEJfRFNfQVNTRVJUX1ZBTElEKFgpIFwKKyAgX0dMSUJDWFhfREVCVUdfT05MWShYLmFzc2VydF92YWxpZChfX0ZJTEVfXywgX19MSU5FX18pOykKKworI2RlZmluZSBQQl9EU19ERUJVR19WRVJJRlkoX0NvbmQpCQkJCQlcCisgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWV9BVChfQ29uZCwJCQkJCVwKKwkJCSAgIF9NX21lc3NhZ2UoI19Db25kIiBhc3NlcnRpb24gZnJvbSAlMTs6JTI7IikJXAorCQkJICAgLl9NX3N0cmluZyhfX0ZJTEVfXykuX01faW50ZWdlcihfX0xJTkVfXykJXAorCQkJICAgLF9fZmlsZSxfX2xpbmUpCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2luZm9fZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZmluZF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfRU5UUllfQ01QX0RFQworI3VuZGVmIFBCX0RTX1JFU0laRV9QT0xJQ1lfREVDCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9jb25zdF9pdGVyYXRvci5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2NvbnN0X2l0ZXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQwM2FkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9jb25zdF9pdGVyYXRvci5ocHAKQEAgLTAsMCArMSwxMzkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluYXJ5X2hlYXBfL2NvbnN0X2l0ZXJhdG9yLmhwcAorICogQ29udGFpbnMgYW4gaXRlcmF0b3IgY2xhc3MgcmV0dXJuZWQgYnkgdGhlIHRhYmxlJ3MgY29uc3QgZmluZCBhbmQgaW5zZXJ0CisgKiAgICAgbWV0aG9kcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0JJTkFSWV9IRUFQX0NPTlNUX0lURVJBVE9SX0hQUAorI2RlZmluZSBQQl9EU19CSU5BUllfSEVBUF9DT05TVF9JVEVSQVRPUl9IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3BvaW50X2NvbnN0X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNkZWZpbmUgUEJfRFNfQklOX0hFQVBfQ0lUX0JBU0UgXAorICAgIGJpbmFyeV9oZWFwX3BvaW50X2NvbnN0X2l0ZXJhdG9yXzxWYWx1ZV9UeXBlLCBFbnRyeSwgU2ltcGxlLCBfQWxsb2M+CisKKyAgICAvLy8gQ29uc3QgcG9pbnQtdHlwZSBpdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLAorCSAgICAgdHlwZW5hbWUgRW50cnksCisJICAgICBib29sIFNpbXBsZSwKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBiaW5hcnlfaGVhcF9jb25zdF9pdGVyYXRvcl8gOiBwdWJsaWMgUEJfRFNfQklOX0hFQVBfQ0lUX0JBU0UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgUEJfRFNfQklOX0hFQVBfQ0lUX0JBU0UgCQkgICAgICAgCWJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjplbnRyeV9wb2ludGVyIAllbnRyeV9wb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgLy8vIENhdGVnb3J5LgorICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnIAkJaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIC8vLyBEaWZmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIAkJZGlmZmVyZW5jZV90eXBlOworCisgICAgICAvLy8gSXRlcmF0b3IncyB2YWx1ZSB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnZhbHVlX3R5cGUgCQl2YWx1ZV90eXBlOworCisgICAgICAvLy8gSXRlcmF0b3IncyBwb2ludGVyIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRlciAJCXBvaW50ZXI7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIGNvbnN0IHBvaW50ZXIgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9wb2ludGVyIAljb25zdF9wb2ludGVyOworCisgICAgICAvLy8gSXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpyZWZlcmVuY2UgCQlyZWZlcmVuY2U7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIGNvbnN0IHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworCisgICAgICBpbmxpbmUKKyAgICAgIGJpbmFyeV9oZWFwX2NvbnN0X2l0ZXJhdG9yXyhlbnRyeV9wb2ludGVyIHBfZSkgOiBiYXNlX3R5cGUocF9lKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgaW5saW5lCisgICAgICBiaW5hcnlfaGVhcF9jb25zdF9pdGVyYXRvcl8oKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgorICAgICAgaW5saW5lCisgICAgICBiaW5hcnlfaGVhcF9jb25zdF9pdGVyYXRvcl8oY29uc3QgYmluYXJ5X2hlYXBfY29uc3RfaXRlcmF0b3JfJiBvdGhlcikgCisgICAgICA6IGJhc2VfdHlwZShvdGhlcikKKyAgICAgIHsgfQorCisgICAgICAvLy8gQ29tcGFyZXMgY29udGVudCB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBiaW5hcnlfaGVhcF9jb25zdF9pdGVyYXRvcl8mIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gYmFzZV90eXBlOjptX3BfZSA9PSBvdGhlci5tX3BfZTsgfQorCisgICAgICAvLy8gQ29tcGFyZXMgY29udGVudCAobmVnYXRpdmVseSkgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgYmluYXJ5X2hlYXBfY29uc3RfaXRlcmF0b3JfJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIGJhc2VfdHlwZTo6bV9wX2UgIT0gb3RoZXIubV9wX2U7IH0KKworICAgICAgaW5saW5lIGJpbmFyeV9oZWFwX2NvbnN0X2l0ZXJhdG9yXyYgCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjptX3BfZSAhPSAwKTsKKwlpbmMoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZSBiaW5hcnlfaGVhcF9jb25zdF9pdGVyYXRvcl8KKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCWJpbmFyeV9oZWFwX2NvbnN0X2l0ZXJhdG9yXyByZXRfaXQoYmFzZV90eXBlOjptX3BfZSk7CisJb3BlcmF0b3IrKygpOworCXJldHVybiByZXRfaXQ7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgaW5jKCkKKyAgICAgIHsgKytiYXNlX3R5cGU6Om1fcF9lOyB9CisgICAgfTsKKworI3VuZGVmIFBCX0RTX0JJTl9IRUFQX0NJVF9CQVNFCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTQ0ZDhiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEzOSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5hcnlfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5hcnlfaGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplbnRyeV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX2VudHJ5X2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjp2YWx1ZV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX3ZhbHVlX2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub190aHJvd19jb3BpZXNfdAorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfbm9fdGhyb3dfY29waWVzX2luZDsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICB3aGlsZSAoZmlyc3RfaXQgIT0gbGFzdF9pdCkKKyAgICB7CisgICAgICBpbnNlcnRfdmFsdWUoKmZpcnN0X2l0LCBzX25vX3Rocm93X2NvcGllc19pbmQpOworICAgICAgKytmaXJzdF9pdDsKKyAgICB9CisgIG1ha2VfaGVhcCgpOworIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmluYXJ5X2hlYXAoKQorOiBtX3NpemUoMCksIG1fYWN0dWFsX3NpemUocmVzaXplX3BvbGljeTo6bWluX3NpemUpLAorICBtX2FfZW50cmllcyhzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShtX2FjdHVhbF9zaXplKSkKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JpbmFyeV9oZWFwKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pCis6IGVudHJ5X2NtcChyX2NtcF9mbiksIG1fc2l6ZSgwKSwgbV9hY3R1YWxfc2l6ZShyZXNpemVfcG9saWN5OjptaW5fc2l6ZSksCisgIG1fYV9lbnRyaWVzKHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG1fYWN0dWFsX3NpemUpKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmluYXJ5X2hlYXAoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorOiBlbnRyeV9jbXAob3RoZXIpLCByZXNpemVfcG9saWN5KG90aGVyKSwgbV9zaXplKDApLAorICBtX2FjdHVhbF9zaXplKG90aGVyLm1fYWN0dWFsX3NpemUpLAorICBtX2FfZW50cmllcyhzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShtX2FjdHVhbF9zaXplKSkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9hX2VudHJpZXMgIT0gb3RoZXIubV9hX2VudHJpZXMpOworCisgIF9fdHJ5CisgICAgeworICAgICAgY29weV9mcm9tX3JhbmdlKG90aGVyLmJlZ2luKCksIG90aGVyLmVuZCgpKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9zaXplOyArK2kpCisJZXJhc2VfYXQobV9hX2VudHJpZXMsIGksIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisKKyAgICAgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9hX2VudHJpZXMsIG1fYWN0dWFsX3NpemUpOworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9hX2VudHJpZXMgIT0gb3RoZXIubV9hX2VudHJpZXMpOworICB2YWx1ZV9zd2FwKG90aGVyKTsKKyAgc3RkOjpzd2FwKChlbnRyeV9jbXAmKSgqdGhpcyksIChlbnRyeV9jbXAmKW90aGVyKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ZhbHVlX3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBzdGQ6OnN3YXAobV9hX2VudHJpZXMsIG90aGVyLm1fYV9lbnRyaWVzKTsKKyAgc3RkOjpzd2FwKG1fc2l6ZSwgb3RoZXIubV9zaXplKTsKKyAgc3RkOjpzd2FwKG1fYWN0dWFsX3NpemUsIG90aGVyLm1fYWN0dWFsX3NpemUpOworICBzdGF0aWNfY2FzdDxyZXNpemVfcG9saWN5Kj4odGhpcyktPnN3YXAob3RoZXIpOworfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorfmJpbmFyeV9oZWFwKCkKK3sKKyAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtX3NpemU7ICsraSkKKyAgICBlcmFzZV9hdChtX2FfZW50cmllcywgaSwgc19ub190aHJvd19jb3BpZXNfaW5kKTsKKyAgc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX2FfZW50cmllcywgbV9hY3R1YWxfc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2QzMjcxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDcyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbmFyeV9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworI2lmZGVmIFBCX0RTX1JFR1JFU1NJT04KKyAgc19lbnRyeV9hbGxvY2F0b3IuY2hlY2tfYWxsb2NhdGVkKG1fYV9lbnRyaWVzLCBtX2FjdHVhbF9zaXplKTsKKyNlbmRpZgorCisgIHJlc2l6ZV9wb2xpY3k6OmFzc2VydF92YWxpZChfX2ZpbGUsIF9fbGluZSk7CisgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3NpemUgPD0gbV9hY3R1YWxfc2l6ZSk7CisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9zaXplOyArK2kpCisgICAgeworI2lmZGVmIFBCX0RTX1JFR1JFU1NJT04KKyAgICAgIHNfdmFsdWVfYWxsb2NhdG9yLmNoZWNrX2FsbG9jYXRlZChtX2FfZW50cmllc1tpXSwgMSk7CisjZW5kaWYKKworICAgICAgaWYgKGxlZnRfY2hpbGQoaSkgPCBtX3NpemUpCisJUEJfRFNfREVCVUdfVkVSSUZZKCFlbnRyeV9jbXA6Om9wZXJhdG9yKCkobV9hX2VudHJpZXNbaV0sIG1fYV9lbnRyaWVzW2xlZnRfY2hpbGQoaSldKSk7CisKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwYXJlbnQobGVmdF9jaGlsZChpKSkgPT0gaSk7CisKKyAgICAgIGlmIChyaWdodF9jaGlsZChpKSA8IG1fc2l6ZSkKKwlQQl9EU19ERUJVR19WRVJJRlkoIWVudHJ5X2NtcDo6b3BlcmF0b3IoKShtX2FfZW50cmllc1tpXSwgbV9hX2VudHJpZXNbcmlnaHRfY2hpbGQoaSldKSk7CisKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwYXJlbnQocmlnaHRfY2hpbGQoaSkpID09IGkpOworICAgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2VudHJ5X2NtcC5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2VudHJ5X2NtcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlMTAwMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZW50cnlfY21wLmhwcApAQCAtMCwwICsxLDg1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbmFyeV9oZWFwXy9lbnRyeV9jbXAuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiaW5hcnlfaGVhcC4KKyAqLworCisjaWZuZGVmIFBCX0RTX0JJTkFSWV9IRUFQX0VOVFJZX0NNUF9IUFAKKyNkZWZpbmUgUEJfRFNfQklOQVJZX0hFQVBfRU5UUllfQ01QX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gRW50cnkgY29tcGFyZSwgcHJpbWFyeSB0ZW1wbGF0ZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVlRwLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIF9BbGxvYywgYm9vbCBOb19UaHJvdz4KKyAgICAgIHN0cnVjdCBlbnRyeV9jbXA7CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24sIHRydWUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZUcCwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBzdHJ1Y3QgZW50cnlfY21wPF9WVHAsIENtcF9GbiwgX0FsbG9jLCB0cnVlPgorICAgICAgeworCS8vLyBDb21wYXJlLgorCXR5cGVkZWYgQ21wX0ZuIAkJCQkJCXR5cGU7CisgICAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uLCBmYWxzZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVlRwLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0cnVjdCBlbnRyeV9jbXA8X1ZUcCwgQ21wX0ZuLCBfQWxsb2MsIGZhbHNlPgorICAgICAgeworICAgICAgcHJpdmF0ZToKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9WVHA+CQlfX3JlYmluZF92OworCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgllbnRyeTsKKworCS8vLyBDb21wYXJlIHBsdXMgZW50cnkuCisJc3RydWN0IHR5cGUgOiBwdWJsaWMgQ21wX0ZuCisJeworCSAgdHlwZSgpIHsgfQorCisJICB0eXBlKGNvbnN0IENtcF9GbiYgb3RoZXIpIDogQ21wX0ZuKG90aGVyKSB7IH0KKworCSAgYm9vbAorCSAgb3BlcmF0b3IoKShlbnRyeSBsaHMsIGVudHJ5IHJocykgY29uc3QKKwkgIHsgcmV0dXJuIENtcF9Gbjo6b3BlcmF0b3IoKSgqbGhzLCAqcmhzKTsgfQorCX07CisgICAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfQklOQVJZX0hFQVBfRU5UUllfQ01QX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lbnRyeV9wcmVkLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZW50cnlfcHJlZC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRkN2MwNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZW50cnlfcHJlZC5ocHAKQEAgLTAsMCArMSw4NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5hcnlfaGVhcF8vZW50cnlfcHJlZC5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbmFyeV9oZWFwLgorICovCisKKyNpZm5kZWYgUEJfRFNfQklOQVJZX0hFQVBfRU5UUllfUFJFRF9IUFAKKyNkZWZpbmUgUEJfRFNfQklOQVJZX0hFQVBfRU5UUllfUFJFRF9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIEVudHJ5IHByZWRpY2F0ZSBwcmltYXJ5IGNsYXNzIHRlbXBsYXRlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WVHAsIHR5cGVuYW1lIFByZWQsIHR5cGVuYW1lIF9BbGxvYywgYm9vbCBOb19UaHJvdz4KKyAgICAgIHN0cnVjdCBlbnRyeV9wcmVkOworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uLCB0cnVlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WVHAsIHR5cGVuYW1lIFByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0cnVjdCBlbnRyeV9wcmVkPF9WVHAsIFByZWQsIF9BbGxvYywgdHJ1ZT4KKyAgICAgIHsKKwl0eXBlZGVmIFByZWQgCQkJCQkJdHlwZTsKKyAgICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24sIGZhbHNlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WVHAsIHR5cGVuYW1lIFByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0cnVjdCBlbnRyeV9wcmVkPF9WVHAsIFByZWQsIF9BbGxvYywgZmFsc2U+CisgICAgICB7CisgICAgICBwcml2YXRlOgorCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1ZUcD4JCV9fcmViaW5kX3Y7CisKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3Y6Om90aGVyOjpjb25zdF9wb2ludGVyCWVudHJ5OworCisJc3RydWN0IHR5cGUgOiBwdWJsaWMgUHJlZAorCXsKKwkgIGlubGluZQorCSAgdHlwZSgpIHsgfQorCisJICBpbmxpbmUKKwkgIHR5cGUoY29uc3QgUHJlZCYgb3RoZXIpIDogUHJlZChvdGhlcikgeyB9CisKKwkgIGlubGluZSBib29sCisJICBvcGVyYXRvcigpKGVudHJ5IHBfdikgY29uc3QKKwkgIHsgcmV0dXJuIFByZWQ6Om9wZXJhdG9yKCkoKnBfdik7IH0KKwl9OworICAgICAgfTsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX0JJTkFSWV9IRUFQX0VOVFJZX1BSRURfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDdkNzYzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDIwOCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5hcnlfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbmFyeV9oZWFwLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcigpCit7CisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9zaXplOyArK2kpCisgICAgZXJhc2VfYXQobV9hX2VudHJpZXMsIGksIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisKKyAgX190cnkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgbmV3X3NpemUgPSByZXNpemVfcG9saWN5OjpnZXRfbmV3X3NpemVfZm9yX2FyYml0cmFyeSgwKTsKKyAgICAgIGVudHJ5X3BvaW50ZXIgbmV3X2VudHJpZXMgPSBzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShuZXdfc2l6ZSk7CisgICAgICByZXNpemVfcG9saWN5Ojpub3RpZnlfYXJiaXRyYXJ5KG5ld19zaXplKTsKKyAgICAgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9hX2VudHJpZXMsIG1fYWN0dWFsX3NpemUpOworICAgICAgbV9hY3R1YWxfc2l6ZSA9IG5ld19zaXplOworICAgICAgbV9hX2VudHJpZXMgPSBuZXdfZW50cmllczsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsgfQorCisgIG1fc2l6ZSA9IDA7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfYXQoZW50cnlfcG9pbnRlciBhX2VudHJpZXMsIHNpemVfdHlwZSBpLCBmYWxzZV90eXBlKQoreworICBhX2VudHJpZXNbaV0tPn52YWx1ZV90eXBlKCk7CisgIHNfdmFsdWVfYWxsb2NhdG9yLmRlYWxsb2NhdGUoYV9lbnRyaWVzW2ldLCAxKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2F0KGVudHJ5X3BvaW50ZXIsIHNpemVfdHlwZSwgdHJ1ZV90eXBlKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcG9wKCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghZW1wdHkoKSk7CisKKyAgcG9wX2hlYXAoKTsKKyAgZXJhc2VfYXQobV9hX2VudHJpZXMsIG1fc2l6ZSAtIDEsIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisgIHJlc2l6ZV9mb3JfZXJhc2VfaWZfbmVlZGVkKCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3NpemUgPiAwKTsKKyAgLS1tX3NpemU7CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaWYoUHJlZCBwcmVkKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKworICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X3ByZWQ8dmFsdWVfdHlwZSwgUHJlZCwgX0FsbG9jLCBzaW1wbGVfdmFsdWU+Ojp0eXBlCisgICAgcHJlZF90OworCisgIGNvbnN0IHNpemVfdHlwZSBsZWZ0ID0gcGFydGl0aW9uKHByZWRfdChwcmVkKSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3NpemUgPj0gbGVmdCk7CisgIGNvbnN0IHNpemVfdHlwZSBlcnNkID0gbV9zaXplIC0gbGVmdDsKKyAgZm9yIChzaXplX3R5cGUgaSA9IGxlZnQ7IGkgPCBtX3NpemU7ICsraSkKKyAgICBlcmFzZV9hdChtX2FfZW50cmllcywgaSwgc19ub190aHJvd19jb3BpZXNfaW5kKTsKKworICBfX3RyeQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBuZXdfc2l6ZSA9CisJcmVzaXplX3BvbGljeTo6Z2V0X25ld19zaXplX2Zvcl9hcmJpdHJhcnkobGVmdCk7CisKKyAgICAgIGVudHJ5X3BvaW50ZXIgbmV3X2VudHJpZXMgPSBzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShuZXdfc2l6ZSk7CisgICAgICBzdGQ6OmNvcHkobV9hX2VudHJpZXMsIG1fYV9lbnRyaWVzICsgbGVmdCwgbmV3X2VudHJpZXMpOworICAgICAgc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX2FfZW50cmllcywgbV9hY3R1YWxfc2l6ZSk7CisgICAgICBtX2FjdHVhbF9zaXplID0gbmV3X3NpemU7CisgICAgICByZXNpemVfcG9saWN5Ojpub3RpZnlfYXJiaXRyYXJ5KG1fYWN0dWFsX3NpemUpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeyB9OworCisgIG1fc2l6ZSA9IGxlZnQ7CisgIG1ha2VfaGVhcCgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIGVyc2Q7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2UocG9pbnRfaXRlcmF0b3IgaXQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWVtcHR5KCkpOworCisgIGNvbnN0IHNpemVfdHlwZSBmaXhfcG9zID0gaXQubV9wX2UgLSBtX2FfZW50cmllczsKKyAgc3RkOjpzd2FwKCppdC5tX3BfZSwgbV9hX2VudHJpZXNbbV9zaXplIC0gMV0pOworICBlcmFzZV9hdChtX2FfZW50cmllcywgbV9zaXplIC0gMSwgc19ub190aHJvd19jb3BpZXNfaW5kKTsKKyAgcmVzaXplX2Zvcl9lcmFzZV9pZl9uZWVkZWQoKTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID4gMCk7CisgIC0tbV9zaXplOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoZml4X3BvcyA8PSBtX3NpemUpOworCisgIGlmIChmaXhfcG9zICE9IG1fc2l6ZSkKKyAgICBmaXgobV9hX2VudHJpZXMgKyBmaXhfcG9zKTsKKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZXNpemVfZm9yX2VyYXNlX2lmX25lZWRlZCgpCit7CisgIGlmICghcmVzaXplX3BvbGljeTo6cmVzaXplX25lZWRlZF9mb3Jfc2hyaW5rKG1fc2l6ZSkpCisgICAgcmV0dXJuOworCisgIF9fdHJ5CisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIG5ld19zaXplID0gcmVzaXplX3BvbGljeTo6Z2V0X25ld19zaXplX2Zvcl9zaHJpbmsoKTsKKyAgICAgIGVudHJ5X3BvaW50ZXIgbmV3X2VudHJpZXMgPSBzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShuZXdfc2l6ZSk7CisgICAgICByZXNpemVfcG9saWN5Ojpub3RpZnlfc2hyaW5rX3Jlc2l6ZSgpOworCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID4gMCk7CisgICAgICBzdGQ6OmNvcHkobV9hX2VudHJpZXMsIG1fYV9lbnRyaWVzICsgbV9zaXplIC0gMSwgbmV3X2VudHJpZXMpOworICAgICAgc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX2FfZW50cmllcywgbV9hY3R1YWxfc2l6ZSk7CisgICAgICBtX2FjdHVhbF9zaXplID0gbmV3X3NpemU7CisgICAgICBtX2FfZW50cmllcyA9IG5ld19lbnRyaWVzOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeyB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcGFydGl0aW9uKFByZWQgcHJlZCkKK3sKKyAgc2l6ZV90eXBlIGxlZnQgPSAwOworICBzaXplX3R5cGUgcmlnaHQgPSBtX3NpemUgLSAxOworCisgIHdoaWxlIChyaWdodCArIDEgIT0gbGVmdCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobGVmdCA8PSBtX3NpemUpOworCisgICAgICBpZiAoIXByZWQobV9hX2VudHJpZXNbbGVmdF0pKQorCSsrbGVmdDsKKyAgICAgIGVsc2UgaWYgKHByZWQobV9hX2VudHJpZXNbcmlnaHRdKSkKKwktLXJpZ2h0OworICAgICAgZWxzZQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChsZWZ0IDwgcmlnaHQpOworCSAgc3RkOjpzd2FwKG1fYV9lbnRyaWVzW2xlZnRdLCBtX2FfZW50cmllc1tyaWdodF0pOworCSAgKytsZWZ0OworCSAgLS1yaWdodDsKKwl9CisgICAgfQorCisgIHJldHVybiBsZWZ0OworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9maW5kX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9maW5kX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MzBlM2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2ZpbmRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5hcnlfaGVhcF8vZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfcmVmZXJlbmNlCitQQl9EU19DTEFTU19DX0RFQzo6Cit0b3AoKSBjb25zdAoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFlbXB0eSgpKTsKKyAgcmV0dXJuIHRvcF9pbXAoc19ub190aHJvd19jb3BpZXNfaW5kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfcmVmZXJlbmNlCitQQl9EU19DTEFTU19DX0RFQzo6Cit0b3BfaW1wKHRydWVfdHlwZSkgY29uc3QKK3sgcmV0dXJuICptX2FfZW50cmllczsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9yZWZlcmVuY2UKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RvcF9pbXAoZmFsc2VfdHlwZSkgY29uc3QKK3sgcmV0dXJuICoqbV9hX2VudHJpZXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitsZWZ0X2NoaWxkKHNpemVfdHlwZSBpKQoreyByZXR1cm4gaSAqIDIgKyAxOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmlnaHRfY2hpbGQoc2l6ZV90eXBlIGkpCit7IHJldHVybiBpICogMiArIDI7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitwYXJlbnQoc2l6ZV90eXBlIGkpCit7IHJldHVybiAoaSAtIDEpIC8gMjsgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9pbmZvX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZTlmYTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2luZm9fZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5hcnlfaGVhcF8vaW5mb19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlbXB0eSgpIGNvbnN0Cit7IHJldHVybiBtX3NpemUgPT0gMDsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NpemUoKSBjb25zdAoreyByZXR1cm4gbV9zaXplOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWF4X3NpemUoKSBjb25zdAoreyByZXR1cm4gc19lbnRyeV9hbGxvY2F0b3IubWF4X3NpemUoKTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZWY0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE3NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5hcnlfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiaW5hcnlfaGVhcC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcHVzaChjb25zdF9yZWZlcmVuY2Ugcl92YWwpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBpbnNlcnRfdmFsdWUocl92YWwsIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisgIHB1c2hfaGVhcCgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIHBvaW50X2l0ZXJhdG9yKG1fYV9lbnRyaWVzKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnRfdmFsdWUodmFsdWVfdHlwZSB2YWwsIHRydWVfdHlwZSkKK3sKKyAgcmVzaXplX2Zvcl9pbnNlcnRfaWZfbmVlZGVkKCk7CisgIG1fYV9lbnRyaWVzW21fc2l6ZSsrXSA9IHZhbDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnRfdmFsdWUoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCBmYWxzZV90eXBlKQoreworICByZXNpemVfZm9yX2luc2VydF9pZl9uZWVkZWQoKTsKKyAgcG9pbnRlciBwX25ldyA9IHNfdmFsdWVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworICBjb25kX2RlYWx0b3JfdCBjb25kKHBfbmV3KTsKKyAgbmV3IChwX25ldykgdmFsdWVfdHlwZShyX3ZhbCk7CisgIGNvbmQuc2V0X25vX2FjdGlvbigpOworICBtX2FfZW50cmllc1ttX3NpemUrK10gPSBwX25ldzsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZXNpemVfZm9yX2luc2VydF9pZl9uZWVkZWQoKQoreworICBpZiAoIXJlc2l6ZV9wb2xpY3k6OnJlc2l6ZV9uZWVkZWRfZm9yX2dyb3cobV9zaXplKSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplIDwgbV9hY3R1YWxfc2l6ZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGNvbnN0IHNpemVfdHlwZSBuZXdfc2l6ZSA9IHJlc2l6ZV9wb2xpY3k6OmdldF9uZXdfc2l6ZV9mb3JfZ3JvdygpOworICBlbnRyeV9wb2ludGVyIG5ld19lbnRyaWVzID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobmV3X3NpemUpOworICByZXNpemVfcG9saWN5Ojpub3RpZnlfZ3Jvd19yZXNpemUoKTsKKworICBzdGQ6OmNvcHkobV9hX2VudHJpZXMsIG1fYV9lbnRyaWVzICsgbV9zaXplLCBuZXdfZW50cmllcyk7CisgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9hX2VudHJpZXMsIG1fYWN0dWFsX3NpemUpOworICBtX2FjdHVhbF9zaXplID0gbmV3X3NpemU7CisgIG1fYV9lbnRyaWVzID0gbmV3X2VudHJpZXM7CisgIG1ha2VfaGVhcCgpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbW9kaWZ5KHBvaW50X2l0ZXJhdG9yIGl0LCBjb25zdF9yZWZlcmVuY2Ugcl9uZXdfdmFsKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgc3dhcF92YWx1ZV9pbXAoaXQubV9wX2UsIHJfbmV3X3ZhbCwgc19ub190aHJvd19jb3BpZXNfaW5kKTsKKyAgZml4KGl0Lm1fcF9lKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpc19oZWFwKCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZml4KGVudHJ5X3BvaW50ZXIgcF9lKQoreworICBzaXplX3R5cGUgaSA9IHBfZSAtIG1fYV9lbnRyaWVzOworICBpZiAoaSA+IDAgJiYgZW50cnlfY21wOjpvcGVyYXRvcigpKG1fYV9lbnRyaWVzW3BhcmVudChpKV0sIG1fYV9lbnRyaWVzW2ldKSkKKyAgICB7CisgICAgICBzaXplX3R5cGUgcGFyZW50X2kgPSBwYXJlbnQoaSk7CisgICAgICB3aGlsZSAoaSA+IDAKKwkgICAgICYmIGVudHJ5X2NtcDo6b3BlcmF0b3IoKShtX2FfZW50cmllc1twYXJlbnRfaV0sIG1fYV9lbnRyaWVzW2ldKSkKKwl7CisJICBzdGQ6OnN3YXAobV9hX2VudHJpZXNbaV0sIG1fYV9lbnRyaWVzW3BhcmVudF9pXSk7CisJICBpID0gcGFyZW50X2k7CisJICBwYXJlbnRfaSA9IHBhcmVudChpKTsKKwl9CisKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgcmV0dXJuOworICAgIH0KKworICB3aGlsZSAoaSA8IG1fc2l6ZSkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgbGNoaWxkX2kgPSBsZWZ0X2NoaWxkKGkpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIHJjaGlsZF9pID0gcmlnaHRfY2hpbGQoaSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocmNoaWxkX2kgPiBsY2hpbGRfaSk7CisKKyAgICAgIGNvbnN0IGJvb2wgc21hbGxlcl90aGFuX2xjaGlsZCA9IGxjaGlsZF9pIDwgbV9zaXplICYmCisJZW50cnlfY21wOjpvcGVyYXRvcigpKG1fYV9lbnRyaWVzW2ldLCBtX2FfZW50cmllc1tsY2hpbGRfaV0pOworCisgICAgICBjb25zdCBib29sIHNtYWxsZXJfdGhhbl9yY2hpbGQgPSByY2hpbGRfaSA8IG1fc2l6ZSAmJgorCWVudHJ5X2NtcDo6b3BlcmF0b3IoKShtX2FfZW50cmllc1tpXSwgbV9hX2VudHJpZXNbcmNoaWxkX2ldKTsKKworICAgICAgY29uc3QgYm9vbCBzd2FwX3dpdGhfcmNoaWxkID0gc21hbGxlcl90aGFuX3JjaGlsZCAmJiAoIXNtYWxsZXJfdGhhbl9sY2hpbGQgfHwgZW50cnlfY21wOjpvcGVyYXRvcigpKG1fYV9lbnRyaWVzW2xjaGlsZF9pXSwgbV9hX2VudHJpZXNbcmNoaWxkX2ldKSk7CisKKyAgICAgIGNvbnN0IGJvb2wgc3dhcF93aXRoX2xjaGlsZCA9ICFzd2FwX3dpdGhfcmNoaWxkICYmIHNtYWxsZXJfdGhhbl9sY2hpbGQ7CisKKyAgICAgIGlmIChzd2FwX3dpdGhfbGNoaWxkKQorCXsKKwkgIHN0ZDo6c3dhcChtX2FfZW50cmllc1tpXSwgbV9hX2VudHJpZXNbbGNoaWxkX2ldKTsKKwkgIGkgPSBsY2hpbGRfaTsKKwl9CisgICAgICBlbHNlIGlmIChzd2FwX3dpdGhfcmNoaWxkKQorCXsKKwkgIHN0ZDo6c3dhcChtX2FfZW50cmllc1tpXSwgbV9hX2VudHJpZXNbcmNoaWxkX2ldKTsKKwkgIGkgPSByY2hpbGRfaTsKKwl9CisgICAgICBlbHNlCisJaSA9IG1fc2l6ZTsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcF92YWx1ZV9pbXAoZW50cnlfcG9pbnRlciBwX2UsIHZhbHVlX3R5cGUgbmV3X3ZhbCwgdHJ1ZV90eXBlKQoreyAqcF9lID0gbmV3X3ZhbDsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXBfdmFsdWVfaW1wKGVudHJ5X3BvaW50ZXIgcF9lLCBjb25zdF9yZWZlcmVuY2Ugcl9uZXdfdmFsLCBmYWxzZV90eXBlKQoreworICB2YWx1ZV90eXBlIHRtcChyX25ld192YWwpOworICAoKnBfZSktPnN3YXAodG1wKTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwMzJjOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNjQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluYXJ5X2hlYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkKK3sgcmV0dXJuIGl0ZXJhdG9yKG1fYV9lbnRyaWVzKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKSBjb25zdAoreyByZXR1cm4gY29uc3RfaXRlcmF0b3IobV9hX2VudHJpZXMpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlbmQoKQoreyByZXR1cm4gaXRlcmF0b3IobV9hX2VudHJpZXMgKyBtX3NpemUpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlbmQoKSBjb25zdAoreyByZXR1cm4gY29uc3RfaXRlcmF0b3IobV9hX2VudHJpZXMgKyBtX3NpemUpOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vcG9pbnRfY29uc3RfaXRlcmF0b3IuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9wb2ludF9jb25zdF9pdGVyYXRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjMzYwZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vcG9pbnRfY29uc3RfaXRlcmF0b3IuaHBwCkBAIC0wLDAgKzEsMTQ0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbmFyeV9oZWFwXy9wb2ludF9jb25zdF9pdGVyYXRvci5ocHAKKyAqIENvbnRhaW5zIGFuIGl0ZXJhdG9yIGNsYXNzIHJldHVybmVkIGJ5IHRoZSB0YWJsZSdzIGNvbnN0IGZpbmQgYW5kIGluc2VydAorICogbWV0aG9kcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0JJTkFSWV9IRUFQX0NPTlNUX0ZJTkRfSVRFUkFUT1JfSFBQCisjZGVmaW5lIFBCX0RTX0JJTkFSWV9IRUFQX0NPTlNUX0ZJTkRfSVRFUkFUT1JfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIENvbnN0IHBvaW50LXR5cGUgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgRW50cnksIGJvb2wgU2ltcGxlLCAKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBiaW5hcnlfaGVhcF9wb2ludF9jb25zdF9pdGVyYXRvcl8KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxFbnRyeT46Om90aGVyOjpwb2ludGVyIGVudHJ5X3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gQ2F0ZWdvcnkuCisgICAgICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICAvLy8gRGlmZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX2RpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIHZhbHVlIHR5cGUuCisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgcG9pbnRlciB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDx2YWx1ZV90eXBlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIHBvaW50ZXI7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIGNvbnN0IHBvaW50ZXIgdHlwZS4KKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgY29uc3RfcG9pbnRlcjsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgcmVmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDx2YWx1ZV90eXBlPjo6b3RoZXI6OnJlZmVyZW5jZQorICAgICAgcmVmZXJlbmNlOworCisgICAgICAvLy8gSXRlcmF0b3IncyBjb25zdCByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlCisgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGlubGluZQorICAgICAgYmluYXJ5X2hlYXBfcG9pbnRfY29uc3RfaXRlcmF0b3JfKGVudHJ5X3BvaW50ZXIgcF9lKSA6IG1fcF9lKHBfZSkKKyAgICAgIHsgfQorCisgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIGlubGluZQorICAgICAgYmluYXJ5X2hlYXBfcG9pbnRfY29uc3RfaXRlcmF0b3JfKCkgOiBtX3BfZSgwKSB7IH0KKworICAgICAgLy8vIENvcHkgY29uc3RydWN0b3IuCisgICAgICBpbmxpbmUKKyAgICAgIGJpbmFyeV9oZWFwX3BvaW50X2NvbnN0X2l0ZXJhdG9yXyhjb25zdCBiaW5hcnlfaGVhcF9wb2ludF9jb25zdF9pdGVyYXRvcl8mIG90aGVyKQorICAgICAgOiBtX3BfZShvdGhlci5tX3BfZSkKKyAgICAgIHsgfQorCisgICAgICAvLy8gQWNjZXNzLgorICAgICAgaW5saW5lIGNvbnN0X3BvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfZSAhPSAwKTsKKwlyZXR1cm4gdG9fcHRyKGludGVncmFsX2NvbnN0YW50PGludCwgU2ltcGxlPigpKTsKKyAgICAgIH0KKworICAgICAgLy8vIEFjY2Vzcy4KKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9lICE9IDApOworCXJldHVybiAqdG9fcHRyKGludGVncmFsX2NvbnN0YW50PGludCwgU2ltcGxlPigpKTsKKyAgICAgIH0KKworICAgICAgLy8vIENvbXBhcmVzIGNvbnRlbnQgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgYmluYXJ5X2hlYXBfcG9pbnRfY29uc3RfaXRlcmF0b3JfJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9lID09IG90aGVyLm1fcF9lOyB9CisKKyAgICAgIC8vLyBDb21wYXJlcyBjb250ZW50IChuZWdhdGl2ZWx5KSB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBiaW5hcnlfaGVhcF9wb2ludF9jb25zdF9pdGVyYXRvcl8mIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX2UgIT0gb3RoZXIubV9wX2U7IH0KKworICAgIHByaXZhdGU6CisgICAgICBpbmxpbmUgY29uc3RfcG9pbnRlcgorICAgICAgdG9fcHRyKHRydWVfdHlwZSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9lOyB9CisKKyAgICAgIGlubGluZSBjb25zdF9wb2ludGVyCisgICAgICB0b19wdHIoZmFsc2VfdHlwZSkgY29uc3QKKyAgICAgIHsgcmV0dXJuICptX3BfZTsgfQorCisgICAgcHVibGljOgorICAgICAgZW50cnlfcG9pbnRlciBtX3BfZTsKKyAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTEwZTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5hcnlfaGVhcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK0NtcF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfY21wX2ZuKCkKK3sKKyAgcmV0dXJuICgqdGhpcyk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBDbXBfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2NtcF9mbigpIGNvbnN0Cit7CisgIHJldHVybiAoKnRoaXMpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3Jlc2l6ZV9wb2xpY3kuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9yZXNpemVfcG9saWN5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWUzMjdjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9yZXNpemVfcG9saWN5LmhwcApAQCAtMCwwICsxLDI0MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5hcnlfaGVhcF8vcmVzaXplX3BvbGljeS5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbmFyeV9oZWFwLgorICovCisKKyNpZm5kZWYgUEJfRFNfQklOQVJZX0hFQVBfUkVTSVpFX1BPTElDWV9IUFAKKyNkZWZpbmUgUEJfRFNfQklOQVJZX0hFQVBfUkVTSVpFX1BPTElDWV9IUFAKKworI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBSZXNpemUgcG9saWN5IGZvciBiaW5hcnkgaGVhcC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgcmVzaXplX3BvbGljeQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgZW51bQorCXsKKwkgIHJhdGlvID0gOCwKKwkgIGZhY3RvciA9IDIKKwl9OworCisgICAgICAvLy8gTmV4dCBzaHJpbmsgc2l6ZS4KKyAgICAgIF9UcCAJCW1fc2hyaW5rX3NpemU7CisKKyAgICAgIC8vLyBOZXh0IGdyb3cgc2l6ZS4KKyAgICAgIF9UcCAJCW1fZ3Jvd19zaXplOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAJc2l6ZV90eXBlOworCisgICAgICBzdGF0aWMgY29uc3QgX1RwCW1pbl9zaXplID0gMTY7CisKKyAgICAgIHJlc2l6ZV9wb2xpY3koKSA6IG1fc2hyaW5rX3NpemUoMCksIG1fZ3Jvd19zaXplKG1pbl9zaXplKQorICAgICAgeyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCisgICAgICByZXNpemVfcG9saWN5KGNvbnN0IHJlc2l6ZV9wb2xpY3kmIG90aGVyKQorICAgICAgOiBtX3Nocmlua19zaXplKG90aGVyLm1fc2hyaW5rX3NpemUpLCBtX2dyb3dfc2l6ZShvdGhlci5tX2dyb3dfc2l6ZSkKKyAgICAgIHsgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHN3YXAocmVzaXplX3BvbGljeTxfVHA+Jik7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICByZXNpemVfbmVlZGVkX2Zvcl9ncm93KHNpemVfdHlwZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICByZXNpemVfbmVlZGVkX2Zvcl9zaHJpbmsoc2l6ZV90eXBlKSBjb25zdDsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGdyb3dfbmVlZGVkKHNpemVfdHlwZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBzaHJpbmtfbmVlZGVkKHNpemVfdHlwZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIGdldF9uZXdfc2l6ZV9mb3JfZ3JvdygpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBnZXRfbmV3X3NpemVfZm9yX3NocmluaygpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBnZXRfbmV3X3NpemVfZm9yX2FyYml0cmFyeShzaXplX3R5cGUpIGNvbnN0OworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgbm90aWZ5X2dyb3dfcmVzaXplKCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBub3RpZnlfc2hyaW5rX3Jlc2l6ZSgpOworCisgICAgICB2b2lkCisgICAgICBub3RpZnlfYXJiaXRyYXJ5KHNpemVfdHlwZSk7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19CSU5BUllfSEVBUF9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3Q7CisjZW5kaWYKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgY29uc3QgX1RwIHJlc2l6ZV9wb2xpY3k8X1RwPjo6bWluX3NpemU7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICByZXNpemVfcG9saWN5PF9UcD46OgorICAgIHN3YXAocmVzaXplX3BvbGljeTxfVHA+JiBvdGhlcikKKyAgICB7CisgICAgICBzdGQ6OnN3YXAobV9zaHJpbmtfc2l6ZSwgb3RoZXIubV9zaHJpbmtfc2l6ZSk7CisgICAgICBzdGQ6OnN3YXAobV9ncm93X3NpemUsIG90aGVyLm1fZ3Jvd19zaXplKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICByZXNpemVfcG9saWN5PF9UcD46OgorICAgIHJlc2l6ZV9uZWVkZWRfZm9yX2dyb3coc2l6ZV90eXBlIHNpemUpIGNvbnN0CisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHNpemUgPD0gbV9ncm93X3NpemUpOworICAgICAgcmV0dXJuIHNpemUgPT0gbV9ncm93X3NpemU7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgcmVzaXplX3BvbGljeTxfVHA+OjoKKyAgICByZXNpemVfbmVlZGVkX2Zvcl9zaHJpbmsoc2l6ZV90eXBlIHNpemUpIGNvbnN0CisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHNpemUgPD0gbV9ncm93X3NpemUpOworICAgICAgcmV0dXJuIHNpemUgPT0gbV9zaHJpbmtfc2l6ZTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIHJlc2l6ZV9wb2xpY3k8X1RwPjo6c2l6ZV90eXBlCisgICAgcmVzaXplX3BvbGljeTxfVHA+OjoKKyAgICBnZXRfbmV3X3NpemVfZm9yX2dyb3coKSBjb25zdAorICAgIHsgcmV0dXJuIG1fZ3Jvd19zaXplICogZmFjdG9yOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIHJlc2l6ZV9wb2xpY3k8X1RwPjo6c2l6ZV90eXBlCisgICAgcmVzaXplX3BvbGljeTxfVHA+OjoKKyAgICBnZXRfbmV3X3NpemVfZm9yX3NocmluaygpIGNvbnN0CisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIGhhbGZfc2l6ZSA9IG1fZ3Jvd19zaXplIC8gZmFjdG9yOworICAgICAgcmV0dXJuIHN0ZDo6bWF4KG1pbl9zaXplLCBoYWxmX3NpemUpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgcmVzaXplX3BvbGljeTxfVHA+OjpzaXplX3R5cGUKKyAgICByZXNpemVfcG9saWN5PF9UcD46OgorICAgIGdldF9uZXdfc2l6ZV9mb3JfYXJiaXRyYXJ5KHNpemVfdHlwZSBzaXplKSBjb25zdAorICAgIHsKKyAgICAgIHNpemVfdHlwZSByZXQgPSBtaW5fc2l6ZTsKKyAgICAgIHdoaWxlIChyZXQgPCBzaXplKQorCXJldCAqPSBmYWN0b3I7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHJlc2l6ZV9wb2xpY3k8X1RwPjo6CisgICAgbm90aWZ5X2dyb3dfcmVzaXplKCkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX2dyb3dfc2l6ZSA+PSBtaW5fc2l6ZSk7CisgICAgICBtX2dyb3dfc2l6ZSAqPSBmYWN0b3I7CisgICAgICBtX3Nocmlua19zaXplID0gbV9ncm93X3NpemUgLyByYXRpbzsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHJlc2l6ZV9wb2xpY3k8X1RwPjo6CisgICAgbm90aWZ5X3Nocmlua19yZXNpemUoKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgbV9zaHJpbmtfc2l6ZSAvPSBmYWN0b3I7CisgICAgICBpZiAobV9zaHJpbmtfc2l6ZSA9PSAxKQorCW1fc2hyaW5rX3NpemUgPSAwOworICAgICAgbV9ncm93X3NpemUgPSBzdGQ6Om1heChtX2dyb3dfc2l6ZSAvIGZhY3RvciwgbWluX3NpemUpOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgcmVzaXplX3BvbGljeTxfVHA+OjoKKyAgICBub3RpZnlfYXJiaXRyYXJ5KHNpemVfdHlwZSBhY3R1YWxfc2l6ZSkKKyAgICB7CisgICAgICBtX2dyb3dfc2l6ZSA9IGFjdHVhbF9zaXplOworICAgICAgbV9zaHJpbmtfc2l6ZSA9IG1fZ3Jvd19zaXplIC8gcmF0aW87CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICB9CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgcmVzaXplX3BvbGljeTxfVHA+OjoKKyAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3Nocmlua19zaXplID09IDAKKwkJCSB8fCBtX3Nocmlua19zaXplICogcmF0aW8gPT0gbV9ncm93X3NpemUpOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKG1fZ3Jvd19zaXplID49IG1pbl9zaXplKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0JJTkFSWV9IRUFQX1RSQUNFXworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgcmVzaXplX3BvbGljeTxfVHA+OjoKKyAgICB0cmFjZSgpIGNvbnN0CisgICAgeworICAgICAgc3RkOjpjZXJyIDw8ICJzaHJpbmsgPSAiIDw8IG1fc2hyaW5rX3NpemUKKwkJPDwgIiBncm93ID0gIiA8PCBtX2dyb3dfc2l6ZSA8PCBzdGQ6OmVuZGw7CisgICAgfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjMxNmQ0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTYwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbmFyeV9oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiaW5hcnlfaGVhcC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGl0KFByZWQgcHJlZCwgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKworICB0eXBlZGVmCisgICAgdHlwZW5hbWUgZW50cnlfcHJlZDx2YWx1ZV90eXBlLCBQcmVkLCBfQWxsb2MsIHNpbXBsZV92YWx1ZT46OnR5cGUKKyAgICBwcmVkX3Q7CisKKyAgY29uc3Qgc2l6ZV90eXBlIGxlZnQgPSBwYXJ0aXRpb24ocHJlZF90KHByZWQpKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+PSBsZWZ0KTsKKworICBjb25zdCBzaXplX3R5cGUgZXJzZCA9IG1fc2l6ZSAtIGxlZnQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3NpemUgPj0gZXJzZCk7CisKKyAgY29uc3Qgc2l6ZV90eXBlIG5ld19zaXplID0gcmVzaXplX3BvbGljeTo6Z2V0X25ld19zaXplX2Zvcl9hcmJpdHJhcnkobGVmdCk7CisgIGNvbnN0IHNpemVfdHlwZSBvdGhlcl9hY3R1YWxfc2l6ZSA9IG90aGVyLmdldF9uZXdfc2l6ZV9mb3JfYXJiaXRyYXJ5KGVyc2QpOworCisgIGVudHJ5X3BvaW50ZXIgYV9lbnRyaWVzID0gMDsKKyAgZW50cnlfcG9pbnRlciBhX290aGVyX2VudHJpZXMgPSAwOworCisgIF9fdHJ5CisgICAgeworICAgICAgYV9lbnRyaWVzID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobmV3X3NpemUpOworICAgICAgYV9vdGhlcl9lbnRyaWVzID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUob3RoZXJfYWN0dWFsX3NpemUpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeworICAgICAgaWYgKGFfZW50cmllcyAhPSAwKQorCXNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUoYV9lbnRyaWVzLCBuZXdfc2l6ZSk7CisKKyAgICAgIGlmIChhX290aGVyX2VudHJpZXMgIT0gMCkKKwlzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKGFfb3RoZXJfZW50cmllcywgb3RoZXJfYWN0dWFsX3NpemUpOworCisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9OworCisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgb3RoZXIubV9zaXplOyArK2kpCisgICAgZXJhc2VfYXQob3RoZXIubV9hX2VudHJpZXMsIGksIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG5ld19zaXplID49IGxlZnQpOworICBzdGQ6OmNvcHkobV9hX2VudHJpZXMsIG1fYV9lbnRyaWVzICsgbGVmdCwgYV9lbnRyaWVzKTsKKyAgc3RkOjpjb3B5KG1fYV9lbnRyaWVzICsgbGVmdCwgbV9hX2VudHJpZXMgKyBtX3NpemUsIGFfb3RoZXJfZW50cmllcyk7CisKKyAgc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX2FfZW50cmllcywgbV9hY3R1YWxfc2l6ZSk7CisgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUob3RoZXIubV9hX2VudHJpZXMsIG90aGVyLm1fYWN0dWFsX3NpemUpOworCisgIG1fYWN0dWFsX3NpemUgPSBuZXdfc2l6ZTsKKyAgb3RoZXIubV9hY3R1YWxfc2l6ZSA9IG90aGVyX2FjdHVhbF9zaXplOworCisgIG1fc2l6ZSA9IGxlZnQ7CisgIG90aGVyLm1fc2l6ZSA9IGVyc2Q7CisKKyAgbV9hX2VudHJpZXMgPSBhX2VudHJpZXM7CisgIG90aGVyLm1fYV9lbnRyaWVzID0gYV9vdGhlcl9lbnRyaWVzOworCisgIG1ha2VfaGVhcCgpOworICBvdGhlci5tYWtlX2hlYXAoKTsKKworICByZXNpemVfcG9saWN5Ojpub3RpZnlfYXJiaXRyYXJ5KG1fYWN0dWFsX3NpemUpOworICBvdGhlci5ub3RpZnlfYXJiaXRyYXJ5KG90aGVyLm1fYWN0dWFsX3NpemUpOworCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbihQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisKKyAgY29uc3Qgc2l6ZV90eXBlIGxlbiA9IG1fc2l6ZSArIG90aGVyLm1fc2l6ZTsKKyAgY29uc3Qgc2l6ZV90eXBlIG5ld19zaXplID0gcmVzaXplX3BvbGljeTo6Z2V0X25ld19zaXplX2Zvcl9hcmJpdHJhcnkobGVuKTsKKworICBlbnRyeV9wb2ludGVyIGFfZW50cmllcyA9IDA7CisgIGVudHJ5X3BvaW50ZXIgYV9vdGhlcl9lbnRyaWVzID0gMDsKKworICBfX3RyeQorICAgIHsKKyAgICAgIGFfZW50cmllcyA9IHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG5ld19zaXplKTsKKyAgICAgIGFfb3RoZXJfZW50cmllcyA9IHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKHJlc2l6ZV9wb2xpY3k6Om1pbl9zaXplKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIGlmIChhX2VudHJpZXMgIT0gMCkKKwlzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKGFfZW50cmllcywgbmV3X3NpemUpOworCisgICAgICBpZiAoYV9vdGhlcl9lbnRyaWVzICE9IDApCisJc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShhX290aGVyX2VudHJpZXMsIHJlc2l6ZV9wb2xpY3k6Om1pbl9zaXplKTsKKworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorCisgIHN0ZDo6Y29weShtX2FfZW50cmllcywgbV9hX2VudHJpZXMgKyBtX3NpemUsIGFfZW50cmllcyk7CisgIHN0ZDo6Y29weShvdGhlci5tX2FfZW50cmllcywgb3RoZXIubV9hX2VudHJpZXMgKyBvdGhlci5tX3NpemUsCisJICAgIGFfZW50cmllcyArIG1fc2l6ZSk7CisKKyAgc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX2FfZW50cmllcywgbV9hY3R1YWxfc2l6ZSk7CisgIG1fYV9lbnRyaWVzID0gYV9lbnRyaWVzOworICBtX3NpemUgPSBsZW47CisgIG1fYWN0dWFsX3NpemUgPSBuZXdfc2l6ZTsKKyAgcmVzaXplX3BvbGljeTo6bm90aWZ5X2FyYml0cmFyeShuZXdfc2l6ZSk7CisgIG1ha2VfaGVhcCgpOworCisgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUob3RoZXIubV9hX2VudHJpZXMsIG90aGVyLm1fYWN0dWFsX3NpemUpOworICBvdGhlci5tX2FfZW50cmllcyA9IGFfb3RoZXJfZW50cmllczsKKyAgb3RoZXIubV9zaXplID0gMDsKKyAgb3RoZXIubV9hY3R1YWxfc2l6ZSA9IHJlc2l6ZV9wb2xpY3k6Om1pbl9zaXplOworICBvdGhlci5ub3RpZnlfYXJiaXRyYXJ5KHJlc2l6ZV9wb2xpY3k6Om1pbl9zaXplKTsKKyAgb3RoZXIubWFrZV9oZWFwKCk7CisgIAorICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy90cmFjZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwZDY5NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5hcnlfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbmFyeV9oZWFwLgorICovCisKKyNpZmRlZiBQQl9EU19CSU5BUllfSEVBUF9UUkFDRV8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlKCkgY29uc3QKK3sKKyAgc3RkOjpjZXJyIDw8IHRoaXMgPDwgc3RkOjplbmRsOworCisgIHN0ZDo6Y2VyciA8PCBtX2FfZW50cmllcyA8PCBzdGQ6OmVuZGw7CisKKyAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtX3NpemU7ICsraSkKKyAgICB0cmFjZV9lbnRyeShtX2FfZW50cmllc1tpXSwgc19ub190aHJvd19jb3BpZXNfaW5kKTsKKworICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOworCisgIHN0ZDo6Y2VyciA8PCAic2l6ZSA9ICIgPDwgbV9zaXplIDw8ICIgIiA8PCAiYWN0dWFsX3NpemUgPSAiIDw8IG1fYWN0dWFsX3NpemUgPDwgc3RkOjplbmRsOworCisgIHJlc2l6ZV9wb2xpY3k6OnRyYWNlKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZV9lbnRyeShjb25zdCBlbnRyeSYgcl9lLCBmYWxzZV90eXBlKSBjb25zdAoreworICBzdGQ6OmNvdXQgPDwgcl9lIDw8ICIgIiA8PCogcl9lIDw8IHN0ZDo6ZW5kbDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlX2VudHJ5KGNvbnN0IGVudHJ5JiByX2UsIHRydWVfdHlwZSkgY29uc3QKK3sKKyAgc3RkOjpjb3V0IDw8IHJfZSA8PCBzdGQ6OmVuZGw7Cit9CisKKyNlbmRpZiAvLyAjaWZkZWYgUEJfRFNfQklOQVJZX0hFQVBfVFJBQ0VfCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vYmlub21pYWxfaGVhcF8uaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2Jpbm9taWFsX2hlYXBfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWQyZTVhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2Jpbm9taWFsX2hlYXBfLmhwcApAQCAtMCwwICsxLDExMiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5vbWlhbF9oZWFwXy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbm9taWFsIGhlYXAuCisgKi8KKworLyoKKyAqIEJpbm9taWFsIGhlYXAuCisgKiBWdWlsbGVtaW4gSiBpcyB0aGUgbWFzdGFoLgorICogTW9kaWZpZWQgZnJvbSBDTFJTLgorICovCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9iaW5vbWlhbF9oZWFwX2Jhc2VfLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgYmlub21pYWxfaGVhcDxWYWx1ZV9UeXBlLCBDbXBfRm4sIF9BbGxvYz4KKworICAgIC8qKgorICAgICAqICBCaW5vbWlhbCBoZWFwLgorICAgICAqCisgICAgICogIEBpbmdyb3VwIGhlYXAtZGV0YWlsCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYmlub21pYWxfaGVhcAorICAgIDogcHVibGljIGJpbm9taWFsX2hlYXBfYmFzZTxWYWx1ZV9UeXBlLCBDbXBfRm4sIF9BbGxvYz4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgYmlub21pYWxfaGVhcF9iYXNlPFZhbHVlX1R5cGUsIENtcF9GbiwgX0FsbG9jPiAJYmFzZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om5vZGVfcG9pbnRlciAJCW5vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX2NvbnN0X3BvaW50ZXIgCW5vZGVfY29uc3RfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgVmFsdWVfVHlwZSAJCQkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIAkJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50ZXIgCQlwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cmVmZXJlbmNlIAkJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50X2NvbnN0X2l0ZXJhdG9yIAlwb2ludF9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludF9pdGVyYXRvciAJcG9pbnRfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgCWNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Oml0ZXJhdG9yIAkJaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y21wX2ZuIAkJY21wX2ZuOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmFsbG9jYXRvcl90eXBlIAlhbGxvY2F0b3JfdHlwZTsKKworICAgICAgYmlub21pYWxfaGVhcCgpOworCisgICAgICBiaW5vbWlhbF9oZWFwKGNvbnN0IENtcF9GbiYpOworCisgICAgICBiaW5vbWlhbF9oZWFwKGNvbnN0IGJpbm9taWFsX2hlYXAmKTsKKworICAgICAgfmJpbm9taWFsX2hlYXAoKTsKKworICAgIHByb3RlY3RlZDoKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisgICAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzNWE0NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDYwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRldGFpbC9iaW5vbWlhbF9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIGJpbm9taWFsX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitiaW5vbWlhbF9oZWFwKCkKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Jpbm9taWFsX2hlYXAoY29uc3QgQ21wX0ZuJiByX2NtcF9mbikKKzogYmFzZV90eXBlKHJfY21wX2ZuKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmlub21pYWxfaGVhcChjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCis6IGJhc2VfdHlwZShvdGhlcikKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK35iaW5vbWlhbF9oZWFwKCkgeyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlY2Y1NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDQ5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRldGFpbC9iaW5vbWlhbF9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIGJpbm9taWFsX2hlYXBfLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sgYmFzZV90eXBlOjphc3NlcnRfdmFsaWQodHJ1ZSwgX19maWxlLCBfX2xpbmUpOyB9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2Jpbm9taWFsX2hlYXBfYmFzZV8uaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vYmlub21pYWxfaGVhcF9iYXNlXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlNTE0MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2Jpbm9taWFsX2hlYXBfYmFzZV8uaHBwCkBAIC0wLDAgKzEsMjExIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbm9taWFsX2hlYXBfYmFzZV8vYmlub21pYWxfaGVhcF9iYXNlXy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJhc2Ugb2YgYmlub21pYWwgaGVhcHMuCisgKi8KKworI2lmbmRlZiBQQl9EU19CSU5PTUlBTF9IRUFQX0JBU0VfSFBQCisjZGVmaW5lIFBCX0RTX0JJTk9NSUFMX0hFQVBfQkFTRV9IUFAKKworLyoKKyAqIEJpbm9taWFsIGhlYXAgYmFzZS4KKyAqIFZ1aWxsZW1pbiBKIGlzIHRoZSBtYXN0YWguCisgKiBNb2RpZmllZCBmcm9tIENMUlMuCisgKi8KKworI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIGJpbm9taWFsX2hlYXBfYmFzZTxWYWx1ZV9UeXBlLCBDbXBfRm4sIF9BbGxvYz4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjZGVmaW5lIFBCX0RTX0JfSEVBUF9CQVNFIFwKKyAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcDxWYWx1ZV9UeXBlLCBDbXBfRm4sIFwKKwkJCQl0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSwgIF9BbGxvYywgZmFsc2U+CisjZWxzZQorI2RlZmluZSBQQl9EU19CX0hFQVBfQkFTRSBcCisgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXA8VmFsdWVfVHlwZSwgQ21wX0ZuLCBcCisJCQkJdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUsIF9BbGxvYz4KKyNlbmRpZgorCisgICAgLy8vIEJhc2UgY2xhc3MgZm9yIGJpbm9taWFsIGhlYXAuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYmlub21pYWxfaGVhcF9iYXNlCisgICAgOiBwdWJsaWMgUEJfRFNfQl9IRUFQX0JBU0UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8VmFsdWVfVHlwZT46Om90aGVyIF9fcmViaW5kX3Y7CisgICAgICB0eXBlZGVmIFBCX0RTX0JfSEVBUF9CQVNFCSAgCQkJYmFzZV90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om5vZGUgCQkJbm9kZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3BvaW50ZXIgCQlub2RlX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9jb25zdF9wb2ludGVyIAlub2RlX2NvbnN0X3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgCQkJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIENtcF9GbiAJCQkJCWNtcF9mbjsKKyAgICAgIHR5cGVkZWYgX0FsbG9jIAkJCQkJYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAkJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJCWRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92Ojpwb2ludGVyIAkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdjo6Y29uc3RfcG9pbnRlciAJY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdjo6cmVmZXJlbmNlIAkJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92Ojpjb25zdF9yZWZlcmVuY2UgICAJY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfY29uc3RfaXRlcmF0b3IgCXBvaW50X2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50X2l0ZXJhdG9yIAlwb2ludF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciAJY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aXRlcmF0b3IgCQlpdGVyYXRvcjsKKworICAgIHB1YmxpYzoKKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBwdXNoKGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIHZvaWQKKyAgICAgIG1vZGlmeShwb2ludF9pdGVyYXRvciwgY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIGNvbnN0X3JlZmVyZW5jZQorICAgICAgdG9wKCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIHBvcCgpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZShwb2ludF9pdGVyYXRvcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZV9pZihQcmVkKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0KFByZWQsIFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIGpvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgIHByb3RlY3RlZDoKKworICAgICAgYmlub21pYWxfaGVhcF9iYXNlKCk7CisKKyAgICAgIGJpbm9taWFsX2hlYXBfYmFzZShjb25zdCBDbXBfRm4mKTsKKworICAgICAgYmlub21pYWxfaGVhcF9iYXNlKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgfmJpbm9taWFsX2hlYXBfYmFzZSgpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICAgIHZvaWQKKyAgICAgIGNvcHlfZnJvbV9yYW5nZShJdCwgSXQpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZmluZF9tYXgoKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoYm9vbCwgY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9tYXgoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisjZW5kaWYKKworICAgIHByaXZhdGU6CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGZpeChub2RlX3BvaW50ZXIpIGNvbnN0OworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgaW5zZXJ0X25vZGUobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHJlbW92ZV9wYXJlbnRsZXNzX25vZGUobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgam9pbihub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcikgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChub2RlX2NvbnN0X3BvaW50ZXIsIGJvb2wsIGJvb2wsCisJCQkgICAgIGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBub2RlX3BvaW50ZXIgCW1fcF9tYXg7CisgICAgfTsKKworI2RlZmluZSBQQl9EU19BU1NFUlRfVkFMSURfQ09ORChYLCBfU3RyaWN0bHlCaW5vbWlhbCkJCQlcCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoWC5hc3NlcnRfdmFsaWQoX1N0cmljdGx5Qmlub21pYWwsX19GSUxFX18sIF9fTElORV9fKTspCisKKyNkZWZpbmUgUEJfRFNfQVNTRVJUX0JBU0VfTk9ERV9DT05TSVNURU5UKF9Ob2RlLCBfQm9vbCkJCQlcCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjphc3NlcnRfbm9kZV9jb25zaXN0ZW50KF9Ob2RlLCBfQm9vbCwJXAorCQkJCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vZmluZF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9lcmFzZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcD4KKworI3VuZGVmIFBCX0RTX0FTU0VSVF9CQVNFX05PREVfQ09OU0lTVEVOVAorI3VuZGVmIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05ECisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0JfSEVBUF9CQVNFCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyMjhkZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsODUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmlub21pYWxfaGVhcF9iYXNlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmFzZSBvZiBiaW5vbWlhbCBoZWFwcy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb3B5X2Zyb21fcmFuZ2UoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQpCit7CisgIHdoaWxlIChmaXJzdF9pdCAhPSBsYXN0X2l0KQorICAgIHB1c2goKihmaXJzdF9pdCsrKSk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksZmFsc2UpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitiaW5vbWlhbF9oZWFwX2Jhc2UoKSA6IG1fcF9tYXgoMCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSxmYWxzZSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Jpbm9taWFsX2hlYXBfYmFzZShjb25zdCBDbXBfRm4mIHJfY21wX2ZuKQorOiBiYXNlX3R5cGUocl9jbXBfZm4pLCBtX3BfbWF4KDApCit7IFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksZmFsc2UpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Jpbm9taWFsX2hlYXBfYmFzZShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCis6IGJhc2VfdHlwZShvdGhlciksIG1fcF9tYXgoMCkKK3sgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSxmYWxzZSkgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksZmFsc2UpCisgIGJhc2VfdHlwZTo6c3dhcChvdGhlcik7CisgIHN0ZDo6c3dhcChtX3BfbWF4LCBvdGhlci5tX3BfbWF4KTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSxmYWxzZSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK35iaW5vbWlhbF9oZWFwX2Jhc2UoKQoreyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTNmMjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEwMCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5vbWlhbF9oZWFwX2Jhc2VfL2RlYnVnX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiYXNlIG9mIGJpbm9taWFsIGhlYXBzLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKGJvb2wgc3RyaWN0bHlfYmlub21pYWwsIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgYmFzZV90eXBlOjphc3NlcnRfdmFsaWQoX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KGJhc2VfdHlwZTo6bV9wX3Jvb3QsIHN0cmljdGx5X2Jpbm9taWFsLCB0cnVlLAorCQkJIF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X21heChfX2ZpbGUsIF9fbGluZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbWF4KGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgaWYgKG1fcF9tYXggPT0gMCkKKyAgICByZXR1cm47CisgIFBCX0RTX0RFQlVHX1ZFUklGWShiYXNlX3R5cGU6OnBhcmVudChtX3BfbWF4KSA9PSAwKTsKKyAgZm9yIChjb25zdF9pdGVyYXRvciBpdCA9IGJhc2VfdHlwZTo6YmVnaW4oKTsgaXQgIT0gYmFzZV90eXBlOjplbmQoKTsgKytpdCkKKyAgICBQQl9EU19ERUJVR19WRVJJRlkoIUNtcF9Gbjo6b3BlcmF0b3IoKShtX3BfbWF4LT5tX3ZhbHVlLAorCQkJCQkgICBpdC5tX3BfbmQtPm1fdmFsdWUpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9ub2RlX2NvbnNpc3RlbnQobm9kZV9jb25zdF9wb2ludGVyIHBfbmQsIGJvb2wgc3RyaWN0bHlfYmlub21pYWwsCisJCSAgICAgICBib29sIGluY3JlYXNpbmcsIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgUEJfRFNfREVCVUdfVkVSSUZZKGluY3JlYXNpbmcgfHwgc3RyaWN0bHlfYmlub21pYWwpOworICBiYXNlX3R5cGU6OmFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9uZCwgZmFsc2UsIF9fZmlsZSwgX19saW5lKTsKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm47CisgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kLT5tX21ldGFkYXRhID09IGJhc2VfdHlwZTo6ZGVncmVlKHBfbmQpKTsKKyAgUEJfRFNfREVCVUdfVkVSSUZZKGJhc2VfdHlwZTo6c2l6ZV91bmRlcl9ub2RlKHBfbmQpID09CisJCSAgIHN0YXRpY19jYXN0PHNpemVfdHlwZT4oMSA8PCBwX25kLT5tX21ldGFkYXRhKSk7CisgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9uZC0+bV9wX25leHRfc2libGluZywgc3RyaWN0bHlfYmlub21pYWwsIGluY3JlYXNpbmcsCisJCQkgX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQtPm1fcF9sX2NoaWxkLCB0cnVlLCBmYWxzZSwgX19maWxlLCBfX2xpbmUpOworICBpZiAocF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorICAgIHsKKyAgICAgIGlmIChpbmNyZWFzaW5nKQorCXsKKwkgIGlmIChzdHJpY3RseV9iaW5vbWlhbCkKKwkgICAgUEJfRFNfREVCVUdfVkVSSUZZKHBfbmQtPm1fbWV0YWRhdGEKKwkJCQkgIDwgcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSk7CisJICBlbHNlCisJICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kLT5tX21ldGFkYXRhCisJCQkJICA8PSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX21ldGFkYXRhKTsKKwl9CisgICAgICBlbHNlCisJUEJfRFNfREVCVUdfVkVSSUZZKHBfbmQtPm1fbWV0YWRhdGEKKwkJCSAgICAgID4gcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSk7CisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NiY2E3OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTYxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbm9taWFsX2hlYXBfYmFzZV8vZXJhc2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJhc2Ugb2YgYmlub21pYWwgaGVhcHMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BvcCgpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksdHJ1ZSkKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFiYXNlX3R5cGU6OmVtcHR5KCkpOworCisgIGlmIChtX3BfbWF4ID09IDApCisgICAgZmluZF9tYXgoKTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX21heCAhPSAwKTsKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3BfbWF4OworICByZW1vdmVfcGFyZW50bGVzc19ub2RlKG1fcF9tYXgpOworICBiYXNlX3R5cGU6OmFjdHVhbF9lcmFzZV9ub2RlKHBfbmQpOworICBtX3BfbWF4ID0gMDsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSx0cnVlKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVtb3ZlX3BhcmVudGxlc3Nfbm9kZShub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYXNlX3R5cGU6OnBhcmVudChwX25kKSA9PSAwKTsKKworICBub2RlX3BvaW50ZXIgcF9jdXJfcm9vdCA9IHBfbmQgPT0gYmFzZV90eXBlOjptX3Bfcm9vdD8KKyAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nIDogYmFzZV90eXBlOjptX3Bfcm9vdDsKKworICBpZiAocF9jdXJfcm9vdCAhPSAwKQorICAgIHBfY3VyX3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgaWYgKHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCAhPSAwKQorICAgIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX25leHRfc2libGluZyA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgaWYgKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQ7CisKKyAgbm9kZV9wb2ludGVyIHBfY2hpbGQgPSBwX25kLT5tX3BfbF9jaGlsZDsKKyAgaWYgKHBfY2hpbGQgIT0gMCkKKyAgICB7CisgICAgICBwX2NoaWxkLT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworICAgICAgd2hpbGUgKHBfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKwlwX2NoaWxkID0gcF9jaGlsZC0+bV9wX25leHRfc2libGluZzsKKyAgICB9CisKKyAgbV9wX21heCA9IDA7CisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBqb2luKHBfY3VyX3Jvb3QsIHBfY2hpbGQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyKCkKK3sKKyAgYmFzZV90eXBlOjpjbGVhcigpOworICBtX3BfbWF4ID0gMDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKHBvaW50X2l0ZXJhdG9yIGl0KQoreworICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLHRydWUpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghYmFzZV90eXBlOjplbXB0eSgpKTsKKworICBiYXNlX3R5cGU6OmJ1YmJsZV90b190b3AoaXQubV9wX25kKTsKKyAgcmVtb3ZlX3BhcmVudGxlc3Nfbm9kZShpdC5tX3BfbmQpOworICBiYXNlX3R5cGU6OmFjdHVhbF9lcmFzZV9ub2RlKGl0Lm1fcF9uZCk7CisgIG1fcF9tYXggPSAwOworICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLHRydWUpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaWYoUHJlZCBwcmVkKQoreworICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLHRydWUpCisKKyAgaWYgKGJhc2VfdHlwZTo6ZW1wdHkoKSkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLHRydWUpCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgYmFzZV90eXBlOjp0b19saW5rZWRfbGlzdCgpOworICBub2RlX3BvaW50ZXIgcF9vdXQgPSBiYXNlX3R5cGU6OnBydW5lKHByZWQpOworICBzaXplX3R5cGUgZXJzZCA9IDA7CisgIHdoaWxlIChwX291dCAhPSAwKQorICAgIHsKKyAgICAgICsrZXJzZDsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX291dC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIGJhc2VfdHlwZTo6YWN0dWFsX2VyYXNlX25vZGUocF9vdXQpOworICAgICAgcF9vdXQgPSBwX25leHQ7CisgICAgfQorCisgIG5vZGVfcG9pbnRlciBwX2N1ciA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSAwOworICB3aGlsZSAocF9jdXIgIT0gMCkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9jdXItPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBwX2N1ci0+bV9wX2xfY2hpbGQgPSBwX2N1ci0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKyAgICAgIHBfY3VyLT5tX21ldGFkYXRhID0gMDsKKyAgICAgIHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKworICAgICAgaWYgKGJhc2VfdHlwZTo6bV9wX3Jvb3QgIT0gMCkKKwliYXNlX3R5cGU6Om1fcF9yb290LT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX2N1cjsKKworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfY3VyOworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IGZpeChiYXNlX3R5cGU6Om1fcF9yb290KTsKKyAgICAgIHBfY3VyID0gcF9uZXh0OworICAgIH0KKworICBtX3BfbWF4ID0gMDsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSx0cnVlKQorICByZXR1cm4gZXJzZDsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2ZpbmRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9maW5kX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Mzg1YTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9maW5kX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNzAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmlub21pYWxfaGVhcF9iYXNlXy9maW5kX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiYXNlIG9mIGJpbm9taWFsIGhlYXBzLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3JlZmVyZW5jZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgordG9wKCkgY29uc3QKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSxmYWxzZSkKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFiYXNlX3R5cGU6OmVtcHR5KCkpOworCisgIGlmIChtX3BfbWF4ID09IDApCisgICAgY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyogPih0aGlzKS0+ZmluZF9tYXgoKTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX21heCAhPSAwKTsKKyAgcmV0dXJuIG1fcF9tYXgtPm1fdmFsdWU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX21heCgpCit7CisgIG5vZGVfcG9pbnRlciBwX2N1ciA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisgIG1fcF9tYXggPSBwX2N1cjsKKyAgd2hpbGUgKHBfY3VyICE9IDApCisgICAgeworICAgICAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShtX3BfbWF4LT5tX3ZhbHVlLCBwX2N1ci0+bV92YWx1ZSkpCisJbV9wX21heCA9IHBfY3VyOworICAgICAgcF9jdXIgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmZiMDAyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTc4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbm9taWFsX2hlYXBfYmFzZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiYXNlIG9mIGJpbm9taWFsIGhlYXBzLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitwdXNoKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSx0cnVlKQorICBub2RlX3BvaW50ZXIgcF9uZCA9IGJhc2VfdHlwZTo6Z2V0X25ld19ub2RlX2Zvcl9pbnNlcnQocl92YWwpOworICBpbnNlcnRfbm9kZShwX25kKTsKKyAgbV9wX21heCA9IDA7CisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksdHJ1ZSkKKyAgcmV0dXJuIHBvaW50X2l0ZXJhdG9yKHBfbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydF9ub2RlKG5vZGVfcG9pbnRlciBwX25kKQoreworICBpZiAoYmFzZV90eXBlOjptX3Bfcm9vdCA9PSAwKQorICAgIHsKKyAgICAgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSAwOworICAgICAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKyAgICAgIHBfbmQtPm1fcF9sX2NoaWxkID0gMDsKKyAgICAgIHBfbmQtPm1fbWV0YWRhdGEgPSAwOworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfbmQ7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChiYXNlX3R5cGU6Om1fcF9yb290LT5tX21ldGFkYXRhID4gMCkKKyAgICB7CisgICAgICBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kLT5tX3BfbF9jaGlsZCA9IDA7CisgICAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQ7CisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZDsKKyAgICAgIHBfbmQtPm1fbWV0YWRhdGEgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoQ21wX0ZuOjpvcGVyYXRvcigpKGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fdmFsdWUsIHBfbmQtPm1fdmFsdWUpKQorICAgIHsKKyAgICAgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSBiYXNlX3R5cGU6Om1fcF9yb290LT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKyAgICAgIHBfbmQtPm1fbWV0YWRhdGEgPSAxOworICAgICAgcF9uZC0+bV9wX2xfY2hpbGQgPSBiYXNlX3R5cGU6Om1fcF9yb290OworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZDsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9uZXh0X3NpYmxpbmcgPSAwOworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfbmQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcF9uZC0+bV9wX25leHRfc2libGluZyA9IDA7CisgICAgICBwX25kLT5tX3BfbF9jaGlsZCA9IDA7CisgICAgICBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBiYXNlX3R5cGU6Om1fcF9yb290OworICAgICAgcF9uZC0+bV9tZXRhZGF0YSA9IDA7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9wX2xfY2hpbGQgPT0gMCk7CisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290LT5tX3BfbF9jaGlsZCA9IHBfbmQ7CisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290LT5tX21ldGFkYXRhID0gMTsKKyAgICB9CisKKyAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IGZpeChiYXNlX3R5cGU6Om1fcF9yb290KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitmaXgobm9kZV9wb2ludGVyIHBfbmQpIGNvbnN0Cit7CisgIHdoaWxlIChwX25kLT5tX3BfbmV4dF9zaWJsaW5nICE9IDAgJiYKKwkgcF9uZC0+bV9tZXRhZGF0YSA9PSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX21ldGFkYXRhKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShwX25kLT5tX3ZhbHVlLCBwX25leHQtPm1fdmFsdWUpKQorCXsKKwkgIHBfbmV4dC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50OworCisJICBpZiAocF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ICE9IDApCisJICAgIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX25leHRfc2libGluZyA9IHBfbmV4dDsKKworCSAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKHBfbmQsIHBfbmV4dCk7CisJICArK3BfbmV4dC0+bV9tZXRhZGF0YTsKKwkgIHBfbmQgPSBwX25leHQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25leHQtPm1fcF9uZXh0X3NpYmxpbmc7CisKKwkgIGlmIChwX25kLT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisJICAgIHBfbmV4dC0+bV9wX25leHRfc2libGluZyA9IDA7CisKKwkgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihwX25leHQsIHBfbmQpOworCSAgKytwX25kLT5tX21ldGFkYXRhOworCX0KKyAgICB9CisKKyAgaWYgKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kOworCisgIHJldHVybiBwX25kOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbW9kaWZ5KHBvaW50X2l0ZXJhdG9yIGl0LCBjb25zdF9yZWZlcmVuY2Ugcl9uZXdfdmFsKQoreworICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLHRydWUpCisgIG5vZGVfcG9pbnRlciBwX25kID0gaXQubV9wX25kOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kICE9IDApOworICBQQl9EU19BU1NFUlRfQkFTRV9OT0RFX0NPTlNJU1RFTlQocF9uZCwgZmFsc2UpCisKKyAgY29uc3QgYm9vbCBidWJibGVfdXAgPSBDbXBfRm46Om9wZXJhdG9yKCkocF9uZC0+bV92YWx1ZSwgcl9uZXdfdmFsKTsKKyAgcF9uZC0+bV92YWx1ZSA9IHJfbmV3X3ZhbDsKKworICBpZiAoYnViYmxlX3VwKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX3BhcmVudCA9IGJhc2VfdHlwZTo6cGFyZW50KHBfbmQpOworICAgICAgd2hpbGUgKHBfcGFyZW50ICE9IDAgJiYKKwkgICAgIENtcF9Gbjo6b3BlcmF0b3IoKShwX3BhcmVudC0+bV92YWx1ZSwgcF9uZC0+bV92YWx1ZSkpCisJeworCSAgYmFzZV90eXBlOjpzd2FwX3dpdGhfcGFyZW50KHBfbmQsIHBfcGFyZW50KTsKKwkgIHBfcGFyZW50ID0gYmFzZV90eXBlOjpwYXJlbnQocF9uZCk7CisJfQorCisgICAgICBpZiAocF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID09IDApCisJYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfbmQ7CisKKyAgICAgIG1fcF9tYXggPSAwOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSx0cnVlKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBiYXNlX3R5cGU6OmJ1YmJsZV90b190b3AocF9uZCk7CisgIHJlbW92ZV9wYXJlbnRsZXNzX25vZGUocF9uZCk7CisgIGluc2VydF9ub2RlKHBfbmQpOworICBtX3BfbWF4ID0gMDsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSx0cnVlKQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjMTg1MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxOTcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmlub21pYWxfaGVhcF9iYXNlXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiYXNlIG9mIGJpbm9taWFsIGhlYXBzLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsaXQoUHJlZCBwcmVkLCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksdHJ1ZSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQob3RoZXIsdHJ1ZSkKKworICBvdGhlci5jbGVhcigpOworICBpZiAoYmFzZV90eXBlOjplbXB0eSgpKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksdHJ1ZSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKG90aGVyLHRydWUpCisgICAgICByZXR1cm47CisgICAgfQorCisgIGJhc2VfdHlwZTo6dG9fbGlua2VkX2xpc3QoKTsKKyAgbm9kZV9wb2ludGVyIHBfb3V0ID0gYmFzZV90eXBlOjpwcnVuZShwcmVkKTsKKyAgd2hpbGUgKHBfb3V0ICE9IDApCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV9zaXplID4gMCk7CisgICAgICAtLWJhc2VfdHlwZTo6bV9zaXplOworICAgICAgKytvdGhlci5tX3NpemU7CisKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX291dC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIHBfb3V0LT5tX3BfbF9jaGlsZCA9IHBfb3V0LT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworICAgICAgcF9vdXQtPm1fbWV0YWRhdGEgPSAwOworCisgICAgICBwX291dC0+bV9wX25leHRfc2libGluZyA9IG90aGVyLm1fcF9yb290OworICAgICAgaWYgKG90aGVyLm1fcF9yb290ICE9IDApCisJb3RoZXIubV9wX3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfb3V0OworCisgICAgICBvdGhlci5tX3Bfcm9vdCA9IHBfb3V0OworICAgICAgb3RoZXIubV9wX3Jvb3QgPSBvdGhlci5maXgob3RoZXIubV9wX3Jvb3QpOworICAgICAgcF9vdXQgPSBwX25leHQ7CisgICAgfQorCisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKG90aGVyLHRydWUpCisgIG5vZGVfcG9pbnRlciBwX2N1ciA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSAwOworCisgIHdoaWxlIChwX2N1ciAhPSAwKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKyAgICAgIHBfY3VyLT5tX3BfbF9jaGlsZCA9IHBfY3VyLT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworICAgICAgcF9jdXItPm1fbWV0YWRhdGEgPSAwOworICAgICAgcF9jdXItPm1fcF9uZXh0X3NpYmxpbmcgPSBiYXNlX3R5cGU6Om1fcF9yb290OworCisgICAgICBpZiAoYmFzZV90eXBlOjptX3Bfcm9vdCAhPSAwKQorCWJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfY3VyOworCisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9jdXI7CisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gZml4KGJhc2VfdHlwZTo6bV9wX3Jvb3QpOworICAgICAgcF9jdXIgPSBwX25leHQ7CisgICAgfQorCisgIG1fcF9tYXggPSAwOworICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLHRydWUpCisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKG90aGVyLHRydWUpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbihQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksdHJ1ZSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQob3RoZXIsdHJ1ZSkKKworICBub2RlX3BvaW50ZXIgcF9vdGhlciA9IG90aGVyLm1fcF9yb290OworICBpZiAocF9vdGhlciAhPSAwKQorICAgIGRvCisgICAgICB7CisJbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfb3RoZXItPm1fcF9uZXh0X3NpYmxpbmc7CisJc3RkOjpzd2FwKHBfb3RoZXItPm1fcF9uZXh0X3NpYmxpbmcsIHBfb3RoZXItPm1fcF9wcmV2X29yX3BhcmVudCk7CisJcF9vdGhlciA9IHBfbmV4dDsKKyAgICAgIH0KKyAgICB3aGlsZSAocF9vdGhlciAhPSAwKTsKKworICBiYXNlX3R5cGU6Om1fcF9yb290ID0gam9pbihiYXNlX3R5cGU6Om1fcF9yb290LCBvdGhlci5tX3Bfcm9vdCk7CisgIGJhc2VfdHlwZTo6bV9zaXplICs9IG90aGVyLm1fc2l6ZTsKKyAgbV9wX21heCA9IDA7CisKKyAgb3RoZXIubV9wX3Jvb3QgPSAwOworICBvdGhlci5tX3NpemUgPSAwOworICBvdGhlci5tX3BfbWF4ID0gMDsKKworICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLHRydWUpCisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKG90aGVyLHRydWUpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbihub2RlX3BvaW50ZXIgcF9saHMsIG5vZGVfcG9pbnRlciBwX3JocykgY29uc3QKK3sKKyAgbm9kZV9wb2ludGVyIHBfcmV0ID0gMDsKKyAgbm9kZV9wb2ludGVyIHBfY3VyID0gMDsKKworICB3aGlsZSAocF9saHMgIT0gMCB8fCBwX3JocyAhPSAwKQorICAgIHsKKyAgICAgIGlmIChwX3JocyA9PSAwKQorCXsKKwkgIGlmIChwX2N1ciA9PSAwKQorCSAgICBwX3JldCA9IHBfY3VyID0gcF9saHM7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwX2N1ci0+bV9wX25leHRfc2libGluZyA9IHBfbGhzOworCSAgICAgIHBfbGhzLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX2N1cjsKKwkgICAgfQorCSAgcF9jdXIgPSBwX2xocyA9IDA7CisJfQorICAgICAgZWxzZSBpZiAocF9saHMgPT0gMCB8fCBwX3Jocy0+bV9tZXRhZGF0YSA8IHBfbGhzLT5tX21ldGFkYXRhKQorCXsKKwkgIGlmIChwX2N1ciA9PSAwKQorCSAgICB7CisJICAgICAgcF9yZXQgPSBwX2N1ciA9IHBfcmhzOworCSAgICAgIHBfcmhzID0gcF9yaHMtPm1fcF9wcmV2X29yX3BhcmVudDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcF9jdXItPm1fcF9uZXh0X3NpYmxpbmcgPSBwX3JoczsKKwkgICAgICBwX3JocyA9IHBfcmhzLT5tX3BfcHJldl9vcl9wYXJlbnQ7CisJICAgICAgcF9jdXItPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfY3VyOworCSAgICAgIHBfY3VyID0gcF9jdXItPm1fcF9uZXh0X3NpYmxpbmc7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChwX2xocy0+bV9tZXRhZGF0YSA8IHBfcmhzLT5tX21ldGFkYXRhKQorCXsKKwkgIGlmIChwX2N1ciA9PSAwKQorCSAgICBwX3JldCA9IHBfY3VyID0gcF9saHM7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwX2N1ci0+bV9wX25leHRfc2libGluZyA9IHBfbGhzOworCSAgICAgIHBfbGhzLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX2N1cjsKKwkgICAgICBwX2N1ciA9IHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nOworCSAgICB9CisJICBwX2xocyA9IHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBub2RlX3BvaW50ZXIgcF9uZXh0X3JocyA9IHBfcmhzLT5tX3BfcHJldl9vcl9wYXJlbnQ7CisJICBwX3Jocy0+bV9wX25leHRfc2libGluZyA9IHBfbGhzOworCSAgcF9saHMgPSBmaXgocF9yaHMpOworCSAgcF9yaHMgPSBwX25leHRfcmhzOworCX0KKyAgICB9CisKKyAgaWYgKHBfY3VyICE9IDApCisgICAgcF9jdXItPm1fcF9uZXh0X3NpYmxpbmcgPSAwOworCisgIGlmIChwX3JldCAhPSAwKQorICAgIHBfcmV0LT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworCisgIHJldHVybiBwX3JldDsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L2JyYW5jaF9wb2xpY3kuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JyYW5jaF9wb2xpY3kvYnJhbmNoX3BvbGljeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlZGMyMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L2JyYW5jaF9wb2xpY3kuaHBwCkBAIC0wLDAgKzEsMTE5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJyYW5jaF9wb2xpY3kvYnJhbmNoX3BvbGljeS5ocHAKKyAqIENvbnRhaW5zIGEgYmFzZSBjbGFzcyBmb3IgYnJhbmNoIHBvbGljaWVzLgorICovCisKKyNpZm5kZWYgUEJfRFNfQlJBTkNIX1BPTElDWV9CQVNFX0hQUAorI2RlZmluZSBQQl9EU19CUkFOQ0hfUE9MSUNZX0JBU0VfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBQcmltYXJ5IHRlbXBsYXRlLCBiYXNlIGNsYXNzIGZvciBicmFuY2ggc3RydWN0dXJlIHBvbGljaWVzLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwgdHlwZW5hbWUgTm9kZV9JdHIsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0cnVjdCBicmFuY2hfcG9saWN5CisgICAgICB7CisgICAgICBwcm90ZWN0ZWQ6CisJdHlwZWRlZiB0eXBlbmFtZSBOb2RlX0l0cjo6dmFsdWVfdHlwZSAJCWl0X3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxpdF90eXBlPjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfdHlwZTo6Zmlyc3RfdHlwZSAJa2V5X3R5cGU7CisKKwl0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jb25zdDx2YWx1ZV90eXBlPjo6dHlwZQlyY3ZhbHVlX3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY29uc3Q8a2V5X3R5cGU+Ojp0eXBlCXJja2V5X3R5cGU7CisKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHJjdmFsdWVfdHlwZT46Om90aGVyIHJlYmluZF92OworCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8cmNrZXlfdHlwZT46Om90aGVyICAgcmViaW5kX2s7CisKKwl0eXBlZGVmCXR5cGVuYW1lIHJlYmluZF92OjpyZWZlcmVuY2UgCQlyZWZlcmVuY2U7CisJdHlwZWRlZgl0eXBlbmFtZSByZWJpbmRfdjo6Y29uc3RfcmVmZXJlbmNlIAljb25zdF9yZWZlcmVuY2U7CisJdHlwZWRlZgl0eXBlbmFtZSByZWJpbmRfdjo6Y29uc3RfcG9pbnRlcgljb25zdF9wb2ludGVyOworCisJdHlwZWRlZgl0eXBlbmFtZSByZWJpbmRfazo6Y29uc3RfcmVmZXJlbmNlIAlrZXlfY29uc3RfcmVmZXJlbmNlOworCisJc3RhdGljIGlubGluZSBrZXlfY29uc3RfcmVmZXJlbmNlCisJZXh0cmFjdF9rZXkoY29uc3RfcmVmZXJlbmNlIHJfdmFsKQorCXsgcmV0dXJuIHJfdmFsLmZpcnN0OyB9CisKKwl2aXJ0dWFsIGl0X3R5cGUKKwllbmQoKSA9IDA7CisKKwlpdF90eXBlCisJZW5kX2l0ZXJhdG9yKCkgY29uc3QKKwl7IHJldHVybiBjb25zdF9jYXN0PGJyYW5jaF9wb2xpY3kqPih0aGlzKS0+ZW5kKCk7IH0KKworCXZpcnR1YWwKKwl+YnJhbmNoX3BvbGljeSgpIHsgfQorICAgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgY29uc3QgaXRlcmF0b3JzLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgc3RydWN0IGJyYW5jaF9wb2xpY3k8Tm9kZV9DSXRyLCBOb2RlX0NJdHIsIF9BbGxvYz4KKyAgICAgIHsKKyAgICAgIHByb3RlY3RlZDoKKwl0eXBlZGVmIHR5cGVuYW1lIE5vZGVfQ0l0cjo6dmFsdWVfdHlwZSAJCSAgIGl0X3R5cGU7CisgICAgICAgCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8aXRfdHlwZT46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jb25zdDx2YWx1ZV90eXBlPjo6dHlwZQkJICAgcmN2YWx1ZV90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8cmN2YWx1ZV90eXBlPjo6b3RoZXIgcmViaW5kX3Y7CisJdHlwZWRlZgl0eXBlbmFtZSByZWJpbmRfdjo6cmVmZXJlbmNlIAkJcmVmZXJlbmNlOworCXR5cGVkZWYJdHlwZW5hbWUgcmViaW5kX3Y6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworCXR5cGVkZWYJdHlwZW5hbWUgcmViaW5kX3Y6OmNvbnN0X3BvaW50ZXIJY29uc3RfcG9pbnRlcjsKKworCXR5cGVkZWYgdmFsdWVfdHlwZSAJCQkJa2V5X3R5cGU7CisJdHlwZWRlZgl0eXBlbmFtZSByZWJpbmRfdjo6Y29uc3RfcmVmZXJlbmNlIAlrZXlfY29uc3RfcmVmZXJlbmNlOworCisJc3RhdGljIGlubGluZSBrZXlfY29uc3RfcmVmZXJlbmNlCisJZXh0cmFjdF9rZXkoY29uc3RfcmVmZXJlbmNlIHJfdmFsKQorCXsgcmV0dXJuIHJfdmFsOyB9CisKKwl2aXJ0dWFsIGl0X3R5cGUKKwllbmQoKSBjb25zdCA9IDA7CisKKwlpdF90eXBlCisJZW5kX2l0ZXJhdG9yKCkgY29uc3QKKwl7IHJldHVybiBlbmQoKTsgfQorCisJdmlydHVhbAorCX5icmFuY2hfcG9saWN5KCkgeyB9CisgICAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfQlJBTkNIX1BPTElDWV9CQVNFX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JyYW5jaF9wb2xpY3kvbnVsbF9ub2RlX21ldGFkYXRhLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L251bGxfbm9kZV9tZXRhZGF0YS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmNzYzZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L251bGxfbm9kZV9tZXRhZGF0YS5ocHAKQEAgLTAsMCArMSw2NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBicmFuY2hfcG9saWN5L251bGxfbm9kZV9tZXRhZGF0YS5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0cmVlLWxpa2UgY2xhc3Nlcy4KKyAqLworCisjaWZuZGVmIFBCX0RTXzBfTk9ERV9NRVRBREFUQV9IUFAKKyNkZWZpbmUgUEJfRFNfMF9OT0RFX01FVEFEQVRBX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlc190cmFpdHMuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gQ29uc3RhbnQgbm9kZSBpdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIERhdGEsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0cnVjdCBkdW1ub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICB7CisgICAgICBwcml2YXRlOgorCXR5cGVkZWYgdHlwZXNfdHJhaXRzPEtleSwgRGF0YSwgX0FsbG9jLCBmYWxzZT4JX190cmFpdHNfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6OnBvaW50ZXIgICAgICAgIAljb25zdF9pdGVyYXRvcjsKKwkKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yIAkJCQl2YWx1ZV90eXBlOworCXR5cGVkZWYgY29uc3RfaXRlcmF0b3IgCQkJCWNvbnN0X3JlZmVyZW5jZTsKKwl0eXBlZGVmIGNvbnN0X3JlZmVyZW5jZSAJICAgICAgIAkJcmVmZXJlbmNlOworICAgICAgfTsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JyYW5jaF9wb2xpY3kvdHJhaXRzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L3RyYWl0cy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjYjBjNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L3RyYWl0cy5ocHAKQEAgLTAsMCArMSw5NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBicmFuY2hfcG9saWN5L3RyYWl0cy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0cmVlLWxpa2UgY2xhc3Nlcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX05PREVfQU5EX0lUX1RSQUlUU19IUFAKKyNkZWZpbmUgUEJfRFNfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlc190cmFpdHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy90cmFpdHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHJlZV9wb2xpY3kvbm9kZV9tZXRhZGF0YV9zZWxlY3Rvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9ub2RlX21ldGFkYXRhX3NlbGVjdG9yLmhwcD4KKworI2RlZmluZSBQQl9EU19ERUJVR19WRVJJRlkoX0NvbmQpCQkJCQlcCisgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWV9BVChfQ29uZCwJCQkJCVwKKwkJCSAgIF9NX21lc3NhZ2UoI19Db25kIiBhc3NlcnRpb24gZnJvbSAlMTs6JTI7IikJXAorCQkJICAgLl9NX3N0cmluZyhfX0ZJTEVfXykuX01faW50ZWdlcihfX0xJTkVfXykJXAorCQkJICAgLF9fZmlsZSxfX2xpbmUpCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBUcmVlIHRyYWl0cyBjbGFzcywgcHJpbWFyeSB0ZW1wbGF0ZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBEYXRhLAorCSAgICAgdHlwZW5hbWUgQ21wX0ZuLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLAorCQkgICAgICB0eXBlbmFtZSBOb2RlX0l0ciwKKwkJICAgICAgdHlwZW5hbWUgQ21wX0ZuXywKKwkJICAgICAgdHlwZW5hbWUgX0FsbG9jPgorCSAgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICB0eXBlbmFtZSBUYWcsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHRyZWVfdHJhaXRzOworCisgICAgLy8vIFRyaWUgdHJhaXRzIGNsYXNzLCBwcmltYXJ5IHRlbXBsYXRlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIERhdGEsCisJICAgICB0eXBlbmFtZSBfQVRyYWl0cywKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwKKwkJICAgICAgdHlwZW5hbWUgTm9kZV9JdHIsCisJCSAgICAgIHR5cGVuYW1lIF9BVHJhaXRzXywKKwkJICAgICAgdHlwZW5hbWUgX0FsbG9jPgorCSAgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICB0eXBlbmFtZSBUYWcsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHRyaWVfdHJhaXRzOworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL3RyYWl0cy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy90cmFpdHMuaHBwPgorCisjdW5kZWYgUEJfRFNfREVCVUdfVkVSSUZZCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX05PREVfQU5EX0lUX1RSQUlUU19IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY2NfaHRfbWFwXy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NjX2h0X21hcF8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDU3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NjX2h0X21hcF8uaHBwCkBAIC0wLDAgKzEsNjc5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9jY19odF9tYXBfLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGNjX2h0X21hcF8uCisgKi8KKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vcmFuZ2VkX2hhc2hfZm4uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZXhjZXB0aW9uLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2hhc2hfZXFfZm4uaHBwPgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9kZWJ1Z19tYXBfYmFzZS5ocHA+CisjZW5kaWYKKyNpZmRlZiBQQl9EU19IVF9NQVBfVFJBQ0VfCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0NDX0hBU0hfTkFNRSBjY19odF9tYXAKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfQ0NfSEFTSF9OQU1FIGNjX2h0X3NldAorI2VuZGlmCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBIYXNoX0ZuLCBcCisJICAgICB0eXBlbmFtZSBFcV9GbiwgdHlwZW5hbWUgX0FsbG9jLCBib29sIFN0b3JlX0hhc2gsIFwKKwkgICAgIHR5cGVuYW1lIENvbWJfSGFzaF9GbiwgdHlwZW5hbWUgUmVzaXplX1BvbGljeT4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgUEJfRFNfQ0NfSEFTSF9OQU1FPEtleSwgTWFwcGVkLCBIYXNoX0ZuLCBFcV9GbiwgX0FsbG9jLAlcCisJCSAgICAgU3RvcmVfSGFzaCwgQ29tYl9IYXNoX0ZuLCBSZXNpemVfUG9saWN5PgorCisjZGVmaW5lIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMgXAorICAgIGhhc2hfZXFfZm48S2V5LCBFcV9GbiwgX0FsbG9jLCBTdG9yZV9IYXNoPgorCisjZGVmaW5lIFBCX0RTX1JBTkdFRF9IQVNIX0ZOX0NfREVDIFwKKyAgICByYW5nZWRfaGFzaF9mbjxLZXksCUhhc2hfRm4sIF9BbGxvYywgQ29tYl9IYXNoX0ZuLCBTdG9yZV9IYXNoPgorCisjZGVmaW5lIFBCX0RTX0NDX0hBU0hfVFJBSVRTX0JBU0UgXAorICAgIHR5cGVzX3RyYWl0czxLZXksIE1hcHBlZCwgX0FsbG9jLCBTdG9yZV9IYXNoPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNkZWZpbmUgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgXAorICAgIGRlYnVnX21hcF9iYXNlPEtleSwJRXFfRm4sIFwKKwkJICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxLZXk+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlPgorI2VuZGlmCisKKworICAgIC8qKgorICAgICAqICBBIGNvbGxpc2lvbi1jaGFpbmluZyBoYXNoLWJhc2VkIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqCisgICAgICogIEBpbmdyb3VwIGhhc2gtZGV0YWlsCisgICAgICoKKyAgICAgKiAgQHRwYXJhbSBLZXkgCSAgICAJS2V5IHR5cGUuCisgICAgICoKKyAgICAgKiAgQHRwYXJhbSBNYXBwZWQgCSAgICAJTWFwIHR5cGUuCisgICAgICoKKyAgICAgKiAgQHRwYXJhbSBIYXNoX0ZuCSAgICAgIAlIYXNoaW5nIGZ1bmN0b3IuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgX19nbnVfY3h4OjpoYXNoLgorICAgICAqCisgICAgICogIEB0cGFyYW0gRXFfRm4JICAgICAgCUVxdWFsIGZ1bmN0b3IuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgc3RkOjplcXVhbF90bzxLZXk+CisgICAgICoKKyAgICAgKiAgQHRwYXJhbSBfQWxsb2MgCSAgICAJQWxsb2NhdG9yIHR5cGUuCisgICAgICoKKyAgICAgKiAgQHRwYXJhbSBTdG9yZV9IYXNoICAgIAlJZiBrZXkgdHlwZSBzdG9yZXMgZXh0cmEgbWV0YWRhdGEuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqCisgICAgICogIEB0cGFyYW0gQ29tYl9IYXNoX0ZuCUNvbWJpbmluZyBoYXNoIGZ1bmN0b3IuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIElmIEhhc2hfRm4gaXMgbm90IG51bGxfdHlwZSwgdGhlbiB0aGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSByYW5nZWQtaGFzaCBmdW5jdG9yOyBvdGhlcndpc2UsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgdGhlIHJhbmdlLWhhc2hpbmcgZnVuY3Rvci4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgWFhYKFNlZSBEZXNpZ246Okhhc2gtQmFzZWQgQ29udGFpbmVyczo6SGFzaCBQb2xpY2llcy4pCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZy4KKyAgICAgKgorICAgICAqICBAdHBhcmFtIFJlc2l6ZV9Qb2xpY3kgCVJlc2l6ZXMgaGFzaC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gaGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBoYXNoX2V4cG9uZW50aWFsX3NpemVfcG9saWN5IGFuZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXIuCisgICAgICoKKyAgICAgKgorICAgICAqICBCYXNlcyBhcmU6IGRldGFpbDo6aGFzaF9lcV9mbiwgUmVzaXplX1BvbGljeSwgZGV0YWlsOjpyYW5nZWRfaGFzaF9mbiwKKyAgICAgKiAgICAgICAgICAgICBkZXRhaWw6OnR5cGVzX3RyYWl0cy4gKE9wdGlvbmFsOiBkZXRhaWw6OmRlYnVnX21hcF9iYXNlLikKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgICB0eXBlbmFtZSBIYXNoX0ZuLAorCSAgICAgdHlwZW5hbWUgRXFfRm4sCisJICAgICB0eXBlbmFtZSBfQWxsb2MsCisJICAgICBib29sIFN0b3JlX0hhc2gsCisJICAgICB0eXBlbmFtZSBDb21iX0hhc2hfRm4sCisJICAgICB0eXBlbmFtZSBSZXNpemVfUG9saWN5ID4KKyAgICBjbGFzcyBQQl9EU19DQ19IQVNIX05BTUU6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHByb3RlY3RlZCBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQywKKyNlbmRpZgorICAgICAgcHVibGljIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMsCisgICAgICBwdWJsaWMgUmVzaXplX1BvbGljeSwKKyAgICAgIHB1YmxpYyBQQl9EU19SQU5HRURfSEFTSF9GTl9DX0RFQywKKyAgICAgIHB1YmxpYyBQQl9EU19DQ19IQVNIX1RSQUlUU19CQVNFCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIFBCX0RTX0NDX0hBU0hfVFJBSVRTX0JBU0UJICAgICAgIAl0cmFpdHNfYmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbXBfaGFzaCAJY29tcF9oYXNoOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6dmFsdWVfdHlwZSAJdmFsdWVfdHlwZV87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpwb2ludGVyIAlwb2ludGVyXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcl87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpyZWZlcmVuY2UgCXJlZmVyZW5jZV87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlXzsKKworICAgICAgc3RydWN0IGVudHJ5IDogcHVibGljIHRyYWl0c19iYXNlOjpzdG9yZWRfZGF0YV90eXBlCisgICAgICB7CisJdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8ZW50cnk+OjpvdGhlcjo6cG9pbnRlciBtX3BfbmV4dDsKKyAgICAgIH07CisKKyAgICAgIHR5cGVkZWYgY29uZF9kZWFsdG9yPGVudHJ5LCBfQWxsb2M+IAljb25kX2RlYWx0b3JfdDsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxlbnRyeT46Om90aGVyIGVudHJ5X2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpwb2ludGVyIGVudHJ5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6Y29uc3RfcG9pbnRlciBjb25zdF9lbnRyeV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OnJlZmVyZW5jZSBlbnRyeV9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X2VudHJ5X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxlbnRyeV9wb2ludGVyPjo6b3RoZXIgZW50cnlfcG9pbnRlcl9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X3BvaW50ZXJfYWxsb2NhdG9yOjpwb2ludGVyIGVudHJ5X3BvaW50ZXJfYXJyYXk7CisKKyAgICAgIHR5cGVkZWYgUEJfRFNfUkFOR0VEX0hBU0hfRk5fQ19ERUMgcmFuZ2VkX2hhc2hfZm5fYmFzZTsKKyAgICAgIHR5cGVkZWYgUEJfRFNfSEFTSF9FUV9GTl9DX0RFQyBoYXNoX2VxX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIFJlc2l6ZV9Qb2xpY3kgcmVzaXplX2Jhc2U7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdHlwZWRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQyAJZGVidWdfYmFzZTsKKyNlbmRpZgorCisjZGVmaW5lIFBCX0RTX0dFTl9QT1Mgc3RkOjpwYWlyPGVudHJ5X3BvaW50ZXIsIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlPgorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvcG9pbnRfY29uc3RfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL3BvaW50X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9jb25zdF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvaXRlcmF0b3IuaHBwPgorCisjdW5kZWYgUEJfRFNfR0VOX1BPUworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQWxsb2MgCQkJCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBIYXNoX0ZuIAkJCQloYXNoX2ZuOworICAgICAgdHlwZWRlZiBFcV9GbiAJCQkJZXFfZm47CisgICAgICB0eXBlZGVmIENvbWJfSGFzaF9GbiAJCQljb21iX2hhc2hfZm47CisgICAgICB0eXBlZGVmIFJlc2l6ZV9Qb2xpY3kgCQkJcmVzaXplX3BvbGljeTsKKworICAgICAgLy8vIFZhbHVlIHN0b3JlcyBoYXNoLCB0cnVlIG9yIGZhbHNlLgorICAgICAgZW51bQorCXsKKwkgIHN0b3JlX2hhc2ggPSBTdG9yZV9IYXNoCisJfTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfcG9pbnRlciBrZXlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9jb25zdF9wb2ludGVyIGtleV9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3JlZmVyZW5jZSBrZXlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X2NvbnN0X3JlZmVyZW5jZSBrZXlfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3R5cGUgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfcG9pbnRlciBtYXBwZWRfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9jb25zdF9wb2ludGVyIG1hcHBlZF9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3JlZmVyZW5jZSBtYXBwZWRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX2NvbnN0X3JlZmVyZW5jZSBtYXBwZWRfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6dmFsdWVfdHlwZSAJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnBvaW50ZXIgCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpyZWZlcmVuY2UgCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIHBvaW50X2l0ZXJhdG9yXyAJCQlwb2ludF9pdGVyYXRvcjsKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyAgICAgIHR5cGVkZWYgcG9pbnRfY29uc3RfaXRlcmF0b3JfIAkJcG9pbnRfaXRlcmF0b3I7CisjZW5kaWYKKworICAgICAgdHlwZWRlZiBwb2ludF9jb25zdF9pdGVyYXRvcl8gCQlwb2ludF9jb25zdF9pdGVyYXRvcjsKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfIAkJCWl0ZXJhdG9yOworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvcl8gCQkJaXRlcmF0b3I7CisjZW5kaWYKKworICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvcl8gCQkJY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIFBCX0RTX0NDX0hBU0hfTkFNRSgpOworCisgICAgICBQQl9EU19DQ19IQVNIX05BTUUoY29uc3QgSGFzaF9GbiYpOworCisgICAgICBQQl9EU19DQ19IQVNIX05BTUUoY29uc3QgSGFzaF9GbiYsIGNvbnN0IEVxX0ZuJik7CisKKyAgICAgIFBCX0RTX0NDX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJiwgY29uc3QgRXFfRm4mLCBjb25zdCBDb21iX0hhc2hfRm4mKTsKKworICAgICAgUEJfRFNfQ0NfSEFTSF9OQU1FKGNvbnN0IEhhc2hfRm4mLCBjb25zdCBFcV9GbiYsIGNvbnN0IENvbWJfSGFzaF9GbiYsCisJCSAgICAgICBjb25zdCBSZXNpemVfUG9saWN5Jik7CisKKyAgICAgIFBCX0RTX0NDX0hBU0hfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2aXJ0dWFsCisgICAgICB+UEJfRFNfQ0NfSEFTSF9OQU1FKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fcmFuZ2UoSXQsIEl0KTsKKworICAgICAgdm9pZAorICAgICAgaW5pdGlhbGl6ZSgpOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3Q7CisKKyAgICAgIC8vLyBUcnVlIGlmIHNpemUoKSA9PSAwLgorICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBoYXNoX2ZuLgorICAgICAgSGFzaF9GbiYKKyAgICAgIGdldF9oYXNoX2ZuKCk7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBjb25zdCBoYXNoX2ZuLgorICAgICAgY29uc3QgSGFzaF9GbiYKKyAgICAgIGdldF9oYXNoX2ZuKCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBlcV9mbi4KKyAgICAgIEVxX0ZuJgorICAgICAgZ2V0X2VxX2ZuKCk7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBjb25zdCBlcV9mbi4KKyAgICAgIGNvbnN0IEVxX0ZuJgorICAgICAgZ2V0X2VxX2ZuKCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBjb21iX2hhc2hfZm4uCisgICAgICBDb21iX0hhc2hfRm4mCisgICAgICBnZXRfY29tYl9oYXNoX2ZuKCk7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBjb25zdCBjb21iX2hhc2hfZm4uCisgICAgICBjb25zdCBDb21iX0hhc2hfRm4mCisgICAgICBnZXRfY29tYl9oYXNoX2ZuKCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCByZXNpemVfcG9saWN5LgorICAgICAgUmVzaXplX1BvbGljeSYKKyAgICAgIGdldF9yZXNpemVfcG9saWN5KCk7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBjb25zdCByZXNpemVfcG9saWN5LgorICAgICAgY29uc3QgUmVzaXplX1BvbGljeSYKKyAgICAgIGdldF9yZXNpemVfcG9saWN5KCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsKQorICAgICAgeyByZXR1cm4gaW5zZXJ0X2ltcChyX3ZhbCwgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsgfQorCisgICAgICBpbmxpbmUgbWFwcGVkX3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQorICAgICAgeworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKwlyZXR1cm4gKHN1YnNjcmlwdF9pbXAocl9rZXksIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcikpOworI2Vsc2UKKwlpbnNlcnQocl9rZXkpOworCXJldHVybiB0cmFpdHNfYmFzZTo6c19udWxsX3R5cGU7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgcG9pbnRfY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgZmluZF9lbmQoKTsKKworICAgICAgaW5saW5lIHBvaW50X2NvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kX2VuZCgpIGNvbnN0OworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZXJhc2Uoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBlcmFzZV9pZihQcmVkKTsKKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKTsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBiZWdpbigpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgZW5kKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19IVF9NQVBfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0OworI2VuZGlmCisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgZGVhbGxvY2F0ZV9hbGwoKTsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGRvX3Jlc2l6ZV9pZl9uZWVkZWQoKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGRvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKTsKKworICAgICAgdm9pZAorICAgICAgcmVzaXplX2ltcChzaXplX3R5cGUpOworCisgICAgICB2b2lkCisgICAgICBkb19yZXNpemUoc2l6ZV90eXBlKTsKKworICAgICAgdm9pZAorICAgICAgcmVzaXplX2ltcF9ub19leGNlcHRpb25zKHNpemVfdHlwZSwgZW50cnlfcG9pbnRlcl9hcnJheSwgc2l6ZV90eXBlKTsKKworICAgICAgaW5saW5lIGVudHJ5X3BvaW50ZXIKKyAgICAgIHJlc2l6ZV9pbXBfbm9fZXhjZXB0aW9uc19yZWFzc2lnbl9wb2ludGVyKGVudHJ5X3BvaW50ZXIsCisJCQkJCQllbnRyeV9wb2ludGVyX2FycmF5LAorCQkJCQkJZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSBlbnRyeV9wb2ludGVyCisgICAgICByZXNpemVfaW1wX25vX2V4Y2VwdGlvbnNfcmVhc3NpZ25fcG9pbnRlcihlbnRyeV9wb2ludGVyLAorCQkJCQkJZW50cnlfcG9pbnRlcl9hcnJheSwKKwkJCQkJCXRydWVfdHlwZSk7CisKKyAgICAgIHZvaWQKKyAgICAgIGRlYWxsb2NhdGVfbGlua3NfaW5fbGlzdChlbnRyeV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIGVudHJ5X3BvaW50ZXIKKyAgICAgIGdldF9lbnRyeShjb25zdF9yZWZlcmVuY2UsIGZhbHNlX3R5cGUpOworCisgICAgICBpbmxpbmUgZW50cnlfcG9pbnRlcgorICAgICAgZ2V0X2VudHJ5KGNvbnN0X3JlZmVyZW5jZSwgdHJ1ZV90eXBlKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHJlbHNfZW50cnkoZW50cnlfcG9pbnRlcik7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICBpbmxpbmUgbWFwcGVkX3JlZmVyZW5jZQorICAgICAgc3Vic2NyaXB0X2ltcChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBmYWxzZV90eXBlKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCWNvbnN0IHNpemVfdHlwZSBwb3MgPSByYW5nZWRfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KTsKKwllbnRyeV9wb2ludGVyIHBfZSA9IG1fZW50cmllc1twb3NdOworCXJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpOworCisJd2hpbGUgKHBfZSAhPSAwCisJICAgICAgICYmICFoYXNoX2VxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocF9lLT5tX3ZhbHVlLmZpcnN0LCByX2tleSkpCisJICB7CisJICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9jb2xsaXNpb24oKTsKKwkgICAgcF9lID0gcF9lLT5tX3BfbmV4dDsKKwkgIH0KKworCXJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKwlpZiAocF9lICE9IDApCisJICB7CisJICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisJICAgIHJldHVybiAocF9lLT5tX3ZhbHVlLnNlY29uZCk7CisJICB9CisKKwlQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisJcmV0dXJuIGluc2VydF9uZXdfaW1wKHZhbHVlX3R5cGUocl9rZXksIG1hcHBlZF90eXBlKCkpLCBwb3MpLT5zZWNvbmQ7CisgICAgICB9CisKKyAgICAgIGlubGluZSBtYXBwZWRfcmVmZXJlbmNlCisgICAgICBzdWJzY3JpcHRfaW1wKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIHRydWVfdHlwZSkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZChfX0ZJTEVfXywgX19MSU5FX18pOykKKwljb21wX2hhc2ggcG9zX2hhc2hfcGFpciA9IHJhbmdlZF9oYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworCWVudHJ5X3BvaW50ZXIgcF9lID0gbV9lbnRyaWVzW3Bvc19oYXNoX3BhaXIuZmlyc3RdOworCXJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpOworCXdoaWxlIChwX2UgIT0gMCAmJgorCSAgICAgICAhaGFzaF9lcV9mbl9iYXNlOjpvcGVyYXRvcigpKHBfZS0+bV92YWx1ZS5maXJzdCwgcF9lLT5tX2hhc2gsCisJCQkJCSAgICByX2tleSwgcG9zX2hhc2hfcGFpci5zZWNvbmQpKQorCSAgeworCSAgICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7CisJICAgIHBfZSA9IHBfZS0+bV9wX25leHQ7CisJICB9CisKKwlyZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisJaWYgKHBfZSAhPSAwKQorCSAgeworCSAgICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorCSAgICByZXR1cm4gcF9lLT5tX3ZhbHVlLnNlY29uZDsKKwkgIH0KKworCVBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKwlyZXR1cm4gaW5zZXJ0X25ld19pbXAodmFsdWVfdHlwZShyX2tleSwgbWFwcGVkX3R5cGUoKSksCisJCQkgICAgICBwb3NfaGFzaF9wYWlyKS0+c2Vjb25kOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnRfaW1wKGNvbnN0X3JlZmVyZW5jZSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnRfaW1wKGNvbnN0X3JlZmVyZW5jZSwgdHJ1ZV90eXBlKTsKKworICAgICAgaW5saW5lIHBvaW50ZXIKKyAgICAgIGluc2VydF9uZXdfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgc2l6ZV90eXBlIHBvcykKKyAgICAgIHsKKwlpZiAoZG9fcmVzaXplX2lmX25lZWRlZCgpKQorCSAgcG9zID0gcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocl92YWwpKTsKKworCS8vIEZvbGxvd2luZyBsaW5lcyBtaWdodCB0aHJvdyBhbiBleGNlcHRpb24uCisJZW50cnlfcG9pbnRlciBwX2UgPSBnZXRfZW50cnkocl92YWwsCisJCQkJICAgICAgdHJhaXRzX2Jhc2U6Om1fbm9fdGhyb3dfY29waWVzX2luZGljYXRvcik7CisKKwkvLyBBdCB0aGlzIHBvaW50IG5vIGV4Y2VwdGlvbnMgY2FuIGJlIHRocm93bi4KKwlwX2UtPm1fcF9uZXh0ID0gbV9lbnRyaWVzW3Bvc107CisJbV9lbnRyaWVzW3Bvc10gPSBwX2U7CisJcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRlZCgrK21fbnVtX3VzZWRfZSk7CisKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoUEJfRFNfVjJGKHJfdmFsKSk7KQorCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCXJldHVybiAmcF9lLT5tX3ZhbHVlOworICAgICAgfQorCisgICAgICBpbmxpbmUgcG9pbnRlcgorICAgICAgaW5zZXJ0X25ld19pbXAoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCBjb21wX2hhc2gmIHJfcG9zX2hhc2hfcGFpcikKKyAgICAgIHsKKwkvLyBGb2xsb3dpbmcgbGluZXMgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uLgorCWlmIChkb19yZXNpemVfaWZfbmVlZGVkKCkpCisJICByX3Bvc19oYXNoX3BhaXIgPSByYW5nZWRfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihyX3ZhbCkpOworCisJZW50cnlfcG9pbnRlciBwX2UgPSBnZXRfZW50cnkocl92YWwsCisJCQkJICAgICAgdHJhaXRzX2Jhc2U6Om1fbm9fdGhyb3dfY29waWVzX2luZGljYXRvcik7CisKKwkvLyBBdCB0aGlzIHBvaW50IG5vIGV4Y2VwdGlvbnMgY2FuIGJlIHRocm93bi4KKwlwX2UtPm1faGFzaCA9IHJfcG9zX2hhc2hfcGFpci5zZWNvbmQ7CisJcF9lLT5tX3BfbmV4dCA9IG1fZW50cmllc1tyX3Bvc19oYXNoX3BhaXIuZmlyc3RdOworCW1fZW50cmllc1tyX3Bvc19oYXNoX3BhaXIuZmlyc3RdID0gcF9lOworCXJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0ZWQoKyttX251bV91c2VkX2UpOworCV9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhQQl9EU19WMkYocl92YWwpKTspCisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisJcmV0dXJuICZwX2UtPm1fdmFsdWU7CisgICAgICB9CisKKyAgICAgIGlubGluZSBwb2ludGVyCisgICAgICBmaW5kX2tleV9wb2ludGVyKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIGZhbHNlX3R5cGUpCisgICAgICB7CisJZW50cnlfcG9pbnRlciBwX2UgPSBtX2VudHJpZXNbcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSldOworCXJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKTsKKwl3aGlsZSAocF9lICE9IDAgJiYKKwkgICAgICAgIWhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgcl9rZXkpKQorCSAgeworCSAgICByZXNpemVfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX2NvbGxpc2lvbigpOworCSAgICBwX2UgPSBwX2UtPm1fcF9uZXh0OworCSAgfQorCisJcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisJaWYgKHBfZSA9PSAwKQorCSAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorCWVsc2UKKwkgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisjZW5kaWYKKwlyZXR1cm4gJnBfZS0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50ZXIKKyAgICAgIGZpbmRfa2V5X3BvaW50ZXIoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgdHJ1ZV90eXBlKQorICAgICAgeworCWNvbXBfaGFzaCBwb3NfaGFzaF9wYWlyID0gcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSk7CisJZW50cnlfcG9pbnRlciBwX2UgPSBtX2VudHJpZXNbcG9zX2hhc2hfcGFpci5maXJzdF07CisJcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpOworCXdoaWxlIChwX2UgIT0gMCAmJgorCSAgICAgICAhaGFzaF9lcV9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpLAorCQkJCQkgICAgcF9lLT5tX2hhc2gsCisJCQkJCSAgICByX2tleSwgcG9zX2hhc2hfcGFpci5zZWNvbmQpKQorCSAgeworCSAgICByZXNpemVfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX2NvbGxpc2lvbigpOworCSAgICBwX2UgPSBwX2UtPm1fcF9uZXh0OworCSAgfQorCisJcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisJaWYgKHBfZSA9PSAwKQorCSAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorCWVsc2UKKwkgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisjZW5kaWYKKwlyZXR1cm4gJnBfZS0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVyYXNlX2luX3Bvc19pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSwgc2l6ZV90eXBlKTsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVyYXNlX2luX3Bvc19pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSwgY29uc3QgY29tcF9oYXNoJik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBlcmFzZV9lbnRyeV9wb2ludGVyKGVudHJ5X3BvaW50ZXImKTsKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIHZvaWQKKyAgICAgIGluY19pdF9zdGF0ZShwb2ludGVyJiByX3BfdmFsdWUsCisJCSAgIHN0ZDo6cGFpcjxlbnRyeV9wb2ludGVyLCBzaXplX3R5cGU+JiByX3BvcykgY29uc3QKKyAgICAgIHsKKwlpbmNfaXRfc3RhdGUoKG1hcHBlZF9jb25zdF9wb2ludGVyJiApcl9wX3ZhbHVlLCByX3Bvcyk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgaW5jX2l0X3N0YXRlKGNvbnN0X3BvaW50ZXImIHJfcF92YWx1ZSwKKwkJICAgc3RkOjpwYWlyPGVudHJ5X3BvaW50ZXIsIHNpemVfdHlwZT4mIHJfcG9zKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChyX3BfdmFsdWUgIT0gMCk7CisJcl9wb3MuZmlyc3QgPSByX3Bvcy5maXJzdC0+bV9wX25leHQ7CisJaWYgKHJfcG9zLmZpcnN0ICE9IDApCisJICB7CisJICAgIHJfcF92YWx1ZSA9ICZyX3Bvcy5maXJzdC0+bV92YWx1ZTsKKwkgICAgcmV0dXJuOworCSAgfQorCisJZm9yICgrK3JfcG9zLnNlY29uZDsgcl9wb3Muc2Vjb25kIDwgbV9udW1fZTsgKytyX3Bvcy5zZWNvbmQpCisJICBpZiAobV9lbnRyaWVzW3JfcG9zLnNlY29uZF0gIT0gMCkKKwkgICAgeworCSAgICAgIHJfcG9zLmZpcnN0ID0gbV9lbnRyaWVzW3JfcG9zLnNlY29uZF07CisJICAgICAgcl9wX3ZhbHVlID0gJnJfcG9zLmZpcnN0LT5tX3ZhbHVlOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCXJfcF92YWx1ZSA9IDA7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGdldF9zdGFydF9pdF9zdGF0ZShwb2ludGVyJiByX3BfdmFsdWUsCisJCQkgc3RkOjpwYWlyPGVudHJ5X3BvaW50ZXIsIHNpemVfdHlwZT4mIHJfcG9zKSBjb25zdAorICAgICAgeworCWZvciAocl9wb3Muc2Vjb25kID0gMDsgcl9wb3Muc2Vjb25kIDwgbV9udW1fZTsgKytyX3Bvcy5zZWNvbmQpCisJICBpZiAobV9lbnRyaWVzW3JfcG9zLnNlY29uZF0gIT0gMCkKKwkgICAgeworCSAgICAgIHJfcG9zLmZpcnN0ID0gbV9lbnRyaWVzW3JfcG9zLnNlY29uZF07CisJICAgICAgcl9wX3ZhbHVlID0gJnJfcG9zLmZpcnN0LT5tX3ZhbHVlOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCXJfcF92YWx1ZSA9IDA7CisgICAgICB9CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X2VudHJ5X3BvaW50ZXJfYXJyYXlfdmFsaWQoY29uc3QgZW50cnlfcG9pbnRlcl9hcnJheSwKKwkJCQkgICAgICAgY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9lbnRyeV9wb2ludGVyX3ZhbGlkKGNvbnN0IGVudHJ5X3BvaW50ZXIsIHRydWVfdHlwZSwKKwkJCQkgY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9lbnRyeV9wb2ludGVyX3ZhbGlkKGNvbnN0IGVudHJ5X3BvaW50ZXIsIGZhbHNlX3R5cGUsCisJCQkJIGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19IVF9NQVBfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZV9saXN0KGNvbnN0X2VudHJ5X3BvaW50ZXIpIGNvbnN0OworI2VuZGlmCisKKyAgICBwcml2YXRlOgorI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIGZyaWVuZCBjbGFzcyBpdGVyYXRvcl87CisjZW5kaWYKKworICAgICAgZnJpZW5kIGNsYXNzIGNvbnN0X2l0ZXJhdG9yXzsKKworICAgICAgc3RhdGljIGVudHJ5X2FsbG9jYXRvciAJCXNfZW50cnlfYWxsb2NhdG9yOworICAgICAgc3RhdGljIGVudHJ5X3BvaW50ZXJfYWxsb2NhdG9yIAlzX2VudHJ5X3BvaW50ZXJfYWxsb2NhdG9yOworICAgICAgc3RhdGljIGl0ZXJhdG9yIAkJCXNfZW5kX2l0OworICAgICAgc3RhdGljIGNvbnN0X2l0ZXJhdG9yIAkJc19jb25zdF9lbmRfaXQ7CisgICAgICBzdGF0aWMgcG9pbnRfaXRlcmF0b3IgCQlzX2ZpbmRfZW5kX2l0OworICAgICAgc3RhdGljIHBvaW50X2NvbnN0X2l0ZXJhdG9yIAlzX2NvbnN0X2ZpbmRfZW5kX2l0OworCisgICAgICBzaXplX3R5cGUgCQkJbV9udW1fZTsKKyAgICAgIHNpemVfdHlwZSAJCQltX251bV91c2VkX2U7CisgICAgICBlbnRyeV9wb2ludGVyX2FycmF5IAkJbV9lbnRyaWVzOworCisgICAgICBlbnVtCisJeworCSAgc3RvcmVfaGFzaF9vayA9ICFTdG9yZV9IYXNoCisJCQkgIHx8ICFpc19zYW1lPEhhc2hfRm4sIF9fZ251X3BiZHM6Om51bGxfdHlwZT46OnZhbHVlCisJfTsKKworICAgICAgUEJfRFNfU1RBVElDX0FTU0VSVChzdGgsIHN0b3JlX2hhc2hfb2spOworICAgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VudHJ5X2xpc3RfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZmluZF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vc2l6ZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vdHJhY2VfZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfSEFTSF9FUV9GTl9DX0RFQworI3VuZGVmIFBCX0RTX1JBTkdFRF9IQVNIX0ZOX0NfREVDCisjdW5kZWYgUEJfRFNfQ0NfSEFTSF9UUkFJVFNfQkFTRQorI3VuZGVmIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDCisjdW5kZWYgUEJfRFNfQ0NfSEFTSF9OQU1FCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jbXBfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NtcF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZThhMjM4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jbXBfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw4MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vY21wX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGVudGlyZSBjb250YWluZXIgY29tcGFyaXNvbiByZWxhdGVkCisgKiAgICBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyX0hUX01hcF9UeXBlPgorYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3BlcmF0b3I9PShjb25zdCBPdGhlcl9IVF9NYXBfVHlwZSYgb3RoZXIpIGNvbnN0Cit7IHJldHVybiBjbXBfd2l0aF9vdGhlcihvdGhlcik7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyX01hcF9UeXBlPgorYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY21wX3dpdGhfb3RoZXIoY29uc3QgT3RoZXJfTWFwX1R5cGUmIG90aGVyKSBjb25zdAoreworICBpZiAoc2l6ZSgpICE9IG90aGVyLnNpemUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yICh0eXBlbmFtZSBPdGhlcl9NYXBfVHlwZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBvdGhlci5iZWdpbigpOworICAgICAgIGl0ICE9IG90aGVyLmVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgIGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkgPSBrZXlfY29uc3RfcmVmZXJlbmNlKFBCX0RTX1YyRigqaXQpKTsKKworICAgICAgbWFwcGVkX2NvbnN0X3BvaW50ZXIgcF9tYXBwZWRfdmFsdWUgPQorCWNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMmID4oKnRoaXMpLgorCWZpbmRfa2V5X3BvaW50ZXIocl9rZXksIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7CisKKyAgICAgIGlmIChwX21hcHBlZF92YWx1ZSA9PSAwKQorCXJldHVybiBmYWxzZTsKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIGlmIChwX21hcHBlZF92YWx1ZS0+c2Vjb25kICE9IGl0LT5zZWNvbmQpCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyX0hUX01hcF9UeXBlPgorYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3BlcmF0b3IhPShjb25zdCBPdGhlcl9IVF9NYXBfVHlwZSYgb3RoZXIpIGNvbnN0Cit7IHJldHVybiAhb3BlcmF0b3I9PShvdGhlcik7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY29uZF9rZXlfZHRvcl9lbnRyeV9kZWFsdG9yLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY29uZF9rZXlfZHRvcl9lbnRyeV9kZWFsdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWNmOTEwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jb25kX2tleV9kdG9yX2VudHJ5X2RlYWx0b3IuaHBwCkBAIC0wLDAgKzEsOTAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL2NvbmRfa2V5X2R0b3JfZW50cnlfZGVhbHRvci5ocHAKKyAqIENvbnRhaW5zIGEgY29uZGl0aW9uYWwga2V5IGRlc3RydWN0b3IsIHVzZWQgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAqLworCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gQ29uZGl0aW9uYWwgZGV5IGRlc3RydWN0b3IsIGNjX2hhc2guCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSFRfTWFwPgorICAgIGNsYXNzIGNvbmRfZGVhbHRvcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEhUX01hcDo6ZW50cnkgCQllbnRyeTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgSFRfTWFwOjplbnRyeV9hbGxvY2F0b3IgCWVudHJ5X2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgSFRfTWFwOjprZXlfdHlwZSAJa2V5X3R5cGU7CisKKyAgICAgIGNvbmRfZGVhbHRvcihlbnRyeV9hbGxvY2F0b3IqIHBfYSwgZW50cnkqIHBfZSkKKyAgICAgIDogbV9wX2EocF9hKSwgbV9wX2UocF9lKSwgbV9rZXlfZGVzdHJ1Y3QoZmFsc2UpLAorCW1fbm9fYWN0aW9uX2Rlc3RydWN0b3IoZmFsc2UpCisgICAgICB7IH0KKworICAgICAgaW5saW5lCisgICAgICB+Y29uZF9kZWFsdG9yKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHNldF9rZXlfZGVzdHJ1Y3QoKQorICAgICAgeyBtX2tleV9kZXN0cnVjdCA9IHRydWU7IH0KKworICAgICAgdm9pZAorICAgICAgc2V0X25vX2FjdGlvbl9kZXN0cnVjdG9yKCkKKyAgICAgIHsgbV9ub19hY3Rpb25fZGVzdHJ1Y3RvciA9IHRydWU7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIGVudHJ5X2FsbG9jYXRvciogY29uc3QgCQkJbV9wX2E7CisgICAgICBlbnRyeSogY29uc3QgCQkJCW1fcF9lOworCisgICAgICBib29sIAkJCQkJbV9rZXlfZGVzdHJ1Y3Q7CisgICAgICBib29sIAkJCQkJbV9ub19hY3Rpb25fZGVzdHJ1Y3RvcjsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSFRfTWFwPgorICAgIGlubGluZQorICAgIGNvbmRfZGVhbHRvcjxIVF9NYXA+OjoKKyAgICB+Y29uZF9kZWFsdG9yKCkKKyAgICB7CisgICAgICBpZiAobV9ub19hY3Rpb25fZGVzdHJ1Y3RvcikKKwlyZXR1cm47CisgICAgICBpZiAobV9rZXlfZGVzdHJ1Y3QpCisJbV9wX2UtPm1fdmFsdWUuZmlyc3QufmtleV90eXBlKCk7CisgICAgICBtX3BfYS0+ZGVhbGxvY2F0ZShtX3BfZSwgMSk7CisgICAgfQorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTJlMzEwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTkxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvciwKKyAqIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmVudHJ5X2FsbG9jYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfZW50cnlfYWxsb2NhdG9yOworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmVudHJ5X3BvaW50ZXJfYWxsb2NhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c19lbnRyeV9wb2ludGVyX2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICB3aGlsZSAoZmlyc3RfaXQgIT0gbGFzdF9pdCkKKyAgICBpbnNlcnQoKihmaXJzdF9pdCsrKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DQ19IQVNIX05BTUUoKSA6CisgIHJhbmdlZF9oYXNoX2ZuX2Jhc2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwKKyAgbV9udW1fZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpLCBtX251bV91c2VkX2UoMCksCisgIG1fZW50cmllcyhzX2VudHJ5X3BvaW50ZXJfYWxsb2NhdG9yLmFsbG9jYXRlKG1fbnVtX2UpKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfQ0NfSEFTSF9OQU1FKGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbikgOgorICByYW5nZWRfaGFzaF9mbl9iYXNlKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSwgcl9oYXNoX2ZuKSwKKyAgbV9udW1fZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpLCBtX251bV91c2VkX2UoMCksCisgIG1fZW50cmllcyhzX2VudHJ5X3BvaW50ZXJfYWxsb2NhdG9yLmFsbG9jYXRlKG1fbnVtX2UpKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfQ0NfSEFTSF9OQU1FKGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbiwgY29uc3QgRXFfRm4mIHJfZXFfZm4pIDoKKyAgUEJfRFNfSEFTSF9FUV9GTl9DX0RFQyhyX2VxX2ZuKSwKKyAgcmFuZ2VkX2hhc2hfZm5fYmFzZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSksIHJfaGFzaF9mbiksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9wb2ludGVyX2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgc3RkOjpmaWxsKG1fZW50cmllcywgbV9lbnRyaWVzICsgbV9udW1fZSwgKGVudHJ5X3BvaW50ZXIpMCk7CisgIFJlc2l6ZV9Qb2xpY3k6Om5vdGlmeV9jbGVhcmVkKCk7CisgIHJhbmdlZF9oYXNoX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKG1fbnVtX2UpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NDX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIGNvbnN0IEVxX0ZuJiByX2VxX2ZuLCAKKwkJICAgY29uc3QgQ29tYl9IYXNoX0ZuJiByX2NvbWJfaGFzaF9mbikgOgorICBQQl9EU19IQVNIX0VRX0ZOX0NfREVDKHJfZXFfZm4pLAorICByYW5nZWRfaGFzaF9mbl9iYXNlKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSwKKwkJICAgICAgcl9oYXNoX2ZuLCByX2NvbWJfaGFzaF9mbiksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9wb2ludGVyX2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NDX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIGNvbnN0IEVxX0ZuJiByX2VxX2ZuLCAKKwkJICAgY29uc3QgQ29tYl9IYXNoX0ZuJiByX2NvbWJfaGFzaF9mbiwgCisJCSAgIGNvbnN0IFJlc2l6ZV9Qb2xpY3kmIHJfcmVzaXplX3BvbGljeSkgOgorICBQQl9EU19IQVNIX0VRX0ZOX0NfREVDKHJfZXFfZm4pLAorICBSZXNpemVfUG9saWN5KHJfcmVzaXplX3BvbGljeSksCisgIHJhbmdlZF9oYXNoX2ZuX2Jhc2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpLAorCQkgICAgICByX2hhc2hfZm4sIHJfY29tYl9oYXNoX2ZuKSwKKyAgbV9udW1fZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpLCBtX251bV91c2VkX2UoMCksCisgIG1fZW50cmllcyhzX2VudHJ5X3BvaW50ZXJfYWxsb2NhdG9yLmFsbG9jYXRlKG1fbnVtX2UpKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfQ0NfSEFTSF9OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgOgorICBQQl9EU19IQVNIX0VRX0ZOX0NfREVDKG90aGVyKSwKKyAgcmVzaXplX2Jhc2Uob3RoZXIpLCByYW5nZWRfaGFzaF9mbl9iYXNlKG90aGVyKSwKKyAgbV9udW1fZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpLCBtX251bV91c2VkX2UoMCksCisgIG1fZW50cmllcyhzX2VudHJ5X3BvaW50ZXJfYWxsb2NhdG9yLmFsbG9jYXRlKG1fbnVtX2UpKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgIF9fdHJ5CisgICAgICB7CisJY29weV9mcm9tX3JhbmdlKG90aGVyLmJlZ2luKCksIG90aGVyLmVuZCgpKTsKKyAgICAgIH0KKyAgICBfX2NhdGNoKC4uLikKKyAgICAgIHsKKwlkZWFsbG9jYXRlX2FsbCgpOworCV9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgfQorICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK35QQl9EU19DQ19IQVNIX05BTUUoKQoreyBkZWFsbG9jYXRlX2FsbCgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKworICBzdGQ6OnN3YXAobV9lbnRyaWVzLCBvdGhlci5tX2VudHJpZXMpOworICBzdGQ6OnN3YXAobV9udW1fZSwgb3RoZXIubV9udW1fZSk7CisgIHN0ZDo6c3dhcChtX251bV91c2VkX2UsIG90aGVyLm1fbnVtX3VzZWRfZSk7CisgIHJhbmdlZF9oYXNoX2ZuX2Jhc2U6OnN3YXAob3RoZXIpOworICBoYXNoX2VxX2ZuX2Jhc2U6OnN3YXAob3RoZXIpOworICByZXNpemVfYmFzZTo6c3dhcChvdGhlcik7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpzd2FwKG90aGVyKSk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitkZWFsbG9jYXRlX2FsbCgpCit7CisgIGNsZWFyKCk7CisgIHNfZW50cnlfcG9pbnRlcl9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX2VudHJpZXMsIG1fbnVtX2UpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdGlhbGl6ZSgpCit7CisgIHN0ZDo6ZmlsbChtX2VudHJpZXMsIG1fZW50cmllcyArIG1fbnVtX2UsIGVudHJ5X3BvaW50ZXIoMCkpOworICBSZXNpemVfUG9saWN5Ojpub3RpZnlfcmVzaXplZChtX251bV9lKTsKKyAgUmVzaXplX1BvbGljeTo6bm90aWZ5X2NsZWFyZWQoKTsKKyAgcmFuZ2VkX2hhc2hfZm5fYmFzZTo6bm90aWZ5X3Jlc2l6ZWQobV9udW1fZSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZGE0NDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgY29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLAorICogICAgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29uc3RydWN0b3JfaW5zZXJ0X25ld19pbXAobWFwcGVkX2NvbnN0X3JlZmVyZW5jZSByX3ZhbCwgc2l6ZV90eXBlIHBvcywgCisJCQkgICBmYWxzZV90eXBlKQoreworICAvLyBGb2xsb3dpbmcgbGluZXMgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uLgorICBlbnRyeV9wb2ludGVyIHAgPSBnZXRfZW50cnkocl92YWwsIHRyYWl0c19iYXNlOjpzX25vX3Rocm93X2NvcGllc19pbmRpY2F0b3IpOworCisgIC8vIEF0IHRoaXMgcG9pbnQgbm8gZXhjZXB0aW9ucyBjYW4gYmUgdGhyb3duLgorICBwLT5tX3BfbmV4dCA9IG1fZW50cmllc1twb3NdOworICBtX2VudHJpZXNbcG9zXSA9IHA7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhyX2tleSk7KQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjU1ODExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvciwKKyAqIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvbnN0cnVjdG9yX2luc2VydF9uZXdfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgc2l6ZV90eXBlIHBvcywgdHJ1ZV90eXBlKQoreworICAvLyBGb2xsb3dpbmcgbGluZXMgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uLgorICBlbnRyeV9wb2ludGVyIHAgPSBnZXRfZW50cnkocl92YWwsIHRyYWl0c19iYXNlOjpzX25vX3Rocm93X2NvcGllc19pbmRpY2F0b3IpOworCisgIC8vIEF0IHRoaXMgcG9pbnQgbm8gZXhjZXB0aW9ucyBjYW4gYmUgdGhyb3duLgorICBwLT5tX3BfbmV4dCA9IG1fZW50cmllc1twb3NdOworICBwLT5tX2hhc2ggPSByYW5nZWRfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKChrZXlfY29uc3RfcmVmZXJlbmNlKShQQl9EU19WMkYocC0+bV92YWx1ZSkpKS5zZWNvbmQ7CisKKyAgbV9lbnRyaWVzW3Bvc10gPSBwOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcocl9rZXkpOykKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZGVidWdfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZmJiOWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNzYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGRlYnVnLW1vZGUgZnVuY3Rpb25zLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgZGVidWdfYmFzZTo6Y2hlY2tfc2l6ZShtX251bV91c2VkX2UsIF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X2VudHJ5X3BvaW50ZXJfYXJyYXlfdmFsaWQobV9lbnRyaWVzLCBfX2ZpbGUsIF9fbGluZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfZW50cnlfcG9pbnRlcl9hcnJheV92YWxpZChjb25zdCBlbnRyeV9wb2ludGVyX2FycmF5IGFfcF9lbnRyaWVzLAorCQkJCSBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIHNpemVfdHlwZSBpdGVyYXRlZF9udW1fdXNlZF9lID0gMDsKKyAgZm9yIChzaXplX3R5cGUgcG9zID0gMDsgcG9zIDwgbV9udW1fZTsgKytwb3MpCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX2UgPSBhX3BfZW50cmllc1twb3NdOworICAgICAgd2hpbGUgKHBfZSAhPSAwKQorICAgICAgICB7CisJICArK2l0ZXJhdGVkX251bV91c2VkX2U7CisJICBhc3NlcnRfZW50cnlfcG9pbnRlcl92YWxpZChwX2UsIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvciwKKwkJCQkgICAgIF9fZmlsZSwgX19saW5lKTsKKwkgIHBfZSA9IHBfZS0+bV9wX25leHQ7CisgICAgICAgIH0KKyAgICB9CisgIFBCX0RTX0RFQlVHX1ZFUklGWShpdGVyYXRlZF9udW1fdXNlZF9lID09IG1fbnVtX3VzZWRfZSk7Cit9CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHA+CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZGVidWdfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZGVidWdfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzc0YmMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgZGVidWctbW9kZSBmdW5jdGlvbnMuCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfZW50cnlfcG9pbnRlcl92YWxpZChjb25zdCBlbnRyeV9wb2ludGVyIHAsIGZhbHNlX3R5cGUsCisJCQkgICBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7IGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMoUEJfRFNfVjJGKHAtPm1fdmFsdWUpLCBfX2ZpbGUsIF9fbGluZSk7IH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyMWQ2OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZGVidWdfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGRlYnVnLW1vZGUgZnVuY3Rpb25zLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2VudHJ5X3BvaW50ZXJfdmFsaWQoY29uc3QgZW50cnlfcG9pbnRlciBwX2UsIHRydWVfdHlwZSwKKwkJCSAgIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgX19maWxlLCBfX2xpbmUpOworICBjb21wX2hhc2ggcG9zX2hhc2hfcGFpciA9IHJhbmdlZF9oYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSkpOworICBQQl9EU19ERUJVR19WRVJJRlkocF9lLT5tX2hhc2ggPT0gcG9zX2hhc2hfcGFpci5zZWNvbmQpOworfQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VudHJ5X2xpc3RfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VudHJ5X2xpc3RfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5ODNiOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZW50cnlfbGlzdF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDkxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9lbnRyeV9saXN0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGVudHJ5LWxpc3QgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2RlYWxsb2NhdGVfbGlua3NfaW5fbGlzdChlbnRyeV9wb2ludGVyIHBfZSkKK3sKKyAgd2hpbGUgKHBfZSAhPSAwKQorICAgIHsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9kZWFsbG9jX2UgPSBwX2U7CisgICAgICBwX2UgPSBwX2UtPm1fcF9uZXh0OworICAgICAgc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX2RlYWxsb2NfZSwgMSk7CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplbnRyeV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfZW50cnkoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCB0cnVlX3R5cGUpCit7CisgIC8vIEZvbGxvd2luZyBsaW5lIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgZW50cnlfcG9pbnRlciBwX2UgPSBzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKworICAvLyBGb2xsb3dpbmcgbGluZXMqIGNhbm5vdCogdGhyb3cgYW4gZXhjZXB0aW9uLgorICBuZXcgKCZwX2UtPm1fdmFsdWUpIHZhbHVlX3R5cGUocl92YWwpOworICByZXR1cm4gcF9lOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplbnRyeV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfZW50cnkoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCBmYWxzZV90eXBlKQoreworICAvLyBGb2xsb3dpbmcgbGluZSBtaWdodCB0aHJvdyBhbiBleGNlcHRpb24uCisgIGVudHJ5X3BvaW50ZXIgcF9lID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisgIGNvbmRfZGVhbHRvcl90IGNvbmQocF9lKTsKKworICAvLyBGb2xsb3dpbmcgbGluZXMgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uLgorICBuZXcgKCZwX2UtPm1fdmFsdWUpIHZhbHVlX3R5cGUocl92YWwpOworICBjb25kLnNldF9ub19hY3Rpb24oKTsKKyAgcmV0dXJuIHBfZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZWxzX2VudHJ5KGVudHJ5X3BvaW50ZXIgcF9lKQoreworICAvLyBUaGUgZm9sbG93aW5nIGxpbmVzIGNhbm5vdCB0aHJvdyBleGNlcHRpb25zICh1bmxlc3MgaWYga2V5LWRhdGEgZHRvcnMgZG8pLgorICBwX2UtPm1fdmFsdWUufnZhbHVlX3R5cGUoKTsKKyAgc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX2UsIDEpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjY3ZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEwMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgZXJhc2UgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9lbnRyeV9wb2ludGVyKGVudHJ5X3BvaW50ZXImIHJfcF9lKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmVyYXNlX2V4aXN0aW5nKFBCX0RTX1YyRihyX3BfZS0+bV92YWx1ZSkpKTsKKworICBlbnRyeV9wb2ludGVyIHBfZSA9IHJfcF9lOworICByX3BfZSA9IHJfcF9lLT5tX3BfbmV4dDsKKyAgcmVsc19lbnRyeShwX2UpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9udW1fdXNlZF9lID4gMCk7CisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2VkKC0tbV9udW1fdXNlZF9lKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaWYoUHJlZCBwcmVkKQoreworICBzaXplX3R5cGUgbnVtX2Vyc2QgPSAwOworICBmb3IgKHNpemVfdHlwZSBwb3MgPSAwOyBwb3MgPCBtX251bV9lOyArK3BvcykKKyAgICB7CisgICAgICB3aGlsZSAobV9lbnRyaWVzW3Bvc10gIT0gMCAmJiBwcmVkKG1fZW50cmllc1twb3NdLT5tX3ZhbHVlKSkKKyAgICAgICAgeworCSAgKytudW1fZXJzZDsKKwkgIGVudHJ5X3BvaW50ZXIgcF9uZXh0X2UgPSBtX2VudHJpZXNbcG9zXS0+bV9wX25leHQ7CisJICBlcmFzZV9lbnRyeV9wb2ludGVyKG1fZW50cmllc1twb3NdKTsKKwkgIG1fZW50cmllc1twb3NdID0gcF9uZXh0X2U7CisgICAgICAgIH0KKworICAgICAgZW50cnlfcG9pbnRlciBwX2UgPSBtX2VudHJpZXNbcG9zXTsKKyAgICAgIHdoaWxlIChwX2UgIT0gMCAmJiBwX2UtPm1fcF9uZXh0ICE9IDApCisgICAgICAgIHsKKwkgIGlmIChwcmVkKHBfZS0+bV9wX25leHQtPm1fdmFsdWUpKQorICAgICAgICAgICAgeworCSAgICAgICsrbnVtX2Vyc2Q7CisJICAgICAgZXJhc2VfZW50cnlfcG9pbnRlcihwX2UtPm1fcF9uZXh0KTsKKyAgICAgICAgICAgIH0KKwkgIGVsc2UKKwkgICAgcF9lID0gcF9lLT5tX3BfbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICBkb19yZXNpemVfaWZfbmVlZGVkX25vX3Rocm93KCk7CisgIHJldHVybiBudW1fZXJzZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyKCkKK3sKKyAgZm9yIChzaXplX3R5cGUgcG9zID0gMDsgcG9zIDwgbV9udW1fZTsgKytwb3MpCisgICAgd2hpbGUgKG1fZW50cmllc1twb3NdICE9IDApCisgICAgICBlcmFzZV9lbnRyeV9wb2ludGVyKG1fZW50cmllc1twb3NdKTsKKyAgZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpOworICByZXNpemVfYmFzZTo6bm90aWZ5X2NsZWFyZWQoKTsKK30KKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZXJhc2Vfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NjEwMjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgZXJhc2UgcmVsYXRlZCBmdW5jdGlvbnMsCisgKiB3aGVuIHRoZSBoYXNoIHZhbHVlIGlzIG5vdCBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIGVyYXNlX2luX3Bvc19pbXAocl9rZXksIHJhbmdlZF9oYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pbl9wb3NfaW1wKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIHNpemVfdHlwZSBwb3MpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBlbnRyeV9wb2ludGVyIHBfZSA9IG1fZW50cmllc1twb3NdOworICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9zdGFydCgpOworICBpZiAocF9lID09IDApCisgICAgeworICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisgICAgICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgcl9rZXkpKQorICAgIHsKKyAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhyX2tleSkKKyAgICAgIGVyYXNlX2VudHJ5X3BvaW50ZXIobV9lbnRyaWVzW3Bvc10pOworICAgICAgZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX25leHRfZSA9IHBfZS0+bV9wX25leHQ7CisgICAgICBpZiAocF9uZXh0X2UgPT0gMCkKKwl7CisJICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKwkgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKwkgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9uZXh0X2UtPm1fdmFsdWUpLCByX2tleSkpCisJeworCSAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisJICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorCSAgZXJhc2VfZW50cnlfcG9pbnRlcihwX2UtPm1fcF9uZXh0KTsKKwkgIGRvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKTsKKwkgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7CisgICAgICBwX2UgPSBwX25leHRfZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlNWI1MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZXJhc2Vfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDk0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGVyYXNlIHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pbl9wb3NfaW1wKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIGNvbnN0IGNvbXBfaGFzaCYgcl9wb3NfaGFzaF9wYWlyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgZW50cnlfcG9pbnRlciBwX2UgPSBtX2VudHJpZXNbcl9wb3NfaGFzaF9wYWlyLmZpcnN0XTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKTsKKyAgaWYgKHBfZSA9PSAwKQorICAgIHsKKyAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChoYXNoX2VxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSksIHBfZS0+bV9oYXNoLAorCQkJCSAgcl9rZXksIHJfcG9zX2hhc2hfcGFpci5zZWNvbmQpKQorICAgIHsKKyAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhyX2tleSkKKyAgICAgIGVyYXNlX2VudHJ5X3BvaW50ZXIobV9lbnRyaWVzW3JfcG9zX2hhc2hfcGFpci5maXJzdF0pOworICAgICAgZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX25leHRfZSA9IHBfZS0+bV9wX25leHQ7CisgICAgICBpZiAocF9uZXh0X2UgPT0gMCkKKwl7CisJICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKwkgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKwkgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9uZXh0X2UtPm1fdmFsdWUpLAorCQkJCSAgICAgIHBfbmV4dF9lLT5tX2hhc2gsIHJfa2V5LAorCQkJCSAgICAgIHJfcG9zX2hhc2hfcGFpci5zZWNvbmQpKQorCXsKKwkgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworCSAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhyX2tleSkKKwkgIGVyYXNlX2VudHJ5X3BvaW50ZXIocF9lLT5tX3BfbmV4dCk7CisJICBkb19yZXNpemVfaWZfbmVlZGVkX25vX3Rocm93KCk7CisJICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2NvbGxpc2lvbigpOworICAgICAgcF9lID0gcF9uZXh0X2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZWM5YjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBmaW5kIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gZmluZF9rZXlfcG9pbnRlcihyX2tleSwgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDJiA+KCp0aGlzKS5maW5kX2tleV9wb2ludGVyKHJfa2V5LCAKKwkJCQkJdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfZW5kKCkKK3sgcmV0dXJuIDA7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfZW5kKCkgY29uc3QKK3sgcmV0dXJuIDA7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9maW5kX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2ZpbmRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWM0YTVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9maW5kX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw0MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vZmluZF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGZpbmQgcmVsYXRlZCBmdW5jdGlvbnMsCisgKiB3aGVuIHRoZSBoYXNoIHZhbHVlIGlzIHN0b3JlZC4KKyAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2luZm9fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxMjU4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5mb19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEwMCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vaW5mb19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBlbnRpcmUgY29udGFpbmVyIGluZm8gcmVsYXRlZAorICogZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2l6ZSgpIGNvbnN0Cit7IHJldHVybiBtX251bV91c2VkX2U7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CittYXhfc2l6ZSgpIGNvbnN0Cit7IHJldHVybiBtX2VudHJ5X2FsbG9jYXRvci5tYXhfc2l6ZSgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW1wdHkoKSBjb25zdAoreyByZXR1cm4gKHNpemUoKSA9PSAwKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJfSFRfTWFwX1R5cGU+Citib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitvcGVyYXRvcj09KGNvbnN0IE90aGVyX0hUX01hcF9UeXBlJiBvdGhlcikgY29uc3QKK3sgcmV0dXJuIGNtcF93aXRoX290aGVyKG90aGVyKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJfTWFwX1R5cGU+Citib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitjbXBfd2l0aF9vdGhlcihjb25zdCBPdGhlcl9NYXBfVHlwZSYgb3RoZXIpIGNvbnN0Cit7CisgIGlmIChzaXplKCkgIT0gb3RoZXIuc2l6ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKHR5cGVuYW1lIE90aGVyX01hcF9UeXBlOjpjb25zdF9pdGVyYXRvciBpdCA9IG90aGVyLmJlZ2luKCk7CisgICAgICAgaXQgIT0gb3RoZXIuZW5kKCk7ICsraXQpCisgICAgeworICAgICAga2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSA9KGtleV9jb25zdF9yZWZlcmVuY2UpUEJfRFNfVjJGKCppdCk7CisgICAgICBtYXBwZWRfY29uc3RfcG9pbnRlciBwX21hcHBlZF92YWx1ZSA9CisJY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyYgPigqdGhpcykuCisJZmluZF9rZXlfcG9pbnRlcihyX2tleSwgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKKworICAgICAgaWYgKHBfbWFwcGVkX3ZhbHVlID09IDApCisJcmV0dXJuIGZhbHNlOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgaWYgKHBfbWFwcGVkX3ZhbHVlLT5zZWNvbmQgIT0gaXQtPnNlY29uZCkKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYgCisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyX0hUX01hcF9UeXBlPgorYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3BlcmF0b3IhPShjb25zdCBPdGhlcl9IVF9NYXBfVHlwZSYgb3RoZXIpIGNvbnN0Cit7IHJldHVybiAhb3BlcmF0b3I9PShvdGhlcik7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2NjgxNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNDMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBpbnNlcnQgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2luc2VydF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2luc2VydF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2luc2VydF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTZkMDNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDcwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBpbnNlcnQgcmVsYXRlZCBmdW5jdGlvbnMsCisgKiB3aGVuIHRoZSBoYXNoIHZhbHVlIGlzIG5vdCBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBzdGQ6OnBhaXI8dHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yLCBib29sPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2ltcChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIGZhbHNlX3R5cGUpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5ID0gUEJfRFNfVjJGKHJfdmFsKTsKKyAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IHJhbmdlZF9oYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworICBlbnRyeV9wb2ludGVyIHBfZSA9IG1fZW50cmllc1twb3NdOworICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKworICB3aGlsZSAocF9lICE9IDAgJiYgIWhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgCisJCQkJCQkgICAgIHJfa2V5KSkKKyAgICB7CisgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7CisgICAgICBwX2UgPSBwX2UtPm1fcF9uZXh0OworICAgIH0KKworICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisgIGlmIChwX2UgIT0gMCkKKyAgICB7CisgICAgICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCZwX2UtPm1fdmFsdWUsIGZhbHNlKTsKKyAgICB9CisKKyAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaW5zZXJ0X25ld19pbXAocl92YWwsIHBvcyksIHRydWUpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2luc2VydF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDU2NTliCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDcxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBpbnNlcnQgcmVsYXRlZCBmdW5jdGlvbnMsCisgKiB3aGVuIHRoZSBoYXNoIHZhbHVlIGlzIHN0b3JlZC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHN0ZDo6cGFpcjx0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IsIGJvb2w+CitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnRfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgdHJ1ZV90eXBlKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAga2V5X2NvbnN0X3JlZmVyZW5jZSBrZXkgPSBQQl9EU19WMkYocl92YWwpOworICBjb21wX2hhc2ggcG9zX2hhc2hfcGFpciA9IHJhbmdlZF9oYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoa2V5KTsKKyAgZW50cnlfcG9pbnRlciBwX2UgPSBtX2VudHJpZXNbcG9zX2hhc2hfcGFpci5maXJzdF07CisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpOworCisgIHdoaWxlIChwX2UgIT0gMCAmJiAhaGFzaF9lcV9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpLAorCQkJCQkJICAgICBwX2UtPm1faGFzaCwKKwkJCQkJCSAgICBrZXksIHBvc19oYXNoX3BhaXIuc2Vjb25kKSkKKyAgICB7CisgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7CisgICAgICBwX2UgPSBwX2UtPm1fcF9uZXh0OworICAgIH0KKworICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisgIGlmIChwX2UgIT0gMCkKKyAgICB7CisgICAgICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKGtleSkKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigmcF9lLT5tX3ZhbHVlLCBmYWxzZSk7CisgICAgfQorCisgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChrZXkpCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpbnNlcnRfbmV3X2ltcChyX3ZhbCwgcG9zX2hhc2hfcGFpciksIHRydWUpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNmQxNjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDgzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgaXRlcmF0b3JzIHJlbGF0ZWQgZnVuY3Rpb25zLCBlLmcuLAorICogYmVnaW4oKS4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c19lbmRfaXQ7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX2NvbnN0X2VuZF9pdDsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkKK3sKKyAgcG9pbnRlciBwX3ZhbHVlOworICBzdGQ6OnBhaXI8ZW50cnlfcG9pbnRlciwgc2l6ZV90eXBlPiBwb3M7CisgIGdldF9zdGFydF9pdF9zdGF0ZShwX3ZhbHVlLCBwb3MpOworICByZXR1cm4gaXRlcmF0b3IocF92YWx1ZSwgcG9zLCB0aGlzKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpCit7IHJldHVybiBzX2VuZF9pdDsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKSBjb25zdAoreworICBwb2ludGVyIHBfdmFsdWU7CisgIHN0ZDo6cGFpcjxlbnRyeV9wb2ludGVyLCBzaXplX3R5cGU+IHBvczsKKyAgZ2V0X3N0YXJ0X2l0X3N0YXRlKHBfdmFsdWUsIHBvcyk7CisgIHJldHVybiBjb25zdF9pdGVyYXRvcihwX3ZhbHVlLCBwb3MsIHRoaXMpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkgY29uc3QKK3sgcmV0dXJuIHNfY29uc3RfZW5kX2l0OyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTA1YmEzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsODggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgcG9saWN5IGFjY2VzcworICogICAgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitIYXNoX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9oYXNoX2ZuKCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBIYXNoX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9oYXNoX2ZuKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitFcV9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfZXFfZm4oKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IEVxX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9lcV9mbigpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworQ29tYl9IYXNoX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9jb21iX2hhc2hfZm4oKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IENvbWJfSGFzaF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfY29tYl9oYXNoX2ZuKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitSZXNpemVfUG9saWN5JiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9yZXNpemVfcG9saWN5KCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBSZXNpemVfUG9saWN5JiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9yZXNpemVfcG9saWN5KCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcmVzaXplX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZGZlZjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEzNCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vcmVzaXplX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIHJlc2l6ZSByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2RvX3Jlc2l6ZV9pZl9uZWVkZWQoKQoreworICBpZiAoIXJlc2l6ZV9iYXNlOjppc19yZXNpemVfbmVlZGVkKCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXNpemVfaW1wKHJlc2l6ZV9iYXNlOjpnZXRfbmV3X3NpemUobV9udW1fZSwgbV9udW1fdXNlZF9lKSk7CisgIHJldHVybiB0cnVlOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZG9fcmVzaXplKHNpemVfdHlwZSBsZW4pCit7IHJlc2l6ZV9pbXAocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKGxlbikpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpCit7CisgIGlmICghcmVzaXplX2Jhc2U6OmlzX3Jlc2l6ZV9uZWVkZWQoKSkKKyAgICByZXR1cm47CisKKyAgX190cnkKKyAgICB7CisgICAgICByZXNpemVfaW1wKHJlc2l6ZV9iYXNlOjpnZXRfbmV3X3NpemUobV9udW1fZSwgbV9udW1fdXNlZF9lKSk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7IH0KKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3Jlc2l6ZV9pbXAoc2l6ZV90eXBlIG5ld19zaXplKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgaWYgKG5ld19zaXplID09IG1fbnVtX2UpCisgICAgcmV0dXJuOworCisgIGNvbnN0IHNpemVfdHlwZSBvbGRfc2l6ZSA9IG1fbnVtX2U7CisgIGVudHJ5X3BvaW50ZXJfYXJyYXkgYV9wX2VudHJpZXNfcmVzaXplZDsKKworICAvLyBGb2xsb3dpbmcgbGluZSBtaWdodCB0aHJvdyBhbiBleGNlcHRpb24uCisgIHJhbmdlZF9oYXNoX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKG5ld19zaXplKTsKKworICBfX3RyeQorICAgIHsKKyAgICAgIC8vIEZvbGxvd2luZyBsaW5lIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICAgIGFfcF9lbnRyaWVzX3Jlc2l6ZWQgPSBzX2VudHJ5X3BvaW50ZXJfYWxsb2NhdG9yLmFsbG9jYXRlKG5ld19zaXplKTsKKyAgICAgIG1fbnVtX2UgPSBuZXdfc2l6ZTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIHJhbmdlZF9oYXNoX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKG9sZF9zaXplKTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKworICAvLyBBdCB0aGlzIHBvaW50IG5vIGV4Y2VwdGlvbnMgY2FuIGJlIHRocm93bi4KKyAgcmVzaXplX2ltcF9ub19leGNlcHRpb25zKG5ld19zaXplLCBhX3BfZW50cmllc19yZXNpemVkLCBvbGRfc2l6ZSk7CisgIFJlc2l6ZV9Qb2xpY3k6Om5vdGlmeV9yZXNpemVkKG5ld19zaXplKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZXNpemVfaW1wX25vX2V4Y2VwdGlvbnMoc2l6ZV90eXBlIG5ld19zaXplLCBlbnRyeV9wb2ludGVyX2FycmF5IGFfcF9lbnRyaWVzX3Jlc2l6ZWQsIHNpemVfdHlwZSBvbGRfc2l6ZSkKK3sKKyAgc3RkOjpmaWxsKGFfcF9lbnRyaWVzX3Jlc2l6ZWQsIGFfcF9lbnRyaWVzX3Jlc2l6ZWQgKyBtX251bV9lLAorCSAgICBlbnRyeV9wb2ludGVyKDApKTsKKworICBmb3IgKHNpemVfdHlwZSBwb3MgPSAwOyBwb3MgPCBvbGRfc2l6ZTsgKytwb3MpCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX2UgPSBtX2VudHJpZXNbcG9zXTsKKyAgICAgIHdoaWxlIChwX2UgIT0gMCkKKwlwX2UgPSByZXNpemVfaW1wX25vX2V4Y2VwdGlvbnNfcmVhc3NpZ25fcG9pbnRlcihwX2UsIGFfcF9lbnRyaWVzX3Jlc2l6ZWQsICB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworICAgIH0KKworICBtX251bV9lID0gbmV3X3NpemU7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X2VudHJ5X3BvaW50ZXJfYXJyYXlfdmFsaWQoYV9wX2VudHJpZXNfcmVzaXplZCwKKwkJCQkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pOykKKyAgc19lbnRyeV9wb2ludGVyX2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fZW50cmllcywgb2xkX3NpemUpOworICBtX2VudHJpZXMgPSBhX3BfZW50cmllc19yZXNpemVkOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTk4MmI4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyByZXNpemUgcmVsYXRlZCBmdW5jdGlvbnMsIHdoZW4gdGhlCisgKiBoYXNoIHZhbHVlIGlzIG5vdCBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6ZW50cnlfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplX2ltcF9ub19leGNlcHRpb25zX3JlYXNzaWduX3BvaW50ZXIoZW50cnlfcG9pbnRlciBwX2UsIGVudHJ5X3BvaW50ZXJfYXJyYXkgYV9wX2VudHJpZXNfcmVzaXplZCwgZmFsc2VfdHlwZSkKK3sKKyAgY29uc3Qgc2l6ZV90eXBlIGhhc2hfcG9zID0KKyAgICByYW5nZWRfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpKTsKKworICBlbnRyeV9wb2ludGVyIGNvbnN0IHBfbmV4dF9lID0gcF9lLT5tX3BfbmV4dDsKKyAgcF9lLT5tX3BfbmV4dCA9IGFfcF9lbnRyaWVzX3Jlc2l6ZWRbaGFzaF9wb3NdOworICBhX3BfZW50cmllc19yZXNpemVkW2hhc2hfcG9zXSA9IHBfZTsKKyAgcmV0dXJuIHBfbmV4dF9lOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcmVzaXplX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhZTdkNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcmVzaXplX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vcmVzaXplX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgcmVzaXplIHJlbGF0ZWQgZnVuY3Rpb25zLCB3aGVuIHRoZQorICogaGFzaCB2YWx1ZSBpcyBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6ZW50cnlfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplX2ltcF9ub19leGNlcHRpb25zX3JlYXNzaWduX3BvaW50ZXIoZW50cnlfcG9pbnRlciBwX2UsIGVudHJ5X3BvaW50ZXJfYXJyYXkgYV9wX2VudHJpZXNfcmVzaXplZCwgdHJ1ZV90eXBlKQoreworICBjb25zdCBjb21wX2hhc2ggcG9zX2hhc2hfcGFpciA9CisgICAgcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgcF9lLT5tX2hhc2gpOworCisgIGVudHJ5X3BvaW50ZXIgY29uc3QgcF9uZXh0X2UgPSBwX2UtPm1fcF9uZXh0OworICBwX2UtPm1fcF9uZXh0ID0gYV9wX2VudHJpZXNfcmVzaXplZFtwb3NfaGFzaF9wYWlyLmZpcnN0XTsKKyAgYV9wX2VudHJpZXNfcmVzaXplZFtwb3NfaGFzaF9wYWlyLmZpcnN0XSA9IHBfZTsKKyAgcmV0dXJuIHBfbmV4dF9lOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9zaXplX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9zaXplX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZDdlOGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3NpemVfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vc2l6ZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBlbnRpcmUgY29udGFpbmVyIHNpemUgcmVsYXRlZAorICogZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2l6ZSgpIGNvbnN0Cit7IHJldHVybiBtX251bV91c2VkX2U7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlbXB0eSgpIGNvbnN0Cit7IHJldHVybiAoc2l6ZSgpID09IDApOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWF4X3NpemUoKSBjb25zdAoreyByZXR1cm4gc19lbnRyeV9hbGxvY2F0b3IubWF4X3NpemUoKTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3RyYWNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTIxZTY0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDcyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyB0cmFjZS1tb2RlIGZ1bmN0aW9ucy4KKyAqLworCisjaWZkZWYgUEJfRFNfSFRfTUFQX1RSQUNFXworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordHJhY2UoKSBjb25zdAoreworICBzdGQ6OmNlcnIgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obV9udW1fZSkgPDwgIiAiIAorCSAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihtX251bV91c2VkX2UpIDw8IHN0ZDo6ZW5kbDsKKworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oaSkgPDwgIiAiOworICAgICAgdHJhY2VfbGlzdChtX2VudHJpZXNbaV0pOworICAgICAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZV9saXN0KGNvbnN0X2VudHJ5X3BvaW50ZXIgcF9sKSBjb25zdAoreworICBzaXplX3R5cGUgaXRlcmF0ZWRfbnVtX3VzZWRfZSA9IDA7CisgIHdoaWxlIChwX2wgIT0gMCkKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwgUEJfRFNfVjJGKHBfbC0+bV92YWx1ZSkgPDwgIiAiOworICAgICAgcF9sID0gcF9sLT5tX3BfbmV4dDsKKyAgICB9Cit9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2YzEyNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwCkBAIC0wLDAgKzEsODQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZGV0YWlsL2NvbmRfZGVhbHRvci5ocHAKKyAqIENvbnRhaW5zIGEgY29uZGl0aW9uYWwgZGVhbGxvY2F0b3IuCisgKi8KKworI2lmbmRlZiBQQl9EU19DT05EX0RFQUxUT1JfSFBQCisjZGVmaW5lIFBCX0RTX0NPTkRfREVBTFRPUl9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIENvbmRpdGlvbmFsIGRlYWxsb2NhdGUgY29uc3RydWN0b3IgYXJndW1lbnQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRW50cnksIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIGNsYXNzIGNvbmRfZGVhbHRvcgorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8RW50cnk+CV9fcmViaW5kX2U7CisKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2U6Om90aGVyIAkJZW50cnlfYWxsb2NhdG9yOworCXR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpwb2ludGVyIAllbnRyeV9wb2ludGVyOworCisJY29uZF9kZWFsdG9yKGVudHJ5X3BvaW50ZXIgcF9lKQorCTogbV9wX2UocF9lKSwgbV9ub19hY3Rpb25fZGVzdHJ1Y3RvcihmYWxzZSkgeyB9CisKKwl+Y29uZF9kZWFsdG9yKCkKKwl7CisJICBpZiAobV9ub19hY3Rpb25fZGVzdHJ1Y3RvcikKKwkgICAgcmV0dXJuOworCSAgc19hbGxvYy5kZWFsbG9jYXRlKG1fcF9lLCAxKTsKKwl9CisKKwl2b2lkCisJc2V0X25vX2FjdGlvbigpCisJeyBtX25vX2FjdGlvbl9kZXN0cnVjdG9yID0gdHJ1ZTsgfQorCisgICAgICBwcml2YXRlOgorCWVudHJ5X3BvaW50ZXIgCQltX3BfZTsKKwlib29sIAkJCW1fbm9fYWN0aW9uX2Rlc3RydWN0b3I7CisJc3RhdGljIGVudHJ5X2FsbG9jYXRvciAJc19hbGxvYzsKKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFbnRyeSwgY2xhc3MgX0FsbG9jPgorICAgICAgdHlwZW5hbWUgY29uZF9kZWFsdG9yPEVudHJ5LCBfQWxsb2M+OjplbnRyeV9hbGxvY2F0b3IKKyAgICAgIGNvbmRfZGVhbHRvcjxFbnRyeSwgX0FsbG9jPjo6c19hbGxvYzsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX0NPTkRfREVBTFRPUl9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jb250YWluZXJfYmFzZV9kaXNwYXRjaC5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2guaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjMzYTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2guaHBwCkBAIC0wLDAgKzEsMzUyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoLmhwcAorICogQ29udGFpbnMgYXNzb2NpYXRpdmUgY29udGFpbmVyIGRpc3BhdGNoaW5nLgorICovCisKKyNpZm5kZWYgUEJfRFNfQVNTT0NfQ05UTlJfQkFTRV9EU19ESVNQQVRDSEVSX0hQUAorI2RlZmluZSBQQl9EU19BU1NPQ19DTlROUl9CQVNFX0RTX0RJU1BBVENIRVJfSFBQCisKKyNpbmNsdWRlIDxleHQvdHlwZWxpc3QuaD4KKworI2RlZmluZSBQQl9EU19BU1NFUlRfVkFMSUQoWCkJCQkJCQlcCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoWC5hc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisKKyNkZWZpbmUgUEJfRFNfREVCVUdfVkVSSUZZKF9Db25kKQkJCQkJXAorICBfR0xJQkNYWF9ERUJVR19WRVJJRllfQVQoX0NvbmQsCQkJCQlcCisJCQkgICBfTV9tZXNzYWdlKCNfQ29uZCIgYXNzZXJ0aW9uIGZyb20gJTE7OiUyOyIpCVwKKwkJCSAgIC5fTV9zdHJpbmcoX19GSUxFX18pLl9NX2ludGVnZXIoX19MSU5FX18pCVwKKwkJCSAgICxfX2ZpbGUsX19saW5lKQorCisjZGVmaW5lIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMoX0tleSkJCQkJCVwKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKF9LZXksIF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisjZGVmaW5lIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChfS2V5KQkJCQlcCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KF9LZXksCVwKKwkJCQkJCQkgICBfX0ZJTEVfXywgX19MSU5FX18pOykKKworI2RlZmluZSBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX1YyRihYKSAoWCkuZmlyc3QKKyNkZWZpbmUgUEJfRFNfVjJTKFgpIChYKS5zZWNvbmQKKyNkZWZpbmUgUEJfRFNfRVAyVlAoWCkmICgoWCktPm1fdmFsdWUpCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2x1X21hcF8uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9iaW5fc2VhcmNoX3RyZWVfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9yYl90cmVlXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxheV90cmVlXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vb3ZfdHJlZV9tYXBfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jY19odF9tYXBfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9ncF9odF9tYXBfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9wYXRfdHJpZV8uaHBwPgorI3VuZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyN1bmRlZiBQQl9EU19WMkYKKyN1bmRlZiBQQl9EU19WMlMKKyN1bmRlZiBQQl9EU19FUDJWUAorCisjZGVmaW5lIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX1YyRihYKSAoWCkKKyNkZWZpbmUgUEJfRFNfVjJTKFgpIE1hcHBlZF9EYXRhKCkKKyNkZWZpbmUgUEJfRFNfRVAyVlAoWCkmICgoWCktPm1fdmFsdWUuZmlyc3QpCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2x1X21hcF8uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9iaW5fc2VhcmNoX3RyZWVfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9yYl90cmVlXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxheV90cmVlXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vb3ZfdHJlZV9tYXBfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jY19odF9tYXBfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9ncF9odF9tYXBfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9wYXRfdHJpZV8uaHBwPgorI3VuZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisjdW5kZWYgUEJfRFNfVjJGCisjdW5kZWYgUEJfRFNfVjJTCisjdW5kZWYgUEJfRFNfRVAyVlAKKworI3VuZGVmIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVAorI3VuZGVmIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMKKyN1bmRlZiBQQl9EU19ERUJVR19WRVJJRlkKKyN1bmRlZiBQQl9EU19BU1NFUlRfVkFMSUQKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKK25hbWVzcGFjZSBkZXRhaWwKK3sKKyAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBsaXN0LXVwZGF0ZSBtYXAuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIFBvbGljeV9UbD4KKyAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBNYXBwZWQsIF9BbGxvYywgbGlzdF91cGRhdGVfdGFnLAorCQkJCSAgIFBvbGljeV9UbD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAwPglhdDA7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MDo6dHlwZQkJCSAgICAJYXQwdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAxPiAJYXQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDE6OnR5cGUJCQkgICAgCWF0MXQ7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gRGlzcGF0Y2hlZCB0eXBlLgorICAgICAgdHlwZWRlZiBsdV9tYXA8S2V5LCBNYXBwZWQsIGF0MHQsIF9BbGxvYywgYXQxdD4JdHlwZTsKKyAgICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgbGlzdC11cGRhdGUgc2V0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgUG9saWN5X1RsPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIG51bGxfdHlwZSwgX0FsbG9jLCBsaXN0X3VwZGF0ZV90YWcsCisJCQkJICAgUG9saWN5X1RsPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIGx1X3NldDxLZXksIG51bGxfdHlwZSwgYXQwdCwgX0FsbG9jLCBhdDF0PiB0eXBlOworICAgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBQQVRSSUNJQSB0cmllIG1hcC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgUG9saWN5X1RsPgorICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBNYXBwZWQsIF9BbGxvYywgcGF0X3RyaWVfdGFnLCBQb2xpY3lfVGw+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMT4gCWF0MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQxOjp0eXBlCQkJICAgIAlhdDF0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBwYXRfdHJpZV9tYXA8S2V5LCBNYXBwZWQsIGF0MXQsIF9BbGxvYz4gCQl0eXBlOworICAgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBQQVRSSUNJQSB0cmllIHNldC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIFBvbGljeV9UbD4KKyAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgcGF0X3RyaWVfdGFnLAorCQkJCSAgIFBvbGljeV9UbD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAxPiAJYXQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDE6OnR5cGUJCQkgICAgCWF0MXQ7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gRGlzcGF0Y2hlZCB0eXBlLgorICAgICAgdHlwZWRlZiBwYXRfdHJpZV9zZXQ8S2V5LCBudWxsX3R5cGUsIGF0MXQsIF9BbGxvYz4gdHlwZTsKKyAgICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgUi1CIHRyZWUgbWFwLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBQb2xpY3lfVGw+CisgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgTWFwcGVkLCBfQWxsb2MsIHJiX3RyZWVfdGFnLCBQb2xpY3lfVGw+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMD4JYXQwOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDA6OnR5cGUJCQkgICAgCWF0MHQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMT4gCWF0MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQxOjp0eXBlCQkJICAgIAlhdDF0OworCisgICAgcHVibGljOgorICAgICAgLy8vIERpc3BhdGNoZWQgdHlwZS4KKyAgICAgIHR5cGVkZWYgcmJfdHJlZV9tYXA8S2V5LCBNYXBwZWQsIGF0MHQsIGF0MXQsIF9BbGxvYz4gCXR5cGU7CisgICAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIFItQiB0cmVlIHNldC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIFBvbGljeV9UbD4KKyAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgcmJfdHJlZV90YWcsCisJCQkJICAgUG9saWN5X1RsPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgcmJfdHJlZV9zZXQ8S2V5LCBudWxsX3R5cGUsIGF0MHQsIGF0MXQsIF9BbGxvYz4gdHlwZTsKKyAgICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiBzcGxheSB0cmVlIG1hcC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgUG9saWN5X1RsPgorICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBNYXBwZWQsIF9BbGxvYywgc3BsYXlfdHJlZV90YWcsCisJCQkJICAgUG9saWN5X1RsPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIHNwbGF5X3RyZWVfbWFwPEtleSwgTWFwcGVkLCBhdDB0LCBhdDF0LCBfQWxsb2M+IAl0eXBlOworICAgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uIHNwbGF5IHRyZWUgc2V0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgUG9saWN5X1RsPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIG51bGxfdHlwZSwgX0FsbG9jLCBzcGxheV90cmVlX3RhZywKKwkJCQkgICBQb2xpY3lfVGw+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMD4JYXQwOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDA6OnR5cGUJCQkgICAgCWF0MHQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMT4gCWF0MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQxOjp0eXBlCQkJICAgIAlhdDF0OworCisgICAgcHVibGljOgorICAgICAgLy8vIERpc3BhdGNoZWQgdHlwZS4KKyAgICAgIHR5cGVkZWYgc3BsYXlfdHJlZV9zZXQ8S2V5LCBudWxsX3R5cGUsIGF0MHQsIGF0MXQsIF9BbGxvYz4gdHlwZTsKKyAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBvcmRlcmVkLXZlY3RvciB0cmVlIG1hcC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgUG9saWN5X1RsPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIE1hcHBlZCwgX0FsbG9jLCBvdl90cmVlX3RhZywgUG9saWN5X1RsPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIG92X3RyZWVfbWFwPEtleSwgTWFwcGVkLCBhdDB0LCBhdDF0LCBfQWxsb2M+IAl0eXBlOworICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIG9yZGVyZWQtdmVjdG9yIHRyZWUgc2V0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgUG9saWN5X1RsPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIG51bGxfdHlwZSwgX0FsbG9jLCBvdl90cmVlX3RhZywKKwkJCQkgICBQb2xpY3lfVGw+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMD4JYXQwOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDA6OnR5cGUJCQkgICAgCWF0MHQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMT4gCWF0MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQxOjp0eXBlCQkJICAgIAlhdDF0OworCisgICAgcHVibGljOgorICAgICAgLy8vIERpc3BhdGNoZWQgdHlwZS4KKyAgICAgIHR5cGVkZWYgb3ZfdHJlZV9zZXQ8S2V5LCBudWxsX3R5cGUsIGF0MHQsIGF0MXQsIF9BbGxvYz4gdHlwZTsKKyAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBjb2xpc2lvbi1jaGFpbmluZyBoYXNoIG1hcC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgUG9saWN5X1RsPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIE1hcHBlZCwgX0FsbG9jLCBjY19oYXNoX3RhZywgUG9saWN5X1RsPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAyPglhdDI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0Mjo6dHlwZQkJCSAgICAJYXQydDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAzPglhdDM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0Mzo6dHlwZQkJCQlhdDN0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDQ+IAlhdDQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0NDo6dHlwZQkJCSAgICAJYXQ0dDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIGNjX2h0X21hcDxLZXksIE1hcHBlZCwgYXQwdCwgYXQxdCwgX0FsbG9jLCAKKwkJCWF0M3Q6OnZhbHVlLCBhdDR0LCBhdDJ0PiAJICAgICAgIAl0eXBlOworICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGNvbGlzaW9uLWNoYWluaW5nIGhhc2ggc2V0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgUG9saWN5X1RsPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIG51bGxfdHlwZSwgX0FsbG9jLCBjY19oYXNoX3RhZywKKwkJCQkgICBQb2xpY3lfVGw+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMD4JYXQwOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDA6OnR5cGUJCQkgICAgCWF0MHQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMT4gCWF0MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQxOjp0eXBlCQkJICAgIAlhdDF0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDI+CWF0MjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQyOjp0eXBlCQkJICAgIAlhdDJ0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDM+CWF0MzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQzOjp0eXBlCQkJCWF0M3Q7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgND4gCWF0NDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQ0Ojp0eXBlCQkJICAgIAlhdDR0OworCisgICAgcHVibGljOgorICAgICAgLy8vIERpc3BhdGNoZWQgdHlwZS4KKyAgICAgIHR5cGVkZWYgY2NfaHRfc2V0PEtleSwgbnVsbF90eXBlLCBhdDB0LCBhdDF0LCBfQWxsb2MsCisJCQkJIGF0M3Q6OnZhbHVlLCBhdDR0LCBhdDJ0PiAgICAJdHlwZTsKKyAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBnZW5lcmFsLXByb2JlIGhhc2ggbWFwLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBQb2xpY3lfVGw+CisgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgTWFwcGVkLCBfQWxsb2MsIGdwX2hhc2hfdGFnLCBQb2xpY3lfVGw+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMD4JYXQwOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDA6OnR5cGUJCQkgICAgCWF0MHQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMT4gCWF0MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQxOjp0eXBlCQkJICAgIAlhdDF0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDI+CWF0MjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQyOjp0eXBlCQkJICAgIAlhdDJ0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDM+CWF0MzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQzOjp0eXBlCQkJCWF0M3Q7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgND4gCWF0NDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQ0Ojp0eXBlCQkJICAgIAlhdDR0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDU+IAlhdDU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0NTo6dHlwZQkJCSAgICAJYXQ1dDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIGdwX2h0X21hcDxLZXksIE1hcHBlZCwgYXQwdCwgYXQxdCwgX0FsbG9jLCAKKwkJCWF0M3Q6OnZhbHVlLCBhdDR0LCBhdDV0LCBhdDJ0PiAJCXR5cGU7CisgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZ2VuZXJhbC1wcm9iZSBoYXNoIHNldC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIFBvbGljeV9UbD4KKyAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgZ3BfaGFzaF90YWcsCisJCQkJICAgUG9saWN5X1RsPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAyPglhdDI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0Mjo6dHlwZQkJCSAgICAJYXQydDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAzPglhdDM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0Mzo6dHlwZQkJCQlhdDN0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDQ+IAlhdDQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0NDo6dHlwZQkJCSAgICAJYXQ0dDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCA1PiAJYXQ1OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDU6OnR5cGUJCQkgICAgCWF0NXQ7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gRGlzcGF0Y2hlZCB0eXBlLgorICAgICAgdHlwZWRlZiBncF9odF9zZXQ8S2V5LCBudWxsX3R5cGUsIGF0MHQsIGF0MXQsIF9BbGxvYywKKwkJCWF0M3Q6OnZhbHVlLCBhdDR0LCBhdDV0LCBhdDJ0PgkJdHlwZTsKKyAgfTsKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9kZWJ1Z19tYXBfYmFzZS5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZGVidWdfbWFwX2Jhc2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZjdhYWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZGVidWdfbWFwX2Jhc2UuaHBwCkBAIC0wLDAgKzEsMzQ5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRldGFpbC9kZWJ1Z19tYXBfYmFzZS5ocHAKKyAqIENvbnRhaW5zIGEgZGVidWctbW9kZSBiYXNlIGZvciBhbGwgbWFwcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0RFQlVHX01BUF9CQVNFX0hQUAorI2RlZmluZSBQQl9EU19ERUJVR19NQVBfQkFTRV9IUFAKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxleHQvdGhyb3dfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8gTmVlZCBzdGQ6OnBhaXIgb3N0cmVhbSBleHRyYWN0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgIGlubGluZSBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX291dCwKKwkgICAgICAgY29uc3Qgc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiBwKQorICAgIHsgcmV0dXJuIChfX291dCA8PCAnKCcgPDwgcC5maXJzdCA8PCAnLCcgPDwgcC5zZWNvbmQgPDwgJyknKTsgfQorCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEVxX0ZuLCB0eXBlbmFtZSBDb25zdF9LZXlfUmVmZXJlbmNlPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBkZWJ1Z19tYXBfYmFzZTxLZXksIEVxX0ZuLCBDb25zdF9LZXlfUmVmZXJlbmNlPgorCisgICAgLy8vIERlYnVnIGJhc2UgY2xhc3MuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBFcV9GbiwgdHlwZW5hbWUgQ29uc3RfS2V5X1JlZmVyZW5jZT4KKyAgICBjbGFzcyBkZWJ1Z19tYXBfYmFzZQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBDb25zdF9LZXlfUmVmZXJlbmNlIAkJCWtleV9jb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHN0ZDo6X0dMSUJDWFhfU1REX0M6Omxpc3Q8S2V5PiAJCWtleV9yZXBvc2l0b3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfcmVwb3NpdG9yeTo6c2l6ZV90eXBlICAgICAgIAlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGtleV9yZXBvc2l0b3J5OjppdGVyYXRvcgkgICAgICAgCWl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfcmVwb3NpdG9yeTo6Y29uc3RfaXRlcmF0b3IgIAljb25zdF9pdGVyYXRvcjsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIGRlYnVnX21hcF9iYXNlKCk7CisKKyAgICAgIGRlYnVnX21hcF9iYXNlKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIH5kZWJ1Z19tYXBfYmFzZSgpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgaW5zZXJ0X25ldyhrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGVyYXNlX2V4aXN0aW5nKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgY2hlY2tfa2V5X2V4aXN0cyhrZXlfY29uc3RfcmVmZXJlbmNlLCBjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGNoZWNrX2tleV9kb2VzX25vdF9leGlzdChrZXlfY29uc3RfcmVmZXJlbmNlLCBjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGNoZWNrX3NpemUoc2l6ZV90eXBlLCBjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDbXBfRm4+CisgICAgICB2b2lkCisgICAgICBzcGxpdChrZXlfY29uc3RfcmVmZXJlbmNlLCBDbXBfRm4sIFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIGpvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmLCBib29sIHdpdGhfY2xlYW51cCA9IHRydWUpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgICBrZXlfcmVwb3NpdG9yeSAJbV9rZXlzOworICAgICAgRXFfRm4gCQltX2VxOworICAgIH07CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBkZWJ1Z19tYXBfYmFzZSgpCisgICAgeyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZGVidWdfbWFwX2Jhc2UoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorICAgIDogbV9rZXlzKG90aGVyLm1fa2V5cyksIG1fZXEob3RoZXIubV9lcSkKKyAgICB7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB+ZGVidWdfbWFwX2Jhc2UoKQorICAgIHsgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgaW5zZXJ0X25ldyhrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCisgICAgICBpZiAoZmluZChyX2tleSkgIT0gbV9rZXlzLmVuZCgpKQorCXsKKwkgIHN0ZDo6Y2VyciA8PCAiaW5zZXJ0X25ldyBrZXkgYWxyZWFkeSBwcmVzZW50ICIgPDwgcl9rZXkgPDwgc3RkOjplbmRsOworCSAgc3RkOjphYm9ydCgpOworCX0KKworICAgICAgX190cnkKKwl7CisJICBtX2tleXMucHVzaF9iYWNrKHJfa2V5KTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6OmNlcnIgPDwgImluc2VydF9uZXcgIiA8PCByX2tleSA8PCBzdGQ6OmVuZGw7CisJICBzdGQ6OmFib3J0KCk7CisJfQorCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGVyYXNlX2V4aXN0aW5nKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBpdGVyYXRvciBpdCA9IGZpbmQocl9rZXkpOworICAgICAgaWYgKGl0ID09IG1fa2V5cy5lbmQoKSkKKwl7CisJICBzdGQ6OmNlcnIgPDwgImVyYXNlX2V4aXN0aW5nIiA8PCByX2tleSA8PCBzdGQ6OmVuZGw7CisJICBzdGQ6OmFib3J0KCk7CisJfQorICAgICAgbV9rZXlzLmVyYXNlKGl0KTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBjbGVhcigpCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBtX2tleXMuY2xlYXIoKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgY2hlY2tfa2V5X2V4aXN0cyhrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LAorCQkgICAgIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKKyAgICB7CisgICAgICBhc3NlcnRfdmFsaWQoX19maWxlLCBfX2xpbmUpOworICAgICAgaWYgKGZpbmQocl9rZXkpID09IG1fa2V5cy5lbmQoKSkKKwl7CisJICBzdGQ6OmNlcnIgPDwgX19maWxlIDw8ICc6JyA8PCBfX2xpbmUgPDwgIjogY2hlY2tfa2V5X2V4aXN0cyAiCisJCSAgICA8PCByX2tleSA8PCBzdGQ6OmVuZGw7CisJICBzdGQ6OmFib3J0KCk7CisJfQorICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgY2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksCisJCQkgICAgIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKKyAgICB7CisgICAgICBhc3NlcnRfdmFsaWQoX19maWxlLCBfX2xpbmUpOworICAgICAgaWYgKGZpbmQocl9rZXkpICE9IG1fa2V5cy5lbmQoKSkKKwl7CisJICB1c2luZyBzdGQ6OmNlcnI7CisJICB1c2luZyBzdGQ6OmVuZGw7CisJICBjZXJyIDw8IF9fZmlsZSA8PCAnOicgPDwgX19saW5lIDw8ICI6IGNoZWNrX2tleV9kb2VzX25vdF9leGlzdCAiCisJICAgICAgIDw8IHJfa2V5IDw8IGVuZGw7CisJICBzdGQ6OmFib3J0KCk7CisJfQorICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgY2hlY2tfc2l6ZShzaXplX3R5cGUgc2l6ZSwgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAorICAgIHsKKyAgICAgIGFzc2VydF92YWxpZChfX2ZpbGUsIF9fbGluZSk7CisgICAgICBjb25zdCBzaXplX3R5cGUga2V5c19zaXplID0gbV9rZXlzLnNpemUoKTsKKyAgICAgIGlmIChzaXplICE9IGtleXNfc2l6ZSkKKwl7CisJICBzdGQ6OmNlcnIgPDwgX19maWxlIDw8ICc6JyA8PCBfX2xpbmUgPDwgIjogY2hlY2tfc2l6ZSAiCisJCSAgICA8PCBzaXplIDw8ICIgIT0gIiA8PCBrZXlzX3NpemUgPDwgc3RkOjplbmRsOworCSAgc3RkOjphYm9ydCgpOworCX0KKyAgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgbV9rZXlzLnN3YXAob3RoZXIubV9rZXlzKTsKKyAgICAgIHN0ZDo6c3dhcChtX2VxLCBvdGhlci5tX2VxKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3IgaXRlcmF0b3JfdHlwZTsKKyAgICAgIGZvciAoaXRlcmF0b3JfdHlwZSBpdCA9IG1fa2V5cy5iZWdpbigpOyBpdCAhPSBtX2tleXMuZW5kKCk7ICsraXQpCisJaWYgKG1fZXEoKml0LCByX2tleSkpCisJICByZXR1cm4gaXQ7CisgICAgICByZXR1cm4gbV9rZXlzLmVuZCgpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIGl0ZXJhdG9yIGl0ID0gbV9rZXlzLmJlZ2luKCk7CisgICAgICB3aGlsZSAoaXQgIT0gbV9rZXlzLmVuZCgpKQorCXsKKwkgIGlmIChtX2VxKCppdCwgcl9rZXkpKQorCSAgICByZXR1cm4gaXQ7CisJICArK2l0OworCX0KKyAgICAgIHJldHVybiBpdDsKKyAgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0CisgICAgeworICAgICAgY29uc3RfaXRlcmF0b3IgcHJpbWVfaXQgPSBtX2tleXMuYmVnaW4oKTsKKyAgICAgIHdoaWxlIChwcmltZV9pdCAhPSBtX2tleXMuZW5kKCkpCisJeworCSAgY29uc3RfaXRlcmF0b3Igc2VjX2l0ID0gcHJpbWVfaXQ7CisJICArK3NlY19pdDsKKwkgIHdoaWxlIChzZWNfaXQgIT0gbV9rZXlzLmVuZCgpKQorCSAgICB7CisJICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKCFtX2VxKCpzZWNfaXQsICpwcmltZV9pdCkpOworCSAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWSghbV9lcSgqcHJpbWVfaXQsICpzZWNfaXQpKTsKKwkgICAgICArK3NlY19pdDsKKwkgICAgfQorCSAgKytwcmltZV9pdDsKKwl9CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDbXBfRm4+CisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBzcGxpdChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBDbXBfRm4gY21wX2ZuLCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCisgICAgeworICAgICAgb3RoZXIuY2xlYXIoKTsKKyAgICAgIGl0ZXJhdG9yIGl0ID0gbV9rZXlzLmJlZ2luKCk7CisgICAgICB3aGlsZSAoaXQgIT0gbV9rZXlzLmVuZCgpKQorCWlmIChjbXBfZm4ocl9rZXksICppdCkpCisJICB7CisJICAgIG90aGVyLmluc2VydF9uZXcoKml0KTsKKwkgICAgaXQgPSBtX2tleXMuZXJhc2UoaXQpOworCSAgfQorCWVsc2UKKwkgICsraXQ7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGpvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyLCBib29sIHdpdGhfY2xlYW51cCkKKyAgICB7CisgICAgICBpdGVyYXRvciBpdCA9IG90aGVyLm1fa2V5cy5iZWdpbigpOworICAgICAgd2hpbGUgKGl0ICE9IG90aGVyLm1fa2V5cy5lbmQoKSkKKwl7CisJICBpbnNlcnRfbmV3KCppdCk7CisJICBpZiAod2l0aF9jbGVhbnVwKQorCSAgICBpdCA9IG90aGVyLm1fa2V5cy5lcmFzZShpdCk7CisJICBlbHNlCisJICAgICsraXQ7CisJfQorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCF3aXRoX2NsZWFudXAgfHwgb3RoZXIubV9rZXlzLmVtcHR5KCkpOworICAgIH0KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2VxX2J5X2xlc3MuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2VxX2J5X2xlc3MuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzU2YWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZXFfZm4vZXFfYnlfbGVzcy5ocHAKQEAgLTAsMCArMSw2OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBlcV9ieV9sZXNzLmhwcAorICogQ29udGFpbnMgYW4gZXF1aXZhbGVuY2UgZnVuY3Rpb24uCisgKi8KKworI2lmbmRlZiBQQl9EU19FUV9CWV9MRVNTX0hQUAorI2RlZmluZSBQQl9EU19FUV9CWV9MRVNTX0hQUAorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBFcXVpdmFsZW5jZSBmdW5jdGlvbi4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIGNsYXNzIENtcF9Gbj4KKyAgICBzdHJ1Y3QgZXFfYnlfbGVzcyA6IHByaXZhdGUgQ21wX0ZuCisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBLZXkmIHJfbGhzLCBjb25zdCBLZXkmIHJfcmhzKSBjb25zdAorICAgICAgeworCWNvbnN0IGJvb2wgbCA9IENtcF9Gbjo6b3BlcmF0b3IoKShyX2xocywgcl9yaHMpOworCWNvbnN0IGJvb2wgZyA9IENtcF9Gbjo6b3BlcmF0b3IoKShyX3Jocywgcl9saHMpOworCXJldHVybiAhKGwgfHwgZyk7CisgICAgICB9CisgICAgfTsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX0VRX0JZX0xFU1NfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZXFfZm4vaGFzaF9lcV9mbi5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZXFfZm4vaGFzaF9lcV9mbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyYjhkYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9lcV9mbi9oYXNoX2VxX2ZuLmhwcApAQCAtMCwwICsxLDExMCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBoYXNoX2VxX2ZuLmhwcAorICogQ29udGFpbnMgMiBlcWl2YWxlbmNlIGZ1bmN0aW9ucywgb25lIGVtcGxveWluZyBhIGhhc2ggdmFsdWUsCisgKiBhbmQgb25lIGlnbm9yaW5nIGl0LgorICovCisKKyNpZm5kZWYgUEJfRFNfSEFTSF9FUV9GTl9IUFAKKyNkZWZpbmUgUEJfRFNfSEFTSF9FUV9GTl9IUFAKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIFByaW1hcnkgdGVtcGxhdGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBFcV9GbiwgdHlwZW5hbWUgX0FsbG9jLCBib29sIFN0b3JlX0hhc2g+CisgICAgICBzdHJ1Y3QgaGFzaF9lcV9mbjsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiAxIC0gVGhlIGNsaWVudCByZXF1ZXN0cyB0aGF0IGhhc2ggdmFsdWVzIG5vdCBiZSBzdG9yZWQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBFcV9GbiwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBoYXNoX2VxX2ZuPEtleSwgRXFfRm4sIF9BbGxvYywgZmFsc2U+IDogcHVibGljIEVxX0ZuCisgICAgeworICAgICAgdHlwZWRlZiBFcV9GbiAJCQkJCSAgIGVxX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyIGtleV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGtleV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSAJICAga2V5X2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgaGFzaF9lcV9mbigpIHsgfQorCisgICAgICBoYXNoX2VxX2ZuKGNvbnN0IEVxX0ZuJiByX2VxX2ZuKSA6IEVxX0ZuKHJfZXFfZm4pIHsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9saHNfa2V5LCAKKwkJIGtleV9jb25zdF9yZWZlcmVuY2Ugcl9yaHNfa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2xoc19rZXksIHJfcmhzX2tleSk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChjb25zdCBoYXNoX2VxX2ZuJiBvdGhlcikKKyAgICAgIHsgc3RkOjpzd2FwKChFcV9GbiYpKCp0aGlzKSwgKEVxX0ZuJilvdGhlcik7IH0KKyAgICB9OworCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gMiAtIFRoZSBjbGllbnQgcmVxdWVzdHMgdGhhdCBoYXNoIHZhbHVlcyBiZSBzdG9yZWQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCBjbGFzcyBFcV9GbiwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBoYXNoX2VxX2ZuPEtleSwgRXFfRm4sIF9BbGxvYywgdHJ1ZT4gOiBwdWJsaWMgRXFfRm4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAkJICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBFcV9GbiAJCQkJCSAgIGVxX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyIGtleV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGtleV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSAJICAga2V5X2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgaGFzaF9lcV9mbigpIHsgfQorCisgICAgICBoYXNoX2VxX2ZuKGNvbnN0IEVxX0ZuJiByX2VxX2ZuKSA6IEVxX0ZuKHJfZXFfZm4pIHsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9saHNfa2V5LCBzaXplX3R5cGUgbGhzX2hhc2gsIAorCQkga2V5X2NvbnN0X3JlZmVyZW5jZSByX3Joc19rZXksIHNpemVfdHlwZSByaHNfaGFzaCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWVxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9saHNfa2V5LCByX3Joc19rZXkpIAorCQkJICAgICAgfHwgbGhzX2hhc2ggPT0gcmhzX2hhc2gpOworCisJcmV0dXJuIChsaHNfaGFzaCA9PSByaHNfaGFzaCAmJiAKKwkJZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2xoc19rZXksIHJfcmhzX2tleSkpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGNvbnN0IGhhc2hfZXFfZm4mIG90aGVyKQorICAgICAgeyBzdGQ6OnN3YXAoKEVxX0ZuJikoKnRoaXMpLCAoRXFfRm4mKShvdGhlcikpOyB9CisgICAgfTsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGNhMDdmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMjIzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvciwKKyAqIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmVudHJ5X2FsbG9jYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfZW50cnlfYWxsb2NhdG9yOworCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb3B5X2Zyb21fcmFuZ2UoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQpCit7CisgIHdoaWxlIChmaXJzdF9pdCAhPSBsYXN0X2l0KQorICAgIGluc2VydCgqKGZpcnN0X2l0KyspKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0dQX0hBU0hfTkFNRSgpIAorOiByYW5nZWRfcHJvYmVfZm5fYmFzZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpLAorICBtX251bV9lKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSksIG1fbnVtX3VzZWRfZSgwKSwKKyAgbV9lbnRyaWVzKHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG1fbnVtX2UpKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfR1BfSEFTSF9OQU1FKGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbikgICAgCis6IHJhbmdlZF9wcm9iZV9mbl9iYXNlKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSwgcl9oYXNoX2ZuKSwKKyAgbV9udW1fZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpLCBtX251bV91c2VkX2UoMCksCisgIG1fZW50cmllcyhzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0dQX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIGNvbnN0IEVxX0ZuJiByX2VxX2ZuKSAKKzogaGFzaF9lcV9mbl9iYXNlKHJfZXFfZm4pLAorICByYW5nZWRfcHJvYmVfZm5fYmFzZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSksIHJfaGFzaF9mbiksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobV9udW1fZSkpCit7CisgIGluaXRpYWxpemUoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19HUF9IQVNIX05BTUUoY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuLCBjb25zdCBFcV9GbiYgcl9lcV9mbiwgCisJCSBjb25zdCBDb21iX1Byb2JlX0ZuJiByX2NvbWJfaGFzaF9mbikgCis6IGhhc2hfZXFfZm5fYmFzZShyX2VxX2ZuKSwKKyAgcmFuZ2VkX3Byb2JlX2ZuX2Jhc2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpLAorCQkgICAgICAgcl9oYXNoX2ZuLCByX2NvbWJfaGFzaF9mbiksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobV9udW1fZSkpCit7CisgIGluaXRpYWxpemUoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19HUF9IQVNIX05BTUUoY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuLCBjb25zdCBFcV9GbiYgcl9lcV9mbiwgCisJCSBjb25zdCBDb21iX1Byb2JlX0ZuJiBjb21iX2hhc2hfZm4sIGNvbnN0IFByb2JlX0ZuJiBwcm9iZXIpIAorOiBoYXNoX2VxX2ZuX2Jhc2Uocl9lcV9mbiksCisgIHJhbmdlZF9wcm9iZV9mbl9iYXNlKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSwKKwkJICAgICAgIHJfaGFzaF9mbiwgY29tYl9oYXNoX2ZuLCBwcm9iZXIpLAorICBtX251bV9lKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSksIG1fbnVtX3VzZWRfZSgwKSwKKyAgbV9lbnRyaWVzKHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG1fbnVtX2UpKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfR1BfSEFTSF9OQU1FKGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbiwgY29uc3QgRXFfRm4mIHJfZXFfZm4sIAorCQkgY29uc3QgQ29tYl9Qcm9iZV9GbiYgY29tYl9oYXNoX2ZuLCBjb25zdCBQcm9iZV9GbiYgcHJvYmVyLCAKKwkJIGNvbnN0IFJlc2l6ZV9Qb2xpY3kmIHJfcmVzaXplX3BvbGljeSkgCis6IGhhc2hfZXFfZm5fYmFzZShyX2VxX2ZuKSwgcmVzaXplX2Jhc2Uocl9yZXNpemVfcG9saWN5KSwKKyAgcmFuZ2VkX3Byb2JlX2ZuX2Jhc2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpLAorCQkgICAgICAgcl9oYXNoX2ZuLCBjb21iX2hhc2hfZm4sIHByb2JlciksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobV9udW1fZSkpCit7CisgIGluaXRpYWxpemUoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19HUF9IQVNIX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgZGVidWdfYmFzZShvdGhlciksCisjZW5kaWYgCisgIGhhc2hfZXFfZm5fYmFzZShvdGhlciksCisgIHJlc2l6ZV9iYXNlKG90aGVyKSwKKyAgcmFuZ2VkX3Byb2JlX2ZuX2Jhc2Uob3RoZXIpLAorICBtX251bV9lKG90aGVyLm1fbnVtX2UpLAorICBtX251bV91c2VkX2Uob3RoZXIubV9udW1fdXNlZF9lKSwKKyAgbV9lbnRyaWVzKHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG1fbnVtX2UpKQoreworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKyAgICBtX2VudHJpZXNbaV0ubV9zdGF0ID0gKGVudHJ5X3N0YXR1cyllbXB0eV9lbnRyeV9zdGF0dXM7CisKKyAgX190cnkKKyAgICB7CisgICAgICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKyAgICAgICAgeworCSAgbV9lbnRyaWVzW2ldLm1fc3RhdCA9IG90aGVyLm1fZW50cmllc1tpXS5tX3N0YXQ7CisJICBpZiAobV9lbnRyaWVzW2ldLm1fc3RhdCA9PSB2YWxpZF9lbnRyeV9zdGF0dXMpCisJICAgIG5ldyAobV9lbnRyaWVzICsgaSkgZW50cnkob3RoZXIubV9lbnRyaWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeworICAgICAgZGVhbGxvY2F0ZV9hbGwoKTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+UEJfRFNfR1BfSEFTSF9OQU1FKCkKK3sgZGVhbGxvY2F0ZV9hbGwoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgIHN0ZDo6c3dhcChtX251bV9lLCBvdGhlci5tX251bV9lKTsKKyAgc3RkOjpzd2FwKG1fbnVtX3VzZWRfZSwgb3RoZXIubV9udW1fdXNlZF9lKTsKKyAgc3RkOjpzd2FwKG1fZW50cmllcywgb3RoZXIubV9lbnRyaWVzKTsKKyAgcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6OnN3YXAob3RoZXIpOworICBoYXNoX2VxX2ZuX2Jhc2U6OnN3YXAob3RoZXIpOworICByZXNpemVfYmFzZTo6c3dhcChvdGhlcik7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6c3dhcChvdGhlcikpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZGVhbGxvY2F0ZV9hbGwoKQoreworICBjbGVhcigpOworICBlcmFzZV9hbGxfdmFsaWRfZW50cmllcyhtX2VudHJpZXMsIG1fbnVtX2UpOworICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fZW50cmllcywgbV9udW1fZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9hbGxfdmFsaWRfZW50cmllcyhlbnRyeV9hcnJheSBhX2VudHJpZXNfcmVzaXplZCwgc2l6ZV90eXBlIGxlbikKK3sKKyAgZm9yIChzaXplX3R5cGUgcG9zID0gMDsgcG9zIDwgbGVuOyArK3BvcykKKyAgICB7CisgICAgICBlbnRyeV9wb2ludGVyIHBfZSA9ICZhX2VudHJpZXNfcmVzaXplZFtwb3NdOworICAgICAgaWYgKHBfZS0+bV9zdGF0ID09IHZhbGlkX2VudHJ5X3N0YXR1cykKKwlwX2UtPm1fdmFsdWUufnZhbHVlX3R5cGUoKTsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citpbml0aWFsaXplKCkKK3sKKyAgUmVzaXplX1BvbGljeTo6bm90aWZ5X3Jlc2l6ZWQobV9udW1fZSk7CisgIFJlc2l6ZV9Qb2xpY3k6Om5vdGlmeV9jbGVhcmVkKCk7CisgIHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChtX251bV9lKTsKKyAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgbV9lbnRyaWVzW2ldLm1fc3RhdCA9IGVtcHR5X2VudHJ5X3N0YXR1czsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjIzNjlkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvciwKKyAqICAgIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvbnN0cnVjdG9yX2luc2VydF9uZXdfaW1wKG1hcHBlZF9jb25zdF9yZWZlcmVuY2Ugcl92YWwsIHNpemVfdHlwZSBwb3MsIAorCQkJICAgZmFsc2VfdHlwZSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fZW50cmllc1twb3NdLm1fc3RhdCAhPSB2YWxpZF9lbnRyeV9zdGF0dXMpazsKKyAgZW50cnkqIGNvbnN0IHBfZSA9IG1fZW50cmllcyArIHBvczsKKyAgbmV3ICgmcF9lLT5tX3ZhbHVlKSBtYXBwZWRfdmFsdWVfdHlwZShyX3ZhbCk7CisgIHBfZS0+bV9zdGF0ID0gdmFsaWRfZW50cnlfc3RhdHVzOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcocF9lLT5tX3ZhbHVlLmZpcnN0KTspCit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzI3ZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgY29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLAorICogYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29uc3RydWN0b3JfaW5zZXJ0X25ld19pbXAobWFwcGVkX2NvbnN0X3JlZmVyZW5jZSByX3ZhbCwgc2l6ZV90eXBlIHBvcywgCisJCQkgICB0cnVlX3R5cGUpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX2VudHJpZXNbcG9zXS5tX3N0YXQgIT0gdmFsaWRfZW50cnlfc3RhdHVzKTsKKyAgZW50cnkqIGNvbnN0IHBfZSA9IG1fZW50cmllcyArIHBvczsKKyAgbmV3ICgmcF9lLT5tX3ZhbHVlKSBtYXBwZWRfdmFsdWVfdHlwZShyX3ZhbCk7CisgIHBfZS0+bV9oYXNoID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHJfdmFsKSkuc2Vjb25kOworICBwX2UtPm1fc3RhdCA9IHZhbGlkX2VudHJ5X3N0YXR1czsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KHBfZS0+bV92YWx1ZS5maXJzdCk7KQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxYmM1NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgZGVidWctbW9kZSBmdW5jdGlvbnMuCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBkZWJ1Z19iYXNlOjpjaGVja19zaXplKG1fbnVtX3VzZWRfZSwgX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfZW50cnlfYXJyYXlfdmFsaWQobV9lbnRyaWVzLCB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IsCisJCQkgICBfX2ZpbGUsIF9fbGluZSk7Cit9CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX3N0b3JlX2hhc2hfZm5faW1wcy5ocHA+CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTJjOGUyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNzIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgZGVidWctbW9kZSBmdW5jdGlvbnMuCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfZW50cnlfYXJyYXlfdmFsaWQoY29uc3QgZW50cnlfYXJyYXkgYV9lbnRyaWVzLCBmYWxzZV90eXBlLAorCQkJIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgc2l6ZV90eXBlIGl0ZXJhdGVkX251bV91c2VkX2UgPSAwOworICBmb3IgKHNpemVfdHlwZSBwb3MgPSAwOyBwb3MgPCBtX251bV9lOyArK3BvcykKKyAgICB7CisgICAgICBjb25zdF9lbnRyeV9wb2ludGVyIHBfZSA9ICZhX2VudHJpZXNbcG9zXTsKKyAgICAgIHN3aXRjaChwX2UtPm1fc3RhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKyAgICAgICAgY2FzZSBlcmFzZWRfZW50cnlfc3RhdHVzOgorCSAgYnJlYWs7CisgICAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCSAgeworCSAgICBrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5ID0gUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSk7CisJICAgIGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMocl9rZXksIF9fZmlsZSwgX19saW5lKTsKKwkgICAgKytpdGVyYXRlZF9udW1fdXNlZF9lOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgICAgZGVmYXVsdDoKKwkgIFBCX0RTX0RFQlVHX1ZFUklGWSgwKTsKKyAgICAgICAgfTsKKyAgICB9CisgIFBCX0RTX0RFQlVHX1ZFUklGWShpdGVyYXRlZF9udW1fdXNlZF9lID09IG1fbnVtX3VzZWRfZSk7Cit9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU1NmE5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNzggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgZGVidWctbW9kZSBmdW5jdGlvbnMuCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfZW50cnlfYXJyYXlfdmFsaWQoY29uc3QgZW50cnlfYXJyYXkgYV9lbnRyaWVzLCB0cnVlX3R5cGUsCisJCQkgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBzaXplX3R5cGUgaXRlcmF0ZWRfbnVtX3VzZWRfZSA9IDA7CisKKyAgZm9yIChzaXplX3R5cGUgcG9zID0gMDsgcG9zIDwgbV9udW1fZTsgKytwb3MpCisgICAgeworICAgICAgY29uc3RfZW50cnlfcG9pbnRlciBwX2UgPSYgYV9lbnRyaWVzW3Bvc107CisgICAgICBzd2l0Y2gocF9lLT5tX3N0YXQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBlbXB0eV9lbnRyeV9zdGF0dXM6CisgICAgICAgIGNhc2UgZXJhc2VkX2VudHJ5X3N0YXR1czoKKwkgIGJyZWFrOworICAgICAgICBjYXNlIHZhbGlkX2VudHJ5X3N0YXR1czoKKwkgIHsKKwkgICAga2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSA9IFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpOworCSAgICBkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKHJfa2V5LCBfX2ZpbGUsIF9fbGluZSk7CisKKwkgICAgY29uc3QgY29tcF9oYXNoIHBvc19oYXNoX3BhaXIgPSByYW5nZWRfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSk7CisKKwkgICAgUEJfRFNfREVCVUdfVkVSSUZZKHBfZS0+bV9oYXNoID09IHBvc19oYXNoX3BhaXIuc2Vjb25kKTsKKwkgICAgKytpdGVyYXRlZF9udW1fdXNlZF9lOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgICAgZGVmYXVsdDoKKwkgIFBCX0RTX0RFQlVHX1ZFUklGWSgwKTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgUEJfRFNfREVCVUdfVkVSSUZZKGl0ZXJhdGVkX251bV91c2VkX2UgPT0gbV9udW1fdXNlZF9lKTsKK30KKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjZjZmZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGVyYXNlIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfZW50cnkoZW50cnlfcG9pbnRlciBwX2UpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2UtPm1fc3RhdCA9IHZhbGlkX2VudHJ5X3N0YXR1cyk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6ZXJhc2VfZXhpc3RpbmcoUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSkpOykKKyAgcF9lLT5tX3ZhbHVlLn52YWx1ZV90eXBlKCk7CisgIHBfZS0+bV9zdGF0ID0gZXJhc2VkX2VudHJ5X3N0YXR1czsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fbnVtX3VzZWRfZSA+IDApOworICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlZCgtLW1fbnVtX3VzZWRfZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcigpCit7CisgIGZvciAoc2l6ZV90eXBlIHBvcyA9IDA7IHBvcyA8IG1fbnVtX2U7ICsrcG9zKQorICAgIHsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9lID0gJm1fZW50cmllc1twb3NdOworICAgICAgaWYgKHBfZS0+bV9zdGF0ID09IHZhbGlkX2VudHJ5X3N0YXR1cykKKwllcmFzZV9lbnRyeShwX2UpOworICAgIH0KKyAgZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpOworICByZXNpemVfYmFzZTo6bm90aWZ5X2NsZWFyZWQoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaWYoUHJlZCBwcmVkKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgc2l6ZV90eXBlIG51bV9lcnNkID0gMDsKKyAgZm9yIChzaXplX3R5cGUgcG9zID0gMDsgcG9zIDwgbV9udW1fZTsgKytwb3MpCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX2UgPSAmbV9lbnRyaWVzW3Bvc107CisgICAgICBpZiAocF9lLT5tX3N0YXQgPT0gdmFsaWRfZW50cnlfc3RhdHVzKQorCWlmIChwcmVkKHBfZS0+bV92YWx1ZSkpCisJICB7CisJICAgICsrbnVtX2Vyc2Q7CisJICAgIGVyYXNlX2VudHJ5KHBfZSk7CisJICB9CisgICAgfQorCisgIGRvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBudW1fZXJzZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreyByZXR1cm4gZXJhc2VfaW1wKHJfa2V5LCB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOyB9CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX3N0b3JlX2hhc2hfZm5faW1wcy5ocHA+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjZWYxOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZXJhc2Vfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDg0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGVyYXNlIHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBub3Qgc3RvcmVkLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaW1wKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksICBmYWxzZV90eXBlKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgc2l6ZV90eXBlIGhhc2ggPSByYW5nZWRfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSk7CisgIHNpemVfdHlwZSBpOworICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9zdGFydCgpOworCisgIGZvciAoaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5LCAgaGFzaCwgaSk7CisgICAgICBlbnRyeSogY29uc3QgcF9lID0gbV9lbnRyaWVzICsgcG9zOworICAgICAgc3dpdGNoKHBfZS0+bV9zdGF0KQorICAgICAgICB7CisgICAgICAgIGNhc2UgZW1wdHlfZW50cnlfc3RhdHVzOgorCSAgeworCSAgICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKwkgICAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorCSAgICByZXR1cm4gZmFsc2U7CisJICB9CisJICBicmVhazsKKyAgICAgICAgY2FzZSB2YWxpZF9lbnRyeV9zdGF0dXM6CisJICBpZiAoaGFzaF9lcV9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpLCByX2tleSkpCisgICAgICAgICAgICB7CisJICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisJICAgICAgZXJhc2VfZW50cnkocF9lKTsKKwkgICAgICBkb19yZXNpemVfaWZfbmVlZGVkX25vX3Rocm93KCk7CisJICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisJICBicmVhazsKKyAgICAgICAgY2FzZSBlcmFzZWRfZW50cnlfc3RhdHVzOgorCSAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgIH07CisgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9jb2xsaXNpb24oKTsKKyAgICB9CisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworICByZXR1cm4gZmFsc2U7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZXJhc2Vfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZXJhc2Vfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTJjMmRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsODUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgZXJhc2UgcmVsYXRlZCBmdW5jdGlvbnMsCisgKiB3aGVuIHRoZSBoYXNoIHZhbHVlIGlzIHN0b3JlZC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCB0cnVlX3R5cGUpCit7CisgIGNvbnN0IGNvbXBfaGFzaCBwb3NfaGFzaF9wYWlyID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworICBzaXplX3R5cGUgaTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKTsKKyAgZm9yIChpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgcG9zID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXksIHBvc19oYXNoX3BhaXIuc2Vjb25kLCBpKTsKKworICAgICAgZW50cnkqIGNvbnN0IHBfZSA9IG1fZW50cmllcyArIHBvczsKKyAgICAgIHN3aXRjaChwX2UtPm1fc3RhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKwkgIHsKKwkgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisJICAgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgfQorCSAgYnJlYWs7CisgICAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCSAgaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgcF9lLT5tX2hhc2gsCisJCQkJCSAgcl9rZXksIHBvc19oYXNoX3BhaXIuc2Vjb25kKSkKKyAgICAgICAgICAgIHsKKwkgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKwkgICAgICBlcmFzZV9lbnRyeShwX2UpOworCSAgICAgIGRvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKTsKKwkgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKwkgIGJyZWFrOworICAgICAgICBjYXNlIGVyYXNlZF9lbnRyeV9zdGF0dXM6CisJICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCgwKTsKKyAgICAgICAgfTsKKworICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7CisgICAgfQorICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzZWY5NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZmluZF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDcwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGZpbmQgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBmaW5kX2tleV9wb2ludGVyKHJfa2V5LCB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9jb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMmPigqdGhpcykuZmluZF9rZXlfcG9pbnRlcihyX2tleSwgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfZW5kKCkKK3sgcmV0dXJuIDA7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfZW5kKCkgY29uc3QKK3sgcmV0dXJuIDA7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9maW5kX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2ZpbmRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDg0NjAwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9maW5kX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw0NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBncF9oYXNoX3RhYmxlX21hcF8vZmluZF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGZpbmQgcmVsYXRlZCBmdW5jdGlvbnMsCisgKiB3aGVuIHRoZSBoYXNoIHZhbHVlIGlzIG5vdCBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9rZXlfcG9pbnRlcihrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBmYWxzZV90eXBlKQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2ZpbmRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZmluZF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNWIzYTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2ZpbmRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDQwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9maW5kX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgaW5zZXJ0IHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBzdG9yZWQuCisgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZ3BfaHRfbWFwXy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2dwX2h0X21hcF8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MzM1ODMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2dwX2h0X21hcF8uaHBwCkBAIC0wLDAgKzEsNzEzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9ncF9odF9tYXBfLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGdlbmVyYWwgcHJvYmluZyBoYXNoLgorICovCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3JhbmdlZF9wcm9iZV9mbi5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlc190cmFpdHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9leGNlcHRpb24uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZXFfZm4vaGFzaF9lcV9mbi5ocHA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpZmRlZiBQQl9EU19IVF9NQVBfVFJBQ0VfCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZGVidWdfbWFwX2Jhc2UuaHBwPgorI2VuZGlmCisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19HUF9IQVNIX05BTUUgZ3BfaHRfbWFwCisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0dQX0hBU0hfTkFNRSBncF9odF9zZXQKKyNlbmRpZgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBIYXNoX0ZuLCB0eXBlbmFtZSBFcV9GbiwgXAorCSAgICB0eXBlbmFtZSBfQWxsb2MsIGJvb2wgU3RvcmVfSGFzaCwgdHlwZW5hbWUgQ29tYl9Qcm9iZV9GbiwgXAorCSAgICB0eXBlbmFtZSBQcm9iZV9GbiwJdHlwZW5hbWUgUmVzaXplX1BvbGljeT4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICBQQl9EU19HUF9IQVNIX05BTUU8S2V5LCBNYXBwZWQsIEhhc2hfRm4sIEVxX0ZuLCBfQWxsb2MsIFwKKwkJICAgIFN0b3JlX0hhc2gsIENvbWJfUHJvYmVfRm4sIFByb2JlX0ZuLCBSZXNpemVfUG9saWN5PgorCisjZGVmaW5lIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMgXAorICAgIGhhc2hfZXFfZm48S2V5LCBFcV9GbiwgX0FsbG9jLCBTdG9yZV9IYXNoPgorCisjZGVmaW5lIFBCX0RTX1JBTkdFRF9QUk9CRV9GTl9DX0RFQyBcCisgICByYW5nZWRfcHJvYmVfZm48S2V5LCBIYXNoX0ZuLCBfQWxsb2MsIENvbWJfUHJvYmVfRm4sIFByb2JlX0ZuLCBTdG9yZV9IYXNoPgorCisjZGVmaW5lIFBCX0RTX0dQX0hBU0hfVFJBSVRTX0JBU0UgXAorICAgdHlwZXNfdHJhaXRzPEtleSwgTWFwcGVkLCBfQWxsb2MsIFN0b3JlX0hhc2g+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2RlZmluZSBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQyBcCisgICBkZWJ1Z19tYXBfYmFzZTxLZXksIEVxX0ZuLCBcCisJCSAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZT4KKyNlbmRpZgorCisKKyAgICAvKioKKyAgICAgKiAgQSBnZW5lcmFsLXByb2JpbmcgaGFzaC1iYXNlZCBjb250YWluZXIuCisgICAgICoKKyAgICAgKgorICAgICAqICBAaW5ncm91cCBoYXNoLWRldGFpbAorICAgICAqCisgICAgICogIEB0cGFyYW0gS2V5IAkgICAgCUtleSB0eXBlLgorICAgICAqCisgICAgICogIEB0cGFyYW0gTWFwcGVkIAkgICAgCU1hcCB0eXBlLgorICAgICAqCisgICAgICogIEB0cGFyYW0gSGFzaF9GbgkgICAgICAJSGFzaGluZyBmdW5jdG9yLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGlzIF9fZ251X2N4eDo6aGFzaC4KKyAgICAgKgorICAgICAqICBAdHBhcmFtIEVxX0ZuCSAgICAgIAlFcXVhbCBmdW5jdG9yLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHN0ZDo6ZXF1YWxfdG88S2V5PgorICAgICAqCisgICAgICogIEB0cGFyYW0gX0FsbG9jIAkgICAgCUFsbG9jYXRvciB0eXBlLgorICAgICAqCisgICAgICogIEB0cGFyYW0gU3RvcmVfSGFzaCAgICAJSWYga2V5IHR5cGUgc3RvcmVzIGV4dHJhIG1ldGFkYXRhLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKgorICAgICAqICBAdHBhcmFtIENvbWJfUHJvYmVfRm4JQ29tYmluaW5nIHByb2JlIGZ1bmN0b3IuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIElmIEhhc2hfRm4gaXMgbm90IG51bGxfdHlwZSwgdGhlbiB0aGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSByYW5nZWQtcHJvYmUgZnVuY3Rvcjsgb3RoZXJ3aXNlLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHRoZSByYW5nZS1oYXNoaW5nIGZ1bmN0b3IuCisgICAgICogICAgICAgICAgICAgICAgICAgIFhYWCBTZWUgRGVzaWduOjpIYXNoLUJhc2VkIENvbnRhaW5lcnM6Okhhc2ggUG9saWNpZXMuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZy4KKyAgICAgKgorICAgICAqICBAdHBhcmFtIFByb2JlX0ZuICAgICAgIAlQcm9iZSBmdW5jdG9yLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBsaW5lYXJfcHJvYmVfZm4sCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGFsc28gcXVhZHJhdGljX3Byb2JlX2ZuLgorICAgICAqCisgICAgICogIEB0cGFyYW0gUmVzaXplX1BvbGljeSAJUmVzaXplcyBoYXNoLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBoYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3ksCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIGhhc2hfZXhwb25lbnRpYWxfc2l6ZV9wb2xpY3kgYW5kCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlci4KKyAgICAgKgorICAgICAqCisgICAgICogIEJhc2VzIGFyZTogZGV0YWlsOjpoYXNoX2VxX2ZuLCBSZXNpemVfUG9saWN5LCBkZXRhaWw6OnJhbmdlZF9wcm9iZV9mbiwKKyAgICAgKiAgICAgICAgICAgICBkZXRhaWw6OnR5cGVzX3RyYWl0cy4gKE9wdGlvbmFsOiBkZXRhaWw6OmRlYnVnX21hcF9iYXNlLikKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgICB0eXBlbmFtZSBIYXNoX0ZuLAorCSAgICAgdHlwZW5hbWUgRXFfRm4sCisJICAgICB0eXBlbmFtZSBfQWxsb2MsCisJICAgICBib29sIFN0b3JlX0hhc2gsCisJICAgICB0eXBlbmFtZSBDb21iX1Byb2JlX0ZuLAorCSAgICAgdHlwZW5hbWUgUHJvYmVfRm4sCisJICAgICB0eXBlbmFtZSBSZXNpemVfUG9saWN5PgorICAgIGNsYXNzIFBCX0RTX0dQX0hBU0hfTkFNRSA6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHByb3RlY3RlZCBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQywKKyNlbmRpZgorICAgICAgcHVibGljIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMsCisgICAgICBwdWJsaWMgUmVzaXplX1BvbGljeSwKKyAgICAgIHB1YmxpYyBQQl9EU19SQU5HRURfUFJPQkVfRk5fQ19ERUMsCisgICAgICBwdWJsaWMgUEJfRFNfR1BfSEFTSF9UUkFJVFNfQkFTRQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19HUF9IQVNIX1RSQUlUU19CQVNFCSAgICAgICAJdHJhaXRzX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjp2YWx1ZV90eXBlIAl2YWx1ZV90eXBlXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnBvaW50ZXIgCXBvaW50ZXJfOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnJlZmVyZW5jZSAJcmVmZXJlbmNlXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2VfOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29tcF9oYXNoCWNvbXBfaGFzaDsKKworICAgICAgZW51bSBlbnRyeV9zdGF0dXMKKwl7CisJICBlbXB0eV9lbnRyeV9zdGF0dXMsCisJICB2YWxpZF9lbnRyeV9zdGF0dXMsCisJICBlcmFzZWRfZW50cnlfc3RhdHVzCisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyAgICAgIHN0cnVjdCBlbnRyeSA6IHB1YmxpYyB0cmFpdHNfYmFzZTo6c3RvcmVkX2RhdGFfdHlwZQorICAgICAgeworCWVudHJ5X3N0YXR1cyBtX3N0YXQ7CisgICAgICB9OworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPGVudHJ5Pjo6b3RoZXIgZW50cnlfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OnBvaW50ZXIgZW50cnlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpjb25zdF9wb2ludGVyIGNvbnN0X2VudHJ5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6cmVmZXJlbmNlIGVudHJ5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfZW50cnlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OnBvaW50ZXIgZW50cnlfYXJyYXk7CisKKyAgICAgIHR5cGVkZWYgUEJfRFNfUkFOR0VEX1BST0JFX0ZOX0NfREVDIAlyYW5nZWRfcHJvYmVfZm5fYmFzZTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB0eXBlZGVmIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDIAlkZWJ1Z19iYXNlOworI2VuZGlmCisKKyAgICAgIHR5cGVkZWYgUEJfRFNfSEFTSF9FUV9GTl9DX0RFQyAJCWhhc2hfZXFfZm5fYmFzZTsKKyAgICAgIHR5cGVkZWYgUmVzaXplX1BvbGljeSAJCQlyZXNpemVfYmFzZTsKKworI2RlZmluZSBQQl9EU19HRU5fUE9TIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9wb2ludF9jb25zdF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvcG9pbnRfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL2NvbnN0X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9pdGVyYXRvci5ocHA+CisKKyN1bmRlZiBQQl9EU19HRU5fUE9TCisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9BbGxvYyAJCQkJYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIAlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIEhhc2hfRm4gCQkJCWhhc2hfZm47CisgICAgICB0eXBlZGVmIEVxX0ZuIAkJCQllcV9mbjsKKyAgICAgIHR5cGVkZWYgUHJvYmVfRm4gCQkJCXByb2JlX2ZuOworICAgICAgdHlwZWRlZiBDb21iX1Byb2JlX0ZuIAkJCWNvbWJfcHJvYmVfZm47CisgICAgICB0eXBlZGVmIFJlc2l6ZV9Qb2xpY3kgCQkJcmVzaXplX3BvbGljeTsKKworICAgICAgLy8vIFZhbHVlIHN0b3JlcyBoYXNoLCB0cnVlIG9yIGZhbHNlLgorICAgICAgZW51bQorCXsKKwkgIHN0b3JlX2hhc2ggPSBTdG9yZV9IYXNoCisJfTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3R5cGUgCWtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3BvaW50ZXIga2V5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfY29uc3RfcG9pbnRlciBrZXlfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9yZWZlcmVuY2Uga2V5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9jb25zdF9yZWZlcmVuY2Uga2V5X2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF90eXBlIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3BvaW50ZXIgbWFwcGVkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfY29uc3RfcG9pbnRlciBtYXBwZWRfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9yZWZlcmVuY2UgbWFwcGVkX3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9jb25zdF9yZWZlcmVuY2UgbWFwcGVkX2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiBwb2ludF9pdGVyYXRvcl8gCQkJcG9pbnRfaXRlcmF0b3I7CisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIHBvaW50X2NvbnN0X2l0ZXJhdG9yXyAJCXBvaW50X2l0ZXJhdG9yOworI2VuZGlmCisKKyAgICAgIHR5cGVkZWYgcG9pbnRfY29uc3RfaXRlcmF0b3JfIAkJcG9pbnRfY29uc3RfaXRlcmF0b3I7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIGl0ZXJhdG9yXyAJCQlpdGVyYXRvcjsKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3JfIAkJCWl0ZXJhdG9yOworI2VuZGlmCisKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3JfIAkJCWNvbnN0X2l0ZXJhdG9yOworCisgICAgICBQQl9EU19HUF9IQVNIX05BTUUoKTsKKworICAgICAgUEJfRFNfR1BfSEFTSF9OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIFBCX0RTX0dQX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJik7CisKKyAgICAgIFBCX0RTX0dQX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJiwgY29uc3QgRXFfRm4mKTsKKworICAgICAgUEJfRFNfR1BfSEFTSF9OQU1FKGNvbnN0IEhhc2hfRm4mLCBjb25zdCBFcV9GbiYsIGNvbnN0IENvbWJfUHJvYmVfRm4mKTsKKworICAgICAgUEJfRFNfR1BfSEFTSF9OQU1FKGNvbnN0IEhhc2hfRm4mLCBjb25zdCBFcV9GbiYsIGNvbnN0IENvbWJfUHJvYmVfRm4mLAorCQkJIGNvbnN0IFByb2JlX0ZuJik7CisKKyAgICAgIFBCX0RTX0dQX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJiwgY29uc3QgRXFfRm4mLCBjb25zdCBDb21iX1Byb2JlX0ZuJiwKKwkJCSBjb25zdCBQcm9iZV9GbiYsIGNvbnN0IFJlc2l6ZV9Qb2xpY3kmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fcmFuZ2UoSXQsIEl0KTsKKworICAgICAgdmlydHVhbAorICAgICAgflBCX0RTX0dQX0hBU0hfTkFNRSgpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdDsKKworICAgICAgLy8vIFRydWUgaWYgc2l6ZSgpID09IDAuCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdDsKKworICAgICAgLy8vIFJldHVybiBjdXJyZW50IGhhc2hfZm4uCisgICAgICBIYXNoX0ZuJgorICAgICAgZ2V0X2hhc2hfZm4oKTsKKworICAgICAgLy8vIFJldHVybiBjdXJyZW50IGNvbnN0IGhhc2hfZm4uCisgICAgICBjb25zdCBIYXNoX0ZuJgorICAgICAgZ2V0X2hhc2hfZm4oKSBjb25zdDsKKworICAgICAgLy8vIFJldHVybiBjdXJyZW50IGVxX2ZuLgorICAgICAgRXFfRm4mCisgICAgICBnZXRfZXFfZm4oKTsKKworICAgICAgLy8vIFJldHVybiBjdXJyZW50IGNvbnN0IGVxX2ZuLgorICAgICAgY29uc3QgRXFfRm4mCisgICAgICBnZXRfZXFfZm4oKSBjb25zdDsKKworICAgICAgLy8vIFJldHVybiBjdXJyZW50IHByb2JlX2ZuLgorICAgICAgUHJvYmVfRm4mCisgICAgICBnZXRfcHJvYmVfZm4oKTsKKworICAgICAgLy8vIFJldHVybiBjdXJyZW50IGNvbnN0IHByb2JlX2ZuLgorICAgICAgY29uc3QgUHJvYmVfRm4mCisgICAgICBnZXRfcHJvYmVfZm4oKSBjb25zdDsKKworICAgICAgLy8vIFJldHVybiBjdXJyZW50IGNvbWJfcHJvYmVfZm4uCisgICAgICBDb21iX1Byb2JlX0ZuJgorICAgICAgZ2V0X2NvbWJfcHJvYmVfZm4oKTsKKworICAgICAgLy8vIFJldHVybiBjdXJyZW50IGNvbnN0IGNvbWJfcHJvYmVfZm4uCisgICAgICBjb25zdCBDb21iX1Byb2JlX0ZuJgorICAgICAgZ2V0X2NvbWJfcHJvYmVfZm4oKSBjb25zdDsKKworICAgICAgLy8vIFJldHVybiBjdXJyZW50IHJlc2l6ZV9wb2xpY3kuCisgICAgICBSZXNpemVfUG9saWN5JgorICAgICAgZ2V0X3Jlc2l6ZV9wb2xpY3koKTsKKworICAgICAgLy8vIFJldHVybiBjdXJyZW50IGNvbnN0IHJlc2l6ZV9wb2xpY3kuCisgICAgICBjb25zdCBSZXNpemVfUG9saWN5JgorICAgICAgZ2V0X3Jlc2l6ZV9wb2xpY3koKSBjb25zdDsKKworICAgICAgaW5saW5lIHN0ZDo6cGFpcjxwb2ludF9pdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdF9yZWZlcmVuY2Ugcl92YWwpCisgICAgICB7CisgICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShQQl9EU19DTEFTU19DX0RFQzo6YXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCXJldHVybiBpbnNlcnRfaW1wKHJfdmFsLCB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworICAgICAgfQorCisgICAgICBpbmxpbmUgbWFwcGVkX3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQorICAgICAgeworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKwlyZXR1cm4gc3Vic2NyaXB0X2ltcChyX2tleSwgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKKyNlbHNlCisJaW5zZXJ0KHJfa2V5KTsKKwlyZXR1cm4gdHJhaXRzX2Jhc2U6OnNfbnVsbF90eXBlOworI2VuZGlmCisgICAgICB9CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgZmluZChrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIHBvaW50X2NvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIGZpbmRfZW5kKCk7CisKKyAgICAgIGlubGluZSBwb2ludF9jb25zdF9pdGVyYXRvcgorICAgICAgZmluZF9lbmQoKSBjb25zdDsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVyYXNlKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICAgIGVyYXNlX2lmKFByZWQpOworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdDsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBlbmQoKTsKKyAgICAgIAorICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdDsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0hUX01BUF9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3Q7CisjZW5kaWYKKworICAgIHByaXZhdGU6CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgZnJpZW5kIGNsYXNzIGl0ZXJhdG9yXzsKKyNlbmRpZgorCisgICAgICBmcmllbmQgY2xhc3MgY29uc3RfaXRlcmF0b3JfOworCisgICAgICB2b2lkCisgICAgICBkZWFsbG9jYXRlX2FsbCgpOworCisgICAgICB2b2lkCisgICAgICBpbml0aWFsaXplKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlX2FsbF92YWxpZF9lbnRyaWVzKGVudHJ5X2FycmF5LCBzaXplX3R5cGUpOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZG9fcmVzaXplX2lmX25lZWRlZCgpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpOworCisgICAgICB2b2lkCisgICAgICByZXNpemVfaW1wKHNpemVfdHlwZSk7CisKKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgZG9fcmVzaXplKHNpemVfdHlwZSk7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZV9pbXAoZW50cnlfYXJyYXksIHNpemVfdHlwZSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICByZXNpemVfaW1wX3JlYXNzaWduKGVudHJ5X3BvaW50ZXIsIGVudHJ5X2FycmF5LCBmYWxzZV90eXBlKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHJlc2l6ZV9pbXBfcmVhc3NpZ24oZW50cnlfcG9pbnRlciwgZW50cnlfYXJyYXksIHRydWVfdHlwZSk7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIGZpbmRfaW5zX3BvcyhrZXlfY29uc3RfcmVmZXJlbmNlLCBmYWxzZV90eXBlKTsKKworICAgICAgaW5saW5lIGNvbXBfaGFzaAorICAgICAgZmluZF9pbnNfcG9zKGtleV9jb25zdF9yZWZlcmVuY2UsIHRydWVfdHlwZSk7CisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnRfaW1wKGNvbnN0X3JlZmVyZW5jZSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnRfaW1wKGNvbnN0X3JlZmVyZW5jZSwgdHJ1ZV90eXBlKTsKKworICAgICAgaW5saW5lIHBvaW50ZXIKKyAgICAgIGluc2VydF9uZXdfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgc2l6ZV90eXBlIHBvcykKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9lbnRyaWVzW3Bvc10ubV9zdGF0ICE9IHZhbGlkX2VudHJ5X3N0YXR1cyk7CisKKwlpZiAoZG9fcmVzaXplX2lmX25lZWRlZCgpKQorCSAgcG9zID0gZmluZF9pbnNfcG9zKFBCX0RTX1YyRihyX3ZhbCksCisJCQkgICAgIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7CisKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9lbnRyaWVzW3Bvc10ubV9zdGF0ICE9IHZhbGlkX2VudHJ5X3N0YXR1cyk7CisJZW50cnkqIGNvbnN0IHBfZSA9IG1fZW50cmllcyArIHBvczsKKwluZXcgKCZwX2UtPm1fdmFsdWUpIHZhbHVlX3R5cGUocl92YWwpOworCXBfZS0+bV9zdGF0ID0gdmFsaWRfZW50cnlfc3RhdHVzOworCXJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0ZWQoKyttX251bV91c2VkX2UpOworCisJX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpKTspCisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisJcmV0dXJuICZwX2UtPm1fdmFsdWU7CisgICAgICB9CisKKyAgICAgIGlubGluZSBwb2ludGVyCisgICAgICBpbnNlcnRfbmV3X2ltcChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIGNvbXBfaGFzaCYgcl9wb3NfaGFzaF9wYWlyKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX2VudHJpZXNbcl9wb3NfaGFzaF9wYWlyLmZpcnN0XS5tX3N0YXQgIT0KKwkJCSAgICAgIHZhbGlkX2VudHJ5X3N0YXR1cyk7CisKKwlpZiAoZG9fcmVzaXplX2lmX25lZWRlZCgpKQorCSAgcl9wb3NfaGFzaF9wYWlyID0gZmluZF9pbnNfcG9zKFBCX0RTX1YyRihyX3ZhbCksCisJCQkJCSB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fZW50cmllc1tyX3Bvc19oYXNoX3BhaXIuZmlyc3RdLm1fc3RhdCAhPQorCQkJICAgICAgdmFsaWRfZW50cnlfc3RhdHVzKTsKKworCWVudHJ5KiBjb25zdCBwX2UgPSBtX2VudHJpZXMgKyByX3Bvc19oYXNoX3BhaXIuZmlyc3Q7CisJbmV3ICgmcF9lLT5tX3ZhbHVlKSB2YWx1ZV90eXBlKHJfdmFsKTsKKwlwX2UtPm1faGFzaCA9IHJfcG9zX2hhc2hfcGFpci5zZWNvbmQ7CisJcF9lLT5tX3N0YXQgPSB2YWxpZF9lbnRyeV9zdGF0dXM7CisKKwlyZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydGVkKCsrbV9udW1fdXNlZF9lKTsKKworCV9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSk7KQorCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCXJldHVybiAmcF9lLT5tX3ZhbHVlOworICAgICAgfQorCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIHN1YnNjcmlwdF9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSBrZXksIGZhbHNlX3R5cGUpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisKKwljb25zdCBzaXplX3R5cGUgcG9zID0gZmluZF9pbnNfcG9zKGtleSwKKwkJCQkJIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7CisKKwllbnRyeV9wb2ludGVyIHBfZSA9ICZtX2VudHJpZXNbcG9zXTsKKwlpZiAocF9lLT5tX3N0YXQgIT0gdmFsaWRfZW50cnlfc3RhdHVzKQorCSAgcmV0dXJuIGluc2VydF9uZXdfaW1wKHZhbHVlX3R5cGUoa2V5LCBtYXBwZWRfdHlwZSgpKSwgcG9zKS0+c2Vjb25kOworCisJUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhrZXkpCisJcmV0dXJuIHBfZS0+bV92YWx1ZS5zZWNvbmQ7CisgICAgICB9CisKKyAgICAgIGlubGluZSBtYXBwZWRfcmVmZXJlbmNlCisgICAgICBzdWJzY3JpcHRfaW1wKGtleV9jb25zdF9yZWZlcmVuY2Uga2V5LCB0cnVlX3R5cGUpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisKKwljb21wX2hhc2ggcG9zX2hhc2hfcGFpciA9IGZpbmRfaW5zX3BvcyhrZXksCisJCQkJCSB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworCisJaWYgKG1fZW50cmllc1twb3NfaGFzaF9wYWlyLmZpcnN0XS5tX3N0YXQgIT0gdmFsaWRfZW50cnlfc3RhdHVzKQorCSAgcmV0dXJuIGluc2VydF9uZXdfaW1wKHZhbHVlX3R5cGUoa2V5LCBtYXBwZWRfdHlwZSgpKSwKKwkJCQkgcG9zX2hhc2hfcGFpciktPnNlY29uZDsKKworCVBCX0RTX0NIRUNLX0tFWV9FWElTVFMoa2V5KQorCXJldHVybiAobV9lbnRyaWVzICsgcG9zX2hhc2hfcGFpci5maXJzdCktPm1fdmFsdWUuc2Vjb25kOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlubGluZSBwb2ludGVyCisgICAgICBmaW5kX2tleV9wb2ludGVyKGtleV9jb25zdF9yZWZlcmVuY2Uga2V5LCBmYWxzZV90eXBlKQorICAgICAgeworCWNvbnN0IHNpemVfdHlwZSBoYXNoID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoa2V5KTsKKwlyZXNpemVfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX3N0YXJ0KCk7CisKKwkvLyBMb29wIHVudGlsIGVudHJ5IGlzIGZvdW5kIG9yIHVudGlsIGFsbCBwb3NzaWJsZSBlbnRyaWVzIGFjY2Vzc2VkLgorCWZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9udW1fZTsgKytpKQorCSAgeworCSAgICBjb25zdCBzaXplX3R5cGUgcG9zID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoa2V5LAorCQkJCQkJCQkgICBoYXNoLCBpKTsKKworCSAgICBlbnRyeSogY29uc3QgcF9lID0gbV9lbnRyaWVzICsgcG9zOworCSAgICBzd2l0Y2ggKHBfZS0+bV9zdGF0KQorCSAgICAgIHsKKwkgICAgICBjYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKwkJeworCQkgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7CisJCSAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKGtleSkKKwkJICByZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwkgICAgICBjYXNlIHZhbGlkX2VudHJ5X3N0YXR1czoKKwkJaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwga2V5KSkKKwkJICB7CisJCSAgICByZXNpemVfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOworCQkgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhrZXkpCisJCSAgICByZXR1cm4gcG9pbnRlcigmcF9lLT5tX3ZhbHVlKTsKKwkJICB9CisJCWJyZWFrOworCSAgICAgIGNhc2UgZXJhc2VkX2VudHJ5X3N0YXR1czoKKwkJYnJlYWs7CisJICAgICAgZGVmYXVsdDoKKwkJX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworCSAgICAgIH07CisKKwkgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKTsKKwkgIH0KKworCVBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChrZXkpCisJcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50ZXIKKyAgICAgIGZpbmRfa2V5X3BvaW50ZXIoa2V5X2NvbnN0X3JlZmVyZW5jZSBrZXksIHRydWVfdHlwZSkKKyAgICAgIHsKKwljb21wX2hhc2ggcG9zX2hhc2hfcGFpciA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKGtleSk7CisJcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpOworCisJLy8gTG9vcCB1bnRpbCBlbnRyeSBpcyBmb3VuZCBvciB1bnRpbCBhbGwgcG9zc2libGUgZW50cmllcyBhY2Nlc3NlZC4KKwlmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKwkgIHsKKwkgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9CisJICAgICAgcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoa2V5LCBwb3NfaGFzaF9wYWlyLnNlY29uZCwgaSk7CisKKwkgICAgZW50cnkqIGNvbnN0IHBfZSA9IG1fZW50cmllcyArIHBvczsKKworCSAgICBzd2l0Y2gocF9lLT5tX3N0YXQpCisJICAgICAgeworCSAgICAgIGNhc2UgZW1wdHlfZW50cnlfc3RhdHVzOgorCQl7CisJCSAgcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKwkJICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qoa2V5KQorCQkgIHJldHVybiAwOworCQl9CisJCWJyZWFrOworCSAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCQlpZiAoaGFzaF9lcV9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpLAorCQkJCQkJcF9lLT5tX2hhc2gsCisJCQkJCQlrZXksIHBvc19oYXNoX3BhaXIuc2Vjb25kKSkKKwkJICB7CisJCSAgICByZXNpemVfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOworCQkgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhrZXkpCisJCSAgICByZXR1cm4gcG9pbnRlcigmcF9lLT5tX3ZhbHVlKTsKKwkJICB9CisJCWJyZWFrOworCSAgICAgIGNhc2UgZXJhc2VkX2VudHJ5X3N0YXR1czoKKwkJYnJlYWs7CisJICAgICAgZGVmYXVsdDoKKwkJX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworCSAgICAgIH07CisKKwkgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKTsKKwkgIH0KKworCVBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChrZXkpCisJcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVyYXNlX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlLCB0cnVlX3R5cGUpOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZXJhc2VfaW1wKGtleV9jb25zdF9yZWZlcmVuY2UsIGZhbHNlX3R5cGUpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZXJhc2VfZW50cnkoZW50cnlfcG9pbnRlcik7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICB2b2lkCisgICAgICBpbmNfaXRfc3RhdGUocG9pbnRlciYgcl9wX3ZhbHVlLCBzaXplX3R5cGUmIHJfcG9zKSBjb25zdAorICAgICAgeyBpbmNfaXRfc3RhdGUoKG1hcHBlZF9jb25zdF9wb2ludGVyJiApcl9wX3ZhbHVlLCByX3Bvcyk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBpbmNfaXRfc3RhdGUoY29uc3RfcG9pbnRlciYgcl9wX3ZhbHVlLCBzaXplX3R5cGUmIHJfcG9zKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChyX3BfdmFsdWUgIT0gMCk7CisJZm9yICgrK3JfcG9zOyByX3BvcyA8IG1fbnVtX2U7ICsrcl9wb3MpCisJICB7CisJICAgIGNvbnN0X2VudHJ5X3BvaW50ZXIgcF9lID0mIG1fZW50cmllc1tyX3Bvc107CisJICAgIGlmIChwX2UtPm1fc3RhdCA9PSB2YWxpZF9lbnRyeV9zdGF0dXMpCisJICAgICAgeworCQlyX3BfdmFsdWUgPSYgcF9lLT5tX3ZhbHVlOworCQlyZXR1cm47CisJICAgICAgfQorCSAgfQorCXJfcF92YWx1ZSA9IDA7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGdldF9zdGFydF9pdF9zdGF0ZShjb25zdF9wb2ludGVyJiByX3BfdmFsdWUsIHNpemVfdHlwZSYgcl9wb3MpIGNvbnN0CisgICAgICB7CisJZm9yIChyX3BvcyA9IDA7IHJfcG9zIDwgbV9udW1fZTsgKytyX3BvcykKKwkgIHsKKwkgICAgY29uc3RfZW50cnlfcG9pbnRlciBwX2UgPSAmbV9lbnRyaWVzW3JfcG9zXTsKKwkgICAgaWYgKHBfZS0+bV9zdGF0ID09IHZhbGlkX2VudHJ5X3N0YXR1cykKKwkgICAgICB7CisJCXJfcF92YWx1ZSA9ICZwX2UtPm1fdmFsdWU7CisJCXJldHVybjsKKwkgICAgICB9CisJICB9CisJcl9wX3ZhbHVlID0gMDsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgZ2V0X3N0YXJ0X2l0X3N0YXRlKHBvaW50ZXImIHJfcF92YWx1ZSwgc2l6ZV90eXBlJiByX3BvcykKKyAgICAgIHsKKwlmb3IgKHJfcG9zID0gMDsgcl9wb3MgPCBtX251bV9lOyArK3JfcG9zKQorCSAgeworCSAgICBlbnRyeV9wb2ludGVyIHBfZSA9ICZtX2VudHJpZXNbcl9wb3NdOworCSAgICBpZiAocF9lLT5tX3N0YXQgPT0gdmFsaWRfZW50cnlfc3RhdHVzKQorCSAgICAgIHsKKwkJcl9wX3ZhbHVlID0gJnBfZS0+bV92YWx1ZTsKKwkJcmV0dXJuOworCSAgICAgIH0KKwkgIH0KKwlyX3BfdmFsdWUgPSAwOworICAgICAgfQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9lbnRyeV9hcnJheV92YWxpZChjb25zdCBlbnRyeV9hcnJheSwgZmFsc2VfdHlwZSwKKwkJCSAgICAgICBjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X2VudHJ5X2FycmF5X3ZhbGlkKGNvbnN0IGVudHJ5X2FycmF5LCB0cnVlX3R5cGUsCisJCQkgICAgICAgY29uc3QgY2hhciosIGludCkgY29uc3Q7CisjZW5kaWYKKworICAgICAgc3RhdGljIGVudHJ5X2FsbG9jYXRvciAJc19lbnRyeV9hbGxvY2F0b3I7CisgICAgICBzdGF0aWMgaXRlcmF0b3IgCQlzX2VuZF9pdDsKKyAgICAgIHN0YXRpYyBjb25zdF9pdGVyYXRvciAJc19jb25zdF9lbmRfaXQ7CisKKyAgICAgIHNpemVfdHlwZSAJCW1fbnVtX2U7CisgICAgICBzaXplX3R5cGUgCQltX251bV91c2VkX2U7CisgICAgICBlbnRyeV9wb2ludGVyIAkJbV9lbnRyaWVzOworCisgICAgICBlbnVtCisJeworCSAgc3RvcmVfaGFzaF9vayA9ICFTdG9yZV9IYXNoCisJCQkgIHx8ICFpc19zYW1lPEhhc2hfRm4sIF9fZ251X3BiZHM6Om51bGxfdHlwZT46OnZhbHVlCisJfTsKKworICAgICAgUEJfRFNfU1RBVElDX0FTU0VSVChzdGgsIHN0b3JlX2hhc2hfb2spOworICAgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcmVzaXplX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luZm9fZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pdGVyYXRvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vdHJhY2VfZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfSEFTSF9FUV9GTl9DX0RFQworI3VuZGVmIFBCX0RTX1JBTkdFRF9QUk9CRV9GTl9DX0RFQworI3VuZGVmIFBCX0RTX0dQX0hBU0hfVFJBSVRTX0JBU0UKKyN1bmRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQworI3VuZGVmIFBCX0RTX0dQX0hBU0hfTkFNRQorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5mb19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5mb19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzBmZjBjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgZW50aXJlIGNvbnRhaW5lciBpbmZvIHJlbGF0ZWQKKyAqIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NpemUoKSBjb25zdAoreyByZXR1cm4gbV9udW1fdXNlZF9lOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWF4X3NpemUoKSBjb25zdAoreyByZXR1cm4gc19lbnRyeV9hbGxvY2F0b3IubWF4X3NpemUoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VtcHR5KCkgY29uc3QKK3sgcmV0dXJuIChzaXplKCkgPT0gMCk7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwNTY3ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNDMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBpbnNlcnQgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWEwOTg5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDExMSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgaW5zZXJ0IHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBub3Qgc3RvcmVkLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9pbnNfcG9zKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIGZhbHNlX3R5cGUpCit7CisgIHNpemVfdHlwZSBoYXNoID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworICBzaXplX3R5cGUgaTsKKworICAvKiBUaGUgaW5zZXJ0aW9uIHBvc2l0aW9uIGlzIGluaXR0ZWQgdG8gYSBub24tbGVnYWwgdmFsdWUgdG8gaW5kaWNhdGUKKyAgICogICAgIHRoYXQgaXQgaGFzIG5vdCBiZWVuIGluaXR0ZWQgeWV0LgorICAgKi8KKyAgc2l6ZV90eXBlIGluc19wb3MgPSBtX251bV9lOworICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKyAgZm9yIChpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgcG9zID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXksIGhhc2gsIGkpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBvcyA8IG1fbnVtX2UpOworICAgICAgZW50cnkqIGNvbnN0IHBfZSA9IG1fZW50cmllcyArIHBvczsKKyAgICAgIHN3aXRjaChwX2UtPm1fc3RhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKwkgIHsKKyAgICAgICAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKwkgICAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorCSAgICByZXR1cm4gKGluc19wb3MgPT0gbV9udW1fZSkgPyBwb3MgOiBpbnNfcG9zOworCSAgfQorCSAgYnJlYWs7CisgICAgICAgIGNhc2UgZXJhc2VkX2VudHJ5X3N0YXR1czoKKwkgIGlmIChpbnNfcG9zID09IG1fbnVtX2UpCisJICAgIGluc19wb3MgPSBwb3M7CisJICBicmVhazsKKyAgICAgICAgY2FzZSB2YWxpZF9lbnRyeV9zdGF0dXM6CisJICBpZiAoaGFzaF9lcV9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpLCByX2tleSkpCisgICAgICAgICAgICB7CisJICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOworCSAgICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBvczsKKyAgICAgICAgICAgIH0KKwkgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworICAgICAgICB9OworCisgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7CisgICAgfQorICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisgIGlmIChpbnNfcG9zID09IG1fbnVtX2UpCisgICAgX190aHJvd19pbnNlcnRfZXJyb3IoKTsKKyAgcmV0dXJuIGluc19wb3M7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgc3RkOjpwYWlyPHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvciwgYm9vbD4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydF9pbXAoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCBmYWxzZV90eXBlKQoreworICBrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5ID0gUEJfRFNfVjJGKHJfdmFsKTsKKyAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IGZpbmRfaW5zX3BvcyhyX2tleSwgCisJCQkJICAgICB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworCisgIGlmIChtX2VudHJpZXNbcG9zXS5tX3N0YXQgPT0gdmFsaWRfZW50cnlfc3RhdHVzKQorICAgIHsKKyAgICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoJihtX2VudHJpZXMgKyBwb3MpLT5tX3ZhbHVlLCBmYWxzZSk7CisgICAgfQorCisgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGluc2VydF9uZXdfaW1wKHJfdmFsLCBwb3MpLCB0cnVlKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwMjAwMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMTggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGZpbmQgcmVsYXRlZCBmdW5jdGlvbnMsCisgKiB3aGVuIHRoZSBoYXNoIHZhbHVlIGlzIHN0b3JlZC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb21wX2hhc2gKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfaW5zX3BvcyhrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCB0cnVlX3R5cGUpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBjb21wX2hhc2ggcG9zX2hhc2hfcGFpciA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KTsKKworICBzaXplX3R5cGUgaTsKKworICAvKiBUaGUgaW5zZXJ0aW9uIHBvc2l0aW9uIGlzIGluaXR0ZWQgdG8gYSBub24tbGVnYWwgdmFsdWUgdG8gaW5kaWNhdGUKKyAgICogICAgIHRoYXQgaXQgaGFzIG5vdCBiZWVuIGluaXR0ZWQgeWV0LgorICAgKi8KKyAgc2l6ZV90eXBlIGluc19wb3MgPSBtX251bV9lOworICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKyAgZm9yIChpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgcG9zID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXksIHBvc19oYXNoX3BhaXIuc2Vjb25kLCBpKTsKKworICAgICAgZW50cnkqIGNvbnN0IHBfZSA9IG1fZW50cmllcyArIHBvczsKKyAgICAgIHN3aXRjaChwX2UtPm1fc3RhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKwkgIHsKKyAgICAgICAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKwkgICAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorCisJICAgIHJldHVybiAoKGluc19wb3MgPT0gbV9udW1fZSkgPworCQkgICAgIHN0ZDo6bWFrZV9wYWlyKHBvcywgcG9zX2hhc2hfcGFpci5zZWNvbmQpIDoKKwkJICAgICBzdGQ6Om1ha2VfcGFpcihpbnNfcG9zLCBwb3NfaGFzaF9wYWlyLnNlY29uZCkpOworCSAgfQorCSAgYnJlYWs7CisgICAgICAgIGNhc2UgZXJhc2VkX2VudHJ5X3N0YXR1czoKKwkgIGlmIChpbnNfcG9zID09IG1fbnVtX2UpCisJICAgIGluc19wb3MgPSBwb3M7CisJICBicmVhazsKKyAgICAgICAgY2FzZSB2YWxpZF9lbnRyeV9zdGF0dXM6CisJICBpZiAoaGFzaF9lcV9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpLCBwX2UtPm1faGFzaCwKKwkJCQkJICByX2tleSwgcG9zX2hhc2hfcGFpci5zZWNvbmQpKQorICAgICAgICAgICAgeworCSAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKwkgICAgICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorICAgICAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocG9zLCBwb3NfaGFzaF9wYWlyLnNlY29uZCk7CisgICAgICAgICAgICB9CisJICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCgwKTsKKyAgICAgICAgfTsKKyAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9jb2xsaXNpb24oKTsKKyAgICB9CisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKyAgaWYgKGluc19wb3MgPT0gbV9udW1fZSkKKyAgICBfX3Rocm93X2luc2VydF9lcnJvcigpOworICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaW5zX3BvcywgcG9zX2hhc2hfcGFpci5zZWNvbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHN0ZDo6cGFpcjx0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IsIGJvb2w+CitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnRfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgdHJ1ZV90eXBlKQoreworICBrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5ID0gUEJfRFNfVjJGKHJfdmFsKTsKKyAgY29tcF9oYXNoIHBvc19oYXNoX3BhaXIgPSBmaW5kX2luc19wb3Mocl9rZXksIAorCQkJCQkgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocG9zX2hhc2hfcGFpci5maXJzdCA8IG1fbnVtX2UpOworICBlbnRyeV9wb2ludGVyIHBfZSA9JiBtX2VudHJpZXNbcG9zX2hhc2hfcGFpci5maXJzdF07CisgIGlmIChwX2UtPm1fc3RhdCA9PSB2YWxpZF9lbnRyeV9zdGF0dXMpCisgICAgeworICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhyX2tleSkKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigmcF9lLT5tX3ZhbHVlLCBmYWxzZSk7CisgICAgfQorCisgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGluc2VydF9uZXdfaW1wKHJfdmFsLCBwb3NfaGFzaF9wYWlyKSwgdHJ1ZSk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaXRlcmF0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2l0ZXJhdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNjQxNGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2l0ZXJhdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsODMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL2l0ZXJhdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGl0ZXJhdG9ycyByZWxhdGVkIGZ1bmN0aW9ucywgZS5nLiwKKyAqIGJlZ2luKCkuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfZW5kX2l0OworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c19jb25zdF9lbmRfaXQ7CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitiZWdpbigpCit7CisgIHBvaW50ZXJfIHBfdmFsdWU7CisgIHNpemVfdHlwZSBwb3M7CisgIGdldF9zdGFydF9pdF9zdGF0ZShwX3ZhbHVlLCBwb3MpOworICByZXR1cm4gaXRlcmF0b3IocF92YWx1ZSwgcG9zLCB0aGlzKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpCit7IHJldHVybiBzX2VuZF9pdDsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKSBjb25zdAoreworICBjb25zdF9wb2ludGVyXyBwX3ZhbHVlOworICBzaXplX3R5cGUgcG9zOworICBnZXRfc3RhcnRfaXRfc3RhdGUocF92YWx1ZSwgcG9zKTsKKyAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHBfdmFsdWUsIHBvcywgdGhpcyk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlbmQoKSBjb25zdAoreyByZXR1cm4gc19jb25zdF9lbmRfaXQ7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZjNjNTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgcG9saWN5IGFncGVzcworICogZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitIYXNoX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9oYXNoX2ZuKCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBIYXNoX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9oYXNoX2ZuKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitFcV9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfZXFfZm4oKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IEVxX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9lcV9mbigpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworUHJvYmVfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X3Byb2JlX2ZuKCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBQcm9iZV9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfcHJvYmVfZm4oKSBjb25zdAoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK0NvbWJfUHJvYmVfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2NvbWJfcHJvYmVfZm4oKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IENvbWJfUHJvYmVfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2NvbWJfcHJvYmVfZm4oKSBjb25zdAoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1Jlc2l6ZV9Qb2xpY3kmIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X3Jlc2l6ZV9wb2xpY3koKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IFJlc2l6ZV9Qb2xpY3kmIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X3Jlc2l6ZV9wb2xpY3koKSBjb25zdAoreyByZXR1cm4gKnRoaXM7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcmVzaXplX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5ODA5ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcmVzaXplX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTM5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgcmVzaXplIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZG9fcmVzaXplX2lmX25lZWRlZCgpCit7CisgIGlmICghcmVzaXplX2Jhc2U6OmlzX3Jlc2l6ZV9uZWVkZWQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJlc2l6ZV9pbXAocmVzaXplX2Jhc2U6OmdldF9uZXdfc2l6ZShtX251bV9lLCBtX251bV91c2VkX2UpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citkb19yZXNpemUoc2l6ZV90eXBlIG4pCit7IHJlc2l6ZV9pbXAocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKG4pKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2RvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKQoreworICBpZiAoIXJlc2l6ZV9iYXNlOjppc19yZXNpemVfbmVlZGVkKCkpCisgICAgcmV0dXJuOworCisgIF9fdHJ5CisgICAgeworICAgICAgcmVzaXplX2ltcChyZXNpemVfYmFzZTo6Z2V0X25ld19zaXplKG1fbnVtX2UsIG1fbnVtX3VzZWRfZSkpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeyB9CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZXNpemVfaW1wKHNpemVfdHlwZSBuZXdfc2l6ZSkKK3sKKyNpZmRlZiBQQl9EU19SRUdSRVNTSU9OCisgIHR5cGVuYW1lIF9BbGxvYzo6Z3JvdXBfYWRqdXN0b3IgYWRqdXN0KG1fbnVtX2UpOworI2VuZGlmIAorCisgIGlmIChuZXdfc2l6ZSA9PSBtX251bV9lKQorICAgIHJldHVybjsKKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgY29uc3Qgc2l6ZV90eXBlIG9sZF9zaXplID0gbV9udW1fZTsKKyAgZW50cnlfYXJyYXkgYV9lbnRyaWVzX3Jlc2l6ZWQgPSAwOworCisgIC8vIEZvbGxvd2luZyBsaW5lIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgYV9lbnRyaWVzX3Jlc2l6ZWQgPSBzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShuZXdfc2l6ZSk7CisKKyAgcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKG5ld19zaXplKTsKKyAgbV9udW1fZSA9IG5ld19zaXplOworCisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9udW1fZTsgKytpKQorICAgIGFfZW50cmllc19yZXNpemVkW2ldLm1fc3RhdCA9IGVtcHR5X2VudHJ5X3N0YXR1czsKKworICBfX3RyeQorICAgIHsKKyAgICAgIHJlc2l6ZV9pbXAoYV9lbnRyaWVzX3Jlc2l6ZWQsIG9sZF9zaXplKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIGVyYXNlX2FsbF92YWxpZF9lbnRyaWVzKGFfZW50cmllc19yZXNpemVkLCBuZXdfc2l6ZSk7CisgICAgICBtX251bV9lID0gb2xkX3NpemU7CisgICAgICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKGFfZW50cmllc19yZXNpemVkLCBuZXdfc2l6ZSk7CisgICAgICByYW5nZWRfcHJvYmVfZm5fYmFzZTo6bm90aWZ5X3Jlc2l6ZWQob2xkX3NpemUpOworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorCisgIC8vIEF0IHRoaXMgcG9pbnQgbm8gZXhjZXB0aW9ucyBjYW4gYmUgdGhyb3duLgorICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF9lbnRyeV9hcnJheV92YWxpZChhX2VudHJpZXNfcmVzaXplZCwKKwkJCQkJICAgICAgIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvciwKKwkJCQkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisgIFJlc2l6ZV9Qb2xpY3k6Om5vdGlmeV9yZXNpemVkKG5ld19zaXplKTsKKyAgZXJhc2VfYWxsX3ZhbGlkX2VudHJpZXMobV9lbnRyaWVzLCBvbGRfc2l6ZSk7CisgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9lbnRyaWVzLCBvbGRfc2l6ZSk7CisgIG1fZW50cmllcyA9IGFfZW50cmllc19yZXNpemVkOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3Jlc2l6ZV9pbXAoZW50cnlfYXJyYXkgYV9lbnRyaWVzX3Jlc2l6ZWQsIHNpemVfdHlwZSBvbGRfc2l6ZSkKK3sKKyAgZm9yIChzaXplX3R5cGUgcG9zID0gMDsgcG9zIDwgb2xkX3NpemU7ICsrcG9zKQorICAgIGlmIChtX2VudHJpZXNbcG9zXS5tX3N0YXQgPT0gdmFsaWRfZW50cnlfc3RhdHVzKQorICAgICAgcmVzaXplX2ltcF9yZWFzc2lnbihtX2VudHJpZXMgKyBwb3MsIGFfZW50cmllc19yZXNpemVkLCAKKwkJCSAgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKK30KKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDc2OWJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDcyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyByZXNpemUgcmVsYXRlZCBmdW5jdGlvbnMsIHdoZW4gdGhlCisgKiBoYXNoIHZhbHVlIGlzIG5vdCBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZXNpemVfaW1wX3JlYXNzaWduKGVudHJ5X3BvaW50ZXIgcF9lLCBlbnRyeV9hcnJheSBhX2VudHJpZXNfcmVzaXplZCwgCisJCSAgICBmYWxzZV90eXBlKQoreworICBrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5ID0gUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSk7CisgIHNpemVfdHlwZSBoYXNoID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworICBzaXplX3R5cGUgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgcG9zID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXksIGhhc2gsIGkpOworICAgICAgZW50cnlfcG9pbnRlciBwX25ld19lID0gYV9lbnRyaWVzX3Jlc2l6ZWQgKyBwb3M7CisgICAgICBzd2l0Y2gocF9uZXdfZS0+bV9zdGF0KQorICAgICAgICB7CisgICAgICAgIGNhc2UgZW1wdHlfZW50cnlfc3RhdHVzOgorCSAgbmV3ICgmcF9uZXdfZS0+bV92YWx1ZSkgdmFsdWVfdHlwZShwX2UtPm1fdmFsdWUpOworCSAgcF9uZXdfZS0+bV9zdGF0ID0gdmFsaWRfZW50cnlfc3RhdHVzOworCSAgcmV0dXJuOworICAgICAgICBjYXNlIGVyYXNlZF9lbnRyeV9zdGF0dXM6CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoMCk7CisJICBicmVhazsKKyAgICAgICAgY2FzZSB2YWxpZF9lbnRyeV9zdGF0dXM6CisJICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCgwKTsKKyAgICAgICAgfTsKKyAgICB9CisgIF9fdGhyb3dfaW5zZXJ0X2Vycm9yKCk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcmVzaXplX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NTFkZjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNzQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIHJlc2l6ZSByZWxhdGVkIGZ1bmN0aW9ucywgd2hlbiB0aGUKKyAqIGhhc2ggdmFsdWUgaXMgc3RvcmVkLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplX2ltcF9yZWFzc2lnbihlbnRyeV9wb2ludGVyIHBfZSwgZW50cnlfYXJyYXkgYV9lbnRyaWVzX3Jlc2l6ZWQsIAorCQkgICAgdHJ1ZV90eXBlKQoreworICBrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5ID0gUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSk7CisgIHNpemVfdHlwZSBoYXNoID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXksIHBfZS0+bV9oYXNoKTsKKworICBzaXplX3R5cGUgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgcG9zID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXksIGhhc2gsIGkpOworICAgICAgZW50cnlfcG9pbnRlciBwX25ld19lID0gYV9lbnRyaWVzX3Jlc2l6ZWQgKyBwb3M7CisgICAgICBzd2l0Y2gocF9uZXdfZS0+bV9zdGF0KQorICAgICAgICB7CisgICAgICAgIGNhc2UgZW1wdHlfZW50cnlfc3RhdHVzOgorCSAgbmV3ICgmcF9uZXdfZS0+bV92YWx1ZSkgdmFsdWVfdHlwZShwX2UtPm1fdmFsdWUpOworCSAgcF9uZXdfZS0+bV9oYXNoID0gaGFzaDsKKwkgIHBfbmV3X2UtPm1fc3RhdCA9IHZhbGlkX2VudHJ5X3N0YXR1czsKKwkgIHJldHVybjsKKyAgICAgICAgY2FzZSBlcmFzZWRfZW50cnlfc3RhdHVzOgorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworCSAgYnJlYWs7CisgICAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCSAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgIH07CisgICAgfQorICBfX3Rocm93X2luc2VydF9lcnJvcigpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3RyYWNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2EzMTkzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDc0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyB0cmFjZS1tb2RlIGZ1bmN0aW9ucy4KKyAqLworCisjaWZkZWYgUEJfRFNfSFRfTUFQX1RSQUNFXworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordHJhY2UoKSBjb25zdAoreworICBzdGQ6OmNlcnIgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obV9udW1fZSkgPDwgIiAiIDw8CisgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obV9udW1fdXNlZF9lKSA8PCBzdGQ6OmVuZGw7CisKKyAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgeworICAgICAgc3RkOjpjZXJyIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGkpIDw8ICIgIjsKKworICAgICAgc3dpdGNoKG1fZW50cmllc1tpXS5tX3N0YXQpCisgICAgICAgIHsKKwljYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKwkgIHN0ZDo6Y2VyciA8PCAiPGVtcHR5PiI7CisJICBicmVhazsKKwljYXNlIGVyYXNlZF9lbnRyeV9zdGF0dXM6CisJICBzdGQ6OmNlcnIgPDwgIjxlcmFzZWQ+IjsKKwkgIGJyZWFrOworCWNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCSAgc3RkOjpjZXJyIDw8IFBCX0RTX1YyRihtX2VudHJpZXNbaV0ubV92YWx1ZSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworCX07CisKKyAgICAgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7CisgICAgfQorfQorCisjZW5kaWYgLy8gI2lmZGVmIFBCX0RTX0hUX01BUF9UUkFDRV8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL2RpcmVjdF9tYXNrX3JhbmdlX2hhc2hpbmdfaW1wLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL2RpcmVjdF9tYXNrX3JhbmdlX2hhc2hpbmdfaW1wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg3MTViCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZ19pbXAuaHBwCkBAIC0wLDAgKzEsNTggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZ19pbXAuaHBwCisgKiBDb250YWlucyBhIHJhbmdlLWhhc2hpbmcgcG9saWN5IGltcGxlbWVudGF0aW9uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreyBtYXNrX2Jhc2VkX2Jhc2U6OnN3YXAob3RoZXIpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfcmVzaXplZChzaXplX3R5cGUgc2l6ZSkKK3sgbWFza19iYXNlZF9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK29wZXJhdG9yKCkoc2l6ZV90eXBlIGhhc2gpIGNvbnN0Cit7IHJldHVybiBtYXNrX2Jhc2VkX2Jhc2U6OnJhbmdlX2hhc2goaGFzaCk7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vZGlyZWN0X21vZF9yYW5nZV9oYXNoaW5nX2ltcC5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9kaXJlY3RfbW9kX3JhbmdlX2hhc2hpbmdfaW1wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQ0NDFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vZGlyZWN0X21vZF9yYW5nZV9oYXNoaW5nX2ltcC5ocHAKQEAgLTAsMCArMSw1OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkaXJlY3RfbW9kX3JhbmdlX2hhc2hpbmdfaW1wLmhwcAorICogQ29udGFpbnMgYSByYW5nZS1oYXNoaW5nIHBvbGljeSBpbXBsZW1lbnRhdGlvbgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sgbW9kX2Jhc2VkX2Jhc2U6OnN3YXAob3RoZXIpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfcmVzaXplZChzaXplX3R5cGUgbikKK3sgbW9kX2Jhc2VkX2Jhc2U6Om5vdGlmeV9yZXNpemVkKG4pOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3BlcmF0b3IoKShzaXplX3R5cGUgaGFzaCkgY29uc3QKK3sgcmV0dXJuIG1vZF9iYXNlZF9iYXNlOjpyYW5nZV9oYXNoKGhhc2gpOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL2xpbmVhcl9wcm9iZV9mbl9pbXAuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vbGluZWFyX3Byb2JlX2ZuX2ltcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkNzY5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL2xpbmVhcl9wcm9iZV9mbl9pbXAuaHBwCkBAIC0wLDAgKzEsNTMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGluZWFyX3Byb2JlX2ZuX2ltcC5ocHAKKyAqIENvbnRhaW5zIGEgcHJvYmUgcG9saWN5IGltcGxlbWVudGF0aW9uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK29wZXJhdG9yKCkoc2l6ZV90eXBlIGkpIGNvbnN0Cit7CisgIHJldHVybiAoaSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9tYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmcuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vbWFza19iYXNlZF9yYW5nZV9oYXNoaW5nLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmU4OTJkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vbWFza19iYXNlZF9yYW5nZV9oYXNoaW5nLmhwcApAQCAtMCwwICsxLDEwMSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBtYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmcuaHBwCisgKiBDb250YWlucyBhIHJhbmdlIGhhc2hpbmcgcG9saWN5IGJhc2UuCisgKi8KKworI2lmbmRlZiBQQl9EU19NQVNLX0JBU0VEX1JBTkdFX0hBU0hJTkdfSFBQCisjZGVmaW5lIFBCX0RTX01BU0tfQkFTRURfUkFOR0VfSEFTSElOR19IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIFJhbmdlIGhhc2hpbmcgcG9saWN5LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyAgICBjbGFzcyBtYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmcKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBTaXplX1R5cGUgCXNpemVfdHlwZTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChtYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmcmIG90aGVyKQorICAgICAgeyBzdGQ6OnN3YXAobV9tYXNrLCBvdGhlci5tX21hc2spOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBzaXplKTsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgcmFuZ2VfaGFzaChzaXplX3R5cGUgaGFzaCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNpemVfdHlwZShoYXNoICYgbV9tYXNrKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdHlwZSAJCW1fbWFzazsKKyAgICAgIGNvbnN0IHN0YXRpYyBzaXplX3R5cGUgCXNfbnVtX2JpdHNfaW5fc2l6ZV90eXBlOworICAgICAgY29uc3Qgc3RhdGljIHNpemVfdHlwZSAJc19oaWdoZXN0X2JpdF8xOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisgICAgY29uc3QgdHlwZW5hbWUgbWFza19iYXNlZF9yYW5nZV9oYXNoaW5nPFNpemVfVHlwZT46OnNpemVfdHlwZQorICAgIG1hc2tfYmFzZWRfcmFuZ2VfaGFzaGluZzxTaXplX1R5cGU+OjpzX251bV9iaXRzX2luX3NpemVfdHlwZSA9CisgICAgICBzaXplb2YodHlwZW5hbWUgbWFza19iYXNlZF9yYW5nZV9oYXNoaW5nPFNpemVfVHlwZT46OnNpemVfdHlwZSkgPDwgMzsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyAgICBjb25zdCB0eXBlbmFtZSBtYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmc8U2l6ZV9UeXBlPjo6c2l6ZV90eXBlIG1hc2tfYmFzZWRfcmFuZ2VfaGFzaGluZzxTaXplX1R5cGU+OjpzX2hpZ2hlc3RfYml0XzEgPSBzdGF0aWNfY2FzdDx0eXBlbmFtZSBtYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmc8U2l6ZV9UeXBlPjo6c2l6ZV90eXBlPigxKSA8PCAoc19udW1fYml0c19pbl9zaXplX3R5cGUgLSAxKTsKKworIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyAgICB2b2lkCisgICAgbWFza19iYXNlZF9yYW5nZV9oYXNoaW5nPFNpemVfVHlwZT46OgorICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBzaXplKQorICAgIHsKKyAgICAgIHNpemVfdHlwZSBpID0gMDsKKyAgICAgIHdoaWxlIChzaXplIF4gc19oaWdoZXN0X2JpdF8xKQorCXsKKwkgIHNpemUgPDw9IDE7CisJICArK2k7CisJfQorCisgICAgICBtX21hc2sgPSAxOworICAgICAgaSArPSAyOworICAgICAgd2hpbGUgKGkrKyA8IHNfbnVtX2JpdHNfaW5fc2l6ZV90eXBlKQorICAgICAgICBtX21hc2sgPSAobV9tYXNrIDw8IDEpIF4gMTsKKyAgICB9CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL21vZF9iYXNlZF9yYW5nZV9oYXNoaW5nLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL21vZF9iYXNlZF9yYW5nZV9oYXNoaW5nLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTNmNjhlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vbW9kX2Jhc2VkX3JhbmdlX2hhc2hpbmcuaHBwCkBAIC0wLDAgKzEsNzQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbW9kX2Jhc2VkX3JhbmdlX2hhc2hpbmcuaHBwCisgKiBDb250YWlucyBhIHJhbmdlIGhhc2hpbmcgcG9saWN5IGJhc2UuCisgKi8KKworI2lmbmRlZiBQQl9EU19NT0RfQkFTRURfUkFOR0VfSEFTSElOR19IUFAKKyNkZWZpbmUgUEJfRFNfTU9EX0JBU0VEX1JBTkdFX0hBU0hJTkdfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBNb2QgYmFzZWQgcmFuZ2UgaGFzaGluZy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisgICAgY2xhc3MgbW9kX2Jhc2VkX3JhbmdlX2hhc2hpbmcKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBTaXplX1R5cGUgCXNpemVfdHlwZTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChtb2RfYmFzZWRfcmFuZ2VfaGFzaGluZyYgb3RoZXIpCisgICAgICB7IHN0ZDo6c3dhcChtX3NpemUsIG90aGVyLm1fc2l6ZSk7IH0KKworICAgICAgdm9pZAorICAgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIHMpCisgICAgICB7IG1fc2l6ZSA9IHM7IH0KKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgcmFuZ2VfaGFzaChzaXplX3R5cGUgcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHMgJSBtX3NpemU7IH0KKworICAgIHByaXZhdGU6CisgICAgICBzaXplX3R5cGUgbV9zaXplOworICAgIH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX01PRF9CQVNFRF9SQU5HRV9IQVNISU5HX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vcHJvYmVfZm5fYmFzZS5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9wcm9iZV9mbl9iYXNlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWFiOWIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vcHJvYmVfZm5fYmFzZS5ocHAKQEAgLTAsMCArMSw2MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwcm9iZV9mbl9iYXNlLmhwcAorICogQ29udGFpbnMgYSBwcm9iZSBwb2xpY3kgYmFzZS4KKyAqLworCisjaWZuZGVmIFBCX0RTX1BST0JFX0ZOX0JBU0VfSFBQCisjZGVmaW5lIFBCX0RTX1BST0JFX0ZOX0JBU0VfSFBQCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gUHJvYmUgZnVuY3RvciBiYXNlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBwcm9iZV9mbl9iYXNlCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIH5wcm9iZV9mbl9iYXNlKCkgeyB9CisgICAgfTsKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9xdWFkcmF0aWNfcHJvYmVfZm5faW1wLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3F1YWRyYXRpY19wcm9iZV9mbl9pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTgzYWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9xdWFkcmF0aWNfcHJvYmVfZm5faW1wLmhwcApAQCAtMCwwICsxLDUzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHF1YWRyYXRpY19wcm9iZV9mbl9pbXAuaHBwCisgKiBDb250YWlucyBhIHByb2JlIHBvbGljeSBpbXBsZW1lbnRhdGlvbgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitvcGVyYXRvcigpKHNpemVfdHlwZSBpKSBjb25zdAoreworICByZXR1cm4gKGkqICBpKTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3JhbmdlZF9oYXNoX2ZuLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3JhbmdlZF9oYXNoX2ZuLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjJiNjg5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vcmFuZ2VkX2hhc2hfZm4uaHBwCkBAIC0wLDAgKzEsMzU5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJhbmdlZF9oYXNoX2ZuLmhwcAorICogQ29udGFpbnMgYSB1bmlmaWVkIHJhbmdlZCBoYXNoIGZ1bmN0b3IsIGFsbG93aW5nIHRoZSBoYXNoIHRhYmxlcworICogdG8gZGVhbCB3aXRoIGEgc2luZ2xlIGNsYXNzIGZvciByYW5nZWQgaGFzaGluZy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1JBTkdFRF9IQVNIX0ZOX0hQUAorI2RlZmluZSBQQl9EU19SQU5HRURfSEFTSF9GTl9IUFAKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIFByaW1hcnkgdGVtcGxhdGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBIYXNoX0ZuLCB0eXBlbmFtZSBfQWxsb2MsIAorCSAgICAgdHlwZW5hbWUgQ29tYl9IYXNoX0ZuLCBib29sIFN0b3JlX0hhc2g+CisgICAgY2xhc3MgcmFuZ2VkX2hhc2hfZm47CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgSGFzaF9GbiwgdHlwZW5hbWUgX0FsbG9jLCBcCisJICAgICB0eXBlbmFtZSBDb21iX0hhc2hfRm4+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIHJhbmdlZF9oYXNoX2ZuPEtleSwJSGFzaF9GbiwgX0FsbG9jLCBDb21iX0hhc2hfRm4sIGZhbHNlPgorCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gMQorICAgICAqIFRoZSBjbGllbnQgc3VwcGxpZXMgYSBoYXNoIGZ1bmN0aW9uIGFuZCBhIHJhbmdlZCBoYXNoIGZ1bmN0aW9uLAorICAgICAqIGFuZCByZXF1ZXN0cyB0aGF0IGhhc2ggdmFsdWVzIG5vdCBiZSBzdG9yZWQuCisgICAgICoqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgSGFzaF9GbiwgdHlwZW5hbWUgX0FsbG9jLCAKKwkgICAgIHR5cGVuYW1lIENvbWJfSGFzaF9Gbj4KKyAgICBjbGFzcyByYW5nZWRfaGFzaF9mbjwgS2V5LCBIYXNoX0ZuLCBfQWxsb2MsIENvbWJfSGFzaF9GbiwgZmFsc2U+IAorICAgIDogcHVibGljIEhhc2hfRm4sIHB1YmxpYyBDb21iX0hhc2hfRm4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIEhhc2hfRm4gaGFzaF9mbl9iYXNlOworICAgICAgdHlwZWRlZiBDb21iX0hhc2hfRm4gY29tYl9oYXNoX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPCBLZXk+OjpvdGhlciBrZXlfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfYWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2Uga2V5X2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlKTsKKworICAgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlLCBjb25zdCBIYXNoX0ZuJik7CisKKyAgICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSwgY29uc3QgSGFzaF9GbiYsIGNvbnN0IENvbWJfSGFzaF9GbiYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSk7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisgICAgfTsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSBzaXplKQorICAgIHsgQ29tYl9IYXNoX0ZuOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlIHNpemUsIGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbikgCisgICAgOiBIYXNoX0ZuKHJfaGFzaF9mbikKKyAgICB7IENvbWJfSGFzaF9Gbjo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIAorCQkgICBjb25zdCBDb21iX0hhc2hfRm4mIHJfY29tYl9oYXNoX2ZuKSAKKyAgICA6IEhhc2hfRm4ocl9oYXNoX2ZuKSwgQ29tYl9IYXNoX0ZuKHJfY29tYl9oYXNoX2ZuKQorICAgIHsgY29tYl9oYXNoX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCisgICAgeworICAgICAgY29tYl9oYXNoX2ZuX2Jhc2U6OnN3YXAob3RoZXIpOworICAgICAgc3RkOjpzd2FwKChIYXNoX0ZuJiApKCp0aGlzKSwgKEhhc2hfRm4mIClvdGhlcik7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBzaXplKQorICAgIHsgY29tYl9oYXNoX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKKyAgICB7IHJldHVybiAoY29tYl9oYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KSkpO30KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBIYXNoX0ZuLCB0eXBlbmFtZSBfQWxsb2MsIFwKKwkgICAgIHR5cGVuYW1lIENvbWJfSGFzaF9Gbj4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgcmFuZ2VkX2hhc2hfZm48S2V5LEhhc2hfRm4sCV9BbGxvYywgQ29tYl9IYXNoX0ZuLCB0cnVlPgorCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gMgorICAgICAqIFRoZSBjbGllbnQgc3VwcGxpZXMgYSBoYXNoIGZ1bmN0aW9uIGFuZCBhIHJhbmdlZCBoYXNoIGZ1bmN0aW9uLAorICAgICAqIGFuZCByZXF1ZXN0cyB0aGF0IGhhc2ggdmFsdWVzIGJlIHN0b3JlZC4KKyAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBIYXNoX0ZuLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgICB0eXBlbmFtZSBDb21iX0hhc2hfRm4+CisgICAgY2xhc3MgcmFuZ2VkX2hhc2hfZm48S2V5LCBIYXNoX0ZuLCBfQWxsb2MsIENvbWJfSGFzaF9GbiwgdHJ1ZT4gCisgICAgOiBwdWJsaWMgSGFzaF9GbiwgcHVibGljIENvbWJfSGFzaF9GbgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPHNpemVfdHlwZSwgc2l6ZV90eXBlPiBjb21wX2hhc2g7CisgICAgICB0eXBlZGVmIEhhc2hfRm4gaGFzaF9mbl9iYXNlOworICAgICAgdHlwZWRlZiBDb21iX0hhc2hfRm4gY29tYl9oYXNoX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyIGtleV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGtleV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBrZXlfY29uc3RfcmVmZXJlbmNlOworCisgICAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUpOworCisgICAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUsIGNvbnN0IEhhc2hfRm4mKTsKKworICAgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlLCBjb25zdCBIYXNoX0ZuJiwgY29uc3QgQ29tYl9IYXNoX0ZuJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlKTsKKworICAgICAgaW5saW5lIGNvbXBfaGFzaAorICAgICAgb3BlcmF0b3IoKShrZXlfY29uc3RfcmVmZXJlbmNlKSBjb25zdDsKKworICAgICAgaW5saW5lIGNvbXBfaGFzaAorICAgICAgb3BlcmF0b3IoKShrZXlfY29uc3RfcmVmZXJlbmNlLCBzaXplX3R5cGUpIGNvbnN0OworICAgIH07CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUgc2l6ZSkKKyAgICB7IENvbWJfSGFzaF9Gbjo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4pIDoKKyAgICAgIEhhc2hfRm4ocl9oYXNoX2ZuKQorICAgIHsgQ29tYl9IYXNoX0ZuOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlIHNpemUsIGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbiwgCisJCSAgIGNvbnN0IENvbWJfSGFzaF9GbiYgcl9jb21iX2hhc2hfZm4pIAorICAgIDogSGFzaF9GbihyX2hhc2hfZm4pLCBDb21iX0hhc2hfRm4ocl9jb21iX2hhc2hfZm4pCisgICAgeyBjb21iX2hhc2hfZm5fYmFzZTo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKyAgICB7CisgICAgICBjb21iX2hhc2hfZm5fYmFzZTo6c3dhcChvdGhlcik7CisgICAgICBzdGQ6OnN3YXAoKEhhc2hfRm4mICkoKnRoaXMpLCAoSGFzaF9GbiYgKW90aGVyKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIHNpemUpCisgICAgeyBjb21iX2hhc2hfZm5fYmFzZTo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb21wX2hhc2gKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgb3BlcmF0b3IoKShrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBoYXNoID0gaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihjb21iX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShoYXNoKSwgaGFzaCk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbXBfaGFzaAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBvcGVyYXRvcigpCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBzaXplX3R5cGUgaGFzaCkgY29uc3QKKyNlbHNlIAorICAgICAgKGtleV9jb25zdF9yZWZlcmVuY2UgLypyX2tleSovLCBzaXplX3R5cGUgaGFzaCkgY29uc3QKKyNlbmRpZgorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChoYXNoID09IGhhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSkpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbWJfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKGhhc2gpLCBoYXNoKTsKKyAgICB9CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBDb21iX0hhc2hfRm4+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIHJhbmdlZF9oYXNoX2ZuPEtleSwJbnVsbF90eXBlLCBfQWxsb2MsIENvbWJfSGFzaF9GbiwgZmFsc2U+CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiAzCisgICAgICogVGhlIGNsaWVudCBkb2VzIG5vdCBzdXBwbHkgYSBoYXNoIGZ1bmN0aW9uIChieSBzcGVjaWZ5aW5nCisgICAgICogbnVsbF90eXBlIGFzIHRoZSBIYXNoX0ZuIHBhcmFtZXRlciksIGFuZCByZXF1ZXN0cyB0aGF0IGhhc2gKKyAgICAgKiB2YWx1ZXMgbm90IGJlIHN0b3JlZC4KKyAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIENvbWJfSGFzaF9Gbj4KKyAgICBjbGFzcyByYW5nZWRfaGFzaF9mbjxLZXksIG51bGxfdHlwZSwgX0FsbG9jLCBDb21iX0hhc2hfRm4sIGZhbHNlPiAKKyAgICA6IHB1YmxpYyBDb21iX0hhc2hfRm4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIENvbWJfSGFzaF9GbiBjb21iX2hhc2hfZm5fYmFzZTsKKworICAgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlKTsKKworICAgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlLCBjb25zdCBDb21iX0hhc2hfRm4mKTsKKworICAgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlLCBjb25zdCBudWxsX3R5cGUmLCBjb25zdCBDb21iX0hhc2hfRm4mKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworICAgIH07CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUgc2l6ZSkKKyAgICB7IENvbWJfSGFzaF9Gbjo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBDb21iX0hhc2hfRm4mIHJfY29tYl9oYXNoX2ZuKSA6CisgICAgICBDb21iX0hhc2hfRm4ocl9jb21iX2hhc2hfZm4pCisgICAgeyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgbnVsbF90eXBlJiByX251bGxfdHlwZSwgCisJCSAgIGNvbnN0IENvbWJfSGFzaF9GbiYgcl9jb21iX2hhc2hfZm4pIAorICAgIDogQ29tYl9IYXNoX0ZuKHJfY29tYl9oYXNoX2ZuKQorICAgIHsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorICAgIHsgY29tYl9oYXNoX2ZuX2Jhc2U6OnN3YXAob3RoZXIpOyB9CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBDb21iX0hhc2hfRm4+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIHJhbmdlZF9oYXNoX2ZuPEtleSwJbnVsbF90eXBlLCBfQWxsb2MsIENvbWJfSGFzaF9GbiwgdHJ1ZT4KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIDQKKyAgICAgKiBUaGUgY2xpZW50IGRvZXMgbm90IHN1cHBseSBhIGhhc2ggZnVuY3Rpb24gKGJ5IHNwZWNpZnlpbmcKKyAgICAgKiBudWxsX3R5cGUgYXMgdGhlIEhhc2hfRm4gcGFyYW1ldGVyKSwgYW5kIHJlcXVlc3RzIHRoYXQgaGFzaAorICAgICAqIHZhbHVlcyBiZSBzdG9yZWQuCisgICAgICoqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBDb21iX0hhc2hfRm4+CisgICAgY2xhc3MgcmFuZ2VkX2hhc2hfZm48S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgQ29tYl9IYXNoX0ZuLCB0cnVlPiAKKyAgICA6IHB1YmxpYyBDb21iX0hhc2hfRm4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIENvbWJfSGFzaF9GbiBjb21iX2hhc2hfZm5fYmFzZTsKKworICAgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlKTsKKworICAgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlLCBjb25zdCBDb21iX0hhc2hfRm4mKTsKKworICAgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlLCBjb25zdCBudWxsX3R5cGUmLCBjb25zdCBDb21iX0hhc2hfRm4mKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworICAgIH07CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUgc2l6ZSkKKyAgICB7IENvbWJfSGFzaF9Gbjo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBDb21iX0hhc2hfRm4mIHJfY29tYl9oYXNoX2ZuKSAKKyAgICA6IENvbWJfSGFzaF9GbihyX2NvbWJfaGFzaF9mbikKKyAgICB7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBudWxsX3R5cGUmIHJfbnVsbF90eXBlLCAKKwkJICAgY29uc3QgQ29tYl9IYXNoX0ZuJiByX2NvbWJfaGFzaF9mbikgCisgICAgOiBDb21iX0hhc2hfRm4ocl9jb21iX2hhc2hfZm4pCisgICAgeyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCisgICAgeyBjb21iX2hhc2hfZm5fYmFzZTo6c3dhcChvdGhlcik7IH0KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vcmFuZ2VkX3Byb2JlX2ZuLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3JhbmdlZF9wcm9iZV9mbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2ZThhZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3JhbmdlZF9wcm9iZV9mbi5ocHAKQEAgLTAsMCArMSwzMjcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmFuZ2VkX3Byb2JlX2ZuLmhwcAorICogQ29udGFpbnMgYSB1bmlmaWVkIHJhbmdlZCBwcm9iZSBmdW5jdG9yLCBhbGxvd2luZyB0aGUgcHJvYmUgdGFibGVzIHRvIGRlYWwgd2l0aAorICogICAgYSBzaW5nbGUgY2xhc3MgZm9yIHJhbmdlZCBwcm9iZWluZy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1JBTkdFRF9QUk9CRV9GTl9IUFAKKyNkZWZpbmUgUEJfRFNfUkFOR0VEX1BST0JFX0ZOX0hQUAorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hfRm4sIHR5cGVuYW1lIF9BbGxvYywKKwkgICAgIHR5cGVuYW1lIENvbWJfUHJvYmVfRm4sIHR5cGVuYW1lIFByb2JlX0ZuLCBib29sIFN0b3JlX0hhc2g+CisgICAgY2xhc3MgcmFuZ2VkX3Byb2JlX2ZuOworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hfRm4sIHR5cGVuYW1lIF9BbGxvYywgXAorCSAgICAgdHlwZW5hbWUgQ29tYl9Qcm9iZV9GbiwgdHlwZW5hbWUgUHJvYmVfRm4+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIHJhbmdlZF9wcm9iZV9mbjxLZXksIEhhc2hfRm4sIF9BbGxvYywgQ29tYl9Qcm9iZV9GbiwgUHJvYmVfRm4sIGZhbHNlPgorCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gMSAgICAgCisgICAgICogVGhlIGNsaWVudCBzdXBwbGllcyBhIHByb2JlIGZ1bmN0aW9uIGFuZCBhIHJhbmdlZCBwcm9iZQorICAgICAqIGZ1bmN0aW9uLCBhbmQgcmVxdWVzdHMgdGhhdCBoYXNoIHZhbHVlcyBub3QgYmUgc3RvcmVkLgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hfRm4sIHR5cGVuYW1lIF9BbGxvYywKKwkgICAgIHR5cGVuYW1lIENvbWJfUHJvYmVfRm4sIHR5cGVuYW1lIFByb2JlX0ZuPgorICAgIGNsYXNzIHJhbmdlZF9wcm9iZV9mbjxLZXksIEhhc2hfRm4sIF9BbGxvYywgQ29tYl9Qcm9iZV9GbiwKKwkJCSAgUHJvYmVfRm4sIGZhbHNlPiAKKyAgICA6IHB1YmxpYyBIYXNoX0ZuLCBwdWJsaWMgQ29tYl9Qcm9iZV9GbiwgcHVibGljIFByb2JlX0ZuCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBDb21iX1Byb2JlX0ZuIGNvbWJfcHJvYmVfZm5fYmFzZTsKKyAgICAgIHR5cGVkZWYgSGFzaF9GbiBoYXNoX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIFByb2JlX0ZuIHByb2JlX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyIGtleV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGtleV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBrZXlfY29uc3RfcmVmZXJlbmNlOworCisgICAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlKTsKKworICAgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSwgY29uc3QgSGFzaF9GbiYpOworCisgICAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlLCBjb25zdCBIYXNoX0ZuJiwgY29uc3QgQ29tYl9Qcm9iZV9GbiYpOworCisgICAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlLCBjb25zdCBIYXNoX0ZuJiwgY29uc3QgQ29tYl9Qcm9iZV9GbiYsIAorCQkgICAgICBjb25zdCBQcm9iZV9GbiYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSk7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSwgc2l6ZV90eXBlLCBzaXplX3R5cGUpIGNvbnN0OworICAgIH07CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlIHNpemUpCisgICAgeyBDb21iX1Byb2JlX0ZuOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4pIAorICAgIDogSGFzaF9GbihyX2hhc2hfZm4pCisgICAgeyBDb21iX1Byb2JlX0ZuOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIAorCQkgICAgY29uc3QgQ29tYl9Qcm9iZV9GbiYgcl9jb21iX3Byb2JlX2ZuKSAKKyAgICA6IEhhc2hfRm4ocl9oYXNoX2ZuKSwgQ29tYl9Qcm9iZV9GbihyX2NvbWJfcHJvYmVfZm4pCisgICAgeyBjb21iX3Byb2JlX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlIHNpemUsIGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbiwgCisJCSAgICBjb25zdCBDb21iX1Byb2JlX0ZuJiByX2NvbWJfcHJvYmVfZm4sIAorCQkgICAgY29uc3QgUHJvYmVfRm4mIHJfcHJvYmVfZm4pIAorICAgIDogSGFzaF9GbihyX2hhc2hfZm4pLCBDb21iX1Byb2JlX0ZuKHJfY29tYl9wcm9iZV9mbiksIFByb2JlX0ZuKHJfcHJvYmVfZm4pCisgICAgeyBjb21iX3Byb2JlX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCisgICAgeworICAgICAgY29tYl9wcm9iZV9mbl9iYXNlOjpzd2FwKG90aGVyKTsKKyAgICAgIHN0ZDo6c3dhcCgoSGFzaF9GbiYgKSgqdGhpcyksIChIYXNoX0ZuJilvdGhlcik7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBzaXplKQorICAgIHsgY29tYl9wcm9iZV9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0CisgICAgeyByZXR1cm4gY29tYl9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKGhhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSkpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSwgc2l6ZV90eXBlIGhhc2gsIHNpemVfdHlwZSBpKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBjb21iX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoaGFzaCArIHByb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoaSkpOworICAgIH0KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBIYXNoX0ZuLCB0eXBlbmFtZSBfQWxsb2MsIFwKKwkgICAgIHR5cGVuYW1lIENvbWJfUHJvYmVfRm4sIHR5cGVuYW1lIFByb2JlX0ZuPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICByYW5nZWRfcHJvYmVfZm48S2V5LCBIYXNoX0ZuLCBfQWxsb2MsIENvbWJfUHJvYmVfRm4sIFByb2JlX0ZuLCB0cnVlPgorCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gMi0gVGhlIGNsaWVudCBzdXBwbGllcyBhIHByb2JlIGZ1bmN0aW9uIGFuZCBhIHJhbmdlZAorICAgICAqICAgIHByb2JlIGZ1bmN0aW9uLCBhbmQgcmVxdWVzdHMgdGhhdCBoYXNoIHZhbHVlcyBub3QgYmUgc3RvcmVkLgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hfRm4sIHR5cGVuYW1lIF9BbGxvYywKKwkgICAgIHR5cGVuYW1lIENvbWJfUHJvYmVfRm4sIHR5cGVuYW1lIFByb2JlX0ZuPgorICAgIGNsYXNzIHJhbmdlZF9wcm9iZV9mbjxLZXksIEhhc2hfRm4sIF9BbGxvYywgQ29tYl9Qcm9iZV9GbiwgCisJCQkgIFByb2JlX0ZuLCB0cnVlPiAKKyAgICA6IHB1YmxpYyBIYXNoX0ZuLCBwdWJsaWMgQ29tYl9Qcm9iZV9GbiwgcHVibGljIFByb2JlX0ZuCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c2l6ZV90eXBlLCBzaXplX3R5cGU+IGNvbXBfaGFzaDsKKyAgICAgIHR5cGVkZWYgQ29tYl9Qcm9iZV9GbiBjb21iX3Byb2JlX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIEhhc2hfRm4gaGFzaF9mbl9iYXNlOworICAgICAgdHlwZWRlZiBQcm9iZV9GbiBwcm9iZV9mbl9iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxLZXk+OjpvdGhlciBrZXlfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfYWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2Uga2V5X2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSk7CisKKyAgICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUsIGNvbnN0IEhhc2hfRm4mKTsKKworICAgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSwgY29uc3QgSGFzaF9GbiYsIAorCQkgICAgICBjb25zdCBDb21iX1Byb2JlX0ZuJik7CisKKyAgICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUsIGNvbnN0IEhhc2hfRm4mLCBjb25zdCBDb21iX1Byb2JlX0ZuJiwgCisJCSAgICAgIGNvbnN0IFByb2JlX0ZuJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlKTsKKworICAgICAgaW5saW5lIGNvbXBfaGFzaAorICAgICAgb3BlcmF0b3IoKShrZXlfY29uc3RfcmVmZXJlbmNlKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgb3BlcmF0b3IoKShrZXlfY29uc3RfcmVmZXJlbmNlLCBzaXplX3R5cGUsIHNpemVfdHlwZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSwgc2l6ZV90eXBlKSBjb25zdDsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSBzaXplKQorICAgIHsgQ29tYl9Qcm9iZV9Gbjo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuKSAKKyAgICA6IEhhc2hfRm4ocl9oYXNoX2ZuKQorICAgIHsgQ29tYl9Qcm9iZV9Gbjo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuLCAKKwkJICAgIGNvbnN0IENvbWJfUHJvYmVfRm4mIHJfY29tYl9wcm9iZV9mbikgCisgICAgOiBIYXNoX0ZuKHJfaGFzaF9mbiksIENvbWJfUHJvYmVfRm4ocl9jb21iX3Byb2JlX2ZuKQorICAgIHsgY29tYl9wcm9iZV9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIAorCQkgICAgY29uc3QgQ29tYl9Qcm9iZV9GbiYgcl9jb21iX3Byb2JlX2ZuLCAKKwkJICAgIGNvbnN0IFByb2JlX0ZuJiByX3Byb2JlX2ZuKSAKKyAgICA6IEhhc2hfRm4ocl9oYXNoX2ZuKSwgQ29tYl9Qcm9iZV9GbihyX2NvbWJfcHJvYmVfZm4pLCBQcm9iZV9GbihyX3Byb2JlX2ZuKQorICAgIHsgY29tYl9wcm9iZV9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorICAgIHsKKyAgICAgIGNvbWJfcHJvYmVfZm5fYmFzZTo6c3dhcChvdGhlcik7CisgICAgICBzdGQ6OnN3YXAoKEhhc2hfRm4mICkoKnRoaXMpLCAoSGFzaF9GbiYgKW90aGVyKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIHNpemUpCisgICAgeyBjb21iX3Byb2JlX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29tcF9oYXNoCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgaGFzaCA9IGhhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSk7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoY29tYl9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKGhhc2gpLCBoYXNoKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSwgc2l6ZV90eXBlIGhhc2gsIHNpemVfdHlwZSBpKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBjb21iX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoaGFzaCArIHByb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoaSkpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgb3BlcmF0b3IoKQorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICAoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgc2l6ZV90eXBlIGhhc2gpIGNvbnN0CisjZWxzZSAKKyAgICAgIChrZXlfY29uc3RfcmVmZXJlbmNlIC8qcl9rZXkqLywgc2l6ZV90eXBlIGhhc2gpIGNvbnN0CisjZW5kaWYgCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGhhc2ggPT0gaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KSk7CisgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiAzIGFuZCA0CisgICAgICogVGhlIGNsaWVudCBkb2VzIG5vdCBzdXBwbHkgYSBoYXNoIGZ1bmN0aW9uIG9yIHByb2JlIGZ1bmN0aW9uLAorICAgICAqIGFuZCByZXF1ZXN0cyB0aGF0IGhhc2ggdmFsdWVzIG5vdCBiZSBzdG9yZWQuCisgICAgICoqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBDb21iX1Byb2JlX0ZuPgorICAgIGNsYXNzIHJhbmdlZF9wcm9iZV9mbjxLZXksIG51bGxfdHlwZSwgX0FsbG9jLCBDb21iX1Byb2JlX0ZuLCAKKwkJCSAgbnVsbF90eXBlLCBmYWxzZT4gCisgICAgOiBwdWJsaWMgQ29tYl9Qcm9iZV9GbgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgQ29tYl9Qcm9iZV9GbiBjb21iX3Byb2JlX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyIGtleV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGtleV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBrZXlfY29uc3RfcmVmZXJlbmNlOworCisgICAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlIHNpemUpCisgICAgICB7IENvbWJfUHJvYmVfRm46Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUsIGNvbnN0IENvbWJfUHJvYmVfRm4mIHJfY29tYl9wcm9iZV9mbikKKyAgICAgIDogQ29tYl9Qcm9iZV9GbihyX2NvbWJfcHJvYmVfZm4pCisgICAgICB7IH0KKworICAgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSwgY29uc3QgbnVsbF90eXBlJiwgCisJCSAgICAgIGNvbnN0IENvbWJfUHJvYmVfRm4mIHJfY29tYl9wcm9iZV9mbiwgCisJCSAgICAgIGNvbnN0IG51bGxfdHlwZSYpCisgICAgICA6IENvbWJfUHJvYmVfRm4ocl9jb21iX3Byb2JlX2ZuKQorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAocmFuZ2VkX3Byb2JlX2ZuJiBvdGhlcikKKyAgICAgIHsgY29tYl9wcm9iZV9mbl9iYXNlOjpzd2FwKG90aGVyKTsgfQorICAgIH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vc2FtcGxlX3Byb2JlX2ZuLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9wcm9iZV9mbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzZjcyOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9wcm9iZV9mbi5ocHAKQEAgLTAsMCArMSw2OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzYW1wbGVfcHJvYmVfZm4uaHBwCisgKiBDb250YWlucyBhIHNhbXBsZSBwcm9iZSBwb2xpY3kuCisgKi8KKworI2lmbmRlZiBQQl9EU19TQU1QTEVfUFJPQkVfRk5fSFBQCisjZGVmaW5lIFBCX0RTX1NBTVBMRV9QUk9CRV9GTl9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgLy8vIEEgc2FtcGxlIHByb2JlIHBvbGljeS4KKyAgY2xhc3Mgc2FtcGxlX3Byb2JlX2ZuCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2l6ZV90eXBlOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3Byb2JlX2ZuKCk7CisKKyAgICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgICBzYW1wbGVfcHJvYmVfZm4oY29uc3Qgc2FtcGxlX3Byb2JlX2ZuJik7CisKKyAgICAvLy8gU3dhcHMgY29udGVudC4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoc2FtcGxlX3Byb2JlX2ZuJik7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBSZXR1cm5zIHRoZSBpLXRoIG9mZnNldCBmcm9tIHRoZSBoYXNoIHZhbHVlIG9mIHNvbWUga2V5IHJfa2V5LgorICAgIGlubGluZSBzaXplX3R5cGUKKyAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIHNpemVfdHlwZSBpKSBjb25zdDsKKyAgfTsKK30KKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1NBTVBMRV9QUk9CRV9GTl9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9yYW5nZV9oYXNoaW5nLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9yYW5nZV9oYXNoaW5nLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjA0MDA3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vc2FtcGxlX3JhbmdlX2hhc2hpbmcuaHBwCkBAIC0wLDAgKzEsNzQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc2FtcGxlX3JhbmdlX2hhc2hpbmcuaHBwCisgKiBDb250YWlucyBhIHJhbmdlIGhhc2hpbmcgcG9saWN5LgorICovCisKKyNpZm5kZWYgUEJfRFNfU0FNUExFX1JBTkdFX0hBU0hJTkdfSFBQCisjZGVmaW5lIFBCX0RTX1NBTVBMRV9SQU5HRV9IQVNISU5HX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICAvLy8gQSBzYW1wbGUgcmFuZ2UtaGFzaGluZyBmdW5jdG9yLgorICBjbGFzcyBzYW1wbGVfcmFuZ2VfaGFzaGluZworICB7CisgIHB1YmxpYzoKKyAgICAvLy8gU2l6ZSB0eXBlLgorICAgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2l6ZV90eXBlOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3JhbmdlX2hhc2hpbmcoKTsKKworICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgorICAgIHNhbXBsZV9yYW5nZV9oYXNoaW5nKGNvbnN0IHNhbXBsZV9yYW5nZV9oYXNoaW5nJiBvdGhlcik7CisKKyAgICAvLy8gU3dhcHMgY29udGVudC4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoc2FtcGxlX3JhbmdlX2hhc2hpbmcmIG90aGVyKTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8vIE5vdGlmaWVzIHRoZSBwb2xpY3kgb2JqZWN0IHRoYXQgdGhlIGNvbnRhaW5lcidzIHNpemUgaGFzCisgICAgLy8vIGNoYW5nZWQgdG8gYXJndW1lbnQncyBzaXplLgorICAgIHZvaWQKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUpOworCisgICAgLy8vIFRyYW5zZm9ybXMgdGhlIF9faGFzaCB2YWx1ZSBoYXNoIGludG8gYSByYW5nZWQtaGFzaCB2YWx1ZS4KKyAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgb3BlcmF0b3IoKShzaXplX3R5cGUgKSBjb25zdDsKKyAgfTsKK30KKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1NBTVBMRV9SQU5HRV9IQVNISU5HX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vc2FtcGxlX3JhbmdlZF9oYXNoX2ZuLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9yYW5nZWRfaGFzaF9mbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyY2JjMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9yYW5nZWRfaGFzaF9mbi5ocHAKQEAgLTAsMCArMSw3NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzYW1wbGVfcmFuZ2VkX2hhc2hfZm4uaHBwCisgKiBDb250YWlucyBhIHJhbmdlZCBoYXNoIHBvbGljeS4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NBTVBMRV9SQU5HRURfSEFTSF9GTl9IUFAKKyNkZWZpbmUgUEJfRFNfU0FNUExFX1JBTkdFRF9IQVNIX0ZOX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICAvLy8gQSBzYW1wbGUgcmFuZ2VkLWhhc2ggZnVuY3Rvci4KKyAgY2xhc3Mgc2FtcGxlX3JhbmdlZF9oYXNoX2ZuCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2l6ZV90eXBlOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3JhbmdlZF9oYXNoX2ZuKCk7CisKKyAgICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgICBzYW1wbGVfcmFuZ2VkX2hhc2hfZm4oY29uc3Qgc2FtcGxlX3JhbmdlZF9oYXNoX2ZuJik7CisKKyAgICAvLy8gU3dhcHMgY29udGVudC4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoc2FtcGxlX3JhbmdlZF9oYXNoX2ZuJik7CisKKyAgcHJvdGVjdGVkOgorCisgICAgLy8vIE5vdGlmaWVzIHRoZSBwb2xpY3kgb2JqZWN0IHRoYXQgdGhlIGNvbnRhaW5lcidzIF9fc2l6ZSBoYXMKKyAgICAvLy8gY2hhbmdlZCB0byBzaXplLgorICAgIHZvaWQKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUpOworCisgICAgLy8vIFRyYW5zZm9ybXMga2V5X2NvbnN0X3JlZmVyZW5jZSBpbnRvIGEgcG9zaXRpb24gd2l0aGluIHRoZSB0YWJsZS4KKyAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgb3BlcmF0b3IoKShrZXlfY29uc3RfcmVmZXJlbmNlKSBjb25zdDsKKworICB9OworfQorI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfU0FNUExFX1JBTkdFRF9IQVNIX0ZOX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vc2FtcGxlX3JhbmdlZF9wcm9iZV9mbi5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9zYW1wbGVfcmFuZ2VkX3Byb2JlX2ZuLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDU0MzFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vc2FtcGxlX3JhbmdlZF9wcm9iZV9mbi5ocHAKQEAgLTAsMCArMSw3NyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzYW1wbGVfcmFuZ2VkX3Byb2JlX2ZuLmhwcAorICogQ29udGFpbnMgYSByYW5nZWQgcHJvYmUgcG9saWN5LgorICovCisKKyNpZm5kZWYgUEJfRFNfU0FNUExFX1JBTkdFRF9QUk9CRV9GTl9IUFAKKyNkZWZpbmUgUEJfRFNfU0FNUExFX1JBTkdFRF9QUk9CRV9GTl9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgLy8vIEEgc2FtcGxlIHJhbmdlZC1wcm9iZSBmdW5jdG9yLgorICBjbGFzcyBzYW1wbGVfcmFuZ2VkX3Byb2JlX2ZuCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgCXNpemVfdHlwZTsKKworICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3JhbmdlZF9wcm9iZV9mbigpOworCisgICAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgICBzYW1wbGVfcmFuZ2VkX3Byb2JlX2ZuKGNvbnN0IHNhbXBsZV9yYW5nZWRfcHJvYmVfZm4mKTsKKworICAgIC8vIFN3YXBzIGNvbnRlbnQuCisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHNhbXBsZV9yYW5nZWRfcHJvYmVfZm4mKTsKKworICBwcm90ZWN0ZWQ6CisKKyAgICAvLyBOb3RpZmllcyB0aGUgcG9saWN5IG9iamVjdCB0aGF0IHRoZSBjb250YWluZXIncyBfX3NpemUgaGFzCisgICAgLy8gY2hhbmdlZCB0byBzaXplLgorICAgIHZvaWQKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUpOworCisgICAgLy8gVHJhbnNmb3JtcyB0aGUgY29uc3Qga2V5IHJlZmVyZW5jZSByX2tleSBpbnRvIHRoZSBpLXRoIHBvc2l0aW9uCisgICAgLy8gd2l0aGluIHRoZSB0YWJsZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZvciBlYWNoIGNvbGxpc2lvbiB3aXRoaW4KKyAgICAvLyB0aGUgcHJvYmUgc2VxdWVuY2UuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSwgc3RkOjpzaXplX3QsIHNpemVfdHlwZSkgY29uc3Q7CisKKyAgfTsKK30KKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1NBTVBMRV9SQU5HRURfUFJPQkVfRk5fSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vY29uc3RfaXRlcmF0b3IuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2NvbnN0X2l0ZXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjA3YTFiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2NvbnN0X2l0ZXJhdG9yLmhwcApAQCAtMCwwICsxLDE1OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9jb25zdF9pdGVyYXRvci5ocHAKKyAqIENvbnRhaW5zIGFuIGl0ZXJhdG9yIGNsYXNzIHJldHVybmVkIGJ5IHRoZSB0YWJsZSdzIGNvbnN0IGZpbmQgYW5kIGluc2VydAorICogbWV0aG9kcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0xFRlRfQ0hJTERfTkVYVF9TSUJMSU5HX0hFQVBfQ09OU1RfSVRFUkFUT1JfSFBQCisjZGVmaW5lIFBCX0RTX0xFRlRfQ0hJTERfTkVYVF9TSUJMSU5HX0hFQVBfQ09OU1RfSVRFUkFUT1JfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL3BvaW50X2NvbnN0X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgIFwKKyAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX2NvbnN0X2l0ZXJhdG9yXzxOb2RlLCBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQkFTSUNfSEVBUF9DSVRfQkFTRSBcCisgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9ub2RlX3BvaW50X2NvbnN0X2l0ZXJhdG9yXzxOb2RlLCBfQWxsb2M+CisKKyAgICAvLy8gQ29uc3QgcG9pbnQtdHlwZSBpdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9jb25zdF9pdGVyYXRvcl8KKyAgICA6IHB1YmxpYyBQQl9EU19CQVNJQ19IRUFQX0NJVF9CQVNFCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIFBCX0RTX0JBU0lDX0hFQVBfQ0lUX0JBU0UgCSAgICAgIAliYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9wb2ludGVyCQlub2RlX3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gQ2F0ZWdvcnkuCisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgCQlpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgLy8vIERpZmZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgCQlkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIHZhbHVlIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6dmFsdWVfdHlwZSAJCXZhbHVlX3R5cGU7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIHBvaW50ZXIgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludGVyIAkJcG9pbnRlcjsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgY29uc3QgcG9pbnRlciB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnJlZmVyZW5jZSAJCXJlZmVyZW5jZTsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgY29uc3QgcmVmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIAljb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGlubGluZQorICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9jb25zdF9pdGVyYXRvcl8obm9kZV9wb2ludGVyIHBfbmQpCisgICAgICA6IGJhc2VfdHlwZShwX25kKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgaW5saW5lCisgICAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX2NvbnN0X2l0ZXJhdG9yXygpCisgICAgICB7IH0KKworICAgICAgLy8vIENvcHkgY29uc3RydWN0b3IuCisgICAgICBpbmxpbmUKKyAgICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfY29uc3RfaXRlcmF0b3JfKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgOiBiYXNlX3R5cGUob3RoZXIpCisgICAgICB7IH0KKworICAgICAgLy8vIENvbXBhcmVzIGNvbnRlbnQgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiAoYmFzZV90eXBlOjptX3BfbmQgPT0gb3RoZXIubV9wX25kKTsgfQorCisgICAgICAvLy8gQ29tcGFyZXMgY29udGVudCAobmVnYXRpdmVseSkgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiAoYmFzZV90eXBlOjptX3BfbmQgIT0gb3RoZXIubV9wX25kKTsgfQorCisgICAgICBQQl9EU19DTEFTU19DX0RFQyYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYXNlX3R5cGU6Om1fcF9uZCAhPSAwKTsKKwlpbmMoKTsKKwlyZXR1cm4gKCp0aGlzKTsKKyAgICAgIH0KKworICAgICAgUEJfRFNfQ0xBU1NfQ19ERUMKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCVBCX0RTX0NMQVNTX0NfREVDIHJldF9pdChiYXNlX3R5cGU6Om1fcF9uZCk7CisJb3BlcmF0b3IrKygpOworCXJldHVybiAocmV0X2l0KTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBpbmMoKQorICAgICAgeworCWlmIChiYXNlX3R5cGU6Om1fcF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorCSAgeworCSAgICBiYXNlX3R5cGU6Om1fcF9uZCA9IGJhc2VfdHlwZTo6bV9wX25kLT5tX3BfbmV4dF9zaWJsaW5nOworCSAgICB3aGlsZSAoYmFzZV90eXBlOjptX3BfbmQtPm1fcF9sX2NoaWxkICE9IDApCisJICAgICAgYmFzZV90eXBlOjptX3BfbmQgPSBiYXNlX3R5cGU6Om1fcF9uZC0+bV9wX2xfY2hpbGQ7CisJICAgIHJldHVybjsKKwkgIH0KKworCXdoaWxlICh0cnVlKQorCSAgeworCSAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gYmFzZV90eXBlOjptX3BfbmQ7CisJICAgIGJhc2VfdHlwZTo6bV9wX25kID0gYmFzZV90eXBlOjptX3BfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKwkgICAgaWYgKGJhc2VfdHlwZTo6bV9wX25kID09IDAKKwkJfHwgYmFzZV90eXBlOjptX3BfbmQtPm1fcF9sX2NoaWxkID09IHBfbmV4dCkKKwkgICAgICByZXR1cm47CisJICB9CisgICAgICB9CisgICAgfTsKKworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfQkFTSUNfSEVBUF9DSVRfQkFTRQorCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOThkYTMwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTUyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2FsbG9jYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfbm9kZV9hbGxvY2F0b3I7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9fdGhyb3dfY29waWVzX3QKK1BCX0RTX0NMQVNTX0NfREVDOjpzX25vX3Rocm93X2NvcGllc19pbmQ7CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwKCkgOgorICBtX3Bfcm9vdCgwKSwKKyAgbV9zaXplKDApCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcChjb25zdCBDbXBfRm4mIHJfY21wX2ZuKSA6CisgIENtcF9GbihyX2NtcF9mbiksCisgIG1fcF9yb290KDApLAorICBtX3NpemUoMCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgCis6IENtcF9GbihvdGhlciksIG1fcF9yb290KDApLCBtX3NpemUoMCkKK3sKKyAgbV9zaXplID0gb3RoZXIubV9zaXplOworICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgIG1fcF9yb290ID0gcmVjdXJzaXZlX2NvcHlfbm9kZShvdGhlci5tX3Bfcm9vdCk7CisgIG1fc2l6ZSA9IG90aGVyLm1fc2l6ZTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgdmFsdWVfc3dhcChvdGhlcik7CisgIHN0ZDo6c3dhcCgoQ21wX0ZuJiApKCp0aGlzKSwgKENtcF9GbiYgKW90aGVyKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ZhbHVlX3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBzdGQ6OnN3YXAobV9wX3Jvb3QsIG90aGVyLm1fcF9yb290KTsKKyAgc3RkOjpzd2FwKG1fc2l6ZSwgb3RoZXIubV9zaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK35sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwKCkKK3sKKyAgY2xlYXIoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY3Vyc2l2ZV9jb3B5X25vZGUobm9kZV9jb25zdF9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuICgwKTsKKworICBub2RlX3BvaW50ZXIgcF9yZXQgPSBzX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworCisgIF9fdHJ5CisgICAgeworICAgICAgbmV3IChwX3JldCkgbm9kZSgqcF9uZCk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9yZXQsIDEpOworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorCisgIHBfcmV0LT5tX3BfbF9jaGlsZCA9IHBfcmV0LT5tX3BfbmV4dF9zaWJsaW5nID0KKyAgICBwX3JldC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKworICBfX3RyeQorICAgIHsKKyAgICAgIHBfcmV0LT5tX3BfbF9jaGlsZCA9IHJlY3Vyc2l2ZV9jb3B5X25vZGUocF9uZC0+bV9wX2xfY2hpbGQpOworICAgICAgcF9yZXQtPm1fcF9uZXh0X3NpYmxpbmcgPSByZWN1cnNpdmVfY29weV9ub2RlKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeworICAgICAgY2xlYXJfaW1wKHBfcmV0KTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKworICBpZiAocF9yZXQtPm1fcF9sX2NoaWxkICE9IDApCisgICAgcF9yZXQtPm1fcF9sX2NoaWxkLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX3JldDsKKworICBpZiAocF9yZXQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBwX3JldC0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0KKyAgICAgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9PSBwX25kID8gcF9yZXQgOiAwOworCisgIHJldHVybiBwX3JldDsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlY2NiMWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMzcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3Bfcm9vdCA9PSAwIHx8IG1fcF9yb290LT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gMCk7CisKKyAgaWYgKG1fcF9yb290ICE9IDApCisgICAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChtX3Bfcm9vdCwgU2luZ2xlX0xpbmtfUm9vdHMsIF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X3NpemUoX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfaXRlcmF0b3JzKF9fZmlsZSwgX19saW5lKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9ub2RlX2NvbnNpc3RlbnQobm9kZV9jb25zdF9wb2ludGVyIHBfbmQsIGJvb2wgc2luZ2xlX2xpbmssCisJCSAgICAgICBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworCisgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9uZC0+bV9wX2xfY2hpbGQsIGZhbHNlLCBfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9uZC0+bV9wX25leHRfc2libGluZywgc2luZ2xlX2xpbmssIF9fZmlsZSwgX19saW5lKTsKKworICBpZiAoc2luZ2xlX2xpbmspCisgICAgUEJfRFNfREVCVUdfVkVSSUZZKHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA9PSAwKTsKKyAgZWxzZSBpZiAocF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gcF9uZCk7CisKKyAgaWYgKHBfbmQtPm1fcF9sX2NoaWxkID09IDApCisgICAgcmV0dXJuOworCisgIG5vZGVfY29uc3RfcG9pbnRlciBwX2NoaWxkID0gcF9uZC0+bV9wX2xfY2hpbGQ7CisgIHdoaWxlIChwX2NoaWxkICE9IDApCisgICAgeworICAgICAgbm9kZV9jb25zdF9wb2ludGVyIHBfbmV4dF9jaGlsZCA9IHBfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkoIUNtcF9Gbjo6b3BlcmF0b3IoKShwX25kLT5tX3ZhbHVlLCBwX2NoaWxkLT5tX3ZhbHVlKSk7CisgICAgICBwX2NoaWxkID0gcF9uZXh0X2NoaWxkOworICAgIH0KKyAgUEJfRFNfREVCVUdfVkVSSUZZKHBfbmQtPm1fcF9sX2NoaWxkLT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gcF9uZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfaXRlcmF0b3JzKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgUEJfRFNfREVCVUdfVkVSSUZZKHN0ZDo6ZGlzdGFuY2UoYmVnaW4oKSwgZW5kKCkpID09IHNpemUoKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfc2l6ZShjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIFBCX0RTX0RFQlVHX1ZFUklGWShzaXplX2Zyb21fbm9kZShtX3Bfcm9vdCkgPT0gbV9zaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NpemVfdW5kZXJfbm9kZShub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCkKK3sgcmV0dXJuIDEgKyBzaXplX2Zyb21fbm9kZShwX25kLT5tX3BfbF9jaGlsZCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NpemVfZnJvbV9ub2RlKG5vZGVfY29uc3RfcG9pbnRlciBwX25kKQoreworICBzaXplX3R5cGUgcmV0ID0gMDsKKyAgd2hpbGUgKHBfbmQgIT0gMCkKKyAgICB7CisgICAgICByZXQgKz0gMSArIHNpemVfZnJvbV9ub2RlKHBfbmQtPm1fcF9sX2NoaWxkKTsKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworICAgIH0KKyAgcmV0dXJuIHJldDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2RlZ3JlZShub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCkKK3sKKyAgc2l6ZV90eXBlIHJldCA9IDA7CisgIG5vZGVfY29uc3RfcG9pbnRlciBwX2NoaWxkID0gcF9uZC0+bV9wX2xfY2hpbGQ7CisgIHdoaWxlIChwX2NoaWxkICE9IDApCisgICAgeworICAgICAgKytyZXQ7CisgICAgICBwX2NoaWxkID0gcF9jaGlsZC0+bV9wX25leHRfc2libGluZzsKKyAgICB9CisgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmYyMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTUwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyKCkKK3sKKyAgY2xlYXJfaW1wKG1fcF9yb290KTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA9PSAwKTsKKyAgbV9wX3Jvb3QgPSAwOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FjdHVhbF9lcmFzZV9ub2RlKG5vZGVfcG9pbnRlciBwX25kKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID4gMCk7CisgIC0tbV9zaXplOworICBwX25kLT5+bm9kZSgpOworICBzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9uZCwgMSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcl9pbXAobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIHdoaWxlIChwX25kICE9IDApCisgICAgeworICAgICAgY2xlYXJfaW1wKHBfbmQtPm1fcF9sX2NoaWxkKTsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgYWN0dWFsX2VyYXNlX25vZGUocF9uZCk7CisgICAgICBwX25kID0gcF9uZXh0OworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RvX2xpbmtlZF9saXN0KCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIG5vZGVfcG9pbnRlciBwX2N1ciA9IG1fcF9yb290OworICB3aGlsZSAocF9jdXIgIT0gMCkKKyAgICBpZiAocF9jdXItPm1fcF9sX2NoaWxkICE9IDApCisgICAgICB7CisJbm9kZV9wb2ludGVyIHBfY2hpbGRfbmV4dCA9IHBfY3VyLT5tX3BfbF9jaGlsZC0+bV9wX25leHRfc2libGluZzsKKwlwX2N1ci0+bV9wX2xfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKwlwX2N1ci0+bV9wX25leHRfc2libGluZyA9IHBfY3VyLT5tX3BfbF9jaGlsZDsKKwlwX2N1ci0+bV9wX2xfY2hpbGQgPSBwX2NoaWxkX25leHQ7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcF9jdXIgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIG5vZGVfY29uc3RfcG9pbnRlciBwX2NvdW50ZXIgPSBtX3Bfcm9vdDsKKyAgc2l6ZV90eXBlIGNvdW50ID0gMDsKKyAgd2hpbGUgKHBfY291bnRlciAhPSAwKQorICAgIHsKKyAgICAgICsrY291bnQ7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9jb3VudGVyLT5tX3BfbF9jaGlsZCA9PSAwKTsKKyAgICAgIHBfY291bnRlciA9IHBfY291bnRlci0+bV9wX25leHRfc2libGluZzsKKyAgICB9CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChjb3VudCA9PSBtX3NpemUpOworI2VuZGlmIAorfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BydW5lKFByZWQgcHJlZCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfY3VyID0gbV9wX3Jvb3Q7CisgIG1fcF9yb290ID0gMDsKKyAgbm9kZV9wb2ludGVyIHBfb3V0ID0gMDsKKyAgd2hpbGUgKHBfY3VyICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgaWYgKHByZWQocF9jdXItPm1fdmFsdWUpKQorICAgICAgICB7CisJICBwX2N1ci0+bV9wX25leHRfc2libGluZyA9IHBfb3V0OworCSAgaWYgKHBfb3V0ICE9IDApCisJICAgIHBfb3V0LT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX2N1cjsKKwkgIHBfb3V0ID0gcF9jdXI7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgcF9jdXItPm1fcF9uZXh0X3NpYmxpbmcgPSBtX3Bfcm9vdDsKKwkgIGlmIChtX3Bfcm9vdCAhPSAwKQorCSAgICBtX3Bfcm9vdC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9jdXI7CisJICBtX3Bfcm9vdCA9IHBfY3VyOworICAgICAgICB9CisgICAgICBwX2N1ciA9IHBfbmV4dDsKKyAgICB9CisgIHJldHVybiBwX291dDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2J1YmJsZV90b190b3Aobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIG5vZGVfcG9pbnRlciBwX3BhcmVudCA9IHBhcmVudChwX25kKTsKKyAgd2hpbGUgKHBfcGFyZW50ICE9IDApCisgICAgeworICAgICAgc3dhcF93aXRoX3BhcmVudChwX25kLCBwX3BhcmVudCk7CisgICAgICBwX3BhcmVudCA9IHBhcmVudChwX25kKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2luZm9fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4YjE1NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pbmZvX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNjQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaW5mb19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW1wdHkoKSBjb25zdAoreworICByZXR1cm4gKG1fc2l6ZSA9PSAwKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitzaXplKCkgY29uc3QKK3sKKyAgcmV0dXJuIChtX3NpemUpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21heF9zaXplKCkgY29uc3QKK3sKKyAgcmV0dXJuIChzX25vZGVfYWxsb2NhdG9yLm1heF9zaXplKCkpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmNlNWIxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE3NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9uZXdfbm9kZV9mb3JfaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkKK3sKKyAgcmV0dXJuIGdldF9uZXdfbm9kZV9mb3JfaW5zZXJ0KHJfdmFsLCBzX25vX3Rocm93X2NvcGllc19pbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9uZXdfbm9kZV9mb3JfaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgZmFsc2VfdHlwZSkKK3sKKyAgbm9kZV9wb2ludGVyIHBfbmV3X25kID0gc19ub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKworICBjb25kX2RlYWx0b3JfdCBjb25kKHBfbmV3X25kKTsKKworICBuZXcgKGNvbnN0X2Nhc3Q8dm9pZCogPigKKwkJCSAgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCogPigmcF9uZXdfbmQtPm1fdmFsdWUpKSkKKyAgICB0eXBlbmFtZSBub2RlOjp2YWx1ZV90eXBlKHJfdmFsKTsKKworICBjb25kLnNldF9ub19hY3Rpb24oKTsKKworICArK21fc2l6ZTsKKworICByZXR1cm4gKHBfbmV3X25kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbmV3X25vZGVfZm9yX2luc2VydChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIHRydWVfdHlwZSkKK3sKKyAgbm9kZV9wb2ludGVyIHBfbmV3X25kID0gc19ub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKworICBuZXcgKGNvbnN0X2Nhc3Q8dm9pZCogPigKKwkJCSAgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCogPigmcF9uZXdfbmQtPm1fdmFsdWUpKSkKKyAgICB0eXBlbmFtZSBub2RlOjp2YWx1ZV90eXBlKHJfdmFsKTsKKworICArK21fc2l6ZTsKKworICByZXR1cm4gKHBfbmV3X25kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CittYWtlX2NoaWxkX29mKG5vZGVfcG9pbnRlciBwX25kLCBub2RlX3BvaW50ZXIgcF9uZXdfcGFyZW50KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmV3X3BhcmVudCAhPSAwKTsKKworICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZXdfcGFyZW50LT5tX3BfbF9jaGlsZDsKKworICBpZiAocF9uZXdfcGFyZW50LT5tX3BfbF9jaGlsZCAhPSAwKQorICAgIHBfbmV3X3BhcmVudC0+bV9wX2xfY2hpbGQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQ7CisKKyAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZXdfcGFyZW50OworCisgIHBfbmV3X3BhcmVudC0+bV9wX2xfY2hpbGQgPSBwX25kOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BhcmVudChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfcG90ID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50OworCisgICAgICBpZiAocF9wb3QgPT0gMCB8fCBwX3BvdC0+bV9wX2xfY2hpbGQgPT0gcF9uZCkKKwlyZXR1cm4gcF9wb3Q7CisKKyAgICAgIHBfbmQgPSBwX3BvdDsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcF93aXRoX3BhcmVudChub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfcGFyZW50KQoreworICBpZiAocF9wYXJlbnQgPT0gbV9wX3Jvb3QpCisgICAgbV9wX3Jvb3QgPSBwX25kOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9wYXJlbnQgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwYXJlbnQocF9uZCkgPT0gcF9wYXJlbnQpOworCisgIGNvbnN0IGJvb2wgbmRfZGlyZWN0X2NoaWxkID0gcF9wYXJlbnQtPm1fcF9sX2NoaWxkID09IHBfbmQ7CisgIGNvbnN0IGJvb2wgcGFyZW50X3Jvb3QgPSBwX3BhcmVudC0+bV9wX3ByZXZfb3JfcGFyZW50ID09IDA7CisgIGNvbnN0IGJvb2wgcGFyZW50X2RpcmVjdF9jaGlsZCA9CisgICAgIXBhcmVudF9yb290JiYgIHBfcGFyZW50LT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9sX2NoaWxkID09IHBfcGFyZW50OworCisgIHN0ZDo6c3dhcChwX3BhcmVudC0+bV9wX3ByZXZfb3JfcGFyZW50LCBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQpOworICBzdGQ6OnN3YXAocF9wYXJlbnQtPm1fcF9uZXh0X3NpYmxpbmcsIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcpOworICBzdGQ6OnN3YXAocF9wYXJlbnQtPm1fcF9sX2NoaWxkLCBwX25kLT5tX3BfbF9jaGlsZCk7CisgIHN0ZDo6c3dhcChwX3BhcmVudC0+bV9tZXRhZGF0YSwgcF9uZC0+bV9tZXRhZGF0YSk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fcF9sX2NoaWxkICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9wYXJlbnQtPm1fcF9wcmV2X29yX3BhcmVudCAhPSAwKTsKKworICBpZiAocF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorICAgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQ7CisKKyAgaWYgKHBfcGFyZW50LT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisgICAgcF9wYXJlbnQtPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfcGFyZW50OworCisgIGlmIChwX3BhcmVudC0+bV9wX2xfY2hpbGQgIT0gMCkKKyAgICBwX3BhcmVudC0+bV9wX2xfY2hpbGQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfcGFyZW50OworCisgIGlmIChwYXJlbnRfZGlyZWN0X2NoaWxkKQorICAgIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX2xfY2hpbGQgPSBwX25kOworICBlbHNlIGlmICghcGFyZW50X3Jvb3QpCisgICAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZDsKKworICBpZiAoIW5kX2RpcmVjdF9jaGlsZCkKKyAgICB7CisgICAgICBwX25kLT5tX3BfbF9jaGlsZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZDsKKworICAgICAgcF9wYXJlbnQtPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX25leHRfc2libGluZyA9IHBfcGFyZW50OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3BfbF9jaGlsZCA9PSBwX25kKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudC0+bV9wX3ByZXZfb3JfcGFyZW50ID09IHBfcGFyZW50KTsKKworICAgICAgcF9uZC0+bV9wX2xfY2hpbGQgPSBwX3BhcmVudDsKKyAgICAgIHBfcGFyZW50LT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocGFyZW50KHBfcGFyZW50KSA9PSBwX25kKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2NGUwMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw4OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKQoreworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9yb290OworCisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuIChpdGVyYXRvcigwKSk7CisKKyAgd2hpbGUgKHBfbmQtPm1fcF9sX2NoaWxkICE9IDApCisgICAgcF9uZCA9IHBfbmQtPm1fcF9sX2NoaWxkOworCisgIHJldHVybiAoaXRlcmF0b3IocF9uZCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKSBjb25zdAoreworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9yb290OworCisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuIChjb25zdF9pdGVyYXRvcigwKSk7CisKKyAgd2hpbGUgKHBfbmQtPm1fcF9sX2NoaWxkICE9IDApCisgICAgcF9uZCA9IHBfbmQtPm1fcF9sX2NoaWxkOworCisgIHJldHVybiAoY29uc3RfaXRlcmF0b3IocF9uZCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkKK3sKKyAgcmV0dXJuIChpdGVyYXRvcigwKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlbmQoKSBjb25zdAoreworICByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKDApKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1NDFlOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy5ocHAKQEAgLTAsMCArMSwyODYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiYXNpYyBoZWFwLgorICovCisKKyNpZm5kZWYgUEJfRFNfTEVGVF9DSElMRF9ORVhUX1NJQkxJTkdfSEVBUF9IUFAKKyNkZWZpbmUgUEJfRFNfTEVGVF9DSElMRF9ORVhUX1NJQkxJTkdfSEVBUF9IUFAKKworLyoKKyAqIEJhc2VkIG9uIENMUlMuCisgKi8KKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vbm9kZS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9wb2ludF9jb25zdF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9jb25zdF9pdGVyYXRvci5ocHA+CisjaWZkZWYgUEJfRFNfTENfTlNfSEVBUF9UUkFDRV8KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNlbmRpZgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIE5vZGVfTWV0YWRhdGEsIFwKKwkgICAgIHR5cGVuYW1lIF9BbGxvYywgYm9vbCBTaW5nbGVfTGlua19Sb290cz4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcDxWYWx1ZV9UeXBlLCBDbXBfRm4sIE5vZGVfTWV0YWRhdGEsCVwKKwkJCQkgIF9BbGxvYywgU2luZ2xlX0xpbmtfUm9vdHM+CisjZWxzZQorI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBOb2RlX01ldGFkYXRhLCBcCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXA8VmFsdWVfVHlwZSwgQ21wX0ZuLCBOb2RlX01ldGFkYXRhLCBfQWxsb2M+CisjZW5kaWYKKworICAgIC8vLyBCYXNlIGNsYXNzIGZvciBhIGJhc2ljIGhlYXAuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwKKwkgICAgIHR5cGVuYW1lIENtcF9GbiwKKwkgICAgIHR5cGVuYW1lIE5vZGVfTWV0YWRhdGEsCisJICAgICB0eXBlbmFtZSBfQWxsb2MKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCSAgICAgLGJvb2wgU2luZ2xlX0xpbmtfUm9vdHM+CisjZWxzZQorCSAgICAgPgorI2VuZGlmCisgICAgY2xhc3MgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcCA6IHB1YmxpYyBDbXBfRm4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisgICAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfPFZhbHVlX1R5cGUsIE5vZGVfTWV0YWRhdGEsCisJCQkJCSBfQWxsb2M+ID46Om90aGVyCisgICAgICBub2RlX2FsbG9jYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2FsbG9jYXRvcjo6dmFsdWVfdHlwZSAgICAgCW5vZGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG5vZGVfYWxsb2NhdG9yOjpwb2ludGVyIAkJbm9kZV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2FsbG9jYXRvcjo6Y29uc3RfcG9pbnRlcglub2RlX2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIE5vZGVfTWV0YWRhdGEgbm9kZV9tZXRhZGF0YTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPCBub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcj4gCW5vZGVfcG9pbnRlcl9wYWlyOworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgY29uZF9kZWFsdG9yPCBub2RlLCBfQWxsb2M+IAkJY29uZF9kZWFsdG9yX3Q7CisKKyAgICAgIGVudW0KKwl7CisJICBzaW1wbGVfdmFsdWUgPSBpc19zaW1wbGU8VmFsdWVfVHlwZT46OnZhbHVlCisJfTsKKworICAgICAgdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxpbnQsIHNpbXBsZV92YWx1ZT4gCW5vX3Rocm93X2NvcGllc190OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxWYWx1ZV9UeXBlPglfX3JlYmluZF92OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgVmFsdWVfVHlwZSAJCQkJdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92OjpvdGhlcjo6cG9pbnRlciAJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdjo6b3RoZXI6OnJlZmVyZW5jZQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3Y6Om90aGVyOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV9wb2ludF9jb25zdF9pdGVyYXRvcl88bm9kZSwgX0FsbG9jPgorICAgICAgcG9pbnRfY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgcG9pbnRfY29uc3RfaXRlcmF0b3IgCQkJcG9pbnRfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9jb25zdF9pdGVyYXRvcl88bm9kZSwgX0FsbG9jPgorICAgICAgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3IgCQkJCWl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBDbXBfRm4gCQkJCQljbXBfZm47CisgICAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCWFsbG9jYXRvcl90eXBlOworCisgICAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwKCk7CisgICAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwKGNvbnN0IENtcF9GbiYpOworICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcChjb25zdCBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgfmxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXAoKTsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdDsKKworICAgICAgQ21wX0ZuJgorICAgICAgZ2V0X2NtcF9mbigpOworCisgICAgICBjb25zdCBDbXBfRm4mCisgICAgICBnZXRfY21wX2ZuKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgYmVnaW4oKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVuZCgpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisjaWZkZWYgUEJfRFNfTENfTlNfSEVBUF9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3Q7CisjZW5kaWYKKworICAgIHByb3RlY3RlZDoKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGdldF9uZXdfbm9kZV9mb3JfaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZAorICAgICAgbWFrZV9jaGlsZF9vZihub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHZhbHVlX3N3YXAobGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcCYpOworCisgICAgICBpbmxpbmUgc3RhdGljIG5vZGVfcG9pbnRlcgorICAgICAgcGFyZW50KG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzd2FwX3dpdGhfcGFyZW50KG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgYnViYmxlX3RvX3RvcChub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgYWN0dWFsX2VyYXNlX25vZGUobm9kZV9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgY2xlYXJfaW1wKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHRvX2xpbmtlZF9saXN0KCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIHBydW5lKFByZWQpOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChub2RlX2NvbnN0X3BvaW50ZXIsIGJvb2wsIGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICBzdGF0aWMgc2l6ZV90eXBlCisgICAgICBzaXplX3VuZGVyX25vZGUobm9kZV9jb25zdF9wb2ludGVyKTsKKworICAgICAgc3RhdGljIHNpemVfdHlwZQorICAgICAgZGVncmVlKG5vZGVfY29uc3RfcG9pbnRlcik7CisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0xDX05TX0hFQVBfVFJBQ0VfCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgdHJhY2Vfbm9kZShub2RlX2NvbnN0X3BvaW50ZXIsIHNpemVfdHlwZSk7CisjZW5kaWYKKworICAgIHByaXZhdGU6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9pdGVyYXRvcnMoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9zaXplKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICBzdGF0aWMgc2l6ZV90eXBlCisgICAgICBzaXplX2Zyb21fbm9kZShub2RlX2NvbnN0X3BvaW50ZXIpOworI2VuZGlmCisKKyAgICAgIG5vZGVfcG9pbnRlcgorICAgICAgcmVjdXJzaXZlX2NvcHlfbm9kZShub2RlX2NvbnN0X3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBnZXRfbmV3X25vZGVfZm9yX2luc2VydChjb25zdF9yZWZlcmVuY2UsIGZhbHNlX3R5cGUpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBnZXRfbmV3X25vZGVfZm9yX2luc2VydChjb25zdF9yZWZlcmVuY2UsIHRydWVfdHlwZSk7CisKKyNpZmRlZiBQQl9EU19MQ19OU19IRUFQX1RSQUNFXworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGFfPgorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIHRyYWNlX25vZGVfbWV0YWRhdGEobm9kZV9jb25zdF9wb2ludGVyLCB0eXBlX3RvX3R5cGU8TWV0YWRhdGFfPik7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICB0cmFjZV9ub2RlX21ldGFkYXRhKG5vZGVfY29uc3RfcG9pbnRlciwgdHlwZV90b190eXBlPG51bGxfdHlwZT4pOworI2VuZGlmCisKKyAgICAgIHN0YXRpYyBub2RlX2FsbG9jYXRvciAJc19ub2RlX2FsbG9jYXRvcjsKKyAgICAgIHN0YXRpYyBub190aHJvd19jb3BpZXNfdCAJc19ub190aHJvd19jb3BpZXNfaW5kOworCisgICAgcHJvdGVjdGVkOgorICAgICAgbm9kZV9wb2ludGVyIAkJbV9wX3Jvb3Q7CisgICAgICBzaXplX3R5cGUgCQltX3NpemU7CisgICAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pbmZvX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vbm9kZS5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vbm9kZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4OTEwMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9ub2RlLmhwcApAQCAtMCwwICsxLDkwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL25vZGUuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3QgZm9yIHRoaXMgdHlwZSBvZiBoZWFwJ3Mgbm9kZS4KKyAqLworCisjaWZuZGVmIFBCX0RTX0xFRlRfQ0hJTERfTkVYVF9TSUJMSU5HX0hFQVBfTk9ERV9IUFAKKyNkZWZpbmUgUEJfRFNfTEVGVF9DSElMRF9ORVhUX1NJQkxJTkdfSEVBUF9OT0RFX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gTm9kZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9NZXRhZGF0YSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV88X1ZhbHVlLCBfTWV0YWRhdGEsIF9BbGxvYz4gdGhpc190eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVmFsdWUgCQkJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIF9NZXRhZGF0YSAJCQltZXRhZGF0YV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHRoaXNfdHlwZT46Om90aGVyOjpwb2ludGVyIG5vZGVfcG9pbnRlcjsKKworICAgICAgdmFsdWVfdHlwZSAJbV92YWx1ZTsKKyAgICAgIG1ldGFkYXRhX3R5cGUgCW1fbWV0YWRhdGE7CisgICAgICBub2RlX3BvaW50ZXIgCW1fcF9sX2NoaWxkOworICAgICAgbm9kZV9wb2ludGVyIAltX3BfbmV4dF9zaWJsaW5nOworICAgICAgbm9kZV9wb2ludGVyIAltX3BfcHJldl9vcl9wYXJlbnQ7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfPF9WYWx1ZSwgbnVsbF90eXBlLCBfQWxsb2M+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV88X1ZhbHVlLCBudWxsX3R5cGUsIF9BbGxvYz4gdGhpc190eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVmFsdWUgCQkJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAlzaXplX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8dGhpc190eXBlPjo6b3RoZXI6OnBvaW50ZXIgbm9kZV9wb2ludGVyOworCisgICAgICB2YWx1ZV90eXBlIAltX3ZhbHVlOworICAgICAgbm9kZV9wb2ludGVyIAltX3BfbF9jaGlsZDsKKyAgICAgIG5vZGVfcG9pbnRlciAJbV9wX25leHRfc2libGluZzsKKyAgICAgIG5vZGVfcG9pbnRlciAJbV9wX3ByZXZfb3JfcGFyZW50OworICAgIH07CisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX0xFRlRfQ0hJTERfTkVYVF9TSUJMSU5HX0hFQVBfTk9ERV9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9wb2ludF9jb25zdF9pdGVyYXRvci5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vcG9pbnRfY29uc3RfaXRlcmF0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzE1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vcG9pbnRfY29uc3RfaXRlcmF0b3IuaHBwCkBAIC0wLDAgKzEsMTQ5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL3BvaW50X2NvbnN0X2l0ZXJhdG9yLmhwcAorICogQ29udGFpbnMgYW4gaXRlcmF0b3IgY2xhc3MgcmV0dXJuZWQgYnkgdGhlIHRhYmxlJ3MgY29uc3QgZmluZCBhbmQgaW5zZXJ0CisgKiBtZXRob2RzLgorICovCisKKyNpZm5kZWYgUEJfRFNfTEVGVF9DSElMRF9ORVhUX1NJQkxJTkdfSEVBUF9DT05TVF9GSU5EX0lURVJBVE9SX0hQUAorI2RlZmluZSBQQl9EU19MRUZUX0NISUxEX05FWFRfU0lCTElOR19IRUFQX0NPTlNUX0ZJTkRfSVRFUkFUT1JfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMJCQlcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZSwgdHlwZW5hbWUgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfcG9pbnRfY29uc3RfaXRlcmF0b3JfPE5vZGUsIF9BbGxvYz4KKworICAgIC8vLyBDb25zdCBwb2ludC10eXBlIGl0ZXJhdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfcG9pbnRfY29uc3RfaXRlcmF0b3JfCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8Tm9kZT46Om90aGVyOjpwb2ludGVyIG5vZGVfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBDYXRlZ29yeS4KKyAgICAgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIC8vLyBEaWZmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgdmFsdWUgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICAvLy8gSXRlcmF0b3IncyBwb2ludGVyIHR5cGUuCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIHBvaW50ZXI7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIGNvbnN0IHBvaW50ZXIgdHlwZS4KKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCXZhbHVlX3R5cGU+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgY29uc3RfcG9pbnRlcjsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgcmVmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OnJlZmVyZW5jZQorICAgICAgcmVmZXJlbmNlOworCisgICAgICAvLy8gSXRlcmF0b3IncyBjb25zdCByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCXZhbHVlX3R5cGU+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlCisgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGlubGluZQorICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9ub2RlX3BvaW50X2NvbnN0X2l0ZXJhdG9yXyhub2RlX3BvaW50ZXIgcF9uZCkgOiBtX3BfbmQocF9uZCkKKyAgICAgIHsgfQorCisgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIGlubGluZQorICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9ub2RlX3BvaW50X2NvbnN0X2l0ZXJhdG9yXygpIDogbV9wX25kKDApCisgICAgICB7IH0KKworICAgICAgLy8vIENvcHkgY29uc3RydWN0b3IuCisgICAgICBpbmxpbmUKKyAgICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV9wb2ludF9jb25zdF9pdGVyYXRvcl8oY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6IG1fcF9uZChvdGhlci5tX3BfbmQpCisgICAgICB7IH0KKworICAgICAgLy8vIEFjY2Vzcy4KKyAgICAgIGNvbnN0X3BvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbmQgIT0gMCk7CisJcmV0dXJuICZtX3BfbmQtPm1fdmFsdWU7CisgICAgICB9CisKKyAgICAgIC8vLyBBY2Nlc3MuCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9uZCAhPSAwKTsKKwlyZXR1cm4gbV9wX25kLT5tX3ZhbHVlOworICAgICAgfQorCisgICAgICAvLy8gQ29tcGFyZXMgY29udGVudCB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZCA9PSBvdGhlci5tX3BfbmQ7IH0KKworICAgICAgLy8vIENvbXBhcmVzIGNvbnRlbnQgKG5lZ2F0aXZlbHkpIHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX25kICE9IG90aGVyLm1fcF9uZDsgfQorCisgICAgICBub2RlX3BvaW50ZXIgbV9wX25kOworICAgIH07CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTM5MGNhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK0NtcF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfY21wX2ZuKCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBDbXBfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2NtcF9mbigpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiMzc1NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy90cmFjZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDkwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uCisgKi8KKworI2lmZGVmIFBCX0RTX0xDX05TX0hFQVBfVFJBQ0VfCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZSgpIGNvbnN0Cit7CisgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7CisgIHRyYWNlX25vZGUobV9wX3Jvb3QsIDApOworICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordHJhY2Vfbm9kZShub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCwgc2l6ZV90eXBlIGxldmVsKQoreworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbGV2ZWw7ICsraSkKKwlzdGQ6OmNlcnIgPDwgJyAnOworCisgICAgICBzdGQ6OmNlcnIgPDwgcF9uZCA8PAorCSIgcHJldiA9ICIgPDwgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50IDw8CisJIiBuZXh0ICIgPDwgcF9uZC0+bV9wX25leHRfc2libGluZyA8PAorCSIgbGVmdCA9ICIgPDwgcF9uZC0+bV9wX2xfY2hpbGQgPDwgIiAiOworCisgICAgICB0cmFjZV9ub2RlX21ldGFkYXRhKHBfbmQsIHR5cGVfdG9fdHlwZTxub2RlX21ldGFkYXRhPigpKTsKKyAgICAgIHN0ZDo6Y2VyciA8PCBwX25kLT5tX3ZhbHVlIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHRyYWNlX25vZGUocF9uZC0+bV9wX2xfY2hpbGQsIGxldmVsICsgMSk7CisgICAgICBwX25kID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YV8+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZV9ub2RlX21ldGFkYXRhKG5vZGVfY29uc3RfcG9pbnRlciBwX25kLCB0eXBlX3RvX3R5cGU8TWV0YWRhdGFfPikKK3sKKyAgc3RkOjpjZXJyIDw8ICIoIiA8PCBwX25kLT5tX21ldGFkYXRhIDw8ICIpICI7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZV9ub2RlX21ldGFkYXRhKG5vZGVfY29uc3RfcG9pbnRlciwgdHlwZV90b190eXBlPG51bGxfdHlwZT4pCit7IH0KKworI2VuZGlmIC8vICNpZmRlZiBQQl9EU19MQ19OU19IRUFQX1RSQUNFXwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NjNjI4MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMzYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGlzdF91cGRhdGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplbnRyeV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX2VudHJ5X2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK0VxX0ZuIFBCX0RTX0NMQVNTX0NfREVDOjpzX2VxX2ZuOworCitQQl9EU19DTEFTU19UX0RFQworbnVsbF90eXBlIFBCX0RTX0NMQVNTX0NfREVDOjpzX251bGxfdHlwZTsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK1VwZGF0ZV9Qb2xpY3kgUEJfRFNfQ0xBU1NfQ19ERUM6OnNfdXBkYXRlX3BvbGljeTsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVfdG9fdHlwZTwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnVwZGF0ZV9tZXRhZGF0YT4gUEJfRFNfQ0xBU1NfQ19ERUM6OnNfbWV0YWRhdGFfdHlwZV9pbmRpY2F0b3I7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvcHlfZnJvbV9yYW5nZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCkKK3sKKyAgd2hpbGUgKGZpcnN0X2l0ICE9IGxhc3RfaXQpCisgICAgaW5zZXJ0KCooZmlyc3RfaXQrKykpOworfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfTFVfTkFNRSgpIDogbV9wX2woMCkKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0PgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfTFVfTkFNRShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCkgOiBtX3BfbCgwKQoreworICBjb3B5X2Zyb21fcmFuZ2UoZmlyc3RfaXQsIGxhc3RfaXQpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19MVV9OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgOgorbV9wX2woMCkKK3sKKyAgX190cnkKKyAgICB7CisgICAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIGl0ID0gb3RoZXIuYmVnaW4oKTsgaXQgIT0gb3RoZXIuZW5kKCk7ICsraXQpCisJeworCSAgZW50cnlfcG9pbnRlciBwX2wgPSBhbGxvY2F0ZV9uZXdfZW50cnkoKml0LAorCQkJCSAgICAgIHRyYWl0c19iYXNlOjptX25vX3Rocm93X2NvcGllc19pbmRpY2F0b3IpOworCisJICBwX2wtPm1fcF9uZXh0ID0gbV9wX2w7CisJICBtX3BfbCA9IHBfbDsKKwl9CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBkZWFsbG9jYXRlX2FsbCgpOworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OnN3YXAob3RoZXIpOykKKyAgc3RkOjpzd2FwKG1fcF9sLCBvdGhlci5tX3BfbCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitkZWFsbG9jYXRlX2FsbCgpCit7CisgIGVudHJ5X3BvaW50ZXIgcF9sID0gbV9wX2w7CisgIHdoaWxlIChwX2wgIT0gMCkKKyAgICB7CisgICAgICBlbnRyeV9wb2ludGVyIHBfbmV4dF9sID0gcF9sLT5tX3BfbmV4dDsKKyAgICAgIGFjdHVhbF9lcmFzZV9lbnRyeShwX2wpOworICAgICAgcF9sID0gcF9uZXh0X2w7CisgICAgfQorICBtX3BfbCA9IDA7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+UEJfRFNfTFVfTkFNRSgpCit7IGRlYWxsb2NhdGVfYWxsKCk7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkYjU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGlzdF91cGRhdGVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBkZWJ1Zy1tb2RlIGZ1bmN0aW9ucy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIHNpemVfdHlwZSBjYWxjX3NpemUgPSAwOworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsgaXQgIT0gZW5kKCk7ICsraXQpCisgICAgeworICAgICAgZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhQQl9EU19WMkYoKml0KSwgX19maWxlLCBfX2xpbmUpOworICAgICAgKytjYWxjX3NpemU7CisgICAgfQorICBkZWJ1Z19iYXNlOjpjaGVja19zaXplKGNhbGNfc2l6ZSwgX19maWxlLCBfX2xpbmUpOworfQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9lbnRyeV9tZXRhZGF0YV9iYXNlLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2VudHJ5X21ldGFkYXRhX2Jhc2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTMwZjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9lbnRyeV9tZXRhZGF0YV9iYXNlLmhwcApAQCAtMCwwICsxLDYwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxpc3RfdXBkYXRlX21hcF8vZW50cnlfbWV0YWRhdGFfYmFzZS5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciBhIGxpc3QgdXBkYXRlIG1hcC4KKyAqLworCisjaWZuZGVmIFBCX0RTX0xVX01BUF9FTlRSWV9NRVRBREFUQV9CQVNFX0hQUAorI2RlZmluZSBQQl9EU19MVV9NQVBfRU5UUllfTUVUQURBVEFfQkFTRV9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGE+CisgICAgc3RydWN0IGx1X21hcF9lbnRyeV9tZXRhZGF0YV9iYXNlCisgICAgeworICAgICAgTWV0YWRhdGEgbV91cGRhdGVfbWV0YWRhdGE7CisgICAgfTsKKyAgICAKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGx1X21hcF9lbnRyeV9tZXRhZGF0YV9iYXNlPG51bGxfdHlwZT4KKyAgICB7IH07ICAKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhMzRkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTM0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxpc3RfdXBkYXRlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBsdV9tYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2Uoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGlmIChtX3BfbCA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoc19lcV9mbihyX2tleSwgUEJfRFNfVjJGKG1fcF9sLT5tX3ZhbHVlKSkpCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX25leHQgPSBtX3BfbC0+bV9wX25leHQ7CisgICAgICBhY3R1YWxfZXJhc2VfZW50cnkobV9wX2wpOworICAgICAgbV9wX2wgPSBwX25leHQ7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgZW50cnlfcG9pbnRlciBwX2wgPSBtX3BfbDsKKyAgd2hpbGUgKHBfbC0+bV9wX25leHQgIT0gMCkKKyAgICBpZiAoc19lcV9mbihyX2tleSwgUEJfRFNfVjJGKHBfbC0+bV9wX25leHQtPm1fdmFsdWUpKSkKKyAgICAgIHsKKwllcmFzZV9uZXh0KHBfbCk7CisJcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcF9sID0gcF9sLT5tX3BfbmV4dDsKKyAgcmV0dXJuIGZhbHNlOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXIoKQoreworICBkZWFsbG9jYXRlX2FsbCgpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pZihQcmVkIHByZWQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBzaXplX3R5cGUgbnVtX2Vyc2QgPSAwOworICB3aGlsZSAobV9wX2wgIT0gMCAmJiBwcmVkKG1fcF9sLT5tX3ZhbHVlKSkKKyAgICB7CisgICAgICBlbnRyeV9wb2ludGVyIHBfbmV4dCA9IG1fcF9sLT5tX3BfbmV4dDsKKyAgICAgICsrbnVtX2Vyc2Q7CisgICAgICBhY3R1YWxfZXJhc2VfZW50cnkobV9wX2wpOworICAgICAgbV9wX2wgPSBwX25leHQ7CisgICAgfQorCisgIGlmIChtX3BfbCA9PSAwKQorICAgIHJldHVybiBudW1fZXJzZDsKKworICBlbnRyeV9wb2ludGVyIHBfbCA9IG1fcF9sOworICB3aGlsZSAocF9sLT5tX3BfbmV4dCAhPSAwKQorICAgIHsKKyAgICAgIGlmIChwcmVkKHBfbC0+bV9wX25leHQtPm1fdmFsdWUpKQorICAgICAgICB7CisJICArK251bV9lcnNkOworCSAgZXJhc2VfbmV4dChwX2wpOworICAgICAgICB9CisgICAgICBlbHNlCisJcF9sID0gcF9sLT5tX3BfbmV4dDsKKyAgICB9CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBudW1fZXJzZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX25leHQoZW50cnlfcG9pbnRlciBwX2wpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2wgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2wtPm1fcF9uZXh0ICE9IDApOworICBlbnRyeV9wb2ludGVyIHBfbmV4dF9sID0gcF9sLT5tX3BfbmV4dC0+bV9wX25leHQ7CisgIGFjdHVhbF9lcmFzZV9lbnRyeShwX2wtPm1fcF9uZXh0KTsKKyAgcF9sLT5tX3BfbmV4dCA9IHBfbmV4dF9sOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYWN0dWFsX2VyYXNlX2VudHJ5KGVudHJ5X3BvaW50ZXIgcF9sKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmVyYXNlX2V4aXN0aW5nKFBCX0RTX1YyRihwX2wtPm1fdmFsdWUpKTspCisgIHBfbC0+fmVudHJ5KCk7CisgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9sLCAxKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZmluZF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0YzQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw5MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsaXN0X3VwZGF0ZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBsdV9tYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmVudHJ5X3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfaW1wKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIGlmIChtX3BfbCA9PSAwKQorICAgIHJldHVybiAwOworICBpZiAoc19lcV9mbihyX2tleSwgUEJfRFNfVjJGKG1fcF9sLT5tX3ZhbHVlKSkpCisgICAgeworICAgICAgYXBwbHlfdXBkYXRlKG1fcF9sLCBzX21ldGFkYXRhX3R5cGVfaW5kaWNhdG9yKTsKKyAgICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisgICAgICByZXR1cm4gbV9wX2w7CisgICAgfQorCisgIGVudHJ5X3BvaW50ZXIgcF9sID0gbV9wX2w7CisgIHdoaWxlIChwX2wtPm1fcF9uZXh0ICE9IDApCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX25leHQgPSBwX2wtPm1fcF9uZXh0OworICAgICAgaWYgKHNfZXFfZm4ocl9rZXksIFBCX0RTX1YyRihwX25leHQtPm1fdmFsdWUpKSkKKyAgICAgICAgeworCSAgaWYgKGFwcGx5X3VwZGF0ZShwX25leHQsIHNfbWV0YWRhdGFfdHlwZV9pbmRpY2F0b3IpKQorICAgICAgICAgICAgeworCSAgICAgIHBfbC0+bV9wX25leHQgPSBwX25leHQtPm1fcF9uZXh0OworCSAgICAgIHBfbmV4dC0+bV9wX25leHQgPSBtX3BfbDsKKwkgICAgICBtX3BfbCA9IHBfbmV4dDsKKwkgICAgICByZXR1cm4gbV9wX2w7CisgICAgICAgICAgICB9CisJICByZXR1cm4gcF9uZXh0OworICAgICAgICB9CisgICAgICBlbHNlCisJcF9sID0gcF9uZXh0OworICAgIH0KKworICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisgIHJldHVybiAwOworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGE+CitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXBwbHlfdXBkYXRlKGVudHJ5X3BvaW50ZXIgcF9sLCB0eXBlX3RvX3R5cGU8TWV0YWRhdGE+KQoreyByZXR1cm4gc191cGRhdGVfcG9saWN5KHBfbC0+bV91cGRhdGVfbWV0YWRhdGEpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXBwbHlfdXBkYXRlKGVudHJ5X3BvaW50ZXIsIHR5cGVfdG9fdHlwZTxudWxsX3R5cGU+KQoreyByZXR1cm4gc191cGRhdGVfcG9saWN5KHNfbnVsbF90eXBlKTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaW5mb19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODU2MWE0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaW5mb19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxpc3RfdXBkYXRlX21hcF8vaW5mb19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGx1X21hcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitzaXplKCkgY29uc3QKK3sgcmV0dXJuIHN0ZDo6ZGlzdGFuY2UoYmVnaW4oKSwgZW5kKCkpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWF4X3NpemUoKSBjb25zdAoreyByZXR1cm4gc19lbnRyeV9hbGxvY2F0b3IubWF4X3NpemUoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VtcHR5KCkgY29uc3QKK3sgcmV0dXJuIChtX3BfbCA9PSAwKTsgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MTc2OTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGlzdF91cGRhdGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBsdV9tYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgc3RkOjpwYWlyPAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IsCisgIGJvb2w+CitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgZW50cnlfcG9pbnRlciBwX2wgPSBmaW5kX2ltcChQQl9EU19WMkYocl92YWwpKTsKKworICBpZiAocF9sICE9IDApCisgICAgeworICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhQQl9EU19WMkYocl92YWwpKQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBvaW50X2l0ZXJhdG9yKCZwX2wtPm1fdmFsdWUpLCBmYWxzZSk7CisgICAgfQorCisgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChQQl9EU19WMkYocl92YWwpKQorCisgIHBfbCA9IGFsbG9jYXRlX25ld19lbnRyeShyX3ZhbCwgdHJhaXRzX2Jhc2U6Om1fbm9fdGhyb3dfY29waWVzX2luZGljYXRvcik7CisgIHBfbC0+bV9wX25leHQgPSBtX3BfbDsKKyAgbV9wX2wgPSBwX2w7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gc3RkOjptYWtlX3BhaXIocG9pbnRfaXRlcmF0b3IoJnBfbC0+bV92YWx1ZSksIHRydWUpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplbnRyeV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CithbGxvY2F0ZV9uZXdfZW50cnkoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCBmYWxzZV90eXBlKQoreworICBlbnRyeV9wb2ludGVyIHBfbCA9IHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworICBjb25kX2RlYWx0b3JfdCBjb25kKHBfbCk7CisgIG5ldyAoY29uc3RfY2FzdDx2b2lkKiA+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqID4oJnBfbC0+bV92YWx1ZSkpKQorICAgIHZhbHVlX3R5cGUocl92YWwpOworCisgIGNvbmQuc2V0X25vX2FjdGlvbigpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoUEJfRFNfVjJGKHJfdmFsKSk7KQorICBpbml0X2VudHJ5X21ldGFkYXRhKHBfbCwgc19tZXRhZGF0YV90eXBlX2luZGljYXRvcik7CisgIHJldHVybiBwX2w7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmVudHJ5X3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FsbG9jYXRlX25ld19lbnRyeShjb25zdF9yZWZlcmVuY2UgICAgcl92YWwsIHRydWVfdHlwZSkKK3sKKyAgZW50cnlfcG9pbnRlciBwX2wgPSBzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKyAgbmV3ICgmcF9sLT5tX3ZhbHVlKSB2YWx1ZV90eXBlKHJfdmFsKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRihyX3ZhbCkpOykKKyAgaW5pdF9lbnRyeV9tZXRhZGF0YShwX2wsIHNfbWV0YWRhdGFfdHlwZV9pbmRpY2F0b3IpOworICByZXR1cm4gcF9sOworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGE+CitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdF9lbnRyeV9tZXRhZGF0YShlbnRyeV9wb2ludGVyIHBfbCwgdHlwZV90b190eXBlPE1ldGFkYXRhPikKK3sgbmV3ICgmcF9sLT5tX3VwZGF0ZV9tZXRhZGF0YSkgTWV0YWRhdGEoc191cGRhdGVfcG9saWN5KCkpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdF9lbnRyeV9tZXRhZGF0YShlbnRyeV9wb2ludGVyLCB0eXBlX3RvX3R5cGU8bnVsbF90eXBlPikKK3sgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmZWY4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDgwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxpc3RfdXBkYXRlX21hcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgbHVfbWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKQoreworICBpZiAobV9wX2wgPT0gMCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoZW1wdHkoKSk7CisgICAgICByZXR1cm4gZW5kKCk7CisgICAgfQorICByZXR1cm4gaXRlcmF0b3IoJm1fcF9sLT5tX3ZhbHVlLCBtX3BfbCwgdGhpcyk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitiZWdpbigpIGNvbnN0Cit7CisgIGlmIChtX3BfbCA9PSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChlbXB0eSgpKTsKKyAgICAgIHJldHVybiBlbmQoKTsKKyAgICB9CisgIHJldHVybiBpdGVyYXRvcigmbV9wX2wtPm1fdmFsdWUsIG1fcF9sLCBjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKiA+KHRoaXMpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpCit7IHJldHVybiBpdGVyYXRvcigwLCAwLCB0aGlzKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkgY29uc3QKK3sKKyAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKDAsIDAsIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMqIGNvbnN0Pih0aGlzKSk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2x1X21hcF8uaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vbHVfbWFwXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0NzY4OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2x1X21hcF8uaHBwCkBAIC0wLDAgKzEsMzQzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxpc3RfdXBkYXRlX21hcF8vbHVfbWFwXy5ocHAKKyAqIENvbnRhaW5zIGEgbGlzdCB1cGRhdGUgbWFwLgorICovCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlc190cmFpdHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9lbnRyeV9tZXRhZGF0YV9iYXNlLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZXhjZXB0aW9uLmhwcD4KKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZGVidWdfbWFwX2Jhc2UuaHBwPgorI2VuZGlmCisjaWZkZWYgUEJfRFNfTFVfTUFQX1RSQUNFXworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2VuZGlmCisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19MVV9OQU1FIGx1X21hcAorI2VuZGlmCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19MVV9OQU1FIGx1X3NldAorI2VuZGlmCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBFcV9GbiwgXAorCSAgICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBVcGRhdGVfUG9saWN5PgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBQQl9EU19MVV9OQU1FPEtleSwgTWFwcGVkLCBFcV9GbiwgX0FsbG9jLCBVcGRhdGVfUG9saWN5PgorCisjZGVmaW5lIFBCX0RTX0xVX1RSQUlUU19CQVNFIFwKKyAgICB0eXBlc190cmFpdHM8S2V5LCBNYXBwZWQsIF9BbGxvYywgZmFsc2U+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2RlZmluZSBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQyBcCisgICAgZGVidWdfbWFwX2Jhc2U8S2V5LCBFcV9GbiwgXAorCSAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyOjpjb25zdF9yZWZlcmVuY2U+CisjZW5kaWYKKworICAgIC8vLyBsaXN0LWJhc2VkICh3aXRoIHVwZGF0ZXMpIGFzc29jaWF0aXZlIGNvbnRhaW5lci4KKyAgICAvLy8gU2tpcCB0byB0aGUgbHUsIG15IGRhcmxpbmcuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgICAgdHlwZW5hbWUgRXFfRm4sCisJICAgICB0eXBlbmFtZSBfQWxsb2MsCisJICAgICB0eXBlbmFtZSBVcGRhdGVfUG9saWN5PgorICAgIGNsYXNzIFBCX0RTX0xVX05BTUUgOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICBwcm90ZWN0ZWQgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMsCisjZW5kaWYKKyAgICAgIHB1YmxpYyBQQl9EU19MVV9UUkFJVFNfQkFTRQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19MVV9UUkFJVFNfQkFTRSAJICAgICAgIAl0cmFpdHNfYmFzZTsKKworICAgICAgc3RydWN0IGVudHJ5CisgICAgIDogcHVibGljIGx1X21hcF9lbnRyeV9tZXRhZGF0YV9iYXNlPHR5cGVuYW1lIFVwZGF0ZV9Qb2xpY3k6Om1ldGFkYXRhX3R5cGU+CisgICAgICB7CisJdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnZhbHVlX3R5cGUgbV92YWx1ZTsKKwl0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxlbnRyeT46Om90aGVyOjpwb2ludGVyIG1fcF9uZXh0OworICAgICAgfTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxlbnRyeT46Om90aGVyIGVudHJ5X2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpwb2ludGVyIGVudHJ5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6Y29uc3RfcG9pbnRlciBjb25zdF9lbnRyeV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OnJlZmVyZW5jZSBlbnRyeV9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X2VudHJ5X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxlbnRyeV9wb2ludGVyPjo6b3RoZXIgZW50cnlfcG9pbnRlcl9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X3BvaW50ZXJfYWxsb2NhdG9yOjpwb2ludGVyIGVudHJ5X3BvaW50ZXJfYXJyYXk7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZV87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpwb2ludGVyIHBvaW50ZXJfOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnJlZmVyZW5jZSByZWZlcmVuY2VfOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZV87CisKKyNkZWZpbmUgUEJfRFNfR0VOX1BPUyBlbnRyeV9wb2ludGVyCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9wb2ludF9jb25zdF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvcG9pbnRfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL2NvbnN0X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9pdGVyYXRvci5ocHA+CisKKyN1bmRlZiBQQl9EU19HRU5fUE9TCisKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB0eXBlZGVmIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDIGRlYnVnX2Jhc2U7CisjZW5kaWYKKworICAgICAgdHlwZWRlZiBjb25kX2RlYWx0b3I8ZW50cnksIF9BbGxvYz4gY29uZF9kZWFsdG9yX3Q7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIEVxX0ZuIGVxX2ZuOworICAgICAgdHlwZWRlZiBVcGRhdGVfUG9saWN5IHVwZGF0ZV9wb2xpY3k7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFVwZGF0ZV9Qb2xpY3k6Om1ldGFkYXRhX3R5cGUgdXBkYXRlX21ldGFkYXRhOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfcG9pbnRlciBrZXlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9jb25zdF9wb2ludGVyIGtleV9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3JlZmVyZW5jZSBrZXlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X2NvbnN0X3JlZmVyZW5jZSBrZXlfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3R5cGUgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfcG9pbnRlciBtYXBwZWRfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9jb25zdF9wb2ludGVyIG1hcHBlZF9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3JlZmVyZW5jZSBtYXBwZWRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX2NvbnN0X3JlZmVyZW5jZSBtYXBwZWRfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cG9pbnRlciBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIHBvaW50X2l0ZXJhdG9yXyAJCQlwb2ludF9pdGVyYXRvcjsKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyAgICAgIHR5cGVkZWYgcG9pbnRfY29uc3RfaXRlcmF0b3JfIAkJcG9pbnRfaXRlcmF0b3I7CisjZW5kaWYKKworICAgICAgdHlwZWRlZiBwb2ludF9jb25zdF9pdGVyYXRvcl8gCQlwb2ludF9jb25zdF9pdGVyYXRvcjsKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfIAkJCWl0ZXJhdG9yOworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvcl8gCQkJaXRlcmF0b3I7CisjZW5kaWYKKworICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvcl8gCQkJY29uc3RfaXRlcmF0b3I7CisKKyAgICBwdWJsaWM6CisgICAgICBQQl9EU19MVV9OQU1FKCk7CisKKyAgICAgIFBCX0RTX0xVX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdmlydHVhbAorICAgICAgflBCX0RTX0xVX05BTUUoKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICBQQl9EU19MVV9OQU1FKEl0LCBJdCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdDsKKworICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKKyAgICAgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisJcmV0dXJuIGluc2VydChzdGQ6Om1ha2VfcGFpcihyX2tleSwgbWFwcGVkX3R5cGUoKSkpLmZpcnN0LT5zZWNvbmQ7CisjZWxzZQorCWluc2VydChyX2tleSk7CisJcmV0dXJuIHRyYWl0c19iYXNlOjpzX251bGxfdHlwZTsKKyNlbmRpZgorICAgICAgfQorCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgZmluZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCWVudHJ5X3BvaW50ZXIgcF9lID0gZmluZF9pbXAocl9rZXkpOworCXJldHVybiBwb2ludF9pdGVyYXRvcihwX2UgPT0gMCA/IDA6ICZwX2UtPm1fdmFsdWUpOworICAgICAgfQorCisgICAgICBpbmxpbmUgcG9pbnRfY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZChfX0ZJTEVfXywgX19MSU5FX18pOykKKwllbnRyeV9wb2ludGVyIHBfZSA9IGZpbmRfaW1wKHJfa2V5KTsKKwlyZXR1cm4gcG9pbnRfY29uc3RfaXRlcmF0b3IocF9lID09IDAgPyAwOiAmcF9lLT5tX3ZhbHVlKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVyYXNlKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgZXJhc2VfaWYoUHJlZCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgYmVnaW4oKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVuZCgpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgY29uc3Q7CisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0xVX01BUF9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3Q7CisjZW5kaWYKKworICAgIHByb3RlY3RlZDoKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fcmFuZ2UoSXQsIEl0KTsKKworICAgIHByaXZhdGU6CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgZnJpZW5kIGNsYXNzIGl0ZXJhdG9yXzsKKyNlbmRpZgorCisgICAgICBmcmllbmQgY2xhc3MgY29uc3RfaXRlcmF0b3JfOworCisgICAgICBpbmxpbmUgZW50cnlfcG9pbnRlcgorICAgICAgYWxsb2NhdGVfbmV3X2VudHJ5KGNvbnN0X3JlZmVyZW5jZSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSBlbnRyeV9wb2ludGVyCisgICAgICBhbGxvY2F0ZV9uZXdfZW50cnkoY29uc3RfcmVmZXJlbmNlLCB0cnVlX3R5cGUpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YT4KKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZAorICAgICAgaW5pdF9lbnRyeV9tZXRhZGF0YShlbnRyeV9wb2ludGVyLCB0eXBlX3RvX3R5cGU8TWV0YWRhdGE+KTsKKworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBpbml0X2VudHJ5X21ldGFkYXRhKGVudHJ5X3BvaW50ZXIsIHR5cGVfdG9fdHlwZTxudWxsX3R5cGU+KTsKKworICAgICAgdm9pZAorICAgICAgZGVhbGxvY2F0ZV9hbGwoKTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2VfbmV4dChlbnRyeV9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgYWN0dWFsX2VyYXNlX2VudHJ5KGVudHJ5X3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICBpbmNfaXRfc3RhdGUoY29uc3RfcG9pbnRlciYgcl9wX3ZhbHVlLCBlbnRyeV9wb2ludGVyJiByX3BvcykgY29uc3QKKyAgICAgIHsKKwlyX3BvcyA9IHJfcG9zLT5tX3BfbmV4dDsKKwlyX3BfdmFsdWUgPSAocl9wb3MgPT0gMCkgPyAwIDogJnJfcG9zLT5tX3ZhbHVlOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YT4KKyAgICAgIGlubGluZSBzdGF0aWMgYm9vbAorICAgICAgYXBwbHlfdXBkYXRlKGVudHJ5X3BvaW50ZXIsIHR5cGVfdG9fdHlwZTxNZXRhZGF0YT4pOworCisgICAgICBpbmxpbmUgc3RhdGljIGJvb2wKKyAgICAgIGFwcGx5X3VwZGF0ZShlbnRyeV9wb2ludGVyLCB0eXBlX3RvX3R5cGU8bnVsbF90eXBlPik7CisKKyAgICAgIGlubGluZSBlbnRyeV9wb2ludGVyCisgICAgICBmaW5kX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlKSBjb25zdDsKKworICAgICAgc3RhdGljIGVudHJ5X2FsbG9jYXRvciAJCQlzX2VudHJ5X2FsbG9jYXRvcjsKKyAgICAgIHN0YXRpYyBFcV9GbiAJCQkJc19lcV9mbjsKKyAgICAgIHN0YXRpYyBVcGRhdGVfUG9saWN5IAkJCXNfdXBkYXRlX3BvbGljeTsKKyAgICAgIHN0YXRpYyB0eXBlX3RvX3R5cGU8dXBkYXRlX21ldGFkYXRhPiAJc19tZXRhZGF0YV90eXBlX2luZGljYXRvcjsKKyAgICAgIHN0YXRpYyBudWxsX3R5cGUgCQkJCXNfbnVsbF90eXBlOworCisgICAgICBtdXRhYmxlIGVudHJ5X3BvaW50ZXIgCQkJbV9wX2w7CisgICAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZmluZF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19MVV9UUkFJVFNfQkFTRQorI3VuZGVmIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDCisjdW5kZWYgUEJfRFNfTFVfTkFNRQorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL3RyYWNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vdHJhY2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkNmQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGlzdF91cGRhdGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGx1X21hcF8uCisgKi8KKworI2lmZGVmIFBCX0RTX0xVX01BUF9UUkFDRV8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlKCkgY29uc3QKK3sKKyAgc3RkOjpjZXJyIDw8IG1fcF9sIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgIGNvbnN0X2VudHJ5X3BvaW50ZXIgcF9sID0gbV9wX2w7CisgIHdoaWxlIChwX2wgIT0gMCkKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwgUEJfRFNfVjJGKHBfbC0+bV92YWx1ZSkgPDwgc3RkOjplbmRsOworICAgICAgcF9sID0gcF9sLT5tX3BfbmV4dDsKKyAgICB9CisgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7Cit9CisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX3BvbGljeS9sdV9jb3VudGVyX21ldGFkYXRhLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9wb2xpY3kvbHVfY291bnRlcl9tZXRhZGF0YS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxZmZjZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9wb2xpY3kvbHVfY291bnRlcl9tZXRhZGF0YS5ocHAKQEAgLTAsMCArMSw4NyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsdV9jb3VudGVyX21ldGFkYXRhLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb24gb2YgYSBsdSBjb3VudGVyIHBvbGljeSdzIG1ldGFkYXRhLgorICovCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyAgICAgIGNsYXNzIGx1X2NvdW50ZXJfcG9saWN5X2Jhc2U7CisKKyAgICAvLy8gQSBsaXN0LXVwZGF0ZSBtZXRhZGF0YSB0eXBlIHRoYXQgbW92ZXMgZWxlbWVudHMgdG8gdGhlIGZyb250IG9mCisgICAgLy8vIHRoZSBsaXN0IGJhc2VkIG9uIHRoZSBjb3VudGVyIGFsZ29yaXRobS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGUgPSBzdGQ6OnNpemVfdD4KKyAgICAgIGNsYXNzIGx1X2NvdW50ZXJfbWV0YWRhdGEKKyAgICAgIHsKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIFNpemVfVHlwZSAJc2l6ZV90eXBlOworCisgICAgICBwcml2YXRlOgorCWx1X2NvdW50ZXJfbWV0YWRhdGEoc2l6ZV90eXBlIGluaXRfY291bnQpIDogbV9jb3VudChpbml0X2NvdW50KQorCXsgfQorCisJZnJpZW5kIGNsYXNzIGx1X2NvdW50ZXJfcG9saWN5X2Jhc2U8c2l6ZV90eXBlPjsKKworCW11dGFibGUgc2l6ZV90eXBlIAltX2NvdW50OworICAgIH07CisKKyAgICAvLy8gQmFzZSBjbGFzcyBmb3IgbGlzdC11cGRhdGUgY291bnRlciBwb2xpY3kuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlPgorICAgICAgY2xhc3MgbHVfY291bnRlcl9wb2xpY3lfYmFzZQorICAgICAgeworICAgICAgcHJvdGVjdGVkOgorCXR5cGVkZWYgU2l6ZV9UeXBlIAlzaXplX3R5cGU7CisKKwlsdV9jb3VudGVyX21ldGFkYXRhPHNpemVfdHlwZT4KKwlvcGVyYXRvcigpKHNpemVfdHlwZSBtYXhfc2l6ZSkgY29uc3QKKwl7IHJldHVybiBsdV9jb3VudGVyX21ldGFkYXRhPFNpemVfVHlwZT4oc3RkOjpyYW5kKCkgJSBtYXhfc2l6ZSk7IH0KKworCXRlbXBsYXRlPHR5cGVuYW1lIE1ldGFkYXRhX1JlZmVyZW5jZT4KKwlib29sCisJb3BlcmF0b3IoKShNZXRhZGF0YV9SZWZlcmVuY2Ugcl9kYXRhLCBzaXplX3R5cGUgbV9tYXhfY291bnQpIGNvbnN0CisJeworCSAgaWYgKCsrcl9kYXRhLm1fY291bnQgIT0gbV9tYXhfY291bnQpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIHJfZGF0YS5tX2NvdW50ID0gMDsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX3BvbGljeS9zYW1wbGVfdXBkYXRlX3BvbGljeS5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfcG9saWN5L3NhbXBsZV91cGRhdGVfcG9saWN5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQ3ODRmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX3BvbGljeS9zYW1wbGVfdXBkYXRlX3BvbGljeS5ocHAKQEAgLTAsMCArMSw3NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzYW1wbGVfdXBkYXRlX3BvbGljeS5ocHAKKyAqIENvbnRhaW5zIGEgc2FtcGxlIHBvbGljeSBmb3IgbGlzdCB1cGRhdGUgY29udGFpbmVycy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NBTVBMRV9VUERBVEVfUE9MSUNZX0hQUAorI2RlZmluZSBQQl9EU19TQU1QTEVfVVBEQVRFX1BPTElDWV9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgLy8vIEEgc2FtcGxlIGxpc3QtdXBkYXRlIHBvbGljeS4KKyAgc3RydWN0IHNhbXBsZV91cGRhdGVfcG9saWN5CisgIHsKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBzYW1wbGVfdXBkYXRlX3BvbGljeSgpOworCisgICAgLy8vIENvcHkgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3VwZGF0ZV9wb2xpY3koY29uc3Qgc2FtcGxlX3VwZGF0ZV9wb2xpY3kmKTsKKworICAgIC8vLyBTd2FwcyBjb250ZW50LgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChzYW1wbGVfdXBkYXRlX3BvbGljeSYgb3RoZXIpOworCisgIHByb3RlY3RlZDoKKyAgICAvLy8gTWV0YWRhdGEgb24gd2hpY2ggdGhpcyBmdW5jdG9yIG9wZXJhdGVzLgorICAgIHR5cGVkZWYgc29tZV9tZXRhZGF0YV90eXBlIG1ldGFkYXRhX3R5cGU7CisKKyAgICAvLy8gQ3JlYXRlcyBhIG1ldGFkYXRhIG9iamVjdC4KKyAgICBtZXRhZGF0YV90eXBlCisgICAgb3BlcmF0b3IoKSgpIGNvbnN0OworCisgICAgLy8vIERlY2lkZXMgd2hldGhlciBhIG1ldGFkYXRhIG9iamVjdCBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIGZyb250CisgICAgLy8vIG9mIHRoZSBsaXN0LiBBIGxpc3QtdXBkYXRlIGJhc2VkIGNvbnRhaW5lcnMgb2JqZWN0IHdpbGwgY2FsbAorICAgIC8vLyB0aGlzIG1ldGhvZCB0byBkZWNpZGUgd2hldGhlciB0byBtb3ZlIGEgbm9kZSB0byB0aGUgZnJvbnQgb2YKKyAgICAvLy8gdGhlIGxpc3QuIFRoZSBtZXRob2Qgc2hvdWxlIHJldHVybiB0cnVlIGlmIHRoZSBub2RlIHNob3VsZCBiZQorICAgIC8vLyBtb3ZlZCB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCisgICAgYm9vbAorICAgIG9wZXJhdG9yKCkobWV0YWRhdGFfcmVmZXJlbmNlKSBjb25zdDsKKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIxZTUwZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyNTcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgb3ZfdHJlZV9tYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igb3ZfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjp2YWx1ZV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX3ZhbHVlX2FsbG9jOworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om1ldGFkYXRhX2FsbG9jYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfbWV0YWRhdGFfYWxsb2M7CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19PVl9UUkVFX05BTUUoKSA6CisgIG1fYV92YWx1ZXMoMCksCisgIG1fYV9tZXRhZGF0YSgwKSwKKyAgbV9lbmRfaXQoMCksCisgIG1fc2l6ZSgwKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfT1ZfVFJFRV9OQU1FKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pIDoKKyAgY21wX2ZuKHJfY21wX2ZuKSwKKyAgbV9hX3ZhbHVlcygwKSwKKyAgbV9hX21ldGFkYXRhKDApLAorICBtX2VuZF9pdCgwKSwKKyAgbV9zaXplKDApCit7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19PVl9UUkVFX05BTUUoY29uc3QgQ21wX0ZuJiByX2NtcF9mbiwgY29uc3Qgbm9kZV91cGRhdGUmIHJfbm9kZXUpIDoKKyAgY21wX2ZuKHJfY21wX2ZuKSwKKyAgbm9kZV91cGRhdGUocl9ub2RldSksCisgIG1fYV92YWx1ZXMoMCksCisgIG1fYV9tZXRhZGF0YSgwKSwKKyAgbV9lbmRfaXQoMCksCisgIG1fc2l6ZSgwKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfT1ZfVFJFRV9OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgOgorI2lmZGVmIFBCX0RTX1RSRUVfVFJBQ0UKKyAgdHJhY2VfYmFzZShvdGhlciksCisjZW5kaWYKKyAgY21wX2ZuKG90aGVyKSwKKyAgbm9kZV91cGRhdGUob3RoZXIpLAorICBtX2FfdmFsdWVzKDApLAorICBtX2FfbWV0YWRhdGEoMCksCisgIG1fZW5kX2l0KDApLAorICBtX3NpemUoMCkKK3sKKyAgY29weV9mcm9tX29yZGVyZWRfcmFuZ2Uob3RoZXIuYmVnaW4oKSwgb3RoZXIuZW5kKCkpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0PgoraW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvcHlfZnJvbV9yYW5nZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCkKK3sKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgIHR5cGVkZWYgc3RkOjptYXA8a2V5X3R5cGUsIG1hcHBlZF90eXBlLCBDbXBfRm4sCisJCSAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+OjpvdGhlcj4KKyAgICBtYXBfdHlwZTsKKyNlbHNlCisgIHR5cGVkZWYgc3RkOjpzZXQ8a2V5X3R5cGUsIENtcF9GbiwKKwkJICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXI+CisgICAgbWFwX3R5cGU7CisjZW5kaWYKKworICBtYXBfdHlwZSBtKGZpcnN0X2l0LCBsYXN0X2l0KTsKKyAgY29weV9mcm9tX29yZGVyZWRfcmFuZ2UobS5iZWdpbigpLCBtLmVuZCgpKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvcHlfZnJvbV9vcmRlcmVkX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICBjb25zdCBzaXplX3R5cGUgbGVuID0gc3RkOjpkaXN0YW5jZShmaXJzdF9pdCwgbGFzdF9pdCk7CisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm47CisKKyAgdmFsdWVfdmVjdG9yIGFfdmFsdWVzID0gc192YWx1ZV9hbGxvYy5hbGxvY2F0ZShsZW4pOworICBpdGVyYXRvciB0YXJnZXRfaXQgPSBhX3ZhbHVlczsKKyAgSXQgc291cmNlX2l0ID0gZmlyc3RfaXQ7CisgIEl0IHNvdXJjZV9lbmRfaXQgPSBsYXN0X2l0OworCisgIGNvbmRfZHRvcjxzaXplX3R5cGU+IGNkKGFfdmFsdWVzLCB0YXJnZXRfaXQsIGxlbik7CisgIHdoaWxlIChzb3VyY2VfaXQgIT0gc291cmNlX2VuZF9pdCkKKyAgICB7CisgICAgICB2b2lkKiBfX3YgPSBjb25zdF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odGFyZ2V0X2l0KSk7CisgICAgICBuZXcgKF9fdikgdmFsdWVfdHlwZSgqc291cmNlX2l0KyspOworICAgICAgKyt0YXJnZXRfaXQ7CisgICAgfQorCisgIHJlYWxsb2NhdGVfbWV0YWRhdGEoKG5vZGVfdXBkYXRlKil0aGlzLCBsZW4pOworICBjZC5zZXRfbm9fYWN0aW9uKCk7CisgIG1fYV92YWx1ZXMgPSBhX3ZhbHVlczsKKyAgbV9zaXplID0gbGVuOworICBtX2VuZF9pdCA9IG1fYV92YWx1ZXMgKyBtX3NpemU7CisgIHVwZGF0ZShQQl9EU19ub2RlX2JlZ2luX2ltcCgpLCAobm9kZV91cGRhdGUqKXRoaXMpOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgZm9yIChjb25zdF9pdGVyYXRvciBkYmdfaXQgPSBtX2FfdmFsdWVzOyBkYmdfaXQgIT0gbV9lbmRfaXQ7ICsrZGJnX2l0KQorICAgIGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoUEJfRFNfVjJGKCpkYmdfaXQpKTsKKyNlbmRpZgorfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb3B5X2Zyb21fb3JkZXJlZF9yYW5nZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCwgSXQgb3RoZXJfZmlyc3RfaXQsCisJCQlJdCBvdGhlcl9sYXN0X2l0KQoreworICBjbGVhcigpOworICBjb25zdCBzaXplX3R5cGUgbGVuID0gc3RkOjpkaXN0YW5jZShmaXJzdF9pdCwgbGFzdF9pdCkKKyAgICAJCQkgKyBzdGQ6OmRpc3RhbmNlKG90aGVyX2ZpcnN0X2l0LCBvdGhlcl9sYXN0X2l0KTsKKworICB2YWx1ZV92ZWN0b3IgYV92YWx1ZXMgPSBzX3ZhbHVlX2FsbG9jLmFsbG9jYXRlKGxlbik7CisKKyAgaXRlcmF0b3IgdGFyZ2V0X2l0ID0gYV92YWx1ZXM7CisgIEl0IHNvdXJjZV9pdCA9IGZpcnN0X2l0OworICBJdCBzb3VyY2VfZW5kX2l0ID0gbGFzdF9pdDsKKworICBjb25kX2R0b3I8c2l6ZV90eXBlPiBjZChhX3ZhbHVlcywgdGFyZ2V0X2l0LCBsZW4pOworICB3aGlsZSAoc291cmNlX2l0ICE9IHNvdXJjZV9lbmRfaXQpCisgICAgeworICAgICAgbmV3IChjb25zdF9jYXN0PHZvaWQqID4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCogPih0YXJnZXRfaXQpKSkKKwl2YWx1ZV90eXBlKCpzb3VyY2VfaXQrKyk7CisgICAgICArK3RhcmdldF9pdDsKKyAgICB9CisKKyAgc291cmNlX2l0ID0gb3RoZXJfZmlyc3RfaXQ7CisgIHNvdXJjZV9lbmRfaXQgPSBvdGhlcl9sYXN0X2l0OworCisgIHdoaWxlIChzb3VyY2VfaXQgIT0gc291cmNlX2VuZF9pdCkKKyAgICB7CisgICAgICBuZXcgKGNvbnN0X2Nhc3Q8dm9pZCogPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKiA+KHRhcmdldF9pdCkpKQorCXZhbHVlX3R5cGUoKnNvdXJjZV9pdCsrKTsKKyAgICAgICsrdGFyZ2V0X2l0OworICAgIH0KKworICByZWFsbG9jYXRlX21ldGFkYXRhKChub2RlX3VwZGF0ZSogKXRoaXMsIGxlbik7CisgIGNkLnNldF9ub19hY3Rpb24oKTsKKyAgbV9hX3ZhbHVlcyA9IGFfdmFsdWVzOworICBtX3NpemUgPSBsZW47CisgIG1fZW5kX2l0ID0gbV9hX3ZhbHVlcyArIG1fc2l6ZTsKKyAgdXBkYXRlKFBCX0RTX25vZGVfYmVnaW5faW1wKCksIChub2RlX3VwZGF0ZSogKXRoaXMpOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgZm9yIChjb25zdF9pdGVyYXRvciBkYmdfaXQgPSBtX2FfdmFsdWVzOyBkYmdfaXQgIT0gbV9lbmRfaXQ7ICsrZGJnX2l0KQorICAgIGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoUEJfRFNfVjJGKCpkYmdfaXQpKTsKKyNlbmRpZgorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgIHZhbHVlX3N3YXAob3RoZXIpOworICBzdGQ6OnN3YXAoc3RhdGljX2Nhc3Q8Y21wX2ZuJj4oKnRoaXMpLAorCSAgICBzdGF0aWNfY2FzdDxjbXBfZm4mPihvdGhlcikpOworICBzdGQ6OnN3YXAoc3RhdGljX2Nhc3Q8dHJhaXRzX2Jhc2UmPigqdGhpcyksCisJICAgIHN0YXRpY19jYXN0PHRyYWl0c19iYXNlJj4ob3RoZXIpKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ZhbHVlX3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OnN3YXAob3RoZXIpOykKKyAgc3RkOjpzd2FwKG1fYV92YWx1ZXMsIG90aGVyLm1fYV92YWx1ZXMpOworICBzdGQ6OnN3YXAobV9hX21ldGFkYXRhLCBvdGhlci5tX2FfbWV0YWRhdGEpOworICBzdGQ6OnN3YXAobV9zaXplLCBvdGhlci5tX3NpemUpOworICBzdGQ6OnN3YXAobV9lbmRfaXQsIG90aGVyLm1fZW5kX2l0KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK35QQl9EU19PVl9UUkVFX05BTUUoKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgY29uZF9kdG9yPHNpemVfdHlwZT4gY2QobV9hX3ZhbHVlcywgbV9lbmRfaXQsIG1fc2l6ZSk7CisgIHJlYWxsb2NhdGVfbWV0YWRhdGEoKG5vZGVfdXBkYXRlKil0aGlzLCAwKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cGRhdGUobm9kZV9pdGVyYXRvciwgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZT4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwZGF0ZShub2RlX2l0ZXJhdG9yIG5kX2l0LCBOb2RlX1VwZGF0ZSogcF91cGRhdGUpCit7CisgIG5vZGVfY29uc3RfaXRlcmF0b3IgZW5kX2l0ID0gUEJfRFNfbm9kZV9lbmRfaW1wKCk7CisgIGlmIChuZF9pdCAhPSBlbmRfaXQpCisgICAgeworICAgICAgdXBkYXRlKG5kX2l0LmdldF9sX2NoaWxkKCksIHBfdXBkYXRlKTsKKyAgICAgIHVwZGF0ZShuZF9pdC5nZXRfcl9jaGlsZCgpLCBwX3VwZGF0ZSk7CisgICAgICBub2RlX3VwZGF0ZTo6b3BlcmF0b3IoKShuZF9pdCwgZW5kX2l0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODc3NDM3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDc5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG92X3RyZWVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgaWYgKG1fYV92YWx1ZXMgPT0gMCB8fCBtX2VuZF9pdCA9PSAwIHx8IG1fc2l6ZSA9PSAwKQorICAgIFBCX0RTX0RFQlVHX1ZFUklGWShtX2FfdmFsdWVzID09IDAgJiYgIG1fZW5kX2l0ID09IDAgJiYgbV9zaXplID09IDApOworCisgIGFzc2VydF9pdGVyYXRvcnMoX19maWxlLCBfX2xpbmUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2l0ZXJhdG9ycyhjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGRlYnVnX2Jhc2U6OmNoZWNrX3NpemUobV9zaXplLCBfX2ZpbGUsIF9fbGluZSk7CisgIHNpemVfdHlwZSBpdGVyYXRlZF9udW0gPSAwOworICBjb25zdF9pdGVyYXRvciBwcmV2X2l0ID0gZW5kKCk7CisgIFBCX0RTX0RFQlVHX1ZFUklGWShtX2VuZF9pdCA9PSBtX2FfdmFsdWVzICsgbV9zaXplKTsKKyAgZm9yIChjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7IGl0ICE9IGVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgICsraXRlcmF0ZWRfbnVtOworICAgICAgZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhQQl9EU19WMkYoKml0KSwgX19maWxlLCBfX2xpbmUpOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKGxvd2VyX2JvdW5kKFBCX0RTX1YyRigqaXQpKSA9PSBpdCk7CisgICAgICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZF9pdCA9IHVwcGVyX2JvdW5kKFBCX0RTX1YyRigqaXQpKTsKKyAgICAgIC0tdXBwZXJfYm91bmRfaXQ7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkodXBwZXJfYm91bmRfaXQgPT0gaXQpOworICAgICAgaWYgKHByZXZfaXQgIT0gZW5kKCkpCisJUEJfRFNfREVCVUdfVkVSSUZZKENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYoKnByZXZfaXQpLAorCQkJCQkgICAgICBQQl9EU19WMkYoKml0KSkpOworICAgICAgcHJldl9pdCA9IGl0OworICAgIH0KKyAgUEJfRFNfREVCVUdfVkVSSUZZKGl0ZXJhdGVkX251bSA9PSBtX3NpemUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5N2YxMzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTkxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG92X3RyZWVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcigpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBpZiAobV9zaXplID09IDApCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlYWxsb2NhdGVfbWV0YWRhdGEoKG5vZGVfdXBkYXRlKiApdGhpcywgMCk7CisgICAgICBjb25kX2R0b3I8c2l6ZV90eXBlPiBjZChtX2FfdmFsdWVzLCBtX2VuZF9pdCwgbV9zaXplKTsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjbGVhcigpOykKKyAgbV9hX3ZhbHVlcyA9IDA7CisgIG1fc2l6ZSA9IDA7CisgIG1fZW5kX2l0ID0gbV9hX3ZhbHVlczsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgoraW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2lmKFByZWQgcHJlZCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisKKyNpZmRlZiBQQl9EU19SRUdSRVNTSU9OCisgICAgdHlwZW5hbWUgX0FsbG9jOjpncm91cF9hZGp1c3RvciBhZGp1c3QobV9zaXplKTsKKyNlbmRpZgorCisgIHNpemVfdHlwZSBuZXdfc2l6ZSA9IDA7CisgIHNpemVfdHlwZSBudW1fdmFsX2Vyc2QgPSAwOworCisgIGZvciAoaXRlcmF0b3Igc291cmNlX2l0ID0gYmVnaW4oKTsgc291cmNlX2l0ICE9IG1fZW5kX2l0OyArK3NvdXJjZV9pdCkKKyAgICBpZiAoIXByZWQoKnNvdXJjZV9pdCkpCisgICAgICArK25ld19zaXplOworICAgIGVsc2UKKyAgICAgICsrbnVtX3ZhbF9lcnNkOworCisgIGlmIChuZXdfc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIGNsZWFyKCk7CisgICAgICByZXR1cm4gbnVtX3ZhbF9lcnNkOworICAgIH0KKworICB2YWx1ZV92ZWN0b3IgYV9uZXdfdmFsdWVzID0gc192YWx1ZV9hbGxvYy5hbGxvY2F0ZShuZXdfc2l6ZSk7CisgIGl0ZXJhdG9yIHRhcmdldF9pdCA9IGFfbmV3X3ZhbHVlczsKKyAgY29uZF9kdG9yPHNpemVfdHlwZT4gY2QoYV9uZXdfdmFsdWVzLCB0YXJnZXRfaXQsIG5ld19zaXplKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjbGVhcigpKTsKKyAgZm9yIChpdGVyYXRvciBzb3VyY2VfaXQgPSBiZWdpbigpOyBzb3VyY2VfaXQgIT0gbV9lbmRfaXQ7ICsrc291cmNlX2l0KQorICAgIHsKKyAgICAgIGlmICghcHJlZCgqc291cmNlX2l0KSkKKwl7CisJICBuZXcgKGNvbnN0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih0YXJnZXRfaXQpKSkKKwkgICAgdmFsdWVfdHlwZSgqc291cmNlX2l0KTsKKworCSAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRigqc291cmNlX2l0KSkpOworCSAgKyt0YXJnZXRfaXQ7CisJfQorICAgIH0KKworICByZWFsbG9jYXRlX21ldGFkYXRhKChub2RlX3VwZGF0ZSopdGhpcywgbmV3X3NpemUpOworICBjZC5zZXRfbm9fYWN0aW9uKCk7CisKKyAgeworICAgIGNvbmRfZHRvcjxzaXplX3R5cGU+IGNkMShtX2FfdmFsdWVzLCBtX2VuZF9pdCwgbV9zaXplKTsKKyAgfQorCisgIG1fYV92YWx1ZXMgPSBhX25ld192YWx1ZXM7CisgIG1fc2l6ZSA9IG5ld19zaXplOworICBtX2VuZF9pdCA9IHRhcmdldF9pdDsKKyAgdXBkYXRlKG5vZGVfYmVnaW4oKSwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBudW1fdmFsX2Vyc2Q7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK0l0CitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pbXAoSXQgaXQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBpZiAoaXQgPT0gZW5kKCkpCisgICAgcmV0dXJuIGVuZCgpOworCisgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMoUEJfRFNfVjJGKCppdCkpCisKKyNpZmRlZiBQQl9EU19SRUdSRVNTSU9OCisgICAgdHlwZW5hbWUgX0FsbG9jOjpncm91cF9hZGp1c3RvciBhZGp1c3QobV9zaXplKTsKKyNlbmRpZgorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3NpemUgPiAwKTsKKyAgdmFsdWVfdmVjdG9yIGFfdmFsdWVzID0gc192YWx1ZV9hbGxvYy5hbGxvY2F0ZShtX3NpemUgLSAxKTsKKyAgaXRlcmF0b3Igc291cmNlX2l0ID0gYmVnaW4oKTsKKyAgaXRlcmF0b3Igc291cmNlX2VuZF9pdCA9IGVuZCgpOworICBpdGVyYXRvciB0YXJnZXRfaXQgPSBhX3ZhbHVlczsKKyAgaXRlcmF0b3IgcmV0X2l0ID0gZW5kKCk7CisKKyAgY29uZF9kdG9yPHNpemVfdHlwZT4gY2QoYV92YWx1ZXMsIHRhcmdldF9pdCwgbV9zaXplIC0gMSk7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShzaXplX3R5cGUgY250ID0gMDspCisKKyAgd2hpbGUgKHNvdXJjZV9pdCAhPSBzb3VyY2VfZW5kX2l0KQorICAgIHsKKyAgICAgIGlmIChzb3VyY2VfaXQgIT0gaXQpCisJeworCSAgX0dMSUJDWFhfREVCVUdfT05MWSgrK2NudDspCisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoY250ICE9IG1fc2l6ZSk7CisJICBuZXcgKGNvbnN0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih0YXJnZXRfaXQpKSkKKwkgICAgICB2YWx1ZV90eXBlKCpzb3VyY2VfaXQpOworCisJICArK3RhcmdldF9pdDsKKwl9CisgICAgICBlbHNlCisJcmV0X2l0ID0gdGFyZ2V0X2l0OworICAgICsrc291cmNlX2l0OworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID4gMCk7CisgIHJlYWxsb2NhdGVfbWV0YWRhdGEoKG5vZGVfdXBkYXRlKil0aGlzLCBtX3NpemUgLSAxKTsKKyAgY2Quc2V0X25vX2FjdGlvbigpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmVyYXNlX2V4aXN0aW5nKFBCX0RTX1YyRigqaXQpKTspCisgIHsKKyAgICBjb25kX2R0b3I8c2l6ZV90eXBlPiBjZDEobV9hX3ZhbHVlcywgbV9lbmRfaXQsIG1fc2l6ZSk7CisgIH0KKworICBtX2FfdmFsdWVzID0gYV92YWx1ZXM7CisgIC0tbV9zaXplOworICBtX2VuZF9pdCA9IG1fYV92YWx1ZXMgKyBtX3NpemU7CisgIHVwZGF0ZShub2RlX2JlZ2luKCksIChub2RlX3VwZGF0ZSopdGhpcyk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gSXQocmV0X2l0KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2Jvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIHBvaW50X2l0ZXJhdG9yIGl0ID0gZmluZChyX2tleSk7CisgIGlmIChpdCA9PSBlbmQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGVyYXNlKGl0KTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2luZm9fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4MjI4ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vaW5mb19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDYwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG92X3RyZWVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igb3ZfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitzaXplKCkgY29uc3QKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBtX3NpemU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWF4X3NpemUoKSBjb25zdAoreyByZXR1cm4gc192YWx1ZV9hbGxvYy5tYXhfc2l6ZSgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW1wdHkoKSBjb25zdAoreyByZXR1cm4gc2l6ZSgpID09IDA7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmNzk5NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNjMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgb3ZfdHJlZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZWFsbG9jYXRlX21ldGFkYXRhKG51bGxfbm9kZV91cGRhdGVfcG9pbnRlciwgc2l6ZV90eXBlKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZV8+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZWFsbG9jYXRlX21ldGFkYXRhKE5vZGVfVXBkYXRlXyogLCBzaXplX3R5cGUgbmV3X3NpemUpCit7CisgIG1ldGFkYXRhX3BvaW50ZXIgYV9uZXdfbWV0YWRhdGFfdmVjID0obmV3X3NpemUgPT0gMCkgPyAwIDogc19tZXRhZGF0YV9hbGxvYy5hbGxvY2F0ZShuZXdfc2l6ZSk7CisKKyAgaWYgKG1fYV9tZXRhZGF0YSAhPSAwKQorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9zaXplOyArK2kpCisJbV9hX21ldGFkYXRhW2ldLn5tZXRhZGF0YV90eXBlKCk7CisgICAgICBzX21ldGFkYXRhX2FsbG9jLmRlYWxsb2NhdGUobV9hX21ldGFkYXRhLCBtX3NpemUpOworICAgIH0KKyAgc3RkOjpzd2FwKG1fYV9tZXRhZGF0YSwgYV9uZXdfbWV0YWRhdGFfdmVjKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmE2YWQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgb3ZfdHJlZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vZGVfYmVnaW4oKSBjb25zdAoreyByZXR1cm4gUEJfRFNfbm9kZV9iZWdpbl9pbXAoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2NvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citub2RlX2VuZCgpIGNvbnN0Cit7IHJldHVybiBQQl9EU19ub2RlX2VuZF9pbXAoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citub2RlX2JlZ2luKCkKK3sgcmV0dXJuIFBCX0RTX25vZGVfYmVnaW5faW1wKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm9kZV9lbmQoKQoreyByZXR1cm4gUEJfRFNfbm9kZV9lbmRfaW1wKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9jb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfbm9kZV9iZWdpbl9pbXAoKSBjb25zdAoreworICByZXR1cm4gbm9kZV9jb25zdF9pdGVyYXRvcihjb25zdF9jYXN0PHBvaW50ZXI+KG1pZF9wb2ludGVyKGJlZ2luKCksIGVuZCgpKSksCisJCQkgICAgICBjb25zdF9jYXN0PHBvaW50ZXI+KGJlZ2luKCkpLAorCQkJICAgICAgY29uc3RfY2FzdDxwb2ludGVyPihlbmQoKSksKG1fYV9tZXRhZGF0YSA9PSAwKT8KKwkJCSAgICAgIDAgOgorCQkJICAgICAgbWlkX3BvaW50ZXIobV9hX21ldGFkYXRhLCBtX2FfbWV0YWRhdGEgKyBtX3NpemUpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9jb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfbm9kZV9lbmRfaW1wKCkgY29uc3QKK3sKKyAgcmV0dXJuIG5vZGVfY29uc3RfaXRlcmF0b3IoZW5kKCksIGVuZCgpLCBlbmQoKSwKKwkJICAgICAobV9hX21ldGFkYXRhID09IDApID8gMCA6IG1fYV9tZXRhZGF0YSArIG1fc2l6ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX25vZGVfYmVnaW5faW1wKCkKK3sKKyAgcmV0dXJuIG5vZGVfaXRlcmF0b3IobWlkX3BvaW50ZXIoYmVnaW4oKSwgZW5kKCkpLCBiZWdpbigpLCBlbmQoKSwKKwkJICAgICAgIChtX2FfbWV0YWRhdGEgPT0gMCkgPyAwIDogbWlkX3BvaW50ZXIobV9hX21ldGFkYXRhLCBtX2FfbWV0YWRhdGEgKyBtX3NpemUpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfbm9kZV9lbmRfaW1wKCkKK3sKKyAgcmV0dXJuIG5vZGVfaXRlcmF0b3IoZW5kKCksIGVuZCgpLAorCQkgIGVuZCgpLChtX2FfbWV0YWRhdGEgPT0gMCkgPyAwIDogbV9hX21ldGFkYXRhICsgbV9zaXplKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9ub2RlX2l0ZXJhdG9ycy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL25vZGVfaXRlcmF0b3JzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzg0NTczCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9ub2RlX2l0ZXJhdG9ycy5ocHAKQEAgLTAsMCArMSwyOTEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgb3ZfdHJlZV9tYXBfL25vZGVfaXRlcmF0b3JzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKKyNpZm5kZWYgUEJfRFNfT1ZfVFJFRV9OT0RFX0lURVJBVE9SU19IUFAKKyNkZWZpbmUgUEJfRFNfT1ZfVFJFRV9OT0RFX0lURVJBVE9SU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19PVl9UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ19ERUMJXAorICAgIG92X3RyZWVfbm9kZV9jb25zdF9pdF88VmFsdWVfVHlwZSwgTWV0YWRhdGFfVHlwZSwgX0FsbG9jPgorCisgICAgLy8vIENvbnN0IG5vZGUgcmVmZXJlbmNlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIE1ldGFkYXRhX1R5cGUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBvdl90cmVlX25vZGVfY29uc3RfaXRfCisgICAgeworCisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisgICAgICBWYWx1ZV9UeXBlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIHBvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCVZhbHVlX1R5cGU+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgY29uc3RfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJTWV0YWRhdGFfVHlwZT46Om90aGVyOjpjb25zdF9wb2ludGVyCisgICAgICBjb25zdF9tZXRhZGF0YV9wb2ludGVyOworCisgICAgICB0eXBlZGVmIFBCX0RTX09WX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DX0RFQyB0aGlzX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFB0cj4KKyAgICAgIGlubGluZSBzdGF0aWMgUHRyCisgICAgICBtaWRfcG9pbnRlcihQdHIgcF9iZWdpbiwgUHRyIHBfZW5kKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2VuZCA+PSBwX2JlZ2luKTsKKwlyZXR1cm4gKHBfYmVnaW4gKyAocF9lbmQgLSBwX2JlZ2luKSAvIDIpOworICAgICAgfQorCisgICAgcHVibGljOgorCisgICAgICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJVmFsdWVfVHlwZT46Om90aGVyOjpjb25zdF9wb2ludGVyCisgICAgICB2YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKwl0eXBlbmFtZSByZW1vdmVfY29uc3Q8CisJVmFsdWVfVHlwZT46OnR5cGU+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKwl0eXBlbmFtZSByZW1vdmVfY29uc3Q8CisJVmFsdWVfVHlwZT46OnR5cGU+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIE1ldGFkYXRhX1R5cGUgbWV0YWRhdGFfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJbWV0YWRhdGFfdHlwZT46Om90aGVyOjpjb25zdF9yZWZlcmVuY2UKKyAgICAgIG1ldGFkYXRhX2NvbnN0X3JlZmVyZW5jZTsKKworICAgIHB1YmxpYzoKKyAgICAgIGlubGluZQorICAgICAgb3ZfdHJlZV9ub2RlX2NvbnN0X2l0Xyhjb25zdF9wb2ludGVyIHBfbmQgPSAwLCAgY29uc3RfcG9pbnRlciBwX2JlZ2luX25kID0gMCwgIGNvbnN0X3BvaW50ZXIgcF9lbmRfbmQgPSAwLCAgY29uc3RfbWV0YWRhdGFfcG9pbnRlciBwX21ldGFkYXRhID0gMCkgOiBtX3BfdmFsdWUoY29uc3RfY2FzdDxwb2ludGVyPihwX25kKSksIG1fcF9iZWdpbl92YWx1ZShjb25zdF9jYXN0PHBvaW50ZXI+KHBfYmVnaW5fbmQpKSwgbV9wX2VuZF92YWx1ZShjb25zdF9jYXN0PHBvaW50ZXI+KHBfZW5kX25kKSksIG1fcF9tZXRhZGF0YShwX21ldGFkYXRhKQorICAgICAgeyB9CisKKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfdmFsdWU7IH0KKworICAgICAgaW5saW5lIG1ldGFkYXRhX2NvbnN0X3JlZmVyZW5jZQorICAgICAgZ2V0X21ldGFkYXRhKCkgY29uc3QKKyAgICAgIHsKKwllbnVtCisJICB7CisJICAgIGhhc19tZXRhZGF0YSA9ICFpc19zYW1lPE1ldGFkYXRhX1R5cGUsIG51bGxfdHlwZT46OnZhbHVlCisJICB9OworCisJUEJfRFNfU1RBVElDX0FTU0VSVChzaG91bGRfaGF2ZV9tZXRhZGF0YSwgaGFzX21ldGFkYXRhKTsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX21ldGFkYXRhICE9IDApOworCXJldHVybiAqbV9wX21ldGFkYXRhOworICAgICAgfQorCisgICAgICAvLy8gUmV0dXJucyB0aGUgbm9kZSBpdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGxlZnQgbm9kZS4KKyAgICAgIGlubGluZSB0aGlzX3R5cGUKKyAgICAgIGdldF9sX2NoaWxkKCkgY29uc3QKKyAgICAgIHsKKwlpZiAobV9wX2JlZ2luX3ZhbHVlID09IG1fcF92YWx1ZSkKKwkgIHJldHVybiAodGhpc190eXBlKG1fcF9iZWdpbl92YWx1ZSwgbV9wX2JlZ2luX3ZhbHVlLCBtX3BfYmVnaW5fdmFsdWUpKTsKKworCWNvbnN0X21ldGFkYXRhX3BvaW50ZXIgcF9iZWdpbl9tZXRhZGF0YSA9CisJICBtX3BfbWV0YWRhdGEgLSAobV9wX3ZhbHVlIC0gbV9wX2JlZ2luX3ZhbHVlKTsKKworCXJldHVybiAodGhpc190eXBlKG1pZF9wb2ludGVyKG1fcF9iZWdpbl92YWx1ZSwgbV9wX3ZhbHVlKSwKKwkJCSAgbV9wX2JlZ2luX3ZhbHVlLAorCQkJICBtX3BfdmFsdWUsCisJCQkgIG1pZF9wb2ludGVyKHBfYmVnaW5fbWV0YWRhdGEsIG1fcF9tZXRhZGF0YSkpKTsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIG5vZGUgaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByaWdodCBub2RlLgorICAgICAgaW5saW5lIHRoaXNfdHlwZQorICAgICAgZ2V0X3JfY2hpbGQoKSBjb25zdAorICAgICAgeworCWlmIChtX3BfdmFsdWUgPT0gbV9wX2VuZF92YWx1ZSkKKwkgIHJldHVybiAodGhpc190eXBlKG1fcF9lbmRfdmFsdWUsIG1fcF9lbmRfdmFsdWUsIG1fcF9lbmRfdmFsdWUpKTsKKworCWNvbnN0X21ldGFkYXRhX3BvaW50ZXIgcF9lbmRfbWV0YWRhdGEgPQorCSAgbV9wX21ldGFkYXRhICsgKG1fcF9lbmRfdmFsdWUgLSBtX3BfdmFsdWUpOworCisJcmV0dXJuICh0aGlzX3R5cGUobWlkX3BvaW50ZXIobV9wX3ZhbHVlICsgMSwgbV9wX2VuZF92YWx1ZSksCisJCQkgIG1fcF92YWx1ZSArIDEsCisJCQkgIG1fcF9lbmRfdmFsdWUsKG1fcF9tZXRhZGF0YSA9PSAwKSA/CisJCQkgIDAgOiBtaWRfcG9pbnRlcihtX3BfbWV0YWRhdGEgKyAxLCBwX2VuZF9tZXRhZGF0YSkpKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgdGhpc190eXBlJiBvdGhlcikgY29uc3QKKyAgICAgIHsKKwljb25zdCBib29sIGlzX2VuZCA9IG1fcF9iZWdpbl92YWx1ZSA9PSBtX3BfZW5kX3ZhbHVlOworCWNvbnN0IGJvb2wgaXNfb3RoZXJfZW5kID0gb3RoZXIubV9wX2JlZ2luX3ZhbHVlID09IG90aGVyLm1fcF9lbmRfdmFsdWU7CisKKwlpZiAoaXNfZW5kKQorCSAgcmV0dXJuIChpc19vdGhlcl9lbmQpOworCisJaWYgKGlzX290aGVyX2VuZCkKKwkgIHJldHVybiAoaXNfZW5kKTsKKworCXJldHVybiBtX3BfdmFsdWUgPT0gb3RoZXIubV9wX3ZhbHVlOworICAgICAgfQorCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCB0aGlzX3R5cGUmIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOyB9CisKKyAgICBwdWJsaWM6CisgICAgICBwb2ludGVyIG1fcF92YWx1ZTsKKyAgICAgIHBvaW50ZXIgbV9wX2JlZ2luX3ZhbHVlOworICAgICAgcG9pbnRlciBtX3BfZW5kX3ZhbHVlOworCisgICAgICBjb25zdF9tZXRhZGF0YV9wb2ludGVyIG1fcF9tZXRhZGF0YTsKKyAgICB9OworCisjZGVmaW5lIFBCX0RTX09WX1RSRUVfTk9ERV9JVEVSQVRPUl9DX0RFQyBcCisgICAgb3ZfdHJlZV9ub2RlX2l0XzxWYWx1ZV9UeXBlLCBNZXRhZGF0YV9UeXBlLCBfQWxsb2M+CisKKyAgICAvLy8gTm9kZSByZWZlcmVuY2UuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgTWV0YWRhdGFfVHlwZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIG92X3RyZWVfbm9kZV9pdF8gOiBwdWJsaWMgUEJfRFNfT1ZfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NfREVDCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIFBCX0RTX09WX1RSRUVfTk9ERV9JVEVSQVRPUl9DX0RFQyB0aGlzX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgUEJfRFNfT1ZfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NfREVDIGJhc2VfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9tZXRhZGF0YV9wb2ludGVyCisgICAgICBjb25zdF9tZXRhZGF0YV9wb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX2RpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCVZhbHVlX1R5cGU+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PAorCVZhbHVlX1R5cGU+Ojp0eXBlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIHJlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PAorCVZhbHVlX1R5cGU+Ojp0eXBlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgaW5saW5lCisgICAgICBvdl90cmVlX25vZGVfaXRfKGNvbnN0X3BvaW50ZXIgcF9uZCA9IDAsICBjb25zdF9wb2ludGVyIHBfYmVnaW5fbmQgPSAwLCAgY29uc3RfcG9pbnRlciBwX2VuZF9uZCA9IDAsICBjb25zdF9tZXRhZGF0YV9wb2ludGVyIHBfbWV0YWRhdGEgPSAwKSA6IGJhc2VfdHlwZShwX25kLCAgcF9iZWdpbl9uZCwgIHBfZW5kX25kLCAgcF9tZXRhZGF0YSkKKyAgICAgIHsgfQorCisgICAgICAvLy8gQWNjZXNzLgorICAgICAgaW5saW5lIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJlZmVyZW5jZShiYXNlX3R5cGU6Om1fcF92YWx1ZSk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIG5vZGUgcmVmZXJlbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGVmdCBub2RlLgorICAgICAgaW5saW5lIG92X3RyZWVfbm9kZV9pdF8KKyAgICAgIGdldF9sX2NoaWxkKCkgY29uc3QKKyAgICAgIHsKKwlpZiAoYmFzZV90eXBlOjptX3BfYmVnaW5fdmFsdWUgPT0gYmFzZV90eXBlOjptX3BfdmFsdWUpCisJICByZXR1cm4gKHRoaXNfdHlwZShiYXNlX3R5cGU6Om1fcF9iZWdpbl92YWx1ZSwgIGJhc2VfdHlwZTo6bV9wX2JlZ2luX3ZhbHVlLCAgYmFzZV90eXBlOjptX3BfYmVnaW5fdmFsdWUpKTsKKworCWNvbnN0X21ldGFkYXRhX3BvaW50ZXIgcF9iZWdpbl9tZXRhZGF0YSA9CisJICBiYXNlX3R5cGU6Om1fcF9tZXRhZGF0YSAtIChiYXNlX3R5cGU6Om1fcF92YWx1ZSAtIGJhc2VfdHlwZTo6bV9wX2JlZ2luX3ZhbHVlKTsKKworCXJldHVybiAodGhpc190eXBlKGJhc2VfdHlwZTo6bWlkX3BvaW50ZXIoYmFzZV90eXBlOjptX3BfYmVnaW5fdmFsdWUsIGJhc2VfdHlwZTo6bV9wX3ZhbHVlKSwKKwkJCSAgYmFzZV90eXBlOjptX3BfYmVnaW5fdmFsdWUsCisJCQkgIGJhc2VfdHlwZTo6bV9wX3ZhbHVlLAorCQkJICBiYXNlX3R5cGU6Om1pZF9wb2ludGVyKHBfYmVnaW5fbWV0YWRhdGEsIGJhc2VfdHlwZTo6bV9wX21ldGFkYXRhKSkpOworICAgICAgfQorCisgICAgICAvLy8gUmV0dXJucyB0aGUgbm9kZSByZWZlcmVuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByaWdodCBub2RlLgorICAgICAgaW5saW5lIG92X3RyZWVfbm9kZV9pdF8KKyAgICAgIGdldF9yX2NoaWxkKCkgY29uc3QKKyAgICAgIHsKKwlpZiAoYmFzZV90eXBlOjptX3BfdmFsdWUgPT0gYmFzZV90eXBlOjptX3BfZW5kX3ZhbHVlKQorCSAgcmV0dXJuIHRoaXNfdHlwZShiYXNlX3R5cGU6Om1fcF9lbmRfdmFsdWUsIGJhc2VfdHlwZTo6bV9wX2VuZF92YWx1ZSwgIAorCQkJICAgYmFzZV90eXBlOjptX3BfZW5kX3ZhbHVlKTsKKworCWNvbnN0X21ldGFkYXRhX3BvaW50ZXIgcF9lbmRfbWV0YWRhdGEgPQorCSAgYmFzZV90eXBlOjptX3BfbWV0YWRhdGEgKyAoYmFzZV90eXBlOjptX3BfZW5kX3ZhbHVlIC0gYmFzZV90eXBlOjptX3BfdmFsdWUpOworCisJcmV0dXJuICh0aGlzX3R5cGUoYmFzZV90eXBlOjptaWRfcG9pbnRlcihiYXNlX3R5cGU6Om1fcF92YWx1ZSArIDEsIGJhc2VfdHlwZTo6bV9wX2VuZF92YWx1ZSksCisJCQkgIGJhc2VfdHlwZTo6bV9wX3ZhbHVlICsgMSwKKwkJCSAgYmFzZV90eXBlOjptX3BfZW5kX3ZhbHVlLChiYXNlX3R5cGU6Om1fcF9tZXRhZGF0YSA9PSAwKT8KKwkJCSAgMCA6IGJhc2VfdHlwZTo6bWlkX3BvaW50ZXIoYmFzZV90eXBlOjptX3BfbWV0YWRhdGEgKyAxLCBwX2VuZF9tZXRhZGF0YSkpKTsKKyAgICAgIH0KKworICAgIH07CisKKyN1bmRlZiBQQl9EU19PVl9UUkVFX05PREVfSVRFUkFUT1JfQ19ERUMKKyN1bmRlZiBQQl9EU19PVl9UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ19ERUMKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vb3ZfdHJlZV9tYXBfLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vb3ZfdHJlZV9tYXBfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmYzZWMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9vdl90cmVlX21hcF8uaHBwCkBAIC0wLDAgKzEsNTQyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG92X3RyZWVfbWFwXy9vdl90cmVlX21hcF8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igb3ZfdHJlZS4KKyAqLworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZXhjZXB0aW9uLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZXFfZm4vZXFfYnlfbGVzcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlc190cmFpdHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90cmVlX3RyYWNlX2Jhc2UuaHBwPgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9kZWJ1Z19tYXBfYmFzZS5ocHA+CisjZW5kaWYKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX09WX1RSRUVfTkFNRSBvdl90cmVlX21hcAorI2RlZmluZSBQQl9EU19DT05TVF9OT0RFX0lURVJBVE9SX05BTUUgb3ZfdHJlZV9ub2RlX2NvbnN0X2l0ZXJhdG9yX21hcAorI2VuZGlmCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19PVl9UUkVFX05BTUUgb3ZfdHJlZV9zZXQKKyNkZWZpbmUgUEJfRFNfQ09OU1RfTk9ERV9JVEVSQVRPUl9OQU1FIG92X3RyZWVfbm9kZV9jb25zdF9pdGVyYXRvcl9zZXQKKyNlbmRpZgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgQ21wX0ZuLCBcCisJICAgICB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICBQQl9EU19PVl9UUkVFX05BTUU8S2V5LCBNYXBwZWQsIENtcF9GbiwgTm9kZV9BbmRfSXRfVHJhaXRzLCBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfT1ZfVFJFRV9UUkFJVFNfQkFTRSBcCisgICAgdHlwZXNfdHJhaXRzPEtleSwgTWFwcGVkLCBfQWxsb2MsIGZhbHNlPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNkZWZpbmUgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgXAorICAgIGRlYnVnX21hcF9iYXNlPEtleSwgZXFfYnlfbGVzczxLZXksIENtcF9Gbj4sIFwKKyAgICAgICAJdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZT4KKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfVFJFRV9UUkFDRQorI2RlZmluZSBQQl9EU19UUkVFX1RSQUNFX0JBU0VfQ19ERUMgXAorICAgIHRyZWVfdHJhY2VfYmFzZTx0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6Om5vZGVfY29uc3RfaXRlcmF0b3IsCVwKKwkJICAgIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0czo6bm9kZV9pdGVyYXRvciwJCVwKKwkJICAgIENtcF9GbiwgZmFsc2UsIF9BbGxvYz4KKyNlbmRpZgorCisjaWZuZGVmIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMKKyMgIGVycm9yIE1pc3NpbmcgZGVmaW5pdGlvbgorI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmIE9yZGVyZWQtdmVjdG9yIHRyZWUgYXNzb2NpYXRpdmUtY29udGFpbmVyLgorICAgICAqICBAaW5ncm91cCBicmFuY2gtZGV0YWlsCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIENtcF9GbiwKKwkgICAgIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIFBCX0RTX09WX1RSRUVfTkFNRSA6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHByb3RlY3RlZCBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQywKKyNlbmRpZgorI2lmZGVmIFBCX0RTX1RSRUVfVFJBQ0UKKyAgICAgIHB1YmxpYyBQQl9EU19UUkVFX1RSQUNFX0JBU0VfQ19ERUMsCisjZW5kaWYKKyAgICAgIHB1YmxpYyBDbXBfRm4sCisgICAgICBwdWJsaWMgTm9kZV9BbmRfSXRfVHJhaXRzOjpub2RlX3VwZGF0ZSwKKyAgICAgIHB1YmxpYyBQQl9EU19PVl9UUkVFX1RSQUlUU19CQVNFCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIFBCX0RTX09WX1RSRUVfVFJBSVRTX0JBU0UJICAgICAgIAkJdHJhaXRzX2Jhc2U7CisgICAgICB0eXBlZGVmIE5vZGVfQW5kX0l0X1RyYWl0cwkJCXRyYWl0c190eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jb25zdDx0eXBlbmFtZSB0cmFpdHNfYmFzZTo6dmFsdWVfdHlwZT46OnR5cGUgbm9uX2NvbnN0X3ZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8bm9uX2NvbnN0X3ZhbHVlX3R5cGU+OjpvdGhlciB2YWx1ZV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHZhbHVlX2FsbG9jYXRvcjo6cG9pbnRlciAJdmFsdWVfdmVjdG9yOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHR5cGVkZWYgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgCQlkZWJ1Z19iYXNlOworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19UUkVFX1RSQUNFCisgICAgICB0eXBlZGVmIFBCX0RTX1RSRUVfVFJBQ0VfQkFTRV9DX0RFQyAJCXRyYWNlX2Jhc2U7CisjZW5kaWYKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cG9pbnRlciAJCW1hcHBlZF9wb2ludGVyXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3BvaW50ZXIgCW1hcHBlZF9jb25zdF9wb2ludGVyXzsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6bWV0YWRhdGFfdHlwZSAJbWV0YWRhdGFfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxtZXRhZGF0YV90eXBlPjo6b3RoZXIgbWV0YWRhdGFfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBtZXRhZGF0YV9hbGxvY2F0b3I6OnBvaW50ZXIgCW1ldGFkYXRhX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1ldGFkYXRhX2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlIG1ldGFkYXRhX2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbWV0YWRhdGFfYWxsb2NhdG9yOjpyZWZlcmVuY2UgCW1ldGFkYXRhX3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6bnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyCisgICAgICBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIG92X3RyZWVfdGFnIAkJCQkgY29udGFpbmVyX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBfQWxsb2MgCQkJCQlhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIAkJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBDbXBfRm4gCQkJCQljbXBfZm47CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV90eXBlIAkJa2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfcG9pbnRlciAJa2V5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfY29uc3RfcG9pbnRlciAJa2V5X2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfcmVmZXJlbmNlIAlrZXlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X2NvbnN0X3JlZmVyZW5jZSBrZXlfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3R5cGUgCW1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3BvaW50ZXIgCW1hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX2NvbnN0X3BvaW50ZXIgbWFwcGVkX2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfcmVmZXJlbmNlIAltYXBwZWRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX2NvbnN0X3JlZmVyZW5jZSBtYXBwZWRfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6dmFsdWVfdHlwZSAJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpwb2ludGVyIAkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpyZWZlcmVuY2UgCQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBjb25zdF9wb2ludGVyIAkJCQlwb2ludF9jb25zdF9pdGVyYXRvcjsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIHBvaW50ZXIgCQkJCQlwb2ludF9pdGVyYXRvcjsKKyNlbHNlCisgICAgICB0eXBlZGVmIHBvaW50X2NvbnN0X2l0ZXJhdG9yIAkJCXBvaW50X2l0ZXJhdG9yOworI2VuZGlmCisKKyAgICAgIHR5cGVkZWYgcG9pbnRfaXRlcmF0b3IgCQkJCWl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBwb2ludF9jb25zdF9pdGVyYXRvciAJCQljb25zdF9pdGVyYXRvcjsKKworICAgICAgLy8vIENvbmRpdGlvbmFsIGRlc3RydWN0b3IuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisgICAgICAgIGNsYXNzIGNvbmRfZHRvcgorICAgICAgICB7CisJcHVibGljOgorCSAgY29uZF9kdG9yKHZhbHVlX3ZlY3RvciBhX3ZlYywgaXRlcmF0b3ImIHJfbGFzdF9pdCwgCisJCSAgICBTaXplX1R5cGUgdG90YWxfc2l6ZSkgCisJICA6IG1fYV92ZWMoYV92ZWMpLCBtX3JfbGFzdF9pdChyX2xhc3RfaXQpLCBtX21heF9zaXplKHRvdGFsX3NpemUpLAorCSAgICBtX25vX2FjdGlvbihmYWxzZSkKKwkgIHsgfQorCisJICB+Y29uZF9kdG9yKCkKKwkgIHsKKwkgICAgaWYgKG1fbm9fYWN0aW9uKQorCSAgICAgIHJldHVybjsKKwkgICAgaXRlcmF0b3IgaXQgPSBtX2FfdmVjOworCSAgICB3aGlsZSAoaXQgIT0gbV9yX2xhc3RfaXQpCisJICAgICAgeworCQlpdC0+fnZhbHVlX3R5cGUoKTsKKwkJKytpdDsKKwkgICAgICB9CisJICAgIAorCSAgICBpZiAobV9tYXhfc2l6ZSA+IDApCisJICAgICAgdmFsdWVfYWxsb2NhdG9yKCkuZGVhbGxvY2F0ZShtX2FfdmVjLCBtX21heF9zaXplKTsKKwkgIH0KKworCSAgaW5saW5lIHZvaWQKKwkgIHNldF9ub19hY3Rpb24oKQorCSAgeyBtX25vX2FjdGlvbiA9IHRydWU7IH0KKwkgIAorCXByb3RlY3RlZDoKKwkgIHZhbHVlX3ZlY3RvciAJCW1fYV92ZWM7CisJICBpdGVyYXRvciYgCQltX3JfbGFzdF9pdDsKKwkgIGNvbnN0IFNpemVfVHlwZSAJbV9tYXhfc2l6ZTsKKwkgIGJvb2wgCQkJbV9ub19hY3Rpb247CisgICAgICAgfTsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6bm9kZV91cGRhdGUgCW5vZGVfdXBkYXRlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6bm9kZV9pdGVyYXRvciAJbm9kZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om5vZGVfY29uc3RfaXRlcmF0b3IJbm9kZV9jb25zdF9pdGVyYXRvcjsKKworCisgICAgICBQQl9EU19PVl9UUkVFX05BTUUoKTsKKworICAgICAgUEJfRFNfT1ZfVFJFRV9OQU1FKGNvbnN0IENtcF9GbiYpOworCisgICAgICBQQl9EU19PVl9UUkVFX05BTUUoY29uc3QgQ21wX0ZuJiwgY29uc3Qgbm9kZV91cGRhdGUmKTsKKworICAgICAgUEJfRFNfT1ZfVFJFRV9OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIH5QQl9EU19PVl9UUkVFX05BTUUoKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICAgIHZvaWQKKyAgICAgIGNvcHlfZnJvbV9yYW5nZShJdCwgSXQpOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0OworCisgICAgICBDbXBfRm4mCisgICAgICBnZXRfY21wX2ZuKCk7CisKKyAgICAgIGNvbnN0IENtcF9GbiYKKyAgICAgIGdldF9jbXBfZm4oKSBjb25zdDsKKworICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKKyAgICAgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisJUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisJcG9pbnRfaXRlcmF0b3IgaXQgPSBsb3dlcl9ib3VuZChyX2tleSk7CisJaWYgKGl0ICE9IGVuZCgpICYmICFDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRigqaXQpKSkKKwkgIHsKKwkgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhyX2tleSkKKwkgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisJICAgICByZXR1cm4gaXQtPnNlY29uZDsKKwkgIH0KKwlyZXR1cm4gaW5zZXJ0X25ld192YWwoaXQsIHN0ZDo6bWFrZV9wYWlyKHJfa2V5LCBtYXBwZWRfdHlwZSgpKSktPnNlY29uZDsKKyNlbHNlCisJaW5zZXJ0KHJfa2V5KTsKKwlyZXR1cm4gdHJhaXRzX2Jhc2U6OnNfbnVsbF90eXBlOworI2VuZGlmCisgICAgICB9CisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsdWUpCisgICAgICB7CisJUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisJa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSA9IFBCX0RTX1YyRihyX3ZhbHVlKTsKKwlwb2ludF9pdGVyYXRvciBpdCA9IGxvd2VyX2JvdW5kKHJfa2V5KTsKKworCWlmIChpdCAhPSBlbmQoKSYmICAhQ21wX0ZuOjpvcGVyYXRvcigpKHJfa2V5LCBQQl9EU19WMkYoKml0KSkpCisJICB7CisJICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCSAgICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorCSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXQsIGZhbHNlKTsKKwkgIH0KKworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpbnNlcnRfbmV3X3ZhbChpdCwgcl92YWx1ZSksIHRydWUpOworICAgICAgfQorCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCisgICAgICB7CisJcG9pbnRlciBpdCA9IG1fYV92YWx1ZXM7CisJcG9pbnRlciBlX2l0ID0gbV9hX3ZhbHVlcyArIG1fc2l6ZTsKKwl3aGlsZSAoaXQgIT0gZV9pdCkKKwkgIHsKKwkgICAgcG9pbnRlciBtaWRfaXQgPSBpdCArICgoZV9pdCAtIGl0KSA+PiAxKTsKKwkgICAgaWYgKGNtcF9mbjo6b3BlcmF0b3IoKShQQl9EU19WMkYoKm1pZF9pdCksIHJfa2V5KSkKKwkgICAgICBpdCA9ICsrbWlkX2l0OworCSAgICBlbHNlCisJICAgICAgZV9pdCA9IG1pZF9pdDsKKwkgIH0KKwlyZXR1cm4gaXQ7CisgICAgICB9CisKKyAgICAgIGlubGluZSBwb2ludF9jb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMmID4oKnRoaXMpLmxvd2VyX2JvdW5kKHJfa2V5KTsgfQorCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCisgICAgICB7CisJaXRlcmF0b3IgcG90X2l0ID0gbG93ZXJfYm91bmQocl9rZXkpOworCWlmIChwb3RfaXQgIT0gZW5kKCkgJiYgIUNtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKCpwb3RfaXQpKSkKKwkgIHsKKwkgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhyX2tleSkKKwkgICAgcmV0dXJuICsrcG90X2l0OworCSAgfQorCisJUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorCXJldHVybiBwb3RfaXQ7CisgICAgICB9CisKKyAgICAgIGlubGluZSBwb2ludF9jb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMmPigqdGhpcykudXBwZXJfYm91bmQocl9rZXkpOyB9CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgZmluZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQorICAgICAgeworCVBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCWl0ZXJhdG9yIHBvdF9pdCA9IGxvd2VyX2JvdW5kKHJfa2V5KTsKKwlpZiAocG90X2l0ICE9IGVuZCgpICYmICFDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRigqcG90X2l0KSkpCisJICB7CisJICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisJICAgIHJldHVybiBwb3RfaXQ7CisJICB9CisKKwlQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisJcmV0dXJuIGVuZCgpOworICAgICAgfQorCisgICAgICBpbmxpbmUgcG9pbnRfY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIChjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDJj4oKnRoaXMpLmZpbmQocl9rZXkpKTsgfQorCisgICAgICBib29sCisgICAgICBlcmFzZShrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIGVyYXNlX2lmKFByZWQpOworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIGl0KQorICAgICAgeyByZXR1cm4gZXJhc2VfaW1wPGl0ZXJhdG9yPihpdCk7IH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKTsKKworICAgICAgdm9pZAorICAgICAgam9pbihQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBzcGxpdChrZXlfY29uc3RfcmVmZXJlbmNlLCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIG1fYV92YWx1ZXM7IH0KKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBtX2FfdmFsdWVzOyB9CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIG1fZW5kX2l0OyB9CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fZW5kX2l0OyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIGEgY29uc3Qgbm9kZV9pdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlIGF0IHRoZQorICAgICAgLy8vIHJvb3Qgb2YgdGhlIHRyZWUuCisgICAgICBpbmxpbmUgbm9kZV9jb25zdF9pdGVyYXRvcgorICAgICAgbm9kZV9iZWdpbigpIGNvbnN0OworCisgICAgICAvLy8gUmV0dXJucyBhIG5vZGVfaXRlcmF0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZSBhdCB0aGUKKyAgICAgIC8vLyByb290IG9mIHRoZSB0cmVlLgorICAgICAgaW5saW5lIG5vZGVfaXRlcmF0b3IKKyAgICAgIG5vZGVfYmVnaW4oKTsKKworICAgICAgLy8vIFJldHVybnMgYSBjb25zdCBub2RlX2l0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gYSBub2RlIGp1c3QKKyAgICAgIC8vLyBhZnRlciBhIGxlYWYgb2YgdGhlIHRyZWUuCisgICAgICBpbmxpbmUgbm9kZV9jb25zdF9pdGVyYXRvcgorICAgICAgbm9kZV9lbmQoKSBjb25zdDsKKworICAgICAgLy8vIFJldHVybnMgYSBub2RlX2l0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gYSBub2RlIGp1c3QKKyAgICAgIC8vLyBhZnRlciBhIGxlYWYgb2YgdGhlIHRyZWUuCisgICAgICBpbmxpbmUgbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9lbmQoKTsKKworICAgIHByaXZhdGU6CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICB1cGRhdGUobm9kZV9pdGVyYXRvciwgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGU+CisgICAgICB2b2lkCisgICAgICB1cGRhdGUobm9kZV9pdGVyYXRvciwgTm9kZV9VcGRhdGUqKTsKKworICAgICAgdm9pZAorICAgICAgcmVhbGxvY2F0ZV9tZXRhZGF0YShudWxsX25vZGVfdXBkYXRlX3BvaW50ZXIsIHNpemVfdHlwZSk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlXz4KKyAgICAgIHZvaWQKKyAgICAgIHJlYWxsb2NhdGVfbWV0YWRhdGEoTm9kZV9VcGRhdGVfKiwgc2l6ZV90eXBlKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fb3JkZXJlZF9yYW5nZShJdCwgSXQpOworCisgICAgICB2b2lkCisgICAgICB2YWx1ZV9zd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX29yZGVyZWRfcmFuZ2UoSXQsIEl0LCBJdCwgSXQpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQdHI+CisgICAgICBpbmxpbmUgc3RhdGljIFB0cgorICAgICAgbWlkX3BvaW50ZXIoUHRyIHBfYmVnaW4sIFB0ciBwX2VuZCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9lbmQgPj0gcF9iZWdpbik7CisJcmV0dXJuIChwX2JlZ2luICsgKHBfZW5kIC0gcF9iZWdpbikgLyAyKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfbmV3X3ZhbChpdGVyYXRvciBpdCwgY29uc3RfcmVmZXJlbmNlIHJfdmFsdWUpCisgICAgICB7CisjaWZkZWYgUEJfRFNfUkVHUkVTU0lPTgorCXR5cGVuYW1lIF9BbGxvYzo6Z3JvdXBfYWRqdXN0b3IgYWRqdXN0KG1fc2l6ZSk7CisjZW5kaWYKKworCVBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChQQl9EU19WMkYocl92YWx1ZSkpCisKKwl2YWx1ZV92ZWN0b3IgYV92YWx1ZXMgPSBzX3ZhbHVlX2FsbG9jLmFsbG9jYXRlKG1fc2l6ZSArIDEpOworCisJaXRlcmF0b3Igc291cmNlX2l0ID0gYmVnaW4oKTsKKwlpdGVyYXRvciBzb3VyY2VfZW5kX2l0ID0gZW5kKCk7CisJaXRlcmF0b3IgdGFyZ2V0X2l0ID0gYV92YWx1ZXM7CisJaXRlcmF0b3IgcmV0X2l0OworCisJY29uZF9kdG9yPHNpemVfdHlwZT4gY2QoYV92YWx1ZXMsIHRhcmdldF9pdCwgbV9zaXplICsgMSk7CisJd2hpbGUgKHNvdXJjZV9pdCAhPSBpdCkKKwkgIHsKKwkgICAgbmV3IChjb25zdF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odGFyZ2V0X2l0KSkpCisJICAgICAgdmFsdWVfdHlwZSgqc291cmNlX2l0KyspOworCSAgICArK3RhcmdldF9pdDsKKwkgIH0KKworCW5ldyAoY29uc3RfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHJldF9pdCA9IHRhcmdldF9pdCkpKQorCSAgdmFsdWVfdHlwZShyX3ZhbHVlKTsKKwkrK3RhcmdldF9pdDsKKworCXdoaWxlIChzb3VyY2VfaXQgIT0gc291cmNlX2VuZF9pdCkKKwkgIHsKKwkgICAgbmV3IChjb25zdF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odGFyZ2V0X2l0KSkpCisJICAgICAgdmFsdWVfdHlwZSgqc291cmNlX2l0KyspOworCSAgICArK3RhcmdldF9pdDsKKwkgIH0KKworCXJlYWxsb2NhdGVfbWV0YWRhdGEoKG5vZGVfdXBkYXRlKil0aGlzLCBtX3NpemUgKyAxKTsKKwljZC5zZXRfbm9fYWN0aW9uKCk7CisJaWYgKG1fc2l6ZSAhPSAwKQorCSAgeworCSAgICBjb25kX2R0b3I8c2l6ZV90eXBlPiBjZDEobV9hX3ZhbHVlcywgbV9lbmRfaXQsIG1fc2l6ZSk7CisJICB9CisKKwkrK21fc2l6ZTsKKwltX2FfdmFsdWVzID0gYV92YWx1ZXM7CisJbV9lbmRfaXQgPSBtX2FfdmFsdWVzICsgbV9zaXplOworCV9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhQQl9EU19WMkYocl92YWx1ZSkpKTsKKwl1cGRhdGUobm9kZV9iZWdpbigpLCAobm9kZV91cGRhdGUqICl0aGlzKTsKKwlQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKwlyZXR1cm4gcmV0X2l0OworICAgICAgfQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X2l0ZXJhdG9ycyhjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICAgIEl0CisgICAgICBlcmFzZV9pbXAoSXQpOworCisgICAgICBpbmxpbmUgbm9kZV9jb25zdF9pdGVyYXRvcgorICAgICAgUEJfRFNfbm9kZV9iZWdpbl9pbXAoKSBjb25zdDsKKworICAgICAgaW5saW5lIG5vZGVfY29uc3RfaXRlcmF0b3IKKyAgICAgIFBCX0RTX25vZGVfZW5kX2ltcCgpIGNvbnN0OworCisgICAgICBpbmxpbmUgbm9kZV9pdGVyYXRvcgorICAgICAgUEJfRFNfbm9kZV9iZWdpbl9pbXAoKTsKKworICAgICAgaW5saW5lIG5vZGVfaXRlcmF0b3IKKyAgICAgIFBCX0RTX25vZGVfZW5kX2ltcCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHN0YXRpYyB2YWx1ZV9hbGxvY2F0b3IgCXNfdmFsdWVfYWxsb2M7CisgICAgICBzdGF0aWMgbWV0YWRhdGFfYWxsb2NhdG9yIHNfbWV0YWRhdGFfYWxsb2M7CisKKyAgICAgIHZhbHVlX3ZlY3RvciAJCW1fYV92YWx1ZXM7CisgICAgICBtZXRhZGF0YV9wb2ludGVyIAkJbV9hX21ldGFkYXRhOworICAgICAgaXRlcmF0b3IgCQkJbV9lbmRfaXQ7CisgICAgICBzaXplX3R5cGUgCQltX3NpemU7CisgICAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vaW5mb19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX09WX1RSRUVfTkFNRQorI3VuZGVmIFBCX0RTX09WX1RSRUVfVFJBSVRTX0JBU0UKKyN1bmRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQworI2lmZGVmIFBCX0RTX1RSRUVfVFJBQ0UKKyN1bmRlZiBQQl9EU19UUkVFX1RSQUNFX0JBU0VfQ19ERUMKKyNlbmRpZgorI3VuZGVmIFBCX0RTX0NPTlNUX05PREVfSVRFUkFUT1JfTkFNRQorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmE5MGE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgb3ZfdHJlZV9tYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBvdl90cmVlLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitDbXBfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2NtcF9mbigpCit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgQ21wX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9jbXBfZm4oKSBjb25zdAoreyByZXR1cm4gKnRoaXM7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDJjNWFiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTMyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG92X3RyZWVfbWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igb3ZfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGl0KGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKworICBpZiAobV9zaXplID09IDApCisgICAgeworICAgICAgb3RoZXIuY2xlYXIoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKCpiZWdpbigpKSkpCisgICAgeworICAgICAgdmFsdWVfc3dhcChvdGhlcik7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRigqKGVuZCgpIC0gMSkpKSkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChtX3NpemUgPT0gMSkKKyAgICB7CisgICAgICB2YWx1ZV9zd2FwKG90aGVyKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBpdGVyYXRvciBpdCA9IHVwcGVyX2JvdW5kKHJfa2V5KTsKKyAgUEJfRFNfQ0xBU1NfQ19ERUMgbmV3X290aGVyKG90aGVyLCBvdGhlcik7CisgIG5ld19vdGhlci5jb3B5X2Zyb21fb3JkZXJlZF9yYW5nZShpdCwgZW5kKCkpOworICBQQl9EU19DTEFTU19DX0RFQyBuZXdfdGhpcygqdGhpcywgKnRoaXMpOworICBuZXdfdGhpcy5jb3B5X2Zyb21fb3JkZXJlZF9yYW5nZShiZWdpbigpLCBpdCk7CisKKyAgLy8gTm8gZXhjZXB0aW9ucyBmcm9tIHRoaXMgcG9pbnQuCisgIG90aGVyLnVwZGF0ZShvdGhlci5ub2RlX2JlZ2luKCksIChub2RlX3VwZGF0ZSopKCZvdGhlcikpOworICB1cGRhdGUobm9kZV9iZWdpbigpLCAobm9kZV91cGRhdGUqKXRoaXMpOworICBvdGhlci52YWx1ZV9zd2FwKG5ld19vdGhlcik7CisgIHZhbHVlX3N3YXAobmV3X3RoaXMpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbihQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgIGlmIChvdGhlci5tX3NpemUgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKG1fc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIHZhbHVlX3N3YXAob3RoZXIpOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgICAgICByZXR1cm47CisgICAgfQorCisgIGNvbnN0IGJvb2wgZ3JlYXRlciA9IENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYoKihlbmQoKSAtIDEpKSwKKwkJCQkJICBQQl9EU19WMkYoKm90aGVyLmJlZ2luKCkpKTsKKworICBjb25zdCBib29sIGxlc3NlciA9IENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYoKihvdGhlci5lbmQoKSAtIDEpKSwKKwkJCQkJIFBCX0RTX1YyRigqYmVnaW4oKSkpOworCisgIGlmICghZ3JlYXRlciAmJiAhbGVzc2VyKQorICAgIF9fdGhyb3dfam9pbl9lcnJvcigpOworCisgIFBCX0RTX0NMQVNTX0NfREVDIG5ld190aGlzKCp0aGlzLCAqdGhpcyk7CisKKyAgaWYgKGdyZWF0ZXIpCisgICAgbmV3X3RoaXMuY29weV9mcm9tX29yZGVyZWRfcmFuZ2UoYmVnaW4oKSwgZW5kKCksCisJCQkJICAgICBvdGhlci5iZWdpbigpLCBvdGhlci5lbmQoKSk7CisgIGVsc2UKKyAgICBuZXdfdGhpcy5jb3B5X2Zyb21fb3JkZXJlZF9yYW5nZShvdGhlci5iZWdpbigpLCBvdGhlci5lbmQoKSwKKwkJCQkgICAgIGJlZ2luKCksIGVuZCgpKTsKKworICAvLyBObyBleGNlcHRpb25zIGZyb20gdGhpcyBwb2ludC4KKyAgdmFsdWVfc3dhcChuZXdfdGhpcyk7CisgIG90aGVyLmNsZWFyKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL3RyYWl0cy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL3RyYWl0cy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwYzBjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vdHJhaXRzLmhwcApAQCAtMCwwICsxLDE5MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBvdl90cmVlX21hcF8vdHJhaXRzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKKyNpZm5kZWYgUEJfRFNfT1ZfVFJFRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisjZGVmaW5lIFBCX0RTX09WX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vbm9kZV9pdGVyYXRvcnMuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gVHJlZSB0cmFpdHMuCisgICAgLy8vIEBpbmdyb3VwIHRyYWl0cworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICAgIGNsYXNzIENtcF9GbiwKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwKKwkJICAgICAgY2xhc3MgTm9kZV9JdHIsCisJCSAgICAgIGNsYXNzIENtcF9Gbl8sCisJCSAgICAgIHR5cGVuYW1lIF9BbGxvY18+CisgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHRyZWVfdHJhaXRzPAorICAgICAgS2V5LAorICAgICAgTWFwcGVkLAorICAgICAgQ21wX0ZuLAorICAgICAgTm9kZV9VcGRhdGUsCisgICAgICBvdl90cmVlX3RhZywKKyAgICAgIF9BbGxvYz4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIHR5cGVzX3RyYWl0czwKKyAgICAgIEtleSwKKyAgICAgIE1hcHBlZCwKKyAgICAgIF9BbGxvYywKKyAgICAgIGZhbHNlPjo6dmFsdWVfdHlwZQorICAgICAgdmFsdWVfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIHRyZWVfbm9kZV9tZXRhZGF0YV9kaXNwYXRjaDwKKyAgICAgIEtleSwKKyAgICAgIE1hcHBlZCwKKyAgICAgIENtcF9GbiwKKyAgICAgIE5vZGVfVXBkYXRlLAorICAgICAgX0FsbG9jPjo6dHlwZQorICAgICAgbWV0YWRhdGFfdHlwZTsKKworICAgICAgLy8vIFRoaXMgaXMgYW4gaXRlcmF0b3IgdG8gYW4gaXRlcmF0b3I6IGl0IGl0ZXJhdGVzIG92ZXIgbm9kZXMsCisgICAgICAvLy8gYW5kIGRlLXJlZmVyZW5jaW5nIGl0IHJldHVybnMgb25lIG9mIHRoZSB0cmVlJ3MgaXRlcmF0b3JzLgorICAgICAgdHlwZWRlZgorICAgICAgb3ZfdHJlZV9ub2RlX2NvbnN0X2l0XzwKKwl2YWx1ZV90eXBlLAorCW1ldGFkYXRhX3R5cGUsCisJX0FsbG9jPgorICAgICAgbm9kZV9jb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgb3ZfdHJlZV9ub2RlX2l0XzwKKwl2YWx1ZV90eXBlLAorCW1ldGFkYXRhX3R5cGUsCisJX0FsbG9jPgorICAgICAgbm9kZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgTm9kZV9VcGRhdGU8CisJbm9kZV9jb25zdF9pdGVyYXRvciwKKwlub2RlX2l0ZXJhdG9yLAorCUNtcF9GbiwKKwlfQWxsb2M+CisgICAgICBub2RlX3VwZGF0ZTsKKworICAgICAgdHlwZWRlZgorICAgICAgX19nbnVfcGJkczo6bnVsbF9ub2RlX3VwZGF0ZTwKKwlub2RlX2NvbnN0X2l0ZXJhdG9yLAorCW5vZGVfaXRlcmF0b3IsCisJQ21wX0ZuLAorCV9BbGxvYz4qIAorICAgICAgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyOworICAgIH07CisKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbi4KKyAgICAvLy8gQGluZ3JvdXAgdHJhaXRzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgY2xhc3MgQ21wX0ZuLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLAorCQkgICAgICBjbGFzcyBOb2RlX0l0ciwKKwkJICAgICAgY2xhc3MgQ21wX0ZuXywKKwkJICAgICAgdHlwZW5hbWUgX0FsbG9jXz4KKyAgICBjbGFzcyBOb2RlX1VwZGF0ZSwKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgdHJlZV90cmFpdHM8CisgICAgICBLZXksCisgICAgICBudWxsX3R5cGUsCisgICAgICBDbXBfRm4sCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIG92X3RyZWVfdGFnLAorICAgICAgX0FsbG9jPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgdHlwZXNfdHJhaXRzPAorICAgICAgS2V5LAorICAgICAgbnVsbF90eXBlLAorICAgICAgX0FsbG9jLAorICAgICAgZmFsc2U+Ojp2YWx1ZV90eXBlCisgICAgICB2YWx1ZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgdHJlZV9ub2RlX21ldGFkYXRhX2Rpc3BhdGNoPAorICAgICAgS2V5LAorICAgICAgbnVsbF90eXBlLAorICAgICAgQ21wX0ZuLAorICAgICAgTm9kZV9VcGRhdGUsCisgICAgICBfQWxsb2M+Ojp0eXBlCisgICAgICBtZXRhZGF0YV90eXBlOworCisgICAgICAvLy8gVGhpcyBpcyBhbiBpdGVyYXRvciB0byBhbiBpdGVyYXRvcjogaXQgaXRlcmF0ZXMgb3ZlciBub2RlcywKKyAgICAgIC8vLyBhbmQgZGUtcmVmZXJlbmNpbmcgaXQgcmV0dXJucyBvbmUgb2YgdGhlIHRyZWUncyBpdGVyYXRvcnMuCisgICAgICB0eXBlZGVmCisgICAgICBvdl90cmVlX25vZGVfY29uc3RfaXRfPAorCXZhbHVlX3R5cGUsCisJbWV0YWRhdGFfdHlwZSwKKwlfQWxsb2M+CisgICAgICBub2RlX2NvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIG5vZGVfY29uc3RfaXRlcmF0b3Igbm9kZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgTm9kZV9VcGRhdGU8CisJbm9kZV9jb25zdF9pdGVyYXRvciwKKwlub2RlX2NvbnN0X2l0ZXJhdG9yLAorCUNtcF9GbiwKKwlfQWxsb2M+CisgICAgICBub2RlX3VwZGF0ZTsKKworICAgICAgdHlwZWRlZgorICAgICAgX19nbnVfcGJkczo6bnVsbF9ub2RlX3VwZGF0ZTwKKwlub2RlX2NvbnN0X2l0ZXJhdG9yLAorCW5vZGVfaXRlcmF0b3IsCisJQ21wX0ZuLAorCV9BbGxvYz4qIAorICAgICAgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyOworICAgIH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19PVl9UUkVFX05PREVfQU5EX0lUX1RSQUlUU19IUFAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTFiYTllCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw4MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYWlyaW5nX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBwYWlyaW5nIGhlYXAuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICB3aGlsZSAoZmlyc3RfaXQgIT0gbGFzdF9pdCkKKyAgICBwdXNoKCooZmlyc3RfaXQrKykpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BhaXJpbmdfaGVhcCgpCit7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitwYWlyaW5nX2hlYXAoY29uc3QgQ21wX0ZuJiByX2NtcF9mbikKKzogYmFzZV90eXBlKHJfY21wX2ZuKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorcGFpcmluZ19oZWFwKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKzogYmFzZV90eXBlKG90aGVyKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBiYXNlX3R5cGU6OnN3YXAob3RoZXIpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK35wYWlyaW5nX2hlYXAoKQoreyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTNkMWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDUzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhaXJpbmdfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHBhaXJpbmcgaGVhcC4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIFBCX0RTX0RFQlVHX1ZFUklGWShiYXNlX3R5cGU6Om1fcF9yb290ID09IDAgCisJCSAgICAgICAgfHwgYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9wX25leHRfc2libGluZyA9PSAwKTsKKyAgYmFzZV90eXBlOjphc3NlcnRfdmFsaWQoX19maWxlLCBfX2xpbmUpOworfQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjM5MzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDIzMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYWlyaW5nX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBwYWlyaW5nIGhlYXAuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BvcCgpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWJhc2VfdHlwZTo6ZW1wdHkoKSk7CisKKyAgbm9kZV9wb2ludGVyIHBfbmV3X3Jvb3QgPSBqb2luX25vZGVfY2hpbGRyZW4oYmFzZV90eXBlOjptX3Bfcm9vdCk7CisgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF9uZXdfcm9vdCwgZmFsc2UpCisgIGlmIChwX25ld19yb290ICE9IDApCisgICAgcF9uZXdfcm9vdC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKworICBiYXNlX3R5cGU6OmFjdHVhbF9lcmFzZV9ub2RlKGJhc2VfdHlwZTo6bV9wX3Jvb3QpOworICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZXdfcm9vdDsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShwb2ludF9pdGVyYXRvciBpdCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghYmFzZV90eXBlOjplbXB0eSgpKTsKKyAgcmVtb3ZlX25vZGUoaXQubV9wX25kKTsKKyAgYmFzZV90eXBlOjphY3R1YWxfZXJhc2Vfbm9kZShpdC5tX3BfbmQpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlbW92ZV9ub2RlKG5vZGVfcG9pbnRlciBwX25kKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFiYXNlX3R5cGU6OmVtcHR5KCkpOworICBub2RlX3BvaW50ZXIgcF9uZXdfY2hpbGQgPSBqb2luX25vZGVfY2hpbGRyZW4ocF9uZCk7CisKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX25ld19jaGlsZCwgZmFsc2UpCisKKyAgaWYgKHBfbmQgPT0gYmFzZV90eXBlOjptX3Bfcm9vdCkKKyAgICB7CisgICAgICBpZiAocF9uZXdfY2hpbGQgIT0gMCkKKwlwX25ld19jaGlsZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBwX25ld19jaGlsZDsKKyAgICAgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQoYmFzZV90eXBlOjptX3Bfcm9vdCwgZmFsc2UpCisgICAgICByZXR1cm47CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgIT0gMCk7CisgIGlmIChwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9sX2NoaWxkID09IHBfbmQpCisgICAgeworICAgICAgaWYgKHBfbmV3X2NoaWxkICE9IDApCisgICAgICAgIHsKKwkgIHBfbmV3X2NoaWxkLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQ7CisJICBwX25ld19jaGlsZC0+bV9wX25leHRfc2libGluZyA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisJICBpZiAocF9uZXdfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKwkgICAgcF9uZXdfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmV3X2NoaWxkOworCSAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbF9jaGlsZCA9IHBfbmV3X2NoaWxkOworCSAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQsIGZhbHNlKQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9sX2NoaWxkID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIGlmIChwX25kLT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisJcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50OworICAgICAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQsIGZhbHNlKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocF9uZXdfY2hpbGQgIT0gMCkKKyAgICB7CisgICAgICBwX25ld19jaGlsZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50OworICAgICAgcF9uZXdfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgaWYgKHBfbmV3X2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisJcF9uZXdfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmV3X2NoaWxkOworICAgICAgcF9uZXdfY2hpbGQtPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX25leHRfc2libGluZyA9IHBfbmV3X2NoaWxkOworICAgICAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQsIGZhbHNlKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworICBpZiAocF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorICAgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQsIGZhbHNlKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbl9ub2RlX2NoaWxkcmVuKG5vZGVfcG9pbnRlciBwX25kKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCAhPSAwKTsKKyAgbm9kZV9wb2ludGVyIHBfcmV0ID0gcF9uZC0+bV9wX2xfY2hpbGQ7CisgIGlmIChwX3JldCA9PSAwKQorICAgIHJldHVybiAwOworICB3aGlsZSAocF9yZXQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBwX3JldCA9IGZvcndhcmRfam9pbihwX3JldCwgcF9yZXQtPm1fcF9uZXh0X3NpYmxpbmcpOworICB3aGlsZSAocF9yZXQtPm1fcF9wcmV2X29yX3BhcmVudCAhPSBwX25kKQorICAgIHBfcmV0ID0gYmFja19qb2luKHBfcmV0LT5tX3BfcHJldl9vcl9wYXJlbnQsIHBfcmV0KTsKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX3JldCwgZmFsc2UpCisgIHJldHVybiBwX3JldDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZvcndhcmRfam9pbihub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfbmV4dCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3BfbmV4dF9zaWJsaW5nID09IHBfbmV4dCk7CisgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkocF9uZC0+bV92YWx1ZSwgcF9uZXh0LT5tX3ZhbHVlKSkKKyAgICB7CisgICAgICBwX25leHQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKyAgICAgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihwX25kLCBwX25leHQpOworICAgICAgcmV0dXJuIHBfbmV4dC0+bV9wX25leHRfc2libGluZyA9PSAwIAorCT8gcF9uZXh0IDogcF9uZXh0LT5tX3BfbmV4dF9zaWJsaW5nOworICAgIH0KKworICBpZiAocF9uZXh0LT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisgICAgeworICAgICAgcF9uZXh0LT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kOworICAgICAgcF9uZC0+bV9wX25leHRfc2libGluZyA9IHBfbmV4dC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihwX25leHQsIHBfbmQpOworICAgICAgcmV0dXJuIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgfQorCisgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSAwOworICBiYXNlX3R5cGU6Om1ha2VfY2hpbGRfb2YocF9uZXh0LCBwX25kKTsKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX25kLCBmYWxzZSkKKyAgcmV0dXJuIHBfbmQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitiYWNrX2pvaW4obm9kZV9wb2ludGVyIHBfbmQsIG5vZGVfcG9pbnRlciBwX25leHQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZXh0LT5tX3BfbmV4dF9zaWJsaW5nID09IDApOworCisgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkocF9uZC0+bV92YWx1ZSwgcF9uZXh0LT5tX3ZhbHVlKSkKKyAgICB7CisgICAgICBwX25leHQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKyAgICAgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihwX25kLCBwX25leHQpOworICAgICAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX25leHQsIGZhbHNlKQorICAgICAgcmV0dXJuIHBfbmV4dDsKKyAgICB9CisKKyAgcF9uZC0+bV9wX25leHRfc2libGluZyA9IDA7CisgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihwX25leHQsIHBfbmQpOworICBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKHBfbmQsIGZhbHNlKQorICByZXR1cm4gcF9uZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+Cit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pZihQcmVkIHByZWQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgIGlmIChiYXNlX3R5cGU6OmVtcHR5KCkpCisgICAgICB7CisgICAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCXJldHVybiAwOworICAgICAgfQorICBiYXNlX3R5cGU6OnRvX2xpbmtlZF9saXN0KCk7CisgIG5vZGVfcG9pbnRlciBwX291dCA9IGJhc2VfdHlwZTo6cHJ1bmUocHJlZCk7CisgIHNpemVfdHlwZSBlcnNkID0gMDsKKyAgd2hpbGUgKHBfb3V0ICE9IDApCisgICAgeworICAgICAgKytlcnNkOworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfb3V0LT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgYmFzZV90eXBlOjphY3R1YWxfZXJhc2Vfbm9kZShwX291dCk7CisgICAgICBwX291dCA9IHBfbmV4dDsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfY3VyID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKyAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IDA7CisgIHdoaWxlIChwX2N1ciAhPSAwKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKyAgICAgIHBfY3VyLT5tX3BfbF9jaGlsZCA9IHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9jdXItPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgICAgIHB1c2hfaW1wKHBfY3VyKTsKKyAgICAgIHBfY3VyID0gcF9uZXh0OworICAgIH0KKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBlcnNkOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9maW5kX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZmluZF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODVmMzM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZmluZF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDQ5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhaXJpbmdfaGVhcF8vZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgcGFpcmluZyBoZWFwLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3JlZmVyZW5jZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgordG9wKCkgY29uc3QKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghYmFzZV90eXBlOjplbXB0eSgpKTsKKyAgcmV0dXJuIGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fdmFsdWU7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhZjQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDg4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhaXJpbmdfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBwYWlyaW5nIGhlYXAuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3B1c2goY29uc3RfcmVmZXJlbmNlIHJfdmFsKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgbm9kZV9wb2ludGVyIHBfbmV3X25kID0gYmFzZV90eXBlOjpnZXRfbmV3X25vZGVfZm9yX2luc2VydChyX3ZhbCk7CisgIHB1c2hfaW1wKHBfbmV3X25kKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBwb2ludF9pdGVyYXRvcihwX25ld19uZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcHVzaF9pbXAobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIHBfbmQtPm1fcF9sX2NoaWxkID0gMDsKKyAgaWYgKGJhc2VfdHlwZTo6bV9wX3Jvb3QgPT0gMCkKKyAgICB7CisgICAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBwX25kOworICAgIH0KKyAgZWxzZSBpZiAoQ21wX0ZuOjpvcGVyYXRvcigpKGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fdmFsdWUsIHBfbmQtPm1fdmFsdWUpKQorICAgIHsKKyAgICAgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworICAgICAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKGJhc2VfdHlwZTo6bV9wX3Jvb3QsIHBfbmQpOworICAgICAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX25kLCBmYWxzZSkKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBwX25kOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihwX25kLCBiYXNlX3R5cGU6Om1fcF9yb290KTsKKyAgICAgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQoYmFzZV90eXBlOjptX3Bfcm9vdCwgZmFsc2UpCisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbW9kaWZ5KHBvaW50X2l0ZXJhdG9yIGl0LCBjb25zdF9yZWZlcmVuY2Ugcl9uZXdfdmFsKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmVtb3ZlX25vZGUoaXQubV9wX25kKTsKKyAgaXQubV9wX25kLT5tX3ZhbHVlID0gcl9uZXdfdmFsOworICBwdXNoX2ltcChpdC5tX3BfbmQpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL3BhaXJpbmdfaGVhcF8uaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vcGFpcmluZ19oZWFwXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2NGI3YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL3BhaXJpbmdfaGVhcF8uaHBwCkBAIC0wLDAgKzEsMTg1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhaXJpbmdfaGVhcF8vcGFpcmluZ19oZWFwXy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHBhaXJpbmcgaGVhcC4KKyAqLworCisvKgorICogUGFpcmluZyBoZWFwOgorICogTWljaGFlbCBMLiBGcmVkbWFuLCBSb2JlcnQgU2VkZ2V3aWNrLCBEYW5pZWwgRG9taW5pYyBTbGVhdG9yLAorICogICAgYW5kIFJvYmVydCBFbmRyZSBUYXJqYW4sIFRoZSBQYWlyaW5nIEhlYXA6CisgKiAgICBBIE5ldyBGb3JtIG9mIFNlbGYtQWRqdXN0aW5nIEhlYXAsIEFsZ29yaXRobWljYSwgMSgxKToxMTEtMTI5LCAxOTg2LgorICovCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLmhwcD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgIHBhaXJpbmdfaGVhcDxWYWx1ZV9UeXBlLCBDbXBfRm4sIF9BbGxvYz4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjZGVmaW5lIFBCX0RTX1BfSEVBUF9CQVNFIFwKKyAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcDxWYWx1ZV9UeXBlLCBDbXBfRm4sIG51bGxfdHlwZSwgX0FsbG9jLCBmYWxzZT4KKyNlbHNlCisjZGVmaW5lIFBCX0RTX1BfSEVBUF9CQVNFIFwKKyAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcDxWYWx1ZV9UeXBlLCBDbXBfRm4sIG51bGxfdHlwZSwgX0FsbG9jPgorI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiAgUGFpcmluZyBoZWFwLgorICAgICAqCisgICAgICogIEBpbmdyb3VwIGhlYXAtZGV0YWlsCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgcGFpcmluZ19oZWFwIDogcHVibGljIFBCX0RTX1BfSEVBUF9CQVNFCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIFBCX0RTX1BfSEVBUF9CQVNFCQkJCWJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3BvaW50ZXIgCQlub2RlX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8VmFsdWVfVHlwZT46Om90aGVyIF9fcmViaW5kX2E7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgCQkJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIENtcF9GbiAJCQkJCWNtcF9mbjsKKyAgICAgIHR5cGVkZWYgX0FsbG9jIAkJCQkJYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAkJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJCWRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hOjpwb2ludGVyIAkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYTo6Y29uc3RfcG9pbnRlciAJY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYTo6cmVmZXJlbmNlCQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2E6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfY29uc3RfaXRlcmF0b3IJcG9pbnRfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfaXRlcmF0b3IgCXBvaW50X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIAljb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjppdGVyYXRvciAJCWl0ZXJhdG9yOworCisgICAgICBwYWlyaW5nX2hlYXAoKTsKKworICAgICAgcGFpcmluZ19oZWFwKGNvbnN0IENtcF9GbiYpOworCisgICAgICBwYWlyaW5nX2hlYXAoY29uc3QgcGFpcmluZ19oZWFwJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAocGFpcmluZ19oZWFwJik7CisKKyAgICAgIH5wYWlyaW5nX2hlYXAoKTsKKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBwdXNoKGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIHZvaWQKKyAgICAgIG1vZGlmeShwb2ludF9pdGVyYXRvciwgY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIGNvbnN0X3JlZmVyZW5jZQorICAgICAgdG9wKCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIHBvcCgpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZShwb2ludF9pdGVyYXRvcik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlX2lmKFByZWQpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgdm9pZAorICAgICAgc3BsaXQoUHJlZCwgcGFpcmluZ19oZWFwJik7CisKKyAgICAgIHZvaWQKKyAgICAgIGpvaW4ocGFpcmluZ19oZWFwJik7CisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX3JhbmdlKEl0LCBJdCk7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyAgICBwcml2YXRlOgorCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcHVzaF9pbXAobm9kZV9wb2ludGVyKTsKKworICAgICAgbm9kZV9wb2ludGVyCisgICAgICBqb2luX25vZGVfY2hpbGRyZW4obm9kZV9wb2ludGVyKTsKKworICAgICAgbm9kZV9wb2ludGVyCisgICAgICBmb3J3YXJkX2pvaW4obm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIGJhY2tfam9pbihub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlbW92ZV9ub2RlKG5vZGVfcG9pbnRlcik7CisgICAgfTsKKworI2RlZmluZSBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKF9Ob2RlLCBfQm9vbCkgXAorIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjphc3NlcnRfbm9kZV9jb25zaXN0ZW50KF9Ob2RlLCBfQm9vbCwJXAorCQkJCQkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZmluZF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcD4KKworI3VuZGVmIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfUF9IRUFQX0JBU0UKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNGVmMzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTIzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhaXJpbmdfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgcGFpcmluZyBoZWFwLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsaXQoUHJlZCBwcmVkLCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisKKyAgb3RoZXIuY2xlYXIoKTsKKworICBpZiAoYmFzZV90eXBlOjplbXB0eSgpKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBiYXNlX3R5cGU6OnRvX2xpbmtlZF9saXN0KCk7CisgIG5vZGVfcG9pbnRlciBwX291dCA9IGJhc2VfdHlwZTo6cHJ1bmUocHJlZCk7CisgIHdoaWxlIChwX291dCAhPSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYXNlX3R5cGU6Om1fc2l6ZSA+IDApOworICAgICAgLS1iYXNlX3R5cGU6Om1fc2l6ZTsKKyAgICAgICsrb3RoZXIubV9zaXplOworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfb3V0LT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgcF9vdXQtPm1fcF9sX2NoaWxkID0gcF9vdXQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX291dC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKworICAgICAgb3RoZXIucHVzaF9pbXAocF9vdXQpOworICAgICAgcF9vdXQgPSBwX25leHQ7CisgICAgfQorCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgbm9kZV9wb2ludGVyIHBfY3VyID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKyAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IDA7CisgIHdoaWxlIChwX2N1ciAhPSAwKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKyAgICAgIHBfY3VyLT5tX3BfbF9jaGlsZCA9IHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9jdXItPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgICAgIHB1c2hfaW1wKHBfY3VyKTsKKyAgICAgIHBfY3VyID0gcF9uZXh0OworICAgIH0KKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorCisgIGlmIChvdGhlci5tX3Bfcm9vdCA9PSAwKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoYmFzZV90eXBlOjptX3Bfcm9vdCA9PSAwKQorICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBvdGhlci5tX3Bfcm9vdDsKKyAgZWxzZSBpZiAoQ21wX0ZuOjpvcGVyYXRvcigpKGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fdmFsdWUsIG90aGVyLm1fcF9yb290LT5tX3ZhbHVlKSkKKyAgICB7CisgICAgICBiYXNlX3R5cGU6Om1ha2VfY2hpbGRfb2YoYmFzZV90eXBlOjptX3Bfcm9vdCwgb3RoZXIubV9wX3Jvb3QpOworICAgICAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChvdGhlci5tX3Bfcm9vdCwgZmFsc2UpCisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gb3RoZXIubV9wX3Jvb3Q7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKG90aGVyLm1fcF9yb290LCBiYXNlX3R5cGU6Om1fcF9yb290KTsKKyAgICAgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQoYmFzZV90eXBlOjptX3Bfcm9vdCwgZmFsc2UpCisgICAgfQorCisgIGJhc2VfdHlwZTo6bV9zaXplICs9IG90aGVyLm1fc2l6ZTsKKyAgb3RoZXIubV9wX3Jvb3QgPSAwOworICBvdGhlci5tX3NpemUgPSAwOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzYTc1NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyMTQgQEAKKyAvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhdF90cmllXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHBhdF90cmllLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aGVhZF9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX2hlYWRfYWxsb2NhdG9yOworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Omlub2RlX2FsbG9jYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfaW5vZGVfYWxsb2NhdG9yOworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmxlYWZfYWxsb2NhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c19sZWFmX2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX1BBVF9UUklFX05BTUUoKSA6CisgIG1fcF9oZWFkKHNfaGVhZF9hbGxvY2F0b3IuYWxsb2NhdGUoMSkpLAorICBtX3NpemUoMCkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX1BBVF9UUklFX05BTUUoY29uc3QgYWNjZXNzX3RyYWl0cyYgcl9hY2Nlc3NfdHJhaXRzKSA6CisgIHN5bnRoX2FjY2Vzc190cmFpdHMocl9hY2Nlc3NfdHJhaXRzKSwKKyAgbV9wX2hlYWQoc19oZWFkX2FsbG9jYXRvci5hbGxvY2F0ZSgxKSksCisgIG1fc2l6ZSgwKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfUEFUX1RSSUVfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIDoKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICBkZWJ1Z19iYXNlKG90aGVyKSwKKyNlbmRpZgorICBzeW50aF9hY2Nlc3NfdHJhaXRzKG90aGVyKSwKKyAgbm9kZV91cGRhdGUob3RoZXIpLAorICBtX3BfaGVhZChzX2hlYWRfYWxsb2NhdG9yLmFsbG9jYXRlKDEpKSwKKyAgbV9zaXplKDApCit7CisgIGluaXRpYWxpemUoKTsKKyAgbV9zaXplID0gb3RoZXIubV9zaXplOworICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgICAgaWYgKG90aGVyLm1fcF9oZWFkLT5tX3BfcGFyZW50ID09IDApCisgICAgICB7CisJUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisJcmV0dXJuOworICAgICAgfQorICBfX3RyeQorICAgIHsKKyAgICAgIG1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcmVjdXJzaXZlX2NvcHlfbm9kZShvdGhlci5tX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBzX2hlYWRfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9wX2hlYWQsIDEpOworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorCisgIG1fcF9oZWFkLT5tX3BfbWluID0gbGVmdG1vc3RfZGVzY2VuZGFudChtX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgIG1fcF9oZWFkLT5tX3BfbWF4ID0gcmlnaHRtb3N0X2Rlc2NlbmRhbnQobV9wX2hlYWQtPm1fcF9wYXJlbnQpOworICBtX3BfaGVhZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudCA9IG1fcF9oZWFkOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICB2YWx1ZV9zd2FwKG90aGVyKTsKKyAgc3RkOjpzd2FwKChhY2Nlc3NfdHJhaXRzJiApKCp0aGlzKSwgKGFjY2Vzc190cmFpdHMmIClvdGhlcik7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit2YWx1ZV9zd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpzd2FwKG90aGVyKTspCisgIHN0ZDo6c3dhcChtX3BfaGVhZCwgb3RoZXIubV9wX2hlYWQpOworICBzdGQ6OnN3YXAobV9zaXplLCBvdGhlci5tX3NpemUpOworfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorflBCX0RTX1BBVF9UUklFX05BTUUoKQoreworICBjbGVhcigpOworICBzX2hlYWRfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9wX2hlYWQsIDEpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdGlhbGl6ZSgpCit7CisgIG5ldyAobV9wX2hlYWQpIGhlYWQoKTsKKyAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSAwOworICBtX3BfaGVhZC0+bV9wX21pbiA9IG1fcF9oZWFkOworICBtX3BfaGVhZC0+bV9wX21heCA9IG1fcF9oZWFkOworICBtX3NpemUgPSAwOworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb3B5X2Zyb21fcmFuZ2UoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQpCit7CisgIHdoaWxlIChmaXJzdF9pdCAhPSBsYXN0X2l0KQorICAgIGluc2VydCgqKGZpcnN0X2l0KyspKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY3Vyc2l2ZV9jb3B5X25vZGUobm9kZV9jb25zdF9wb2ludGVyIHBfbmNwKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uY3AgIT0gMCk7CisgIGlmIChwX25jcC0+bV90eXBlID09IGxlYWZfbm9kZSkKKyAgICB7CisgICAgICBsZWFmX2NvbnN0X3BvaW50ZXIgcF9vdGhlcl9sZiA9IHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4ocF9uY3ApOworICAgICAgbGVhZl9wb2ludGVyIHBfbmV3X2xmID0gc19sZWFmX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKyAgICAgIGNvbmRfZGVhbHRvciBjb25kKHBfbmV3X2xmKTsKKyAgICAgIG5ldyAocF9uZXdfbGYpIGxlYWYocF9vdGhlcl9sZi0+dmFsdWUoKSk7CisgICAgICBhcHBseV91cGRhdGUocF9uZXdfbGYsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgICAgICBjb25kLnNldF9ub19hY3Rpb25fZHRvcigpOworICAgICAgcmV0dXJuIChwX25ld19sZik7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25jcC0+bV90eXBlID09IGlfbm9kZSk7CisgIG5vZGVfcG9pbnRlciBhX3BfY2hpbGRyZW5baW5vZGU6OmFycl9zaXplXTsKKyAgc2l6ZV90eXBlIGNoaWxkX2kgPSAwOworICBpbm9kZV9jb25zdF9wb2ludGVyIHBfaWNwID0gc3RhdGljX2Nhc3Q8aW5vZGVfY29uc3RfcG9pbnRlcj4ocF9uY3ApOworCisgIHR5cGVuYW1lIGlub2RlOjpjb25zdF9pdGVyYXRvciBjaGlsZF9pdCA9IHBfaWNwLT5iZWdpbigpOworCisgIGlub2RlX3BvaW50ZXIgcF9yZXQ7CisgIF9fdHJ5CisgICAgeworICAgICAgd2hpbGUgKGNoaWxkX2l0ICE9IHBfaWNwLT5lbmQoKSkKKwl7CisJICBhX3BfY2hpbGRyZW5bY2hpbGRfaV0gPSByZWN1cnNpdmVfY29weV9ub2RlKCooY2hpbGRfaXQpKTsKKwkgIGNoaWxkX2krKzsKKwkgIGNoaWxkX2l0Kys7CisJfQorICAgICAgcF9yZXQgPSBzX2lub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIHdoaWxlIChjaGlsZF9pLS0gPiAwKQorCWNsZWFyX2ltcChhX3BfY2hpbGRyZW5bY2hpbGRfaV0pOworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorCisgIG5ldyAocF9yZXQpIGlub2RlKHBfaWNwLT5nZXRfZV9pbmQoKSwgcHJlZl9iZWdpbihhX3BfY2hpbGRyZW5bMF0pKTsKKworICAtLWNoaWxkX2k7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChjaGlsZF9pID49IDEpOworICBkbworICAgIHBfcmV0LT5hZGRfY2hpbGQoYV9wX2NoaWxkcmVuW2NoaWxkX2ldLCBwcmVmX2JlZ2luKGFfcF9jaGlsZHJlbltjaGlsZF9pXSksCisJCSAgICAgcHJlZl9lbmQoYV9wX2NoaWxkcmVuW2NoaWxkX2ldKSwgdGhpcyk7CisgIHdoaWxlIChjaGlsZF9pLS0gPiAwKTsKKyAgYXBwbHlfdXBkYXRlKHBfcmV0LCAobm9kZV91cGRhdGUqKXRoaXMpOworICByZXR1cm4gcF9yZXQ7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM2ZDAwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDExNSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYXRfdHJpZV8vZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBwYXRfdHJpZV8uCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBpZiAobV9wX2hlYWQtPm1fcF9wYXJlbnQgIT0gMCkKKyAgICBtX3BfaGVhZC0+bV9wX3BhcmVudC0+YXNzZXJ0X3ZhbGlkKHRoaXMsIF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X2l0ZXJhdG9ycyhfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9yZXZlcnNlX2l0ZXJhdG9ycyhfX2ZpbGUsIF9fbGluZSk7CisgIGlmIChtX3BfaGVhZC0+bV9wX3BhcmVudCA9PSAwKQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3BfaGVhZC0+bV9wX21pbiA9PSBtX3BfaGVhZCk7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkobV9wX2hlYWQtPm1fcF9tYXggPT0gbV9wX2hlYWQpOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKGVtcHR5KCkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBQQl9EU19ERUJVR19WRVJJRlkobV9wX2hlYWQtPm1fcF9taW4tPm1fdHlwZSA9PSBsZWFmX25vZGUpOworICBQQl9EU19ERUJVR19WRVJJRlkobV9wX2hlYWQtPm1fcF9tYXgtPm1fdHlwZSA9PSBsZWFmX25vZGUpOworICBQQl9EU19ERUJVR19WRVJJRlkoIWVtcHR5KCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2l0ZXJhdG9ycyhjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIHNpemVfdHlwZSBjYWxjX3NpemUgPSAwOworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsgaXQgIT0gZW5kKCk7ICsraXQpCisgICAgeworICAgICAgKytjYWxjX3NpemU7CisgICAgICBkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKFBCX0RTX1YyRigqaXQpLCBfX2ZpbGUsIF9fbGluZSk7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkobG93ZXJfYm91bmQoUEJfRFNfVjJGKCppdCkpID09IGl0KTsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWSgtLXVwcGVyX2JvdW5kKFBCX0RTX1YyRigqaXQpKSA9PSBpdCk7CisgICAgfQorICBQQl9EU19ERUJVR19WRVJJRlkoY2FsY19zaXplID09IG1fc2l6ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfcmV2ZXJzZV9pdGVyYXRvcnMoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBzaXplX3R5cGUgY2FsY19zaXplID0gMDsKKyAgZm9yIChjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gcmJlZ2luKCk7IGl0ICE9IHJlbmQoKTsgKytpdCkKKyAgICB7CisgICAgICArK2NhbGNfc2l6ZTsKKyAgICAgIG5vZGVfY29uc3RfcG9pbnRlciBwX25kID0KKwljb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKj4odGhpcyktPmZpbmRfaW1wKFBCX0RTX1YyRigqaXQpKTsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kID09IGl0Lm1fcF9uZCk7CisgICAgfQorICBQQl9EU19ERUJVR19WRVJJRlkoY2FsY19zaXplID09IG1fc2l6ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CityZWN1cnNpdmVfY291bnRfbGVhZnMobm9kZV9jb25zdF9wb2ludGVyIHBfbmQsIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkKK3sKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm4gKDApOworICBpZiAocF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSkKKyAgICByZXR1cm4gKDEpOworICBQQl9EU19ERUJVR19WRVJJRlkocF9uZC0+bV90eXBlID09IGlfbm9kZSk7CisgIHNpemVfdHlwZSByZXQgPSAwOworICBmb3IgKHR5cGVuYW1lIGlub2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IHN0YXRpY19jYXN0PGlub2RlX2NvbnN0X3BvaW50ZXI+KHBfbmQpLT5iZWdpbigpOworICAgICAgIGl0ICE9IHN0YXRpY19jYXN0PGlub2RlX2NvbnN0X3BvaW50ZXI+KHBfbmQpLT5lbmQoKTsKKyAgICAgICArK2l0KQorICAgIHJldCArPSByZWN1cnNpdmVfY291bnRfbGVhZnMoKml0LCBfX2ZpbGUsIF9fbGluZSk7CisgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkYjE0MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwzMTUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcGF0X3RyaWVfL2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgcGF0X3RyaWUuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreworICBub2RlX3BvaW50ZXIgcF9uZCA9IGZpbmRfaW1wKHJfa2V5KTsKKyAgaWYgKHBfbmQgPT0gMCB8fCBwX25kLT5tX3R5cGUgPT0gaV9ub2RlKQorICAgIHsKKyAgICAgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpOworICBpZiAoIXN5bnRoX2FjY2Vzc190cmFpdHM6OmVxdWFsX2tleXMoUEJfRFNfVjJGKHJlaW50ZXJwcmV0X2Nhc3Q8bGVhZl9wb2ludGVyPihwX25kKS0+dmFsdWUoKSksIHJfa2V5KSkKKyAgICB7CisgICAgICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisgIGVyYXNlX2xlYWYoc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihwX25kKSk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gdHJ1ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2ZpeHVwKGlub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHN0ZDo6ZGlzdGFuY2UocF9uZC0+YmVnaW4oKSwgcF9uZC0+ZW5kKCkpID49IDEpOworICBpZiAoc3RkOjpkaXN0YW5jZShwX25kLT5iZWdpbigpLCBwX25kLT5lbmQoKSkgPT0gMSkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBwX25kLT5tX3BfcGFyZW50OworICAgICAgaWYgKHBfcGFyZW50ID09IG1fcF9oZWFkKQorCW1fcF9oZWFkLT5tX3BfcGFyZW50ID0gKnBfbmQtPmJlZ2luKCk7CisgICAgICBlbHNlCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50LT5tX3R5cGUgPT0gaV9ub2RlKTsKKwkgIG5vZGVfcG9pbnRlciBwX25ld19jaGlsZCA9ICpwX25kLT5iZWdpbigpOworCisJICB0eXBlZGVmIGlub2RlX3BvaW50ZXIgaW5vZGVfcHRyOworCSAgaW5vZGVfcHRyIHBfaW50ZXJuYWwgPSBzdGF0aWNfY2FzdDxpbm9kZV9wdHI+KHBfcGFyZW50KTsKKwkgIHBfaW50ZXJuYWwtPnJlcGxhY2VfY2hpbGQocF9uZXdfY2hpbGQsIHByZWZfYmVnaW4ocF9uZXdfY2hpbGQpLAorCQkJCSAgICBwcmVmX2VuZChwX25ld19jaGlsZCksIHRoaXMpOworCX0KKyAgICAgICgqcF9uZC0+YmVnaW4oKSktPm1fcF9wYXJlbnQgPSBwX25kLT5tX3BfcGFyZW50OworICAgICAgcF9uZC0+fmlub2RlKCk7CisgICAgICBzX2lub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfbmQsIDEpOworCisgICAgICBpZiAocF9wYXJlbnQgPT0gbV9wX2hlYWQpCisJcmV0dXJuOworCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9wYXJlbnQtPm1fdHlwZSA9PSBpX25vZGUpOworICAgICAgcF9uZCA9IHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfcGFyZW50KTsKKyAgICB9CisKKyAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHN0ZDo6ZGlzdGFuY2UocF9uZC0+YmVnaW4oKSwgcF9uZC0+ZW5kKCkpID4gMSk7CisgICAgICBwX25kLT51cGRhdGVfcHJlZml4ZXModGhpcyk7CisgICAgICBhcHBseV91cGRhdGUocF9uZCwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9OT0RFX1ZBTElEKHBfbmQpCisgICAgICBpZiAocF9uZC0+bV9wX3BhcmVudC0+bV90eXBlID09IGhlYWRfbm9kZSkKKwlyZXR1cm47CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3BfcGFyZW50LT5tX3R5cGUgPT0gaV9ub2RlKTsKKworICAgICAgcF9uZCA9IHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbmQtPm1fcF9wYXJlbnQpOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CithY3R1YWxfZXJhc2VfbGVhZihsZWFmX3BvaW50ZXIgcF9sKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID4gMCk7CisgIC0tbV9zaXplOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmVyYXNlX2V4aXN0aW5nKFBCX0RTX1YyRihwX2wtPnZhbHVlKCkpKSk7CisgIHBfbC0+fmxlYWYoKTsKKyAgc19sZWFmX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfbCwgMSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcigpCit7CisgIGlmICghZW1wdHkoKSkKKyAgICB7CisgICAgICBjbGVhcl9pbXAobV9wX2hlYWQtPm1fcF9wYXJlbnQpOworICAgICAgbV9zaXplID0gMDsKKyAgICAgIGluaXRpYWxpemUoKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2xlYXIoKTspCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcl9pbXAobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kLT5tX3R5cGUgPT0gaV9ub2RlKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gaV9ub2RlKTsKKyAgICAgIGZvciAodHlwZW5hbWUgaW5vZGU6Oml0ZXJhdG9yIGl0ID0KKwkgICAgIHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbmQpLT5iZWdpbigpOworCSAgIGl0ICE9IHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbmQpLT5lbmQoKTsKKwkgICArK2l0KQorCXsKKwkgIG5vZGVfcG9pbnRlciBwX2NoaWxkID0qIGl0OworCSAgY2xlYXJfaW1wKHBfY2hpbGQpOworCX0KKyAgICAgIHNfaW5vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUoc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9uZCksIDEpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSk7CisgIHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9uZCktPn5sZWFmKCk7CisgIHNfbGVhZl9hbGxvY2F0b3IuZGVhbGxvY2F0ZShzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbmQpLCAxKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKGNvbnN0X2l0ZXJhdG9yIGl0KQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKworICBpZiAoaXQgPT0gZW5kKCkpCisgICAgcmV0dXJuIGl0OworCisgIGNvbnN0X2l0ZXJhdG9yIHJldF9pdCA9IGl0OworICArK3JldF9pdDsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGl0Lm1fcF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSk7CisgIGVyYXNlX2xlYWYoc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihpdC5tX3BfbmQpKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiByZXRfaXQ7Cit9CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2UoaXRlcmF0b3IgaXQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCisgIGlmIChpdCA9PSBlbmQoKSkKKyAgICByZXR1cm4gaXQ7CisgIGl0ZXJhdG9yIHJldF9pdCA9IGl0OworICArK3JldF9pdDsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGl0Lm1fcF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSk7CisgIGVyYXNlX2xlYWYoc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihpdC5tX3BfbmQpKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiByZXRfaXQ7Cit9CisjZW5kaWYgLy8gI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2UoY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisKKyAgaWYgKGl0Lm1fcF9uZCA9PSBtX3BfaGVhZCkKKyAgICByZXR1cm4gaXQ7CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmV0X2l0ID0gaXQ7CisgICsrcmV0X2l0OworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpdC5tX3BfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpOworICBlcmFzZV9sZWFmKHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4oaXQubV9wX25kKSk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gcmV0X2l0OworfQorCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cmV2ZXJzZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2UocmV2ZXJzZV9pdGVyYXRvciBpdCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisKKyAgaWYgKGl0Lm1fcF9uZCA9PSBtX3BfaGVhZCkKKyAgICByZXR1cm4gaXQ7CisgIHJldmVyc2VfaXRlcmF0b3IgcmV0X2l0ID0gaXQ7CisgICsrcmV0X2l0OworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpdC5tX3BfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpOworICBlcmFzZV9sZWFmKHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4oaXQubV9wX25kKSk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gcmV0X2l0OworfQorI2VuZGlmIC8vICNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgoraW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2lmKFByZWQgcHJlZCkKK3sKKyAgc2l6ZV90eXBlIG51bV9lcnNkID0gMDsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisKKyAgaXRlcmF0b3IgaXQgPSBiZWdpbigpOworICB3aGlsZSAoaXQgIT0gZW5kKCkpCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBpZiAocHJlZCgqaXQpKQorCXsKKwkgICsrbnVtX2Vyc2Q7CisJICBpdCA9IGVyYXNlKGl0KTsKKwl9CisgICAgICBlbHNlCisJKytpdDsKKyAgICB9CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBudW1fZXJzZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2xlYWYobGVhZl9wb2ludGVyIHBfbCkKK3sKKyAgdXBkYXRlX21pbl9tYXhfZm9yX2VyYXNlZF9sZWFmKHBfbCk7CisgIGlmIChwX2wtPm1fcF9wYXJlbnQtPm1fdHlwZSA9PSBoZWFkX25vZGUpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHNpemUoKSA9PSAxKTsKKyAgICAgIGNsZWFyKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChzaXplKCkgPiAxKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbC0+bV9wX3BhcmVudC0+bV90eXBlID09IGlfbm9kZSk7CisKKyAgaW5vZGVfcG9pbnRlciBwX3BhcmVudCA9IHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbC0+bV9wX3BhcmVudCk7CisKKyAgcF9wYXJlbnQtPnJlbW92ZV9jaGlsZChwX2wpOworICBlcmFzZV9maXh1cChwX3BhcmVudCk7CisgIGFjdHVhbF9lcmFzZV9sZWFmKHBfbCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cGRhdGVfbWluX21heF9mb3JfZXJhc2VkX2xlYWYobGVhZl9wb2ludGVyIHBfbCkKK3sKKyAgaWYgKG1fc2l6ZSA9PSAxKQorICAgIHsKKyAgICAgIG1fcF9oZWFkLT5tX3BfbWluID0gbV9wX2hlYWQ7CisgICAgICBtX3BfaGVhZC0+bV9wX21heCA9IG1fcF9oZWFkOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocF9sID09IHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4obV9wX2hlYWQtPm1fcF9taW4pKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIGl0KHBfbCk7CisgICAgICArK2l0OworICAgICAgbV9wX2hlYWQtPm1fcF9taW4gPSBpdC5tX3BfbmQ7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChwX2wgPT0gc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihtX3BfaGVhZC0+bV9wX21heCkpCisgICAgeworICAgICAgaXRlcmF0b3IgaXQocF9sKTsKKyAgICAgIC0taXQ7CisgICAgICBtX3BfaGVhZC0+bV9wX21heCA9IGl0Lm1fcF9uZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2ZpbmRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2ZpbmRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3N2JmNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZmluZF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDI2OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYXRfdHJpZV8vZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHBhdF90cmllLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBub2RlX3BvaW50ZXIgcF9uZCA9IGZpbmRfaW1wKHJfa2V5KTsKKworICBpZiAocF9uZCA9PSAwIHx8IHBfbmQtPm1fdHlwZSAhPSBsZWFmX25vZGUpCisgICAgeworICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorICAgICAgcmV0dXJuIGVuZCgpOworICAgIH0KKworICBpZiAoc3ludGhfYWNjZXNzX3RyYWl0czo6ZXF1YWxfa2V5cyhQQl9EU19WMkYoc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihwX25kKS0+dmFsdWUoKSksIHJfa2V5KSkKKyAgICB7CisgICAgICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorICAgICAgcmV0dXJuIGl0ZXJhdG9yKHBfbmQpOworICAgIH0KKworICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisgIHJldHVybiBlbmQoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisKKyAgbm9kZV9jb25zdF9wb2ludGVyIHBfbmQgPSBjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKiA+KHRoaXMpLT5maW5kX2ltcChyX2tleSk7CisKKyAgaWYgKHBfbmQgPT0gMCB8fCBwX25kLT5tX3R5cGUgIT0gbGVhZl9ub2RlKQorICAgIHsKKyAgICAgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKyAgICAgIHJldHVybiBlbmQoKTsKKyAgICB9CisKKyAgaWYgKHN5bnRoX2FjY2Vzc190cmFpdHM6OmVxdWFsX2tleXMoUEJfRFNfVjJGKHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4ocF9uZCktPnZhbHVlKCkpLCByX2tleSkpCisgICAgeworICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhyX2tleSkKKyAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihjb25zdF9jYXN0PG5vZGVfcG9pbnRlcj4ocF9uZCkpOworICAgIH0KKworICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisgIHJldHVybiBlbmQoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreworICBpZiAoZW1wdHkoKSkKKyAgICByZXR1cm4gMDsKKworICB0eXBlbmFtZSBzeW50aF9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBiX2l0ID0KKyAgICBzeW50aF9hY2Nlc3NfdHJhaXRzOjpiZWdpbihyX2tleSk7CisgIHR5cGVuYW1lIHN5bnRoX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGVfaXQgPQorICAgIHN5bnRoX2FjY2Vzc190cmFpdHM6OmVuZChyX2tleSk7CisKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3BfaGVhZC0+bV9wX3BhcmVudDsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisKKyAgd2hpbGUgKHBfbmQtPm1fdHlwZSAhPSBsZWFmX25vZGUpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fdHlwZSA9PSBpX25vZGUpOworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dF9uZCA9IHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbmQpLT5nZXRfY2hpbGRfbm9kZShiX2l0LCAgZV9pdCwgIHRoaXMpOworCisgICAgICBpZiAocF9uZXh0X25kID09IDApCisJcmV0dXJuIHBfbmQ7CisgICAgICBwX25kID0gcF9uZXh0X25kOworICAgIH0KKyAgcmV0dXJuIHBfbmQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbG93ZXJfYm91bmRfaW1wKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIGlmIChlbXB0eSgpKQorICAgIHJldHVybiAobV9wX2hlYWQpOworCisgIG5vZGVfcG9pbnRlciBwX25kID0gbV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kICE9IDApOworCisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjphX2NvbnN0X2l0ZXJhdG9yIGJfaXQgPQorICAgIHN5bnRoX2FjY2Vzc190cmFpdHM6OmJlZ2luKHJfa2V5KTsKKworICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6YV9jb25zdF9pdGVyYXRvciBlX2l0ID0KKyAgICBzeW50aF9hY2Nlc3NfdHJhaXRzOjplbmQocl9rZXkpOworCisgIHNpemVfdHlwZSBjaGVja2VkX2luZCA9IDA7CisgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgIGlmIChwX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorICAgICAgICB7CisJICBpZiAoIXN5bnRoX2FjY2Vzc190cmFpdHM6OmNtcF9rZXlzKFBCX0RTX1YyRihzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KHBfbmQpLT52YWx1ZSgpKSwgcl9rZXkpKQorCSAgICByZXR1cm4gcF9uZDsKKwkgIGl0ZXJhdG9yIGl0KHBfbmQpOworCSAgKytpdDsKKwkgIHJldHVybiBpdC5tX3BfbmQ7CisgICAgICAgIH0KKworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fdHlwZSA9PSBpX25vZGUpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIG5ld19jaGVja2VkX2luZCA9CisJc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9uZCktPmdldF9lX2luZCgpOworCisgICAgICBwX25kID0KKwlzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX25kKS0+Z2V0X2xvd2VyX2JvdW5kX2NoaWxkX25vZGUoICAgICAgICAgICAgICAgIGJfaXQsIGVfaXQsIGNoZWNrZWRfaW5kLCB0aGlzKTsKKyAgICAgIGNoZWNrZWRfaW5kID0gbmV3X2NoZWNrZWRfaW5kOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2xvd2VyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7IHJldHVybiBwb2ludF9pdGVyYXRvcihsb3dlcl9ib3VuZF9pbXAocl9rZXkpKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9jb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbG93ZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgcmV0dXJuIHBvaW50X2NvbnN0X2l0ZXJhdG9yKGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMqID4odGhpcyktPmxvd2VyX2JvdW5kX2ltcChyX2tleSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBwZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgcG9pbnRfaXRlcmF0b3IgbF9ib3VuZF9pdCA9IGxvd2VyX2JvdW5kKHJfa2V5KTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobF9ib3VuZF9pdCA9PSBlbmQoKSB8fAorCQkgICAhc3ludGhfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMoUEJfRFNfVjJGKCpsX2JvdW5kX2l0KSwKKwkJCQkJCSAgICByX2tleSkpOworCisgIGlmIChsX2JvdW5kX2l0ID09IGVuZCgpIHx8CisgICAgICBzeW50aF9hY2Nlc3NfdHJhaXRzOjpjbXBfa2V5cyhyX2tleSwgUEJfRFNfVjJGKCpsX2JvdW5kX2l0KSkpCisgICAgcmV0dXJuIGxfYm91bmRfaXQ7CisKKyAgcmV0dXJuICsrbF9ib3VuZF9pdDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwcGVyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIHBvaW50X2NvbnN0X2l0ZXJhdG9yIGxfYm91bmRfaXQgPSBsb3dlcl9ib3VuZChyX2tleSk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGxfYm91bmRfaXQgPT0gZW5kKCkgfHwKKwkJICAgIXN5bnRoX2FjY2Vzc190cmFpdHM6OmNtcF9rZXlzKFBCX0RTX1YyRigqbF9ib3VuZF9pdCksCisJCQkJCQkgICAgcl9rZXkpKTsKKworICBpZiAobF9ib3VuZF9pdCA9PSBlbmQoKSB8fAorICAgICAgc3ludGhfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMocl9rZXksIFBCX0RTX1YyRigqbF9ib3VuZF9pdCkpKQorICAgIHJldHVybiBsX2JvdW5kX2l0OworICByZXR1cm4gKytsX2JvdW5kX2l0OworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjphX2NvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitwcmVmX2JlZ2luKG5vZGVfY29uc3RfcG9pbnRlciBwX25kKQoreworICBpZiAocF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSkKKyAgICByZXR1cm4gKHN5bnRoX2FjY2Vzc190cmFpdHM6OmJlZ2luKFBCX0RTX1YyRihzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KHBfbmQpLT52YWx1ZSgpKSkpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gaV9ub2RlKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGlub2RlX2NvbnN0X3BvaW50ZXI+KHBfbmQpLT5wcmVmX2JfaXQoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6YV9jb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcHJlZl9lbmQobm9kZV9jb25zdF9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorICAgIHJldHVybiAoc3ludGhfYWNjZXNzX3RyYWl0czo6ZW5kKFBCX0RTX1YyRihzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KHBfbmQpLT52YWx1ZSgpKSkpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gaV9ub2RlKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGlub2RlX2NvbnN0X3BvaW50ZXI+KHBfbmQpLT5wcmVmX2VfaXQoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bGVhZl9jb25zdF9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitsZWZ0bW9zdF9kZXNjZW5kYW50KG5vZGVfY29uc3RfcG9pbnRlciBwX25kKQoreworICBpZiAocF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSkKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihwX25kKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGlub2RlX2NvbnN0X3BvaW50ZXI+KHBfbmQpLT5sZWZ0bW9zdF9kZXNjZW5kYW50KCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmxlYWZfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbGVmdG1vc3RfZGVzY2VuZGFudChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9uZCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX25kKS0+bGVmdG1vc3RfZGVzY2VuZGFudCgpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpsZWFmX2NvbnN0X3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JpZ2h0bW9zdF9kZXNjZW5kYW50KG5vZGVfY29uc3RfcG9pbnRlciBwX25kKQoreworICBpZiAocF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSkKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihwX25kKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGlub2RlX2NvbnN0X3BvaW50ZXI+KHBfbmQpLT5yaWdodG1vc3RfZGVzY2VuZGFudCgpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpsZWFmX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JpZ2h0bW9zdF9kZXNjZW5kYW50KG5vZGVfcG9pbnRlciBwX25kKQoreworICBpZiAocF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSkKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihwX25kKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbmQpLT5yaWdodG1vc3RfZGVzY2VuZGFudCgpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2luZm9fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2luZm9fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIwYWFkMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vaW5mb19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhdF90cmllXy9pbmZvX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgcGF0X3RyaWUuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlbXB0eSgpIGNvbnN0Cit7IHJldHVybiAobV9zaXplID09IDApOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2l6ZSgpIGNvbnN0Cit7IHJldHVybiBtX3NpemU7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CittYXhfc2l6ZSgpIGNvbnN0Cit7IHJldHVybiBzX2lub2RlX2FsbG9jYXRvci5tYXhfc2l6ZSgpOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vaW5zZXJ0X2pvaW5fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2luc2VydF9qb2luX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YWFjNzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2luc2VydF9qb2luX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNDcyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhdF90cmllXy9pbnNlcnRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHBhdF90cmllLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citqb2luKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgYnJhbmNoX2JhZyBiYWc7CisgIGlmICgham9pbl9wcmVwKG90aGVyLCBiYWcpKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBtX3BfaGVhZC0+bV9wX3BhcmVudCA9IHJlY19qb2luKG1fcF9oZWFkLT5tX3BfcGFyZW50LAorCQkJCSAgb3RoZXIubV9wX2hlYWQtPm1fcF9wYXJlbnQsIDAsIGJhZyk7CisKKyAgbV9wX2hlYWQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQgPSBtX3BfaGVhZDsKKyAgbV9zaXplICs9IG90aGVyLm1fc2l6ZTsKKyAgb3RoZXIuaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgIG1fcF9oZWFkLT5tX3BfbWluID0gbGVmdG1vc3RfZGVzY2VuZGFudChtX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgIG1fcF9oZWFkLT5tX3BfbWF4ID0gcmlnaHRtb3N0X2Rlc2NlbmRhbnQobV9wX2hlYWQtPm1fcF9wYXJlbnQpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2Jvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW5fcHJlcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIsIGJyYW5jaF9iYWcmIHJfYmFnKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICBpZiAob3RoZXIubV9zaXplID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChtX3NpemUgPT0gMCkKKyAgICB7CisgICAgICB2YWx1ZV9zd2FwKG90aGVyKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgY29uc3QgYm9vbCBncmVhdGVyID0KKyAgICBzeW50aF9hY2Nlc3NfdHJhaXRzOjpjbXBfa2V5cyhQQl9EU19WMkYoc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihtX3BfaGVhZC0+bV9wX21heCktPnZhbHVlKCkpLAorCQkJCSAgICBQQl9EU19WMkYoc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihvdGhlci5tX3BfaGVhZC0+bV9wX21pbiktPnZhbHVlKCkpKTsKKworICBjb25zdCBib29sIGxlc3NlciA9CisgICAgc3ludGhfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMoUEJfRFNfVjJGKHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4ob3RoZXIubV9wX2hlYWQtPm1fcF9tYXgpLT52YWx1ZSgpKSwKKwkJCQkgICAgUEJfRFNfVjJGKHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4obV9wX2hlYWQtPm1fcF9taW4pLT52YWx1ZSgpKSk7CisKKyAgaWYgKCFncmVhdGVyICYmICFsZXNzZXIpCisgICAgX190aHJvd19qb2luX2Vycm9yKCk7CisKKyAgcmVjX2pvaW5fcHJlcChtX3BfaGVhZC0+bV9wX3BhcmVudCwgb3RoZXIubV9wX2hlYWQtPm1fcF9wYXJlbnQsIHJfYmFnKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpqb2luKG90aGVyLCBmYWxzZSk7KQorICByZXR1cm4gdHJ1ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY19qb2luX3ByZXAobm9kZV9jb25zdF9wb2ludGVyIHBfbCwgbm9kZV9jb25zdF9wb2ludGVyIHBfciwgCisJICAgICAgYnJhbmNoX2JhZyYgcl9iYWcpCit7CisgIGlmIChwX2wtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisgICAgeworICAgICAgaWYgKHBfci0+bV90eXBlID09IGxlYWZfbm9kZSkKKwl7CisJICByZWNfam9pbl9wcmVwKHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4ocF9sKSwKKwkJCXN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4ocF9yKSwgcl9iYWcpOworCSAgcmV0dXJuOworCX0KKworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfci0+bV90eXBlID09IGlfbm9kZSk7CisgICAgICByZWNfam9pbl9wcmVwKHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4ocF9sKSwKKwkJICAgIHN0YXRpY19jYXN0PGlub2RlX2NvbnN0X3BvaW50ZXI+KHBfciksIHJfYmFnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbC0+bV90eXBlID09IGlfbm9kZSk7CisgIGlmIChwX3ItPm1fdHlwZSA9PSBsZWFmX25vZGUpCisgICAgeworICAgICAgcmVjX2pvaW5fcHJlcChzdGF0aWNfY2FzdDxpbm9kZV9jb25zdF9wb2ludGVyPihwX2wpLAorCQkgICAgc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihwX3IpLCByX2JhZyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ItPm1fdHlwZSA9PSBpX25vZGUpOworCisgIHJlY19qb2luX3ByZXAoc3RhdGljX2Nhc3Q8aW5vZGVfY29uc3RfcG9pbnRlcj4ocF9sKSwKKwkJc3RhdGljX2Nhc3Q8aW5vZGVfY29uc3RfcG9pbnRlcj4ocF9yKSwgcl9iYWcpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjX2pvaW5fcHJlcChsZWFmX2NvbnN0X3BvaW50ZXIgLypwX2wqLywgbGVhZl9jb25zdF9wb2ludGVyIC8qcF9yKi8sCisJICAgICAgYnJhbmNoX2JhZyYgcl9iYWcpCit7IHJfYmFnLmFkZF9icmFuY2goKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjX2pvaW5fcHJlcChsZWFmX2NvbnN0X3BvaW50ZXIgLypwX2wqLywgaW5vZGVfY29uc3RfcG9pbnRlciAvKnBfciovLAorCSAgICAgIGJyYW5jaF9iYWcmIHJfYmFnKQoreyByX2JhZy5hZGRfYnJhbmNoKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY19qb2luX3ByZXAoaW5vZGVfY29uc3RfcG9pbnRlciAvKnBfbCovLCBsZWFmX2NvbnN0X3BvaW50ZXIgLypwX3IqLywKKwkgICAgICBicmFuY2hfYmFnJiByX2JhZykKK3sgcl9iYWcuYWRkX2JyYW5jaCgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZWNfam9pbl9wcmVwKGlub2RlX2NvbnN0X3BvaW50ZXIgcF9sLCBpbm9kZV9jb25zdF9wb2ludGVyIHBfciwKKwkgICAgICBicmFuY2hfYmFnJiByX2JhZykKK3sKKyAgaWYgKHBfbC0+Z2V0X2VfaW5kKCkgPT0gcF9yLT5nZXRfZV9pbmQoKSAmJgorICAgICAgc3ludGhfYWNjZXNzX3RyYWl0czo6ZXF1YWxfcHJlZml4ZXMocF9sLT5wcmVmX2JfaXQoKSwgcF9sLT5wcmVmX2VfaXQoKSwKKwkJCQkJICAgIHBfci0+cHJlZl9iX2l0KCksIHBfci0+cHJlZl9lX2l0KCkpKQorICAgIHsKKyAgICAgIGZvciAodHlwZW5hbWUgaW5vZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcF9yLT5iZWdpbigpOworCSAgIGl0ICE9IHBfci0+ZW5kKCk7ICsrIGl0KQorCXsKKwkgIG5vZGVfY29uc3RfcG9pbnRlciBwX2xfam9pbl9jaGlsZCA9IHBfbC0+Z2V0X2pvaW5fY2hpbGQoKml0LCB0aGlzKTsKKwkgIGlmIChwX2xfam9pbl9jaGlsZCAhPSAwKQorCSAgICByZWNfam9pbl9wcmVwKHBfbF9qb2luX2NoaWxkLCAqIGl0LCByX2JhZyk7CisJfQorICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocF9yLT5nZXRfZV9pbmQoKSA8IHBfbC0+Z2V0X2VfaW5kKCkgJiYKKyAgICAgIHBfci0+c2hvdWxkX2JlX21pbmUocF9sLT5wcmVmX2JfaXQoKSwgcF9sLT5wcmVmX2VfaXQoKSwgMCwgdGhpcykpCisgICAgeworICAgICAgbm9kZV9jb25zdF9wb2ludGVyIHBfcl9qb2luX2NoaWxkID0gcF9yLT5nZXRfam9pbl9jaGlsZChwX2wsIHRoaXMpOworICAgICAgaWYgKHBfcl9qb2luX2NoaWxkICE9IDApCisJcmVjX2pvaW5fcHJlcChwX3Jfam9pbl9jaGlsZCwgcF9sLCByX2JhZyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChwX3ItPmdldF9lX2luZCgpIDwgcF9sLT5nZXRfZV9pbmQoKSAmJgorICAgICAgcF9yLT5zaG91bGRfYmVfbWluZShwX2wtPnByZWZfYl9pdCgpLCBwX2wtPnByZWZfZV9pdCgpLCAwLCB0aGlzKSkKKyAgICB7CisgICAgICBub2RlX2NvbnN0X3BvaW50ZXIgcF9yX2pvaW5fY2hpbGQgPSBwX3ItPmdldF9qb2luX2NoaWxkKHBfbCwgdGhpcyk7CisgICAgICBpZiAocF9yX2pvaW5fY2hpbGQgIT0gMCkKKwlyZWNfam9pbl9wcmVwKHBfcl9qb2luX2NoaWxkLCBwX2wsIHJfYmFnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIHJfYmFnLmFkZF9icmFuY2goKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY19qb2luKG5vZGVfcG9pbnRlciBwX2wsIG5vZGVfcG9pbnRlciBwX3IsIHNpemVfdHlwZSBjaGVja2VkX2luZCwgCisJIGJyYW5jaF9iYWcmIHJfYmFnKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9yICE9IDApOworICBpZiAocF9sID09IDApCisgICAgeworICAgICAgYXBwbHlfdXBkYXRlKHBfciwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgICAgIHJldHVybiAocF9yKTsKKyAgICB9CisKKyAgaWYgKHBfbC0+bV90eXBlID09IGxlYWZfbm9kZSkKKyAgICB7CisgICAgICBpZiAocF9yLT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorCXsKKwkgIG5vZGVfcG9pbnRlciBwX3JldCA9IHJlY19qb2luKHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9sKSwKKwkJCQkJc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihwX3IpLCByX2JhZyk7CisJICBhcHBseV91cGRhdGUocF9yZXQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisJICByZXR1cm4gcF9yZXQ7CisJfQorCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9yLT5tX3R5cGUgPT0gaV9ub2RlKTsKKyAgICAgIG5vZGVfcG9pbnRlciBwX3JldCA9IHJlY19qb2luKHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9sKSwKKwkJCQkgICAgc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9yKSwKKwkJCQkgICAgY2hlY2tlZF9pbmQsIHJfYmFnKTsKKyAgICAgIGFwcGx5X3VwZGF0ZShwX3JldCwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgICAgIHJldHVybiBwX3JldDsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbC0+bV90eXBlID09IGlfbm9kZSk7CisgIGlmIChwX3ItPm1fdHlwZSA9PSBsZWFmX25vZGUpCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfcmV0ID0gcmVjX2pvaW4oc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9sKSwKKwkJCQkgICAgc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihwX3IpLAorCQkJCSAgICBjaGVja2VkX2luZCwgcl9iYWcpOworICAgICAgYXBwbHlfdXBkYXRlKHBfcmV0LCAobm9kZV91cGRhdGUqKXRoaXMpOworICAgICAgcmV0dXJuIHBfcmV0OworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9yLT5tX3R5cGUgPT0gaV9ub2RlKTsKKyAgbm9kZV9wb2ludGVyIHBfcmV0ID0gcmVjX2pvaW4oc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9sKSwKKwkJCQlzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX3IpLAorCQkJCXJfYmFnKTsKKworICBhcHBseV91cGRhdGUocF9yZXQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgIHJldHVybiBwX3JldDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY19qb2luKGxlYWZfcG9pbnRlciBwX2wsIGxlYWZfcG9pbnRlciBwX3IsIGJyYW5jaF9iYWcmIHJfYmFnKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9yICE9IDApOworICBpZiAocF9sID09IDApCisgICAgcmV0dXJuIChwX3IpOworICBub2RlX3BvaW50ZXIgcF9yZXQgPSBpbnNlcnRfYnJhbmNoKHBfbCwgcF9yLCByX2JhZyk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChQQl9EU19SRUNVUlNJVkVfQ09VTlRfTEVBRlMocF9yZXQpID09IDIpOworICByZXR1cm4gcF9yZXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CityZWNfam9pbihsZWFmX3BvaW50ZXIgcF9sLCBpbm9kZV9wb2ludGVyIHBfciwgc2l6ZV90eXBlIGNoZWNrZWRfaW5kLAorCSBicmFuY2hfYmFnJiByX2JhZykKK3sKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICBjb25zdCBzaXplX3R5cGUgbGhzX2xlYWZzID0gUEJfRFNfUkVDVVJTSVZFX0NPVU5UX0xFQUZTKHBfbCk7CisgIGNvbnN0IHNpemVfdHlwZSByaHNfbGVhZnMgPSBQQl9EU19SRUNVUlNJVkVfQ09VTlRfTEVBRlMocF9yKTsKKyNlbmRpZgorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3IgIT0gMCk7CisgIG5vZGVfcG9pbnRlciBwX3JldCA9IHJlY19qb2luKHBfciwgcF9sLCBjaGVja2VkX2luZCwgcl9iYWcpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoUEJfRFNfUkVDVVJTSVZFX0NPVU5UX0xFQUZTKHBfcmV0KSA9PSBsaHNfbGVhZnMgKyByaHNfbGVhZnMpOworICByZXR1cm4gcF9yZXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CityZWNfam9pbihpbm9kZV9wb2ludGVyIHBfbCwgbGVhZl9wb2ludGVyIHBfciwgc2l6ZV90eXBlIGNoZWNrZWRfaW5kLCBicmFuY2hfYmFnJiByX2JhZykKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfciAhPSAwKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGNvbnN0IHNpemVfdHlwZSBsaHNfbGVhZnMgPSBQQl9EU19SRUNVUlNJVkVfQ09VTlRfTEVBRlMocF9sKTsKKyAgY29uc3Qgc2l6ZV90eXBlIHJoc19sZWFmcyA9IFBCX0RTX1JFQ1VSU0lWRV9DT1VOVF9MRUFGUyhwX3IpOworI2VuZGlmCisKKyAgaWYgKCFwX2wtPnNob3VsZF9iZV9taW5lKHByZWZfYmVnaW4ocF9yKSwgcHJlZl9lbmQocF9yKSwgY2hlY2tlZF9pbmQsIHRoaXMpKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX3JldCA9IGluc2VydF9icmFuY2gocF9sLCBwX3IsIHJfYmFnKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9OT0RFX1ZBTElEKHBfcmV0KQorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKFBCX0RTX1JFQ1VSU0lWRV9DT1VOVF9MRUFGUyhwX3JldCkgPT0KKyAgICAgICAJCQkgICAgbGhzX2xlYWZzICsgcmhzX2xlYWZzKTsKKyAgICAgIHJldHVybiBwX3JldDsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfcG90X2NoaWxkID0gcF9sLT5hZGRfY2hpbGQocF9yLCBwcmVmX2JlZ2luKHBfciksCisJCQkJCSAgICBwcmVmX2VuZChwX3IpLCB0aGlzKTsKKyAgaWYgKHBfcG90X2NoaWxkICE9IHBfcikKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXdfY2hpbGQgPSByZWNfam9pbihwX3BvdF9jaGlsZCwgcF9yLCBwX2wtPmdldF9lX2luZCgpLAorCQkJCQkgIHJfYmFnKTsKKworICAgICAgcF9sLT5yZXBsYWNlX2NoaWxkKHBfbmV3X2NoaWxkLCBwcmVmX2JlZ2luKHBfbmV3X2NoaWxkKSwKKwkJCSBwcmVmX2VuZChwX25ld19jaGlsZCksIHRoaXMpOworICAgIH0KKworICBQQl9EU19BU1NFUlRfTk9ERV9WQUxJRChwX2wpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChQQl9EU19SRUNVUlNJVkVfQ09VTlRfTEVBRlMocF9sKSA9PSBsaHNfbGVhZnMgKyByaHNfbGVhZnMpOworICByZXR1cm4gcF9sOworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjX2pvaW4oaW5vZGVfcG9pbnRlciBwX2wsIGlub2RlX3BvaW50ZXIgcF9yLCAKKwkgYnJhbmNoX2JhZyYgcl9iYWcpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2wgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3IgIT0gMCk7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICBjb25zdCBzaXplX3R5cGUgbGhzX2xlYWZzID0gUEJfRFNfUkVDVVJTSVZFX0NPVU5UX0xFQUZTKHBfbCk7CisgIGNvbnN0IHNpemVfdHlwZSByaHNfbGVhZnMgPSBQQl9EU19SRUNVUlNJVkVfQ09VTlRfTEVBRlMocF9yKTsKKyNlbmRpZgorCisgIGlmIChwX2wtPmdldF9lX2luZCgpID09IHBfci0+Z2V0X2VfaW5kKCkgJiYKKyAgICAgIHN5bnRoX2FjY2Vzc190cmFpdHM6OmVxdWFsX3ByZWZpeGVzKHBfbC0+cHJlZl9iX2l0KCksIHBfbC0+cHJlZl9lX2l0KCksCisJCQkJCSAgICBwX3ItPnByZWZfYl9pdCgpLCBwX3ItPnByZWZfZV9pdCgpKSkKKyAgICB7CisgICAgICBmb3IgKHR5cGVuYW1lIGlub2RlOjppdGVyYXRvciBpdCA9IHBfci0+YmVnaW4oKTsKKwkgICBpdCAhPSBwX3ItPmVuZCgpOyArKyBpdCkKKwl7CisJICBub2RlX3BvaW50ZXIgcF9uZXdfY2hpbGQgPSByZWNfam9pbihwX2wtPmdldF9qb2luX2NoaWxkKCppdCwgdGhpcyksCisJCQkJCSAgICAgICogaXQsIDAsIHJfYmFnKTsKKwkgIHBfbC0+cmVwbGFjZV9jaGlsZChwX25ld19jaGlsZCwgcHJlZl9iZWdpbihwX25ld19jaGlsZCksCisJCQkgICAgIHByZWZfZW5kKHBfbmV3X2NoaWxkKSwgdGhpcyk7CisJfQorCisgICAgICBwX3ItPn5pbm9kZSgpOworICAgICAgc19pbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX3IsIDEpOworICAgICAgUEJfRFNfQVNTRVJUX05PREVfVkFMSUQocF9sKQorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKFBCX0RTX1JFQ1VSU0lWRV9DT1VOVF9MRUFGUyhwX2wpID09IGxoc19sZWFmcyArIHJoc19sZWFmcyk7CisgICAgICByZXR1cm4gcF9sOworICAgIH0KKworICBpZiAocF9sLT5nZXRfZV9pbmQoKSA8IHBfci0+Z2V0X2VfaW5kKCkgJiYKKyAgICAgIHBfbC0+c2hvdWxkX2JlX21pbmUocF9yLT5wcmVmX2JfaXQoKSwgcF9yLT5wcmVmX2VfaXQoKSwgMCwgdGhpcykpCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV3X2NoaWxkID0gcmVjX2pvaW4ocF9sLT5nZXRfam9pbl9jaGlsZChwX3IsIHRoaXMpLAorCQkJCQkgIHBfciwgMCwgcl9iYWcpOworICAgICAgcF9sLT5yZXBsYWNlX2NoaWxkKHBfbmV3X2NoaWxkLCBwcmVmX2JlZ2luKHBfbmV3X2NoaWxkKSwKKwkJCSBwcmVmX2VuZChwX25ld19jaGlsZCksIHRoaXMpOworICAgICAgUEJfRFNfQVNTRVJUX05PREVfVkFMSUQocF9sKQorICAgICAgcmV0dXJuIHBfbDsKKyAgICB9CisKKyAgaWYgKHBfci0+Z2V0X2VfaW5kKCkgPCBwX2wtPmdldF9lX2luZCgpICYmCisgICAgICBwX3ItPnNob3VsZF9iZV9taW5lKHBfbC0+cHJlZl9iX2l0KCksIHBfbC0+cHJlZl9lX2l0KCksIDAsIHRoaXMpKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25ld19jaGlsZCA9IHJlY19qb2luKHBfci0+Z2V0X2pvaW5fY2hpbGQocF9sLCB0aGlzKSwgcF9sLAorCQkJCQkgIDAsIHJfYmFnKTsKKworICAgICAgcF9yLT5yZXBsYWNlX2NoaWxkKHBfbmV3X2NoaWxkLCBwcmVmX2JlZ2luKHBfbmV3X2NoaWxkKSwKKwkJCSBwcmVmX2VuZChwX25ld19jaGlsZCksIHRoaXMpOworCisgICAgICBQQl9EU19BU1NFUlRfTk9ERV9WQUxJRChwX3IpCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoUEJfRFNfUkVDVVJTSVZFX0NPVU5UX0xFQUZTKHBfcikgPT0gbGhzX2xlYWZzICsgcmhzX2xlYWZzKTsKKyAgICAgIHJldHVybiBwX3I7CisgICAgfQorCisgIG5vZGVfcG9pbnRlciBwX3JldCA9IGluc2VydF9icmFuY2gocF9sLCBwX3IsIHJfYmFnKTsKKyAgUEJfRFNfQVNTRVJUX05PREVfVkFMSUQocF9yZXQpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChQQl9EU19SRUNVUlNJVkVfQ09VTlRfTEVBRlMocF9yZXQpID09IGxoc19sZWFmcyArIHJoc19sZWFmcyk7CisgIHJldHVybiBwX3JldDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBzdGQ6OnBhaXI8dHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yLCBib29sPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfbGYgPSBmaW5kX2ltcChQQl9EU19WMkYocl92YWwpKTsKKyAgaWYgKHBfbGYgIT0gMCAmJiBwX2xmLT5tX3R5cGUgPT0gbGVhZl9ub2RlICYmCisgICAgICBzeW50aF9hY2Nlc3NfdHJhaXRzOjplcXVhbF9rZXlzKFBCX0RTX1YyRihzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbGYpLT52YWx1ZSgpKSwgUEJfRFNfVjJGKHJfdmFsKSkpCisgICAgeworICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhQQl9EU19WMkYocl92YWwpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IocF9sZiksIGZhbHNlKTsKKyAgICB9CisKKyAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKFBCX0RTX1YyRihyX3ZhbCkpCisKKyAgbGVhZl9wb2ludGVyIHBfbmV3X2xmID0gc19sZWFmX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKyAgY29uZF9kZWFsdG9yIGNvbmQocF9uZXdfbGYpOworCisgIG5ldyAocF9uZXdfbGYpIGxlYWYocl92YWwpOworICBhcHBseV91cGRhdGUocF9uZXdfbGYsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgIGNvbmQuc2V0X2NhbGxfZGVzdHJ1Y3RvcigpOworICBicmFuY2hfYmFnIGJhZzsKKyAgYmFnLmFkZF9icmFuY2goKTsKKyAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSByZWNfam9pbihtX3BfaGVhZC0+bV9wX3BhcmVudCwgcF9uZXdfbGYsIDAsIGJhZyk7CisgIG1fcF9oZWFkLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50ID0gbV9wX2hlYWQ7CisgIGNvbmQuc2V0X25vX2FjdGlvbl9kdG9yKCk7CisgICsrbV9zaXplOworICB1cGRhdGVfbWluX21heF9mb3JfaW5zZXJ0ZWRfbGVhZihwX25ld19sZik7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhQQl9EU19WMkYocl92YWwpKTspCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gc3RkOjptYWtlX3BhaXIocG9pbnRfaXRlcmF0b3IocF9uZXdfbGYpLCB0cnVlKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2tleXNfZGlmZl9pbmQodHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgYl9sLAorCSAgICAgIHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGVfbCwKKwkgICAgICB0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBiX3IsCisJICAgICAgdHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgZV9yKQoreworICBzaXplX3R5cGUgZGlmZl9wb3MgPSAwOworICB3aGlsZSAoYl9sICE9IGVfbCkKKyAgICB7CisgICAgICBpZiAoYl9yID09IGVfcikKKwlyZXR1cm4gKGRpZmZfcG9zKTsKKyAgICAgIGlmIChhY2Nlc3NfdHJhaXRzOjplX3BvcygqYl9sKSAhPSBhY2Nlc3NfdHJhaXRzOjplX3BvcygqYl9yKSkKKwlyZXR1cm4gKGRpZmZfcG9zKTsKKyAgICAgICsrYl9sOworICAgICAgKytiX3I7CisgICAgICArK2RpZmZfcG9zOworICAgIH0KKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJfciAhPSBlX3IpOworICByZXR1cm4gZGlmZl9wb3M7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aW5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2JyYW5jaChub2RlX3BvaW50ZXIgcF9sLCBub2RlX3BvaW50ZXIgcF9yLCBicmFuY2hfYmFnJiByX2JhZykKK3sKKyAgdHlwZW5hbWUgc3ludGhfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgbGVmdF9iX2l0ID0gcHJlZl9iZWdpbihwX2wpOworICB0eXBlbmFtZSBzeW50aF9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBsZWZ0X2VfaXQgPSBwcmVmX2VuZChwX2wpOworICB0eXBlbmFtZSBzeW50aF9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciByaWdodF9iX2l0ID0gcHJlZl9iZWdpbihwX3IpOworICB0eXBlbmFtZSBzeW50aF9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciByaWdodF9lX2l0ID0gcHJlZl9lbmQocF9yKTsKKworICBjb25zdCBzaXplX3R5cGUgZGlmZl9pbmQgPSBrZXlzX2RpZmZfaW5kKGxlZnRfYl9pdCwgbGVmdF9lX2l0LAorCQkJCQkgICByaWdodF9iX2l0LCByaWdodF9lX2l0KTsKKworICBpbm9kZV9wb2ludGVyIHBfbmV3X25kID0gcl9iYWcuZ2V0X2JyYW5jaCgpOworICBuZXcgKHBfbmV3X25kKSBpbm9kZShkaWZmX2luZCwgbGVmdF9iX2l0KTsKKyAgcF9uZXdfbmQtPmFkZF9jaGlsZChwX2wsIGxlZnRfYl9pdCwgbGVmdF9lX2l0LCB0aGlzKTsKKyAgcF9uZXdfbmQtPmFkZF9jaGlsZChwX3IsIHJpZ2h0X2JfaXQsIHJpZ2h0X2VfaXQsIHRoaXMpOworICBwX2wtPm1fcF9wYXJlbnQgPSBwX25ld19uZDsKKyAgcF9yLT5tX3BfcGFyZW50ID0gcF9uZXdfbmQ7CisgIFBCX0RTX0FTU0VSVF9OT0RFX1ZBTElEKHBfbmV3X25kKQorICByZXR1cm4gKHBfbmV3X25kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwZGF0ZV9taW5fbWF4X2Zvcl9pbnNlcnRlZF9sZWFmKGxlYWZfcG9pbnRlciBwX25ld19sZikKK3sKKyAgaWYgKG1fcF9oZWFkLT5tX3BfbWluID09IG1fcF9oZWFkIHx8CisgICAgICBzeW50aF9hY2Nlc3NfdHJhaXRzOjpjbXBfa2V5cyhQQl9EU19WMkYocF9uZXdfbGYtPnZhbHVlKCkpLAorCQkJCSAgICAgIFBCX0RTX1YyRihzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KG1fcF9oZWFkLT5tX3BfbWluKS0+dmFsdWUoKSkpKQorICAgIG1fcF9oZWFkLT5tX3BfbWluID0gcF9uZXdfbGY7CisKKyAgaWYgKG1fcF9oZWFkLT5tX3BfbWF4ID09IG1fcF9oZWFkIHx8CisgICAgICBzeW50aF9hY2Nlc3NfdHJhaXRzOjpjbXBfa2V5cyhQQl9EU19WMkYoc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihtX3BfaGVhZC0+bV9wX21heCktPnZhbHVlKCkpLCBQQl9EU19WMkYocF9uZXdfbGYtPnZhbHVlKCkpKSkKKyAgICBtX3BfaGVhZC0+bV9wX21heCA9IHBfbmV3X2xmOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzViYWEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMjAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcGF0X3RyaWVfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHBhdF90cmllLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitiZWdpbigpCit7IHJldHVybiBpdGVyYXRvcihtX3BfaGVhZC0+bV9wX21pbik7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkgY29uc3QKK3sgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKG1fcF9oZWFkLT5tX3BfbWluKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkKK3sgcmV0dXJuIGl0ZXJhdG9yKG1fcF9oZWFkKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkgY29uc3QKK3sgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKG1fcF9oZWFkKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CityYmVnaW4oKSBjb25zdAoreworICBpZiAoZW1wdHkoKSkKKyAgICByZXR1cm4gcmVuZCgpOworICByZXR1cm4gLS1lbmQoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cmV2ZXJzZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmJlZ2luKCkKK3sKKyAgaWYgKGVtcHR5KCkpCisgICAgcmV0dXJuIHJlbmQoKTsKKyAgcmV0dXJuIC0tZW5kKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnJldmVyc2VfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlbmQoKQoreyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihtX3BfaGVhZCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVuZCgpIGNvbnN0Cit7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKG1fcF9oZWFkKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2NvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citub2RlX2JlZ2luKCkgY29uc3QKK3sgcmV0dXJuIG5vZGVfY29uc3RfaXRlcmF0b3IobV9wX2hlYWQtPm1fcF9wYXJlbnQsIHRoaXMpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vZGVfYmVnaW4oKQoreyByZXR1cm4gbm9kZV9pdGVyYXRvcihtX3BfaGVhZC0+bV9wX3BhcmVudCwgdGhpcyk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9jb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm9kZV9lbmQoKSBjb25zdAoreyByZXR1cm4gbm9kZV9jb25zdF9pdGVyYXRvcigwLCB0aGlzKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citub2RlX2VuZCgpCit7IHJldHVybiBub2RlX2l0ZXJhdG9yKDAsIHRoaXMpOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcGF0X3RyaWVfLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcGF0X3RyaWVfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTgxYzhjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9wYXRfdHJpZV8uaHBwCkBAIC0wLDAgKzEsNTk2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhdF90cmllXy9wYXRfdHJpZV8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBwYXRyaWNpYSB0cmVlLgorICovCisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2V4Y2VwdGlvbi5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlc190cmFpdHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZXFfZm4vZXFfYnlfbGVzcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vc3ludGhfYWNjZXNzX3RyYWl0cy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcGF0X3RyaWVfYmFzZS5ocHA+CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2RlYnVnX21hcF9iYXNlLmhwcD4KKyNlbmRpZgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfUEFUX1RSSUVfTkFNRSBwYXRfdHJpZV9tYXAKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfUEFUX1RSSUVfTkFNRSBwYXRfdHJpZV9zZXQKKyNlbmRpZgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzLCBcCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIFBCX0RTX1BBVF9UUklFX05BTUU8S2V5LCBNYXBwZWQsIE5vZGVfQW5kX0l0X1RyYWl0cywgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX1BBVF9UUklFX1RSQUlUU19CQVNFIFwKKyAgICB0eXBlc190cmFpdHM8S2V5LCBNYXBwZWQsIF9BbGxvYywgZmFsc2U+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2RlZmluZSBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQyBcCisgICAgZGVidWdfbWFwX2Jhc2U8S2V5LAllcV9ieV9sZXNzPEtleSwgc3RkOjpsZXNzPEtleT4gPiwgXAorCQkgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZT4KKyNlbmRpZgorCisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmIFBBVFJJQ0lBIHRyaWUuCisgICAgICogIEBpbmdyb3VwIGJyYW5jaC1kZXRhaWwKKyAgICAgKgorICAgICAqICBUaGlzIGltcGxlbWVudGF0aW9uIGxvb3NlbHkgYm9ycm93cyBpZGVhcyBmcm9tOgorICAgICAqICAxKSBGYXN0IE1lcmdlYWJsZSBJbnRlZ2VyIE1hcHMsIE9rYXNha2ksIEdpbGwgMTk5OAorICAgICAqICAyKSBQdHNldDogU2V0cyBvZiBpbnRlZ2VycyBpbXBsZW1lbnRlZCBhcyBQYXRyaWNpYSB0cmVlcywKKyAgICAgKiAgICAgSmVhbi1DaHJpc3RvcGhlIEZpbGxpYXRyLCAyMDAwCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0cywKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBQQl9EU19QQVRfVFJJRV9OQU1FIDoKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgcHVibGljIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDLAorI2VuZGlmCisgICAgICBwdWJsaWMgTm9kZV9BbmRfSXRfVHJhaXRzOjpzeW50aF9hY2Nlc3NfdHJhaXRzLAorICAgICAgcHVibGljIE5vZGVfQW5kX0l0X1RyYWl0czo6bm9kZV91cGRhdGUsCisgICAgICBwdWJsaWMgUEJfRFNfUEFUX1RSSUVfVFJBSVRTX0JBU0UsCisgICAgICBwdWJsaWMgcGF0X3RyaWVfYmFzZQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBwYXRfdHJpZV9iYXNlCQkJCWJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgUEJfRFNfUEFUX1RSSUVfVFJBSVRTX0JBU0UgCSAgICAgICAJdHJhaXRzX2Jhc2U7CisgICAgICB0eXBlZGVmIE5vZGVfQW5kX0l0X1RyYWl0cwkJCXRyYWl0c190eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpzeW50aF9hY2Nlc3NfdHJhaXRzIHN5bnRoX2FjY2Vzc190cmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN5bnRoX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGFfY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om5vZGUgCQlub2RlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxub2RlPglfX3JlYmluZF9uOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9uOjpvdGhlcjo6Y29uc3RfcG9pbnRlciBub2RlX2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX246Om90aGVyOjpwb2ludGVyIAlub2RlX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmhlYWQgCQloZWFkOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxoZWFkPglfX3JlYmluZF9oOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9oOjpvdGhlciAJCWhlYWRfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBoZWFkX2FsbG9jYXRvcjo6cG9pbnRlciAJCWhlYWRfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6bGVhZiAJCWxlYWY7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPGxlYWY+CV9fcmViaW5kX2w7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2w6Om90aGVyIAkJbGVhZl9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGxlYWZfYWxsb2NhdG9yOjpwb2ludGVyIAkJbGVhZl9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBsZWFmX2FsbG9jYXRvcjo6Y29uc3RfcG9pbnRlciAJbGVhZl9jb25zdF9wb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbm9kZSAJCWlub2RlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbm9kZTo6aXRlcmF0b3IgCQkJaW5vZGVfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPGlub2RlPiAJX19yZWJpbmRfaW47CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2luOjpvdGhlciAJCV9fcmViaW5kX2luYTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfaW46Om90aGVyICAgICAgCSAgICAgICAJaW5vZGVfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9pbmE6OnBvaW50ZXIgCQlpbm9kZV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9pbmE6OmNvbnN0X3BvaW50ZXIgCWlub2RlX2NvbnN0X3BvaW50ZXI7CisKKworICAgICAgLy8vIENvbmRpdGlvbmFsIGRlYWxsb2NhdG9yLgorICAgICAgY2xhc3MgY29uZF9kZWFsdG9yCisgICAgICB7CisgICAgICBwcm90ZWN0ZWQ6CisJbGVhZl9wb2ludGVyIAkJbV9wX25kOworCWJvb2wgCQkJbV9ub19hY3Rpb25fZHRvcjsKKwlib29sIAkJCW1fY2FsbF9kZXN0cnVjdG9yOworCisgICAgICBwdWJsaWM6CisJY29uZF9kZWFsdG9yKGxlYWZfcG9pbnRlciBwX25kKQorCTogbV9wX25kKHBfbmQpLCBtX25vX2FjdGlvbl9kdG9yKGZhbHNlKSwgbV9jYWxsX2Rlc3RydWN0b3IoZmFsc2UpCisJeyB9CisKKwl2b2lkCisJc2V0X25vX2FjdGlvbl9kdG9yKCkKKwl7IG1fbm9fYWN0aW9uX2R0b3IgPSB0cnVlOyB9CisKKwl2b2lkCisJc2V0X2NhbGxfZGVzdHJ1Y3RvcigpCisJeyBtX2NhbGxfZGVzdHJ1Y3RvciA9IHRydWU7IH0KKworCX5jb25kX2RlYWx0b3IoKQorCXsKKwkgIGlmIChtX25vX2FjdGlvbl9kdG9yKQorCSAgICByZXR1cm47CisKKwkgIGlmIChtX2NhbGxfZGVzdHJ1Y3RvcikKKwkgICAgbV9wX25kLT5+bGVhZigpOworCisJICBzX2xlYWZfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9wX25kLCAxKTsKKwl9CisgICAgICB9OworCisKKyAgICAgIC8vLyBCcmFuY2ggYmFnLCBmb3Igc3BsaXQtam9pbi4KKyAgICAgIGNsYXNzIGJyYW5jaF9iYWcKKyAgICAgIHsKKyAgICAgIHByaXZhdGU6CisJdHlwZWRlZiBpbm9kZV9wb2ludGVyIAkJCSAgICAgICAJX19pbnA7CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfX2lucD46Om90aGVyIAlfX3JlYmluZF9pbnA7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCXR5cGVkZWYgc3RkOjpfR0xJQkNYWF9TVERfQzo6bGlzdDxfX2lucCwgX19yZWJpbmRfaW5wPiAJYmFnX3R5cGU7CisjZWxzZQorCXR5cGVkZWYgc3RkOjpsaXN0PF9faW5wLCBfX3JlYmluZF9pbnA+IAkJCWJhZ190eXBlOworI2VuZGlmCisKKwliYWdfdHlwZSAJCQkJCQltX2JhZzsKKyAgICAgIHB1YmxpYzoKKwl2b2lkCisJYWRkX2JyYW5jaCgpCisJeworCSAgaW5vZGVfcG9pbnRlciBwX25kID0gc19pbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgbV9iYWcucHVzaF9iYWNrKHBfbmQpOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIHNfaW5vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9uZCwgMSk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisKKwlpbm9kZV9wb2ludGVyCisJZ2V0X2JyYW5jaCgpCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFtX2JhZy5lbXB0eSgpKTsKKwkgIGlub2RlX3BvaW50ZXIgcF9uZCA9ICptX2JhZy5iZWdpbigpOworCSAgbV9iYWcucG9wX2Zyb250KCk7CisJICByZXR1cm4gcF9uZDsKKwl9CisKKwl+YnJhbmNoX2JhZygpCisJeworCSAgd2hpbGUgKCFtX2JhZy5lbXB0eSgpKQorCSAgICB7CisJICAgICAgaW5vZGVfcG9pbnRlciBwX25kID0gKm1fYmFnLmJlZ2luKCk7CisJICAgICAgc19pbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX25kLCAxKTsKKwkgICAgICBtX2JhZy5wb3BfZnJvbnQoKTsKKwkgICAgfQorCX0KKworCWlubGluZSBib29sCisJZW1wdHkoKSBjb25zdAorCXsgcmV0dXJuIG1fYmFnLmVtcHR5KCk7IH0KKyAgICAgIH07CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdHlwZWRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQyAJCWRlYnVnX2Jhc2U7CisjZW5kaWYKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6bnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgcGF0X3RyaWVfdGFnIAkJCQljb250YWluZXJfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgCQlkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV90eXBlIAkJa2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfcG9pbnRlciAJa2V5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfY29uc3RfcG9pbnRlciAJa2V5X2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfcmVmZXJlbmNlIAlrZXlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X2NvbnN0X3JlZmVyZW5jZSBrZXlfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3R5cGUgCW1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3BvaW50ZXIgCW1hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX2NvbnN0X3BvaW50ZXIgbWFwcGVkX2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfcmVmZXJlbmNlIAltYXBwZWRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX2NvbnN0X3JlZmVyZW5jZSBtYXBwZWRfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6dmFsdWVfdHlwZSAJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpwb2ludGVyIAkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpyZWZlcmVuY2UgCQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6YWNjZXNzX3RyYWl0cyAJYWNjZXNzX3RyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIAlwb2ludF9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Oml0ZXJhdG9yIAkJcG9pbnRfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHBvaW50X2NvbnN0X2l0ZXJhdG9yIAkJCWNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBwb2ludF9pdGVyYXRvciAJCQkJaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgCXJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpub2RlX2NvbnN0X2l0ZXJhdG9yIG5vZGVfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpub2RlX2l0ZXJhdG9yIAlub2RlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6bm9kZV91cGRhdGUgCW5vZGVfdXBkYXRlOworCisgICAgICBQQl9EU19QQVRfVFJJRV9OQU1FKCk7CisKKyAgICAgIFBCX0RTX1BBVF9UUklFX05BTUUoY29uc3QgYWNjZXNzX3RyYWl0cyYpOworCisgICAgICBQQl9EU19QQVRfVFJJRV9OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgflBCX0RTX1BBVF9UUklFX05BTUUoKTsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdDsKKworICAgICAgYWNjZXNzX3RyYWl0cyYKKyAgICAgIGdldF9hY2Nlc3NfdHJhaXRzKCk7CisKKyAgICAgIGNvbnN0IGFjY2Vzc190cmFpdHMmCisgICAgICBnZXRfYWNjZXNzX3RyYWl0cygpIGNvbnN0OworCisgICAgICBub2RlX3VwZGF0ZSYKKyAgICAgIGdldF9ub2RlX3VwZGF0ZSgpOworCisgICAgICBjb25zdCBub2RlX3VwZGF0ZSYKKyAgICAgIGdldF9ub2RlX3VwZGF0ZSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBtYXBwZWRfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCisgICAgICB7CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorCXJldHVybiBpbnNlcnQoc3RkOjptYWtlX3BhaXIocl9rZXksIG1hcHBlZF90eXBlKCkpKS5maXJzdC0+c2Vjb25kOworI2Vsc2UKKwlpbnNlcnQocl9rZXkpOworCXJldHVybiB0cmFpdHNfYmFzZTo6c19udWxsX3R5cGU7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgcG9pbnRfY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBwb2ludF9jb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBwb2ludF9jb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcmFzZShrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvcik7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yKTsKKyNlbmRpZgorCisgICAgICBpbmxpbmUgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfcmV2ZXJzZV9pdGVyYXRvcik7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICBpbmxpbmUgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgZXJhc2UocmV2ZXJzZV9pdGVyYXRvcik7CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIGVyYXNlX2lmKFByZWQpOworCisgICAgICB2b2lkCisgICAgICBqb2luKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0KGtleV9jb25zdF9yZWZlcmVuY2UsIFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgYmVnaW4oKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVuZCgpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0OworCisgICAgICBpbmxpbmUgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdDsKKworICAgICAgaW5saW5lIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKTsKKworICAgICAgaW5saW5lIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdDsKKworICAgICAgLy8vIFJldHVybnMgYSBjb25zdCBub2RlX2l0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vZGUgYXQgdGhlCisgICAgICAvLy8gcm9vdCBvZiB0aGUgdHJlZS4KKyAgICAgIGlubGluZSBub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBub2RlX2JlZ2luKCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm5zIGEgbm9kZV9pdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlIGF0IHRoZQorICAgICAgLy8vIHJvb3Qgb2YgdGhlIHRyZWUuCisgICAgICBpbmxpbmUgbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9iZWdpbigpOworCisgICAgICAvLy8gUmV0dXJucyBhIGNvbnN0IG5vZGVfaXRlcmF0b3IgY29ycmVzcG9uZGluZyB0byBhIG5vZGUganVzdAorICAgICAgLy8vIGFmdGVyIGEgbGVhZiBvZiB0aGUgdHJlZS4KKyAgICAgIGlubGluZSBub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBub2RlX2VuZCgpIGNvbnN0OworCisgICAgICAvLy8gUmV0dXJucyBhIG5vZGVfaXRlcmF0b3IgY29ycmVzcG9uZGluZyB0byBhIG5vZGUganVzdAorICAgICAgLy8vIGFmdGVyIGEgbGVhZiBvZiB0aGUgdHJlZS4KKyAgICAgIGlubGluZSBub2RlX2l0ZXJhdG9yCisgICAgICBub2RlX2VuZCgpOworCisjaWZkZWYgUEJfRFNfUEFUX1RSSUVfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0OworI2VuZGlmCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICAgIHZvaWQKKyAgICAgIGNvcHlfZnJvbV9yYW5nZShJdCwgSXQpOworCisgICAgICB2b2lkCisgICAgICB2YWx1ZV9zd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIG5vZGVfcG9pbnRlcgorICAgICAgcmVjdXJzaXZlX2NvcHlfbm9kZShub2RlX2NvbnN0X3BvaW50ZXIpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIGluaXRpYWxpemUoKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGFwcGx5X3VwZGF0ZShub2RlX3BvaW50ZXIsIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlXz4KKyAgICAgIGlubGluZSB2b2lkCisgICAgICBhcHBseV91cGRhdGUobm9kZV9wb2ludGVyLCBOb2RlX1VwZGF0ZV8qKTsKKworICAgICAgYm9vbAorICAgICAgam9pbl9wcmVwKFBCX0RTX0NMQVNTX0NfREVDJiwgYnJhbmNoX2JhZyYpOworCisgICAgICB2b2lkCisgICAgICByZWNfam9pbl9wcmVwKG5vZGVfY29uc3RfcG9pbnRlciwgbm9kZV9jb25zdF9wb2ludGVyLCBicmFuY2hfYmFnJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlY19qb2luX3ByZXAobGVhZl9jb25zdF9wb2ludGVyLCBsZWFmX2NvbnN0X3BvaW50ZXIsIGJyYW5jaF9iYWcmKTsKKworICAgICAgdm9pZAorICAgICAgcmVjX2pvaW5fcHJlcChsZWFmX2NvbnN0X3BvaW50ZXIsIGlub2RlX2NvbnN0X3BvaW50ZXIsIGJyYW5jaF9iYWcmKTsKKworICAgICAgdm9pZAorICAgICAgcmVjX2pvaW5fcHJlcChpbm9kZV9jb25zdF9wb2ludGVyLCBsZWFmX2NvbnN0X3BvaW50ZXIsIGJyYW5jaF9iYWcmKTsKKworICAgICAgdm9pZAorICAgICAgcmVjX2pvaW5fcHJlcChpbm9kZV9jb25zdF9wb2ludGVyLCBpbm9kZV9jb25zdF9wb2ludGVyLCBicmFuY2hfYmFnJik7CisKKyAgICAgIG5vZGVfcG9pbnRlcgorICAgICAgcmVjX2pvaW4obm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIsIHNpemVfdHlwZSwgYnJhbmNoX2JhZyYpOworCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIHJlY19qb2luKGxlYWZfcG9pbnRlciwgbGVhZl9wb2ludGVyLCBicmFuY2hfYmFnJik7CisKKyAgICAgIG5vZGVfcG9pbnRlcgorICAgICAgcmVjX2pvaW4obGVhZl9wb2ludGVyLCBpbm9kZV9wb2ludGVyLCBzaXplX3R5cGUsIGJyYW5jaF9iYWcmKTsKKworICAgICAgbm9kZV9wb2ludGVyCisgICAgICByZWNfam9pbihpbm9kZV9wb2ludGVyLCBsZWFmX3BvaW50ZXIsIHNpemVfdHlwZSwgYnJhbmNoX2JhZyYpOworCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIHJlY19qb2luKGlub2RlX3BvaW50ZXIsIGlub2RlX3BvaW50ZXIsIGJyYW5jaF9iYWcmKTsKKworICAgICAgc2l6ZV90eXBlCisgICAgICBrZXlzX2RpZmZfaW5kKHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yLAorCQkgICAgdHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IsCisJCSAgICB0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciwKKwkJICAgIHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yKTsKKworICAgICAgaW5vZGVfcG9pbnRlcgorICAgICAgaW5zZXJ0X2JyYW5jaChub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlciwgYnJhbmNoX2JhZyYpOworCisgICAgICB2b2lkCisgICAgICB1cGRhdGVfbWluX21heF9mb3JfaW5zZXJ0ZWRfbGVhZihsZWFmX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZV9sZWFmKGxlYWZfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBhY3R1YWxfZXJhc2VfbGVhZihsZWFmX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICBjbGVhcl9pbXAobm9kZV9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2VfZml4dXAoaW5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHVwZGF0ZV9taW5fbWF4X2Zvcl9lcmFzZWRfbGVhZihsZWFmX3BvaW50ZXIpOworCisgICAgICBzdGF0aWMgaW5saW5lIGFfY29uc3RfaXRlcmF0b3IKKyAgICAgIHByZWZfYmVnaW4obm9kZV9jb25zdF9wb2ludGVyKTsKKworICAgICAgc3RhdGljIGlubGluZSBhX2NvbnN0X2l0ZXJhdG9yCisgICAgICBwcmVmX2VuZChub2RlX2NvbnN0X3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBmaW5kX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgbG93ZXJfYm91bmRfaW1wKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICB1cHBlcl9ib3VuZF9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBzdGF0aWMgbGVhZl9jb25zdF9wb2ludGVyCisgICAgICBsZWZ0bW9zdF9kZXNjZW5kYW50KG5vZGVfY29uc3RfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBzdGF0aWMgbGVhZl9wb2ludGVyCisgICAgICBsZWZ0bW9zdF9kZXNjZW5kYW50KG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBzdGF0aWMgbGVhZl9jb25zdF9wb2ludGVyCisgICAgICByaWdodG1vc3RfZGVzY2VuZGFudChub2RlX2NvbnN0X3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgc3RhdGljIGxlYWZfcG9pbnRlcgorICAgICAgcmlnaHRtb3N0X2Rlc2NlbmRhbnQobm9kZV9wb2ludGVyKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9pdGVyYXRvcnMoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9yZXZlcnNlX2l0ZXJhdG9ycyhjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgc3RhdGljIHNpemVfdHlwZQorICAgICAgcmVjdXJzaXZlX2NvdW50X2xlYWZzKG5vZGVfY29uc3RfcG9pbnRlciwgY29uc3QgY2hhciosIGludCk7CisjZW5kaWYKKworI2lmZGVmIFBCX0RTX1BBVF9UUklFX1RSQUNFXworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIHRyYWNlX25vZGUobm9kZV9jb25zdF9wb2ludGVyLCBzaXplX3R5cGUpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YV8+CisgICAgICBzdGF0aWMgdm9pZAorICAgICAgdHJhY2Vfbm9kZV9tZXRhZGF0YShub2RlX2NvbnN0X3BvaW50ZXIsIHR5cGVfdG9fdHlwZTxNZXRhZGF0YV8+KTsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIHRyYWNlX25vZGVfbWV0YWRhdGEobm9kZV9jb25zdF9wb2ludGVyLCB0eXBlX3RvX3R5cGU8bnVsbF90eXBlPik7CisjZW5kaWYKKworICAgICAgbGVhZl9wb2ludGVyCisgICAgICBzcGxpdF9wcmVwKGtleV9jb25zdF9yZWZlcmVuY2UsIFBCX0RTX0NMQVNTX0NfREVDJiwgYnJhbmNoX2JhZyYpOworCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIHJlY19zcGxpdChub2RlX3BvaW50ZXIsIGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfaXRlcmF0b3IsCisJCVBCX0RTX0NMQVNTX0NfREVDJiwgYnJhbmNoX2JhZyYpOworCisgICAgICB2b2lkCisgICAgICBzcGxpdF9pbnNlcnRfYnJhbmNoKHNpemVfdHlwZSwgYV9jb25zdF9pdGVyYXRvciwgaW5vZGVfaXRlcmF0b3IsCisJCQkgIHNpemVfdHlwZSwgYnJhbmNoX2JhZyYpOworCisgICAgICBzdGF0aWMgaGVhZF9hbGxvY2F0b3IgCQlzX2hlYWRfYWxsb2NhdG9yOworICAgICAgc3RhdGljIGlub2RlX2FsbG9jYXRvciAJCXNfaW5vZGVfYWxsb2NhdG9yOworICAgICAgc3RhdGljIGxlYWZfYWxsb2NhdG9yIAkJc19sZWFmX2FsbG9jYXRvcjsKKworICAgICAgaGVhZF9wb2ludGVyIAkJCW1fcF9oZWFkOworICAgICAgc2l6ZV90eXBlIAkJCW1fc2l6ZTsKKyAgICB9OworCisjZGVmaW5lIFBCX0RTX0FTU0VSVF9OT0RFX1ZBTElEKFgpIFwKKyAgX0dMSUJDWFhfREVCVUdfT05MWShYLT5hc3NlcnRfdmFsaWQodGhpcywgX19GSUxFX18sIF9fTElORV9fKTspCisKKyNkZWZpbmUgUEJfRFNfUkVDVVJTSVZFX0NPVU5UX0xFQUZTKFgpIFwKKyAgcmVjdXJzaXZlX2NvdW50X2xlYWZzKFgsIF9fRklMRV9fLCBfX0xJTkVfXykKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pbnNlcnRfam9pbl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9lcmFzZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9maW5kX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2luZm9fZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9zcGxpdF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy90cmFjZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy91cGRhdGVfZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19SRUNVUlNJVkVfQ09VTlRfTEVBRlMKKyN1bmRlZiBQQl9EU19BU1NFUlRfTk9ERV9WQUxJRAorI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19QQVRfVFJJRV9OQU1FCisjdW5kZWYgUEJfRFNfUEFUX1RSSUVfVFJBSVRTX0JBU0UKKyN1bmRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcGF0X3RyaWVfYmFzZS5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BhdF90cmllX2Jhc2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODRjYTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BhdF90cmllX2Jhc2UuaHBwCkBAIC0wLDAgKzEsMTM2MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYXRfdHJpZV8vcGF0X3RyaWVfYmFzZS5ocHAKKyAqIENvbnRhaW5zIHRoZSBiYXNlIGNsYXNzIGZvciBhIHBhdHJpY2lhIHRyZWUuCisgKi8KKworI2lmbmRlZiBQQl9EU19QQVRfVFJJRV9CQVNFCisjZGVmaW5lIFBCX0RTX1BBVF9UUklFX0JBU0UKKworI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBCYXNlIHR5cGUgZm9yIFBBVFJJQ0lBIHRyZWVzLgorICAgIHN0cnVjdCBwYXRfdHJpZV9iYXNlCisgICAgeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaHJlZSB0eXBlcyBvZiBub2Rlcy4KKyAgICAgICAqCisgICAgICAgKiAgaV9ub2RlIGlzIHVzZWQgYnkgX0lub2RlLCBsZWFmX25vZGUgYnkgX0xlYWYsIGFuZCBoZWFkX25vZGUgYnkgX0hlYWQuCisgICAgICAgKi8KKyAgICAgIGVudW0gbm9kZV90eXBlCisJeworCSAgaV9ub2RlLAorCSAgbGVhZl9ub2RlLAorCSAgaGVhZF9ub2RlCisJfTsKKworICAgICAgLy8vIE1ldGFkYXRhIGJhc2UgcHJpbWFyeSB0ZW1wbGF0ZS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1ldGFkYXRhLCB0eXBlbmFtZSBfQWxsb2M+CisJc3RydWN0IF9NZXRhZGF0YQorCXsKKwkgIHR5cGVkZWYgTWV0YWRhdGEgICAgIAkJCQkJbWV0YWRhdGFfdHlwZTsKKwkgIHR5cGVkZWYgX0FsbG9jICAgICAJCQkJCWFsbG9jYXRvcl90eXBlOworCSAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxNZXRhZGF0YT4JX19yZWJpbmRfbTsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbTo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZSAgY29uc3RfcmVmZXJlbmNlOworCisJICBjb25zdF9yZWZlcmVuY2UKKwkgIGdldF9tZXRhZGF0YSgpIGNvbnN0CisJICB7IHJldHVybiBtX21ldGFkYXRhOyB9CisKKwkgIG1ldGFkYXRhX3R5cGUgCQkJCQltX21ldGFkYXRhOworCX07CisKKyAgICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgbnVsbCBtZXRhZGF0YS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKwlzdHJ1Y3QgX01ldGFkYXRhPG51bGxfdHlwZSwgX0FsbG9jPgorCXsKKwkgIHR5cGVkZWYgbnVsbF90eXBlIAkJCQkJbWV0YWRhdGFfdHlwZTsKKwkgIHR5cGVkZWYgX0FsbG9jICAgICAJCQkJCWFsbG9jYXRvcl90eXBlOworCX07CisKKworICAgICAgLy8vIE5vZGUgYmFzZS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BVHJhaXRzLCB0eXBlbmFtZSBNZXRhZGF0YT4KKyAgICAgIHN0cnVjdCBfTm9kZV9iYXNlCisgICAgICA6IHB1YmxpYyBNZXRhZGF0YQorICAgICAgeworICAgICAgcHJpdmF0ZToKKwl0eXBlZGVmIHR5cGVuYW1lIE1ldGFkYXRhOjphbGxvY2F0b3JfdHlwZQkJX0FsbG9jOworCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiBfQWxsb2MJCQkJCQlhbGxvY2F0b3JfdHlwZTsKKwl0eXBlZGVmIF9BVHJhaXRzCQkJCQlhY2Nlc3NfdHJhaXRzOworCXR5cGVkZWYgdHlwZW5hbWUgX0FUcmFpdHM6OnR5cGVfdHJhaXRzCQkJdHlwZV90cmFpdHM7CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfTm9kZV9iYXNlPglfX3JlYmluZF9uOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbjo6b3RoZXI6OnBvaW50ZXIgCQlub2RlX3BvaW50ZXI7CisKKwlub2RlX3BvaW50ZXIgCQkJCQkJbV9wX3BhcmVudDsKKwljb25zdCBub2RlX3R5cGUgCSAgICAgICAJCQkJbV90eXBlOworCisJX05vZGVfYmFzZShub2RlX3R5cGUgdHlwZSkgOiBtX3R5cGUodHlwZSkKKwl7IH0KKworCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X0FUcmFpdHM+ICAgIF9fcmViaW5kX2F0OworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYXQ6Om90aGVyOjpjb25zdF9wb2ludGVyICAgIGFfY29uc3RfcG9pbnRlcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9BVHJhaXRzOjpjb25zdF9pdGVyYXRvcgkgICAgICBhX2NvbnN0X2l0ZXJhdG9yOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKwl0eXBlZGVmIHN0ZDo6cGFpcjxhX2NvbnN0X2l0ZXJhdG9yLCBhX2NvbnN0X2l0ZXJhdG9yPiBub2RlX2RlYnVnX2luZm87CisKKwl2b2lkCisJYXNzZXJ0X3ZhbGlkKGFfY29uc3RfcG9pbnRlciBwX3RyYWl0cywKKwkJICAgICBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0CisJeyBhc3NlcnRfdmFsaWRfaW1wKHBfdHJhaXRzLCBfX2ZpbGUsIF9fbGluZSk7IH0KKworCXZpcnR1YWwgbm9kZV9kZWJ1Z19pbmZvCisJYXNzZXJ0X3ZhbGlkX2ltcChhX2NvbnN0X3BvaW50ZXIsIGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0ID0gMDsKKyNlbmRpZgorICAgICAgfTsKKworCisgICAgLy8vIEhlYWQgbm9kZSBmb3IgUEFUUklDSUEgdHJlZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQVRyYWl0cywgdHlwZW5hbWUgTWV0YWRhdGE+CisgICAgc3RydWN0IF9IZWFkCisgICAgOiBwdWJsaWMgX05vZGVfYmFzZTxfQVRyYWl0cywgTWV0YWRhdGE+CisgICAgeworICAgICAgdHlwZWRlZiBfTm9kZV9iYXNlPF9BVHJhaXRzLCBNZXRhZGF0YT4gCQkJYmFzZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnR5cGVfdHJhaXRzCQkJdHlwZV90cmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9wb2ludGVyCQkJbm9kZV9wb2ludGVyOworCisgICAgICBub2RlX3BvaW50ZXIJCQkJCQltX3BfbWluOworICAgICAgbm9kZV9wb2ludGVyCQkJCQkJbV9wX21heDsKKworICAgICAgX0hlYWQoKSA6IGJhc2VfdHlwZShoZWFkX25vZGUpIHsgfQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX2RlYnVnX2luZm8gICAgICAJICAgICAgIG5vZGVfZGVidWdfaW5mbzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjphX2NvbnN0X3BvaW50ZXIgCSAgICAgICBhX2NvbnN0X3BvaW50ZXI7CisKKyAgICAgIHZpcnR1YWwgbm9kZV9kZWJ1Z19pbmZvCisgICAgICBhc3NlcnRfdmFsaWRfaW1wKGFfY29uc3RfcG9pbnRlciwgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWV9BVChmYWxzZSwKKwkJCQkgX01fbWVzc2FnZSgiQXNzZXJ0aW9uIGZyb20gJTE7OiUyOyIpCisJCQkJIC5fTV9zdHJpbmcoX19GSUxFX18pLl9NX2ludGVnZXIoX19MSU5FX18pLAorCQkJCSBfX2ZpbGUsIF9fbGluZSk7CisJcmV0dXJuIG5vZGVfZGVidWdfaW5mbygpOworICAgICAgfQorI2VuZGlmCisgICAgfTsKKworCisgICAgLy8vIExlYWYgbm9kZSBmb3IgUEFUUklDSUEgdHJlZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQVRyYWl0cywgdHlwZW5hbWUgTWV0YWRhdGE+CisgICAgc3RydWN0IF9MZWFmCisgICAgOiBwdWJsaWMgX05vZGVfYmFzZTxfQVRyYWl0cywgTWV0YWRhdGE+CisgICAgeworICAgICAgdHlwZWRlZiBfTm9kZV9iYXNlPF9BVHJhaXRzLCBNZXRhZGF0YT4gCSAgIAkgICAgCWJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjp0eXBlX3RyYWl0cwkJCXR5cGVfdHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0eXBlX3RyYWl0czo6dmFsdWVfdHlwZQkJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHR5cGVfdHJhaXRzOjpyZWZlcmVuY2UJCQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9yZWZlcmVuY2UgICAgCQljb25zdF9yZWZlcmVuY2U7CisKKyAgICBwcml2YXRlOgorICAgICAgdmFsdWVfdHlwZQkJCQkJCW1fdmFsdWU7CisKKyAgICAgIF9MZWFmKGNvbnN0IF9MZWFmJik7CisKKyAgICBwdWJsaWM6CisgICAgICBfTGVhZihjb25zdF9yZWZlcmVuY2Ugb3RoZXIpCisgICAgICA6IGJhc2VfdHlwZShsZWFmX25vZGUpLCBtX3ZhbHVlKG90aGVyKSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICB2YWx1ZSgpCisgICAgICB7IHJldHVybiBtX3ZhbHVlOyB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgdmFsdWUoKSBjb25zdAorICAgICAgeyByZXR1cm4gbV92YWx1ZTsgfQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX2RlYnVnX2luZm8gICAgICAJCW5vZGVfZGVidWdfaW5mbzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjphX2NvbnN0X3BvaW50ZXIgICAgICAJCWFfY29uc3RfcG9pbnRlcjsKKworICAgICAgdmlydHVhbCBub2RlX2RlYnVnX2luZm8KKyAgICAgIGFzc2VydF92YWxpZF9pbXAoYV9jb25zdF9wb2ludGVyIHBfdHJhaXRzLAorCQkgICAgICAgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAorICAgICAgeworCVBCX0RTX0RFQlVHX1ZFUklGWShiYXNlX3R5cGU6Om1fdHlwZSA9PSBsZWFmX25vZGUpOworCW5vZGVfZGVidWdfaW5mbyByZXQ7CisJY29uc3RfcmVmZXJlbmNlIHJfdmFsID0gdmFsdWUoKTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIocF90cmFpdHMtPmJlZ2luKHBfdHJhaXRzLT5leHRyYWN0X2tleShyX3ZhbCkpLAorCQkJICAgICAgcF90cmFpdHMtPmVuZChwX3RyYWl0cy0+ZXh0cmFjdF9rZXkocl92YWwpKSk7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5fTGVhZigpIHsgfQorI2VuZGlmCisgICAgfTsKKworCisgICAgLy8vIEludGVybmFsIG5vZGUgdHlwZSwgUEFUUklDSUEgdHJlZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQVRyYWl0cywgdHlwZW5hbWUgTWV0YWRhdGE+CisgICAgc3RydWN0IF9Jbm9kZQorICAgIDogcHVibGljIF9Ob2RlX2Jhc2U8X0FUcmFpdHMsIE1ldGFkYXRhPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX05vZGVfYmFzZTxfQVRyYWl0cywgTWV0YWRhdGE+IAkJCWJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjp0eXBlX3RyYWl0cwkJCXR5cGVfdHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmFjY2Vzc190cmFpdHMJICAgICAgIAkJYWNjZXNzX3RyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHlwZV90cmFpdHM6OnZhbHVlX3R5cGUgCQkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjphbGxvY2F0b3JfdHlwZQkJX0FsbG9jOworICAgICAgdHlwZWRlZiBfQWxsb2MJCQkJCQlhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQkJc2l6ZV90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjphX2NvbnN0X3BvaW50ZXIgICAgICAJICAgICAgIGFfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjphX2NvbnN0X2l0ZXJhdG9yICAgICAJICAgICAgYV9jb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om5vZGVfcG9pbnRlcgkJCW5vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8YmFzZV90eXBlPglfX3JlYmluZF9uOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9uOjpvdGhlcjo6Y29uc3RfcG9pbnRlciAgICAgIG5vZGVfY29uc3RfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiBfTGVhZjxfQVRyYWl0cywgTWV0YWRhdGE+CSAJCQlsZWFmOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxsZWFmPjo6b3RoZXIgCV9fcmViaW5kX2w7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2w6OnBvaW50ZXIgCQkJbGVhZl9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9sOjpjb25zdF9wb2ludGVyIAkgICAgbGVhZl9jb25zdF9wb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9Jbm9kZT46Om90aGVyIAlfX3JlYmluZF9pbjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfaW46OnBvaW50ZXIgCQkJaW5vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfaW46OmNvbnN0X3BvaW50ZXIgCSAgICBpbm9kZV9jb25zdF9wb2ludGVyOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBnZXRfcHJlZl9wb3MoYV9jb25zdF9pdGVyYXRvciwgYV9jb25zdF9pdGVyYXRvciwgYV9jb25zdF9wb2ludGVyKSBjb25zdDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8bm9kZV9wb2ludGVyPjo6b3RoZXIgX19yZWJpbmRfbnA7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX25wOjpwb2ludGVyIAkJbm9kZV9wb2ludGVyX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX25wOjpyZWZlcmVuY2UgCQlub2RlX3BvaW50ZXJfcmVmZXJlbmNlOworCisgICAgICBlbnVtCisJeworCSAgYXJyX3NpemUgPSBfQVRyYWl0czo6bWF4X3NpemUgKyAxCisJfTsKKyAgICAgIFBCX0RTX1NUQVRJQ19BU1NFUlQobWluX2Fycl9zaXplLCBhcnJfc2l6ZSA+PSAyKTsKKworCisgICAgICAvLy8gQ29uc3RhbnQgY2hpbGQgaXRlcmF0b3IuCisgICAgICBzdHJ1Y3QgY29uc3RfaXRlcmF0b3IKKyAgICAgIHsKKwlub2RlX3BvaW50ZXJfcG9pbnRlciAJCQkJbV9wX3BfY3VyOworCW5vZGVfcG9pbnRlcl9wb2ludGVyIAkJCQltX3BfcF9lbmQ7CisKKwl0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgCQlpdGVyYXRvcl9jYXRlZ29yeTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIAlkaWZmZXJlbmNlX3R5cGU7CisJdHlwZWRlZiBub2RlX3BvaW50ZXIgCQkJCXZhbHVlX3R5cGU7CisJdHlwZWRlZiBub2RlX3BvaW50ZXJfcG9pbnRlciAJCQlwb2ludGVyOworCXR5cGVkZWYgbm9kZV9wb2ludGVyX3JlZmVyZW5jZSAJCQlyZWZlcmVuY2U7CisKKwljb25zdF9pdGVyYXRvcihub2RlX3BvaW50ZXJfcG9pbnRlciBwX3BfY3VyID0gMCwKKwkJICAgICAgIG5vZGVfcG9pbnRlcl9wb2ludGVyIHBfcF9lbmQgPSAwKQorCTogbV9wX3BfY3VyKHBfcF9jdXIpLCBtX3BfcF9lbmQocF9wX2VuZCkKKwl7IH0KKworCWJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBvdGhlcikgY29uc3QKKwl7IHJldHVybiBtX3BfcF9jdXIgPT0gb3RoZXIubV9wX3BfY3VyOyB9CisKKwlib29sCisJb3BlcmF0b3IhPShjb25zdCBjb25zdF9pdGVyYXRvciYgb3RoZXIpIGNvbnN0CisJeyByZXR1cm4gbV9wX3BfY3VyICE9IG90aGVyLm1fcF9wX2N1cjsgfQorCisJY29uc3RfaXRlcmF0b3ImCisJb3BlcmF0b3IrKygpCisJeworCSAgZG8KKwkgICAgKyttX3BfcF9jdXI7CisJICB3aGlsZSAobV9wX3BfY3VyICE9IG1fcF9wX2VuZCAmJiAqbV9wX3BfY3VyID09IDApOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCWNvbnN0X2l0ZXJhdG9yCisJb3BlcmF0b3IrKyhpbnQpCisJeworCSAgY29uc3RfaXRlcmF0b3IgcmV0X2l0KCp0aGlzKTsKKwkgIG9wZXJhdG9yKysoKTsKKwkgIHJldHVybiByZXRfaXQ7CisJfQorCisJY29uc3Qgbm9kZV9wb2ludGVyX3BvaW50ZXIKKwlvcGVyYXRvci0+KCkgY29uc3QKKwl7CisJICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF9yZWZlcmVuY2libGUoKTspCisJICByZXR1cm4gbV9wX3BfY3VyOworCX0KKworCW5vZGVfY29uc3RfcG9pbnRlcgorCW9wZXJhdG9yKigpIGNvbnN0CisJeworCSAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfcmVmZXJlbmNpYmxlKCk7KQorCSAgcmV0dXJuICptX3BfcF9jdXI7CisJfQorCisgICAgICBwcm90ZWN0ZWQ6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKwl2b2lkCisJYXNzZXJ0X3JlZmVyZW5jaWJsZSgpIGNvbnN0CisJeyBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX3BfY3VyICE9IG1fcF9wX2VuZCAmJiAqbV9wX3BfY3VyICE9IDApOyB9CisjZW5kaWYKKyAgICAgIH07CisKKworICAgICAgLy8vIENoaWxkIGl0ZXJhdG9yLgorICAgICAgc3RydWN0IGl0ZXJhdG9yIDogcHVibGljIGNvbnN0X2l0ZXJhdG9yCisgICAgICB7CisgICAgICBwdWJsaWM6CisJdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnIAkJaXRlcmF0b3JfY2F0ZWdvcnk7CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJZGlmZmVyZW5jZV90eXBlOworCXR5cGVkZWYgbm9kZV9wb2ludGVyIAkJCQl2YWx1ZV90eXBlOworCXR5cGVkZWYgbm9kZV9wb2ludGVyX3BvaW50ZXIgCQkJcG9pbnRlcjsKKwl0eXBlZGVmIG5vZGVfcG9pbnRlcl9yZWZlcmVuY2UgCQkJcmVmZXJlbmNlOworCisJaW5saW5lCisJaXRlcmF0b3Iobm9kZV9wb2ludGVyX3BvaW50ZXIgcF9wX2N1ciA9IDAsCisJCSBub2RlX3BvaW50ZXJfcG9pbnRlciBwX3BfZW5kID0gMCkKKwk6IGNvbnN0X2l0ZXJhdG9yKHBfcF9jdXIsIHBfcF9lbmQpIHsgfQorCisJYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorCXsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yOjptX3BfcF9jdXIgPT0gb3RoZXIubV9wX3BfY3VyOyB9CisKKwlib29sCisJb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisJeyByZXR1cm4gY29uc3RfaXRlcmF0b3I6Om1fcF9wX2N1ciAhPSBvdGhlci5tX3BfcF9jdXI7IH0KKworCWl0ZXJhdG9yJgorCW9wZXJhdG9yKysoKQorCXsKKwkgIGNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvcisrKCk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJaXRlcmF0b3IKKwlvcGVyYXRvcisrKGludCkKKwl7CisJICBpdGVyYXRvciByZXRfaXQoKnRoaXMpOworCSAgb3BlcmF0b3IrKygpOworCSAgcmV0dXJuIHJldF9pdDsKKwl9CisKKwlub2RlX3BvaW50ZXJfcG9pbnRlcgorCW9wZXJhdG9yLT4oKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX09OTFkoY29uc3RfaXRlcmF0b3I6OmFzc2VydF9yZWZlcmVuY2libGUoKTspCisJICByZXR1cm4gY29uc3RfaXRlcmF0b3I6Om1fcF9wX2N1cjsKKwl9CisKKwlub2RlX3BvaW50ZXIKKwlvcGVyYXRvciooKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX09OTFkoY29uc3RfaXRlcmF0b3I6OmFzc2VydF9yZWZlcmVuY2libGUoKTspCisJICByZXR1cm4gKmNvbnN0X2l0ZXJhdG9yOjptX3BfcF9jdXI7CisJfQorICAgICAgfTsKKworCisgICAgICBfSW5vZGUoc2l6ZV90eXBlLCBjb25zdCBhX2NvbnN0X2l0ZXJhdG9yKTsKKworICAgICAgdm9pZAorICAgICAgdXBkYXRlX3ByZWZpeGVzKGFfY29uc3RfcG9pbnRlcik7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0OworCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKTsKKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0OworCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCk7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGdldF9jaGlsZF9ub2RlKGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBub2RlX2NvbnN0X3BvaW50ZXIKKyAgICAgIGdldF9jaGlsZF9ub2RlKGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfcG9pbnRlcikgY29uc3Q7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgZ2V0X2NoaWxkX2l0KGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGdldF9sb3dlcl9ib3VuZF9jaGlsZF9ub2RlKGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfaXRlcmF0b3IsCisJCQkJIHNpemVfdHlwZSwgYV9jb25zdF9wb2ludGVyKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgYWRkX2NoaWxkKG5vZGVfcG9pbnRlciwgYV9jb25zdF9pdGVyYXRvciwgYV9jb25zdF9pdGVyYXRvciwKKwkJYV9jb25zdF9wb2ludGVyKTsKKworICAgICAgaW5saW5lIG5vZGVfY29uc3RfcG9pbnRlcgorICAgICAgZ2V0X2pvaW5fY2hpbGQobm9kZV9jb25zdF9wb2ludGVyLCBhX2NvbnN0X3BvaW50ZXIpIGNvbnN0OworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBnZXRfam9pbl9jaGlsZChub2RlX3BvaW50ZXIsIGFfY29uc3RfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlbW92ZV9jaGlsZChub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICByZW1vdmVfY2hpbGQoaXRlcmF0b3IpOworCisgICAgICB2b2lkCisgICAgICByZXBsYWNlX2NoaWxkKG5vZGVfcG9pbnRlciwgYV9jb25zdF9pdGVyYXRvciwgYV9jb25zdF9pdGVyYXRvciwKKwkJICAgIGFfY29uc3RfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBhX2NvbnN0X2l0ZXJhdG9yCisgICAgICBwcmVmX2JfaXQoKSBjb25zdDsKKworICAgICAgaW5saW5lIGFfY29uc3RfaXRlcmF0b3IKKyAgICAgIHByZWZfZV9pdCgpIGNvbnN0OworCisgICAgICBib29sCisgICAgICBzaG91bGRfYmVfbWluZShhX2NvbnN0X2l0ZXJhdG9yLCBhX2NvbnN0X2l0ZXJhdG9yLCBzaXplX3R5cGUsCisJCSAgICAgYV9jb25zdF9wb2ludGVyKSBjb25zdDsKKworICAgICAgbGVhZl9wb2ludGVyCisgICAgICBsZWZ0bW9zdF9kZXNjZW5kYW50KCk7CisKKyAgICAgIGxlYWZfY29uc3RfcG9pbnRlcgorICAgICAgbGVmdG1vc3RfZGVzY2VuZGFudCgpIGNvbnN0OworCisgICAgICBsZWFmX3BvaW50ZXIKKyAgICAgIHJpZ2h0bW9zdF9kZXNjZW5kYW50KCk7CisKKyAgICAgIGxlYWZfY29uc3RfcG9pbnRlcgorICAgICAgcmlnaHRtb3N0X2Rlc2NlbmRhbnQoKSBjb25zdDsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9kZWJ1Z19pbmZvIAkgICAgICAgbm9kZV9kZWJ1Z19pbmZvOworCisgICAgICB2aXJ0dWFsIG5vZGVfZGVidWdfaW5mbworICAgICAgYXNzZXJ0X3ZhbGlkX2ltcChhX2NvbnN0X3BvaW50ZXIsIGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZ2V0X2VfaW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fZV9pbmQ7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfSW5vZGUoY29uc3QgX0lub2RlJik7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZ2V0X2JlZ2luX3BvcygpIGNvbnN0OworCisgICAgICBzdGF0aWMgX19yZWJpbmRfbAkJCXNfbGVhZl9hbGxvYzsKKyAgICAgIHN0YXRpYyBfX3JlYmluZF9pbiAJCXNfaW5vZGVfYWxsb2M7CisKKyAgICAgIGNvbnN0IHNpemVfdHlwZSAJCQltX2VfaW5kOworICAgICAgYV9jb25zdF9pdGVyYXRvciAJCQltX3ByZWZfYl9pdDsKKyAgICAgIGFfY29uc3RfaXRlcmF0b3IgCQkJbV9wcmVmX2VfaXQ7CisgICAgICBub2RlX3BvaW50ZXIgCQkJbV9hX3BfY2hpbGRyZW5bYXJyX3NpemVdOworICAgIH07CisKKyNkZWZpbmUgUEJfRFNfQ09OU1RfSVRfQ19ERUMgXAorICAgIF9DSXRlcjxOb2RlLCBMZWFmLCBIZWFkLCBJbm9kZSwgSXNfRm9yd2FyZF9JdGVyYXRvcj4KKworI2RlZmluZSBQQl9EU19DT05TVF9PRElSX0lUX0NfREVDIFwKKyAgICBfQ0l0ZXI8Tm9kZSwgTGVhZiwgSGVhZCwgSW5vZGUsICFJc19Gb3J3YXJkX0l0ZXJhdG9yPgorCisjZGVmaW5lIFBCX0RTX0lUX0NfREVDIFwKKyAgICBfSXRlcjxOb2RlLCBMZWFmLCBIZWFkLCBJbm9kZSwgSXNfRm9yd2FyZF9JdGVyYXRvcj4KKworI2RlZmluZSBQQl9EU19PRElSX0lUX0NfREVDIFwKKyAgICBfSXRlcjxOb2RlLCBMZWFmLCBIZWFkLCBJbm9kZSwgIUlzX0ZvcndhcmRfSXRlcmF0b3I+CisKKworICAgIC8vLyBDb25zdCBpdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlLCB0eXBlbmFtZSBMZWFmLCB0eXBlbmFtZSBIZWFkLCB0eXBlbmFtZSBJbm9kZSwKKwkgICAgIGJvb2wgSXNfRm9yd2FyZF9JdGVyYXRvcj4KKyAgICBjbGFzcyBfQ0l0ZXIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVGhlc2UgdHlwZXMgYXJlIGFsbCB0aGUgc2FtZSBmb3IgdGhlIGZpcnN0IGZvdXIgdGVtcGxhdGUgYXJndW1lbnRzLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlOjphbGxvY2F0b3JfdHlwZQkJYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIE5vZGU6OnR5cGVfdHJhaXRzCQl0eXBlX3RyYWl0czsKKworICAgICAgdHlwZWRlZiBzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIAkJaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpkaWZmZXJlbmNlX3R5cGUJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0eXBlX3RyYWl0czo6dmFsdWVfdHlwZQkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHlwZV90cmFpdHM6OnBvaW50ZXIgCQlwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0eXBlX3RyYWl0czo6cmVmZXJlbmNlIAkJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0eXBlX3RyYWl0czo6Y29uc3RfcG9pbnRlciAJY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIGFsbG9jYXRvcl90eXBlCQkJCV9BbGxvYzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8Tm9kZT4JX19yZWJpbmRfbjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbjo6b3RoZXI6OnBvaW50ZXIJbm9kZV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxMZWFmPglfX3JlYmluZF9sOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9sOjpvdGhlcjo6cG9pbnRlcglsZWFmX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2w6Om90aGVyOjpjb25zdF9wb2ludGVyCWxlYWZfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8SGVhZD4JX19yZWJpbmRfaDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfaDo6b3RoZXI6OnBvaW50ZXIJaGVhZF9wb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPElub2RlPiBfX3JlYmluZF9pbjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfaW46Om90aGVyOjpwb2ludGVyIAlpbm9kZV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBJbm9kZTo6aXRlcmF0b3IJCQlpbm9kZV9pdGVyYXRvcjsKKworICAgICAgbm9kZV9wb2ludGVyIAkJCQkJbV9wX25kOworCisgICAgICBfQ0l0ZXIobm9kZV9wb2ludGVyIHBfbmQgPSAwKSA6IG1fcF9uZChwX25kKQorICAgICAgeyB9CisKKyAgICAgIF9DSXRlcihjb25zdCBQQl9EU19DT05TVF9PRElSX0lUX0NfREVDJiBvdGhlcikKKyAgICAgIDogbV9wX25kKG90aGVyLm1fcF9uZCkKKyAgICAgIHsgfQorCisgICAgICBfQ0l0ZXImCisgICAgICBvcGVyYXRvcj0oY29uc3QgX0NJdGVyJiBvdGhlcikKKyAgICAgIHsKKwltX3BfbmQgPSBvdGhlci5tX3BfbmQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfQ0l0ZXImCisgICAgICBvcGVyYXRvcj0oY29uc3QgUEJfRFNfQ09OU1RfT0RJUl9JVF9DX0RFQyYgb3RoZXIpCisgICAgICB7CisJbV9wX25kID0gb3RoZXIubV9wX25kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgY29uc3RfcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSk7CisJcmV0dXJuICZzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KG1fcF9uZCktPnZhbHVlKCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKTsKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihtX3BfbmQpLT52YWx1ZSgpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9DSXRlciYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfbmQgPT0gb3RoZXIubV9wX25kOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgUEJfRFNfQ09OU1RfT0RJUl9JVF9DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfbmQgPT0gb3RoZXIubV9wX25kOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgX0NJdGVyJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZCAhPSBvdGhlci5tX3BfbmQ7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBQQl9EU19DT05TVF9PRElSX0lUX0NfREVDJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZCAhPSBvdGhlci5tX3BfbmQ7IH0KKworICAgICAgX0NJdGVyJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJaW5jKGludGVncmFsX2NvbnN0YW50PGludCwgSXNfRm9yd2FyZF9JdGVyYXRvcj4oKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfQ0l0ZXIKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9DSXRlciByZXRfaXQobV9wX25kKTsKKwlvcGVyYXRvcisrKCk7CisJcmV0dXJuIHJldF9pdDsKKyAgICAgIH0KKworICAgICAgX0NJdGVyJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJZGVjKGludGVncmFsX2NvbnN0YW50PGludCwgSXNfRm9yd2FyZF9JdGVyYXRvcj4oKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfQ0l0ZXIKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeworCV9DSXRlciByZXRfaXQobV9wX25kKTsKKwlvcGVyYXRvci0tKCk7CisJcmV0dXJuIHJldF9pdDsKKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZvaWQKKyAgICAgIGluYyhmYWxzZV90eXBlKQorICAgICAgeyBkZWModHJ1ZV90eXBlKCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluYyh0cnVlX3R5cGUpCisgICAgICB7CisJaWYgKG1fcF9uZC0+bV90eXBlID09IGhlYWRfbm9kZSkKKwkgIHsKKwkgICAgbV9wX25kID0gc3RhdGljX2Nhc3Q8aGVhZF9wb2ludGVyPihtX3BfbmQpLT5tX3BfbWluOworCSAgICByZXR1cm47CisJICB9CisKKwlub2RlX3BvaW50ZXIgcF95ID0gbV9wX25kLT5tX3BfcGFyZW50OworCXdoaWxlIChwX3ktPm1fdHlwZSAhPSBoZWFkX25vZGUgJiYgZ2V0X2xhcmdlcl9zaWJsaW5nKG1fcF9uZCkgPT0gMCkKKwkgIHsKKwkgICAgbV9wX25kID0gcF95OworCSAgICBwX3kgPSBwX3ktPm1fcF9wYXJlbnQ7CisJICB9CisKKwlpZiAocF95LT5tX3R5cGUgPT0gaGVhZF9ub2RlKQorCSAgeworCSAgICBtX3BfbmQgPSBwX3k7CisJICAgIHJldHVybjsKKwkgIH0KKwltX3BfbmQgPSBsZWZ0bW9zdF9kZXNjZW5kYW50KGdldF9sYXJnZXJfc2libGluZyhtX3BfbmQpKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgZGVjKGZhbHNlX3R5cGUpCisgICAgICB7IGluYyh0cnVlX3R5cGUoKSk7IH0KKworICAgICAgdm9pZAorICAgICAgZGVjKHRydWVfdHlwZSkKKyAgICAgIHsKKwlpZiAobV9wX25kLT5tX3R5cGUgPT0gaGVhZF9ub2RlKQorCSAgeworCSAgICBtX3BfbmQgPSBzdGF0aWNfY2FzdDxoZWFkX3BvaW50ZXI+KG1fcF9uZCktPm1fcF9tYXg7CisJICAgIHJldHVybjsKKwkgIH0KKworCW5vZGVfcG9pbnRlciBwX3kgPSBtX3BfbmQtPm1fcF9wYXJlbnQ7CisJd2hpbGUgKHBfeS0+bV90eXBlICE9IGhlYWRfbm9kZSAmJiBnZXRfc21hbGxlcl9zaWJsaW5nKG1fcF9uZCkgPT0gMCkKKwkgIHsKKwkgICAgbV9wX25kID0gcF95OworCSAgICBwX3kgPSBwX3ktPm1fcF9wYXJlbnQ7CisJICB9CisKKwlpZiAocF95LT5tX3R5cGUgPT0gaGVhZF9ub2RlKQorCSAgeworCSAgICBtX3BfbmQgPSBwX3k7CisJICAgIHJldHVybjsKKwkgIH0KKwltX3BfbmQgPSByaWdodG1vc3RfZGVzY2VuZGFudChnZXRfc21hbGxlcl9zaWJsaW5nKG1fcF9uZCkpOworICAgICAgfQorCisgICAgICBzdGF0aWMgbm9kZV9wb2ludGVyCisgICAgICBnZXRfbGFyZ2VyX3NpYmxpbmcobm9kZV9wb2ludGVyIHBfbmQpCisgICAgICB7CisJaW5vZGVfcG9pbnRlciBwX3BhcmVudCA9IHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbmQtPm1fcF9wYXJlbnQpOworCisJaW5vZGVfaXRlcmF0b3IgaXQgPSBwX3BhcmVudC0+YmVnaW4oKTsKKwl3aGlsZSAoKml0ICE9IHBfbmQpCisJICArK2l0OworCisJaW5vZGVfaXRlcmF0b3IgbmV4dF9pdCA9IGl0OworCSsrbmV4dF9pdDsKKwlyZXR1cm4gKG5leHRfaXQgPT0gcF9wYXJlbnQtPmVuZCgpKT8gMCA6ICpuZXh0X2l0OworICAgICAgfQorCisgICAgICBzdGF0aWMgbm9kZV9wb2ludGVyCisgICAgICBnZXRfc21hbGxlcl9zaWJsaW5nKG5vZGVfcG9pbnRlciBwX25kKQorICAgICAgeworCWlub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX25kLT5tX3BfcGFyZW50KTsKKworCWlub2RlX2l0ZXJhdG9yIGl0ID0gcF9wYXJlbnQtPmJlZ2luKCk7CisJaWYgKCppdCA9PSBwX25kKQorCSAgcmV0dXJuIDA7CisKKwlpbm9kZV9pdGVyYXRvciBwcmV2X2l0OworCWRvCisJICB7CisJICAgIHByZXZfaXQgPSBpdDsKKwkgICAgKytpdDsKKwkgICAgaWYgKCppdCA9PSBwX25kKQorCSAgICAgIHJldHVybiAqcHJldl9pdDsKKwkgIH0KKwl3aGlsZSAodHJ1ZSk7CisKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoZmFsc2UpOworCXJldHVybiAwOworICAgICAgfQorCisgICAgICBzdGF0aWMgbGVhZl9wb2ludGVyCisgICAgICBsZWZ0bW9zdF9kZXNjZW5kYW50KG5vZGVfcG9pbnRlciBwX25kKQorICAgICAgeworCWlmIChwX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorCSAgcmV0dXJuIHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9uZCk7CisJcmV0dXJuIHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbmQpLT5sZWZ0bW9zdF9kZXNjZW5kYW50KCk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBsZWFmX3BvaW50ZXIKKyAgICAgIHJpZ2h0bW9zdF9kZXNjZW5kYW50KG5vZGVfcG9pbnRlciBwX25kKQorICAgICAgeworCWlmIChwX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorCSAgcmV0dXJuIHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9uZCk7CisJcmV0dXJuIHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbmQpLT5yaWdodG1vc3RfZGVzY2VuZGFudCgpOworICAgICAgfQorICAgIH07CisKKworICAgIC8vLyBJdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlLCB0eXBlbmFtZSBMZWFmLCB0eXBlbmFtZSBIZWFkLCB0eXBlbmFtZSBJbm9kZSwKKwkgICAgIGJvb2wgSXNfRm9yd2FyZF9JdGVyYXRvcj4KKyAgICBjbGFzcyBfSXRlcgorICAgIDogcHVibGljIF9DSXRlcjxOb2RlLCBMZWFmLCBIZWFkLCBJbm9kZSwgSXNfRm9yd2FyZF9JdGVyYXRvcj4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ0l0ZXI8Tm9kZSwgTGVhZiwgSGVhZCwgSW5vZGUsIElzX0ZvcndhcmRfSXRlcmF0b3I+CisgICAgICAJCQkJCQkJYmFzZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmFsbG9jYXRvcl90eXBlCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnR5cGVfdHJhaXRzCQl0eXBlX3RyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHlwZV90cmFpdHM6OnZhbHVlX3R5cGUJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHR5cGVfdHJhaXRzOjpwb2ludGVyIAkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHlwZV90cmFpdHM6OnJlZmVyZW5jZSAJCXJlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om5vZGVfcG9pbnRlcgkJbm9kZV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmxlYWZfcG9pbnRlcgkJbGVhZl9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmxlYWZfY29uc3RfcG9pbnRlcglsZWFmX2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aGVhZF9wb2ludGVyCQloZWFkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aW5vZGVfcG9pbnRlciAJaW5vZGVfcG9pbnRlcjsKKworICAgICAgX0l0ZXIobm9kZV9wb2ludGVyIHBfbmQgPSAwKQorICAgICAgOiBiYXNlX3R5cGUocF9uZCkgeyB9CisKKyAgICAgIF9JdGVyKGNvbnN0IFBCX0RTX09ESVJfSVRfQ19ERUMmIG90aGVyKQorICAgICAgOiBiYXNlX3R5cGUob3RoZXIubV9wX25kKSB7IH0KKworICAgICAgX0l0ZXImCisgICAgICBvcGVyYXRvcj0oY29uc3QgX0l0ZXImIG90aGVyKQorICAgICAgeworCWJhc2VfdHlwZTo6bV9wX25kID0gb3RoZXIubV9wX25kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0l0ZXImCisgICAgICBvcGVyYXRvcj0oY29uc3QgUEJfRFNfT0RJUl9JVF9DX0RFQyYgb3RoZXIpCisgICAgICB7CisJYmFzZV90eXBlOjptX3BfbmQgPSBvdGhlci5tX3BfbmQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjptX3BfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpOworCXJldHVybiAmc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihiYXNlX3R5cGU6Om1fcF9uZCktPnZhbHVlKCk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjptX3BfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpOworCXJldHVybiBzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KGJhc2VfdHlwZTo6bV9wX25kKS0+dmFsdWUoKTsKKyAgICAgIH0KKworICAgICAgX0l0ZXImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwliYXNlX3R5cGU6Om9wZXJhdG9yKysoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9JdGVyCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfSXRlciByZXQoYmFzZV90eXBlOjptX3BfbmQpOworCW9wZXJhdG9yKysoKTsKKwlyZXR1cm4gcmV0OworICAgICAgfQorCisgICAgICBfSXRlciYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCWJhc2VfdHlwZTo6b3BlcmF0b3ItLSgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0l0ZXIKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeworCV9JdGVyIHJldChiYXNlX3R5cGU6Om1fcF9uZCk7CisJb3BlcmF0b3ItLSgpOworCXJldHVybiByZXQ7CisgICAgICB9CisgICAgfTsKKworI3VuZGVmIFBCX0RTX0NPTlNUX09ESVJfSVRfQ19ERUMKKyN1bmRlZiBQQl9EU19PRElSX0lUX0NfREVDCisKKworI2RlZmluZSBQQl9EU19QQVRfVFJJRV9OT0RFX0NPTlNUX0lURVJBVE9SX0NfREVDIFwKKyAgICBfTm9kZV9jaXRlcjxOb2RlLCBMZWFmLCBIZWFkLCBJbm9kZSwgX0NJdGVyYXRvciwgSXRlcmF0b3IsIF9BVHJhaXRzLCBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfUEFUX1RSSUVfTk9ERV9JVEVSQVRPUl9DX0RFQyBcCisgICAgX05vZGVfaXRlcjxOb2RlLCBMZWFmLCBIZWFkLCBJbm9kZSwgX0NJdGVyYXRvciwgSXRlcmF0b3IsIF9BVHJhaXRzLCBfQWxsb2M+CisKKyAgICAvLy8gTm9kZSBjb25zdCBpdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlLAorCSAgICAgdHlwZW5hbWUgTGVhZiwKKwkgICAgIHR5cGVuYW1lIEhlYWQsCisJICAgICB0eXBlbmFtZSBJbm9kZSwKKwkgICAgIHR5cGVuYW1lIF9DSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBfTm9kZV9jaXRlcgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPE5vZGU+CV9fcmViaW5kX247CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX246Om90aGVyOjpwb2ludGVyCW5vZGVfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxMZWFmPglfX3JlYmluZF9sOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9sOjpvdGhlcjo6cG9pbnRlcglsZWFmX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2w6Om90aGVyOjpjb25zdF9wb2ludGVyCWxlYWZfY29uc3RfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxJbm9kZT4gCV9fcmViaW5kX2luOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9pbjo6b3RoZXI6OnBvaW50ZXIgCWlub2RlX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2luOjpvdGhlcjo6Y29uc3RfcG9pbnRlciBpbm9kZV9jb25zdF9wb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIE5vZGU6OmFfY29uc3RfcG9pbnRlcgkJYV9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlOjphX2NvbnN0X2l0ZXJhdG9yCQlhX2NvbnN0X2l0ZXJhdG9yOworCisgICAgcHJpdmF0ZToKKyAgICAgIGFfY29uc3RfaXRlcmF0b3IKKyAgICAgIHByZWZfYmVnaW4oKSBjb25zdAorICAgICAgeworCWlmIChtX3BfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisJICB7CisJICAgIGxlYWZfY29uc3RfcG9pbnRlciBsY3AgPSBzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KG1fcF9uZCk7CisJICAgIHJldHVybiBtX3BfdHJhaXRzLT5iZWdpbihtX3BfdHJhaXRzLT5leHRyYWN0X2tleShsY3AtPnZhbHVlKCkpKTsKKwkgIH0KKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX25kLT5tX3R5cGUgPT0gaV9ub2RlKTsKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8aW5vZGVfY29uc3RfcG9pbnRlcj4obV9wX25kKS0+cHJlZl9iX2l0KCk7CisgICAgICB9CisKKyAgICAgIGFfY29uc3RfaXRlcmF0b3IKKyAgICAgIHByZWZfZW5kKCkgY29uc3QKKyAgICAgIHsKKwlpZiAobV9wX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorCSAgeworCSAgICBsZWFmX2NvbnN0X3BvaW50ZXIgbGNwID0gc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihtX3BfbmQpOworCSAgICByZXR1cm4gbV9wX3RyYWl0cy0+ZW5kKG1fcF90cmFpdHMtPmV4dHJhY3Rfa2V5KGxjcC0+dmFsdWUoKSkpOworCSAgfQorCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbmQtPm1fdHlwZSA9PSBpX25vZGUpOworCXJldHVybiBzdGF0aWNfY2FzdDxpbm9kZV9jb25zdF9wb2ludGVyPihtX3BfbmQpLT5wcmVmX2VfaXQoKTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl90YWcgCQkJaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfZGlmZmVyZW5jZV90eXBlIAkJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKworICAgICAgdHlwZWRlZiBfQ0l0ZXJhdG9yIAkJICAgICAgIAkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSAJCQkJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlIAkJCQljb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIC8vLyBNZXRhZGF0YSB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlOjptZXRhZGF0YV90eXBlIAkJbWV0YWRhdGFfdHlwZTsKKworICAgICAgLy8vIENvbnN0IG1ldGFkYXRhIHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxtZXRhZGF0YV90eXBlPiBfX3JlYmluZF9tOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tOjpvdGhlciAJCV9fcmViaW5kX21hOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6Y29uc3RfcmVmZXJlbmNlICAgIG1ldGFkYXRhX2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgaW5saW5lCisgICAgICBfTm9kZV9jaXRlcihub2RlX3BvaW50ZXIgcF9uZCA9IDAsIGFfY29uc3RfcG9pbnRlciBwX3RyYWl0cyA9IDApCisgICAgICA6IG1fcF9uZChjb25zdF9jYXN0PG5vZGVfcG9pbnRlcj4ocF9uZCkpLCBtX3BfdHJhaXRzKHBfdHJhaXRzKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBTdWJ0cmVlIHZhbGlkIHByZWZpeC4KKyAgICAgIHN0ZDo6cGFpcjxhX2NvbnN0X2l0ZXJhdG9yLCBhX2NvbnN0X2l0ZXJhdG9yPgorICAgICAgdmFsaWRfcHJlZml4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHByZWZfYmVnaW4oKSwgcHJlZl9lbmQoKSk7IH0KKworICAgICAgLy8vIENvbnN0IGFjY2VzczsgcmV0dXJucyB0aGUgX19jb25zdCBpdGVyYXRvciogYXNzb2NpYXRlZCB3aXRoCisgICAgICAvLy8gdGhlIGN1cnJlbnQgbGVhZi4KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobnVtX2NoaWxkcmVuKCkgPT0gMCk7CisJcmV0dXJuIF9DSXRlcmF0b3IobV9wX25kKTsKKyAgICAgIH0KKworICAgICAgLy8vIE1ldGFkYXRhIGFjY2Vzcy4KKyAgICAgIG1ldGFkYXRhX2NvbnN0X3JlZmVyZW5jZQorICAgICAgZ2V0X21ldGFkYXRhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZC0+Z2V0X21ldGFkYXRhKCk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGUgY29ycmVzcG9uZGluZyBub2RlLgorICAgICAgc2l6ZV90eXBlCisgICAgICBudW1fY2hpbGRyZW4oKSBjb25zdAorICAgICAgeworCWlmIChtX3BfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisJICByZXR1cm4gMDsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX25kLT5tX3R5cGUgPT0gaV9ub2RlKTsKKwlpbm9kZV9wb2ludGVyIGlucCA9IHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KG1fcF9uZCk7CisJcmV0dXJuIHN0ZDo6ZGlzdGFuY2UoaW5wLT5iZWdpbigpLCBpbnAtPmVuZCgpKTsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHVybnMgYSBfX2NvbnN0IG5vZGUgX19pdGVyYXRvciB0byB0aGUgY29ycmVzcG9uZGluZyBub2RlJ3MKKyAgICAgIC8vLyBpLXRoIGNoaWxkLgorICAgICAgX05vZGVfY2l0ZXIKKyAgICAgIGdldF9jaGlsZChzaXplX3R5cGUgaSkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX25kLT5tX3R5cGUgPT0gaV9ub2RlKTsKKwlpbm9kZV9wb2ludGVyIGlucCA9IHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KG1fcF9uZCk7CisJdHlwZW5hbWUgSW5vZGU6Oml0ZXJhdG9yIGl0ID0gaW5wLT5iZWdpbigpOworCXN0ZDo6YWR2YW5jZShpdCwgaSk7CisJcmV0dXJuIF9Ob2RlX2NpdGVyKCppdCwgbV9wX3RyYWl0cyk7CisgICAgICB9CisKKyAgICAgIC8vLyBDb21wYXJlcyBjb250ZW50IHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX05vZGVfY2l0ZXImIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX25kID09IG90aGVyLm1fcF9uZDsgfQorCisgICAgICAvLy8gQ29tcGFyZXMgY29udGVudCAobmVnYXRpdmVseSkgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBfTm9kZV9jaXRlciYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfbmQgIT0gb3RoZXIubV9wX25kOyB9CisKKyAgICAgIG5vZGVfcG9pbnRlciAJCQltX3BfbmQ7CisgICAgICBhX2NvbnN0X3BvaW50ZXIgCQkJbV9wX3RyYWl0czsKKyAgICB9OworCisKKyAgICAvLy8gTm9kZSBpdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlLAorCSAgICAgdHlwZW5hbWUgTGVhZiwKKwkgICAgIHR5cGVuYW1lIEhlYWQsCisJICAgICB0eXBlbmFtZSBJbm9kZSwKKwkgICAgIHR5cGVuYW1lIF9DSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBfTm9kZV9pdGVyCisgICAgOiBwdWJsaWMgX05vZGVfY2l0ZXI8Tm9kZSwgTGVhZiwgSGVhZCwgSW5vZGUsIF9DSXRlcmF0b3IsIEl0ZXJhdG9yLCBfQWxsb2M+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9Ob2RlX2NpdGVyPE5vZGUsIExlYWYsIEhlYWQsIElub2RlLAorCQkJICBfQ0l0ZXJhdG9yLCBJdGVyYXRvciwgX0FsbG9jPgliYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPE5vZGU+CV9fcmViaW5kX247CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX246Om90aGVyOjpwb2ludGVyCW5vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjppbm9kZV9wb2ludGVyIAlpbm9kZV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmFfY29uc3RfcG9pbnRlciAJYV9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBJdGVyYXRvciAJCQkJCWl0ZXJhdG9yOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKworICAgICAgdHlwZWRlZiBJdGVyYXRvciAJCQkJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUgCQkJCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSAJCQkJY29uc3RfcmVmZXJlbmNlOworCisgICAgICBfTm9kZV9pdGVyKG5vZGVfcG9pbnRlciBwX25kID0gMCwgYV9jb25zdF9wb2ludGVyIHBfdHJhaXRzID0gMCkKKyAgICAgIDogYmFzZV90eXBlKHBfbmQsIHBfdHJhaXRzKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBBY2Nlc3M7IHJldHVybnMgdGhlIGl0ZXJhdG9yKiAgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGxlYWYuCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bnVtX2NoaWxkcmVuKCkgPT0gMCk7CisJcmV0dXJuIGl0ZXJhdG9yKGJhc2VfdHlwZTo6bV9wX25kKTsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHVybnMgYSBub2RlIF9faXRlcmF0b3IgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSdzIGktdGggY2hpbGQuCisgICAgICBfTm9kZV9pdGVyCisgICAgICBnZXRfY2hpbGQoc2l6ZV90eXBlIGkpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV9wX25kLT5tX3R5cGUgPT0gaV9ub2RlKTsKKworCXR5cGVuYW1lIElub2RlOjppdGVyYXRvciBpdCA9CisJICBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihiYXNlX3R5cGU6Om1fcF9uZCktPmJlZ2luKCk7CisKKwlzdGQ6OmFkdmFuY2UoaXQsIGkpOworCXJldHVybiBfTm9kZV9pdGVyKCppdCwgYmFzZV90eXBlOjptX3BfdHJhaXRzKTsKKyAgICAgIH0KKyAgICB9OworICAgIH07CisKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FUcmFpdHMsIHR5cGVuYW1lIE1ldGFkYXRhPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBwYXRfdHJpZV9iYXNlOjpfSW5vZGU8X0FUcmFpdHMsIE1ldGFkYXRhPgorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6X19yZWJpbmRfbAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjpzX2xlYWZfYWxsb2M7CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpfX3JlYmluZF9pbgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjpzX2lub2RlX2FsbG9jOworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBnZXRfcHJlZl9wb3MoYV9jb25zdF9pdGVyYXRvciBiX2l0LCBhX2NvbnN0X2l0ZXJhdG9yIGVfaXQsCisJCSBhX2NvbnN0X3BvaW50ZXIgcF90cmFpdHMpIGNvbnN0CisgICAgeworICAgICAgaWYgKHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihzdGQ6OmRpc3RhbmNlKGJfaXQsIGVfaXQpKSA8PSBtX2VfaW5kKQorCXJldHVybiAwOworICAgICAgc3RkOjphZHZhbmNlKGJfaXQsIG1fZV9pbmQpOworICAgICAgcmV0dXJuIDEgKyBwX3RyYWl0cy0+ZV9wb3MoKmJfaXQpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIF9Jbm9kZShzaXplX3R5cGUgbGVuLCBjb25zdCBhX2NvbnN0X2l0ZXJhdG9yIGl0KQorICAgIDogYmFzZV90eXBlKGlfbm9kZSksIG1fZV9pbmQobGVuKSwgbV9wcmVmX2JfaXQoaXQpLCBtX3ByZWZfZV9pdChpdCkKKyAgICB7CisgICAgICBzdGQ6OmFkdmFuY2UobV9wcmVmX2VfaXQsIG1fZV9pbmQpOworICAgICAgc3RkOjpmaWxsKG1fYV9wX2NoaWxkcmVuLCBtX2FfcF9jaGlsZHJlbiArIGFycl9zaXplLAorCQlzdGF0aWNfY2FzdDxub2RlX3BvaW50ZXI+KDApKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgdXBkYXRlX3ByZWZpeGVzKGFfY29uc3RfcG9pbnRlciBwX3RyYWl0cykKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9maXJzdCA9ICpiZWdpbigpOworICAgICAgaWYgKHBfZmlyc3QtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisJeworCSAgbGVhZl9jb25zdF9wb2ludGVyIHAgPSBzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KHBfZmlyc3QpOworCSAgbV9wcmVmX2JfaXQgPSBwX3RyYWl0cy0+YmVnaW4oYWNjZXNzX3RyYWl0czo6ZXh0cmFjdF9rZXkocC0+dmFsdWUoKSkpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbm9kZV9wb2ludGVyIHAgPSBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX2ZpcnN0KTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2ZpcnN0LT5tX3R5cGUgPT0gaV9ub2RlKTsKKwkgIG1fcHJlZl9iX2l0ID0gcC0+cHJlZl9iX2l0KCk7CisJfQorICAgICAgbV9wcmVmX2VfaXQgPSBtX3ByZWZfYl9pdDsKKyAgICAgIHN0ZDo6YWR2YW5jZShtX3ByZWZfZV9pdCwgbV9lX2luZCk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgYmVnaW4oKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgbm9kZV9wb2ludGVyX3BvaW50ZXIgcG9pbnRlcl90eXBlOworICAgICAgcG9pbnRlcl90eXBlIHAgPSBjb25zdF9jYXN0PHBvaW50ZXJfdHlwZT4obV9hX3BfY2hpbGRyZW4pOworICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHAgKyBnZXRfYmVnaW5fcG9zKCksIHAgKyBhcnJfc2l6ZSk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgYmVnaW4oKQorICAgIHsKKyAgICAgIHJldHVybiBpdGVyYXRvcihtX2FfcF9jaGlsZHJlbiArIGdldF9iZWdpbl9wb3MoKSwKKwkJICAgICAgbV9hX3BfY2hpbGRyZW4gKyBhcnJfc2l6ZSk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZW5kKCkgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIG5vZGVfcG9pbnRlcl9wb2ludGVyIHBvaW50ZXJfdHlwZTsKKyAgICAgIHBvaW50ZXJfdHlwZSBwID0gY29uc3RfY2FzdDxwb2ludGVyX3R5cGU+KG1fYV9wX2NoaWxkcmVuKSArIGFycl9zaXplOworICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHAsIHApOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGVuZCgpCisgICAgeyByZXR1cm4gaXRlcmF0b3IobV9hX3BfY2hpbGRyZW4gKyBhcnJfc2l6ZSwgbV9hX3BfY2hpbGRyZW4gKyBhcnJfc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZ2V0X2NoaWxkX25vZGUoYV9jb25zdF9pdGVyYXRvciBiX2l0LCBhX2NvbnN0X2l0ZXJhdG9yIGVfaXQsCisJCSAgIGFfY29uc3RfcG9pbnRlciBwX3RyYWl0cykKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgaSA9IGdldF9wcmVmX3BvcyhiX2l0LCBlX2l0LCBwX3RyYWl0cyk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaSA8IGFycl9zaXplKTsKKyAgICAgIHJldHVybiBtX2FfcF9jaGlsZHJlbltpXTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZ2V0X2NoaWxkX2l0KGFfY29uc3RfaXRlcmF0b3IgYl9pdCwgYV9jb25zdF9pdGVyYXRvciBlX2l0LAorCQkgYV9jb25zdF9wb2ludGVyIHBfdHJhaXRzKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBpID0gZ2V0X3ByZWZfcG9zKGJfaXQsIGVfaXQsIHBfdHJhaXRzKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpIDwgYXJyX3NpemUpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fYV9wX2NoaWxkcmVuW2ldICE9IDApOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKG1fYV9wX2NoaWxkcmVuICsgaSwgbV9hX3BfY2hpbGRyZW4gKyBpKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9jb25zdF9wb2ludGVyCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGdldF9jaGlsZF9ub2RlKGFfY29uc3RfaXRlcmF0b3IgYl9pdCwgYV9jb25zdF9pdGVyYXRvciBlX2l0LAorCQkgICBhX2NvbnN0X3BvaW50ZXIgcF90cmFpdHMpIGNvbnN0CisgICAgeyByZXR1cm4gY29uc3RfY2FzdDxub2RlX3BvaW50ZXI+KGdldF9jaGlsZF9ub2RlKGJfaXQsIGVfaXQsIHBfdHJhaXRzKSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBnZXRfbG93ZXJfYm91bmRfY2hpbGRfbm9kZShhX2NvbnN0X2l0ZXJhdG9yIGJfaXQsIGFfY29uc3RfaXRlcmF0b3IgZV9pdCwKKwkJCSAgICAgICBzaXplX3R5cGUgY2hlY2tlZF9pbmQsCisJCQkgICAgICAgYV9jb25zdF9wb2ludGVyIHBfdHJhaXRzKQorICAgIHsKKyAgICAgIGlmICghc2hvdWxkX2JlX21pbmUoYl9pdCwgZV9pdCwgY2hlY2tlZF9pbmQsIHBfdHJhaXRzKSkKKwl7CisJICBpZiAocF90cmFpdHMtPmNtcF9wcmVmaXhlcyhiX2l0LCBlX2l0LCBtX3ByZWZfYl9pdCwKKwkJCQkgICAgIG1fcHJlZl9lX2l0LCB0cnVlKSkKKwkgICAgcmV0dXJuIGxlZnRtb3N0X2Rlc2NlbmRhbnQoKTsKKwkgIHJldHVybiByaWdodG1vc3RfZGVzY2VuZGFudCgpOworCX0KKworICAgICAgc2l6ZV90eXBlIGkgPSBnZXRfcHJlZl9wb3MoYl9pdCwgZV9pdCwgcF90cmFpdHMpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGkgPCBhcnJfc2l6ZSk7CisKKyAgICAgIGlmIChtX2FfcF9jaGlsZHJlbltpXSAhPSAwKQorCXJldHVybiBtX2FfcF9jaGlsZHJlbltpXTsKKworICAgICAgd2hpbGUgKCsraSA8IGFycl9zaXplKQorCWlmIChtX2FfcF9jaGlsZHJlbltpXSAhPSAwKQorCSAgeworCSAgICBjb25zdCBub2RlX3R5cGUmIF9fbnQgPSBtX2FfcF9jaGlsZHJlbltpXS0+bV90eXBlOworCSAgICBub2RlX3BvaW50ZXIgcmV0ID0gbV9hX3BfY2hpbGRyZW5baV07CisKKwkgICAgaWYgKF9fbnQgPT0gbGVhZl9ub2RlKQorCSAgICAgIHJldHVybiByZXQ7CisKKwkgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9fbnQgPT0gaV9ub2RlKTsKKwkgICAgaW5vZGVfcG9pbnRlciBpbnAgPSBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihyZXQpOworCSAgICByZXR1cm4gaW5wLT5sZWZ0bW9zdF9kZXNjZW5kYW50KCk7CisJICB9CisKKyAgICAgIHJldHVybiByaWdodG1vc3RfZGVzY2VuZGFudCgpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgYWRkX2NoaWxkKG5vZGVfcG9pbnRlciBwX25kLCBhX2NvbnN0X2l0ZXJhdG9yIGJfaXQsIGFfY29uc3RfaXRlcmF0b3IgZV9pdCwKKwkgICAgICBhX2NvbnN0X3BvaW50ZXIgcF90cmFpdHMpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIGkgPSBnZXRfcHJlZl9wb3MoYl9pdCwgZV9pdCwgcF90cmFpdHMpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGkgPCBhcnJfc2l6ZSk7CisgICAgICBpZiAobV9hX3BfY2hpbGRyZW5baV0gPT0gMCkKKwl7CisJICBtX2FfcF9jaGlsZHJlbltpXSA9IHBfbmQ7CisJICBwX25kLT5tX3BfcGFyZW50ID0gdGhpczsKKwkgIHJldHVybiBwX25kOworCX0KKyAgICAgIHJldHVybiBtX2FfcF9jaGlsZHJlbltpXTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2NvbnN0X3BvaW50ZXIKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZ2V0X2pvaW5fY2hpbGQobm9kZV9jb25zdF9wb2ludGVyIHBfbmQsCisJCSAgIGFfY29uc3RfcG9pbnRlciBwX3RyKSBjb25zdAorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwID0gY29uc3RfY2FzdDxub2RlX3BvaW50ZXI+KHBfbmQpOworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8aW5vZGVfcG9pbnRlcj4odGhpcyktPmdldF9qb2luX2NoaWxkKHAsIHBfdHIpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBnZXRfam9pbl9jaGlsZChub2RlX3BvaW50ZXIgcF9uZCwgYV9jb25zdF9wb2ludGVyIHBfdHJhaXRzKQorICAgIHsKKyAgICAgIHNpemVfdHlwZSBpOworICAgICAgYV9jb25zdF9pdGVyYXRvciBiX2l0OworICAgICAgYV9jb25zdF9pdGVyYXRvciBlX2l0OworICAgICAgaWYgKHBfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisJeworCSAgbGVhZl9jb25zdF9wb2ludGVyIHAgPSBzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KHBfbmQpOworCisJICB0eXBlZGVmIHR5cGVuYW1lIHR5cGVfdHJhaXRzOjprZXlfY29uc3RfcmVmZXJlbmNlIGtjcjsKKwkgIGtjciByX2tleSA9IGFjY2Vzc190cmFpdHM6OmV4dHJhY3Rfa2V5KHAtPnZhbHVlKCkpOworCSAgYl9pdCA9IHBfdHJhaXRzLT5iZWdpbihyX2tleSk7CisJICBlX2l0ID0gcF90cmFpdHMtPmVuZChyX2tleSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJfaXQgPSBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX25kKS0+cHJlZl9iX2l0KCk7CisJICBlX2l0ID0gc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9uZCktPnByZWZfZV9pdCgpOworCX0KKyAgICAgIGkgPSBnZXRfcHJlZl9wb3MoYl9pdCwgZV9pdCwgcF90cmFpdHMpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGkgPCBhcnJfc2l6ZSk7CisgICAgICByZXR1cm4gbV9hX3BfY2hpbGRyZW5baV07CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJlbW92ZV9jaGlsZChub2RlX3BvaW50ZXIgcF9uZCkKKyAgICB7CisgICAgICBzaXplX3R5cGUgaSA9IDA7CisgICAgICBmb3IgKDsgaSA8IGFycl9zaXplOyArK2kpCisJaWYgKG1fYV9wX2NoaWxkcmVuW2ldID09IHBfbmQpCisJICB7CisJICAgIG1fYV9wX2NoaWxkcmVuW2ldID0gMDsKKwkgICAgcmV0dXJuOworCSAgfQorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGkgIT0gYXJyX3NpemUpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByZW1vdmVfY2hpbGQoaXRlcmF0b3IgaXQpCisgICAgeyAqaXQubV9wX3BfY3VyID0gMDsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJlcGxhY2VfY2hpbGQobm9kZV9wb2ludGVyIHBfbmQsIGFfY29uc3RfaXRlcmF0b3IgYl9pdCwKKwkJICBhX2NvbnN0X2l0ZXJhdG9yIGVfaXQsCisJCSAgYV9jb25zdF9wb2ludGVyIHBfdHJhaXRzKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBpID0gZ2V0X3ByZWZfcG9zKGJfaXQsIGVfaXQsIHBfdHJhaXRzKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpIDwgYXJyX3NpemUpOworICAgICAgbV9hX3BfY2hpbGRyZW5baV0gPSBwX25kOworICAgICAgcF9uZC0+bV9wX3BhcmVudCA9IHRoaXM7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmFfY29uc3RfaXRlcmF0b3IKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcHJlZl9iX2l0KCkgY29uc3QKKyAgICB7IHJldHVybiBtX3ByZWZfYl9pdDsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmFfY29uc3RfaXRlcmF0b3IKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcHJlZl9lX2l0KCkgY29uc3QKKyAgICB7IHJldHVybiBtX3ByZWZfZV9pdDsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBib29sCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHNob3VsZF9iZV9taW5lKGFfY29uc3RfaXRlcmF0b3IgYl9pdCwgYV9jb25zdF9pdGVyYXRvciBlX2l0LAorCQkgICBzaXplX3R5cGUgY2hlY2tlZF9pbmQsCisJCSAgIGFfY29uc3RfcG9pbnRlciBwX3RyYWl0cykgY29uc3QKKyAgICB7CisgICAgICBpZiAobV9lX2luZCA9PSAwKQorCXJldHVybiB0cnVlOworCisgICAgICBjb25zdCBzaXplX3R5cGUgbnVtX2VzID0gc3RkOjpkaXN0YW5jZShiX2l0LCBlX2l0KTsKKyAgICAgIGlmIChudW1fZXMgPCBtX2VfaW5kKQorCXJldHVybiBmYWxzZTsKKworICAgICAgYV9jb25zdF9pdGVyYXRvciBrZXlfYl9pdCA9IGJfaXQ7CisgICAgICBzdGQ6OmFkdmFuY2Uoa2V5X2JfaXQsIGNoZWNrZWRfaW5kKTsKKyAgICAgIGFfY29uc3RfaXRlcmF0b3Iga2V5X2VfaXQgPSBiX2l0OworICAgICAgc3RkOjphZHZhbmNlKGtleV9lX2l0LCBtX2VfaW5kKTsKKworICAgICAgYV9jb25zdF9pdGVyYXRvciB2YWx1ZV9iX2l0ID0gbV9wcmVmX2JfaXQ7CisgICAgICBzdGQ6OmFkdmFuY2UodmFsdWVfYl9pdCwgY2hlY2tlZF9pbmQpOworICAgICAgYV9jb25zdF9pdGVyYXRvciB2YWx1ZV9lX2l0ID0gbV9wcmVmX2JfaXQ7CisgICAgICBzdGQ6OmFkdmFuY2UodmFsdWVfZV9pdCwgbV9lX2luZCk7CisKKyAgICAgIHJldHVybiBwX3RyYWl0cy0+ZXF1YWxfcHJlZml4ZXMoa2V5X2JfaXQsIGtleV9lX2l0LCB2YWx1ZV9iX2l0LAorCQkJCSAgICAgIHZhbHVlX2VfaXQpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmxlYWZfcG9pbnRlcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBsZWZ0bW9zdF9kZXNjZW5kYW50KCkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9wb3QgPSAqYmVnaW4oKTsKKyAgICAgIGlmIChwX3BvdC0+bV90eXBlID09IGxlYWZfbm9kZSkKKwlyZXR1cm4gKHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9wb3QpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BvdC0+bV90eXBlID09IGlfbm9kZSk7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9wb3QpLT5sZWZ0bW9zdF9kZXNjZW5kYW50KCk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bGVhZl9jb25zdF9wb2ludGVyCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGxlZnRtb3N0X2Rlc2NlbmRhbnQoKSBjb25zdAorICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8aW5vZGVfcG9pbnRlcj4odGhpcyktPmxlZnRtb3N0X2Rlc2NlbmRhbnQoKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bGVhZl9wb2ludGVyCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJpZ2h0bW9zdF9kZXNjZW5kYW50KCkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgbnVtX2NoaWxkcmVuID0gc3RkOjpkaXN0YW5jZShiZWdpbigpLCBlbmQoKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobnVtX2NoaWxkcmVuID49IDIpOworCisgICAgICBpdGVyYXRvciBpdCA9IGJlZ2luKCk7CisgICAgICBzdGQ6OmFkdmFuY2UoaXQsIG51bV9jaGlsZHJlbiAtIDEpOworICAgICAgbm9kZV9wb2ludGVyIHBfcG90ID0qIGl0OworICAgICAgaWYgKHBfcG90LT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorCXJldHVybiBzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfcG90KTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BvdC0+bV90eXBlID09IGlfbm9kZSk7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9wb3QpLT5yaWdodG1vc3RfZGVzY2VuZGFudCgpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmxlYWZfY29uc3RfcG9pbnRlcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByaWdodG1vc3RfZGVzY2VuZGFudCgpIGNvbnN0CisgICAgeyByZXR1cm4gY29uc3RfY2FzdDxpbm9kZV9wb2ludGVyPih0aGlzKS0+cmlnaHRtb3N0X2Rlc2NlbmRhbnQoKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGdldF9iZWdpbl9wb3MoKSBjb25zdAorICAgIHsKKyAgICAgIHNpemVfdHlwZSBpID0gMDsKKyAgICAgIGZvciAoOyBpIDwgYXJyX3NpemUgJiYgbV9hX3BfY2hpbGRyZW5baV0gPT0gMDsgKytpKQorCTsKKyAgICAgIHJldHVybiBpOworICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9kZWJ1Z19pbmZvCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGFzc2VydF92YWxpZF9pbXAoYV9jb25zdF9wb2ludGVyIHBfdHJhaXRzLAorCQkgICAgIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKKyAgICB7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkoYmFzZV90eXBlOjptX3R5cGUgPT0gaV9ub2RlKTsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShzdGF0aWNfY2FzdDxzaXplX3R5cGU+KHN0ZDo6ZGlzdGFuY2UocHJlZl9iX2l0KCksIHByZWZfZV9pdCgpKSkgPT0gbV9lX2luZCk7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkoc3RkOjpkaXN0YW5jZShiZWdpbigpLCBlbmQoKSkgPj0gMik7CisKKyAgICAgIGZvciAodHlwZW5hbWUgX0lub2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7IGl0ICE9IGVuZCgpOyArK2l0KQorCXsKKwkgIG5vZGVfY29uc3RfcG9pbnRlciBwX25kID0gKml0OworCSAgUEJfRFNfREVCVUdfVkVSSUZZKHBfbmQtPm1fcF9wYXJlbnQgPT0gdGhpcyk7CisJICBub2RlX2RlYnVnX2luZm8gY2hpbGRfcmV0ID0gcF9uZC0+YXNzZXJ0X3ZhbGlkX2ltcChwX3RyYWl0cywKKwkJCQkJCQkgICAgIF9fZmlsZSwgX19saW5lKTsKKworCSAgUEJfRFNfREVCVUdfVkVSSUZZKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oc3RkOjpkaXN0YW5jZShjaGlsZF9yZXQuZmlyc3QsIGNoaWxkX3JldC5zZWNvbmQpKSA+PSBtX2VfaW5kKTsKKwkgIFBCX0RTX0RFQlVHX1ZFUklGWShzaG91bGRfYmVfbWluZShjaGlsZF9yZXQuZmlyc3QsIGNoaWxkX3JldC5zZWNvbmQsIDAsIHBfdHJhaXRzKSk7CisJICBQQl9EU19ERUJVR19WRVJJRlkoZ2V0X3ByZWZfcG9zKGNoaWxkX3JldC5maXJzdCwgY2hpbGRfcmV0LnNlY29uZCwgcF90cmFpdHMpID09IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oaXQubV9wX3BfY3VyIC0gbV9hX3BfY2hpbGRyZW4pKTsKKwl9CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocHJlZl9iX2l0KCksIHByZWZfZV9pdCgpKTsKKyAgICB9CisjZW5kaWYKKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OTc2MWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw2MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYXRfdHJpZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHBhdF90cmllLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6YWNjZXNzX3RyYWl0cyYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfYWNjZXNzX3RyYWl0cygpCit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmFjY2Vzc190cmFpdHMmIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2FjY2Vzc190cmFpdHMoKSBjb25zdAoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3VwZGF0ZSYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbm9kZV91cGRhdGUoKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3VwZGF0ZSYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbm9kZV91cGRhdGUoKSBjb25zdAoreyByZXR1cm4gKnRoaXM7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcl9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcl9lcmFzZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDA2NjdiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9yX2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTAzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhdF90cmllXy9yX2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgcGF0X3RyaWUuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CithY3R1YWxfZXJhc2Vfbm9kZShub2RlX3BvaW50ZXIgcF96KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID4gMCk7CisgIC0tbV9zaXplOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmVyYXNlX2V4aXN0aW5nKFBCX0RTX1YyRihwX3otPm1fdmFsdWUpKSk7CisgIHBfei0+fm5vZGUoKTsKKyAgc19ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfeiwgMSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBkYXRlX21pbl9tYXhfZm9yX2VyYXNlZF9ub2RlKG5vZGVfcG9pbnRlciBwX3opCit7CisgIGlmIChtX3NpemUgPT0gMSkKKyAgICB7CisgICAgICBtX3BfaGVhZC0+bV9wX2xlZnQgPSBtX3BfaGVhZC0+bV9wX3JpZ2h0ID0gbV9wX2hlYWQ7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChtX3BfaGVhZC0+bV9wX2xlZnQgPT0gcF96KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIGl0KHBfeik7CisgICAgICArK2l0OworICAgICAgbV9wX2hlYWQtPm1fcF9sZWZ0ID0gaXQubV9wX25kOworICAgIH0KKyAgZWxzZSBpZiAobV9wX2hlYWQtPm1fcF9yaWdodCA9PSBwX3opCisgICAgeworICAgICAgaXRlcmF0b3IgaXQocF96KTsKKyAgICAgIC0taXQ7CisgICAgICBtX3BfaGVhZC0+bV9wX3JpZ2h0ID0gaXQubV9wX25kOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyKCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQodHJ1ZSwgdHJ1ZSk7KQorICBjbGVhcl9pbXAobV9wX2hlYWQtPm1fcF9wYXJlbnQpOworICBtX3NpemUgPSAwOworICBpbml0aWFsaXplKCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2xlYXIoKTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKHRydWUsIHRydWUpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyX2ltcChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm47CisgIGNsZWFyX2ltcChwX25kLT5tX3BfbGVmdCk7CisgIGNsZWFyX2ltcChwX25kLT5tX3BfcmlnaHQpOworICBwX25kLT5+Tm9kZSgpOworICBzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9uZCwgMSk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcm90YXRlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9yb3RhdGVfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmYzI3NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcm90YXRlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTUwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhdF90cmllXy9yb3RhdGVfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcHMgZm9yIHJvdGF0aW5nIG5vZGVzLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorcm90YXRlX2xlZnQobm9kZV9wb2ludGVyIHBfeCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfeSA9IHBfeC0+bV9wX3JpZ2h0OworICBwX3gtPm1fcF9yaWdodCA9IHBfeS0+bV9wX2xlZnQ7CisKKyAgaWYgKHBfeS0+bV9wX2xlZnQgIT0gMCkKKyAgICBwX3ktPm1fcF9sZWZ0LT5tX3BfcGFyZW50ID0gcF94OworCisgIHBfeS0+bV9wX3BhcmVudCA9IHBfeC0+bV9wX3BhcmVudDsKKyAgaWYgKHBfeCA9PSBtX3BfaGVhZC0+bV9wX3BhcmVudCkKKyAgICBtX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfeTsKKyAgZWxzZSBpZiAocF94ID09IHBfeC0+bV9wX3BhcmVudC0+bV9wX2xlZnQpCisgICAgcF94LT5tX3BfcGFyZW50LT5tX3BfbGVmdCA9IHBfeTsKKyAgZWxzZQorICAgIHBfeC0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0ID0gcF95OworCisgIHBfeS0+bV9wX2xlZnQgPSBwX3g7CisgIHBfeC0+bV9wX3BhcmVudCA9IHBfeTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF94KTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX3kpOykKKworICBhcHBseV91cGRhdGUocF94LCAoTm9kZV9VcGRhdGUqKXRoaXMpOworICBhcHBseV91cGRhdGUocF94LT5tX3BfcGFyZW50LCAoTm9kZV9VcGRhdGUqKXRoaXMpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JvdGF0ZV9yaWdodChub2RlX3BvaW50ZXIgcF94KQoreworICBub2RlX3BvaW50ZXIgcF95ID0gcF94LT5tX3BfbGVmdDsKKyAgcF94LT5tX3BfbGVmdCA9IHBfeS0+bV9wX3JpZ2h0OworCisgIGlmIChwX3ktPm1fcF9yaWdodCAhPSAwKQorICAgIHBfeS0+bV9wX3JpZ2h0LT5tX3BfcGFyZW50ID0gcF94OworCisgIHBfeS0+bV9wX3BhcmVudCA9IHBfeC0+bV9wX3BhcmVudDsKKyAgaWYgKHBfeCA9PSBtX3BfaGVhZC0+bV9wX3BhcmVudCkKKyAgICBtX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfeTsKKyAgZWxzZSBpZiAocF94ID09IHBfeC0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0KQorICAgIHBfeC0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0ID0gcF95OworICBlbHNlCisgICAgcF94LT5tX3BfcGFyZW50LT5tX3BfbGVmdCA9IHBfeTsKKworICBwX3ktPm1fcF9yaWdodCA9IHBfeDsKKyAgcF94LT5tX3BfcGFyZW50ID0gcF95OworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX3gpOykKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfeSk7KQorCisgIGFwcGx5X3VwZGF0ZShwX3gsIChOb2RlX1VwZGF0ZSopdGhpcyk7CisgIGFwcGx5X3VwZGF0ZShwX3gtPm1fcF9wYXJlbnQsIChOb2RlX1VwZGF0ZSopdGhpcyk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorcm90YXRlX3BhcmVudChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfcGFyZW50ID0gcF9uZC0+bV9wX3BhcmVudDsKKyAgaWYgKHBfbmQgPT0gcF9wYXJlbnQtPm1fcF9sZWZ0KQorICAgIHJvdGF0ZV9yaWdodChwX3BhcmVudCk7CisgIGVsc2UKKyAgICByb3RhdGVfbGVmdChwX3BhcmVudCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudC0+bV9wX3BhcmVudCA9IHBfbmQpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX2xlZnQgPT0gcF9wYXJlbnQgfHwgcF9uZC0+bV9wX3JpZ2h0ID09IHBfcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CithcHBseV91cGRhdGUobm9kZV9wb2ludGVyIC8qcF9uZCovLCBfX2dudV9wYmRzOjpudWxsX25vZGVfdXBkYXRlKiAgLypwX3VwZGF0ZSovKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZV8+CitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXBwbHlfdXBkYXRlKG5vZGVfcG9pbnRlciBwX25kLCBOb2RlX1VwZGF0ZV8qIHBfdXBkYXRlKQoreworICBwX3VwZGF0ZS0+b3BlcmF0b3IoKSgmIFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSwocF9uZC0+bV9wX2xlZnQgPT0gMCkgPworCQkJMCA6CisJCQkmIFBCX0RTX1YyRihwX25kLT5tX3BfbGVmdC0+bV92YWx1ZSksKHBfbmQtPm1fcF9yaWdodCA9PSAwKSA/CisJCQkwIDoKKwkJCSYgUEJfRFNfVjJGKHBfbmQtPm1fcF9yaWdodC0+bV92YWx1ZSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGVfPgoraW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwZGF0ZV90b190b3Aobm9kZV9wb2ludGVyIHBfbmQsIE5vZGVfVXBkYXRlXyogcF91cGRhdGUpCit7CisgIHdoaWxlIChwX25kICE9IG1fcF9oZWFkKQorICAgIHsKKyAgICAgIGFwcGx5X3VwZGF0ZShwX25kLCBwX3VwZGF0ZSk7CisgICAgICBwX25kID0gcF9uZC0+bV9wX3BhcmVudDsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBkYXRlX3RvX3RvcChub2RlX3BvaW50ZXIgLypwX25kKi8sIF9fZ251X3BiZHM6Om51bGxfbm9kZV91cGRhdGUqICAvKnBfdXBkYXRlKi8pCit7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9zcGxpdF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vc3BsaXRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhOTc5ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vc3BsaXRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyNTAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcGF0X3RyaWVfL3NwbGl0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgcGF0X3RyaWUuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGl0KGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgYnJhbmNoX2JhZyBiYWc7CisgIGxlYWZfcG9pbnRlciBwX3NwbGl0X2xmID0gc3BsaXRfcHJlcChyX2tleSwgb3RoZXIsIGJhZyk7CisgIGlmIChwX3NwbGl0X2xmID09IDApCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhZy5lbXB0eSgpKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWJhZy5lbXB0eSgpKTsKKyAgb3RoZXIuY2xlYXIoKTsKKworICBtX3BfaGVhZC0+bV9wX3BhcmVudCA9IHJlY19zcGxpdChtX3BfaGVhZC0+bV9wX3BhcmVudCwgcHJlZl9iZWdpbihwX3NwbGl0X2xmKSwKKwkJCQkgICBwcmVmX2VuZChwX3NwbGl0X2xmKSwgb3RoZXIsIGJhZyk7CisKKyAgbV9wX2hlYWQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQgPSBtX3BfaGVhZDsKKworICBoZWFkX3BvaW50ZXIgX19vaGVhZCA9IG90aGVyLm1fcF9oZWFkOworICBfX29oZWFkLT5tX3BfbWF4ID0gbV9wX2hlYWQtPm1fcF9tYXg7CisgIG1fcF9oZWFkLT5tX3BfbWF4ID0gcmlnaHRtb3N0X2Rlc2NlbmRhbnQobV9wX2hlYWQtPm1fcF9wYXJlbnQpOworICBfX29oZWFkLT5tX3BfbWluID0gb3RoZXIubGVmdG1vc3RfZGVzY2VuZGFudChfX29oZWFkLT5tX3BfcGFyZW50KTsKKworICBvdGhlci5tX3NpemUgPSBzdGQ6OmRpc3RhbmNlKG90aGVyLlBCX0RTX0NMQVNTX0NfREVDOjpiZWdpbigpLAorCQkJICAgICAgIG90aGVyLlBCX0RTX0NMQVNTX0NfREVDOjplbmQoKSk7CisgIG1fc2l6ZSAtPSBvdGhlci5tX3NpemU7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bGVhZl9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdF9wcmVwKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlciwKKwkgICBicmFuY2hfYmFnJiByX2JhZykKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHJfYmFnLmVtcHR5KCkpOworICBpZiAobV9zaXplID09IDApCisgICAgeworICAgICAgb3RoZXIuY2xlYXIoKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChzeW50aF9hY2Nlc3NfdHJhaXRzOjpjbXBfa2V5cyhyX2tleSwKKwkJCQkgICAgUEJfRFNfVjJGKHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4obV9wX2hlYWQtPm1fcF9taW4pLT52YWx1ZSgpKSkpCisgICAgeworICAgICAgb3RoZXIuY2xlYXIoKTsKKyAgICAgIHZhbHVlX3N3YXAob3RoZXIpOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKCFzeW50aF9hY2Nlc3NfdHJhaXRzOjpjbXBfa2V5cyhyX2tleSwKKwkJCQkgICAgICAgUEJfRFNfVjJGKHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4obV9wX2hlYWQtPm1fcF9tYXgpLT52YWx1ZSgpKSkpCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaXRlcmF0b3IgaXQgPSBsb3dlcl9ib3VuZChyX2tleSk7CisKKyAgaWYgKCFzeW50aF9hY2Nlc3NfdHJhaXRzOjplcXVhbF9rZXlzKFBCX0RTX1YyRigqaXQpLCByX2tleSkpCisgICAgLS1pdDsKKworICBub2RlX3BvaW50ZXIgcF9uZCA9IGl0Lm1fcF9uZDsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpOworICBsZWFmX3BvaW50ZXIgcF9yZXRfbCA9IHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9uZCk7CisgIHdoaWxlIChwX25kLT5tX3R5cGUgIT0gaGVhZF9ub2RlKQorICAgIHsKKyAgICAgIHJfYmFnLmFkZF9icmFuY2goKTsKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcGFyZW50OworICAgIH0KKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpzcGxpdChyX2tleSwoc3ludGhfYWNjZXNzX3RyYWl0cyYpKCp0aGlzKSwgb3RoZXIpOykKKworICByZXR1cm4gcF9yZXRfbDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY19zcGxpdChub2RlX3BvaW50ZXIgcF9uZCwgYV9jb25zdF9pdGVyYXRvciBiX2l0LCBhX2NvbnN0X2l0ZXJhdG9yIGVfaXQsCisJICBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIsIGJyYW5jaF9iYWcmIHJfYmFnKQoreworICBpZiAocF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQob3RoZXIubV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gMCk7CisgICAgICByZXR1cm4gcF9uZDsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fdHlwZSA9PSBpX25vZGUpOworICBpbm9kZV9wb2ludGVyIHBfaW5kID0gc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9uZCk7CisKKyAgbm9kZV9wb2ludGVyIHBmaXJzdCA9IHBfaW5kLT5nZXRfY2hpbGRfbm9kZShiX2l0LCBlX2l0LCB0aGlzKTsKKyAgbm9kZV9wb2ludGVyIHBfY2hpbGRfcmV0ID0gcmVjX3NwbGl0KHBmaXJzdCwgYl9pdCwgZV9pdCwgb3RoZXIsIHJfYmFnKTsKKyAgUEJfRFNfQVNTRVJUX05PREVfVkFMSUQocF9jaGlsZF9yZXQpCisgIHBfaW5kLT5yZXBsYWNlX2NoaWxkKHBfY2hpbGRfcmV0LCBiX2l0LCBlX2l0LCB0aGlzKTsKKyAgYXBwbHlfdXBkYXRlKHBfaW5kLCAobm9kZV91cGRhdGUqKXRoaXMpOworCisgIGlub2RlX2l0ZXJhdG9yIGNoaWxkX2l0ID0gcF9pbmQtPmdldF9jaGlsZF9pdChiX2l0LCBlX2l0LCB0aGlzKTsKKyAgY29uc3Qgc2l6ZV90eXBlIGxoc19kaXN0ID0gc3RkOjpkaXN0YW5jZShwX2luZC0+YmVnaW4oKSwgY2hpbGRfaXQpOworICBjb25zdCBzaXplX3R5cGUgbGhzX251bV9jaGlsZHJlbiA9IGxoc19kaXN0ICsgMTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGxoc19udW1fY2hpbGRyZW4gPiAwKTsKKworICBjb25zdCBzaXplX3R5cGUgcmhzX2Rpc3QgPSAgc3RkOjpkaXN0YW5jZShwX2luZC0+YmVnaW4oKSwgcF9pbmQtPmVuZCgpKTsKKyAgc2l6ZV90eXBlIHJoc19udW1fY2hpbGRyZW4gPSByaHNfZGlzdCAtIGxoc19udW1fY2hpbGRyZW47CisgIGlmIChyaHNfbnVtX2NoaWxkcmVuID09IDApCisgICAgeworICAgICAgYXBwbHlfdXBkYXRlKHBfaW5kLCAobm9kZV91cGRhdGUqKXRoaXMpOworICAgICAgcmV0dXJuIHBfaW5kOworICAgIH0KKworICBvdGhlci5zcGxpdF9pbnNlcnRfYnJhbmNoKHBfaW5kLT5nZXRfZV9pbmQoKSwgYl9pdCwgY2hpbGRfaXQsCisJCQkgICAgcmhzX251bV9jaGlsZHJlbiwgcl9iYWcpOworCisgIGNoaWxkX2l0ID0gcF9pbmQtPmdldF9jaGlsZF9pdChiX2l0LCBlX2l0LCB0aGlzKTsKKyAgd2hpbGUgKHJoc19udW1fY2hpbGRyZW4gIT0gMCkKKyAgICB7CisgICAgICArK2NoaWxkX2l0OworICAgICAgcF9pbmQtPnJlbW92ZV9jaGlsZChjaGlsZF9pdCk7CisgICAgICAtLXJoc19udW1fY2hpbGRyZW47CisgICAgfQorICBhcHBseV91cGRhdGUocF9pbmQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisKKyAgY29uc3Qgc2l6ZV90eXBlIGludF9kaXN0ID0gc3RkOjpkaXN0YW5jZShwX2luZC0+YmVnaW4oKSwgcF9pbmQtPmVuZCgpKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGludF9kaXN0ID49IDEpOworICBpZiAoaW50X2Rpc3QgPiAxKQorICAgIHsKKyAgICAgIHBfaW5kLT51cGRhdGVfcHJlZml4ZXModGhpcyk7CisgICAgICBQQl9EU19BU1NFUlRfTk9ERV9WQUxJRChwX2luZCkKKyAgICAgIGFwcGx5X3VwZGF0ZShwX2luZCwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgICAgIHJldHVybiBwX2luZDsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfcmV0ID0gKnBfaW5kLT5iZWdpbigpOworICBwX2luZC0+fmlub2RlKCk7CisgIHNfaW5vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9pbmQsIDEpOworICBhcHBseV91cGRhdGUocF9yZXQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgIHJldHVybiBwX3JldDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGl0X2luc2VydF9icmFuY2goc2l6ZV90eXBlIGVfaW5kLCBhX2NvbnN0X2l0ZXJhdG9yIGJfaXQsCisJCSAgICBpbm9kZV9pdGVyYXRvciBjaGlsZF9iX2l0LAorCQkgICAgc2l6ZV90eXBlIG51bV9jaGlsZHJlbiwgYnJhbmNoX2JhZyYgcl9iYWcpCit7CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgaWYgKG1fcF9oZWFkLT5tX3BfcGFyZW50ICE9IDApCisgICAgUEJfRFNfQVNTRVJUX05PREVfVkFMSUQobV9wX2hlYWQtPm1fcF9wYXJlbnQpCisjZW5kaWYKKworICBjb25zdCBzaXplX3R5cGUgc3RhcnQgPSBtX3BfaGVhZC0+bV9wX3BhcmVudCA9PSAwID8gMCA6IDE7CisgIGNvbnN0IHNpemVfdHlwZSB0b3RhbF9udW1fY2hpbGRyZW4gPSBzdGFydCArIG51bV9jaGlsZHJlbjsKKyAgaWYgKHRvdGFsX251bV9jaGlsZHJlbiA9PSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfaGVhZC0+bV9wX3BhcmVudCA9PSAwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHRvdGFsX251bV9jaGlsZHJlbiA9PSAxKQorICAgIHsKKyAgICAgIGlmIChtX3BfaGVhZC0+bV9wX3BhcmVudCAhPSAwKQorCXsKKwkgIFBCX0RTX0FTU0VSVF9OT0RFX1ZBTElEKG1fcF9oZWFkLT5tX3BfcGFyZW50KQorCSAgcmV0dXJuOworCX0KKworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9oZWFkLT5tX3BfcGFyZW50ID09IDApOworICAgICAgKytjaGlsZF9iX2l0OworICAgICAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSAqY2hpbGRfYl9pdDsKKyAgICAgIG1fcF9oZWFkLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50ID0gbV9wX2hlYWQ7CisgICAgICBhcHBseV91cGRhdGUobV9wX2hlYWQtPm1fcF9wYXJlbnQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgICAgICBQQl9EU19BU1NFUlRfTk9ERV9WQUxJRChtX3BfaGVhZC0+bV9wX3BhcmVudCkKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHRvdGFsX251bV9jaGlsZHJlbiA+IDEpOworICBpbm9kZV9wb2ludGVyIHBfbmV3X3Jvb3QgPSByX2JhZy5nZXRfYnJhbmNoKCk7CisgIG5ldyAocF9uZXdfcm9vdCkgaW5vZGUoZV9pbmQsIGJfaXQpOworICBzaXplX3R5cGUgbnVtX2luc2VydGVkID0gMDsKKyAgd2hpbGUgKG51bV9pbnNlcnRlZCsrIDwgbnVtX2NoaWxkcmVuKQorICAgIHsKKyAgICAgICsrY2hpbGRfYl9pdDsKKyAgICAgIFBCX0RTX0FTU0VSVF9OT0RFX1ZBTElEKCgqY2hpbGRfYl9pdCkpCisgICAgICBwX25ld19yb290LT5hZGRfY2hpbGQoKmNoaWxkX2JfaXQsIHByZWZfYmVnaW4oKmNoaWxkX2JfaXQpLAorCQkJICAgIHByZWZfZW5kKCpjaGlsZF9iX2l0KSwgdGhpcyk7CisgICAgfQorCisgIGlmIChtX3BfaGVhZC0+bV9wX3BhcmVudCAhPSAwKQorICAgIHBfbmV3X3Jvb3QtPmFkZF9jaGlsZChtX3BfaGVhZC0+bV9wX3BhcmVudCwKKwkJCSAgcHJlZl9iZWdpbihtX3BfaGVhZC0+bV9wX3BhcmVudCksCisJCQkgIHByZWZfZW5kKG1fcF9oZWFkLT5tX3BfcGFyZW50KSwgdGhpcyk7CisKKyAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX25ld19yb290OworICBwX25ld19yb290LT5tX3BfcGFyZW50ID0gbV9wX2hlYWQ7CisgIGFwcGx5X3VwZGF0ZShtX3BfaGVhZC0+bV9wX3BhcmVudCwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgUEJfRFNfQVNTRVJUX05PREVfVkFMSUQobV9wX2hlYWQtPm1fcF9wYXJlbnQpCit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3N5bnRoX2FjY2Vzc190cmFpdHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9zeW50aF9hY2Nlc3NfdHJhaXRzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTM5YTY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9zeW50aF9hY2Nlc3NfdHJhaXRzLmhwcApAQCAtMCwwICsxLDIxOCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYXRfdHJpZV8vc3ludGhfYWNjZXNzX3RyYWl0cy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHBhdHJpY2lhIHRyZWUuCisgKi8KKworI2lmbmRlZiBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfSFBQCisjZGVmaW5lIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworCisjZGVmaW5lIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZV9UcmFpdHMsIGJvb2wgU2V0LCB0eXBlbmFtZSBfQVRyYWl0cz4KKworI2RlZmluZSBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfQ19ERUMgXAorICAgIHN5bnRoX2FjY2Vzc190cmFpdHM8VHlwZV9UcmFpdHMsIFNldCwgX0FUcmFpdHM+CisKKyAgICAvLy8gU3ludGhldGljIGVsZW1lbnQgYWNjZXNzIHRyYWl0cy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlX1RyYWl0cywgYm9vbCBTZXQsIHR5cGVuYW1lIF9BVHJhaXRzPgorICAgIHN0cnVjdCBzeW50aF9hY2Nlc3NfdHJhaXRzIDogcHVibGljIF9BVHJhaXRzCisgICAgeworICAgICAgdHlwZWRlZiBfQVRyYWl0cyAJCQkJCWJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvcgljb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgVHlwZV9UcmFpdHMgCQkJCXR5cGVfdHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0eXBlX3RyYWl0czo6Y29uc3RfcmVmZXJlbmNlIAljb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHR5cGVfdHJhaXRzOjprZXlfY29uc3RfcmVmZXJlbmNlIGtleV9jb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHN5bnRoX2FjY2Vzc190cmFpdHMoKTsKKworICAgICAgc3ludGhfYWNjZXNzX3RyYWl0cyhjb25zdCBiYXNlX3R5cGUmKTsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVxdWFsX3ByZWZpeGVzKGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3IsCisJCSAgICAgY29uc3RfaXRlcmF0b3IsIGJvb2wgY29tcGFyZV9hZnRlciA9IHRydWUpIGNvbnN0OworCisgICAgICBib29sCisgICAgICBlcXVhbF9rZXlzKGtleV9jb25zdF9yZWZlcmVuY2UsIGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICBib29sCisgICAgICBjbXBfcHJlZml4ZXMoY29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvciwKKwkJICAgY29uc3RfaXRlcmF0b3IsIGJvb2wgY29tcGFyZV9hZnRlciA9IGZhbHNlKSBjb25zdDsKKworICAgICAgYm9vbAorICAgICAgY21wX2tleXMoa2V5X2NvbnN0X3JlZmVyZW5jZSwga2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzdGF0aWMga2V5X2NvbnN0X3JlZmVyZW5jZQorICAgICAgZXh0cmFjdF9rZXkoY29uc3RfcmVmZXJlbmNlKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2UsIGtleV9jb25zdF9yZWZlcmVuY2UpOworI2VuZGlmCisKKyAgICBwcml2YXRlOgorICAgICAgaW5saW5lIHN0YXRpYyBrZXlfY29uc3RfcmVmZXJlbmNlCisgICAgICBleHRyYWN0X2tleShjb25zdF9yZWZlcmVuY2UsIHRydWVfdHlwZSk7CisKKyAgICAgIGlubGluZSBzdGF0aWMga2V5X2NvbnN0X3JlZmVyZW5jZQorICAgICAgZXh0cmFjdF9rZXkoY29uc3RfcmVmZXJlbmNlLCBmYWxzZV90eXBlKTsKKworICAgICAgc3RhdGljIGludGVncmFsX2NvbnN0YW50PGludCwgU2V0PiBzX3NldF9pbmQ7CisgICAgfTsKKworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQworICAgIGludGVncmFsX2NvbnN0YW50PGludCxTZXQ+CisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjpzX3NldF9pbmQ7CisKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfVF9ERUMKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfQ19ERUM6OgorICAgIHN5bnRoX2FjY2Vzc190cmFpdHMoKQorICAgIHsgfQorCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjoKKyAgICBzeW50aF9hY2Nlc3NfdHJhaXRzKGNvbnN0IF9BVHJhaXRzJiByX3RyYWl0cykgCisgICAgOiBfQVRyYWl0cyhyX3RyYWl0cykKKyAgICB7IH0KKworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQworICAgIGlubGluZSBib29sCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjoKKyAgICBlcXVhbF9wcmVmaXhlcyhjb25zdF9pdGVyYXRvciBiX2wsIGNvbnN0X2l0ZXJhdG9yIGVfbCwgY29uc3RfaXRlcmF0b3IgYl9yLAorCQkgICBjb25zdF9pdGVyYXRvciBlX3IsIGJvb2wgY29tcGFyZV9hZnRlciAvKj0gZmFsc2UgKi8pIGNvbnN0CisgICAgeworICAgICAgd2hpbGUgKGJfbCAhPSBlX2wpCisJeworCSAgaWYgKGJfciA9PSBlX3IpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGlmIChiYXNlX3R5cGU6OmVfcG9zKCpiX2wpICE9IGJhc2VfdHlwZTo6ZV9wb3MoKmJfcikpCisJICAgIHJldHVybiBmYWxzZTsKKwkgICsrYl9sOworCSAgKytiX3I7CisJfQorICAgICAgcmV0dXJuICghY29tcGFyZV9hZnRlciB8fCBiX3IgPT0gZV9yKTsKKyAgICB9CisKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfVF9ERUMKKyAgICBib29sCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjoKKyAgICBlcXVhbF9rZXlzKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9saHNfa2V5LAorCSAgICAgICBrZXlfY29uc3RfcmVmZXJlbmNlIHJfcmhzX2tleSkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZXF1YWxfcHJlZml4ZXMoYmFzZV90eXBlOjpiZWdpbihyX2xoc19rZXkpLAorCQkJICAgIGJhc2VfdHlwZTo6ZW5kKHJfbGhzX2tleSksCisJCQkgICAgYmFzZV90eXBlOjpiZWdpbihyX3Joc19rZXkpLAorCQkJICAgIGJhc2VfdHlwZTo6ZW5kKHJfcmhzX2tleSksCisJCQkgICAgdHJ1ZSk7CisgICAgfQorCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisgICAgYm9vbAorICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgY21wX3ByZWZpeGVzKGNvbnN0X2l0ZXJhdG9yIGJfbCwgY29uc3RfaXRlcmF0b3IgZV9sLCBjb25zdF9pdGVyYXRvciBiX3IsCisJCSBjb25zdF9pdGVyYXRvciBlX3IsIGJvb2wgY29tcGFyZV9hZnRlciAvKiA9IGZhbHNlKi8pIGNvbnN0CisgICAgeworICAgICAgd2hpbGUgKGJfbCAhPSBlX2wpCisJeworCSAgaWYgKGJfciA9PSBlX3IpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgY29uc3QgdHlwZW5hbWUgYmFzZV90eXBlOjpzaXplX3R5cGUgbF9wb3MgPSBiYXNlX3R5cGU6OmVfcG9zKCpiX2wpOworCSAgY29uc3QgdHlwZW5hbWUgYmFzZV90eXBlOjpzaXplX3R5cGUgcl9wb3MgPSBiYXNlX3R5cGU6OmVfcG9zKCpiX3IpOworCSAgaWYgKGxfcG9zICE9IHJfcG9zKQorCSAgICByZXR1cm4gbF9wb3MgPCByX3BvczsKKwkgICsrYl9sOworCSAgKytiX3I7CisJfQorCisgICAgICBpZiAoIWNvbXBhcmVfYWZ0ZXIpCisJcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIGJfciAhPSBlX3I7CisgICAgfQorCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisgICAgYm9vbAorICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgY21wX2tleXMoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2xoc19rZXksCisJICAgICBrZXlfY29uc3RfcmVmZXJlbmNlIHJfcmhzX2tleSkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gY21wX3ByZWZpeGVzKGJhc2VfdHlwZTo6YmVnaW4ocl9saHNfa2V5KSwKKwkJCSAgYmFzZV90eXBlOjplbmQocl9saHNfa2V5KSwKKwkJCSAgYmFzZV90eXBlOjpiZWdpbihyX3Joc19rZXkpLAorCQkJICBiYXNlX3R5cGU6OmVuZChyX3Joc19rZXkpLAorCQkJICB0cnVlKTsKKyAgICB9CisKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjprZXlfY29uc3RfcmVmZXJlbmNlCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjoKKyAgICBleHRyYWN0X2tleShjb25zdF9yZWZlcmVuY2Ugcl92YWwpCisgICAgeyByZXR1cm4gZXh0cmFjdF9rZXkocl92YWwsIHNfc2V0X2luZCk7IH0KKworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfQ19ERUM6OmtleV9jb25zdF9yZWZlcmVuY2UKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfQ19ERUM6OgorICAgIGV4dHJhY3Rfa2V5KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgdHJ1ZV90eXBlKQorICAgIHsgcmV0dXJuIHJfdmFsOyB9CisKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjprZXlfY29uc3RfcmVmZXJlbmNlCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjoKKyAgICBleHRyYWN0X2tleShjb25zdF9yZWZlcmVuY2Ugcl92YWwsIGZhbHNlX3R5cGUpCisgICAgeyByZXR1cm4gcl92YWwuZmlyc3Q7IH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisgICAgYm9vbAorICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgb3BlcmF0b3IoKShrZXlfY29uc3RfcmVmZXJlbmNlIHJfbGhzLCBrZXlfY29uc3RfcmVmZXJlbmNlIHJfcmhzKQorICAgIHsgcmV0dXJuIGNtcF9rZXlzKHJfbGhzLCByX3Jocyk7IH0KKyNlbmRpZgorCisjdW5kZWYgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisjdW5kZWYgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy90cmFjZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdHJhY2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiNTA3MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdHJhY2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMTEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcGF0X3RyaWVfL3RyYWNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgcGF0X3RyaWVfLgorICovCisKKyNpZmRlZiBQQl9EU19QQVRfVFJJRV9UUkFDRV8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlKCkgY29uc3QKK3sKKyAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKKyAgaWYgKG1fcF9oZWFkLT5tX3BfcGFyZW50ID09IDApCisgICAgcmV0dXJuOworICB0cmFjZV9ub2RlKG1fcF9oZWFkLT5tX3BfcGFyZW50LCAwKTsKKyAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlX25vZGUobm9kZV9jb25zdF9wb2ludGVyIHBfbmQsIHNpemVfdHlwZSBsZXZlbCkKK3sKKyAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBsZXZlbDsgKytpKQorICAgIHN0ZDo6Y2VyciA8PCAnICc7CisgIHN0ZDo6Y2VyciA8PCBwX25kIDw8ICIgIjsKKyAgc3RkOjpjZXJyIDw8ICgocF9uZC0+bV90eXBlID09IHBhdF90cmllX2xlYWZfbm9kZV90eXBlKSA/ICJsICIgOiAiaSAiKTsKKworICB0cmFjZV9ub2RlX21ldGFkYXRhKHBfbmQsIHR5cGVfdG9fdHlwZTx0eXBlbmFtZSBub2RlOjptZXRhZGF0YV90eXBlPigpKTsKKyAgdHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgZWxfaXQgPSBwcmVmX2JlZ2luKHBfbmQpOworICB3aGlsZSAoZWxfaXQgIT0gcHJlZl9lbmQocF9uZCkpCisgICAgeworICAgICAgc3RkOjpjZXJyIDw8KiBlbF9pdDsKKyAgICAgICsrZWxfaXQ7CisgICAgfQorCisgIGlmIChwX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpCisgICAgeworICAgICAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaW5vZGVfY29uc3RfcG9pbnRlciBwX2ludGVybmFsID0gc3RhdGljX2Nhc3Q8aW5vZGVfY29uc3RfcG9pbnRlcj4ocF9uZCk7CisKKyAgc3RkOjpjZXJyIDw8ICIgIiA8PAorICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHBfaW50ZXJuYWwtPmdldF9lX2luZCgpKSA8PCBzdGQ6OmVuZGw7CisKKyAgY29uc3Qgc2l6ZV90eXBlIG51bV9jaGlsZHJlbiA9IHN0ZDo6ZGlzdGFuY2UocF9pbnRlcm5hbC0+YmVnaW4oKSwKKwkJCQkJICAgICAgIHBfaW50ZXJuYWwtPmVuZCgpKTsKKworICBmb3IgKHNpemVfdHlwZSBjaGlsZF9pID0gMDsgY2hpbGRfaSA8IG51bV9jaGlsZHJlbjsgKytjaGlsZF9pKQorICAgIHsKKyAgICAgIHR5cGVuYW1lIGlub2RlOjpjb25zdF9pdGVyYXRvciBjaGlsZF9pdCA9IHBfaW50ZXJuYWwtPmJlZ2luKCk7CisgICAgICBzdGQ6OmFkdmFuY2UoY2hpbGRfaXQsIG51bV9jaGlsZHJlbiAtIGNoaWxkX2kgLSAxKTsKKyAgICAgIHRyYWNlX25vZGUoKmNoaWxkX2l0LCBsZXZlbCArIDEpOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE1ldGFkYXRhXz4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlX25vZGVfbWV0YWRhdGEobm9kZV9jb25zdF9wb2ludGVyIHBfbmQsIHR5cGVfdG9fdHlwZTxNZXRhZGF0YV8+KQoreworICBzdGQ6OmNlcnIgPDwgIigiIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHBfbmQtPmdldF9tZXRhZGF0YSgpKSA8PCAiKSAiOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordHJhY2Vfbm9kZV9tZXRhZGF0YShub2RlX2NvbnN0X3BvaW50ZXIsIHR5cGVfdG9fdHlwZTxudWxsX3R5cGU+KQoreyB9CisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy90cmFpdHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy90cmFpdHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNGI5M2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3RyYWl0cy5ocHAKQEAgLTAsMCArMSwxNDggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcGF0X3RyaWVfL3RyYWl0cy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBwYXRfdHJpZV8uCisgKi8KKworI2lmbmRlZiBQQl9EU19QQVRfVFJJRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisjZGVmaW5lIFBCX0RTX1BBVF9UUklFX05PREVfQU5EX0lUX1RSQUlUU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BhdF90cmllX2Jhc2UuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3N5bnRoX2FjY2Vzc190cmFpdHMuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24uCisgICAgLy8vIEBpbmdyb3VwIHRyYWl0cworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICAgIHR5cGVuYW1lIF9BVHJhaXRzLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLAorCQkgICAgICB0eXBlbmFtZSBOb2RlX0l0ciwKKwkJICAgICAgdHlwZW5hbWUgQ21wX0ZuXywKKwkJICAgICAgdHlwZW5hbWUgX0FsbG9jXz4KKwkgICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB0cmllX3RyYWl0czxLZXksIE1hcHBlZCwgX0FUcmFpdHMsIE5vZGVfVXBkYXRlLCBwYXRfdHJpZV90YWcsIF9BbGxvYz4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgcGF0X3RyaWVfYmFzZQkJCQkgICAgCWJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZXNfdHJhaXRzPEtleSwgTWFwcGVkLCBfQWxsb2MsIGZhbHNlPiAJCXR5cGVfdHJhaXRzOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmllX25vZGVfbWV0YWRhdGFfZGlzcGF0Y2g8S2V5LCBNYXBwZWQsIF9BVHJhaXRzLCBOb2RlX1VwZGF0ZSwgX0FsbG9jPjo6dHlwZSBtZXRhZGF0YV90eXBlOworICAgICAgdHlwZWRlZiBiYXNlX3R5cGU6Ol9NZXRhZGF0YTxtZXRhZGF0YV90eXBlLCBfQWxsb2M+ICAgICAgCW1ldGFkYXRhOworICAgICAgdHlwZWRlZiBfQVRyYWl0cyAJCSAgICAgICAJCQkgICAgICAgCWFjY2Vzc190cmFpdHM7CisKKyAgICAgIC8vLyBUeXBlIGZvciBzeW50aGVzaXplZCB0cmFpdHMuCisgICAgICB0eXBlZGVmIF9fZ251X3BiZHM6OmRldGFpbDo6c3ludGhfYWNjZXNzX3RyYWl0czx0eXBlX3RyYWl0cywgZmFsc2UsIGFjY2Vzc190cmFpdHM+ICAgc3ludGhfYWNjZXNzX3RyYWl0czsKKworICAgICAgdHlwZWRlZiBiYXNlX3R5cGU6Ol9Ob2RlX2Jhc2U8c3ludGhfYWNjZXNzX3RyYWl0cywgbWV0YWRhdGE+ICAgICAJbm9kZTsKKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfSGVhZDxzeW50aF9hY2Nlc3NfdHJhaXRzLCBtZXRhZGF0YT4JICAgICAgIAloZWFkOworICAgICAgdHlwZWRlZiBiYXNlX3R5cGU6Ol9MZWFmPHN5bnRoX2FjY2Vzc190cmFpdHMsIG1ldGFkYXRhPgkgICAgICAgCWxlYWY7CisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X0lub2RlPHN5bnRoX2FjY2Vzc190cmFpdHMsIG1ldGFkYXRhPiAJCWlub2RlOworCisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X0l0ZXI8bm9kZSwgbGVhZiwgaGVhZCwgaW5vZGUsIHRydWU+CSAgICAgICAJaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X0NJdGVyPG5vZGUsIGxlYWYsIGhlYWQsIGlub2RlLCB0cnVlPiAJIAljb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfSXRlcjxub2RlLCBsZWFmLCBoZWFkLCBpbm9kZSwgZmFsc2U+IAkJcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfQ0l0ZXI8bm9kZSwgbGVhZiwgaGVhZCwgaW5vZGUsIGZhbHNlPgkgCWNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vLyBUaGlzIGlzIGFuIGl0ZXJhdG9yIHRvIGFuIGl0ZXJhdG9yOiBpdCBpdGVyYXRlcyBvdmVyIG5vZGVzLAorICAgICAgLy8vIGFuZCBkZS1yZWZlcmVuY2luZyBpdCByZXR1cm5zIG9uZSBvZiB0aGUgdHJlZSdzIGl0ZXJhdG9ycy4KKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfTm9kZV9jaXRlcjxub2RlLCBsZWFmLCBoZWFkLCBpbm9kZSwgY29uc3RfaXRlcmF0b3IsIGl0ZXJhdG9yLCBfQWxsb2M+IG5vZGVfY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfTm9kZV9pdGVyPG5vZGUsIGxlYWYsIGhlYWQsIGlub2RlLCBjb25zdF9pdGVyYXRvciwgaXRlcmF0b3IsIF9BbGxvYz4gbm9kZV9pdGVyYXRvcjsKKworICAgICAgLy8vIFR5cGUgZm9yIG5vZGUgdXBkYXRlLgorICAgICAgdHlwZWRlZiBOb2RlX1VwZGF0ZTxub2RlX2NvbnN0X2l0ZXJhdG9yLCBub2RlX2l0ZXJhdG9yLCBfQVRyYWl0cywgX0FsbG9jPiAJCW5vZGVfdXBkYXRlOworCisgICAgICB0eXBlZGVmIG51bGxfbm9kZV91cGRhdGU8bm9kZV9jb25zdF9pdGVyYXRvciwgbm9kZV9pdGVyYXRvciwgX0FUcmFpdHMsIF9BbGxvYz4qIAkJbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyOworICAgIH07CisKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbi4KKyAgICAvLy8gQGluZ3JvdXAgdHJhaXRzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgX0FUcmFpdHMsCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsCisJCSAgICAgIHR5cGVuYW1lIE5vZGVfSXRyLAorCQkgICAgICB0eXBlbmFtZSBDbXBfRm5fLAorCQkgICAgICB0eXBlbmFtZSBfQWxsb2NfPgorCSAgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHRyaWVfdHJhaXRzPEtleSwgbnVsbF90eXBlLCBfQVRyYWl0cywgTm9kZV9VcGRhdGUsIHBhdF90cmllX3RhZywgX0FsbG9jPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBwYXRfdHJpZV9iYXNlCQkJCQliYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVzX3RyYWl0czxLZXksIG51bGxfdHlwZSwgX0FsbG9jLCBmYWxzZT4gCXR5cGVfdHJhaXRzOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmllX25vZGVfbWV0YWRhdGFfZGlzcGF0Y2g8S2V5LCBudWxsX3R5cGUsIF9BVHJhaXRzLCBOb2RlX1VwZGF0ZSwgX0FsbG9jPjo6dHlwZSBtZXRhZGF0YV90eXBlOworICAgICAgdHlwZWRlZiBiYXNlX3R5cGU6Ol9NZXRhZGF0YTxtZXRhZGF0YV90eXBlLCBfQWxsb2M+CQkJCW1ldGFkYXRhOworICAgICAgdHlwZWRlZiBfQVRyYWl0cyAJCQkJICAgICAJCQkJCWFjY2Vzc190cmFpdHM7CisKKyAgICAgIC8vLyBUeXBlIGZvciBzeW50aGVzaXplZCB0cmFpdHMuCisgICAgICB0eXBlZGVmIF9fZ251X3BiZHM6OmRldGFpbDo6c3ludGhfYWNjZXNzX3RyYWl0czx0eXBlX3RyYWl0cywgdHJ1ZSwgYWNjZXNzX3RyYWl0cz4gc3ludGhfYWNjZXNzX3RyYWl0czsKKworICAgICAgdHlwZWRlZiBiYXNlX3R5cGU6Ol9Ob2RlX2Jhc2U8c3ludGhfYWNjZXNzX3RyYWl0cywgbWV0YWRhdGE+ICAgICAJbm9kZTsKKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfSGVhZDxzeW50aF9hY2Nlc3NfdHJhaXRzLCBtZXRhZGF0YT4gCSAgICAgICAJaGVhZDsKKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfTGVhZjxzeW50aF9hY2Nlc3NfdHJhaXRzLCBtZXRhZGF0YT4gCSAgICAgICAJbGVhZjsKKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfSW5vZGU8c3ludGhfYWNjZXNzX3RyYWl0cywgbWV0YWRhdGE+IAkgICAgICAgCWlub2RlOworCisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X0NJdGVyPG5vZGUsIGxlYWYsIGhlYWQsIGlub2RlLCB0cnVlPiAJCWNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciAJCQkJCSAgICAgICAJaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X0NJdGVyPG5vZGUsIGxlYWYsIGhlYWQsIGlub2RlLCBmYWxzZT4JICAgICAgIAljb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAkJCSAgICAgICAJCXJldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vLyBUaGlzIGlzIGFuIGl0ZXJhdG9yIHRvIGFuIGl0ZXJhdG9yOiBpdCBpdGVyYXRlcyBvdmVyIG5vZGVzLAorICAgICAgLy8vIGFuZCBkZS1yZWZlcmVuY2luZyBpdCByZXR1cm5zIG9uZSBvZiB0aGUgdHJlZSdzIGl0ZXJhdG9ycy4KKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfTm9kZV9jaXRlcjxub2RlLCBsZWFmLCBoZWFkLCBpbm9kZSwgY29uc3RfaXRlcmF0b3IsIGl0ZXJhdG9yLCBfQWxsb2M+IG5vZGVfY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgbm9kZV9jb25zdF9pdGVyYXRvciAJCQkJCQkJCW5vZGVfaXRlcmF0b3I7CisKKyAgICAgIC8vLyBUeXBlIGZvciBub2RlIHVwZGF0ZS4KKyAgICAgIHR5cGVkZWYgTm9kZV9VcGRhdGU8bm9kZV9jb25zdF9pdGVyYXRvciwgbm9kZV9pdGVyYXRvciwgX0FUcmFpdHMsIF9BbGxvYz4gCQlub2RlX3VwZGF0ZTsKKworICAgICAgdHlwZWRlZiBudWxsX25vZGVfdXBkYXRlPG5vZGVfY29uc3RfaXRlcmF0b3IsIG5vZGVfY29uc3RfaXRlcmF0b3IsIF9BVHJhaXRzLCBfQWxsb2M+KiAJbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyOworICAgIH07CisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1BBVF9UUklFX05PREVfQU5EX0lUX1RSQUlUU19IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdXBkYXRlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy91cGRhdGVfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjMGZiYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdXBkYXRlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcGF0X3RyaWVfL3VwZGF0ZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHBhdF90cmllXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FwcGx5X3VwZGF0ZShub2RlX3BvaW50ZXIsIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcikKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGVfPgoraW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FwcGx5X3VwZGF0ZShub2RlX3BvaW50ZXIgcF9uZCwgTm9kZV9VcGRhdGVfKikKK3sKKyAgTm9kZV9VcGRhdGVfOjpvcGVyYXRvcigpKG5vZGVfaXRlcmF0b3IocF9uZCwgdGhpcyksCisJCQkgICBub2RlX2NvbnN0X2l0ZXJhdG9yKDAsIHRoaXMpKTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wcmlvcml0eV9xdWV1ZV9iYXNlX2Rpc3BhdGNoLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wcmlvcml0eV9xdWV1ZV9iYXNlX2Rpc3BhdGNoLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2U5MTU4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3ByaW9yaXR5X3F1ZXVlX2Jhc2VfZGlzcGF0Y2guaHBwCkBAIC0wLDAgKzEsMTE0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRldGFpbC9wcmlvcml0eV9xdWV1ZV9iYXNlX2Rpc3BhdGNoLmhwcAorICogQ29udGFpbnMgYW4gcHFpYXRpdmUgY29udGFpbmVyIGRpc3BhdGNoaW5nIGJhc2UuCisgKi8KKworI2lmbmRlZiBQQl9EU19QUklPUklUWV9RVUVVRV9CQVNFX0RTX0RJU1BBVENIRVJfSFBQCisjZGVmaW5lIFBCX0RTX1BSSU9SSVRZX1FVRVVFX0JBU0VfRFNfRElTUEFUQ0hFUl9IUFAKKworI2RlZmluZSBQQl9EU19BU1NFUlRfVkFMSUQoWCkJCQkJCQlcCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoWC5hc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisKKyNkZWZpbmUgUEJfRFNfREVCVUdfVkVSSUZZKF9Db25kKQkJCQkJXAorICBfR0xJQkNYWF9ERUJVR19WRVJJRllfQVQoX0NvbmQsCQkJCQlcCisJCQkgICBfTV9tZXNzYWdlKCNfQ29uZCIgYXNzZXJ0aW9uIGZyb20gJTE7OiUyOyIpCVwKKwkJCSAgIC5fTV9zdHJpbmcoX19GSUxFX18pLl9NX2ludGVnZXIoX19MSU5FX18pCVwKKwkJCSAgICxfX2ZpbGUsX19saW5lKQorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL3BhaXJpbmdfaGVhcF8uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vYmlub21pYWxfaGVhcF8uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vcmNfYmlub21pYWxfaGVhcF8uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2JpbmFyeV9oZWFwXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL3RoaW5faGVhcF8uaHBwPgorCisjdW5kZWYgUEJfRFNfREVCVUdfVkVSSUZZCisjdW5kZWYgUEJfRFNfQVNTRVJUX1ZBTElECisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgcGFpcmluZ19oZWFwLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WVHAsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPF9WVHAsIENtcF9GbiwgX0FsbG9jLCBwYWlyaW5nX2hlYXBfdGFnLAorCQkJCSAgICAgbnVsbF90eXBlPgorICAgICAgeworCS8vLyBEaXNwYXRjaGVkIHR5cGUuCisJdHlwZWRlZiBwYWlyaW5nX2hlYXA8X1ZUcCwgQ21wX0ZuLCBfQWxsb2M+IAkJdHlwZTsKKyAgICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGJpbm9taWFsX2hlYXAuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZUcCwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8X1ZUcCwgQ21wX0ZuLCBfQWxsb2MsIGJpbm9taWFsX2hlYXBfdGFnLAorCQkJCSAgICAgbnVsbF90eXBlPgorICAgICAgeworCS8vLyBEaXNwYXRjaGVkIHR5cGUuCisJdHlwZWRlZiBiaW5vbWlhbF9oZWFwPF9WVHAsIENtcF9GbiwgX0FsbG9jPiAJCXR5cGU7CisgICAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciByY19iaW5hcnlfaGVhcC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVlRwLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxfVlRwLCBDbXBfRm4sIF9BbGxvYywgcmNfYmlub21pYWxfaGVhcF90YWcsCisgIAkJCQkgICAgIG51bGxfdHlwZT4KKyAgICAgIHsKKwkvLy8gRGlzcGF0Y2hlZCB0eXBlLgorCXR5cGVkZWYgcmNfYmlub21pYWxfaGVhcDxfVlRwLCBDbXBfRm4sIF9BbGxvYz4JICAgICAgIAl0eXBlOworICAgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYmluYXJ5X2hlYXAuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZUcCwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8X1ZUcCwgQ21wX0ZuLCBfQWxsb2MsIGJpbmFyeV9oZWFwX3RhZywKKyAgCQkJCSAgICAgbnVsbF90eXBlPgorICAgICAgeworCS8vLyBEaXNwYXRjaGVkIHR5cGUuCisJdHlwZWRlZiBiaW5hcnlfaGVhcDxfVlRwLCBDbXBfRm4sIF9BbGxvYz4gCQl0eXBlOworICAgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgdGhpbl9oZWFwLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WVHAsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPF9WVHAsIENtcF9GbiwgX0FsbG9jLCB0aGluX2hlYXBfdGFnLAorICAJCQkJICAgICBudWxsX3R5cGU+ICAgIAorICAgICAgeworCS8vLyBEaXNwYXRjaGVkIHR5cGUuCisJdHlwZWRlZiB0aGluX2hlYXA8X1ZUcCwgQ21wX0ZuLCBfQWxsb2M+IAkJdHlwZTsKKyAgICAgIH07CisgICAgLy9AfSBncm91cCBwYmRzCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19QUklPUklUWV9RVUVVRV9CQVNFX0RTX0RJU1BBVENIRVJfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzAyMWY4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEwMCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByYl90cmVlX21hcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByYl90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb3B5X2Zyb21fcmFuZ2UoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQpCit7CisgIHdoaWxlIChmaXJzdF9pdCAhPSBsYXN0X2l0KQorICAgIGluc2VydCgqKGZpcnN0X2l0KyspKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX1JCX1RSRUVfTkFNRSgpCit7CisgIGluaXRpYWxpemUoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19SQl9UUkVFX05BTUUoY29uc3QgQ21wX0ZuJiByX2NtcF9mbikgOgorICBiYXNlX3R5cGUocl9jbXBfZm4pCit7CisgIGluaXRpYWxpemUoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19SQl9UUkVFX05BTUUoY29uc3QgQ21wX0ZuJiByX2NtcF9mbiwgY29uc3Qgbm9kZV91cGRhdGUmIHJfbm9kZV91cGRhdGUpIDoKKyAgYmFzZV90eXBlKHJfY21wX2ZuLCByX25vZGVfdXBkYXRlKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfUkJfVFJFRV9OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgOgorICBiYXNlX3R5cGUob3RoZXIpCit7CisgIGluaXRpYWxpemUoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGJhc2VfdHlwZTo6c3dhcChvdGhlcik7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdGlhbGl6ZSgpCit7IGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcmVkID0gdHJ1ZTsgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhZTgzMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw4MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByYl90cmVlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByYl90cmVlXy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9ub2RlX2NvbnNpc3RlbnQoY29uc3Qgbm9kZV9wb2ludGVyIHBfbmQsIGNvbnN0IGNoYXIqIF9fZmlsZSwKKwkJCQkJCWludCBfX2xpbmUpIGNvbnN0Cit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuIDE7CisKKyAgY29uc3Qgc2l6ZV90eXBlIGxfaGVpZ2h0ID0KKyAgICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQtPm1fcF9sZWZ0LCBfX2ZpbGUsIF9fbGluZSk7CisgIGNvbnN0IHNpemVfdHlwZSByX2hlaWdodCA9CisgICAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kLT5tX3BfcmlnaHQsIF9fZmlsZSwgX19saW5lKTsKKyAgaWYgKHBfbmQtPm1fcmVkKQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShpc19lZmZlY3RpdmVseV9ibGFjayhwX25kLT5tX3BfbGVmdCkpOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKGlzX2VmZmVjdGl2ZWx5X2JsYWNrKHBfbmQtPm1fcF9yaWdodCkpOworICAgIH0KKyAgUEJfRFNfREVCVUdfVkVSSUZZKGxfaGVpZ2h0ID09IHJfaGVpZ2h0KTsKKyAgcmV0dXJuIChwX25kLT5tX3JlZCA/IDAgOiAxKSArIGxfaGVpZ2h0OworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgYmFzZV90eXBlOjphc3NlcnRfdmFsaWQoX19maWxlLCBfX2xpbmUpOworICBjb25zdCBub2RlX3BvaW50ZXIgcF9oZWFkID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgUEJfRFNfREVCVUdfVkVSSUZZKHBfaGVhZC0+bV9yZWQpOworICBpZiAocF9oZWFkLT5tX3BfcGFyZW50ICE9IDApCisgICAgeworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKCFwX2hlYWQtPm1fcF9wYXJlbnQtPm1fcmVkKTsKKyAgICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9oZWFkLT5tX3BfcGFyZW50LCBfX2ZpbGUsIF9fbGluZSk7CisgICAgfQorfQorCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMjIwYzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMjg5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJiX3RyZWVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJiX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2Uoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgcG9pbnRfaXRlcmF0b3IgaXQgPSB0aGlzLT5maW5kKHJfa2V5KTsKKyAgaWYgKGl0ID09IGJhc2VfdHlwZTo6ZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBlcmFzZShpdCk7CisgIHJldHVybiB0cnVlOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2UoaXRlcmF0b3IgaXQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBpZiAoaXQgPT0gYmFzZV90eXBlOjplbmQoKSkKKyAgICByZXR1cm4gaXQ7CisKKyAgaXRlcmF0b3IgcmV0X2l0ID0gaXQ7CisgICsrcmV0X2l0OworICBlcmFzZV9ub2RlKGl0Lm1fcF9uZCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gcmV0X2l0OworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpyZXZlcnNlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShyZXZlcnNlX2l0ZXJhdG9yIGl0KQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgaWYgKGl0Lm1fcF9uZCA9PSBiYXNlX3R5cGU6Om1fcF9oZWFkKQorICAgIHJldHVybiBpdDsKKworICByZXZlcnNlX2l0ZXJhdG9yIHJldF9pdCA9IGl0OworICArK3JldF9pdDsKKyAgZXJhc2Vfbm9kZShpdC5tX3BfbmQpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIHJldF9pdDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaWYoUHJlZCBwcmVkKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgc2l6ZV90eXBlIG51bV9lcnNkID0gMDsKKyAgaXRlcmF0b3IgaXQgPSBiYXNlX3R5cGU6OmJlZ2luKCk7CisgIHdoaWxlIChpdCAhPSBiYXNlX3R5cGU6OmVuZCgpKQorICAgIHsKKyAgICAgIGlmIChwcmVkKCppdCkpCisgICAgICAgIHsKKwkgICsrbnVtX2Vyc2Q7CisJICBpdCA9IGVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorCSsraXQ7CisgICAgfQorCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gbnVtX2Vyc2Q7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9ub2RlKG5vZGVfcG9pbnRlciBwX25kKQoreworICByZW1vdmVfbm9kZShwX25kKTsKKyAgYmFzZV90eXBlOjphY3R1YWxfZXJhc2Vfbm9kZShwX25kKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZW1vdmVfbm9kZShub2RlX3BvaW50ZXIgcF96KQoreworICB0aGlzLT51cGRhdGVfbWluX21heF9mb3JfZXJhc2VkX25vZGUocF96KTsKKyAgbm9kZV9wb2ludGVyIHBfeSA9IHBfejsKKyAgbm9kZV9wb2ludGVyIHBfeCA9IDA7CisgIG5vZGVfcG9pbnRlciBwX25ld194X3BhcmVudCA9IDA7CisKKyAgaWYgKHBfeS0+bV9wX2xlZnQgPT0gMCkKKyAgICBwX3ggPSBwX3ktPm1fcF9yaWdodDsKKyAgZWxzZSBpZiAocF95LT5tX3BfcmlnaHQgPT0gMCkKKyAgICBwX3ggPSBwX3ktPm1fcF9sZWZ0OworICBlbHNlCisgICAgeworICAgICAgcF95ID0gcF95LT5tX3BfcmlnaHQ7CisgICAgICB3aGlsZSAocF95LT5tX3BfbGVmdCAhPSAwKQorCXBfeSA9IHBfeS0+bV9wX2xlZnQ7CisgICAgICBwX3ggPSBwX3ktPm1fcF9yaWdodDsKKyAgICB9CisKKyAgaWYgKHBfeSA9PSBwX3opCisgICAgeworICAgICAgcF9uZXdfeF9wYXJlbnQgPSBwX3ktPm1fcF9wYXJlbnQ7CisgICAgICBpZiAocF94ICE9IDApCisJcF94LT5tX3BfcGFyZW50ID0gcF95LT5tX3BfcGFyZW50OworCisgICAgICBpZiAoYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9PSBwX3opCisJYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfeDsKKyAgICAgIGVsc2UgaWYgKHBfei0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPT0gcF96KQorICAgICAgICB7CisJICBwX3ktPm1fcF9sZWZ0ID0gcF96LT5tX3BfcGFyZW50OworCSAgcF96LT5tX3BfcGFyZW50LT5tX3BfbGVmdCA9IHBfeDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisJICBwX3ktPm1fcF9sZWZ0ID0gMDsKKwkgIHBfei0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0ID0gcF94OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcF96LT5tX3BfbGVmdC0+bV9wX3BhcmVudCA9IHBfeTsKKyAgICAgIHBfeS0+bV9wX2xlZnQgPSBwX3otPm1fcF9sZWZ0OworICAgICAgaWYgKHBfeSAhPSBwX3otPm1fcF9yaWdodCkKKyAgICAgICAgeworCSAgcF9uZXdfeF9wYXJlbnQgPSBwX3ktPm1fcF9wYXJlbnQ7CisJICBpZiAocF94ICE9IDApCisJICAgIHBfeC0+bV9wX3BhcmVudCA9IHBfeS0+bV9wX3BhcmVudDsKKwkgIHBfeS0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPSBwX3g7CisJICBwX3ktPm1fcF9yaWdodCA9IHBfei0+bV9wX3JpZ2h0OworCSAgcF96LT5tX3BfcmlnaHQtPm1fcF9wYXJlbnQgPSBwX3k7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwlwX25ld194X3BhcmVudCA9IHBfeTsKKworICAgICAgaWYgKGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gcF96KQorCWJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX3k7CisgICAgICBlbHNlIGlmIChwX3otPm1fcF9wYXJlbnQtPm1fcF9sZWZ0ID09IHBfeikKKwlwX3otPm1fcF9wYXJlbnQtPm1fcF9sZWZ0ID0gcF95OworICAgICAgZWxzZQorCXBfei0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0ID0gcF95OworCisgICAgICBwX3ktPm1fcF9wYXJlbnQgPSBwX3otPm1fcF9wYXJlbnQ7CisgICAgICBzdGQ6OnN3YXAocF95LT5tX3JlZCwgcF96LT5tX3JlZCk7CisgICAgICBwX3kgPSBwX3o7CisgICAgfQorCisgIHRoaXMtPnVwZGF0ZV90b190b3AocF9uZXdfeF9wYXJlbnQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworCisgIGlmIChwX3ktPm1fcmVkKQorICAgIHJldHVybjsKKworICByZW1vdmVfZml4dXAocF94LCBwX25ld194X3BhcmVudCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZW1vdmVfZml4dXAobm9kZV9wb2ludGVyIHBfeCwgbm9kZV9wb2ludGVyIHBfbmV3X3hfcGFyZW50KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF94ID09IDAgfHwgcF94LT5tX3BfcGFyZW50ID09IHBfbmV3X3hfcGFyZW50KTsKKworICB3aGlsZSAocF94ICE9IGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgJiYgaXNfZWZmZWN0aXZlbHlfYmxhY2socF94KSkKKyAgICBpZiAocF94ID09IHBfbmV3X3hfcGFyZW50LT5tX3BfbGVmdCkKKyAgICAgIHsKKwlub2RlX3BvaW50ZXIgcF93ID0gcF9uZXdfeF9wYXJlbnQtPm1fcF9yaWdodDsKKwlpZiAocF93LT5tX3JlZCkKKwkgIHsKKwkgICAgcF93LT5tX3JlZCA9IGZhbHNlOworCSAgICBwX25ld194X3BhcmVudC0+bV9yZWQgPSB0cnVlOworCSAgICBiYXNlX3R5cGU6OnJvdGF0ZV9sZWZ0KHBfbmV3X3hfcGFyZW50KTsKKwkgICAgcF93ID0gcF9uZXdfeF9wYXJlbnQtPm1fcF9yaWdodDsKKwkgIH0KKworCWlmIChpc19lZmZlY3RpdmVseV9ibGFjayhwX3ctPm1fcF9sZWZ0KSAKKwkgICAgJiYgaXNfZWZmZWN0aXZlbHlfYmxhY2socF93LT5tX3BfcmlnaHQpKQorCSAgeworCSAgICBwX3ctPm1fcmVkID0gdHJ1ZTsKKwkgICAgcF94ID0gcF9uZXdfeF9wYXJlbnQ7CisJICAgIHBfbmV3X3hfcGFyZW50ID0gcF9uZXdfeF9wYXJlbnQtPm1fcF9wYXJlbnQ7CisJICB9CisJZWxzZQorCSAgeworCSAgICBpZiAoaXNfZWZmZWN0aXZlbHlfYmxhY2socF93LT5tX3BfcmlnaHQpKQorCSAgICAgIHsKKwkJaWYgKHBfdy0+bV9wX2xlZnQgIT0gMCkKKwkJICBwX3ctPm1fcF9sZWZ0LT5tX3JlZCA9IGZhbHNlOworCisJCXBfdy0+bV9yZWQgPSB0cnVlOworCQliYXNlX3R5cGU6OnJvdGF0ZV9yaWdodChwX3cpOworCQlwX3cgPSBwX25ld194X3BhcmVudC0+bV9wX3JpZ2h0OworCSAgICAgIH0KKworCSAgICBwX3ctPm1fcmVkID0gcF9uZXdfeF9wYXJlbnQtPm1fcmVkOworCSAgICBwX25ld194X3BhcmVudC0+bV9yZWQgPSBmYWxzZTsKKworCSAgICBpZiAocF93LT5tX3BfcmlnaHQgIT0gMCkKKwkgICAgICBwX3ctPm1fcF9yaWdodC0+bV9yZWQgPSBmYWxzZTsKKworCSAgICBiYXNlX3R5cGU6OnJvdGF0ZV9sZWZ0KHBfbmV3X3hfcGFyZW50KTsKKwkgICAgdGhpcy0+dXBkYXRlX3RvX3RvcChwX25ld194X3BhcmVudCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisJICAgIGJyZWFrOworCSAgfQorICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlub2RlX3BvaW50ZXIgcF93ID0gcF9uZXdfeF9wYXJlbnQtPm1fcF9sZWZ0OworCWlmIChwX3ctPm1fcmVkID09IHRydWUpCisJICB7CisJICAgIHBfdy0+bV9yZWQgPSBmYWxzZTsKKwkgICAgcF9uZXdfeF9wYXJlbnQtPm1fcmVkID0gdHJ1ZTsKKwkgICAgYmFzZV90eXBlOjpyb3RhdGVfcmlnaHQocF9uZXdfeF9wYXJlbnQpOworCSAgICBwX3cgPSBwX25ld194X3BhcmVudC0+bV9wX2xlZnQ7CisJICB9CisKKwlpZiAoaXNfZWZmZWN0aXZlbHlfYmxhY2socF93LT5tX3BfcmlnaHQpIAorCSAgICAmJiBpc19lZmZlY3RpdmVseV9ibGFjayhwX3ctPm1fcF9sZWZ0KSkKKwkgIHsKKwkgICAgcF93LT5tX3JlZCA9IHRydWU7CisJICAgIHBfeCA9IHBfbmV3X3hfcGFyZW50OworCSAgICBwX25ld194X3BhcmVudCA9IHBfbmV3X3hfcGFyZW50LT5tX3BfcGFyZW50OworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgaWYgKGlzX2VmZmVjdGl2ZWx5X2JsYWNrKHBfdy0+bV9wX2xlZnQpKQorCSAgICAgIHsKKwkJaWYgKHBfdy0+bV9wX3JpZ2h0ICE9IDApCisJCSAgcF93LT5tX3BfcmlnaHQtPm1fcmVkID0gZmFsc2U7CisKKwkJcF93LT5tX3JlZCA9IHRydWU7CisJCWJhc2VfdHlwZTo6cm90YXRlX2xlZnQocF93KTsKKwkJcF93ID0gcF9uZXdfeF9wYXJlbnQtPm1fcF9sZWZ0OworCSAgICAgIH0KKworCSAgICBwX3ctPm1fcmVkID0gcF9uZXdfeF9wYXJlbnQtPm1fcmVkOworCSAgICBwX25ld194X3BhcmVudC0+bV9yZWQgPSBmYWxzZTsKKworCSAgICBpZiAocF93LT5tX3BfbGVmdCAhPSAwKQorCSAgICAgIHBfdy0+bV9wX2xlZnQtPm1fcmVkID0gZmFsc2U7CisKKwkgICAgYmFzZV90eXBlOjpyb3RhdGVfcmlnaHQocF9uZXdfeF9wYXJlbnQpOworCSAgICB0aGlzLT51cGRhdGVfdG9fdG9wKHBfbmV3X3hfcGFyZW50LCAobm9kZV91cGRhdGUqICl0aGlzKTsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICB9CisKKyAgaWYgKHBfeCAhPSAwKQorICAgIHBfeC0+bV9yZWQgPSBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vZmluZF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vZmluZF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzM3OGQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMzkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmJfdHJlZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByYl90cmVlXy4KKyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDkwOTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKQEAgLTAsMCArMSw0NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByYl90cmVlX21hcF8vaW5mb19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJiX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraXNfZWZmZWN0aXZlbHlfYmxhY2soY29uc3Qgbm9kZV9wb2ludGVyIHBfbmQpCit7IHJldHVybiAocF9uZCA9PSAwIHx8ICFwX25kLT5tX3JlZCk7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGJhMTkyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMTUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmJfdHJlZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJiX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgc3RkOjpwYWlyPHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvciwgYm9vbD4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydChjb25zdF9yZWZlcmVuY2Ugcl92YWx1ZSkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHN0ZDo6cGFpcjxwb2ludF9pdGVyYXRvciwgYm9vbD4gaW5zX3BhaXIgPSBiYXNlX3R5cGU6Omluc2VydF9sZWFmKHJfdmFsdWUpOworICBpZiAoaW5zX3BhaXIuc2Vjb25kID09IHRydWUpCisgICAgeworICAgICAgaW5zX3BhaXIuZmlyc3QubV9wX25kLT5tX3JlZCA9IHRydWU7CisgICAgICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIGluc2VydF9maXh1cChpbnNfcGFpci5maXJzdC5tX3BfbmQpOworICAgIH0KKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIGluc19wYWlyOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydF9maXh1cChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fcmVkID09IHRydWUpOworICB3aGlsZSAocF9uZCAhPSBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ICYmIHBfbmQtPm1fcF9wYXJlbnQtPm1fcmVkKQorICAgIHsKKyAgICAgIGlmIChwX25kLT5tX3BfcGFyZW50ID09IHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQtPm1fcF9sZWZ0KQorICAgICAgICB7CisJICBub2RlX3BvaW50ZXIgcF95ID0gcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0OworCSAgaWYgKHBfeSAhPSAwICYmIHBfeS0+bV9yZWQpCisgICAgICAgICAgICB7CisJICAgICAgcF9uZC0+bV9wX3BhcmVudC0+bV9yZWQgPSBmYWxzZTsKKwkgICAgICBwX3ktPm1fcmVkID0gZmFsc2U7CisJICAgICAgcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudC0+bV9yZWQgPSB0cnVlOworCSAgICAgIHBfbmQgPSBwX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50OworICAgICAgICAgICAgfQorCSAgZWxzZQorICAgICAgICAgICAgeworCSAgICAgIGlmIChwX25kID09IHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9yaWdodCkKKyAgICAgICAgICAgICAgICB7CisJCSAgcF9uZCA9IHBfbmQtPm1fcF9wYXJlbnQ7CisJCSAgYmFzZV90eXBlOjpyb3RhdGVfbGVmdChwX25kKTsKKyAgICAgICAgICAgICAgICB9CisJICAgICAgcF9uZC0+bV9wX3BhcmVudC0+bV9yZWQgPSBmYWxzZTsKKwkgICAgICBwX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50LT5tX3JlZCA9IHRydWU7CisJICAgICAgYmFzZV90eXBlOjpyb3RhdGVfcmlnaHQocF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgbm9kZV9wb2ludGVyIHBfeSA9IHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQtPm1fcF9sZWZ0OworCSAgaWYgKHBfeSAhPSAwICYmIHBfeS0+bV9yZWQpCisgICAgICAgICAgICB7CisJICAgICAgcF9uZC0+bV9wX3BhcmVudC0+bV9yZWQgPSBmYWxzZTsKKwkgICAgICBwX3ktPm1fcmVkID0gZmFsc2U7CisJICAgICAgcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudC0+bV9yZWQgPSB0cnVlOworCSAgICAgIHBfbmQgPSBwX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50OworICAgICAgICAgICAgfQorCSAgZWxzZQorICAgICAgICAgICAgeworCSAgICAgIGlmIChwX25kID09IHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9sZWZ0KQorICAgICAgICAgICAgICAgIHsKKwkJICBwX25kID0gcF9uZC0+bV9wX3BhcmVudDsKKwkJICBiYXNlX3R5cGU6OnJvdGF0ZV9yaWdodChwX25kKTsKKyAgICAgICAgICAgICAgICB9CisJICAgICAgcF9uZC0+bV9wX3BhcmVudC0+bV9yZWQgPSBmYWxzZTsKKwkgICAgICBwX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50LT5tX3JlZCA9IHRydWU7CisJICAgICAgYmFzZV90eXBlOjpyb3RhdGVfbGVmdChwX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBiYXNlX3R5cGU6OnVwZGF0ZV90b190b3AocF9uZCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisgIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQtPm1fcmVkID0gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL25vZGUuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9ub2RlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjA3MWE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9ub2RlLmhwcApAQCAtMCwwICsxLDEzOSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByYl90cmVlX21hcF8vbm9kZS5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByYl90cmVlXy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1JCX1RSRUVfTk9ERV9IUFAKKyNkZWZpbmUgUEJfRFNfUkJfVFJFRV9OT0RFX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L251bGxfbm9kZV9tZXRhZGF0YS5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBOb2RlIGZvciBSZWQtQmxhY2sgdHJlZXMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgY2xhc3MgTWV0YWRhdGEsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgcmJfdHJlZV9ub2RlXworICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBNZXRhZGF0YSAJCQltZXRhZGF0YV90eXBlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKyAgICAgIHJiX3RyZWVfbm9kZV88CisgICAgICBWYWx1ZV9UeXBlLAorICAgICAgTWV0YWRhdGEsCisgICAgICBfQWxsb2M+ID46Om90aGVyOjpwb2ludGVyCisgICAgICBub2RlX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCW1ldGFkYXRhX3R5cGU+OjpvdGhlcjo6cmVmZXJlbmNlCisgICAgICBtZXRhZGF0YV9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCW1ldGFkYXRhX3R5cGU+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlCisgICAgICBtZXRhZGF0YV9jb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGJvb2wKKyAgICAgIHNwZWNpYWwoKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9yZWQ7IH0KKworICAgICAgbWV0YWRhdGFfY29uc3RfcmVmZXJlbmNlCisgICAgICBnZXRfbWV0YWRhdGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9tZXRhZGF0YTsgfQorCisgICAgICBtZXRhZGF0YV9yZWZlcmVuY2UKKyAgICAgIGdldF9tZXRhZGF0YSgpCisgICAgICB7IHJldHVybiBtX21ldGFkYXRhOyB9CisKKyNpZmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0CisgICAgICB7CisJc3RkOjpjb3V0IDw8IFBCX0RTX1YyRihtX3ZhbHVlKSA8PChtX3JlZD8gIiA8cj4gIiA6ICIgPGI+ICIpIAorCQkgIDw8ICIoIiA8PCBtX21ldGFkYXRhIDw8ICIpIjsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBub2RlX3BvaW50ZXIgCW1fcF9sZWZ0OworICAgICAgbm9kZV9wb2ludGVyIAltX3BfcmlnaHQ7CisgICAgICBub2RlX3BvaW50ZXIgCW1fcF9wYXJlbnQ7CisgICAgICB2YWx1ZV90eXBlIAltX3ZhbHVlOworICAgICAgYm9vbCAJCW1fcmVkOworICAgICAgbWV0YWRhdGFfdHlwZSAJbV9tZXRhZGF0YTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCByYl90cmVlX25vZGVfPFZhbHVlX1R5cGUsIG51bGxfdHlwZSwgX0FsbG9jPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBudWxsX3R5cGUgCW1ldGFkYXRhX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorICAgICAgcmJfdHJlZV9ub2RlXzwKKyAgICAgIFZhbHVlX1R5cGUsCisgICAgICBudWxsX3R5cGUsCisgICAgICBfQWxsb2M+ID46Om90aGVyOjpwb2ludGVyCisgICAgICBub2RlX3BvaW50ZXI7CisKKyAgICAgIGJvb2wKKyAgICAgIHNwZWNpYWwoKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9yZWQ7IH0KKworI2lmZGVmIFBCX0RTX0JJTl9TRUFSQ0hfVFJFRV9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3QKKyAgICAgIHsgc3RkOjpjb3V0IDw8IFBCX0RTX1YyRihtX3ZhbHVlKSA8PChtX3JlZD8gIiA8cj4gIiA6ICIgPGI+ICIpOyB9CisjZW5kaWYgCisKKyAgICAgIG5vZGVfcG9pbnRlciAJbV9wX2xlZnQ7CisgICAgICBub2RlX3BvaW50ZXIgCW1fcF9yaWdodDsKKyAgICAgIG5vZGVfcG9pbnRlciAJbV9wX3BhcmVudDsKKyAgICAgIHZhbHVlX3R5cGUgCW1fdmFsdWU7CisgICAgICBib29sIAkJbV9yZWQ7CisgICAgfTsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vcmJfdHJlZV8uaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9yYl90cmVlXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlMmJhYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vcmJfdHJlZV8uaHBwCkBAIC0wLDAgKzEsMjQ4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJiX3RyZWVfbWFwXy9yYl90cmVlXy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciBSZWQgQmxhY2sgdHJlZXMuCisgKi8KKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3RhbmRhcmRfcG9saWNpZXMuaHBwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIENtcF9GbiwgXAorCSAgICAgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjIGRlZmluZSBQQl9EU19SQl9UUkVFX05BTUUgcmJfdHJlZV9tYXAKKyMgZGVmaW5lIFBCX0RTX1JCX1RSRUVfQkFTRV9OQU1FIGJpbl9zZWFyY2hfdHJlZV9tYXAKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyMgZGVmaW5lIFBCX0RTX1JCX1RSRUVfTkFNRSByYl90cmVlX3NldAorIyBkZWZpbmUgUEJfRFNfUkJfVFJFRV9CQVNFX05BTUUgYmluX3NlYXJjaF90cmVlX3NldAorI2VuZGlmCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIFBCX0RTX1JCX1RSRUVfTkFNRTxLZXksIE1hcHBlZCwgQ21wX0ZuLCBOb2RlX0FuZF9JdF9UcmFpdHMsIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19SQl9UUkVFX0JBU0UgXAorICAgIFBCX0RTX1JCX1RSRUVfQkFTRV9OQU1FPEtleSwgTWFwcGVkLCBDbXBfRm4sIE5vZGVfQW5kX0l0X1RyYWl0cywgX0FsbG9jPgorCisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmIFJlZC1CbGFjayB0cmVlLgorICAgICAqICBAaW5ncm91cCBicmFuY2gtZGV0YWlsCisgICAgICoKKyAgICAgKiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGFuIGlkZWEgZnJvbSB0aGUgU0dJIFNUTCAodXNpbmcgYQorICAgICAqICBAYSBoZWFkZXIgbm9kZSB3aGljaCBpcyBuZWVkZWQgZm9yIGVmZmljaWVudCBpdGVyYXRpb24pLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICAgIHR5cGVuYW1lIENtcF9GbiwKKwkgICAgIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0cywKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBQQl9EU19SQl9UUkVFX05BTUUgOiBwdWJsaWMgUEJfRFNfUkJfVFJFRV9CQVNFCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIFBCX0RTX1JCX1RSRUVfQkFTRSAJCSAgICAgICAJIGJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3BvaW50ZXIgCQkgbm9kZV9wb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiByYl90cmVlX3RhZyAJCQkJIGNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgQ21wX0ZuIAkJCQkJIGNtcF9mbjsKKyAgICAgIHR5cGVkZWYgX0FsbG9jIAkJCQkJIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIAkJIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfdHlwZSAJCSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfcG9pbnRlciAJCSBrZXlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfY29uc3RfcG9pbnRlciAJIGtleV9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmtleV9yZWZlcmVuY2UgCSBrZXlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmtleV9jb25zdF9yZWZlcmVuY2UgCSBrZXlfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om1hcHBlZF90eXBlIAkJIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om1hcHBlZF9wb2ludGVyIAkgbWFwcGVkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bWFwcGVkX2NvbnN0X3BvaW50ZXIgCSBtYXBwZWRfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjptYXBwZWRfcmVmZXJlbmNlIAkgbWFwcGVkX3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjptYXBwZWRfY29uc3RfcmVmZXJlbmNlIG1hcHBlZF9jb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6dmFsdWVfdHlwZSAJCSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50ZXIgCQkgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9wb2ludGVyIAkgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpyZWZlcmVuY2UgCQkgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAJIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludF9pdGVyYXRvciAJIHBvaW50X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIAkgcG9pbnRfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aXRlcmF0b3IgCQkgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgCSBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yIAkgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV91cGRhdGUgCQkgbm9kZV91cGRhdGU7CisKKyAgICAgIFBCX0RTX1JCX1RSRUVfTkFNRSgpOworCisgICAgICBQQl9EU19SQl9UUkVFX05BTUUoY29uc3QgQ21wX0ZuJik7CisKKyAgICAgIFBCX0RTX1JCX1RSRUVfTkFNRShjb25zdCBDbXBfRm4mLCBjb25zdCBub2RlX3VwZGF0ZSYpOworCisgICAgICBQQl9EU19SQl9UUkVFX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICAgIHZvaWQKKyAgICAgIGNvcHlfZnJvbV9yYW5nZShJdCwgSXQpOworCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBtYXBwZWRfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCisgICAgICB7CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCXN0ZDo6cGFpcjxwb2ludF9pdGVyYXRvciwgYm9vbD4gaW5zX3BhaXIgPQorCWJhc2VfdHlwZTo6aW5zZXJ0X2xlYWYodmFsdWVfdHlwZShyX2tleSwgbWFwcGVkX3R5cGUoKSkpOworCisJaWYgKGluc19wYWlyLnNlY29uZCA9PSB0cnVlKQorCSAgeworCSAgICBpbnNfcGFpci5maXJzdC5tX3BfbmQtPm1fcmVkID0gdHJ1ZTsKKwkgICAgX0dMSUJDWFhfREVCVUdfT05MWSh0aGlzLT5zdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisJICAgIGluc2VydF9maXh1cChpbnNfcGFpci5maXJzdC5tX3BfbmQpOworCSAgfQorCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCXJldHVybiBpbnNfcGFpci5maXJzdC5tX3BfbmQtPm1fdmFsdWUuc2Vjb25kOworI2Vsc2UKKwlpbnNlcnQocl9rZXkpOworCXJldHVybiBiYXNlX3R5cGU6OnNfbnVsbF90eXBlOworI2VuZGlmCisgICAgICB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcmFzZShrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvcik7CisKKyAgICAgIGlubGluZSByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBlcmFzZShyZXZlcnNlX2l0ZXJhdG9yKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIGVyYXNlX2lmKFByZWQpOworCisgICAgICB2b2lkCisgICAgICBqb2luKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0KGtleV9jb25zdF9yZWZlcmVuY2UsIFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICBwcml2YXRlOgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgc2l6ZV90eXBlCisgICAgICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KGNvbnN0IG5vZGVfcG9pbnRlciwgY29uc3QgY2hhciosIGludCkgY29uc3Q7CisjZW5kaWYKKworICAgICAgaW5saW5lIHN0YXRpYyBib29sCisgICAgICBpc19lZmZlY3RpdmVseV9ibGFjayhjb25zdCBub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICBpbml0aWFsaXplKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydF9maXh1cChub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZV9ub2RlKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlbW92ZV9ub2RlKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlbW92ZV9maXh1cChub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0X2ltcChub2RlX3BvaW50ZXIsIFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIHNwbGl0X21pbigpOworCisgICAgICBzdGQ6OnBhaXI8bm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXI+CisgICAgICBzcGxpdF9taW5faW1wKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGpvaW5faW1wKG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyKTsKKworICAgICAgc3RkOjpwYWlyPG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyPgorICAgICAgZmluZF9qb2luX3Bvc19yaWdodChub2RlX3BvaW50ZXIsIHNpemVfdHlwZSwgc2l6ZV90eXBlKTsKKworICAgICAgc3RkOjpwYWlyPG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyPgorICAgICAgZmluZF9qb2luX3Bvc19sZWZ0KG5vZGVfcG9pbnRlciwgc2l6ZV90eXBlLCBzaXplX3R5cGUpOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBibGFja19oZWlnaHQobm9kZV9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgc3BsaXRfYXRfbm9kZShub2RlX3BvaW50ZXIsIFBCX0RTX0NMQVNTX0NfREVDJik7CisgICAgfTsKKworI2RlZmluZSBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoWCkJCQkJXAorICBfR0xJQkNYWF9ERUJVR19PTkxZKFguc3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vaW5mb19mbl9pbXBzLmhwcD4KKworI3VuZGVmIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRAorI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19SQl9UUkVFX05BTUUKKyN1bmRlZiBQQl9EU19SQl9UUkVFX0JBU0VfTkFNRQorI3VuZGVmIFBCX0RTX1JCX1RSRUVfQkFTRQorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWIwNjc3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMzA2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJiX3RyZWVfbWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmJfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citqb2luKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgaWYgKGJhc2VfdHlwZTo6am9pbl9wcmVwKG90aGVyKSA9PSBmYWxzZSkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY29uc3Qgbm9kZV9wb2ludGVyIHBfeCA9IG90aGVyLnNwbGl0X21pbigpOworICBqb2luX2ltcChwX3gsIG90aGVyLm1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgYmFzZV90eXBlOjpqb2luX2ZpbmlzaChvdGhlcik7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbl9pbXAobm9kZV9wb2ludGVyIHBfeCwgbm9kZV9wb2ludGVyIHBfcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeCAhPSAwKTsKKyAgaWYgKHBfciAhPSAwKQorICAgIHBfci0+bV9yZWQgPSBmYWxzZTsKKworICBjb25zdCBzaXplX3R5cGUgaCA9IGJsYWNrX2hlaWdodChiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgY29uc3Qgc2l6ZV90eXBlIG90aGVyX2ggPSBibGFja19oZWlnaHQocF9yKTsKKyAgbm9kZV9wb2ludGVyIHBfeF9sOworICBub2RlX3BvaW50ZXIgcF94X3I7CisgIHN0ZDo6cGFpcjxub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcj4gam9pbl9wb3M7CisgIGNvbnN0IGJvb2wgcmlnaHRfam9pbiA9IGggPj0gb3RoZXJfaDsKKyAgaWYgKHJpZ2h0X2pvaW4pCisgICAgeworICAgICAgam9pbl9wb3MgPSBmaW5kX2pvaW5fcG9zX3JpZ2h0KGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQsIAorCQkJCSAgICAgaCwgb3RoZXJfaCk7CisgICAgICBwX3hfbCA9IGpvaW5fcG9zLmZpcnN0OworICAgICAgcF94X3IgPSBwX3I7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcF94X2wgPSBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50OworICAgICAgYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfcjsKKyAgICAgIGlmIChwX3IgIT0gMCkKKwlwX3ItPm1fcF9wYXJlbnQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkOworCisgICAgICBqb2luX3BvcyA9IGZpbmRfam9pbl9wb3NfbGVmdChiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50LCAKKwkJCQkgICAgaCwgb3RoZXJfaCk7CisgICAgICBwX3hfciA9IGpvaW5fcG9zLmZpcnN0OworICAgIH0KKworICBub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBqb2luX3Bvcy5zZWNvbmQ7CisgIGlmIChwX3BhcmVudCA9PSBiYXNlX3R5cGU6Om1fcF9oZWFkKQorICAgIHsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX3g7CisgICAgICBwX3gtPm1fcF9wYXJlbnQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBfeC0+bV9wX3BhcmVudCA9IHBfcGFyZW50OworICAgICAgaWYgKHJpZ2h0X2pvaW4pCisJcF94LT5tX3BfcGFyZW50LT5tX3BfcmlnaHQgPSBwX3g7CisgICAgICBlbHNlCisJcF94LT5tX3BfcGFyZW50LT5tX3BfbGVmdCA9IHBfeDsKKyAgICB9CisKKyAgcF94LT5tX3BfbGVmdCA9IHBfeF9sOworICBpZiAocF94X2wgIT0gMCkKKyAgICBwX3hfbC0+bV9wX3BhcmVudCA9IHBfeDsKKworICBwX3gtPm1fcF9yaWdodCA9IHBfeF9yOworICBpZiAocF94X3IgIT0gMCkKKyAgICBwX3hfci0+bV9wX3BhcmVudCA9IHBfeDsKKworICBwX3gtPm1fcmVkID0gdHJ1ZTsKKworICBiYXNlX3R5cGU6OmluaXRpYWxpemVfbWluX21heCgpOworICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgYmFzZV90eXBlOjp1cGRhdGVfdG9fdG9wKHBfeCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisgIGluc2VydF9maXh1cChwX3gpOworICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdF9taW4oKQoreworICBub2RlX3BvaW50ZXIgcF9taW4gPSBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfbGVmdDsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGNvbnN0IG5vZGVfcG9pbnRlciBwX2hlYWQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9taW4gIT0gcF9oZWFkKTsKKyNlbmRpZiAKKworICByZW1vdmVfbm9kZShwX21pbik7CisgIHJldHVybiBwX21pbjsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3N0ZDo6cGFpcjwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlciwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcj4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfam9pbl9wb3NfcmlnaHQobm9kZV9wb2ludGVyIHBfbCwgc2l6ZV90eXBlIGhfbCwgc2l6ZV90eXBlIGhfcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGhfbCA+PSBoX3IpOworCisgIGlmIChiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ID09IDApCisgICAgcmV0dXJuIChzdGQ6Om1ha2VfcGFpcigobm9kZV9wb2ludGVyKTAsIGJhc2VfdHlwZTo6bV9wX2hlYWQpKTsKKworICBub2RlX3BvaW50ZXIgcF9sX3BhcmVudCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisgIHdoaWxlIChoX2wgPiBoX3IpCisgICAgeworICAgICAgaWYgKHBfbC0+bV9yZWQgPT0gZmFsc2UpCisgICAgICAgIHsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChoX2wgPiAwKTsKKwkgIC0taF9sOworICAgICAgICB9CisKKyAgICAgIHBfbF9wYXJlbnQgPSBwX2w7CisgICAgICBwX2wgPSBwX2wtPm1fcF9yaWdodDsKKyAgICB9CisKKyAgaWYgKCFpc19lZmZlY3RpdmVseV9ibGFjayhwX2wpKQorICAgIHsKKyAgICAgIHBfbF9wYXJlbnQgPSBwX2w7CisgICAgICBwX2wgPSBwX2wtPm1fcF9yaWdodDsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGlzX2VmZmVjdGl2ZWx5X2JsYWNrKHBfbCkpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmxhY2tfaGVpZ2h0KHBfbCkgPT0gaF9yKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbCA9PSAwIHx8IHBfbC0+bV9wX3BhcmVudCA9PSBwX2xfcGFyZW50KTsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBfbCwgcF9sX3BhcmVudCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitzdGQ6OnBhaXI8CisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIsCisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXI+CitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2pvaW5fcG9zX2xlZnQobm9kZV9wb2ludGVyIHBfciwgc2l6ZV90eXBlIGhfbCwgc2l6ZV90eXBlIGhfcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGhfciA+IGhfbCk7CisgIGlmIChiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ID09IDApCisgICAgcmV0dXJuIChzdGQ6Om1ha2VfcGFpcigobm9kZV9wb2ludGVyKTAsCisJCQkgICBiYXNlX3R5cGU6Om1fcF9oZWFkKSk7CisgIG5vZGVfcG9pbnRlciBwX3JfcGFyZW50ID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgd2hpbGUgKGhfciA+IGhfbCkKKyAgICB7CisgICAgICBpZiAocF9yLT5tX3JlZCA9PSBmYWxzZSkKKyAgICAgICAgeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGhfciA+IDApOworCSAgLS1oX3I7CisgICAgICAgIH0KKworICAgICAgcF9yX3BhcmVudCA9IHBfcjsKKyAgICAgIHBfciA9IHBfci0+bV9wX2xlZnQ7CisgICAgfQorCisgIGlmICghaXNfZWZmZWN0aXZlbHlfYmxhY2socF9yKSkKKyAgICB7CisgICAgICBwX3JfcGFyZW50ID0gcF9yOworICAgICAgcF9yID0gcF9yLT5tX3BfbGVmdDsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGlzX2VmZmVjdGl2ZWx5X2JsYWNrKHBfcikpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmxhY2tfaGVpZ2h0KHBfcikgPT0gaF9sKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfciA9PSAwIHx8IHBfci0+bV9wX3BhcmVudCA9PSBwX3JfcGFyZW50KTsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBfciwgcF9yX3BhcmVudCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmxhY2tfaGVpZ2h0KG5vZGVfcG9pbnRlciBwX25kKQoreworICBzaXplX3R5cGUgaCA9IDE7CisgIHdoaWxlIChwX25kICE9IDApCisgICAgeworICAgICAgaWYgKHBfbmQtPm1fcmVkID09IGZhbHNlKQorCSsraDsKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfbGVmdDsKKyAgICB9CisgIHJldHVybiBoOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsaXQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorCisgIGlmIChiYXNlX3R5cGU6OnNwbGl0X3ByZXAocl9rZXksIG90aGVyKSA9PSBmYWxzZSkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSB0aGlzLT51cHBlcl9ib3VuZChyX2tleSkubV9wX25kOworICBkbworICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHRfbmQgPSBwX25kLT5tX3BfcGFyZW50OworICAgICAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpKSkKKwlzcGxpdF9hdF9ub2RlKHBfbmQsIG90aGVyKTsKKworICAgICAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQob3RoZXIpCisgICAgICBwX25kID0gcF9uZXh0X25kOworICAgIH0KKyAgd2hpbGUgKHBfbmQgIT0gYmFzZV90eXBlOjptX3BfaGVhZCk7CisKKyAgYmFzZV90eXBlOjpzcGxpdF9maW5pc2gob3RoZXIpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGl0X2F0X25vZGUobm9kZV9wb2ludGVyIHBfbmQsIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisKKyAgbm9kZV9wb2ludGVyIHBfbCA9IHBfbmQtPm1fcF9sZWZ0OworICBub2RlX3BvaW50ZXIgcF9yID0gcF9uZC0+bV9wX3JpZ2h0OworICBub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBwX25kLT5tX3BfcGFyZW50OworICBpZiAocF9wYXJlbnQgPT0gYmFzZV90eXBlOjptX3BfaGVhZCkKKyAgICB7CisgICAgICBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcF9sOworICAgICAgaWYgKHBfbCAhPSAwKQorICAgICAgICB7CisJICBwX2wtPm1fcF9wYXJlbnQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkOworCSAgcF9sLT5tX3JlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHBfcGFyZW50LT5tX3BfbGVmdCA9PSBwX25kKQorCXBfcGFyZW50LT5tX3BfbGVmdCA9IHBfbDsKKyAgICAgIGVsc2UKKwlwX3BhcmVudC0+bV9wX3JpZ2h0ID0gcF9sOworCisgICAgICBpZiAocF9sICE9IDApCisJcF9sLT5tX3BfcGFyZW50ID0gcF9wYXJlbnQ7CisKKyAgICAgIHRoaXMtPnVwZGF0ZV90b190b3AocF9wYXJlbnQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworCisgICAgICBpZiAoIXBfbmQtPm1fcmVkKQorCXJlbW92ZV9maXh1cChwX2wsIHBfcGFyZW50KTsKKyAgICB9CisKKyAgYmFzZV90eXBlOjppbml0aWFsaXplX21pbl9tYXgoKTsKKyAgb3RoZXIuam9pbl9pbXAocF9uZCwgcF9yKTsKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRChvdGhlcikKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy90cmFpdHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy90cmFpdHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMjdkNTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL3RyYWl0cy5ocHAKQEAgLTAsMCArMSwxMDIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmJfdHJlZV9tYXBfL3RyYWl0cy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByYl90cmVlXy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1JCX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUAorI2RlZmluZSBQQl9EU19SQl9UUkVFX05PREVfQU5EX0lUX1RSQUlUU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL25vZGUuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24uCisgICAgLy8vIEBpbmdyb3VwIHRyYWl0cworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICAgIHR5cGVuYW1lIENtcF9GbiwKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwKKwkJICAgICAgdHlwZW5hbWUgTm9kZV9JdHIsCisJCSAgICAgIHR5cGVuYW1lIENtcF9Gbl8sCisJCSAgICAgIHR5cGVuYW1lIF9BbGxvY18+CisJICAgICBjbGFzcyBOb2RlX1VwZGF0ZSwKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgdHJlZV90cmFpdHM8S2V5LCBNYXBwZWQsIENtcF9GbiwgTm9kZV9VcGRhdGUsIHJiX3RyZWVfdGFnLF9BbGxvYz4gCisgICAgOiBwdWJsaWMgYmluX3NlYXJjaF90cmVlX3RyYWl0czwKKyAgICAgIEtleSwKKyAgICAgIE1hcHBlZCwKKyAgICAgIENtcF9GbiwKKyAgICAgIE5vZGVfVXBkYXRlLAorICAgICAgcmJfdHJlZV9ub2RlXzwKKwl0eXBlbmFtZSB0eXBlc190cmFpdHM8S2V5LCBNYXBwZWQsIF9BbGxvYywgZmFsc2U+Ojp2YWx1ZV90eXBlLAorCXR5cGVuYW1lIHRyZWVfbm9kZV9tZXRhZGF0YV9kaXNwYXRjaDxLZXksIE1hcHBlZCwgQ21wX0ZuLCBOb2RlX1VwZGF0ZSwKKwkJCQkJICAgICBfQWxsb2M+Ojp0eXBlLAorCV9BbGxvYz4sCisgICAgICBfQWxsb2M+CisgICAgeyB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uLgorICAgIC8vLyBAaW5ncm91cCB0cmFpdHMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBDbXBfRm4sCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsCisJCSAgICAgIHR5cGVuYW1lIE5vZGVfSXRyLAorCQkgICAgICB0eXBlbmFtZSBDbXBfRm5fLAorCQkgICAgICB0eXBlbmFtZSBfQWxsb2NfPgorCSAgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHRyZWVfdHJhaXRzPEtleSwgbnVsbF90eXBlLCBDbXBfRm4sIE5vZGVfVXBkYXRlLCByYl90cmVlX3RhZyxfQWxsb2M+IAorICAgIDogcHVibGljIGJpbl9zZWFyY2hfdHJlZV90cmFpdHM8CisgICAgICBLZXksCisgICAgICBudWxsX3R5cGUsCisgICAgICBDbXBfRm4sCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIHJiX3RyZWVfbm9kZV88CisgICAgICB0eXBlbmFtZSB0eXBlc190cmFpdHM8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgZmFsc2U+Ojp2YWx1ZV90eXBlLAorICAgICAgdHlwZW5hbWUgdHJlZV9ub2RlX21ldGFkYXRhX2Rpc3BhdGNoPEtleSwgbnVsbF90eXBlLCBDbXBfRm4sIE5vZGVfVXBkYXRlLAorCQkJCQkgICBfQWxsb2M+Ojp0eXBlLAorCV9BbGxvYz4sCisJICBfQWxsb2M+CisgICAgeyB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2MmZiYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDg0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJjX2Jpbm9taWFsX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmNfYmlub21pYWxfaGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JjX2Jpbm9taWFsX2hlYXAoKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JjX2Jpbm9taWFsX2hlYXAoY29uc3QgQ21wX0ZuJiByX2NtcF9mbikgCis6IGJhc2VfdHlwZShyX2NtcF9mbikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CityY19iaW5vbWlhbF9oZWFwKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgCis6IGJhc2VfdHlwZShvdGhlcikKK3sKKyAgbWFrZV9iaW5vbWlhbF9oZWFwKCk7CisgIGJhc2VfdHlwZTo6ZmluZF9tYXgoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+cmNfYmlub21pYWxfaGVhcCgpCit7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorCisgIGJhc2VfdHlwZTo6c3dhcChvdGhlcik7CisgIG1fcmMuc3dhcChvdGhlci5tX3JjKTsKKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODcxMzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMjEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmNfYmlub21pYWxfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByY19iaW5vbWlhbF9oZWFwXy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGJhc2VfdHlwZTo6YXNzZXJ0X3ZhbGlkKGZhbHNlLCBfX2ZpbGUsIF9fbGluZSk7CisgIGlmICghYmFzZV90eXBlOjplbXB0eSgpKQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShiYXNlX3R5cGU6Om1fcF9tYXggIT0gMCk7CisgICAgICBiYXNlX3R5cGU6OmFzc2VydF9tYXgoX19maWxlLCBfX2xpbmUpOworICAgIH0KKworICBtX3JjLmFzc2VydF92YWxpZChfX2ZpbGUsIF9fbGluZSk7CisKKyAgaWYgKG1fcmMuZW1wdHkoKSkKKyAgICB7CisgICAgICBiYXNlX3R5cGU6OmFzc2VydF92YWxpZCh0cnVlLCBfX2ZpbGUsIF9fbGluZSk7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkobmV4dF8yX3BvaW50ZXIoYmFzZV90eXBlOjptX3Bfcm9vdCkgPT0gMCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG5vZGVfY29uc3RfcG9pbnRlciBwX25kID0gbmV4dF8yX3BvaW50ZXIoYmFzZV90eXBlOjptX3Bfcm9vdCk7CisgIHR5cGVuYW1lIHJjX3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYy5lbmQoKTsKKyAgLS1pdDsKKworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWSgqaXQgPT0gcF9uZCk7CisgICAgICBub2RlX2NvbnN0X3BvaW50ZXIgcF9uZXh0ID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25leHQgIT0gMCk7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkocF9uZC0+bV9tZXRhZGF0YSA9PSBwX25leHQtPm1fbWV0YWRhdGEpOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKHBfbmV4dC0+bV9wX25leHRfc2libGluZyA9PSAwIHx8CisJCSAgICAgICBwX25leHQtPm1fbWV0YWRhdGEgPCBwX25leHQtPm1fcF9uZXh0X3NpYmxpbmctPm1fbWV0YWRhdGEpOworCisgICAgICAtLWl0OworICAgICAgcF9uZCA9IG5leHRfMl9wb2ludGVyKG5leHRfYWZ0ZXJfMF9wb2ludGVyKHBfbmQpKTsKKyAgICB9CisgIFBCX0RTX0RFQlVHX1ZFUklGWShpdCArIDEgPT0gbV9yYy5iZWdpbigpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2NvbnN0X3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25leHRfMl9wb2ludGVyKG5vZGVfY29uc3RfcG9pbnRlciBwX25kKQoreworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybiAwOworCisgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworCisgIGlmIChwX25leHQgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBpZiAocF9uZC0+bV9tZXRhZGF0YSA9PSBwX25leHQtPm1fbWV0YWRhdGEpCisgICAgcmV0dXJuIHBfbmQ7CisKKyAgcmV0dXJuIG5leHRfMl9wb2ludGVyKHBfbmV4dCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9jb25zdF9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CituZXh0X2FmdGVyXzBfcG9pbnRlcihub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKworICBpZiAocF9uZXh0ID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHBfbmQtPm1fbWV0YWRhdGEgPCBwX25leHQtPm1fbWV0YWRhdGEpCisgICAgcmV0dXJuIHBfbmV4dDsKKworICByZXR1cm4gbmV4dF9hZnRlcl8wX3BvaW50ZXIocF9uZXh0KTsKK30KKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNDdiZTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmNfYmlub21pYWxfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByY19iaW5vbWlhbF9oZWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BvcCgpCit7CisgIG1ha2VfYmlub21pYWxfaGVhcCgpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWJhc2VfdHlwZTo6ZW1wdHkoKSk7CisgIGJhc2VfdHlwZTo6cG9wKCk7CisgIGJhc2VfdHlwZTo6ZmluZF9tYXgoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyKCkKK3sKKyAgYmFzZV90eXBlOjpjbGVhcigpOworICBtX3JjLmNsZWFyKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CittYWtlX2Jpbm9taWFsX2hlYXAoKQoreworICBub2RlX3BvaW50ZXIgcF9uZCA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisgIHdoaWxlIChwX25kICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBpZiAocF9uZXh0ID09IDApCisJcF9uZCA9IHBfbmV4dDsKKyAgICAgIGVsc2UgaWYgKHBfbmQtPm1fbWV0YWRhdGEgPT0gcF9uZXh0LT5tX21ldGFkYXRhKQorCXBfbmQgPSBsaW5rX3dpdGhfbmV4dF9zaWJsaW5nKHBfbmQpOworICAgICAgZWxzZSBpZiAocF9uZC0+bV9tZXRhZGF0YSA8IHBfbmV4dC0+bV9tZXRhZGF0YSkKKwlwX25kID0gcF9uZXh0OworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICBlbHNlCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworI2VuZGlmIAorICAgIH0KKworICBtX3JjLmNsZWFyKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaWYoUHJlZCBwcmVkKQoreworICBtYWtlX2Jpbm9taWFsX2hlYXAoKTsKKyAgY29uc3Qgc2l6ZV90eXBlIGVyc2QgPSBiYXNlX3R5cGU6OmVyYXNlX2lmKHByZWQpOworICBiYXNlX3R5cGU6OmZpbmRfbWF4KCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gZXJzZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKHBvaW50X2l0ZXJhdG9yIGl0KQoreworICBtYWtlX2Jpbm9taWFsX2hlYXAoKTsKKyAgYmFzZV90eXBlOjplcmFzZShpdCk7CisgIGJhc2VfdHlwZTo6ZmluZF9tYXgoKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1OTA1ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxNTQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmNfYmlub21pYWxfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmNfYmlub21pYWxfaGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3B1c2goY29uc3RfcmVmZXJlbmNlIHJfdmFsKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKworICBtYWtlXzBfZXhwb3NlZCgpOworCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCisgIG5vZGVfcG9pbnRlciBwX25kID0gYmFzZV90eXBlOjpnZXRfbmV3X25vZGVfZm9yX2luc2VydChyX3ZhbCk7CisKKyAgcF9uZC0+bV9wX2xfY2hpbGQgPSBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworICBwX25kLT5tX21ldGFkYXRhID0gMDsKKworICBpZiAoYmFzZV90eXBlOjptX3BfbWF4ID09IDAgfHwgQ21wX0ZuOjpvcGVyYXRvcigpKGJhc2VfdHlwZTo6bV9wX21heC0+bV92YWx1ZSwgcl92YWwpKQorICAgIGJhc2VfdHlwZTo6bV9wX21heCA9IHBfbmQ7CisKKyAgcF9uZC0+bV9wX25leHRfc2libGluZyA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisKKyAgaWYgKGJhc2VfdHlwZTo6bV9wX3Jvb3QgIT0gMCkKKyAgICBiYXNlX3R5cGU6Om1fcF9yb290LT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kOworCisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBwX25kOworCisgIGlmIChwX25kLT5tX3BfbmV4dF9zaWJsaW5nICE9IDAmJiAgcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSA9PSAwKQorICAgIG1fcmMucHVzaChwX25kKTsKKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKworICByZXR1cm4gcG9pbnRfaXRlcmF0b3IocF9uZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cittb2RpZnkocG9pbnRfaXRlcmF0b3IgaXQsIGNvbnN0X3JlZmVyZW5jZSByX25ld192YWwpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCisgIG1ha2VfYmlub21pYWxfaGVhcCgpOworCisgIGJhc2VfdHlwZTo6bW9kaWZ5KGl0LCByX25ld192YWwpOworCisgIGJhc2VfdHlwZTo6ZmluZF9tYXgoKTsKKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitsaW5rX3dpdGhfbmV4dF9zaWJsaW5nKG5vZGVfcG9pbnRlciBwX25kKQoreworICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZXh0ICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZXh0LT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gcF9uZCk7CisKKyAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShwX25kLT5tX3ZhbHVlLCBwX25leHQtPm1fdmFsdWUpKQorICAgIHsKKyAgICAgIHBfbmV4dC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50OworCisgICAgICBpZiAocF9uZXh0LT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gMCkKKwliYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZXh0OworICAgICAgZWxzZQorCXBfbmV4dC0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZXh0OworCisgICAgICBpZiAoYmFzZV90eXBlOjptX3BfbWF4ID09IHBfbmQpCisJYmFzZV90eXBlOjptX3BfbWF4ID0gcF9uZXh0OworCisgICAgICBiYXNlX3R5cGU6Om1ha2VfY2hpbGRfb2YocF9uZCwgcF9uZXh0KTsKKworICAgICAgKytwX25leHQtPm1fbWV0YWRhdGE7CisKKyAgICAgIHJldHVybiBwX25leHQ7CisgICAgfQorCisgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25leHQtPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgaWYgKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kOworCisgIGlmIChiYXNlX3R5cGU6Om1fcF9tYXggPT0gcF9uZXh0KQorICAgIGJhc2VfdHlwZTo6bV9wX21heCA9IHBfbmQ7CisKKyAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKHBfbmV4dCwgcF9uZCk7CisKKyAgKytwX25kLT5tX21ldGFkYXRhOworCisgIHJldHVybiBwX25kOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWFrZV8wX2V4cG9zZWQoKQoreworICBpZiAobV9yYy5lbXB0eSgpKQorICAgIHJldHVybjsKKworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcmMudG9wKCk7CisKKyAgbV9yYy5wb3AoKTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fbWV0YWRhdGEgPT0gcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSk7CisKKyAgbm9kZV9wb2ludGVyIHBfcmVzID0gbGlua193aXRoX25leHRfc2libGluZyhwX25kKTsKKworICBpZiAocF9yZXMtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCYmICBwX3Jlcy0+bV9tZXRhZGF0YSA9PSBwX3Jlcy0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSkKKyAgICBtX3JjLnB1c2gocF9yZXMpOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3JjLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9yYy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4MjU4ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9yYy5ocHAKQEAgLTAsMCArMSwyNDAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmNfYmlub21pYWxfaGVhcF8vcmMuaHBwCisgKiBDb250YWlucyBhIHJlZHVuZGFudCAoYmluYXJ5IGNvdW50ZXIpLgorICovCisKKyNpZm5kZWYgUEJfRFNfUkNfSFBQCisjZGVmaW5lIFBCX0RTX1JDX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gUmVkdW5kYW50IGJpbmFyeSBjb3VudGVyLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgcmMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX0FsbG9jIAkJCQkJIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlIAkgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBfTm9kZSAJCQkJCSBub2RlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPG5vZGU+CSBfX3JlYmluZF9uOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9uOjpvdGhlcjo6cG9pbnRlciAgICAgIAkgbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPG5vZGVfcG9pbnRlcj4gIF9fcmViaW5kX25wOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX25wOjpvdGhlcjo6cG9pbnRlciAJIGVudHJ5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX25wOjpvdGhlcjo6Y29uc3RfcG9pbnRlciBlbnRyeV9jb25zdF9wb2ludGVyOworCisgICAgICBlbnVtCisJeworCSAgbWF4X2VudHJpZXMgPSBzaXplb2Yoc2l6ZV90eXBlKSA8PCAzCisJfTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgbm9kZV9wb2ludGVyIAkJCQkgZW50cnk7CisgICAgICB0eXBlZGVmIGVudHJ5X2NvbnN0X3BvaW50ZXIgCQkJIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICByYygpOworCisgICAgICByYyhjb25zdCByYyYpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3dhcChyYyYpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcHVzaChlbnRyeSk7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIHRvcCgpIGNvbnN0OworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcG9wKCk7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlbXB0eSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0OworCisgICAgICBjb25zdCBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19SQ19CSU5PTUlBTF9IRUFQX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2UoKSBjb25zdDsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKyAgICAgIG5vZGVfcG9pbnRlciAJbV9hX2VudHJpZXNbbWF4X2VudHJpZXNdOworICAgICAgc2l6ZV90eXBlIAltX292ZXJfdG9wOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTm9kZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHJjPF9Ob2RlLCBfQWxsb2M+OjoKKyAgICByYygpIDogbV9vdmVyX3RvcCgwKQorICAgIHsgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgcmM8X05vZGUsIF9BbGxvYz46OgorICAgIHJjKGNvbnN0IHJjPF9Ob2RlLCBfQWxsb2M+JiBvdGhlcikgOiBtX292ZXJfdG9wKDApCisgICAgeyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX05vZGUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHJjPF9Ob2RlLCBfQWxsb2M+OjoKKyAgICBzd2FwKHJjPF9Ob2RlLCBfQWxsb2M+JiBvdGhlcikKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIG92ZXJfdG9wID0gc3RkOjptYXgobV9vdmVyX3RvcCwgb3RoZXIubV9vdmVyX3RvcCk7CisKKyAgICAgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgb3Zlcl90b3A7ICsraSkKKwlzdGQ6OnN3YXAobV9hX2VudHJpZXNbaV0sIG90aGVyLm1fYV9lbnRyaWVzW2ldKTsKKworICAgICAgc3RkOjpzd2FwKG1fb3Zlcl90b3AsIG90aGVyLm1fb3Zlcl90b3ApOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICByYzxfTm9kZSwgX0FsbG9jPjo6CisgICAgcHVzaChlbnRyeSBwX25kKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fb3Zlcl90b3AgPCBtYXhfZW50cmllcyk7CisgICAgICBtX2FfZW50cmllc1ttX292ZXJfdG9wKytdID0gcF9uZDsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICByYzxfTm9kZSwgX0FsbG9jPjo6CisgICAgcG9wKCkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghZW1wdHkoKSk7CisgICAgICAtLW1fb3Zlcl90b3A7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTm9kZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB0eXBlbmFtZSByYzxfTm9kZSwgX0FsbG9jPjo6bm9kZV9wb2ludGVyCisgICAgcmM8X05vZGUsIF9BbGxvYz46OgorICAgIHRvcCgpIGNvbnN0CisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWVtcHR5KCkpOworICAgICAgcmV0dXJuICoobV9hX2VudHJpZXMgKyBtX292ZXJfdG9wIC0gMSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX05vZGUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJjPF9Ob2RlLCBfQWxsb2M+OjoKKyAgICBlbXB0eSgpIGNvbnN0CisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICByZXR1cm4gbV9vdmVyX3RvcCA9PSAwOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHR5cGVuYW1lIHJjPF9Ob2RlLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICByYzxfTm9kZSwgX0FsbG9jPjo6CisgICAgc2l6ZSgpIGNvbnN0CisgICAgeyByZXR1cm4gbV9vdmVyX3RvcDsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX05vZGUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgcmM8X05vZGUsIF9BbGxvYz46OgorICAgIGNsZWFyKCkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIG1fb3Zlcl90b3AgPSAwOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX05vZGUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjb25zdCB0eXBlbmFtZSByYzxfTm9kZSwgX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IKKyAgICByYzxfTm9kZSwgX0FsbG9jPjo6CisgICAgYmVnaW4oKSBjb25zdAorICAgIHsgcmV0dXJuJiBtX2FfZW50cmllc1swXTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX05vZGUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjb25zdCB0eXBlbmFtZSByYzxfTm9kZSwgX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IKKyAgICByYzxfTm9kZSwgX0FsbG9jPjo6CisgICAgZW5kKCkgY29uc3QKKyAgICB7IHJldHVybiYgbV9hX2VudHJpZXNbbV9vdmVyX3RvcF07IH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX05vZGUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgcmM8X05vZGUsIF9BbGxvYz46OgorICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0CisgICAgeyBQQl9EU19ERUJVR19WRVJJRlkobV9vdmVyX3RvcCA8IG1heF9lbnRyaWVzKTsgfQorI2VuZGlmCisKKyNpZmRlZiBQQl9EU19SQ19CSU5PTUlBTF9IRUFQX1RSQUNFXworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIHJjPF9Ob2RlLCBfQWxsb2M+OjoKKyAgICB0cmFjZSgpIGNvbnN0CisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJyYyIgPDwgc3RkOjplbmRsOworICAgICAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtX292ZXJfdG9wOyArK2kpCisJc3RkOjpjZXJyIDw8IG1fYV9lbnRyaWVzW2ldIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CisgICAgfQorI2VuZGlmCit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vcmNfYmlub21pYWxfaGVhcF8uaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3JjX2Jpbm9taWFsX2hlYXBfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjBiOTY4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3JjX2Jpbm9taWFsX2hlYXBfLmhwcApAQCAtMCwwICsxLDE3MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByY19iaW5vbWlhbF9oZWFwXy9yY19iaW5vbWlhbF9oZWFwXy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByZWR1bmRhbnQtY291bnRlciBiaW5vbWlhbCBoZWFwLgorICovCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vYmlub21pYWxfaGVhcF9iYXNlXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9yYy5ocHA+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgcmNfYmlub21pYWxfaGVhcDxWYWx1ZV9UeXBlLCBDbXBfRm4sIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19SQ19DX0RFQyBcCisgICAgcmM8dHlwZW5hbWUgYmlub21pYWxfaGVhcF9iYXNlPFZhbHVlX1R5cGUsIENtcF9GbiwgX0FsbG9jPjo6bm9kZSwgX0FsbG9jPgorCisgICAgLyoqCisgICAgICogIFJlZHVuZGFudC1jb3VudGVyIGJpbm9taWFsIGhlYXAuCisgICAgICoKKyAgICAgKiAgQGluZ3JvdXAgaGVhcC1kZXRhaWwKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyByY19iaW5vbWlhbF9oZWFwCisgICAgOiBwdWJsaWMgYmlub21pYWxfaGVhcF9iYXNlPFZhbHVlX1R5cGUsIENtcF9GbiwgX0FsbG9jPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBiaW5vbWlhbF9oZWFwX2Jhc2U8VmFsdWVfVHlwZSwgQ21wX0ZuLCBfQWxsb2M+CisgICAgICAJCQkJCQkJYmFzZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om5vZGVfcG9pbnRlciAJCW5vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX2NvbnN0X3BvaW50ZXIgCW5vZGVfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgUEJfRFNfUkNfQ19ERUMgCQkJCXJjX3Q7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgCQkJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAkJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludGVyIAkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9wb2ludGVyIAljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnJlZmVyZW5jZSAJCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludF9jb25zdF9pdGVyYXRvciAJcG9pbnRfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfaXRlcmF0b3IgCXBvaW50X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIAljb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjppdGVyYXRvciAJCWl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNtcF9mbiAJCWNtcF9mbjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjphbGxvY2F0b3JfdHlwZSAJYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIHJjX2Jpbm9taWFsX2hlYXAoKTsKKworICAgICAgcmNfYmlub21pYWxfaGVhcChjb25zdCBDbXBfRm4mKTsKKworICAgICAgcmNfYmlub21pYWxfaGVhcChjb25zdCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB+cmNfYmlub21pYWxfaGVhcCgpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgcHVzaChjb25zdF9yZWZlcmVuY2UpOworCisgICAgICB2b2lkCisgICAgICBtb2RpZnkocG9pbnRfaXRlcmF0b3IsIGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBwb3AoKTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2UocG9pbnRfaXRlcmF0b3IpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgY2xlYXIoKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2VfaWYoUHJlZCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICB2b2lkCisgICAgICBzcGxpdChQcmVkLCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBqb2luKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19SQ19CSU5PTUlBTF9IRUFQX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2UoKSBjb25zdDsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgbGlua193aXRoX25leHRfc2libGluZyhub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICBtYWtlXzBfZXhwb3NlZCgpOworCisgICAgICB2b2lkCisgICAgICBtYWtlX2Jpbm9taWFsX2hlYXAoKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICBzdGF0aWMgbm9kZV9jb25zdF9wb2ludGVyCisgICAgICBuZXh0XzJfcG9pbnRlcihub2RlX2NvbnN0X3BvaW50ZXIpOworCisgICAgICBzdGF0aWMgbm9kZV9jb25zdF9wb2ludGVyCisgICAgICBuZXh0X2FmdGVyXzBfcG9pbnRlcihub2RlX2NvbnN0X3BvaW50ZXIpOworI2VuZGlmCisKKyAgICAgIHJjX3QgCQkJbV9yYzsKKyAgICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy90cmFjZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfUkNfQ19ERUMKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YWVlOTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDc3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJjX2Jpbm9taWFsX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByY19iaW5vbWlhbF9oZWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGl0KFByZWQgcHJlZCwgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorCisgIG1ha2VfYmlub21pYWxfaGVhcCgpOworICBvdGhlci5tYWtlX2Jpbm9taWFsX2hlYXAoKTsKKyAgYmFzZV90eXBlOjpzcGxpdChwcmVkLCBvdGhlcik7CisgIGJhc2VfdHlwZTo6ZmluZF9tYXgoKTsKKyAgb3RoZXIuZmluZF9tYXgoKTsKKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorCisgIG1ha2VfYmlub21pYWxfaGVhcCgpOworICBvdGhlci5tYWtlX2Jpbm9taWFsX2hlYXAoKTsKKyAgYmFzZV90eXBlOjpqb2luKG90aGVyKTsKKyAgYmFzZV90eXBlOjpmaW5kX21heCgpOworICBvdGhlci5maW5kX21heCgpOworCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy90cmFjZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy90cmFjZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGM5YTIyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmNfYmlub21pYWxfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByY19iaW5vbWlhbF9oZWFwXy4KKyAqLworCisjaWZkZWYgUEJfRFNfUkNfQklOT01JQUxfSEVBUF9UUkFDRV8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlKCkgY29uc3QKK3sKKyAgYmFzZV90eXBlOjp0cmFjZSgpOworICBtX3JjLnRyYWNlKCk7Cit9CisKKyNlbmRpZiAvLyAjaWZkZWYgUEJfRFNfUkNfQklOT01JQUxfSEVBUF9UUkFDRV8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2NjX2hhc2hfbWF4X2NvbGxpc2lvbl9jaGVja19yZXNpemVfdHJpZ2dlcl9pbXAuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvY2NfaGFzaF9tYXhfY29sbGlzaW9uX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX2ltcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFiNGE4MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2NjX2hhc2hfbWF4X2NvbGxpc2lvbl9jaGVja19yZXNpemVfdHJpZ2dlcl9pbXAuaHBwCkBAIC0wLDAgKzEsMjExIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfbWF4X2NvbGxpc2lvbl9jaGVja19yZXNpemVfdHJpZ2dlcl9pbXAuaHBwCisgKiBDb250YWlucyBhIHJlc2l6ZSB0cmlnZ2VyIGltcGxlbWVudGF0aW9uLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitjY19oYXNoX21heF9jb2xsaXNpb25fY2hlY2tfcmVzaXplX3RyaWdnZXIoZmxvYXQgbG9hZCkgOgorICBtX2xvYWQobG9hZCksCisgIG1fc2l6ZSgwKSwKKyAgbV9udW1fY29sKDApLAorICBtX21heF9jb2woMCksCisgIG1fcmVzaXplX25lZWRlZChmYWxzZSkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpCit7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9maW5kX3NlYXJjaF9lbmQoKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKQoreyBtX251bV9jb2wgPSAwOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCkKK3sgKyttX251bV9jb2w7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKQoreyBjYWxjX3Jlc2l6ZV9uZWVkZWQoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2VyYXNlX3NlYXJjaF9jb2xsaXNpb24oKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydGVkKHNpemVfdHlwZSkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZWQoc2l6ZV90eXBlKQoreyBtX3Jlc2l6ZV9uZWVkZWQgPSB0cnVlOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfY2xlYXJlZCgpCit7IG1fcmVzaXplX25lZWRlZCA9IGZhbHNlOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraXNfcmVzaXplX25lZWRlZCgpIGNvbnN0Cit7IHJldHVybiBtX3Jlc2l6ZV9uZWVkZWQ7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6Citpc19ncm93X25lZWRlZChzaXplX3R5cGUgLypzaXplKi8sIHNpemVfdHlwZSAvKm51bV91c2VkX2UqLykgY29uc3QKK3sgcmV0dXJuIG1fbnVtX2NvbCA+PSBtX21heF9jb2w7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSkKK3sKKyAgbV9zaXplID0gbmV3X3NpemU7CisKKyNpZmRlZiBQQl9EU19IVF9NQVBfUkVTSVpFX1RSQUNFXworICBzdGQ6OmNlcnIgPDwgImNobWNjcnQ6Om5vdGlmeV9yZXNpemVkICIgCisJICAgIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG5ld19zaXplKSA8PCBzdGQ6OmVuZGw7CisjZW5kaWYgCisKKyAgY2FsY19tYXhfbnVtX2NvbGwoKTsKKyAgY2FsY19yZXNpemVfbmVlZGVkKCk7CisgIG1fbnVtX2NvbCA9IDA7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjYWxjX21heF9udW1fY29sbCgpCit7CisgIC8vIG1heF9jb2wgPC0tIFxzcXJ0ezIgbG9hZCBcbG4oIDIgbSBcbG4oIG0gKSApIH0KKyAgY29uc3QgZG91YmxlIGxuX2FyZyA9IDIgKiBtX3NpemUgKiBzdGQ6OmxvZyhkb3VibGUobV9zaXplKSk7CisgIG1fbWF4X2NvbCA9IHNpemVfdHlwZShzdGQ6OmNlaWwoc3RkOjpzcXJ0KDIgKiBtX2xvYWQgKiBzdGQ6OmxvZyhsbl9hcmcpKSkpOworCisjaWZkZWYgUEJfRFNfSFRfTUFQX1JFU0laRV9UUkFDRV8KKyAgc3RkOjpjZXJyIDw8ICJjaG1jY3J0OjpjYWxjX21heF9udW1fY29sbCAiIAorCSAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihtX3NpemUpIDw8ICAgICIgICAgIiAKKwkgICAgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obV9tYXhfY29sKSA8PCBzdGQ6OmVuZGw7CisjZW5kaWYgCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXh0ZXJuYWxseV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSkKK3sgbm90aWZ5X3Jlc2l6ZWQobmV3X3NpemUpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgc3RkOjpzd2FwKG1fbG9hZCwgb3RoZXIubV9sb2FkKTsKKyAgc3RkOjpzd2FwKG1fc2l6ZSwgb3RoZXIubV9zaXplKTsKKyAgc3RkOjpzd2FwKG1fbnVtX2NvbCwgb3RoZXIubV9udW1fY29sKTsKKyAgc3RkOjpzd2FwKG1fbWF4X2NvbCwgb3RoZXIubV9tYXhfY29sKTsKKyAgc3RkOjpzd2FwKG1fcmVzaXplX25lZWRlZCwgb3RoZXIubV9yZXNpemVfbmVlZGVkKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBmbG9hdAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2xvYWQoKSBjb25zdAoreworICBQQl9EU19TVEFUSUNfQVNTRVJUKGFjY2VzcywgZXh0ZXJuYWxfbG9hZF9hY2Nlc3MpOworICByZXR1cm4gbV9sb2FkOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NhbGNfcmVzaXplX25lZWRlZCgpCit7IG1fcmVzaXplX25lZWRlZCA9IG1fcmVzaXplX25lZWRlZCB8fCBtX251bV9jb2wgPj0gbV9tYXhfY29sOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzZXRfbG9hZChmbG9hdCBsb2FkKQoreworICBQQl9EU19TVEFUSUNfQVNTRVJUKGFjY2VzcywgZXh0ZXJuYWxfbG9hZF9hY2Nlc3MpOworICBtX2xvYWQgPSBsb2FkOworICBjYWxjX21heF9udW1fY29sbCgpOworICBjYWxjX3Jlc2l6ZV9uZWVkZWQoKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeV9pbXAuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeV9pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNTY4N2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX2V4cG9uZW50aWFsX3NpemVfcG9saWN5X2ltcC5ocHAKQEAgLTAsMCArMSw5MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBoYXNoX2V4cG9uZW50aWFsX3NpemVfcG9saWN5X2ltcC5ocHAKKyAqIENvbnRhaW5zIGEgcmVzaXplIHNpemUgcG9saWN5IGltcGxlbWVudGF0aW9uLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitoYXNoX2V4cG9uZW50aWFsX3NpemVfcG9saWN5KHNpemVfdHlwZSBzdGFydF9zaXplLCBzaXplX3R5cGUgZ3Jvd19mYWN0b3IpIDoKKyAgbV9zdGFydF9zaXplKHN0YXJ0X3NpemUpLAorICBtX2dyb3dfZmFjdG9yKGdyb3dfZmFjdG9yKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgc3RkOjpzd2FwKG1fc3RhcnRfc2l6ZSwgb3RoZXIubV9zdGFydF9zaXplKTsKKyAgc3RkOjpzd2FwKG1fZ3Jvd19mYWN0b3IsIG90aGVyLm1fZ3Jvd19mYWN0b3IpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoc2l6ZV90eXBlIHNpemUpIGNvbnN0Cit7CisgIHNpemVfdHlwZSByZXQgPSBtX3N0YXJ0X3NpemU7CisgIHdoaWxlIChyZXQgPD0gc2l6ZSkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgbmV4dF9yZXQgPSByZXQqICBtX2dyb3dfZmFjdG9yOworICAgICAgaWYgKG5leHRfcmV0IDwgcmV0KQorCV9fdGhyb3dfaW5zZXJ0X2Vycm9yKCk7CisgICAgICByZXQgPSBuZXh0X3JldDsKKyAgICB9CisgIHJldHVybiByZXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbmVhcmVzdF9zbWFsbGVyX3NpemUoc2l6ZV90eXBlIHNpemUpIGNvbnN0Cit7CisgIHNpemVfdHlwZSByZXQgPSBtX3N0YXJ0X3NpemU7CisgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBuZXh0X3JldCA9IHJldCogIG1fZ3Jvd19mYWN0b3I7CisgICAgICBpZiAobmV4dF9yZXQgPCByZXQpCisJX190aHJvd19yZXNpemVfZXJyb3IoKTsKKyAgICAgIGlmIChuZXh0X3JldCA+PSBzaXplKQorCXJldHVybiAocmV0KTsKKyAgICAgIHJldCA9IG5leHRfcmV0OworICAgIH0KKyAgcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX2ltcC5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXJfaW1wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjRjNDgyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX2ltcC5ocHAKQEAgLTAsMCArMSwyOTMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX2ltcC5ocHAKKyAqIENvbnRhaW5zIGEgcmVzaXplIHRyaWdnZXIgaW1wbGVtZW50YXRpb24uCisgKi8KKworI2RlZmluZSBQQl9EU19BU1NFUlRfVkFMSUQoWCkJCQkJCQlcCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoWC5hc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXIoZmxvYXQgbG9hZF9taW4sIGZsb2F0IGxvYWRfbWF4KQorOiBtX2xvYWRfbWluKGxvYWRfbWluKSwgbV9sb2FkX21heChsb2FkX21heCksIG1fbmV4dF9zaHJpbmtfc2l6ZSgwKSwKKyAgbV9uZXh0X2dyb3dfc2l6ZSgwKSwgbV9yZXNpemVfbmVlZGVkKGZhbHNlKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpCit7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2ZpbmRfc2VhcmNoX2NvbGxpc2lvbigpCit7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpCit7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpCit7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCkKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCkKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXJhc2Vfc2VhcmNoX2NvbGxpc2lvbigpCit7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9pbnNlcnRlZChzaXplX3R5cGUgbnVtX2VudHJpZXMpCit7CisgIG1fcmVzaXplX25lZWRlZCA9IChudW1fZW50cmllcyA+PSBtX25leHRfZ3Jvd19zaXplKTsKKyAgc2l6ZV9iYXNlOjpzZXRfc2l6ZShudW1fZW50cmllcyk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZWQoc2l6ZV90eXBlIG51bV9lbnRyaWVzKQoreworICBzaXplX2Jhc2U6OnNldF9zaXplKG51bV9lbnRyaWVzKTsKKyAgbV9yZXNpemVfbmVlZGVkID0gbnVtX2VudHJpZXMgPD0gbV9uZXh0X3Nocmlua19zaXplOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6Citpc19yZXNpemVfbmVlZGVkKCkgY29uc3QKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBtX3Jlc2l6ZV9uZWVkZWQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraXNfZ3Jvd19uZWVkZWQoc2l6ZV90eXBlIC8qc2l6ZSovLCBzaXplX3R5cGUgbnVtX2VudHJpZXMpIGNvbnN0Cit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3Jlc2l6ZV9uZWVkZWQpOworICByZXR1cm4gbnVtX2VudHJpZXMgPj0gbV9uZXh0X2dyb3dfc2l6ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK35oYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXIoKSB7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSkKK3sKKyAgbV9yZXNpemVfbmVlZGVkID0gZmFsc2U7CisgIG1fbmV4dF9ncm93X3NpemUgPSBzaXplX3R5cGUobV9sb2FkX21heCAqIG5ld19zaXplIC0gMSk7CisgIG1fbmV4dF9zaHJpbmtfc2l6ZSA9IHNpemVfdHlwZShtX2xvYWRfbWluICogbmV3X3NpemUpOworCisjaWZkZWYgUEJfRFNfSFRfTUFQX1JFU0laRV9UUkFDRV8KKyAgc3RkOjpjZXJyIDw8ICJobGNydDo6bm90aWZ5X3Jlc2l6ZWQgIiAgPDwgc3RkOjplbmRsCisJICAgIDw8ICIxICIgPDwgbmV3X3NpemUgPDwgc3RkOjplbmRsCisJICAgIDw8ICIyICIgPDwgbV9sb2FkX21pbiA8PCBzdGQ6OmVuZGwKKwkgICAgPDwgIjMgIiA8PCBtX2xvYWRfbWF4IDw8IHN0ZDo6ZW5kbAorCSAgICA8PCAiNCAiIDw8IG1fbmV4dF9zaHJpbmtfc2l6ZSA8PCBzdGQ6OmVuZGwKKwkgICAgPDwgIjUgIiA8PCBtX25leHRfZ3Jvd19zaXplIDw8IHN0ZDo6ZW5kbDsKKyNlbmRpZgorCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2V4dGVybmFsbHlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpCit7CisgIG1fcmVzaXplX25lZWRlZCA9IGZhbHNlOworICBzaXplX3R5cGUgbmV3X2dyb3dfc2l6ZSA9IHNpemVfdHlwZShtX2xvYWRfbWF4ICogbmV3X3NpemUgLSAxKTsKKyAgc2l6ZV90eXBlIG5ld19zaHJpbmtfc2l6ZSA9IHNpemVfdHlwZShtX2xvYWRfbWluICogbmV3X3NpemUpOworCisjaWZkZWYgUEJfRFNfSFRfTUFQX1JFU0laRV9UUkFDRV8KKyAgc3RkOjpjZXJyIDw8ICJobGNydDo6bm90aWZ5X2V4dGVybmFsbHlfcmVzaXplZCAiICA8PCBzdGQ6OmVuZGwKKwkgICAgPDwgIjEgIiA8PCBuZXdfc2l6ZSA8PCBzdGQ6OmVuZGwKKwkgICAgPDwgIjIgIiA8PCBtX2xvYWRfbWluIDw8IHN0ZDo6ZW5kbAorCSAgICA8PCAiMyAiIDw8IG1fbG9hZF9tYXggPDwgc3RkOjplbmRsCisJICAgIDw8ICI0ICIgPDwgbV9uZXh0X3Nocmlua19zaXplIDw8IHN0ZDo6ZW5kbAorCSAgICA8PCAiNSAiIDw8IG1fbmV4dF9ncm93X3NpemUgPDwgc3RkOjplbmRsCisJICAgIDw8ICI2ICIgPDwgbmV3X3Nocmlua19zaXplIDw8IHN0ZDo6ZW5kbAorCSAgICA8PCAiNyAiIDw8IG5ld19ncm93X3NpemUgPDwgc3RkOjplbmRsOworI2VuZGlmCisKKyAgaWYgKG5ld19ncm93X3NpemUgPj0gbV9uZXh0X2dyb3dfc2l6ZSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobmV3X3Nocmlua19zaXplID49IG1fbmV4dF9zaHJpbmtfc2l6ZSk7CisgICAgICBtX25leHRfZ3Jvd19zaXplID0gbmV3X2dyb3dfc2l6ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobmV3X3Nocmlua19zaXplIDw9IG1fbmV4dF9zaHJpbmtfc2l6ZSk7CisgICAgICBtX25leHRfc2hyaW5rX3NpemUgPSBuZXdfc2hyaW5rX3NpemU7CisgICAgfQorCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2NsZWFyZWQoKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgc2l6ZV9iYXNlOjpzZXRfc2l6ZSgwKTsKKyAgbV9yZXNpemVfbmVlZGVkID0gKDAgPCBtX25leHRfc2hyaW5rX3NpemUpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorCisgIHNpemVfYmFzZTo6c3dhcChvdGhlcik7CisgIHN0ZDo6c3dhcChtX2xvYWRfbWluLCBvdGhlci5tX2xvYWRfbWluKTsKKyAgc3RkOjpzd2FwKG1fbG9hZF9tYXgsIG90aGVyLm1fbG9hZF9tYXgpOworICBzdGQ6OnN3YXAobV9yZXNpemVfbmVlZGVkLCBvdGhlci5tX3Jlc2l6ZV9uZWVkZWQpOworICBzdGQ6OnN3YXAobV9uZXh0X2dyb3dfc2l6ZSwgb3RoZXIubV9uZXh0X2dyb3dfc2l6ZSk7CisgIHN0ZDo6c3dhcChtX25leHRfc2hyaW5rX3NpemUsIG90aGVyLm1fbmV4dF9zaHJpbmtfc2l6ZSk7CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2xvYWRzKCkgY29uc3QKK3sKKyAgUEJfRFNfU1RBVElDX0FTU0VSVChhY2Nlc3MsIGV4dGVybmFsX2xvYWRfYWNjZXNzKTsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKG1fbG9hZF9taW4sIG1fbG9hZF9tYXgpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2V0X2xvYWRzKHN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IGxvYWRfcGFpcikKK3sKKyAgUEJfRFNfU1RBVElDX0FTU0VSVChhY2Nlc3MsIGV4dGVybmFsX2xvYWRfYWNjZXNzKTsKKyAgY29uc3QgZmxvYXQgb2xkX2xvYWRfbWluID0gbV9sb2FkX21pbjsKKyAgY29uc3QgZmxvYXQgb2xkX2xvYWRfbWF4ID0gbV9sb2FkX21heDsKKyAgY29uc3Qgc2l6ZV90eXBlIG9sZF9uZXh0X3Nocmlua19zaXplID0gbV9uZXh0X3Nocmlua19zaXplOworICBjb25zdCBzaXplX3R5cGUgb2xkX25leHRfZ3Jvd19zaXplID0gbV9uZXh0X2dyb3dfc2l6ZTsKKyAgY29uc3QgYm9vbCBvbGRfcmVzaXplX25lZWRlZCA9IG1fcmVzaXplX25lZWRlZDsKKworICBfX3RyeQorICAgIHsKKyAgICAgIG1fbG9hZF9taW4gPSBsb2FkX3BhaXIuZmlyc3Q7CisgICAgICBtX2xvYWRfbWF4ID0gbG9hZF9wYWlyLnNlY29uZDsKKyAgICAgIGRvX3Jlc2l6ZShzdGF0aWNfY2FzdDxzaXplX3R5cGU+KHNpemVfYmFzZTo6Z2V0X3NpemUoKSAvICgobV9sb2FkX21pbiArIG1fbG9hZF9tYXgpIC8gMikpKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIG1fbG9hZF9taW4gPSBvbGRfbG9hZF9taW47CisgICAgICBtX2xvYWRfbWF4ID0gb2xkX2xvYWRfbWF4OworICAgICAgbV9uZXh0X3Nocmlua19zaXplID0gb2xkX25leHRfc2hyaW5rX3NpemU7CisgICAgICBtX25leHRfZ3Jvd19zaXplID0gb2xkX25leHRfZ3Jvd19zaXplOworICAgICAgbV9yZXNpemVfbmVlZGVkID0gb2xkX3Jlc2l6ZV9uZWVkZWQ7CisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citkb19yZXNpemUoc2l6ZV90eXBlKQoreyBzdGQ6OmFib3J0KCk7IH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGRlZmluZSBQQl9EU19ERUJVR19WRVJJRlkoX0NvbmQpCQkJCQlcCisgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWV9BVChfQ29uZCwJCQkJCVwKKwkJCSAgIF9NX21lc3NhZ2UoI19Db25kIiBhc3NlcnRpb24gZnJvbSAlMTs6JTI7IikJXAorCQkJICAgLl9NX3N0cmluZyhfX0ZJTEVfXykuX01faW50ZWdlcihfX0xJTkVfXykJXAorCQkJICAgLF9fZmlsZSxfX2xpbmUpCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBQQl9EU19ERUJVR19WRVJJRlkobV9sb2FkX21heCA+IG1fbG9hZF9taW4pOworICBQQl9EU19ERUJVR19WRVJJRlkobV9uZXh0X2dyb3dfc2l6ZSA+PSBtX25leHRfc2hyaW5rX3NpemUpOworfQorIyB1bmRlZiBQQl9EU19ERUJVR19WRVJJRlkKKyNlbmRpZgorI3VuZGVmIFBCX0RTX0FTU0VSVF9WQUxJRApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZS5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXJfc2l6ZV9iYXNlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzMyZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZS5ocHAKQEAgLTAsMCArMSw5NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXJfc2l6ZV9iYXNlLmhwcAorICogQ29udGFpbnMgYW4gYmFzZSBob2xkaW5nIHNpemUgZm9yIHNvbWUgcmVzaXplIHBvbGljaWVzLgorICovCisKKyNpZm5kZWYgUEJfRFNfSEFTSF9MT0FEX0NIRUNLX1JFU0laRV9UUklHR0VSX1NJWkVfQkFTRV9IUFAKKyNkZWZpbmUgUEJfRFNfSEFTSF9MT0FEX0NIRUNLX1JFU0laRV9UUklHR0VSX1NJWkVfQkFTRV9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIFByaW1hcnkgdGVtcGxhdGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlLCBib29sIEhvbGRfU2l6ZT4KKyAgICBjbGFzcyBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXJfc2l6ZV9iYXNlOworCisgICAgLy8vIFNwZWNpYWxpemF0aW9ucy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisgICAgY2xhc3MgaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZTxTaXplX1R5cGUsIHRydWU+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgU2l6ZV9UeXBlIHNpemVfdHlwZTsKKworICAgICAgaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZSgpOiBtX3NpemUoMCkKKyAgICAgIHsgfQorCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3dhcChoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXJfc2l6ZV9iYXNlJiBvdGhlcikKKyAgICAgIHsgc3RkOjpzd2FwKG1fc2l6ZSwgb3RoZXIubV9zaXplKTsgfQorCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc2V0X3NpemUoc2l6ZV90eXBlIHNpemUpCisgICAgICB7IG1fc2l6ZSA9IHNpemU7IH0KKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgZ2V0X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9zaXplOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgc2l6ZV90eXBlIG1fc2l6ZTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlPgorICAgIGNsYXNzIGhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9zaXplX2Jhc2U8U2l6ZV9UeXBlLCBmYWxzZT4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBTaXplX1R5cGUgc2l6ZV90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHN3YXAoaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZSYgb3RoZXIpIHsgfQorCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc2V0X3NpemUoc2l6ZV90eXBlIHNpemUpIHsgfQorICAgIH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfcHJpbWVfc2l6ZV9wb2xpY3lfaW1wLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfcHJpbWVfc2l6ZV9wb2xpY3lfaW1wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2M5MjYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9wcmltZV9zaXplX3BvbGljeV9pbXAuaHBwCkBAIC0wLDAgKzEsMTYxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGhhc2hfcHJpbWVfc2l6ZV9wb2xpY3lfaW1wLmhwcAorICogQ29udGFpbnMgYSByZXNpemUgc2l6ZSBwb2xpY3kgaW1wbGVtZW50YXRpb24uCisgKi8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2UgZGV0YWlsCit7CisgIGVudW0KKyAgICB7CisgICAgICBudW1fZGlzdGluY3Rfc2l6ZXNfMzJfYml0ID0gMzAsCisgICAgICBudW1fZGlzdGluY3Rfc2l6ZXNfNjRfYml0ID0gNjIsCisgICAgICBudW1fZGlzdGluY3Rfc2l6ZXMgPSBzaXplb2Yoc3RkOjpzaXplX3QpICE9IDggPyAKKyAgICAgICAgICAgIG51bV9kaXN0aW5jdF9zaXplc18zMl9iaXQgOiBudW1fZGlzdGluY3Rfc2l6ZXNfNjRfYml0LAkKKyAgICB9OworCisgIC8vIE9yaWdpbmFsbHkgdGFrZW4gZnJvbSB0aGUgU0dJIGltcGxlbWVudGF0aW9uOyBhY2tub3dsZWRnZWQgaW4gdGhlIGRvY3MuCisgIC8vIEZ1cnRoZXIgbW9kaWZpZWQgKGZvciA2NCBiaXRzKSBmcm9tIHRyMSdzIGhhc2h0YWJsZS4KKyAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IGdfYV9zaXplc1tudW1fZGlzdGluY3Rfc2l6ZXNfNjRfYml0XSA9CisgICAgeworICAgICAgLyogMCAgICAgKi8gICAgICAgICAgICAgIDV1bCwKKyAgICAgIC8qIDEgICAgICovICAgICAgICAgICAgICAxMXVsLCAKKyAgICAgIC8qIDIgICAgICovICAgICAgICAgICAgICAyM3VsLCAKKyAgICAgIC8qIDMgICAgICovICAgICAgICAgICAgICA0N3VsLCAKKyAgICAgIC8qIDQgICAgICovICAgICAgICAgICAgICA5N3VsLCAKKyAgICAgIC8qIDUgICAgICovICAgICAgICAgICAgICAxOTl1bCwgCisgICAgICAvKiA2ICAgICAqLyAgICAgICAgICAgICAgNDA5dWwsIAorICAgICAgLyogNyAgICAgKi8gICAgICAgICAgICAgIDgyM3VsLCAKKyAgICAgIC8qIDggICAgICovICAgICAgICAgICAgICAxNzQxdWwsIAorICAgICAgLyogOSAgICAgKi8gICAgICAgICAgICAgIDM0Njl1bCwgCisgICAgICAvKiAxMCAgICAqLyAgICAgICAgICAgICAgNjk0OXVsLCAKKyAgICAgIC8qIDExICAgICovICAgICAgICAgICAgICAxNDAzM3VsLCAKKyAgICAgIC8qIDEyICAgICovICAgICAgICAgICAgICAyODQxMXVsLCAKKyAgICAgIC8qIDEzICAgICovICAgICAgICAgICAgICA1NzU1N3VsLCAKKyAgICAgIC8qIDE0ICAgICovICAgICAgICAgICAgICAxMTY3MzF1bCwgCisgICAgICAvKiAxNSAgICAqLyAgICAgICAgICAgICAgMjM2ODk3dWwsCisgICAgICAvKiAxNiAgICAqLyAgICAgICAgICAgICAgNDgwODgxdWwsIAorICAgICAgLyogMTcgICAgKi8gICAgICAgICAgICAgIDk3NjM2OXVsLAorICAgICAgLyogMTggICAgKi8gICAgICAgICAgICAgIDE5ODI2Mjd1bCwgCisgICAgICAvKiAxOSAgICAqLyAgICAgICAgICAgICAgNDAyNjAzMXVsLAorICAgICAgLyogMjAgICAgKi8gICAgICAgICAgICAgIDgxNzUzODN1bCwgCisgICAgICAvKiAyMSAgICAqLyAgICAgICAgICAgICAgMTY2MDE1OTN1bCwgCisgICAgICAvKiAyMiAgICAqLyAgICAgICAgICAgICAgMzM3MTI3Mjl1bCwKKyAgICAgIC8qIDIzICAgICovICAgICAgICAgICAgICA2ODQ2MDM5MXVsLCAKKyAgICAgIC8qIDI0ICAgICovICAgICAgICAgICAgICAxMzkwMjI0MTd1bCwgCisgICAgICAvKiAyNSAgICAqLyAgICAgICAgICAgICAgMjgyMzEyNzk5dWwsIAorICAgICAgLyogMjYgICAgKi8gICAgICAgICAgICAgIDU3MzI5MjgxN3VsLCAKKyAgICAgIC8qIDI3ICAgICovICAgICAgICAgICAgICAxMTY0MTg2MjE3dWwsCisgICAgICAvKiAyOCAgICAqLyAgICAgICAgICAgICAgMjM2NDExNDIxN3VsLCAKKyAgICAgIC8qIDI5ICAgICovICAgICAgICAgICAgICA0Mjk0OTY3MjkxdWwsCisgICAgICAvKiAzMCAgICAqLyAoc3RkOjpzaXplX3QpODU4OTkzNDU4M3VsbCwKKyAgICAgIC8qIDMxICAgICovIChzdGQ6OnNpemVfdCkxNzE3OTg2OTE0M3VsbCwKKyAgICAgIC8qIDMyICAgICovIChzdGQ6OnNpemVfdCkzNDM1OTczODMzN3VsbCwKKyAgICAgIC8qIDMzICAgICovIChzdGQ6OnNpemVfdCk2ODcxOTQ3NjczMXVsbCwKKyAgICAgIC8qIDM0ICAgICovIChzdGQ6OnNpemVfdCkxMzc0Mzg5NTM0NDd1bGwsCisgICAgICAvKiAzNSAgICAqLyAoc3RkOjpzaXplX3QpMjc0ODc3OTA2ODk5dWxsLAorICAgICAgLyogMzYgICAgKi8gKHN0ZDo6c2l6ZV90KTU0OTc1NTgxMzg4MXVsbCwKKyAgICAgIC8qIDM3ICAgICovIChzdGQ6OnNpemVfdCkxMDk5NTExNjI3Njg5dWxsLAorICAgICAgLyogMzggICAgKi8gKHN0ZDo6c2l6ZV90KTIxOTkwMjMyNTU1MzF1bGwsCisgICAgICAvKiAzOSAgICAqLyAoc3RkOjpzaXplX3QpNDM5ODA0NjUxMTA5M3VsbCwKKyAgICAgIC8qIDQwICAgICovIChzdGQ6OnNpemVfdCk4Nzk2MDkzMDIyMTUxdWxsLAorICAgICAgLyogNDEgICAgKi8gKHN0ZDo6c2l6ZV90KTE3NTkyMTg2MDQ0Mzk5dWxsLAorICAgICAgLyogNDIgICAgKi8gKHN0ZDo6c2l6ZV90KTM1MTg0MzcyMDg4Nzc3dWxsLAorICAgICAgLyogNDMgICAgKi8gKHN0ZDo6c2l6ZV90KTcwMzY4NzQ0MTc3NjQzdWxsLAorICAgICAgLyogNDQgICAgKi8gKHN0ZDo6c2l6ZV90KTE0MDczNzQ4ODM1NTIxM3VsbCwKKyAgICAgIC8qIDQ1ICAgICovIChzdGQ6OnNpemVfdCkyODE0NzQ5NzY3MTA1OTd1bGwsCisgICAgICAvKiA0NiAgICAqLyAoc3RkOjpzaXplX3QpNTYyOTQ5OTUzNDIxMjMxdWxsLCAKKyAgICAgIC8qIDQ3ICAgICovIChzdGQ6OnNpemVfdCkxMTI1ODk5OTA2ODQyNTk3dWxsLAorICAgICAgLyogNDggICAgKi8gKHN0ZDo6c2l6ZV90KTIyNTE3OTk4MTM2ODUxMTl1bGwsIAorICAgICAgLyogNDkgICAgKi8gKHN0ZDo6c2l6ZV90KTQ1MDM1OTk2MjczNzA0NDl1bGwsCisgICAgICAvKiA1MCAgICAqLyAoc3RkOjpzaXplX3QpOTAwNzE5OTI1NDc0MDg4MXVsbCwgCisgICAgICAvKiA1MSAgICAqLyAoc3RkOjpzaXplX3QpMTgwMTQzOTg1MDk0ODE5NTF1bGwsCisgICAgICAvKiA1MiAgICAqLyAoc3RkOjpzaXplX3QpMzYwMjg3OTcwMTg5NjM5MTN1bGwsIAorICAgICAgLyogNTMgICAgKi8gKHN0ZDo6c2l6ZV90KTcyMDU3NTk0MDM3OTI3OTMxdWxsLAorICAgICAgLyogNTQgICAgKi8gKHN0ZDo6c2l6ZV90KTE0NDExNTE4ODA3NTg1NTg1OXVsbCwKKyAgICAgIC8qIDU1ICAgICovIChzdGQ6OnNpemVfdCkyODgyMzAzNzYxNTE3MTE3MTd1bGwsCisgICAgICAvKiA1NiAgICAqLyAoc3RkOjpzaXplX3QpNTc2NDYwNzUyMzAzNDIzNDMzdWxsLAorICAgICAgLyogNTcgICAgKi8gKHN0ZDo6c2l6ZV90KTExNTI5MjE1MDQ2MDY4NDY4ODN1bGwsCisgICAgICAvKiA1OCAgICAqLyAoc3RkOjpzaXplX3QpMjMwNTg0MzAwOTIxMzY5Mzk1MXVsbCwKKyAgICAgIC8qIDU5ICAgICovIChzdGQ6OnNpemVfdCk0NjExNjg2MDE4NDI3Mzg3ODQ3dWxsLAorICAgICAgLyogNjAgICAgKi8gKHN0ZDo6c2l6ZV90KTkyMjMzNzIwMzY4NTQ3NzU3ODN1bGwsCisgICAgICAvKiA2MSAgICAqLyAoc3RkOjpzaXplX3QpMTg0NDY3NDQwNzM3MDk1NTE1NTd1bGwsCisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2hhc2hfcHJpbWVfc2l6ZV9wb2xpY3koc2l6ZV90eXBlIG4pIDogbV9zdGFydF9zaXplKG4pCit7IG1fc3RhcnRfc2l6ZSA9IGdldF9uZWFyZXN0X2xhcmdlcl9zaXplKG4pOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7IHN0ZDo6c3dhcChtX3N0YXJ0X3NpemUsIG90aGVyLm1fc3RhcnRfc2l6ZSk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZShzaXplX3R5cGUgbikgY29uc3QKK3sKKyAgY29uc3Qgc3RkOjpzaXplX3QqIGNvbnN0IHBfdXBwZXIgPSBzdGQ6OnVwcGVyX2JvdW5kKGRldGFpbDo6Z19hX3NpemVzLCAKKwkJICAgICBkZXRhaWw6OmdfYV9zaXplcyArIGRldGFpbDo6bnVtX2Rpc3RpbmN0X3NpemVzLCBuKTsKKworICBpZiAocF91cHBlciA9PSBkZXRhaWw6OmdfYV9zaXplcyArIGRldGFpbDo6bnVtX2Rpc3RpbmN0X3NpemVzKQorICAgIF9fdGhyb3dfcmVzaXplX2Vycm9yKCk7CisgIHJldHVybiAqcF91cHBlcjsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbmVhcmVzdF9zbWFsbGVyX3NpemUoc2l6ZV90eXBlIG4pIGNvbnN0Cit7CisgIGNvbnN0IHN0ZDo6c2l6ZV90KiBwX2xvd2VyID0gc3RkOjpsb3dlcl9ib3VuZChkZXRhaWw6OmdfYV9zaXplcywgCisJCSAgICAgICBkZXRhaWw6OmdfYV9zaXplcyArIGRldGFpbDo6bnVtX2Rpc3RpbmN0X3NpemVzLCBuKTsKKworICBpZiAoKnBfbG93ZXIgPj0gbiAmJiAgcF9sb3dlciAhPSBkZXRhaWw6OmdfYV9zaXplcykKKyAgICAtLXBfbG93ZXI7CisgIGlmICgqcF9sb3dlciA8IG1fc3RhcnRfc2l6ZSkKKyAgICByZXR1cm4gbV9zdGFydF9zaXplOworICByZXR1cm4gKnBfbG93ZXI7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3lfaW1wLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfc3RhbmRhcmRfcmVzaXplX3BvbGljeV9pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYTgzZjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3lfaW1wLmhwcApAQCAtMCwwICsxLDI0OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBoYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3lfaW1wLmhwcAorICogQ29udGFpbnMgYSByZXNpemUgcG9saWN5IGltcGxlbWVudGF0aW9uLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitoYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3koKSAKKzogbV9zaXplKFNpemVfUG9saWN5OjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSkKK3sgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X2V4dGVybmFsbHlfcmVzaXplZChtX3NpemUpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitoYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3koY29uc3QgU2l6ZV9Qb2xpY3kmIHJfc2l6ZV9wb2xpY3kpIAorOiBTaXplX1BvbGljeShyX3NpemVfcG9saWN5KSwgbV9zaXplKFNpemVfUG9saWN5OjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSkKK3sgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X2V4dGVybmFsbHlfcmVzaXplZChtX3NpemUpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitoYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3koY29uc3QgU2l6ZV9Qb2xpY3kmIHJfc2l6ZV9wb2xpY3ksIAorCQkJICAgIGNvbnN0IFRyaWdnZXJfUG9saWN5JiByX3RyaWdnZXJfcG9saWN5KSAKKzogU2l6ZV9Qb2xpY3kocl9zaXplX3BvbGljeSksIFRyaWdnZXJfUG9saWN5KHJfdHJpZ2dlcl9wb2xpY3kpLAorICBtX3NpemUoU2l6ZV9Qb2xpY3k6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfZXh0ZXJuYWxseV9yZXNpemVkKG1fc2l6ZSk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK35oYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3koKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6c3dhcChvdGhlcik7CisgIHNpemVfcG9saWN5X2Jhc2U6OnN3YXAob3RoZXIpOworICBzdGQ6OnN3YXAobV9zaXplLCBvdGhlci5tX3NpemUpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2ZpbmRfc2VhcmNoX2NvbGxpc2lvbigpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9maW5kX3NlYXJjaF9lbmQoKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX3N0YXJ0KCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfaW5zZXJ0X3NlYXJjaF9jb2xsaXNpb24oKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9jb2xsaXNpb24oKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2VyYXNlX3NlYXJjaF9zdGFydCgpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCkKK3sgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9jb2xsaXNpb24oKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCkKK3sgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9pbnNlcnRlZChzaXplX3R5cGUgbnVtX2UpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9pbnNlcnRlZChudW1fZSk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXJhc2VkKHNpemVfdHlwZSBudW1fZSkKK3sgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X2VyYXNlZChudW1fZSk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9jbGVhcmVkKCkKK3sgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X2NsZWFyZWQoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2lzX3Jlc2l6ZV9uZWVkZWQoKSBjb25zdAoreyByZXR1cm4gdHJpZ2dlcl9wb2xpY3lfYmFzZTo6aXNfcmVzaXplX25lZWRlZCgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbmV3X3NpemUoc2l6ZV90eXBlIHNpemUsIHNpemVfdHlwZSBudW1fdXNlZF9lKSBjb25zdAoreworICBpZiAodHJpZ2dlcl9wb2xpY3lfYmFzZTo6aXNfZ3Jvd19uZWVkZWQoc2l6ZSwgbnVtX3VzZWRfZSkpCisgICAgcmV0dXJuIHNpemVfcG9saWN5X2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKHNpemUpOworICByZXR1cm4gc2l6ZV9wb2xpY3lfYmFzZTo6Z2V0X25lYXJlc3Rfc21hbGxlcl9zaXplKHNpemUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIG5ld19zaXplKQoreworICB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfcmVzaXplZChuZXdfc2l6ZSk7CisgIG1fc2l6ZSA9IG5ld19zaXplOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9hY3R1YWxfc2l6ZSgpIGNvbnN0Cit7CisgIFBCX0RTX1NUQVRJQ19BU1NFUlQoYWNjZXNzLCBleHRlcm5hbF9zaXplX2FjY2Vzcyk7CisgIHJldHVybiBtX3NpemU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZXNpemUoc2l6ZV90eXBlIG5ld19zaXplKQoreworICBQQl9EU19TVEFUSUNfQVNTRVJUKGFjY2VzcywgZXh0ZXJuYWxfc2l6ZV9hY2Nlc3MpOworICBzaXplX3R5cGUgYWN0dWFsX3NpemUgPSBzaXplX3BvbGljeV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKTsKKyAgd2hpbGUgKGFjdHVhbF9zaXplIDwgbmV3X3NpemUpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIHBvdCA9IHNpemVfcG9saWN5X2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKGFjdHVhbF9zaXplKTsKKworICAgICAgaWYgKHBvdCA9PSBhY3R1YWxfc2l6ZSAmJiBwb3QgPCBuZXdfc2l6ZSkKKwlfX3Rocm93X3Jlc2l6ZV9lcnJvcigpOworICAgICAgYWN0dWFsX3NpemUgPSBwb3Q7CisgICAgfQorCisgIGlmIChhY3R1YWxfc2l6ZSA+IDApCisgICAgLS1hY3R1YWxfc2l6ZTsKKworICBjb25zdCBzaXplX3R5cGUgb2xkX3NpemUgPSBtX3NpemU7CisgIF9fdHJ5CisgICAgeworICAgICAgZG9fcmVzaXplKGFjdHVhbF9zaXplIC0gMSk7CisgICAgfQorICBfX2NhdGNoKGluc2VydF9lcnJvciYgKQorICAgIHsKKyAgICAgIG1fc2l6ZSA9IG9sZF9zaXplOworICAgICAgX190aHJvd19yZXNpemVfZXJyb3IoKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIG1fc2l6ZSA9IG9sZF9zaXplOworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZG9fcmVzaXplKHNpemVfdHlwZSkKK3sKKyAgLy8gRG8gbm90aGluZworfQorCitQQl9EU19DTEFTU19UX0RFQworVHJpZ2dlcl9Qb2xpY3kmIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X3RyaWdnZXJfcG9saWN5KCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBUcmlnZ2VyX1BvbGljeSYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfdHJpZ2dlcl9wb2xpY3koKSBjb25zdAoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1NpemVfUG9saWN5JiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9zaXplX3BvbGljeSgpCit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgU2l6ZV9Qb2xpY3kmIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X3NpemVfcG9saWN5KCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L3NhbXBsZV9yZXNpemVfcG9saWN5LmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L3NhbXBsZV9yZXNpemVfcG9saWN5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2EzODc1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvc2FtcGxlX3Jlc2l6ZV9wb2xpY3kuaHBwCkBAIC0wLDAgKzEsMTI1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNhbXBsZV9yZXNpemVfcG9saWN5LmhwcAorICogQ29udGFpbnMgYSBzYW1wbGUgcmVzaXplIHBvbGljeSBmb3IgaGFzaCB0YWJsZXMuCisgKi8KKworI2lmbmRlZiBQQl9EU19TQU1QTEVfUkVTSVpFX1BPTElDWV9IUFAKKyNkZWZpbmUgUEJfRFNfU0FNUExFX1JFU0laRV9QT0xJQ1lfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8vLyBBIHNhbXBsZSByZXNpemUgcG9saWN5LgorICBjbGFzcyBzYW1wbGVfcmVzaXplX3BvbGljeQorICB7CisgIHB1YmxpYzoKKyAgICAvLy8gU2l6ZSB0eXBlLgorICAgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2l6ZV90eXBlOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3Jlc2l6ZV9wb2xpY3koKTsKKworICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgorICAgIHNhbXBsZV9yYW5nZV9oYXNoaW5nKGNvbnN0IHNhbXBsZV9yZXNpemVfcG9saWN5JiBvdGhlcik7CisKKyAgICAvLy8gU3dhcHMgY29udGVudC4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoc2FtcGxlX3Jlc2l6ZV9wb2xpY3kmIG90aGVyKTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIHN0YXJ0ZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuY291bnRlcmVkIGEgY29sbGlzaW9uLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhIHNlYXJjaCBzdGFydGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5jb3VudGVyZWQgYSBjb2xsaXNpb24uCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggc3RhcnRlZC4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhIHNlYXJjaCBlbmNvdW50ZXJlZCBhIGNvbGxpc2lvbi4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworCisgICAgLy8vIE5vdGlmaWVzIGFuIGVsZW1lbnQgd2FzIGluc2VydGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydGVkKHNpemVfdHlwZSBudW1fZSk7CisKKyAgICAvLy8gTm90aWZpZXMgYW4gZWxlbWVudCB3YXMgZXJhc2VkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlZChzaXplX3R5cGUgbnVtX2UpOworCisgICAgLy8vIE5vdGlmaWVzIHRoZSB0YWJsZSB3YXMgY2xlYXJlZC4KKyAgICB2b2lkCisgICAgbm90aWZ5X2NsZWFyZWQoKTsKKworICAgIC8vLyBOb3RpZmllcyB0aGUgdGFibGUgd2FzIHJlc2l6ZWQgdG8gbmV3X3NpemUuCisgICAgdm9pZAorICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSk7CisKKyAgICAvLy8gUXVlcmllcyB3aGV0aGVyIGEgcmVzaXplIGlzIG5lZWRlZC4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX3Jlc2l6ZV9uZWVkZWQoKSBjb25zdDsKKworICAgIC8vLyBRdWVyaWVzIHdoYXQgdGhlIG5ldyBzaXplIHNob3VsZCBiZS4KKyAgICBzaXplX3R5cGUKKyAgICBnZXRfbmV3X3NpemUoc2l6ZV90eXBlIHNpemUsIHNpemVfdHlwZSBudW1fdXNlZF9lKSBjb25zdDsKKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvc2FtcGxlX3Jlc2l6ZV90cmlnZ2VyLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L3NhbXBsZV9yZXNpemVfdHJpZ2dlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkMDlmOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L3NhbXBsZV9yZXNpemVfdHJpZ2dlci5ocHAKQEAgLTAsMCArMSwxMzYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc2FtcGxlX3Jlc2l6ZV90cmlnZ2VyLmhwcAorICogQ29udGFpbnMgYSBzYW1wbGUgcmVzaXplIHRyaWdnZXIgcG9saWN5IGNsYXNzLgorICovCisKKyNpZm5kZWYgUEJfRFNfU0FNUExFX1JFU0laRV9UUklHR0VSX0hQUAorI2RlZmluZSBQQl9EU19TQU1QTEVfUkVTSVpFX1RSSUdHRVJfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8vLyBBIHNhbXBsZSByZXNpemUgdHJpZ2dlciBwb2xpY3kuCisgIGNsYXNzIHNhbXBsZV9yZXNpemVfdHJpZ2dlcgorICB7CisgIHB1YmxpYzoKKyAgICAvLy8gU2l6ZSB0eXBlLgorICAgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2l6ZV90eXBlOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3Jlc2l6ZV90cmlnZ2VyKCk7CisKKyAgICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgICBzYW1wbGVfcmFuZ2VfaGFzaGluZyhjb25zdCBzYW1wbGVfcmVzaXplX3RyaWdnZXImKTsKKworICAgIC8vLyBTd2FwcyBjb250ZW50LgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChzYW1wbGVfcmVzaXplX3RyaWdnZXImKTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIHN0YXJ0ZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuY291bnRlcmVkIGEgY29sbGlzaW9uLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhIHNlYXJjaCBzdGFydGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5jb3VudGVyZWQgYSBjb2xsaXNpb24uCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggc3RhcnRlZC4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhIHNlYXJjaCBlbmNvdW50ZXJlZCBhIGNvbGxpc2lvbi4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworCisgICAgLy8vIE5vdGlmaWVzIGFuIGVsZW1lbnQgd2FzIGluc2VydGVkLiB0aGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4KKyAgICAvLy8gdGhlIHRhYmxlIGlzIG51bV9lbnRyaWVzLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydGVkKHNpemVfdHlwZSBudW1fZW50cmllcyk7CisKKyAgICAvLy8gTm90aWZpZXMgYW4gZWxlbWVudCB3YXMgZXJhc2VkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlZChzaXplX3R5cGUgbnVtX2VudHJpZXMpOworCisgICAgLy8vIE5vdGlmaWVzIHRoZSB0YWJsZSB3YXMgY2xlYXJlZC4KKyAgICB2b2lkCisgICAgbm90aWZ5X2NsZWFyZWQoKTsKKworICAgIC8vLyBOb3RpZmllcyB0aGUgdGFibGUgd2FzIHJlc2l6ZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBvYmplY3QncworICAgIC8vLyBzaWduaWZ5aW5nIHRoYXQgYSByZXNpemUgaXMgbmVlZGVkLgorICAgIHZvaWQKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpOworCisgICAgLy8vIE5vdGlmaWVzIHRoZSB0YWJsZSB3YXMgcmVzaXplZCBleHRlcm5hbGx5LgorICAgIHZvaWQKKyAgICBub3RpZnlfZXh0ZXJuYWxseV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSk7CisKKyAgICAvLy8gUXVlcmllcyB3aGV0aGVyIGEgcmVzaXplIGlzIG5lZWRlZC4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX3Jlc2l6ZV9uZWVkZWQoKSBjb25zdDsKKworICAgIC8vLyBRdWVyaWVzIHdoZXRoZXIgYSBncm93IGlzIG5lZWRlZC4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX2dyb3dfbmVlZGVkKHNpemVfdHlwZSBzaXplLCBzaXplX3R5cGUgbnVtX2VudHJpZXMpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgLy8vIFJlc2l6ZXMgdG8gbmV3X3NpemUuCisgICAgdmlydHVhbCB2b2lkCisgICAgZG9fcmVzaXplKHNpemVfdHlwZSk7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L3NhbXBsZV9zaXplX3BvbGljeS5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9zYW1wbGVfc2l6ZV9wb2xpY3kuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzhmYjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9zYW1wbGVfc2l6ZV9wb2xpY3kuaHBwCkBAIC0wLDAgKzEsNzMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc2FtcGxlX3NpemVfcG9saWN5LmhwcAorICogQ29udGFpbnMgYSBzYW1wbGUgc2l6ZSByZXNpemUtcG9saWN5LgorICovCisKKyNpZm5kZWYgUEJfRFNfU0FNUExFX1NJWkVfUE9MSUNZX0hQUAorI2RlZmluZSBQQl9EU19TQU1QTEVfU0laRV9QT0xJQ1lfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8vLyBBIHNhbXBsZSBzaXplIHBvbGljeS4KKyAgY2xhc3Mgc2FtcGxlX3NpemVfcG9saWN5CisgIHsKKyAgcHVibGljOgorICAgIC8vLyBTaXplIHR5cGUuCisgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCBzaXplX3R5cGU7CisKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBzYW1wbGVfc2l6ZV9wb2xpY3koKTsKKworICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgorICAgIHNhbXBsZV9yYW5nZV9oYXNoaW5nKGNvbnN0IHNhbXBsZV9zaXplX3BvbGljeSYpOworCisgICAgLy8vIFN3YXBzIGNvbnRlbnQuCisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHNhbXBsZV9zaXplX3BvbGljeSYgb3RoZXIpOworCisgIHByb3RlY3RlZDoKKyAgICAvLy8gR2l2ZW4gYSBfX3NpemUgc2l6ZSwgcmV0dXJucyBhIF9fc2l6ZSB0aGF0IGlzIGxhcmdlci4KKyAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgZ2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoc2l6ZV90eXBlIHNpemUpIGNvbnN0OworCisgICAgLy8vIEdpdmVuIGEgX19zaXplIHNpemUsIHJldHVybnMgYSBfX3NpemUgdGhhdCBpcyBzbWFsbGVyLgorICAgIGlubGluZSBzaXplX3R5cGUKKyAgICBnZXRfbmVhcmVzdF9zbWFsbGVyX3NpemUoc2l6ZV90eXBlIHNpemUpIGNvbnN0OworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyZDQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEwMiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzcGxheV90cmVlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHNwbGF5X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvcHlfZnJvbV9yYW5nZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCkKK3sKKyAgd2hpbGUgKGZpcnN0X2l0ICE9IGxhc3RfaXQpCisgICAgaW5zZXJ0KCooZmlyc3RfaXQrKykpOworfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfU19UUkVFX05BTUUoKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfU19UUkVFX05BTUUoY29uc3QgQ21wX0ZuJiByX2NtcF9mbikgOgorICBiYXNlX3R5cGUocl9jbXBfZm4pCit7CisgIGluaXRpYWxpemUoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19TX1RSRUVfTkFNRShjb25zdCBDbXBfRm4mIHJfY21wX2ZuLCBjb25zdCBub2RlX3VwZGF0ZSYgcl9ub2RlX3VwZGF0ZSkgOgorICBiYXNlX3R5cGUocl9jbXBfZm4sIHJfbm9kZV91cGRhdGUpCit7CisgIGluaXRpYWxpemUoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19TX1RSRUVfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIDoKKyAgYmFzZV90eXBlKG90aGVyKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgIGJhc2VfdHlwZTo6c3dhcChvdGhlcik7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citpbml0aWFsaXplKCkKK3sgYmFzZV90eXBlOjptX3BfaGVhZC0+bV9zcGVjaWFsID0gdHJ1ZTsgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDc3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzcGxheV90cmVlXy9kZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHNwbGF5X3RyZWVfLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgYmFzZV90eXBlOjphc3NlcnRfdmFsaWQoX19maWxlLCBfX2xpbmUpOworICBjb25zdCBub2RlX3BvaW50ZXIgcF9oZWFkID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgYXNzZXJ0X3NwZWNpYWxfaW1wKHBfaGVhZCwgX19maWxlLCBfX2xpbmUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3NwZWNpYWxfaW1wKGNvbnN0IG5vZGVfcG9pbnRlciBwX25kLAorCQkgICBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworCisgIGlmIChwX25kID09IGJhc2VfdHlwZTo6bV9wX2hlYWQpCisgICAgeworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKHBfbmQtPm1fc3BlY2lhbCk7CisgICAgICBhc3NlcnRfc3BlY2lhbF9pbXAocF9uZC0+bV9wX3BhcmVudCwgX19maWxlLCBfX2xpbmUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBQQl9EU19ERUJVR19WRVJJRlkoIXBfbmQtPm1fc3BlY2lhbCk7CisgIGFzc2VydF9zcGVjaWFsX2ltcChwX25kLT5tX3BfbGVmdCwgX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfc3BlY2lhbF9pbXAocF9uZC0+bV9wX3JpZ2h0LCBfX2ZpbGUsIF9fbGluZSk7Cit9CisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMDFhNjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxNTcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsYXlfdHJlZV8vZXJhc2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBzcGxheV90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIHBvaW50X2l0ZXJhdG9yIGl0ID0gZmluZChyX2tleSk7CisgIGlmIChpdCA9PSBiYXNlX3R5cGU6OmVuZCgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgZXJhc2UoaXQpOworICByZXR1cm4gdHJ1ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKGl0ZXJhdG9yIGl0KQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgaWYgKGl0ID09IGJhc2VfdHlwZTo6ZW5kKCkpCisgICAgcmV0dXJuIGl0OworICBpdGVyYXRvciByZXRfaXQgPSBpdDsKKyAgKytyZXRfaXQ7CisgIGVyYXNlX25vZGUoaXQubV9wX25kKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiByZXRfaXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnJldmVyc2VfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKHJldmVyc2VfaXRlcmF0b3IgaXQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBpZiAoaXQubV9wX25kID09IGJhc2VfdHlwZTo6bV9wX2hlYWQpCisgICAgcmV0dXJuIChpdCk7CisgIHJldmVyc2VfaXRlcmF0b3IgcmV0X2l0ID0gaXQ7CisgICsrcmV0X2l0OworICBlcmFzZV9ub2RlKGl0Lm1fcF9uZCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gcmV0X2l0OworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pZihQcmVkIHByZWQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBzaXplX3R5cGUgbnVtX2Vyc2QgPSAwOworICBpdGVyYXRvciBpdCA9IGJhc2VfdHlwZTo6YmVnaW4oKTsKKyAgd2hpbGUgKGl0ICE9IGJhc2VfdHlwZTo6ZW5kKCkpCisgICAgeworICAgICAgaWYgKHByZWQoKml0KSkKKyAgICAgICAgeworCSAgKytudW1fZXJzZDsKKwkgIGl0ID0gZXJhc2UoaXQpOworICAgICAgICB9CisgICAgICBlbHNlCisJKytpdDsKKyAgICB9CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gbnVtX2Vyc2Q7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9ub2RlKG5vZGVfcG9pbnRlciBwX25kKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCAhPSAwKTsKKyAgc3BsYXkocF9uZCk7CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kID09IHRoaXMtPm1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKworICBub2RlX3BvaW50ZXIgcF9sID0gcF9uZC0+bV9wX2xlZnQ7CisgIG5vZGVfcG9pbnRlciBwX3IgPSBwX25kLT5tX3BfcmlnaHQ7CisKKyAgYmFzZV90eXBlOjp1cGRhdGVfbWluX21heF9mb3JfZXJhc2VkX25vZGUocF9uZCk7CisgIGJhc2VfdHlwZTo6YWN0dWFsX2VyYXNlX25vZGUocF9uZCk7CisgIGlmIChwX3IgPT0gMCkKKyAgICB7CisgICAgICBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcF9sOworICAgICAgaWYgKHBfbCAhPSAwKQorCXBfbC0+bV9wX3BhcmVudCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfdGFyZ2V0X3IgPSBsZWZ0bW9zdChwX3IpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF90YXJnZXRfciAhPSAwKTsKKyAgcF9yLT5tX3BfcGFyZW50ID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfcjsKKyAgc3BsYXkocF90YXJnZXRfcik7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShwX3RhcmdldF9yLT5tX3BfbGVmdCA9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF90YXJnZXRfci0+bV9wX3BhcmVudCA9PSB0aGlzLT5tX3BfaGVhZCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCh0aGlzLT5tX3BfaGVhZC0+bV9wX3BhcmVudCA9PSBwX3RhcmdldF9yKTsKKworICBwX3RhcmdldF9yLT5tX3BfbGVmdCA9IHBfbDsKKyAgaWYgKHBfbCAhPSAwKQorICAgIHBfbC0+bV9wX3BhcmVudCA9IHBfdGFyZ2V0X3I7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICB0aGlzLT5hcHBseV91cGRhdGUocF90YXJnZXRfciwgKG5vZGVfdXBkYXRlKil0aGlzKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitsZWZ0bW9zdChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisgIHdoaWxlIChwX25kLT5tX3BfbGVmdCAhPSAwKQorICAgIHBfbmQgPSBwX25kLT5tX3BfbGVmdDsKKyAgcmV0dXJuIHBfbmQ7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vZmluZF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9maW5kX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNDQ1NDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vZmluZF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEwMCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzcGxheV90cmVlXy9maW5kX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igc3BsYXlfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgbm9kZV9wb2ludGVyIHBfZm91bmQgPSBmaW5kX2ltcChyX2tleSk7CisgIGlmIChwX2ZvdW5kICE9IGJhc2VfdHlwZTo6bV9wX2hlYWQpCisgICAgc3BsYXkocF9mb3VuZCk7CisgIHJldHVybiBwb2ludF9pdGVyYXRvcihwX2ZvdW5kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgY29uc3Qgbm9kZV9wb2ludGVyIHBfZm91bmQgPSBmaW5kX2ltcChyX2tleSk7CisgIGlmIChwX2ZvdW5kICE9IGJhc2VfdHlwZTo6bV9wX2hlYWQpCisgICAgY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyogPih0aGlzKS0+c3BsYXkocF9mb3VuZCk7CisgIHJldHVybiBwb2ludF9pdGVyYXRvcihwX2ZvdW5kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6c3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLAorCQkJCQkJCSAgICAgX19MSU5FX18pOykKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50OworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIGlmICghQ21wX0ZuOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSwgcl9rZXkpKQorICAgICAgeworCWlmICghQ21wX0ZuOjpvcGVyYXRvcigpKHJfa2V5LCBQQl9EU19WMkYocF9uZC0+bV92YWx1ZSkpKQorCSAgcmV0dXJuIHBfbmQ7CisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisgIHJldHVybiBiYXNlX3R5cGU6Om1fcF9oZWFkOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGNvbnN0IHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfaW1wKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBub2RlX3BvaW50ZXIgcF9uZCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisgIHdoaWxlIChwX25kICE9IDApCisgICAgaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLCByX2tleSkpCisgICAgICB7CisJaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSkpCisJICByZXR1cm4gcF9uZDsKKwlwX25kID0gcF9uZC0+bV9wX2xlZnQ7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcF9uZCA9IHBfbmQtPm1fcF9yaWdodDsKKyAgcmV0dXJuIGJhc2VfdHlwZTo6bV9wX2hlYWQ7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vaW5mb19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9pbmZvX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMDJlZWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vaW5mb19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDM5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNwbGF5X3RyZWVfL2luZm9fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uLgorICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjIzMDZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2luc2VydF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDk0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNwbGF5X3RyZWVfL2luc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHNwbGF5X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgc3RkOjpwYWlyPHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvciwgYm9vbD4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydChjb25zdF9yZWZlcmVuY2Ugcl92YWx1ZSkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHN0ZDo6cGFpcjxwb2ludF9pdGVyYXRvciwgYm9vbD4gaW5zX3BhaXIgPSBpbnNlcnRfbGVhZl9pbXAocl92YWx1ZSk7CisgIGluc19wYWlyLmZpcnN0Lm1fcF9uZC0+bV9zcGVjaWFsID0gZmFsc2U7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBzcGxheShpbnNfcGFpci5maXJzdC5tX3BfbmQpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIGluc19wYWlyOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHN0ZDo6cGFpcjx0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IsIGJvb2w+CitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnRfbGVhZl9pbXAoY29uc3RfcmVmZXJlbmNlIHJfdmFsdWUpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjpzdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoX19GSUxFX18sCisJCQkJCQkJICAgICBfX0xJTkVfXyk7KQorICBpZiAoYmFzZV90eXBlOjptX3NpemUgPT0gMCkKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoYmFzZV90eXBlOjppbnNlcnRfaW1wX2VtcHR5KHJfdmFsdWUpLCB0cnVlKTsKKworICBub2RlX3BvaW50ZXIgcF9uZCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisgIG5vZGVfcG9pbnRlciBwX3BvdCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisKKyAgd2hpbGUgKHBfbmQgIT0gMCkKKyAgICBpZiAoIUNtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9uZC0+bV92YWx1ZSksIFBCX0RTX1YyRihyX3ZhbHVlKSkpCisgICAgICB7CisJaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHJfdmFsdWUpLCBQQl9EU19WMkYocF9uZC0+bV92YWx1ZSkpKQorCSAgeworCSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocG9pbnRfaXRlcmF0b3IocF9uZCksIGZhbHNlKTsKKwkgIH0KKwlwX3BvdCA9IHBfbmQ7CisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisKKyAgaWYgKHBfcG90ID09IGJhc2VfdHlwZTo6bV9wX2hlYWQpCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGJhc2VfdHlwZTo6aW5zZXJ0X2xlYWZfbmV3KHJfdmFsdWUsIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9yaWdodCwgZmFsc2UpLCB0cnVlKTsKKworICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1QoUEJfRFNfVjJGKHJfdmFsdWUpKQorCisgIHBfbmQgPSBwX3BvdC0+bV9wX2xlZnQ7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuIChzdGQ6Om1ha2VfcGFpcihiYXNlX3R5cGU6Omluc2VydF9sZWFmX25ldyhyX3ZhbHVlLCBwX3BvdCwgdHJ1ZSksIHRydWUpKTsKKworICB3aGlsZSAocF9uZC0+bV9wX3JpZ2h0ICE9IDApCisgICAgcF9uZCA9IHBfbmQtPm1fcF9yaWdodDsKKworICByZXR1cm4gc3RkOjptYWtlX3BhaXIodGhpcy0+aW5zZXJ0X2xlYWZfbmV3KHJfdmFsdWUsIHBfbmQsIGZhbHNlKSwgdHJ1ZSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vbm9kZS5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vbm9kZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJiZTMwMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9ub2RlLmhwcApAQCAtMCwwICsxLDEyNiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzcGxheV90cmVlXy9ub2RlLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gc3RydWN0IGZvciBzcGxheV90cmVlXydzIG5vZGUuCisgKi8KKworI2lmbmRlZiBQQl9EU19TUExBWV9UUkVFX05PREVfSFBQCisjZGVmaW5lIFBCX0RTX1NQTEFZX1RSRUVfTk9ERV9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIE5vZGUgZm9yIHNwbGF5IHRyZWUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgY2xhc3MgTWV0YWRhdGEsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3Qgc3BsYXlfdHJlZV9ub2RlXworICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgTWV0YWRhdGEgbWV0YWRhdGFfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisgICAgICBzcGxheV90cmVlX25vZGVfPFZhbHVlX1R5cGUsIE1ldGFkYXRhLCBfQWxsb2M+ID46Om90aGVyOjpwb2ludGVyCisgICAgICBub2RlX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPG1ldGFkYXRhX3R5cGU+OjpvdGhlcjo6cmVmZXJlbmNlCisgICAgICBtZXRhZGF0YV9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPG1ldGFkYXRhX3R5cGU+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlCisgICAgICBtZXRhZGF0YV9jb25zdF9yZWZlcmVuY2U7CisKKyNpZmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0CisgICAgICB7IHN0ZDo6Y291dCA8PCBQQl9EU19WMkYobV92YWx1ZSkgPDwgIigiIDw8IG1fbWV0YWRhdGEgPDwgIikiOyB9CisjZW5kaWYKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIHNwZWNpYWwoKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9zcGVjaWFsOyB9CisKKyAgICAgIGlubGluZSBtZXRhZGF0YV9jb25zdF9yZWZlcmVuY2UKKyAgICAgIGdldF9tZXRhZGF0YSgpIGNvbnN0CisgICAgICB7IHJldHVybiBtX21ldGFkYXRhOyB9CisKKyAgICAgIGlubGluZSBtZXRhZGF0YV9yZWZlcmVuY2UKKyAgICAgIGdldF9tZXRhZGF0YSgpCisgICAgICB7IHJldHVybiBtX21ldGFkYXRhOyB9CisKKyAgICAgIHZhbHVlX3R5cGUgbV92YWx1ZTsKKyAgICAgIGJvb2wgbV9zcGVjaWFsOworICAgICAgbm9kZV9wb2ludGVyIG1fcF9sZWZ0OworICAgICAgbm9kZV9wb2ludGVyIG1fcF9yaWdodDsKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfcGFyZW50OworICAgICAgbWV0YWRhdGFfdHlwZSBtX21ldGFkYXRhOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHNwbGF5X3RyZWVfbm9kZV88VmFsdWVfVHlwZSwgbnVsbF90eXBlLCBfQWxsb2M+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgVmFsdWVfVHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBudWxsX3R5cGUgbWV0YWRhdGFfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisgICAgICBzcGxheV90cmVlX25vZGVfPFZhbHVlX1R5cGUsIG51bGxfdHlwZSwgX0FsbG9jPiA+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgbm9kZV9wb2ludGVyOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgc3BlY2lhbCgpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3NwZWNpYWw7IH0KKworI2lmZGVmIFBCX0RTX0JJTl9TRUFSQ0hfVFJFRV9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3QKKyAgICAgIHsgc3RkOjpjb3V0IDw8IFBCX0RTX1YyRihtX3ZhbHVlKTsgfQorI2VuZGlmIAorCisgICAgICBub2RlX3BvaW50ZXIgbV9wX2xlZnQ7CisgICAgICBub2RlX3BvaW50ZXIgbV9wX3JpZ2h0OworICAgICAgbm9kZV9wb2ludGVyIG1fcF9wYXJlbnQ7CisgICAgICB2YWx1ZV90eXBlIG1fdmFsdWU7CisgICAgICBib29sIG1fc3BlY2lhbDsKKyAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL3NwbGF5X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL3NwbGF5X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0M2QzYzIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsYXlfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyODEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsYXlfdHJlZV8vc3BsYXlfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBzcGxheV90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsYXkobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIHdoaWxlIChwX25kLT5tX3BfcGFyZW50ICE9IGJhc2VfdHlwZTo6bV9wX2hlYWQpCisgICAgeworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB7CisJbm9kZV9wb2ludGVyIHBfaGVhZCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisJYXNzZXJ0X3NwZWNpYWxfaW1wKHBfaGVhZCwgX19GSUxFX18sIF9fTElORV9fKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBQQl9EU19BU1NFUlRfQkFTRV9OT0RFX0NPTlNJU1RFTlQocF9uZCkKKworICAgICAgaWYgKHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQgPT0gYmFzZV90eXBlOjptX3BfaGVhZCkKKwl7CisJICBiYXNlX3R5cGU6OnJvdGF0ZV9wYXJlbnQocF9uZCk7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCA9PSB0aGlzLT5tX3BfaGVhZC0+bV9wX3BhcmVudCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNvbnN0IG5vZGVfcG9pbnRlciBwX3BhcmVudCA9IHBfbmQtPm1fcF9wYXJlbnQ7CisJICBjb25zdCBub2RlX3BvaW50ZXIgcF9ncmFuZHBhcmVudCA9IHBfcGFyZW50LT5tX3BfcGFyZW50OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKwkgIGNvbnN0IHNpemVfdHlwZSB0b3RhbCA9CisJICAgIGJhc2VfdHlwZTo6cmVjdXJzaXZlX2NvdW50KHBfZ3JhbmRwYXJlbnQpOworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHRvdGFsID49IDMpOworI2VuZGlmCisKKwkgIGlmIChwX3BhcmVudC0+bV9wX2xlZnQgPT0gcF9uZCAmJgorCSAgICAgIHBfZ3JhbmRwYXJlbnQtPm1fcF9yaWdodCA9PSBwX3BhcmVudCkKKwkgICAgc3BsYXlfemlnX3phZ19sZWZ0KHBfbmQsIHBfcGFyZW50LCBwX2dyYW5kcGFyZW50KTsKKwkgIGVsc2UgaWYgKHBfcGFyZW50LT5tX3BfcmlnaHQgPT0gcF9uZCAmJgorCQkgICBwX2dyYW5kcGFyZW50LT5tX3BfbGVmdCA9PSBwX3BhcmVudCkKKwkgICAgc3BsYXlfemlnX3phZ19yaWdodChwX25kLCBwX3BhcmVudCwgcF9ncmFuZHBhcmVudCk7CisJICBlbHNlIGlmIChwX3BhcmVudC0+bV9wX2xlZnQgPT0gcF9uZCAmJgorCQkgICBwX2dyYW5kcGFyZW50LT5tX3BfbGVmdCA9PSBwX3BhcmVudCkKKwkgICAgc3BsYXlfemlnX3ppZ19sZWZ0KHBfbmQsIHBfcGFyZW50LCBwX2dyYW5kcGFyZW50KTsKKwkgIGVsc2UKKwkgICAgc3BsYXlfemlnX3ppZ19yaWdodChwX25kLCBwX3BhcmVudCwgcF9ncmFuZHBhcmVudCk7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQodG90YWwgPT10aGlzLT5yZWN1cnNpdmVfY291bnQocF9uZCkpOworCX0KKworICAgICAgUEJfRFNfQVNTRVJUX0JBU0VfTk9ERV9DT05TSVNURU5UKHBfbmQpCisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGF5X3ppZ196YWdfbGVmdChub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfcGFyZW50LAorCQkgICBub2RlX3BvaW50ZXIgcF9ncmFuZHBhcmVudCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50ID09IHBfbmQtPm1fcF9wYXJlbnQpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9ncmFuZHBhcmVudCA9PSBwX3BhcmVudC0+bV9wX3BhcmVudCk7CisKKyAgUEJfRFNfQVNTRVJUX0JBU0VfTk9ERV9DT05TSVNURU5UKHBfZ3JhbmRwYXJlbnQpCisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50LT5tX3BfbGVmdCA9PSBwX25kICYmCisJCQlwX2dyYW5kcGFyZW50LT5tX3BfcmlnaHQgPT0gcF9wYXJlbnQpOworCisgIHNwbGF5X3p6X3N0YXJ0KHBfbmQsIHBfcGFyZW50LCBwX2dyYW5kcGFyZW50KTsKKworICBub2RlX3BvaW50ZXIgcF9iID0gcF9uZC0+bV9wX3JpZ2h0OworICBub2RlX3BvaW50ZXIgcF9jID0gcF9uZC0+bV9wX2xlZnQ7CisKKyAgcF9uZC0+bV9wX3JpZ2h0ID0gcF9wYXJlbnQ7CisgIHBfcGFyZW50LT5tX3BfcGFyZW50ID0gcF9uZDsKKworICBwX25kLT5tX3BfbGVmdCA9IHBfZ3JhbmRwYXJlbnQ7CisgIHBfZ3JhbmRwYXJlbnQtPm1fcF9wYXJlbnQgPSBwX25kOworCisgIHBfcGFyZW50LT5tX3BfbGVmdCA9IHBfYjsKKyAgaWYgKHBfYiAhPSAwKQorICAgIHBfYi0+bV9wX3BhcmVudCA9IHBfcGFyZW50OworCisgIHBfZ3JhbmRwYXJlbnQtPm1fcF9yaWdodCA9IHBfYzsKKyAgaWYgKHBfYyAhPSAwKQorICAgIHBfYy0+bV9wX3BhcmVudCA9IHBfZ3JhbmRwYXJlbnQ7CisKKyAgc3BsYXlfenpfZW5kKHBfbmQsIHBfcGFyZW50LCBwX2dyYW5kcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxheV96aWdfemFnX3JpZ2h0KG5vZGVfcG9pbnRlciBwX25kLCBub2RlX3BvaW50ZXIgcF9wYXJlbnQsCisJCSAgICBub2RlX3BvaW50ZXIgcF9ncmFuZHBhcmVudCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50ID09IHBfbmQtPm1fcF9wYXJlbnQpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9ncmFuZHBhcmVudCA9PSBwX3BhcmVudC0+bV9wX3BhcmVudCk7CisKKyAgUEJfRFNfQVNTRVJUX0JBU0VfTk9ERV9DT05TSVNURU5UKHBfZ3JhbmRwYXJlbnQpCisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50LT5tX3BfcmlnaHQgPT0gcF9uZCAmJgorCSAgCQlwX2dyYW5kcGFyZW50LT5tX3BfbGVmdCA9PSBwX3BhcmVudCk7CisKKyAgc3BsYXlfenpfc3RhcnQocF9uZCwgcF9wYXJlbnQsIHBfZ3JhbmRwYXJlbnQpOworCisgIG5vZGVfcG9pbnRlciBwX2IgPSBwX25kLT5tX3BfbGVmdDsKKyAgbm9kZV9wb2ludGVyIHBfYyA9IHBfbmQtPm1fcF9yaWdodDsKKworICBwX25kLT5tX3BfbGVmdCA9IHBfcGFyZW50OworICBwX3BhcmVudC0+bV9wX3BhcmVudCA9IHBfbmQ7CisKKyAgcF9uZC0+bV9wX3JpZ2h0ID0gcF9ncmFuZHBhcmVudDsKKyAgcF9ncmFuZHBhcmVudC0+bV9wX3BhcmVudCA9IHBfbmQ7CisKKyAgcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfYjsKKyAgaWYgKHBfYiAhPSAwKQorICAgIHBfYi0+bV9wX3BhcmVudCA9IHBfcGFyZW50OworCisgIHBfZ3JhbmRwYXJlbnQtPm1fcF9sZWZ0ID0gcF9jOworICBpZiAocF9jICE9IDApCisgICAgcF9jLT5tX3BfcGFyZW50ID0gcF9ncmFuZHBhcmVudDsKKworICBzcGxheV96el9lbmQocF9uZCwgcF9wYXJlbnQsIHBfZ3JhbmRwYXJlbnQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGF5X3ppZ196aWdfbGVmdChub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfcGFyZW50LAorCQkgICBub2RlX3BvaW50ZXIgcF9ncmFuZHBhcmVudCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50ID09IHBfbmQtPm1fcF9wYXJlbnQpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9ncmFuZHBhcmVudCA9PSBwX3BhcmVudC0+bV9wX3BhcmVudCk7CisKKyAgUEJfRFNfQVNTRVJUX0JBU0VfTk9ERV9DT05TSVNURU5UKHBfZ3JhbmRwYXJlbnQpCisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50LT5tX3BfbGVmdCA9PSBwX25kICYmCisJCSAgICAgcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPT0gcF9uZC0+bV9wX3BhcmVudCk7CisKKyAgc3BsYXlfenpfc3RhcnQocF9uZCwgcF9wYXJlbnQsIHBfZ3JhbmRwYXJlbnQpOworCisgIG5vZGVfcG9pbnRlciBwX2IgPSBwX25kLT5tX3BfcmlnaHQ7CisgIG5vZGVfcG9pbnRlciBwX2MgPSBwX3BhcmVudC0+bV9wX3JpZ2h0OworCisgIHBfbmQtPm1fcF9yaWdodCA9IHBfcGFyZW50OworICBwX3BhcmVudC0+bV9wX3BhcmVudCA9IHBfbmQ7CisKKyAgcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfZ3JhbmRwYXJlbnQ7CisgIHBfZ3JhbmRwYXJlbnQtPm1fcF9wYXJlbnQgPSBwX3BhcmVudDsKKworICBwX3BhcmVudC0+bV9wX2xlZnQgPSBwX2I7CisgIGlmIChwX2IgIT0gMCkKKyAgICBwX2ItPm1fcF9wYXJlbnQgPSBwX3BhcmVudDsKKworICBwX2dyYW5kcGFyZW50LT5tX3BfbGVmdCA9IHBfYzsKKyAgaWYgKHBfYyAhPSAwKQorICAgIHBfYy0+bV9wX3BhcmVudCA9IHBfZ3JhbmRwYXJlbnQ7CisKKyAgc3BsYXlfenpfZW5kKHBfbmQsIHBfcGFyZW50LCBwX2dyYW5kcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxheV96aWdfemlnX3JpZ2h0KG5vZGVfcG9pbnRlciBwX25kLCBub2RlX3BvaW50ZXIgcF9wYXJlbnQsCisJCSAgICBub2RlX3BvaW50ZXIgcF9ncmFuZHBhcmVudCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50ID09IHBfbmQtPm1fcF9wYXJlbnQpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9ncmFuZHBhcmVudCA9PSBwX3BhcmVudC0+bV9wX3BhcmVudCk7CisgIFBCX0RTX0FTU0VSVF9CQVNFX05PREVfQ09OU0lTVEVOVChwX2dyYW5kcGFyZW50KQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9wYXJlbnQtPm1fcF9yaWdodCA9PSBwX25kICYmCisJCSAgcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0ID09IHBfbmQtPm1fcF9wYXJlbnQpOworCisgIHNwbGF5X3p6X3N0YXJ0KHBfbmQsIHBfcGFyZW50LCBwX2dyYW5kcGFyZW50KTsKKworICBub2RlX3BvaW50ZXIgcF9iID0gcF9uZC0+bV9wX2xlZnQ7CisgIG5vZGVfcG9pbnRlciBwX2MgPSBwX3BhcmVudC0+bV9wX2xlZnQ7CisKKyAgcF9uZC0+bV9wX2xlZnQgPSBwX3BhcmVudDsKKyAgcF9wYXJlbnQtPm1fcF9wYXJlbnQgPSBwX25kOworCisgIHBfcGFyZW50LT5tX3BfbGVmdCA9IHBfZ3JhbmRwYXJlbnQ7CisgIHBfZ3JhbmRwYXJlbnQtPm1fcF9wYXJlbnQgPSBwX3BhcmVudDsKKworICBwX3BhcmVudC0+bV9wX3JpZ2h0ID0gcF9iOworICBpZiAocF9iICE9IDApCisgICAgcF9iLT5tX3BfcGFyZW50ID0gcF9wYXJlbnQ7CisKKyAgcF9ncmFuZHBhcmVudC0+bV9wX3JpZ2h0ID0gcF9jOworICBpZiAocF9jICE9IDApCisgICAgcF9jLT5tX3BfcGFyZW50ID0gcF9ncmFuZHBhcmVudDsKKworICBiYXNlX3R5cGU6OnVwZGF0ZV90b190b3AocF9ncmFuZHBhcmVudCwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgc3BsYXlfenpfZW5kKHBfbmQsIHBfcGFyZW50LCBwX2dyYW5kcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxheV96el9zdGFydChub2RlX3BvaW50ZXIgcF9uZCwKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCSAgICAgICBub2RlX3BvaW50ZXIgcF9wYXJlbnQsCisjZWxzZQorCSAgICAgICBub2RlX3BvaW50ZXIgLypwX3BhcmVudCovLAorI2VuZGlmCisJICAgICAgIG5vZGVfcG9pbnRlciBwX2dyYW5kcGFyZW50KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50ICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9ncmFuZHBhcmVudCAhPSAwKTsKKworICBjb25zdCBib29sIGdyYW5kcGFyZW50X2hlYWQgPSBwX2dyYW5kcGFyZW50LT5tX3BfcGFyZW50ID09IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisKKyAgaWYgKGdyYW5kcGFyZW50X2hlYWQpCisgICAgeworICAgICAgYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisgICAgICBwX25kLT5tX3BfcGFyZW50ID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfZ3JlYXRncmFuZHBhcmVudCA9IHBfZ3JhbmRwYXJlbnQtPm1fcF9wYXJlbnQ7CisKKyAgcF9uZC0+bV9wX3BhcmVudCA9IHBfZ3JlYXRncmFuZHBhcmVudDsKKworICBpZiAocF9ncmFuZHBhcmVudCA9PSBwX2dyZWF0Z3JhbmRwYXJlbnQtPm1fcF9sZWZ0KQorICAgIHBfZ3JlYXRncmFuZHBhcmVudC0+bV9wX2xlZnQgPSBwX25kOworICBlbHNlCisgICAgcF9ncmVhdGdyYW5kcGFyZW50LT5tX3BfcmlnaHQgPSBwX25kOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGF5X3p6X2VuZChub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfcGFyZW50LAorCSAgICAgbm9kZV9wb2ludGVyIHBfZ3JhbmRwYXJlbnQpCit7CisgIGlmIChwX25kLT5tX3BfcGFyZW50ID09IGJhc2VfdHlwZTo6bV9wX2hlYWQpCisgICAgYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfbmQ7CisKKyAgdGhpcy0+YXBwbHlfdXBkYXRlKHBfZ3JhbmRwYXJlbnQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgIHRoaXMtPmFwcGx5X3VwZGF0ZShwX3BhcmVudCwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgdGhpcy0+YXBwbHlfdXBkYXRlKHBfbmQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgIFBCX0RTX0FTU0VSVF9CQVNFX05PREVfQ09OU0lTVEVOVChwX25kKQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL3NwbGF5X3RyZWVfLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxheV90cmVlXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwZDZiMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxheV90cmVlXy5ocHAKQEAgLTAsMCArMSwyNzUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsYXlfdHJlZV8vc3BsYXlfdHJlZV8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igc3BsYXkgdHJlZXMuCisgKi8KKy8qCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYW4gaWRlYSBmcm9tIHRoZSBTR0kgU1RMICh1c2luZyBhIEBhIGhlYWRlciBub2RlCisgKiAgICB3aGljaCBpcyBuZWVkZWQgZm9yIGVmZmljaWVudCBpdGVyYXRpb24pLiBGb2xsb3dpbmcgaXMgdGhlIFNHSSBTVEwKKyAqICAgIGNvcHlyaWdodC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICAgIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICAgIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gICAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICovCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjIGRlZmluZSBQQl9EU19TX1RSRUVfTkFNRSBzcGxheV90cmVlX21hcAorIyBkZWZpbmUgUEJfRFNfU19UUkVFX0JBU0VfTkFNRSBiaW5fc2VhcmNoX3RyZWVfbWFwCisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisjIGRlZmluZSBQQl9EU19TX1RSRUVfTkFNRSBzcGxheV90cmVlX3NldAorIyBkZWZpbmUgUEJfRFNfU19UUkVFX0JBU0VfTkFNRSBiaW5fc2VhcmNoX3RyZWVfc2V0CisjZW5kaWYKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIENtcF9GbiwgXAorCSAgICAgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIFBCX0RTX1NfVFJFRV9OQU1FPEtleSwgTWFwcGVkLCBDbXBfRm4sIE5vZGVfQW5kX0l0X1RyYWl0cywgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX1NfVFJFRV9CQVNFIFwKKyAgICBQQl9EU19TX1RSRUVfQkFTRV9OQU1FPEtleSwgTWFwcGVkLCBDbXBfRm4sIE5vZGVfQW5kX0l0X1RyYWl0cywgX0FsbG9jPgorCisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmIFNwbGF5IHRyZWUuCisgICAgICogIEBpbmdyb3VwIGJyYW5jaC1kZXRhaWwKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgQ21wX0ZuLAorCSAgICAgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgUEJfRFNfU19UUkVFX05BTUUgOiBwdWJsaWMgUEJfRFNfU19UUkVFX0JBU0UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgUEJfRFNfU19UUkVFX0JBU0UgCQkgICAgICAgCSBiYXNlX3R5cGU7CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlIGRlYnVnX2Jhc2U7CisjZW5kaWYKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3BvaW50ZXIgCQkgbm9kZV9wb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzcGxheV90cmVlX3RhZyAJCQkJIGNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jIAkJCQkJIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIAkJIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgQ21wX0ZuIAkJCQkJIGNtcF9mbjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfdHlwZSAJCSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfcG9pbnRlciAJCSBrZXlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfY29uc3RfcG9pbnRlciAJIGtleV9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmtleV9yZWZlcmVuY2UgCSBrZXlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmtleV9jb25zdF9yZWZlcmVuY2UgCSBrZXlfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om1hcHBlZF90eXBlIAkgCSBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjptYXBwZWRfcG9pbnRlciAJIG1hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om1hcHBlZF9jb25zdF9wb2ludGVyIAkgbWFwcGVkX2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bWFwcGVkX3JlZmVyZW5jZSAJIG1hcHBlZF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bWFwcGVkX2NvbnN0X3JlZmVyZW5jZSBtYXBwZWRfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnZhbHVlX3R5cGUgCQkgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludGVyIAkJIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfcG9pbnRlciAJIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cmVmZXJlbmNlIAkgCSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIAkgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50X2l0ZXJhdG9yIAkgcG9pbnRfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgCSBwb2ludF9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjppdGVyYXRvciAJCSBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciAJIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgCSByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3VwZGF0ZSAJCSBub2RlX3VwZGF0ZTsKKworICAgICAgUEJfRFNfU19UUkVFX05BTUUoKTsKKworICAgICAgUEJfRFNfU19UUkVFX05BTUUoY29uc3QgQ21wX0ZuJik7CisKKyAgICAgIFBCX0RTX1NfVFJFRV9OQU1FKGNvbnN0IENtcF9GbiYsIGNvbnN0IG5vZGVfdXBkYXRlJik7CisKKyAgICAgIFBCX0RTX1NfVFJFRV9OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fcmFuZ2UoSXQsIEl0KTsKKworICAgICAgdm9pZAorICAgICAgaW5pdGlhbGl6ZSgpOworCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbHVlKTsKKworICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKKyAgICAgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisJc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPiBpbnNfcGFpciA9CisJICBpbnNlcnRfbGVhZl9pbXAodmFsdWVfdHlwZShyX2tleSwgbWFwcGVkX3R5cGUoKSkpOworCisJaW5zX3BhaXIuZmlyc3QubV9wX25kLT5tX3NwZWNpYWwgPSBmYWxzZTsKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXykpOworCXNwbGF5KGluc19wYWlyLmZpcnN0Lm1fcF9uZCk7CisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisJcmV0dXJuIGluc19wYWlyLmZpcnN0Lm1fcF9uZC0+bV92YWx1ZS5zZWNvbmQ7CisjZWxzZQorCWluc2VydChyX2tleSk7CisJcmV0dXJuIGJhc2VfdHlwZTo6c19udWxsX3R5cGU7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgcG9pbnRfY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcmFzZShrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBpdCk7CisKKyAgICAgIGlubGluZSByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBlcmFzZShyZXZlcnNlX2l0ZXJhdG9yKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIGVyYXNlX2lmKFByZWQpOworCisgICAgICB2b2lkCisgICAgICBqb2luKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0KGtleV9jb25zdF9yZWZlcmVuY2UsIFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICBwcml2YXRlOgorICAgICAgaW5saW5lIHN0ZDo6cGFpcjxwb2ludF9pdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydF9sZWFmX2ltcChjb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBmaW5kX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIGNvbnN0IG5vZGVfcG9pbnRlcgorICAgICAgZmluZF9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3NwZWNpYWxfaW1wKGNvbnN0IG5vZGVfcG9pbnRlciwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIGNvbnN0OworI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGF5KG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzcGxheV96aWdfemFnX2xlZnQobm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzcGxheV96aWdfemFnX3JpZ2h0KG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3BsYXlfemlnX3ppZ19sZWZ0KG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3BsYXlfemlnX3ppZ19yaWdodChub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHNwbGF5X3p6X3N0YXJ0KG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3BsYXlfenpfZW5kKG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBsZWZ0bW9zdChub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZV9ub2RlKG5vZGVfcG9pbnRlcik7CisgICAgfTsKKworI2RlZmluZSBQQl9EU19BU1NFUlRfQkFTRV9OT0RFX0NPTlNJU1RFTlQoX05vZGUpCQkJXAorICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChfTm9kZSwJCVwKKwkJCQkJCQlfX0ZJTEVfXywgX19MSU5FX18pOykKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9pbnNlcnRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxheV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2VyYXNlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vZmluZF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2RlYnVnX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcD4KKworI3VuZGVmIFBCX0RTX0FTU0VSVF9CQVNFX05PREVfQ09OU0lTVEVOVAorI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19TX1RSRUVfTkFNRQorI3VuZGVmIFBCX0RTX1NfVFJFRV9CQVNFX05BTUUKKyN1bmRlZiBQQl9EU19TX1RSRUVfQkFTRQorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhNjUzMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTEyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNwbGF5X3RyZWVfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBzcGxheV90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICBpZiAoYmFzZV90eXBlOjpqb2luX3ByZXAob3RoZXIpID09IGZhbHNlKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBub2RlX3BvaW50ZXIgcF90YXJnZXRfciA9IG90aGVyLmxlZnRtb3N0KG90aGVyLm1fcF9oZWFkKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdGFyZ2V0X3IgIT0gMCk7CisgIG90aGVyLnNwbGF5KHBfdGFyZ2V0X3IpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3RhcmdldF9yID09IG90aGVyLm1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdGFyZ2V0X3ItPm1fcF9sZWZ0ID09IDApOworCisgIHBfdGFyZ2V0X3ItPm1fcF9sZWZ0ID0gYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudDsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF90YXJnZXRfci0+bV9wX2xlZnQgIT0gMCk7CisgIHBfdGFyZ2V0X3ItPm1fcF9sZWZ0LT5tX3BfcGFyZW50ID0gcF90YXJnZXRfcjsKKworICBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcF90YXJnZXRfcjsKKyAgcF90YXJnZXRfci0+bV9wX3BhcmVudCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisKKyAgdGhpcy0+YXBwbHlfdXBkYXRlKHBfdGFyZ2V0X3IsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgIGJhc2VfdHlwZTo6am9pbl9maW5pc2gob3RoZXIpOworCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisKKyAgaWYgKGJhc2VfdHlwZTo6c3BsaXRfcHJlcChyX2tleSwgb3RoZXIpID09IGZhbHNlKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBub2RlX3BvaW50ZXIgcF91cHBlcl9ib3VuZCA9IHRoaXMtPnVwcGVyX2JvdW5kKHJfa2V5KS5tX3BfbmQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3VwcGVyX2JvdW5kICE9IDApOworCisgIHNwbGF5KHBfdXBwZXJfYm91bmQpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF91cHBlcl9ib3VuZC0+bV9wX3BhcmVudCA9PSB0aGlzLT5tX3BfaGVhZCk7CisKKyAgbm9kZV9wb2ludGVyIHBfbmV3X3Jvb3QgPSBwX3VwcGVyX2JvdW5kLT5tX3BfbGVmdDsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmV3X3Jvb3QgIT0gMCk7CisKKyAgYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfbmV3X3Jvb3Q7CisgIHBfbmV3X3Jvb3QtPm1fcF9wYXJlbnQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkOworICBvdGhlci5tX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfdXBwZXJfYm91bmQ7CisgIHBfdXBwZXJfYm91bmQtPm1fcF9wYXJlbnQgPSBvdGhlci5tX3BfaGVhZDsKKyAgcF91cHBlcl9ib3VuZC0+bV9wX2xlZnQgPSAwOworICB0aGlzLT5hcHBseV91cGRhdGUocF91cHBlcl9ib3VuZCwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgYmFzZV90eXBlOjpzcGxpdF9maW5pc2gob3RoZXIpOworCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy90cmFpdHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL3RyYWl0cy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4ZWQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy90cmFpdHMuaHBwCkBAIC0wLDAgKzEsOTUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsYXlfdHJlZV8vdHJhaXRzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHNwbGF5X3RyZWVfLgorICovCisKKyNpZm5kZWYgUEJfRFNfU1BMQVlfVFJFRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisjZGVmaW5lIFBCX0RTX1NQTEFZX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9ub2RlLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIFNwZWNpYWxpemF0aW9uLgorICAgIC8vLyBAaW5ncm91cCB0cmFpdHMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgICB0eXBlbmFtZSBDbXBfRm4sCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsCisJCSAgICAgIHR5cGVuYW1lIE5vZGVfSXRyLAorCQkgICAgICB0eXBlbmFtZSBDbXBfRm5fLAorCQkgICAgICB0eXBlbmFtZSBfQWxsb2NfPgorCSAgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHRyZWVfdHJhaXRzPEtleSwgTWFwcGVkLCBDbXBfRm4sIE5vZGVfVXBkYXRlLCBzcGxheV90cmVlX3RhZywgX0FsbG9jPiAKKyAgICA6IHB1YmxpYyBiaW5fc2VhcmNoX3RyZWVfdHJhaXRzPEtleSwgTWFwcGVkLCBDbXBfRm4sIE5vZGVfVXBkYXRlLAorCQkJCSAgICBzcGxheV90cmVlX25vZGVfPAorICAgICAgdHlwZW5hbWUgdHlwZXNfdHJhaXRzPEtleSwgTWFwcGVkLCBfQWxsb2MsIGZhbHNlPjo6dmFsdWVfdHlwZSwKKyAgICAgIHR5cGVuYW1lIHRyZWVfbm9kZV9tZXRhZGF0YV9kaXNwYXRjaDxLZXksIE1hcHBlZCwgQ21wX0ZuLCBOb2RlX1VwZGF0ZSwKKwkJCQkJICAgX0FsbG9jPjo6dHlwZSwKKwkJCQkgICAgICBfQWxsb2M+LAorCQkJCSAgICAgIF9BbGxvYz4KKyAgICB7IH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24uCisgICAgLy8vIEBpbmdyb3VwIHRyYWl0cworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIGNsYXNzIENtcF9GbiwKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwKKwkJICAgICAgY2xhc3MgTm9kZV9JdHIsCisJCSAgICAgIGNsYXNzIENtcF9Gbl8sCisJCSAgICAgIHR5cGVuYW1lIF9BbGxvY18+CisgICAgICAgICAgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHRyZWVfdHJhaXRzPEtleSwgbnVsbF90eXBlLCBDbXBfRm4sIE5vZGVfVXBkYXRlLAorCQkgICAgICAgc3BsYXlfdHJlZV90YWcsIF9BbGxvYz4gCisgICAgOiBwdWJsaWMgYmluX3NlYXJjaF90cmVlX3RyYWl0czxLZXksIG51bGxfdHlwZSwgQ21wX0ZuLCBOb2RlX1VwZGF0ZSwgCisJCQkJICAgIHNwbGF5X3RyZWVfbm9kZV88CisgICAgICB0eXBlbmFtZSB0eXBlc190cmFpdHM8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgZmFsc2U+Ojp2YWx1ZV90eXBlLAorICAgICAgdHlwZW5hbWUgdHJlZV9ub2RlX21ldGFkYXRhX2Rpc3BhdGNoPEtleSwgbnVsbF90eXBlLCBDbXBfRm4sIE5vZGVfVXBkYXRlLAorCQkJCQkgICBfQWxsb2M+Ojp0eXBlLAorCQkJCSAgICAgIF9BbGxvYz4sCisJCQkJICAgIF9BbGxvYz4KKyAgICB7IH07CisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1NQTEFZX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3N0YW5kYXJkX3BvbGljaWVzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zdGFuZGFyZF9wb2xpY2llcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxN2U0NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zdGFuZGFyZF9wb2xpY2llcy5ocHAKQEAgLTAsMCArMSwxNTggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZGV0YWlsL3N0YW5kYXJkX3BvbGljaWVzLmhwcAorICogQ29udGFpbnMgc3RhbmRhcmQgcG9saWNpZXMgZm9yIGNvbnRhaW5lcnMuCisgKi8KKworI2lmbmRlZiBQQl9EU19TVEFOREFSRF9QT0xJQ0lFU19IUFAKKyNkZWZpbmUgUEJfRFNfU1RBTkRBUkRfUE9MSUNJRVNfSFBQCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2hhc2hfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvbGlzdF91cGRhdGVfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JyYW5jaF9wb2xpY3kvbnVsbF9ub2RlX21ldGFkYXRhLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90cmllX3BvbGljeS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZSwgZGVmYXVsdF9oYXNoX2ZuLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleT4KKyAgICBzdHJ1Y3QgZGVmYXVsdF9oYXNoX2ZuCisgICAgeworCS8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIHN0ZDo6dHIxOjpoYXNoPEtleT4gCQkJCXR5cGU7CisgICAgfTsKKworICAgIC8vLyBQcmltYXJ5IHRlbXBsYXRlLCBkZWZhdWx0X2VxX2ZuLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleT4KKyAgICBzdHJ1Y3QgZGVmYXVsdF9lcV9mbgorICAgIHsKKwkvLy8gRGlzcGF0Y2hlZCB0eXBlLgorICAgICAgdHlwZWRlZiBzdGQ6OmVxdWFsX3RvPEtleT4gCQkJCXR5cGU7CisgICAgfTsKKworICAgIC8vLyBFbnVtZXJhdGlvbiBmb3IgZGVmYXVsdCBiZWhhdmlvciBvZiBzdG9yZWQgaGFzaCBkYXRhLgorICAgIGVudW0KKyAgICAgIHsKKwlkZWZhdWx0X3N0b3JlX2hhc2ggPSBmYWxzZQorICAgICAgfTsKKworICAgIC8vLyBQcmltYXJ5IHRlbXBsYXRlLCBkZWZhdWx0X2NvbWJfaGFzaF9mbi4KKyAgICBzdHJ1Y3QgZGVmYXVsdF9jb21iX2hhc2hfZm4KKyAgICB7CisJLy8vIERpc3BhdGNoZWQgdHlwZS4KKyAgICAgIHR5cGVkZWYgZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZzw+IAkJCXR5cGU7CisgICAgfTsKKworICAgIC8vLyBQcmltYXJ5IHRlbXBsYXRlLCBkZWZhdWx0X3Jlc2l6ZV9wb2xpY3kuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29tYl9IYXNoX0ZuPgorICAgIHN0cnVjdCBkZWZhdWx0X3Jlc2l6ZV9wb2xpY3kKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQ29tYl9IYXNoX0ZuOjpzaXplX3R5cGUgCQkJc2l6ZV90eXBlOworCisgICAgICB0eXBlZGVmIGRpcmVjdF9tYXNrX3JhbmdlX2hhc2hpbmc8c2l6ZV90eXBlPiAJCWRlZmF1bHRfZm47CisgICAgICB0eXBlZGVmIGlzX3NhbWU8ZGVmYXVsdF9mbiwgQ29tYl9IYXNoX0ZuPiAJCXNhbWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeTxzaXplX3R5cGU+IAkJaWZ0cnVlOworICAgICAgdHlwZWRlZiBoYXNoX3ByaW1lX3NpemVfcG9saWN5IAkJCQlpZmZhbHNlOworICAgICAgdHlwZWRlZiBfX2NvbmRpdGlvbmFsX3R5cGU8c2FtZV90eXBlOjp2YWx1ZSwgaWZ0cnVlLCBpZmZhbHNlPiBjb25kX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRfdHlwZTo6X190eXBlIAkJICAgICAgIHNpemVfcG9saWN5X3R5cGU7CisKKyAgICAgIHR5cGVkZWYgaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyPGZhbHNlLCBzaXplX3R5cGU+IAl0cmlnZ2VyOworCisgICAgcHVibGljOgorCS8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIGhhc2hfc3RhbmRhcmRfcmVzaXplX3BvbGljeTxzaXplX3BvbGljeV90eXBlLCB0cmlnZ2VyLCAKKwkJCQkJICBmYWxzZSwgc2l6ZV90eXBlPiAJdHlwZTsKKyAgICB9OworCisgICAgLy8vIERlZmF1bHQgdXBkYXRlIHBvbGljeS4KKyAgICBzdHJ1Y3QgZGVmYXVsdF91cGRhdGVfcG9saWN5CisgICAgeworCS8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIGx1X21vdmVfdG9fZnJvbnRfcG9saWN5PD4gCQkJdHlwZTsKKyAgICB9OworCisgICAgLy8vIFByaW1hcnkgdGVtcGxhdGUsIGRlZmF1bHRfcHJvYmVfZm4uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29tYl9Qcm9iZV9Gbj4KKyAgICBzdHJ1Y3QgZGVmYXVsdF9wcm9iZV9mbgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBDb21iX1Byb2JlX0ZuOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIGRpcmVjdF9tYXNrX3JhbmdlX2hhc2hpbmc8c2l6ZV90eXBlPiAJCWRlZmF1bHRfZm47CisgICAgICB0eXBlZGVmIGlzX3NhbWU8ZGVmYXVsdF9mbiwgQ29tYl9Qcm9iZV9Gbj4gCQlzYW1lX3R5cGU7CisgICAgICB0eXBlZGVmIGxpbmVhcl9wcm9iZV9mbjxzaXplX3R5cGU+IAkJCWlmdHJ1ZTsKKyAgICAgIHR5cGVkZWYgcXVhZHJhdGljX3Byb2JlX2ZuPHNpemVfdHlwZT4gCQkJaWZmYWxzZTsKKyAgICAgIHR5cGVkZWYgX19jb25kaXRpb25hbF90eXBlPHNhbWVfdHlwZTo6dmFsdWUsIGlmdHJ1ZSwgaWZmYWxzZT4gY29uZF90eXBlOworCisgICAgcHVibGljOgorCS8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRfdHlwZTo6X190eXBlIAkJCXR5cGU7CisgICAgfTsKKworCisgICAgLy8vIFByaW1hcnkgdGVtcGxhdGUsIGRlZmF1bHRfdHJpZV9hY2Nlc3NfdHJhaXRzLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleT4KKyAgICAgIHN0cnVjdCBkZWZhdWx0X3RyaWVfYWNjZXNzX3RyYWl0czsKKworI2RlZmluZSBfX2R0cmllX2FsbG9jIHN0ZDo6YWxsb2NhdG9yPGNoYXI+ICAKKyNkZWZpbmUgX19kdHJpZV9zdHJpbmcgc3RkOjpiYXNpY19zdHJpbmc8Q2hhciwgQ2hhcl9UcmFpdHMsIF9fZHRyaWVfYWxsb2M+IAorCisgICAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24sIGRlZmF1bHRfdHJpZV9hY2Nlc3NfdHJhaXRzLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIENoYXIsIHR5cGVuYW1lIENoYXJfVHJhaXRzPgorICAgICAgc3RydWN0IGRlZmF1bHRfdHJpZV9hY2Nlc3NfdHJhaXRzPF9fZHRyaWVfc3RyaW5nPgorICAgICAgeworICAgICAgcHJpdmF0ZToKKwl0eXBlZGVmIF9fZHRyaWVfc3RyaW5nCQkJCQlzdHJpbmdfdHlwZTsKKworICAgICAgcHVibGljOgorCS8vLyBEaXNwYXRjaGVkIHR5cGUuCisJdHlwZWRlZiB0cmllX3N0cmluZ19hY2Nlc3NfdHJhaXRzPHN0cmluZ190eXBlPiAJCXR5cGU7CisgICAgICB9OworCisjdW5kZWYgX19kdHJpZV9hbGxvYworI3VuZGVmIF9fZHRyaWVfc3RyaW5nCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1NUQU5EQVJEX1BPTElDSUVTX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjgzNTBlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdGhpbl9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoaW5faGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICB3aGlsZSAoZmlyc3RfaXQgIT0gbGFzdF9pdCkKKyAgICBwdXNoKCooZmlyc3RfaXQrKykpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RoaW5faGVhcCgpIDogbV9wX21heCgwKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgordGhpbl9oZWFwKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pIAorOiBiYXNlX3R5cGUocl9jbXBfZm4pLCBtX3BfbWF4KDApCit7CisgIGluaXRpYWxpemUoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit0aGluX2hlYXAoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSAKKzogYmFzZV90eXBlKG90aGVyKQoreworICBpbml0aWFsaXplKCk7CisgIG1fcF9tYXggPSBiYXNlX3R5cGU6Om1fcF9yb290OworICBmb3IgKG5vZGVfcG9pbnRlciBwX25kID0gYmFzZV90eXBlOjptX3Bfcm9vdDsgcF9uZCAhPSAwOyAKKyAgICAgICBwX25kID0gcF9uZC0+bV9wX25leHRfc2libGluZykKKyAgICBpZiAoQ21wX0ZuOjpvcGVyYXRvcigpKG1fcF9tYXgtPm1fdmFsdWUsIHBfbmQtPm1fdmFsdWUpKQorICAgICAgbV9wX21heCA9IHBfbmQ7CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGJhc2VfdHlwZTo6c3dhcChvdGhlcik7CisgIHN0ZDo6c3dhcChtX3BfbWF4LCBvdGhlci5tX3BfbWF4KTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+dGhpbl9oZWFwKCkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdGlhbGl6ZSgpCit7IHN0ZDo6ZmlsbChtX2FfYXV4LCBtX2FfYXV4ICsgbWF4X3JhbmssIHN0YXRpY19jYXN0PG5vZGVfcG9pbnRlcj4oMCkpOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5N2E2YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTE5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRoaW5faGVhcF8vZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGluX2hlYXBfLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgYmFzZV90eXBlOjphc3NlcnRfdmFsaWQoX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KGJhc2VfdHlwZTo6bV9wX3Jvb3QsIHRydWUsIF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X21heChfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9hdXhfbnVsbChfX2ZpbGUsIF9fbGluZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfYXV4X251bGwoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1heF9yYW5rOyArK2kpCisgICAgUEJfRFNfREVCVUdfVkVSSUZZKG1fYV9hdXhbaV0gPT0gMCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbWF4KGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgaWYgKG1fcF9tYXggPT0gMCkKKyAgICB7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkoYmFzZV90eXBlOjplbXB0eSgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgUEJfRFNfREVCVUdfVkVSSUZZKCFiYXNlX3R5cGU6OmVtcHR5KCkpOworICBQQl9EU19ERUJVR19WRVJJRlkoYmFzZV90eXBlOjpwYXJlbnQobV9wX21heCkgPT0gMCk7CisgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3BfbWF4LT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gMCk7CisgIGZvciAoY29uc3RfaXRlcmF0b3IgaXQgPSBiYXNlX3R5cGU6OmJlZ2luKCk7IGl0ICE9IGJhc2VfdHlwZTo6ZW5kKCk7ICsraXQpCisgICAgUEJfRFNfREVCVUdfVkVSSUZZKCFDbXBfRm46Om9wZXJhdG9yKCkobV9wX21heC0+bV92YWx1ZSwgaXQubV9wX25kLT5tX3ZhbHVlKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbm9kZV9jb25zaXN0ZW50KG5vZGVfY29uc3RfcG9pbnRlciBwX25kLCBib29sIHJvb3QsCisJCSAgICAgICBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kLCByb290LCBfX2ZpbGUsIF9fbGluZSk7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworCisgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9uZC0+bV9wX25leHRfc2libGluZywgcm9vdCwgX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQtPm1fcF9sX2NoaWxkLCBmYWxzZSwgX19maWxlLCBfX2xpbmUpOworICBpZiAoIXJvb3QpCisgICAgeworICAgICAgaWYgKHBfbmQtPm1fbWV0YWRhdGEgPT0gMCkKKwlQQl9EU19ERUJVR19WRVJJRlkocF9uZC0+bV9wX25leHRfc2libGluZyA9PSAwKTsKKyAgICAgIGVsc2UKKwlQQl9EU19ERUJVR19WRVJJRlkocF9uZC0+bV9tZXRhZGF0YSA9PSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX21ldGFkYXRhICsgMSk7CisgICAgfQorCisgIGlmIChwX25kLT5tX3BfbF9jaGlsZCAhPSAwKQorICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kLT5tX3BfbF9jaGlsZC0+bV9tZXRhZGF0YSArIDEgPT0gYmFzZV90eXBlOjpkZWdyZWUocF9uZCkpOworCisgIGNvbnN0IGJvb2wgdW5tYXJrZWRfdmFsaWQgPQorICAgIChwX25kLT5tX3BfbF9jaGlsZCA9PSAwICYmIHBfbmQtPm1fbWV0YWRhdGEgPT0gMCkKKyAgICB8fCAocF9uZC0+bV9wX2xfY2hpbGQgIT0gMAorCSAmJiBwX25kLT5tX21ldGFkYXRhID09IHBfbmQtPm1fcF9sX2NoaWxkLT5tX21ldGFkYXRhICsgMSk7CisKKyAgY29uc3QgYm9vbCBtYXJrZWRfdmFsaWQgPQorICAgIChwX25kLT5tX3BfbF9jaGlsZCA9PSAwICYmIHBfbmQtPm1fbWV0YWRhdGEgPT0gMSkKKyAgICB8fCAocF9uZC0+bV9wX2xfY2hpbGQgIT0gMAorCSYmIHBfbmQtPm1fbWV0YWRhdGEgPT0gcF9uZC0+bV9wX2xfY2hpbGQtPm1fbWV0YWRhdGEgKyAyKTsKKworICBQQl9EU19ERUJVR19WRVJJRlkodW5tYXJrZWRfdmFsaWQgfHwgbWFya2VkX3ZhbGlkKTsKKyAgaWYgKHJvb3QpCisgICAgUEJfRFNfREVCVUdfVkVSSUZZKHVubWFya2VkX3ZhbGlkKTsKK30KKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTliM2VkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyNTUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdGhpbl9oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoaW5faGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BvcCgpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWJhc2VfdHlwZTo6ZW1wdHkoKSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbWF4ICE9IDApOworCisgIG5vZGVfcG9pbnRlciBwX25kID0gbV9wX21heDsKKyAgcmVtb3ZlX21heF9ub2RlKCk7CisgIGJhc2VfdHlwZTo6YWN0dWFsX2VyYXNlX25vZGUocF9uZCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlbW92ZV9tYXhfbm9kZSgpCit7CisgIHRvX2F1eF9leGNlcHRfbWF4KCk7CisgIG1ha2VfZnJvbV9hdXgoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RvX2F1eF9leGNlcHRfbWF4KCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfYWRkID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKyAgd2hpbGUgKHBfYWRkICE9IG1fcF9tYXgpCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dF9hZGQgPSBwX2FkZC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIGFkZF90b19hdXgocF9hZGQpOworICAgICAgcF9hZGQgPSBwX25leHRfYWRkOworICAgIH0KKworICBwX2FkZCA9IG1fcF9tYXgtPm1fcF9sX2NoaWxkOworICB3aGlsZSAocF9hZGQgIT0gMCkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0X2FkZCA9IHBfYWRkLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgcF9hZGQtPm1fbWV0YWRhdGEgPSBwX2FkZC0+bV9wX2xfY2hpbGQgPT0gMCA/CisJMCA6IHBfYWRkLT5tX3BfbF9jaGlsZC0+bV9tZXRhZGF0YSArIDE7CisKKyAgICAgIGFkZF90b19hdXgocF9hZGQpOworICAgICAgcF9hZGQgPSBwX25leHRfYWRkOworICAgIH0KKworICBwX2FkZCA9IG1fcF9tYXgtPm1fcF9uZXh0X3NpYmxpbmc7CisgIHdoaWxlIChwX2FkZCAhPSAwKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHRfYWRkID0gcF9hZGQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBhZGRfdG9fYXV4KHBfYWRkKTsKKyAgICAgIHBfYWRkID0gcF9uZXh0X2FkZDsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYWRkX3RvX2F1eChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgc2l6ZV90eXBlIHIgPSBwX25kLT5tX21ldGFkYXRhOworICB3aGlsZSAobV9hX2F1eFtyXSAhPSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX21ldGFkYXRhIDwgcmFua19ib3VuZCgpKTsKKyAgICAgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkobV9hX2F1eFtyXS0+bV92YWx1ZSwgcF9uZC0+bV92YWx1ZSkpCisJbWFrZV9jaGlsZF9vZihtX2FfYXV4W3JdLCBwX25kKTsKKyAgICAgIGVsc2UKKwl7CisJICBtYWtlX2NoaWxkX29mKHBfbmQsIG1fYV9hdXhbcl0pOworCSAgcF9uZCA9IG1fYV9hdXhbcl07CisJfQorCisgICAgICBtX2FfYXV4W3JdID0gMDsKKyAgICAgICsrcjsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fbWV0YWRhdGEgPCByYW5rX2JvdW5kKCkpOworCisgIG1fYV9hdXhbcl0gPSBwX25kOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21ha2VfY2hpbGRfb2Yobm9kZV9wb2ludGVyIHBfbmQsIG5vZGVfcG9pbnRlciBwX25ld19wYXJlbnQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX21ldGFkYXRhID09IHBfbmV3X3BhcmVudC0+bV9tZXRhZGF0YSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX2FfYXV4W3BfbmQtPm1fbWV0YWRhdGFdID09IHBfbmQgfHwKKwkJICAgbV9hX2F1eFtwX25kLT5tX21ldGFkYXRhXSA9PSBwX25ld19wYXJlbnQpOworCisgICsrcF9uZXdfcGFyZW50LT5tX21ldGFkYXRhOworICBiYXNlX3R5cGU6Om1ha2VfY2hpbGRfb2YocF9uZCwgcF9uZXdfcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CittYWtlX2Zyb21fYXV4KCkKK3sKKyAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IG1fcF9tYXggPSAwOworICBjb25zdCBzaXplX3R5cGUgcm5rX2JuZCA9IHJhbmtfYm91bmQoKTsKKyAgc2l6ZV90eXBlIGkgPSAwOworICB3aGlsZSAoaSA8IHJua19ibmQpCisgICAgeworICAgICAgaWYgKG1fYV9hdXhbaV0gIT0gMCkKKwl7CisJICBtYWtlX3Jvb3RfYW5kX2xpbmsobV9hX2F1eFtpXSk7CisJICBtX2FfYXV4W2ldID0gMDsKKwl9CisgICAgICArK2k7CisgICAgfQorCisgIFBCX0RTX0FTU0VSVF9BVVhfTlVMTCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlbW92ZV9ub2RlKG5vZGVfcG9pbnRlciBwX25kKQoreworICBub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBwX25kOworICB3aGlsZSAoYmFzZV90eXBlOjpwYXJlbnQocF9wYXJlbnQpICE9IDApCisgICAgcF9wYXJlbnQgPSBiYXNlX3R5cGU6OnBhcmVudChwX3BhcmVudCk7CisKKyAgYmFzZV90eXBlOjpidWJibGVfdG9fdG9wKHBfbmQpOworICBtX3BfbWF4ID0gcF9uZDsKKworICBub2RlX3BvaW50ZXIgcF9maXggPSBiYXNlX3R5cGU6Om1fcF9yb290OworICB3aGlsZSAocF9maXggIT0gMCYmICBwX2ZpeC0+bV9wX25leHRfc2libGluZyAhPSBwX3BhcmVudCkKKyAgICBwX2ZpeCA9IHBfZml4LT5tX3BfbmV4dF9zaWJsaW5nOworCisgIGlmIChwX2ZpeCAhPSAwKQorICAgIHBfZml4LT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZDsKKworICByZW1vdmVfbWF4X25vZGUoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcigpCit7CisgIGJhc2VfdHlwZTo6Y2xlYXIoKTsKKyAgbV9wX21heCA9IDA7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShwb2ludF9pdGVyYXRvciBpdCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghYmFzZV90eXBlOjplbXB0eSgpKTsKKworICBub2RlX3BvaW50ZXIgcF9uZCA9IGl0Lm1fcF9uZDsKKyAgcmVtb3ZlX25vZGUocF9uZCk7CisgIGJhc2VfdHlwZTo6YWN0dWFsX2VyYXNlX25vZGUocF9uZCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2lmKFByZWQgcHJlZCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGlmIChiYXNlX3R5cGU6OmVtcHR5KCkpCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgYmFzZV90eXBlOjp0b19saW5rZWRfbGlzdCgpOworICBub2RlX3BvaW50ZXIgcF9vdXQgPSBiYXNlX3R5cGU6OnBydW5lKHByZWQpOworICBzaXplX3R5cGUgZXJzZCA9IDA7CisgIHdoaWxlIChwX291dCAhPSAwKQorICAgIHsKKyAgICAgICsrZXJzZDsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX291dC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIGJhc2VfdHlwZTo6YWN0dWFsX2VyYXNlX25vZGUocF9vdXQpOworICAgICAgcF9vdXQgPSBwX25leHQ7CisgICAgfQorCisgIG5vZGVfcG9pbnRlciBwX2N1ciA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisgIG1fcF9tYXggPSBiYXNlX3R5cGU6Om1fcF9yb290ID0gMDsKKyAgd2hpbGUgKHBfY3VyICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgbWFrZV9yb290X2FuZF9saW5rKHBfY3VyKTsKKyAgICAgIHBfY3VyID0gcF9uZXh0OworICAgIH0KKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIGVyc2Q7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmFua19ib3VuZCgpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgIGNvbnN0IHNpemVfdCogY29uc3QgcF91cHBlciA9CisgICAgc3RkOjp1cHBlcl9ib3VuZChnX2FfcmFua19ib3VuZHMsCisJCSAgICAgZ19hX3JhbmtfYm91bmRzICsgbnVtX2Rpc3RpbmN0X3JhbmtfYm91bmRzLAorCQkgICAgIGJhc2VfdHlwZTo6bV9zaXplKTsKKworICBpZiAocF91cHBlciA9PSBnX2FfcmFua19ib3VuZHMgKyBudW1fZGlzdGluY3RfcmFua19ib3VuZHMpCisgICAgcmV0dXJuIG1heF9yYW5rOworCisgIHJldHVybiAocF91cHBlciAtIGdfYV9yYW5rX2JvdW5kcyk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9maW5kX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vZmluZF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjdmN2Y2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vZmluZF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDUxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRoaW5faGVhcF8vZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoaW5faGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfcmVmZXJlbmNlCitQQl9EU19DTEFTU19DX0RFQzo6Cit0b3AoKSBjb25zdAoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFiYXNlX3R5cGU6OmVtcHR5KCkpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbWF4ICE9IDApOworICByZXR1cm4gbV9wX21heC0+bV92YWx1ZTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjExOWUyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMjgwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRoaW5faGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpbl9oZWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcHVzaChjb25zdF9yZWZlcmVuY2Ugcl92YWwpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBub2RlX3BvaW50ZXIgcF9uZCA9IGJhc2VfdHlwZTo6Z2V0X25ld19ub2RlX2Zvcl9pbnNlcnQocl92YWwpOworICBwX25kLT5tX21ldGFkYXRhID0gMDsKKyAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZC0+bV9wX2xfY2hpbGQgPSAwOworICBpZiAoYmFzZV90eXBlOjptX3Bfcm9vdCA9PSAwKQorICAgIHsKKyAgICAgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSAwOworICAgICAgbV9wX21heCA9IGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBwX25kOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICByZXR1cm4gcG9pbnRfaXRlcmF0b3IocF9uZCk7CisgICAgfQorCisgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSBiYXNlX3R5cGU6Om1fcF9yb290OworICBiYXNlX3R5cGU6Om1fcF9yb290LT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZDsKKyAgdXBkYXRlX21heChwX25kKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBwb2ludF9pdGVyYXRvcihwX25kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CittYWtlX3Jvb3Qobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIHBfbmQtPm1fbWV0YWRhdGEgPSBwX25kLT5tX3BfbF9jaGlsZCA9PSAwIAorICAgICAgICAgICAgICAgICAgICAgPyAwIDogMSArIHBfbmQtPm1fcF9sX2NoaWxkLT5tX21ldGFkYXRhOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21ha2Vfcm9vdF9hbmRfbGluayhub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgbWFrZV9yb290KHBfbmQpOworICBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKyAgaWYgKGJhc2VfdHlwZTo6bV9wX3Jvb3QgIT0gMCkKKyAgICBiYXNlX3R5cGU6Om1fcF9yb290LT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworCisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBwX25kOworICB1cGRhdGVfbWF4KHBfbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpeChub2RlX3BvaW50ZXIgcF95KQoreworICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICBpZiAocF95LT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gMCkKKyAgICAgICAgeworCSAgZml4X3Jvb3QocF95KTsKKwkgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocF95LT5tX21ldGFkYXRhID09IDEmJiAgcF95LT5tX3BfbmV4dF9zaWJsaW5nID09IDApCisgICAgICAgIHsKKwkgIGlmIChwX3ktPm1fcF9sX2NoaWxkICE9IDApCisgICAgICAgICAgICB7CisJICAgICAgZml4X3NpYmxpbmdfcmFua18xX3VubWFya2VkKHBfeSk7CisJICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisJICBmaXhfc2libGluZ19yYW5rXzFfbWFya2VkKHBfeSk7CisJICBwX3kgPSBwX3ktPm1fcF9wcmV2X29yX3BhcmVudDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocF95LT5tX21ldGFkYXRhID4gcF95LT5tX3BfbmV4dF9zaWJsaW5nLT5tX21ldGFkYXRhICsgMSkKKyAgICAgICAgeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeS0+bV9wX2xfY2hpbGQgIT0gMCk7CisJICBpZiAocF95LT5tX21ldGFkYXRhICE9IHBfeS0+bV9wX2xfY2hpbGQtPm1fbWV0YWRhdGEgKyAyKQorICAgICAgICAgICAgeworCSAgICAgIGZpeF9zaWJsaW5nX2dlbmVyYWxfdW5tYXJrZWQocF95KTsKKwkgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKwkgIGZpeF9zaWJsaW5nX2dlbmVyYWxfbWFya2VkKHBfeSk7CisJICBwX3kgPSBwX3ktPm1fcF9wcmV2X29yX3BhcmVudDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoKHBfeS0+bV9wX2xfY2hpbGQgPT0gMCYmIAorICAgICAgICAgICAgICAgIHBfeS0+bV9tZXRhZGF0YSA9PSAyKSB8fChwX3ktPm1fcF9sX2NoaWxkICE9IDAmJiAKKwkJCQkJIHBfeS0+bV9tZXRhZGF0YSA9PSBwX3ktPm1fcF9sX2NoaWxkLT5tX21ldGFkYXRhICsgMykpCisgICAgICAgIHsKKwkgIG5vZGVfcG9pbnRlciBwX3ogPSBwX3ktPm1fcF9wcmV2X29yX3BhcmVudDsKKwkgIGZpeF9jaGlsZChwX3kpOworCSAgcF95ID0gcF96OworICAgICAgICB9CisgICAgICBlbHNlCisJcmV0dXJuOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitmaXhfcm9vdChub2RlX3BvaW50ZXIgcF95KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF95LT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gMCk7CisgIG1ha2Vfcm9vdChwX3kpOworICBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKHBfeSwgdHJ1ZSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitmaXhfc2libGluZ19yYW5rXzFfdW5tYXJrZWQobm9kZV9wb2ludGVyIHBfeSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50ICE9IDApOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkobm9kZV9wb2ludGVyIHBfdyA9IHBfeS0+bV9wX2xfY2hpbGQ7KQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF93ICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF93LT5tX3BfbmV4dF9zaWJsaW5nID09IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF95LT5tX3BfbmV4dF9zaWJsaW5nID09IDApOworCisgIHBfeS0+bV9wX25leHRfc2libGluZyA9IHBfeS0+bV9wX2xfY2hpbGQ7CisgIHBfeS0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF95OworICBwX3ktPm1fcF9sX2NoaWxkID0gMDsKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX3ksIGZhbHNlKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpeF9zaWJsaW5nX3JhbmtfMV9tYXJrZWQobm9kZV9wb2ludGVyIHBfeSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50ICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF95LT5tX3BfbF9jaGlsZCA9PSAwKTsKKyAgcF95LT5tX21ldGFkYXRhID0gMDsKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX3ksIGZhbHNlKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpeF9zaWJsaW5nX2dlbmVyYWxfdW5tYXJrZWQobm9kZV9wb2ludGVyIHBfeSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50ICE9IDApOworCisgIG5vZGVfcG9pbnRlciBwX3cgPSBwX3ktPm1fcF9sX2NoaWxkOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF93ICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF93LT5tX3BfbmV4dF9zaWJsaW5nICE9IDApOworCisgIHBfeS0+bV9wX2xfY2hpbGQgPSBwX3ctPm1fcF9uZXh0X3NpYmxpbmc7CisgIHBfdy0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF95OworCisgIHBfdy0+bV9wX25leHRfc2libGluZyA9IHBfeS0+bV9wX25leHRfc2libGluZzsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdy0+bV9wX25leHRfc2libGluZyAhPSAwKTsKKyAgcF93LT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX3c7CisKKyAgcF95LT5tX3BfbmV4dF9zaWJsaW5nID0gcF93OworICBwX3ctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfeTsKKworICBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKHBfeSwgZmFsc2UpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZml4X3NpYmxpbmdfZ2VuZXJhbF9tYXJrZWQobm9kZV9wb2ludGVyIHBfeSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50ICE9IDApOworICAtLXBfeS0+bV9tZXRhZGF0YTsKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX3ksIGZhbHNlKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpeF9jaGlsZChub2RlX3BvaW50ZXIgcF95KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF95LT5tX3BfcHJldl9vcl9wYXJlbnQgIT0gMCk7CisKKyAgaWYgKHBfeS0+bV9wX25leHRfc2libGluZyAhPSAwKQorICAgIHBfeS0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF95LT5tX3BfcHJldl9vcl9wYXJlbnQ7CisKKyAgaWYgKHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbF9jaGlsZCA9PSBwX3kpCisgICAgcF95LT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9sX2NoaWxkID0gcF95LT5tX3BfbmV4dF9zaWJsaW5nOworICBlbHNlCisgICAgcF95LT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX3ktPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgbWFrZV9yb290X2FuZF9saW5rKHBfeSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cittb2RpZnkocG9pbnRfaXRlcmF0b3IgaXQsIGNvbnN0X3JlZmVyZW5jZSByX25ld192YWwpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBub2RlX3BvaW50ZXIgcF9uZCA9IGl0Lm1fcF9uZDsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisKKyAgY29uc3QgYm9vbCBzbWFsbGVyID0gQ21wX0ZuOjpvcGVyYXRvcigpKHJfbmV3X3ZhbCwgcF9uZC0+bV92YWx1ZSk7CisgIHBfbmQtPm1fdmFsdWUgPSByX25ld192YWw7CisgIGlmIChzbWFsbGVyKQorICAgIHsKKyAgICAgIHJlbW92ZV9ub2RlKHBfbmQpOworICAgICAgcF9uZC0+bV9wX2xfY2hpbGQgPSAwOworICAgICAgbWFrZV9yb290X2FuZF9saW5rKHBfbmQpOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gMCkKKyAgICB7CisgICAgICB1cGRhdGVfbWF4KHBfbmQpOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICByZXR1cm47CisgICAgfQorCisgIG5vZGVfcG9pbnRlciBwX3kgPSBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3kgIT0gMCk7CisKKyAgaWYgKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX3k7CisKKyAgaWYgKHBfeS0+bV9wX2xfY2hpbGQgPT0gcF9uZCkKKyAgICBwX3ktPm1fcF9sX2NoaWxkID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKyAgZWxzZQorICAgIHBfeS0+bV9wX25leHRfc2libGluZyA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgZml4KHBfeSk7CisgIG1ha2Vfcm9vdF9hbmRfbGluayhwX25kKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBkYXRlX21heChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKG1fcF9tYXggPT0gMCB8fCBDbXBfRm46Om9wZXJhdG9yKCkobV9wX21heC0+bV92YWx1ZSwgcF9uZC0+bV92YWx1ZSkpCisgICAgbV9wX21heCA9IHBfbmQ7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzQ5MzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTA4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRoaW5faGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoaW5faGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdChQcmVkIHByZWQsIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKworICBvdGhlci5jbGVhcigpOworICBpZiAoYmFzZV90eXBlOjplbXB0eSgpKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBiYXNlX3R5cGU6OnRvX2xpbmtlZF9saXN0KCk7CisgIG5vZGVfcG9pbnRlciBwX291dCA9IGJhc2VfdHlwZTo6cHJ1bmUocHJlZCk7CisKKyAgd2hpbGUgKHBfb3V0ICE9IDApCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV9zaXplID4gMCk7CisgICAgICAtLWJhc2VfdHlwZTo6bV9zaXplOworICAgICAgKytvdGhlci5tX3NpemU7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9vdXQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBvdGhlci5tYWtlX3Jvb3RfYW5kX2xpbmsocF9vdXQpOworICAgICAgcF9vdXQgPSBwX25leHQ7CisgICAgfQorCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgbm9kZV9wb2ludGVyIHBfY3VyID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKyAgbV9wX21heCA9IDA7CisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSAwOworICB3aGlsZSAocF9jdXIgIT0gMCkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9jdXItPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBtYWtlX3Jvb3RfYW5kX2xpbmsocF9jdXIpOworICAgICAgcF9jdXIgPSBwX25leHQ7CisgICAgfQorCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbihQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisKKyAgbm9kZV9wb2ludGVyIHBfb3RoZXIgPSBvdGhlci5tX3Bfcm9vdDsKKyAgd2hpbGUgKHBfb3RoZXIgIT0gMCkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9vdGhlci0+bV9wX25leHRfc2libGluZzsKKyAgICAgIG1ha2Vfcm9vdF9hbmRfbGluayhwX290aGVyKTsKKyAgICAgIHBfb3RoZXIgPSBwX25leHQ7CisgICAgfQorICBiYXNlX3R5cGU6Om1fc2l6ZSArPSBvdGhlci5tX3NpemU7CisgIG90aGVyLm1fcF9yb290ID0gMDsKKyAgb3RoZXIubV9zaXplID0gMDsKKyAgb3RoZXIubV9wX21heCA9IDA7CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL3RoaW5faGVhcF8uaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vdGhpbl9oZWFwXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0YWVkNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL3RoaW5faGVhcF8uaHBwCkBAIC0wLDAgKzEsMzI0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRoaW5faGVhcF8vdGhpbl9oZWFwXy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHRoaW4gaGVhcC4KKyAqLworCisjaWZuZGVmIFBCX0RTX1RISU5fSEVBUF9IUFAKKyNkZWZpbmUgUEJfRFNfVEhJTl9IRUFQX0hQUAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uaHBwPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIHRoaW5faGVhcDxWYWx1ZV9UeXBlLCBDbXBfRm4sIF9BbGxvYz4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjZGVmaW5lIFBCX0RTX0JBU0VfVF9QIFwKKyAgICA8VmFsdWVfVHlwZSwgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSwgX0FsbG9jLCB0cnVlPgorI2Vsc2UKKyNkZWZpbmUgUEJfRFNfQkFTRV9UX1AgXAorICAgIDxWYWx1ZV9UeXBlLCBDbXBfRm4sIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlLCBfQWxsb2M+CisjZW5kaWYKKworCisgICAgLyoqCisgICAgICogIFRoaW4gaGVhcC4KKyAgICAgKgorICAgICAqICBAaW5ncm91cCBoZWFwLWRldGFpbAorICAgICAqCisgICAgICogIFNlZSBUYXJqYW4gYW5kIEthcGxhbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyB0aGluX2hlYXAKKyAgICA6IHB1YmxpYyBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwIFBCX0RTX0JBU0VfVF9QCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPFZhbHVlX1R5cGU+OjpvdGhlciBfX3JlYmluZF9hOworICAgICAgdHlwZWRlZiBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwIFBCX0RTX0JBU0VfVF9QIGJhc2VfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlIAkJCW5vZGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9wb2ludGVyIAkJbm9kZV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om5vZGVfY29uc3RfcG9pbnRlciAJbm9kZV9jb25zdF9wb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIAkJCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBDbXBfRm4gCQkJCQljbXBfZm47CisgICAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgCQlkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYTo6cG9pbnRlcgkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYTo6Y29uc3RfcG9pbnRlcgljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hOjpyZWZlcmVuY2UJCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYTo6Y29uc3RfcmVmZXJlbmNlICAgICAJY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfaXRlcmF0b3IgCXBvaW50X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50X2NvbnN0X2l0ZXJhdG9yIAlwb2ludF9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjppdGVyYXRvciAJCWl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIAljb25zdF9pdGVyYXRvcjsKKworCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIHB1c2goY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgdm9pZAorICAgICAgbW9kaWZ5KHBvaW50X2l0ZXJhdG9yLCBjb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgY29uc3RfcmVmZXJlbmNlCisgICAgICB0b3AoKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgcG9wKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKHBvaW50X2l0ZXJhdG9yKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlX2lmKFByZWQpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgdm9pZAorICAgICAgc3BsaXQoUHJlZCwgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgam9pbihQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdGhpbl9oZWFwKCk7CisKKyAgICAgIHRoaW5faGVhcChjb25zdCBDbXBfRm4mKTsKKworICAgICAgdGhpbl9oZWFwKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgfnRoaW5faGVhcCgpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICAgIHZvaWQKKyAgICAgIGNvcHlfZnJvbV9yYW5nZShJdCwgSXQpOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X21heChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfVEhJTl9IRUFQX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2UoKSBjb25zdDsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKyAgICAgIGVudW0KKwl7CisJICBtYXhfcmFuayA9IChzaXplb2Yoc2l6ZV90eXBlKSA8PCA0KSArIDIKKwl9OworCisgICAgICB2b2lkCisgICAgICBpbml0aWFsaXplKCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICB1cGRhdGVfbWF4KG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBmaXgobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGZpeF9yb290KG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBmaXhfc2libGluZ19yYW5rXzFfdW5tYXJrZWQobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGZpeF9zaWJsaW5nX3JhbmtfMV9tYXJrZWQobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGZpeF9zaWJsaW5nX2dlbmVyYWxfdW5tYXJrZWQobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGZpeF9zaWJsaW5nX2dlbmVyYWxfbWFya2VkKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBmaXhfY2hpbGQobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBtYWtlX3Jvb3Qobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIG1ha2Vfcm9vdF9hbmRfbGluayhub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcmVtb3ZlX21heF9ub2RlKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHRvX2F1eF9leGNlcHRfbWF4KCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBhZGRfdG9fYXV4KG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBtYWtlX2Zyb21fYXV4KCk7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIHJhbmtfYm91bmQoKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIG1ha2VfY2hpbGRfb2Yobm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcmVtb3ZlX25vZGUobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgam9pbihub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcikgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChub2RlX2NvbnN0X3BvaW50ZXIsIGJvb2wsIGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfYXV4X251bGwoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisjZW5kaWYKKworICAgICAgbm9kZV9wb2ludGVyIAltX3BfbWF4OworICAgICAgbm9kZV9wb2ludGVyIAltX2FfYXV4W21heF9yYW5rXTsKKyAgICB9OworCisgICAgZW51bQorICAgICAgeworCW51bV9kaXN0aW5jdF9yYW5rX2JvdW5kcyA9IDQ4CisgICAgICB9OworCisgICAgLy8gVGFrZW4gZnJvbSB0aGUgU0dJIGltcGxlbWVudGF0aW9uOyBhY2tub3dsZWRnZWQgaW4gdGhlIGRvY3MuCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IGdfYV9yYW5rX2JvdW5kc1tudW1fZGlzdGluY3RfcmFua19ib3VuZHNdID0KKyAgICAgIHsKKwkvKiBEZWFsaW5nIGNhcmRzLi4uICovCisJLyogMCAgICAgKi8gMHVsLAorCS8qIDEgICAgICovIDF1bCwKKwkvKiAyICAgICAqLyAxdWwsCisJLyogMyAgICAgKi8gMnVsLAorCS8qIDQgICAgICovIDR1bCwKKwkvKiA1ICAgICAqLyA2dWwsCisJLyogNiAgICAgKi8gMTF1bCwKKwkvKiA3ICAgICAqLyAxN3VsLAorCS8qIDggICAgICovIDI5dWwsCisJLyogOSAgICAgKi8gNDZ1bCwKKwkvKiAxMCAgICAqLyA3NnVsLAorCS8qIDExICAgICovIDEyMnVsLAorCS8qIDEyICAgICovIDE5OXVsLAorCS8qIDEzICAgICovIDMyMXVsLAorCS8qIDE0ICAgICovIDUyMXVsLAorCS8qIDE1ICAgICovIDg0MnVsLAorCS8qIDE2ICAgICovIDEzNjR1bCwKKwkvKiAxNyAgICAqLyAyMjA2dWwsCisJLyogMTggICAgKi8gMzU3MXVsLAorCS8qIDE5ICAgICovIDU3Nzd1bCwKKwkvKiAyMCAgICAqLyA5MzQ5dWwsCisJLyogMjEgICAgKi8gMTUxMjZ1bCwKKwkvKiAyMiAgICAqLyAyNDQ3NnVsLAorCS8qIDIzICAgICovIDM5NjAydWwsCisJLyogMjQgICAgKi8gNjQwNzl1bCwKKwkvKiAyNSAgICAqLyAxMDM2ODF1bCwKKwkvKiAyNiAgICAqLyAxNjc3NjF1bCwKKwkvKiAyNyAgICAqLyAyNzE0NDJ1bCwKKwkvKiAyOCAgICAqLyA0MzkyMDR1bCwKKwkvKiAyOSAgICAqLyA3MTA2NDZ1bCwKKwkvKiAzMCAgICAqLyAxMTQ5ODUxdWwsCisJLyogMzEgICAgKi8gMTg2MDQ5N3VsLAorCS8qIDMyICAgICovIDMwMTAzNDl1bCwKKwkvKiAzMyAgICAqLyA0ODcwODQ2dWwsCisJLyogMzQgICAgKi8gNzg4MTE5NnVsLAorCS8qIDM1ICAgICovIDEyNzUyMDQydWwsCisJLyogMzYgICAgKi8gMjA2MzMyMzl1bCwKKwkvKiAzNyAgICAqLyAzMzM4NTI4MnVsLAorCS8qIDM4ICAgICovIDU0MDE4NTIxdWwsCisJLyogMzkgICAgKi8gODc0MDM4MDN1bCwKKwkvKiA0MCAgICAqLyAxNDE0MjIzMjR1bCwKKwkvKiA0MSAgICAqLyAyMjg4MjYxMjd1bCwKKwkvKiA0MiAgICAqLyAzNzAyNDg0NTF1bCwKKwkvKiA0MyAgICAqLyA1OTkwNzQ1Nzh1bCwKKwkvKiA0NCAgICAqLyA5NjkzMjMwMjl1bCwKKwkvKiA0NSAgICAqLyAxNTY4Mzk3NjA3dWwsCisJLyogNDYgICAgKi8gMjUzNzcyMDYzNnVsLAorCS8qIDQ3ICAgICovIDQxMDYxMTgyNDN1bAorCS8qIFBvdCdzIGdvb2QsIGxldCdzIHBsYXkgKi8KKyAgICAgIH07CisKKyNkZWZpbmUgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChfTm9kZSwgX0Jvb2wpCQkJXAorICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF9ub2RlX2NvbnNpc3RlbnQoX05vZGUsIF9Cb29sLAkJXAorCQkJCQkgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisjZGVmaW5lIFBCX0RTX0FTU0VSVF9BVVhfTlVMTChYKQkJCQkJXAorICBfR0xJQkNYWF9ERUJVR19PTkxZKFguYXNzZXJ0X2F1eF9udWxsKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vdHJhY2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2ZpbmRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19BU1NFUlRfQVVYX05VTEwKKyN1bmRlZiBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0JBU0VfVF9QCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vdHJhY2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy90cmFjZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTAyZDY4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vdHJhY2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0aGluX2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uCisgKi8KKworI2lmZGVmIFBCX0RTX1RISU5fSEVBUF9UUkFDRV8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlKCkgY29uc3QKK3sKKyAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjZXJyIDw8ICJtX3BfbWF4ICIgPDwgbV9wX21heCA8PCBzdGQ6OmVuZGw7CisgIGJhc2VfdHlwZTo6dHJhY2UoKTsKK30KKworI2VuZGlmIC8vICNpZmRlZiBQQl9EU19USElOX0hFQVBfVFJBQ0VfCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJlZV9wb2xpY3kvbm9kZV9tZXRhZGF0YV9zZWxlY3Rvci5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJlZV9wb2xpY3kvbm9kZV9tZXRhZGF0YV9zZWxlY3Rvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1ZDJjZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmVlX3BvbGljeS9ub2RlX21ldGFkYXRhX3NlbGVjdG9yLmhwcApAQCAtMCwwICsxLDEwMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmVlX3BvbGljeS9ub2RlX21ldGFkYXRhX3NlbGVjdG9yLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRyZWVzLgorICovCisKKyNpZm5kZWYgUEJfRFNfVFJFRV9OT0RFX01FVEFEQVRBX0RJU1BBVENIX0hQUAorI2RlZmluZSBQQl9EU19UUkVFX05PREVfTUVUQURBVEFfRElTUEFUQ0hfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JyYW5jaF9wb2xpY3kvbnVsbF9ub2RlX21ldGFkYXRhLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8qKgorICAgICAqICBAYWRkdG9ncm91cCB0cmFpdHMgVHJhaXRzCisgICAgICogIEB7CisgICAgICovCisKKyAgICAvLy8gVHJlZSBtZXRhZGF0YSBoZWxwZXIuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGUsIGJvb2wgX0JUcD4KKyAgICAgIHN0cnVjdCB0cmVlX21ldGFkYXRhX2hlbHBlcjsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiwgZmFsc2UuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGU+CisgICAgICBzdHJ1Y3QgdHJlZV9tZXRhZGF0YV9oZWxwZXI8Tm9kZV9VcGRhdGUsIGZhbHNlPgorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgTm9kZV9VcGRhdGU6Om1ldGFkYXRhX3R5cGUgCXR5cGU7CisgICAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uLCB0cnVlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlPgorICAgICAgc3RydWN0IHRyZWVfbWV0YWRhdGFfaGVscGVyPE5vZGVfVXBkYXRlLCB0cnVlPgorICAgICAgeworCXR5cGVkZWYgbnVsbF90eXBlIAkJCQl0eXBlOworICAgICAgfTsKKworICAgIC8vLyBUcmVlIG5vZGUgbWV0YWRhdGEgZGlzcGF0Y2guCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgRGF0YSwKKwkgICAgIHR5cGVuYW1lIENtcF9GbiwKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwKKwkJICAgICAgdHlwZW5hbWUgQ29uc3RfSXRlcmF0b3IsCisJCSAgICAgIHR5cGVuYW1lIENtcF9Gbl8sCisJCSAgICAgIHR5cGVuYW1lIF9BbGxvY18+CisJICAgICBjbGFzcyBOb2RlX1VwZGF0ZSwKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgdHJlZV9ub2RlX21ldGFkYXRhX2Rpc3BhdGNoCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGR1bW5vZGVfY29uc3RfaXRlcmF0b3I8S2V5LCBEYXRhLCBfQWxsb2M+CQlfX2l0X3R5cGU7CisgICAgICB0eXBlZGVmIE5vZGVfVXBkYXRlPF9faXRfdHlwZSwgX19pdF90eXBlLCBDbXBfRm4sIF9BbGxvYz4JX19ub2RlX3U7CisgICAgICB0eXBlZGVmIG51bGxfbm9kZV91cGRhdGU8X19pdF90eXBlLCBfX2l0X3R5cGUsIENtcF9GbiwgX0FsbG9jPiBfX25ub2RlX3U7CisKKyAgICAgIGVudW0KKwl7CisJICBudWxsX3VwZGF0ZSA9IGlzX3NhbWU8X19ub2RlX3UsIF9fbm5vZGVfdT46OnZhbHVlCisJfTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJlZV9tZXRhZGF0YV9oZWxwZXI8X19ub2RlX3UsIG51bGxfdXBkYXRlPjo6dHlwZSB0eXBlOworICAgIH07CisgICAgLy9AfQorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfVFJFRV9OT0RFX01FVEFEQVRBX0RJU1BBVENIX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L29yZGVyX3N0YXRpc3RpY3NfaW1wLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmVlX3BvbGljeS9vcmRlcl9zdGF0aXN0aWNzX2ltcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4MGVmZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmVlX3BvbGljeS9vcmRlcl9zdGF0aXN0aWNzX2ltcC5ocHAKQEAgLTAsMCArMSwxMjEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJlZV9wb2xpY3kvb3JkZXJfc3RhdGlzdGljc19pbXAuaHBwCisgKiBDb250YWlucyBmb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3Igb3JkZXJfc3RhdGlzdGljc19rZXkKKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9ieV9vcmRlcihzaXplX3R5cGUgb3JkZXIpCit7CisgIG5vZGVfaXRlcmF0b3IgaXQgPSBub2RlX2JlZ2luKCk7CisgIG5vZGVfaXRlcmF0b3IgZW5kX2l0ID0gbm9kZV9lbmQoKTsKKworICB3aGlsZSAoaXQgIT0gZW5kX2l0KQorICAgIHsKKyAgICAgIG5vZGVfaXRlcmF0b3IgbF9pdCA9IGl0LmdldF9sX2NoaWxkKCk7CisgICAgICBjb25zdCBzaXplX3R5cGUgbyA9IChsX2l0ID09IGVuZF9pdCk/IDAgOiBsX2l0LmdldF9tZXRhZGF0YSgpOworCisgICAgICBpZiAob3JkZXIgPT0gbykKKwlyZXR1cm4gKml0OworICAgICAgZWxzZSBpZiAob3JkZXIgPCBvKQorCWl0ID0gbF9pdDsKKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgb3JkZXIgLT0gbyArIDE7CisJICBpdCA9IGl0LmdldF9yX2NoaWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIGJhc2VfdHlwZTo6ZW5kX2l0ZXJhdG9yKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2J5X29yZGVyKHNpemVfdHlwZSBvcmRlcikgY29uc3QKK3sgcmV0dXJuIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMqPih0aGlzKS0+ZmluZF9ieV9vcmRlcihvcmRlcik7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitvcmRlcl9vZl9rZXkoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgbm9kZV9jb25zdF9pdGVyYXRvciBpdCA9IG5vZGVfYmVnaW4oKTsKKyAgbm9kZV9jb25zdF9pdGVyYXRvciBlbmRfaXQgPSBub2RlX2VuZCgpOworCisgIGNvbnN0IGNtcF9mbiYgcl9jbXBfZm4gPSBjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKj4odGhpcyktPmdldF9jbXBfZm4oKTsKKyAgc2l6ZV90eXBlIG9yZCA9IDA7CisgIHdoaWxlIChpdCAhPSBlbmRfaXQpCisgICAgeworICAgICAgbm9kZV9jb25zdF9pdGVyYXRvciBsX2l0ID0gaXQuZ2V0X2xfY2hpbGQoKTsKKworICAgICAgaWYgKHJfY21wX2ZuKHJfa2V5LCB0aGlzLT5leHRyYWN0X2tleSgqKCppdCkpKSkKKwlpdCA9IGxfaXQ7CisgICAgICBlbHNlIGlmIChyX2NtcF9mbih0aGlzLT5leHRyYWN0X2tleSgqKCppdCkpLCByX2tleSkpCisgICAgICAgIHsKKwkgIG9yZCArPSAobF9pdCA9PSBlbmRfaXQpPyAxIDogMSArIGxfaXQuZ2V0X21ldGFkYXRhKCk7CisJICBpdCA9IGl0LmdldF9yX2NoaWxkKCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgb3JkICs9IChsX2l0ID09IGVuZF9pdCk/IDAgOiBsX2l0LmdldF9tZXRhZGF0YSgpOworCSAgaXQgPSBlbmRfaXQ7CisgICAgICAgIH0KKyAgICB9CisgIHJldHVybiBvcmQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3BlcmF0b3IoKShub2RlX2l0ZXJhdG9yIG5vZGVfaXQsIG5vZGVfY29uc3RfaXRlcmF0b3IgZW5kX25kX2l0KSBjb25zdAoreworICBub2RlX2l0ZXJhdG9yIGxfaXQgPSBub2RlX2l0LmdldF9sX2NoaWxkKCk7CisgIGNvbnN0IHNpemVfdHlwZSBsX3JhbmsgPSAobF9pdCA9PSBlbmRfbmRfaXQpID8gMCA6IGxfaXQuZ2V0X21ldGFkYXRhKCk7CisKKyAgbm9kZV9pdGVyYXRvciByX2l0ID0gbm9kZV9pdC5nZXRfcl9jaGlsZCgpOworICBjb25zdCBzaXplX3R5cGUgcl9yYW5rID0gKHJfaXQgPT0gZW5kX25kX2l0KSA/IDAgOiByX2l0LmdldF9tZXRhZGF0YSgpOworCisgIGNvbnN0X2Nhc3Q8bWV0YWRhdGFfcmVmZXJlbmNlPihub2RlX2l0LmdldF9tZXRhZGF0YSgpKT0gMSArIGxfcmFuayArIHJfcmFuazsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK350cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGUoKQoreyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJlZV9wb2xpY3kvc2FtcGxlX3RyZWVfbm9kZV91cGRhdGUuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L3NhbXBsZV90cmVlX25vZGVfdXBkYXRlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjE2YWE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L3NhbXBsZV90cmVlX25vZGVfdXBkYXRlLmhwcApAQCAtMCwwICsxLDYyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRyZWVfcG9saWN5L3NhbXBsZV90cmVlX25vZGVfdXBkYXRlLmhwcAorICogQ29udGFpbnMgYSBzYW1sZSBub2RlIHVwZGF0ZSBmdW5jdG9yLgorICovCisKKyNpZm5kZWYgUEJfRFNfU0FNUExFX1RSRUVfTk9ERV9VUERBVE9SX0hQUAorI2RlZmluZSBQQl9EU19TQU1QTEVfVFJFRV9OT0RFX1VQREFUT1JfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8vLyBBIHNhbXBsZSBub2RlIHVwZGF0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnN0X05vZGVfSXRlciwgdHlwZW5hbWUgTm9kZV9JdGVyLCB0eXBlbmFtZSBDbXBfRm4sCisJICAgdHlwZW5hbWUgX0FsbG9jPgorICBjbGFzcyBzYW1wbGVfdHJlZV9ub2RlX3VwZGF0ZQorICB7CisgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCBtZXRhZGF0YV90eXBlOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3RyZWVfbm9kZV91cGRhdGUoKTsKKworICAgIC8vLyBVcGRhdGVzIHRoZSByYW5rIG9mIGEgbm9kZSB0aHJvdWdoIGEgbm9kZV9pdGVyYXRvciBub2RlX2l0OworICAgIC8vLyBlbmRfbmRfaXQgaXMgdGhlIGVuZCBub2RlIGl0ZXJhdG9yLgorICAgIGlubGluZSB2b2lkCisgICAgb3BlcmF0b3IoKShub2RlX2l0ZXJhdG9yIG5vZGVfaXQsIG5vZGVfY29uc3RfaXRlcmF0b3IgZW5kX25kX2l0KSBjb25zdDsKKyAgfTsKK30KKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1NBTVBMRV9UUkVFX05PREVfVVBEQVRPUl9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmVlX3RyYWNlX2Jhc2UuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyZWVfdHJhY2VfYmFzZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZkMzA0ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmVlX3RyYWNlX2Jhc2UuaHBwCkBAIC0wLDAgKzEsMTc5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRldGFpbC90cmVlX3RyYWNlX2Jhc2UuaHBwCisgKiBDb250YWlucyB0cmVlLXJlbGF0ZWQgcG9saWNpZXMuCisgKi8KKworI2lmbmRlZiBQQl9EU19UUkVFX1RSQUNFX0JBU0VfSFBQCisjZGVmaW5lIFBCX0RTX1RSRUVfVFJBQ0VfQkFTRV9IUFAKKworI2lmZGVmIFBCX0RTX1RSRUVfVFJBQ0UKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYnJhbmNoX3BvbGljeS9icmFuY2hfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JyYW5jaF9wb2xpY3kvbnVsbF9ub2RlX21ldGFkYXRhLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjaWZkZWYgUEJfRFNfVFJFRV9UUkFDRQorCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDCQkJCQkJXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwgdHlwZW5hbWUgTm9kZV9JdHIsCVwKKwkgICAgIHR5cGVuYW1lIENtcF9GbiwgYm9vbCBOb2RlX0Jhc2VkLCB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMJCQkJCQlcCisgICAgdHJlZV90cmFjZV9iYXNlPE5vZGVfQ0l0ciwgTm9kZV9JdHIsIENtcF9GbiwgICAgICAgICBcCisJCSAgICBOb2RlX0Jhc2VkLCBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfVFJBQ0VfQkFTRSBcCisgICAgYnJhbmNoX3BvbGljeTxOb2RlX0NJdHIsIE5vZGVfSXRyLCBfQWxsb2M+CisKKyAgICAvLy8gVHJhY2luZyBiYXNlIGNsYXNzLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwgdHlwZW5hbWUgTm9kZV9JdHIsCisJICAgICB0eXBlbmFtZSBDbXBfRm4sIGJvb2wgTm9kZV9CYXNlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIHRyZWVfdHJhY2VfYmFzZSA6IHByaXZhdGUgUEJfRFNfVFJBQ0VfQkFTRQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgUEJfRFNfVFJBQ0VfQkFTRSAJCQliYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIE5vZGVfQ0l0ciAJCW5vZGVfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAlzaXplX3R5cGU7CisKKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlX25vZGUobm9kZV9jb25zdF9pdGVyYXRvciwgc2l6ZV90eXBlKSBjb25zdDsKKworICAgICAgdmlydHVhbCBib29sCisgICAgICBlbXB0eSgpIGNvbnN0ID0gMDsKKworICAgICAgdmlydHVhbCBub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBub2RlX2JlZ2luKCkgY29uc3QgPSAwOworCisgICAgICB2aXJ0dWFsIG5vZGVfY29uc3RfaXRlcmF0b3IKKyAgICAgIG5vZGVfZW5kKCkgY29uc3QgPSAwOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgcHJpbnRfbm9kZV9wb2ludGVyKE5vZGVfQ0l0ciwgaW50ZWdyYWxfY29uc3RhbnQ8aW50LHRydWU+KTsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIHByaW50X25vZGVfcG9pbnRlcihOb2RlX0NJdHIsIGludGVncmFsX2NvbnN0YW50PGludCxmYWxzZT4pOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YV8+CisgICAgICBzdGF0aWMgdm9pZAorICAgICAgdHJhY2VfaXRfbWV0YWRhdGEoTm9kZV9DSXRyLCB0eXBlX3RvX3R5cGU8TWV0YWRhdGFfPik7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICB0cmFjZV9pdF9tZXRhZGF0YShOb2RlX0NJdHIsIHR5cGVfdG9fdHlwZTxudWxsX3R5cGU+KTsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHRyYWNlKCkgY29uc3QKKyAgICB7CisgICAgICBpZiAoZW1wdHkoKSkKKwlyZXR1cm47CisgICAgICB0cmFjZV9ub2RlKG5vZGVfYmVnaW4oKSwgMCk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHRyYWNlX25vZGUobm9kZV9jb25zdF9pdGVyYXRvciBuZF9pdCwgc2l6ZV90eXBlIGxldmVsKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChuZF9pdC5nZXRfcl9jaGlsZCgpICE9IG5vZGVfZW5kKCkpCisJdHJhY2Vfbm9kZShuZF9pdC5nZXRfcl9jaGlsZCgpLCBsZXZlbCArIDEpOworCisgICAgICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IGxldmVsOyArK2kpCisJc3RkOjpjZXJyIDw8ICcgJzsKKworICAgICAgcHJpbnRfbm9kZV9wb2ludGVyKG5kX2l0LCBpbnRlZ3JhbF9jb25zdGFudDxpbnQsTm9kZV9CYXNlZD4oKSk7CisgICAgICBzdGQ6OmNlcnIgPDwgYmFzZV90eXBlOjpleHRyYWN0X2tleSgqKCpuZF9pdCkpOworCisgICAgICB0eXBlZGVmIHR5cGVfdG9fdHlwZTx0eXBlbmFtZSBub2RlX2NvbnN0X2l0ZXJhdG9yOjptZXRhZGF0YV90eXBlPgorCW1fdHlwZV9pbmRfdDsKKworICAgICAgdHJhY2VfaXRfbWV0YWRhdGEobmRfaXQsIG1fdHlwZV9pbmRfdCgpKTsKKworICAgICAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgaWYgKG5kX2l0LmdldF9sX2NoaWxkKCkgIT0gbm9kZV9lbmQoKSkKKwl0cmFjZV9ub2RlKG5kX2l0LmdldF9sX2NoaWxkKCksIGxldmVsICsgMSk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YV8+CisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB0cmFjZV9pdF9tZXRhZGF0YShOb2RlX0NJdHIgbmRfaXQsIHR5cGVfdG9fdHlwZTxNZXRhZGF0YV8+KQorICAgIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgdWwgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihuZF9pdC5nZXRfbWV0YWRhdGEoKSk7CisgICAgICBzdGQ6OmNlcnIgPDwgIiAoIiA8PCB1bCA8PCAiKSAiOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB0cmFjZV9pdF9tZXRhZGF0YShOb2RlX0NJdHIsIHR5cGVfdG9fdHlwZTxudWxsX3R5cGU+KQorICAgIHsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHByaW50X25vZGVfcG9pbnRlcihOb2RlX0NJdHIgbmRfaXQsIGludGVncmFsX2NvbnN0YW50PGludCx0cnVlPikKKyAgICB7IHN0ZDo6Y2VyciA8PCBuZF9pdC5tX3BfbmQgPDwgIiAiOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcHJpbnRfbm9kZV9wb2ludGVyKE5vZGVfQ0l0ciBuZF9pdCwgaW50ZWdyYWxfY29uc3RhbnQ8aW50LGZhbHNlPikKKyAgICB7IHN0ZDo6Y2VyciA8PCAqbmRfaXQgPDwgIiAiOyB9CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfVFJBQ0VfQkFTRQorI2VuZGlmIC8vICNpZmRlZiAgICBQQl9EU19UUkVFX1RSQUNFCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZkZWYgUEJfRFNfVFJFRV9UUkFDRQorCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19UUkVFX1RSQUNFX0JBU0VfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvbm9kZV9tZXRhZGF0YV9zZWxlY3Rvci5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvbm9kZV9tZXRhZGF0YV9zZWxlY3Rvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkZmRlMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9ub2RlX21ldGFkYXRhX3NlbGVjdG9yLmhwcApAQCAtMCwwICsxLDEwMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmllX3BvbGljeS9ub2RlX21ldGFkYXRhX3NlbGVjdG9yLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRyaWVzLgorICovCisKKyNpZm5kZWYgUEJfRFNfVFJJRV9OT0RFX01FVEFEQVRBX0RJU1BBVENIX0hQUAorI2RlZmluZSBQQl9EU19UUklFX05PREVfTUVUQURBVEFfRElTUEFUQ0hfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JyYW5jaF9wb2xpY3kvbnVsbF9ub2RlX21ldGFkYXRhLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8qKgorICAgICAqICBAYWRkdG9ncm91cCB0cmFpdHMgVHJhaXRzCisgICAgICogIEB7CisgICAgICovCisKKyAgICAvLy8gVHJpZSBtZXRhZGF0YSBoZWxwZXIuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGUsIGJvb2wgX0JUcD4KKyAgICAgIHN0cnVjdCB0cmllX21ldGFkYXRhX2hlbHBlcjsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiwgZmFsc2UuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGU+CisgICAgICBzdHJ1Y3QgdHJpZV9tZXRhZGF0YV9oZWxwZXI8Tm9kZV9VcGRhdGUsIGZhbHNlPgorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgTm9kZV9VcGRhdGU6Om1ldGFkYXRhX3R5cGUgCXR5cGU7CisgICAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uLCB0cnVlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlPgorICAgICAgc3RydWN0IHRyaWVfbWV0YWRhdGFfaGVscGVyPE5vZGVfVXBkYXRlLCB0cnVlPgorICAgICAgeworCXR5cGVkZWYgbnVsbF90eXBlIAkJCQl0eXBlOworICAgICAgfTsKKworICAgIC8vLyBUcmllIG5vZGUgbWV0YWRhdGEgZGlzcGF0Y2guCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgRGF0YSwKKwkgICAgIHR5cGVuYW1lIENtcF9GbiwKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwKKwkJICAgICAgdHlwZW5hbWUgQ29uc3RfSXRlcmF0b3IsCisJCSAgICAgIHR5cGVuYW1lIENtcF9Gbl8sCisJCSAgICAgIHR5cGVuYW1lIF9BbGxvY18+CisJICAgICBjbGFzcyBOb2RlX1VwZGF0ZSwKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgdHJpZV9ub2RlX21ldGFkYXRhX2Rpc3BhdGNoCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGR1bW5vZGVfY29uc3RfaXRlcmF0b3I8S2V5LCBEYXRhLCBfQWxsb2M+CQlfX2l0X3R5cGU7CisgICAgICB0eXBlZGVmIE5vZGVfVXBkYXRlPF9faXRfdHlwZSwgX19pdF90eXBlLCBDbXBfRm4sIF9BbGxvYz4JX19ub2RlX3U7CisgICAgICB0eXBlZGVmIG51bGxfbm9kZV91cGRhdGU8X19pdF90eXBlLCBfX2l0X3R5cGUsIENtcF9GbiwgX0FsbG9jPiBfX25ub2RlX3U7CisKKyAgICAgIGVudW0KKwl7CisJICBudWxsX3VwZGF0ZSA9IGlzX3NhbWU8X19ub2RlX3UsIF9fbm5vZGVfdT46OnZhbHVlCisJfTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJpZV9tZXRhZGF0YV9oZWxwZXI8X19ub2RlX3UsIG51bGxfdXBkYXRlPjo6dHlwZSB0eXBlOworICAgIH07CisgICAgLy9AfQorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfVFJJRV9OT0RFX01FVEFEQVRBX0RJU1BBVENIX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L29yZGVyX3N0YXRpc3RpY3NfaW1wLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9vcmRlcl9zdGF0aXN0aWNzX2ltcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiNmFjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9vcmRlcl9zdGF0aXN0aWNzX2ltcC5ocHAKQEAgLTAsMCArMSwxNjAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJpZV9wb2xpY3kvb3JkZXJfc3RhdGlzdGljc19pbXAuaHBwCisgKiBDb250YWlucyBmb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3Igb3JkZXJfc3RhdGlzdGljc19rZXkKKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9ieV9vcmRlcihzaXplX3R5cGUgb3JkZXIpCit7CisgIGlmIChlbXB0eSgpKQorICAgIHJldHVybiBlbmQoKTsKKworICArK29yZGVyOworICBub2RlX2l0ZXJhdG9yIG5kX2l0ID0gbm9kZV9iZWdpbigpOworCisgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgIGlmIChvcmRlciA+IG5kX2l0LmdldF9tZXRhZGF0YSgpKQorCXJldHVybiArK2Jhc2VfdHlwZTo6cmlnaHRtb3N0X2l0KG5kX2l0KTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIG51bV9jaGlsZHJlbiA9IG5kX2l0Lm51bV9jaGlsZHJlbigpOworICAgICAgaWYgKG51bV9jaGlsZHJlbiA9PSAwKQorCXJldHVybiAqbmRfaXQ7CisKKyAgICAgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2NoaWxkcmVuOyArK2kpCisJeworCSAgbm9kZV9pdGVyYXRvciBjaGlsZF9uZF9pdCA9IG5kX2l0LmdldF9jaGlsZChpKTsKKwkgIGlmIChvcmRlciA8PSBjaGlsZF9uZF9pdC5nZXRfbWV0YWRhdGEoKSkKKwkgICAgeworCSAgICAgIGkgPSBudW1fY2hpbGRyZW47CisJICAgICAgbmRfaXQgPSBjaGlsZF9uZF9pdDsKKwkgICAgfQorCSAgZWxzZQorCSAgICBvcmRlciAtPSBjaGlsZF9uZF9pdC5nZXRfbWV0YWRhdGEoKTsKKwl9CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9ieV9vcmRlcihzaXplX3R5cGUgb3JkZXIpIGNvbnN0Cit7IHJldHVybiBjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKj4odGhpcyktPmZpbmRfYnlfb3JkZXIob3JkZXIpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3JkZXJfb2Zfa2V5KGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIGNvbnN0IF9BVHJhaXRzJiByX3RyYWl0cyA9CisgICAgY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyogPih0aGlzKS0+Z2V0X2FjY2Vzc190cmFpdHMoKTsKKworICByZXR1cm4gb3JkZXJfb2ZfcHJlZml4KHJfdHJhaXRzLmJlZ2luKHJfa2V5KSwgcl90cmFpdHMuZW5kKHJfa2V5KSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3JkZXJfb2ZfcHJlZml4KHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGIsCisJCXR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGUpIGNvbnN0Cit7CisgIGlmIChlbXB0eSgpKQorICAgIHJldHVybiAwOworCisgIGNvbnN0IF9BVHJhaXRzJiByX3RyYWl0cyA9CisgICAgY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyo+KHRoaXMpLT5nZXRfYWNjZXNzX3RyYWl0cygpOworCisgIG5vZGVfY29uc3RfaXRlcmF0b3IgbmRfaXQgPSBub2RlX2JlZ2luKCk7CisgIG5vZGVfY29uc3RfaXRlcmF0b3IgZW5kX25kX2l0ID0gbm9kZV9lbmQoKTsKKyAgc2l6ZV90eXBlIG9yZCA9IDA7CisKKyAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIG51bV9jaGlsZHJlbiA9IG5kX2l0Lm51bV9jaGlsZHJlbigpOworICAgICAgaWYgKG51bV9jaGlsZHJlbiA9PSAwKQorCXsKKwkgIGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkgPSBiYXNlX3R5cGU6OmV4dHJhY3Rfa2V5KCooKm5kX2l0KSk7CisJICB0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBrZXlfYiA9CisJICAgIHJfdHJhaXRzLmJlZ2luKHJfa2V5KTsKKworCSAgdHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3Iga2V5X2UgPQorCSAgICByX3RyYWl0cy5lbmQocl9rZXkpOworCisJICByZXR1cm4gKGJhc2VfdHlwZTo6bGVzcyhrZXlfYiwga2V5X2UsICBiLCBlLCAgcl90cmFpdHMpKSA/CisJCSAgb3JkICsgMSA6IG9yZDsKKwl9CisKKyAgICAgIG5vZGVfY29uc3RfaXRlcmF0b3IgbmV4dF9uZF9pdCA9IGVuZF9uZF9pdDsKKyAgICAgIHNpemVfdHlwZSBpID0gbnVtX2NoaWxkcmVuIC0gMTsKKworICAgICAgZG8KKwl7CisJICBub2RlX2NvbnN0X2l0ZXJhdG9yIGNoaWxkX25kX2l0ID0gbmRfaXQuZ2V0X2NoaWxkKGkpOworCisJICBpZiAobmV4dF9uZF9pdCAhPSBlbmRfbmRfaXQpCisJICAgIG9yZCArPSBjaGlsZF9uZF9pdC5nZXRfbWV0YWRhdGEoKTsKKwkgIGVsc2UgaWYgKCFiYXNlX3R5cGU6Omxlc3MoYiwgZSwKKwkJCQkgICAgY2hpbGRfbmRfaXQudmFsaWRfcHJlZml4KCkuZmlyc3QsCisJCQkJICAgIGNoaWxkX25kX2l0LnZhbGlkX3ByZWZpeCgpLnNlY29uZCwKKwkJCQkgICAgcl90cmFpdHMpKQorCSAgICBuZXh0X25kX2l0ID0gY2hpbGRfbmRfaXQ7CisJfQorICAgICAgd2hpbGUgKGktLSA+IDApOworCisgICAgICBpZiAobmV4dF9uZF9pdCA9PSBlbmRfbmRfaXQpCisJcmV0dXJuIG9yZDsKKworICAgICAgbmRfaXQgPSBuZXh0X25kX2l0OworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitvcGVyYXRvcigpKG5vZGVfaXRlcmF0b3IgbmRfaXQsIG5vZGVfY29uc3RfaXRlcmF0b3IgLyplbmRfbmRfaXQqLykgY29uc3QKK3sKKyAgY29uc3Qgc2l6ZV90eXBlIG51bV9jaGlsZHJlbiA9IG5kX2l0Lm51bV9jaGlsZHJlbigpOworICBzaXplX3R5cGUgY2hpbGRyZW5fcmFuayA9IDA7CisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2NoaWxkcmVuOyArK2kpCisgICAgY2hpbGRyZW5fcmFuayArPSBuZF9pdC5nZXRfY2hpbGQoaSkuZ2V0X21ldGFkYXRhKCk7CisKKyAgY29uc3Qgc2l6ZV90eXBlIHJlcyA9IChudW1fY2hpbGRyZW4gPT0gMCkgPyAxIDogY2hpbGRyZW5fcmFuazsKKyAgY29uc3RfY2FzdDxzaXplX3R5cGUmPihuZF9pdC5nZXRfbWV0YWRhdGEoKSkgPSByZXM7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvcHJlZml4X3NlYXJjaF9ub2RlX3VwZGF0ZV9pbXAuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3ByZWZpeF9zZWFyY2hfbm9kZV91cGRhdGVfaW1wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTk2MTEzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3ByZWZpeF9zZWFyY2hfbm9kZV91cGRhdGVfaW1wLmhwcApAQCAtMCwwICsxLDEzOSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmllX3BvbGljeS9wcmVmaXhfc2VhcmNoX25vZGVfdXBkYXRlX2ltcC5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIG9mIHByZWZpeF9zZWFyY2hfbm9kZV91cGRhdGUuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3N0ZDo6cGFpcjwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yLAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3I+CitQQl9EU19DTEFTU19DX0RFQzo6CitwcmVmaXhfcmFuZ2Uoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgY29uc3QgYWNjZXNzX3RyYWl0cyYgcl90cmFpdHMgPSBnZXRfYWNjZXNzX3RyYWl0cygpOworICByZXR1cm4gKHByZWZpeF9yYW5nZShyX3RyYWl0cy5iZWdpbihyX2tleSksIHJfdHJhaXRzLmVuZChyX2tleSkpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3N0ZDo6cGFpcjwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yLAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3I+CitQQl9EU19DTEFTU19DX0RFQzo6CitwcmVmaXhfcmFuZ2Uoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgcmV0dXJuIChwcmVmaXhfcmFuZ2UoZ2V0X2FjY2Vzc190cmFpdHMoKS5iZWdpbihyX2tleSksCisJCSAgICAgICBnZXRfYWNjZXNzX3RyYWl0cygpLmVuZChyX2tleSkpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3N0ZDo6cGFpcjwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yLAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3I+CitQQl9EU19DTEFTU19DX0RFQzo6CitwcmVmaXhfcmFuZ2UodHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgYiwKKwkgICAgIHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGUpIGNvbnN0Cit7CisgIGNvbnN0IHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IG5vbl9jb25zdF9yZXQgPQorICAgIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMqID4odGhpcyktPnByZWZpeF9yYW5nZShiLCBlKTsKKworICByZXR1cm4gKHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKG5vbl9jb25zdF9yZXQuZmlyc3QpLAorCQkJIGNvbnN0X2l0ZXJhdG9yKG5vbl9jb25zdF9yZXQuc2Vjb25kKSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworc3RkOjpwYWlyPAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IsCisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcj4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ByZWZpeF9yYW5nZSh0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBiLAorCSAgICAgdHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgZSkKK3sKKyAgTm9kZV9JdHIgbmRfaXQgPSBub2RlX2JlZ2luKCk7CisgIE5vZGVfSXRyIGVuZF9uZF9pdCA9IG5vZGVfZW5kKCk7CisKKyAgY29uc3QgYWNjZXNzX3RyYWl0cyYgcl90cmFpdHMgPSBnZXRfYWNjZXNzX3RyYWl0cygpOworICBjb25zdCBzaXplX3R5cGUgZ2l2ZW5fcmFuZ2VfbGVuZ3RoID0gc3RkOjpkaXN0YW5jZShiLCBlKTsKKworICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICBpZiAobmRfaXQgPT0gZW5kX25kX2l0KQorCXJldHVybiAoc3RkOjptYWtlX3BhaXIoZW5kKCksIGVuZCgpKSk7CisKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBjb21tb25fcmFuZ2VfbGVuZ3RoID0KKwliYXNlX3R5cGU6OmNvbW1vbl9wcmVmaXhfbGVuKG5kX2l0LCBiLCBlLCByX3RyYWl0cyk7CisKKyAgICAgIGlmIChjb21tb25fcmFuZ2VfbGVuZ3RoID49IGdpdmVuX3JhbmdlX2xlbmd0aCkKKwl7CisJICBpdGVyYXRvciByZXRfYiA9IHRoaXMtPmxlZnRtb3N0X2l0KG5kX2l0KTsKKwkgIGl0ZXJhdG9yIHJldF9lID0gdGhpcy0+cmlnaHRtb3N0X2l0KG5kX2l0KTsKKwkgIHJldHVybiAoc3RkOjptYWtlX3BhaXIocmV0X2IsICsrcmV0X2UpKTsKKwl9CisgICAgICBuZF9pdCA9IG5leHRfY2hpbGQobmRfaXQsIGIsIGUsIGVuZF9uZF9pdCwgcl90cmFpdHMpOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CituZXh0X2NoaWxkKG5vZGVfaXRlcmF0b3IgbmRfaXQsIHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGIsCisJICAgdHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgZSwgbm9kZV9pdGVyYXRvciBlbmRfbmRfaXQsCisJICAgY29uc3QgYWNjZXNzX3RyYWl0cyYgcl90cmFpdHMpCit7CisgIGNvbnN0IHNpemVfdHlwZSBudW1fY2hpbGRyZW4gPSBuZF9pdC5udW1fY2hpbGRyZW4oKTsKKyAgbm9kZV9pdGVyYXRvciByZXQgPSBlbmRfbmRfaXQ7CisgIHNpemVfdHlwZSBtYXhfbGVuZ3RoID0gMDsKKyAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fY2hpbGRyZW47ICsraSkKKyAgICB7CisgICAgICBub2RlX2l0ZXJhdG9yIHBvdCA9IG5kX2l0LmdldF9jaGlsZChpKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBjb21tb25fcmFuZ2VfbGVuZ3RoID0KKwliYXNlX3R5cGU6OmNvbW1vbl9wcmVmaXhfbGVuKHBvdCwgYiwgZSwgcl90cmFpdHMpOworCisgICAgICBpZiAoY29tbW9uX3JhbmdlX2xlbmd0aCA+IG1heF9sZW5ndGgpCisJeworCSAgcmV0ID0gcG90OworCSAgbWF4X2xlbmd0aCA9IGNvbW1vbl9yYW5nZV9sZW5ndGg7CisJfQorICAgIH0KKyAgcmV0dXJuIChyZXQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK29wZXJhdG9yKCkobm9kZV9pdGVyYXRvciAvKm5kX2l0Ki8sIG5vZGVfY29uc3RfaXRlcmF0b3IgLyplbmRfbmRfaXQqLykgY29uc3QKK3sgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3NhbXBsZV90cmllX2FjY2Vzc190cmFpdHMuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3NhbXBsZV90cmllX2FjY2Vzc190cmFpdHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZWYyYzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvc2FtcGxlX3RyaWVfYWNjZXNzX3RyYWl0cy5ocHAKQEAgLTAsMCArMSw3NyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmllX3BvbGljeS9zYW1wbGVfdHJpZV9hY2Nlc3NfdHJhaXRzLmhwcAorICogQ29udGFpbnMgYSBzYW1wbGUgcHJvYmUgcG9saWN5LgorICovCisKKyNpZm5kZWYgUEJfRFNfU0FNUExFX1RSSUVfRV9BQ0NFU1NfVFJBSVRTX0hQUAorI2RlZmluZSBQQl9EU19TQU1QTEVfVFJJRV9FX0FDQ0VTU19UUkFJVFNfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8vLyBBIHNhbXBsZSB0cmllIGVsZW1lbnQgYWNjZXNzIHRyYWl0cy4KKyAgc3RydWN0IHNhbXBsZV90cmllX2FjY2Vzc190cmFpdHMKKyAgeworICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgCQkgICAgICAgCQlzaXplX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnN0cmluZyAJCQkgICAgICAgCWtleV90eXBlOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxrZXlfdHlwZT4JX19yZWJpbmRfazsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2s6Om90aGVyOjpjb25zdF9yZWZlcmVuY2UJa2V5X2NvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciAJCWNvbnN0X2l0ZXJhdG9yOworCisgICAgLy8vIEVsZW1lbnQgdHlwZS4KKyAgICB0eXBlZGVmIGNoYXIgCQkJCSAgICAgICAJZV90eXBlOworCisgICAgZW51bQorICAgICAgeworCW1heF9zaXplID0gNAorICAgICAgfTsKKworICAgIC8vLyBSZXR1cm5zIGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2Ygcl9rZXkuCisgICAgaW5saW5lIHN0YXRpYyBjb25zdF9pdGVyYXRvcgorICAgIGJlZ2luKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgLy8vIFJldHVybnMgYSBjb25zdF9pdGVyYXRvciB0byB0aGUgYWZ0ZXItbGFzdCBlbGVtZW50IG9mIHJfa2V5LgorICAgIGlubGluZSBzdGF0aWMgY29uc3RfaXRlcmF0b3IKKyAgICBlbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAvLy8gTWFwcyBhbiBlbGVtZW50IHRvIGEgcG9zaXRpb24uCisgICAgaW5saW5lIHN0YXRpYyBzaXplX3R5cGUKKyAgICBlX3BvcyhlX3R5cGUpOworICB9OworfQorI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfU0FNUExFX1RSSUVfRV9BQ0NFU1NfVFJBSVRTX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3NhbXBsZV90cmllX25vZGVfdXBkYXRlLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9zYW1wbGVfdHJpZV9ub2RlX3VwZGF0ZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkNDg3ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9zYW1wbGVfdHJpZV9ub2RlX3VwZGF0ZS5ocHAKQEAgLTAsMCArMSw2NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmllX3BvbGljeS9zYW1wbGVfdHJpZV9ub2RlX3VwZGF0ZS5ocHAKKyAqIENvbnRhaW5zIGEgc2FtbGUgbm9kZSB1cGRhdGUgZnVuY3Rvci4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NBTVBMRV9UUklFX05PREVfVVBEQVRPUl9IUFAKKyNkZWZpbmUgUEJfRFNfU0FNUExFX1RSSUVfTk9ERV9VUERBVE9SX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICAvLy8gQSBzYW1wbGUgbm9kZSB1cGRhdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsIHR5cGVuYW1lIE5vZGVfSXRyLAorCSAgIHR5cGVuYW1lIF9BVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgIGNsYXNzIHNhbXBsZV90cmllX25vZGVfdXBkYXRlCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgCQltZXRhZGF0YV90eXBlOworCisgIHByb3RlY3RlZDoKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBzYW1wbGVfdHJpZV9ub2RlX3VwZGF0ZSgpOworCisgICAgLy8vIFVwZGF0ZXMgdGhlIHJhbmsgb2YgYSBub2RlIHRocm91Z2ggYSBub2RlX2l0ZXJhdG9yIG5vZGVfaXQ7CisgICAgLy8vIGVuZF9uZF9pdCBpcyB0aGUgZW5kIG5vZGUgaXRlcmF0b3IuCisgICAgaW5saW5lIHZvaWQKKyAgICBvcGVyYXRvcigpKG5vZGVfaXRlcmF0b3IsIG5vZGVfY29uc3RfaXRlcmF0b3IpIGNvbnN0OworICB9OworfQorI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfU0FNUExFX1RSSUVfTk9ERV9VUERBVE9SX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3RyaWVfcG9saWN5X2Jhc2UuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3RyaWVfcG9saWN5X2Jhc2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMWM0YTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvdHJpZV9wb2xpY3lfYmFzZS5ocHAKQEAgLTAsMCArMSwyMDcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJpZV9wb2xpY3kvdHJpZV9wb2xpY3lfYmFzZS5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIG9mIHRyaWVfcG9saWN5X2Jhc2UuCisgKi8KKworI2lmbmRlZiBQQl9EU19UUklFX1BPTElDWV9CQVNFX0hQUAorI2RlZmluZSBQQl9EU19UUklFX1BPTElDWV9CQVNFX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L2JyYW5jaF9wb2xpY3kuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gQmFzZSBjbGFzcyBmb3IgdHJpZSBwb2xpY2llcy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsIHR5cGVuYW1lIE5vZGVfSXRyLAorCSAgICAgdHlwZW5hbWUgX0FUcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyB0cmllX3BvbGljeV9iYXNlCisgICAgOiBwdWJsaWMgYnJhbmNoX3BvbGljeTxOb2RlX0NJdHIsIE5vZGVfSXRyLCBfQWxsb2M+CisgICAgeworICAgICAgdHlwZWRlZiBicmFuY2hfcG9saWN5PE5vZGVfQ0l0ciwgTm9kZV9JdHIsIF9BbGxvYz4gYmFzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQVRyYWl0cyAJCQkJYWNjZXNzX3RyYWl0czsKKyAgICAgIHR5cGVkZWYgX0FsbG9jIAkJCQkJYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpzaXplX3R5cGUgCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgbnVsbF90eXBlIAkJCQltZXRhZGF0YV90eXBlOworICAgICAgdHlwZWRlZiBOb2RlX0NJdHIgCQkJCW5vZGVfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIE5vZGVfSXRyIAkJCQkJbm9kZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbm9kZV9jb25zdF9pdGVyYXRvcjo6dmFsdWVfdHlwZSAJY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG5vZGVfaXRlcmF0b3I6OnZhbHVlX3R5cGUgCWl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmtleV90eXBlIAkJa2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X2NvbnN0X3JlZmVyZW5jZSAJa2V5X2NvbnN0X3JlZmVyZW5jZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0ID0gMDsKKworICAgICAgdmlydHVhbCBpdGVyYXRvcgorICAgICAgZW5kKCkgPSAwOworCisgICAgICB2aXJ0dWFsIG5vZGVfY29uc3RfaXRlcmF0b3IKKyAgICAgIG5vZGVfYmVnaW4oKSBjb25zdCA9IDA7CisKKyAgICAgIHZpcnR1YWwgbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9iZWdpbigpID0gMDsKKworICAgICAgdmlydHVhbCBub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBub2RlX2VuZCgpIGNvbnN0ID0gMDsKKworICAgICAgdmlydHVhbCBub2RlX2l0ZXJhdG9yCisgICAgICBub2RlX2VuZCgpID0gMDsKKworICAgICAgdmlydHVhbCBjb25zdCBhY2Nlc3NfdHJhaXRzJgorICAgICAgZ2V0X2FjY2Vzc190cmFpdHMoKSBjb25zdCA9IDA7CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciAJZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPGVfY29uc3RfaXRlcmF0b3IsIGVfY29uc3RfaXRlcmF0b3I+IHByZWZpeF9yYW5nZV90OworCisgICAgcHJvdGVjdGVkOgorICAgICAgc3RhdGljIHNpemVfdHlwZQorICAgICAgY29tbW9uX3ByZWZpeF9sZW4obm9kZV9pdGVyYXRvciwgZV9jb25zdF9pdGVyYXRvciwKKwkJCWVfY29uc3RfaXRlcmF0b3IsIGNvbnN0IGFjY2Vzc190cmFpdHMmKTsKKworICAgICAgc3RhdGljIGl0ZXJhdG9yCisgICAgICBsZWZ0bW9zdF9pdChub2RlX2l0ZXJhdG9yKTsKKworICAgICAgc3RhdGljIGl0ZXJhdG9yCisgICAgICByaWdodG1vc3RfaXQobm9kZV9pdGVyYXRvcik7CisKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBsZXNzKGVfY29uc3RfaXRlcmF0b3IsIGVfY29uc3RfaXRlcmF0b3IsIGVfY29uc3RfaXRlcmF0b3IsCisJICAgZV9jb25zdF9pdGVyYXRvciwgY29uc3QgYWNjZXNzX3RyYWl0cyYpOworICAgIH07CisKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLCB0eXBlbmFtZSBOb2RlX0l0ciwgXAorCSAgICAgdHlwZW5hbWUgX0FUcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgdHJpZV9wb2xpY3lfYmFzZTxOb2RlX0NJdHIsIE5vZGVfSXRyLCBfQVRyYWl0cywgX0FsbG9jPgorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGNvbW1vbl9wcmVmaXhfbGVuKG5vZGVfaXRlcmF0b3IgbmRfaXQsIGVfY29uc3RfaXRlcmF0b3IgYl9yLAorCQkgICAgICBlX2NvbnN0X2l0ZXJhdG9yIGVfciwgY29uc3QgYWNjZXNzX3RyYWl0cyYgcl90cmFpdHMpCisgICAgeworICAgICAgcHJlZml4X3JhbmdlX3QgcHJlZl9yYW5nZSA9IG5kX2l0LnZhbGlkX3ByZWZpeCgpOworCisgICAgICBlX2NvbnN0X2l0ZXJhdG9yIGJfbCA9IHByZWZfcmFuZ2UuZmlyc3Q7CisgICAgICBlX2NvbnN0X2l0ZXJhdG9yIGVfbCA9IHByZWZfcmFuZ2Uuc2Vjb25kOworCisgICAgICBjb25zdCBzaXplX3R5cGUgcmFuZ2VfbGVuZ3RoX2wgPSBzdGQ6OmRpc3RhbmNlKGJfbCwgZV9sKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSByYW5nZV9sZW5ndGhfciA9IHN0ZDo6ZGlzdGFuY2UoYl9yLCBlX3IpOworCisgICAgICBpZiAocmFuZ2VfbGVuZ3RoX3IgPCByYW5nZV9sZW5ndGhfbCkKKwl7CisJICBzdGQ6OnN3YXAoYl9sLCBiX3IpOworCSAgc3RkOjpzd2FwKGVfbCwgZV9yKTsKKwl9CisKKyAgICAgIHNpemVfdHlwZSByZXQgPSAwOworICAgICAgd2hpbGUgKGJfbCAhPSBlX2wpCisJeworCSAgaWYgKHJfdHJhaXRzLmVfcG9zKCpiX2wpICE9IHJfdHJhaXRzLmVfcG9zKCpiX3IpKQorCSAgICByZXR1cm4gcmV0OworCisJICArK3JldDsKKwkgICsrYl9sOworCSAgKytiX3I7CisJfQorCisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGxlZnRtb3N0X2l0KG5vZGVfaXRlcmF0b3IgbmRfaXQpCisgICAgeworICAgICAgaWYgKG5kX2l0Lm51bV9jaGlsZHJlbigpID09IDApCisJcmV0dXJuICpuZF9pdDsKKworICAgICAgcmV0dXJuIGxlZnRtb3N0X2l0KG5kX2l0LmdldF9jaGlsZCgwKSk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmlnaHRtb3N0X2l0KG5vZGVfaXRlcmF0b3IgbmRfaXQpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIG51bV9jaGlsZHJlbiA9IG5kX2l0Lm51bV9jaGlsZHJlbigpOworCisgICAgICBpZiAobnVtX2NoaWxkcmVuID09IDApCisJcmV0dXJuICpuZF9pdDsKKworICAgICAgcmV0dXJuIHJpZ2h0bW9zdF9pdChuZF9pdC5nZXRfY2hpbGQobnVtX2NoaWxkcmVuIC0gMSkpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgYm9vbAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBsZXNzKGVfY29uc3RfaXRlcmF0b3IgYl9sLCBlX2NvbnN0X2l0ZXJhdG9yIGVfbCwKKwkgZV9jb25zdF9pdGVyYXRvciBiX3IsIGVfY29uc3RfaXRlcmF0b3IgZV9yLAorCSBjb25zdCBhY2Nlc3NfdHJhaXRzJiByX3RyYWl0cykKKyAgICB7CisgICAgICB3aGlsZSAoYl9sICE9IGVfbCkKKwl7CisJICBpZiAoYl9yID09IGVfcikKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBzaXplX3R5cGUgbF9wb3MgPSByX3RyYWl0cy5lX3BvcygqYl9sKTsKKwkgIHNpemVfdHlwZSByX3BvcyA9IHJfdHJhaXRzLmVfcG9zKCpiX3IpOworCSAgaWYgKGxfcG9zICE9IHJfcG9zKQorCSAgICByZXR1cm4gKGxfcG9zIDwgcl9wb3MpOworCisJICArK2JfbDsKKwkgICsrYl9yOworCX0KKyAgICAgIHJldHVybiBiX3IgIT0gZV9yOworICAgIH0KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfVFJJRV9QT0xJQ1lfQkFTRV9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS90cmllX3N0cmluZ19hY2Nlc3NfdHJhaXRzX2ltcC5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvdHJpZV9zdHJpbmdfYWNjZXNzX3RyYWl0c19pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NjJkYzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvdHJpZV9zdHJpbmdfYWNjZXNzX3RyYWl0c19pbXAuaHBwCkBAIC0wLDAgKzEsOTkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJpZV9wb2xpY3kvdHJpZV9zdHJpbmdfYWNjZXNzX3RyYWl0c19pbXAuaHBwCisgKiBDb250YWlucyBhIHBvbGljeSBmb3IgZXh0cmFjdGluZyBjaGFyYWN0ZXIgcG9zaXRpb25zIGZyb20KKyAqICAgIGEgc3RyaW5nIGZvciBhIHZlY3Rvci1iYXNlZCBQQVRSSUNJQSB0cmVlCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2RldGFpbDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCBSZXZlcnNlPiBQQl9EU19DTEFTU19DX0RFQzo6c19yZXZfaW5kOworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VfcG9zKGVfdHlwZSBlKQoreworICByZXR1cm4gKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oZSAtIG1pbl9lX3ZhbCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgcmV0dXJuIChiZWdpbl9pbXAocl9rZXksIHNfcmV2X2luZCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIHJldHVybiAoZW5kX2ltcChyX2tleSwgc19yZXZfaW5kKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitiZWdpbl9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgZGV0YWlsOjpmYWxzZV90eXBlKQoreworICByZXR1cm4gKHJfa2V5LmJlZ2luKCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW5faW1wKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIGRldGFpbDo6dHJ1ZV90eXBlKQoreworICByZXR1cm4gKHJfa2V5LnJiZWdpbigpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZF9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgZGV0YWlsOjpmYWxzZV90eXBlKQoreworICByZXR1cm4gKHJfa2V5LmVuZCgpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZF9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgZGV0YWlsOjp0cnVlX3R5cGUpCit7CisgIHJldHVybiAocl9rZXkucmVuZCgpKTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzQ2MTI4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwCkBAIC0wLDAgKzEsMTY3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRldGFpbC90eXBlX3V0aWxzLmhwcAorICogQ29udGFpbnMgdXRpbGl0aWVzIGZvciBoYW5kbmxpbmcgdHlwZXMuIEFsbCBvZiB0aGVzZSBjbGFzc2VzIGFyZSBiYXNlZCBvbgorICogTW9kZXJuIEMrKyBieSBBbmRyZWkgQWx4YW5kcmVzY3UuCisgKi8KKworI2lmbmRlZiBQQl9EU19UWVBFX1VUSUxTX0hQUAorI2RlZmluZSBQQl9EU19UWVBFX1VUSUxTX0hQUAorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHRyMS90eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvbnVtZXJpY190cmFpdHMuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgdXNpbmcgc3RkOjp0cjE6OmlzX3NhbWU7CisgICAgdXNpbmcgc3RkOjp0cjE6OmlzX2NvbnN0OworICAgIHVzaW5nIHN0ZDo6dHIxOjppc19wb2ludGVyOworICAgIHVzaW5nIHN0ZDo6dHIxOjppc19yZWZlcmVuY2U7CisgICAgdXNpbmcgc3RkOjp0cjE6OmlzX2Z1bmRhbWVudGFsOworICAgIHVzaW5nIHN0ZDo6dHIxOjppc19tZW1iZXJfb2JqZWN0X3BvaW50ZXI7CisgICAgdXNpbmcgc3RkOjp0cjE6OmlzX21lbWJlcl9wb2ludGVyOworICAgIHVzaW5nIHN0ZDo6dHIxOjppc19iYXNlX29mOworICAgIHVzaW5nIHN0ZDo6dHIxOjpyZW1vdmVfY29uc3Q7CisgICAgdXNpbmcgc3RkOjp0cjE6OnJlbW92ZV9yZWZlcmVuY2U7CisKKyAgICAvLyBOZWVkIGludGVncmFsX2NvbnN0PGJvb2wsIHRydWU+IDwtPiBpbnRlZ3JhbF9jb25zdDxpbnQsIDE+LCBzbworICAgIC8vIGJlY2F1c2Ugb2YgdGhpcyB1c2UgdGhlIGZvbGxvd2luZyB0eXBlZGVmcyBpbnN0ZWFkIG9mIGltcG9ydGluZworICAgIC8vIHN0ZDo6dHIxJ3MuCisgICAgdXNpbmcgc3RkOjp0cjE6OmludGVncmFsX2NvbnN0YW50OworICAgIHR5cGVkZWYgc3RkOjp0cjE6OmludGVncmFsX2NvbnN0YW50PGludCwgMT4gdHJ1ZV90eXBlOworICAgIHR5cGVkZWYgc3RkOjp0cjE6OmludGVncmFsX2NvbnN0YW50PGludCwgMD4gZmFsc2VfdHlwZTsKKworICAgIHVzaW5nIF9fZ251X2N4eDo6X19jb25kaXRpb25hbF90eXBlOworICAgIHVzaW5nIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGlzX2NvbnN0X3BvaW50ZXIKKyAgICB7CisgICAgICBlbnVtCisJeworCSAgdmFsdWUgPSBpc19jb25zdDxUPjo6dmFsdWUgJiYgaXNfcG9pbnRlcjxUPjo6dmFsdWUKKwl9OworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBpc19jb25zdF9yZWZlcmVuY2UKKyAgICB7CisgICAgICBlbnVtCisJeworCSAgdmFsdWUgPSBpc19jb25zdDxUPjo6dmFsdWUgJiYgaXNfcmVmZXJlbmNlPFQ+Ojp2YWx1ZQorCX07CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGlzX3NpbXBsZQorICAgIHsKKyAgICAgIGVudW0KKwl7CisJICB2YWx1ZSA9IGlzX2Z1bmRhbWVudGFsPHR5cGVuYW1lIHJlbW92ZV9jb25zdDxUPjo6dHlwZT46OnZhbHVlIAorCSAgfHwgaXNfcG9pbnRlcjx0eXBlbmFtZSByZW1vdmVfY29uc3Q8VD46OnR5cGU+Ojp2YWx1ZSAKKwkgIHx8IGlzX21lbWJlcl9wb2ludGVyPFQ+Ojp2YWx1ZSAKKwl9OworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIGlzX3BhaXIKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CisgICAgICBzdHJ1Y3QgaXNfcGFpcl9pbXAKKyAgICAgIHsKKwllbnVtCisJICB7CisJICAgIHZhbHVlID0gMAorCSAgfTsKKyAgICAgIH07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFY+CisgICAgICBzdHJ1Y3QgaXNfcGFpcl9pbXA8c3RkOjpwYWlyPFUsVj4gPgorICAgICAgeworCWVudW0KKwkgIHsKKwkgICAgdmFsdWUgPSAxCisJICB9OworICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIGVudW0KKwl7CisJICB2YWx1ZSA9IGlzX3BhaXJfaW1wPFQ+Ojp2YWx1ZQorCX07CisgICAgfTsKKworICAgIC8vIFVzZSBDKysweCdzIHN0YXRpY19hc3NlcnQgaWYgcG9zc2libGUuCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2RlZmluZSBQQl9EU19TVEFUSUNfQVNTRVJUKFVOSVFVRSwgRSkgIHN0YXRpY19hc3NlcnQoRSwgI1VOSVFVRSkKKyNlbHNlCisgICAgdGVtcGxhdGU8Ym9vbD4KKyAgICBzdHJ1Y3QgX19zdGF0aWNfYXNzZXJ0OworCisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3N0YXRpY19hc3NlcnQ8dHJ1ZT4KKyAgICB7IH07CisKKyAgICB0ZW1wbGF0ZTxpbnQ+CisgICAgc3RydWN0IF9fc3RhdGljX2Fzc2VydF9kdW1jbGFzcworICAgIHsKKyAgICAgIGVudW0KKwl7CisJICB2ID0gMQorCX07CisgICAgfTsKKworI2RlZmluZSBQQl9EU19TVEFUSUNfQVNTRVJUKFVOSVFVRSwgRSkgIFwKKyAgICB0eXBlZGVmIF9fZ251X3BiZHM6OmRldGFpbDo6X19zdGF0aWNfYXNzZXJ0X2R1bWNsYXNzPHNpemVvZihfX2dudV9wYmRzOjpkZXRhaWw6Ol9fc3RhdGljX2Fzc2VydDxib29sKEUpPik+IFVOSVFVRSMjX19zdGF0aWNfYXNzZXJ0X3R5cGUKKworI2VuZGlmCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPgorICAgIHN0cnVjdCB0eXBlX3RvX3R5cGUKKyAgICB7CisgICAgICB0eXBlZGVmIFR5cGUgdHlwZTsKKyAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWQ1YTRmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHAKQEAgLTAsMCArMSwyODggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHAKKyAqIENvbnRhaW5zIGEgdHJhaXRzIGNsYXNzIG9mIHR5cGVzIHVzZWQgYnkgY29udGFpbmVycy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1RZUEVTX1RSQUlUU19IUFAKKyNkZWZpbmUgUEJfRFNfVFlQRVNfVFJBSVRTX0hQUAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLyoqCisgICAgICogIEBhZGR0b2dyb3VwIHRyYWl0cyBUcmFpdHMKKyAgICAgKiAgQHsKKyAgICAgKi8KKworICAgIC8vLyBQcmltYXJ5IHRlbXBsYXRlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkPgorICAgICAgc3RydWN0IG5vX3Rocm93X2NvcGllcworICAgICAgeworCXN0YXRpYyBjb25zdCBib29sIF9fc2ltcGxlID0gaXNfc2ltcGxlPEtleT46OnZhbHVlCisJCQkgICAJICYmIGlzX3NpbXBsZTxNYXBwZWQ+Ojp2YWx1ZTsKKwl0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGludCwgX19zaW1wbGU+IAkgICAgICAgCWluZGljYXRvcjsKKyAgICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5PgorICAgICAgc3RydWN0IG5vX3Rocm93X2NvcGllczxLZXksIG51bGxfdHlwZT4KKyAgICAgIHsKKwl0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGludCwgaXNfc2ltcGxlPEtleT46OnZhbHVlPiAJaW5kaWNhdG9yOworICAgICAgfTsKKworCisgICAgLy8vIFN0b3JlZCB2YWx1ZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHY+CisgICAgICBzdHJ1Y3Qgc3RvcmVkX3ZhbHVlCisgICAgICB7CisJdHlwZWRlZiBfVHYgCXZhbHVlX3R5cGU7CisJdmFsdWVfdHlwZSAJbV92YWx1ZTsKKyAgICAgIH07CisKKyAgICAvLy8gU3RvcmVkIGhhc2guCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RoPgorICAgICAgc3RydWN0IHN0b3JlZF9oYXNoCisgICAgICB7CisJdHlwZWRlZiBfVGggCWhhc2hfdHlwZTsKKwloYXNoX3R5cGUgCW1faGFzaDsKKyAgICAgIH07CisKKyAgICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZSBmb3IgcmVwcmVzZW50YXRpb24gb2Ygc3RvcmVkIGRhdGEuCisgICAgLy8vIFR3byB0eXBlcyBvZiBkYXRhIGNhbiBiZSBzdG9yZWQ6IHZhbHVlIGFuZCBoYXNoLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UdiwgdHlwZW5hbWUgX1RoPgorICAgICAgc3RydWN0IHN0b3JlZF9kYXRhCisgICAgICA6IHB1YmxpYyBzdG9yZWRfdmFsdWU8X1R2PiwgcHVibGljIHN0b3JlZF9oYXNoPF9UaD4KKyAgICAgIHsgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgcmVwcmVzZW50YXRpb24gb2Ygc3RvcmVkIGRhdGEgb2YganVzdCB2YWx1ZSB0eXBlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Udj4KKyAgICAgIHN0cnVjdCBzdG9yZWRfZGF0YTxfVHYsIG51bGxfdHlwZT4KKyAgICAgIDogcHVibGljIHN0b3JlZF92YWx1ZTxfVHY+CisgICAgICB7IH07CisKKyAgICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgX0FsbG9jLCBib29sIFN0b3JlX0hhc2g+CisgICAgICBzdHJ1Y3QgdHlwZV9iYXNlOworCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gb2YgdHlwZV9iYXNlIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgaGFzaCB2YWx1ZQorICAgICAqIGlzIG5vdCBzdG9yZWQgYWxvbmdzaWRlIGVhY2ggdmFsdWUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0cnVjdCB0eXBlX2Jhc2U8S2V5LCBNYXBwZWQsIF9BbGxvYywgZmFsc2U+CisgICAgICB7CisgICAgICBwdWJsaWM6CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKworICAgICAgcHJpdmF0ZToKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPE1hcHBlZD4JX19yZWJpbmRfbTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX206Om90aGVyCQkJX19yZWJpbmRfbWE7CisJdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgS2V5LCBNYXBwZWQ+CQkJX192YWx1ZV90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X192YWx1ZV90eXBlPglfX3JlYmluZF92OworICAgICAgIAl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3Y6Om90aGVyCQkJX19yZWJpbmRfdmE7CisKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjp2YWx1ZV90eXBlICAgICAgIAltYXBwZWRfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjpwb2ludGVyIAkJbWFwcGVkX3BvaW50ZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6Y29uc3RfcG9pbnRlciAJbWFwcGVkX2NvbnN0X3BvaW50ZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6cmVmZXJlbmNlCSAgICAgICAJbWFwcGVkX3JlZmVyZW5jZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjpjb25zdF9yZWZlcmVuY2UgCW1hcHBlZF9jb25zdF9yZWZlcmVuY2U7CisKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3ZhOjp2YWx1ZV90eXBlIAl2YWx1ZV90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OnBvaW50ZXIgCQlwb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92YTo6cmVmZXJlbmNlIAlyZWZlcmVuY2U7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92YTo6Y29uc3RfcmVmZXJlbmNlIAljb25zdF9yZWZlcmVuY2U7CisKKwl0eXBlZGVmIHN0b3JlZF9kYXRhPHZhbHVlX3R5cGUsIG51bGxfdHlwZT4Jc3RvcmVkX2RhdGFfdHlwZTsKKyAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiBvZiB0eXBlX2Jhc2UgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBoYXNoIHZhbHVlCisgICAgICogaXMgc3RvcmVkIGFsb25nc2lkZSBlYWNoIHZhbHVlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBzdHJ1Y3QgdHlwZV9iYXNlPEtleSwgTWFwcGVkLCBfQWxsb2MsIHRydWU+CisgICAgICB7CisgICAgICBwdWJsaWM6CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKworICAgICAgcHJpdmF0ZToKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPE1hcHBlZD4JX19yZWJpbmRfbTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX206Om90aGVyCQkJX19yZWJpbmRfbWE7CisJdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgS2V5LCBNYXBwZWQ+CQkJX192YWx1ZV90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X192YWx1ZV90eXBlPglfX3JlYmluZF92OworICAgICAgIAl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3Y6Om90aGVyCQkJX19yZWJpbmRfdmE7CisKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjp2YWx1ZV90eXBlICAgICAgIAltYXBwZWRfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjpwb2ludGVyIAkJbWFwcGVkX3BvaW50ZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6Y29uc3RfcG9pbnRlciAJbWFwcGVkX2NvbnN0X3BvaW50ZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6cmVmZXJlbmNlCSAgICAgICAJbWFwcGVkX3JlZmVyZW5jZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjpjb25zdF9yZWZlcmVuY2UgCW1hcHBlZF9jb25zdF9yZWZlcmVuY2U7CisKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3ZhOjp2YWx1ZV90eXBlIAl2YWx1ZV90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OnBvaW50ZXIgCQlwb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92YTo6cmVmZXJlbmNlIAlyZWZlcmVuY2U7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92YTo6Y29uc3RfcmVmZXJlbmNlIAljb25zdF9yZWZlcmVuY2U7CisKKwl0eXBlZGVmIHN0b3JlZF9kYXRhPHZhbHVlX3R5cGUsIHNpemVfdHlwZT4Jc3RvcmVkX2RhdGFfdHlwZTsKKyAgICAgIH07CisKKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIG9mIHR5cGVfYmFzZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGhhc2ggdmFsdWUKKyAgICAgKiBpcyBub3Qgc3RvcmVkIGFsb25nc2lkZSBlYWNoIHZhbHVlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgc3RydWN0IHR5cGVfYmFzZTxLZXksIG51bGxfdHlwZSwgX0FsbG9jLCBmYWxzZT4KKyAgICAgIHsKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAkJc2l6ZV90eXBlOworCXR5cGVkZWYgS2V5IAkJCQkJdmFsdWVfdHlwZTsKKworICAgICAgcHJpdmF0ZToKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPG51bGxfdHlwZT4gIAlfX3JlYmluZF9tOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbTo6b3RoZXIJCQlfX3JlYmluZF9tYTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+CV9fcmViaW5kX3Y7CisgICAgICAgCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdjo6b3RoZXIJCQlfX3JlYmluZF92YTsKKworICAgICAgcHVibGljOgorCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OnZhbHVlX3R5cGUgICAgICAgCW1hcHBlZF90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OnBvaW50ZXIgCQltYXBwZWRfcG9pbnRlcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjpjb25zdF9wb2ludGVyIAltYXBwZWRfY29uc3RfcG9pbnRlcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjpyZWZlcmVuY2UJICAgICAgIAltYXBwZWRfcmVmZXJlbmNlOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OmNvbnN0X3JlZmVyZW5jZSAJbWFwcGVkX2NvbnN0X3JlZmVyZW5jZTsKKworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OnBvaW50ZXIgCQlwb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92YTo6cmVmZXJlbmNlIAlyZWZlcmVuY2U7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92YTo6Y29uc3RfcmVmZXJlbmNlIAljb25zdF9yZWZlcmVuY2U7CisKKwl0eXBlZGVmIHN0b3JlZF9kYXRhPHZhbHVlX3R5cGUsIG51bGxfdHlwZT4Jc3RvcmVkX2RhdGFfdHlwZTsKKworCXN0YXRpYyBudWxsX3R5cGUgCQkJc19udWxsX3R5cGU7CisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBudWxsX3R5cGUKKyAgICAgIHR5cGVfYmFzZTxLZXksIG51bGxfdHlwZSwgX0FsbG9jLCBmYWxzZT46OnNfbnVsbF90eXBlOworCisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiBvZiB0eXBlX2Jhc2UgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBoYXNoIHZhbHVlCisgICAgICogaXMgc3RvcmVkIGFsb25nc2lkZSBlYWNoIHZhbHVlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgc3RydWN0IHR5cGVfYmFzZTxLZXksIG51bGxfdHlwZSwgX0FsbG9jLCB0cnVlPgorICAgICAgeworICAgICAgcHVibGljOgorCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisJdHlwZWRlZiBLZXkgCQkJCQl2YWx1ZV90eXBlOworCisgICAgICBwcml2YXRlOgorCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8bnVsbF90eXBlPiAgCV9fcmViaW5kX207CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tOjpvdGhlcgkJCV9fcmViaW5kX21hOworCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8dmFsdWVfdHlwZT4JX19yZWJpbmRfdjsKKyAgICAgICAJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92OjpvdGhlcgkJCV9fcmViaW5kX3ZhOworCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6dmFsdWVfdHlwZSAgICAgICAJbWFwcGVkX3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6cG9pbnRlciAJCW1hcHBlZF9wb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OmNvbnN0X3BvaW50ZXIgCW1hcHBlZF9jb25zdF9wb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OnJlZmVyZW5jZQkgICAgICAgCW1hcHBlZF9yZWZlcmVuY2U7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6Y29uc3RfcmVmZXJlbmNlIAltYXBwZWRfY29uc3RfcmVmZXJlbmNlOworCisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92YTo6cG9pbnRlciAJCXBvaW50ZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92YTo6Y29uc3RfcG9pbnRlciAJY29uc3RfcG9pbnRlcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3ZhOjpyZWZlcmVuY2UgCXJlZmVyZW5jZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3ZhOjpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKworCXR5cGVkZWYgc3RvcmVkX2RhdGE8dmFsdWVfdHlwZSwgc2l6ZV90eXBlPglzdG9yZWRfZGF0YV90eXBlOworCisJc3RhdGljIG51bGxfdHlwZSAJCSAgICAgIAlzX251bGxfdHlwZTsKKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIG51bGxfdHlwZQorICAgICAgdHlwZV9iYXNlPEtleSwgbnVsbF90eXBlLCBfQWxsb2MsIHRydWU+OjpzX251bGxfdHlwZTsKKworCisgICAgLy8vIFR5cGUgYmFzZSBkaXNwYXRjaC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgX0FsbG9jLCBib29sIFN0b3JlX0hhc2g+CisgICAgICBzdHJ1Y3QgdHlwZV9kaXNwYXRjaAorICAgICAgeworCXR5cGVkZWYgdHlwZV9iYXNlPEtleSwgTWFwcGVkLCBfQWxsb2MsIFN0b3JlX0hhc2g+IHR5cGU7CisgICAgICB9OworCisgICAgLy8vIFRyYWl0cyBmb3IgYWJzdHJhY3QgdHlwZXMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIF9BbGxvYywgYm9vbCBTdG9yZV9IYXNoPgorICAgICAgc3RydWN0IHR5cGVzX3RyYWl0cworICAgICAgOiBwdWJsaWMgdHlwZV9kaXNwYXRjaDxLZXksIE1hcHBlZCwgX0FsbG9jLCBTdG9yZV9IYXNoPjo6dHlwZQorICAgICAgeworICAgICAgcHJpdmF0ZToKKwl0eXBlZGVmIG5vX3Rocm93X2NvcGllczxLZXksIE1hcHBlZD4JCV9fbm90aHJvd2NvcHk7CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxLZXk+OjpvdGhlciBfX3JlYmluZF9hOworCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2E6OnZhbHVlX3R5cGUgCWtleV90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYTo6cG9pbnRlciAJCWtleV9wb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYTo6Y29uc3RfcG9pbnRlciAJa2V5X2NvbnN0X3BvaW50ZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hOjpyZWZlcmVuY2UgCQlrZXlfcmVmZXJlbmNlOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYTo6Y29uc3RfcmVmZXJlbmNlIAlrZXlfY29uc3RfcmVmZXJlbmNlOworCXR5cGVkZWYgc3RkOjpwYWlyPHNpemVfdHlwZSwgc2l6ZV90eXBlPiAJY29tcF9oYXNoOworCXR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8aW50LCBTdG9yZV9IYXNoPiAJc3RvcmVfZXh0cmE7CisJdHlwZWRlZiB0eXBlbmFtZSBfX25vdGhyb3djb3B5OjppbmRpY2F0b3IgCW5vX3Rocm93X2luZGljYXRvcjsKKworCXN0b3JlX2V4dHJhCQkJICAgICAgIAltX3N0b3JlX2V4dHJhX2luZGljYXRvcjsKKwlub190aHJvd19pbmRpY2F0b3IgCQkgCW1fbm9fdGhyb3dfY29waWVzX2luZGljYXRvcjsKKyAgICB9OworICAgIC8vQH0KKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9jb25zdF9pdGVyYXRvci5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL2NvbnN0X2l0ZXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTFlMDQ2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9jb25zdF9pdGVyYXRvci5ocHAKQEAgLTAsMCArMSwxMTEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdW5vcmRlcmVkX2l0ZXJhdG9yL2NvbnN0X2l0ZXJhdG9yLmhwcAorICogQ29udGFpbnMgYW4gaXRlcmF0b3IgY2xhc3MgdXNlZCBmb3IgY29uc3QgcmFuZ2luZyBvdmVyIHRoZSBlbGVtZW50cyBvZiB0aGUKKyAqIHRhYmxlLgorICovCisKKy8vLyBDb25zdCByYW5nZS10eXBlIGl0ZXJhdG9yLgorY2xhc3MgY29uc3RfaXRlcmF0b3JfCis6IHB1YmxpYyBwb2ludF9jb25zdF9pdGVyYXRvcl8KK3sKK3B1YmxpYzoKKyAgLy8vIENhdGVnb3J5LgorICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgLy8vIERpZmZlcmVuY2UgdHlwZS4KKyAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgLy8vIEl0ZXJhdG9yJ3MgdmFsdWUgdHlwZS4KKyAgdHlwZWRlZiB2YWx1ZV90eXBlXyB2YWx1ZV90eXBlOworCisgIC8vLyBJdGVyYXRvcidzIHBvaW50ZXIgdHlwZS4KKyAgdHlwZWRlZiBwb2ludGVyXyBwb2ludGVyOworCisgIC8vLyBJdGVyYXRvcidzIGNvbnN0IHBvaW50ZXIgdHlwZS4KKyAgdHlwZWRlZiBjb25zdF9wb2ludGVyXyBjb25zdF9wb2ludGVyOworCisgIC8vLyBJdGVyYXRvcidzIHJlZmVyZW5jZSB0eXBlLgorICB0eXBlZGVmIHJlZmVyZW5jZV8gcmVmZXJlbmNlOworCisgIC8vLyBJdGVyYXRvcidzIGNvbnN0IHJlZmVyZW5jZSB0eXBlLgorICB0eXBlZGVmIGNvbnN0X3JlZmVyZW5jZV8gY29uc3RfcmVmZXJlbmNlOworCisgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICBjb25zdF9pdGVyYXRvcl8oKSA6IG1fcF90YmwoMCkKKyAgeyB9CisKKyAgLy8vIEluY3JlbWVudHMuCisgIGNvbnN0X2l0ZXJhdG9yXyYKKyAgb3BlcmF0b3IrKygpCisgIHsKKyAgICBtX3BfdGJsLT5pbmNfaXRfc3RhdGUoYmFzZV90eXBlOjptX3BfdmFsdWUsIG1fcG9zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gSW5jcmVtZW50cy4KKyAgY29uc3RfaXRlcmF0b3JfCisgIG9wZXJhdG9yKysoaW50KQorICB7CisgICAgY29uc3RfaXRlcmF0b3JfIHJldCA9KiB0aGlzOworICAgIG1fcF90YmwtPmluY19pdF9zdGF0ZShiYXNlX3R5cGU6Om1fcF92YWx1ZSwgbV9wb3MpOworICAgIHJldHVybiByZXQ7CisgIH0KKworcHJvdGVjdGVkOgorICB0eXBlZGVmIHBvaW50X2NvbnN0X2l0ZXJhdG9yXyBiYXNlX3R5cGU7CisKKyAgLyoqCisgICAqICBDb25zdHJ1Y3RvciB1c2VkIGJ5IHRoZSB0YWJsZSB0byBpbml0aWF0ZSB0aGUgZ2VuZXJhbGl6ZWQKKyAgICogICAgICBwb2ludGVyIGFuZCBwb3NpdGlvbiAoZS5nLiwgdGhpcyBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gYSBmaW5kKCkKKyAgICogICAgICBvZiBhIHRhYmxlLgorICAgKiAqLworICBjb25zdF9pdGVyYXRvcl8oY29uc3RfcG9pbnRlcl8gcF92YWx1ZSwgIFBCX0RTX0dFTl9QT1MgcG9zLAorCQkgIGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDKiBwX3RibCkKKyAgOiBwb2ludF9jb25zdF9pdGVyYXRvcl8ocF92YWx1ZSksIG1fcF90YmwocF90YmwpLCBtX3Bvcyhwb3MpCisgIHsgfQorCisgIC8qKgorICAgKiAgUG9pbnRlciB0byB0aGUgdGFibGUgb2JqZWN0IHdoaWNoIGNyZWF0ZWQgdGhlIGl0ZXJhdG9yICh1c2VkIGZvcgorICAgKiAgICAgIGluY3JlbWVudGluZyBpdHMgcG9zaXRpb24uCisgICAqICovCisgIGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDKiBtX3BfdGJsOworCisgIFBCX0RTX0dFTl9QT1MgbV9wb3M7CisKKyAgZnJpZW5kIGNsYXNzIFBCX0RTX0NMQVNTX0NfREVDOworfTsKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvaXRlcmF0b3IuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9pdGVyYXRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4YmY1ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvaXRlcmF0b3IuaHBwCkBAIC0wLDAgKzEsMTMwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGl0ZXJhdG9yLmhwcAorICogQ29udGFpbnMgYW4gaXRlcmF0b3JfIGNsYXNzIHVzZWQgZm9yIHJhbmdpbmcgb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlCisgKiAgICB0YWJsZS4KKyAqLworCisvLy8gUmFuZ2UtdHlwZSBpdGVyYXRvci4KK2NsYXNzIGl0ZXJhdG9yXworOiBwdWJsaWMgY29uc3RfaXRlcmF0b3JfCit7CitwdWJsaWM6CisgIC8vLyBDYXRlZ29yeS4KKyAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgIC8vLyBEaWZmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgIC8vLyBJdGVyYXRvcidzIHZhbHVlIHR5cGUuCisgIHR5cGVkZWYgdmFsdWVfdHlwZV8gdmFsdWVfdHlwZTsKKworICAvLy8gSXRlcmF0b3IncyBwb2ludGVyIHR5cGUuCisgIHR5cGVkZWYgcG9pbnRlcl8gcG9pbnRlcjsKKworICAvLy8gSXRlcmF0b3IncyBjb25zdCBwb2ludGVyIHR5cGUuCisgIHR5cGVkZWYgY29uc3RfcG9pbnRlcl8gY29uc3RfcG9pbnRlcjsKKworICAvLy8gSXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZS4KKyAgdHlwZWRlZiByZWZlcmVuY2VfIHJlZmVyZW5jZTsKKworICAvLy8gSXRlcmF0b3IncyBjb25zdCByZWZlcmVuY2UgdHlwZS4KKyAgdHlwZWRlZiBjb25zdF9yZWZlcmVuY2VfIGNvbnN0X3JlZmVyZW5jZTsKKworICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgaW5saW5lCisgIGl0ZXJhdG9yXygpCisgIDogY29uc3RfaXRlcmF0b3JfKDAsIFBCX0RTX0dFTl9QT1MoKSwgMCkgeyB9CisKKyAgLy8vIENvbnZlcnNpb24gdG8gYSBwb2ludC10eXBlIGl0ZXJhdG9yLgorICBpbmxpbmUKKyAgb3BlcmF0b3IgcG9pbnRfaXRlcmF0b3JfKCkKKyAgeyByZXR1cm4gcG9pbnRfaXRlcmF0b3JfKGNvbnN0X2Nhc3Q8cG9pbnRlcj4oY29uc3RfaXRlcmF0b3JfOjptX3BfdmFsdWUpKTsgfQorCisgIC8vLyBDb252ZXJzaW9uIHRvIGEgcG9pbnQtdHlwZSBpdGVyYXRvci4KKyAgaW5saW5lCisgIG9wZXJhdG9yIGNvbnN0IHBvaW50X2l0ZXJhdG9yXygpIGNvbnN0CisgIHsgcmV0dXJuIHBvaW50X2l0ZXJhdG9yXyhjb25zdF9jYXN0PHBvaW50ZXI+KGNvbnN0X2l0ZXJhdG9yXzo6bV9wX3ZhbHVlKSk7IH0KKworICAvLy8gQWNjZXNzLgorICBwb2ludGVyCisgIG9wZXJhdG9yLT4oKSBjb25zdAorICB7CisgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV9wX3ZhbHVlICE9IDApOworICAgIHJldHVybiAoY29uc3RfY2FzdDxwb2ludGVyPihiYXNlX3R5cGU6Om1fcF92YWx1ZSkpOworICB9CisKKyAgLy8vIEFjY2Vzcy4KKyAgcmVmZXJlbmNlCisgIG9wZXJhdG9yKigpIGNvbnN0CisgIHsKKyAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjptX3BfdmFsdWUgIT0gMCk7CisgICAgcmV0dXJuIChjb25zdF9jYXN0PHJlZmVyZW5jZT4oKmJhc2VfdHlwZTo6bV9wX3ZhbHVlKSk7CisgIH0KKworICAvLy8gSW5jcmVtZW50cy4KKyAgaXRlcmF0b3JfJgorICBvcGVyYXRvcisrKCkKKyAgeworICAgIGJhc2VfdHlwZTo6bV9wX3RibC0+aW5jX2l0X3N0YXRlKGJhc2VfdHlwZTo6bV9wX3ZhbHVlLCBiYXNlX3R5cGU6Om1fcG9zKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gSW5jcmVtZW50cy4KKyAgaXRlcmF0b3JfCisgIG9wZXJhdG9yKysoaW50KQorICB7CisgICAgaXRlcmF0b3JfIHJldCA9KiB0aGlzOworICAgIGJhc2VfdHlwZTo6bV9wX3RibC0+aW5jX2l0X3N0YXRlKGJhc2VfdHlwZTo6bV9wX3ZhbHVlLCBiYXNlX3R5cGU6Om1fcG9zKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBjb25zdF9pdGVyYXRvcl8gYmFzZV90eXBlOworCisgIC8qKgorICAgKiAgQ29uc3RydWN0b3IgdXNlZCBieSB0aGUgdGFibGUgdG8gaW5pdGlhdGUgdGhlIGdlbmVyYWxpemVkCisgICAqICAgICAgcG9pbnRlciBhbmQgcG9zaXRpb24gKGUuZy4sIHRoaXMgaXMgY2FsbGVkIGZyb20gd2l0aGluIGEgZmluZCgpCisgICAqICAgICAgb2YgYSB0YWJsZS4KKyAgICogKi8KKyAgaW5saW5lCisgIGl0ZXJhdG9yXyhwb2ludGVyIHBfdmFsdWUsIFBCX0RTX0dFTl9QT1MgcG9zLCBQQl9EU19DTEFTU19DX0RFQyogcF90YmwpCisgIDogY29uc3RfaXRlcmF0b3JfKHBfdmFsdWUsIHBvcywgcF90YmwpCisgIHsgfQorCisgIGZyaWVuZCBjbGFzcyBQQl9EU19DTEFTU19DX0RFQzsKK307CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL3BvaW50X2NvbnN0X2l0ZXJhdG9yLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvcG9pbnRfY29uc3RfaXRlcmF0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYjE4M2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL3BvaW50X2NvbnN0X2l0ZXJhdG9yLmhwcApAQCAtMCwwICsxLDEzMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB1bm9yZGVyZWRfaXRlcmF0b3IvcG9pbnRfY29uc3RfaXRlcmF0b3IuaHBwCisgKiBDb250YWlucyBhbiBpdGVyYXRvciBjbGFzcyByZXR1cm5lZCBieSB0aGUgdGFibGVzJyBjb25zdCBmaW5kIGFuZCBpbnNlcnQKKyAqICAgICBtZXRob2RzLgorICovCisKK2NsYXNzIHBvaW50X2l0ZXJhdG9yXzsKKworLy8vIENvbnN0IHBvaW50LXR5cGUgaXRlcmF0b3IuCitjbGFzcyBwb2ludF9jb25zdF9pdGVyYXRvcl8KK3sKK3B1YmxpYzoKKyAgLy8vIENhdGVnb3J5LgorICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgIC8vLyBEaWZmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl9kaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgIC8vLyBJdGVyYXRvcidzIHZhbHVlIHR5cGUuCisgIHR5cGVkZWYgdmFsdWVfdHlwZV8gdmFsdWVfdHlwZTsKKworICAvLy8gSXRlcmF0b3IncyBwb2ludGVyIHR5cGUuCisgIHR5cGVkZWYgcG9pbnRlcl8gcG9pbnRlcjsKKworICAvLy8gSXRlcmF0b3IncyBjb25zdCBwb2ludGVyIHR5cGUuCisgIHR5cGVkZWYgY29uc3RfcG9pbnRlcl8gY29uc3RfcG9pbnRlcjsKKworICAvLy8gSXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZS4KKyAgdHlwZWRlZiByZWZlcmVuY2VfIHJlZmVyZW5jZTsKKworICAvLy8gSXRlcmF0b3IncyBjb25zdCByZWZlcmVuY2UgdHlwZS4KKyAgdHlwZWRlZiBjb25zdF9yZWZlcmVuY2VfIGNvbnN0X3JlZmVyZW5jZTsKKworICBpbmxpbmUKKyAgcG9pbnRfY29uc3RfaXRlcmF0b3JfKGNvbnN0X3BvaW50ZXIgcF92YWx1ZSkgOiBtX3BfdmFsdWUocF92YWx1ZSkKKyAgeyB9CisKKyAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgIGlubGluZQorICBwb2ludF9jb25zdF9pdGVyYXRvcl8oKSA6IG1fcF92YWx1ZSgwKQorICB7IH0KKworICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgaW5saW5lCisgIHBvaW50X2NvbnN0X2l0ZXJhdG9yXyhjb25zdCBwb2ludF9jb25zdF9pdGVyYXRvcl8mIG90aGVyKQorICA6IG1fcF92YWx1ZShvdGhlci5tX3BfdmFsdWUpCisgIHsgfQorCisgIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgorICBpbmxpbmUKKyAgcG9pbnRfY29uc3RfaXRlcmF0b3JfKGNvbnN0IHBvaW50X2l0ZXJhdG9yXyYgb3RoZXIpCisgIDogbV9wX3ZhbHVlKG90aGVyLm1fcF92YWx1ZSkKKyAgeyB9CisKKyAgLy8vIEFjY2Vzcy4KKyAgY29uc3RfcG9pbnRlcgorICBvcGVyYXRvci0+KCkgY29uc3QKKyAgeworICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfdmFsdWUgIT0gMCk7CisgICAgcmV0dXJuIG1fcF92YWx1ZTsKKyAgfQorCisgIC8vLyBBY2Nlc3MuCisgIGNvbnN0X3JlZmVyZW5jZQorICBvcGVyYXRvciooKSBjb25zdAorICB7CisgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF92YWx1ZSAhPSAwKTsKKyAgICByZXR1cm4gKm1fcF92YWx1ZTsKKyAgfQorCisgIC8vLyBDb21wYXJlcyBjb250ZW50IHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgYm9vbAorICBvcGVyYXRvcj09KGNvbnN0IHBvaW50X2l0ZXJhdG9yXyYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIG1fcF92YWx1ZSA9PSBvdGhlci5tX3BfdmFsdWU7IH0KKworICAvLy8gQ29tcGFyZXMgY29udGVudCB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgIGJvb2wKKyAgb3BlcmF0b3I9PShjb25zdCBwb2ludF9jb25zdF9pdGVyYXRvcl8mIG90aGVyKSBjb25zdAorICB7IHJldHVybiBtX3BfdmFsdWUgPT0gb3RoZXIubV9wX3ZhbHVlOyB9CisKKyAgLy8vIENvbXBhcmVzIGNvbnRlbnQgKG5lZ2F0aXZlbHkpIHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgYm9vbAorICBvcGVyYXRvciE9KGNvbnN0IHBvaW50X2l0ZXJhdG9yXyYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIG1fcF92YWx1ZSAhPSBvdGhlci5tX3BfdmFsdWU7IH0KKworICAvLy8gQ29tcGFyZXMgY29udGVudCAobmVnYXRpdmVseSkgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICBib29sCisgIG9wZXJhdG9yIT0oY29uc3QgcG9pbnRfY29uc3RfaXRlcmF0b3JfJiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gbV9wX3ZhbHVlICE9IG90aGVyLm1fcF92YWx1ZTsgfQorCitwcm90ZWN0ZWQ6CisgIGNvbnN0X3BvaW50ZXIgbV9wX3ZhbHVlOworCisgIGZyaWVuZCBjbGFzcyBwb2ludF9pdGVyYXRvcl87CisKKyAgZnJpZW5kIGNsYXNzIFBCX0RTX0NMQVNTX0NfREVDOworfTsKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9wb2ludF9pdGVyYXRvci5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL3BvaW50X2l0ZXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjIzODYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9wb2ludF9pdGVyYXRvci5ocHAKQEAgLTAsMCArMSwxMjYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcG9pbnRfaXRlcmF0b3IuaHBwCisgKiBDb250YWlucyBhbiBpdGVyYXRvciBjbGFzcyByZXR1cm5lZCBieSB0aGUgdGFibGVzJyBmaW5kIGFuZCBpbnNlcnQKKyAqICAgICBtZXRob2RzLgorICovCisKKy8vLyBGaW5kIHR5cGUgaXRlcmF0b3IuCitjbGFzcyBwb2ludF9pdGVyYXRvcl8KK3sKK3B1YmxpYzoKKyAgLy8vIENhdGVnb3J5LgorICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgIC8vLyBEaWZmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl9kaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgIC8vLyBJdGVyYXRvcidzIHZhbHVlIHR5cGUuCisgIHR5cGVkZWYgdmFsdWVfdHlwZV8gdmFsdWVfdHlwZTsKKworICAvLy8gSXRlcmF0b3IncyBwb2ludGVyIHR5cGUuCisgIHR5cGVkZWYgcG9pbnRlcl8gcG9pbnRlcjsKKworICAvLy8gSXRlcmF0b3IncyBjb25zdCBwb2ludGVyIHR5cGUuCisgIHR5cGVkZWYgY29uc3RfcG9pbnRlcl8gY29uc3RfcG9pbnRlcjsKKworICAvLy8gSXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZS4KKyAgdHlwZWRlZiByZWZlcmVuY2VfIHJlZmVyZW5jZTsKKworICAvLy8gSXRlcmF0b3IncyBjb25zdCByZWZlcmVuY2UgdHlwZS4KKyAgdHlwZWRlZiBjb25zdF9yZWZlcmVuY2VfIGNvbnN0X3JlZmVyZW5jZTsKKworICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgaW5saW5lCisgIHBvaW50X2l0ZXJhdG9yXygpCisgIDogbV9wX3ZhbHVlKDApCisgIHsgfQorCisgIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgorICBpbmxpbmUKKyAgcG9pbnRfaXRlcmF0b3JfKGNvbnN0IHBvaW50X2l0ZXJhdG9yXyYgb3RoZXIpCisgIDogbV9wX3ZhbHVlKG90aGVyLm1fcF92YWx1ZSkKKyAgeyB9CisKKyAgLy8vIEFjY2Vzcy4KKyAgcG9pbnRlcgorICBvcGVyYXRvci0+KCkgY29uc3QKKyAgeworICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfdmFsdWUgIT0gMCk7CisgICAgcmV0dXJuIChtX3BfdmFsdWUpOworICB9CisKKyAgLy8vIEFjY2Vzcy4KKyAgcmVmZXJlbmNlCisgIG9wZXJhdG9yKigpIGNvbnN0CisgIHsKKyAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX3ZhbHVlICE9IDApOworICAgIHJldHVybiAoKm1fcF92YWx1ZSk7CisgIH0KKworICAvLy8gQ29tcGFyZXMgY29udGVudCB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgIGJvb2wKKyAgb3BlcmF0b3I9PShjb25zdCBwb2ludF9pdGVyYXRvcl8mIG90aGVyKSBjb25zdAorICB7IHJldHVybiBtX3BfdmFsdWUgPT0gb3RoZXIubV9wX3ZhbHVlOyB9CisKKyAgLy8vIENvbXBhcmVzIGNvbnRlbnQgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICBib29sCisgIG9wZXJhdG9yPT0oY29uc3QgcG9pbnRfY29uc3RfaXRlcmF0b3JfJiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gbV9wX3ZhbHVlID09IG90aGVyLm1fcF92YWx1ZTsgfQorCisgIC8vLyBDb21wYXJlcyBjb250ZW50IHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgYm9vbAorICBvcGVyYXRvciE9KGNvbnN0IHBvaW50X2l0ZXJhdG9yXyYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIG1fcF92YWx1ZSAhPSBvdGhlci5tX3BfdmFsdWU7IH0KKworICAvLy8gQ29tcGFyZXMgY29udGVudCAobmVnYXRpdmVseSkgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICBib29sCisgIG9wZXJhdG9yIT0oY29uc3QgcG9pbnRfY29uc3RfaXRlcmF0b3JfJiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gbV9wX3ZhbHVlICE9IG90aGVyLm1fcF92YWx1ZTsgfQorCisgIGlubGluZQorICBwb2ludF9pdGVyYXRvcl8ocG9pbnRlciBwX3ZhbHVlKSA6IG1fcF92YWx1ZShwX3ZhbHVlKQorICB7IH0KKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgcG9pbnRfY29uc3RfaXRlcmF0b3JfOworCisgIGZyaWVuZCBjbGFzcyBQQl9EU19DTEFTU19DX0RFQzsKKworcHJvdGVjdGVkOgorICBwb2ludGVyIG1fcF92YWx1ZTsKK307CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9leGNlcHRpb24uaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZXhjZXB0aW9uLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmE0MzU3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZXhjZXB0aW9uLmhwcApAQCAtMCwwICsxLDkzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGV4Y2VwdGlvbi5ocHAKKyAqIENvbnRhaW5zIGV4Y2VwdGlvbiBjbGFzc2VzLgorICovCisKKyNpZm5kZWYgUEJfRFNfRVhDRVBUSU9OX0hQUAorI2RlZmluZSBQQl9EU19FWENFUFRJT05fSFBQCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxjc3RkbGliPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICAvKioKKyAgICogIEBkZWZncm91cCBleGNlcHRpb25zLXBiZHMgRXhjZXB0aW9ucworICAgKiAgQGluZ3JvdXAgcGJkcworICAgKiAgQHsKKyAgICovCisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIGV4Y2VwdGlvbnMuCisgIHN0cnVjdCBjb250YWluZXJfZXJyb3IgOiBwdWJsaWMgc3RkOjpsb2dpY19lcnJvcgorICB7CisgICAgY29udGFpbmVyX2Vycm9yKCkKKyAgICA6IHN0ZDo6bG9naWNfZXJyb3IoX19OKCJfX2dudV9wYmRzOjpjb250YWluZXJfZXJyb3IiKSkgeyB9CisgIH07CisKKyAgLy8vIEFuIGVudHJ5IGNhbm5vdCBiZSBpbnNlcnRlZCBpbnRvIGEgY29udGFpbmVyIG9iamVjdCBmb3IgbG9naWNhbAorICAvLy8gcmVhc29ucyAobm90LCBlLmcuLCBpZiBtZW1vcnkgaXMgdW5hYnZhaWxhYmxlLCBpbiB3aGljaCBjYXNlCisgIC8vLyB0aGUgYWxsb2NhdG9yX3R5cGUncyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24pLgorICBzdHJ1Y3QgaW5zZXJ0X2Vycm9yIDogcHVibGljIGNvbnRhaW5lcl9lcnJvciB7IH07CisKKyAgLy8vIEEgam9pbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGxvZ2ljYWwgcmVhc29ucyAoaS5lLiwgdGhlIHJhbmdlcyBvZgorICAvLy8gdGhlIHR3byBjb250YWluZXIgb2JqZWN0cyBiZWluZyBqb2luZWQgb3ZlcmxhcHMuCisgIHN0cnVjdCBqb2luX2Vycm9yIDogcHVibGljIGNvbnRhaW5lcl9lcnJvciB7IH07CisKKyAgLy8vIEEgY29udGFpbmVyIGNhbm5vdCBiZSByZXNpemVkLgorICBzdHJ1Y3QgcmVzaXplX2Vycm9yIDogcHVibGljIGNvbnRhaW5lcl9lcnJvciB7IH07CisKKyAgaW5saW5lIHZvaWQKKyAgX190aHJvd19jb250YWluZXJfZXJyb3IoKQorICB7IF9HTElCQ1hYX1RIUk9XX09SX0FCT1JUKGNvbnRhaW5lcl9lcnJvcigpKTsgfQorCisgIGlubGluZSB2b2lkCisgIF9fdGhyb3dfaW5zZXJ0X2Vycm9yKCkKKyAgeyBfR0xJQkNYWF9USFJPV19PUl9BQk9SVChpbnNlcnRfZXJyb3IoKSk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3Rocm93X2pvaW5fZXJyb3IoKQorICB7IF9HTElCQ1hYX1RIUk9XX09SX0FCT1JUKGpvaW5fZXJyb3IoKSk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3Rocm93X3Jlc2l6ZV9lcnJvcigpCisgIHsgX0dMSUJDWFhfVEhST1dfT1JfQUJPUlQocmVzaXplX2Vycm9yKCkpOyB9CisgIC8vQH0KK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9oYXNoX3BvbGljeS5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9oYXNoX3BvbGljeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhNGQzMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2hhc2hfcG9saWN5LmhwcApAQCAtMCwwICsxLDYxNyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBoYXNoX3BvbGljeS5ocHAKKyAqIENvbnRhaW5zIGhhc2gtcmVsYXRlZCBwb2xpY2llcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0hBU0hfUE9MSUNZX0hQUAorI2RlZmluZSBQQl9EU19IQVNIX1BPTElDWV9IUFAKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZXhjZXB0aW9uLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9tYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmcuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9tb2RfYmFzZWRfcmFuZ2VfaGFzaGluZy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9zaXplX2Jhc2UuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIGxpbmVhcl9wcm9iZV9mbjxTaXplX1R5cGU+CisKKyAgLy8vIEEgcHJvYmUgc2VxdWVuY2UgcG9saWN5IHVzaW5nIGZpeGVkIGluY3JlbWVudHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZSA9IHN0ZDo6c2l6ZV90PgorICBjbGFzcyBsaW5lYXJfcHJvYmVfZm4KKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBTaXplX1R5cGUgc2l6ZV90eXBlOworCisgICAgdm9pZAorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8vIFJldHVybnMgdGhlIGktdGggb2Zmc2V0IGZyb20gdGhlIGhhc2ggdmFsdWUuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIG9wZXJhdG9yKCkoc2l6ZV90eXBlIGkpIGNvbnN0OworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL2xpbmVhcl9wcm9iZV9mbl9pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgcXVhZHJhdGljX3Byb2JlX2ZuPFNpemVfVHlwZT4KKworICAvLy8gQSBwcm9iZSBzZXF1ZW5jZSBwb2xpY3kgdXNpbmcgc3F1YXJlIGluY3JlbWVudHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZSA9IHN0ZDo6c2l6ZV90PgorICBjbGFzcyBxdWFkcmF0aWNfcHJvYmVfZm4KKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBTaXplX1R5cGUgc2l6ZV90eXBlOworCisgICAgdm9pZAorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8vIFJldHVybnMgdGhlIGktdGggb2Zmc2V0IGZyb20gdGhlIGhhc2ggdmFsdWUuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIG9wZXJhdG9yKCkoc2l6ZV90eXBlIGkpIGNvbnN0OworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3F1YWRyYXRpY19wcm9iZV9mbl9pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZzxTaXplX1R5cGU+CisKKyAgLy8vIEEgbWFzayByYW5nZS1oYXNoaW5nIGNsYXNzICh1c2VzIGEgYml0bWFzaykuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZSA9IHN0ZDo6c2l6ZV90PgorICBjbGFzcyBkaXJlY3RfbWFza19yYW5nZV9oYXNoaW5nCisgIDogcHVibGljIGRldGFpbDo6bWFza19iYXNlZF9yYW5nZV9oYXNoaW5nPFNpemVfVHlwZT4KKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgZGV0YWlsOjptYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmc8U2l6ZV9UeXBlPiBtYXNrX2Jhc2VkX2Jhc2U7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU2l6ZV9UeXBlIHNpemVfdHlwZTsKKworICAgIHZvaWQKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgc2l6ZSk7CisKKyAgICAvLy8gVHJhbnNmb3JtcyB0aGUgX19oYXNoIHZhbHVlIGhhc2ggaW50byBhIHJhbmdlZC1oYXNoIHZhbHVlCisgICAgLy8vICh1c2luZyBhIGJpdC1tYXNrKS4KKyAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgb3BlcmF0b3IoKShzaXplX3R5cGUgaGFzaCkgY29uc3Q7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZ19pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgZGlyZWN0X21vZF9yYW5nZV9oYXNoaW5nPFNpemVfVHlwZT4KKworICAvLy8gQSBtb2QgcmFuZ2UtaGFzaGluZyBjbGFzcyAodXNlcyB0aGUgbW9kdWxvIGZ1bmN0aW9uKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlID0gc3RkOjpzaXplX3Q+CisgIGNsYXNzIGRpcmVjdF9tb2RfcmFuZ2VfaGFzaGluZworICA6IHB1YmxpYyBkZXRhaWw6Om1vZF9iYXNlZF9yYW5nZV9oYXNoaW5nPFNpemVfVHlwZT4KKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBTaXplX1R5cGUgc2l6ZV90eXBlOworCisgICAgdm9pZAorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICBwcm90ZWN0ZWQ6CisgICAgdm9pZAorICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBzaXplKTsKKworICAgIC8vLyBUcmFuc2Zvcm1zIHRoZSBfX2hhc2ggdmFsdWUgaGFzaCBpbnRvIGEgcmFuZ2VkLWhhc2ggdmFsdWUKKyAgICAvLy8gKHVzaW5nIGEgbW9kdWxvIG9wZXJhdGlvbikuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIG9wZXJhdG9yKCkoc2l6ZV90eXBlIGhhc2gpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBkZXRhaWw6Om1vZF9iYXNlZF9yYW5nZV9oYXNoaW5nPHNpemVfdHlwZT4gbW9kX2Jhc2VkX2Jhc2U7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vZGlyZWN0X21vZF9yYW5nZV9oYXNoaW5nX2ltcC5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgdGVtcGxhdGU8Ym9vbCBFeHRlcm5hbF9Mb2FkX0FjY2VzcywgdHlwZW5hbWUgU2l6ZV9UeXBlPgorI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXI8RXh0ZXJuYWxfTG9hZF9BY2Nlc3MsIFNpemVfVHlwZT4KKyNkZWZpbmUgUEJfRFNfU0laRV9CQVNFX0NfREVDIGRldGFpbDo6aGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZTxTaXplX1R5cGUsIEV4dGVybmFsX0xvYWRfQWNjZXNzPgorCisgIC8vLyBBIHJlc2l6ZSB0cmlnZ2VyIHBvbGljeSBiYXNlZCBvbiBhIGxvYWQgY2hlY2suIEl0IGtlZXBzIHRoZQorICAvLy8gbG9hZCBmYWN0b3IgYmV0d2VlbiBzb21lIGxvYWQgZmFjdG9ycyBsb2FkX21pbiBhbmQgbG9hZF9tYXguCisgIHRlbXBsYXRlPGJvb2wgRXh0ZXJuYWxfTG9hZF9BY2Nlc3MgPSBmYWxzZSwgdHlwZW5hbWUgU2l6ZV9UeXBlID0gc3RkOjpzaXplX3Q+CisgIGNsYXNzIGhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlciA6IHByaXZhdGUgUEJfRFNfU0laRV9CQVNFX0NfREVDCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU2l6ZV9UeXBlIHNpemVfdHlwZTsKKworICAgIGVudW0KKyAgICAgIHsKKwkvLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGxvYWQgZmFjdG9yIGNhbiBiZSBhY2Nlc3NlZAorCS8vLyBleHRlcm5hbGx5LiBUaGUgdHdvIG9wdGlvbnMgaGF2ZSBkaWZmZXJlbnQgdHJhZGUtb2ZmcyBpbgorCS8vLyB0ZXJtcyBvZiBmbGV4aWJpbGl0eSwgZ2VuZXJpY2l0eSwgYW5kIGVuY2Fwc3VsYXRpb24uCisJZXh0ZXJuYWxfbG9hZF9hY2Nlc3MgPSBFeHRlcm5hbF9Mb2FkX0FjY2VzcworICAgICAgfTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLCBvciBjb25zdHJ1Y3RvciB0YWtpbmcgbG9hZF9taW4gYW5kCisgICAgLy8vIGxvYWRfbWF4IGxvYWQgZmFjdG9ycyBiZXR3ZWVuIHdoaWNoIHRoaXMgcG9saWN5IHdpbGwga2VlcCB0aGUKKyAgICAvLy8gYWN0dWFsIGxvYWQuCisgICAgaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyKGZsb2F0IGxvYWRfbWluID0gMC4xMjUsCisJCQkJICAgZmxvYXQgbG9hZF9tYXggPSAwLjUpOworCisgICAgdm9pZAorICAgIHN3YXAoaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyJiBvdGhlcik7CisKKyAgICB2aXJ0dWFsCisgICAgfmhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcigpOworCisgICAgLy8vIFJldHVybnMgYSBwYWlyIG9mIHRoZSBtaW5pbWFsIGFuZCBtYXhpbWFsIGxvYWRzLCByZXNwZWN0aXZlbHkuCisgICAgaW5saW5lIHN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+CisgICAgZ2V0X2xvYWRzKCkgY29uc3Q7CisKKyAgICAvLy8gU2V0cyB0aGUgbG9hZHMgdGhyb3VnaCBhIHBhaXIgb2YgdGhlIG1pbmltYWwgYW5kIG1heGltYWwKKyAgICAvLy8gbG9hZHMsIHJlc3BlY3RpdmVseS4KKyAgICB2b2lkCisgICAgc2V0X2xvYWRzKHN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IGxvYWRfcGFpcik7CisKKyAgcHJvdGVjdGVkOgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlX3NlYXJjaF9jb2xsaXNpb24oKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhbiBlbGVtZW50IHdhcyBpbnNlcnRlZC4gVGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzCisgICAgLy8vIGluIHRoZSB0YWJsZSBpcyBudW1fZW50cmllcy4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRlZChzaXplX3R5cGUgbnVtX2VudHJpZXMpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2VkKHNpemVfdHlwZSBudW1fZW50cmllcyk7CisKKyAgICAvLy8gTm90aWZpZXMgdGhlIHRhYmxlIHdhcyBjbGVhcmVkLgorICAgIHZvaWQKKyAgICBub3RpZnlfY2xlYXJlZCgpOworCisgICAgLy8vIE5vdGlmaWVzIHRoZSB0YWJsZSB3YXMgcmVzaXplZCBhcyBhIHJlc3VsdCBvZiB0aGlzIG9iamVjdCdzCisgICAgLy8vIHNpZ25pZnlpbmcgdGhhdCBhIHJlc2l6ZSBpcyBuZWVkZWQuCisgICAgdm9pZAorICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSk7CisKKyAgICB2b2lkCisgICAgbm90aWZ5X2V4dGVybmFsbHlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpOworCisgICAgaW5saW5lIGJvb2wKKyAgICBpc19yZXNpemVfbmVlZGVkKCkgY29uc3Q7CisKKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX2dyb3dfbmVlZGVkKHNpemVfdHlwZSBzaXplLCBzaXplX3R5cGUgbnVtX2VudHJpZXMpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgdmlydHVhbCB2b2lkCisgICAgZG9fcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSk7CisKKyAgICB0eXBlZGVmIFBCX0RTX1NJWkVfQkFTRV9DX0RFQyBzaXplX2Jhc2U7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgIHZvaWQKKyAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIGNvbnN0OworI2VuZGlmCisKKyAgICBmbG9hdCAJbV9sb2FkX21pbjsKKyAgICBmbG9hdCAJbV9sb2FkX21heDsKKyAgICBzaXplX3R5cGUgCW1fbmV4dF9zaHJpbmtfc2l6ZTsKKyAgICBzaXplX3R5cGUgCW1fbmV4dF9ncm93X3NpemU7CisgICAgYm9vbCAJbV9yZXNpemVfbmVlZGVkOworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX1NJWkVfQkFTRV9DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIHRlbXBsYXRlPGJvb2wgRXh0ZXJuYWxfTG9hZF9BY2Nlc3MsIHR5cGVuYW1lIFNpemVfVHlwZT4KKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgY2NfaGFzaF9tYXhfY29sbGlzaW9uX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyPEV4dGVybmFsX0xvYWRfQWNjZXNzLCBTaXplX1R5cGU+CisKKyAgLy8vIEEgcmVzaXplIHRyaWdnZXIgcG9saWN5IGJhc2VkIG9uIGNvbGxpc2lvbiBjaGVja3MuIEl0IGtlZXBzIHRoZQorICAvLy8gc2ltdWxhdGVkIGxvYWQgZmFjdG9yIGxvd2VyIHRoYW4gc29tZSBnaXZlbiBsb2FkIGZhY3Rvci4KKyAgdGVtcGxhdGU8Ym9vbCBFeHRlcm5hbF9Mb2FkX0FjY2VzcyA9IGZhbHNlLCB0eXBlbmFtZSBTaXplX1R5cGUgPSBzdGQ6OnNpemVfdD4KKyAgY2xhc3MgY2NfaGFzaF9tYXhfY29sbGlzaW9uX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU2l6ZV9UeXBlIAlzaXplX3R5cGU7CisKKyAgICBlbnVtCisgICAgICB7CisJLy8vIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBsb2FkIGZhY3RvciBjYW4gYmUgYWNjZXNzZWQKKwkvLy8gZXh0ZXJuYWxseS4gVGhlIHR3byBvcHRpb25zIGhhdmUgZGlmZmVyZW50IHRyYWRlLW9mZnMgaW4KKwkvLy8gdGVybXMgb2YgZmxleGliaWxpdHksIGdlbmVyaWNpdHksIGFuZCBlbmNhcHN1bGF0aW9uLgorCWV4dGVybmFsX2xvYWRfYWNjZXNzID0gRXh0ZXJuYWxfTG9hZF9BY2Nlc3MKKyAgICAgIH07CisKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvciwgb3IgY29uc3RydWN0b3IgdGFraW5nIGxvYWQsIGEgX19sb2FkCisgICAgLy8vIGZhY3RvciB3aGljaCBpdCB3aWxsIGF0dGVtcHQgdG8gbWFpbnRhaW4uCisgICAgY2NfaGFzaF9tYXhfY29sbGlzaW9uX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyKGZsb2F0IGxvYWQgPSAwLjUpOworCisgICAgdm9pZAorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBjdXJyZW50IGxvYWQuCisgICAgaW5saW5lIGZsb2F0CisgICAgZ2V0X2xvYWQoKSBjb25zdDsKKworICAgIC8vLyBTZXRzIHRoZSBsb2FkOyBkb2VzIG5vdCByZXNpemUgdGhlIGNvbnRhaW5lci4KKyAgICB2b2lkCisgICAgc2V0X2xvYWQoZmxvYXQgbG9hZCk7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBOb3RpZmllcyBhbiBpbnNlcnQgc2VhcmNoIHN0YXJ0ZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuY291bnRlcmVkIGEgY29sbGlzaW9uLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhIGZpbmQgc2VhcmNoIHN0YXJ0ZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhIHNlYXJjaCBlbmNvdW50ZXJlZCBhIGNvbGxpc2lvbi4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKTsKKworICAgIC8vLyBOb3RpZmllcyBhIHNlYXJjaCBlbmRlZC4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhbiBlcmFzZSBzZWFyY2ggc3RhcnRlZC4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhIHNlYXJjaCBlbmNvdW50ZXJlZCBhIGNvbGxpc2lvbi4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworCisgICAgLy8vIE5vdGlmaWVzIGFuIGVsZW1lbnQgd2FzIGluc2VydGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydGVkKHNpemVfdHlwZSBudW1fZW50cmllcyk7CisKKyAgICAvLy8gTm90aWZpZXMgYW4gZWxlbWVudCB3YXMgZXJhc2VkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlZChzaXplX3R5cGUgbnVtX2VudHJpZXMpOworCisgICAgLy8vIE5vdGlmaWVzIHRoZSB0YWJsZSB3YXMgY2xlYXJlZC4KKyAgICB2b2lkCisgICAgbm90aWZ5X2NsZWFyZWQoKTsKKworICAgIC8vLyBOb3RpZmllcyB0aGUgdGFibGUgd2FzIHJlc2l6ZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBvYmplY3QncworICAgIC8vLyBzaWduaWZ5aW5nIHRoYXQgYSByZXNpemUgaXMgbmVlZGVkLgorICAgIHZvaWQKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpOworCisgICAgLy8vIE5vdGlmaWVzIHRoZSB0YWJsZSB3YXMgcmVzaXplZCBleHRlcm5hbGx5LgorICAgIHZvaWQKKyAgICBub3RpZnlfZXh0ZXJuYWxseV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSk7CisKKyAgICAvLy8gUXVlcmllcyB3aGV0aGVyIGEgcmVzaXplIGlzIG5lZWRlZC4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX3Jlc2l6ZV9uZWVkZWQoKSBjb25zdDsKKworICAgIC8vLyBRdWVyaWVzIHdoZXRoZXIgYSBncm93IGlzIG5lZWRlZC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9ubHkKKyAgICAvLy8gaWYgdGhpcyBvYmplY3QgaW5kaWNhdGVkIGlzIG5lZWRlZC4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX2dyb3dfbmVlZGVkKHNpemVfdHlwZSBzaXplLCBzaXplX3R5cGUgbnVtX2VudHJpZXMpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgdm9pZAorICAgIGNhbGNfbWF4X251bV9jb2xsKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIGNhbGNfcmVzaXplX25lZWRlZCgpOworCisgICAgZmxvYXQgCW1fbG9hZDsKKyAgICBzaXplX3R5cGUgCW1fc2l6ZTsKKyAgICBzaXplX3R5cGUgCW1fbnVtX2NvbDsKKyAgICBzaXplX3R5cGUgCW1fbWF4X2NvbDsKKyAgICBib29sIAltX3Jlc2l6ZV9uZWVkZWQ7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvY2NfaGFzaF9tYXhfY29sbGlzaW9uX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX2ltcC5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlPgorI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBoYXNoX2V4cG9uZW50aWFsX3NpemVfcG9saWN5PFNpemVfVHlwZT4KKworICAvLy8gQSBzaXplIHBvbGljeSB3aG9zZSBzZXF1ZW5jZSBvZiBzaXplcyBmb3JtIGFuIGV4cG9uZW50aWFsCisgIC8vLyBzZXF1ZW5jZSAodHlwaWNhbGx5IHBvd2VycyBvZiAyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGUgPSBzdGQ6OnNpemVfdD4KKyAgY2xhc3MgaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeQorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNpemVfVHlwZSBzaXplX3R5cGU7CisKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvciwgb3Igb25zdHJ1Y3RvciB0YWtpbmcgYSBzdGFydF9zaXplLCBvcgorICAgIC8vLyBjb25zdHJ1Y3RvciB0YWtpbmcgYSBzdGFydCBzaXplIGFuZCBncm93X2ZhY3Rvci4gVGhlIHBvbGljeQorICAgIC8vLyB3aWxsIHVzZSB0aGUgc2VxdWVuY2Ugb2Ygc2l6ZXMgc3RhcnRfc2l6ZSwgc3RhcnRfc2l6ZSoKKyAgICAvLy8gZ3Jvd19mYWN0b3IsIHN0YXJ0X3NpemUqIGdyb3dfZmFjdG9yXjIsIC4uLgorICAgIGhhc2hfZXhwb25lbnRpYWxfc2l6ZV9wb2xpY3koc2l6ZV90eXBlIHN0YXJ0X3NpemUgPSA4LAorCQkJCSBzaXplX3R5cGUgZ3Jvd19mYWN0b3IgPSAyKTsKKworICAgIHZvaWQKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgcHJvdGVjdGVkOgorICAgIHNpemVfdHlwZQorICAgIGdldF9uZWFyZXN0X2xhcmdlcl9zaXplKHNpemVfdHlwZSBzaXplKSBjb25zdDsKKworICAgIHNpemVfdHlwZQorICAgIGdldF9uZWFyZXN0X3NtYWxsZXJfc2l6ZShzaXplX3R5cGUgc2l6ZSkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBzaXplX3R5cGUgbV9zdGFydF9zaXplOworICAgIHNpemVfdHlwZSBtX2dyb3dfZmFjdG9yOworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfZXhwb25lbnRpYWxfc2l6ZV9wb2xpY3lfaW1wLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBoYXNoX3ByaW1lX3NpemVfcG9saWN5CisKKyAgLy8vIEEgc2l6ZSBwb2xpY3kgd2hvc2Ugc2VxdWVuY2Ugb2Ygc2l6ZXMgZm9ybSBhIG5lYXJseS1leHBvbmVudGlhbAorICAvLy8gc2VxdWVuY2Ugb2YgcHJpbWVzLgorICBjbGFzcyBoYXNoX3ByaW1lX3NpemVfcG9saWN5CisgIHsKKyAgcHVibGljOgorICAgIC8vLyBTaXplIHR5cGUuCisgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCBzaXplX3R5cGU7CisKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvciwgb3Igb25zdHJ1Y3RvciB0YWtpbmcgYSBzdGFydF9zaXplIFRoZQorICAgIC8vLyBwb2xpY3kgd2lsbCB1c2UgdGhlIHNlcXVlbmNlIG9mIHNpemVzIGFwcHJveGltYXRlbHkKKyAgICAvLy8gc3RhcnRfc2l6ZSwgc3RhcnRfc2l6ZSogMiwgc3RhcnRfc2l6ZSogMl4yLCAuLi4KKyAgICBoYXNoX3ByaW1lX3NpemVfcG9saWN5KHNpemVfdHlwZSBzdGFydF9zaXplID0gOCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICBwcm90ZWN0ZWQ6CisgICAgc2l6ZV90eXBlCisgICAgZ2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoc2l6ZV90eXBlIHNpemUpIGNvbnN0OworCisgICAgc2l6ZV90eXBlCisgICAgZ2V0X25lYXJlc3Rfc21hbGxlcl9zaXplKHNpemVfdHlwZSBzaXplKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHNpemVfdHlwZSBtX3N0YXJ0X3NpemU7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9wcmltZV9zaXplX3BvbGljeV9pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfUG9saWN5LCB0eXBlbmFtZSBUcmlnZ2VyX1BvbGljeSwgYm9vbCBFeHRlcm5hbF9TaXplX0FjY2VzcywgdHlwZW5hbWUgU2l6ZV9UeXBlPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIGhhc2hfc3RhbmRhcmRfcmVzaXplX3BvbGljeTxTaXplX1BvbGljeSwgVHJpZ2dlcl9Qb2xpY3ksIEV4dGVybmFsX1NpemVfQWNjZXNzLCBTaXplX1R5cGU+CisKKyAgLy8vIEEgcmVzaXplIHBvbGljeSB3aGljaCBkZWxlZ2F0ZXMgb3BlcmF0aW9ucyB0byBzaXplIGFuZCB0cmlnZ2VyIHBvbGljaWVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1BvbGljeSA9IGhhc2hfZXhwb25lbnRpYWxfc2l6ZV9wb2xpY3k8PiwKKwkgICB0eXBlbmFtZSBUcmlnZ2VyX1BvbGljeSA9IGhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcjw+LAorCSAgIGJvb2wgRXh0ZXJuYWxfU2l6ZV9BY2Nlc3MgPSBmYWxzZSwKKwkgICB0eXBlbmFtZSBTaXplX1R5cGUgPSBzdGQ6OnNpemVfdD4KKyAgY2xhc3MgaGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5CisgIDogcHVibGljIFNpemVfUG9saWN5LCBwdWJsaWMgVHJpZ2dlcl9Qb2xpY3kKKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBTaXplX1R5cGUgCQlzaXplX3R5cGU7CisgICAgdHlwZWRlZiBUcmlnZ2VyX1BvbGljeSAJdHJpZ2dlcl9wb2xpY3k7CisgICAgdHlwZWRlZiBTaXplX1BvbGljeSAJc2l6ZV9wb2xpY3k7CisKKyAgICBlbnVtCisgICAgICB7CisJZXh0ZXJuYWxfc2l6ZV9hY2Nlc3MgPSBFeHRlcm5hbF9TaXplX0FjY2VzcworICAgICAgfTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIGhhc2hfc3RhbmRhcmRfcmVzaXplX3BvbGljeSgpOworCisgICAgLy8vIGNvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljaWVzIHJfc2l6ZV9wb2xpY3kgd2lsbCBiZSBjb3BpZWQKKyAgICAvLy8gYnkgdGhlIFNpemVfUG9saWN5IG9iamVjdCBvZiB0aGlzIG9iamVjdC4KKyAgICBoYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3koY29uc3QgU2l6ZV9Qb2xpY3kmIHJfc2l6ZV9wb2xpY3kpOworCisgICAgLy8vIGNvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljaWVzLiByX3NpemVfcG9saWN5IHdpbGwgYmUKKyAgICAvLy8gY29waWVkIGJ5IHRoZSBTaXplX1BvbGljeSBvYmplY3Qgb2YgdGhpcworICAgIC8vLyBvYmplY3QuIHJfdHJpZ2dlcl9wb2xpY3kgd2lsbCBiZSBjb3BpZWQgYnkgdGhlIFRyaWdnZXJfUG9saWN5CisgICAgLy8vIG9iamVjdCBvZiB0aGlzIG9iamVjdC4KKyAgICBoYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3koY29uc3QgU2l6ZV9Qb2xpY3kmIHJfc2l6ZV9wb2xpY3ksCisJCQkJY29uc3QgVHJpZ2dlcl9Qb2xpY3kmIHJfdHJpZ2dlcl9wb2xpY3kpOworCisgICAgdmlydHVhbAorICAgIH5oYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3koKTsKKworICAgIGlubGluZSB2b2lkCisgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgLy8vIEFjY2VzcyB0byB0aGUgU2l6ZV9Qb2xpY3kgb2JqZWN0IHVzZWQuCisgICAgU2l6ZV9Qb2xpY3kmCisgICAgZ2V0X3NpemVfcG9saWN5KCk7CisKKyAgICAvLy8gQ29uc3QgYWNjZXNzIHRvIHRoZSBTaXplX1BvbGljeSBvYmplY3QgdXNlZC4KKyAgICBjb25zdCBTaXplX1BvbGljeSYKKyAgICBnZXRfc2l6ZV9wb2xpY3koKSBjb25zdDsKKworICAgIC8vLyBBY2Nlc3MgdG8gdGhlIFRyaWdnZXJfUG9saWN5IG9iamVjdCB1c2VkLgorICAgIFRyaWdnZXJfUG9saWN5JgorICAgIGdldF90cmlnZ2VyX3BvbGljeSgpOworCisgICAgLy8vIEFjY2VzcyB0byB0aGUgVHJpZ2dlcl9Qb2xpY3kgb2JqZWN0IHVzZWQuCisgICAgY29uc3QgVHJpZ2dlcl9Qb2xpY3kmCisgICAgZ2V0X3RyaWdnZXJfcG9saWN5KCkgY29uc3Q7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbnRhaW5lci4KKyAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgZ2V0X2FjdHVhbF9zaXplKCkgY29uc3Q7CisKKyAgICAvLy8gUmVzaXplcyB0aGUgY29udGFpbmVyIHRvIHN1Z2dlc3RlZF9uZXdfc2l6ZSwgYSBzdWdnZXN0ZWQgc2l6ZQorICAgIC8vLyAodGhlIGFjdHVhbCBzaXplIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgU2l6ZV9Qb2xpY3kKKyAgICAvLy8gb2JqZWN0KS4KKyAgICB2b2lkCisgICAgcmVzaXplKHNpemVfdHlwZSBzdWdnZXN0ZWRfbmV3X3NpemUpOworCisgIHByb3RlY3RlZDoKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRlZChzaXplX3R5cGUgbnVtX2UpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2VkKHNpemVfdHlwZSBudW1fZSk7CisKKyAgICB2b2lkCisgICAgbm90aWZ5X2NsZWFyZWQoKTsKKworICAgIHZvaWQKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpOworCisgICAgaW5saW5lIGJvb2wKKyAgICBpc19yZXNpemVfbmVlZGVkKCkgY29uc3Q7CisKKyAgICAvLy8gUXVlcmllcyB3aGF0IHRoZSBuZXcgc2l6ZSBzaG91bGQgYmUsIHdoZW4gdGhlIGNvbnRhaW5lciBpcworICAgIC8vLyByZXNpemVkIG5hdHVyYWxseS4gVGhlIGN1cnJlbnQgX19zaXplIG9mIHRoZSBjb250YWluZXIgaXMKKyAgICAvLy8gc2l6ZSwgYW5kIHRoZSBudW1iZXIgb2YgdXNlZCBlbnRyaWVzIHdpdGhpbiB0aGUgY29udGFpbmVyIGlzCisgICAgLy8vIG51bV91c2VkX2UuCisgICAgc2l6ZV90eXBlCisgICAgZ2V0X25ld19zaXplKHNpemVfdHlwZSBzaXplLCBzaXplX3R5cGUgbnVtX3VzZWRfZSkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gUmVzaXplcyB0byBuZXdfc2l6ZS4KKyAgICB2aXJ0dWFsIHZvaWQKKyAgICBkb19yZXNpemUoc2l6ZV90eXBlIG5ld19zaXplKTsKKworICAgIHR5cGVkZWYgVHJpZ2dlcl9Qb2xpY3kgdHJpZ2dlcl9wb2xpY3lfYmFzZTsKKworICAgIHR5cGVkZWYgU2l6ZV9Qb2xpY3kgc2l6ZV9wb2xpY3lfYmFzZTsKKworICAgIHNpemVfdHlwZSBtX3NpemU7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5X2ltcC5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9saXN0X3VwZGF0ZV9wb2xpY3kuaHBwIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvbGlzdF91cGRhdGVfcG9saWN5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTVlZDcxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvbGlzdF91cGRhdGVfcG9saWN5LmhwcApAQCAtMCwwICsxLDEzMCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsaXN0X3VwZGF0ZV9wb2xpY3kuaHBwCisgKiBDb250YWlucyBwb2xpY2llcyBmb3IgbGlzdCB1cGRhdGUgY29udGFpbmVycy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0xVX1BPTElDWV9IUFAKKyNkZWZpbmUgUEJfRFNfTFVfUE9MSUNZX0hQUAorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfcG9saWN5L2x1X2NvdW50ZXJfbWV0YWRhdGEuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgLyoqCisgICAqICBBIGxpc3QtdXBkYXRlIHBvbGljeSB0aGF0IHVuY29uZGl0aW9uYWxseSBtb3ZlcyBlbGVtZW50cyB0byB0aGUKKyAgICogIGZyb250IG9mIHRoZSBsaXN0LiBBIG51bGwgdHlwZSBtZWFucyB0aGF0IGVhY2ggbGluayBpbiBhCisgICAqICBsaXN0LWJhc2VkIGNvbnRhaW5lciBkb2VzIG5vdCBhY3R1YWxseSBuZWVkIG1ldGFkYXRhLgorICAgKi8KKyB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgICBjbGFzcyBsdV9tb3ZlX3RvX2Zyb250X3BvbGljeQorICAgeworICAgcHVibGljOgorICAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCWFsbG9jYXRvcl90eXBlOworCisgICAgIC8vLyBNZXRhZGF0YSBvbiB3aGljaCB0aGlzIGZ1bmN0b3Igb3BlcmF0ZXMuCisgICAgIHR5cGVkZWYgbnVsbF90eXBlIAkJCQkJbWV0YWRhdGFfdHlwZTsKKworICAgcHJpdmF0ZToKKyAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxtZXRhZGF0YV90eXBlPiBfX3JlYmluZF9tOworCisgICBwdWJsaWM6CisgICAgIC8vLyBSZWZlcmVuY2UgdG8gbWV0YWRhdGEgb24gd2hpY2ggdGhpcyBmdW5jdG9yIG9wZXJhdGVzLgorICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX206Om90aGVyOjpyZWZlcmVuY2UgCW1ldGFkYXRhX3JlZmVyZW5jZTsKKworICAgICAvLy8gQ3JlYXRlcyBhIG1ldGFkYXRhIG9iamVjdC4KKyAgICAgbWV0YWRhdGFfdHlwZQorICAgICBvcGVyYXRvcigpKCkgY29uc3QKKyAgICAgeyByZXR1cm4gc19tZXRhZGF0YTsgfQorCisgICAgIC8vLyBEZWNpZGVzIHdoZXRoZXIgYSBtZXRhZGF0YSBvYmplY3Qgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBmcm9udAorICAgICAvLy8gb2YgdGhlIGxpc3QuCisgICAgIGlubGluZSBib29sCisgICAgIG9wZXJhdG9yKCkobWV0YWRhdGFfcmVmZXJlbmNlIHJfbWV0YWRhdGEpIGNvbnN0CisgICAgIHsgcmV0dXJuIHRydWU7IH0KKworICAgcHJpdmF0ZToKKyAgICAgc3RhdGljIG51bGxfdHlwZSAJCQkJCXNfbWV0YWRhdGE7CisgICB9OworCisgIC8qKgorICAgKiAgQSBsaXN0LXVwZGF0ZSBwb2xpY3kgdGhhdCBtb3ZlcyBlbGVtZW50cyB0byB0aGUgZnJvbnQgb2YgdGhlCisgICAqICBsaXN0IGJhc2VkIG9uIHRoZSBjb3VudGVyIGFsZ29yaXRobS4KKyAgICovCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IE1heF9Db3VudCA9IDUsIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgICBjbGFzcyBsdV9jb3VudGVyX3BvbGljeQorICAgIDogcHJpdmF0ZSBkZXRhaWw6Omx1X2NvdW50ZXJfcG9saWN5X2Jhc2U8dHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGU+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0FsbG9jIAkJCQkJYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpzaXplX3R5cGUgICAgICAgCXNpemVfdHlwZTsKKworICAgICAgZW51bQorCXsKKwkgIC8vLyBXaGVuIHNvbWUgZWxlbWVudCBpcyBhY2Nlc3NlZCB0aGlzIG51bWJlciBvZiB0aW1lcywgaXQKKwkgIC8vLyB3aWxsIGJlIG1vdmVkIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdC4KKwkgIG1heF9jb3VudCA9IE1heF9Db3VudAorCX07CisKKyAgICAgIC8vLyBNZXRhZGF0YSBvbiB3aGljaCB0aGlzIGZ1bmN0b3Igb3BlcmF0ZXMuCisgICAgICB0eXBlZGVmIGRldGFpbDo6bHVfY291bnRlcl9tZXRhZGF0YTxzaXplX3R5cGU+IAltZXRhZGF0YV90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgZGV0YWlsOjpsdV9jb3VudGVyX3BvbGljeV9iYXNlPHNpemVfdHlwZT4gCWJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8bWV0YWRhdGFfdHlwZT4gX19yZWJpbmRfbTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBSZWZlcmVuY2UgdG8gbWV0YWRhdGEgb24gd2hpY2ggdGhpcyBmdW5jdG9yIG9wZXJhdGVzLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tOjpvdGhlcjo6cmVmZXJlbmNlIAltZXRhZGF0YV9yZWZlcmVuY2U7CisKKyAgICAgIC8vLyBDcmVhdGVzIGEgbWV0YWRhdGEgb2JqZWN0LgorICAgICAgbWV0YWRhdGFfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpIGNvbnN0CisgICAgICB7IHJldHVybiBiYXNlX3R5cGU6Om9wZXJhdG9yKCkobWF4X2NvdW50KTsgfQorCisgICAgICAvLy8gRGVjaWRlcyB3aGV0aGVyIGEgbWV0YWRhdGEgb2JqZWN0IHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgZnJvbnQKKyAgICAgIC8vLyBvZiB0aGUgbGlzdC4KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkobWV0YWRhdGFfcmVmZXJlbmNlIHJfZGF0YSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGJhc2VfdHlwZTo6b3BlcmF0b3IoKShyX2RhdGEsIG1heF9jb3VudCk7IH0KKyAgICB9OworfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL3ByaW9yaXR5X3F1ZXVlLmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL3ByaW9yaXR5X3F1ZXVlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzU4NzRhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvcHJpb3JpdHlfcXVldWUuaHBwCkBAIC0wLDAgKzEsMTU3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHByaW9yaXR5X3F1ZXVlLmhwcAorICogQ29udGFpbnMgcHJpb3JpdHlfcXVldWVzLgorICovCisKKyNpZm5kZWYgUEJfRFNfUFJJT1JJVFlfUVVFVUVfSFBQCisjZGVmaW5lIFBCX0RTX1BSSU9SSVRZX1FVRVVFX0hQUAorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wcmlvcml0eV9xdWV1ZV9iYXNlX2Rpc3BhdGNoLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3N0YW5kYXJkX3BvbGljaWVzLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgLyoqCisgICAqICBAZGVmZ3JvdXAgaGVhcC1iYXNlZCBIZWFwLUJhc2VkCisgICAqICBAaW5ncm91cCBjb250YWluZXJzLXBiZHMKKyAgICogIEB7CisgICAqLworCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIGhlYXAtZGV0YWlsIEJhc2UgYW5kIFBvbGljeSBDbGFzc2VzCisgICAqICBAaW5ncm91cCBoZWFwLWJhc2VkCisgICAqLworCisgIC8qKgorICAgKiAgQSBwcmlvcml0eSBxdWV1ZSBjb21wb3NlZCBvZiBvbmUgc3BlY2lmaWMgaGVhcCBwb2xpY3kuCisgICAqCisgICAqICBAdHBhcmFtIF9UdiAJICAgIAlWYWx1ZSB0eXBlLgorICAgKiAgQHRwYXJhbSBDbXBfRm4JICAgIAlDb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAdHBhcmFtIFRhZyAJICAgIAlJbnN0YW50aWF0aW5nIGRhdGEgc3RydWN0dXJlIHR5cGUsCisgICAqCQkJICAgIAlzZWUgY29udGFpbmVyX3RhZy4KKyAgICogIEB0cGFyYW0gX0FsbG9jIAkgICAgCUFsbG9jYXRvciB0eXBlLgorICAgKgorICAgKiAgQmFzZSBpcyBkaXNwYXRjaGVkIGF0IGNvbXBpbGUgdGltZSB2aWEgVGFnLCBmcm9tIHRoZSBmb2xsb3dpbmcKKyAgICogIGNob2ljZXM6IGJpbmFyeV9oZWFwX3RhZywgYmlub21pYWxfaGVhcF90YWcsIHBhaXJpbmdfaGVhcF90YWcsCisgICAqICAgICAgICAgICByY19iaW5vbWlhbF9oZWFwX3RhZywgdGhpbl9oZWFwX3RhZworICAgKgorICAgKiAgQmFzZSBjaG9pY2VzIGFyZTogZGV0YWlsOjpiaW5hcnlfaGVhcCwgZGV0YWlsOjpiaW5vbWlhbF9oZWFwLAorICAgKiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOjpwYWlyaW5nX2hlYXAsIGRldGFpbDo6cmNfYmlub21pYWxfaGVhcCwKKyAgICogICAgICAgICAgICAgICAgICAgIGRldGFpbDo6dGhpbl9oZWFwLgorICAgKi8KKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UdiwKKwkgICB0eXBlbmFtZSBDbXBfRm4gPSBzdGQ6Omxlc3M8X1R2PiwKKwkgICB0eXBlbmFtZSBUYWcgPSBwYWlyaW5nX2hlYXBfdGFnLAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgY2xhc3MgcHJpb3JpdHlfcXVldWUKKyAgOiBwdWJsaWMgZGV0YWlsOjpjb250YWluZXJfYmFzZV9kaXNwYXRjaDxfVHYsIENtcF9GbiwgX0FsbG9jLCBUYWc+Ojp0eXBlCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX1R2IAkJCQkJdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIENtcF9GbiAJCQkJCWNtcF9mbjsKKyAgICB0eXBlZGVmIFRhZyAJCQkJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCWFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpkaWZmZXJlbmNlX3R5cGUgCWRpZmZlcmVuY2VfdHlwZTsKKworICBwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgZGV0YWlsOjpjb250YWluZXJfYmFzZV9kaXNwYXRjaDxfVHYsIENtcF9GbiwgX0FsbG9jLAorCQkJCQkJICAgICBUYWc+Ojp0eXBlCisgCQkJCQkJCWJhc2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9Udj4gICAJX19yZWJpbmRfdjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3Y6Om90aGVyCQkJX19yZWJpbmRfdmE7CisKKyBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92YTo6cmVmZXJlbmNlIAkJcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OnBvaW50ZXIgCSAgIAlwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfaXRlcmF0b3IgCQlwb2ludF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfY29uc3RfaXRlcmF0b3IgCXBvaW50X2NvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjppdGVyYXRvciAJCWl0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciAJCWNvbnN0X2l0ZXJhdG9yOworCisgICAgcHJpb3JpdHlfcXVldWUoKSB7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgc29tZSBwb2xpY3kgb2JqZWN0cy4gcl9jbXBfZm4gd2lsbCBiZQorICAgIC8vLyBjb3BpZWQgYnkgdGhlIENtcF9GbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgcHJpb3JpdHlfcXVldWUoY29uc3QgY21wX2ZuJiByX2NtcF9mbikgOiBiYXNlX3R5cGUocl9jbXBfZm4pIHsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzLiBUaGUKKyAgICAvLy8gdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQgbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8KKyAgICAvLy8gdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgcHJpb3JpdHlfcXVldWUoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQpCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdF9pdCwgbGFzdF9pdCk7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcyBhbmQKKyAgICAvLy8gc29tZSBwb2xpY3kgb2JqZWN0cyBUaGUgdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQKKyAgICAvLy8gbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBvYmplY3QuIHJfY21wX2ZuCisgICAgLy8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBjbXBfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIHByaW9yaXR5X3F1ZXVlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0LCBjb25zdCBjbXBfZm4mIHJfY21wX2ZuKQorICAgIDogYmFzZV90eXBlKHJfY21wX2ZuKQorICAgIHsgYmFzZV90eXBlOjpjb3B5X2Zyb21fcmFuZ2UoZmlyc3RfaXQsIGxhc3RfaXQpOyB9CisKKyAgICBwcmlvcml0eV9xdWV1ZShjb25zdCBwcmlvcml0eV9xdWV1ZSYgb3RoZXIpCisgICAgOiBiYXNlX3R5cGUoKGNvbnN0IGJhc2VfdHlwZSYgKW90aGVyKSB7IH0KKworICAgIHZpcnR1YWwKKyAgICB+cHJpb3JpdHlfcXVldWUoKSB7IH0KKworICAgIHByaW9yaXR5X3F1ZXVlJgorICAgIG9wZXJhdG9yPShjb25zdCBwcmlvcml0eV9xdWV1ZSYgb3RoZXIpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0gJm90aGVyKQorCXsKKwkgIHByaW9yaXR5X3F1ZXVlIHRtcChvdGhlcik7CisJICBzd2FwKHRtcCk7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQKKyAgICBzd2FwKHByaW9yaXR5X3F1ZXVlJiBvdGhlcikKKyAgICB7IGJhc2VfdHlwZTo6c3dhcChvdGhlcik7IH0KKyAgfTsKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKyAvL0B9IGhlYXAtYmFzZWQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGJkYTk1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHAKQEAgLTAsMCArMSw0NTQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdGFnX2FuZF90cmFpdC5ocHAKKyAqIENvbnRhaW5zIHRhZ3MgYW5kIHRyYWl0cywgZS5nLiwgb25lcyBkZXNjcmliaW5nIHVuZGVybHlpbmcKKyAqIGRhdGEgc3RydWN0dXJlcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1RBR19BTkRfVFJBSVRfSFBQCisjZGVmaW5lIFBCX0RTX1RBR19BTkRfVFJBSVRfSFBQCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisKKy8qKgorICogQG5hbWVzcGFjZSBfX2dudV9wYmRzCisgKiBAYnJpZWYgR05VIGV4dGVuc2lvbnMgZm9yIHBvbGljeS1iYXNlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHB1YmxpYyB1c2UuCisgKi8KK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8qKiBAZGVmZ3JvdXAgcGJkcyBQb2xpY3ktQmFzZWQgRGF0YSBTdHJ1Y3R1cmVzCisgICAqICBAaW5ncm91cCBleHRlbnNpb25zCisgICAqCisgICAqICBUaGlzIGlzIGEgbGlicmFyeSBvZiBwb2xpY3ktYmFzZWQgZWxlbWVudGFyeSBkYXRhIHN0cnVjdHVyZXM6CisgICAqICBhc3NvY2lhdGl2ZSBjb250YWluZXJzIGFuZCBwcmlvcml0eSBxdWV1ZXMuIEl0IGlzIGRlc2lnbmVkIGZvcgorICAgKiAgaGlnaC1wZXJmb3JtYW5jZSwgZmxleGliaWxpdHksIHNlbWFudGljIHNhZmV0eSwgYW5kIGNvbmZvcm1hbmNlCisgICAqICB0byB0aGUgY29ycmVzcG9uZGluZyBjb250YWluZXJzIGluIHN0ZCAoZXhjZXB0IGZvciBzb21lIHBvaW50cworICAgKiAgd2hlcmUgaXQgZGlmZmVycyBieSBkZXNpZ24pLgorICAgKgorICAgKiAgRm9yIGRldGFpbHMsIHNlZToKKyAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9leHQvcGJfZHMvaW5kZXguaHRtbAorICAgKgorICAgKiAgQHsKKyAgICovCisKKyAgLyoqCisgICAqICBAZGVmZ3JvdXAgdGFncyBUYWdzCisgICAqICBAeyAgIAorICAgKi8KKyAgLy8vIEEgdHJpdmlhbCBpdGVyYXRvciB0YWcuIFNpZ25pZmllcyB0aGF0IHRoZSBpdGVyYXRvcnMgaGFzIG5vbmUgb2YKKyAgLy8vIHN0ZDo6aXRlcmF0b3JzJ3MgbW92ZW1lbnQgYWJpbGl0aWVzLgorICBzdHJ1Y3QgdHJpdmlhbF9pdGVyYXRvcl90YWcKKyAgeyB9OworCisgIC8vLyBQcm9oaWJpdCBtb3ZpbmcgdHJpdmlhbCBpdGVyYXRvcnMuCisgIHR5cGVkZWYgdm9pZCB0cml2aWFsX2l0ZXJhdG9yX2RpZmZlcmVuY2VfdHlwZTsKKworCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIGludmFsaWRhdGlvbl90YWdzICBJbnZhbGlkYXRpb24gR3VhcmFudGVlcworICAgKiAgQGluZ3JvdXAgdGFncworICAgKiAgQHsKKyAgICovCisKKyAgLyoqCisgICAqICBTaWduaWZpZXMgYSBiYXNpYyBpbnZhbGlkYXRpb24gZ3VhcmFudGVlIHRoYXQgYW55IGl0ZXJhdG9yLAorICAgKiAgcG9pbnRlciwgb3IgcmVmZXJlbmNlIHRvIGEgY29udGFpbmVyIG9iamVjdCdzIG1hcHBlZCB2YWx1ZSB0eXBlCisgICAqICBpcyB2YWxpZCBhcyBsb25nIGFzIHRoZSBjb250YWluZXIgaXMgbm90IG1vZGlmaWVkLgorICAgKi8KKyAgc3RydWN0IGJhc2ljX2ludmFsaWRhdGlvbl9ndWFyYW50ZWUKKyAgeyB9OworCisgIC8qKgorICAgKiAgU2lnbmlmaWVzIGFuIGludmFsaWRhdGlvbiBndWFyYW50ZWUgdGhhdCBpbmNsdWRlcyBhbGwgdGhvc2Ugb2YKKyAgICogIGl0cyBiYXNlLCBhbmQgYWRkaXRpb25hbGx5LCB0aGF0IGFueSBwb2ludC10eXBlIGl0ZXJhdG9yLAorICAgKiAgcG9pbnRlciwgb3IgcmVmZXJlbmNlIHRvIGEgY29udGFpbmVyIG9iamVjdCdzIG1hcHBlZCB2YWx1ZSB0eXBlCisgICAqICBpcyB2YWxpZCBhcyBsb25nIGFzIGl0cyBjb3JyZXNwb25kaW5nIGVudHJ5IGhhcyBub3QgYmUgZXJhc2VkLAorICAgKiAgcmVnYXJkbGVzcyBvZiBtb2RpZmljYXRpb25zIHRvIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgKi8KKyAgc3RydWN0IHBvaW50X2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgOiBwdWJsaWMgYmFzaWNfaW52YWxpZGF0aW9uX2d1YXJhbnRlZQorICB7IH07CisKKyAgLyoqCisgICAqICBTaWduaWZpZXMgYW4gaW52YWxpZGF0aW9uIGd1YXJhbnRlZSB0aGF0IGluY2x1ZGVzIGFsbCB0aG9zZSBvZgorICAgKiAgaXRzIGJhc2UsIGFuZCBhZGRpdGlvbmFsbHksIHRoYXQgYW55IHJhbmdlLXR5cGUgaXRlcmF0b3IKKyAgICogIChpbmNsdWRpbmcgdGhlIHJldHVybnMgb2YgYmVnaW4oKSBhbmQgZW5kKCkpIGlzIGluIHRoZSBjb3JyZWN0CisgICAqICByZWxhdGl2ZSBwb3NpdGlvbnMgdG8gb3RoZXIgcmFuZ2UtdHlwZSBpdGVyYXRvcnMgYXMgbG9uZyBhcyBpdHMKKyAgICogIGNvcnJlc3BvbmRpbmcgZW50cnkgaGFzIG5vdCBiZSBlcmFzZWQsIHJlZ2FyZGxlc3Mgb2YKKyAgICogIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAqLworICBzdHJ1Y3QgcmFuZ2VfaW52YWxpZGF0aW9uX2d1YXJhbnRlZSA6IHB1YmxpYyBwb2ludF9pbnZhbGlkYXRpb25fZ3VhcmFudGVlCisgIHsgfTsKKyAgLy9AfQorCisKKyAgLyoqCisgICAqICBAZGVmZ3JvdXAgZHNfdGFncyBEYXRhIFN0cnVjdHVyZSBUeXBlCisgICAqICBAaW5ncm91cCB0YWdzCisgICAqICBAeworICAgKi8KKyAgLy8vIEJhc2UgZGF0YSBzdHJ1Y3R1cmUgdGFnLgorICBzdHJ1Y3QgY29udGFpbmVyX3RhZworICB7IH07CisKKyAgLy8vIEJhc2ljIHNlcXVlbmNlLgorICBzdHJ1Y3Qgc2VxdWVuY2VfdGFnIDogcHVibGljIGNvbnRhaW5lcl90YWcgeyB9OworCisgIC8vLyBCYXNpYyBzdHJpbmcgY29udGFpbmVyLCBpbmNsdXNpdmUgb2Ygc3RyaW5ncywgcm9wZXMsIGV0Yy4KKyAgc3RydWN0IHN0cmluZ190YWcgOiBwdWJsaWMgc2VxdWVuY2VfdGFnIHsgfTsKKworICAvLy8gQmFzaWMgYXNzb2NpYXRpdmUtY29udGFpbmVyLgorICBzdHJ1Y3QgYXNzb2NpYXRpdmVfdGFnIDogcHVibGljIGNvbnRhaW5lcl90YWcgeyB9OworCisgIC8vLyBCYXNpYyBoYXNoIHN0cnVjdHVyZS4KKyAgc3RydWN0IGJhc2ljX2hhc2hfdGFnIDogcHVibGljIGFzc29jaWF0aXZlX3RhZyB7IH07CisKKyAgLy8vIENvbGxpc2lvbi1jaGFpbmluZyBoYXNoLgorICBzdHJ1Y3QgY2NfaGFzaF90YWcgOiBwdWJsaWMgYmFzaWNfaGFzaF90YWcgeyB9OworCisgIC8vLyBHZW5lcmFsLXByb2JpbmcgaGFzaC4KKyAgc3RydWN0IGdwX2hhc2hfdGFnIDogcHVibGljIGJhc2ljX2hhc2hfdGFnIHsgfTsKKworICAvLy8gQmFzaWMgYnJhbmNoIHN0cnVjdHVyZS4KKyAgc3RydWN0IGJhc2ljX2JyYW5jaF90YWcgOiBwdWJsaWMgYXNzb2NpYXRpdmVfdGFnIHsgfTsKKworICAvLy8gQmFzaWMgdHJlZSBzdHJ1Y3R1cmUuCisgIHN0cnVjdCB0cmVlX3RhZyA6IHB1YmxpYyBiYXNpY19icmFuY2hfdGFnIHsgfTsKKworICAvLy8gUmVkLWJsYWNrIHRyZWUuCisgIHN0cnVjdCByYl90cmVlX3RhZyA6IHB1YmxpYyB0cmVlX3RhZyB7IH07CisKKyAgLy8vIFNwbGF5IHRyZWUuCisgIHN0cnVjdCBzcGxheV90cmVlX3RhZyA6IHB1YmxpYyB0cmVlX3RhZyB7IH07CisKKyAgLy8vIE9yZGVyZWQtdmVjdG9yIHRyZWUuCisgIHN0cnVjdCBvdl90cmVlX3RhZyA6IHB1YmxpYyB0cmVlX3RhZyB7IH07CisKKyAgLy8vIEJhc2ljIHRyaWUgc3RydWN0dXJlLgorICBzdHJ1Y3QgdHJpZV90YWcgOiBwdWJsaWMgYmFzaWNfYnJhbmNoX3RhZyB7IH07CisKKyAgLy8vIFBBVFJJQ0lBIHRyaWUuCisgIHN0cnVjdCBwYXRfdHJpZV90YWcgOiBwdWJsaWMgdHJpZV90YWcgeyB9OworCisgIC8vLyBMaXN0LXVwZGF0ZS4KKyAgc3RydWN0IGxpc3RfdXBkYXRlX3RhZyA6IHB1YmxpYyBhc3NvY2lhdGl2ZV90YWcgeyB9OworCisgIC8vLyBCYXNpYyBwcmlvcml0eS1xdWV1ZS4KKyAgc3RydWN0IHByaW9yaXR5X3F1ZXVlX3RhZyA6IHB1YmxpYyBjb250YWluZXJfdGFnIHsgfTsKKworICAvLy8gUGFpcmluZy1oZWFwLgorICBzdHJ1Y3QgcGFpcmluZ19oZWFwX3RhZyA6IHB1YmxpYyBwcmlvcml0eV9xdWV1ZV90YWcgeyB9OworCisgIC8vLyBCaW5vbWlhbC1oZWFwLgorICBzdHJ1Y3QgYmlub21pYWxfaGVhcF90YWcgOiBwdWJsaWMgcHJpb3JpdHlfcXVldWVfdGFnIHsgfTsKKworICAvLy8gUmVkdW5kYW50LWNvdW50ZXIgYmlub21pYWwtaGVhcC4KKyAgc3RydWN0IHJjX2Jpbm9taWFsX2hlYXBfdGFnIDogcHVibGljIHByaW9yaXR5X3F1ZXVlX3RhZyB7IH07CisKKyAgLy8vIEJpbmFyeS1oZWFwIChhcnJheS1iYXNlZCkuCisgIHN0cnVjdCBiaW5hcnlfaGVhcF90YWcgOiBwdWJsaWMgcHJpb3JpdHlfcXVldWVfdGFnIHsgfTsKKworICAvLy8gVGhpbiBoZWFwLgorICBzdHJ1Y3QgdGhpbl9oZWFwX3RhZyA6IHB1YmxpYyBwcmlvcml0eV9xdWV1ZV90YWcgeyB9OworICAvL0B9CisgIC8vQH0KKworCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIHRyYWl0cyBUcmFpdHMKKyAgICogIEB7CisgICAqLworCisgIC8qKgorICAgKiAgQGJyaWVmIFJlcHJlc2VudHMgbm8gdHlwZSwgb3IgYWJzZW5jZSBvZiB0eXBlLCBmb3IgdGVtcGxhdGUgdHJpY2tzLgorICAgKgorICAgKiAgSW4gYSBtYXBwZWQtcG9saWN5LCBpbmRpY2F0ZXMgdGhhdCBhbiBhc3NvY2lhdGl2ZSBjb250YWluZXIgaXMgYSBzZXQuCisgICAqCisgICAqICBJbiBhIGxpc3QtdXBkYXRlIHBvbGljeSwgaW5kaWNhdGVzIHRoYXQgZWFjaCBsaW5rIGRvZXMgbm90IG5lZWQKKyAgICogIG1ldGFkYXRhLgorICAgKgorICAgKiAgSW4gYSBoYXNoIHBvbGljeSwgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbWJpbmluZyBoYXNoIGZ1bmN0aW9uCisgICAqICBpcyBhY3R1YWxseSBhIHJhbmdlZCBoYXNoIGZ1bmN0aW9uLgorICAgKgorICAgKiAgSW4gYSBwcm9iZSBwb2xpY3ksIGluZGljYXRlcyB0aGF0IHRoZSBjb21iaW5pbmcgcHJvYmUgZnVuY3Rpb24KKyAgICogIGlzIGFjdHVhbGx5IGEgcmFuZ2VkIHByb2JlIGZ1bmN0aW9uLgorICAgKi8KKyAgc3RydWN0IG51bGxfdHlwZSB7IH07CisKKyAgLy8vIEEgbnVsbCBub2RlIHVwZGF0b3IsIGluZGljYXRpbmcgdGhhdCBubyBub2RlIHVwZGF0ZXMgYXJlIHJlcXVpcmVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyLCB0eXBlbmFtZSBfVHAzLCB0eXBlbmFtZSBfVHA0PgorICAgIHN0cnVjdCBudWxsX25vZGVfdXBkYXRlIDogcHVibGljIG51bGxfdHlwZQorICAgIHsgfTsKKworCisgIC8vLyBQcmltYXJ5IHRlbXBsYXRlLCBjb250YWluZXIgdHJhaXRzIGJhc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UYWc+CisgICAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHNfYmFzZTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24sIGNjIGhhc2guCisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHNfYmFzZTxjY19oYXNoX3RhZz4KKyAgeworICAgIHR5cGVkZWYgY2NfaGFzaF90YWcgCQkJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHBvaW50X2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgCQlpbnZhbGlkYXRpb25fZ3VhcmFudGVlOworCisgICAgZW51bQorICAgICAgeworCW9yZGVyX3ByZXNlcnZpbmcgPSBmYWxzZSwKKwllcmFzZV9jYW5fdGhyb3cgPSBmYWxzZSwKKwlzcGxpdF9qb2luX2Nhbl90aHJvdyA9IGZhbHNlLAorCXJldmVyc2VfaXRlcmF0aW9uID0gZmFsc2UKKyAgICAgIH07CisgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLCBncCBoYXNoLgorICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8Z3BfaGFzaF90YWc+CisgIHsKKyAgICB0eXBlZGVmIGdwX2hhc2hfdGFnIAkJCQljb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBiYXNpY19pbnZhbGlkYXRpb25fZ3VhcmFudGVlIAkJaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKwlvcmRlcl9wcmVzZXJ2aW5nID0gZmFsc2UsCisJZXJhc2VfY2FuX3Rocm93ID0gZmFsc2UsCisJc3BsaXRfam9pbl9jYW5fdGhyb3cgPSBmYWxzZSwKKwlyZXZlcnNlX2l0ZXJhdGlvbiA9IGZhbHNlCisgICAgICB9OworICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiwgcmIgdHJlZS4KKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgY29udGFpbmVyX3RyYWl0c19iYXNlPHJiX3RyZWVfdGFnPgorICB7CisgICAgdHlwZWRlZiByYl90cmVlX3RhZyAJCQkJY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgcmFuZ2VfaW52YWxpZGF0aW9uX2d1YXJhbnRlZSAJCWludmFsaWRhdGlvbl9ndWFyYW50ZWU7CisKKyAgICBlbnVtCisgICAgICB7CisJb3JkZXJfcHJlc2VydmluZyA9IHRydWUsCisJZXJhc2VfY2FuX3Rocm93ID0gZmFsc2UsCisJc3BsaXRfam9pbl9jYW5fdGhyb3cgPSBmYWxzZSwKKwlyZXZlcnNlX2l0ZXJhdGlvbiA9IHRydWUKKyAgICAgIH07CisgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLCBzcGxheSB0cmVlLgorICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8c3BsYXlfdHJlZV90YWc+CisgIHsKKyAgICB0eXBlZGVmIHNwbGF5X3RyZWVfdGFnIAkJCQljb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiByYW5nZV9pbnZhbGlkYXRpb25fZ3VhcmFudGVlIAkJaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKwlvcmRlcl9wcmVzZXJ2aW5nID0gdHJ1ZSwKKwllcmFzZV9jYW5fdGhyb3cgPSBmYWxzZSwKKwlzcGxpdF9qb2luX2Nhbl90aHJvdyA9IGZhbHNlLAorCXJldmVyc2VfaXRlcmF0aW9uID0gdHJ1ZQorICAgICAgfTsKKyAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24sIG92IHRyZWUuCisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHNfYmFzZTxvdl90cmVlX3RhZz4KKyAgeworICAgIHR5cGVkZWYgb3ZfdHJlZV90YWcgCQkJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIGJhc2ljX2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgCQlpbnZhbGlkYXRpb25fZ3VhcmFudGVlOworCisgICAgZW51bQorICAgICAgeworCW9yZGVyX3ByZXNlcnZpbmcgPSB0cnVlLAorCWVyYXNlX2Nhbl90aHJvdyA9IHRydWUsCisJc3BsaXRfam9pbl9jYW5fdGhyb3cgPSB0cnVlLAorCXJldmVyc2VfaXRlcmF0aW9uID0gZmFsc2UKKyAgICAgIH07CisgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLCBwYXQgdHJpZS4KKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgY29udGFpbmVyX3RyYWl0c19iYXNlPHBhdF90cmllX3RhZz4KKyAgeworICAgIHR5cGVkZWYgcGF0X3RyaWVfdGFnIAkJCQljb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiByYW5nZV9pbnZhbGlkYXRpb25fZ3VhcmFudGVlIAkJaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKwlvcmRlcl9wcmVzZXJ2aW5nID0gdHJ1ZSwKKwllcmFzZV9jYW5fdGhyb3cgPSBmYWxzZSwKKwlzcGxpdF9qb2luX2Nhbl90aHJvdyA9IHRydWUsCisJcmV2ZXJzZV9pdGVyYXRpb24gPSB0cnVlCisgICAgICB9OworICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiwgbGlzdCB1cGRhdGUuCisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHNfYmFzZTxsaXN0X3VwZGF0ZV90YWc+CisgIHsKKyAgICB0eXBlZGVmIGxpc3RfdXBkYXRlX3RhZyAJCQkJY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgcG9pbnRfaW52YWxpZGF0aW9uX2d1YXJhbnRlZSAJCWludmFsaWRhdGlvbl9ndWFyYW50ZWU7CisKKyAgICBlbnVtCisgICAgICB7CisJb3JkZXJfcHJlc2VydmluZyA9IGZhbHNlLAorCWVyYXNlX2Nhbl90aHJvdyA9IGZhbHNlLAorCXNwbGl0X2pvaW5fY2FuX3Rocm93ID0gZmFsc2UsCisJcmV2ZXJzZV9pdGVyYXRpb24gPSBmYWxzZQorICAgICAgfTsKKyAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24sIHBhaXJpbmcgaGVhcC4KKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgY29udGFpbmVyX3RyYWl0c19iYXNlPHBhaXJpbmdfaGVhcF90YWc+CisgIHsKKyAgICB0eXBlZGVmIHBhaXJpbmdfaGVhcF90YWcgCQkJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHBvaW50X2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgCQlpbnZhbGlkYXRpb25fZ3VhcmFudGVlOworCisgICAgZW51bQorICAgICAgeworCW9yZGVyX3ByZXNlcnZpbmcgPSBmYWxzZSwKKwllcmFzZV9jYW5fdGhyb3cgPSBmYWxzZSwKKwlzcGxpdF9qb2luX2Nhbl90aHJvdyA9IGZhbHNlLAorCXJldmVyc2VfaXRlcmF0aW9uID0gZmFsc2UKKyAgICAgIH07CisgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLCB0aGluIGhlYXAuCisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHNfYmFzZTx0aGluX2hlYXBfdGFnPgorICB7CisgICAgdHlwZWRlZiB0aGluX2hlYXBfdGFnIAkJCQljb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBwb2ludF9pbnZhbGlkYXRpb25fZ3VhcmFudGVlIAkJaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKwlvcmRlcl9wcmVzZXJ2aW5nID0gZmFsc2UsCisJZXJhc2VfY2FuX3Rocm93ID0gZmFsc2UsCisJc3BsaXRfam9pbl9jYW5fdGhyb3cgPSBmYWxzZSwKKwlyZXZlcnNlX2l0ZXJhdGlvbiA9IGZhbHNlCisgICAgICB9OworICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiwgYmlub21pYWwgaGVhcC4KKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgY29udGFpbmVyX3RyYWl0c19iYXNlPGJpbm9taWFsX2hlYXBfdGFnPgorICB7CisgICAgdHlwZWRlZiBiaW5vbWlhbF9oZWFwX3RhZyAJCQkJY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgcG9pbnRfaW52YWxpZGF0aW9uX2d1YXJhbnRlZSAJCWludmFsaWRhdGlvbl9ndWFyYW50ZWU7CisKKyAgICBlbnVtCisgICAgICB7CisJb3JkZXJfcHJlc2VydmluZyA9IGZhbHNlLAorCWVyYXNlX2Nhbl90aHJvdyA9IGZhbHNlLAorCXNwbGl0X2pvaW5fY2FuX3Rocm93ID0gZmFsc2UsCisJcmV2ZXJzZV9pdGVyYXRpb24gPSBmYWxzZQorICAgICAgfTsKKyAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24sIHJjIGJpbm9taWFsIGhlYXAuCisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHNfYmFzZTxyY19iaW5vbWlhbF9oZWFwX3RhZz4KKyAgeworICAgIHR5cGVkZWYgcmNfYmlub21pYWxfaGVhcF90YWcgCQkJY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgcG9pbnRfaW52YWxpZGF0aW9uX2d1YXJhbnRlZSAJCWludmFsaWRhdGlvbl9ndWFyYW50ZWU7CisKKyAgICBlbnVtCisgICAgICB7CisJb3JkZXJfcHJlc2VydmluZyA9IGZhbHNlLAorCWVyYXNlX2Nhbl90aHJvdyA9IGZhbHNlLAorCXNwbGl0X2pvaW5fY2FuX3Rocm93ID0gZmFsc2UsCisJcmV2ZXJzZV9pdGVyYXRpb24gPSBmYWxzZQorICAgICAgfTsKKyAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24sIGJpbmFyeSBoZWFwLgorICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8YmluYXJ5X2hlYXBfdGFnPgorICB7CisgICAgdHlwZWRlZiBiaW5hcnlfaGVhcF90YWcgCQkJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIGJhc2ljX2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgCQlpbnZhbGlkYXRpb25fZ3VhcmFudGVlOworCisgICAgZW51bQorICAgICAgeworCW9yZGVyX3ByZXNlcnZpbmcgPSBmYWxzZSwKKwllcmFzZV9jYW5fdGhyb3cgPSBmYWxzZSwKKwlzcGxpdF9qb2luX2Nhbl90aHJvdyA9IHRydWUsCisJcmV2ZXJzZV9pdGVyYXRpb24gPSBmYWxzZQorICAgICAgfTsKKyAgfTsKKworCisgIC8vLyBDb250YWluZXIgdHJhaXRzLgorICAvLyBTZWUgTWF0dCBBdXN0ZXJuIGZvciB0aGUgbmFtZSwgUy4gTWV5ZXJzIE1FRkMrKyAjMiwgb3RoZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBDbnRucj4KKyAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHMKKyAgOiBwdWJsaWMgY29udGFpbmVyX3RyYWl0c19iYXNlPHR5cGVuYW1lIENudG5yOjpjb250YWluZXJfY2F0ZWdvcnk+CisgIHsKKyAgICB0eXBlZGVmIENudG5yIAkJCQkgICAgICAgY29udGFpbmVyX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBDbnRucjo6Y29udGFpbmVyX2NhdGVnb3J5ICAgICAgICAgY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgY29udGFpbmVyX3RyYWl0c19iYXNlPGNvbnRhaW5lcl9jYXRlZ29yeT4gIGJhc2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aW52YWxpZGF0aW9uX2d1YXJhbnRlZSBpbnZhbGlkYXRpb25fZ3VhcmFudGVlOworCisgICAgZW51bQorICAgICAgeworCS8vLyBUcnVlIG9ubHkgaWYgQ250bnIgb2JqZWN0cyBndWFyYW50ZWUgc3RvcmluZyAga2V5cyBieSBvcmRlci4KKwlvcmRlcl9wcmVzZXJ2aW5nID0gYmFzZV90eXBlOjpvcmRlcl9wcmVzZXJ2aW5nLAorCisJLy8vIFRydWUgb25seSBpZiBlcmFzaW5nIGEga2V5IGNhbiB0aHJvdy4KKwllcmFzZV9jYW5fdGhyb3cgPSBiYXNlX3R5cGU6OmVyYXNlX2Nhbl90aHJvdywKKworCS8vLyBUcnVlIG9ubHkgaWYgc3BsaXQgb3Igam9pbiBvcGVyYXRpb25zIGNhbiB0aHJvdy4KKwlzcGxpdF9qb2luX2Nhbl90aHJvdyA9IGJhc2VfdHlwZTo6c3BsaXRfam9pbl9jYW5fdGhyb3csCisKKwkvLy8gVHJ1ZSBvbmx5IHJldmVyc2UgaXRlcmF0b3JzIGFyZSBzdXBwb3J0ZWQuCisJcmV2ZXJzZV9pdGVyYXRpb24gPSBiYXNlX3R5cGU6OnJldmVyc2VfaXRlcmF0aW9uCisgICAgICB9OworICB9OworICAvL0B9CisKKworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gRGlzcGF0Y2ggbWVjaGFuaXNtLCBwcmltYXJ5IHRlbXBsYXRlIGZvciBhc3NvY2lhdGl2ZSB0eXBlcy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBUYWcsCisJICAgICB0eXBlbmFtZSBQb2xpY3lfVGwgPSBudWxsX3R5cGU+CisgICAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g7CisgIH0gLy8gbmFtZXNwYWNlIF9fZGV0YWlsCisgIC8vQH0KK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy90cmVlX3BvbGljeS5ocHAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy90cmVlX3BvbGljeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxNTEzZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcApAQCAtMCwwICsxLDE1NyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmVlX3BvbGljeS5ocHAKKyAqIENvbnRhaW5zIHRyZWUtcmVsYXRlZCBwb2xpY2llcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1RSRUVfUE9MSUNZX0hQUAorI2RlZmluZSBQQl9EU19UUkVFX1BPTElDWV9IUFAKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JyYW5jaF9wb2xpY3kvYnJhbmNoX3BvbGljeS5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLCB0eXBlbmFtZSBOb2RlX0l0ciwgdHlwZW5hbWUgQ21wX0ZuLCBcCisJICAgdHlwZW5hbWUgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPE5vZGVfQ0l0ciwgTm9kZV9JdHIsIENtcF9GbiwgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX0JSQU5DSF9QT0xJQ1lfQkFTRSBcCisgIGRldGFpbDo6YnJhbmNoX3BvbGljeTxOb2RlX0NJdHIsIE5vZGVfSXRyLCBfQWxsb2M+CisKKyAgLy8vIEZ1bmN0b3IgdXBkYXRpbmcgcmFua3Mgb2YgZW50cmVlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLCB0eXBlbmFtZSBOb2RlX0l0ciwgCisJICAgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisgIGNsYXNzIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZSA6IHByaXZhdGUgUEJfRFNfQlJBTkNIX1BPTElDWV9CQVNFCisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIFBCX0RTX0JSQU5DSF9QT0xJQ1lfQkFTRSAJCSAgICAgICAJYmFzZV90eXBlOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIENtcF9GbiAJCQkJCWNtcF9mbjsKKyAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCWFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X3R5cGUgCQlrZXlfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X2NvbnN0X3JlZmVyZW5jZSAJa2V5X2NvbnN0X3JlZmVyZW5jZTsKKworICAgIHR5cGVkZWYgc2l6ZV90eXBlIAkJCQkJbWV0YWRhdGFfdHlwZTsKKyAgICB0eXBlZGVmIE5vZGVfQ0l0ciAJICAgICAgIAkJCW5vZGVfY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBOb2RlX0l0ciAJCQkJCW5vZGVfaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2NvbnN0X2l0ZXJhdG9yOjp2YWx1ZV90eXBlIAljb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIG5vZGVfaXRlcmF0b3I6OnZhbHVlX3R5cGUgCQlpdGVyYXRvcjsKKworICAgIC8vLyBGaW5kcyBhbiBlbnRyeSBieSBfX29yZGVyLiBSZXR1cm5zIGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlCisgICAgLy8vIGVudHJ5IHdpdGggdGhlIF9fb3JkZXIgb3JkZXIsIG9yIGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlCisgICAgLy8vIGNvbnRhaW5lciBvYmplY3QncyBlbmQgaWYgb3JkZXIgaXMgYXQgbGVhc3QgdGhlIHNpemUgb2YgdGhlCisgICAgLy8vIGNvbnRhaW5lciBvYmplY3QuCisgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgZmluZF9ieV9vcmRlcihzaXplX3R5cGUpIGNvbnN0OworCisgICAgLy8vIEZpbmRzIGFuIGVudHJ5IGJ5IF9fb3JkZXIuIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVudHJ5CisgICAgLy8vIHdpdGggdGhlIF9fb3JkZXIgb3JkZXIsIG9yIGFuIGl0ZXJhdG9yIHRvIHRoZSBjb250YWluZXIKKyAgICAvLy8gb2JqZWN0J3MgZW5kIGlmIG9yZGVyIGlzIGF0IGxlYXN0IHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIKKyAgICAvLy8gb2JqZWN0LgorICAgIGlubGluZSBpdGVyYXRvcgorICAgIGZpbmRfYnlfb3JkZXIoc2l6ZV90eXBlKTsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBvcmRlciBvZiBhIGtleSB3aXRoaW4gYSBzZXF1ZW5jZS4gRm9yIGV4YXBtbGUsIGlmCisgICAgLy8vIHJfa2V5IGlzIHRoZSBzbWFsbGVzdCBrZXksIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDA7IGlmIHJfa2V5CisgICAgLy8vIGlzIGEga2V5IGJldHdlZW4gdGhlIHNtYWxsZXN0IGFuZCBuZXh0IGtleSwgdGhpcyBtZXRob2Qgd2lsbAorICAgIC8vLyByZXR1cm4gMTsgaWYgcl9rZXkgaXMgYSBrZXkgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3Qga2V5LCB0aGlzCisgICAgLy8vIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2l6ZSBvZiByX2MuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIG9yZGVyX29mX2tleShrZXlfY29uc3RfcmVmZXJlbmNlKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIC8vLyBDb25zdCByZWZlcmVuY2UgdG8gdGhlIGNvbnRhaW5lcidzIHZhbHVlLXR5cGUuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworCisgICAgLy8vIENvbnN0IHBvaW50ZXIgdG8gdGhlIGNvbnRhaW5lcidzIHZhbHVlLXR5cGUuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3BvaW50ZXIgCQljb25zdF9wb2ludGVyOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxtZXRhZGF0YV90eXBlPjo6b3RoZXIgX19yZWJpbmRfbTsKKworICAgIC8vLyBDb25zdCBtZXRhZGF0YSByZWZlcmVuY2UuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tOjpjb25zdF9yZWZlcmVuY2UgICAgICAgbWV0YWRhdGFfY29uc3RfcmVmZXJlbmNlOworCisgICAgLy8vIE1ldGFkYXRhIHJlZmVyZW5jZS4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX206OnJlZmVyZW5jZSAJCW1ldGFkYXRhX3JlZmVyZW5jZTsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBub2RlX2NvbnN0X2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJlZSdzIHJvb3Qgbm9kZS4KKyAgICB2aXJ0dWFsIG5vZGVfY29uc3RfaXRlcmF0b3IKKyAgICBub2RlX2JlZ2luKCkgY29uc3QgPSAwOworCisgICAgLy8vIFJldHVybnMgdGhlIG5vZGVfaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmVlJ3Mgcm9vdCBub2RlLgorICAgIHZpcnR1YWwgbm9kZV9pdGVyYXRvcgorICAgIG5vZGVfYmVnaW4oKSA9IDA7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbm9kZV9jb25zdF9pdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggYSBqdXN0LWFmdGVyIGxlYWYgbm9kZS4KKyAgICB2aXJ0dWFsIG5vZGVfY29uc3RfaXRlcmF0b3IKKyAgICBub2RlX2VuZCgpIGNvbnN0ID0gMDsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBub2RlX2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCBhIGp1c3QtYWZ0ZXIgbGVhZiBub2RlLgorICAgIHZpcnR1YWwgbm9kZV9pdGVyYXRvcgorICAgIG5vZGVfZW5kKCkgPSAwOworCisgICAgLy8vIEFjY2VzcyB0byB0aGUgY21wX2ZuIG9iamVjdC4KKyAgICB2aXJ0dWFsIGNtcF9mbiYgCisgICAgZ2V0X2NtcF9mbigpID0gMDsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8vIFVwZGF0ZXMgdGhlIHJhbmsgb2YgYSBub2RlIHRocm91Z2ggYSBub2RlX2l0ZXJhdG9yIG5vZGVfaXQ7CisgICAgLy8vIGVuZF9uZF9pdCBpcyB0aGUgZW5kIG5vZGUgaXRlcmF0b3IuCisgICAgaW5saW5lIHZvaWQKKyAgICBvcGVyYXRvcigpKG5vZGVfaXRlcmF0b3IsIG5vZGVfY29uc3RfaXRlcmF0b3IpIGNvbnN0OworCisgICAgdmlydHVhbAorICAgIH50cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGUoKTsKKyAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHJlZV9wb2xpY3kvb3JkZXJfc3RhdGlzdGljc19pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0JSQU5DSF9QT0xJQ1lfQkFTRQorCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL3RyaWVfcG9saWN5LmhwcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL3RyaWVfcG9saWN5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjBhZTBjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvdHJpZV9wb2xpY3kuaHBwCkBAIC0wLDAgKzEsMzYwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRyaWVfcG9saWN5LmhwcAorICogQ29udGFpbnMgdHJpZS1yZWxhdGVkIHBvbGljaWVzLgorICovCisKKyNpZm5kZWYgUEJfRFNfVFJJRV9QT0xJQ1lfSFBQCisjZGVmaW5lIFBCX0RTX1RSSUVfUE9MSUNZX0hQUAorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3RyaWVfcG9saWN5X2Jhc2UuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmluZywgdHlwZW5hbWUgU3RyaW5nOjp2YWx1ZV90eXBlIE1pbl9FX1ZhbCwgXAorCSAgIHR5cGVuYW1lIFN0cmluZzo6dmFsdWVfdHlwZSBNYXhfRV9WYWwsIGJvb2wgUmV2ZXJzZSwgXAorCSAgIHR5cGVuYW1lIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgIHRyaWVfc3RyaW5nX2FjY2Vzc190cmFpdHM8U3RyaW5nLCBNaW5fRV9WYWwsTWF4X0VfVmFsLFJldmVyc2UsX0FsbG9jPgorCisgIC8qKgorICAgKiAgRWxlbWVudCBhY2Nlc3MgdHJhaXRzIGZvciBzdHJpbmcgdHlwZXMuCisgICAqCisgICAqICBAdHBhcmFtIFN0cmluZyAJICAgIAlTdHJpbmcgdHlwZS4KKyAgICogIEB0cGFyYW0gTWluX0VfVmFsICAgICAgICAJTWluaW1hbCBlbGVtZW50IHZhbHVlLgorICAgKiAgQHRwYXJhbSBNYXhfRV9WYWwJICAgIAlNYXhpbXVtIGVsZW1lbnQgdmFsdWUuCisgICAqICBAdHBhcmFtIFJldmVyc2UJICAgICAgICBSZXZlcnNlIGl0ZXJhdGlvbiBzaG91bGQgYmUgdXNlZC4KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogZmFsc2UuCisgICAqICBAdHBhcmFtIF9BbGxvYyAJICAgIAlBbGxvY2F0b3IgdHlwZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmluZyA9IHN0ZDo6c3RyaW5nLAorCSAgIHR5cGVuYW1lIFN0cmluZzo6dmFsdWVfdHlwZSBNaW5fRV9WYWwgPSBkZXRhaWw6Ol9fbnVtZXJpY190cmFpdHM8dHlwZW5hbWUgU3RyaW5nOjp2YWx1ZV90eXBlPjo6X19taW4sCisJICAgdHlwZW5hbWUgU3RyaW5nOjp2YWx1ZV90eXBlIE1heF9FX1ZhbCA9IGRldGFpbDo6X19udW1lcmljX3RyYWl0czx0eXBlbmFtZSBTdHJpbmc6OnZhbHVlX3R5cGU+OjpfX21heCwKKwkgICBib29sIFJldmVyc2UgPSBmYWxzZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgIHN0cnVjdCB0cmllX3N0cmluZ19hY2Nlc3NfdHJhaXRzCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUJCQkgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIFN0cmluZyAJCQkJCSAga2V5X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxrZXlfdHlwZT4JICBfX3JlYmluZF9rOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfazo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZSAgIGtleV9jb25zdF9yZWZlcmVuY2U7CisKKyAgICBlbnVtCisgICAgICB7CisJcmV2ZXJzZSA9IFJldmVyc2UKKyAgICAgIH07CisKKyAgICAvLy8gRWxlbWVudCBjb25zdCBpdGVyYXRvciB0eXBlLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgZGV0YWlsOjpfX2NvbmRpdGlvbmFsX3R5cGU8UmV2ZXJzZSwgXAorCQkgICAgICAgdHlwZW5hbWUgU3RyaW5nOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yLCBcCisJCSAgICAgICB0eXBlbmFtZSBTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPjo6X190eXBlIGNvbnN0X2l0ZXJhdG9yOworCisgICAgLy8vIEVsZW1lbnQgdHlwZS4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPGNvbnN0X2l0ZXJhdG9yPjo6dmFsdWVfdHlwZSBlX3R5cGU7CisKKyAgICBlbnVtCisgICAgICB7CisJbWluX2VfdmFsID0gTWluX0VfVmFsLAorCW1heF9lX3ZhbCA9IE1heF9FX1ZhbCwKKwltYXhfc2l6ZSA9IG1heF9lX3ZhbCAtIG1pbl9lX3ZhbCArIDEKKyAgICAgIH07CisgICAgUEJfRFNfU1RBVElDX0FTU0VSVChtaW5fbWF4X3NpemUsIG1heF9zaXplID49IDIpOworCisgICAgLy8vIFJldHVybnMgYSBjb25zdF9pdGVyYXRvciB0byB0aGUgZmlyc3QgZWxlbWVudCBvZgorICAgIC8vLyBrZXlfY29uc3RfcmVmZXJlbmNlIGFndW1uZXQuCisgICAgaW5saW5lIHN0YXRpYyBjb25zdF9pdGVyYXRvcgorICAgIGJlZ2luKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgLy8vIFJldHVybnMgYSBjb25zdF9pdGVyYXRvciB0byB0aGUgYWZ0ZXItbGFzdCBlbGVtZW50IG9mCisgICAgLy8vIGtleV9jb25zdF9yZWZlcmVuY2UgYXJndW1lbnQuCisgICAgaW5saW5lIHN0YXRpYyBjb25zdF9pdGVyYXRvcgorICAgIGVuZChrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgIC8vLyBNYXBzIGFuIGVsZW1lbnQgdG8gYSBwb3NpdGlvbi4KKyAgICBpbmxpbmUgc3RhdGljIHNpemVfdHlwZQorICAgIGVfcG9zKGVfdHlwZSBlKTsKKworICBwcml2YXRlOgorICAgIGlubGluZSBzdGF0aWMgY29uc3RfaXRlcmF0b3IKKyAgICBiZWdpbl9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSwgZGV0YWlsOjpmYWxzZV90eXBlKTsKKworICAgIGlubGluZSBzdGF0aWMgY29uc3RfaXRlcmF0b3IKKyAgICBiZWdpbl9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSwgZGV0YWlsOjp0cnVlX3R5cGUpOworCisgICAgaW5saW5lIHN0YXRpYyBjb25zdF9pdGVyYXRvcgorICAgIGVuZF9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSwgZGV0YWlsOjpmYWxzZV90eXBlKTsKKworICAgIGlubGluZSBzdGF0aWMgY29uc3RfaXRlcmF0b3IKKyAgICBlbmRfaW1wKGtleV9jb25zdF9yZWZlcmVuY2UsIGRldGFpbDo6dHJ1ZV90eXBlKTsKKworICAgIHN0YXRpYyBkZXRhaWw6OmludGVncmFsX2NvbnN0YW50PGludCwgUmV2ZXJzZT4gc19yZXZfaW5kOworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS90cmllX3N0cmluZ19hY2Nlc3NfdHJhaXRzX2ltcC5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsdHlwZW5hbWUgTm9kZV9JdHIsIFwKKwkgICB0eXBlbmFtZSBfQVRyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgdHJpZV9wcmVmaXhfc2VhcmNoX25vZGVfdXBkYXRlPE5vZGVfQ0l0ciwgTm9kZV9JdHIsIFwKKwkJCQkgX0FUcmFpdHMsX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX1RSSUVfUE9MSUNZX0JBU0UgXAorICBkZXRhaWw6OnRyaWVfcG9saWN5X2Jhc2U8Tm9kZV9DSXRyLE5vZGVfSXRyLF9BVHJhaXRzLCBfQWxsb2M+CisKKyAgLy8vIEEgbm9kZSB1cGRhdG9yIHRoYXQgYWxsb3dzIHRyaWVzIHRvIGJlIHNlYXJjaGVkIGZvciB0aGUgcmFuZ2Ugb2YKKyAgLy8vIHZhbHVlcyB0aGF0IG1hdGNoIGEgY2VydGFpbiBwcmVmaXguCisgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwKKwkgICB0eXBlbmFtZSBOb2RlX0l0ciwKKwkgICB0eXBlbmFtZSBfQVRyYWl0cywKKwkgICB0eXBlbmFtZSBfQWxsb2M+CisgIGNsYXNzIHRyaWVfcHJlZml4X3NlYXJjaF9ub2RlX3VwZGF0ZSA6IHByaXZhdGUgUEJfRFNfVFJJRV9QT0xJQ1lfQkFTRQorICB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBQQl9EU19UUklFX1BPTElDWV9CQVNFIAkJICAgICAgIAliYXNlX3R5cGU7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfdHlwZSAJCWtleV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfY29uc3RfcmVmZXJlbmNlIAlrZXlfY29uc3RfcmVmZXJlbmNlOworCisgICAgLy8vIEVsZW1lbnQgYWNjZXNzIHRyYWl0cy4KKyAgICB0eXBlZGVmIF9BVHJhaXRzIAkJCQlhY2Nlc3NfdHJhaXRzOworCisgICAgLy8vIENvbnN0IGVsZW1lbnQgaXRlcmF0b3IuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciAJYV9jb25zdF9pdGVyYXRvcjsKKworICAgIC8vLyBfQWxsb2MgdHlwZS4KKyAgICB0eXBlZGVmIF9BbGxvYyAJICAgICAgIAkJCQlhbGxvY2F0b3JfdHlwZTsKKworICAgIC8vLyBTaXplIHR5cGUuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlIAkJc2l6ZV90eXBlOworICAgIHR5cGVkZWYgbnVsbF90eXBlIAkJCQkJbWV0YWRhdGFfdHlwZTsKKyAgICB0eXBlZGVmIE5vZGVfSXRyIAkJCQkJbm9kZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIE5vZGVfQ0l0ciAJCQkJCW5vZGVfY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2l0ZXJhdG9yOjp2YWx1ZV90eXBlIAkJaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2NvbnN0X2l0ZXJhdG9yOjp2YWx1ZV90eXBlIAljb25zdF9pdGVyYXRvcjsKKworICAgIC8vLyBGaW5kcyB0aGUgY29uc3QgaXRlcmF0b3IgcmFuZ2UgY29ycmVzcG9uZGluZyB0byBhbGwgdmFsdWVzCisgICAgLy8vIHdob3NlIHByZWZpeGVzIG1hdGNoIHJfa2V5LgorICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgcHJlZml4X3JhbmdlKGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgLy8vIEZpbmRzIHRoZSBpdGVyYXRvciByYW5nZSBjb3JyZXNwb25kaW5nIHRvIGFsbCB2YWx1ZXMgd2hvc2UKKyAgICAvLy8gcHJlZml4ZXMgbWF0Y2ggcl9rZXkuCisgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICBwcmVmaXhfcmFuZ2Uoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAvLy8gRmluZHMgdGhlIGNvbnN0IGl0ZXJhdG9yIHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gYWxsIHZhbHVlcworICAgIC8vLyB3aG9zZSBwcmVmaXhlcyBtYXRjaCBbYiwgZSkuCisgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICBwcmVmaXhfcmFuZ2UoYV9jb25zdF9pdGVyYXRvciwgYV9jb25zdF9pdGVyYXRvcikgY29uc3Q7CisKKyAgICAvLy8gRmluZHMgdGhlIGl0ZXJhdG9yIHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gYWxsIHZhbHVlcyB3aG9zZQorICAgIC8vLyBwcmVmaXhlcyBtYXRjaCBbYiwgZSkuCisgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICBwcmVmaXhfcmFuZ2UoYV9jb25zdF9pdGVyYXRvciwgYV9jb25zdF9pdGVyYXRvcik7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBDYWxsZWQgdG8gdXBkYXRlIGEgbm9kZSdzIG1ldGFkYXRhLgorICAgIGlubGluZSB2b2lkCisgICAgb3BlcmF0b3IoKShub2RlX2l0ZXJhdG9yIG5vZGVfaXQsIG5vZGVfY29uc3RfaXRlcmF0b3IgZW5kX25kX2l0KSBjb25zdDsKKworICBwcml2YXRlOgorICAgIG5vZGVfaXRlcmF0b3IKKyAgICBuZXh0X2NoaWxkKG5vZGVfaXRlcmF0b3IsIGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfaXRlcmF0b3IsCisJICAgICAgIG5vZGVfaXRlcmF0b3IsIGNvbnN0IGFjY2Vzc190cmFpdHMmKTsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBjb25zdCBpdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGp1c3QtYWZ0ZXIgbGFzdCBlbGVtZW50LgorICAgIHZpcnR1YWwgY29uc3RfaXRlcmF0b3IKKyAgICBlbmQoKSBjb25zdCA9IDA7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBqdXN0LWFmdGVyIGxhc3QgZWxlbWVudC4KKyAgICB2aXJ0dWFsIGl0ZXJhdG9yCisgICAgZW5kKCkgPSAwOworCisgICAgLy8vIFJldHVybnMgdGhlIG5vZGVfY29uc3RfaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmllJ3Mgcm9vdCBub2RlLgorICAgIHZpcnR1YWwgbm9kZV9jb25zdF9pdGVyYXRvcgorICAgIG5vZGVfYmVnaW4oKSBjb25zdCA9IDA7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbm9kZV9pdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIHRyaWUncyByb290IG5vZGUuCisgICAgdmlydHVhbCBub2RlX2l0ZXJhdG9yCisgICAgbm9kZV9iZWdpbigpID0gMDsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBub2RlX2NvbnN0X2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCBhIGp1c3QtYWZ0ZXIgbGVhZiBub2RlLgorICAgIHZpcnR1YWwgbm9kZV9jb25zdF9pdGVyYXRvcgorICAgIG5vZGVfZW5kKCkgY29uc3QgPSAwOworCisgICAgLy8vIFJldHVybnMgdGhlIG5vZGVfaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIGEganVzdC1hZnRlciBsZWFmIG5vZGUuCisgICAgdmlydHVhbCBub2RlX2l0ZXJhdG9yCisgICAgbm9kZV9lbmQoKSA9IDA7CisKKyAgICAvLy8gQWNjZXNzIHRvIHRoZSBjbXBfZm4gb2JqZWN0LgorICAgIHZpcnR1YWwgY29uc3QgYWNjZXNzX3RyYWl0cyYKKyAgICBnZXRfYWNjZXNzX3RyYWl0cygpIGNvbnN0ID0gMDsKKyAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvcHJlZml4X3NlYXJjaF9ub2RlX3VwZGF0ZV9pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgIHRyaWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZTxOb2RlX0NJdHIsIE5vZGVfSXRyLCBcCisJCQkJICAgIF9BVHJhaXRzLCBfQWxsb2M+CisKKyAgLy8vIEZ1bmN0b3IgdXBkYXRpbmcgcmFua3Mgb2YgZW50cmVlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLAorCSAgIHR5cGVuYW1lIE5vZGVfSXRyLAorCSAgIHR5cGVuYW1lIF9BVHJhaXRzLAorCSAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgY2xhc3MgdHJpZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlIDogcHJpdmF0ZSBQQl9EU19UUklFX1BPTElDWV9CQVNFCisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIFBCX0RTX1RSSUVfUE9MSUNZX0JBU0UgCQkgICAgICAgCWJhc2VfdHlwZTsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfQVRyYWl0cyAJCQkJYWNjZXNzX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIAlhX2NvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgX0FsbG9jIAkJCQkJYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlIAkJc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfdHlwZSAJCWtleV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfY29uc3RfcmVmZXJlbmNlIAlrZXlfY29uc3RfcmVmZXJlbmNlOworCisgICAgdHlwZWRlZiBzaXplX3R5cGUgCQkJCQltZXRhZGF0YV90eXBlOworICAgIHR5cGVkZWYgTm9kZV9DSXRyIAkJCQkJbm9kZV9jb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIE5vZGVfSXRyIAkJCQkJbm9kZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIG5vZGVfY29uc3RfaXRlcmF0b3I6OnZhbHVlX3R5cGUgCWNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgbm9kZV9pdGVyYXRvcjo6dmFsdWVfdHlwZSAJCWl0ZXJhdG9yOworCisgICAgLy8vIEZpbmRzIGFuIGVudHJ5IGJ5IF9fb3JkZXIuIFJldHVybnMgYSBjb25zdF9pdGVyYXRvciB0byB0aGUKKyAgICAvLy8gZW50cnkgd2l0aCB0aGUgX19vcmRlciBvcmRlciwgb3IgYSBjb25zdF9pdGVyYXRvciB0byB0aGUKKyAgICAvLy8gY29udGFpbmVyIG9iamVjdCdzIGVuZCBpZiBvcmRlciBpcyBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUKKyAgICAvLy8gY29udGFpbmVyIG9iamVjdC4KKyAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICBmaW5kX2J5X29yZGVyKHNpemVfdHlwZSkgY29uc3Q7CisKKyAgICAvLy8gRmluZHMgYW4gZW50cnkgYnkgX19vcmRlci4gUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZW50cnkKKyAgICAvLy8gd2l0aCB0aGUgX19vcmRlciBvcmRlciwgb3IgYW4gaXRlcmF0b3IgdG8gdGhlIGNvbnRhaW5lcgorICAgIC8vLyBvYmplY3QncyBlbmQgaWYgb3JkZXIgaXMgYXQgbGVhc3QgdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lcgorICAgIC8vLyBvYmplY3QuCisgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgZmluZF9ieV9vcmRlcihzaXplX3R5cGUpOworCisgICAgLy8vIFJldHVybnMgdGhlIG9yZGVyIG9mIGEga2V5IHdpdGhpbiBhIHNlcXVlbmNlLiBGb3IgZXhhcG1sZSwgaWYKKyAgICAvLy8gcl9rZXkgaXMgdGhlIHNtYWxsZXN0IGtleSwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gMDsgaWYgcl9rZXkKKyAgICAvLy8gaXMgYSBrZXkgYmV0d2VlbiB0aGUgc21hbGxlc3QgYW5kIG5leHQga2V5LCB0aGlzIG1ldGhvZCB3aWxsCisgICAgLy8vIHJldHVybiAxOyBpZiByX2tleSBpcyBhIGtleSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBrZXksIHRoaXMKKyAgICAvLy8gbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzaXplIG9mIHJfYy4KKyAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgb3JkZXJfb2Zfa2V5KGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgLy8vIFJldHVybnMgdGhlIG9yZGVyIG9mIGEgcHJlZml4IHdpdGhpbiBhIHNlcXVlbmNlLiBGb3IgZXhhcG1sZSwKKyAgICAvLy8gaWYgW2IsIGVdIGlzIHRoZSBzbWFsbGVzdCBwcmVmaXgsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDA7IGlmCisgICAgLy8vIHJfa2V5IGlzIGEga2V5IGJldHdlZW4gdGhlIHNtYWxsZXN0IGFuZCBuZXh0IGtleSwgdGhpcyBtZXRob2QKKyAgICAvLy8gd2lsbCByZXR1cm4gMTsgaWYgcl9rZXkgaXMgYSBrZXkgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3Qga2V5LAorICAgIC8vLyB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2l6ZSBvZiByX2MuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIG9yZGVyX29mX3ByZWZpeChhX2NvbnN0X2l0ZXJhdG9yLCBhX2NvbnN0X2l0ZXJhdG9yKSBjb25zdDsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8vIFVwZGF0ZXMgdGhlIHJhbmsgb2YgYSBub2RlIHRocm91Z2ggYSBub2RlX2l0ZXJhdG9yIG5vZGVfaXQ7CisgICAgLy8vIGVuZF9uZF9pdCBpcyB0aGUgZW5kIG5vZGUgaXRlcmF0b3IuCisgICAgaW5saW5lIHZvaWQKKyAgICBvcGVyYXRvcigpKG5vZGVfaXRlcmF0b3IsIG5vZGVfY29uc3RfaXRlcmF0b3IpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9wb2ludGVyIAkJY29uc3RfcG9pbnRlcjsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8bWV0YWRhdGFfdHlwZT4gX19yZWJpbmRfbTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX206Om90aGVyIAkJCV9fcmViaW5kX21hOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OmNvbnN0X3JlZmVyZW5jZSAgICAgIG1ldGFkYXRhX2NvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjpyZWZlcmVuY2UgCQltZXRhZGF0YV9yZWZlcmVuY2U7CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjb250YWluZXIgaXMgZW1wdHkuCisgICAgdmlydHVhbCBib29sCisgICAgZW1wdHkoKSBjb25zdCA9IDA7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmllJ3MgZmlyc3QgZWxlbWVudC4KKyAgICB2aXJ0dWFsIGl0ZXJhdG9yCisgICAgYmVnaW4oKSA9IDA7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmllJ3MKKyAgICAvLy8ganVzdC1hZnRlci1sYXN0IGVsZW1lbnQuCisgICAgdmlydHVhbCBpdGVyYXRvcgorICAgIGVuZCgpID0gMDsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBub2RlX2NvbnN0X2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJpZSdzIHJvb3Qgbm9kZS4KKyAgICB2aXJ0dWFsIG5vZGVfY29uc3RfaXRlcmF0b3IKKyAgICBub2RlX2JlZ2luKCkgY29uc3QgPSAwOworCisgICAgLy8vIFJldHVybnMgdGhlIG5vZGVfaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmllJ3Mgcm9vdCBub2RlLgorICAgIHZpcnR1YWwgbm9kZV9pdGVyYXRvcgorICAgIG5vZGVfYmVnaW4oKSA9IDA7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbm9kZV9jb25zdF9pdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggYSBqdXN0LWFmdGVyCisgICAgLy8vIGxlYWYgbm9kZS4KKyAgICB2aXJ0dWFsIG5vZGVfY29uc3RfaXRlcmF0b3IKKyAgICBub2RlX2VuZCgpIGNvbnN0ID0gMDsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBub2RlX2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCBhIGp1c3QtYWZ0ZXIgbGVhZiBub2RlLgorICAgIHZpcnR1YWwgbm9kZV9pdGVyYXRvcgorICAgIG5vZGVfZW5kKCkgPSAwOworCisgICAgLy8vIEFjY2VzcyB0byB0aGUgY21wX2ZuIG9iamVjdC4KKyAgICB2aXJ0dWFsIGFjY2Vzc190cmFpdHMmCisgICAgZ2V0X2FjY2Vzc190cmFpdHMoKSA9IDA7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L29yZGVyX3N0YXRpc3RpY3NfaW1wLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19UUklFX1BPTElDWV9CQVNFCisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wb2RfY2hhcl90cmFpdHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BvZF9jaGFyX3RyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDg2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wb2RfY2hhcl90cmFpdHMuaApAQCAtMCwwICsxLDE5MCBAQAorLy8gUE9EIGNoYXJhY3Rlciwgc3RkOjpjaGFyX3RyYWl0cyBzcGVjaWFsaXphdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L3BvZF9jaGFyX3RyYWl0cy5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gR2FicmllbCBEb3MgUmVpcyA8Z2RyQGludGVncmFibGUtc29sdXRpb25zLm5ldD4KKy8vIEJlbmphbWluIEtvc25payA8YmtvekByZWRoYXQuY29tPgorCisjaWZuZGVmIF9QT0RfQ0hBUl9UUkFJVFNfSAorI2RlZmluZSBfUE9EX0NIQVJfVFJBSVRTX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBQT0QgY2hhcmFjdGVyIGFic3RyYWN0aW9uLgorICAvLyBOQjogVGhlIGNoYXJfdHlwZSBwYXJhbWV0ZXIgaXMgYSBzdWJzZXQgb2YgaW50X3R5cGUsIGFzIHRvIGFsbG93CisgIC8vIGludF90eXBlIHRvIHByb3Blcmx5IGhvbGQgdGhlIGZ1bGwgcmFuZ2Ugb2YgY2hhcl90eXBlIHZhbHVlcyBhcworICAvLyB3ZWxsIGFzIEVPRi4KKyAgLy8vIEBicmllZiBBIFBPRCBjbGFzcyB0aGF0IHNlcnZlcyBhcyBhIGNoYXJhY3RlciBhYnN0cmFjdGlvbiBjbGFzcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgViwgdHlwZW5hbWUgSSwgdHlwZW5hbWUgUyA9IHN0ZDo6bWJzdGF0ZV90PgorICAgIHN0cnVjdCBjaGFyYWN0ZXIKKyAgICB7CisgICAgICB0eXBlZGVmIFYJCQkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgSQkJCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgUwkJCQlzdGF0ZV90eXBlOworICAgICAgdHlwZWRlZiBjaGFyYWN0ZXI8ViwgSSwgUz4JY2hhcl90eXBlOworCisgICAgICB2YWx1ZV90eXBlCXZhbHVlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWMj4KKyAgICAgICAgc3RhdGljIGNoYXJfdHlwZQorICAgICAgICBmcm9tKGNvbnN0IFYyJiB2KQorICAgICAgICB7CisJICBjaGFyX3R5cGUgcmV0ID0geyBzdGF0aWNfY2FzdDx2YWx1ZV90eXBlPih2KSB9OworCSAgcmV0dXJuIHJldDsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFYyPgorICAgICAgICBzdGF0aWMgVjIKKyAgICAgICAgdG8oY29uc3QgY2hhcl90eXBlJiBjKQorICAgICAgICB7CisJICBWMiByZXQgPSB7IHN0YXRpY19jYXN0PFYyPihjLnZhbHVlKSB9OworCSAgcmV0dXJuIHJldDsKKwl9CisKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFYsIHR5cGVuYW1lIEksIHR5cGVuYW1lIFM+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGNoYXJhY3RlcjxWLCBJLCBTPiYgbGhzLCBjb25zdCBjaGFyYWN0ZXI8ViwgSSwgUz4mIHJocykKKyAgICB7IHJldHVybiBsaHMudmFsdWUgPT0gcmhzLnZhbHVlOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgViwgdHlwZW5hbWUgSSwgdHlwZW5hbWUgUz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBjaGFyYWN0ZXI8ViwgSSwgUz4mIGxocywgY29uc3QgY2hhcmFjdGVyPFYsIEksIFM+JiByaHMpCisgICAgeyByZXR1cm4gbGhzLnZhbHVlIDwgcmhzLnZhbHVlOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vLyBjaGFyX3RyYWl0czxfX2dudV9jeHg6OmNoYXJhY3Rlcj4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIFYsIHR5cGVuYW1lIEksIHR5cGVuYW1lIFM+CisgICAgc3RydWN0IGNoYXJfdHJhaXRzPF9fZ251X2N4eDo6Y2hhcmFjdGVyPFYsIEksIFM+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6Y2hhcmFjdGVyPFYsIEksIFM+CWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2hhcl90eXBlOjppbnRfdHlwZQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2hhcl90eXBlOjpzdGF0ZV90eXBlCXN0YXRlX3R5cGU7CisgICAgICB0eXBlZGVmIGZwb3M8c3RhdGVfdHlwZT4JCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RyZWFtb2ZmCQkJCW9mZl90eXBlOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgYXNzaWduKGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICAgICAgeyBfX2MxID0gX19jMjsgfQorCisgICAgICBzdGF0aWMgYm9vbAorICAgICAgZXEoY29uc3QgY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpCisgICAgICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIGx0KGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICAgICAgeyByZXR1cm4gX19jMSA8IF9fYzI7IH0KKworICAgICAgc3RhdGljIGludAorICAgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCSAgaWYgKCFlcShfX3MxW19faV0sIF9fczJbX19pXSkpCisJICAgIHJldHVybiBsdChfX3MxW19faV0sIF9fczJbX19pXSkgPyAtMSA6IDE7CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBzaXplX3QKKyAgICAgIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcykKKyAgICAgIHsKKwljb25zdCBjaGFyX3R5cGUqIF9fcCA9IF9fczsKKwl3aGlsZSAoX19wLT52YWx1ZSkKKwkgICsrX19wOworCXJldHVybiAoX19wIC0gX19zKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKQorICAgICAgeworCWZvciAoY29uc3QgY2hhcl90eXBlKiBfX3AgPSBfX3M7IHNpemVfdChfX3AgLSBfX3MpIDwgX19uOyArK19fcCkKKwkgIGlmICgqX19wID09IF9fYSkKKwkgICAgcmV0dXJuIF9fcDsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7IAorCXJldHVybiBzdGF0aWNfY2FzdDxjaGFyX3R5cGUqPgorCSAgKF9fYnVpbHRpbl9tZW1tb3ZlKF9fczEsIF9fczIsIF9fbiAqIHNpemVvZihjaGFyX3R5cGUpKSk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBjb3B5KGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeworCXN0ZDo6Y29weShfX3MyLCBfX3MyICsgX19uLCBfX3MxKTsKKwlyZXR1cm4gX19zMTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY2hhcl90eXBlIF9fYSkKKyAgICAgIHsKKwlzdGQ6OmZpbGxfbihfX3MsIF9fbiwgX19hKTsKKyAgICAgICAgcmV0dXJuIF9fczsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZQorICAgICAgdG9fY2hhcl90eXBlKGNvbnN0IGludF90eXBlJiBfX2kpCisgICAgICB7IHJldHVybiBjaGFyX3R5cGU6OnRlbXBsYXRlIGZyb20oX19pKTsgfQorCisgICAgICBzdGF0aWMgaW50X3R5cGUKKyAgICAgIHRvX2ludF90eXBlKGNvbnN0IGNoYXJfdHlwZSYgX19jKQorICAgICAgeyByZXR1cm4gY2hhcl90eXBlOjp0ZW1wbGF0ZSB0bzxpbnRfdHlwZT4oX19jKTsgfQorCisgICAgICBzdGF0aWMgYm9vbAorICAgICAgZXFfaW50X3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYzEsIGNvbnN0IGludF90eXBlJiBfX2MyKQorICAgICAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBpbnRfdHlwZQorICAgICAgZW9mKCkgCisgICAgICB7CisJaW50X3R5cGUgX19yID0geyAtMSB9OworCXJldHVybiBfX3I7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBpbnRfdHlwZQorICAgICAgbm90X2VvZihjb25zdCBpbnRfdHlwZSYgX19jKQorICAgICAgeyByZXR1cm4gZXFfaW50X3R5cGUoX19jLCBlb2YoKSkgPyBpbnRfdHlwZSgpIDogX19jOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BvaW50ZXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BvaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmJjNzQ5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcG9pbnRlci5oCkBAIC0wLDAgKzEsNTkzIEBACisvLyBDdXN0b20gcG9pbnRlciBhZGFwdGVyIGFuZCBzYW1wbGUgc3RvcmFnZSBwb2xpY2llcworCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqICBAZmlsZSBleHQvcG9pbnRlci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKgorICogIEBhdXRob3IgQm9iIFdhbHRlcnMKKyAqCisgKiBQcm92aWRlcyByZXVzYWJsZSBfUG9pbnRlcl9hZGFwdGVyIGZvciBhc3Npc3RpbmcgaW4gdGhlIGRldmVsb3BtZW50IG9mCisgKiBjdXN0b20gcG9pbnRlciB0eXBlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlIHN0YW5kYXJkIGNvbnRhaW5lcnMgdmlhCisgKiB0aGUgYWxsb2NhdG9yOjpwb2ludGVyIGFuZCBhbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIgdHlwZWRlZnMuCisgKi8KKworI2lmbmRlZiBfUE9JTlRFUl9ICisjZGVmaW5lIF9QT0lOVEVSX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oPgorI2luY2x1ZGUgPGV4dC9jYXN0Lmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL21vdmUuaD4KKyMgaW5jbHVkZSA8Yml0cy9wdHJfdHJhaXRzLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKiAKKyAgICogQGJyaWVmIEEgc3RvcmFnZSBwb2xpY3kgZm9yIHVzZSB3aXRoIF9Qb2ludGVyX2FkYXB0ZXI8PiB3aGljaCB5aWVsZHMgYQorICAgKiAgICAgICAgc3RhbmRhcmQgcG9pbnRlci4KKyAgICogCisgICAqICBBIF9TdG9yYWdlX3BvbGljeSBpcyByZXF1aXJlZCB0byBwcm92aWRlIDQgdGhpbmdzOgorICAgKiAgICAxKSBBIGdldCgpIEFQSSBmb3IgcmV0dXJuaW5nIHRoZSBzdG9yZWQgcG9pbnRlciB2YWx1ZS4KKyAgICogICAgMikgQW4gc2V0KCkgQVBJIGZvciBzdG9yaW5nIGEgcG9pbnRlciB2YWx1ZS4KKyAgICogICAgMykgQW4gZWxlbWVudF90eXBlIHR5cGVkZWYgdG8gZGVmaW5lIHRoZSB0eXBlIHRoaXMgcG9pbnRzIHRvLgorICAgKiAgICA0KSBBbiBvcGVyYXRvcjwoKSB0byBzdXBwb3J0IHBvaW50ZXIgY29tcGFyaXNvbi4KKyAgICogICAgNSkgQW4gb3BlcmF0b3I9PSgpIHRvIHN1cHBvcnQgcG9pbnRlciBjb21wYXJpc29uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICBjbGFzcyBfU3RkX3BvaW50ZXJfaW1wbCAKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gdGhlIHR5cGUgdGhpcyBwb2ludGVyIHBvaW50cyB0by4KKyAgICAgIHR5cGVkZWYgX1RwIGVsZW1lbnRfdHlwZTsKKyAgCisgICAgICAvLyBBIG1ldGhvZCB0byBmZXRjaCB0aGUgcG9pbnRlciB2YWx1ZSBhcyBhIHN0YW5kYXJkIFQqIHZhbHVlOworICAgICAgaW5saW5lIF9UcCogCisgICAgICBnZXQoKSBjb25zdCAKKyAgICAgIHsgcmV0dXJuIF9NX3ZhbHVlOyB9CisgIAorICAgICAgLy8gQSBtZXRob2QgdG8gc2V0IHRoZSBwb2ludGVyIHZhbHVlLCBmcm9tIGEgc3RhbmRhcmQgVCogdmFsdWU7CisgICAgICBpbmxpbmUgdm9pZCAKKyAgICAgIHNldChlbGVtZW50X3R5cGUqIF9fYXJnKSAKKyAgICAgIHsgX01fdmFsdWUgPSBfX2FyZzsgfQorICAKKyAgICAgIC8vIENvbXBhcmlzb24gb2YgcG9pbnRlcnMKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcjwoY29uc3QgX1N0ZF9wb2ludGVyX2ltcGwmIF9fcmFyZykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfTV92YWx1ZSA8IF9fcmFyZy5fTV92YWx1ZSk7IH0KKyAgCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfU3RkX3BvaW50ZXJfaW1wbCYgX19yYXJnKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9NX3ZhbHVlID09IF9fcmFyZy5fTV92YWx1ZSk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBlbGVtZW50X3R5cGUqIF9NX3ZhbHVlOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBBIHN0b3JhZ2UgcG9saWN5IGZvciB1c2Ugd2l0aCBfUG9pbnRlcl9hZGFwdGVyPD4gd2hpY2ggc3RvcmVzCisgICAqICAgICAgICB0aGUgcG9pbnRlcidzIGFkZHJlc3MgYXMgYW4gb2Zmc2V0IHZhbHVlIHdoaWNoIGlzIHJlbGF0aXZlIHRvCisgICAqICAgICAgICBpdHMgb3duIGFkZHJlc3MuCisgICAqIAorICAgKiBUaGlzIGlzIGludGVuZGVkIGZvciBwb2ludGVycyB3aXRoaW4gc2hhcmVkIG1lbW9yeSByZWdpb25zIHdoaWNoCisgICAqIG1pZ2h0IGJlIG1hcHBlZCBhdCBkaWZmZXJlbnQgYWRkcmVzc2VzIGJ5IGRpZmZlcmVudCBwcm9jZXNzZXMuCisgICAqIEZvciBudWxsIHBvaW50ZXJzLCBhIHZhbHVlIG9mIDEgaXMgdXNlZC4gICgwIGlzIGxlZ2l0aW1hdGUKKyAgICogc29tZXRpbWVzIGZvciBub2RlcyBpbiBjaXJjdWxhcmx5IGxpbmtlZCBsaXN0cykgVGhpcyB2YWx1ZSB3YXMKKyAgICogY2hvc2VuIGFzIHRoZSBsZWFzdCBsaWtlbHkgdG8gZ2VuZXJhdGUgYW4gaW5jb3JyZWN0IG51bGwsIEFzCisgICAqIHRoZXJlIGlzIG5vIHJlYXNvbiB3aHkgYW55IG5vcm1hbCBwb2ludGVyIHdvdWxkIHBvaW50IDEgYnl0ZSBpbnRvCisgICAqIGl0cyBvd24gcG9pbnRlciBhZGRyZXNzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICBjbGFzcyBfUmVsYXRpdmVfcG9pbnRlcl9pbXBsIAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCBlbGVtZW50X3R5cGU7CisgIAorICAgICAgX1RwKgorICAgICAgZ2V0KCkgY29uc3QgCisgICAgICB7CisgICAgICAgIGlmIChfTV9kaWZmID09IDEpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfVHAqPihyZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4odGhpcykKKwkJCQkJKyBfTV9kaWZmKTsKKyAgICAgIH0KKyAgCisgICAgICB2b2lkIAorICAgICAgc2V0KF9UcCogX19hcmcpCisgICAgICB7CisgICAgICAgIGlmICghX19hcmcpCisgICAgICAgICAgX01fZGlmZiA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBfTV9kaWZmID0gcmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KF9fYXJnKSAKKyAgICAgICAgICAgICAgICAgICAgLSByZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4odGhpcyk7CisgICAgICB9CisgIAorICAgICAgLy8gQ29tcGFyaXNvbiBvZiBwb2ludGVycworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPChjb25zdCBfUmVsYXRpdmVfcG9pbnRlcl9pbXBsJiBfX3JhcmcpIGNvbnN0CisgICAgICB7IHJldHVybiAocmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KHRoaXMtPmdldCgpKQorCQk8IHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPihfX3JhcmcuZ2V0KCkpKTsgfQorCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfUmVsYXRpdmVfcG9pbnRlcl9pbXBsJiBfX3JhcmcpIGNvbnN0CisgICAgICB7IHJldHVybiAocmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KHRoaXMtPmdldCgpKQorCQk9PSByZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4oX19yYXJnLmdldCgpKSk7IH0KKworICAgIHByaXZhdGU6CisjaWZkZWYgX0dMSUJDWFhfVVNFX0xPTkdfTE9ORworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTwKKwkgKHNpemVvZih1bnNpZ25lZCBsb25nKSA+PSBzaXplb2Yodm9pZCopKSwKKwkgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyBsb25nPjo6X190eXBlIF9VSW50UHRyVHlwZTsKKyNlbHNlCisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX1VJbnRQdHJUeXBlOworI2VuZGlmCisgICAgICBfVUludFB0clR5cGUgX01fZGlmZjsKKyAgICB9OworICAKKyAgLyoqCisgICAqIFJlbGF0aXZlX3BvaW50ZXJfaW1wbCBuZWVkcyBhIHNwZWNpYWxpemF0aW9uIGZvciBjb25zdCBUIGJlY2F1c2Ugb2YKKyAgICogdGhlIGNhc3RpbmcgZG9uZSBkdXJpbmcgcG9pbnRlciBhcml0aG1ldGljLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICBjbGFzcyBfUmVsYXRpdmVfcG9pbnRlcl9pbXBsPGNvbnN0IF9UcD4gCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwIGVsZW1lbnRfdHlwZTsKKyAgCisgICAgICBjb25zdCBfVHAqCisgICAgICBnZXQoKSBjb25zdAorICAgICAgeworICAgICAgICBpZiAoX01fZGlmZiA9PSAxKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX1RwKj4KKwkgICAgICAocmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KHRoaXMpICsgX01fZGlmZik7CisgICAgICB9CisgIAorICAgICAgdm9pZCAKKyAgICAgIHNldChjb25zdCBfVHAqIF9fYXJnKQorICAgICAgeworICAgICAgICBpZiAoIV9fYXJnKQorICAgICAgICAgIF9NX2RpZmYgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgX01fZGlmZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPihfX2FyZykgCisgICAgICAgICAgICAgICAgICAgIC0gcmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KHRoaXMpOworICAgICAgfQorICAKKyAgICAgIC8vIENvbXBhcmlzb24gb2YgcG9pbnRlcnMKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcjwoY29uc3QgX1JlbGF0aXZlX3BvaW50ZXJfaW1wbCYgX19yYXJnKSBjb25zdAorICAgICAgeyByZXR1cm4gKHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPih0aGlzLT5nZXQoKSkKKwkJPCByZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4oX19yYXJnLmdldCgpKSk7IH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1JlbGF0aXZlX3BvaW50ZXJfaW1wbCYgX19yYXJnKSBjb25zdAorICAgICAgeyByZXR1cm4gKHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPih0aGlzLT5nZXQoKSkKKwkJPT0gcmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KF9fcmFyZy5nZXQoKSkpOyB9CisgIAorICAgIHByaXZhdGU6CisjaWZkZWYgX0dMSUJDWFhfVVNFX0xPTkdfTE9ORworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTwKKwkgKHNpemVvZih1bnNpZ25lZCBsb25nKSA+PSBzaXplb2Yodm9pZCopKSwKKwkgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyBsb25nPjo6X190eXBlIF9VSW50UHRyVHlwZTsKKyNlbHNlCisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX1VJbnRQdHJUeXBlOworI2VuZGlmCisgICAgICAgX1VJbnRQdHJUeXBlIF9NX2RpZmY7CisgICAgfTsKKworICAvKioKKyAgICogVGhlIHNwZWNpYWxpemF0aW9uIG9uIHRoaXMgdHlwZSBoZWxwcyByZXNvbHZlIHRoZSBwcm9ibGVtIG9mCisgICAqIHJlZmVyZW5jZSB0byB2b2lkLCBhbmQgZWxpbWluYXRlcyB0aGUgbmVlZCB0byBzcGVjaWFsaXplCisgICAqIF9Qb2ludGVyX2FkYXB0ZXIgZm9yIGNhc2VzIG9mIHZvaWQqLCBjb25zdCB2b2lkKiwgYW5kIHNvIG9uLgorICAgKi8KKyAgc3RydWN0IF9JbnZhbGlkX3R5cGUgeyB9OworICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3R5cGUgCisgICAgeyB0eXBlZGVmIF9UcCYgcmVmZXJlbmNlOyB9OworCisgIHRlbXBsYXRlPD4gCisgICAgc3RydWN0IF9SZWZlcmVuY2VfdHlwZTx2b2lkPiAKKyAgICB7IHR5cGVkZWYgX0ludmFsaWRfdHlwZSYgcmVmZXJlbmNlOyB9OworCisgIHRlbXBsYXRlPD4gCisgICAgc3RydWN0IF9SZWZlcmVuY2VfdHlwZTxjb25zdCB2b2lkPiAKKyAgICB7IHR5cGVkZWYgY29uc3QgX0ludmFsaWRfdHlwZSYgcmVmZXJlbmNlOyB9OworCisgIHRlbXBsYXRlPD4gCisgICAgc3RydWN0IF9SZWZlcmVuY2VfdHlwZTx2b2xhdGlsZSB2b2lkPiAKKyAgICB7IHR5cGVkZWYgdm9sYXRpbGUgX0ludmFsaWRfdHlwZSYgIHJlZmVyZW5jZTsgfTsKKworICB0ZW1wbGF0ZTw+IAorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3R5cGU8dm9sYXRpbGUgY29uc3Qgdm9pZD4gCisgICAgeyB0eXBlZGVmIGNvbnN0IHZvbGF0aWxlIF9JbnZhbGlkX3R5cGUmICByZWZlcmVuY2U7IH07CisKKyAgLyoqCisgICAqIFRoaXMgc3RydWN0dXJlIGFjY29tbW9kYXRlcyB0aGUgd2F5IGluIHdoaWNoCisgICAqIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPD4gaXMgbm9ybWFsbHkgc3BlY2lhbGl6ZWQgZm9yIGNvbnN0IFQqLCBzbworICAgKiB0aGF0IHZhbHVlX3R5cGUgaXMgc3RpbGwgVC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gCisgICAgc3RydWN0IF9VbnF1YWxpZmllZF90eXBlIAorICAgIHsgdHlwZWRlZiBfVHAgdHlwZTsgfTsKKyAgICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICBzdHJ1Y3QgX1VucXVhbGlmaWVkX3R5cGU8Y29uc3QgX1RwPiAKKyAgICB7IHR5cGVkZWYgX1RwIHR5cGU7IH07CisgICAgCisgIC8qKgorICAgKiBUaGUgZm9sbG93aW5nIHByb3ZpZGVzIGFuICdhbHRlcm5hdGl2ZSBwb2ludGVyJyB0aGF0IHdvcmtzIHdpdGgKKyAgICogdGhlIGNvbnRhaW5lcnMgd2hlbiBzcGVjaWZpZWQgYXMgdGhlIHBvaW50ZXIgdHlwZWRlZiBvZiB0aGUKKyAgICogYWxsb2NhdG9yLgorICAgKgorICAgKiBUaGUgcG9pbnRlciB0eXBlIHVzZWQgd2l0aCB0aGUgY29udGFpbmVycyBkb2Vzbid0IGhhdmUgdG8gYmUgdGhpcworICAgKiBjbGFzcywgYnV0IGl0IG11c3Qgc3VwcG9ydCB0aGUgaW1wbGljaXQgY29udmVyc2lvbnMsIHBvaW50ZXIKKyAgICogYXJpdGhtZXRpYywgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGV0Yy4gdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICogY2xhc3MsIGFuZCBhdm9pZCByYWlzaW5nIGNvbXBpbGUtdGltZSBhbWJpZ3VpdGllcy4gIEJlY2F1c2UKKyAgICogY3JlYXRpbmcgYSB3b3JraW5nIHBvaW50ZXIgY2FuIGJlIGNoYWxsZW5naW5nLCB0aGlzIHBvaW50ZXIKKyAgICogdGVtcGxhdGUgd2FzIGRlc2lnbmVkIHRvIHdyYXBwZXIgYW4gZWFzaWVyIHN0b3JhZ2UgcG9saWN5IHR5cGUsCisgICAqIHNvIHRoYXQgaXQgYmVjb21lcyByZXVzYWJsZSBmb3IgY3JlYXRpbmcgb3RoZXIgcG9pbnRlciB0eXBlcy4KKyAgICoKKyAgICogQSBrZXkgcG9pbnQgb2YgdGhpcyBjbGFzcyBpcyBhbHNvIHRoYXQgaXQgYWxsb3dzIGNvbnRhaW5lcgorICAgKiB3cml0ZXJzIHRvICdhc3N1bWUnIEFsbG9jYXRvcjo6cG9pbnRlciBpcyBhIHR5cGVkZWYgZm9yIGEgbm9ybWFsCisgICAqIHBvaW50ZXIuICBUaGlzIGNsYXNzIHN1cHBvcnRzIG1vc3Qgb2YgdGhlIGNvbnZlbnRpb25zIG9mIGEgdHJ1ZQorICAgKiBwb2ludGVyLCBhbmQgY2FuLCBmb3IgaW5zdGFuY2UgaGFuZGxlIGltcGxpY2l0IGNvbnZlcnNpb24gdG8KKyAgICogY29uc3QgYW5kIGJhc2UgY2xhc3MgcG9pbnRlciB0eXBlcy4gIFRoZSBvbmx5IGltcG9zaXRpb25zIG9uCisgICAqIGNvbnRhaW5lciB3cml0ZXJzIHRvIHN1cHBvcnQgZXh0ZW5kZWQgcG9pbnRlcnMgYXJlOiAxKSB1c2UgdGhlCisgICAqIEFsbG9jYXRvcjo6cG9pbnRlciB0eXBlZGVmIGFwcHJvcHJpYXRlbHkgZm9yIHBvaW50ZXIgdHlwZXMuICAyKQorICAgKiBpZiB5b3UgbmVlZCBwb2ludGVyIGNhc3RpbmcsIHVzZSB0aGUgX19wb2ludGVyX2Nhc3Q8PiBmdW5jdGlvbnMKKyAgICogZnJvbSBleHQvY2FzdC5oLiAgVGhpcyBhbGxvd3MgcG9pbnRlciBjYXN0IG9wZXJhdGlvbnMgdG8gYmUKKyAgICogb3ZlcmxvYWRlZCBhcyBuZWNlc3NhcnkgYnkgY3VzdG9tIHBvaW50ZXJzLgorICAgKgorICAgKiBOb3RlOiBUaGUgY29uc3QgcXVhbGlmaWVyIHdvcmtzIHdpdGggdGhpcyBwb2ludGVyIGFkYXB0ZXIgYXMKKyAgICogZm9sbG93czoKKyAgICoKKyAgICogX1RwKiAgICAgICAgICAgICA9PSBfUG9pbnRlcl9hZGFwdGVyPF9TdGRfcG9pbnRlcl9pbXBsPF9UcD4gPjsKKyAgICogY29uc3QgX1RwKiAgICAgICA9PSBfUG9pbnRlcl9hZGFwdGVyPF9TdGRfcG9pbnRlcl9pbXBsPGNvbnN0IF9UcD4gPjsKKyAgICogX1RwKiBjb25zdCAgICAgICA9PSBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9TdGRfcG9pbnRlcl9pbXBsPF9UcD4gPjsKKyAgICogY29uc3QgX1RwKiBjb25zdCA9PSBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9TdGRfcG9pbnRlcl9pbXBsPGNvbnN0IF9UcD4gPjsKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdG9yYWdlX3BvbGljeT4KKyAgICBjbGFzcyBfUG9pbnRlcl9hZGFwdGVyIDogcHVibGljIF9TdG9yYWdlX3BvbGljeSAKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3RvcmFnZV9wb2xpY3k6OmVsZW1lbnRfdHlwZSBlbGVtZW50X3R5cGU7CisKKyAgICAgIC8vIFRoZXNlIGFyZSBuZWVkZWQgZm9yIGl0ZXJhdG9yX3RyYWl0cworICAgICAgdHlwZWRlZiBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVW5xdWFsaWZpZWRfdHlwZTxlbGVtZW50X3R5cGU+Ojp0eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfUG9pbnRlcl9hZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZWZlcmVuY2VfdHlwZTxlbGVtZW50X3R5cGU+OjpyZWZlcmVuY2UgIHJlZmVyZW5jZTsKKworICAgICAgLy8gUmVtaW5kZXI6ICdjb25zdCcgbWV0aG9kcyBtZWFuIHRoYXQgdGhlIG1ldGhvZCBpcyB2YWxpZCB3aGVuIHRoZSAKKyAgICAgIC8vIHBvaW50ZXIgaXMgaW1tdXRhYmxlLCBhbmQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB3aGV0aGVyIHRoZSAKKyAgICAgIC8vICdwb2ludGVlJyBpcyBjb25zdC4KKworICAgICAgLy8gRGVmYXVsdCBDb25zdHJ1Y3RvciAoQ29udmVydCBmcm9tIGVsZW1lbnRfdHlwZSopCisgICAgICBfUG9pbnRlcl9hZGFwdGVyKGVsZW1lbnRfdHlwZSogX19hcmcgPSAwKQorICAgICAgeyBfU3RvcmFnZV9wb2xpY3k6OnNldChfX2FyZyk7IH0KKworICAgICAgLy8gQ29weSBjb25zdHJ1Y3RvciBmcm9tIF9Qb2ludGVyX2FkYXB0ZXIgb2Ygc2FtZSB0eXBlLgorICAgICAgX1BvaW50ZXJfYWRhcHRlcihjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX2FyZykgCisgICAgICB7IF9TdG9yYWdlX3BvbGljeTo6c2V0KF9fYXJnLmdldCgpKTsgfQorCisgICAgICAvLyBDb252ZXJ0IGZyb20gX1VwKiBpZiBjb252ZXJzaW9uIHRvIGVsZW1lbnRfdHlwZSogaXMgdmFsaWQuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIF9Qb2ludGVyX2FkYXB0ZXIoX1VwKiBfX2FyZykKKyAgICAgICAgeyBfU3RvcmFnZV9wb2xpY3k6OnNldChfX2FyZyk7IH0KKworICAgICAgLy8gQ29udmVyc2lvbiBmcm9tIGFub3RoZXIgX1BvaW50ZXJfYWRhcHRlciBpZiBfVXAgaWYgc3RhdGljIGNhc3QgaXMKKyAgICAgIC8vIHZhbGlkLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBfUG9pbnRlcl9hZGFwdGVyKGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1VwPiYgX19hcmcpCisgICAgICAgIHsgX1N0b3JhZ2VfcG9saWN5OjpzZXQoX19hcmcuZ2V0KCkpOyB9CisKKyAgICAgIC8vIERlc3RydWN0b3IKKyAgICAgIH5fUG9pbnRlcl9hZGFwdGVyKCkgeyB9CisgIAorICAgICAgLy8gQXNzaWdubWVudCBvcGVyYXRvcgorICAgICAgX1BvaW50ZXJfYWRhcHRlciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX2FyZykgCisgICAgICB7CisgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9fYXJnLmdldCgpKTsgCisgICAgICAgIHJldHVybiAqdGhpczsgCisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgX1BvaW50ZXJfYWRhcHRlciYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1VwPiYgX19hcmcpCisgICAgICAgIHsKKyAgICAgICAgICBfU3RvcmFnZV9wb2xpY3k6OnNldChfX2FyZy5nZXQoKSk7IAorICAgICAgICAgIHJldHVybiAqdGhpczsgCisgICAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBfUG9pbnRlcl9hZGFwdGVyJgorICAgICAgICBvcGVyYXRvcj0oX1VwKiBfX2FyZykKKyAgICAgICAgeworICAgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9fYXJnKTsgCisgICAgICAgICAgcmV0dXJuICp0aGlzOyAKKyAgICAgICAgfQorCisgICAgICAvLyBPcGVyYXRvciosIHJldHVybnMgZWxlbWVudF90eXBlJgorICAgICAgaW5saW5lIHJlZmVyZW5jZSAKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0IAorICAgICAgeyByZXR1cm4gKihfU3RvcmFnZV9wb2xpY3k6OmdldCgpKTsgfQorCisgICAgICAvLyBPcGVyYXRvci0+LCByZXR1cm5zIGVsZW1lbnRfdHlwZSoKKyAgICAgIGlubGluZSBlbGVtZW50X3R5cGUqIAorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0IAorICAgICAgeyByZXR1cm4gX1N0b3JhZ2VfcG9saWN5OjpnZXQoKTsgfQorCisgICAgICAvLyBPcGVyYXRvcltdLCByZXR1cm5zIGEgZWxlbWVudF90eXBlJiB0byB0aGUgaXRlbSBhdCB0aGF0IGxvYy4KKyAgICAgIGlubGluZSByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc3RkOjpwdHJkaWZmX3QgX19pbmRleCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9TdG9yYWdlX3BvbGljeTo6Z2V0KClbX19pbmRleF07IH0KKworICAgICAgLy8gVG8gYWxsb3cgaW1wbGljaXQgY29udmVyc2lvbiB0byAiYm9vbCIsIGZvciAiaWYgKHB0cikuLi4iCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgZWxlbWVudF90eXBlKihfUG9pbnRlcl9hZGFwdGVyOjoqX191bnNwZWNpZmllZF9ib29sX3R5cGUpKCkgY29uc3Q7CisKKyAgICBwdWJsaWM6CisgICAgICBvcGVyYXRvciBfX3Vuc3BlY2lmaWVkX2Jvb2xfdHlwZSgpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiBfU3RvcmFnZV9wb2xpY3k6OmdldCgpID09IDAgPyAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICAgJl9Qb2ludGVyX2FkYXB0ZXI6Om9wZXJhdG9yLT47IAorICAgICAgfQorCisgICAgICAvLyAhIG9wZXJhdG9yIChmb3I6IGlmICghcHRyKS4uLikKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvciEoKSBjb25zdCAKKyAgICAgIHsgcmV0dXJuIChfU3RvcmFnZV9wb2xpY3k6OmdldCgpID09IDApOyB9CisgIAorICAgICAgLy8gUG9pbnRlciBkaWZmZXJlbmNlcworICAgICAgaW5saW5lIGZyaWVuZCBzdGQ6OnB0cmRpZmZfdCAKKyAgICAgIG9wZXJhdG9yLShjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX2xocywgZWxlbWVudF90eXBlKiBfX3JocykgCisgICAgICB7IHJldHVybiAoX19saHMuZ2V0KCkgLSBfX3Jocyk7IH0KKyAgCisgICAgICBpbmxpbmUgZnJpZW5kIHN0ZDo6cHRyZGlmZl90IAorICAgICAgb3BlcmF0b3ItKGVsZW1lbnRfdHlwZSogX19saHMsIGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXImIF9fcmhzKSAKKyAgICAgIHsgcmV0dXJuIChfX2xocyAtIF9fcmhzLmdldCgpKTsgfQorICAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgaW5saW5lIGZyaWVuZCBzdGQ6OnB0cmRpZmZfdCAKKyAgICAgICAgb3BlcmF0b3ItKGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXImIF9fbGhzLCBfVXAqIF9fcmhzKSAKKyAgICAgICAgeyByZXR1cm4gKF9fbGhzLmdldCgpIC0gX19yaHMpOyB9CisgICAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIGlubGluZSBmcmllbmQgc3RkOjpwdHJkaWZmX3QgCisgICAgICAgIG9wZXJhdG9yLShfVXAqIF9fbGhzLCBjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX3JocykKKyAgICAgICAgeyByZXR1cm4gKF9fbGhzIC0gX19yaHMuZ2V0KCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgaW5saW5lIHN0ZDo6cHRyZGlmZl90IAorICAgICAgICBvcGVyYXRvci0oY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVXA+JiBfX3JocykgY29uc3QgCisgICAgICAgIHsgcmV0dXJuIChfU3RvcmFnZV9wb2xpY3k6OmdldCgpIC0gX19yaHMuZ2V0KCkpOyB9CisgIAorICAgICAgLy8gUG9pbnRlciBtYXRoCisgICAgICAvLyBOb3RlOiBUaGVyZSBpcyBhIHJlYXNvbiBmb3IgYWxsIHRoaXMgb3ZlcmxvYWRpbmcgYmFzZWQgb24gZGlmZmVyZW50CisgICAgICAvLyBpbnRlZ2VyIHR5cGVzLiAgSW4gc29tZSBsaWJzdGRjKystdjMgdGVzdCBjYXNlcywgYSB0ZW1wbGF0ZWQKKyAgICAgIC8vIG9wZXJhdG9yKyBpcyBkZWNsYXJlZCB3aGljaCBjYW4gbWF0Y2ggYW55IHR5cGVzLiAgVGhpcyBvcGVyYXRvcgorICAgICAgLy8gdGVuZHMgdG8gInN0ZWFsIiB0aGUgcmVjb2duaXRpb24gb2YgX1BvaW50ZXJfYWRhcHRlcidzIG93biBvcGVyYXRvcisgCisgICAgICAvLyB1bmxlc3MgdGhlIGludGVnZXIgdHlwZSBtYXRjaGVzIHBlcmZlY3RseS4KKworI2RlZmluZSBfQ1hYX1BPSU5URVJfQVJJVEhfT1BFUkFUT1JfU0VUKElOVF9UWVBFKSBcCisgICAgICBpbmxpbmUgZnJpZW5kIF9Qb2ludGVyX2FkYXB0ZXIgXAorICAgICAgb3BlcmF0b3IrKGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXImIF9fbGhzLCBJTlRfVFlQRSBfX29mZnNldCkgXAorICAgICAgeyByZXR1cm4gX1BvaW50ZXJfYWRhcHRlcihfX2xocy5nZXQoKSArIF9fb2Zmc2V0KTsgfSBcCitcCisgICAgICBpbmxpbmUgZnJpZW5kIF9Qb2ludGVyX2FkYXB0ZXIgXAorICAgICAgb3BlcmF0b3IrKElOVF9UWVBFIF9fb2Zmc2V0LCBjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX3JocykgXAorICAgICAgeyByZXR1cm4gX1BvaW50ZXJfYWRhcHRlcihfX3Jocy5nZXQoKSArIF9fb2Zmc2V0KTsgfSBcCitcCisgICAgICBpbmxpbmUgZnJpZW5kIF9Qb2ludGVyX2FkYXB0ZXIgXAorICAgICAgb3BlcmF0b3ItKGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXImIF9fbGhzLCBJTlRfVFlQRSBfX29mZnNldCkgXAorICAgICAgeyByZXR1cm4gX1BvaW50ZXJfYWRhcHRlcihfX2xocy5nZXQoKSAtIF9fb2Zmc2V0KTsgfSBcCitcCisgICAgICBpbmxpbmUgX1BvaW50ZXJfYWRhcHRlciYgXAorICAgICAgb3BlcmF0b3IrPShJTlRfVFlQRSBfX29mZnNldCkgXAorICAgICAgeyBcCisgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9TdG9yYWdlX3BvbGljeTo6Z2V0KCkgKyBfX29mZnNldCk7IFwKKyAgICAgICAgcmV0dXJuICp0aGlzOyBcCisgICAgICB9IFwKK1wKKyAgICAgIGlubGluZSBfUG9pbnRlcl9hZGFwdGVyJiBcCisgICAgICBvcGVyYXRvci09KElOVF9UWVBFIF9fb2Zmc2V0KSBcCisgICAgICB7IFwKKyAgICAgICAgX1N0b3JhZ2VfcG9saWN5OjpzZXQoX1N0b3JhZ2VfcG9saWN5OjpnZXQoKSAtIF9fb2Zmc2V0KTsgXAorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICAgIH0gXAorLy8gRU5EIG9mIF9DWFhfUE9JTlRFUl9BUklUSF9PUEVSQVRPUl9TRVQgbWFjcm8KKyAgCisgICAgICAvLyBFeHBhbmQgaW50byB0aGUgdmFyaW91cyBwb2ludGVyIGFyaXRobWV0aWMgb3BlcmF0b3JzIG5lZWRlZC4KKyAgICAgIF9DWFhfUE9JTlRFUl9BUklUSF9PUEVSQVRPUl9TRVQoc2hvcnQpOworICAgICAgX0NYWF9QT0lOVEVSX0FSSVRIX09QRVJBVE9SX1NFVCh1bnNpZ25lZCBzaG9ydCk7CisgICAgICBfQ1hYX1BPSU5URVJfQVJJVEhfT1BFUkFUT1JfU0VUKGludCk7CisgICAgICBfQ1hYX1BPSU5URVJfQVJJVEhfT1BFUkFUT1JfU0VUKHVuc2lnbmVkIGludCk7CisgICAgICBfQ1hYX1BPSU5URVJfQVJJVEhfT1BFUkFUT1JfU0VUKGxvbmcpOworICAgICAgX0NYWF9QT0lOVEVSX0FSSVRIX09QRVJBVE9SX1NFVCh1bnNpZ25lZCBsb25nKTsKKworICAgICAgLy8gTWF0aGVtYXRpY2FsIE1hbmlwdWxhdG9ycworICAgICAgaW5saW5lIF9Qb2ludGVyX2FkYXB0ZXImIAorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9TdG9yYWdlX3BvbGljeTo6Z2V0KCkgKyAxKTsgCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgCisgICAgICBpbmxpbmUgX1BvaW50ZXJfYWRhcHRlciAKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworICAgICAgICBfUG9pbnRlcl9hZGFwdGVyIHRtcCgqdGhpcyk7CisgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9TdG9yYWdlX3BvbGljeTo6Z2V0KCkgKyAxKTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICAgIH0KKyAgCisgICAgICBpbmxpbmUgX1BvaW50ZXJfYWRhcHRlciYgCisgICAgICBvcGVyYXRvci0tKCkgCisgICAgICB7CisgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9TdG9yYWdlX3BvbGljeTo6Z2V0KCkgLSAxKTsgCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgCisgICAgICBpbmxpbmUgX1BvaW50ZXJfYWRhcHRlcgorICAgICAgb3BlcmF0b3ItLShpbnQpIAorICAgICAgeworICAgICAgICBfUG9pbnRlcl9hZGFwdGVyIHRtcCgqdGhpcyk7CisgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9TdG9yYWdlX3BvbGljeTo6Z2V0KCkgLSAxKTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICAgIH0KKyAgCisgICAgfTsgLy8gY2xhc3MgX1BvaW50ZXJfYWRhcHRlcgorCisKKyNkZWZpbmUgX0dDQ19DWFhfUE9JTlRFUl9DT01QQVJJU09OX09QRVJBVElPTl9TRVQoT1BFUkFUT1IpIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4gXAorICAgIGlubGluZSBib29sIFwKKyAgICBvcGVyYXRvciBPUEVSQVRPUihjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcDE+JiBfX2xocywgX1RwMiBfX3JocykgXAorICAgIHsgcmV0dXJuIF9fbGhzLmdldCgpIE9QRVJBVE9SIF9fcmhzOyB9IFwKK1wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4gXAorICAgIGlubGluZSBib29sIFwKKyAgICBvcGVyYXRvciBPUEVSQVRPUihfVHAxIF9fbGhzLCBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcDI+JiBfX3JocykgXAorICAgIHsgcmV0dXJuIF9fbGhzIE9QRVJBVE9SIF9fcmhzLmdldCgpOyB9IFwKK1wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4gXAorICAgIGlubGluZSBib29sIFwKKyAgICBvcGVyYXRvciBPUEVSQVRPUihjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcDE+JiBfX2xocywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHAyPiYgX19yaHMpIFwKKyAgICB7IHJldHVybiBfX2xocy5nZXQoKSBPUEVSQVRPUiBfX3Jocy5nZXQoKTsgfSBcCitcCisvLyBFbmQgR0NDX0NYWF9QT0lOVEVSX0NPTVBBUklTT05fT1BFUkFUSU9OX1NFVCBNYWNybworICAKKyAgLy8gRXhwYW5kIGludG8gdGhlIHZhcmlvdXMgY29tcGFyaXNvbiBvcGVyYXRvcnMgbmVlZGVkLgorICBfR0NDX0NYWF9QT0lOVEVSX0NPTVBBUklTT05fT1BFUkFUSU9OX1NFVCg9PSkKKyAgX0dDQ19DWFhfUE9JTlRFUl9DT01QQVJJU09OX09QRVJBVElPTl9TRVQoIT0pCisgIF9HQ0NfQ1hYX1BPSU5URVJfQ09NUEFSSVNPTl9PUEVSQVRJT05fU0VUKDwpCisgIF9HQ0NfQ1hYX1BPSU5URVJfQ09NUEFSSVNPTl9PUEVSQVRJT05fU0VUKDw9KQorICBfR0NDX0NYWF9QT0lOVEVSX0NPTVBBUklTT05fT1BFUkFUSU9OX1NFVCg+KQorICBfR0NDX0NYWF9QT0lOVEVSX0NPTVBBUklTT05fT1BFUkFUSU9OX1NFVCg+PSkKKworICAvLyBUaGVzZSBhcmUgaGVyZSBmb3IgZXhwcmVzc2lvbnMgbGlrZSAicHRyID09IDAiLCAicHRyICE9IDAiCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX2xocywgaW50IF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmdldCgpID09IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KF9fcmhzKTsgfSAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGludCBfX2xocywgY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3Jocy5nZXQoKSA9PSByZWludGVycHJldF9jYXN0PHZvaWQqPihfX2xocyk7IH0gCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fbGhzLCBpbnQgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuZ2V0KCkgIT0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oX19yaHMpOyB9IAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oaW50IF9fbGhzLCBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmdldCgpICE9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KF9fbGhzKTsgfSAKKworICAvKioKKyAgICogQ29tcGFyaXNvbiBvcGVyYXRvcnMgZm9yIF9Qb2ludGVyX2FkYXB0ZXIgZGVmZXIgdG8gdGhlIGJhc2UgY2xhc3MnCisgICAqIGNvbXBhcmlzb24gb3BlcmF0b3JzLCB3aGVuIHBvc3NpYmxlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fbGhzLCAKKyAgICAgICAgICAgICAgIGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1RwPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX1RwOjpvcGVyYXRvcj09KF9fcmhzKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX2xocywgCisgICAgICAgICAgICAgICBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9UcDo6b3BlcmF0b3I8KF9fcmhzKSB8fCBfX2xocy5fVHA6Om9wZXJhdG9yPT0oX19yaHMpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fbGhzLCAKKyAgICAgICAgICAgICAgIGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1RwPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocy5fVHA6Om9wZXJhdG9yPT0oX19yaHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fbGhzLCAKKyAgICAgICAgICAgICAgY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzLl9UcDo6b3BlcmF0b3I8KF9fcmhzKSB8fCBfX2xocy5fVHA6Om9wZXJhdG9yPT0oX19yaHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX2xocywgCisgICAgICAgICAgICAgICBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMuX1RwOjpvcGVyYXRvcjwoX19yaHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX1N0b3JlVD4KKyAgICBpbmxpbmUgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgCisgICAgICAgICAgICAgICBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9TdG9yZVQ+JiBfX3ApCisgICAgeyByZXR1cm4gKF9fb3MgPDwgX19wLmdldCgpKTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1N0b3JhZ2VfcG9saWN5PgorICAgIHN0cnVjdCBwb2ludGVyX3RyYWl0czxfX2dudV9jeHg6Ol9Qb2ludGVyX2FkYXB0ZXI8X1N0b3JhZ2VfcG9saWN5Pj4KKyAgICB7CisgICAgICAvLy8gVGhlIHBvaW50ZXIgdHlwZQorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9Qb2ludGVyX2FkYXB0ZXI8X1N0b3JhZ2VfcG9saWN5PiAgICAgICAgIHBvaW50ZXI7CisgICAgICAvLy8gVGhlIHR5cGUgcG9pbnRlZCB0bworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBwb2ludGVyOjplbGVtZW50X3R5cGUgICAgICAgICAgICBlbGVtZW50X3R5cGU7CisgICAgICAvLy8gVHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb2ludGVycworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBwb2ludGVyOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgdXNpbmcgcmViaW5kID0gdHlwZW5hbWUgX19nbnVfY3h4OjpfUG9pbnRlcl9hZGFwdGVyPAorCXR5cGVuYW1lIHBvaW50ZXJfdHJhaXRzPF9TdG9yYWdlX3BvbGljeT46OnJlYmluZDxfVXA+PjsKKworICAgICAgc3RhdGljIHBvaW50ZXIgcG9pbnRlcl90byh0eXBlbmFtZSBwb2ludGVyOjpyZWZlcmVuY2UgX19yKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gcG9pbnRlcihzdGQ6OmFkZHJlc3NvZihfX3IpKTsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKyNlbmRpZgorCisjZW5kaWYgLy8gX1BPSU5URVJfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcG9vbF9hbGxvY2F0b3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3Bvb2xfYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjNTFhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3Bvb2xfYWxsb2NhdG9yLmgKQEAgLTAsMCArMSwyODAgQEAKKy8vIEFsbG9jYXRvcnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgZXh0L3Bvb2xfYWxsb2NhdG9yLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9QT09MX0FMTE9DQVRPUl9ICisjZGVmaW5lIF9QT09MX0FMTE9DQVRPUl9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGV4dC9hdG9taWNpdHkuaD4KKyNpbmNsdWRlIDxleHQvY29uY3VycmVuY2UuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjZW5kaWYKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6c2l6ZV90OworICB1c2luZyBzdGQ6OnB0cmRpZmZfdDsKKworICAvKioKKyAgICogIEBicmllZiAgQmFzZSBjbGFzcyBmb3IgX19wb29sX2FsbG9jLgorICAgKgorICAgKiAgVXNlcyB2YXJpb3VzIGFsbG9jYXRvcnMgdG8gZnVsZmlsbCB1bmRlcmx5aW5nIHJlcXVlc3RzIChhbmQgbWFrZXMgYXMKKyAgICogIGZldyByZXF1ZXN0cyBhcyBwb3NzaWJsZSB3aGVuIGluIGRlZmF1bHQgaGlnaC1zcGVlZCBwb29sIG1vZGUpLgorICAgKgorICAgKiAgSW1wb3J0YW50IGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXM6CisgICAqICAwLiBJZiBnbG9iYWxseSBtYW5kYXRlZCwgdGhlbiBhbGxvY2F0ZSBvYmplY3RzIGZyb20gbmV3CisgICAqICAxLiBJZiB0aGUgY2xpZW50cyByZXF1ZXN0IGFuIG9iamVjdCBvZiBzaXplID4gX1NfbWF4X2J5dGVzLCB0aGUgcmVzdWx0aW5nCisgICAqICAgICBvYmplY3Qgd2lsbCBiZSBvYnRhaW5lZCBkaXJlY3RseSBmcm9tIG5ldworICAgKiAgMi4gSW4gYWxsIG90aGVyIGNhc2VzLCB3ZSBhbGxvY2F0ZSBhbiBvYmplY3Qgb2Ygc2l6ZSBleGFjdGx5CisgICAqICAgICBfU19yb3VuZF91cChyZXF1ZXN0ZWRfc2l6ZSkuICBUaHVzIHRoZSBjbGllbnQgaGFzIGVub3VnaCBzaXplCisgICAqICAgICBpbmZvcm1hdGlvbiB0aGF0IHdlIGNhbiByZXR1cm4gdGhlIG9iamVjdCB0byB0aGUgcHJvcGVyIGZyZWUgbGlzdAorICAgKiAgICAgd2l0aG91dCBwZXJtYW5lbnRseSBsb3NpbmcgcGFydCBvZiB0aGUgb2JqZWN0LgorICAgKi8KKyAgICBjbGFzcyBfX3Bvb2xfYWxsb2NfYmFzZQorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIGVudW0geyBfU19hbGlnbiA9IDggfTsKKyAgICAgIGVudW0geyBfU19tYXhfYnl0ZXMgPSAxMjggfTsKKyAgICAgIGVudW0geyBfU19mcmVlX2xpc3Rfc2l6ZSA9IChzaXplX3QpX1NfbWF4X2J5dGVzIC8gKHNpemVfdClfU19hbGlnbiB9OworICAgICAgCisgICAgICB1bmlvbiBfT2JqCisgICAgICB7CisJdW5pb24gX09iaiogX01fZnJlZV9saXN0X2xpbms7CisJY2hhciAgICAgICAgX01fY2xpZW50X2RhdGFbMV07ICAgIC8vIFRoZSBjbGllbnQgc2VlcyB0aGlzLgorICAgICAgfTsKKyAgICAgIAorICAgICAgc3RhdGljIF9PYmoqIHZvbGF0aWxlICAgICAgICAgX1NfZnJlZV9saXN0W19TX2ZyZWVfbGlzdF9zaXplXTsKKworICAgICAgLy8gQ2h1bmsgYWxsb2NhdGlvbiBzdGF0ZS4KKyAgICAgIHN0YXRpYyBjaGFyKiAgICAgICAgICAgICAgICAgIF9TX3N0YXJ0X2ZyZWU7CisgICAgICBzdGF0aWMgY2hhciogICAgICAgICAgICAgICAgICBfU19lbmRfZnJlZTsKKyAgICAgIHN0YXRpYyBzaXplX3QgICAgICAgICAgICAgICAgIF9TX2hlYXBfc2l6ZTsgICAgIAorICAgICAgCisgICAgICBzaXplX3QKKyAgICAgIF9NX3JvdW5kX3VwKHNpemVfdCBfX2J5dGVzKQorICAgICAgeyByZXR1cm4gKChfX2J5dGVzICsgKHNpemVfdClfU19hbGlnbiAtIDEpICYgfigoc2l6ZV90KV9TX2FsaWduIC0gMSkpOyB9CisgICAgICAKKyAgICAgIF9HTElCQ1hYX0NPTlNUIF9PYmoqIHZvbGF0aWxlKgorICAgICAgX01fZ2V0X2ZyZWVfbGlzdChzaXplX3QgX19ieXRlcykgdGhyb3cgKCk7CisgICAgCisgICAgICBfX211dGV4JgorICAgICAgX01fZ2V0X211dGV4KCkgdGhyb3cgKCk7CisKKyAgICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IG9mIHNpemUgX19uLCBhbmQgb3B0aW9uYWxseSBhZGRzIHRvIHNpemUgX19uCisgICAgICAvLyBmcmVlIGxpc3QuCisgICAgICB2b2lkKgorICAgICAgX01fcmVmaWxsKHNpemVfdCBfX24pOworICAgICAgCisgICAgICAvLyBBbGxvY2F0ZXMgYSBjaHVuayBmb3Igbm9ianMgb2Ygc2l6ZSBzaXplLiAgbm9ianMgbWF5IGJlIHJlZHVjZWQKKyAgICAgIC8vIGlmIGl0IGlzIGluY29udmVuaWVudCB0byBhbGxvY2F0ZSB0aGUgcmVxdWVzdGVkIG51bWJlci4KKyAgICAgIGNoYXIqCisgICAgICBfTV9hbGxvY2F0ZV9jaHVuayhzaXplX3QgX19uLCBpbnQmIF9fbm9ianMpOworICAgIH07CisKKworICAvKioKKyAgICogQGJyaWVmICBBbGxvY2F0b3IgdXNpbmcgYSBtZW1vcnkgcG9vbCB3aXRoIGEgc2luZ2xlIGxvY2suCisgICAqIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfX3Bvb2xfYWxsb2MgOiBwcml2YXRlIF9fcG9vbF9hbGxvY19iYXNlCisgICAgeworICAgIHByaXZhdGU6CisgICAgICBzdGF0aWMgX0F0b21pY193b3JkCSAgICBfU19mb3JjZV9uZXc7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBzdHJ1Y3QgcmViaW5kCisgICAgICAgIHsgdHlwZWRlZiBfX3Bvb2xfYWxsb2M8X1RwMT4gb3RoZXI7IH07CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTAzLiBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudAorICAgICAgdHlwZWRlZiBzdGQ6OnRydWVfdHlwZSBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDsKKyNlbmRpZgorCisgICAgICBfX3Bvb2xfYWxsb2MoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIF9fcG9vbF9hbGxvYyhjb25zdCBfX3Bvb2xfYWxsb2MmKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIF9fcG9vbF9hbGxvYyhjb25zdCBfX3Bvb2xfYWxsb2M8X1RwMT4mKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIH5fX3Bvb2xfYWxsb2MoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX194KTsgfQorCisgICAgICBjb25zdF9wb2ludGVyCisgICAgICBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCAKKyAgICAgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QoX1VwKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsgOjpuZXcoKHZvaWQgKilfX3ApIF9VcChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgdm9pZCAKKyAgICAgICAgZGVzdHJveShfVXAqIF9fcCkgeyBfX3AtPn5fVXAoKTsgfQorI2Vsc2UKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQwMi4gd3JvbmcgbmV3IGV4cHJlc3Npb24gaW4gW3NvbWVfXSBhbGxvY2F0b3I6OmNvbnN0cnVjdAorICAgICAgdm9pZCAKKyAgICAgIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkgCisgICAgICB7IDo6bmV3KCh2b2lkICopX19wKSBfVHAoX192YWwpOyB9CisKKyAgICAgIHZvaWQgCisgICAgICBkZXN0cm95KHBvaW50ZXIgX19wKSB7IF9fcC0+fl9UcCgpOyB9CisjZW5kaWYKKworICAgICAgcG9pbnRlcgorICAgICAgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCogPSAwKTsKKworICAgICAgdm9pZAorICAgICAgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbik7ICAgICAgCisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fcG9vbF9hbGxvYzxfVHA+JiwgY29uc3QgX19wb29sX2FsbG9jPF9UcD4mKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9fcG9vbF9hbGxvYzxfVHA+JiwgY29uc3QgX19wb29sX2FsbG9jPF9UcD4mKQorICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9BdG9taWNfd29yZAorICAgIF9fcG9vbF9hbGxvYzxfVHA+OjpfU19mb3JjZV9uZXc7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcCoKKyAgICBfX3Bvb2xfYWxsb2M8X1RwPjo6YWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCopCisgICAgeworICAgICAgcG9pbnRlciBfX3JldCA9IDA7CisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX24gIT0gMCwgdHJ1ZSkpCisJeworCSAgaWYgKF9fbiA+IHRoaXMtPm1heF9zaXplKCkpCisJICAgIHN0ZDo6X190aHJvd19iYWRfYWxsb2MoKTsKKworCSAgLy8gSWYgdGhlcmUgaXMgYSByYWNlIHRocm91Z2ggaGVyZSwgYXNzdW1lIGFuc3dlciBmcm9tIGdldGVudgorCSAgLy8gd2lsbCByZXNvbHZlIGluIHNhbWUgZGlyZWN0aW9uLiAgSW5zcGlyZWQgYnkgdGVjaG5pcXVlcworCSAgLy8gdG8gZWZmaWNpZW50bHkgc3VwcG9ydCB0aHJlYWRpbmcgZm91bmQgaW4gYmFzaWNfc3RyaW5nLmguCisJICBpZiAoX1NfZm9yY2VfbmV3ID09IDApCisJICAgIHsKKwkgICAgICBpZiAoc3RkOjpnZXRlbnYoIkdMSUJDWFhfRk9SQ0VfTkVXIikpCisJCV9fYXRvbWljX2FkZF9kaXNwYXRjaCgmX1NfZm9yY2VfbmV3LCAxKTsKKwkgICAgICBlbHNlCisJCV9fYXRvbWljX2FkZF9kaXNwYXRjaCgmX1NfZm9yY2VfbmV3LCAtMSk7CisJICAgIH0KKworCSAgY29uc3Qgc2l6ZV90IF9fYnl0ZXMgPSBfX24gKiBzaXplb2YoX1RwKTsJICAgICAgCisJICBpZiAoX19ieXRlcyA+IHNpemVfdChfU19tYXhfYnl0ZXMpIHx8IF9TX2ZvcmNlX25ldyA+IDApCisJICAgIF9fcmV0ID0gc3RhdGljX2Nhc3Q8X1RwKj4oOjpvcGVyYXRvciBuZXcoX19ieXRlcykpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgX09iaiogdm9sYXRpbGUqIF9fZnJlZV9saXN0ID0gX01fZ2V0X2ZyZWVfbGlzdChfX2J5dGVzKTsKKwkgICAgICAKKwkgICAgICBfX3Njb3BlZF9sb2NrIHNlbnRyeShfTV9nZXRfbXV0ZXgoKSk7CisJICAgICAgX09iaiogX19yZXN0cmljdF9fIF9fcmVzdWx0ID0gKl9fZnJlZV9saXN0OworCSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KF9fcmVzdWx0ID09IDAsIDApKQorCQlfX3JldCA9IHN0YXRpY19jYXN0PF9UcCo+KF9NX3JlZmlsbChfTV9yb3VuZF91cChfX2J5dGVzKSkpOworCSAgICAgIGVsc2UKKwkJeworCQkgICpfX2ZyZWVfbGlzdCA9IF9fcmVzdWx0LT5fTV9mcmVlX2xpc3RfbGluazsKKwkJICBfX3JldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8X1RwKj4oX19yZXN1bHQpOworCQl9CisJICAgICAgaWYgKF9fcmV0ID09IDApCisJCXN0ZDo6X190aHJvd19iYWRfYWxsb2MoKTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3Bvb2xfYWxsb2M8X1RwPjo6ZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX24gIT0gMCAmJiBfX3AgIT0gMCwgdHJ1ZSkpCisJeworCSAgY29uc3Qgc2l6ZV90IF9fYnl0ZXMgPSBfX24gKiBzaXplb2YoX1RwKTsKKwkgIGlmIChfX2J5dGVzID4gc3RhdGljX2Nhc3Q8c2l6ZV90PihfU19tYXhfYnl0ZXMpIHx8IF9TX2ZvcmNlX25ldyA+IDApCisJICAgIDo6b3BlcmF0b3IgZGVsZXRlKF9fcCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfT2JqKiB2b2xhdGlsZSogX19mcmVlX2xpc3QgPSBfTV9nZXRfZnJlZV9saXN0KF9fYnl0ZXMpOworCSAgICAgIF9PYmoqIF9fcSA9IHJlaW50ZXJwcmV0X2Nhc3Q8X09iaio+KF9fcCk7CisKKwkgICAgICBfX3Njb3BlZF9sb2NrIHNlbnRyeShfTV9nZXRfbXV0ZXgoKSk7CisJICAgICAgX19xIC0+X01fZnJlZV9saXN0X2xpbmsgPSAqX19mcmVlX2xpc3Q7CisJICAgICAgKl9fZnJlZV9saXN0ID0gX19xOworCSAgICB9CisJfQorICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3JhbmRvbSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3JhbmRvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDdlYmVkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcmFuZG9tCkBAIC0wLDAgKzEsMjg1OCBAQAorLy8gUmFuZG9tIG51bWJlciBleHRlbnNpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvcmFuZG9tCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfRVhUX1JBTkRPTQorI2RlZmluZSBfRVhUX1JBTkRPTSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxyYW5kb20+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8ZXh0L2NtYXRoPgorI2lmZGVmIF9fU1NFMl9fCisjIGluY2x1ZGUgPHg4NmludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisjaWYgX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KKworICAvKiBNZXJzZW5uZSB0d2lzdGVyIGltcGxlbWVudGF0aW9uIG9wdGltaXplZCBmb3IgdmVjdG9yIG9wZXJhdGlvbnMuCisgICAqCisgICAqIFJlZmVyZW5jZTogaHR0cDovL3d3dy5tYXRoLnNjaS5oaXJvc2hpbWEtdS5hYy5qcC9+bS1tYXQvTVQvU0ZNVC8KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fbSwKKwkgICBzaXplX3QgX19wb3MxLCBzaXplX3QgX19zbDEsIHNpemVfdCBfX3NsMiwKKwkgICBzaXplX3QgX19zcjEsIHNpemVfdCBfX3NyMiwKKwkgICB1aW50MzJfdCBfX21zazEsIHVpbnQzMl90IF9fbXNrMiwKKwkgICB1aW50MzJfdCBfX21zazMsIHVpbnQzMl90IF9fbXNrNCwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTEsIHVpbnQzMl90IF9fcGFyaXR5MiwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTMsIHVpbnQzMl90IF9fcGFyaXR5ND4KKyAgICBjbGFzcyBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdW5zaWduZWQ8X1VJbnRUeXBlPjo6dmFsdWUsICJ0ZW1wbGF0ZSBhcmd1bWVudCAiCisJCSAgICAic3Vic3RpdHV0aW5nIF9VSW50VHlwZSBub3QgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSIpOworICAgICAgc3RhdGljX2Fzc2VydChfX3NyMSA8IDMyLCAiZmlyc3QgcmlnaHQgc2hpZnQgdG9vIGxhcmdlIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fc3IyIDwgMTYsICJzZWNvbmQgcmlnaHQgc2hpZnQgdG9vIGxhcmdlIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fc2wxIDwgMzIsICJmaXJzdCBsZWZ0IHNoaWZ0IHRvbyBsYXJnZSIpOworICAgICAgc3RhdGljX2Fzc2VydChfX3NsMiA8IDE2LCAic2Vjb25kIGxlZnQgc2hpZnQgdG9vIGxhcmdlIik7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9VSW50VHlwZSByZXN1bHRfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBtX3cgPSBzaXplb2YocmVzdWx0X3R5cGUpICogODsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IF9NX25zdGF0ZSA9IF9fbSAvIDEyOCArIDE7CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBfTV9uc3RhdGUzMiA9IF9NX25zdGF0ZSAqIDQ7CisKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc191bnNpZ25lZDxfVUludFR5cGU+Ojp2YWx1ZSwgInRlbXBsYXRlIGFyZ3VtZW50ICIKKwkJICAgICJzdWJzdGl0dXRpbmcgX1VJbnRUeXBlIG5vdCBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fcG9zMSA8IF9NX25zdGF0ZSwgIlBPUzEgbm90IHNtYWxsZXIgdGhhbiBzdGF0ZSBzaXplIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KDE2ICUgc2l6ZW9mKF9VSW50VHlwZSkgPT0gMCwKKwkJICAgICJVSW50VHlwZSBzaXplIG11c3QgZGl2aWRlIDE2Iik7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBzdGF0ZV9zaXplID0gX01fbnN0YXRlICogKDE2CisJCQkJCQkJLyBzaXplb2YocmVzdWx0X3R5cGUpKTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgZGVmYXVsdF9zZWVkID0gNTQ4OXU7CisKKyAgICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgbWVtYmVyIGZ1bmN0aW9uCisgICAgICBleHBsaWNpdAorICAgICAgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lKHJlc3VsdF90eXBlIF9fc2QgPSBkZWZhdWx0X3NlZWQpCisgICAgICB7IHNlZWQoX19zZCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwlzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19zYW1lPF9Tc2VxLAorCQkJCSAgICAgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPjo6dmFsdWU+CisJICAgICAgIDo6dHlwZT4KKwlleHBsaWNpdAorCXNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZShfU3NlcSYgX19xKQorCXsgc2VlZChfX3EpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNlZWQocmVzdWx0X3R5cGUgX19zZCA9IGRlZmF1bHRfc2VlZCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Tc2VxPgorCXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY2xhc3M8X1NzZXE+Ojp2YWx1ZT46OnR5cGUKKwlzZWVkKF9Tc2VxJiBfX3EpOworCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgICBtaW4oKQorICAgICAgeyByZXR1cm4gMDsgfTsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWF4KCkKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICB2b2lkCisgICAgICBkaXNjYXJkKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3opOworCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpCisgICAgICB7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX01fcG9zID49IHN0YXRlX3NpemUsIDApKQorCSAgX01fZ2VuX3JhbmQoKTsKKworCXJldHVybiBfTV9zdGF0ZVRbX01fcG9zKytdOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGVfMiwgc2l6ZV90IF9fbV8yLAorCSAgICAgICBzaXplX3QgX19wb3MxXzIsIHNpemVfdCBfX3NsMV8yLCBzaXplX3QgX19zbDJfMiwKKwkgICAgICAgc2l6ZV90IF9fc3IxXzIsIHNpemVfdCBfX3NyMl8yLAorCSAgICAgICB1aW50MzJfdCBfX21zazFfMiwgdWludDMyX3QgX19tc2syXzIsCisJICAgICAgIHVpbnQzMl90IF9fbXNrM18yLCB1aW50MzJfdCBfX21zazRfMiwKKwkgICAgICAgdWludDMyX3QgX19wYXJpdHkxXzIsIHVpbnQzMl90IF9fcGFyaXR5Ml8yLAorCSAgICAgICB1aW50MzJfdCBfX3Bhcml0eTNfMiwgdWludDMyX3QgX19wYXJpdHk0XzI+CisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGVfMiwKKwkJICAgX19tXzIsIF9fcG9zMV8yLCBfX3NsMV8yLCBfX3NsMl8yLCBfX3NyMV8yLCBfX3NyMl8yLAorCQkgICBfX21zazFfMiwgX19tc2syXzIsIF9fbXNrM18yLCBfX21zazRfMiwKKwkJICAgX19wYXJpdHkxXzIsIF9fcGFyaXR5Ml8yLCBfX3Bhcml0eTNfMiwgX19wYXJpdHk0XzI+JiBfX2xocywKKwkJICAgY29uc3Qgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZV8yLAorCQkgICBfX21fMiwgX19wb3MxXzIsIF9fc2wxXzIsIF9fc2wyXzIsIF9fc3IxXzIsIF9fc3IyXzIsCisJCSAgIF9fbXNrMV8yLCBfX21zazJfMiwgX19tc2szXzIsIF9fbXNrNF8yLAorCQkgICBfX3Bhcml0eTFfMiwgX19wYXJpdHkyXzIsIF9fcGFyaXR5M18yLCBfX3Bhcml0eTRfMj4mIF9fcmhzKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlXzIsIHNpemVfdCBfX21fMiwKKwkgICAgICAgc2l6ZV90IF9fcG9zMV8yLCBzaXplX3QgX19zbDFfMiwgc2l6ZV90IF9fc2wyXzIsCisJICAgICAgIHNpemVfdCBfX3NyMV8yLCBzaXplX3QgX19zcjJfMiwKKwkgICAgICAgdWludDMyX3QgX19tc2sxXzIsIHVpbnQzMl90IF9fbXNrMl8yLAorCSAgICAgICB1aW50MzJfdCBfX21zazNfMiwgdWludDMyX3QgX19tc2s0XzIsCisJICAgICAgIHVpbnQzMl90IF9fcGFyaXR5MV8yLCB1aW50MzJfdCBfX3Bhcml0eTJfMiwKKwkgICAgICAgdWludDMyX3QgX19wYXJpdHkzXzIsIHVpbnQzMl90IF9fcGFyaXR5NF8yLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IF9fZ251X2N4eDo6c2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lCisJCSAgIDxfVUludFR5cGVfMiwKKwkJICAgX19tXzIsIF9fcG9zMV8yLCBfX3NsMV8yLCBfX3NsMl8yLCBfX3NyMV8yLCBfX3NyMl8yLAorCQkgICBfX21zazFfMiwgX19tc2syXzIsIF9fbXNrM18yLCBfX21zazRfMiwKKwkJICAgX19wYXJpdHkxXzIsIF9fcGFyaXR5Ml8yLCBfX3Bhcml0eTNfMiwgX19wYXJpdHk0XzI+JiBfX3gpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGVfMiwgc2l6ZV90IF9fbV8yLAorCSAgICAgICBzaXplX3QgX19wb3MxXzIsIHNpemVfdCBfX3NsMV8yLCBzaXplX3QgX19zbDJfMiwKKwkgICAgICAgc2l6ZV90IF9fc3IxXzIsIHNpemVfdCBfX3NyMl8yLAorCSAgICAgICB1aW50MzJfdCBfX21zazFfMiwgdWludDMyX3QgX19tc2syXzIsCisJICAgICAgIHVpbnQzMl90IF9fbXNrM18yLCB1aW50MzJfdCBfX21zazRfMiwKKwkgICAgICAgdWludDMyX3QgX19wYXJpdHkxXzIsIHVpbnQzMl90IF9fcGFyaXR5Ml8yLAorCSAgICAgICB1aW50MzJfdCBfX3Bhcml0eTNfMiwgdWludDMyX3QgX19wYXJpdHk0XzIsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgX19nbnVfY3h4OjpzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlXzIsCisJCSAgIF9fbV8yLCBfX3BvczFfMiwgX19zbDFfMiwgX19zbDJfMiwgX19zcjFfMiwgX19zcjJfMiwKKwkJICAgX19tc2sxXzIsIF9fbXNrMl8yLCBfX21zazNfMiwgX19tc2s0XzIsCisJCSAgIF9fcGFyaXR5MV8yLCBfX3Bhcml0eTJfMiwgX19wYXJpdHkzXzIsIF9fcGFyaXR5NF8yPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB1bmlvbgorICAgICAgeworI2lmZGVmIF9fU1NFMl9fCisJX19tMTI4aSBfTV9zdGF0ZVtfTV9uc3RhdGVdOworI2VuZGlmCisJdWludDMyX3QgX01fc3RhdGUzMltfTV9uc3RhdGUzMl07CisJcmVzdWx0X3R5cGUgX01fc3RhdGVUW3N0YXRlX3NpemVdOworICAgICAgfSBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18gKDE2KSkpOworICAgICAgc2l6ZV90IF9NX3BvczsKKworICAgICAgdm9pZCBfTV9nZW5fcmFuZCh2b2lkKTsKKyAgICAgIHZvaWQgX01fcGVyaW9kX2NlcnRpZmljYXRpb24oKTsKKyAgfTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fbSwKKwkgICBzaXplX3QgX19wb3MxLCBzaXplX3QgX19zbDEsIHNpemVfdCBfX3NsMiwKKwkgICBzaXplX3QgX19zcjEsIHNpemVfdCBfX3NyMiwKKwkgICB1aW50MzJfdCBfX21zazEsIHVpbnQzMl90IF9fbXNrMiwKKwkgICB1aW50MzJfdCBfX21zazMsIHVpbnQzMl90IF9fbXNrNCwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTEsIHVpbnQzMl90IF9fcGFyaXR5MiwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTMsIHVpbnQzMl90IF9fcGFyaXR5ND4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX19nbnVfY3h4OjpzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLAorCSAgICAgICBfX20sIF9fcG9zMSwgX19zbDEsIF9fc2wyLCBfX3NyMSwgX19zcjIsIF9fbXNrMSwgX19tc2syLCBfX21zazMsCisJICAgICAgIF9fbXNrNCwgX19wYXJpdHkxLCBfX3Bhcml0eTIsIF9fcGFyaXR5MywgX19wYXJpdHk0PiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6c2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwKKwkgICAgICAgX19tLCBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLCBfX21zazEsIF9fbXNrMiwgX19tc2szLAorCSAgICAgICBfX21zazQsIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsIF9fcGFyaXR5ND4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKworICAvKiBEZWZpbml0aW9ucyBmb3IgdGhlIFNJTUQtb3JpZW50ZWQgRmFzdCBNZXJzZW5uZSBUd2lzdGVyIGFzIGRlZmluZWQKKyAgICogaW4gdGhlIEMgaW1wbGVtZW50YXRpb24gYnkgRGFpdG8gYW5kIE1hdHN1bW90bywgYXMgYm90aCBhIDMyLWJpdAorICAgKiBhbmQgNjQtYml0IHZlcnNpb24uCisgICAqLworICB0eXBlZGVmIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50MzJfdCwgNjA3LCAyLAorCQkJCQkgICAgMTUsIDMsIDEzLCAzLAorCQkJCQkgICAgMHhmZGZmMzdmZlUsIDB4ZWY3ZjNmN2RVLAorCQkJCQkgICAgMHhmZjc3N2I3ZFUsIDB4N2ZmN2ZiMmZVLAorCQkJCQkgICAgMHgwMDAwMDAwMVUsIDB4MDAwMDAwMDBVLAorCQkJCQkgICAgMHgwMDAwMDAwMFUsIDB4NTk4NmYwNTRVPgorICAgIHNmbXQ2MDc7CisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDY0X3QsIDYwNywgMiwKKwkJCQkJICAgIDE1LCAzLCAxMywgMywKKwkJCQkJICAgIDB4ZmRmZjM3ZmZVLCAweGVmN2YzZjdkVSwKKwkJCQkJICAgIDB4ZmY3NzdiN2RVLCAweDdmZjdmYjJmVSwKKwkJCQkJICAgIDB4MDAwMDAwMDFVLCAweDAwMDAwMDAwVSwKKwkJCQkJICAgIDB4MDAwMDAwMDBVLCAweDU5ODZmMDU0VT4KKyAgICBzZm10NjA3XzY0OworCisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDMyX3QsIDEyNzksIDcsCisJCQkJCSAgICAxNCwgMywgNSwgMSwKKwkJCQkJICAgIDB4ZjdmZWZmZmRVLCAweDdmZWZjZmZmVSwKKwkJCQkJICAgIDB4YWZmM2VmM2ZVLCAweGI1ZmZmZjdmVSwKKwkJCQkJICAgIDB4MDAwMDAwMDFVLCAweDAwMDAwMDAwVSwKKwkJCQkJICAgIDB4MDAwMDAwMDBVLCAweDIwMDAwMDAwVT4KKyAgICBzZm10MTI3OTsKKworICB0eXBlZGVmIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50NjRfdCwgMTI3OSwgNywKKwkJCQkJICAgIDE0LCAzLCA1LCAxLAorCQkJCQkgICAgMHhmN2ZlZmZmZFUsIDB4N2ZlZmNmZmZVLAorCQkJCQkgICAgMHhhZmYzZWYzZlUsIDB4YjVmZmZmN2ZVLAorCQkJCQkgICAgMHgwMDAwMDAwMVUsIDB4MDAwMDAwMDBVLAorCQkJCQkgICAgMHgwMDAwMDAwMFUsIDB4MjAwMDAwMDBVPgorICAgIHNmbXQxMjc5XzY0OworCisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDMyX3QsIDIyODEsIDEyLAorCQkJCQkgICAgMTksIDEsIDUsIDEsCisJCQkJCSAgICAweGJmZjdmZmJmVSwgMHhmZGZmZmZmZVUsCisJCQkJCSAgICAweGY3ZmZlZjdmVSwgMHhmMmY3Y2JiZlUsCisJCQkJCSAgICAweDAwMDAwMDAxVSwgMHgwMDAwMDAwMFUsCisJCQkJCSAgICAweDAwMDAwMDAwVSwgMHg0MWRmYTYwMFU+CisgICAgc2ZtdDIyODE7CisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDY0X3QsIDIyODEsIDEyLAorCQkJCQkgICAgMTksIDEsIDUsIDEsCisJCQkJCSAgICAweGJmZjdmZmJmVSwgMHhmZGZmZmZmZVUsCisJCQkJCSAgICAweGY3ZmZlZjdmVSwgMHhmMmY3Y2JiZlUsCisJCQkJCSAgICAweDAwMDAwMDAxVSwgMHgwMDAwMDAwMFUsCisJCQkJCSAgICAweDAwMDAwMDAwVSwgMHg0MWRmYTYwMFU+CisgICAgc2ZtdDIyODFfNjQ7CisKKworICB0eXBlZGVmIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50MzJfdCwgNDI1MywgMTcsCisJCQkJCSAgICAyMCwgMSwgNywgMSwKKwkJCQkJICAgIDB4OWY3YmZmZmZVLCAweDlmZmZmZjVmVSwKKwkJCQkJICAgIDB4M2VmZmZmZmJVLCAweGZmZmZmN2JiVSwKKwkJCQkJICAgIDB4YTgwMDAwMDFVLCAweGFmNTM5MGEzVSwKKwkJCQkJICAgIDB4Yjc0MGIzZjhVLCAweDZjMTE0ODZkVT4KKyAgICBzZm10NDI1MzsKKworICB0eXBlZGVmIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50NjRfdCwgNDI1MywgMTcsCisJCQkJCSAgICAyMCwgMSwgNywgMSwKKwkJCQkJICAgIDB4OWY3YmZmZmZVLCAweDlmZmZmZjVmVSwKKwkJCQkJICAgIDB4M2VmZmZmZmJVLCAweGZmZmZmN2JiVSwKKwkJCQkJICAgIDB4YTgwMDAwMDFVLCAweGFmNTM5MGEzVSwKKwkJCQkJICAgIDB4Yjc0MGIzZjhVLCAweDZjMTE0ODZkVT4KKyAgICBzZm10NDI1M182NDsKKworCisgIHR5cGVkZWYgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPHVpbnQzMl90LCAxMTIxMywgNjgsCisJCQkJCSAgICAxNCwgMywgNywgMywKKwkJCQkJICAgIDB4ZWZmZmY3ZmJVLCAweGZmZmZmZmVmVSwKKwkJCQkJICAgIDB4ZGZkZmJmZmZVLCAweDdmZmZkYmZkVSwKKwkJCQkJICAgIDB4MDAwMDAwMDFVLCAweDAwMDAwMDAwVSwKKwkJCQkJICAgIDB4ZTgxNDgwMDBVLCAweGQwYzdhZmEzVT4KKyAgICBzZm10MTEyMTM7CisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDY0X3QsIDExMjEzLCA2OCwKKwkJCQkJICAgIDE0LCAzLCA3LCAzLAorCQkJCQkgICAgMHhlZmZmZjdmYlUsIDB4ZmZmZmZmZWZVLAorCQkJCQkgICAgMHhkZmRmYmZmZlUsIDB4N2ZmZmRiZmRVLAorCQkJCQkgICAgMHgwMDAwMDAwMVUsIDB4MDAwMDAwMDBVLAorCQkJCQkgICAgMHhlODE0ODAwMFUsIDB4ZDBjN2FmYTNVPgorICAgIHNmbXQxMTIxM182NDsKKworCisgIHR5cGVkZWYgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPHVpbnQzMl90LCAxOTkzNywgMTIyLAorCQkJCQkgICAgMTgsIDEsIDExLCAxLAorCQkJCQkgICAgMHhkZmZmZmZlZlUsIDB4ZGRmZWNiN2ZVLAorCQkJCQkgICAgMHhiZmZhZmZmZlUsIDB4YmZmZmZmZjZVLAorCQkJCQkgICAgMHgwMDAwMDAwMVUsIDB4MDAwMDAwMDBVLAorCQkJCQkgICAgMHgwMDAwMDAwMFUsIDB4MTNjOWU2ODRVPgorICAgIHNmbXQxOTkzNzsKKworICB0eXBlZGVmIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50NjRfdCwgMTk5MzcsIDEyMiwKKwkJCQkJICAgIDE4LCAxLCAxMSwgMSwKKwkJCQkJICAgIDB4ZGZmZmZmZWZVLCAweGRkZmVjYjdmVSwKKwkJCQkJICAgIDB4YmZmYWZmZmZVLCAweGJmZmZmZmY2VSwKKwkJCQkJICAgIDB4MDAwMDAwMDFVLCAweDAwMDAwMDAwVSwKKwkJCQkJICAgIDB4MDAwMDAwMDBVLCAweDEzYzllNjg0VT4KKyAgICBzZm10MTk5MzdfNjQ7CisKKworICB0eXBlZGVmIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50MzJfdCwgNDQ0OTcsIDMzMCwKKwkJCQkJICAgIDUsIDMsIDksIDMsCisJCQkJCSAgICAweGVmZmZmZmZiVSwgMHhkZmJlYmZmZlUsCisJCQkJCSAgICAweGJmYmY3YmVmVSwgMHg5ZmZkN2JmZlUsCisJCQkJCSAgICAweDAwMDAwMDAxVSwgMHgwMDAwMDAwMFUsCisJCQkJCSAgICAweGEzYWM0MDAwVSwgMHhlY2MxMzI3YVU+CisgICAgc2ZtdDQ0NDk3OworCisgIHR5cGVkZWYgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPHVpbnQ2NF90LCA0NDQ5NywgMzMwLAorCQkJCQkgICAgNSwgMywgOSwgMywKKwkJCQkJICAgIDB4ZWZmZmZmZmJVLCAweGRmYmViZmZmVSwKKwkJCQkJICAgIDB4YmZiZjdiZWZVLCAweDlmZmQ3YmZmVSwKKwkJCQkJICAgIDB4MDAwMDAwMDFVLCAweDAwMDAwMDAwVSwKKwkJCQkJICAgIDB4YTNhYzQwMDBVLCAweGVjYzEzMjdhVT4KKyAgICBzZm10NDQ0OTdfNjQ7CisKKworICB0eXBlZGVmIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50MzJfdCwgODYyNDMsIDM2NiwKKwkJCQkJICAgIDYsIDcsIDE5LCAxLAorCQkJCQkgICAgMHhmZGJmZmJmZlUsIDB4YmZmN2ZmM2ZVLAorCQkJCQkgICAgMHhmZDc3ZWZmZlUsIDB4YmY5ZmYzZmZVLAorCQkJCQkgICAgMHgwMDAwMDAwMVUsIDB4MDAwMDAwMDBVLAorCQkJCQkgICAgMHgwMDAwMDAwMFUsIDB4ZTk1MjhkODVVPgorICAgIHNmbXQ4NjI0MzsKKworICB0eXBlZGVmIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50NjRfdCwgODYyNDMsIDM2NiwKKwkJCQkJICAgIDYsIDcsIDE5LCAxLAorCQkJCQkgICAgMHhmZGJmZmJmZlUsIDB4YmZmN2ZmM2ZVLAorCQkJCQkgICAgMHhmZDc3ZWZmZlUsIDB4YmY5ZmYzZmZVLAorCQkJCQkgICAgMHgwMDAwMDAwMVUsIDB4MDAwMDAwMDBVLAorCQkJCQkgICAgMHgwMDAwMDAwMFUsIDB4ZTk1MjhkODVVPgorICAgIHNmbXQ4NjI0M182NDsKKworCisgIHR5cGVkZWYgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPHVpbnQzMl90LCAxMzIwNDksIDExMCwKKwkJCQkJICAgIDE5LCAxLCAyMSwgMSwKKwkJCQkJICAgIDB4ZmZmZmJiNWZVLCAweGZiNmViZjk1VSwKKwkJCQkJICAgIDB4ZmZmZWZmZmFVLCAweGNmZjc3ZmZmVSwKKwkJCQkJICAgIDB4MDAwMDAwMDFVLCAweDAwMDAwMDAwVSwKKwkJCQkJICAgIDB4Y2I1MjAwMDBVLCAweGM3ZTkxYzdkVT4KKyAgICBzZm10MTMyMDQ5OworCisgIHR5cGVkZWYgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPHVpbnQ2NF90LCAxMzIwNDksIDExMCwKKwkJCQkJICAgIDE5LCAxLCAyMSwgMSwKKwkJCQkJICAgIDB4ZmZmZmJiNWZVLCAweGZiNmViZjk1VSwKKwkJCQkJICAgIDB4ZmZmZWZmZmFVLCAweGNmZjc3ZmZmVSwKKwkJCQkJICAgIDB4MDAwMDAwMDFVLCAweDAwMDAwMDAwVSwKKwkJCQkJICAgIDB4Y2I1MjAwMDBVLCAweGM3ZTkxYzdkVT4KKyAgICBzZm10MTMyMDQ5XzY0OworCisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDMyX3QsIDIxNjA5MSwgNjI3LAorCQkJCQkgICAgMTEsIDMsIDEwLCAxLAorCQkJCQkgICAgMHhiZmY3YmZmN1UsIDB4YmZmZmZmZmZVLAorCQkJCQkgICAgMHhiZmZmZmE3ZlUsIDB4ZmZkZGZiZmJVLAorCQkJCQkgICAgMHhmODAwMDAwMVUsIDB4ODllODA3MDlVLAorCQkJCQkgICAgMHgzYmQyYjY0YlUsIDB4MGM2NGIxZTRVPgorICAgIHNmbXQyMTYwOTE7CisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDY0X3QsIDIxNjA5MSwgNjI3LAorCQkJCQkgICAgMTEsIDMsIDEwLCAxLAorCQkJCQkgICAgMHhiZmY3YmZmN1UsIDB4YmZmZmZmZmZVLAorCQkJCQkgICAgMHhiZmZmZmE3ZlUsIDB4ZmZkZGZiZmJVLAorCQkJCQkgICAgMHhmODAwMDAwMVUsIDB4ODllODA3MDlVLAorCQkJCQkgICAgMHgzYmQyYjY0YlUsIDB4MGM2NGIxZTRVPgorICAgIHNmbXQyMTYwOTFfNjQ7CisKKyNlbmRpZiAvLyBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXworCisgIC8qKgorICAgKiBAYnJpZWYgQSBiZXRhIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBiZXRhIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXM6CisgICAqIEBmWworICAgKiAgICAgcCh4fFxhbHBoYSxcYmV0YSkgPSBcZnJhY3sxfXtCKFxhbHBoYSxcYmV0YSl9CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHhee1xhbHBoYSAtIDF9ICgxIC0geClee1xiZXRhIC0gMX0KKyAgICogQGZdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgYmV0YV9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgYmV0YV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKwlmcmllbmQgY2xhc3MgYmV0YV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19hbHBoYV92YWwgPSBfUmVhbFR5cGUoMSksCisJCSAgIF9SZWFsVHlwZSBfX2JldGFfdmFsID0gX1JlYWxUeXBlKDEpKQorCTogX01fYWxwaGEoX19hbHBoYV92YWwpLCBfTV9iZXRhKF9fYmV0YV92YWwpCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX2FscGhhID4gX1JlYWxUeXBlKDApKTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9iZXRhID4gX1JlYWxUeXBlKDApKTsKKwl9CisKKwlfUmVhbFR5cGUKKwlhbHBoYSgpIGNvbnN0CisJeyByZXR1cm4gX01fYWxwaGE7IH0KKworCV9SZWFsVHlwZQorCWJldGEoKSBjb25zdAorCXsgcmV0dXJuIF9NX2JldGE7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIChfX3AxLl9NX2FscGhhID09IF9fcDIuX01fYWxwaGEKKwkJICAmJiBfX3AxLl9NX2JldGEgPT0gX19wMi5fTV9iZXRhKTsgfQorCisgICAgICBwcml2YXRlOgorCXZvaWQKKwlfTV9pbml0aWFsaXplKCk7CisKKwlfUmVhbFR5cGUgX01fYWxwaGE7CisJX1JlYWxUeXBlIF9NX2JldGE7CisgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIGJldGEgZGlzdHJpYnV0aW9uIHdpdGggcGFyYW1ldGVycworICAgICAgICogQGYkXGFscGhhQGYkIGFuZCBAZiRcYmV0YUBmJC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJldGFfZGlzdHJpYnV0aW9uKF9SZWFsVHlwZSBfX2FscGhhX3ZhbCA9IF9SZWFsVHlwZSgxKSwKKwkJCV9SZWFsVHlwZSBfX2JldGFfdmFsID0gX1JlYWxUeXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX2FscGhhX3ZhbCwgX19iZXRhX3ZhbCkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgYmV0YV9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBAZiRcYWxwaGFAZiQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBhbHBoYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5hbHBoYSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIEBmJFxiZXRhQGYkIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgYmV0YSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5iZXRhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gcmVzdWx0X3R5cGUoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgxKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gYmV0YSBkaXN0cmlidXRpb25zIGhhdmUgdGhlIHNhbWUKKyAgICAgICAqICAgICAgICBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQgYmUgZ2VuZXJhdGVkCisgICAgICAgKiAgICAgICAgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBiZXRhX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IGJldGFfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlYmV0YV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWJldGFfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgX19nbnVfY3h4OjpiZXRhX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlYmV0YV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICViZXRhX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgX19nbnVfY3h4OjpiZXRhX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gYmV0YSBkaXN0cmlidXRpb25zIGFyZSBkaWZmZXJlbnQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9fZ251X2N4eDo6YmV0YV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3QgX19nbnVfY3h4OjpiZXRhX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgbXVsdGktdmFyaWF0ZSBub3JtYWwgY29udGludW91cyBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGlzCisgICAqIEBmWworICAgKiAgICAgcChcb3ZlcnJpZ2h0YXJyb3d7eH18XG92ZXJyaWdodGFycm93e1xtdSB9LFxTaWdtYSkgPQorICAgKiAgICAgICBcZnJhY3sxfXtcc3FydHsoMlxwaSApXmtcZGV0KFxTaWdtYSkpfX0KKyAgICogICAgICAgZV57LVxmcmFjezF9ezJ9KFxvdmVycmlnaHRhcnJvd3t4fS1cb3ZlcnJpZ2h0YXJyb3d7XG11fSleXHRleHR7VH0KKyAgICogICAgICAgICAgXFNpZ21hIF57LTF9KFxvdmVycmlnaHRhcnJvd3t4fS1cb3ZlcnJpZ2h0YXJyb3d7XG11fSl9CisgICAqIEBmXQorICAgKgorICAgKiB3aGVyZSBAZiRcb3ZlcnJpZ2h0YXJyb3d7eH1AZiQgYW5kIEBmJFxvdmVycmlnaHRhcnJvd3tcbXV9QGYkIGFyZQorICAgKiB2ZWN0b3JzIG9mIGRpbWVuc2lvbiBAZiRrQGYkIGFuZCBAZiRcU2lnbWFAZiQgaXMgdGhlIGNvdmFyaWFuY2UKKyAgICogbWF0cml4ICh3aGljaCBtdXN0IGJlIHBvc2l0aXZlLWRlZmluaXRlKS4KKyAgICovCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9EaW1lbiwgdHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIG5vcm1hbF9tdl9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworICAgICAgc3RhdGljX2Fzc2VydChfRGltZW4gIT0gMCwgImRpbWVuc2lvbiBpcyB6ZXJvIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIHN0ZDo6YXJyYXk8X1JlYWxUeXBlLCBfRGltZW4+IHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgY2xhc3MgcGFyYW1fdHlwZQorICAgICAgeworCXN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IF9NX3Rfc2l6ZSA9IF9EaW1lbiAqIChfRGltZW4gKyAxKSAvIDI7CisKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIG5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuLCBfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCWZyaWVuZCBjbGFzcyBub3JtYWxfbXZfZGlzdHJpYnV0aW9uPF9EaW1lbiwgX1JlYWxUeXBlPjsKKworCXBhcmFtX3R5cGUoKQorCXsKKwkgIHN0ZDo6ZmlsbChfTV9tZWFuLmJlZ2luKCksIF9NX21lYW4uZW5kKCksIF9SZWFsVHlwZSgwKSk7CisJICBhdXRvIF9faXQgPSBfTV90LmJlZ2luKCk7CisJICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfRGltZW47ICsrX19pKQorCSAgICB7CisJICAgICAgc3RkOjpmaWxsX24oX19pdCwgX19pLCBfUmVhbFR5cGUoMCkpOworCSAgICAgIF9faXQgKz0gX19pOworCSAgICAgICpfX2l0KysgPSBfUmVhbFR5cGUoMSk7CisJICAgIH0KKwl9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjI+CisJICBwYXJhbV90eXBlKF9Gb3J3YXJkSXRlcmF0b3IxIF9fbWVhbmJlZ2luLAorCQkgICAgIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbWVhbmVuZCwKKwkJICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX3ZhcmNvdmJlZ2luLAorCQkgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fdmFyY292ZW5kKQorCXsKKwkgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yMT4pCisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICAgICAgX0ZvcndhcmRJdGVyYXRvcjI+KQorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHN0ZDo6ZGlzdGFuY2UoX19tZWFuYmVnaW4sIF9fbWVhbmVuZCkKKwkJCQk8PSBfRGltZW4pOworCSAgY29uc3QgYXV0byBfX2Rpc3QgPSBzdGQ6OmRpc3RhbmNlKF9fdmFyY292YmVnaW4sIF9fdmFyY292ZW5kKTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfX2Rpc3QgPT0gX0RpbWVuICogX0RpbWVuCisJCQkJfHwgX19kaXN0ID09IF9EaW1lbiAqIChfRGltZW4gKyAxKSAvIDIKKwkJCQl8fCBfX2Rpc3QgPT0gX0RpbWVuKTsKKworCSAgaWYgKF9fZGlzdCA9PSBfRGltZW4gKiBfRGltZW4pCisJICAgIF9NX2luaXRfZnVsbChfX21lYW5iZWdpbiwgX19tZWFuZW5kLCBfX3ZhcmNvdmJlZ2luLCBfX3ZhcmNvdmVuZCk7CisJICBlbHNlIGlmIChfX2Rpc3QgPT0gX0RpbWVuICogKF9EaW1lbiArIDEpIC8gMikKKwkgICAgX01faW5pdF9sb3dlcihfX21lYW5iZWdpbiwgX19tZWFuZW5kLCBfX3ZhcmNvdmJlZ2luLCBfX3ZhcmNvdmVuZCk7CisJICBlbHNlCisJICAgIF9NX2luaXRfZGlhZ29uYWwoX19tZWFuYmVnaW4sIF9fbWVhbmVuZCwKKwkJCSAgICAgX192YXJjb3ZiZWdpbiwgX192YXJjb3ZlbmQpOworCX0KKworCXBhcmFtX3R5cGUoc3RkOjppbml0aWFsaXplcl9saXN0PF9SZWFsVHlwZT4gX19tZWFuLAorCQkgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1JlYWxUeXBlPiBfX3ZhcmNvdikKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19tZWFuLnNpemUoKSA8PSBfRGltZW4pOworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9fdmFyY292LnNpemUoKSA9PSBfRGltZW4gKiBfRGltZW4KKwkJCQl8fCBfX3ZhcmNvdi5zaXplKCkgPT0gX0RpbWVuICogKF9EaW1lbiArIDEpIC8gMgorCQkJCXx8IF9fdmFyY292LnNpemUoKSA9PSBfRGltZW4pOworCisJICBpZiAoX192YXJjb3Yuc2l6ZSgpID09IF9EaW1lbiAqIF9EaW1lbikKKwkgICAgX01faW5pdF9mdWxsKF9fbWVhbi5iZWdpbigpLCBfX21lYW4uZW5kKCksCisJCQkgX192YXJjb3YuYmVnaW4oKSwgX192YXJjb3YuZW5kKCkpOworCSAgZWxzZSBpZiAoX192YXJjb3Yuc2l6ZSgpID09IF9EaW1lbiAqIChfRGltZW4gKyAxKSAvIDIpCisJICAgIF9NX2luaXRfbG93ZXIoX19tZWFuLmJlZ2luKCksIF9fbWVhbi5lbmQoKSwKKwkJCSAgX192YXJjb3YuYmVnaW4oKSwgX192YXJjb3YuZW5kKCkpOworCSAgZWxzZQorCSAgICBfTV9pbml0X2RpYWdvbmFsKF9fbWVhbi5iZWdpbigpLCBfX21lYW4uZW5kKCksCisJCQkgICAgIF9fdmFyY292LmJlZ2luKCksIF9fdmFyY292LmVuZCgpKTsKKwl9CisKKwlzdGQ6OmFycmF5PF9SZWFsVHlwZSwgX0RpbWVuPgorCW1lYW4oKSBjb25zdAorCXsgcmV0dXJuIF9NX21lYW47IH0KKworCXN0ZDo6YXJyYXk8X1JlYWxUeXBlLCBfTV90X3NpemU+CisJdmFyY292KCkgY29uc3QKKwl7IHJldHVybiBfTV90OyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX21lYW4gPT0gX19wMi5fTV9tZWFuICYmIF9fcDEuX01fdCA9PSBfX3AyLl9NX3Q7IH0KKworICAgICAgcHJpdmF0ZToKKwl0ZW1wbGF0ZSA8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjI+CisJICB2b2lkIF9NX2luaXRfZnVsbChfSW5wdXRJdGVyYXRvcjEgX19tZWFuYmVnaW4sCisJCQkgICAgX0lucHV0SXRlcmF0b3IxIF9fbWVhbmVuZCwKKwkJCSAgICBfSW5wdXRJdGVyYXRvcjIgX192YXJjb3ZiZWdpbiwKKwkJCSAgICBfSW5wdXRJdGVyYXRvcjIgX192YXJjb3ZlbmQpOworCXRlbXBsYXRlIDx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMj4KKwkgIHZvaWQgX01faW5pdF9sb3dlcihfSW5wdXRJdGVyYXRvcjEgX19tZWFuYmVnaW4sCisJCQkgICAgIF9JbnB1dEl0ZXJhdG9yMSBfX21lYW5lbmQsCisJCQkgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX3ZhcmNvdmJlZ2luLAorCQkJICAgICBfSW5wdXRJdGVyYXRvcjIgX192YXJjb3ZlbmQpOworCXRlbXBsYXRlIDx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMj4KKwkgIHZvaWQgX01faW5pdF9kaWFnb25hbChfSW5wdXRJdGVyYXRvcjEgX19tZWFuYmVnaW4sCisJCQkJX0lucHV0SXRlcmF0b3IxIF9fbWVhbmVuZCwKKwkJCQlfSW5wdXRJdGVyYXRvcjIgX192YXJiZWdpbiwKKwkJCQlfSW5wdXRJdGVyYXRvcjIgX192YXJlbmQpOworCisJc3RkOjphcnJheTxfUmVhbFR5cGUsIF9EaW1lbj4gX01fbWVhbjsKKwlzdGQ6OmFycmF5PF9SZWFsVHlwZSwgX01fdF9zaXplPiBfTV90OworICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIG5vcm1hbF9tdl9kaXN0cmlidXRpb24oKQorICAgICAgOiBfTV9wYXJhbSgpLCBfTV9uZCgpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyPgorCW5vcm1hbF9tdl9kaXN0cmlidXRpb24oX0ZvcndhcmRJdGVyYXRvcjEgX19tZWFuYmVnaW4sCisJCQkgICAgICAgX0ZvcndhcmRJdGVyYXRvcjEgX19tZWFuZW5kLAorCQkJICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fdmFyY292YmVnaW4sCisJCQkgICAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX192YXJjb3ZlbmQpCisJOiBfTV9wYXJhbShfX21lYW5iZWdpbiwgX19tZWFuZW5kLCBfX3ZhcmNvdmJlZ2luLCBfX3ZhcmNvdmVuZCksCisJICBfTV9uZCgpCisJeyB9CisKKyAgICAgIG5vcm1hbF9tdl9kaXN0cmlidXRpb24oc3RkOjppbml0aWFsaXplcl9saXN0PF9SZWFsVHlwZT4gX19tZWFuLAorCQkJICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1JlYWxUeXBlPiBfX3ZhcmNvdikKKyAgICAgIDogX01fcGFyYW0oX19tZWFuLCBfX3ZhcmNvdiksIF9NX25kKCkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgbm9ybWFsX212X2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksIF9NX25kKCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyBfTV9uZC5yZXNldCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIG1lYW4gb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1lYW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ubWVhbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGNvbXBhY3QgZm9ybSBvZiB0aGUgdmFyaWFuY2UvY292YXJpYW5jZQorICAgICAgICogbWF0cml4IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHN0ZDo6YXJyYXk8X1JlYWxUeXBlLCBfRGltZW4gKiAoX0RpbWVuICsgMSkgLyAyPgorICAgICAgdmFyY292KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLnZhcmNvdigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmVzdWx0X3R5cGUgX19yZXM7CisJX19yZXMuZmlsbChzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Omxvd2VzdCgpKTsKKwlyZXR1cm4gX19yZXM7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJlc3VsdF90eXBlIF9fcmVzOworCV9fcmVzLmZpbGwoc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXgoKSk7CisJcmV0dXJuIF9fcmVzOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHJldHVybiB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gbXVsdGktdmFyaWFudCBub3JtYWwgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkCisgICAgICAgKiAgICAgICAgYmUgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8c2l6ZV90IF9EaW1lbjEsIHR5cGVuYW1lIF9SZWFsVHlwZTE+CisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0CisJCSAgIF9fZ251X2N4eDo6bm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4xLCBfUmVhbFR5cGUxPiYKKwkJICAgX19kMSwKKwkJICAgY29uc3QKKwkJICAgX19nbnVfY3h4Ojpub3JtYWxfbXZfZGlzdHJpYnV0aW9uPF9EaW1lbjEsIF9SZWFsVHlwZTE+JgorCQkgICBfX2QyKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVub3JtYWxfbXZfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVub3JtYWxfbXZfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHNpemVfdCBfRGltZW4xLCB0eXBlbmFtZSBfUmVhbFR5cGUxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0CisJCSAgIF9fZ251X2N4eDo6bm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4xLCBfUmVhbFR5cGUxPiYKKwkJICAgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlbm9ybWFsX212X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJW5vcm1hbF9tdl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yCisgICAgICAgKiAgICAgICAgICBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8c2l6ZV90IF9EaW1lbjEsIHR5cGVuYW1lIF9SZWFsVHlwZTEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgX19nbnVfY3h4Ojpub3JtYWxfbXZfZGlzdHJpYnV0aW9uPF9EaW1lbjEsIF9SZWFsVHlwZTE+JgorCQkgICBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisgICAgICBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBfTV9uZDsKKyAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBtdWx0aS12YXJpYXRlIG5vcm1hbCBkaXN0cmlidXRpb25zIGFyZQorICAgKiBkaWZmZXJlbnQuCisgICAqLworICB0ZW1wbGF0ZTxzaXplX3QgX0RpbWVuLCB0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9fZ251X2N4eDo6bm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4sIF9SZWFsVHlwZT4mCisJICAgICAgIF9fZDEsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6bm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4sIF9SZWFsVHlwZT4mCisJICAgICAgIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgUmljZSBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgUmljZSBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGlzCisgICAqIEBmWworICAgKiAgICAgcCh4fFxudSxcc2lnbWEpID0gXGZyYWN7eH17XHNpZ21hXjJ9CisgICAqICAgICAgICAgICAgICAgICAgICAgICBcZXhwXGxlZnQoLVxmcmFje3heMitcbnVeMn17MlxzaWdtYV4yfVxyaWdodCkKKyAgICogICAgICAgICAgICAgICAgICAgICAgIElfMFxsZWZ0KFxmcmFje3ggXG51fXtcc2lnbWFeMn1ccmlnaHQpCisgICAqIEBmXQorICAgKiB3aGVyZSBAZiRJXzAoeilAZiQgaXMgdGhlIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZAorICAgKiBvZiBvcmRlciAwIGFuZCBAZiRcbnUgPj0gMEBmJCBhbmQgQGYkXHNpZ21hID4gMEBmJC4KKyAgICoKKyAgICogPHRhYmxlIGJvcmRlcj0xIGNlbGxwYWRkaW5nPTEwIGNlbGxzcGFjaW5nPTA+CisgICAqIDxjYXB0aW9uIGFsaWduPXRvcD5EaXN0cmlidXRpb24gU3RhdGlzdGljczwvY2FwdGlvbj4KKyAgICogPHRyPjx0ZD5NZWFuPC90ZD48dGQ+QGYkXHNxcnR7XHBpLzJ9TF97MS8yfSgtXG51XjIvMlxzaWdtYV4yKUBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5WYXJpYW5jZTwvdGQ+PHRkPkBmJDJcc2lnbWFeMiArIFxudV4yCisgICAqICAgICAgICAgICAgICAgICAgICsgKFxwaVxzaWdtYV4yLzIpTF4yX3sxLzJ9KC1cbnVeMi8yXHNpZ21hXjIpQGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPlJhbmdlPC90ZD48dGQ+QGYkWzAsIFxpbmZ0eSlAZiQ8L3RkPjwvdHI+CisgICAqIDwvdGFibGU+CisgICAqIHdoZXJlIEBmJExfezEvMn0oeClAZiQgaXMgdGhlIExhZ3VlcnJlIHBvbHlub21pYWwgb2Ygb3JkZXIgMS8yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzCisgICAgcmljZV9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIHJpY2VfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCXBhcmFtX3R5cGUocmVzdWx0X3R5cGUgX19udV92YWwgPSByZXN1bHRfdHlwZSgwKSwKKwkJICAgcmVzdWx0X3R5cGUgX19zaWdtYV92YWwgPSByZXN1bHRfdHlwZSgxKSkKKwk6IF9NX251KF9fbnVfdmFsKSwgX01fc2lnbWEoX19zaWdtYV92YWwpCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX251ID49IHJlc3VsdF90eXBlKDApKTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9zaWdtYSA+IHJlc3VsdF90eXBlKDApKTsKKwl9CisKKwlyZXN1bHRfdHlwZQorCW51KCkgY29uc3QKKwl7IHJldHVybiBfTV9udTsgfQorCisJcmVzdWx0X3R5cGUKKwlzaWdtYSgpIGNvbnN0CisJeyByZXR1cm4gX01fc2lnbWE7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fbnUgPT0gX19wMi5fTV9udQorCSAgICAgICYmIF9fcDEuX01fc2lnbWEgPT0gX19wMi5fTV9zaWdtYTsgfQorCisgICAgICBwcml2YXRlOgorCXZvaWQgX01faW5pdGlhbGl6ZSgpOworCisJcmVzdWx0X3R5cGUgX01fbnU7CisJcmVzdWx0X3R5cGUgX01fc2lnbWE7CisgICAgICB9OworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RvcnMuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICByaWNlX2Rpc3RyaWJ1dGlvbihyZXN1bHRfdHlwZSBfX251X3ZhbCA9IHJlc3VsdF90eXBlKDApLAorCQkJcmVzdWx0X3R5cGUgX19zaWdtYV92YWwgPSByZXN1bHRfdHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19udV92YWwsIF9fc2lnbWFfdmFsKSwKKwlfTV9uZHgoX19udV92YWwsIF9fc2lnbWFfdmFsKSwKKwlfTV9uZHkocmVzdWx0X3R5cGUoMCksIF9fc2lnbWFfdmFsKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICByaWNlX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksCisJX01fbmR4KF9fcC5udSgpLCBfX3Auc2lnbWEoKSksCisJX01fbmR5KHJlc3VsdF90eXBlKDApLCBfX3Auc2lnbWEoKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeworCV9NX25keC5yZXNldCgpOworCV9NX25keS5yZXNldCgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG51KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm51KCk7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIHNpZ21hKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLnNpZ21hKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gcmVzdWx0X3R5cGUoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsKKwkgIHJlc3VsdF90eXBlIF9feCA9IHRoaXMtPl9NX25keChfX3VybmcpOworCSAgcmVzdWx0X3R5cGUgX195ID0gdGhpcy0+X01fbmR5KF9fdXJuZyk7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCSAgcmV0dXJuIHN0ZDo6aHlwb3QoX194LCBfX3kpOworI2Vsc2UKKwkgIHJldHVybiBzdGQ6OnNxcnQoX194ICogX194ICsgX195ICogX195KTsKKyNlbmRpZgorCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7CisJICB0eXBlbmFtZSBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+OjpwYXJhbV90eXBlCisJICAgIF9fcHgoX19wLm51KCksIF9fcC5zaWdtYSgpKSwgX19weShyZXN1bHRfdHlwZSgwKSwgX19wLnNpZ21hKCkpOworCSAgcmVzdWx0X3R5cGUgX194ID0gdGhpcy0+X01fbmR4KF9fcHgsIF9fdXJuZyk7CisJICByZXN1bHRfdHlwZSBfX3kgPSB0aGlzLT5fTV9uZHkoX19weSwgX191cm5nKTsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJICByZXR1cm4gc3RkOjpoeXBvdChfX3gsIF9feSk7CisjZWxzZQorCSAgcmV0dXJuIHN0ZDo6c3FydChfX3ggKiBfX3ggKyBfX3kgKiBfX3kpOworI2VuZGlmCisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBSaWNlIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgICAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMgYW5kIHRoZSBzZXF1ZW5jZXMgdGhhdCB3b3VsZAorICAgICAgICogICAgICAgIGJlIGdlbmVyYXRlZCBhcmUgZXF1YWwuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHJpY2VfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgcmljZV9kaXN0cmlidXRpb24mIF9fZDIpCisgICAgICB7IHJldHVybiAoX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtCisJCSYmIF9fZDEuX01fbmR4ID09IF9fZDIuX01fbmR4CisJCSYmIF9fZDEuX01fbmR5ID09IF9fZDIuX01fbmR5KTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJXJpY2VfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVyaWNlX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBjb25zdCByaWNlX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVyaWNlX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggQSAlcmljZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICByaWNlX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisKKyAgICAgIHN0ZDo6bm9ybWFsX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX01fbmR4OworICAgICAgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfTV9uZHk7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBSaWNlIGRpc3RyaWJ1dGlvbnMgYXJlIG5vdCBlcXVhbC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHJpY2VfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX2QxLAorCSAgICAgICBjb25zdCByaWNlX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBOYWthZ2FtaSBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgTmFrYWdhbWkgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpcworICAgKiBAZlsKKyAgICogICAgIHAoeHxcbXUsXG9tZWdhKSA9IFxmcmFjezJcbXVeXG11fXtcR2FtbWEoXG11KVxvbWVnYV5cbXV9CisgICAqICAgICAgICAgICAgICAgICAgICAgICB4XnsyXG11LTF9ZV57LVxtdSB4IC8gXG9tZWdhfQorICAgKiBAZl0KKyAgICogd2hlcmUgQGYkXEdhbW1hKHopQGYkIGlzIHRoZSBnYW1tYSBmdW5jdGlvbiBhbmQgQGYkXG11ID49IDAuNUBmJAorICAgKiBhbmQgQGYkXG9tZWdhID4gMEBmJC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcworICAgIG5ha2FnYW1pX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBuYWthZ2FtaV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBfX211X3ZhbCA9IHJlc3VsdF90eXBlKDEpLAorCQkgICByZXN1bHRfdHlwZSBfX29tZWdhX3ZhbCA9IHJlc3VsdF90eXBlKDEpKQorCTogX01fbXUoX19tdV92YWwpLCBfTV9vbWVnYShfX29tZWdhX3ZhbCkKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fbXUgPj0gcmVzdWx0X3R5cGUoMC41TCkpOworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX29tZWdhID4gcmVzdWx0X3R5cGUoMCkpOworCX0KKworCXJlc3VsdF90eXBlCisJbXUoKSBjb25zdAorCXsgcmV0dXJuIF9NX211OyB9CisKKwlyZXN1bHRfdHlwZQorCW9tZWdhKCkgY29uc3QKKwl7IHJldHVybiBfTV9vbWVnYTsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9tdSA9PSBfX3AyLl9NX211CisJICAgICAgJiYgX19wMS5fTV9vbWVnYSA9PSBfX3AyLl9NX29tZWdhOyB9CisKKyAgICAgIHByaXZhdGU6CisJdm9pZCBfTV9pbml0aWFsaXplKCk7CisKKwlyZXN1bHRfdHlwZSBfTV9tdTsKKwlyZXN1bHRfdHlwZSBfTV9vbWVnYTsKKyAgICAgIH07CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdG9ycy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG5ha2FnYW1pX2Rpc3RyaWJ1dGlvbihyZXN1bHRfdHlwZSBfX211X3ZhbCA9IHJlc3VsdF90eXBlKDEpLAorCQkJICAgIHJlc3VsdF90eXBlIF9fb21lZ2FfdmFsID0gcmVzdWx0X3R5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fbXVfdmFsLCBfX29tZWdhX3ZhbCksCisJX01fZ2QoX19tdV92YWwsIF9fb21lZ2FfdmFsIC8gX19tdV92YWwpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIG5ha2FnYW1pX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksCisJX01fZ2QoX19wLm11KCksIF9fcC5vbWVnYSgpIC8gX19wLm11KCkpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fZ2QucmVzZXQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG11KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm11KCk7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9tZWdhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm9tZWdhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gcmVzdWx0X3R5cGUoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHN0ZDo6c3FydCh0aGlzLT5fTV9nZChfX3VybmcpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsKKwkgIHR5cGVuYW1lIHN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPjo6cGFyYW1fdHlwZQorCSAgICBfX3BnKF9fcC5tdSgpLCBfX3Aub21lZ2EoKSAvIF9fcC5tdSgpKTsKKwkgIHJldHVybiBzdGQ6OnNxcnQodGhpcy0+X01fZ2QoX19wZywgX191cm5nKSk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBOYWthZ2FtaSBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQKKyAgICAgICAqICAgICAgICBiZSBnZW5lcmF0ZWQgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBuYWthZ2FtaV9kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCBuYWthZ2FtaV9kaXN0cmlidXRpb24mIF9fZDIpCisgICAgICB7IHJldHVybiAoX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtCisJCSYmIF9fZDEuX01fZ2QgPT0gX19kMi5fTV9nZCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVuYWthZ2FtaV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJW5ha2FnYW1pX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBjb25zdCBuYWthZ2FtaV9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlbmFrYWdhbWlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCBBICVuYWthZ2FtaV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBuYWthZ2FtaV9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworCisgICAgICBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX01fZ2Q7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBOYWthZ2FtaSBkaXN0cmlidXRpb25zIGFyZSBub3QgZXF1YWwuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG5ha2FnYW1pX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBuYWthZ2FtaV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBQYXJldG8gY29udGludW91cyBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIFBhcmV0byBjdW11bGF0aXZlIHByb2JhYmlsaXR5IGZ1bmN0aW9uIGlzCisgICAqIEBmWworICAgKiAgICAgUCh4fFxhbHBoYSxcbXUpID0gMSAtIFxsZWZ0KFxmcmFje1xtdX17eH1ccmlnaHQpXlxhbHBoYQorICAgKiBAZl0KKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBQYXJldG8gcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpcworICAgKiBAZlsKKyAgICogICAgIHAoeHxcYWxwaGEsXG11KSA9IFxmcmFje1xhbHBoYSArIDF9e1xtdX0KKyAgICogICAgICAgICAgICAgICAgICAgICAgIFxsZWZ0KFxmcmFje1xtdX17eH1ccmlnaHQpXntcYWxwaGEgKyAxfQorICAgKiBAZl0KKyAgICogd2hlcmUgQGYkeCA+PSBcbXVAZiQgYW5kIEBmJFxtdSA+IDBAZiQsIEBmJFxhbHBoYSA+IDBAZiQuCisgICAqCisgICAqIDx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0xMCBjZWxsc3BhY2luZz0wPgorICAgKiA8Y2FwdGlvbiBhbGlnbj10b3A+RGlzdHJpYnV0aW9uIFN0YXRpc3RpY3M8L2NhcHRpb24+CisgICAqIDx0cj48dGQ+TWVhbjwvdGQ+PHRkPkBmJFxhbHBoYSBcbXUgLyAoXGFscGhhIC0gMSlAZiQKKyAgICogICAgICAgICAgICAgIGZvciBAZiRcYWxwaGEgPiAxQGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPlZhcmlhbmNlPC90ZD48dGQ+QGYkXGFscGhhIFxtdV4yIC8gWyhcYWxwaGEgLSAxKV4yKFxhbHBoYSAtIDIpXUBmJAorICAgKiAgICAgICAgICAgICAgZm9yIEBmJFxhbHBoYSA+IDJAZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+UmFuZ2U8L3RkPjx0ZD5AZiRbXG11LCBcaW5mdHkpQGYkPC90ZD48L3RyPgorICAgKiA8L3RhYmxlPgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzCisgICAgcGFyZXRvX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBwYXJldG9fZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCXBhcmFtX3R5cGUocmVzdWx0X3R5cGUgX19hbHBoYV92YWwgPSByZXN1bHRfdHlwZSgxKSwKKwkJICAgcmVzdWx0X3R5cGUgX19tdV92YWwgPSByZXN1bHRfdHlwZSgxKSkKKwk6IF9NX2FscGhhKF9fYWxwaGFfdmFsKSwgX01fbXUoX19tdV92YWwpCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX2FscGhhID4gcmVzdWx0X3R5cGUoMCkpOworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX211ID4gcmVzdWx0X3R5cGUoMCkpOworCX0KKworCXJlc3VsdF90eXBlCisJYWxwaGEoKSBjb25zdAorCXsgcmV0dXJuIF9NX2FscGhhOyB9CisKKwlyZXN1bHRfdHlwZQorCW11KCkgY29uc3QKKwl7IHJldHVybiBfTV9tdTsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9hbHBoYSA9PSBfX3AyLl9NX2FscGhhICYmIF9fcDEuX01fbXUgPT0gX19wMi5fTV9tdTsgfQorCisgICAgICBwcml2YXRlOgorCXZvaWQgX01faW5pdGlhbGl6ZSgpOworCisJcmVzdWx0X3R5cGUgX01fYWxwaGE7CisJcmVzdWx0X3R5cGUgX01fbXU7CisgICAgICB9OworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RvcnMuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBwYXJldG9fZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIF9fYWxwaGFfdmFsID0gcmVzdWx0X3R5cGUoMSksCisJCQkgIHJlc3VsdF90eXBlIF9fbXVfdmFsID0gcmVzdWx0X3R5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fYWxwaGFfdmFsLCBfX211X3ZhbCksCisJX01fdWQoKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBwYXJldG9fZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKSwKKwlfTV91ZCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsKKwlfTV91ZC5yZXNldCgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIGFscGhhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmFscGhhKCk7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG11KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm11KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+bXUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeworCSAgcmV0dXJuIHRoaXMtPm11KCkgKiBzdGQ6OnBvdyh0aGlzLT5fTV91ZChfX3VybmcpLAorCQkJCSAgICAgICAtcmVzdWx0X3R5cGUoMSkgLyB0aGlzLT5hbHBoYSgpKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeworCSAgcmV0dXJuIF9fcC5tdSgpICogc3RkOjpwb3codGhpcy0+X01fdWQoX191cm5nKSwKKwkJCQkJICAgLXJlc3VsdF90eXBlKDEpIC8gX19wLmFscGhhKCkpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gUGFyZXRvIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgICAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMgYW5kIHRoZSBzZXF1ZW5jZXMgdGhhdCB3b3VsZAorICAgICAgICogICAgICAgIGJlIGdlbmVyYXRlZCBhcmUgZXF1YWwuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHBhcmV0b19kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCBwYXJldG9fZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gKF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbQorCQkmJiBfX2QxLl9NX3VkID09IF9fZDIuX01fdWQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlcGFyZXRvX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlcGFyZXRvX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBjb25zdCBwYXJldG9fZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJXBhcmV0b19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194IEEgJXBhcmV0b19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBwYXJldG9fZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfTV91ZDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIFBhcmV0byBkaXN0cmlidXRpb25zIGFyZSBub3QgZXF1YWwuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHBhcmV0b19kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3QgcGFyZXRvX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBIEsgY29udGludW91cyBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIEsgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpcworICAgKiBAZlsKKyAgICogICAgIHAoeHxcbGFtYmRhLCBcbXUsIFxudSkgPSBcZnJhY3syfXt4fQorICAgKiAgICAgICAgICAgICBcbGVmdChcZnJhY3tcbGFtYmRhXG51IHh9e1xtdX1ccmlnaHQpXntcZnJhY3tcbGFtYmRhICsgXG51fXsyfX0KKyAgICogICAgICAgICAgICAgXGZyYWN7MX17XEdhbW1hKFxsYW1iZGEpXEdhbW1hKFxudSl9CisgICAqICAgICAgICAgICAgIEtfe1xudSAtIFxsYW1iZGF9XGxlZnQoMlxzcXJ0e1xmcmFje1xsYW1iZGFcbnUgeH17XG11fX1ccmlnaHQpCisgICAqIEBmXQorICAgKiB3aGVyZSBAZiRJXzAoeilAZiQgaXMgdGhlIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQKKyAgICogb2Ygb3JkZXIgQGYkXG51IC0gXGxhbWJkYUBmJCBhbmQgQGYkXGxhbWJkYSA+IDBAZiQsIEBmJFxtdSA+IDBAZiQKKyAgICogYW5kIEBmJFxudSA+IDBAZiQuCisgICAqCisgICAqIDx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0xMCBjZWxsc3BhY2luZz0wPgorICAgKiA8Y2FwdGlvbiBhbGlnbj10b3A+RGlzdHJpYnV0aW9uIFN0YXRpc3RpY3M8L2NhcHRpb24+CisgICAqIDx0cj48dGQ+TWVhbjwvdGQ+PHRkPkBmJFxtdUBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5WYXJpYW5jZTwvdGQ+PHRkPkBmJFxtdV4yXGZyYWN7XGxhbWJkYSArIFxudSArIDF9e1xsYW1iZGFcbnV9QGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPlJhbmdlPC90ZD48dGQ+QGYkWzAsIFxpbmZ0eSlAZiQ8L3RkPjwvdHI+CisgICAqIDwvdGFibGU+CisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MKKyAgICBrX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBrX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlwYXJhbV90eXBlKHJlc3VsdF90eXBlIF9fbGFtYmRhX3ZhbCA9IHJlc3VsdF90eXBlKDEpLAorCQkgICByZXN1bHRfdHlwZSBfX211X3ZhbCA9IHJlc3VsdF90eXBlKDEpLAorCQkgICByZXN1bHRfdHlwZSBfX251X3ZhbCA9IHJlc3VsdF90eXBlKDEpKQorCTogX01fbGFtYmRhKF9fbGFtYmRhX3ZhbCksIF9NX211KF9fbXVfdmFsKSwgX01fbnUoX19udV92YWwpCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX2xhbWJkYSA+IHJlc3VsdF90eXBlKDApKTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9tdSA+IHJlc3VsdF90eXBlKDApKTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9udSA+IHJlc3VsdF90eXBlKDApKTsKKwl9CisKKwlyZXN1bHRfdHlwZQorCWxhbWJkYSgpIGNvbnN0CisJeyByZXR1cm4gX01fbGFtYmRhOyB9CisKKwlyZXN1bHRfdHlwZQorCW11KCkgY29uc3QKKwl7IHJldHVybiBfTV9tdTsgfQorCisJcmVzdWx0X3R5cGUKKwludSgpIGNvbnN0CisJeyByZXR1cm4gX01fbnU7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fbGFtYmRhID09IF9fcDIuX01fbGFtYmRhCisJICAgICAgJiYgX19wMS5fTV9tdSA9PSBfX3AyLl9NX211CisJICAgICAgJiYgX19wMS5fTV9udSA9PSBfX3AyLl9NX251OyB9CisKKyAgICAgIHByaXZhdGU6CisJdm9pZCBfTV9pbml0aWFsaXplKCk7CisKKwlyZXN1bHRfdHlwZSBfTV9sYW1iZGE7CisJcmVzdWx0X3R5cGUgX01fbXU7CisJcmVzdWx0X3R5cGUgX01fbnU7CisgICAgICB9OworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RvcnMuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBrX2Rpc3RyaWJ1dGlvbihyZXN1bHRfdHlwZSBfX2xhbWJkYV92YWwgPSByZXN1bHRfdHlwZSgxKSwKKwkJICAgICByZXN1bHRfdHlwZSBfX211X3ZhbCA9IHJlc3VsdF90eXBlKDEpLAorCQkgICAgIHJlc3VsdF90eXBlIF9fbnVfdmFsID0gcmVzdWx0X3R5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fbGFtYmRhX3ZhbCwgX19tdV92YWwsIF9fbnVfdmFsKSwKKwlfTV9nZDEoX19sYW1iZGFfdmFsLCByZXN1bHRfdHlwZSgxKSAvIF9fbGFtYmRhX3ZhbCksCisJX01fZ2QyKF9fbnVfdmFsLCBfX211X3ZhbCAvIF9fbnVfdmFsKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBrX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksCisJX01fZ2QxKF9fcC5sYW1iZGEoKSwgcmVzdWx0X3R5cGUoMSkgLyBfX3AubGFtYmRhKCkpLAorCV9NX2dkMihfX3AubnUoKSwgX19wLm11KCkgLyBfX3AubnUoKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeworCV9NX2dkMS5yZXNldCgpOworCV9NX2dkMi5yZXNldCgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIGxhbWJkYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5sYW1iZGEoKTsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbXUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ubXUoKTsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbnUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ubnUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYsIGNvbnN0IHBhcmFtX3R5cGUmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gSyBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQKKyAgICAgICAqICAgICAgICBiZSBnZW5lcmF0ZWQgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBrX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IGtfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gKF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbQorCQkmJiBfX2QxLl9NX2dkMSA9PSBfX2QyLl9NX2dkMQorCQkmJiBfX2QxLl9NX2dkMiA9PSBfX2QyLl9NX2dkMik7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVrX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAla19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgY29uc3Qga19kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAla19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194IEEgJWtfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAga19kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworCisgICAgICBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX01fZ2QxOworICAgICAgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX2dkMjsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIEsgZGlzdHJpYnV0aW9ucyBhcmUgbm90IGVxdWFsLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBrX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBrX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBbiBhcmNzaW5lIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBhcmNzaW5lIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXMKKyAgICogQGZbCisgICAqICAgICBwKHh8YSxiKSA9IFxmcmFjezF9e1xwaSBcc3FydHsoeCAtIGEpKGIgLSB4KX19CisgICAqIEBmXQorICAgKiB3aGVyZSBAZiR4ID49IGFAZiQgYW5kIEBmJHggPD0gYkBmJC4KKyAgICoKKyAgICogPHRhYmxlIGJvcmRlcj0xIGNlbGxwYWRkaW5nPTEwIGNlbGxzcGFjaW5nPTA+CisgICAqIDxjYXB0aW9uIGFsaWduPXRvcD5EaXN0cmlidXRpb24gU3RhdGlzdGljczwvY2FwdGlvbj4KKyAgICogPHRyPjx0ZD5NZWFuPC90ZD48dGQ+QGYkIChhICsgYikgLyAyIEBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5WYXJpYW5jZTwvdGQ+PHRkPkBmJCAoYiAtIGEpXjIgLyA4IEBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5SYW5nZTwvdGQ+PHRkPkBmJFthLCBiXUBmJDwvdGQ+PC90cj4KKyAgICogPC90YWJsZT4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcworICAgIGFyY3NpbmVfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIGFyY3NpbmVfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCXBhcmFtX3R5cGUocmVzdWx0X3R5cGUgX19hID0gcmVzdWx0X3R5cGUoMCksCisJCSAgIHJlc3VsdF90eXBlIF9fYiA9IHJlc3VsdF90eXBlKDEpKQorCTogX01fYShfX2EpLCBfTV9iKF9fYikKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fYSA8PSBfTV9iKTsKKwl9CisKKwlyZXN1bHRfdHlwZQorCWEoKSBjb25zdAorCXsgcmV0dXJuIF9NX2E7IH0KKworCXJlc3VsdF90eXBlCisJYigpIGNvbnN0CisJeyByZXR1cm4gX01fYjsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9hID09IF9fcDIuX01fYSAmJiBfX3AxLl9NX2IgPT0gX19wMi5fTV9iOyB9CisKKyAgICAgIHByaXZhdGU6CisJdm9pZCBfTV9pbml0aWFsaXplKCk7CisKKwlyZXN1bHRfdHlwZSBfTV9hOworCXJlc3VsdF90eXBlIF9NX2I7CisgICAgICB9OworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RvcnMuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBhcmNzaW5lX2Rpc3RyaWJ1dGlvbihyZXN1bHRfdHlwZSBfX2EgPSByZXN1bHRfdHlwZSgwKSwKKwkJCSAgIHJlc3VsdF90eXBlIF9fYiA9IHJlc3VsdF90eXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX2EsIF9fYiksCisJX01fdWQoLTEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMxMzIxNjkxNjM5NzUxNEwsCisJICAgICAgKzEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMxMzIxNjkxNjM5NzUxNEwpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGFyY3NpbmVfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKSwKKwlfTV91ZCgtMS41NzA3OTYzMjY3OTQ4OTY2MTkyMzEzMjE2OTE2Mzk3NTE0TCwKKwkgICAgICArMS41NzA3OTYzMjY3OTQ4OTY2MTkyMzEzMjE2OTE2Mzk3NTE0TCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyBfTV91ZC5yZXNldCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5hKCk7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIGIoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmEoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeworCSAgcmVzdWx0X3R5cGUgX194ID0gc3RkOjpzaW4odGhpcy0+X01fdWQoX191cm5nKSk7CisJICByZXR1cm4gKF9feCAqICh0aGlzLT5iKCkgLSB0aGlzLT5hKCkpCisJCSAgKyB0aGlzLT5hKCkgKyB0aGlzLT5iKCkpIC8gcmVzdWx0X3R5cGUoMik7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsKKwkgIHJlc3VsdF90eXBlIF9feCA9IHN0ZDo6c2luKHRoaXMtPl9NX3VkKF9fdXJuZykpOworCSAgcmV0dXJuIChfX3ggKiAoX19wLmIoKSAtIF9fcC5hKCkpCisJCSAgKyBfX3AuYSgpICsgX19wLmIoKSkgLyByZXN1bHRfdHlwZSgyKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGFyY3NpbmUgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkCisgICAgICAgKiAgICAgICAgYmUgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgYXJjc2luZV9kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCBhcmNzaW5lX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIChfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW0KKwkJJiYgX19kMS5fTV91ZCA9PSBfX2QyLl9NX3VkKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJWFyY3NpbmVfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVhcmNzaW5lX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBjb25zdCBhcmNzaW5lX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVhcmNzaW5lX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggQSAlYXJjc2luZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBhcmNzaW5lX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisKKyAgICAgIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX01fdWQ7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBhcmNzaW5lIGRpc3RyaWJ1dGlvbnMgYXJlIG5vdCBlcXVhbC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYXJjc2luZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3QgYXJjc2luZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBIb3l0IGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBIb3l0IHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXMKKyAgICogQGZbCisgICAqICAgICBwKHh8cSxcb21lZ2EpID0gXGZyYWN7KDEgKyBxXjIpeH17cVxvbWVnYX0KKyAgICogICAgICAgICAgICAgICAgICAgICBcZXhwXGxlZnQoLVxmcmFjeygxICsgcV4yKV4yIHheMn17NCBxXjIgXG9tZWdhfVxyaWdodCkKKyAgICogICAgICAgICAgICAgICAgICAgICAgIElfMFxsZWZ0KFxmcmFjeygxIC0gcV40KSB4XjJ9ezQgcV4yIFxvbWVnYX1ccmlnaHQpCisgICAqIEBmXQorICAgKiB3aGVyZSBAZiRJXzAoeilAZiQgaXMgdGhlIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZAorICAgKiBvZiBvcmRlciAwIGFuZCBAZiQwIDwgcSA8IDFAZiQuCisgICAqCisgICAqIDx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0xMCBjZWxsc3BhY2luZz0wPgorICAgKiA8Y2FwdGlvbiBhbGlnbj10b3A+RGlzdHJpYnV0aW9uIFN0YXRpc3RpY3M8L2NhcHRpb24+CisgICAqIDx0cj48dGQ+TWVhbjwvdGQ+PHRkPkBmJCBcc3FydHtcZnJhY3syfXtccGl9fSBcc3FydHtcZnJhY3tcb21lZ2F9ezEgKyBxXjJ9fQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgRSgxIC0gcV4yKSBAZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+VmFyaWFuY2U8L3RkPjx0ZD5AZiQgXG9tZWdhIFxsZWZ0KDEgLSBcZnJhY3syRV4yKDEgLSBxXjIpfQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xwaSAoMSArIHFeMil9XHJpZ2h0KSBAZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+UmFuZ2U8L3RkPjx0ZD5AZiRbMCwgXGluZnR5KUBmJDwvdGQ+PC90cj4KKyAgICogPC90YWJsZT4KKyAgICogd2hlcmUgQGYkRSh4KUBmJCBpcyB0aGUgZWxsaXB0aWMgZnVuY3Rpb24gb2YgdGhlIHNlY29uZCBraW5kLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzCisgICAgaG95dF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgaG95dF9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBfX3EgPSByZXN1bHRfdHlwZSgwLjVMKSwKKwkJICAgcmVzdWx0X3R5cGUgX19vbWVnYSA9IHJlc3VsdF90eXBlKDEpKQorCTogX01fcShfX3EpLCBfTV9vbWVnYShfX29tZWdhKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9xID4gcmVzdWx0X3R5cGUoMCkpOworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3EgPCByZXN1bHRfdHlwZSgxKSk7CisJfQorCisJcmVzdWx0X3R5cGUKKwlxKCkgY29uc3QKKwl7IHJldHVybiBfTV9xOyB9CisKKwlyZXN1bHRfdHlwZQorCW9tZWdhKCkgY29uc3QKKwl7IHJldHVybiBfTV9vbWVnYTsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9xID09IF9fcDIuX01fcQorCSAgICAgICYmIF9fcDEuX01fb21lZ2EgPT0gX19wMi5fTV9vbWVnYTsgfQorCisgICAgICBwcml2YXRlOgorCXZvaWQgX01faW5pdGlhbGl6ZSgpOworCisJcmVzdWx0X3R5cGUgX01fcTsKKwlyZXN1bHRfdHlwZSBfTV9vbWVnYTsKKyAgICAgIH07CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdG9ycy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGhveXRfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIF9fcSA9IHJlc3VsdF90eXBlKDAuNUwpLAorCQkJcmVzdWx0X3R5cGUgX19vbWVnYSA9IHJlc3VsdF90eXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX3EsIF9fb21lZ2EpLAorCV9NX2FkKHJlc3VsdF90eXBlKDAuNUwpICogKHJlc3VsdF90eXBlKDEpICsgX19xICogX19xKSwKKwkgICAgICByZXN1bHRfdHlwZSgwLjVMKSAqIChyZXN1bHRfdHlwZSgxKSArIF9fcSAqIF9fcSkKKwkJCQkvIChfX3EgKiBfX3EpKSwKKwlfTV9lZChyZXN1bHRfdHlwZSgxKSkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgaG95dF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLAorCV9NX2FkKHJlc3VsdF90eXBlKDAuNUwpICogKHJlc3VsdF90eXBlKDEpICsgX19wLnEoKSAqIF9fcC5xKCkpLAorCSAgICAgIHJlc3VsdF90eXBlKDAuNUwpICogKHJlc3VsdF90eXBlKDEpICsgX19wLnEoKSAqIF9fcC5xKCkpCisJCQkJLyAoX19wLnEoKSAqIF9fcC5xKCkpKSwKKwlfTV9lZChyZXN1bHRfdHlwZSgxKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeworCV9NX2FkLnJlc2V0KCk7CisJX01fZWQucmVzZXQoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBxKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLnEoKTsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb21lZ2EoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ub21lZ2EoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gSG95dCBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQKKyAgICAgICAqICAgICAgICBiZSBnZW5lcmF0ZWQgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBob3l0X2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IGhveXRfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gKF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbQorCQkmJiBfX2QxLl9NX2FkID09IF9fZDIuX01fYWQKKwkJJiYgX19kMS5fTV9lZCA9PSBfX2QyLl9NX2VkKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJWhveXRfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVob3l0X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBjb25zdCBob3l0X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVob3l0X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggQSAlaG95dF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBob3l0X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisKKyAgICAgIF9fZ251X2N4eDo6YXJjc2luZV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX2FkOworICAgICAgc3RkOjpleHBvbmVudGlhbF9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX2VkOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gSG95dCBkaXN0cmlidXRpb25zIGFyZSBub3QgZXF1YWwuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGhveXRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IGhveXRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgdHJpYW5ndWxhciBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIHRyaWFuZ3VsYXIgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpcworICAgKiBAZlsKKyAgICogICAgICAgICAgICAgICAgICAvIDAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IDwgYQorICAgKiAgICAgcCh4fGEsYixjKSA9IHwgXGZyYWN7Mih4LWEpfXsoYy1hKShiLWEpfSAgZm9yIGEgPD0geCA8PSBiCisgICAqICAgICAgICAgICAgICAgICAgfCBcZnJhY3syKGMteCl9eyhjLWEpKGMtYil9ICBmb3IgYiA8IHggPD0gYworICAgKiAgICAgICAgICAgICAgICAgIFwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGMgPCB4CisgICAqIEBmXQorICAgKgorICAgKiA8dGFibGUgYm9yZGVyPTEgY2VsbHBhZGRpbmc9MTAgY2VsbHNwYWNpbmc9MD4KKyAgICogPGNhcHRpb24gYWxpZ249dG9wPkRpc3RyaWJ1dGlvbiBTdGF0aXN0aWNzPC9jYXB0aW9uPgorICAgKiA8dHI+PHRkPk1lYW48L3RkPjx0ZD5AZiQgXGZyYWN7YStiK2N9ezJ9IEBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5WYXJpYW5jZTwvdGQ+PHRkPkBmJCBcZnJhY3thXjIrYl4yK2NeMi1hYi1hYy1iY30KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxOH1AZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+UmFuZ2U8L3RkPjx0ZD5AZiRbYSwgY11AZiQ8L3RkPjwvdHI+CisgICAqIDwvdGFibGU+CisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgdHJpYW5ndWxhcl9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCWZyaWVuZCBjbGFzcyB0cmlhbmd1bGFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX2EgPSBfUmVhbFR5cGUoMCksCisJCSAgIF9SZWFsVHlwZSBfX2IgPSBfUmVhbFR5cGUoMC41KSwKKwkJICAgX1JlYWxUeXBlIF9fYyA9IF9SZWFsVHlwZSgxKSkKKwk6IF9NX2EoX19hKSwgX01fYihfX2IpLCBfTV9jKF9fYykKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fYSA8PSBfTV9iKTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9iIDw9IF9NX2MpOworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX2EgPCBfTV9jKTsKKworCSAgX01fcl9hYiA9IChfTV9iIC0gX01fYSkgLyAoX01fYyAtIF9NX2EpOworCSAgX01fZl9hYl9hYyA9IChfTV9iIC0gX01fYSkgKiAoX01fYyAtIF9NX2EpOworCSAgX01fZl9iY19hYyA9IChfTV9jIC0gX01fYikgKiAoX01fYyAtIF9NX2EpOworCX0KKworCV9SZWFsVHlwZQorCWEoKSBjb25zdAorCXsgcmV0dXJuIF9NX2E7IH0KKworCV9SZWFsVHlwZQorCWIoKSBjb25zdAorCXsgcmV0dXJuIF9NX2I7IH0KKworCV9SZWFsVHlwZQorCWMoKSBjb25zdAorCXsgcmV0dXJuIF9NX2M7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIChfX3AxLl9NX2EgPT0gX19wMi5fTV9hICYmIF9fcDEuX01fYiA9PSBfX3AyLl9NX2IKKwkJICAmJiBfX3AxLl9NX2MgPT0gX19wMi5fTV9jKTsgfQorCisgICAgICBwcml2YXRlOgorCisJX1JlYWxUeXBlIF9NX2E7CisJX1JlYWxUeXBlIF9NX2I7CisJX1JlYWxUeXBlIF9NX2M7CisJX1JlYWxUeXBlIF9NX3JfYWI7CisJX1JlYWxUeXBlIF9NX2ZfYWJfYWM7CisJX1JlYWxUeXBlIF9NX2ZfYmNfYWM7CisgICAgICB9OworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgdHJpYW5nbGUgZGlzdHJpYnV0aW9uIHdpdGggcGFyYW1ldGVycworICAgICAgICogQGYkIGEgQGYkLCBAZiQgYiBAZiQgYW5kIEBmJCBjIEBmJC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHRyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIF9fYSA9IHJlc3VsdF90eXBlKDApLAorCQkJICAgICAgcmVzdWx0X3R5cGUgX19iID0gcmVzdWx0X3R5cGUoMC41KSwKKwkJCSAgICAgIHJlc3VsdF90eXBlIF9fYyA9IHJlc3VsdF90eXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX2EsIF9fYiwgX19jKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB0cmlhbmd1bGFyX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIEBmJCBhIEBmJCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5hKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgQGYkIGIgQGYkIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBiKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBAZiQgYyBAZiQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIGMoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYygpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLl9NX2E7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5fTV9jOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeworCSAgc3RkOjpfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorCSAgICBfX2F1cm5nKF9fdXJuZyk7CisJICByZXN1bHRfdHlwZSBfX3JuZCA9IF9fYXVybmcoKTsKKwkgIGlmIChfX3JuZCA8PSBfX3AuX01fcl9hYikKKwkgICAgcmV0dXJuIF9fcC5hKCkgKyBzdGQ6OnNxcnQoX19ybmQgKiBfX3AuX01fZl9hYl9hYyk7CisJICBlbHNlCisJICAgIHJldHVybiBfX3AuYygpIC0gc3RkOjpzcXJ0KChyZXN1bHRfdHlwZSgxKSAtIF9fcm5kKQorCQkJCSAgICAgICAqIF9fcC5fTV9mX2JjX2FjKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIHRyaWFuZ2xlIGRpc3RyaWJ1dGlvbnMgaGF2ZSB0aGUgc2FtZQorICAgICAgICogICAgICAgIHBhcmFtZXRlcnMgYW5kIHRoZSBzZXF1ZW5jZXMgdGhhdCB3b3VsZCBiZSBnZW5lcmF0ZWQKKyAgICAgICAqICAgICAgICBhcmUgZXF1YWwuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHRyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgdHJpYW5ndWxhcl9kaXN0cmlidXRpb24mIF9fZDIpCisgICAgICB7IHJldHVybiBfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICV0cmlhbmd1bGFyX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAldHJpYW5ndWxhcl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBfX2dudV9jeHg6OnRyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICV0cmlhbmd1bGFyX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXRyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBfX2dudV9jeHg6OnRyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byB0cmlhbmdsZSBkaXN0cmlidXRpb25zIGFyZSBkaWZmZXJlbnQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9fZ251X2N4eDo6dHJpYW5ndWxhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3QgX19nbnVfY3h4Ojp0cmlhbmd1bGFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgdm9uIE1pc2VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgdm9uIE1pc2VzIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXMKKyAgICogQGZbCisgICAqICAgICBwKHh8XG11LFxrYXBwYSkgPSBcZnJhY3tlXntca2FwcGEgXGNvcyh4LVxtdSl9fQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MlxwaSBJXzAoXGthcHBhKX0KKyAgICogQGZdCisgICAqCisgICAqIFRoZSBnZW5lcmF0aW5nIGZ1bmN0aW9ucyB1c2UgdGhlIG1ldGhvZCBhY2NvcmRpbmcgdG86CisgICAqCisgICAqIEQuIEouIEJlc3QgYW5kIE4uIEkuIEZpc2hlciwgMTk3OS4gIkVmZmljaWVudCBTaW11bGF0aW9uIG9mIHRoZQorICAgKiB2b24gTWlzZXMgRGlzdHJpYnV0aW9uIiwgSm91cm5hbCBvZiB0aGUgUm95YWwgU3RhdGlzdGljYWwgU29jaWV0eS4KKyAgICogU2VyaWVzIEMgKEFwcGxpZWQgU3RhdGlzdGljcyksIFZvbC4gMjgsIE5vLiAyLCBwcC4gMTUyLTE1Ny4KKyAgICoKKyAgICogPHRhYmxlIGJvcmRlcj0xIGNlbGxwYWRkaW5nPTEwIGNlbGxzcGFjaW5nPTA+CisgICAqIDxjYXB0aW9uIGFsaWduPXRvcD5EaXN0cmlidXRpb24gU3RhdGlzdGljczwvY2FwdGlvbj4KKyAgICogPHRyPjx0ZD5NZWFuPC90ZD48dGQ+QGYkIFxtdSBAZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+VmFyaWFuY2U8L3RkPjx0ZD5AZiQgMS1JXzEoXGthcHBhKS9JXzAoXGthcHBhKSBAZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+UmFuZ2U8L3RkPjx0ZD5AZiRbLVxwaSwgXHBpXUBmJDwvdGQ+PC90cj4KKyAgICogPC90YWJsZT4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyB2b25fbWlzZXNfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwlmcmllbmQgY2xhc3Mgdm9uX21pc2VzX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX211ID0gX1JlYWxUeXBlKDApLAorCQkgICBfUmVhbFR5cGUgX19rYXBwYSA9IF9SZWFsVHlwZSgxKSkKKwk6IF9NX211KF9fbXUpLCBfTV9rYXBwYShfX2thcHBhKQorCXsKKwkgIGNvbnN0IF9SZWFsVHlwZSBfX3BpID0gX19nbnVfY3h4OjpfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fcGk7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fbXUgPj0gLV9fcGkgJiYgX01fbXUgPD0gX19waSk7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fa2FwcGEgPj0gX1JlYWxUeXBlKDApKTsKKworCSAgYXV0byBfX3RhdSA9IHN0ZDo6c3FydChfUmVhbFR5cGUoNCkgKiBfTV9rYXBwYSAqIF9NX2thcHBhCisJCQkJICsgX1JlYWxUeXBlKDEpKSArIF9SZWFsVHlwZSgxKTsKKwkgIGF1dG8gX19yaG8gPSAoKF9fdGF1IC0gc3RkOjpzcXJ0KF9SZWFsVHlwZSgyKSAqIF9fdGF1KSkKKwkJCS8gKF9SZWFsVHlwZSgyKSAqIF9NX2thcHBhKSk7CisJICBfTV9yID0gKF9SZWFsVHlwZSgxKSArIF9fcmhvICogX19yaG8pIC8gKF9SZWFsVHlwZSgyKSAqIF9fcmhvKTsKKwl9CisKKwlfUmVhbFR5cGUKKwltdSgpIGNvbnN0CisJeyByZXR1cm4gX01fbXU7IH0KKworCV9SZWFsVHlwZQorCWthcHBhKCkgY29uc3QKKwl7IHJldHVybiBfTV9rYXBwYTsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gKF9fcDEuX01fbXUgPT0gX19wMi5fTV9tdQorCQkgICYmIF9fcDEuX01fa2FwcGEgPT0gX19wMi5fTV9rYXBwYSk7IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fbXU7CisJX1JlYWxUeXBlIF9NX2thcHBhOworCV9SZWFsVHlwZSBfTV9yOworICAgICAgfTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIHZvbiBNaXNlcyBkaXN0cmlidXRpb24gd2l0aCBwYXJhbWV0ZXJzCisgICAgICAgKiBAZiRcbXVAZiQgYW5kIEBmJFxrYXBwYUBmJC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHZvbl9taXNlc19kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19tdSA9IHJlc3VsdF90eXBlKDApLAorCQkJICAgICByZXN1bHRfdHlwZSBfX2thcHBhID0gcmVzdWx0X3R5cGUoMSkpCisJOiBfTV9wYXJhbShfX211LCBfX2thcHBhKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB2b25fbWlzZXNfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgQGYkIFxtdSBAZiQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG11KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm11KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgQGYkIFxrYXBwYSBAZiQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIGthcHBhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmthcHBhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeworCXJldHVybiAtX19nbnVfY3h4OjpfX21hdGhfY29uc3RhbnRzPHJlc3VsdF90eXBlPjo6X19waTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9fZ251X2N4eDo6X19tYXRoX2NvbnN0YW50czxyZXN1bHRfdHlwZT46Ol9fcGk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeworCSAgY29uc3QgcmVzdWx0X3R5cGUgX19waQorCSAgICA9IF9fZ251X2N4eDo6X19tYXRoX2NvbnN0YW50czxyZXN1bHRfdHlwZT46Ol9fcGk7CisJICBzdGQ6Ol9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICAgIF9fYXVybmcoX191cm5nKTsKKworCSAgcmVzdWx0X3R5cGUgX19mOworCSAgd2hpbGUgKDEpCisJICAgIHsKKwkgICAgICByZXN1bHRfdHlwZSBfX3JuZCA9IHN0ZDo6Y29zKF9fcGkgKiBfX2F1cm5nKCkpOworCSAgICAgIF9fZiA9IChyZXN1bHRfdHlwZSgxKSArIF9fcC5fTV9yICogX19ybmQpIC8gKF9fcC5fTV9yICsgX19ybmQpOworCSAgICAgIHJlc3VsdF90eXBlIF9fYyA9IF9fcC5fTV9rYXBwYSAqIChfX3AuX01fciAtIF9fZik7CisKKwkgICAgICByZXN1bHRfdHlwZSBfX3JuZDIgPSBfX2F1cm5nKCk7CisJICAgICAgaWYgKF9fYyAqIChyZXN1bHRfdHlwZSgyKSAtIF9fYykgPiBfX3JuZDIpCisJCWJyZWFrOworCSAgICAgIGlmIChzdGQ6OmxvZyhfX2MgLyBfX3JuZDIpID49IF9fYyAtIHJlc3VsdF90eXBlKDEpKQorCQlicmVhazsKKwkgICAgfQorCisJICByZXN1bHRfdHlwZSBfX3JlcyA9IHN0ZDo6YWNvcyhfX2YpOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKwkgIF9fcmVzID0gc3RkOjpjb3B5c2lnbihfX3JlcywgX19hdXJuZygpIC0gcmVzdWx0X3R5cGUoMC41KSk7CisjZWxzZQorCSAgaWYgKF9fYXVybmcoKSA8IHJlc3VsdF90eXBlKDAuNSkpCisJICAgIF9fcmVzID0gLV9fcmVzOworI2VuZGlmCisJICBfX3JlcyArPSBfX3AuX01fbXU7CisJICBpZiAoX19yZXMgPiBfX3BpKQorCSAgICBfX3JlcyAtPSByZXN1bHRfdHlwZSgyKSAqIF9fcGk7CisJICBlbHNlIGlmIChfX3JlcyA8IC1fX3BpKQorCSAgICBfX3JlcyArPSByZXN1bHRfdHlwZSgyKSAqIF9fcGk7CisJICByZXR1cm4gX19yZXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byB2b24gTWlzZXMgZGlzdHJpYnV0aW9ucyBoYXZlIHRoZSBzYW1lCisgICAgICAgKiAgICAgICAgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZAorICAgICAgICogICAgICAgIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3Qgdm9uX21pc2VzX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IHZvbl9taXNlc19kaXN0cmlidXRpb24mIF9fZDIpCisgICAgICB7IHJldHVybiBfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICV2b25fbWlzZXNfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICV2b25fbWlzZXNfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgX19nbnVfY3h4Ojp2b25fbWlzZXNfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICV2b25fbWlzZXNfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAldm9uX21pc2VzX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgX19nbnVfY3h4Ojp2b25fbWlzZXNfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byB2b24gTWlzZXMgZGlzdHJpYnV0aW9ucyBhcmUgZGlmZmVyZW50LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX2dudV9jeHg6OnZvbl9taXNlc19kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3QgX19nbnVfY3h4Ojp2b25fbWlzZXNfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBfX2dudV9jeHgKKworI2luY2x1ZGUgImV4dC9vcHRfcmFuZG9tLmgiCisjaW5jbHVkZSAicmFuZG9tLnRjYyIKKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9FWFRfUkFORE9NCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9yYW5kb20udGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcmFuZG9tLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDllMGVmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcmFuZG9tLnRjYwpAQCAtMCwwICsxLDEzMTQgQEAKKy8vIFJhbmRvbSBudW1iZXIgZXh0ZW5zaW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L3JhbmRvbS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtleHQvcmFuZG9tfQorICovCisKKyNpZm5kZWYgX0VYVF9SQU5ET01fVENDCisjZGVmaW5lIF9FWFRfUkFORE9NX1RDQyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyNpZiBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fbSwKKwkgICBzaXplX3QgX19wb3MxLCBzaXplX3QgX19zbDEsIHNpemVfdCBfX3NsMiwKKwkgICBzaXplX3QgX19zcjEsIHNpemVfdCBfX3NyMiwKKwkgICB1aW50MzJfdCBfX21zazEsIHVpbnQzMl90IF9fbXNrMiwKKwkgICB1aW50MzJfdCBfX21zazMsIHVpbnQzMl90IF9fbXNrNCwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTEsIHVpbnQzMl90IF9fcGFyaXR5MiwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTMsIHVpbnQzMl90IF9fcGFyaXR5ND4KKyAgICB2b2lkIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fbSwKKwkJCQkJICAgX19wb3MxLCBfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkJCQkJICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0LAorCQkJCQkgICBfX3Bhcml0eTEsIF9fcGFyaXR5MiwgX19wYXJpdHkzLAorCQkJCQkgICBfX3Bhcml0eTQ+OjoKKyAgICBzZWVkKF9VSW50VHlwZSBfX3NlZWQpCisgICAgeworICAgICAgX01fc3RhdGUzMlswXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihfX3NlZWQpOworICAgICAgZm9yIChzaXplX3QgX19pID0gMTsgX19pIDwgX01fbnN0YXRlMzI7ICsrX19pKQorCV9NX3N0YXRlMzJbX19pXSA9ICgxODEyNDMzMjUzVUwKKwkJCSAgICogKF9NX3N0YXRlMzJbX19pIC0gMV0gXiAoX01fc3RhdGUzMltfX2kgLSAxXSA+PiAzMCkpCisJCQkgICArIF9faSk7CisgICAgICBfTV9wb3MgPSBzdGF0ZV9zaXplOworICAgICAgX01fcGVyaW9kX2NlcnRpZmljYXRpb24oKTsKKyAgICB9CisKKworICBuYW1lc3BhY2UgeworCisgICAgaW5saW5lIHVpbnQzMl90IF9GdW5jMSh1aW50MzJfdCBfX3gpCisgICAgeworICAgICAgcmV0dXJuIChfX3ggXiAoX194ID4+IDI3KSkgKiBVSU5UMzJfQygxNjY0NTI1KTsKKyAgICB9CisKKyAgICBpbmxpbmUgdWludDMyX3QgX0Z1bmMyKHVpbnQzMl90IF9feCkKKyAgICB7CisgICAgICByZXR1cm4gKF9feCBeIChfX3ggPj4gMjcpKSAqIFVJTlQzMl9DKDE1NjYwODM5NDEpOworICAgIH0KKworICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX20sCisJICAgc2l6ZV90IF9fcG9zMSwgc2l6ZV90IF9fc2wxLCBzaXplX3QgX19zbDIsCisJICAgc2l6ZV90IF9fc3IxLCBzaXplX3QgX19zcjIsCisJICAgdWludDMyX3QgX19tc2sxLCB1aW50MzJfdCBfX21zazIsCisJICAgdWludDMyX3QgX19tc2szLCB1aW50MzJfdCBfX21zazQsCisJICAgdWludDMyX3QgX19wYXJpdHkxLCB1aW50MzJfdCBfX3Bhcml0eTIsCisJICAgdWludDMyX3QgX19wYXJpdHkzLCB1aW50MzJfdCBfX3Bhcml0eTQ+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXE+CisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NsYXNzPF9Tc2VxPjo6dmFsdWU+Ojp0eXBlCisgICAgICBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX20sCisJCQkJCV9fcG9zMSwgX19zbDEsIF9fc2wyLCBfX3NyMSwgX19zcjIsCisJCQkJCV9fbXNrMSwgX19tc2syLCBfX21zazMsIF9fbXNrNCwKKwkJCQkJX19wYXJpdHkxLCBfX3Bhcml0eTIsIF9fcGFyaXR5MywKKwkJCQkJX19wYXJpdHk0Pjo6CisgICAgICBzZWVkKF9Tc2VxJiBfX3EpCisgICAgICB7CisJc2l6ZV90IF9fbGFnOworCisJaWYgKF9NX25zdGF0ZTMyID49IDYyMykKKwkgIF9fbGFnID0gMTE7CisJZWxzZSBpZiAoX01fbnN0YXRlMzIgPj0gNjgpCisJICBfX2xhZyA9IDc7CisJZWxzZSBpZiAoX01fbnN0YXRlMzIgPj0gMzkpCisJICBfX2xhZyA9IDU7CisJZWxzZQorCSAgX19sYWcgPSAzOworCWNvbnN0IHNpemVfdCBfX21pZCA9IChfTV9uc3RhdGUzMiAtIF9fbGFnKSAvIDI7CisKKwlzdGQ6OmZpbGwoX01fc3RhdGUzMiwgX01fc3RhdGUzMiArIF9NX25zdGF0ZTMyLCBVSU5UMzJfQygweDhiOGI4YjhiKSk7CisJdWludDMyX3QgX19hcnJbX01fbnN0YXRlMzJdOworCV9fcS5nZW5lcmF0ZShfX2FyciArIDAsIF9fYXJyICsgX01fbnN0YXRlMzIpOworCisJdWludDMyX3QgX19yID0gX0Z1bmMxKF9NX3N0YXRlMzJbMF0gXiBfTV9zdGF0ZTMyW19fbWlkXQorCQkJICAgICAgXiBfTV9zdGF0ZTMyW19NX25zdGF0ZTMyICAtIDFdKTsKKwlfTV9zdGF0ZTMyW19fbWlkXSArPSBfX3I7CisJX19yICs9IF9NX25zdGF0ZTMyOworCV9NX3N0YXRlMzJbX19taWQgKyBfX2xhZ10gKz0gX19yOworCV9NX3N0YXRlMzJbMF0gPSBfX3I7CisKKwlmb3IgKHNpemVfdCBfX2kgPSAxLCBfX2ogPSAwOyBfX2ogPCBfTV9uc3RhdGUzMjsgKytfX2opCisJICB7CisJICAgIF9fciA9IF9GdW5jMShfTV9zdGF0ZTMyW19faV0KKwkJCSBeIF9NX3N0YXRlMzJbKF9faSArIF9fbWlkKSAlIF9NX25zdGF0ZTMyXQorCQkJIF4gX01fc3RhdGUzMlsoX19pICsgX01fbnN0YXRlMzIgLSAxKSAlIF9NX25zdGF0ZTMyXSk7CisJICAgIF9NX3N0YXRlMzJbKF9faSArIF9fbWlkKSAlIF9NX25zdGF0ZTMyXSArPSBfX3I7CisJICAgIF9fciArPSBfX2FycltfX2pdICsgX19pOworCSAgICBfTV9zdGF0ZTMyWyhfX2kgKyBfX21pZCArIF9fbGFnKSAlIF9NX25zdGF0ZTMyXSArPSBfX3I7CisJICAgIF9NX3N0YXRlMzJbX19pXSA9IF9fcjsKKwkgICAgX19pID0gKF9faSArIDEpICUgX01fbnN0YXRlMzI7CisJICB9CisJZm9yIChzaXplX3QgX19qID0gMDsgX19qIDwgX01fbnN0YXRlMzI7ICsrX19qKQorCSAgeworCSAgICBjb25zdCBzaXplX3QgX19pID0gKF9faiArIDEpICUgX01fbnN0YXRlMzI7CisJICAgIF9fciA9IF9GdW5jMihfTV9zdGF0ZTMyW19faV0KKwkJCSArIF9NX3N0YXRlMzJbKF9faSArIF9fbWlkKSAlIF9NX25zdGF0ZTMyXQorCQkJICsgX01fc3RhdGUzMlsoX19pICsgX01fbnN0YXRlMzIgLSAxKSAlIF9NX25zdGF0ZTMyXSk7CisJICAgIF9NX3N0YXRlMzJbKF9faSArIF9fbWlkKSAlIF9NX25zdGF0ZTMyXSBePSBfX3I7CisJICAgIF9fciAtPSBfX2k7CisJICAgIF9NX3N0YXRlMzJbKF9faSArIF9fbWlkICsgX19sYWcpICUgX01fbnN0YXRlMzJdIF49IF9fcjsKKwkgICAgX01fc3RhdGUzMltfX2ldID0gX19yOworCSAgfQorCisJX01fcG9zID0gc3RhdGVfc2l6ZTsKKwlfTV9wZXJpb2RfY2VydGlmaWNhdGlvbigpOworICAgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX19tLAorCSAgIHNpemVfdCBfX3BvczEsIHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLAorCSAgIHNpemVfdCBfX3NyMSwgc2l6ZV90IF9fc3IyLAorCSAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLAorCSAgIHVpbnQzMl90IF9fbXNrMywgdWludDMyX3QgX19tc2s0LAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MSwgdWludDMyX3QgX19wYXJpdHkyLAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MywgdWludDMyX3QgX19wYXJpdHk0PgorICAgIHZvaWQgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX19tLAorCQkJCQkgICBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCQkJCQkgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJCQkJCSAgIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsCisJCQkJCSAgIF9fcGFyaXR5ND46OgorICAgIF9NX3BlcmlvZF9jZXJ0aWZpY2F0aW9uKHZvaWQpCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IF9fcGFyaXR5WzRdID0geyBfX3Bhcml0eTEsIF9fcGFyaXR5MiwKKwkJCQkJICAgIF9fcGFyaXR5MywgX19wYXJpdHk0IH07CisgICAgICB1aW50MzJfdCBfX2lubmVyID0gMDsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IDQ7ICsrX19pKQorCWlmIChfX3Bhcml0eVtfX2ldICE9IDApCisJICBfX2lubmVyIF49IF9NX3N0YXRlMzJbX19pXSAmIF9fcGFyaXR5W19faV07CisKKyAgICAgIGlmIChfX2J1aWx0aW5fcGFyaXR5KF9faW5uZXIpICYgMSkKKwlyZXR1cm47CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCA0OyArK19faSkKKwlpZiAoX19wYXJpdHlbX19pXSAhPSAwKQorCSAgeworCSAgICBfTV9zdGF0ZTMyW19faV0gXj0gMSA8PCAoX19idWlsdGluX2ZmcyhfX3Bhcml0eVtfX2ldKSAtIDEpOworCSAgICByZXR1cm47CisJICB9CisgICAgICBfX2J1aWx0aW5fdW5yZWFjaGFibGUoKTsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX20sCisJICAgc2l6ZV90IF9fcG9zMSwgc2l6ZV90IF9fc2wxLCBzaXplX3QgX19zbDIsCisJICAgc2l6ZV90IF9fc3IxLCBzaXplX3QgX19zcjIsCisJICAgdWludDMyX3QgX19tc2sxLCB1aW50MzJfdCBfX21zazIsCisJICAgdWludDMyX3QgX19tc2szLCB1aW50MzJfdCBfX21zazQsCisJICAgdWludDMyX3QgX19wYXJpdHkxLCB1aW50MzJfdCBfX3Bhcml0eTIsCisJICAgdWludDMyX3QgX19wYXJpdHkzLCB1aW50MzJfdCBfX3Bhcml0eTQ+CisgICAgdm9pZCBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX20sCisJCQkJCSAgIF9fcG9zMSwgX19zbDEsIF9fc2wyLCBfX3NyMSwgX19zcjIsCisJCQkJCSAgIF9fbXNrMSwgX19tc2syLCBfX21zazMsIF9fbXNrNCwKKwkJCQkJICAgX19wYXJpdHkxLCBfX3Bhcml0eTIsIF9fcGFyaXR5MywKKwkJCQkJICAgX19wYXJpdHk0Pjo6CisgICAgZGlzY2FyZCh1bnNpZ25lZCBsb25nIGxvbmcgX196KQorICAgIHsKKyAgICAgIHdoaWxlIChfX3ogPiBzdGF0ZV9zaXplIC0gX01fcG9zKQorCXsKKwkgIF9feiAtPSBzdGF0ZV9zaXplIC0gX01fcG9zOworCisJICBfTV9nZW5fcmFuZCgpOworCX0KKworICAgICAgX01fcG9zICs9IF9fejsKKyAgICB9CisKKworI2lmbmRlZiAgX0dMSUJDWFhfT1BUX0hBVkVfUkFORE9NX1NGTVRfR0VOX1JFQUQKKworICBuYW1lc3BhY2UgeworCisgICAgdGVtcGxhdGU8c2l6ZV90IF9fc2hpZnQ+CisgICAgICBpbmxpbmUgdm9pZCBfX3JzaGlmdCh1aW50MzJfdCAqX19vdXQsIGNvbnN0IHVpbnQzMl90ICpfX2luKQorICAgICAgeworCXVpbnQ2NF90IF9fdGggPSAoKHN0YXRpY19jYXN0PHVpbnQ2NF90PihfX2luWzNdKSA8PCAzMikKKwkJCSB8IHN0YXRpY19jYXN0PHVpbnQ2NF90PihfX2luWzJdKSk7CisJdWludDY0X3QgX190bCA9ICgoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KF9faW5bMV0pIDw8IDMyKQorCQkJIHwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KF9faW5bMF0pKTsKKworCXVpbnQ2NF90IF9fb2ggPSBfX3RoID4+IChfX3NoaWZ0ICogOCk7CisJdWludDY0X3QgX19vbCA9IF9fdGwgPj4gKF9fc2hpZnQgKiA4KTsKKwlfX29sIHw9IF9fdGggPDwgKDY0IC0gX19zaGlmdCAqIDgpOworCV9fb3V0WzFdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9fb2wgPj4gMzIpOworCV9fb3V0WzBdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9fb2wpOworCV9fb3V0WzNdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9fb2ggPj4gMzIpOworCV9fb3V0WzJdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9fb2gpOworICAgICAgfQorCisKKyAgICB0ZW1wbGF0ZTxzaXplX3QgX19zaGlmdD4KKyAgICAgIGlubGluZSB2b2lkIF9fbHNoaWZ0KHVpbnQzMl90ICpfX291dCwgY29uc3QgdWludDMyX3QgKl9faW4pCisgICAgICB7CisJdWludDY0X3QgX190aCA9ICgoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KF9faW5bM10pIDw8IDMyKQorCQkJIHwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KF9faW5bMl0pKTsKKwl1aW50NjRfdCBfX3RsID0gKChzdGF0aWNfY2FzdDx1aW50NjRfdD4oX19pblsxXSkgPDwgMzIpCisJCQkgfCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oX19pblswXSkpOworCisJdWludDY0X3QgX19vaCA9IF9fdGggPDwgKF9fc2hpZnQgKiA4KTsKKwl1aW50NjRfdCBfX29sID0gX190bCA8PCAoX19zaGlmdCAqIDgpOworCV9fb2ggfD0gX190bCA+PiAoNjQgLSBfX3NoaWZ0ICogOCk7CisJX19vdXRbMV0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oX19vbCA+PiAzMik7CisJX19vdXRbMF0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oX19vbCk7CisJX19vdXRbM10gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oX19vaCA+PiAzMik7CisJX19vdXRbMl0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oX19vaCk7CisgICAgICB9CisKKworICAgIHRlbXBsYXRlPHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLCBzaXplX3QgX19zcjEsIHNpemVfdCBfX3NyMiwKKwkgICAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLCB1aW50MzJfdCBfX21zazMsIHVpbnQzMl90IF9fbXNrND4KKyAgICAgIGlubGluZSB2b2lkIF9fcmVjdXJzaW9uKHVpbnQzMl90ICpfX3IsCisJCQkgICAgICBjb25zdCB1aW50MzJfdCAqX19hLCBjb25zdCB1aW50MzJfdCAqX19iLAorCQkJICAgICAgY29uc3QgdWludDMyX3QgKl9fYywgY29uc3QgdWludDMyX3QgKl9fZCkKKyAgICAgIHsKKwl1aW50MzJfdCBfX3hbNF07CisJdWludDMyX3QgX195WzRdOworCisJX19sc2hpZnQ8X19zbDI+KF9feCwgX19hKTsKKwlfX3JzaGlmdDxfX3NyMj4oX195LCBfX2MpOworCV9fclswXSA9IChfX2FbMF0gXiBfX3hbMF0gXiAoKF9fYlswXSA+PiBfX3NyMSkgJiBfX21zazEpCisJCSAgXiBfX3lbMF0gXiAoX19kWzBdIDw8IF9fc2wxKSk7CisJX19yWzFdID0gKF9fYVsxXSBeIF9feFsxXSBeICgoX19iWzFdID4+IF9fc3IxKSAmIF9fbXNrMikKKwkJICBeIF9feVsxXSBeIChfX2RbMV0gPDwgX19zbDEpKTsKKwlfX3JbMl0gPSAoX19hWzJdIF4gX194WzJdIF4gKChfX2JbMl0gPj4gX19zcjEpICYgX19tc2szKQorCQkgIF4gX195WzJdIF4gKF9fZFsyXSA8PCBfX3NsMSkpOworCV9fclszXSA9IChfX2FbM10gXiBfX3hbM10gXiAoKF9fYlszXSA+PiBfX3NyMSkgJiBfX21zazQpCisJCSAgXiBfX3lbM10gXiAoX19kWzNdIDw8IF9fc2wxKSk7CisgICAgICB9CisKKyAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX19tLAorCSAgIHNpemVfdCBfX3BvczEsIHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLAorCSAgIHNpemVfdCBfX3NyMSwgc2l6ZV90IF9fc3IyLAorCSAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLAorCSAgIHVpbnQzMl90IF9fbXNrMywgdWludDMyX3QgX19tc2s0LAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MSwgdWludDMyX3QgX19wYXJpdHkyLAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MywgdWludDMyX3QgX19wYXJpdHk0PgorICAgIHZvaWQgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX19tLAorCQkJCQkgICBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCQkJCQkgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJCQkJCSAgIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsCisJCQkJCSAgIF9fcGFyaXR5ND46OgorICAgIF9NX2dlbl9yYW5kKHZvaWQpCisgICAgeworICAgICAgY29uc3QgdWludDMyX3QgKl9fcjEgPSAmX01fc3RhdGUzMltfTV9uc3RhdGUzMiAtIDhdOworICAgICAgY29uc3QgdWludDMyX3QgKl9fcjIgPSAmX01fc3RhdGUzMltfTV9uc3RhdGUzMiAtIDRdOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgX19wb3MxXzMyID0gX19wb3MxICogNDsKKworICAgICAgc2l6ZV90IF9faTsKKyAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX01fbnN0YXRlMzIgLSBfX3BvczFfMzI7IF9faSArPSA0KQorCXsKKwkgIF9fcmVjdXJzaW9uPF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCQkgICAgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQ+CisJICAgICgmX01fc3RhdGUzMltfX2ldLCAmX01fc3RhdGUzMltfX2ldLAorCSAgICAgJl9NX3N0YXRlMzJbX19pICsgX19wb3MxXzMyXSwgX19yMSwgX19yMik7CisJICBfX3IxID0gX19yMjsKKwkgIF9fcjIgPSAmX01fc3RhdGUzMltfX2ldOworCX0KKworICAgICAgZm9yICg7IF9faSA8IF9NX25zdGF0ZTMyOyBfX2kgKz0gNCkKKwl7CisJICBfX3JlY3Vyc2lvbjxfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkJICAgICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0PgorCSAgICAoJl9NX3N0YXRlMzJbX19pXSwgJl9NX3N0YXRlMzJbX19pXSwKKwkgICAgICZfTV9zdGF0ZTMyW19faSArIF9fcG9zMV8zMiAtIF9NX25zdGF0ZTMyXSwgX19yMSwgX19yMik7CisJICBfX3IxID0gX19yMjsKKwkgIF9fcjIgPSAmX01fc3RhdGUzMltfX2ldOworCX0KKworICAgICAgX01fcG9zID0gMDsKKyAgICB9CisKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX09QVF9IQVZFX1JBTkRPTV9TRk1UX09QRVJBVE9SRVFVQUwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX19tLAorCSAgIHNpemVfdCBfX3BvczEsIHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLAorCSAgIHNpemVfdCBfX3NyMSwgc2l6ZV90IF9fc3IyLAorCSAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLAorCSAgIHVpbnQzMl90IF9fbXNrMywgdWludDMyX3QgX19tc2s0LAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MSwgdWludDMyX3QgX19wYXJpdHkyLAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MywgdWludDMyX3QgX19wYXJpdHk0PgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fZ251X2N4eDo6c2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwKKwkgICAgICAgX19tLCBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCSAgICAgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJICAgICAgIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsIF9fcGFyaXR5ND4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX2dudV9jeHg6OnNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsCisJICAgICAgIF9fbSwgX19wb3MxLCBfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkgICAgICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0LAorCSAgICAgICBfX3Bhcml0eTEsIF9fcGFyaXR5MiwgX19wYXJpdHkzLCBfX3Bhcml0eTQ+JiBfX3JocykKKyAgICB7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6c2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwKKwkgICAgICAgX19tLCBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCSAgICAgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJICAgICAgIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsIF9fcGFyaXR5ND4gX19lbmdpbmU7CisgICAgICByZXR1cm4gKHN0ZDo6ZXF1YWwoX19saHMuX01fc3RhdGVULAorCQkJIF9fbGhzLl9NX3N0YXRlVCArIF9fZW5naW5lOjpzdGF0ZV9zaXplLAorCQkJIF9fcmhzLl9NX3N0YXRlVCkKKwkgICAgICAmJiBfX2xocy5fTV9wb3MgPT0gX19yaHMuX01fcG9zKTsKKyAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX20sCisJICAgc2l6ZV90IF9fcG9zMSwgc2l6ZV90IF9fc2wxLCBzaXplX3QgX19zbDIsCisJICAgc2l6ZV90IF9fc3IxLCBzaXplX3QgX19zcjIsCisJICAgdWludDMyX3QgX19tc2sxLCB1aW50MzJfdCBfX21zazIsCisJICAgdWludDMyX3QgX19tc2szLCB1aW50MzJfdCBfX21zazQsCisJICAgdWludDMyX3QgX19wYXJpdHkxLCB1aW50MzJfdCBfX3Bhcml0eTIsCisJICAgdWludDMyX3QgX19wYXJpdHkzLCB1aW50MzJfdCBfX3Bhcml0eTQsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6c2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwKKwkgICAgICAgX19tLCBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCSAgICAgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJICAgICAgIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsIF9fcGFyaXR5ND4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZCB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3guX01fbnN0YXRlMzI7ICsrX19pKQorCV9fb3MgPDwgX194Ll9NX3N0YXRlMzJbX19pXSA8PCBfX3NwYWNlOworICAgICAgX19vcyA8PCBfX3guX01fcG9zOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX20sCisJICAgc2l6ZV90IF9fcG9zMSwgc2l6ZV90IF9fc2wxLCBzaXplX3QgX19zbDIsCisJICAgc2l6ZV90IF9fc3IxLCBzaXplX3QgX19zcjIsCisJICAgdWludDMyX3QgX19tc2sxLCB1aW50MzJfdCBfX21zazIsCisJICAgdWludDMyX3QgX19tc2szLCB1aW50MzJfdCBfX21zazQsCisJICAgdWludDMyX3QgX19wYXJpdHkxLCB1aW50MzJfdCBfX3Bhcml0eTIsCisJICAgdWludDMyX3QgX19wYXJpdHkzLCB1aW50MzJfdCBfX3Bhcml0eTQsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIF9fZ251X2N4eDo6c2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwKKwkgICAgICAgX19tLCBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCSAgICAgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJICAgICAgIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsIF9fcGFyaXR5ND4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194Ll9NX25zdGF0ZTMyOyArK19faSkKKwlfX2lzID4+IF9feC5fTV9zdGF0ZTMyW19faV07CisgICAgICBfX2lzID4+IF9feC5fTV9wb3M7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKyNlbmRpZiAvLyBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXworCisgIC8qKgorICAgKiBJdGVyYXRpb24gbWV0aG9kIGR1ZSB0byBNLkQuIEo8bzo+aG5rLgorICAgKgorICAgKiBNLkQuIEo8bzo+aG5rLCBFcnpldWd1bmcgdm9uIGJldGF2ZXJ0ZWlsdGVuIHVuZCBnYW1tYXZlcnRlaWx0ZW4KKyAgICogWnVmYWxsc3phaGxlbiwgTWV0cmlrYSwgVm9sdW1lIDgsIDE5NjQKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIGJldGFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBiZXRhX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJc3RkOjpfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorCSAgX19hdXJuZyhfX3VybmcpOworCisJcmVzdWx0X3R5cGUgX194LCBfX3k7CisJZG8KKwkgIHsKKwkgICAgX194ID0gc3RkOjpleHAoc3RkOjpsb2coX19hdXJuZygpKSAvIF9fcGFyYW0uYWxwaGEoKSk7CisJICAgIF9feSA9IHN0ZDo6ZXhwKHN0ZDo6bG9nKF9fYXVybmcoKSkgLyBfX3BhcmFtLmJldGEoKSk7CisJICB9CisJd2hpbGUgKF9feCArIF9feSA+IHJlc3VsdF90eXBlKDEpKTsKKworCXJldHVybiBfX3ggLyAoX194ICsgX195KTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBiZXRhX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfT3V0cHV0SXRlcmF0b3IgX19mLCBfT3V0cHV0SXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvcj4pCisKKwlzdGQ6Ol9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgIHsKKwkgICAgcmVzdWx0X3R5cGUgX194LCBfX3k7CisJICAgIGRvCisJICAgICAgeworCQlfX3ggPSBzdGQ6OmV4cChzdGQ6OmxvZyhfX2F1cm5nKCkpIC8gX19wYXJhbS5hbHBoYSgpKTsKKwkJX195ID0gc3RkOjpleHAoc3RkOjpsb2coX19hdXJuZygpKSAvIF9fcGFyYW0uYmV0YSgpKTsKKwkgICAgICB9CisJICAgIHdoaWxlIChfX3ggKyBfX3kgPiByZXN1bHRfdHlwZSgxKSk7CisKKwkgICAgKl9fZisrID0gX194IC8gKF9feCArIF9feSk7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgX19nbnVfY3h4OjpiZXRhX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LmFscGhhKCkgPDwgX19zcGFjZSA8PCBfX3guYmV0YSgpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgX19nbnVfY3h4OjpiZXRhX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfUmVhbFR5cGUgX19hbHBoYV92YWwsIF9fYmV0YV92YWw7CisgICAgICBfX2lzID4+IF9fYWxwaGFfdmFsID4+IF9fYmV0YV92YWw7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgX19nbnVfY3h4OjpiZXRhX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX2FscGhhX3ZhbCwgX19iZXRhX3ZhbCkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0RpbWVuLCB0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjI+CisgICAgICB2b2lkCisgICAgICBub3JtYWxfbXZfZGlzdHJpYnV0aW9uPF9EaW1lbiwgX1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgICBfTV9pbml0X2Z1bGwoX0lucHV0SXRlcmF0b3IxIF9fbWVhbmJlZ2luLCBfSW5wdXRJdGVyYXRvcjEgX19tZWFuZW5kLAorCQkgICBfSW5wdXRJdGVyYXRvcjIgX192YXJjb3ZiZWdpbiwgX0lucHV0SXRlcmF0b3IyIF9fdmFyY292ZW5kKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisJc3RkOjpmaWxsKHN0ZDo6Y29weShfX21lYW5iZWdpbiwgX19tZWFuZW5kLCBfTV9tZWFuLmJlZ2luKCkpLAorCQkgIF9NX21lYW4uZW5kKCksIF9SZWFsVHlwZSgwKSk7CisKKwkvLyBQZXJmb3JtIHRoZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uCisJYXV0byBfX3cgPSBfTV90LmJlZ2luKCk7CisJZm9yIChzaXplX3QgX19qID0gMDsgX19qIDwgX0RpbWVuOyArK19faikKKwkgIHsKKwkgICAgX1JlYWxUeXBlIF9fc3VtID0gX1JlYWxUeXBlKDApOworCisJICAgIGF1dG8gX19zbGl0YmVnaW4gPSBfX3c7CisJICAgIGF1dG8gX19jaXQgPSBfTV90LmJlZ2luKCk7CisJICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fajsgKytfX2kpCisJICAgICAgeworCQlhdXRvIF9fc2xpdCA9IF9fc2xpdGJlZ2luOworCQlfUmVhbFR5cGUgX19zID0gKl9fdmFyY292YmVnaW4rKzsKKwkJZm9yIChzaXplX3QgX19rID0gMDsgX19rIDwgX19pOyArK19faykKKwkJICBfX3MgLT0gKl9fc2xpdCsrICogKl9fY2l0Kys7CisKKwkJKl9fdysrID0gX19zIC89ICpfX2NpdCsrOworCQlfX3N1bSArPSBfX3MgKiBfX3M7CisJICAgICAgfQorCisJICAgIF9fc3VtID0gKl9fdmFyY292YmVnaW4gLSBfX3N1bTsKKwkgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoX19zdW0gPD0gX1JlYWxUeXBlKDApLCAwKSkKKwkgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIm5vcm1hbF9tdl9kaXN0cmlidXRpb246OiIKKwkJCQkJICAgICAicGFyYW1fdHlwZTo6X01faW5pdF9mdWxsIikpOworCSAgICAqX193KysgPSBzdGQ6OnNxcnQoX19zdW0pOworCisJICAgIHN0ZDo6YWR2YW5jZShfX3ZhcmNvdmJlZ2luLCBfRGltZW4gLSBfX2opOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9EaW1lbiwgdHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyPgorICAgICAgdm9pZAorICAgICAgbm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4sIF9SZWFsVHlwZT46OnBhcmFtX3R5cGU6OgorICAgICAgX01faW5pdF9sb3dlcihfSW5wdXRJdGVyYXRvcjEgX19tZWFuYmVnaW4sIF9JbnB1dEl0ZXJhdG9yMSBfX21lYW5lbmQsCisJCSAgICBfSW5wdXRJdGVyYXRvcjIgX192YXJjb3ZiZWdpbiwgX0lucHV0SXRlcmF0b3IyIF9fdmFyY292ZW5kKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisJc3RkOjpmaWxsKHN0ZDo6Y29weShfX21lYW5iZWdpbiwgX19tZWFuZW5kLCBfTV9tZWFuLmJlZ2luKCkpLAorCQkgIF9NX21lYW4uZW5kKCksIF9SZWFsVHlwZSgwKSk7CisKKwkvLyBQZXJmb3JtIHRoZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uCisJYXV0byBfX3cgPSBfTV90LmJlZ2luKCk7CisJZm9yIChzaXplX3QgX19qID0gMDsgX19qIDwgX0RpbWVuOyArK19faikKKwkgIHsKKwkgICAgX1JlYWxUeXBlIF9fc3VtID0gX1JlYWxUeXBlKDApOworCisJICAgIGF1dG8gX19zbGl0YmVnaW4gPSBfX3c7CisJICAgIGF1dG8gX19jaXQgPSBfTV90LmJlZ2luKCk7CisJICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fajsgKytfX2kpCisJICAgICAgeworCQlhdXRvIF9fc2xpdCA9IF9fc2xpdGJlZ2luOworCQlfUmVhbFR5cGUgX19zID0gKl9fdmFyY292YmVnaW4rKzsKKwkJZm9yIChzaXplX3QgX19rID0gMDsgX19rIDwgX19pOyArK19faykKKwkJICBfX3MgLT0gKl9fc2xpdCsrICogKl9fY2l0Kys7CisKKwkJKl9fdysrID0gX19zIC89ICpfX2NpdCsrOworCQlfX3N1bSArPSBfX3MgKiBfX3M7CisJICAgICAgfQorCisJICAgIF9fc3VtID0gKl9fdmFyY292YmVnaW4rKyAtIF9fc3VtOworCSAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX3N1bSA8PSBfUmVhbFR5cGUoMCksIDApKQorCSAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigibm9ybWFsX212X2Rpc3RyaWJ1dGlvbjo6IgorCQkJCQkgICAgICJwYXJhbV90eXBlOjpfTV9pbml0X2Z1bGwiKSk7CisJICAgICpfX3crKyA9IHN0ZDo6c3FydChfX3N1bSk7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0RpbWVuLCB0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjI+CisgICAgICB2b2lkCisgICAgICBub3JtYWxfbXZfZGlzdHJpYnV0aW9uPF9EaW1lbiwgX1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgICBfTV9pbml0X2RpYWdvbmFsKF9JbnB1dEl0ZXJhdG9yMSBfX21lYW5iZWdpbiwgX0lucHV0SXRlcmF0b3IxIF9fbWVhbmVuZCwKKwkJICAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX3ZhcmJlZ2luLCBfSW5wdXRJdGVyYXRvcjIgX192YXJlbmQpCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKwlzdGQ6OmZpbGwoc3RkOjpjb3B5KF9fbWVhbmJlZ2luLCBfX21lYW5lbmQsIF9NX21lYW4uYmVnaW4oKSksCisJCSAgX01fbWVhbi5lbmQoKSwgX1JlYWxUeXBlKDApKTsKKworCWF1dG8gX193ID0gX01fdC5iZWdpbigpOworCXNpemVfdCBfX3N0ZXAgPSAwOworCXdoaWxlIChfX3ZhcmJlZ2luICE9IF9fdmFyZW5kKQorCSAgeworCSAgICBzdGQ6OmZpbGxfbihfX3csIF9fc3RlcCwgX1JlYWxUeXBlKDApKTsKKwkgICAgX193ICs9IF9fc3RlcCsrOworCSAgICBpZiAoX19idWlsdGluX2V4cGVjdCgqX192YXJiZWdpbiA8IF9SZWFsVHlwZSgwKSwgMCkpCisJICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJub3JtYWxfbXZfZGlzdHJpYnV0aW9uOjoiCisJCQkJCSAgICAgInBhcmFtX3R5cGU6Ol9NX2luaXRfZGlhZ29uYWwiKSk7CisJICAgICpfX3crKyA9IHN0ZDo6c3FydCgqX192YXJiZWdpbisrKTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfRGltZW4sIHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIG5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuLCBfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgbm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4sIF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlyZXN1bHRfdHlwZSBfX3JldDsKKworCV9NX25kLl9fZ2VuZXJhdGUoX19yZXQuYmVnaW4oKSwgX19yZXQuZW5kKCksIF9fdXJuZyk7CisKKwlhdXRvIF9fdF9pdCA9IF9fcGFyYW0uX01fdC5jcmJlZ2luKCk7CisJZm9yIChzaXplX3QgX19pID0gX0RpbWVuOyBfX2kgPiAwOyAtLV9faSkKKwkgIHsKKwkgICAgX1JlYWxUeXBlIF9fc3VtID0gX1JlYWxUeXBlKDApOworCSAgICBmb3IgKHNpemVfdCBfX2ogPSBfX2k7IF9faiA+IDA7IC0tX19qKQorCSAgICAgIF9fc3VtICs9IF9fcmV0W19faiAtIDFdICogKl9fdF9pdCsrOworCSAgICBfX3JldFtfX2kgLSAxXSA9IF9fc3VtOworCSAgfQorCisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9EaW1lbiwgdHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgbm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4sIF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgICAgX0ZvcndhcmRJdGVyYXRvcj4pCisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICAqX19mKysgPSB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX19wYXJhbSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9EaW1lbiwgdHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fZ251X2N4eDo6bm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4sIF9SZWFsVHlwZT4mCisJICAgICAgIF9fZDEsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6bm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4sIF9SZWFsVHlwZT4mCisJICAgICAgIF9fZDIpCisgICAgeworICAgICAgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbSAmJiBfX2QxLl9NX25kID09IF9fZDIuX01fbmQ7CisgICAgfQorCisgIHRlbXBsYXRlPHNpemVfdCBfRGltZW4sIHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6bm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4sIF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgYXV0byBfX21lYW4gPSBfX3guX01fcGFyYW0ubWVhbigpOworICAgICAgZm9yIChhdXRvIF9faXQgOiBfX21lYW4pCisJX19vcyA8PCBfX2l0IDw8IF9fc3BhY2U7CisgICAgICBhdXRvIF9fdCA9IF9feC5fTV9wYXJhbS52YXJjb3YoKTsKKyAgICAgIGZvciAoYXV0byBfX2l0IDogX190KQorCV9fb3MgPDwgX19pdCA8PCBfX3NwYWNlOworCisgICAgICBfX29zIDw8IF9feC5fTV9uZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHNpemVfdCBfRGltZW4sIHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIF9fZ251X2N4eDo6bm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4sIF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIHN0ZDo6YXJyYXk8X1JlYWxUeXBlLCBfRGltZW4+IF9fbWVhbjsKKyAgICAgIGZvciAoYXV0byYgX19pdCA6IF9fbWVhbikKKwlfX2lzID4+IF9faXQ7CisgICAgICBzdGQ6OmFycmF5PF9SZWFsVHlwZSwgX0RpbWVuICogKF9EaW1lbiArIDEpIC8gMj4gX192YXJjb3Y7CisgICAgICBmb3IgKGF1dG8mIF9faXQgOiBfX3ZhcmNvdikKKwlfX2lzID4+IF9faXQ7CisKKyAgICAgIF9faXMgPj4gX194Ll9NX25kOworCisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgbm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4sIF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fbWVhbi5iZWdpbigpLCBfX21lYW4uZW5kKCksCisJCQkgICBfX3ZhcmNvdi5iZWdpbigpLCBfX3ZhcmNvdi5lbmQoKSkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgcmljZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX091dHB1dEl0ZXJhdG9yIF9fZiwgX091dHB1dEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvcj4pCisKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgIHsKKwkgICAgdHlwZW5hbWUgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPjo6cGFyYW1fdHlwZQorCSAgICAgIF9fcHgoX19wLm51KCksIF9fcC5zaWdtYSgpKSwgX19weShyZXN1bHRfdHlwZSgwKSwgX19wLnNpZ21hKCkpOworCSAgICByZXN1bHRfdHlwZSBfX3ggPSB0aGlzLT5fTV9uZHgoX19weCwgX191cm5nKTsKKwkgICAgcmVzdWx0X3R5cGUgX195ID0gdGhpcy0+X01fbmR5KF9fcHksIF9fdXJuZyk7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCSAgICAqX19mKysgPSBzdGQ6Omh5cG90KF9feCwgX195KTsKKyNlbHNlCisJICAgICpfX2YrKyA9IHN0ZDo6c3FydChfX3ggKiBfX3ggKyBfX3kgKiBfX3kpOworI2VuZGlmCisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgcmljZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5udSgpIDw8IF9fc3BhY2UgPDwgX194LnNpZ21hKCk7CisgICAgICBfX29zIDw8IF9fc3BhY2UgPDwgX194Ll9NX25keDsKKyAgICAgIF9fb3MgPDwgX19zcGFjZSA8PCBfX3guX01fbmR5OworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgcmljZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fbnVfdmFsLCBfX3NpZ21hX3ZhbDsKKyAgICAgIF9faXMgPj4gX19udV92YWwgPj4gX19zaWdtYV92YWw7CisgICAgICBfX2lzID4+IF9feC5fTV9uZHg7CisgICAgICBfX2lzID4+IF9feC5fTV9uZHk7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgcmljZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19udV92YWwsIF9fc2lnbWFfdmFsKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBuYWthZ2FtaV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX091dHB1dEl0ZXJhdG9yIF9fZiwgX091dHB1dEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvcj4pCisKKwl0eXBlbmFtZSBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUKKwkgIF9fcGcoX19wLm11KCksIF9fcC5vbWVnYSgpIC8gX19wLm11KCkpOworCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gc3RkOjpzcXJ0KHRoaXMtPl9NX2dkKF9fcGcsIF9fdXJuZykpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IG5ha2FnYW1pX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194Lm11KCkgPDwgX19zcGFjZSA8PCBfX3gub21lZ2EoKTsKKyAgICAgIF9fb3MgPDwgX19zcGFjZSA8PCBfX3guX01fZ2Q7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBuYWthZ2FtaV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fbXVfdmFsLCBfX29tZWdhX3ZhbDsKKyAgICAgIF9faXMgPj4gX19tdV92YWwgPj4gX19vbWVnYV92YWw7CisgICAgICBfX2lzID4+IF9feC5fTV9nZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBuYWthZ2FtaV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19tdV92YWwsIF9fb21lZ2FfdmFsKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBwYXJldG9fZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9PdXRwdXRJdGVyYXRvciBfX2YsIF9PdXRwdXRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3I+KQorCisJcmVzdWx0X3R5cGUgX19tdV92YWwgPSBfX3AubXUoKTsKKwlyZXN1bHRfdHlwZSBfX21hbHBoaW52ID0gLXJlc3VsdF90eXBlKDEpIC8gX19wLmFscGhhKCk7CisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICAqX19mKysgPSBfX211X3ZhbCAqIHN0ZDo6cG93KHRoaXMtPl9NX3VkKF9fdXJuZyksIF9fbWFscGhpbnYpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHBhcmV0b19kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5hbHBoYSgpIDw8IF9fc3BhY2UgPDwgX194Lm11KCk7CisgICAgICBfX29zIDw8IF9fc3BhY2UgPDwgX194Ll9NX3VkOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgcGFyZXRvX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfUmVhbFR5cGUgX19hbHBoYV92YWwsIF9fbXVfdmFsOworICAgICAgX19pcyA+PiBfX2FscGhhX3ZhbCA+PiBfX211X3ZhbDsKKyAgICAgIF9faXMgPj4gX194Ll9NX3VkOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIHBhcmV0b19kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19hbHBoYV92YWwsIF9fbXVfdmFsKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBrX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAga19kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7CisJcmVzdWx0X3R5cGUgX194ID0gdGhpcy0+X01fZ2QxKF9fdXJuZyk7CisJcmVzdWx0X3R5cGUgX195ID0gdGhpcy0+X01fZ2QyKF9fdXJuZyk7CisJcmV0dXJuIHN0ZDo6c3FydChfX3ggKiBfX3kpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIGtfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBrX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwl0eXBlbmFtZSBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUKKwkgIF9fcDEoX19wLmxhbWJkYSgpLCByZXN1bHRfdHlwZSgxKSAvIF9fcC5sYW1iZGEoKSksCisJICBfX3AyKF9fcC5udSgpLCBfX3AubXUoKSAvIF9fcC5udSgpKTsKKwlyZXN1bHRfdHlwZSBfX3ggPSB0aGlzLT5fTV9nZDEoX19wMSwgX191cm5nKTsKKwlyZXN1bHRfdHlwZSBfX3kgPSB0aGlzLT5fTV9nZDIoX19wMiwgX191cm5nKTsKKwlyZXR1cm4gc3RkOjpzcXJ0KF9feCAqIF9feSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAga19kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX091dHB1dEl0ZXJhdG9yIF9fZiwgX091dHB1dEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvcj4pCisKKwl0eXBlbmFtZSBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUKKwkgIF9fcDEoX19wLmxhbWJkYSgpLCByZXN1bHRfdHlwZSgxKSAvIF9fcC5sYW1iZGEoKSksCisJICBfX3AyKF9fcC5udSgpLCBfX3AubXUoKSAvIF9fcC5udSgpKTsKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgIHsKKwkgICAgcmVzdWx0X3R5cGUgX194ID0gdGhpcy0+X01fZ2QxKF9fcDEsIF9fdXJuZyk7CisJICAgIHJlc3VsdF90eXBlIF9feSA9IHRoaXMtPl9NX2dkMihfX3AyLCBfX3VybmcpOworCSAgICAqX19mKysgPSBzdGQ6OnNxcnQoX194ICogX195KTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBrX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LmxhbWJkYSgpIDw8IF9fc3BhY2UgPDwgX194Lm11KCkgPDwgX19zcGFjZSA8PCBfX3gubnUoKTsKKyAgICAgIF9fb3MgPDwgX19zcGFjZSA8PCBfX3guX01fZ2QxOworICAgICAgX19vcyA8PCBfX3NwYWNlIDw8IF9feC5fTV9nZDI7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBrX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfUmVhbFR5cGUgX19sYW1iZGFfdmFsLCBfX211X3ZhbCwgX19udV92YWw7CisgICAgICBfX2lzID4+IF9fbGFtYmRhX3ZhbCA+PiBfX211X3ZhbCA+PiBfX251X3ZhbDsKKyAgICAgIF9faXMgPj4gX194Ll9NX2dkMTsKKyAgICAgIF9faXMgPj4gX194Ll9NX2dkMjsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBrX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX2xhbWJkYV92YWwsIF9fbXVfdmFsLCBfX251X3ZhbCkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgYXJjc2luZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX091dHB1dEl0ZXJhdG9yIF9fZiwgX091dHB1dEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvcj4pCisKKwlyZXN1bHRfdHlwZSBfX2RpZiA9IF9fcC5iKCkgLSBfX3AuYSgpOworCXJlc3VsdF90eXBlIF9fc3VtID0gX19wLmEoKSArIF9fcC5iKCk7CisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICB7CisJICAgIHJlc3VsdF90eXBlIF9feCA9IHN0ZDo6c2luKHRoaXMtPl9NX3VkKF9fdXJuZykpOworCSAgICAqX19mKysgPSAoX194ICogX19kaWYgKyBfX3N1bSkgLyByZXN1bHRfdHlwZSgyKTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBhcmNzaW5lX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LmEoKSA8PCBfX3NwYWNlIDw8IF9feC5iKCk7CisgICAgICBfX29zIDw8IF9fc3BhY2UgPDwgX194Ll9NX3VkOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgYXJjc2luZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fYSwgX19iOworICAgICAgX19pcyA+PiBfX2EgPj4gX19iOworICAgICAgX19pcyA+PiBfX3guX01fdWQ7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgYXJjc2luZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19hLCBfX2IpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIGhveXRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBob3l0X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgIHsKKwlyZXN1bHRfdHlwZSBfX3ggPSB0aGlzLT5fTV9hZChfX3VybmcpOworCXJlc3VsdF90eXBlIF9feSA9IHRoaXMtPl9NX2VkKF9fdXJuZyk7CisJcmV0dXJuIChyZXN1bHRfdHlwZSgyKSAqIHRoaXMtPnEoKQorCQkgIC8gKHJlc3VsdF90eXBlKDEpICsgdGhpcy0+cSgpICogdGhpcy0+cSgpKSkKKwkgICAgICAgKiBzdGQ6OnNxcnQodGhpcy0+b21lZ2EoKSAqIF9feCAqIF9feSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgaG95dF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIGhveXRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCXJlc3VsdF90eXBlIF9fcTIgPSBfX3AucSgpICogX19wLnEoKTsKKwlyZXN1bHRfdHlwZSBfX251bSA9IHJlc3VsdF90eXBlKDAuNUwpICogKHJlc3VsdF90eXBlKDEpICsgX19xMik7CisJdHlwZW5hbWUgX19nbnVfY3h4OjphcmNzaW5lX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUKKwkgIF9fcGEoX19udW0sIF9fbnVtIC8gX19xMik7CisJcmVzdWx0X3R5cGUgX194ID0gdGhpcy0+X01fYWQoX19wYSwgX191cm5nKTsKKwlyZXN1bHRfdHlwZSBfX3kgPSB0aGlzLT5fTV9lZChfX3VybmcpOworCXJldHVybiAocmVzdWx0X3R5cGUoMikgKiBfX3AucSgpIC8gKHJlc3VsdF90eXBlKDEpICsgX19xMikpCisJICAgICAgICogc3RkOjpzcXJ0KF9fcC5vbWVnYSgpICogX194ICogX195KTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBob3l0X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfT3V0cHV0SXRlcmF0b3IgX19mLCBfT3V0cHV0SXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yPikKKworCXJlc3VsdF90eXBlIF9fMnEgPSByZXN1bHRfdHlwZSgyKSAqIF9fcC5xKCk7CisJcmVzdWx0X3R5cGUgX19xMiA9IF9fcC5xKCkgKiBfX3AucSgpOworCXJlc3VsdF90eXBlIF9fcTJwMSA9IHJlc3VsdF90eXBlKDEpICsgX19xMjsKKwlyZXN1bHRfdHlwZSBfX251bSA9IHJlc3VsdF90eXBlKDAuNUwpICogX19xMnAxOworCXJlc3VsdF90eXBlIF9fb21lZ2EgPSBfX3Aub21lZ2EoKTsKKwl0eXBlbmFtZSBfX2dudV9jeHg6OmFyY3NpbmVfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPjo6cGFyYW1fdHlwZQorCSAgX19wYShfX251bSwgX19udW0gLyBfX3EyKTsKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgIHsKKwkgICAgcmVzdWx0X3R5cGUgX194ID0gdGhpcy0+X01fYWQoX19wYSwgX191cm5nKTsKKwkgICAgcmVzdWx0X3R5cGUgX195ID0gdGhpcy0+X01fZWQoX191cm5nKTsKKwkgICAgKl9fZisrID0gKF9fMnEgLyBfX3EycDEpICogc3RkOjpzcXJ0KF9fb21lZ2EgKiBfX3ggKiBfX3kpOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGhveXRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gucSgpIDw8IF9fc3BhY2UgPDwgX194Lm9tZWdhKCk7CisgICAgICBfX29zIDw8IF9fc3BhY2UgPDwgX194Ll9NX2FkOworICAgICAgX19vcyA8PCBfX3NwYWNlIDw8IF9feC5fTV9lZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGhveXRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX3EsIF9fb21lZ2E7CisgICAgICBfX2lzID4+IF9fcSA+PiBfX29tZWdhOworICAgICAgX19pcyA+PiBfX3guX01fYWQ7CisgICAgICBfX2lzID4+IF9feC5fTV9lZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBob3l0X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX3EsIF9fb21lZ2EpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHRyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9PdXRwdXRJdGVyYXRvciBfX2YsIF9PdXRwdXRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yPikKKworCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9fcGFyYW0pOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6dHJpYW5ndWxhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5hKCkgPDwgX19zcGFjZSA8PCBfX3guYigpIDw8IF9fc3BhY2UgPDwgX194LmMoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIF9fZ251X2N4eDo6dHJpYW5ndWxhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fYSwgX19iLCBfX2M7CisgICAgICBfX2lzID4+IF9fYSA+PiBfX2IgPj4gX19jOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIF9fZ251X2N4eDo6dHJpYW5ndWxhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19hLCBfX2IsIF9fYykpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgdm9uX21pc2VzX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfT3V0cHV0SXRlcmF0b3IgX19mLCBfT3V0cHV0SXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvcj4pCisKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgICpfX2YrKyA9IHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfX3BhcmFtKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBfX2dudV9jeHg6OnZvbl9taXNlc19kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5tdSgpIDw8IF9fc3BhY2UgPDwgX194LmthcHBhKCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBfX2dudV9jeHg6OnZvbl9taXNlc19kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fbXUsIF9fa2FwcGE7CisgICAgICBfX2lzID4+IF9fbXUgPj4gX19rYXBwYTsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBfX2dudV9jeHg6OnZvbl9taXNlc19kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19tdSwgX19rYXBwYSkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKworI2VuZGlmIC8vIF9FWFRfUkFORE9NX1RDQwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcmJfdHJlZSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3JiX3RyZWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3M2RhZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3JiX3RyZWUKQEAgLTAsMCArMSw5NiBAQAorLy8gcmJfdHJlZSBleHRlbnNpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBleHQvcmJfdHJlZQorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IChwb3NzaWJseQorICogIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBIUC9TR0kgU1RMIHN1YnNldCkuIAorICovCisKKyNpZm5kZWYgX1JCX1RSRUUKKyNkZWZpbmUgX1JCX1RSRUUgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL3N0bF90cmVlLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6Ol9SYl90cmVlOworICB1c2luZyBzdGQ6OmFsbG9jYXRvcjsKKworICAvLyBDbGFzcyByYl90cmVlIGlzIG5vdCBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQuICBJdCBpcyBwcm92aWRlZCBmb3IKKyAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBIUCBTVEwuCisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAgKi8KKyAgdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9Db21wYXJlLAorCSAgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgc3RydWN0IHJiX3RyZWUKKyAgICA6IHB1YmxpYyBfUmJfdHJlZTxfS2V5LCBfVmFsdWUsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWU8X0tleSwgX1ZhbHVlLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgcmJfdHJlZShjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19jb21wLCBfX2EpIHsgfQorCisgICAgICB+cmJfdHJlZSgpIHsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9yY19zdHJpbmdfYmFzZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcmNfc3RyaW5nX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzU2NGMyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcmNfc3RyaW5nX2Jhc2UuaApAQCAtMCwwICsxLDczMiBAQAorLy8gUmVmZXJlbmNlLWNvdW50ZWQgdmVyc2F0aWxlIHN0cmluZyBiYXNlIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvcmNfc3RyaW5nX2Jhc2UuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4dC92c3RyaW5nLmh9CisgKi8KKworI2lmbmRlZiBfUkNfU1RSSU5HX0JBU0VfSAorI2RlZmluZSBfUkNfU1RSSU5HX0JBU0VfSCAxCisKKyNpbmNsdWRlIDxleHQvYXRvbWljaXR5Lmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBEb2N1bWVudGF0aW9uPyAgV2hhdCdzIHRoYXQ/CisgICAqICBOYXRoYW4gTXllcnMgPG5jbUBjYW50cmlwLm9yZz4uCisgICAqCisgICAqICBBIHN0cmluZyBsb29rcyBsaWtlIHRoaXM6CisgICAqCisgICAqICBAY29kZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbX1JlcF0KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fbGVuZ3RoCisgICAqICAgW19fcmNfc3RyaW5nX2Jhc2U8Y2hhcl90eXBlPl0gICAgICAgIF9NX2NhcGFjaXR5CisgICAqICAgX01fZGF0YXBsdXMgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3JlZmNvdW50CisgICAqICAgX01fcCAtLS0tLS0tLS0tLS0tLS0tPiAgICAgICAgICAgICAgIHVubmFtZWQgYXJyYXkgb2YgY2hhcl90eXBlCisgICAqICBAZW5kY29kZQorICAgKgorICAgKiAgV2hlcmUgdGhlIF9NX3AgcG9pbnRzIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZywgYW5kCisgICAqICB5b3UgY2FzdCBpdCB0byBhIHBvaW50ZXItdG8tX1JlcCBhbmQgc3VidHJhY3QgMSB0byBnZXQgYQorICAgKiAgcG9pbnRlciB0byB0aGUgaGVhZGVyLgorICAgKgorICAgKiAgVGhpcyBhcHByb2FjaCBoYXMgdGhlIGVub3Jtb3VzIGFkdmFudGFnZSB0aGF0IGEgc3RyaW5nIG9iamVjdAorICAgKiAgcmVxdWlyZXMgb25seSBvbmUgYWxsb2NhdGlvbi4gIEFsbCB0aGUgdWdsaW5lc3MgaXMgY29uZmluZWQKKyAgICogIHdpdGhpbiBhIHNpbmdsZSBwYWlyIG9mIGlubGluZSBmdW5jdGlvbnMsIHdoaWNoIGVhY2ggY29tcGlsZSB0bworICAgKiAgYSBzaW5nbGUgQGEgYWRkIGluc3RydWN0aW9uOiBfUmVwOjpfTV9yZWZkYXRhKCksIGFuZAorICAgKiAgX19yY19zdHJpbmdfYmFzZTo6X01fcmVwKCk7IGFuZCB0aGUgYWxsb2NhdGlvbiBmdW5jdGlvbiB3aGljaCBnZXRzIGEKKyAgICogIGJsb2NrIG9mIHJhdyBieXRlcyBhbmQgd2l0aCByb29tIGVub3VnaCBhbmQgY29uc3RydWN0cyBhIF9SZXAKKyAgICogIG9iamVjdCBhdCB0aGUgZnJvbnQuCisgICAqCisgICAqICBUaGUgcmVhc29uIHlvdSB3YW50IF9NX2RhdGEgcG9pbnRpbmcgdG8gdGhlIGNoYXJhY3RlciBhcnJheSBhbmQKKyAgICogIG5vdCB0aGUgX1JlcCBpcyBzbyB0aGF0IHRoZSBkZWJ1Z2dlciBjYW4gc2VlIHRoZSBzdHJpbmcKKyAgICogIGNvbnRlbnRzLiAoUHJvYmFibHkgd2Ugc2hvdWxkIGFkZCBhIG5vbi1pbmxpbmUgbWVtYmVyIHRvIGdldAorICAgKiAgdGhlIF9SZXAgZm9yIHRoZSBkZWJ1Z2dlciB0byB1c2UsIHNvIHVzZXJzIGNhbiBjaGVjayB0aGUgYWN0dWFsCisgICAqICBzdHJpbmcgbGVuZ3RoLikKKyAgICoKKyAgICogIE5vdGUgdGhhdCB0aGUgX1JlcCBvYmplY3QgaXMgYSBQT0Qgc28gdGhhdCB5b3UgY2FuIGhhdmUgYQorICAgKiAgc3RhdGljIDxlbT5lbXB0eSBzdHJpbmc8L2VtPiBfUmVwIG9iamVjdCBhbHJlYWR5IEBhIGNvbnN0cnVjdGVkIGJlZm9yZQorICAgKiAgc3RhdGljIGNvbnN0cnVjdG9ycyBoYXZlIHJ1bi4gIFRoZSByZWZlcmVuY2UtY291bnQgZW5jb2RpbmcgaXMKKyAgICogIGNob3NlbiBzbyB0aGF0IGEgMCBpbmRpY2F0ZXMgb25lIHJlZmVyZW5jZSwgc28geW91IG5ldmVyIHRyeSB0bworICAgKiAgZGVzdHJveSB0aGUgZW1wdHktc3RyaW5nIF9SZXAgb2JqZWN0LgorICAgKgorICAgKiAgQWxsIGJ1dCB0aGUgbGFzdCBwYXJhZ3JhcGggaXMgY29uc2lkZXJlZCBwcmV0dHkgY29udmVudGlvbmFsCisgICAqICBmb3IgYSBDKysgc3RyaW5nIGltcGxlbWVudGF0aW9uLgorICAqLworIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIF9fcmNfc3RyaW5nX2Jhc2UKKyAgICA6IHByb3RlY3RlZCBfX3ZzdHJpbmdfdXRpbGl0eTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHJhaXRzCQkJCQkgICAgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYwkJCQkJICAgIGFsbG9jYXRvcl90eXBlOworCisgICAgICB0eXBlZGVmIF9fdnN0cmluZ191dGlsaXR5PF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAgICBfVXRpbF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVXRpbF9CYXNlOjpfQ2hhclRfYWxsb2NfdHlwZSAgICAgICAgX0NoYXJUX2FsbG9jX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpzaXplX3R5cGUJICAgIHNpemVfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICAvLyBfUmVwOiBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgIC8vICAgSW52YXJpYW50czoKKyAgICAgIC8vICAgMS4gU3RyaW5nIHJlYWxseSBjb250YWlucyBfTV9sZW5ndGggKyAxIGNoYXJhY3RlcnM6IGR1ZSB0byAyMS4zLjQKKyAgICAgIC8vICAgICAgbXVzdCBiZSBrZXB0IG51bGwtdGVybWluYXRlZC4KKyAgICAgIC8vICAgMi4gX01fY2FwYWNpdHkgPj0gX01fbGVuZ3RoCisgICAgICAvLyAgICAgIEFsbG9jYXRlZCBtZW1vcnkgaXMgYWx3YXlzIChfTV9jYXBhY2l0eSArIDEpICogc2l6ZW9mKF9DaGFyVCkuCisgICAgICAvLyAgIDMuIF9NX3JlZmNvdW50IGhhcyB0aHJlZSBzdGF0ZXM6CisgICAgICAvLyAgICAgIC0xOiBsZWFrZWQsIG9uZSByZWZlcmVuY2UsIG5vIHJlZi1jb3BpZXMgYWxsb3dlZCwgbm9uLWNvbnN0LgorICAgICAgLy8gICAgICAgMDogb25lIHJlZmVyZW5jZSwgbm9uLWNvbnN0LgorICAgICAgLy8gICAgIG4+MDogbiArIDEgcmVmZXJlbmNlcywgb3BlcmF0aW9ucyByZXF1aXJlIGEgbG9jaywgY29uc3QuCisgICAgICAvLyAgIDQuIEFsbCBmaWVsZHMgPT0gMCBpcyBhbiBlbXB0eSBzdHJpbmcsIGdpdmVuIHRoZSBleHRyYSBzdG9yYWdlCisgICAgICAvLyAgICAgIGJleW9uZC10aGUtZW5kIGZvciBhIG51bGwgdGVybWluYXRvcjsgdGh1cywgdGhlIHNoYXJlZAorICAgICAgLy8gICAgICBlbXB0eSBzdHJpbmcgcmVwcmVzZW50YXRpb24gbmVlZHMgbm8gY29uc3RydWN0b3IuCisgICAgICBzdHJ1Y3QgX1JlcAorICAgICAgeworCXVuaW9uCisJeworCSAgc3RydWN0CisJICB7CisJICAgIHNpemVfdHlwZQkgICAgX01fbGVuZ3RoOworCSAgICBzaXplX3R5cGUJICAgIF9NX2NhcGFjaXR5OworCSAgICBfQXRvbWljX3dvcmQgICAgX01fcmVmY291bnQ7CisJICB9ICAgICAgICAgICAgICAgICBfTV9pbmZvOworCisJICAvLyBPbmx5IGZvciBhbGlnbm1lbnQgcHVycG9zZXMuCisJICBfQ2hhclQgICAgICAgICAgICBfTV9hbGlnbjsKKwl9OworCisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfUmVwPjo6b3RoZXIgX1JlcF9hbGxvY190eXBlOworCisgCV9DaGFyVCoKKwlfTV9yZWZkYXRhKCkgdGhyb3coKQorCXsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X0NoYXJUKj4odGhpcyArIDEpOyB9CisKKwlfQ2hhclQqCisJX01fcmVmY29weSgpIHRocm93KCkKKwl7CisJICBfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9NX2luZm8uX01fcmVmY291bnQsIDEpOworCSAgcmV0dXJuIF9NX3JlZmRhdGEoKTsKKwl9ICAvLyBYWFggTVQKKworCXZvaWQKKwlfTV9zZXRfbGVuZ3RoKHNpemVfdHlwZSBfX24pCisJeworCSAgX01faW5mby5fTV9yZWZjb3VudCA9IDA7ICAvLyBPbmUgcmVmZXJlbmNlLgorCSAgX01faW5mby5fTV9sZW5ndGggPSBfX247CisJICAvLyBncnJyLiAocGVyIDIxLjMuNCkKKwkgIC8vIFlvdSBjYW5ub3QgbGVhdmUgdGhvc2UgTFdHIHBlb3BsZSBhbG9uZSBmb3IgYSBzZWNvbmQuCisJICB0cmFpdHNfdHlwZTo6YXNzaWduKF9NX3JlZmRhdGEoKVtfX25dLCBfQ2hhclQoKSk7CisJfQorCisJLy8gQ3JlYXRlICYgRGVzdHJveQorCXN0YXRpYyBfUmVwKgorCV9TX2NyZWF0ZShzaXplX3R5cGUsIHNpemVfdHlwZSwgY29uc3QgX0FsbG9jJik7CisKKwl2b2lkCisJX01fZGVzdHJveShjb25zdCBfQWxsb2MmKSB0aHJvdygpOworCisJX0NoYXJUKgorCV9NX2Nsb25lKGNvbnN0IF9BbGxvYyYsIHNpemVfdHlwZSBfX3JlcyA9IDApOworICAgICAgfTsKKworICAgICAgc3RydWN0IF9SZXBfZW1wdHkKKyAgICAgIDogcHVibGljIF9SZXAKKyAgICAgIHsKKwlfQ2hhclQgICAgICAgICAgICAgIF9NX3Rlcm1pbmFsOworICAgICAgfTsKKworICAgICAgc3RhdGljIF9SZXBfZW1wdHkgICAgIF9TX2VtcHR5X3JlcDsKKworICAgICAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGl2aWR1YWwgY2hhcl90eXBlIGVsZW1lbnRzIG9mIGFuCisgICAgICAvLyBpbmRpdmlkdWFsIHN0cmluZyBpcyBkZXRlcm1pbmVkIGJ5IF9TX21heF9zaXplLiBUaGlzIGlzIHRoZQorICAgICAgLy8gdmFsdWUgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IG1heF9zaXplKCkuICAoV2hlcmVhcyBucG9zCisgICAgICAvLyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhlIGFsbG9jYXRvciBjYW4gYWxsb2NhdGUuKQorICAgICAgLy8gSWYgb25lIHdhcyB0byBkaXZ2eSB1cCB0aGUgdGhlb3JldGljYWwgbGFyZ2VzdCBzaXplIHN0cmluZywKKyAgICAgIC8vIHdpdGggYSB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgYW5kIG0gX0NoYXJUIGVsZW1lbnRzLCBpdCdkCisgICAgICAvLyBsb29rIGxpa2UgdGhpczoKKyAgICAgIC8vIG5wb3MgPSBzaXplb2YoX1JlcCkgKyAobSAqIHNpemVvZihfQ2hhclQpKSArIHNpemVvZihfQ2hhclQpCisgICAgICAvLyAgICAgICAgKyBzaXplb2YoX1JlcCkgLSAxCisgICAgICAvLyAoTkI6IGxhc3QgdHdvIHRlcm1zIGZvciByb3VuZGluZyByZWFzb25zLCBzZWUgX01fY3JlYXRlIGJlbG93KQorICAgICAgLy8gU29sdmluZyBmb3IgbToKKyAgICAgIC8vIG0gPSAoKG5wb3MgLSAyICogc2l6ZW9mKF9SZXApICsgMSkgLyBzaXplb2YoX0NoYXJUKSkgLSAxCisgICAgICAvLyBJbiBhZGRpdGlvbiwgdGhpcyBpbXBsZW1lbnRhdGlvbiBoYWx2ZXMgdGhpcyBhbW91bnQuCisgICAgICBlbnVtIHsgX1NfbWF4X3NpemUgPSAoKChzdGF0aWNfY2FzdDxzaXplX3R5cGU+KC0xKSAtIDIgKiBzaXplb2YoX1JlcCkKKwkJCSAgICAgICsgMSkgLyBzaXplb2YoX0NoYXJUKSkgLSAxKSAvIDIgfTsKKworICAgICAgLy8gRGF0YSBNZW1iZXIgKHByaXZhdGUpOgorICAgICAgbXV0YWJsZSB0eXBlbmFtZSBfVXRpbF9CYXNlOjp0ZW1wbGF0ZSBfQWxsb2NfaGlkZXI8X0FsbG9jPiAgX01fZGF0YXBsdXM7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RhdGEoX0NoYXJUKiBfX3ApCisgICAgICB7IF9NX2RhdGFwbHVzLl9NX3AgPSBfX3A7IH0KKworICAgICAgX1JlcCoKKyAgICAgIF9NX3JlcCgpIGNvbnN0CisgICAgICB7IHJldHVybiAmKChyZWludGVycHJldF9jYXN0PF9SZXAqPihfTV9kYXRhKCkpKVstMV0pOyB9CisKKyAgICAgIF9DaGFyVCoKKyAgICAgIF9NX2dyYWIoY29uc3QgX0FsbG9jJiBfX2FsbG9jKSBjb25zdAorICAgICAgeworCXJldHVybiAoIV9NX2lzX2xlYWtlZCgpICYmIF9NX2dldF9hbGxvY2F0b3IoKSA9PSBfX2FsbG9jKQorCQk/IF9NX3JlcCgpLT5fTV9yZWZjb3B5KCkgOiBfTV9yZXAoKS0+X01fY2xvbmUoX19hbGxvYyk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2Rpc3Bvc2UoKQorICAgICAgeworCS8vIEJlIHJhY2UtZGV0ZWN0b3ItZnJpZW5kbHkuICBGb3IgbW9yZSBpbmZvIHNlZSBiaXRzL2MrK2NvbmZpZy4KKwlfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoJl9NX3JlcCgpLT5fTV9pbmZvLgorCQkJCQkJX01fcmVmY291bnQpOworCWlmIChfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3JlcCgpLT5fTV9pbmZvLl9NX3JlZmNvdW50LAorCQkJCQktMSkgPD0gMCkKKwkgIHsKKwkgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoJl9NX3JlcCgpLT5fTV9pbmZvLgorCQkJCQkJICAgX01fcmVmY291bnQpOworCSAgICBfTV9yZXAoKS0+X01fZGVzdHJveShfTV9nZXRfYWxsb2NhdG9yKCkpOworCSAgfQorICAgICAgfSAgLy8gWFhYIE1UCisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2lzX2xlYWtlZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9yZXAoKS0+X01faW5mby5fTV9yZWZjb3VudCA8IDA7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc2V0X3NoYXJhYmxlKCkKKyAgICAgIHsgX01fcmVwKCktPl9NX2luZm8uX01fcmVmY291bnQgPSAwOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2xlYWtfaGFyZCgpOworCisgICAgICAvLyBfU19jb25zdHJ1Y3RfYXV4IGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSAyMS4zLjEgcGFyYSAxNSB3aGljaAorICAgICAgLy8gcmVxdWlyZXMgc3BlY2lhbCBiZWhhdmlvdXIgaWYgX0luSXRlcmF0b3IgaXMgYW4gaW50ZWdyYWwgdHlwZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlcmF0b3I+CisJc3RhdGljIF9DaGFyVCoKKwlfU19jb25zdHJ1Y3RfYXV4KF9Jbkl0ZXJhdG9yIF9fYmVnLCBfSW5JdGVyYXRvciBfX2VuZCwKKwkJCSBjb25zdCBfQWxsb2MmIF9fYSwgc3RkOjpfX2ZhbHNlX3R5cGUpCisJeworCSAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0luSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSBfVGFnOworCSAgcmV0dXJuIF9TX2NvbnN0cnVjdChfX2JlZywgX19lbmQsIF9fYSwgX1RhZygpKTsKKwl9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzOC4gQW1iaWd1aXR5IGluIHRoZSAiZG8gdGhlIHJpZ2h0IHRoaW5nIiBjbGF1c2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlZ2VyPgorCXN0YXRpYyBfQ2hhclQqCisJX1NfY29uc3RydWN0X2F1eChfSW50ZWdlciBfX2JlZywgX0ludGVnZXIgX19lbmQsCisJCQkgY29uc3QgX0FsbG9jJiBfX2EsIHN0ZDo6X190cnVlX3R5cGUpCisJeyByZXR1cm4gX1NfY29uc3RydWN0X2F1eF8yKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19iZWcpLAorCQkJCSAgICBfX2VuZCwgX19hKTsgfQorCisgICAgICBzdGF0aWMgX0NoYXJUKgorICAgICAgX1NfY29uc3RydWN0X2F1eF8yKHNpemVfdHlwZSBfX3JlcSwgX0NoYXJUIF9fYywgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgICB7IHJldHVybiBfU19jb25zdHJ1Y3QoX19yZXEsIF9fYywgX19hKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyYXRvcj4KKwlzdGF0aWMgX0NoYXJUKgorCV9TX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hKQorCXsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0luSXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgcmV0dXJuIF9TX2NvbnN0cnVjdF9hdXgoX19iZWcsIF9fZW5kLCBfX2EsIF9JbnRlZ3JhbCgpKTsKKwl9CisKKyAgICAgIC8vIEZvciBJbnB1dCBJdGVyYXRvcnMsIHVzZWQgaW4gaXN0cmVhbWJ1Zl9pdGVyYXRvcnMsIGV0Yy4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXJhdG9yPgorCXN0YXRpYyBfQ2hhclQqCisJIF9TX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZyk7CisKKyAgICAgIC8vIEZvciBmb3J3YXJkX2l0ZXJhdG9ycyB1cCB0byByYW5kb21fYWNjZXNzX2l0ZXJhdG9ycywgdXNlZCBmb3IKKyAgICAgIC8vIHN0cmluZzo6aXRlcmF0b3IsIF9DaGFyVCosIGV0Yy4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RJdGVyYXRvcj4KKwlzdGF0aWMgX0NoYXJUKgorCV9TX2NvbnN0cnVjdChfRndkSXRlcmF0b3IgX19iZWcsIF9Gd2RJdGVyYXRvciBfX2VuZCwgY29uc3QgX0FsbG9jJiBfX2EsCisJCSAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyk7CisKKyAgICAgIHN0YXRpYyBfQ2hhclQqCisgICAgICBfU19jb25zdHJ1Y3Qoc2l6ZV90eXBlIF9fcmVxLCBfQ2hhclQgX19jLCBjb25zdCBfQWxsb2MmIF9fYSk7CisKKyAgICBwdWJsaWM6CisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX21heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNpemVfdHlwZShfU19tYXhfc2l6ZSk7IH0KKworICAgICAgX0NoYXJUKgorICAgICAgX01fZGF0YSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhcGx1cy5fTV9wOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fbGVuZ3RoKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3JlcCgpLT5fTV9pbmZvLl9NX2xlbmd0aDsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2NhcGFjaXR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3JlcCgpLT5fTV9pbmZvLl9NX2NhcGFjaXR5OyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2lzX3NoYXJlZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9yZXAoKS0+X01faW5mby5fTV9yZWZjb3VudCA+IDA7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc2V0X2xlYWtlZCgpCisgICAgICB7IF9NX3JlcCgpLT5fTV9pbmZvLl9NX3JlZmNvdW50ID0gLTE7IH0KKworICAgICAgdm9pZAorICAgICAgX01fbGVhaygpICAgIC8vIGZvciB1c2UgaW4gYmVnaW4oKSAmIG5vbi1jb25zdCBvcFtdCisgICAgICB7CisJaWYgKCFfTV9pc19sZWFrZWQoKSkKKwkgIF9NX2xlYWtfaGFyZCgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfbGVuZ3RoKHNpemVfdHlwZSBfX24pCisgICAgICB7IF9NX3JlcCgpLT5fTV9zZXRfbGVuZ3RoKF9fbik7IH0KKworICAgICAgX19yY19zdHJpbmdfYmFzZSgpCisgICAgICA6IF9NX2RhdGFwbHVzKF9TX2VtcHR5X3JlcC5fTV9yZWZjb3B5KCkpIHsgfQorCisgICAgICBfX3JjX3N0cmluZ19iYXNlKGNvbnN0IF9BbGxvYyYgX19hKTsKKworICAgICAgX19yY19zdHJpbmdfYmFzZShjb25zdCBfX3JjX3N0cmluZ19iYXNlJiBfX3Jjcyk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBfX3JjX3N0cmluZ19iYXNlKF9fcmNfc3RyaW5nX2Jhc2UmJiBfX3JjcykKKyAgICAgIDogX01fZGF0YXBsdXMoX19yY3MuX01fZGF0YXBsdXMpCisgICAgICB7IF9fcmNzLl9NX2RhdGEoX1NfZW1wdHlfcmVwLl9NX3JlZmNvcHkoKSk7IH0KKyNlbmRpZgorCisgICAgICBfX3JjX3N0cmluZ19iYXNlKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJX19yY19zdHJpbmdfYmFzZShfSW5wdXRJdGVyYXRvciBfX2JlZywgX0lucHV0SXRlcmF0b3IgX19lbmQsCisJCQkgY29uc3QgX0FsbG9jJiBfX2EpOworCisgICAgICB+X19yY19zdHJpbmdfYmFzZSgpCisgICAgICB7IF9NX2Rpc3Bvc2UoKTsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZSYKKyAgICAgIF9NX2dldF9hbGxvY2F0b3IoKQorICAgICAgeyByZXR1cm4gX01fZGF0YXBsdXM7IH0KKworICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmCisgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGFwbHVzOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N3YXAoX19yY19zdHJpbmdfYmFzZSYgX19yY3MpOworCisgICAgICB2b2lkCisgICAgICBfTV9hc3NpZ24oY29uc3QgX19yY19zdHJpbmdfYmFzZSYgX19yY3MpOworCisgICAgICB2b2lkCisgICAgICBfTV9yZXNlcnZlKHNpemVfdHlwZSBfX3Jlcyk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX211dGF0ZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX2xlbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCQlzaXplX3R5cGUgX19sZW4yKTsKKworICAgICAgdm9pZAorICAgICAgX01fZXJhc2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKTsKKworICAgICAgdm9pZAorICAgICAgX01fY2xlYXIoKQorICAgICAgeyBfTV9lcmFzZShzaXplX3R5cGUoMCksIF9NX2xlbmd0aCgpKTsgfQorCisgICAgICBib29sCisgICAgICBfTV9jb21wYXJlKGNvbnN0IF9fcmNfc3RyaW5nX2Jhc2UmKSBjb25zdAorICAgICAgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfUmVwX2VtcHR5CisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9TX2VtcHR5X3JlcDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBfX3JjX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X1JlcCoKKyAgICBfX3JjX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X1JlcDo6CisgICAgX1NfY3JlYXRlKHNpemVfdHlwZSBfX2NhcGFjaXR5LCBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHksCisJICAgICAgY29uc3QgX0FsbG9jJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDgzLiAgU3RyaW5nOjpucG9zIHZzLiBzdHJpbmc6Om1heF9zaXplKCkKKyAgICAgIGlmIChfX2NhcGFjaXR5ID4gc2l6ZV90eXBlKF9TX21heF9zaXplKSkKKwlzdGQ6Ol9fdGhyb3dfbGVuZ3RoX2Vycm9yKF9fTigiX19yY19zdHJpbmdfYmFzZTo6X1JlcDo6X1NfY3JlYXRlIikpOworCisgICAgICAvLyBUaGUgc3RhbmRhcmQgcGxhY2VzIG5vIHJlc3RyaWN0aW9uIG9uIGFsbG9jYXRpbmcgbW9yZSBtZW1vcnkKKyAgICAgIC8vIHRoYW4gaXMgc3RyaWN0bHkgbmVlZGVkIHdpdGhpbiB0aGlzIGxheWVyIGF0IHRoZSBtb21lbnQgb3IgYXMKKyAgICAgIC8vIHJlcXVlc3RlZCBieSBhbiBleHBsaWNpdCBhcHBsaWNhdGlvbiBjYWxsIHRvIHJlc2VydmUoKS4KKworICAgICAgLy8gTWFueSBtYWxsb2MgaW1wbGVtZW50YXRpb25zIHBlcmZvcm0gcXVpdGUgcG9vcmx5IHdoZW4gYW4KKyAgICAgIC8vIGFwcGxpY2F0aW9uIGF0dGVtcHRzIHRvIGFsbG9jYXRlIG1lbW9yeSBpbiBhIHN0ZXB3aXNlIGZhc2hpb24KKyAgICAgIC8vIGdyb3dpbmcgZWFjaCBhbGxvY2F0aW9uIHNpemUgYnkgb25seSAxIGNoYXIuICBBZGRpdGlvbmFsbHksCisgICAgICAvLyBpdCBtYWtlcyBsaXR0bGUgc2Vuc2UgdG8gYWxsb2NhdGUgbGVzcyBsaW5lYXIgbWVtb3J5IHRoYW4gdGhlCisgICAgICAvLyBuYXR1cmFsIGJsb2NraW5nIHNpemUgb2YgdGhlIG1hbGxvYyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHdlIHdvdWxkIG5lZWQgYSBzb21ld2hhdCBsb3ctbGV2ZWwgY2FsY3VsYXRpb24KKyAgICAgIC8vIHdpdGggdHVuZWQgcGFyYW1ldGVycyB0byBnZXQgdGhpcyBwZXJmZWN0IGZvciBhbnkgcGFydGljdWxhcgorICAgICAgLy8gbWFsbG9jIGltcGxlbWVudGF0aW9uLiAgRm9ydHVuYXRlbHksIGdlbmVyYWxpemF0aW9ucyBhYm91dAorICAgICAgLy8gY29tbW9uIGZlYXR1cmVzIHNlZW4gYW1vbmcgaW1wbGVtZW50YXRpb25zIHNlZW1zIHRvIHN1ZmZpY2UuCisKKyAgICAgIC8vIF9fcGFnZXNpemUgbmVlZCBub3QgbWF0Y2ggdGhlIGFjdHVhbCBWTSBwYWdlIHNpemUgZm9yIGdvb2QKKyAgICAgIC8vIHJlc3VsdHMgaW4gcHJhY3RpY2UsIHRodXMgd2UgcGljayBhIGNvbW1vbiB2YWx1ZSBvbiB0aGUgbG93CisgICAgICAvLyBzaWRlLiAgX19tYWxsb2NfaGVhZGVyX3NpemUgaXMgYW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZgorICAgICAgLy8gb3ZlcmhlYWQgcGVyIG1lbW9yeSBhbGxvY2F0aW9uIChpbiBwcmFjdGljZSBzZWVuIE4gKiBzaXplb2YKKyAgICAgIC8vICh2b2lkKikgd2hlcmUgTiBpcyAwLCAyIG9yIDQpLiAgQWNjb3JkaW5nIHRvIGZvbGtsb3JlLAorICAgICAgLy8gcGlja2luZyB0aGlzIHZhbHVlIG9uIHRoZSBoaWdoIHNpZGUgaXMgYmV0dGVyIHRoYW4KKyAgICAgIC8vIGxvdy1iYWxsaW5nIGl0IChlc3BlY2lhbGx5IHdoZW4gdGhpcyBhbGdvcml0aG0gaXMgdXNlZCB3aXRoCisgICAgICAvLyBtYWxsb2MgaW1wbGVtZW50YXRpb25zIHRoYXQgYWxsb2NhdGUgbWVtb3J5IGJsb2NrcyByb3VuZGVkIHVwCisgICAgICAvLyB0byBhIHNpemUgd2hpY2ggaXMgYSBwb3dlciBvZiAyKS4KKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3BhZ2VzaXplID0gNDA5NjsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX21hbGxvY19oZWFkZXJfc2l6ZSA9IDQgKiBzaXplb2Yodm9pZCopOworCisgICAgICAvLyBUaGUgYmVsb3cgaW1wbGVtZW50cyBhbiBleHBvbmVudGlhbCBncm93dGggcG9saWN5LCBuZWNlc3NhcnkgdG8KKyAgICAgIC8vIG1lZXQgYW1vcnRpemVkIGxpbmVhciB0aW1lIHJlcXVpcmVtZW50cyBvZiB0aGUgbGlicmFyeTogc2VlCisgICAgICAvLyBodHRwOi8vZ2NjLmdudS5vcmcvbWwvbGlic3RkYysrLzIwMDEtMDcvbXNnMDAwODUuaHRtbC4KKyAgICAgIGlmIChfX2NhcGFjaXR5ID4gX19vbGRfY2FwYWNpdHkgJiYgX19jYXBhY2l0eSA8IDIgKiBfX29sZF9jYXBhY2l0eSkKKwl7CisJICBfX2NhcGFjaXR5ID0gMiAqIF9fb2xkX2NhcGFjaXR5OworCSAgLy8gTmV2ZXIgYWxsb2NhdGUgYSBzdHJpbmcgYmlnZ2VyIHRoYW4gX1NfbWF4X3NpemUuCisJICBpZiAoX19jYXBhY2l0eSA+IHNpemVfdHlwZShfU19tYXhfc2l6ZSkpCisJICAgIF9fY2FwYWNpdHkgPSBzaXplX3R5cGUoX1NfbWF4X3NpemUpOworCX0KKworICAgICAgLy8gTkI6IE5lZWQgYW4gYXJyYXkgb2YgY2hhcl90eXBlW19fY2FwYWNpdHldLCBwbHVzIGEgdGVybWluYXRpbmcKKyAgICAgIC8vIG51bGwgY2hhcl90eXBlKCkgZWxlbWVudCwgcGx1cyBlbm91Z2ggZm9yIHRoZSBfUmVwIGRhdGEgc3RydWN0dXJlLAorICAgICAgLy8gcGx1cyBzaXplb2YoX1JlcCkgLSAxIHRvIHVwcGVyIHJvdW5kIHRvIGEgc2l6ZSBtdWx0aXBsZSBvZgorICAgICAgLy8gc2l6ZW9mKF9SZXApLgorICAgICAgLy8gV2hldy4gU2VlbWluZ2x5IHNvIG5lZWR5LCB5ZXQgc28gZWxlbWVudGFsLgorICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9ICgoX19jYXBhY2l0eSArIDEpICogc2l6ZW9mKF9DaGFyVCkKKwkJCSAgKyAyICogc2l6ZW9mKF9SZXApIC0gMSk7CisKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2Fkal9zaXplID0gX19zaXplICsgX19tYWxsb2NfaGVhZGVyX3NpemU7CisgICAgICBpZiAoX19hZGpfc2l6ZSA+IF9fcGFnZXNpemUgJiYgX19jYXBhY2l0eSA+IF9fb2xkX2NhcGFjaXR5KQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2V4dHJhID0gX19wYWdlc2l6ZSAtIF9fYWRqX3NpemUgJSBfX3BhZ2VzaXplOworCSAgX19jYXBhY2l0eSArPSBfX2V4dHJhIC8gc2l6ZW9mKF9DaGFyVCk7CisJICBpZiAoX19jYXBhY2l0eSA+IHNpemVfdHlwZShfU19tYXhfc2l6ZSkpCisJICAgIF9fY2FwYWNpdHkgPSBzaXplX3R5cGUoX1NfbWF4X3NpemUpOworCSAgX19zaXplID0gKF9fY2FwYWNpdHkgKyAxKSAqIHNpemVvZihfQ2hhclQpICsgMiAqIHNpemVvZihfUmVwKSAtIDE7CisJfQorCisgICAgICAvLyBOQjogTWlnaHQgdGhyb3csIGJ1dCBubyB3b3JyaWVzIGFib3V0IGEgbGVhaywgbWF0ZTogX1JlcCgpCisgICAgICAvLyBkb2VzIG5vdCB0aHJvdy4KKyAgICAgIF9SZXAqIF9fcGxhY2UgPSBfUmVwX2FsbG9jX3R5cGUoX19hbGxvYykuYWxsb2NhdGUoX19zaXplIC8gc2l6ZW9mKF9SZXApKTsKKyAgICAgIF9SZXAqIF9fcCA9IG5ldyAoX19wbGFjZSkgX1JlcDsKKyAgICAgIF9fcC0+X01faW5mby5fTV9jYXBhY2l0eSA9IF9fY2FwYWNpdHk7CisgICAgICByZXR1cm4gX19wOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9SZXA6OgorICAgIF9NX2Rlc3Ryb3koY29uc3QgX0FsbG9jJiBfX2EpIHRocm93ICgpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9ICgoX01faW5mby5fTV9jYXBhY2l0eSArIDEpICogc2l6ZW9mKF9DaGFyVCkKKwkJCQkrIDIgKiBzaXplb2YoX1JlcCkgLSAxKTsKKyAgICAgIF9SZXBfYWxsb2NfdHlwZShfX2EpLmRlYWxsb2NhdGUodGhpcywgX19zaXplIC8gc2l6ZW9mKF9SZXApKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX0NoYXJUKgorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfUmVwOjoKKyAgICBfTV9jbG9uZShjb25zdCBfQWxsb2MmIF9fYWxsb2MsIHNpemVfdHlwZSBfX3JlcykKKyAgICB7CisgICAgICAvLyBSZXF1ZXN0ZWQgY2FwYWNpdHkgb2YgdGhlIGNsb25lLgorICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fcmVxdWVzdGVkX2NhcCA9IF9NX2luZm8uX01fbGVuZ3RoICsgX19yZXM7CisgICAgICBfUmVwKiBfX3IgPSBfUmVwOjpfU19jcmVhdGUoX19yZXF1ZXN0ZWRfY2FwLCBfTV9pbmZvLl9NX2NhcGFjaXR5LAorCQkJCSAgX19hbGxvYyk7CisKKyAgICAgIGlmIChfTV9pbmZvLl9NX2xlbmd0aCkKKwlfX3JjX3N0cmluZ19iYXNlOjpfU19jb3B5KF9fci0+X01fcmVmZGF0YSgpLCBfTV9yZWZkYXRhKCksIF9NX2luZm8uX01fbGVuZ3RoKTsKKworICAgICAgX19yLT5fTV9zZXRfbGVuZ3RoKF9NX2luZm8uX01fbGVuZ3RoKTsKKyAgICAgIHJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9fcmNfc3RyaW5nX2Jhc2UoY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfX2EsIF9TX2NvbnN0cnVjdChzaXplX3R5cGUoKSwgX0NoYXJUKCksIF9fYSkpIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfX3JjX3N0cmluZ19iYXNlKGNvbnN0IF9fcmNfc3RyaW5nX2Jhc2UmIF9fcmNzKQorICAgIDogX01fZGF0YXBsdXMoX19yY3MuX01fZ2V0X2FsbG9jYXRvcigpLAorCQkgIF9fcmNzLl9NX2dyYWIoX19yY3MuX01fZ2V0X2FsbG9jYXRvcigpKSkgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9fcmNfc3RyaW5nX2Jhc2Uoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYywgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfX2EsIF9TX2NvbnN0cnVjdChfX24sIF9fYywgX19hKSkgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9fcmNfc3RyaW5nX2Jhc2UoX0lucHV0SXRlcmF0b3IgX19iZWcsIF9JbnB1dEl0ZXJhdG9yIF9fZW5kLAorCQkgICAgIGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fZGF0YXBsdXMoX19hLCBfU19jb25zdHJ1Y3QoX19iZWcsIF9fZW5kLCBfX2EpKSB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX2xlYWtfaGFyZCgpCisgICAgeworICAgICAgaWYgKF9NX2lzX3NoYXJlZCgpKQorCV9NX2VyYXNlKDAsIDApOworICAgICAgX01fc2V0X2xlYWtlZCgpOworICAgIH0KKworICAvLyBOQjogVGhpcyBpcyB0aGUgc3BlY2lhbCBjYXNlIGZvciBJbnB1dCBJdGVyYXRvcnMsIHVzZWQgaW4KKyAgLy8gaXN0cmVhbWJ1Zl9pdGVyYXRvcnMsIGV0Yy4KKyAgLy8gSW5wdXQgSXRlcmF0b3JzIGhhdmUgYSBjb3N0IHN0cnVjdHVyZSB2ZXJ5IGRpZmZlcmVudCBmcm9tCisgIC8vIHBvaW50ZXJzLCBjYWxsaW5nIGZvciBhIGRpZmZlcmVudCBjb2Rpbmcgc3R5bGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXJhdG9yPgorICAgICAgX0NoYXJUKgorICAgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgICAgX1NfY29uc3RydWN0KF9Jbkl0ZXJhdG9yIF9fYmVnLCBfSW5JdGVyYXRvciBfX2VuZCwgY29uc3QgX0FsbG9jJiBfX2EsCisJCSAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCWlmIChfX2JlZyA9PSBfX2VuZCAmJiBfX2EgPT0gX0FsbG9jKCkpCisJICByZXR1cm4gX1NfZW1wdHlfcmVwLl9NX3JlZmNvcHkoKTsKKworCS8vIEF2b2lkIHJlYWxsb2NhdGlvbiBmb3IgY29tbW9uIGNhc2UuCisJX0NoYXJUIF9fYnVmWzEyOF07CisJc2l6ZV90eXBlIF9fbGVuID0gMDsKKwl3aGlsZSAoX19iZWcgIT0gX19lbmQgJiYgX19sZW4gPCBzaXplb2YoX19idWYpIC8gc2l6ZW9mKF9DaGFyVCkpCisJICB7CisJICAgIF9fYnVmW19fbGVuKytdID0gKl9fYmVnOworCSAgICArK19fYmVnOworCSAgfQorCV9SZXAqIF9fciA9IF9SZXA6Ol9TX2NyZWF0ZShfX2xlbiwgc2l6ZV90eXBlKDApLCBfX2EpOworCV9TX2NvcHkoX19yLT5fTV9yZWZkYXRhKCksIF9fYnVmLCBfX2xlbik7CisJX190cnkKKwkgIHsKKwkgICAgd2hpbGUgKF9fYmVnICE9IF9fZW5kKQorCSAgICAgIHsKKwkJaWYgKF9fbGVuID09IF9fci0+X01faW5mby5fTV9jYXBhY2l0eSkKKwkJICB7CisJCSAgICAvLyBBbGxvY2F0ZSBtb3JlIHNwYWNlLgorCQkgICAgX1JlcCogX19hbm90aGVyID0gX1JlcDo6X1NfY3JlYXRlKF9fbGVuICsgMSwgX19sZW4sIF9fYSk7CisJCSAgICBfU19jb3B5KF9fYW5vdGhlci0+X01fcmVmZGF0YSgpLCBfX3ItPl9NX3JlZmRhdGEoKSwgX19sZW4pOworCQkgICAgX19yLT5fTV9kZXN0cm95KF9fYSk7CisJCSAgICBfX3IgPSBfX2Fub3RoZXI7CisJCSAgfQorCQlfX3ItPl9NX3JlZmRhdGEoKVtfX2xlbisrXSA9ICpfX2JlZzsKKwkJKytfX2JlZzsKKwkgICAgICB9CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9fci0+X01fZGVzdHJveShfX2EpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKwlfX3ItPl9NX3NldF9sZW5ndGgoX19sZW4pOworCXJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyYXRvcj4KKyAgICAgIF9DaGFyVCoKKyAgICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICAgIF9TX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCWlmIChfX2JlZyA9PSBfX2VuZCAmJiBfX2EgPT0gX0FsbG9jKCkpCisJICByZXR1cm4gX1NfZW1wdHlfcmVwLl9NX3JlZmNvcHkoKTsKKworCS8vIE5COiBOb3QgcmVxdWlyZWQsIGJ1dCBjb25zaWRlcmVkIGJlc3QgcHJhY3RpY2UuCisJaWYgKF9faXNfbnVsbF9wb2ludGVyKF9fYmVnKSAmJiBfX2JlZyAhPSBfX2VuZCkKKwkgIHN0ZDo6X190aHJvd19sb2dpY19lcnJvcihfX04oIl9fcmNfc3RyaW5nX2Jhc2U6OiIKKwkJCQkgICAgICAgIl9TX2NvbnN0cnVjdCBudWxsIG5vdCB2YWxpZCIpKTsKKworCWNvbnN0IHNpemVfdHlwZSBfX2RuZXcgPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KHN0ZDo6ZGlzdGFuY2UoX19iZWcsCisJCQkJCQkJCSAgICAgIF9fZW5kKSk7CisJLy8gQ2hlY2sgZm9yIG91dF9vZl9yYW5nZSBhbmQgbGVuZ3RoX2Vycm9yIGV4Y2VwdGlvbnMuCisJX1JlcCogX19yID0gX1JlcDo6X1NfY3JlYXRlKF9fZG5ldywgc2l6ZV90eXBlKDApLCBfX2EpOworCV9fdHJ5CisJICB7IF9fcmNfc3RyaW5nX2Jhc2U6Ol9TX2NvcHlfY2hhcnMoX19yLT5fTV9yZWZkYXRhKCksIF9fYmVnLCBfX2VuZCk7IH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX19yLT5fTV9kZXN0cm95KF9fYSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCV9fci0+X01fc2V0X2xlbmd0aChfX2RuZXcpOworCXJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfQ2hhclQqCisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9TX2NvbnN0cnVjdChzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICB7CisgICAgICBpZiAoX19uID09IDAgJiYgX19hID09IF9BbGxvYygpKQorCXJldHVybiBfU19lbXB0eV9yZXAuX01fcmVmY29weSgpOworCisgICAgICAvLyBDaGVjayBmb3Igb3V0X29mX3JhbmdlIGFuZCBsZW5ndGhfZXJyb3IgZXhjZXB0aW9ucy4KKyAgICAgIF9SZXAqIF9fciA9IF9SZXA6Ol9TX2NyZWF0ZShfX24sIHNpemVfdHlwZSgwKSwgX19hKTsKKyAgICAgIGlmIChfX24pCisJX19yY19zdHJpbmdfYmFzZTo6X1NfYXNzaWduKF9fci0+X01fcmVmZGF0YSgpLCBfX24sIF9fYyk7CisKKyAgICAgIF9fci0+X01fc2V0X2xlbmd0aChfX24pOworICAgICAgcmV0dXJuIF9fci0+X01fcmVmZGF0YSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX3N3YXAoX19yY19zdHJpbmdfYmFzZSYgX19yY3MpCisgICAgeworICAgICAgaWYgKF9NX2lzX2xlYWtlZCgpKQorCV9NX3NldF9zaGFyYWJsZSgpOworICAgICAgaWYgKF9fcmNzLl9NX2lzX2xlYWtlZCgpKQorCV9fcmNzLl9NX3NldF9zaGFyYWJsZSgpOworCisgICAgICBfQ2hhclQqIF9fdG1wID0gX01fZGF0YSgpOworICAgICAgX01fZGF0YShfX3Jjcy5fTV9kYXRhKCkpOworICAgICAgX19yY3MuX01fZGF0YShfX3RtcCk7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzMS4gU3dhcHBpbmcgY29udGFpbmVycyB3aXRoIHVuZXF1YWwgYWxsb2NhdG9ycy4KKyAgICAgIHN0ZDo6X19hbGxvY19zd2FwPGFsbG9jYXRvcl90eXBlPjo6X1NfZG9faXQoX01fZ2V0X2FsbG9jYXRvcigpLAorCQkJCQkJICBfX3Jjcy5fTV9nZXRfYWxsb2NhdG9yKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX2Fzc2lnbihjb25zdCBfX3JjX3N0cmluZ19iYXNlJiBfX3JjcykKKyAgICB7CisgICAgICBpZiAoX01fcmVwKCkgIT0gX19yY3MuX01fcmVwKCkpCisJeworCSAgX0NoYXJUKiBfX3RtcCA9IF9fcmNzLl9NX2dyYWIoX01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgIF9NX2Rpc3Bvc2UoKTsKKwkgIF9NX2RhdGEoX190bXApOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9yZXNlcnZlKHNpemVfdHlwZSBfX3JlcykKKyAgICB7CisgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qgc2hyaW5rIGJlbG93IHRoZSBjdXJyZW50IHNpemUuCisgICAgICBpZiAoX19yZXMgPCBfTV9sZW5ndGgoKSkKKwlfX3JlcyA9IF9NX2xlbmd0aCgpOworCisgICAgICBpZiAoX19yZXMgIT0gX01fY2FwYWNpdHkoKSB8fCBfTV9pc19zaGFyZWQoKSkKKwl7CisJICBfQ2hhclQqIF9fdG1wID0gX01fcmVwKCktPl9NX2Nsb25lKF9NX2dldF9hbGxvY2F0b3IoKSwKKwkJCQkJICAgICBfX3JlcyAtIF9NX2xlbmd0aCgpKTsKKwkgIF9NX2Rpc3Bvc2UoKTsKKwkgIF9NX2RhdGEoX190bXApOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9tdXRhdGUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19sZW4xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkgICAgICBzaXplX3R5cGUgX19sZW4yKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2hvd19tdWNoID0gX01fbGVuZ3RoKCkgLSBfX3BvcyAtIF9fbGVuMTsKKworICAgICAgX1JlcCogX19yID0gX1JlcDo6X1NfY3JlYXRlKF9NX2xlbmd0aCgpICsgX19sZW4yIC0gX19sZW4xLAorCQkJCSAgX01fY2FwYWNpdHkoKSwgX01fZ2V0X2FsbG9jYXRvcigpKTsKKworICAgICAgaWYgKF9fcG9zKQorCXRoaXMtPl9TX2NvcHkoX19yLT5fTV9yZWZkYXRhKCksIF9NX2RhdGEoKSwgX19wb3MpOworICAgICAgaWYgKF9fcyAmJiBfX2xlbjIpCisJdGhpcy0+X1NfY29weShfX3ItPl9NX3JlZmRhdGEoKSArIF9fcG9zLCBfX3MsIF9fbGVuMik7CisgICAgICBpZiAoX19ob3dfbXVjaCkKKwl0aGlzLT5fU19jb3B5KF9fci0+X01fcmVmZGF0YSgpICsgX19wb3MgKyBfX2xlbjIsCisJCV9NX2RhdGEoKSArIF9fcG9zICsgX19sZW4xLCBfX2hvd19tdWNoKTsKKworICAgICAgX01fZGlzcG9zZSgpOworICAgICAgX01fZGF0YShfX3ItPl9NX3JlZmRhdGEoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfX3JjX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fZXJhc2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX25ld19zaXplID0gX01fbGVuZ3RoKCkgLSBfX247CisgICAgICBjb25zdCBzaXplX3R5cGUgX19ob3dfbXVjaCA9IF9NX2xlbmd0aCgpIC0gX19wb3MgLSBfX247CisKKyAgICAgIGlmIChfTV9pc19zaGFyZWQoKSkKKwl7CisJICAvLyBNdXN0IHJlYWxsb2NhdGUuCisJICBfUmVwKiBfX3IgPSBfUmVwOjpfU19jcmVhdGUoX19uZXdfc2l6ZSwgX01fY2FwYWNpdHkoKSwKKwkJCQkgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkpOworCisJICBpZiAoX19wb3MpCisJICAgIHRoaXMtPl9TX2NvcHkoX19yLT5fTV9yZWZkYXRhKCksIF9NX2RhdGEoKSwgX19wb3MpOworCSAgaWYgKF9faG93X211Y2gpCisJICAgIHRoaXMtPl9TX2NvcHkoX19yLT5fTV9yZWZkYXRhKCkgKyBfX3BvcywKKwkJICAgIF9NX2RhdGEoKSArIF9fcG9zICsgX19uLCBfX2hvd19tdWNoKTsKKworCSAgX01fZGlzcG9zZSgpOworCSAgX01fZGF0YShfX3ItPl9NX3JlZmRhdGEoKSk7CisJfQorICAgICAgZWxzZSBpZiAoX19ob3dfbXVjaCAmJiBfX24pCisJeworCSAgLy8gV29yayBpbi1wbGFjZS4KKwkgIHRoaXMtPl9TX21vdmUoX01fZGF0YSgpICsgX19wb3MsCisJCSAgX01fZGF0YSgpICsgX19wb3MgKyBfX24sIF9faG93X211Y2gpOworCX0KKworICAgICAgX01fcmVwKCktPl9NX3NldF9sZW5ndGgoX19uZXdfc2l6ZSk7CisgICAgfQorCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fcmNfc3RyaW5nX2Jhc2U8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwKKwkJICAgICBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+OjoKKyAgICBfTV9jb21wYXJlKGNvbnN0IF9fcmNfc3RyaW5nX2Jhc2UmIF9fcmNzKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChfTV9yZXAoKSA9PSBfX3Jjcy5fTV9yZXAoKSkKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX3JjX3N0cmluZ19iYXNlPHdjaGFyX3QsIHN0ZDo6Y2hhcl90cmFpdHM8d2NoYXJfdD4sCisJCSAgICAgc3RkOjphbGxvY2F0b3I8d2NoYXJfdD4gPjo6CisgICAgX01fY29tcGFyZShjb25zdCBfX3JjX3N0cmluZ19iYXNlJiBfX3JjcykgY29uc3QKKyAgICB7CisgICAgICBpZiAoX01fcmVwKCkgPT0gX19yY3MuX01fcmVwKCkpCisJcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9SQ19TVFJJTkdfQkFTRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9yb3BlIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcm9wZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGViMWU4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcm9wZQpAQCAtMCwwICsxLDI5NzYgQEAKKy8vIFNHSSdzIHJvcGUgY2xhc3MgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGV4dC9yb3BlCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4gCisgKi8KKworI2lmbmRlZiBfUk9QRQorI2RlZmluZSBfUk9QRSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8Yml0cy9zdGxfY29uc3RydWN0Lmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfdW5pbml0aWFsaXplZC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfbnVtZXJpYy5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9ndGhyLmg+CisjaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+CisKKyMgaWZkZWYgX19HQworIyAgIGRlZmluZSBfX0dDX0NPTlNUIGNvbnN0CisjIGVsc2UKKyMgICBkZWZpbmUgX19HQ19DT05TVCAgIC8vIGNvbnN0YW50IGV4Y2VwdCBmb3IgZGVhbGxvY2F0aW9uCisjIGVuZGlmCisKKyNpbmNsdWRlIDxleHQvbWVtb3J5PiAvLyBGb3IgdW5pbml0aWFsaXplZF9jb3B5X24KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgICAgZW51bSB7IF9TX21heF9yb3BlX2RlcHRoID0gNDUgfTsKKyAgICBlbnVtIF9UYWcge19TX2xlYWYsIF9TX2NvbmNhdCwgX1Nfc3Vic3RyaW5nZm4sIF9TX2Z1bmN0aW9ufTsKKyAgfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKKworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisgIHVzaW5nIHN0ZDo6YWxsb2NhdG9yOworICB1c2luZyBzdGQ6Ol9EZXN0cm95OworCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFNlZSBsaWJzdGRjKysvMzY4MzIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgdm9pZAorICAgIF9EZXN0cm95X2NvbnN0KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9BbGxvY2F0b3IgX19hbGxvYykKKyAgICB7CisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlfX2FsbG9jLmRlc3Ryb3koJipfX2ZpcnN0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX0Rlc3Ryb3lfY29uc3QoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgYWxsb2NhdG9yPF9UcD4pCisgICAgeyBfRGVzdHJveShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgLy8gVGhlIF9TX2VvcyBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aG9zZSBmdW5jdGlvbnMgdGhhdAorICAvLyBjb252ZXJ0IHRvL2Zyb20gQy1saWtlIHN0cmluZ3MgdG8gZGV0ZWN0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAgCisgIC8vIFRoZSBlbmQtb2YtQy1zdHJpbmcgY2hhcmFjdGVyLgorICAvLyBUaGlzIGlzIHdoYXQgdGhlIGRyYWZ0IHN0YW5kYXJkIHNheXMgaXQgc2hvdWxkIGJlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorICAgIGlubGluZSBfQ2hhclQKKyAgICBfU19lb3MoX0NoYXJUKikKKyAgICB7IHJldHVybiBfQ2hhclQoKTsgfQorCisgIC8vIFRlc3QgZm9yIGJhc2ljIGNoYXJhY3RlciB0eXBlcy4KKyAgLy8gRm9yIGJhc2ljIGNoYXJhY3RlciB0eXBlcyBsZWF2ZXMgaGF2aW5nIGEgdHJhaWxpbmcgZW9zLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgX1NfaXNfYmFzaWNfY2hhcl90eXBlKF9DaGFyVCopCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKyAgCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBfU19pc19vbmVfYnl0ZV9jaGFyX3R5cGUoX0NoYXJUKikKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCisgIGlubGluZSBib29sCisgIF9TX2lzX2Jhc2ljX2NoYXJfdHlwZShjaGFyKikKKyAgeyByZXR1cm4gdHJ1ZTsgfQorICAKKyAgaW5saW5lIGJvb2wKKyAgX1NfaXNfb25lX2J5dGVfY2hhcl90eXBlKGNoYXIqKQorICB7IHJldHVybiB0cnVlOyB9CisgIAorICBpbmxpbmUgYm9vbAorICBfU19pc19iYXNpY19jaGFyX3R5cGUod2NoYXJfdCopCisgIHsgcmV0dXJuIHRydWU7IH0KKworICAvLyBTdG9yZSBhbiBlb3MgaWZmIF9DaGFyVCBpcyBhIGJhc2ljIGNoYXJhY3RlciB0eXBlLgorICAvLyBEbyBub3QgcmVmZXJlbmNlIF9TX2VvcyBpZiBpdCBpc24ndC4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9TX2NvbmRfc3RvcmVfZW9zKF9DaGFyVCYpIHsgfQorCisgIGlubGluZSB2b2lkCisgIF9TX2NvbmRfc3RvcmVfZW9zKGNoYXImIF9fYykKKyAgeyBfX2MgPSAwOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX1NfY29uZF9zdG9yZV9lb3Mod2NoYXJfdCYgX19jKQorICB7IF9fYyA9IDA7IH0KKworICAvLyBjaGFyX3Byb2R1Y2VycyBhcmUgbG9naWNhbGx5IGZ1bmN0aW9ucyB0aGF0IGdlbmVyYXRlIGEgc2VjdGlvbiBvZgorICAvLyBhIHN0cmluZy4gIFRoZXNlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gcm9wZXMuICBUaGUgcmVzdWx0aW5nIHJvcGUKKyAgLy8gaW52b2tlcyB0aGUgY2hhcl9wcm9kdWNlciBvbiBkZW1hbmQuICBUaGlzIGFsbG93cywgZm9yIGV4YW1wbGUsCisgIC8vIGZpbGVzIHRvIGJlIHZpZXdlZCBhcyByb3BlcyB3aXRob3V0IHJlYWRpbmcgdGhlIGVudGlyZSBmaWxlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorICAgIGNsYXNzIGNoYXJfcHJvZHVjZXIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdmlydHVhbCB+Y2hhcl9wcm9kdWNlcigpIHsgfTsKKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBvcGVyYXRvcigpKHNpemVfdCBfX3N0YXJ0X3Bvcywgc2l6ZV90IF9fbGVuLAorCQkgX0NoYXJUKiBfX2J1ZmZlcikgPSAwOworICAgICAgLy8gQnVmZmVyIHNob3VsZCByZWFsbHkgYmUgYW4gYXJiaXRyYXJ5IG91dHB1dCBpdGVyYXRvci4KKyAgICAgIC8vIFRoYXQgd2F5IHdlIGNvdWxkIGZsYXR0ZW4gZGlyZWN0bHkgaW50byBhbiBvc3RyZWFtLCBldGMuCisgICAgICAvLyBUaGlzIGlzIHRob3JvdWdobHkgaW1wb3NzaWJsZSwgc2luY2UgaXRlcmF0b3IgdHlwZXMgZG9uJ3QKKyAgICAgIC8vIGhhdmUgcnVudGltZSBkZXNjcmlwdGlvbnMuCisgICAgfTsKKworICAvLyBTZXF1ZW5jZSBidWZmZXJzOgorICAvLworICAvLyBTZXF1ZW5jZSBtdXN0IHByb3ZpZGUgYW4gYXBwZW5kIG9wZXJhdGlvbiB0aGF0IGFwcGVuZHMgYW4KKyAgLy8gYXJyYXkgdG8gdGhlIHNlcXVlbmNlLiAgU2VxdWVuY2UgYnVmZmVycyBhcmUgdXNlZnVsIG9ubHkgaWYKKyAgLy8gYXBwZW5kaW5nIGFuIGVudGlyZSBhcnJheSBpcyBjaGVhcGVyIHRoYW4gYXBwZW5kaW5nIGVsZW1lbnQgYnkgZWxlbWVudC4KKyAgLy8gVGhpcyBpcyB0cnVlIGZvciBtYW55IHN0cmluZyByZXByZXNlbnRhdGlvbnMuCisgIC8vIFRoaXMgc2hvdWxkICBwZXJoYXBzIGluaGVyaXQgZnJvbSBvc3RyZWFtPHNlcXVlbmNlOjp2YWx1ZV90eXBlPgorICAvLyBhbmQgYmUgaW1wbGVtZW50ZWQgY29ycmVzcG9uZGluZ2x5LCBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQKKyAgLy8gZm9yIGZvcm1hdHRlZC4gIEZvciB0aGUgc2FrZSBvZiBwb3J0YWJpbGl0eSwgd2UgZG9uJ3QgZG8gdGhpcyB5ZXQuCisgIC8vCisgIC8vIEZvciBub3csIHNlcXVlbmNlIGJ1ZmZlcnMgYmVoYXZlIGFzIG91dHB1dCBpdGVyYXRvcnMuICBCdXQgdGhleSBhbHNvCisgIC8vIGJlaGF2ZSBhIGxpdHRsZSBsaWtlIGJhc2ljX29zdHJpbmdzdHJlYW08c2VxdWVuY2U6OnZhbHVlX3R5cGU+IGFuZCBhCisgIC8vIGxpdHRsZSBsaWtlIGNvbnRhaW5lcnMuCisKKyAgdGVtcGxhdGU8Y2xhc3MgX1NlcXVlbmNlLCBzaXplX3QgX0J1Zl9zeiA9IDEwMD4KKyAgICBjbGFzcyBzZXF1ZW5jZV9idWZmZXIKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfU2VxdWVuY2UqIF9NX3ByZWZpeDsKKyAgICAgIHZhbHVlX3R5cGUgX01fYnVmZmVyW19CdWZfc3pdOworICAgICAgc2l6ZV90ICAgICBfTV9idWZfY291bnQ7CisgICAgcHVibGljOgorCisgICAgICB2b2lkCisgICAgICBmbHVzaCgpCisgICAgICB7CisJX01fcHJlZml4LT5hcHBlbmQoX01fYnVmZmVyLCBfTV9idWZmZXIgKyBfTV9idWZfY291bnQpOworCV9NX2J1Zl9jb3VudCA9IDA7CisgICAgICB9CisgICAgICAKKyAgICAgIH5zZXF1ZW5jZV9idWZmZXIoKQorICAgICAgeyBmbHVzaCgpOyB9CisgICAgICAKKyAgICAgIHNlcXVlbmNlX2J1ZmZlcigpCisgICAgICA6IF9NX3ByZWZpeCgwKSwgX01fYnVmX2NvdW50KDApIHsgfQorCisgICAgICBzZXF1ZW5jZV9idWZmZXIoY29uc3Qgc2VxdWVuY2VfYnVmZmVyJiBfX3gpCisgICAgICB7CisJX01fcHJlZml4ID0gX194Ll9NX3ByZWZpeDsKKwlfTV9idWZfY291bnQgPSBfX3guX01fYnVmX2NvdW50OworCXN0ZDo6Y29weShfX3guX01fYnVmZmVyLCBfX3guX01fYnVmZmVyICsgX194Ll9NX2J1Zl9jb3VudCwgX01fYnVmZmVyKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyKHNlcXVlbmNlX2J1ZmZlciYgX194KQorICAgICAgeworCV9feC5mbHVzaCgpOworCV9NX3ByZWZpeCA9IF9feC5fTV9wcmVmaXg7CisJX01fYnVmX2NvdW50ID0gMDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyKF9TZXF1ZW5jZSYgX19zKQorICAgICAgOiBfTV9wcmVmaXgoJl9fcyksIF9NX2J1Zl9jb3VudCgwKSB7IH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyJgorICAgICAgb3BlcmF0b3I9KHNlcXVlbmNlX2J1ZmZlciYgX194KQorICAgICAgeworCV9feC5mbHVzaCgpOworCV9NX3ByZWZpeCA9IF9feC5fTV9wcmVmaXg7CisJX01fYnVmX2NvdW50ID0gMDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHNlcXVlbmNlX2J1ZmZlciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBzZXF1ZW5jZV9idWZmZXImIF9feCkKKyAgICAgIHsKKwlfTV9wcmVmaXggPSBfX3guX01fcHJlZml4OworCV9NX2J1Zl9jb3VudCA9IF9feC5fTV9idWZfY291bnQ7CisJc3RkOjpjb3B5KF9feC5fTV9idWZmZXIsIF9feC5fTV9idWZmZXIgKyBfX3guX01fYnVmX2NvdW50LCBfTV9idWZmZXIpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKHZhbHVlX3R5cGUgX194KQorICAgICAgeworCWlmIChfTV9idWZfY291bnQgPCBfQnVmX3N6KQorCSAgeworCSAgICBfTV9idWZmZXJbX01fYnVmX2NvdW50XSA9IF9feDsKKwkgICAgKytfTV9idWZfY291bnQ7CisJICB9CisJZWxzZQorCSAgeworCSAgICBmbHVzaCgpOworCSAgICBfTV9idWZmZXJbMF0gPSBfX3g7CisJICAgIF9NX2J1Zl9jb3VudCA9IDE7CisJICB9CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIGFwcGVuZCh2YWx1ZV90eXBlKiBfX3MsIHNpemVfdCBfX2xlbikKKyAgICAgIHsKKwlpZiAoX19sZW4gKyBfTV9idWZfY291bnQgPD0gX0J1Zl9zeikKKwkgIHsKKwkgICAgc2l6ZV90IF9faSA9IF9NX2J1Zl9jb3VudDsKKwkgICAgZm9yIChzaXplX3QgX19qID0gMDsgX19qIDwgX19sZW47IF9faSsrLCBfX2orKykKKwkgICAgICBfTV9idWZmZXJbX19pXSA9IF9fc1tfX2pdOworCSAgICBfTV9idWZfY291bnQgKz0gX19sZW47CisJICB9CisJZWxzZSBpZiAoMCA9PSBfTV9idWZfY291bnQpCisJICBfTV9wcmVmaXgtPmFwcGVuZChfX3MsIF9fcyArIF9fbGVuKTsKKwllbHNlCisJICB7CisJICAgIGZsdXNoKCk7CisJICAgIGFwcGVuZChfX3MsIF9fbGVuKTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgc2VxdWVuY2VfYnVmZmVyJgorICAgICAgd3JpdGUodmFsdWVfdHlwZSogX19zLCBzaXplX3QgX19sZW4pCisgICAgICB7CisJYXBwZW5kKF9fcywgX19sZW4pOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyJgorICAgICAgcHV0KHZhbHVlX3R5cGUgX194KQorICAgICAgeworCXB1c2hfYmFjayhfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIF9fcmhzKQorICAgICAgeworCXB1c2hfYmFjayhfX3Jocyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgCisgICAgICBzZXF1ZW5jZV9idWZmZXImCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgICAgCisgICAgICBzZXF1ZW5jZV9idWZmZXIKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworICAKKyAgLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgdHJlYXRlZCBhcyBwcml2YXRlLCBhdCBsZWFzdCBmb3Igbm93LgorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CisgICAgY2xhc3MgX1JvcGVfY2hhcl9jb25zdW1lcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBJZiB3ZSBoYWQgbWVtYmVyIHRlbXBsYXRlcywgdGhlc2Ugc2hvdWxkIG5vdCBiZSB2aXJ0dWFsLgorICAgICAgLy8gRm9yIG5vdyB3ZSBuZWVkIHRvIHVzZSBydW4tdGltZSBwYXJhbWV0cml6YXRpb24gd2hlcmUKKyAgICAgIC8vIGNvbXBpbGUtdGltZSB3b3VsZCBkby4gIEhlbmNlIHRoaXMgc2hvdWxkIGFsbCBiZSBwcml2YXRlCisgICAgICAvLyBmb3Igbm93LgorICAgICAgLy8gVGhlIHN5bW1ldHJ5IHdpdGggY2hhcl9wcm9kdWNlciBpcyBhY2NpZGVudGFsIGFuZCB0ZW1wb3JhcnkuCisgICAgICB2aXJ0dWFsIH5fUm9wZV9jaGFyX2NvbnN1bWVyKCkgeyB9OworICAKKyAgICAgIHZpcnR1YWwgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQ2hhclQqIF9fYnVmZmVyLCBzaXplX3QgX19sZW4pID0gMDsKKyAgICB9OworICAKKyAgLy8gRmlyc3QgYSBsb3Qgb2YgZm9yd2FyZCBkZWNsYXJhdGlvbnMuICBUaGUgc3RhbmRhcmQgc2VlbXMgdG8gcmVxdWlyZQorICAvLyBtdWNoIHN0cmljdGVyICJkZWNsYXJhdGlvbiBiZWZvcmUgdXNlIiB0aGFuIG1hbnkgb2YgdGhlIGltcGxlbWVudGF0aW9ucworICAvLyB0aGF0IHByZWNlZGVkIGl0LgorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyByb3BlOworICAKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9Sb3BlTGVhZjsKKyAgCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9Sb3BlRnVuY3Rpb247CisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX1JvcGVfUm9wZVN1YnN0cmluZzsKKyAgCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIF9Sb3BlX2l0ZXJhdG9yOworICAKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgX1JvcGVfY29uc3RfaXRlcmF0b3I7CisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBfUm9wZV9jaGFyX3JlZl9wcm94eTsKKyAgCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIF9Sb3BlX2NoYXJfcHRyX3Byb3h5OworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4mIF9feSk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3ItKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIHB0cmRpZmZfdCBfX24pOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICBwdHJkaWZmX3QgX19uKTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisocHRyZGlmZl90IF9fbiwKKwkgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KTsKKyAgCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHB0cmRpZmZfdAorICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3ItKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LCBwdHJkaWZmX3QgX19uKTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsIHB0cmRpZmZfdCBfX24pOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBwdHJkaWZmX3QKKyAgICBvcGVyYXRvci0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3kpOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsCisJICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fcmlnaHQpOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsIGNvbnN0IF9DaGFyVCogX19yaWdodCk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fbGVmdCwgX0NoYXJUIF9fcmlnaHQpOworCisgIC8vIFNvbWUgaGVscGVycywgc28gd2UgY2FuIHVzZSBwb3dlciBvbiByb3Blcy4KKyAgLy8gU2VlIGJlbG93IGZvciB3aHkgdGhpcyBpc24ndCBsb2NhbCB0byB0aGUgaW1wbGVtZW50YXRpb24uCisgIAorICAvLyBUaGlzIHVzZXMgYSBub25zdGFuZGFyZCByZWZjb3VudCBjb252ZW50aW9uLgorICAvLyBUaGUgcmVzdWx0IGhhcyByZWZjb3VudCAwLgorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX1JvcGVfQ29uY2F0X2ZuCisgICAgOiBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248cm9wZTxfQ2hhclQsIF9BbGxvYz4sIHJvcGU8X0NoYXJULCBfQWxsb2M+LAorCQkJCSAgcm9wZTxfQ2hhclQsIF9BbGxvYz4gPgorICAgIHsKKyAgICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgICBvcGVyYXRvcigpKGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJCSBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgICAgeyByZXR1cm4gX194ICsgX195OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgaWRlbnRpdHlfZWxlbWVudChfUm9wZV9Db25jYXRfZm48X0NoYXJULCBfQWxsb2M+KQorICAgIHsgcmV0dXJuIHJvcGU8X0NoYXJULCBfQWxsb2M+KCk7IH0KKworICAvLyBDbGFzcyBfUmVmY291bnRfQmFzZSBwcm92aWRlcyBhIHR5cGUsIF9SQ190LCBhIGRhdGEgbWVtYmVyLAorICAvLyBfTV9yZWZfY291bnQsIGFuZCBtZW1iZXIgZnVuY3Rpb25zIF9NX2luY3IgYW5kIF9NX2RlY3IsIHdoaWNoIHBlcmZvcm0KKyAgLy8gYXRvbWljIHByZWluY3JlbWVudC9wcmVkZWNyZW1lbnQuICBUaGUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMKKyAgLy8gX01fcmVmX2NvdW50LgorICBzdHJ1Y3QgX1JlZmNvdW50X0Jhc2UKKyAgeworICAgIC8vIFRoZSB0eXBlIF9SQ190CisgICAgdHlwZWRlZiBzaXplX3QgX1JDX3Q7CisgICAgCisgICAgLy8gVGhlIGRhdGEgbWVtYmVyIF9NX3JlZl9jb3VudAorICAgIHZvbGF0aWxlIF9SQ190IF9NX3JlZl9jb3VudDsKKworICAgIC8vIENvbnN0cnVjdG9yCisjaWZkZWYgX19HVEhSRUFEX01VVEVYX0lOSVQKKyAgICBfX2d0aHJlYWRfbXV0ZXhfdCBfTV9yZWZfY291bnRfbG9jayA9IF9fR1RIUkVBRF9NVVRFWF9JTklUOworI2Vsc2UKKyAgICBfX2d0aHJlYWRfbXV0ZXhfdCBfTV9yZWZfY291bnRfbG9jazsKKyNlbmRpZgorCisgICAgX1JlZmNvdW50X0Jhc2UoX1JDX3QgX19uKSA6IF9NX3JlZl9jb3VudChfX24pCisgICAgeworI2lmbmRlZiBfX0dUSFJFQURfTVVURVhfSU5JVAorI2lmZGVmIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OCisgICAgICBfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTiAoJl9NX3JlZl9jb3VudF9sb2NrKTsKKyNlbHNlCisjZXJyb3IgX19HVEhSRUFEX01VVEVYX0lOSVQgb3IgX19HVEhSRUFEX01VVEVYX0lOSVRfRlVOQ1RJT04gc2hvdWxkIGJlIGRlZmluZWQgYnkgZ3Roci5oIGFic3RyYWN0aW9uIGxheWVyLCByZXBvcnQgcHJvYmxlbSB0byBsaWJzdGRjKytAZ2NjLmdudS5vcmcuCisjZW5kaWYKKyNlbmRpZgorICAgIH0KKworI2lmbmRlZiBfX0dUSFJFQURfTVVURVhfSU5JVAorICAgIH5fUmVmY291bnRfQmFzZSgpCisgICAgeyBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSgmX01fcmVmX2NvdW50X2xvY2spOyB9CisjZW5kaWYKKworICAgIHZvaWQKKyAgICBfTV9pbmNyKCkKKyAgICB7CisgICAgICBfX2d0aHJlYWRfbXV0ZXhfbG9jaygmX01fcmVmX2NvdW50X2xvY2spOworICAgICAgKytfTV9yZWZfY291bnQ7CisgICAgICBfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfTV9yZWZfY291bnRfbG9jayk7CisgICAgfQorCisgICAgX1JDX3QKKyAgICBfTV9kZWNyKCkKKyAgICB7CisgICAgICBfX2d0aHJlYWRfbXV0ZXhfbG9jaygmX01fcmVmX2NvdW50X2xvY2spOworICAgICAgdm9sYXRpbGUgX1JDX3QgX190bXAgPSAtLV9NX3JlZl9jb3VudDsKKyAgICAgIF9fZ3RocmVhZF9tdXRleF91bmxvY2soJl9NX3JlZl9jb3VudF9sb2NrKTsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisgIH07CisKKyAgLy8KKyAgLy8gV2hhdCBmb2xsb3dzIHNob3VsZCByZWFsbHkgYmUgbG9jYWwgdG8gcm9wZS4gIFVuZm9ydHVuYXRlbHksCisgIC8vIHRoYXQgZG9lc24ndCB3b3JrLCBzaW5jZSBpdCBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIGRlZmluZSBnZW5lcmljCisgIC8vIGVxdWFsaXR5IG9uIHJvcGUgaXRlcmF0b3JzLiAgQWNjb3JkaW5nIHRvIHRoZSBkcmFmdCBzdGFuZGFyZCwgdGhlCisgIC8vIHRlbXBsYXRlIHBhcmFtZXRlcnMgZm9yIHN1Y2ggYW4gZXF1YWxpdHkgb3BlcmF0b3IgY2Fubm90IGJlIGluZmVycmVkCisgIC8vIGZyb20gdGhlIG9jY3VycmVuY2Ugb2YgYSBtZW1iZXIgY2xhc3MgYXMgYSBwYXJhbWV0ZXIuCisgIC8vIChTR0kgY29tcGlsZXJzIGluIGZhY3QgYWxsb3cgdGhpcywgYnV0IHRoZSBfX3Jlc3VsdCB3b3VsZG4ndCBiZQorICAvLyBwb3J0YWJsZS4pCisgIC8vIFNpbWlsYXJseSwgc29tZSBvZiB0aGUgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgYXJlIG1lbWJlciBmdW5jdGlvbnMKKyAgLy8gb25seSB0byBhdm9pZCBwb2xsdXRpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGFuZCB0byBjaXJjdW12ZW50CisgIC8vIHJlc3RyaWN0aW9ucyBvbiB0eXBlIGluZmVyZW5jZSBmb3IgdGVtcGxhdGUgZnVuY3Rpb25zLgorICAvLworCisgIC8vCisgIC8vIFRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBmb3IgcmVwcmVzZW50aW5nIGEgcm9wZS4gIFRoaXMgaXMKKyAgLy8gcHJpdmF0ZSB0byB0aGUgaW1wbGVtZW50YXRpb24uICBBIHJvcGUgaXMgcmVhbGx5IGp1c3QgYSBwb2ludGVyCisgIC8vIHRvIG9uZSBvZiB0aGVzZS4KKyAgLy8KKyAgLy8gQSBmZXcgYmFzaWMgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgdGhpcyBkYXRhIHN0cnVjdHVyZQorICAvLyBhcmUgbWVtYmVycyBvZiBfUm9wZVJlcC4gIE1vc3Qgb2YgdGhlIG1vcmUgY29tcGxleCBhbGdvcml0aG1zCisgIC8vIGFyZSBpbXBsZW1lbnRlZCBhcyByb3BlIG1lbWJlcnMuCisgIC8vCisgIC8vIFNvbWUgb2YgdGhlIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIG9mIF9Sb3BlUmVwIGhhdmUgaWRlbnRpY2FsbHkKKyAgLy8gbmFtZWQgZnVuY3Rpb25zIGluIHJvcGUgdGhhdCBzaW1wbHkgaW52b2tlIHRoZSBfUm9wZVJlcCB2ZXJzaW9ucy4KKworI2RlZmluZSBfX1JPUEVfREVGSU5FX0FMTE9DUyhfX2EpIFwKKyAgICAgICAgX19ST1BFX0RFRklORV9BTExPQyhfQ2hhclQsX0RhdGEpIC8qIGNoYXJhY3RlciBkYXRhICovIFwKKyAgICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsX19hPiBfX0M7IFwKKyAgICAgICAgX19ST1BFX0RFRklORV9BTExPQyhfX0MsX0MpIFwKKyAgICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsX19hPiBfX0w7IFwKKyAgICAgICAgX19ST1BFX0RFRklORV9BTExPQyhfX0wsX0wpIFwKKyAgICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULF9fYT4gX19GOyBcCisgICAgICAgIF9fUk9QRV9ERUZJTkVfQUxMT0MoX19GLF9GKSBcCisgICAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZVN1YnN0cmluZzxfQ2hhclQsX19hPiBfX1M7IFwKKyAgICAgICAgX19ST1BFX0RFRklORV9BTExPQyhfX1MsX1MpCisKKyAgLy8gIEludGVybmFsIHJvcGUgbm9kZXMgcG90ZW50aWFsbHkgc3RvcmUgYSBjb3B5IG9mIHRoZSBhbGxvY2F0b3IKKyAgLy8gIGluc3RhbmNlIHVzZWQgdG8gYWxsb2NhdGUgdGhlbS4gIFRoaXMgaXMgbW9zdGx5IHJlZHVuZGFudC4KKyAgLy8gIEJ1dCB0aGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gcGFzcyBhbGxvY2F0b3IgaW5zdGFuY2VzIGFyb3VuZAorICAvLyAgaW4gc29tZSBmb3JtIHRvIG5lYXJseSBhbGwgaW50ZXJuYWwgZnVuY3Rpb25zLCBzaW5jZSBhbnkgcG9pbnRlcgorICAvLyAgYXNzaWdubWVudCBtYXkgcmVzdWx0IGluIGEgemVybyByZWZlcmVuY2UgY291bnQgYW5kIHRodXMgcmVxdWlyZQorICAvLyAgZGVhbGxvY2F0aW9uLgorCisjZGVmaW5lIF9fU1RBVElDX0lGX1NHSV9BTExPQyAgLyogbm90IHN0YXRpYyAqLworCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX1JvcGVfcmVwX2Jhc2UKKyAgICA6IHB1YmxpYyBfQWxsb2MKKyAgICB7CisgICAgICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9BbGxvYyo+KHRoaXMpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlJgorICAgICAgX01fZ2V0X2FsbG9jYXRvcigpCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X0FsbG9jKj4odGhpcyk7IH0KKworICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmCisgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfQWxsb2MqPih0aGlzKTsgfQorCisgICAgICBfUm9wZV9yZXBfYmFzZShzaXplX3QgX19zaXplLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYpCisgICAgICA6IF9NX3NpemUoX19zaXplKSB7IH0KKworICAgICAgc2l6ZV90IF9NX3NpemU7CisKKyMgZGVmaW5lIF9fUk9QRV9ERUZJTkVfQUxMT0MoX1RwLCBfX25hbWUpIFwKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBcCisgICAgICAgICAgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1RwPjo6b3RoZXIgX19uYW1lIyNBbGxvYzsgXAorICAgICAgICBzdGF0aWMgX1RwKiBfX25hbWUjI19hbGxvY2F0ZShzaXplX3QgX19uKSBcCisgICAgICAgICAgeyByZXR1cm4gX19uYW1lIyNBbGxvYygpLmFsbG9jYXRlKF9fbik7IH0gXAorICAgICAgICBzdGF0aWMgdm9pZCBfX25hbWUjI19kZWFsbG9jYXRlKF9UcCAqX19wLCBzaXplX3QgX19uKSBcCisgICAgICAgICAgeyBfX25hbWUjI0FsbG9jKCkuZGVhbGxvY2F0ZShfX3AsIF9fbik7IH0KKyAgICAgIF9fUk9QRV9ERUZJTkVfQUxMT0NTKF9BbGxvYykKKyMgdW5kZWYgX19ST1BFX0RFRklORV9BTExPQworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9Sb3BlX1JvcGVSZXAKKyAgICA6IHB1YmxpYyBfUm9wZV9yZXBfYmFzZTxfQ2hhclQsIF9BbGxvYz4KKyMgaWZuZGVmIF9fR0MKKwkgICAgICwgX1JlZmNvdW50X0Jhc2UKKyMgZW5kaWYKKyAgICB7CisgICAgcHVibGljOgorICAgICAgX19kZXRhaWw6Ol9UYWcgX01fdGFnOjg7CisgICAgICBib29sIF9NX2lzX2JhbGFuY2VkOjg7CisgICAgICB1bnNpZ25lZCBjaGFyIF9NX2RlcHRoOworICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9NX2Nfc3RyaW5nOworI2lmZGVmIF9fR1RIUkVBRF9NVVRFWF9JTklUCisgICAgICBfX2d0aHJlYWRfbXV0ZXhfdCBfTV9jX3N0cmluZ19sb2NrID0gX19HVEhSRUFEX01VVEVYX0lOSVQ7CisjZWxzZQorICAgICAgX19ndGhyZWFkX211dGV4X3QgX01fY19zdHJpbmdfbG9jazsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxhdHRlbmVkIHZlcnNpb24gb2Ygc3RyaW5nLCBpZiBuZWVkZWQuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwaWNhbGx5IDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgaXQncyBub3QgMCwgdGhlbiB0aGUgbWVtb3J5IGlzIG93bmVkICAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogYnkgdGhpcyBub2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogSW4gdGhlIGNhc2Ugb2YgYSBsZWFmLCB0aGlzIG1heSBwb2ludCB0byAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHNhbWUgbWVtb3J5IGFzIHRoZSBkYXRhIGZpZWxkLiAgICAgICAqLworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZV9yZXBfYmFzZTxfQ2hhclQsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlCisgICAgICAgIGFsbG9jYXRvcl90eXBlOworCisgICAgICB1c2luZyBfUm9wZV9yZXBfYmFzZTxfQ2hhclQsIF9BbGxvYz46OmdldF9hbGxvY2F0b3I7CisgICAgICB1c2luZyBfUm9wZV9yZXBfYmFzZTxfQ2hhclQsIF9BbGxvYz46Ol9NX2dldF9hbGxvY2F0b3I7CisKKyAgICAgIF9Sb3BlX1JvcGVSZXAoX19kZXRhaWw6Ol9UYWcgX190LCBpbnQgX19kLCBib29sIF9fYiwgc2l6ZV90IF9fc2l6ZSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IF9Sb3BlX3JlcF9iYXNlPF9DaGFyVCwgX0FsbG9jPihfX3NpemUsIF9fYSksCisjaWZuZGVmIF9fR0MKKwlfUmVmY291bnRfQmFzZSgxKSwKKyNlbmRpZgorCV9NX3RhZyhfX3QpLCBfTV9pc19iYWxhbmNlZChfX2IpLCBfTV9kZXB0aChfX2QpLCBfTV9jX3N0cmluZygwKQorI2lmZGVmIF9fR1RIUkVBRF9NVVRFWF9JTklUCisgICAgICB7IH0KKyNlbHNlCisgICAgICB7IF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OICgmX01fY19zdHJpbmdfbG9jayk7IH0KKyAgICAgIH5fUm9wZV9Sb3BlUmVwKCkKKyAgICAgIHsgX19ndGhyZWFkX211dGV4X2Rlc3Ryb3kgKCZfTV9jX3N0cmluZ19sb2NrKTsgfQorI2VuZGlmCisjaWZkZWYgX19HQworICAgICAgdm9pZAorICAgICAgX01faW5jciAoKSB7IH0KKyNlbmRpZgorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2ZyZWVfc3RyaW5nKF9fR0NfQ09OU1QgX0NoYXJUKiwgc2l6ZV90IF9fbGVuLAorCQkgICAgIGFsbG9jYXRvcl90eXBlJiBfX2EpOworI2RlZmluZSBfX1NUTF9GUkVFX1NUUklORyhfX3MsIF9fbCwgX19hKSBfU19mcmVlX3N0cmluZyhfX3MsIF9fbCwgX19hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlYWxsb2NhdGUgZGF0YSBzZWN0aW9uIG9mIGEgbGVhZi4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkbid0IGJlIGEgbWVtYmVyIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnV0IGl0cyBoYXJkIHRvIGRvIGFueXRoaW5nIGVsc2UgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb21lbnQsIGJlY2F1c2UgaXQncyB0ZW1wbGF0aXplZCB3LnIudC4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGFsbG9jYXRvci4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXMgbm90aGluZyBpZiBfX0dDIGlzIGRlZmluZWQuCisjaWZuZGVmIF9fR0MKKyAgICAgIHZvaWQgX01fZnJlZV9jX3N0cmluZygpOworICAgICAgdm9pZCBfTV9mcmVlX3RyZWUoKTsKKyAgICAgIC8vIERlYWxsb2NhdGUgdC4gQXNzdW1lcyB0IGlzIG5vdCAwLgorICAgICAgdm9pZAorICAgICAgX01fdW5yZWZfbm9ubmlsKCkKKyAgICAgIHsKKwlpZiAoMCA9PSBfTV9kZWNyKCkpCisJICBfTV9mcmVlX3RyZWUoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fcmVmX25vbm5pbCgpCisgICAgICB7IF9NX2luY3IoKTsgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfdW5yZWYoX1JvcGVfUm9wZVJlcCogX190KQorICAgICAgeworCWlmICgwICE9IF9fdCkKKwkgIF9fdC0+X01fdW5yZWZfbm9ubmlsKCk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19yZWYoX1JvcGVfUm9wZVJlcCogX190KQorICAgICAgeworCWlmICgwICE9IF9fdCkKKwkgIF9fdC0+X01faW5jcigpOworICAgICAgfQorICAgICAgCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfZnJlZV9pZl91bnJlZihfUm9wZV9Sb3BlUmVwKiBfX3QpCisgICAgICB7CisJaWYgKDAgIT0gX190ICYmIDAgPT0gX190LT5fTV9yZWZfY291bnQpCisJICBfX3QtPl9NX2ZyZWVfdHJlZSgpOworICAgICAgfQorIyAgIGVsc2UgLyogX19HQyAqLworICAgICAgdm9pZCBfTV91bnJlZl9ub25uaWwoKSB7IH0KKyAgICAgIHZvaWQgX01fcmVmX25vbm5pbCgpIHsgfQorICAgICAgc3RhdGljIHZvaWQgX1NfdW5yZWYoX1JvcGVfUm9wZVJlcCopIHsgfQorICAgICAgc3RhdGljIHZvaWQgX1NfcmVmKF9Sb3BlX1JvcGVSZXAqKSB7IH0KKyAgICAgIHN0YXRpYyB2b2lkIF9TX2ZyZWVfaWZfdW5yZWYoX1JvcGVfUm9wZVJlcCopIHsgfQorIyAgIGVuZGlmCitwcm90ZWN0ZWQ6CisgICAgICBfUm9wZV9Sb3BlUmVwJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9Sb3BlX1JvcGVSZXAmKTsKKworICAgICAgX1JvcGVfUm9wZVJlcChjb25zdCBfUm9wZV9Sb3BlUmVwJik7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX1JvcGVfUm9wZUxlYWYKKyAgICA6IHB1YmxpYyBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBBcHBhcmVudGx5IG5lZWRlZCBieSBWQysrCisgICAgICAvLyBUaGUgZGF0YSBmaWVsZHMgb2YgbGVhdmVzIGFyZSBhbGxvY2F0ZWQgd2l0aCBzb21lCisgICAgICAvLyBleHRyYSBzcGFjZSwgdG8gYWNjb21tb2RhdGUgZnV0dXJlIGdyb3d0aCBhbmQgZm9yIGJhc2ljCisgICAgICAvLyBjaGFyYWN0ZXIgdHlwZXMsIHRvIGhvbGQgYSB0cmFpbGluZyBlb3MgY2hhcmFjdGVyLgorICAgICAgZW51bSB7IF9TX2FsbG9jX2dyYW51bGFyaXR5ID0gOCB9OworICAgICAgCisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBfU19yb3VuZGVkX3VwX3NpemUoc2l6ZV90IF9fbikKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90IF9fc2l6ZV93aXRoX2VvczsKKwkKKyAgICAgICAgaWYgKF9TX2lzX2Jhc2ljX2NoYXJfdHlwZSgoX0NoYXJUKikwKSkKKwkgIF9fc2l6ZV93aXRoX2VvcyA9IF9fbiArIDE7CisJZWxzZQorCSAgX19zaXplX3dpdGhfZW9zID0gX19uOworI2lmZGVmIF9fR0MKKwlyZXR1cm4gX19zaXplX3dpdGhfZW9zOworI2Vsc2UKKwkvLyBBbGxvdyBzbG9wIGZvciBpbi1wbGFjZSBleHBhbnNpb24uCisJcmV0dXJuICgoX19zaXplX3dpdGhfZW9zICsgc2l6ZV90KF9TX2FsbG9jX2dyYW51bGFyaXR5KSAtIDEpCisJCSZ+IChzaXplX3QoX1NfYWxsb2NfZ3JhbnVsYXJpdHkpIC0gMSkpOworI2VuZGlmCisgICAgICB9CisgICAgICBfX0dDX0NPTlNUIF9DaGFyVCogX01fZGF0YTsgLyogTm90IG5lY2Vzc2FyaWx5IDAgdGVybWluYXRlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgYWxsb2NhdGVkIHNpemUgaXMgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIF9TX3JvdW5kZWRfdXBfc2l6ZShzaXplKSwgZXhjZXB0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gdGhlIEdDIGNhc2UsIGluIHdoaWNoIGl0ICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2Vzbid0IG1hdHRlci4gICAgICAgICAgICAgICAqLworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZV9yZXBfYmFzZTxfQ2hhclQsX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUKKyAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIF9Sb3BlX1JvcGVMZWFmKF9fR0NfQ09OU1QgX0NoYXJUKiBfX2QsIHNpemVfdCBfX3NpemUsCisJCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4oX19kZXRhaWw6Ol9TX2xlYWYsIDAsIHRydWUsCisJCQkJICAgICAgX19zaXplLCBfX2EpLCBfTV9kYXRhKF9fZCkKKyAgICAgIHsKKyAgICAgICAgaWYgKF9TX2lzX2Jhc2ljX2NoYXJfdHlwZSgoX0NoYXJUICopMCkpCisJICB7CisgICAgICAgICAgICAvLyBhbHJlYWR5IGVvcyB0ZXJtaW5hdGVkLgorICAgICAgICAgICAgdGhpcy0+X01fY19zdHJpbmcgPSBfX2Q7CisJICB9CisgICAgICB9CisgICAgICAvLyBUaGUgY29uc3RydWN0b3IgYXNzdW1lcyB0aGF0IGQgaGFzIGJlZW4gYWxsb2NhdGVkIHdpdGgKKyAgICAgIC8vIHRoZSBwcm9wZXIgYWxsb2NhdG9yIGFuZCB0aGUgcHJvcGVybHkgcGFkZGVkIHNpemUuCisgICAgICAvLyBJbiBjb250cmFzdCwgdGhlIGRlc3RydWN0b3IgZGVhbGxvY2F0ZXMgdGhlIGRhdGE6CisjaWZuZGVmIF9fR0MKKyAgICAgIH5fUm9wZV9Sb3BlTGVhZigpIHRocm93KCkKKyAgICAgIHsKKyAgICAgICAgaWYgKF9NX2RhdGEgIT0gdGhpcy0+X01fY19zdHJpbmcpCisJICB0aGlzLT5fTV9mcmVlX2Nfc3RyaW5nKCk7CisJCisJdGhpcy0+X19TVExfRlJFRV9TVFJJTkcoX01fZGF0YSwgdGhpcy0+X01fc2l6ZSwgdGhpcy0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKyNlbmRpZgorcHJvdGVjdGVkOgorICAgICAgX1JvcGVfUm9wZUxlYWYmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1JvcGVfUm9wZUxlYWYmKTsKKworICAgICAgX1JvcGVfUm9wZUxlYWYoY29uc3QgX1JvcGVfUm9wZUxlYWYmKTsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbgorICAgIDogcHVibGljIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KiBfTV9sZWZ0OworICAgICAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4qIF9NX3JpZ2h0OworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlX3JlcF9iYXNlPF9DaGFyVCwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUKKyAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uKF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KiBfX2wsCisJCQkgICAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiogX19yLAorCQkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKwk6IF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KF9fZGV0YWlsOjpfU19jb25jYXQsCisJCQkJICAgICAgc3RkOjptYXgoX19sLT5fTV9kZXB0aCwKKwkJCQkJICAgICAgIF9fci0+X01fZGVwdGgpICsgMSwKKwkJCQkgICAgICBmYWxzZSwKKwkJCQkgICAgICBfX2wtPl9NX3NpemUgKyBfX3ItPl9NX3NpemUsIF9fYSksCisgICAgICAgIF9NX2xlZnQoX19sKSwgX01fcmlnaHQoX19yKQorICAgICAgeyB9CisjaWZuZGVmIF9fR0MKKyAgICAgIH5fUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbigpIHRocm93KCkKKyAgICAgIHsKKwl0aGlzLT5fTV9mcmVlX2Nfc3RyaW5nKCk7CisJX01fbGVmdC0+X01fdW5yZWZfbm9ubmlsKCk7CisJX01fcmlnaHQtPl9NX3VucmVmX25vbm5pbCgpOworICAgICAgfQorI2VuZGlmCitwcm90ZWN0ZWQ6CisgICAgICBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbiYpOworICAgICAgCisgICAgICBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbihjb25zdCBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbiYpOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9Sb3BlX1JvcGVGdW5jdGlvbgorICAgIDogcHVibGljIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGNoYXJfcHJvZHVjZXI8X0NoYXJUPiogX01fZm47CisjaWZuZGVmIF9fR0MKKyAgICAgIGJvb2wgX01fZGVsZXRlX3doZW5fZG9uZTsgLy8gQ2hhcl9wcm9kdWNlciBpcyBvd25lZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm9wZSBhbmQgc2hvdWxkIGJlIGV4cGxpY2l0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlZCB3aGVuIHRoZSByb3BlIGJlY29tZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5hY2Nlc3NpYmxlLgorI2Vsc2UKKyAgICAgIC8vIEluIHRoZSBHQyBjYXNlLCB3ZSBlaXRoZXIgcmVnaXN0ZXIgdGhlIHJvcGUgZm9yCisgICAgICAvLyBmaW5hbGl6YXRpb24sIG9yIG5vdC4gIFRodXMgdGhlIGZpZWxkIGlzIHVubmVjZXNzYXJ5OworICAgICAgLy8gdGhlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgY29sbGVjdG9yIGRhdGEgc3RydWN0dXJlcy4KKyAgICAgIC8vIFdlIGRvIG5lZWQgYSBmaW5hbGl6YXRpb24gcHJvY2VkdXJlIHRvIGJlIGludm9rZWQgYnkgdGhlCisgICAgICAvLyBjb2xsZWN0b3IuCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfZm5fZmluYWxpemF0aW9uX3Byb2Modm9pZCAqIF9fdHJlZSwgdm9pZCAqKQorICAgICAgeyBkZWxldGUgKChfUm9wZV9Sb3BlRnVuY3Rpb24gKilfX3RyZWUpIC0+IF9NX2ZuOyB9CisjZW5kaWYKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlX3JlcF9iYXNlPF9DaGFyVCwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUKKyAgICAgIGFsbG9jYXRvcl90eXBlOworCisgICAgICBfUm9wZV9Sb3BlRnVuY3Rpb24oY2hhcl9wcm9kdWNlcjxfQ2hhclQ+KiBfX2YsIHNpemVfdCBfX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fZCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4oX19kZXRhaWw6Ol9TX2Z1bmN0aW9uLCAwLCB0cnVlLCBfX3NpemUsIF9fYSkKKwksIF9NX2ZuKF9fZikKKyNpZm5kZWYgX19HQworCSwgX01fZGVsZXRlX3doZW5fZG9uZShfX2QpCisjZW5kaWYKKyAgICAgIHsKKyNpZmRlZiBfX0dDCisJaWYgKF9fZCkKKwkgIHsKKwkgICAgR0NfUkVHSVNURVJfRklOQUxJWkVSKHRoaXMsIF9Sb3BlX1JvcGVGdW5jdGlvbjo6CisJCQkJICBfU19mbl9maW5hbGl6YXRpb25fcHJvYywgMCwgMCwgMCk7CisJICB9CisjZW5kaWYKKyAgICAgIH0KKyNpZm5kZWYgX19HQworICAgICAgfl9Sb3BlX1JvcGVGdW5jdGlvbigpIHRocm93KCkKKyAgICAgIHsKKwl0aGlzLT5fTV9mcmVlX2Nfc3RyaW5nKCk7CisJaWYgKF9NX2RlbGV0ZV93aGVuX2RvbmUpCisJICBkZWxldGUgX01fZm47CisgICAgICB9CisjIGVuZGlmCisgICAgcHJvdGVjdGVkOgorICAgICAgX1JvcGVfUm9wZUZ1bmN0aW9uJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9Sb3BlX1JvcGVGdW5jdGlvbiYpOworCisgICAgICBfUm9wZV9Sb3BlRnVuY3Rpb24oY29uc3QgX1JvcGVfUm9wZUZ1bmN0aW9uJik7CisgICAgfTsKKyAgLy8gU3Vic3RyaW5nIHJlc3VsdHMgYXJlIHVzdWFsbHkgcmVwcmVzZW50ZWQgdXNpbmcganVzdAorICAvLyBjb25jYXRlbmF0aW9uIG5vZGVzLiAgQnV0IGluIHRoZSBjYXNlIG9mIHZlcnkgbG9uZyBmbGF0IHJvcGVzCisgIC8vIG9yIHJvcGVzIHdpdGggYSBmdW5jdGlvbmFsIHJlcHJlc2VudGF0aW9uIHRoYXQgaXNuJ3QgcHJhY3RpY2FsLgorICAvLyBJbiB0aGF0IGNhc2UsIHdlIHJlcHJlc2VudCB0aGUgX19yZXN1bHQgYXMgYSBzcGVjaWFsIGNhc2Ugb2YKKyAgLy8gUm9wZUZ1bmN0aW9uLCB3aG9zZSBjaGFyX3Byb2R1Y2VyIHBvaW50cyBiYWNrIHRvIHRoZSByb3BlIGl0c2VsZi4KKyAgLy8gSW4gYWxsIGNhc2VzIGV4Y2VwdCByZXBlYXRlZCBzdWJzdHJpbmcgb3BlcmF0aW9ucyBhbmQKKyAgLy8gZGVhbGxvY2F0aW9uLCB3ZSB0cmVhdCB0aGUgX19yZXN1bHQgYXMgYSBSb3BlRnVuY3Rpb24uCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9Sb3BlU3Vic3RyaW5nCisgICAgOiBwdWJsaWMgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCwgX0FsbG9jPiwKKyAgICAgIHB1YmxpYyBjaGFyX3Byb2R1Y2VyPF9DaGFyVD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gWFhYIHRoaXMgd2hvbGUgY2xhc3Mgc2hvdWxkIGJlIHJld3JpdHRlbi4KKyAgICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4qIF9NX2Jhc2U7ICAgICAgLy8gbm90IDAKKyAgICAgIHNpemVfdCBfTV9zdGFydDsKKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBvcGVyYXRvcigpKHNpemVfdCBfX3N0YXJ0X3Bvcywgc2l6ZV90IF9fcmVxX2xlbiwKKwkJIF9DaGFyVCogX19idWZmZXIpCisgICAgICB7CisgICAgICAgIHN3aXRjaChfTV9iYXNlLT5fTV90YWcpCisJICB7CisJICBjYXNlIF9fZGV0YWlsOjpfU19mdW5jdGlvbjoKKwkgIGNhc2UgX19kZXRhaWw6Ol9TX3N1YnN0cmluZ2ZuOgorCSAgICB7CisJICAgICAgY2hhcl9wcm9kdWNlcjxfQ2hhclQ+KiBfX2ZuID0KKwkJKChfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULF9BbGxvYz4qKV9NX2Jhc2UpLT5fTV9mbjsKKwkgICAgICAoKl9fZm4pKF9fc3RhcnRfcG9zICsgX01fc3RhcnQsIF9fcmVxX2xlbiwgX19idWZmZXIpOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSBfX2RldGFpbDo6X1NfbGVhZjoKKwkgICAgeworCSAgICAgIF9fR0NfQ09OU1QgX0NoYXJUKiBfX3MgPQorCQkoKF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCxfQWxsb2M+KilfTV9iYXNlKS0+X01fZGF0YTsKKwkgICAgICB1bmluaXRpYWxpemVkX2NvcHlfbihfX3MgKyBfX3N0YXJ0X3BvcyArIF9NX3N0YXJ0LCBfX3JlcV9sZW4sCisJCQkJICAgX19idWZmZXIpOworCSAgICB9CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJICB9CisgICAgICB9CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JvcGVfcmVwX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZQorICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgX1JvcGVfUm9wZVN1YnN0cmluZyhfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiogX19iLCBzaXplX3QgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19sLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULCBfQWxsb2M+KHRoaXMsIF9fbCwgZmFsc2UsIF9fYSksCisgICAgICAgIGNoYXJfcHJvZHVjZXI8X0NoYXJUPigpLCBfTV9iYXNlKF9fYiksIF9NX3N0YXJ0KF9fcykKKyAgICAgIHsKKyNpZm5kZWYgX19HQworCV9NX2Jhc2UtPl9NX3JlZl9ub25uaWwoKTsKKyNlbmRpZgorICAgICAgICB0aGlzLT5fTV90YWcgPSBfX2RldGFpbDo6X1Nfc3Vic3RyaW5nZm47CisgICAgICB9CisgICAgdmlydHVhbCB+X1JvcGVfUm9wZVN1YnN0cmluZygpIHRocm93KCkKKyAgICAgIHsKKyNpZm5kZWYgX19HQworCV9NX2Jhc2UtPl9NX3VucmVmX25vbm5pbCgpOworCS8vIF9NX2ZyZWVfY19zdHJpbmcoKTsgIC0tIGRvbmUgYnkgcGFyZW50IGNsYXNzCisjZW5kaWYKKyAgICAgIH0KKyAgICB9OworCisgIC8vIFNlbGYtZGVzdHJ1Y3RpbmcgcG9pbnRlcnMgdG8gUm9wZV9yZXAuCisgIC8vIFRoZXNlIGFyZSBub3QgY29udmVudGlvbmFsIHNtYXJ0IHBvaW50ZXJzLiAgVGhlaXIKKyAgLy8gb25seSBwdXJwb3NlIGluIGxpZmUgaXMgdG8gZW5zdXJlIHRoYXQgdW5yZWYgaXMgY2FsbGVkCisgIC8vIG9uIHRoZSBwb2ludGVyIGVpdGhlciBhdCBub3JtYWwgZXhpdCBvciBpZiBhbiBleGNlcHRpb24KKyAgLy8gaXMgcmFpc2VkLiAgSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvCisgIC8vIGFkanVzdCByZWZlcmVuY2UgY291bnRzIHdoZW4gdGhlc2UgcG9pbnRlcnMgYXJlIGluaXRpYWxpemVkCisgIC8vIG9yIGFzc2lnbmVkIHRvLiAgKFRoaXMgY29udmVudGlvbiBzaWduaWZpY2FudGx5IHJlZHVjZXMKKyAgLy8gdGhlIG51bWJlciBvZiBwb3RlbnRpYWxseSBleHBlbnNpdmUgcmVmZXJlbmNlIGNvdW50CisgIC8vIHVwZGF0ZXMuKQorI2lmbmRlZiBfX0dDCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cgorICAgIHsKKyAgICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KiBfTV9wdHI7CisKKyAgICAgIH5fUm9wZV9zZWxmX2Rlc3RydWN0X3B0cigpCisgICAgICB7IF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+OjpfU191bnJlZihfTV9wdHIpOyB9CisjaWZkZWYgX19FWENFUFRJT05TCisgICAgICBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cigpIDogX01fcHRyKDApIHsgfTsKKyNlbHNlCisgICAgICBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cigpIHsgfTsKKyNlbmRpZgorICAgICAgX1JvcGVfc2VsZl9kZXN0cnVjdF9wdHIoX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4qIF9fcCkKKyAgICAgIDogX01fcHRyKF9fcCkgeyB9CisgICAgCisgICAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqX01fcHRyOyB9CisgICAgCisgICAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPioKKyAgICAgIG9wZXJhdG9yLT4oKQorICAgICAgeyByZXR1cm4gX01fcHRyOyB9CisgICAgCisgICAgICBvcGVyYXRvciBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiooKQorICAgICAgeyByZXR1cm4gX01fcHRyOyB9CisgICAgCisgICAgICBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0ciYKKyAgICAgIG9wZXJhdG9yPShfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiogX194KQorICAgICAgeyBfTV9wdHIgPSBfX3g7IHJldHVybiAqdGhpczsgfQorICAgIH07CisjZW5kaWYKKworICAvLyBEZXJlZmVyZW5jaW5nIGEgbm9uY29uc3QgaXRlcmF0b3IgaGFzIHRvIHJldHVybiBzb21ldGhpbmcKKyAgLy8gdGhhdCBiZWhhdmVzIGFsbW9zdCBsaWtlIGEgcmVmZXJlbmNlLiAgSXQncyBub3QgcG9zc2libGUgdG8KKyAgLy8gcmV0dXJuIGFuIGFjdHVhbCByZWZlcmVuY2Ugc2luY2UgYXNzaWdubWVudCByZXF1aXJlcyBleHRyYQorICAvLyB3b3JrLiAgQW5kIHdlIHdvdWxkIGdldCBpbnRvIHRoZSBzYW1lIHByb2JsZW1zIGFzIHdpdGggdGhlCisgIC8vIENEMiB2ZXJzaW9uIG9mIGJhc2ljX3N0cmluZy4KKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgX1JvcGVfY2hhcl9yZWZfcHJveHkKKyAgICB7CisgICAgICBmcmllbmQgY2xhc3Mgcm9wZTxfQ2hhclQsIF9BbGxvYz47CisgICAgICBmcmllbmQgY2xhc3MgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+OworICAgICAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPjsKKyNpZmRlZiBfX0dDCisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KiBfU2VsZl9kZXN0cnVjdF9wdHI7CisjZWxzZQorICAgICAgdHlwZWRlZiBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cjxfQ2hhclQsIF9BbGxvYz4gX1NlbGZfZGVzdHJ1Y3RfcHRyOworI2VuZGlmCisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+IF9Sb3BlUmVwOworICAgICAgdHlwZWRlZiByb3BlPF9DaGFyVCwgX0FsbG9jPiBfTXlfcm9wZTsKKyAgICAgIHNpemVfdCBfTV9wb3M7CisgICAgICBfQ2hhclQgX01fY3VycmVudDsKKyAgICAgIGJvb2wgX01fY3VycmVudF92YWxpZDsKKyAgICAgIF9NeV9yb3BlKiBfTV9yb290OyAgICAgLy8gVGhlIHdob2xlIHJvcGUuCisgICAgcHVibGljOgorICAgICAgX1JvcGVfY2hhcl9yZWZfcHJveHkoX015X3JvcGUqIF9fciwgc2l6ZV90IF9fcCkKKyAgICAgIDogIF9NX3BvcyhfX3ApLCBfTV9jdXJyZW50KCksIF9NX2N1cnJlbnRfdmFsaWQoZmFsc2UpLCBfTV9yb290KF9fcikgeyB9CisKKyAgICAgIF9Sb3BlX2NoYXJfcmVmX3Byb3h5KGNvbnN0IF9Sb3BlX2NoYXJfcmVmX3Byb3h5JiBfX3gpCisgICAgICA6IF9NX3BvcyhfX3guX01fcG9zKSwgX01fY3VycmVudChfX3guX01fY3VycmVudCksIAorCV9NX2N1cnJlbnRfdmFsaWQoZmFsc2UpLCBfTV9yb290KF9feC5fTV9yb290KSB7IH0KKworICAgICAgLy8gRG9uJ3QgcHJlc2VydmUgY2FjaGUgaWYgdGhlIHJlZmVyZW5jZSBjYW4gb3V0bGl2ZSB0aGUKKyAgICAgIC8vIGV4cHJlc3Npb24uICBXZSBjbGFpbSB0aGF0J3Mgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FsbGluZworICAgICAgLy8gYSBjb3B5IGNvbnN0cnVjdG9yIG9yIGdlbmVyYXRpbmcgcmVmZXJlbmNlIHRvIGEgcHJveHkKKyAgICAgIC8vIHJlZmVyZW5jZS4gIFdlIGRlY2xhcmUgdGhlIGxhdHRlciB0byBoYXZlIHVuZGVmaW5lZCBzZW1hbnRpY3MuCisgICAgICBfUm9wZV9jaGFyX3JlZl9wcm94eShfTXlfcm9wZSogX19yLCBzaXplX3QgX19wLCBfQ2hhclQgX19jKQorICAgICAgOiBfTV9wb3MoX19wKSwgX01fY3VycmVudChfX2MpLCBfTV9jdXJyZW50X3ZhbGlkKHRydWUpLCBfTV9yb290KF9fcikgeyB9CisKKyAgICAgIGlubGluZSBvcGVyYXRvciBfQ2hhclQgKCkgY29uc3Q7CisKKyAgICAgIF9Sb3BlX2NoYXJfcmVmX3Byb3h5JgorICAgICAgb3BlcmF0b3I9KF9DaGFyVCBfX2MpOworICAgIAorICAgICAgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULCBfQWxsb2M+IG9wZXJhdG9yJigpIGNvbnN0OworICAgICAgCisgICAgICBfUm9wZV9jaGFyX3JlZl9wcm94eSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfUm9wZV9jaGFyX3JlZl9wcm94eSYgX19jKQorICAgICAgeyByZXR1cm4gb3BlcmF0b3I9KChfQ2hhclQpX19jKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfUm9wZV9jaGFyX3JlZl9wcm94eSA8X0NoYXJULCBfX0FsbG9jID4gX19hLAorCSBfUm9wZV9jaGFyX3JlZl9wcm94eSA8X0NoYXJULCBfX0FsbG9jID4gX19iKQorICAgIHsKKyAgICAgIF9DaGFyVCBfX3RtcCA9IF9fYTsKKyAgICAgIF9fYSA9IF9fYjsKKyAgICAgIF9fYiA9IF9fdG1wOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBfUm9wZV9jaGFyX3B0cl9wcm94eQorICAgIHsKKyAgICAgIC8vIFhYWCB0aGlzIGNsYXNzIHNob3VsZCBiZSByZXdyaXR0ZW4uCisgICAgICBmcmllbmQgY2xhc3MgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+OworICAgICAgc2l6ZV90IF9NX3BvczsKKyAgICAgIHJvcGU8X0NoYXJULF9BbGxvYz4qIF9NX3Jvb3Q7ICAgICAvLyBUaGUgd2hvbGUgcm9wZS4KKyAgICBwdWJsaWM6CisgICAgICBfUm9wZV9jaGFyX3B0cl9wcm94eShjb25zdCBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsX0FsbG9jPiYgX194KQorICAgICAgOiBfTV9wb3MoX194Ll9NX3BvcyksIF9NX3Jvb3QoX194Ll9NX3Jvb3QpIHsgfQorCisgICAgICBfUm9wZV9jaGFyX3B0cl9wcm94eShjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eSYgX194KQorICAgICAgOiBfTV9wb3MoX194Ll9NX3BvcyksIF9NX3Jvb3QoX194Ll9NX3Jvb3QpIHsgfQorCisgICAgICBfUm9wZV9jaGFyX3B0cl9wcm94eSgpIHsgfQorICAgICAgCisgICAgICBfUm9wZV9jaGFyX3B0cl9wcm94eShfQ2hhclQqIF9feCkKKyAgICAgIDogX01fcm9vdCgwKSwgX01fcG9zKDApIHsgfQorCisgICAgICBfUm9wZV9jaGFyX3B0cl9wcm94eSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eSYgX194KQorICAgICAgeworICAgICAgICBfTV9wb3MgPSBfX3guX01fcG9zOworICAgICAgICBfTV9yb290ID0gX194Ll9NX3Jvb3Q7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQyLCBfQWxsb2MyPiYgX194LAorCQkgICBjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQyLCBfQWxsb2MyPiYgX195KTsKKworICAgICAgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+IG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4oX01fcm9vdCwgX01fcG9zKTsgfQorICAgIH07CisKKyAgLy8gUm9wZSBpdGVyYXRvcnM6CisgIC8vIFVubGlrZSBpbiB0aGUgQyB2ZXJzaW9uLCB3ZSBjYWNoZSBvbmx5IHBhcnQgb2YgdGhlIHN0YWNrCisgIC8vIGZvciByb3BlIGl0ZXJhdG9ycywgc2luY2UgdGhleSBtdXN0IGJlIGVmZmljaWVudGx5IGNvcHlhYmxlLgorICAvLyBXaGVuIHdlIHJ1biBvdXQgb2YgY2FjaGUsIHdlIGhhdmUgdG8gcmVjb25zdHJ1Y3QgdGhlIGl0ZXJhdG9yCisgIC8vIHZhbHVlLgorICAvLyBQb2ludGVycyBmcm9tIGl0ZXJhdG9ycyBhcmUgbm90IGluY2x1ZGVkIGluIHJlZmVyZW5jZSBjb3VudHMuCisgIC8vIEl0ZXJhdG9ycyBhcmUgYXNzdW1lZCB0byBiZSB0aHJlYWQgcHJpdmF0ZS4gIFJvcGVzIGNhbgorICAvLyBiZSBzaGFyZWQuCisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBfUm9wZV9pdGVyYXRvcl9iYXNlCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBfQ2hhclQ+CisgICAgeworICAgICAgZnJpZW5kIGNsYXNzIHJvcGU8X0NoYXJULCBfQWxsb2M+OworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0FsbG9jIF9hbGxvY2F0b3JfdHlwZTsgLy8gdXNlZCBpbiBfUm9wZV9yb3RhdGUsIFZDKysgd29ya2Fyb3VuZAorICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiBfUm9wZVJlcDsKKyAgICAgIC8vIEJvcmxhbmQgZG9lc24ndCB3YW50IHRoaXMgdG8gYmUgcHJvdGVjdGVkLgorICAgIHByb3RlY3RlZDoKKyAgICAgIGVudW0geyBfU19wYXRoX2NhY2hlX2xlbiA9IDQgfTsgLy8gTXVzdCBiZSA8PSA5LgorICAgICAgZW51bSB7IF9TX2l0ZXJhdG9yX2J1Zl9sZW4gPSAxNSB9OworICAgICAgc2l6ZV90IF9NX2N1cnJlbnRfcG9zOworICAgICAgX1JvcGVSZXAqIF9NX3Jvb3Q7ICAgICAvLyBUaGUgd2hvbGUgcm9wZS4KKyAgICAgIHNpemVfdCBfTV9sZWFmX3BvczsgICAgLy8gU3RhcnRpbmcgcG9zaXRpb24gZm9yIGN1cnJlbnQgbGVhZgorICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9NX2J1Zl9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnVmZmVyIHBvc3NpYmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5pbmcgY3VycmVudCBjaGFyLgorICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9NX2J1Zl9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gY3VycmVudCBjaGFyIGluIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIT0gMCA9PT4gYnVmZmVyIHZhbGlkLgorICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9NX2J1Zl9lbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uZSBwYXN0IF9fbGFzdCB2YWxpZCBjaGFyIGluIGJ1ZmZlci4KKyAgICAgIC8vIFdoYXQgZm9sbG93cyBpcyB0aGUgcGF0aCBjYWNoZS4gIFdlIGdvIG91dCBvZiBvdXIKKyAgICAgIC8vIHdheSB0byBtYWtlIHRoaXMgY29tcGFjdC4KKyAgICAgIC8vIFBhdGhfZW5kIGNvbnRhaW5zIHRoZSBib3R0b20gc2VjdGlvbiBvZiB0aGUgcGF0aCBmcm9tCisgICAgICAvLyB0aGUgcm9vdCB0byB0aGUgY3VycmVudCBsZWFmLgorICAgICAgY29uc3QgX1JvcGVSZXAqIF9NX3BhdGhfZW5kW19TX3BhdGhfY2FjaGVfbGVuXTsKKyAgICAgIGludCBfTV9sZWFmX2luZGV4OyAgICAgLy8gTGFzdCB2YWxpZCBfX3BvcyBpbiBwYXRoX2VuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX01fcGF0aF9lbmRbMF0gLi4uIF9NX3BhdGhfZW5kW2xlYWZfaW5kZXgtMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gY29uY2F0ZW5hdGlvbiBub2Rlcy4KKyAgICAgIHVuc2lnbmVkIGNoYXIgX01fcGF0aF9kaXJlY3Rpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAocGF0aF9kaXJlY3Rpb25zID4+IF9faSkgJiAxIGlzIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWZmIHdlIGdvdCBmcm9tIF9NX3BhdGhfZW5kW2xlYWZfaW5kZXggLSBfX2kgLSAxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBfTV9wYXRoX2VuZFtsZWFmX2luZGV4IC0gX19pXSBieSBnb2luZyB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX19yaWdodC4gQXNzdW1lcyBwYXRoX2NhY2hlX2xlbiA8PSA5LgorICAgICAgX0NoYXJUIF9NX3RtcF9idWZbX1NfaXRlcmF0b3JfYnVmX2xlbl07CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG9ydCBidWZmZXIgZm9yIHN1cnJvdW5kaW5nIGNoYXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB1c2VmdWwgcHJpbWFyaWx5IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gUm9wZUZ1bmN0aW9ucy4gIFdlIHB1dCB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIHRvIGF2b2lkIGxvY2tpbmcgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXRocmVhZGVkIGNhc2UuCisgICAgICAvLyBUaGUgY2FjaGVkIHBhdGggaXMgZ2VuZXJhbGx5IGFzc3VtZWQgdG8gYmUgdmFsaWQKKyAgICAgIC8vIG9ubHkgaWYgdGhlIGJ1ZmZlciBpcyB2YWxpZC4KKyAgICAgIHN0YXRpYyB2b2lkIF9TX3NldGJ1ZihfUm9wZV9pdGVyYXRvcl9iYXNlJiBfX3gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBidWZmZXIgY29udGVudHMgZ2l2ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoIGNhY2hlLgorICAgICAgc3RhdGljIHZvaWQgX1Nfc2V0Y2FjaGUoX1JvcGVfaXRlcmF0b3JfYmFzZSYgX194KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYnVmZmVyIGNvbnRlbnRzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGggY2FjaGUuCisgICAgICBzdGF0aWMgdm9pZCBfU19zZXRjYWNoZV9mb3JfaW5jcihfUm9wZV9pdGVyYXRvcl9iYXNlJiBfX3gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzIGFib3ZlLCBidXQgYXNzdW1lcyBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUgaXMgdmFsaWQgZm9yIHByZXZpb3VzIHBvc24uCisgICAgICBfUm9wZV9pdGVyYXRvcl9iYXNlKCkgeyB9CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2UoX1JvcGVSZXAqIF9fcm9vdCwgc2l6ZV90IF9fcG9zKQorICAgICAgOiBfTV9jdXJyZW50X3BvcyhfX3BvcyksIF9NX3Jvb3QoX19yb290KSwgX01fYnVmX3B0cigwKSB7IH0KKworICAgICAgdm9pZCBfTV9pbmNyKHNpemVfdCBfX24pOworICAgICAgdm9pZCBfTV9kZWNyKHNpemVfdCBfX24pOworICAgIHB1YmxpYzoKKyAgICAgIHNpemVfdAorICAgICAgaW5kZXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VycmVudF9wb3M7IH0KKyAgICAKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2UoY29uc3QgX1JvcGVfaXRlcmF0b3JfYmFzZSYgX194KQorICAgICAgeworICAgICAgICBpZiAoMCAhPSBfX3guX01fYnVmX3B0cikKKwkgICp0aGlzID0gX194OworCWVsc2UKKwkgIHsKKyAgICAgICAgICAgIF9NX2N1cnJlbnRfcG9zID0gX194Ll9NX2N1cnJlbnRfcG9zOworICAgICAgICAgICAgX01fcm9vdCA9IF9feC5fTV9yb290OworICAgICAgICAgICAgX01fYnVmX3B0ciA9IDA7CisJICB9CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBfUm9wZV9pdGVyYXRvcjsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBfUm9wZV9jb25zdF9pdGVyYXRvcgorICAgIDogcHVibGljIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+CisgICAgeworICAgICAgZnJpZW5kIGNsYXNzIHJvcGU8X0NoYXJULCBfQWxsb2M+OworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4gX1JvcGVSZXA7CisgICAgICAvLyBUaGUgb25lIGZyb20gdGhlIGJhc2UgY2xhc3MgbWF5IG5vdCBiZSBkaXJlY3RseSB2aXNpYmxlLgorICAgICAgX1JvcGVfY29uc3RfaXRlcmF0b3IoY29uc3QgX1JvcGVSZXAqIF9fcm9vdCwgc2l6ZV90IF9fcG9zKQorICAgICAgOiBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPihjb25zdF9jYXN0PF9Sb3BlUmVwKj4oX19yb290KSwKKwkJCQkJICAgIF9fcG9zKQorICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgbm9uY29uc3QgaXRlcmF0b3JzIG1vZGlmeSByb290IHJlZiBjb3VudAorICAgICAgeyB9CisgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NoYXJUIHJlZmVyZW5jZTsgICAvLyBSZWFsbHkgYSB2YWx1ZS4gIFJldHVybmluZyBhIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvdWxkIGJlIGEgbWVzcywgc2luY2UgaXQgd291bGQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIGluY2x1ZGVkIGluIHJlZmNvdW50LgorICAgICAgdHlwZWRlZiBjb25zdCBfQ2hhclQqIHBvaW50ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICBfUm9wZV9jb25zdF9pdGVyYXRvcigpIHsgfTsKKworICAgICAgX1JvcGVfY29uc3RfaXRlcmF0b3IoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3ImIF9feCkKKyAgICAgIDogX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPihfX3gpIHsgfQorCisgICAgICBfUm9wZV9jb25zdF9pdGVyYXRvcihjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194KTsKKyAgICAKKyAgICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3IsIHNpemVfdCBfX3BvcykKKyAgICAgIDogX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPihfX3IuX01fdHJlZV9wdHIsIF9fcG9zKSB7IH0KKworICAgICAgX1JvcGVfY29uc3RfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3ImIF9feCkKKyAgICAgIHsKKyAgICAgICAgaWYgKDAgIT0gX194Ll9NX2J1Zl9wdHIpCisJICAqKHN0YXRpY19jYXN0PF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+Kj4odGhpcykpID0gX194OworCWVsc2UKKwkgIHsKKyAgICAgICAgICAgIHRoaXMtPl9NX2N1cnJlbnRfcG9zID0gX194Ll9NX2N1cnJlbnRfcG9zOworICAgICAgICAgICAgdGhpcy0+X01fcm9vdCA9IF9feC5fTV9yb290OworICAgICAgICAgICAgdGhpcy0+X01fYnVmX3B0ciA9IDA7CisJICB9CisgICAgICAgIHJldHVybigqdGhpcyk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsKKyAgICAgICAgaWYgKDAgPT0gdGhpcy0+X01fYnVmX3B0cikKKwkgIHRoaXMtPl9TX3NldGNhY2hlKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzLT5fTV9idWZfcHRyOworICAgICAgfQorCisgICAgICAvLyBXaXRob3V0IHRoaXMgY29uc3QgdmVyc2lvbiwgUm9wZSBpdGVyYXRvcnMgZG8gbm90IG1lZXQgdGhlCisgICAgICAvLyByZXF1aXJlbWVudHMgb2YgYW4gSW5wdXQgSXRlcmF0b3IuCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJcmV0dXJuICpjb25zdF9jYXN0PF9Sb3BlX2NvbnN0X2l0ZXJhdG9yJj4oKnRoaXMpOworICAgICAgfQorCisgICAgICBfUm9wZV9jb25zdF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworICAgICAgICBfX0dDX0NPTlNUIF9DaGFyVCogX19uZXh0OworICAgICAgICBpZiAoMCAhPSB0aGlzLT5fTV9idWZfcHRyCisJICAgICYmIChfX25leHQgPSB0aGlzLT5fTV9idWZfcHRyICsgMSkgPCB0aGlzLT5fTV9idWZfZW5kKQorCSAgeworICAgICAgICAgICAgdGhpcy0+X01fYnVmX3B0ciA9IF9fbmV4dDsKKyAgICAgICAgICAgICsrdGhpcy0+X01fY3VycmVudF9wb3M7CisJICB9CisJZWxzZQorCSAgdGhpcy0+X01faW5jcigxKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrPShwdHJkaWZmX3QgX19uKQorICAgICAgeworICAgICAgICBpZiAoX19uID49IDApCisJICB0aGlzLT5fTV9pbmNyKF9fbik7CisJZWxzZQorCSAgdGhpcy0+X01fZGVjcigtX19uKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisgICAgICAgIHRoaXMtPl9NX2RlY3IoMSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1JvcGVfY29uc3RfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvci09KHB0cmRpZmZfdCBfX24pCisgICAgICB7CisgICAgICAgIGlmIChfX24gPj0gMCkKKwkgIHRoaXMtPl9NX2RlY3IoX19uKTsKKwllbHNlCisJICB0aGlzLT5fTV9pbmNyKC1fX24pOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1JvcGVfY29uc3RfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworICAgICAgICBzaXplX3QgX19vbGRfcG9zID0gdGhpcy0+X01fY3VycmVudF9wb3M7CisgICAgICAgIHRoaXMtPl9NX2luY3IoMSk7CisgICAgICAgIHJldHVybiBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPih0aGlzLT5fTV9yb290LCBfX29sZF9wb3MpOworICAgICAgICAvLyBUaGlzIG1ha2VzIGEgc3Vic2VxdWVudCBkZXJlZmVyZW5jZSBleHBlbnNpdmUuCisgICAgICAgIC8vIFBlcmhhcHMgd2Ugc2hvdWxkIGluc3RlYWQgY29weSB0aGUgaXRlcmF0b3IKKyAgICAgICAgLy8gaWYgaXQgaGFzIGEgdmFsaWQgY2FjaGU/CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90IF9fb2xkX3BvcyA9IHRoaXMtPl9NX2N1cnJlbnRfcG9zOworICAgICAgICB0aGlzLT5fTV9kZWNyKDEpOworICAgICAgICByZXR1cm4gX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4odGhpcy0+X01fcm9vdCwgX19vbGRfcG9zKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+CisgICAgICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194LAorCQkgIHB0cmRpZmZfdCBfX24pOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4KKyAgICAgICAgb3BlcmF0b3IrKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3gsCisJCSAgcHRyZGlmZl90IF9fbik7CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9BbGxvYzI+CisgICAgICAgIGZyaWVuZCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPgorICAgICAgICBvcGVyYXRvcisocHRyZGlmZl90IF9fbiwKKwkJICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194KTsKKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdCBfX24pCisgICAgICB7IHJldHVybiByb3BlPF9DaGFyVCwgX0FsbG9jPjo6X1NfZmV0Y2godGhpcy0+X01fcm9vdCwKKwkJCQkJICAgICAgdGhpcy0+X01fY3VycmVudF9wb3MgKyBfX24pOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9BbGxvYzI+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feCwKKwkJICAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feSk7CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9BbGxvYzI+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPChjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194LAorCQkgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3kpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgcHRyZGlmZl90CisgICAgICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194LAorCQkgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3kpOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgX1JvcGVfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPgorICAgIHsKKyAgICAgIGZyaWVuZCBjbGFzcyByb3BlPF9DaGFyVCwgX0FsbG9jPjsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjpfUm9wZVJlcCBfUm9wZVJlcDsKKyAgICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+KiBfTV9yb290X3JvcGU7CisKKyAgICAgIC8vIHJvb3QgaXMgdHJlYXRlZCBhcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoaXMsIGFuZCBpcyB1c2VkIHRvCisgICAgICAvLyBkZXRlY3QgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyByb3BlLgorCisgICAgICAvLyBSb290IGlzIGluY2x1ZGVkIGluIHRoZSByZWZlcmVuY2UgY291bnQuICBUaGlzIGlzIG5lY2Vzc2FyeQorICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IGNoYW5nZXMgcmVsaWFibHkuICBVbmZvcnR1bmF0ZWx5LCBpdAorICAgICAgLy8gcmVxdWlyZXMgY2FyZWZ1bCBib29ra2VlcGluZyBmb3IgdGhlIG5vbkdDIGNhc2UuCisgICAgICBfUm9wZV9pdGVyYXRvcihyb3BlPF9DaGFyVCwgX0FsbG9jPiogX19yLCBzaXplX3QgX19wb3MpCisgICAgICA6IF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+KF9fci0+X01fdHJlZV9wdHIsIF9fcG9zKSwKKyAgICAgICAgX01fcm9vdF9yb3BlKF9fcikKKyAgICAgIHsgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsKKyAgICAgICAgaWYgKCEoX19yIC0+IGVtcHR5KCkpKQorCSAgdGhpcy0+X1Nfc2V0Y2FjaGUoKnRoaXMpOworICAgICAgfQorCisgICAgICB2b2lkIF9NX2NoZWNrKCk7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4gIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+KiBwb2ludGVyOworCisgICAgICByb3BlPF9DaGFyVCwgX0FsbG9jPiYKKyAgICAgIGNvbnRhaW5lcigpCisgICAgICB7IHJldHVybiAqX01fcm9vdF9yb3BlOyB9CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy0+X01fcm9vdCA9IDA7ICAvLyBOZWVkZWQgZm9yIHJlZmVyZW5jZSBjb3VudGluZy4KKyAgICAgIH07CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yJiBfX3gpCisgICAgICA6IF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+KF9feCkKKyAgICAgIHsKKyAgICAgICAgX01fcm9vdF9yb3BlID0gX194Ll9NX3Jvb3Rfcm9wZTsKKyAgICAgICAgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsKKyAgICAgIH0KKworICAgICAgX1JvcGVfaXRlcmF0b3Iocm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fciwgc2l6ZV90IF9fcG9zKTsKKworICAgICAgfl9Sb3BlX2l0ZXJhdG9yKCkKKyAgICAgIHsgX1JvcGVSZXA6Ol9TX3VucmVmKHRoaXMtPl9NX3Jvb3QpOyB9CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yJiBfX3gpCisgICAgICB7CisgICAgICAgIF9Sb3BlUmVwKiBfX29sZCA9IHRoaXMtPl9NX3Jvb3Q7CisJCisgICAgICAgIF9Sb3BlUmVwOjpfU19yZWYoX194Ll9NX3Jvb3QpOworICAgICAgICBpZiAoMCAhPSBfX3guX01fYnVmX3B0cikKKwkgIHsKKyAgICAgICAgICAgIF9NX3Jvb3Rfcm9wZSA9IF9feC5fTV9yb290X3JvcGU7CisgICAgICAgICAgICAqKHN0YXRpY19jYXN0PF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+Kj4odGhpcykpID0gX194OworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgdGhpcy0+X01fY3VycmVudF9wb3MgPSBfX3guX01fY3VycmVudF9wb3M7CisgICAgICAgICAgICB0aGlzLT5fTV9yb290ID0gX194Ll9NX3Jvb3Q7CisgICAgICAgICAgICBfTV9yb290X3JvcGUgPSBfX3guX01fcm9vdF9yb3BlOworICAgICAgICAgICAgdGhpcy0+X01fYnVmX3B0ciA9IDA7CisJICB9CisgICAgICAgIF9Sb3BlUmVwOjpfU191bnJlZihfX29sZCk7CisgICAgICAgIHJldHVybigqdGhpcyk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsKKyAgICAgICAgX01fY2hlY2soKTsKKyAgICAgICAgaWYgKDAgPT0gdGhpcy0+X01fYnVmX3B0cikKKwkgIHJldHVybiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4oX01fcm9vdF9yb3BlLAorCQkJCQkJICAgICAgdGhpcy0+X01fY3VycmVudF9wb3MpOworCWVsc2UKKwkgIHJldHVybiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4oX01fcm9vdF9yb3BlLAorCQkJCQkJICAgICAgdGhpcy0+X01fY3VycmVudF9wb3MsCisJCQkJCQkgICAgICAqdGhpcy0+X01fYnVmX3B0cik7CisgICAgICB9CisKKyAgICAgIC8vIFNlZSBhYm92ZSBjb21tZW50LgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworCXJldHVybiAqY29uc3RfY2FzdDxfUm9wZV9pdGVyYXRvciY+KCp0aGlzKTsKKyAgICAgIH0KKworICAgICAgX1JvcGVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy0+X01faW5jcigxKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfUm9wZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fbikKKyAgICAgIHsKKyAgICAgICAgaWYgKF9fbiA+PSAwKQorCSAgdGhpcy0+X01faW5jcihfX24pOworCWVsc2UKKwkgIHRoaXMtPl9NX2RlY3IoLV9fbik7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfUm9wZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworICAgICAgICB0aGlzLT5fTV9kZWNyKDEpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItPShwdHJkaWZmX3QgX19uKQorICAgICAgeworICAgICAgICBpZiAoX19uID49IDApCisJICB0aGlzLT5fTV9kZWNyKF9fbik7CisJZWxzZQorCSAgdGhpcy0+X01faW5jcigtX19uKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90IF9fb2xkX3BvcyA9IHRoaXMtPl9NX2N1cnJlbnRfcG9zOworICAgICAgICB0aGlzLT5fTV9pbmNyKDEpOworICAgICAgICByZXR1cm4gX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4oX01fcm9vdF9yb3BlLCBfX29sZF9wb3MpOworICAgICAgfQorCisgICAgICBfUm9wZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7CisgICAgICAgIHNpemVfdCBfX29sZF9wb3MgPSB0aGlzLT5fTV9jdXJyZW50X3BvczsKKyAgICAgICAgdGhpcy0+X01fZGVjcigxKTsKKyAgICAgICAgcmV0dXJuIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KF9NX3Jvb3Rfcm9wZSwgX19vbGRfcG9zKTsKKyAgICAgIH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHB0cmRpZmZfdCBfX24pCisgICAgICB7IHJldHVybiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4oX01fcm9vdF9yb3BlLAorCQkJCQkJICAgIHRoaXMtPl9NX2N1cnJlbnRfcG9zCisJCQkJCQkgICAgKyBfX24pOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9BbGxvYzI+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feCwKKwkJICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feSk7CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9BbGxvYzI+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPChjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194LAorCQkgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3kpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgcHRyZGlmZl90CisgICAgICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194LAorCQkgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3kpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgX1JvcGVfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4KKyAgICAgICAgb3BlcmF0b3ItKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3gsIHB0cmRpZmZfdCBfX24pOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgX1JvcGVfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4KKyAgICAgICAgb3BlcmF0b3IrKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3gsIHB0cmRpZmZfdCBfX24pOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgX1JvcGVfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4KKyAgICAgICAgb3BlcmF0b3IrKHB0cmRpZmZfdCBfX24sIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3gpOworICAgIH07CisKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9Sb3BlX2Jhc2UKKyAgICA6IHB1YmxpYyBfQWxsb2MKKyAgICB7CisgICAgICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9BbGxvYyo+KHRoaXMpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlJgorICAgICAgX01fZ2V0X2FsbG9jYXRvcigpCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X0FsbG9jKj4odGhpcyk7IH0KKworICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmCisgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfQWxsb2MqPih0aGlzKTsgfQorCisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+IF9Sb3BlUmVwOworICAgICAgLy8gVGhlIG9uZSBpbiBfQmFzZSBtYXkgbm90IGJlIHZpc2libGUgZHVlIHRvIHRlbXBsYXRlIHJ1bGVzLgorCisgICAgICBfUm9wZV9iYXNlKF9Sb3BlUmVwKiBfX3QsIGNvbnN0IGFsbG9jYXRvcl90eXBlJikKKyAgICAgIDogX01fdHJlZV9wdHIoX190KSB7IH0KKworICAgICAgX1JvcGVfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYpIHsgfQorCisgICAgICAvLyBUaGUgb25seSBkYXRhIG1lbWJlciBvZiBhIHJvcGU6CisgICAgICBfUm9wZVJlcCAqX01fdHJlZV9wdHI7CisKKyNkZWZpbmUgX19ST1BFX0RFRklORV9BTExPQyhfVHAsIF9fbmFtZSkgXAorICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIFwKKyAgICAgICAgICBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfVHA+OjpvdGhlciBfX25hbWUjI0FsbG9jOyBcCisgICAgICAgIHN0YXRpYyBfVHAqIF9fbmFtZSMjX2FsbG9jYXRlKHNpemVfdCBfX24pIFwKKyAgICAgICAgICB7IHJldHVybiBfX25hbWUjI0FsbG9jKCkuYWxsb2NhdGUoX19uKTsgfSBcCisgICAgICAgIHN0YXRpYyB2b2lkIF9fbmFtZSMjX2RlYWxsb2NhdGUoX1RwICpfX3AsIHNpemVfdCBfX24pIFwKKyAgICAgICAgICB7IF9fbmFtZSMjQWxsb2MoKS5kZWFsbG9jYXRlKF9fcCwgX19uKTsgfQorICAgICAgX19ST1BFX0RFRklORV9BTExPQ1MoX0FsbG9jKQorI3VuZGVmIF9fUk9QRV9ERUZJTkVfQUxMT0MKKworCXByb3RlY3RlZDoKKyAgICAgIF9Sb3BlX2Jhc2UmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1JvcGVfYmFzZSYpOworICAgICAgCisgICAgICBfUm9wZV9iYXNlKGNvbnN0IF9Sb3BlX2Jhc2UmKTsKKyAgICB9OworCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgICovCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyByb3BlIDogcHVibGljIF9Sb3BlX2Jhc2U8X0NoYXJULCBfQWxsb2M+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NoYXJUIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIF9DaGFyVCBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9DaGFyVCogY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+IGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4gY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiBwb2ludGVyOworCisgICAgICBmcmllbmQgY2xhc3MgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+OworICAgICAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPjsKKyAgICAgIGZyaWVuZCBzdHJ1Y3QgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz47CisgICAgICBmcmllbmQgY2xhc3MgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz47CisgICAgICBmcmllbmQgY2xhc3MgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULCBfQWxsb2M+OworICAgICAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPjsKKyAgICAgIGZyaWVuZCBzdHJ1Y3QgX1JvcGVfUm9wZVN1YnN0cmluZzxfQ2hhclQsIF9BbGxvYz47CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9Sb3BlX2Jhc2U8X0NoYXJULCBfQWxsb2M+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICB1c2luZyBfQmFzZTo6X01fdHJlZV9wdHI7CisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9nZXRfYWxsb2NhdG9yOyAgICAgIAorICAgICAgdHlwZWRlZiBfX0dDX0NPTlNUIF9DaGFyVCogX0NzdHJwdHI7CisgICAgICAKKyAgICAgIHN0YXRpYyBfQ2hhclQgX1NfZW1wdHlfY19zdHJbMV07CisgICAgICAKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBfU19pczAoX0NoYXJUIF9fYykKKyAgICAgIHsgcmV0dXJuIF9fYyA9PSBfU19lb3MoKF9DaGFyVCopMCk7IH0KKyAgICAgIAorICAgICAgZW51bSB7IF9TX2NvcHlfbWF4ID0gMjMgfTsKKyAgICAgICAgICAgICAgICAvLyBGb3Igc3RyaW5ncyBzaG9ydGVyIHRoYW4gX1NfY29weV9tYXgsIHdlIGNvcHkgdG8KKyAgICAgICAgICAgICAgICAvLyBjb25jYXRlbmF0ZS4KKworICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiBfUm9wZVJlcDsKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULCBfQWxsb2M+IF9Sb3BlQ29uY2F0ZW5hdGlvbjsKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZUxlYWY8X0NoYXJULCBfQWxsb2M+IF9Sb3BlTGVhZjsKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCwgX0FsbG9jPiBfUm9wZUZ1bmN0aW9uOworICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlU3Vic3RyaW5nPF9DaGFyVCwgX0FsbG9jPiBfUm9wZVN1YnN0cmluZzsKKworICAgICAgLy8gUmV0cmlldmUgYSBjaGFyYWN0ZXIgYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbi4KKyAgICAgIHN0YXRpYyBfQ2hhclQgX1NfZmV0Y2goX1JvcGVSZXAqIF9fciwgc2l6ZV90eXBlIF9fcG9zKTsKKworI2lmbmRlZiBfX0dDCisgICAgICAvLyBPYnRhaW4gYSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbi4KKyAgICAgIC8vIFRoZSBwb2ludGVyIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgY2hhcmFjdGVyLgorICAgICAgLy8gSWYgc3VjaCBhIHBvaW50ZXIgY2Fubm90IGJlIHByb2R1Y2VkLCBhcyBpcyBmcmVxdWVudGx5IHRoZQorICAgICAgLy8gY2FzZSwgMCBpcyByZXR1cm5lZCBpbnN0ZWFkLgorICAgICAgLy8gKFJldHVybnMgbm9uemVybyBvbmx5IGlmIGFsbCBub2RlcyBpbiB0aGUgcGF0aCBoYXZlIGEgcmVmY291bnQKKyAgICAgIC8vIG9mIDEuKQorICAgICAgc3RhdGljIF9DaGFyVCogX1NfZmV0Y2hfcHRyKF9Sb3BlUmVwKiBfX3IsIHNpemVfdHlwZSBfX3Bvcyk7CisjZW5kaWYKKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX2FwcGx5X3RvX3BpZWNlcygvLyBzaG91bGQgYmUgdGVtcGxhdGUgcGFyYW1ldGVyCisJCQkgX1JvcGVfY2hhcl9jb25zdW1lcjxfQ2hhclQ+JiBfX2MsCisJCQkgY29uc3QgX1JvcGVSZXAqIF9fciwKKwkJCSBzaXplX3QgX19iZWdpbiwgc2l6ZV90IF9fZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWdpbiBhbmQgZW5kIGFyZSBhc3N1bWVkIHRvIGJlIGluIHJhbmdlLgorCisjaWZuZGVmIF9fR0MKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU191bnJlZihfUm9wZVJlcCogX190KQorICAgICAgeyBfUm9wZVJlcDo6X1NfdW5yZWYoX190KTsgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfcmVmKF9Sb3BlUmVwKiBfX3QpCisgICAgICB7IF9Sb3BlUmVwOjpfU19yZWYoX190KTsgfQorCisjZWxzZSAvKiBfX0dDICovCisgICAgICBzdGF0aWMgdm9pZCBfU191bnJlZihfUm9wZVJlcCopIHsgfQorICAgICAgc3RhdGljIHZvaWQgX1NfcmVmKF9Sb3BlUmVwKikgeyB9CisjZW5kaWYKKworI2lmZGVmIF9fR0MKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4qIF9TZWxmX2Rlc3RydWN0X3B0cjsKKyNlbHNlCisgICAgICB0eXBlZGVmIF9Sb3BlX3NlbGZfZGVzdHJ1Y3RfcHRyPF9DaGFyVCwgX0FsbG9jPiBfU2VsZl9kZXN0cnVjdF9wdHI7CisjZW5kaWYKKworICAgICAgLy8gX1Jlc3VsdCBpcyBjb3VudGVkIGluIHJlZmNvdW50LgorICAgICAgc3RhdGljIF9Sb3BlUmVwKiBfU19zdWJzdHJpbmcoX1JvcGVSZXAqIF9fYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19lbmRwMSk7CisKKyAgICAgIHN0YXRpYyBfUm9wZVJlcCogX1NfY29uY2F0X2NoYXJfaXRlcihfUm9wZVJlcCogX19yLAorCQkJCQkgICBjb25zdCBfQ2hhclQqIF9faXRlciwgc2l6ZV90IF9fc2xlbik7CisgICAgICAvLyBDb25jYXRlbmF0ZSByb3BlIGFuZCBjaGFyIHB0ciwgY29weWluZyBfX3MuCisgICAgICAvLyBTaG91bGQgcmVhbGx5IHRha2UgYW4gYXJiaXRyYXJ5IGl0ZXJhdG9yLgorICAgICAgLy8gUmVzdWx0IGlzIGNvdW50ZWQgaW4gcmVmY291bnQuCisgICAgICBzdGF0aWMgX1JvcGVSZXAqIF9TX2Rlc3RyX2NvbmNhdF9jaGFyX2l0ZXIoX1JvcGVSZXAqIF9fciwKKwkJCQkJCSBjb25zdCBfQ2hhclQqIF9faXRlciwKKwkJCQkJCSBzaXplX3QgX19zbGVuKQorCS8vIEFzIGFib3ZlLCBidXQgb25lIHJlZmVyZW5jZSB0byBfX3IgaXMgYWJvdXQgdG8gYmUKKwkvLyBkZXN0cm95ZWQuICBUaHVzIHRoZSBwaWVjZXMgbWF5IGJlIHJlY3ljbGVkIGlmIGFsbAorCS8vIHJlbGV2YW50IHJlZmVyZW5jZSBjb3VudHMgYXJlIDEuCisjaWZkZWYgX19HQworCS8vIFdlIGNhbid0IHJlYWxseSBkbyBhbnl0aGluZyBzaW5jZSByZWZjb3VudHMgYXJlIHVuYXZhaWxhYmxlLgorICAgICAgeyByZXR1cm4gX1NfY29uY2F0X2NoYXJfaXRlcihfX3IsIF9faXRlciwgX19zbGVuKTsgfQorI2Vsc2UKKyAgICAgIDsKKyNlbmRpZgorCisgICAgICBzdGF0aWMgX1JvcGVSZXAqIF9TX2NvbmNhdChfUm9wZVJlcCogX19sZWZ0LCBfUm9wZVJlcCogX19yaWdodCk7CisgICAgICAvLyBHZW5lcmFsIGNvbmNhdGVuYXRpb24gb24gX1JvcGVSZXAuICBfUmVzdWx0CisgICAgICAvLyBoYXMgcmVmY291bnQgb2YgMS4gIEFkanVzdHMgYXJndW1lbnQgcmVmY291bnRzLgorCisgICBwdWJsaWM6CisgICAgICB2b2lkCisgICAgICBhcHBseV90b19waWVjZXMoc2l6ZV90IF9fYmVnaW4sIHNpemVfdCBfX2VuZCwKKwkJICAgICAgX1JvcGVfY2hhcl9jb25zdW1lcjxfQ2hhclQ+JiBfX2MpIGNvbnN0CisgICAgICB7IF9TX2FwcGx5X3RvX3BpZWNlcyhfX2MsIHRoaXMtPl9NX3RyZWVfcHRyLCBfX2JlZ2luLCBfX2VuZCk7IH0KKworICAgcHJvdGVjdGVkOgorCisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBfU19yb3VuZGVkX3VwX3NpemUoc2l6ZV90IF9fbikKKyAgICAgIHsgcmV0dXJuIF9Sb3BlTGVhZjo6X1Nfcm91bmRlZF91cF9zaXplKF9fbik7IH0KKworICAgICAgc3RhdGljIHNpemVfdAorICAgICAgX1NfYWxsb2NhdGVkX2NhcGFjaXR5KHNpemVfdCBfX24pCisgICAgICB7CisJaWYgKF9TX2lzX2Jhc2ljX2NoYXJfdHlwZSgoX0NoYXJUKikwKSkKKwkgIHJldHVybiBfU19yb3VuZGVkX3VwX3NpemUoX19uKSAtIDE7CisJZWxzZQorCSAgcmV0dXJuIF9TX3JvdW5kZWRfdXBfc2l6ZShfX24pOworCQorICAgICAgfQorCisgICAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGEgUm9wZUxlYWYgdXNpbmcgdGhlIHN1cHBsaWVkIGFsbG9jYXRvcgorICAgICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHMgaW5zdGVhZCBvZiBjb3B5aW5nLgorICAgICAgc3RhdGljIF9Sb3BlTGVhZioKKyAgICAgIF9TX25ld19Sb3BlTGVhZihfX0dDX0NPTlNUIF9DaGFyVCAqX19zLAorCQkgICAgICBzaXplX3QgX19zaXplLCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgeworCV9Sb3BlTGVhZiogX19zcGFjZSA9IHR5cGVuYW1lIF9CYXNlOjpfTEFsbG9jKF9fYSkuYWxsb2NhdGUoMSk7CisJcmV0dXJuIG5ldyhfX3NwYWNlKSBfUm9wZUxlYWYoX19zLCBfX3NpemUsIF9fYSk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBfUm9wZUNvbmNhdGVuYXRpb24qCisgICAgICBfU19uZXdfUm9wZUNvbmNhdGVuYXRpb24oX1JvcGVSZXAqIF9fbGVmdCwgX1JvcGVSZXAqIF9fcmlnaHQsCisJCQkgICAgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIHsKKwlfUm9wZUNvbmNhdGVuYXRpb24qIF9fc3BhY2UgPSB0eXBlbmFtZSBfQmFzZTo6X0NBbGxvYyhfX2EpLmFsbG9jYXRlKDEpOworCXJldHVybiBuZXcoX19zcGFjZSkgX1JvcGVDb25jYXRlbmF0aW9uKF9fbGVmdCwgX19yaWdodCwgX19hKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIF9Sb3BlRnVuY3Rpb24qCisgICAgICBfU19uZXdfUm9wZUZ1bmN0aW9uKGNoYXJfcHJvZHVjZXI8X0NoYXJUPiogX19mLAorCQkJICBzaXplX3QgX19zaXplLCBib29sIF9fZCwgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIHsKKwlfUm9wZUZ1bmN0aW9uKiBfX3NwYWNlID0gdHlwZW5hbWUgX0Jhc2U6Ol9GQWxsb2MoX19hKS5hbGxvY2F0ZSgxKTsKKwlyZXR1cm4gbmV3KF9fc3BhY2UpIF9Sb3BlRnVuY3Rpb24oX19mLCBfX3NpemUsIF9fZCwgX19hKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIF9Sb3BlU3Vic3RyaW5nKgorICAgICAgX1NfbmV3X1JvcGVTdWJzdHJpbmcoX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiogX19iLCBzaXplX3QgX19zLAorCQkJICAgc2l6ZV90IF9fbCwgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIHsKKwlfUm9wZVN1YnN0cmluZyogX19zcGFjZSA9IHR5cGVuYW1lIF9CYXNlOjpfU0FsbG9jKF9fYSkuYWxsb2NhdGUoMSk7CisJcmV0dXJuIG5ldyhfX3NwYWNlKSBfUm9wZVN1YnN0cmluZyhfX2IsIF9fcywgX19sLCBfX2EpOworICAgICAgfQorICAgICAgCisgICAgICBzdGF0aWMgX1JvcGVMZWFmKgorICAgICAgX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKGNvbnN0IF9DaGFyVCAqX19zLAorCQkJCQlzaXplX3QgX19zaXplLCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2RlZmluZSBfX1NUTF9ST1BFX0ZST01fVU5PV05FRF9DSEFSX1BUUihfX3MsIF9fc2l6ZSwgX19hKSBcCisgICAgICAgICAgICAgICAgX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKF9fcywgX19zaXplLCBfX2EpCisgICAgICB7CisJaWYgKDAgPT0gX19zaXplKQorCSAgcmV0dXJuIDA7CisJX0NoYXJUKiBfX2J1ZiA9IF9fYS5hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19zaXplKSk7CisJCisJX191bmluaXRpYWxpemVkX2NvcHlfbl9hKF9fcywgX19zaXplLCBfX2J1ZiwgX19hKTsKKwlfU19jb25kX3N0b3JlX2VvcyhfX2J1ZltfX3NpemVdKTsKKwlfX3RyeQorCSAgeyByZXR1cm4gX1NfbmV3X1JvcGVMZWFmKF9fYnVmLCBfX3NpemUsIF9fYSk7IH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX1JvcGVSZXA6Ol9fU1RMX0ZSRUVfU1RSSU5HKF9fYnVmLCBfX3NpemUsIF9fYSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorCisgICAgICAvLyBDb25jYXRlbmF0aW9uIG9mIG5vbmVtcHR5IHN0cmluZ3MuCisgICAgICAvLyBBbHdheXMgYnVpbGRzIGEgY29uY2F0ZW5hdGlvbiBub2RlLgorICAgICAgLy8gUmViYWxhbmNlcyBpZiB0aGUgcmVzdWx0IGlzIHRvbyBkZWVwLgorICAgICAgLy8gUmVzdWx0IGhhcyByZWZjb3VudCAxLgorICAgICAgLy8gRG9lcyBub3QgaW5jcmVtZW50IGxlZnQgYW5kIHJpZ2h0IHJlZiBjb3VudHMgZXZlbiB0aG91Z2gKKyAgICAgIC8vIHRoZXkgYXJlIHJlZmVyZW5jZWQuCisgICAgICBzdGF0aWMgX1JvcGVSZXAqCisgICAgICBfU190cmVlX2NvbmNhdChfUm9wZVJlcCogX19sZWZ0LCBfUm9wZVJlcCogX19yaWdodCk7CisKKyAgICAgIC8vIENvbmNhdGVuYXRpb24gaGVscGVyIGZ1bmN0aW9ucworICAgICAgc3RhdGljIF9Sb3BlTGVhZioKKyAgICAgIF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfUm9wZUxlYWYqIF9fciwKKwkJCSAgICAgICBjb25zdCBfQ2hhclQqIF9faXRlciwgc2l6ZV90IF9fc2xlbik7CisgICAgICAvLyBDb25jYXRlbmF0ZSBieSBjb3B5aW5nIGxlYWYuCisgICAgICAvLyBzaG91bGQgdGFrZSBhbiBhcmJpdHJhcnkgaXRlcmF0b3IKKyAgICAgIC8vIHJlc3VsdCBoYXMgcmVmY291bnQgMS4KKyNpZm5kZWYgX19HQworICAgICAgc3RhdGljIF9Sb3BlTGVhZioKKyAgICAgIF9TX2Rlc3RyX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfUm9wZUxlYWYqIF9fciwKKwkJCQkgICAgIGNvbnN0IF9DaGFyVCogX19pdGVyLCBzaXplX3QgX19zbGVuKTsKKyAgICAgIC8vIEEgdmVyc2lvbiB0aGF0IHBvdGVudGlhbGx5IGNsb2JiZXJzIF9fciBpZiBfX3ItPl9NX3JlZl9jb3VudCA9PSAxLgorI2VuZGlmCisKKyAgICBwcml2YXRlOgorICAgICAgCisgICAgICBzdGF0aWMgc2l6ZV90IF9TX2NoYXJfcHRyX2xlbihjb25zdCBfQ2hhclQqIF9fcyk7CisgICAgICAvLyBzbGlnaHRseSBnZW5lcmFsaXplZCBzdHJsZW4KKworICAgICAgcm9wZShfUm9wZVJlcCogX190LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX190LCBfX2EpIHsgfQorCisKKyAgICAgIC8vIENvcHkgX19yIHRvIHRoZSBfQ2hhclQgYnVmZmVyLgorICAgICAgLy8gUmV0dXJucyBfX2J1ZmZlciArIF9fci0+X01fc2l6ZS4KKyAgICAgIC8vIEFzc3VtZXMgdGhhdCBidWZmZXIgaXMgdW5pbml0aWFsaXplZC4KKyAgICAgIHN0YXRpYyBfQ2hhclQqIF9TX2ZsYXR0ZW4oX1JvcGVSZXAqIF9fciwgX0NoYXJUKiBfX2J1ZmZlcik7CisKKyAgICAgIC8vIEFnYWluLCB3aXRoIGV4cGxpY2l0IHN0YXJ0aW5nIHBvc2l0aW9uIGFuZCBsZW5ndGguCisgICAgICAvLyBBc3N1bWVzIHRoYXQgYnVmZmVyIGlzIHVuaW5pdGlhbGl6ZWQuCisgICAgICBzdGF0aWMgX0NoYXJUKiBfU19mbGF0dGVuKF9Sb3BlUmVwKiBfX3IsCisJCQkJc2l6ZV90IF9fc3RhcnQsIHNpemVfdCBfX2xlbiwKKwkJCQlfQ2hhclQqIF9fYnVmZmVyKTsKKworICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcKKyAgICAgIF9TX21pbl9sZW5bX19kZXRhaWw6Ol9TX21heF9yb3BlX2RlcHRoICsgMV07CisgICAgICAKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBfU19pc19iYWxhbmNlZChfUm9wZVJlcCogX19yKQorICAgICAgeyByZXR1cm4gKF9fci0+X01fc2l6ZSA+PSBfU19taW5fbGVuW19fci0+X01fZGVwdGhdKTsgfQorCisgICAgICBzdGF0aWMgYm9vbAorICAgICAgX1NfaXNfYWxtb3N0X2JhbGFuY2VkKF9Sb3BlUmVwKiBfX3IpCisgICAgICB7IHJldHVybiAoX19yLT5fTV9kZXB0aCA9PSAwCisJCXx8IF9fci0+X01fc2l6ZSA+PSBfU19taW5fbGVuW19fci0+X01fZGVwdGggLSAxXSk7IH0KKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX2lzX3JvdWdobHlfYmFsYW5jZWQoX1JvcGVSZXAqIF9fcikKKyAgICAgIHsgcmV0dXJuIChfX3ItPl9NX2RlcHRoIDw9IDEKKwkJfHwgX19yLT5fTV9zaXplID49IF9TX21pbl9sZW5bX19yLT5fTV9kZXB0aCAtIDJdKTsgfQorCisgICAgICAvLyBBc3N1bWVzIHRoZSByZXN1bHQgaXMgbm90IGVtcHR5LgorICAgICAgc3RhdGljIF9Sb3BlUmVwKgorICAgICAgX1NfY29uY2F0X2FuZF9zZXRfYmFsYW5jZWQoX1JvcGVSZXAqIF9fbGVmdCwgX1JvcGVSZXAqIF9fcmlnaHQpCisgICAgICB7CisJX1JvcGVSZXAqIF9fcmVzdWx0ID0gX1NfY29uY2F0KF9fbGVmdCwgX19yaWdodCk7CisJaWYgKF9TX2lzX2JhbGFuY2VkKF9fcmVzdWx0KSkKKwkgIF9fcmVzdWx0LT5fTV9pc19iYWxhbmNlZCA9IHRydWU7CisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorCisgICAgICAvLyBUaGUgYmFzaWMgcmViYWxhbmNpbmcgb3BlcmF0aW9uLiAgTG9naWNhbGx5IGNvcGllcyB0aGUKKyAgICAgIC8vIHJvcGUuICBUaGUgcmVzdWx0IGhhcyByZWZjb3VudCBvZiAxLiAgVGhlIGNsaWVudCB3aWxsCisgICAgICAvLyB1c3VhbGx5IGRlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIF9fci4KKyAgICAgIC8vIFRoZSByZXN1bHQgaXMgd2l0aGluIGhlaWdodCAyIG9mIGJhbGFuY2VkIGJ5IHRoZSBhYm92ZQorICAgICAgLy8gZGVmaW5pdGlvbi4KKyAgICAgIHN0YXRpYyBfUm9wZVJlcCogX1NfYmFsYW5jZShfUm9wZVJlcCogX19yKTsKKworICAgICAgLy8gQWRkIGFsbCB1bmJhbGFuY2VkIHN1YnRyZWVzIHRvIHRoZSBmb3Jlc3Qgb2YgYmFsYW5jZWQgdHJlZXMuCisgICAgICAvLyBVc2VkIG9ubHkgYnkgYmFsYW5jZS4KKyAgICAgIHN0YXRpYyB2b2lkIF9TX2FkZF90b19mb3Jlc3QoX1JvcGVSZXAqX19yLCBfUm9wZVJlcCoqIF9fZm9yZXN0KTsKKworICAgICAgLy8gQWRkIF9fciB0byBmb3Jlc3QsIGFzc3VtaW5nIF9fciBpcyBhbHJlYWR5IGJhbGFuY2VkLgorICAgICAgc3RhdGljIHZvaWQgX1NfYWRkX2xlYWZfdG9fZm9yZXN0KF9Sb3BlUmVwKiBfX3IsIF9Sb3BlUmVwKiogX19mb3Jlc3QpOworICAgICAgCisgICAgICAvLyBQcmludCB0byBzdGRvdXQsIGV4cG9zaW5nIHN0cnVjdHVyZQorICAgICAgc3RhdGljIHZvaWQgX1NfZHVtcChfUm9wZVJlcCogX19yLCBpbnQgX19pbmRlbnQgPSAwKTsKKyAgICAgIAorICAgICAgLy8gUmV0dXJuIC0xLCAwLCBvciAxIGlmIF9feCA8IF9feSwgX194ID09IF9feSwgb3IgX194ID4gX195IHJlc3AuCisgICAgICBzdGF0aWMgaW50IF9TX2NvbXBhcmUoY29uc3QgX1JvcGVSZXAqIF9feCwgY29uc3QgX1JvcGVSZXAqIF9feSk7CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiAwID09IHRoaXMtPl9NX3RyZWVfcHRyOyB9CisgICAgICAKKyAgICAgIC8vIENvbXBhcmlzb24gbWVtYmVyIGZ1bmN0aW9uLiAgVGhpcyBpcyBwdWJsaWMgb25seSBmb3IgdGhvc2UKKyAgICAgIC8vIGNsaWVudHMgdGhhdCBuZWVkIGEgdGVybmFyeSBjb21wYXJpc29uLiAgT3RoZXJzCisgICAgICAvLyBzaG91bGQgdXNlIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBiZWxvdy4KKyAgICAgIGludAorICAgICAgY29tcGFyZShjb25zdCByb3BlJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfU19jb21wYXJlKHRoaXMtPl9NX3RyZWVfcHRyLCBfX3kuX01fdHJlZV9wdHIpOyB9CisKKyAgICAgIHJvcGUoY29uc3QgX0NoYXJUKiBfX3MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2EpCisgICAgICB7CisJdGhpcy0+X01fdHJlZV9wdHIgPQorCSAgX19TVExfUk9QRV9GUk9NX1VOT1dORURfQ0hBUl9QVFIoX19zLCBfU19jaGFyX3B0cl9sZW4oX19zKSwKKwkJCQkJICAgX01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKworICAgICAgcm9wZShjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90IF9fbGVuLAorCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2EpCisgICAgICB7CisJdGhpcy0+X01fdHJlZV9wdHIgPQorCSAgX19TVExfUk9QRV9GUk9NX1VOT1dORURfQ0hBUl9QVFIoX19zLCBfX2xlbiwgX01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKworICAgICAgLy8gU2hvdWxkIHBlcmhhcHMgYmUgdGVtcGxhdGl6ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBpdGVyYXRvciB0eXBlCisgICAgICAvLyBhbmQgdXNlIFNlcXVlbmNlX2J1ZmZlci4gIChJdCBzaG91bGQgcGVyaGFwcyB1c2Ugc2VxdWVuY2VfYnVmZmVyCisgICAgICAvLyBldmVuIG5vdy4pCisgICAgICByb3BlKGNvbnN0IF9DaGFyVCogX19zLCBjb25zdCBfQ2hhclQqIF9fZSwKKwkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeworCXRoaXMtPl9NX3RyZWVfcHRyID0KKwkgIF9fU1RMX1JPUEVfRlJPTV9VTk9XTkVEX0NIQVJfUFRSKF9fcywgX19lIC0gX19zLCBfTV9nZXRfYWxsb2NhdG9yKCkpOworICAgICAgfQorCisgICAgICByb3BlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX3MsIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2UsCisJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9TX3N1YnN0cmluZyhfX3MuX01fcm9vdCwgX19zLl9NX2N1cnJlbnRfcG9zLAorCQkJICAgX19lLl9NX2N1cnJlbnRfcG9zKSwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHJvcGUoY29uc3QgaXRlcmF0b3ImIF9fcywgY29uc3QgaXRlcmF0b3ImIF9fZSwKKwkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX1Nfc3Vic3RyaW5nKF9fcy5fTV9yb290LCBfX3MuX01fY3VycmVudF9wb3MsCisJCQkgICBfX2UuX01fY3VycmVudF9wb3MpLCBfX2EpCisgICAgICB7IH0KKworICAgICAgcm9wZShfQ2hhclQgX19jLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeworCV9DaGFyVCogX19idWYgPSB0aGlzLT5fRGF0YV9hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoMSkpOworCQorCV9NX2dldF9hbGxvY2F0b3IoKS5jb25zdHJ1Y3QoX19idWYsIF9fYyk7CisJX190cnkKKwkgIHsKKwkgICAgdGhpcy0+X01fdHJlZV9wdHIgPSBfU19uZXdfUm9wZUxlYWYoX19idWYsIDEsCisJCQkJCQlfTV9nZXRfYWxsb2NhdG9yKCkpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfUm9wZVJlcDo6X19TVExfRlJFRV9TVFJJTkcoX19idWYsIDEsIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorCisgICAgICByb3BlKHNpemVfdCBfX24sIF9DaGFyVCBfX2MsCisJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpOworCisgICAgICByb3BlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZSgwLCBfX2EpIHsgfQorCisgICAgICAvLyBDb25zdHJ1Y3QgYSByb3BlIGZyb20gYSBmdW5jdGlvbiB0aGF0IGNhbiBjb21wdXRlIGl0cyBtZW1iZXJzCisgICAgICByb3BlKGNoYXJfcHJvZHVjZXI8X0NoYXJUPiAqX19mbiwgc2l6ZV90IF9fbGVuLCBib29sIF9fZGVsZXRlX2ZuLAorCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2EpCisgICAgICB7CisJdGhpcy0+X01fdHJlZV9wdHIgPSAoMCA9PSBfX2xlbikgPworCSAgMCA6IF9TX25ld19Sb3BlRnVuY3Rpb24oX19mbiwgX19sZW4sIF9fZGVsZXRlX2ZuLCBfX2EpOworICAgICAgfQorCisgICAgICByb3BlKGNvbnN0IHJvcGUmIF9feCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9feC5fTV90cmVlX3B0ciwgX19hKQorICAgICAgeyBfU19yZWYodGhpcy0+X01fdHJlZV9wdHIpOyB9CisKKyAgICAgIH5yb3BlKCkgdGhyb3coKQorICAgICAgeyBfU191bnJlZih0aGlzLT5fTV90cmVlX3B0cik7IH0KKworICAgICAgcm9wZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCByb3BlJiBfX3gpCisgICAgICB7CisJX1JvcGVSZXAqIF9fb2xkID0gdGhpcy0+X01fdHJlZV9wdHI7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfX3guX01fdHJlZV9wdHI7CisJX1NfcmVmKHRoaXMtPl9NX3RyZWVfcHRyKTsKKwlfU191bnJlZihfX29sZCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7CisJX1NfdW5yZWYodGhpcy0+X01fdHJlZV9wdHIpOworCXRoaXMtPl9NX3RyZWVfcHRyID0gMDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKF9DaGFyVCBfX3gpCisgICAgICB7CisJX1JvcGVSZXAqIF9fb2xkID0gdGhpcy0+X01fdHJlZV9wdHI7CisJdGhpcy0+X01fdHJlZV9wdHIKKwkgID0gX1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcih0aGlzLT5fTV90cmVlX3B0ciwgJl9feCwgMSk7CisJX1NfdW5yZWYoX19vbGQpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBwb3BfYmFjaygpCisgICAgICB7CisJX1JvcGVSZXAqIF9fb2xkID0gdGhpcy0+X01fdHJlZV9wdHI7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfU19zdWJzdHJpbmcodGhpcy0+X01fdHJlZV9wdHIsCisJCQkJCSAwLCB0aGlzLT5fTV90cmVlX3B0ci0+X01fc2l6ZSAtIDEpOworCV9TX3VucmVmKF9fb2xkKTsKKyAgICAgIH0KKworICAgICAgX0NoYXJUCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9TX2ZldGNoKHRoaXMtPl9NX3RyZWVfcHRyLCB0aGlzLT5fTV90cmVlX3B0ci0+X01fc2l6ZSAtIDEpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoX0NoYXJUIF9feCkKKyAgICAgIHsKKwlfUm9wZVJlcCogX19vbGQgPSB0aGlzLT5fTV90cmVlX3B0cjsKKwlfUm9wZVJlcCogX19sZWZ0ID0KKwkgIF9fU1RMX1JPUEVfRlJPTV9VTk9XTkVEX0NIQVJfUFRSKCZfX3gsIDEsIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJX190cnkKKwkgIHsKKwkgICAgdGhpcy0+X01fdHJlZV9wdHIgPSBfU19jb25jYXQoX19sZWZ0LCB0aGlzLT5fTV90cmVlX3B0cik7CisJICAgIF9TX3VucmVmKF9fb2xkKTsKKwkgICAgX1NfdW5yZWYoX19sZWZ0KTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX1NfdW5yZWYoX19sZWZ0KTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHBvcF9mcm9udCgpCisgICAgICB7CisJX1JvcGVSZXAqIF9fb2xkID0gdGhpcy0+X01fdHJlZV9wdHI7CisJdGhpcy0+X01fdHJlZV9wdHIKKwkgID0gX1Nfc3Vic3RyaW5nKHRoaXMtPl9NX3RyZWVfcHRyLCAxLCB0aGlzLT5fTV90cmVlX3B0ci0+X01fc2l6ZSk7CisJX1NfdW5yZWYoX19vbGQpOworICAgICAgfQorCisgICAgICBfQ2hhclQKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9TX2ZldGNoKHRoaXMtPl9NX3RyZWVfcHRyLCAwKTsgfQorCisgICAgICB2b2lkCisgICAgICBiYWxhbmNlKCkKKyAgICAgIHsKKwlfUm9wZVJlcCogX19vbGQgPSB0aGlzLT5fTV90cmVlX3B0cjsKKwl0aGlzLT5fTV90cmVlX3B0ciA9IF9TX2JhbGFuY2UodGhpcy0+X01fdHJlZV9wdHIpOworCV9TX3VucmVmKF9fb2xkKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY29weShfQ2hhclQqIF9fYnVmZmVyKSBjb25zdAorICAgICAgeworCV9EZXN0cm95X2NvbnN0KF9fYnVmZmVyLCBfX2J1ZmZlciArIHNpemUoKSwgX01fZ2V0X2FsbG9jYXRvcigpKTsKKwlfU19mbGF0dGVuKHRoaXMtPl9NX3RyZWVfcHRyLCBfX2J1ZmZlcik7CisgICAgICB9CisKKyAgICAgIC8vIFRoaXMgaXMgdGhlIGNvcHkgZnVuY3Rpb24gZnJvbSB0aGUgc3RhbmRhcmQsIGJ1dAorICAgICAgLy8gd2l0aCB0aGUgYXJndW1lbnRzIHJlb3JkZXJlZCB0byBtYWtlIGl0IGNvbnNpc3RlbnQgd2l0aCB0aGUKKyAgICAgIC8vIHJlc3Qgb2YgdGhlIGludGVyZmFjZS4KKyAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGd1YXJhbnRlZWQgbm90IHRvIGNvbXBpbGUgaWYgdGhlIGRyYWZ0IHN0YW5kYXJkCisgICAgICAvLyBvcmRlciBpcyBhc3N1bWVkLgorICAgICAgc2l6ZV90eXBlCisgICAgICBjb3B5KHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgX0NoYXJUKiBfX2J1ZmZlcikgY29uc3QKKyAgICAgIHsKKwlzaXplX3QgX19zaXplID0gc2l6ZSgpOworCXNpemVfdCBfX2xlbiA9IChfX3BvcyArIF9fbiA+IF9fc2l6ZT8gX19zaXplIC0gX19wb3MgOiBfX24pOworCisJX0Rlc3Ryb3lfY29uc3QoX19idWZmZXIsIF9fYnVmZmVyICsgX19sZW4sIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJX1NfZmxhdHRlbih0aGlzLT5fTV90cmVlX3B0ciwgX19wb3MsIF9fbGVuLCBfX2J1ZmZlcik7CisJcmV0dXJuIF9fbGVuOworICAgICAgfQorCisgICAgICAvLyBQcmludCB0byBzdGRvdXQsIGV4cG9zaW5nIHN0cnVjdHVyZS4gIE1heSBiZSB1c2VmdWwgZm9yCisgICAgICAvLyBwZXJmb3JtYW5jZSBkZWJ1Z2dpbmcuCisgICAgICB2b2lkCisgICAgICBkdW1wKCkKKyAgICAgIHsgX1NfZHVtcCh0aGlzLT5fTV90cmVlX3B0cik7IH0KKyAgICAgIAorICAgICAgLy8gQ29udmVydCB0byAwIHRlcm1pbmF0ZWQgc3RyaW5nIGluIG5ldyBhbGxvY2F0ZWQgbWVtb3J5LgorICAgICAgLy8gRW1iZWRkZWQgMHMgaW4gdGhlIGlucHV0IGRvIG5vdCB0ZXJtaW5hdGUgdGhlIGNvcHkuCisgICAgICBjb25zdCBfQ2hhclQqIGNfc3RyKCkgY29uc3Q7CisKKyAgICAgIC8vIEFzIGFib3ZlLCBidXQgYWxzbyB1c2UgdGhlIGZsYXR0ZW5lZCByZXByZXNlbnRhdGlvbiBhcworICAgICAgLy8gdGhlIG5ldyByb3BlIHJlcHJlc2VudGF0aW9uLgorICAgICAgY29uc3QgX0NoYXJUKiByZXBsYWNlX3dpdGhfY19zdHIoKTsKKyAgICAgIAorICAgICAgLy8gUmVjbGFpbSBtZW1vcnkgZm9yIHRoZSBjX3N0ciBnZW5lcmF0ZWQgZmxhdHRlbmVkIHN0cmluZy4KKyAgICAgIC8vIEludGVudGlvbmFsbHkgdW5kb2N1bWVudGVkLCBzaW5jZSBpdCdzIGhhcmQgdG8gc2F5IHdoZW4gdGhpcworICAgICAgLy8gaXMgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcy4KKyAgICAgIHZvaWQKKyAgICAgIGRlbGV0ZV9jX3N0ciAoKQorICAgICAgeworCWlmICgwID09IHRoaXMtPl9NX3RyZWVfcHRyKQorCSAgcmV0dXJuOworCWlmIChfX2RldGFpbDo6X1NfbGVhZiA9PSB0aGlzLT5fTV90cmVlX3B0ci0+X01fdGFnICYmCisJICAgICgoX1JvcGVMZWFmKil0aGlzLT5fTV90cmVlX3B0ciktPl9NX2RhdGEgPT0KKwkgICAgdGhpcy0+X01fdHJlZV9wdHItPl9NX2Nfc3RyaW5nKQorCSAgeworCSAgICAvLyBSZXByZXNlbnRhdGlvbiBzaGFyZWQKKwkgICAgcmV0dXJuOworCSAgfQorI2lmbmRlZiBfX0dDCisJdGhpcy0+X01fdHJlZV9wdHItPl9NX2ZyZWVfY19zdHJpbmcoKTsKKyNlbmRpZgorCXRoaXMtPl9NX3RyZWVfcHRyLT5fTV9jX3N0cmluZyA9IDA7CisgICAgICB9CisKKyAgICAgIF9DaGFyVAorICAgICAgb3BlcmF0b3JbXSAoc2l6ZV90eXBlIF9fcG9zKSBjb25zdAorICAgICAgeyByZXR1cm4gX1NfZmV0Y2godGhpcy0+X01fdHJlZV9wdHIsIF9fcG9zKTsgfQorCisgICAgICBfQ2hhclQKKyAgICAgIGF0KHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICAgIHsKKwkvLyBpZiAoX19wb3MgPj0gc2l6ZSgpKSB0aHJvdyBvdXRfb2ZfcmFuZ2U7ICAvLyBYWFgKKwlyZXR1cm4gKCp0aGlzKVtfX3Bvc107CisgICAgICB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybihjb25zdF9pdGVyYXRvcih0aGlzLT5fTV90cmVlX3B0ciwgMCkpOyB9CisKKyAgICAgIC8vIEFuIGVhc3kgd2F5IHRvIGdldCBhIGNvbnN0IGl0ZXJhdG9yIGZyb20gYSBub24tY29uc3QgY29udGFpbmVyLgorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNvbnN0X2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuKGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX3RyZWVfcHRyLCAwKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybihjb25zdF9pdGVyYXRvcih0aGlzLT5fTV90cmVlX3B0ciwgc2l6ZSgpKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNvbnN0X2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybihjb25zdF9pdGVyYXRvcih0aGlzLT5fTV90cmVlX3B0ciwgc2l6ZSgpKSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsJcmV0dXJuKDAgPT0gdGhpcy0+X01fdHJlZV9wdHI/IDAgOiB0aGlzLT5fTV90cmVlX3B0ci0+X01fc2l6ZSk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBsZW5ndGgoKSBjb25zdAorICAgICAgewlyZXR1cm4gc2l6ZSgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeworCXJldHVybiBfU19taW5fbGVuW2ludChfX2RldGFpbDo6X1NfbWF4X3JvcGVfZGVwdGgpIC0gMV0gLSAxOworCS8vICBHdWFyYW50ZWVzIHRoYXQgdGhlIHJlc3VsdCBjYW4gYmUgc3VmZmljaWVudGx5CisJLy8gIGJhbGFuY2VkLiAgTG9uZ2VyIHJvcGVzIHdpbGwgcHJvYmFibHkgc3RpbGwgd29yaywKKwkvLyAgYnV0IGl0J3MgaGFyZGVyIHRvIG1ha2UgZ3VhcmFudGVlcy4KKyAgICAgIH0KKworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjb25zdF9yYmVnaW4oKSBjb25zdAorICAgICAgewlyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgICAgICAKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNvbnN0X3JlbmQoKSBjb25zdAorICAgICAgewlyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgcm9wZTxfQ2hhclQyLCBfQWxsb2MyPgorICAgICAgICBvcGVyYXRvcisoY29uc3Qgcm9wZTxfQ2hhclQyLCBfQWxsb2MyPiYgX19sZWZ0LAorCQkgIGNvbnN0IHJvcGU8X0NoYXJUMiwgX0FsbG9jMj4mIF9fcmlnaHQpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgcm9wZTxfQ2hhclQyLCBfQWxsb2MyPgorICAgICAgICBvcGVyYXRvcisoY29uc3Qgcm9wZTxfQ2hhclQyLCBfQWxsb2MyPiYgX19sZWZ0LCBjb25zdCBfQ2hhclQyKiBfX3JpZ2h0KTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIHJvcGU8X0NoYXJUMiwgX0FsbG9jMj4KKyAgICAgICAgb3BlcmF0b3IrKGNvbnN0IHJvcGU8X0NoYXJUMiwgX0FsbG9jMj4mIF9fbGVmdCwgX0NoYXJUMiBfX3JpZ2h0KTsKKworICAgICAgLy8gVGhlIHN5bW1ldHJpYyBjYXNlcyBhcmUgaW50ZW50aW9uYWxseSBvbWl0dGVkLCBzaW5jZSB0aGV5J3JlCisgICAgICAvLyBwcmVzdW1lZCB0byBiZSBsZXNzIGNvbW1vbiwgYW5kIHdlIGRvbid0IGhhbmRsZSB0aGVtIGFzIHdlbGwuCisKKyAgICAgIC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIHJlYWxseSBiZSB0ZW1wbGF0aXplZC4gIFRoZSBmaXJzdAorICAgICAgLy8gYXJndW1lbnQgc2hvdWxkIGJlIGFuIGlucHV0IGl0ZXJhdG9yIG9yIGZvcndhcmQgaXRlcmF0b3Igd2l0aAorICAgICAgLy8gdmFsdWVfdHlwZSBfQ2hhclQuCisgICAgICByb3BlJgorICAgICAgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19pdGVyLCBzaXplX3QgX19uKQorICAgICAgeworCV9Sb3BlUmVwKiBfX3Jlc3VsdCA9CisJICBfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKHRoaXMtPl9NX3RyZWVfcHRyLCBfX2l0ZXIsIF9fbik7CisJX1NfdW5yZWYodGhpcy0+X01fdHJlZV9wdHIpOworCXRoaXMtPl9NX3RyZWVfcHRyID0gX19yZXN1bHQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICByb3BlJgorICAgICAgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19jX3N0cmluZykKKyAgICAgIHsKKwlzaXplX3QgX19sZW4gPSBfU19jaGFyX3B0cl9sZW4oX19jX3N0cmluZyk7CisJYXBwZW5kKF9fY19zdHJpbmcsIF9fbGVuKTsKKwlyZXR1cm4oKnRoaXMpOworICAgICAgfQorCisgICAgICByb3BlJgorICAgICAgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zLCBjb25zdCBfQ2hhclQqIF9fZSkKKyAgICAgIHsKKwlfUm9wZVJlcCogX19yZXN1bHQgPQorCSAgX1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcih0aGlzLT5fTV90cmVlX3B0ciwgX19zLCBfX2UgLSBfX3MpOworCV9TX3VucmVmKHRoaXMtPl9NX3RyZWVfcHRyKTsKKwl0aGlzLT5fTV90cmVlX3B0ciA9IF9fcmVzdWx0OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcm9wZSYKKyAgICAgIGFwcGVuZChjb25zdF9pdGVyYXRvciBfX3MsIGNvbnN0X2l0ZXJhdG9yIF9fZSkKKyAgICAgIHsKKwlfU2VsZl9kZXN0cnVjdF9wdHIgX19hcHBlbmRlZShfU19zdWJzdHJpbmcoX19zLl9NX3Jvb3QsCisJCQkJCQkgICBfX3MuX01fY3VycmVudF9wb3MsCisJCQkJCQkgICBfX2UuX01fY3VycmVudF9wb3MpKTsKKwlfUm9wZVJlcCogX19yZXN1bHQgPSBfU19jb25jYXQodGhpcy0+X01fdHJlZV9wdHIsIAorCQkJCSAgICAgICAoX1JvcGVSZXAqKV9fYXBwZW5kZWUpOworCV9TX3VucmVmKHRoaXMtPl9NX3RyZWVfcHRyKTsKKwl0aGlzLT5fTV90cmVlX3B0ciA9IF9fcmVzdWx0OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcm9wZSYKKyAgICAgIGFwcGVuZChfQ2hhclQgX19jKQorICAgICAgeworCV9Sb3BlUmVwKiBfX3Jlc3VsdCA9CisJICBfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKHRoaXMtPl9NX3RyZWVfcHRyLCAmX19jLCAxKTsKKwlfU191bnJlZih0aGlzLT5fTV90cmVlX3B0cik7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfX3Jlc3VsdDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHJvcGUmCisgICAgICBhcHBlbmQoKQorICAgICAgeyByZXR1cm4gYXBwZW5kKF9DaGFyVCgpKTsgfSAgLy8gWFhYIHdoeT8KKworICAgICAgcm9wZSYKKyAgICAgIGFwcGVuZChjb25zdCByb3BlJiBfX3kpCisgICAgICB7CisJX1JvcGVSZXAqIF9fcmVzdWx0ID0gX1NfY29uY2F0KHRoaXMtPl9NX3RyZWVfcHRyLCBfX3kuX01fdHJlZV9wdHIpOworCV9TX3VucmVmKHRoaXMtPl9NX3RyZWVfcHRyKTsKKwl0aGlzLT5fTV90cmVlX3B0ciA9IF9fcmVzdWx0OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcm9wZSYKKyAgICAgIGFwcGVuZChzaXplX3QgX19uLCBfQ2hhclQgX19jKQorICAgICAgeworCXJvcGU8X0NoYXJULF9BbGxvYz4gX19sYXN0KF9fbiwgX19jKTsKKwlyZXR1cm4gYXBwZW5kKF9fbGFzdCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAocm9wZSYgX19iKQorICAgICAgeworCV9Sb3BlUmVwKiBfX3RtcCA9IHRoaXMtPl9NX3RyZWVfcHRyOworCXRoaXMtPl9NX3RyZWVfcHRyID0gX19iLl9NX3RyZWVfcHRyOworCV9fYi5fTV90cmVlX3B0ciA9IF9fdG1wOworICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gUmVzdWx0IGlzIGluY2x1ZGVkIGluIHJlZmNvdW50LgorICAgICAgc3RhdGljIF9Sb3BlUmVwKgorICAgICAgcmVwbGFjZShfUm9wZVJlcCogX19vbGQsIHNpemVfdCBfX3BvczEsCisJICAgICAgc2l6ZV90IF9fcG9zMiwgX1JvcGVSZXAqIF9fcikKKyAgICAgIHsKKwlpZiAoMCA9PSBfX29sZCkKKwkgIHsKKwkgICAgX1NfcmVmKF9fcik7CisJICAgIHJldHVybiBfX3I7CisJICB9CisJX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdChfU19zdWJzdHJpbmcoX19vbGQsIDAsIF9fcG9zMSkpOworCV9TZWxmX2Rlc3RydWN0X3B0ciBfX3JpZ2h0KF9TX3N1YnN0cmluZyhfX29sZCwgX19wb3MyLCBfX29sZC0+X01fc2l6ZSkpOworCV9Sb3BlUmVwKiBfX3Jlc3VsdDsKKworCWlmICgwID09IF9fcikKKwkgIF9fcmVzdWx0ID0gX1NfY29uY2F0KF9fbGVmdCwgX19yaWdodCk7CisJZWxzZQorCSAgeworCSAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19sZWZ0X3Jlc3VsdChfU19jb25jYXQoX19sZWZ0LCBfX3IpKTsKKwkgICAgX19yZXN1bHQgPSBfU19jb25jYXQoX19sZWZ0X3Jlc3VsdCwgX19yaWdodCk7CisJICB9CisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHNpemVfdCBfX3AsIGNvbnN0IHJvcGUmIF9fcikKKyAgICAgIHsKKwlfUm9wZVJlcCogX19yZXN1bHQgPQorCSAgcmVwbGFjZSh0aGlzLT5fTV90cmVlX3B0ciwgX19wLCBfX3AsIF9fci5fTV90cmVlX3B0cik7CisJX1NfdW5yZWYodGhpcy0+X01fdHJlZV9wdHIpOworCXRoaXMtPl9NX3RyZWVfcHRyID0gX19yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzaXplX3QgX19wLCBzaXplX3QgX19uLCBfQ2hhclQgX19jKQorICAgICAgeworCXJvcGU8X0NoYXJULF9BbGxvYz4gX19yKF9fbixfX2MpOworCWluc2VydChfX3AsIF9fcik7CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlfU2VsZl9kZXN0cnVjdF9wdHIgX19sZWZ0KF9TX3N1YnN0cmluZyh0aGlzLT5fTV90cmVlX3B0ciwgMCwgX19wKSk7CisJX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fcmlnaHQoX1Nfc3Vic3RyaW5nKHRoaXMtPl9NX3RyZWVfcHRyLAorCQkJCQkJX19wLCBzaXplKCkpKTsKKwlfU2VsZl9kZXN0cnVjdF9wdHIgX19sZWZ0X3Jlc3VsdChfU19jb25jYXRfY2hhcl9pdGVyKF9fbGVmdCwgX19pLCBfX24pKTsKKwkvLyBfU18gZGVzdHJfY29uY2F0X2NoYXJfaXRlciBzaG91bGQgYmUgc2FmZSBoZXJlLgorCS8vIEJ1dCBhcyBpdCBzdGFuZHMgaXQncyBwcm9iYWJseSBub3QgYSB3aW4sIHNpbmNlIF9fbGVmdAorCS8vIGlzIGxpa2VseSB0byBoYXZlIGFkZGl0aW9uYWwgcmVmZXJlbmNlcy4KKwlfUm9wZVJlcCogX19yZXN1bHQgPSBfU19jb25jYXQoX19sZWZ0X3Jlc3VsdCwgX19yaWdodCk7CisJX1NfdW5yZWYodGhpcy0+X01fdHJlZV9wdHIpOworCXRoaXMtPl9NX3RyZWVfcHRyID0gX19yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9fY19zdHJpbmcpCisgICAgICB7CWluc2VydChfX3AsIF9fY19zdHJpbmcsIF9TX2NoYXJfcHRyX2xlbihfX2Nfc3RyaW5nKSk7IH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHNpemVfdCBfX3AsIF9DaGFyVCBfX2MpCisgICAgICB7IGluc2VydChfX3AsICZfX2MsIDEpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzaXplX3QgX19wKQorICAgICAgeworCV9DaGFyVCBfX2MgPSBfQ2hhclQoKTsKKwlpbnNlcnQoX19wLCAmX19jLCAxKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHNpemVfdCBfX3AsIGNvbnN0IF9DaGFyVCogX19pLCBjb25zdCBfQ2hhclQqIF9faikKKyAgICAgIHsKKwlyb3BlIF9fcihfX2ksIF9faik7CisJaW5zZXJ0KF9fcCwgX19yKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHNpemVfdCBfX3AsIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2ksCisJICAgICBjb25zdCBjb25zdF9pdGVyYXRvciYgX19qKQorICAgICAgeworCXJvcGUgX19yKF9faSwgX19qKTsKKwlpbnNlcnQoX19wLCBfX3IpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc2l6ZV90IF9fcCwgY29uc3QgaXRlcmF0b3ImIF9faSwKKwkgICAgIGNvbnN0IGl0ZXJhdG9yJiBfX2opCisgICAgICB7CisJcm9wZSBfX3IoX19pLCBfX2opOworCWluc2VydChfX3AsIF9fcik7CisgICAgICB9CisKKyAgICAgIC8vIChwb3NpdGlvbiwgbGVuZ3RoKSB2ZXJzaW9ucyBvZiByZXBsYWNlIG9wZXJhdGlvbnM6CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwgY29uc3Qgcm9wZSYgX19yKQorICAgICAgeworCV9Sb3BlUmVwKiBfX3Jlc3VsdCA9CisJICByZXBsYWNlKHRoaXMtPl9NX3RyZWVfcHRyLCBfX3AsIF9fcCArIF9fbiwgX19yLl9NX3RyZWVfcHRyKTsKKwlfU191bnJlZih0aGlzLT5fTV90cmVlX3B0cik7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfX3Jlc3VsdDsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVwbGFjZShzaXplX3QgX19wLCBzaXplX3QgX19uLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19pLCBzaXplX3QgX19pX2xlbikKKyAgICAgIHsKKwlyb3BlIF9fcihfX2ksIF9faV9sZW4pOworCXJlcGxhY2UoX19wLCBfX24sIF9fcik7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwgX0NoYXJUIF9fYykKKyAgICAgIHsKKwlyb3BlIF9fcihfX2MpOworCXJlcGxhY2UoX19wLCBfX24sIF9fcik7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKQorICAgICAgeworCXJvcGUgX19yKF9fY19zdHJpbmcpOworCXJlcGxhY2UoX19wLCBfX24sIF9fcik7CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwKKwkgICAgICBjb25zdCBfQ2hhclQqIF9faSwgY29uc3QgX0NoYXJUKiBfX2opCisgICAgICB7CisJcm9wZSBfX3IoX19pLCBfX2opOworCXJlcGxhY2UoX19wLCBfX24sIF9fcik7CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwKKwkgICAgICBjb25zdCBjb25zdF9pdGVyYXRvciYgX19pLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19qKQorICAgICAgeworCXJvcGUgX19yKF9faSwgX19qKTsKKwlyZXBsYWNlKF9fcCwgX19uLCBfX3IpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sCisJICAgICAgY29uc3QgaXRlcmF0b3ImIF9faSwgY29uc3QgaXRlcmF0b3ImIF9faikKKyAgICAgIHsKKwlyb3BlIF9fcihfX2ksIF9faik7CisJcmVwbGFjZShfX3AsIF9fbiwgX19yKTsKKyAgICAgIH0KKworICAgICAgLy8gU2luZ2xlIGNoYXJhY3RlciB2YXJpYW50czoKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgX0NoYXJUIF9fYykKKyAgICAgIHsKKwlpdGVyYXRvciBfX2kodGhpcywgX19wKTsKKwkqX19pID0gX19jOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKHNpemVfdCBfX3AsIGNvbnN0IHJvcGUmIF9fcikKKyAgICAgIHsgcmVwbGFjZShfX3AsIDEsIF9fcik7IH0KKworICAgICAgdm9pZAorICAgICAgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9faV9sZW4pCisgICAgICB7IHJlcGxhY2UoX19wLCAxLCBfX2ksIF9faV9sZW4pOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKQorICAgICAgewlyZXBsYWNlKF9fcCwgMSwgX19jX3N0cmluZyk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgY29uc3QgX0NoYXJUKiBfX2opCisgICAgICB7CXJlcGxhY2UoX19wLCAxLCBfX2ksIF9faik7IH0KKworICAgICAgdm9pZAorICAgICAgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19pLAorCSAgICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2opCisgICAgICB7IHJlcGxhY2UoX19wLCAxLCBfX2ksIF9faik7IH0KKworICAgICAgdm9pZAorICAgICAgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBpdGVyYXRvciYgX19pLAorCSAgICAgIGNvbnN0IGl0ZXJhdG9yJiBfX2opCisgICAgICB7IHJlcGxhY2UoX19wLCAxLCBfX2ksIF9faik7IH0KKworICAgICAgLy8gRXJhc2UsIChwb3NpdGlvbiwgc2l6ZSkgdmFyaWFudC4KKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24pCisgICAgICB7CisJX1JvcGVSZXAqIF9fcmVzdWx0ID0gcmVwbGFjZSh0aGlzLT5fTV90cmVlX3B0ciwgX19wLAorCQkJCSAgICAgX19wICsgX19uLCAwKTsKKwlfU191bnJlZih0aGlzLT5fTV90cmVlX3B0cik7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfX3Jlc3VsdDsKKyAgICAgIH0KKworICAgICAgLy8gRXJhc2UsIHNpbmdsZSBjaGFyYWN0ZXIKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKHNpemVfdCBfX3ApCisgICAgICB7IGVyYXNlKF9fcCwgX19wICsgMSk7IH0KKworICAgICAgLy8gSW5zZXJ0LCBpdGVyYXRvciB2YXJpYW50cy4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3Qgcm9wZSYgX19yKQorICAgICAgeworCWluc2VydChfX3AuaW5kZXgoKSwgX19yKTsKKwlyZXR1cm4gX19wOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIHNpemVfdCBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpLCBfX24sIF9fYyk7CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIF9DaGFyVCBfX2MpCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpLCBfX2MpOworCXJldHVybiBfX3A7CisgICAgICB9CisgICAgICAKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCApCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpKTsKKwlyZXR1cm4gX19wOworICAgICAgfQorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9DaGFyVCogY19zdHJpbmcpCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpLCBjX3N0cmluZyk7CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlpbnNlcnQoX19wLmluZGV4KCksIF9faSwgX19uKTsKKwlyZXR1cm4gX19wOworICAgICAgfQorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9DaGFyVCogX19pLAorCSAgICAgY29uc3QgX0NoYXJUKiBfX2opCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpLCBfX2ksIF9faik7IAorCXJldHVybiBfX3A7CisgICAgICB9CisgICAgICAKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwKKwkgICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2ksIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2opCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpLCBfX2ksIF9faik7CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLAorCSAgICAgY29uc3QgaXRlcmF0b3ImIF9faSwgY29uc3QgaXRlcmF0b3ImIF9faikKKyAgICAgIHsKKwlpbnNlcnQoX19wLmluZGV4KCksIF9faSwgX19qKTsKKwlyZXR1cm4gX19wOworICAgICAgfQorCisgICAgICAvLyBSZXBsYWNlLCByYW5nZSB2YXJpYW50cy4KKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgaXRlcmF0b3ImIF9fcSwgY29uc3Qgcm9wZSYgX19yKQorICAgICAgewlyZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX3IpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgaXRlcmF0b3ImIF9fcSwgX0NoYXJUIF9fYykKKyAgICAgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19jKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX2Nfc3RyaW5nKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX2ksIHNpemVfdCBfX24pCisgICAgICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcS5pbmRleCgpIC0gX19wLmluZGV4KCksIF9faSwgX19uKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX2ksIGNvbnN0IF9DaGFyVCogX19qKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX2ksIF9faik7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xLAorCSAgICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2ksIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2opCisgICAgICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcS5pbmRleCgpIC0gX19wLmluZGV4KCksIF9faSwgX19qKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisJICAgICAgY29uc3QgaXRlcmF0b3ImIF9faSwgY29uc3QgaXRlcmF0b3ImIF9faikKKyAgICAgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19pLCBfX2opOyB9CisKKyAgICAgIC8vIFJlcGxhY2UsIGl0ZXJhdG9yIHZhcmlhbnRzLgorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCByb3BlJiBfX3IpCisgICAgICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcik7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBfQ2hhclQgX19jKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2MpOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2Nfc3RyaW5nKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9DaGFyVCogX19pLCBzaXplX3QgX19uKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2ksIF9fbik7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgY29uc3QgX0NoYXJUKiBfX2opCisgICAgICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9faSwgX19qKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0X2l0ZXJhdG9yIF9faSwgY29uc3RfaXRlcmF0b3IgX19qKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2ksIF9faik7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBpdGVyYXRvciBfX2ksIGl0ZXJhdG9yIF9faikKKyAgICAgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19pLCBfX2opOyB9CisKKyAgICAgIC8vIEl0ZXJhdG9yIGFuZCByYW5nZSB2YXJpYW50cyBvZiBlcmFzZQorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EpCisgICAgICB7CisJc2l6ZV90IF9fcF9pbmRleCA9IF9fcC5pbmRleCgpOworCWVyYXNlKF9fcF9pbmRleCwgX19xLmluZGV4KCkgLSBfX3BfaW5kZXgpOworCXJldHVybiBpdGVyYXRvcih0aGlzLCBfX3BfaW5kZXgpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3QgaXRlcmF0b3ImIF9fcCkKKyAgICAgIHsKKwlzaXplX3QgX19wX2luZGV4ID0gX19wLmluZGV4KCk7CisJZXJhc2UoX19wX2luZGV4LCAxKTsKKwlyZXR1cm4gaXRlcmF0b3IodGhpcywgX19wX2luZGV4KTsKKyAgICAgIH0KKworICAgICAgcm9wZQorICAgICAgc3Vic3RyKHNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19sZW4gPSAxKSBjb25zdAorICAgICAgeworCXJldHVybiByb3BlPF9DaGFyVCwgX0FsbG9jPihfU19zdWJzdHJpbmcodGhpcy0+X01fdHJlZV9wdHIsCisJCQkJCQkgX19zdGFydCwKKwkJCQkJCSBfX3N0YXJ0ICsgX19sZW4pKTsKKyAgICAgIH0KKworICAgICAgcm9wZQorICAgICAgc3Vic3RyKGl0ZXJhdG9yIF9fc3RhcnQsIGl0ZXJhdG9yIF9fZW5kKSBjb25zdAorICAgICAgeworCXJldHVybiByb3BlPF9DaGFyVCwgX0FsbG9jPihfU19zdWJzdHJpbmcodGhpcy0+X01fdHJlZV9wdHIsCisJCQkJCQkgX19zdGFydC5pbmRleCgpLAorCQkJCQkJIF9fZW5kLmluZGV4KCkpKTsKKyAgICAgIH0KKworICAgICAgcm9wZQorICAgICAgc3Vic3RyKGl0ZXJhdG9yIF9fc3RhcnQpIGNvbnN0CisgICAgICB7CisJc2l6ZV90IF9fcG9zID0gX19zdGFydC5pbmRleCgpOworCXJldHVybiByb3BlPF9DaGFyVCwgX0FsbG9jPihfU19zdWJzdHJpbmcodGhpcy0+X01fdHJlZV9wdHIsCisJCQkJCQkgX19wb3MsIF9fcG9zICsgMSkpOworICAgICAgfQorCisgICAgICByb3BlCisgICAgICBzdWJzdHIoY29uc3RfaXRlcmF0b3IgX19zdGFydCwgY29uc3RfaXRlcmF0b3IgX19lbmQpIGNvbnN0CisgICAgICB7CisJLy8gVGhpcyBtaWdodCBldmVudHVhbGx5IHRha2UgYWR2YW50YWdlIG9mIHRoZSBjYWNoZSBpbiB0aGUKKwkvLyBpdGVyYXRvci4KKwlyZXR1cm4gcm9wZTxfQ2hhclQsIF9BbGxvYz4oX1Nfc3Vic3RyaW5nKHRoaXMtPl9NX3RyZWVfcHRyLAorCQkJCQkJIF9fc3RhcnQuaW5kZXgoKSwKKwkJCQkJCSBfX2VuZC5pbmRleCgpKSk7CisgICAgICB9CisKKyAgICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgICBzdWJzdHIoY29uc3RfaXRlcmF0b3IgX19zdGFydCkKKyAgICAgIHsKKwlzaXplX3QgX19wb3MgPSBfX3N0YXJ0LmluZGV4KCk7CisJcmV0dXJuIHJvcGU8X0NoYXJULCBfQWxsb2M+KF9TX3N1YnN0cmluZyh0aGlzLT5fTV90cmVlX3B0ciwKKwkJCQkJCSBfX3BvcywgX19wb3MgKyAxKSk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBzaXplX3R5cGUgbnBvczsKKworICAgICAgc2l6ZV90eXBlIGZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3Q7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIHsKKwlzaXplX3R5cGUgX19yZXN1bHRfcG9zOworCWNvbnN0X2l0ZXJhdG9yIF9fcmVzdWx0ID0KKwkgIHN0ZDo6c2VhcmNoKGNvbnN0X2JlZ2luKCkgKyBfX3BvcywgY29uc3RfZW5kKCksCisJCSAgICAgIF9fcywgX19zICsgX1NfY2hhcl9wdHJfbGVuKF9fcykpOworCV9fcmVzdWx0X3BvcyA9IF9fcmVzdWx0LmluZGV4KCk7CisjaWZuZGVmIF9fU1RMX09MRF9ST1BFX1NFTUFOVElDUworCWlmIChfX3Jlc3VsdF9wb3MgPT0gc2l6ZSgpKQorCSAgX19yZXN1bHRfcG9zID0gbnBvczsKKyNlbmRpZgorCXJldHVybiBfX3Jlc3VsdF9wb3M7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBtdXRhYmxlX2JlZ2luKCkKKyAgICAgIHsgcmV0dXJuKGl0ZXJhdG9yKHRoaXMsIDApKTsgfQorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgbXV0YWJsZV9lbmQoKQorICAgICAgeyByZXR1cm4oaXRlcmF0b3IodGhpcywgc2l6ZSgpKSk7IH0KKworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3I7CisgICAgICAKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIG11dGFibGVfcmJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IobXV0YWJsZV9lbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgbXV0YWJsZV9yZW5kKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IobXV0YWJsZV9iZWdpbigpKTsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG11dGFibGVfcmVmZXJlbmNlX2F0KHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsgcmV0dXJuIHJlZmVyZW5jZSh0aGlzLCBfX3Bvcyk7IH0KKworI2lmZGVmIF9fU1REX1NUVUZGCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsgcmV0dXJuIF9jaGFyX3JlZl9wcm94eSh0aGlzLCBfX3Bvcyk7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBhdChzaXplX3R5cGUgX19wb3MpCisgICAgICB7CisJLy8gaWYgKF9fcG9zID49IHNpemUoKSkgdGhyb3cgb3V0X29mX3JhbmdlOyAgLy8gWFhYCisJcmV0dXJuICgqdGhpcylbX19wb3NdOworICAgICAgfQorICAgICAgCisgICAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7IH0KKyAgICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX24pIHsgfQorICAgICAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSBfX3Jlc19hcmcgPSAwKSB7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBjYXBhY2l0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBtYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8vIFN0dWZmIGJlbG93IHRoaXMgbGluZSBpcyBkYW5nZXJvdXMgYmVjYXVzZSBpdCdzIGVycm9yIHByb25lLgorICAgICAgLy8gSSB3b3VsZCByZWFsbHkgbGlrZSB0byBnZXQgcmlkIG9mIGl0LgorICAgICAgLy8gY29weSBmdW5jdGlvbiB3aXRoIGZ1bm55IGFyZyBvcmRlcmluZy4KKyAgICAgIHNpemVfdHlwZQorICAgICAgY29weShfQ2hhclQqIF9fYnVmZmVyLCBzaXplX3R5cGUgX19uLAorCSAgIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgICB7IHJldHVybiBjb3B5KF9fcG9zLCBfX24sIF9fYnVmZmVyKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIG11dGFibGVfZW5kKCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIG11dGFibGVfYmVnaW4oKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkKKyAgICAgIHsgcmV0dXJuIG11dGFibGVfcmVuZCgpOyB9CisgICAgICAKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpCisgICAgICB7IHJldHVybiBtdXRhYmxlX3JiZWdpbigpOyB9CisKKyNlbHNlCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2VuZCgpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBjb25zdF9iZWdpbigpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKQorICAgICAgeyByZXR1cm4gY29uc3RfcmVuZCgpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpCisgICAgICB7IHJldHVybiBjb25zdF9yYmVnaW4oKTsgfQorCisjZW5kaWYKKyAgICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjb25zdCB0eXBlbmFtZSByb3BlPF9DaGFyVCwgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46Om5wb3MgPSAoc2l6ZV90eXBlKSgtMSk7CisgIAorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkJCSAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIChfX3guX01fY3VycmVudF9wb3MgPT0gX195Ll9NX2N1cnJlbnRfcG9zCisJICAgICAgJiYgX194Ll9NX3Jvb3QgPT0gX195Ll9NX3Jvb3QpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkJCSAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gKF9feC5fTV9jdXJyZW50X3BvcyA8IF9feS5fTV9jdXJyZW50X3Bvcyk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkJCSAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCQkJICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHB0cmRpZmZfdAorICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAocHRyZGlmZl90KV9feC5fTV9jdXJyZW50X3BvcyAtIChwdHJkaWZmX3QpX195Ll9NX2N1cnJlbnRfcG9zOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvci0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsIHB0cmRpZmZfdCBfX24pCisgICAgeyByZXR1cm4gX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+KF9feC5fTV9yb290LAorCQkJCQkJICBfX3guX01fY3VycmVudF9wb3MgLSBfX24pOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsIHB0cmRpZmZfdCBfX24pCisgICAgeyByZXR1cm4gX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+KF9feC5fTV9yb290LAorCQkJCQkJICBfX3guX01fY3VycmVudF9wb3MgKyBfX24pOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisocHRyZGlmZl90IF9fbiwgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gpCisgIHsgcmV0dXJuIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPihfX3guX01fcm9vdCwKKwkJCQkJCV9feC5fTV9jdXJyZW50X3BvcyArIF9fbik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7cmV0dXJuIChfX3guX01fY3VycmVudF9wb3MgPT0gX195Ll9NX2N1cnJlbnRfcG9zCisJICAgICAmJiBfX3guX01fcm9vdF9yb3BlID09IF9feS5fTV9yb290X3JvcGUpOyB9CisgIAorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gKF9feC5fTV9jdXJyZW50X3BvcyA8IF9feS5fTV9jdXJyZW50X3Bvcyk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgcHRyZGlmZl90CisgICAgb3BlcmF0b3ItKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICgocHRyZGlmZl90KV9feC5fTV9jdXJyZW50X3BvcworCSAgICAgIC0gKHB0cmRpZmZfdClfX3kuX01fY3VycmVudF9wb3MpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvci0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgcHRyZGlmZl90IF9fbikKKyAgICB7IHJldHVybiBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4oX194Ll9NX3Jvb3Rfcm9wZSwKKwkJCQkJICAgIF9feC5fTV9jdXJyZW50X3BvcyAtIF9fbik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwgcHRyZGlmZl90IF9fbikKKyAgICB7IHJldHVybiBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4oX194Ll9NX3Jvb3Rfcm9wZSwKKwkJCQkJICAgIF9feC5fTV9jdXJyZW50X3BvcyArIF9fbik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCkKKyAgICB7IHJldHVybiBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4oX194Ll9NX3Jvb3Rfcm9wZSwKKwkJCQkJICAgIF9feC5fTV9jdXJyZW50X3BvcyArIF9fbik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsCisJICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fcmlnaHQpCisgICAgeworICAgICAgLy8gSW5saW5pbmcgdGhpcyBzaG91bGQgbWFrZSBpdCBwb3NzaWJsZSB0byBrZWVwIF9fbGVmdCBhbmQKKyAgICAgIC8vIF9fcmlnaHQgaW4gcmVnaXN0ZXJzLgorICAgICAgdHlwZWRlZiByb3BlPF9DaGFyVCwgX0FsbG9jPiByb3BlX3R5cGU7CisgICAgICByZXR1cm4gcm9wZV90eXBlKHJvcGVfdHlwZTo6X1NfY29uY2F0KF9fbGVmdC5fTV90cmVlX3B0ciwgCisJCQkJCSAgICBfX3JpZ2h0Ll9NX3RyZWVfcHRyKSk7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgcm9wZTxfQ2hhclQsIF9BbGxvYz4mCisgICAgb3BlcmF0b3IrPShyb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19sZWZ0LAorCSAgICAgICBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19yaWdodCkKKyAgICB7CisgICAgICBfX2xlZnQuYXBwZW5kKF9fcmlnaHQpOworICAgICAgcmV0dXJuIF9fbGVmdDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSByb3BlPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19sZWZ0LAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaWdodCkKKyAgICB7CisgICAgICB0eXBlZGVmIHJvcGU8X0NoYXJULCBfQWxsb2M+IHJvcGVfdHlwZTsKKyAgICAgIHNpemVfdCBfX3JsZW4gPSByb3BlX3R5cGU6Ol9TX2NoYXJfcHRyX2xlbihfX3JpZ2h0KTsKKyAgICAgIHJldHVybiByb3BlX3R5cGUocm9wZV90eXBlOjpfU19jb25jYXRfY2hhcl9pdGVyKF9fbGVmdC5fTV90cmVlX3B0ciwKKwkJCQkJCSAgICAgIF9fcmlnaHQsIF9fcmxlbikpOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHJvcGU8X0NoYXJULCBfQWxsb2M+JgorICAgIG9wZXJhdG9yKz0ocm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fbGVmdCwKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JpZ2h0KQorICAgIHsKKyAgICAgIF9fbGVmdC5hcHBlbmQoX19yaWdodCk7CisgICAgICByZXR1cm4gX19sZWZ0OworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsIF9DaGFyVCBfX3JpZ2h0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgcm9wZTxfQ2hhclQsIF9BbGxvYz4gcm9wZV90eXBlOworICAgICAgcmV0dXJuIHJvcGVfdHlwZShyb3BlX3R5cGU6Ol9TX2NvbmNhdF9jaGFyX2l0ZXIoX19sZWZ0Ll9NX3RyZWVfcHRyLAorCQkJCQkJICAgICAgJl9fcmlnaHQsIDEpKTsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSByb3BlPF9DaGFyVCwgX0FsbG9jPiYKKyAgICBvcGVyYXRvcis9KHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsIF9DaGFyVCBfX3JpZ2h0KQorICAgIHsKKyAgICAgIF9fbGVmdC5hcHBlbmQoX19yaWdodCk7CisgICAgICByZXR1cm4gX19sZWZ0OworICAgIH0KKyAgCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsCisJICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fcmlnaHQpCisgICAgeyByZXR1cm4gX19sZWZ0LmNvbXBhcmUoX19yaWdodCkgPCAwOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsCisJICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3JpZ2h0KQorICAgIHsgcmV0dXJuIF9fbGVmdC5jb21wYXJlKF9fcmlnaHQpID09IDA7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAoX194Ll9NX3BvcyA9PSBfX3kuX01fcG9zICYmIF9feC5fTV9yb290ID09IF9feS5fTV9yb290KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX28sCisJICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3IpOworCisgIHR5cGVkZWYgcm9wZTxjaGFyPiBjcm9wZTsKKyAgdHlwZWRlZiByb3BlPHdjaGFyX3Q+IHdyb3BlOworCisgIGlubGluZSBjcm9wZTo6cmVmZXJlbmNlCisgIF9fbXV0YWJsZV9yZWZlcmVuY2VfYXQoY3JvcGUmIF9fYywgc2l6ZV90IF9faSkKKyAgeyByZXR1cm4gX19jLm11dGFibGVfcmVmZXJlbmNlX2F0KF9faSk7IH0KKworICBpbmxpbmUgd3JvcGU6OnJlZmVyZW5jZQorICBfX211dGFibGVfcmVmZXJlbmNlX2F0KHdyb3BlJiBfX2MsIHNpemVfdCBfX2kpCisgIHsgcmV0dXJuIF9fYy5tdXRhYmxlX3JlZmVyZW5jZV9hdChfX2kpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChyb3BlPF9DaGFyVCwgX0FsbG9jPiYgX194LCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7IAorbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8X19nbnVfY3h4Ojpjcm9wZT4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX19nbnVfY3h4Ojpjcm9wZSYgX19zdHIpIGNvbnN0CisgICAgICB7CisJc2l6ZV90IF9fc2l6ZSA9IF9fc3RyLnNpemUoKTsKKwlpZiAoMCA9PSBfX3NpemUpCisJICByZXR1cm4gMDsKKwlyZXR1cm4gMTMgKiBfX3N0clswXSArIDUgKiBfX3N0cltfX3NpemUgLSAxXSArIF9fc2l6ZTsKKyAgICAgIH0KKyAgICB9OworCisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPF9fZ251X2N4eDo6d3JvcGU+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fZ251X2N4eDo6d3JvcGUmIF9fc3RyKSBjb25zdAorICAgICAgeworCXNpemVfdCBfX3NpemUgPSBfX3N0ci5zaXplKCk7CisJaWYgKDAgPT0gX19zaXplKQorCSAgcmV0dXJuIDA7CisJcmV0dXJuIDEzICogX19zdHJbMF0gKyA1ICogX19zdHJbX19zaXplIC0gMV0gKyBfX3NpemU7CisgICAgICB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSB0cjEKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjIGluY2x1ZGUgPGV4dC9yb3BlaW1wbC5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3JvcGVpbXBsLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9yb3BlaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjVjYmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9yb3BlaW1wbC5oCkBAIC0wLDAgKzEsMTcwMyBAQAorLy8gU0dJJ3Mgcm9wZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgcm9wZWltcGwuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4dC9yb3BlfQorICovCisKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisKKyNpbmNsdWRlIDxleHQvYWxnb3JpdGhtPiAvLyBGb3IgY29weV9uIGFuZCBsZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5CisjaW5jbHVkZSA8ZXh0L21lbW9yeT4gLy8gRm9yIHVuaW5pdGlhbGl6ZWRfY29weV9uCisjaW5jbHVkZSA8ZXh0L251bWVyaWM+IC8vIEZvciBwb3dlcgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjpzaXplX3Q7CisgIHVzaW5nIHN0ZDo6cHJpbnRmOworICB1c2luZyBzdGQ6OmJhc2ljX29zdHJlYW07CisgIHVzaW5nIHN0ZDo6X190aHJvd19sZW5ndGhfZXJyb3I7CisgIHVzaW5nIHN0ZDo6X0Rlc3Ryb3k7CisgIHVzaW5nIHN0ZDo6X191bmluaXRpYWxpemVkX2ZpbGxfbl9hOworCisgIC8vIFNldCBidWZfc3RhcnQsIGJ1Zl9lbmQsIGFuZCBidWZfcHRyIGFwcHJvcHJpYXRlbHksIGZpbGxpbmcgdG1wX2J1ZgorICAvLyBpZiBuZWNlc3NhcnkuICBBc3N1bWVzIF9NX3BhdGhfZW5kW2xlYWZfaW5kZXhdIGFuZCBsZWFmX3BvcyBhcmUgY29ycmVjdC4KKyAgLy8gUmVzdWx0cyBpbiBhIHZhbGlkIGJ1Zl9wdHIgaWYgdGhlIGl0ZXJhdG9yIGNhbiBiZSBsZWdpdGltYXRlbHkKKyAgLy8gZGVyZWZlcmVuY2VkLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19zZXRidWYoX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz4mIF9feCkKKyAgICB7CisgICAgICBjb25zdCBfUm9wZVJlcCogX19sZWFmID0gX194Ll9NX3BhdGhfZW5kW19feC5fTV9sZWFmX2luZGV4XTsKKyAgICAgIHNpemVfdCBfX2xlYWZfcG9zID0gX194Ll9NX2xlYWZfcG9zOworICAgICAgc2l6ZV90IF9fcG9zID0gX194Ll9NX2N1cnJlbnRfcG9zOworCisgICAgICBzd2l0Y2goX19sZWFmLT5fTV90YWcpCisJeworCWNhc2UgX19kZXRhaWw6Ol9TX2xlYWY6CisJICBfX3guX01fYnVmX3N0YXJ0ID0gKChfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsIF9BbGxvYz4qKV9fbGVhZiktPl9NX2RhdGE7CisJICBfX3guX01fYnVmX3B0ciA9IF9feC5fTV9idWZfc3RhcnQgKyAoX19wb3MgLSBfX2xlYWZfcG9zKTsKKwkgIF9feC5fTV9idWZfZW5kID0gX194Ll9NX2J1Zl9zdGFydCArIF9fbGVhZi0+X01fc2l6ZTsKKwkgIGJyZWFrOworCWNhc2UgX19kZXRhaWw6Ol9TX2Z1bmN0aW9uOgorCWNhc2UgX19kZXRhaWw6Ol9TX3N1YnN0cmluZ2ZuOgorCSAgeworCSAgICBzaXplX3QgX19sZW4gPSBfU19pdGVyYXRvcl9idWZfbGVuOworCSAgICBzaXplX3QgX19idWZfc3RhcnRfcG9zID0gX19sZWFmX3BvczsKKwkgICAgc2l6ZV90IF9fbGVhZl9lbmQgPSBfX2xlYWZfcG9zICsgX19sZWFmLT5fTV9zaXplOworCSAgICBjaGFyX3Byb2R1Y2VyPF9DaGFyVD4qIF9fZm4gPSAoKF9Sb3BlX1JvcGVGdW5jdGlvbjxfQ2hhclQsCisJCQkJCSAgICBfQWxsb2M+KilfX2xlYWYpLT5fTV9mbjsKKwkgICAgaWYgKF9fYnVmX3N0YXJ0X3BvcyArIF9fbGVuIDw9IF9fcG9zKQorCSAgICAgIHsKKwkJX19idWZfc3RhcnRfcG9zID0gX19wb3MgLSBfX2xlbiAvIDQ7CisJCWlmIChfX2J1Zl9zdGFydF9wb3MgKyBfX2xlbiA+IF9fbGVhZl9lbmQpCisJCSAgX19idWZfc3RhcnRfcG9zID0gX19sZWFmX2VuZCAtIF9fbGVuOworCSAgICAgIH0KKwkgICAgaWYgKF9fYnVmX3N0YXJ0X3BvcyArIF9fbGVuID4gX19sZWFmX2VuZCkKKwkgICAgICBfX2xlbiA9IF9fbGVhZl9lbmQgLSBfX2J1Zl9zdGFydF9wb3M7CisJICAgICgqX19mbikoX19idWZfc3RhcnRfcG9zIC0gX19sZWFmX3BvcywgX19sZW4sIF9feC5fTV90bXBfYnVmKTsKKwkgICAgX194Ll9NX2J1Zl9wdHIgPSBfX3guX01fdG1wX2J1ZiArIChfX3BvcyAtIF9fYnVmX3N0YXJ0X3Bvcyk7CisJICAgIF9feC5fTV9idWZfc3RhcnQgPSBfX3guX01fdG1wX2J1ZjsKKwkgICAgX194Ll9NX2J1Zl9lbmQgPSBfX3guX01fdG1wX2J1ZiArIF9fbGVuOworCSAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgLy8gU2V0IHBhdGggYW5kIGJ1ZmZlciBpbnNpZGUgYSByb3BlIGl0ZXJhdG9yLiAgV2UgYXNzdW1lIHRoYXQKKyAgLy8gcG9zIGFuZCByb290IGFyZSBhbHJlYWR5IHNldC4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1Nfc2V0Y2FjaGUoX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz4mIF9feCkKKyAgICB7CisgICAgICBjb25zdCBfUm9wZVJlcCogX19wYXRoW2ludChfX2RldGFpbDo6X1NfbWF4X3JvcGVfZGVwdGgpICsgMV07CisgICAgICBjb25zdCBfUm9wZVJlcCogX19jdXJyX3JvcGU7CisgICAgICBpbnQgX19jdXJyX2RlcHRoID0gLTE7ICAvKiBpbmRleCBpbnRvIHBhdGggICAgKi8KKyAgICAgIHNpemVfdCBfX2N1cnJfc3RhcnRfcG9zID0gMDsKKyAgICAgIHNpemVfdCBfX3BvcyA9IF9feC5fTV9jdXJyZW50X3BvczsKKyAgICAgIHVuc2lnbmVkIGNoYXIgX19kaXJucyA9IDA7IC8vIEJpdCB2ZWN0b3IgbWFya2luZyByaWdodCB0dXJucyBpbiB0aGUgcGF0aAorCisgICAgICBpZiAoX19wb3MgPj0gX194Ll9NX3Jvb3QtPl9NX3NpemUpCisJeworCSAgX194Ll9NX2J1Zl9wdHIgPSAwOworCSAgcmV0dXJuOworCX0KKyAgICAgIF9fY3Vycl9yb3BlID0gX194Ll9NX3Jvb3Q7CisgICAgICBpZiAoMCAhPSBfX2N1cnJfcm9wZS0+X01fY19zdHJpbmcpCisJeworCSAgLyogVHJlYXQgdGhlIHJvb3QgYXMgYSBsZWFmLiAqLworCSAgX194Ll9NX2J1Zl9zdGFydCA9IF9fY3Vycl9yb3BlLT5fTV9jX3N0cmluZzsKKwkgIF9feC5fTV9idWZfZW5kID0gX19jdXJyX3JvcGUtPl9NX2Nfc3RyaW5nICsgX19jdXJyX3JvcGUtPl9NX3NpemU7CisJICBfX3guX01fYnVmX3B0ciA9IF9fY3Vycl9yb3BlLT5fTV9jX3N0cmluZyArIF9fcG9zOworCSAgX194Ll9NX3BhdGhfZW5kWzBdID0gX19jdXJyX3JvcGU7CisJICBfX3guX01fbGVhZl9pbmRleCA9IDA7CisJICBfX3guX01fbGVhZl9wb3MgPSAwOworCSAgcmV0dXJuOworCX0KKyAgICAgIGZvcig7OykKKwl7CisJICArK19fY3Vycl9kZXB0aDsKKwkgIF9fcGF0aFtfX2N1cnJfZGVwdGhdID0gX19jdXJyX3JvcGU7CisJICBzd2l0Y2goX19jdXJyX3JvcGUtPl9NX3RhZykKKwkgICAgeworCSAgICBjYXNlIF9fZGV0YWlsOjpfU19sZWFmOgorCSAgICBjYXNlIF9fZGV0YWlsOjpfU19mdW5jdGlvbjoKKwkgICAgY2FzZSBfX2RldGFpbDo6X1Nfc3Vic3RyaW5nZm46CisJICAgICAgX194Ll9NX2xlYWZfcG9zID0gX19jdXJyX3N0YXJ0X3BvczsKKwkgICAgICBnb3RvIGRvbmU7CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX2NvbmNhdDoKKwkgICAgICB7CisJCV9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCwgX0FsbG9jPiogX19jID0KKwkJICAoX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULCBfQWxsb2M+KilfX2N1cnJfcm9wZTsKKwkJX1JvcGVSZXAqIF9fbGVmdCA9IF9fYy0+X01fbGVmdDsKKwkJc2l6ZV90IF9fbGVmdF9sZW4gPSBfX2xlZnQtPl9NX3NpemU7CisKKwkJX19kaXJucyA8PD0gMTsKKwkJaWYgKF9fcG9zID49IF9fY3Vycl9zdGFydF9wb3MgKyBfX2xlZnRfbGVuKQorCQkgIHsKKwkJICAgIF9fZGlybnMgfD0gMTsKKwkJICAgIF9fY3Vycl9yb3BlID0gX19jLT5fTV9yaWdodDsKKwkJICAgIF9fY3Vycl9zdGFydF9wb3MgKz0gX19sZWZ0X2xlbjsKKwkJICB9CisJCWVsc2UKKwkJICBfX2N1cnJfcm9wZSA9IF9fbGVmdDsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgZG9uZToKKyAgICAgIC8vIENvcHkgbGFzdCBzZWN0aW9uIG9mIHBhdGggaW50byBfTV9wYXRoX2VuZC4KKyAgICAgIHsKKwlpbnQgX19pID0gLTE7CisJaW50IF9faiA9IF9fY3Vycl9kZXB0aCArIDEgLSBpbnQoX1NfcGF0aF9jYWNoZV9sZW4pOworCisJaWYgKF9faiA8IDApIF9faiA9IDA7CisJd2hpbGUgKF9faiA8PSBfX2N1cnJfZGVwdGgpCisJICBfX3guX01fcGF0aF9lbmRbKytfX2ldID0gX19wYXRoW19faisrXTsKKwlfX3guX01fbGVhZl9pbmRleCA9IF9faTsKKyAgICAgIH0KKyAgICAgIF9feC5fTV9wYXRoX2RpcmVjdGlvbnMgPSBfX2Rpcm5zOworICAgICAgX1Nfc2V0YnVmKF9feCk7CisgICAgfQorCisgIC8vIFNwZWNpYWxpemVkIHZlcnNpb24gb2YgdGhlIGFib3ZlLiAgQXNzdW1lcyB0aGF0CisgIC8vIHRoZSBwYXRoIGNhY2hlIGlzIHZhbGlkIGZvciB0aGUgcHJldmlvdXMgcG9zaXRpb24uCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX3NldGNhY2hlX2Zvcl9pbmNyKF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+JiBfX3gpCisgICAgeworICAgICAgaW50IF9fY3VycmVudF9pbmRleCA9IF9feC5fTV9sZWFmX2luZGV4OworICAgICAgY29uc3QgX1JvcGVSZXAqIF9fY3VycmVudF9ub2RlID0gX194Ll9NX3BhdGhfZW5kW19fY3VycmVudF9pbmRleF07CisgICAgICBzaXplX3QgX19sZW4gPSBfX2N1cnJlbnRfbm9kZS0+X01fc2l6ZTsKKyAgICAgIHNpemVfdCBfX25vZGVfc3RhcnRfcG9zID0gX194Ll9NX2xlYWZfcG9zOworICAgICAgdW5zaWduZWQgY2hhciBfX2Rpcm5zID0gX194Ll9NX3BhdGhfZGlyZWN0aW9uczsKKyAgICAgIF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCwgX0FsbG9jPiogX19jOworCisgICAgICBpZiAoX194Ll9NX2N1cnJlbnRfcG9zIC0gX19ub2RlX3N0YXJ0X3BvcyA8IF9fbGVuKQorCXsKKwkgIC8qIE1vcmUgc3R1ZmYgaW4gdGhpcyBsZWFmLCB3ZSBqdXN0IGRpZG4ndCBjYWNoZSBpdC4gKi8KKwkgIF9TX3NldGJ1ZihfX3gpOworCSAgcmV0dXJuOworCX0KKyAgICAgIC8vICBub2RlX3N0YXJ0X3BvcyBpcyBzdGFydGluZyBwb3NpdGlvbiBvZiBsYXN0X25vZGUuCisgICAgICB3aGlsZSAoLS1fX2N1cnJlbnRfaW5kZXggPj0gMCkKKwl7CisJICBpZiAoIShfX2Rpcm5zICYgMSkgLyogUGF0aCB0dXJuZWQgbGVmdCAqLykKKwkgICAgYnJlYWs7CisJICBfX2N1cnJlbnRfbm9kZSA9IF9feC5fTV9wYXRoX2VuZFtfX2N1cnJlbnRfaW5kZXhdOworCSAgX19jID0gKF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCwgX0FsbG9jPiopX19jdXJyZW50X25vZGU7CisJICAvLyBPdGhlcndpc2Ugd2Ugd2VyZSBpbiB0aGUgcmlnaHQgY2hpbGQuICBUaHVzIHdlIHNob3VsZCBwb3AKKwkgIC8vIHRoZSBjb25jYXRlbmF0aW9uIG5vZGUuCisJICBfX25vZGVfc3RhcnRfcG9zIC09IF9fYy0+X01fbGVmdC0+X01fc2l6ZTsKKwkgIF9fZGlybnMgPj49IDE7CisJfQorICAgICAgaWYgKF9fY3VycmVudF9pbmRleCA8IDApCisJeworCSAgLy8gV2UgdW5kZXJmbG93ZWQgdGhlIGNhY2hlLiBQdW50LgorCSAgX1Nfc2V0Y2FjaGUoX194KTsKKwkgIHJldHVybjsKKwl9CisgICAgICBfX2N1cnJlbnRfbm9kZSA9IF9feC5fTV9wYXRoX2VuZFtfX2N1cnJlbnRfaW5kZXhdOworICAgICAgX19jID0gKF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCwgX0FsbG9jPiopX19jdXJyZW50X25vZGU7CisgICAgICAvLyBjdXJyZW50X25vZGUgaXMgYSBjb25jYXRlbmF0aW9uIG5vZGUuICBXZSBhcmUgcG9zaXRpb25lZCBvbiB0aGUgZmlyc3QKKyAgICAgIC8vIGNoYXJhY3RlciBpbiBpdHMgcmlnaHQgY2hpbGQuCisgICAgICAvLyBub2RlX3N0YXJ0X3BvcyBpcyBzdGFydGluZyBwb3NpdGlvbiBvZiBjdXJyZW50X25vZGUuCisgICAgICBfX25vZGVfc3RhcnRfcG9zICs9IF9fYy0+X01fbGVmdC0+X01fc2l6ZTsKKyAgICAgIF9fY3VycmVudF9ub2RlID0gX19jLT5fTV9yaWdodDsKKyAgICAgIF9feC5fTV9wYXRoX2VuZFsrK19fY3VycmVudF9pbmRleF0gPSBfX2N1cnJlbnRfbm9kZTsKKyAgICAgIF9fZGlybnMgfD0gMTsKKyAgICAgIHdoaWxlIChfX2RldGFpbDo6X1NfY29uY2F0ID09IF9fY3VycmVudF9ub2RlLT5fTV90YWcpCisJeworCSAgKytfX2N1cnJlbnRfaW5kZXg7CisJICBpZiAoaW50KF9TX3BhdGhfY2FjaGVfbGVuKSA9PSBfX2N1cnJlbnRfaW5kZXgpCisJICAgIHsKKwkgICAgICBpbnQgX19pOworCSAgICAgIGZvciAoX19pID0gMDsgX19pIDwgaW50KF9TX3BhdGhfY2FjaGVfbGVuKSAtIDE7IF9faSsrKQorCQlfX3guX01fcGF0aF9lbmRbX19pXSA9IF9feC5fTV9wYXRoX2VuZFtfX2krMV07CisJICAgICAgLS1fX2N1cnJlbnRfaW5kZXg7CisJICAgIH0KKwkgIF9fY3VycmVudF9ub2RlID0KKwkgICAgKChfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz4qKV9fY3VycmVudF9ub2RlKS0+X01fbGVmdDsKKwkgIF9feC5fTV9wYXRoX2VuZFtfX2N1cnJlbnRfaW5kZXhdID0gX19jdXJyZW50X25vZGU7CisJICBfX2Rpcm5zIDw8PSAxOworCSAgLy8gbm9kZV9zdGFydF9wb3MgaXMgdW5jaGFuZ2VkLgorCX0KKyAgICAgIF9feC5fTV9sZWFmX2luZGV4ID0gX19jdXJyZW50X2luZGV4OworICAgICAgX194Ll9NX2xlYWZfcG9zID0gX19ub2RlX3N0YXJ0X3BvczsKKyAgICAgIF9feC5fTV9wYXRoX2RpcmVjdGlvbnMgPSBfX2Rpcm5zOworICAgICAgX1Nfc2V0YnVmKF9feCk7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9NX2luY3Ioc2l6ZV90IF9fbikKKyAgICB7CisgICAgICBfTV9jdXJyZW50X3BvcyArPSBfX247CisgICAgICBpZiAoMCAhPSBfTV9idWZfcHRyKQorCXsKKwkgIHNpemVfdCBfX2NoYXJzX2xlZnQgPSBfTV9idWZfZW5kIC0gX01fYnVmX3B0cjsKKwkgIGlmIChfX2NoYXJzX2xlZnQgPiBfX24pCisJICAgIF9NX2J1Zl9wdHIgKz0gX19uOworCSAgZWxzZSBpZiAoX19jaGFyc19sZWZ0ID09IF9fbikKKwkgICAgeworCSAgICAgIF9NX2J1Zl9wdHIgKz0gX19uOworCSAgICAgIF9TX3NldGNhY2hlX2Zvcl9pbmNyKCp0aGlzKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBfTV9idWZfcHRyID0gMDsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9NX2RlY3Ioc2l6ZV90IF9fbikKKyAgICB7CisgICAgICBpZiAoMCAhPSBfTV9idWZfcHRyKQorCXsKKwkgIHNpemVfdCBfX2NoYXJzX2xlZnQgPSBfTV9idWZfcHRyIC0gX01fYnVmX3N0YXJ0OworCSAgaWYgKF9fY2hhcnNfbGVmdCA+PSBfX24pCisJICAgIF9NX2J1Zl9wdHIgLT0gX19uOworCSAgZWxzZQorCSAgICBfTV9idWZfcHRyID0gMDsKKwl9CisgICAgICBfTV9jdXJyZW50X3BvcyAtPSBfX247CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfTV9jaGVjaygpCisgICAgeworICAgICAgaWYgKF9NX3Jvb3Rfcm9wZS0+X01fdHJlZV9wdHIgIT0gdGhpcy0+X01fcm9vdCkKKwl7CisJICAvLyBfUm9wZSB3YXMgbW9kaWZpZWQuICBHZXQgdGhpbmdzIGZpeGVkIHVwLgorCSAgX1JvcGVSZXA6Ol9TX3VucmVmKHRoaXMtPl9NX3Jvb3QpOworCSAgdGhpcy0+X01fcm9vdCA9IF9NX3Jvb3Rfcm9wZS0+X01fdHJlZV9wdHI7CisJICBfUm9wZVJlcDo6X1NfcmVmKHRoaXMtPl9NX3Jvb3QpOworCSAgdGhpcy0+X01fYnVmX3B0ciA9IDA7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lCisgICAgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfUm9wZV9jb25zdF9pdGVyYXRvcihjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCkKKyAgICA6IF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+KF9feCkKKyAgICB7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lCisgICAgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfUm9wZV9pdGVyYXRvcihyb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19yLCBzaXplX3QgX19wb3MpCisgICAgOiBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCxfQWxsb2M+KF9fci5fTV90cmVlX3B0ciwgX19wb3MpLAorICAgICAgX01fcm9vdF9yb3BlKCZfX3IpCisgICAgeyBfUm9wZVJlcDo6X1NfcmVmKHRoaXMtPl9NX3Jvb3QpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBzaXplX3QKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfY2hhcl9wdHJfbGVuKGNvbnN0IF9DaGFyVCogX19zKQorICAgIHsKKyAgICAgIGNvbnN0IF9DaGFyVCogX19wID0gX19zOworICAgICAgCisgICAgICB3aGlsZSAoIV9TX2lzMCgqX19wKSkKKwkrK19fcDsKKyAgICAgIHJldHVybiAoX19wIC0gX19zKTsKKyAgICB9CisKKworI2lmbmRlZiBfX0dDCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9NX2ZyZWVfY19zdHJpbmcoKQorICAgIHsKKyAgICAgIF9DaGFyVCogX19jc3RyID0gX01fY19zdHJpbmc7CisgICAgICBpZiAoMCAhPSBfX2NzdHIpCisJeworCSAgc2l6ZV90IF9fc2l6ZSA9IHRoaXMtPl9NX3NpemUgKyAxOworCSAgX0Rlc3Ryb3koX19jc3RyLCBfX2NzdHIgKyBfX3NpemUsIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJICB0aGlzLT5fRGF0YV9kZWFsbG9jYXRlKF9fY3N0ciwgX19zaXplKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19mcmVlX3N0cmluZyhfQ2hhclQqIF9fcywgc2l6ZV90IF9fbiwgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICB7CisgICAgICBpZiAoIV9TX2lzX2Jhc2ljX2NoYXJfdHlwZSgoX0NoYXJUKikwKSkKKwlfRGVzdHJveShfX3MsIF9fcyArIF9fbiwgX19hKTsKKyAgICAgIAorICAgICAgLy8gIFRoaXMgaGFzIHRvIGJlIGEgc3RhdGljIG1lbWJlciwgc28gdGhpcyBnZXRzIGEgYml0IG1lc3N5CisgICAgICBfX2EuZGVhbGxvY2F0ZShfX3MsCisJCSAgICAgX1JvcGVfUm9wZUxlYWY8X0NoYXJULCBfQWxsb2M+OjpfU19yb3VuZGVkX3VwX3NpemUoX19uKSk7CisgICAgfQorCisgIC8vICBUaGVyZSBhcmUgc2V2ZXJhbCByZWFzb25zIGZvciBub3QgZG9pbmcgdGhpcyB3aXRoIHZpcnR1YWwgZGVzdHJ1Y3RvcnMKKyAgLy8gIGFuZCBhIGNsYXNzIHNwZWNpZmljIGRlbGV0ZSBvcGVyYXRvcjoKKyAgLy8gIC0gQSBjbGFzcyBzcGVjaWZpYyBkZWxldGUgb3BlcmF0b3IgY2FuJ3QgZWFzaWx5IGdldCBhY2Nlc3MgdG8KKyAgLy8gICAgYWxsb2NhdG9yIGluc3RhbmNlcyBpZiB3ZSBuZWVkIHRoZW0uCisgIC8vICAtIEFueSB2aXJ0dWFsIGZ1bmN0aW9uIHdvdWxkIG5lZWQgYSA0IG9yIGJ5dGUgdnRhYmxlIHBvaW50ZXI7CisgIC8vICAgIHRoaXMgb25seSByZXF1aXJlcyBhIG9uZSBieXRlIHRhZyBwZXIgb2JqZWN0LgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfTV9mcmVlX3RyZWUoKQorICAgIHsKKyAgICAgIHN3aXRjaChfTV90YWcpCisJeworCWNhc2UgX19kZXRhaWw6Ol9TX2xlYWY6CisJICB7CisJICAgIF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCwgX0FsbG9jPiogX19sCisJICAgICAgPSAoX1JvcGVfUm9wZUxlYWY8X0NoYXJULCBfQWxsb2M+Kil0aGlzOworCSAgICBfX2wtPl9Sb3BlX1JvcGVMZWFmPF9DaGFyVCwgX0FsbG9jPjo6fl9Sb3BlX1JvcGVMZWFmKCk7CisJICAgIHRoaXMtPl9MX2RlYWxsb2NhdGUoX19sLCAxKTsKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSBfX2RldGFpbDo6X1NfY29uY2F0OgorCSAgeworCSAgICBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsX0FsbG9jPiogX19jCisJICAgICAgPSAoX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULCBfQWxsb2M+Kil0aGlzOworCSAgICBfX2MtPl9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCwgX0FsbG9jPjo6CisJICAgICAgfl9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uKCk7CisJICAgIHRoaXMtPl9DX2RlYWxsb2NhdGUoX19jLCAxKTsKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJICB7CisJICAgIF9Sb3BlX1JvcGVGdW5jdGlvbjxfQ2hhclQsIF9BbGxvYz4qIF9fZgorCSAgICAgID0gKF9Sb3BlX1JvcGVGdW5jdGlvbjxfQ2hhclQsIF9BbGxvYz4qKXRoaXM7CisJICAgIF9fZi0+X1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCwgX0FsbG9jPjo6fl9Sb3BlX1JvcGVGdW5jdGlvbigpOworCSAgICB0aGlzLT5fRl9kZWFsbG9jYXRlKF9fZiwgMSk7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgX19kZXRhaWw6Ol9TX3N1YnN0cmluZ2ZuOgorCSAgeworCSAgICBfUm9wZV9Sb3BlU3Vic3RyaW5nPF9DaGFyVCwgX0FsbG9jPiogX19zcyA9CisJICAgICAgKF9Sb3BlX1JvcGVTdWJzdHJpbmc8X0NoYXJULCBfQWxsb2M+Kil0aGlzOworCSAgICBfX3NzLT5fUm9wZV9Sb3BlU3Vic3RyaW5nPF9DaGFyVCwgX0FsbG9jPjo6CisJICAgICAgfl9Sb3BlX1JvcGVTdWJzdHJpbmcoKTsKKwkgICAgdGhpcy0+X1NfZGVhbGxvY2F0ZShfX3NzLCAxKTsKKwkgICAgYnJlYWs7CisJICB9CisJfQorICAgIH0KKyNlbHNlCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2ZyZWVfc3RyaW5nKGNvbnN0IF9DaGFyVCosIHNpemVfdCwgYWxsb2NhdG9yX3R5cGUpCisgICAgeyB9CisKKyNlbmRpZgorCisgIC8vIENvbmNhdGVuYXRlIGEgQyBzdHJpbmcgb250byBhIGxlYWYgcm9wZSBieSBjb3B5aW5nIHRoZSByb3BlIGRhdGEuCisgIC8vIFVzZWQgZm9yIHNob3J0IHJvcGVzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdHlwZW5hbWUgcm9wZTxfQ2hhclQsIF9BbGxvYz46Ol9Sb3BlTGVhZioKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfbGVhZl9jb25jYXRfY2hhcl9pdGVyKF9Sb3BlTGVhZiogX19yLCBjb25zdCBfQ2hhclQqIF9faXRlciwgc2l6ZV90IF9fbGVuKQorICAgIHsKKyAgICAgIHNpemVfdCBfX29sZF9sZW4gPSBfX3ItPl9NX3NpemU7CisgICAgICBfQ2hhclQqIF9fbmV3X2RhdGEgPSAoX0NoYXJUKikKKwlyb3BlOjpfRGF0YV9hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19vbGRfbGVuICsgX19sZW4pKTsKKyAgICAgIF9Sb3BlTGVhZiogX19yZXN1bHQ7CisKKyAgICAgIHVuaW5pdGlhbGl6ZWRfY29weV9uKF9fci0+X01fZGF0YSwgX19vbGRfbGVuLCBfX25ld19kYXRhKTsKKyAgICAgIHVuaW5pdGlhbGl6ZWRfY29weV9uKF9faXRlciwgX19sZW4sIF9fbmV3X2RhdGEgKyBfX29sZF9sZW4pOworICAgICAgX1NfY29uZF9zdG9yZV9lb3MoX19uZXdfZGF0YVtfX29sZF9sZW4gKyBfX2xlbl0pOworICAgICAgX190cnkKKwl7CisJICBfX3Jlc3VsdCA9IF9TX25ld19Sb3BlTGVhZihfX25ld19kYXRhLCBfX29sZF9sZW4gKyBfX2xlbiwKKwkJCQkgICAgIF9fci0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBfUm9wZVJlcDo6X19TVExfRlJFRV9TVFJJTkcoX19uZXdfZGF0YSwgX19vbGRfbGVuICsgX19sZW4sCisJCQkJICAgICAgX19yLT5fTV9nZXRfYWxsb2NhdG9yKCkpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworI2lmbmRlZiBfX0dDCisgIC8vIEFzIGFib3ZlLCBidXQgaXQncyBPSyB0byBjbG9iYmVyIG9yaWdpbmFsIGlmIHJlZmNvdW50IGlzIDEKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIHJvcGU8X0NoYXJULF9BbGxvYz46Ol9Sb3BlTGVhZioKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfZGVzdHJfbGVhZl9jb25jYXRfY2hhcl9pdGVyKF9Sb3BlTGVhZiogX19yLCBjb25zdCBfQ2hhclQqIF9faXRlciwKKwkJCQkgICBzaXplX3QgX19sZW4pCisgICAgeworICAgICAgaWYgKF9fci0+X01fcmVmX2NvdW50ID4gMSkKKwlyZXR1cm4gX1NfbGVhZl9jb25jYXRfY2hhcl9pdGVyKF9fciwgX19pdGVyLCBfX2xlbik7CisgICAgICBzaXplX3QgX19vbGRfbGVuID0gX19yLT5fTV9zaXplOworICAgICAgaWYgKF9TX2FsbG9jYXRlZF9jYXBhY2l0eShfX29sZF9sZW4pID49IF9fb2xkX2xlbiArIF9fbGVuKQorCXsKKwkgIC8vIFRoZSBzcGFjZSBoYXMgYmVlbiBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQgZm9yIHRoZSBzdGFuZGFyZAorCSAgLy8gY2hhcmFjdGVyIHR5cGVzLiAgQnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIgZm9yIHRob3NlIHR5cGVzLgorCSAgdW5pbml0aWFsaXplZF9jb3B5X24oX19pdGVyLCBfX2xlbiwgX19yLT5fTV9kYXRhICsgX19vbGRfbGVuKTsKKwkgIGlmIChfU19pc19iYXNpY19jaGFyX3R5cGUoKF9DaGFyVCopMCkpCisJICAgIF9TX2NvbmRfc3RvcmVfZW9zKF9fci0+X01fZGF0YVtfX29sZF9sZW4gKyBfX2xlbl0pOworCSAgZWxzZSBpZiAoX19yLT5fTV9jX3N0cmluZyAhPSBfX3ItPl9NX2RhdGEgJiYgMCAhPSBfX3ItPl9NX2Nfc3RyaW5nKQorCSAgICB7CisJICAgICAgX19yLT5fTV9mcmVlX2Nfc3RyaW5nKCk7CisJICAgICAgX19yLT5fTV9jX3N0cmluZyA9IDA7CisJICAgIH0KKwkgIF9fci0+X01fc2l6ZSA9IF9fb2xkX2xlbiArIF9fbGVuOworCSAgX19yLT5fTV9yZWZfY291bnQgPSAyOworCSAgcmV0dXJuIF9fcjsKKwl9CisgICAgICBlbHNlCisJeworCSAgX1JvcGVMZWFmKiBfX3Jlc3VsdCA9IF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfX3IsIF9faXRlciwgX19sZW4pOworCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9CisjZW5kaWYKKworICAvLyBBc3N1bWVzIGxlZnQgYW5kIHJpZ2h0IGFyZSBub3QgMC4KKyAgLy8gRG9lcyBub3QgaW5jcmVtZW50IChub3IgZGVjcmVtZW50IG9uIGV4Y2VwdGlvbikgY2hpbGQgcmVmZXJlbmNlIGNvdW50cy4KKyAgLy8gUmVzdWx0IGhhcyByZWYgY291bnQgMS4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpfUm9wZVJlcCoKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfdHJlZV9jb25jYXQoX1JvcGVSZXAqIF9fbGVmdCwgX1JvcGVSZXAqIF9fcmlnaHQpCisgICAgeworICAgICAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX3Jlc3VsdCA9IF9TX25ld19Sb3BlQ29uY2F0ZW5hdGlvbihfX2xlZnQsIF9fcmlnaHQsCisJCQkJCQkJICAgICAgX19sZWZ0LT4KKwkJCQkJCQkgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkpOworICAgICAgc2l6ZV90IF9fZGVwdGggPSBfX3Jlc3VsdC0+X01fZGVwdGg7CisgICAgICAKKyAgICAgIGlmIChfX2RlcHRoID4gMjAKKwkgICYmIChfX3Jlc3VsdC0+X01fc2l6ZSA8IDEwMDAKKwkgICAgICB8fCBfX2RlcHRoID4gc2l6ZV90KF9fZGV0YWlsOjpfU19tYXhfcm9wZV9kZXB0aCkpKQorCXsKKwkgIF9Sb3BlUmVwKiBfX2JhbGFuY2VkOworCisJICBfX3RyeQorCSAgICB7CisJICAgICAgX19iYWxhbmNlZCA9IF9TX2JhbGFuY2UoX19yZXN1bHQpOworCSAgICAgIF9fcmVzdWx0LT5fTV91bnJlZl9ub25uaWwoKTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICByb3BlOjpfQ19kZWFsbG9jYXRlKF9fcmVzdWx0LDEpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICAvLyBJbiBjYXNlIG9mIGV4Y2VwdGlvbiwgd2UgbmVlZCB0byBkZWFsbG9jYXRlCisJICAvLyBvdGhlcndpc2UgZGFuZ2xpbmcgcmVzdWx0IG5vZGUuICBCdXQgY2FsbGVyCisJICAvLyBzdGlsbCBvd25zIGl0cyBjaGlsZHJlbi4gIFRodXMgdW5yZWYgaXMKKwkgIC8vIGluYXBwcm9wcmlhdGUuCisJICByZXR1cm4gX19iYWxhbmNlZDsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdHlwZW5hbWUgcm9wZTxfQ2hhclQsIF9BbGxvYz46Ol9Sb3BlUmVwKgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19jb25jYXRfY2hhcl9pdGVyKF9Sb3BlUmVwKiBfX3IsIGNvbnN0IF9DaGFyVCpfX3MsIHNpemVfdCBfX3NsZW4pCisgICAgeworICAgICAgX1JvcGVSZXAqIF9fcmVzdWx0OworICAgICAgaWYgKDAgPT0gX19zbGVuKQorCXsKKwkgIF9TX3JlZihfX3IpOworCSAgcmV0dXJuIF9fcjsKKwl9CisgICAgICBpZiAoMCA9PSBfX3IpCisJcmV0dXJuIF9fU1RMX1JPUEVfRlJPTV9VTk9XTkVEX0NIQVJfUFRSKF9fcywgX19zbGVuLAorCQkJCQkJX19yLT5fTV9nZXRfYWxsb2NhdG9yKCkpOworICAgICAgaWYgKF9fci0+X01fdGFnID09IF9fZGV0YWlsOjpfU19sZWFmCisJICAmJiBfX3ItPl9NX3NpemUgKyBfX3NsZW4gPD0gc2l6ZV90KF9TX2NvcHlfbWF4KSkKKwl7CisJICBfX3Jlc3VsdCA9IF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcigoX1JvcGVMZWFmKilfX3IsIF9fcywgX19zbGVuKTsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgICBpZiAoX19kZXRhaWw6Ol9TX2NvbmNhdCA9PSBfX3ItPl9NX3RhZworCSAgJiYgX19kZXRhaWw6Ol9TX2xlYWYgPT0gKChfUm9wZUNvbmNhdGVuYXRpb24qKSBfX3IpLT5fTV9yaWdodC0+X01fdGFnKQorCXsKKwkgIF9Sb3BlTGVhZiogX19yaWdodCA9CisJICAgIChfUm9wZUxlYWYqICkoKChfUm9wZUNvbmNhdGVuYXRpb24qIClfX3IpLT5fTV9yaWdodCk7CisJICBpZiAoX19yaWdodC0+X01fc2l6ZSArIF9fc2xlbiA8PSBzaXplX3QoX1NfY29weV9tYXgpKQorCSAgICB7CisJICAgICAgX1JvcGVSZXAqIF9fbGVmdCA9ICgoX1JvcGVDb25jYXRlbmF0aW9uKilfX3IpLT5fTV9sZWZ0OworCSAgICAgIF9Sb3BlUmVwKiBfX25yaWdodCA9CisJCV9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcigoX1JvcGVMZWFmKilfX3JpZ2h0LCBfX3MsIF9fc2xlbik7CisJICAgICAgX19sZWZ0LT5fTV9yZWZfbm9ubmlsKCk7CisJICAgICAgX190cnkKKwkJeyBfX3Jlc3VsdCA9IF9TX3RyZWVfY29uY2F0KF9fbGVmdCwgX19ucmlnaHQpOyB9CisJICAgICAgX19jYXRjaCguLi4pCisJCXsKKwkJICBfU191bnJlZihfX2xlZnQpOworCQkgIF9TX3VucmVmKF9fbnJpZ2h0KTsKKwkJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkJfQorCSAgICAgIHJldHVybiBfX3Jlc3VsdDsKKwkgICAgfQorCX0KKyAgICAgIF9Sb3BlUmVwKiBfX25yaWdodCA9CisJX19TVExfUk9QRV9GUk9NX1VOT1dORURfQ0hBUl9QVFIoX19zLCBfX3NsZW4sIF9fci0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIF9fdHJ5CisJeworCSAgX19yLT5fTV9yZWZfbm9ubmlsKCk7CisJICBfX3Jlc3VsdCA9IF9TX3RyZWVfY29uY2F0KF9fciwgX19ucmlnaHQpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIF9TX3VucmVmKF9fcik7CisJICBfU191bnJlZihfX25yaWdodCk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisjaWZuZGVmIF9fR0MKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIHJvcGU8X0NoYXJULF9BbGxvYz46Ol9Sb3BlUmVwKgorICAgIHJvcGU8X0NoYXJULF9BbGxvYz46OgorICAgIF9TX2Rlc3RyX2NvbmNhdF9jaGFyX2l0ZXIoX1JvcGVSZXAqIF9fciwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdCBfX3NsZW4pCisgICAgeworICAgICAgX1JvcGVSZXAqIF9fcmVzdWx0OworICAgICAgaWYgKDAgPT0gX19yKQorCXJldHVybiBfX1NUTF9ST1BFX0ZST01fVU5PV05FRF9DSEFSX1BUUihfX3MsIF9fc2xlbiwKKwkJCQkJCV9fci0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIHNpemVfdCBfX2NvdW50ID0gX19yLT5fTV9yZWZfY291bnQ7CisgICAgICBzaXplX3QgX19vcmlnX3NpemUgPSBfX3ItPl9NX3NpemU7CisgICAgICBpZiAoX19jb3VudCA+IDEpCisJcmV0dXJuIF9TX2NvbmNhdF9jaGFyX2l0ZXIoX19yLCBfX3MsIF9fc2xlbik7CisgICAgICBpZiAoMCA9PSBfX3NsZW4pCisJeworCSAgX19yLT5fTV9yZWZfY291bnQgPSAyOyAgICAgIC8vIE9uZSBtb3JlIHRoYW4gYmVmb3JlCisJICByZXR1cm4gX19yOworCX0KKyAgICAgIGlmIChfX29yaWdfc2l6ZSArIF9fc2xlbiA8PSBzaXplX3QoX1NfY29weV9tYXgpCisJICAmJiBfX2RldGFpbDo6X1NfbGVhZiA9PSBfX3ItPl9NX3RhZykKKwl7CisJICBfX3Jlc3VsdCA9IF9TX2Rlc3RyX2xlYWZfY29uY2F0X2NoYXJfaXRlcigoX1JvcGVMZWFmKilfX3IsIF9fcywgCisJCQkJCQkgICAgX19zbGVuKTsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgICBpZiAoX19kZXRhaWw6Ol9TX2NvbmNhdCA9PSBfX3ItPl9NX3RhZykKKwl7CisJICBfUm9wZUxlYWYqIF9fcmlnaHQgPSAoX1JvcGVMZWFmKikoKChfUm9wZUNvbmNhdGVuYXRpb24qKQorCQkJCQkgICAgIF9fciktPl9NX3JpZ2h0KTsKKwkgIGlmIChfX2RldGFpbDo6X1NfbGVhZiA9PSBfX3JpZ2h0LT5fTV90YWcKKwkgICAgICAmJiBfX3JpZ2h0LT5fTV9zaXplICsgX19zbGVuIDw9IHNpemVfdChfU19jb3B5X21heCkpCisJICAgIHsKKwkgICAgICBfUm9wZVJlcCogX19uZXdfcmlnaHQgPQorCQlfU19kZXN0cl9sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoX19yaWdodCwgX19zLCBfX3NsZW4pOworCSAgICAgIGlmIChfX3JpZ2h0ID09IF9fbmV3X3JpZ2h0KQorCQlfX25ld19yaWdodC0+X01fcmVmX2NvdW50ID0gMTsKKwkgICAgICBlbHNlCisJCV9fcmlnaHQtPl9NX3VucmVmX25vbm5pbCgpOworCSAgICAgIF9fci0+X01fcmVmX2NvdW50ID0gMjsgICAgLy8gT25lIG1vcmUgdGhhbiBiZWZvcmUuCisJICAgICAgKChfUm9wZUNvbmNhdGVuYXRpb24qKV9fciktPl9NX3JpZ2h0ID0gX19uZXdfcmlnaHQ7CisJICAgICAgX19yLT5fTV9zaXplID0gX19vcmlnX3NpemUgKyBfX3NsZW47CisJICAgICAgaWYgKDAgIT0gX19yLT5fTV9jX3N0cmluZykKKwkJeworCQkgIF9fci0+X01fZnJlZV9jX3N0cmluZygpOworCQkgIF9fci0+X01fY19zdHJpbmcgPSAwOworCQl9CisJICAgICAgcmV0dXJuIF9fcjsKKwkgICAgfQorCX0KKyAgICAgIF9Sb3BlUmVwKiBfX3JpZ2h0ID0KKwlfX1NUTF9ST1BFX0ZST01fVU5PV05FRF9DSEFSX1BUUihfX3MsIF9fc2xlbiwgX19yLT5fTV9nZXRfYWxsb2NhdG9yKCkpOworICAgICAgX19yLT5fTV9yZWZfbm9ubmlsKCk7CisgICAgICBfX3RyeQorCXsgX19yZXN1bHQgPSBfU190cmVlX2NvbmNhdChfX3IsIF9fcmlnaHQpOyB9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBfU191bnJlZihfX3IpOworCSAgX1NfdW5yZWYoX19yaWdodCk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorI2VuZGlmIC8qICFfX0dDICovCisgIAorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdHlwZW5hbWUgcm9wZTxfQ2hhclQsIF9BbGxvYz46Ol9Sb3BlUmVwKgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19jb25jYXQoX1JvcGVSZXAqIF9fbGVmdCwgX1JvcGVSZXAqIF9fcmlnaHQpCisgICAgeworICAgICAgaWYgKDAgPT0gX19sZWZ0KQorCXsKKwkgIF9TX3JlZihfX3JpZ2h0KTsKKwkgIHJldHVybiBfX3JpZ2h0OworCX0KKyAgICAgIGlmICgwID09IF9fcmlnaHQpCisJeworCSAgX19sZWZ0LT5fTV9yZWZfbm9ubmlsKCk7CisJICByZXR1cm4gX19sZWZ0OworCX0KKyAgICAgIGlmIChfX2RldGFpbDo6X1NfbGVhZiA9PSBfX3JpZ2h0LT5fTV90YWcpCisJeworCSAgaWYgKF9fZGV0YWlsOjpfU19sZWFmID09IF9fbGVmdC0+X01fdGFnKQorCSAgICB7CisJICAgICAgaWYgKF9fcmlnaHQtPl9NX3NpemUgKyBfX2xlZnQtPl9NX3NpemUgPD0gc2l6ZV90KF9TX2NvcHlfbWF4KSkKKwkJcmV0dXJuIF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcigoX1JvcGVMZWFmKilfX2xlZnQsCisJCQkJCQkoKF9Sb3BlTGVhZiopX19yaWdodCktPl9NX2RhdGEsCisJCQkJCQlfX3JpZ2h0LT5fTV9zaXplKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoX19kZXRhaWw6Ol9TX2NvbmNhdCA9PSBfX2xlZnQtPl9NX3RhZworCQkgICAmJiBfX2RldGFpbDo6X1NfbGVhZiA9PSAoKF9Sb3BlQ29uY2F0ZW5hdGlvbiopCisJCQkJCQkgICBfX2xlZnQpLT5fTV9yaWdodC0+X01fdGFnKQorCSAgICB7CisJICAgICAgX1JvcGVMZWFmKiBfX2xlZnRyaWdodCA9CisJCShfUm9wZUxlYWYqKSgoKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19sZWZ0KS0+X01fcmlnaHQpOworCSAgICAgIGlmIChfX2xlZnRyaWdodC0+X01fc2l6ZQorCQkgICsgX19yaWdodC0+X01fc2l6ZSA8PSBzaXplX3QoX1NfY29weV9tYXgpKQorCQl7CisJCSAgX1JvcGVSZXAqIF9fbGVmdGxlZnQgPSAoKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19sZWZ0KS0+X01fbGVmdDsKKwkJICBfUm9wZVJlcCogX19yZXN0ID0gX1NfbGVhZl9jb25jYXRfY2hhcl9pdGVyKF9fbGVmdHJpZ2h0LAorCQkJCQkJCSAgICAgICgoX1JvcGVMZWFmKikKKwkJCQkJCQkgICAgICAgX19yaWdodCktPgorCQkJCQkJCSAgICAgIF9NX2RhdGEsCisJCQkJCQkJICAgICAgX19yaWdodC0+X01fc2l6ZSk7CisJCSAgX19sZWZ0bGVmdC0+X01fcmVmX25vbm5pbCgpOworCQkgIF9fdHJ5CisJCSAgICB7IHJldHVybihfU190cmVlX2NvbmNhdChfX2xlZnRsZWZ0LCBfX3Jlc3QpKTsgfQorCQkgIF9fY2F0Y2goLi4uKQorCQkgICAgeworCQkgICAgICBfU191bnJlZihfX2xlZnRsZWZ0KTsKKwkJICAgICAgX1NfdW5yZWYoX19yZXN0KTsKKwkJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICAgIF9fbGVmdC0+X01fcmVmX25vbm5pbCgpOworICAgICAgX19yaWdodC0+X01fcmVmX25vbm5pbCgpOworICAgICAgX190cnkKKwl7IHJldHVybihfU190cmVlX2NvbmNhdChfX2xlZnQsIF9fcmlnaHQpKTsgfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgX1NfdW5yZWYoX19sZWZ0KTsKKwkgIF9TX3VucmVmKF9fcmlnaHQpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdHlwZW5hbWUgcm9wZTxfQ2hhclQsIF9BbGxvYz46Ol9Sb3BlUmVwKgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19zdWJzdHJpbmcoX1JvcGVSZXAqIF9fYmFzZSwgc2l6ZV90IF9fc3RhcnQsIHNpemVfdCBfX2VuZHAxKQorICAgIHsKKyAgICAgIGlmICgwID09IF9fYmFzZSkKKwlyZXR1cm4gMDsKKyAgICAgIHNpemVfdCBfX2xlbiA9IF9fYmFzZS0+X01fc2l6ZTsKKyAgICAgIHNpemVfdCBfX2Fkal9lbmRwMTsKKyAgICAgIGNvbnN0IHNpemVfdCBfX2xhenlfdGhyZXNob2xkID0gMTI4OworICAgICAgCisgICAgICBpZiAoX19lbmRwMSA+PSBfX2xlbikKKwl7CisJICBpZiAoMCA9PSBfX3N0YXJ0KQorCSAgICB7CisJICAgICAgX19iYXNlLT5fTV9yZWZfbm9ubmlsKCk7CisJICAgICAgcmV0dXJuIF9fYmFzZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBfX2Fkal9lbmRwMSA9IF9fbGVuOworCSAgCisJfQorICAgICAgZWxzZQorCV9fYWRqX2VuZHAxID0gX19lbmRwMTsKKworICAgICAgc3dpdGNoKF9fYmFzZS0+X01fdGFnKQorCXsKKwljYXNlIF9fZGV0YWlsOjpfU19jb25jYXQ6CisJICAgIHsKKwkgICAgICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyA9IChfUm9wZUNvbmNhdGVuYXRpb24qKV9fYmFzZTsKKwkgICAgICBfUm9wZVJlcCogX19sZWZ0ID0gX19jLT5fTV9sZWZ0OworCSAgICAgIF9Sb3BlUmVwKiBfX3JpZ2h0ID0gX19jLT5fTV9yaWdodDsKKwkgICAgICBzaXplX3QgX19sZWZ0X2xlbiA9IF9fbGVmdC0+X01fc2l6ZTsKKwkgICAgICBfUm9wZVJlcCogX19yZXN1bHQ7CisJICAgICAgCisJICAgICAgaWYgKF9fYWRqX2VuZHAxIDw9IF9fbGVmdF9sZW4pCisJCXJldHVybiBfU19zdWJzdHJpbmcoX19sZWZ0LCBfX3N0YXJ0LCBfX2VuZHAxKTsKKwkgICAgICBlbHNlIGlmIChfX3N0YXJ0ID49IF9fbGVmdF9sZW4pCisJCXJldHVybiBfU19zdWJzdHJpbmcoX19yaWdodCwgX19zdGFydCAtIF9fbGVmdF9sZW4sCisJCQkJICAgIF9fYWRqX2VuZHAxIC0gX19sZWZ0X2xlbik7CisJICAgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdF9yZXN1bHQoX1Nfc3Vic3RyaW5nKF9fbGVmdCwKKwkJCQkJCQkgICAgX19zdGFydCwKKwkJCQkJCQkgICAgX19sZWZ0X2xlbikpOworCSAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX3JpZ2h0X3Jlc3VsdChfU19zdWJzdHJpbmcoX19yaWdodCwgMCwKKwkJCQkJCQkgICAgIF9fZW5kcDEgCisJCQkJCQkJICAgICAtIF9fbGVmdF9sZW4pKTsKKwkgICAgICBfX3Jlc3VsdCA9IF9TX2NvbmNhdChfX2xlZnRfcmVzdWx0LCBfX3JpZ2h0X3Jlc3VsdCk7CisJICAgICAgcmV0dXJuIF9fcmVzdWx0OworCSAgICB9CisJY2FzZSBfX2RldGFpbDo6X1NfbGVhZjoKKwkgIHsKKwkgICAgX1JvcGVMZWFmKiBfX2wgPSAoX1JvcGVMZWFmKilfX2Jhc2U7CisJICAgIF9Sb3BlTGVhZiogX19yZXN1bHQ7CisJICAgIHNpemVfdCBfX3Jlc3VsdF9sZW47CisJICAgIGlmIChfX3N0YXJ0ID49IF9fYWRqX2VuZHAxKQorCSAgICAgIHJldHVybiAwOworCSAgICBfX3Jlc3VsdF9sZW4gPSBfX2Fkal9lbmRwMSAtIF9fc3RhcnQ7CisJICAgIGlmIChfX3Jlc3VsdF9sZW4gPiBfX2xhenlfdGhyZXNob2xkKQorCSAgICAgIGdvdG8gbGF6eTsKKyNpZmRlZiBfX0dDCisJICAgIGNvbnN0IF9DaGFyVCogX19zZWN0aW9uID0gX19sLT5fTV9kYXRhICsgX19zdGFydDsKKwkgICAgX19yZXN1bHQgPSBfU19uZXdfUm9wZUxlYWYoX19zZWN0aW9uLCBfX3Jlc3VsdF9sZW4sCisJCQkJICAgICAgIF9fYmFzZS0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgICAgX19yZXN1bHQtPl9NX2Nfc3RyaW5nID0gMDsgIC8vIE5vdCBlb3MgdGVybWluYXRlZC4KKyNlbHNlCisJICAgIC8vIFdlIHNob3VsZCBzb21ldGltZXMgY3JlYXRlIHN1YnN0cmluZyBub2RlIGluc3RlYWQuCisJICAgIF9fcmVzdWx0ID0gX19TVExfUk9QRV9GUk9NX1VOT1dORURfQ0hBUl9QVFIoX19sLT5fTV9kYXRhICsgX19zdGFydCwKKwkJCQkJCQlfX3Jlc3VsdF9sZW4sCisJCQkJCQkJX19iYXNlLT4KKwkJCQkJCQlfTV9nZXRfYWxsb2NhdG9yKCkpOworI2VuZGlmCisJICAgIHJldHVybiBfX3Jlc3VsdDsKKwkgIH0KKwljYXNlIF9fZGV0YWlsOjpfU19zdWJzdHJpbmdmbjoKKwkgIC8vIEF2b2lkIGludHJvZHVjaW5nIG11bHRpcGxlIGxheWVycyBvZiBzdWJzdHJpbmcgbm9kZXMuCisJICB7CisJICAgIF9Sb3BlU3Vic3RyaW5nKiBfX29sZCA9IChfUm9wZVN1YnN0cmluZyopX19iYXNlOworCSAgICBzaXplX3QgX19yZXN1bHRfbGVuOworCSAgICBpZiAoX19zdGFydCA+PSBfX2Fkal9lbmRwMSkKKwkgICAgICByZXR1cm4gMDsKKwkgICAgX19yZXN1bHRfbGVuID0gX19hZGpfZW5kcDEgLSBfX3N0YXJ0OworCSAgICBpZiAoX19yZXN1bHRfbGVuID4gX19sYXp5X3RocmVzaG9sZCkKKwkgICAgICB7CisJCV9Sb3BlU3Vic3RyaW5nKiBfX3Jlc3VsdCA9CisJCSAgX1NfbmV3X1JvcGVTdWJzdHJpbmcoX19vbGQtPl9NX2Jhc2UsCisJCQkJICAgICAgIF9fc3RhcnQgKyBfX29sZC0+X01fc3RhcnQsCisJCQkJICAgICAgIF9fYWRqX2VuZHAxIC0gX19zdGFydCwKKwkJCQkgICAgICAgX19iYXNlLT5fTV9nZXRfYWxsb2NhdG9yKCkpOworCQlyZXR1cm4gX19yZXN1bHQ7CisJCQorCSAgICAgIH0gLy8gKioqIGVsc2UgZmFsbCB0aHJvdWdoOiAqKioKKwkgIH0KKwljYXNlIF9fZGV0YWlsOjpfU19mdW5jdGlvbjoKKwkgIHsKKwkgICAgX1JvcGVGdW5jdGlvbiogX19mID0gKF9Sb3BlRnVuY3Rpb24qKV9fYmFzZTsKKwkgICAgX0NoYXJUKiBfX3NlY3Rpb247CisJICAgIHNpemVfdCBfX3Jlc3VsdF9sZW47CisJICAgIGlmIChfX3N0YXJ0ID49IF9fYWRqX2VuZHAxKQorCSAgICAgIHJldHVybiAwOworCSAgICBfX3Jlc3VsdF9sZW4gPSBfX2Fkal9lbmRwMSAtIF9fc3RhcnQ7CisJICAgIAorCSAgICBpZiAoX19yZXN1bHRfbGVuID4gX19sYXp5X3RocmVzaG9sZCkKKwkgICAgICBnb3RvIGxhenk7CisJICAgIF9fc2VjdGlvbiA9IChfQ2hhclQqKQorCSAgICAgIHJvcGU6Ol9EYXRhX2FsbG9jYXRlKF9TX3JvdW5kZWRfdXBfc2l6ZShfX3Jlc3VsdF9sZW4pKTsKKwkgICAgX190cnkKKwkgICAgICB7CSgqKF9fZi0+X01fZm4pKShfX3N0YXJ0LCBfX3Jlc3VsdF9sZW4sIF9fc2VjdGlvbik7IH0KKwkgICAgX19jYXRjaCguLi4pCisJICAgICAgeworCQlfUm9wZVJlcDo6X19TVExfRlJFRV9TVFJJTkcoX19zZWN0aW9uLCBfX3Jlc3VsdF9sZW4sCisJCQkJCSAgICBfX2Jhc2UtPl9NX2dldF9hbGxvY2F0b3IoKSk7CisJCV9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICAgIH0KKwkgICAgX1NfY29uZF9zdG9yZV9lb3MoX19zZWN0aW9uW19fcmVzdWx0X2xlbl0pOworCSAgICByZXR1cm4gX1NfbmV3X1JvcGVMZWFmKF9fc2VjdGlvbiwgX19yZXN1bHRfbGVuLAorCQkJCSAgIF9fYmFzZS0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgIH0KKwl9CisgICAgbGF6eToKKyAgICAgIHsKKwkvLyBDcmVhdGUgc3Vic3RyaW5nIG5vZGUuCisJcmV0dXJuIF9TX25ld19Sb3BlU3Vic3RyaW5nKF9fYmFzZSwgX19zdGFydCwgX19hZGpfZW5kcDEgLSBfX3N0YXJ0LAorCQkJCSAgICBfX2Jhc2UtPl9NX2dldF9hbGxvY2F0b3IoKSk7CisgICAgICB9CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVD4KKyAgICBjbGFzcyBfUm9wZV9mbGF0dGVuX2NoYXJfY29uc3VtZXIKKyAgICA6IHB1YmxpYyBfUm9wZV9jaGFyX2NvbnN1bWVyPF9DaGFyVD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIF9DaGFyVCogX01fYnVmX3B0cjsKKyAgICBwdWJsaWM6CisgICAgICAKKyAgICAgIF9Sb3BlX2ZsYXR0ZW5fY2hhcl9jb25zdW1lcihfQ2hhclQqIF9fYnVmZmVyKQorICAgICAgeyBfTV9idWZfcHRyID0gX19idWZmZXI7IH07CisKKyAgICAgIH5fUm9wZV9mbGF0dGVuX2NoYXJfY29uc3VtZXIoKSB7fQorICAgICAgCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9DaGFyVCogX19sZWFmLCBzaXplX3QgX19uKQorICAgICAgeworCXVuaW5pdGlhbGl6ZWRfY29weV9uKF9fbGVhZiwgX19uLCBfTV9idWZfcHRyKTsKKwlfTV9idWZfcHRyICs9IF9fbjsKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVD4KKyAgICBjbGFzcyBfUm9wZV9maW5kX2NoYXJfY2hhcl9jb25zdW1lcgorICAgIDogcHVibGljIF9Sb3BlX2NoYXJfY29uc3VtZXI8X0NoYXJUPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgX0NoYXJUIF9NX3BhdHRlcm47CisgICAgcHVibGljOgorICAgICAgc2l6ZV90IF9NX2NvdW50OyAgLy8gTnVtYmVyIG9mIG5vbm1hdGNoaW5nIGNoYXJhY3RlcnMKKyAgICAgIAorICAgICAgX1JvcGVfZmluZF9jaGFyX2NoYXJfY29uc3VtZXIoX0NoYXJUIF9fcCkKKyAgICAgIDogX01fcGF0dGVybihfX3ApLCBfTV9jb3VudCgwKSB7fQorCQorICAgICAgfl9Sb3BlX2ZpbmRfY2hhcl9jaGFyX2NvbnN1bWVyKCkge30KKyAgICAgIAorICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQ2hhclQqIF9fbGVhZiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlzaXplX3QgX19pOworCWZvciAoX19pID0gMDsgX19pIDwgX19uOyBfX2krKykKKwkgIHsKKwkgICAgaWYgKF9fbGVhZltfX2ldID09IF9NX3BhdHRlcm4pCisJICAgICAgeworCQlfTV9jb3VudCArPSBfX2k7CisJCXJldHVybiBmYWxzZTsKKwkgICAgICB9CisJICB9CisJX01fY291bnQgKz0gX19uOyByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgLy8gSGVyZSBfQ2hhclQgaXMgYm90aCB0aGUgc3RyZWFtIGFuZCByb3BlIGNoYXJhY3RlciB0eXBlLgorICAgIGNsYXNzIF9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyCisgICAgOiBwdWJsaWMgX1JvcGVfY2hhcl9jb25zdW1lcjxfQ2hhclQ+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULF9UcmFpdHM+IF9JbnNlcnRfb3N0cmVhbTsKKyAgICAgIF9JbnNlcnRfb3N0cmVhbSYgX01fbzsKKyAgICBwdWJsaWM6CisgICAgICBfUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcihfSW5zZXJ0X29zdHJlYW0mIF9fd3JpdGVyKQorCTogX01fbyhfX3dyaXRlcikge307CisgICAgICB+X1JvcGVfaW5zZXJ0X2NoYXJfY29uc3VtZXIoKSB7IH07CisgICAgICAvLyBDYWxsZXIgaXMgcHJlc3VtZWQgdG8gb3duIHRoZSBvc3RyZWFtCisgICAgICBib29sIG9wZXJhdG9yKCkgKGNvbnN0IF9DaGFyVCogX19sZWFmLCBzaXplX3QgX19uKTsKKyAgICAgIC8vIFJldHVybnMgdHJ1ZSB0byBjb250aW51ZSB0cmF2ZXJzYWwuCisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgICAgYm9vbAorICAgIF9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIG9wZXJhdG9yKCkoY29uc3QgX0NoYXJUKiBfX2xlYWYsIHNpemVfdCBfX24pCisgICAgeworICAgICAgc2l6ZV90IF9faTsKKyAgICAgIC8vICBXZSBhc3N1bWUgdGhhdCBmb3JtYXR0aW5nIGlzIHNldCB1cCBjb3JyZWN0bHkgZm9yIGVhY2ggZWxlbWVudC4KKyAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19uOyBfX2krKykKKwlfTV9vLnB1dChfX2xlYWZbX19pXSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGJvb2wKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfYXBwbHlfdG9fcGllY2VzKF9Sb3BlX2NoYXJfY29uc3VtZXI8X0NoYXJUPiYgX19jLAorCQkgICAgICAgY29uc3QgX1JvcGVSZXAqIF9fciwgc2l6ZV90IF9fYmVnaW4sIHNpemVfdCBfX2VuZCkKKyAgICB7CisgICAgICBpZiAoMCA9PSBfX3IpCisJcmV0dXJuIHRydWU7CisgICAgICBzd2l0Y2goX19yLT5fTV90YWcpCisJeworCWNhc2UgX19kZXRhaWw6Ol9TX2NvbmNhdDoKKwkgIHsKKwkgICAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX2NvbmMgPSAoX1JvcGVDb25jYXRlbmF0aW9uKilfX3I7CisJICAgIF9Sb3BlUmVwKiBfX2xlZnQgPSAgX19jb25jLT5fTV9sZWZ0OworCSAgICBzaXplX3QgX19sZWZ0X2xlbiA9IF9fbGVmdC0+X01fc2l6ZTsKKwkgICAgaWYgKF9fYmVnaW4gPCBfX2xlZnRfbGVuKQorCSAgICAgIHsKKwkJc2l6ZV90IF9fbGVmdF9lbmQgPSBzdGQ6Om1pbihfX2xlZnRfbGVuLCBfX2VuZCk7CisJCWlmICghX1NfYXBwbHlfdG9fcGllY2VzKF9fYywgX19sZWZ0LCBfX2JlZ2luLCBfX2xlZnRfZW5kKSkKKwkJICByZXR1cm4gZmFsc2U7CisJICAgICAgfQorCSAgICBpZiAoX19lbmQgPiBfX2xlZnRfbGVuKQorCSAgICAgIHsKKwkJX1JvcGVSZXAqIF9fcmlnaHQgPSAgX19jb25jLT5fTV9yaWdodDsKKwkJc2l6ZV90IF9fcmlnaHRfc3RhcnQgPSBzdGQ6Om1heChfX2xlZnRfbGVuLCBfX2JlZ2luKTsKKwkJaWYgKCFfU19hcHBseV90b19waWVjZXMoX19jLCBfX3JpZ2h0LAorCQkJCQlfX3JpZ2h0X3N0YXJ0IC0gX19sZWZ0X2xlbiwKKwkJCQkJX19lbmQgLSBfX2xlZnRfbGVuKSkKKwkJICByZXR1cm4gZmFsc2U7CisJICAgICAgfQorCSAgfQorCSAgcmV0dXJuIHRydWU7CisJY2FzZSBfX2RldGFpbDo6X1NfbGVhZjoKKwkgIHsKKwkgICAgX1JvcGVMZWFmKiBfX2wgPSAoX1JvcGVMZWFmKilfX3I7CisJICAgIHJldHVybiBfX2MoX19sLT5fTV9kYXRhICsgX19iZWdpbiwgX19lbmQgLSBfX2JlZ2luKTsKKwkgIH0KKwljYXNlIF9fZGV0YWlsOjpfU19mdW5jdGlvbjoKKwljYXNlIF9fZGV0YWlsOjpfU19zdWJzdHJpbmdmbjoKKwkgICAgeworCSAgICAgIF9Sb3BlRnVuY3Rpb24qIF9fZiA9IChfUm9wZUZ1bmN0aW9uKilfX3I7CisJICAgICAgc2l6ZV90IF9fbGVuID0gX19lbmQgLSBfX2JlZ2luOworCSAgICAgIGJvb2wgX19yZXN1bHQ7CisJICAgICAgX0NoYXJUKiBfX2J1ZmZlciA9CisJCShfQ2hhclQqKV9BbGxvYygpLmFsbG9jYXRlKF9fbGVuICogc2l6ZW9mKF9DaGFyVCkpOworCSAgICAgIF9fdHJ5CisJCXsKKwkJICAoKihfX2YtPl9NX2ZuKSkoX19iZWdpbiwgX19sZW4sIF9fYnVmZmVyKTsKKwkJICBfX3Jlc3VsdCA9IF9fYyhfX2J1ZmZlciwgX19sZW4pOworICAgICAgICAgICAgICAgICAgX0FsbG9jKCkuZGVhbGxvY2F0ZShfX2J1ZmZlciwgX19sZW4gKiBzaXplb2YoX0NoYXJUKSk7CisgICAgICAgICAgICAgICAgfQorCSAgICAgIF9fY2F0Y2goLi4uKQorCQl7CisJCSAgX0FsbG9jKCkuZGVhbGxvY2F0ZShfX2J1ZmZlciwgX19sZW4gKiBzaXplb2YoX0NoYXJUKSk7CisJCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJCX0KKwkgICAgICByZXR1cm4gX19yZXN1bHQ7CisJICAgIH0KKwlkZWZhdWx0OgorCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIGlubGluZSB2b2lkCisgICAgX1JvcGVfZmlsbChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fbywgc2l6ZV90IF9fbikKKyAgICB7CisgICAgICBjaGFyIF9fZiA9IF9fby5maWxsKCk7CisgICAgICBzaXplX3QgX19pOworICAgICAgCisgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fbjsgX19pKyspCisJX19vLnB1dChfX2YpOworICAgIH0KKworCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBfUm9wZV9pc19zaW1wbGUoX0NoYXJUKikKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCisgIGlubGluZSBib29sCisgIF9Sb3BlX2lzX3NpbXBsZShjaGFyKikKKyAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIGlubGluZSBib29sCisgIF9Sb3BlX2lzX3NpbXBsZSh3Y2hhcl90KikKKyAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vLAorCSAgICAgICBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19yKQorICAgIHsKKyAgICAgIHNpemVfdCBfX3cgPSBfX28ud2lkdGgoKTsKKyAgICAgIGJvb2wgX19sZWZ0ID0gYm9vbChfX28uZmxhZ3MoKSAmIHN0ZDo6aW9zOjpsZWZ0KTsKKyAgICAgIHNpemVfdCBfX3BhZF9sZW47CisgICAgICBzaXplX3QgX19yb3BlX2xlbiA9IF9fci5zaXplKCk7CisgICAgICBfUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcjxfQ2hhclQsIF9UcmFpdHM+IF9fYyhfX28pOworICAgICAgYm9vbCBfX2lzX3NpbXBsZSA9IF9Sb3BlX2lzX3NpbXBsZSgoX0NoYXJUKikwKTsKKyAgICAgIAorICAgICAgaWYgKF9fcm9wZV9sZW4gPCBfX3cpCisJX19wYWRfbGVuID0gX193IC0gX19yb3BlX2xlbjsKKyAgICAgIGVsc2UKKwlfX3BhZF9sZW4gPSAwOworCisgICAgICBpZiAoIV9faXNfc2ltcGxlKQorCV9fby53aWR0aChfX3cgLyBfX3JvcGVfbGVuKTsKKyAgICAgIF9fdHJ5CisJeworCSAgaWYgKF9faXNfc2ltcGxlICYmICFfX2xlZnQgJiYgX19wYWRfbGVuID4gMCkKKwkgICAgX1JvcGVfZmlsbChfX28sIF9fcGFkX2xlbik7CisJICBfX3IuYXBwbHlfdG9fcGllY2VzKDAsIF9fci5zaXplKCksIF9fYyk7CisJICBpZiAoX19pc19zaW1wbGUgJiYgX19sZWZ0ICYmIF9fcGFkX2xlbiA+IDApCisJICAgIF9Sb3BlX2ZpbGwoX19vLCBfX3BhZF9sZW4pOworCSAgaWYgKCFfX2lzX3NpbXBsZSkKKwkgICAgX19vLndpZHRoKF9fdyk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgaWYgKCFfX2lzX3NpbXBsZSkKKwkgICAgX19vLndpZHRoKF9fdyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgICByZXR1cm4gX19vOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgX0NoYXJUKgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19mbGF0dGVuKF9Sb3BlUmVwKiBfX3IsIHNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19sZW4sCisJICAgICAgIF9DaGFyVCogX19idWZmZXIpCisgICAgeworICAgICAgX1JvcGVfZmxhdHRlbl9jaGFyX2NvbnN1bWVyPF9DaGFyVD4gX19jKF9fYnVmZmVyKTsKKyAgICAgIF9TX2FwcGx5X3RvX3BpZWNlcyhfX2MsIF9fciwgX19zdGFydCwgX19zdGFydCArIF9fbGVuKTsKKyAgICAgIHJldHVybihfX2J1ZmZlciArIF9fbGVuKTsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHNpemVfdAorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBmaW5kKF9DaGFyVCBfX3BhdHRlcm4sIHNpemVfdCBfX3N0YXJ0KSBjb25zdAorICAgIHsKKyAgICAgIF9Sb3BlX2ZpbmRfY2hhcl9jaGFyX2NvbnN1bWVyPF9DaGFyVD4gX19jKF9fcGF0dGVybik7CisgICAgICBfU19hcHBseV90b19waWVjZXMoX19jLCB0aGlzLT5fTV90cmVlX3B0ciwgX19zdGFydCwgc2l6ZSgpKTsKKyAgICAgIHNpemVfdHlwZSBfX3Jlc3VsdF9wb3MgPSBfX3N0YXJ0ICsgX19jLl9NX2NvdW50OworI2lmbmRlZiBfX1NUTF9PTERfUk9QRV9TRU1BTlRJQ1MKKyAgICAgIGlmIChfX3Jlc3VsdF9wb3MgPT0gc2l6ZSgpKQorCV9fcmVzdWx0X3BvcyA9IG5wb3M7CisjZW5kaWYKKyAgICAgIHJldHVybiBfX3Jlc3VsdF9wb3M7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfQ2hhclQqCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2ZsYXR0ZW4oX1JvcGVSZXAqIF9fciwgX0NoYXJUKiBfX2J1ZmZlcikKKyAgICB7CisgICAgICBpZiAoMCA9PSBfX3IpCisJcmV0dXJuIF9fYnVmZmVyOworICAgICAgc3dpdGNoKF9fci0+X01fdGFnKQorCXsKKwljYXNlIF9fZGV0YWlsOjpfU19jb25jYXQ6CisJICB7CisJICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jID0gKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19yOworCSAgICBfUm9wZVJlcCogX19sZWZ0ID0gX19jLT5fTV9sZWZ0OworCSAgICBfUm9wZVJlcCogX19yaWdodCA9IF9fYy0+X01fcmlnaHQ7CisJICAgIF9DaGFyVCogX19yZXN0ID0gX1NfZmxhdHRlbihfX2xlZnQsIF9fYnVmZmVyKTsKKwkgICAgcmV0dXJuIF9TX2ZsYXR0ZW4oX19yaWdodCwgX19yZXN0KTsKKwkgIH0KKwljYXNlIF9fZGV0YWlsOjpfU19sZWFmOgorCSAgeworCSAgICBfUm9wZUxlYWYqIF9fbCA9IChfUm9wZUxlYWYqKV9fcjsKKwkgICAgcmV0dXJuIGNvcHlfbihfX2wtPl9NX2RhdGEsIF9fbC0+X01fc2l6ZSwgX19idWZmZXIpLnNlY29uZDsKKwkgIH0KKwljYXNlIF9fZGV0YWlsOjpfU19mdW5jdGlvbjoKKwljYXNlIF9fZGV0YWlsOjpfU19zdWJzdHJpbmdmbjoKKwkgIC8vIFdlIGRvbid0IHlldCBkbyBhbnl0aGluZyB3aXRoIHN1YnN0cmluZyBub2Rlcy4KKwkgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQgYmVmb3JlIHJvcGVmaWxlcyB3aWxsIHdvcmsgd2VsbC4KKwkgIHsKKwkgICAgX1JvcGVGdW5jdGlvbiogX19mID0gKF9Sb3BlRnVuY3Rpb24qKV9fcjsKKwkgICAgKCooX19mLT5fTV9mbikpKDAsIF9fZi0+X01fc2l6ZSwgX19idWZmZXIpOworCSAgICByZXR1cm4gX19idWZmZXIgKyBfX2YtPl9NX3NpemU7CisJICB9CisJZGVmYXVsdDoKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgLy8gVGhpcyBuZWVkcyB3b3JrIGZvciBfQ2hhclQgIT0gY2hhcgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19kdW1wKF9Sb3BlUmVwKiBfX3IsIGludCBfX2luZGVudCkKKyAgICB7CisgICAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX2luZGVudDsgX19pKyspCisJcHV0Y2hhcignICcpOworICAgICAgaWYgKDAgPT0gX19yKQorCXsKKwkgIHByaW50ZigiTlVMTFxuIik7CisJICByZXR1cm47CisJfQorICAgICAgaWYgKF9TX2NvbmNhdCA9PSBfX3ItPl9NX3RhZykKKwl7CisJICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyA9IChfUm9wZUNvbmNhdGVuYXRpb24qKV9fcjsKKwkgIF9Sb3BlUmVwKiBfX2xlZnQgPSBfX2MtPl9NX2xlZnQ7CisJICBfUm9wZVJlcCogX19yaWdodCA9IF9fYy0+X01fcmlnaHQ7CisJICAKKyNpZmRlZiBfX0dDCisJICBwcmludGYoIkNvbmNhdGVuYXRpb24gJXAgKGRlcHRoID0gJWQsIGxlbiA9ICVsZCwgJXMgYmFsYW5jZWQpXG4iLAorCQkgX19yLCBfX3ItPl9NX2RlcHRoLCBfX3ItPl9NX3NpemUsCisJCSBfX3ItPl9NX2lzX2JhbGFuY2VkPyAiIiA6ICJub3QiKTsKKyNlbHNlCisJICBwcmludGYoIkNvbmNhdGVuYXRpb24gJXAgKHJjID0gJWxkLCBkZXB0aCA9ICVkLCAiCisJCSAibGVuID0gJWxkLCAlcyBiYWxhbmNlZClcbiIsCisJCSBfX3IsIF9fci0+X01fcmVmX2NvdW50LCBfX3ItPl9NX2RlcHRoLCBfX3ItPl9NX3NpemUsCisJCSBfX3ItPl9NX2lzX2JhbGFuY2VkPyAiIiA6ICJub3QiKTsKKyNlbmRpZgorCSAgX1NfZHVtcChfX2xlZnQsIF9faW5kZW50ICsgMik7CisJICBfU19kdW1wKF9fcmlnaHQsIF9faW5kZW50ICsgMik7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNoYXIqIF9fa2luZDsKKwkgIAorCSAgc3dpdGNoIChfX3ItPl9NX3RhZykKKwkgICAgeworCSAgICBjYXNlIF9fZGV0YWlsOjpfU19sZWFmOgorCSAgICAgIF9fa2luZCA9ICJMZWFmIjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJICAgICAgX19raW5kID0gIkZ1bmN0aW9uIjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBfX2RldGFpbDo6X1Nfc3Vic3RyaW5nZm46CisJICAgICAgX19raW5kID0gIkZ1bmN0aW9uIHJlcHJlc2VudGluZyBzdWJzdHJpbmciOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIF9fa2luZCA9ICIoY29ycnVwdGVkIGtpbmQgZmllbGQhKSI7CisJICAgIH0KKyNpZmRlZiBfX0dDCisJICBwcmludGYoIiVzICVwIChkZXB0aCA9ICVkLCBsZW4gPSAlbGQpICIsCisJCSBfX2tpbmQsIF9fciwgX19yLT5fTV9kZXB0aCwgX19yLT5fTV9zaXplKTsKKyNlbHNlCisJICBwcmludGYoIiVzICVwIChyYyA9ICVsZCwgZGVwdGggPSAlZCwgbGVuID0gJWxkKSAiLAorCQkgX19raW5kLCBfX3IsIF9fci0+X01fcmVmX2NvdW50LCBfX3ItPl9NX2RlcHRoLCBfX3ItPl9NX3NpemUpOworI2VuZGlmCisJICBpZiAoX1NfaXNfb25lX2J5dGVfY2hhcl90eXBlKChfQ2hhclQqKTApKQorCSAgICB7CisJICAgICAgY29uc3QgaW50IF9fbWF4X2xlbiA9IDQwOworCSAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX3ByZWZpeChfU19zdWJzdHJpbmcoX19yLCAwLCBfX21heF9sZW4pKTsKKwkgICAgICBfQ2hhclQgX19idWZmZXJbX19tYXhfbGVuICsgMV07CisJICAgICAgYm9vbCBfX3Rvb19iaWcgPSBfX3ItPl9NX3NpemUgPiBfX3ByZWZpeC0+X01fc2l6ZTsKKwkgICAgICAKKwkgICAgICBfU19mbGF0dGVuKF9fcHJlZml4LCBfX2J1ZmZlcik7CisJICAgICAgX19idWZmZXJbX19wcmVmaXgtPl9NX3NpemVdID0gX1NfZW9zKChfQ2hhclQqKTApOworCSAgICAgIHByaW50ZigiJXMlc1xuIiwgKGNoYXIqKV9fYnVmZmVyLAorCQkgICAgIF9fdG9vX2JpZz8gIi4uLlxuIiA6ICJcbiIpOworCSAgICB9CisJICBlbHNlCisJICAgIHByaW50ZigiXG4iKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjb25zdCB1bnNpZ25lZCBsb25nCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX21pbl9sZW5baW50KF9fZGV0YWlsOjpfU19tYXhfcm9wZV9kZXB0aCkgKyAxXSA9IHsKKyAgICAgIC8qIDAgKi8xLCAvKiAxICovMiwgLyogMiAqLzMsIC8qIDMgKi81LCAvKiA0ICovOCwgLyogNSAqLzEzLCAvKiA2ICovMjEsCisgICAgICAvKiA3ICovMzQsIC8qIDggKi81NSwgLyogOSAqLzg5LCAvKiAxMCAqLzE0NCwgLyogMTEgKi8yMzMsIC8qIDEyICovMzc3LAorICAgICAgLyogMTMgKi82MTAsIC8qIDE0ICovOTg3LCAvKiAxNSAqLzE1OTcsIC8qIDE2ICovMjU4NCwgLyogMTcgKi80MTgxLAorICAgICAgLyogMTggKi82NzY1LCAvKiAxOSAqLzEwOTQ2LCAvKiAyMCAqLzE3NzExLCAvKiAyMSAqLzI4NjU3LCAvKiAyMiAqLzQ2MzY4LAorICAgICAgLyogMjMgKi83NTAyNSwgLyogMjQgKi8xMjEzOTMsIC8qIDI1ICovMTk2NDE4LCAvKiAyNiAqLzMxNzgxMSwKKyAgICAgIC8qIDI3ICovNTE0MjI5LCAvKiAyOCAqLzgzMjA0MCwgLyogMjkgKi8xMzQ2MjY5LCAvKiAzMCAqLzIxNzgzMDksCisgICAgICAvKiAzMSAqLzM1MjQ1NzgsIC8qIDMyICovNTcwMjg4NywgLyogMzMgKi85MjI3NDY1LCAvKiAzNCAqLzE0OTMwMzUyLAorICAgICAgLyogMzUgKi8yNDE1NzgxNywgLyogMzYgKi8zOTA4ODE2OSwgLyogMzcgKi82MzI0NTk4NiwgLyogMzggKi8xMDIzMzQxNTUsCisgICAgICAvKiAzOSAqLzE2NTU4MDE0MSwgLyogNDAgKi8yNjc5MTQyOTYsIC8qIDQxICovNDMzNDk0NDM3LAorICAgICAgLyogNDIgKi83MDE0MDg3MzMsIC8qIDQzICovMTEzNDkwMzE3MCwgLyogNDQgKi8xODM2MzExOTAzLAorICAgICAgLyogNDUgKi8yOTcxMjE1MDczdSB9OworICAvLyBUaGVzZSBhcmUgRmlib25hY2NpIG51bWJlcnMgPCAyKiozMi4KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdHlwZW5hbWUgcm9wZTxfQ2hhclQsIF9BbGxvYz46Ol9Sb3BlUmVwKgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19iYWxhbmNlKF9Sb3BlUmVwKiBfX3IpCisgICAgeworICAgICAgX1JvcGVSZXAqIF9fZm9yZXN0W2ludChfX2RldGFpbDo6X1NfbWF4X3JvcGVfZGVwdGgpICsgMV07CisgICAgICBfUm9wZVJlcCogX19yZXN1bHQgPSAwOworICAgICAgaW50IF9faTsKKyAgICAgIC8vIEludmFyaWFudDoKKyAgICAgIC8vIFRoZSBjb25jYXRlbmF0aW9uIG9mIGZvcmVzdCBpbiBkZXNjZW5kaW5nIG9yZGVyIGlzIGVxdWFsIHRvIF9fci4KKyAgICAgIC8vIF9fZm9yZXN0W19faV0uX01fc2l6ZSA+PSBfU19taW5fbGVuW19faV0KKyAgICAgIC8vIF9fZm9yZXN0W19faV0uX01fZGVwdGggPSBfX2kKKyAgICAgIC8vIFJlZmVyZW5jZXMgZnJvbSBmb3Jlc3QgYXJlIGluY2x1ZGVkIGluIHJlZmNvdW50LgorICAgICAgCisgICAgICBmb3IgKF9faSA9IDA7IF9faSA8PSBpbnQoX19kZXRhaWw6Ol9TX21heF9yb3BlX2RlcHRoKTsgKytfX2kpCisJX19mb3Jlc3RbX19pXSA9IDA7CisgICAgICBfX3RyeQorCXsKKwkgIF9TX2FkZF90b19mb3Jlc3QoX19yLCBfX2ZvcmVzdCk7CisJICBmb3IgKF9faSA9IDA7IF9faSA8PSBpbnQoX19kZXRhaWw6Ol9TX21heF9yb3BlX2RlcHRoKTsgKytfX2kpCisJICAgIGlmICgwICE9IF9fZm9yZXN0W19faV0pCisJICAgICAgeworI2lmbmRlZiBfX0dDCisJCV9TZWxmX2Rlc3RydWN0X3B0ciBfX29sZChfX3Jlc3VsdCk7CisjZW5kaWYKKwkJX19yZXN1bHQgPSBfU19jb25jYXQoX19mb3Jlc3RbX19pXSwgX19yZXN1bHQpOworCQlfX2ZvcmVzdFtfX2ldLT5fTV91bnJlZl9ub25uaWwoKTsKKyNpZiAhZGVmaW5lZChfX0dDKSAmJiBkZWZpbmVkKF9fRVhDRVBUSU9OUykKKwkJX19mb3Jlc3RbX19pXSA9IDA7CisjZW5kaWYKKwkgICAgICB9CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgZm9yKF9faSA9IDA7IF9faSA8PSBpbnQoX19kZXRhaWw6Ol9TX21heF9yb3BlX2RlcHRoKTsgX19pKyspCisJICAgIF9TX3VucmVmKF9fZm9yZXN0W19faV0pOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgCisgICAgICBpZiAoX19yZXN1bHQtPl9NX2RlcHRoID4gaW50KF9fZGV0YWlsOjpfU19tYXhfcm9wZV9kZXB0aCkpCisJX190aHJvd19sZW5ndGhfZXJyb3IoX19OKCJyb3BlOjpfU19iYWxhbmNlIikpOworICAgICAgcmV0dXJuKF9fcmVzdWx0KTsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfYWRkX3RvX2ZvcmVzdChfUm9wZVJlcCogX19yLCBfUm9wZVJlcCoqIF9fZm9yZXN0KQorICAgIHsKKyAgICAgIGlmIChfX3ItPl9NX2lzX2JhbGFuY2VkKQorCXsKKwkgIF9TX2FkZF9sZWFmX3RvX2ZvcmVzdChfX3IsIF9fZm9yZXN0KTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIHsKKwlfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyA9IChfUm9wZUNvbmNhdGVuYXRpb24qKV9fcjsKKwkKKwlfU19hZGRfdG9fZm9yZXN0KF9fYy0+X01fbGVmdCwgX19mb3Jlc3QpOworCV9TX2FkZF90b19mb3Jlc3QoX19jLT5fTV9yaWdodCwgX19mb3Jlc3QpOworICAgICAgfQorICAgIH0KKworCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB2b2lkCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2FkZF9sZWFmX3RvX2ZvcmVzdChfUm9wZVJlcCogX19yLCBfUm9wZVJlcCoqIF9fZm9yZXN0KQorICAgIHsKKyAgICAgIF9Sb3BlUmVwKiBfX2luc2VydGVlOwkJLy8gaW5jbHVkZWQgaW4gcmVmY291bnQKKyAgICAgIF9Sb3BlUmVwKiBfX3Rvb190aW55ID0gMDsJCS8vIGluY2x1ZGVkIGluIHJlZmNvdW50CisgICAgICBpbnQgX19pOwkJCQkvLyBmb3Jlc3RbMC4uX19pLTFdIGlzIGVtcHR5CisgICAgICBzaXplX3QgX19zID0gX19yLT5fTV9zaXplOworICAgICAgCisgICAgICBmb3IgKF9faSA9IDA7IF9fcyA+PSBfU19taW5fbGVuW19faSsxXS8qIG5vdCB0aGlzIGJ1Y2tldCAqLzsgKytfX2kpCisJeworCSAgaWYgKDAgIT0gX19mb3Jlc3RbX19pXSkKKwkgICAgeworI2lmbmRlZiBfX0dDCisJICAgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fb2xkKF9fdG9vX3RpbnkpOworI2VuZGlmCisJICAgICAgX190b29fdGlueSA9IF9TX2NvbmNhdF9hbmRfc2V0X2JhbGFuY2VkKF9fZm9yZXN0W19faV0sCisJCQkJCQkgICAgICBfX3Rvb190aW55KTsKKwkgICAgICBfX2ZvcmVzdFtfX2ldLT5fTV91bnJlZl9ub25uaWwoKTsKKwkgICAgICBfX2ZvcmVzdFtfX2ldID0gMDsKKwkgICAgfQorCX0KKyAgICAgIHsKKyNpZm5kZWYgX19HQworCV9TZWxmX2Rlc3RydWN0X3B0ciBfX29sZChfX3Rvb190aW55KTsKKyNlbmRpZgorCV9faW5zZXJ0ZWUgPSBfU19jb25jYXRfYW5kX3NldF9iYWxhbmNlZChfX3Rvb190aW55LCBfX3IpOworICAgICAgfQorICAgICAgLy8gVG9vX3RpbnkgZGVhZCwgYW5kIG5vIGxvbmdlciBpbmNsdWRlZCBpbiByZWZjb3VudC4KKyAgICAgIC8vIEluc2VydGVlIGlzIGxpdmUgYW5kIGluY2x1ZGVkLgorICAgICAgZm9yICg7OyArK19faSkKKwl7CisJICBpZiAoMCAhPSBfX2ZvcmVzdFtfX2ldKQorCSAgICB7CisjaWZuZGVmIF9fR0MKKwkgICAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19vbGQoX19pbnNlcnRlZSk7CisjZW5kaWYKKwkgICAgICBfX2luc2VydGVlID0gX1NfY29uY2F0X2FuZF9zZXRfYmFsYW5jZWQoX19mb3Jlc3RbX19pXSwKKwkJCQkJCSAgICAgIF9faW5zZXJ0ZWUpOworCSAgICAgIF9fZm9yZXN0W19faV0tPl9NX3VucmVmX25vbm5pbCgpOworCSAgICAgIF9fZm9yZXN0W19faV0gPSAwOworCSAgICB9CisJICBpZiAoX19pID09IGludChfX2RldGFpbDo6X1NfbWF4X3JvcGVfZGVwdGgpCisJICAgICAgfHwgX19pbnNlcnRlZS0+X01fc2l6ZSA8IF9TX21pbl9sZW5bX19pKzFdKQorCSAgICB7CisJICAgICAgX19mb3Jlc3RbX19pXSA9IF9faW5zZXJ0ZWU7CisJICAgICAgLy8gcmVmY291bnQgaXMgT0sgc2luY2UgX19pbnNlcnRlZSBpcyBub3cgZGVhZC4KKwkgICAgICByZXR1cm47CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfQ2hhclQKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfZmV0Y2goX1JvcGVSZXAqIF9fciwgc2l6ZV90eXBlIF9faSkKKyAgICB7CisgICAgICBfX0dDX0NPTlNUIF9DaGFyVCogX19jc3RyID0gX19yLT5fTV9jX3N0cmluZzsKKyAgICAgIAorICAgICAgaWYgKDAgIT0gX19jc3RyKQorCXJldHVybiBfX2NzdHJbX19pXTsKKyAgICAgIGZvcig7OykKKwl7CisJICBzd2l0Y2goX19yLT5fTV90YWcpCisJICAgIHsKKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfY29uY2F0OgorCSAgICAgIHsKKwkJX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgPSAoX1JvcGVDb25jYXRlbmF0aW9uKilfX3I7CisJCV9Sb3BlUmVwKiBfX2xlZnQgPSBfX2MtPl9NX2xlZnQ7CisJCXNpemVfdCBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplOworCQkKKwkJaWYgKF9faSA+PSBfX2xlZnRfbGVuKQorCQkgIHsKKwkJICAgIF9faSAtPSBfX2xlZnRfbGVuOworCQkgICAgX19yID0gX19jLT5fTV9yaWdodDsKKwkJICB9IAorCQllbHNlCisJCSAgX19yID0gX19sZWZ0OworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfbGVhZjoKKwkgICAgICB7CisJCV9Sb3BlTGVhZiogX19sID0gKF9Sb3BlTGVhZiopX19yOworCQlyZXR1cm4gX19sLT5fTV9kYXRhW19faV07CisJICAgICAgfQorCSAgICBjYXNlIF9fZGV0YWlsOjpfU19mdW5jdGlvbjoKKwkgICAgY2FzZSBfX2RldGFpbDo6X1Nfc3Vic3RyaW5nZm46CisJICAgICAgeworCQlfUm9wZUZ1bmN0aW9uKiBfX2YgPSAoX1JvcGVGdW5jdGlvbiopX19yOworCQlfQ2hhclQgX19yZXN1bHQ7CisJCQorCQkoKihfX2YtPl9NX2ZuKSkoX19pLCAxLCAmX19yZXN1bHQpOworCQlyZXR1cm4gX19yZXN1bHQ7CisJICAgICAgfQorCSAgICB9CisJfQorICAgIH0KKyAgCisjaWZuZGVmIF9fR0MKKyAgLy8gUmV0dXJuIGEgdW5pcXVlbHkgcmVmZXJlbmNlZCBjaGFyYWN0ZXIgc2xvdCBmb3IgdGhlIGdpdmVuCisgIC8vIHBvc2l0aW9uLCBvciAwIGlmIHRoYXQncyBub3QgcG9zc2libGUuCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfQ2hhclQqCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2ZldGNoX3B0cihfUm9wZVJlcCogX19yLCBzaXplX3R5cGUgX19pKQorICAgIHsKKyAgICAgIF9Sb3BlUmVwKiBfX2NscnN0YWNrW19fZGV0YWlsOjpfU19tYXhfcm9wZV9kZXB0aF07CisgICAgICBzaXplX3QgX19jc3B0ciA9IDA7CisgICAgICAKKyAgICAgIGZvcig7OykKKwl7CisJICBpZiAoX19yLT5fTV9yZWZfY291bnQgPiAxKQorCSAgICByZXR1cm4gMDsKKwkgIHN3aXRjaChfX3ItPl9NX3RhZykKKwkgICAgeworCSAgICBjYXNlIF9fZGV0YWlsOjpfU19jb25jYXQ6CisJICAgICAgeworCQlfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyA9IChfUm9wZUNvbmNhdGVuYXRpb24qKV9fcjsKKwkJX1JvcGVSZXAqIF9fbGVmdCA9IF9fYy0+X01fbGVmdDsKKwkJc2l6ZV90IF9fbGVmdF9sZW4gPSBfX2xlZnQtPl9NX3NpemU7CisJCQorCQlpZiAoX19jLT5fTV9jX3N0cmluZyAhPSAwKQorCQkgIF9fY2xyc3RhY2tbX19jc3B0cisrXSA9IF9fYzsKKwkJaWYgKF9faSA+PSBfX2xlZnRfbGVuKQorCQkgIHsKKwkJICAgIF9faSAtPSBfX2xlZnRfbGVuOworCQkgICAgX19yID0gX19jLT5fTV9yaWdodDsKKwkJICB9IAorCQllbHNlCisJCSAgX19yID0gX19sZWZ0OworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfbGVhZjoKKwkgICAgICB7CisJCV9Sb3BlTGVhZiogX19sID0gKF9Sb3BlTGVhZiopX19yOworCQlpZiAoX19sLT5fTV9jX3N0cmluZyAhPSBfX2wtPl9NX2RhdGEgJiYgX19sLT5fTV9jX3N0cmluZyAhPSAwKQorCQkgIF9fY2xyc3RhY2tbX19jc3B0cisrXSA9IF9fbDsKKwkJd2hpbGUgKF9fY3NwdHIgPiAwKQorCQkgIHsKKwkJICAgIC0tIF9fY3NwdHI7CisJCSAgICBfUm9wZVJlcCogX19kID0gX19jbHJzdGFja1tfX2NzcHRyXTsKKwkJICAgIF9fZC0+X01fZnJlZV9jX3N0cmluZygpOworCQkgICAgX19kLT5fTV9jX3N0cmluZyA9IDA7CisJCSAgfQorCQlyZXR1cm4gX19sLT5fTV9kYXRhICsgX19pOworCSAgICAgIH0KKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX3N1YnN0cmluZ2ZuOgorCSAgICAgIHJldHVybiAwOworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZiAvKiBfX0dDICovCisKKyAgLy8gVGhlIGZvbGxvd2luZyBjb3VsZCBiZSBpbXBsZW1lbnRlZCB0cml2aWFsbHkgdXNpbmcKKyAgLy8gbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheS4KKyAgLy8gV2UgZG8gYSBsaXR0bGUgbW9yZSB3b3JrIHRvIGF2b2lkIGRlYWxpbmcgd2l0aCByb3BlIGl0ZXJhdG9ycyBmb3IKKyAgLy8gZmxhdCBzdHJpbmdzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW50CisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2NvbXBhcmUgKGNvbnN0IF9Sb3BlUmVwKiBfX2xlZnQsIGNvbnN0IF9Sb3BlUmVwKiBfX3JpZ2h0KQorICAgIHsKKyAgICAgIHNpemVfdCBfX2xlZnRfbGVuOworICAgICAgc2l6ZV90IF9fcmlnaHRfbGVuOworICAgICAgCisgICAgICBpZiAoMCA9PSBfX3JpZ2h0KQorCXJldHVybiAwICE9IF9fbGVmdDsKKyAgICAgIGlmICgwID09IF9fbGVmdCkKKwlyZXR1cm4gLTE7CisgICAgICBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplOworICAgICAgX19yaWdodF9sZW4gPSBfX3JpZ2h0LT5fTV9zaXplOworICAgICAgaWYgKF9fZGV0YWlsOjpfU19sZWFmID09IF9fbGVmdC0+X01fdGFnKQorCXsKKwkgIF9Sb3BlTGVhZiogX19sID0gKF9Sb3BlTGVhZiopIF9fbGVmdDsKKwkgIGlmIChfX2RldGFpbDo6X1NfbGVhZiA9PSBfX3JpZ2h0LT5fTV90YWcpCisJICAgIHsKKwkgICAgICBfUm9wZUxlYWYqIF9fciA9IChfUm9wZUxlYWYqKSBfX3JpZ2h0OworCSAgICAgIHJldHVybiBsZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9fbC0+X01fZGF0YSwKKwkJCQkJCSAgX19sLT5fTV9kYXRhICsgX19sZWZ0X2xlbiwKKwkJCQkJCSAgX19yLT5fTV9kYXRhLCBfX3ItPl9NX2RhdGEKKwkJCQkJCSAgKyBfX3JpZ2h0X2xlbik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fcnN0YXJ0KF9fcmlnaHQsIDApOworCSAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fcmVuZChfX3JpZ2h0LCBfX3JpZ2h0X2xlbik7CisJICAgICAgcmV0dXJuIGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX19sLT5fTV9kYXRhLCBfX2wtPl9NX2RhdGEKKwkJCQkJCSAgKyBfX2xlZnRfbGVuLAorCQkJCQkJICBfX3JzdGFydCwgX19yZW5kKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBjb25zdF9pdGVyYXRvciBfX2xzdGFydChfX2xlZnQsIDApOworCSAgY29uc3RfaXRlcmF0b3IgX19sZW5kKF9fbGVmdCwgX19sZWZ0X2xlbik7CisJICBpZiAoX19kZXRhaWw6Ol9TX2xlYWYgPT0gX19yaWdodC0+X01fdGFnKQorCSAgICB7CisJICAgICAgX1JvcGVMZWFmKiBfX3IgPSAoX1JvcGVMZWFmKikgX19yaWdodDsKKwkgICAgICByZXR1cm4gbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfX2xzdGFydCwgX19sZW5kLAorCQkJCQkJICBfX3ItPl9NX2RhdGEsIF9fci0+X01fZGF0YQorCQkJCQkJICArIF9fcmlnaHRfbGVuKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgY29uc3RfaXRlcmF0b3IgX19yc3RhcnQoX19yaWdodCwgMCk7CisJICAgICAgY29uc3RfaXRlcmF0b3IgX19yZW5kKF9fcmlnaHQsIF9fcmlnaHRfbGVuKTsKKwkgICAgICByZXR1cm4gbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfX2xzdGFydCwgX19sZW5kLAorCQkJCQkJICBfX3JzdGFydCwgX19yZW5kKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLy8gQXNzaWdubWVudCB0byByZWZlcmVuY2UgcHJveGllcy4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiYKKyAgICBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz46OgorICAgIG9wZXJhdG9yPShfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIF9Sb3BlUmVwKiBfX29sZCA9IF9NX3Jvb3QtPl9NX3RyZWVfcHRyOworI2lmbmRlZiBfX0dDCisgICAgICAvLyBGaXJzdCBjaGVjayBmb3IgdGhlIGNhc2UgaW4gd2hpY2ggZXZlcnl0aGluZyBpcyB1bmlxdWVseQorICAgICAgLy8gcmVmZXJlbmNlZC4gIEluIHRoYXQgY2FzZSB3ZSBjYW4gZG8gdGhpcyBkZXN0cnVjdGl2ZWx5LgorICAgICAgX0NoYXJUKiBfX3B0ciA9IF9NeV9yb3BlOjpfU19mZXRjaF9wdHIoX19vbGQsIF9NX3Bvcyk7CisgICAgICBpZiAoMCAhPSBfX3B0cikKKwl7CisJICAqX19wdHIgPSBfX2M7CisJICByZXR1cm4gKnRoaXM7CisJfQorI2VuZGlmCisgICAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19sZWZ0KF9NeV9yb3BlOjpfU19zdWJzdHJpbmcoX19vbGQsIDAsIF9NX3BvcykpOworICAgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fcmlnaHQoX015X3JvcGU6Ol9TX3N1YnN0cmluZyhfX29sZCwgX01fcG9zICsgMSwKKwkJCQkJCQlfX29sZC0+X01fc2l6ZSkpOworICAgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fcmVzdWx0X2xlZnQoX015X3JvcGU6OgorCQkJCSAgICAgICBfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKF9fbGVmdCwKKwkJCQkJCQkJICZfX2MsIDEpKTsKKworICAgICAgX1JvcGVSZXAqIF9fcmVzdWx0ID0gX015X3JvcGU6Ol9TX2NvbmNhdChfX3Jlc3VsdF9sZWZ0LCBfX3JpZ2h0KTsKKyNpZm5kZWYgX19HQworICAgICAgX1JvcGVSZXA6Ol9TX3VucmVmKF9fb2xkKTsKKyNlbmRpZgorICAgICAgX01fcm9vdC0+X01fdHJlZV9wdHIgPSBfX3Jlc3VsdDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz46OgorICAgIG9wZXJhdG9yIF9DaGFyVCgpIGNvbnN0CisgICAgeworICAgICAgaWYgKF9NX2N1cnJlbnRfdmFsaWQpCisJcmV0dXJuIF9NX2N1cnJlbnQ7CisgICAgICBlbHNlCisJcmV0dXJuIF9NeV9yb3BlOjpfU19mZXRjaChfTV9yb290LT5fTV90cmVlX3B0ciwgX01fcG9zKTsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPgorICAgIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPjo6CisgICAgb3BlcmF0b3ImKCkgY29uc3QKKyAgICB7IHJldHVybiBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4oKnRoaXMpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICByb3BlKHNpemVfdCBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfQmFzZShfX2EpCisgICAgeworICAgICAgcm9wZTxfQ2hhclQsX0FsbG9jPiBfX3Jlc3VsdDsKKyAgICAgIGNvbnN0IHNpemVfdCBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQgPSAzMjsKKyAgICAgIHNpemVfdCBfX2V4cG9uZW50OworICAgICAgc2l6ZV90IF9fcmVzdDsKKyAgICAgIF9DaGFyVCogX19yZXN0X2J1ZmZlcjsKKyAgICAgIF9Sb3BlUmVwKiBfX3JlbWFpbmRlcjsKKyAgICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+IF9fcmVtYWluZGVyX3JvcGU7CisKKyAgICAgIGlmICgwID09IF9fbikKKwlyZXR1cm47CisKKyAgICAgIF9fZXhwb25lbnQgPSBfX24gLyBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQ7CisgICAgICBfX3Jlc3QgPSBfX24gJSBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQ7CisgICAgICBpZiAoMCA9PSBfX3Jlc3QpCisJX19yZW1haW5kZXIgPSAwOworICAgICAgZWxzZQorCXsKKwkgIF9fcmVzdF9idWZmZXIgPSB0aGlzLT5fRGF0YV9hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19yZXN0KSk7CisJICBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2EoX19yZXN0X2J1ZmZlciwgX19yZXN0LCBfX2MsCisJCQkJICAgX01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgIF9TX2NvbmRfc3RvcmVfZW9zKF9fcmVzdF9idWZmZXJbX19yZXN0XSk7CisJICBfX3RyeQorCSAgICB7IF9fcmVtYWluZGVyID0gX1NfbmV3X1JvcGVMZWFmKF9fcmVzdF9idWZmZXIsIF9fcmVzdCwKKwkJCQkJICAgIF9NX2dldF9hbGxvY2F0b3IoKSk7IH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX1JvcGVSZXA6Ol9fU1RMX0ZSRUVfU1RSSU5HKF9fcmVzdF9idWZmZXIsIF9fcmVzdCwKKwkJCQkJICBfTV9nZXRfYWxsb2NhdG9yKCkpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorICAgICAgX19yZW1haW5kZXJfcm9wZS5fTV90cmVlX3B0ciA9IF9fcmVtYWluZGVyOworICAgICAgaWYgKF9fZXhwb25lbnQgIT0gMCkKKwl7CisJICBfQ2hhclQqIF9fYmFzZV9idWZmZXIgPQorCSAgICB0aGlzLT5fRGF0YV9hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19leHBvbmVudGlhdGVfdGhyZXNob2xkKSk7CisJICBfUm9wZUxlYWYqIF9fYmFzZV9sZWFmOworCSAgcm9wZSBfX2Jhc2Vfcm9wZTsKKwkgIF9fdW5pbml0aWFsaXplZF9maWxsX25fYShfX2Jhc2VfYnVmZmVyLCBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQsIF9fYywKKwkJCQkgICBfTV9nZXRfYWxsb2NhdG9yKCkpOworCSAgX1NfY29uZF9zdG9yZV9lb3MoX19iYXNlX2J1ZmZlcltfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGRdKTsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBfX2Jhc2VfbGVhZiA9IF9TX25ld19Sb3BlTGVhZihfX2Jhc2VfYnVmZmVyLAorCQkJCQkgICAgX19leHBvbmVudGlhdGVfdGhyZXNob2xkLAorCQkJCQkgICAgX01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfUm9wZVJlcDo6X19TVExfRlJFRV9TVFJJTkcoX19iYXNlX2J1ZmZlciwKKwkJCQkJICBfX2V4cG9uZW50aWF0ZV90aHJlc2hvbGQsCisJCQkJCSAgX01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19iYXNlX3JvcGUuX01fdHJlZV9wdHIgPSBfX2Jhc2VfbGVhZjsKKwkgIGlmICgxID09IF9fZXhwb25lbnQpCisJICAgIF9fcmVzdWx0ID0gX19iYXNlX3JvcGU7CisJICBlbHNlCisJICAgIF9fcmVzdWx0ID0gcG93ZXIoX19iYXNlX3JvcGUsIF9fZXhwb25lbnQsCisJCQkgICAgIF9Sb3BlX0NvbmNhdF9mbjxfQ2hhclQsIF9BbGxvYz4oKSk7CisJICAgIAorCSAgaWYgKDAgIT0gX19yZW1haW5kZXIpCisJICAgIF9fcmVzdWx0ICs9IF9fcmVtYWluZGVyX3JvcGU7CisJfQorICAgICAgZWxzZQorCV9fcmVzdWx0ID0gX19yZW1haW5kZXJfcm9wZTsKKwkgIAorICAgICAgdGhpcy0+X01fdHJlZV9wdHIgPSBfX3Jlc3VsdC5fTV90cmVlX3B0cjsKKyAgICAgIHRoaXMtPl9NX3RyZWVfcHRyLT5fTV9yZWZfbm9ubmlsKCk7CisgICAgfQorICAgICAgCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIF9DaGFyVAorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpfU19lbXB0eV9jX3N0clsxXTsKKyAgICAgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjb25zdCBfQ2hhclQqCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIGNfc3RyKCkgY29uc3QKKyAgICB7CisgICAgICBpZiAoMCA9PSB0aGlzLT5fTV90cmVlX3B0cikKKwl7CisJICBfU19lbXB0eV9jX3N0clswXSA9IF9TX2VvcygoX0NoYXJUKikwKTsgIC8vIFBvc3NpYmx5IHJlZHVuZGFudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHByb2JhYmx5IGZhc3QuCisJICByZXR1cm4gX1NfZW1wdHlfY19zdHI7CisJfQorICAgICAgX19ndGhyZWFkX211dGV4X2xvY2sgKCZ0aGlzLT5fTV90cmVlX3B0ci0+X01fY19zdHJpbmdfbG9jayk7CisgICAgICBfX0dDX0NPTlNUIF9DaGFyVCogX19yZXN1bHQgPSB0aGlzLT5fTV90cmVlX3B0ci0+X01fY19zdHJpbmc7CisgICAgICBpZiAoMCA9PSBfX3Jlc3VsdCkKKwl7CisJICBzaXplX3QgX19zID0gc2l6ZSgpOworCSAgX19yZXN1bHQgPSB0aGlzLT5fRGF0YV9hbGxvY2F0ZShfX3MgKyAxKTsKKwkgIF9TX2ZsYXR0ZW4odGhpcy0+X01fdHJlZV9wdHIsIF9fcmVzdWx0KTsKKwkgIF9fcmVzdWx0W19fc10gPSBfU19lb3MoKF9DaGFyVCopMCk7CisJICB0aGlzLT5fTV90cmVlX3B0ci0+X01fY19zdHJpbmcgPSBfX3Jlc3VsdDsKKwl9CisgICAgICBfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrICgmdGhpcy0+X01fdHJlZV9wdHItPl9NX2Nfc3RyaW5nX2xvY2spOworICAgICAgcmV0dXJuKF9fcmVzdWx0KTsKKyAgICB9CisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjb25zdCBfQ2hhclQqIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICByZXBsYWNlX3dpdGhfY19zdHIoKQorICAgIHsKKyAgICAgIGlmICgwID09IHRoaXMtPl9NX3RyZWVfcHRyKQorCXsKKwkgIF9TX2VtcHR5X2Nfc3RyWzBdID0gX1NfZW9zKChfQ2hhclQqKTApOworCSAgcmV0dXJuIF9TX2VtcHR5X2Nfc3RyOworCX0KKyAgICAgIF9fR0NfQ09OU1QgX0NoYXJUKiBfX29sZF9jX3N0cmluZyA9IHRoaXMtPl9NX3RyZWVfcHRyLT5fTV9jX3N0cmluZzsKKyAgICAgIGlmIChfX2RldGFpbDo6X1NfbGVhZiA9PSB0aGlzLT5fTV90cmVlX3B0ci0+X01fdGFnCisJICAmJiAwICE9IF9fb2xkX2Nfc3RyaW5nKQorCXJldHVybihfX29sZF9jX3N0cmluZyk7CisgICAgICBzaXplX3QgX19zID0gc2l6ZSgpOworICAgICAgX0NoYXJUKiBfX3Jlc3VsdCA9IHRoaXMtPl9EYXRhX2FsbG9jYXRlKF9TX3JvdW5kZWRfdXBfc2l6ZShfX3MpKTsKKyAgICAgIF9TX2ZsYXR0ZW4odGhpcy0+X01fdHJlZV9wdHIsIF9fcmVzdWx0KTsKKyAgICAgIF9fcmVzdWx0W19fc10gPSBfU19lb3MoKF9DaGFyVCopMCk7CisgICAgICB0aGlzLT5fTV90cmVlX3B0ci0+X01fdW5yZWZfbm9ubmlsKCk7CisgICAgICB0aGlzLT5fTV90cmVlX3B0ciA9IF9TX25ld19Sb3BlTGVhZihfX3Jlc3VsdCwgX19zLAorCQkJCQkgIHRoaXMtPl9NX2dldF9hbGxvY2F0b3IoKSk7CisgICAgICByZXR1cm4oX19yZXN1bHQpOworICAgIH0KKworICAvLyBBbGdvcml0aG0gc3BlY2lhbGl6YXRpb25zLiAgTW9yZSBzaG91bGQgYmUgYWRkZWQuCisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfUm9wZV9pdGVyYXRvcj4gIC8vIHdhcyB0ZW1wbGF0ZWQgb24gQ2hhclQgYW5kIEFsbG9jCisgICAgdm9pZAkJICAgICAgICAgIC8vIFZDKysgd29ya2Fyb3VuZAorICAgIF9Sb3BlX3JvdGF0ZShfUm9wZV9pdGVyYXRvciBfX2ZpcnN0LAorCQkgX1JvcGVfaXRlcmF0b3IgX19taWRkbGUsCisJCSBfUm9wZV9pdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZV9pdGVyYXRvcjo6dmFsdWVfdHlwZSBfQ2hhclQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlX2l0ZXJhdG9yOjpfYWxsb2NhdG9yX3R5cGUgX0FsbG9jOworICAgICAgCisgICAgICByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19yKF9fZmlyc3QuY29udGFpbmVyKCkpOworICAgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz4gX19wcmVmaXggPSBfX3Iuc3Vic3RyKDAsIF9fZmlyc3QuaW5kZXgoKSk7CisgICAgICByb3BlPF9DaGFyVCwgX0FsbG9jPiBfX3N1ZmZpeCA9CisJX19yLnN1YnN0cihfX2xhc3QuaW5kZXgoKSwgX19yLnNpemUoKSAtIF9fbGFzdC5pbmRleCgpKTsKKyAgICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+IF9fcGFydDEgPQorCV9fci5zdWJzdHIoX19taWRkbGUuaW5kZXgoKSwgX19sYXN0LmluZGV4KCkgLSBfX21pZGRsZS5pbmRleCgpKTsKKyAgICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+IF9fcGFydDIgPQorCV9fci5zdWJzdHIoX19maXJzdC5pbmRleCgpLCBfX21pZGRsZS5pbmRleCgpIC0gX19maXJzdC5pbmRleCgpKTsKKyAgICAgIF9fciA9IF9fcHJlZml4OworICAgICAgX19yICs9IF9fcGFydDE7CisgICAgICBfX3IgKz0gX19wYXJ0MjsKKyAgICAgIF9fciArPSBfX3N1ZmZpeDsKKyAgICB9CisKKyNpZiAhZGVmaW5lZChfX0dOVUNfXykKKyAgLy8gQXBwZWFycyB0byBjb25mdXNlIGcrKworICBpbmxpbmUgdm9pZAorICByb3RhdGUoX1JvcGVfaXRlcmF0b3I8Y2hhciwgX19TVExfREVGQVVMVF9BTExPQ0FUT1IoY2hhcik+IF9fZmlyc3QsCisJIF9Sb3BlX2l0ZXJhdG9yPGNoYXIsIF9fU1RMX0RFRkFVTFRfQUxMT0NBVE9SKGNoYXIpPiBfX21pZGRsZSwKKwkgX1JvcGVfaXRlcmF0b3I8Y2hhciwgX19TVExfREVGQVVMVF9BTExPQ0FUT1IoY2hhcik+IF9fbGFzdCkKKyAgeyBfUm9wZV9yb3RhdGUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisjIGlmIDAKKyAgLy8gUHJvYmFibHkgbm90IHVzZWZ1bCBmb3Igc2V2ZXJhbCByZWFzb25zOgorICAvLyAtIGZvciBTR0lzIDcuMSBjb21waWxlciBhbmQgcHJvYmFibHkgc29tZSBvdGhlcnMsCisgIC8vICAgdGhpcyBmb3JjZXMgbG90cyBvZiByb3BlPHdjaGFyX3QsIC4uLj4gaW5zdGFudGlhdGlvbnMsIGNyZWF0aW5nIGEKKyAgLy8gICBjb2RlIGJsb2F0IGFuZCBjb21waWxlIHRpbWUgcHJvYmxlbS4gIChGaXhlZCBpbiA3LjIuKQorICAvLyAtIHdjaGFyX3QgaXMgNCBieXRlcyB3aWRlIG9uIG1vc3QgVU5JWCBwbGF0Zm9ybXMsIG1ha2luZyBpdAorICAvLyAgIHVuYXR0cmFjdGl2ZSBmb3IgdW5pY29kZSBzdHJpbmdzLiAgVW5zaWduZWQgc2hvcnQgbWF5IGJlIGEgYmV0dGVyCisgIC8vICAgY2hhcmFjdGVyIHR5cGUuCisgIGlubGluZSB2b2lkCisgIHJvdGF0ZShfUm9wZV9pdGVyYXRvcjx3Y2hhcl90LCBfX1NUTF9ERUZBVUxUX0FMTE9DQVRPUihjaGFyKT4gX19maXJzdCwKKwkgX1JvcGVfaXRlcmF0b3I8d2NoYXJfdCwgX19TVExfREVGQVVMVF9BTExPQ0FUT1IoY2hhcik+IF9fbWlkZGxlLAorCSBfUm9wZV9pdGVyYXRvcjx3Y2hhcl90LCBfX1NUTF9ERUZBVUxUX0FMTE9DQVRPUihjaGFyKT4gX19sYXN0KQorICB7IF9Sb3BlX3JvdGF0ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0KTsgfQorIyBlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9zbGlzdCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3NsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZmFjN2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9zbGlzdApAQCAtMCwwICsxLDEwODIgQEAKKy8vIFNpbmdseS1saW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworLyoqIEBmaWxlIGV4dC9zbGlzdAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IChwb3NzaWJseQorICogIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBIUC9TR0kgU1RMIHN1YnNldCkuIAorICovCisKKyNpZm5kZWYgX1NMSVNUCisjZGVmaW5lIF9TTElTVCAxCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9jb25zdHJ1Y3QuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF91bmluaXRpYWxpemVkLmg+CisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisgIHVzaW5nIHN0ZDo6X0NvbnN0cnVjdDsKKyAgdXNpbmcgc3RkOjpfRGVzdHJveTsKKyAgdXNpbmcgc3RkOjphbGxvY2F0b3I7CisgIHVzaW5nIHN0ZDo6X190cnVlX3R5cGU7CisgIHVzaW5nIHN0ZDo6X19mYWxzZV90eXBlOworCisgIHN0cnVjdCBfU2xpc3Rfbm9kZV9iYXNlCisgIHsKKyAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfTV9uZXh0OworICB9OworICAKKyAgaW5saW5lIF9TbGlzdF9ub2RlX2Jhc2UqCisgIF9fc2xpc3RfbWFrZV9saW5rKF9TbGlzdF9ub2RlX2Jhc2UqIF9fcHJldl9ub2RlLAorCQkgICAgX1NsaXN0X25vZGVfYmFzZSogX19uZXdfbm9kZSkKKyAgeworICAgIF9fbmV3X25vZGUtPl9NX25leHQgPSBfX3ByZXZfbm9kZS0+X01fbmV4dDsKKyAgICBfX3ByZXZfbm9kZS0+X01fbmV4dCA9IF9fbmV3X25vZGU7CisgICAgcmV0dXJuIF9fbmV3X25vZGU7CisgIH0KKworICBpbmxpbmUgX1NsaXN0X25vZGVfYmFzZSoKKyAgX19zbGlzdF9wcmV2aW91cyhfU2xpc3Rfbm9kZV9iYXNlKiBfX2hlYWQsCisJCSAgIGNvbnN0IF9TbGlzdF9ub2RlX2Jhc2UqIF9fbm9kZSkKKyAgeworICAgIHdoaWxlIChfX2hlYWQgJiYgX19oZWFkLT5fTV9uZXh0ICE9IF9fbm9kZSkKKyAgICAgIF9faGVhZCA9IF9faGVhZC0+X01fbmV4dDsKKyAgICByZXR1cm4gX19oZWFkOworICB9CisKKyAgaW5saW5lIGNvbnN0IF9TbGlzdF9ub2RlX2Jhc2UqCisgIF9fc2xpc3RfcHJldmlvdXMoY29uc3QgX1NsaXN0X25vZGVfYmFzZSogX19oZWFkLAorCQkgICBjb25zdCBfU2xpc3Rfbm9kZV9iYXNlKiBfX25vZGUpCisgIHsKKyAgICB3aGlsZSAoX19oZWFkICYmIF9faGVhZC0+X01fbmV4dCAhPSBfX25vZGUpCisgICAgICBfX2hlYWQgPSBfX2hlYWQtPl9NX25leHQ7CisgICAgcmV0dXJuIF9faGVhZDsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fc2xpc3Rfc3BsaWNlX2FmdGVyKF9TbGlzdF9ub2RlX2Jhc2UqIF9fcG9zLAorCQkgICAgICAgX1NsaXN0X25vZGVfYmFzZSogX19iZWZvcmVfZmlyc3QsCisJCSAgICAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfX2JlZm9yZV9sYXN0KQorICB7CisgICAgaWYgKF9fcG9zICE9IF9fYmVmb3JlX2ZpcnN0ICYmIF9fcG9zICE9IF9fYmVmb3JlX2xhc3QpCisgICAgICB7CisJX1NsaXN0X25vZGVfYmFzZSogX19maXJzdCA9IF9fYmVmb3JlX2ZpcnN0LT5fTV9uZXh0OworCV9TbGlzdF9ub2RlX2Jhc2UqIF9fYWZ0ZXIgPSBfX3Bvcy0+X01fbmV4dDsKKwlfX2JlZm9yZV9maXJzdC0+X01fbmV4dCA9IF9fYmVmb3JlX2xhc3QtPl9NX25leHQ7CisJX19wb3MtPl9NX25leHQgPSBfX2ZpcnN0OworCV9fYmVmb3JlX2xhc3QtPl9NX25leHQgPSBfX2FmdGVyOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX19zbGlzdF9zcGxpY2VfYWZ0ZXIoX1NsaXN0X25vZGVfYmFzZSogX19wb3MsIF9TbGlzdF9ub2RlX2Jhc2UqIF9faGVhZCkKKyAgeworICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9fYmVmb3JlX2xhc3QgPSBfX3NsaXN0X3ByZXZpb3VzKF9faGVhZCwgMCk7CisgICAgaWYgKF9fYmVmb3JlX2xhc3QgIT0gX19oZWFkKQorICAgICAgeworCV9TbGlzdF9ub2RlX2Jhc2UqIF9fYWZ0ZXIgPSBfX3Bvcy0+X01fbmV4dDsKKwlfX3Bvcy0+X01fbmV4dCA9IF9faGVhZC0+X01fbmV4dDsKKwlfX2hlYWQtPl9NX25leHQgPSAwOworCV9fYmVmb3JlX2xhc3QtPl9NX25leHQgPSBfX2FmdGVyOworICAgICAgfQorICB9CisKKyAgaW5saW5lIF9TbGlzdF9ub2RlX2Jhc2UqCisgIF9fc2xpc3RfcmV2ZXJzZShfU2xpc3Rfbm9kZV9iYXNlKiBfX25vZGUpCisgIHsKKyAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfX3Jlc3VsdCA9IF9fbm9kZTsKKyAgICBfX25vZGUgPSBfX25vZGUtPl9NX25leHQ7CisgICAgX19yZXN1bHQtPl9NX25leHQgPSAwOworICAgIHdoaWxlKF9fbm9kZSkKKyAgICAgIHsKKwlfU2xpc3Rfbm9kZV9iYXNlKiBfX25leHQgPSBfX25vZGUtPl9NX25leHQ7CisJX19ub2RlLT5fTV9uZXh0ID0gX19yZXN1bHQ7CisJX19yZXN1bHQgPSBfX25vZGU7CisJX19ub2RlID0gX19uZXh0OworICAgICAgfQorICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorCisgIGlubGluZSBzaXplX3QKKyAgX19zbGlzdF9zaXplKF9TbGlzdF9ub2RlX2Jhc2UqIF9fbm9kZSkKKyAgeworICAgIHNpemVfdCBfX3Jlc3VsdCA9IDA7CisgICAgZm9yICg7IF9fbm9kZSAhPSAwOyBfX25vZGUgPSBfX25vZGUtPl9NX25leHQpCisgICAgICArK19fcmVzdWx0OworICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgc3RydWN0IF9TbGlzdF9ub2RlIDogcHVibGljIF9TbGlzdF9ub2RlX2Jhc2UKKyAgICB7CisgICAgICBfVHAgX01fZGF0YTsKKyAgICB9OworCisgIHN0cnVjdCBfU2xpc3RfaXRlcmF0b3JfYmFzZQorICB7CisgICAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9NX25vZGU7CisgICAgCisgICAgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UoX1NsaXN0X25vZGVfYmFzZSogX194KQorICAgIDogX01fbm9kZShfX3gpIHt9CisKKyAgICB2b2lkCisgICAgX01faW5jcigpCisgICAgeyBfTV9ub2RlID0gX01fbm9kZS0+X01fbmV4dDsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UmIF9feCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9ub2RlID09IF9feC5fTV9ub2RlOyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfU2xpc3RfaXRlcmF0b3JfYmFzZSYgX194KSBjb25zdAorICAgIHsgcmV0dXJuIF9NX25vZGUgIT0gX194Ll9NX25vZGU7IH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfUmVmLCBjbGFzcyBfUHRyPgorICAgIHN0cnVjdCBfU2xpc3RfaXRlcmF0b3IgOiBwdWJsaWMgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIF9TbGlzdF9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+ICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfU2xpc3RfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX1NsaXN0X2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4gICAgICAgICAgICAgX1NlbGY7CisKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfUHRyICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIF9SZWYgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfU2xpc3Rfbm9kZTxfVHA+IF9Ob2RlOworCisgICAgICBleHBsaWNpdAorICAgICAgX1NsaXN0X2l0ZXJhdG9yKF9Ob2RlKiBfX3gpCisgICAgICA6IF9TbGlzdF9pdGVyYXRvcl9iYXNlKF9feCkge30KKworICAgICAgX1NsaXN0X2l0ZXJhdG9yKCkKKyAgICAgIDogX1NsaXN0X2l0ZXJhdG9yX2Jhc2UoMCkge30KKworICAgICAgX1NsaXN0X2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX3gpCisgICAgICA6IF9TbGlzdF9pdGVyYXRvcl9iYXNlKF9feC5fTV9ub2RlKSB7fQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiAoKF9Ob2RlKikgX01fbm9kZSktPl9NX2RhdGE7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCV9NX2luY3IoKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9TbGlzdF9iYXNlCisgICAgOiBwdWJsaWMgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1NsaXN0X25vZGU8X1RwPiA+OjpvdGhlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1NsaXN0X25vZGU8X1RwPiA+OjpvdGhlcgorICAgICAgICBfTm9kZV9hbGxvYzsKKyAgICAgIHR5cGVkZWYgX0FsbG9jIGFsbG9jYXRvcl90eXBlOworCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX05vZGVfYWxsb2MqPih0aGlzKTsgfQorCisgICAgICBfU2xpc3RfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfTm9kZV9hbGxvYyhfX2EpCisgICAgICB7IHRoaXMtPl9NX2hlYWQuX01fbmV4dCA9IDA7IH0KKworICAgICAgfl9TbGlzdF9iYXNlKCkKKyAgICAgIHsgX01fZXJhc2VfYWZ0ZXIoJnRoaXMtPl9NX2hlYWQsIDApOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfU2xpc3Rfbm9kZV9iYXNlIF9NX2hlYWQ7CisKKyAgICAgIF9TbGlzdF9ub2RlPF9UcD4qCisgICAgICBfTV9nZXRfbm9kZSgpCisgICAgICB7IHJldHVybiBfTm9kZV9hbGxvYzo6YWxsb2NhdGUoMSk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBfTV9wdXRfbm9kZShfU2xpc3Rfbm9kZTxfVHA+KiBfX3ApCisgICAgICB7IF9Ob2RlX2FsbG9jOjpkZWFsbG9jYXRlKF9fcCwgMSk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9NX2VyYXNlX2FmdGVyKF9TbGlzdF9ub2RlX2Jhc2UqIF9fcG9zKQorICAgICAgeworCV9TbGlzdF9ub2RlPF9UcD4qIF9fbmV4dCA9IChfU2xpc3Rfbm9kZTxfVHA+KikgKF9fcG9zLT5fTV9uZXh0KTsKKwlfU2xpc3Rfbm9kZV9iYXNlKiBfX25leHRfbmV4dCA9IF9fbmV4dC0+X01fbmV4dDsKKwlfX3Bvcy0+X01fbmV4dCA9IF9fbmV4dF9uZXh0OworCWdldF9hbGxvY2F0b3IoKS5kZXN0cm95KCZfX25leHQtPl9NX2RhdGEpOworCV9NX3B1dF9ub2RlKF9fbmV4dCk7CisJcmV0dXJuIF9fbmV4dF9uZXh0OworICAgICAgfQorICAgICAgX1NsaXN0X25vZGVfYmFzZSogX01fZXJhc2VfYWZ0ZXIoX1NsaXN0X25vZGVfYmFzZSosIF9TbGlzdF9ub2RlX2Jhc2UqKTsKKyAgICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICBfU2xpc3Rfbm9kZV9iYXNlKgorICAgIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+OjpfTV9lcmFzZV9hZnRlcihfU2xpc3Rfbm9kZV9iYXNlKiBfX2JlZm9yZV9maXJzdCwKKwkJCQkJICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9fbGFzdF9ub2RlKQorICAgIHsKKyAgICAgIF9TbGlzdF9ub2RlPF9UcD4qIF9fY3VyID0gKF9TbGlzdF9ub2RlPF9UcD4qKSAoX19iZWZvcmVfZmlyc3QtPl9NX25leHQpOworICAgICAgd2hpbGUgKF9fY3VyICE9IF9fbGFzdF9ub2RlKQorCXsKKwkgIF9TbGlzdF9ub2RlPF9UcD4qIF9fdG1wID0gX19jdXI7CisJICBfX2N1ciA9IChfU2xpc3Rfbm9kZTxfVHA+KikgX19jdXItPl9NX25leHQ7CisJICBnZXRfYWxsb2NhdG9yKCkuZGVzdHJveSgmX190bXAtPl9NX2RhdGEpOworCSAgX01fcHV0X25vZGUoX190bXApOworCX0KKyAgICAgIF9fYmVmb3JlX2ZpcnN0LT5fTV9uZXh0ID0gX19sYXN0X25vZGU7CisgICAgICByZXR1cm4gX19sYXN0X25vZGU7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgICovCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBzbGlzdCA6IHByaXZhdGUgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4KKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9UcCwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorCQorICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICAKKyAgICAgIHR5cGVkZWYgX1NsaXN0X2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9TbGlzdF9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+IGNvbnN0X2l0ZXJhdG9yOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2U6OmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX1NsaXN0X25vZGU8X1RwPiAgICAgIF9Ob2RlOworICAgICAgdHlwZWRlZiBfU2xpc3Rfbm9kZV9iYXNlICAgICAgX05vZGVfYmFzZTsKKyAgICAgIHR5cGVkZWYgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UgIF9JdGVyYXRvcl9iYXNlOworICAgICAgCisgICAgICBfTm9kZSoKKyAgICAgIF9NX2NyZWF0ZV9ub2RlKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlfTm9kZSogX19ub2RlID0gdGhpcy0+X01fZ2V0X25vZGUoKTsKKwlfX3RyeQorCSAgeworCSAgICBnZXRfYWxsb2NhdG9yKCkuY29uc3RydWN0KCZfX25vZGUtPl9NX2RhdGEsIF9feCk7CisJICAgIF9fbm9kZS0+X01fbmV4dCA9IDA7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIHRoaXMtPl9NX3B1dF9ub2RlKF9fbm9kZSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCXJldHVybiBfX25vZGU7CisgICAgICB9CisKKyAgICAgIF9Ob2RlKgorICAgICAgX01fY3JlYXRlX25vZGUoKQorICAgICAgeworCV9Ob2RlKiBfX25vZGUgPSB0aGlzLT5fTV9nZXRfbm9kZSgpOworCV9fdHJ5CisJICB7CisJICAgIGdldF9hbGxvY2F0b3IoKS5jb25zdHJ1Y3QoJl9fbm9kZS0+X01fZGF0YSwgdmFsdWVfdHlwZSgpKTsKKwkgICAgX19ub2RlLT5fTV9uZXh0ID0gMDsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgdGhpcy0+X01fcHV0X25vZGUoX19ub2RlKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisJcmV0dXJuIF9fbm9kZTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBzbGlzdChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKSB7fQorCisgICAgICBzbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gsCisJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSAgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfZmlsbCgmdGhpcy0+X01faGVhZCwgX19uLCBfX3gpOyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBzbGlzdChzaXplX3R5cGUgX19uKQorICAgICAgOiBfQmFzZShhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfZmlsbCgmdGhpcy0+X01faGVhZCwgX19uLCB2YWx1ZV90eXBlKCkpOyB9CisKKyAgICAgIC8vIFdlIGRvbid0IG5lZWQgYW55IGRpc3BhdGNoaW5nIHRyaWNrcyBoZXJlLCBiZWNhdXNlCisgICAgICAvLyBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UgYWxyZWFkeSBkb2VzIHRoZW0uCisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHNsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gIGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2EpCisgICAgICAgIHsgX01faW5zZXJ0X2FmdGVyX3JhbmdlKCZ0aGlzLT5fTV9oZWFkLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIHNsaXN0KGNvbnN0IHNsaXN0JiBfX3gpCisgICAgICA6IF9CYXNlKF9feC5nZXRfYWxsb2NhdG9yKCkpCisgICAgICB7IF9NX2luc2VydF9hZnRlcl9yYW5nZSgmdGhpcy0+X01faGVhZCwgX194LmJlZ2luKCksIF9feC5lbmQoKSk7IH0KKworICAgICAgc2xpc3QmCisgICAgICBvcGVyYXRvcj0gKGNvbnN0IHNsaXN0JiBfX3gpOworCisgICAgICB+c2xpc3QoKSB7fQorCisgICAgcHVibGljOgorICAgICAgLy8gYXNzaWduKCksIGEgZ2VuZXJhbGl6ZWQgYXNzaWdubWVudCBtZW1iZXIgZnVuY3Rpb24uICBUd28KKyAgICAgIC8vIHZlcnNpb25zOiBvbmUgdGhhdCB0YWtlcyBhIGNvdW50LCBhbmQgb25lIHRoYXQgdGFrZXMgYSByYW5nZS4KKyAgICAgIC8vIFRoZSByYW5nZSB2ZXJzaW9uIGlzIGEgbWVtYmVyIHRlbXBsYXRlLCBzbyB3ZSBkaXNwYXRjaCBvbiB3aGV0aGVyCisgICAgICAvLyBvciBub3QgdGhlIHR5cGUgaXMgYW4gaW50ZWdlci4KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpCisgICAgICB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ZpbGxfYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpOworCisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisJfQorCisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgICAgICB2b2lkCisgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwgX190cnVlX3R5cGUpCisgICAgICB7IF9NX2ZpbGxfYXNzaWduKChzaXplX3R5cGUpIF9fbiwgKF9UcCkgX192YWwpOyB9CisKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgX19mYWxzZV90eXBlKTsKKworICAgIHB1YmxpYzoKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKChfTm9kZSopdGhpcy0+X01faGVhZC5fTV9uZXh0KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoKF9Ob2RlKil0aGlzLT5fTV9oZWFkLl9NX25leHQpO30KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBpdGVyYXRvcigwKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKDApOyB9CisKKyAgICAgIC8vIEV4cGVyaW1lbnRhbCBuZXcgZmVhdHVyZTogYmVmb3JlX2JlZ2luKCkgcmV0dXJucyBhCisgICAgICAvLyBub24tZGVyZWZlcmVuY2VhYmxlIGl0ZXJhdG9yIHRoYXQsIHdoZW4gaW5jcmVtZW50ZWQsIHlpZWxkcworICAgICAgLy8gYmVnaW4oKS4gIFRoaXMgaXRlcmF0b3IgbWF5IGJlIHVzZWQgYXMgdGhlIGFyZ3VtZW50IHRvCisgICAgICAvLyBpbnNlcnRfYWZ0ZXIsIGVyYXNlX2FmdGVyLCBldGMuICBOb3RlIHRoYXQgZXZlbiBmb3IgYW4gZW1wdHkKKyAgICAgIC8vIHNsaXN0LCBiZWZvcmVfYmVnaW4oKSBpcyBub3QgdGhlIHNhbWUgaXRlcmF0b3IgYXMgZW5kKCkuICBJdAorICAgICAgLy8gaXMgYWx3YXlzIG5lY2Vzc2FyeSB0byBpbmNyZW1lbnQgYmVmb3JlX2JlZ2luKCkgYXQgbGVhc3Qgb25jZSB0bworICAgICAgLy8gb2J0YWluIGVuZCgpLgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZm9yZV9iZWdpbigpCisgICAgICB7IHJldHVybiBpdGVyYXRvcigoX05vZGUqKSAmdGhpcy0+X01faGVhZCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZm9yZV9iZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcigoX05vZGUqKSAmdGhpcy0+X01faGVhZCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fc2xpc3Rfc2l6ZSh0aGlzLT5fTV9oZWFkLl9NX25leHQpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQorCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9oZWFkLl9NX25leHQgPT0gMDsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHNsaXN0JiBfX3gpCisgICAgICB7IHN0ZDo6c3dhcCh0aGlzLT5fTV9oZWFkLl9NX25leHQsIF9feC5fTV9oZWFkLl9NX25leHQpOyB9CisKKyAgICBwdWJsaWM6CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeyByZXR1cm4gKChfTm9kZSopIHRoaXMtPl9NX2hlYWQuX01fbmV4dCktPl9NX2RhdGE7IH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7IHJldHVybiAoKF9Ob2RlKikgdGhpcy0+X01faGVhZC5fTV9uZXh0KS0+X01fZGF0YTsgfQorCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgX19zbGlzdF9tYWtlX2xpbmsoJnRoaXMtPl9NX2hlYWQsIF9NX2NyZWF0ZV9ub2RlKF9feCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoKQorICAgICAgeyBfX3NsaXN0X21ha2VfbGluaygmdGhpcy0+X01faGVhZCwgX01fY3JlYXRlX25vZGUoKSk7IH0KKworICAgICAgdm9pZAorICAgICAgcG9wX2Zyb250KCkKKyAgICAgIHsKKwlfTm9kZSogX19ub2RlID0gKF9Ob2RlKikgdGhpcy0+X01faGVhZC5fTV9uZXh0OworCXRoaXMtPl9NX2hlYWQuX01fbmV4dCA9IF9fbm9kZS0+X01fbmV4dDsKKwlnZXRfYWxsb2NhdG9yKCkuZGVzdHJveSgmX19ub2RlLT5fTV9kYXRhKTsKKwl0aGlzLT5fTV9wdXRfbm9kZShfX25vZGUpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgcHJldmlvdXMoY29uc3RfaXRlcmF0b3IgX19wb3MpCisgICAgICB7IHJldHVybiBpdGVyYXRvcigoX05vZGUqKSBfX3NsaXN0X3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLAorCQkJCQkJICBfX3Bvcy5fTV9ub2RlKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHByZXZpb3VzKGNvbnN0X2l0ZXJhdG9yIF9fcG9zKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoKF9Ob2RlKikgX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwKKwkJCQkJCQlfX3Bvcy5fTV9ub2RlKSk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfTm9kZSoKKyAgICAgIF9NX2luc2VydF9hZnRlcihfTm9kZV9iYXNlKiBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gKF9Ob2RlKikgKF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZShfX3gpKSk7IH0KKworICAgICAgX05vZGUqCisgICAgICBfTV9pbnNlcnRfYWZ0ZXIoX05vZGVfYmFzZSogX19wb3MpCisgICAgICB7IHJldHVybiAoX05vZGUqKSAoX19zbGlzdF9tYWtlX2xpbmsoX19wb3MsIF9NX2NyZWF0ZV9ub2RlKCkpKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbnNlcnRfYWZ0ZXJfZmlsbChfTm9kZV9iYXNlKiBfX3BvcywKKwkJCSAgIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCSAgX19wb3MgPSBfX3NsaXN0X21ha2VfbGluayhfX3BvcywgX01fY3JlYXRlX25vZGUoX194KSk7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICAgICAgdGVtcGxhdGUgPGNsYXNzIF9Jbkl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luc2VydF9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKKwkJCSAgICAgIF9Jbkl0ZXJhdG9yIF9fZmlyc3QsIF9Jbkl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5JdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworCX0KKworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luc2VydF9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsCisJCQkgICAgICBfX3RydWVfdHlwZSkKKyAgICAgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfZmlsbChfX3BvcywgX19uLCBfX3gpOyB9CisKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisJCQkgICAgICBfSW5JdGVyYXRvciBfX2ZpcnN0LCBfSW5JdGVyYXRvciBfX2xhc3QsCisJCQkgICAgICBfX2ZhbHNlX3R5cGUpCisgICAgICAgIHsKKwkgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgICAgeworCSAgICAgIF9fcG9zID0gX19zbGlzdF9tYWtlX2xpbmsoX19wb3MsIF9NX2NyZWF0ZV9ub2RlKCpfX2ZpcnN0KSk7CisJICAgICAgKytfX2ZpcnN0OworCSAgICB9CisJfQorCisgICAgcHVibGljOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX01faW5zZXJ0X2FmdGVyKF9fcG9zLl9NX25vZGUsIF9feCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MpCisgICAgICB7IHJldHVybiBpbnNlcnRfYWZ0ZXIoX19wb3MsIHZhbHVlX3R5cGUoKSk7IH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IF9NX2luc2VydF9hZnRlcl9maWxsKF9fcG9zLl9NX25vZGUsIF9fbiwgX194KTsgfQorCisgICAgICAvLyBXZSBkb24ndCBuZWVkIGFueSBkaXNwYXRjaGluZyB0cmlja3MgaGVyZSwgYmVjYXVzZQorICAgICAgLy8gX01faW5zZXJ0X2FmdGVyX3JhbmdlIGFscmVhZHkgZG9lcyB0aGVtLgorICAgICAgdGVtcGxhdGUgPGNsYXNzIF9Jbkl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgX0luSXRlcmF0b3IgX19maXJzdCwgX0luSXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IF9NX2luc2VydF9hZnRlcl9yYW5nZShfX3Bvcy5fTV9ub2RlLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2luc2VydF9hZnRlcihfX3NsaXN0X3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLAorCQkJCQkJCSBfX3Bvcy5fTV9ub2RlKSwKKwkJCQkJX194KSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3BvcykKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2luc2VydF9hZnRlcihfX3NsaXN0X3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLAorCQkJCQkJCSBfX3Bvcy5fTV9ub2RlKSwKKwkJCQkJdmFsdWVfdHlwZSgpKSk7IH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IF9NX2luc2VydF9hZnRlcl9maWxsKF9fc2xpc3RfcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQsIF9fcG9zLl9NX25vZGUpLAorCQkJICAgICBfX24sIF9feCk7IH0KKworICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBhbnkgZGlzcGF0Y2hpbmcgdHJpY2tzIGhlcmUsIGJlY2F1c2UKKyAgICAgIC8vIF9NX2luc2VydF9hZnRlcl9yYW5nZSBhbHJlYWR5IGRvZXMgdGhlbS4KKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9Jbkl0ZXJhdG9yIF9fZmlyc3QsIF9Jbkl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwgX19wb3MuX01fbm9kZSksCisJCQkJX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgcHVibGljOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoKF9Ob2RlKikgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19wb3MuX01fbm9kZSkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZV9hZnRlcihpdGVyYXRvciBfX2JlZm9yZV9maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyAKKwlyZXR1cm4gaXRlcmF0b3IoKF9Ob2RlKikgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19iZWZvcmVfZmlyc3QuX01fbm9kZSwKKwkJCQkJCSAgICAgIF9fbGFzdC5fTV9ub2RlKSk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3BvcykKKyAgICAgIHsgCisJcmV0dXJuIGl0ZXJhdG9yKChfTm9kZSopIHRoaXMtPl9NX2VyYXNlX2FmdGVyCisJCQkoX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwgX19wb3MuX01fbm9kZSkpKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgCisJcmV0dXJuIGl0ZXJhdG9yKChfTm9kZSopIHRoaXMtPl9NX2VyYXNlX2FmdGVyCisJCQkoX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwgX19maXJzdC5fTV9ub2RlKSwKKwkJCSBfX2xhc3QuX01fbm9kZSkpOworICAgICAgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIG5ld19zaXplLCBjb25zdCBfVHAmIF9feCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUpCisgICAgICB7IHJlc2l6ZShuZXdfc2l6ZSwgX1RwKCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoJnRoaXMtPl9NX2hlYWQsIDApOyB9CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBNb3ZlcyB0aGUgcmFuZ2UgW19fYmVmb3JlX2ZpcnN0ICsgMSwgX19iZWZvcmVfbGFzdCArIDEpIHRvICp0aGlzLAorICAgICAgLy8gIGluc2VydGluZyBpdCBpbW1lZGlhdGVseSBhZnRlciBfX3Bvcy4gIFRoaXMgaXMgY29uc3RhbnQgdGltZS4KKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihpdGVyYXRvciBfX3BvcywKKwkJICAgaXRlcmF0b3IgX19iZWZvcmVfZmlyc3QsIGl0ZXJhdG9yIF9fYmVmb3JlX2xhc3QpCisgICAgICB7CisJaWYgKF9fYmVmb3JlX2ZpcnN0ICE9IF9fYmVmb3JlX2xhc3QpCisJICBfX3NsaXN0X3NwbGljZV9hZnRlcihfX3Bvcy5fTV9ub2RlLCBfX2JlZm9yZV9maXJzdC5fTV9ub2RlLAorCQkJICAgICAgIF9fYmVmb3JlX2xhc3QuX01fbm9kZSk7CisgICAgICB9CisKKyAgICAgIC8vIE1vdmVzIHRoZSBlbGVtZW50IHRoYXQgZm9sbG93cyBfX3ByZXYgdG8gKnRoaXMsIGluc2VydGluZyBpdAorICAgICAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgX19wb3MuICBUaGlzIGlzIGNvbnN0YW50IHRpbWUuCisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIGl0ZXJhdG9yIF9fcHJldikKKyAgICAgIHsgX19zbGlzdF9zcGxpY2VfYWZ0ZXIoX19wb3MuX01fbm9kZSwKKwkJCSAgICAgX19wcmV2Ll9NX25vZGUsIF9fcHJldi5fTV9ub2RlLT5fTV9uZXh0KTsgfQorCisgICAgICAvLyBSZW1vdmVzIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdCBfX3ggdG8gKnRoaXMsIGluc2VydGluZworICAgICAgLy8gdGhlbSBpbW1lZGlhdGVseSBhZnRlciBfX3Bvcy4gIF9feCBtdXN0IG5vdCBiZSAqdGhpcy4gIENvbXBsZXhpdHk6CisgICAgICAvLyBsaW5lYXIgaW4gX194LnNpemUoKS4KKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihpdGVyYXRvciBfX3Bvcywgc2xpc3QmIF9feCkKKyAgICAgIHsgX19zbGlzdF9zcGxpY2VfYWZ0ZXIoX19wb3MuX01fbm9kZSwgJl9feC5fTV9oZWFkKTsgfQorCisgICAgICAvLyBMaW5lYXIgaW4gZGlzdGFuY2UoYmVnaW4oKSwgX19wb3MpLCBhbmQgbGluZWFyIGluIF9feC5zaXplKCkuCisgICAgICB2b2lkCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIHNsaXN0JiBfX3gpCisgICAgICB7CisJaWYgKF9feC5fTV9oZWFkLl9NX25leHQpCisJICBfX3NsaXN0X3NwbGljZV9hZnRlcihfX3NsaXN0X3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLCBfX3Bvcy5fTV9ub2RlKSwKKwkJCSAgICAgICAmX194Ll9NX2hlYWQsCisJCQkgICAgICAgX19zbGlzdF9wcmV2aW91cygmX194Ll9NX2hlYWQsIDApKTsgfQorCisgICAgICAvLyBMaW5lYXIgaW4gZGlzdGFuY2UoYmVnaW4oKSwgX19wb3MpLCBhbmQgaW4gZGlzdGFuY2UoX194LmJlZ2luKCksIF9faSkuCisgICAgICB2b2lkCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIHNsaXN0JiBfX3gsIGl0ZXJhdG9yIF9faSkKKyAgICAgIHsgX19zbGlzdF9zcGxpY2VfYWZ0ZXIoX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwgX19wb3MuX01fbm9kZSksCisJCQkgICAgIF9fc2xpc3RfcHJldmlvdXMoJl9feC5fTV9oZWFkLCBfX2kuX01fbm9kZSksCisJCQkgICAgIF9faS5fTV9ub2RlKTsgfQorCisgICAgICAvLyBMaW5lYXIgaW4gZGlzdGFuY2UoYmVnaW4oKSwgX19wb3MpLCBpbiBkaXN0YW5jZShfX3guYmVnaW4oKSwgX19maXJzdCksCisgICAgICAvLyBhbmQgaW4gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KS4KKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvcywgc2xpc3QmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCWlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgIF9fc2xpc3Rfc3BsaWNlX2FmdGVyKF9fc2xpc3RfcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQsIF9fcG9zLl9NX25vZGUpLAorCQkJICAgICAgIF9fc2xpc3RfcHJldmlvdXMoJl9feC5fTV9oZWFkLCBfX2ZpcnN0Ll9NX25vZGUpLAorCQkJICAgICAgIF9fc2xpc3RfcHJldmlvdXMoX19maXJzdC5fTV9ub2RlLAorCQkJCQkJX19sYXN0Ll9NX25vZGUpKTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIHZvaWQKKyAgICAgIHJldmVyc2UoKQorICAgICAgeworCWlmICh0aGlzLT5fTV9oZWFkLl9NX25leHQpCisJICB0aGlzLT5fTV9oZWFkLl9NX25leHQgPSBfX3NsaXN0X3JldmVyc2UodGhpcy0+X01faGVhZC5fTV9uZXh0KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVtb3ZlKGNvbnN0IF9UcCYgX192YWwpOworCisgICAgICB2b2lkCisgICAgICB1bmlxdWUoKTsKKyAgICAgIAorICAgICAgdm9pZAorICAgICAgbWVyZ2Uoc2xpc3QmIF9feCk7CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHNvcnQoKTsKKworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CisgICAgICAgIHZvaWQKKyAgICAgICAgcmVtb3ZlX2lmKF9QcmVkaWNhdGUgX19wcmVkKTsKKworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgICAgIHZvaWQKKyAgICAgICAgdW5pcXVlKF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkKTsKKworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICAgIHZvaWQKKyAgICAgICAgbWVyZ2Uoc2xpc3QmLCBfU3RyaWN0V2Vha09yZGVyaW5nKTsKKworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICAgIHZvaWQKKyAgICAgICAgc29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCk7CisgICAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgc2xpc3Q8X1RwLCBfQWxsb2M+JgorICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6b3BlcmF0b3I9KGNvbnN0IHNsaXN0PF9UcCwgX0FsbG9jPiYgX194KQorICAgIHsKKyAgICAgIGlmICgmX194ICE9IHRoaXMpCisJeworCSAgX05vZGVfYmFzZSogX19wMSA9ICZ0aGlzLT5fTV9oZWFkOworCSAgX05vZGUqIF9fbjEgPSAoX05vZGUqKSB0aGlzLT5fTV9oZWFkLl9NX25leHQ7CisJICBjb25zdCBfTm9kZSogX19uMiA9IChjb25zdCBfTm9kZSopIF9feC5fTV9oZWFkLl9NX25leHQ7CisJICB3aGlsZSAoX19uMSAmJiBfX24yKQorCSAgICB7CisJICAgICAgX19uMS0+X01fZGF0YSA9IF9fbjItPl9NX2RhdGE7CisJICAgICAgX19wMSA9IF9fbjE7CisJICAgICAgX19uMSA9IChfTm9kZSopIF9fbjEtPl9NX25leHQ7CisJICAgICAgX19uMiA9IChjb25zdCBfTm9kZSopIF9fbjItPl9NX25leHQ7CisJICAgIH0KKwkgIGlmIChfX24yID09IDApCisJICAgIHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fcDEsIDApOworCSAgZWxzZQorCSAgICBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX19wMSwgY29uc3RfaXRlcmF0b3IoKF9Ob2RlKilfX24yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcigwKSk7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6X01fZmlsbF9hc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisgICAgICBfTm9kZV9iYXNlKiBfX3ByZXYgPSAmdGhpcy0+X01faGVhZDsKKyAgICAgIF9Ob2RlKiBfX25vZGUgPSAoX05vZGUqKSB0aGlzLT5fTV9oZWFkLl9NX25leHQ7CisgICAgICBmb3IgKDsgX19ub2RlICE9IDAgJiYgX19uID4gMDsgLS1fX24pCisJeworCSAgX19ub2RlLT5fTV9kYXRhID0gX192YWw7CisJICBfX3ByZXYgPSBfX25vZGU7CisJICBfX25vZGUgPSAoX05vZGUqKSBfX25vZGUtPl9NX25leHQ7CisJfQorICAgICAgaWYgKF9fbiA+IDApCisJX01faW5zZXJ0X2FmdGVyX2ZpbGwoX19wcmV2LCBfX24sIF9fdmFsKTsKKyAgICAgIGVsc2UKKwl0aGlzLT5fTV9lcmFzZV9hZnRlcihfX3ByZXYsIDApOworICAgIH0KKyAgCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBzbGlzdDxfVHAsIF9BbGxvYz46Ol9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCQkJCQkgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCQkJICAgICBfX2ZhbHNlX3R5cGUpCisgICAgICB7CisJX05vZGVfYmFzZSogX19wcmV2ID0gJnRoaXMtPl9NX2hlYWQ7CisJX05vZGUqIF9fbm9kZSA9IChfTm9kZSopIHRoaXMtPl9NX2hlYWQuX01fbmV4dDsKKwl3aGlsZSAoX19ub2RlICE9IDAgJiYgX19maXJzdCAhPSBfX2xhc3QpCisJICB7CisJICAgIF9fbm9kZS0+X01fZGF0YSA9ICpfX2ZpcnN0OworCSAgICBfX3ByZXYgPSBfX25vZGU7CisJICAgIF9fbm9kZSA9IChfTm9kZSopIF9fbm9kZS0+X01fbmV4dDsKKwkgICAgKytfX2ZpcnN0OworCSAgfQorCWlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgIF9NX2luc2VydF9hZnRlcl9yYW5nZShfX3ByZXYsIF9fZmlyc3QsIF9fbGFzdCk7CisJZWxzZQorCSAgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19wcmV2LCAwKTsKKyAgICAgIH0KKyAgCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wxLCBjb25zdCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9TTDIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzbGlzdDxfVHAsX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICBjb25zdF9pdGVyYXRvciBfX2VuZDEgPSBfU0wxLmVuZCgpOworICAgICAgY29uc3RfaXRlcmF0b3IgX19lbmQyID0gX1NMMi5lbmQoKTsKKyAgICAgIAorICAgICAgY29uc3RfaXRlcmF0b3IgX19pMSA9IF9TTDEuYmVnaW4oKTsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9faTIgPSBfU0wyLmJlZ2luKCk7CisgICAgICB3aGlsZSAoX19pMSAhPSBfX2VuZDEgJiYgX19pMiAhPSBfX2VuZDIgJiYgKl9faTEgPT0gKl9faTIpCisJeworCSAgKytfX2kxOworCSAgKytfX2kyOworCX0KKyAgICAgIHJldHVybiBfX2kxID09IF9fZW5kMSAmJiBfX2kyID09IF9fZW5kMjsKKyAgICB9CisKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wxLCBjb25zdCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9TTDIpCisgICAgeyByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfU0wxLmJlZ2luKCksIF9TTDEuZW5kKCksCisJCQkJCSAgX1NMMi5iZWdpbigpLCBfU0wyLmVuZCgpKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wxLCBjb25zdCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9TTDIpCisgICAgeyByZXR1cm4gIShfU0wxID09IF9TTDIpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHNsaXN0PF9UcCwgX0FsbG9jPiYgX1NMMSwgY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wyKQorICAgIHsgcmV0dXJuIF9TTDIgPCBfU0wxOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9TTDEsIGNvbnN0IHNsaXN0PF9UcCwgX0FsbG9jPiYgX1NMMikKKyAgICB7IHJldHVybiAhKF9TTDIgPCBfU0wxKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wxLCBjb25zdCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9TTDIpCisgICAgeyByZXR1cm4gIShfU0wxIDwgX1NMMik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHNsaXN0PF9UcCwgX0FsbG9jPiYgX194LCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6cmVzaXplKHNpemVfdHlwZSBfX2xlbiwgY29uc3QgX1RwJiBfX3gpCisgICAgeworICAgICAgX05vZGVfYmFzZSogX19jdXIgPSAmdGhpcy0+X01faGVhZDsKKyAgICAgIHdoaWxlIChfX2N1ci0+X01fbmV4dCAhPSAwICYmIF9fbGVuID4gMCkKKwl7CisJICAtLV9fbGVuOworCSAgX19jdXIgPSBfX2N1ci0+X01fbmV4dDsKKwl9CisgICAgICBpZiAoX19jdXItPl9NX25leHQpCisJdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19jdXIsIDApOworICAgICAgZWxzZQorCV9NX2luc2VydF9hZnRlcl9maWxsKF9fY3VyLCBfX2xlbiwgX194KTsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICBzbGlzdDxfVHAsIF9BbGxvYz46OnJlbW92ZShjb25zdCBfVHAmIF9fdmFsKQorICAgIHsgCisgICAgICBfTm9kZV9iYXNlKiBfX2N1ciA9ICZ0aGlzLT5fTV9oZWFkOworICAgICAgd2hpbGUgKF9fY3VyICYmIF9fY3VyLT5fTV9uZXh0KQorCXsKKwkgIGlmICgoKF9Ob2RlKikgX19jdXItPl9NX25leHQpLT5fTV9kYXRhID09IF9fdmFsKQorCSAgICB0aGlzLT5fTV9lcmFzZV9hZnRlcihfX2N1cik7CisJICBlbHNlCisJICAgIF9fY3VyID0gX19jdXItPl9NX25leHQ7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6dW5pcXVlKCkKKyAgICB7CisgICAgICBfTm9kZV9iYXNlKiBfX2N1ciA9IHRoaXMtPl9NX2hlYWQuX01fbmV4dDsKKyAgICAgIGlmIChfX2N1cikKKwl7CisJICB3aGlsZSAoX19jdXItPl9NX25leHQpCisJICAgIHsKKwkgICAgICBpZiAoKChfTm9kZSopX19jdXIpLT5fTV9kYXRhCisJCSAgPT0gKChfTm9kZSopKF9fY3VyLT5fTV9uZXh0KSktPl9NX2RhdGEpCisJCXRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fY3VyKTsKKwkgICAgICBlbHNlCisJCV9fY3VyID0gX19jdXItPl9NX25leHQ7CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICB2b2lkCisgICAgc2xpc3Q8X1RwLCBfQWxsb2M+OjptZXJnZShzbGlzdDxfVHAsIF9BbGxvYz4mIF9feCkKKyAgICB7CisgICAgICBfTm9kZV9iYXNlKiBfX24xID0gJnRoaXMtPl9NX2hlYWQ7CisgICAgICB3aGlsZSAoX19uMS0+X01fbmV4dCAmJiBfX3guX01faGVhZC5fTV9uZXh0KQorCXsKKwkgIGlmICgoKF9Ob2RlKikgX194Ll9NX2hlYWQuX01fbmV4dCktPl9NX2RhdGEKKwkgICAgICA8ICgoX05vZGUqKSBfX24xLT5fTV9uZXh0KS0+X01fZGF0YSkKKwkgICAgX19zbGlzdF9zcGxpY2VfYWZ0ZXIoX19uMSwgJl9feC5fTV9oZWFkLCBfX3guX01faGVhZC5fTV9uZXh0KTsKKwkgIF9fbjEgPSBfX24xLT5fTV9uZXh0OworCX0KKyAgICAgIGlmIChfX3guX01faGVhZC5fTV9uZXh0KQorCXsKKwkgIF9fbjEtPl9NX25leHQgPSBfX3guX01faGVhZC5fTV9uZXh0OworCSAgX194Ll9NX2hlYWQuX01fbmV4dCA9IDA7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6c29ydCgpCisgICAgeworICAgICAgaWYgKHRoaXMtPl9NX2hlYWQuX01fbmV4dCAmJiB0aGlzLT5fTV9oZWFkLl9NX25leHQtPl9NX25leHQpCisJeworCSAgc2xpc3QgX19jYXJyeTsKKwkgIHNsaXN0IF9fY291bnRlcls2NF07CisJICBpbnQgX19maWxsID0gMDsKKwkgIHdoaWxlICghZW1wdHkoKSkKKwkgICAgeworCSAgICAgIF9fc2xpc3Rfc3BsaWNlX2FmdGVyKCZfX2NhcnJ5Ll9NX2hlYWQsCisJCQkJICAgJnRoaXMtPl9NX2hlYWQsIHRoaXMtPl9NX2hlYWQuX01fbmV4dCk7CisJICAgICAgaW50IF9faSA9IDA7CisJICAgICAgd2hpbGUgKF9faSA8IF9fZmlsbCAmJiAhX19jb3VudGVyW19faV0uZW1wdHkoKSkKKwkJeworCQkgIF9fY291bnRlcltfX2ldLm1lcmdlKF9fY2FycnkpOworCQkgIF9fY2Fycnkuc3dhcChfX2NvdW50ZXJbX19pXSk7CisJCSAgKytfX2k7CisJCX0KKwkgICAgICBfX2NhcnJ5LnN3YXAoX19jb3VudGVyW19faV0pOworCSAgICAgIGlmIChfX2kgPT0gX19maWxsKQorCQkrK19fZmlsbDsKKwkgICAgfQorCSAgCisJICBmb3IgKGludCBfX2kgPSAxOyBfX2kgPCBfX2ZpbGw7ICsrX19pKQorCSAgICBfX2NvdW50ZXJbX19pXS5tZXJnZShfX2NvdW50ZXJbX19pLTFdKTsKKwkgIHRoaXMtPnN3YXAoX19jb3VudGVyW19fZmlsbC0xXSk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CisgICAgICB2b2lkIHNsaXN0PF9UcCwgX0FsbG9jPjo6cmVtb3ZlX2lmKF9QcmVkaWNhdGUgX19wcmVkKQorICAgICAgeworCV9Ob2RlX2Jhc2UqIF9fY3VyID0gJnRoaXMtPl9NX2hlYWQ7CisJd2hpbGUgKF9fY3VyLT5fTV9uZXh0KQorCSAgeworCSAgICBpZiAoX19wcmVkKCgoX05vZGUqKSBfX2N1ci0+X01fbmV4dCktPl9NX2RhdGEpKQorCSAgICAgIHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fY3VyKTsKKwkgICAgZWxzZQorCSAgICAgIF9fY3VyID0gX19jdXItPl9NX25leHQ7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHRlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorICAgICAgdm9pZAorICAgICAgc2xpc3Q8X1RwLCBfQWxsb2M+Ojp1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpCisgICAgICB7CisJX05vZGUqIF9fY3VyID0gKF9Ob2RlKikgdGhpcy0+X01faGVhZC5fTV9uZXh0OworCWlmIChfX2N1cikKKwkgIHsKKwkgICAgd2hpbGUgKF9fY3VyLT5fTV9uZXh0KQorCSAgICAgIHsKKwkJaWYgKF9fcHJlZCgoKF9Ob2RlKilfX2N1ciktPl9NX2RhdGEsCisJCQkgICAoKF9Ob2RlKikoX19jdXItPl9NX25leHQpKS0+X01fZGF0YSkpCisJCSAgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19jdXIpOworCQllbHNlCisJCSAgX19jdXIgPSAoX05vZGUqKSBfX2N1ci0+X01fbmV4dDsKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgdm9pZAorICAgICAgc2xpc3Q8X1RwLCBfQWxsb2M+OjptZXJnZShzbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwKKwkJCSAgICAgICBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgICAgIHsKKwlfTm9kZV9iYXNlKiBfX24xID0gJnRoaXMtPl9NX2hlYWQ7CisJd2hpbGUgKF9fbjEtPl9NX25leHQgJiYgX194Ll9NX2hlYWQuX01fbmV4dCkKKwkgIHsKKwkgICAgaWYgKF9fY29tcCgoKF9Ob2RlKikgX194Ll9NX2hlYWQuX01fbmV4dCktPl9NX2RhdGEsCisJCSAgICAgICAoKF9Ob2RlKikgX19uMS0+X01fbmV4dCktPl9NX2RhdGEpKQorCSAgICAgIF9fc2xpc3Rfc3BsaWNlX2FmdGVyKF9fbjEsICZfX3guX01faGVhZCwgX194Ll9NX2hlYWQuX01fbmV4dCk7CisJICAgIF9fbjEgPSBfX24xLT5fTV9uZXh0OworCSAgfQorCWlmIChfX3guX01faGVhZC5fTV9uZXh0KQorCSAgeworCSAgICBfX24xLT5fTV9uZXh0ID0gX194Ll9NX2hlYWQuX01fbmV4dDsKKwkgICAgX194Ll9NX2hlYWQuX01fbmV4dCA9IDA7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgdm9pZAorICAgICAgc2xpc3Q8X1RwLCBfQWxsb2M+Ojpzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorICAgICAgeworCWlmICh0aGlzLT5fTV9oZWFkLl9NX25leHQgJiYgdGhpcy0+X01faGVhZC5fTV9uZXh0LT5fTV9uZXh0KQorCSAgeworCSAgICBzbGlzdCBfX2NhcnJ5OworCSAgICBzbGlzdCBfX2NvdW50ZXJbNjRdOworCSAgICBpbnQgX19maWxsID0gMDsKKwkgICAgd2hpbGUgKCFlbXB0eSgpKQorCSAgICAgIHsKKwkJX19zbGlzdF9zcGxpY2VfYWZ0ZXIoJl9fY2FycnkuX01faGVhZCwKKwkJCQkgICAgICZ0aGlzLT5fTV9oZWFkLCB0aGlzLT5fTV9oZWFkLl9NX25leHQpOworCQlpbnQgX19pID0gMDsKKwkJd2hpbGUgKF9faSA8IF9fZmlsbCAmJiAhX19jb3VudGVyW19faV0uZW1wdHkoKSkKKwkJICB7CisJCSAgICBfX2NvdW50ZXJbX19pXS5tZXJnZShfX2NhcnJ5LCBfX2NvbXApOworCQkgICAgX19jYXJyeS5zd2FwKF9fY291bnRlcltfX2ldKTsKKwkJICAgICsrX19pOworCQkgIH0KKwkJX19jYXJyeS5zd2FwKF9fY291bnRlcltfX2ldKTsKKwkJaWYgKF9faSA9PSBfX2ZpbGwpCisJCSAgKytfX2ZpbGw7CisJICAgICAgfQorCisJICAgIGZvciAoaW50IF9faSA9IDE7IF9faSA8IF9fZmlsbDsgKytfX2kpCisJICAgICAgX19jb3VudGVyW19faV0ubWVyZ2UoX19jb3VudGVyW19faS0xXSwgX19jb21wKTsKKwkgICAgdGhpcy0+c3dhcChfX2NvdW50ZXJbX19maWxsLTFdKTsKKwkgIH0KKyAgICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gU3BlY2lhbGl6YXRpb24gb2YgaW5zZXJ0X2l0ZXJhdG9yIHNvIHRoYXQgaW5zZXJ0aW9ucyB3aWxsIGJlIGNvbnN0YW50CisgIC8vIHRpbWUgcmF0aGVyIHRoYW4gbGluZWFyIHRpbWUuCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X19nbnVfY3h4OjpzbGlzdDxfVHAsIF9BbGxvYz4gPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6c2xpc3Q8X1RwLCBfQWxsb2M+IF9Db250YWluZXI7CisgICAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CisgICAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBpdGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgICAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBfX2kpCisgICAgICA6IGNvbnRhaW5lcigmX194KQorICAgICAgeworCWlmIChfX2kgPT0gX194LmJlZ2luKCkpCisJICBpdGVyID0gX194LmJlZm9yZV9iZWdpbigpOworCWVsc2UKKwkgIGl0ZXIgPSBfX3gucHJldmlvdXMoX19pKTsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJaXRlciA9IGNvbnRhaW5lci0+aW5zZXJ0X2FmdGVyKGl0ZXIsIF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9zc29fc3RyaW5nX2Jhc2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3Nzb19zdHJpbmdfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYjQzMDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9zc29fc3RyaW5nX2Jhc2UuaApAQCAtMCwwICsxLDU3NiBAQAorLy8gU2hvcnQtc3RyaW5nLW9wdGltaXplZCB2ZXJzYXRpbGUgc3RyaW5nIGJhc2UgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9zc29fc3RyaW5nX2Jhc2UuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4dC92c3RyaW5nLmh9CisgKi8KKworI2lmbmRlZiBfU1NPX1NUUklOR19CQVNFX0gKKyNkZWZpbmUgX1NTT19TVFJJTkdfQkFTRV9IIDEKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIF9fc3NvX3N0cmluZ19iYXNlCisgICAgOiBwcm90ZWN0ZWQgX192c3RyaW5nX3V0aWxpdHk8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RyYWl0cwkJCQkJICAgIHRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUJCSAgICB2YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmIF9fdnN0cmluZ191dGlsaXR5PF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAgICBfVXRpbF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVXRpbF9CYXNlOjpfQ2hhclRfYWxsb2NfdHlwZSAgICAgICAgX0NoYXJUX2FsbG9jX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpzaXplX3R5cGUJICAgIHNpemVfdHlwZTsKKyAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAvLyBEYXRhIE1lbWJlcnM6CisgICAgICB0eXBlbmFtZSBfVXRpbF9CYXNlOjp0ZW1wbGF0ZSBfQWxsb2NfaGlkZXI8X0NoYXJUX2FsbG9jX3R5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9kYXRhcGx1czsKKyAgICAgIHNpemVfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3N0cmluZ19sZW5ndGg7CisKKyAgICAgIGVudW0geyBfU19sb2NhbF9jYXBhY2l0eSA9IDE1IH07CisgICAgICAKKyAgICAgIHVuaW9uCisgICAgICB7CisJX0NoYXJUICAgICAgICAgICBfTV9sb2NhbF9kYXRhW19TX2xvY2FsX2NhcGFjaXR5ICsgMV07CisJc2l6ZV90eXBlICAgICAgICBfTV9hbGxvY2F0ZWRfY2FwYWNpdHk7CisgICAgICB9OworCisgICAgICB2b2lkCisgICAgICBfTV9kYXRhKF9DaGFyVCogX19wKQorICAgICAgeyBfTV9kYXRhcGx1cy5fTV9wID0gX19wOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2xlbmd0aChzaXplX3R5cGUgX19sZW5ndGgpCisgICAgICB7IF9NX3N0cmluZ19sZW5ndGggPSBfX2xlbmd0aDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jYXBhY2l0eShzaXplX3R5cGUgX19jYXBhY2l0eSkKKyAgICAgIHsgX01fYWxsb2NhdGVkX2NhcGFjaXR5ID0gX19jYXBhY2l0eTsgfQorCisgICAgICBib29sCisgICAgICBfTV9pc19sb2NhbCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhKCkgPT0gX01fbG9jYWxfZGF0YTsgfQorCisgICAgICAvLyBDcmVhdGUgJiBEZXN0cm95CisgICAgICBfQ2hhclQqCisgICAgICBfTV9jcmVhdGUoc2l6ZV90eXBlJiwgc2l6ZV90eXBlKTsKKyAgICAgIAorICAgICAgdm9pZAorICAgICAgX01fZGlzcG9zZSgpCisgICAgICB7CisJaWYgKCFfTV9pc19sb2NhbCgpKQorCSAgX01fZGVzdHJveShfTV9hbGxvY2F0ZWRfY2FwYWNpdHkpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kZXN0cm95KHNpemVfdHlwZSBfX3NpemUpIHRocm93KCkKKyAgICAgIHsgX01fZ2V0X2FsbG9jYXRvcigpLmRlYWxsb2NhdGUoX01fZGF0YSgpLCBfX3NpemUgKyAxKTsgfQorCisgICAgICAvLyBfTV9jb25zdHJ1Y3RfYXV4IGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSAyMS4zLjEgcGFyYSAxNSB3aGljaAorICAgICAgLy8gcmVxdWlyZXMgc3BlY2lhbCBiZWhhdmlvdXIgaWYgX0luSXRlcmF0b3IgaXMgYW4gaW50ZWdyYWwgdHlwZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fY29uc3RydWN0X2F1eChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsIAorCQkJIHN0ZDo6X19mYWxzZV90eXBlKQorCXsKKyAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5JdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9UYWc7CisgICAgICAgICAgX01fY29uc3RydWN0KF9fYmVnLCBfX2VuZCwgX1RhZygpKTsKKwl9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzOC4gQW1iaWd1aXR5IGluIHRoZSAiZG8gdGhlIHJpZ2h0IHRoaW5nIiBjbGF1c2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlZ2VyPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2NvbnN0cnVjdF9hdXgoX0ludGVnZXIgX19iZWcsIF9JbnRlZ2VyIF9fZW5kLCBzdGQ6Ol9fdHJ1ZV90eXBlKQorCXsgX01fY29uc3RydWN0X2F1eF8yKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19iZWcpLCBfX2VuZCk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fY29uc3RydWN0X2F1eF8yKHNpemVfdHlwZSBfX3JlcSwgX0NoYXJUIF9fYykKKyAgICAgIHsgX01fY29uc3RydWN0KF9fcmVxLCBfX2MpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQpCisJeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5JdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9jb25zdHJ1Y3RfYXV4KF9fYmVnLCBfX2VuZCwgX0ludGVncmFsKCkpOworICAgICAgICB9CisKKyAgICAgIC8vIEZvciBJbnB1dCBJdGVyYXRvcnMsIHVzZWQgaW4gaXN0cmVhbWJ1Zl9pdGVyYXRvcnMsIGV0Yy4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsCisJCSAgICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpOworICAgICAgCisgICAgICAvLyBGb3IgZm9yd2FyZF9pdGVyYXRvcnMgdXAgdG8gcmFuZG9tX2FjY2Vzc19pdGVyYXRvcnMsIHVzZWQgZm9yCisgICAgICAvLyBzdHJpbmc6Oml0ZXJhdG9yLCBfQ2hhclQqLCBldGMuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkSXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fY29uc3RydWN0KF9Gd2RJdGVyYXRvciBfX2JlZywgX0Z3ZEl0ZXJhdG9yIF9fZW5kLAorCQkgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpOworCisgICAgICB2b2lkCisgICAgICBfTV9jb25zdHJ1Y3Qoc2l6ZV90eXBlIF9fcmVxLCBfQ2hhclQgX19jKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9NX2dldF9hbGxvY2F0b3IoKS5tYXhfc2l6ZSgpIC0gMSkgLyAyOyB9CisKKyAgICAgIF9DaGFyVCoKKyAgICAgIF9NX2RhdGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YXBsdXMuX01fcDsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2xlbmd0aCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9zdHJpbmdfbGVuZ3RoOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fY2FwYWNpdHkoKSBjb25zdAorICAgICAgeworCXJldHVybiBfTV9pc19sb2NhbCgpID8gc2l6ZV90eXBlKF9TX2xvY2FsX2NhcGFjaXR5KQorCSAgICAgICAgICAgICAgICAgICAgIDogX01fYWxsb2NhdGVkX2NhcGFjaXR5OyAKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgX01faXNfc2hhcmVkKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3NldF9sZWFrZWQoKSB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fbGVhaygpIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfbGVuZ3RoKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJX01fbGVuZ3RoKF9fbik7CisJdHJhaXRzX3R5cGU6OmFzc2lnbihfTV9kYXRhKClbX19uXSwgX0NoYXJUKCkpOworICAgICAgfQorCisgICAgICBfX3Nzb19zdHJpbmdfYmFzZSgpCisgICAgICA6IF9NX2RhdGFwbHVzKF9NX2xvY2FsX2RhdGEpCisgICAgICB7IF9NX3NldF9sZW5ndGgoMCk7IH0KKworICAgICAgX19zc29fc3RyaW5nX2Jhc2UoY29uc3QgX0FsbG9jJiBfX2EpOworCisgICAgICBfX3Nzb19zdHJpbmdfYmFzZShjb25zdCBfX3Nzb19zdHJpbmdfYmFzZSYgX19yY3MpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgX19zc29fc3RyaW5nX2Jhc2UoX19zc29fc3RyaW5nX2Jhc2UmJiBfX3Jjcyk7CisjZW5kaWYKKworICAgICAgX19zc29fc3RyaW5nX2Jhc2Uoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYywgY29uc3QgX0FsbG9jJiBfX2EpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgX19zc29fc3RyaW5nX2Jhc2UoX0lucHV0SXRlcmF0b3IgX19iZWcsIF9JbnB1dEl0ZXJhdG9yIF9fZW5kLAorCQkJICBjb25zdCBfQWxsb2MmIF9fYSk7CisKKyAgICAgIH5fX3Nzb19zdHJpbmdfYmFzZSgpCisgICAgICB7IF9NX2Rpc3Bvc2UoKTsgfQorCisgICAgICBfQ2hhclRfYWxsb2NfdHlwZSYKKyAgICAgIF9NX2dldF9hbGxvY2F0b3IoKQorICAgICAgeyByZXR1cm4gX01fZGF0YXBsdXM7IH0KKworICAgICAgY29uc3QgX0NoYXJUX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGFwbHVzOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N3YXAoX19zc29fc3RyaW5nX2Jhc2UmIF9fcmNzKTsKKworICAgICAgdm9pZAorICAgICAgX01fYXNzaWduKGNvbnN0IF9fc3NvX3N0cmluZ19iYXNlJiBfX3Jjcyk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3Jlc2VydmUoc2l6ZV90eXBlIF9fcmVzKTsKKworICAgICAgdm9pZAorICAgICAgX01fbXV0YXRlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbGVuMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJCXNpemVfdHlwZSBfX2xlbjIpOworCisgICAgICB2b2lkCisgICAgICBfTV9lcmFzZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pOworCisgICAgICB2b2lkCisgICAgICBfTV9jbGVhcigpCisgICAgICB7IF9NX3NldF9sZW5ndGgoMCk7IH0KKworICAgICAgYm9vbAorICAgICAgX01fY29tcGFyZShjb25zdCBfX3Nzb19zdHJpbmdfYmFzZSYpIGNvbnN0CisgICAgICB7IHJldHVybiBmYWxzZTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fc3NvX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fc3dhcChfX3Nzb19zdHJpbmdfYmFzZSYgX19yY3MpCisgICAgeworICAgICAgaWYgKHRoaXMgPT0gJl9fcmNzKQorCXJldHVybjsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDMxLiBTd2FwcGluZyBjb250YWluZXJzIHdpdGggdW5lcXVhbCBhbGxvY2F0b3JzLgorICAgICAgc3RkOjpfX2FsbG9jX3N3YXA8X0NoYXJUX2FsbG9jX3R5cGU+OjpfU19kb19pdChfTV9nZXRfYWxsb2NhdG9yKCksCisJCQkJCQkgICAgIF9fcmNzLl9NX2dldF9hbGxvY2F0b3IoKSk7CisKKyAgICAgIGlmIChfTV9pc19sb2NhbCgpKQorCWlmIChfX3Jjcy5fTV9pc19sb2NhbCgpKQorCSAgeworCSAgICBpZiAoX01fbGVuZ3RoKCkgJiYgX19yY3MuX01fbGVuZ3RoKCkpCisJICAgICAgeworCQlfQ2hhclQgX190bXBfZGF0YVtfU19sb2NhbF9jYXBhY2l0eSArIDFdOworCQl0cmFpdHNfdHlwZTo6Y29weShfX3RtcF9kYXRhLCBfX3Jjcy5fTV9sb2NhbF9kYXRhLAorCQkJCSAgX1NfbG9jYWxfY2FwYWNpdHkgKyAxKTsKKwkJdHJhaXRzX3R5cGU6OmNvcHkoX19yY3MuX01fbG9jYWxfZGF0YSwgX01fbG9jYWxfZGF0YSwKKwkJCQkgIF9TX2xvY2FsX2NhcGFjaXR5ICsgMSk7CisJCXRyYWl0c190eXBlOjpjb3B5KF9NX2xvY2FsX2RhdGEsIF9fdG1wX2RhdGEsCisJCQkJICBfU19sb2NhbF9jYXBhY2l0eSArIDEpOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoX19yY3MuX01fbGVuZ3RoKCkpCisJICAgICAgeworCQl0cmFpdHNfdHlwZTo6Y29weShfTV9sb2NhbF9kYXRhLCBfX3Jjcy5fTV9sb2NhbF9kYXRhLAorCQkJCSAgX1NfbG9jYWxfY2FwYWNpdHkgKyAxKTsKKwkJX01fbGVuZ3RoKF9fcmNzLl9NX2xlbmd0aCgpKTsKKwkJX19yY3MuX01fc2V0X2xlbmd0aCgwKTsKKwkJcmV0dXJuOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoX01fbGVuZ3RoKCkpCisJICAgICAgeworCQl0cmFpdHNfdHlwZTo6Y29weShfX3Jjcy5fTV9sb2NhbF9kYXRhLCBfTV9sb2NhbF9kYXRhLAorCQkJCSAgX1NfbG9jYWxfY2FwYWNpdHkgKyAxKTsKKwkJX19yY3MuX01fbGVuZ3RoKF9NX2xlbmd0aCgpKTsKKwkJX01fc2V0X2xlbmd0aCgwKTsKKwkJcmV0dXJuOworCSAgICAgIH0KKwkgIH0KKwllbHNlCisJICB7CisJICAgIGNvbnN0IHNpemVfdHlwZSBfX3RtcF9jYXBhY2l0eSA9IF9fcmNzLl9NX2FsbG9jYXRlZF9jYXBhY2l0eTsKKwkgICAgdHJhaXRzX3R5cGU6OmNvcHkoX19yY3MuX01fbG9jYWxfZGF0YSwgX01fbG9jYWxfZGF0YSwKKwkJCSAgICAgIF9TX2xvY2FsX2NhcGFjaXR5ICsgMSk7CisJICAgIF9NX2RhdGEoX19yY3MuX01fZGF0YSgpKTsKKwkgICAgX19yY3MuX01fZGF0YShfX3Jjcy5fTV9sb2NhbF9kYXRhKTsKKwkgICAgX01fY2FwYWNpdHkoX190bXBfY2FwYWNpdHkpOworCSAgfQorICAgICAgZWxzZQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX3RtcF9jYXBhY2l0eSA9IF9NX2FsbG9jYXRlZF9jYXBhY2l0eTsKKwkgIGlmIChfX3Jjcy5fTV9pc19sb2NhbCgpKQorCSAgICB7CisJICAgICAgdHJhaXRzX3R5cGU6OmNvcHkoX01fbG9jYWxfZGF0YSwgX19yY3MuX01fbG9jYWxfZGF0YSwKKwkJCQlfU19sb2NhbF9jYXBhY2l0eSArIDEpOworCSAgICAgIF9fcmNzLl9NX2RhdGEoX01fZGF0YSgpKTsKKwkgICAgICBfTV9kYXRhKF9NX2xvY2FsX2RhdGEpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfQ2hhclQqIF9fdG1wX3B0ciA9IF9NX2RhdGEoKTsKKwkgICAgICBfTV9kYXRhKF9fcmNzLl9NX2RhdGEoKSk7CisJICAgICAgX19yY3MuX01fZGF0YShfX3RtcF9wdHIpOworCSAgICAgIF9NX2NhcGFjaXR5KF9fcmNzLl9NX2FsbG9jYXRlZF9jYXBhY2l0eSk7CisJICAgIH0KKwkgIF9fcmNzLl9NX2NhcGFjaXR5KF9fdG1wX2NhcGFjaXR5KTsKKwl9CisKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3RtcF9sZW5ndGggPSBfTV9sZW5ndGgoKTsKKyAgICAgIF9NX2xlbmd0aChfX3Jjcy5fTV9sZW5ndGgoKSk7CisgICAgICBfX3Jjcy5fTV9sZW5ndGgoX190bXBfbGVuZ3RoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX0NoYXJUKgorICAgIF9fc3NvX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fY3JlYXRlKHNpemVfdHlwZSYgX19jYXBhY2l0eSwgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5KQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDgzLiAgU3RyaW5nOjpucG9zIHZzLiBzdHJpbmc6Om1heF9zaXplKCkKKyAgICAgIGlmIChfX2NhcGFjaXR5ID4gX01fbWF4X3NpemUoKSkKKwlzdGQ6Ol9fdGhyb3dfbGVuZ3RoX2Vycm9yKF9fTigiX19zc29fc3RyaW5nX2Jhc2U6Ol9NX2NyZWF0ZSIpKTsKKworICAgICAgLy8gVGhlIGJlbG93IGltcGxlbWVudHMgYW4gZXhwb25lbnRpYWwgZ3Jvd3RoIHBvbGljeSwgbmVjZXNzYXJ5IHRvCisgICAgICAvLyBtZWV0IGFtb3J0aXplZCBsaW5lYXIgdGltZSByZXF1aXJlbWVudHMgb2YgdGhlIGxpYnJhcnk6IHNlZQorICAgICAgLy8gaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAxLTA3L21zZzAwMDg1Lmh0bWwuCisgICAgICBpZiAoX19jYXBhY2l0eSA+IF9fb2xkX2NhcGFjaXR5ICYmIF9fY2FwYWNpdHkgPCAyICogX19vbGRfY2FwYWNpdHkpCisJeworCSAgX19jYXBhY2l0eSA9IDIgKiBfX29sZF9jYXBhY2l0eTsKKwkgIC8vIE5ldmVyIGFsbG9jYXRlIGEgc3RyaW5nIGJpZ2dlciB0aGFuIG1heF9zaXplLgorCSAgaWYgKF9fY2FwYWNpdHkgPiBfTV9tYXhfc2l6ZSgpKQorCSAgICBfX2NhcGFjaXR5ID0gX01fbWF4X3NpemUoKTsKKwl9CisKKyAgICAgIC8vIE5COiBOZWVkIGFuIGFycmF5IG9mIGNoYXJfdHlwZVtfX2NhcGFjaXR5XSwgcGx1cyBhIHRlcm1pbmF0aW5nCisgICAgICAvLyBudWxsIGNoYXJfdHlwZSgpIGVsZW1lbnQuCisgICAgICByZXR1cm4gX01fZ2V0X2FsbG9jYXRvcigpLmFsbG9jYXRlKF9fY2FwYWNpdHkgKyAxKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX19zc29fc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfX3Nzb19zdHJpbmdfYmFzZShjb25zdCBfQWxsb2MmIF9fYSkKKyAgICA6IF9NX2RhdGFwbHVzKF9fYSwgX01fbG9jYWxfZGF0YSkKKyAgICB7IF9NX3NldF9sZW5ndGgoMCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9fc3NvX3N0cmluZ19iYXNlKGNvbnN0IF9fc3NvX3N0cmluZ19iYXNlJiBfX3JjcykKKyAgICA6IF9NX2RhdGFwbHVzKF9fcmNzLl9NX2dldF9hbGxvY2F0b3IoKSwgX01fbG9jYWxfZGF0YSkKKyAgICB7IF9NX2NvbnN0cnVjdChfX3Jjcy5fTV9kYXRhKCksIF9fcmNzLl9NX2RhdGEoKSArIF9fcmNzLl9NX2xlbmd0aCgpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9fc3NvX3N0cmluZ19iYXNlKF9fc3NvX3N0cmluZ19iYXNlJiYgX19yY3MpCisgICAgOiBfTV9kYXRhcGx1cyhfX3Jjcy5fTV9nZXRfYWxsb2NhdG9yKCksIF9NX2xvY2FsX2RhdGEpCisgICAgeworICAgICAgaWYgKF9fcmNzLl9NX2lzX2xvY2FsKCkpCisJeworCSAgaWYgKF9fcmNzLl9NX2xlbmd0aCgpKQorCSAgICB0cmFpdHNfdHlwZTo6Y29weShfTV9sb2NhbF9kYXRhLCBfX3Jjcy5fTV9sb2NhbF9kYXRhLAorCQkJICAgICAgX1NfbG9jYWxfY2FwYWNpdHkgKyAxKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgX01fZGF0YShfX3Jjcy5fTV9kYXRhKCkpOworCSAgX01fY2FwYWNpdHkoX19yY3MuX01fYWxsb2NhdGVkX2NhcGFjaXR5KTsKKwl9CisKKyAgICAgIF9NX3NldF9sZW5ndGgoX19yY3MuX01fbGVuZ3RoKCkpOworICAgICAgX19yY3MuX01fZGF0YShfX3Jjcy5fTV9sb2NhbF9kYXRhKTsKKyAgICAgIF9fcmNzLl9NX3NldF9sZW5ndGgoMCk7CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX19zc29fc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfX3Nzb19zdHJpbmdfYmFzZShzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICA6IF9NX2RhdGFwbHVzKF9fYSwgX01fbG9jYWxfZGF0YSkKKyAgICB7IF9NX2NvbnN0cnVjdChfX24sIF9fYyk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9fc3NvX3N0cmluZ19iYXNlKF9JbnB1dEl0ZXJhdG9yIF9fYmVnLCBfSW5wdXRJdGVyYXRvciBfX2VuZCwKKwkJICAgICAgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfX2EsIF9NX2xvY2FsX2RhdGEpCisgICAgeyBfTV9jb25zdHJ1Y3QoX19iZWcsIF9fZW5kKTsgfQorCisgIC8vIE5COiBUaGlzIGlzIHRoZSBzcGVjaWFsIGNhc2UgZm9yIElucHV0IEl0ZXJhdG9ycywgdXNlZCBpbgorICAvLyBpc3RyZWFtYnVmX2l0ZXJhdG9ycywgZXRjLgorICAvLyBJbnB1dCBJdGVyYXRvcnMgaGF2ZSBhIGNvc3Qgc3RydWN0dXJlIHZlcnkgZGlmZmVyZW50IGZyb20KKyAgLy8gcG9pbnRlcnMsIGNhbGxpbmcgZm9yIGEgZGlmZmVyZW50IGNvZGluZyBzdHlsZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgICAgX01fY29uc3RydWN0KF9Jbkl0ZXJhdG9yIF9fYmVnLCBfSW5JdGVyYXRvciBfX2VuZCwKKwkJICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgICB7CisJc2l6ZV90eXBlIF9fbGVuID0gMDsKKwlzaXplX3R5cGUgX19jYXBhY2l0eSA9IHNpemVfdHlwZShfU19sb2NhbF9jYXBhY2l0eSk7CisKKwl3aGlsZSAoX19iZWcgIT0gX19lbmQgJiYgX19sZW4gPCBfX2NhcGFjaXR5KQorCSAgeworCSAgICBfTV9kYXRhKClbX19sZW4rK10gPSAqX19iZWc7CisJICAgICsrX19iZWc7CisJICB9CisJCisJX190cnkKKwkgIHsKKwkgICAgd2hpbGUgKF9fYmVnICE9IF9fZW5kKQorCSAgICAgIHsKKwkJaWYgKF9fbGVuID09IF9fY2FwYWNpdHkpCisJCSAgeworCQkgICAgLy8gQWxsb2NhdGUgbW9yZSBzcGFjZS4KKwkJICAgIF9fY2FwYWNpdHkgPSBfX2xlbiArIDE7CisJCSAgICBfQ2hhclQqIF9fYW5vdGhlciA9IF9NX2NyZWF0ZShfX2NhcGFjaXR5LCBfX2xlbik7CisJCSAgICB0aGlzLT5fU19jb3B5KF9fYW5vdGhlciwgX01fZGF0YSgpLCBfX2xlbik7CisJCSAgICBfTV9kaXNwb3NlKCk7CisJCSAgICBfTV9kYXRhKF9fYW5vdGhlcik7CisJCSAgICBfTV9jYXBhY2l0eShfX2NhcGFjaXR5KTsKKwkJICB9CisJCV9NX2RhdGEoKVtfX2xlbisrXSA9ICpfX2JlZzsKKwkJKytfX2JlZzsKKwkgICAgICB9CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9NX2Rpc3Bvc2UoKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisKKwlfTV9zZXRfbGVuZ3RoKF9fbGVuKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9fc3NvX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgICBfTV9jb25zdHJ1Y3QoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLAorCQkgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCS8vIE5COiBOb3QgcmVxdWlyZWQsIGJ1dCBjb25zaWRlcmVkIGJlc3QgcHJhY3RpY2UuCisJaWYgKF9faXNfbnVsbF9wb2ludGVyKF9fYmVnKSAmJiBfX2JlZyAhPSBfX2VuZCkKKwkgIHN0ZDo6X190aHJvd19sb2dpY19lcnJvcihfX04oIl9fc3NvX3N0cmluZ19iYXNlOjoiCisJCQkJICAgICAgICJfTV9jb25zdHJ1Y3QgbnVsbCBub3QgdmFsaWQiKSk7CisKKwlzaXplX3R5cGUgX19kbmV3ID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihzdGQ6OmRpc3RhbmNlKF9fYmVnLCBfX2VuZCkpOworCisJaWYgKF9fZG5ldyA+IHNpemVfdHlwZShfU19sb2NhbF9jYXBhY2l0eSkpCisJICB7CisJICAgIF9NX2RhdGEoX01fY3JlYXRlKF9fZG5ldywgc2l6ZV90eXBlKDApKSk7CisJICAgIF9NX2NhcGFjaXR5KF9fZG5ldyk7CisJICB9CisKKwkvLyBDaGVjayBmb3Igb3V0X29mX3JhbmdlIGFuZCBsZW5ndGhfZXJyb3IgZXhjZXB0aW9ucy4KKwlfX3RyeQorCSAgeyB0aGlzLT5fU19jb3B5X2NoYXJzKF9NX2RhdGEoKSwgX19iZWcsIF9fZW5kKTsgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9kaXNwb3NlKCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCisJX01fc2V0X2xlbmd0aChfX2RuZXcpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX2NvbnN0cnVjdChzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIGlmIChfX24gPiBzaXplX3R5cGUoX1NfbG9jYWxfY2FwYWNpdHkpKQorCXsKKwkgIF9NX2RhdGEoX01fY3JlYXRlKF9fbiwgc2l6ZV90eXBlKDApKSk7CisJICBfTV9jYXBhY2l0eShfX24pOworCX0KKworICAgICAgaWYgKF9fbikKKwl0aGlzLT5fU19hc3NpZ24oX01fZGF0YSgpLCBfX24sIF9fYyk7CisKKyAgICAgIF9NX3NldF9sZW5ndGgoX19uKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fc3NvX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fYXNzaWduKGNvbnN0IF9fc3NvX3N0cmluZ19iYXNlJiBfX3JjcykKKyAgICB7CisgICAgICBpZiAodGhpcyAhPSAmX19yY3MpCisJeworCSAgY29uc3Qgc2l6ZV90eXBlIF9fcnNpemUgPSBfX3Jjcy5fTV9sZW5ndGgoKTsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2NhcGFjaXR5ID0gX01fY2FwYWNpdHkoKTsKKworCSAgaWYgKF9fcnNpemUgPiBfX2NhcGFjaXR5KQorCSAgICB7CisJICAgICAgc2l6ZV90eXBlIF9fbmV3X2NhcGFjaXR5ID0gX19yc2l6ZTsKKwkgICAgICBfQ2hhclQqIF9fdG1wID0gX01fY3JlYXRlKF9fbmV3X2NhcGFjaXR5LCBfX2NhcGFjaXR5KTsKKwkgICAgICBfTV9kaXNwb3NlKCk7CisJICAgICAgX01fZGF0YShfX3RtcCk7CisJICAgICAgX01fY2FwYWNpdHkoX19uZXdfY2FwYWNpdHkpOworCSAgICB9CisKKwkgIGlmIChfX3JzaXplKQorCSAgICB0aGlzLT5fU19jb3B5KF9NX2RhdGEoKSwgX19yY3MuX01fZGF0YSgpLCBfX3JzaXplKTsKKworCSAgX01fc2V0X2xlbmd0aChfX3JzaXplKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX3Jlc2VydmUoc2l6ZV90eXBlIF9fcmVzKQorICAgIHsKKyAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBzaHJpbmsgYmVsb3cgdGhlIGN1cnJlbnQgc2l6ZS4KKyAgICAgIGlmIChfX3JlcyA8IF9NX2xlbmd0aCgpKQorCV9fcmVzID0gX01fbGVuZ3RoKCk7CisKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2NhcGFjaXR5ID0gX01fY2FwYWNpdHkoKTsKKyAgICAgIGlmIChfX3JlcyAhPSBfX2NhcGFjaXR5KQorCXsKKwkgIGlmIChfX3JlcyA+IF9fY2FwYWNpdHkKKwkgICAgICB8fCBfX3JlcyA+IHNpemVfdHlwZShfU19sb2NhbF9jYXBhY2l0eSkpCisJICAgIHsKKwkgICAgICBfQ2hhclQqIF9fdG1wID0gX01fY3JlYXRlKF9fcmVzLCBfX2NhcGFjaXR5KTsKKwkgICAgICB0aGlzLT5fU19jb3B5KF9fdG1wLCBfTV9kYXRhKCksIF9NX2xlbmd0aCgpICsgMSk7CisJICAgICAgX01fZGlzcG9zZSgpOworCSAgICAgIF9NX2RhdGEoX190bXApOworCSAgICAgIF9NX2NhcGFjaXR5KF9fcmVzKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoIV9NX2lzX2xvY2FsKCkpCisJICAgIHsKKwkgICAgICB0aGlzLT5fU19jb3B5KF9NX2xvY2FsX2RhdGEsIF9NX2RhdGEoKSwgX01fbGVuZ3RoKCkgKyAxKTsKKwkgICAgICBfTV9kZXN0cm95KF9fY2FwYWNpdHkpOworCSAgICAgIF9NX2RhdGEoX01fbG9jYWxfZGF0YSk7CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX211dGF0ZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX2xlbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCSAgICAgIHNpemVfdHlwZSBfX2xlbjIpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9faG93X211Y2ggPSBfTV9sZW5ndGgoKSAtIF9fcG9zIC0gX19sZW4xOworICAgICAgCisgICAgICBzaXplX3R5cGUgX19uZXdfY2FwYWNpdHkgPSBfTV9sZW5ndGgoKSArIF9fbGVuMiAtIF9fbGVuMTsKKyAgICAgIF9DaGFyVCogX19yID0gX01fY3JlYXRlKF9fbmV3X2NhcGFjaXR5LCBfTV9jYXBhY2l0eSgpKTsKKworICAgICAgaWYgKF9fcG9zKQorCXRoaXMtPl9TX2NvcHkoX19yLCBfTV9kYXRhKCksIF9fcG9zKTsKKyAgICAgIGlmIChfX3MgJiYgX19sZW4yKQorCXRoaXMtPl9TX2NvcHkoX19yICsgX19wb3MsIF9fcywgX19sZW4yKTsKKyAgICAgIGlmIChfX2hvd19tdWNoKQorCXRoaXMtPl9TX2NvcHkoX19yICsgX19wb3MgKyBfX2xlbjIsCisJCSAgICAgIF9NX2RhdGEoKSArIF9fcG9zICsgX19sZW4xLCBfX2hvd19tdWNoKTsKKyAgICAgIAorICAgICAgX01fZGlzcG9zZSgpOworICAgICAgX01fZGF0YShfX3IpOworICAgICAgX01fY2FwYWNpdHkoX19uZXdfY2FwYWNpdHkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19zc29fc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9lcmFzZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9faG93X211Y2ggPSBfTV9sZW5ndGgoKSAtIF9fcG9zIC0gX19uOworCisgICAgICBpZiAoX19ob3dfbXVjaCAmJiBfX24pCisJdGhpcy0+X1NfbW92ZShfTV9kYXRhKCkgKyBfX3BvcywgX01fZGF0YSgpICsgX19wb3MgKyBfX24sIF9faG93X211Y2gpOworCisgICAgICBfTV9zZXRfbGVuZ3RoKF9NX2xlbmd0aCgpIC0gX19uKTsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9TU09fU1RSSU5HX0JBU0VfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvc3RkaW9fZmlsZWJ1Zi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvc3RkaW9fZmlsZWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDY2YWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9zdGRpb19maWxlYnVmLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8vIEZpbGUgZGVzY3JpcHRvciBsYXllciBmb3IgZmlsZWJ1ZiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L3N0ZGlvX2ZpbGVidWYuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX1NURElPX0ZJTEVCVUZfSAorI2RlZmluZSBfU1RESU9fRklMRUJVRl9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmIFByb3ZpZGVzIGEgbGF5ZXIgb2YgY29tcGF0aWJpbGl0eSBmb3IgQy9QT1NJWC4KKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBUaGlzIEdOVSBleHRlbnNpb24gcHJvdmlkZXMgZXh0ZW5zaW9ucyBmb3Igd29ya2luZyB3aXRoIHN0YW5kYXJkIEMKKyAgICogIEZJTEUqJ3MgYW5kIFBPU0lYIGZpbGUgZGVzY3JpcHRvcnMuICBJdCBtdXN0IGJlIGluc3RhbnRpYXRlZCBieSB0aGUKKyAgICogIHVzZXIgd2l0aCB0aGUgdHlwZSBvZiBjaGFyYWN0ZXIgdXNlZCBpbiB0aGUgZmlsZSBzdHJlYW0sIGUuZy4sCisgICAqICBzdGRpb19maWxlYnVmPGNoYXI+LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIHN0ZGlvX2ZpbGVidWYgOiBwdWJsaWMgc3RkOjpiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVAkJCQkgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cwkJCQkgICAgICAgIHRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUJCWludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUJCXBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUJCW9mZl90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Q7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIGRlZmVycmVkIGluaXRpYWxpemF0aW9uCisgICAgICAqLworICAgICAgc3RkaW9fZmlsZWJ1ZigpIDogc3RkOjpiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz4oKSB7fQorCisgICAgICAvKioKKyAgICAgICAqICBAcGFyYW0gIF9fZmQgIEFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBTYW1lIG1lYW5pbmcgYXMgaW4gYSBzdGFuZGFyZCBmaWxlYnVmLgorICAgICAgICogIEBwYXJhbSAgX19zaXplIE9wdGltYWwgb3IgcHJlZmVycmVkIHNpemUgb2YgaW50ZXJuYWwgYnVmZmVyLAorICAgICAgICogICAgICAgICAgICAgICAgIGluIGNoYXJzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGFzc29jaWF0ZXMgYSBmaWxlIHN0cmVhbSBidWZmZXIgd2l0aCBhbiBvcGVuCisgICAgICAgKiAgUE9TSVggZmlsZSBkZXNjcmlwdG9yLiBUaGUgZmlsZSBkZXNjcmlwdG9yIHdpbGwgYmUgYXV0b21hdGljYWxseQorICAgICAgICogIGNsb3NlZCB3aGVuIHRoZSBzdGRpb19maWxlYnVmIGlzIGNsb3NlZC9kZXN0cm95ZWQuCisgICAgICAqLworICAgICAgc3RkaW9fZmlsZWJ1ZihpbnQgX19mZCwgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlLAorCQkgICAgc2l6ZV90IF9fc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oQlVGU0laKSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBwYXJhbSAgX19mICBBbiBvcGVuIEBjIEZJTEUqLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBTYW1lIG1lYW5pbmcgYXMgaW4gYSBzdGFuZGFyZCBmaWxlYnVmLgorICAgICAgICogIEBwYXJhbSAgX19zaXplIE9wdGltYWwgb3IgcHJlZmVycmVkIHNpemUgb2YgaW50ZXJuYWwgYnVmZmVyLAorICAgICAgICogICAgICAgICAgICAgICAgIGluIGNoYXJzLiAgRGVmYXVsdHMgdG8gc3lzdGVtJ3MgQGMgQlVGU0laLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGFzc29jaWF0ZXMgYSBmaWxlIHN0cmVhbSBidWZmZXIgd2l0aCBhbiBvcGVuCisgICAgICAgKiAgQyBAYyBGSUxFKi4gIFRoZSBAYyBGSUxFKiB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGNsb3NlZCB3aGVuIHRoZQorICAgICAgICogIHN0ZGlvX2ZpbGVidWYgaXMgY2xvc2VkL2Rlc3Ryb3llZC4KKyAgICAgICovCisgICAgICBzdGRpb19maWxlYnVmKHN0ZDo6X19jX2ZpbGUqIF9fZiwgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlLAorCQkgICAgc2l6ZV90IF9fc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oQlVGU0laKSk7CisKKyAgICAgIC8qKgorICAgICAgICogIENsb3NlcyB0aGUgZXh0ZXJuYWwgZGF0YSBzdHJlYW0gaWYgdGhlIGZpbGUgZGVzY3JpcHRvciBjb25zdHJ1Y3RvcgorICAgICAgICogIHdhcyB1c2VkLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5zdGRpb19maWxlYnVmKCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEByZXR1cm4gIFRoZSB1bmRlcmx5aW5nIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgICAqCisgICAgICAgKiAgT25jZSBhc3NvY2lhdGVkIHdpdGggYW4gZXh0ZXJuYWwgZGF0YSBzdHJlYW0sIHRoaXMgZnVuY3Rpb24gY2FuIGJlCisgICAgICAgKiAgdXNlZCB0byBhY2Nlc3MgdGhlIHVuZGVybHlpbmcgUE9TSVggZmlsZSBkZXNjcmlwdG9yLiAgTm90ZSB0aGF0CisgICAgICAgKiAgdGhlcmUgaXMgbm8gd2F5IGZvciB0aGUgbGlicmFyeSB0byB0cmFjayB3aGF0IHlvdSBkbyB3aXRoIHRoZQorICAgICAgICogIGRlc2NyaXB0b3IsIHNvIGJlIGNhcmVmdWwuCisgICAgICAqLworICAgICAgaW50CisgICAgICBmZCgpIHsgcmV0dXJuIHRoaXMtPl9NX2ZpbGUuZmQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBUaGUgdW5kZXJseWluZyBGSUxFKi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIHVuZGVybHlpbmcgIkMiIGZpbGUgcG9pbnRlci4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gd2F5IGZvciB0aGUgbGlicmFyeSB0byB0cmFjayB3aGF0IHlvdSBkbworICAgICAgICogIHdpdGggdGhlIGZpbGUsIHNvIGJlIGNhcmVmdWwuCisgICAgICAgKi8KKyAgICAgIHN0ZDo6X19jX2ZpbGUqCisgICAgICBmaWxlKCkgeyByZXR1cm4gdGhpcy0+X01fZmlsZS5maWxlKCk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGRpb19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46On5zdGRpb19maWxlYnVmKCkKKyAgICB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkaW9fZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzdGRpb19maWxlYnVmKGludCBfX2ZkLCBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUsIHNpemVfdCBfX3NpemUpCisgICAgeworICAgICAgdGhpcy0+X01fZmlsZS5zeXNfb3BlbihfX2ZkLCBfX21vZGUpOworICAgICAgaWYgKHRoaXMtPmlzX29wZW4oKSkKKwl7CisJICB0aGlzLT5fTV9tb2RlID0gX19tb2RlOworCSAgdGhpcy0+X01fYnVmX3NpemUgPSBfX3NpemU7CisJICB0aGlzLT5fTV9hbGxvY2F0ZV9pbnRlcm5hbF9idWZmZXIoKTsKKwkgIHRoaXMtPl9NX3JlYWRpbmcgPSBmYWxzZTsKKwkgIHRoaXMtPl9NX3dyaXRpbmcgPSBmYWxzZTsKKwkgIHRoaXMtPl9NX3NldF9idWZmZXIoLTEpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZGlvX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgc3RkaW9fZmlsZWJ1ZihzdGQ6Ol9fY19maWxlKiBfX2YsIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSwKKwkJICBzaXplX3QgX19zaXplKQorICAgIHsKKyAgICAgIHRoaXMtPl9NX2ZpbGUuc3lzX29wZW4oX19mLCBfX21vZGUpOworICAgICAgaWYgKHRoaXMtPmlzX29wZW4oKSkKKwl7CisJICB0aGlzLT5fTV9tb2RlID0gX19tb2RlOworCSAgdGhpcy0+X01fYnVmX3NpemUgPSBfX3NpemU7CisJICB0aGlzLT5fTV9hbGxvY2F0ZV9pbnRlcm5hbF9idWZmZXIoKTsKKwkgIHRoaXMtPl9NX3JlYWRpbmcgPSBmYWxzZTsKKwkgIHRoaXMtPl9NX3dyaXRpbmcgPSBmYWxzZTsKKwkgIHRoaXMtPl9NX3NldF9idWZmZXIoLTEpOworCX0KKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9zdGRpb19zeW5jX2ZpbGVidWYuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3N0ZGlvX3N5bmNfZmlsZWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNTNjMDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9zdGRpb19zeW5jX2ZpbGVidWYuaApAQCAtMCwwICsxLDI4OSBAQAorLy8gSW9zdHJlYW1zIHdyYXBwZXIgZm9yIHN0ZGlvIEZJTEUqIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvc3RkaW9fc3luY19maWxlYnVmLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9TVERJT19TWU5DX0ZJTEVCVUZfSAorI2RlZmluZSBfU1RESU9fU1lOQ19GSUxFQlVGX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxzdHJlYW1idWY+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGJpdHMvYysraW8uaD4gIC8vIEZvciBfX2NfZmlsZQorCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyNpbmNsdWRlIDxjd2NoYXI+CisjZW5kaWYKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmIFByb3ZpZGVzIGEgbGF5ZXIgb2YgY29tcGF0aWJpbGl0eSBmb3IgQy4KKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBUaGlzIEdOVSBleHRlbnNpb24gcHJvdmlkZXMgZXh0ZW5zaW9ucyBmb3Igd29ya2luZyB3aXRoIHN0YW5kYXJkCisgICAqICBDIEZJTEUqJ3MuICBJdCBtdXN0IGJlIGluc3RhbnRpYXRlZCBieSB0aGUgdXNlciB3aXRoIHRoZSB0eXBlIG9mCisgICAqICBjaGFyYWN0ZXIgdXNlZCBpbiB0aGUgZmlsZSBzdHJlYW0sIGUuZy4sIHN0ZGlvX2ZpbGVidWY8Y2hhcj4uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3Mgc3RkaW9fc3luY19maWxlYnVmIDogcHVibGljIHN0ZDo6YmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVAkJCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzCQkJCQl0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlCQlvZmZfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICAvLyBVbmRlcmx5aW5nIHN0ZGlvIEZJTEUKKyAgICAgIHN0ZDo6X19jX2ZpbGUqIGNvbnN0IF9NX2ZpbGU7CisKKyAgICAgIC8vIExhc3QgY2hhcmFjdGVyIGdvdHRlbi4gVGhpcyBpcyB1c2VkIHdoZW4gcGJhY2tmYWlsIGlzCisgICAgICAvLyBjYWxsZWQgZnJvbSBiYXNpY19zdHJlYW1idWY6OnN1bmdldGMoKQorICAgICAgaW50X3R5cGUgX01fdW5nZXRfYnVmOworCisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIHN0ZGlvX3N5bmNfZmlsZWJ1ZihzdGQ6Ol9fY19maWxlKiBfX2YpCisgICAgICA6IF9NX2ZpbGUoX19mKSwgX01fdW5nZXRfYnVmKHRyYWl0c190eXBlOjplb2YoKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBUaGUgdW5kZXJseWluZyBGSUxFKi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIHVuZGVybHlpbmcgQyBmaWxlIHBvaW50ZXIuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHdheSBmb3IgdGhlIGxpYnJhcnkgdG8gdHJhY2sgd2hhdCB5b3UgZG8KKyAgICAgICAqICB3aXRoIHRoZSBmaWxlLCBzbyBiZSBjYXJlZnVsLgorICAgICAgICovCisgICAgICBzdGQ6Ol9fY19maWxlKiBjb25zdAorICAgICAgZmlsZSgpIHsgcmV0dXJuIHRoaXMtPl9NX2ZpbGU7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIGludF90eXBlCisgICAgICBzeW5jZ2V0YygpOworCisgICAgICBpbnRfdHlwZQorICAgICAgc3luY3VuZ2V0YyhpbnRfdHlwZSBfX2MpOworCisgICAgICBpbnRfdHlwZQorICAgICAgc3luY3B1dGMoaW50X3R5cGUgX19jKTsKKworICAgICAgdmlydHVhbCBpbnRfdHlwZQorICAgICAgdW5kZXJmbG93KCkKKyAgICAgIHsKKwlpbnRfdHlwZSBfX2MgPSB0aGlzLT5zeW5jZ2V0YygpOworCXJldHVybiB0aGlzLT5zeW5jdW5nZXRjKF9fYyk7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgaW50X3R5cGUKKyAgICAgIHVmbG93KCkKKyAgICAgIHsKKwkvLyBTdG9yZSB0aGUgZ290dGVuIGNoYXJhY3RlciBpbiBjYXNlIHdlIG5lZWQgdG8gdW5nZXQgaXQuCisJX01fdW5nZXRfYnVmID0gdGhpcy0+c3luY2dldGMoKTsKKwlyZXR1cm4gX01fdW5nZXRfYnVmOworICAgICAgfQorCisgICAgICB2aXJ0dWFsIGludF90eXBlCisgICAgICBwYmFja2ZhaWwoaW50X3R5cGUgX19jID0gdHJhaXRzX3R5cGU6OmVvZigpKQorICAgICAgeworCWludF90eXBlIF9fcmV0OworCWNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworCisJLy8gQ2hlY2sgaWYgdGhlIHVuZ2V0IG9yIHB1dGJhY2sgd2FzIHJlcXVlc3RlZAorCWlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpIC8vIHVuZ2V0CisJICB7CisJICAgIGlmICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9NX3VuZ2V0X2J1ZiwgX19lb2YpKQorCSAgICAgIF9fcmV0ID0gdGhpcy0+c3luY3VuZ2V0YyhfTV91bmdldF9idWYpOworCSAgICBlbHNlIC8vIGJ1ZmZlciBpbnZhbGlkLCBmYWlsLgorCSAgICAgIF9fcmV0ID0gX19lb2Y7CisJICB9CisJZWxzZSAvLyBwdXRiYWNrCisJICBfX3JldCA9IHRoaXMtPnN5bmN1bmdldGMoX19jKTsKKworCS8vIFRoZSBidWZmZXJlZCBjaGFyYWN0ZXIgaXMgbm8gbG9uZ2VyIHZhbGlkLCBkaXNjYXJkIGl0LgorCV9NX3VuZ2V0X2J1ZiA9IF9fZW9mOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgdmlydHVhbCBzdGQ6OnN0cmVhbXNpemUKKyAgICAgIHhzZ2V0bihjaGFyX3R5cGUqIF9fcywgc3RkOjpzdHJlYW1zaXplIF9fbik7CisKKyAgICAgIHZpcnR1YWwgaW50X3R5cGUKKyAgICAgIG92ZXJmbG93KGludF90eXBlIF9fYyA9IHRyYWl0c190eXBlOjplb2YoKSkKKyAgICAgIHsKKwlpbnRfdHlwZSBfX3JldDsKKwlpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKKwkgIHsKKwkgICAgaWYgKHN0ZDo6ZmZsdXNoKF9NX2ZpbGUpKQorCSAgICAgIF9fcmV0ID0gdHJhaXRzX3R5cGU6OmVvZigpOworCSAgICBlbHNlCisJICAgICAgX19yZXQgPSB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOworCSAgfQorCWVsc2UKKwkgIF9fcmV0ID0gdGhpcy0+c3luY3B1dGMoX19jKTsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgc3RkOjpzdHJlYW1zaXplCisgICAgICB4c3B1dG4oY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0ZDo6c3RyZWFtc2l6ZSBfX24pOworCisgICAgICB2aXJ0dWFsIGludAorICAgICAgc3luYygpCisgICAgICB7IHJldHVybiBzdGQ6OmZmbHVzaChfTV9maWxlKTsgfQorCisgICAgICB2aXJ0dWFsIHN0ZDo6c3RyZWFtcG9zCisgICAgICBzZWVrb2ZmKHN0ZDo6c3RyZWFtb2ZmIF9fb2ZmLCBzdGQ6Omlvc19iYXNlOjpzZWVrZGlyIF9fZGlyLAorCSAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlID0gc3RkOjppb3NfYmFzZTo6aW4gfCBzdGQ6Omlvc19iYXNlOjpvdXQpCisgICAgICB7CisJc3RkOjpzdHJlYW1wb3MgX19yZXQoc3RkOjpzdHJlYW1vZmYoLTEpKTsKKwlpbnQgX193aGVuY2U7CisJaWYgKF9fZGlyID09IHN0ZDo6aW9zX2Jhc2U6OmJlZykKKwkgIF9fd2hlbmNlID0gU0VFS19TRVQ7CisJZWxzZSBpZiAoX19kaXIgPT0gc3RkOjppb3NfYmFzZTo6Y3VyKQorCSAgX193aGVuY2UgPSBTRUVLX0NVUjsKKwllbHNlCisJICBfX3doZW5jZSA9IFNFRUtfRU5EOworI2lmZGVmIF9HTElCQ1hYX1VTRV9MRlMKKwlpZiAoIWZzZWVrbzY0KF9NX2ZpbGUsIF9fb2ZmLCBfX3doZW5jZSkpCisJICBfX3JldCA9IHN0ZDo6c3RyZWFtcG9zKGZ0ZWxsbzY0KF9NX2ZpbGUpKTsKKyNlbHNlCisJaWYgKCFmc2VlayhfTV9maWxlLCBfX29mZiwgX193aGVuY2UpKQorCSAgX19yZXQgPSBzdGQ6OnN0cmVhbXBvcyhzdGQ6OmZ0ZWxsKF9NX2ZpbGUpKTsKKyNlbmRpZgorCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgdmlydHVhbCBzdGQ6OnN0cmVhbXBvcworICAgICAgc2Vla3BvcyhzdGQ6OnN0cmVhbXBvcyBfX3BvcywKKwkgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPQorCSAgICAgIHN0ZDo6aW9zX2Jhc2U6OmluIHwgc3RkOjppb3NfYmFzZTo6b3V0KQorICAgICAgeyByZXR1cm4gc2Vla29mZihzdGQ6OnN0cmVhbW9mZihfX3BvcyksIHN0ZDo6aW9zX2Jhc2U6OmJlZywgX19tb2RlKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzdGRpb19zeW5jX2ZpbGVidWY8Y2hhcj46OmludF90eXBlCisgICAgc3RkaW9fc3luY19maWxlYnVmPGNoYXI+OjpzeW5jZ2V0YygpCisgICAgeyByZXR1cm4gc3RkOjpnZXRjKF9NX2ZpbGUpOyB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzdGRpb19zeW5jX2ZpbGVidWY8Y2hhcj46OmludF90eXBlCisgICAgc3RkaW9fc3luY19maWxlYnVmPGNoYXI+OjpzeW5jdW5nZXRjKGludF90eXBlIF9fYykKKyAgICB7IHJldHVybiBzdGQ6OnVuZ2V0YyhfX2MsIF9NX2ZpbGUpOyB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzdGRpb19zeW5jX2ZpbGVidWY8Y2hhcj46OmludF90eXBlCisgICAgc3RkaW9fc3luY19maWxlYnVmPGNoYXI+OjpzeW5jcHV0YyhpbnRfdHlwZSBfX2MpCisgICAgeyByZXR1cm4gc3RkOjpwdXRjKF9fYywgX01fZmlsZSk7IH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHN0ZDo6c3RyZWFtc2l6ZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1ZjxjaGFyPjo6eHNnZXRuKGNoYXIqIF9fcywgc3RkOjpzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICBzdGQ6OnN0cmVhbXNpemUgX19yZXQgPSBzdGQ6OmZyZWFkKF9fcywgMSwgX19uLCBfTV9maWxlKTsKKyAgICAgIGlmIChfX3JldCA+IDApCisJX01fdW5nZXRfYnVmID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKF9fc1tfX3JldCAtIDFdKTsKKyAgICAgIGVsc2UKKwlfTV91bmdldF9idWYgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgc3RkOjpzdHJlYW1zaXplCisgICAgc3RkaW9fc3luY19maWxlYnVmPGNoYXI+Ojp4c3B1dG4oY29uc3QgY2hhciogX19zLCBzdGQ6OnN0cmVhbXNpemUgX19uKQorICAgIHsgcmV0dXJuIHN0ZDo6ZndyaXRlKF9fcywgMSwgX19uLCBfTV9maWxlKTsgfQorCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzdGRpb19zeW5jX2ZpbGVidWY8d2NoYXJfdD46OmludF90eXBlCisgICAgc3RkaW9fc3luY19maWxlYnVmPHdjaGFyX3Q+OjpzeW5jZ2V0YygpCisgICAgeyByZXR1cm4gc3RkOjpnZXR3YyhfTV9maWxlKTsgfQorCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgc3RkaW9fc3luY19maWxlYnVmPHdjaGFyX3Q+OjppbnRfdHlwZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1Zjx3Y2hhcl90Pjo6c3luY3VuZ2V0YyhpbnRfdHlwZSBfX2MpCisgICAgeyByZXR1cm4gc3RkOjp1bmdldHdjKF9fYywgX01fZmlsZSk7IH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHN0ZGlvX3N5bmNfZmlsZWJ1Zjx3Y2hhcl90Pjo6aW50X3R5cGUKKyAgICBzdGRpb19zeW5jX2ZpbGVidWY8d2NoYXJfdD46OnN5bmNwdXRjKGludF90eXBlIF9fYykKKyAgICB7IHJldHVybiBzdGQ6OnB1dHdjKF9fYywgX01fZmlsZSk7IH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHN0ZDo6c3RyZWFtc2l6ZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1Zjx3Y2hhcl90Pjo6eHNnZXRuKHdjaGFyX3QqIF9fcywgc3RkOjpzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICBzdGQ6OnN0cmVhbXNpemUgX19yZXQgPSAwOworICAgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICB3aGlsZSAoX19uLS0pCisJeworCSAgaW50X3R5cGUgX19jID0gdGhpcy0+c3luY2dldGMoKTsKKwkgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisJICAgIGJyZWFrOworCSAgX19zW19fcmV0XSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKwkgICsrX19yZXQ7CisJfQorCisgICAgICBpZiAoX19yZXQgPiAwKQorCV9NX3VuZ2V0X2J1ZiA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZShfX3NbX19yZXQgLSAxXSk7CisgICAgICBlbHNlCisJX01fdW5nZXRfYnVmID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHN0ZDo6c3RyZWFtc2l6ZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1Zjx3Y2hhcl90Pjo6eHNwdXRuKGNvbnN0IHdjaGFyX3QqIF9fcywKKwkJCQkJc3RkOjpzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICBzdGQ6OnN0cmVhbXNpemUgX19yZXQgPSAwOworICAgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICB3aGlsZSAoX19uLS0pCisJeworCSAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZSh0aGlzLT5zeW5jcHV0YygqX19zKyspLCBfX2VvZikpCisJICAgIGJyZWFrOworCSAgKytfX3JldDsKKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorI2VuZGlmCisKKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIHN0ZGlvX3N5bmNfZmlsZWJ1ZjxjaGFyPjsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3Mgc3RkaW9fc3luY19maWxlYnVmPHdjaGFyX3Q+OworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3N0cmluZ19jb252ZXJzaW9ucy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvc3RyaW5nX2NvbnZlcnNpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhNzdjMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3N0cmluZ19jb252ZXJzaW9ucy5oCkBAIC0wLDAgKzEsMTA3IEBACisvLyBTdHJpbmcgQ29udmVyc2lvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9zdHJpbmdfY29udmVyc2lvbnMuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX1NUUklOR19DT05WRVJTSU9OU19ICisjZGVmaW5lIF9TVFJJTkdfQ09OVkVSU0lPTlNfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGV4dC9udW1lcmljX3RyYWl0cy5oPgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGN3Y2hhcj4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y2Vycm5vPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gSGVscGVyIGZvciBhbGwgdGhlIHN0byogZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVFJldCwgdHlwZW5hbWUgX1JldCA9IF9UUmV0LCB0eXBlbmFtZSBfQ2hhclQsCisJICAgdHlwZW5hbWUuLi4gX0Jhc2U+CisgICAgX1JldAorICAgIF9fc3RvYShfVFJldCAoKl9fY29udmYpIChjb25zdCBfQ2hhclQqLCBfQ2hhclQqKiwgX0Jhc2UuLi4pLAorCSAgIGNvbnN0IGNoYXIqIF9fbmFtZSwgY29uc3QgX0NoYXJUKiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4LAorCSAgIF9CYXNlLi4uIF9fYmFzZSkKKyAgICB7CisgICAgICBfUmV0IF9fcmV0OworCisgICAgICBfQ2hhclQqIF9fZW5kcHRyOworICAgICAgZXJybm8gPSAwOworICAgICAgY29uc3QgX1RSZXQgX190bXAgPSBfX2NvbnZmKF9fc3RyLCAmX19lbmRwdHIsIF9fYmFzZS4uLik7CisKKyAgICAgIGlmIChfX2VuZHB0ciA9PSBfX3N0cikKKwlzdGQ6Ol9fdGhyb3dfaW52YWxpZF9hcmd1bWVudChfX25hbWUpOworICAgICAgZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFCisJICAgICAgIHx8IChzdGQ6Ol9fYXJlX3NhbWU8X1JldCwgaW50Pjo6X192YWx1ZQorCQkgICAmJiAoX190bXAgPCBfX251bWVyaWNfdHJhaXRzPGludD46Ol9fbWluCisJCSAgICAgICB8fCBfX3RtcCA+IF9fbnVtZXJpY190cmFpdHM8aW50Pjo6X19tYXgpKSkKKwlzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fbmFtZSk7CisgICAgICBlbHNlCisJX19yZXQgPSBfX3RtcDsKKworICAgICAgaWYgKF9faWR4KQorCSpfX2lkeCA9IF9fZW5kcHRyIC0gX19zdHI7CisKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgLy8gSGVscGVyIGZvciB0aGUgdG9fc3RyaW5nIC8gdG9fd3N0cmluZyBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdHJpbmcsIHR5cGVuYW1lIF9DaGFyVCA9IHR5cGVuYW1lIF9TdHJpbmc6OnZhbHVlX3R5cGU+CisgICAgX1N0cmluZworICAgIF9fdG9feHN0cmluZyhpbnQgKCpfX2NvbnZmKSAoX0NoYXJUKiwgc3RkOjpzaXplX3QsIGNvbnN0IF9DaGFyVCosCisJCQkJIF9fYnVpbHRpbl92YV9saXN0KSwgc3RkOjpzaXplX3QgX19uLAorCQkgY29uc3QgX0NoYXJUKiBfX2ZtdCwgLi4uKQorICAgIHsKKyAgICAgIC8vIFhYWCBFdmVudHVhbGx5IHRoZSByZXN1bHQgd2lsbCBiZSBjb25zdHJ1Y3RlZCBpbiBwbGFjZSBpbgorICAgICAgLy8gdGhlIEMrKzB4IHN0cmluZywgbGlrZWx5IHdpdGggdGhlIGhlbHAgb2YgaW50ZXJuYWwgaG9va3MuCisgICAgICBfQ2hhclQqIF9fcyA9IHN0YXRpY19jYXN0PF9DaGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkKKwkJCQkJCQkgICogX19uKSk7CisKKyAgICAgIF9fYnVpbHRpbl92YV9saXN0IF9fYXJnczsKKyAgICAgIF9fYnVpbHRpbl92YV9zdGFydChfX2FyZ3MsIF9fZm10KTsKKworICAgICAgY29uc3QgaW50IF9fbGVuID0gX19jb252ZihfX3MsIF9fbiwgX19mbXQsIF9fYXJncyk7CisKKyAgICAgIF9fYnVpbHRpbl92YV9lbmQoX19hcmdzKTsKKworICAgICAgcmV0dXJuIF9TdHJpbmcoX19zLCBfX3MgKyBfX2xlbik7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX1NUUklOR19DT05WRVJTSU9OU19ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC90aHJvd19hbGxvY2F0b3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3Rocm93X2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNjEwZWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC90aHJvd19hbGxvY2F0b3IuaApAQCAtMCwwICsxLDgxNiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqIEBmaWxlIGV4dC90aHJvd19hbGxvY2F0b3IuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICoKKyAqICBDb250YWlucyB0d28gZXhjZXB0aW9uLWdlbmVyYXRpbmcgdHlwZXMgKHRocm93X3ZhbHVlLCB0aHJvd19hbGxvY2F0b3IpCisgKiAgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyB2YWx1ZSBhbmQgYWxsb2NhdG9yIHR5cGVzIHdoaWxlIHRlc3RpbmcKKyAqICBleGNlcHRpb24gc2FmZXR5IGluIHRlbXBsYXRpemVkIGNvbnRhaW5lcnMgYW5kIGFsZ29yaXRobXMuIFRoZQorICogIGFsbG9jYXRvciBoYXMgYWRkaXRpb25hbCBsb2cgYW5kIGRlYnVnIGZlYXR1cmVzLiBUaGUgZXhjZXB0aW9uCisgKiAgZ2VuZXJhdGVkIGlzIG9mIHR5cGUgZm9yY2VkX2V4Y2VwdGlvbl9lcnJvci4KKyAqLworCisjaWZuZGVmIF9USFJPV19BTExPQ0FUT1JfSAorI2RlZmluZSBfVEhST1dfQUxMT0NBVE9SX0ggMQorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjIGluY2x1ZGUgPGZ1bmN0aW9uYWw+CisjIGluY2x1ZGUgPHJhbmRvbT4KKyNlbHNlCisjIGluY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgorIyBpbmNsdWRlIDx0cjEvcmFuZG9tPgorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiBUaG93biBieSBleGNlcHRpb24gc2FmZXR5IG1hY2hpbmVyeS4KKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICovCisgIHN0cnVjdCBmb3JjZWRfZXJyb3IgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KKyAgeyB9OworCisgIC8vIFN1YnN0aXR1dGUgZm9yIGZvcmNlZF9lcnJvciBvYmplY3Qgd2hlbiAtZm5vLWV4Y2VwdGlvbnMuCisgIGlubGluZSB2b2lkCisgIF9fdGhyb3dfZm9yY2VkX2Vycm9yKCkKKyAgeyBfR0xJQkNYWF9USFJPV19PUl9BQk9SVChmb3JjZWRfZXJyb3IoKSk7IH0KKworICAvKioKKyAgICogIEBicmllZiBCYXNlIGNsYXNzIGZvciBjaGVja2luZyBhZGRyZXNzIGFuZCBsYWJlbCBpbmZvcm1hdGlvbgorICAgKiAgYWJvdXQgYWxsb2NhdGlvbnMuIENyZWF0ZSBhIHN0ZDo6bWFwIGJldHdlZW4gdGhlIGFsbG9jYXRlZAorICAgKiAgYWRkcmVzcyAodm9pZCopIGFuZCBhIGRhdHVtIGZvciBhbm5vdGF0aW9ucywgd2hpY2ggYXJlIGEgcGFpciBvZgorICAgKiAgbnVtYmVycyBjb3JyZXNwb25kaW5nIHRvIGxhYmVsIGFuZCBhbGxvY2F0ZWQgc2l6ZS4KKyAgICovCisgIHN0cnVjdCBhbm5vdGF0ZV9iYXNlCisgIHsKKyAgICBhbm5vdGF0ZV9iYXNlKCkKKyAgICB7CisgICAgICBsYWJlbCgpOworICAgICAgbWFwKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQKKyAgICBzZXRfbGFiZWwoc2l6ZV90IGwpCisgICAgeyBsYWJlbCgpID0gbDsgfQorCisgICAgc3RhdGljIHNpemVfdAorICAgIGdldF9sYWJlbCgpCisgICAgeyByZXR1cm4gbGFiZWwoKTsgfQorCisgICAgdm9pZAorICAgIGluc2VydCh2b2lkKiBwLCBzaXplX3Qgc2l6ZSkKKyAgICB7CisgICAgICBpZiAoIXApCisJeworCSAgc3RkOjpzdHJpbmcgZXJyb3IoImFubm90YXRlX2Jhc2U6Omluc2VydCBudWxsIGluc2VydCFcbiIpOworCSAgbG9nX3RvX3N0cmluZyhlcnJvciwgbWFrZV9lbnRyeShwLCBzaXplKSk7CisJICBzdGQ6Ol9fdGhyb3dfbG9naWNfZXJyb3IoZXJyb3IuY19zdHIoKSk7CisJfQorCisgICAgICBjb25zdF9pdGVyYXRvciBmb3VuZCA9IG1hcCgpLmZpbmQocCk7CisgICAgICBpZiAoZm91bmQgIT0gbWFwKCkuZW5kKCkpCisJeworCSAgc3RkOjpzdHJpbmcgZXJyb3IoImFubm90YXRlX2Jhc2U6Omluc2VydCBkb3VibGUgaW5zZXJ0IVxuIik7CisJICBsb2dfdG9fc3RyaW5nKGVycm9yLCBtYWtlX2VudHJ5KHAsIHNpemUpKTsKKwkgIGxvZ190b19zdHJpbmcoZXJyb3IsICpmb3VuZCk7CisJICBzdGQ6Ol9fdGhyb3dfbG9naWNfZXJyb3IoZXJyb3IuY19zdHIoKSk7CisJfQorCisgICAgICBtYXAoKS5pbnNlcnQobWFrZV9lbnRyeShwLCBzaXplKSk7CisgICAgfQorCisgICAgdm9pZAorICAgIGVyYXNlKHZvaWQqIHAsIHNpemVfdCBzaXplKQorICAgIHsKKyAgICAgIGNoZWNrX2FsbG9jYXRlZChwLCBzaXplKTsKKyAgICAgIG1hcCgpLmVyYXNlKHApOworICAgIH0KKworICAgIC8vIFNlZSBpZiBhIHBhcnRpY3VsYXIgYWRkcmVzcyBhbmQgYWxsb2NhdGlvbiBzaXplIGhhcyBiZWVuIHNhdmVkLgorICAgIGlubGluZSB2b2lkCisgICAgY2hlY2tfYWxsb2NhdGVkKHZvaWQqIHAsIHNpemVfdCBzaXplKQorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIGZvdW5kID0gbWFwKCkuZmluZChwKTsKKyAgICAgIGlmIChmb3VuZCA9PSBtYXAoKS5lbmQoKSkKKwl7CisJICBzdGQ6OnN0cmluZyBlcnJvcigiYW5ub3RhdGVfYmFzZTo6Y2hlY2tfYWxsb2NhdGVkIGJ5IHZhbHVlICIKKwkJCSAgICAibnVsbCBlcmFzZSFcbiIpOworCSAgbG9nX3RvX3N0cmluZyhlcnJvciwgbWFrZV9lbnRyeShwLCBzaXplKSk7CisJICBzdGQ6Ol9fdGhyb3dfbG9naWNfZXJyb3IoZXJyb3IuY19zdHIoKSk7CisJfQorCisgICAgICBpZiAoZm91bmQtPnNlY29uZC5zZWNvbmQgIT0gc2l6ZSkKKwl7CisJICBzdGQ6OnN0cmluZyBlcnJvcigiYW5ub3RhdGVfYmFzZTo6Y2hlY2tfYWxsb2NhdGVkIGJ5IHZhbHVlICIKKwkJCSAgICAid3Jvbmctc2l6ZSBlcmFzZSFcbiIpOworCSAgbG9nX3RvX3N0cmluZyhlcnJvciwgbWFrZV9lbnRyeShwLCBzaXplKSk7CisJICBsb2dfdG9fc3RyaW5nKGVycm9yLCAqZm91bmQpOworCSAgc3RkOjpfX3Rocm93X2xvZ2ljX2Vycm9yKGVycm9yLmNfc3RyKCkpOworCX0KKyAgICB9CisKKyAgICAvLyBTZWUgaWYgYSBnaXZlbiBsYWJlbCBoYXMgYmVlbiBhbGxvY2F0ZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBjaGVja19hbGxvY2F0ZWQoc2l6ZV90IGxhYmVsKQorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIGJlZyA9IG1hcCgpLmJlZ2luKCk7CisgICAgICBjb25zdF9pdGVyYXRvciBlbmQgPSBtYXAoKS5lbmQoKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGZvdW5kOworICAgICAgd2hpbGUgKGJlZyAhPSBlbmQpCisJeworCSAgaWYgKGJlZy0+c2Vjb25kLmZpcnN0ID09IGxhYmVsKQorCSAgICBsb2dfdG9fc3RyaW5nKGZvdW5kLCAqYmVnKTsKKwkgICsrYmVnOworCX0KKworICAgICAgaWYgKCFmb3VuZC5lbXB0eSgpKQorCXsKKwkgIHN0ZDo6c3RyaW5nIGVycm9yKCJhbm5vdGF0ZV9iYXNlOjpjaGVja19hbGxvY2F0ZWQgYnkgbGFiZWxcbiIpOworCSAgZXJyb3IgKz0gZm91bmQ7CisJICBzdGQ6Ol9fdGhyb3dfbG9naWNfZXJyb3IoZXJyb3IuY19zdHIoKSk7CisJfQorICAgIH0KKworICBwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiAJCWRhdGFfdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHZvaWQqLCBkYXRhX3R5cGU+IAkJbWFwX3R5cGU7CisgICAgdHlwZWRlZiBtYXBfdHlwZTo6dmFsdWVfdHlwZSAJCWVudHJ5X3R5cGU7CisgICAgdHlwZWRlZiBtYXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgCQljb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIG1hcF90eXBlOjpjb25zdF9yZWZlcmVuY2UgCQljb25zdF9yZWZlcmVuY2U7CisKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJgorICAgIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiwgY29uc3QgYW5ub3RhdGVfYmFzZSYpOworCisgICAgZW50cnlfdHlwZQorICAgIG1ha2VfZW50cnkodm9pZCogcCwgc2l6ZV90IHNpemUpCisgICAgeyByZXR1cm4gc3RkOjptYWtlX3BhaXIocCwgZGF0YV90eXBlKGdldF9sYWJlbCgpLCBzaXplKSk7IH0KKworICAgIHZvaWQKKyAgICBsb2dfdG9fc3RyaW5nKHN0ZDo6c3RyaW5nJiBzLCBjb25zdF9yZWZlcmVuY2UgcmVmKSBjb25zdAorICAgIHsKKyAgICAgIGNoYXIgYnVmWzQwXTsKKyAgICAgIGNvbnN0IGNoYXIgdGFiKCdcdCcpOworICAgICAgcyArPSAibGFiZWw6ICI7CisgICAgICB1bnNpZ25lZCBsb25nIGwgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihyZWYuc2Vjb25kLmZpcnN0KTsKKyAgICAgIF9fYnVpbHRpbl9zcHJpbnRmKGJ1ZiwgIiVsdSIsIGwpOworICAgICAgcyArPSBidWY7CisgICAgICBzICs9IHRhYjsKKyAgICAgIHMgKz0gInNpemU6ICI7CisgICAgICBsID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4ocmVmLnNlY29uZC5zZWNvbmQpOworICAgICAgX19idWlsdGluX3NwcmludGYoYnVmLCAiJWx1IiwgbCk7CisgICAgICBzICs9IGJ1ZjsKKyAgICAgIHMgKz0gdGFiOworICAgICAgcyArPSAiYWRkcmVzczogIjsKKyAgICAgIF9fYnVpbHRpbl9zcHJpbnRmKGJ1ZiwgIiVwIiwgcmVmLmZpcnN0KTsKKyAgICAgIHMgKz0gYnVmOworICAgICAgcyArPSAnXG4nOworICAgIH0KKworICAgIHN0YXRpYyBzaXplX3QmCisgICAgbGFiZWwoKQorICAgIHsKKyAgICAgIHN0YXRpYyBzaXplX3QgX1NfbGFiZWwoc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSk7CisgICAgICByZXR1cm4gX1NfbGFiZWw7CisgICAgfQorCisgICAgc3RhdGljIG1hcF90eXBlJgorICAgIG1hcCgpCisgICAgeworICAgICAgc3RhdGljIG1hcF90eXBlIF9TX21hcDsKKyAgICAgIHJldHVybiBfU19tYXA7CisgICAgfQorICB9OworCisgIGlubGluZSBzdGQ6Om9zdHJlYW0mCisgIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgYW5ub3RhdGVfYmFzZSYgX19iKQorICB7CisgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisgICAgdHlwZWRlZiBhbm5vdGF0ZV9iYXNlIGJhc2VfdHlwZTsKKyAgICBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGJlZyA9IF9fYi5tYXAoKS5iZWdpbigpOworICAgIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgZW5kID0gX19iLm1hcCgpLmVuZCgpOworICAgIGZvciAoOyBiZWcgIT0gZW5kOyArK2JlZykKKyAgICAgIF9fYi5sb2dfdG9fc3RyaW5nKGVycm9yLCAqYmVnKTsKKyAgICByZXR1cm4gb3MgPDwgZXJyb3I7CisgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIEJhc2Ugc3RydWN0IGZvciBjb25kaXRpb24gcG9saWN5LgorICAgKgorICAgKiBSZXF1aXJlcyBhIHB1YmxpYyBtZW1iZXIgZnVuY3Rpb24gd2l0aCB0aGUgc2lnbmF0dXJlCisgICAqIHZvaWQgdGhyb3dfY29uZGl0aW9uYWxseSgpCisgICAqLworICBzdHJ1Y3QgY29uZGl0aW9uX2Jhc2UKKyAgeworICAgIHZpcnR1YWwgfmNvbmRpdGlvbl9iYXNlKCkgeyB9OworICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgQmFzZSBjbGFzcyBmb3IgaW5jcmVtZW50YWwgY29udHJvbCBhbmQgdGhyb3cuCisgICAqLworICBzdHJ1Y3QgbGltaXRfY29uZGl0aW9uIDogcHVibGljIGNvbmRpdGlvbl9iYXNlCisgIHsKKyAgICAvLyBTY29wZS1sZXZlbCBhZGp1c3RvciBvYmplY3RzOiBzZXQgbGltaXQgZm9yIHRocm93IGF0IHRoZQorICAgIC8vIGJlZ2lubmluZyBvZiBhIHNjb3BlIGJsb2NrLCBhbmQgcmVzdG9yZXMgdG8gcHJldmlvdXMgbGltaXQgd2hlbgorICAgIC8vIG9iamVjdCBpcyBkZXN0cm95ZWQgb24gZXhpdGluZyB0aGUgYmxvY2suCisgICAgc3RydWN0IGFkanVzdG9yX2Jhc2UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IHNpemVfdCBfTV9vcmlnOworCisgICAgcHVibGljOgorICAgICAgYWRqdXN0b3JfYmFzZSgpIDogX01fb3JpZyhsaW1pdCgpKSB7IH0KKworICAgICAgdmlydHVhbAorICAgICAgfmFkanVzdG9yX2Jhc2UoKSB7IHNldF9saW1pdChfTV9vcmlnKTsgfQorICAgIH07CisKKyAgICAvLy8gTmV2ZXIgZW50ZXIgdGhlIGNvbmRpdGlvbi4KKyAgICBzdHJ1Y3QgbmV2ZXJfYWRqdXN0b3IgOiBwdWJsaWMgYWRqdXN0b3JfYmFzZQorICAgIHsKKyAgICAgIG5ldmVyX2FkanVzdG9yKCkgeyBzZXRfbGltaXQoc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSk7IH0KKyAgICB9OworCisgICAgLy8vIEFsd2F5cyBlbnRlciB0aGUgY29uZGl0aW9uLgorICAgIHN0cnVjdCBhbHdheXNfYWRqdXN0b3IgOiBwdWJsaWMgYWRqdXN0b3JfYmFzZQorICAgIHsKKyAgICAgIGFsd2F5c19hZGp1c3RvcigpIHsgc2V0X2xpbWl0KGNvdW50KCkpOyB9CisgICAgfTsKKworICAgIC8vLyBFbnRlciB0aGUgbnRoIGNvbmRpdGlvbi4KKyAgICBzdHJ1Y3QgbGltaXRfYWRqdXN0b3IgOiBwdWJsaWMgYWRqdXN0b3JfYmFzZQorICAgIHsKKyAgICAgIGxpbWl0X2FkanVzdG9yKGNvbnN0IHNpemVfdCBfX2wpIHsgc2V0X2xpbWl0KF9fbCk7IH0KKyAgICB9OworCisgICAgLy8gSW5jcmVtZW50IF9TX2NvdW50IGV2ZXJ5IHRpbWUgY2FsbGVkLgorICAgIC8vIElmIF9TX2NvdW50IG1hdGNoZXMgdGhlIGxpbWl0IGNvdW50LCB0aHJvdy4KKyAgICBzdGF0aWMgdm9pZAorICAgIHRocm93X2NvbmRpdGlvbmFsbHkoKQorICAgIHsKKyAgICAgIGlmIChjb3VudCgpID09IGxpbWl0KCkpCisJX190aHJvd19mb3JjZWRfZXJyb3IoKTsKKyAgICAgICsrY291bnQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgc2l6ZV90JgorICAgIGNvdW50KCkKKyAgICB7CisgICAgICBzdGF0aWMgc2l6ZV90IF9TX2NvdW50KDApOworICAgICAgcmV0dXJuIF9TX2NvdW50OworICAgIH0KKworICAgIHN0YXRpYyBzaXplX3QmCisgICAgbGltaXQoKQorICAgIHsKKyAgICAgIHN0YXRpYyBzaXplX3QgX1NfbGltaXQoc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSk7CisgICAgICByZXR1cm4gX1NfbGltaXQ7CisgICAgfQorCisgICAgLy8gWmVybyB0aGUgdGhyb3cgY291bnRlciwgc2V0IGxpbWl0IHRvIGFyZ3VtZW50LgorICAgIHN0YXRpYyB2b2lkCisgICAgc2V0X2xpbWl0KGNvbnN0IHNpemVfdCBfX2wpCisgICAgeworICAgICAgbGltaXQoKSA9IF9fbDsKKyAgICAgIGNvdW50KCkgPSAwOworICAgIH0KKyAgfTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmIEJhc2UgY2xhc3MgZm9yIHJhbmRvbSBwcm9iYWJpbGl0eSBjb250cm9sIGFuZCB0aHJvdy4KKyAgICovCisgIHN0cnVjdCByYW5kb21fY29uZGl0aW9uIDogcHVibGljIGNvbmRpdGlvbl9iYXNlCisgIHsKKyAgICAvLyBTY29wZS1sZXZlbCBhZGp1c3RvciBvYmplY3RzOiBzZXQgcHJvYmFiaWxpdHkgZm9yIHRocm93IGF0IHRoZQorICAgIC8vIGJlZ2lubmluZyBvZiBhIHNjb3BlIGJsb2NrLCBhbmQgcmVzdG9yZXMgdG8gcHJldmlvdXMKKyAgICAvLyBwcm9iYWJpbGl0eSB3aGVuIG9iamVjdCBpcyBkZXN0cm95ZWQgb24gZXhpdGluZyB0aGUgYmxvY2suCisgICAgc3RydWN0IGFkanVzdG9yX2Jhc2UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IGRvdWJsZSBfTV9vcmlnOworCisgICAgcHVibGljOgorICAgICAgYWRqdXN0b3JfYmFzZSgpIDogX01fb3JpZyhwcm9iYWJpbGl0eSgpKSB7IH0KKworICAgICAgdmlydHVhbCB+YWRqdXN0b3JfYmFzZSgpCisgICAgICB7IHNldF9wcm9iYWJpbGl0eShfTV9vcmlnKTsgfQorICAgIH07CisKKyAgICAvLy8gR3JvdXAgY29uZGl0aW9uLgorICAgIHN0cnVjdCBncm91cF9hZGp1c3RvciA6IHB1YmxpYyBhZGp1c3Rvcl9iYXNlCisgICAgeworICAgICAgZ3JvdXBfYWRqdXN0b3Ioc2l6ZV90IHNpemUpCisgICAgICB7IHNldF9wcm9iYWJpbGl0eSgxIC0gc3RkOjpwb3coZG91YmxlKDEgLSBwcm9iYWJpbGl0eSgpKSwKKwkJCQkgICAgIGRvdWJsZSgwLjUgLyAoc2l6ZSArIDEpKSkpOworICAgICAgfQorICAgIH07CisKKyAgICAvLy8gTmV2ZXIgZW50ZXIgdGhlIGNvbmRpdGlvbi4KKyAgICBzdHJ1Y3QgbmV2ZXJfYWRqdXN0b3IgOiBwdWJsaWMgYWRqdXN0b3JfYmFzZQorICAgIHsKKyAgICAgIG5ldmVyX2FkanVzdG9yKCkgeyBzZXRfcHJvYmFiaWxpdHkoMCk7IH0KKyAgICB9OworCisgICAgLy8vIEFsd2F5cyBlbnRlciB0aGUgY29uZGl0aW9uLgorICAgIHN0cnVjdCBhbHdheXNfYWRqdXN0b3IgOiBwdWJsaWMgYWRqdXN0b3JfYmFzZQorICAgIHsKKyAgICAgIGFsd2F5c19hZGp1c3RvcigpIHsgc2V0X3Byb2JhYmlsaXR5KDEpOyB9CisgICAgfTsKKworICAgIHJhbmRvbV9jb25kaXRpb24oKQorICAgIHsKKyAgICAgIHByb2JhYmlsaXR5KCk7CisgICAgICBlbmdpbmUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZAorICAgIHNldF9wcm9iYWJpbGl0eShkb3VibGUgX19wKQorICAgIHsgcHJvYmFiaWxpdHkoKSA9IF9fcDsgfQorCisgICAgc3RhdGljIHZvaWQKKyAgICB0aHJvd19jb25kaXRpb25hbGx5KCkKKyAgICB7CisgICAgICBpZiAoZ2VuZXJhdGUoKSA8IHByb2JhYmlsaXR5KCkpCisJX190aHJvd19mb3JjZWRfZXJyb3IoKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgc2VlZCh1bnNpZ25lZCBsb25nIF9fcykKKyAgICB7IGVuZ2luZSgpLnNlZWQoX19zKTsgfQorCisgIHByaXZhdGU6CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHR5cGVkZWYgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gCWRpc3RyaWJ1dGlvbl90eXBlOworICAgIHR5cGVkZWYgc3RkOjptdDE5OTM3IAkJCQllbmdpbmVfdHlwZTsKKyNlbHNlCisgICAgdHlwZWRlZiBzdGQ6OnRyMTo6dW5pZm9ybV9yZWFsPGRvdWJsZT4gCQlkaXN0cmlidXRpb25fdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6dHIxOjptdDE5OTM3IAkJCQllbmdpbmVfdHlwZTsKKyNlbmRpZgorCisgICAgc3RhdGljIGRvdWJsZQorICAgIGdlbmVyYXRlKCkKKyAgICB7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3QgZGlzdHJpYnV0aW9uX3R5cGUgZGlzdHJpYnV0aW9uKDAsIDEpOworICAgICAgc3RhdGljIGF1dG8gZ2VuZXJhdG9yID0gc3RkOjpiaW5kKGRpc3RyaWJ1dGlvbiwgZW5naW5lKCkpOworI2Vsc2UKKyAgICAgIC8vIFVzZSB2YXJpYXRlX2dlbmVyYXRvciB0byBnZXQgbm9ybWFsaXplZCByZXN1bHRzLgorICAgICAgdHlwZWRlZiBzdGQ6OnRyMTo6dmFyaWF0ZV9nZW5lcmF0b3I8ZW5naW5lX3R5cGUsIGRpc3RyaWJ1dGlvbl90eXBlPiBnZW5fdDsKKyAgICAgIGRpc3RyaWJ1dGlvbl90eXBlIGRpc3RyaWJ1dGlvbigwLCAxKTsKKyAgICAgIHN0YXRpYyBnZW5fdCBnZW5lcmF0b3IoZW5naW5lKCksIGRpc3RyaWJ1dGlvbik7CisjZW5kaWYKKworICAgICAgZG91YmxlIHJhbmRvbSA9IGdlbmVyYXRvcigpOworICAgICAgaWYgKHJhbmRvbSA8IGRpc3RyaWJ1dGlvbi5taW4oKSB8fCByYW5kb20gPiBkaXN0cmlidXRpb24ubWF4KCkpCisJeworCSAgc3RkOjpzdHJpbmcgX19zKCJyYW5kb21fY29uZGl0aW9uOjpnZW5lcmF0ZSIpOworCSAgX19zICs9ICJcbiI7CisJICBfX3MgKz0gInJhbmRvbSBudW1iZXIgZ2VuZXJhdGVkIGlzOiAiOworCSAgY2hhciBidWZbNDBdOworCSAgX19idWlsdGluX3NwcmludGYoYnVmLCAiJWYiLCByYW5kb20pOworCSAgX19zICs9IGJ1ZjsKKwkgIHN0ZDo6X190aHJvd19vdXRfb2ZfcmFuZ2UoX19zLmNfc3RyKCkpOworCX0KKworICAgICAgcmV0dXJuIHJhbmRvbTsKKyAgICB9CisKKyAgICBzdGF0aWMgZG91YmxlJgorICAgIHByb2JhYmlsaXR5KCkKKyAgICB7CisgICAgICBzdGF0aWMgZG91YmxlIF9TX3A7CisgICAgICByZXR1cm4gX1NfcDsKKyAgICB9CisKKyAgICBzdGF0aWMgZW5naW5lX3R5cGUmCisgICAgZW5naW5lKCkKKyAgICB7CisgICAgICBzdGF0aWMgZW5naW5lX3R5cGUgX1NfZTsKKyAgICAgIHJldHVybiBfU19lOworICAgIH0KKyAgfTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmIENsYXNzIHdpdGggZXhjZXB0aW9uIGdlbmVyYXRpb24gY29udHJvbC4gSW50ZW5kZWQgdG8gYmUKKyAgICogIHVzZWQgYXMgYSB2YWx1ZV90eXBlIGluIHRlbXBsYXRpemVkIGNvZGUuCisgICAqCisgICAqICBOb3RlOiBEZXN0cnVjdG9yIG5vdCBhbGxvd2VkIHRvIHRocm93LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbmQ+CisgICAgc3RydWN0IHRocm93X3ZhbHVlX2Jhc2UgOiBwdWJsaWMgX0NvbmQKKyAgICB7CisgICAgICB0eXBlZGVmIF9Db25kICAJCQkJY29uZGl0aW9uX3R5cGU7CisKKyAgICAgIHVzaW5nIGNvbmRpdGlvbl90eXBlOjp0aHJvd19jb25kaXRpb25hbGx5OworCisgICAgICBzdGQ6OnNpemVfdAkJCSAgICAgICAJX01faTsKKworI2lmbmRlZiBfR0xJQkNYWF9JU19BR0dSRUdBVEUKKyAgICAgIHRocm93X3ZhbHVlX2Jhc2UoKSA6IF9NX2koMCkKKyAgICAgIHsgdGhyb3dfY29uZGl0aW9uYWxseSgpOyB9CisKKyAgICAgIHRocm93X3ZhbHVlX2Jhc2UoY29uc3QgdGhyb3dfdmFsdWVfYmFzZSYgX192KSA6IF9NX2koX192Ll9NX2kpCisgICAgICB7IHRocm93X2NvbmRpdGlvbmFsbHkoKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gU2hhbGwgbm90IHRocm93LgorICAgICAgdGhyb3dfdmFsdWVfYmFzZSh0aHJvd192YWx1ZV9iYXNlJiYpID0gZGVmYXVsdDsKKyNlbmRpZgorCisgICAgICBleHBsaWNpdCB0aHJvd192YWx1ZV9iYXNlKGNvbnN0IHN0ZDo6c2l6ZV90IF9faSkgOiBfTV9pKF9faSkKKyAgICAgIHsgdGhyb3dfY29uZGl0aW9uYWxseSgpOyB9CisjZW5kaWYKKworICAgICAgdGhyb3dfdmFsdWVfYmFzZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0aHJvd192YWx1ZV9iYXNlJiBfX3YpCisgICAgICB7CisJdGhyb3dfY29uZGl0aW9uYWxseSgpOworCV9NX2kgPSBfX3YuX01faTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBTaGFsbCBub3QgdGhyb3cuCisgICAgICB0aHJvd192YWx1ZV9iYXNlJgorICAgICAgb3BlcmF0b3I9KHRocm93X3ZhbHVlX2Jhc2UmJikgPSBkZWZhdWx0OworI2VuZGlmCisKKyAgICAgIHRocm93X3ZhbHVlX2Jhc2UmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwl0aHJvd19jb25kaXRpb25hbGx5KCk7CisJKytfTV9pOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db25kPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh0aHJvd192YWx1ZV9iYXNlPF9Db25kPiYgX19hLCB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiYgX19iKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4gdGhyb3dfdmFsdWU7CisgICAgICB0aHJvd192YWx1ZTo6dGhyb3dfY29uZGl0aW9uYWxseSgpOworICAgICAgdGhyb3dfdmFsdWUgb3JpZyhfX2EpOworICAgICAgX19hID0gX19iOworICAgICAgX19iID0gb3JpZzsKKyAgICB9CisKKyAgLy8gR2VuZXJhbCBpbnN0YW50aWFibGUgdHlwZXMgcmVxdWlyZW1lbnRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29uZD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4mIF9fYSwKKwkgICAgICAgY29uc3QgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4mIF9fYikKKyAgICB7CisgICAgICB0eXBlZGVmIHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+IHRocm93X3ZhbHVlOworICAgICAgdGhyb3dfdmFsdWU6OnRocm93X2NvbmRpdGlvbmFsbHkoKTsKKyAgICAgIGJvb2wgX19yZXQgPSBfX2EuX01faSA9PSBfX2IuX01faTsKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbmQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4mIF9fYSwKKwkgICAgICBjb25zdCB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiYgX19iKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4gdGhyb3dfdmFsdWU7CisgICAgICB0aHJvd192YWx1ZTo6dGhyb3dfY29uZGl0aW9uYWxseSgpOworICAgICAgYm9vbCBfX3JldCA9IF9fYS5fTV9pIDwgX19iLl9NX2k7CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIC8vIE51bWVyaWMgYWxnb3JpdGhtcyBpbnN0YW50aWFibGUgdHlwZXMgcmVxdWlyZW1lbnRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29uZD4KKyAgICBpbmxpbmUgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4KKyAgICBvcGVyYXRvcisoY29uc3QgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4mIF9fYSwKKwkgICAgICBjb25zdCB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiYgX19iKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4gdGhyb3dfdmFsdWU7CisgICAgICB0aHJvd192YWx1ZTo6dGhyb3dfY29uZGl0aW9uYWxseSgpOworICAgICAgdGhyb3dfdmFsdWUgX19yZXQoX19hLl9NX2kgKyBfX2IuX01faSk7CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db25kPgorICAgIGlubGluZSB0aHJvd192YWx1ZV9iYXNlPF9Db25kPgorICAgIG9wZXJhdG9yLShjb25zdCB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiYgX19hLAorCSAgICAgIGNvbnN0IHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+JiBfX2IpCisgICAgeworICAgICAgdHlwZWRlZiB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiB0aHJvd192YWx1ZTsKKyAgICAgIHRocm93X3ZhbHVlOjp0aHJvd19jb25kaXRpb25hbGx5KCk7CisgICAgICB0aHJvd192YWx1ZSBfX3JldChfX2EuX01faSAtIF9fYi5fTV9pKTsKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbmQ+CisgICAgaW5saW5lIHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+CisgICAgb3BlcmF0b3IqKGNvbnN0IHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+JiBfX2EsCisJICAgICAgY29uc3QgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4mIF9fYikKKyAgICB7CisgICAgICB0eXBlZGVmIHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+IHRocm93X3ZhbHVlOworICAgICAgdGhyb3dfdmFsdWU6OnRocm93X2NvbmRpdGlvbmFsbHkoKTsKKyAgICAgIHRocm93X3ZhbHVlIF9fcmV0KF9fYS5fTV9pICogX19iLl9NX2kpOworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworCisgIC8vLyBUeXBlIHRocm93aW5nIHZpYSBsaW1pdCBjb25kaXRpb24uCisgIHN0cnVjdCB0aHJvd192YWx1ZV9saW1pdCA6IHB1YmxpYyB0aHJvd192YWx1ZV9iYXNlPGxpbWl0X2NvbmRpdGlvbj4KKyAgeworICAgIHR5cGVkZWYgdGhyb3dfdmFsdWVfYmFzZTxsaW1pdF9jb25kaXRpb24+IGJhc2VfdHlwZTsKKworI2lmbmRlZiBfR0xJQkNYWF9JU19BR0dSRUdBVEUKKyAgICB0aHJvd192YWx1ZV9saW1pdCgpIHsgfQorCisgICAgdGhyb3dfdmFsdWVfbGltaXQoY29uc3QgdGhyb3dfdmFsdWVfbGltaXQmIF9fb3RoZXIpCisgICAgOiBiYXNlX3R5cGUoX19vdGhlci5fTV9pKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0aHJvd192YWx1ZV9saW1pdCh0aHJvd192YWx1ZV9saW1pdCYmKSA9IGRlZmF1bHQ7CisjZW5kaWYKKworICAgIGV4cGxpY2l0IHRocm93X3ZhbHVlX2xpbWl0KGNvbnN0IHN0ZDo6c2l6ZV90IF9faSkgOiBiYXNlX3R5cGUoX19pKSB7IH0KKyNlbmRpZgorCisgICAgdGhyb3dfdmFsdWVfbGltaXQmCisgICAgb3BlcmF0b3I9KGNvbnN0IHRocm93X3ZhbHVlX2xpbWl0JiBfX290aGVyKQorICAgIHsKKyAgICAgIGJhc2VfdHlwZTo6b3BlcmF0b3I9KF9fb3RoZXIpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0aHJvd192YWx1ZV9saW1pdCYKKyAgICBvcGVyYXRvcj0odGhyb3dfdmFsdWVfbGltaXQmJikgPSBkZWZhdWx0OworI2VuZGlmCisgIH07CisKKyAgLy8vIFR5cGUgdGhyb3dpbmcgdmlhIHJhbmRvbSBjb25kaXRpb24uCisgIHN0cnVjdCB0aHJvd192YWx1ZV9yYW5kb20gOiBwdWJsaWMgdGhyb3dfdmFsdWVfYmFzZTxyYW5kb21fY29uZGl0aW9uPgorICB7CisgICAgdHlwZWRlZiB0aHJvd192YWx1ZV9iYXNlPHJhbmRvbV9jb25kaXRpb24+IGJhc2VfdHlwZTsKKworI2lmbmRlZiBfR0xJQkNYWF9JU19BR0dSRUdBVEUKKyAgICB0aHJvd192YWx1ZV9yYW5kb20oKSB7IH0KKworICAgIHRocm93X3ZhbHVlX3JhbmRvbShjb25zdCB0aHJvd192YWx1ZV9yYW5kb20mIF9fb3RoZXIpCisgICAgOiBiYXNlX3R5cGUoX19vdGhlci5fTV9pKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0aHJvd192YWx1ZV9yYW5kb20odGhyb3dfdmFsdWVfcmFuZG9tJiYpID0gZGVmYXVsdDsKKyNlbmRpZgorCisgICAgZXhwbGljaXQgdGhyb3dfdmFsdWVfcmFuZG9tKGNvbnN0IHN0ZDo6c2l6ZV90IF9faSkgOiBiYXNlX3R5cGUoX19pKSB7IH0KKyNlbmRpZgorCisgICAgdGhyb3dfdmFsdWVfcmFuZG9tJgorICAgIG9wZXJhdG9yPShjb25zdCB0aHJvd192YWx1ZV9yYW5kb20mIF9fb3RoZXIpCisgICAgeworICAgICAgYmFzZV90eXBlOjpvcGVyYXRvcj0oX19vdGhlcik7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHRocm93X3ZhbHVlX3JhbmRvbSYKKyAgICBvcGVyYXRvcj0odGhyb3dfdmFsdWVfcmFuZG9tJiYpID0gZGVmYXVsdDsKKyNlbmRpZgorICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgQWxsb2NhdG9yIGNsYXNzIHdpdGggbG9nZ2luZyBhbmQgZXhjZXB0aW9uIGdlbmVyYXRpb24gY29udHJvbC4KKyAgICogSW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhbiBhbGxvY2F0b3JfdHlwZSBpbiB0ZW1wbGF0aXplZCBjb2RlLgorICAgKiAgQGluZ3JvdXAgYWxsb2NhdG9ycworICAgKgorICAgKiAgTm90ZTogRGVhbGxvY2F0ZSBub3QgYWxsb3dlZCB0byB0aHJvdy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbmQ+CisgICAgY2xhc3MgdGhyb3dfYWxsb2NhdG9yX2Jhc2UKKyAgICA6IHB1YmxpYyBhbm5vdGF0ZV9iYXNlLCBwdWJsaWMgX0NvbmQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzaXplX3QgCQkJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90IAkJCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwIAkJCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAJCQlwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiAJCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUmIAkJCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgCQljb25zdF9yZWZlcmVuY2U7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTAzLiBzdGQ6OmFsbG9jYXRvciBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudAorICAgICAgdHlwZWRlZiBzdGQ6OnRydWVfdHlwZSBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudDsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX0NvbmQJCQkJY29uZGl0aW9uX3R5cGU7CisKKyAgICAgIHN0ZDo6YWxsb2NhdG9yPHZhbHVlX3R5cGU+IAkJX01fYWxsb2NhdG9yOworCisgICAgICB1c2luZyBjb25kaXRpb25fdHlwZTo6dGhyb3dfY29uZGl0aW9uYWxseTsKKworICAgIHB1YmxpYzoKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX2FsbG9jYXRvci5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX194KTsgfQorCisgICAgICBjb25zdF9wb2ludGVyCisgICAgICBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgc3RkOjphbGxvY2F0b3I8dm9pZD46OmNvbnN0X3BvaW50ZXIgaGludCA9IDApCisgICAgICB7CisJaWYgKF9fbiA+IHRoaXMtPm1heF9zaXplKCkpCisJICBzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisKKwl0aHJvd19jb25kaXRpb25hbGx5KCk7CisJcG9pbnRlciBjb25zdCBhID0gX01fYWxsb2NhdG9yLmFsbG9jYXRlKF9fbiwgaGludCk7CisJaW5zZXJ0KGEsIHNpemVvZih2YWx1ZV90eXBlKSAqIF9fbik7CisJcmV0dXJuIGE7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGNvbnN0cnVjdChfVXAqIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01fYWxsb2NhdG9yLmNvbnN0cnVjdChfX3AsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICB2b2lkIAorICAgICAgICBkZXN0cm95KF9VcCogX19wKQorICAgICAgICB7IF9NX2FsbG9jYXRvci5kZXN0cm95KF9fcCk7IH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0IHZhbHVlX3R5cGUmIHZhbCkKKyAgICAgIHsgcmV0dXJuIF9NX2FsbG9jYXRvci5jb25zdHJ1Y3QoX19wLCB2YWwpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGRlc3Ryb3kocG9pbnRlciBfX3ApCisgICAgICB7IF9NX2FsbG9jYXRvci5kZXN0cm95KF9fcCk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKQorICAgICAgeworCWVyYXNlKF9fcCwgc2l6ZW9mKHZhbHVlX3R5cGUpICogX19uKTsKKwlfTV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShfX3AsIF9fbik7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNoZWNrX2FsbG9jYXRlZChwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlzaXplX3R5cGUgX190ID0gc2l6ZW9mKHZhbHVlX3R5cGUpICogX19uOworCWFubm90YXRlX2Jhc2U6OmNoZWNrX2FsbG9jYXRlZChfX3AsIF9fdCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNoZWNrX2FsbG9jYXRlZChzaXplX3R5cGUgX19uKQorICAgICAgeyBhbm5vdGF0ZV9iYXNlOjpjaGVja19hbGxvY2F0ZWQoX19uKTsgfQorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbmQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHRocm93X2FsbG9jYXRvcl9iYXNlPF9UcCwgX0NvbmQ+JiwKKwkgICAgICAgY29uc3QgdGhyb3dfYWxsb2NhdG9yX2Jhc2U8X1RwLCBfQ29uZD4mKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db25kPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB0aHJvd19hbGxvY2F0b3JfYmFzZTxfVHAsIF9Db25kPiYsCisJICAgICAgIGNvbnN0IHRocm93X2FsbG9jYXRvcl9iYXNlPF9UcCwgX0NvbmQ+JikKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBBbGxvY2F0b3IgdGhyb3dpbmcgdmlhIGxpbWl0IGNvbmRpdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCB0aHJvd19hbGxvY2F0b3JfbGltaXQKKyAgICA6IHB1YmxpYyB0aHJvd19hbGxvY2F0b3JfYmFzZTxfVHAsIGxpbWl0X2NvbmRpdGlvbj4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXN0cnVjdCByZWJpbmQKKwl7IHR5cGVkZWYgdGhyb3dfYWxsb2NhdG9yX2xpbWl0PF9UcDE+IG90aGVyOyB9OworCisgICAgICB0aHJvd19hbGxvY2F0b3JfbGltaXQoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIHRocm93X2FsbG9jYXRvcl9saW1pdChjb25zdCB0aHJvd19hbGxvY2F0b3JfbGltaXQmKQorICAgICAgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXRocm93X2FsbG9jYXRvcl9saW1pdChjb25zdCB0aHJvd19hbGxvY2F0b3JfbGltaXQ8X1RwMT4mKQorCV9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgICAgfnRocm93X2FsbG9jYXRvcl9saW1pdCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKyAgICB9OworCisgIC8vLyBBbGxvY2F0b3IgdGhyb3dpbmcgdmlhIHJhbmRvbSBjb25kaXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgdGhyb3dfYWxsb2NhdG9yX3JhbmRvbQorICAgIDogcHVibGljIHRocm93X2FsbG9jYXRvcl9iYXNlPF9UcCwgcmFuZG9tX2NvbmRpdGlvbj4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXN0cnVjdCByZWJpbmQKKwl7IHR5cGVkZWYgdGhyb3dfYWxsb2NhdG9yX3JhbmRvbTxfVHAxPiBvdGhlcjsgfTsKKworICAgICAgdGhyb3dfYWxsb2NhdG9yX3JhbmRvbSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgICAgdGhyb3dfYWxsb2NhdG9yX3JhbmRvbShjb25zdCB0aHJvd19hbGxvY2F0b3JfcmFuZG9tJikKKyAgICAgIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwl0aHJvd19hbGxvY2F0b3JfcmFuZG9tKGNvbnN0IHRocm93X2FsbG9jYXRvcl9yYW5kb208X1RwMT4mKQorCV9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgICAgfnRocm93X2FsbG9jYXRvcl9yYW5kb20oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjIGluY2x1ZGUgPGJpdHMvZnVuY3Rpb25hbF9oYXNoLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gb2Ygc3RkOjpoYXNoIGZvciBfX2dudV9jeHg6OnRocm93X3ZhbHVlX2xpbWl0LgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8X19nbnVfY3h4Ojp0aHJvd192YWx1ZV9saW1pdD4KKyAgICA6IHB1YmxpYyBzdGQ6OnVuYXJ5X2Z1bmN0aW9uPF9fZ251X2N4eDo6dGhyb3dfdmFsdWVfbGltaXQsIHNpemVfdD4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX19nbnVfY3h4Ojp0aHJvd192YWx1ZV9saW1pdCYgX192YWwpIGNvbnN0CisgICAgICB7CisJc3RkOjpoYXNoPHN0ZDo6c2l6ZV90PiBfX2g7CisJc2l6ZV90IF9fcmVzdWx0ID0gX19oKF9fdmFsLl9NX2kpOworCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIH0KKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBvZiBzdGQ6Omhhc2ggZm9yIF9fZ251X2N4eDo6dGhyb3dfdmFsdWVfbGltaXQuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxfX2dudV9jeHg6OnRocm93X3ZhbHVlX3JhbmRvbT4KKyAgICA6IHB1YmxpYyBzdGQ6OnVuYXJ5X2Z1bmN0aW9uPF9fZ251X2N4eDo6dGhyb3dfdmFsdWVfcmFuZG9tLCBzaXplX3Q+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fZ251X2N4eDo6dGhyb3dfdmFsdWVfcmFuZG9tJiBfX3ZhbCkgY29uc3QKKyAgICAgIHsKKwlzdGQ6Omhhc2g8c3RkOjpzaXplX3Q+IF9faDsKKwlzaXplX3QgX19yZXN1bHQgPSBfX2goX192YWwuX01faSk7CisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorICAgIH07Cit9IC8vIGVuZCBuYW1lc3BhY2Ugc3RkCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC90eXBlX3RyYWl0cy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdHlwZV90cmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTg0MDM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdHlwZV90cmFpdHMuaApAQCAtMCwwICsxLDIxMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC90eXBlX3RyYWl0cy5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfRVhUX1RZUEVfVFJBSVRTCisjZGVmaW5lIF9FWFRfVFlQRV9UUkFJVFMgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBEZWZpbmUgYSBuZXN0ZWQgdHlwZSBpZiBzb21lIHByZWRpY2F0ZSBob2xkcy4KKyAgdGVtcGxhdGU8Ym9vbCwgdHlwZW5hbWU+CisgICAgc3RydWN0IF9fZW5hYmxlX2lmIAorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fZW5hYmxlX2lmPHRydWUsIF9UcD4KKyAgICB7IHR5cGVkZWYgX1RwIF9fdHlwZTsgfTsKKworCisgIC8vIENvbmRpdGlvbmFsIGV4cHJlc3Npb24gZm9yIHR5cGVzLiBJZiB0cnVlLCBmaXJzdCwgaWYgZmFsc2UsIHNlY29uZC4KKyAgdGVtcGxhdGU8Ym9vbCBfQ29uZCwgdHlwZW5hbWUgX0lmdHJ1ZSwgdHlwZW5hbWUgX0lmZmFsc2U+CisgICAgc3RydWN0IF9fY29uZGl0aW9uYWxfdHlwZQorICAgIHsgdHlwZWRlZiBfSWZ0cnVlIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSWZ0cnVlLCB0eXBlbmFtZSBfSWZmYWxzZT4KKyAgICBzdHJ1Y3QgX19jb25kaXRpb25hbF90eXBlPGZhbHNlLCBfSWZ0cnVlLCBfSWZmYWxzZT4KKyAgICB7IHR5cGVkZWYgX0lmZmFsc2UgX190eXBlOyB9OworCisKKyAgLy8gR2l2ZW4gYW4gaW50ZWdyYWwgYnVpbHRpbiB0eXBlLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdW5zaWduZWQgdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FkZF91bnNpZ25lZAorICAgIHsgCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19lbmFibGVfaWY8c3RkOjpfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgX1RwPiBfX2lmX3R5cGU7CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faWZfdHlwZTo6X190eXBlIF9fdHlwZTsgCisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fYWRkX3Vuc2lnbmVkPGNoYXI+CisgICAgeyB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19hZGRfdW5zaWduZWQ8c2lnbmVkIGNoYXI+CisgICAgeyB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19hZGRfdW5zaWduZWQ8c2hvcnQ+CisgICAgeyB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fYWRkX3Vuc2lnbmVkPGludD4KKyAgICB7IHR5cGVkZWYgdW5zaWduZWQgaW50IF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fYWRkX3Vuc2lnbmVkPGxvbmc+CisgICAgeyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19hZGRfdW5zaWduZWQ8bG9uZyBsb25nPgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgX190eXBlOyB9OworCisgIC8vIERlY2xhcmUgYnV0IGRvbid0IGRlZmluZS4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2FkZF91bnNpZ25lZDxib29sPjsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fYWRkX3Vuc2lnbmVkPHdjaGFyX3Q+OworCisKKyAgLy8gR2l2ZW4gYW4gaW50ZWdyYWwgYnVpbHRpbiB0eXBlLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgc2lnbmVkIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfdW5zaWduZWQKKyAgICB7IAorICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZW5hYmxlX2lmPHN0ZDo6X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIF9UcD4gX19pZl90eXBlOworICAgICAgCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lmX3R5cGU6Ol9fdHlwZSBfX3R5cGU7IAorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3JlbW92ZV91bnNpZ25lZDxjaGFyPgorICAgIHsgdHlwZWRlZiBzaWduZWQgY2hhciBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3JlbW92ZV91bnNpZ25lZDx1bnNpZ25lZCBjaGFyPgorICAgIHsgdHlwZWRlZiBzaWduZWQgY2hhciBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3JlbW92ZV91bnNpZ25lZDx1bnNpZ25lZCBzaG9ydD4KKyAgICB7IHR5cGVkZWYgc2hvcnQgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfdW5zaWduZWQ8dW5zaWduZWQgaW50PgorICAgIHsgdHlwZWRlZiBpbnQgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfdW5zaWduZWQ8dW5zaWduZWQgbG9uZz4KKyAgICB7IHR5cGVkZWYgbG9uZyBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3JlbW92ZV91bnNpZ25lZDx1bnNpZ25lZCBsb25nIGxvbmc+CisgICAgeyB0eXBlZGVmIGxvbmcgbG9uZyBfX3R5cGU7IH07CisKKyAgLy8gRGVjbGFyZSBidXQgZG9uJ3QgZGVmaW5lLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fcmVtb3ZlX3Vuc2lnbmVkPGJvb2w+OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfdW5zaWduZWQ8d2NoYXJfdD47CisKKworICAvLyBGb3IgdXNlIGluIHN0cmluZyBhbmQgdnN0cmluZy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1R5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2lzX251bGxfcG9pbnRlcihfVHlwZSogX19wdHIpCisgICAgeyByZXR1cm4gX19wdHIgPT0gMDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UeXBlPgorICAgIGlubGluZSBib29sCisgICAgX19pc19udWxsX3BvaW50ZXIoX1R5cGUpCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworCisgIC8vIEZvciBjb21wbGV4IGFuZCBjbWF0aAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgPSBzdGQ6Ol9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlPgorICAgIHN0cnVjdCBfX3Byb21vdGUKKyAgICB7IHR5cGVkZWYgZG91YmxlIF9fdHlwZTsgfTsKKworICAvLyBObyBuZXN0ZWQgX190eXBlIG1lbWJlciBmb3Igbm9uLWludGVnZXIgbm9uLWZsb2F0aW5nIHBvaW50IHR5cGVzLAorICAvLyBhbGxvd3MgdGhpcyB0eXBlIHRvIGJlIHVzZWQgZm9yIFNGSU5BRSB0byBjb25zdHJhaW4gb3ZlcmxvYWRzIGluCisgIC8vIDxjbWF0aD4gYW5kIDxjb21wbGV4PiB0byBvbmx5IHRoZSBpbnRlbmRlZCB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3Byb21vdGU8X1RwLCBmYWxzZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3Byb21vdGU8bG9uZyBkb3VibGU+CisgICAgeyB0eXBlZGVmIGxvbmcgZG91YmxlIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fcHJvbW90ZTxkb3VibGU+CisgICAgeyB0eXBlZGVmIGRvdWJsZSBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3Byb21vdGU8ZmxvYXQ+CisgICAgeyB0eXBlZGVmIGZsb2F0IF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX1RwMiA9IHR5cGVuYW1lIF9fcHJvbW90ZTxfVHA+OjpfX3R5cGUsCisgICAgICAgICAgIHR5cGVuYW1lIF9VcDIgPSB0eXBlbmFtZSBfX3Byb21vdGU8X1VwPjo6X190eXBlPgorICAgIHN0cnVjdCBfX3Byb21vdGVfMgorICAgIHsKKyAgICAgIHR5cGVkZWYgX190eXBlb2ZfXyhfVHAyKCkgKyBfVXAyKCkpIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfVnAsCisgICAgICAgICAgIHR5cGVuYW1lIF9UcDIgPSB0eXBlbmFtZSBfX3Byb21vdGU8X1RwPjo6X190eXBlLAorICAgICAgICAgICB0eXBlbmFtZSBfVXAyID0gdHlwZW5hbWUgX19wcm9tb3RlPF9VcD46Ol9fdHlwZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ZwMiA9IHR5cGVuYW1lIF9fcHJvbW90ZTxfVnA+OjpfX3R5cGU+CisgICAgc3RydWN0IF9fcHJvbW90ZV8zCisgICAgeworICAgICAgdHlwZWRlZiBfX3R5cGVvZl9fKF9UcDIoKSArIF9VcDIoKSArIF9WcDIoKSkgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9WcCwgdHlwZW5hbWUgX1dwLAorICAgICAgICAgICB0eXBlbmFtZSBfVHAyID0gdHlwZW5hbWUgX19wcm9tb3RlPF9UcD46Ol9fdHlwZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX1VwMiA9IHR5cGVuYW1lIF9fcHJvbW90ZTxfVXA+OjpfX3R5cGUsCisgICAgICAgICAgIHR5cGVuYW1lIF9WcDIgPSB0eXBlbmFtZSBfX3Byb21vdGU8X1ZwPjo6X190eXBlLAorICAgICAgICAgICB0eXBlbmFtZSBfV3AyID0gdHlwZW5hbWUgX19wcm9tb3RlPF9XcD46Ol9fdHlwZT4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlXzQKKyAgICB7CisgICAgICB0eXBlZGVmIF9fdHlwZW9mX18oX1RwMigpICsgX1VwMigpICsgX1ZwMigpICsgX1dwMigpKSBfX3R5cGU7CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC90eXBlbGlzdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdHlwZWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzZiOWZjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdHlwZWxpc3QuaApAQCAtMCwwICsxLDU1OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZAorLy8gdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lIG9mCisvLyB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCisvKioKKyAqICBAZmlsZSBleHQvdHlwZWxpc3QuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICoKKyAqICBDb250YWlucyB0eXBlbGlzdF9jaGFpbiBkZWZpbml0aW9ucy4KKyAqICBUeXBlbGlzdHMgYXJlIGFuIGlkZWEgYnkgQW5kcmVpIEFsZXhhbmRyZXNjdS4KKyAqLworCisjaWZuZGVmIF9UWVBFTElTVF9ICisjZGVmaW5lIF9UWVBFTElTVF9IIDEKKworI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKy8qKiBAbmFtZXNwYWNlIF9fZ251X2N4eDo6dHlwZWxpc3QKKyAqICBAYnJpZWYgR05VIHR5cGVsaXN0IGV4dGVuc2lvbnMgZm9yIHB1YmxpYyBjb21waWxlLXRpbWUgdXNlLgorKi8KK25hbWVzcGFjZSB0eXBlbGlzdAoreworICBzdHJ1Y3QgbnVsbF90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSb290PgorICAgIHN0cnVjdCBub2RlCisgICAgeworICAgICAgdHlwZWRlZiBSb290IAlyb290OworICAgIH07CisKKyAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgZnVuY3RvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEhkLCB0eXBlbmFtZSBUeXBlbGlzdD4KKyAgICBzdHJ1Y3QgY2hhaW4KKyAgICB7CisgICAgICB0eXBlZGVmIEhkIAloZWFkOworICAgICAgdHlwZWRlZiBUeXBlbGlzdCAJdGFpbDsKKyAgICB9OworCisgIC8vIEFwcGx5IGFsbCB0eXBlbGlzdCB0eXBlcyB0byB1bmFyeSBmdW5jdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBGbiwgdHlwZW5hbWUgVHlwZWxpc3Q+CisgICAgdm9pZAorICAgIGFwcGx5KEZuJiwgVHlwZWxpc3QpOworCisgIC8vLyBBcHBseSBhbGwgdHlwZWxpc3QgdHlwZXMgdG8gZ2VuZXJhdG9yIGZ1bmN0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEduLCB0eXBlbmFtZSBUeXBlbGlzdD4KKyAgICB2b2lkCisgICAgYXBwbHlfZ2VuZXJhdG9yKEduJiwgVHlwZWxpc3QpOworCisgIC8vIEFwcGx5IGFsbCB0eXBlbGlzdCB0eXBlcyBhbmQgdmFsdWVzIHRvIGdlbmVyYXRvciBmdW5jdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBHbiwgdHlwZW5hbWUgVHlwZWxpc3RULCB0eXBlbmFtZSBUeXBlbGlzdFY+CisgICAgdm9pZAorICAgIGFwcGx5X2dlbmVyYXRvcihHbiYsIFR5cGVsaXN0VCwgVHlwZWxpc3RWKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdDAsIHR5cGVuYW1lIFR5cGVsaXN0MT4KKyAgICBzdHJ1Y3QgYXBwZW5kOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0X1R5cGVsaXN0PgorICAgIHN0cnVjdCBhcHBlbmRfdHlwZWxpc3Q7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3QsIHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGNvbnRhaW5zOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0LCB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBQcmVkPgorICAgIHN0cnVjdCBmaWx0ZXI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3QsIGludCBpPgorICAgIHN0cnVjdCBhdF9pbmRleDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdCwgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVHJhbnNmb3JtPgorICAgIHN0cnVjdCB0cmFuc2Zvcm07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3RfVHlwZWxpc3Q+CisgICAgc3RydWN0IGZsYXR0ZW47CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3Q+CisgICAgc3RydWN0IGZyb21fZmlyc3Q7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDE+CisgICAgc3RydWN0IGNyZWF0ZTE7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBjcmVhdGUyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CisgICAgc3RydWN0IGNyZWF0ZTM7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CisgICAgc3RydWN0IGNyZWF0ZTQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgorICAgIHN0cnVjdCBjcmVhdGU1OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsCisJICAgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LCB0eXBlbmFtZSBUNj4KKyAgICBzdHJ1Y3QgY3JlYXRlNjsKK30gLy8gbmFtZXNwYWNlIHR5cGVsaXN0CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKK25hbWVzcGFjZSB0eXBlbGlzdAoreworbmFtZXNwYWNlIGRldGFpbAoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBGbiwgdHlwZW5hbWUgVHlwZWxpc3RfQ2hhaW4+CisgICAgc3RydWN0IGFwcGx5XzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBGbiwgdHlwZW5hbWUgSGQsIHR5cGVuYW1lIFRsPgorICAgIHN0cnVjdCBhcHBseV88Rm4sIGNoYWluPEhkLCBUbD4gPgorICAgIHsKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoRm4mIGYpCisgICAgICB7CisJZi5vcGVyYXRvcigpKEhkKCkpOworCWFwcGx5XzxGbiwgVGw+IG5leHQ7CisJbmV4dChmKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEZuPgorICAgIHN0cnVjdCBhcHBseV88Rm4sIG51bGxfdHlwZT4KKyAgICB7CisgICAgICB2b2lkCisgICAgICBvcGVyYXRvcigpKEZuJikgeyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBHbiwgdHlwZW5hbWUgVHlwZWxpc3RfQ2hhaW4+CisgICAgc3RydWN0IGFwcGx5X2dlbmVyYXRvcjFfOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEduLCB0eXBlbmFtZSBIZCwgdHlwZW5hbWUgVGw+CisgICAgc3RydWN0IGFwcGx5X2dlbmVyYXRvcjFfPEduLCBjaGFpbjxIZCwgVGw+ID4KKyAgICB7CisgICAgICB2b2lkCisgICAgICBvcGVyYXRvcigpKEduJiBnKQorICAgICAgeworCWcudGVtcGxhdGUgb3BlcmF0b3IoKTxIZD4oKTsKKwlhcHBseV9nZW5lcmF0b3IxXzxHbiwgVGw+IG5leHQ7CisJbmV4dChnKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEduPgorICAgIHN0cnVjdCBhcHBseV9nZW5lcmF0b3IxXzxHbiwgbnVsbF90eXBlPgorICAgIHsKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoR24mKSB7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEduLCB0eXBlbmFtZSBUeXBlbGlzdFRfQ2hhaW4sIHR5cGVuYW1lIFR5cGVsaXN0Vl9DaGFpbj4KKyAgICBzdHJ1Y3QgYXBwbHlfZ2VuZXJhdG9yMl87CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgR24sIHR5cGVuYW1lIEhkMSwgdHlwZW5hbWUgVGxULCB0eXBlbmFtZSBIZDIsIHR5cGVuYW1lIFRsVj4KKyAgICBzdHJ1Y3QgYXBwbHlfZ2VuZXJhdG9yMl88R24sIGNoYWluPEhkMSwgVGxUPiwgY2hhaW48SGQyLCBUbFY+ID4KKyAgICB7CisgICAgICB2b2lkCisgICAgICBvcGVyYXRvcigpKEduJiBnKQorICAgICAgeworCWcudGVtcGxhdGUgb3BlcmF0b3IoKTxIZDEsIEhkMj4oKTsKKwlhcHBseV9nZW5lcmF0b3IyXzxHbiwgVGxULCBUbFY+IG5leHQ7CisJbmV4dChnKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEduPgorICAgIHN0cnVjdCBhcHBseV9nZW5lcmF0b3IyXzxHbiwgbnVsbF90eXBlLCBudWxsX3R5cGU+CisgICAgeworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShHbiYpIHsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3RfQ2hhaW4wLCB0eXBlbmFtZSBUeXBlbGlzdF9DaGFpbjE+CisgICAgc3RydWN0IGFwcGVuZF87CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSGQsIHR5cGVuYW1lIFRsLCB0eXBlbmFtZSBUeXBlbGlzdF9DaGFpbj4KKyAgICBzdHJ1Y3QgYXBwZW5kXzxjaGFpbjxIZCwgVGw+LCBUeXBlbGlzdF9DaGFpbj4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgYXBwZW5kXzxUbCwgVHlwZWxpc3RfQ2hhaW4+IAkJCWFwcGVuZF90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBjaGFpbjxIZCwgdHlwZW5hbWUgYXBwZW5kX3R5cGU6OnR5cGU+IAkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0X0NoYWluPgorICAgIHN0cnVjdCBhcHBlbmRfPG51bGxfdHlwZSwgVHlwZWxpc3RfQ2hhaW4+CisgICAgeworICAgICAgdHlwZWRlZiBUeXBlbGlzdF9DaGFpbiAJCQkgICAgICAJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdF9DaGFpbj4KKyAgICBzdHJ1Y3QgYXBwZW5kXzxUeXBlbGlzdF9DaGFpbiwgbnVsbF90eXBlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgVHlwZWxpc3RfQ2hhaW4gCQkJCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhcHBlbmRfPG51bGxfdHlwZSwgbnVsbF90eXBlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgbnVsbF90eXBlIAkJCQkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0X1R5cGVsaXN0X0NoYWluPgorICAgIHN0cnVjdCBhcHBlbmRfdHlwZWxpc3RfOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEhkPgorICAgIHN0cnVjdCBhcHBlbmRfdHlwZWxpc3RfPGNoYWluPEhkLCBudWxsX3R5cGU+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIGNoYWluPEhkLCBudWxsX3R5cGU+IAkJCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSGQsIHR5cGVuYW1lIFRsPgorICAgIHN0cnVjdCBhcHBlbmRfdHlwZWxpc3RfPGNoYWluPCBIZCwgVGw+ID4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXBwZW5kX3R5cGVsaXN0XzxUbD46OnR5cGUgCQlyZXN0X3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFwcGVuZDxIZCwgbm9kZTxyZXN0X3R5cGU+ID46OnR5cGU6OnJvb3QJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0X0NoYWluLCB0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBjb250YWluc187CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgY29udGFpbnNfPG51bGxfdHlwZSwgVD4KKyAgICB7CisgICAgICBlbnVtCisJeworCSAgdmFsdWUgPSBmYWxzZQorCX07CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBIZCwgdHlwZW5hbWUgVGwsIHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGNvbnRhaW5zXzxjaGFpbjxIZCwgVGw+LCBUPgorICAgIHsKKyAgICAgIGVudW0KKwl7CisJICB2YWx1ZSA9IGNvbnRhaW5zXzxUbCwgVD46OnZhbHVlCisJfTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFRsLCB0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBjb250YWluc188Y2hhaW48VCwgVGw+LCBUPgorICAgIHsKKyAgICAgIGVudW0KKwl7CisJICB2YWx1ZSA9IHRydWUKKwl9OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3RfQ2hhaW4sIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFByZWQ+CisgICAgc3RydWN0IGNoYWluX2ZpbHRlcl87CisKKyAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgUHJlZD4KKyAgICBzdHJ1Y3QgY2hhaW5fZmlsdGVyXzxudWxsX3R5cGUsIFByZWQ+CisgICAgeworICAgICAgdHlwZWRlZiBudWxsX3R5cGUgCQkJCQl0eXBlOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEhkLCB0eXBlbmFtZSBUbCwgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgUHJlZD4KKyAgICBzdHJ1Y3QgY2hhaW5fZmlsdGVyXzxjaGFpbjxIZCwgVGw+LCBQcmVkPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgZW51bQorCXsKKwkgIGluY2x1ZGVfaGQgPSBQcmVkPEhkPjo6dmFsdWUKKwl9OworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNoYWluX2ZpbHRlcl88VGwsIFByZWQ+Ojp0eXBlIAkJcmVzdF90eXBlOworICAgICAgdHlwZWRlZiBjaGFpbjxIZCwgcmVzdF90eXBlPiAJCQkJY2hhaW5fdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19jb25kaXRpb25hbF90eXBlPGluY2x1ZGVfaGQsIGNoYWluX3R5cGUsIHJlc3RfdHlwZT46Ol9fdHlwZSB0eXBlOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0X0NoYWluLCBpbnQgaT4KKyAgICBzdHJ1Y3QgY2hhaW5fYXRfaW5kZXhfOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEhkLCB0eXBlbmFtZSBUbD4KKyAgICBzdHJ1Y3QgY2hhaW5fYXRfaW5kZXhfPGNoYWluPEhkLCBUbD4sIDA+CisgICAgeworICAgICAgdHlwZWRlZiBIZCAJCQkJCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSGQsIHR5cGVuYW1lIFRsLCBpbnQgaT4KKyAgICBzdHJ1Y3QgY2hhaW5fYXRfaW5kZXhfPGNoYWluPEhkLCBUbD4sIGk+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjaGFpbl9hdF9pbmRleF88VGwsIGkgLSAxPjo6dHlwZSAJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIFR5cGVsaXN0X0NoYWluLCB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUcmFuc2Zvcm0+CisgICAgc3RydWN0IGNoYWluX3RyYW5zZm9ybV87CisKKyAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVHJhbnNmb3JtPgorICAgIHN0cnVjdCBjaGFpbl90cmFuc2Zvcm1fPG51bGxfdHlwZSwgVHJhbnNmb3JtPgorICAgIHsKKyAgICAgIHR5cGVkZWYgbnVsbF90eXBlIAkJCQkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIEhkLCBjbGFzcyBUbCwgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVHJhbnNmb3JtPgorICAgIHN0cnVjdCBjaGFpbl90cmFuc2Zvcm1fPGNoYWluPEhkLCBUbD4sIFRyYW5zZm9ybT4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2hhaW5fdHJhbnNmb3JtXzxUbCwgVHJhbnNmb3JtPjo6dHlwZSAJcmVzdF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm08SGQ+Ojp0eXBlIAkJCXRyYW5zZm9ybV90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBjaGFpbjx0cmFuc2Zvcm1fdHlwZSwgcmVzdF90eXBlPiAJCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3RfVHlwZWxpc3RfQ2hhaW4+CisgICAgc3RydWN0IGNoYWluX2ZsYXR0ZW5fOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEhkX1RsPgorICAgIHN0cnVjdCBjaGFpbl9mbGF0dGVuXzxjaGFpbjxIZF9UbCwgbnVsbF90eXBlPiA+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBIZF9UbDo6cm9vdCAJCQkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEhkX1R5cGVsaXN0LCBjbGFzcyBUbF9UeXBlbGlzdD4KKyAgICBzdHJ1Y3QgY2hhaW5fZmxhdHRlbl88Y2hhaW48SGRfVHlwZWxpc3QsIFRsX1R5cGVsaXN0PiA+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNoYWluX2ZsYXR0ZW5fPFRsX1R5cGVsaXN0Pjo6dHlwZSAJcmVzdF90eXBlOworICAgICAgdHlwZWRlZiBhcHBlbmQ8SGRfVHlwZWxpc3QsIG5vZGU8cmVzdF90eXBlPiA+CQlhcHBlbmRfdHlwZTsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFwcGVuZF90eXBlOjp0eXBlOjpyb290IAkJCXR5cGU7CisgICAgfTsKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgdHlwZWxpc3QKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMShYMCkgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9fZ251X2N4eDo6dHlwZWxpc3Q6Om51bGxfdHlwZT4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4yKFgwLCBYMSkgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMShYMSkgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjMoWDAsIFgxLCBYMikgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMihYMSwgWDIpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU40KFgwLCBYMSwgWDIsIFgzKSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4zKFgxLCBYMiwgWDMpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU41KFgwLCBYMSwgWDIsIFgzLCBYNCkgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlONChYMSwgWDIsIFgzLCBYNCkgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjYoWDAsIFgxLCBYMiwgWDMsIFg0LCBYNSkgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlONShYMSwgWDIsIFgzLCBYNCwgWDUpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU43KFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2KSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU42KFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU44KFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNykgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlONyhYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNykgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjkoWDAsIFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCkgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOOChYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xMChYMCwgWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSkgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOOShYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5KSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTEoWDAsIFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCkgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTAoWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwKSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTIoWDAsIFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExKSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xMShYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSkgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjEzKFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyKSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xMihYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyKSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTQoWDAsIFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExLCBYMTIsIFgxMykgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTMoWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEsIFgxMiwgWDEzKSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTUoWDAsIFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExLCBYMTIsIFgxMywgWDE0KSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xNChYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyLCBYMTMsIFgxNCkgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjE2KFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyLCBYMTMsIFgxNCwgWDE1KSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xNShYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyLCBYMTMsIFgxNCwgWDE1KSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTcoWDAsIFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExLCBYMTIsIFgxMywgWDE0LCBYMTUsIFgxNikgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTYoWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEsIFgxMiwgWDEzLCBYMTQsIFgxNSwgWDE2KSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTgoWDAsIFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExLCBYMTIsIFgxMywgWDE0LCBYMTUsIFgxNiwgWDE3KSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xNyhYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyLCBYMTMsIFgxNCwgWDE1LCBYMTYsIFgxNykgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjE5KFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyLCBYMTMsIFgxNCwgWDE1LCBYMTYsIFgxNywgWDE4KSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xOChYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyLCBYMTMsIFgxNCwgWDE1LCBYMTYsIFgxNywgWDE4KSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMjAoWDAsIFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExLCBYMTIsIFgxMywgWDE0LCBYMTUsIFgxNiwgWDE3LCBYMTgsIFgxOSkgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTkoWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEsIFgxMiwgWDEzLCBYMTQsIFgxNSwgWDE2LCBYMTcsIFgxOCwgWDE5KSA+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworbmFtZXNwYWNlIHR5cGVsaXN0Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEZuLCB0eXBlbmFtZSBUeXBlbGlzdD4KKyAgICB2b2lkCisgICAgYXBwbHkoRm4mIGZuLCBUeXBlbGlzdCkKKyAgICB7CisgICAgICBkZXRhaWw6OmFwcGx5XzxGbiwgdHlwZW5hbWUgVHlwZWxpc3Q6OnJvb3Q+IGE7CisgICAgICBhKGZuKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRm4sIHR5cGVuYW1lIFR5cGVsaXN0PgorICAgIHZvaWQKKyAgICBhcHBseV9nZW5lcmF0b3IoRm4mIGZuLCBUeXBlbGlzdCkKKyAgICB7CisgICAgICBkZXRhaWw6OmFwcGx5X2dlbmVyYXRvcjFfPEZuLCB0eXBlbmFtZSBUeXBlbGlzdDo6cm9vdD4gYTsKKyAgICAgIGEoZm4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBGbiwgdHlwZW5hbWUgVHlwZWxpc3RULCB0eXBlbmFtZSBUeXBlbGlzdFY+CisgICAgdm9pZAorICAgIGFwcGx5X2dlbmVyYXRvcihGbiYgZm4sIFR5cGVsaXN0VCwgVHlwZWxpc3RWKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZWxpc3RUOjpyb290IHJvb3RUOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlbGlzdFY6OnJvb3Qgcm9vdFY7CisgICAgICBkZXRhaWw6OmFwcGx5X2dlbmVyYXRvcjJfPEZuLCByb290VCwgcm9vdFY+IGE7CisgICAgICBhKGZuKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3QwLCB0eXBlbmFtZSBUeXBlbGlzdDE+CisgICAgc3RydWN0IGFwcGVuZAorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlbGlzdDA6OnJvb3QgCQkJCXJvb3QwX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVsaXN0MTo6cm9vdCAJCQkJcm9vdDFfdHlwZTsKKyAgICAgIHR5cGVkZWYgZGV0YWlsOjphcHBlbmRfPHJvb3QwX3R5cGUsIHJvb3QxX3R5cGU+IAkJYXBwZW5kX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIG5vZGU8dHlwZW5hbWUgYXBwZW5kX3R5cGU6OnR5cGU+IAkJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdF9UeXBlbGlzdD4KKyAgICBzdHJ1Y3QgYXBwZW5kX3R5cGVsaXN0CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVsaXN0X1R5cGVsaXN0Ojpyb290IAkJICAgICAgCXJvb3RfdHlwZTsKKyAgICAgIHR5cGVkZWYgZGV0YWlsOjphcHBlbmRfdHlwZWxpc3RfPHJvb3RfdHlwZT4gCQlhcHBlbmRfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgbm9kZTx0eXBlbmFtZSBhcHBlbmRfdHlwZTo6dHlwZT4gCQkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0LCB0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBjb250YWlucworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlbGlzdDo6cm9vdCAJCQkJcm9vdF90eXBlOworCisgICAgcHVibGljOgorICAgICAgZW51bQorCXsKKwkgIHZhbHVlID0gZGV0YWlsOjpjb250YWluc188cm9vdF90eXBlLCBUPjo6dmFsdWUKKwl9OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3QsIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFByZWQ+CisgICAgc3RydWN0IGZpbHRlcgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlbGlzdDo6cm9vdCAJCQkJcm9vdF90eXBlOworICAgICAgdHlwZWRlZiBkZXRhaWw6OmNoYWluX2ZpbHRlcl88cm9vdF90eXBlLCBQcmVkPiAJCWZpbHRlcl90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBub2RlPHR5cGVuYW1lIGZpbHRlcl90eXBlOjp0eXBlPiAJICAgICAgIAkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0LCBpbnQgaT4KKyAgICBzdHJ1Y3QgYXRfaW5kZXgKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZWxpc3Q6OnJvb3QgCQkJCXJvb3RfdHlwZTsKKyAgICAgIHR5cGVkZWYgZGV0YWlsOjpjaGFpbl9hdF9pbmRleF88cm9vdF90eXBlLCBpPiAJCWluZGV4X3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGluZGV4X3R5cGU6OnR5cGUgCQkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0LCB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUcmFuc2Zvcm0+CisgICAgc3RydWN0IHRyYW5zZm9ybQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlbGlzdDo6cm9vdCAJCQkJcm9vdF90eXBlOworICAgICAgdHlwZWRlZiBkZXRhaWw6OmNoYWluX3RyYW5zZm9ybV88cm9vdF90eXBlLCBUcmFuc2Zvcm0+IAl0cmFuc2Zvcm1fdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgbm9kZTx0eXBlbmFtZSB0cmFuc2Zvcm1fdHlwZTo6dHlwZT4gCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3RfVHlwZWxpc3Q+CisgICAgc3RydWN0IGZsYXR0ZW4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZWxpc3RfVHlwZWxpc3Q6OnJvb3QgCQkgICAgICAJcm9vdF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBkZXRhaWw6OmNoYWluX2ZsYXR0ZW5fPHJvb3RfdHlwZT46OnR5cGUgCWZsYXR0ZW5fdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgbm9kZTxmbGF0dGVuX3R5cGU+IAkJCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3Q+CisgICAgc3RydWN0IGZyb21fZmlyc3QKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXRfaW5kZXg8VHlwZWxpc3QsIDA+Ojp0eXBlIAkJZmlyc3RfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgbm9kZTxjaGFpbjxmaXJzdF90eXBlLCBudWxsX3R5cGU+ID4gCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDE+CisgICAgc3RydWN0IGNyZWF0ZTEKKyAgICB7CisgICAgICB0eXBlZGVmIG5vZGU8X0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xKFQxKT4gCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBjcmVhdGUyCisgICAgeworICAgICAgdHlwZWRlZiBub2RlPF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMihUMSxUMik+IAkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CisgICAgc3RydWN0IGNyZWF0ZTMKKyAgICB7CisgICAgICB0eXBlZGVmIG5vZGU8X0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4zKFQxLFQyLFQzKT4JCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KKyAgICBzdHJ1Y3QgY3JlYXRlNAorICAgIHsKKyAgICAgIHR5cGVkZWYgbm9kZTxfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjQoVDEsVDIsVDMsVDQpPgl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywKKwkgICB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CisgICAgc3RydWN0IGNyZWF0ZTUKKyAgICB7CisgICAgICB0eXBlZGVmIG5vZGU8X0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU41KFQxLFQyLFQzLFQ0LFQ1KT4JdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsCisJICAgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LCB0eXBlbmFtZSBUNj4KKyAgICBzdHJ1Y3QgY3JlYXRlNgorICAgIHsKKyAgICAgIHR5cGVkZWYgbm9kZTxfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjYoVDEsVDIsVDMsVDQsVDUsVDYpPgl0eXBlOworICAgIH07Cit9IC8vIG5hbWVzcGFjZSB0eXBlbGlzdAorX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdnN0cmluZy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdnN0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NmE5OTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC92c3RyaW5nLmgKQEAgLTAsMCArMSwyODU0IEBACisvLyBWZXJzYXRpbGUgc3RyaW5nIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvdnN0cmluZy5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfVlNUUklOR19ICisjZGVmaW5lIF9WU1RSSU5HX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZXh0L3ZzdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgPGV4dC9yY19zdHJpbmdfYmFzZS5oPgorI2luY2x1ZGUgPGV4dC9zc29fc3RyaW5nX2Jhc2UuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGNsYXNzIF9fdmVyc2Ffc3RyaW5nIHZzdHJpbmcuaAorICAgKiAgQGJyaWVmICBUZW1wbGF0ZSBjbGFzcyBfX3ZlcnNhX3N0cmluZy4gCisgICAqICBAaW5ncm91cCBleHRlbnNpb25zCisgICAqCisgICAqICBEYXRhIHN0cnVjdHVyZSBtYW5hZ2luZyBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyBhbmQKKyAgICogIGNoYXJhY3Rlci1saWtlIG9iamVjdHMuIAorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGNsYXNzIF9fdmVyc2Ffc3RyaW5nCisgICAgOiBwcml2YXRlIF9CYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICAgICAgICAgICAgICAgIF9fdnN0cmluZ19iYXNlOyAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX192c3RyaW5nX2Jhc2U6Ol9DaGFyVF9hbGxvY190eXBlICAgIF9DaGFyVF9hbGxvY190eXBlOworCisgICAgICAvLyBUeXBlczoKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcmFpdHMJCQkJCSAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlCQkgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jCQkJCQkgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpzaXplX3R5cGUJICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OmRpZmZlcmVuY2VfdHlwZSAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAJICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6cG9pbnRlcgkgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OmNvbnN0X3BvaW50ZXIJICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X19ub3JtYWxfaXRlcmF0b3I8cG9pbnRlciwgX192ZXJzYV9zdHJpbmc+ICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX25vcm1hbF9pdGVyYXRvcjxjb25zdF9wb2ludGVyLCBfX3ZlcnNhX3N0cmluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+CWNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4JCSAgICByZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyBEYXRhIE1lbWJlciAocHVibGljKToKKyAgICAgIC8vLyAgVmFsdWUgcmV0dXJuZWQgYnkgdmFyaW91cyBtZW1iZXIgZnVuY3Rpb25zIHdoZW4gdGhleSBmYWlsLgorICAgICAgc3RhdGljIGNvbnN0IHNpemVfdHlwZQlucG9zID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPigtMSk7CisKKyAgICBwcml2YXRlOgorICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9jaGVjayhzaXplX3R5cGUgX19wb3MsIGNvbnN0IGNoYXIqIF9fcykgY29uc3QKKyAgICAgIHsKKwlpZiAoX19wb3MgPiB0aGlzLT5zaXplKCkpCisJICBzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTihfX3MpKTsKKwlyZXR1cm4gX19wb3M7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NoZWNrX2xlbmd0aChzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIsIGNvbnN0IGNoYXIqIF9fcykgY29uc3QKKyAgICAgIHsKKwlpZiAodGhpcy0+bWF4X3NpemUoKSAtICh0aGlzLT5zaXplKCkgLSBfX24xKSA8IF9fbjIpCisJICBzdGQ6Ol9fdGhyb3dfbGVuZ3RoX2Vycm9yKF9fTihfX3MpKTsKKyAgICAgIH0KKworICAgICAgLy8gTkI6IF9NX2xpbWl0IGRvZXNuJ3QgY2hlY2sgZm9yIGEgYmFkIF9fcG9zIHZhbHVlLgorICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9saW1pdChzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX29mZikgY29uc3QKKyAgICAgIHsKKwljb25zdCBib29sIF9fdGVzdG9mZiA9ICBfX29mZiA8IHRoaXMtPnNpemUoKSAtIF9fcG9zOworCXJldHVybiBfX3Rlc3RvZmYgPyBfX29mZiA6IHRoaXMtPnNpemUoKSAtIF9fcG9zOworICAgICAgfQorCisgICAgICAvLyBUcnVlIGlmIF9SZXAgYW5kIHNvdXJjZSBkbyBub3Qgb3ZlcmxhcC4KKyAgICAgIGJvb2wKKyAgICAgIF9NX2Rpc2p1bmN0KGNvbnN0IF9DaGFyVCogX19zKSBjb25zdAorICAgICAgeworCXJldHVybiAoc3RkOjpsZXNzPGNvbnN0IF9DaGFyVCo+KCkoX19zLCB0aGlzLT5fTV9kYXRhKCkpCisJCXx8IHN0ZDo6bGVzczxjb25zdCBfQ2hhclQqPigpKHRoaXMtPl9NX2RhdGEoKQorCQkJCQkgICAgICArIHRoaXMtPnNpemUoKSwgX19zKSk7CisgICAgICB9CisKKyAgICAgIC8vIEZvciB0aGUgaW50ZXJuYWwgdXNlIHdlIGhhdmUgZnVuY3Rpb25zIHNpbWlsYXIgdG8gYGJlZ2luJy9gZW5kJworICAgICAgLy8gYnV0IHRoZXkgZG8gbm90IGNhbGwgX01fbGVhay4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgX01faWVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9kYXRhKCkgKyB0aGlzLT5fTV9sZW5ndGgoKSk7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICAvLyBOQjogV2Ugb3ZlcmxvYWQgY3RvcnMgaW4gc29tZSBjYXNlcyBpbnN0ZWFkIG9mIHVzaW5nIGRlZmF1bHQKKyAgICAgIC8vIGFyZ3VtZW50cywgcGVyIDE3LjQuNC40IHBhcmEuIDIgaXRlbSAyLgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nKCkKKyAgICAgIDogX192c3RyaW5nX2Jhc2UoKSB7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYW4gZW1wdHkgc3RyaW5nIHVzaW5nIGFsbG9jYXRvciBAYSBhLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgX192ZXJzYV9zdHJpbmcoY29uc3QgX0FsbG9jJiBfX2EpCisgICAgICA6IF9fdnN0cmluZ19iYXNlKF9fYSkgeyB9CisKKyAgICAgIC8vIE5COiBwZXIgTFdHIGlzc3VlIDQyLCBzZW1hbnRpY3MgZGlmZmVyZW50IGZyb20gSVM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgd2l0aCBjb3B5IG9mIHZhbHVlIG9mIEBhIF9fc3RyLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIFNvdXJjZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0cikKKyAgICAgIDogX192c3RyaW5nX2Jhc2UoX19zdHIpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdHJpbmcgbW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY29uc3RydWN0ZWQgJXN0cmluZyBjb250YWlucyB0aGUgZXhhY3QgY29udGVudHMgb2YKKyAgICAgICAqICBAYSBfX3N0ci4gIFRoZSBjb250ZW50cyBvZiBAYSBfX3N0ciBhcmUgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkCisgICAgICAgKiAgc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyhfX3ZlcnNhX3N0cmluZyYmIF9fc3RyKSBub2V4Y2VwdAorICAgICAgOiBfX3ZzdHJpbmdfYmFzZShzdGQ6Om1vdmUoX19zdHIpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgc3RkOjppbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFsbG9jYXRvciB0byB1c2UgKGRlZmF1bHQgaXMgZGVmYXVsdCBhbGxvY2F0b3IpLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wsCisJCSAgICAgY29uc3QgX0FsbG9jJiBfX2EgPSBfQWxsb2MoKSkKKyAgICAgIDogX192c3RyaW5nX2Jhc2UoX19sLmJlZ2luKCksIF9fbC5lbmQoKSwgX19hKSB7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgYXMgY29weSBvZiBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byBjb3B5IGZyb20uCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkgKGRlZmF1bHQgcmVtYWluZGVyKS4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcoY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsCisJCSAgICAgc2l6ZV90eXBlIF9fbiA9IG5wb3MpCisgICAgICA6IF9fdnN0cmluZ19iYXNlKF9fc3RyLl9NX2RhdGEoKQorCQkgICAgICAgKyBfX3N0ci5fTV9jaGVjayhfX3BvcywKKwkJCQkJIl9fdmVyc2Ffc3RyaW5nOjpfX3ZlcnNhX3N0cmluZyIpLAorCQkgICAgICAgX19zdHIuX01fZGF0YSgpICsgX19zdHIuX01fbGltaXQoX19wb3MsIF9fbikKKwkJICAgICAgICsgX19wb3MsIF9BbGxvYygpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIGFzIGNvcHkgb2YgYSBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgU291cmNlIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gY29weSBmcm9tLgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbGxvY2F0b3IgdG8gdXNlLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyhjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcywKKwkJICAgICBzaXplX3R5cGUgX19uLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICAgIDogX192c3RyaW5nX2Jhc2UoX19zdHIuX01fZGF0YSgpCisJCSAgICAgICArIF9fc3RyLl9NX2NoZWNrKF9fcG9zLAorCQkJCQkiX192ZXJzYV9zdHJpbmc6Ol9fdmVyc2Ffc3RyaW5nIiksCisJCSAgICAgICBfX3N0ci5fTV9kYXRhKCkgKyBfX3N0ci5fTV9saW1pdChfX3BvcywgX19uKQorCQkgICAgICAgKyBfX3BvcywgX19hKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIGluaXRpYWxpemVkIGJ5IGEgY2hhcmFjdGVyIGFycmF5LgorICAgICAgICogIEBwYXJhbSAgX19zICBTb3VyY2UgY2hhcmFjdGVyIGFycmF5LgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbGxvY2F0b3IgdG8gdXNlIChkZWZhdWx0IGlzIGRlZmF1bHQgYWxsb2NhdG9yKS4KKyAgICAgICAqCisgICAgICAgKiAgTkI6IEBhIF9fcyBtdXN0IGhhdmUgYXQgbGVhc3QgQGEgX19uIGNoYXJhY3RlcnMsICdcXDAnIGhhcyBubyBzcGVjaWFsCisgICAgICAgKiAgbWVhbmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sCisJCSAgICAgY29uc3QgX0FsbG9jJiBfX2EgPSBfQWxsb2MoKSkKKyAgICAgIDogX192c3RyaW5nX2Jhc2UoX19zLCBfX3MgKyBfX24sIF9fYSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBhcyBjb3B5IG9mIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFNvdXJjZSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQWxsb2NhdG9yIHRvIHVzZSAoZGVmYXVsdCBpcyBkZWZhdWx0IGFsbG9jYXRvcikuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBjb25zdCBfQWxsb2MmIF9fYSA9IF9BbGxvYygpKQorICAgICAgOiBfX3ZzdHJpbmdfYmFzZShfX3MsIF9fcyA/IF9fcyArIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSA6CisJCSAgICAgICBfX3MgKyBucG9zLCBfX2EpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgYXMgbXVsdGlwbGUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX2MgIENoYXJhY3RlciB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFsbG9jYXRvciB0byB1c2UgKGRlZmF1bHQgaXMgZGVmYXVsdCBhbGxvY2F0b3IpLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyhzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jLCBjb25zdCBfQWxsb2MmIF9fYSA9IF9BbGxvYygpKQorICAgICAgOiBfX3ZzdHJpbmdfYmFzZShfX24sIF9fYywgX19hKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIGFzIGNvcHkgb2YgYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fYmVnICBTdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFsbG9jYXRvciB0byB1c2UgKGRlZmF1bHQgaXMgZGVmYXVsdCBhbGxvY2F0b3IpLgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgX192ZXJzYV9zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19iZWcsIF9JbnB1dEl0ZXJhdG9yIF9fZW5kLAorCQkgICAgICAgY29uc3QgX0FsbG9jJiBfX2EgPSBfQWxsb2MoKSkKKwk6IF9fdnN0cmluZ19iYXNlKF9fYmVnLCBfX2VuZCwgX19hKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZXN0cm95IHRoZSBzdHJpbmcgaW5zdGFuY2UuCisgICAgICAgKi8KKyAgICAgIH5fX3ZlcnNhX3N0cmluZygpIF9HTElCQ1hYX05PRVhDRVBUIHsgfQkKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ24gdGhlIHZhbHVlIG9mIEBhIHN0ciB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIpIAorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fc3RyKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdHJpbmcgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIFNvdXJjZSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSBfX3N0ciBhcmUgbW92ZWQgaW50byB0aGlzIHN0cmluZyAod2l0aG91dAorICAgICAgICogIGNvcHlpbmcpLiAgQGEgX19zdHIgaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBvcGVyYXRvcj0oX192ZXJzYV9zdHJpbmcmJiBfX3N0cikKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwl0aGlzLT5zd2FwKF9fc3RyKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIHN0cmluZyBjb25zdHJ1Y3RlZCBmcm9tIGluaXRpYWxpemVyIGxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBvcGVyYXRvcj0oc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeworCXRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb3B5IGNvbnRlbnRzIG9mIEBhIF9fcyBpbnRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zICBTb3VyY2UgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX0NoYXJUKiBfX3MpIAorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fcyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gc3RyaW5nIG9mIGxlbmd0aCAxLgorICAgICAgICogIEBwYXJhbSAgX19jICBTb3VyY2UgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBBc3NpZ25pbmcgdG8gYSBjaGFyYWN0ZXIgbWFrZXMgdGhpcyBzdHJpbmcgbGVuZ3RoIDEgYW5kCisgICAgICAgKiAgKCp0aGlzKVswXSA9PSBAYSBfX2MuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgb3BlcmF0b3I9KF9DaGFyVCBfX2MpIAorICAgICAgeyAKKwl0aGlzLT5hc3NpZ24oMSwgX19jKTsgCisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBJdGVyYXRvcnM6CisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGluCisgICAgICAgKiAgdGhlICVzdHJpbmcuICBVbnNoYXJlcyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCXRoaXMtPl9NX2xlYWsoKTsKKwlyZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBVbnNoYXJlcyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwl0aGlzLT5fTV9sZWFrKCk7CisJcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUKKyAgICAgICAqICBsYXN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9kYXRhKCkgKyB0aGlzLT5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGxhc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBJdGVyYXRpb24gaXMgZG9uZSBpbiByZXZlcnNlIGVsZW1lbnQKKyAgICAgICAqICBvcmRlci4gIFVuc2hhcmVzIHRoZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5lbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUgYmVmb3JlIHRoZQorICAgICAgICogIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIHJldmVyc2UKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLiAgVW5zaGFyZXMgdGhlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmJlZ2luKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gb25lIGJlZm9yZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLiAgSXRlcmF0aW9uCisgICAgICAgKiAgaXMgZG9uZSBpbiByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5iZWdpbigpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9kYXRhKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUKKyAgICAgICAqICBsYXN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpICsgdGhpcy0+c2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IodGhpcy0+ZW5kKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gb25lIGJlZm9yZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLiAgSXRlcmF0aW9uCisgICAgICAgKiAgaXMgZG9uZSBpbiByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IodGhpcy0+YmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgcHVibGljOgorICAgICAgLy8gQ2FwYWNpdHk6CisgICAgICAvLy8gIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcsIG5vdCBpbmNsdWRpbmcgYW55CisgICAgICAvLy8gIG51bGwtdGVybWluYXRpb24uCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fbGVuZ3RoKCk7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBub3QgaW5jbHVkaW5nIGFueQorICAgICAgLy8vICBudWxsLXRlcm1pbmF0aW9uLgorICAgICAgc2l6ZV90eXBlCisgICAgICBsZW5ndGgoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fbGVuZ3RoKCk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIHNpemUoKSBvZiB0aGUgbGFyZ2VzdCBwb3NzaWJsZSAlc3RyaW5nLgorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9tYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVzaXplcyB0aGUgJXN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0aGUgJXN0cmluZyBzaG91bGQgY29udGFpbi4KKyAgICAgICAqICBAcGFyYW0gIF9fYyAgQ2hhcmFjdGVyIHRvIGZpbGwgYW55IG5ldyBlbGVtZW50cy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICVzdHJpbmcgdG8gdGhlIHNwZWNpZmllZAorICAgICAgICogIG51bWJlciBvZiBjaGFyYWN0ZXJzLiAgSWYgdGhlIG51bWJlciBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICAgICAgKiAgJXN0cmluZydzIGN1cnJlbnQgc2l6ZSB0aGUgJXN0cmluZyBpcyB0cnVuY2F0ZWQsIG90aGVyd2lzZQorICAgICAgICogIHRoZSAlc3RyaW5nIGlzIGV4dGVuZGVkIGFuZCBuZXcgZWxlbWVudHMgYXJlIHNldCB0byBAYSBfX2MuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXNpemVzIHRoZSAlc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRoZSAlc3RyaW5nIHNob3VsZCBjb250YWluLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzaXplIHRoZSAlc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBsZW5ndGguICBJZiB0aGUgbmV3IHNpemUgaXMgc21hbGxlciB0aGFuIHRoZSAlc3RyaW5nJ3MKKyAgICAgICAqICBjdXJyZW50IHNpemUgdGhlICVzdHJpbmcgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UgdGhlICVzdHJpbmcKKyAgICAgICAqICBpcyBleHRlbmRlZCBhbmQgbmV3IGNoYXJhY3RlcnMgYXJlIGRlZmF1bHQtY29uc3RydWN0ZWQuICBGb3IKKyAgICAgICAqICBiYXNpYyB0eXBlcyBzdWNoIGFzIGNoYXIsIHRoaXMgbWVhbnMgc2V0dGluZyB0aGVtIHRvIDAuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uKQorICAgICAgeyB0aGlzLT5yZXNpemUoX19uLCBfQ2hhclQoKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vLyBBIG5vbi1iaW5kaW5nIHJlcXVlc3QgdG8gcmVkdWNlIGNhcGFjaXR5KCkgdG8gc2l6ZSgpLgorICAgICAgdm9pZAorICAgICAgc2hyaW5rX3RvX2ZpdCgpCisgICAgICB7CisJaWYgKGNhcGFjaXR5KCkgPiBzaXplKCkpCisJICB7CisJICAgIF9fdHJ5CisJICAgICAgeyB0aGlzLT5yZXNlcnZlKDApOyB9CisJICAgIF9fY2F0Y2goLi4uKQorCSAgICAgIHsgfQorCSAgfQorICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhlICVzdHJpbmcgY2FuCisgICAgICAgKiAgaG9sZCBiZWZvcmUgbmVlZGluZyB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjYXBhY2l0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9jYXBhY2l0eSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXR0ZW1wdCB0byBwcmVhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IGZvciBzcGVjaWZpZWQgbnVtYmVyIG9mCisgICAgICAgKiAgICAgICAgICBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19yZXNfYXJnICBOdW1iZXIgb2YgY2hhcmFjdGVycyByZXF1aXJlZC4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBAYSBfX3Jlc19hcmcgZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIHJlc2VydmUgZW5vdWdoIG1lbW9yeSBmb3IgdGhlCisgICAgICAgKiAgJXN0cmluZyB0byBob2xkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuICBJZiB0aGUKKyAgICAgICAqICBudW1iZXIgcmVxdWVzdGVkIGlzIG1vcmUgdGhhbiBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMKKyAgICAgICAqICB0aHJvd24uCisgICAgICAgKgorICAgICAgICogIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0aGF0IGlmIG9wdGltYWwgY29kZSBpcyBhCisgICAgICAgKiAgbmVjZXNzaXR5IGFuZCB0aGUgdXNlciBjYW4gZGV0ZXJtaW5lIHRoZSBzdHJpbmcgbGVuZ3RoIHRoYXQKKyAgICAgICAqICB3aWxsIGJlIHJlcXVpcmVkLCB0aGUgdXNlciBjYW4gcmVzZXJ2ZSB0aGUgbWVtb3J5IGluCisgICAgICAgKiAgJWFkdmFuY2UsIGFuZCB0aHVzIHByZXZlbnQgYSBwb3NzaWJsZSByZWFsbG9jYXRpb24gb2YgbWVtb3J5CisgICAgICAgKiAgYW5kIGNvcHlpbmcgb2YgJXN0cmluZyBkYXRhLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNlcnZlKHNpemVfdHlwZSBfX3Jlc19hcmcgPSAwKQorICAgICAgeyB0aGlzLT5fTV9yZXNlcnZlKF9fcmVzX2FyZyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgRXJhc2VzIHRoZSBzdHJpbmcsIG1ha2luZyBpdCBlbXB0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyB0aGlzLT5fTV9jbGVhcigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXN0cmluZyBpcyBlbXB0eS4gIEVxdWl2YWxlbnQgdG8gCisgICAgICAgKiAgPGNvZGU+KnRoaXMgPT0gIiI8L2NvZGU+LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5zaXplKCkgPT0gMDsgfQorCisgICAgICAvLyBFbGVtZW50IGFjY2VzczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3Vic2NyaXB0IGFjY2VzcyB0byB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdG8gYWNjZXNzLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdG9yIGFsbG93cyBmb3IgZWFzeSwgYXJyYXktc3R5bGUsIGRhdGEgYWNjZXNzLgorICAgICAgICogIE5vdGUgdGhhdCBkYXRhIGFjY2VzcyB3aXRoIHRoaXMgb3BlcmF0b3IgaXMgdW5jaGVja2VkIGFuZAorICAgICAgICogIG91dF9vZl9yYW5nZSBsb29rdXBzIGFyZSBub3QgZGVmaW5lZC4gKEZvciBjaGVja2VkIGxvb2t1cHMKKyAgICAgICAqICBzZWUgYXQoKS4pCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXSAoc2l6ZV90eXBlIF9fcG9zKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfX3BvcyA8PSB0aGlzLT5zaXplKCkpOworCXJldHVybiB0aGlzLT5fTV9kYXRhKClbX19wb3NdOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN1YnNjcmlwdCBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIHRvIGFjY2Vzcy4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdG9yIGFsbG93cyBmb3IgZWFzeSwgYXJyYXktc3R5bGUsIGRhdGEgYWNjZXNzLgorICAgICAgICogIE5vdGUgdGhhdCBkYXRhIGFjY2VzcyB3aXRoIHRoaXMgb3BlcmF0b3IgaXMgdW5jaGVja2VkIGFuZAorICAgICAgICogIG91dF9vZl9yYW5nZSBsb29rdXBzIGFyZSBub3QgZGVmaW5lZC4gKEZvciBjaGVja2VkIGxvb2t1cHMKKyAgICAgICAqICBzZWUgYXQoKS4pICBVbnNoYXJlcyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fcG9zKQorICAgICAgeworICAgICAgICAvLyBhbGxvdyBwb3MgPT0gc2l6ZSgpIGFzIHYzIGV4dGVuc2lvbjoKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19wb3MgPD0gdGhpcy0+c2l6ZSgpKTsKKyAgICAgICAgLy8gYnV0IGJlIHN0cmljdCBpbiBwZWRhbnRpYyBtb2RlOgorCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfX3BvcyA8IHRoaXMtPnNpemUoKSk7CisJdGhpcy0+X01fbGVhaygpOworCXJldHVybiB0aGlzLT5fTV9kYXRhKClbX19wb3NdOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fbiBUaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB0byBhY2Nlc3MuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC1vbmx5IChjb25zdCkgcmVmZXJlbmNlIHRvIHRoZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19uIGlzIGFuIGludmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIHNhZmVyIGRhdGEgYWNjZXNzLiAgVGhlIHBhcmFtZXRlcgorICAgICAgICogIGlzIGZpcnN0IGNoZWNrZWQgdGhhdCBpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIHN0cmluZy4gIFRoZQorICAgICAgICogIGZ1bmN0aW9uIHRocm93cyBvdXRfb2ZfcmFuZ2UgaWYgdGhlIGNoZWNrIGZhaWxzLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJaWYgKF9fbiA+PSB0aGlzLT5zaXplKCkpCisJICBzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiX192ZXJzYV9zdHJpbmc6OmF0IikpOworCXJldHVybiB0aGlzLT5fTV9kYXRhKClbX19uXTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX24gVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdG8gYWNjZXNzLgorICAgICAgICogIEByZXR1cm4gIFJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19uIGlzIGFuIGludmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIHNhZmVyIGRhdGEgYWNjZXNzLiAgVGhlIHBhcmFtZXRlcgorICAgICAgICogIGlzIGZpcnN0IGNoZWNrZWQgdGhhdCBpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIHN0cmluZy4gIFRoZQorICAgICAgICogIGZ1bmN0aW9uIHRocm93cyBvdXRfb2ZfcmFuZ2UgaWYgdGhlIGNoZWNrIGZhaWxzLiAgU3VjY2VzcworICAgICAgICogIHJlc3VsdHMgaW4gdW5zaGFyaW5nIHRoZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlpZiAoX19uID49IHRoaXMtPnNpemUoKSkKKwkgIHN0ZDo6X190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJfX3ZlcnNhX3N0cmluZzo6YXQiKSk7CisJdGhpcy0+X01fbGVhaygpOworCXJldHVybiB0aGlzLT5fTV9kYXRhKClbX19uXTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlc3RyaW5nLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGZyb250KCkKKyAgICAgIHsgcmV0dXJuIG9wZXJhdG9yW10oMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlc3RyaW5nLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG9wZXJhdG9yW10oMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBiYWNrKCkKKyAgICAgIHsgcmV0dXJuIG9wZXJhdG9yW10odGhpcy0+c2l6ZSgpIC0gMSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUKKyAgICAgICAqICBsYXN0IGVsZW1lbnQgb2YgdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7IHJldHVybiBvcGVyYXRvcltdKHRoaXMtPnNpemUoKSAtIDEpOyB9CisjZW5kaWYKKworICAgICAgLy8gTW9kaWZpZXJzOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBzdHJpbmcgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBUaGUgc3RyaW5nIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgb3BlcmF0b3IrPShjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIpCisgICAgICB7IHJldHVybiB0aGlzLT5hcHBlbmQoX19zdHIpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIEMgc3RyaW5nIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgb3BlcmF0b3IrPShjb25zdCBfQ2hhclQqIF9fcykKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFwcGVuZChfX3MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBvcGVyYXRvcis9KF9DaGFyVCBfX2MpCisgICAgICB7IAorCXRoaXMtPnB1c2hfYmFjayhfX2MpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGFuIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19sICBUaGUgaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIGJlIGFwcGVuZGVkLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBvcGVyYXRvcis9KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFwcGVuZChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgc3RyaW5nIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGFwcGVuZChjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIpCisgICAgICB7IHJldHVybiBfTV9hcHBlbmQoX19zdHIuX01fZGF0YSgpLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byBhcHBlbmQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHN0ciB0byBhcHBlbmQuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSBpZiBAYSBwb3MgaXMgbm90IGEgdmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXBwZW5kcyBAYSBfX24gY2hhcmFjdGVycyBmcm9tIEBhIF9fc3RyCisgICAgICAgKiAgc3RhcnRpbmcgYXQgQGEgX19wb3MgdG8gdGhpcyBzdHJpbmcuICBJZiBAYSBfX24gaXMgaXMgbGFyZ2VyCisgICAgICAgKiAgdGhhbiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjaGFyYWN0ZXJzIGluIEBhIF9fc3RyLCB0aGUKKyAgICAgICAqICByZW1haW5kZXIgb2YgQGEgX19zdHIgaXMgYXBwZW5kZWQuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgYXBwZW5kKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gX01fYXBwZW5kKF9fc3RyLl9NX2RhdGEoKQorCQkJICsgX19zdHIuX01fY2hlY2soX19wb3MsICJfX3ZlcnNhX3N0cmluZzo6YXBwZW5kIiksCisJCQkgX19zdHIuX01fbGltaXQoX19wb3MsIF9fbikpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIEMgc3RyaW5nIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcGFyYW0gX19uICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworCV9NX2NoZWNrX2xlbmd0aChzaXplX3R5cGUoMCksIF9fbiwgIl9fdmVyc2Ffc3RyaW5nOjphcHBlbmQiKTsKKwlyZXR1cm4gX01fYXBwZW5kKF9fcywgX19uKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBUaGUgQyBzdHJpbmcgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCWNvbnN0IHNpemVfdHlwZSBfX24gPSB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcyk7CisJX01fY2hlY2tfbGVuZ3RoKHNpemVfdHlwZSgwKSwgX19uLCAiX192ZXJzYV9zdHJpbmc6OmFwcGVuZCIpOworCXJldHVybiBfTV9hcHBlbmQoX19zLCBfX24pOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX24gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBhcHBlbmQuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXJhY3RlciB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBBcHBlbmRzIG4gY29waWVzIG9mIGMgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgYXBwZW5kKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7IHJldHVybiBfTV9yZXBsYWNlX2F1eCh0aGlzLT5zaXplKCksIHNpemVfdHlwZSgwKSwgX19uLCBfX2MpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhbiBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fbCAgVGhlIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGFwcGVuZChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wpCisgICAgICB7IHJldHVybiB0aGlzLT5hcHBlbmQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIHJhbmdlIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fZmlyc3QgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gYXBwZW5kLgorICAgICAgICogIEBwYXJhbSBfX2xhc3QgIEl0ZXJhdG9yIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBBcHBlbmRzIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtmaXJzdCxsYXN0KSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgICBhcHBlbmQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IHJldHVybiB0aGlzLT5yZXBsYWNlKF9NX2llbmQoKSwgX01faWVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgc2luZ2xlIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gYXBwZW5kLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2soX0NoYXJUIF9fYykKKyAgICAgIHsgCisJY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKwlpZiAoX19zaXplICsgMSA+IHRoaXMtPmNhcGFjaXR5KCkgfHwgdGhpcy0+X01faXNfc2hhcmVkKCkpCisJICB0aGlzLT5fTV9tdXRhdGUoX19zaXplLCBzaXplX3R5cGUoMCksIDAsIHNpemVfdHlwZSgxKSk7CisJdHJhaXRzX3R5cGU6OmFzc2lnbih0aGlzLT5fTV9kYXRhKClbX19zaXplXSwgX19jKTsKKwl0aGlzLT5fTV9zZXRfbGVuZ3RoKF9fc2l6ZSArIDEpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBjb250ZW50cyBvZiBhbm90aGVyIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgYXNzaWduKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0cikKKyAgICAgIHsKKwl0aGlzLT5fTV9hc3NpZ24oX19zdHIpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGNvbnRlbnRzIG9mIGFub3RoZXIgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIFNvdXJjZSBzdHJpbmcgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoaXMgc3RyaW5nIHRvIHRoZSBleGFjdCBjb250ZW50cyBvZiBAYSBfX3N0ci4KKyAgICAgICAqICBAYSBfX3N0ciBpcyBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGFzc2lnbihfX3ZlcnNhX3N0cmluZyYmIF9fc3RyKQorICAgICAgeworCXRoaXMtPnN3YXAoX19zdHIpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBhIHN1YnN0cmluZyBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFRoZSBzdHJpbmcgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBzdHIuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlIGlmIEBhIF9fcG9zIGlzIG5vdCBhIHZhbGlkIGluZGV4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhpcyBzdHJpbmcgdG8gdGhlIHN1YnN0cmluZyBvZiBAYSBfX3N0cgorICAgICAgICogIGNvbnNpc3Rpbmcgb2YgQGEgX19uIGNoYXJhY3RlcnMgYXQgQGEgX19wb3MuICBJZiBAYSBfX24gaXMKKyAgICAgICAqICBpcyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjaGFyYWN0ZXJzIGluIEBhCisgICAgICAgKiAgX19zdHIsIHRoZSByZW1haW5kZXIgb2YgQGEgX19zdHIgaXMgdXNlZC4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhc3NpZ24oY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgICAgICB7IHJldHVybiBfTV9yZXBsYWNlKHNpemVfdHlwZSgwKSwgdGhpcy0+c2l6ZSgpLCBfX3N0ci5fTV9kYXRhKCkKKwkJCSAgKyBfX3N0ci5fTV9jaGVjayhfX3BvcywgIl9fdmVyc2Ffc3RyaW5nOjphc3NpZ24iKSwKKwkJCSAgX19zdHIuX01fbGltaXQoX19wb3MsIF9fbikpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGEgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIEMgc3RyaW5nIHRvIHVzZS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHZhbHVlIG9mIHRoaXMgc3RyaW5nIHRvIHRoZSBmaXJzdCBAYQorICAgICAgICogIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcy4gIElmIEBhIF9fbiBpcyBpcyBsYXJnZXIgdGhhbiB0aGUKKyAgICAgICAqICBudW1iZXIgb2YgYXZhaWxhYmxlIGNoYXJhY3RlcnMgaW4gQGEgX19zLCB0aGUgcmVtYWluZGVyIG9mCisgICAgICAgKiAgQGEgX19zIGlzIHVzZWQuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgYXNzaWduKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKwlyZXR1cm4gX01fcmVwbGFjZShzaXplX3R5cGUoMCksIHRoaXMtPnNpemUoKSwgX19zLCBfX24pOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBjb250ZW50cyBvZiBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBDIHN0cmluZyB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHZhbHVlIG9mIHRoaXMgc3RyaW5nIHRvIHRoZSB2YWx1ZSBvZgorICAgICAgICogIEBhIF9fcy4gIFRoZSBkYXRhIGlzIGNvcGllZCwgc28gdGhlcmUgaXMgbm8gZGVwZW5kZW5jZSBvbiBAYQorICAgICAgICogIF9fcyBvbmNlIHRoZSBmdW5jdGlvbiByZXR1cm5zLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcykKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIF9NX3JlcGxhY2Uoc2l6ZV90eXBlKDApLCB0aGlzLT5zaXplKCksIF9fcywKKwkJCSAgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gbXVsdGlwbGUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19uICBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXJhY3RlciB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHZhbHVlIG9mIHRoaXMgc3RyaW5nIHRvIEBhIF9fbiBjb3BpZXMgb2YKKyAgICAgICAqICBjaGFyYWN0ZXIgQGEgX19jLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGFzc2lnbihzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgICAgeyByZXR1cm4gX01fcmVwbGFjZV9hdXgoc2l6ZV90eXBlKDApLCB0aGlzLT5zaXplKCksIF9fbiwgX19jKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBhIHJhbmdlIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fZmlyc3QgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gYXBwZW5kLgorICAgICAgICogIEBwYXJhbSBfX2xhc3QgIEl0ZXJhdG9yIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBTZXRzIHZhbHVlIG9mIHN0cmluZyB0byBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZQorICAgICAgICogIFtmaXJzdCxsYXN0KS4KKyAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX01faWJlZ2luKCksIF9NX2llbmQoKSwgX19maXJzdCwgX19sYXN0KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gYW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX2wgIFRoZSBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMgdG8gYXNzaWduLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhc3NpZ24oc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYgLy8gQysrMTEKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgbXVsdGlwbGUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19wICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydAorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gaW5zZXJ0LgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRzIEBhIF9fbiBjb3BpZXMgb2YgY2hhcmFjdGVyIEBhIF9fYyBzdGFydGluZyBhdCB0aGUKKyAgICAgICAqICBwb3NpdGlvbiByZWZlcmVuY2VkIGJ5IGl0ZXJhdG9yIEBhIF9fcC4gIElmIGFkZGluZworICAgICAgICogIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksCisgICAgICAgKiAgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7CXRoaXMtPnJlcGxhY2UoX19wLCBfX3AsIF9fbiwgX19jKTsgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgYSByYW5nZSBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX3AgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGxvY2F0aW9uIGluIHN0cmluZyB0byBpbnNlcnQgYXQuCisgICAgICAgKiAgQHBhcmFtIF9fYmVnICBTdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19lbmQgIEVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyBjaGFyYWN0ZXJzIGluIHJhbmdlIFtiZWcsZW5kKS4gIElmIGFkZGluZyBjaGFyYWN0ZXJzCisgICAgICAgKiAgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcworICAgICAgICogIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yCisgICAgICAgKiAgaXMgdGhyb3duLgorICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXJhdG9yIF9fYmVnLCBfSW5wdXRJdGVyYXRvciBfX2VuZCkKKyAgICAgICAgeyB0aGlzLT5yZXBsYWNlKF9fcCwgX19wLCBfX2JlZywgX19lbmQpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBhbiBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fcCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbG9jYXRpb24gaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gX19sICBUaGUgaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeyB0aGlzLT5pbnNlcnQoX19wLCBfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IHZhbHVlIG9mIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvczEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGxvY2F0aW9uIGluIHN0cmluZyB0byBpbnNlcnQgYXQuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBUaGUgc3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIEluc2VydHMgdmFsdWUgb2YgQGEgX19zdHIgc3RhcnRpbmcgYXQgQGEgX19wb3MxLiAgSWYgYWRkaW5nCisgICAgICAgKiAgY2hhcmFjdGVycyBjYXVzZXMgdGhlIGxlbmd0aCB0byBleGNlZWQgbWF4X3NpemUoKSwKKyAgICAgICAqICBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndAorICAgICAgICogIGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zMSwgY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyKQorICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfX3BvczEsIHNpemVfdHlwZSgwKSwKKwkJCSAgICAgX19zdHIuX01fZGF0YSgpLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGEgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvczEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGxvY2F0aW9uIGluIHN0cmluZyB0byBpbnNlcnQgYXQuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBUaGUgc3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MyICBTdGFydCBvZiBjaGFyYWN0ZXJzIGluIHN0ciB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX3BvczEgPiBzaXplKCkgb3IKKyAgICAgICAqICBAYSBfX3BvczIgPiBAYSBfX3N0ci5zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGF0IEBhIF9fcG9zMSwgaW5zZXJ0IEBhIF9fbiBjaGFyYWN0ZXIgb2YgQGEgX19zdHIKKyAgICAgICAqICBiZWdpbm5pbmcgd2l0aCBAYSBfX3BvczIuICBJZiBhZGRpbmcgY2hhcmFjdGVycyBjYXVzZXMgdGhlCisgICAgICAgKiAgbGVuZ3RoIHRvIGV4Y2VlZCBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgSWYgQGEKKyAgICAgICAqICBfX3BvczEgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhpcyBzdHJpbmcgb3IgQGEgX19wb3MyIGlzCisgICAgICAgKiAgYmV5b25kIHRoZSBlbmQgb2YgQGEgX19zdHIsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBUaGUKKyAgICAgICAqICB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGluc2VydChzaXplX3R5cGUgX19wb3MxLCBjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsCisJICAgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfX3BvczEsIHNpemVfdHlwZSgwKSwgX19zdHIuX01fZGF0YSgpCisJCQkgICAgICsgX19zdHIuX01fY2hlY2soX19wb3MyLCAiX192ZXJzYV9zdHJpbmc6Omluc2VydCIpLAorCQkJICAgICBfX3N0ci5fTV9saW1pdChfX3BvczIsIF9fbikpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGEgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBDIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhpcworICAgICAgICogIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyB0aGUgZmlyc3QgQGEgX19uIGNoYXJhY3RlcnMgb2YgQGEgX19zIHN0YXJ0aW5nIGF0IEBhCisgICAgICAgKiAgX19wb3MuICBJZiBhZGRpbmcgY2hhcmFjdGVycyBjYXVzZXMgdGhlIGxlbmd0aCB0byBleGNlZWQKKyAgICAgICAqICBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgSWYgQGEgX19wb3MgaXMgYmV5b25kCisgICAgICAgKiAgZW5kKCksIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZworICAgICAgICogIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfX3Bvcywgc2l6ZV90eXBlKDApLCBfX3MsIF9fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGxvY2F0aW9uIGluIHN0cmluZyB0byBpbnNlcnQgYXQuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIEMgc3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhpcworICAgICAgICogIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyB0aGUgZmlyc3QgQGEgX19uIGNoYXJhY3RlcnMgb2YgQGEgX19zIHN0YXJ0aW5nIGF0IEBhCisgICAgICAgKiAgX19wb3MuICBJZiBhZGRpbmcgY2hhcmFjdGVycyBjYXVzZXMgdGhlIGxlbmd0aCB0byBleGNlZWQKKyAgICAgICAqICBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgSWYgQGEgX19wb3MgaXMgYmV5b25kCisgICAgICAgKiAgZW5kKCksIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZworICAgICAgICogIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX3Bvcywgc2l6ZV90eXBlKDApLCBfX3MsCisJCQkgICAgIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IG11bHRpcGxlIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydAorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX3BvcyBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGlzCisgICAgICAgKiAgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRzIEBhIF9fbiBjb3BpZXMgb2YgY2hhcmFjdGVyIEBhIF9fYyBzdGFydGluZyBhdCBpbmRleAorICAgICAgICogIEBhIF9fcG9zLiAgSWYgYWRkaW5nIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkCisgICAgICAgKiAgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIElmIEBhIF9fcG9zID4gbGVuZ3RoKCksCisgICAgICAgKiAgb3V0X29mX3JhbmdlIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgaW5zZXJ0KHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICAgIHsgcmV0dXJuIF9NX3JlcGxhY2VfYXV4KF9NX2NoZWNrKF9fcG9zLCAiX192ZXJzYV9zdHJpbmc6Omluc2VydCIpLAorCQkJICAgICAgc2l6ZV90eXBlKDApLCBfX24sIF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgb25lIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19wICBJdGVyYXRvciByZWZlcmVuY2luZyBwb3NpdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIG5ld2x5IGluc2VydGVkIGNoYXIuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIEluc2VydHMgY2hhcmFjdGVyIEBhIF9fYyBhdCBwb3NpdGlvbiByZWZlcmVuY2VkIGJ5IEBhIF9fcC4KKyAgICAgICAqICBJZiBhZGRpbmcgY2hhcmFjdGVyIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZCBtYXhfc2l6ZSgpLAorICAgICAgICogIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBJZiBAYSBfX3AgaXMgYmV5b25kIGVuZCBvZiBzdHJpbmcsCisgICAgICAgKiAgb3V0X29mX3JhbmdlIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wLCBfQ2hhclQgX19jKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfX3AgPj0gX01faWJlZ2luKCkgJiYgX19wIDw9IF9NX2llbmQoKSk7CisJY29uc3Qgc2l6ZV90eXBlIF9fcG9zID0gX19wIC0gX01faWJlZ2luKCk7CisJX01fcmVwbGFjZV9hdXgoX19wb3MsIHNpemVfdHlwZSgwKSwgc2l6ZV90eXBlKDEpLCBfX2MpOworCXRoaXMtPl9NX3NldF9sZWFrZWQoKTsKKwlyZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpICsgX19wb3MpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIHJlbW92ZSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgKGRlZmF1bHQgcmVtYWluZGVyKS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhpcworICAgICAgICogIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyBAYSBfX24gY2hhcmFjdGVycyBmcm9tIHRoaXMgc3RyaW5nIHN0YXJ0aW5nIGF0IEBhCisgICAgICAgKiAgX19wb3MuICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaXMgcmVkdWNlZCBieSBAYSBfX24uICBJZgorICAgICAgICogIHRoZXJlIGFyZSA8IEBhIF9fbiBjaGFyYWN0ZXJzIHRvIHJlbW92ZSwgdGhlIHJlbWFpbmRlciBvZgorICAgICAgICogIHRoZSBzdHJpbmcgaXMgdHJ1bmNhdGVkLiAgSWYgQGEgX19wIGlzIGJleW9uZCBlbmQgb2Ygc3RyaW5nLAorICAgICAgICogIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0CisgICAgICAgKiAgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGVyYXNlKHNpemVfdHlwZSBfX3BvcyA9IDAsIHNpemVfdHlwZSBfX24gPSBucG9zKQorICAgICAgeyAKKwl0aGlzLT5fTV9lcmFzZShfTV9jaGVjayhfX3BvcywgIl9fdmVyc2Ffc3RyaW5nOjplcmFzZSIpLAorCQkgICAgICAgX01fbGltaXQoX19wb3MsIF9fbikpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgb25lIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19wb3NpdGlvbiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGNoYXJhY3RlciB0byByZW1vdmUuCisgICAgICAgKiAgQHJldHVybiAgaXRlcmF0b3IgcmVmZXJlbmNpbmcgc2FtZSBsb2NhdGlvbiBhZnRlciByZW1vdmFsLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXIgYXQgQGEgX19wb3NpdGlvbiBmcm9tIHRoaXMgc3RyaW5nLiBUaGUKKyAgICAgICAqICB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX19wb3NpdGlvbiA+PSBfTV9pYmVnaW4oKQorCQkJCSAmJiBfX3Bvc2l0aW9uIDwgX01faWVuZCgpKTsKKwljb25zdCBzaXplX3R5cGUgX19wb3MgPSBfX3Bvc2l0aW9uIC0gX01faWJlZ2luKCk7CisJdGhpcy0+X01fZXJhc2UoX19wb3MsIHNpemVfdHlwZSgxKSk7CisJdGhpcy0+X01fc2V0X2xlYWtlZCgpOworCXJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9kYXRhKCkgKyBfX3Bvcyk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19maXJzdCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGZpcnN0IGNoYXJhY3RlciB0byByZW1vdmUuCisgICAgICAgKiAgQHBhcmFtIF9fbGFzdCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbG9jYXRpb24gb2YgZmlyc3QgYWZ0ZXIgcmVtb3ZhbC4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIGZyb20gdGhpcworICAgICAgICogIHN0cmluZy4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yCisgICAgICAgKiAgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9fZmlyc3QgPj0gX01faWJlZ2luKCkgJiYgX19maXJzdCA8PSBfX2xhc3QKKwkJCQkgJiYgX19sYXN0IDw9IF9NX2llbmQoKSk7CisgICAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3BvcyA9IF9fZmlyc3QgLSBfTV9pYmVnaW4oKTsKKwl0aGlzLT5fTV9lcmFzZShfX3BvcywgX19sYXN0IC0gX19maXJzdCk7CisJdGhpcy0+X01fc2V0X2xlYWtlZCgpOworCXJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9kYXRhKCkgKyBfX3Bvcyk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSB0aGUgbGFzdCBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIFRoZSBzdHJpbmcgbXVzdCBiZSBub24tZW1wdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBvcF9iYWNrKCkKKyAgICAgIHsgdGhpcy0+X01fZXJhc2Uoc2l6ZSgpLTEsIDEpOyB9CisjZW5kaWYgLy8gQysrMTEKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIGNoYXJhY3RlcnMgd2l0aCB2YWx1ZSBmcm9tIGFub3RoZXIgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVwbGFjZWQuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX3BvcyBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGlzCisgICAgICAgKiAgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbcG9zLHBvcytuKSBmcm9tIHRoaXMKKyAgICAgICAqICBzdHJpbmcuICBJbiBwbGFjZSwgdGhlIHZhbHVlIG9mIEBhIF9fc3RyIGlzIGluc2VydGVkLiAgSWYgQGEKKyAgICAgICAqICBfX3BvcyBpcyBiZXlvbmQgZW5kIG9mIHN0cmluZywgb3V0X29mX3JhbmdlIGlzIHRocm93bi4gIElmCisgICAgICAgKiAgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzCisgICAgICAgKiAgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IKKyAgICAgICAqICBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyKQorICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfX3BvcywgX19uLCBfX3N0ci5fTV9kYXRhKCksIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIGNoYXJhY3RlcnMgd2l0aCB2YWx1ZSBmcm9tIGFub3RoZXIgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvczEgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX24xICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZXBsYWNlZC4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMiAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN0ciB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtIF9fbjIgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gc3RyIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MxID4gc2l6ZSgpIG9yIEBhIF9fcG9zMiA+CisgICAgICAgKiAgc3RyLnNpemUoKS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW3BvczEscG9zMSArIG4pIGZyb20KKyAgICAgICAqICB0aGlzIHN0cmluZy4gIEluIHBsYWNlLCB0aGUgdmFsdWUgb2YgQGEgX19zdHIgaXMgaW5zZXJ0ZWQuCisgICAgICAgKiAgSWYgQGEgX19wb3MgaXMgYmV5b25kIGVuZCBvZiBzdHJpbmcsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uCisgICAgICAgKiAgSWYgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yCisgICAgICAgKiAgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4KKyAgICAgICAqICBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsCisJICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpCisgICAgICB7CisJcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19wb3MxLCBfX24xLCBfX3N0ci5fTV9kYXRhKCkKKwkJCSAgICAgKyBfX3N0ci5fTV9jaGVjayhfX3BvczIsCisJCQkJCSAgICAgICJfX3ZlcnNhX3N0cmluZzo6cmVwbGFjZSIpLAorCQkJICAgICBfX3N0ci5fTV9saW1pdChfX3BvczIsIF9fbjIpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIGNoYXJhY3RlcnMgd2l0aCB2YWx1ZSBvZiBhIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19uMiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBAYSBfX3MgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX3BvczEgPiBzaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtwb3MscG9zICsgbjEpIGZyb20gdGhpcworICAgICAgICogIHN0cmluZy4gIEluIHBsYWNlLCB0aGUgZmlyc3QgQGEgX19uMiBjaGFyYWN0ZXJzIG9mIEBhIF9fcworICAgICAgICogIGFyZSBpbnNlcnRlZCwgb3IgYWxsIG9mIEBhIF9fcyBpZiBAYSBfX24yIGlzIHRvbyBsYXJnZS4gIElmCisgICAgICAgKiAgQGEgX19wb3MgaXMgYmV5b25kIGVuZCBvZiBzdHJpbmcsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uCisgICAgICAgKiAgSWYgdGhlIGxlbmd0aCBvZiByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMKKyAgICAgICAqICB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvcgorICAgICAgICogIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgICAgc2l6ZV90eXBlIF9fbjIpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24yKTsKKwlyZXR1cm4gX01fcmVwbGFjZShfTV9jaGVjayhfX3BvcywgIl9fdmVyc2Ffc3RyaW5nOjpyZXBsYWNlIiksCisJCQkgIF9NX2xpbWl0KF9fcG9zLCBfX24xKSwgX19zLCBfX24yKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIGNoYXJhY3RlcnMgd2l0aCB2YWx1ZSBvZiBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgPiBzaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtwb3MscG9zICsgbjEpIGZyb20gdGhpcworICAgICAgICogIHN0cmluZy4gIEluIHBsYWNlLCB0aGUgY2hhcmFjdGVycyBvZiBAYSBfX3MgYXJlIGluc2VydGVkLiAgSWYKKyAgICAgICAqICBAYSBwb3MgaXMgYmV5b25kIGVuZCBvZiBzdHJpbmcsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBJZgorICAgICAgICogIHRoZSBsZW5ndGggb2YgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIAorICAgICAgICogIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9fcG9zLCBfX24xLCBfX3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSBjaGFyYWN0ZXJzIHdpdGggbXVsdGlwbGUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX24xICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZXBsYWNlZC4KKyAgICAgICAqICBAcGFyYW0gX19uMiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zID4gc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbcG9zLHBvcyArIG4xKSBmcm9tIHRoaXMKKyAgICAgICAqICBzdHJpbmcuICBJbiBwbGFjZSwgQGEgX19uMiBjb3BpZXMgb2YgQGEgX19jIGFyZSBpbnNlcnRlZC4KKyAgICAgICAqICBJZiBAYSBfX3BvcyBpcyBiZXlvbmQgZW5kIG9mIHN0cmluZywgb3V0X29mX3JhbmdlIGlzIHRocm93bi4KKyAgICAgICAqICBJZiB0aGUgbGVuZ3RoIG9mIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcworICAgICAgICogIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yCisgICAgICAgKiAgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMiwgX0NoYXJUIF9fYykKKyAgICAgIHsgcmV0dXJuIF9NX3JlcGxhY2VfYXV4KF9NX2NoZWNrKF9fcG9zLCAiX192ZXJzYV9zdHJpbmc6OnJlcGxhY2UiKSwKKwkJCSAgICAgIF9NX2xpbWl0KF9fcG9zLCBfX24xKSwgX19uMiwgX19jKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19pMSAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgc3RhcnQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19pMiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgZW5kIG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgdmFsdWUgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW2kxLGkyKS4gIEluIHBsYWNlLCB0aGUKKyAgICAgICAqICB2YWx1ZSBvZiBAYSBfX3N0ciBpcyBpbnNlcnRlZC4gIElmIHRoZSBsZW5ndGggb2YgcmVzdWx0CisgICAgICAgKiAgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mCisgICAgICAgKiAgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0cikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSwgX19pMiwgX19zdHIuX01fZGF0YSgpLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSByYW5nZSBvZiBjaGFyYWN0ZXJzIHdpdGggQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9faTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9faTIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHZhbHVlIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHMgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW2kxLGkyKS4gIEluIHBsYWNlLCB0aGUKKyAgICAgICAqICBmaXJzdCBAYSBuIGNoYXJhY3RlcnMgb2YgQGEgX19zIGFyZSBpbnNlcnRlZC4gIElmIHRoZSBsZW5ndGgKKyAgICAgICAqICBvZiByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlCisgICAgICAgKiAgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSAtIF9NX2liZWdpbigpLCBfX2kyIC0gX19pMSwgX19zLCBfX24pOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX2kxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2kyICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB2YWx1ZSB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbaTEsaTIpLiAgSW4gcGxhY2UsIHRoZQorICAgICAgICogIGNoYXJhY3RlcnMgb2YgQGEgX19zIGFyZSBpbnNlcnRlZC4gIElmIHRoZSBsZW5ndGggb2YgcmVzdWx0CisgICAgICAgKiAgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mCisgICAgICAgKiAgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGNvbnN0IF9DaGFyVCogX19zKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxLCBfX2kyLCBfX3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSByYW5nZSBvZiBjaGFyYWN0ZXJzIHdpdGggbXVsdGlwbGUgY2hhcmFjdGVycworICAgICAgICogIEBwYXJhbSBfX2kxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2kyICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtpMSxpMikuICBJbiBwbGFjZSwgQGEKKyAgICAgICAqICBfX24gY29waWVzIG9mIEBhIF9fYyBhcmUgaW5zZXJ0ZWQuICBJZiB0aGUgbGVuZ3RoIG9mIHJlc3VsdAorICAgICAgICogIGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZgorICAgICAgICogIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJcmV0dXJuIF9NX3JlcGxhY2VfYXV4KF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsIF9fbiwgX19jKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aCByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19pMSAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgc3RhcnQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19pMiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgZW5kIG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fazEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19rMiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgZW5kIG9mIHJhbmdlIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtpMSxpMikuICBJbiBwbGFjZSwKKyAgICAgICAqICBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbazEsazIpIGFyZSBpbnNlcnRlZC4gIElmIHRoZSBsZW5ndGgKKyAgICAgICAqICBvZiByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlCisgICAgICAgKiAgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorICAgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLAorCQlfSW5wdXRJdGVyYXRvciBfX2sxLCBfSW5wdXRJdGVyYXRvciBfX2syKQorICAgICAgICB7CisJICBfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgICAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19rMSwgX19rMik7CisJICByZXR1cm4gdGhpcy0+X01fcmVwbGFjZV9kaXNwYXRjaChfX2kxLCBfX2kyLCBfX2sxLCBfX2syLAorCQkJCQkgICBzdGQ6Ol9fZmFsc2VfdHlwZSgpKTsKKwl9CisjZWxzZQorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsCisJCV9JbnB1dEl0ZXJhdG9yIF9fazEsIF9JbnB1dEl0ZXJhdG9yIF9fazIpCisgICAgICAgIHsKKwkgIF9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAgICYmIF9faTIgPD0gX01faWVuZCgpKTsKKwkgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2sxLCBfX2syKTsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgcmV0dXJuIHRoaXMtPl9NX3JlcGxhY2VfZGlzcGF0Y2goX19pMSwgX19pMiwgX19rMSwgX19rMiwgX0ludGVncmFsKCkpOworCX0KKyNlbmRpZgorCisgICAgICAvLyBTcGVjaWFsaXphdGlvbnMgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBwb2ludGVyIGFuZCBpdGVyYXRvcjoKKyAgICAgIC8vIHVzZWZ1bCB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgdGVtcG9yYXJ5IGJ1ZmZlcmluZyBpbiBfTV9yZXBsYWNlLgorICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIF9DaGFyVCogX19rMSwgX0NoYXJUKiBfX2syKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fazEsIF9fazIpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsCisJCQkgICAgIF9fazEsIF9fazIgLSBfX2sxKTsKKyAgICAgIH0KKworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX2sxLCBjb25zdCBfQ2hhclQqIF9fazIpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9NX2liZWdpbigpIDw9IF9faTEgJiYgX19pMSA8PSBfX2kyCisJCQkJICYmIF9faTIgPD0gX01faWVuZCgpKTsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19rMSwgX19rMik7CisJcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSAtIF9NX2liZWdpbigpLCBfX2kyIC0gX19pMSwKKwkJCSAgICAgX19rMSwgX19rMiAtIF9fazEpOworICAgICAgfQorCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgaXRlcmF0b3IgX19rMSwgaXRlcmF0b3IgX19rMikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCV9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2sxLCBfX2syKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLAorCQkJICAgICBfX2sxLmJhc2UoKSwgX19rMiAtIF9fazEpOworICAgICAgfQorCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkgICAgICBjb25zdF9pdGVyYXRvciBfX2sxLCBjb25zdF9pdGVyYXRvciBfX2syKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fazEsIF9fazIpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsCisJCQkgICAgIF9fazEuYmFzZSgpLCBfX2syIC0gX19rMSk7CisgICAgICB9CisgICAgICAKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtIF9faTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9faTIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2wgIFRoZSBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW2kxLGkyKS4gIEluIHBsYWNlLAorICAgICAgICogIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtrMSxrMikgYXJlIGluc2VydGVkLiAgSWYgdGhlIGxlbmd0aAorICAgICAgICogIG9mIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUKKyAgICAgICAqICB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLAorCQkJICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxLCBfX2kyLCBfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0ludGVnZXI+CisJX192ZXJzYV9zdHJpbmcmCisJX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBfSW50ZWdlciBfX24sCisJCQkgICAgX0ludGVnZXIgX192YWwsIHN0ZDo6X190cnVlX3R5cGUpCisgICAgICAgIHsgcmV0dXJuIF9NX3JlcGxhY2VfYXV4KF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsIF9fbiwgX192YWwpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorCV9fdmVyc2Ffc3RyaW5nJgorCV9NX3JlcGxhY2VfZGlzcGF0Y2goaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgX0lucHV0SXRlcmF0b3IgX19rMSwKKwkJCSAgICBfSW5wdXRJdGVyYXRvciBfX2syLCBzdGQ6Ol9fZmFsc2VfdHlwZSk7CisKKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgX01fcmVwbGFjZV9hdXgoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yLAorCQkgICAgIF9DaGFyVCBfX2MpOworCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIF9NX3JlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19sZW4xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkJIGNvbnN0IHNpemVfdHlwZSBfX2xlbjIpOworCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIF9NX2FwcGVuZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbik7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29weSBzdWJzdHJpbmcgaW50byBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBjb3B5IHZhbHVlIGludG8uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29weS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byBjb3B5LgorICAgICAgICogIEByZXR1cm4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IGNvcGllZAorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIHBvcyA+IHNpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgQ29waWVzIHVwIHRvIEBhIF9fbiBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IEBhIF9fcG9zIGludG8gdGhlCisgICAgICAgKiAgQyBzdHJpbmcgQGEgcy4gIElmIEBhIF9fcG9zIGlzIGdyZWF0ZXIgdGhhbiBzaXplKCksCisgICAgICAgKiAgb3V0X29mX3JhbmdlIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvcHkoX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXAgY29udGVudHMgd2l0aCBhbm90aGVyIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBTdHJpbmcgdG8gc3dhcCB3aXRoLgorICAgICAgICoKKyAgICAgICAqICBFeGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RyaW5nIHdpdGggdGhhdCBvZiBAYSBfX3MgaW4KKyAgICAgICAqICBjb25zdGFudCB0aW1lLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoX192ZXJzYV9zdHJpbmcmIF9fcykKKyAgICAgIHsgdGhpcy0+X01fc3dhcChfX3MpOyB9CisKKyAgICAgIC8vIFN0cmluZyBvcGVyYXRpb25zOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gY29uc3QgcG9pbnRlciB0byBudWxsLXRlcm1pbmF0ZWQgY29udGVudHMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSBoYW5kbGUgdG8gaW50ZXJuYWwgZGF0YS4gIERvIG5vdCBtb2RpZnkgb3IgZGlyZSB0aGluZ3MgbWF5CisgICAgICAgKiAgaGFwcGVuLgorICAgICAgKi8KKyAgICAgIGNvbnN0IF9DaGFyVCoKKyAgICAgIGNfc3RyKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2RhdGEoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBjb25zdCBwb2ludGVyIHRvIGNvbnRlbnRzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgaGFuZGxlIHRvIGludGVybmFsIGRhdGEuICBEbyBub3QgbW9kaWZ5IG9yIGRpcmUgdGhpbmdzIG1heQorICAgICAgICogIGhhcHBlbi4KKyAgICAgICovCisgICAgICBjb25zdCBfQ2hhclQqCisgICAgICBkYXRhKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2RhdGEoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBjb3B5IG9mIGFsbG9jYXRvciB1c2VkIHRvIGNvbnN0cnVjdCB0aGlzIHN0cmluZy4KKyAgICAgICovCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBhbGxvY2F0b3JfdHlwZSh0aGlzLT5fTV9nZXRfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIEBhIF9fcyB0byBzZWFyY2ggZm9yLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIHN0YXJ0IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIHRoZSBmaXJzdCBAYQorICAgICAgICogIF9fbiBjaGFyYWN0ZXJzIGluIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCBiZWdpbnMuICBJZiBub3QgZm91bmQsIHJldHVybnMKKyAgICAgICAqICBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBzdGFydCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciB2YWx1ZSBvZiBAYQorICAgICAgICogIF9fc3RyIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZQorICAgICAgICogIGl0IGJlZ2lucy4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZChjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisJX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZpbmQoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2Ygc3RhcnQgb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgdGhlIHZhbHVlIG9mIEBhCisgICAgICAgKiAgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZQorICAgICAgICogIGl0IGJlZ2lucy4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmZpbmQoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgQGEgX19jIHdpdGhpbgorICAgICAgICogIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcworICAgICAgICogIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIHN0YXJ0IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIHZhbHVlIG9mIEBhCisgICAgICAgKiAgX19zdHIgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlCisgICAgICAgKiAgaXQgYmVnaW5zLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICByZmluZChjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisJX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJmaW5kKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHMgdG8gc2VhcmNoIGZvci4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBzdGFydCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciB0aGUgZmlyc3QgQGEKKyAgICAgICAqICBfX24gY2hhcmFjdGVycyBpbiBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsCisgICAgICAgKiAgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgYmVnaW5zLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzdGFydCBzZWFyY2ggYXQgKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBzdGFydCBvZiAgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgdGhlIHZhbHVlIG9mCisgICAgICAgKiAgQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleAorICAgICAgICogIHdoZXJlIGl0IGJlZ2lucy4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgcmZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5yZmluZChfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBAYSBfX2Mgd2l0aGluCisgICAgICAgKiAgdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzCisgICAgICAgKiAgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHJmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgb2Ygc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3Igb25lIG9mIHRoZSBjaGFyYWN0ZXJzIG9mCisgICAgICAgKiAgQGEgX19zdHIgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcworICAgICAgICogIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X29mKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKwlfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZF9maXJzdF9vZihfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBvZiBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBTdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHMgdG8gc2VhcmNoIGZvci4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciBvbmUgb2YgdGhlCisgICAgICAgKiAgZmlyc3QgQGEgX19uIGNoYXJhY3RlcnMgb2YgQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmCisgICAgICAgKiAgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgb2YgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgU3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3Igb25lIG9mIHRoZQorICAgICAgICogIGNoYXJhY3RlcnMgb2YgQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmZpbmRfZmlyc3Rfb2YoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgdGhlIGNoYXJhY3RlcgorICAgICAgICogIEBhIF9fYyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXgKKyAgICAgICAqICB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogZXF1aXZhbGVudCB0byBmaW5kKGMsIHBvcykuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5maW5kKF9fYywgX19wb3MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG9mIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBvbmUgb2YgdGhlCisgICAgICAgKiAgY2hhcmFjdGVycyBvZiBAYSBfX3N0ciB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMKKyAgICAgICAqICBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X29mKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKwlfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZF9sYXN0X29mKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgb2YgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcyB0byBzZWFyY2ggZm9yLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIG9uZSBvZiB0aGUKKyAgICAgICAqICBmaXJzdCBAYSBfX24gY2hhcmFjdGVycyBvZiBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYKKyAgICAgICAqICBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLAorICAgICAgICogIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgb2YgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3Igb25lIG9mIHRoZQorICAgICAgICogIGNoYXJhY3RlcnMgb2YgQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+ZmluZF9sYXN0X29mKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIEBhIF9fYyB3aXRoaW4KKyAgICAgICAqICB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMKKyAgICAgICAqICBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiBlcXVpdmFsZW50IHRvIHJmaW5kKGMsIHBvcykuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2xhc3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJmaW5kKF9fYywgX19wb3MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBub3QgaW4gc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciBhIGNoYXJhY3RlciBub3QKKyAgICAgICAqICBjb250YWluZWQgaW4gQGEgX19zdHIgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMKKyAgICAgICAqICB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisJX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZpbmRfZmlyc3Rfbm90X29mKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG5vdCBpbiBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzIHRvIGNvbnNpZGVyLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIGEgY2hhcmFjdGVyIG5vdAorICAgICAgICogIGNvbnRhaW5lZCBpbiB0aGUgZmlyc3QgQGEgX19uIGNoYXJhY3RlcnMgb2YgQGEgX19zIHdpdGhpbgorICAgICAgICogIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcworICAgICAgICogIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLAorCQkJc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBub3QgaW4gQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIGEgY2hhcmFjdGVyIG5vdAorICAgICAgICogIGNvbnRhaW5lZCBpbiBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMKKyAgICAgICAqICB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmZpbmRfZmlyc3Rfbm90X29mKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGRpZmZlcmVudCBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIGEgY2hhcmFjdGVyCisgICAgICAgKiAgb3RoZXIgdGhhbiBAYSBfX2Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlCisgICAgICAgKiAgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorCV9HTElCQ1hYX05PRVhDRVBUOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBub3QgaW4gc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgYSBjaGFyYWN0ZXIKKyAgICAgICAqICBub3QgY29udGFpbmVkIGluIEBhIF9fc3RyIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLAorICAgICAgICogIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucworICAgICAgICogIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwKKwkJICAgICAgIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5maW5kX2xhc3Rfbm90X29mKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcyB0byBjb25zaWRlci4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBhIGNoYXJhY3RlcgorICAgICAgICogIG5vdCBjb250YWluZWQgaW4gdGhlIGZpcnN0IEBhIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcworICAgICAgICogIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdAorICAgICAgICogIHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLAorCQkgICAgICAgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBub3QgaW4gQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBhIGNoYXJhY3RlcgorICAgICAgICogIG5vdCBjb250YWluZWQgaW4gQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLAorICAgICAgICogIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucworICAgICAgICogIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+ZmluZF9sYXN0X25vdF9vZihfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGRpZmZlcmVudCBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBhIGNoYXJhY3RlcgorICAgICAgICogIG90aGVyIHRoYW4gQGEgX19jIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZQorICAgICAgICogIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorCV9HTElCQ1hYX05PRVhDRVBUOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEdldCBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBzdWJzdHJpbmcgKGRlZmF1bHQgcmVtYWluZGVyKS4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbmV3IHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBwb3MgPiBzaXplKCkuCisgICAgICAgKgorICAgICAgICogIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgbmV3IHN0cmluZyB1c2luZyB0aGUgQGEgX19uCisgICAgICAgKiAgY2hhcmFjdGVycyBzdGFydGluZyBhdCBAYSBfX3Bvcy4gIElmIHRoZSBzdHJpbmcgaXMgdG9vCisgICAgICAgKiAgc2hvcnQsIHVzZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBjaGFyYWN0ZXJzLiAgSWYgQGEgX19wb3MgaXMKKyAgICAgICAqICBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nCisgICAgICBzdWJzdHIoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9fdmVyc2Ffc3RyaW5nKCp0aGlzLCBfTV9jaGVjayhfX3BvcywgIl9fdmVyc2Ffc3RyaW5nOjpzdWJzdHIiKSwKKwkJCSAgICAgIF9fbik7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSB0byBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHJldHVybiAgSW50ZWdlciA8IDAsIDAsIG9yID4gMC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhbiBpbnRlZ2VyIDwgMCBpZiB0aGlzIHN0cmluZyBpcyBvcmRlcmVkIGJlZm9yZSBAYQorICAgICAgICogIF9fc3RyLCAwIGlmIHRoZWlyIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgb3IgPiAwIGlmIHRoaXMKKyAgICAgICAqICBzdHJpbmcgaXMgb3JkZXJlZCBhZnRlciBAYSBfX3N0ci4gIERldGVybWluZXMgdGhlIGVmZmVjdGl2ZQorICAgICAgICogIGxlbmd0aCBybGVuIG9mIHRoZSBzdHJpbmdzIHRvIGNvbXBhcmUgYXMgdGhlIHNtYWxsZXN0IG9mCisgICAgICAgKiAgc2l6ZSgpIGFuZCBzdHIuc2l6ZSgpLiAgVGhlIGZ1bmN0aW9uIHRoZW4gY29tcGFyZXMgdGhlIHR3bworICAgICAgICogIHN0cmluZ3MgYnkgY2FsbGluZyB0cmFpdHM6OmNvbXBhcmUoZGF0YSgpLCBzdHIuZGF0YSgpLHJsZW4pLgorICAgICAgICogIElmIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gaXMgbm9uemVybyByZXR1cm5zIGl0LAorICAgICAgICogIG90aGVyd2lzZSB0aGUgc2hvcnRlciBvbmUgaXMgb3JkZXJlZCBmaXJzdC4KKyAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyKSBjb25zdAorICAgICAgeworCWlmICh0aGlzLT5fTV9jb21wYXJlKF9fc3RyKSkKKwkgIHJldHVybiAwOworCisJY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKwljb25zdCBzaXplX3R5cGUgX19vc2l6ZSA9IF9fc3RyLnNpemUoKTsKKwljb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6Om1pbihfX3NpemUsIF9fb3NpemUpOworCisJaW50IF9fciA9IHRyYWl0c190eXBlOjpjb21wYXJlKHRoaXMtPl9NX2RhdGEoKSwgX19zdHIuZGF0YSgpLCBfX2xlbik7CisJaWYgKCFfX3IpCisJICBfX3IgPSB0aGlzLT5fU19jb21wYXJlKF9fc2l6ZSwgX19vc2l6ZSk7CisJcmV0dXJuIF9fcjsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb21wYXJlIHN1YnN0cmluZyB0byBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBvZiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcmV0dXJuICBJbnRlZ2VyIDwgMCwgMCwgb3IgPiAwLgorICAgICAgICoKKyAgICAgICAqICBGb3JtIHRoZSBzdWJzdHJpbmcgb2YgdGhpcyBzdHJpbmcgZnJvbSB0aGUgQGEgX19uIGNoYXJhY3RlcnMKKyAgICAgICAqICBzdGFydGluZyBhdCBAYSBfX3Bvcy4gIFJldHVybnMgYW4gaW50ZWdlciA8IDAgaWYgdGhlCisgICAgICAgKiAgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIEBhIF9fc3RyLCAwIGlmIHRoZWlyIHZhbHVlcyBhcmUKKyAgICAgICAqICBlcXVpdmFsZW50LCBvciA+IDAgaWYgdGhlIHN1YnN0cmluZyBpcyBvcmRlcmVkIGFmdGVyIEBhCisgICAgICAgKiAgX19zdHIuICBEZXRlcm1pbmVzIHRoZSBlZmZlY3RpdmUgbGVuZ3RoIHJsZW4gb2YgdGhlIHN0cmluZ3MKKyAgICAgICAqICB0byBjb21wYXJlIGFzIHRoZSBzbWFsbGVzdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBzdWJzdHJpbmcKKyAgICAgICAqICBhbmQgQGEgX19zdHIuc2l6ZSgpLiAgVGhlIGZ1bmN0aW9uIHRoZW4gY29tcGFyZXMgdGhlIHR3bworICAgICAgICogIHN0cmluZ3MgYnkgY2FsbGluZworICAgICAgICogIHRyYWl0czo6Y29tcGFyZShzdWJzdHJpbmcuZGF0YSgpLHN0ci5kYXRhKCkscmxlbikuICBJZiB0aGUKKyAgICAgICAqICByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gaXMgbm9uemVybyByZXR1cm5zIGl0LCBvdGhlcndpc2UKKyAgICAgICAqICB0aGUgc2hvcnRlciBvbmUgaXMgb3JkZXJlZCBmaXJzdC4KKyAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLAorCSAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0cikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSBzdWJzdHJpbmcgdG8gYSBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMSAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MyICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3Vic3RyaW5nIG9mIHN0ci4KKyAgICAgICAqICBAcGFyYW0gX19uMiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3Vic3RyaW5nIG9mIHN0ci4KKyAgICAgICAqICBAcmV0dXJuICBJbnRlZ2VyIDwgMCwgMCwgb3IgPiAwLgorICAgICAgICoKKyAgICAgICAqICBGb3JtIHRoZSBzdWJzdHJpbmcgb2YgdGhpcyBzdHJpbmcgZnJvbSB0aGUgQGEgX19uMQorICAgICAgICogIGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQgQGEgX19wb3MxLiAgRm9ybSB0aGUgc3Vic3RyaW5nIG9mIEBhCisgICAgICAgKiAgX19zdHIgZnJvbSB0aGUgQGEgX19uMiBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IEBhIF9fcG9zMi4KKyAgICAgICAqICBSZXR1cm5zIGFuIGludGVnZXIgPCAwIGlmIHRoaXMgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlCisgICAgICAgKiAgdGhlIHN1YnN0cmluZyBvZiBAYSBfX3N0ciwgMCBpZiB0aGVpciB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsCisgICAgICAgKiAgb3IgPiAwIGlmIHRoaXMgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYWZ0ZXIgdGhlIHN1YnN0cmluZyBvZgorICAgICAgICogIEBhIF9fc3RyLiAgRGV0ZXJtaW5lcyB0aGUgZWZmZWN0aXZlIGxlbmd0aCBybGVuIG9mIHRoZQorICAgICAgICogIHN0cmluZ3MgdG8gY29tcGFyZSBhcyB0aGUgc21hbGxlc3Qgb2YgdGhlIGxlbmd0aHMgb2YgdGhlCisgICAgICAgKiAgc3Vic3RyaW5ncy4gIFRoZSBmdW5jdGlvbiB0aGVuIGNvbXBhcmVzIHRoZSB0d28gc3RyaW5ncyBieQorICAgICAgICogIGNhbGxpbmcKKyAgICAgICAqICB0cmFpdHM6OmNvbXBhcmUoc3Vic3RyaW5nLmRhdGEoKSxzdHIuc3Vic3RyKHBvczIsbjIpLmRhdGEoKSxybGVuKS4KKyAgICAgICAqICBJZiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwKKyAgICAgICAqICBvdGhlcndpc2UgdGhlIHNob3J0ZXIgb25lIGlzIG9yZGVyZWQgZmlyc3QuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsCisJICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbXBhcmUgdG8gYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHJldHVybiAgSW50ZWdlciA8IDAsIDAsIG9yID4gMC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhbiBpbnRlZ2VyIDwgMCBpZiB0aGlzIHN0cmluZyBpcyBvcmRlcmVkIGJlZm9yZSBAYQorICAgICAgICogIF9fcywgMCBpZiB0aGVpciB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIG9yID4gMCBpZiB0aGlzIHN0cmluZworICAgICAgICogIGlzIG9yZGVyZWQgYWZ0ZXIgQGEgX19zLiAgRGV0ZXJtaW5lcyB0aGUgZWZmZWN0aXZlIGxlbmd0aAorICAgICAgICogIHJsZW4gb2YgdGhlIHN0cmluZ3MgdG8gY29tcGFyZSBhcyB0aGUgc21hbGxlc3Qgb2Ygc2l6ZSgpIGFuZAorICAgICAgICogIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcgY29uc3RydWN0ZWQgZnJvbSBAYSBfX3MuICBUaGUKKyAgICAgICAqICBmdW5jdGlvbiB0aGVuIGNvbXBhcmVzIHRoZSB0d28gc3RyaW5ncyBieSBjYWxsaW5nCisgICAgICAgKiAgdHJhaXRzOjpjb21wYXJlKGRhdGEoKSxzLHJsZW4pLiAgSWYgdGhlIHJlc3VsdCBvZiB0aGUKKyAgICAgICAqICBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwgb3RoZXJ3aXNlIHRoZSBzaG9ydGVyIG9uZQorICAgICAgICogIGlzIG9yZGVyZWQgZmlyc3QuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKGNvbnN0IF9DaGFyVCogX19zKSBjb25zdDsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNSBTdHJpbmc6OmNvbXBhcmUgc3BlY2lmaWNhdGlvbiBxdWVzdGlvbmFibGUKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSBzdWJzdHJpbmcgdG8gYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBvZiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHJldHVybiAgSW50ZWdlciA8IDAsIDAsIG9yID4gMC4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybSB0aGUgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIGZyb20gdGhlIEBhIF9fbjEKKyAgICAgICAqICBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IEBhIF9fcG9zLiAgUmV0dXJucyBhbiBpbnRlZ2VyIDwgMCBpZgorICAgICAgICogIHRoZSBzdWJzdHJpbmcgaXMgb3JkZXJlZCBiZWZvcmUgQGEgX19zLCAwIGlmIHRoZWlyIHZhbHVlcworICAgICAgICogIGFyZSBlcXVpdmFsZW50LCBvciA+IDAgaWYgdGhlIHN1YnN0cmluZyBpcyBvcmRlcmVkIGFmdGVyIEBhCisgICAgICAgKiAgX19zLiAgRGV0ZXJtaW5lcyB0aGUgZWZmZWN0aXZlIGxlbmd0aCBybGVuIG9mIHRoZSBzdHJpbmdzIHRvCisgICAgICAgKiAgY29tcGFyZSBhcyB0aGUgc21hbGxlc3Qgb2YgdGhlIGxlbmd0aCBvZiB0aGUgc3Vic3RyaW5nIGFuZAorICAgICAgICogIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcgY29uc3RydWN0ZWQgZnJvbSBAYSBfX3MuICBUaGUKKyAgICAgICAqICBmdW5jdGlvbiB0aGVuIGNvbXBhcmVzIHRoZSB0d28gc3RyaW5nIGJ5IGNhbGxpbmcKKyAgICAgICAqICB0cmFpdHM6OmNvbXBhcmUoc3Vic3RyaW5nLmRhdGEoKSxzLHJsZW4pLiAgSWYgdGhlIHJlc3VsdCBvZgorICAgICAgICogIHRoZSBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwgb3RoZXJ3aXNlIHRoZSBzaG9ydGVyCisgICAgICAgKiAgb25lIGlzIG9yZGVyZWQgZmlyc3QuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb21wYXJlIHN1YnN0cmluZyBhZ2FpbnN0IGEgY2hhcmFjdGVyIGFycmF5LgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIGNoYXJhY3RlciBhcnJheSB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHBhcmFtIF9fbjIgIE51bWJlciBvZiBjaGFyYWN0ZXJzIG9mIHMuCisgICAgICAgKiAgQHJldHVybiAgSW50ZWdlciA8IDAsIDAsIG9yID4gMC4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybSB0aGUgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIGZyb20gdGhlIEBhIF9fbjEKKyAgICAgICAqICBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IEBhIF9fcG9zLiAgRm9ybSBhIHN0cmluZyBmcm9tIHRoZQorICAgICAgICogIGZpcnN0IEBhIF9fbjIgY2hhcmFjdGVycyBvZiBAYSBfX3MuICBSZXR1cm5zIGFuIGludGVnZXIgPCAwCisgICAgICAgKiAgaWYgdGhpcyBzdWJzdHJpbmcgaXMgb3JkZXJlZCBiZWZvcmUgdGhlIHN0cmluZyBmcm9tIEBhIF9fcywKKyAgICAgICAqICAwIGlmIHRoZWlyIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgb3IgPiAwIGlmIHRoaXMgc3Vic3RyaW5nCisgICAgICAgKiAgaXMgb3JkZXJlZCBhZnRlciB0aGUgc3RyaW5nIGZyb20gQGEgX19zLiAgRGV0ZXJtaW5lcyB0aGUKKyAgICAgICAqICBlZmZlY3RpdmUgbGVuZ3RoIHJsZW4gb2YgdGhlIHN0cmluZ3MgdG8gY29tcGFyZSBhcyB0aGUKKyAgICAgICAqICBzbWFsbGVzdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBzdWJzdHJpbmcgYW5kIEBhIF9fbjIuICBUaGUKKyAgICAgICAqICBmdW5jdGlvbiB0aGVuIGNvbXBhcmVzIHRoZSB0d28gc3RyaW5ncyBieSBjYWxsaW5nCisgICAgICAgKiAgdHJhaXRzOjpjb21wYXJlKHN1YnN0cmluZy5kYXRhKCksX19zLHJsZW4pLiAgSWYgdGhlIHJlc3VsdCBvZgorICAgICAgICogIHRoZSBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwgb3RoZXJ3aXNlIHRoZSBzaG9ydGVyCisgICAgICAgKiAgb25lIGlzIG9yZGVyZWQgZmlyc3QuCisgICAgICAgKgorICAgICAgICogIE5COiBfX3MgbXVzdCBoYXZlIGF0IGxlYXN0IG4yIGNoYXJhY3RlcnMsIDxlbT5cXDA8L2VtPiBoYXMgbm8gc3BlY2lhbAorICAgICAgICogIG1lYW5pbmcuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCSAgICAgIHNpemVfdHlwZSBfX24yKSBjb25zdDsKKyAgICB9OworCisgIC8vIG9wZXJhdG9yKworICAvKioKKyAgICogIEBicmllZiAgQ29uY2F0ZW5hdGUgdHdvIHN0cmluZ3MuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgTGFzdCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBOZXcgc3RyaW5nIHdpdGggdmFsdWUgb2YgQGEgX19saHMgZm9sbG93ZWQgYnkgQGEgX19yaHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3Jocyk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbmNhdGVuYXRlIEMgc3RyaW5nIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgTGFzdCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBOZXcgc3RyaW5nIHdpdGggdmFsdWUgb2YgQGEgX19saHMgZm9sbG93ZWQgYnkgQGEgX19yaHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKTsKKworICAvKioKKyAgICogIEBicmllZiAgQ29uY2F0ZW5hdGUgY2hhcmFjdGVyIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgTGFzdCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBOZXcgc3RyaW5nIHdpdGggQGEgX19saHMgZm9sbG93ZWQgYnkgQGEgX19yaHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhfQ2hhclQgX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25jYXRlbmF0ZSBzdHJpbmcgYW5kIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIExhc3Qgc3RyaW5nLgorICAgKiAgQHJldHVybiAgTmV3IHN0cmluZyB3aXRoIEBhIF9fbGhzIGZvbGxvd2VkIGJ5IEBhIF9fcmhzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3Jocyk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbmNhdGVuYXRlIHN0cmluZyBhbmQgY2hhcmFjdGVyLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIExhc3Qgc3RyaW5nLgorICAgKiAgQHJldHVybiAgTmV3IHN0cmluZyB3aXRoIEBhIF9fbGhzIGZvbGxvd2VkIGJ5IEBhIF9fcmhzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgX0NoYXJUIF9fcmhzKTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+CisgICAgb3BlcmF0b3IrKF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mJiBfX2xocywKKwkgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19saHMuYXBwZW5kKF9fcmhzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYmIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX3Jocy5pbnNlcnQoMCwgX19saHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiYgX19saHMsCisJICAgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYmIF9fcmhzKQorICAgIHsKKyAgICAgIGNvbnN0IGF1dG8gX19zaXplID0gX19saHMuc2l6ZSgpICsgX19yaHMuc2l6ZSgpOworICAgICAgY29uc3QgYm9vbCBfX2NvbmQgPSAoX19zaXplID4gX19saHMuY2FwYWNpdHkoKQorCQkJICAgJiYgX19zaXplIDw9IF9fcmhzLmNhcGFjaXR5KCkpOworICAgICAgcmV0dXJuIF9fY29uZCA/IHN0ZDo6bW92ZShfX3Jocy5pbnNlcnQoMCwgX19saHMpKQorCSAgICAgICAgICAgIDogc3RkOjptb3ZlKF9fbGhzLmFwcGVuZChfX3JocykpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiYgX19yaHMpCisgICAgeyByZXR1cm4gc3RkOjptb3ZlKF9fcmhzLmluc2VydCgwLCBfX2xocykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+CisgICAgb3BlcmF0b3IrKF9DaGFyVCBfX2xocywKKwkgICAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiYgX19yaHMpCisgICAgeyByZXR1cm4gc3RkOjptb3ZlKF9fcmhzLmluc2VydCgwLCAxLCBfX2xocykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+CisgICAgb3BlcmF0b3IrKF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mJiBfX2xocywKKwkgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX2xocy5hcHBlbmQoX19yaHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiYgX19saHMsCisJICAgICAgX0NoYXJUIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX2xocy5hcHBlbmQoMSwgX19yaHMpKTsgfQorI2VuZGlmCisKKyAgLy8gb3BlcmF0b3IgPT0KKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgZXF1aXZhbGVuY2Ugb2YgdHdvIHN0cmluZ3MuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU2Vjb25kIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMuY29tcGFyZShAYSBfX3JocykgPT0gMC4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID09IDA7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2VuYWJsZV9pZjxzdGQ6Ol9faXNfY2hhcjxfQ2hhclQ+OjpfX3ZhbHVlLCBib29sPjo6X190eXBlCisgICAgb3BlcmF0b3I9PShjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiwgX0Jhc2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4sIF9CYXNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gKF9fbGhzLnNpemUoKSA9PSBfX3Jocy5zaXplKCkKKwkgICAgICAmJiAhc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+Ojpjb21wYXJlKF9fbGhzLmRhdGEoKSwgX19yaHMuZGF0YSgpLAorCQkJCQkJICAgIF9fbGhzLnNpemUoKSkpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgZXF1aXZhbGVuY2Ugb2YgQyBzdHJpbmcgYW5kIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19yaHMuY29tcGFyZShAYSBfX2xocykgPT0gMC4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocykgPT0gMDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGVxdWl2YWxlbmNlIG9mIHN0cmluZyBhbmQgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIFN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzLmNvbXBhcmUoQGEgX19yaHMpID09IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID09IDA7IH0KKworICAvLyBvcGVyYXRvciAhPQorICAvKioKKyAgICogIEBicmllZiAgVGVzdCBkaWZmZXJlbmNlIG9mIHR3byBzdHJpbmdzLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzLmNvbXBhcmUoQGEgX19yaHMpICE9IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGRpZmZlcmVuY2Ugb2YgQyBzdHJpbmcgYW5kIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19yaHMuY29tcGFyZShAYSBfX2xocykgIT0gMC4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBkaWZmZXJlbmNlIG9mIHN0cmluZyBhbmQgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIFN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzLmNvbXBhcmUoQGEgX19yaHMpICE9IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLy8gb3BlcmF0b3IgPAorICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgcHJlY2VkZXMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIHByZWNlZGVzIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpIDwgMDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIHN0cmluZyBwcmVjZWRlcyBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgU3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBDIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgcHJlY2VkZXMgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBDIHN0cmluZyBwcmVjZWRlcyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIHByZWNlZGVzIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocykgPiAwOyB9CisKKyAgLy8gb3BlcmF0b3IgPgorICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgZm9sbG93cyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU2Vjb25kIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZm9sbG93cyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgZm9sbG93cyBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgU3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBDIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZm9sbG93cyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID4gMDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIEMgc3RyaW5nIGZvbGxvd3Mgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBmb2xsb3dzIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocykgPCAwOyB9CisKKyAgLy8gb3BlcmF0b3IgPD0KKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGRvZXNuJ3QgZm9sbG93IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTZWNvbmQgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBkb2Vzbid0IGZvbGxvdyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpIDw9IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgZG9lc24ndCBmb2xsb3cgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIFN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIGRvZXNuJ3QgZm9sbG93IEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgQyBzdHJpbmcgZG9lc24ndCBmb2xsb3cgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBkb2Vzbid0IGZvbGxvdyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocykgPj0gMDsgfQorCisgIC8vIG9wZXJhdG9yID49CisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIHN0cmluZyBkb2Vzbid0IHByZWNlZGUgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIGRvZXNuJ3QgcHJlY2VkZSBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID49IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgZG9lc24ndCBwcmVjZWRlIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIEMgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBkb2Vzbid0IHByZWNlZGUgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID49IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBDIHN0cmluZyBkb2Vzbid0IHByZWNlZGUgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBkb2Vzbid0IHByZWNlZGUgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpIDw9IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgU3dhcCBjb250ZW50cyBvZiB0d28gc3RyaW5ncy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTZWNvbmQgc3RyaW5nLgorICAgKgorICAgKiAgRXhjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBAYSBfX2xocyBhbmQgQGEgX19yaHMgaW4gY29uc3RhbnQgdGltZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJlYWQgc3RyZWFtIGludG8gYSBzdHJpbmcuCisgICAqICBAcGFyYW0gX19pcyAgSW5wdXQgc3RyZWFtLgorICAgKiAgQHBhcmFtIF9fc3RyICBCdWZmZXIgdG8gc3RvcmUgaW50by4KKyAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiAgU3RvcmVzIGNoYXJhY3RlcnMgZnJvbSBAYSBfX2lzIGludG8gQGEgX19zdHIgdW50aWwgd2hpdGVzcGFjZSBpcworICAgKiAgZm91bmQsIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyBlbmNvdW50ZXJlZCwgb3Igc3RyLm1heF9zaXplKCkKKyAgICogIGlzIHJlYWNoZWQuICBJZiBpcy53aWR0aCgpIGlzIG5vbi16ZXJvLCB0aGF0IGlzIHRoZSBsaW1pdCBvbiB0aGUKKyAgICogIG51bWJlciBvZiBjaGFyYWN0ZXJzIHN0b3JlZCBpbnRvIEBhIF9fc3RyLiAgQW55IHByZXZpb3VzCisgICAqICBjb250ZW50cyBvZiBAYSBfX3N0ciBhcmUgZXJhc2VkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIF9fZ251X2N4eDo6X192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYywgX0Jhc2U+JiBfX3N0cik7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFdyaXRlIHN0cmluZyB0byBhIHN0cmVhbS4KKyAgICogIEBwYXJhbSBfX29zICBPdXRwdXQgc3RyZWFtLgorICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgdG8gd3JpdGUgb3V0LgorICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgKgorICAgKiAgT3V0cHV0IGNoYXJhY3RlcnMgb2YgQGEgX19zdHIgaW50byBvcyBmb2xsb3dpbmcgdGhlIHNhbWUgcnVsZXMgYXMgZm9yCisgICAqICB3cml0aW5nIGEgQyBzdHJpbmcuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgX19nbnVfY3h4OjpfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywKKwkgICAgICAgX0Jhc2U+JiBfX3N0cikKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA1ODYuIHN0cmluZyBpbnNlcnRlciBub3QgYSBmb3JtYXR0ZWQgZnVuY3Rpb24KKyAgICAgIHJldHVybiBfX29zdHJlYW1faW5zZXJ0KF9fb3MsIF9fc3RyLmRhdGEoKSwgX19zdHIuc2l6ZSgpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJlYWQgYSBsaW5lIGZyb20gc3RyZWFtIGludG8gYSBzdHJpbmcuCisgICAqICBAcGFyYW0gX19pcyAgSW5wdXQgc3RyZWFtLgorICAgKiAgQHBhcmFtIF9fc3RyICBCdWZmZXIgdG8gc3RvcmUgaW50by4KKyAgICogIEBwYXJhbSBfX2RlbGltICBDaGFyYWN0ZXIgbWFya2luZyBlbmQgb2YgbGluZS4KKyAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiAgU3RvcmVzIGNoYXJhY3RlcnMgZnJvbSBAYSBfX2lzIGludG8gQGEgX19zdHIgdW50aWwgQGEgX19kZWxpbSBpcworICAgKiAgZm91bmQsIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyBlbmNvdW50ZXJlZCwgb3Igc3RyLm1heF9zaXplKCkKKyAgICogIGlzIHJlYWNoZWQuICBJZiBpcy53aWR0aCgpIGlzIG5vbi16ZXJvLCB0aGF0IGlzIHRoZSBsaW1pdCBvbiB0aGUKKyAgICogIG51bWJlciBvZiBjaGFyYWN0ZXJzIHN0b3JlZCBpbnRvIEBhIF9fc3RyLiAgQW55IHByZXZpb3VzCisgICAqICBjb250ZW50cyBvZiBAYSBfX3N0ciBhcmUgZXJhc2VkLiAgSWYgQGEgZGVsaW0gd2FzIGVuY291bnRlcmVkLAorICAgKiAgaXQgaXMgZXh0cmFjdGVkIGJ1dCBub3Qgc3RvcmVkIGludG8gQGEgX19zdHIuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKyAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgX19nbnVfY3h4OjpfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3N0ciwKKwkgICAgX0NoYXJUIF9fZGVsaW0pOworCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWFkIGEgbGluZSBmcm9tIHN0cmVhbSBpbnRvIGEgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9faXMgIElucHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSBfX3N0ciAgQnVmZmVyIHRvIHN0b3JlIGludG8uCisgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogIFN0b3JlcyBjaGFyYWN0ZXJzIGZyb20gaXMgaW50byBAYSBfX3N0ciB1bnRpbCAmYXBvcztcbiZhcG9zOyBpcworICAgKiAgZm91bmQsIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyBlbmNvdW50ZXJlZCwgb3Igc3RyLm1heF9zaXplKCkKKyAgICogIGlzIHJlYWNoZWQuICBJZiBpcy53aWR0aCgpIGlzIG5vbi16ZXJvLCB0aGF0IGlzIHRoZSBsaW1pdCBvbiB0aGUKKyAgICogIG51bWJlciBvZiBjaGFyYWN0ZXJzIHN0b3JlZCBpbnRvIEBhIF9fc3RyLiAgQW55IHByZXZpb3VzCisgICAqICBjb250ZW50cyBvZiBAYSBfX3N0ciBhcmUgZXJhc2VkLiAgSWYgZW5kIG9mIGxpbmUgd2FzCisgICAqICBlbmNvdW50ZXJlZCwgaXQgaXMgZXh0cmFjdGVkIGJ1dCBub3Qgc3RvcmVkIGludG8gQGEgX19zdHIuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKyAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgIF9fZ251X2N4eDo6X192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19zdHIpCisgICAgeyByZXR1cm4gZ2V0bGluZShfX2lzLCBfX3N0ciwgX19pcy53aWRlbignXG4nKSk7IH0gICAgICAKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaWYgKChfX2NwbHVzcGx1cyA+PSAyMDExMDNMKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9DOTkpKQorCisjaW5jbHVkZSA8ZXh0L3N0cmluZ19jb252ZXJzaW9ucy5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gMjEuNCBOdW1lcmljIENvbnZlcnNpb25zIFtzdHJpbmcuY29udmVyc2lvbnNdLgorICBpbmxpbmUgaW50CisgIHN0b2koY29uc3QgX192c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYTxsb25nLCBpbnQ+KCZzdGQ6OnN0cnRvbCwgInN0b2kiLCBfX3N0ci5jX3N0cigpLAorCQkJCQlfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSBsb25nCisgIHN0b2woY29uc3QgX192c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b2wsICJzdG9sIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgdW5zaWduZWQgbG9uZworICBzdG91bChjb25zdCBfX3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvdWwsICJzdG91bCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIGxvbmcgbG9uZworICBzdG9sbChjb25zdCBfX3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwLAlpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvbGwsICJzdG9sbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworICBzdG91bGwoY29uc3QgX192c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4LCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvdWxsLCAic3RvdWxsIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICAvLyBOQjogc3RydG9mIHZzIHN0cnRvZC4KKyAgaW5saW5lIGZsb2F0CisgIHN0b2YoY29uc3QgX192c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6c3RydG9mLCAic3RvZiIsIF9fc3RyLmNfc3RyKCksIF9faWR4KTsgfQorCisgIGlubGluZSBkb3VibGUKKyAgc3RvZChjb25zdCBfX3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b2QsICJzdG9kIiwgX19zdHIuY19zdHIoKSwgX19pZHgpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHN0b2xkKGNvbnN0IF9fdnN0cmluZyYgX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCA9IDApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvbGQsICJzdG9sZCIsIF9fc3RyLmNfc3RyKCksIF9faWR4KTsgfQorCisgIC8vIE5COiAodilzbnByaW50ZiB2cyBzcHJpbnRmLgorCisgIC8vIERSIDEyNjEuCisgIGlubGluZSBfX3ZzdHJpbmcKKyAgdG9fc3RyaW5nKGludCBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X192c3RyaW5nPigmc3RkOjp2c25wcmludGYsIDQgKiBzaXplb2YoaW50KSwKKwkJCQkJICAgICAgIiVkIiwgX192YWwpOyB9CisKKyAgaW5saW5lIF9fdnN0cmluZworICB0b19zdHJpbmcodW5zaWduZWQgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fdnN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLAorCQkJCQkgICAgICA0ICogc2l6ZW9mKHVuc2lnbmVkKSwKKwkJCQkJICAgICAgIiV1IiwgX192YWwpOyB9CisKKyAgaW5saW5lIF9fdnN0cmluZworICB0b19zdHJpbmcobG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X192c3RyaW5nPigmc3RkOjp2c25wcmludGYsCisJCQkJCSAgICAgIDQgKiBzaXplb2YobG9uZyksCisJCQkJCSAgICAgICIlbGQiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgX192c3RyaW5nCisgIHRvX3N0cmluZyh1bnNpZ25lZCBsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3ZzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwKKwkJCQkJICAgICAgNCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJCQkJICAgICAgIiVsdSIsIF9fdmFsKTsgfQorCisKKyAgaW5saW5lIF9fdnN0cmluZworICB0b19zdHJpbmcobG9uZyBsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3ZzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwKKwkJCQkJICAgICAgNCAqIHNpemVvZihsb25nIGxvbmcpLAorCQkJCQkgICAgICAiJWxsZCIsIF9fdmFsKTsgfQorCisgIGlubGluZSBfX3ZzdHJpbmcKKyAgdG9fc3RyaW5nKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X192c3RyaW5nPigmc3RkOjp2c25wcmludGYsCisJCQkJCSAgICAgIDQgKiBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSwKKwkJCQkJICAgICAgIiVsbHUiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgX192c3RyaW5nCisgIHRvX3N0cmluZyhmbG9hdCBfX3ZhbCkKKyAgeworICAgIGNvbnN0IGludCBfX24gPSBfX251bWVyaWNfdHJhaXRzPGZsb2F0Pjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3ZzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwgX19uLAorCQkJCQkgICAgICAiJWYiLCBfX3ZhbCk7CisgIH0KKworICBpbmxpbmUgX192c3RyaW5nCisgIHRvX3N0cmluZyhkb3VibGUgX192YWwpCisgIHsKKyAgICBjb25zdCBpbnQgX19uID0gX19udW1lcmljX3RyYWl0czxkb3VibGU+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fdnN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLCBfX24sCisJCQkJCSAgICAgICIlZiIsIF9fdmFsKTsKKyAgfQorCisgIGlubGluZSBfX3ZzdHJpbmcKKyAgdG9fc3RyaW5nKGxvbmcgZG91YmxlIF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9IF9fbnVtZXJpY190cmFpdHM8bG9uZyBkb3VibGU+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fdnN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLCBfX24sCisJCQkJCSAgICAgICIlTGYiLCBfX3ZhbCk7CisgIH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGlubGluZSBpbnQgCisgIHN0b2koY29uc3QgX193dnN0cmluZyYgX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2E8bG9uZywgaW50Pigmc3RkOjp3Y3N0b2wsICJzdG9pIiwgX19zdHIuY19zdHIoKSwKKwkJCQkJX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgbG9uZyAKKyAgc3RvbChjb25zdCBfX3d2c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b2wsICJzdG9sIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgdW5zaWduZWQgbG9uZworICBzdG91bChjb25zdCBfX3d2c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b3VsLCAic3RvdWwiLCBfX3N0ci5jX3N0cigpLAorCQkJICAgICBfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSBsb25nIGxvbmcKKyAgc3RvbGwoY29uc3QgX193dnN0cmluZyYgX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG9sbCwgInN0b2xsIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCisgIHN0b3VsbChjb25zdCBfX3d2c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b3VsbCwgInN0b3VsbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgLy8gTkI6IHdjc3RvZiB2cyB3Y3N0b2QuCisgIGlubGluZSBmbG9hdAorICBzdG9mKGNvbnN0IF9fd3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b2YsICJzdG9mIiwgX19zdHIuY19zdHIoKSwgX19pZHgpOyB9CisKKyAgaW5saW5lIGRvdWJsZQorICBzdG9kKGNvbnN0IF9fd3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b2QsICJzdG9kIiwgX19zdHIuY19zdHIoKSwgX19pZHgpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHN0b2xkKGNvbnN0IF9fd3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b2xkLCAic3RvbGQiLCBfX3N0ci5jX3N0cigpLCBfX2lkeCk7IH0KKworI2lmbmRlZiBfR0xJQkNYWF9IQVZFX0JST0tFTl9WU1dQUklOVEYKKyAgLy8gRFIgMTI2MS4KKyAgaW5saW5lIF9fd3ZzdHJpbmcKKyAgdG9fd3N0cmluZyhpbnQgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fd3ZzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwKKwkJCQkJICAgICAgIDQgKiBzaXplb2YoaW50KSwKKwkJCQkJICAgICAgIEwiJWQiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgX193dnN0cmluZworICB0b193c3RyaW5nKHVuc2lnbmVkIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3d2c3RyaW5nPigmc3RkOjp2c3dwcmludGYsCisJCQkJCSAgICAgICA0ICogc2l6ZW9mKHVuc2lnbmVkKSwKKwkJCQkJICAgICAgIEwiJXUiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgX193dnN0cmluZworICB0b193c3RyaW5nKGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fd3ZzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwKKwkJCQkJICAgICAgIDQgKiBzaXplb2YobG9uZyksCisJCQkJCSAgICAgICBMIiVsZCIsIF9fdmFsKTsgfQorCisgIGlubGluZSBfX3d2c3RyaW5nCisgIHRvX3dzdHJpbmcodW5zaWduZWQgbG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X193dnN0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLAorCQkJCQkgICAgICAgNCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJCQkJICAgICAgIEwiJWx1IiwgX192YWwpOyB9CisKKyAgaW5saW5lIF9fd3ZzdHJpbmcKKyAgdG9fd3N0cmluZyhsb25nIGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fd3ZzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwKKwkJCQkJICAgICAgIDQgKiBzaXplb2YobG9uZyBsb25nKSwKKwkJCQkJICAgICAgIEwiJWxsZCIsIF9fdmFsKTsgfQorCisgIGlubGluZSBfX3d2c3RyaW5nCisgIHRvX3dzdHJpbmcodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3d2c3RyaW5nPigmc3RkOjp2c3dwcmludGYsCisJCQkJCSAgICAgICA0ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZyksCisJCQkJCSAgICAgICBMIiVsbHUiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgX193dnN0cmluZworICB0b193c3RyaW5nKGZsb2F0IF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9IF9fbnVtZXJpY190cmFpdHM8ZmxvYXQ+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fd3ZzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwgX19uLAorCQkJCQkgICAgICAgTCIlZiIsIF9fdmFsKTsKKyAgfQorCisgIGlubGluZSBfX3d2c3RyaW5nCisgIHRvX3dzdHJpbmcoZG91YmxlIF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9IF9fbnVtZXJpY190cmFpdHM8ZG91YmxlPjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3d2c3RyaW5nPigmc3RkOjp2c3dwcmludGYsIF9fbiwKKwkJCQkJICAgICAgIEwiJWYiLCBfX3ZhbCk7CisgIH0KKworICBpbmxpbmUgX193dnN0cmluZworICB0b193c3RyaW5nKGxvbmcgZG91YmxlIF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9IF9fbnVtZXJpY190cmFpdHM8bG9uZyBkb3VibGU+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fd3ZzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwgX19uLAorCQkJCQkgICAgICAgTCIlTGYiLCBfX3ZhbCk7CisgIH0KKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0aW9uYWxfaGFzaC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgX192c3RyaW5nLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8X19nbnVfY3h4OjpfX3ZzdHJpbmc+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfX2dudV9jeHg6Ol9fdnN0cmluZz4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX19nbnVfY3h4OjpfX3ZzdHJpbmcmIF9fcykgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X0hhc2hfaW1wbDo6aGFzaChfX3MuZGF0YSgpLCBfX3MubGVuZ3RoKCkpOyB9CisgICAgfTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIF9fd3ZzdHJpbmcuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxfX2dudV9jeHg6Ol9fd3ZzdHJpbmc+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfX2dudV9jeHg6Ol9fd3ZzdHJpbmc+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fZ251X2N4eDo6X193dnN0cmluZyYgX19zKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fcy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLmxlbmd0aCgpICogc2l6ZW9mKHdjaGFyX3QpKTsgfQorICAgIH07CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBfX3UxNnZzdHJpbmcuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxfX2dudV9jeHg6Ol9fdTE2dnN0cmluZz4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9fZ251X2N4eDo6X191MTZ2c3RyaW5nPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX2dudV9jeHg6Ol9fdTE2dnN0cmluZyYgX19zKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fcy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLmxlbmd0aCgpICogc2l6ZW9mKGNoYXIxNl90KSk7IH0KKyAgICB9OworCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIF9fdTMydnN0cmluZy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPF9fZ251X2N4eDo6X191MzJ2c3RyaW5nPgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgX19nbnVfY3h4OjpfX3UzMnZzdHJpbmc+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fZ251X2N4eDo6X191MzJ2c3RyaW5nJiBfX3MpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19zLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3MubGVuZ3RoKCkgKiBzaXplb2YoY2hhcjMyX3QpKTsgfQorICAgIH07CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gQysrMTEKKworI2luY2x1ZGUgInZzdHJpbmcudGNjIiAKKworI2VuZGlmIC8qIF9WU1RSSU5HX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3ZzdHJpbmcudGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdnN0cmluZy50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjZDI5NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3ZzdHJpbmcudGNjCkBAIC0wLDAgKzEsNzAxIEBACisvLyBWZXJzYXRpbGUgc3RyaW5nIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvdnN0cmluZy50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtleHQvdnN0cmluZy5ofQorICovCisKKyNpZm5kZWYgX1ZTVFJJTkdfVENDCisjZGVmaW5lIF9WU1RSSU5HX1RDQyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvY3h4YWJpX2ZvcmNlZC5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGNvbnN0IHR5cGVuYW1lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OnNpemVfdHlwZQorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46Om5wb3M7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHZvaWQKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICByZXNpemUoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgaWYgKF9fc2l6ZSA8IF9fbikKKwl0aGlzLT5hcHBlbmQoX19uIC0gX19zaXplLCBfX2MpOworICAgICAgZWxzZSBpZiAoX19uIDwgX19zaXplKQorCXRoaXMtPl9NX2VyYXNlKF9fbiwgX19zaXplIC0gX19uKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mCisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgX01fYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IF9fbiArIHRoaXMtPnNpemUoKTsKKworICAgICAgaWYgKF9fbGVuIDw9IHRoaXMtPmNhcGFjaXR5KCkgJiYgIXRoaXMtPl9NX2lzX3NoYXJlZCgpKQorCXsKKwkgIGlmIChfX24pCisJICAgIHRoaXMtPl9TX2NvcHkodGhpcy0+X01fZGF0YSgpICsgdGhpcy0+c2l6ZSgpLCBfX3MsIF9fbik7CisJfQorICAgICAgZWxzZQorCXRoaXMtPl9NX211dGF0ZSh0aGlzLT5zaXplKCksIHNpemVfdHlwZSgwKSwgX19zLCBfX24pOworCisgICAgICB0aGlzLT5fTV9zZXRfbGVuZ3RoKF9fbGVuKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYKKyAgICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgICAgX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBfSW5wdXRJdGVyYXRvciBfX2sxLAorCQkJICBfSW5wdXRJdGVyYXRvciBfX2syLCBzdGQ6Ol9fZmFsc2VfdHlwZSkKKyAgICAgIHsKKwljb25zdCBfX3ZlcnNhX3N0cmluZyBfX3MoX19rMSwgX19rMik7CisJY29uc3Qgc2l6ZV90eXBlIF9fbjEgPSBfX2kyIC0gX19pMTsKKwlyZXR1cm4gX01fcmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9fbjEsIF9fcy5fTV9kYXRhKCksCisJCQkgIF9fcy5zaXplKCkpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIF9NX3JlcGxhY2VfYXV4KHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMiwKKwkJICAgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfTV9jaGVja19sZW5ndGgoX19uMSwgX19uMiwgIl9fdmVyc2Ffc3RyaW5nOjpfTV9yZXBsYWNlX2F1eCIpOworCisgICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX25ld19zaXplID0gX19vbGRfc2l6ZSArIF9fbjIgLSBfX24xOworCisgICAgICBpZiAoX19uZXdfc2l6ZSA8PSB0aGlzLT5jYXBhY2l0eSgpICYmICF0aGlzLT5fTV9pc19zaGFyZWQoKSkKKwl7CisJICBfQ2hhclQqIF9fcCA9IHRoaXMtPl9NX2RhdGEoKSArIF9fcG9zMTsKKworCSAgY29uc3Qgc2l6ZV90eXBlIF9faG93X211Y2ggPSBfX29sZF9zaXplIC0gX19wb3MxIC0gX19uMTsKKwkgIGlmIChfX2hvd19tdWNoICYmIF9fbjEgIT0gX19uMikKKwkgICAgdGhpcy0+X1NfbW92ZShfX3AgKyBfX24yLCBfX3AgKyBfX24xLCBfX2hvd19tdWNoKTsKKwl9CisgICAgICBlbHNlCisJdGhpcy0+X01fbXV0YXRlKF9fcG9zMSwgX19uMSwgMCwgX19uMik7CisKKyAgICAgIGlmIChfX24yKQorCXRoaXMtPl9TX2Fzc2lnbih0aGlzLT5fTV9kYXRhKCkgKyBfX3BvczEsIF9fbjIsIF9fYyk7CisKKyAgICAgIHRoaXMtPl9NX3NldF9sZW5ndGgoX19uZXdfc2l6ZSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIF9NX3JlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19sZW4xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkgICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuMikKKyAgICB7CisgICAgICBfTV9jaGVja19sZW5ndGgoX19sZW4xLCBfX2xlbjIsICJfX3ZlcnNhX3N0cmluZzo6X01fcmVwbGFjZSIpOworCisgICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX25ld19zaXplID0gX19vbGRfc2l6ZSArIF9fbGVuMiAtIF9fbGVuMTsKKyAgICAgIAorICAgICAgaWYgKF9fbmV3X3NpemUgPD0gdGhpcy0+Y2FwYWNpdHkoKSAmJiAhdGhpcy0+X01faXNfc2hhcmVkKCkpCisJeworCSAgX0NoYXJUKiBfX3AgPSB0aGlzLT5fTV9kYXRhKCkgKyBfX3BvczsKKworCSAgY29uc3Qgc2l6ZV90eXBlIF9faG93X211Y2ggPSBfX29sZF9zaXplIC0gX19wb3MgLSBfX2xlbjE7CisJICBpZiAoX01fZGlzanVuY3QoX19zKSkKKwkgICAgeworCSAgICAgIGlmIChfX2hvd19tdWNoICYmIF9fbGVuMSAhPSBfX2xlbjIpCisJCXRoaXMtPl9TX21vdmUoX19wICsgX19sZW4yLCBfX3AgKyBfX2xlbjEsIF9faG93X211Y2gpOworCSAgICAgIGlmIChfX2xlbjIpCisJCXRoaXMtPl9TX2NvcHkoX19wLCBfX3MsIF9fbGVuMik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8vIFdvcmsgaW4tcGxhY2UuCisJICAgICAgaWYgKF9fbGVuMiAmJiBfX2xlbjIgPD0gX19sZW4xKQorCQl0aGlzLT5fU19tb3ZlKF9fcCwgX19zLCBfX2xlbjIpOworCSAgICAgIGlmIChfX2hvd19tdWNoICYmIF9fbGVuMSAhPSBfX2xlbjIpCisJCXRoaXMtPl9TX21vdmUoX19wICsgX19sZW4yLCBfX3AgKyBfX2xlbjEsIF9faG93X211Y2gpOworCSAgICAgIGlmIChfX2xlbjIgPiBfX2xlbjEpCisJCXsKKwkJICBpZiAoX19zICsgX19sZW4yIDw9IF9fcCArIF9fbGVuMSkKKwkJICAgIHRoaXMtPl9TX21vdmUoX19wLCBfX3MsIF9fbGVuMik7CisJCSAgZWxzZSBpZiAoX19zID49IF9fcCArIF9fbGVuMSkKKwkJICAgIHRoaXMtPl9TX2NvcHkoX19wLCBfX3MgKyBfX2xlbjIgLSBfX2xlbjEsIF9fbGVuMik7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBjb25zdCBzaXplX3R5cGUgX19ubGVmdCA9IChfX3AgKyBfX2xlbjEpIC0gX19zOworCQkgICAgICB0aGlzLT5fU19tb3ZlKF9fcCwgX19zLCBfX25sZWZ0KTsKKwkJICAgICAgdGhpcy0+X1NfY29weShfX3AgKyBfX25sZWZ0LCBfX3AgKyBfX2xlbjIsCisJCQkJICAgIF9fbGVuMiAtIF9fbmxlZnQpOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJdGhpcy0+X01fbXV0YXRlKF9fcG9zLCBfX2xlbjEsIF9fcywgX19sZW4yKTsKKworICAgICAgdGhpcy0+X01fc2V0X2xlbmd0aChfX25ld19zaXplKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7CisgICAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+IF9fc3RyOworICAgICAgX19zdHIucmVzZXJ2ZShfX2xocy5zaXplKCkgKyBfX3Jocy5zaXplKCkpOworICAgICAgX19zdHIuYXBwZW5kKF9fbGhzKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX3Jocyk7CisgICAgICByZXR1cm4gX19zdHI7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+CisgICAgb3BlcmF0b3IrKGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX2xocyk7CisgICAgICB0eXBlZGVmIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4gX19zdHJpbmdfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zdHJpbmdfdHlwZTo6c2l6ZV90eXBlCSAgX19zaXplX3R5cGU7CisgICAgICBjb25zdCBfX3NpemVfdHlwZSBfX2xlbiA9IF9UcmFpdHM6Omxlbmd0aChfX2xocyk7CisgICAgICBfX3N0cmluZ190eXBlIF9fc3RyOworICAgICAgX19zdHIucmVzZXJ2ZShfX2xlbiArIF9fcmhzLnNpemUoKSk7CisgICAgICBfX3N0ci5hcHBlbmQoX19saHMsIF9fbGVuKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX3Jocyk7CisgICAgICByZXR1cm4gX19zdHI7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+CisgICAgb3BlcmF0b3IrKF9DaGFyVCBfX2xocywKKwkgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7CisgICAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+IF9fc3RyOworICAgICAgX19zdHIucmVzZXJ2ZShfX3Jocy5zaXplKCkgKyAxKTsKKyAgICAgIF9fc3RyLnB1c2hfYmFjayhfX2xocyk7CisgICAgICBfX3N0ci5hcHBlbmQoX19yaHMpOworICAgICAgcmV0dXJuIF9fc3RyOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19yaHMpOworICAgICAgdHlwZWRlZiBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+IF9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc3RyaW5nX3R5cGU6OnNpemVfdHlwZQkgIF9fc2l6ZV90eXBlOworICAgICAgY29uc3QgX19zaXplX3R5cGUgX19sZW4gPSBfVHJhaXRzOjpsZW5ndGgoX19yaHMpOworICAgICAgX19zdHJpbmdfdHlwZSBfX3N0cjsKKyAgICAgIF9fc3RyLnJlc2VydmUoX19saHMuc2l6ZSgpICsgX19sZW4pOworICAgICAgX19zdHIuYXBwZW5kKF9fbGhzKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX3JocywgX19sZW4pOworICAgICAgcmV0dXJuIF9fc3RyOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICBfQ2hhclQgX19yaHMpCisgICAgeworICAgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiBfX3N0cjsKKyAgICAgIF9fc3RyLnJlc2VydmUoX19saHMuc2l6ZSgpICsgMSk7CisgICAgICBfX3N0ci5hcHBlbmQoX19saHMpOworICAgICAgX19zdHIucHVzaF9iYWNrKF9fcmhzKTsKKyAgICAgIHJldHVybiBfX3N0cjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHR5cGVuYW1lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OnNpemVfdHlwZQorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGNvcHkoX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICB7CisgICAgICBfTV9jaGVjayhfX3BvcywgIl9fdmVyc2Ffc3RyaW5nOjpjb3B5Iik7CisgICAgICBfX24gPSBfTV9saW1pdChfX3BvcywgX19uKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIGlmIChfX24pCisJdGhpcy0+X1NfY29weShfX3MsIHRoaXMtPl9NX2RhdGEoKSArIF9fcG9zLCBfX24pOworICAgICAgLy8gMjEuMy41LjcgcGFyIDM6IGRvIG5vdCBhcHBlbmQgbnVsbC4gIChnb29kLikKKyAgICAgIHJldHVybiBfX247CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB0eXBlbmFtZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpzaXplX3R5cGUKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCogX19kYXRhID0gdGhpcy0+X01fZGF0YSgpOworCisgICAgICBpZiAoX19uID09IDApCisJcmV0dXJuIF9fcG9zIDw9IF9fc2l6ZSA/IF9fcG9zIDogbnBvczsKKworICAgICAgaWYgKF9fbiA8PSBfX3NpemUpCisJeworCSAgZm9yICg7IF9fcG9zIDw9IF9fc2l6ZSAtIF9fbjsgKytfX3BvcykKKwkgICAgaWYgKHRyYWl0c190eXBlOjplcShfX2RhdGFbX19wb3NdLCBfX3NbMF0pCisJCSYmIHRyYWl0c190eXBlOjpjb21wYXJlKF9fZGF0YSArIF9fcG9zICsgMSwKKwkJCQkJX19zICsgMSwgX19uIC0gMSkgPT0gMCkKKwkgICAgICByZXR1cm4gX19wb3M7CisJfQorICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB0eXBlbmFtZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpzaXplX3R5cGUKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBzaXplX3R5cGUgX19yZXQgPSBucG9zOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3BvcyA8IF9fc2l6ZSkKKwl7CisJICBjb25zdCBfQ2hhclQqIF9fZGF0YSA9IHRoaXMtPl9NX2RhdGEoKTsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfX3NpemUgLSBfX3BvczsKKwkgIGNvbnN0IF9DaGFyVCogX19wID0gdHJhaXRzX3R5cGU6OmZpbmQoX19kYXRhICsgX19wb3MsIF9fbiwgX19jKTsKKwkgIGlmIChfX3ApCisJICAgIF9fcmV0ID0gX19wIC0gX19kYXRhOworCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHR5cGVuYW1lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OnNpemVfdHlwZQorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX24gPD0gX19zaXplKQorCXsKKwkgIF9fcG9zID0gc3RkOjptaW4oc2l6ZV90eXBlKF9fc2l6ZSAtIF9fbiksIF9fcG9zKTsKKwkgIGNvbnN0IF9DaGFyVCogX19kYXRhID0gdGhpcy0+X01fZGF0YSgpOworCSAgZG8KKwkgICAgeworCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6Y29tcGFyZShfX2RhdGEgKyBfX3BvcywgX19zLCBfX24pID09IDApCisJCXJldHVybiBfX3BvczsKKwkgICAgfQorCSAgd2hpbGUgKF9fcG9zLS0gPiAwKTsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHR5cGVuYW1lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OnNpemVfdHlwZQorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIHJmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgaWYgKF9fc2l6ZSkKKwl7CisJICBpZiAoLS1fX3NpemUgPiBfX3BvcykKKwkgICAgX19zaXplID0gX19wb3M7CisJICBmb3IgKCsrX19zaXplOyBfX3NpemUtLSA+IDA7ICkKKwkgICAgaWYgKHRyYWl0c190eXBlOjplcSh0aGlzLT5fTV9kYXRhKClbX19zaXplXSwgX19jKSkKKwkgICAgICByZXR1cm4gX19zaXplOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgdHlwZW5hbWUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6c2l6ZV90eXBlCisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIGZvciAoOyBfX24gJiYgX19wb3MgPCB0aGlzLT5zaXplKCk7ICsrX19wb3MpCisJeworCSAgY29uc3QgX0NoYXJUKiBfX3AgPSB0cmFpdHNfdHlwZTo6ZmluZChfX3MsIF9fbiwKKwkJCQkJCXRoaXMtPl9NX2RhdGEoKVtfX3Bvc10pOworCSAgaWYgKF9fcCkKKwkgICAgcmV0dXJuIF9fcG9zOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgdHlwZW5hbWUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6c2l6ZV90eXBlCisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3NpemUgJiYgX19uKQorCXsKKwkgIGlmICgtLV9fc2l6ZSA+IF9fcG9zKQorCSAgICBfX3NpemUgPSBfX3BvczsKKwkgIGRvCisJICAgIHsKKwkgICAgICBpZiAodHJhaXRzX3R5cGU6OmZpbmQoX19zLCBfX24sIHRoaXMtPl9NX2RhdGEoKVtfX3NpemVdKSkKKwkJcmV0dXJuIF9fc2l6ZTsKKwkgICAgfQorCSAgd2hpbGUgKF9fc2l6ZS0tICE9IDApOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgdHlwZW5hbWUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6c2l6ZV90eXBlCisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBmb3IgKDsgX19wb3MgPCB0aGlzLT5zaXplKCk7ICsrX19wb3MpCisJaWYgKCF0cmFpdHNfdHlwZTo6ZmluZChfX3MsIF9fbiwgdGhpcy0+X01fZGF0YSgpW19fcG9zXSkpCisJICByZXR1cm4gX19wb3M7CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHR5cGVuYW1lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OnNpemVfdHlwZQorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGZpbmRfZmlyc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBmb3IgKDsgX19wb3MgPCB0aGlzLT5zaXplKCk7ICsrX19wb3MpCisJaWYgKCF0cmFpdHNfdHlwZTo6ZXEodGhpcy0+X01fZGF0YSgpW19fcG9zXSwgX19jKSkKKwkgIHJldHVybiBfX3BvczsKKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgdHlwZW5hbWUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6c2l6ZV90eXBlCisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBpZiAoX19zaXplKQorCXsKKwkgIGlmICgtLV9fc2l6ZSA+IF9fcG9zKQorCSAgICBfX3NpemUgPSBfX3BvczsKKwkgIGRvCisJICAgIHsKKwkgICAgICBpZiAoIXRyYWl0c190eXBlOjpmaW5kKF9fcywgX19uLCB0aGlzLT5fTV9kYXRhKClbX19zaXplXSkpCisJCXJldHVybiBfX3NpemU7CisJICAgIH0KKwkgIHdoaWxlIChfX3NpemUtLSk7CisJfQorICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB0eXBlbmFtZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpzaXplX3R5cGUKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBmaW5kX2xhc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgaWYgKF9fc2l6ZSkKKwl7CisJICBpZiAoLS1fX3NpemUgPiBfX3BvcykKKwkgICAgX19zaXplID0gX19wb3M7CisJICBkbworCSAgICB7CisJICAgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZXEodGhpcy0+X01fZGF0YSgpW19fc2l6ZV0sIF9fYykpCisJCXJldHVybiBfX3NpemU7CisJICAgIH0KKwkgIHdoaWxlIChfX3NpemUtLSk7CisJfQorICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbnQKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyKSBjb25zdAorICAgIHsKKyAgICAgIF9NX2NoZWNrKF9fcG9zLCAiX192ZXJzYV9zdHJpbmc6OmNvbXBhcmUiKTsKKyAgICAgIF9fbiA9IF9NX2xpbWl0KF9fcG9zLCBfX24pOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb3NpemUgPSBfX3N0ci5zaXplKCk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6Om1pbihfX24sIF9fb3NpemUpOworICAgICAgaW50IF9fciA9IHRyYWl0c190eXBlOjpjb21wYXJlKHRoaXMtPl9NX2RhdGEoKSArIF9fcG9zLAorCQkJCSAgICAgX19zdHIuZGF0YSgpLCBfX2xlbik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSB0aGlzLT5fU19jb21wYXJlKF9fbiwgX19vc2l6ZSk7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW50CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyLAorCSAgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uMikgY29uc3QKKyAgICB7CisgICAgICBfTV9jaGVjayhfX3BvczEsICJfX3ZlcnNhX3N0cmluZzo6Y29tcGFyZSIpOworICAgICAgX19zdHIuX01fY2hlY2soX19wb3MyLCAiX192ZXJzYV9zdHJpbmc6OmNvbXBhcmUiKTsKKyAgICAgIF9fbjEgPSBfTV9saW1pdChfX3BvczEsIF9fbjEpOworICAgICAgX19uMiA9IF9fc3RyLl9NX2xpbWl0KF9fcG9zMiwgX19uMik7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6Om1pbihfX24xLCBfX24yKTsKKyAgICAgIGludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZSh0aGlzLT5fTV9kYXRhKCkgKyBfX3BvczEsCisJCQkJICAgICBfX3N0ci5kYXRhKCkgKyBfX3BvczIsIF9fbGVuKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IHRoaXMtPl9TX2NvbXBhcmUoX19uMSwgX19uMik7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW50CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgY29tcGFyZShjb25zdCBfQ2hhclQqIF9fcykgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb3NpemUgPSB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcyk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6Om1pbihfX3NpemUsIF9fb3NpemUpOworICAgICAgaW50IF9fciA9IHRyYWl0c190eXBlOjpjb21wYXJlKHRoaXMtPl9NX2RhdGEoKSwgX19zLCBfX2xlbik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSB0aGlzLT5fU19jb21wYXJlKF9fc2l6ZSwgX19vc2l6ZSk7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW50CisgICAgX192ZXJzYV9zdHJpbmcgPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworICAgICAgX01fY2hlY2soX19wb3MsICJfX3ZlcnNhX3N0cmluZzo6Y29tcGFyZSIpOworICAgICAgX19uMSA9IF9NX2xpbWl0KF9fcG9zLCBfX24xKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29zaXplID0gdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19uMSwgX19vc2l6ZSk7CisgICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUodGhpcy0+X01fZGF0YSgpICsgX19wb3MsIF9fcywgX19sZW4pOworICAgICAgaWYgKCFfX3IpCisJX19yID0gdGhpcy0+X1NfY29tcGFyZShfX24xLCBfX29zaXplKTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbnQKKyAgICBfX3ZlcnNhX3N0cmluZyA8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkgICAgc2l6ZV90eXBlIF9fbjIpIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24yKTsKKyAgICAgIF9NX2NoZWNrKF9fcG9zLCAiX192ZXJzYV9zdHJpbmc6OmNvbXBhcmUiKTsKKyAgICAgIF9fbjEgPSBfTV9saW1pdChfX3BvcywgX19uMSk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6Om1pbihfX24xLCBfX24yKTsKKyAgICAgIGludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZSh0aGlzLT5fTV9kYXRhKCkgKyBfX3BvcywgX19zLCBfX2xlbik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSB0aGlzLT5fU19jb21wYXJlKF9fbjEsIF9fbjIpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luLAorCSAgICAgICBfX2dudV9jeHg6Ol9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQWxsb2MsIF9CYXNlPiYgX19zdHIpCisgICAgeworICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgICAgICAgX19pb3NfYmFzZTsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zdHJpbmdfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OmludF90eXBlCQlfX2ludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUJCV9fc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBjdHlwZTxfQ2hhclQ+CQkJCV9fY3R5cGVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19jdHlwZV90eXBlOjpjdHlwZV9iYXNlICAgICAgICAgX19jdHlwZV9iYXNlOworCisgICAgICBfX3NpemVfdHlwZSBfX2V4dHJhY3RlZCA9IDA7CisgICAgICB0eXBlbmFtZSBfX2lvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gX19pb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjpzZW50cnkgX19jZXJiKF9faW4sIGZhbHNlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIC8vIEF2b2lkIHJlYWxsb2NhdGlvbiBmb3IgY29tbW9uIGNhc2UuCisJICAgICAgX19zdHIuZXJhc2UoKTsKKwkgICAgICBfQ2hhclQgX19idWZbMTI4XTsKKwkgICAgICBfX3NpemVfdHlwZSBfX2xlbiA9IDA7CisJICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX3cgPSBfX2luLndpZHRoKCk7CisJICAgICAgY29uc3QgX19zaXplX3R5cGUgX19uID0gX193ID4gMCA/IHN0YXRpY19jYXN0PF9fc2l6ZV90eXBlPihfX3cpCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19zdHIubWF4X3NpemUoKTsKKwkgICAgICBjb25zdCBfX2N0eXBlX3R5cGUmIF9fY3QgPSB1c2VfZmFjZXQ8X19jdHlwZV90eXBlPihfX2luLmdldGxvYygpKTsKKwkgICAgICBjb25zdCBfX2ludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisJICAgICAgX19pbnRfdHlwZSBfX2MgPSBfX2luLnJkYnVmKCktPnNnZXRjKCk7CisKKwkgICAgICB3aGlsZSAoX19leHRyYWN0ZWQgPCBfX24KKwkJICAgICAmJiAhX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikKKwkJICAgICAmJiAhX19jdC5pcyhfX2N0eXBlX2Jhc2U6OnNwYWNlLAorCQkJCSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSkpCisJCXsKKwkJICBpZiAoX19sZW4gPT0gc2l6ZW9mKF9fYnVmKSAvIHNpemVvZihfQ2hhclQpKQorCQkgICAgeworCQkgICAgICBfX3N0ci5hcHBlbmQoX19idWYsIHNpemVvZihfX2J1ZikgLyBzaXplb2YoX0NoYXJUKSk7CisJCSAgICAgIF9fbGVuID0gMDsKKwkJICAgIH0KKwkJICBfX2J1ZltfX2xlbisrXSA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgICsrX19leHRyYWN0ZWQ7CisJCSAgX19jID0gX19pbi5yZGJ1ZigpLT5zbmV4dGMoKTsKKwkJfQorCSAgICAgIF9fc3RyLmFwcGVuZChfX2J1ZiwgX19sZW4pOworCisJICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQlfX2VyciB8PSBfX2lvc19iYXNlOjplb2ZiaXQ7CisJICAgICAgX19pbi53aWR0aCgwKTsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgX19pbi5fTV9zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgICAgICAvLyA5MS4gRGVzY3JpcHRpb24gb2Ygb3BlcmF0b3I+PiBhbmQgZ2V0bGluZSgpIGZvciBzdHJpbmc8PgorCSAgICAgIC8vIG1pZ2h0IGNhdXNlIGVuZGxlc3MgbG9vcAorCSAgICAgIF9faW4uX01fc2V0c3RhdGUoX19pb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgfQorCX0KKyAgICAgIC8vIDIxMS4gIG9wZXJhdG9yPj4oaXN0cmVhbSYsIHN0cmluZyYpIGRvZXNuJ3Qgc2V0IGZhaWxiaXQKKyAgICAgIGlmICghX19leHRyYWN0ZWQpCisJX19lcnIgfD0gX19pb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgIGlmIChfX2VycikKKwlfX2luLnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiBfX2luOworICAgIH0gICAgICAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKyAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pbiwKKwkgICAgX19nbnVfY3h4OjpfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3N0ciwKKwkgICAgX0NoYXJUIF9fZGVsaW0pCisgICAgeworICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4JICAgICAgICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgICAgICAgX19pb3NfYmFzZTsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zdHJpbmdfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OmludF90eXBlCQlfX2ludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUJCV9fc2l6ZV90eXBlOworCisgICAgICBfX3NpemVfdHlwZSBfX2V4dHJhY3RlZCA9IDA7CisgICAgICBjb25zdCBfX3NpemVfdHlwZSBfX24gPSBfX3N0ci5tYXhfc2l6ZSgpOworICAgICAgdHlwZW5hbWUgX19pb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IF9faW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6c2VudHJ5IF9fY2VyYihfX2luLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIC8vIEF2b2lkIHJlYWxsb2NhdGlvbiBmb3IgY29tbW9uIGNhc2UuCisJICAgICAgX19zdHIuZXJhc2UoKTsKKwkgICAgICBfQ2hhclQgX19idWZbMTI4XTsKKwkgICAgICBfX3NpemVfdHlwZSBfX2xlbiA9IDA7CisJICAgICAgY29uc3QgX19pbnRfdHlwZSBfX2lkZWxpbSA9IF9UcmFpdHM6OnRvX2ludF90eXBlKF9fZGVsaW0pOworCSAgICAgIGNvbnN0IF9faW50X3R5cGUgX19lb2YgPSBfVHJhaXRzOjplb2YoKTsKKwkgICAgICBfX2ludF90eXBlIF9fYyA9IF9faW4ucmRidWYoKS0+c2dldGMoKTsKKworCSAgICAgIHdoaWxlIChfX2V4dHJhY3RlZCA8IF9fbgorCQkgICAgICYmICFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKQorCQkgICAgICYmICFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9faWRlbGltKSkKKwkJeworCQkgIGlmIChfX2xlbiA9PSBzaXplb2YoX19idWYpIC8gc2l6ZW9mKF9DaGFyVCkpCisJCSAgICB7CisJCSAgICAgIF9fc3RyLmFwcGVuZChfX2J1Ziwgc2l6ZW9mKF9fYnVmKSAvIHNpemVvZihfQ2hhclQpKTsKKwkJICAgICAgX19sZW4gPSAwOworCQkgICAgfQorCQkgIF9fYnVmW19fbGVuKytdID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYyk7CisJCSAgKytfX2V4dHJhY3RlZDsKKwkJICBfX2MgPSBfX2luLnJkYnVmKCktPnNuZXh0YygpOworCQl9CisJICAgICAgX19zdHIuYXBwZW5kKF9fYnVmLCBfX2xlbik7CisKKwkgICAgICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisJCV9fZXJyIHw9IF9faW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgICBlbHNlIGlmIChfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9faWRlbGltKSkKKwkJeworCQkgICsrX19leHRyYWN0ZWQ7CQkgIAorCQkgIF9faW4ucmRidWYoKS0+c2J1bXBjKCk7CisJCX0KKwkgICAgICBlbHNlCisJCV9fZXJyIHw9IF9faW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIF9faW4uX01fc2V0c3RhdGUoX19pb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gOTEuIERlc2NyaXB0aW9uIG9mIG9wZXJhdG9yPj4gYW5kIGdldGxpbmUoKSBmb3Igc3RyaW5nPD4KKwkgICAgICAvLyBtaWdodCBjYXVzZSBlbmRsZXNzIGxvb3AKKwkgICAgICBfX2luLl9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgIH0KKwl9CisgICAgICBpZiAoIV9fZXh0cmFjdGVkKQorCV9fZXJyIHw9IF9faW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBpZiAoX19lcnIpCisJX19pbi5zZXRzdGF0ZShfX2Vycik7CisgICAgICByZXR1cm4gX19pbjsKKyAgICB9ICAgICAgCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9WU1RSSU5HX1RDQwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdnN0cmluZ19md2QuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3ZzdHJpbmdfZndkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxN2U5MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3ZzdHJpbmdfZndkLmgKQEAgLTAsMCArMSw4OSBAQAorLy8gPHZzdHJpbmcuaD4gRm9yd2FyZCBkZWNsYXJhdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC92c3RyaW5nX2Z3ZC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXh0L3ZzdHJpbmcuaH0KKyAqLworCisjaWZuZGVmIF9WU1RSSU5HX0ZXRF9ICisjZGVmaW5lIF9WU1RSSU5HX0ZXRF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL2NoYXJfdHJhaXRzLmg+CisjaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIF9fc3NvX3N0cmluZ19iYXNlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIF9fcmNfc3RyaW5nX2Jhc2U7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorICAgICAgICAgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+LAorCSAgIHRlbXBsYXRlCisJICAgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlID0gX19zc29fc3RyaW5nX2Jhc2U+CisgICAgY2xhc3MgX192ZXJzYV9zdHJpbmc7CisKKyAgdHlwZWRlZiBfX3ZlcnNhX3N0cmluZzxjaGFyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdnN0cmluZzsKKyAgdHlwZWRlZiBfX3ZzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3NvX3N0cmluZzsKKyAgdHlwZWRlZiAKKyAgX192ZXJzYV9zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwKKwkJIHN0ZDo6YWxsb2NhdG9yPGNoYXI+LCBfX3JjX3N0cmluZ19iYXNlPiAgICBfX3JjX3N0cmluZzsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHR5cGVkZWYgX192ZXJzYV9zdHJpbmc8d2NoYXJfdD4gICAgICAgICAgICAgICAgICAgICAgICAgICBfX3d2c3RyaW5nOworICB0eXBlZGVmIF9fd3ZzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX193c3NvX3N0cmluZzsKKyAgdHlwZWRlZgorICBfX3ZlcnNhX3N0cmluZzx3Y2hhcl90LCBzdGQ6OmNoYXJfdHJhaXRzPHdjaGFyX3Q+LAorCQkgc3RkOjphbGxvY2F0b3I8d2NoYXJfdD4sIF9fcmNfc3RyaW5nX2Jhc2U+IF9fd3JjX3N0cmluZzsKKyNlbmRpZiAgCisKKyNpZiAoKF9fY3BsdXNwbHVzID49IDIwMTEwM0wpIFwKKyAgICAgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEpKQorCisgIHR5cGVkZWYgX192ZXJzYV9zdHJpbmc8Y2hhcjE2X3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UxNnZzdHJpbmc7CisgIHR5cGVkZWYgX191MTZ2c3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UxNnNzb19zdHJpbmc7CisgIHR5cGVkZWYgCisgIF9fdmVyc2Ffc3RyaW5nPGNoYXIxNl90LCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXIxNl90PiwKKwkJIHN0ZDo6YWxsb2NhdG9yPGNoYXIxNl90PiwgX19yY19zdHJpbmdfYmFzZT4gX191MTZyY19zdHJpbmc7CisKKyAgdHlwZWRlZiBfX3ZlcnNhX3N0cmluZzxjaGFyMzJfdD4gICAgICAgICAgICAgICAgICAgICAgICAgIF9fdTMydnN0cmluZzsKKyAgdHlwZWRlZiBfX3UzMnZzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdTMyc3NvX3N0cmluZzsKKyAgdHlwZWRlZiAKKyAgX192ZXJzYV9zdHJpbmc8Y2hhcjMyX3QsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcjMyX3Q+LAorCQkgc3RkOjphbGxvY2F0b3I8Y2hhcjMyX3Q+LCBfX3JjX3N0cmluZ19iYXNlPiBfX3UzMnJjX3N0cmluZzsKKworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9WU1RSSU5HX0ZXRF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC92c3RyaW5nX3V0aWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3ZzdHJpbmdfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjgyMzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC92c3RyaW5nX3V0aWwuaApAQCAtMCwwICsxLDE4MyBAQAorLy8gVmVyc2F0aWxlIHN0cmluZyB1dGlsaXR5IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvdnN0cmluZ191dGlsLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtleHQvdnN0cmluZy5ofQorICovCisKKyNpZm5kZWYgX1ZTVFJJTkdfVVRJTF9ICisjZGVmaW5lIF9WU1RSSU5HX1VUSUxfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGV4dC92c3RyaW5nX2Z3ZC5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4gIC8vIEZvciBsZXNzCisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGJpdHMvbG9jYWxlZndkLmg+CisjaW5jbHVkZSA8Yml0cy9vc3RyZWFtX2luc2VydC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L251bWVyaWNfdHJhaXRzLmg+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+CisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBfX3ZzdHJpbmdfdXRpbGl0eQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X0NoYXJUPjo6b3RoZXIgX0NoYXJUX2FsbG9jX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1RyYWl0cwkJCQkJICAgIHRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUJCSAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6c2l6ZV90eXBlCSAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpkaWZmZXJlbmNlX3R5cGUgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpwb2ludGVyCSAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6Y29uc3RfcG9pbnRlcgkgICAgY29uc3RfcG9pbnRlcjsKKworICAgICAgLy8gRm9yIF9fc3NvX3N0cmluZy4KKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjoKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yPHBvaW50ZXIsIF9fZ251X2N4eDo6CisJCQlfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywKKwkJCQkgICAgICAgX19zc29fc3RyaW5nX2Jhc2U+ID4KKwlfX3Nzb19pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjoKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yPGNvbnN0X3BvaW50ZXIsIF9fZ251X2N4eDo6CisJCQlfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywKKwkJCQkgICAgICAgX19zc29fc3RyaW5nX2Jhc2U+ID4KKwlfX2NvbnN0X3Nzb19pdGVyYXRvcjsKKworICAgICAgLy8gRm9yIF9fcmNfc3RyaW5nLgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OgorICAgICAgX19ub3JtYWxfaXRlcmF0b3I8cG9pbnRlciwgX19nbnVfY3h4OjoKKwkJCV9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLAorCQkJCSAgICAgICBfX3JjX3N0cmluZ19iYXNlPiA+CisJX19yY19pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjoKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yPGNvbnN0X3BvaW50ZXIsIF9fZ251X2N4eDo6CisJCQlfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywKKwkJCQkgICAgICAgX19yY19zdHJpbmdfYmFzZT4gPgorCV9fY29uc3RfcmNfaXRlcmF0b3I7CisKKyAgICAgIC8vIE5COiAgV2hlbiB0aGUgYWxsb2NhdG9yIGlzIGVtcHR5LCBkZXJpdmluZyBmcm9tIGl0IHNhdmVzIHNwYWNlCisgICAgICAvLyAoaHR0cDovL3d3dy5jYW50cmlwLm9yZy9lbXB0eW9wdC5odG1sKS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzE+CisJc3RydWN0IF9BbGxvY19oaWRlcgorCTogcHVibGljIF9BbGxvYzEKKwl7CisJICBfQWxsb2NfaGlkZXIoX0NoYXJUKiBfX3B0cikKKwkgIDogX0FsbG9jMSgpLCBfTV9wKF9fcHRyKSB7IH0KKworCSAgX0FsbG9jX2hpZGVyKGNvbnN0IF9BbGxvYzEmIF9fYSwgX0NoYXJUKiBfX3B0cikKKwkgIDogX0FsbG9jMShfX2EpLCBfTV9wKF9fcHRyKSB7IH0KKworCSAgX0NoYXJUKiAgX01fcDsgLy8gVGhlIGFjdHVhbCBkYXRhLgorCX07CisKKyAgICAgIC8vIFdoZW4gX19uID0gMSB3YXkgZmFzdGVyIHRoYW4gdGhlIGdlbmVyYWwgbXVsdGljaGFyCisgICAgICAvLyB0cmFpdHNfdHlwZTo6Y29weS9tb3ZlL2Fzc2lnbi4KKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19jb3B5KF9DaGFyVCogX19kLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlpZiAoX19uID09IDEpCisJICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX2QsICpfX3MpOworCWVsc2UKKwkgIHRyYWl0c190eXBlOjpjb3B5KF9fZCwgX19zLCBfX24pOworICAgICAgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfbW92ZShfQ2hhclQqIF9fZCwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fbiA9PSAxKQorCSAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19kLCAqX19zKTsKKwllbHNlCisJICB0cmFpdHNfdHlwZTo6bW92ZShfX2QsIF9fcywgX19uKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2Fzc2lnbihfQ2hhclQqIF9fZCwgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICAgIHsKKwlpZiAoX19uID09IDEpCisJICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX2QsIF9fYyk7CisJZWxzZQorCSAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX2QsIF9fbiwgX19jKTsKKyAgICAgIH0KKworICAgICAgLy8gX1NfY29weV9jaGFycyBpcyBhIHNlcGFyYXRlIHRlbXBsYXRlIHRvIHBlcm1pdCBzcGVjaWFsaXphdGlvbgorICAgICAgLy8gdG8gb3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBwb2ludGVycyBhcyBpdGVyYXRvcnMuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisJc3RhdGljIHZvaWQKKwlfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBfSXRlcmF0b3IgX19rMSwgX0l0ZXJhdG9yIF9fazIpCisJeworCSAgZm9yICg7IF9fazEgIT0gX19rMjsgKytfX2sxLCArK19fcCkKKwkgICAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19wLCAqX19rMSk7IC8vIFRoZXNlIHR5cGVzIGFyZSBvZmYuCisJfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfY29weV9jaGFycyhfQ2hhclQqIF9fcCwgX19zc29faXRlcmF0b3IgX19rMSwgX19zc29faXRlcmF0b3IgX19rMikKKyAgICAgIHsgX1NfY29weV9jaGFycyhfX3AsIF9fazEuYmFzZSgpLCBfX2syLmJhc2UoKSk7IH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2NvcHlfY2hhcnMoX0NoYXJUKiBfX3AsIF9fY29uc3Rfc3NvX2l0ZXJhdG9yIF9fazEsCisJCSAgICBfX2NvbnN0X3Nzb19pdGVyYXRvciBfX2syKQorICAgICAgeyBfU19jb3B5X2NoYXJzKF9fcCwgX19rMS5iYXNlKCksIF9fazIuYmFzZSgpKTsgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfY29weV9jaGFycyhfQ2hhclQqIF9fcCwgX19yY19pdGVyYXRvciBfX2sxLCBfX3JjX2l0ZXJhdG9yIF9fazIpCisgICAgICB7IF9TX2NvcHlfY2hhcnMoX19wLCBfX2sxLmJhc2UoKSwgX19rMi5iYXNlKCkpOyB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBfX2NvbnN0X3JjX2l0ZXJhdG9yIF9fazEsCisJCSAgICBfX2NvbnN0X3JjX2l0ZXJhdG9yIF9fazIpCisgICAgICB7IF9TX2NvcHlfY2hhcnMoX19wLCBfX2sxLmJhc2UoKSwgX19rMi5iYXNlKCkpOyB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBfQ2hhclQqIF9fazEsIF9DaGFyVCogX19rMikKKyAgICAgIHsgX1NfY29weShfX3AsIF9fazEsIF9fazIgLSBfX2sxKTsgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfY29weV9jaGFycyhfQ2hhclQqIF9fcCwgY29uc3QgX0NoYXJUKiBfX2sxLCBjb25zdCBfQ2hhclQqIF9fazIpCisgICAgICB7IF9TX2NvcHkoX19wLCBfX2sxLCBfX2syIC0gX19rMSk7IH0KKworICAgICAgc3RhdGljIGludAorICAgICAgX1NfY29tcGFyZShzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIpCisgICAgICB7CisJY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZCA9IGRpZmZlcmVuY2VfdHlwZShfX24xIC0gX19uMik7CisKKwlpZiAoX19kID4gX19udW1lcmljX3RyYWl0c19pbnRlZ2VyPGludD46Ol9fbWF4KQorCSAgcmV0dXJuIF9fbnVtZXJpY190cmFpdHNfaW50ZWdlcjxpbnQ+OjpfX21heDsKKwllbHNlIGlmIChfX2QgPCBfX251bWVyaWNfdHJhaXRzX2ludGVnZXI8aW50Pjo6X19taW4pCisJICByZXR1cm4gX19udW1lcmljX3RyYWl0c19pbnRlZ2VyPGludD46Ol9fbWluOworCWVsc2UKKwkgIHJldHVybiBpbnQoX19kKTsKKyAgICAgIH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfVlNUUklOR19VVElMX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZmVudi5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9mZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiODI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZmVudi5oCkBAIC0wLDAgKzEsODEgQEAKKy8vIC0qLSBDKysgLSotIGNvbXBhdGliaWxpdHkgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZmVudi5oCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0ZFTlZfSAorI2RlZmluZSBfR0xJQkNYWF9GRU5WX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2lmIF9HTElCQ1hYX0hBVkVfRkVOVl9ICisjIGluY2x1ZGVfbmV4dCA8ZmVudi5oPgorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0ZFTlZfVFIxCisKKyN1bmRlZiBmZWNsZWFyZXhjZXB0CisjdW5kZWYgZmVnZXRleGNlcHRmbGFnCisjdW5kZWYgZmVyYWlzZWV4Y2VwdAorI3VuZGVmIGZlc2V0ZXhjZXB0ZmxhZworI3VuZGVmIGZldGVzdGV4Y2VwdAorI3VuZGVmIGZlZ2V0cm91bmQKKyN1bmRlZiBmZXNldHJvdW5kCisjdW5kZWYgZmVnZXRlbnYKKyN1bmRlZiBmZWhvbGRleGNlcHQKKyN1bmRlZiBmZXNldGVudgorI3VuZGVmIGZldXBkYXRlZW52CisKK25hbWVzcGFjZSBzdGQKK3sKKyAgLy8gdHlwZXMKKyAgdXNpbmcgOjpmZW52X3Q7CisgIHVzaW5nIDo6ZmV4Y2VwdF90OworCisgIC8vIGZ1bmN0aW9ucworICB1c2luZyA6OmZlY2xlYXJleGNlcHQ7CisgIHVzaW5nIDo6ZmVnZXRleGNlcHRmbGFnOworICB1c2luZyA6OmZlcmFpc2VleGNlcHQ7CisgIHVzaW5nIDo6ZmVzZXRleGNlcHRmbGFnOworICB1c2luZyA6OmZldGVzdGV4Y2VwdDsKKworICB1c2luZyA6OmZlZ2V0cm91bmQ7CisgIHVzaW5nIDo6ZmVzZXRyb3VuZDsKKworICB1c2luZyA6OmZlZ2V0ZW52OworICB1c2luZyA6OmZlaG9sZGV4Y2VwdDsKKyAgdXNpbmcgOjpmZXNldGVudjsKKyAgdXNpbmcgOjpmZXVwZGF0ZWVudjsKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5X0ZFTlZfVFIxCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfRkVOVl9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2ZvcndhcmRfbGlzdCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZm9yd2FyZF9saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZWQyYWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2ZvcndhcmRfbGlzdApAQCAtMCwwICsxLDUyIEBACisvLyA8Zm9yd2FyZF9saXN0PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9mb3J3YXJkX2xpc3QKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfRk9SV0FSRF9MSVNUCisjZGVmaW5lIF9HTElCQ1hYX0ZPUldBUkRfTElTVCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxiaXRzL2ZvcndhcmRfbGlzdC5oPgorI2luY2x1ZGUgPGJpdHMvcmFuZ2VfYWNjZXNzLmg+CisjaW5jbHVkZSA8Yml0cy9mb3J3YXJkX2xpc3QudGNjPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyMgaW5jbHVkZSA8ZGVidWcvZm9yd2FyZF9saXN0PgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9QUk9GSUxFCisjIGluY2x1ZGUgPHByb2ZpbGUvZm9yd2FyZF9saXN0PgorI2VuZGlmCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfRk9SV0FSRF9MSVNUCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2ZzdHJlYW0gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2ZzdHJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhlNWMzZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZnN0cmVhbQpAQCAtMCwwICsxLDkzOCBAQAorLy8gRmlsZSBiYXNlZCBzdHJlYW1zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2ZzdHJlYW0KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy44ICBGaWxlLWJhc2VkIHN0cmVhbXMKKy8vCisKKyNpZm5kZWYgX0dMSUJDWFhfRlNUUkVBTQorI2RlZmluZSBfR0xJQkNYWF9GU1RSRUFNIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8aXN0cmVhbT4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPGJpdHMvY29kZWN2dC5oPgorI2luY2x1ZGUgPGNzdGRpbz4gICAgICAgICAgICAgLy8gRm9yIEJVRlNJWgorI2luY2x1ZGUgPGJpdHMvYmFzaWNfZmlsZS5oPiAgLy8gRm9yIF9fYmFzaWNfZmlsZSwgX19jX2xvY2sKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8c3RyaW5nPiAgICAgICAgICAgICAvLyBGb3Igc3RkOjpzdHJpbmcgb3ZlcmxvYWRzLgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBbMjcuOC4xLjFdIHRlbXBsYXRlIGNsYXNzIGJhc2ljX2ZpbGVidWYKKyAgLyoqCisgICAqICBAYnJpZWYgIFRoZSBhY3R1YWwgd29yayBvZiBpbnB1dCBhbmQgb3V0cHV0IChmb3IgZmlsZXMpLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIEB0cGFyYW0gX0NoYXJUICBUeXBlIG9mIGNoYXJhY3RlciBzdHJlYW0uCisgICAqICBAdHBhcmFtIF9UcmFpdHMgIFRyYWl0cyBmb3IgY2hhcmFjdGVyIHR5cGUsIGRlZmF1bHRzIHRvCisgICAqICAgICAgICAgICAgICAgICAgIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisgICAqCisgICAqICBUaGlzIGNsYXNzIGFzc29jaWF0ZXMgYm90aCBpdHMgaW5wdXQgYW5kIG91dHB1dCBzZXF1ZW5jZSB3aXRoIGFuCisgICAqICBleHRlcm5hbCBkaXNrIGZpbGUsIGFuZCBtYWludGFpbnMgYSBqb2ludCBmaWxlIHBvc2l0aW9uIGZvciBib3RoCisgICAqICBzZXF1ZW5jZXMuICBNYW55IG9mIGl0cyBzZW1hbnRpY3MgYXJlIGRlc2NyaWJlZCBpbiB0ZXJtcyBvZiBzaW1pbGFyCisgICAqICBiZWhhdmlvciBpbiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5J3MgQGMgRklMRSBzdHJlYW1zLgorICAgKgorICAgKiAgUmVxdWlyZW1lbnRzIG9uIHRyYWl0c190eXBlLCBzcGVjaWZpYyB0byB0aGlzIGNsYXNzOgorICAgKiAgLSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgbXVzdCBiZSBmcG9zPHRyYWl0c190eXBlOjpzdGF0ZV90eXBlPgorICAgKiAgLSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgbXVzdCBiZSBzdHJlYW1vZmYKKyAgICogIC0gdHJhaXRzX3R5cGU6OnN0YXRlX3R5cGUgbXVzdCBiZSBBc3NpZ25hYmxlIGFuZCBEZWZhdWx0Q29uc3RydWN0aWJsZSwKKyAgICogIC0gdHJhaXRzX3R5cGU6OnN0YXRlX3R5cGUoKSBtdXN0IGJlIHRoZSBpbml0aWFsIHN0YXRlIGZvciBjb2RlY3Z0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIGJhc2ljX2ZpbGVidWYgOiBwdWJsaWMgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAJCWludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIAkJb2ZmX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+ICAJX19zdHJlYW1idWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfZmlsZWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiAgICAgX19maWxlYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIF9fYmFzaWNfZmlsZTxjaGFyPgkJICAgICAgICBfX2ZpbGVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnN0YXRlX3R5cGUgICAgICAgICAgX19zdGF0ZV90eXBlOworICAgICAgdHlwZWRlZiBjb2RlY3Z0PGNoYXJfdHlwZSwgY2hhciwgX19zdGF0ZV90eXBlPiAgICBfX2NvZGVjdnRfdHlwZTsKKworICAgICAgZnJpZW5kIGNsYXNzIGlvc19iYXNlOyAvLyBGb3Igc3luY193aXRoX3N0ZGlvLgorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gRGF0YSBNZW1iZXJzOgorICAgICAgLy8gTVQgbG9jayBpbmhlcml0ZWQgZnJvbSBsaWJpbyBvciBvdGhlciBsb3ctbGV2ZWwgaW8gbGlicmFyeS4KKyAgICAgIF9fY19sb2NrICAgICAgICAgIAlfTV9sb2NrOworCisgICAgICAvLyBFeHRlcm5hbCBidWZmZXIuCisgICAgICBfX2ZpbGVfdHlwZSAJCV9NX2ZpbGU7CisKKyAgICAgIC8vLyBQbGFjZSB0byBzdGFzaCBpbiB8fCBvdXQgfHwgaW4gfCBvdXQgc2V0dGluZ3MgZm9yIGN1cnJlbnQgZmlsZWJ1Zi4KKyAgICAgIGlvc19iYXNlOjpvcGVubW9kZSAJX01fbW9kZTsKKworICAgICAgLy8gQmVnaW5uaW5nIHN0YXRlIHR5cGUgZm9yIGNvZGVjdnQuCisgICAgICBfX3N0YXRlX3R5cGUgCQlfTV9zdGF0ZV9iZWc7CisKKyAgICAgIC8vIER1cmluZyBvdXRwdXQsIHRoZSBzdGF0ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHBwdHIoKSwKKyAgICAgIC8vIGR1cmluZyBpbnB1dCwgdGhlIHN0YXRlIHRoYXQgY29ycmVzcG9uZHMgdG8gZWdwdHIoKSBhbmQKKyAgICAgIC8vIF9NX2V4dF9uZXh0LgorICAgICAgX19zdGF0ZV90eXBlCQlfTV9zdGF0ZV9jdXI7CisKKyAgICAgIC8vIE5vdCB1c2VkIGZvciBvdXRwdXQuIER1cmluZyBpbnB1dCwgdGhlIHN0YXRlIHRoYXQgY29ycmVzcG9uZHMKKyAgICAgIC8vIHRvIGViYWNrKCkgYW5kIF9NX2V4dF9idWYuCisgICAgICBfX3N0YXRlX3R5cGUJCV9NX3N0YXRlX2xhc3Q7CisKKyAgICAgIC8vLyBQb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgaW50ZXJuYWwgYnVmZmVyLgorICAgICAgY2hhcl90eXBlKgkJX01fYnVmOyAJCisKKyAgICAgIC8qKgorICAgICAgICogIEFjdHVhbCBzaXplIG9mIGludGVybmFsIGJ1ZmZlci4gVGhpcyBudW1iZXIgaXMgZXF1YWwgdG8gdGhlIHNpemUKKyAgICAgICAqICBvZiB0aGUgcHV0IGFyZWEgKyAxIHBvc2l0aW9uLCByZXNlcnZlZCBmb3IgdGhlIG92ZXJmbG93IGNoYXIgb2YKKyAgICAgICAqICBhIGZ1bGwgYXJlYS4KKyAgICAgICAqLworICAgICAgc2l6ZV90CQkJX01fYnVmX3NpemU7CisKKyAgICAgIC8vIFNldCBpZmYgX01fYnVmIGlzIGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBfTV9hbGxvY2F0ZV9pbnRlcm5hbF9idWZmZXIuCisgICAgICBib29sCQkJX01fYnVmX2FsbG9jYXRlZDsKKworICAgICAgLyoqCisgICAgICAgKiAgX01fcmVhZGluZyA9PSBmYWxzZSAmJiBfTV93cml0aW5nID09IGZhbHNlIGZvciBAYiB1bmNvbW1pdHRlZCBtb2RlOworICAgICAgICogIF9NX3JlYWRpbmcgPT0gdHJ1ZSBmb3IgQGIgcmVhZCBtb2RlOworICAgICAgICogIF9NX3dyaXRpbmcgPT0gdHJ1ZSBmb3IgQGIgd3JpdGUgbW9kZTsKKyAgICAgICAqCisgICAgICAgKiAgTkI6IF9NX3JlYWRpbmcgPT0gdHJ1ZSAmJiBfTV93cml0aW5nID09IHRydWUgaXMgdW51c2VkLgorICAgICAgICovCisgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIF9NX3JlYWRpbmc7CisgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIF9NX3dyaXRpbmc7CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIE5lY2Vzc2FyeSBiaXRzIGZvciBwdXRiYWNrIGJ1ZmZlciBtYW5hZ2VtZW50LgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSBwYmFja3Mgb2Ygb3ZlciBvbmUgY2hhcmFjdGVyIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KKyAgICAgICAqLworICAgICAgY2hhcl90eXBlCQkJX01fcGJhY2s7CisgICAgICBjaGFyX3R5cGUqCQlfTV9wYmFja19jdXJfc2F2ZTsKKyAgICAgIGNoYXJfdHlwZSoJCV9NX3BiYWNrX2VuZF9zYXZlOworICAgICAgYm9vbAkJCV9NX3BiYWNrX2luaXQ7CisgICAgICAvL0B9CisKKyAgICAgIC8vIENhY2hlZCBjb2RlY3Z0IGZhY2V0LgorICAgICAgY29uc3QgX19jb2RlY3Z0X3R5cGUqIAlfTV9jb2RlY3Z0OworCisgICAgICAvKioKKyAgICAgICAqICBCdWZmZXIgZm9yIGV4dGVybmFsIGNoYXJhY3RlcnMuIFVzZWQgZm9yIGlucHV0IHdoZW4KKyAgICAgICAqICBjb2RlY3Z0OjphbHdheXNfbm9jb252KCkgPT0gZmFsc2UuIFdoZW4gdmFsaWQsIHRoaXMgY29ycmVzcG9uZHMKKyAgICAgICAqICB0byBlYmFjaygpLgorICAgICAgICovCisgICAgICBjaGFyKgkJCV9NX2V4dF9idWY7CisKKyAgICAgIC8qKgorICAgICAgICogIFNpemUgb2YgYnVmZmVyIGhlbGQgYnkgX01fZXh0X2J1Zi4KKyAgICAgICAqLworICAgICAgc3RyZWFtc2l6ZQkJX01fZXh0X2J1Zl9zaXplOworCisgICAgICAvKioKKyAgICAgICAqICBQb2ludGVycyBpbnRvIHRoZSBidWZmZXIgaGVsZCBieSBfTV9leHRfYnVmIHRoYXQgZGVsaW1pdCBhCisgICAgICAgKiAgc3Vic2VxdWVuY2Ugb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcmVhZCBidXQgbm90IHlldCBjb252ZXJ0ZWQuCisgICAgICAgKiAgV2hlbiB2YWxpZCwgX01fZXh0X25leHQgY29ycmVzcG9uZHMgdG8gZWdwdHIoKS4KKyAgICAgICAqLworICAgICAgY29uc3QgY2hhcioJCV9NX2V4dF9uZXh0OworICAgICAgY2hhcioJCQlfTV9leHRfZW5kOworCisgICAgICAvKioKKyAgICAgICAqICBJbml0aWFsaXplcyBwYmFjayBidWZmZXJzLCBhbmQgbW92ZXMgbm9ybWFsIGJ1ZmZlcnMgdG8gc2FmZXR5LgorICAgICAgICogIEFzc3VtcHRpb25zOgorICAgICAgICogIF9NX2luX2N1ciBoYXMgYWxyZWFkeSBiZWVuIG1vdmVkIGJhY2sKKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgX01fY3JlYXRlX3BiYWNrKCkKKyAgICAgIHsKKwlpZiAoIV9NX3BiYWNrX2luaXQpCisJICB7CisJICAgIF9NX3BiYWNrX2N1cl9zYXZlID0gdGhpcy0+Z3B0cigpOworCSAgICBfTV9wYmFja19lbmRfc2F2ZSA9IHRoaXMtPmVncHRyKCk7CisJICAgIHRoaXMtPnNldGcoJl9NX3BiYWNrLCAmX01fcGJhY2ssICZfTV9wYmFjayArIDEpOworCSAgICBfTV9wYmFja19pbml0ID0gdHJ1ZTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgRGVhY3RpdmF0ZXMgcGJhY2sgYnVmZmVyIGNvbnRlbnRzLCBhbmQgcmVzdG9yZXMgbm9ybWFsIGJ1ZmZlci4KKyAgICAgICAqICBBc3N1bXB0aW9uczoKKyAgICAgICAqICBUaGUgcGJhY2sgYnVmZmVyIGhhcyBvbmx5IG1vdmVkIGZvcndhcmQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3lfcGJhY2soKSB0aHJvdygpCisgICAgICB7CisJaWYgKF9NX3BiYWNrX2luaXQpCisJICB7CisJICAgIC8vIExlbmd0aCBfTV9pbl9jdXIgbW92ZWQgaW4gdGhlIHBiYWNrIGJ1ZmZlci4KKwkgICAgX01fcGJhY2tfY3VyX3NhdmUgKz0gdGhpcy0+Z3B0cigpICE9IHRoaXMtPmViYWNrKCk7CisJICAgIHRoaXMtPnNldGcoX01fYnVmLCBfTV9wYmFja19jdXJfc2F2ZSwgX01fcGJhY2tfZW5kX3NhdmUpOworCSAgICBfTV9wYmFja19pbml0ID0gZmFsc2U7CisJICB9CisgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcjoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRG9lcyBub3Qgb3BlbiBhbnkgZmlsZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGluaXRpYWxpemVzIHRoZSBwYXJlbnQgY2xhc3MgdXNpbmcgaXRzCisgICAgICAgKiAgb3duIGRlZmF1bHQgY3Rvci4KKyAgICAgICAqLworICAgICAgYmFzaWNfZmlsZWJ1ZigpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBkZXN0cnVjdG9yIGNsb3NlcyB0aGUgZmlsZSBmaXJzdC4KKyAgICAgICAqLworICAgICAgdmlydHVhbAorICAgICAgfmJhc2ljX2ZpbGVidWYoKQorICAgICAgeyB0aGlzLT5jbG9zZSgpOyB9CisKKyAgICAgIC8vIE1lbWJlcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXh0ZXJuYWwgZmlsZSBpcyBvcGVuLgorICAgICAgICovCisgICAgICBib29sCisgICAgICBpc19vcGVuKCkgY29uc3QgdGhyb3coKQorICAgICAgeyByZXR1cm4gX01fZmlsZS5pc19vcGVuKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBPcGVucyBhbiBleHRlcm5hbCBmaWxlLgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgVGhlIG9wZW4gbW9kZSBmbGFncy4KKyAgICAgICAqICBAcmV0dXJuICBAYyB0aGlzIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZQorICAgICAgICoKKyAgICAgICAqICBJZiBhIGZpbGUgaXMgYWxyZWFkeSBvcGVuLCB0aGlzIGZ1bmN0aW9uIGltbWVkaWF0ZWx5IGZhaWxzLgorICAgICAgICogIE90aGVyd2lzZSBpdCB0cmllcyB0byBvcGVuIHRoZSBmaWxlIG5hbWVkIEBhIF9fcyB1c2luZyB0aGUgZmxhZ3MKKyAgICAgICAqICBnaXZlbiBpbiBAYSBfX21vZGUuCisgICAgICAgKgorICAgICAgICogIFRhYmxlIDkyLCBhZGFwdGVkIGhlcmUsIGdpdmVzIHRoZSByZWxhdGlvbiBiZXR3ZWVuIG9wZW5tb2RlCisgICAgICAgKiAgY29tYmluYXRpb25zIGFuZCB0aGUgZXF1aXZhbGVudCBmb3BlbigpIGZsYWdzLgorICAgICAgICogIChOQjogbGluZXMgYXBwLCBpbnxvdXR8YXBwLCBpbnxhcHAsIGJpbmFyeXxhcHAsIGJpbmFyeXxpbnxvdXR8YXBwLAorICAgICAgICogIGFuZCBiaW5hcnl8aW58YXBwIHBlciBEUiA1OTYpCisgICAgICAgKiAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAqICB8IGlvc19iYXNlIEZsYWcgY29tYmluYXRpb24gICAgICAgICAgICBzdGRpbyBlcXVpdmFsZW50ICAgfAorICAgICAgICogIHxiaW5hcnkgIGluICBvdXQgIHRydW5jICBhcHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAqICB8ICAgICAgICAgICAgICsgICAgICAgICAgICAgICAgICAgICAgICB3ICAgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICAgICAgICAgICAgKyAgICAgICAgICAgKyAgICAgICAgICAgIGEgICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICArICAgICAgICAgICAgYSAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgICAgICAgICAgICsgICAgICsgICAgICAgICAgICAgICAgICB3ICAgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICAgICAgICArICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICAgICAgICsgICArICAgICAgICAgICAgICAgICAgICAgICAgcisgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgICAgICAgKyAgICsgICAgICsgICAgICAgICAgICAgICAgICB3KyAgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICAgICAgICArICAgKyAgICAgICAgICAgKyAgICAgICAgICAgIGErICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICAgICAgICsgICAgICAgICAgICAgICArICAgICAgICAgICAgYSsgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICogIHwgICArICAgICAgICAgKyAgICAgICAgICAgICAgICAgICAgICAgIHdiICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICsgICAgICAgICArICAgICAgICAgICArICAgICAgICAgICAgYWIgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgKyAgICAgICAgICAgICAgICAgICAgICsgICAgICAgICAgICBhYiAgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICArICAgICAgICAgKyAgICAgKyAgICAgICAgICAgICAgICAgIHdiICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICsgICAgICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmIgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgKyAgICAgKyAgICsgICAgICAgICAgICAgICAgICAgICAgICByK2IgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICArICAgICArICAgKyAgICAgKyAgICAgICAgICAgICAgICAgIHcrYiAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICsgICAgICsgICArICAgICAgICAgICArICAgICAgICAgICAgYStiICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgKyAgICAgKyAgICAgICAgICAgICAgICsgICAgICAgICAgICBhK2IgICAgICAgICAgICAgICAgfAorICAgICAgICogICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgKi8KKyAgICAgIF9fZmlsZWJ1Zl90eXBlKgorICAgICAgb3Blbihjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBPcGVucyBhbiBleHRlcm5hbCBmaWxlLgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgVGhlIG9wZW4gbW9kZSBmbGFncy4KKyAgICAgICAqICBAcmV0dXJuICBAYyB0aGlzIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZQorICAgICAgICovCisgICAgICBfX2ZpbGVidWZfdHlwZSoKKyAgICAgIG9wZW4oY29uc3Qgc3RkOjpzdHJpbmcmIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKKyAgICAgIHsgcmV0dXJuIG9wZW4oX19zLmNfc3RyKCksIF9fbW9kZSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENsb3NlcyB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgZmlsZS4KKyAgICAgICAqICBAcmV0dXJuICBAYyB0aGlzIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZQorICAgICAgICoKKyAgICAgICAqICBJZiBubyBmaWxlIGlzIGN1cnJlbnRseSBvcGVuLCB0aGlzIGZ1bmN0aW9uIGltbWVkaWF0ZWx5IGZhaWxzLgorICAgICAgICoKKyAgICAgICAqICBJZiBhIDxlbT5wdXQgYnVmZmVyIGFyZWE8L2VtPiBleGlzdHMsIEBjIG92ZXJmbG93KGVvZikgaXMKKyAgICAgICAqICBjYWxsZWQgdG8gZmx1c2ggYWxsIHRoZSBjaGFyYWN0ZXJzLiAgVGhlIGZpbGUgaXMgdGhlbgorICAgICAgICogIGNsb3NlZC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYW55IG9wZXJhdGlvbnMgZmFpbCwgdGhpcyBmdW5jdGlvbiBhbHNvIGZhaWxzLgorICAgICAgICovCisgICAgICBfX2ZpbGVidWZfdHlwZSoKKyAgICAgIGNsb3NlKCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2b2lkCisgICAgICBfTV9hbGxvY2F0ZV9pbnRlcm5hbF9idWZmZXIoKTsKKworICAgICAgdm9pZAorICAgICAgX01fZGVzdHJveV9pbnRlcm5hbF9idWZmZXIoKSB0aHJvdygpOworCisgICAgICAvLyBbMjcuOC4xLjRdIG92ZXJyaWRkZW4gdmlydHVhbCBmdW5jdGlvbnMKKyAgICAgIHZpcnR1YWwgc3RyZWFtc2l6ZQorICAgICAgc2hvd21hbnljKCk7CisKKyAgICAgIC8vIFN0cm91c3RydXAsIDE5OTgsIHAuIDYyOAorICAgICAgLy8gdW5kZXJmbG93KCkgYW5kIHVmbG93KCkgZnVuY3Rpb25zIGFyZSBjYWxsZWQgdG8gZ2V0IHRoZSBuZXh0CisgICAgICAvLyBjaGFyYWN0ZXIgZnJvbSB0aGUgcmVhbCBpbnB1dCBzb3VyY2Ugd2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5LgorICAgICAgLy8gQnVmZmVyZWQgaW5wdXQgdXNlcyB1bmRlcmZsb3coKQorCisgICAgICB2aXJ0dWFsIGludF90eXBlCisgICAgICB1bmRlcmZsb3coKTsKKworICAgICAgdmlydHVhbCBpbnRfdHlwZQorICAgICAgcGJhY2tmYWlsKGludF90eXBlIF9fYyA9IF9UcmFpdHM6OmVvZigpKTsKKworICAgICAgLy8gU3Ryb3VzdHJ1cCwgMTk5OCwgcCA2NDgKKyAgICAgIC8vIFRoZSBvdmVyZmxvdygpIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB0cmFuc2ZlciBjaGFyYWN0ZXJzIHRvIHRoZQorICAgICAgLy8gcmVhbCBvdXRwdXQgZGVzdGluYXRpb24gd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwuIEEgY2FsbCB0bworICAgICAgLy8gb3ZlcmZsb3coYykgb3V0cHV0cyB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciBwbHVzIHRoZQorICAgICAgLy8gY2hhcmFjdGVyIGMuCisgICAgICAvLyAyNy41LjIuNC41CisgICAgICAvLyBDb25zdW1lIHNvbWUgc2VxdWVuY2Ugb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHBlbmRpbmcgc2VxdWVuY2UuCisgICAgICB2aXJ0dWFsIGludF90eXBlCisgICAgICBvdmVyZmxvdyhpbnRfdHlwZSBfX2MgPSBfVHJhaXRzOjplb2YoKSk7CisKKyAgICAgIC8vIENvbnZlcnQgaW50ZXJuYWwgYnl0ZSBzZXF1ZW5jZSB0byBleHRlcm5hbCwgY2hhci1iYXNlZAorICAgICAgLy8gc2VxdWVuY2UgdmlhIGNvZGVjdnQuCisgICAgICBib29sCisgICAgICBfTV9jb252ZXJ0X3RvX2V4dGVybmFsKGNoYXJfdHlwZSosIHN0cmVhbXNpemUpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1hbmlwdWxhdGVzIHRoZSBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFBvaW50ZXIgdG8gYSBidWZmZXIgYXJlYS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgU2l6ZSBvZiBAYSBfX3MuCisgICAgICAgKiAgQHJldHVybiAgQGMgdGhpcworICAgICAgICoKKyAgICAgICAqICBJZiBubyBmaWxlIGhhcyBiZWVuIG9wZW5lZCwgYW5kIGJvdGggQGEgX19zIGFuZCBAYSBfX24gYXJlIHplcm8sIHRoZW4KKyAgICAgICAqICB0aGUgc3RyZWFtIGJlY29tZXMgdW5idWZmZXJlZC4gIE90aGVyd2lzZSwgQGMgX19zIGlzIHVzZWQgYXMgYQorICAgICAgICogIGJ1ZmZlcjsgc2VlCisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQxMWNoMjVzMDIuaHRtbAorICAgICAgICogIGZvciBtb3JlLgorICAgICAgICovCisgICAgICB2aXJ0dWFsIF9fc3RyZWFtYnVmX3R5cGUqCisgICAgICBzZXRidWYoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgdmlydHVhbCBwb3NfdHlwZQorICAgICAgc2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksCisJICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworCisgICAgICB2aXJ0dWFsIHBvc190eXBlCisgICAgICBzZWVrcG9zKHBvc190eXBlIF9fcG9zLAorCSAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKworICAgICAgLy8gQ29tbW9uIGNvZGUgZm9yIHNlZWtvZmYsIHNlZWtwb3MsIGFuZCBvdmVyZmxvdworICAgICAgcG9zX3R5cGUKKyAgICAgIF9NX3NlZWsob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LCBfX3N0YXRlX3R5cGUgX19zdGF0ZSk7CisgICAgICAKKyAgICAgIGludAorICAgICAgX01fZ2V0X2V4dF9wb3MoX19zdGF0ZV90eXBlICZfX3N0YXRlKTsKKworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIHN5bmMoKTsKKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBpbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKTsKKworICAgICAgdmlydHVhbCBzdHJlYW1zaXplCisgICAgICB4c2dldG4oY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgdmlydHVhbCBzdHJlYW1zaXplCisgICAgICB4c3B1dG4oY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgLy8gRmx1c2hlcyBvdXRwdXQgYnVmZmVyLCB0aGVuIHdyaXRlcyB1bnNoaWZ0IHNlcXVlbmNlLgorICAgICAgYm9vbAorICAgICAgX01fdGVybWluYXRlX291dHB1dCgpOworCisgICAgICAvKioKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHBvaW50ZXJzIG9mIHRoZSBpbnRlcm5hbCBidWZmZXIsIGJvdGggZ2V0CisgICAgICAgKiAgYW5kIHB1dCBhcmVhcy4gVHlwaWNhbGx5OgorICAgICAgICoKKyAgICAgICAqICAgX19vZmYgPT0gZWdwdHIoKSAtIGViYWNrKCkgdXBvbiB1bmRlcmZsb3cvdWZsb3cgKEBiIHJlYWQgbW9kZSk7CisgICAgICAgKiAgIF9fb2ZmID09IDAgdXBvbiBvdmVyZmxvdyAoQGIgd3JpdGUgbW9kZSk7CisgICAgICAgKiAgIF9fb2ZmID09IC0xIHVwb24gb3Blbiwgc2V0YnVmLCBzZWVrb2ZmL3BvcyAoQGIgdW5jb21taXR0ZWQgbW9kZSkuCisgICAgICAgKgorICAgICAgICogIE5COiBlcHB0cigpIC0gcGJhc2UoKSA9PSBfTV9idWZfc2l6ZSAtIDEsIHNpbmNlIF9NX2J1Zl9zaXplCisgICAgICAgKiAgcmVmbGVjdHMgdGhlIGFjdHVhbCBhbGxvY2F0ZWQgbWVtb3J5IGFuZCB0aGUgbGFzdCBjZWxsIGlzIHJlc2VydmVkCisgICAgICAgKiAgZm9yIHRoZSBvdmVyZmxvdyBjaGFyIG9mIGEgZnVsbCBwdXQgYXJlYS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgX01fc2V0X2J1ZmZlcihzdHJlYW1zaXplIF9fb2ZmKQorICAgICAgeworIAljb25zdCBib29sIF9fdGVzdGluID0gX01fbW9kZSAmIGlvc19iYXNlOjppbjsKKyAJY29uc3QgYm9vbCBfX3Rlc3RvdXQgPSBfTV9tb2RlICYgaW9zX2Jhc2U6Om91dDsKKwkKKwlpZiAoX190ZXN0aW4gJiYgX19vZmYgPiAwKQorCSAgdGhpcy0+c2V0ZyhfTV9idWYsIF9NX2J1ZiwgX01fYnVmICsgX19vZmYpOworCWVsc2UKKwkgIHRoaXMtPnNldGcoX01fYnVmLCBfTV9idWYsIF9NX2J1Zik7CisKKwlpZiAoX190ZXN0b3V0ICYmIF9fb2ZmID09IDAgJiYgX01fYnVmX3NpemUgPiAxICkKKwkgIHRoaXMtPnNldHAoX01fYnVmLCBfTV9idWYgKyBfTV9idWZfc2l6ZSAtIDEpOworCWVsc2UKKwkgIHRoaXMtPnNldHAoMCwgMCk7CisgICAgICB9CisgICAgfTsKKworICAvLyBbMjcuOC4xLjVdIFRlbXBsYXRlIGNsYXNzIGJhc2ljX2lmc3RyZWFtCisgIC8qKgorICAgKiAgQGJyaWVmICBDb250cm9sbGluZyBpbnB1dCBmb3IgZmlsZXMuCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgQHRwYXJhbSBfQ2hhclQgIFR5cGUgb2YgY2hhcmFjdGVyIHN0cmVhbS4KKyAgICogIEB0cGFyYW0gX1RyYWl0cyAgVHJhaXRzIGZvciBjaGFyYWN0ZXIgdHlwZSwgZGVmYXVsdHMgdG8KKyAgICogICAgICAgICAgICAgICAgICAgY2hhcl90cmFpdHM8X0NoYXJUPi4KKyAgICoKKyAgICogIFRoaXMgY2xhc3Mgc3VwcG9ydHMgcmVhZGluZyBmcm9tIG5hbWVkIGZpbGVzLCB1c2luZyB0aGUgaW5oZXJpdGVkCisgICAqICBmdW5jdGlvbnMgZnJvbSBzdGQ6OmJhc2ljX2lzdHJlYW0uICBUbyBjb250cm9sIHRoZSBhc3NvY2lhdGVkCisgICAqICBzZXF1ZW5jZSwgYW4gaW5zdGFuY2Ugb2Ygc3RkOjpiYXNpY19maWxlYnVmIGlzIHVzZWQsIHdoaWNoIHRoaXMgcGFnZQorICAgKiAgcmVmZXJzIHRvIGFzIEBjIHNiLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIGJhc2ljX2lmc3RyZWFtIDogcHVibGljIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgX0NoYXJUIAkJCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzIAkJCQkJdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAJCWludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIAkJb2ZmX3R5cGU7CisKKyAgICAgIC8vIE5vbi1zdGFuZGFyZCB0eXBlczoKKyAgICAgIHR5cGVkZWYgYmFzaWNfZmlsZWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiAJX19maWxlYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4JX19pc3RyZWFtX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgX19maWxlYnVmX3R5cGUJX01fZmlsZWJ1ZjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENvbnN0cnVjdG9ycy9EZXN0cnVjdG9yczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICAqCisgICAgICAgKiAgSW5pdGlhbGl6ZXMgQGMgc2IgdXNpbmcgaXRzIGRlZmF1bHQgY29uc3RydWN0b3IsIGFuZCBwYXNzZXMKKyAgICAgICAqICBAYyAmc2IgdG8gdGhlIGJhc2UgY2xhc3MgaW5pdGlhbGl6ZXIuICBEb2VzIG5vdCBvcGVuIGFueSBmaWxlcworICAgICAgICogICh5b3UgaGF2ZW4ndCBnaXZlbiBpdCBhIGZpbGVuYW1lIHRvIG9wZW4pLgorICAgICAgICovCisgICAgICBiYXNpY19pZnN0cmVhbSgpIDogX19pc3RyZWFtX3R5cGUoKSwgX01fZmlsZWJ1ZigpCisgICAgICB7IHRoaXMtPmluaXQoJl9NX2ZpbGVidWYpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlIGFuIGlucHV0IGZpbGUgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgX19zICBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIGZpbGVuYW1lLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBPcGVuIGZpbGUgaW4gc3BlY2lmaWVkIG1vZGUgKHNlZSBzdGQ6Omlvc19iYXNlKS4KKyAgICAgICAqCisgICAgICAgKiAgQGMgaW9zX2Jhc2U6OmluIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gQGEgX19tb2RlLgorICAgICAgICoKKyAgICAgICAqICBUaXA6ICBXaGVuIHVzaW5nIHN0ZDo6c3RyaW5nIHRvIGhvbGQgdGhlIGZpbGVuYW1lLCB5b3UgbXVzdCB1c2UKKyAgICAgICAqICAuY19zdHIoKSBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfaWZzdHJlYW0oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluKQorICAgICAgOiBfX2lzdHJlYW1fdHlwZSgpLCBfTV9maWxlYnVmKCkKKyAgICAgIHsKKwl0aGlzLT5pbml0KCZfTV9maWxlYnVmKTsKKwl0aGlzLT5vcGVuKF9fcywgX19tb2RlKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlIGFuIGlucHV0IGZpbGUgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgX19zICBzdGQ6OnN0cmluZyBzcGVjaWZ5aW5nIHRoZSBmaWxlbmFtZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgT3BlbiBmaWxlIGluIHNwZWNpZmllZCBtb2RlIChzZWUgc3RkOjppb3NfYmFzZSkuCisgICAgICAgKgorICAgICAgICogIEBjIGlvc19iYXNlOjppbiBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIEBhIF9fbW9kZS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX2lmc3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3MsCisJCSAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbikKKyAgICAgIDogX19pc3RyZWFtX3R5cGUoKSwgX01fZmlsZWJ1ZigpCisgICAgICB7CisJdGhpcy0+aW5pdCgmX01fZmlsZWJ1Zik7CisJdGhpcy0+b3BlbihfX3MsIF9fbW9kZSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgZGVzdHJ1Y3RvciBkb2VzIG5vdGhpbmcuCisgICAgICAgKgorICAgICAgICogIFRoZSBmaWxlIGlzIGNsb3NlZCBieSB0aGUgZmlsZWJ1ZiBvYmplY3QsIG5vdCB0aGUgZm9ybWF0dGluZworICAgICAgICogIHN0cmVhbS4KKyAgICAgICAqLworICAgICAgfmJhc2ljX2lmc3RyZWFtKCkKKyAgICAgIHsgfQorCisgICAgICAvLyBNZW1iZXJzOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBY2Nlc3NpbmcgdGhlIHVuZGVybHlpbmcgYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gIFRoZSBjdXJyZW50IGJhc2ljX2ZpbGVidWYgYnVmZmVyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGhpZGVzIGJvdGggc2lnbmF0dXJlcyBvZiBzdGQ6OmJhc2ljX2lvczo6cmRidWYoKS4KKyAgICAgICAqLworICAgICAgX19maWxlYnVmX3R5cGUqCisgICAgICByZGJ1ZigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9jYXN0PF9fZmlsZWJ1Zl90eXBlKj4oJl9NX2ZpbGVidWYpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV3JhcHBlciB0byB0ZXN0IGZvciBhbiBvcGVuIGZpbGUuCisgICAgICAgKiAgQHJldHVybiAgQGMgcmRidWYoKS0+aXNfb3BlbigpCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGlzX29wZW4oKQorICAgICAgeyByZXR1cm4gX01fZmlsZWJ1Zi5pc19vcGVuKCk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzY1LiBMYWNrIG9mIGNvbnN0LXF1YWxpZmljYXRpb24gaW4gY2xhdXNlIDI3CisgICAgICBib29sCisgICAgICBpc19vcGVuKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2ZpbGVidWYuaXNfb3BlbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgT3BlbnMgYW4gZXh0ZXJuYWwgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgIFRoZSBvcGVuIG1vZGUgZmxhZ3MuCisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIHN0ZDo6YmFzaWNfZmlsZWJ1Zjo6b3BlbihzLF9fbW9kZXxpbikuICBJZiB0aGF0IGZ1bmN0aW9uCisgICAgICAgKiAgZmFpbHMsIEBjIGZhaWxiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGlwOiAgV2hlbiB1c2luZyBzdGQ6OnN0cmluZyB0byBob2xkIHRoZSBmaWxlbmFtZSwgeW91IG11c3QgdXNlCisgICAgICAgKiAgLmNfc3RyKCkgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhpcyBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgb3Blbihjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4pCisgICAgICB7CisJaWYgKCFfTV9maWxlYnVmLm9wZW4oX19zLCBfX21vZGUgfCBpb3NfYmFzZTo6aW4pKQorCSAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCWVsc2UKKwkgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgIC8vIDQwOS4gQ2xvc2luZyBhbiBmc3RyZWFtIHNob3VsZCBjbGVhciBlcnJvciBzdGF0ZQorCSAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgT3BlbnMgYW4gZXh0ZXJuYWwgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgIFRoZSBvcGVuIG1vZGUgZmxhZ3MuCisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIHN0ZDo6YmFzaWNfZmlsZWJ1Zjo6b3BlbihfX3MsX19tb2RlfGluKS4gIElmIHRoYXQgZnVuY3Rpb24KKyAgICAgICAqICBmYWlscywgQGMgZmFpbGJpdCBpcyBzZXQgaW4gdGhlIHN0cmVhbSdzIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBvcGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4pCisgICAgICB7CisJaWYgKCFfTV9maWxlYnVmLm9wZW4oX19zLCBfX21vZGUgfCBpb3NfYmFzZTo6aW4pKQorCSAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCWVsc2UKKwkgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgIC8vIDQwOS4gQ2xvc2luZyBhbiBmc3RyZWFtIHNob3VsZCBjbGVhciBlcnJvciBzdGF0ZQorCSAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENsb3NlIHRoZSBmaWxlLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyBzdGQ6OmJhc2ljX2ZpbGVidWY6OmNsb3NlKCkuICBJZiB0aGF0IGZ1bmN0aW9uCisgICAgICAgKiAgZmFpbHMsIEBjIGZhaWxiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xvc2UoKQorICAgICAgeworCWlmICghX01fZmlsZWJ1Zi5jbG9zZSgpKQorCSAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgfQorICAgIH07CisKKworICAvLyBbMjcuOC4xLjhdIFRlbXBsYXRlIGNsYXNzIGJhc2ljX29mc3RyZWFtCisgIC8qKgorICAgKiAgQGJyaWVmICBDb250cm9sbGluZyBvdXRwdXQgZm9yIGZpbGVzLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIEB0cGFyYW0gX0NoYXJUICBUeXBlIG9mIGNoYXJhY3RlciBzdHJlYW0uCisgICAqICBAdHBhcmFtIF9UcmFpdHMgIFRyYWl0cyBmb3IgY2hhcmFjdGVyIHR5cGUsIGRlZmF1bHRzIHRvCisgICAqICAgICAgICAgICAgICAgICAgIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisgICAqCisgICAqICBUaGlzIGNsYXNzIHN1cHBvcnRzIHJlYWRpbmcgZnJvbSBuYW1lZCBmaWxlcywgdXNpbmcgdGhlIGluaGVyaXRlZAorICAgKiAgZnVuY3Rpb25zIGZyb20gc3RkOjpiYXNpY19vc3RyZWFtLiAgVG8gY29udHJvbCB0aGUgYXNzb2NpYXRlZAorICAgKiAgc2VxdWVuY2UsIGFuIGluc3RhbmNlIG9mIHN0ZDo6YmFzaWNfZmlsZWJ1ZiBpcyB1c2VkLCB3aGljaCB0aGlzIHBhZ2UKKyAgICogIHJlZmVycyB0byBhcyBAYyBzYi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBiYXNpY19vZnN0cmVhbSA6IHB1YmxpYyBiYXNpY19vc3RyZWFtPF9DaGFyVCxfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgX0NoYXJUIAkJCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzIAkJCQkJdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAJCWludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIAkJb2ZmX3R5cGU7CisKKyAgICAgIC8vIE5vbi1zdGFuZGFyZCB0eXBlczoKKyAgICAgIHR5cGVkZWYgYmFzaWNfZmlsZWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiAJX19maWxlYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4JX19vc3RyZWFtX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgX19maWxlYnVmX3R5cGUJX01fZmlsZWJ1ZjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENvbnN0cnVjdG9yczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICAqCisgICAgICAgKiAgSW5pdGlhbGl6ZXMgQGMgc2IgdXNpbmcgaXRzIGRlZmF1bHQgY29uc3RydWN0b3IsIGFuZCBwYXNzZXMKKyAgICAgICAqICBAYyAmc2IgdG8gdGhlIGJhc2UgY2xhc3MgaW5pdGlhbGl6ZXIuICBEb2VzIG5vdCBvcGVuIGFueSBmaWxlcworICAgICAgICogICh5b3UgaGF2ZW4ndCBnaXZlbiBpdCBhIGZpbGVuYW1lIHRvIG9wZW4pLgorICAgICAgICovCisgICAgICBiYXNpY19vZnN0cmVhbSgpOiBfX29zdHJlYW1fdHlwZSgpLCBfTV9maWxlYnVmKCkKKyAgICAgIHsgdGhpcy0+aW5pdCgmX01fZmlsZWJ1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGUgYW4gb3V0cHV0IGZpbGUgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgX19zICBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIGZpbGVuYW1lLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBPcGVuIGZpbGUgaW4gc3BlY2lmaWVkIG1vZGUgKHNlZSBzdGQ6Omlvc19iYXNlKS4KKyAgICAgICAqCisgICAgICAgKiAgQGMgaW9zX2Jhc2U6Om91dCB8IEBjIGlvc19iYXNlOjp0cnVuYyBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluCisgICAgICAgKiAgQGEgX19tb2RlLgorICAgICAgICoKKyAgICAgICAqICBUaXA6ICBXaGVuIHVzaW5nIHN0ZDo6c3RyaW5nIHRvIGhvbGQgdGhlIGZpbGVuYW1lLCB5b3UgbXVzdCB1c2UKKyAgICAgICAqICAuY19zdHIoKSBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfb2ZzdHJlYW0oY29uc3QgY2hhciogX19zLAorCQkgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6b3V0fGlvc19iYXNlOjp0cnVuYykKKyAgICAgIDogX19vc3RyZWFtX3R5cGUoKSwgX01fZmlsZWJ1ZigpCisgICAgICB7CisJdGhpcy0+aW5pdCgmX01fZmlsZWJ1Zik7CisJdGhpcy0+b3BlbihfX3MsIF9fbW9kZSk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZSBhbiBvdXRwdXQgZmlsZSBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBfX3MgIHN0ZDo6c3RyaW5nIHNwZWNpZnlpbmcgdGhlIGZpbGVuYW1lLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBPcGVuIGZpbGUgaW4gc3BlY2lmaWVkIG1vZGUgKHNlZSBzdGQ6Omlvc19iYXNlKS4KKyAgICAgICAqCisgICAgICAgKiAgQGMgaW9zX2Jhc2U6Om91dCB8IEBjIGlvc19iYXNlOjp0cnVuYyBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluCisgICAgICAgKiAgQGEgX19tb2RlLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfb2ZzdHJlYW0oY29uc3Qgc3RkOjpzdHJpbmcmIF9fcywKKwkJICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6Om91dHxpb3NfYmFzZTo6dHJ1bmMpCisgICAgICA6IF9fb3N0cmVhbV90eXBlKCksIF9NX2ZpbGVidWYoKQorICAgICAgeworCXRoaXMtPmluaXQoJl9NX2ZpbGVidWYpOworCXRoaXMtPm9wZW4oX19zLCBfX21vZGUpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlIGRlc3RydWN0b3IgZG9lcyBub3RoaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGUgZmlsZSBpcyBjbG9zZWQgYnkgdGhlIGZpbGVidWYgb2JqZWN0LCBub3QgdGhlIGZvcm1hdHRpbmcKKyAgICAgICAqICBzdHJlYW0uCisgICAgICAgKi8KKyAgICAgIH5iYXNpY19vZnN0cmVhbSgpCisgICAgICB7IH0KKworICAgICAgLy8gTWVtYmVyczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWNjZXNzaW5nIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBiYXNpY19maWxlYnVmIGJ1ZmZlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBoaWRlcyBib3RoIHNpZ25hdHVyZXMgb2Ygc3RkOjpiYXNpY19pb3M6OnJkYnVmKCkuCisgICAgICAgKi8KKyAgICAgIF9fZmlsZWJ1Zl90eXBlKgorICAgICAgcmRidWYoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfY2FzdDxfX2ZpbGVidWZfdHlwZSo+KCZfTV9maWxlYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdyYXBwZXIgdG8gdGVzdCBmb3IgYW4gb3BlbiBmaWxlLgorICAgICAgICogIEByZXR1cm4gIEBjIHJkYnVmKCktPmlzX29wZW4oKQorICAgICAgICovCisgICAgICBib29sCisgICAgICBpc19vcGVuKCkKKyAgICAgIHsgcmV0dXJuIF9NX2ZpbGVidWYuaXNfb3BlbigpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDM2NS4gTGFjayBvZiBjb25zdC1xdWFsaWZpY2F0aW9uIGluIGNsYXVzZSAyNworICAgICAgYm9vbAorICAgICAgaXNfb3BlbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9maWxlYnVmLmlzX29wZW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE9wZW5zIGFuIGV4dGVybmFsIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBUaGUgb3BlbiBtb2RlIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyBzdGQ6OmJhc2ljX2ZpbGVidWY6Om9wZW4oX19zLF9fbW9kZXxvdXR8dHJ1bmMpLiAgSWYgdGhhdAorICAgICAgICogIGZ1bmN0aW9uIGZhaWxzLCBAYyBmYWlsYml0IGlzIHNldCBpbiB0aGUgc3RyZWFtJ3MgZXJyb3Igc3RhdGUuCisgICAgICAgKgorICAgICAgICogIFRpcDogIFdoZW4gdXNpbmcgc3RkOjpzdHJpbmcgdG8gaG9sZCB0aGUgZmlsZW5hbWUsIHlvdSBtdXN0IHVzZQorICAgICAgICogIC5jX3N0cigpIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIG9wZW4oY29uc3QgY2hhciogX19zLAorCSAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OnRydW5jKQorICAgICAgeworCWlmICghX01fZmlsZWJ1Zi5vcGVuKF9fcywgX19tb2RlIHwgaW9zX2Jhc2U6Om91dCkpCisJICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisJZWxzZQorCSAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgLy8gNDA5LiBDbG9zaW5nIGFuIGZzdHJlYW0gc2hvdWxkIGNsZWFyIGVycm9yIHN0YXRlCisJICB0aGlzLT5jbGVhcigpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBPcGVucyBhbiBleHRlcm5hbCBmaWxlLgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgVGhlIG9wZW4gbW9kZSBmbGFncy4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgc3RkOjpiYXNpY19maWxlYnVmOjpvcGVuKHMsbW9kZXxvdXR8dHJ1bmMpLiAgSWYgdGhhdAorICAgICAgICogIGZ1bmN0aW9uIGZhaWxzLCBAYyBmYWlsYml0IGlzIHNldCBpbiB0aGUgc3RyZWFtJ3MgZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIG9wZW4oY29uc3Qgc3RkOjpzdHJpbmcmIF9fcywKKwkgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjp0cnVuYykKKyAgICAgIHsKKwlpZiAoIV9NX2ZpbGVidWYub3BlbihfX3MsIF9fbW9kZSB8IGlvc19iYXNlOjpvdXQpKQorCSAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCWVsc2UKKwkgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgIC8vIDQwOS4gQ2xvc2luZyBhbiBmc3RyZWFtIHNob3VsZCBjbGVhciBlcnJvciBzdGF0ZQorCSAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENsb3NlIHRoZSBmaWxlLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyBzdGQ6OmJhc2ljX2ZpbGVidWY6OmNsb3NlKCkuICBJZiB0aGF0IGZ1bmN0aW9uCisgICAgICAgKiAgZmFpbHMsIEBjIGZhaWxiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xvc2UoKQorICAgICAgeworCWlmICghX01fZmlsZWJ1Zi5jbG9zZSgpKQorCSAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgfQorICAgIH07CisKKworICAvLyBbMjcuOC4xLjExXSBUZW1wbGF0ZSBjbGFzcyBiYXNpY19mc3RyZWFtCisgIC8qKgorICAgKiAgQGJyaWVmICBDb250cm9sbGluZyBpbnB1dCBhbmQgb3V0cHV0IGZvciBmaWxlcy4KKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBAdHBhcmFtIF9DaGFyVCAgVHlwZSBvZiBjaGFyYWN0ZXIgc3RyZWFtLgorICAgKiAgQHRwYXJhbSBfVHJhaXRzICBUcmFpdHMgZm9yIGNoYXJhY3RlciB0eXBlLCBkZWZhdWx0cyB0bworICAgKiAgICAgICAgICAgICAgICAgICBjaGFyX3RyYWl0czxfQ2hhclQ+LgorICAgKgorICAgKiAgVGhpcyBjbGFzcyBzdXBwb3J0cyByZWFkaW5nIGZyb20gYW5kIHdyaXRpbmcgdG8gbmFtZWQgZmlsZXMsIHVzaW5nCisgICAqICB0aGUgaW5oZXJpdGVkIGZ1bmN0aW9ucyBmcm9tIHN0ZDo6YmFzaWNfaW9zdHJlYW0uICBUbyBjb250cm9sIHRoZQorICAgKiAgYXNzb2NpYXRlZCBzZXF1ZW5jZSwgYW4gaW5zdGFuY2Ugb2Ygc3RkOjpiYXNpY19maWxlYnVmIGlzIHVzZWQsIHdoaWNoCisgICAqICB0aGlzIHBhZ2UgcmVmZXJzIHRvIGFzIEBjIHNiLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIGJhc2ljX2ZzdHJlYW0gOiBwdWJsaWMgYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgX0NoYXJUIAkJCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzIAkJCQkJdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAJCWludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIAkJb2ZmX3R5cGU7CisKKyAgICAgIC8vIE5vbi1zdGFuZGFyZCB0eXBlczoKKyAgICAgIHR5cGVkZWYgYmFzaWNfZmlsZWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiAJX19maWxlYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX2lvczxjaGFyX3R5cGUsIHRyYWl0c190eXBlPgkJX19pb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaW9zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4JX19pb3N0cmVhbV90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9fZmlsZWJ1Zl90eXBlCV9NX2ZpbGVidWY7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcjoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICAqCisgICAgICAgKiAgSW5pdGlhbGl6ZXMgQGMgc2IgdXNpbmcgaXRzIGRlZmF1bHQgY29uc3RydWN0b3IsIGFuZCBwYXNzZXMKKyAgICAgICAqICBAYyAmc2IgdG8gdGhlIGJhc2UgY2xhc3MgaW5pdGlhbGl6ZXIuICBEb2VzIG5vdCBvcGVuIGFueSBmaWxlcworICAgICAgICogICh5b3UgaGF2ZW4ndCBnaXZlbiBpdCBhIGZpbGVuYW1lIHRvIG9wZW4pLgorICAgICAgICovCisgICAgICBiYXNpY19mc3RyZWFtKCkKKyAgICAgIDogX19pb3N0cmVhbV90eXBlKCksIF9NX2ZpbGVidWYoKQorICAgICAgeyB0aGlzLT5pbml0KCZfTV9maWxlYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZSBhbiBpbnB1dC9vdXRwdXQgZmlsZSBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBfX3MgIE51bGwgdGVybWluYXRlZCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgZmlsZW5hbWUuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgIE9wZW4gZmlsZSBpbiBzcGVjaWZpZWQgbW9kZSAoc2VlIHN0ZDo6aW9zX2Jhc2UpLgorICAgICAgICoKKyAgICAgICAqICBUaXA6ICBXaGVuIHVzaW5nIHN0ZDo6c3RyaW5nIHRvIGhvbGQgdGhlIGZpbGVuYW1lLCB5b3UgbXVzdCB1c2UKKyAgICAgICAqICAuY19zdHIoKSBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfZnN0cmVhbShjb25zdCBjaGFyKiBfX3MsCisJCSAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgICAgIDogX19pb3N0cmVhbV90eXBlKDApLCBfTV9maWxlYnVmKCkKKyAgICAgIHsKKwl0aGlzLT5pbml0KCZfTV9maWxlYnVmKTsKKwl0aGlzLT5vcGVuKF9fcywgX19tb2RlKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlIGFuIGlucHV0L291dHB1dCBmaWxlIHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgTnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBmaWxlbmFtZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgT3BlbiBmaWxlIGluIHNwZWNpZmllZCBtb2RlIChzZWUgc3RkOjppb3NfYmFzZSkuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19mc3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3MsCisJCSAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgICAgIDogX19pb3N0cmVhbV90eXBlKDApLCBfTV9maWxlYnVmKCkKKyAgICAgIHsKKwl0aGlzLT5pbml0KCZfTV9maWxlYnVmKTsKKwl0aGlzLT5vcGVuKF9fcywgX19tb2RlKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGZpbGUgaXMgY2xvc2VkIGJ5IHRoZSBmaWxlYnVmIG9iamVjdCwgbm90IHRoZSBmb3JtYXR0aW5nCisgICAgICAgKiAgc3RyZWFtLgorICAgICAgICovCisgICAgICB+YmFzaWNfZnN0cmVhbSgpCisgICAgICB7IH0KKworICAgICAgLy8gTWVtYmVyczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWNjZXNzaW5nIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBiYXNpY19maWxlYnVmIGJ1ZmZlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBoaWRlcyBib3RoIHNpZ25hdHVyZXMgb2Ygc3RkOjpiYXNpY19pb3M6OnJkYnVmKCkuCisgICAgICAgKi8KKyAgICAgIF9fZmlsZWJ1Zl90eXBlKgorICAgICAgcmRidWYoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfY2FzdDxfX2ZpbGVidWZfdHlwZSo+KCZfTV9maWxlYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdyYXBwZXIgdG8gdGVzdCBmb3IgYW4gb3BlbiBmaWxlLgorICAgICAgICogIEByZXR1cm4gIEBjIHJkYnVmKCktPmlzX29wZW4oKQorICAgICAgICovCisgICAgICBib29sCisgICAgICBpc19vcGVuKCkKKyAgICAgIHsgcmV0dXJuIF9NX2ZpbGVidWYuaXNfb3BlbigpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDM2NS4gTGFjayBvZiBjb25zdC1xdWFsaWZpY2F0aW9uIGluIGNsYXVzZSAyNworICAgICAgYm9vbAorICAgICAgaXNfb3BlbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9maWxlYnVmLmlzX29wZW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE9wZW5zIGFuIGV4dGVybmFsIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBUaGUgb3BlbiBtb2RlIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyBzdGQ6OmJhc2ljX2ZpbGVidWY6Om9wZW4oX19zLF9fbW9kZSkuICBJZiB0aGF0CisgICAgICAgKiAgZnVuY3Rpb24gZmFpbHMsIEBjIGZhaWxiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGlwOiAgV2hlbiB1c2luZyBzdGQ6OnN0cmluZyB0byBob2xkIHRoZSBmaWxlbmFtZSwgeW91IG11c3QgdXNlCisgICAgICAgKiAgLmNfc3RyKCkgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhpcyBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgb3Blbihjb25zdCBjaGFyKiBfX3MsCisJICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgICB7CisJaWYgKCFfTV9maWxlYnVmLm9wZW4oX19zLCBfX21vZGUpKQorCSAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCWVsc2UKKwkgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgIC8vIDQwOS4gQ2xvc2luZyBhbiBmc3RyZWFtIHNob3VsZCBjbGVhciBlcnJvciBzdGF0ZQorCSAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgT3BlbnMgYW4gZXh0ZXJuYWwgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgIFRoZSBvcGVuIG1vZGUgZmxhZ3MuCisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIHN0ZDo6YmFzaWNfZmlsZWJ1Zjo6b3BlbihfX3MsX19tb2RlKS4gIElmIHRoYXQKKyAgICAgICAqICBmdW5jdGlvbiBmYWlscywgQGMgZmFpbGJpdCBpcyBzZXQgaW4gdGhlIHN0cmVhbSdzIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBvcGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3MsCisJICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgICB7CisJaWYgKCFfTV9maWxlYnVmLm9wZW4oX19zLCBfX21vZGUpKQorCSAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCWVsc2UKKwkgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgIC8vIDQwOS4gQ2xvc2luZyBhbiBmc3RyZWFtIHNob3VsZCBjbGVhciBlcnJvciBzdGF0ZQorCSAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENsb3NlIHRoZSBmaWxlLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyBzdGQ6OmJhc2ljX2ZpbGVidWY6OmNsb3NlKCkuICBJZiB0aGF0IGZ1bmN0aW9uCisgICAgICAgKiAgZmFpbHMsIEBjIGZhaWxiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xvc2UoKQorICAgICAgeworCWlmICghX01fZmlsZWJ1Zi5jbG9zZSgpKQorCSAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2luY2x1ZGUgPGJpdHMvZnN0cmVhbS50Y2M+CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9GU1RSRUFNICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Z1bmN0aW9uYWwgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Z1bmN0aW9uYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxYTMzYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZnVuY3Rpb25hbApAQCAtMCwwICsxLDI1ODEgQEAKKy8vIDxmdW5jdGlvbmFsPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvZnVuY3Rpb25hbAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9GVU5DVElPTkFMCisjZGVmaW5lIF9HTElCQ1hYX0ZVTkNUSU9OQUwgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGJpdHMvZnVuY3Rpb25hbF9oYXNoLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtYmVyUG9pbnRlcj4KKyAgICBjbGFzcyBfTWVtX2ZuOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DbGFzcz4KKyAgICBfTWVtX2ZuPF9UcCBfQ2xhc3M6Oio+CisgICAgbWVtX2ZuKF9UcCBfQ2xhc3M6OiopIG5vZXhjZXB0OworCitfR0xJQkNYWF9IQVNfTkVTVEVEX1RZUEUocmVzdWx0X3R5cGUpCisKKyAgLy8vIElmIHdlIGhhdmUgZm91bmQgYSByZXN1bHRfdHlwZSwgZXh0cmFjdCBpdC4KKyAgdGVtcGxhdGU8Ym9vbCBfSGFzX3Jlc3VsdF90eXBlLCB0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICBzdHJ1Y3QgX01heWJlX2dldF9yZXN1bHRfdHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICBzdHJ1Y3QgX01heWJlX2dldF9yZXN1bHRfdHlwZTx0cnVlLCBfRnVuY3Rvcj4KKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgX0Z1bmN0b3I6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOyB9OworCisgIC8qKgorICAgKiAgQmFzZSBjbGFzcyBmb3IgYW55IGZ1bmN0aW9uIG9iamVjdCB0aGF0IGhhcyBhIHdlYWsgcmVzdWx0IHR5cGUsIGFzCisgICAqICBkZWZpbmVkIGluIDMuMy8zIG9mIFRSMS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGwKKyAgICA6IF9NYXliZV9nZXRfcmVzdWx0X3R5cGU8X19oYXNfcmVzdWx0X3R5cGU8X0Z1bmN0b3I+Ojp2YWx1ZSwgX0Z1bmN0b3I+CisgICAgeyB9OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgcmVzdWx0IHR5cGUgZm9yIGEgZnVuY3Rpb24gdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoX0FyZ1R5cGVzLi4uKT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyhfQXJnVHlwZXMuLi4uLi4pPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzKF9BcmdUeXBlcy4uLikgY29uc3Q+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoX0FyZ1R5cGVzLi4uLi4uKSBjb25zdD4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyhfQXJnVHlwZXMuLi4pIHZvbGF0aWxlPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzKF9BcmdUeXBlcy4uLi4uLikgdm9sYXRpbGU+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoX0FyZ1R5cGVzLi4uKSBjb25zdCB2b2xhdGlsZT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyhfQXJnVHlwZXMuLi4uLi4pIGNvbnN0IHZvbGF0aWxlPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgcmVzdWx0IHR5cGUgZm9yIGEgZnVuY3Rpb24gcmVmZXJlbmNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcygmKShfQXJnVHlwZXMuLi4pPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzKCYpKF9BcmdUeXBlcy4uLi4uLik+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgLy8vIFJldHJpZXZlIHRoZSByZXN1bHQgdHlwZSBmb3IgYSBmdW5jdGlvbiBwb2ludGVyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcygqKShfQXJnVHlwZXMuLi4pPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzKCopKF9BcmdUeXBlcy4uLi4uLik+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgLy8vIFJldHJpZXZlIHJlc3VsdCB0eXBlIGZvciBhIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLik+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4uLi4pPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIC8vLyBSZXRyaWV2ZSByZXN1bHQgdHlwZSBmb3IgYSBjb25zdCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pIGNvbnN0PgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uLi4uKSBjb25zdD4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICAvLy8gUmV0cmlldmUgcmVzdWx0IHR5cGUgZm9yIGEgdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSB2b2xhdGlsZT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLi4uLikgdm9sYXRpbGU+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgLy8vIFJldHJpZXZlIHJlc3VsdCB0eXBlIGZvciBhIGNvbnN0IHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLikKKwkJCQkgIGNvbnN0IHZvbGF0aWxlPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uLi4uKQorCQkJCSAgY29uc3Qgdm9sYXRpbGU+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgLyoqCisgICAqICBTdHJpcCB0b3AtbGV2ZWwgY3YtcXVhbGlmaWVycyBmcm9tIHRoZSBmdW5jdGlvbiBvYmplY3QgYW5kIGxldAorICAgKiAgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbCBwZXJmb3JtIHRoZSByZWFsIHdvcmsuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZQorICAgIDogX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDx0eXBlbmFtZSByZW1vdmVfY3Y8X0Z1bmN0b3I+Ojp0eXBlPgorICAgIHsgfTsKKworICAvLy8gRGV0ZXJtaW5lcyBpZiB0aGUgdHlwZSBfVHAgZGVyaXZlcyBmcm9tIHVuYXJ5X2Z1bmN0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9EZXJpdmVzX2Zyb21fdW5hcnlfZnVuY3Rpb24gOiBfX3NmaW5hZV90eXBlcworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfUmVzPgorCXN0YXRpYyBfX29uZSBfX3Rlc3QoY29uc3Qgdm9sYXRpbGUgdW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPiopOworCisgICAgICAvLyBJdCdzIHRlbXB0aW5nIHRvIGNoYW5nZSAiLi4uIiB0byBjb25zdCB2b2xhdGlsZSB2b2lkKiwgYnV0CisgICAgICAvLyB0aGF0IGZhaWxzIHdoZW4gX1RwIGlzIGEgZnVuY3Rpb24gdHlwZS4KKyAgICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc2l6ZW9mKF9fdGVzdCgoX1RwKikwKSkgPT0gMTsKKyAgICB9OworCisgIC8vLyBEZXRlcm1pbmVzIGlmIHRoZSB0eXBlIF9UcCBkZXJpdmVzIGZyb20gYmluYXJ5X2Z1bmN0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9EZXJpdmVzX2Zyb21fYmluYXJ5X2Z1bmN0aW9uIDogX19zZmluYWVfdHlwZXMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyLCB0eXBlbmFtZSBfUmVzPgorCXN0YXRpYyBfX29uZSBfX3Rlc3QoY29uc3Qgdm9sYXRpbGUgYmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBfUmVzPiopOworCisgICAgICAvLyBJdCdzIHRlbXB0aW5nIHRvIGNoYW5nZSAiLi4uIiB0byBjb25zdCB2b2xhdGlsZSB2b2lkKiwgYnV0CisgICAgICAvLyB0aGF0IGZhaWxzIHdoZW4gX1RwIGlzIGEgZnVuY3Rpb24gdHlwZS4KKyAgICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc2l6ZW9mKF9fdGVzdCgoX1RwKikwKSkgPT0gMTsKKyAgICB9OworCisgIC8qKgorICAgKiBJbnZva2UgYSBmdW5jdGlvbiBvYmplY3QsIHdoaWNoIG1heSBiZSBlaXRoZXIgYSBtZW1iZXIgcG9pbnRlciBvciBhCisgICAqIGZ1bmN0aW9uIG9iamVjdC4gVGhlIGZpcnN0IHBhcmFtZXRlciB3aWxsIHRlbGwgd2hpY2guCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPAorCSAgICAgKCFpc19tZW1iZXJfcG9pbnRlcjxfRnVuY3Rvcj46OnZhbHVlCisJICAgICAgJiYgIWlzX2Z1bmN0aW9uPF9GdW5jdG9yPjo6dmFsdWUKKwkgICAgICAmJiAhaXNfZnVuY3Rpb248dHlwZW5hbWUgcmVtb3ZlX3BvaW50ZXI8X0Z1bmN0b3I+Ojp0eXBlPjo6dmFsdWUpLAorCSAgICAgdHlwZW5hbWUgcmVzdWx0X29mPF9GdW5jdG9yJihfQXJncyYmLi4uKT46OnR5cGUKKwkgICA+Ojp0eXBlCisgICAgX19pbnZva2UoX0Z1bmN0b3ImIF9fZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgcmV0dXJuIF9fZihzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICAgICAgIChpc19tZW1iZXJfcG9pbnRlcjxfRnVuY3Rvcj46OnZhbHVlCisgICAgICAgICAgICAgICYmICFpc19mdW5jdGlvbjxfRnVuY3Rvcj46OnZhbHVlCisgICAgICAgICAgICAgICYmICFpc19mdW5jdGlvbjx0eXBlbmFtZSByZW1vdmVfcG9pbnRlcjxfRnVuY3Rvcj46OnR5cGU+Ojp2YWx1ZSksCisgICAgICAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPF9GdW5jdG9yKF9BcmdzJiYuLi4pPjo6dHlwZQorICAgICAgICAgICA+Ojp0eXBlCisgICAgX19pbnZva2UoX0Z1bmN0b3ImIF9fZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgcmV0dXJuIHN0ZDo6bWVtX2ZuKF9fZikoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgLy8gVG8gcGljayB1cCBmdW5jdGlvbiByZWZlcmVuY2VzICh0aGF0IHdpbGwgYmVjb21lIGZ1bmN0aW9uIHBvaW50ZXJzKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPAorCSAgICAgKGlzX3BvaW50ZXI8X0Z1bmN0b3I+Ojp2YWx1ZQorCSAgICAgICYmIGlzX2Z1bmN0aW9uPHR5cGVuYW1lIHJlbW92ZV9wb2ludGVyPF9GdW5jdG9yPjo6dHlwZT46OnZhbHVlKSwKKwkgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjxfRnVuY3RvcihfQXJncyYmLi4uKT46OnR5cGUKKwkgICA+Ojp0eXBlCisgICAgX19pbnZva2UoX0Z1bmN0b3IgX19mLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICByZXR1cm4gX19mKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgfQorCisgIC8qKgorICAgKiAgS25vd2luZyB3aGljaCBvZiB1bmFyeV9mdW5jdGlvbiBhbmQgYmluYXJ5X2Z1bmN0aW9uIF9UcCBkZXJpdmVzCisgICAqICBmcm9tLCBkZXJpdmVzIGZyb20gdGhlIHNhbWUgYW5kIGVuc3VyZXMgdGhhdCByZWZlcmVuY2Vfd3JhcHBlcgorICAgKiAgd2lsbCBoYXZlIGEgd2VhayByZXN1bHQgdHlwZS4gU2VlIGNhc2VzIGJlbG93LgorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfVW5hcnksIGJvb2wgX0JpbmFyeSwgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZV9pbXBsOworCisgIC8vIE5vbmUgb2YgdGhlIG5lc3RlZCBhcmd1bWVudCB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZV9pbXBsPGZhbHNlLCBmYWxzZSwgX1RwPgorICAgIDogX1dlYWtfcmVzdWx0X3R5cGU8X1RwPgorICAgIHsgfTsKKworICAvLyBOZXN0ZWQgYXJndW1lbnRfdHlwZSBvbmx5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlX2ltcGw8dHJ1ZSwgZmFsc2UsIF9UcD4KKyAgICA6IF9XZWFrX3Jlc3VsdF90eXBlPF9UcD4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcDo6YXJndW1lbnRfdHlwZSBhcmd1bWVudF90eXBlOworICAgIH07CisKKyAgLy8gTmVzdGVkIGZpcnN0X2FyZ3VtZW50X3R5cGUgYW5kIHNlY29uZF9hcmd1bWVudF90eXBlIG9ubHkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2VfaW1wbDxmYWxzZSwgdHJ1ZSwgX1RwPgorICAgIDogX1dlYWtfcmVzdWx0X3R5cGU8X1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwOjpmaXJzdF9hcmd1bWVudF90eXBlIGZpcnN0X2FyZ3VtZW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcDo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisgICAgfTsKKworICAvLyBBbGwgdGhlIG5lc3RlZCBhcmd1bWVudCB0eXBlcy4KKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2VfaW1wbDx0cnVlLCB0cnVlLCBfVHA+CisgICAgOiBfV2Vha19yZXN1bHRfdHlwZTxfVHA+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHA6OmFyZ3VtZW50X3R5cGUgYXJndW1lbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwOjpmaXJzdF9hcmd1bWVudF90eXBlIGZpcnN0X2FyZ3VtZW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcDo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisgICAgfTsKKworICBfR0xJQkNYWF9IQVNfTkVTVEVEX1RZUEUoYXJndW1lbnRfdHlwZSkKKyAgX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFKGZpcnN0X2FyZ3VtZW50X3R5cGUpCisgIF9HTElCQ1hYX0hBU19ORVNURURfVFlQRShzZWNvbmRfYXJndW1lbnRfdHlwZSkKKworICAvKioKKyAgICogIERlcml2ZXMgZnJvbSB1bmFyeV9mdW5jdGlvbiBvciBiaW5hcnlfZnVuY3Rpb24gd2hlbiBpdAorICAgKiAgY2FuLiBTcGVjaWFsaXphdGlvbnMgaGFuZGxlIGFsbCBvZiB0aGUgZWFzeSBjYXNlcy4gVGhlIHByaW1hcnkKKyAgICogIHRlbXBsYXRlIGRldGVybWluZXMgd2hhdCB0byBkbyB3aXRoIGEgY2xhc3MgdHlwZSwgd2hpY2ggbWF5CisgICAqICBkZXJpdmUgZnJvbSBib3RoIHVuYXJ5X2Z1bmN0aW9uIGFuZCBiaW5hcnlfZnVuY3Rpb24uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2UKKyAgICA6IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlX2ltcGw8CisgICAgICBfX2hhc19hcmd1bWVudF90eXBlPF9UcD46OnZhbHVlLAorICAgICAgX19oYXNfZmlyc3RfYXJndW1lbnRfdHlwZTxfVHA+Ojp2YWx1ZQorICAgICAgJiYgX19oYXNfc2Vjb25kX2FyZ3VtZW50X3R5cGU8X1RwPjo6dmFsdWUsCisgICAgICBfVHA+CisgICAgeyB9OworCisgIC8vIC0gYSBmdW5jdGlvbiB0eXBlICh1bmFyeSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzKF9UMSk+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxfVDEsIF9SZXM+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEpIGNvbnN0PgorICAgIDogdW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMoX1QxKSB2b2xhdGlsZT4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPF9UMSwgX1Jlcz4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzKF9UMSkgY29uc3Qgdm9sYXRpbGU+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxfVDEsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBmdW5jdGlvbiB0eXBlIChiaW5hcnkpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzKF9UMSwgX1QyKT4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjxfVDEsIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMoX1QxLCBfVDIpIGNvbnN0PgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBfUmVzPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEsIF9UMikgdm9sYXRpbGU+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzKF9UMSwgX1QyKSBjb25zdCB2b2xhdGlsZT4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjxfVDEsIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSAodW5hcnkpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcygqKShfVDEpPgorICAgIDogdW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIChiaW5hcnkpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzKCopKF9UMSwgX1QyKT4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjxfVDEsIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKHVuYXJ5LCBubyBxdWFsaWZpZXJzKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoKT4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPF9UMSosIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlIChiaW5hcnksIG5vIHF1YWxpZmllcnMpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKF9UMik+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248X1QxKiwgX1QyLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAodW5hcnksIGNvbnN0KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoKSBjb25zdD4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UMSosIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlIChiaW5hcnksIGNvbnN0KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKShfVDIpIGNvbnN0PgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UMSosIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKHVuYXJ5LCB2b2xhdGlsZSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKCkgdm9sYXRpbGU+CisgICAgOiB1bmFyeV9mdW5jdGlvbjx2b2xhdGlsZSBfVDEqLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAoYmluYXJ5LCB2b2xhdGlsZSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoX1QyKSB2b2xhdGlsZT4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjx2b2xhdGlsZSBfVDEqLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlICh1bmFyeSwgY29uc3Qgdm9sYXRpbGUpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKSgpIGNvbnN0IHZvbGF0aWxlPgorICAgIDogdW5hcnlfZnVuY3Rpb248Y29uc3Qgdm9sYXRpbGUgX1QxKiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKGJpbmFyeSwgY29uc3Qgdm9sYXRpbGUpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKF9UMikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248Y29uc3Qgdm9sYXRpbGUgX1QxKiwgX1QyLCBfUmVzPgorICAgIHsgfTsKKworICAvKioKKyAgICogIEBicmllZiBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIGZvciByZWZlcmVuY2Vfd3JhcHBlci4KKyAgICogIEBpbmdyb3VwIGZ1bmN0b3JzCisgICAqICBAeworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHJlZmVyZW5jZV93cmFwcGVyCisgICAgOiBwdWJsaWMgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+CisgICAgeworICAgICAgX1RwKiBfTV9kYXRhOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgdHlwZTsKKworICAgICAgcmVmZXJlbmNlX3dyYXBwZXIoX1RwJiBfX2luZGF0YSkgbm9leGNlcHQKKyAgICAgIDogX01fZGF0YShzdGQ6Ol9fYWRkcmVzc29mKF9faW5kYXRhKSkKKyAgICAgIHsgfQorCisgICAgICByZWZlcmVuY2Vfd3JhcHBlcihfVHAmJikgPSBkZWxldGU7CisKKyAgICAgIHJlZmVyZW5jZV93cmFwcGVyKGNvbnN0IHJlZmVyZW5jZV93cmFwcGVyPF9UcD4mIF9faW5yZWYpIG5vZXhjZXB0CisgICAgICA6IF9NX2RhdGEoX19pbnJlZi5fTV9kYXRhKQorICAgICAgeyB9CisKKyAgICAgIHJlZmVyZW5jZV93cmFwcGVyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHJlZmVyZW5jZV93cmFwcGVyPF9UcD4mIF9faW5yZWYpIG5vZXhjZXB0CisgICAgICB7CisJX01fZGF0YSA9IF9faW5yZWYuX01fZGF0YTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIG9wZXJhdG9yIF9UcCYoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gdGhpcy0+Z2V0KCk7IH0KKworICAgICAgX1RwJgorICAgICAgZ2V0KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuICpfTV9kYXRhOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXR5cGVuYW1lIHJlc3VsdF9vZjxfVHAmKF9BcmdzJiYuLi4pPjo6dHlwZQorCW9wZXJhdG9yKCkoX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKyAgICB9OworCisKKyAgLy8vIERlbm90ZXMgYSByZWZlcmVuY2Ugc2hvdWxkIGJlIHRha2VuIHRvIGEgdmFyaWFibGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcmVmZXJlbmNlX3dyYXBwZXI8X1RwPgorICAgIHJlZihfVHAmIF9fdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+KF9fdCk7IH0KKworICAvLy8gRGVub3RlcyBhIGNvbnN0IHJlZmVyZW5jZSBzaG91bGQgYmUgdGFrZW4gdG8gYSB2YXJpYWJsZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSByZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBfVHA+CisgICAgY3JlZihjb25zdCBfVHAmIF9fdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiByZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBfVHA+KF9fdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZCByZWYoY29uc3QgX1RwJiYpID0gZGVsZXRlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkIGNyZWYoY29uc3QgX1RwJiYpID0gZGVsZXRlOworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHJlZmVyZW5jZV93cmFwcGVyPF9UcD4KKyAgICByZWYocmVmZXJlbmNlX3dyYXBwZXI8X1RwPiBfX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gcmVmKF9fdC5nZXQoKSk7IH0KKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSByZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBfVHA+CisgICAgY3JlZihyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+IF9fdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBjcmVmKF9fdC5nZXQoKSk7IH0KKworICAvLyBAfSBncm91cCBmdW5jdG9ycworCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9UeXBlcz4KKyAgICBzdHJ1Y3QgX1BhY2sgOiBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIHNpemVvZi4uLihfVHlwZXMpPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvLCBib29sID0gX0Zyb206OnZhbHVlID09IF9Ubzo6dmFsdWU+CisgICAgc3RydWN0IF9BbGxDb252ZXJ0aWJsZSA6IGZhbHNlX3R5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0Zyb20sIHR5cGVuYW1lLi4uIF9Ubz4KKyAgICBzdHJ1Y3QgX0FsbENvbnZlcnRpYmxlPF9QYWNrPF9Gcm9tLi4uPiwgX1BhY2s8X1RvLi4uPiwgdHJ1ZT4KKyAgICA6IF9fYW5kXzxpc19jb252ZXJ0aWJsZTxfRnJvbSwgX1RvPi4uLj4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICB1c2luZyBfTm90U2FtZSA9IF9fbm90Xzxpc19zYW1lPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8X1RwMT46OnR5cGUsCisJCQkJICAgIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8X1RwMj46OnR5cGU+PjsKKworICAvKioKKyAgICogRGVyaXZlcyBmcm9tIEBjIHVuYXJ5X2Z1bmN0aW9uIG9yIEBjIGJpbmFyeV9mdW5jdGlvbiwgb3IgcGVyaGFwcworICAgKiBub3RoaW5nLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcHJvdmlkZWQuIFRoZQorICAgKiBwcmltYXJ5IHRlbXBsYXRlIGlzIHRoZSBiYXNpcyBjYXNlLCB3aGljaCBkZXJpdmVzIG5vdGhpbmcuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9NYXliZV91bmFyeV9vcl9iaW5hcnlfZnVuY3Rpb24geyB9OworCisgIC8vLyBEZXJpdmVzIGZyb20gQGMgdW5hcnlfZnVuY3Rpb24sIGFzIGFwcHJvcHJpYXRlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9NYXliZV91bmFyeV9vcl9iaW5hcnlfZnVuY3Rpb248X1JlcywgX1QxPgorICAgIDogc3RkOjp1bmFyeV9mdW5jdGlvbjxfVDEsIF9SZXM+IHsgfTsKKworICAvLy8gRGVyaXZlcyBmcm9tIEBjIGJpbmFyeV9mdW5jdGlvbiwgYXMgYXBwcm9wcmlhdGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIF9UMSwgX1QyPgorICAgIDogc3RkOjpiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+IHsgfTsKKworICAvLy8gSW1wbGVtZW50YXRpb24gb2YgQGMgbWVtX2ZuIGZvciBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9NZW1fZm48X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pPgorICAgIDogcHVibGljIF9NYXliZV91bmFyeV9vcl9iaW5hcnlfZnVuY3Rpb248X1JlcywgX0NsYXNzKiwgX0FyZ1R5cGVzLi4uPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyAoX0NsYXNzOjoqX0Z1bmN0b3IpKF9BcmdUeXBlcy4uLik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJX1JlcworCV9NX2NhbGwoX1RwJiYgX19vYmplY3QsIGNvbnN0IHZvbGF0aWxlIF9DbGFzcyAqLAorCQlfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7CisJICByZXR1cm4gKHN0ZDo6Zm9yd2FyZDxfVHA+KF9fb2JqZWN0KS4qX19wbWYpCisJICAgIChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKwlfUmVzCisJX01fY2FsbChfVHAmJiBfX3B0ciwgY29uc3Qgdm9sYXRpbGUgdm9pZCAqLCBfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7IHJldHVybiAoKCpfX3B0cikuKl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8vIFJlcXVpcmUgZWFjaCBfQXJncyB0byBiZSBjb252ZXJ0aWJsZSB0byBjb3JyZXNwb25kaW5nIF9BcmdUeXBlcworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJdXNpbmcgX1JlcXVpcmVWYWxpZEFyZ3MKKwkgID0gX1JlcXVpcmU8X0FsbENvbnZlcnRpYmxlPF9QYWNrPF9BcmdzLi4uPiwgX1BhY2s8X0FyZ1R5cGVzLi4uPj4+OworCisgICAgICAvLyBSZXF1aXJlIGVhY2ggX0FyZ3MgdG8gYmUgY29udmVydGlibGUgdG8gY29ycmVzcG9uZGluZyBfQXJnVHlwZXMKKyAgICAgIC8vIGFuZCByZXF1aXJlIF9UcCBpcyBub3QgX0NsYXNzLCBfQ2xhc3MmIG9yIF9DbGFzcyoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJdXNpbmcgX1JlcXVpcmVWYWxpZEFyZ3MyCisJICA9IF9SZXF1aXJlPF9Ob3RTYW1lPF9DbGFzcywgX1RwPiwgX05vdFNhbWU8X0NsYXNzKiwgX1RwPiwKKwkJICAgICBfQWxsQ29udmVydGlibGU8X1BhY2s8X0FyZ3MuLi4+LCBfUGFjazxfQXJnVHlwZXMuLi4+Pj47CisKKyAgICAgIC8vIFJlcXVpcmUgZWFjaCBfQXJncyB0byBiZSBjb252ZXJ0aWJsZSB0byBjb3JyZXNwb25kaW5nIF9BcmdUeXBlcworICAgICAgLy8gYW5kIHJlcXVpcmUgX1RwIGlzIF9DbGFzcyBvciBkZXJpdmVkIGZyb20gX0NsYXNzCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorCXVzaW5nIF9SZXF1aXJlVmFsaWRBcmdzMworCSAgPSBfUmVxdWlyZTxpc19iYXNlX29mPF9DbGFzcywgX1RwPiwKKwkJICAgICBfQWxsQ29udmVydGlibGU8X1BhY2s8X0FyZ3MuLi4+LCBfUGFjazxfQXJnVHlwZXMuLi4+Pj47CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisKKyAgICAgIGV4cGxpY2l0IF9NZW1fZm4oX0Z1bmN0b3IgX19wbWYpIDogX19wbWYoX19wbWYpIHsgfQorCisgICAgICAvLyBIYW5kbGUgb2JqZWN0cworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczxfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkoX0NsYXNzJiBfX29iamVjdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgdHlwZW5hbWUgX1JlcSA9IF9SZXF1aXJlVmFsaWRBcmdzPF9BcmdzLi4uPj4KKwlfUmVzCisJb3BlcmF0b3IoKShfQ2xhc3MmJiBfX29iamVjdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIChzdGQ6Om1vdmUoX19vYmplY3QpLipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIC8vIEhhbmRsZSBwb2ludGVycworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczxfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkoX0NsYXNzKiBfX29iamVjdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gKF9fb2JqZWN0LT4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLy8gSGFuZGxlIHNtYXJ0IHBvaW50ZXJzLCByZWZlcmVuY2VzIGFuZCBwb2ludGVycyB0byBkZXJpdmVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzLAorCSAgICAgICB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3MyPF9UcCwgX0FyZ3MuLi4+PgorCV9SZXMKKwlvcGVyYXRvcigpKF9UcCYmIF9fb2JqZWN0LCBfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7CisJICByZXR1cm4gX01fY2FsbChzdGQ6OmZvcndhcmQ8X1RwPihfX29iamVjdCksICZfX29iamVjdCwKKwkgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncywKKwkgICAgICAgdHlwZW5hbWUgX1JlcSA9IF9SZXF1aXJlVmFsaWRBcmdzMzxfVHAsIF9BcmdzLi4uPj4KKwlfUmVzCisJb3BlcmF0b3IoKShyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+IF9fcmVmLCBfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7IHJldHVybiBvcGVyYXRvcigpKF9fcmVmLmdldCgpLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX0Z1bmN0b3IgX19wbWY7CisgICAgfTsKKworICAvLy8gSW1wbGVtZW50YXRpb24gb2YgQGMgbWVtX2ZuIGZvciBjb25zdCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9NZW1fZm48X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pIGNvbnN0PgorICAgIDogcHVibGljIF9NYXliZV91bmFyeV9vcl9iaW5hcnlfZnVuY3Rpb248X1JlcywgY29uc3QgX0NsYXNzKiwKKwkJCQkJICAgICBfQXJnVHlwZXMuLi4+CisgICAgeworICAgICAgdHlwZWRlZiBfUmVzIChfQ2xhc3M6OipfRnVuY3RvcikoX0FyZ1R5cGVzLi4uKSBjb25zdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKwlfUmVzCisJX01fY2FsbChfVHAmJiBfX29iamVjdCwgY29uc3Qgdm9sYXRpbGUgX0NsYXNzICosCisJCV9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsKKwkgIHJldHVybiAoc3RkOjpmb3J3YXJkPF9UcD4oX19vYmplY3QpLipfX3BtZikKKwkgICAgKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorCV9SZXMKKwlfTV9jYWxsKF9UcCYmIF9fcHRyLCBjb25zdCB2b2xhdGlsZSB2b2lkICosIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuICgoKl9fcHRyKS4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJdXNpbmcgX1JlcXVpcmVWYWxpZEFyZ3MKKwkgID0gX1JlcXVpcmU8X0FsbENvbnZlcnRpYmxlPF9QYWNrPF9BcmdzLi4uPiwgX1BhY2s8X0FyZ1R5cGVzLi4uPj4+OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorCXVzaW5nIF9SZXF1aXJlVmFsaWRBcmdzMgorCSAgPSBfUmVxdWlyZTxfTm90U2FtZTxfQ2xhc3MsIF9UcD4sIF9Ob3RTYW1lPGNvbnN0IF9DbGFzcyosIF9UcD4sCisJCSAgICAgX0FsbENvbnZlcnRpYmxlPF9QYWNrPF9BcmdzLi4uPiwgX1BhY2s8X0FyZ1R5cGVzLi4uPj4+OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorCXVzaW5nIF9SZXF1aXJlVmFsaWRBcmdzMworCSAgPSBfUmVxdWlyZTxpc19iYXNlX29mPF9DbGFzcywgX1RwPiwKKwkJICAgICBfQWxsQ29udmVydGlibGU8X1BhY2s8X0FyZ3MuLi4+LCBfUGFjazxfQXJnVHlwZXMuLi4+Pj47CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisKKyAgICAgIGV4cGxpY2l0IF9NZW1fZm4oX0Z1bmN0b3IgX19wbWYpIDogX19wbWYoX19wbWYpIHsgfQorCisgICAgICAvLyBIYW5kbGUgb2JqZWN0cworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczxfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkoY29uc3QgX0NsYXNzJiBfX29iamVjdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgdHlwZW5hbWUgX1JlcSA9IF9SZXF1aXJlVmFsaWRBcmdzPF9BcmdzLi4uPj4KKwlfUmVzCisJb3BlcmF0b3IoKShjb25zdCBfQ2xhc3MmJiBfX29iamVjdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIChzdGQ6Om1vdmUoX19vYmplY3QpLipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIC8vIEhhbmRsZSBwb2ludGVycworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczxfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkoY29uc3QgX0NsYXNzKiBfX29iamVjdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gKF9fb2JqZWN0LT4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLy8gSGFuZGxlIHNtYXJ0IHBvaW50ZXJzLCByZWZlcmVuY2VzIGFuZCBwb2ludGVycyB0byBkZXJpdmVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzLAorCSAgICAgICB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3MyPF9UcCwgX0FyZ3MuLi4+PgorCV9SZXMgb3BlcmF0b3IoKShfVHAmJiBfX29iamVjdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIF9NX2NhbGwoc3RkOjpmb3J3YXJkPF9UcD4oX19vYmplY3QpLCAmX19vYmplY3QsCisJICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3MsCisJICAgICAgIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczM8X1RwLCBfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkocmVmZXJlbmNlX3dyYXBwZXI8X1RwPiBfX3JlZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gb3BlcmF0b3IoKShfX3JlZi5nZXQoKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9GdW5jdG9yIF9fcG1mOworICAgIH07CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIEBjIG1lbV9mbiBmb3Igdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfTWVtX2ZuPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSB2b2xhdGlsZT4KKyAgICA6IHB1YmxpYyBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIHZvbGF0aWxlIF9DbGFzcyosCisJCQkJCSAgICAgX0FyZ1R5cGVzLi4uPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyAoX0NsYXNzOjoqX0Z1bmN0b3IpKF9BcmdUeXBlcy4uLikgdm9sYXRpbGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJX1JlcworCV9NX2NhbGwoX1RwJiYgX19vYmplY3QsIGNvbnN0IHZvbGF0aWxlIF9DbGFzcyAqLAorCQlfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7CisJICByZXR1cm4gKHN0ZDo6Zm9yd2FyZDxfVHA+KF9fb2JqZWN0KS4qX19wbWYpCisJICAgIChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKwlfUmVzCisJX01fY2FsbChfVHAmJiBfX3B0ciwgY29uc3Qgdm9sYXRpbGUgdm9pZCAqLCBfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7IHJldHVybiAoKCpfX3B0cikuKl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXVzaW5nIF9SZXF1aXJlVmFsaWRBcmdzCisJICA9IF9SZXF1aXJlPF9BbGxDb252ZXJ0aWJsZTxfUGFjazxfQXJncy4uLj4sIF9QYWNrPF9BcmdUeXBlcy4uLj4+PjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKwl1c2luZyBfUmVxdWlyZVZhbGlkQXJnczIKKwkgID0gX1JlcXVpcmU8X05vdFNhbWU8X0NsYXNzLCBfVHA+LCBfTm90U2FtZTx2b2xhdGlsZSBfQ2xhc3MqLCBfVHA+LAorCQkgICAgIF9BbGxDb252ZXJ0aWJsZTxfUGFjazxfQXJncy4uLj4sIF9QYWNrPF9BcmdUeXBlcy4uLj4+PjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKwl1c2luZyBfUmVxdWlyZVZhbGlkQXJnczMKKwkgID0gX1JlcXVpcmU8aXNfYmFzZV9vZjxfQ2xhc3MsIF9UcD4sCisJCSAgICAgX0FsbENvbnZlcnRpYmxlPF9QYWNrPF9BcmdzLi4uPiwgX1BhY2s8X0FyZ1R5cGVzLi4uPj4+OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworCisgICAgICBleHBsaWNpdCBfTWVtX2ZuKF9GdW5jdG9yIF9fcG1mKSA6IF9fcG1mKF9fcG1mKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3M8X0FyZ3MuLi4+PgorCV9SZXMKKwlvcGVyYXRvcigpKHZvbGF0aWxlIF9DbGFzcyYgX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczxfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkodm9sYXRpbGUgX0NsYXNzJiYgX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsKKwkgIHJldHVybiAoc3RkOjptb3ZlKF9fb2JqZWN0KS4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBIYW5kbGUgcG9pbnRlcnMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3M8X0FyZ3MuLi4+PgorCV9SZXMKKwlvcGVyYXRvcigpKHZvbGF0aWxlIF9DbGFzcyogX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuIChfX29iamVjdC0+Kl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8vIEhhbmRsZSBzbWFydCBwb2ludGVycywgcmVmZXJlbmNlcyBhbmQgcG9pbnRlcnMgdG8gZGVyaXZlZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncywKKwkgICAgICAgdHlwZW5hbWUgX1JlcSA9IF9SZXF1aXJlVmFsaWRBcmdzMjxfVHAsIF9BcmdzLi4uPj4KKwlfUmVzCisJb3BlcmF0b3IoKShfVHAmJiBfX29iamVjdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIF9NX2NhbGwoc3RkOjpmb3J3YXJkPF9UcD4oX19vYmplY3QpLCAmX19vYmplY3QsCisJICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3MsCisJICAgICAgIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczM8X1RwLCBfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkocmVmZXJlbmNlX3dyYXBwZXI8X1RwPiBfX3JlZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gb3BlcmF0b3IoKShfX3JlZi5nZXQoKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9GdW5jdG9yIF9fcG1mOworICAgIH07CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIEBjIG1lbV9mbiBmb3IgY29uc3Qgdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfTWVtX2ZuPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSBjb25zdCB2b2xhdGlsZT4KKyAgICA6IHB1YmxpYyBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIGNvbnN0IHZvbGF0aWxlIF9DbGFzcyosCisJCQkJCSAgICAgX0FyZ1R5cGVzLi4uPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyAoX0NsYXNzOjoqX0Z1bmN0b3IpKF9BcmdUeXBlcy4uLikgY29uc3Qgdm9sYXRpbGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJX1JlcworCV9NX2NhbGwoX1RwJiYgX19vYmplY3QsIGNvbnN0IHZvbGF0aWxlIF9DbGFzcyAqLAorCQlfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7CisJICByZXR1cm4gKHN0ZDo6Zm9yd2FyZDxfVHA+KF9fb2JqZWN0KS4qX19wbWYpCisJICAgIChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKwlfUmVzCisJX01fY2FsbChfVHAmJiBfX3B0ciwgY29uc3Qgdm9sYXRpbGUgdm9pZCAqLCBfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7IHJldHVybiAoKCpfX3B0cikuKl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXVzaW5nIF9SZXF1aXJlVmFsaWRBcmdzCisJICA9IF9SZXF1aXJlPF9BbGxDb252ZXJ0aWJsZTxfUGFjazxfQXJncy4uLj4sIF9QYWNrPF9BcmdUeXBlcy4uLj4+PjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKwl1c2luZyBfUmVxdWlyZVZhbGlkQXJnczIKKwkgID0gX1JlcXVpcmU8X05vdFNhbWU8X0NsYXNzLCBfVHA+LAorCQkgICAgIF9Ob3RTYW1lPGNvbnN0IHZvbGF0aWxlIF9DbGFzcyosIF9UcD4sCisJCSAgICAgX0FsbENvbnZlcnRpYmxlPF9QYWNrPF9BcmdzLi4uPiwgX1BhY2s8X0FyZ1R5cGVzLi4uPj4+OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorCXVzaW5nIF9SZXF1aXJlVmFsaWRBcmdzMworCSAgPSBfUmVxdWlyZTxpc19iYXNlX29mPF9DbGFzcywgX1RwPiwKKwkJICAgICBfQWxsQ29udmVydGlibGU8X1BhY2s8X0FyZ3MuLi4+LCBfUGFjazxfQXJnVHlwZXMuLi4+Pj47CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisKKyAgICAgIGV4cGxpY2l0IF9NZW1fZm4oX0Z1bmN0b3IgX19wbWYpIDogX19wbWYoX19wbWYpIHsgfQorCisgICAgICAvLyBIYW5kbGUgb2JqZWN0cworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczxfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkoY29uc3Qgdm9sYXRpbGUgX0NsYXNzJiBfX29iamVjdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgdHlwZW5hbWUgX1JlcSA9IF9SZXF1aXJlVmFsaWRBcmdzPF9BcmdzLi4uPj4KKwlfUmVzCisJb3BlcmF0b3IoKShjb25zdCB2b2xhdGlsZSBfQ2xhc3MmJiBfX29iamVjdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIChzdGQ6Om1vdmUoX19vYmplY3QpLipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIC8vIEhhbmRsZSBwb2ludGVycworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczxfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkoY29uc3Qgdm9sYXRpbGUgX0NsYXNzKiBfX29iamVjdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gKF9fb2JqZWN0LT4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLy8gSGFuZGxlIHNtYXJ0IHBvaW50ZXJzLCByZWZlcmVuY2VzIGFuZCBwb2ludGVycyB0byBkZXJpdmVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzLAorCSAgICAgICB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3MyPF9UcCwgX0FyZ3MuLi4+PgorCV9SZXMgb3BlcmF0b3IoKShfVHAmJiBfX29iamVjdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIF9NX2NhbGwoc3RkOjpmb3J3YXJkPF9UcD4oX19vYmplY3QpLCAmX19vYmplY3QsCisJICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3MsCisJICAgICAgIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczM8X1RwLCBfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkocmVmZXJlbmNlX3dyYXBwZXI8X1RwPiBfX3JlZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gb3BlcmF0b3IoKShfX3JlZi5nZXQoKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9GdW5jdG9yIF9fcG1mOworICAgIH07CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2w+CisgICAgc3RydWN0IF9NZW1fZm5fY29uc3Rfb3Jfbm9uCisgICAgeworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmIHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9NZW1fZm5fY29uc3Rfb3Jfbm9uPF9UcCwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBfVHAmIHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3M+CisgICAgY2xhc3MgX01lbV9mbjxfUmVzIF9DbGFzczo6Kj4KKyAgICB7CisgICAgICB1c2luZyBfX3BtX3R5cGUgPSBfUmVzIF9DbGFzczo6KjsKKworICAgICAgLy8gVGhpcyBiaXQgb2YgZ2VuaXVzIGlzIGR1ZSB0byBQZXRlciBEaW1vdiwgaW1wcm92ZWQgc2xpZ2h0bHkgYnkKKyAgICAgIC8vIERvdWdsYXMgR3JlZ29yLgorICAgICAgLy8gTWFkZSBsZXNzIGVsZWdhbnQgdG8gc3VwcG9ydCBwZXJmZWN0IGZvcndhcmRpbmcgYW5kIG5vZXhjZXB0LgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCWF1dG8KKwlfTV9jYWxsKF9UcCYmIF9fb2JqZWN0LCBjb25zdCBfQ2xhc3MgKikgY29uc3Qgbm9leGNlcHQKKwktPiBkZWNsdHlwZShzdGQ6OmZvcndhcmQ8X1RwPihfX29iamVjdCkuKnN0ZDo6ZGVjbHZhbDxfX3BtX3R5cGUmPigpKQorCXsgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxfVHA+KF9fb2JqZWN0KS4qX19wbTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKwlhdXRvCisJX01fY2FsbChfVHAmJiBfX29iamVjdCwgX1VwICogY29uc3QgKikgY29uc3Qgbm9leGNlcHQKKwktPiBkZWNsdHlwZSgoKnN0ZDo6Zm9yd2FyZDxfVHA+KF9fb2JqZWN0KSkuKnN0ZDo6ZGVjbHZhbDxfX3BtX3R5cGUmPigpKQorCXsgcmV0dXJuICgqc3RkOjpmb3J3YXJkPF9UcD4oX19vYmplY3QpKS4qX19wbTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJYXV0bworCV9NX2NhbGwoX1RwJiYgX19wdHIsIGNvbnN0IHZvbGF0aWxlIHZvaWQqKSBjb25zdAorCW5vZXhjZXB0KG5vZXhjZXB0KCgqX19wdHIpLipzdGQ6OmRlY2x2YWw8X19wbV90eXBlJj4oKSkpCisJLT4gZGVjbHR5cGUoKCpfX3B0cikuKnN0ZDo6ZGVjbHZhbDxfX3BtX3R5cGUmPigpKQorCXsgcmV0dXJuICgqX19wdHIpLipfX3BtOyB9CisKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgX01lbV9mbihfUmVzIF9DbGFzczo6Kl9fcG0pIG5vZXhjZXB0IDogX19wbShfX3BtKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIF9SZXMmCisgICAgICBvcGVyYXRvcigpKF9DbGFzcyYgX19vYmplY3QpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX29iamVjdC4qX19wbTsgfQorCisgICAgICBjb25zdCBfUmVzJgorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQ2xhc3MmIF9fb2JqZWN0KSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19vYmplY3QuKl9fcG07IH0KKworICAgICAgX1JlcyYmCisgICAgICBvcGVyYXRvcigpKF9DbGFzcyYmIF9fb2JqZWN0KSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpmb3J3YXJkPF9DbGFzcz4oX19vYmplY3QpLipfX3BtOyB9CisKKyAgICAgIGNvbnN0IF9SZXMmJgorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQ2xhc3MmJiBfX29iamVjdCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxjb25zdCBfQ2xhc3M+KF9fb2JqZWN0KS4qX19wbTsgfQorCisgICAgICAvLyBIYW5kbGUgcG9pbnRlcnMKKyAgICAgIF9SZXMmCisgICAgICBvcGVyYXRvcigpKF9DbGFzcyogX19vYmplY3QpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX29iamVjdC0+Kl9fcG07IH0KKworICAgICAgY29uc3QgX1JlcyYKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0NsYXNzKiBfX29iamVjdCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fb2JqZWN0LT4qX19wbTsgfQorCisgICAgICAvLyBIYW5kbGUgc21hcnQgcG9pbnRlcnMgYW5kIGRlcml2ZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlcSA9IF9SZXF1aXJlPF9Ob3RTYW1lPF9DbGFzcyosIF9UcD4+PgorCWF1dG8KKwlvcGVyYXRvcigpKF9UcCYmIF9fdW5rbm93bikgY29uc3QKKwlub2V4Y2VwdChub2V4Y2VwdChzdGQ6OmRlY2x2YWw8X01lbV9mbio+KCktPl9NX2NhbGwKKwkJCSAgKHN0ZDo6Zm9yd2FyZDxfVHA+KF9fdW5rbm93biksICZfX3Vua25vd24pKSkKKwktPiBkZWNsdHlwZSh0aGlzLT5fTV9jYWxsKHN0ZDo6Zm9yd2FyZDxfVHA+KF9fdW5rbm93biksICZfX3Vua25vd24pKQorCXsgcmV0dXJuIF9NX2NhbGwoc3RkOjpmb3J3YXJkPF9UcD4oX191bmtub3duKSwgJl9fdW5rbm93bik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmU8aXNfYmFzZV9vZjxfQ2xhc3MsIF9UcD4+PgorCWF1dG8KKwlvcGVyYXRvcigpKHJlZmVyZW5jZV93cmFwcGVyPF9UcD4gX19yZWYpIGNvbnN0CisJbm9leGNlcHQobm9leGNlcHQoc3RkOjpkZWNsdmFsPF9NZW1fZm4mPigpKF9fcmVmLmdldCgpKSkpCisJLT4gZGVjbHR5cGUoKCp0aGlzKShfX3JlZi5nZXQoKSkpCisJeyByZXR1cm4gKCp0aGlzKShfX3JlZi5nZXQoKSk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfUmVzIF9DbGFzczo6Kl9fcG07CisgICAgfTsKKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIDIwNDguICBVbm5lY2Vzc2FyeSBtZW1fZm4gb3ZlcmxvYWRzCisgIC8qKgorICAgKiAgQGJyaWVmIFJldHVybnMgYSBmdW5jdGlvbiBvYmplY3QgdGhhdCBmb3J3YXJkcyB0byB0aGUgbWVtYmVyCisgICAqICBwb2ludGVyIEBhIHBtLgorICAgKiAgQGluZ3JvdXAgZnVuY3RvcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NsYXNzPgorICAgIGlubGluZSBfTWVtX2ZuPF9UcCBfQ2xhc3M6Oio+CisgICAgbWVtX2ZuKF9UcCBfQ2xhc3M6OiogX19wbSkgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gX01lbV9mbjxfVHAgX0NsYXNzOjoqPihfX3BtKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdHlwZSBfVHAgaXMgYSBmdW5jdGlvbiBvYmplY3QKKyAgICogIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgc3ViZXhwcmVzc2lvbiB3aGVuIGV2YWx1YXRpbmcgY2FsbHMgdG8KKyAgICogIGZ1bmN0aW9uIG9iamVjdHMgcmV0dXJuZWQgYnkgYmluZCgpLiBbVFIxIDMuNi4xXQorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb24KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICAvKioKKyAgICogIEBicmllZiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0eXBlIF9UcCBpcyBhIHBsYWNlaG9sZGVyIGluIGEKKyAgICogIGJpbmQoKSBleHByZXNzaW9uIGFuZCwgaWYgc28sIHdoaWNoIHBsYWNlaG9sZGVyIGl0IGlzLiBbVFIxIDMuNi4yXQorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19wbGFjZWhvbGRlcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGludCwgMD4KKyAgICB7IH07CisKKyAgLyoqIEBicmllZiBUaGUgdHlwZSBvZiBwbGFjZWhvbGRlciBvYmplY3RzIGRlZmluZWQgYnkgbGlic3RkYysrLgorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8aW50IF9OdW0+IHN0cnVjdCBfUGxhY2Vob2xkZXIgeyB9OworCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKiBAbmFtZXNwYWNlIHN0ZDo6cGxhY2Vob2xkZXJzCisgICAqICBAYnJpZWYgSVNPIEMrKzExIGVudGl0aWVzIHN1Yi1uYW1lc3BhY2UgZm9yIGZ1bmN0aW9uYWwuCisgICAqICBAaW5ncm91cCBiaW5kZXJzCisgICAqLworICBuYW1lc3BhY2UgcGxhY2Vob2xkZXJzCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyAgLyogRGVmaW5lIGEgbGFyZ2UgbnVtYmVyIG9mIHBsYWNlaG9sZGVycy4gVGhlcmUgaXMgbm8gd2F5IHRvCisgICAqIHNpbXBsaWZ5IHRoaXMgd2l0aCB2YXJpYWRpYyB0ZW1wbGF0ZXMsIGJlY2F1c2Ugd2UncmUgaW50cm9kdWNpbmcKKyAgICogdW5pcXVlIG5hbWVzIGZvciBlYWNoLgorICAgKi8KKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDE+IF8xOworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8Mj4gXzI7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwzPiBfMzsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDQ+IF80OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8NT4gXzU7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjw2PiBfNjsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDc+IF83OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8OD4gXzg7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjw5PiBfOTsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDEwPiBfMTA7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwxMT4gXzExOworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MTI+IF8xMjsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDEzPiBfMTM7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwxND4gXzE0OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MTU+IF8xNTsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDE2PiBfMTY7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwxNz4gXzE3OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MTg+IF8xODsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDE5PiBfMTk7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwyMD4gXzIwOworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MjE+IF8yMTsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDIyPiBfMjI7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwyMz4gXzIzOworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MjQ+IF8yNDsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDI1PiBfMjU7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwyNj4gXzI2OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8Mjc+IF8yNzsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDI4PiBfMjg7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwyOT4gXzI5OworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfQorCisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIGlzX3BsYWNlaG9sZGVyIHRoYXQgcHJvdmlkZXMgdGhlIHBsYWNlaG9sZGVyCisgICAqICBudW1iZXIgZm9yIHRoZSBwbGFjZWhvbGRlciBvYmplY3RzIGRlZmluZWQgYnkgbGlic3RkYysrLgorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8aW50IF9OdW0+CisgICAgc3RydWN0IGlzX3BsYWNlaG9sZGVyPF9QbGFjZWhvbGRlcjxfTnVtPiA+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8aW50LCBfTnVtPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTxpbnQgX051bT4KKyAgICBzdHJ1Y3QgaXNfcGxhY2Vob2xkZXI8Y29uc3QgX1BsYWNlaG9sZGVyPF9OdW0+ID4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxpbnQsIF9OdW0+CisgICAgeyB9OworCisgIC8qKgorICAgKiBVc2VkIGJ5IF9TYWZlX3R1cGxlX2VsZW1lbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyB0dXBsZQorICAgKiBlbGVtZW50IGF0IHRoaXMgcG9zaXRpb24uCisgICAqLworICBzdHJ1Y3QgX05vX3R1cGxlX2VsZW1lbnQ7CisKKyAgLyoqCisgICAqIEltcGxlbWVudGF0aW9uIGhlbHBlciBmb3IgX1NhZmVfdHVwbGVfZWxlbWVudC4gVGhpcyBwcmltYXJ5CisgICAqIHRlbXBsYXRlIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgaXQgaXMgc2FmZSB0byB1c2UgQGMKKyAgICogdHVwbGVfZWxlbWVudC4KKyAgICovCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUgX1R1cGxlLCBib29sIF9Jc1NhZmU+CisgICAgc3RydWN0IF9TYWZlX3R1cGxlX2VsZW1lbnRfaW1wbAorICAgIDogdHVwbGVfZWxlbWVudDxfX2ksIF9UdXBsZT4geyB9OworCisgIC8qKgorICAgKiBJbXBsZW1lbnRhdGlvbiBoZWxwZXIgZm9yIF9TYWZlX3R1cGxlX2VsZW1lbnQuIFRoaXMgcGFydGlhbAorICAgKiBzcGVjaWFsaXphdGlvbiBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGl0IGlzIG5vdCBzYWZlIHRvIHVzZSBAYworICAgKiB0dXBsZV9lbGVtZW50LiBXZSBqdXN0IHJldHVybiBAYyBfTm9fdHVwbGVfZWxlbWVudC4KKyAgICovCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUgX1R1cGxlPgorICAgIHN0cnVjdCBfU2FmZV90dXBsZV9lbGVtZW50X2ltcGw8X19pLCBfVHVwbGUsIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX05vX3R1cGxlX2VsZW1lbnQgdHlwZTsKKyAgICB9OworCisgIC8qKgorICAgKiBMaWtlIHR1cGxlX2VsZW1lbnQsIGJ1dCByZXR1cm5zIEBjIF9Ob190dXBsZV9lbGVtZW50IHdoZW4KKyAgICogdHVwbGVfZWxlbWVudCB3b3VsZCByZXR1cm4gYW4gZXJyb3IuCisgICAqLworIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUgX1R1cGxlPgorICAgc3RydWN0IF9TYWZlX3R1cGxlX2VsZW1lbnQKKyAgIDogX1NhZmVfdHVwbGVfZWxlbWVudF9pbXBsPF9faSwgX1R1cGxlLAorCQkJICAgICAgKF9faSA8IHR1cGxlX3NpemU8X1R1cGxlPjo6dmFsdWUpPgorICAgeyB9OworCisgIC8qKgorICAgKiAgTWFwcyBhbiBhcmd1bWVudCB0byBiaW5kKCkgaW50byBhbiBhY3R1YWwgYXJndW1lbnQgdG8gdGhlIGJvdW5kCisgICAqICBmdW5jdGlvbiBvYmplY3QgW1RSMSAzLjYuMy81XS4gT25seSB0aGUgZmlyc3QgcGFyYW1ldGVyIHNob3VsZAorICAgKiAgYmUgc3BlY2lmaWVkOiB0aGUgcmVzdCBhcmUgdXNlZCB0byBkZXRlcm1pbmUgYW1vbmcgdGhlIHZhcmlvdXMKKyAgICogIGltcGxlbWVudGF0aW9ucy4gTm90ZSB0aGF0LCBhbHRob3VnaCB0aGlzIGNsYXNzIGlzIGEgZnVuY3Rpb24KKyAgICogIG9iamVjdCwgaXQgaXNuJ3QgZW50aXJlbHkgbm9ybWFsIGJlY2F1c2UgaXQgdGFrZXMgb25seSB0d28KKyAgICogIHBhcmFtZXRlcnMgcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoZQorICAgKiAgYmluZCBleHByZXNzaW9uLiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBib3VuZCBhcmd1bWVudCBhbmQKKyAgICogIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGEgdHVwbGUgY29udGFpbmluZyByZWZlcmVuY2VzIHRvIHRoZQorICAgKiAgcmVzdCBvZiB0aGUgYXJndW1lbnRzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZywKKwkgICBib29sIF9Jc0JpbmRFeHAgPSBpc19iaW5kX2V4cHJlc3Npb248X0FyZz46OnZhbHVlLAorCSAgIGJvb2wgX0lzUGxhY2Vob2xkZXIgPSAoaXNfcGxhY2Vob2xkZXI8X0FyZz46OnZhbHVlID4gMCk+CisgICAgY2xhc3MgX011OworCisgIC8qKgorICAgKiAgSWYgdGhlIGFyZ3VtZW50IGlzIHJlZmVyZW5jZV93cmFwcGVyPF9UcD4sIHJldHVybnMgdGhlCisgICAqICB1bmRlcmx5aW5nIHJlZmVyZW5jZS4gW1RSMSAzLjYuMy81IGJ1bGxldCAxXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9NdTxyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+LCBmYWxzZSwgZmFsc2U+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwJiByZXN1bHRfdHlwZTsKKworICAgICAgLyogTm90ZTogVGhpcyB3b24ndCBhY3R1YWxseSB3b3JrIGZvciBjb25zdCB2b2xhdGlsZQorICAgICAgICogcmVmZXJlbmNlX3dyYXBwZXJzLCBiZWNhdXNlIHJlZmVyZW5jZV93cmFwcGVyOjpnZXQoKSBpcyBjb25zdAorICAgICAgICogYnV0IG5vdCB2b2xhdGlsZS1xdWFsaWZpZWQuIFRoaXMgbWlnaHQgYmUgYSBkZWZlY3QgaW4gdGhlIFRSLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZSZWYsIHR5cGVuYW1lIF9UdXBsZT4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX0NWUmVmJiBfX2FyZywgX1R1cGxlJikgY29uc3Qgdm9sYXRpbGUKKwl7IHJldHVybiBfX2FyZy5nZXQoKTsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBJZiB0aGUgYXJndW1lbnQgaXMgYSBiaW5kIGV4cHJlc3Npb24sIHdlIGludm9rZSB0aGUgdW5kZXJseWluZworICAgKiAgZnVuY3Rpb24gb2JqZWN0IHdpdGggdGhlIHNhbWUgY3YtcXVhbGlmaWVycyBhcyB3ZSBhcmUgZ2l2ZW4gYW5kCisgICAqICBwYXNzIGFsb25nIGFsbCBvZiBvdXIgYXJndW1lbnRzICh1bndyYXBwZWQpLiBbVFIxIDMuNi4zLzUgYnVsbGV0IDJdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorICAgIGNsYXNzIF9NdTxfQXJnLCB0cnVlLCBmYWxzZT4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWQXJnLCB0eXBlbmFtZS4uLiBfQXJncz4KKwlhdXRvCisJb3BlcmF0b3IoKShfQ1ZBcmcmIF9fYXJnLAorCQkgICB0dXBsZTxfQXJncy4uLj4mIF9fdHVwbGUpIGNvbnN0IHZvbGF0aWxlCisJLT4gZGVjbHR5cGUoX19hcmcoZGVjbHZhbDxfQXJncz4oKS4uLikpCisJeworCSAgLy8gQ29uc3RydWN0IGFuIGluZGV4IHR1cGxlIGFuZCBmb3J3YXJkIHRvIF9fY2FsbAorCSAgdHlwZWRlZiB0eXBlbmFtZSBfQnVpbGRfaW5kZXhfdHVwbGU8c2l6ZW9mLi4uKF9BcmdzKT46Ol9fdHlwZQorCSAgICBfSW5kZXhlczsKKwkgIHJldHVybiB0aGlzLT5fX2NhbGwoX19hcmcsIF9fdHVwbGUsIF9JbmRleGVzKCkpOworCX0KKworICAgIHByaXZhdGU6CisgICAgICAvLyBJbnZva2VzIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdCBfX2FyZyBieSB1bnBhY2tpbmcgYWxsCisgICAgICAvLyBvZiB0aGUgYXJndW1lbnRzIGluIHRoZSB0dXBsZS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DVkFyZywgdHlwZW5hbWUuLi4gX0FyZ3MsIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzPgorCWF1dG8KKwlfX2NhbGwoX0NWQXJnJiBfX2FyZywgdHVwbGU8X0FyZ3MuLi4+JiBfX3R1cGxlLAorCSAgICAgICBjb25zdCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+JikgY29uc3Qgdm9sYXRpbGUKKwktPiBkZWNsdHlwZShfX2FyZyhkZWNsdmFsPF9BcmdzPigpLi4uKSkKKwl7CisJICByZXR1cm4gX19hcmcoc3RkOjpmb3J3YXJkPF9BcmdzPihnZXQ8X0luZGV4ZXM+KF9fdHVwbGUpKS4uLik7CisJfQorICAgIH07CisKKyAgLyoqCisgICAqICBJZiB0aGUgYXJndW1lbnQgaXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIE50aCBhcmd1bWVudCwgcmV0dXJucworICAgKiAgYSByZWZlcmVuY2UgdG8gdGhlIE50aCBhcmd1bWVudCB0byB0aGUgYmluZCBmdW5jdGlvbiBvYmplY3QuCisgICAqICBbVFIxIDMuNi4zLzUgYnVsbGV0IDNdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorICAgIGNsYXNzIF9NdTxfQXJnLCBmYWxzZSwgdHJ1ZT4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4gY2xhc3MgcmVzdWx0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZNdSwgdHlwZW5hbWUgX0NWQXJnLCB0eXBlbmFtZSBfVHVwbGU+CisJY2xhc3MgcmVzdWx0PF9DVk11KF9DVkFyZywgX1R1cGxlKT4KKwl7CisJICAvLyBBZGQgYSByZWZlcmVuY2UsIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZG9uZSBmb3IgdXMuCisJICAvLyBUaGlzIGFsbG93cyB1cyB0byBiZSBhIGxpdHRsZSBiaXQgc2xvcHB5IGluIGNvbnN0cnVjdGluZworCSAgLy8gdGhlIHR1cGxlIHRoYXQgd2UgcGFzcyB0byByZXN1bHRfb2Y8Li4uPi4KKwkgIHR5cGVkZWYgdHlwZW5hbWUgX1NhZmVfdHVwbGVfZWxlbWVudDwoaXNfcGxhY2Vob2xkZXI8X0FyZz46OnZhbHVlCisJCQkJCQktIDEpLCBfVHVwbGU+Ojp0eXBlCisJICAgIF9fYmFzZV90eXBlOworCisJcHVibGljOgorCSAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfcnZhbHVlX3JlZmVyZW5jZTxfX2Jhc2VfdHlwZT46OnR5cGUgdHlwZTsKKwl9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHVwbGU+CisJdHlwZW5hbWUgcmVzdWx0PF9NdShfQXJnLCBfVHVwbGUpPjo6dHlwZQorCW9wZXJhdG9yKCkoY29uc3Qgdm9sYXRpbGUgX0FyZyYsIF9UdXBsZSYgX190dXBsZSkgY29uc3Qgdm9sYXRpbGUKKwl7CisJICByZXR1cm4gc3RkOjpmb3J3YXJkPHR5cGVuYW1lIHJlc3VsdDxfTXUoX0FyZywgX1R1cGxlKT46OnR5cGU+KAorCSAgICAgIDo6c3RkOjpnZXQ8KGlzX3BsYWNlaG9sZGVyPF9Bcmc+Ojp2YWx1ZSAtIDEpPihfX3R1cGxlKSk7CisJfQorICAgIH07CisKKyAgLyoqCisgICAqICBJZiB0aGUgYXJndW1lbnQgaXMganVzdCBhIHZhbHVlLCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoYXQKKyAgICogIHZhbHVlLiBUaGUgY3YtcXVhbGlmaWVycyBvbiB0aGUgcmVmZXJlbmNlIGFyZSB0aGUgc2FtZSBhcyB0aGUKKyAgICogIGN2LXF1YWxpZmllcnMgb24gdGhlIF9NdSBvYmplY3QuIFtUUjEgMy42LjMvNSBidWxsZXQgNF0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgY2xhc3MgX011PF9BcmcsIGZhbHNlLCBmYWxzZT4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4gc3RydWN0IHJlc3VsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWTXUsIHR5cGVuYW1lIF9DVkFyZywgdHlwZW5hbWUgX1R1cGxlPgorCXN0cnVjdCByZXN1bHQ8X0NWTXUoX0NWQXJnLCBfVHVwbGUpPgorCXsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X0NWQXJnPjo6dHlwZSB0eXBlOworCX07CisKKyAgICAgIC8vIFBpY2sgdXAgdGhlIGN2LXF1YWxpZmllcnMgb2YgdGhlIGFyZ3VtZW50CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZBcmcsIHR5cGVuYW1lIF9UdXBsZT4KKwlfQ1ZBcmcmJgorCW9wZXJhdG9yKCkoX0NWQXJnJiYgX19hcmcsIF9UdXBsZSYpIGNvbnN0IHZvbGF0aWxlCisJeyByZXR1cm4gc3RkOjpmb3J3YXJkPF9DVkFyZz4oX19hcmcpOyB9CisgICAgfTsKKworICAvKioKKyAgICogIE1hcHMgbWVtYmVyIHBvaW50ZXJzIGludG8gaW5zdGFuY2VzIG9mIF9NZW1fZm4gYnV0IGxlYXZlcyBhbGwKKyAgICogIG90aGVyIGZ1bmN0aW9uIG9iamVjdHMgdW50b3VjaGVkLiBVc2VkIGJ5IHRyMTo6YmluZCgpLiBUaGUKKyAgICogIHByaW1hcnkgdGVtcGxhdGUgaGFuZGxlcyB0aGUgbm9uLS1tZW1iZXItcG9pbnRlciBjYXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwIHR5cGU7CisKKyAgICAgIHN0YXRpYyBjb25zdCBfVHAmCisgICAgICBfX2RvX3dyYXAoY29uc3QgX1RwJiBfX3gpCisgICAgICB7IHJldHVybiBfX3g7IH0KKworICAgICAgc3RhdGljIF9UcCYmCisgICAgICBfX2RvX3dyYXAoX1RwJiYgX194KQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwJiY+KF9feCk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgTWFwcyBtZW1iZXIgcG9pbnRlcnMgaW50byBpbnN0YW5jZXMgb2YgX01lbV9mbiBidXQgbGVhdmVzIGFsbAorICAgKiAgb3RoZXIgZnVuY3Rpb24gb2JqZWN0cyB1bnRvdWNoZWQuIFVzZWQgYnkgdHIxOjpiaW5kKCkuIFRoaXMKKyAgICogIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaGFuZGxlcyB0aGUgbWVtYmVyIHBvaW50ZXIgY2FzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NsYXNzPgorICAgIHN0cnVjdCBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcjxfVHAgX0NsYXNzOjoqPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX01lbV9mbjxfVHAgX0NsYXNzOjoqPiB0eXBlOworCisgICAgICBzdGF0aWMgdHlwZQorICAgICAgX19kb193cmFwKF9UcCBfQ2xhc3M6OiogX19wbSkKKyAgICAgIHsgcmV0dXJuIHR5cGUoX19wbSk7IH0KKyAgICB9OworCisgIC8vIFNwZWNpYWxpemF0aW9uIG5lZWRlZCB0byBwcmV2ZW50ICJmb3JtaW5nIHJlZmVyZW5jZSB0byB2b2lkIiBlcnJvcnMgd2hlbgorICAvLyBiaW5kPHZvaWQ+KCkgaXMgY2FsbGVkLCBiZWNhdXNlIGFyZ3VtZW50IGRlZHVjdGlvbiBpbnN0YW50aWF0ZXMKKyAgLy8gX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8dm9pZD4gb3V0c2lkZSB0aGUgaW1tZWRpYXRlIGNvbnRleHQgd2hlcmUKKyAgLy8gU0ZJTkFFIGFwcGxpZXMuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8dm9pZD4KKyAgICB7CisgICAgICB0eXBlZGVmIHZvaWQgdHlwZTsKKyAgICB9OworCisgIC8vIHN0ZDo6Z2V0PEk+IGZvciB2b2xhdGlsZS1xdWFsaWZpZWQgdHVwbGVzCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbmQsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICBpbmxpbmUgYXV0bworICAgIF9fdm9sZ2V0KHZvbGF0aWxlIHR1cGxlPF9UcC4uLj4mIF9fdHVwbGUpCisgICAgLT4gdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSW5kLCB0dXBsZTxfVHAuLi4+Pjo6dHlwZSB2b2xhdGlsZSYKKyAgICB7IHJldHVybiBzdGQ6OmdldDxfSW5kPihjb25zdF9jYXN0PHR1cGxlPF9UcC4uLj4mPihfX3R1cGxlKSk7IH0KKworICAvLyBzdGQ6OmdldDxJPiBmb3IgY29uc3Qtdm9sYXRpbGUtcXVhbGlmaWVkIHR1cGxlcworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW5kLCB0eXBlbmFtZS4uLiBfVHA+CisgICAgaW5saW5lIGF1dG8KKyAgICBfX3ZvbGdldChjb25zdCB2b2xhdGlsZSB0dXBsZTxfVHAuLi4+JiBfX3R1cGxlKQorICAgIC0+IHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0luZCwgdHVwbGU8X1RwLi4uPj46OnR5cGUgY29uc3Qgdm9sYXRpbGUmCisgICAgeyByZXR1cm4gc3RkOjpnZXQ8X0luZD4oY29uc3RfY2FzdDxjb25zdCB0dXBsZTxfVHAuLi4+Jj4oX190dXBsZSkpOyB9CisKKyAgLy8vIFR5cGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdCByZXR1cm5lZCBmcm9tIGJpbmQoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgX0JpbmQ7CisKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQm91bmRfYXJncz4KKyAgICBjbGFzcyBfQmluZDxfRnVuY3RvcihfQm91bmRfYXJncy4uLik+CisgICAgOiBwdWJsaWMgX1dlYWtfcmVzdWx0X3R5cGU8X0Z1bmN0b3I+CisgICAgeworICAgICAgdHlwZWRlZiBfQmluZCBfX3NlbGZfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0J1aWxkX2luZGV4X3R1cGxlPHNpemVvZi4uLihfQm91bmRfYXJncyk+OjpfX3R5cGUKKwlfQm91bmRfaW5kZXhlczsKKworICAgICAgX0Z1bmN0b3IgX01fZjsKKyAgICAgIHR1cGxlPF9Cb3VuZF9hcmdzLi4uPiBfTV9ib3VuZF9hcmdzOworCisgICAgICAvLyBDYWxsIHVucXVhbGlmaWVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZS4uLiBfQXJncywgc3RkOjpzaXplX3QuLi4gX0luZGV4ZXM+CisJX1Jlc3VsdAorCV9fY2FsbCh0dXBsZTxfQXJncy4uLj4mJiBfX2FyZ3MsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4pCisJeworCSAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisJCSAgICAgIChnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIC8vIENhbGwgYXMgY29uc3QKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lLi4uIF9BcmdzLCBzdGQ6OnNpemVfdC4uLiBfSW5kZXhlcz4KKwlfUmVzdWx0CisJX19jYWxsX2ModHVwbGU8X0FyZ3MuLi4+JiYgX19hcmdzLCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KSBjb25zdAorCXsKKwkgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorCQkgICAgICAoZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBDYWxsIGFzIHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZS4uLiBfQXJncywgc3RkOjpzaXplX3QuLi4gX0luZGV4ZXM+CisJX1Jlc3VsdAorCV9fY2FsbF92KHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywKKwkJIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4pIHZvbGF0aWxlCisJeworCSAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisJCSAgICAgIChfX3ZvbGdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworCX0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdCB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUuLi4gX0FyZ3MsIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzPgorCV9SZXN1bHQKKwlfX2NhbGxfY192KHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywKKwkJICAgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPikgY29uc3Qgdm9sYXRpbGUKKwl7CisJICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkJICAgICAgKF9fdm9sZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgIHB1YmxpYzoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWV4cGxpY2l0IF9CaW5kKGNvbnN0IF9GdW5jdG9yJiBfX2YsIF9BcmdzJiYuLi4gX19hcmdzKQorCTogX01fZihfX2YpLCBfTV9ib3VuZF9hcmdzKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJZXhwbGljaXQgX0JpbmQoX0Z1bmN0b3ImJiBfX2YsIF9BcmdzJiYuLi4gX19hcmdzKQorCTogX01fZihzdGQ6Om1vdmUoX19mKSksIF9NX2JvdW5kX2FyZ3Moc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKQorCXsgfQorCisgICAgICBfQmluZChjb25zdCBfQmluZCYpID0gZGVmYXVsdDsKKworICAgICAgX0JpbmQoX0JpbmQmJiBfX2IpCisgICAgICA6IF9NX2Yoc3RkOjptb3ZlKF9fYi5fTV9mKSksIF9NX2JvdW5kX2FyZ3Moc3RkOjptb3ZlKF9fYi5fTV9ib3VuZF9hcmdzKSkKKyAgICAgIHsgfQorCisgICAgICAvLyBDYWxsIHVucXVhbGlmaWVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgdHlwZW5hbWUgX1Jlc3VsdAorCT0gZGVjbHR5cGUoIHN0ZDo6ZGVjbHZhbDxfRnVuY3Rvcj4oKSgKKwkgICAgICBfTXU8X0JvdW5kX2FyZ3M+KCkoIHN0ZDo6ZGVjbHZhbDxfQm91bmRfYXJncyY+KCksCisJCQkJICBzdGQ6OmRlY2x2YWw8dHVwbGU8X0FyZ3MuLi4+Jj4oKSApLi4uICkgKT4KKwlfUmVzdWx0CisJb3BlcmF0b3IoKShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICByZXR1cm4gdGhpcy0+X19jYWxsPF9SZXN1bHQ+KAorCSAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCSAgICAgIF9Cb3VuZF9pbmRleGVzKCkpOworCX0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXN1bHQKKwk9IGRlY2x0eXBlKCBzdGQ6OmRlY2x2YWw8dHlwZW5hbWUgZW5hYmxlX2lmPChzaXplb2YuLi4oX0FyZ3MpID49IDApLAorCQkgICAgICAgdHlwZW5hbWUgYWRkX2NvbnN0PF9GdW5jdG9yPjo6dHlwZT46OnR5cGU+KCkoCisJICAgICAgX011PF9Cb3VuZF9hcmdzPigpKCBzdGQ6OmRlY2x2YWw8Y29uc3QgX0JvdW5kX2FyZ3MmPigpLAorCQkJCSAgc3RkOjpkZWNsdmFsPHR1cGxlPF9BcmdzLi4uPiY+KCkgKS4uLiApICk+CisJX1Jlc3VsdAorCW9wZXJhdG9yKCkoX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIHRoaXMtPl9fY2FsbF9jPF9SZXN1bHQ+KAorCSAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCSAgICAgIF9Cb3VuZF9pbmRleGVzKCkpOworCX0KKworICAgICAgLy8gQ2FsbCBhcyB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXN1bHQKKwk9IGRlY2x0eXBlKCBzdGQ6OmRlY2x2YWw8dHlwZW5hbWUgZW5hYmxlX2lmPChzaXplb2YuLi4oX0FyZ3MpID49IDApLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBhZGRfdm9sYXRpbGU8X0Z1bmN0b3I+Ojp0eXBlPjo6dHlwZT4oKSgKKwkgICAgICBfTXU8X0JvdW5kX2FyZ3M+KCkoIHN0ZDo6ZGVjbHZhbDx2b2xhdGlsZSBfQm91bmRfYXJncyY+KCksCisJCQkJICBzdGQ6OmRlY2x2YWw8dHVwbGU8X0FyZ3MuLi4+Jj4oKSApLi4uICkgKT4KKwlfUmVzdWx0CisJb3BlcmF0b3IoKShfQXJncyYmLi4uIF9fYXJncykgdm9sYXRpbGUKKwl7CisJICByZXR1cm4gdGhpcy0+X19jYWxsX3Y8X1Jlc3VsdD4oCisJICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksCisJICAgICAgX0JvdW5kX2luZGV4ZXMoKSk7CisJfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0IHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgdHlwZW5hbWUgX1Jlc3VsdAorCT0gZGVjbHR5cGUoIHN0ZDo6ZGVjbHZhbDx0eXBlbmFtZSBlbmFibGVfaWY8KHNpemVvZi4uLihfQXJncykgPj0gMCksCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGFkZF9jdjxfRnVuY3Rvcj46OnR5cGU+Ojp0eXBlPigpKAorCSAgICAgIF9NdTxfQm91bmRfYXJncz4oKSggc3RkOjpkZWNsdmFsPGNvbnN0IHZvbGF0aWxlIF9Cb3VuZF9hcmdzJj4oKSwKKwkJCQkgIHN0ZDo6ZGVjbHZhbDx0dXBsZTxfQXJncy4uLj4mPigpICkuLi4gKSApPgorCV9SZXN1bHQKKwlvcGVyYXRvcigpKF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdCB2b2xhdGlsZQorCXsKKwkgIHJldHVybiB0aGlzLT5fX2NhbGxfY192PF9SZXN1bHQ+KAorCSAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCSAgICAgIF9Cb3VuZF9pbmRleGVzKCkpOworCX0KKyAgICB9OworCisgIC8vLyBUeXBlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QgcmV0dXJuZWQgZnJvbSBiaW5kPFI+KCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IF9CaW5kX3Jlc3VsdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0JvdW5kX2FyZ3M+CisgICAgY2xhc3MgX0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9GdW5jdG9yKF9Cb3VuZF9hcmdzLi4uKT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9CaW5kX3Jlc3VsdCBfX3NlbGZfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0J1aWxkX2luZGV4X3R1cGxlPHNpemVvZi4uLihfQm91bmRfYXJncyk+OjpfX3R5cGUKKwlfQm91bmRfaW5kZXhlczsKKworICAgICAgX0Z1bmN0b3IgX01fZjsKKyAgICAgIHR1cGxlPF9Cb3VuZF9hcmdzLi4uPiBfTV9ib3VuZF9hcmdzOworCisgICAgICAvLyBzZmluYWUgdHlwZXMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisJc3RydWN0IF9fZW5hYmxlX2lmX3ZvaWQgOiBlbmFibGVfaWY8aXNfdm9pZDxfUmVzPjo6dmFsdWUsIGludD4geyB9OworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKwlzdHJ1Y3QgX19kaXNhYmxlX2lmX3ZvaWQgOiBlbmFibGVfaWY8IWlzX3ZvaWQ8X1Jlcz46OnZhbHVlLCBpbnQ+IHsgfTsKKworICAgICAgLy8gQ2FsbCB1bnF1YWxpZmllZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3MsIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzPgorCV9SZXN1bHQKKwlfX2NhbGwodHVwbGU8X0FyZ3MuLi4+JiYgX19hcmdzLCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+LAorCSAgICB0eXBlbmFtZSBfX2Rpc2FibGVfaWZfdm9pZDxfUmVzPjo6dHlwZSA9IDApCisJeworCSAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisJCSAgICAgIChnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIC8vIENhbGwgdW5xdWFsaWZpZWQsIHJldHVybiB2b2lkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJncywgc3RkOjpzaXplX3QuLi4gX0luZGV4ZXM+CisJdm9pZAorCV9fY2FsbCh0dXBsZTxfQXJncy4uLj4mJiBfX2FyZ3MsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4sCisJICAgIHR5cGVuYW1lIF9fZW5hYmxlX2lmX3ZvaWQ8X1Jlcz46OnR5cGUgPSAwKQorCXsKKwkgIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisJICAgICAgIChnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIC8vIENhbGwgYXMgY29uc3QKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzLCBzdGQ6OnNpemVfdC4uLiBfSW5kZXhlcz4KKwlfUmVzdWx0CisJX19jYWxsKHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiwKKwkgICAgdHlwZW5hbWUgX19kaXNhYmxlX2lmX3ZvaWQ8X1Jlcz46OnR5cGUgPSAwKSBjb25zdAorCXsKKwkgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorCQkgICAgICAoZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0LCByZXR1cm4gdm9pZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3MsIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzPgorCXZvaWQKKwlfX2NhbGwodHVwbGU8X0FyZ3MuLi4+JiYgX19hcmdzLCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+LAorCSAgICB0eXBlbmFtZSBfX2VuYWJsZV9pZl92b2lkPF9SZXM+Ojp0eXBlID0gMCkgY29uc3QKKwl7CisJICBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorCSAgICAgICAoZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgIF9fYXJncykuLi4pOworCX0KKworICAgICAgLy8gQ2FsbCBhcyB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3MsIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzPgorCV9SZXN1bHQKKwlfX2NhbGwodHVwbGU8X0FyZ3MuLi4+JiYgX19hcmdzLCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+LAorCSAgICB0eXBlbmFtZSBfX2Rpc2FibGVfaWZfdm9pZDxfUmVzPjo6dHlwZSA9IDApIHZvbGF0aWxlCisJeworCSAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisJCSAgICAgIChfX3ZvbGdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworCX0KKworICAgICAgLy8gQ2FsbCBhcyB2b2xhdGlsZSwgcmV0dXJuIHZvaWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzLCBzdGQ6OnNpemVfdC4uLiBfSW5kZXhlcz4KKwl2b2lkCisJX19jYWxsKHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiwKKwkgICAgdHlwZW5hbWUgX19lbmFibGVfaWZfdm9pZDxfUmVzPjo6dHlwZSA9IDApIHZvbGF0aWxlCisJeworCSAgX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkgICAgICAgKF9fdm9sZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0IHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJncywgc3RkOjpzaXplX3QuLi4gX0luZGV4ZXM+CisJX1Jlc3VsdAorCV9fY2FsbCh0dXBsZTxfQXJncy4uLj4mJiBfX2FyZ3MsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4sCisJICAgIHR5cGVuYW1lIF9fZGlzYWJsZV9pZl92b2lkPF9SZXM+Ojp0eXBlID0gMCkgY29uc3Qgdm9sYXRpbGUKKwl7CisJICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkJICAgICAgKF9fdm9sZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0IHZvbGF0aWxlLCByZXR1cm4gdm9pZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3MsIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzPgorCXZvaWQKKwlfX2NhbGwodHVwbGU8X0FyZ3MuLi4+JiYgX19hcmdzLAorCSAgICAgICBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+LAorCSAgICB0eXBlbmFtZSBfX2VuYWJsZV9pZl92b2lkPF9SZXM+Ojp0eXBlID0gMCkgY29uc3Qgdm9sYXRpbGUKKwl7CisJICBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorCSAgICAgICAoX192b2xnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9SZXN1bHQgcmVzdWx0X3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWV4cGxpY2l0IF9CaW5kX3Jlc3VsdChjb25zdCBfRnVuY3RvciYgX19mLCBfQXJncyYmLi4uIF9fYXJncykKKwk6IF9NX2YoX19mKSwgX01fYm91bmRfYXJncyhzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWV4cGxpY2l0IF9CaW5kX3Jlc3VsdChfRnVuY3RvciYmIF9fZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJOiBfTV9mKHN0ZDo6bW92ZShfX2YpKSwgX01fYm91bmRfYXJncyhzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pCisJeyB9CisKKyAgICAgIF9CaW5kX3Jlc3VsdChjb25zdCBfQmluZF9yZXN1bHQmKSA9IGRlZmF1bHQ7CisKKyAgICAgIF9CaW5kX3Jlc3VsdChfQmluZF9yZXN1bHQmJiBfX2IpCisgICAgICA6IF9NX2Yoc3RkOjptb3ZlKF9fYi5fTV9mKSksIF9NX2JvdW5kX2FyZ3Moc3RkOjptb3ZlKF9fYi5fTV9ib3VuZF9hcmdzKSkKKyAgICAgIHsgfQorCisgICAgICAvLyBDYWxsIHVucXVhbGlmaWVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgcmV0dXJuIHRoaXMtPl9fY2FsbDxfUmVzdWx0PigKKwkgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwKKwkgICAgICBfQm91bmRfaW5kZXhlcygpKTsKKwl9CisKKyAgICAgIC8vIENhbGwgYXMgY29uc3QKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7CisJICByZXR1cm4gdGhpcy0+X19jYWxsPF9SZXN1bHQ+KAorCSAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCSAgICAgIF9Cb3VuZF9pbmRleGVzKCkpOworCX0KKworICAgICAgLy8gQ2FsbCBhcyB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9BcmdzJiYuLi4gX19hcmdzKSB2b2xhdGlsZQorCXsKKwkgIHJldHVybiB0aGlzLT5fX2NhbGw8X1Jlc3VsdD4oCisJICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksCisJICAgICAgX0JvdW5kX2luZGV4ZXMoKSk7CisJfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0IHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0IHZvbGF0aWxlCisJeworCSAgcmV0dXJuIHRoaXMtPl9fY2FsbDxfUmVzdWx0PigKKwkgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwKKwkgICAgICBfQm91bmRfaW5kZXhlcygpKTsKKwl9CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBDbGFzcyB0ZW1wbGF0ZSBfQmluZCBpcyBhbHdheXMgYSBiaW5kIGV4cHJlc3Npb24uCisgICAqICBAaW5ncm91cCBiaW5kZXJzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248X0JpbmQ8X1NpZ25hdHVyZT4gPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ2xhc3MgdGVtcGxhdGUgX0JpbmQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IF9CaW5kPF9TaWduYXR1cmU+ID4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIENsYXNzIHRlbXBsYXRlIF9CaW5kIGlzIGFsd2F5cyBhIGJpbmQgZXhwcmVzc2lvbi4KKyAgICogIEBpbmdyb3VwIGJpbmRlcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjx2b2xhdGlsZSBfQmluZDxfU2lnbmF0dXJlPiA+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvKioKKyAgICogIEBicmllZiBDbGFzcyB0ZW1wbGF0ZSBfQmluZCBpcyBhbHdheXMgYSBiaW5kIGV4cHJlc3Npb24uCisgICAqICBAaW5ncm91cCBiaW5kZXJzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248Y29uc3Qgdm9sYXRpbGUgX0JpbmQ8X1NpZ25hdHVyZT4+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvKioKKyAgICogIEBicmllZiBDbGFzcyB0ZW1wbGF0ZSBfQmluZF9yZXN1bHQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPF9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfU2lnbmF0dXJlPj4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIENsYXNzIHRlbXBsYXRlIF9CaW5kX3Jlc3VsdCBpcyBhbHdheXMgYSBiaW5kIGV4cHJlc3Npb24uCisgICAqICBAaW5ncm91cCBiaW5kZXJzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248Y29uc3QgX0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ2xhc3MgdGVtcGxhdGUgX0JpbmRfcmVzdWx0IGlzIGFsd2F5cyBhIGJpbmQgZXhwcmVzc2lvbi4KKyAgICogIEBpbmdyb3VwIGJpbmRlcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjx2b2xhdGlsZSBfQmluZF9yZXN1bHQ8X1Jlc3VsdCwgX1NpZ25hdHVyZT4+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvKioKKyAgICogIEBicmllZiBDbGFzcyB0ZW1wbGF0ZSBfQmluZF9yZXN1bHQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IHZvbGF0aWxlIF9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfU2lnbmF0dXJlPj4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vIFRyYWl0IHR5cGUgdXNlZCB0byByZW1vdmUgc3RkOjpiaW5kKCkgZnJvbSBvdmVybG9hZCBzZXQgdmlhIFNGSU5BRQorICAvLyB3aGVuIGZpcnN0IGFyZ3VtZW50IGhhcyBpbnRlZ2VyIHR5cGUsIHNvIHRoYXQgc3RkOjpiaW5kKCkgd2lsbAorICAvLyBub3QgYmUgYSBiZXR0ZXIgbWF0Y2ggdGhhbiA6OmJpbmQoKSBmcm9tIHRoZSBCU0QgU29ja2V0cyBBUEkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMiA9IHR5cGVuYW1lIGRlY2F5PF9UcD46OnR5cGU+CisgICAgdXNpbmcgX19pc19zb2NrZXRsaWtlID0gX19vcl88aXNfaW50ZWdyYWw8X1RwMj4sIGlzX2VudW08X1RwMj4+OworCisgIHRlbXBsYXRlPGJvb2wgX1NvY2tldExpa2UsIHR5cGVuYW1lIF9GdW5jLCB0eXBlbmFtZS4uLiBfQm91bmRBcmdzPgorICAgIHN0cnVjdCBfQmluZF9oZWxwZXIKKyAgICB7CisgICAgICB0eXBlZGVmIF9NYXliZV93cmFwX21lbWJlcl9wb2ludGVyPHR5cGVuYW1lIGRlY2F5PF9GdW5jPjo6dHlwZT4KKwlfX21heWJlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbWF5YmVfdHlwZTo6dHlwZSBfX2Z1bmNfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0JpbmQ8X19mdW5jX3R5cGUodHlwZW5hbWUgZGVjYXk8X0JvdW5kQXJncz46OnR5cGUuLi4pPiB0eXBlOworICAgIH07CisKKyAgLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgaXNfc29ja2V0bGlrZSA9PSB0cnVlLCBkb2VzIG5vdCBkZWZpbmUKKyAgLy8gbmVzdGVkIHR5cGUgc28gc3RkOjpiaW5kKCkgd2lsbCBub3QgcGFydGljaXBhdGUgaW4gb3ZlcmxvYWQgcmVzb2x1dGlvbgorICAvLyB3aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtaWdodCBiZSBhIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jLCB0eXBlbmFtZS4uLiBfQm91bmRBcmdzPgorICAgIHN0cnVjdCBfQmluZF9oZWxwZXI8dHJ1ZSwgX0Z1bmMsIF9Cb3VuZEFyZ3MuLi4+CisgICAgeyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIEZ1bmN0aW9uIHRlbXBsYXRlIGZvciBzdGQ6OmJpbmQuCisgICAqICBAaW5ncm91cCBiaW5kZXJzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYywgdHlwZW5hbWUuLi4gX0JvdW5kQXJncz4KKyAgICBpbmxpbmUgdHlwZW5hbWUKKyAgICBfQmluZF9oZWxwZXI8X19pc19zb2NrZXRsaWtlPF9GdW5jPjo6dmFsdWUsIF9GdW5jLCBfQm91bmRBcmdzLi4uPjo6dHlwZQorICAgIGJpbmQoX0Z1bmMmJiBfX2YsIF9Cb3VuZEFyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgdHlwZWRlZiBfQmluZF9oZWxwZXI8ZmFsc2UsIF9GdW5jLCBfQm91bmRBcmdzLi4uPiBfX2hlbHBlcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2hlbHBlcl90eXBlOjpfX21heWJlX3R5cGUgX19tYXliZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2hlbHBlcl90eXBlOjp0eXBlIF9fcmVzdWx0X3R5cGU7CisgICAgICByZXR1cm4gX19yZXN1bHRfdHlwZShfX21heWJlX3R5cGU6Ol9fZG9fd3JhcChzdGQ6OmZvcndhcmQ8X0Z1bmM+KF9fZikpLAorCQkJICAgc3RkOjpmb3J3YXJkPF9Cb3VuZEFyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfRnVuYywgdHlwZW5hbWUuLi4gX0JvdW5kQXJncz4KKyAgICBzdHJ1Y3QgX0JpbmRyZXNfaGVscGVyCisgICAgeworICAgICAgdHlwZWRlZiBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcjx0eXBlbmFtZSBkZWNheTxfRnVuYz46OnR5cGU+CisJX19tYXliZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21heWJlX3R5cGU6OnR5cGUgX19mdW5jdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIF9CaW5kX3Jlc3VsdDxfUmVzdWx0LAorCQkJICAgX19mdW5jdG9yX3R5cGUodHlwZW5hbWUgZGVjYXk8X0JvdW5kQXJncz46OnR5cGUuLi4pPgorCXR5cGU7CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBGdW5jdGlvbiB0ZW1wbGF0ZSBmb3Igc3RkOjpiaW5kPFI+LgorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX0Z1bmMsIHR5cGVuYW1lLi4uIF9Cb3VuZEFyZ3M+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgX0JpbmRyZXNfaGVscGVyPF9SZXN1bHQsIF9GdW5jLCBfQm91bmRBcmdzLi4uPjo6dHlwZQorICAgIGJpbmQoX0Z1bmMmJiBfX2YsIF9Cb3VuZEFyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgdHlwZWRlZiBfQmluZHJlc19oZWxwZXI8X1Jlc3VsdCwgX0Z1bmMsIF9Cb3VuZEFyZ3MuLi4+IF9faGVscGVyX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faGVscGVyX3R5cGU6Ol9fbWF5YmVfdHlwZSBfX21heWJlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faGVscGVyX3R5cGU6OnR5cGUgX19yZXN1bHRfdHlwZTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdF90eXBlKF9fbWF5YmVfdHlwZTo6X19kb193cmFwKHN0ZDo6Zm9yd2FyZDxfRnVuYz4oX19mKSksCisJCQkgICBzdGQ6OmZvcndhcmQ8X0JvdW5kQXJncz4oX19hcmdzKS4uLik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IF9CaW5kX3NpbXBsZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2FsbGFibGUsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfQmluZF9zaW1wbGU8X0NhbGxhYmxlKF9BcmdzLi4uKT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlc3VsdF9vZjxfQ2FsbGFibGUoX0FyZ3MuLi4pPjo6dHlwZSByZXN1bHRfdHlwZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgICAgICAgICBlbmFibGVfaWY8IHNpemVvZi4uLihfQXJncykgPT0gc2l6ZW9mLi4uKF9BcmdzMik+Ojp0eXBlPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBfQmluZF9zaW1wbGUoY29uc3QgX0NhbGxhYmxlJiBfX2NhbGxhYmxlLCBfQXJnczImJi4uLiBfX2FyZ3MpCisgICAgICAgIDogX01fYm91bmQoX19jYWxsYWJsZSwgc3RkOjpmb3J3YXJkPF9BcmdzMj4oX19hcmdzKS4uLikKKyAgICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzMiwgdHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICAgICAgICAgZW5hYmxlX2lmPCBzaXplb2YuLi4oX0FyZ3MpID09IHNpemVvZi4uLihfQXJnczIpPjo6dHlwZT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgX0JpbmRfc2ltcGxlKF9DYWxsYWJsZSYmIF9fY2FsbGFibGUsIF9BcmdzMiYmLi4uIF9fYXJncykKKyAgICAgICAgOiBfTV9ib3VuZChzdGQ6Om1vdmUoX19jYWxsYWJsZSksIHN0ZDo6Zm9yd2FyZDxfQXJnczI+KF9fYXJncykuLi4pCisgICAgICAgIHsgfQorCisgICAgICBfQmluZF9zaW1wbGUoY29uc3QgX0JpbmRfc2ltcGxlJikgPSBkZWZhdWx0OworICAgICAgX0JpbmRfc2ltcGxlKF9CaW5kX3NpbXBsZSYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKCkKKyAgICAgIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQnVpbGRfaW5kZXhfdHVwbGU8c2l6ZW9mLi4uKF9BcmdzKT46Ol9fdHlwZSBfSW5kaWNlczsKKyAgICAgICAgcmV0dXJuIF9NX2ludm9rZShfSW5kaWNlcygpKTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisKKyAgICAgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90Li4uIF9JbmRpY2VzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8X0NhbGxhYmxlKF9BcmdzLi4uKT46OnR5cGUKKyAgICAgICAgX01faW52b2tlKF9JbmRleF90dXBsZTxfSW5kaWNlcy4uLj4pCisgICAgICAgIHsKKwkgIC8vIHN0ZDo6YmluZCBhbHdheXMgZm9yd2FyZHMgYm91bmQgYXJndW1lbnRzIGFzIGx2YWx1ZXMsCisJICAvLyBidXQgdGhpcyB0eXBlIGNhbiBjYWxsIGZ1bmN0aW9ucyB3aGljaCBvbmx5IGFjY2VwdCBydmFsdWVzLgorICAgICAgICAgIHJldHVybiBzdGQ6OmZvcndhcmQ8X0NhbGxhYmxlPihzdGQ6OmdldDwwPihfTV9ib3VuZCkpKAorICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KHN0ZDo6Z2V0PF9JbmRpY2VzKzE+KF9NX2JvdW5kKSkuLi4pOworICAgICAgICB9CisKKyAgICAgIHN0ZDo6dHVwbGU8X0NhbGxhYmxlLCBfQXJncy4uLj4gX01fYm91bmQ7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYywgdHlwZW5hbWUuLi4gX0JvdW5kQXJncz4KKyAgICBzdHJ1Y3QgX0JpbmRfc2ltcGxlX2hlbHBlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8dHlwZW5hbWUgZGVjYXk8X0Z1bmM+Ojp0eXBlPgorICAgICAgICBfX21heWJlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbWF5YmVfdHlwZTo6dHlwZSBfX2Z1bmNfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0JpbmRfc2ltcGxlPF9fZnVuY190eXBlKHR5cGVuYW1lIGRlY2F5PF9Cb3VuZEFyZ3M+Ojp0eXBlLi4uKT4KKyAgICAgICAJX190eXBlOworICAgIH07CisKKyAgLy8gU2ltcGxpZmllZCB2ZXJzaW9uIG9mIHN0ZDo6YmluZCBmb3IgaW50ZXJuYWwgdXNlLCB3aXRob3V0IHN1cHBvcnQgZm9yCisgIC8vIHVuYm91bmQgYXJndW1lbnRzLCBwbGFjZWhvbGRlcnMgb3IgbmVzdGVkIGJpbmQgZXhwcmVzc2lvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DYWxsYWJsZSwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgdHlwZW5hbWUgX0JpbmRfc2ltcGxlX2hlbHBlcjxfQ2FsbGFibGUsIF9BcmdzLi4uPjo6X190eXBlCisgICAgX19iaW5kX3NpbXBsZShfQ2FsbGFibGUmJiBfX2NhbGxhYmxlLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICB0eXBlZGVmIF9CaW5kX3NpbXBsZV9oZWxwZXI8X0NhbGxhYmxlLCBfQXJncy4uLj4gX19oZWxwZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19oZWxwZXJfdHlwZTo6X19tYXliZV90eXBlIF9fbWF5YmVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19oZWxwZXJfdHlwZTo6X190eXBlIF9fcmVzdWx0X3R5cGU7CisgICAgICByZXR1cm4gX19yZXN1bHRfdHlwZSgKKyAgICAgICAgICBfX21heWJlX3R5cGU6Ol9fZG9fd3JhcCggc3RkOjpmb3J3YXJkPF9DYWxsYWJsZT4oX19jYWxsYWJsZSkpLAorICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEV4Y2VwdGlvbiBjbGFzcyB0aHJvd24gd2hlbiBjbGFzcyB0ZW1wbGF0ZSBmdW5jdGlvbidzCisgICAqICBvcGVyYXRvcigpIGlzIGNhbGxlZCB3aXRoIGFuIGVtcHR5IHRhcmdldC4KKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICovCisgIGNsYXNzIGJhZF9mdW5jdGlvbl9jYWxsIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCisgIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfmJhZF9mdW5jdGlvbl9jYWxsKCkgbm9leGNlcHQ7CisKKyAgICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQ7CisgIH07CisKKyAgLyoqCisgICAqICBUcmFpdCBpZGVudGlmeWluZyAibG9jYXRpb24taW52YXJpYW50IiB0eXBlcywgbWVhbmluZyB0aGF0IHRoZQorICAgKiAgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IChvciBhbnkgb2YgaXRzIG1lbWJlcnMpIHdpbGwgbm90IGVzY2FwZS4KKyAgICogIEFsc28gaW1wbGllcyBhIHRyaXZpYWwgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19sb2NhdGlvbl9pbnZhcmlhbnQKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIChpc19wb2ludGVyPF9UcD46OnZhbHVlCisJCQkgICAgICAgfHwgaXNfbWVtYmVyX3BvaW50ZXI8X1RwPjo6dmFsdWUpPgorICAgIHsgfTsKKworICBjbGFzcyBfVW5kZWZpbmVkX2NsYXNzOworCisgIHVuaW9uIF9Ob2NvcHlfdHlwZXMKKyAgeworICAgIHZvaWQqICAgICAgIF9NX29iamVjdDsKKyAgICBjb25zdCB2b2lkKiBfTV9jb25zdF9vYmplY3Q7CisgICAgdm9pZCAoKl9NX2Z1bmN0aW9uX3BvaW50ZXIpKCk7CisgICAgdm9pZCAoX1VuZGVmaW5lZF9jbGFzczo6Kl9NX21lbWJlcl9wb2ludGVyKSgpOworICB9OworCisgIHVuaW9uIF9BbnlfZGF0YQorICB7CisgICAgdm9pZCogICAgICAgX01fYWNjZXNzKCkgICAgICAgeyByZXR1cm4gJl9NX3BvZF9kYXRhWzBdOyB9CisgICAgY29uc3Qgdm9pZCogX01fYWNjZXNzKCkgY29uc3QgeyByZXR1cm4gJl9NX3BvZF9kYXRhWzBdOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAmCisgICAgICBfTV9hY2Nlc3MoKQorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9UcCo+KF9NX2FjY2VzcygpKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgY29uc3QgX1RwJgorICAgICAgX01fYWNjZXNzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfVHAqPihfTV9hY2Nlc3MoKSk7IH0KKworICAgIF9Ob2NvcHlfdHlwZXMgX01fdW51c2VkOworICAgIGNoYXIgX01fcG9kX2RhdGFbc2l6ZW9mKF9Ob2NvcHlfdHlwZXMpXTsKKyAgfTsKKworICBlbnVtIF9NYW5hZ2VyX29wZXJhdGlvbgorICB7CisgICAgX19nZXRfdHlwZV9pbmZvLAorICAgIF9fZ2V0X2Z1bmN0b3JfcHRyLAorICAgIF9fY2xvbmVfZnVuY3RvciwKKyAgICBfX2Rlc3Ryb3lfZnVuY3RvcgorICB9OworCisgIC8vIFNpbXBsZSB0eXBlIHdyYXBwZXIgdGhhdCBoZWxwcyBhdm9pZCBhbm5veWluZyBjb25zdCBwcm9ibGVtcworICAvLyB3aGVuIGNhc3RpbmcgYmV0d2VlbiB2b2lkIHBvaW50ZXJzIGFuZCBwb2ludGVycy10by1wb2ludGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfU2ltcGxlX3R5cGVfd3JhcHBlcgorICAgIHsKKyAgICAgIF9TaW1wbGVfdHlwZV93cmFwcGVyKF9UcCBfX3ZhbHVlKSA6IF9fdmFsdWUoX192YWx1ZSkgeyB9CisKKyAgICAgIF9UcCBfX3ZhbHVlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2xvY2F0aW9uX2ludmFyaWFudDxfU2ltcGxlX3R5cGVfd3JhcHBlcjxfVHA+ID4KKyAgICA6IF9faXNfbG9jYXRpb25faW52YXJpYW50PF9UcD4KKyAgICB7IH07CisKKyAgLy8gQ29udmVydHMgYSByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbiBvYmplY3QgaW50byBhIGNhbGxhYmxlCisgIC8vIGZ1bmN0aW9uIG9iamVjdC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgaW5saW5lIF9GdW5jdG9yJgorICAgIF9fY2FsbGFibGVfZnVuY3RvcihfRnVuY3RvciYgX19mKQorICAgIHsgcmV0dXJuIF9fZjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lIF9DbGFzcz4KKyAgICBpbmxpbmUgX01lbV9mbjxfTWVtYmVyIF9DbGFzczo6Kj4KKyAgICBfX2NhbGxhYmxlX2Z1bmN0b3IoX01lbWJlciBfQ2xhc3M6OiogJl9fcCkKKyAgICB7IHJldHVybiBzdGQ6Om1lbV9mbihfX3ApOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01lbWJlciwgdHlwZW5hbWUgX0NsYXNzPgorICAgIGlubGluZSBfTWVtX2ZuPF9NZW1iZXIgX0NsYXNzOjoqPgorICAgIF9fY2FsbGFibGVfZnVuY3RvcihfTWVtYmVyIF9DbGFzczo6KiBjb25zdCAmX19wKQorICAgIHsgcmV0dXJuIHN0ZDo6bWVtX2ZuKF9fcCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtYmVyLCB0eXBlbmFtZSBfQ2xhc3M+CisgICAgaW5saW5lIF9NZW1fZm48X01lbWJlciBfQ2xhc3M6Oio+CisgICAgX19jYWxsYWJsZV9mdW5jdG9yKF9NZW1iZXIgX0NsYXNzOjoqIHZvbGF0aWxlICZfX3ApCisgICAgeyByZXR1cm4gc3RkOjptZW1fZm4oX19wKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lIF9DbGFzcz4KKyAgICBpbmxpbmUgX01lbV9mbjxfTWVtYmVyIF9DbGFzczo6Kj4KKyAgICBfX2NhbGxhYmxlX2Z1bmN0b3IoX01lbWJlciBfQ2xhc3M6OiogY29uc3Qgdm9sYXRpbGUgJl9fcCkKKyAgICB7IHJldHVybiBzdGQ6Om1lbV9mbihfX3ApOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBjbGFzcyBmdW5jdGlvbjsKKworICAvLy8gQmFzZSBjbGFzcyBvZiBhbGwgcG9seW1vcnBoaWMgZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXJzLgorICBjbGFzcyBfRnVuY3Rpb25fYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3QgX01fbWF4X3NpemUgPSBzaXplb2YoX05vY29weV90eXBlcyk7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IF9NX21heF9hbGlnbiA9IF9fYWxpZ25vZl9fKF9Ob2NvcHlfdHlwZXMpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBjbGFzcyBfQmFzZV9tYW5hZ2VyCisgICAgICB7CisgICAgICBwcm90ZWN0ZWQ6CisJc3RhdGljIGNvbnN0IGJvb2wgX19zdG9yZWRfbG9jYWxseSA9CisJKF9faXNfbG9jYXRpb25faW52YXJpYW50PF9GdW5jdG9yPjo6dmFsdWUKKwkgJiYgc2l6ZW9mKF9GdW5jdG9yKSA8PSBfTV9tYXhfc2l6ZQorCSAmJiBfX2FsaWdub2ZfXyhfRnVuY3RvcikgPD0gX01fbWF4X2FsaWduCisJICYmIChfTV9tYXhfYWxpZ24gJSBfX2FsaWdub2ZfXyhfRnVuY3RvcikgPT0gMCkpOworCisJdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX3N0b3JlZF9sb2NhbGx5PiBfTG9jYWxfc3RvcmFnZTsKKworCS8vIFJldHJpZXZlIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gb2JqZWN0CisJc3RhdGljIF9GdW5jdG9yKgorCV9NX2dldF9wb2ludGVyKGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UpCisJeworCSAgY29uc3QgX0Z1bmN0b3IqIF9fcHRyID0KKwkgICAgX19zdG9yZWRfbG9jYWxseT8gc3RkOjpfX2FkZHJlc3NvZihfX3NvdXJjZS5fTV9hY2Nlc3M8X0Z1bmN0b3I+KCkpCisJICAgIC8qIGhhdmUgc3RvcmVkIGEgcG9pbnRlciAqLyA6IF9fc291cmNlLl9NX2FjY2VzczxfRnVuY3Rvcio+KCk7CisJICByZXR1cm4gY29uc3RfY2FzdDxfRnVuY3Rvcio+KF9fcHRyKTsKKwl9CisKKwkvLyBDbG9uZSBhIGxvY2F0aW9uLWludmFyaWFudCBmdW5jdGlvbiBvYmplY3QgdGhhdCBmaXRzIHdpdGhpbgorCS8vIGFuIF9BbnlfZGF0YSBzdHJ1Y3R1cmUuCisJc3RhdGljIHZvaWQKKwlfTV9jbG9uZShfQW55X2RhdGEmIF9fZGVzdCwgY29uc3QgX0FueV9kYXRhJiBfX3NvdXJjZSwgdHJ1ZV90eXBlKQorCXsKKwkgIG5ldyAoX19kZXN0Ll9NX2FjY2VzcygpKSBfRnVuY3RvcihfX3NvdXJjZS5fTV9hY2Nlc3M8X0Z1bmN0b3I+KCkpOworCX0KKworCS8vIENsb25lIGEgZnVuY3Rpb24gb2JqZWN0IHRoYXQgaXMgbm90IGxvY2F0aW9uLWludmFyaWFudCBvcgorCS8vIHRoYXQgY2Fubm90IGZpdCBpbnRvIGFuIF9BbnlfZGF0YSBzdHJ1Y3R1cmUuCisJc3RhdGljIHZvaWQKKwlfTV9jbG9uZShfQW55X2RhdGEmIF9fZGVzdCwgY29uc3QgX0FueV9kYXRhJiBfX3NvdXJjZSwgZmFsc2VfdHlwZSkKKwl7CisJICBfX2Rlc3QuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9CisJICAgIG5ldyBfRnVuY3RvcigqX19zb3VyY2UuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSk7CisJfQorCisJLy8gRGVzdHJveWluZyBhIGxvY2F0aW9uLWludmFyaWFudCBvYmplY3QgbWF5IHN0aWxsIHJlcXVpcmUKKwkvLyBkZXN0cnVjdGlvbi4KKwlzdGF0aWMgdm9pZAorCV9NX2Rlc3Ryb3koX0FueV9kYXRhJiBfX3ZpY3RpbSwgdHJ1ZV90eXBlKQorCXsKKwkgIF9fdmljdGltLl9NX2FjY2VzczxfRnVuY3Rvcj4oKS5+X0Z1bmN0b3IoKTsKKwl9CisKKwkvLyBEZXN0cm95aW5nIGFuIG9iamVjdCBsb2NhdGVkIG9uIHRoZSBoZWFwLgorCXN0YXRpYyB2b2lkCisJX01fZGVzdHJveShfQW55X2RhdGEmIF9fdmljdGltLCBmYWxzZV90eXBlKQorCXsKKwkgIGRlbGV0ZSBfX3ZpY3RpbS5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpOworCX0KKworICAgICAgcHVibGljOgorCXN0YXRpYyBib29sCisJX01fbWFuYWdlcihfQW55X2RhdGEmIF9fZGVzdCwgY29uc3QgX0FueV9kYXRhJiBfX3NvdXJjZSwKKwkJICAgX01hbmFnZXJfb3BlcmF0aW9uIF9fb3ApCisJeworCSAgc3dpdGNoIChfX29wKQorCSAgICB7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgICBjYXNlIF9fZ2V0X3R5cGVfaW5mbzoKKwkgICAgICBfX2Rlc3QuX01fYWNjZXNzPGNvbnN0IHR5cGVfaW5mbyo+KCkgPSAmdHlwZWlkKF9GdW5jdG9yKTsKKwkgICAgICBicmVhazsKKyNlbmRpZgorCSAgICBjYXNlIF9fZ2V0X2Z1bmN0b3JfcHRyOgorCSAgICAgIF9fZGVzdC5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpID0gX01fZ2V0X3BvaW50ZXIoX19zb3VyY2UpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgX19jbG9uZV9mdW5jdG9yOgorCSAgICAgIF9NX2Nsb25lKF9fZGVzdCwgX19zb3VyY2UsIF9Mb2NhbF9zdG9yYWdlKCkpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgX19kZXN0cm95X2Z1bmN0b3I6CisJICAgICAgX01fZGVzdHJveShfX2Rlc3QsIF9Mb2NhbF9zdG9yYWdlKCkpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICByZXR1cm4gZmFsc2U7CisJfQorCisJc3RhdGljIHZvaWQKKwlfTV9pbml0X2Z1bmN0b3IoX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9GdW5jdG9yJiYgX19mKQorCXsgX01faW5pdF9mdW5jdG9yKF9fZnVuY3Rvciwgc3RkOjptb3ZlKF9fZiksIF9Mb2NhbF9zdG9yYWdlKCkpOyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorCSAgc3RhdGljIGJvb2wKKwkgIF9NX25vdF9lbXB0eV9mdW5jdGlvbihjb25zdCBmdW5jdGlvbjxfU2lnbmF0dXJlPiYgX19mKQorCSAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX19mKTsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCSAgc3RhdGljIGJvb2wKKwkgIF9NX25vdF9lbXB0eV9mdW5jdGlvbihfVHAqIGNvbnN0JiBfX2ZwKQorCSAgeyByZXR1cm4gX19mcDsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZSBfVHA+CisJICBzdGF0aWMgYm9vbAorCSAgX01fbm90X2VtcHR5X2Z1bmN0aW9uKF9UcCBfQ2xhc3M6OiogY29uc3QmIF9fbXApCisJICB7IHJldHVybiBfX21wOyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJICBzdGF0aWMgYm9vbAorCSAgX01fbm90X2VtcHR5X2Z1bmN0aW9uKGNvbnN0IF9UcCYpCisJICB7IHJldHVybiB0cnVlOyB9CisKKyAgICAgIHByaXZhdGU6CisJc3RhdGljIHZvaWQKKwlfTV9pbml0X2Z1bmN0b3IoX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9GdW5jdG9yJiYgX19mLCB0cnVlX3R5cGUpCisJeyBuZXcgKF9fZnVuY3Rvci5fTV9hY2Nlc3MoKSkgX0Z1bmN0b3Ioc3RkOjptb3ZlKF9fZikpOyB9CisKKwlzdGF0aWMgdm9pZAorCV9NX2luaXRfZnVuY3RvcihfQW55X2RhdGEmIF9fZnVuY3RvciwgX0Z1bmN0b3ImJiBfX2YsIGZhbHNlX3R5cGUpCisJeyBfX2Z1bmN0b3IuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9IG5ldyBfRnVuY3RvcihzdGQ6Om1vdmUoX19mKSk7IH0KKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICAgIGNsYXNzIF9SZWZfbWFuYWdlciA6IHB1YmxpYyBfQmFzZV9tYW5hZ2VyPF9GdW5jdG9yKj4KKyAgICAgIHsKKwl0eXBlZGVmIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPF9GdW5jdG9yKj4gX0Jhc2U7CisKKyAgICAgIHB1YmxpYzoKKwlzdGF0aWMgYm9vbAorCV9NX21hbmFnZXIoX0FueV9kYXRhJiBfX2Rlc3QsIGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UsCisJCSAgIF9NYW5hZ2VyX29wZXJhdGlvbiBfX29wKQorCXsKKwkgIHN3aXRjaCAoX19vcCkKKwkgICAgeworI2lmZGVmIF9fR1hYX1JUVEkKKwkgICAgY2FzZSBfX2dldF90eXBlX2luZm86CisJICAgICAgX19kZXN0Ll9NX2FjY2Vzczxjb25zdCB0eXBlX2luZm8qPigpID0gJnR5cGVpZChfRnVuY3Rvcik7CisJICAgICAgYnJlYWs7CisjZW5kaWYKKwkgICAgY2FzZSBfX2dldF9mdW5jdG9yX3B0cjoKKwkgICAgICBfX2Rlc3QuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9ICpfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19zb3VyY2UpOworCSAgICAgIHJldHVybiBpc19jb25zdDxfRnVuY3Rvcj46OnZhbHVlOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgX0Jhc2U6Ol9NX21hbmFnZXIoX19kZXN0LCBfX3NvdXJjZSwgX19vcCk7CisJICAgIH0KKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKwlzdGF0aWMgdm9pZAorCV9NX2luaXRfZnVuY3RvcihfQW55X2RhdGEmIF9fZnVuY3RvciwgcmVmZXJlbmNlX3dyYXBwZXI8X0Z1bmN0b3I+IF9fZikKKwl7CisJICBfQmFzZTo6X01faW5pdF9mdW5jdG9yKF9fZnVuY3Rvciwgc3RkOjpfX2FkZHJlc3NvZihfX2YuZ2V0KCkpKTsKKwl9CisgICAgICB9OworCisgICAgX0Z1bmN0aW9uX2Jhc2UoKSA6IF9NX21hbmFnZXIoMCkgeyB9CisKKyAgICB+X0Z1bmN0aW9uX2Jhc2UoKQorICAgIHsKKyAgICAgIGlmIChfTV9tYW5hZ2VyKQorCV9NX21hbmFnZXIoX01fZnVuY3RvciwgX01fZnVuY3RvciwgX19kZXN0cm95X2Z1bmN0b3IpOworICAgIH0KKworCisgICAgYm9vbCBfTV9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFfTV9tYW5hZ2VyOyB9CisKKyAgICB0eXBlZGVmIGJvb2wgKCpfTWFuYWdlcl90eXBlKShfQW55X2RhdGEmLCBjb25zdCBfQW55X2RhdGEmLAorCQkJCSAgX01hbmFnZXJfb3BlcmF0aW9uKTsKKworICAgIF9BbnlfZGF0YSAgICAgX01fZnVuY3RvcjsKKyAgICBfTWFuYWdlcl90eXBlIF9NX21hbmFnZXI7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZSwgdHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjxfUmVzKF9BcmdUeXBlcy4uLiksIF9GdW5jdG9yPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPF9GdW5jdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8X0Z1bmN0b3I+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIF9SZXMKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKwlyZXR1cm4gKCpfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19mdW5jdG9yKSkoCisJICAgIHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjx2b2lkKF9BcmdUeXBlcy4uLiksIF9GdW5jdG9yPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPF9GdW5jdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8X0Z1bmN0b3I+IF9CYXNlOworCisgICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfTV9pbnZva2UoY29uc3QgX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpCisgICAgICB7CisJKCpfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19mdW5jdG9yKSkoCisJICAgIHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjxfUmVzKF9BcmdUeXBlcy4uLiksIHJlZmVyZW5jZV93cmFwcGVyPF9GdW5jdG9yPiA+CisgICAgOiBwdWJsaWMgX0Z1bmN0aW9uX2Jhc2U6Ol9SZWZfbWFuYWdlcjxfRnVuY3Rvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5jdGlvbl9iYXNlOjpfUmVmX21hbmFnZXI8X0Z1bmN0b3I+IF9CYXNlOworCisgICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBfUmVzCisgICAgICBfTV9pbnZva2UoY29uc3QgX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpCisgICAgICB7CisJcmV0dXJuIF9fY2FsbGFibGVfZnVuY3RvcigqKl9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX2Z1bmN0b3IpKSgKKwkgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI8dm9pZChfQXJnVHlwZXMuLi4pLCByZWZlcmVuY2Vfd3JhcHBlcjxfRnVuY3Rvcj4gPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfUmVmX21hbmFnZXI8X0Z1bmN0b3I+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X1JlZl9tYW5hZ2VyPF9GdW5jdG9yPiBfQmFzZTsKKworICAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX01faW52b2tlKGNvbnN0IF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgICAgeworCV9fY2FsbGFibGVfZnVuY3RvcigqKl9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX2Z1bmN0b3IpKSgKKwkgICAgc3RkOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lIF9SZXMsCisJICAgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9GdW5jdGlvbl9oYW5kbGVyPF9SZXMoX0FyZ1R5cGVzLi4uKSwgX01lbWJlciBfQ2xhc3M6Oio+CisgICAgOiBwdWJsaWMgX0Z1bmN0aW9uX2hhbmRsZXI8dm9pZChfQXJnVHlwZXMuLi4pLCBfTWVtYmVyIF9DbGFzczo6Kj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5jdGlvbl9oYW5kbGVyPHZvaWQoX0FyZ1R5cGVzLi4uKSwgX01lbWJlciBfQ2xhc3M6Oio+CisJX0Jhc2U7CisKKyAgICAgcHVibGljOgorICAgICAgc3RhdGljIF9SZXMKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKwlyZXR1cm4gc3RkOjptZW1fZm4oX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvciktPl9fdmFsdWUpKAorCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUgX01lbWJlciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9GdW5jdGlvbl9oYW5kbGVyPHZvaWQoX0FyZ1R5cGVzLi4uKSwgX01lbWJlciBfQ2xhc3M6Oio+CisgICAgOiBwdWJsaWMgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8CisJCSBfU2ltcGxlX3R5cGVfd3JhcHBlcjwgX01lbWJlciBfQ2xhc3M6OiogPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfTWVtYmVyIF9DbGFzczo6KiBfRnVuY3RvcjsKKyAgICAgIHR5cGVkZWYgX1NpbXBsZV90eXBlX3dyYXBwZXI8X0Z1bmN0b3I+IF9XcmFwcGVyOworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X0Jhc2VfbWFuYWdlcjxfV3JhcHBlcj4gX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgYm9vbAorICAgICAgX01fbWFuYWdlcihfQW55X2RhdGEmIF9fZGVzdCwgY29uc3QgX0FueV9kYXRhJiBfX3NvdXJjZSwKKwkJIF9NYW5hZ2VyX29wZXJhdGlvbiBfX29wKQorICAgICAgeworCXN3aXRjaCAoX19vcCkKKwkgIHsKKyNpZmRlZiBfX0dYWF9SVFRJCisJICBjYXNlIF9fZ2V0X3R5cGVfaW5mbzoKKwkgICAgX19kZXN0Ll9NX2FjY2Vzczxjb25zdCB0eXBlX2luZm8qPigpID0gJnR5cGVpZChfRnVuY3Rvcik7CisJICAgIGJyZWFrOworI2VuZGlmCisJICBjYXNlIF9fZ2V0X2Z1bmN0b3JfcHRyOgorCSAgICBfX2Rlc3QuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9CisJICAgICAgJl9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX3NvdXJjZSktPl9fdmFsdWU7CisJICAgIGJyZWFrOworCisJICBkZWZhdWx0OgorCSAgICBfQmFzZTo6X01fbWFuYWdlcihfX2Rlc3QsIF9fc291cmNlLCBfX29wKTsKKwkgIH0KKwlyZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfTV9pbnZva2UoY29uc3QgX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpCisgICAgICB7CisJc3RkOjptZW1fZm4oX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvciktPl9fdmFsdWUpKAorCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8+CisgICAgdXNpbmcgX19jaGVja19mdW5jX3JldHVybl90eXBlCisgICAgICA9IF9fb3JfPGlzX3ZvaWQ8X1RvPiwgaXNfY29udmVydGlibGU8X0Zyb20sIF9Ubz4+OworCisgIC8qKgorICAgKiAgQGJyaWVmIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgZm9yIHN0ZDo6ZnVuY3Rpb24uCisgICAqICBAaW5ncm91cCBmdW5jdG9ycworICAgKgorICAgKiAgUG9seW1vcnBoaWMgZnVuY3Rpb24gd3JhcHBlci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBmdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+CisgICAgOiBwdWJsaWMgX01heWJlX3VuYXJ5X29yX2JpbmFyeV9mdW5jdGlvbjxfUmVzLCBfQXJnVHlwZXMuLi4+LAorICAgICAgcHJpdmF0ZSBfRnVuY3Rpb25fYmFzZQorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyBfU2lnbmF0dXJlX3R5cGUoX0FyZ1R5cGVzLi4uKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisJdXNpbmcgX0ludm9rZSA9IGRlY2x0eXBlKF9fY2FsbGFibGVfZnVuY3RvcihzdGQ6OmRlY2x2YWw8X0Z1bmN0b3ImPigpKQorCQkJCSAoc3RkOjpkZWNsdmFsPF9BcmdUeXBlcz4oKS4uLikgKTsKKworICAgICAgLy8gVXNlZCBzbyB0aGUgcmV0dXJuIHR5cGUgY29udmVydGliaWxpdHkgY2hlY2tzIGFyZW4ndCBkb25lIHdoZW4KKyAgICAgIC8vIHBlcmZvcm1pbmcgb3ZlcmxvYWQgcmVzb2x1dGlvbiBmb3IgY29weSBjb25zdHJ1Y3Rpb24vYXNzaWdubWVudC4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwl1c2luZyBfTm90U2VsZiA9IF9fbm90Xzxpc19zYW1lPF9UcCwgZnVuY3Rpb24+PjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisJdXNpbmcgX0NhbGxhYmxlCisJICA9IF9fYW5kXzxfTm90U2VsZjxfRnVuY3Rvcj4sCisJCSAgIF9fY2hlY2tfZnVuY19yZXR1cm5fdHlwZTxfSW52b2tlPF9GdW5jdG9yPiwgX1Jlcz4+OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29uZCwgdHlwZW5hbWUgX1RwPgorCXVzaW5nIF9SZXF1aXJlcyA9IHR5cGVuYW1lIGVuYWJsZV9pZjxfQ29uZDo6dmFsdWUsIF9UcD46OnR5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8vIFszLjcuMi4xXSBjb25zdHJ1Y3QvY29weS9kZXN0cm95CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBEZWZhdWx0IGNvbnN0cnVjdCBjcmVhdGVzIGFuIGVtcHR5IGZ1bmN0aW9uIGNhbGwgd3JhcHBlci4KKyAgICAgICAqICBAcG9zdCBAYyAhKGJvb2wpKnRoaXMKKyAgICAgICAqLworICAgICAgZnVuY3Rpb24oKSBub2V4Y2VwdAorICAgICAgOiBfRnVuY3Rpb25fYmFzZSgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBmdW5jdGlvbiBjYWxsIHdyYXBwZXIuCisgICAgICAgKiAgQHBvc3QgQGMgIShib29sKSp0aGlzCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uKG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICAgIDogX0Z1bmN0aW9uX2Jhc2UoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICVGdW5jdGlvbiBjb3B5IGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSBfX3ggQSAlZnVuY3Rpb24gb2JqZWN0IHdpdGggaWRlbnRpY2FsIGNhbGwgc2lnbmF0dXJlLgorICAgICAgICogIEBwb3N0IEBjIGJvb2woKnRoaXMpID09IGJvb2woX194KQorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlZnVuY3Rpb24gY29udGFpbnMgYSBjb3B5IG9mIHRoZSB0YXJnZXQgb2YgQGEKKyAgICAgICAqICBfX3ggKGlmIGl0IGhhcyBvbmUpLgorICAgICAgICovCisgICAgICBmdW5jdGlvbihjb25zdCBmdW5jdGlvbiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICVGdW5jdGlvbiBtb3ZlIGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSBfX3ggQSAlZnVuY3Rpb24gb2JqZWN0IHJ2YWx1ZSB3aXRoIGlkZW50aWNhbCBjYWxsIHNpZ25hdHVyZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJWZ1bmN0aW9uIGNvbnRhaW5zIHRoZSB0YXJnZXQgb2YgQGEgX194CisgICAgICAgKiAgKGlmIGl0IGhhcyBvbmUpLgorICAgICAgICovCisgICAgICBmdW5jdGlvbihmdW5jdGlvbiYmIF9feCkgOiBfRnVuY3Rpb25fYmFzZSgpCisgICAgICB7CisJX194LnN3YXAoKnRoaXMpOworICAgICAgfQorCisgICAgICAvLyBUT0RPOiBuZWVkcyBhbGxvY2F0b3JfYXJnX3QKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEJ1aWxkcyBhICVmdW5jdGlvbiB0aGF0IHRhcmdldHMgYSBjb3B5IG9mIHRoZSBpbmNvbWluZworICAgICAgICogIGZ1bmN0aW9uIG9iamVjdC4KKyAgICAgICAqICBAcGFyYW0gX19mIEEgJWZ1bmN0aW9uIG9iamVjdCB0aGF0IGlzIGNhbGxhYmxlIHdpdGggcGFyYW1ldGVycyBvZgorICAgICAgICogIHR5cGUgQGMgVDEsIEBjIFQyLCAuLi4sIEBjIFROIGFuZCByZXR1cm5zIGEgdmFsdWUgY29udmVydGlibGUKKyAgICAgICAqICB0byBAYyBSZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVmdW5jdGlvbiBvYmplY3Qgd2lsbCB0YXJnZXQgYSBjb3B5IG9mIAorICAgICAgICogIEBhIF9fZi4gSWYgQGEgX19mIGlzIEBjIHJlZmVyZW5jZV93cmFwcGVyPEY+LCB0aGVuIHRoaXMgZnVuY3Rpb24KKyAgICAgICAqICBvYmplY3Qgd2lsbCBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiBvYmplY3QgQGMKKyAgICAgICAqICBfX2YuZ2V0KCkuIElmIEBhIF9fZiBpcyBhIE5VTEwgZnVuY3Rpb24gcG9pbnRlciBvciBOVUxMCisgICAgICAgKiAgcG9pbnRlci10by1tZW1iZXIsIHRoZSBuZXdseS1jcmVhdGVkIG9iamVjdCB3aWxsIGJlIGVtcHR5LgorICAgICAgICoKKyAgICAgICAqICBJZiBAYSBfX2YgaXMgYSBub24tTlVMTCBmdW5jdGlvbiBwb2ludGVyIG9yIGFuIG9iamVjdCBvZiB0eXBlIEBjCisgICAgICAgKiAgcmVmZXJlbmNlX3dyYXBwZXI8Rj4sIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IF9SZXF1aXJlczxfQ2FsbGFibGU8X0Z1bmN0b3I+LCB2b2lkPj4KKwlmdW5jdGlvbihfRnVuY3Rvcik7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gX194IEEgJWZ1bmN0aW9uIHdpdGggaWRlbnRpY2FsIGNhbGwgc2lnbmF0dXJlLgorICAgICAgICogIEBwb3N0IEBjIChib29sKSp0aGlzID09IChib29sKXgKKyAgICAgICAqICBAcmV0dXJucyBAYyAqdGhpcworICAgICAgICoKKyAgICAgICAqICBUaGUgdGFyZ2V0IG9mIEBhIF9feCBpcyBjb3BpZWQgdG8gQGMgKnRoaXMuIElmIEBhIF9feCBoYXMgbm8KKyAgICAgICAqICB0YXJnZXQsIHRoZW4gQGMgKnRoaXMgd2lsbCBiZSBlbXB0eS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgQGEgX194IHRhcmdldHMgYSBmdW5jdGlvbiBwb2ludGVyIG9yIGEgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24KKyAgICAgICAqICBvYmplY3QsIHRoZW4gdGhpcyBvcGVyYXRpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICAgICAqLworICAgICAgZnVuY3Rpb24mCisgICAgICBvcGVyYXRvcj0oY29uc3QgZnVuY3Rpb24mIF9feCkKKyAgICAgIHsKKwlmdW5jdGlvbihfX3gpLnN3YXAoKnRoaXMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICVGdW5jdGlvbiBtb3ZlLWFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9feCBBICVmdW5jdGlvbiBydmFsdWUgd2l0aCBpZGVudGljYWwgY2FsbCBzaWduYXR1cmUuCisgICAgICAgKiAgQHJldHVybnMgQGMgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgVGhlIHRhcmdldCBvZiBAYSBfX3ggaXMgbW92ZWQgdG8gQGMgKnRoaXMuIElmIEBhIF9feCBoYXMgbm8KKyAgICAgICAqICB0YXJnZXQsIHRoZW4gQGMgKnRoaXMgd2lsbCBiZSBlbXB0eS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgQGEgX194IHRhcmdldHMgYSBmdW5jdGlvbiBwb2ludGVyIG9yIGEgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24KKyAgICAgICAqICBvYmplY3QsIHRoZW4gdGhpcyBvcGVyYXRpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICAgICAqLworICAgICAgZnVuY3Rpb24mCisgICAgICBvcGVyYXRvcj0oZnVuY3Rpb24mJiBfX3gpCisgICAgICB7CisJZnVuY3Rpb24oc3RkOjptb3ZlKF9feCkpLnN3YXAoKnRoaXMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICVGdW5jdGlvbiBhc3NpZ25tZW50IHRvIHplcm8uCisgICAgICAgKiAgQHBvc3QgQGMgIShib29sKSp0aGlzCisgICAgICAgKiAgQHJldHVybnMgQGMgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgVGhlIHRhcmdldCBvZiBAYyAqdGhpcyBpcyBkZWFsbG9jYXRlZCwgbGVhdmluZyBpdCBlbXB0eS4KKyAgICAgICAqLworICAgICAgZnVuY3Rpb24mCisgICAgICBvcGVyYXRvcj0obnVsbHB0cl90KQorICAgICAgeworCWlmIChfTV9tYW5hZ2VyKQorCSAgeworCSAgICBfTV9tYW5hZ2VyKF9NX2Z1bmN0b3IsIF9NX2Z1bmN0b3IsIF9fZGVzdHJveV9mdW5jdG9yKTsKKwkgICAgX01fbWFuYWdlciA9IDA7CisJICAgIF9NX2ludm9rZXIgPSAwOworCSAgfQorCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICVGdW5jdGlvbiBhc3NpZ25tZW50IHRvIGEgbmV3IHRhcmdldC4KKyAgICAgICAqICBAcGFyYW0gX19mIEEgJWZ1bmN0aW9uIG9iamVjdCB0aGF0IGlzIGNhbGxhYmxlIHdpdGggcGFyYW1ldGVycyBvZgorICAgICAgICogIHR5cGUgQGMgVDEsIEBjIFQyLCAuLi4sIEBjIFROIGFuZCByZXR1cm5zIGEgdmFsdWUgY29udmVydGlibGUKKyAgICAgICAqICB0byBAYyBSZXMuCisgICAgICAgKiAgQHJldHVybiBAYyAqdGhpcworICAgICAgICoKKyAgICAgICAqICBUaGlzICAlZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXIgd2lsbCB0YXJnZXQgYSBjb3B5IG9mIEBhCisgICAgICAgKiAgX19mLiBJZiBAYSBfX2YgaXMgQGMgcmVmZXJlbmNlX3dyYXBwZXI8Rj4sIHRoZW4gdGhpcyBmdW5jdGlvbgorICAgICAgICogIG9iamVjdCB3aWxsIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uIG9iamVjdCBAYworICAgICAgICogIF9fZi5nZXQoKS4gSWYgQGEgX19mIGlzIGEgTlVMTCBmdW5jdGlvbiBwb2ludGVyIG9yIE5VTEwKKyAgICAgICAqICBwb2ludGVyLXRvLW1lbWJlciwgQGMgdGhpcyBvYmplY3Qgd2lsbCBiZSBlbXB0eS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgQGEgX19mIGlzIGEgbm9uLU5VTEwgZnVuY3Rpb24gcG9pbnRlciBvciBhbiBvYmplY3Qgb2YgdHlwZSBAYworICAgICAgICogIHJlZmVyZW5jZV93cmFwcGVyPEY+LCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKwlfUmVxdWlyZXM8X0NhbGxhYmxlPHR5cGVuYW1lIGRlY2F5PF9GdW5jdG9yPjo6dHlwZT4sIGZ1bmN0aW9uJj4KKwlvcGVyYXRvcj0oX0Z1bmN0b3ImJiBfX2YpCisJeworCSAgZnVuY3Rpb24oc3RkOjpmb3J3YXJkPF9GdW5jdG9yPihfX2YpKS5zd2FwKCp0aGlzKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIC8vLyBAb3ZlcmxvYWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorCWZ1bmN0aW9uJgorCW9wZXJhdG9yPShyZWZlcmVuY2Vfd3JhcHBlcjxfRnVuY3Rvcj4gX19mKSBub2V4Y2VwdAorCXsKKwkgIGZ1bmN0aW9uKF9fZikuc3dhcCgqdGhpcyk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICAvLyBbMy43LjIuMl0gZnVuY3Rpb24gbW9kaWZpZXJzCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBTd2FwIHRoZSB0YXJnZXRzIG9mIHR3byAlZnVuY3Rpb24gb2JqZWN0cy4KKyAgICAgICAqICBAcGFyYW0gX194IEEgJWZ1bmN0aW9uIHdpdGggaWRlbnRpY2FsIGNhbGwgc2lnbmF0dXJlLgorICAgICAgICoKKyAgICAgICAqICBTd2FwIHRoZSB0YXJnZXRzIG9mIEBjIHRoaXMgZnVuY3Rpb24gb2JqZWN0IGFuZCBAYSBfX2YuIFRoaXMKKyAgICAgICAqICBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgICAgICovCisgICAgICB2b2lkIHN3YXAoZnVuY3Rpb24mIF9feCkKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fZnVuY3RvciwgX194Ll9NX2Z1bmN0b3IpOworCXN0ZDo6c3dhcChfTV9tYW5hZ2VyLCBfX3guX01fbWFuYWdlcik7CisJc3RkOjpzd2FwKF9NX2ludm9rZXIsIF9feC5fTV9pbnZva2VyKTsKKyAgICAgIH0KKworICAgICAgLy8gVE9ETzogbmVlZHMgYWxsb2NhdG9yX2FyZ190CisgICAgICAvKgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lIF9BbGxvYz4KKwl2b2lkCisJYXNzaWduKF9GdW5jdG9yJiYgX19mLCBjb25zdCBfQWxsb2MmIF9fYSkKKwl7CisJICBmdW5jdGlvbihhbGxvY2F0b3JfYXJnLCBfX2EsCisJCSAgIHN0ZDo6Zm9yd2FyZDxfRnVuY3Rvcj4oX19mKSkuc3dhcCgqdGhpcyk7CisJfQorICAgICAgKi8KKworICAgICAgLy8gWzMuNy4yLjNdIGZ1bmN0aW9uIGNhcGFjaXR5CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlICVmdW5jdGlvbiB3cmFwcGVyIGhhcyBhIHRhcmdldC4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiBAYyB0cnVlIHdoZW4gdGhpcyAlZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGEgdGFyZ2V0LAorICAgICAgICogIG9yIEBjIGZhbHNlIHdoZW4gaXQgaXMgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiAhX01fZW1wdHkoKTsgfQorCisgICAgICAvLyBbMy43LjIuNF0gZnVuY3Rpb24gaW52b2NhdGlvbgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSW52b2tlcyB0aGUgZnVuY3Rpb24gdGFyZ2V0ZWQgYnkgQGMgKnRoaXMuCisgICAgICAgKiAgQHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgdGFyZ2V0LgorICAgICAgICogIEB0aHJvd3MgYmFkX2Z1bmN0aW9uX2NhbGwgd2hlbiBAYyAhKGJvb2wpKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgVGhlIGZ1bmN0aW9uIGNhbGwgb3BlcmF0b3IgaW52b2tlcyB0aGUgdGFyZ2V0IGZ1bmN0aW9uIG9iamVjdAorICAgICAgICogIHN0b3JlZCBieSBAYyB0aGlzLgorICAgICAgICovCisgICAgICBfUmVzIG9wZXJhdG9yKCkoX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3Q7CisKKyNpZmRlZiBfX0dYWF9SVFRJCisgICAgICAvLyBbMy43LjIuNV0gZnVuY3Rpb24gdGFyZ2V0IGFjY2VzcworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIERldGVybWluZSB0aGUgdHlwZSBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgZnVuY3Rpb24gb2JqZWN0CisgICAgICAgKiAgd3JhcHBlci4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybnMgdGhlIHR5cGUgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIG9iamVjdCwgb3IKKyAgICAgICAqICBAYyB0eXBlaWQodm9pZCkgaWYgQGMgIShib29sKSp0aGlzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0IHR5cGVfaW5mbyYgdGFyZ2V0X3R5cGUoKSBjb25zdCBub2V4Y2VwdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEFjY2VzcyB0aGUgc3RvcmVkIHRhcmdldCBmdW5jdGlvbiBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0b3JlZCB0YXJnZXQgZnVuY3Rpb24gb2JqZWN0LAorICAgICAgICogIGlmIEBjIHR5cGVpZChGdW5jdG9yKS5lcXVhbHModGFyZ2V0X3R5cGUoKSk7IG90aGVyd2lzZSwgYSBOVUxMCisgICAgICAgKiAgcG9pbnRlci4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPiAgICAgICBfRnVuY3RvciogdGFyZ2V0KCkgbm9leGNlcHQ7CisKKyAgICAgIC8vLyBAb3ZlcmxvYWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPiBjb25zdCBfRnVuY3RvciogdGFyZ2V0KCkgY29uc3Qgbm9leGNlcHQ7CisjZW5kaWYKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9SZXMgKCpfSW52b2tlcl90eXBlKShjb25zdCBfQW55X2RhdGEmLCBfQXJnVHlwZXMuLi4pOworICAgICAgX0ludm9rZXJfdHlwZSBfTV9pbnZva2VyOworICB9OworCisgIC8vIE91dC1vZi1saW5lIG1lbWJlciBkZWZpbml0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgIGZ1bmN0aW9uKGNvbnN0IGZ1bmN0aW9uJiBfX3gpCisgICAgOiBfRnVuY3Rpb25fYmFzZSgpCisgICAgeworICAgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KF9feCkpCisJeworCSAgX01faW52b2tlciA9IF9feC5fTV9pbnZva2VyOworCSAgX01fbWFuYWdlciA9IF9feC5fTV9tYW5hZ2VyOworCSAgX194Ll9NX21hbmFnZXIoX01fZnVuY3RvciwgX194Ll9NX2Z1bmN0b3IsIF9fY2xvbmVfZnVuY3Rvcik7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lPgorICAgICAgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPjo6CisgICAgICBmdW5jdGlvbihfRnVuY3RvciBfX2YpCisgICAgICA6IF9GdW5jdGlvbl9iYXNlKCkKKyAgICAgIHsKKwl0eXBlZGVmIF9GdW5jdGlvbl9oYW5kbGVyPF9TaWduYXR1cmVfdHlwZSwgX0Z1bmN0b3I+IF9NeV9oYW5kbGVyOworCisJaWYgKF9NeV9oYW5kbGVyOjpfTV9ub3RfZW1wdHlfZnVuY3Rpb24oX19mKSkKKwkgIHsKKwkgICAgX015X2hhbmRsZXI6Ol9NX2luaXRfZnVuY3RvcihfTV9mdW5jdG9yLCBzdGQ6Om1vdmUoX19mKSk7CisJICAgIF9NX2ludm9rZXIgPSAmX015X2hhbmRsZXI6Ol9NX2ludm9rZTsKKwkgICAgX01fbWFuYWdlciA9ICZfTXlfaGFuZGxlcjo6X01fbWFuYWdlcjsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgX1JlcworICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgIG9wZXJhdG9yKCkoX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICB7CisgICAgICBpZiAoX01fZW1wdHkoKSkKKwlfX3Rocm93X2JhZF9mdW5jdGlvbl9jYWxsKCk7CisgICAgICByZXR1cm4gX01faW52b2tlcihfTV9mdW5jdG9yLCBzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyNpZmRlZiBfX0dYWF9SVFRJCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjb25zdCB0eXBlX2luZm8mCisgICAgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPjo6CisgICAgdGFyZ2V0X3R5cGUoKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgIGlmIChfTV9tYW5hZ2VyKQorCXsKKwkgIF9BbnlfZGF0YSBfX3R5cGVpbmZvX3Jlc3VsdDsKKwkgIF9NX21hbmFnZXIoX190eXBlaW5mb19yZXN1bHQsIF9NX2Z1bmN0b3IsIF9fZ2V0X3R5cGVfaW5mbyk7CisJICByZXR1cm4gKl9fdHlwZWluZm9fcmVzdWx0Ll9NX2FjY2Vzczxjb25zdCB0eXBlX2luZm8qPigpOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gdHlwZWlkKHZvaWQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBfRnVuY3RvcioKKyAgICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgICAgdGFyZ2V0KCkgbm9leGNlcHQKKyAgICAgIHsKKwlpZiAodHlwZWlkKF9GdW5jdG9yKSA9PSB0YXJnZXRfdHlwZSgpICYmIF9NX21hbmFnZXIpCisJICB7CisJICAgIF9BbnlfZGF0YSBfX3B0cjsKKwkgICAgaWYgKF9NX21hbmFnZXIoX19wdHIsIF9NX2Z1bmN0b3IsIF9fZ2V0X2Z1bmN0b3JfcHRyKQorCQkmJiAhaXNfY29uc3Q8X0Z1bmN0b3I+Ojp2YWx1ZSkKKwkgICAgICByZXR1cm4gMDsKKwkgICAgZWxzZQorCSAgICAgIHJldHVybiBfX3B0ci5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpOworCSAgfQorCWVsc2UKKwkgIHJldHVybiAwOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICAgIGNvbnN0IF9GdW5jdG9yKgorICAgICAgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPjo6CisgICAgICB0YXJnZXQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworCWlmICh0eXBlaWQoX0Z1bmN0b3IpID09IHRhcmdldF90eXBlKCkgJiYgX01fbWFuYWdlcikKKwkgIHsKKwkgICAgX0FueV9kYXRhIF9fcHRyOworCSAgICBfTV9tYW5hZ2VyKF9fcHRyLCBfTV9mdW5jdG9yLCBfX2dldF9mdW5jdG9yX3B0cik7CisJICAgIHJldHVybiBfX3B0ci5fTV9hY2Nlc3M8Y29uc3QgX0Z1bmN0b3IqPigpOworCSAgfQorCWVsc2UKKwkgIHJldHVybiAwOworICAgICAgfQorI2VuZGlmCisKKyAgLy8gWzIwLjcuMTUuMi42XSBudWxsIHBvaW50ZXIgY29tcGFyaXNvbnMKKworICAvKioKKyAgICogIEBicmllZiBDb21wYXJlcyBhIHBvbHltb3JwaGljIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVyIGFnYWluc3QgMAorICAgKiAgKHRoZSBOVUxMIHBvaW50ZXIpLgorICAgKiAgQHJldHVybnMgQGMgdHJ1ZSBpZiB0aGUgd3JhcHBlciBoYXMgbm8gdGFyZ2V0LCBAYyBmYWxzZSBvdGhlcndpc2UKKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBmdW5jdGlvbjxfUmVzKF9BcmdzLi4uKT4mIF9fZiwgbnVsbHB0cl90KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICFzdGF0aWNfY2FzdDxib29sPihfX2YpOyB9CisKKyAgLy8vIEBvdmVybG9hZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0obnVsbHB0cl90LCBjb25zdCBmdW5jdGlvbjxfUmVzKF9BcmdzLi4uKT4mIF9fZikgbm9leGNlcHQKKyAgICB7IHJldHVybiAhc3RhdGljX2Nhc3Q8Ym9vbD4oX19mKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvbXBhcmVzIGEgcG9seW1vcnBoaWMgZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXIgYWdhaW5zdCAwCisgICAqICAodGhlIE5VTEwgcG9pbnRlcikuCisgICAqICBAcmV0dXJucyBAYyBmYWxzZSBpZiB0aGUgd3JhcHBlciBoYXMgbm8gdGFyZ2V0LCBAYyB0cnVlIG90aGVyd2lzZQorICAgKgorICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGZ1bmN0aW9uPF9SZXMoX0FyZ3MuLi4pPiYgX19mLCBudWxscHRyX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX19mKTsgfQorCisgIC8vLyBAb3ZlcmxvYWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KG51bGxwdHJfdCwgY29uc3QgZnVuY3Rpb248X1JlcyhfQXJncy4uLik+JiBfX2YpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX19mKTsgfQorCisgIC8vIFsyMC43LjE1LjIuN10gc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcworCisgIC8qKgorICAgKiAgQGJyaWVmIFN3YXAgdGhlIHRhcmdldHMgb2YgdHdvIHBvbHltb3JwaGljIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVycy4KKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChmdW5jdGlvbjxfUmVzKF9BcmdzLi4uKT4mIF9feCwgZnVuY3Rpb248X1JlcyhfQXJncy4uLik+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfRlVOQ1RJT05BTApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9mdXR1cmUgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Z1dHVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjE1ZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9mdXR1cmUKQEAgLTAsMCArMSwxNTU4IEBACisvLyA8ZnV0dXJlPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9mdXR1cmUKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfRlVUVVJFCisjZGVmaW5lIF9HTElCQ1hYX0ZVVFVSRSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Yml0cy91bmlxdWVfcHRyLmg+CisjaW5jbHVkZSA8Yml0cy9zaGFyZWRfcHRyLmg+CisjaW5jbHVkZSA8Yml0cy91c2VzX2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NfdHJhaXRzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGRlZmdyb3VwIGZ1dHVyZXMgRnV0dXJlcworICAgKiBAaW5ncm91cCBjb25jdXJyZW5jeQorICAgKgorICAgKiBDbGFzc2VzIGZvciBmdXR1cmVzIHN1cHBvcnQuCisgICAqIEB7CisgICAqLworCisgIC8vLyBFcnJvciBjb2RlIGZvciBmdXR1cmVzCisgIGVudW0gY2xhc3MgZnV0dXJlX2VycmMKKyAgeworICAgIGZ1dHVyZV9hbHJlYWR5X3JldHJpZXZlZCA9IDEsCisgICAgcHJvbWlzZV9hbHJlYWR5X3NhdGlzZmllZCwKKyAgICBub19zdGF0ZSwKKyAgICBicm9rZW5fcHJvbWlzZQorICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBpc19lcnJvcl9jb2RlX2VudW08ZnV0dXJlX2VycmM+IDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLy8vIFBvaW50cyB0byBhIHN0YXRpY2FsbHktYWxsb2NhdGVkIG9iamVjdCBkZXJpdmVkIGZyb20gZXJyb3JfY2F0ZWdvcnkuCisgIGNvbnN0IGVycm9yX2NhdGVnb3J5JgorICBmdXR1cmVfY2F0ZWdvcnkoKSBub2V4Y2VwdDsKKworICAvLy8gT3ZlcmxvYWQgZm9yIG1ha2VfZXJyb3JfY29kZS4KKyAgaW5saW5lIGVycm9yX2NvZGUKKyAgbWFrZV9lcnJvcl9jb2RlKGZ1dHVyZV9lcnJjIF9fZXJyYykgbm9leGNlcHQKKyAgeyByZXR1cm4gZXJyb3JfY29kZShzdGF0aWNfY2FzdDxpbnQ+KF9fZXJyYyksIGZ1dHVyZV9jYXRlZ29yeSgpKTsgfQorCisgIC8vLyBPdmVybG9hZCBmb3IgbWFrZV9lcnJvcl9jb25kaXRpb24uCisgIGlubGluZSBlcnJvcl9jb25kaXRpb24KKyAgbWFrZV9lcnJvcl9jb25kaXRpb24oZnV0dXJlX2VycmMgX19lcnJjKSBub2V4Y2VwdAorICB7IHJldHVybiBlcnJvcl9jb25kaXRpb24oc3RhdGljX2Nhc3Q8aW50PihfX2VycmMpLCBmdXR1cmVfY2F0ZWdvcnkoKSk7IH0KKworICAvKioKKyAgICogIEBicmllZiBFeGNlcHRpb24gdHlwZSB0aHJvd24gYnkgZnV0dXJlcy4KKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICovCisgIGNsYXNzIGZ1dHVyZV9lcnJvciA6IHB1YmxpYyBsb2dpY19lcnJvcgorICB7CisgICAgZXJyb3JfY29kZSAJCQlfTV9jb2RlOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBmdXR1cmVfZXJyb3IoZXJyb3JfY29kZSBfX2VjKQorICAgIDogbG9naWNfZXJyb3IoInN0ZDo6ZnV0dXJlX2Vycm9yIiksIF9NX2NvZGUoX19lYykKKyAgICB7IH0KKworICAgIHZpcnR1YWwgfmZ1dHVyZV9lcnJvcigpIG5vZXhjZXB0OworCisgICAgdmlydHVhbCBjb25zdCBjaGFyKgorICAgIHdoYXQoKSBjb25zdCBub2V4Y2VwdDsKKworICAgIGNvbnN0IGVycm9yX2NvZGUmCisgICAgY29kZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIF9NX2NvZGU7IH0KKyAgfTsKKworICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBjbGFzcyBmdXR1cmU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBjbGFzcyBzaGFyZWRfZnV0dXJlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY2xhc3MgcGFja2FnZWRfdGFzazsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGNsYXNzIHByb21pc2U7CisKKyAgLy8vIExhdW5jaCBjb2RlIGZvciBmdXR1cmVzCisgIGVudW0gY2xhc3MgbGF1bmNoCisgIHsKKyAgICBhc3luYyA9IDEsCisgICAgZGVmZXJyZWQgPSAyCisgIH07CisKKyAgY29uc3RleHByIGxhdW5jaCBvcGVyYXRvciYobGF1bmNoIF9feCwgbGF1bmNoIF9feSkKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxsYXVuY2g+KAorCXN0YXRpY19jYXN0PGludD4oX194KSAmIHN0YXRpY19jYXN0PGludD4oX195KSk7CisgIH0KKworICBjb25zdGV4cHIgbGF1bmNoIG9wZXJhdG9yfChsYXVuY2ggX194LCBsYXVuY2ggX195KQorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxhdW5jaD4oCisJc3RhdGljX2Nhc3Q8aW50PihfX3gpIHwgc3RhdGljX2Nhc3Q8aW50PihfX3kpKTsKKyAgfQorCisgIGNvbnN0ZXhwciBsYXVuY2ggb3BlcmF0b3JeKGxhdW5jaCBfX3gsIGxhdW5jaCBfX3kpCisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bGF1bmNoPigKKwlzdGF0aWNfY2FzdDxpbnQ+KF9feCkgXiBzdGF0aWNfY2FzdDxpbnQ+KF9feSkpOworICB9CisKKyAgY29uc3RleHByIGxhdW5jaCBvcGVyYXRvcn4obGF1bmNoIF9feCkKKyAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8bGF1bmNoPih+c3RhdGljX2Nhc3Q8aW50PihfX3gpKTsgfQorCisgIGlubGluZSBsYXVuY2gmIG9wZXJhdG9yJj0obGF1bmNoJiBfX3gsIGxhdW5jaCBfX3kpCisgIHsgcmV0dXJuIF9feCA9IF9feCAmIF9feTsgfQorCisgIGlubGluZSBsYXVuY2gmIG9wZXJhdG9yfD0obGF1bmNoJiBfX3gsIGxhdW5jaCBfX3kpCisgIHsgcmV0dXJuIF9feCA9IF9feCB8IF9feTsgfQorCisgIGlubGluZSBsYXVuY2gmIG9wZXJhdG9yXj0obGF1bmNoJiBfX3gsIGxhdW5jaCBfX3kpCisgIHsgcmV0dXJuIF9feCA9IF9feCBeIF9feTsgfQorCisgIC8vLyBTdGF0dXMgY29kZSBmb3IgZnV0dXJlcworICBlbnVtIGNsYXNzIGZ1dHVyZV9zdGF0dXMKKyAgeworICAgIHJlYWR5LAorICAgIHRpbWVvdXQsCisgICAgZGVmZXJyZWQKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm4sIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGZ1dHVyZTx0eXBlbmFtZSByZXN1bHRfb2Y8X0ZuKF9BcmdzLi4uKT46OnR5cGU+CisgICAgYXN5bmMobGF1bmNoIF9fcG9saWN5LCBfRm4mJiBfX2ZuLCBfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBmdXR1cmU8dHlwZW5hbWUgcmVzdWx0X29mPF9GbihfQXJncy4uLik+Ojp0eXBlPgorICAgIGFzeW5jKF9GbiYmIF9fZm4sIF9BcmdzJiYuLi4gX19hcmdzKTsKKworI2lmIGRlZmluZWQoX0dMSUJDWFhfSEFTX0dUSFJFQURTKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMSkgXAorICAmJiAoQVRPTUlDX0lOVF9MT0NLX0ZSRUUgPiAxKQorCisgIC8vLyBCYXNlIGNsYXNzIGFuZCBlbmNsb3Npbmcgc2NvcGUuCisgIHN0cnVjdCBfX2Z1dHVyZV9iYXNlCisgIHsKKyAgICAvLy8gQmFzZSBjbGFzcyBmb3IgcmVzdWx0cy4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9iYXNlCisgICAgeworICAgICAgZXhjZXB0aW9uX3B0cgkJX01fZXJyb3I7CisKKyAgICAgIF9SZXN1bHRfYmFzZShjb25zdCBfUmVzdWx0X2Jhc2UmKSA9IGRlbGV0ZTsKKyAgICAgIF9SZXN1bHRfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9SZXN1bHRfYmFzZSYpID0gZGVsZXRlOworCisgICAgICAvLyBfTV9kZXN0cm95KCkgYWxsb3dzIGRlcml2ZWQgY2xhc3NlcyB0byBjb250cm9sIGRlYWxsb2NhdGlvbgorICAgICAgdmlydHVhbCB2b2lkIF9NX2Rlc3Ryb3koKSA9IDA7CisKKyAgICAgIHN0cnVjdCBfRGVsZXRlcgorICAgICAgeworCXZvaWQgb3BlcmF0b3IoKShfUmVzdWx0X2Jhc2UqIF9fZnIpIGNvbnN0IHsgX19mci0+X01fZGVzdHJveSgpOyB9CisgICAgICB9OworCisgICAgcHJvdGVjdGVkOgorICAgICAgX1Jlc3VsdF9iYXNlKCk7CisgICAgICB2aXJ0dWFsIH5fUmVzdWx0X2Jhc2UoKTsKKyAgICB9OworCisgICAgLy8vIFJlc3VsdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgICAgc3RydWN0IF9SZXN1bHQgOiBfUmVzdWx0X2Jhc2UKKyAgICAgIHsKKyAgICAgIHByaXZhdGU6CisJdHlwZWRlZiBhbGlnbm1lbnRfb2Y8X1Jlcz4JCQkJX19hX29mOworCXR5cGVkZWYgYWxpZ25lZF9zdG9yYWdlPHNpemVvZihfUmVzKSwgX19hX29mOjp2YWx1ZT4JX19hbGlnbl9zdG9yYWdlOworCXR5cGVkZWYgdHlwZW5hbWUgX19hbGlnbl9zdG9yYWdlOjp0eXBlCQkJX19hbGlnbl90eXBlOworCisJX19hbGlnbl90eXBlCQlfTV9zdG9yYWdlOworCWJvb2wgCQkJX01faW5pdGlhbGl6ZWQ7CisKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisKKwlfUmVzdWx0KCkgbm9leGNlcHQgOiBfTV9pbml0aWFsaXplZCgpIHsgfQorCQorCX5fUmVzdWx0KCkKKwl7CisJICBpZiAoX01faW5pdGlhbGl6ZWQpCisJICAgIF9NX3ZhbHVlKCkufl9SZXMoKTsKKwl9CisKKwkvLyBSZXR1cm4gbHZhbHVlLCBmdXR1cmUgd2lsbCBhZGQgY29uc3Qgb3IgcnZhbHVlLXJlZmVyZW5jZQorCV9SZXMmCisJX01fdmFsdWUoKSBub2V4Y2VwdCB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X1Jlcyo+KF9NX2FkZHIoKSk7IH0KKworCXZvaWQKKwlfTV9zZXQoY29uc3QgX1JlcyYgX19yZXMpCisJeworCSAgOjpuZXcgKF9NX2FkZHIoKSkgX1JlcyhfX3Jlcyk7CisJICBfTV9pbml0aWFsaXplZCA9IHRydWU7CisJfQorCisJdm9pZAorCV9NX3NldChfUmVzJiYgX19yZXMpCisJeworCSAgOjpuZXcgKF9NX2FkZHIoKSkgX1JlcyhzdGQ6Om1vdmUoX19yZXMpKTsKKwkgIF9NX2luaXRpYWxpemVkID0gdHJ1ZTsKKwl9CisKKyAgICAgIHByaXZhdGU6CisJdm9pZCBfTV9kZXN0cm95KCkgeyBkZWxldGUgdGhpczsgfQorCisJdm9pZCogX01fYWRkcigpIG5vZXhjZXB0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHZvaWQqPigmX01fc3RvcmFnZSk7IH0KKyAgICB9OworCisgICAgLy8vIEEgdW5pcXVlX3B0ciBiYXNlZCBvbiB0aGUgaW5zdGFudGlhdGluZyB0eXBlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgICB1c2luZyBfUHRyID0gdW5pcXVlX3B0cjxfUmVzLCBfUmVzdWx0X2Jhc2U6Ol9EZWxldGVyPjsKKworICAgIC8vLyBSZXN1bHRfYWxsb2MuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgc3RydWN0IF9SZXN1bHRfYWxsb2MgZmluYWwgOiBfUmVzdWx0PF9SZXM+LCBfQWxsb2MKKyAgICAgIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46OnRlbXBsYXRlCisgICAgICAgICAgcmViaW5kX2FsbG9jPF9SZXN1bHRfYWxsb2M+IF9fYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgICAgZXhwbGljaXQKKwlfUmVzdWx0X2FsbG9jKGNvbnN0IF9BbGxvYyYgX19hKSA6IF9SZXN1bHQ8X1Jlcz4oKSwgX0FsbG9jKF9fYSkKKyAgICAgICAgeyB9CisJCisgICAgICBwcml2YXRlOgorCXZvaWQgX01fZGVzdHJveSgpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfX2FsbG9jYXRvcl90eXBlPiBfX3RyYWl0czsKKyAgICAgICAgICBfX2FsbG9jYXRvcl90eXBlIF9fYSgqdGhpcyk7CisJICBfX3RyYWl0czo6ZGVzdHJveShfX2EsIHRoaXMpOworCSAgX190cmFpdHM6OmRlYWxsb2NhdGUoX19hLCB0aGlzLCAxKTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgICBzdGF0aWMgX1B0cjxfUmVzdWx0X2FsbG9jPF9SZXMsIF9BbGxvY2F0b3I+PgorICAgICAgX1NfYWxsb2NhdGVfcmVzdWx0KGNvbnN0IF9BbGxvY2F0b3ImIF9fYSkKKyAgICAgIHsKKyAgICAgICAgdHlwZWRlZiBfUmVzdWx0X2FsbG9jPF9SZXMsIF9BbGxvY2F0b3I+CV9fcmVzdWx0X3R5cGU7CisJdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPHR5cGVuYW1lIF9fcmVzdWx0X3R5cGU6Ol9fYWxsb2NhdG9yX3R5cGU+CisJICBfX3RyYWl0czsKKyAgICAgICAgdHlwZW5hbWUgX190cmFpdHM6OmFsbG9jYXRvcl90eXBlIF9fYTIoX19hKTsKKyAgICAgICAgX19yZXN1bHRfdHlwZSogX19wID0gX190cmFpdHM6OmFsbG9jYXRlKF9fYTIsIDEpOworICAgICAgICBfX3RyeQorCSAgeworCSAgICBfX3RyYWl0czo6Y29uc3RydWN0KF9fYTIsIF9fcCwgX19hKTsKKwkgIH0KKyAgICAgICAgX19jYXRjaCguLi4pCisJICB7CisJICAgIF9fdHJhaXRzOjpkZWFsbG9jYXRlKF9fYTIsIF9fcCwgMSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgICByZXR1cm4gX1B0cjxfX3Jlc3VsdF90eXBlPihfX3ApOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1RwPgorICAgICAgc3RhdGljIF9QdHI8X1Jlc3VsdDxfUmVzPj4KKyAgICAgIF9TX2FsbG9jYXRlX3Jlc3VsdChjb25zdCBzdGQ6OmFsbG9jYXRvcjxfVHA+JiBfX2EpCisgICAgICB7CisJcmV0dXJuIF9QdHI8X1Jlc3VsdDxfUmVzPj4obmV3IF9SZXN1bHQ8X1Jlcz4pOworICAgICAgfQorCisgICAgLy8vIEJhc2UgY2xhc3MgZm9yIHN0YXRlIGJldHdlZW4gYSBwcm9taXNlIGFuZCBvbmUgb3IgbW9yZQorICAgIC8vLyBhc3NvY2lhdGVkIGZ1dHVyZXMuCisgICAgY2xhc3MgX1N0YXRlX2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIF9QdHI8X1Jlc3VsdF9iYXNlPiBfUHRyX3R5cGU7CisKKyAgICAgIF9QdHJfdHlwZQkJCV9NX3Jlc3VsdDsKKyAgICAgIG11dGV4ICAgICAgICAgICAgICAgCV9NX211dGV4OworICAgICAgY29uZGl0aW9uX3ZhcmlhYmxlICAJX01fY29uZDsKKyAgICAgIGF0b21pY19mbGFnICAgICAgICAgCV9NX3JldHJpZXZlZDsKKyAgICAgIG9uY2VfZmxhZwkJCV9NX29uY2U7CisKKyAgICBwdWJsaWM6CisgICAgICBfU3RhdGVfYmFzZSgpIG5vZXhjZXB0IDogX01fcmVzdWx0KCksIF9NX3JldHJpZXZlZChBVE9NSUNfRkxBR19JTklUKSB7IH0KKyAgICAgIF9TdGF0ZV9iYXNlKGNvbnN0IF9TdGF0ZV9iYXNlJikgPSBkZWxldGU7CisgICAgICBfU3RhdGVfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9TdGF0ZV9iYXNlJikgPSBkZWxldGU7CisgICAgICB2aXJ0dWFsIH5fU3RhdGVfYmFzZSgpOworCisgICAgICBfUmVzdWx0X2Jhc2UmCisgICAgICB3YWl0KCkKKyAgICAgIHsKKwlfTV9ydW5fZGVmZXJyZWQoKTsKKwl1bmlxdWVfbG9jazxtdXRleD4gX19sb2NrKF9NX211dGV4KTsKKwlfTV9jb25kLndhaXQoX19sb2NrLCBbJl0geyByZXR1cm4gX01fcmVhZHkoKTsgfSk7CisJcmV0dXJuICpfTV9yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICAgIGZ1dHVyZV9zdGF0dXMKKyAgICAgICAgd2FpdF9mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19yZWwpCisgICAgICAgIHsKKwkgIHVuaXF1ZV9sb2NrPG11dGV4PiBfX2xvY2soX01fbXV0ZXgpOworCSAgaWYgKF9NX2NvbmQud2FpdF9mb3IoX19sb2NrLCBfX3JlbCwgWyZdIHsgcmV0dXJuIF9NX3JlYWR5KCk7IH0pKQorCSAgICByZXR1cm4gZnV0dXJlX3N0YXR1czo6cmVhZHk7CisJICByZXR1cm4gZnV0dXJlX3N0YXR1czo6dGltZW91dDsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cmF0aW9uPgorICAgICAgICBmdXR1cmVfc3RhdHVzCisgICAgICAgIHdhaXRfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hYnMpCisgICAgICAgIHsKKwkgIHVuaXF1ZV9sb2NrPG11dGV4PiBfX2xvY2soX01fbXV0ZXgpOworCSAgaWYgKF9NX2NvbmQud2FpdF91bnRpbChfX2xvY2ssIF9fYWJzLCBbJl0geyByZXR1cm4gX01fcmVhZHkoKTsgfSkpCisJICAgIHJldHVybiBmdXR1cmVfc3RhdHVzOjpyZWFkeTsKKwkgIHJldHVybiBmdXR1cmVfc3RhdHVzOjp0aW1lb3V0OworCX0KKworICAgICAgdm9pZAorICAgICAgX01fc2V0X3Jlc3VsdChmdW5jdGlvbjxfUHRyX3R5cGUoKT4gX19yZXMsIGJvb2wgX19pZ25vcmVfZmFpbHVyZSA9IGZhbHNlKQorICAgICAgeworICAgICAgICBib29sIF9fc2V0ID0gX19pZ25vcmVfZmFpbHVyZTsKKyAgICAgICAgLy8gYWxsIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gYXJlIHNlcmlhbGl6ZWQsCisgICAgICAgIC8vIHNpZGUtZWZmZWN0cyBvZiBpbnZva2luZyBfX3JlcyBvbmx5IGhhcHBlbiBvbmNlCisgICAgICAgIGNhbGxfb25jZShfTV9vbmNlLCAmX1N0YXRlX2Jhc2U6Ol9NX2RvX3NldCwgdGhpcywgcmVmKF9fcmVzKSwKKyAgICAgICAgICAgIHJlZihfX3NldCkpOworICAgICAgICBpZiAoIV9fc2V0KQorICAgICAgICAgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKGludChmdXR1cmVfZXJyYzo6cHJvbWlzZV9hbHJlYWR5X3NhdGlzZmllZCkpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9icmVha19wcm9taXNlKF9QdHJfdHlwZSBfX3JlcykKKyAgICAgIHsKKwlpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oX19yZXMpKQorCSAgeworCSAgICBlcnJvcl9jb2RlIF9fZWMobWFrZV9lcnJvcl9jb2RlKGZ1dHVyZV9lcnJjOjpicm9rZW5fcHJvbWlzZSkpOworCSAgICBfX3Jlcy0+X01fZXJyb3IgPSBjb3B5X2V4Y2VwdGlvbihmdXR1cmVfZXJyb3IoX19lYykpOworCSAgICB7CisJICAgICAgbG9ja19ndWFyZDxtdXRleD4gX19sb2NrKF9NX211dGV4KTsKKwkgICAgICBfTV9yZXN1bHQuc3dhcChfX3Jlcyk7CisJICAgIH0KKwkgICAgX01fY29uZC5ub3RpZnlfYWxsKCk7CisJICB9CisgICAgICB9CisKKyAgICAgIC8vIENhbGxlZCB3aGVuIHRoaXMgb2JqZWN0IGlzIHBhc3NlZCB0byBhIGZ1dHVyZS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX3NldF9yZXRyaWV2ZWRfZmxhZygpCisgICAgICB7CisJaWYgKF9NX3JldHJpZXZlZC50ZXN0X2FuZF9zZXQoKSkKKwkgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKGludChmdXR1cmVfZXJyYzo6ZnV0dXJlX2FscmVhZHlfcmV0cmlldmVkKSk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9Bcmc+CisgICAgICAgIHN0cnVjdCBfU2V0dGVyOworCisgICAgICAvLyBzZXQgbHZhbHVlcworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0FyZz4KKyAgICAgICAgc3RydWN0IF9TZXR0ZXI8X1JlcywgX0FyZyY+CisgICAgICAgIHsKKyAgICAgICAgICAvLyBjaGVjayB0aGlzIGlzIG9ubHkgdXNlZCBieSBwcm9taXNlPFI+OjpzZXRfdmFsdWUoY29uc3QgUiYpCisgICAgICAgICAgLy8gb3IgcHJvbWlzZTxSPjo6c2V0X3ZhbHVlKFImKQorICAgICAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxfUmVzLCBfQXJnJj46OnZhbHVlICAvLyBwcm9taXNlPFImPgorICAgICAgICAgICAgICB8fCBpc19zYW1lPGNvbnN0IF9SZXMsIF9Bcmc+Ojp2YWx1ZSwgIC8vIHByb21pc2U8Uj4KKyAgICAgICAgICAgICAgIkludmFsaWQgc3BlY2lhbGlzYXRpb24iKTsKKworICAgICAgICAgIHR5cGVuYW1lIHByb21pc2U8X1Jlcz46Ol9QdHJfdHlwZSBvcGVyYXRvcigpKCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfU3RhdGVfYmFzZTo6X1NfY2hlY2soX01fcHJvbWlzZS0+X01fZnV0dXJlKTsKKyAgICAgICAgICAgIF9NX3Byb21pc2UtPl9NX3N0b3JhZ2UtPl9NX3NldChfTV9hcmcpOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShfTV9wcm9taXNlLT5fTV9zdG9yYWdlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJvbWlzZTxfUmVzPiogICAgX01fcHJvbWlzZTsKKyAgICAgICAgICBfQXJnJiAgICAgICAgICAgICBfTV9hcmc7CisgICAgICAgIH07CisKKyAgICAgIC8vIHNldCBydmFsdWVzCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgICAgICBzdHJ1Y3QgX1NldHRlcjxfUmVzLCBfUmVzJiY+CisgICAgICAgIHsKKyAgICAgICAgICB0eXBlbmFtZSBwcm9taXNlPF9SZXM+OjpfUHRyX3R5cGUgb3BlcmF0b3IoKSgpCisgICAgICAgICAgeworICAgICAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3Byb21pc2UtPl9NX2Z1dHVyZSk7CisgICAgICAgICAgICBfTV9wcm9taXNlLT5fTV9zdG9yYWdlLT5fTV9zZXQoc3RkOjptb3ZlKF9NX2FyZykpOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShfTV9wcm9taXNlLT5fTV9zdG9yYWdlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJvbWlzZTxfUmVzPiogICAgX01fcHJvbWlzZTsKKyAgICAgICAgICBfUmVzJiAgICAgICAgICAgICBfTV9hcmc7CisgICAgICAgIH07CisKKyAgICAgIHN0cnVjdCBfX2V4Y2VwdGlvbl9wdHJfdGFnIHsgfTsKKworICAgICAgLy8gc2V0IGV4Y2VwdGlvbnMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgICAgIHN0cnVjdCBfU2V0dGVyPF9SZXMsIF9fZXhjZXB0aW9uX3B0cl90YWc+CisgICAgICAgIHsKKyAgICAgICAgICB0eXBlbmFtZSBwcm9taXNlPF9SZXM+OjpfUHRyX3R5cGUgb3BlcmF0b3IoKSgpCisgICAgICAgICAgeworICAgICAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3Byb21pc2UtPl9NX2Z1dHVyZSk7CisgICAgICAgICAgICBfTV9wcm9taXNlLT5fTV9zdG9yYWdlLT5fTV9lcnJvciA9IF9NX2V4OworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShfTV9wcm9taXNlLT5fTV9zdG9yYWdlKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwcm9taXNlPF9SZXM+KiAgIF9NX3Byb21pc2U7CisgICAgICAgICAgZXhjZXB0aW9uX3B0ciYgICAgX01fZXg7CisgICAgICAgIH07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9Bcmc+CisgICAgICAgIHN0YXRpYyBfU2V0dGVyPF9SZXMsIF9BcmcmJj4KKyAgICAgICAgX19zZXR0ZXIocHJvbWlzZTxfUmVzPiogX19wcm9tLCBfQXJnJiYgX19hcmcpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gX1NldHRlcjxfUmVzLCBfQXJnJiY+eyBfX3Byb20sIF9fYXJnIH07CisgICAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICAgICAgc3RhdGljIF9TZXR0ZXI8X1JlcywgX19leGNlcHRpb25fcHRyX3RhZz4KKyAgICAgICAgX19zZXR0ZXIoZXhjZXB0aW9uX3B0ciYgX19leCwgcHJvbWlzZTxfUmVzPiogX19wcm9tKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9TZXR0ZXI8X1JlcywgX19leGNlcHRpb25fcHRyX3RhZz57IF9fcHJvbSwgX19leCB9OworICAgICAgICB9CisKKyAgICAgIHN0YXRpYyBfU2V0dGVyPHZvaWQsIHZvaWQ+CisgICAgICBfX3NldHRlcihwcm9taXNlPHZvaWQ+KiBfX3Byb20pOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9TX2NoZWNrKGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX19wKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFzdGF0aWNfY2FzdDxib29sPihfX3ApKQorICAgICAgICAgICAgX190aHJvd19mdXR1cmVfZXJyb3IoKGludClmdXR1cmVfZXJyYzo6bm9fc3RhdGUpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01fZG9fc2V0KGZ1bmN0aW9uPF9QdHJfdHlwZSgpPiYgX19mLCBib29sJiBfX3NldCkKKyAgICAgIHsKKyAgICAgICAgX1B0cl90eXBlIF9fcmVzID0gX19mKCk7CisgICAgICAgIHsKKyAgICAgICAgICBsb2NrX2d1YXJkPG11dGV4PiBfX2xvY2soX01fbXV0ZXgpOworICAgICAgICAgIF9NX3Jlc3VsdC5zd2FwKF9fcmVzKTsKKyAgICAgICAgfQorICAgICAgICBfTV9jb25kLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgX19zZXQgPSB0cnVlOworICAgICAgfQorCisgICAgICBib29sIF9NX3JlYWR5KCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX01fcmVzdWx0KTsgfQorCisgICAgICAvLyBNaXNuYW1lZDogd2FpdHMgZm9yIGNvbXBsZXRpb24gb2YgYXN5bmMgZnVuY3Rpb24uCisgICAgICB2aXJ0dWFsIHZvaWQgX01fcnVuX2RlZmVycmVkKCkgeyB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Cb3VuZEZuLCB0eXBlbmFtZSA9IHR5cGVuYW1lIF9Cb3VuZEZuOjpyZXN1bHRfdHlwZT4KKyAgICAgIGNsYXNzIF9EZWZlcnJlZF9zdGF0ZTsKKworICAgIGNsYXNzIF9Bc3luY19zdGF0ZV9jb21tb247CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQm91bmRGbiwgdHlwZW5hbWUgPSB0eXBlbmFtZSBfQm91bmRGbjo6cmVzdWx0X3R5cGU+CisgICAgICBjbGFzcyBfQXN5bmNfc3RhdGVfaW1wbDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgICBjbGFzcyBfVGFza19zdGF0ZV9iYXNlOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgICBjbGFzcyBfVGFza19zdGF0ZTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Cb3VuZEZuPgorICAgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxfU3RhdGVfYmFzZT4KKyAgICAgIF9TX21ha2VfZGVmZXJyZWRfc3RhdGUoX0JvdW5kRm4mJiBfX2ZuKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Cb3VuZEZuPgorICAgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxfU3RhdGVfYmFzZT4KKyAgICAgIF9TX21ha2VfYXN5bmNfc3RhdGUoX0JvdW5kRm4mJiBfX2ZuKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXNfcHRyLAorCSAgICAgdHlwZW5hbWUgX1JlcyA9IHR5cGVuYW1lIF9SZXNfcHRyOjplbGVtZW50X3R5cGU6OnJlc3VsdF90eXBlPgorICAgICAgc3RydWN0IF9UYXNrX3NldHRlcjsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXNfcHRyLCB0eXBlbmFtZSBfQm91bmRGbj4KKyAgICAgIHN0YXRpYyBfVGFza19zZXR0ZXI8X1Jlc19wdHI+CisgICAgICBfU190YXNrX3NldHRlcihfUmVzX3B0ciYgX19wdHIsIF9Cb3VuZEZuJiYgX19jYWxsKQorICAgICAgeworCXJldHVybiBfVGFza19zZXR0ZXI8X1Jlc19wdHI+eyBfX3B0ciwgc3RkOjpyZWYoX19jYWxsKSB9OworICAgICAgfQorICB9OworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciByZWZlcmVuY2UgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgc3RydWN0IF9fZnV0dXJlX2Jhc2U6Ol9SZXN1bHQ8X1JlcyY+IDogX19mdXR1cmVfYmFzZTo6X1Jlc3VsdF9iYXNlCisgICAgeworICAgICAgdHlwZWRlZiBfUmVzJiByZXN1bHRfdHlwZTsKKworICAgICAgX1Jlc3VsdCgpIG5vZXhjZXB0IDogX01fdmFsdWVfcHRyKCkgeyB9CisKKyAgICAgIHZvaWQgX01fc2V0KF9SZXMmIF9fcmVzKSBub2V4Y2VwdCB7IF9NX3ZhbHVlX3B0ciA9ICZfX3JlczsgfQorCisgICAgICBfUmVzJiBfTV9nZXQoKSBub2V4Y2VwdCB7IHJldHVybiAqX01fdmFsdWVfcHRyOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX1JlcyogCQkJX01fdmFsdWVfcHRyOworCisgICAgICB2b2lkIF9NX2Rlc3Ryb3koKSB7IGRlbGV0ZSB0aGlzOyB9CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHZvaWQuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19mdXR1cmVfYmFzZTo6X1Jlc3VsdDx2b2lkPiA6IF9fZnV0dXJlX2Jhc2U6Ol9SZXN1bHRfYmFzZQorICAgIHsKKyAgICAgIHR5cGVkZWYgdm9pZCByZXN1bHRfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkIF9NX2Rlc3Ryb3koKSB7IGRlbGV0ZSB0aGlzOyB9CisgICAgfTsKKworCisgIC8vLyBDb21tb24gaW1wbGVtZW50YXRpb24gZm9yIGZ1dHVyZSBhbmQgc2hhcmVkX2Z1dHVyZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBjbGFzcyBfX2Jhc2ljX2Z1dHVyZSA6IHB1YmxpYyBfX2Z1dHVyZV9iYXNlCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgc2hhcmVkX3B0cjxfU3RhdGVfYmFzZT4JCV9fc3RhdGVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1Jlc3VsdDxfUmVzPiYJX19yZXN1bHRfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICBfX3N0YXRlX3R5cGUgCQlfTV9zdGF0ZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIERpc2FibGUgY29weWluZy4KKyAgICAgIF9fYmFzaWNfZnV0dXJlKGNvbnN0IF9fYmFzaWNfZnV0dXJlJikgPSBkZWxldGU7CisgICAgICBfX2Jhc2ljX2Z1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IF9fYmFzaWNfZnV0dXJlJikgPSBkZWxldGU7CisKKyAgICAgIGJvb2wKKyAgICAgIHZhbGlkKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX01fc3RhdGUpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHdhaXQoKSBjb25zdAorICAgICAgeworICAgICAgICBfU3RhdGVfYmFzZTo6X1NfY2hlY2soX01fc3RhdGUpOworICAgICAgICBfTV9zdGF0ZS0+d2FpdCgpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorICAgICAgICBmdXR1cmVfc3RhdHVzCisgICAgICAgIHdhaXRfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcmVsKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3N0YXRlKTsKKyAgICAgICAgICByZXR1cm4gX01fc3RhdGUtPndhaXRfZm9yKF9fcmVsKTsKKyAgICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXJhdGlvbj4KKyAgICAgICAgZnV0dXJlX3N0YXR1cworICAgICAgICB3YWl0X3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYWJzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3N0YXRlKTsKKyAgICAgICAgICByZXR1cm4gX01fc3RhdGUtPndhaXRfdW50aWwoX19hYnMpOworICAgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gV2FpdCBmb3IgdGhlIHN0YXRlIHRvIGJlIHJlYWR5IGFuZCByZXRocm93IGFueSBzdG9yZWQgZXhjZXB0aW9uCisgICAgICBfX3Jlc3VsdF90eXBlCisgICAgICBfTV9nZXRfcmVzdWx0KCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3N0YXRlKTsKKyAgICAgICAgX1Jlc3VsdF9iYXNlJiBfX3JlcyA9IF9NX3N0YXRlLT53YWl0KCk7CisgICAgICAgIGlmICghKF9fcmVzLl9NX2Vycm9yID09IDApKQorICAgICAgICAgIHJldGhyb3dfZXhjZXB0aW9uKF9fcmVzLl9NX2Vycm9yKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9fcmVzdWx0X3R5cGU+KF9fcmVzKTsKKyAgICAgIH0KKworICAgICAgdm9pZCBfTV9zd2FwKF9fYmFzaWNfZnV0dXJlJiBfX3RoYXQpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIF9NX3N0YXRlLnN3YXAoX190aGF0Ll9NX3N0YXRlKTsKKyAgICAgIH0KKworICAgICAgLy8gQ29uc3RydWN0aW9uIG9mIGEgZnV0dXJlIGJ5IHByb21pc2U6OmdldF9mdXR1cmUoKQorICAgICAgZXhwbGljaXQKKyAgICAgIF9fYmFzaWNfZnV0dXJlKGNvbnN0IF9fc3RhdGVfdHlwZSYgX19zdGF0ZSkgOiBfTV9zdGF0ZShfX3N0YXRlKQorICAgICAgeworICAgICAgICBfU3RhdGVfYmFzZTo6X1NfY2hlY2soX01fc3RhdGUpOworICAgICAgICBfTV9zdGF0ZS0+X01fc2V0X3JldHJpZXZlZF9mbGFnKCk7CisgICAgICB9CisKKyAgICAgIC8vIENvcHkgY29uc3RydWN0aW9uIGZyb20gYSBzaGFyZWRfZnV0dXJlCisgICAgICBleHBsaWNpdAorICAgICAgX19iYXNpY19mdXR1cmUoY29uc3Qgc2hhcmVkX2Z1dHVyZTxfUmVzPiYpIG5vZXhjZXB0OworCisgICAgICAvLyBNb3ZlIGNvbnN0cnVjdGlvbiBmcm9tIGEgc2hhcmVkX2Z1dHVyZQorICAgICAgZXhwbGljaXQKKyAgICAgIF9fYmFzaWNfZnV0dXJlKHNoYXJlZF9mdXR1cmU8X1Jlcz4mJikgbm9leGNlcHQ7CisKKyAgICAgIC8vIE1vdmUgY29uc3RydWN0aW9uIGZyb20gYSBmdXR1cmUKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX2Jhc2ljX2Z1dHVyZShmdXR1cmU8X1Jlcz4mJikgbm9leGNlcHQ7CisKKyAgICAgIGNvbnN0ZXhwciBfX2Jhc2ljX2Z1dHVyZSgpIG5vZXhjZXB0IDogX01fc3RhdGUoKSB7IH0KKworICAgICAgc3RydWN0IF9SZXNldAorICAgICAgeworICAgICAgICBleHBsaWNpdCBfUmVzZXQoX19iYXNpY19mdXR1cmUmIF9fZnV0KSBub2V4Y2VwdCA6IF9NX2Z1dChfX2Z1dCkgeyB9CisgICAgICAgIH5fUmVzZXQoKSB7IF9NX2Z1dC5fTV9zdGF0ZS5yZXNldCgpOyB9CisgICAgICAgIF9fYmFzaWNfZnV0dXJlJiBfTV9mdXQ7CisgICAgICB9OworICAgIH07CisKKworICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZSBmb3IgZnV0dXJlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGNsYXNzIGZ1dHVyZSA6IHB1YmxpYyBfX2Jhc2ljX2Z1dHVyZTxfUmVzPgorICAgIHsKKyAgICAgIGZyaWVuZCBjbGFzcyBwcm9taXNlPF9SZXM+OworICAgICAgdGVtcGxhdGU8dHlwZW5hbWU+IGZyaWVuZCBjbGFzcyBwYWNrYWdlZF90YXNrOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgZnJpZW5kIGZ1dHVyZTx0eXBlbmFtZSByZXN1bHRfb2Y8X0ZuKF9BcmdzLi4uKT46OnR5cGU+CisgICAgICAgIGFzeW5jKGxhdW5jaCwgX0ZuJiYsIF9BcmdzJiYuLi4pOworCisgICAgICB0eXBlZGVmIF9fYmFzaWNfZnV0dXJlPF9SZXM+IF9CYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlX3R5cGU6Ol9fc3RhdGVfdHlwZSBfX3N0YXRlX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBmdXR1cmUoY29uc3QgX19zdGF0ZV90eXBlJiBfX3N0YXRlKSA6IF9CYXNlX3R5cGUoX19zdGF0ZSkgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICBjb25zdGV4cHIgZnV0dXJlKCkgbm9leGNlcHQgOiBfQmFzZV90eXBlKCkgeyB9CisKKyAgICAgIC8vLyBNb3ZlIGNvbnN0cnVjdG9yCisgICAgICBmdXR1cmUoZnV0dXJlJiYgX191Zikgbm9leGNlcHQgOiBfQmFzZV90eXBlKHN0ZDo6bW92ZShfX3VmKSkgeyB9CisKKyAgICAgIC8vIERpc2FibGUgY29weWluZworICAgICAgZnV0dXJlKGNvbnN0IGZ1dHVyZSYpID0gZGVsZXRlOworICAgICAgZnV0dXJlJiBvcGVyYXRvcj0oY29uc3QgZnV0dXJlJikgPSBkZWxldGU7CisKKyAgICAgIGZ1dHVyZSYgb3BlcmF0b3I9KGZ1dHVyZSYmIF9fZnV0KSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBmdXR1cmUoc3RkOjptb3ZlKF9fZnV0KSkuX01fc3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgICBfUmVzCisgICAgICBnZXQoKQorICAgICAgeworICAgICAgICB0eXBlbmFtZSBfQmFzZV90eXBlOjpfUmVzZXQgX19yZXNldCgqdGhpcyk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUodGhpcy0+X01fZ2V0X3Jlc3VsdCgpLl9NX3ZhbHVlKCkpOworICAgICAgfQorCisgICAgICBzaGFyZWRfZnV0dXJlPF9SZXM+IHNoYXJlKCk7CisgICAgfTsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgZnV0dXJlPFImPgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGNsYXNzIGZ1dHVyZTxfUmVzJj4gOiBwdWJsaWMgX19iYXNpY19mdXR1cmU8X1JlcyY+CisgICAgeworICAgICAgZnJpZW5kIGNsYXNzIHByb21pc2U8X1JlcyY+OworICAgICAgdGVtcGxhdGU8dHlwZW5hbWU+IGZyaWVuZCBjbGFzcyBwYWNrYWdlZF90YXNrOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgZnJpZW5kIGZ1dHVyZTx0eXBlbmFtZSByZXN1bHRfb2Y8X0ZuKF9BcmdzLi4uKT46OnR5cGU+CisgICAgICAgIGFzeW5jKGxhdW5jaCwgX0ZuJiYsIF9BcmdzJiYuLi4pOworCisgICAgICB0eXBlZGVmIF9fYmFzaWNfZnV0dXJlPF9SZXMmPiBfQmFzZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZV90eXBlOjpfX3N0YXRlX3R5cGUgX19zdGF0ZV90eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgZnV0dXJlKGNvbnN0IF9fc3RhdGVfdHlwZSYgX19zdGF0ZSkgOiBfQmFzZV90eXBlKF9fc3RhdGUpIHsgfQorCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIGZ1dHVyZSgpIG5vZXhjZXB0IDogX0Jhc2VfdHlwZSgpIHsgfQorCisgICAgICAvLy8gTW92ZSBjb25zdHJ1Y3RvcgorICAgICAgZnV0dXJlKGZ1dHVyZSYmIF9fdWYpIG5vZXhjZXB0IDogX0Jhc2VfdHlwZShzdGQ6Om1vdmUoX191ZikpIHsgfQorCisgICAgICAvLyBEaXNhYmxlIGNvcHlpbmcKKyAgICAgIGZ1dHVyZShjb25zdCBmdXR1cmUmKSA9IGRlbGV0ZTsKKyAgICAgIGZ1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IGZ1dHVyZSYpID0gZGVsZXRlOworCisgICAgICBmdXR1cmUmIG9wZXJhdG9yPShmdXR1cmUmJiBfX2Z1dCkgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgZnV0dXJlKHN0ZDo6bW92ZShfX2Z1dCkpLl9NX3N3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyBSZXRyaWV2aW5nIHRoZSB2YWx1ZQorICAgICAgX1JlcyYKKyAgICAgIGdldCgpCisgICAgICB7CisgICAgICAgIHR5cGVuYW1lIF9CYXNlX3R5cGU6Ol9SZXNldCBfX3Jlc2V0KCp0aGlzKTsKKyAgICAgICAgcmV0dXJuIHRoaXMtPl9NX2dldF9yZXN1bHQoKS5fTV9nZXQoKTsKKyAgICAgIH0KKworICAgICAgc2hhcmVkX2Z1dHVyZTxfUmVzJj4gc2hhcmUoKTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgZnV0dXJlPHZvaWQ+CisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBmdXR1cmU8dm9pZD4gOiBwdWJsaWMgX19iYXNpY19mdXR1cmU8dm9pZD4KKyAgICB7CisgICAgICBmcmllbmQgY2xhc3MgcHJvbWlzZTx2b2lkPjsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lPiBmcmllbmQgY2xhc3MgcGFja2FnZWRfdGFzazsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GbiwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGZyaWVuZCBmdXR1cmU8dHlwZW5hbWUgcmVzdWx0X29mPF9GbihfQXJncy4uLik+Ojp0eXBlPgorICAgICAgICBhc3luYyhsYXVuY2gsIF9GbiYmLCBfQXJncyYmLi4uKTsKKworICAgICAgdHlwZWRlZiBfX2Jhc2ljX2Z1dHVyZTx2b2lkPiBfQmFzZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZV90eXBlOjpfX3N0YXRlX3R5cGUgX19zdGF0ZV90eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgZnV0dXJlKGNvbnN0IF9fc3RhdGVfdHlwZSYgX19zdGF0ZSkgOiBfQmFzZV90eXBlKF9fc3RhdGUpIHsgfQorCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIGZ1dHVyZSgpIG5vZXhjZXB0IDogX0Jhc2VfdHlwZSgpIHsgfQorCisgICAgICAvLy8gTW92ZSBjb25zdHJ1Y3RvcgorICAgICAgZnV0dXJlKGZ1dHVyZSYmIF9fdWYpIG5vZXhjZXB0IDogX0Jhc2VfdHlwZShzdGQ6Om1vdmUoX191ZikpIHsgfQorCisgICAgICAvLyBEaXNhYmxlIGNvcHlpbmcKKyAgICAgIGZ1dHVyZShjb25zdCBmdXR1cmUmKSA9IGRlbGV0ZTsKKyAgICAgIGZ1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IGZ1dHVyZSYpID0gZGVsZXRlOworCisgICAgICBmdXR1cmUmIG9wZXJhdG9yPShmdXR1cmUmJiBfX2Z1dCkgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgZnV0dXJlKHN0ZDo6bW92ZShfX2Z1dCkpLl9NX3N3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyBSZXRyaWV2aW5nIHRoZSB2YWx1ZQorICAgICAgdm9pZAorICAgICAgZ2V0KCkKKyAgICAgIHsKKyAgICAgICAgdHlwZW5hbWUgX0Jhc2VfdHlwZTo6X1Jlc2V0IF9fcmVzZXQoKnRoaXMpOworICAgICAgICB0aGlzLT5fTV9nZXRfcmVzdWx0KCk7CisgICAgICB9CisKKyAgICAgIHNoYXJlZF9mdXR1cmU8dm9pZD4gc2hhcmUoKTsKKyAgICB9OworCisKKyAgLy8vIFByaW1hcnkgdGVtcGxhdGUgZm9yIHNoYXJlZF9mdXR1cmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgY2xhc3Mgc2hhcmVkX2Z1dHVyZSA6IHB1YmxpYyBfX2Jhc2ljX2Z1dHVyZTxfUmVzPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX19iYXNpY19mdXR1cmU8X1Jlcz4gX0Jhc2VfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIGNvbnN0ZXhwciBzaGFyZWRfZnV0dXJlKCkgbm9leGNlcHQgOiBfQmFzZV90eXBlKCkgeyB9CisKKyAgICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yCisgICAgICBzaGFyZWRfZnV0dXJlKGNvbnN0IHNoYXJlZF9mdXR1cmUmIF9fc2YpIDogX0Jhc2VfdHlwZShfX3NmKSB7IH0KKworICAgICAgLy8vIENvbnN0cnVjdCBmcm9tIGEgZnV0dXJlIHJ2YWx1ZQorICAgICAgc2hhcmVkX2Z1dHVyZShmdXR1cmU8X1Jlcz4mJiBfX3VmKSBub2V4Y2VwdAorICAgICAgOiBfQmFzZV90eXBlKHN0ZDo6bW92ZShfX3VmKSkKKyAgICAgIHsgfQorCisgICAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBzaGFyZWRfZnV0dXJlIHJ2YWx1ZQorICAgICAgc2hhcmVkX2Z1dHVyZShzaGFyZWRfZnV0dXJlJiYgX19zZikgbm9leGNlcHQKKyAgICAgIDogX0Jhc2VfdHlwZShzdGQ6Om1vdmUoX19zZikpCisgICAgICB7IH0KKworICAgICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9mdXR1cmUmIF9fc2YpCisgICAgICB7CisgICAgICAgIHNoYXJlZF9mdXR1cmUoX19zZikuX01fc3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KHNoYXJlZF9mdXR1cmUmJiBfX3NmKSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBzaGFyZWRfZnV0dXJlKHN0ZDo6bW92ZShfX3NmKSkuX01fc3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgICBjb25zdCBfUmVzJgorICAgICAgZ2V0KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fZ2V0X3Jlc3VsdCgpLl9NX3ZhbHVlKCk7IH0KKyAgICB9OworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBzaGFyZWRfZnV0dXJlPFImPgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGNsYXNzIHNoYXJlZF9mdXR1cmU8X1JlcyY+IDogcHVibGljIF9fYmFzaWNfZnV0dXJlPF9SZXMmPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX19iYXNpY19mdXR1cmU8X1JlcyY+ICAgICAgICAgICBfQmFzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIHNoYXJlZF9mdXR1cmUoKSBub2V4Y2VwdCA6IF9CYXNlX3R5cGUoKSB7IH0KKworICAgICAgLy8vIENvcHkgY29uc3RydWN0b3IKKyAgICAgIHNoYXJlZF9mdXR1cmUoY29uc3Qgc2hhcmVkX2Z1dHVyZSYgX19zZikgOiBfQmFzZV90eXBlKF9fc2YpIHsgfQorCisgICAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBmdXR1cmUgcnZhbHVlCisgICAgICBzaGFyZWRfZnV0dXJlKGZ1dHVyZTxfUmVzJj4mJiBfX3VmKSBub2V4Y2VwdAorICAgICAgOiBfQmFzZV90eXBlKHN0ZDo6bW92ZShfX3VmKSkKKyAgICAgIHsgfQorCisgICAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBzaGFyZWRfZnV0dXJlIHJ2YWx1ZQorICAgICAgc2hhcmVkX2Z1dHVyZShzaGFyZWRfZnV0dXJlJiYgX19zZikgbm9leGNlcHQKKyAgICAgIDogX0Jhc2VfdHlwZShzdGQ6Om1vdmUoX19zZikpCisgICAgICB7IH0KKworICAgICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9mdXR1cmUmIF9fc2YpCisgICAgICB7CisgICAgICAgIHNoYXJlZF9mdXR1cmUoX19zZikuX01fc3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KHNoYXJlZF9mdXR1cmUmJiBfX3NmKSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBzaGFyZWRfZnV0dXJlKHN0ZDo6bW92ZShfX3NmKSkuX01fc3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgICBfUmVzJgorICAgICAgZ2V0KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+X01fZ2V0X3Jlc3VsdCgpLl9NX2dldCgpOyB9CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHNoYXJlZF9mdXR1cmU8dm9pZD4KKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIHNoYXJlZF9mdXR1cmU8dm9pZD4gOiBwdWJsaWMgX19iYXNpY19mdXR1cmU8dm9pZD4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fYmFzaWNfZnV0dXJlPHZvaWQ+IF9CYXNlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICBjb25zdGV4cHIgc2hhcmVkX2Z1dHVyZSgpIG5vZXhjZXB0IDogX0Jhc2VfdHlwZSgpIHsgfQorCisgICAgICAvLy8gQ29weSBjb25zdHJ1Y3RvcgorICAgICAgc2hhcmVkX2Z1dHVyZShjb25zdCBzaGFyZWRfZnV0dXJlJiBfX3NmKSA6IF9CYXNlX3R5cGUoX19zZikgeyB9CisKKyAgICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIGZ1dHVyZSBydmFsdWUKKyAgICAgIHNoYXJlZF9mdXR1cmUoZnV0dXJlPHZvaWQ+JiYgX191Zikgbm9leGNlcHQKKyAgICAgIDogX0Jhc2VfdHlwZShzdGQ6Om1vdmUoX191ZikpCisgICAgICB7IH0KKworICAgICAgLy8vIENvbnN0cnVjdCBmcm9tIGEgc2hhcmVkX2Z1dHVyZSBydmFsdWUKKyAgICAgIHNoYXJlZF9mdXR1cmUoc2hhcmVkX2Z1dHVyZSYmIF9fc2YpIG5vZXhjZXB0CisgICAgICA6IF9CYXNlX3R5cGUoc3RkOjptb3ZlKF9fc2YpKQorICAgICAgeyB9CisKKyAgICAgIHNoYXJlZF9mdXR1cmUmIG9wZXJhdG9yPShjb25zdCBzaGFyZWRfZnV0dXJlJiBfX3NmKQorICAgICAgeworICAgICAgICBzaGFyZWRfZnV0dXJlKF9fc2YpLl9NX3N3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHNoYXJlZF9mdXR1cmUmIG9wZXJhdG9yPShzaGFyZWRfZnV0dXJlJiYgX19zZikgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgc2hhcmVkX2Z1dHVyZShzdGQ6Om1vdmUoX19zZikpLl9NX3N3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIFJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgICB2b2lkCisgICAgICBnZXQoKSBjb25zdCB7IHRoaXMtPl9NX2dldF9yZXN1bHQoKTsgfQorICAgIH07CisKKyAgLy8gTm93IHdlIGNhbiBkZWZpbmUgdGhlIHByb3RlY3RlZCBfX2Jhc2ljX2Z1dHVyZSBjb25zdHJ1Y3RvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgaW5saW5lIF9fYmFzaWNfZnV0dXJlPF9SZXM+OjoKKyAgICBfX2Jhc2ljX2Z1dHVyZShjb25zdCBzaGFyZWRfZnV0dXJlPF9SZXM+JiBfX3NmKSBub2V4Y2VwdAorICAgIDogX01fc3RhdGUoX19zZi5fTV9zdGF0ZSkKKyAgICB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGlubGluZSBfX2Jhc2ljX2Z1dHVyZTxfUmVzPjo6CisgICAgX19iYXNpY19mdXR1cmUoc2hhcmVkX2Z1dHVyZTxfUmVzPiYmIF9fc2YpIG5vZXhjZXB0CisgICAgOiBfTV9zdGF0ZShzdGQ6Om1vdmUoX19zZi5fTV9zdGF0ZSkpCisgICAgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBpbmxpbmUgX19iYXNpY19mdXR1cmU8X1Jlcz46OgorICAgIF9fYmFzaWNfZnV0dXJlKGZ1dHVyZTxfUmVzPiYmIF9fdWYpIG5vZXhjZXB0CisgICAgOiBfTV9zdGF0ZShzdGQ6Om1vdmUoX191Zi5fTV9zdGF0ZSkpCisgICAgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBpbmxpbmUgc2hhcmVkX2Z1dHVyZTxfUmVzPgorICAgIGZ1dHVyZTxfUmVzPjo6c2hhcmUoKQorICAgIHsgcmV0dXJuIHNoYXJlZF9mdXR1cmU8X1Jlcz4oc3RkOjptb3ZlKCp0aGlzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGlubGluZSBzaGFyZWRfZnV0dXJlPF9SZXMmPgorICAgIGZ1dHVyZTxfUmVzJj46OnNoYXJlKCkKKyAgICB7IHJldHVybiBzaGFyZWRfZnV0dXJlPF9SZXMmPihzdGQ6Om1vdmUoKnRoaXMpKTsgfQorCisgIGlubGluZSBzaGFyZWRfZnV0dXJlPHZvaWQ+CisgIGZ1dHVyZTx2b2lkPjo6c2hhcmUoKQorICB7IHJldHVybiBzaGFyZWRfZnV0dXJlPHZvaWQ+KHN0ZDo6bW92ZSgqdGhpcykpOyB9CisKKyAgLy8vIFByaW1hcnkgdGVtcGxhdGUgZm9yIHByb21pc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBjbGFzcyBwcm9taXNlCisgICAgeworICAgICAgdHlwZWRlZiBfX2Z1dHVyZV9iYXNlOjpfU3RhdGVfYmFzZSAJX1N0YXRlOworICAgICAgdHlwZWRlZiBfX2Z1dHVyZV9iYXNlOjpfUmVzdWx0PF9SZXM+CV9SZXNfdHlwZTsKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1B0cjxfUmVzX3R5cGU+CV9QdHJfdHlwZTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gZnJpZW5kIGNsYXNzIF9TdGF0ZTo6X1NldHRlcjsKKworICAgICAgc2hhcmVkX3B0cjxfU3RhdGU+ICAgICAgICAgICAgICAgICAgICAgICAgX01fZnV0dXJlOworICAgICAgX1B0cl90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fc3RvcmFnZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHByb21pc2UoKQorICAgICAgOiBfTV9mdXR1cmUoc3RkOjptYWtlX3NoYXJlZDxfU3RhdGU+KCkpLAorCV9NX3N0b3JhZ2UobmV3IF9SZXNfdHlwZSgpKQorICAgICAgeyB9CisKKyAgICAgIHByb21pc2UocHJvbWlzZSYmIF9fcmhzKSBub2V4Y2VwdAorICAgICAgOiBfTV9mdXR1cmUoc3RkOjptb3ZlKF9fcmhzLl9NX2Z1dHVyZSkpLAorCV9NX3N0b3JhZ2Uoc3RkOjptb3ZlKF9fcmhzLl9NX3N0b3JhZ2UpKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgICAgIHByb21pc2UoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2NhdG9yJiBfX2EpCisgICAgICAgIDogX01fZnV0dXJlKHN0ZDo6YWxsb2NhdGVfc2hhcmVkPF9TdGF0ZT4oX19hKSksCisJICBfTV9zdG9yYWdlKF9fZnV0dXJlX2Jhc2U6Ol9TX2FsbG9jYXRlX3Jlc3VsdDxfUmVzPihfX2EpKQorICAgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICAgICAgcHJvbWlzZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvY2F0b3ImLCBwcm9taXNlJiYgX19yaHMpCisgICAgICAgIDogX01fZnV0dXJlKHN0ZDo6bW92ZShfX3Jocy5fTV9mdXR1cmUpKSwKKwkgIF9NX3N0b3JhZ2Uoc3RkOjptb3ZlKF9fcmhzLl9NX3N0b3JhZ2UpKQorICAgICAgICB7IH0KKworICAgICAgcHJvbWlzZShjb25zdCBwcm9taXNlJikgPSBkZWxldGU7CisKKyAgICAgIH5wcm9taXNlKCkKKyAgICAgIHsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KF9NX2Z1dHVyZSkgJiYgIV9NX2Z1dHVyZS51bmlxdWUoKSkKKyAgICAgICAgICBfTV9mdXR1cmUtPl9NX2JyZWFrX3Byb21pc2Uoc3RkOjptb3ZlKF9NX3N0b3JhZ2UpKTsKKyAgICAgIH0KKworICAgICAgLy8gQXNzaWdubWVudAorICAgICAgcHJvbWlzZSYKKyAgICAgIG9wZXJhdG9yPShwcm9taXNlJiYgX19yaHMpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIHByb21pc2Uoc3RkOjptb3ZlKF9fcmhzKSkuc3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcHJvbWlzZSYgb3BlcmF0b3I9KGNvbnN0IHByb21pc2UmKSA9IGRlbGV0ZTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChwcm9taXNlJiBfX3Jocykgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgX01fZnV0dXJlLnN3YXAoX19yaHMuX01fZnV0dXJlKTsKKyAgICAgICAgX01fc3RvcmFnZS5zd2FwKF9fcmhzLl9NX3N0b3JhZ2UpOworICAgICAgfQorCisgICAgICAvLyBSZXRyaWV2aW5nIHRoZSByZXN1bHQKKyAgICAgIGZ1dHVyZTxfUmVzPgorICAgICAgZ2V0X2Z1dHVyZSgpCisgICAgICB7IHJldHVybiBmdXR1cmU8X1Jlcz4oX01fZnV0dXJlKTsgfQorCisgICAgICAvLyBTZXR0aW5nIHRoZSByZXN1bHQKKyAgICAgIHZvaWQKKyAgICAgIHNldF92YWx1ZShjb25zdCBfUmVzJiBfX3IpCisgICAgICB7CisgICAgICAgIGF1dG8gX19zZXR0ZXIgPSBfU3RhdGU6Ol9fc2V0dGVyKHRoaXMsIF9fcik7CisgICAgICAgIF9NX2Z1dHVyZS0+X01fc2V0X3Jlc3VsdChzdGQ6Om1vdmUoX19zZXR0ZXIpKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc2V0X3ZhbHVlKF9SZXMmJiBfX3IpCisgICAgICB7CisgICAgICAgIGF1dG8gX19zZXR0ZXIgPSBfU3RhdGU6Ol9fc2V0dGVyKHRoaXMsIHN0ZDo6bW92ZShfX3IpKTsKKyAgICAgICAgX01fZnV0dXJlLT5fTV9zZXRfcmVzdWx0KHN0ZDo6bW92ZShfX3NldHRlcikpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzZXRfZXhjZXB0aW9uKGV4Y2VwdGlvbl9wdHIgX19wKQorICAgICAgeworICAgICAgICBhdXRvIF9fc2V0dGVyID0gX1N0YXRlOjpfX3NldHRlcihfX3AsIHRoaXMpOworICAgICAgICBfTV9mdXR1cmUtPl9NX3NldF9yZXN1bHQoc3RkOjptb3ZlKF9fc2V0dGVyKSk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChwcm9taXNlPF9SZXM+JiBfX3gsIHByb21pc2U8X1Jlcz4mIF9feSkgbm9leGNlcHQKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHVzZXNfYWxsb2NhdG9yPHByb21pc2U8X1Jlcz4sIF9BbGxvYz4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIHByb21pc2U8UiY+CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgY2xhc3MgcHJvbWlzZTxfUmVzJj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fZnV0dXJlX2Jhc2U6Ol9TdGF0ZV9iYXNlCV9TdGF0ZTsKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1Jlc3VsdDxfUmVzJj4JX1Jlc190eXBlOworICAgICAgdHlwZWRlZiBfX2Z1dHVyZV9iYXNlOjpfUHRyPF9SZXNfdHlwZT4gCV9QdHJfdHlwZTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gZnJpZW5kIGNsYXNzIF9TdGF0ZTo6X1NldHRlcjsKKworICAgICAgc2hhcmVkX3B0cjxfU3RhdGU+ICAgICAgICAgICAgICAgICAgICAgICAgX01fZnV0dXJlOworICAgICAgX1B0cl90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fc3RvcmFnZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHByb21pc2UoKQorICAgICAgOiBfTV9mdXR1cmUoc3RkOjptYWtlX3NoYXJlZDxfU3RhdGU+KCkpLAorCV9NX3N0b3JhZ2UobmV3IF9SZXNfdHlwZSgpKQorICAgICAgeyB9CisKKyAgICAgIHByb21pc2UocHJvbWlzZSYmIF9fcmhzKSBub2V4Y2VwdAorICAgICAgOiBfTV9mdXR1cmUoc3RkOjptb3ZlKF9fcmhzLl9NX2Z1dHVyZSkpLAorCV9NX3N0b3JhZ2Uoc3RkOjptb3ZlKF9fcmhzLl9NX3N0b3JhZ2UpKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgICAgIHByb21pc2UoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2NhdG9yJiBfX2EpCisgICAgICAgIDogX01fZnV0dXJlKHN0ZDo6YWxsb2NhdGVfc2hhcmVkPF9TdGF0ZT4oX19hKSksCisJICBfTV9zdG9yYWdlKF9fZnV0dXJlX2Jhc2U6Ol9TX2FsbG9jYXRlX3Jlc3VsdDxfUmVzJj4oX19hKSkKKyAgICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgICAgIHByb21pc2UoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2NhdG9yJiwgcHJvbWlzZSYmIF9fcmhzKQorICAgICAgICA6IF9NX2Z1dHVyZShzdGQ6Om1vdmUoX19yaHMuX01fZnV0dXJlKSksCisJICBfTV9zdG9yYWdlKHN0ZDo6bW92ZShfX3Jocy5fTV9zdG9yYWdlKSkKKyAgICAgICAgeyB9CisKKyAgICAgIHByb21pc2UoY29uc3QgcHJvbWlzZSYpID0gZGVsZXRlOworCisgICAgICB+cHJvbWlzZSgpCisgICAgICB7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihfTV9mdXR1cmUpICYmICFfTV9mdXR1cmUudW5pcXVlKCkpCisgICAgICAgICAgX01fZnV0dXJlLT5fTV9icmVha19wcm9taXNlKHN0ZDo6bW92ZShfTV9zdG9yYWdlKSk7CisgICAgICB9CisKKyAgICAgIC8vIEFzc2lnbm1lbnQKKyAgICAgIHByb21pc2UmCisgICAgICBvcGVyYXRvcj0ocHJvbWlzZSYmIF9fcmhzKSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBwcm9taXNlKHN0ZDo6bW92ZShfX3JocykpLnN3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHByb21pc2UmIG9wZXJhdG9yPShjb25zdCBwcm9taXNlJikgPSBkZWxldGU7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAocHJvbWlzZSYgX19yaHMpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIF9NX2Z1dHVyZS5zd2FwKF9fcmhzLl9NX2Z1dHVyZSk7CisgICAgICAgIF9NX3N0b3JhZ2Uuc3dhcChfX3Jocy5fTV9zdG9yYWdlKTsKKyAgICAgIH0KKworICAgICAgLy8gUmV0cmlldmluZyB0aGUgcmVzdWx0CisgICAgICBmdXR1cmU8X1JlcyY+CisgICAgICBnZXRfZnV0dXJlKCkKKyAgICAgIHsgcmV0dXJuIGZ1dHVyZTxfUmVzJj4oX01fZnV0dXJlKTsgfQorCisgICAgICAvLyBTZXR0aW5nIHRoZSByZXN1bHQKKyAgICAgIHZvaWQKKyAgICAgIHNldF92YWx1ZShfUmVzJiBfX3IpCisgICAgICB7CisgICAgICAgIGF1dG8gX19zZXR0ZXIgPSBfU3RhdGU6Ol9fc2V0dGVyKHRoaXMsIF9fcik7CisgICAgICAgIF9NX2Z1dHVyZS0+X01fc2V0X3Jlc3VsdChzdGQ6Om1vdmUoX19zZXR0ZXIpKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc2V0X2V4Y2VwdGlvbihleGNlcHRpb25fcHRyIF9fcCkKKyAgICAgIHsKKyAgICAgICAgYXV0byBfX3NldHRlciA9IF9TdGF0ZTo6X19zZXR0ZXIoX19wLCB0aGlzKTsKKyAgICAgICAgX01fZnV0dXJlLT5fTV9zZXRfcmVzdWx0KHN0ZDo6bW92ZShfX3NldHRlcikpOworICAgICAgfQorICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBwcm9taXNlPHZvaWQ+CisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBwcm9taXNlPHZvaWQ+CisgICAgeworICAgICAgdHlwZWRlZiBfX2Z1dHVyZV9iYXNlOjpfU3RhdGVfYmFzZQlfU3RhdGU7CisgICAgICB0eXBlZGVmIF9fZnV0dXJlX2Jhc2U6Ol9SZXN1bHQ8dm9pZD4JX1Jlc190eXBlOworICAgICAgdHlwZWRlZiBfX2Z1dHVyZV9iYXNlOjpfUHRyPF9SZXNfdHlwZT4gCV9QdHJfdHlwZTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gZnJpZW5kIGNsYXNzIF9TdGF0ZTo6X1NldHRlcjsKKworICAgICAgc2hhcmVkX3B0cjxfU3RhdGU+ICAgICAgICAgICAgICAgICAgICAgICAgX01fZnV0dXJlOworICAgICAgX1B0cl90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fc3RvcmFnZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHByb21pc2UoKQorICAgICAgOiBfTV9mdXR1cmUoc3RkOjptYWtlX3NoYXJlZDxfU3RhdGU+KCkpLAorCV9NX3N0b3JhZ2UobmV3IF9SZXNfdHlwZSgpKQorICAgICAgeyB9CisKKyAgICAgIHByb21pc2UocHJvbWlzZSYmIF9fcmhzKSBub2V4Y2VwdAorICAgICAgOiBfTV9mdXR1cmUoc3RkOjptb3ZlKF9fcmhzLl9NX2Z1dHVyZSkpLAorCV9NX3N0b3JhZ2Uoc3RkOjptb3ZlKF9fcmhzLl9NX3N0b3JhZ2UpKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgICAgIHByb21pc2UoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2NhdG9yJiBfX2EpCisgICAgICAgIDogX01fZnV0dXJlKHN0ZDo6YWxsb2NhdGVfc2hhcmVkPF9TdGF0ZT4oX19hKSksCisJICBfTV9zdG9yYWdlKF9fZnV0dXJlX2Jhc2U6Ol9TX2FsbG9jYXRlX3Jlc3VsdDx2b2lkPihfX2EpKQorICAgICAgICB7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjA5NS4gIG1pc3NpbmcgY29uc3RydWN0b3JzIG5lZWRlZCBmb3IgdXNlcy1hbGxvY2F0b3IgY29uc3RydWN0aW9uCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgICAgICBwcm9taXNlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jYXRvciYsIHByb21pc2UmJiBfX3JocykKKyAgICAgICAgOiBfTV9mdXR1cmUoc3RkOjptb3ZlKF9fcmhzLl9NX2Z1dHVyZSkpLAorCSAgX01fc3RvcmFnZShzdGQ6Om1vdmUoX19yaHMuX01fc3RvcmFnZSkpCisgICAgICAgIHsgfQorCisgICAgICBwcm9taXNlKGNvbnN0IHByb21pc2UmKSA9IGRlbGV0ZTsKKworICAgICAgfnByb21pc2UoKQorICAgICAgeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oX01fZnV0dXJlKSAmJiAhX01fZnV0dXJlLnVuaXF1ZSgpKQorICAgICAgICAgIF9NX2Z1dHVyZS0+X01fYnJlYWtfcHJvbWlzZShzdGQ6Om1vdmUoX01fc3RvcmFnZSkpOworICAgICAgfQorCisgICAgICAvLyBBc3NpZ25tZW50CisgICAgICBwcm9taXNlJgorICAgICAgb3BlcmF0b3I9KHByb21pc2UmJiBfX3Jocykgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgcHJvbWlzZShzdGQ6Om1vdmUoX19yaHMpKS5zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBwcm9taXNlJiBvcGVyYXRvcj0oY29uc3QgcHJvbWlzZSYpID0gZGVsZXRlOworCisgICAgICB2b2lkCisgICAgICBzd2FwKHByb21pc2UmIF9fcmhzKSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBfTV9mdXR1cmUuc3dhcChfX3Jocy5fTV9mdXR1cmUpOworICAgICAgICBfTV9zdG9yYWdlLnN3YXAoX19yaHMuX01fc3RvcmFnZSk7CisgICAgICB9CisKKyAgICAgIC8vIFJldHJpZXZpbmcgdGhlIHJlc3VsdAorICAgICAgZnV0dXJlPHZvaWQ+CisgICAgICBnZXRfZnV0dXJlKCkKKyAgICAgIHsgcmV0dXJuIGZ1dHVyZTx2b2lkPihfTV9mdXR1cmUpOyB9CisKKyAgICAgIC8vIFNldHRpbmcgdGhlIHJlc3VsdAorICAgICAgdm9pZCBzZXRfdmFsdWUoKTsKKworICAgICAgdm9pZAorICAgICAgc2V0X2V4Y2VwdGlvbihleGNlcHRpb25fcHRyIF9fcCkKKyAgICAgIHsKKyAgICAgICAgYXV0byBfX3NldHRlciA9IF9TdGF0ZTo6X19zZXR0ZXIoX19wLCB0aGlzKTsKKyAgICAgICAgX01fZnV0dXJlLT5fTV9zZXRfcmVzdWx0KHN0ZDo6bW92ZShfX3NldHRlcikpOworICAgICAgfQorICAgIH07CisKKyAgLy8gc2V0IHZvaWQKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2Z1dHVyZV9iYXNlOjpfU3RhdGVfYmFzZTo6X1NldHRlcjx2b2lkLCB2b2lkPgorICAgIHsKKyAgICAgIHByb21pc2U8dm9pZD46Ol9QdHJfdHlwZSBvcGVyYXRvcigpKCkKKyAgICAgIHsKKyAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3Byb21pc2UtPl9NX2Z1dHVyZSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoX01fcHJvbWlzZS0+X01fc3RvcmFnZSk7CisgICAgICB9CisKKyAgICAgIHByb21pc2U8dm9pZD4qICAgIF9NX3Byb21pc2U7CisgICAgfTsKKworICBpbmxpbmUgX19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2U6Ol9TZXR0ZXI8dm9pZCwgdm9pZD4KKyAgX19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2U6Ol9fc2V0dGVyKHByb21pc2U8dm9pZD4qIF9fcHJvbSkKKyAgeworICAgIHJldHVybiBfU2V0dGVyPHZvaWQsIHZvaWQ+eyBfX3Byb20gfTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIHByb21pc2U8dm9pZD46OnNldF92YWx1ZSgpCisgIHsKKyAgICBhdXRvIF9fc2V0dGVyID0gX1N0YXRlOjpfX3NldHRlcih0aGlzKTsKKyAgICBfTV9mdXR1cmUtPl9NX3NldF9yZXN1bHQoc3RkOjptb3ZlKF9fc2V0dGVyKSk7CisgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHJfdHlwZSwgdHlwZW5hbWUgX1Jlcz4KKyAgICBzdHJ1Y3QgX19mdXR1cmVfYmFzZTo6X1Rhc2tfc2V0dGVyCisgICAgeworICAgICAgX1B0cl90eXBlIG9wZXJhdG9yKCkoKQorICAgICAgeworCV9fdHJ5CisJICB7CisJICAgIF9NX3Jlc3VsdC0+X01fc2V0KF9NX2ZuKCkpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9yZXN1bHQtPl9NX2Vycm9yID0gY3VycmVudF9leGNlcHRpb24oKTsKKwkgIH0KKwlyZXR1cm4gc3RkOjptb3ZlKF9NX3Jlc3VsdCk7CisgICAgICB9CisgICAgICBfUHRyX3R5cGUmICAgICAgICAgICAgICAgIF9NX3Jlc3VsdDsKKyAgICAgIHN0ZDo6ZnVuY3Rpb248X1JlcygpPiAgICAgX01fZm47CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyX3R5cGU+CisgICAgc3RydWN0IF9fZnV0dXJlX2Jhc2U6Ol9UYXNrX3NldHRlcjxfUHRyX3R5cGUsIHZvaWQ+CisgICAgeworICAgICAgX1B0cl90eXBlIG9wZXJhdG9yKCkoKQorICAgICAgeworCV9fdHJ5CisJICB7CisJICAgIF9NX2ZuKCk7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9NX3Jlc3VsdC0+X01fZXJyb3IgPSBjdXJyZW50X2V4Y2VwdGlvbigpOworCSAgfQorCXJldHVybiBzdGQ6Om1vdmUoX01fcmVzdWx0KTsKKyAgICAgIH0KKyAgICAgIF9QdHJfdHlwZSYgICAgICAgICAgICAgICAgX01fcmVzdWx0OworICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+ICAgICBfTV9mbjsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX2Z1dHVyZV9iYXNlOjpfVGFza19zdGF0ZV9iYXNlPF9SZXMoX0FyZ3MuLi4pPgorICAgIDogX19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgX1Jlc190eXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisJX1Rhc2tfc3RhdGVfYmFzZShjb25zdCBfQWxsb2MmIF9fYSkKKwk6IF9NX3Jlc3VsdChfU19hbGxvY2F0ZV9yZXN1bHQ8X1Jlcz4oX19hKSkKKwl7IH0KKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9ydW4oX0FyZ3MuLi4gX19hcmdzKSA9IDA7CisKKyAgICAgIHZpcnR1YWwgc2hhcmVkX3B0cjxfVGFza19zdGF0ZV9iYXNlPgorICAgICAgX01fcmVzZXQoKSA9IDA7CisKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1B0cjxfUmVzdWx0PF9SZXM+PiBfUHRyX3R5cGU7CisgICAgICBfUHRyX3R5cGUgX01fcmVzdWx0OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX2Z1dHVyZV9iYXNlOjpfVGFza19zdGF0ZTxfRm4sIF9BbGxvYywgX1JlcyhfQXJncy4uLik+IGZpbmFsCisgICAgOiBfX2Z1dHVyZV9iYXNlOjpfVGFza19zdGF0ZV9iYXNlPF9SZXMoX0FyZ3MuLi4pPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GbjI+CisJX1Rhc2tfc3RhdGUoX0ZuMiYmIF9fZm4sIGNvbnN0IF9BbGxvYyYgX19hKQorCTogX1Rhc2tfc3RhdGVfYmFzZTxfUmVzKF9BcmdzLi4uKT4oX19hKSwKKwkgIF9NX2ltcGwoc3RkOjpmb3J3YXJkPF9GbjI+KF9fZm4pLCBfX2EpCisgICAgICB7IH0KKworICAgIHByaXZhdGU6CisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIF9NX3J1bihfQXJncy4uLiBfX2FyZ3MpCisgICAgICB7CisJLy8gYm91bmQgYXJndW1lbnRzIGRlY2F5IHNvIHdyYXAgbHZhbHVlIHJlZmVyZW5jZXMKKwlhdXRvIF9fYm91bmRmbiA9IHN0ZDo6X19iaW5kX3NpbXBsZShzdGQ6OnJlZihfTV9pbXBsLl9NX2ZuKSwKKwkgICAgX1NfbWF5YmVfd3JhcF9yZWYoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpKS4uLik7CisJYXV0byBfX3NldHRlciA9IF9TX3Rhc2tfc2V0dGVyKHRoaXMtPl9NX3Jlc3VsdCwgc3RkOjptb3ZlKF9fYm91bmRmbikpOworCXRoaXMtPl9NX3NldF9yZXN1bHQoc3RkOjptb3ZlKF9fc2V0dGVyKSk7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgc2hhcmVkX3B0cjxfVGFza19zdGF0ZV9iYXNlPF9SZXMoX0FyZ3MuLi4pPj4KKyAgICAgIF9NX3Jlc2V0KCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwlzdGF0aWMgcmVmZXJlbmNlX3dyYXBwZXI8X1RwPgorCV9TX21heWJlX3dyYXBfcmVmKF9UcCYgX190KQorCXsgcmV0dXJuIHN0ZDo6cmVmKF9fdCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCXN0YXRpYworCXR5cGVuYW1lIGVuYWJsZV9pZjwhaXNfbHZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSwgX1RwPjo6dHlwZSYmCisJX1NfbWF5YmVfd3JhcF9yZWYoX1RwJiYgX190KQorCXsgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxfVHA+KF9fdCk7IH0KKworICAgICAgc3RydWN0IF9JbXBsIDogX0FsbG9jCisgICAgICB7CisJdGVtcGxhdGU8dHlwZW5hbWUgX0ZuMj4KKwkgIF9JbXBsKF9GbjImJiBfX2ZuLCBjb25zdCBfQWxsb2MmIF9fYSkKKwkgIDogX0FsbG9jKF9fYSksIF9NX2ZuKHN0ZDo6Zm9yd2FyZDxfRm4yPihfX2ZuKSkgeyB9CisJX0ZuIF9NX2ZuOworICAgICAgfSBfTV9pbXBsOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlLCB0eXBlbmFtZSBfRm4sIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0YXRpYyBzaGFyZWRfcHRyPF9fZnV0dXJlX2Jhc2U6Ol9UYXNrX3N0YXRlX2Jhc2U8X1NpZ25hdHVyZT4+CisgICAgICBfX2NyZWF0ZV90YXNrX3N0YXRlKF9GbiYmIF9fZm4sIGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBkZWNheTxfRm4+Ojp0eXBlIF9GbjI7CisgICAgICB0eXBlZGVmIF9fZnV0dXJlX2Jhc2U6Ol9UYXNrX3N0YXRlPF9GbjIsIF9BbGxvYywgX1NpZ25hdHVyZT4gX1N0YXRlOworICAgICAgcmV0dXJuIHN0ZDo6YWxsb2NhdGVfc2hhcmVkPF9TdGF0ZT4oX19hLCBzdGQ6OmZvcndhcmQ8X0ZuPihfX2ZuKSwgX19hKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm4sIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc2hhcmVkX3B0cjxfX2Z1dHVyZV9iYXNlOjpfVGFza19zdGF0ZV9iYXNlPF9SZXMoX0FyZ3MuLi4pPj4KKyAgICBfX2Z1dHVyZV9iYXNlOjpfVGFza19zdGF0ZTxfRm4sIF9BbGxvYywgX1JlcyhfQXJncy4uLik+OjpfTV9yZXNldCgpCisgICAgeworICAgICAgcmV0dXJuIF9fY3JlYXRlX3Rhc2tfc3RhdGU8X1JlcyhfQXJncy4uLik+KHN0ZDo6bW92ZShfTV9pbXBsLl9NX2ZuKSwKKwkJCQkJCSBzdGF0aWNfY2FzdDxfQWxsb2MmPihfTV9pbXBsKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UYXNrLCB0eXBlbmFtZSBfRm4sIGJvb2wKKwkgICA9IGlzX3NhbWU8X1Rhc2ssIHR5cGVuYW1lIGRlY2F5PF9Gbj46OnR5cGU+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX19jb25zdHJhaW5fcGtnZHRhc2sKKyAgICB7IHR5cGVkZWYgdm9pZCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Rhc2ssIHR5cGVuYW1lIF9Gbj4KKyAgICBzdHJ1Y3QgX19jb25zdHJhaW5fcGtnZHRhc2s8X1Rhc2ssIF9GbiwgdHJ1ZT4KKyAgICB7IH07CisKKyAgLy8vIHBhY2thZ2VkX3Rhc2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIHBhY2thZ2VkX3Rhc2s8X1JlcyhfQXJnVHlwZXMuLi4pPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1Rhc2tfc3RhdGVfYmFzZTxfUmVzKF9BcmdUeXBlcy4uLik+IF9TdGF0ZV90eXBlOworICAgICAgc2hhcmVkX3B0cjxfU3RhdGVfdHlwZT4gICAgICAgICAgICAgICAgICAgX01fc3RhdGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3Rpb24gYW5kIGRlc3RydWN0aW9uCisgICAgICBwYWNrYWdlZF90YXNrKCkgbm9leGNlcHQgeyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIwOTUuICBtaXNzaW5nIGNvbnN0cnVjdG9ycyBuZWVkZWQgZm9yIHVzZXMtYWxsb2NhdG9yIGNvbnN0cnVjdGlvbgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jYXRvcj4KKwlwYWNrYWdlZF90YXNrKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jYXRvciYgX19hKSBub2V4Y2VwdAorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm4sIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgX19jb25zdHJhaW5fcGtnZHRhc2s8cGFja2FnZWRfdGFzaywgX0ZuPjo6X190eXBlPgorCWV4cGxpY2l0CisJcGFja2FnZWRfdGFzayhfRm4mJiBfX2ZuKQorCTogcGFja2FnZWRfdGFzayhhbGxvY2F0b3JfYXJnLCBzdGQ6OmFsbG9jYXRvcjxpbnQ+KCksCisJCQlzdGQ6OmZvcndhcmQ8X0ZuPihfX2ZuKSkKKwl7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjA5Ny4gIHBhY2thZ2VkX3Rhc2sgY29uc3RydWN0b3JzIHNob3VsZCBiZSBjb25zdHJhaW5lZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgX19jb25zdHJhaW5fcGtnZHRhc2s8cGFja2FnZWRfdGFzaywgX0ZuPjo6X190eXBlPgorCWV4cGxpY2l0CisJcGFja2FnZWRfdGFzayhhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYgX19hLCBfRm4mJiBfX2ZuKQorCTogX01fc3RhdGUoX19jcmVhdGVfdGFza19zdGF0ZTxfUmVzKF9BcmdUeXBlcy4uLik+KAorCQkgICAgc3RkOjpmb3J3YXJkPF9Gbj4oX19mbiksIF9fYSkpCisJeyB9CisKKyAgICAgIH5wYWNrYWdlZF90YXNrKCkKKyAgICAgIHsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KF9NX3N0YXRlKSAmJiAhX01fc3RhdGUudW5pcXVlKCkpCisJICBfTV9zdGF0ZS0+X01fYnJlYWtfcHJvbWlzZShzdGQ6Om1vdmUoX01fc3RhdGUtPl9NX3Jlc3VsdCkpOworICAgICAgfQorCisgICAgICAvLyBObyBjb3B5CisgICAgICBwYWNrYWdlZF90YXNrKGNvbnN0IHBhY2thZ2VkX3Rhc2smKSA9IGRlbGV0ZTsKKyAgICAgIHBhY2thZ2VkX3Rhc2smIG9wZXJhdG9yPShjb25zdCBwYWNrYWdlZF90YXNrJikgPSBkZWxldGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvY2F0b3I+CisJcGFja2FnZWRfdGFzayhhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvY2F0b3ImLAorCQkgICAgICBjb25zdCBwYWNrYWdlZF90YXNrJikgPSBkZWxldGU7CisKKyAgICAgIC8vIE1vdmUgc3VwcG9ydAorICAgICAgcGFja2FnZWRfdGFzayhwYWNrYWdlZF90YXNrJiYgX19vdGhlcikgbm9leGNlcHQKKyAgICAgIHsgdGhpcy0+c3dhcChfX290aGVyKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2NhdG9yPgorCXBhY2thZ2VkX3Rhc2soYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2NhdG9yJiwKKwkJICAgICAgcGFja2FnZWRfdGFzayYmIF9fb3RoZXIpIG5vZXhjZXB0CisJeyB0aGlzLT5zd2FwKF9fb3RoZXIpOyB9CisKKyAgICAgIHBhY2thZ2VkX3Rhc2smIG9wZXJhdG9yPShwYWNrYWdlZF90YXNrJiYgX19vdGhlcikgbm9leGNlcHQKKyAgICAgIHsKKwlwYWNrYWdlZF90YXNrKHN0ZDo6bW92ZShfX290aGVyKSkuc3dhcCgqdGhpcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHBhY2thZ2VkX3Rhc2smIF9fb3RoZXIpIG5vZXhjZXB0CisgICAgICB7IF9NX3N0YXRlLnN3YXAoX19vdGhlci5fTV9zdGF0ZSk7IH0KKworICAgICAgYm9vbAorICAgICAgdmFsaWQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX01fc3RhdGUpOyB9CisKKyAgICAgIC8vIFJlc3VsdCByZXRyaWV2YWwKKyAgICAgIGZ1dHVyZTxfUmVzPgorICAgICAgZ2V0X2Z1dHVyZSgpCisgICAgICB7IHJldHVybiBmdXR1cmU8X1Jlcz4oX01fc3RhdGUpOyB9CisKKyAgICAgIC8vIEV4ZWN1dGlvbgorICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgICAgeworCV9fZnV0dXJlX2Jhc2U6Ol9TdGF0ZV9iYXNlOjpfU19jaGVjayhfTV9zdGF0ZSk7CisJX01fc3RhdGUtPl9NX3J1bihzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeworCV9fZnV0dXJlX2Jhc2U6Ol9TdGF0ZV9iYXNlOjpfU19jaGVjayhfTV9zdGF0ZSk7CisJcGFja2FnZWRfdGFzayBfX3RtcDsKKwlfX3RtcC5fTV9zdGF0ZSA9IF9NX3N0YXRlOworCV9NX3N0YXRlID0gX01fc3RhdGUtPl9NX3Jlc2V0KCk7CisgICAgICB9CisgICAgfTsKKworICAvLy8gc3dhcAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHBhY2thZ2VkX3Rhc2s8X1JlcyhfQXJnVHlwZXMuLi4pPiYgX194LAorCSBwYWNrYWdlZF90YXNrPF9SZXMoX0FyZ1R5cGVzLi4uKT4mIF9feSkgbm9leGNlcHQKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHVzZXNfYWxsb2NhdG9yPHBhY2thZ2VkX3Rhc2s8X1Jlcz4sIF9BbGxvYz4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JvdW5kRm4sIHR5cGVuYW1lIF9SZXM+CisgICAgY2xhc3MgX19mdXR1cmVfYmFzZTo6X0RlZmVycmVkX3N0YXRlIGZpbmFsCisgICAgOiBwdWJsaWMgX19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIF9EZWZlcnJlZF9zdGF0ZShfQm91bmRGbiYmIF9fZm4pCisgICAgICA6IF9NX3Jlc3VsdChuZXcgX1Jlc3VsdDxfUmVzPigpKSwgX01fZm4oc3RkOjptb3ZlKF9fZm4pKQorICAgICAgeyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2Z1dHVyZV9iYXNlOjpfUHRyPF9SZXN1bHQ8X1Jlcz4+IF9QdHJfdHlwZTsKKyAgICAgIF9QdHJfdHlwZSBfTV9yZXN1bHQ7CisgICAgICBfQm91bmRGbiBfTV9mbjsKKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9ydW5fZGVmZXJyZWQoKQorICAgICAgeworICAgICAgICAvLyBzYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMgc28gaWdub3JlIGZhaWx1cmUKKyAgICAgICAgX01fc2V0X3Jlc3VsdChfU190YXNrX3NldHRlcihfTV9yZXN1bHQsIF9NX2ZuKSwgdHJ1ZSk7CisgICAgICB9CisgICAgfTsKKworICBjbGFzcyBfX2Z1dHVyZV9iYXNlOjpfQXN5bmNfc3RhdGVfY29tbW9uIDogcHVibGljIF9fZnV0dXJlX2Jhc2U6Ol9TdGF0ZV9iYXNlCisgIHsKKyAgcHJvdGVjdGVkOgorI2lmZGVmIF9HTElCQ1hYX0FTWU5DX0FCSV9DT01QQVQKKyAgICB+X0FzeW5jX3N0YXRlX2NvbW1vbigpOworI2Vsc2UKKyAgICB+X0FzeW5jX3N0YXRlX2NvbW1vbigpID0gZGVmYXVsdDsKKyNlbmRpZgorCisgICAgLy8gQWxsb3cgbm9uLXRpbWVkIHdhaXRpbmcgZnVuY3Rpb25zIHRvIGJsb2NrIHVudGlsIHRoZSB0aHJlYWQgY29tcGxldGVzLAorICAgIC8vIGFzIGlmIGpvaW5lZC4KKyAgICB2aXJ0dWFsIHZvaWQgX01fcnVuX2RlZmVycmVkKCkgeyBfTV9qb2luKCk7IH0KKworICAgIHZvaWQgX01fam9pbigpIHsgc3RkOjpjYWxsX29uY2UoX01fb25jZSwgJnRocmVhZDo6am9pbiwgcmVmKF9NX3RocmVhZCkpOyB9CisKKyAgICB0aHJlYWQgX01fdGhyZWFkOworICAgIG9uY2VfZmxhZyBfTV9vbmNlOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Cb3VuZEZuLCB0eXBlbmFtZSBfUmVzPgorICAgIGNsYXNzIF9fZnV0dXJlX2Jhc2U6Ol9Bc3luY19zdGF0ZV9pbXBsIGZpbmFsCisgICAgOiBwdWJsaWMgX19mdXR1cmVfYmFzZTo6X0FzeW5jX3N0YXRlX2NvbW1vbgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgX0FzeW5jX3N0YXRlX2ltcGwoX0JvdW5kRm4mJiBfX2ZuKQorICAgICAgOiBfTV9yZXN1bHQobmV3IF9SZXN1bHQ8X1Jlcz4oKSksIF9NX2ZuKHN0ZDo6bW92ZShfX2ZuKSkKKyAgICAgIHsKKwlfTV90aHJlYWQgPSBzdGQ6OnRocmVhZHsgW3RoaXNdIHsKKwkgIF9NX3NldF9yZXN1bHQoX1NfdGFza19zZXR0ZXIoX01fcmVzdWx0LCBfTV9mbikpOworICAgICAgICB9IH07CisgICAgICB9CisKKyAgICAgIH5fQXN5bmNfc3RhdGVfaW1wbCgpIHsgX01fam9pbigpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2Z1dHVyZV9iYXNlOjpfUHRyPF9SZXN1bHQ8X1Jlcz4+IF9QdHJfdHlwZTsKKyAgICAgIF9QdHJfdHlwZSBfTV9yZXN1bHQ7CisgICAgICBfQm91bmRGbiBfTV9mbjsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Cb3VuZEZuPgorICAgIGlubGluZSBzdGQ6OnNoYXJlZF9wdHI8X19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2U+CisgICAgX19mdXR1cmVfYmFzZTo6X1NfbWFrZV9kZWZlcnJlZF9zdGF0ZShfQm91bmRGbiYmIF9fZm4pCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9Cb3VuZEZuPjo6dHlwZSBfX2ZuX3R5cGU7CisgICAgICB0eXBlZGVmIF9EZWZlcnJlZF9zdGF0ZTxfX2ZuX3R5cGU+IF9fc3RhdGVfdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPF9fc3RhdGVfdHlwZT4oc3RkOjptb3ZlKF9fZm4pKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JvdW5kRm4+CisgICAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxfX2Z1dHVyZV9iYXNlOjpfU3RhdGVfYmFzZT4KKyAgICBfX2Z1dHVyZV9iYXNlOjpfU19tYWtlX2FzeW5jX3N0YXRlKF9Cb3VuZEZuJiYgX19mbikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0JvdW5kRm4+Ojp0eXBlIF9fZm5fdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FzeW5jX3N0YXRlX2ltcGw8X19mbl90eXBlPiBfX3N0YXRlX3R5cGU7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxfX3N0YXRlX3R5cGU+KHN0ZDo6bW92ZShfX2ZuKSk7CisgICAgfQorCisKKyAgLy8vIGFzeW5jCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GbiwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgZnV0dXJlPHR5cGVuYW1lIHJlc3VsdF9vZjxfRm4oX0FyZ3MuLi4pPjo6dHlwZT4KKyAgICBhc3luYyhsYXVuY2ggX19wb2xpY3ksIF9GbiYmIF9fZm4sIF9BcmdzJiYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVzdWx0X29mPF9GbihfQXJncy4uLik+Ojp0eXBlIHJlc3VsdF90eXBlOworICAgICAgc3RkOjpzaGFyZWRfcHRyPF9fZnV0dXJlX2Jhc2U6Ol9TdGF0ZV9iYXNlPiBfX3N0YXRlOworICAgICAgaWYgKChfX3BvbGljeSAmIChsYXVuY2g6OmFzeW5jfGxhdW5jaDo6ZGVmZXJyZWQpKSA9PSBsYXVuY2g6OmFzeW5jKQorCXsKKwkgIF9fc3RhdGUgPSBfX2Z1dHVyZV9iYXNlOjpfU19tYWtlX2FzeW5jX3N0YXRlKHN0ZDo6X19iaW5kX3NpbXBsZSgKKyAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPF9Gbj4oX19mbiksIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfX3N0YXRlID0gX19mdXR1cmVfYmFzZTo6X1NfbWFrZV9kZWZlcnJlZF9zdGF0ZShzdGQ6Ol9fYmluZF9zaW1wbGUoCisgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxfRm4+KF9fZm4pLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKTsKKwl9CisgICAgICByZXR1cm4gZnV0dXJlPHJlc3VsdF90eXBlPihfX3N0YXRlKTsKKyAgICB9CisKKyAgLy8vIGFzeW5jLCBwb3RlbnRpYWwgb3ZlcmxvYWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUgZnV0dXJlPHR5cGVuYW1lIHJlc3VsdF9vZjxfRm4oX0FyZ3MuLi4pPjo6dHlwZT4KKyAgICBhc3luYyhfRm4mJiBfX2ZuLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICByZXR1cm4gYXN5bmMobGF1bmNoOjphc3luY3xsYXVuY2g6OmRlZmVycmVkLCBzdGQ6OmZvcndhcmQ8X0ZuPihfX2ZuKSwKKwkJICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9IQVNfR1RIUkVBRFMgJiYgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisgICAgICAgLy8gJiYgQVRPTUlDX0lOVF9MT0NLX0ZSRUUKKworICAvLyBAfSBncm91cCBmdXR1cmVzCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfRlVUVVJFCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2luaXRpYWxpemVyX2xpc3QgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2luaXRpYWxpemVyX2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5Mjk4YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaW5pdGlhbGl6ZXJfbGlzdApAQCAtMCwwICsxLDEwNyBAQAorLy8gc3RkOjppbml0aWFsaXplcl9saXN0IHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorLy8KKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisvLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5pdGlhbGl6ZXJfbGlzdAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfSU5JVElBTElaRVJfTElTVAorI2RlZmluZSBfSU5JVElBTElaRVJfTElTVAorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZSAvLyBDKysweAorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKK25hbWVzcGFjZSBzdGQKK3sKKyAgLy8vIGluaXRpYWxpemVyX2xpc3QKKyAgdGVtcGxhdGU8Y2xhc3MgX0U+CisgICAgY2xhc3MgaW5pdGlhbGl6ZXJfbGlzdAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9FIAkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX0UmIAlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9FJiAJY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzaXplX3QgCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IF9FKiAJaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIGNvbnN0IF9FKiAJY29uc3RfaXRlcmF0b3I7CisKKyAgICBwcml2YXRlOgorICAgICAgaXRlcmF0b3IJCQlfTV9hcnJheTsKKyAgICAgIHNpemVfdHlwZQkJCV9NX2xlbjsKKworICAgICAgLy8gVGhlIGNvbXBpbGVyIGNhbiBjYWxsIGEgcHJpdmF0ZSBjb25zdHJ1Y3Rvci4KKyAgICAgIGNvbnN0ZXhwciBpbml0aWFsaXplcl9saXN0KGNvbnN0X2l0ZXJhdG9yIF9fYSwgc2l6ZV90eXBlIF9fbCkKKyAgICAgIDogX01fYXJyYXkoX19hKSwgX01fbGVuKF9fbCkgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICBjb25zdGV4cHIgaW5pdGlhbGl6ZXJfbGlzdCgpIG5vZXhjZXB0CisgICAgICA6IF9NX2FycmF5KDApLCBfTV9sZW4oMCkgeyB9CisKKyAgICAgIC8vIE51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgIGNvbnN0ZXhwciBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBfTV9sZW47IH0KKworICAgICAgLy8gRmlyc3QgZWxlbWVudC4KKyAgICAgIGNvbnN0ZXhwciBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBfTV9hcnJheTsgfQorCisgICAgICAvLyBPbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50LgorICAgICAgY29uc3RleHByIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBiZWdpbigpICsgc2l6ZSgpOyB9CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSBpbml0aWxpemVyX2xpc3QuCisgICAqICBAcGFyYW0gIF9faWxzICBJbml0aWFsaXplciBsaXN0LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGNvbnN0ZXhwciBjb25zdCBfVHAqCisgICAgYmVnaW4oaW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWxzKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9faWxzLmJlZ2luKCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQKKyAgICogICAgICAgICAgb2YgdGhlIGluaXRpbGl6ZXJfbGlzdC4KKyAgICogIEBwYXJhbSAgX19pbHMgIEluaXRpYWxpemVyIGxpc3QuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgY29uc3RleHByIGNvbnN0IF9UcCoKKyAgICBlbmQoaW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWxzKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9faWxzLmVuZCgpOyB9Cit9CisKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcG9wCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0lOSVRJQUxJWkVSX0xJU1QKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaW9tYW5pcCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaW9tYW5pcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTlkMjIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9pb21hbmlwCkBAIC0wLDAgKzEsMzc1IEBACisvLyBTdGFuZGFyZCBzdHJlYW0gbWFuaXB1bGF0b3JzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2lvbWFuaXAKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy42LjMgIFN0YW5kYXJkIG1hbmlwdWxhdG9ycworLy8KKworI2lmbmRlZiBfR0xJQkNYWF9JT01BTklQCisjZGVmaW5lIF9HTElCQ1hYX0lPTUFOSVAgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxiaXRzL2lvc19iYXNlLmg+CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8bG9jYWxlPgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBbMjcuNi4zXSBzdGFuZGFyZCBtYW5pcHVsYXRvcnMKKyAgLy8gQWxzbyBzZWUgRFIgMTgzLgorCisgIHN0cnVjdCBfUmVzZXRpb3NmbGFncyB7IGlvc19iYXNlOjpmbXRmbGFncyBfTV9tYXNrOyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBNYW5pcHVsYXRvciBmb3IgQGMgc2V0Zi4KKyAgICogIEBwYXJhbSAgX19tYXNrICBBIGZvcm1hdCBmbGFncyBtYXNrLgorICAgKgorICAgKiAgU2VudCB0byBhIHN0cmVhbSBvYmplY3QsIHRoaXMgbWFuaXB1bGF0b3IgcmVzZXRzIHRoZSBzcGVjaWZpZWQgZmxhZ3MsCisgICAqICB2aWEgQGUgc3RyZWFtLnNldGYoMCxfX21hc2spLgorICAqLworICBpbmxpbmUgX1Jlc2V0aW9zZmxhZ3MgCisgIHJlc2V0aW9zZmxhZ3MoaW9zX2Jhc2U6OmZtdGZsYWdzIF9fbWFzaykKKyAgeyByZXR1cm4geyBfX21hc2sgfTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgX1Jlc2V0aW9zZmxhZ3MgX19mKQorICAgIHsgCisgICAgICBfX2lzLnNldGYoaW9zX2Jhc2U6OmZtdGZsYWdzKDApLCBfX2YuX01fbWFzayk7IAorICAgICAgcmV0dXJuIF9faXM7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIF9SZXNldGlvc2ZsYWdzIF9fZikKKyAgICB7IAorICAgICAgX19vcy5zZXRmKGlvc19iYXNlOjpmbXRmbGFncygwKSwgX19mLl9NX21hc2spOyAKKyAgICAgIHJldHVybiBfX29zOyAKKyAgICB9CisKKworICBzdHJ1Y3QgX1NldGlvc2ZsYWdzIHsgaW9zX2Jhc2U6OmZtdGZsYWdzIF9NX21hc2s7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1hbmlwdWxhdG9yIGZvciBAYyBzZXRmLgorICAgKiAgQHBhcmFtICBfX21hc2sgIEEgZm9ybWF0IGZsYWdzIG1hc2suCisgICAqCisgICAqICBTZW50IHRvIGEgc3RyZWFtIG9iamVjdCwgdGhpcyBtYW5pcHVsYXRvciBzZXRzIHRoZSBmb3JtYXQgZmxhZ3MKKyAgICogIHRvIEBhIF9fbWFzay4KKyAgKi8KKyAgaW5saW5lIF9TZXRpb3NmbGFncyAKKyAgc2V0aW9zZmxhZ3MoaW9zX2Jhc2U6OmZtdGZsYWdzIF9fbWFzaykKKyAgeyByZXR1cm4geyBfX21hc2sgfTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgX1NldGlvc2ZsYWdzIF9fZikKKyAgICB7IAorICAgICAgX19pcy5zZXRmKF9fZi5fTV9tYXNrKTsgCisgICAgICByZXR1cm4gX19pczsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgX1NldGlvc2ZsYWdzIF9fZikKKyAgICB7IAorICAgICAgX19vcy5zZXRmKF9fZi5fTV9tYXNrKTsgCisgICAgICByZXR1cm4gX19vczsgCisgICAgfQorCisKKyAgc3RydWN0IF9TZXRiYXNlIHsgaW50IF9NX2Jhc2U7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1hbmlwdWxhdG9yIGZvciBAYyBzZXRmLgorICAgKiAgQHBhcmFtICBfX2Jhc2UgIEEgbnVtZXJpYyBiYXNlLgorICAgKgorICAgKiAgU2VudCB0byBhIHN0cmVhbSBvYmplY3QsIHRoaXMgbWFuaXB1bGF0b3IgY2hhbmdlcyB0aGUKKyAgICogIEBjIGlvc19iYXNlOjpiYXNlZmllbGQgZmxhZ3MgdG8gQGMgb2N0LCBAYyBkZWMsIG9yIEBjIGhleCB3aGVuIEBhIGJhc2UKKyAgICogIGlzIDgsIDEwLCBvciAxNiwgYWNjb3JkaW5nbHksIGFuZCB0byAwIGlmIEBhIF9fYmFzZSBpcyBhbnkgb3RoZXIgdmFsdWUuCisgICovCisgIGlubGluZSBfU2V0YmFzZSAKKyAgc2V0YmFzZShpbnQgX19iYXNlKQorICB7IHJldHVybiB7IF9fYmFzZSB9OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIAorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBfU2V0YmFzZSBfX2YpCisgICAgeworICAgICAgX19pcy5zZXRmKF9fZi5fTV9iYXNlID09ICA4ID8gaW9zX2Jhc2U6Om9jdCA6IAorCQlfX2YuX01fYmFzZSA9PSAxMCA/IGlvc19iYXNlOjpkZWMgOiAKKwkJX19mLl9NX2Jhc2UgPT0gMTYgPyBpb3NfYmFzZTo6aGV4IDogCisJCWlvc19iYXNlOjpmbXRmbGFncygwKSwgaW9zX2Jhc2U6OmJhc2VmaWVsZCk7CisgICAgICByZXR1cm4gX19pczsgCisgICAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIAorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBfU2V0YmFzZSBfX2YpCisgICAgeworICAgICAgX19vcy5zZXRmKF9fZi5fTV9iYXNlID09ICA4ID8gaW9zX2Jhc2U6Om9jdCA6IAorCQlfX2YuX01fYmFzZSA9PSAxMCA/IGlvc19iYXNlOjpkZWMgOiAKKwkJX19mLl9NX2Jhc2UgPT0gMTYgPyBpb3NfYmFzZTo6aGV4IDogCisJCWlvc19iYXNlOjpmbXRmbGFncygwKSwgaW9zX2Jhc2U6OmJhc2VmaWVsZCk7CisgICAgICByZXR1cm4gX19vczsgCisgICAgfQorICAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgc3RydWN0IF9TZXRmaWxsIHsgX0NoYXJUIF9NX2M7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1hbmlwdWxhdG9yIGZvciBAYyBmaWxsLgorICAgKiAgQHBhcmFtICBfX2MgIFRoZSBuZXcgZmlsbCBjaGFyYWN0ZXIuCisgICAqCisgICAqICBTZW50IHRvIGEgc3RyZWFtIG9iamVjdCwgdGhpcyBtYW5pcHVsYXRvciBjYWxscyBAYyBmaWxsKF9fYykgZm9yIHRoYXQKKyAgICogIG9iamVjdC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBfU2V0ZmlsbDxfQ2hhclQ+CisgICAgc2V0ZmlsbChfQ2hhclQgX19jKQorICAgIHsgcmV0dXJuIHsgX19jIH07IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIF9TZXRmaWxsPF9DaGFyVD4gX19mKQorICAgIHsgCisgICAgICBfX2lzLmZpbGwoX19mLl9NX2MpOyAKKyAgICAgIHJldHVybiBfX2lzOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIAorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBfU2V0ZmlsbDxfQ2hhclQ+IF9fZikKKyAgICB7IAorICAgICAgX19vcy5maWxsKF9fZi5fTV9jKTsgCisgICAgICByZXR1cm4gX19vczsgCisgICAgfQorCisKKyAgc3RydWN0IF9TZXRwcmVjaXNpb24geyBpbnQgX01fbjsgfTsKKworICAvKioKKyAgICogIEBicmllZiAgTWFuaXB1bGF0b3IgZm9yIEBjIHByZWNpc2lvbi4KKyAgICogIEBwYXJhbSAgX19uICBUaGUgbmV3IHByZWNpc2lvbi4KKyAgICoKKyAgICogIFNlbnQgdG8gYSBzdHJlYW0gb2JqZWN0LCB0aGlzIG1hbmlwdWxhdG9yIGNhbGxzIEBjIHByZWNpc2lvbihfX24pIGZvcgorICAgKiAgdGhhdCBvYmplY3QuCisgICovCisgIGlubGluZSBfU2V0cHJlY2lzaW9uIAorICBzZXRwcmVjaXNpb24oaW50IF9fbikKKyAgeyByZXR1cm4geyBfX24gfTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgX1NldHByZWNpc2lvbiBfX2YpCisgICAgeyAKKyAgICAgIF9faXMucHJlY2lzaW9uKF9fZi5fTV9uKTsgCisgICAgICByZXR1cm4gX19pczsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgX1NldHByZWNpc2lvbiBfX2YpCisgICAgeyAKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fZi5fTV9uKTsgCisgICAgICByZXR1cm4gX19vczsgCisgICAgfQorCisKKyAgc3RydWN0IF9TZXR3IHsgaW50IF9NX247IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1hbmlwdWxhdG9yIGZvciBAYyB3aWR0aC4KKyAgICogIEBwYXJhbSAgX19uICBUaGUgbmV3IHdpZHRoLgorICAgKgorICAgKiAgU2VudCB0byBhIHN0cmVhbSBvYmplY3QsIHRoaXMgbWFuaXB1bGF0b3IgY2FsbHMgQGMgd2lkdGgoX19uKSBmb3IKKyAgICogIHRoYXQgb2JqZWN0LgorICAqLworICBpbmxpbmUgX1NldHcgCisgIHNldHcoaW50IF9fbikKKyAgeyByZXR1cm4geyBfX24gfTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgX1NldHcgX19mKQorICAgIHsKKyAgICAgIF9faXMud2lkdGgoX19mLl9NX24pOworICAgICAgcmV0dXJuIF9faXM7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIF9TZXR3IF9fZikKKyAgICB7CisgICAgICBfX29zLndpZHRoKF9fZi5fTV9uKTsKKyAgICAgIHJldHVybiBfX29zOyAKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTW9uZXlUPgorICAgIHN0cnVjdCBfR2V0X21vbmV5IHsgX01vbmV5VCYgX01fbW9uOyBib29sIF9NX2ludGw7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEV4dGVuZGVkIG1hbmlwdWxhdG9yIGZvciBleHRyYWN0aW5nIG1vbmV5LgorICAgKiAgQHBhcmFtICBfX21vbiAgRWl0aGVyIGxvbmcgZG91YmxlIG9yIGEgc3BlY2lhbGl6YXRpb24gb2YgQGMgYmFzaWNfc3RyaW5nLgorICAgKiAgQHBhcmFtICBfX2ludGwgQSBib29sIGluZGljYXRpbmcgd2hldGhlciBpbnRlcm5hdGlvbmFsIGZvcm1hdCAKKyAgICogICAgICAgICAgICAgICAgIGlzIHRvIGJlIHVzZWQuCisgICAqCisgICAqICBTZW50IHRvIGEgc3RyZWFtIG9iamVjdCwgdGhpcyBtYW5pcHVsYXRvciBleHRyYWN0cyBAYSBfX21vbi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01vbmV5VD4KKyAgICBpbmxpbmUgX0dldF9tb25leTxfTW9uZXlUPgorICAgIGdldF9tb25leShfTW9uZXlUJiBfX21vbiwgYm9vbCBfX2ludGwgPSBmYWxzZSkKKyAgICB7IHJldHVybiB7IF9fbW9uLCBfX2ludGwgfTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX01vbmV5VD4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIF9HZXRfbW9uZXk8X01vbmV5VD4gX19mKQorICAgIHsKKyAgICAgIHR5cGVuYW1lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c2VudHJ5IF9fY2VyYihfX2lzLCBmYWxzZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgdHlwZWRlZiBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gICBfSXRlcjsKKwkgICAgICB0eXBlZGVmIG1vbmV5X2dldDxfQ2hhclQsIF9JdGVyPiAgICAgICAgICAgICAgIF9Nb25leUdldDsKKworCSAgICAgIGNvbnN0IF9Nb25leUdldCYgX19tZyA9IHVzZV9mYWNldDxfTW9uZXlHZXQ+KF9faXMuZ2V0bG9jKCkpOworCSAgICAgIF9fbWcuZ2V0KF9JdGVyKF9faXMucmRidWYoKSksIF9JdGVyKCksIF9fZi5fTV9pbnRsLAorCQkgICAgICAgX19pcywgX19lcnIsIF9fZi5fTV9tb24pOworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICBfX2lzLl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyBfX2lzLl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIF9faXMuc2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiBfX2lzOyAKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTW9uZXlUPgorICAgIHN0cnVjdCBfUHV0X21vbmV5IHsgY29uc3QgX01vbmV5VCYgX01fbW9uOyBib29sIF9NX2ludGw7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEV4dGVuZGVkIG1hbmlwdWxhdG9yIGZvciBpbnNlcnRpbmcgbW9uZXkuCisgICAqICBAcGFyYW0gIF9fbW9uICBFaXRoZXIgbG9uZyBkb3VibGUgb3IgYSBzcGVjaWFsaXphdGlvbiBvZiBAYyBiYXNpY19zdHJpbmcuCisgICAqICBAcGFyYW0gIF9faW50bCBBIGJvb2wgaW5kaWNhdGluZyB3aGV0aGVyIGludGVybmF0aW9uYWwgZm9ybWF0IAorICAgKiAgICAgICAgICAgICAgICAgaXMgdG8gYmUgdXNlZC4KKyAgICoKKyAgICogIFNlbnQgdG8gYSBzdHJlYW0gb2JqZWN0LCB0aGlzIG1hbmlwdWxhdG9yIGluc2VydHMgQGEgX19tb24uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Nb25leVQ+CisgICAgaW5saW5lIF9QdXRfbW9uZXk8X01vbmV5VD4KKyAgICBwdXRfbW9uZXkoY29uc3QgX01vbmV5VCYgX19tb24sIGJvb2wgX19pbnRsID0gZmFsc2UpCisgICAgeyByZXR1cm4geyBfX21vbiwgX19pbnRsIH07IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9Nb25leVQ+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgX1B1dF9tb25leTxfTW9uZXlUPiBfX2YpCisgICAgeworICAgICAgdHlwZW5hbWUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkgX19jZXJiKF9fb3MpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIHR5cGVkZWYgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+ICAgX0l0ZXI7CisJICAgICAgdHlwZWRlZiBtb25leV9wdXQ8X0NoYXJULCBfSXRlcj4gICAgICAgICAgICAgICBfTW9uZXlQdXQ7CisKKwkgICAgICBjb25zdCBfTW9uZXlQdXQmIF9fbXAgPSB1c2VfZmFjZXQ8X01vbmV5UHV0PihfX29zLmdldGxvYygpKTsKKwkgICAgICBpZiAoX19tcC5wdXQoX0l0ZXIoX19vcy5yZGJ1ZigpKSwgX19mLl9NX2ludGwsIF9fb3MsCisJCQkgICBfX29zLmZpbGwoKSwgX19mLl9NX21vbikuZmFpbGVkKCkpCisJCV9fZXJyIHw9IGlvc19iYXNlOjpiYWRiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIF9fb3MuX01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IF9fb3MuX01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgX19vcy5zZXRzdGF0ZShfX2Vycik7CisJfQorICAgICAgcmV0dXJuIF9fb3M7IAorICAgIH0KKworI2VuZGlmCisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuICAKKyAgLy8gTkI6ICBUaGlzIHN5bnRheCBpcyBhIEdOVSBleHRlbnNpb24uCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBfU2V0ZmlsbDxjaGFyPik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBfU2V0aW9zZmxhZ3MpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgX1Jlc2V0aW9zZmxhZ3MpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgX1NldGJhc2UpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgX1NldHByZWNpc2lvbik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBfU2V0dyk7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCBfU2V0ZmlsbDxjaGFyPik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCBfU2V0aW9zZmxhZ3MpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgX1Jlc2V0aW9zZmxhZ3MpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgX1NldGJhc2UpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgX1NldHByZWNpc2lvbik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCBfU2V0dyk7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIG9wZXJhdG9yPDwod29zdHJlYW0mLCBfU2V0ZmlsbDx3Y2hhcl90Pik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgb3BlcmF0b3I8PCh3b3N0cmVhbSYsIF9TZXRpb3NmbGFncyk7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgb3BlcmF0b3I8PCh3b3N0cmVhbSYsIF9SZXNldGlvc2ZsYWdzKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBvcGVyYXRvcjw8KHdvc3RyZWFtJiwgX1NldGJhc2UpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIG9wZXJhdG9yPDwod29zdHJlYW0mLCBfU2V0cHJlY2lzaW9uKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBvcGVyYXRvcjw8KHdvc3RyZWFtJiwgX1NldHcpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIG9wZXJhdG9yPj4od2lzdHJlYW0mLCBfU2V0ZmlsbDx3Y2hhcl90Pik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgb3BlcmF0b3I+Pih3aXN0cmVhbSYsIF9TZXRpb3NmbGFncyk7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgb3BlcmF0b3I+Pih3aXN0cmVhbSYsIF9SZXNldGlvc2ZsYWdzKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiBvcGVyYXRvcj4+KHdpc3RyZWFtJiwgX1NldGJhc2UpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIG9wZXJhdG9yPj4od2lzdHJlYW0mLCBfU2V0cHJlY2lzaW9uKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiBvcGVyYXRvcj4+KHdpc3RyZWFtJiwgX1NldHcpOworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0dMSUJDWFhfSU9NQU5JUCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9pb3MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2lvcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTU1Y2U4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9pb3MKQEAgLTAsMCArMSw0NiBAQAorLy8gSW9zdHJlYW1zIGJhc2UgY2xhc3NlcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9pb3MKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy40ICBJb3N0cmVhbXMgYmFzZSBjbGFzc2VzCisvLworCisjaWZuZGVmIF9HTElCQ1hYX0lPUworI2RlZmluZSBfR0xJQkNYWF9JT1MgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8ZXhjZXB0aW9uPiAJCS8vIEZvciBpb3NfYmFzZTo6ZmFpbHVyZQorI2luY2x1ZGUgPGJpdHMvY2hhcl90cmFpdHMuaD4gCS8vIEZvciBjaGFyX3RyYWl0cywgc3RyZWFtb2ZmLCBzdHJlYW1zaXplLCBmcG9zCisjaW5jbHVkZSA8Yml0cy9sb2NhbGVmd2QuaD4JLy8gRm9yIGNsYXNzIGxvY2FsZQorI2luY2x1ZGUgPGJpdHMvaW9zX2Jhc2UuaD4JLy8gRm9yIGlvc19iYXNlIGRlY2xhcmF0aW9ucy4KKyNpbmNsdWRlIDxzdHJlYW1idWY+IAorI2luY2x1ZGUgPGJpdHMvYmFzaWNfaW9zLmg+CisKKyNlbmRpZgkvKiBfR0xJQkNYWF9JT1MgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaW9zZndkIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9pb3Nmd2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmZTI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaW9zZndkCkBAIC0wLDAgKzEsMjEwIEBACisvLyA8aW9zZndkPiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9pb3Nmd2QKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy4yICBGb3J3YXJkIGRlY2xhcmF0aW9ucworLy8KKworI2lmbmRlZiBfR0xJQkNYWF9JT1NGV0QKKyNkZWZpbmUgX0dMSUJDWFhfSU9TRldEIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0cmluZ2Z3ZC5oPiAJLy8gRm9yIHN0cmluZyBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KKyNpbmNsdWRlIDxiaXRzL3Bvc3R5cGVzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBkZWZncm91cCBpbyBJL08KKyAgICoKKyAgICogIE5lYXJseSBhbGwgb2YgdGhlIEkvTyBjbGFzc2VzIGFyZSBwYXJhbWV0ZXJpemVkIG9uIHRoZSB0eXBlIG9mCisgICAqICBjaGFyYWN0ZXJzIHRoZXkgcmVhZCBhbmQgd3JpdGUuICAoVGhlIG1ham9yIGV4Y2VwdGlvbiBpcyBpb3NfYmFzZSBhdAorICAgKiAgdGhlIHRvcCBvZiB0aGUgaGllcmFyY2h5LikgIFRoaXMgaXMgYSBjaGFuZ2UgZnJvbSBwcmUtU3RhbmRhcmQKKyAgICogIHN0cmVhbXMsIHdoaWNoIHdlcmUgbm90IHRlbXBsYXRlcy4KKyAgICoKKyAgICogIEZvciBlYXNlIG9mIHVzZSBhbmQgY29tcGF0aWJpbGl0eSwgYWxsIG9mIHRoZSBiYXNpY18qIEkvTy1yZWxhdGVkCisgICAqICBjbGFzc2VzIGFyZSBnaXZlbiB0eXBlZGVmIG5hbWVzIGZvciBib3RoIG9mIHRoZSBidWlsdGluIGNoYXJhY3RlcgorICAgKiAgd2lkdGhzICh3aWRlIGFuZCBuYXJyb3cpLiAgVGhlIHR5cGVkZWZzIGFyZSB0aGUgc2FtZSBhcyB0aGUKKyAgICogIHByZS1TdGFuZGFyZCBuYW1lcywgZm9yIGV4YW1wbGU6CisgICAqCisgICAqICBAY29kZQorICAgKiAgICAgdHlwZWRlZiBiYXNpY19pZnN0cmVhbTxjaGFyPiAgaWZzdHJlYW07CisgICAqICBAZW5kY29kZQorICAgKgorICAgKiAgQmVjYXVzZSBwcm9wZXJseSBmb3J3YXJkLWRlY2xhcmluZyB0aGVzZSBjbGFzc2VzIGNhbiBiZSBkaWZmaWN1bHQsIHlvdQorICAgKiAgc2hvdWxkIG5vdCBkbyBpdCB5b3Vyc2VsZi4gIEluc3RlYWQsIGluY2x1ZGUgdGhlICZsdDtpb3Nmd2QmZ3Q7CisgICAqICBoZWFkZXIsIHdoaWNoIGNvbnRhaW5zIG9ubHkgZGVjbGFyYXRpb25zIG9mIGFsbCB0aGUgSS9PIGNsYXNzZXMgYXMKKyAgICogIHdlbGwgYXMgdGhlIHR5cGVkZWZzLiAgVHJ5aW5nIHRvIGZvcndhcmQtZGVjbGFyZSB0aGUgdHlwZWRlZnMKKyAgICogIHRoZW1zZWx2ZXMgKGUuZy4sIDxjb2RlPmNsYXNzIG9zdHJlYW07PC9jb2RlPikgaXMgbm90IHZhbGlkIElTTyBDKysuCisgICAqCisgICAqICBGb3IgbW9yZSBzcGVjaWZpYyBkZWNsYXJhdGlvbnMsIHNlZQorICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQxMWNoMjQuaHRtbAorICAgKgorICAgKiAgQHsKKyAgKi8KKyAgY2xhc3MgaW9zX2Jhc2U7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfaW9zOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX3N0cmVhbWJ1ZjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19pc3RyZWFtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX29zdHJlYW07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfaW9zdHJlYW07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICAgdHlwZW5hbWUgX0FsbG9jID0gYWxsb2NhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX3N0cmluZ2J1ZjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IGFsbG9jYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19pc3RyaW5nc3RyZWFtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgdHlwZW5hbWUgX0FsbG9jID0gYWxsb2NhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX29zdHJpbmdzdHJlYW07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBhbGxvY2F0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfc3RyaW5nc3RyZWFtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX2ZpbGVidWY7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfaWZzdHJlYW07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfb2ZzdHJlYW07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfZnN0cmVhbTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBpc3RyZWFtYnVmX2l0ZXJhdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIG9zdHJlYW1idWZfaXRlcmF0b3I7CisKKworICAvLy8gQmFzZSBjbGFzcyBmb3IgQGMgY2hhciBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX2lvczxjaGFyPiAJCWlvczsgCisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIEBjIGNoYXIgYnVmZmVycy4KKyAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8Y2hhcj4gCXN0cmVhbWJ1ZjsKKworICAvLy8gQmFzZSBjbGFzcyBmb3IgQGMgY2hhciBpbnB1dCBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08Y2hhcj4gCQlpc3RyZWFtOworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBAYyBjaGFyIG91dHB1dCBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX29zdHJlYW08Y2hhcj4gCQlvc3RyZWFtOworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBAYyBjaGFyIG1peGVkIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19pb3N0cmVhbTxjaGFyPiAJCWlvc3RyZWFtOworCisgIC8vLyBDbGFzcyBmb3IgQGMgY2hhciBtZW1vcnkgYnVmZmVycy4KKyAgdHlwZWRlZiBiYXNpY19zdHJpbmdidWY8Y2hhcj4gCXN0cmluZ2J1ZjsKKworICAvLy8gQ2xhc3MgZm9yIEBjIGNoYXIgaW5wdXQgbWVtb3J5IHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfaXN0cmluZ3N0cmVhbTxjaGFyPiAJaXN0cmluZ3N0cmVhbTsKKworICAvLy8gQ2xhc3MgZm9yIEBjIGNoYXIgb3V0cHV0IG1lbW9yeSBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX29zdHJpbmdzdHJlYW08Y2hhcj4gCW9zdHJpbmdzdHJlYW07CisKKyAgLy8vIENsYXNzIGZvciBAYyBjaGFyIG1peGVkIGlucHV0IGFuZCBvdXRwdXQgbWVtb3J5IHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nc3RyZWFtPGNoYXI+IAlzdHJpbmdzdHJlYW07CisKKyAgLy8vIENsYXNzIGZvciBAYyBjaGFyIGZpbGUgYnVmZmVycy4KKyAgdHlwZWRlZiBiYXNpY19maWxlYnVmPGNoYXI+IAkJZmlsZWJ1ZjsKKworICAvLy8gQ2xhc3MgZm9yIEBjIGNoYXIgaW5wdXQgZmlsZSBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX2lmc3RyZWFtPGNoYXI+IAkJaWZzdHJlYW07CisKKyAgLy8vIENsYXNzIGZvciBAYyBjaGFyIG91dHB1dCBmaWxlIHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfb2ZzdHJlYW08Y2hhcj4gCQlvZnN0cmVhbTsKKworICAvLy8gQ2xhc3MgZm9yIEBjIGNoYXIgbWl4ZWQgaW5wdXQgYW5kIG91dHB1dCBmaWxlIHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfZnN0cmVhbTxjaGFyPiAJCWZzdHJlYW07CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICAvLy8gQmFzZSBjbGFzcyBmb3IgQGMgd2NoYXJfdCBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX2lvczx3Y2hhcl90PiAJCXdpb3M7CisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIEBjIHdjaGFyX3QgYnVmZmVycy4KKyAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8d2NoYXJfdD4gCXdzdHJlYW1idWY7CisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIEBjIHdjaGFyX3QgaW5wdXQgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPHdjaGFyX3Q+IAl3aXN0cmVhbTsKKworICAvLy8gQmFzZSBjbGFzcyBmb3IgQGMgd2NoYXJfdCBvdXRwdXQgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPHdjaGFyX3Q+IAl3b3N0cmVhbTsKKworICAvLy8gQmFzZSBjbGFzcyBmb3IgQGMgd2NoYXJfdCBtaXhlZCBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfaW9zdHJlYW08d2NoYXJfdD4gCXdpb3N0cmVhbTsKKworICAvLy8gQ2xhc3MgZm9yIEBjIHdjaGFyX3QgbWVtb3J5IGJ1ZmZlcnMuCisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nYnVmPHdjaGFyX3Q+IAl3c3RyaW5nYnVmOworCisgIC8vLyBDbGFzcyBmb3IgQGMgd2NoYXJfdCBpbnB1dCBtZW1vcnkgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19pc3RyaW5nc3RyZWFtPHdjaGFyX3Q+IAl3aXN0cmluZ3N0cmVhbTsKKworICAvLy8gQ2xhc3MgZm9yIEBjIHdjaGFyX3Qgb3V0cHV0IG1lbW9yeSBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX29zdHJpbmdzdHJlYW08d2NoYXJfdD4gCXdvc3RyaW5nc3RyZWFtOworCisgIC8vLyBDbGFzcyBmb3IgQGMgd2NoYXJfdCBtaXhlZCBpbnB1dCBhbmQgb3V0cHV0IG1lbW9yeSBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX3N0cmluZ3N0cmVhbTx3Y2hhcl90PiAJd3N0cmluZ3N0cmVhbTsKKworICAvLy8gQ2xhc3MgZm9yIEBjIHdjaGFyX3QgZmlsZSBidWZmZXJzLgorICB0eXBlZGVmIGJhc2ljX2ZpbGVidWY8d2NoYXJfdD4gCXdmaWxlYnVmOworCisgIC8vLyBDbGFzcyBmb3IgQGMgd2NoYXJfdCBpbnB1dCBmaWxlIHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfaWZzdHJlYW08d2NoYXJfdD4gCXdpZnN0cmVhbTsKKworICAvLy8gQ2xhc3MgZm9yIEBjIHdjaGFyX3Qgb3V0cHV0IGZpbGUgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19vZnN0cmVhbTx3Y2hhcl90PiAJd29mc3RyZWFtOworCisgIC8vLyBDbGFzcyBmb3IgQGMgd2NoYXJfdCBtaXhlZCBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19mc3RyZWFtPHdjaGFyX3Q+IAl3ZnN0cmVhbTsKKyNlbmRpZgorICAvKiogQH0gICovCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HTElCQ1hYX0lPU0ZXRCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9pb3N0cmVhbSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaW9zdHJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzMDE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaW9zdHJlYW0KQEAgLTAsMCArMSw3OSBAQAorLy8gU3RhbmRhcmQgaW9zdHJlYW0gb2JqZWN0cyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9pb3N0cmVhbQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjMgIFN0YW5kYXJkIGlvc3RyZWFtIG9iamVjdHMKKy8vCisKKyNpZm5kZWYgX0dMSUJDWFhfSU9TVFJFQU0KKyNkZWZpbmUgX0dMSUJDWFhfSU9TVFJFQU0gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8aXN0cmVhbT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQG5hbWUgU3RhbmRhcmQgU3RyZWFtIE9iamVjdHMKKyAgICoKKyAgICogIFRoZSAmbHQ7aW9zdHJlYW0mZ3Q7IGhlYWRlciBkZWNsYXJlcyB0aGUgZWlnaHQgPGVtPnN0YW5kYXJkIHN0cmVhbQorICAgKiAgb2JqZWN0czwvZW0+LiAgRm9yIG90aGVyIGRlY2xhcmF0aW9ucywgc2VlCisgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2lvLmh0bWwKKyAgICogIGFuZCB0aGUgQGxpbmsgaW9zZndkIEkvTyBmb3J3YXJkIGRlY2xhcmF0aW9ucyBAZW5kbGluaworICAgKgorICAgKiAgVGhleSBhcmUgcmVxdWlyZWQgYnkgZGVmYXVsdCB0byBjb29wZXJhdGUgd2l0aCB0aGUgZ2xvYmFsIEMKKyAgICogIGxpYnJhcnkncyBAYyBGSUxFIHN0cmVhbXMsIGFuZCB0byBiZSBhdmFpbGFibGUgZHVyaW5nIHByb2dyYW0KKyAgICogIHN0YXJ0dXAgYW5kIHRlcm1pbmF0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBzZWN0aW9uIG9mIHRoZQorICAgKiAgbWFudWFsIGxpbmtlZCB0byBhYm92ZS4KKyAgKi8KKyAgLy9AeworICBleHRlcm4gaXN0cmVhbSBjaW47CQkvLy8gTGlua2VkIHRvIHN0YW5kYXJkIGlucHV0CisgIGV4dGVybiBvc3RyZWFtIGNvdXQ7CQkvLy8gTGlua2VkIHRvIHN0YW5kYXJkIG91dHB1dAorICBleHRlcm4gb3N0cmVhbSBjZXJyOwkJLy8vIExpbmtlZCB0byBzdGFuZGFyZCBlcnJvciAodW5idWZmZXJlZCkKKyAgZXh0ZXJuIG9zdHJlYW0gY2xvZzsJCS8vLyBMaW5rZWQgdG8gc3RhbmRhcmQgZXJyb3IgKGJ1ZmZlcmVkKQorCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgZXh0ZXJuIHdpc3RyZWFtIHdjaW47CQkvLy8gTGlua2VkIHRvIHN0YW5kYXJkIGlucHV0CisgIGV4dGVybiB3b3N0cmVhbSB3Y291dDsJLy8vIExpbmtlZCB0byBzdGFuZGFyZCBvdXRwdXQKKyAgZXh0ZXJuIHdvc3RyZWFtIHdjZXJyOwkvLy8gTGlua2VkIHRvIHN0YW5kYXJkIGVycm9yICh1bmJ1ZmZlcmVkKQorICBleHRlcm4gd29zdHJlYW0gd2Nsb2c7CS8vLyBMaW5rZWQgdG8gc3RhbmRhcmQgZXJyb3IgKGJ1ZmZlcmVkKQorI2VuZGlmCisgIC8vQH0KKworICAvLyBGb3IgY29uc3RydWN0aW9uIG9mIGZpbGVidWZmZXJzIGZvciBjb3V0LCBjaW4sIGNlcnIsIGNsb2cgZXQuIGFsLgorICBzdGF0aWMgaW9zX2Jhc2U6OkluaXQgX19pb2luaXQ7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HTElCQ1hYX0lPU1RSRUFNICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2lzdHJlYW0gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2lzdHJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxYmNhNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaXN0cmVhbQpAQCAtMCwwICsxLDg4MSBAQAorLy8gSW5wdXQgc3RyZWFtcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuNi4xICBJbnB1dCBzdHJlYW1zCisvLworCisvKiogQGZpbGUgaW5jbHVkZS9pc3RyZWFtCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0lTVFJFQU0KKyNkZWZpbmUgX0dMSUJDWFhfSVNUUkVBTSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGlvcz4KKyNpbmNsdWRlIDxvc3RyZWFtPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlbXBsYXRlIGNsYXNzIGJhc2ljX2lzdHJlYW0uCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgQHRwYXJhbSBfQ2hhclQgIFR5cGUgb2YgY2hhcmFjdGVyIHN0cmVhbS4KKyAgICogIEB0cGFyYW0gX1RyYWl0cyAgVHJhaXRzIGZvciBjaGFyYWN0ZXIgdHlwZSwgZGVmYXVsdHMgdG8KKyAgICogICAgICAgICAgICAgICAgICAgY2hhcl90cmFpdHM8X0NoYXJUPi4KKyAgICoKKyAgICogIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBpbnB1dCBzdHJlYW1zLiAgSXQgcHJvdmlkZXMgdGV4dAorICAgKiAgZm9ybWF0dGluZyBvZiBhbGwgYnVpbHRpbiB0eXBlcywgYW5kIGNvbW11bmljYXRlcyB3aXRoIGFueSBjbGFzcworICAgKiAgZGVyaXZlZCBmcm9tIGJhc2ljX3N0cmVhbWJ1ZiB0byBkbyB0aGUgYWN0dWFsIGlucHV0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgYmFzaWNfaXN0cmVhbSA6IHZpcnR1YWwgcHVibGljIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzIChpbmhlcml0ZWQgZnJvbSBiYXNpY19pb3MgKDI3LjQuNCkpOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQkgCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIAkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlIAkJb2ZmX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMJCQkgCQl0cmFpdHNfdHlwZTsKKworICAgICAgLy8gTm9uLXN0YW5kYXJkIFR5cGVzOgorICAgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiAJCV9fc3RyZWFtYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+CQlfX2lvc190eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4JCV9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiBudW1fZ2V0PF9DaGFyVCwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+ID4KKyAJCQkJCQkJX19udW1fZ2V0X3R5cGU7CisgICAgICB0eXBlZGVmIGN0eXBlPF9DaGFyVD4JICAgICAgCQkJX19jdHlwZV90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gRGF0YSBNZW1iZXJzOgorICAgICAgLyoqCisgICAgICAgKiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4dHJhY3RlZCBpbiB0aGUgcHJldmlvdXMgdW5mb3JtYXR0ZWQKKyAgICAgICAqICBmdW5jdGlvbjsgc2VlIGdjb3VudCgpLgorICAgICAgKi8KKyAgICAgIHN0cmVhbXNpemUgCQlfTV9nY291bnQ7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJhc2UgY29uc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgY3RvciBpcyBhbG1vc3QgbmV2ZXIgY2FsbGVkIGJ5IHRoZSB1c2VyIGRpcmVjdGx5LCByYXRoZXIgZnJvbQorICAgICAgICogIGRlcml2ZWQgY2xhc3NlcycgaW5pdGlhbGl6YXRpb24gbGlzdHMsIHdoaWNoIHBhc3MgYSBwb2ludGVyIHRvCisgICAgICAgKiAgdGhlaXIgb3duIHN0cmVhbSBidWZmZXIuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX2lzdHJlYW0oX19zdHJlYW1idWZfdHlwZSogX19zYikKKyAgICAgIDogX01fZ2NvdW50KHN0cmVhbXNpemUoMCkpCisgICAgICB7IHRoaXMtPmluaXQoX19zYik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCYXNlIGRlc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZG9lcyB2ZXJ5IGxpdHRsZSBhcGFydCBmcm9tIHByb3ZpZGluZyBhIHZpcnR1YWwgYmFzZSBkdG9yLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5iYXNpY19pc3RyZWFtKCkKKyAgICAgIHsgX01fZ2NvdW50ID0gc3RyZWFtc2l6ZSgwKTsgfQorCisgICAgICAvLy8gU2FmZSBwcmVmaXgvc3VmZml4IG9wZXJhdGlvbnMuCisgICAgICBjbGFzcyBzZW50cnk7CisgICAgICBmcmllbmQgY2xhc3Mgc2VudHJ5OworCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEludGVyZmFjZSBmb3IgbWFuaXB1bGF0b3JzLgorICAgICAgICoKKyAgICAgICAqICBNYW5pcHVsYXRvcnMgc3VjaCBhcyBAYyBzdGQ6OndzIGFuZCBAYyBzdGQ6OmRlYyB1c2UgdGhlc2UKKyAgICAgICAqICBmdW5jdGlvbnMgaW4gY29uc3RydWN0cyBsaWtlCisgICAgICAgKiAgPGNvZGU+c3RkOjpjaW4gPj4gc3RkOjp3czwvY29kZT4uCisgICAgICAgKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgaW9tYW5pcCBoZWFkZXIuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcj4+KF9faXN0cmVhbV90eXBlJiAoKl9fcGYpKF9faXN0cmVhbV90eXBlJikpCisgICAgICB7IHJldHVybiBfX3BmKCp0aGlzKTsgfQorCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPj4oX19pb3NfdHlwZSYgKCpfX3BmKShfX2lvc190eXBlJikpCisgICAgICB7CisJX19wZigqdGhpcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPj4oaW9zX2Jhc2UmICgqX19wZikoaW9zX2Jhc2UmKSkKKyAgICAgIHsKKwlfX3BmKCp0aGlzKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBuYW1lIEV4dHJhY3RvcnMKKyAgICAgICAqCisgICAgICAgKiAgQWxsIHRoZSBAYyBvcGVyYXRvcj4+IGZ1bmN0aW9ucyAoYWthIDxlbT5mb3JtYXR0ZWQgaW5wdXQKKyAgICAgICAqICBmdW5jdGlvbnM8L2VtPikgaGF2ZSBzb21lIGNvbW1vbiBiZWhhdmlvci4gIEVhY2ggc3RhcnRzIGJ5CisgICAgICAgKiAgY29uc3RydWN0aW5nIGEgdGVtcG9yYXJ5IG9iamVjdCBvZiB0eXBlIHN0ZDo6YmFzaWNfaXN0cmVhbTo6c2VudHJ5CisgICAgICAgKiAgd2l0aCB0aGUgc2Vjb25kIGFyZ3VtZW50IChub3NraXB3cykgc2V0IHRvIGZhbHNlLiAgVGhpcyBoYXMgc2V2ZXJhbAorICAgICAgICogIGVmZmVjdHMsIGNvbmNsdWRpbmcgd2l0aCB0aGUgc2V0dGluZyBvZiBhIHN0YXR1cyBmbGFnOyBzZWUgdGhlCisgICAgICAgKiAgc2VudHJ5IGRvY3VtZW50YXRpb24gZm9yIG1vcmUuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBzZW50cnkgc3RhdHVzIGlzIGdvb2QsIHRoZSBmdW5jdGlvbiB0cmllcyB0byBleHRyYWN0CisgICAgICAgKiAgd2hhdGV2ZXIgZGF0YSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqICBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBleHRyYWN0aW9uLCBpb3NfYmFzZTo6YmFkYml0CisgICAgICAgKiAgd2lsbCBiZSB0dXJuZWQgb24gaW4gdGhlIHN0cmVhbSdzIGVycm9yIHN0YXRlIHdpdGhvdXQgY2F1c2luZyBhbgorICAgICAgICogIGlvc19iYXNlOjpmYWlsdXJlIHRvIGJlIHRocm93bi4gIFRoZSBvcmlnaW5hbCBleGNlcHRpb24gd2lsbCB0aGVuCisgICAgICAgKiAgYmUgcmV0aHJvd24uCisgICAgICAqLworCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEludGVnZXIgYXJpdGhtZXRpYyBleHRyYWN0b3JzCisgICAgICAgKiAgQHBhcmFtICBfX24gQSB2YXJpYWJsZSBvZiBidWlsdGluIGludGVncmFsIHR5cGUuCisgICAgICAgKiAgQHJldHVybiAgQGMgKnRoaXMgaWYgc3VjY2Vzc2Z1bAorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBmdW5jdGlvbnMgdXNlIHRoZSBzdHJlYW0ncyBjdXJyZW50IGxvY2FsZSAoc3BlY2lmaWNhbGx5LCB0aGUKKyAgICAgICAqICBAYyBudW1fZ2V0IGZhY2V0KSB0byBwYXJzZSB0aGUgaW5wdXQgZGF0YS4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPj4oYm9vbCYgX19uKQorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdChfX24pOyB9CisKKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+PihzaG9ydCYgX19uKTsKKworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcj4+KHVuc2lnbmVkIHNob3J0JiBfX24pCisgICAgICB7IHJldHVybiBfTV9leHRyYWN0KF9fbik7IH0KKworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcj4+KGludCYgX19uKTsKKworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcj4+KHVuc2lnbmVkIGludCYgX19uKQorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdChfX24pOyB9CisKKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+Pihsb25nJiBfX24pCisgICAgICB7IHJldHVybiBfTV9leHRyYWN0KF9fbik7IH0KKworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcj4+KHVuc2lnbmVkIGxvbmcmIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2V4dHJhY3QoX19uKTsgfQorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0xPTkdfTE9ORworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcj4+KGxvbmcgbG9uZyYgX19uKQorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdChfX24pOyB9CisKKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nIGxvbmcmIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2V4dHJhY3QoX19uKTsgfQorI2VuZGlmCisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyBleHRyYWN0b3JzCisgICAgICAgKiAgQHBhcmFtICBfX2YgQSB2YXJpYWJsZSBvZiBidWlsdGluIGZsb2F0aW5nIHBvaW50IHR5cGUuCisgICAgICAgKiAgQHJldHVybiAgQGMgKnRoaXMgaWYgc3VjY2Vzc2Z1bAorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBmdW5jdGlvbnMgdXNlIHRoZSBzdHJlYW0ncyBjdXJyZW50IGxvY2FsZSAoc3BlY2lmaWNhbGx5LCB0aGUKKyAgICAgICAqICBAYyBudW1fZ2V0IGZhY2V0KSB0byBwYXJzZSB0aGUgaW5wdXQgZGF0YS4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPj4oZmxvYXQmIF9fZikKKyAgICAgIHsgcmV0dXJuIF9NX2V4dHJhY3QoX19mKTsgfQorCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPj4oZG91YmxlJiBfX2YpCisgICAgICB7IHJldHVybiBfTV9leHRyYWN0KF9fZik7IH0KKworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcj4+KGxvbmcgZG91YmxlJiBfX2YpCisgICAgICB7IHJldHVybiBfTV9leHRyYWN0KF9fZik7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCYXNpYyBhcml0aG1ldGljIGV4dHJhY3RvcnMKKyAgICAgICAqICBAcGFyYW0gIF9fcCBBIHZhcmlhYmxlIG9mIHBvaW50ZXIgdHlwZS4KKyAgICAgICAqICBAcmV0dXJuICBAYyAqdGhpcyBpZiBzdWNjZXNzZnVsCisgICAgICAgKgorICAgICAgICogIFRoZXNlIGZ1bmN0aW9ucyB1c2UgdGhlIHN0cmVhbSdzIGN1cnJlbnQgbG9jYWxlIChzcGVjaWZpY2FsbHksIHRoZQorICAgICAgICogIEBjIG51bV9nZXQgZmFjZXQpIHRvIHBhcnNlIHRoZSBpbnB1dCBkYXRhLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+Pih2b2lkKiYgX19wKQorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdChfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRXh0cmFjdGluZyBpbnRvIGFub3RoZXIgc3RyZWFtYnVmLgorICAgICAgICogIEBwYXJhbSAgX19zYiAgQSBwb2ludGVyIHRvIGEgc3RyZWFtYnVmCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBsaWtlIG9uZSBvZiB0aGUgYmFzaWMgYXJpdGhtZXRpYyBleHRyYWN0b3JzLAorICAgICAgICogIGluIHRoYXQgaXQgYWxzbyBjb25zdHJ1Y3RzIGEgc2VudHJ5IG9iamVjdCBhbmQgaGFzIHRoZSBzYW1lIGVycm9yCisgICAgICAgKiAgaGFuZGxpbmcgYmVoYXZpb3IuCisgICAgICAgKgorICAgICAgICogIElmIEBwIF9fc2IgaXMgTlVMTCwgdGhlIHN0cmVhbSB3aWxsIHNldCBmYWlsYml0IGluIGl0cyBlcnJvciBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2hhcmFjdGVycyBhcmUgZXh0cmFjdGVkIGZyb20gdGhpcyBzdHJlYW0gYW5kIGluc2VydGVkIGludG8gdGhlCisgICAgICAgKiAgQHAgX19zYiBzdHJlYW1idWYgdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgb2NjdXJzOgorICAgICAgICoKKyAgICAgICAqICAtIHRoZSBpbnB1dCBzdHJlYW0gcmVhY2hlcyBlbmQtb2YtZmlsZSwKKyAgICAgICAqICAtIGluc2VydGlvbiBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyIGZhaWxzIChpbiB0aGlzIGNhc2UsIHRoZQorICAgICAgICogICAgY2hhcmFjdGVyIHRoYXQgd291bGQgaGF2ZSBiZWVuIGluc2VydGVkIGlzIG5vdCBleHRyYWN0ZWQpLCBvcgorICAgICAgICogIC0gYW4gZXhjZXB0aW9uIG9jY3VycyAoYW5kIGluIHRoaXMgY2FzZSBpcyBjYXVnaHQpCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBmdW5jdGlvbiBpbnNlcnRzIG5vIGNoYXJhY3RlcnMsIGZhaWxiaXQgaXMgc2V0LgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+PihfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiKTsKKyAgICAgIC8vQH0KKworICAgICAgLy8gWzI3LjYuMS4zXSB1bmZvcm1hdHRlZCBpbnB1dAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDaGFyYWN0ZXIgY291bnRpbmcKKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXh0cmFjdGVkIGJ5IHRoZSBwcmV2aW91cworICAgICAgICogICAgICAgICAgIHVuZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uIGRpc3BhdGNoZWQgZm9yIHRoaXMgc3RyZWFtLgorICAgICAgKi8KKyAgICAgIHN0cmVhbXNpemUKKyAgICAgIGdjb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9nY291bnQ7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQG5hbWUgVW5mb3JtYXR0ZWQgSW5wdXQgRnVuY3Rpb25zCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgdW5mb3JtYXR0ZWQgaW5wdXQgZnVuY3Rpb25zIGhhdmUgc29tZSBjb21tb24gYmVoYXZpb3IuCisgICAgICAgKiAgRWFjaCBzdGFydHMgYnkgY29uc3RydWN0aW5nIGEgdGVtcG9yYXJ5IG9iamVjdCBvZiB0eXBlCisgICAgICAgKiAgc3RkOjpiYXNpY19pc3RyZWFtOjpzZW50cnkgd2l0aCB0aGUgc2Vjb25kIGFyZ3VtZW50IChub3NraXB3cykKKyAgICAgICAqICBzZXQgdG8gdHJ1ZS4gIFRoaXMgaGFzIHNldmVyYWwgZWZmZWN0cywgY29uY2x1ZGluZyB3aXRoIHRoZQorICAgICAgICogIHNldHRpbmcgb2YgYSBzdGF0dXMgZmxhZzsgc2VlIHRoZSBzZW50cnkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIHNlbnRyeSBzdGF0dXMgaXMgZ29vZCwgdGhlIGZ1bmN0aW9uIHRyaWVzIHRvIGV4dHJhY3QKKyAgICAgICAqICB3aGF0ZXZlciBkYXRhIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleHRyYWN0ZWQgaXMgc3RvcmVkIGZvciBsYXRlciByZXRyaWV2YWwKKyAgICAgICAqICBieSBnY291bnQoKS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgZXh0cmFjdGlvbiwgaW9zX2Jhc2U6OmJhZGJpdAorICAgICAgICogIHdpbGwgYmUgdHVybmVkIG9uIGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZSB3aXRob3V0IGNhdXNpbmcgYW4KKyAgICAgICAqICBpb3NfYmFzZTo6ZmFpbHVyZSB0byBiZSB0aHJvd24uICBUaGUgb3JpZ2luYWwgZXhjZXB0aW9uIHdpbGwgdGhlbgorICAgICAgICogIGJlIHJldGhyb3duLgorICAgICAgKi8KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTaW1wbGUgZXh0cmFjdGlvbi4KKyAgICAgICAqICBAcmV0dXJuICBBIGNoYXJhY3Rlciwgb3IgZW9mKCkuCisgICAgICAgKgorICAgICAgICogIFRyaWVzIHRvIGV4dHJhY3QgYSBjaGFyYWN0ZXIuICBJZiBub25lIGFyZSBhdmFpbGFibGUsIHNldHMgZmFpbGJpdAorICAgICAgICogIGFuZCByZXR1cm5zIHRyYWl0czo6ZW9mKCkuCisgICAgICAqLworICAgICAgaW50X3R5cGUKKyAgICAgIGdldCgpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNpbXBsZSBleHRyYWN0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19jICBUaGUgY2hhcmFjdGVyIGluIHdoaWNoIHRvIHN0b3JlIGRhdGEuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgVHJpZXMgdG8gZXh0cmFjdCBhIGNoYXJhY3RlciBhbmQgc3RvcmUgaXQgaW4gQGEgX19jLiAgSWYgbm9uZSBhcmUKKyAgICAgICAqICBhdmFpbGFibGUsIHNldHMgZmFpbGJpdCBhbmQgcmV0dXJucyB0cmFpdHM6OmVvZigpLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgb3ZlcmxvYWRlZCBvbiBzaWduZWQgY2hhciBhbmQKKyAgICAgICAqICAgICAgICAgdW5zaWduZWQgY2hhci4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIGdldChjaGFyX3R5cGUmIF9fYyk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2ltcGxlIG11bHRpcGxlLWNoYXJhY3RlciBleHRyYWN0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19zICBQb2ludGVyIHRvIGFuIGFycmF5LgorICAgICAgICogIEBwYXJhbSAgX19uICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHN0b3JlIGluIEBhIF9fcy4KKyAgICAgICAqICBAcGFyYW0gIF9fZGVsaW0gIEEgInN0b3AiIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBDaGFyYWN0ZXJzIGFyZSBleHRyYWN0ZWQgYW5kIHN0b3JlZCBpbnRvIEBhIF9fcyB1bnRpbCBvbmUgb2YgdGhlCisgICAgICAgKiAgZm9sbG93aW5nIGhhcHBlbnM6CisgICAgICAgKgorICAgICAgICogIC0gQGMgX19uLTEgY2hhcmFjdGVycyBhcmUgc3RvcmVkCisgICAgICAgKiAgLSB0aGUgaW5wdXQgc2VxdWVuY2UgcmVhY2hlcyBFT0YKKyAgICAgICAqICAtIHRoZSBuZXh0IGNoYXJhY3RlciBlcXVhbHMgQGEgX19kZWxpbSwgaW4gd2hpY2ggY2FzZSB0aGUgY2hhcmFjdGVyCisgICAgICAgKiAgICBpcyBub3QgZXh0cmFjdGVkCisgICAgICAgKgorICAgICAgICogSWYgbm8gY2hhcmFjdGVycyBhcmUgc3RvcmVkLCBmYWlsYml0IGlzIHNldCBpbiB0aGUgc3RyZWFtJ3MgZXJyb3IKKyAgICAgICAqIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqIEluIGFueSBjYXNlLCBhIG51bGwgY2hhcmFjdGVyIGlzIHN0b3JlZCBpbnRvIHRoZSBuZXh0IGxvY2F0aW9uIGluCisgICAgICAgKiB0aGUgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIEBub3RlICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBvdmVybG9hZGVkIG9uIHNpZ25lZCBjaGFyIGFuZAorICAgICAgICogICAgICAgICB1bnNpZ25lZCBjaGFyLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgZ2V0KGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbiwgY2hhcl90eXBlIF9fZGVsaW0pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNpbXBsZSBtdWx0aXBsZS1jaGFyYWN0ZXIgZXh0cmFjdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgUG9pbnRlciB0byBhbiBhcnJheS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBzdG9yZSBpbiBAYSBzLgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgQGMgZ2V0KF9fcyxfX24sd2lkZW4oJmFwb3M7XFxuJmFwb3M7KSkuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBnZXQoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgICAgeyByZXR1cm4gdGhpcy0+Z2V0KF9fcywgX19uLCB0aGlzLT53aWRlbignXG4nKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFeHRyYWN0aW9uIGludG8gYW5vdGhlciBzdHJlYW1idWYuCisgICAgICAgKiAgQHBhcmFtICBfX3NiICBBIHN0cmVhbWJ1ZiBpbiB3aGljaCB0byBzdG9yZSBkYXRhLgorICAgICAgICogIEBwYXJhbSAgX19kZWxpbSAgQSAic3RvcCIgY2hhcmFjdGVyLgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIENoYXJhY3RlcnMgYXJlIGV4dHJhY3RlZCBhbmQgaW5zZXJ0ZWQgaW50byBAYSBfX3NiIHVudGlsIG9uZSBvZiB0aGUKKyAgICAgICAqICBmb2xsb3dpbmcgaGFwcGVuczoKKyAgICAgICAqCisgICAgICAgKiAgLSB0aGUgaW5wdXQgc2VxdWVuY2UgcmVhY2hlcyBFT0YKKyAgICAgICAqICAtIGluc2VydGlvbiBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyIGZhaWxzIChpbiB0aGlzIGNhc2UsIHRoZQorICAgICAgICogICAgY2hhcmFjdGVyIHRoYXQgd291bGQgaGF2ZSBiZWVuIGluc2VydGVkIGlzIG5vdCBleHRyYWN0ZWQpCisgICAgICAgKiAgLSB0aGUgbmV4dCBjaGFyYWN0ZXIgZXF1YWxzIEBhIF9fZGVsaW0gKGluIHRoaXMgY2FzZSwgdGhlIGNoYXJhY3RlcgorICAgICAgICogICAgaXMgbm90IGV4dHJhY3RlZCkKKyAgICAgICAqICAtIGFuIGV4Y2VwdGlvbiBvY2N1cnMgKGFuZCBpbiB0aGlzIGNhc2UgaXMgY2F1Z2h0KQorICAgICAgICoKKyAgICAgICAqIElmIG5vIGNoYXJhY3RlcnMgYXJlIHN0b3JlZCwgZmFpbGJpdCBpcyBzZXQgaW4gdGhlIHN0cmVhbSdzIGVycm9yCisgICAgICAgKiBzdGF0ZS4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIGdldChfX3N0cmVhbWJ1Zl90eXBlJiBfX3NiLCBjaGFyX3R5cGUgX19kZWxpbSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRXh0cmFjdGlvbiBpbnRvIGFub3RoZXIgc3RyZWFtYnVmLgorICAgICAgICogIEBwYXJhbSAgX19zYiAgQSBzdHJlYW1idWYgaW4gd2hpY2ggdG8gc3RvcmUgZGF0YS4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIEBjIGdldChfX3NiLHdpZGVuKCZhcG9zO1xcbiZhcG9zOykpLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgZ2V0KF9fc3RyZWFtYnVmX3R5cGUmIF9fc2IpCisgICAgICB7IHJldHVybiB0aGlzLT5nZXQoX19zYiwgdGhpcy0+d2lkZW4oJ1xuJykpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3RyaW5nIGV4dHJhY3Rpb24uCisgICAgICAgKiAgQHBhcmFtICBfX3MgIEEgY2hhcmFjdGVyIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBkYXRhLgorICAgICAgICogIEBwYXJhbSAgX19uICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGV4dHJhY3QuCisgICAgICAgKiAgQHBhcmFtICBfX2RlbGltICBBICJzdG9wIiBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgRXh0cmFjdHMgYW5kIHN0b3JlcyBjaGFyYWN0ZXJzIGludG8gQGEgX19zIHVudGlsIG9uZSBvZiB0aGUKKyAgICAgICAqICBmb2xsb3dpbmcgaGFwcGVucy4gIE5vdGUgdGhhdCB0aGVzZSBjcml0ZXJpYSBhcmUgcmVxdWlyZWQgdG8gYmUKKyAgICAgICAqICB0ZXN0ZWQgaW4gdGhlIG9yZGVyIGxpc3RlZCBoZXJlLCB0byBhbGxvdyBhbiBpbnB1dCBsaW5lIHRvIGV4YWN0bHkKKyAgICAgICAqICBmaWxsIHRoZSBAYSBfX3MgYXJyYXkgd2l0aG91dCBzZXR0aW5nIGZhaWxiaXQuCisgICAgICAgKgorICAgICAgICogIC0jIHRoZSBpbnB1dCBzZXF1ZW5jZSByZWFjaGVzIGVuZC1vZi1maWxlLCBpbiB3aGljaCBjYXNlIGVvZmJpdAorICAgICAgICogICAgIGlzIHNldCBpbiB0aGUgc3RyZWFtIGVycm9yIHN0YXRlCisgICAgICAgKiAgLSMgdGhlIG5leHQgY2hhcmFjdGVyIGVxdWFscyBAYyBfX2RlbGltLCBpbiB3aGljaCBjYXNlIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAqICAgICBpcyBleHRyYWN0ZWQgKGFuZCB0aGVyZWZvcmUgY291bnRlZCBpbiBAYyBnY291bnQoKSkgYnV0IG5vdCBzdG9yZWQKKyAgICAgICAqICAtIyBAYyBfX24tMSBjaGFyYWN0ZXJzIGFyZSBzdG9yZWQsIGluIHdoaWNoIGNhc2UgZmFpbGJpdCBpcyBzZXQKKyAgICAgICAqICAgICBpbiB0aGUgc3RyZWFtIGVycm9yIHN0YXRlCisgICAgICAgKgorICAgICAgICogIElmIG5vIGNoYXJhY3RlcnMgYXJlIGV4dHJhY3RlZCwgZmFpbGJpdCBpcyBzZXQuICAoQW4gZW1wdHkgbGluZSBvZgorICAgICAgICogIGlucHV0IHNob3VsZCB0aGVyZWZvcmUgbm90IGNhdXNlIGZhaWxiaXQgdG8gYmUgc2V0LikKKyAgICAgICAqCisgICAgICAgKiAgSW4gYW55IGNhc2UsIGEgbnVsbCBjaGFyYWN0ZXIgaXMgc3RvcmVkIGluIHRoZSBuZXh0IGxvY2F0aW9uIGluCisgICAgICAgKiAgdGhlIGFycmF5LgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgZ2V0bGluZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24sIGNoYXJfdHlwZSBfX2RlbGltKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdHJpbmcgZXh0cmFjdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgQSBjaGFyYWN0ZXIgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGRhdGEuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gZXh0cmFjdC4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIEBjIGdldGxpbmUoX19zLF9fbix3aWRlbigmYXBvcztcXG4mYXBvczspKS4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIGdldGxpbmUoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgICAgeyByZXR1cm4gdGhpcy0+Z2V0bGluZShfX3MsIF9fbiwgdGhpcy0+d2lkZW4oJ1xuJykpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGlzY2FyZGluZyBjaGFyYWN0ZXJzCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGRpc2NhcmQuCisgICAgICAgKiAgQHBhcmFtICBfX2RlbGltICBBICJzdG9wIiBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgRXh0cmFjdHMgY2hhcmFjdGVycyBhbmQgdGhyb3dzIHRoZW0gYXdheSB1bnRpbCBvbmUgb2YgdGhlCisgICAgICAgKiAgZm9sbG93aW5nIGhhcHBlbnM6CisgICAgICAgKiAgLSBpZiBAYSBfX24gQGMgIT0gQGMgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSwgQGEgX19uCisgICAgICAgKiAgICBjaGFyYWN0ZXJzIGFyZSBleHRyYWN0ZWQKKyAgICAgICAqICAtIHRoZSBpbnB1dCBzZXF1ZW5jZSByZWFjaGVzIGVuZC1vZi1maWxlCisgICAgICAgKiAgLSB0aGUgbmV4dCBjaGFyYWN0ZXIgZXF1YWxzIEBhIF9fZGVsaW0gKGluIHRoaXMgY2FzZSwgdGhlIGNoYXJhY3RlcgorICAgICAgICogICAgaXMgZXh0cmFjdGVkKTsgbm90ZSB0aGF0IHRoaXMgY29uZGl0aW9uIHdpbGwgbmV2ZXIgb2NjdXIgaWYKKyAgICAgICAqICAgIEBhIF9fZGVsaW0gZXF1YWxzIEBjIHRyYWl0czo6ZW9mKCkuCisgICAgICAgKgorICAgICAgICogIE5COiBQcm92aWRlIHRocmVlIG92ZXJsb2FkcywgaW5zdGVhZCBvZiB0aGUgc2luZ2xlIGZ1bmN0aW9uCisgICAgICAgKiAgKHdpdGggZGVmYXVsdHMpIG1hbmRhdGVkIGJ5IHRoZSBTdGFuZGFyZDogdGhpcyBsZWFkcyB0byBhCisgICAgICAgKiAgYmV0dGVyIHBlcmZvcm1pbmcgaW1wbGVtZW50YXRpb24sIHdoaWxlIHN0aWxsIGNvbmZvcm1pbmcgdG8KKyAgICAgICAqICB0aGUgU3RhbmRhcmQuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBpZ25vcmUoc3RyZWFtc2l6ZSBfX24sIGludF90eXBlIF9fZGVsaW0pOworCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIGlnbm9yZShzdHJlYW1zaXplIF9fbik7CisKKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgaWdub3JlKCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTG9va2luZyBhaGVhZCBpbiB0aGUgc3RyZWFtCisgICAgICAgKiAgQHJldHVybiAgVGhlIG5leHQgY2hhcmFjdGVyLCBvciBlb2YoKS4KKyAgICAgICAqCisgICAgICAgKiAgSWYsIGFmdGVyIGNvbnN0cnVjdGluZyB0aGUgc2VudHJ5IG9iamVjdCwgQGMgZ29vZCgpIGlzIGZhbHNlLAorICAgICAgICogIHJldHVybnMgQGMgdHJhaXRzOjplb2YoKS4gIE90aGVyd2lzZSByZWFkcyBidXQgZG9lcyBub3QgZXh0cmFjdAorICAgICAgICogIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KKyAgICAgICovCisgICAgICBpbnRfdHlwZQorICAgICAgcGVlaygpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEV4dHJhY3Rpb24gd2l0aG91dCBkZWxpbWl0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19zICBBIGNoYXJhY3RlciBhcnJheS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBzdG9yZS4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgc3RyZWFtIHN0YXRlIGlzIEBjIGdvb2QoKSwgZXh0cmFjdHMgY2hhcmFjdGVycyBhbmQgc3RvcmVzCisgICAgICAgKiAgdGhlbSBpbnRvIEBhIF9fcyB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBoYXBwZW5zOgorICAgICAgICogIC0gQGEgX19uIGNoYXJhY3RlcnMgYXJlIHN0b3JlZAorICAgICAgICogIC0gdGhlIGlucHV0IHNlcXVlbmNlIHJlYWNoZXMgZW5kLW9mLWZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIGVycm9yCisgICAgICAgKiAgICBzdGF0ZSBpcyBzZXQgdG8gQGMgZmFpbGJpdHxlb2ZiaXQuCisgICAgICAgKgorICAgICAgICogIEBub3RlICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBvdmVybG9hZGVkIG9uIHNpZ25lZCBjaGFyIGFuZAorICAgICAgICogICAgICAgICB1bnNpZ25lZCBjaGFyLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgcmVhZChjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEV4dHJhY3Rpb24gdW50aWwgdGhlIGJ1ZmZlciBpcyBleGhhdXN0ZWQsIGJ1dCBubyBtb3JlLgorICAgICAgICogIEBwYXJhbSAgX19zICBBIGNoYXJhY3RlciBhcnJheS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBzdG9yZS4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXh0cmFjdGVkLgorICAgICAgICoKKyAgICAgICAqICBFeHRyYWN0cyBjaGFyYWN0ZXJzIGFuZCBzdG9yZXMgdGhlbSBpbnRvIEBhIF9fcyBkZXBlbmRpbmcgb24gdGhlCisgICAgICAgKiAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVtYWluaW5nIGluIHRoZSBzdHJlYW1idWYncyBidWZmZXIsCisgICAgICAgKiAgQGMgcmRidWYoKS0+aW5fYXZhaWwoKSwgY2FsbGVkIEBjIEEgaGVyZToKKyAgICAgICAqICAtIGlmIEBjIEEgQGMgPT0gQGMgLTEsIHNldHMgZW9mYml0IGFuZCBleHRyYWN0cyBubyBjaGFyYWN0ZXJzCisgICAgICAgKiAgLSBpZiBAYyBBIEBjID09IEBjIDAsIGV4dHJhY3RzIG5vIGNoYXJhY3RlcnMKKyAgICAgICAqICAtIGlmIEBjIEEgQGMgPiBAYyAwLCBleHRyYWN0cyBAYyBtaW4oQSxuKQorICAgICAgICoKKyAgICAgICAqICBUaGUgZ29hbCBpcyB0byBlbXB0eSB0aGUgY3VycmVudCBidWZmZXIsIGFuZCB0byBub3QgcmVxdWVzdCBhbnkKKyAgICAgICAqICBtb3JlIGZyb20gdGhlIGV4dGVybmFsIGlucHV0IHNlcXVlbmNlIGNvbnRyb2xsZWQgYnkgdGhlIHN0cmVhbWJ1Zi4KKyAgICAgICovCisgICAgICBzdHJlYW1zaXplCisgICAgICByZWFkc29tZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFVuZXh0cmFjdGluZyBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtICBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gcHVzaCBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBJZiBAYyByZGJ1ZigpIGlzIG5vdCBudWxsLCBjYWxscyBAYyByZGJ1ZigpLT5zcHV0YmFja2MoYykuCisgICAgICAgKgorICAgICAgICogIElmIEBjIHJkYnVmKCkgaXMgbnVsbCBvciBpZiBAYyBzcHV0YmFja2MoKSBmYWlscywgc2V0cyBiYWRiaXQgaW4KKyAgICAgICAqICB0aGUgZXJyb3Igc3RhdGUuCisgICAgICAgKgorICAgICAgICogIEBub3RlICBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNsZWFycyBlb2ZiaXQuICBTaW5jZSBubyBjaGFyYWN0ZXJzCisgICAgICAgKiAgICAgICAgIGFyZSBleHRyYWN0ZWQsIHRoZSBuZXh0IGNhbGwgdG8gQGMgZ2NvdW50KCkgd2lsbCByZXR1cm4gMCwKKyAgICAgICAqICAgICAgICAgYXMgcmVxdWlyZWQgYnkgRFIgNjAuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBwdXRiYWNrKGNoYXJfdHlwZSBfX2MpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFVuZXh0cmFjdGluZyB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIElmIEBjIHJkYnVmKCkgaXMgbm90IG51bGwsIGNhbGxzIEBjIHJkYnVmKCktPnN1bmdldGMoYykuCisgICAgICAgKgorICAgICAgICogIElmIEBjIHJkYnVmKCkgaXMgbnVsbCBvciBpZiBAYyBzdW5nZXRjKCkgZmFpbHMsIHNldHMgYmFkYml0IGluCisgICAgICAgKiAgdGhlIGVycm9yIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyBmdW5jdGlvbiBmaXJzdCBjbGVhcnMgZW9mYml0LiAgU2luY2Ugbm8gY2hhcmFjdGVycworICAgICAgICogICAgICAgICBhcmUgZXh0cmFjdGVkLCB0aGUgbmV4dCBjYWxsIHRvIEBjIGdjb3VudCgpIHdpbGwgcmV0dXJuIDAsCisgICAgICAgKiAgICAgICAgIGFzIHJlcXVpcmVkIGJ5IERSIDYwLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgdW5nZXQoKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTeW5jaHJvbml6aW5nIHRoZSBzdHJlYW0gYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICAgICAgICoKKyAgICAgICAqICBJZiBAYyByZGJ1ZigpIGlzIGEgbnVsbCBwb2ludGVyLCByZXR1cm5zIC0xLgorICAgICAgICoKKyAgICAgICAqICBPdGhlcndpc2UsIGNhbGxzIEBjIHJkYnVmKCktPnB1YnN5bmMoKSwgYW5kIGlmIHRoYXQgcmV0dXJucyAtMSwKKyAgICAgICAqICBzZXRzIGJhZGJpdCBhbmQgcmV0dXJucyAtMS4KKyAgICAgICAqCisgICAgICAgKiAgT3RoZXJ3aXNlLCByZXR1cm5zIDAuCisgICAgICAgKgorICAgICAgICogIEBub3RlICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNvdW50IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycworICAgICAgICogICAgICAgICBleHRyYWN0ZWQsIGlmIGFueSwgYW5kIHRoZXJlZm9yZSBkb2VzIG5vdCBhZmZlY3QgdGhlIG5leHQKKyAgICAgICAqICAgICAgICAgY2FsbCB0byBAYyBnY291bnQoKS4KKyAgICAgICovCisgICAgICBpbnQKKyAgICAgIHN5bmMoKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBHZXR0aW5nIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24uCisgICAgICAgKiAgQHJldHVybiAgQSBmaWxlIHBvc2l0aW9uIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgQGMgZmFpbCgpIGlzIG5vdCBmYWxzZSwgcmV0dXJucyBAYyBwb3NfdHlwZSgtMSkgdG8gaW5kaWNhdGUKKyAgICAgICAqICBmYWlsdXJlLiAgT3RoZXJ3aXNlIHJldHVybnMgQGMgcmRidWYoKS0+cHVic2Vla29mZigwLGN1cixpbikuCisgICAgICAgKgorICAgICAgICogIEBub3RlICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNvdW50IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycworICAgICAgICogICAgICAgICBleHRyYWN0ZWQsIGlmIGFueSwgYW5kIHRoZXJlZm9yZSBkb2VzIG5vdCBhZmZlY3QgdGhlIG5leHQKKyAgICAgICAqICAgICAgICAgY2FsbCB0byBAYyBnY291bnQoKS4gIEF0IHZhcmlhbmNlIHdpdGggcHV0YmFjaywgdW5nZXQgYW5kCisgICAgICAgKiAgICAgICAgIHNlZWtnLCBlb2ZiaXQgaXMgbm90IGNsZWFyZWQgZmlyc3QuCisgICAgICAqLworICAgICAgcG9zX3R5cGUKKyAgICAgIHRlbGxnKCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2hhbmdpbmcgdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBBIGZpbGUgcG9zaXRpb24gb2JqZWN0LgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIElmIEBjIGZhaWwoKSBpcyBub3QgdHJ1ZSwgY2FsbHMgQGMgcmRidWYoKS0+cHVic2Vla3BvcyhfX3BvcykuICBJZgorICAgICAgICogIHRoYXQgZnVuY3Rpb24gZmFpbHMsIHNldHMgZmFpbGJpdC4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIFRoaXMgZnVuY3Rpb24gZmlyc3QgY2xlYXJzIGVvZmJpdC4gIEl0IGRvZXMgbm90IGNvdW50IHRoZQorICAgICAgICogICAgICAgICBudW1iZXIgb2YgY2hhcmFjdGVycyBleHRyYWN0ZWQsIGlmIGFueSwgYW5kIHRoZXJlZm9yZSBkb2VzCisgICAgICAgKiAgICAgICAgIG5vdCBhZmZlY3QgdGhlIG5leHQgY2FsbCB0byBAYyBnY291bnQoKS4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIHNlZWtnKHBvc190eXBlKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDaGFuZ2luZyB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19vZmYgIEEgZmlsZSBvZmZzZXQgb2JqZWN0LgorICAgICAgICogIEBwYXJhbSAgX19kaXIgIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gc2Vlay4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBJZiBAYyBmYWlsKCkgaXMgbm90IHRydWUsIGNhbGxzIEBjIHJkYnVmKCktPnB1YnNlZWtvZmYoX19vZmYsX19kaXIpLgorICAgICAgICogIElmIHRoYXQgZnVuY3Rpb24gZmFpbHMsIHNldHMgZmFpbGJpdC4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIFRoaXMgZnVuY3Rpb24gZmlyc3QgY2xlYXJzIGVvZmJpdC4gIEl0IGRvZXMgbm90IGNvdW50IHRoZQorICAgICAgICogICAgICAgICBudW1iZXIgb2YgY2hhcmFjdGVycyBleHRyYWN0ZWQsIGlmIGFueSwgYW5kIHRoZXJlZm9yZSBkb2VzCisgICAgICAgKiAgICAgICAgIG5vdCBhZmZlY3QgdGhlIG5leHQgY2FsbCB0byBAYyBnY291bnQoKS4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIHNlZWtnKG9mZl90eXBlLCBpb3NfYmFzZTo6c2Vla2Rpcik7CisgICAgICAvL0B9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBiYXNpY19pc3RyZWFtKCkKKyAgICAgIDogX01fZ2NvdW50KHN0cmVhbXNpemUoMCkpCisgICAgICB7IHRoaXMtPmluaXQoMCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlVD4KKwlfX2lzdHJlYW1fdHlwZSYKKwlfTV9leHRyYWN0KF9WYWx1ZVQmIF9fdik7CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZGVjbGFyYXRpb25zLCBkZWZpbmVkIGluIHNyYy9pc3RyZWFtLmNjLgorICB0ZW1wbGF0ZTw+CisgICAgYmFzaWNfaXN0cmVhbTxjaGFyPiYKKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+OjoKKyAgICBnZXRsaW5lKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbiwgY2hhcl90eXBlIF9fZGVsaW0pOworCisgIHRlbXBsYXRlPD4KKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+JgorICAgIGJhc2ljX2lzdHJlYW08Y2hhcj46OgorICAgIGlnbm9yZShzdHJlYW1zaXplIF9fbik7CisKKyAgdGVtcGxhdGU8PgorICAgIGJhc2ljX2lzdHJlYW08Y2hhcj4mCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyPjo6CisgICAgaWdub3JlKHN0cmVhbXNpemUgX19uLCBpbnRfdHlwZSBfX2RlbGltKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICBiYXNpY19pc3RyZWFtPHdjaGFyX3Q+JgorICAgIGJhc2ljX2lzdHJlYW08d2NoYXJfdD46OgorICAgIGdldGxpbmUoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uLCBjaGFyX3R5cGUgX19kZWxpbSk7CisKKyAgdGVtcGxhdGU8PgorICAgIGJhc2ljX2lzdHJlYW08d2NoYXJfdD4mCisgICAgYmFzaWNfaXN0cmVhbTx3Y2hhcl90Pjo6CisgICAgaWdub3JlKHN0cmVhbXNpemUgX19uKTsKKworICB0ZW1wbGF0ZTw+CisgICAgYmFzaWNfaXN0cmVhbTx3Y2hhcl90PiYKKyAgICBiYXNpY19pc3RyZWFtPHdjaGFyX3Q+OjoKKyAgICBpZ25vcmUoc3RyZWFtc2l6ZSBfX24sIGludF90eXBlIF9fZGVsaW0pOworI2VuZGlmCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFBlcmZvcm1zIHNldHVwIHdvcmsgZm9yIGlucHV0IHN0cmVhbXMuCisgICAqCisgICAqICBPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXJlIGNyZWF0ZWQgYmVmb3JlIGFsbCBvZiB0aGUgc3RhbmRhcmQKKyAgICogIGV4dHJhY3RvcnMgYXJlIHJ1bi4gIEl0IGlzIHJlc3BvbnNpYmxlIGZvciA8ZW0+ZXhjZXB0aW9uLXNhZmUKKyAgICogIHByZWZpeCBhbmQgc3VmZml4IG9wZXJhdGlvbnMsPC9lbT4gYWx0aG91Z2ggb25seSBwcmVmaXggYWN0aW9ucworICAgKiAgYXJlIGN1cnJlbnRseSByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeQorICAgIHsKKyAgICAgIC8vIERhdGEgTWVtYmVycy4KKyAgICAgIGJvb2wgX01fb2s7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gRWFzeSBhY2Nlc3MgdG8gZGVwZW5kZW50IHR5cGVzLgorICAgICAgdHlwZWRlZiBfVHJhaXRzIAkJCQkJdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+IAkJX19zdHJlYW1idWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IAkJX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjpfX2N0eXBlX3R5cGUgCV9fY3R5cGVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUJCV9faW50X3R5cGU7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlIGNvbnN0cnVjdG9yIHBlcmZvcm1zIGFsbCB0aGUgd29yay4KKyAgICAgICAqICBAcGFyYW0gIF9faXMgIFRoZSBpbnB1dCBzdHJlYW0gdG8gZ3VhcmQuCisgICAgICAgKiAgQHBhcmFtICBfX25vc2tpcHdzICBXaGV0aGVyIHRvIGNvbnN1bWUgd2hpdGVzcGFjZSBvciBub3QuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBzdHJlYW0gc3RhdGUgaXMgZ29vZCAoQGEgX19pcy5nb29kKCkgaXMgdHJ1ZSksIHRoZW4gdGhlCisgICAgICAgKiAgZm9sbG93aW5nIGFjdGlvbnMgYXJlIHBlcmZvcm1lZCwgb3RoZXJ3aXNlIHRoZSBzZW50cnkgc3RhdGUKKyAgICAgICAqICBpcyBmYWxzZSAoPGVtPm5vdCBva2F5PC9lbT4pIGFuZCBmYWlsYml0IGlzIHNldCBpbiB0aGUKKyAgICAgICAqICBzdHJlYW0gc3RhdGUuCisgICAgICAgKgorICAgICAgICogIFRoZSBzZW50cnkncyBwcmVwYXJhdG9yeSBhY3Rpb25zIGFyZToKKyAgICAgICAqCisgICAgICAgKiAgLSMgaWYgdGhlIHN0cmVhbSBpcyB0aWVkIHRvIGFuIG91dHB1dCBzdHJlYW0sIEBjIGlzLnRpZSgpLT5mbHVzaCgpCisgICAgICAgKiAgICAgaXMgY2FsbGVkIHRvIHN5bmNocm9uaXplIHRoZSBvdXRwdXQgc2VxdWVuY2UKKyAgICAgICAqICAtIyBpZiBAYSBfX25vc2tpcHdzIGlzIGZhbHNlLCBhbmQgQGMgaW9zX2Jhc2U6OnNraXB3cyBpcyBzZXQgaW4KKyAgICAgICAqICAgICBAYyBpcy5mbGFncygpLCB0aGUgc2VudHJ5IGV4dHJhY3RzIGFuZCBkaXNjYXJkcyB3aGl0ZXNwYWNlCisgICAgICAgKiAgICAgY2hhcmFjdGVycyBmcm9tIHRoZSBzdHJlYW0uICBUaGUgY3VycmVudGx5IGltYnVlZCBsb2NhbGUgaXMKKyAgICAgICAqICAgICB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGVhY2ggY2hhcmFjdGVyIGlzIHdoaXRlc3BhY2UuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBzdHJlYW0gc3RhdGUgaXMgc3RpbGwgZ29vZCwgdGhlbiB0aGUgc2VudHJ5IHN0YXRlIGJlY29tZXMKKyAgICAgICAqICB0cnVlIChAYSBva2F5KS4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgc2VudHJ5KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgYm9vbCBfX25vc2tpcHdzID0gZmFsc2UpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFF1aWNrIHN0YXR1cyBjaGVja2luZy4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgc2VudHJ5IHN0YXRlLgorICAgICAgICoKKyAgICAgICAqICBGb3IgZWFzZSBvZiB1c2UsIHNlbnRyaWVzIG1heSBiZSBjb252ZXJ0ZWQgdG8gYm9vbGVhbnMuICBUaGUKKyAgICAgICAqICByZXR1cm4gdmFsdWUgaXMgdGhhdCBvZiB0aGUgc2VudHJ5IHN0YXRlICh0cnVlID09IG9rYXkpLgorICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBleHBsaWNpdAorI2VuZGlmCisgICAgICBvcGVyYXRvciBib29sKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX29rOyB9CisgICAgfTsKKworICAvL0B7CisgIC8qKgorICAgKiAgQGJyaWVmICBDaGFyYWN0ZXIgZXh0cmFjdG9ycworICAgKiAgQHBhcmFtICBfX2luICBBbiBpbnB1dCBzdHJlYW0uCisgICAqICBAcGFyYW0gIF9fYyAgQSBjaGFyYWN0ZXIgcmVmZXJlbmNlLgorICAgKiAgQHJldHVybiAgaW4KKyAgICoKKyAgICogIEJlaGF2ZXMgbGlrZSBvbmUgb2YgdGhlIGZvcm1hdHRlZCBhcml0aG1ldGljIGV4dHJhY3RvcnMgZGVzY3JpYmVkIGluCisgICAqICBzdGQ6OmJhc2ljX2lzdHJlYW0uICBBZnRlciBjb25zdHJ1Y3RpbmcgYSBzZW50cnkgb2JqZWN0IHdpdGggZ29vZAorICAgKiAgc3RhdHVzLCB0aGlzIGZ1bmN0aW9uIGV4dHJhY3RzIGEgY2hhcmFjdGVyIChpZiBvbmUgaXMgYXZhaWxhYmxlKSBhbmQKKyAgICogIHN0b3JlcyBpdCBpbiBAYSBfX2MuICBPdGhlcndpc2UsIHNldHMgZmFpbGJpdCBpbiB0aGUgaW5wdXQgc3RyZWFtLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luLCBfQ2hhclQmIF9fYyk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9faW4sIHVuc2lnbmVkIGNoYXImIF9fYykKKyAgICB7IHJldHVybiAoX19pbiA+PiByZWludGVycHJldF9jYXN0PGNoYXImPihfX2MpKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX2luLCBzaWduZWQgY2hhciYgX19jKQorICAgIHsgcmV0dXJuIChfX2luID4+IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciY+KF9fYykpOyB9CisgIC8vQH0KKworICAvL0B7CisgIC8qKgorICAgKiAgQGJyaWVmICBDaGFyYWN0ZXIgc3RyaW5nIGV4dHJhY3RvcnMKKyAgICogIEBwYXJhbSAgX19pbiAgQW4gaW5wdXQgc3RyZWFtLgorICAgKiAgQHBhcmFtICBfX3MgIEEgcG9pbnRlciB0byBhIGNoYXJhY3RlciBhcnJheS4KKyAgICogIEByZXR1cm4gIF9faW4KKyAgICoKKyAgICogIEJlaGF2ZXMgbGlrZSBvbmUgb2YgdGhlIGZvcm1hdHRlZCBhcml0aG1ldGljIGV4dHJhY3RvcnMgZGVzY3JpYmVkIGluCisgICAqICBzdGQ6OmJhc2ljX2lzdHJlYW0uICBBZnRlciBjb25zdHJ1Y3RpbmcgYSBzZW50cnkgb2JqZWN0IHdpdGggZ29vZAorICAgKiAgc3RhdHVzLCB0aGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHVwIHRvIEBjIG4gY2hhcmFjdGVycyBhbmQgc3RvcmVzIHRoZW0KKyAgICogIGludG8gdGhlIGFycmF5IHN0YXJ0aW5nIGF0IEBhIF9fcy4gIEBjIG4gaXMgZGVmaW5lZCBhczoKKyAgICoKKyAgICogIC0gaWYgQGMgd2lkdGgoKSBpcyBncmVhdGVyIHRoYW4gemVybywgQGMgbiBpcyB3aWR0aCgpIG90aGVyd2lzZQorICAgKiAgLSBAYyBuIGlzIDxlbT50aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHRoZSBsYXJnZXN0IGFycmF5IG9mICoKKyAgICogIC0gQGMgY2hhcl90eXBlIHRoYXQgY2FuIHN0b3JlIGEgdGVybWluYXRpbmcgQGMgZW9zLjwvZW0+CisgICAqICAtIFsyNy42LjEuMi4zXS82CisgICAqCisgICAqICBDaGFyYWN0ZXJzIGFyZSBleHRyYWN0ZWQgYW5kIHN0b3JlZCB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBoYXBwZW5zOgorICAgKiAgLSBAYyBuLTEgY2hhcmFjdGVycyBhcmUgc3RvcmVkCisgICAqICAtIEVPRiBpcyByZWFjaGVkCisgICAqICAtIHRoZSBuZXh0IGNoYXJhY3RlciBpcyB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsb2NhbGUKKyAgICogIC0gdGhlIG5leHQgY2hhcmFjdGVyIGlzIGEgbnVsbCBieXRlIChpLmUuLCBAYyBjaGFyVCgpICkKKyAgICoKKyAgICogIEBjIHdpZHRoKDApIGlzIHRoZW4gY2FsbGVkIGZvciB0aGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiAgSWYgbm8gY2hhcmFjdGVycyBhcmUgZXh0cmFjdGVkLCBzZXRzIGZhaWxiaXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sIF9DaGFyVCogX19zKTsKKworICAvLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBkZWNsYXJhdGlvbiwgZGVmaW5lZCBpbiBzcmMvaXN0cmVhbS5jYy4KKyAgdGVtcGxhdGU8PgorICAgIGJhc2ljX2lzdHJlYW08Y2hhcj4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXI+JiBfX2luLCBjaGFyKiBfX3MpOworCisgIHRlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX2luLCB1bnNpZ25lZCBjaGFyKiBfX3MpCisgICAgeyByZXR1cm4gKF9faW4gPj4gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX19zKSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19pbiwgc2lnbmVkIGNoYXIqIF9fcykKKyAgICB7IHJldHVybiAoX19pbiA+PiByZWludGVycHJldF9jYXN0PGNoYXIqPihfX3MpKTsgfQorICAvL0B9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlbXBsYXRlIGNsYXNzIGJhc2ljX2lvc3RyZWFtCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgQHRwYXJhbSBfQ2hhclQgIFR5cGUgb2YgY2hhcmFjdGVyIHN0cmVhbS4KKyAgICogIEB0cGFyYW0gX1RyYWl0cyAgVHJhaXRzIGZvciBjaGFyYWN0ZXIgdHlwZSwgZGVmYXVsdHMgdG8KKyAgICogICAgICAgICAgICAgICAgICAgY2hhcl90cmFpdHM8X0NoYXJUPi4KKyAgICoKKyAgICogIFRoaXMgY2xhc3MgbXVsdGlwbHkgaW5oZXJpdHMgZnJvbSB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW0gY2xhc3NlcworICAgKiAgc2ltcGx5IHRvIHByb3ZpZGUgYSBzaW5nbGUgaW50ZXJmYWNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgYmFzaWNfaW9zdHJlYW0KKyAgICA6IHB1YmxpYyBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4sCisgICAgICBwdWJsaWMgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDI3MS4gYmFzaWNfaW9zdHJlYW0gbWlzc2luZyB0eXBlZGVmcworICAgICAgLy8gVHlwZXMgKGluaGVyaXRlZCk6CisgICAgICB0eXBlZGVmIF9DaGFyVAkJCSAJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgCQlvZmZfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cwkJCSAJCXRyYWl0c190eXBlOworCisgICAgICAvLyBOb24tc3RhbmRhcmQgVHlwZXM6CisgICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgkJX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPgkJX19vc3RyZWFtX3R5cGU7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgZG9lcyBub3RoaW5nLgorICAgICAgICoKKyAgICAgICAqICBCb3RoIG9mIHRoZSBwYXJlbnQgY2xhc3NlcyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc2FtZQorICAgICAgICogIHN0cmVhbWJ1ZiBwb2ludGVyIHBhc3NlZCB0byB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19pb3N0cmVhbShiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zYikKKyAgICAgIDogX19pc3RyZWFtX3R5cGUoX19zYiksIF9fb3N0cmVhbV90eXBlKF9fc2IpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlc3RydWN0b3IgZG9lcyBub3RoaW5nLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5iYXNpY19pb3N0cmVhbSgpIHsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgYmFzaWNfaW9zdHJlYW0oKQorICAgICAgOiBfX2lzdHJlYW1fdHlwZSgpLCBfX29zdHJlYW1fdHlwZSgpIHsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFF1aWNrIGFuZCBlYXN5IHdheSB0byBlYXQgd2hpdGVzcGFjZQorICAgKgorICAgKiAgVGhpcyBtYW5pcHVsYXRvciBleHRyYWN0cyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMsIHN0b3BwaW5nIHdoZW4gdGhlCisgICAqICBuZXh0IGNoYXJhY3RlciBpcyBub24td2hpdGVzcGFjZSwgb3Igd2hlbiB0aGUgaW5wdXQgc2VxdWVuY2UgaXMgZW1wdHkuCisgICAqICBJZiB0aGUgc2VxdWVuY2UgaXMgZW1wdHksIEBjIGVvZmJpdCBpcyBzZXQgaW4gdGhlIHN0cmVhbSwgYnV0IG5vdAorICAgKiAgQGMgZmFpbGJpdC4KKyAgICoKKyAgICogIFRoZSBjdXJyZW50IGxvY2FsZSBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KKyAgICoKKyAgICogIEV4YW1wbGU6CisgICAqICBAY29kZQorICAgKiAgICAgTXlDbGFzcyAgIG1jOworICAgKgorICAgKiAgICAgc3RkOjpjaW4gPj4gc3RkOjp3cyA+PiBtYzsKKyAgICogIEBlbmRjb2RlCisgICAqICB3aWxsIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlIGJlZm9yZSBjYWxsaW5nIG9wZXJhdG9yPj4gb24gY2luIGFuZCB5b3VyCisgICAqICBvYmplY3QuICBOb3RlIHRoYXQgdGhlIHNhbWUgZWZmZWN0IGNhbiBiZSBhY2hpZXZlZCBieSBjcmVhdGluZyBhCisgICAqICBzdGQ6OmJhc2ljX2lzdHJlYW06OnNlbnRyeSBpbnNpZGUgeW91ciBkZWZpbml0aW9uIG9mIG9wZXJhdG9yPj4uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgd3MoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzKTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLy8gWzI3LjcuMS42XSBSdmFsdWUgc3RyZWFtIGV4dHJhY3Rpb24KKyAgLyoqCisgICAqICBAYnJpZWYgIEdlbmVyaWMgZXh0cmFjdG9yIGZvciBydmFsdWUgc3RyZWFtCisgICAqICBAcGFyYW0gIF9faXMgIEFuIGlucHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSAgX194ICBBIHJlZmVyZW5jZSB0byB0aGUgZXh0cmFjdGlvbiB0YXJnZXQuCisgICAqICBAcmV0dXJuICBpcworICAgKgorICAgKiAgVGhpcyBpcyBqdXN0IGEgZm9yd2FyZGluZyBmdW5jdGlvbiB0byBhbGxvdyBleHRyYWN0aW9uIGZyb20KKyAgICogIHJ2YWx1ZSBzdHJlYW1zIHNpbmNlIHRoZXkgd29uJ3QgYmluZCB0byB0aGUgZXh0cmFjdG9yIGZ1bmN0aW9ucworICAgKiAgdGhhdCB0YWtlIGFuIGx2YWx1ZSByZWZlcmVuY2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mJiBfX2lzLCBfVHAmIF9feCkKKyAgICB7IHJldHVybiAoX19pcyA+PiBfX3gpOyB9CisjZW5kaWYgLy8gQysrMTEKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaW5jbHVkZSA8Yml0cy9pc3RyZWFtLnRjYz4KKworI2VuZGlmCS8qIF9HTElCQ1hYX0lTVFJFQU0gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaXRlcmF0b3IgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2l0ZXJhdG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODJkYjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2l0ZXJhdG9yCkBAIC0wLDAgKzEsNzAgQEAKKy8vIDxpdGVyYXRvcj4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvaXRlcmF0b3IKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfSVRFUkFUT1IKKyNkZWZpbmUgX0dMSUJDWFhfSVRFUkFUT1IgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX2Z1bmNzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPGlzdHJlYW0+CisjaW5jbHVkZSA8Yml0cy9zdHJlYW1faXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvcmFuZ2VfYWNjZXNzLmg+CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9JVEVSQVRPUiAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9saW1pdHMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2xpbWl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTM3ZDBiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9saW1pdHMKQEAgLTAsMCArMSwxNzg2IEBACisvLyBUaGUgdGVtcGxhdGUgYW5kIGlubGluZXMgZm9yIHRoZSBudW1lcmljX2xpbWl0cyBjbGFzc2VzLiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9saW1pdHMKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vIE5vdGU6IHRoaXMgaXMgbm90IGEgY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbi4KKy8vIFdyaXR0ZW4gYnkgR2FicmllbCBEb3MgUmVpcyA8Z2RyQGNvZGVzb3VyY2VyeS5jb20+CisKKy8vCisvLyBJU08gMTQ4ODI6MTk5OAorLy8gMTguMi4xCisvLworCisjaWZuZGVmIF9HTElCQ1hYX05VTUVSSUNfTElNSVRTCisjZGVmaW5lIF9HTElCQ1hYX05VTUVSSUNfTElNSVRTIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworLy8KKy8vIFRoZSBudW1lcmljX2xpbWl0czw+IHRyYWl0cyBkb2N1bWVudCBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGFzcGVjdHMKKy8vIG9mIGZ1bmRhbWVudGFsIGFyaXRobWV0aWMgZGF0YSB0eXBlcyAoaW50ZWdlcnMgYW5kIGZsb2F0aW5nIHBvaW50cykuCisvLyBGcm9tIFN0YW5kYXJkIEMrKyBwb2ludCBvZiB2aWV3LCB0aGVyZSBhcmUgMTQgc3VjaCB0eXBlczoKKy8vICAgKiBpbnRlZ2VycworLy8gICAgICAgICBib29sCQkJCQkJCSgxKQorLy8gICAgICAgICBjaGFyLCBzaWduZWQgY2hhciwgdW5zaWduZWQgY2hhciwgd2NoYXJfdCAgICAgICAgICAgICg0KQorLy8gICAgICAgICBzaG9ydCwgdW5zaWduZWQgc2hvcnQJCQkJKDIpCisvLyAgICAgICAgIGludCwgdW5zaWduZWQJCQkJCSgyKQorLy8gICAgICAgICBsb25nLCB1bnNpZ25lZCBsb25nCQkJCQkoMikKKy8vCisvLyAgICogZmxvYXRpbmcgcG9pbnRzCisvLyAgICAgICAgIGZsb2F0CQkJCQkJKDEpCisvLyAgICAgICAgIGRvdWJsZQkJCQkJCSgxKQorLy8gICAgICAgICBsb25nIGRvdWJsZQkJCQkJCSgxKQorLy8KKy8vIEdOVSBDKysgdW5kZXJzdGFuZHMgKHdoZXJlIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBDLWxpYnJhcnkpCisvLyAgICogaW50ZWdlcgorLy8gICAgICAgICBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZwkJCSgyKQorLy8KKy8vIHdoaWNoIGJyaW5ncyB1cyB0byAxNiBmdW5kYW1lbnRhbCBhcml0aG1ldGljIGRhdGEgdHlwZXMgaW4gR05VIEMrKy4KKy8vCisvLworLy8gU2luY2UgYSBudW1lcmljX2xpbWl0czw+IGlzIGEgYml0IHRyaWNreSB0byBnZXQgcmlnaHQsIHdlIHJlbHkgb24KKy8vIGFuIGludGVyZmFjZSBjb21wb3NlZCBvZiBtYWNyb3Mgd2hpY2ggc2hvdWxkIGJlIGRlZmluZWQgaW4gY29uZmlnL29zCisvLyBvciBjb25maWcvY3B1IHdoZW4gdGhleSBkaWZmZXIgZnJvbSB0aGUgZ2VuZXJpYyAocmVhZCBhcmJpdHJhcnkpCisvLyBkZWZpbml0aW9ucyBnaXZlbiBoZXJlLgorLy8KKworLy8gVGhlc2UgdmFsdWVzIGNhbiBiZSBvdmVycmlkZGVuIGluIHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbiBmaWxlLgorLy8gVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBhcHByb3ByaWF0ZSBmb3IgbWFueSAzMi1iaXQgdGFyZ2V0cy4KKworLy8gR0NDIG9ubHkgaW50cmluc2ljYWxseSBzdXBwb3J0cyBtb2R1bG8gaW50ZWdyYWwgdHlwZXMuICBUaGUgb25seSByZW1haW5pbmcKKy8vIGludGVncmFsIGV4Y2VwdGlvbmFsIHZhbHVlcyBpcyBkaXZpc2lvbiBieSB6ZXJvLiAgT25seSB0YXJnZXRzIHRoYXQgZG8gbm90CisvLyBzaWduYWwgZGl2aXNpb24gYnkgemVybyBpbiBzb21lICJoYXJkIHRvIGlnbm9yZSIgd2F5IHNob3VsZCB1c2UgZmFsc2UuCisjaWZuZGVmIF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwcworIyBkZWZpbmUgX19nbGliY3h4X2ludGVncmFsX3RyYXBzIHRydWUKKyNlbmRpZgorCisvLyBmbG9hdAorLy8KKworLy8gRGVmYXVsdCB2YWx1ZXMuICBTaG91bGQgYmUgb3ZlcnJpZGRlbiBpbiBjb25maWd1cmF0aW9uIGZpbGVzIGlmIG5lY2Vzc2FyeS4KKworI2lmbmRlZiBfX2dsaWJjeHhfZmxvYXRfaGFzX2Rlbm9ybV9sb3NzCisjICBkZWZpbmUgX19nbGliY3h4X2Zsb2F0X2hhc19kZW5vcm1fbG9zcyBmYWxzZQorI2VuZGlmCisjaWZuZGVmIF9fZ2xpYmN4eF9mbG9hdF90cmFwcworIyAgZGVmaW5lIF9fZ2xpYmN4eF9mbG9hdF90cmFwcyBmYWxzZQorI2VuZGlmCisjaWZuZGVmIF9fZ2xpYmN4eF9mbG9hdF90aW55bmVzc19iZWZvcmUKKyMgIGRlZmluZSBfX2dsaWJjeHhfZmxvYXRfdGlueW5lc3NfYmVmb3JlIGZhbHNlCisjZW5kaWYKKworLy8gZG91YmxlCisKKy8vIERlZmF1bHQgdmFsdWVzLiAgU2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gY29uZmlndXJhdGlvbiBmaWxlcyBpZiBuZWNlc3NhcnkuCisKKyNpZm5kZWYgX19nbGliY3h4X2RvdWJsZV9oYXNfZGVub3JtX2xvc3MKKyMgIGRlZmluZSBfX2dsaWJjeHhfZG91YmxlX2hhc19kZW5vcm1fbG9zcyBmYWxzZQorI2VuZGlmCisjaWZuZGVmIF9fZ2xpYmN4eF9kb3VibGVfdHJhcHMKKyMgIGRlZmluZSBfX2dsaWJjeHhfZG91YmxlX3RyYXBzIGZhbHNlCisjZW5kaWYKKyNpZm5kZWYgX19nbGliY3h4X2RvdWJsZV90aW55bmVzc19iZWZvcmUKKyMgIGRlZmluZSBfX2dsaWJjeHhfZG91YmxlX3RpbnluZXNzX2JlZm9yZSBmYWxzZQorI2VuZGlmCisKKy8vIGxvbmcgZG91YmxlCisKKy8vIERlZmF1bHQgdmFsdWVzLiAgU2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gY29uZmlndXJhdGlvbiBmaWxlcyBpZiBuZWNlc3NhcnkuCisKKyNpZm5kZWYgX19nbGliY3h4X2xvbmdfZG91YmxlX2hhc19kZW5vcm1fbG9zcworIyAgZGVmaW5lIF9fZ2xpYmN4eF9sb25nX2RvdWJsZV9oYXNfZGVub3JtX2xvc3MgZmFsc2UKKyNlbmRpZgorI2lmbmRlZiBfX2dsaWJjeHhfbG9uZ19kb3VibGVfdHJhcHMKKyMgIGRlZmluZSBfX2dsaWJjeHhfbG9uZ19kb3VibGVfdHJhcHMgZmFsc2UKKyNlbmRpZgorI2lmbmRlZiBfX2dsaWJjeHhfbG9uZ19kb3VibGVfdGlueW5lc3NfYmVmb3JlCisjICBkZWZpbmUgX19nbGliY3h4X2xvbmdfZG91YmxlX3RpbnluZXNzX2JlZm9yZSBmYWxzZQorI2VuZGlmCisKKy8vIFlvdSBzaG91bGQgbm90IG5lZWQgdG8gZGVmaW5lIGFueSBtYWNyb3MgYmVsb3cgdGhpcyBwb2ludC4KKworI2RlZmluZSBfX2dsaWJjeHhfc2lnbmVkKFQpCSgoVCkoLTEpIDwgMCkKKworI2RlZmluZSBfX2dsaWJjeHhfbWluKFQpIFwKKyAgKF9fZ2xpYmN4eF9zaWduZWQgKFQpID8gLV9fZ2xpYmN4eF9tYXggKFQpIC0gMSA6IChUKTApCisKKyNkZWZpbmUgX19nbGliY3h4X21heChUKSBcCisgIChfX2dsaWJjeHhfc2lnbmVkIChUKSA/IFwKKyAgICgoKCgoVCkxIDw8IChfX2dsaWJjeHhfZGlnaXRzIChUKSAtIDEpKSAtIDEpIDw8IDEpICsgMSkgOiB+KFQpMCkKKworI2RlZmluZSBfX2dsaWJjeHhfZGlnaXRzKFQpIFwKKyAgKHNpemVvZihUKSAqIF9fQ0hBUl9CSVRfXyAtIF9fZ2xpYmN4eF9zaWduZWQgKFQpKQorCisvLyBUaGUgZnJhY3Rpb24gNjQzLzIxMzYgYXBwcm94aW1hdGVzIGxvZzEwKDIpIHRvIDcgc2lnbmlmaWNhbnQgZGlnaXRzLgorI2RlZmluZSBfX2dsaWJjeHhfZGlnaXRzMTAoVCkgXAorICAoX19nbGliY3h4X2RpZ2l0cyAoVCkgKiA2NDNMIC8gMjEzNikKKworI2RlZmluZSBfX2dsaWJjeHhfbWF4X2RpZ2l0czEwKFQpIFwKKyAgKDIgKyAoVCkgKiA2NDNMIC8gMjEzNikKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmIERlc2NyaWJlcyB0aGUgcm91bmRpbmcgc3R5bGUgZm9yIGZsb2F0aW5nLXBvaW50IHR5cGVzLgorICAgKgorICAgKiAgVGhpcyBpcyB1c2VkIGluIHRoZSBzdGQ6Om51bWVyaWNfbGltaXRzIGNsYXNzLgorICAqLworICBlbnVtIGZsb2F0X3JvdW5kX3N0eWxlCisgIHsKKyAgICByb3VuZF9pbmRldGVybWluYXRlICAgICAgID0gLTEsICAgIC8vLyBJbnRlcm1lZGlhdGUuCisgICAgcm91bmRfdG93YXJkX3plcm8gICAgICAgICA9IDAsICAgICAvLy8gVG8gemVyby4KKyAgICByb3VuZF90b19uZWFyZXN0ICAgICAgICAgID0gMSwgICAgIC8vLyBUbyB0aGUgbmVhcmVzdCByZXByZXNlbnRhYmxlIHZhbHVlLgorICAgIHJvdW5kX3Rvd2FyZF9pbmZpbml0eSAgICAgPSAyLCAgICAgLy8vIFRvIGluZmluaXR5LgorICAgIHJvdW5kX3Rvd2FyZF9uZWdfaW5maW5pdHkgPSAzICAgICAgLy8vIFRvIG5lZ2F0aXZlIGluZmluaXR5LgorICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIERlc2NyaWJlcyB0aGUgZGVub3JtYWxpemF0aW9uIGZvciBmbG9hdGluZy1wb2ludCB0eXBlcy4KKyAgICoKKyAgICogIFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgYSB2YXJpYWJsZSBudW1iZXIKKyAgICogIG9mIGV4cG9uZW50IGJpdHMuICBUaGlzIHR5cGUgaXMgdXNlZCBpbiB0aGUgc3RkOjpudW1lcmljX2xpbWl0cyBjbGFzcy4KKyAgKi8KKyAgZW51bSBmbG9hdF9kZW5vcm1fc3R5bGUKKyAgeworICAgIC8vLyBJbmRldGVybWluYXRlIGF0IGNvbXBpbGUgdGltZSB3aGV0aGVyIGRlbm9ybWFsaXplZCB2YWx1ZXMgYXJlIGFsbG93ZWQuCisgICAgZGVub3JtX2luZGV0ZXJtaW5hdGUgPSAtMSwKKyAgICAvLy8gVGhlIHR5cGUgZG9lcyBub3QgYWxsb3cgZGVub3JtYWxpemVkIHZhbHVlcy4KKyAgICBkZW5vcm1fYWJzZW50ICAgICAgICA9IDAsCisgICAgLy8vIFRoZSB0eXBlIGFsbG93cyBkZW5vcm1hbGl6ZWQgdmFsdWVzLgorICAgIGRlbm9ybV9wcmVzZW50ICAgICAgID0gMQorICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIFBhcnQgb2Ygc3RkOjpudW1lcmljX2xpbWl0cy4KKyAgICoKKyAgICogIFRoZSBAYyBzdGF0aWMgQGMgY29uc3QgbWVtYmVycyBhcmUgdXNhYmxlIGFzIGludGVncmFsIGNvbnN0YW50CisgICAqICBleHByZXNzaW9ucy4KKyAgICoKKyAgICogIEBub3RlIFRoaXMgaXMgYSBzZXBhcmF0ZSBjbGFzcyBmb3IgcHVycG9zZXMgb2YgZWZmaWNpZW5jeTsgeW91CisgICAqICAgICAgICBzaG91bGQgb25seSBhY2Nlc3MgdGhlc2UgbWVtYmVycyBhcyBwYXJ0IG9mIGFuIGluc3RhbnRpYXRpb24KKyAgICogICAgICAgIG9mIHRoZSBzdGQ6Om51bWVyaWNfbGltaXRzIGNsYXNzLgorICAqLworICBzdHJ1Y3QgX19udW1lcmljX2xpbWl0c19iYXNlCisgIHsKKyAgICAvKiogVGhpcyB3aWxsIGJlIHRydWUgZm9yIGFsbCBmdW5kYW1lbnRhbCB0eXBlcyAod2hpY2ggaGF2ZQorCXNwZWNpYWxpemF0aW9ucyksIGFuZCBmYWxzZSBmb3IgZXZlcnl0aGluZyBlbHNlLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gZmFsc2U7CisKKyAgICAvKiogVGhlIG51bWJlciBvZiBAYyByYWRpeCBkaWdpdHMgdGhhdCBiZSByZXByZXNlbnRlZCB3aXRob3V0IGNoYW5nZTogIGZvcgorCWludGVnZXIgdHlwZXMsIHRoZSBudW1iZXIgb2Ygbm9uLXNpZ24gYml0cyBpbiB0aGUgbWFudGlzc2E7IGZvcgorCWZsb2F0aW5nIHR5cGVzLCB0aGUgbnVtYmVyIG9mIEBjIHJhZGl4IGRpZ2l0cyBpbiB0aGUgbWFudGlzc2EuICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSAwOworCisgICAgLyoqIFRoZSBudW1iZXIgb2YgYmFzZSAxMCBkaWdpdHMgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgd2l0aG91dCBjaGFuZ2UuICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwID0gMDsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAvKiogVGhlIG51bWJlciBvZiBiYXNlIDEwIGRpZ2l0cyByZXF1aXJlZCB0byBlbnN1cmUgdGhhdCB2YWx1ZXMgd2hpY2gKKwlkaWZmZXIgYXJlIGFsd2F5cyBkaWZmZXJlbnRpYXRlZC4gICovCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorCisgICAgLyoqIFRydWUgaWYgdGhlIHR5cGUgaXMgc2lnbmVkLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IGZhbHNlOworCisgICAgLyoqIFRydWUgaWYgdGhlIHR5cGUgaXMgaW50ZWdlci4gICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gZmFsc2U7CisKKyAgICAvKiogVHJ1ZSBpZiB0aGUgdHlwZSB1c2VzIGFuIGV4YWN0IHJlcHJlc2VudGF0aW9uLiBBbGwgaW50ZWdlciB0eXBlcyBhcmUKKwlleGFjdCwgYnV0IG5vdCBhbGwgZXhhY3QgdHlwZXMgYXJlIGludGVnZXIuICBGb3IgZXhhbXBsZSwgcmF0aW9uYWwgYW5kCisJZml4ZWQtZXhwb25lbnQgcmVwcmVzZW50YXRpb25zIGFyZSBleGFjdCBidXQgbm90IGludGVnZXIuICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IGZhbHNlOworCisgICAgLyoqIEZvciBpbnRlZ2VyIHR5cGVzLCBzcGVjaWZpZXMgdGhlIGJhc2Ugb2YgdGhlIHJlcHJlc2VudGF0aW9uLiAgRm9yCisJZmxvYXRpbmcgdHlwZXMsIHNwZWNpZmllcyB0aGUgYmFzZSBvZiB0aGUgZXhwb25lbnQgcmVwcmVzZW50YXRpb24uICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDA7CisKKyAgICAvKiogVGhlIG1pbmltdW0gbmVnYXRpdmUgaW50ZWdlciBzdWNoIHRoYXQgQGMgcmFkaXggcmFpc2VkIHRvIHRoZSBwb3dlciBvZgorCShvbmUgbGVzcyB0aGFuIHRoYXQgaW50ZWdlcikgaXMgYSBub3JtYWxpemVkIGZsb2F0aW5nIHBvaW50IG51bWJlci4gICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisKKyAgICAvKiogVGhlIG1pbmltdW0gbmVnYXRpdmUgaW50ZWdlciBzdWNoIHRoYXQgMTAgcmFpc2VkIHRvIHRoYXQgcG93ZXIgaXMgaW4KKwl0aGUgcmFuZ2Ugb2Ygbm9ybWFsaXplZCBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworCisgICAgLyoqIFRoZSBtYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgc3VjaCB0aGF0IEBjIHJhZGl4IHJhaXNlZCB0byB0aGUgcG93ZXIgb2YKKwkob25lIGxlc3MgdGhhbiB0aGF0IGludGVnZXIpIGlzIGEgcmVwcmVzZW50YWJsZSBmaW5pdGUgZmxvYXRpbmcgcG9pbnQKKwludW1iZXIuICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworCisgICAgLyoqIFRoZSBtYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgc3VjaCB0aGF0IDEwIHJhaXNlZCB0byB0aGF0IHBvd2VyIGlzIGluCisJdGhlIHJhbmdlIG9mIHJlcHJlc2VudGFibGUgZmluaXRlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAvKiogVHJ1ZSBpZiB0aGUgdHlwZSBoYXMgYSByZXByZXNlbnRhdGlvbiBmb3IgcG9zaXRpdmUgaW5maW5pdHkuICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisKKyAgICAvKiogVHJ1ZSBpZiB0aGUgdHlwZSBoYXMgYSByZXByZXNlbnRhdGlvbiBmb3IgYSBxdWlldCAobm9uLXNpZ25hbGluZykKKwlOb3QgYSBOdW1iZXIuICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworCisgICAgLyoqIFRydWUgaWYgdGhlIHR5cGUgaGFzIGEgcmVwcmVzZW50YXRpb24gZm9yIGEgc2lnbmFsaW5nCisJTm90IGEgTnVtYmVyLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisKKyAgICAvKiogU2VlIHN0ZDo6ZmxvYXRfZGVub3JtX3N0eWxlIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGRlbm9ybV9hYnNlbnQ7CisKKyAgICAvKiogVHJ1ZSBpZiBsb3NzIG9mIGFjY3VyYWN5IGlzIGRldGVjdGVkIGFzIGEgZGVub3JtYWxpemF0aW9uIGxvc3MsCisJcmF0aGVyIHRoYW4gYXMgYW4gaW5leGFjdCByZXN1bHQuICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgIC8qKiBUcnVlIGlmLWFuZC1vbmx5LWlmIHRoZSB0eXBlIGFkaGVyZXMgdG8gdGhlIElFQyA1NTkgc3RhbmRhcmQsIGFsc28KKwlrbm93biBhcyBJRUVFIDc1NC4gIChPbmx5IG1ha2VzIHNlbnNlIGZvciBmbG9hdGluZyBwb2ludCB0eXBlcy4pICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisKKyAgICAvKiogVHJ1ZSBpZiB0aGUgc2V0IG9mIHZhbHVlcyByZXByZXNlbnRhYmxlIGJ5IHRoZSB0eXBlIGlzCisJZmluaXRlLiAgQWxsIGJ1aWx0LWluIHR5cGVzIGFyZSBib3VuZGVkLCB0aGlzIG1lbWJlciB3b3VsZCBiZQorCWZhbHNlIGZvciBhcmJpdHJhcnkgcHJlY2lzaW9uIHR5cGVzLiAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IGZhbHNlOworCisgICAgLyoqIFRydWUgaWYgdGhlIHR5cGUgaXMgQGUgbW9kdWxvLiBBIHR5cGUgaXMgbW9kdWxvIGlmLCBmb3IgYW55CisJb3BlcmF0aW9uIGludm9sdmluZyArLCAtLCBvciAqIG9uIHZhbHVlcyBvZiB0aGF0IHR5cGUgd2hvc2UKKwlyZXN1bHQgd291bGQgZmFsbCBvdXRzaWRlIHRoZSByYW5nZSBbbWluKCksbWF4KCldLCB0aGUgdmFsdWUKKwlyZXR1cm5lZCBkaWZmZXJzIGZyb20gdGhlIHRydWUgdmFsdWUgYnkgYW4gaW50ZWdlciBtdWx0aXBsZSBvZgorCW1heCgpIC0gbWluKCkgKyAxLiBPbiBtb3N0IG1hY2hpbmVzLCB0aGlzIGlzIGZhbHNlIGZvciBmbG9hdGluZworCXR5cGVzLCB0cnVlIGZvciB1bnNpZ25lZCBpbnRlZ2VycywgYW5kIHRydWUgZm9yIHNpZ25lZCBpbnRlZ2Vycy4KKwlTZWUgUFIyMjIwMCBhYm91dCBzaWduZWQgaW50ZWdlcnMuICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisKKyAgICAvKiogVHJ1ZSBpZiB0cmFwcGluZyBpcyBpbXBsZW1lbnRlZCBmb3IgdGhpcyB0eXBlLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gZmFsc2U7CisKKyAgICAvKiogVHJ1ZSBpZiB0aW5pbmVzcyBpcyBkZXRlY3RlZCBiZWZvcmUgcm91bmRpbmcuICAoc2VlIElFQyA1NTkpICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisKKyAgICAvKiogU2VlIHN0ZDo6ZmxvYXRfcm91bmRfc3R5bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBUaGlzIGlzIG9ubHkKKwltZWFuaW5nZnVsIGZvciBmbG9hdGluZyB0eXBlczsgaW50ZWdlciB0eXBlcyB3aWxsIGFsbCBiZQorCXJvdW5kX3Rvd2FyZF96ZXJvLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IAorCQkJCQkJICAgIHJvdW5kX3Rvd2FyZF96ZXJvOworICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIFByb3BlcnRpZXMgb2YgZnVuZGFtZW50YWwgdHlwZXMuCisgICAqCisgICAqICBUaGlzIGNsYXNzIGFsbG93cyBhIHByb2dyYW0gdG8gb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgKiAgcmVwcmVzZW50YXRpb24gb2YgYSBmdW5kYW1lbnRhbCB0eXBlIG9uIGEgZ2l2ZW4gcGxhdGZvcm0uICBGb3IKKyAgICogIG5vbi1mdW5kYW1lbnRhbCB0eXBlcywgdGhlIGZ1bmN0aW9ucyB3aWxsIHJldHVybiAwIGFuZCB0aGUgZGF0YQorICAgKiAgbWVtYmVycyB3aWxsIGFsbCBiZSBAYyBmYWxzZS4KKyAgICoKKyAgICogIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFM6ICBEUnMgMjAxIGFuZCAxODQgKGhpIEdhYnkhKSBhcmUKKyAgICogIG5vdGVkLCBidXQgbm90IGluY29ycG9yYXRlZCBpbiB0aGlzIGRvY3VtZW50ZWQgKHlldCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHMgOiBwdWJsaWMgX19udW1lcmljX2xpbWl0c19iYXNlCisgICAgeworICAgICAgLyoqIFRoZSBtaW5pbXVtIGZpbml0ZSB2YWx1ZSwgb3IgZm9yIGZsb2F0aW5nIHR5cGVzIHdpdGgKKwkgIGRlbm9ybWFsaXphdGlvbiwgdGhlIG1pbmltdW0gcG9zaXRpdmUgbm9ybWFsaXplZCB2YWx1ZS4gICovCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9UcAorICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9UcCgpOyB9CisKKyAgICAgIC8qKiBUaGUgbWF4aW11bSBmaW5pdGUgdmFsdWUuICAqLworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfVHAKKyAgICAgIG1heCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfVHAoKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqIEEgZmluaXRlIHZhbHVlIHggc3VjaCB0aGF0IHRoZXJlIGlzIG5vIG90aGVyIGZpbml0ZSB2YWx1ZSB5CisgICAgICAgKiAgd2hlcmUgeSA8IHguICAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciBfVHAKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIF9UcCgpOyB9CisjZW5kaWYKKworICAgICAgLyoqIFRoZSBAZSBtYWNoaW5lIEBlIGVwc2lsb246ICB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEgYW5kIHRoZSBsZWFzdAorCSAgdmFsdWUgZ3JlYXRlciB0aGFuIDEgdGhhdCBpcyByZXByZXNlbnRhYmxlLiAgKi8KKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX1RwCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9UcCgpOyB9CisKKyAgICAgIC8qKiBUaGUgbWF4aW11bSByb3VuZGluZyBlcnJvciBtZWFzdXJlbWVudCAoc2VlIExJQS0xKS4gICovCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9UcAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX1RwKCk7IH0KKworICAgICAgLyoqIFRoZSByZXByZXNlbnRhdGlvbiBvZiBwb3NpdGl2ZSBpbmZpbml0eSwgaWYgQGMgaGFzX2luZmluaXR5LiAgKi8KKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX1RwCisgICAgICBpbmZpbml0eSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfVHAoKTsgfQorCisgICAgICAvKiogVGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgcXVpZXQgTm90IGEgTnVtYmVyLAorCSAgaWYgQGMgaGFzX3F1aWV0X05hTi4gKi8KKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX1RwCisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX1RwKCk7IH0KKworICAgICAgLyoqIFRoZSByZXByZXNlbnRhdGlvbiBvZiBhIHNpZ25hbGluZyBOb3QgYSBOdW1iZXIsIGlmCisJICBAYyBoYXNfc2lnbmFsaW5nX05hTi4gKi8KKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX1RwCisgICAgICBzaWduYWxpbmdfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9UcCgpOyB9CisKKyAgICAgIC8qKiBUaGUgbWluaW11bSBwb3NpdGl2ZSBkZW5vcm1hbGl6ZWQgdmFsdWUuICBGb3IgdHlwZXMgd2hlcmUKKwkgIEBjIGhhc19kZW5vcm0gaXMgZmFsc2UsIHRoaXMgaXMgdGhlIG1pbmltdW0gcG9zaXRpdmUgbm9ybWFsaXplZAorCSAgdmFsdWUuICAqLworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfVHAKKyAgICAgIGRlbm9ybV9taW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX1RwKCk7IH0KKyAgICB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPGNvbnN0IF9UcD4KKyAgICA6IHB1YmxpYyBudW1lcmljX2xpbWl0czxfVHA+IHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPHZvbGF0aWxlIF9UcD4KKyAgICA6IHB1YmxpYyBudW1lcmljX2xpbWl0czxfVHA+IHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPGNvbnN0IHZvbGF0aWxlIF9UcD4KKyAgICA6IHB1YmxpYyBudW1lcmljX2xpbWl0czxfVHA+IHsgfTsKKyNlbmRpZgorCisgIC8vIE5vdyB0aGVyZSBmb2xsb3cgMTYgZXhwbGljaXQgc3BlY2lhbGl6YXRpb25zLiAgWWVzLCAxNi4gIE1ha2Ugc3VyZQorICAvLyB5b3UgZ2V0IHRoZSBjb3VudCByaWdodC4gKDE4IGluIGMrKzB4IG1vZGUpCisKKyAgLy8vIG51bWVyaWNfbGltaXRzPGJvb2w+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPGJvb2w+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbCAKKyAgICAgIG1pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wgCisgICAgICBtYXgoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gdHJ1ZTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sCisgICAgICBsb3dlc3QoKSBub2V4Y2VwdCB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzID0gMTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCA9IDA7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbCAKKyAgICAgIGVwc2lsb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sIAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wgCisgICAgICBpbmZpbml0eSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wgCisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sIAorICAgICAgc2lnbmFsaW5nX05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wgCisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSBmYWxzZTsKKworICAgICAgLy8gSXQgaXMgbm90IGNsZWFyIHdoYXQgaXQgbWVhbnMgZm9yIGEgYm9vbGVhbiB0eXBlIHRvIHRyYXAuCisgICAgICAvLyBUaGlzIGlzIGEgRFIgb24gdGhlIExXRyBpc3N1ZSBsaXN0LiAgSGVyZSwgSSB1c2UgaW50ZWdlcgorICAgICAgLy8gcHJvbW90aW9uIHNlbWFudGljcy4KKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czxjaGFyPiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxjaGFyPgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIgCisgICAgICBtaW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19nbGliY3h4X21pbihjaGFyKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIgCisgICAgICBtYXgoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19nbGliY3h4X21heChjaGFyKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzID0gX19nbGliY3h4X2RpZ2l0cyAoY2hhcik7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKGNoYXIpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gX19nbGliY3h4X3NpZ25lZCAoY2hhcik7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIgCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBjaGFyIAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtIAorICAgICAgID0gZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgCisgICAgICBjaGFyIGluZmluaXR5KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIGNoYXIoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIgCisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gY2hhcigpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgY2hhciAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gY2hhcigpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgY2hhciAKKyAgICAgIGRlbm9ybV9taW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9ICFpc19zaWduZWQ7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czxzaWduZWQgY2hhcj4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8c2lnbmVkIGNoYXI+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2lnbmVkIGNoYXIgCisgICAgICBtaW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gLV9fU0NIQVJfTUFYX18gLSAxOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2lnbmVkIGNoYXIgCisgICAgICBtYXgoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19TQ0hBUl9NQVhfXzsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaWduZWQgY2hhciAKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIG1pbigpOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyA9IF9fZ2xpYmN4eF9kaWdpdHMgKHNpZ25lZCBjaGFyKTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAoc2lnbmVkIGNoYXIpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2lnbmVkIGNoYXIgCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaWduZWQgY2hhciAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpZ25lZCBjaGFyIAorICAgICAgaW5maW5pdHkoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2lnbmVkIGNoYXIgCisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2lnbmVkIGNoYXIgCisgICAgICBzaWduYWxpbmdfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxzaWduZWQgY2hhcj4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaWduZWQgY2hhciAKKyAgICAgIGRlbm9ybV9taW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBjaGFyPiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBjaGFyPgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGNoYXIgCisgICAgICBtaW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGNoYXIgCisgICAgICBtYXgoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19TQ0hBUl9NQVhfXyAqIDJVICsgMTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBjaGFyIAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0cyAodW5zaWduZWQgY2hhcik7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKHVuc2lnbmVkIGNoYXIpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGNoYXIgCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBjaGFyIAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtIAorICAgICAgID0gZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgY2hhciAKKyAgICAgIGluZmluaXR5KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGNoYXIgCisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgY2hhciAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgY2hhciAKKyAgICAgIGRlbm9ybV9taW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8d2NoYXJfdD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8d2NoYXJfdD4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB3Y2hhcl90IAorICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fZ2xpYmN4eF9taW4gKHdjaGFyX3QpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgd2NoYXJfdCAKKyAgICAgIG1heCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX2dsaWJjeHhfbWF4ICh3Y2hhcl90KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciB3Y2hhcl90CisgICAgICBsb3dlc3QoKSBub2V4Y2VwdCB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSBfX2dsaWJjeHhfZGlnaXRzICh3Y2hhcl90KTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAod2NoYXJfdCk7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSBfX2dsaWJjeHhfc2lnbmVkICh3Y2hhcl90KTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgd2NoYXJfdCAKKyAgICAgIGVwc2lsb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHdjaGFyX3QgCisgICAgICByb3VuZF9lcnJvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB3Y2hhcl90IAorICAgICAgaW5maW5pdHkoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gd2NoYXJfdCgpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgd2NoYXJfdCAKKyAgICAgIHF1aWV0X05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiB3Y2hhcl90KCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB3Y2hhcl90IAorICAgICAgc2lnbmFsaW5nX05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiB3Y2hhcl90KCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB3Y2hhcl90IAorICAgICAgZGVub3JtX21pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiB3Y2hhcl90KCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9ICFpc19zaWduZWQ7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvLy8gbnVtZXJpY19saW1pdHM8Y2hhcjE2X3Q+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPGNoYXIxNl90PgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcjE2X3QgCisgICAgICBtaW4oKSBub2V4Y2VwdCB7IHJldHVybiBfX2dsaWJjeHhfbWluIChjaGFyMTZfdCk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyMTZfdCAKKyAgICAgIG1heCgpIG5vZXhjZXB0IHsgcmV0dXJuIF9fZ2xpYmN4eF9tYXggKGNoYXIxNl90KTsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIxNl90IAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgZGlnaXRzID0gX19nbGliY3h4X2RpZ2l0cyAoY2hhcjE2X3QpOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgZGlnaXRzMTAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKGNoYXIxNl90KTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfc2lnbmVkID0gX19nbGliY3h4X3NpZ25lZCAoY2hhcjE2X3QpOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IHJhZGl4ID0gMjsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyMTZfdCAKKyAgICAgIGVwc2lsb24oKSBub2V4Y2VwdCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcjE2X3QgCisgICAgICByb3VuZF9lcnJvcigpIG5vZXhjZXB0IHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIxNl90IAorICAgICAgaW5maW5pdHkoKSBub2V4Y2VwdCB7IHJldHVybiBjaGFyMTZfdCgpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcjE2X3QgCisgICAgICBxdWlldF9OYU4oKSBub2V4Y2VwdCB7IHJldHVybiBjaGFyMTZfdCgpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcjE2X3QgCisgICAgICBzaWduYWxpbmdfTmFOKCkgbm9leGNlcHQgeyByZXR1cm4gY2hhcjE2X3QoKTsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIxNl90IAorICAgICAgZGVub3JtX21pbigpIG5vZXhjZXB0IHsgcmV0dXJuIGNoYXIxNl90KCk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX21vZHVsbyA9ICFpc19zaWduZWQ7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czxjaGFyMzJfdD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8Y2hhcjMyX3Q+CisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyMzJfdCAKKyAgICAgIG1pbigpIG5vZXhjZXB0IHsgcmV0dXJuIF9fZ2xpYmN4eF9taW4gKGNoYXIzMl90KTsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIzMl90IAorICAgICAgbWF4KCkgbm9leGNlcHQgeyByZXR1cm4gX19nbGliY3h4X21heCAoY2hhcjMyX3QpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcjMyX3QgCisgICAgICBsb3dlc3QoKSBub2V4Y2VwdCB7IHJldHVybiBtaW4oKTsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBkaWdpdHMgPSBfX2dsaWJjeHhfZGlnaXRzIChjaGFyMzJfdCk7CisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBkaWdpdHMxMCA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAoY2hhcjMyX3QpOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19zaWduZWQgPSBfX2dsaWJjeHhfc2lnbmVkIChjaGFyMzJfdCk7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfZXhhY3QgPSB0cnVlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIzMl90IAorICAgICAgZXBzaWxvbigpIG5vZXhjZXB0IHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyMzJfdCAKKyAgICAgIHJvdW5kX2Vycm9yKCkgbm9leGNlcHQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcjMyX3QgCisgICAgICBpbmZpbml0eSgpIG5vZXhjZXB0IHsgcmV0dXJuIGNoYXIzMl90KCk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyMzJfdCAKKyAgICAgIHF1aWV0X05hTigpIG5vZXhjZXB0IHsgcmV0dXJuIGNoYXIzMl90KCk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyMzJfdCAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBub2V4Y2VwdCB7IHJldHVybiBjaGFyMzJfdCgpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcjMyX3QgCisgICAgICBkZW5vcm1fbWluKCkgbm9leGNlcHQgeyByZXR1cm4gY2hhcjMyX3QoKTsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfbW9kdWxvID0gIWlzX3NpZ25lZDsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICAgIH07CisjZW5kaWYKKworICAvLy8gbnVtZXJpY19saW1pdHM8c2hvcnQ+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPHNob3J0PgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNob3J0IAorICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIC1fX1NIUlRfTUFYX18gLSAxOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2hvcnQgCisgICAgICBtYXgoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19TSFJUX01BWF9fOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIHNob3J0IAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzID0gX19nbGliY3h4X2RpZ2l0cyAoc2hvcnQpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwID0gX19nbGliY3h4X2RpZ2l0czEwIChzaG9ydCk7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gMjsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaG9ydCAKKyAgICAgIGVwc2lsb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNob3J0IAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtIAorICAgICAgID0gZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2hvcnQgCisgICAgICBpbmZpbml0eSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBzaG9ydCgpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2hvcnQgCisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc2hvcnQoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNob3J0IAorICAgICAgc2lnbmFsaW5nX05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBzaG9ydCgpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2hvcnQgCisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHNob3J0KCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8dW5zaWduZWQgc2hvcnQ+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIHNob3J0PgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIHNob3J0IAorICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBzaG9ydCAKKyAgICAgIG1heCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX1NIUlRfTUFYX18gKiAyVSArIDE7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgc2hvcnQgCisgICAgICBsb3dlc3QoKSBub2V4Y2VwdCB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzICh1bnNpZ25lZCBzaG9ydCk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKHVuc2lnbmVkIHNob3J0KTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gMjsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBzaG9ydCAKKyAgICAgIGVwc2lsb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIHNob3J0IAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtIAorICAgICAgID0gZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgc2hvcnQgCisgICAgICBpbmZpbml0eSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgc2hvcnQgCisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIHNob3J0IAorICAgICAgc2lnbmFsaW5nX05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgc2hvcnQgCisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czxpbnQ+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPGludD4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnQgCisgICAgICBtaW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gLV9fSU5UX01BWF9fIC0gMTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludCAKKyAgICAgIG1heCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0lOVF9NQVhfXzsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgCisgICAgICBsb3dlc3QoKSBub2V4Y2VwdCB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSBfX2dsaWJjeHhfZGlnaXRzIChpbnQpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwID0gX19nbGliY3h4X2RpZ2l0czEwIChpbnQpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50IAorICAgICAgZXBzaWxvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50IAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtIAorICAgICAgID0gZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50IAorICAgICAgaW5maW5pdHkoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludCAKKyAgICAgIHF1aWV0X05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50IAorICAgICAgc2lnbmFsaW5nX05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50IAorICAgICAgZGVub3JtX21pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSAKKyAgICAgICA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICAgIH07CisKKyAgLy8vIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGludD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50PgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGludCAKKyAgICAgIG1pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgaW50IAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fSU5UX01BWF9fICogMlUgKyAxOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCAKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIG1pbigpOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMgKHVuc2lnbmVkIGludCk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKHVuc2lnbmVkIGludCk7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgaW50IAorICAgICAgZXBzaWxvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgaW50IAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtIAorICAgICAgID0gZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgaW50IAorICAgICAgaW5maW5pdHkoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGludCAKKyAgICAgIHF1aWV0X05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGludCAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBpbnQgCisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8bG9uZz4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8bG9uZz4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nCisgICAgICBtaW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gLV9fTE9OR19NQVhfXyAtIDE7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fTE9OR19NQVhfXzsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBsb25nIAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzID0gX19nbGliY3h4X2RpZ2l0cyAobG9uZyk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKGxvbmcpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyAKKyAgICAgIGVwc2lsb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgCisgICAgICByb3VuZF9lcnJvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIAorICAgICAgaW5maW5pdHkoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIAorICAgICAgZGVub3JtX21pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBzdGF0aWNfY2FzdDxsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBsb25nPiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBsb25nPgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgCisgICAgICBtaW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgCisgICAgICBtYXgoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19MT05HX01BWF9fICogMlVMICsgMTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBsb25nIAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0cyAodW5zaWduZWQgbG9uZyk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKHVuc2lnbmVkIGxvbmcpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtIAorICAgICAgID0gZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgbG9uZyAKKyAgICAgIGluZmluaXR5KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgCisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgbG9uZyAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgbG9uZyAKKyAgICAgIGRlbm9ybV9taW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8bG9uZyBsb25nPiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxsb25nIGxvbmc+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBsb25nIAorICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIC1fX0xPTkdfTE9OR19NQVhfXyAtIDE7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGxvbmcgCisgICAgICBtYXgoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19MT05HX0xPTkdfTUFYX187IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgbG9uZyBsb25nIAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0cyAobG9uZyBsb25nKTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAobG9uZyBsb25nKTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgbG9uZyAKKyAgICAgIGVwc2lsb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgbG9uZyAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgbG9uZyAKKyAgICAgIGluZmluaXR5KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGxvbmcgCisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZyBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgbG9uZyAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGxvbmcgCisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8dW5zaWduZWQgbG9uZyBsb25nPiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBsb25nIGxvbmc+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgbG9uZyBsb25nIAorICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIGxvbmcgCisgICAgICBtYXgoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19MT05HX0xPTkdfTUFYX18gKiAyVUxMICsgMTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBsb25nIGxvbmcgCisgICAgICBsb3dlc3QoKSBub2V4Y2VwdCB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzICh1bnNpZ25lZCBsb25nIGxvbmcpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0czEwICh1bnNpZ25lZCBsb25nIGxvbmcpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgbG9uZyAKKyAgICAgIGVwc2lsb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgbG9uZyAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgbG9uZyAKKyAgICAgIGluZmluaXR5KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgbG9uZyBsb25nIAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgbG9uZyBsb25nIAorICAgICAgc2lnbmFsaW5nX05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgbG9uZyAKKyAgICAgIGRlbm9ybV9taW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisjaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9JTlQxMjgpCisgIC8vLyBudW1lcmljX2xpbWl0czxfX2ludDEyOD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8X19pbnQxMjg+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX19pbnQxMjgKKyAgICAgIG1pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX2dsaWJjeHhfbWluIChfX2ludDEyOCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfX2ludDEyOAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fZ2xpYmN4eF9tYXggKF9faW50MTI4KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfX2ludDEyOAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzIChfX2ludDEyOCk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAoX19pbnQxMjgpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX19pbnQxMjgKKyAgICAgIGVwc2lsb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9faW50MTI4CisgICAgICByb3VuZF9lcnJvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0KKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9faW50MTI4CisgICAgICBpbmZpbml0eSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X19pbnQxMjg+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX19pbnQxMjgKKyAgICAgIHF1aWV0X05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X19pbnQxMjg+KDApOyB9CisgICAgICAKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX19pbnQxMjgKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9faW50MTI4PigwKTsgfQorICAgICAgCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9faW50MTI4CisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfX2ludDEyOD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzCisgICAgICAgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUKKyAgICAgICA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICAgIH07CisKKyAgLy8vIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIF9faW50MTI4PiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBfX2ludDEyOD4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBfX2ludDEyOAorICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBfX2ludDEyOAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fZ2xpYmN4eF9tYXggKHVuc2lnbmVkIF9faW50MTI4KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBfX2ludDEyOAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzICh1bnNpZ25lZCBfX2ludDEyOCk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAodW5zaWduZWQgX19pbnQxMjgpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIF9faW50MTI4CisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBfX2ludDEyOAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBfX2ludDEyOAorICAgICAgaW5maW5pdHkoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIF9faW50MTI4PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIF9faW50MTI4CisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIF9faW50MTI4PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIF9faW50MTI4CisgICAgICBzaWduYWxpbmdfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBfX2ludDEyOD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBfX2ludDEyOAorICAgICAgZGVub3JtX21pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgX19pbnQxMjg+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworI2VuZGlmCisKKyAgLy8vIG51bWVyaWNfbGltaXRzPGZsb2F0PiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxmbG9hdD4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdCAKKyAgICAgIG1pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0ZMVF9NSU5fXzsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0IAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fRkxUX01BWF9fOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gLV9fRkxUX01BWF9fOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyA9IF9fRkxUX01BTlRfRElHX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgPSBfX0ZMVF9ESUdfXzsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAKKwkgPSBfX2dsaWJjeHhfbWF4X2RpZ2l0czEwIChfX0ZMVF9NQU5UX0RJR19fKTsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSBfX0ZMVF9SQURJWF9fOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0IAorICAgICAgZXBzaWxvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0ZMVF9FUFNJTE9OX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdCAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDAuNUY7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IF9fRkxUX01JTl9FWFBfXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IF9fRkxUX01JTl8xMF9FWFBfXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSBfX0ZMVF9NQVhfRVhQX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSBfX0ZMVF9NQVhfMTBfRVhQX187CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gX19GTFRfSEFTX0lORklOSVRZX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBfX0ZMVF9IQVNfUVVJRVRfTkFOX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gaGFzX3F1aWV0X05hTjsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtCisJPSBib29sKF9fRkxUX0hBU19ERU5PUk1fXykgPyBkZW5vcm1fcHJlc2VudCA6IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyAKKyAgICAgICA9IF9fZ2xpYmN4eF9mbG9hdF9oYXNfZGVub3JtX2xvc3M7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQgCisgICAgICBpbmZpbml0eSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX2J1aWx0aW5faHVnZV92YWxmKCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdCAKKyAgICAgIHF1aWV0X05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX2J1aWx0aW5fbmFuZigiIik7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdCAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19idWlsdGluX25hbnNmKCIiKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0IAorICAgICAgZGVub3JtX21pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0ZMVF9ERU5PUk1fTUlOX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkKKwk9IGhhc19pbmZpbml0eSAmJiBoYXNfcXVpZXRfTmFOICYmIGhhc19kZW5vcm0gPT0gZGVub3JtX3ByZXNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9mbG9hdF90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlIAorICAgICAgID0gX19nbGliY3h4X2Zsb2F0X3RpbnluZXNzX2JlZm9yZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG9fbmVhcmVzdDsKKyAgICB9OworCisjdW5kZWYgX19nbGliY3h4X2Zsb2F0X2hhc19kZW5vcm1fbG9zcworI3VuZGVmIF9fZ2xpYmN4eF9mbG9hdF90cmFwcworI3VuZGVmIF9fZ2xpYmN4eF9mbG9hdF90aW55bmVzc19iZWZvcmUKKworICAvLy8gbnVtZXJpY19saW1pdHM8ZG91YmxlPiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxkb3VibGU+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZG91YmxlIAorICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fREJMX01JTl9fOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZG91YmxlIAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fREJMX01BWF9fOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSAKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIC1fX0RCTF9NQVhfXzsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSBfX0RCTF9NQU5UX0RJR19fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwID0gX19EQkxfRElHX187CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwCisJID0gX19nbGliY3h4X21heF9kaWdpdHMxMCAoX19EQkxfTUFOVF9ESUdfXyk7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gX19GTFRfUkFESVhfXzsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBkb3VibGUgCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fREJMX0VQU0lMT05fXzsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGRvdWJsZSAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDAuNTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gX19EQkxfTUlOX0VYUF9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gX19EQkxfTUlOXzEwX0VYUF9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IF9fREJMX01BWF9FWFBfXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IF9fREJMX01BWF8xMF9FWFBfXzsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBfX0RCTF9IQVNfSU5GSU5JVFlfXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IF9fREJMX0hBU19RVUlFVF9OQU5fXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBoYXNfcXVpZXRfTmFOOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0KKwk9IGJvb2woX19EQkxfSEFTX0RFTk9STV9fKSA/IGRlbm9ybV9wcmVzZW50IDogZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzIAorICAgICAgICA9IF9fZ2xpYmN4eF9kb3VibGVfaGFzX2Rlbm9ybV9sb3NzOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGRvdWJsZSAKKyAgICAgIGluZmluaXR5KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fYnVpbHRpbl9odWdlX3ZhbCgpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZG91YmxlIAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fYnVpbHRpbl9uYW4oIiIpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZG91YmxlIAorICAgICAgc2lnbmFsaW5nX05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX2J1aWx0aW5fbmFucygiIik7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBkb3VibGUgCisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fREJMX0RFTk9STV9NSU5fXzsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OQorCT0gaGFzX2luZmluaXR5ICYmIGhhc19xdWlldF9OYU4gJiYgaGFzX2Rlbm9ybSA9PSBkZW5vcm1fcHJlc2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2RvdWJsZV90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlIAorICAgICAgID0gX19nbGliY3h4X2RvdWJsZV90aW55bmVzc19iZWZvcmU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSAKKyAgICAgICA9IHJvdW5kX3RvX25lYXJlc3Q7CisgICAgfTsKKworI3VuZGVmIF9fZ2xpYmN4eF9kb3VibGVfaGFzX2Rlbm9ybV9sb3NzCisjdW5kZWYgX19nbGliY3h4X2RvdWJsZV90cmFwcworI3VuZGVmIF9fZ2xpYmN4eF9kb3VibGVfdGlueW5lc3NfYmVmb3JlCisKKyAgLy8vIG51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxsb25nIGRvdWJsZT4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZSAKKyAgICAgIG1pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0xEQkxfTUlOX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZSAKKyAgICAgIG1heCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0xEQkxfTUFYX187IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgbG9uZyBkb3VibGUgCisgICAgICBsb3dlc3QoKSBub2V4Y2VwdCB7IHJldHVybiAtX19MREJMX01BWF9fOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyA9IF9fTERCTF9NQU5UX0RJR19fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwID0gX19MREJMX0RJR19fOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZGlnaXRzMTAKKwkgPSBfX2dsaWJjeHhfbWF4X2RpZ2l0czEwIChfX0xEQkxfTUFOVF9ESUdfXyk7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gX19GTFRfUkFESVhfXzsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZSAKKyAgICAgIGVwc2lsb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19MREJMX0VQU0lMT05fXzsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlIAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMC41TDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gX19MREJMX01JTl9FWFBfXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IF9fTERCTF9NSU5fMTBfRVhQX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gX19MREJMX01BWF9FWFBfXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IF9fTERCTF9NQVhfMTBfRVhQX187CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gX19MREJMX0hBU19JTkZJTklUWV9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gX19MREJMX0hBU19RVUlFVF9OQU5fXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBoYXNfcXVpZXRfTmFOOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0KKwk9IGJvb2woX19MREJMX0hBU19ERU5PUk1fXykgPyBkZW5vcm1fcHJlc2VudCA6IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcworCT0gX19nbGliY3h4X2xvbmdfZG91YmxlX2hhc19kZW5vcm1fbG9zczsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZSAKKyAgICAgIGluZmluaXR5KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fYnVpbHRpbl9odWdlX3ZhbGwoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlIAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fYnVpbHRpbl9uYW5sKCIiKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlIAorICAgICAgc2lnbmFsaW5nX05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX2J1aWx0aW5fbmFuc2woIiIpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUgCisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fTERCTF9ERU5PUk1fTUlOX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkKKwk9IGhhc19pbmZpbml0eSAmJiBoYXNfcXVpZXRfTmFOICYmIGhhc19kZW5vcm0gPT0gZGVub3JtX3ByZXNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9sb25nX2RvdWJsZV90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gCisJCQkJCSBfX2dsaWJjeHhfbG9uZ19kb3VibGVfdGlueW5lc3NfYmVmb3JlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSAKKwkJCQkJCSAgICAgIHJvdW5kX3RvX25lYXJlc3Q7CisgICAgfTsKKworI3VuZGVmIF9fZ2xpYmN4eF9sb25nX2RvdWJsZV9oYXNfZGVub3JtX2xvc3MKKyN1bmRlZiBfX2dsaWJjeHhfbG9uZ19kb3VibGVfdHJhcHMKKyN1bmRlZiBfX2dsaWJjeHhfbG9uZ19kb3VibGVfdGlueW5lc3NfYmVmb3JlCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI3VuZGVmIF9fZ2xpYmN4eF9zaWduZWQKKyN1bmRlZiBfX2dsaWJjeHhfbWluCisjdW5kZWYgX19nbGliY3h4X21heAorI3VuZGVmIF9fZ2xpYmN4eF9kaWdpdHMKKyN1bmRlZiBfX2dsaWJjeHhfZGlnaXRzMTAKKyN1bmRlZiBfX2dsaWJjeHhfbWF4X2RpZ2l0czEwCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9OVU1FUklDX0xJTUlUUwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9saXN0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNjI1NDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2xpc3QKQEAgLTAsMCArMSw3NSBAQAorLy8gPGxpc3Q+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL2xpc3QKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfTElTVAorI2RlZmluZSBfR0xJQkNYWF9MSVNUIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvcmFuZ2VfYWNjZXNzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfbGlzdC5oPgorI2luY2x1ZGUgPGJpdHMvbGlzdC50Y2M+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworIyBpbmNsdWRlIDxkZWJ1Zy9saXN0PgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9QUk9GSUxFCisjIGluY2x1ZGUgPHByb2ZpbGUvbGlzdD4KKyNlbmRpZgorCisjZW5kaWYgLyogX0dMSUJDWFhfTElTVCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2xvY2FsZSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbG9jYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZWI0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2xvY2FsZQpAQCAtMCwwICsxLDQzIEBACisvLyBMb2NhbGUgc3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMSAgTG9jYWxlcworLy8KKworLyoqIEBmaWxlIGluY2x1ZGUvbG9jYWxlCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0xPQ0FMRQorI2RlZmluZSBfR0xJQkNYWF9MT0NBTEUJMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2xvY2FsZWZ3ZC5oPgorI2luY2x1ZGUgPGJpdHMvbG9jYWxlX2NsYXNzZXMuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZV9mYWNldHMuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZV9mYWNldHNfbm9uaW8uaD4KKworI2VuZGlmIC8qIF9HTElCQ1hYX0xPQ0FMRSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9tYXAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmE3ZGRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9tYXAKQEAgLTAsMCArMSw3MyBAQAorLy8gPG1hcD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvbWFwCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX01BUAorI2RlZmluZSBfR0xJQkNYWF9NQVAgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL3N0bF90cmVlLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfbWFwLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfbXVsdGltYXAuaD4KKyNpbmNsdWRlIDxiaXRzL3JhbmdlX2FjY2Vzcy5oPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyMgaW5jbHVkZSA8ZGVidWcvbWFwPgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9QUk9GSUxFCisjIGluY2x1ZGUgPHByb2ZpbGUvbWFwPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9NQVAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbWVtb3J5IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9tZW1vcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyNjQ1NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbWVtb3J5CkBAIC0wLDAgKzEsOTAgQEAKKy8vIDxtZW1vcnk+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL21lbW9yeQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9NRU1PUlkKKyNkZWZpbmUgX0dMSUJDWFhfTUVNT1JZIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisvKioKKyAqIEBkZWZncm91cCBtZW1vcnkgTWVtb3J5CisgKiBAaW5ncm91cCB1dGlsaXRpZXMKKyAqCisgKiBDb21wb25lbnRzIGZvciBtZW1vcnkgYWxsb2NhdGlvbiwgZGVhbGxvY2F0aW9uLCBhbmQgbWFuYWdlbWVudC4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBwb2ludGVyX2Fic3RyYWN0aW9ucyBQb2ludGVyIEFic3RyYWN0aW9ucworICogQGluZ3JvdXAgbWVtb3J5CisgKgorICogU21hcnQgcG9pbnRlcnMsIGV0Yy4KKyAqLworCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2NvbnN0cnVjdC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3VuaW5pdGlhbGl6ZWQuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF90ZW1wYnVmLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfcmF3X3N0b3JhZ2VfaXRlci5oPgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyAgaW5jbHVkZSA8ZXhjZXB0aW9uPiAgICAgICAgCSAgLy8gc3RkOjpleGNlcHRpb24KKyMgIGluY2x1ZGUgPHR5cGVpbmZvPiAgICAgICAgIAkgIC8vIHN0ZDo6dHlwZV9pbmZvIGluIGdldF9kZWxldGVyCisjICBpbmNsdWRlIDxpb3Nmd2Q+ICAgICAgICAgICAJICAvLyBzdGQ6OmJhc2ljX29zdHJlYW0KKyMgIGluY2x1ZGUgPGV4dC9hdG9taWNpdHkuaD4KKyMgIGluY2x1ZGUgPGV4dC9jb25jdXJyZW5jZS5oPgorIyAgaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorIyAgaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4gIC8vIHN0ZDo6bGVzcworIyAgaW5jbHVkZSA8Yml0cy91c2VzX2FsbG9jYXRvci5oPgorIyAgaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjICBpbmNsdWRlIDxmdW5jdGlvbmFsPgorIyAgaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyMgIGluY2x1ZGUgPGJpdHMvdW5pcXVlX3B0ci5oPgorIyAgaW5jbHVkZSA8Yml0cy9zaGFyZWRfcHRyLmg+CisjICBpZiBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorIyAgICBpbmNsdWRlIDxiYWNrd2FyZC9hdXRvX3B0ci5oPgorIyAgZW5kaWYKKyNlbHNlCisjICBpbmNsdWRlIDxiYWNrd2FyZC9hdXRvX3B0ci5oPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9NRU1PUlkgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbXV0ZXggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L211dGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOTNkOWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L211dGV4CkBAIC0wLDAgKzEsODA1IEBACisvLyA8bXV0ZXg+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL211dGV4CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX01VVEVYCisjZGVmaW5lIF9HTElCQ1hYX01VVEVYIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxleGNlcHRpb24+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGJpdHMvZ3Roci5oPgorI2luY2x1ZGUgPGJpdHMvbW92ZS5oPiAvLyBmb3Igc3RkOjpzd2FwCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisjaWZkZWYgX0dMSUJDWFhfSEFTX0dUSFJFQURTCisgIC8vIENvbW1vbiBiYXNlIGNsYXNzIGZvciBzdGQ6Om11dGV4IGFuZCBzdGQ6OnRpbWVkX211dGV4CisgIGNsYXNzIF9fbXV0ZXhfYmFzZQorICB7CisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIF9fZ3RocmVhZF9tdXRleF90CQkJX19uYXRpdmVfdHlwZTsKKworI2lmZGVmIF9fR1RIUkVBRF9NVVRFWF9JTklUCisgICAgX19uYXRpdmVfdHlwZSAgX01fbXV0ZXggPSBfX0dUSFJFQURfTVVURVhfSU5JVDsKKworICAgIGNvbnN0ZXhwciBfX211dGV4X2Jhc2UoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisjZWxzZQorICAgIF9fbmF0aXZlX3R5cGUgIF9NX211dGV4OworCisgICAgX19tdXRleF9iYXNlKCkgbm9leGNlcHQKKyAgICB7CisgICAgICAvLyBYWFggRUFHQUlOLCBFTk9NRU0sIEVQRVJNLCBFQlVTWShtYXkpLCBFSU5WQUwobWF5KQorICAgICAgX19HVEhSRUFEX01VVEVYX0lOSVRfRlVOQ1RJT04oJl9NX211dGV4KTsKKyAgICB9CisKKyAgICB+X19tdXRleF9iYXNlKCkgbm9leGNlcHQgeyBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSgmX01fbXV0ZXgpOyB9CisjZW5kaWYKKworICAgIF9fbXV0ZXhfYmFzZShjb25zdCBfX211dGV4X2Jhc2UmKSA9IGRlbGV0ZTsKKyAgICBfX211dGV4X2Jhc2UmIG9wZXJhdG9yPShjb25zdCBfX211dGV4X2Jhc2UmKSA9IGRlbGV0ZTsKKyAgfTsKKworICAvLyBDb21tb24gYmFzZSBjbGFzcyBmb3Igc3RkOjpyZWN1cnNpdmVfbXV0ZXggYW5kIHN0ZDo6dGltZWRfcmVjdXJzaXZlX211dGV4CisgIGNsYXNzIF9fcmVjdXJzaXZlX211dGV4X2Jhc2UKKyAgeworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QJCV9fbmF0aXZlX3R5cGU7CisKKyAgICBfX3JlY3Vyc2l2ZV9tdXRleF9iYXNlKGNvbnN0IF9fcmVjdXJzaXZlX211dGV4X2Jhc2UmKSA9IGRlbGV0ZTsKKyAgICBfX3JlY3Vyc2l2ZV9tdXRleF9iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19yZWN1cnNpdmVfbXV0ZXhfYmFzZSYpID0gZGVsZXRlOworCisjaWZkZWYgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUCisgICAgX19uYXRpdmVfdHlwZSAgX01fbXV0ZXggPSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQ7CisKKyAgICBfX3JlY3Vyc2l2ZV9tdXRleF9iYXNlKCkgPSBkZWZhdWx0OworI2Vsc2UKKyAgICBfX25hdGl2ZV90eXBlICBfTV9tdXRleDsKKworICAgIF9fcmVjdXJzaXZlX211dGV4X2Jhc2UoKQorICAgIHsKKyAgICAgIC8vIFhYWCBFQUdBSU4sIEVOT01FTSwgRVBFUk0sIEVCVVNZKG1heSksIEVJTlZBTChtYXkpCisgICAgICBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQ1RJT04oJl9NX211dGV4KTsKKyAgICB9CisKKyAgICB+X19yZWN1cnNpdmVfbXV0ZXhfYmFzZSgpCisgICAgeyBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2Rlc3Ryb3koJl9NX211dGV4KTsgfQorI2VuZGlmCisgIH07CisKKyAgLyoqCisgICAqIEBkZWZncm91cCBtdXRleGVzIE11dGV4ZXMKKyAgICogQGluZ3JvdXAgY29uY3VycmVuY3kKKyAgICoKKyAgICogQ2xhc3NlcyBmb3IgbXV0ZXggc3VwcG9ydC4KKyAgICogQHsKKyAgICovCisKKyAgLy8vIG11dGV4CisgIGNsYXNzIG11dGV4IDogcHJpdmF0ZSBfX211dGV4X2Jhc2UKKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfX25hdGl2ZV90eXBlKiAJCQluYXRpdmVfaGFuZGxlX3R5cGU7CisKKyNpZmRlZiBfX0dUSFJFQURfTVVURVhfSU5JVAorICAgIGNvbnN0ZXhwcgorI2VuZGlmCisgICAgbXV0ZXgoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgfm11dGV4KCkgPSBkZWZhdWx0OworCisgICAgbXV0ZXgoY29uc3QgbXV0ZXgmKSA9IGRlbGV0ZTsKKyAgICBtdXRleCYgb3BlcmF0b3I9KGNvbnN0IG11dGV4JikgPSBkZWxldGU7CisKKyAgICB2b2lkCisgICAgbG9jaygpCisgICAgeworICAgICAgaW50IF9fZSA9IF9fZ3RocmVhZF9tdXRleF9sb2NrKCZfTV9tdXRleCk7CisKKyAgICAgIC8vIEVJTlZBTCwgRUFHQUlOLCBFQlVTWSwgRUlOVkFMLCBFREVBRExLKG1heSkKKyAgICAgIGlmIChfX2UpCisJX190aHJvd19zeXN0ZW1fZXJyb3IoX19lKTsKKyAgICB9CisKKyAgICBib29sCisgICAgdHJ5X2xvY2soKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIC8vIFhYWCBFSU5WQUwsIEVBR0FJTiwgRUJVU1kKKyAgICAgIHJldHVybiAhX19ndGhyZWFkX211dGV4X3RyeWxvY2soJl9NX211dGV4KTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgdW5sb2NrKCkKKyAgICB7CisgICAgICAvLyBYWFggRUlOVkFMLCBFQUdBSU4sIEVQRVJNCisgICAgICBfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgbmF0aXZlX2hhbmRsZV90eXBlCisgICAgbmF0aXZlX2hhbmRsZSgpCisgICAgeyByZXR1cm4gJl9NX211dGV4OyB9CisgIH07CisKKyAgLy8vIHJlY3Vyc2l2ZV9tdXRleAorICBjbGFzcyByZWN1cnNpdmVfbXV0ZXggOiBwcml2YXRlIF9fcmVjdXJzaXZlX211dGV4X2Jhc2UKKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfX25hdGl2ZV90eXBlKiAJCQluYXRpdmVfaGFuZGxlX3R5cGU7CisKKyAgICByZWN1cnNpdmVfbXV0ZXgoKSA9IGRlZmF1bHQ7CisgICAgfnJlY3Vyc2l2ZV9tdXRleCgpID0gZGVmYXVsdDsKKworICAgIHJlY3Vyc2l2ZV9tdXRleChjb25zdCByZWN1cnNpdmVfbXV0ZXgmKSA9IGRlbGV0ZTsKKyAgICByZWN1cnNpdmVfbXV0ZXgmIG9wZXJhdG9yPShjb25zdCByZWN1cnNpdmVfbXV0ZXgmKSA9IGRlbGV0ZTsKKworICAgIHZvaWQKKyAgICBsb2NrKCkKKyAgICB7CisgICAgICBpbnQgX19lID0gX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9sb2NrKCZfTV9tdXRleCk7CisKKyAgICAgIC8vIEVJTlZBTCwgRUFHQUlOLCBFQlVTWSwgRUlOVkFMLCBFREVBRExLKG1heSkKKyAgICAgIGlmIChfX2UpCisJX190aHJvd19zeXN0ZW1fZXJyb3IoX19lKTsKKyAgICB9CisKKyAgICBib29sCisgICAgdHJ5X2xvY2soKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIC8vIFhYWCBFSU5WQUwsIEVBR0FJTiwgRUJVU1kKKyAgICAgIHJldHVybiAhX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90cnlsb2NrKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgdm9pZAorICAgIHVubG9jaygpCisgICAgeworICAgICAgLy8gWFhYIEVJTlZBTCwgRUFHQUlOLCBFQlVTWQorICAgICAgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF91bmxvY2soJl9NX211dGV4KTsKKyAgICB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3R5cGUKKyAgICBuYXRpdmVfaGFuZGxlKCkKKyAgICB7IHJldHVybiAmX01fbXV0ZXg7IH0KKyAgfTsKKworI2lmIF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0sKKyAgLy8vIHRpbWVkX211dGV4CisgIGNsYXNzIHRpbWVkX211dGV4IDogcHJpdmF0ZSBfX211dGV4X2Jhc2UKKyAgeworI2lmZGVmIF9HTElCQ1hYX1VTRV9DTE9DS19NT05PVE9OSUMKKyAgICB0eXBlZGVmIGNocm9ubzo6c3RlYWR5X2Nsb2NrIAkgIAlfX2Nsb2NrX3Q7CisjZWxzZQorICAgIHR5cGVkZWYgY2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2sgCV9fY2xvY2tfdDsKKyNlbmRpZgorCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9fbmF0aXZlX3R5cGUqIAkJICAJbmF0aXZlX2hhbmRsZV90eXBlOworCisgICAgdGltZWRfbXV0ZXgoKSA9IGRlZmF1bHQ7CisgICAgfnRpbWVkX211dGV4KCkgPSBkZWZhdWx0OworCisgICAgdGltZWRfbXV0ZXgoY29uc3QgdGltZWRfbXV0ZXgmKSA9IGRlbGV0ZTsKKyAgICB0aW1lZF9tdXRleCYgb3BlcmF0b3I9KGNvbnN0IHRpbWVkX211dGV4JikgPSBkZWxldGU7CisKKyAgICB2b2lkCisgICAgbG9jaygpCisgICAgeworICAgICAgaW50IF9fZSA9IF9fZ3RocmVhZF9tdXRleF9sb2NrKCZfTV9tdXRleCk7CisKKyAgICAgIC8vIEVJTlZBTCwgRUFHQUlOLCBFQlVTWSwgRUlOVkFMLCBFREVBRExLKG1heSkKKyAgICAgIGlmIChfX2UpCisJX190aHJvd19zeXN0ZW1fZXJyb3IoX19lKTsKKyAgICB9CisKKyAgICBib29sCisgICAgdHJ5X2xvY2soKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIC8vIFhYWCBFSU5WQUwsIEVBR0FJTiwgRUJVU1kKKyAgICAgIHJldHVybiAhX19ndGhyZWFkX211dGV4X3RyeWxvY2soJl9NX211dGV4KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1JlcCwgY2xhc3MgX1BlcmlvZD4KKyAgICAgIGJvb2wKKyAgICAgIHRyeV9sb2NrX2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3J0aW1lKQorICAgICAgeyByZXR1cm4gX01fdHJ5X2xvY2tfZm9yKF9fcnRpbWUpOyB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24+CisgICAgICBib29sCisgICAgICB0cnlfbG9ja191bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2F0aW1lKQorICAgICAgeyByZXR1cm4gX01fdHJ5X2xvY2tfdW50aWwoX19hdGltZSk7IH0KKworICAgIHZvaWQKKyAgICB1bmxvY2soKQorICAgIHsKKyAgICAgIC8vIFhYWCBFSU5WQUwsIEVBR0FJTiwgRUJVU1kKKyAgICAgIF9fZ3RocmVhZF9tdXRleF91bmxvY2soJl9NX211dGV4KTsKKyAgICB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3R5cGUKKyAgICBuYXRpdmVfaGFuZGxlKCkKKyAgICB7IHJldHVybiAmX01fbXV0ZXg7IH0KKworICBwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICBib29sCisgICAgICBfTV90cnlfbG9ja19mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19ydGltZSkKKyAgICAgIHsKKwlhdXRvIF9fcnQgPSBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8X19jbG9ja190OjpkdXJhdGlvbj4oX19ydGltZSk7CisJaWYgKHJhdGlvX2dyZWF0ZXI8X19jbG9ja190OjpwZXJpb2QsIF9QZXJpb2Q+KCkpCisJICArK19fcnQ7CisKKwlyZXR1cm4gX01fdHJ5X2xvY2tfdW50aWwoX19jbG9ja190Ojpub3coKSArIF9fcnQpOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0R1cmF0aW9uPgorICAgICAgYm9vbAorICAgICAgX01fdHJ5X2xvY2tfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9fY2xvY2tfdCwKKwkJCQkJCSBfRHVyYXRpb24+JiBfX2F0aW1lKQorICAgICAgeworCWNocm9ubzo6dGltZV9wb2ludDxfX2Nsb2NrX3QsIGNocm9ubzo6c2Vjb25kcz4gX19zID0KKwkgIGNocm9ubzo6dGltZV9wb2ludF9jYXN0PGNocm9ubzo6c2Vjb25kcz4oX19hdGltZSk7CisKKwljaHJvbm86Om5hbm9zZWNvbmRzIF9fbnMgPQorCSAgY2hyb25vOjpkdXJhdGlvbl9jYXN0PGNocm9ubzo6bmFub3NlY29uZHM+KF9fYXRpbWUgLSBfX3MpOworCisJX19ndGhyZWFkX3RpbWVfdCBfX3RzID0geworCSAgc3RhdGljX2Nhc3Q8c3RkOjp0aW1lX3Q+KF9fcy50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSksCisJICBzdGF0aWNfY2FzdDxsb25nPihfX25zLmNvdW50KCkpCisJfTsKKworCXJldHVybiAhX19ndGhyZWFkX211dGV4X3RpbWVkbG9jayhuYXRpdmVfaGFuZGxlKCksICZfX3RzKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cmF0aW9uPgorICAgICAgYm9vbAorICAgICAgX01fdHJ5X2xvY2tfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hdGltZSkKKyAgICAgIHsgcmV0dXJuIF9NX3RyeV9sb2NrX2ZvcihfX2F0aW1lIC0gX0Nsb2NrOjpub3coKSk7IH0KKyAgfTsKKworICAvLy8gcmVjdXJzaXZlX3RpbWVkX211dGV4CisgIGNsYXNzIHJlY3Vyc2l2ZV90aW1lZF9tdXRleCA6IHByaXZhdGUgX19yZWN1cnNpdmVfbXV0ZXhfYmFzZQorICB7CisjaWZkZWYgX0dMSUJDWFhfVVNFX0NMT0NLX01PTk9UT05JQworICAgIHR5cGVkZWYgY2hyb25vOjpzdGVhZHlfY2xvY2sgCQlfX2Nsb2NrX3Q7CisjZWxzZQorICAgIHR5cGVkZWYgY2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2sgCV9fY2xvY2tfdDsKKyNlbmRpZgorCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9fbmF0aXZlX3R5cGUqIAkJCW5hdGl2ZV9oYW5kbGVfdHlwZTsKKworICAgIHJlY3Vyc2l2ZV90aW1lZF9tdXRleCgpID0gZGVmYXVsdDsKKyAgICB+cmVjdXJzaXZlX3RpbWVkX211dGV4KCkgPSBkZWZhdWx0OworCisgICAgcmVjdXJzaXZlX3RpbWVkX211dGV4KGNvbnN0IHJlY3Vyc2l2ZV90aW1lZF9tdXRleCYpID0gZGVsZXRlOworICAgIHJlY3Vyc2l2ZV90aW1lZF9tdXRleCYgb3BlcmF0b3I9KGNvbnN0IHJlY3Vyc2l2ZV90aW1lZF9tdXRleCYpID0gZGVsZXRlOworCisgICAgdm9pZAorICAgIGxvY2soKQorICAgIHsKKyAgICAgIGludCBfX2UgPSBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2xvY2soJl9NX211dGV4KTsKKworICAgICAgLy8gRUlOVkFMLCBFQUdBSU4sIEVCVVNZLCBFSU5WQUwsIEVERUFETEsobWF5KQorICAgICAgaWYgKF9fZSkKKwlfX3Rocm93X3N5c3RlbV9lcnJvcihfX2UpOworICAgIH0KKworICAgIGJvb2wKKyAgICB0cnlfbG9jaygpIG5vZXhjZXB0CisgICAgeworICAgICAgLy8gWFhYIEVJTlZBTCwgRUFHQUlOLCBFQlVTWQorICAgICAgcmV0dXJuICFfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RyeWxvY2soJl9NX211dGV4KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1JlcCwgY2xhc3MgX1BlcmlvZD4KKyAgICAgIGJvb2wKKyAgICAgIHRyeV9sb2NrX2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3J0aW1lKQorICAgICAgeyByZXR1cm4gX01fdHJ5X2xvY2tfZm9yKF9fcnRpbWUpOyB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0Nsb2NrLCBjbGFzcyBfRHVyYXRpb24+CisgICAgICBib29sCisgICAgICB0cnlfbG9ja191bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2F0aW1lKQorICAgICAgeyByZXR1cm4gX01fdHJ5X2xvY2tfdW50aWwoX19hdGltZSk7IH0KKworICAgIHZvaWQKKyAgICB1bmxvY2soKQorICAgIHsKKyAgICAgIC8vIFhYWCBFSU5WQUwsIEVBR0FJTiwgRUJVU1kKKyAgICAgIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgbmF0aXZlX2hhbmRsZV90eXBlCisgICAgbmF0aXZlX2hhbmRsZSgpCisgICAgeyByZXR1cm4gJl9NX211dGV4OyB9CisKKyAgcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorICAgICAgYm9vbAorICAgICAgX01fdHJ5X2xvY2tfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUpCisgICAgICB7CisJYXV0byBfX3J0ID0gY2hyb25vOjpkdXJhdGlvbl9jYXN0PF9fY2xvY2tfdDo6ZHVyYXRpb24+KF9fcnRpbWUpOworCWlmIChyYXRpb19ncmVhdGVyPF9fY2xvY2tfdDo6cGVyaW9kLCBfUGVyaW9kPigpKQorCSAgKytfX3J0OworCisJcmV0dXJuIF9NX3RyeV9sb2NrX3VudGlsKF9fY2xvY2tfdDo6bm93KCkgKyBfX3J0KTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9EdXJhdGlvbj4KKyAgICAgIGJvb2wKKyAgICAgIF9NX3RyeV9sb2NrX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfX2Nsb2NrX3QsCisJCQkJCQkgX0R1cmF0aW9uPiYgX19hdGltZSkKKyAgICAgIHsKKwljaHJvbm86OnRpbWVfcG9pbnQ8X19jbG9ja190LCBjaHJvbm86OnNlY29uZHM+IF9fcyA9CisJICBjaHJvbm86OnRpbWVfcG9pbnRfY2FzdDxjaHJvbm86OnNlY29uZHM+KF9fYXRpbWUpOworCisJY2hyb25vOjpuYW5vc2Vjb25kcyBfX25zID0KKwkgIGNocm9ubzo6ZHVyYXRpb25fY2FzdDxjaHJvbm86Om5hbm9zZWNvbmRzPihfX2F0aW1lIC0gX19zKTsKKworCV9fZ3RocmVhZF90aW1lX3QgX190cyA9IHsKKwkgIHN0YXRpY19jYXN0PHN0ZDo6dGltZV90PihfX3MudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpLAorCSAgc3RhdGljX2Nhc3Q8bG9uZz4oX19ucy5jb3VudCgpKQorCX07CisKKwlyZXR1cm4gIV9fZ3RocmVhZF9tdXRleF90aW1lZGxvY2sobmF0aXZlX2hhbmRsZSgpLCAmX190cyk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXJhdGlvbj4KKyAgICAgIGJvb2wKKyAgICAgIF9NX3RyeV9sb2NrX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYXRpbWUpCisgICAgICB7IHJldHVybiBfTV90cnlfbG9ja19mb3IoX19hdGltZSAtIF9DbG9jazo6bm93KCkpOyB9CisgIH07CisjZW5kaWYKKyNlbmRpZiAvLyBfR0xJQkNYWF9IQVNfR1RIUkVBRFMKKworICAvLy8gRG8gbm90IGFjcXVpcmUgb3duZXJzaGlwIG9mIHRoZSBtdXRleC4KKyAgc3RydWN0IGRlZmVyX2xvY2tfdCB7IH07CisKKyAgLy8vIFRyeSB0byBhY3F1aXJlIG93bmVyc2hpcCBvZiB0aGUgbXV0ZXggd2l0aG91dCBibG9ja2luZy4KKyAgc3RydWN0IHRyeV90b19sb2NrX3QgeyB9OworCisgIC8vLyBBc3N1bWUgdGhlIGNhbGxpbmcgdGhyZWFkIGhhcyBhbHJlYWR5IG9idGFpbmVkIG11dGV4IG93bmVyc2hpcAorICAvLy8gYW5kIG1hbmFnZSBpdC4KKyAgc3RydWN0IGFkb3B0X2xvY2tfdCB7IH07CisKKyAgY29uc3RleHByIGRlZmVyX2xvY2tfdAlkZWZlcl9sb2NrIHsgfTsKKyAgY29uc3RleHByIHRyeV90b19sb2NrX3QJdHJ5X3RvX2xvY2sgeyB9OworICBjb25zdGV4cHIgYWRvcHRfbG9ja190CWFkb3B0X2xvY2sgeyB9OworCisgIC8vLyBAYnJpZWYgIFNjb3BlZCBsb2NrIGlkaW9tLgorICAvLyBBY3F1aXJlIHRoZSBtdXRleCBoZXJlIHdpdGggYSBjb25zdHJ1Y3RvciBjYWxsLCB0aGVuIHJlbGVhc2Ugd2l0aAorICAvLyB0aGUgZGVzdHJ1Y3RvciBjYWxsIGluIGFjY29yZGFuY2Ugd2l0aCBSQUlJIHN0eWxlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTXV0ZXg+CisgICAgY2xhc3MgbG9ja19ndWFyZAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9NdXRleCBtdXRleF90eXBlOworCisgICAgICBleHBsaWNpdCBsb2NrX2d1YXJkKG11dGV4X3R5cGUmIF9fbSkgOiBfTV9kZXZpY2UoX19tKQorICAgICAgeyBfTV9kZXZpY2UubG9jaygpOyB9CisKKyAgICAgIGxvY2tfZ3VhcmQobXV0ZXhfdHlwZSYgX19tLCBhZG9wdF9sb2NrX3QpIDogX01fZGV2aWNlKF9fbSkKKyAgICAgIHsgfSAvLyBjYWxsaW5nIHRocmVhZCBvd25zIG11dGV4CisKKyAgICAgIH5sb2NrX2d1YXJkKCkKKyAgICAgIHsgX01fZGV2aWNlLnVubG9jaygpOyB9CisKKyAgICAgIGxvY2tfZ3VhcmQoY29uc3QgbG9ja19ndWFyZCYpID0gZGVsZXRlOworICAgICAgbG9ja19ndWFyZCYgb3BlcmF0b3I9KGNvbnN0IGxvY2tfZ3VhcmQmKSA9IGRlbGV0ZTsKKworICAgIHByaXZhdGU6CisgICAgICBtdXRleF90eXBlJiAgX01fZGV2aWNlOworICAgIH07CisKKyAgLy8vIHVuaXF1ZV9sb2NrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NdXRleD4KKyAgICBjbGFzcyB1bmlxdWVfbG9jaworICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9NdXRleCBtdXRleF90eXBlOworCisgICAgICB1bmlxdWVfbG9jaygpIG5vZXhjZXB0CisgICAgICA6IF9NX2RldmljZSgwKSwgX01fb3ducyhmYWxzZSkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdCB1bmlxdWVfbG9jayhtdXRleF90eXBlJiBfX20pCisgICAgICA6IF9NX2RldmljZSgmX19tKSwgX01fb3ducyhmYWxzZSkKKyAgICAgIHsKKwlsb2NrKCk7CisJX01fb3ducyA9IHRydWU7CisgICAgICB9CisKKyAgICAgIHVuaXF1ZV9sb2NrKG11dGV4X3R5cGUmIF9fbSwgZGVmZXJfbG9ja190KSBub2V4Y2VwdAorICAgICAgOiBfTV9kZXZpY2UoJl9fbSksIF9NX293bnMoZmFsc2UpCisgICAgICB7IH0KKworICAgICAgdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgX19tLCB0cnlfdG9fbG9ja190KQorICAgICAgOiBfTV9kZXZpY2UoJl9fbSksIF9NX293bnMoX01fZGV2aWNlLT50cnlfbG9jaygpKQorICAgICAgeyB9CisKKyAgICAgIHVuaXF1ZV9sb2NrKG11dGV4X3R5cGUmIF9fbSwgYWRvcHRfbG9ja190KQorICAgICAgOiBfTV9kZXZpY2UoJl9fbSksIF9NX293bnModHJ1ZSkKKyAgICAgIHsKKwkvLyBYWFggY2FsbGluZyB0aHJlYWQgb3ducyBtdXRleAorICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXJhdGlvbj4KKwl1bmlxdWVfbG9jayhtdXRleF90eXBlJiBfX20sCisJCSAgICBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2F0aW1lKQorCTogX01fZGV2aWNlKCZfX20pLCBfTV9vd25zKF9NX2RldmljZS0+dHJ5X2xvY2tfdW50aWwoX19hdGltZSkpCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisJdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgX19tLAorCQkgICAgY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19ydGltZSkKKwk6IF9NX2RldmljZSgmX19tKSwgX01fb3ducyhfTV9kZXZpY2UtPnRyeV9sb2NrX2ZvcihfX3J0aW1lKSkKKwl7IH0KKworICAgICAgfnVuaXF1ZV9sb2NrKCkKKyAgICAgIHsKKwlpZiAoX01fb3ducykKKwkgIHVubG9jaygpOworICAgICAgfQorCisgICAgICB1bmlxdWVfbG9jayhjb25zdCB1bmlxdWVfbG9jayYpID0gZGVsZXRlOworICAgICAgdW5pcXVlX2xvY2smIG9wZXJhdG9yPShjb25zdCB1bmlxdWVfbG9jayYpID0gZGVsZXRlOworCisgICAgICB1bmlxdWVfbG9jayh1bmlxdWVfbG9jayYmIF9fdSkgbm9leGNlcHQKKyAgICAgIDogX01fZGV2aWNlKF9fdS5fTV9kZXZpY2UpLCBfTV9vd25zKF9fdS5fTV9vd25zKQorICAgICAgeworCV9fdS5fTV9kZXZpY2UgPSAwOworCV9fdS5fTV9vd25zID0gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHVuaXF1ZV9sb2NrJiBvcGVyYXRvcj0odW5pcXVlX2xvY2smJiBfX3UpIG5vZXhjZXB0CisgICAgICB7CisJaWYoX01fb3ducykKKwkgIHVubG9jaygpOworCisJdW5pcXVlX2xvY2soc3RkOjptb3ZlKF9fdSkpLnN3YXAoKnRoaXMpOworCisJX191Ll9NX2RldmljZSA9IDA7CisJX191Ll9NX293bnMgPSBmYWxzZTsKKworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgbG9jaygpCisgICAgICB7CisJaWYgKCFfTV9kZXZpY2UpCisJICBfX3Rocm93X3N5c3RlbV9lcnJvcihpbnQoZXJyYzo6b3BlcmF0aW9uX25vdF9wZXJtaXR0ZWQpKTsKKwllbHNlIGlmIChfTV9vd25zKQorCSAgX190aHJvd19zeXN0ZW1fZXJyb3IoaW50KGVycmM6OnJlc291cmNlX2RlYWRsb2NrX3dvdWxkX29jY3VyKSk7CisJZWxzZQorCSAgeworCSAgICBfTV9kZXZpY2UtPmxvY2soKTsKKwkgICAgX01fb3ducyA9IHRydWU7CisJICB9CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIHRyeV9sb2NrKCkKKyAgICAgIHsKKwlpZiAoIV9NX2RldmljZSkKKwkgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKGludChlcnJjOjpvcGVyYXRpb25fbm90X3Blcm1pdHRlZCkpOworCWVsc2UgaWYgKF9NX293bnMpCisJICBfX3Rocm93X3N5c3RlbV9lcnJvcihpbnQoZXJyYzo6cmVzb3VyY2VfZGVhZGxvY2tfd291bGRfb2NjdXIpKTsKKwllbHNlCisJICB7CisJICAgIF9NX293bnMgPSBfTV9kZXZpY2UtPnRyeV9sb2NrKCk7CisJICAgIHJldHVybiBfTV9vd25zOworCSAgfQorICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXJhdGlvbj4KKwlib29sCisJdHJ5X2xvY2tfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hdGltZSkKKwl7CisJICBpZiAoIV9NX2RldmljZSkKKwkgICAgX190aHJvd19zeXN0ZW1fZXJyb3IoaW50KGVycmM6Om9wZXJhdGlvbl9ub3RfcGVybWl0dGVkKSk7CisJICBlbHNlIGlmIChfTV9vd25zKQorCSAgICBfX3Rocm93X3N5c3RlbV9lcnJvcihpbnQoZXJyYzo6cmVzb3VyY2VfZGVhZGxvY2tfd291bGRfb2NjdXIpKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9NX293bnMgPSBfTV9kZXZpY2UtPnRyeV9sb2NrX3VudGlsKF9fYXRpbWUpOworCSAgICAgIHJldHVybiBfTV9vd25zOworCSAgICB9CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorCWJvb2wKKwl0cnlfbG9ja19mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19ydGltZSkKKwl7CisJICBpZiAoIV9NX2RldmljZSkKKwkgICAgX190aHJvd19zeXN0ZW1fZXJyb3IoaW50KGVycmM6Om9wZXJhdGlvbl9ub3RfcGVybWl0dGVkKSk7CisJICBlbHNlIGlmIChfTV9vd25zKQorCSAgICBfX3Rocm93X3N5c3RlbV9lcnJvcihpbnQoZXJyYzo6cmVzb3VyY2VfZGVhZGxvY2tfd291bGRfb2NjdXIpKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9NX293bnMgPSBfTV9kZXZpY2UtPnRyeV9sb2NrX2ZvcihfX3J0aW1lKTsKKwkgICAgICByZXR1cm4gX01fb3duczsKKwkgICAgfQorCSB9CisKKyAgICAgIHZvaWQKKyAgICAgIHVubG9jaygpCisgICAgICB7CisJaWYgKCFfTV9vd25zKQorCSAgX190aHJvd19zeXN0ZW1fZXJyb3IoaW50KGVycmM6Om9wZXJhdGlvbl9ub3RfcGVybWl0dGVkKSk7CisJZWxzZSBpZiAoX01fZGV2aWNlKQorCSAgeworCSAgICBfTV9kZXZpY2UtPnVubG9jaygpOworCSAgICBfTV9vd25zID0gZmFsc2U7CisJICB9CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodW5pcXVlX2xvY2smIF9fdSkgbm9leGNlcHQKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fZGV2aWNlLCBfX3UuX01fZGV2aWNlKTsKKwlzdGQ6OnN3YXAoX01fb3ducywgX191Ll9NX293bnMpOworICAgICAgfQorCisgICAgICBtdXRleF90eXBlKgorICAgICAgcmVsZWFzZSgpIG5vZXhjZXB0CisgICAgICB7CisJbXV0ZXhfdHlwZSogX19yZXQgPSBfTV9kZXZpY2U7CisJX01fZGV2aWNlID0gMDsKKwlfTV9vd25zID0gZmFsc2U7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICBib29sCisgICAgICBvd25zX2xvY2soKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fb3duczsgfQorCisgICAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIG93bnNfbG9jaygpOyB9CisKKyAgICAgIG11dGV4X3R5cGUqCisgICAgICBtdXRleCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9kZXZpY2U7IH0KKworICAgIHByaXZhdGU6CisgICAgICBtdXRleF90eXBlKglfTV9kZXZpY2U7CisgICAgICBib29sCQlfTV9vd25zOyAvLyBYWFggdXNlIGF0b21pY19ib29sCisgICAgfTsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgdW5pcXVlX2xvY2sgb2JqZWN0cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX011dGV4PgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bmlxdWVfbG9jazxfTXV0ZXg+JiBfX3gsIHVuaXF1ZV9sb2NrPF9NdXRleD4mIF9feSkgbm9leGNlcHQKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTxpbnQgX0lkeD4KKyAgICBzdHJ1Y3QgX191bmxvY2tfaW1wbAorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9Mb2NrPgorCXN0YXRpYyB2b2lkCisJX19kb191bmxvY2sodHVwbGU8X0xvY2smLi4uPiYgX19sb2NrcykKKwl7CisJICBzdGQ6OmdldDxfSWR4PihfX2xvY2tzKS51bmxvY2soKTsKKwkgIF9fdW5sb2NrX2ltcGw8X0lkeCAtIDE+OjpfX2RvX3VubG9jayhfX2xvY2tzKTsKKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fdW5sb2NrX2ltcGw8LTE+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0xvY2s+CisJc3RhdGljIHZvaWQKKwlfX2RvX3VubG9jayh0dXBsZTxfTG9jayYuLi4+JikKKwl7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Mb2NrPgorICAgIHVuaXF1ZV9sb2NrPF9Mb2NrPgorICAgIF9fdHJ5X3RvX2xvY2soX0xvY2smIF9fbCkKKyAgICB7IHJldHVybiB1bmlxdWVfbG9jazxfTG9jaz4oX19sLCB0cnlfdG9fbG9jayk7IH0KKworICB0ZW1wbGF0ZTxpbnQgX0lkeCwgYm9vbCBfQ29udGludWUgPSB0cnVlPgorICAgIHN0cnVjdCBfX3RyeV9sb2NrX2ltcGwKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfTG9jaz4KKwlzdGF0aWMgdm9pZAorCV9fZG9fdHJ5X2xvY2sodHVwbGU8X0xvY2smLi4uPiYgX19sb2NrcywgaW50JiBfX2lkeCkKKwl7CisgICAgICAgICAgX19pZHggPSBfSWR4OworICAgICAgICAgIGF1dG8gX19sb2NrID0gX190cnlfdG9fbG9jayhzdGQ6OmdldDxfSWR4PihfX2xvY2tzKSk7CisgICAgICAgICAgaWYgKF9fbG9jay5vd25zX2xvY2soKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX190cnlfbG9ja19pbXBsPF9JZHggKyAxLCBfSWR4ICsgMiA8IHNpemVvZi4uLihfTG9jayk+OjoKKyAgICAgICAgICAgICAgICBfX2RvX3RyeV9sb2NrKF9fbG9ja3MsIF9faWR4KTsKKyAgICAgICAgICAgICAgaWYgKF9faWR4ID09IC0xKQorICAgICAgICAgICAgICAgIF9fbG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8aW50IF9JZHg+CisgICAgc3RydWN0IF9fdHJ5X2xvY2tfaW1wbDxfSWR4LCBmYWxzZT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfTG9jaz4KKwlzdGF0aWMgdm9pZAorCV9fZG9fdHJ5X2xvY2sodHVwbGU8X0xvY2smLi4uPiYgX19sb2NrcywgaW50JiBfX2lkeCkKKwl7CisgICAgICAgICAgX19pZHggPSBfSWR4OworICAgICAgICAgIGF1dG8gX19sb2NrID0gX190cnlfdG9fbG9jayhzdGQ6OmdldDxfSWR4PihfX2xvY2tzKSk7CisgICAgICAgICAgaWYgKF9fbG9jay5vd25zX2xvY2soKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19pZHggPSAtMTsKKyAgICAgICAgICAgICAgX19sb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKwl9CisgICAgfTsKKworICAvKiogQGJyaWVmIEdlbmVyaWMgdHJ5X2xvY2suCisgICAqICBAcGFyYW0gX19sMSBNZWV0cyBNdXRleCByZXF1aXJlbWVudHMgKHRyeV9sb2NrKCkgbWF5IHRocm93KS4KKyAgICogIEBwYXJhbSBfX2wyIE1lZXRzIE11dGV4IHJlcXVpcmVtZW50cyAodHJ5X2xvY2soKSBtYXkgdGhyb3cpLgorICAgKiAgQHBhcmFtIF9fbDMgTWVldHMgTXV0ZXggcmVxdWlyZW1lbnRzICh0cnlfbG9jaygpIG1heSB0aHJvdykuCisgICAqICBAcmV0dXJuIFJldHVybnMgLTEgaWYgYWxsIHRyeV9sb2NrKCkgY2FsbHMgcmV0dXJuIHRydWUuIE90aGVyd2lzZSByZXR1cm5zCisgICAqICAgICAgICAgIGEgMC1iYXNlZCBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoZSBhcmd1bWVudCB0aGF0IHJldHVybmVkIGZhbHNlLgorICAgKiAgQHBvc3QgRWl0aGVyIGFsbCBhcmd1bWVudHMgYXJlIGxvY2tlZCwgb3Igbm9uZSB3aWxsIGJlLgorICAgKgorICAgKiAgU2VxdWVudGlhbGx5IGNhbGxzIHRyeV9sb2NrKCkgb24gZWFjaCBhcmd1bWVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Mb2NrMSwgdHlwZW5hbWUgX0xvY2syLCB0eXBlbmFtZS4uLiBfTG9jazM+CisgICAgaW50CisgICAgdHJ5X2xvY2soX0xvY2sxJiBfX2wxLCBfTG9jazImIF9fbDIsIF9Mb2NrMyYuLi4gX19sMykKKyAgICB7CisgICAgICBpbnQgX19pZHg7CisgICAgICBhdXRvIF9fbG9ja3MgPSBzdGQ6OnRpZShfX2wxLCBfX2wyLCBfX2wzLi4uKTsKKyAgICAgIF9fdHJ5CisgICAgICB7IF9fdHJ5X2xvY2tfaW1wbDwwPjo6X19kb190cnlfbG9jayhfX2xvY2tzLCBfX2lkeCk7IH0KKyAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgeyB9CisgICAgICByZXR1cm4gX19pZHg7CisgICAgfQorCisgIC8qKiBAYnJpZWYgR2VuZXJpYyBsb2NrLgorICAgKiAgQHBhcmFtIF9fbDEgTWVldHMgTXV0ZXggcmVxdWlyZW1lbnRzICh0cnlfbG9jaygpIG1heSB0aHJvdykuCisgICAqICBAcGFyYW0gX19sMiBNZWV0cyBNdXRleCByZXF1aXJlbWVudHMgKHRyeV9sb2NrKCkgbWF5IHRocm93KS4KKyAgICogIEBwYXJhbSBfX2wzIE1lZXRzIE11dGV4IHJlcXVpcmVtZW50cyAodHJ5X2xvY2soKSBtYXkgdGhyb3cpLgorICAgKiAgQHRocm93IEFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYW4gYXJndW1lbnQncyBsb2NrKCkgb3IgdHJ5X2xvY2soKSBtZW1iZXIuCisgICAqICBAcG9zdCBBbGwgYXJndW1lbnRzIGFyZSBsb2NrZWQuCisgICAqCisgICAqICBBbGwgYXJndW1lbnRzIGFyZSBsb2NrZWQgdmlhIGEgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gbG9jaygpLCB0cnlfbG9jaygpCisgICAqICBhbmQgdW5sb2NrKCkuICBJZiB0aGUgY2FsbCBleGl0cyB2aWEgYW4gZXhjZXB0aW9uIGFueSBsb2NrcyB0aGF0IHdlcmUKKyAgICogIG9idGFpbmVkIHdpbGwgYmUgcmVsZWFzZWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTDEsIHR5cGVuYW1lIF9MMiwgdHlwZW5hbWUgLi4uX0wzPgorICAgIHZvaWQKKyAgICBsb2NrKF9MMSYgX19sMSwgX0wyJiBfX2wyLCBfTDMmLi4uIF9fbDMpCisgICAgeworICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICB1bmlxdWVfbG9jazxfTDE+IF9fZmlyc3QoX19sMSk7CisgICAgICAgICAgaW50IF9faWR4OworICAgICAgICAgIGF1dG8gX19sb2NrcyA9IHN0ZDo6dGllKF9fbDIsIF9fbDMuLi4pOworICAgICAgICAgIF9fdHJ5X2xvY2tfaW1wbDwwLCBzaXplb2YuLi4oX0wzKT46Ol9fZG9fdHJ5X2xvY2soX19sb2NrcywgX19pZHgpOworICAgICAgICAgIGlmIChfX2lkeCA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19maXJzdC5yZWxlYXNlKCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0hBU19HVEhSRUFEUworICAvLy8gb25jZV9mbGFnCisgIHN0cnVjdCBvbmNlX2ZsYWcKKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgX19ndGhyZWFkX29uY2VfdCBfX25hdGl2ZV90eXBlOworICAgIF9fbmF0aXZlX3R5cGUgIF9NX29uY2UgPSBfX0dUSFJFQURfT05DRV9JTklUOworCisgIHB1YmxpYzoKKyAgICAvLy8gQ29uc3RydWN0b3IKKyAgICBjb25zdGV4cHIgb25jZV9mbGFnKCkgbm9leGNlcHQgPSBkZWZhdWx0OworCisgICAgLy8vIERlbGV0ZWQgY29weSBjb25zdHJ1Y3RvcgorICAgIG9uY2VfZmxhZyhjb25zdCBvbmNlX2ZsYWcmKSA9IGRlbGV0ZTsKKyAgICAvLy8gRGVsZXRlZCBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgb25jZV9mbGFnJiBvcGVyYXRvcj0oY29uc3Qgb25jZV9mbGFnJikgPSBkZWxldGU7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2FsbGFibGUsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgZnJpZW5kIHZvaWQKKyAgICAgIGNhbGxfb25jZShvbmNlX2ZsYWcmIF9fb25jZSwgX0NhbGxhYmxlJiYgX19mLCBfQXJncyYmLi4uIF9fYXJncyk7CisgIH07CisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX1RMUworICBleHRlcm4gX190aHJlYWQgdm9pZCogX19vbmNlX2NhbGxhYmxlOworICBleHRlcm4gX190aHJlYWQgdm9pZCAoKl9fb25jZV9jYWxsKSgpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DYWxsYWJsZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fb25jZV9jYWxsX2ltcGwoKQorICAgIHsKKyAgICAgICgqKF9DYWxsYWJsZSopX19vbmNlX2NhbGxhYmxlKSgpOworICAgIH0KKyNlbHNlCisgIGV4dGVybiBmdW5jdGlvbjx2b2lkKCk+IF9fb25jZV9mdW5jdG9yOworCisgIGV4dGVybiB2b2lkCisgIF9fc2V0X29uY2VfZnVuY3Rvcl9sb2NrX3B0cih1bmlxdWVfbG9jazxtdXRleD4qKTsKKworICBleHRlcm4gbXV0ZXgmCisgIF9fZ2V0X29uY2VfbXV0ZXgoKTsKKyNlbmRpZgorCisgIGV4dGVybiAiQyIgdm9pZCBfX29uY2VfcHJveHkodm9pZCk7CisKKyAgLy8vIGNhbGxfb25jZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2FsbGFibGUsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHZvaWQKKyAgICBjYWxsX29uY2Uob25jZV9mbGFnJiBfX29uY2UsIF9DYWxsYWJsZSYmIF9fZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworI2lmZGVmIF9HTElCQ1hYX0hBVkVfVExTCisgICAgICBhdXRvIF9fYm91bmRfZnVuY3RvciA9IHN0ZDo6X19iaW5kX3NpbXBsZShzdGQ6OmZvcndhcmQ8X0NhbGxhYmxlPihfX2YpLAorICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICBfX29uY2VfY2FsbGFibGUgPSAmX19ib3VuZF9mdW5jdG9yOworICAgICAgX19vbmNlX2NhbGwgPSAmX19vbmNlX2NhbGxfaW1wbDxkZWNsdHlwZShfX2JvdW5kX2Z1bmN0b3IpPjsKKyNlbHNlCisgICAgICB1bmlxdWVfbG9jazxtdXRleD4gX19mdW5jdG9yX2xvY2soX19nZXRfb25jZV9tdXRleCgpKTsKKyAgICAgIGF1dG8gX19jYWxsYWJsZSA9IHN0ZDo6X19iaW5kX3NpbXBsZShzdGQ6OmZvcndhcmQ8X0NhbGxhYmxlPihfX2YpLAorICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICBfX29uY2VfZnVuY3RvciA9IFsmXSgpIHsgX19jYWxsYWJsZSgpOyB9OworICAgICAgX19zZXRfb25jZV9mdW5jdG9yX2xvY2tfcHRyKCZfX2Z1bmN0b3JfbG9jayk7CisjZW5kaWYKKworICAgICAgaW50IF9fZSA9IF9fZ3RocmVhZF9vbmNlKCYoX19vbmNlLl9NX29uY2UpLCAmX19vbmNlX3Byb3h5KTsKKworI2lmbmRlZiBfR0xJQkNYWF9IQVZFX1RMUworICAgICAgaWYgKF9fZnVuY3Rvcl9sb2NrKQorICAgICAgICBfX3NldF9vbmNlX2Z1bmN0b3JfbG9ja19wdHIoMCk7CisjZW5kaWYKKworICAgICAgaWYgKF9fZSkKKwlfX3Rocm93X3N5c3RlbV9lcnJvcihfX2UpOworICAgIH0KKyNlbmRpZiAvLyBfR0xJQkNYWF9IQVNfR1RIUkVBRFMKKworICAvLyBAfSBncm91cCBtdXRleGVzCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfTVVURVgKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbmV3IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9uZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE5MjYwMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbmV3CkBAIC0wLDAgKzEsMTIyIEBACisvLyBUaGUgLSotIEMrKyAtKi0gZHluYW1pYyBtZW1vcnkgbWFuYWdlbWVudCBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5NC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisvLworLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIAorLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIG5ldworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKgorICogIFRoZSBoZWFkZXIgQGMgbmV3IGRlZmluZXMgc2V2ZXJhbCBmdW5jdGlvbnMgdG8gbWFuYWdlIGR5bmFtaWMgbWVtb3J5IGFuZAorICogIGhhbmRsaW5nIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yczsgc2VlCisgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrLzE4X3N1cHBvcnQvaG93dG8uaHRtbCM0IGZvciBtb3JlLgorICovCisKKyNpZm5kZWYgX05FVworI2RlZmluZSBfTkVXCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKworZXh0ZXJuICJDKysiIHsKKworbmFtZXNwYWNlIHN0ZCAKK3sKKyAgLyoqCisgICAqICBAYnJpZWYgIEV4Y2VwdGlvbiBwb3NzaWJseSB0aHJvd24gYnkgQGMgbmV3LgorICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgKgorICAgKiAgQGMgYmFkX2FsbG9jIChvciBjbGFzc2VzIGRlcml2ZWQgZnJvbSBpdCkgaXMgdXNlZCB0byByZXBvcnQgYWxsb2NhdGlvbgorICAgKiAgZXJyb3JzIGZyb20gdGhlIHRocm93aW5nIGZvcm1zIG9mIEBjIG5ldy4gICovCisgIGNsYXNzIGJhZF9hbGxvYyA6IHB1YmxpYyBleGNlcHRpb24gCisgIHsKKyAgcHVibGljOgorICAgIGJhZF9hbGxvYygpIHRocm93KCkgeyB9CisKKyAgICAvLyBUaGlzIGRlY2xhcmF0aW9uIGlzIG5vdCB1c2VsZXNzOgorICAgIC8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy0zLjAuMi9nY2NfNi5odG1sI1NFQzExOAorICAgIHZpcnR1YWwgfmJhZF9hbGxvYygpIHRocm93KCk7CisKKyAgICAvLyBTZWUgY29tbWVudCBpbiBlaF9leGNlcHRpb24uY2MuCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKTsKKyAgfTsKKworICBzdHJ1Y3Qgbm90aHJvd190IHsgfTsKKworICBleHRlcm4gY29uc3Qgbm90aHJvd190IG5vdGhyb3c7CisKKyAgLyoqIElmIHlvdSB3cml0ZSB5b3VyIG93biBlcnJvciBoYW5kbGVyIHRvIGJlIGNhbGxlZCBieSBAYyBuZXcsIGl0IG11c3QKKyAgICogIGJlIG9mIHRoaXMgdHlwZS4gICovCisgIHR5cGVkZWYgdm9pZCAoKm5ld19oYW5kbGVyKSgpOworCisgIC8vLyBUYWtlcyBhIHJlcGxhY2VtZW50IGhhbmRsZXIgYXMgdGhlIGFyZ3VtZW50LCByZXR1cm5zIHRoZQorICAvLy8gcHJldmlvdXMgaGFuZGxlci4KKyAgbmV3X2hhbmRsZXIgc2V0X25ld19oYW5kbGVyKG5ld19oYW5kbGVyKSB0aHJvdygpOworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKy8vQHsKKy8qKiBUaGVzZSBhcmUgcmVwbGFjZWFibGUgc2lnbmF0dXJlczoKKyAqICAtIG5vcm1hbCBzaW5nbGUgbmV3IGFuZCBkZWxldGUgKG5vIGFyZ3VtZW50cywgdGhyb3cgQGMgYmFkX2FsbG9jIG9uIGVycm9yKQorICogIC0gbm9ybWFsIGFycmF5IG5ldyBhbmQgZGVsZXRlIChzYW1lKQorICogIC0gQGMgbm90aHJvdyBzaW5nbGUgbmV3IGFuZCBkZWxldGUgKHRha2UgYSBAYyBub3Rocm93IGFyZ3VtZW50LCByZXR1cm4KKyAqICAgIEBjIE5VTEwgb24gZXJyb3IpCisgKiAgLSBAYyBub3Rocm93IGFycmF5IG5ldyBhbmQgZGVsZXRlIChzYW1lKQorICoKKyAqICBQbGFjZW1lbnQgbmV3IGFuZCBkZWxldGUgc2lnbmF0dXJlcyAodGFrZSBhIG1lbW9yeSBhZGRyZXNzIGFyZ3VtZW50LAorICogIGRvZXMgbm90aGluZykgbWF5IG5vdCBiZSByZXBsYWNlZCBieSBhIHVzZXIncyBwcm9ncmFtLgorKi8KK3ZvaWQqIG9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCkgX0dMSUJDWFhfVEhST1cgKHN0ZDo6YmFkX2FsbG9jKQorICBfX2F0dHJpYnV0ZV9fKChfX2V4dGVybmFsbHlfdmlzaWJsZV9fKSk7Cit2b2lkKiBvcGVyYXRvciBuZXdbXShzdGQ6OnNpemVfdCkgX0dMSUJDWFhfVEhST1cgKHN0ZDo6YmFkX2FsbG9jKQorICBfX2F0dHJpYnV0ZV9fKChfX2V4dGVybmFsbHlfdmlzaWJsZV9fKSk7Cit2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKikgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgIF9fYXR0cmlidXRlX18oKF9fZXh0ZXJuYWxseV92aXNpYmxlX18pKTsKK3ZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCopIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICBfX2F0dHJpYnV0ZV9fKChfX2V4dGVybmFsbHlfdmlzaWJsZV9fKSk7Cit2b2lkKiBvcGVyYXRvciBuZXcoc3RkOjpzaXplX3QsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgIF9fYXR0cmlidXRlX18oKF9fZXh0ZXJuYWxseV92aXNpYmxlX18pKTsKK3ZvaWQqIG9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90LCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICBfX2F0dHJpYnV0ZV9fKChfX2V4dGVybmFsbHlfdmlzaWJsZV9fKSk7Cit2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgX19hdHRyaWJ1dGVfXygoX19leHRlcm5hbGx5X3Zpc2libGVfXykpOwordm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgX19hdHRyaWJ1dGVfXygoX19leHRlcm5hbGx5X3Zpc2libGVfXykpOworCisvLyBEZWZhdWx0IHBsYWNlbWVudCB2ZXJzaW9ucyBvZiBvcGVyYXRvciBuZXcuCitpbmxpbmUgdm9pZCogb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90LCB2b2lkKiBfX3ApIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAoreyByZXR1cm4gX19wOyB9CitpbmxpbmUgdm9pZCogb3BlcmF0b3IgbmV3W10oc3RkOjpzaXplX3QsIHZvaWQqIF9fcCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCit7IHJldHVybiBfX3A7IH0KKworLy8gRGVmYXVsdCBwbGFjZW1lbnQgdmVyc2lvbnMgb2Ygb3BlcmF0b3IgZGVsZXRlLgoraW5saW5lIHZvaWQgb3BlcmF0b3IgZGVsZXRlICAodm9pZCosIHZvaWQqKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CitpbmxpbmUgdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiwgdm9pZCopIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKy8vQH0KK30gLy8gZXh0ZXJuICJDKysiCisKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcG9wCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9udW1lcmljIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9udW1lcmljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NTY1NmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L251bWVyaWMKQEAgLTAsMCArMSw3NyBAQAorLy8gPG51bWVyaWM+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL251bWVyaWMKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfTlVNRVJJQworI2RlZmluZSBfR0xJQkNYWF9OVU1FUklDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX3R5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfbnVtZXJpYy5oPgorCisjaWZkZWYgX0dMSUJDWFhfUEFSQUxMRUwKKyMgaW5jbHVkZSA8cGFyYWxsZWwvbnVtZXJpYz4KKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBudW1lcmljcyBOdW1lcmljcworICoKKyAqIENvbXBvbmVudHMgZm9yIHBlcmZvcm1pbmcgbnVtZXJpYyBvcGVyYXRpb25zLiBJbmNsdWRlcyBzdXBwb3J0IGZvcgorICogZm9yIGNvbXBsZXggbnVtYmVyIHR5cGVzLCByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24sIG51bWVyaWMKKyAqIChuLWF0LWEtdGltZSkgYXJyYXlzLCBnZW5lcmFsaXplZCBudW1lcmljIGFsZ29yaXRobXMsIGFuZCBzcGVjaWFsCisgKiBtYXRoIGZ1bmN0aW9ucy4KKyAqLworCisjZW5kaWYgLyogX0dMSUJDWFhfTlVNRVJJQyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9vc3RyZWFtIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9vc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NjZiNTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L29zdHJlYW0KQEAgLTAsMCArMSw2MTEgQEAKKy8vIE91dHB1dCBzdHJlYW1zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL29zdHJlYW0KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy42LjIgIE91dHB1dCBzdHJlYW1zCisvLworCisjaWZuZGVmIF9HTElCQ1hYX09TVFJFQU0KKyNkZWZpbmUgX0dMSUJDWFhfT1NUUkVBTSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGlvcz4KKyNpbmNsdWRlIDxiaXRzL29zdHJlYW1faW5zZXJ0Lmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiAgVGVtcGxhdGUgY2xhc3MgYmFzaWNfb3N0cmVhbS4KKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBAdHBhcmFtIF9DaGFyVCAgVHlwZSBvZiBjaGFyYWN0ZXIgc3RyZWFtLgorICAgKiAgQHRwYXJhbSBfVHJhaXRzICBUcmFpdHMgZm9yIGNoYXJhY3RlciB0eXBlLCBkZWZhdWx0cyB0bworICAgKiAgICAgICAgICAgICAgICAgICBjaGFyX3RyYWl0czxfQ2hhclQ+LgorICAgKgorICAgKiAgVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIG91dHB1dCBzdHJlYW1zLiAgSXQgcHJvdmlkZXMgdGV4dAorICAgKiAgZm9ybWF0dGluZyBvZiBhbGwgYnVpbHRpbiB0eXBlcywgYW5kIGNvbW11bmljYXRlcyB3aXRoIGFueSBjbGFzcworICAgKiAgZGVyaXZlZCBmcm9tIGJhc2ljX3N0cmVhbWJ1ZiB0byBkbyB0aGUgYWN0dWFsIG91dHB1dC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIGJhc2ljX29zdHJlYW0gOiB2aXJ0dWFsIHB1YmxpYyBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlcyAoaW5oZXJpdGVkIGZyb20gYmFzaWNfaW9zKToKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJIAkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSAJCWludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSAJCXBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSAJCW9mZl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzCQkJIAkJdHJhaXRzX3R5cGU7CisKKyAgICAgIC8vIE5vbi1zdGFuZGFyZCBUeXBlczoKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4gCQlfX3N0cmVhbWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPgkJX19pb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CQlfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgbnVtX3B1dDxfQ2hhclQsIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiA+CisgICAgICAJCQkJCQkJX19udW1fcHV0X3R5cGU7CisgICAgICB0eXBlZGVmIGN0eXBlPF9DaGFyVD4JICAgICAgCQkJX19jdHlwZV90eXBlOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJhc2UgY29uc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgY3RvciBpcyBhbG1vc3QgbmV2ZXIgY2FsbGVkIGJ5IHRoZSB1c2VyIGRpcmVjdGx5LCByYXRoZXIgZnJvbQorICAgICAgICogIGRlcml2ZWQgY2xhc3NlcycgaW5pdGlhbGl6YXRpb24gbGlzdHMsIHdoaWNoIHBhc3MgYSBwb2ludGVyIHRvCisgICAgICAgKiAgdGhlaXIgb3duIHN0cmVhbSBidWZmZXIuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX29zdHJlYW0oX19zdHJlYW1idWZfdHlwZSogX19zYikKKyAgICAgIHsgdGhpcy0+aW5pdChfX3NiKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJhc2UgZGVzdHJ1Y3Rvci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBkb2VzIHZlcnkgbGl0dGxlIGFwYXJ0IGZyb20gcHJvdmlkaW5nIGEgdmlydHVhbCBiYXNlIGR0b3IuCisgICAgICAqLworICAgICAgdmlydHVhbAorICAgICAgfmJhc2ljX29zdHJlYW0oKSB7IH0KKworICAgICAgLy8vIFNhZmUgcHJlZml4L3N1ZmZpeCBvcGVyYXRpb25zLgorICAgICAgY2xhc3Mgc2VudHJ5OworICAgICAgZnJpZW5kIGNsYXNzIHNlbnRyeTsKKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnRlcmZhY2UgZm9yIG1hbmlwdWxhdG9ycy4KKyAgICAgICAqCisgICAgICAgKiAgTWFuaXB1bGF0b3JzIHN1Y2ggYXMgQGMgc3RkOjplbmRsIGFuZCBAYyBzdGQ6OmhleCB1c2UgdGhlc2UKKyAgICAgICAqICBmdW5jdGlvbnMgaW4gY29uc3RydWN0cyBsaWtlICJzdGQ6OmNvdXQgPDwgc3RkOjplbmRsIi4gIEZvciBtb3JlCisgICAgICAgKiAgaW5mb3JtYXRpb24sIHNlZSB0aGUgaW9tYW5pcCBoZWFkZXIuCisgICAgICAqLworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KF9fb3N0cmVhbV90eXBlJiAoKl9fcGYpKF9fb3N0cmVhbV90eXBlJikpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIERSIDYwLiBXaGF0IGlzIGEgZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uPworCS8vIFRoZSBpbnNlcnRlcnMgZm9yIG1hbmlwdWxhdG9ycyBhcmUgKm5vdCogZm9ybWF0dGVkIG91dHB1dCBmdW5jdGlvbnMuCisJcmV0dXJuIF9fcGYoKnRoaXMpOworICAgICAgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwoX19pb3NfdHlwZSYgKCpfX3BmKShfX2lvc190eXBlJikpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIERSIDYwLiBXaGF0IGlzIGEgZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uPworCS8vIFRoZSBpbnNlcnRlcnMgZm9yIG1hbmlwdWxhdG9ycyBhcmUgKm5vdCogZm9ybWF0dGVkIG91dHB1dCBmdW5jdGlvbnMuCisJX19wZigqdGhpcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwoaW9zX2Jhc2UmICgqX19wZikgKGlvc19iYXNlJikpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIERSIDYwLiBXaGF0IGlzIGEgZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uPworCS8vIFRoZSBpbnNlcnRlcnMgZm9yIG1hbmlwdWxhdG9ycyBhcmUgKm5vdCogZm9ybWF0dGVkIG91dHB1dCBmdW5jdGlvbnMuCisJX19wZigqdGhpcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAbmFtZSBJbnNlcnRlcnMKKyAgICAgICAqCisgICAgICAgKiAgQWxsIHRoZSBAYyBvcGVyYXRvcjw8IGZ1bmN0aW9ucyAoYWthIDxlbT5mb3JtYXR0ZWQgb3V0cHV0CisgICAgICAgKiAgZnVuY3Rpb25zPC9lbT4pIGhhdmUgc29tZSBjb21tb24gYmVoYXZpb3IuICBFYWNoIHN0YXJ0cyBieQorICAgICAgICogIGNvbnN0cnVjdGluZyBhIHRlbXBvcmFyeSBvYmplY3Qgb2YgdHlwZSBzdGQ6OmJhc2ljX29zdHJlYW06OnNlbnRyeS4KKyAgICAgICAqICBUaGlzIGNhbiBoYXZlIHNldmVyYWwgZWZmZWN0cywgY29uY2x1ZGluZyB3aXRoIHRoZSBzZXR0aW5nIG9mIGEKKyAgICAgICAqICBzdGF0dXMgZmxhZzsgc2VlIHRoZSBzZW50cnkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIHNlbnRyeSBzdGF0dXMgaXMgZ29vZCwgdGhlIGZ1bmN0aW9uIHRyaWVzIHRvIGdlbmVyYXRlCisgICAgICAgKiAgd2hhdGV2ZXIgZGF0YSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqICBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBpbnNlcnRpb24sIGlvc19iYXNlOjpiYWRiaXQKKyAgICAgICAqICB3aWxsIGJlIHR1cm5lZCBvbiBpbiB0aGUgc3RyZWFtJ3MgZXJyb3Igc3RhdGUgd2l0aG91dCBjYXVzaW5nIGFuCisgICAgICAgKiAgaW9zX2Jhc2U6OmZhaWx1cmUgdG8gYmUgdGhyb3duLiAgVGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiB3aWxsIHRoZW4KKyAgICAgICAqICBiZSByZXRocm93bi4KKyAgICAgICovCisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJbnRlZ2VyIGFyaXRobWV0aWMgaW5zZXJ0ZXJzCisgICAgICAgKiAgQHBhcmFtICBfX24gQSB2YXJpYWJsZSBvZiBidWlsdGluIGludGVncmFsIHR5cGUuCisgICAgICAgKiAgQHJldHVybiAgQGMgKnRoaXMgaWYgc3VjY2Vzc2Z1bAorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBmdW5jdGlvbnMgdXNlIHRoZSBzdHJlYW0ncyBjdXJyZW50IGxvY2FsZSAoc3BlY2lmaWNhbGx5LCB0aGUKKyAgICAgICAqICBAYyBudW1fZ2V0IGZhY2V0KSB0byBwZXJmb3JtIG51bWVyaWMgZm9ybWF0dGluZy4KKyAgICAgICovCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwobG9uZyBfX24pCisgICAgICB7IHJldHVybiBfTV9pbnNlcnQoX19uKTsgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBfX24pCisgICAgICB7IHJldHVybiBfTV9pbnNlcnQoX19uKTsgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwoYm9vbCBfX24pCisgICAgICB7IHJldHVybiBfTV9pbnNlcnQoX19uKTsgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwoc2hvcnQgX19uKTsKKworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KHVuc2lnbmVkIHNob3J0IF9fbikKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTE3LiBiYXNpY19vc3RyZWFtIHVzZXMgbm9uZXhpc3RlbnQgbnVtX3B1dCBtZW1iZXIgZnVuY3Rpb25zLgorCXJldHVybiBfTV9pbnNlcnQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oX19uKSk7CisgICAgICB9CisKKyAgICAgIF9fb3N0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I8PChpbnQgX19uKTsKKworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KHVuc2lnbmVkIGludCBfX24pCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDExNy4gYmFzaWNfb3N0cmVhbSB1c2VzIG5vbmV4aXN0ZW50IG51bV9wdXQgbWVtYmVyIGZ1bmN0aW9ucy4KKwlyZXR1cm4gX01faW5zZXJ0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KF9fbikpOworICAgICAgfQorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0xPTkdfTE9ORworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KGxvbmcgbG9uZyBfX24pCisgICAgICB7IHJldHVybiBfTV9pbnNlcnQoX19uKTsgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBsb25nIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2luc2VydChfX24pOyB9CisjZW5kaWYKKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGbG9hdGluZyBwb2ludCBhcml0aG1ldGljIGluc2VydGVycworICAgICAgICogIEBwYXJhbSAgX19mIEEgdmFyaWFibGUgb2YgYnVpbHRpbiBmbG9hdGluZyBwb2ludCB0eXBlLgorICAgICAgICogIEByZXR1cm4gIEBjICp0aGlzIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAqCisgICAgICAgKiAgVGhlc2UgZnVuY3Rpb25zIHVzZSB0aGUgc3RyZWFtJ3MgY3VycmVudCBsb2NhbGUgKHNwZWNpZmljYWxseSwgdGhlCisgICAgICAgKiAgQGMgbnVtX2dldCBmYWNldCkgdG8gcGVyZm9ybSBudW1lcmljIGZvcm1hdHRpbmcuCisgICAgICAqLworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KGRvdWJsZSBfX2YpCisgICAgICB7IHJldHVybiBfTV9pbnNlcnQoX19mKTsgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwoZmxvYXQgX19mKQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxMTcuIGJhc2ljX29zdHJlYW0gdXNlcyBub25leGlzdGVudCBudW1fcHV0IG1lbWJlciBmdW5jdGlvbnMuCisJcmV0dXJuIF9NX2luc2VydChzdGF0aWNfY2FzdDxkb3VibGU+KF9fZikpOworICAgICAgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwobG9uZyBkb3VibGUgX19mKQorICAgICAgeyByZXR1cm4gX01faW5zZXJ0KF9fZik7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQb2ludGVyIGFyaXRobWV0aWMgaW5zZXJ0ZXJzCisgICAgICAgKiAgQHBhcmFtICBfX3AgQSB2YXJpYWJsZSBvZiBwb2ludGVyIHR5cGUuCisgICAgICAgKiAgQHJldHVybiAgQGMgKnRoaXMgaWYgc3VjY2Vzc2Z1bAorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBmdW5jdGlvbnMgdXNlIHRoZSBzdHJlYW0ncyBjdXJyZW50IGxvY2FsZSAoc3BlY2lmaWNhbGx5LCB0aGUKKyAgICAgICAqICBAYyBudW1fZ2V0IGZhY2V0KSB0byBwZXJmb3JtIG51bWVyaWMgZm9ybWF0dGluZy4KKyAgICAgICovCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwoY29uc3Qgdm9pZCogX19wKQorICAgICAgeyByZXR1cm4gX01faW5zZXJ0KF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFeHRyYWN0aW5nIGZyb20gYW5vdGhlciBzdHJlYW1idWYuCisgICAgICAgKiAgQHBhcmFtICBfX3NiICBBIHBvaW50ZXIgdG8gYSBzdHJlYW1idWYKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBiZWhhdmVzIGxpa2Ugb25lIG9mIHRoZSBiYXNpYyBhcml0aG1ldGljIGV4dHJhY3RvcnMsCisgICAgICAgKiAgaW4gdGhhdCBpdCBhbHNvIGNvbnN0cnVjdHMgYSBzZW50cnkgb2JqZWN0IGFuZCBoYXMgdGhlIHNhbWUgZXJyb3IKKyAgICAgICAqICBoYW5kbGluZyBiZWhhdmlvci4KKyAgICAgICAqCisgICAgICAgKiAgSWYgQHAgX19zYiBpcyBOVUxMLCB0aGUgc3RyZWFtIHdpbGwgc2V0IGZhaWxiaXQgaW4gaXRzIGVycm9yIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqICBDaGFyYWN0ZXJzIGFyZSBleHRyYWN0ZWQgZnJvbSBAcCBfX3NiIGFuZCBpbnNlcnRlZCBpbnRvIEBjICp0aGlzCisgICAgICAgKiAgdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgb2NjdXJzOgorICAgICAgICoKKyAgICAgICAqICAtIHRoZSBpbnB1dCBzdHJlYW0gcmVhY2hlcyBlbmQtb2YtZmlsZSwKKyAgICAgICAqICAtIGluc2VydGlvbiBpbnRvIHRoZSBvdXRwdXQgc2VxdWVuY2UgZmFpbHMgKGluIHRoaXMgY2FzZSwgdGhlCisgICAgICAgKiAgICBjaGFyYWN0ZXIgdGhhdCB3b3VsZCBoYXZlIGJlZW4gaW5zZXJ0ZWQgaXMgbm90IGV4dHJhY3RlZCksIG9yCisgICAgICAgKiAgLSBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGdldHRpbmcgYSBjaGFyYWN0ZXIgZnJvbSBAcCBfX3NiLCB3aGljaAorICAgICAgICogICAgc2V0cyBmYWlsYml0IGluIHRoZSBlcnJvciBzdGF0ZQorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgZnVuY3Rpb24gaW5zZXJ0cyBubyBjaGFyYWN0ZXJzLCBmYWlsYml0IGlzIHNldC4KKyAgICAgICovCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwoX19zdHJlYW1idWZfdHlwZSogX19zYik7CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBuYW1lIFVuZm9ybWF0dGVkIE91dHB1dCBGdW5jdGlvbnMKKyAgICAgICAqCisgICAgICAgKiAgQWxsIHRoZSB1bmZvcm1hdHRlZCBvdXRwdXQgZnVuY3Rpb25zIGhhdmUgc29tZSBjb21tb24gYmVoYXZpb3IuCisgICAgICAgKiAgRWFjaCBzdGFydHMgYnkgY29uc3RydWN0aW5nIGEgdGVtcG9yYXJ5IG9iamVjdCBvZiB0eXBlCisgICAgICAgKiAgc3RkOjpiYXNpY19vc3RyZWFtOjpzZW50cnkuICBUaGlzIGhhcyBzZXZlcmFsIGVmZmVjdHMsIGNvbmNsdWRpbmcKKyAgICAgICAqICB3aXRoIHRoZSBzZXR0aW5nIG9mIGEgc3RhdHVzIGZsYWc7IHNlZSB0aGUgc2VudHJ5IGRvY3VtZW50YXRpb24KKyAgICAgICAqICBmb3IgbW9yZS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIHNlbnRyeSBzdGF0dXMgaXMgZ29vZCwgdGhlIGZ1bmN0aW9uIHRyaWVzIHRvIGdlbmVyYXRlCisgICAgICAgKiAgd2hhdGV2ZXIgZGF0YSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqICBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBpbnNlcnRpb24sIGlvc19iYXNlOjpiYWRiaXQKKyAgICAgICAqICB3aWxsIGJlIHR1cm5lZCBvbiBpbiB0aGUgc3RyZWFtJ3MgZXJyb3Igc3RhdGUuICBJZiBiYWRiaXQgaXMgb24gaW4KKyAgICAgICAqICB0aGUgc3RyZWFtJ3MgZXhjZXB0aW9ucyBtYXNrLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcmV0aHJvd24KKyAgICAgICAqICB3aXRob3V0IGNvbXBsZXRpbmcgaXRzIGFjdGlvbnMuCisgICAgICAqLworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNpbXBsZSBpbnNlcnRpb24uCisgICAgICAgKiAgQHBhcmFtICBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIFRyaWVzIHRvIGluc2VydCBAcCBfX2MuCisgICAgICAgKgorICAgICAgICogIEBub3RlICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBvdmVybG9hZGVkIG9uIHNpZ25lZCBjaGFyIGFuZAorICAgICAgICogICAgICAgICB1bnNpZ25lZCBjaGFyLgorICAgICAgKi8KKyAgICAgIF9fb3N0cmVhbV90eXBlJgorICAgICAgcHV0KGNoYXJfdHlwZSBfX2MpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvcmUgd3JpdGUgZnVuY3Rpb25hbGl0eSwgd2l0aG91dCBzZW50cnkuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBhcnJheSB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5zZXJ0LgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIF9NX3dyaXRlKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICAgIHsKKwljb25zdCBzdHJlYW1zaXplIF9fcHV0ID0gdGhpcy0+cmRidWYoKS0+c3B1dG4oX19zLCBfX24pOworCWlmIChfX3B1dCAhPSBfX24pCisJICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDaGFyYWN0ZXIgc3RyaW5nIGluc2VydGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIGFycmF5IHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgQ2hhcmFjdGVycyBhcmUgY29waWVkIGZyb20gQHAgX19zIGFuZCBpbnNlcnRlZCBpbnRvIHRoZSBzdHJlYW0gdW50aWwKKyAgICAgICAqICBvbmUgb2YgdGhlIGZvbGxvd2luZyBoYXBwZW5zOgorICAgICAgICoKKyAgICAgICAqICAtIEBwIF9fbiBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZAorICAgICAgICogIC0gaW5zZXJ0aW5nIGludG8gdGhlIG91dHB1dCBzZXF1ZW5jZSBmYWlscyAoaW4gdGhpcyBjYXNlLCBiYWRiaXQKKyAgICAgICAqICAgIHdpbGwgYmUgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZSkKKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG92ZXJsb2FkZWQgb24gc2lnbmVkIGNoYXIgYW5kCisgICAgICAgKiAgICAgICAgIHVuc2lnbmVkIGNoYXIuCisgICAgICAqLworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICB3cml0ZShjb25zdCBjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pOworICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN5bmNocm9uaXppbmcgdGhlIHN0cmVhbSBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgSWYgQGMgcmRidWYoKSBpcyBhIG51bGwgcG9pbnRlciwgY2hhbmdlcyBub3RoaW5nLgorICAgICAgICoKKyAgICAgICAqICBPdGhlcndpc2UsIGNhbGxzIEBjIHJkYnVmKCktPnB1YnN5bmMoKSwgYW5kIGlmIHRoYXQgcmV0dXJucyAtMSwKKyAgICAgICAqICBzZXRzIGJhZGJpdC4KKyAgICAgICovCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIGZsdXNoKCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgR2V0dGluZyB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbi4KKyAgICAgICAqICBAcmV0dXJuICBBIGZpbGUgcG9zaXRpb24gb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBJZiBAYyBmYWlsKCkgaXMgbm90IGZhbHNlLCByZXR1cm5zIEBjIHBvc190eXBlKC0xKSB0byBpbmRpY2F0ZQorICAgICAgICogIGZhaWx1cmUuICBPdGhlcndpc2UgcmV0dXJucyBAYyByZGJ1ZigpLT5wdWJzZWVrb2ZmKDAsY3VyLG91dCkuCisgICAgICAqLworICAgICAgcG9zX3R5cGUKKyAgICAgIHRlbGxwKCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2hhbmdpbmcgdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24uCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgQSBmaWxlIHBvc2l0aW9uIG9iamVjdC4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBJZiBAYyBmYWlsKCkgaXMgbm90IHRydWUsIGNhbGxzIEBjIHJkYnVmKCktPnB1YnNlZWtwb3MocG9zKS4gIElmCisgICAgICAgKiAgdGhhdCBmdW5jdGlvbiBmYWlscywgc2V0cyBmYWlsYml0LgorICAgICAgKi8KKyAgICAgIF9fb3N0cmVhbV90eXBlJgorICAgICAgc2Vla3AocG9zX3R5cGUpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENoYW5naW5nIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19vZmYgIEEgZmlsZSBvZmZzZXQgb2JqZWN0LgorICAgICAgICogIEBwYXJhbSAgX19kaXIgIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gc2Vlay4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBJZiBAYyBmYWlsKCkgaXMgbm90IHRydWUsIGNhbGxzIEBjIHJkYnVmKCktPnB1YnNlZWtvZmYob2ZmLGRpcikuCisgICAgICAgKiAgSWYgdGhhdCBmdW5jdGlvbiBmYWlscywgc2V0cyBmYWlsYml0LgorICAgICAgKi8KKyAgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIHNlZWtwKG9mZl90eXBlLCBpb3NfYmFzZTo6c2Vla2Rpcik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBiYXNpY19vc3RyZWFtKCkKKyAgICAgIHsgdGhpcy0+aW5pdCgwKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVUPgorCV9fb3N0cmVhbV90eXBlJgorCV9NX2luc2VydChfVmFsdWVUIF9fdik7CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgUGVyZm9ybXMgc2V0dXAgd29yayBmb3Igb3V0cHV0IHN0cmVhbXMuCisgICAqCisgICAqICBPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXJlIGNyZWF0ZWQgYmVmb3JlIGFsbCBvZiB0aGUgc3RhbmRhcmQKKyAgICogIGluc2VydGVycyBhcmUgcnVuLiAgSXQgaXMgcmVzcG9uc2libGUgZm9yIDxlbT5leGNlcHRpb24tc2FmZSBwcmVmaXggYW5kCisgICAqICBzdWZmaXggb3BlcmF0aW9uczwvZW0+LgorICAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c2VudHJ5CisgICAgeworICAgICAgLy8gRGF0YSBNZW1iZXJzLgorICAgICAgYm9vbCAJCQkJX01fb2s7CisgICAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIAlfTV9vczsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlIGNvbnN0cnVjdG9yIHBlcmZvcm1zIHByZXBhcmF0b3J5IHdvcmsuCisgICAgICAgKiAgQHBhcmFtICBfX29zICBUaGUgb3V0cHV0IHN0cmVhbSB0byBndWFyZC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIHN0cmVhbSBzdGF0ZSBpcyBnb29kIChAYSBfX29zLmdvb2QoKSBpcyB0cnVlKSwgdGhlbiBpZiB0aGUKKyAgICAgICAqICBzdHJlYW0gaXMgdGllZCB0byBhbm90aGVyIG91dHB1dCBzdHJlYW0sIEBjIGlzLnRpZSgpLT5mbHVzaCgpCisgICAgICAgKiAgaXMgY2FsbGVkIHRvIHN5bmNocm9uaXplIHRoZSBvdXRwdXQgc2VxdWVuY2VzLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgc3RyZWFtIHN0YXRlIGlzIHN0aWxsIGdvb2QsIHRoZW4gdGhlIHNlbnRyeSBzdGF0ZSBiZWNvbWVzCisgICAgICAgKiAgdHJ1ZSAoQGEgb2theSkuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHNlbnRyeShiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFBvc3NpYmx5IGZsdXNoZXMgdGhlIHN0cmVhbS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgQGMgaW9zX2Jhc2U6OnVuaXRidWYgaXMgc2V0IGluIEBjIG9zLmZsYWdzKCksIGFuZAorICAgICAgICogIEBjIHN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCkgaXMgdHJ1ZSwgdGhlIHNlbnRyeSBkZXN0cnVjdG9yIGNhbGxzCisgICAgICAgKiAgQGMgZmx1c2goKSBvbiB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgICovCisgICAgICB+c2VudHJ5KCkKKyAgICAgIHsKKwkvLyBYWFggTVQKKwlpZiAoYm9vbChfTV9vcy5mbGFncygpICYgaW9zX2Jhc2U6OnVuaXRidWYpICYmICF1bmNhdWdodF9leGNlcHRpb24oKSkKKwkgIHsKKwkgICAgLy8gQ2FuJ3QgY2FsbCBmbHVzaCBkaXJlY3RseSBvciBlbHNlIHdpbGwgZ2V0IGludG8gcmVjdXJzaXZlIGxvY2suCisJICAgIGlmIChfTV9vcy5yZGJ1ZigpICYmIF9NX29zLnJkYnVmKCktPnB1YnN5bmMoKSA9PSAtMSkKKwkgICAgICBfTV9vcy5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBRdWljayBzdGF0dXMgY2hlY2tpbmcuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHNlbnRyeSBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGVhc2Ugb2YgdXNlLCBzZW50cmllcyBtYXkgYmUgY29udmVydGVkIHRvIGJvb2xlYW5zLiAgVGhlCisgICAgICAgKiAgcmV0dXJuIHZhbHVlIGlzIHRoYXQgb2YgdGhlIHNlbnRyeSBzdGF0ZSAodHJ1ZSA9PSBva2F5KS4KKyAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgZXhwbGljaXQKKyNlbmRpZgorICAgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9vazsgfQorICAgIH07CisKKyAgLy9AeworICAvKioKKyAgICogIEBicmllZiAgQ2hhcmFjdGVyIGluc2VydGVycworICAgKiAgQHBhcmFtICBfX291dCAgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSAgX19jICBBIGNoYXJhY3Rlci4KKyAgICogIEByZXR1cm4gIG91dAorICAgKgorICAgKiAgQmVoYXZlcyBsaWtlIG9uZSBvZiB0aGUgZm9ybWF0dGVkIGFyaXRobWV0aWMgaW5zZXJ0ZXJzIGRlc2NyaWJlZCBpbgorICAgKiAgc3RkOjpiYXNpY19vc3RyZWFtLiAgQWZ0ZXIgY29uc3RydWN0aW5nIGEgc2VudHJ5IG9iamVjdCB3aXRoIGdvb2QKKyAgICogIHN0YXR1cywgdGhpcyBmdW5jdGlvbiBpbnNlcnRzIGEgc2luZ2xlIGNoYXJhY3RlciBhbmQgYW55IHJlcXVpcmVkCisgICAqICBwYWRkaW5nIChhcyBkZXRlcm1pbmVkIGJ5IFsyMi4yLjIuMi4yXSkuICBAYyBfX291dC53aWR0aCgwKSBpcyB0aGVuCisgICAqICBjYWxsZWQuCisgICAqCisgICAqICBJZiBAcCBfX2MgaXMgb2YgdHlwZSBAYyBjaGFyIGFuZCB0aGUgY2hhcmFjdGVyIHR5cGUgb2YgdGhlIHN0cmVhbSBpcyBub3QKKyAgICogIEBjIGNoYXIsIHRoZSBjaGFyYWN0ZXIgaXMgd2lkZW5lZCBiZWZvcmUgaW5zZXJ0aW9uLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vdXQsIF9DaGFyVCBfX2MpCisgICAgeyByZXR1cm4gX19vc3RyZWFtX2luc2VydChfX291dCwgJl9fYywgMSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vdXQsIGNoYXIgX19jKQorICAgIHsgcmV0dXJuIChfX291dCA8PCBfX291dC53aWRlbihfX2MpKTsgfQorCisgIC8vIFNwZWNpYWxpemF0aW9uCisgIHRlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vdXQsIGNoYXIgX19jKQorICAgIHsgcmV0dXJuIF9fb3N0cmVhbV9pbnNlcnQoX19vdXQsICZfX2MsIDEpOyB9CisKKyAgLy8gU2lnbmVkIGFuZCB1bnNpZ25lZAorICB0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vdXQsIHNpZ25lZCBjaGFyIF9fYykKKyAgICB7IHJldHVybiAoX19vdXQgPDwgc3RhdGljX2Nhc3Q8Y2hhcj4oX19jKSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vdXQsIHVuc2lnbmVkIGNoYXIgX19jKQorICAgIHsgcmV0dXJuIChfX291dCA8PCBzdGF0aWNfY2FzdDxjaGFyPihfX2MpKTsgfQorICAvL0B9CisKKyAgLy9AeworICAvKioKKyAgICogIEBicmllZiAgU3RyaW5nIGluc2VydGVycworICAgKiAgQHBhcmFtICBfX291dCAgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSAgX19zICBBIGNoYXJhY3RlciBzdHJpbmcuCisgICAqICBAcmV0dXJuICBvdXQKKyAgICogIEBwcmUgIEBwIF9fcyBtdXN0IGJlIGEgbm9uLU5VTEwgcG9pbnRlcgorICAgKgorICAgKiAgQmVoYXZlcyBsaWtlIG9uZSBvZiB0aGUgZm9ybWF0dGVkIGFyaXRobWV0aWMgaW5zZXJ0ZXJzIGRlc2NyaWJlZCBpbgorICAgKiAgc3RkOjpiYXNpY19vc3RyZWFtLiAgQWZ0ZXIgY29uc3RydWN0aW5nIGEgc2VudHJ5IG9iamVjdCB3aXRoIGdvb2QKKyAgICogIHN0YXR1cywgdGhpcyBmdW5jdGlvbiBpbnNlcnRzIEBjIHRyYWl0czo6bGVuZ3RoKF9fcykgY2hhcmFjdGVycyBzdGFydGluZworICAgKiAgYXQgQHAgX19zLCB3aWRlbmVkIGlmIG5lY2Vzc2FyeSwgZm9sbG93ZWQgYnkgYW55IHJlcXVpcmVkIHBhZGRpbmcgKGFzCisgICAqICBkZXRlcm1pbmVkIGJ5IFsyMi4yLjIuMi4yXSkuICBAYyBfX291dC53aWR0aCgwKSBpcyB0aGVuIGNhbGxlZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCBjb25zdCBfQ2hhclQqIF9fcykKKyAgICB7CisgICAgICBpZiAoIV9fcykKKwlfX291dC5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKyAgICAgIGVsc2UKKwlfX29zdHJlYW1faW5zZXJ0KF9fb3V0LCBfX3MsCisJCQkgc3RhdGljX2Nhc3Q8c3RyZWFtc2l6ZT4oX1RyYWl0czo6bGVuZ3RoKF9fcykpKTsKKyAgICAgIHJldHVybiBfX291dDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAmCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCBjb25zdCBjaGFyKiBfX3MpOworCisgIC8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb25zCisgIHRlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX291dCwgY29uc3QgY2hhciogX19zKQorICAgIHsKKyAgICAgIGlmICghX19zKQorCV9fb3V0LnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworICAgICAgZWxzZQorCV9fb3N0cmVhbV9pbnNlcnQoX19vdXQsIF9fcywKKwkJCSBzdGF0aWNfY2FzdDxzdHJlYW1zaXplPihfVHJhaXRzOjpsZW5ndGgoX19zKSkpOworICAgICAgcmV0dXJuIF9fb3V0OworICAgIH0KKworICAvLyBTaWduZWQgYW5kIHVuc2lnbmVkCisgIHRlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX291dCwgY29uc3Qgc2lnbmVkIGNoYXIqIF9fcykKKyAgICB7IHJldHVybiAoX19vdXQgPDwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oX19zKSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+ICYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX3MpCisgICAgeyByZXR1cm4gKF9fb3V0IDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KF9fcykpOyB9CisgIC8vQH0KKworICAvLyBTdGFuZGFyZCBiYXNpY19vc3RyZWFtIG1hbmlwdWxhdG9ycworCisgIC8qKgorICAgKiAgQGJyaWVmICBXcml0ZSBhIG5ld2xpbmUgYW5kIGZsdXNoIHRoZSBzdHJlYW0uCisgICAqCisgICAqICBUaGlzIG1hbmlwdWxhdG9yIGlzIG9mdGVuIG1pc3Rha2VubHkgdXNlZCB3aGVuIGEgc2ltcGxlIG5ld2xpbmUgaXMKKyAgICogIGRlc2lyZWQsIGxlYWRpbmcgdG8gcG9vciBidWZmZXJpbmcgcGVyZm9ybWFuY2UuICBTZWUKKyAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTFjaDI1czAyLmh0bWwKKyAgICogIGZvciBtb3JlIG9uIHRoaXMgc3ViamVjdC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgZW5kbChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MpCisgICAgeyByZXR1cm4gZmx1c2goX19vcy5wdXQoX19vcy53aWRlbignXG4nKSkpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFdyaXRlIGEgbnVsbCBjaGFyYWN0ZXIgaW50byB0aGUgb3V0cHV0IHNlcXVlbmNlLgorICAgKgorICAgKiAgPGVtPk51bGwgY2hhcmFjdGVyPC9lbT4gaXMgQGMgQ2hhclQoKSBieSBkZWZpbml0aW9uLiAgRm9yIENoYXJUCisgICAqICBvZiBAYyBjaGFyLCB0aGlzIGNvcnJlY3RseSB3cml0ZXMgdGhlIEFTQ0lJIEBjIE5VTCBjaGFyYWN0ZXIKKyAgICogIHN0cmluZyB0ZXJtaW5hdG9yLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBlbmRzKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcykKKyAgICB7IHJldHVybiBfX29zLnB1dChfQ2hhclQoKSk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgRmx1c2hlcyB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICoKKyAgICogIFRoaXMgbWFuaXB1bGF0b3Igc2ltcGx5IGNhbGxzIHRoZSBzdHJlYW0ncyBAYyBmbHVzaCgpIG1lbWJlciBmdW5jdGlvbi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgZmx1c2goYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zKQorICAgIHsgcmV0dXJuIF9fb3MuZmx1c2goKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvKioKKyAgICogIEBicmllZiAgR2VuZXJpYyBpbnNlcnRlciBmb3IgcnZhbHVlIHN0cmVhbQorICAgKiAgQHBhcmFtICBfX29zICBBbiBpbnB1dCBzdHJlYW0uCisgICAqICBAcGFyYW0gIF9feCAgQSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBiZWluZyBpbnNlcnRlZC4KKyAgICogIEByZXR1cm4gIG9zCisgICAqCisgICAqICBUaGlzIGlzIGp1c3QgYSBmb3J3YXJkaW5nIGZ1bmN0aW9uIHRvIGFsbG93IGluc2VydGlvbiB0bworICAgKiAgcnZhbHVlIHN0cmVhbXMgc2luY2UgdGhleSB3b24ndCBiaW5kIHRvIHRoZSBpbnNlcnRlciBmdW5jdGlvbnMKKyAgICogIHRoYXQgdGFrZSBhbiBsdmFsdWUgcmVmZXJlbmNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiYgX19vcywgY29uc3QgX1RwJiBfX3gpCisgICAgeyByZXR1cm4gKF9fb3MgPDwgX194KTsgfQorI2VuZGlmIC8vIEMrKzExCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNpbmNsdWRlIDxiaXRzL29zdHJlYW0udGNjPgorCisjZW5kaWYJLyogX0dMSUJDWFhfT1NUUkVBTSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9hbGdvLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2FsZ28uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGMyNGU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9hbGdvLmgKQEAgLTAsMCArMSwyMzYzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvYWxnby5oCisgKiAgQGJyaWVmIFBhcmFsbGVsIFNUTCBmdW5jdGlvbiBjYWxscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGxfYWxnby5oIGhlYWRlci4KKyAqCisgKiAgVGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGhlcmUgbWFpbmx5IGRvIGNhc2Ugc3dpdGNoZXMgYW5kCisgKiAgY2FsbCB0aGUgYWN0dWFsIHBhcmFsbGVsaXplZCB2ZXJzaW9ucyBpbiBvdGhlciBmaWxlcy4KKyAqICBJbmxpbmluZyBwb2xpY3k6IEZ1bmN0aW9ucyB0aGF0IGJhc2ljYWxseSBvbmx5IGNvbnRhaW4gb25lIGZ1bmN0aW9uIGNhbGwsCisgKiAgYXJlIGRlY2xhcmVkIGlubGluZS4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIgYW5kIEZlbGl4IFB1dHplLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX0FMR09fSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9BTEdPX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvYWxnb3JpdGhtZndkLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNlLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvc29ydC5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3dvcmtzdGVhbGluZy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3Bhcl9sb29wLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvb21wX2xvb3AuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9vbXBfbG9vcF9zdGF0aWMuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9mb3JfZWFjaF9zZWxlY3RvcnMuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9mb3JfZWFjaC5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2ZpbmQuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9maW5kX3NlbGVjdG9ycy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3NlYXJjaC5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3JhbmRvbV9zaHVmZmxlLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvcGFydGl0aW9uLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvbWVyZ2UuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC91bmlxdWVfY29weS5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3NldF9vcGVyYXRpb25zLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcGFyYWxsZWwKK3sKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9GdW5jdGlvbj4KKyAgICBpbmxpbmUgX0Z1bmN0aW9uCisgICAgZm9yX2VhY2goX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX0Z1bmN0aW9uIF9fZiwgCisgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpmb3JfZWFjaChfX2JlZ2luLCBfX2VuZCwgX19mKTsgfQorCisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9GdW5jdGlvbiwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnPgorICAgIGlubGluZSBfRnVuY3Rpb24KKyAgICBfX2Zvcl9lYWNoX3N3aXRjaChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfRnVuY3Rpb24gX19mLCAKKyAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yVGFnKQorICAgIHsgcmV0dXJuIGZvcl9lYWNoKF9fYmVnaW4sIF9fZW5kLCBfX2YsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0Z1bmN0aW9uPgorICAgIF9GdW5jdGlvbgorICAgIF9fZm9yX2VhY2hfc3dpdGNoKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwgCisgICAgICAgICAgICAgICAgICAgIF9GdW5jdGlvbiBfX2YsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCAKKyAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZworICAgICAgICAgICAgICAgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF9iYWxhbmNlZCkKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZCAtIF9fYmVnaW4pCisgICAgICAgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5mb3JfZWFjaF9taW5pbWFsX24KKyAgICAgICAgICAgICYmIF9fZ251X3BhcmFsbGVsOjpfX2lzX3BhcmFsbGVsKF9fcGFyYWxsZWxpc21fdGFnKSkpCisgICAgICAgIHsKKyAgICAgICAgICBib29sIF9fZHVtbXk7CisgICAgX19nbnVfcGFyYWxsZWw6Ol9fZm9yX2VhY2hfc2VsZWN0b3I8X1JBSXRlcj4gX19mdW5jdGlvbmFsaXR5OworCisgICAgICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjoKKyAgICAgICAgICAgIF9fZm9yX2VhY2hfdGVtcGxhdGVfcmFuZG9tX2FjY2VzcygKKyAgICAgICAgICAgICAgX19iZWdpbiwgX19lbmQsIF9fZiwgX19mdW5jdGlvbmFsaXR5LAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X0R1bW15UmVkdWN0KCksIHRydWUsIF9fZHVtbXksIC0xLAorICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZvcl9lYWNoKF9fYmVnaW4sIF9fZW5kLCBfX2YsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9GdW5jdGlvbj4KKyAgICBpbmxpbmUgX0Z1bmN0aW9uCisgICAgZm9yX2VhY2goX0l0ZXJhdG9yIF9fYmVnaW4sIF9JdGVyYXRvciBfX2VuZCwgX0Z1bmN0aW9uIF9fZiwgCisgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj4gX0l0ZXJhdG9yVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3JUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fZm9yX2VhY2hfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX2YsIF9JdGVyYXRvckNhdGVnb3J5KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0Z1bmN0aW9uPgorICAgIGlubGluZSBfRnVuY3Rpb24KKyAgICBmb3JfZWFjaChfSXRlcmF0b3IgX19iZWdpbiwgX0l0ZXJhdG9yIF9fZW5kLCBfRnVuY3Rpb24gX19mKSAKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj4gX0l0ZXJhdG9yVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3JUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fZm9yX2VhY2hfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX2YsIF9JdGVyYXRvckNhdGVnb3J5KCkpOworICAgIH0KKworCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9JSXRlcgorICAgIGZpbmQoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgY29uc3QgX1RwJiBfX3ZhbCwgCisgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmZpbmQoX19iZWdpbiwgX19lbmQsIF9fdmFsKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgX0lJdGVyCisgICAgX19maW5kX3N3aXRjaChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBjb25zdCBfVHAmIF9fdmFsLAorICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6ZmluZChfX2JlZ2luLCBfX2VuZCwgX192YWwpOyB9CisKKyAgLy8gUGFyYWxsZWwgZmluZCBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9SQUl0ZXIKKyAgICBfX2ZpbmRfc3dpdGNoKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTih0cnVlKSkKKyAgICAgICAgeworCSAgc3RkOjpiaW5kZXIybmQ8X19nbnVfcGFyYWxsZWw6Ol9FcXVhbFRvPF9WYWx1ZVR5cGUsIGNvbnN0IF9UcCY+ID4KKyAgICAgICAgICAgIF9fY29tcChfX2dudV9wYXJhbGxlbDo6X0VxdWFsVG88X1ZhbHVlVHlwZSwgY29uc3QgX1RwJj4oKSwgX192YWwpOworICAgICAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6X19maW5kX3RlbXBsYXRlKAorICAgICAgICAgICAgICAgICAgIF9fYmVnaW4sIF9fZW5kLCBfX2JlZ2luLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fZmluZF9pZl9zZWxlY3RvcigpKS5maXJzdDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmZpbmQoX19iZWdpbiwgX19lbmQsIF9fdmFsKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0lJdGVyCisgICAgZmluZChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBjb25zdCBfVHAmIF9fdmFsKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfSXRlcmF0b3JUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICByZXR1cm4gX19maW5kX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX192YWwsIF9JdGVyYXRvckNhdGVnb3J5KCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0lJdGVyCisgICAgZmluZF9pZihfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfUHJlZGljYXRlIF9fcHJlZCwgCisgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmZpbmRfaWYoX19iZWdpbiwgX19lbmQsIF9fcHJlZCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnPgorICAgIGlubGluZSBfSUl0ZXIKKyAgICBfX2ZpbmRfaWZfc3dpdGNoKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9QcmVkaWNhdGUgX19wcmVkLCAKKyAgICAgICAgICAgICAgICAgICBfSXRlcmF0b3JUYWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmZpbmRfaWYoX19iZWdpbiwgX19lbmQsIF9fcHJlZCk7IH0KKworICAvLyBQYXJhbGxlbCBmaW5kX2lmIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9SQUl0ZXIKKyAgICBfX2ZpbmRfaWZfc3dpdGNoKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwgCisgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04odHJ1ZSkpCisgICAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6X19maW5kX3RlbXBsYXRlKF9fYmVnaW4sIF9fZW5kLCBfX2JlZ2luLCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZpbmRfaWZfc2VsZWN0b3IoKSkuZmlyc3Q7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfR0xJQkNYWF9TVERfQTo6ZmluZF9pZihfX2JlZ2luLCBfX2VuZCwgX19wcmVkKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIF9JSXRlcgorICAgIGZpbmRfaWYoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+IF9JdGVyYXRvclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX2ZpbmRfaWZfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQsIF9JdGVyYXRvckNhdGVnb3J5KCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX0ZJdGVyYXRvcj4KKyAgICBpbmxpbmUgX0lJdGVyCisgICAgZmluZF9maXJzdF9vZihfSUl0ZXIgX19iZWdpbjEsIF9JSXRlciBfX2VuZDEsIAorICAgICAgICAgICAgICAgICAgX0ZJdGVyYXRvciBfX2JlZ2luMiwgX0ZJdGVyYXRvciBfX2VuZDIsIAorICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpmaW5kX2ZpcnN0X29mKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIpOworICAgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRkl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGlubGluZSBfSUl0ZXIKKyAgICBmaW5kX2ZpcnN0X29mKF9JSXRlciBfX2JlZ2luMSwgX0lJdGVyIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgIF9GSXRlcmF0b3IgX19iZWdpbjIsIF9GSXRlcmF0b3IgX19lbmQyLAorICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXAsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmZpbmRfZmlyc3Rfb2YoCisgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19jb21wKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIHR5cGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRkl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlcmF0b3JUYWcxLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWcyPgorICAgIGlubGluZSBfSUl0ZXIKKyAgICBfX2ZpbmRfZmlyc3Rfb2Zfc3dpdGNoKF9JSXRlciBfX2JlZ2luMSwgX0lJdGVyIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfRkl0ZXJhdG9yIF9fYmVnaW4yLCBfRkl0ZXJhdG9yIF9fZW5kMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yVGFnMSwgX0l0ZXJhdG9yVGFnMikKKyAgICB7IHJldHVybiBmaW5kX2ZpcnN0X29mKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgLy8gUGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfRkl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWc+CisgICAgaW5saW5lIF9SQUl0ZXIKKyAgICBfX2ZpbmRfZmlyc3Rfb2Zfc3dpdGNoKF9SQUl0ZXIgX19iZWdpbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlciBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0ZJdGVyYXRvciBfX2JlZ2luMiwgX0ZJdGVyYXRvciBfX2VuZDIsIAorICAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yVGFnKQorICAgIHsKKyAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgIF9fZmluZF90ZW1wbGF0ZShfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMSwgX19jb21wLAorICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX2ZpbmRfZmlyc3Rfb2Zfc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICA8X0ZJdGVyYXRvcj4oX19iZWdpbjIsIF9fZW5kMikpLmZpcnN0OworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciB0eXBlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX0ZJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMj4KKyAgICBpbmxpbmUgX0lJdGVyCisgICAgX19maW5kX2ZpcnN0X29mX3N3aXRjaChfSUl0ZXIgX19iZWdpbjEsIF9JSXRlciBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0ZJdGVyYXRvciBfX2JlZ2luMiwgX0ZJdGVyYXRvciBfX2VuZDIsIAorICAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wLCBfSXRlcmF0b3JUYWcxLCBfSXRlcmF0b3JUYWcyKQorICAgIHsgcmV0dXJuIGZpbmRfZmlyc3Rfb2YoX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19jb21wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRkl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGlubGluZSBfSUl0ZXIKKyAgICBmaW5kX2ZpcnN0X29mKF9JSXRlciBfX2JlZ2luMSwgX0lJdGVyIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgIF9GSXRlcmF0b3IgX19iZWdpbjIsIF9GSXRlcmF0b3IgX19lbmQyLCAKKyAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfSUl0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+IF9GSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSUl0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9GSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0ZJdGVyYXRvckNhdGVnb3J5OworCisgICAgICByZXR1cm4gX19maW5kX2ZpcnN0X29mX3N3aXRjaChfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lJdGVyYXRvckNhdGVnb3J5KCksIF9GSXRlcmF0b3JDYXRlZ29yeSgpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9GSXRlcmF0b3I+CisgICAgaW5saW5lIF9JSXRlcgorICAgIGZpbmRfZmlyc3Rfb2YoX0lJdGVyIF9fYmVnaW4xLCBfSUl0ZXIgX19lbmQxLCAKKyAgICAgICAgICAgICAgICAgIF9GSXRlcmF0b3IgX19iZWdpbjIsIF9GSXRlcmF0b3IgX19lbmQyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfSUl0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+IF9GSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzOjp2YWx1ZV90eXBlIF9JVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRkl0ZXJUcmFpdHM6OnZhbHVlX3R5cGUgX0ZWYWx1ZVR5cGU7CisKKyAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6ZmluZF9maXJzdF9vZihfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfRXF1YWxUbzxfSVZhbHVlVHlwZSwgX0ZWYWx1ZVR5cGU+KCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICB1bmlxdWVfY29weShfSUl0ZXIgX19iZWdpbjEsIF9JSXRlciBfX2VuZDEsIF9PdXRwdXRJdGVyYXRvciBfX291dCwKKyAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnVuaXF1ZV9jb3B5KF9fYmVnaW4xLCBfX2VuZDEsIF9fb3V0KTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHVuaXF1ZV9jb3B5KF9JSXRlciBfX2JlZ2luMSwgX0lJdGVyIF9fZW5kMSwgX091dHB1dEl0ZXJhdG9yIF9fb3V0LAorICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnVuaXF1ZV9jb3B5KF9fYmVnaW4xLCBfX2VuZDEsIF9fb3V0LCBfX3ByZWQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgX191bmlxdWVfY29weV9zd2l0Y2goX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2xhc3QsIAorICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQsIF9QcmVkaWNhdGUgX19wcmVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yVGFnMSwgX0l0ZXJhdG9yVGFnMikKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6dW5pcXVlX2NvcHkoX19iZWdpbiwgX19sYXN0LCBfX291dCwgX19wcmVkKTsgfQorCisgIC8vIFBhcmFsbGVsIHVuaXF1ZV9jb3B5IGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBSYW5kb21BY2Nlc3NPdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBSYW5kb21BY2Nlc3NPdXRwdXRJdGVyYXRvcgorICAgIF9fdW5pcXVlX2NvcHlfc3dpdGNoKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2xhc3QsIAorICAgICAgICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NPdXRwdXRJdGVyYXRvciBfX291dCwgX1ByZWRpY2F0ZSBfX3ByZWQsIAorICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19sYXN0IC0gX19iZWdpbikKKyAgICAgICAgICAgID4gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkudW5pcXVlX2NvcHlfbWluaW1hbF9uKSkKKyAgICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjpfX3BhcmFsbGVsX3VuaXF1ZV9jb3B5KAorICAgICAgICAgICAgICAgICBfX2JlZ2luLCBfX2xhc3QsIF9fb3V0LCBfX3ByZWQpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnVuaXF1ZV9jb3B5KF9fYmVnaW4sIF9fbGFzdCwgX19vdXQsIF9fcHJlZCk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHVuaXF1ZV9jb3B5KF9JSXRlciBfX2JlZ2luMSwgX0lJdGVyIF9fZW5kMSwgX091dHB1dEl0ZXJhdG9yIF9fb3V0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfSUl0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9PdXRwdXRJdGVyYXRvcj4gX09JdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisKKyAgICAgIHJldHVybiBfX3VuaXF1ZV9jb3B5X3N3aXRjaCgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fb3V0LCBlcXVhbF90bzxfVmFsdWVUeXBlPigpLAorICAgICAgICAgICAgICAgX0lJdGVyYXRvckNhdGVnb3J5KCksIF9PSXRlckNhdGVnb3J5KCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICB1bmlxdWVfY29weShfSUl0ZXIgX19iZWdpbjEsIF9JSXRlciBfX2VuZDEsIF9PdXRwdXRJdGVyYXRvciBfX291dCwKKyAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX0lJdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSUl0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisKKyAgICAgIHJldHVybiBfX3VuaXF1ZV9jb3B5X3N3aXRjaCgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fb3V0LCBfX3ByZWQsCisgICAgICAgICAgICAgICBfSUl0ZXJhdG9yQ2F0ZWdvcnkoKSwgX09JdGVyQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfdW5pb24oX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLAorICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2V0X3VuaW9uKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19vdXQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF91bmlvbihfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgX0lJdGVyMiBfX2JlZ2luMiwgX0lJdGVyMiBfX2VuZDIsCisgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX291dCwgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2V0X3VuaW9uKF9fYmVnaW4xLCBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luMiwgX19lbmQyLCBfX291dCwgX19wcmVkKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWcxLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlcmF0b3JUYWcyLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWczPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3NldF91bmlvbl9zd2l0Y2goCisgICAgICBfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwgX0lJdGVyMiBfX2JlZ2luMiwgX0lJdGVyMiBfX2VuZDIsCisgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9QcmVkaWNhdGUgX19wcmVkLAorICAgICAgX0l0ZXJhdG9yVGFnMSwgX0l0ZXJhdG9yVGFnMiwgX0l0ZXJhdG9yVGFnMykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2V0X3VuaW9uKF9fYmVnaW4xLCBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luMiwgX19lbmQyLCBfX3Jlc3VsdCwgX19wcmVkKTsgfQorCisgIC8vIFBhcmFsbGVsIHNldF91bmlvbiBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0X1JBSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT3V0cHV0X1JBSXRlcgorICAgIF9fc2V0X3VuaW9uX3N3aXRjaChfUkFJdGVyMSBfX2JlZ2luMSwgX1JBSXRlcjEgX19lbmQxLCAKKyAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIyIF9fYmVnaW4yLCBfUkFJdGVyMiBfX2VuZDIsIAorICAgICAgICAgICAgICAgICAgICAgX091dHB1dF9SQUl0ZXIgX19yZXN1bHQsIF9QcmVkaWNhdGUgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCAKKyAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kMSAtIF9fYmVnaW4xKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuc2V0X3VuaW9uX21pbmltYWxfbgorICAgICAgICAgICAgfHwgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZDIgLSBfX2JlZ2luMikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnNldF91bmlvbl9taW5pbWFsX24pKQorICAgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6Ol9fcGFyYWxsZWxfc2V0X3VuaW9uKAorICAgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3Jlc3VsdCwgX19wcmVkKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpzZXRfdW5pb24oX19iZWdpbjEsIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbjIsIF9fZW5kMiwgX19yZXN1bHQsIF9fcHJlZCk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IgCisgICAgc2V0X3VuaW9uKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwgX091dHB1dEl0ZXJhdG9yIF9fb3V0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMT4gX0lJdGVyVHJhaXRzMTsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX0lJdGVyVHJhaXRzMjsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfT0l0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czE6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMjo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfT0l0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9PSXRlckNhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMxOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMyOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworCisgICAgICByZXR1cm4gX19zZXRfdW5pb25fc3dpdGNoKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19vdXQsCisgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X0xlc3M8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPigpLAorICAgICAgICAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxKCksIF9JSXRlckNhdGVnb3J5MigpLCBfT0l0ZXJDYXRlZ29yeSgpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvciAKKyAgICBzZXRfdW5pb24oX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLAorICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQsIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMT4gX0lJdGVyVHJhaXRzMTsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX0lJdGVyVHJhaXRzMjsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfT0l0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czE6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMjo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfT0l0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9PSXRlckNhdGVnb3J5OworCisgICAgICByZXR1cm4gX19zZXRfdW5pb25fc3dpdGNoKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19vdXQsIF9fcHJlZCwKKyAgICAgICAgICAgICAgIF9JSXRlckNhdGVnb3J5MSgpLCBfSUl0ZXJDYXRlZ29yeTIoKSwgX09JdGVyQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2suCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X2ludGVyc2VjdGlvbihfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0LCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNldF9pbnRlcnNlY3Rpb24oX19iZWdpbjEsIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luMiwgX19lbmQyLCBfX291dCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9pbnRlcnNlY3Rpb24oX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX291dCwgX1ByZWRpY2F0ZSBfX3ByZWQsIAorICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpzZXRfaW50ZXJzZWN0aW9uKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19vdXQsIF9fcHJlZCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMz4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yIAorICAgIF9fc2V0X2ludGVyc2VjdGlvbl9zd2l0Y2goX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSXRlcmF0b3JUYWcxLCBfSXRlcmF0b3JUYWcyLCBfSXRlcmF0b3JUYWczKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpzZXRfaW50ZXJzZWN0aW9uKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZW5kMiwgX19yZXN1bHQsIF9fcHJlZCk7IH0KKworICAvLyBQYXJhbGxlbCBzZXRfaW50ZXJzZWN0aW9uIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRfUkFJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PdXRwdXRfUkFJdGVyCisgICAgX19zZXRfaW50ZXJzZWN0aW9uX3N3aXRjaChfUkFJdGVyMSBfX2JlZ2luMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjIgX19iZWdpbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjIgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRfUkFJdGVyIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kMSAtIF9fYmVnaW4xKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuc2V0X3VuaW9uX21pbmltYWxfbgorICAgICAgICAgICAgfHwgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZDIgLSBfX2JlZ2luMikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnNldF91bmlvbl9taW5pbWFsX24pKQorICAgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6Ol9fcGFyYWxsZWxfc2V0X2ludGVyc2VjdGlvbigKKyAgICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19yZXN1bHQsIF9fcHJlZCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2V0X2ludGVyc2VjdGlvbigKKyAgICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19yZXN1bHQsIF9fcHJlZCk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IgCisgICAgc2V0X2ludGVyc2VjdGlvbihfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwgCisgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwgCisgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfSUl0ZXJUcmFpdHMxOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIyPiBfSUl0ZXJUcmFpdHMyOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMTo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMyOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czE6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czI6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTI7CisKKyAgICAgIHJldHVybiBfX3NldF9pbnRlcnNlY3Rpb25fc3dpdGNoKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19vdXQsCisgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X0xlc3M8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPigpLAorICAgICAgICAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxKCksIF9JSXRlckNhdGVnb3J5MigpLCBfT0l0ZXJDYXRlZ29yeSgpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IgCisgICAgc2V0X2ludGVyc2VjdGlvbihfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0LCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjE+IF9JSXRlclRyYWl0czE7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjI+IF9JSXRlclRyYWl0czI7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9PdXRwdXRJdGVyYXRvcj4gX09JdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMxOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czI6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX09JdGVyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfT0l0ZXJDYXRlZ29yeTsKKworICAgICAgcmV0dXJuIF9fc2V0X2ludGVyc2VjdGlvbl9zd2l0Y2goCisgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX291dCwgX19wcmVkLAorICAgICAgICAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxKCksIF9JSXRlckNhdGVnb3J5MigpLCBfT0l0ZXJDYXRlZ29yeSgpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2JlZ2luMiwgX0lJdGVyMiBfX2VuZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX291dCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0LCBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX291dCwgX19wcmVkKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlcmF0b3JUYWcxLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWcyLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlcmF0b3JUYWczPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IgCisgICAgX19zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2Vfc3dpdGNoKAorICAgICAgX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLAorICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgIF9JdGVyYXRvclRhZzEsIF9JdGVyYXRvclRhZzIsIF9JdGVyYXRvclRhZzMpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZSgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcmVzdWx0LCBfX3ByZWQpOyB9CisKKyAgLy8gUGFyYWxsZWwgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRfUkFJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PdXRwdXRfUkFJdGVyCisgICAgX19zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2Vfc3dpdGNoKF9SQUl0ZXIxIF9fYmVnaW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjIgX19iZWdpbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMiBfX2VuZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0X1JBSXRlciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kMSAtIF9fYmVnaW4xKQorICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX21pbmltYWxfbgorICAgICAgfHwgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZDIgLSBfX2JlZ2luMikKKyAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV9taW5pbWFsX24pKQorICByZXR1cm4gX19nbnVfcGFyYWxsZWw6Ol9fcGFyYWxsZWxfc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKAorICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3Jlc3VsdCwgX19wcmVkKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcmVzdWx0LCBfX3ByZWQpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvciAKKyAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfSUl0ZXJUcmFpdHMxOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIyPiBfSUl0ZXJUcmFpdHMyOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMTo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMyOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czE6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czI6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTI7CisKKyAgICAgIHJldHVybiBfX3NldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV9zd2l0Y2goCisgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX291dCwKKyAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfTGVzczxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KCksCisgICAgICAgICAgICAgICBfSUl0ZXJDYXRlZ29yeTEoKSwgX0lJdGVyQ2F0ZWdvcnkyKCksIF9PSXRlckNhdGVnb3J5KCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvciAKKyAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQsIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMT4gX0lJdGVyVHJhaXRzMTsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX0lJdGVyVHJhaXRzMjsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfT0l0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czE6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMjo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfT0l0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9PSXRlckNhdGVnb3J5OworCisgICAgICByZXR1cm4gX19zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2Vfc3dpdGNoKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19vdXQsIF9fcHJlZCwKKyAgICAgICAgICAgICAgIF9JSXRlckNhdGVnb3J5MSgpLCBfSUl0ZXJDYXRlZ29yeTIoKSwgX09JdGVyQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2suCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X2RpZmZlcmVuY2UoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIAorICAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLCAKKyAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2V0X2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICBfX2JlZ2luMSxfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fb3V0KTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2suCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X2RpZmZlcmVuY2UoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIAorICAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLCAKKyAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQsIF9QcmVkaWNhdGUgX19wcmVkLCAKKyAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNldF9kaWZmZXJlbmNlKF9fYmVnaW4xLCBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmVnaW4yLCBfX2VuZDIsIF9fb3V0LCBfX3ByZWQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWcxLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlcmF0b3JUYWcyLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWczPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3NldF9kaWZmZXJlbmNlX3N3aXRjaChfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfUHJlZGljYXRlIF9fcHJlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZzEsIF9JdGVyYXRvclRhZzIsIF9JdGVyYXRvclRhZzMpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNldF9kaWZmZXJlbmNlKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19yZXN1bHQsIF9fcHJlZCk7IH0KKworICAvLyBQYXJhbGxlbCBzZXRfZGlmZmVyZW5jZSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0X1JBSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT3V0cHV0X1JBSXRlcgorICAgIF9fc2V0X2RpZmZlcmVuY2Vfc3dpdGNoKF9SQUl0ZXIxIF9fYmVnaW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIyIF9fYmVnaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMiBfX2VuZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRfUkFJdGVyIF9fcmVzdWx0LCBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZDEgLSBfX2JlZ2luMSkKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnNldF9kaWZmZXJlbmNlX21pbmltYWxfbgorICAgICAgICAgICAgfHwgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZDIgLSBfX2JlZ2luMikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnNldF9kaWZmZXJlbmNlX21pbmltYWxfbikpCisgICAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6X19wYXJhbGxlbF9zZXRfZGlmZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19yZXN1bHQsIF9fcHJlZCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2V0X2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcmVzdWx0LCBfX3ByZWQpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X2RpZmZlcmVuY2UoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIAorICAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLCAKKyAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfSUl0ZXJUcmFpdHMxOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIyPiBfSUl0ZXJUcmFpdHMyOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMTo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMyOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czE6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czI6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTI7CisKKyAgICAgIHJldHVybiBfX3NldF9kaWZmZXJlbmNlX3N3aXRjaCgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fb3V0LAorICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9MZXNzPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4oKSwKKyAgICAgICAgICAgICAgIF9JSXRlckNhdGVnb3J5MSgpLCBfSUl0ZXJDYXRlZ29yeTIoKSwgX09JdGVyQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfZGlmZmVyZW5jZShfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwgCisgICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2JlZ2luMiwgX0lJdGVyMiBfX2VuZDIsIAorICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX291dCwgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfSUl0ZXJUcmFpdHMxOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIyPiBfSUl0ZXJUcmFpdHMyOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMTo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMyOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisKKyAgICAgIHJldHVybiBfX3NldF9kaWZmZXJlbmNlX3N3aXRjaCgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fb3V0LCBfX3ByZWQsCisgICAgICAgICAgICAgICBfSUl0ZXJDYXRlZ29yeTEoKSwgX0lJdGVyQ2F0ZWdvcnkyKCksIF9PSXRlckNhdGVnb3J5KCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3I+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBhZGphY2VudF9maW5kKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgCisgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmFkamFjZW50X2ZpbmQoX19iZWdpbiwgX19lbmQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgYWRqYWNlbnRfZmluZChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIAorICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLAorICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjphZGphY2VudF9maW5kKF9fYmVnaW4sIF9fZW5kLCBfX2JpbmFyeV9wcmVkKTsgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICBfUkFJdGVyCisgICAgX19hZGphY2VudF9maW5kX3N3aXRjaChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworCisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgX1JBSXRlciBfX3Nwb3QgPSBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICAgIF9fZmluZF90ZW1wbGF0ZSgKKyAgICAgICAgICAgICAgICBfX2JlZ2luLCBfX2VuZCAtIDEsIF9fYmVnaW4sIGVxdWFsX3RvPF9WYWx1ZVR5cGU+KCksCisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fYWRqYWNlbnRfZmluZF9zZWxlY3RvcigpKQorICAgICAgICAgICAgLmZpcnN0OworICAgICAgICAgIGlmIChfX3Nwb3QgPT0gKF9fZW5kIC0gMSkpCisgICAgICAgICAgICByZXR1cm4gX19lbmQ7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIF9fc3BvdDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gYWRqYWNlbnRfZmluZChfX2JlZ2luLCBfX2VuZCwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIF9fYWRqYWNlbnRfZmluZF9zd2l0Y2goX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZykKKyAgICB7IHJldHVybiBhZGphY2VudF9maW5kKF9fYmVnaW4sIF9fZW5kLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7IH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3I+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBhZGphY2VudF9maW5kKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCkKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fYWRqYWNlbnRfZmluZF9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9JdGVyYXRvckNhdGVnb3J5KCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGUsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIF9fYWRqYWNlbnRfZmluZF9zd2l0Y2goX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCwgX0l0ZXJhdG9yVGFnKQorICAgIHsgcmV0dXJuIGFkamFjZW50X2ZpbmQoX19iZWdpbiwgX19lbmQsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfUkFJdGVyCisgICAgX19hZGphY2VudF9maW5kX3N3aXRjaChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKHRydWUpKQorICAgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6Ol9fZmluZF90ZW1wbGF0ZShfX2JlZ2luLCBfX2VuZCwgX19iZWdpbiwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hZGphY2VudF9maW5kX3NlbGVjdG9yKCkpLmZpcnN0OworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gYWRqYWNlbnRfZmluZChfX2JlZ2luLCBfX2VuZCwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIGFkamFjZW50X2ZpbmQoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCAKKyAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICByZXR1cm4gX19hZGphY2VudF9maW5kX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBjb3VudChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBjb25zdCBfVHAmIF9fdmFsdWUsIAorICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6Y291bnQoX19iZWdpbiwgX19lbmQsIF9fdmFsdWUpOyB9CisKKyAgLy8gUGFyYWxsZWwgY29kZSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19jb3VudF9zd2l0Y2goX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLCAKKyAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbHVlLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcgCisgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX3VuYmFsYW5jZWQpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworICAgICAgdHlwZWRlZiBfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXggX1NlcXVlbmNlSW5kZXg7CisKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuY291bnRfbWluaW1hbF9uCisgICAgICAgICAgICAmJiBfX2dudV9wYXJhbGxlbDo6X19pc19wYXJhbGxlbChfX3BhcmFsbGVsaXNtX3RhZykpKQorICAgICAgICB7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fY291bnRfc2VsZWN0b3I8X1JBSXRlciwgX0RpZmZlcmVuY2VUeXBlPgorICAgICAgICAgICAgX19mdW5jdGlvbmFsaXR5OworICAgICAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3JlcyA9IDA7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzKAorICAgICAgICAgICAgICBfX2JlZ2luLCBfX2VuZCwgX192YWx1ZSwgX19mdW5jdGlvbmFsaXR5LAorICAgICAgICAgICAgICBzdGQ6OnBsdXM8X1NlcXVlbmNlSW5kZXg+KCksIF9fcmVzLCBfX3JlcywgLTEsCisgICAgICAgICAgICAgIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGNvdW50KF9fYmVnaW4sIF9fZW5kLCBfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnPgorICAgIGlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19jb3VudF9zd2l0Y2goX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgY29uc3QgX1RwJiBfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yVGFnKQorICAgIHsgcmV0dXJuIGNvdW50KF9fYmVnaW4sIF9fZW5kLCBfX3ZhbHVlLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBjb3VudChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBjb25zdCBfVHAmIF9fdmFsdWUsIAorICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fY291bnRfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX3ZhbHVlLCBfSXRlcmF0b3JDYXRlZ29yeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBjb3VudChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBjb25zdCBfVHAmIF9fdmFsdWUpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fY291bnRfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX3ZhbHVlLCBfSXRlcmF0b3JDYXRlZ29yeSgpKTsKKyAgICB9CisKKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBjb3VudF9pZihfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfUHJlZGljYXRlIF9fcHJlZCwgCisgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpjb3VudF9pZihfX2JlZ2luLCBfX2VuZCwgX19wcmVkKTsgfQorCisgIC8vIFBhcmFsbGVsIGNvdW50X2lmIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19jb3VudF9pZl9zd2l0Y2goX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLCAKKyAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnCisgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX3VuYmFsYW5jZWQpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworICAgICAgdHlwZWRlZiBfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXggX1NlcXVlbmNlSW5kZXg7CisKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuY291bnRfbWluaW1hbF9uCisgICAgICAgICAgICAmJiBfX2dudV9wYXJhbGxlbDo6X19pc19wYXJhbGxlbChfX3BhcmFsbGVsaXNtX3RhZykpKQorICAgICAgICB7CisgICAgICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fcmVzID0gMDsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICBfX2NvdW50X2lmX3NlbGVjdG9yPF9SQUl0ZXIsIF9EaWZmZXJlbmNlVHlwZT4KKyAgICAgICAgICAgIF9fZnVuY3Rpb25hbGl0eTsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICBfX2Zvcl9lYWNoX3RlbXBsYXRlX3JhbmRvbV9hY2Nlc3MoCisgICAgICAgICAgICAgIF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQsIF9fZnVuY3Rpb25hbGl0eSwKKyAgICAgICAgICAgICAgc3RkOjpwbHVzPF9TZXF1ZW5jZUluZGV4PigpLCBfX3JlcywgX19yZXMsIC0xLAorICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBjb3VudF9pZihfX2JlZ2luLCBfX2VuZCwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fY291bnRfaWZfc3dpdGNoKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9QcmVkaWNhdGUgX19wcmVkLCAKKyAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yVGFnKQorICAgIHsgcmV0dXJuIGNvdW50X2lmKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgY291bnRfaWYoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX1ByZWRpY2F0ZSBfX3ByZWQsIAorICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fY291bnRfaWZfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQsIF9JdGVyYXRvckNhdGVnb3J5KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGNvdW50X2lmKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX2NvdW50X2lmX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19wcmVkLCBfSXRlcmF0b3JDYXRlZ29yeSgpKTsKKyAgICB9CisKKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZJdGVyYXRvcjI+CisgICAgaW5saW5lIF9GSXRlcmF0b3IxCisgICAgc2VhcmNoKF9GSXRlcmF0b3IxIF9fYmVnaW4xLCBfRkl0ZXJhdG9yMSBfX2VuZDEsCisgICAgICAgICAgIF9GSXRlcmF0b3IyIF9fYmVnaW4yLCBfRkl0ZXJhdG9yMiBfX2VuZDIsCisgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2VhcmNoKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIpOyB9CisKKyAgLy8gUGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMj4KKyAgICBfUkFJdGVyMQorICAgIF9fc2VhcmNoX3N3aXRjaChfUkFJdGVyMSBfX2JlZ2luMSwgX1JBSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgX1JBSXRlcjIgX19iZWdpbjIsIF9SQUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPiBfSXRlcmF0b3IxVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3IxVHJhaXRzOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMj4gX0l0ZXJhdG9yMlRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yMlRyYWl0czo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMjsKKworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kMSAtIF9fYmVnaW4xKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuc2VhcmNoX21pbmltYWxfbikpCisgICAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgX19zZWFyY2hfdGVtcGxhdGUoCisgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLAorICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9FcXVhbFRvPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4oKSk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzZWFyY2goX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvcjEsIHR5cGVuYW1lIF9GSXRlcmF0b3IyLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlcmF0b3JUYWcxLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWcyPgorICAgIGlubGluZSBfRkl0ZXJhdG9yMQorICAgIF9fc2VhcmNoX3N3aXRjaChfRkl0ZXJhdG9yMSBfX2JlZ2luMSwgX0ZJdGVyYXRvcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgX0ZJdGVyYXRvcjIgX19iZWdpbjIsIF9GSXRlcmF0b3IyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZzEsIF9JdGVyYXRvclRhZzIpCisgICAgeyByZXR1cm4gc2VhcmNoKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsCisgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IxLCB0eXBlbmFtZSBfRkl0ZXJhdG9yMj4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcjEKKyAgICBzZWFyY2goX0ZJdGVyYXRvcjEgX19iZWdpbjEsIF9GSXRlcmF0b3IxIF9fZW5kMSwKKyAgICAgICAgICAgX0ZJdGVyYXRvcjIgX19iZWdpbjIsIF9GSXRlcmF0b3IyIF9fZW5kMikKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3IxPiBfSXRlcmF0b3IxVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3IxVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTE7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3IyPiBfSXRlcmF0b3IyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3IyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTI7CisKKyAgICAgIHJldHVybiBfX3NlYXJjaF9zd2l0Y2goX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvckNhdGVnb3J5MSgpLCBfSXRlcmF0b3JDYXRlZ29yeTIoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IxLCB0eXBlbmFtZSBfRkl0ZXJhdG9yMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcjEKKyAgICBzZWFyY2goX0ZJdGVyYXRvcjEgX19iZWdpbjEsIF9GSXRlcmF0b3IxIF9fZW5kMSwKKyAgICAgICAgICAgX0ZJdGVyYXRvcjIgX19iZWdpbjIsIF9GSXRlcmF0b3IyIF9fZW5kMiwKKyAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2VhcmNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcHJlZCk7IH0KKworICAvLyBQYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfUkFJdGVyMQorICAgIF9fc2VhcmNoX3N3aXRjaChfUkFJdGVyMSBfX2JlZ2luMSwgX1JBSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgX1JBSXRlcjIgX19iZWdpbjIsIF9SQUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkLAorICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZDEgLSBfX2JlZ2luMSkKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnNlYXJjaF9taW5pbWFsX24pKQorICAgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6Ol9fc2VhcmNoX3RlbXBsYXRlKF9fYmVnaW4xLCBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmVnaW4yLCBfX2VuZDIsIF9fcHJlZCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzZWFyY2goX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZJdGVyYXRvcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGUsIHR5cGVuYW1lIF9JdGVyYXRvclRhZzEsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvclRhZzI+CisgICAgaW5saW5lIF9GSXRlcmF0b3IxCisgICAgX19zZWFyY2hfc3dpdGNoKF9GSXRlcmF0b3IxIF9fYmVnaW4xLCBfRkl0ZXJhdG9yMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICBfRkl0ZXJhdG9yMiBfX2JlZ2luMiwgX0ZJdGVyYXRvcjIgX19lbmQyLAorICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQsIF9JdGVyYXRvclRhZzEsIF9JdGVyYXRvclRhZzIpCisgICAgeyByZXR1cm4gc2VhcmNoKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZJdGVyYXRvcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgaW5saW5lIF9GSXRlcmF0b3IxCisgICAgc2VhcmNoKF9GSXRlcmF0b3IxIF9fYmVnaW4xLCBfRkl0ZXJhdG9yMSBfX2VuZDEsCisgICAgICAgICAgIF9GSXRlcmF0b3IyIF9fYmVnaW4yLCBfRkl0ZXJhdG9yMiBfX2VuZDIsCisgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgIF9fcHJlZCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3IxPiBfSXRlcmF0b3IxVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3IxVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTE7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3IyPiBfSXRlcmF0b3IyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3IyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTI7CisgICAgICByZXR1cm4gX19zZWFyY2hfc3dpdGNoKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvckNhdGVnb3J5MSgpLCBfSXRlcmF0b3JDYXRlZ29yeTIoKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIHNlYXJjaF9uKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgX0ludGVnZXIgX19jb3VudCwKKyAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNlYXJjaF9uKF9fYmVnaW4sIF9fZW5kLCBfX2NvdW50LCBfX3ZhbCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBzZWFyY2hfbihfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9JbnRlZ2VyIF9fY291bnQsCisgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLAorICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2VhcmNoX24oCisgICAgICAgICAgICAgICBfX2JlZ2luLCBfX2VuZCwgX19jb3VudCwgX192YWwsIF9fYmluYXJ5X3ByZWQpOyB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIHNlYXJjaF9uKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgX0ludGVnZXIgX19jb3VudCwKKyAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6OnNlYXJjaF9uKF9fYmVnaW4sIF9fZW5kLCBfX2NvdW50LCBfX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X0VxdWFsVG88X1ZhbHVlVHlwZSwgX1RwPigpKTsKKyAgICB9CisKKyAgLy8gUGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0ludGVnZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfUkFJdGVyCisgICAgX19zZWFyY2hfbl9zd2l0Y2goX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLCBfSW50ZWdlciBfX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwsIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuc2VhcmNoX21pbmltYWxfbikpCisgICAgICAgIHsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BzZXVkb1NlcXVlbmNlPF9UcCwgX0ludGVnZXI+IF9fcHMoX192YWwsIF9fY291bnQpOworICAgICAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6X19zZWFyY2hfdGVtcGxhdGUoCisgICAgICAgICAgICAgICAgICAgX19iZWdpbiwgX19lbmQsIF9fcHMuYmVnaW4oKSwgX19wcy5lbmQoKSwgX19iaW5hcnlfcHJlZCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpzZWFyY2hfbihfX2JlZ2luLCBfX2VuZCwgX19jb3VudCwgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaW5hcnlfcHJlZCk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGUsIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIF9fc2VhcmNoX25fc3dpdGNoKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgX0ludGVnZXIgX19jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yVGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpzZWFyY2hfbihfX2JlZ2luLCBfX2VuZCwgX19jb3VudCwgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmluYXJ5X3ByZWQpOyB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIHNlYXJjaF9uKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgX0ludGVnZXIgX19jb3VudCwKKyAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpCisgICAgeworICAgICAgcmV0dXJuIF9fc2VhcmNoX25fc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX2NvdW50LCBfX3ZhbCwgX19iaW5hcnlfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0ZJdGVyYXRvcj46OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeSgpKTsKKyAgICB9CisKKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1VuYXJ5T3BlcmF0aW9uPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICB0cmFuc2Zvcm0oX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCAKKyAgICAgICAgICAgICAgX1VuYXJ5T3BlcmF0aW9uIF9fdW5hcnlfb3AsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6dHJhbnNmb3JtKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCwgX191bmFyeV9vcCk7IH0KKworICAvLyBQYXJhbGxlbCB1bmFyeSB0cmFuc2Zvcm0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9VbmFyeU9wZXJhdGlvbj4KKyAgICBfUkFJdGVyMgorICAgIF9fdHJhbnNmb3JtMV9zd2l0Y2goX1JBSXRlcjEgX19iZWdpbiwgX1JBSXRlcjEgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjIgX19yZXN1bHQsIF9VbmFyeU9wZXJhdGlvbiBfX3VuYXJ5X29wLAorICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnCisgICAgICAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfYmFsYW5jZWQpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkudHJhbnNmb3JtX21pbmltYWxfbgorICAgICAgICAgICAgJiYgX19nbnVfcGFyYWxsZWw6Ol9faXNfcGFyYWxsZWwoX19wYXJhbGxlbGlzbV90YWcpKSkKKyAgICAgICAgeworICAgICAgICAgIGJvb2wgX19kdW1teSA9IHRydWU7CisgICAgICAgICAgdHlwZWRlZiBfX2dudV9wYXJhbGxlbDo6X0l0ZXJhdG9yUGFpcjxfUkFJdGVyMSwKKyAgICAgICAgICAgIF9SQUl0ZXIyLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZz4gX0l0VHJpcDsKKyAgICAgICAgICBfSXRUcmlwIF9fYmVnaW5fcGFpcihfX2JlZ2luLCBfX3Jlc3VsdCksCisgICAgICAgICAgICAgICAgICBfX2VuZF9wYWlyKF9fZW5kLCBfX3Jlc3VsdCArIChfX2VuZCAtIF9fYmVnaW4pKTsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X190cmFuc2Zvcm0xX3NlbGVjdG9yPF9JdFRyaXA+IF9fZnVuY3Rpb25hbGl0eTsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICBfX2Zvcl9lYWNoX3RlbXBsYXRlX3JhbmRvbV9hY2Nlc3MoCisgICAgICAgICAgICAgIF9fYmVnaW5fcGFpciwgX19lbmRfcGFpciwgX191bmFyeV9vcCwgX19mdW5jdGlvbmFsaXR5LAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X0R1bW15UmVkdWN0KCksCisgICAgICAgICAgICAgIF9fZHVtbXksIF9fZHVtbXksIC0xLCBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgICAgICAgcmV0dXJuIF9fZnVuY3Rpb25hbGl0eS5fTV9maW5pc2hfaXRlcmF0b3I7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHRyYW5zZm9ybShfX2JlZ2luLCBfX2VuZCwgX19yZXN1bHQsIF9fdW5hcnlfb3AsIAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfVW5hcnlPcGVyYXRpb24sIHR5cGVuYW1lIF9JdGVyYXRvclRhZzEsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvclRhZzI+CisgICAgaW5saW5lIF9SQUl0ZXIyCisgICAgX190cmFuc2Zvcm0xX3N3aXRjaChfUkFJdGVyMSBfX2JlZ2luLCBfUkFJdGVyMSBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMiBfX3Jlc3VsdCwgX1VuYXJ5T3BlcmF0aW9uIF9fdW5hcnlfb3AsCisgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yVGFnMSwgX0l0ZXJhdG9yVGFnMikKKyAgICB7IHJldHVybiB0cmFuc2Zvcm0oX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0LCBfX3VuYXJ5X29wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9VbmFyeU9wZXJhdGlvbj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgdHJhbnNmb3JtKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgX1VuYXJ5T3BlcmF0aW9uIF9fdW5hcnlfb3AsIAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfSUl0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9PdXRwdXRJdGVyYXRvcj4gX09JdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX09JdGVyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfT0l0ZXJDYXRlZ29yeTsKKworICAgICAgcmV0dXJuIF9fdHJhbnNmb3JtMV9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0LCBfX3VuYXJ5X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JSXRlcmF0b3JDYXRlZ29yeSgpLCBfT0l0ZXJDYXRlZ29yeSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfVW5hcnlPcGVyYXRpb24+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHRyYW5zZm9ybShfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisgICAgICAgICAgICAgIF9VbmFyeU9wZXJhdGlvbiBfX3VuYXJ5X29wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfSUl0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9PdXRwdXRJdGVyYXRvcj4gX09JdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX09JdGVyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfT0l0ZXJDYXRlZ29yeTsKKworICAgICAgcmV0dXJuIF9fdHJhbnNmb3JtMV9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0LCBfX3VuYXJ5X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JSXRlcmF0b3JDYXRlZ29yeSgpLCBfT0l0ZXJDYXRlZ29yeSgpKTsKKyAgICB9CisKKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgdHJhbnNmb3JtKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3AsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6dHJhbnNmb3JtKF9fYmVnaW4xLCBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luMiwgX19yZXN1bHQsIF9fYmluYXJ5X29wKTsgfQorCisgIC8vIFBhcmFsbGVsIGJpbmFyeSB0cmFuc2Zvcm0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9SQUl0ZXIzLCB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIF9SQUl0ZXIzCisgICAgX190cmFuc2Zvcm0yX3N3aXRjaChfUkFJdGVyMSBfX2JlZ2luMSwgX1JBSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIyIF9fYmVnaW4yLAorICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIzIF9fcmVzdWx0LCBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wLAorICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnIAorICAgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX2JhbGFuY2VkKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICAoX19lbmQxIC0gX19iZWdpbjEpID49CisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkudHJhbnNmb3JtX21pbmltYWxfbgorICAgICAgICAgICAgJiYgX19nbnVfcGFyYWxsZWw6Ol9faXNfcGFyYWxsZWwoX19wYXJhbGxlbGlzbV90YWcpKSkKKyAgICAgICAgeworICAgICAgICAgIGJvb2wgX19kdW1teSA9IHRydWU7CisgICAgICAgICAgdHlwZWRlZiBfX2dudV9wYXJhbGxlbDo6X0l0ZXJhdG9yVHJpcGxlPF9SQUl0ZXIxLAorICAgICAgICAgICAgX1JBSXRlcjIsIF9SQUl0ZXIzLAorICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc+IF9JdFRyaXA7CisgICAgICAgICAgX0l0VHJpcCBfX2JlZ2luX3RyaXBsZShfX2JlZ2luMSwgX19iZWdpbjIsIF9fcmVzdWx0KSwKKyAgICAgICAgICAgIF9fZW5kX3RyaXBsZShfX2VuZDEsIF9fYmVnaW4yICsgKF9fZW5kMSAtIF9fYmVnaW4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX19yZXN1bHQgKyAoX19lbmQxIC0gX19iZWdpbjEpKTsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X190cmFuc2Zvcm0yX3NlbGVjdG9yPF9JdFRyaXA+IF9fZnVuY3Rpb25hbGl0eTsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICBfX2Zvcl9lYWNoX3RlbXBsYXRlX3JhbmRvbV9hY2Nlc3MoX19iZWdpbl90cmlwbGUsIF9fZW5kX3RyaXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaW5hcnlfb3AsIF9fZnVuY3Rpb25hbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9EdW1teVJlZHVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2R1bW15LCBfX2R1bW15LCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wYXJhbGxlbGlzbV90YWcpOworICAgICAgICAgIHJldHVybiBfX2Z1bmN0aW9uYWxpdHkuX01fZmluaXNoX2l0ZXJhdG9yOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiB0cmFuc2Zvcm0oX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fcmVzdWx0LCBfX2JpbmFyeV9vcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24sCisgICAgICAgICAgIHR5cGVuYW1lIF9UYWcxLCB0eXBlbmFtZSBfVGFnMiwgdHlwZW5hbWUgX1RhZzM+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fdHJhbnNmb3JtMl9zd2l0Y2goX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIAorICAgICAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgCisgICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCwgX1RhZzEsIF9UYWcyLCBfVGFnMykKKyAgICB7IHJldHVybiB0cmFuc2Zvcm0oX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fcmVzdWx0LCBfX2JpbmFyeV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICB0cmFuc2Zvcm0oX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCwgCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfSUl0ZXJUcmFpdHMxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMxOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTE7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjI+IF9JSXRlclRyYWl0czI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czI6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MjsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfT0l0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisKKyAgICAgIHJldHVybiBfX3RyYW5zZm9ybTJfc3dpdGNoKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fcmVzdWx0LCBfX2JpbmFyeV9vcCwKKyAgICAgICAgICAgICAgIF9JSXRlckNhdGVnb3J5MSgpLCBfSUl0ZXJDYXRlZ29yeTIoKSwgX09JdGVyQ2F0ZWdvcnkoKSwKKyAgICAgICAgICAgICAgIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICB0cmFuc2Zvcm0oX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjE+IF9JSXRlclRyYWl0czE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czE6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MTsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX0lJdGVyVHJhaXRzMjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMjo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkyOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX09JdGVyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfT0l0ZXJDYXRlZ29yeTsKKworICAgICAgcmV0dXJuIF9fdHJhbnNmb3JtMl9zd2l0Y2goCisgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19yZXN1bHQsIF9fYmluYXJ5X29wLAorICAgICAgICAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxKCksIF9JSXRlckNhdGVnb3J5MigpLCBfT0l0ZXJDYXRlZ29yeSgpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICByZXBsYWNlKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgY29uc3QgX1RwJiBfX29sZF92YWx1ZSwgCisgICAgICAgICAgICBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyBfR0xJQkNYWF9TVERfQTo6cmVwbGFjZShfX2JlZ2luLCBfX2VuZCwgX19vbGRfdmFsdWUsIF9fbmV3X3ZhbHVlKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWc+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3JlcGxhY2Vfc3dpdGNoKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fb2xkX3ZhbHVlLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yVGFnKQorICAgIHsgcmVwbGFjZShfX2JlZ2luLCBfX2VuZCwgX19vbGRfdmFsdWUsIF9fbmV3X3ZhbHVlLCAKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgLy8gUGFyYWxsZWwgcmVwbGFjZSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX19yZXBsYWNlX3N3aXRjaChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsIAorICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX19vbGRfdmFsdWUsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUsIAorICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCAKKyAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnCisgICAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfYmFsYW5jZWQpCisgICAgeworICAgICAgLy8gWFhYIHBhcmFsbGVsIHZlcnNpb24gaXMgd2hlcmU/CisgICAgICByZXBsYWNlKF9fYmVnaW4sIF9fZW5kLCBfX29sZF92YWx1ZSwgX19uZXdfdmFsdWUsIAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7IAorICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHJlcGxhY2UoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCBjb25zdCBfVHAmIF9fb2xkX3ZhbHVlLCAKKyAgICAgICAgICAgIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUsCisgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICBfX3JlcGxhY2Vfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX29sZF92YWx1ZSwgX19uZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvckNhdGVnb3J5KCksCisgICAgICAgICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHJlcGxhY2UoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCBjb25zdCBfVHAmIF9fb2xkX3ZhbHVlLCAKKyAgICAgICAgICAgIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0ZJdGVyYXRvcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIF9fcmVwbGFjZV9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fb2xkX3ZhbHVlLCBfX25ld192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSk7CisgICAgfQorCisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICByZXBsYWNlX2lmKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgX1ByZWRpY2F0ZSBfX3ByZWQsIAorICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX25ld192YWx1ZSwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgX0dMSUJDWFhfU1REX0E6OnJlcGxhY2VfaWYoX19iZWdpbiwgX19lbmQsIF9fcHJlZCwgX19uZXdfdmFsdWUpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fcmVwbGFjZV9pZl9zd2l0Y2goX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlLCBfSXRlcmF0b3JUYWcpCisgICAgeyByZXBsYWNlX2lmKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQsIF9fbmV3X3ZhbHVlLAorICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7IH0KKworICAvLyBQYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fcmVwbGFjZV9pZl9zd2l0Y2goX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcKKyAgICAgICAgICAgICAgICAgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF9iYWxhbmNlZCkKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZCAtIF9fYmVnaW4pCisgICAgICAgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5yZXBsYWNlX21pbmltYWxfbgorICAgICAgICAgICAgJiYgX19nbnVfcGFyYWxsZWw6Ol9faXNfcGFyYWxsZWwoX19wYXJhbGxlbGlzbV90YWcpKSkKKyAgICAgICAgeworICAgICAgICAgIGJvb2wgX19kdW1teTsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICBfX3JlcGxhY2VfaWZfc2VsZWN0b3I8X1JBSXRlciwgX1ByZWRpY2F0ZSwgX1RwPgorICAgICAgICAgICAgX19mdW5jdGlvbmFsaXR5KF9fbmV3X3ZhbHVlKTsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICBfX2Zvcl9lYWNoX3RlbXBsYXRlX3JhbmRvbV9hY2Nlc3MoCisgICAgICAgICAgICAgIF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQsIF9fZnVuY3Rpb25hbGl0eSwKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9EdW1teVJlZHVjdCgpLAorICAgICAgICAgICAgICB0cnVlLCBfX2R1bW15LCAtMSwgX19wYXJhbGxlbGlzbV90YWcpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJlcGxhY2VfaWYoX19iZWdpbiwgX19lbmQsIF9fcHJlZCwgX19uZXdfdmFsdWUsIAorICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgcmVwbGFjZV9pZihfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsCisgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgY29uc3QgX1RwJiBfX25ld192YWx1ZSwgCisgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0ZJdGVyYXRvcj4gX0l0ZXJhdG9yVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3JUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgX19yZXBsYWNlX2lmX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19wcmVkLCBfX25ld192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSwgX19wYXJhbGxlbGlzbV90YWcpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICByZXBsYWNlX2lmKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwKKyAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0ZJdGVyYXRvcj4gX0l0ZXJhdG9yVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3JUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgX19yZXBsYWNlX2lmX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19wcmVkLCBfX25ld192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIGdlbmVyYXRlKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgX0dlbmVyYXRvciBfX2dlbiwgCisgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgX0dMSUJDWFhfU1REX0E6OmdlbmVyYXRlKF9fYmVnaW4sIF9fZW5kLCBfX2dlbik7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfR2VuZXJhdG9yLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWc+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX2dlbmVyYXRlX3N3aXRjaChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9HZW5lcmF0b3IgX19nZW4sCisgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZykKKyAgICB7IGdlbmVyYXRlKF9fYmVnaW4sIF9fZW5kLCBfX2dlbiwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgLy8gUGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICB2b2lkCisgICAgX19nZW5lcmF0ZV9zd2l0Y2goX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICBfR2VuZXJhdG9yIF9fZ2VuLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcKKyAgICAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfYmFsYW5jZWQpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuZ2VuZXJhdGVfbWluaW1hbF9uCisgICAgICAgICAgICAmJiBfX2dudV9wYXJhbGxlbDo6X19pc19wYXJhbGxlbChfX3BhcmFsbGVsaXNtX3RhZykpKQorICAgICAgICB7CisgICAgICAgICAgYm9vbCBfX2R1bW15OworICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX2dlbmVyYXRlX3NlbGVjdG9yPF9SQUl0ZXI+CisgICAgICAgICAgICBfX2Z1bmN0aW9uYWxpdHk7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzKAorICAgICAgICAgICAgICBfX2JlZ2luLCBfX2VuZCwgX19nZW4sIF9fZnVuY3Rpb25hbGl0eSwKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9EdW1teVJlZHVjdCgpLAorICAgICAgICAgICAgICB0cnVlLCBfX2R1bW15LCAtMSwgX19wYXJhbGxlbGlzbV90YWcpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGdlbmVyYXRlKF9fYmVnaW4sIF9fZW5kLCBfX2dlbiwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgZ2VuZXJhdGUoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLAorICAgICAgICAgICAgIF9HZW5lcmF0b3IgX19nZW4sIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPiBfSXRlcmF0b3JUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICBfX2dlbmVyYXRlX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19nZW4sIF9JdGVyYXRvckNhdGVnb3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBnZW5lcmF0ZShfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9HZW5lcmF0b3IgX19nZW4pCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPiBfSXRlcmF0b3JUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICBfX2dlbmVyYXRlX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19nZW4sIF9JdGVyYXRvckNhdGVnb3J5KCkpOworICAgIH0KKworCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2suCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIGdlbmVyYXRlX24oX091dHB1dEl0ZXJhdG9yIF9fYmVnaW4sIF9TaXplIF9fbiwgX0dlbmVyYXRvciBfX2dlbiwgCisgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmdlbmVyYXRlX24oX19iZWdpbiwgX19uLCBfX2dlbik7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfR2VuZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlcmF0b3JUYWc+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fZ2VuZXJhdGVfbl9zd2l0Y2goX091dHB1dEl0ZXJhdG9yIF9fYmVnaW4sIF9TaXplIF9fbiwgX0dlbmVyYXRvciBfX2dlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZykKKyAgICB7IHJldHVybiBnZW5lcmF0ZV9uKF9fYmVnaW4sIF9fbiwgX19nZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7IH0KKworICAvLyBQYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICBpbmxpbmUgX1JBSXRlcgorICAgIF9fZ2VuZXJhdGVfbl9zd2l0Y2goX1JBSXRlciBfX2JlZ2luLCBfU2l6ZSBfX24sIF9HZW5lcmF0b3IgX19nZW4sIAorICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCAKKyAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnCisgICAgICAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfYmFsYW5jZWQpCisgICAgeworICAgICAgLy8gWFhYIHBhcmFsbGVsIHZlcnNpb24gaXMgd2hlcmU/CisgICAgICByZXR1cm4gZ2VuZXJhdGVfbihfX2JlZ2luLCBfX24sIF9fZ2VuLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIGdlbmVyYXRlX24oX091dHB1dEl0ZXJhdG9yIF9fYmVnaW4sIF9TaXplIF9fbiwgX0dlbmVyYXRvciBfX2dlbiwgCisgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfSXRlcmF0b3JUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICByZXR1cm4gX19nZW5lcmF0ZV9uX3N3aXRjaChfX2JlZ2luLCBfX24sIF9fZ2VuLCBfSXRlcmF0b3JDYXRlZ29yeSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBnZW5lcmF0ZV9uKF9PdXRwdXRJdGVyYXRvciBfX2JlZ2luLCBfU2l6ZSBfX24sIF9HZW5lcmF0b3IgX19nZW4pCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9JdGVyYXRvclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX2dlbmVyYXRlX25fc3dpdGNoKF9fYmVnaW4sIF9fbiwgX19nZW4sIF9JdGVyYXRvckNhdGVnb3J5KCkpOworICAgIH0KKworCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2suCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgaW5saW5lIHZvaWQKKyAgICByYW5kb21fc2h1ZmZsZShfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsIAorICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IF9HTElCQ1hYX1NURF9BOjpyYW5kb21fc2h1ZmZsZShfX2JlZ2luLCBfX2VuZCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgcmFuZG9tX3NodWZmbGUoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgICAgICAgICAgICAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fcmFuZCwKKyAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyBfR0xJQkNYWF9TVERfQTo6cmFuZG9tX3NodWZmbGUoX19iZWdpbiwgX19lbmQsIF9fcmFuZCk7IH0KKworCisgIC8qKiBAYnJpZWYgRnVuY3RvciB3cmFwcGVyIGZvciBzdGQ6OnJhbmQoKS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX011c3RCZUludCA9IGludD4KKyAgICBzdHJ1Y3QgX0NSYW5kTnVtYmVyCisgICAgeworICAgICAgaW50CisgICAgICBvcGVyYXRvcigpKGludCBfX2xpbWl0KQorICAgICAgeyByZXR1cm4gcmFuZCgpICUgX19saW1pdDsgfQorICAgIH07CisKKyAgLy8gRmlsbCBpbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHJhbmRvbV9zaHVmZmxlKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCkKKyAgICB7CisgICAgICBfQ1JhbmROdW1iZXI8PiBfX3I7CisgICAgICAvLyBQYXJhbGxlbGl6YXRpb24gc3RpbGwgcG9zc2libGUuCisgICAgICBfX2dudV9wYXJhbGxlbDo6cmFuZG9tX3NodWZmbGUoX19iZWdpbiwgX19lbmQsIF9fcik7CisgICAgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgdm9pZAorICAgIHJhbmRvbV9zaHVmZmxlKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAgICAgICAgICAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYmIF9fcmFuZCkKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKF9fYmVnaW4gPT0gX19lbmQpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kIC0gX19iZWdpbikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnJhbmRvbV9zaHVmZmxlX21pbmltYWxfbikpCisgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX3BhcmFsbGVsX3JhbmRvbV9zaHVmZmxlKF9fYmVnaW4sIF9fZW5kLCBfX3JhbmQpOworICAgICAgZWxzZQorICAgICAgICBfX2dudV9wYXJhbGxlbDo6X19zZXF1ZW50aWFsX3JhbmRvbV9zaHVmZmxlKF9fYmVnaW4sIF9fZW5kLCBfX3JhbmQpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgcGFydGl0aW9uKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwKKyAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6cGFydGl0aW9uKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgX19wYXJ0aXRpb25fc3dpdGNoKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBfSXRlcmF0b3JUYWcpCisgICAgeyByZXR1cm4gcGFydGl0aW9uKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX1JBSXRlcgorICAgIF9fcGFydGl0aW9uX3N3aXRjaChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkucGFydGl0aW9uX21pbmltYWxfbikpCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+OjoKKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisgICAgICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbWlkZGxlID0gX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgX19wYXJhbGxlbF9wYXJ0aXRpb24oX19iZWdpbiwgX19lbmQsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X19nZXRfbWF4X3RocmVhZHMoKSk7CisgICAgICAgICAgcmV0dXJuIF9fYmVnaW4gKyBfX21pZGRsZTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gcGFydGl0aW9uKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgcGFydGl0aW9uKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0ZJdGVyYXRvcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX3BhcnRpdGlvbl9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fcHJlZCwgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIC8vIHNvcnQgaW50ZXJmYWNlCisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIGlubGluZSB2b2lkCisgICAgc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsIAorICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgX0dMSUJDWFhfU1REX0E6OnNvcnQoX19iZWdpbiwgX19lbmQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHNvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLCBfQ29tcGFyZSBfX2NvbXAsCisgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyBfR0xJQkNYWF9TVERfQTo6c29ydDxfUkFJdGVyLCBfQ29tcGFyZT4oX19iZWdpbiwgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmUsCisgICAgICAgICAgIHR5cGVuYW1lIF9QYXJhbGxlbGlzbT4KKyAgdm9pZAorICBzb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwgX0NvbXBhcmUgX19jb21wLAorICAgICAgIF9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtKQorICB7CisgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworCisgICAgaWYgKF9fYmVnaW4gIT0gX19lbmQpCisgICAgICB7CisgICAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kIC0gX19iZWdpbikgPj0KKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuc29ydF9taW5pbWFsX24pKQorICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX3BhcmFsbGVsX3NvcnQ8ZmFsc2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsIF9fcGFyYWxsZWxpc20pOworICAgICAgICBlbHNlCisgICAgICAgICAgc29ydChfX2JlZ2luLCBfX2VuZCwgX19jb21wLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgICB9CisgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLCBpbnNlcnQgZGVmYXVsdCBjb21wYXJhdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgaW5saW5lIHZvaWQKKyAgICBzb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCkKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHNvcnQoX19iZWdpbiwgX19lbmQsIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpLAorICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6ZGVmYXVsdF9wYXJhbGxlbF90YWcoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgaW5saW5lIHZvaWQKKyAgc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisgICAgICAgX19nbnVfcGFyYWxsZWw6OmRlZmF1bHRfcGFyYWxsZWxfdGFnIF9fcGFyYWxsZWxpc20pCisgIHsKKyAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgc29ydChfX2JlZ2luLCBfX2VuZCwgc3RkOjpsZXNzPF9WYWx1ZVR5cGU+KCksIF9fcGFyYWxsZWxpc20pOworICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICBpbmxpbmUgdm9pZAorICBzb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfdGFnIF9fcGFyYWxsZWxpc20pCisgIHsKKyAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgc29ydChfX2JlZ2luLCBfX2VuZCwgc3RkOjpsZXNzPF9WYWx1ZVR5cGU+KCksIF9fcGFyYWxsZWxpc20pOworICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICBpbmxpbmUgdm9pZAorICBzb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICBfX2dudV9wYXJhbGxlbDo6bXVsdGl3YXlfbWVyZ2Vzb3J0X3RhZyBfX3BhcmFsbGVsaXNtKQorICB7CisgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgIHNvcnQoX19iZWdpbiwgX19lbmQsIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpLCBfX3BhcmFsbGVsaXNtKTsKKyAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgaW5saW5lIHZvaWQKKyAgc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisgICAgICAgX19nbnVfcGFyYWxsZWw6Om11bHRpd2F5X21lcmdlc29ydF9zYW1wbGluZ190YWcgX19wYXJhbGxlbGlzbSkKKyAgeworICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICBzb3J0KF9fYmVnaW4sIF9fZW5kLCBzdGQ6Omxlc3M8X1ZhbHVlVHlwZT4oKSwgX19wYXJhbGxlbGlzbSk7CisgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLCBpbnNlcnQgZGVmYXVsdCBjb21wYXJhdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgIGlubGluZSB2b2lkCisgIHNvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgIF9fZ251X3BhcmFsbGVsOjptdWx0aXdheV9tZXJnZXNvcnRfZXhhY3RfdGFnIF9fcGFyYWxsZWxpc20pCisgIHsKKyAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgc29ydChfX2JlZ2luLCBfX2VuZCwgc3RkOjpsZXNzPF9WYWx1ZVR5cGU+KCksIF9fcGFyYWxsZWxpc20pOworICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICBpbmxpbmUgdm9pZAorICBzb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICBfX2dudV9wYXJhbGxlbDo6cXVpY2tzb3J0X3RhZyBfX3BhcmFsbGVsaXNtKQorICB7CisgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgIHNvcnQoX19iZWdpbiwgX19lbmQsIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpLCBfX3BhcmFsbGVsaXNtKTsKKyAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgaW5saW5lIHZvaWQKKyAgc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisgICAgICAgX19nbnVfcGFyYWxsZWw6OmJhbGFuY2VkX3F1aWNrc29ydF90YWcgX19wYXJhbGxlbGlzbSkKKyAgeworICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICBzb3J0KF9fYmVnaW4sIF9fZW5kLCBzdGQ6Omxlc3M8X1ZhbHVlVHlwZT4oKSwgX19wYXJhbGxlbGlzbSk7CisgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBzb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgIHNvcnQoX19iZWdpbiwgX19lbmQsIF9fY29tcCwgX19nbnVfcGFyYWxsZWw6OmRlZmF1bHRfcGFyYWxsZWxfdGFnKCkpOworICB9CisKKworICAvLyBzdGFibGVfc29ydCBpbnRlcmZhY2UKKworCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgaW5saW5lIHZvaWQKKyAgc3RhYmxlX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgeyBfR0xJQkNYWF9TVERfQTo6c3RhYmxlX3NvcnQoX19iZWdpbiwgX19lbmQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgaW5saW5lIHZvaWQKKyAgc3RhYmxlX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXAsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgeyBfR0xJQkNYWF9TVERfQTo6c3RhYmxlX3NvcnQ8X1JBSXRlciwgX0NvbXBhcmU+KAorICAgICAgX19iZWdpbiwgX19lbmQsIF9fY29tcCk7IH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlLAorICAgICAgICAgICB0eXBlbmFtZSBfUGFyYWxsZWxpc20+CisgIHZvaWQKKyAgc3RhYmxlX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXAsIF9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtKQorICB7CisgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworCisgICAgaWYgKF9fYmVnaW4gIT0gX19lbmQpCisgICAgICB7CisgICAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKSA+PQorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5zb3J0X21pbmltYWxfbikpCisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fcGFyYWxsZWxfc29ydDx0cnVlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luLCBfX2VuZCwgX19jb21wLCBfX3BhcmFsbGVsaXNtKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHN0YWJsZV9zb3J0KF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgICAgfQorICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICBpbmxpbmUgdm9pZAorICBzdGFibGVfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQpCisgIHsKKyAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgc3RhYmxlX3NvcnQoX19iZWdpbiwgX19lbmQsIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpLAorICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpkZWZhdWx0X3BhcmFsbGVsX3RhZygpKTsKKyAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgaW5saW5lIHZvaWQKKyAgc3RhYmxlX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6ZGVmYXVsdF9wYXJhbGxlbF90YWcgX19wYXJhbGxlbGlzbSkKKyAgeworICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICBzdGFibGVfc29ydChfX2JlZ2luLCBfX2VuZCwgc3RkOjpsZXNzPF9WYWx1ZVR5cGU+KCksIF9fcGFyYWxsZWxpc20pOworICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICBpbmxpbmUgdm9pZAorICBzdGFibGVfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF90YWcgX19wYXJhbGxlbGlzbSkKKyAgeworICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICBzdGFibGVfc29ydChfX2JlZ2luLCBfX2VuZCwgc3RkOjpsZXNzPF9WYWx1ZVR5cGU+KCksIF9fcGFyYWxsZWxpc20pOworICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICBpbmxpbmUgdm9pZAorICBzdGFibGVfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjptdWx0aXdheV9tZXJnZXNvcnRfdGFnIF9fcGFyYWxsZWxpc20pCisgIHsKKyAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgc3RhYmxlX3NvcnQoX19iZWdpbiwgX19lbmQsIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpLCBfX3BhcmFsbGVsaXNtKTsKKyAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgaW5saW5lIHZvaWQKKyAgc3RhYmxlX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6cXVpY2tzb3J0X3RhZyBfX3BhcmFsbGVsaXNtKQorICB7CisgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgIHN0YWJsZV9zb3J0KF9fYmVnaW4sIF9fZW5kLCBzdGQ6Omxlc3M8X1ZhbHVlVHlwZT4oKSwgX19wYXJhbGxlbGlzbSk7CisgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLCBpbnNlcnQgZGVmYXVsdCBjb21wYXJhdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgIGlubGluZSB2b2lkCisgIHN0YWJsZV9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OmJhbGFuY2VkX3F1aWNrc29ydF90YWcgX19wYXJhbGxlbGlzbSkKKyAgeworICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICBzdGFibGVfc29ydChfX2JlZ2luLCBfX2VuZCwgc3RkOjpsZXNzPF9WYWx1ZVR5cGU+KCksIF9fcGFyYWxsZWxpc20pOworICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgdm9pZAorICBzdGFibGVfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgeworICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICBzdGFibGVfc29ydCgKKyAgICAgIF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsIF9fZ251X3BhcmFsbGVsOjpkZWZhdWx0X3BhcmFsbGVsX3RhZygpKTsKKyAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBtZXJnZShfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwgX0lJdGVyMiBfX2JlZ2luMiwgCisgICAgICAgICAgX0lJdGVyMiBfX2VuZDIsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6Om1lcmdlKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19yZXN1bHQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBtZXJnZShfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwgX0lJdGVyMiBfX2JlZ2luMiwKKyAgICAgICAgICBfSUl0ZXIyIF9fZW5kMiwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXAsCisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjptZXJnZSgKKyAgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3Jlc3VsdCwgX19jb21wKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMiwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMz4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgX19tZXJnZV9zd2l0Y2goX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLAorICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yVGFnMSwgX0l0ZXJhdG9yVGFnMiwgX0l0ZXJhdG9yVGFnMykKKyAgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6Om1lcmdlKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jlc3VsdCwgX19jb21wKTsgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX21lcmdlX3N3aXRjaChfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwgCisgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLCAKKyAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXAsIAorICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIAorICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgKHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQxIC0gX19iZWdpbjEpCisgICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubWVyZ2VfbWluaW1hbF9uCisgICAgICAgICAgICAgfHwgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZDIgLSBfX2JlZ2luMikKKyAgICAgICAgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5tZXJnZV9taW5pbWFsX24pKSkKKyAgICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjpfX3BhcmFsbGVsX21lcmdlX2FkdmFuY2UoCisgICAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAoX19lbmQxIC0gX19iZWdpbjEpICsgKF9fZW5kMiAtIF9fYmVnaW4yKSwgX19jb21wKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjpfX21lcmdlX2FkdmFuY2UoCisgICAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAoX19lbmQxIC0gX19iZWdpbjEpICsgKF9fZW5kMiAtIF9fYmVnaW4yKSwgX19jb21wKTsKKyAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgbWVyZ2UoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIsIAorICAgICAgICAgIF9JSXRlcjIgX19lbmQyLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworCisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjE+IF9JSXRlclRyYWl0czE7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjI+IF9JSXRlclRyYWl0czI7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9PdXRwdXRJdGVyYXRvcj4gX09JdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMxOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czI6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX09JdGVyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfT0l0ZXJDYXRlZ29yeTsKKworICAgICAgcmV0dXJuIF9fbWVyZ2Vfc3dpdGNoKAorICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3Jlc3VsdCwgX19jb21wLAorICAgICAgICAgICAgICBfSUl0ZXJDYXRlZ29yeTEoKSwgX0lJdGVyQ2F0ZWdvcnkyKCksIF9PSXRlckNhdGVnb3J5KCkpOworICB9CisKKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLCBpbnNlcnQgZGVmYXVsdCBjb21wYXJhdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgbWVyZ2UoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIsIAorICAgICAgICAgIF9JSXRlcjIgX19lbmQyLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfSXRlcmF0b3IxVHJhaXRzOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIyPiBfSXRlcmF0b3IyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3IxVHJhaXRzOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3IyVHJhaXRzOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworCisgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6Om1lcmdlKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsCisgICAgICAgICAgICAgICAgICBfX3Jlc3VsdCwgX19nbnVfcGFyYWxsZWw6Ol9MZXNzPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4oKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIG50aF9lbGVtZW50KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX250aCwgCisgICAgICAgICAgICAgICAgX1JBSXRlciBfX2VuZCwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpudGhfZWxlbWVudChfX2JlZ2luLCBfX250aCwgX19lbmQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIG50aF9lbGVtZW50KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX250aCwgCisgICAgICAgICAgICAgICAgX1JBSXRlciBfX2VuZCwgX0NvbXBhcmUgX19jb21wLCAKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpudGhfZWxlbWVudChfX2JlZ2luLCBfX250aCwgX19lbmQsIF9fY29tcCk7IH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSB2b2lkCisgICAgbnRoX2VsZW1lbnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fbnRoLCAKKyAgICAgICAgICAgICAgICBfUkFJdGVyIF9fZW5kLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubnRoX2VsZW1lbnRfbWluaW1hbF9uKSkKKyAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fcGFyYWxsZWxfbnRoX2VsZW1lbnQoX19iZWdpbiwgX19udGgsIF9fZW5kLCBfX2NvbXApOworICAgICAgZWxzZQorICAgICAgICBudGhfZWxlbWVudChfX2JlZ2luLCBfX250aCwgX19lbmQsIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLCBpbnNlcnQgZGVmYXVsdCBjb21wYXJhdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgaW5saW5lIHZvaWQKKyAgICBudGhfZWxlbWVudChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19udGgsIAorICAgICAgICAgICAgICAgIF9SQUl0ZXIgX19lbmQpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICBfX2dudV9wYXJhbGxlbDo6bnRoX2VsZW1lbnQoX19iZWdpbiwgX19udGgsIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHBhcnRpYWxfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19taWRkbGUsIAorICAgICAgICAgICAgICAgICBfUkFJdGVyIF9fZW5kLCBfQ29tcGFyZSBfX2NvbXAsCisgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IF9HTElCQ1hYX1NURF9BOjpwYXJ0aWFsX3NvcnQoX19iZWdpbiwgX19taWRkbGUsIF9fZW5kLCBfX2NvbXApOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIGlubGluZSB2b2lkCisgICAgcGFydGlhbF9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX21pZGRsZSwgCisgICAgICAgICAgICAgICAgIF9SQUl0ZXIgX19lbmQsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IF9HTElCQ1hYX1NURF9BOjpwYXJ0aWFsX3NvcnQoX19iZWdpbiwgX19taWRkbGUsIF9fZW5kKTsgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIHBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIHBhcnRpYWxfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19taWRkbGUsIAorICAgICAgICAgICAgICAgICBfUkFJdGVyIF9fZW5kLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkucGFydGlhbF9zb3J0X21pbmltYWxfbikpCisgICAgICAgIF9fZ251X3BhcmFsbGVsOjoKKyAgICAgICAgICBfX3BhcmFsbGVsX3BhcnRpYWxfc29ydChfX2JlZ2luLCBfX21pZGRsZSwgX19lbmQsIF9fY29tcCk7CisgICAgICBlbHNlCisgICAgICAgIHBhcnRpYWxfc29ydChfX2JlZ2luLCBfX21pZGRsZSwgX19lbmQsIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIGlubGluZSB2b2lkCisgICAgcGFydGlhbF9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX21pZGRsZSwgCisgICAgICAgICAgICAgICAgIF9SQUl0ZXIgX19lbmQpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICBfX2dudV9wYXJhbGxlbDo6cGFydGlhbF9zb3J0KF9fYmVnaW4sIF9fbWlkZGxlLCBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsZXNzPF9WYWx1ZVR5cGU+KCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3I+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBtYXhfZWxlbWVudChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIAorICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6bWF4X2VsZW1lbnQoX19iZWdpbiwgX19lbmQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIG1heF9lbGVtZW50KF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgX0NvbXBhcmUgX19jb21wLCAKKyAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6Om1heF9lbGVtZW50KF9fYmVnaW4sIF9fZW5kLCBfX2NvbXApOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgX19tYXhfZWxlbWVudF9zd2l0Y2goX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wLCBfSXRlcmF0b3JUYWcpCisgICAgeyByZXR1cm4gbWF4X2VsZW1lbnQoX19iZWdpbiwgX19lbmQsIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7IH0KKworICAvLyBQYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXIKKyAgICBfX21heF9lbGVtZW50X3N3aXRjaChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsIAorICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXAsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZworICAgICAgICAgICAgICAgICAgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF9iYWxhbmNlZCkKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZCAtIF9fYmVnaW4pCisgICAgICAgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5tYXhfZWxlbWVudF9taW5pbWFsX24KKyAgICAgICAgICAgICYmIF9fZ251X3BhcmFsbGVsOjpfX2lzX3BhcmFsbGVsKF9fcGFyYWxsZWxpc21fdGFnKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfUkFJdGVyIF9fcmVzKF9fYmVnaW4pOworICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX2lkZW50aXR5X3NlbGVjdG9yPF9SQUl0ZXI+CisgICAgICAgICAgICBfX2Z1bmN0aW9uYWxpdHk7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzKAorICAgICAgICAgICAgICBfX2JlZ2luLCBfX2VuZCwgX19nbnVfcGFyYWxsZWw6Ol9Ob3RoaW5nKCksIF9fZnVuY3Rpb25hbGl0eSwKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fbWF4X2VsZW1lbnRfcmVkdWN0PF9Db21wYXJlLCBfUkFJdGVyPihfX2NvbXApLAorICAgICAgICAgICAgICBfX3JlcywgX19yZXMsIC0xLCBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBtYXhfZWxlbWVudChfX2JlZ2luLCBfX2VuZCwgX19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLCBpbnNlcnQgZGVmYXVsdCBjb21wYXJhdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3I+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBtYXhfZWxlbWVudChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIAorICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZJdGVyYXRvcj46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHJldHVybiBtYXhfZWxlbWVudChfX2JlZ2luLCBfX2VuZCwgc3RkOjpsZXNzPF9WYWx1ZVR5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgX19wYXJhbGxlbGlzbV90YWcpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgbWF4X2VsZW1lbnQoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6Om1heF9lbGVtZW50KF9fYmVnaW4sIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxlc3M8X1ZhbHVlVHlwZT4oKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBtYXhfZWxlbWVudChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9Db21wYXJlIF9fY29tcCwKKyAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICByZXR1cm4gX19tYXhfZWxlbWVudF9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fY29tcCwgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wYXJhbGxlbGlzbV90YWcpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIG1heF9lbGVtZW50KF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICByZXR1cm4gX19tYXhfZWxlbWVudF9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fY29tcCwgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSk7CisgICAgfQorCisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgbWluX2VsZW1lbnQoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCAKKyAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6Om1pbl9lbGVtZW50KF9fYmVnaW4sIF9fZW5kKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBtaW5fZWxlbWVudChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9Db21wYXJlIF9fY29tcCwgCisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjptaW5fZWxlbWVudChfX2JlZ2luLCBfX2VuZCwgX19jb21wKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIF9fbWluX2VsZW1lbnRfc3dpdGNoKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgCisgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCwgX0l0ZXJhdG9yVGFnKQorICAgIHsgcmV0dXJuIG1pbl9lbGVtZW50KF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgLy8gUGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyCisgICAgX19taW5fZWxlbWVudF9zd2l0Y2goX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcKKyAgICAgICAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfYmFsYW5jZWQpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubWluX2VsZW1lbnRfbWluaW1hbF9uCisgICAgICAgICAgICAmJiBfX2dudV9wYXJhbGxlbDo6X19pc19wYXJhbGxlbChfX3BhcmFsbGVsaXNtX3RhZykpKQorICAgICAgICB7CisgICAgICAgICAgX1JBSXRlciBfX3JlcyhfX2JlZ2luKTsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X19pZGVudGl0eV9zZWxlY3RvcjxfUkFJdGVyPgorICAgICAgICAgICAgX19mdW5jdGlvbmFsaXR5OworICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjoKKyAgICAgICAgICAgIF9fZm9yX2VhY2hfdGVtcGxhdGVfcmFuZG9tX2FjY2VzcygKKyAgICAgICAgICAgICAgX19iZWdpbiwgX19lbmQsIF9fZ251X3BhcmFsbGVsOjpfTm90aGluZygpLCBfX2Z1bmN0aW9uYWxpdHksCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX21pbl9lbGVtZW50X3JlZHVjdDxfQ29tcGFyZSwgX1JBSXRlcj4oX19jb21wKSwKKyAgICAgICAgICAgICAgX19yZXMsIF9fcmVzLCAtMSwgX19wYXJhbGxlbGlzbV90YWcpOworICAgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gbWluX2VsZW1lbnQoX19iZWdpbiwgX19lbmQsIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgbWluX2VsZW1lbnQoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCAKKyAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICByZXR1cm4gbWluX2VsZW1lbnQoX19iZWdpbiwgX19lbmQsIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvcj4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIG1pbl9lbGVtZW50KF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjptaW5fZWxlbWVudChfX2JlZ2luLCBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsZXNzPF9WYWx1ZVR5cGU+KCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgbWluX2VsZW1lbnQoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCBfQ29tcGFyZSBfX2NvbXAsCisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fbWluX2VsZW1lbnRfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsIF9JdGVyYXRvckNhdGVnb3J5KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgbWluX2VsZW1lbnQoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0ZJdGVyYXRvcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX21pbl9lbGVtZW50X3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19jb21wLCBfSXRlcmF0b3JDYXRlZ29yeSgpKTsKKyAgICB9Cit9IC8vIGVuZCBuYW1lc3BhY2UKK30gLy8gZW5kIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfQUxHT19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2FsZ29iYXNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2FsZ29iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3MzdjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYWxnb2Jhc2UuaApAQCAtMCwwICsxLDI3OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL2FsZ29iYXNlLmgKKyAqICBAYnJpZWYgUGFyYWxsZWwgU1RMIGZ1bmN0aW9uIGNhbGxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgKiAgc3RsX2FsZ29iYXNlLmggaGVhZGVyLiAgVGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGhlcmUgbWFpbmx5IGRvIGNhc2UKKyAqICBzd2l0Y2hlcyBhbmQgY2FsbCB0aGUgYWN0dWFsIHBhcmFsbGVsaXplZCB2ZXJzaW9ucyBpbiBvdGhlciBmaWxlcy4KKyAqICBJbmxpbmluZyBwb2xpY3k6IEZ1bmN0aW9ucyB0aGF0IGJhc2ljYWxseSBvbmx5IGNvbnRhaW4gb25lCisgKiAgZnVuY3Rpb24gY2FsbCwgYXJlIGRlY2xhcmVkIGlubGluZS4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIgYW5kIEZlbGl4IFB1dHplLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX0FMR09CQVNFX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfQUxHT0JBU0VfSCAxCisKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2Jhc2UuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9hbGdvcml0aG1md2QuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9maW5kLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvZmluZF9zZWxlY3RvcnMuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19wYXJhbGxlbAoreworICAvLyBOQjogZXF1YWwgYW5kIGxleGljb2dyYXBoaWNhbF9jb21wYXJlIHJlcXVpcmUgbWlzbWF0Y2guCisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyPgorICAgIGlubGluZSBwYWlyPF9JSXRlcjEsIF9JSXRlcjI+CisgICAgbWlzbWF0Y2goX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIsCisgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjptaXNtYXRjaChfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMik7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIHBhaXI8X0lJdGVyMSwgX0lJdGVyMj4KKyAgICBtaXNtYXRjaChfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwgX0lJdGVyMiBfX2JlZ2luMiwKKyAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjptaXNtYXRjaChfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19wcmVkKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMj4KKyAgICBpbmxpbmUgcGFpcjxfSUl0ZXIxLCBfSUl0ZXIyPgorICAgIF9fbWlzbWF0Y2hfc3dpdGNoKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCBfSUl0ZXIyIF9fYmVnaW4yLAorICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBfSXRlcmF0b3JUYWcxLCBfSXRlcmF0b3JUYWcyKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjptaXNtYXRjaChfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19wcmVkKTsgfQorCisgIC8vIFBhcmFsbGVsIG1pc21hdGNoIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgcGFpcjxfUkFJdGVyMSwgX1JBSXRlcjI+CisgICAgX19taXNtYXRjaF9zd2l0Y2goX1JBSXRlcjEgX19iZWdpbjEsIF9SQUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMiBfX2JlZ2luMiwgX1ByZWRpY2F0ZSBfX3ByZWQsIAorICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgX1JBSXRlcjEgX19yZXMgPQorICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fZmluZF90ZW1wbGF0ZShfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWlzbWF0Y2hfc2VsZWN0b3IoKSkuZmlyc3Q7CisgICAgICAgICAgcmV0dXJuIG1ha2VfcGFpcihfX3JlcyAsIF9fYmVnaW4yICsgKF9fcmVzIC0gX19iZWdpbjEpKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX0dMSUJDWFhfU1REX0E6Om1pc21hdGNoKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX3ByZWQpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgaW5saW5lIHBhaXI8X0lJdGVyMSwgX0lJdGVyMj4KKyAgICBtaXNtYXRjaChfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwgX0lJdGVyMiBfX2JlZ2luMikKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjE+IF9JdGVyYXRvcjFUcmFpdHM7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjI+IF9JdGVyYXRvcjJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjFUcmFpdHM6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjJUcmFpdHM6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjFUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yMlRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnkyOworCisgICAgICB0eXBlZGVmIF9fZ251X3BhcmFsbGVsOjpfRXF1YWxUbzxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+IF9FcXVhbFRvOworCisgICAgICByZXR1cm4gX19taXNtYXRjaF9zd2l0Y2goX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9FcXVhbFRvKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yQ2F0ZWdvcnkxKCksIF9JdGVyYXRvckNhdGVnb3J5MigpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBwYWlyPF9JSXRlcjEsIF9JSXRlcjI+CisgICAgbWlzbWF0Y2goX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIsCisgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfSXRlcmF0b3IxVHJhaXRzOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIyPiBfSXRlcmF0b3IyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3IxVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5MjsKKworICAgICAgcmV0dXJuIF9fbWlzbWF0Y2hfc3dpdGNoKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yQ2F0ZWdvcnkxKCksIF9JdGVyYXRvckNhdGVnb3J5MigpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyPgorICAgIGlubGluZSBib29sCisgICAgZXF1YWwoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIsIAorICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6ZXF1YWwoX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBib29sCisgICAgZXF1YWwoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIsIAorICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmVxdWFsKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX3ByZWQpOyB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyPgorICAgIGlubGluZSBib29sCisgICAgZXF1YWwoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIpCisgICAgeworICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjptaXNtYXRjaChfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMikuZmlyc3QKKyAgICAgICAgICAgICAgPT0gX19lbmQxOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBlcXVhbChfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwgX0lJdGVyMiBfX2JlZ2luMiwgCisgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjptaXNtYXRjaChfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19wcmVkKS5maXJzdAorICAgICAgICAgICAgICA9PSBfX2VuZDE7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfX2JlZ2luMSwgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luMiwgX19lbmQyKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoCisgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3ByZWQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWcxLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWcyPgorICAgIGlubGluZSBib29sCisgICAgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV9zd2l0Y2goX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2JlZ2luMiwgX0lJdGVyMiBfX2VuZDIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZzEsIF9JdGVyYXRvclRhZzIpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19wcmVkKTsgfQorCisgIC8vIFBhcmFsbGVsIGxleGljb2dyYXBoaWNhbF9jb21wYXJlIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycworICAvLyBMaW1pdGF0aW9uOiBCb3RoIHZhbHVldHlwZXMgbXVzdCBiZSB0aGUgc2FtZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgYm9vbAorICAgIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfc3dpdGNoKF9SQUl0ZXIxIF9fYmVnaW4xLCBfUkFJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjIgX19iZWdpbjIsIF9SQUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTih0cnVlKSkKKyAgICAgICAgeworICAgICAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPiBfVHJhaXRzVHlwZTE7CisgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTE6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTE7CisKKyAgICAgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMj4gX1RyYWl0c1R5cGUyOworICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGUyOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworCisgICAgICAgICAgdHlwZWRlZiBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICAgICAgICBfRXF1YWxGcm9tTGVzczxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTIsIF9QcmVkaWNhdGU+CisgICAgICAgICAgICAgICAgICBfRXF1YWxGcm9tTGVzc0NvbXBhcmU7CisKKyAgICAgICAgICAvLyBMb25nZXIgc2VxdWVuY2UgaW4gZmlyc3QgcGxhY2UuCisgICAgICAgICAgaWYgKChfX2VuZDEgLSBfX2JlZ2luMSkgPCAoX19lbmQyIC0gX19iZWdpbjIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB0eXBlZGVmIHBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIyPiBfU3BvdFR5cGU7CisgICAgICAgICAgICAgIF9TcG90VHlwZSBfX21tID0gX19taXNtYXRjaF9zd2l0Y2goX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0VxdWFsRnJvbUxlc3NDb21wYXJlKF9fcHJlZCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpKTsKKworICAgICAgICAgICAgICByZXR1cm4gKF9fbW0uZmlyc3QgPT0gX19lbmQxKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgYm9vbChfX3ByZWQoKl9fbW0uZmlyc3QsICpfX21tLnNlY29uZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdHlwZWRlZiBwYWlyPF9SQUl0ZXIyLCBfUkFJdGVyMT4gX1Nwb3RUeXBlOworICAgICAgICAgICAgICBfU3BvdFR5cGUgX19tbSA9IF9fbWlzbWF0Y2hfc3dpdGNoKF9fYmVnaW4yLCBfX2VuZDIsIF9fYmVnaW4xLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9FcXVhbEZyb21MZXNzQ29tcGFyZShfX3ByZWQpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKSk7CisKKyAgICAgICAgICAgICAgcmV0dXJuIChfX21tLmZpcnN0ICE9IF9fZW5kMikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGJvb2woX19wcmVkKCpfX21tLnNlY29uZCwgKl9fbW0uZmlyc3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKAorICAgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3ByZWQpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgaW5saW5lIGJvb2wKKyAgICBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMikKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfVHJhaXRzVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlMTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGUxOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTE7CisKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcjI+IF9UcmFpdHNUeXBlMjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGUyOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTI6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5MjsKKyAgICAgIHR5cGVkZWYgX19nbnVfcGFyYWxsZWw6Ol9MZXNzPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4gX0xlc3NUeXBlOworCisgICAgICByZXR1cm4gX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV9zd2l0Y2goCisgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfTGVzc1R5cGUoKSwKKyAgICAgICAgICAgICAgIF9JdGVyYXRvckNhdGVnb3J5MSgpLCBfSXRlcmF0b3JDYXRlZ29yeTIoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcjE+IF9UcmFpdHNUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGUxOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTE7CisKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcjI+IF9UcmFpdHNUeXBlMjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGUyOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTI7CisKKyAgICAgIHJldHVybiBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlX3N3aXRjaCgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcHJlZCwKKyAgICAgICAgICAgICAgIF9JdGVyYXRvckNhdGVnb3J5MSgpLCBfSXRlcmF0b3JDYXRlZ29yeTIoKSk7CisgICAgfQorfSAvLyBlbmQgbmFtZXNwYWNlCit9IC8vIGVuZCBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX0FMR09CQVNFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYWxnb3JpdGhtIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9hbGdvcml0aG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjZjJiNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYWxnb3JpdGhtCkBAIC0wLDAgKzEsMzkgQEAKKy8vIEFsZ29yaXRobSBleHRlbnNpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9hbGdvcml0aG0KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9QQVJBTExFTF9BTEdPUklUSE0KKyNkZWZpbmUgX1BBUkFMTEVMX0FMR09SSVRITSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxwYXJhbGxlbC9hbGdvcml0aG1md2QuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2FsZ28uaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2FsZ29yaXRobWZ3ZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9hbGdvcml0aG1md2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWE4YTVhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9hbGdvcml0aG1md2QuaApAQCAtMCwwICsxLDkwOCBAQAorLy8gPHBhcmFsbGVsL2FsZ29yaXRobT4gRm9yd2FyZCBkZWNsYXJhdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL2FsZ29yaXRobWZ3ZC5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9BTEdPUklUSE1GV0RfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9BTEdPUklUSE1GV0RfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPHBhcmFsbGVsL3RhZ3MuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9zZXR0aW5ncy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3BhcmFsbGVsCit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBfRkl0ZXIKKyAgICBhZGphY2VudF9maW5kKF9GSXRlciwgX0ZJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0ZJdGVyCisgICAgYWRqYWNlbnRfZmluZChfRkl0ZXIsIF9GSXRlciwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9JdGVyVGFnPgorICAgIF9GSXRlcgorICAgIF9fYWRqYWNlbnRfZmluZF9zd2l0Y2goX0ZJdGVyLCBfRkl0ZXIsIF9JdGVyVGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIF9SQUl0ZXIKKyAgICBfX2FkamFjZW50X2ZpbmRfc3dpdGNoKF9SQUl0ZXIsIF9SQUl0ZXIsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0JpUHJlZGljYXRlPgorICAgIF9GSXRlcgorICAgIGFkamFjZW50X2ZpbmQoX0ZJdGVyLCBfRkl0ZXIsIF9CaVByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQmlQcmVkaWNhdGU+CisgICAgX0ZJdGVyCisgICAgYWRqYWNlbnRfZmluZChfRkl0ZXIsIF9GSXRlciwgX0JpUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9CaVByZWRpY2F0ZSwgdHlwZW5hbWUgX0l0ZXJUYWc+CisgICAgX0ZJdGVyCisgICAgX19hZGphY2VudF9maW5kX3N3aXRjaChfRkl0ZXIsIF9GSXRlciwgX0JpUHJlZGljYXRlLCBfSXRlclRhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0JpUHJlZGljYXRlPgorICAgIF9SQUl0ZXIKKyAgICBfX2FkamFjZW50X2ZpbmRfc3dpdGNoKF9SQUl0ZXIsIF9SQUl0ZXIsIF9CaVByZWRpY2F0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpOworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGNvdW50KF9JSXRlciwgX0lJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgY291bnQoX0lJdGVyLCBfSUl0ZXIsIGNvbnN0IF9UcCYsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGNvdW50KF9JSXRlciwgX0lJdGVyLCBjb25zdCBfVHAmLCBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0l0ZXJUYWc+CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fY291bnRfc3dpdGNoKF9JSXRlciwgX0lJdGVyLCBjb25zdCBfVHAmLCBfSXRlclRhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19jb3VudF9zd2l0Y2goX1JBSXRlciwgX1JBSXRlciwgY29uc3QgX1RwJiwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbQorICAgICAgICAgICAgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF91bmJhbGFuY2VkKTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgY291bnRfaWYoX0lJdGVyLCBfSUl0ZXIsIF9QcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgY291bnRfaWYoX0lJdGVyLCBfSUl0ZXIsIF9QcmVkaWNhdGUsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBjb3VudF9pZihfSUl0ZXIsIF9JSXRlciwgX1ByZWRpY2F0ZSwgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfSXRlclRhZz4KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19jb3VudF9pZl9zd2l0Y2goX0lJdGVyLCBfSUl0ZXIsIF9QcmVkaWNhdGUsIF9JdGVyVGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19jb3VudF9pZl9zd2l0Y2goX1JBSXRlciwgX1JBSXRlciwgX1ByZWRpY2F0ZSwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbQorICAgICAgICAgICAgICAgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF91bmJhbGFuY2VkKTsKKworICAvLyBhbGdvYmFzZS5oCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgYm9vbAorICAgIGVxdWFsKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBib29sCisgICAgZXF1YWwoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX1ByZWRpY2F0ZSwKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgYm9vbAorICAgIGVxdWFsKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgYm9vbAorICAgIGVxdWFsKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9QcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9JSXRlcgorICAgIGZpbmQoX0lJdGVyLCBfSUl0ZXIsIGNvbnN0IF9UcCYsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgX0lJdGVyCisgICAgZmluZChfSUl0ZXIsIF9JSXRlciwgY29uc3QgX1RwJiBfX3ZhbCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9JdGVyVGFnPgorICAgIF9JSXRlcgorICAgIF9fZmluZF9zd2l0Y2goX0lJdGVyLCBfSUl0ZXIsIGNvbnN0IF9UcCYsIF9JdGVyVGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgX1JBSXRlcgorICAgIF9fZmluZF9zd2l0Y2goX1JBSXRlciwgX1JBSXRlciwgY29uc3QgX1RwJiwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfSUl0ZXIKKyAgICBmaW5kX2lmKF9JSXRlciwgX0lJdGVyLCBfUHJlZGljYXRlLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfSUl0ZXIKKyAgICBmaW5kX2lmKF9JSXRlciwgX0lJdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9JdGVyVGFnPgorICAgIF9JSXRlcgorICAgIF9fZmluZF9pZl9zd2l0Y2goX0lJdGVyLCBfSUl0ZXIsIF9QcmVkaWNhdGUsIF9JdGVyVGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9SQUl0ZXIKKyAgICBfX2ZpbmRfaWZfc3dpdGNoKF9SQUl0ZXIsIF9SQUl0ZXIsIF9QcmVkaWNhdGUsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9GSXRlcj4KKyAgICBfSUl0ZXIKKyAgICBmaW5kX2ZpcnN0X29mKF9JSXRlciwgX0lJdGVyLCBfRkl0ZXIsIF9GSXRlciwKKyAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9CaVByZWRpY2F0ZT4KKyAgICBfSUl0ZXIKKyAgICBmaW5kX2ZpcnN0X29mKF9JSXRlciwgX0lJdGVyLCBfRkl0ZXIsIF9GSXRlciwgX0JpUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0JpUHJlZGljYXRlPgorICAgIF9JSXRlcgorICAgIGZpbmRfZmlyc3Rfb2YoX0lJdGVyLCBfSUl0ZXIsIF9GSXRlciwgX0ZJdGVyLCBfQmlQcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX0ZJdGVyPgorICAgIF9JSXRlcgorICAgIGZpbmRfZmlyc3Rfb2YoX0lJdGVyLCBfSUl0ZXIsIF9GSXRlciwgX0ZJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9GSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJUYWcxLCB0eXBlbmFtZSBfSXRlclRhZzI+CisgICAgX0lJdGVyCisgICAgX19maW5kX2ZpcnN0X29mX3N3aXRjaCgKKyAgICAgIF9JSXRlciwgX0lJdGVyLCBfRkl0ZXIsIF9GSXRlciwgX0l0ZXJUYWcxLCBfSXRlclRhZzIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0JpUHJlZGljYXRlLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlclRhZz4KKyAgICBfUkFJdGVyCisgICAgX19maW5kX2ZpcnN0X29mX3N3aXRjaChfUkFJdGVyLCBfUkFJdGVyLCBfRkl0ZXIsIF9GSXRlciwgX0JpUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBfSXRlclRhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9CaVByZWRpY2F0ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJUYWcxLCB0eXBlbmFtZSBfSXRlclRhZzI+CisgICAgX0lJdGVyCisgICAgX19maW5kX2ZpcnN0X29mX3N3aXRjaChfSUl0ZXIsIF9JSXRlciwgX0ZJdGVyLCBfRkl0ZXIsIF9CaVByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfSXRlclRhZzEsIF9JdGVyVGFnMik7CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9GdW5jdGlvbj4KKyAgICBfRnVuY3Rpb24KKyAgICBmb3JfZWFjaChfSUl0ZXIsIF9JSXRlciwgX0Z1bmN0aW9uKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9GdW5jdGlvbj4KKyAgICBfRnVuY3Rpb24KKyAgICBmb3JfZWFjaChfSUl0ZXIsIF9JSXRlciwgX0Z1bmN0aW9uLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0Z1bmN0aW9uPgorICAgIF9GdW5jdGlvbgorICAgIGZvcl9lYWNoKF9JdGVyYXRvciwgX0l0ZXJhdG9yLCBfRnVuY3Rpb24sIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX0Z1bmN0aW9uLCB0eXBlbmFtZSBfSXRlclRhZz4KKyAgICBfRnVuY3Rpb24KKyAgICBfX2Zvcl9lYWNoX3N3aXRjaChfSUl0ZXIsIF9JSXRlciwgX0Z1bmN0aW9uLCBfSXRlclRhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0Z1bmN0aW9uPgorICAgIF9GdW5jdGlvbgorICAgIF9fZm9yX2VhY2hfc3dpdGNoKF9SQUl0ZXIsIF9SQUl0ZXIsIF9GdW5jdGlvbiwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gIF9fcGFyYWxsZWxpc20KKyAgICAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfYmFsYW5jZWQpOworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIHZvaWQKKyAgICBnZW5lcmF0ZShfRkl0ZXIsIF9GSXRlciwgX0dlbmVyYXRvcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIHZvaWQKKyAgICBnZW5lcmF0ZShfRkl0ZXIsIF9GSXRlciwgX0dlbmVyYXRvciwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgdm9pZAorICAgIGdlbmVyYXRlKF9GSXRlciwgX0ZJdGVyLCBfR2VuZXJhdG9yLCBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9HZW5lcmF0b3IsIHR5cGVuYW1lIF9JdGVyVGFnPgorICAgIHZvaWQKKyAgICBfX2dlbmVyYXRlX3N3aXRjaChfRkl0ZXIsIF9GSXRlciwgX0dlbmVyYXRvciwgX0l0ZXJUYWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgdm9pZAorICAgIF9fZ2VuZXJhdGVfc3dpdGNoKF9SQUl0ZXIsIF9SQUl0ZXIsIF9HZW5lcmF0b3IsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc20KKyAgICAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfYmFsYW5jZWQpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgX09JdGVyCisgICAgZ2VuZXJhdGVfbihfT0l0ZXIsIF9TaXplLCBfR2VuZXJhdG9yKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIF9PSXRlcgorICAgIGdlbmVyYXRlX24oX09JdGVyLCBfU2l6ZSwgX0dlbmVyYXRvciwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIF9PSXRlcgorICAgIGdlbmVyYXRlX24oX09JdGVyLCBfU2l6ZSwgX0dlbmVyYXRvciwgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0dlbmVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJUYWc+CisgICAgX09JdGVyCisgICAgX19nZW5lcmF0ZV9uX3N3aXRjaChfT0l0ZXIsIF9TaXplLCBfR2VuZXJhdG9yLCBfSXRlclRhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgX1JBSXRlcgorICAgIF9fZ2VuZXJhdGVfbl9zd2l0Y2goX1JBSXRlciwgX1NpemUsIF9HZW5lcmF0b3IsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbQorICAgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX2JhbGFuY2VkKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyPgorICAgIGJvb2wKKyAgICBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBib29sCisgICAgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgYm9vbAorICAgIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgYm9vbAorICAgIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9QcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9JdGVyVGFnMSwgdHlwZW5hbWUgX0l0ZXJUYWcyPgorICAgIGJvb2wKKyAgICBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlX3N3aXRjaChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlLCBfSXRlclRhZzEsIF9JdGVyVGFnMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGJvb2wKKyAgICBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlX3N3aXRjaChfUkFJdGVyMSwgX1JBSXRlcjEsIF9SQUl0ZXIyLCBfUkFJdGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworICAvLyBhbGdvLmgKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMj4KKyAgICBwYWlyPF9JSXRlcjEsIF9JSXRlcjI+CisgICAgbWlzbWF0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIHBhaXI8X0lJdGVyMSwgX0lJdGVyMj4KKyAgICBtaXNtYXRjaChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfUHJlZGljYXRlLAorICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMj4KKyAgICBwYWlyPF9JSXRlcjEsIF9JSXRlcjI+CisgICAgbWlzbWF0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBwYWlyPF9JSXRlcjEsIF9JSXRlcjI+CisgICAgbWlzbWF0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJUYWcxLCB0eXBlbmFtZSBfSXRlclRhZzI+CisgICAgcGFpcjxfSUl0ZXIxLCBfSUl0ZXIyPgorICAgIF9fbWlzbWF0Y2hfc3dpdGNoKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9QcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgIF9JdGVyVGFnMSwgX0l0ZXJUYWcyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgcGFpcjxfUkFJdGVyMSwgX1JBSXRlcjI+CisgICAgX19taXNtYXRjaF9zd2l0Y2goX1JBSXRlcjEsIF9SQUl0ZXIxLCBfUkFJdGVyMiwgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyPgorICAgIF9GSXRlcjEKKyAgICBzZWFyY2goX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMiwgX0ZJdGVyMiwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyPgorICAgIF9GSXRlcjEKKyAgICBzZWFyY2goX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMiwgX0ZJdGVyMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMiwgdHlwZW5hbWUgX0JpUHJlZGljYXRlPgorICAgIF9GSXRlcjEKKyAgICBzZWFyY2goX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMiwgX0ZJdGVyMiwgX0JpUHJlZGljYXRlLAorICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcjEsIHR5cGVuYW1lIF9GSXRlcjIsIHR5cGVuYW1lIF9CaVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIxCisgICAgc2VhcmNoKF9GSXRlcjEsIF9GSXRlcjEsIF9GSXRlcjIsIF9GSXRlcjIsIF9CaVByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyPgorICAgIF9SQUl0ZXIxCisgICAgX19zZWFyY2hfc3dpdGNoKF9SQUl0ZXIxLCBfUkFJdGVyMSwgX1JBSXRlcjIsIF9SQUl0ZXIyLAorICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyLCB0eXBlbmFtZSBfSXRlclRhZzEsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyVGFnMj4KKyAgICBfRkl0ZXIxCisgICAgX19zZWFyY2hfc3dpdGNoKF9GSXRlcjEsIF9GSXRlcjEsIF9GSXRlcjIsIF9GSXRlcjIsIF9JdGVyVGFnMSwgX0l0ZXJUYWcyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsIHR5cGVuYW1lIF9CaVByZWRpY2F0ZT4KKyAgICBfUkFJdGVyMQorICAgIF9fc2VhcmNoX3N3aXRjaChfUkFJdGVyMSwgX1JBSXRlcjEsIF9SQUl0ZXIyLCBfUkFJdGVyMiwgX0JpUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyLCB0eXBlbmFtZSBfQmlQcmVkaWNhdGUsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyVGFnMSwgdHlwZW5hbWUgX0l0ZXJUYWcyPgorICAgIF9GSXRlcjEKKyAgICBfX3NlYXJjaF9zd2l0Y2goX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMiwgX0ZJdGVyMiwgX0JpUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgX0l0ZXJUYWcxLCBfSXRlclRhZzIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBfRkl0ZXIKKyAgICBzZWFyY2hfbihfRkl0ZXIsIF9GSXRlciwgX0ludGVnZXIsIGNvbnN0IF9UcCYsCisgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIKKyAgICBzZWFyY2hfbihfRkl0ZXIsIF9GSXRlciwgX0ludGVnZXIsIGNvbnN0IF9UcCYsIF9CaVByZWRpY2F0ZSwKKyAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHA+CisgICAgX0ZJdGVyCisgICAgc2VhcmNoX24oX0ZJdGVyLCBfRkl0ZXIsIF9JbnRlZ2VyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIKKyAgICBzZWFyY2hfbihfRkl0ZXIsIF9GSXRlciwgX0ludGVnZXIsIGNvbnN0IF9UcCYsIF9CaVByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpUHJlZGljYXRlPgorICAgIF9SQUl0ZXIKKyAgICBfX3NlYXJjaF9uX3N3aXRjaChfUkFJdGVyLCBfUkFJdGVyLCBfSW50ZWdlciwgY29uc3QgX1RwJiwKKyAgICAgICAgICAgICAgICAgICAgX0JpUHJlZGljYXRlLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfSW50ZWdlciwgdHlwZW5hbWUgX1RwLAorICAgICAgICAgICB0eXBlbmFtZSBfQmlQcmVkaWNhdGUsIHR5cGVuYW1lIF9JdGVyVGFnPgorICAgIF9GSXRlcgorICAgIF9fc2VhcmNoX25fc3dpdGNoKF9GSXRlciwgX0ZJdGVyLCBfSW50ZWdlciwgY29uc3QgX1RwJiwKKyAgICAgICAgICAgICAgICAgICAgX0JpUHJlZGljYXRlLCBfSXRlclRhZyk7CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX1VuYXJ5T3BlcmF0aW9uPgorICAgIF9PSXRlcgorICAgIHRyYW5zZm9ybShfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBfVW5hcnlPcGVyYXRpb24pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfVW5hcnlPcGVyYXRpb24+CisgICAgX09JdGVyCisgICAgdHJhbnNmb3JtKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9VbmFyeU9wZXJhdGlvbiwgCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9VbmFyeU9wZXJhdGlvbj4KKyAgICBfT0l0ZXIKKyAgICB0cmFuc2Zvcm0oX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX1VuYXJ5T3BlcmF0aW9uLCAKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9VbmFyeU9wZXJhdGlvbiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJUYWcxLCB0eXBlbmFtZSBfSXRlclRhZzI+CisgICAgX09JdGVyCisgICAgX190cmFuc2Zvcm0xX3N3aXRjaChfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBfVW5hcnlPcGVyYXRpb24sIAorICAgICAgICAgICAgICAgICAgICAgIF9JdGVyVGFnMSwgX0l0ZXJUYWcyKTsKKyAgICAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJSXRlciwgdHlwZW5hbWUgX1JBT0l0ZXIsIHR5cGVuYW1lIF9VbmFyeU9wZXJhdGlvbj4KKyAgICBfUkFPSXRlcgorICAgIF9fdHJhbnNmb3JtMV9zd2l0Y2goX1JBSUl0ZXIsIF9SQUlJdGVyLCBfUkFPSXRlciwgX1VuYXJ5T3BlcmF0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIAorICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbQorICAgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX2JhbGFuY2VkKTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpT3BlcmF0aW9uPgorICAgIF9PSXRlcgorICAgIHRyYW5zZm9ybShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfT0l0ZXIsIF9CaU9wZXJhdGlvbik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfQmlPcGVyYXRpb24+CisgICAgX09JdGVyCisgICAgdHJhbnNmb3JtKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9PSXRlciwgX0JpT3BlcmF0aW9uLCAKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaU9wZXJhdGlvbj4KKyAgICBfT0l0ZXIKKyAgICB0cmFuc2Zvcm0oX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX09JdGVyLCBfQmlPcGVyYXRpb24sIAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsIHR5cGVuYW1lIF9SQUl0ZXIzLAorICAgICAgICAgICB0eXBlbmFtZSBfQmlPcGVyYXRpb24+CisgICAgX1JBSXRlcjMKKyAgICBfX3RyYW5zZm9ybTJfc3dpdGNoKF9SQUl0ZXIxLCBfUkFJdGVyMSwgX1JBSXRlcjIsIF9SQUl0ZXIzLCBfQmlPcGVyYXRpb24sIAorICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtCisgICAgICAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfYmFsYW5jZWQpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpT3BlcmF0aW9uLCB0eXBlbmFtZSBfVGFnMSwKKyAgICAgICAgICAgdHlwZW5hbWUgX1RhZzIsIHR5cGVuYW1lIF9UYWczPgorICAgIF9PSXRlcgorICAgIF9fdHJhbnNmb3JtMl9zd2l0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX09JdGVyLCBfQmlPcGVyYXRpb24sIAorICAgICAgICAgICAgICAgICAgICAgIF9UYWcxLCBfVGFnMiwgX1RhZzMpOworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIHJlcGxhY2UoX0ZJdGVyLCBfRkl0ZXIsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICByZXBsYWNlKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmLCBjb25zdCBfVHAmLCAKKyAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIHJlcGxhY2UoX0ZJdGVyLCBfRkl0ZXIsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCYsCisgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0l0ZXJUYWc+CisgICAgdm9pZAorICAgIF9fcmVwbGFjZV9zd2l0Y2goX0ZJdGVyLCBfRkl0ZXIsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCYsIF9JdGVyVGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fcmVwbGFjZV9zd2l0Y2goX1JBSXRlciwgX1JBSXRlciwgY29uc3QgX1RwJiwgY29uc3QgX1RwJiwgCisgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20pOworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIHJlcGxhY2VfaWYoX0ZJdGVyLCBfRkl0ZXIsIF9QcmVkaWNhdGUsIGNvbnN0IF9UcCYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICByZXBsYWNlX2lmKF9GSXRlciwgX0ZJdGVyLCBfUHJlZGljYXRlLCBjb25zdCBfVHAmLAorICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgcmVwbGFjZV9pZihfRkl0ZXIsIF9GSXRlciwgX1ByZWRpY2F0ZSwgY29uc3QgX1RwJiwKKyAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1RwLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlclRhZz4KKyAgICB2b2lkCisgICAgX19yZXBsYWNlX2lmX3N3aXRjaChfRkl0ZXIsIF9GSXRlciwgX1ByZWRpY2F0ZSwgY29uc3QgX1RwJiwgX0l0ZXJUYWcpOworIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fcmVwbGFjZV9pZl9zd2l0Y2goX1JBSXRlciwgX1JBSXRlciwgX1ByZWRpY2F0ZSwgY29uc3QgX1RwJiwKKyAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtKTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBfRkl0ZXIKKyAgICBtYXhfZWxlbWVudChfRkl0ZXIsIF9GSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyPgorICAgIF9GSXRlcgorICAgIG1heF9lbGVtZW50KF9GSXRlciwgX0ZJdGVyLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBfRkl0ZXIKKyAgICBtYXhfZWxlbWVudChfRkl0ZXIsIF9GSXRlciwgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfRkl0ZXIKKyAgICBtYXhfZWxlbWVudChfRkl0ZXIsIF9GSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZJdGVyCisgICAgbWF4X2VsZW1lbnQoX0ZJdGVyLCBfRkl0ZXIsIF9Db21wYXJlLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZJdGVyCisgICAgbWF4X2VsZW1lbnQoX0ZJdGVyLCBfRkl0ZXIsIF9Db21wYXJlLCBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfSXRlclRhZz4KKyAgICBfRkl0ZXIKKyAgICBfX21heF9lbGVtZW50X3N3aXRjaChfRkl0ZXIsIF9GSXRlciwgX0NvbXBhcmUsIF9JdGVyVGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyCisgICAgX19tYXhfZWxlbWVudF9zd2l0Y2goCisgICAgICBfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc20KKyAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX2JhbGFuY2VkKTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIKKyAgICBtZXJnZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsIAorICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT0l0ZXIKKyAgICBtZXJnZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsIF9Db21wYXJlLCAKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX09JdGVyCisgICAgbWVyZ2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIG1lcmdlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0l0ZXJUYWcxLCB0eXBlbmFtZSBfSXRlclRhZzIsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyVGFnMz4KKyAgICBfT0l0ZXIKKyAgICBfX21lcmdlX3N3aXRjaChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsIF9Db21wYXJlLCAKKyAgICAgICAgICAgICAgICAgX0l0ZXJUYWcxLCBfSXRlclRhZzIsIF9JdGVyVGFnMyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT0l0ZXIKKyAgICBfX21lcmdlX3N3aXRjaChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsIF9Db21wYXJlLCAKKyAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCAKKyAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpOworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyPgorICAgIF9GSXRlcgorICAgIG1pbl9lbGVtZW50KF9GSXRlciwgX0ZJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0ZJdGVyCisgICAgbWluX2VsZW1lbnQoX0ZJdGVyLCBfRkl0ZXIsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyPgorICAgIF9GSXRlcgorICAgIG1pbl9lbGVtZW50KF9GSXRlciwgX0ZJdGVyLAorICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZJdGVyCisgICAgbWluX2VsZW1lbnQoX0ZJdGVyLCBfRkl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlcgorICAgIG1pbl9lbGVtZW50KF9GSXRlciwgX0ZJdGVyLCBfQ29tcGFyZSwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlcgorICAgIG1pbl9lbGVtZW50KF9GSXRlciwgX0ZJdGVyLCBfQ29tcGFyZSwgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0l0ZXJUYWc+CisgICAgX0ZJdGVyCisgICAgX19taW5fZWxlbWVudF9zd2l0Y2goX0ZJdGVyLCBfRkl0ZXIsIF9Db21wYXJlLCBfSXRlclRhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlcgorICAgIF9fbWluX2VsZW1lbnRfc3dpdGNoKAorICAgICAgX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtCisgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF9iYWxhbmNlZCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkCisgICAgbnRoX2VsZW1lbnQoX1JBSXRlciwgX1JBSXRlciwgX1JBSXRlciwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgbnRoX2VsZW1lbnQoX1JBSXRlciwgX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUsCisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgbnRoX2VsZW1lbnQoX1JBSXRlciwgX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgdm9pZAorICAgIG50aF9lbGVtZW50KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBwYXJ0aWFsX3NvcnQoX1JBSXRlciwgX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUsCisgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkCisgICAgcGFydGlhbF9zb3J0KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIHBhcnRpYWxfc29ydChfUkFJdGVyLCBfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkCisgICAgcGFydGlhbF9zb3J0KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfRkl0ZXIKKyAgICBwYXJ0aXRpb24oX0ZJdGVyLCBfRkl0ZXIsIF9QcmVkaWNhdGUsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisgICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfRkl0ZXIKKyAgICBwYXJ0aXRpb24oX0ZJdGVyLCBfRkl0ZXIsIF9QcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX0l0ZXJUYWc+CisgICAgX0ZJdGVyCisgICAgX19wYXJ0aXRpb25fc3dpdGNoKF9GSXRlciwgX0ZJdGVyLCBfUHJlZGljYXRlLCBfSXRlclRhZyk7CisgICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX1JBSXRlcgorICAgIF9fcGFydGl0aW9uX3N3aXRjaCgKKyAgICAgIF9SQUl0ZXIsIF9SQUl0ZXIsIF9QcmVkaWNhdGUsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQKKyAgICByYW5kb21fc2h1ZmZsZShfUkFJdGVyLCBfUkFJdGVyLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgdm9pZAorICAgIHJhbmRvbV9zaHVmZmxlKF9SQUl0ZXIsIF9SQUl0ZXIsIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImLAorICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkCisgICAgcmFuZG9tX3NodWZmbGUoX1JBSXRlciwgX1JBSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICB2b2lkCisgICAgcmFuZG9tX3NodWZmbGUoX1JBSXRlciwgX1JBSXRlciwKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisJCSAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImJik7CisjZWxzZQorCQkgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJik7CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyCisgICAgc2V0X3VuaW9uKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwKKyAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PSXRlcgorICAgIHNldF91bmlvbihfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsIF9QcmVkaWNhdGUsCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIHNldF91bmlvbihfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT0l0ZXIgCisgICAgc2V0X3VuaW9uKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfSXRlclRhZzEsIHR5cGVuYW1lIF9JdGVyVGFnMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJUYWczPgorICAgIF9PSXRlcgorICAgIF9fc2V0X3VuaW9uX3N3aXRjaChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsCisgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlLCBfSXRlclRhZzEsIF9JdGVyVGFnMiwgX0l0ZXJUYWczKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsIHR5cGVuYW1lIF9PdXRwdXRfUkFJdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PdXRwdXRfUkFJdGVyCisgICAgX19zZXRfdW5pb25fc3dpdGNoKF9SQUl0ZXIxLCBfUkFJdGVyMSwgX1JBSXRlcjIsIF9SQUl0ZXIyLCBfT3V0cHV0X1JBSXRlciwKKyAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyCisgICAgc2V0X2ludGVyc2VjdGlvbihfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsCisgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT0l0ZXIKKyAgICBzZXRfaW50ZXJzZWN0aW9uKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIHNldF9pbnRlcnNlY3Rpb24oX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX09JdGVyIAorICAgIHNldF9pbnRlcnNlY3Rpb24oX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlLAorICAgICAgICAgICB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9JdGVyVGFnMSwgdHlwZW5hbWUgX0l0ZXJUYWcyLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlclRhZzM+CisgICAgX09JdGVyCisgICAgX19zZXRfaW50ZXJzZWN0aW9uX3N3aXRjaChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSwgX0l0ZXJUYWcxLCBfSXRlclRhZzIsIF9JdGVyVGFnMyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLCB0eXBlbmFtZSBfT3V0cHV0X1JBSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT3V0cHV0X1JBSXRlcgorICAgIF9fc2V0X2ludGVyc2VjdGlvbl9zd2l0Y2goX1JBSXRlcjEsIF9SQUl0ZXIxLCBfUkFJdGVyMiwgX1JBSXRlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dF9SQUl0ZXIsIF9QcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIKKyAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT0l0ZXIKKyAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIgCisgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PSXRlciAKKyAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlLAorICAgICAgICAgICB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9JdGVyVGFnMSwgdHlwZW5hbWUgX0l0ZXJUYWcyLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlclRhZzM+CisgICAgX09JdGVyCisgICAgX19zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2Vfc3dpdGNoKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT0l0ZXIsIF9QcmVkaWNhdGUsIF9JdGVyVGFnMSwgX0l0ZXJUYWcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJUYWczKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsIHR5cGVuYW1lIF9PdXRwdXRfUkFJdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PdXRwdXRfUkFJdGVyCisgICAgX19zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2Vfc3dpdGNoKF9SQUl0ZXIxLCBfUkFJdGVyMSwgX1JBSXRlcjIsIF9SQUl0ZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dF9SQUl0ZXIsIF9QcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpOworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIHNldF9kaWZmZXJlbmNlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwKKyAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT0l0ZXIKKyAgICBzZXRfZGlmZmVyZW5jZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsIF9QcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyCisgICAgc2V0X2RpZmZlcmVuY2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX09JdGVyCisgICAgc2V0X2RpZmZlcmVuY2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlLAorICAgICAgICAgICB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9JdGVyVGFnMSwgdHlwZW5hbWUgX0l0ZXJUYWcyLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlclRhZzM+CisgICAgX09JdGVyCisgICAgX19zZXRfZGlmZmVyZW5jZV9zd2l0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlLCBfSXRlclRhZzEsIF9JdGVyVGFnMiwgX0l0ZXJUYWczKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsIHR5cGVuYW1lIF9PdXRwdXRfUkFJdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PdXRwdXRfUkFJdGVyCisgICAgX19zZXRfZGlmZmVyZW5jZV9zd2l0Y2goX1JBSXRlcjEsIF9SQUl0ZXIxLCBfUkFJdGVyMiwgX1JBSXRlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRfUkFJdGVyLCBfUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgdm9pZAorICAgIHNvcnQoX1JBSXRlciwgX1JBSXRlciwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgc29ydChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQKKyAgICBzb3J0KF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBzb3J0KF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQKKyAgICBzdGFibGVfc29ydChfUkFJdGVyLCBfUkFJdGVyLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBzdGFibGVfc29ydChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQKKyAgICBzdGFibGVfc29ydChfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgc3RhYmxlX3NvcnQoX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIHVuaXF1ZV9jb3B5KF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX09JdGVyCisgICAgdW5pcXVlX2NvcHkoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIHVuaXF1ZV9jb3B5KF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PSXRlcgorICAgIHVuaXF1ZV9jb3B5KF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9QcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlclRhZzEsIHR5cGVuYW1lIF9JdGVyVGFnMj4KKyAgICBfT0l0ZXIKKyAgICBfX3VuaXF1ZV9jb3B5X3N3aXRjaChfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBfUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICBfSXRlclRhZzEsIF9JdGVyVGFnMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc19PSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfUmFuZG9tQWNjZXNzX09JdGVyCisgICAgX191bmlxdWVfY29weV9zd2l0Y2goX1JBSXRlciwgX1JBSXRlciwgX1JhbmRvbUFjY2Vzc19PSXRlciwgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKK30gLy8gZW5kIG5hbWVzcGFjZSBfX3BhcmFsbGVsCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9BTEdPUklUSE1GV0RfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9iYWxhbmNlZF9xdWlja3NvcnQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYmFsYW5jZWRfcXVpY2tzb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI0YTliYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYmFsYW5jZWRfcXVpY2tzb3J0LmgKQEAgLTAsMCArMSw0OTIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9iYWxhbmNlZF9xdWlja3NvcnQuaAorICogIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIGR5bmFtaWNhbGx5IGxvYWQtYmFsYW5jZWQgcGFyYWxsZWwgcXVpY2tzb3J0LgorICoKKyAqICBJdCB3b3JrcyBpbi1wbGFjZSBhbmQgbmVlZHMgb25seSBsb2dhcml0aG1pYyBleHRyYSBtZW1vcnkuCisgKiAgVGhlIGFsZ29yaXRobSBpcyBzaW1pbGFyIHRvIHRoZSBvbmUgcHJvcG9zZWQgaW4KKyAqCisgKiAgUC4gVHNpZ2FzIGFuZCBZLiBaaGFuZy4KKyAqICBBIHNpbXBsZSwgZmFzdCBwYXJhbGxlbCBpbXBsZW1lbnRhdGlvbiBvZiBxdWlja3NvcnQgYW5kCisgKiAgaXRzIHBlcmZvcm1hbmNlIGV2YWx1YXRpb24gb24gU1VOIGVudGVycHJpc2UgMTAwMDAuCisgKiAgSW4gMTF0aCBFdXJvbWljcm8gQ29uZmVyZW5jZSBvbiBQYXJhbGxlbCwgRGlzdHJpYnV0ZWQgYW5kCisgKiAgTmV0d29yay1CYXNlZCBQcm9jZXNzaW5nLCBwYWdlIDM3MiwgMjAwMy4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX0JBTEFOQ0VEX1FVSUNLU09SVF9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0JBTEFOQ0VEX1FVSUNLU09SVF9IIDEKKworI2luY2x1ZGUgPHBhcmFsbGVsL2Jhc2ljX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnby5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+CisKKyNpbmNsdWRlIDxwYXJhbGxlbC9zZXR0aW5ncy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3BhcnRpdGlvbi5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3JhbmRvbV9udW1iZXIuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9xdWV1ZS5oPgorCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworI2luY2x1ZGUgPHBhcmFsbGVsL2NoZWNrZXJzLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgSW5mb3JtYXRpb24gbG9jYWwgdG8gb25lIHRocmVhZCBpbiB0aGUgcGFyYWxsZWwgcXVpY2tzb3J0IHJ1bi4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICBzdHJ1Y3QgX1FTQlRocmVhZExvY2FsCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIC8qKiBAYnJpZWYgQ29udGludW91cyBwYXJ0IG9mIHRoZSBzZXF1ZW5jZSwgZGVzY3JpYmVkIGJ5IGFuCisgICAgICBpdGVyYXRvciBwYWlyLiAqLworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8X1JBSXRlciwgX1JBSXRlcj4gX1BpZWNlOworCisgICAgICAvKiogQGJyaWVmIEluaXRpYWwgcGllY2UgdG8gd29yayBvbi4gKi8KKyAgICAgIF9QaWVjZSBfTV9pbml0aWFsOworCisgICAgICAvKiogQGJyaWVmIFdvcmstc3RlYWxpbmcgcXVldWUuICovCisgICAgICBfUmVzdHJpY3RlZEJvdW5kZWRDb25jdXJyZW50UXVldWU8X1BpZWNlPiBfTV9sZWZ0b3Zlcl9wYXJ0czsKKworICAgICAgLyoqIEBicmllZiBOdW1iZXIgb2YgdGhyZWFkcyBpbnZvbHZlZCBpbiB0aGlzIGFsZ29yaXRobS4gKi8KKyAgICAgIF9UaHJlYWRJbmRleCBfTV9udW1fdGhyZWFkczsKKworICAgICAgLyoqIEBicmllZiBQb2ludGVyIHRvIGEgY291bnRlciBvZiBlbGVtZW50cyBsZWZ0IG92ZXIgdG8gc29ydC4gKi8KKyAgICAgIHZvbGF0aWxlIF9EaWZmZXJlbmNlVHlwZSogX01fZWxlbWVudHNfbGVmdG92ZXI7CisKKyAgICAgIC8qKiBAYnJpZWYgVGhlIGNvbXBsZXRlIHNlcXVlbmNlIHRvIHNvcnQuICovCisgICAgICBfUGllY2UgX01fZ2xvYmFsOworCisgICAgICAvKiogQGJyaWVmIENvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSBfX3F1ZXVlX3NpemUgc2l6ZSBvZiB0aGUgd29yay1zdGVhbGluZyBxdWV1ZS4gKi8KKyAgICAgIF9RU0JUaHJlYWRMb2NhbChpbnQgX19xdWV1ZV9zaXplKSA6IF9NX2xlZnRvdmVyX3BhcnRzKF9fcXVldWVfc2l6ZSkgeyB9CisgICAgfTsKKworICAvKiogQGJyaWVmIEJhbGFuY2VkIHF1aWNrc29ydCBkaXZpZGUgc3RlcC4KKyAgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBzdWJzZXF1ZW5jZS4KKyAgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIHN1YnNlcXVlbmNlLgorICAgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICAqICBAcGFyYW0gX19udW1fdGhyZWFkcyBOdW1iZXIgb2YgdGhyZWFkcyB0aGF0IGFyZSBhbGxvd2VkIHRvIHdvcmsgb24KKyAgICAqICB0aGlzIHBhcnQuCisgICAgKiAgQHByZSBAYyAoX19lbmQtX19iZWdpbik+PTEgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fcXNiX2RpdmlkZShfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCSBfQ29tcGFyZSBfX2NvbXAsIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX251bV90aHJlYWRzID4gMCk7CisKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfUkFJdGVyIF9fcGl2b3RfcG9zID0KKwlfX21lZGlhbl9vZl90aHJlZV9pdGVyYXRvcnMoX19iZWdpbiwgX19iZWdpbiArIChfX2VuZCAtIF9fYmVnaW4pIC8gMiwKKwkJCQkgICAgX19lbmQgIC0gMSwgX19jb21wKTsKKworI2lmIGRlZmluZWQoX0dMSUJDWFhfQVNTRVJUSU9OUykKKyAgICAgIC8vIE11c3QgYmUgaW4gYmV0d2VlbiBzb21ld2hlcmUuCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19uID0gX19lbmQgLSBfX2JlZ2luOworCisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoKCFfX2NvbXAoKl9fcGl2b3RfcG9zLCAqX19iZWdpbikKKwkJCQkmJiAhX19jb21wKCooX19iZWdpbiArIF9fbiAvIDIpLAorCQkJCQkgICAqX19waXZvdF9wb3MpKQorCQkJICAgICAgIHx8ICghX19jb21wKCpfX3Bpdm90X3BvcywgKl9fYmVnaW4pCisJCQkJICAgJiYgIV9fY29tcCgqKF9fZW5kIC0gMSksICpfX3Bpdm90X3BvcykpCisJCQkgICAgICAgfHwgKCFfX2NvbXAoKl9fcGl2b3RfcG9zLCAqKF9fYmVnaW4gKyBfX24gLyAyKSkKKwkJCQkgICAmJiAhX19jb21wKCpfX2JlZ2luLCAqX19waXZvdF9wb3MpKQorCQkJICAgICAgIHx8ICghX19jb21wKCpfX3Bpdm90X3BvcywgKihfX2JlZ2luICsgX19uIC8gMikpCisJCQkJICAgJiYgIV9fY29tcCgqKF9fZW5kIC0gMSksICpfX3Bpdm90X3BvcykpCisJCQkgICAgICAgfHwgKCFfX2NvbXAoKl9fcGl2b3RfcG9zLCAqKF9fZW5kIC0gMSkpCisJCQkJICAgJiYgIV9fY29tcCgqX19iZWdpbiwgKl9fcGl2b3RfcG9zKSkKKwkJCSAgICAgICB8fCAoIV9fY29tcCgqX19waXZvdF9wb3MsICooX19lbmQgLSAxKSkKKwkJCQkgICAmJiAhX19jb21wKCooX19iZWdpbiArIF9fbiAvIDIpLAorCQkJCQkgICAgICAqX19waXZvdF9wb3MpKSk7CisjZW5kaWYKKworICAgICAgLy8gU3dhcCBwaXZvdCB2YWx1ZSB0byBlbmQuCisgICAgICBpZiAoX19waXZvdF9wb3MgIT0gKF9fZW5kIC0gMSkpCisJc3RkOjppdGVyX3N3YXAoX19waXZvdF9wb3MsIF9fZW5kIC0gMSk7CisgICAgICBfX3Bpdm90X3BvcyA9IF9fZW5kIC0gMTsKKworICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fYmluZGVyMm5kPF9Db21wYXJlLCBfVmFsdWVUeXBlLCBfVmFsdWVUeXBlLCBib29sPgorCV9fcHJlZChfX2NvbXAsICpfX3Bpdm90X3Bvcyk7CisKKyAgICAgIC8vIERpdmlkZSwgcmV0dXJuaW5nIF9fZW5kIC0gX19iZWdpbiAtIDEgaW4gdGhlIHdvcnN0IGNhc2UuCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19zcGxpdF9wb3MgPSBfX3BhcmFsbGVsX3BhcnRpdGlvbihfX2JlZ2luLCBfX2VuZCAtIDEsCisJCQkJCQkJIF9fcHJlZCwKKwkJCQkJCQkgX19udW1fdGhyZWFkcyk7CisKKyAgICAgIC8vIFN3YXAgYmFjayBwaXZvdCB0byBtaWRkbGUuCisgICAgICBzdGQ6Oml0ZXJfc3dhcChfX2JlZ2luICsgX19zcGxpdF9wb3MsIF9fcGl2b3RfcG9zKTsKKyAgICAgIF9fcGl2b3RfcG9zID0gX19iZWdpbiArIF9fc3BsaXRfcG9zOworCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworICAgICAgX1JBSXRlciBfX3I7CisgICAgICBmb3IgKF9fciA9IF9fYmVnaW47IF9fciAhPSBfX3Bpdm90X3BvczsgKytfX3IpCisJX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9fY29tcCgqX19yLCAqX19waXZvdF9wb3MpKTsKKyAgICAgIGZvciAoOyBfX3IgIT0gX19lbmQ7ICsrX19yKQorCV9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVCghX19jb21wKCpfX3IsICpfX3Bpdm90X3BvcykpOworI2VuZGlmCisKKyAgICAgIHJldHVybiBfX3NwbGl0X3BvczsKKyAgICB9CisKKyAgLyoqIEBicmllZiBRdWlja3NvcnQgY29ucXVlciBzdGVwLgorICAgICogIEBwYXJhbSBfX3RscyBBcnJheSBvZiB0aHJlYWQtbG9jYWwgc3RvcmFnZXMuCisgICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2Ygc3Vic2VxdWVuY2UuCisgICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBzdWJzZXF1ZW5jZS4KKyAgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAgKiAgQHBhcmFtIF9faWFtIE51bWJlciBvZiB0aGUgdGhyZWFkIHByb2Nlc3NpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICAqICBAcGFyYW0gX19udW1fdGhyZWFkcworICAgICogICAgICAgICAgTnVtYmVyIG9mIHRocmVhZHMgdGhhdCBhcmUgYWxsb3dlZCB0byB3b3JrIG9uIHRoaXMgcGFydC4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fcXNiX2NvbnF1ZXIoX1FTQlRocmVhZExvY2FsPF9SQUl0ZXI+KiogX190bHMsCisJCSAgX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorCQkgIF9Db21wYXJlIF9fY29tcCwKKwkJICBfVGhyZWFkSW5kZXggX19pYW0sIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzLAorCQkgIGJvb2wgX19wYXJlbnRfd2FpdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbiA9IF9fZW5kIC0gX19iZWdpbjsKKworICAgICAgaWYgKF9fbnVtX3RocmVhZHMgPD0gMSB8fCBfX24gPD0gMSkKKwl7CisgICAgICAgICAgX190bHNbX19pYW1dLT5fTV9pbml0aWFsLmZpcnN0ICA9IF9fYmVnaW47CisgICAgICAgICAgX190bHNbX19pYW1dLT5fTV9pbml0aWFsLnNlY29uZCA9IF9fZW5kOworCisgICAgICAgICAgX19xc2JfbG9jYWxfc29ydF93aXRoX2hlbHBpbmcoX190bHMsIF9fY29tcCwgX19pYW0sIF9fcGFyZW50X3dhaXQpOworCisgICAgICAgICAgcmV0dXJuOworCX0KKworICAgICAgLy8gRGl2aWRlIHN0ZXAuCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19zcGxpdF9wb3MgPQorCV9fcXNiX2RpdmlkZShfX2JlZ2luLCBfX2VuZCwgX19jb21wLCBfX251bV90aHJlYWRzKTsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVCgwIDw9IF9fc3BsaXRfcG9zICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zcGxpdF9wb3MgPCAoX19lbmQgLSBfX2JlZ2luKSk7CisjZW5kaWYKKworICAgICAgX1RocmVhZEluZGV4CisJX19udW1fdGhyZWFkc19sZWZ0c2lkZSA9IHN0ZDo6bWF4PF9UaHJlYWRJbmRleD4KKwkoMSwgc3RkOjptaW48X1RocmVhZEluZGV4PihfX251bV90aHJlYWRzIC0gMSwgX19zcGxpdF9wb3MKKwkJCQkgICAqIF9fbnVtX3RocmVhZHMgLyBfX24pKTsKKworIyAgICAgcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICpfX3Rsc1tfX2lhbV0tPl9NX2VsZW1lbnRzX2xlZnRvdmVyIC09IChfRGlmZmVyZW5jZVR5cGUpMTsKKworICAgICAgLy8gQ29ucXVlciBzdGVwLgorIyAgICAgcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcygyKQorICAgICAgeworCWJvb2wgX193YWl0OworCWlmKG9tcF9nZXRfbnVtX3RocmVhZHMoKSA8IDIpCisgICAgICAgICAgX193YWl0ID0gZmFsc2U7CisJZWxzZQorICAgICAgICAgIF9fd2FpdCA9IF9fcGFyZW50X3dhaXQ7CisKKyMgICAgICAgcHJhZ21hIG9tcCBzZWN0aW9ucworCXsKKyMgICAgICAgICBwcmFnbWEgb21wIHNlY3Rpb24KKwkgIHsKKwkgICAgX19xc2JfY29ucXVlcihfX3RscywgX19iZWdpbiwgX19iZWdpbiArIF9fc3BsaXRfcG9zLCBfX2NvbXAsCisJCQkgIF9faWFtLCBfX251bV90aHJlYWRzX2xlZnRzaWRlLCBfX3dhaXQpOworCSAgICBfX3dhaXQgPSBfX3BhcmVudF93YWl0OworCSAgfQorCSAgLy8gVGhlIHBpdm90X3BvcyBpcyBsZWZ0IGluIHBsYWNlLCB0byBlbnN1cmUgdGVybWluYXRpb24uCisjICAgICAgICAgcHJhZ21hIG9tcCBzZWN0aW9uCisJICB7CisJICAgIF9fcXNiX2NvbnF1ZXIoX190bHMsIF9fYmVnaW4gKyBfX3NwbGl0X3BvcyArIDEsIF9fZW5kLCBfX2NvbXAsCisJCQkgIF9faWFtICsgX19udW1fdGhyZWFkc19sZWZ0c2lkZSwKKwkJCSAgX19udW1fdGhyZWFkcyAtIF9fbnVtX3RocmVhZHNfbGVmdHNpZGUsIF9fd2FpdCk7CisJICAgIF9fd2FpdCA9IF9fcGFyZW50X3dhaXQ7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKworICAvKioKKyAgICAqICBAYnJpZWYgUXVpY2tzb3J0IHN0ZXAgZG9pbmcgbG9hZC1iYWxhbmNlZCBsb2NhbCBzb3J0LgorICAgICogIEBwYXJhbSBfX3RscyBBcnJheSBvZiB0aHJlYWQtbG9jYWwgc3RvcmFnZXMuCisgICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgICogIEBwYXJhbSBfX2lhbSBOdW1iZXIgb2YgdGhlIHRocmVhZCBwcm9jZXNzaW5nIHRoaXMgZnVuY3Rpb24uCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fcXNiX2xvY2FsX3NvcnRfd2l0aF9oZWxwaW5nKF9RU0JUaHJlYWRMb2NhbDxfUkFJdGVyPioqIF9fdGxzLAorCQkJCSAgX0NvbXBhcmUmIF9fY29tcCwgX1RocmVhZEluZGV4IF9faWFtLAorCQkJCSAgYm9vbCBfX3dhaXQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxfUkFJdGVyLCBfUkFJdGVyPiBfUGllY2U7CisKKyAgICAgIF9RU0JUaHJlYWRMb2NhbDxfUkFJdGVyPiYgX190bCA9ICpfX3Rsc1tfX2lhbV07CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZQorCV9fYmFzZV9jYXNlX24gPSBfU2V0dGluZ3M6OmdldCgpLnNvcnRfcXNiX2Jhc2VfY2FzZV9tYXhpbWFsX247CisgICAgICBpZiAoX19iYXNlX2Nhc2VfbiA8IDIpCisJX19iYXNlX2Nhc2VfbiA9IDI7CisgICAgICBfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcyA9IF9fdGwuX01fbnVtX3RocmVhZHM7CisKKyAgICAgIC8vIEV2ZXJ5IHRocmVhZCBoYXMgaXRzIG93biByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgIF9SYW5kb21OdW1iZXIgX19ybmcoX19pYW0gKyAxKTsKKworICAgICAgX1BpZWNlIF9fY3VycmVudCA9IF9fdGwuX01faW5pdGlhbDsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fZWxlbWVudHNfZG9uZSA9IDA7CisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fdG90YWxfZWxlbWVudHNfZG9uZSA9IDA7CisjZW5kaWYKKworICAgICAgZm9yICg7OykKKwl7CisgICAgICAgICAgLy8gSW52YXJpYW50OiBfX2N1cnJlbnQgbXVzdCBiZSBhIHZhbGlkIChtYXliZSBlbXB0eSkgcmFuZ2UuCisgICAgICAgICAgX1JBSXRlciBfX2JlZ2luID0gX19jdXJyZW50LmZpcnN0LCBfX2VuZCA9IF9fY3VycmVudC5zZWNvbmQ7CisgICAgICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbiA9IF9fZW5kIC0gX19iZWdpbjsKKworICAgICAgICAgIGlmIChfX24gPiBfX2Jhc2VfY2FzZV9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBEaXZpZGUuCisgICAgICAgICAgICAgIF9SQUl0ZXIgX19waXZvdF9wb3MgPSBfX2JlZ2luICsgIF9fcm5nKF9fbik7CisKKyAgICAgICAgICAgICAgLy8gU3dhcCBfX3Bpdm90X3BvcyB2YWx1ZSB0byBlbmQuCisgICAgICAgICAgICAgIGlmIChfX3Bpdm90X3BvcyAhPSAoX19lbmQgLSAxKSkKKyAgICAgICAgCXN0ZDo6aXRlcl9zd2FwKF9fcGl2b3RfcG9zLCBfX2VuZCAtIDEpOworICAgICAgICAgICAgICBfX3Bpdm90X3BvcyA9IF9fZW5kIC0gMTsKKworICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X19iaW5kZXIybmQKKwkJPF9Db21wYXJlLCBfVmFsdWVUeXBlLCBfVmFsdWVUeXBlLCBib29sPgorCQlfX3ByZWQoX19jb21wLCAqX19waXZvdF9wb3MpOworCisgICAgICAgICAgICAgIC8vIERpdmlkZSwgbGVhdmUgcGl2b3QgdW5jaGFuZ2VkIGluIGxhc3QgcGxhY2UuCisgICAgICAgICAgICAgIF9SQUl0ZXIgX19zcGxpdF9wb3MxLCBfX3NwbGl0X3BvczI7CisgICAgICAgICAgICAgIF9fc3BsaXRfcG9zMSA9IF9fZ251X3NlcXVlbnRpYWw6OnBhcnRpdGlvbihfX2JlZ2luLCBfX2VuZCAtIDEsCisJCQkJCQkJIF9fcHJlZCk7CisKKyAgICAgICAgICAgICAgLy8gTGVmdCBzaWRlOiA8IF9fcGl2b3RfcG9zOyBfX3JpZ2h0IHNpZGU6ID49IF9fcGl2b3RfcG9zLgorI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgICAgICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9fYmVnaW4gPD0gX19zcGxpdF9wb3MxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBfX3NwbGl0X3BvczEgPCBfX2VuZCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgLy8gU3dhcCBwaXZvdCBiYWNrIHRvIG1pZGRsZS4KKyAgICAgICAgICAgICAgaWYgKF9fc3BsaXRfcG9zMSAhPSBfX3Bpdm90X3BvcykKKyAgICAgICAgCXN0ZDo6aXRlcl9zd2FwKF9fc3BsaXRfcG9zMSwgX19waXZvdF9wb3MpOworICAgICAgICAgICAgICBfX3Bpdm90X3BvcyA9IF9fc3BsaXRfcG9zMTsKKworICAgICAgICAgICAgICAvLyBJbiBjYXNlIGFsbCBlbGVtZW50cyBhcmUgZXF1YWwsIF9fc3BsaXRfcG9zMSA9PSAwLgorICAgICAgICAgICAgICBpZiAoKF9fc3BsaXRfcG9zMSArIDEgLSBfX2JlZ2luKSA8IChfX24gPj4gNykKKwkJICB8fCAoX19lbmQgLSBfX3NwbGl0X3BvczEpIDwgKF9fbiA+PiA3KSkKKyAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgIC8vIFZlcnkgdW5lcXVhbCBzcGxpdCwgb25lIHBhcnQgc21hbGxlciB0aGFuIG9uZSAxMjh0aAorICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgbm90IHN0cmljdGx5IGxhcmdlciB0aGFuIHRoZSBwaXZvdC4KKyAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX3VuYXJ5X25lZ2F0ZTxfX2dudV9wYXJhbGxlbDo6X19iaW5kZXIxc3QKKyAgICAgICAgICAgICAgICAgICAgPF9Db21wYXJlLCBfVmFsdWVUeXBlLCBfVmFsdWVUeXBlLCBib29sPiwgX1ZhbHVlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgX19wcmVkKF9fZ251X3BhcmFsbGVsOjpfX2JpbmRlcjFzdAorICAgICAgICAgICAgICAgIAkgPF9Db21wYXJlLCBfVmFsdWVUeXBlLCBfVmFsdWVUeXBlLCBib29sPgorCQkJICAgKF9fY29tcCwgKl9fcGl2b3RfcG9zKSk7CisKKyAgICAgICAgICAgICAgICAgIC8vIEZpbmQgb3RoZXIgZW5kIG9mIHBpdm90LWVxdWFsIHJhbmdlLgorICAgICAgICAgICAgICAgICAgX19zcGxpdF9wb3MyID0gX19nbnVfc2VxdWVudGlhbDo6cGFydGl0aW9uKF9fc3BsaXRfcG9zMSArIDEsCisJCQkJCQkJICAgICBfX2VuZCwgX19wcmVkKTsKKyAgICAgICAgCX0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAJLy8gT25seSBza2lwIHRoZSBwaXZvdC4KKyAgICAgICAgCV9fc3BsaXRfcG9zMiA9IF9fc3BsaXRfcG9zMSArIDE7CisKKyAgICAgICAgICAgICAgLy8gRWxlbWVudHMgZXF1YWwgdG8gcGl2b3QgYXJlIGRvbmUuCisgICAgICAgICAgICAgIF9fZWxlbWVudHNfZG9uZSArPSAoX19zcGxpdF9wb3MyIC0gX19zcGxpdF9wb3MxKTsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICAgICAgICAgIF9fdG90YWxfZWxlbWVudHNfZG9uZSArPSAoX19zcGxpdF9wb3MyIC0gX19zcGxpdF9wb3MxKTsKKyNlbmRpZgorICAgICAgICAgICAgICAvLyBBbHdheXMgcHVzaCBsYXJnZXIgcGFydCBvbnRvIHN0YWNrLgorICAgICAgICAgICAgICBpZiAoKChfX3NwbGl0X3BvczEgKyAxKSAtIF9fYmVnaW4pIDwgKF9fZW5kIC0gKF9fc3BsaXRfcG9zMikpKQorICAgICAgICAJeworICAgICAgICAgICAgICAgICAgLy8gUmlnaHQgc2lkZSBsYXJnZXIuCisgICAgICAgICAgICAgICAgICBpZiAoKF9fc3BsaXRfcG9zMikgIT0gX19lbmQpCisgICAgICAgICAgICAgICAgICAgIF9fdGwuX01fbGVmdG92ZXJfcGFydHMucHVzaF9mcm9udAorCQkgICAgICAoc3RkOjptYWtlX3BhaXIoX19zcGxpdF9wb3MyLCBfX2VuZCkpOworCisgICAgICAgICAgICAgICAgICAvL19fY3VycmVudC5maXJzdCA9IF9fYmVnaW47ICAgIC8vYWxyZWFkeSBzZXQgYW55d2F5CisgICAgICAgICAgICAgICAgICBfX2N1cnJlbnQuc2Vjb25kID0gX19zcGxpdF9wb3MxOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIAl9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgIC8vIExlZnQgc2lkZSBsYXJnZXIuCisgICAgICAgICAgICAgICAgICBpZiAoX19iZWdpbiAhPSBfX3NwbGl0X3BvczEpCisgICAgICAgICAgICAgICAgICAgIF9fdGwuX01fbGVmdG92ZXJfcGFydHMucHVzaF9mcm9udChzdGQ6Om1ha2VfcGFpcgorCQkJCQkJICAgICAgKF9fYmVnaW4sIF9fc3BsaXRfcG9zMSkpOworCisgICAgICAgICAgICAgICAgICBfX2N1cnJlbnQuZmlyc3QgPSBfX3NwbGl0X3BvczI7CisgICAgICAgICAgICAgICAgICAvL19fY3VycmVudC5zZWNvbmQgPSBfX2VuZDsgICAgIC8vYWxyZWFkeSBzZXQgYW55d2F5CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fZ251X3NlcXVlbnRpYWw6OnNvcnQoX19iZWdpbiwgX19lbmQsIF9fY29tcCk7CisgICAgICAgICAgICAgIF9fZWxlbWVudHNfZG9uZSArPSBfX247CisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworICAgICAgICAgICAgICBfX3RvdGFsX2VsZW1lbnRzX2RvbmUgKz0gX19uOworI2VuZGlmCisKKyAgICAgICAgICAgICAgLy8gUHJlZmVyIG93biBzdGFjaywgc21hbGwgcGllY2VzLgorICAgICAgICAgICAgICBpZiAoX190bC5fTV9sZWZ0b3Zlcl9wYXJ0cy5wb3BfZnJvbnQoX19jdXJyZW50KSkKKyAgICAgICAgCWNvbnRpbnVlOworCisjICAgICAgICAgICAgIHByYWdtYSBvbXAgYXRvbWljCisgICAgICAgICAgICAgICpfX3RsLl9NX2VsZW1lbnRzX2xlZnRvdmVyIC09IF9fZWxlbWVudHNfZG9uZTsKKworICAgICAgICAgICAgICBfX2VsZW1lbnRzX2RvbmUgPSAwOworCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworICAgICAgICAgICAgICBkb3VibGUgX19zZWFyY2hfc3RhcnQgPSBvbXBfZ2V0X3d0aW1lKCk7CisjZW5kaWYKKworICAgICAgICAgICAgICAvLyBMb29rIGZvciBuZXcgd29yay4KKyAgICAgICAgICAgICAgYm9vbCBfX3N1Y2Nlc3NmdWxseV9zdG9sZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgd2hpbGUgKF9fd2FpdCAmJiAqX190bC5fTV9lbGVtZW50c19sZWZ0b3ZlciA+IDAKKyAgICAgICAgICAgICAgICAgICAgICYmICFfX3N1Y2Nlc3NmdWxseV9zdG9sZW4KKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICAgICAgICAgICAgICAgICAgLy8gUG9zc2libGUgZGVhZC1sb2NrLgorICAgICAgICAgICAgICAgICAgICAgJiYgKG9tcF9nZXRfd3RpbWUoKSA8IChfX3NlYXJjaF9zdGFydCArIDEuMCkpCisjZW5kaWYKKwkJICAgICApCisgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICBfVGhyZWFkSW5kZXggX192aWN0aW07CisgICAgICAgICAgICAgICAgICBfX3ZpY3RpbSA9IF9fcm5nKF9fbnVtX3RocmVhZHMpOworCisgICAgICAgICAgICAgICAgICAvLyBMYXJnZSBwaWVjZXMuCisgICAgICAgICAgICAgICAgICBfX3N1Y2Nlc3NmdWxseV9zdG9sZW4gPSAoX192aWN0aW0gIT0gX19pYW0pCisJCSAgICAmJiBfX3Rsc1tfX3ZpY3RpbV0tPl9NX2xlZnRvdmVyX3BhcnRzLnBvcF9iYWNrKF9fY3VycmVudCk7CisgICAgICAgICAgICAgICAgICBpZiAoIV9fc3VjY2Vzc2Z1bGx5X3N0b2xlbikKKyAgICAgICAgICAgICAgICAgICAgX195aWVsZCgpOworI2lmICFkZWZpbmVkKF9fSUNDKSAmJiAhZGVmaW5lZChfX0VDQykKKyMgICAgICAgICAgICAgICAgIHByYWdtYSBvbXAgZmx1c2gKKyNlbmRpZgorICAgICAgICAJfQorCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworICAgICAgICAgICAgICBpZiAob21wX2dldF93dGltZSgpID49IChfX3NlYXJjaF9zdGFydCArIDEuMCkpCisgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgICAgICAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChvbXBfZ2V0X3d0aW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IChfX3NlYXJjaF9zdGFydCArIDEuMCkpOworICAgICAgICAJfQorI2VuZGlmCisgICAgICAgICAgICAgIGlmICghX19zdWNjZXNzZnVsbHlfc3RvbGVuKQorICAgICAgICAJeworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgICAgICAgICAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVCgqX190bC5fTV9lbGVtZW50c19sZWZ0b3ZlciA9PSAwKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAJfQorICAgICAgICAgICAgfQorCX0KKyAgICB9CisKKyAgLyoqIEBicmllZiBUb3AtbGV2ZWwgcXVpY2tzb3J0IHJvdXRpbmUuCisgICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2Ygc2VxdWVuY2UuCisgICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBzZXF1ZW5jZS4KKyAgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAgKiAgQHBhcmFtIF9fbnVtX3RocmVhZHMgTnVtYmVyIG9mIHRocmVhZHMgdGhhdCBhcmUgYWxsb3dlZCB0byB3b3JrIG9uCisgICAgKiAgdGhpcyBwYXJ0LgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX3BhcmFsbGVsX3NvcnRfcXNiKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJCV9Db21wYXJlIF9fY29tcCwgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMpCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2VuZCAtIF9fYmVnaW4pCisKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8X1JBSXRlciwgX1JBSXRlcj4gX1BpZWNlOworCisgICAgICB0eXBlZGVmIF9RU0JUaHJlYWRMb2NhbDxfUkFJdGVyPiBfVExTVHlwZTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbiA9IF9fZW5kIC0gX19iZWdpbjsKKworICAgICAgaWYgKF9fbiA8PSAxKQorCXJldHVybjsKKworICAgICAgLy8gQXQgbGVhc3Qgb25lIGVsZW1lbnQgcGVyIHByb2Nlc3Nvci4KKyAgICAgIGlmIChfX251bV90aHJlYWRzID4gX19uKQorCV9fbnVtX3RocmVhZHMgPSBzdGF0aWNfY2FzdDxfVGhyZWFkSW5kZXg+KF9fbik7CisKKyAgICAgIC8vIEluaXRpYWxpemUgdGhyZWFkIGxvY2FsIHN0b3JhZ2UKKyAgICAgIF9UTFNUeXBlKiogX190bHMgPSBuZXcgX1RMU1R5cGUqW19fbnVtX3RocmVhZHNdOworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fcXVldWVfc2l6ZSA9IChfX251bV90aHJlYWRzCisJCQkJICAgICAgKiAoX1RocmVhZEluZGV4KShfX3JkX2xvZzIoX19uKSArIDEpKTsKKyAgICAgIGZvciAoX1RocmVhZEluZGV4IF9fdCA9IDA7IF9fdCA8IF9fbnVtX3RocmVhZHM7ICsrX190KQorCV9fdGxzW19fdF0gPSBuZXcgX1FTQlRocmVhZExvY2FsPF9SQUl0ZXI+KF9fcXVldWVfc2l6ZSk7CisKKyAgICAgIC8vIFRoZXJlIGNhbiBuZXZlciBiZSBtb3JlIHRoYW4gY2VpbChfX3JkX2xvZzIoX19uKSkgcmFuZ2VzIG9uIHRoZQorICAgICAgLy8gc3RhY2ssIGJlY2F1c2UKKyAgICAgIC8vIDEuIE9ubHkgb25lIHByb2Nlc3NvciBwdXNoZXMgb250byB0aGUgc3RhY2sKKyAgICAgIC8vIDIuIFRoZSBsYXJnZXN0IHJhbmdlIGhhcyBhdCBtb3N0IGxlbmd0aCBfX24KKyAgICAgIC8vIDMuIEVhY2ggcmFuZ2UgaXMgbGFyZ2VyIHRoYW4gaGFsZiBvZiB0aGUgcmFuZ2UgcmVtYWluaW5nCisgICAgICB2b2xhdGlsZSBfRGlmZmVyZW5jZVR5cGUgX19lbGVtZW50c19sZWZ0b3ZlciA9IF9fbjsKKyAgICAgIGZvciAoX1RocmVhZEluZGV4IF9faSA9IDA7IF9faSA8IF9fbnVtX3RocmVhZHM7ICsrX19pKQorCXsKKyAgICAgICAgICBfX3Rsc1tfX2ldLT5fTV9lbGVtZW50c19sZWZ0b3ZlciA9ICZfX2VsZW1lbnRzX2xlZnRvdmVyOworICAgICAgICAgIF9fdGxzW19faV0tPl9NX251bV90aHJlYWRzID0gX19udW1fdGhyZWFkczsKKyAgICAgICAgICBfX3Rsc1tfX2ldLT5fTV9nbG9iYWwgPSBzdGQ6Om1ha2VfcGFpcihfX2JlZ2luLCBfX2VuZCk7CisKKyAgICAgICAgICAvLyBKdXN0IGluIGNhc2Ugbm90aGluZyBpcyBsZWZ0IHRvIGFzc2lnbi4KKyAgICAgICAgICBfX3Rsc1tfX2ldLT5fTV9pbml0aWFsID0gc3RkOjptYWtlX3BhaXIoX19lbmQsIF9fZW5kKTsKKwl9CisKKyAgICAgIC8vIE1haW4gcmVjdXJzaW9uIGNhbGwuCisgICAgICBfX3FzYl9jb25xdWVyKF9fdGxzLCBfX2JlZ2luLCBfX2JlZ2luICsgX19uLCBfX2NvbXAsIDAsCisJCSAgICBfX251bV90aHJlYWRzLCB0cnVlKTsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgIC8vIEFsbCBzdGFjayBtdXN0IGJlIGVtcHR5LgorICAgICAgX1BpZWNlIF9fZHVtbXk7CisgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX2kgPSAxOyBfX2kgPCBfX251bV90aHJlYWRzOyArK19faSkKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoCisgICAgICAgICAgIV9fdGxzW19faV0tPl9NX2xlZnRvdmVyX3BhcnRzLnBvcF9iYWNrKF9fZHVtbXkpKTsKKyNlbmRpZgorCisgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX2kgPSAwOyBfX2kgPCBfX251bV90aHJlYWRzOyArK19faSkKKwlkZWxldGUgX190bHNbX19pXTsKKyAgICAgIGRlbGV0ZVtdIF9fdGxzOworICAgIH0KK30gLy8gbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9CQUxBTkNFRF9RVUlDS1NPUlRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9iYXNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGIzMzM1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9iYXNlLmgKQEAgLTAsMCArMSw0MjYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9iYXNlLmgKKyAqICBAYnJpZWYgU2VxdWVudGlhbCBoZWxwZXIgZnVuY3Rpb25zLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9CQVNFX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfQkFTRV9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9mZWF0dXJlcy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2Jhc2ljX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvcGFyYWxsZWwuaD4KKworLy8gUGFyYWxsZWwgbW9kZSBuYW1lc3BhY2VzLgorCisvKioKKyAqIEBuYW1lc3BhY2Ugc3RkOjpfX3BhcmFsbGVsCisgKiBAYnJpZWYgR05VIHBhcmFsbGVsIGNvZGUsIHJlcGxhY2VzIHN0YW5kYXJkIGJlaGF2aW9yIHdpdGggcGFyYWxsZWwgYmVoYXZpb3IuCisgKi8KK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KSAKK3sgCisgIG5hbWVzcGFjZSBfX3BhcmFsbGVsIHsgfSAKK30KKworLyoqCisgKiBAbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCisgKiBAYnJpZWYgR05VIHBhcmFsbGVsIGNvZGUgZm9yIHB1YmxpYyB1c2UuCisgKi8KK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvLyBJbXBvcnQgYWxsIHRoZSBwYXJhbGxlbCB2ZXJzaW9ucyBvZiBjb21wb25lbnRzIGluIG5hbWVzcGFjZSBzdGQuCisgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6Ol9fcGFyYWxsZWw7Cit9CisKKy8qKgorICogQG5hbWVzcGFjZSBfX2dudV9zZXF1ZW50aWFsCisgKiBAYnJpZWYgR05VIHNlcXVlbnRpYWwgY2xhc3NlcyBmb3IgcHVibGljIHVzZS4KKyAqLworbmFtZXNwYWNlIF9fZ251X3NlcXVlbnRpYWwgCit7IAorICAvLyBJbXBvcnQgd2hhdGV2ZXIgaXMgdGhlIHNlcmlhbCB2ZXJzaW9uLgorI2lmZGVmIF9HTElCQ1hYX1BBUkFMTEVMCisgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6Ol9HTElCQ1hYX1NURF9BOworI2Vsc2UKKyAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNlbmRpZiAgIAorfQorCisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvLyBOQjogSW5jbHVkaW5nIHRoaXMgZmlsZSBjYW5ub3QgcHJvZHVjZSAodW5yZXNvbHZlZCkgc3ltYm9scyBmcm9tCisgIC8vIHRoZSBPcGVuTVAgcnVudGltZSB1bmxlc3MgdGhlIHBhcmFsbGVsIG1vZGUgaXMgYWN0dWFsbHkgaW52b2tlZAorICAvLyBhbmQgYWN0aXZlLCB3aGljaCBpbXBsZXMgdGhhdCB0aGUgT3Blbk1QIHJ1bnRpbWUgaXMgYWN0dWFsbHkKKyAgLy8gZ29pbmcgdG8gYmUgbGlua2VkIGluLgorICBpbmxpbmUgX1RocmVhZEluZGV4CisgIF9fZ2V0X21heF90aHJlYWRzKCkgCisgIHsgCisgICAgX1RocmVhZEluZGV4IF9faSA9IG9tcF9nZXRfbWF4X3RocmVhZHMoKTsKKyAgICByZXR1cm4gX19pID4gMSA/IF9faSA6IDE7IAorICB9CisKKworICBpbmxpbmUgYm9vbCAKKyAgX19pc19wYXJhbGxlbChjb25zdCBfUGFyYWxsZWxpc20gX19wKSB7IHJldHVybiBfX3AgIT0gc2VxdWVudGlhbDsgfQorCisKKyAgLyoqIEBicmllZiBDYWxjdWxhdGVzIHRoZSByb3VuZGVkLWRvd24gbG9nYXJpdGhtIG9mIEBjIF9fbiBmb3IgYmFzZSAyLgorICAgKiAgQHBhcmFtIF9fbiBBcmd1bWVudC4KKyAgICogIEByZXR1cm4gUmV0dXJucyAwIGZvciBhbnkgYXJndW1lbnQgPDEuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2l6ZT4KKyAgICBpbmxpbmUgX1NpemUKKyAgICBfX3JkX2xvZzIoX1NpemUgX19uKQorICAgIHsKKyAgICAgIF9TaXplIF9fazsKKyAgICAgIGZvciAoX19rID0gMDsgX19uID4gMTsgX19uID4+PSAxKQorICAgICAgICArK19fazsKKyAgICAgIHJldHVybiBfX2s7CisgICAgfQorCisgIC8qKiBAYnJpZWYgRW5jb2RlIHR3byBpbnRlZ2VycyBpbnRvIG9uZSBnbnVfcGFyYWxsZWw6Ol9DQVNhYmxlLgorICAgKiAgQHBhcmFtIF9fYSBGaXJzdCBpbnRlZ2VyLCB0byBiZSBlbmNvZGVkIGluIHRoZSBtb3N0LXNpZ25pZmljYW50IEBjCisgICAqICBfQ0FTYWJsZV9iaXRzLzIgYml0cy4KKyAgICogIEBwYXJhbSBfX2IgU2Vjb25kIGludGVnZXIsIHRvIGJlIGVuY29kZWQgaW4gdGhlIGxlYXN0LXNpZ25pZmljYW50CisgICAqICBAYyBfQ0FTYWJsZV9iaXRzLzIgYml0cy4KKyAgICogIEByZXR1cm4gdmFsdWUgZW5jb2RpbmcgQGMgX19hIGFuZCBAYyBfX2IuCisgICAqICBAc2VlIF9fZGVjb2RlMgorICAgKi8KKyAgaW5saW5lIF9DQVNhYmxlCisgIF9fZW5jb2RlMihpbnQgX19hLCBpbnQgX19iKSAgICAgLy9tdXN0IGFsbCBiZSBub24tbmVnYXRpdmUsIGFjdHVhbGx5CisgIHsKKyAgICByZXR1cm4gKCgoX0NBU2FibGUpX19hKSA8PCAoX0NBU2FibGVfYml0cyAvIDIpKSB8ICgoKF9DQVNhYmxlKV9fYikgPDwgMCk7CisgIH0KKworICAvKiogQGJyaWVmIERlY29kZSB0d28gaW50ZWdlcnMgZnJvbSBvbmUgZ251X3BhcmFsbGVsOjpfQ0FTYWJsZS4KKyAgICogIEBwYXJhbSBfX3ggX19nbnVfcGFyYWxsZWw6Ol9DQVNhYmxlIHRvIGRlY29kZSBpbnRlZ2VycyBmcm9tLgorICAgKiAgQHBhcmFtIF9fYSBGaXJzdCBpbnRlZ2VyLCB0byBiZSBkZWNvZGVkIGZyb20gdGhlIG1vc3Qtc2lnbmlmaWNhbnQKKyAgICogIEBjIF9DQVNhYmxlX2JpdHMvMiBiaXRzIG9mIEBjIF9feC4KKyAgICogIEBwYXJhbSBfX2IgU2Vjb25kIGludGVnZXIsIHRvIGJlIGVuY29kZWQgaW4gdGhlIGxlYXN0LXNpZ25pZmljYW50CisgICAqICBAYyBfQ0FTYWJsZV9iaXRzLzIgYml0cyBvZiBAYyBfX3guCisgICAqICBAc2VlIF9fZW5jb2RlMgorICAgKi8KKyAgaW5saW5lIHZvaWQKKyAgX19kZWNvZGUyKF9DQVNhYmxlIF9feCwgaW50JiBfX2EsIGludCYgX19iKQorICB7CisgICAgX19hID0gKGludCkoKF9feCA+PiAoX0NBU2FibGVfYml0cyAvIDIpKSAmIF9DQVNhYmxlX21hc2spOworICAgIF9fYiA9IChpbnQpKChfX3ggPj4gICAgICAgICAgICAgICAwICkgJiBfQ0FTYWJsZV9tYXNrKTsKKyAgfQorCisgIC8vbmVlZGVkIGZvciBwYXJhbGxlbCAibnVtZXJpYyIsIGV2ZW4gaWYgImFsZ29yaXRobSIgbm90IGluY2x1ZGVkCisKKyAgLyoqIEBicmllZiBFcXVpdmFsZW50IHRvIHN0ZDo6bWluLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbnN0IF9UcCYKKyAgICBtaW4oY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iKQorICAgIHsgcmV0dXJuIChfX2EgPCBfX2IpID8gX19hIDogX19iOyB9CisKKyAgLyoqIEBicmllZiBFcXVpdmFsZW50IHRvIHN0ZDo6bWF4LiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbnN0IF9UcCYKKyAgICBtYXgoY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iKQorICAgIHsgcmV0dXJuIChfX2EgPiBfX2IpID8gX19hIDogX19iOyB9CisKKyAgLyoqIEBicmllZiBDb25zdHJ1Y3RzIHByZWRpY2F0ZSBmb3IgZXF1YWxpdHkgZnJvbSBzdHJpY3Qgd2VhaworICAgKiAgb3JkZXJpbmcgcHJlZGljYXRlCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMiwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY2xhc3MgX0VxdWFsRnJvbUxlc3MgOiBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIGJvb2w+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICBfQ29tcGFyZSYgX01fY29tcDsKKworICAgIHB1YmxpYzoKKyAgICAgIF9FcXVhbEZyb21MZXNzKF9Db21wYXJlJiBfX2NvbXApIDogX01fY29tcChfX2NvbXApIHsgfQorCisgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1QxJiBfX2EsIGNvbnN0IF9UMiYgX19iKQorICAgICAgeyByZXR1cm4gIV9NX2NvbXAoX19hLCBfX2IpICYmICFfTV9jb21wKF9fYiwgX19hKTsgfQorICAgIH07CisKKworICAvKiogQGJyaWVmIFNpbWlsYXIgdG8gc3RkOjp1bmFyeV9uZWdhdGUsCisgICAqICBidXQgZ2l2aW5nIHRoZSBhcmd1bWVudCB0eXBlcyBleHBsaWNpdGx5LiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBhcmd1bWVudF90eXBlPgorICAgIGNsYXNzIF9fdW5hcnlfbmVnYXRlCisgICAgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjxhcmd1bWVudF90eXBlLCBib29sPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfUHJlZGljYXRlIF9NX3ByZWQ7CisKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgX191bmFyeV9uZWdhdGUoY29uc3QgX1ByZWRpY2F0ZSYgX194KSA6IF9NX3ByZWQoX194KSB7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBhcmd1bWVudF90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiAhX01fcHJlZChfX3gpOyB9CisgICAgfTsKKworICAvKiogQGJyaWVmIFNpbWlsYXIgdG8gc3RkOjpiaW5kZXIxc3QsCisgICAqICBidXQgZ2l2aW5nIHRoZSBhcmd1bWVudCB0eXBlcyBleHBsaWNpdGx5LiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3BlcmF0aW9uLCB0eXBlbmFtZSBfRmlyc3RBcmd1bWVudFR5cGUsCisJICAgdHlwZW5hbWUgX1NlY29uZEFyZ3VtZW50VHlwZSwgdHlwZW5hbWUgX1Jlc3VsdFR5cGU+CisgICAgY2xhc3MgX19iaW5kZXIxc3QKKyAgICA6IHB1YmxpYyBzdGQ6OnVuYXJ5X2Z1bmN0aW9uPF9TZWNvbmRBcmd1bWVudFR5cGUsIF9SZXN1bHRUeXBlPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfT3BlcmF0aW9uIF9NX29wOworICAgICAgX0ZpcnN0QXJndW1lbnRUeXBlIF9NX3ZhbHVlOworCisgICAgcHVibGljOgorICAgICAgX19iaW5kZXIxc3QoY29uc3QgX09wZXJhdGlvbiYgX194LCBjb25zdCBfRmlyc3RBcmd1bWVudFR5cGUmIF9feSkKKyAgICAgIDogX01fb3AoX194KSwgX01fdmFsdWUoX195KSB7IH0KKworICAgICAgX1Jlc3VsdFR5cGUKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1NlY29uZEFyZ3VtZW50VHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fb3AoX01fdmFsdWUsIF9feCk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTA5LiAgTWlzc2luZyBiaW5kZXJzIGZvciBub24tY29uc3Qgc2VxdWVuY2UgZWxlbWVudHMKKyAgICAgIF9SZXN1bHRUeXBlCisgICAgICBvcGVyYXRvcigpKF9TZWNvbmRBcmd1bWVudFR5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX29wKF9NX3ZhbHVlLCBfX3gpOyB9CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBTaW1pbGFyIHRvIHN0ZDo6YmluZGVyMm5kLCBidXQgZ2l2aW5nIHRoZSBhcmd1bWVudCB0eXBlcworICAgKiAgZXhwbGljaXRseS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PcGVyYXRpb24sIHR5cGVuYW1lIF9GaXJzdEFyZ3VtZW50VHlwZSwKKwkgICB0eXBlbmFtZSBfU2Vjb25kQXJndW1lbnRUeXBlLCB0eXBlbmFtZSBfUmVzdWx0VHlwZT4KKyAgICBjbGFzcyBfX2JpbmRlcjJuZAorICAgIDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248X0ZpcnN0QXJndW1lbnRUeXBlLCBfUmVzdWx0VHlwZT4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX09wZXJhdGlvbiBfTV9vcDsKKyAgICAgIF9TZWNvbmRBcmd1bWVudFR5cGUgX01fdmFsdWU7CisKKyAgICBwdWJsaWM6CisgICAgICBfX2JpbmRlcjJuZChjb25zdCBfT3BlcmF0aW9uJiBfX3gsIGNvbnN0IF9TZWNvbmRBcmd1bWVudFR5cGUmIF9feSkKKyAgICAgIDogX01fb3AoX194KSwgX01fdmFsdWUoX195KSB7IH0KKworICAgICAgX1Jlc3VsdFR5cGUKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0ZpcnN0QXJndW1lbnRUeXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9vcChfX3gsIF9NX3ZhbHVlKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMDkuICBNaXNzaW5nIGJpbmRlcnMgZm9yIG5vbi1jb25zdCBzZXF1ZW5jZSBlbGVtZW50cworICAgICAgX1Jlc3VsdFR5cGUKKyAgICAgIG9wZXJhdG9yKCkoX0ZpcnN0QXJndW1lbnRUeXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9vcChfX3gsIF9NX3ZhbHVlKTsgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBTaW1pbGFyIHRvIHN0ZDo6ZXF1YWxfdG8sIGJ1dCBhbGxvd3MgdHdvIGRpZmZlcmVudCB0eXBlcy4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9FcXVhbFRvIDogc3RkOjpiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIGJvb2w+CisgICAgeworICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UMSYgX190MSwgY29uc3QgX1QyJiBfX3QyKSBjb25zdAorICAgICAgeyByZXR1cm4gX190MSA9PSBfX3QyOyB9CisgICAgfTsKKworICAvKiogQGJyaWVmIFNpbWlsYXIgdG8gc3RkOjpsZXNzLCBidXQgYWxsb3dzIHR3byBkaWZmZXJlbnQgdHlwZXMuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfTGVzcyA6IHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBib29sPgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1QxJiBfX3QxLCBjb25zdCBfVDImIF9fdDIpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3QxIDwgX190MjsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UMiYgX190MiwgY29uc3QgX1QxJiBfX3QxKSBjb25zdAorICAgICAgeyByZXR1cm4gX190MiA8IF9fdDE7IH0KKyAgICB9OworCisgIC8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIG9uZSB0eXBlLiBTYW1lIGFzIHN0ZDo6bGVzcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfTGVzczxfVHAsIF9UcD4KKyAgICA6IHB1YmxpYyBzdGQ6Omxlc3M8X1RwPiB7IH07CisKKyAgLyoqIEBicmllZiBTaW1pbGFyIHRvIHN0ZDo6cGx1cywgYnV0IGFsbG93cyB0d28gZGlmZmVyZW50IHR5cGVzLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyLCB0eXBlbmFtZSBfUmVzdWx0CisJICAgPSBfX3R5cGVvZl9fKCpzdGF0aWNfY2FzdDxfVHAxKj4oMCkKKwkJCSsgKnN0YXRpY19jYXN0PF9UcDIqPigwKSk+CisgICAgc3RydWN0IF9QbHVzIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPF9UcDEsIF9UcDIsIF9SZXN1bHQ+CisgICAgeworICAgICAgX1Jlc3VsdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAxJiBfX3gsIGNvbnN0IF9UcDImIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCArIF9feTsgfQorICAgIH07CisKKyAgLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3Igb25lIHR5cGUuIFNhbWUgYXMgc3RkOjpwbHVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9QbHVzPF9UcCwgX1RwLCBfVHA+CisgICAgOiBwdWJsaWMgc3RkOjpwbHVzPF9UcD4geyB9OworCisgIC8qKiBAYnJpZWYgU2ltaWxhciB0byBzdGQ6Om11bHRpcGxpZXMsIGJ1dCBhbGxvd3MgdHdvIGRpZmZlcmVudCB0eXBlcy4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMiwgdHlwZW5hbWUgX1Jlc3VsdAorCSAgID0gX190eXBlb2ZfXygqc3RhdGljX2Nhc3Q8X1RwMSo+KDApCisJCQkqICpzdGF0aWNfY2FzdDxfVHAyKj4oMCkpPgorICAgIHN0cnVjdCBfTXVsdGlwbGllcyA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxfVHAxLCBfVHAyLCBfUmVzdWx0PgorICAgIHsKKyAgICAgIF9SZXN1bHQKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwMSYgX194LCBjb25zdCBfVHAyJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggKiBfX3k7IH0KKyAgICB9OworCisgIC8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIG9uZSB0eXBlLiBTYW1lIGFzIHN0ZDo6bXVsdGlwbGllcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfTXVsdGlwbGllczxfVHAsIF9UcCwgX1RwPgorICAgIDogcHVibGljIHN0ZDo6bXVsdGlwbGllczxfVHA+IHsgfTsKKworICAvKiogQGJyaWVmIF9JdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggX19nbnVfcGFyYWxsZWw6Ol9Qc2V1ZG9TZXF1ZW5jZS4KKyAgICogIElmIGZlYXR1cmVzIHRoZSB1c3VhbCByYW5kb20tYWNjZXNzIGl0ZXJhdG9yIGZ1bmN0aW9uYWxpdHkuCisgICAqICBAcGFyYW0gX1RwIFNlcXVlbmNlIF9NX3ZhbHVlIHR5cGUuCisgICAqICBAcGFyYW0gX0RpZmZlcmVuY2VUcCBTZXF1ZW5jZSBkaWZmZXJlbmNlIHR5cGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHA+CisgICAgY2xhc3MgX1BzZXVkb1NlcXVlbmNlSXRlcmF0b3IKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX1BzZXVkb1NlcXVlbmNlSXRlcmF0b3IoY29uc3QgX1RwJiBfX3ZhbCwgX0RpZmZlcmVuY2VUeXBlIF9fcG9zKQorICAgICAgOiBfTV92YWwoX192YWwpLCBfTV9wb3MoX19wb3MpIHsgfQorCisgICAgICAvLyBQcmUtaW5jcmVtZW50IG9wZXJhdG9yLgorICAgICAgX1BzZXVkb1NlcXVlbmNlSXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwkrK19NX3BvczsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIFBvc3QtaW5jcmVtZW50IG9wZXJhdG9yLgorICAgICAgX1BzZXVkb1NlcXVlbmNlSXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gX1BzZXVkb1NlcXVlbmNlSXRlcmF0b3IoX01fcG9zKyspOyB9CisKKyAgICAgIGNvbnN0IF9UcCYKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV92YWw7IH0KKworICAgICAgY29uc3QgX1RwJgorICAgICAgb3BlcmF0b3JbXShfRGlmZmVyZW5jZVR5cGUpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV92YWw7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfUHNldWRvU2VxdWVuY2VJdGVyYXRvciYgX19pMikKKyAgICAgIHsgcmV0dXJuIF9NX3BvcyA9PSBfX2kyLl9NX3BvczsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IF9Qc2V1ZG9TZXF1ZW5jZUl0ZXJhdG9yJiBfX2kyKQorICAgICAgeyByZXR1cm4gX01fcG9zICE9IF9faTIuX01fcG9zOyB9CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZQorICAgICAgb3BlcmF0b3ItKGNvbnN0IF9Qc2V1ZG9TZXF1ZW5jZUl0ZXJhdG9yJiBfX2kyKQorICAgICAgeyByZXR1cm4gX01fcG9zIC0gX19pMi5fTV9wb3M7IH0KKworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBfVHAmIF9NX3ZhbDsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfTV9wb3M7CisgICAgfTsKKworICAvKiogQGJyaWVmIFNlcXVlbmNlIHRoYXQgY29uY2VwdHVhbGx5IGNvbnNpc3RzIG9mIG11bHRpcGxlIGNvcGllcyBvZgorICAgICAgdGhlIHNhbWUgZWxlbWVudC4KKyAgICAgICogIFRoZSBjb3BpZXMgYXJlIG5vdCBzdG9yZWQgZXhwbGljaXRseSwgb2YgY291cnNlLgorICAgICAgKiAgQHBhcmFtIF9UcCBTZXF1ZW5jZSBfTV92YWx1ZSB0eXBlLgorICAgICAgKiAgQHBhcmFtIF9EaWZmZXJlbmNlVHAgU2VxdWVuY2UgZGlmZmVyZW5jZSB0eXBlLgorICAgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwPgorICAgIGNsYXNzIF9Qc2V1ZG9TZXF1ZW5jZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICAvLyBCZXR0ZXIgY2FzdCBkb3duIHRvIHVpbnQ2NF90LCB0aGFuIHVwIHRvIF9EaWZmZXJlbmNlVHAuCisgICAgICB0eXBlZGVmIF9Qc2V1ZG9TZXF1ZW5jZUl0ZXJhdG9yPF9UcCwgdWludDY0X3Q+IGl0ZXJhdG9yOworCisgICAgICAvKiogQGJyaWVmIENvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSBfX3ZhbCBFbGVtZW50IG9mIHRoZSBzZXF1ZW5jZS4KKyAgICAgICAqICBAcGFyYW0gX19jb3VudCBOdW1iZXIgb2YgKHZpcnR1YWwpIGNvcGllcy4KKyAgICAgICAqLworICAgICAgX1BzZXVkb1NlcXVlbmNlKGNvbnN0IF9UcCYgX192YWwsIF9EaWZmZXJlbmNlVHlwZSBfX2NvdW50KQorICAgICAgOiBfTV92YWwoX192YWwpLCBfTV9jb3VudChfX2NvdW50KSAgeyB9CisKKyAgICAgIC8qKiBAYnJpZWYgQmVnaW4gaXRlcmF0b3IuICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX01fdmFsLCAwKTsgfQorCisgICAgICAvKiogQGJyaWVmIEVuZCBpdGVyYXRvci4gKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX01fdmFsLCBfTV9jb3VudCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBfVHAmIF9NX3ZhbDsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfTV9jb3VudDsKKyAgICB9OworCisgIC8qKiBAYnJpZWYgQ29tcHV0ZSB0aGUgbWVkaWFuIG9mIHRocmVlIHJlZmVyZW5jZWQgZWxlbWVudHMsCisgICAgICBhY2NvcmRpbmcgdG8gQGMgX19jb21wLgorICAgICAgKiAgQHBhcmFtIF9fYSBGaXJzdCBpdGVyYXRvci4KKyAgICAgICogIEBwYXJhbSBfX2IgU2Vjb25kIGl0ZXJhdG9yLgorICAgICAgKiAgQHBhcmFtIF9fYyBUaGlyZCBpdGVyYXRvci4KKyAgICAgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXIKKyAgICBfX21lZGlhbl9vZl90aHJlZV9pdGVyYXRvcnMoX1JBSXRlciBfX2EsIF9SQUl0ZXIgX19iLAorCQkJCV9SQUl0ZXIgX19jLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgaWYgKF9fY29tcCgqX19hLCAqX19iKSkKKwlpZiAoX19jb21wKCpfX2IsICpfX2MpKQorCSAgcmV0dXJuIF9fYjsKKwllbHNlCisJICBpZiAoX19jb21wKCpfX2EsICpfX2MpKQorCSAgICByZXR1cm4gX19jOworCSAgZWxzZQorCSAgICByZXR1cm4gX19hOworICAgICAgZWxzZQorCXsKKwkgIC8vIEp1c3Qgc3dhcCBfX2EgYW5kIF9fYi4KKwkgIGlmIChfX2NvbXAoKl9fYSwgKl9fYykpCisJICAgIHJldHVybiBfX2E7CisJICBlbHNlCisJICAgIGlmIChfX2NvbXAoKl9fYiwgKl9fYykpCisJICAgICAgcmV0dXJuIF9fYzsKKwkgICAgZWxzZQorCSAgICAgIHJldHVybiBfX2I7CisJfQorICAgIH0KKworI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX0NvbmRpdGlvbikgX19nbGliY3h4X2Fzc2VydChfQ29uZGl0aW9uKQorCit9IC8vbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9CQVNFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYmFzaWNfaXRlcmF0b3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYmFzaWNfaXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTBiZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9iYXNpY19pdGVyYXRvci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9iYXNpY19pdGVyYXRvci5oCisgKiAgQGJyaWVmIEluY2x1ZGVzIHRoZSBvcmlnaW5hbCBoZWFkZXIgZmlsZXMgY29uY2VybmVkIHdpdGggaXRlcmF0b3JzCisgKiAgZXhjZXB0IGZvciBzdHJlYW0gaXRlcmF0b3JzLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9CQVNJQ19JVEVSQVRPUl9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0JBU0lDX0lURVJBVE9SX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX3R5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yLmg+CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9CQVNJQ19JVEVSQVRPUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2NoZWNrZXJzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2NoZWNrZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmZjY2OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvY2hlY2tlcnMuaApAQCAtMCwwICsxLDczIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvY2hlY2tlcnMuaAorICogIEBicmllZiBSb3V0aW5lcyBmb3IgY2hlY2tpbmcgdGhlIGNvcnJlY3RuZXNzIG9mIGFsZ29yaXRobSByZXN1bHRzLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9DSEVDS0VSU19ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0NIRUNLRVJTX0ggMQorCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKgorICAgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciBAYyBbX19iZWdpbiwgQGMgX19lbmQpIGlzIHNvcnRlZCBhY2NvcmRpbmcKKyAgICogdG8gQGMgX19jb21wLgorICAgKiBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiBAcmV0dXJuIEBjIHRydWUgaWYgc29ydGVkLCBAYyBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGJvb2wKKyAgICBfX2lzX3NvcnRlZChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgaWYgKF9fYmVnaW4gPT0gX19lbmQpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBfSUl0ZXIgX19jdXJyZW50KF9fYmVnaW4pLCBfX3JlY2VudChfX2JlZ2luKTsKKworICAgICAgdW5zaWduZWQgbG9uZyBsb25nIF9fcG9zaXRpb24gPSAxOworICAgICAgZm9yIChfX2N1cnJlbnQrKzsgX19jdXJyZW50ICE9IF9fZW5kOyBfX2N1cnJlbnQrKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChfX2NvbXAoKl9fY3VycmVudCwgKl9fcmVjZW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgIF9fcmVjZW50ID0gX19jdXJyZW50OworICAgICAgICAgIF9fcG9zaXRpb24rKzsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9DSEVDS0VSU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2NvbXBhdGliaWxpdHkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvY29tcGF0aWJpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzk1OWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2NvbXBhdGliaWxpdHkuaApAQCAtMCwwICsxLDEzMSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL2NvbXBhdGliaWxpdHkuaAorICogIEBicmllZiBDb21wYXRpYmlsaXR5IGxheWVyLCBtb3N0bHkgY29uY2VybmVkIHdpdGggYXRvbWljIG9wZXJhdGlvbnMuCisgKgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5CisgKiAgYW5kIGNvbnRhaW5zIGltcGxlbWVudGF0aW9uIGRldGFpbHMgZm9yIHRoZSBsaWJyYXJ5J3MgaW50ZXJuYWwgdXNlLgorICovCisKKy8vIFdyaXR0ZW4gYnkgRmVsaXggUHV0emUuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfQ09NUEFUSUJJTElUWV9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0NPTVBBVElCSUxJVFlfSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC90eXBlcy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2Jhc2UuaD4KKworI2lmICFkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2VuZGlmCisKKyNpZmRlZiBfX01JTkdXMzJfXworLy8gSW5jbHVkaW5nIDx3aW5kb3dzLmg+IHdpbGwgZHJhZyBpbiBhbGwgdGhlIHdpbmRvd3MzMiBuYW1lcy4gIFNpbmNlCisvLyB0aGF0IGNhbiBjYXVzZSB1c2VyIGNvZGUgcG9ydGFiaWxpdHkgcHJvYmxlbXMsIHdlIGp1c3QgZGVjbGFyZSB0aGUKKy8vIG9uZSBuZWVkZWQgZnVuY3Rpb24gaGVyZS4KK2V4dGVybiAiQyIKK19fYXR0cmlidXRlKChkbGxpbXBvcnQpKSB2b2lkIF9fYXR0cmlidXRlX18oKHN0ZGNhbGwpKSBTbGVlcCAodW5zaWduZWQgbG9uZyk7CisjZW5kaWYKKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX19hZGRfb21wKHZvbGF0aWxlIF9UcCogX19wdHIsIF9UcCBfX2FkZGVuZCkKKyAgICB7CisgICAgICBpbnQ2NF90IF9fcmVzOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlfX3JlcyA9ICpfX3B0cjsKKwkqKF9fcHRyKSArPSBfX2FkZGVuZDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfX3JlczsKKyAgICB9CisKKyAgLyoqIEBicmllZiBBZGQgYSB2YWx1ZSB0byBhIHZhcmlhYmxlLCBhdG9taWNhbGx5LgorICAgKgorICAgKiAgQHBhcmFtIF9fcHRyIFBvaW50ZXIgdG8gYSBzaWduZWQgaW50ZWdlci4KKyAgICogIEBwYXJhbSBfX2FkZGVuZCBWYWx1ZSB0byBhZGQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fZmV0Y2hfYW5kX2FkZCh2b2xhdGlsZSBfVHAqIF9fcHRyLCBfVHAgX19hZGRlbmQpCisgICAgeworICAgICAgaWYgKF9fYXRvbWljX2Fsd2F5c19sb2NrX2ZyZWUoc2l6ZW9mKF9UcCksIF9fcHRyKSkKKwlyZXR1cm4gX19hdG9taWNfZmV0Y2hfYWRkKF9fcHRyLCBfX2FkZGVuZCwgX19BVE9NSUNfQUNRX1JFTCk7CisgICAgICByZXR1cm4gX19hZGRfb21wKF9fcHRyLCBfX2FkZGVuZCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2FzX29tcCh2b2xhdGlsZSBfVHAqIF9fcHRyLCBfVHAgX19jb21wYXJhbmQsIF9UcCBfX3JlcGxhY2VtZW50KQorICAgIHsKKyAgICAgIGJvb2wgX19yZXMgPSBmYWxzZTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJaWYgKCpfX3B0ciA9PSBfX2NvbXBhcmFuZCkKKwkgIHsKKwkgICAgKl9fcHRyID0gX19yZXBsYWNlbWVudDsKKwkgICAgX19yZXMgPSB0cnVlOworCSAgfQorICAgICAgfQorICAgICAgcmV0dXJuIF9fcmVzOworICAgIH0KKworICAvKiogQGJyaWVmIENvbXBhcmUtYW5kLXN3YXAKKyAgICoKKyAgICogQ29tcGFyZSBAYyAqX19wdHIgYW5kIEBjIF9fY29tcGFyYW5kLiBJZiBlcXVhbCwgbGV0IEBjCisgICAqICpfX3B0cj1fX3JlcGxhY2VtZW50IGFuZCByZXR1cm4gQGMgdHJ1ZSwgcmV0dXJuIEBjIGZhbHNlIG90aGVyd2lzZS4KKyAgICoKKyAgICogIEBwYXJhbSBfX3B0ciBQb2ludGVyIHRvIHNpZ25lZCBpbnRlZ2VyLgorICAgKiAgQHBhcmFtIF9fY29tcGFyYW5kIENvbXBhcmUgdmFsdWUuCisgICAqICBAcGFyYW0gX19yZXBsYWNlbWVudCBSZXBsYWNlbWVudCB2YWx1ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY29tcGFyZV9hbmRfc3dhcCh2b2xhdGlsZSBfVHAqIF9fcHRyLCBfVHAgX19jb21wYXJhbmQsIF9UcCBfX3JlcGxhY2VtZW50KQorICAgIHsKKyAgICAgIGlmIChfX2F0b21pY19hbHdheXNfbG9ja19mcmVlKHNpemVvZihfVHApLCBfX3B0cikpCisJcmV0dXJuIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbihfX3B0ciwgJl9fY29tcGFyYW5kLCBfX3JlcGxhY2VtZW50LAorCQkJCQkgICBmYWxzZSwgX19BVE9NSUNfQUNRX1JFTCwKKwkJCQkJICAgX19BVE9NSUNfUkVMQVhFRCk7CisgICAgICByZXR1cm4gX19jYXNfb21wKF9fcHRyLCBfX2NvbXBhcmFuZCwgX19yZXBsYWNlbWVudCk7CisgICAgfQorCisgIC8qKiBAYnJpZWYgWWllbGQgY29udHJvbCB0byBhbm90aGVyIHRocmVhZCwgd2l0aG91dCB3YWl0aW5nIGZvcgorICAgKiAgdGhlIGVuZCBvZiB0aGUgdGltZSBzbGljZS4KKyAgICovCisgIGlubGluZSB2b2lkCisgIF9feWllbGQoKQorICB7CisjaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhZGVmaW5lZCAoX19DWUdXSU5fXykKKyAgICBTbGVlcCgwKTsKKyNlbHNlCisgICAgc2NoZWRfeWllbGQoKTsKKyNlbmRpZgorICB9Cit9IC8vIGVuZCBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX0NPTVBBVElCSUxJVFlfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9jb21waWxldGltZV9zZXR0aW5ncy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9jb21waWxldGltZV9zZXR0aW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODA0ZDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2NvbXBpbGV0aW1lX3NldHRpbmdzLmgKQEAgLTAsMCArMSw3NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL2NvbXBpbGV0aW1lX3NldHRpbmdzLmgKKyAqICBAYnJpZWYgRGVmaW5lcyBvbiBvcHRpb25zIGNvbmNlcm5pbmcgZGVidWdnaW5nIGFuZCBwZXJmb3JtYW5jZSwgYXQKKyAqICBjb21waWxlLXRpbWUuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyLgorCisjaW5jbHVkZSA8Y3N0ZGlvPgorCisvKiogQGJyaWVmIERldGVybWluZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIHBhcmFsbGVsIG1vZGUuCisgKiAgTGV2ZWwgMSBwcmludHMgYSBtZXNzYWdlIGVhY2ggdGltZSBhIHBhcmFsbGVsLW1vZGUgZnVuY3Rpb24gaXMgZW50ZXJlZC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVkVSQk9TRV9MRVZFTCAwCisKKy8qKiBAZGVmIF9HTElCQ1hYX0NBTEwKKyAqICBAYnJpZWYgTWFjcm8gdG8gcHJvZHVjZSBsb2cgbWVzc2FnZSB3aGVuIGVudGVyaW5nIGEgZnVuY3Rpb24uCisgKiAgQHBhcmFtIF9fbiBJbnB1dCBzaXplLgorICogIEBzZWUgX0dMSUJDWFhfVkVSQk9TRV9MRVZFTCAqLworI2lmIChfR0xJQkNYWF9WRVJCT1NFX0xFVkVMID09IDApCisjZGVmaW5lIF9HTElCQ1hYX0NBTEwoX19uKQorI2VuZGlmCisjaWYgKF9HTElCQ1hYX1ZFUkJPU0VfTEVWRUwgPT0gMSkKKyNkZWZpbmUgX0dMSUJDWFhfQ0FMTChfX24pIFwKKyAgcHJpbnRmKCIgICAlX19zOlxuaWFtID0gJWQsIF9fbiA9ICVsZCwgX19udW1fdGhyZWFkcyA9ICVkXG4iLCBcCisgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIG9tcF9nZXRfdGhyZWFkX251bSgpLCAoX19uKSwgX19nZXRfbWF4X3RocmVhZHMoKSk7CisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9TQ0FMRV9ET1dOX0ZQVQorLyoqIEBicmllZiBVc2UgZmxvYXRpbmctcG9pbnQgc2NhbGluZyBpbnN0ZWFkIG9mIG1vZHVsbyBmb3IgbWFwcGluZworICogIHJhbmRvbSBudW1iZXJzIHRvIGEgcmFuZ2UuICBUaGlzIGNhbiBiZSBmYXN0ZXIgb24gY2VydGFpbiBDUFVzLiAqLworI2RlZmluZSBfR0xJQkNYWF9TQ0FMRV9ET1dOX0ZQVSAwCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9BU1NFUlRJT05TCisvKiogQGJyaWVmIFN3aXRjaCBvbiBtYW55IF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVGlvbnMgaW4gcGFyYWxsZWwgY29kZS4KKyAqICBTaG91bGQgYmUgc3dpdGNoZWQgb24gb25seSBsb2NhbGx5LiAqLworI2RlZmluZSBfR0xJQkNYWF9BU1NFUlRJT05TIDAKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX1JBTkRPTV9TSFVGRkxFX0NPTlNJREVSX0wxCisvKiogQGJyaWVmIFN3aXRjaCBvbiBtYW55IF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVGlvbnMgaW4gcGFyYWxsZWwgY29kZS4KKyAqICBDb25zaWRlciB0aGUgc2l6ZSBvZiB0aGUgTDEgY2FjaGUgZm9yCisqICBnbnVfcGFyYWxsZWw6Ol9fcGFyYWxsZWxfcmFuZG9tX3NodWZmbGUoKS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUkFORE9NX1NIVUZGTEVfQ09OU0lERVJfTDEgMAorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1JBTkRPTV9TSFVGRkxFX0NPTlNJREVSX1RMQgorLyoqIEBicmllZiBTd2l0Y2ggb24gbWFueSBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlRpb25zIGluIHBhcmFsbGVsIGNvZGUuCisgKiAgQ29uc2lkZXIgdGhlIHNpemUgb2YgdGhlIFRMQiBmb3IKKyogIGdudV9wYXJhbGxlbDo6X19wYXJhbGxlbF9yYW5kb21fc2h1ZmZsZSgpLiAqLworI2RlZmluZSBfR0xJQkNYWF9SQU5ET01fU0hVRkZMRV9DT05TSURFUl9UTEIgMAorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2VxdWFsbHlfc3BsaXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvZXF1YWxseV9zcGxpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTkyYWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2VxdWFsbHlfc3BsaXQuaApAQCAtMCwwICsxLDg5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvZXF1YWxseV9zcGxpdC5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX0VRVUFMTFlfU1BMSVRfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9FUVVBTExZX1NQTElUX0ggMQorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLyoqIEBicmllZiBmdW5jdGlvbiB0byBzcGxpdCBhIHNlcXVlbmNlIGludG8gcGFydHMgb2YgYWxtb3N0IGVxdWFsIHNpemUuCisgICAqCisgICAqICBUaGUgcmVzdWx0aW5nIHNlcXVlbmNlIF9fcyBvZiBsZW5ndGggX19udW1fdGhyZWFkcysxIGNvbnRhaW5zIHRoZQorICAgKiAgc3BsaXR0aW5nIHBvc2l0aW9ucyB3aGVuIHNwbGl0dGluZyB0aGUgcmFuZ2UgWzAsX19uKSBpbnRvIHBhcnRzIG9mCisgICAqICBhbG1vc3QgZXF1YWwgc2l6ZSAocGx1cyBtaW51cyAxKS4gIFRoZSBmaXJzdCBlbnRyeSBpcyAwLCB0aGUgbGFzdAorICAgKiAgb25lIG4uIFRoZXJlIG1heSByZXN1bHQgZW1wdHkgcGFydHMuCisgICAqICBAcGFyYW0gX19uIE51bWJlciBvZiBlbGVtZW50cworICAgKiAgQHBhcmFtIF9fbnVtX3RocmVhZHMgTnVtYmVyIG9mIHBhcnRzCisgICAqICBAcGFyYW0gX19zIFNwbGl0dGVycworICAgKiAgQHJldHVybnMgRW5kIG9mIF9fc3BsaXR0ZXIgc2VxdWVuY2UsIGkuZS4gQGMgX19zK19fbnVtX3RocmVhZHMrMSAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRGlmZmVyZW5jZVR5cGUsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX2VxdWFsbHlfc3BsaXQoX0RpZmZlcmVuY2VUeXBlIF9fbiwgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMsCisJCSAgICBfT3V0cHV0SXRlcmF0b3IgX19zKQorICAgIHsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2NodW5rX2xlbmd0aCA9IF9fbiAvIF9fbnVtX3RocmVhZHM7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19udW1fbG9uZ2VyX2NodW5rcyA9IF9fbiAlIF9fbnVtX3RocmVhZHM7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19wb3MgPSAwOworICAgICAgZm9yIChfVGhyZWFkSW5kZXggX19pID0gMDsgX19pIDwgX19udW1fdGhyZWFkczsgKytfX2kpCisJeworCSAgKl9fcysrID0gX19wb3M7CisJICBfX3BvcyArPSAoKF9faSA8IF9fbnVtX2xvbmdlcl9jaHVua3MpCisJCSAgICA/IChfX2NodW5rX2xlbmd0aCArIDEpIDogX19jaHVua19sZW5ndGgpOworCX0KKyAgICAgICpfX3MrKyA9IF9fbjsKKyAgICAgIHJldHVybiBfX3M7CisgICAgfQorCisgIC8qKiBAYnJpZWYgZnVuY3Rpb24gdG8gc3BsaXQgYSBzZXF1ZW5jZSBpbnRvIHBhcnRzIG9mIGFsbW9zdCBlcXVhbCBzaXplLgorICAgKgorICAgKiAgUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIHNwbGl0dGluZyBwb2ludCBiZXR3ZWVuCisgICAqICB0aHJlYWQgbnVtYmVyIF9fdGhyZWFkX25vIChpbmNsdWRlZCkgYW5kCisgICAqICB0aHJlYWQgbnVtYmVyIF9fdGhyZWFkX25vKzEgKGV4Y2x1ZGVkKS4KKyAgICogIEBwYXJhbSBfX24gTnVtYmVyIG9mIGVsZW1lbnRzCisgICAqICBAcGFyYW0gX19udW1fdGhyZWFkcyBOdW1iZXIgb2YgcGFydHMKKyAgICogIEBwYXJhbSBfX3RocmVhZF9ubyBOdW1iZXIgb2YgdGhyZWFkcworICAgKiAgQHJldHVybnMgc3BsaXR0aW5nIHBvaW50ICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9EaWZmZXJlbmNlVHlwZT4KKyAgICBfRGlmZmVyZW5jZVR5cGUKKyAgICBfX2VxdWFsbHlfc3BsaXRfcG9pbnQoX0RpZmZlcmVuY2VUeXBlIF9fbiwKKwkJCSAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMsCisJCQkgIF9UaHJlYWRJbmRleCBfX3RocmVhZF9ubykKKyAgICB7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19jaHVua19sZW5ndGggPSBfX24gLyBfX251bV90aHJlYWRzOworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbnVtX2xvbmdlcl9jaHVua3MgPSBfX24gJSBfX251bV90aHJlYWRzOworICAgICAgaWYgKF9fdGhyZWFkX25vIDwgX19udW1fbG9uZ2VyX2NodW5rcykKKwlyZXR1cm4gX190aHJlYWRfbm8gKiAoX19jaHVua19sZW5ndGggKyAxKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gX19udW1fbG9uZ2VyX2NodW5rcyAqIChfX2NodW5rX2xlbmd0aCArIDEpCisgICAgICAgICAgKyAoX190aHJlYWRfbm8gLSBfX251bV9sb25nZXJfY2h1bmtzKSAqIF9fY2h1bmtfbGVuZ3RoOworICAgIH0KK30KKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX0VRVUFMTFlfU1BMSVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9mZWF0dXJlcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9mZWF0dXJlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDE4MmEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2ZlYXR1cmVzLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9mZWF0dXJlcy5oCisgKiAgQGJyaWVmIERlZmluZXMgb24gd2hldGhlciB0byBpbmNsdWRlIGFsZ29yaXRobSB2YXJpYW50cy4KKyAqCisgKiAgTGVzcyB2YXJpYW50cyByZWR1Y2UgZXhlY3V0YWJsZSBzaXplIGFuZCBjb21waWxlIHRpbWUuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX0ZFQVRVUkVTX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfRkVBVFVSRVNfSCAxCisKKyNpZm5kZWYgX0dMSUJDWFhfTUVSR0VTT1JUCisvKiogQGRlZiBfR0xJQkNYWF9NRVJHRVNPUlQKKyAqICBAYnJpZWYgSW5jbHVkZSBwYXJhbGxlbCBtdWx0aS13YXkgbWVyZ2Vzb3J0LgorICogIEBzZWUgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6c29ydF9hbGdvcml0aG0gKi8KKyNkZWZpbmUgX0dMSUJDWFhfTUVSR0VTT1JUIDEKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX1FVSUNLU09SVAorLyoqIEBkZWYgX0dMSUJDWFhfUVVJQ0tTT1JUCisgKiAgQGJyaWVmIEluY2x1ZGUgcGFyYWxsZWwgdW5iYWxhbmNlZCBxdWlja3NvcnQuCisgKiAgQHNlZSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpzb3J0X2FsZ29yaXRobSAqLworI2RlZmluZSBfR0xJQkNYWF9RVUlDS1NPUlQgMQorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfQkFMX1FVSUNLU09SVAorLyoqIEBkZWYgX0dMSUJDWFhfQkFMX1FVSUNLU09SVAorICogIEBicmllZiBJbmNsdWRlIHBhcmFsbGVsIGR5bmFtaWNhbGx5IGxvYWQtYmFsYW5jZWQgcXVpY2tzb3J0LgorICogIEBzZWUgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6c29ydF9hbGdvcml0aG0gKi8KKyNkZWZpbmUgX0dMSUJDWFhfQkFMX1FVSUNLU09SVCAxCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9GSU5EX0dST1dJTkdfQkxPQ0tTCisvKiogQGJyaWVmIEluY2x1ZGUgdGhlIGdyb3dpbmcgYmxvY2tzIHZhcmlhbnQgZm9yIHN0ZDo6ZmluZC4KKyAqICBAc2VlIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmZpbmRfYWxnb3JpdGhtICovCisjZGVmaW5lIF9HTElCQ1hYX0ZJTkRfR1JPV0lOR19CTE9DS1MgMQorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfRklORF9DT05TVEFOVF9TSVpFX0JMT0NLUworLyoqIEBicmllZiBJbmNsdWRlIHRoZSBlcXVhbC1zaXplZCBibG9ja3MgdmFyaWFudCBmb3Igc3RkOjpmaW5kLgorICogIEBzZWUgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6ZmluZF9hbGdvcml0aG0gKi8KKyNkZWZpbmUgX0dMSUJDWFhfRklORF9DT05TVEFOVF9TSVpFX0JMT0NLUyAxCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9GSU5EX0VRVUFMX1NQTElUCisvKiogQGRlZiBfR0xJQkNYWF9GSU5EX0VRVUFMX1NQTElUCisgKiAgQGJyaWVmIEluY2x1ZGUgdGhlIGVxdWFsIHNwbGl0dGluZyB2YXJpYW50IGZvciBzdGQ6OmZpbmQuCisgKiAgQHNlZSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpmaW5kX2FsZ29yaXRobSAqLworI2RlZmluZSBfR0xJQkNYWF9GSU5EX0VRVUFMX1NQTElUIDEKKyNlbmRpZgorCisKKyNpZm5kZWYgX0dMSUJDWFhfVFJFRV9JTklUSUFMX1NQTElUVElORworLyoqIEBkZWYgX0dMSUJDWFhfVFJFRV9JTklUSUFMX1NQTElUVElORworICogIEBicmllZiBJbmNsdWRlIHRoZSBpbml0aWFsIHNwbGl0dGluZyB2YXJpYW50IGZvcgorICogIF9SYl90cmVlOjppbnNlcnRfdW5pcXVlKF9JSXRlciBiZWcsIF9JSXRlciBfX2VuZCkuCisgKiAgQHNlZSBfX2dudV9wYXJhbGxlbDo6X1JiX3RyZWUgKi8KKyNkZWZpbmUgX0dMSUJDWFhfVFJFRV9JTklUSUFMX1NQTElUVElORyAxCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9UUkVFX0RZTkFNSUNfQkFMQU5DSU5HCisvKiogQGRlZiBfR0xJQkNYWF9UUkVFX0RZTkFNSUNfQkFMQU5DSU5HCisgKiAgQGJyaWVmIEluY2x1ZGUgdGhlIGR5bmFtaWMgYmFsYW5jaW5nIHZhcmlhbnQgZm9yCisgKiAgX1JiX3RyZWU6Omluc2VydF91bmlxdWUoX0lJdGVyIGJlZywgX0lJdGVyIF9fZW5kKS4KKyAqICBAc2VlIF9fZ251X3BhcmFsbGVsOjpfUmJfdHJlZSAqLworI2RlZmluZSBfR0xJQkNYWF9UUkVFX0RZTkFNSUNfQkFMQU5DSU5HIDEKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX1RSRUVfRlVMTF9DT1BZCisvKiogQGRlZiBfR0xJQkNYWF9UUkVFX0ZVTExfQ09QWQorICogIEBicmllZiBJbiBvcmRlciB0byBzb3J0IHRoZSBpbnB1dCBzZXF1ZW5jZSBvZgorICogIF9SYl90cmVlOjppbnNlcnRfdW5pcXVlKF9JSXRlciBiZWcsIF9JSXRlciBfX2VuZCkgYQorICogIGZ1bGwgY29weSBvZiB0aGUgaW5wdXQgZWxlbWVudHMgaXMgZG9uZS4KKyAqICBAc2VlIF9fZ251X3BhcmFsbGVsOjpfUmJfdHJlZSAqLworI2RlZmluZSBfR0xJQkNYWF9UUkVFX0ZVTExfQ09QWSAxCisjZW5kaWYKKworCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfRkVBVFVSRVNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9maW5kLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2ZpbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmUyOGIxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9maW5kLmgKQEAgLTAsMCArMSw0MDUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9maW5kLmgKKyAqICBAYnJpZWYgUGFyYWxsZWwgaW1wbGVtZW50YXRpb24gYmFzZSBmb3Igc3RkOjpmaW5kKCksIHN0ZDo6ZXF1YWwoKQorICogIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEZlbGl4IFB1dHplIGFuZCBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX0ZJTkRfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9GSU5EX0ggMQorCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKworI2luY2x1ZGUgPHBhcmFsbGVsL2ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvcGFyYWxsZWwuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9jb21wYXRpYmlsaXR5Lmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvZXF1YWxseV9zcGxpdC5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLyoqCisgICAqICBAYnJpZWYgUGFyYWxsZWwgc3RkOjpmaW5kLCBzd2l0Y2ggZm9yIGRpZmZlcmVudCBhbGdvcml0aG1zLgorICAgKiAgQHBhcmFtIF9fYmVnaW4xIEJlZ2luIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kMSBFbmQgaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19iZWdpbjIgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLiBNdXN0IGhhdmUgc2FtZQorICAgKiAgbGVuZ3RoIGFzIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fcHJlZCBGaW5kIHByZWRpY2F0ZS4KKyAgICogIEBwYXJhbSBfX3NlbGVjdG9yIF9GdW5jdGlvbmFsaXR5IChlLiBnLiBzdGQ6OmZpbmRfaWYoKSwgc3RkOjplcXVhbCgpLC4uLikKKyAgICogIEByZXR1cm4gUGxhY2Ugb2YgZmluZGluZyBpbiBib3RoIHNlcXVlbmNlcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXIyLAorCSAgIHR5cGVuYW1lIF9QcmVkLAorICAgICAgICAgICB0eXBlbmFtZSBfU2VsZWN0b3I+CisgICAgaW5saW5lIHN0ZDo6cGFpcjxfUkFJdGVyMSwgX1JBSXRlcjI+CisgICAgX19maW5kX3RlbXBsYXRlKF9SQUl0ZXIxIF9fYmVnaW4xLCBfUkFJdGVyMSBfX2VuZDEsCisJCSAgICBfUkFJdGVyMiBfX2JlZ2luMiwgX1ByZWQgX19wcmVkLCBfU2VsZWN0b3IgX19zZWxlY3RvcikKKyAgICB7CisgICAgICBzd2l0Y2ggKF9TZXR0aW5nczo6Z2V0KCkuZmluZF9hbGdvcml0aG0pCisJeworCWNhc2UgR1JPV0lOR19CTE9DS1M6CisgICAgICAgICAgcmV0dXJuIF9fZmluZF90ZW1wbGF0ZShfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19wcmVkLAorCQkJCSBfX3NlbGVjdG9yLCBncm93aW5nX2Jsb2Nrc190YWcoKSk7CisJY2FzZSBDT05TVEFOVF9TSVpFX0JMT0NLUzoKKyAgICAgICAgICByZXR1cm4gX19maW5kX3RlbXBsYXRlKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX3ByZWQsCisJCQkJIF9fc2VsZWN0b3IsIGNvbnN0YW50X3NpemVfYmxvY2tzX3RhZygpKTsKKwljYXNlIEVRVUFMX1NQTElUOgorICAgICAgICAgIHJldHVybiBfX2ZpbmRfdGVtcGxhdGUoX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fcHJlZCwKKwkJCQkgX19zZWxlY3RvciwgZXF1YWxfc3BsaXRfdGFnKCkpOworCWRlZmF1bHQ6CisgICAgICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKGZhbHNlKTsKKyAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoX19iZWdpbjEsIF9fYmVnaW4yKTsKKwl9CisgICAgfQorCisjaWYgX0dMSUJDWFhfRklORF9FUVVBTF9TUExJVAorCisgIC8qKgorICAgKiAgQGJyaWVmIFBhcmFsbGVsIHN0ZDo6ZmluZCwgZXF1YWwgc3BsaXR0aW5nIHZhcmlhbnQuCisgICAqICBAcGFyYW0gX19iZWdpbjEgQmVnaW4gaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQxIEVuZCBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2JlZ2luMiBCZWdpbiBpdGVyYXRvciBvZiBzZWNvbmQgc2VxdWVuY2UuIFNlY29uZCBfX3NlcXVlbmNlCisgICAqICBtdXN0IGhhdmUgc2FtZSBsZW5ndGggYXMgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19wcmVkIEZpbmQgcHJlZGljYXRlLgorICAgKiAgQHBhcmFtIF9fc2VsZWN0b3IgX0Z1bmN0aW9uYWxpdHkgKGUuIGcuIHN0ZDo6ZmluZF9pZigpLCBzdGQ6OmVxdWFsKCksLi4uKQorICAgKiAgQHJldHVybiBQbGFjZSBvZiBmaW5kaW5nIGluIGJvdGggc2VxdWVuY2VzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsCisgICAgICAgICAgIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZCwKKyAgICAgICAgICAgdHlwZW5hbWUgX1NlbGVjdG9yPgorICAgIHN0ZDo6cGFpcjxfUkFJdGVyMSwgX1JBSXRlcjI+CisgICAgX19maW5kX3RlbXBsYXRlKF9SQUl0ZXIxIF9fYmVnaW4xLCBfUkFJdGVyMSBfX2VuZDEsCisJCSAgICBfUkFJdGVyMiBfX2JlZ2luMiwgX1ByZWQgX19wcmVkLAorCQkgICAgX1NlbGVjdG9yIF9fc2VsZWN0b3IsIGVxdWFsX3NwbGl0X3RhZykKKyAgICB7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fZW5kMSAtIF9fYmVnaW4xKQorCisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2xlbmd0aCA9IF9fZW5kMSAtIF9fYmVnaW4xOworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fcmVzdWx0ID0gX19sZW5ndGg7CisgICAgICBfRGlmZmVyZW5jZVR5cGUqIF9fYm9yZGVyczsKKworICAgICAgb21wX2xvY2tfdCBfX3Jlc3VsdF9sb2NrOworICAgICAgb21wX2luaXRfbG9jaygmX19yZXN1bHRfbG9jayk7CisKKyAgICAgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzID0gX19nZXRfbWF4X3RocmVhZHMoKTsKKyMgICAgIHByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoX19udW1fdGhyZWFkcykKKyAgICAgIHsKKyMgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJeworCSAgX19udW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKwkgIF9fYm9yZGVycyA9IG5ldyBfRGlmZmVyZW5jZVR5cGVbX19udW1fdGhyZWFkcyArIDFdOworCSAgX19lcXVhbGx5X3NwbGl0KF9fbGVuZ3RoLCBfX251bV90aHJlYWRzLCBfX2JvcmRlcnMpOworCX0gLy9zaW5nbGUKKworCV9UaHJlYWRJbmRleCBfX2lhbSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCV9EaWZmZXJlbmNlVHlwZSBfX3N0YXJ0ID0gX19ib3JkZXJzW19faWFtXSwKKwkgICAgICAgICAgICAgICAgIF9fc3RvcCA9IF9fYm9yZGVyc1tfX2lhbSArIDFdOworCisJX1JBSXRlcjEgX19pMSA9IF9fYmVnaW4xICsgX19zdGFydDsKKwlfUkFJdGVyMiBfX2kyID0gX19iZWdpbjIgKyBfX3N0YXJ0OworCWZvciAoX0RpZmZlcmVuY2VUeXBlIF9fcG9zID0gX19zdGFydDsgX19wb3MgPCBfX3N0b3A7ICsrX19wb3MpCisJICB7CisjICAgICAgICAgICBwcmFnbWEgb21wIGZsdXNoKF9fcmVzdWx0KQorCSAgICAvLyBSZXN1bHQgaGFzIGJlZW4gc2V0IHRvIHNvbWV0aGluZyBsb3dlci4KKwkgICAgaWYgKF9fcmVzdWx0IDwgX19wb3MpCisJICAgICAgYnJlYWs7CisKKwkgICAgaWYgKF9fc2VsZWN0b3IoX19pMSwgX19pMiwgX19wcmVkKSkKKwkgICAgICB7CisJCW9tcF9zZXRfbG9jaygmX19yZXN1bHRfbG9jayk7CisJCWlmIChfX3BvcyA8IF9fcmVzdWx0KQorCQkgIF9fcmVzdWx0ID0gX19wb3M7CisJCW9tcF91bnNldF9sb2NrKCZfX3Jlc3VsdF9sb2NrKTsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICArK19faTE7CisJICAgICsrX19pMjsKKwkgIH0KKyAgICAgIH0gLy9wYXJhbGxlbAorCisgICAgICBvbXBfZGVzdHJveV9sb2NrKCZfX3Jlc3VsdF9sb2NrKTsKKyAgICAgIGRlbGV0ZVtdIF9fYm9yZGVyczsKKworICAgICAgcmV0dXJuIHN0ZDo6cGFpcjxfUkFJdGVyMSwgX1JBSXRlcjI+KF9fYmVnaW4xICsgX19yZXN1bHQsCisJCQkJCSAgIF9fYmVnaW4yICsgX19yZXN1bHQpOworICAgIH0KKworI2VuZGlmCisKKyNpZiBfR0xJQkNYWF9GSU5EX0dST1dJTkdfQkxPQ0tTCisKKyAgLyoqCisgICAqICBAYnJpZWYgUGFyYWxsZWwgc3RkOjpmaW5kLCBncm93aW5nIGJsb2NrIHNpemUgdmFyaWFudC4KKyAgICogIEBwYXJhbSBfX2JlZ2luMSBCZWdpbiBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZDEgRW5kIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fYmVnaW4yIEJlZ2luIGl0ZXJhdG9yIG9mIHNlY29uZCBzZXF1ZW5jZS4gU2Vjb25kIF9fc2VxdWVuY2UKKyAgICogIG11c3QgaGF2ZSBzYW1lIGxlbmd0aCBhcyBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX3ByZWQgRmluZCBwcmVkaWNhdGUuCisgICAqICBAcGFyYW0gX19zZWxlY3RvciBfRnVuY3Rpb25hbGl0eSAoZS4gZy4gc3RkOjpmaW5kX2lmKCksIHN0ZDo6ZXF1YWwoKSwuLi4pCisgICAqICBAcmV0dXJuIFBsYWNlIG9mIGZpbmRpbmcgaW4gYm90aCBzZXF1ZW5jZXMuCisgICAqICBAc2VlIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmZpbmRfc2VxdWVudGlhbF9zZWFyY2hfc2l6ZQorICAgKiAgQHNlZSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpmaW5kX3NjYWxlX2ZhY3RvcgorICAgKgorICAgKiAgVGhlcmUgYXJlIHR3byBtYWluIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGdyb3dpbmcgYmxvY2tzIGFuZAorICAgKiAgdGhlIGNvbnN0YW50LXNpemUgYmxvY2tzIHZhcmlhbnRzLgorICAgKiAgMS4gRm9yIEdCLCB0aGUgYmxvY2sgc2l6ZSBncm93czsgZm9yIENTQiwgdGhlIGJsb2NrIHNpemUgaXMgZml4ZWQuCisgICAqICAyLiBGb3IgR0IsIHRoZSBibG9ja3MgYXJlIGFsbG9jYXRlZCBkeW5hbWljYWxseTsKKyAgICogICAgIGZvciBDU0IsIHRoZSBibG9ja3MgYXJlIGFsbG9jYXRlZCBpbiBhIHByZWRldGVybWluZWQgbWFubmVyLAorICAgKiAgICAgbmFtZWx5IHNwYWNpYWwgcm91bmQtcm9iaW4uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwKKyAgICAgICAgICAgdHlwZW5hbWUgX1JBSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkLAorICAgICAgICAgICB0eXBlbmFtZSBfU2VsZWN0b3I+CisgICAgc3RkOjpwYWlyPF9SQUl0ZXIxLCBfUkFJdGVyMj4KKyAgICBfX2ZpbmRfdGVtcGxhdGUoX1JBSXRlcjEgX19iZWdpbjEsIF9SQUl0ZXIxIF9fZW5kMSwKKwkJICAgIF9SQUl0ZXIyIF9fYmVnaW4yLCBfUHJlZCBfX3ByZWQsIF9TZWxlY3RvciBfX3NlbGVjdG9yLAorCQkgICAgZ3Jvd2luZ19ibG9ja3NfdGFnKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19lbmQxIC0gX19iZWdpbjEpCisKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjE+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKworICAgICAgY29uc3QgX1NldHRpbmdzJiBfX3MgPSBfU2V0dGluZ3M6OmdldCgpOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19sZW5ndGggPSBfX2VuZDEgLSBfX2JlZ2luMTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlCisJX19zZXF1ZW50aWFsX3NlYXJjaF9zaXplID0gc3RkOjptaW48X0RpZmZlcmVuY2VUeXBlPgorCShfX2xlbmd0aCwgX19zLmZpbmRfc2VxdWVudGlhbF9zZWFyY2hfc2l6ZSk7CisKKyAgICAgIC8vIFRyeSBpdCBzZXF1ZW50aWFsbHkgZmlyc3QuCisgICAgICBzdGQ6OnBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIyPgorCV9fZmluZF9zZXFfcmVzdWx0ID0gX19zZWxlY3Rvci5fTV9zZXF1ZW50aWFsX2FsZ29yaXRobQorCShfX2JlZ2luMSwgX19iZWdpbjEgKyBfX3NlcXVlbnRpYWxfc2VhcmNoX3NpemUsCisJIF9fYmVnaW4yLCBfX3ByZWQpOworCisgICAgICBpZiAoX19maW5kX3NlcV9yZXN1bHQuZmlyc3QgIT0gKF9fYmVnaW4xICsgX19zZXF1ZW50aWFsX3NlYXJjaF9zaXplKSkKKwlyZXR1cm4gX19maW5kX3NlcV9yZXN1bHQ7CisKKyAgICAgIC8vIEluZGV4IG9mIGJlZ2lubmluZyBvZiBuZXh0IGZyZWUgYmxvY2sgKGFmdGVyIHNlcXVlbnRpYWwgZmluZCkuCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19uZXh0X2Jsb2NrX3N0YXJ0ID0gX19zZXF1ZW50aWFsX3NlYXJjaF9zaXplOworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fcmVzdWx0ID0gX19sZW5ndGg7CisKKyAgICAgIG9tcF9sb2NrX3QgX19yZXN1bHRfbG9jazsKKyAgICAgIG9tcF9pbml0X2xvY2soJl9fcmVzdWx0X2xvY2spOworCisgICAgICBjb25zdCBmbG9hdCBfX3NjYWxlX2ZhY3RvciA9IF9fcy5maW5kX3NjYWxlX2ZhY3RvcjsKKworICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMgPSBfX2dldF9tYXhfdGhyZWFkcygpOworIyAgICAgcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQoX19yZXN1bHQpIG51bV90aHJlYWRzKF9fbnVtX3RocmVhZHMpCisgICAgICB7CisjICAgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJX19udW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKworCS8vIE5vdCB3aXRoaW4gZmlyc3QgX19rIGVsZW1lbnRzIC0+IHN0YXJ0IHBhcmFsbGVsLgorCV9UaHJlYWRJbmRleCBfX2lhbSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCisJX0RpZmZlcmVuY2VUeXBlIF9fYmxvY2tfc2l6ZSA9CisJICBzdGQ6Om1heDxfRGlmZmVyZW5jZVR5cGU+KDEsIF9fc2NhbGVfZmFjdG9yICogX19uZXh0X2Jsb2NrX3N0YXJ0KTsKKwlfRGlmZmVyZW5jZVR5cGUgX19zdGFydCA9IF9fZmV0Y2hfYW5kX2FkZDxfRGlmZmVyZW5jZVR5cGU+CisJICAoJl9fbmV4dF9ibG9ja19zdGFydCwgX19ibG9ja19zaXplKTsKKworCS8vIEdldCBuZXcgYmxvY2ssIHVwZGF0ZSBwb2ludGVyIHRvIG5leHQgYmxvY2suCisJX0RpZmZlcmVuY2VUeXBlIF9fc3RvcCA9CisJICBzdGQ6Om1pbjxfRGlmZmVyZW5jZVR5cGU+KF9fbGVuZ3RoLCBfX3N0YXJ0ICsgX19ibG9ja19zaXplKTsKKworCXN0ZDo6cGFpcjxfUkFJdGVyMSwgX1JBSXRlcjI+IF9fbG9jYWxfcmVzdWx0OworCisJd2hpbGUgKF9fc3RhcnQgPCBfX2xlbmd0aCkKKwkgIHsKKyMgICAgICAgICAgIHByYWdtYSBvbXAgZmx1c2goX19yZXN1bHQpCisJICAgIC8vIEdldCBuZXcgdmFsdWUgb2YgcmVzdWx0LgorCSAgICBpZiAoX19yZXN1bHQgPCBfX3N0YXJ0KQorCSAgICAgIHsKKwkJLy8gTm8gY2hhbmNlIHRvIGZpbmQgZmlyc3QgZWxlbWVudC4KKwkJYnJlYWs7CisJICAgICAgfQorCisJICAgIF9fbG9jYWxfcmVzdWx0ID0gX19zZWxlY3Rvci5fTV9zZXF1ZW50aWFsX2FsZ29yaXRobQorCSAgICAgIChfX2JlZ2luMSArIF9fc3RhcnQsIF9fYmVnaW4xICsgX19zdG9wLAorCSAgICAgICBfX2JlZ2luMiArIF9fc3RhcnQsIF9fcHJlZCk7CisKKwkgICAgaWYgKF9fbG9jYWxfcmVzdWx0LmZpcnN0ICE9IChfX2JlZ2luMSArIF9fc3RvcCkpCisJICAgICAgeworCQlvbXBfc2V0X2xvY2soJl9fcmVzdWx0X2xvY2spOworCQlpZiAoKF9fbG9jYWxfcmVzdWx0LmZpcnN0IC0gX19iZWdpbjEpIDwgX19yZXN1bHQpCisJCSAgeworCQkgICAgX19yZXN1bHQgPSBfX2xvY2FsX3Jlc3VsdC5maXJzdCAtIF9fYmVnaW4xOworCisJCSAgICAvLyBSZXN1bHQgY2Fubm90IGJlIGluIGZ1dHVyZSBibG9ja3MsIHN0b3AgYWxnb3JpdGhtLgorCQkgICAgX19mZXRjaF9hbmRfYWRkPF9EaWZmZXJlbmNlVHlwZT4oJl9fbmV4dF9ibG9ja19zdGFydCwKKwkJCQkJCSAgICAgX19sZW5ndGgpOworCQkgIH0KKwkJb21wX3Vuc2V0X2xvY2soJl9fcmVzdWx0X2xvY2spOworCSAgICAgIH0KKworCSAgICBfRGlmZmVyZW5jZVR5cGUgX19ibG9ja19zaXplID0KKwkgICAgIHN0ZDo6bWF4PF9EaWZmZXJlbmNlVHlwZT4oMSwgX19zY2FsZV9mYWN0b3IgKiBfX25leHRfYmxvY2tfc3RhcnQpOworCisJICAgIC8vIEdldCBuZXcgYmxvY2ssIHVwZGF0ZSBwb2ludGVyIHRvIG5leHQgYmxvY2suCisJICAgIF9fc3RhcnQgPSBfX2ZldGNoX2FuZF9hZGQ8X0RpZmZlcmVuY2VUeXBlPigmX19uZXh0X2Jsb2NrX3N0YXJ0LAorCQkJCQkJICAgICAgIF9fYmxvY2tfc2l6ZSk7CisJICAgIF9fc3RvcCA9CisJICAgICAgc3RkOjptaW48X0RpZmZlcmVuY2VUeXBlPihfX2xlbmd0aCwgX19zdGFydCArIF9fYmxvY2tfc2l6ZSk7CisJICB9CisgICAgICB9IC8vcGFyYWxsZWwKKworICAgICAgb21wX2Rlc3Ryb3lfbG9jaygmX19yZXN1bHRfbG9jayk7CisKKyAgICAgIC8vIFJldHVybiBpdGVyYXRvciBvbiBmb3VuZCBlbGVtZW50LgorICAgICAgcmV0dXJuCisJc3RkOjpwYWlyPF9SQUl0ZXIxLCBfUkFJdGVyMj4oX19iZWdpbjEgKyBfX3Jlc3VsdCwKKwkJCQkgICAgICBfX2JlZ2luMiArIF9fcmVzdWx0KTsKKyAgICB9CisKKyNlbmRpZgorCisjaWYgX0dMSUJDWFhfRklORF9DT05TVEFOVF9TSVpFX0JMT0NLUworCisgIC8qKgorICAgKiAgIEBicmllZiBQYXJhbGxlbCBzdGQ6OmZpbmQsIGNvbnN0YW50IGJsb2NrIHNpemUgdmFyaWFudC4KKyAgICogIEBwYXJhbSBfX2JlZ2luMSBCZWdpbiBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZDEgRW5kIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fYmVnaW4yIEJlZ2luIGl0ZXJhdG9yIG9mIHNlY29uZCBzZXF1ZW5jZS4gU2Vjb25kIF9fc2VxdWVuY2UKKyAgICogIG11c3QgaGF2ZSBzYW1lIGxlbmd0aCBhcyBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX3ByZWQgRmluZCBwcmVkaWNhdGUuCisgICAqICBAcGFyYW0gX19zZWxlY3RvciBfRnVuY3Rpb25hbGl0eSAoZS4gZy4gc3RkOjpmaW5kX2lmKCksIHN0ZDo6ZXF1YWwoKSwuLi4pCisgICAqICBAcmV0dXJuIFBsYWNlIG9mIGZpbmRpbmcgaW4gYm90aCBzZXF1ZW5jZXMuCisgICAqICBAc2VlIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmZpbmRfc2VxdWVudGlhbF9zZWFyY2hfc2l6ZQorICAgKiAgQHNlZSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpmaW5kX2Jsb2NrX3NpemUKKyAgICogIFRoZXJlIGFyZSB0d28gbWFpbiBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBncm93aW5nIGJsb2NrcyBhbmQgdGhlCisgICAqICBjb25zdGFudC1zaXplIGJsb2NrcyB2YXJpYW50cy4KKyAgICogIDEuIEZvciBHQiwgdGhlIGJsb2NrIHNpemUgZ3Jvd3M7IGZvciBDU0IsIHRoZSBibG9jayBzaXplIGlzIGZpeGVkLgorICAgKiAgMi4gRm9yIEdCLCB0aGUgYmxvY2tzIGFyZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHk7IGZvciBDU0IsIHRoZQorICAgKiAgYmxvY2tzIGFyZSBhbGxvY2F0ZWQgaW4gYSBwcmVkZXRlcm1pbmVkIG1hbm5lciwgbmFtZWx5IHNwYWNpYWwKKyAgICogIHJvdW5kLXJvYmluLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsCisgICAgICAgICAgIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZCwKKyAgICAgICAgICAgdHlwZW5hbWUgX1NlbGVjdG9yPgorICAgIHN0ZDo6cGFpcjxfUkFJdGVyMSwgX1JBSXRlcjI+CisgICAgX19maW5kX3RlbXBsYXRlKF9SQUl0ZXIxIF9fYmVnaW4xLCBfUkFJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICBfUkFJdGVyMiBfX2JlZ2luMiwgX1ByZWQgX19wcmVkLCBfU2VsZWN0b3IgX19zZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgIGNvbnN0YW50X3NpemVfYmxvY2tzX3RhZykKKyAgICB7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fZW5kMSAtIF9fYmVnaW4xKQorICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMT4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworCisgICAgICBjb25zdCBfU2V0dGluZ3MmIF9fcyA9IF9TZXR0aW5nczo6Z2V0KCk7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2xlbmd0aCA9IF9fZW5kMSAtIF9fYmVnaW4xOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19zZXF1ZW50aWFsX3NlYXJjaF9zaXplID0gc3RkOjptaW48X0RpZmZlcmVuY2VUeXBlPgorCShfX2xlbmd0aCwgX19zLmZpbmRfc2VxdWVudGlhbF9zZWFyY2hfc2l6ZSk7CisKKyAgICAgIC8vIFRyeSBpdCBzZXF1ZW50aWFsbHkgZmlyc3QuCisgICAgICBzdGQ6OnBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIyPgorCV9fZmluZF9zZXFfcmVzdWx0ID0gX19zZWxlY3Rvci5fTV9zZXF1ZW50aWFsX2FsZ29yaXRobQorCShfX2JlZ2luMSwgX19iZWdpbjEgKyBfX3NlcXVlbnRpYWxfc2VhcmNoX3NpemUsIF9fYmVnaW4yLCBfX3ByZWQpOworCisgICAgICBpZiAoX19maW5kX3NlcV9yZXN1bHQuZmlyc3QgIT0gKF9fYmVnaW4xICsgX19zZXF1ZW50aWFsX3NlYXJjaF9zaXplKSkKKwlyZXR1cm4gX19maW5kX3NlcV9yZXN1bHQ7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3Jlc3VsdCA9IF9fbGVuZ3RoOworICAgICAgb21wX2xvY2tfdCBfX3Jlc3VsdF9sb2NrOworICAgICAgb21wX2luaXRfbG9jaygmX19yZXN1bHRfbG9jayk7CisKKyAgICAgIC8vIE5vdCB3aXRoaW4gZmlyc3QgX19zZXF1ZW50aWFsX3NlYXJjaF9zaXplIGVsZW1lbnRzIC0+IHN0YXJ0IHBhcmFsbGVsLgorCisgICAgICBfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcyA9IF9fZ2V0X21heF90aHJlYWRzKCk7CisjICAgICBwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChfX3Jlc3VsdCkgbnVtX3RocmVhZHMoX19udW1fdGhyZWFkcykKKyAgICAgIHsKKyMgICAgICAgcHJhZ21hIG9tcCBzaW5nbGUKKwlfX251bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworCisJX1RocmVhZEluZGV4IF9faWFtID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisJX0RpZmZlcmVuY2VUeXBlIF9fYmxvY2tfc2l6ZSA9IF9fcy5maW5kX2luaXRpYWxfYmxvY2tfc2l6ZTsKKworCS8vIEZpcnN0IGVsZW1lbnQgb2YgdGhyZWFkJ3MgY3VycmVudCBpdGVyYXRpb24uCisJX0RpZmZlcmVuY2VUeXBlIF9faXRlcmF0aW9uX3N0YXJ0ID0gX19zZXF1ZW50aWFsX3NlYXJjaF9zaXplOworCisJLy8gV2hlcmUgdG8gd29yayAoaW5pdGlhbGl6YXRpb24pLgorCV9EaWZmZXJlbmNlVHlwZSBfX3N0YXJ0ID0gX19pdGVyYXRpb25fc3RhcnQgKyBfX2lhbSAqIF9fYmxvY2tfc2l6ZTsKKwlfRGlmZmVyZW5jZVR5cGUgX19zdG9wID0gc3RkOjptaW48X0RpZmZlcmVuY2VUeXBlPihfX2xlbmd0aCwKKwkJCQkJCQkgICBfX3N0YXJ0CisJCQkJCQkJICAgKyBfX2Jsb2NrX3NpemUpOworCisJc3RkOjpwYWlyPF9SQUl0ZXIxLCBfUkFJdGVyMj4gX19sb2NhbF9yZXN1bHQ7CisKKwl3aGlsZSAoX19zdGFydCA8IF9fbGVuZ3RoKQorCSAgeworCSAgICAvLyBHZXQgbmV3IHZhbHVlIG9mIHJlc3VsdC4KKyMgICAgICAgICAgIHByYWdtYSBvbXAgZmx1c2goX19yZXN1bHQpCisJICAgIC8vIE5vIGNoYW5jZSB0byBmaW5kIGZpcnN0IGVsZW1lbnQuCisJICAgIGlmIChfX3Jlc3VsdCA8IF9fc3RhcnQpCisJICAgICAgYnJlYWs7CisKKwkgICAgX19sb2NhbF9yZXN1bHQgPSBfX3NlbGVjdG9yLl9NX3NlcXVlbnRpYWxfYWxnb3JpdGhtCisJICAgICAgKF9fYmVnaW4xICsgX19zdGFydCwgX19iZWdpbjEgKyBfX3N0b3AsCisJICAgICAgIF9fYmVnaW4yICsgX19zdGFydCwgX19wcmVkKTsKKworCSAgICBpZiAoX19sb2NhbF9yZXN1bHQuZmlyc3QgIT0gKF9fYmVnaW4xICsgX19zdG9wKSkKKwkgICAgICB7CisJCW9tcF9zZXRfbG9jaygmX19yZXN1bHRfbG9jayk7CisJCWlmICgoX19sb2NhbF9yZXN1bHQuZmlyc3QgLSBfX2JlZ2luMSkgPCBfX3Jlc3VsdCkKKwkJICBfX3Jlc3VsdCA9IF9fbG9jYWxfcmVzdWx0LmZpcnN0IC0gX19iZWdpbjE7CisJCW9tcF91bnNldF9sb2NrKCZfX3Jlc3VsdF9sb2NrKTsKKwkJLy8gV2lsbCBub3QgZmluZCBiZXR0ZXIgdmFsdWUgaW4gaXRzIGludGVydmFsLgorCQlicmVhazsKKwkgICAgICB9CisKKwkgICAgX19pdGVyYXRpb25fc3RhcnQgKz0gX19udW1fdGhyZWFkcyAqIF9fYmxvY2tfc2l6ZTsKKworCSAgICAvLyBXaGVyZSB0byB3b3JrLgorCSAgICBfX3N0YXJ0ID0gX19pdGVyYXRpb25fc3RhcnQgKyBfX2lhbSAqIF9fYmxvY2tfc2l6ZTsKKwkgICAgX19zdG9wID0gc3RkOjptaW48X0RpZmZlcmVuY2VUeXBlPihfX2xlbmd0aCwKKwkJCQkJICAgICAgIF9fc3RhcnQgKyBfX2Jsb2NrX3NpemUpOworCSAgfQorICAgICAgfSAvL3BhcmFsbGVsCisKKyAgICAgIG9tcF9kZXN0cm95X2xvY2soJl9fcmVzdWx0X2xvY2spOworCisgICAgICAvLyBSZXR1cm4gaXRlcmF0b3Igb24gZm91bmQgZWxlbWVudC4KKyAgICAgIHJldHVybiBzdGQ6OnBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIyPihfX2JlZ2luMSArIF9fcmVzdWx0LAorCQkJCQkgICBfX2JlZ2luMiArIF9fcmVzdWx0KTsKKyAgICB9CisjZW5kaWYKK30gLy8gZW5kIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfRklORF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2ZpbmRfc2VsZWN0b3JzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2ZpbmRfc2VsZWN0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjNzBkYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvZmluZF9zZWxlY3RvcnMuaApAQCAtMCwwICsxLDE5NyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL2ZpbmRfc2VsZWN0b3JzLmgKKyAqICBAYnJpZWYgX0Z1bmN0aW9uIG9iamVjdHMgcmVwcmVzZW50aW5nIGRpZmZlcmVudCB0YXNrcyB0byBiZSBwbHVnZ2VkCisgKiAgaW50byB0aGUgcGFyYWxsZWwgZmluZCBhbGdvcml0aG0uCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBGZWxpeCBQdXR6ZS4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9GSU5EX1NFTEVDVE9SU19ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0ZJTkRfU0VMRUNUT1JTX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvdGFncy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2Jhc2ljX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfcGFpci5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLyoqIEBicmllZiBCYXNlIGNsYXNzIG9mIGFsbCBfX2dudV9wYXJhbGxlbDo6X19maW5kX3RlbXBsYXRlIHNlbGVjdG9ycy4gKi8KKyAgc3RydWN0IF9fZ2VuZXJpY19maW5kX3NlbGVjdG9yCisgIHsgfTsKKworICAvKiogCisgICAqICBAYnJpZWYgVGVzdCBwcmVkaWNhdGUgb24gYSBzaW5nbGUgZWxlbWVudCwgdXNlZCBmb3Igc3RkOjpmaW5kKCkKKyAgICogIGFuZCBzdGQ6OmZpbmRfaWYgKCkuCisgICAqLworICBzdHJ1Y3QgX19maW5kX2lmX3NlbGVjdG9yIDogcHVibGljIF9fZ2VuZXJpY19maW5kX3NlbGVjdG9yCisgIHsKKyAgICAvKiogQGJyaWVmIFRlc3Qgb24gb25lIHBvc2l0aW9uLgorICAgICAqIEBwYXJhbSBfX2kxIF9JdGVyYXRvciBvbiBmaXJzdCBzZXF1ZW5jZS4KKyAgICAgKiBAcGFyYW0gX19pMiBfSXRlcmF0b3Igb24gc2Vjb25kIHNlcXVlbmNlICh1bnVzZWQpLgorICAgICAqIEBwYXJhbSBfX3ByZWQgRmluZCBwcmVkaWNhdGUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkPgorICAgICAgYm9vbCAKKyAgICAgIG9wZXJhdG9yKCkoX1JBSXRlcjEgX19pMSwgX1JBSXRlcjIgX19pMiwgX1ByZWQgX19wcmVkKQorICAgICAgeyByZXR1cm4gX19wcmVkKCpfX2kxKTsgfQorCisgICAgLyoqIEBicmllZiBDb3JyZXNwb25kaW5nIHNlcXVlbnRpYWwgYWxnb3JpdGhtIG9uIGEgc2VxdWVuY2UuCisgICAgICogIEBwYXJhbSBfX2JlZ2luMSBCZWdpbiBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICAgKiAgQHBhcmFtIF9fZW5kMSBFbmQgaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAgICogIEBwYXJhbSBfX2JlZ2luMiBCZWdpbiBpdGVyYXRvciBvZiBzZWNvbmQgc2VxdWVuY2UuCisgICAgICogIEBwYXJhbSBfX3ByZWQgRmluZCBwcmVkaWNhdGUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkPgorICAgICAgc3RkOjpwYWlyPF9SQUl0ZXIxLCBfUkFJdGVyMj4gCisgICAgICBfTV9zZXF1ZW50aWFsX2FsZ29yaXRobShfUkFJdGVyMSBfX2JlZ2luMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIyIF9fYmVnaW4yLCBfUHJlZCBfX3ByZWQpCisgICAgICB7IHJldHVybiBzdGQ6Om1ha2VfcGFpcihmaW5kX2lmKF9fYmVnaW4xLCBfX2VuZDEsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVudGlhbF90YWcoKSksIF9fYmVnaW4yKTsgfQorICB9OworCisgIC8qKiBAYnJpZWYgVGVzdCBwcmVkaWNhdGUgb24gdHdvIGFkamFjZW50IGVsZW1lbnRzLiAqLworICBzdHJ1Y3QgX19hZGphY2VudF9maW5kX3NlbGVjdG9yIDogcHVibGljIF9fZ2VuZXJpY19maW5kX3NlbGVjdG9yCisgIHsKKyAgICAvKiogQGJyaWVmIFRlc3Qgb24gb25lIHBvc2l0aW9uLgorICAgICAqICBAcGFyYW0gX19pMSBfSXRlcmF0b3Igb24gZmlyc3Qgc2VxdWVuY2UuCisgICAgICogIEBwYXJhbSBfX2kyIF9JdGVyYXRvciBvbiBzZWNvbmQgc2VxdWVuY2UgKHVudXNlZCkuCisgICAgICogIEBwYXJhbSBfX3ByZWQgRmluZCBwcmVkaWNhdGUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkPgorICAgICAgYm9vbCAKKyAgICAgIG9wZXJhdG9yKCkoX1JBSXRlcjEgX19pMSwgX1JBSXRlcjIgX19pMiwgX1ByZWQgX19wcmVkKQorICAgICAgeworICAgICAgICAvLyBQYXNzZWQgZW5kIGl0ZXJhdG9yIGlzIG9uZSBzaG9ydC4KKyAgICAgICAgcmV0dXJuIF9fcHJlZCgqX19pMSwgKihfX2kxICsgMSkpOworICAgICAgfQorCisgICAgLyoqIEBicmllZiBDb3JyZXNwb25kaW5nIHNlcXVlbnRpYWwgYWxnb3JpdGhtIG9uIGEgc2VxdWVuY2UuCisgICAgICogIEBwYXJhbSBfX2JlZ2luMSBCZWdpbiBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICAgKiAgQHBhcmFtIF9fZW5kMSBFbmQgaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAgICogIEBwYXJhbSBfX2JlZ2luMiBCZWdpbiBpdGVyYXRvciBvZiBzZWNvbmQgc2VxdWVuY2UuCisgICAgICogIEBwYXJhbSBfX3ByZWQgRmluZCBwcmVkaWNhdGUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkPgorICAgICAgc3RkOjpwYWlyPF9SQUl0ZXIxLCBfUkFJdGVyMj4KKyAgICAgIF9NX3NlcXVlbnRpYWxfYWxnb3JpdGhtKF9SQUl0ZXIxIF9fYmVnaW4xLAorCQkJICAgICAgX1JBSXRlcjEgX19lbmQxLAorCQkJICAgICAgX1JBSXRlcjIgX19iZWdpbjIsIF9QcmVkIF9fcHJlZCkKKyAgICAgIHsKKyAgICAgICAgLy8gUGFzc2VkIGVuZCBpdGVyYXRvciBpcyBvbmUgc2hvcnQuCisgICAgICAgIF9SQUl0ZXIxIF9fc3BvdCA9IGFkamFjZW50X2ZpbmQoX19iZWdpbjEsIF9fZW5kMSArIDEsCisJCQkJCV9fcHJlZCwgc2VxdWVudGlhbF90YWcoKSk7CisgICAgICAgIGlmIChfX3Nwb3QgPT0gKF9fZW5kMSArIDEpKQorICAgICAgICAgIF9fc3BvdCA9IF9fZW5kMTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKF9fc3BvdCwgX19iZWdpbjIpOworICAgICAgfQorICB9OworCisgIC8qKiBAYnJpZWYgVGVzdCBpbnZlcnRlZCBwcmVkaWNhdGUgb24gYSBzaW5nbGUgZWxlbWVudC4gKi8KKyAgc3RydWN0IF9fbWlzbWF0Y2hfc2VsZWN0b3IgOiBwdWJsaWMgX19nZW5lcmljX2ZpbmRfc2VsZWN0b3IKKyAgeworICAgIC8qKiAKKyAgICAgKiAgQGJyaWVmIFRlc3Qgb24gb25lIHBvc2l0aW9uLgorICAgICAqICBAcGFyYW0gX19pMSBfSXRlcmF0b3Igb24gZmlyc3Qgc2VxdWVuY2UuCisgICAgICogIEBwYXJhbSBfX2kyIF9JdGVyYXRvciBvbiBzZWNvbmQgc2VxdWVuY2UgKHVudXNlZCkuCisgICAgICogIEBwYXJhbSBfX3ByZWQgRmluZCBwcmVkaWNhdGUuIAorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgICB0eXBlbmFtZSBfUHJlZD4KKyAgICAgIGJvb2wgCisgICAgICBvcGVyYXRvcigpKF9SQUl0ZXIxIF9faTEsIF9SQUl0ZXIyIF9faTIsIF9QcmVkIF9fcHJlZCkKKyAgICAgIHsgcmV0dXJuICFfX3ByZWQoKl9faTEsICpfX2kyKTsgfQorCisgICAgLyoqIAorICAgICAqICBAYnJpZWYgQ29ycmVzcG9uZGluZyBzZXF1ZW50aWFsIGFsZ29yaXRobSBvbiBhIHNlcXVlbmNlLgorICAgICAqICBAcGFyYW0gX19iZWdpbjEgQmVnaW4gaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAgICogIEBwYXJhbSBfX2VuZDEgRW5kIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgICAqICBAcGFyYW0gX19iZWdpbjIgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgICAqICBAcGFyYW0gX19wcmVkIEZpbmQgcHJlZGljYXRlLiAKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsCisgICAgICAgICAgICAgdHlwZW5hbWUgX1ByZWQ+CisgICAgICBzdGQ6OnBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIyPgorICAgICAgX01fc2VxdWVudGlhbF9hbGdvcml0aG0oX1JBSXRlcjEgX19iZWdpbjEsCisJCQkgICAgICBfUkFJdGVyMSBfX2VuZDEsCisJCQkgICAgICBfUkFJdGVyMiBfX2JlZ2luMiwgX1ByZWQgX19wcmVkKQorICAgICAgeyByZXR1cm4gbWlzbWF0Y2goX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsCisJCQlfX3ByZWQsIHNlcXVlbnRpYWxfdGFnKCkpOyB9CisgIH07CisKKworICAvKiogQGJyaWVmIFRlc3QgcHJlZGljYXRlIG9uIHNldmVyYWwgZWxlbWVudHMuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3I+CisgICAgc3RydWN0IF9fZmluZF9maXJzdF9vZl9zZWxlY3RvciA6IHB1YmxpYyBfX2dlbmVyaWNfZmluZF9zZWxlY3RvcgorICAgIHsKKyAgICAgIF9GSXRlcmF0b3IgX01fYmVnaW47CisgICAgICBfRkl0ZXJhdG9yIF9NX2VuZDsKKworICAgICAgZXhwbGljaXQgX19maW5kX2ZpcnN0X29mX3NlbGVjdG9yKF9GSXRlcmF0b3IgX19iZWdpbiwKKwkJCQkJX0ZJdGVyYXRvciBfX2VuZCkKKyAgICAgIDogX01fYmVnaW4oX19iZWdpbiksIF9NX2VuZChfX2VuZCkgeyB9CisKKyAgICAgIC8qKiBAYnJpZWYgVGVzdCBvbiBvbmUgcG9zaXRpb24uCisgICAgICAgKiAgQHBhcmFtIF9faTEgX0l0ZXJhdG9yIG9uIGZpcnN0IHNlcXVlbmNlLgorICAgICAgICogIEBwYXJhbSBfX2kyIF9JdGVyYXRvciBvbiBzZWNvbmQgc2VxdWVuY2UgKHVudXNlZCkuCisgICAgICAgKiAgQHBhcmFtIF9fcHJlZCBGaW5kIHByZWRpY2F0ZS4gKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwKKwkgICAgICAgdHlwZW5hbWUgX1ByZWQ+CisgICAgICAgIGJvb2wKKyAgICAgICAgb3BlcmF0b3IoKShfUkFJdGVyMSBfX2kxLCBfUkFJdGVyMiBfX2kyLCBfUHJlZCBfX3ByZWQpCisgICAgICAgIHsKKwkgIGZvciAoX0ZJdGVyYXRvciBfX3Bvc19pbl9jYW5kaWRhdGVzID0gX01fYmVnaW47CisJICAgICAgIF9fcG9zX2luX2NhbmRpZGF0ZXMgIT0gX01fZW5kOyArK19fcG9zX2luX2NhbmRpZGF0ZXMpCisJICAgIGlmIChfX3ByZWQoKl9faTEsICpfX3Bvc19pbl9jYW5kaWRhdGVzKSkKKwkgICAgICByZXR1cm4gdHJ1ZTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIC8qKiBAYnJpZWYgQ29ycmVzcG9uZGluZyBzZXF1ZW50aWFsIGFsZ29yaXRobSBvbiBhIHNlcXVlbmNlLgorICAgICAgICogIEBwYXJhbSBfX2JlZ2luMSBCZWdpbiBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICAgICAqICBAcGFyYW0gX19lbmQxIEVuZCBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICAgICAqICBAcGFyYW0gX19iZWdpbjIgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgICAgICogIEBwYXJhbSBfX3ByZWQgRmluZCBwcmVkaWNhdGUuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsCisJICAgICAgIHR5cGVuYW1lIF9QcmVkPgorICAgICAgICBzdGQ6OnBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIyPgorICAgICAgICBfTV9zZXF1ZW50aWFsX2FsZ29yaXRobShfUkFJdGVyMSBfX2JlZ2luMSwKKwkJCQlfUkFJdGVyMSBfX2VuZDEsCisJCQkJX1JBSXRlcjIgX19iZWdpbjIsIF9QcmVkIF9fcHJlZCkKKyAgICAgICAgeworCSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGZpbmRfZmlyc3Rfb2YoX19iZWdpbjEsIF9fZW5kMSwKKwkJCQkJICAgICAgX01fYmVnaW4sIF9NX2VuZCwgX19wcmVkLAorCQkJCQkgICAgICBzZXF1ZW50aWFsX3RhZygpKSwgX19iZWdpbjIpOworCX0KKyAgICAgfTsKK30KKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX0ZJTkRfU0VMRUNUT1JTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvZm9yX2VhY2guaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvZm9yX2VhY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWJlMzIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9mb3JfZWFjaC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9mb3JfZWFjaC5oCisgKiAgQGJyaWVmIE1haW4gaW50ZXJmYWNlIGZvciBlbWJhcnJhc3NpbmdseSBwYXJhbGxlbCBmdW5jdGlvbnMuCisgKgorICogIFRoZSBleHBsaWNpdCBpbXBsZW1lbnRhdGlvbiBhcmUgaW4gb3RoZXIgaGVhZGVyIGZpbGVzLCBsaWtlCisgKiAgd29ya3N0ZWFsaW5nLmgsIHBhcl9sb29wLmgsIG9tcF9sb29wLmgsIGFuZCBvbXBfbG9vcF9zdGF0aWMuaC4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEZlbGl4IFB1dHplLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX0ZPUl9FQUNIX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfRk9SX0VBQ0hfSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC9zZXR0aW5ncy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3Bhcl9sb29wLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvb21wX2xvb3AuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC93b3Jrc3RlYWxpbmcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgQ2hvc2UgdGhlIGRlc2lyZWQgYWxnb3JpdGhtIGJ5IGV2YWx1YXRpbmcgQGMgX19wYXJhbGxlbGlzbV90YWcuCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX191c2VyX29wIEEgdXNlci1zcGVjaWZpZWQgZnVuY3RvciAoY29tcGFyYXRvciwgcHJlZGljYXRlLAorICAgKiAgYXNzb2NpYXRpdmUgb3BlcmF0b3IsLi4uKQorICAgKiAgQHBhcmFtIF9fZnVuY3Rpb25hbGl0eSBmdW5jdG9yIHRvIEBhIHByb2Nlc3MgYW4gZWxlbWVudCB3aXRoCisgICAqICBfX3VzZXJfb3AgKGRlcGVuZHMgb24gZGVzaXJlZCBmdW5jdGlvbmFsaXR5LCBlLiBnLiBhY2N1bXVsYXRlLAorICAgKiAgZm9yX2VhY2gsLi4uCisgICAqICBAcGFyYW0gX19yZWR1Y3Rpb24gUmVkdWN0aW9uIGZ1bmN0b3IuCisgICAqICBAcGFyYW0gX19yZWR1Y3Rpb25fc3RhcnQgSW5pdGlhbCB2YWx1ZSBmb3IgcmVkdWN0aW9uLgorICAgKiAgQHBhcmFtIF9fb3V0cHV0IE91dHB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSBfX2JvdW5kIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHByb2Nlc3NlZC4KKyAgICogIEBwYXJhbSBfX3BhcmFsbGVsaXNtX3RhZyBQYXJhbGxlbGl6YXRpb24gbWV0aG9kICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1VzZXJPcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0Z1bmN0aW9uYWxpdHksIHR5cGVuYW1lIF9SZWQsIHR5cGVuYW1lIF9SZXN1bHQ+CisgICAgX1VzZXJPcAorICAgIF9fZm9yX2VhY2hfdGVtcGxhdGVfcmFuZG9tX2FjY2VzcyhfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVXNlck9wIF9fdXNlcl9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Z1bmN0aW9uYWxpdHkmIF9fZnVuY3Rpb25hbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JlZCBfX3JlZHVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1Jlc3VsdCBfX3JlZHVjdGlvbl9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1Jlc3VsdCYgX19vdXRwdXQsIHR5cGVuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX19ib3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIGlmIChfX3BhcmFsbGVsaXNtX3RhZyA9PSBwYXJhbGxlbF91bmJhbGFuY2VkKQorICAgICAgICByZXR1cm4gX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzX2VkCisJICAoX19iZWdpbiwgX19lbmQsIF9fdXNlcl9vcCwgX19mdW5jdGlvbmFsaXR5LCBfX3JlZHVjdGlvbiwKKwkgICBfX3JlZHVjdGlvbl9zdGFydCwgX19vdXRwdXQsIF9fYm91bmQpOworICAgICAgZWxzZSBpZiAoX19wYXJhbGxlbGlzbV90YWcgPT0gcGFyYWxsZWxfb21wX2xvb3ApCisgICAgICAgIHJldHVybiBfX2Zvcl9lYWNoX3RlbXBsYXRlX3JhbmRvbV9hY2Nlc3Nfb21wX2xvb3AKKwkgIChfX2JlZ2luLCBfX2VuZCwgX191c2VyX29wLCBfX2Z1bmN0aW9uYWxpdHksIF9fcmVkdWN0aW9uLAorCSAgIF9fcmVkdWN0aW9uX3N0YXJ0LCBfX291dHB1dCwgX19ib3VuZCk7CisgICAgICBlbHNlIGlmIChfX3BhcmFsbGVsaXNtX3RhZyA9PSBwYXJhbGxlbF9vbXBfbG9vcF9zdGF0aWMpCisgICAgICAgIHJldHVybiBfX2Zvcl9lYWNoX3RlbXBsYXRlX3JhbmRvbV9hY2Nlc3Nfb21wX2xvb3AKKwkgIChfX2JlZ2luLCBfX2VuZCwgX191c2VyX29wLCBfX2Z1bmN0aW9uYWxpdHksIF9fcmVkdWN0aW9uLAorCSAgIF9fcmVkdWN0aW9uX3N0YXJ0LCBfX291dHB1dCwgX19ib3VuZCk7CisgICAgICBlbHNlICAgICAgLy9lLiBnLiBwYXJhbGxlbF9iYWxhbmNlZAorICAgICAgICByZXR1cm4gX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzX3dvcmtzdGVhbGluZworCSAgKF9fYmVnaW4sIF9fZW5kLCBfX3VzZXJfb3AsIF9fZnVuY3Rpb25hbGl0eSwgX19yZWR1Y3Rpb24sCisJICAgX19yZWR1Y3Rpb25fc3RhcnQsIF9fb3V0cHV0LCBfX2JvdW5kKTsKKyAgfQorfQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfRk9SX0VBQ0hfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9mb3JfZWFjaF9zZWxlY3RvcnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvZm9yX2VhY2hfc2VsZWN0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2MzA4NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvZm9yX2VhY2hfc2VsZWN0b3JzLmgKQEAgLTAsMCArMSwzNDkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9mb3JfZWFjaF9zZWxlY3RvcnMuaAorICogIEBicmllZiBGdW5jdG9ycyByZXByZXNlbnRpbmcgZGlmZmVyZW50IHRhc2tzIHRvIGJlIHBsdWdnZWQgaW50byB0aGUKKyAqICBnZW5lcmljIHBhcmFsbGVsaXphdGlvbiBtZXRob2RzIGZvciBlbWJhcnJhc3NpbmdseSBwYXJhbGxlbCBmdW5jdGlvbnMuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBGZWxpeCBQdXR6ZS4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9GT1JfRUFDSF9TRUxFQ1RPUlNfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9GT1JfRUFDSF9TRUxFQ1RPUlNfSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNpY19pdGVyYXRvci5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLyoqIEBicmllZiBHZW5lcmljIF9fc2VsZWN0b3IgZm9yIGVtYmFycmFzc2luZ2x5IHBhcmFsbGVsIGZ1bmN0aW9ucy4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0PgorICAgIHN0cnVjdCBfX2dlbmVyaWNfZm9yX2VhY2hfc2VsZWN0b3IKKyAgICB7CisgICAgICAvKiogQGJyaWVmIF9JdGVyYXRvciBvbiBsYXN0IGVsZW1lbnQgcHJvY2Vzc2VkOyBuZWVkZWQgZm9yIHNvbWUKKyAgICAgICAqICBhbGdvcml0aG1zIChlLiBnLiBzdGQ6OnRyYW5zZm9ybSgpKS4KKyAgICAgICAqLworICAgICAgX0l0IF9NX2ZpbmlzaF9pdGVyYXRvcjsKKyAgICB9OworCisgIC8qKiBAYnJpZWYgc3RkOjpmb3JfZWFjaCgpIHNlbGVjdG9yLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXQ+CisgICAgc3RydWN0IF9fZm9yX2VhY2hfc2VsZWN0b3IgOiBwdWJsaWMgX19nZW5lcmljX2Zvcl9lYWNoX3NlbGVjdG9yPF9JdD4KKyAgICB7CisgICAgICAvKiogQGJyaWVmIEZ1bmN0b3IgZXhlY3V0aW9uLgorICAgICAgICogIEBwYXJhbSBfX28gT3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9faSBpdGVyYXRvciByZWZlcmVuY2luZyBvYmplY3QuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3A+CisgICAgICAgIGJvb2wKKyAgICAgICAgb3BlcmF0b3IoKShfT3AmIF9fbywgX0l0IF9faSkKKyAgICAgICAgeworICAgICAgICAgIF9fbygqX19pKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBzdGQ6OmdlbmVyYXRlKCkgc2VsZWN0b3IuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdD4KKyAgICBzdHJ1Y3QgX19nZW5lcmF0ZV9zZWxlY3RvciA6IHB1YmxpYyBfX2dlbmVyaWNfZm9yX2VhY2hfc2VsZWN0b3I8X0l0PgorICAgIHsKKyAgICAgIC8qKiBAYnJpZWYgRnVuY3RvciBleGVjdXRpb24uCisgICAgICAgKiAgQHBhcmFtIF9fbyBPcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gX19pIGl0ZXJhdG9yIHJlZmVyZW5jaW5nIG9iamVjdC4gKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PcD4KKyAgICAgICAgYm9vbAorICAgICAgICBvcGVyYXRvcigpKF9PcCYgX19vLCBfSXQgX19pKQorICAgICAgICB7CisgICAgICAgICAgKl9faSA9IF9fbygpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAvKiogQGJyaWVmIHN0ZDo6ZmlsbCgpIHNlbGVjdG9yLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXQ+CisgICAgc3RydWN0IF9fZmlsbF9zZWxlY3RvciA6IHB1YmxpYyBfX2dlbmVyaWNfZm9yX2VhY2hfc2VsZWN0b3I8X0l0PgorICAgIHsKKyAgICAgIC8qKiBAYnJpZWYgRnVuY3RvciBleGVjdXRpb24uCisgICAgICAgKiAgQHBhcmFtIF9fdiBDdXJyZW50IHZhbHVlLgorICAgICAgICogIEBwYXJhbSBfX2kgaXRlcmF0b3IgcmVmZXJlbmNpbmcgb2JqZWN0LiAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlVHlwZT4KKyAgICAgICAgYm9vbAorICAgICAgICBvcGVyYXRvcigpKF9WYWx1ZVR5cGUmIF9fdiwgX0l0IF9faSkKKyAgICAgICAgeworICAgICAgICAgICpfX2kgPSBfX3Y7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgc3RkOjp0cmFuc2Zvcm0oKSBfX3NlbGVjdG9yLCBvbmUgaW5wdXQgc2VxdWVuY2UgdmFyaWFudC4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0PgorICAgIHN0cnVjdCBfX3RyYW5zZm9ybTFfc2VsZWN0b3IgOiBwdWJsaWMgX19nZW5lcmljX2Zvcl9lYWNoX3NlbGVjdG9yPF9JdD4KKyAgICB7CisgICAgICAvKiogQGJyaWVmIEZ1bmN0b3IgZXhlY3V0aW9uLgorICAgICAgICogIEBwYXJhbSBfX28gT3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9faSBpdGVyYXRvciByZWZlcmVuY2luZyBvYmplY3QuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3A+CisgICAgICAgIGJvb2wKKyAgICAgICAgb3BlcmF0b3IoKShfT3AmIF9fbywgX0l0IF9faSkKKyAgICAgICAgeworICAgICAgICAgICpfX2kuc2Vjb25kID0gX19vKCpfX2kuZmlyc3QpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAvKiogQGJyaWVmIHN0ZDo6dHJhbnNmb3JtKCkgX19zZWxlY3RvciwgdHdvIGlucHV0IHNlcXVlbmNlcyB2YXJpYW50LiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXQ+CisgICAgc3RydWN0IF9fdHJhbnNmb3JtMl9zZWxlY3RvciA6IHB1YmxpYyBfX2dlbmVyaWNfZm9yX2VhY2hfc2VsZWN0b3I8X0l0PgorICAgIHsKKyAgICAgIC8qKiBAYnJpZWYgRnVuY3RvciBleGVjdXRpb24uCisgICAgICAgKiAgQHBhcmFtIF9fbyBPcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gX19pIGl0ZXJhdG9yIHJlZmVyZW5jaW5nIG9iamVjdC4gKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PcD4KKyAgICAgICAgYm9vbAorICAgICAgICBvcGVyYXRvcigpKF9PcCYgX19vLCBfSXQgX19pKQorICAgICAgICB7CisgICAgICAgICAgKl9faS5fTV90aGlyZCA9IF9fbygqX19pLl9NX2ZpcnN0LCAqX19pLl9NX3NlY29uZCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgc3RkOjpyZXBsYWNlKCkgc2VsZWN0b3IuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdCwgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3JlcGxhY2Vfc2VsZWN0b3IgOiBwdWJsaWMgX19nZW5lcmljX2Zvcl9lYWNoX3NlbGVjdG9yPF9JdD4KKyAgICB7CisgICAgICAvKiogQGJyaWVmIFZhbHVlIHRvIHJlcGxhY2Ugd2l0aC4gKi8KKyAgICAgIGNvbnN0IF9UcCYgX19uZXdfdmFsOworCisgICAgICAvKiogQGJyaWVmIENvbnN0cnVjdG9yCisgICAgICAgKiAgQHBhcmFtIF9fbmV3X3ZhbCBWYWx1ZSB0byByZXBsYWNlIHdpdGguICovCisgICAgICBleHBsaWNpdAorICAgICAgX19yZXBsYWNlX3NlbGVjdG9yKGNvbnN0IF9UcCAmX19uZXdfdmFsKSA6IF9fbmV3X3ZhbChfX25ld192YWwpIHt9CisKKyAgICAgIC8qKiBAYnJpZWYgRnVuY3RvciBleGVjdXRpb24uCisgICAgICAgKiAgQHBhcmFtIF9fdiBDdXJyZW50IHZhbHVlLgorICAgICAgICogIEBwYXJhbSBfX2kgaXRlcmF0b3IgcmVmZXJlbmNpbmcgb2JqZWN0LiAqLworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShfVHAmIF9fdiwgX0l0IF9faSkKKyAgICAgIHsKKyAgICAgICAgaWYgKCpfX2kgPT0gX192KQorICAgICAgICAgICpfX2kgPSBfX25ld192YWw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBzdGQ6OnJlcGxhY2UoKSBzZWxlY3Rvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0LCB0eXBlbmFtZSBfT3AsIHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19yZXBsYWNlX2lmX3NlbGVjdG9yIDogcHVibGljIF9fZ2VuZXJpY19mb3JfZWFjaF9zZWxlY3RvcjxfSXQ+CisgICAgeworICAgICAgLyoqIEBicmllZiBWYWx1ZSB0byByZXBsYWNlIHdpdGguICovCisgICAgICBjb25zdCBfVHAmIF9fbmV3X3ZhbDsKKworICAgICAgLyoqIEBicmllZiBDb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19uZXdfdmFsIFZhbHVlIHRvIHJlcGxhY2Ugd2l0aC4gKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBfX3JlcGxhY2VfaWZfc2VsZWN0b3IoY29uc3QgX1RwICZfX25ld192YWwpIDogX19uZXdfdmFsKF9fbmV3X3ZhbCkgeyB9CisKKyAgICAgIC8qKiBAYnJpZWYgRnVuY3RvciBleGVjdXRpb24uCisgICAgICAgKiAgQHBhcmFtIF9fbyBPcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gX19pIGl0ZXJhdG9yIHJlZmVyZW5jaW5nIG9iamVjdC4gKi8KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoX09wJiBfX28sIF9JdCBfX2kpCisgICAgICB7CisgICAgICAgIGlmIChfX28oKl9faSkpCisgICAgICAgICAgKl9faSA9IF9fbmV3X3ZhbDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfTsKKworICAvKiogQGJyaWVmIHN0ZDo6Y291bnQoKSBzZWxlY3Rvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0LCB0eXBlbmFtZSBfRGlmZj4KKyAgICBzdHJ1Y3QgX19jb3VudF9zZWxlY3RvciA6IHB1YmxpYyBfX2dlbmVyaWNfZm9yX2VhY2hfc2VsZWN0b3I8X0l0PgorICAgIHsKKyAgICAgIC8qKiBAYnJpZWYgRnVuY3RvciBleGVjdXRpb24uCisgICAgICAgKiAgQHBhcmFtIF9fdiBDdXJyZW50IHZhbHVlLgorICAgICAgICogIEBwYXJhbSBfX2kgaXRlcmF0b3IgcmVmZXJlbmNpbmcgb2JqZWN0LgorICAgICAgICogIEByZXR1cm4gMSBpZiBjb3VudCwgMCBpZiBkb2VzIG5vdCBjb3VudC4gKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZVR5cGU+CisgICAgICAgIF9EaWZmCisgICAgICAgIG9wZXJhdG9yKCkoX1ZhbHVlVHlwZSYgX192LCBfSXQgX19pKQorICAgICAgICB7IHJldHVybiAoX192ID09ICpfX2kpID8gMSA6IDA7IH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgc3RkOjpjb3VudF9pZiAoKSBzZWxlY3Rvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0LCB0eXBlbmFtZSBfRGlmZj4KKyAgICBzdHJ1Y3QgX19jb3VudF9pZl9zZWxlY3RvciA6IHB1YmxpYyBfX2dlbmVyaWNfZm9yX2VhY2hfc2VsZWN0b3I8X0l0PgorICAgIHsKKyAgICAgIC8qKiBAYnJpZWYgRnVuY3RvciBleGVjdXRpb24uCisgICAgICAgKiAgQHBhcmFtIF9fbyBPcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gX19pIGl0ZXJhdG9yIHJlZmVyZW5jaW5nIG9iamVjdC4KKyAgICAgICAqICBAcmV0dXJuIDEgaWYgY291bnQsIDAgaWYgZG9lcyBub3QgY291bnQuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3A+CisgICAgICAgIF9EaWZmCisgICAgICAgIG9wZXJhdG9yKCkoX09wJiBfX28sIF9JdCBfX2kpCisgICAgICAgIHsgcmV0dXJuIChfX28oKl9faSkpID8gMSA6IDA7IH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgc3RkOjphY2N1bXVsYXRlKCkgc2VsZWN0b3IuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdD4KKyAgICBzdHJ1Y3QgX19hY2N1bXVsYXRlX3NlbGVjdG9yIDogcHVibGljIF9fZ2VuZXJpY19mb3JfZWFjaF9zZWxlY3RvcjxfSXQ+CisgICAgeworICAgICAgLyoqIEBicmllZiBGdW5jdG9yIGV4ZWN1dGlvbi4KKyAgICAgICAqICBAcGFyYW0gX19vIE9wZXJhdG9yICh1bnVzZWQpLgorICAgICAgICogIEBwYXJhbSBfX2kgaXRlcmF0b3IgcmVmZXJlbmNpbmcgb2JqZWN0LgorICAgICAgICogIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3A+CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdD46OnZhbHVlX3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfT3AgX19vLCBfSXQgX19pKQorICAgICAgICB7IHJldHVybiAqX19pOyB9CisgICAgfTsKKworICAvKiogQGJyaWVmIHN0ZDo6aW5uZXJfcHJvZHVjdCgpIHNlbGVjdG9yLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXQsIHR5cGVuYW1lIF9JdDIsIHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pbm5lcl9wcm9kdWN0X3NlbGVjdG9yIDogcHVibGljIF9fZ2VuZXJpY19mb3JfZWFjaF9zZWxlY3RvcjxfSXQ+CisgICAgeworICAgICAgLyoqIEBicmllZiBCZWdpbiBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4gKi8KKyAgICAgIF9JdCAgX19iZWdpbjFfaXRlcmF0b3I7CisKKyAgICAgIC8qKiBAYnJpZWYgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLiAqLworICAgICAgX0l0MiBfX2JlZ2luMl9pdGVyYXRvcjsKKworICAgICAgLyoqIEBicmllZiBDb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19iMSBCZWdpbiBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICAgICAqICBAcGFyYW0gX19iMiBCZWdpbiBpdGVyYXRvciBvZiBzZWNvbmQgc2VxdWVuY2UuICovCisgICAgICBleHBsaWNpdAorICAgICAgX19pbm5lcl9wcm9kdWN0X3NlbGVjdG9yKF9JdCBfX2IxLCBfSXQyIF9fYjIpCisgICAgICA6IF9fYmVnaW4xX2l0ZXJhdG9yKF9fYjEpLCBfX2JlZ2luMl9pdGVyYXRvcihfX2IyKSB7IH0KKworICAgICAgLyoqIEBicmllZiBGdW5jdG9yIGV4ZWN1dGlvbi4KKyAgICAgICAqICBAcGFyYW0gX19tdWx0IE11bHRpcGxpY2F0aW9uIGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fY3VycmVudCBpdGVyYXRvciByZWZlcmVuY2luZyBvYmplY3QuCisgICAgICAgKiAgQHJldHVybiBJbm5lciBwcm9kdWN0IGVsZW1lbnRhbCBfX3Jlc3VsdC4gKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PcD4KKyAgICAgICAgX1RwCisgICAgICAgIG9wZXJhdG9yKCkoX09wIF9fbXVsdCwgX0l0IF9fY3VycmVudCkKKyAgICAgICAgeworICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdD46OmRpZmZlcmVuY2VfdHlwZSBfX3Bvc2l0aW9uCisgICAgICAgICAgICA9IF9fY3VycmVudCAtIF9fYmVnaW4xX2l0ZXJhdG9yOworICAgICAgICAgIHJldHVybiBfX211bHQoKl9fY3VycmVudCwgKihfX2JlZ2luMl9pdGVyYXRvciArIF9fcG9zaXRpb24pKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBTZWxlY3RvciB0aGF0IGp1c3QgcmV0dXJucyB0aGUgcGFzc2VkIGl0ZXJhdG9yLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXQ+CisgICAgc3RydWN0IF9faWRlbnRpdHlfc2VsZWN0b3IgOiBwdWJsaWMgX19nZW5lcmljX2Zvcl9lYWNoX3NlbGVjdG9yPF9JdD4KKyAgICB7CisgICAgICAvKiogQGJyaWVmIEZ1bmN0b3IgZXhlY3V0aW9uLgorICAgICAgICogIEBwYXJhbSBfX28gT3BlcmF0b3IgKHVudXNlZCkuCisgICAgICAgKiAgQHBhcmFtIF9faSBpdGVyYXRvciByZWZlcmVuY2luZyBvYmplY3QuCisgICAgICAgKiAgQHJldHVybiBQYXNzZWQgaXRlcmF0b3IuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3A+CisgICAgICAgIF9JdAorICAgICAgICBvcGVyYXRvcigpKF9PcCBfX28sIF9JdCBfX2kpCisgICAgICAgIHsgcmV0dXJuIF9faTsgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBTZWxlY3RvciB0aGF0IHJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gYWRqYWNlbnQKKyAgICogIF9fZWxlbWVudHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXQ+CisgICAgc3RydWN0IF9fYWRqYWNlbnRfZGlmZmVyZW5jZV9zZWxlY3RvcgorICAgIDogcHVibGljIF9fZ2VuZXJpY19mb3JfZWFjaF9zZWxlY3RvcjxfSXQ+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX09wPgorICAgICAgICBib29sCisgICAgICAgIG9wZXJhdG9yKCkoX09wJiBfX28sIF9JdCBfX2kpCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlbmFtZSBfSXQ6OmZpcnN0X3R5cGUgX19nb19iYWNrX29uZSA9IF9faS5maXJzdDsKKyAgICAgICAgICAtLV9fZ29fYmFja19vbmU7CisgICAgICAgICAgKl9faS5zZWNvbmQgPSBfX28oKl9faS5maXJzdCwgKl9fZ29fYmFja19vbmUpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAvKiogQGJyaWVmIEZ1bmN0b3IgZG9pbmcgbm90aGluZworICAgKgorICAgKiAgRm9yIHNvbWUgX19yZWR1Y3Rpb24gdGFza3MgKHRoaXMgaXMgbm90IGEgZnVuY3Rpb24gb2JqZWN0LCBidXQgaXMKKyAgICogIHBhc3NlZCBhcyBfX3NlbGVjdG9yIF9fZHVtbXkgcGFyYW1ldGVyLgorICAgKi8KKyAgc3RydWN0IF9Ob3RoaW5nCisgIHsKKyAgICAvKiogQGJyaWVmIEZ1bmN0b3IgZXhlY3V0aW9uLgorICAgICAqICBAcGFyYW0gX19pIGl0ZXJhdG9yIHJlZmVyZW5jaW5nIG9iamVjdC4gKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXQ+CisgICAgICB2b2lkCisgICAgICBvcGVyYXRvcigpKF9JdCBfX2kpIHsgfQorICB9OworCisgIC8qKiBAYnJpZWYgUmVkdWN0aW9uIGZ1bmN0aW9uIGRvaW5nIG5vdGhpbmcuICovCisgIHN0cnVjdCBfRHVtbXlSZWR1Y3QKKyAgeworICAgIGJvb2wKKyAgICBvcGVyYXRvcigpKGJvb2wsIGJvb2wpIGNvbnN0CisgICAgeyByZXR1cm4gdHJ1ZTsgfQorICB9OworCisgIC8qKiBAYnJpZWYgUmVkdWN0aW9uIGZvciBmaW5kaW5nIHRoZSBtYXhpbXVtIGVsZW1lbnQsIHVzaW5nIGEgY29tcGFyYXRvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9JdD4KKyAgICBzdHJ1Y3QgX19taW5fZWxlbWVudF9yZWR1Y3QKKyAgICB7CisgICAgICBfQ29tcGFyZSYgX19jb21wOworCisgICAgICBleHBsaWNpdAorICAgICAgX19taW5fZWxlbWVudF9yZWR1Y3QoX0NvbXBhcmUgJl9fYykgOiBfX2NvbXAoX19jKSB7IH0KKworICAgICAgX0l0CisgICAgICBvcGVyYXRvcigpKF9JdCBfX3gsIF9JdCBfX3kpCisgICAgICB7IHJldHVybiAoX19jb21wKCpfX3gsICpfX3kpKSA/IF9feCA6IF9feTsgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBSZWR1Y3Rpb24gZm9yIGZpbmRpbmcgdGhlIG1heGltdW0gZWxlbWVudCwgdXNpbmcgYSBjb21wYXJhdG9yLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0l0PgorICAgIHN0cnVjdCBfX21heF9lbGVtZW50X3JlZHVjdAorICAgIHsKKyAgICAgIF9Db21wYXJlJiBfX2NvbXA7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX21heF9lbGVtZW50X3JlZHVjdChfQ29tcGFyZSYgX19jKSA6IF9fY29tcChfX2MpIHsgfQorCisgICAgICBfSXQKKyAgICAgIG9wZXJhdG9yKCkoX0l0IF9feCwgX0l0IF9feSkKKyAgICAgIHsgcmV0dXJuIChfX2NvbXAoKl9feCwgKl9feSkpID8gX195IDogX194OyB9CisgICAgfTsKKworICAvKiogQGJyaWVmIEdlbmVyYWwgcmVkdWN0aW9uLCB1c2luZyBhIGJpbmFyeSBvcGVyYXRvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Jpbk9wPgorICAgIHN0cnVjdCBfX2FjY3VtdWxhdGVfYmlub3BfcmVkdWN0CisgICAgeworICAgICAgX0Jpbk9wJiBfX2Jpbm9wOworCisgICAgICBleHBsaWNpdAorICAgICAgX19hY2N1bXVsYXRlX2Jpbm9wX3JlZHVjdChfQmluT3AmIF9fYikgOiBfX2Jpbm9wKF9fYikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9BZGRlbmQ+CisgICAgICAgIF9SZXN1bHQKKyAgICAgICAgb3BlcmF0b3IoKShjb25zdCBfUmVzdWx0JiBfX3gsIGNvbnN0IF9BZGRlbmQmIF9feSkKKyAgICAgICAgeyByZXR1cm4gX19iaW5vcChfX3gsIF9feSk7IH0KKyAgICB9OworfQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfRk9SX0VBQ0hfU0VMRUNUT1JTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvaXRlcmF0b3IuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvaXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjU1ODI1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9pdGVyYXRvci5oCkBAIC0wLDAgKzEsMTk4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvaXRlcmF0b3IuaAorICogQGJyaWVmIEhlbHBlciBpdGVyYXRvciBjbGFzc2VzIGZvciB0aGUgc3RkOjp0cmFuc2Zvcm0oKSBmdW5jdGlvbnMuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX0lURVJBVE9SX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfSVRFUkFUT1JfSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNpY19pdGVyYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3BhaXIuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgQSBwYWlyIG9mIGl0ZXJhdG9ycy4gVGhlIHVzdWFsIGl0ZXJhdG9yIG9wZXJhdGlvbnMgYXJlCisgICAqICBhcHBsaWVkIHRvIGJvdGggY2hpbGQgaXRlcmF0b3JzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yMSwgdHlwZW5hbWUgX0l0ZXJhdG9yMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yQ2F0ZWdvcnk+CisgICAgY2xhc3MgX0l0ZXJhdG9yUGFpciA6IHB1YmxpYyBzdGQ6OnBhaXI8X0l0ZXJhdG9yMSwgX0l0ZXJhdG9yMj4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPF9JdGVyYXRvcjEsIF9JdGVyYXRvcjI+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfSXRlcmF0b3JDYXRlZ29yeSBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdm9pZCB2YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcjE+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yUGFpciogcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yUGFpciYgcmVmZXJlbmNlOworCisgICAgICBfSXRlcmF0b3JQYWlyKCkgeyB9CisKKyAgICAgIF9JdGVyYXRvclBhaXIoY29uc3QgX0l0ZXJhdG9yMSYgX19maXJzdCwgY29uc3QgX0l0ZXJhdG9yMiYgX19zZWNvbmQpCisgICAgICA6IF9CYXNlKF9fZmlyc3QsIF9fc2Vjb25kKSB7IH0KKworICAgICAgLy8gUHJlLWluY3JlbWVudCBvcGVyYXRvci4KKyAgICAgIF9JdGVyYXRvclBhaXImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKyAgICAgICAgKytfQmFzZTo6Zmlyc3Q7CisgICAgICAgICsrX0Jhc2U6OnNlY29uZDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBQb3N0LWluY3JlbWVudCBvcGVyYXRvci4KKyAgICAgIGNvbnN0IF9JdGVyYXRvclBhaXIKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gX0l0ZXJhdG9yUGFpcihfQmFzZTo6Zmlyc3QrKywgX0Jhc2U6OnNlY29uZCsrKTsgfQorCisgICAgICAvLyBQcmUtZGVjcmVtZW50IG9wZXJhdG9yLgorICAgICAgX0l0ZXJhdG9yUGFpciYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworICAgICAgICAtLV9CYXNlOjpmaXJzdDsKKyAgICAgICAgLS1fQmFzZTo6c2Vjb25kOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIFBvc3QtZGVjcmVtZW50IG9wZXJhdG9yLgorICAgICAgY29uc3QgX0l0ZXJhdG9yUGFpcgorICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7IHJldHVybiBfSXRlcmF0b3JQYWlyKF9CYXNlOjpmaXJzdC0tLCBfQmFzZTo6c2Vjb25kLS0pOyB9CisKKyAgICAgIC8vIFR5cGUgY29udmVyc2lvbi4KKyAgICAgIG9wZXJhdG9yIF9JdGVyYXRvcjIoKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2U6OnNlY29uZDsgfQorCisgICAgICBfSXRlcmF0b3JQYWlyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9JdGVyYXRvclBhaXImIF9fb3RoZXIpCisgICAgICB7CisgICAgICAgIF9CYXNlOjpmaXJzdCA9IF9fb3RoZXIuZmlyc3Q7CisgICAgICAgIF9CYXNlOjpzZWNvbmQgPSBfX290aGVyLnNlY29uZDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfSXRlcmF0b3JQYWlyCisgICAgICBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9fZGVsdGEpIGNvbnN0CisgICAgICB7IHJldHVybiBfSXRlcmF0b3JQYWlyKF9CYXNlOjpmaXJzdCArIF9fZGVsdGEsIF9CYXNlOjpzZWNvbmQgKyBfX2RlbHRhKTsKKyAgICAgICAgfQorCisgICAgICBkaWZmZXJlbmNlX3R5cGUKKyAgICAgIG9wZXJhdG9yLShjb25zdCBfSXRlcmF0b3JQYWlyJiBfX290aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2U6OmZpcnN0IC0gX19vdGhlci5maXJzdDsgfQorICB9OworCisKKyAgLyoqIEBicmllZiBBIHRyaXBsZSBvZiBpdGVyYXRvcnMuIFRoZSB1c3VhbCBpdGVyYXRvciBvcGVyYXRpb25zIGFyZQorICAgICAgYXBwbGllZCB0byBhbGwgdGhyZWUgY2hpbGQgaXRlcmF0b3JzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yMSwgdHlwZW5hbWUgX0l0ZXJhdG9yMiwgdHlwZW5hbWUgX0l0ZXJhdG9yMywKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yQ2F0ZWdvcnk+CisgICAgY2xhc3MgX0l0ZXJhdG9yVHJpcGxlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yQ2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHZvaWQgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yMT46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfSXRlcmF0b3JUcmlwbGUqIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIF9JdGVyYXRvclRyaXBsZSYgcmVmZXJlbmNlOworCisgICAgICBfSXRlcmF0b3IxIF9NX2ZpcnN0OworICAgICAgX0l0ZXJhdG9yMiBfTV9zZWNvbmQ7CisgICAgICBfSXRlcmF0b3IzIF9NX3RoaXJkOworCisgICAgICBfSXRlcmF0b3JUcmlwbGUoKSB7IH0KKworICAgICAgX0l0ZXJhdG9yVHJpcGxlKGNvbnN0IF9JdGVyYXRvcjEmIF9fZmlyc3QsIGNvbnN0IF9JdGVyYXRvcjImIF9fc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9JdGVyYXRvcjMmIF9fdGhpcmQpCisgICAgICB7CisgICAgICAgIF9NX2ZpcnN0ID0gX19maXJzdDsKKyAgICAgICAgX01fc2Vjb25kID0gX19zZWNvbmQ7CisgICAgICAgIF9NX3RoaXJkID0gX190aGlyZDsKKyAgICAgIH0KKworICAgICAgLy8gUHJlLWluY3JlbWVudCBvcGVyYXRvci4KKyAgICAgIF9JdGVyYXRvclRyaXBsZSYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworICAgICAgICArK19NX2ZpcnN0OworICAgICAgICArK19NX3NlY29uZDsKKyAgICAgICAgKytfTV90aGlyZDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBQb3N0LWluY3JlbWVudCBvcGVyYXRvci4KKyAgICAgIGNvbnN0IF9JdGVyYXRvclRyaXBsZQorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiBfSXRlcmF0b3JUcmlwbGUoX01fZmlyc3QrKywgX01fc2Vjb25kKyssIF9NX3RoaXJkKyspOyB9CisKKyAgICAgIC8vIFByZS1kZWNyZW1lbnQgb3BlcmF0b3IuCisgICAgICBfSXRlcmF0b3JUcmlwbGUmCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKyAgICAgICAgLS1fTV9maXJzdDsKKyAgICAgICAgLS1fTV9zZWNvbmQ7CisgICAgICAgIC0tX01fdGhpcmQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gUG9zdC1kZWNyZW1lbnQgb3BlcmF0b3IuCisgICAgICBjb25zdCBfSXRlcmF0b3JUcmlwbGUKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeyByZXR1cm4gX0l0ZXJhdG9yVHJpcGxlKF9NX2ZpcnN0LS0sIF9NX3NlY29uZC0tLCBfTV90aGlyZC0tKTsgfQorCisgICAgICAvLyBUeXBlIGNvbnZlcnNpb24uCisgICAgICBvcGVyYXRvciBfSXRlcmF0b3IzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3RoaXJkOyB9CisKKyAgICAgIF9JdGVyYXRvclRyaXBsZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfSXRlcmF0b3JUcmlwbGUmIF9fb3RoZXIpCisgICAgICB7CisgICAgICAgIF9NX2ZpcnN0ID0gX19vdGhlci5fTV9maXJzdDsKKyAgICAgICAgX01fc2Vjb25kID0gX19vdGhlci5fTV9zZWNvbmQ7CisgICAgICAgIF9NX3RoaXJkID0gX19vdGhlci5fTV90aGlyZDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfSXRlcmF0b3JUcmlwbGUKKyAgICAgIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19kZWx0YSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9JdGVyYXRvclRyaXBsZShfTV9maXJzdCArIF9fZGVsdGEsIF9NX3NlY29uZCArIF9fZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fdGhpcmQgKyBfX2RlbHRhKTsgfQorCisgICAgICBkaWZmZXJlbmNlX3R5cGUKKyAgICAgIG9wZXJhdG9yLShjb25zdCBfSXRlcmF0b3JUcmlwbGUmIF9fb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9maXJzdCAtIF9fb3RoZXIuX01fZmlyc3Q7IH0KKyAgfTsKK30KKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX0lURVJBVE9SX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbGlzdF9wYXJ0aXRpb24uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbGlzdF9wYXJ0aXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2I5YWNiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9saXN0X3BhcnRpdGlvbi5oCkBAIC0wLDAgKzEsMTc5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgX19pdCBhbmQvb3IgbW9kaWZ5IF9faXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgX19pdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvbGlzdF9wYXJ0aXRpb24uaAorICogIEBicmllZiBfRnVuY3Rpb25hbGl0eSB0byBzcGxpdCBfX3NlcXVlbmNlIHJlZmVyZW5jZWQgYnkgb25seSBpbnB1dAorICogIGl0ZXJhdG9ycy4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IExlb25vciBGcmlhcyBNb3lhIGFuZCBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX0xJU1RfUEFSVElUSU9OX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfTElTVF9QQVJUSVRJT05fSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC9wYXJhbGxlbC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgU2hyaW5rcyBhbmQgZG91YmxlcyB0aGUgcmFuZ2VzLgorICAgKiAgQHBhcmFtIF9fb3Nfc3RhcnRzIFN0YXJ0IHBvc2l0aW9ucyB3b3JrZWQgb24gKG92ZXJzYW1wbGVkKS4KKyAgICogIEBwYXJhbSBfX2NvdW50X3RvX3R3byBDb3VudHMgdXAgdG8gMi4KKyAgICogIEBwYXJhbSBfX3JhbmdlX2xlbmd0aCBDdXJyZW50IGxlbmd0aCBvZiBhIGNodW5rLgorICAgKiAgQHBhcmFtIF9fbWFrZV90d2ljZSBXaGV0aGVyIHRoZSBAYyBfX29zX3N0YXJ0cyBpcyBhbGxvd2VkIHRvIGJlCisgICAqICBncm93biBvciBub3QKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcj4KKyAgICB2b2lkCisgICAgX19zaHJpbmtfYW5kX2RvdWJsZShzdGQ6OnZlY3RvcjxfSUl0ZXI+JiBfX29zX3N0YXJ0cywKKwkJCXNpemVfdCYgX19jb3VudF90b190d28sIHNpemVfdCYgX19yYW5nZV9sZW5ndGgsCisJCQljb25zdCBib29sIF9fbWFrZV90d2ljZSkKKyAgICB7CisgICAgICArK19fY291bnRfdG9fdHdvOworICAgICAgaWYgKCFfX21ha2VfdHdpY2UgfHwgX19jb3VudF90b190d28gPCAyKQorICAgICAgICBfX3NocmluayhfX29zX3N0YXJ0cywgX19jb3VudF90b190d28sIF9fcmFuZ2VfbGVuZ3RoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9fb3Nfc3RhcnRzLnJlc2l6ZSgoX19vc19zdGFydHMuc2l6ZSgpIC0gMSkgKiAyICsgMSk7CisgICAgICAgICAgX19jb3VudF90b190d28gPSAwOworICAgICAgICB9CisgICAgfQorCisgIC8qKiBAYnJpZWYgQ29tYmluZXMgdHdvIHJhbmdlcyBpbnRvIG9uZSBhbmQgdGh1cyBoYWx2ZXMgdGhlIG51bWJlciBvZiByYW5nZXMuCisgICAqICBAcGFyYW0gX19vc19zdGFydHMgU3RhcnQgcG9zaXRpb25zIHdvcmtlZCBvbiAob3ZlcnNhbXBsZWQpLgorICAgKiAgQHBhcmFtIF9fY291bnRfdG9fdHdvIENvdW50cyB1cCB0byAyLgorICAgKiAgQHBhcmFtIF9fcmFuZ2VfbGVuZ3RoIEN1cnJlbnQgbGVuZ3RoIG9mIGEgY2h1bmsuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcj4KKyAgICB2b2lkCisgICAgX19zaHJpbmsoc3RkOjp2ZWN0b3I8X0lJdGVyPiYgX19vc19zdGFydHMsIHNpemVfdCYgX19jb3VudF90b190d28sCisJICAgICBzaXplX3QmIF9fcmFuZ2VfbGVuZ3RoKQorICAgIHsKKyAgICAgIGZvciAodHlwZW5hbWUgc3RkOjp2ZWN0b3I8X0lJdGVyPjo6c2l6ZV90eXBlIF9faSA9IDA7CisgICAgICAgICAgIF9faSA8PSAoX19vc19zdGFydHMuc2l6ZSgpIC8gMik7ICsrX19pKQorICAgICAgICBfX29zX3N0YXJ0c1tfX2ldID0gX19vc19zdGFydHNbX19pICogMl07CisgICAgICBfX3JhbmdlX2xlbmd0aCAqPSAyOworICAgIH0KKworICAvKiogQGJyaWVmIFNwbGl0cyBhIHNlcXVlbmNlIGdpdmVuIGJ5IGlucHV0IGl0ZXJhdG9ycyBpbnRvIHBhcnRzIG9mCisgICAqIGFsbW9zdCBlcXVhbCBzaXplCisgICAqCisgICAqICBUaGUgZnVuY3Rpb24gbmVlZHMgb25seSBvbmUgcGFzcyBvdmVyIHRoZSBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX3N0YXJ0cyBTdGFydCBpdGVyYXRvcnMgZm9yIHRoZSByZXN1bHRpbmcgcGFydHMsIGRpbWVuc2lvbgorICAgKiAgQGMgX19udW1fcGFydHMrMS4gRm9yIGNvbnZlbmllbmNlLCBAYyBfX3N0YXJ0cyBAYyBbX19udW1fcGFydHNdCisgICAqICBjb250YWlucyB0aGUgZW5kIGl0ZXJhdG9yIG9mIHRoZSBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2xlbmd0aHMgTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgcGFydHMuCisgICAqICBAcGFyYW0gX19udW1fcGFydHMgTnVtYmVyIG9mIHBhcnRzIHRvIHNwbGl0IHRoZSBzZXF1ZW5jZSBpbnRvLgorICAgKiAgQHBhcmFtIF9fZiBGdW5jdG9yIHRvIGJlIGFwcGxpZWQgdG8gZWFjaCBlbGVtZW50IGJ5IHRyYXZlcnNpbmcgX19pdAorICAgKiAgQHBhcmFtIF9fb3ZlcnNhbXBsaW5nIE92ZXJzYW1wbGluZyBmYWN0b3IuIElmIDAsIHRoZW4gdGhlCisgICAqICBwYXJ0aXRpb25zIHdpbGwgZGlmZmVyIGluIGF0IG1vc3QgCisgICAqICBcc3FydHtcbWF0aHJte19fZW5kfSAtIFxtYXRocm17X19iZWdpbn19IAorICAgKiAgX19lbGVtZW50cy4gT3RoZXJ3aXNlLCB0aGUgcmF0aW8gYmV0d2VlbiB0aGUKKyAgICogIGxvbmdlc3QgYW5kIHRoZSBzaG9ydGVzdCBwYXJ0IGlzIGJvdW5kZWQgYnkKKyAgICogIDEvKFxtYXRocm17X19vdmVyc2FtcGxpbmd9IFxjZG90IFxtYXRocm17bnVtXF9wYXJ0c30pCisgICAqICBAcmV0dXJuIExlbmd0aCBvZiB0aGUgd2hvbGUgc2VxdWVuY2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9GdW5jdG9yVHlwZT4KKyAgICBzaXplX3QKKyAgICBsaXN0X3BhcnRpdGlvbihjb25zdCBfSUl0ZXIgX19iZWdpbiwgY29uc3QgX0lJdGVyIF9fZW5kLAorICAgICAgICAgICAgICAgICAgIF9JSXRlciogX19zdGFydHMsIHNpemVfdCogX19sZW5ndGhzLCBjb25zdCBpbnQgX19udW1fcGFydHMsCisgICAgICAgICAgICAgICAgICAgX0Z1bmN0b3JUeXBlJiBfX2YsIGludCBfX292ZXJzYW1wbGluZyA9IDApCisgICAgeworICAgICAgYm9vbCBfX21ha2VfdHdpY2UgPSBmYWxzZTsKKworICAgICAgLy8gVGhlIHJlc2l6aW5nIGFsZ29yaXRobSBpcyBjaG9zZW4gYWNjb3JkaW5nIHRvIHRoZSBvdmVyc2FtcGxpbmcgZmFjdG9yLgorICAgICAgaWYgKF9fb3ZlcnNhbXBsaW5nID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBfX21ha2VfdHdpY2UgPSB0cnVlOworICAgICAgICAgIF9fb3ZlcnNhbXBsaW5nID0gMTsKKyAgICAgICAgfQorCisgICAgICBzdGQ6OnZlY3RvcjxfSUl0ZXI+IF9fb3Nfc3RhcnRzKDIgKiBfX292ZXJzYW1wbGluZyAqIF9fbnVtX3BhcnRzICsgMSk7CisKKyAgICAgIF9fb3Nfc3RhcnRzWzBdID0gX19iZWdpbjsKKyAgICAgIF9JSXRlciBfX3ByZXYgID0gX19iZWdpbiwgX19pdCA9IF9fYmVnaW47CisgICAgICBzaXplX3QgX19kaXN0X2xpbWl0ID0gMCwgX19kaXN0ID0gMDsKKyAgICAgIHNpemVfdCBfX2N1ciA9IDEsIF9fbmV4dCA9IDE7CisgICAgICBzaXplX3QgX19yYW5nZV9sZW5ndGggPSAxOworICAgICAgc2l6ZV90IF9fY291bnRfdG9fdHdvID0gMDsKKyAgICAgIHdoaWxlIChfX2l0ICE9IF9fZW5kKQorICAgICAgICB7CisgICAgICAgICAgX19jdXIgPSBfX25leHQ7CisgICAgICAgICAgZm9yICg7IF9fY3VyIDwgX19vc19zdGFydHMuc2l6ZSgpIGFuZCBfX2l0ICE9IF9fZW5kOyArK19fY3VyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmb3IgKF9fZGlzdF9saW1pdCArPSBfX3JhbmdlX2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICBfX2Rpc3QgPCBfX2Rpc3RfbGltaXQgYW5kIF9faXQgIT0gX19lbmQ7ICsrX19kaXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fZihfX2l0KTsKKyAgICAgICAgICAgICAgICAgICsrX19pdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIF9fb3Nfc3RhcnRzW19fY3VyXSA9IF9faXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBNdXN0IGNvbXBhcmUgZm9yIGVuZCBhbmQgbm90IF9fY3VyIDwgX19vc19zdGFydHMuc2l6ZSgpICwgYmVjYXVzZQorICAgICAgICAgIC8vIF9fY3VyIGNvdWxkIGJlID09IF9fb3Nfc3RhcnRzLnNpemUoKSBhcyB3ZWxsCisgICAgICAgICAgaWYgKF9faXQgPT0gX19lbmQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIF9fc2hyaW5rX2FuZF9kb3VibGUoX19vc19zdGFydHMsIF9fY291bnRfdG9fdHdvLCBfX3JhbmdlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWFrZV90d2ljZSk7CisgICAgICAgICAgX19uZXh0ID0gX19vc19zdGFydHMuc2l6ZSgpIC8gMiArIDE7CisgICAgICAgIH0KKworICAgICAgLy8gQ2FsY3VsYXRpb24gb2YgdGhlIHBhcnRzIChvbmUgbXVzdCBiZSBleHRyYWN0ZWQgZnJvbSBfX2N1cnJlbnQKKyAgICAgIC8vIGJlY2F1c2UgdGhlIHBhcnRpdGlvbiBiZWdpbm5pbmcgYXQgZW5kLCBjb25zaXN0cyBvbmx5IG9mCisgICAgICAvLyBpdHNlbGYpLgorICAgICAgc2l6ZV90IF9fc2l6ZV9wYXJ0ID0gKF9fY3VyIC0gMSkgLyBfX251bV9wYXJ0czsKKyAgICAgIGludCBfX3NpemVfZ3JlYXRlciA9IHN0YXRpY19jYXN0PGludD4oKF9fY3VyIC0gMSkgJSBfX251bV9wYXJ0cyk7CisgICAgICBfX3N0YXJ0c1swXSA9IF9fb3Nfc3RhcnRzWzBdOworCisgICAgICBzaXplX3QgX19pbmRleCA9IDA7CisKKyAgICAgIC8vIFNtYWxsZXN0IHBhcnRpdGlvbnMuCisgICAgICBmb3IgKGludCBfX2kgPSAxOyBfX2kgPCAoX19udW1fcGFydHMgKyAxIC0gX19zaXplX2dyZWF0ZXIpOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fbGVuZ3Roc1tfX2kgLSAxXSA9ICBfX3NpemVfcGFydCAqIF9fcmFuZ2VfbGVuZ3RoOworICAgICAgICAgIF9faW5kZXggKz0gX19zaXplX3BhcnQ7CisgICAgICAgICAgX19zdGFydHNbX19pXSA9IF9fb3Nfc3RhcnRzW19faW5kZXhdOworICAgICAgICB9CisKKyAgICAgIC8vIEJpZ2dlc3QgcGFydGl0aW9ucy4KKyAgICAgIGZvciAoaW50IF9faSA9IF9fbnVtX3BhcnRzICsgMSAtIF9fc2l6ZV9ncmVhdGVyOyBfX2kgPD0gX19udW1fcGFydHM7CisgICAgICAgICAgICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX19sZW5ndGhzW19faSAtIDFdID0gIChfX3NpemVfcGFydCsxKSAqIF9fcmFuZ2VfbGVuZ3RoOworICAgICAgICAgIF9faW5kZXggKz0gKF9fc2l6ZV9wYXJ0KzEpOworICAgICAgICAgIF9fc3RhcnRzW19faV0gPSBfX29zX3N0YXJ0c1tfX2luZGV4XTsKKyAgICAgICAgfQorCisgICAgICAvLyBDb3JyZWN0aW9uIG9mIHRoZSBlbmQgc2l6ZSAodGhlIGVuZCBpdGVyYXRpb24gaGFzIG5vdCBmaW5pc2hlZCkuCisgICAgICBfX2xlbmd0aHNbX19udW1fcGFydHMgLSAxXSAtPSAoX19kaXN0X2xpbWl0IC0gX19kaXN0KTsKKworICAgICAgcmV0dXJuIF9fZGlzdDsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9MSVNUX1BBUlRJVElPTl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2xvc2VydHJlZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9sb3NlcnRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODBhOThkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9sb3NlcnRyZWUuaApAQCAtMCwwICsxLDEwNjMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9sb3NlcnRyZWUuaAorKiAgQGJyaWVmIE1hbnkgZ2VuZXJpYyBsb3NlciB0cmVlIHZhcmlhbnRzLgorKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfTE9TRVJUUkVFX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfTE9TRVJUUkVFX0ggMQorCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvYmFzZS5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLyoqCisgICAqIEBicmllZiBHdWFyZGVkIGxvc2VyL3RvdXJuYW1lbnQgdHJlZS4KKyAgICoKKyAgICogVGhlIHNtYWxsZXN0IGVsZW1lbnQgaXMgYXQgdGhlIHRvcC4KKyAgICoKKyAgICogR3VhcmRpbmcgaXMgZG9uZSBleHBsaWNpdGx5IHRocm91Z2ggb25lIGZsYWcgX01fc3VwIHBlciBlbGVtZW50LAorICAgKiBpbmYgaXMgbm90IG5lZWRlZCBkdWUgdG8gYSBiZXR0ZXIgaW5pdGlhbGl6YXRpb24gcm91dGluZS4gIFRoaXMKKyAgICogaXMgYSB3ZWxsLXBlcmZvcm1pbmcgdmFyaWFudC4KKyAgICoKKyAgICogQHBhcmFtIF9UcCB0aGUgZWxlbWVudCB0eXBlCisgICAqIEBwYXJhbSBfQ29tcGFyZSB0aGUgY29tcGFyYXRvciB0byB1c2UsIGRlZmF1bHRzIHRvIHN0ZDo6bGVzczxfVHA+CisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNsYXNzIF9Mb3NlclRyZWVCYXNlCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIC8qKiBAYnJpZWYgSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBfTG9zZXJUcmVlIGVsZW1lbnQuICovCisgICAgICBzdHJ1Y3QgX0xvc2VyCisgICAgICB7CisJLyoqIEBicmllZiBmbGFnLCB0cnVlIGlmZiB0aGlzIGlzIGEgIm1heGltdW0iIF9fc2VudGluZWwuICovCisJYm9vbCBfTV9zdXA7CisJLyoqIEBicmllZiBfX2luZGV4IG9mIHRoZSBfX3NvdXJjZSBfX3NlcXVlbmNlLiAqLworCWludCBfTV9zb3VyY2U7CisJLyoqIEBicmllZiBfTV9rZXkgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIF9Mb3NlclRyZWUuICovCisJX1RwIF9NX2tleTsKKyAgICAgIH07CisKKyAgICAgIHVuc2lnbmVkIGludCBfTV9paywgX01faywgX01fb2Zmc2V0OworCisgICAgICAvKiogbG9nXzJ7X01fa30gKi8KKyAgICAgIHVuc2lnbmVkIGludCBfTV9sb2dfazsKKworICAgICAgLyoqIEBicmllZiBfTG9zZXJUcmVlIF9fZWxlbWVudHMuICovCisgICAgICBfTG9zZXIqIF9NX2xvc2VyczsKKworICAgICAgLyoqIEBicmllZiBfQ29tcGFyZSB0byB1c2UuICovCisgICAgICBfQ29tcGFyZSBfTV9jb21wOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTdGF0ZSBmbGFnIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBfTG9zZXJUcmVlIGlzIGVtcHR5LgorICAgICAgICoKKyAgICAgICAqIE9ubHkgdXNlZCBmb3IgYnVpbGRpbmcgdGhlIF9Mb3NlclRyZWUuCisgICAgICAgKi8KKyAgICAgIGJvb2wgX01fZmlyc3RfaW5zZXJ0OworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2sgVGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgdG8gbWVyZ2UuCisgICAgICAgKiBAcGFyYW0gX19jb21wIFRoZSBjb21wYXJhdG9yIHRvIHVzZS4KKyAgICAgICAqLworICAgICAgX0xvc2VyVHJlZUJhc2UodW5zaWduZWQgaW50IF9faywgX0NvbXBhcmUgX19jb21wKQorICAgICAgOiBfTV9jb21wKF9fY29tcCkKKyAgICAgIHsKKwlfTV9payA9IF9fazsKKworCS8vIENvbXB1dGUgbG9nXzJ7X01fa30gZm9yIHRoZSBfTG9zZXIgVHJlZQorCV9NX2xvZ19rID0gX19yZF9sb2cyKF9NX2lrIC0gMSkgKyAxOworCisJLy8gTmV4dCBncmVhdGVyIHBvd2VyIG9mIDIuCisJX01fayA9IDEgPDwgX01fbG9nX2s7CisJX01fb2Zmc2V0ID0gX01fazsKKworCS8vIEF2b2lkIGRlZmF1bHQtY29uc3RydWN0aW5nIF9NX2xvc2Vyc1tdLl9NX2tleQorCV9NX2xvc2VycyA9IHN0YXRpY19jYXN0PF9Mb3Nlcio+KDo6b3BlcmF0b3IgbmV3KDIgKiBfTV9rCisJCQkJCQkJKiBzaXplb2YoX0xvc2VyKSkpOworCWZvciAodW5zaWduZWQgaW50IF9faSA9IF9NX2lrIC0gMTsgX19pIDwgX01fazsgKytfX2kpCisJICBfTV9sb3NlcnNbX19pICsgX01fa10uX01fc3VwID0gdHJ1ZTsKKworCV9NX2ZpcnN0X2luc2VydCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFRoZSBkZXN0cnVjdG9yLgorICAgICAgICovCisgICAgICB+X0xvc2VyVHJlZUJhc2UoKQorICAgICAgeworCWZvciAodW5zaWduZWQgaW50IF9faSA9IDA7IF9faSA8ICgyICogX01fayk7ICsrX19pKQorCSAgX01fbG9zZXJzW19faV0ufl9Mb3NlcigpOworCTo6b3BlcmF0b3IgZGVsZXRlKF9NX2xvc2Vycyk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluaXRpYWxpemVzIHRoZSBzZXF1ZW5jZSAiX01fc291cmNlIiB3aXRoIHRoZSBlbGVtZW50ICJfX2tleSIuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fa2V5IHRoZSBlbGVtZW50IHRvIGluc2VydAorICAgICAgICogQHBhcmFtIF9fc291cmNlIF9faW5kZXggb2YgdGhlIF9fc291cmNlIF9fc2VxdWVuY2UKKyAgICAgICAqIEBwYXJhbSBfX3N1cCBmbGFnIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSB0byBpbnNlcnQgaXMgYW4KKyAgICAgICAqICAgZXhwbGljaXQgX19zdXByZW11bS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgX19pbnNlcnRfc3RhcnQoY29uc3QgX1RwJiBfX2tleSwgaW50IF9fc291cmNlLCBib29sIF9fc3VwKQorICAgICAgeworCXVuc2lnbmVkIGludCBfX3BvcyA9IF9NX2sgKyBfX3NvdXJjZTsKKworCWlmIChfTV9maXJzdF9pbnNlcnQpCisJICB7CisJICAgIC8vIENvbnN0cnVjdCBhbGwga2V5cywgc28gd2UgY2FuIGVhc2lseSBkZXN0cnVjdCB0aGVtLgorCSAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAwOyBfX2kgPCAoMiAqIF9NX2spOyArK19faSkKKwkgICAgICA6Om5ldygmKF9NX2xvc2Vyc1tfX2ldLl9NX2tleSkpIF9UcChfX2tleSk7CisJICAgIF9NX2ZpcnN0X2luc2VydCA9IGZhbHNlOworCSAgfQorCWVsc2UKKwkgIF9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5ID0gX19rZXk7CisKKwlfTV9sb3NlcnNbX19wb3NdLl9NX3N1cCA9IF9fc3VwOworCV9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlID0gX19zb3VyY2U7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNlcXVlbmNlIHdpdGggdGhlIHNtYWxsZXN0IGVsZW1lbnQuCisgICAgICAgKi8KKyAgICAgIGludCBfX2dldF9taW5fc291cmNlKCkKKyAgICAgIHsgcmV0dXJuIF9NX2xvc2Vyc1swXS5fTV9zb3VyY2U7IH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQGJyaWVmIFN0YWJsZSBfTG9zZXJUcmVlIHZhcmlhbnQuCisgICAgICoKKyAgICAgKiBQcm92aWRlcyB0aGUgc3RhYmxlIGltcGxlbWVudGF0aW9ucyBvZiBpbnNlcnRfc3RhcnQsIF9faW5pdF93aW5uZXIsCisgICAgICogX19pbml0IGFuZCBfX2RlbGV0ZV9taW5faW5zZXJ0LgorICAgICAqCisgICAgICogVW5zdGFibGUgdmFyaWFudCBpcyBkb25lIHVzaW5nIHBhcnRpYWwgc3BlY2lhbGlzYXRpb24gYmVsb3cuCisgICAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUvKiBkZWZhdWx0ID09IHRydWUgKi8sIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjbGFzcyBfTG9zZXJUcmVlCisgICAgOiBwdWJsaWMgX0xvc2VyVHJlZUJhc2U8X1RwLCBfQ29tcGFyZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9Mb3NlclRyZWVCYXNlPF9UcCwgX0NvbXBhcmU+IF9CYXNlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2s7CisgICAgICB1c2luZyBfQmFzZTo6X01fY29tcDsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9sb3NlcnM7CisgICAgICB1c2luZyBfQmFzZTo6X01fZmlyc3RfaW5zZXJ0OworCisgICAgcHVibGljOgorICAgICAgX0xvc2VyVHJlZSh1bnNpZ25lZCBpbnQgX19rLCBfQ29tcGFyZSBfX2NvbXApCisgICAgICA6IF9CYXNlOjpfTG9zZXJUcmVlQmFzZShfX2ssIF9fY29tcCkKKyAgICAgIHsgfQorCisgICAgICB1bnNpZ25lZCBpbnQKKyAgICAgIF9faW5pdF93aW5uZXIodW5zaWduZWQgaW50IF9fcm9vdCkKKyAgICAgIHsKKwlpZiAoX19yb290ID49IF9NX2spCisJICByZXR1cm4gX19yb290OworCWVsc2UKKwkgIHsKKwkgICAgdW5zaWduZWQgaW50IF9fbGVmdCA9IF9faW5pdF93aW5uZXIoMiAqIF9fcm9vdCk7CisJICAgIHVuc2lnbmVkIGludCBfX3JpZ2h0ID0gX19pbml0X3dpbm5lcigyICogX19yb290ICsgMSk7CisJICAgIGlmIChfTV9sb3NlcnNbX19yaWdodF0uX01fc3VwCisJCXx8ICghX01fbG9zZXJzW19fbGVmdF0uX01fc3VwCisJCSAgICAmJiAhX01fY29tcChfTV9sb3NlcnNbX19yaWdodF0uX01fa2V5LAorCQkJCV9NX2xvc2Vyc1tfX2xlZnRdLl9NX2tleSkpKQorCSAgICAgIHsKKwkJLy8gTGVmdCBvbmUgaXMgbGVzcyBvciBlcXVhbC4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19yaWdodF07CisJCXJldHVybiBfX2xlZnQ7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQkvLyBSaWdodCBvbmUgaXMgbGVzcy4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19sZWZ0XTsKKwkJcmV0dXJuIF9fcmlnaHQ7CisJICAgICAgfQorCSAgfQorICAgICAgfQorCisgICAgICB2b2lkIF9faW5pdCgpCisgICAgICB7IF9NX2xvc2Vyc1swXSA9IF9NX2xvc2Vyc1tfX2luaXRfd2lubmVyKDEpXTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEZWxldGUgdGhlIHNtYWxsZXN0IGVsZW1lbnQgYW5kIGluc2VydCBhIG5ldyBlbGVtZW50IGZyb20KKyAgICAgICAqICAgdGhlIHByZXZpb3VzbHkgc21hbGxlc3QgZWxlbWVudCdzIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgc3RhYmxlLgorICAgICAgICovCisgICAgICAvLyBEbyBub3QgcGFzcyBhIGNvbnN0IHJlZmVyZW5jZSBzaW5jZSBfX2tleSB3aWxsIGJlIHVzZWQgYXMKKyAgICAgIC8vIGxvY2FsIHZhcmlhYmxlLgorICAgICAgdm9pZAorICAgICAgX19kZWxldGVfbWluX2luc2VydChfVHAgX19rZXksIGJvb2wgX19zdXApCisgICAgICB7CisgICAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJLy8gbm8gZHVtbXkgc2VxdWVuY2UgY2FuIGV2ZXIgYmUgYXQgdGhlIHRvcCEKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX01fbG9zZXJzWzBdLl9NX3NvdXJjZSAhPSAtMSk7CisjZW5kaWYKKworCWludCBfX3NvdXJjZSA9IF9NX2xvc2Vyc1swXS5fTV9zb3VyY2U7CisJZm9yICh1bnNpZ25lZCBpbnQgX19wb3MgPSAoX01fayArIF9fc291cmNlKSAvIDI7IF9fcG9zID4gMDsKKwkgICAgIF9fcG9zIC89IDIpCisJICB7CisJICAgIC8vIFRoZSBzbWFsbGVyIG9uZSBnZXRzIHByb21vdGVkLCB0aWVzIGFyZSBicm9rZW4gYnkgX01fc291cmNlLgorCSAgICBpZiAoKF9fc3VwICYmICghX01fbG9zZXJzW19fcG9zXS5fTV9zdXAKKwkJCSAgIHx8IF9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlIDwgX19zb3VyY2UpKQorCQl8fCAoIV9fc3VwICYmICFfTV9sb3NlcnNbX19wb3NdLl9NX3N1cAorCQkgICAgJiYgKChfTV9jb21wKF9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5LCBfX2tleSkpCisJCQl8fCAoIV9NX2NvbXAoX19rZXksIF9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5KQorCQkJICAgICYmIF9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlIDwgX19zb3VyY2UpKSkpCisJICAgICAgeworCQkvLyBUaGUgb3RoZXIgb25lIGlzIHNtYWxsZXIuCisJCXN0ZDo6c3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX3N1cCwgX19zdXApOworCQlzdGQ6OnN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9zb3VyY2UsIF9fc291cmNlKTsKKwkJc3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX2tleSwgX19rZXkpOworCSAgICAgIH0KKwkgIH0KKworCV9NX2xvc2Vyc1swXS5fTV9zdXAgPSBfX3N1cDsKKwlfTV9sb3NlcnNbMF0uX01fc291cmNlID0gX19zb3VyY2U7CisJX01fbG9zZXJzWzBdLl9NX2tleSA9IF9fa2V5OworICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgVW5zdGFibGUgX0xvc2VyVHJlZSB2YXJpYW50LgorICAgICAqCisgICAgICogU3RhYmlsaXR5IChub24tc3RhYmxlIGhlcmUpIGlzIHNlbGVjdGVkIHdpdGggcGFydGlhbCBzcGVjaWFsaXphdGlvbi4KKyAgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjbGFzcyBfTG9zZXJUcmVlPC8qIF9fc3RhYmxlID09ICovZmFsc2UsIF9UcCwgX0NvbXBhcmU+CisgICAgOiBwdWJsaWMgX0xvc2VyVHJlZUJhc2U8X1RwLCBfQ29tcGFyZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9Mb3NlclRyZWVCYXNlPF9UcCwgX0NvbXBhcmU+IF9CYXNlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2xvZ19rOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2s7CisgICAgICB1c2luZyBfQmFzZTo6X01fY29tcDsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9sb3NlcnM7CisgICAgICB1c2luZyBfQmFzZTo6X01fZmlyc3RfaW5zZXJ0OworCisgICAgcHVibGljOgorICAgICAgX0xvc2VyVHJlZSh1bnNpZ25lZCBpbnQgX19rLCBfQ29tcGFyZSBfX2NvbXApCisgICAgICA6IF9CYXNlOjpfTG9zZXJUcmVlQmFzZShfX2ssIF9fY29tcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbXB1dGVzIHRoZSB3aW5uZXIgb2YgdGhlIGNvbXBldGl0aW9uIGF0IHBvc2l0aW9uICJfX3Jvb3QiLgorICAgICAgICoKKyAgICAgICAqIENhbGxlZCByZWN1cnNpdmVseSAoc3RhcnRpbmcgYXQgMCkgdG8gYnVpbGQgdGhlIGluaXRpYWwgdHJlZS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19yb290IF9faW5kZXggb2YgdGhlICJnYW1lIiB0byBzdGFydC4KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgaW50CisgICAgICBfX2luaXRfd2lubmVyKHVuc2lnbmVkIGludCBfX3Jvb3QpCisgICAgICB7CisJaWYgKF9fcm9vdCA+PSBfTV9rKQorCSAgcmV0dXJuIF9fcm9vdDsKKwllbHNlCisJICB7CisJICAgIHVuc2lnbmVkIGludCBfX2xlZnQgPSBfX2luaXRfd2lubmVyKDIgKiBfX3Jvb3QpOworCSAgICB1bnNpZ25lZCBpbnQgX19yaWdodCA9IF9faW5pdF93aW5uZXIoMiAqIF9fcm9vdCArIDEpOworCSAgICBpZiAoX01fbG9zZXJzW19fcmlnaHRdLl9NX3N1cAorCQl8fCAoIV9NX2xvc2Vyc1tfX2xlZnRdLl9NX3N1cAorCQkgICAgJiYgIV9NX2NvbXAoX01fbG9zZXJzW19fcmlnaHRdLl9NX2tleSwKKwkJCQlfTV9sb3NlcnNbX19sZWZ0XS5fTV9rZXkpKSkKKwkgICAgICB7CisJCS8vIExlZnQgb25lIGlzIGxlc3Mgb3IgZXF1YWwuCisJCV9NX2xvc2Vyc1tfX3Jvb3RdID0gX01fbG9zZXJzW19fcmlnaHRdOworCQlyZXR1cm4gX19sZWZ0OworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJLy8gUmlnaHQgb25lIGlzIGxlc3MuCisJCV9NX2xvc2Vyc1tfX3Jvb3RdID0gX01fbG9zZXJzW19fbGVmdF07CisJCXJldHVybiBfX3JpZ2h0OworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX19pbml0KCkKKyAgICAgIHsgX01fbG9zZXJzWzBdID0gX01fbG9zZXJzW19faW5pdF93aW5uZXIoMSldOyB9CisKKyAgICAgIC8qKgorICAgICAgICogRGVsZXRlIHRoZSBfTV9rZXkgc21hbGxlc3QgZWxlbWVudCBhbmQgaW5zZXJ0IHRoZSBlbGVtZW50IF9fa2V5CisgICAgICAgKiBpbnN0ZWFkLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2tleSB0aGUgX01fa2V5IHRvIGluc2VydAorICAgICAgICogQHBhcmFtIF9fc3VwIHRydWUgaWZmIF9fa2V5IGlzIGFuIGV4cGxpY2l0bHkgbWFya2VkIHN1cHJlbXVtCisgICAgICAgKi8KKyAgICAgIC8vIERvIG5vdCBwYXNzIGEgY29uc3QgcmVmZXJlbmNlIHNpbmNlIF9fa2V5IHdpbGwgYmUgdXNlZCBhcyBsb2NhbAorICAgICAgLy8gdmFyaWFibGUuCisgICAgICB2b2lkCisgICAgICBfX2RlbGV0ZV9taW5faW5zZXJ0KF9UcCBfX2tleSwgYm9vbCBfX3N1cCkKKyAgICAgIHsKKyAgICAgICAgdXNpbmcgc3RkOjpzd2FwOworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkvLyBubyBkdW1teSBzZXF1ZW5jZSBjYW4gZXZlciBiZSBhdCB0aGUgdG9wIQorCV9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfTV9sb3NlcnNbMF0uX01fc291cmNlICE9IC0xKTsKKyNlbmRpZgorCisJaW50IF9fc291cmNlID0gX01fbG9zZXJzWzBdLl9NX3NvdXJjZTsKKwlmb3IgKHVuc2lnbmVkIGludCBfX3BvcyA9IChfTV9rICsgX19zb3VyY2UpIC8gMjsgX19wb3MgPiAwOworCSAgICAgX19wb3MgLz0gMikKKwkgIHsKKwkgICAgLy8gVGhlIHNtYWxsZXIgb25lIGdldHMgcHJvbW90ZWQuCisJICAgIGlmIChfX3N1cCB8fCAoIV9NX2xvc2Vyc1tfX3Bvc10uX01fc3VwCisJCQkgICYmIF9NX2NvbXAoX01fbG9zZXJzW19fcG9zXS5fTV9rZXksIF9fa2V5KSkpCisJICAgICAgeworCQkvLyBUaGUgb3RoZXIgb25lIGlzIHNtYWxsZXIuCisJCXN0ZDo6c3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX3N1cCwgX19zdXApOworCQlzdGQ6OnN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9zb3VyY2UsIF9fc291cmNlKTsKKwkJc3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX2tleSwgX19rZXkpOworCSAgICAgIH0KKwkgIH0KKworCV9NX2xvc2Vyc1swXS5fTV9zdXAgPSBfX3N1cDsKKwlfTV9sb3NlcnNbMF0uX01fc291cmNlID0gX19zb3VyY2U7CisJX01fbG9zZXJzWzBdLl9NX2tleSA9IF9fa2V5OworICAgICAgfQorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBCYXNlIGNsYXNzIG9mIF9Mb3NlciBUcmVlIGltcGxlbWVudGF0aW9uIHVzaW5nIHBvaW50ZXJzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjbGFzcyBfTG9zZXJUcmVlUG9pbnRlckJhc2UKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgLyoqIEBicmllZiBJbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBfTG9zZXJUcmVlIF9fZWxlbWVudHMuICovCisgICAgICBzdHJ1Y3QgX0xvc2VyCisgICAgICB7CisJYm9vbCBfTV9zdXA7CisJaW50IF9NX3NvdXJjZTsKKwljb25zdCBfVHAqIF9NX2tleXA7CisgICAgICB9OworCisgICAgICB1bnNpZ25lZCBpbnQgX01faWssIF9NX2ssIF9NX29mZnNldDsKKyAgICAgIF9Mb3NlciogX01fbG9zZXJzOworICAgICAgX0NvbXBhcmUgX01fY29tcDsKKworICAgIHB1YmxpYzoKKyAgICAgIF9Mb3NlclRyZWVQb2ludGVyQmFzZSh1bnNpZ25lZCBpbnQgX19rLAorCQkJICAgIF9Db21wYXJlIF9fY29tcCA9IHN0ZDo6bGVzczxfVHA+KCkpCisgICAgICA6IF9NX2NvbXAoX19jb21wKQorICAgICAgeworCV9NX2lrID0gX19rOworCisJLy8gTmV4dCBncmVhdGVyIHBvd2VyIG9mIDIuCisJX01fayA9IDEgPDwgKF9fcmRfbG9nMihfTV9payAtIDEpICsgMSk7CisJX01fb2Zmc2V0ID0gX01fazsKKwlfTV9sb3NlcnMgPSBuZXcgX0xvc2VyW19NX2sgKiAyXTsKKwlmb3IgKHVuc2lnbmVkIGludCBfX2kgPSBfTV9payAtIDE7IF9faSA8IF9NX2s7IF9faSsrKQorCSAgX01fbG9zZXJzW19faSArIF9NX2tdLl9NX3N1cCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIH5fTG9zZXJUcmVlUG9pbnRlckJhc2UoKQorICAgICAgeyBkZWxldGVbXSBfTV9sb3NlcnM7IH0KKworICAgICAgaW50IF9fZ2V0X21pbl9zb3VyY2UoKQorICAgICAgeyByZXR1cm4gX01fbG9zZXJzWzBdLl9NX3NvdXJjZTsgfQorCisgICAgICB2b2lkIF9faW5zZXJ0X3N0YXJ0KGNvbnN0IF9UcCYgX19rZXksIGludCBfX3NvdXJjZSwgYm9vbCBfX3N1cCkKKyAgICAgIHsKKwl1bnNpZ25lZCBpbnQgX19wb3MgPSBfTV9rICsgX19zb3VyY2U7CisKKwlfTV9sb3NlcnNbX19wb3NdLl9NX3N1cCA9IF9fc3VwOworCV9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlID0gX19zb3VyY2U7CisJX01fbG9zZXJzW19fcG9zXS5fTV9rZXlwID0gJl9fa2V5OworICAgICAgfQorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBTdGFibGUgX0xvc2VyVHJlZSBpbXBsZW1lbnRhdGlvbi4KKyAgICoKKyAgICogVGhlIHVuc3RhYmxlIHZhcmlhbnQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgcGFydGlhbCBpbnN0YW50aWF0aW9uIGJlbG93LgorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZS8qIGRlZmF1bHQgPT0gdHJ1ZSAqLywgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjbGFzcyBfTG9zZXJUcmVlUG9pbnRlcgorICAgIDogcHVibGljIF9Mb3NlclRyZWVQb2ludGVyQmFzZTxfVHAsIF9Db21wYXJlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0xvc2VyVHJlZVBvaW50ZXJCYXNlPF9UcCwgX0NvbXBhcmU+IF9CYXNlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2s7CisgICAgICB1c2luZyBfQmFzZTo6X01fY29tcDsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9sb3NlcnM7CisKKyAgICBwdWJsaWM6CisgICAgICBfTG9zZXJUcmVlUG9pbnRlcih1bnNpZ25lZCBpbnQgX19rLCBfQ29tcGFyZSBfX2NvbXAgPSBzdGQ6Omxlc3M8X1RwPigpKQorICAgICAgOiBfQmFzZTo6X0xvc2VyVHJlZVBvaW50ZXJCYXNlKF9faywgX19jb21wKQorICAgICAgeyB9CisKKyAgICAgIHVuc2lnbmVkIGludAorICAgICAgX19pbml0X3dpbm5lcih1bnNpZ25lZCBpbnQgX19yb290KQorICAgICAgeworCWlmIChfX3Jvb3QgPj0gX01faykKKwkgIHJldHVybiBfX3Jvb3Q7CisJZWxzZQorCSAgeworCSAgICB1bnNpZ25lZCBpbnQgX19sZWZ0ID0gX19pbml0X3dpbm5lcigyICogX19yb290KTsKKwkgICAgdW5zaWduZWQgaW50IF9fcmlnaHQgPSBfX2luaXRfd2lubmVyKDIgKiBfX3Jvb3QgKyAxKTsKKwkgICAgaWYgKF9NX2xvc2Vyc1tfX3JpZ2h0XS5fTV9zdXAKKwkJfHwgKCFfTV9sb3NlcnNbX19sZWZ0XS5fTV9zdXAKKwkJICAgICYmICFfTV9jb21wKCpfTV9sb3NlcnNbX19yaWdodF0uX01fa2V5cCwKKwkJCQkqX01fbG9zZXJzW19fbGVmdF0uX01fa2V5cCkpKQorCSAgICAgIHsKKwkJLy8gTGVmdCBvbmUgaXMgbGVzcyBvciBlcXVhbC4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19yaWdodF07CisJCXJldHVybiBfX2xlZnQ7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQkvLyBSaWdodCBvbmUgaXMgbGVzcy4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19sZWZ0XTsKKwkJcmV0dXJuIF9fcmlnaHQ7CisJICAgICAgfQorCSAgfQorICAgICAgfQorCisgICAgICB2b2lkIF9faW5pdCgpCisgICAgICB7IF9NX2xvc2Vyc1swXSA9IF9NX2xvc2Vyc1tfX2luaXRfd2lubmVyKDEpXTsgfQorCisgICAgICB2b2lkIF9fZGVsZXRlX21pbl9pbnNlcnQoY29uc3QgX1RwJiBfX2tleSwgYm9vbCBfX3N1cCkKKyAgICAgIHsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJLy8gbm8gZHVtbXkgc2VxdWVuY2UgY2FuIGV2ZXIgYmUgYXQgdGhlIHRvcCEKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX01fbG9zZXJzWzBdLl9NX3NvdXJjZSAhPSAtMSk7CisjZW5kaWYKKworCWNvbnN0IF9UcCogX19rZXlwID0gJl9fa2V5OworCWludCBfX3NvdXJjZSA9IF9NX2xvc2Vyc1swXS5fTV9zb3VyY2U7CisJZm9yICh1bnNpZ25lZCBpbnQgX19wb3MgPSAoX01fayArIF9fc291cmNlKSAvIDI7IF9fcG9zID4gMDsKKwkgICAgIF9fcG9zIC89IDIpCisJICB7CisJICAgIC8vIFRoZSBzbWFsbGVyIG9uZSBnZXRzIHByb21vdGVkLCB0aWVzIGFyZSBicm9rZW4gYnkgX19zb3VyY2UuCisJICAgIGlmICgoX19zdXAgJiYgKCFfTV9sb3NlcnNbX19wb3NdLl9NX3N1cAorCQkJICAgfHwgX01fbG9zZXJzW19fcG9zXS5fTV9zb3VyY2UgPCBfX3NvdXJjZSkpCisJCXx8ICghX19zdXAgJiYgIV9NX2xvc2Vyc1tfX3Bvc10uX01fc3VwICYmCisJCSAgICAoKF9NX2NvbXAoKl9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5cCwgKl9fa2V5cCkpCisJCSAgICAgfHwgKCFfTV9jb21wKCpfX2tleXAsICpfTV9sb3NlcnNbX19wb3NdLl9NX2tleXApCisJCQkgJiYgX01fbG9zZXJzW19fcG9zXS5fTV9zb3VyY2UgPCBfX3NvdXJjZSkpKSkKKwkgICAgICB7CisJCS8vIFRoZSBvdGhlciBvbmUgaXMgc21hbGxlci4KKwkJc3RkOjpzd2FwKF9NX2xvc2Vyc1tfX3Bvc10uX01fc3VwLCBfX3N1cCk7CisJCXN0ZDo6c3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX3NvdXJjZSwgX19zb3VyY2UpOworCQlzdGQ6OnN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9rZXlwLCBfX2tleXApOworCSAgICAgIH0KKwkgIH0KKworCV9NX2xvc2Vyc1swXS5fTV9zdXAgPSBfX3N1cDsKKwlfTV9sb3NlcnNbMF0uX01fc291cmNlID0gX19zb3VyY2U7CisJX01fbG9zZXJzWzBdLl9NX2tleXAgPSBfX2tleXA7CisgICAgICB9CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFVuc3RhYmxlIF9Mb3NlclRyZWUgaW1wbGVtZW50YXRpb24uCisgICAqCisgICAqIFRoZSBzdGFibGUgdmFyaWFudCBpcyBhYm92ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY2xhc3MgX0xvc2VyVHJlZVBvaW50ZXI8LyogX19zdGFibGUgPT0gKi9mYWxzZSwgX1RwLCBfQ29tcGFyZT4KKyAgICA6IHB1YmxpYyBfTG9zZXJUcmVlUG9pbnRlckJhc2U8X1RwLCBfQ29tcGFyZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9Mb3NlclRyZWVQb2ludGVyQmFzZTxfVHAsIF9Db21wYXJlPiBfQmFzZTsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9rOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6X01fbG9zZXJzOworCisgICAgcHVibGljOgorICAgICAgX0xvc2VyVHJlZVBvaW50ZXIodW5zaWduZWQgaW50IF9faywgX0NvbXBhcmUgX19jb21wID0gc3RkOjpsZXNzPF9UcD4oKSkKKyAgICAgIDogX0Jhc2U6Ol9Mb3NlclRyZWVQb2ludGVyQmFzZShfX2ssIF9fY29tcCkKKyAgICAgIHsgfQorCisgICAgICB1bnNpZ25lZCBpbnQKKyAgICAgIF9faW5pdF93aW5uZXIodW5zaWduZWQgaW50IF9fcm9vdCkKKyAgICAgIHsKKwlpZiAoX19yb290ID49IF9NX2spCisJICByZXR1cm4gX19yb290OworCWVsc2UKKwkgIHsKKwkgICAgdW5zaWduZWQgaW50IF9fbGVmdCA9IF9faW5pdF93aW5uZXIoMiAqIF9fcm9vdCk7CisJICAgIHVuc2lnbmVkIGludCBfX3JpZ2h0ID0gX19pbml0X3dpbm5lcigyICogX19yb290ICsgMSk7CisJICAgIGlmIChfTV9sb3NlcnNbX19yaWdodF0uX01fc3VwCisgICAgICAgIAl8fCAoIV9NX2xvc2Vyc1tfX2xlZnRdLl9NX3N1cAorCQkgICAgJiYgIV9NX2NvbXAoKl9NX2xvc2Vyc1tfX3JpZ2h0XS5fTV9rZXlwLAorCQkJCSpfTV9sb3NlcnNbX19sZWZ0XS5fTV9rZXlwKSkpCisJICAgICAgeworCQkvLyBMZWZ0IG9uZSBpcyBsZXNzIG9yIGVxdWFsLgorCQlfTV9sb3NlcnNbX19yb290XSA9IF9NX2xvc2Vyc1tfX3JpZ2h0XTsKKwkJcmV0dXJuIF9fbGVmdDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8vIFJpZ2h0IG9uZSBpcyBsZXNzLgorCQlfTV9sb3NlcnNbX19yb290XSA9IF9NX2xvc2Vyc1tfX2xlZnRdOworCQlyZXR1cm4gX19yaWdodDsKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgICAgIHZvaWQgX19pbml0KCkKKyAgICAgIHsgX01fbG9zZXJzWzBdID0gX01fbG9zZXJzW19faW5pdF93aW5uZXIoMSldOyB9CisKKyAgICAgIHZvaWQgX19kZWxldGVfbWluX2luc2VydChjb25zdCBfVHAmIF9fa2V5LCBib29sIF9fc3VwKQorICAgICAgeworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkvLyBubyBkdW1teSBzZXF1ZW5jZSBjYW4gZXZlciBiZSBhdCB0aGUgdG9wIQorCV9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfTV9sb3NlcnNbMF0uX01fc291cmNlICE9IC0xKTsKKyNlbmRpZgorCisJY29uc3QgX1RwKiBfX2tleXAgPSAmX19rZXk7CisJaW50IF9fc291cmNlID0gX01fbG9zZXJzWzBdLl9NX3NvdXJjZTsKKwlmb3IgKHVuc2lnbmVkIGludCBfX3BvcyA9IChfTV9rICsgX19zb3VyY2UpIC8gMjsgX19wb3MgPiAwOworCSAgICAgX19wb3MgLz0gMikKKwkgIHsKKwkgICAgLy8gVGhlIHNtYWxsZXIgb25lIGdldHMgcHJvbW90ZWQuCisJICAgIGlmIChfX3N1cCB8fCAoIV9NX2xvc2Vyc1tfX3Bvc10uX01fc3VwCisJCQkgICYmIF9NX2NvbXAoKl9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5cCwgKl9fa2V5cCkpKQorCSAgICAgIHsKKwkJLy8gVGhlIG90aGVyIG9uZSBpcyBzbWFsbGVyLgorCQlzdGQ6OnN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9zdXAsIF9fc3VwKTsKKwkJc3RkOjpzd2FwKF9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlLCBfX3NvdXJjZSk7CisJCXN0ZDo6c3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX2tleXAsIF9fa2V5cCk7CisJICAgICAgfQorCSAgfQorCisJX01fbG9zZXJzWzBdLl9NX3N1cCA9IF9fc3VwOworCV9NX2xvc2Vyc1swXS5fTV9zb3VyY2UgPSBfX3NvdXJjZTsKKwlfTV9sb3NlcnNbMF0uX01fa2V5cCA9IF9fa2V5cDsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgQmFzZSBjbGFzcyBmb3IgdW5ndWFyZGVkIF9Mb3NlclRyZWUgaW1wbGVtZW50YXRpb24uCisgICAqIAorICAgKiBUaGUgd2hvbGUgZWxlbWVudCBpcyBjb3BpZWQgaW50byB0aGUgdHJlZSBzdHJ1Y3R1cmUuCisgICAqCisgICAqIE5vIGd1YXJkaW5nIGlzIGRvbmUsIHRoZXJlZm9yZSBub3QgYSBzaW5nbGUgaW5wdXQgc2VxdWVuY2UgbXVzdAorICAgKiBydW4gZW1wdHkuICBVbnVzZWQgX19zZXF1ZW5jZSBoZWFkcyBhcmUgbWFya2VkIHdpdGggYSBzZW50aW5lbCB3aGljaAorICAgKiBpcyAmZ3Q7IGFsbCBlbGVtZW50cyB0aGF0IGFyZSB0byBiZSBtZXJnZWQuCisgICAqCisgICAqIFRoaXMgaXMgYSB2ZXJ5IGZhc3QgdmFyaWFudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY2xhc3MgX0xvc2VyVHJlZVVuZ3VhcmRlZEJhc2UKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgc3RydWN0IF9Mb3NlcgorICAgICAgeworCWludCBfTV9zb3VyY2U7CisJX1RwIF9NX2tleTsKKyAgICAgIH07CisKKyAgICAgIHVuc2lnbmVkIGludCBfTV9paywgX01faywgX01fb2Zmc2V0OworICAgICAgX0xvc2VyKiBfTV9sb3NlcnM7CisgICAgICBfQ29tcGFyZSBfTV9jb21wOworCisgICAgcHVibGljOgorICAgICAgX0xvc2VyVHJlZVVuZ3VhcmRlZEJhc2UodW5zaWduZWQgaW50IF9faywgY29uc3QgX1RwJiBfX3NlbnRpbmVsLAorCQkJICAgICAgX0NvbXBhcmUgX19jb21wID0gc3RkOjpsZXNzPF9UcD4oKSkKKyAgICAgIDogX01fY29tcChfX2NvbXApCisgICAgICB7CisJX01faWsgPSBfX2s7CisKKwkvLyBOZXh0IGdyZWF0ZXIgcG93ZXIgb2YgMi4KKwlfTV9rID0gMSA8PCAoX19yZF9sb2cyKF9NX2lrIC0gMSkgKyAxKTsKKwlfTV9vZmZzZXQgPSBfTV9rOworCS8vIEF2b2lkIGRlZmF1bHQtY29uc3RydWN0aW5nIF9NX2xvc2Vyc1tdLl9NX2tleQorCV9NX2xvc2VycyA9IHN0YXRpY19jYXN0PF9Mb3Nlcio+KDo6b3BlcmF0b3IgbmV3KDIgKiBfTV9rCisJCQkJCQkJKiBzaXplb2YoX0xvc2VyKSkpOworCisgICAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDA7IF9faSA8IF9NX2s7ICsrX19pKQorICAgICAgICAgIHsKKwkgICAgOjpuZXcoJihfTV9sb3NlcnNbX19pXS5fTV9rZXkpKSBfVHAoX19zZW50aW5lbCk7CisJICAgIF9NX2xvc2Vyc1tfX2ldLl9NX3NvdXJjZSA9IC0xOworCSAgfQorICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSBfTV9rICsgX01faWsgLSAxOyBfX2kgPCAoMiAqIF9NX2spOyArK19faSkKKyAgICAgICAgICB7CisJICAgIDo6bmV3KCYoX01fbG9zZXJzW19faV0uX01fa2V5KSkgX1RwKF9fc2VudGluZWwpOworCSAgICBfTV9sb3NlcnNbX19pXS5fTV9zb3VyY2UgPSAtMTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgfl9Mb3NlclRyZWVVbmd1YXJkZWRCYXNlKCkKKyAgICAgIHsKKwlmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAwOyBfX2kgPCAoMiAqIF9NX2spOyArK19faSkKKwkgIF9NX2xvc2Vyc1tfX2ldLn5fTG9zZXIoKTsKKwk6Om9wZXJhdG9yIGRlbGV0ZShfTV9sb3NlcnMpOworICAgICAgfQorCisgICAgICBpbnQKKyAgICAgIF9fZ2V0X21pbl9zb3VyY2UoKQorICAgICAgeworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkvLyBubyBkdW1teSBzZXF1ZW5jZSBjYW4gZXZlciBiZSBhdCB0aGUgdG9wIQorCV9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfTV9sb3NlcnNbMF0uX01fc291cmNlICE9IC0xKTsKKyNlbmRpZgorCXJldHVybiBfTV9sb3NlcnNbMF0uX01fc291cmNlOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfX2luc2VydF9zdGFydChjb25zdCBfVHAmIF9fa2V5LCBpbnQgX19zb3VyY2UsIGJvb2wpCisgICAgICB7CisJdW5zaWduZWQgaW50IF9fcG9zID0gX01fayArIF9fc291cmNlOworCisJOjpuZXcoJihfTV9sb3NlcnNbX19wb3NdLl9NX2tleSkpIF9UcChfX2tleSk7CisJX01fbG9zZXJzW19fcG9zXS5fTV9zb3VyY2UgPSBfX3NvdXJjZTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgU3RhYmxlIGltcGxlbWVudGF0aW9uIG9mIHVuZ3VhcmRlZCBfTG9zZXJUcmVlLgorICAgKgorICAgKiBVbnN0YWJsZSB2YXJpYW50IGlzIHNlbGVjdGVkIGJlbG93IHdpdGggcGFydGlhbCBzcGVjaWFsaXphdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUvKiBkZWZhdWx0ID09IHRydWUgKi8sIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY2xhc3MgX0xvc2VyVHJlZVVuZ3VhcmRlZAorICAgIDogcHVibGljIF9Mb3NlclRyZWVVbmd1YXJkZWRCYXNlPF9UcCwgX0NvbXBhcmU+CisgICAgeworICAgICAgdHlwZWRlZiBfTG9zZXJUcmVlVW5ndWFyZGVkQmFzZTxfVHAsIF9Db21wYXJlPiBfQmFzZTsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9rOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6X01fbG9zZXJzOworCisgIHB1YmxpYzoKKyAgICAgIF9Mb3NlclRyZWVVbmd1YXJkZWQodW5zaWduZWQgaW50IF9faywgY29uc3QgX1RwJiBfX3NlbnRpbmVsLAorCQkJICBfQ29tcGFyZSBfX2NvbXAgPSBzdGQ6Omxlc3M8X1RwPigpKQorICAgICAgOiBfQmFzZTo6X0xvc2VyVHJlZVVuZ3VhcmRlZEJhc2UoX19rLCBfX3NlbnRpbmVsLCBfX2NvbXApCisgICAgICB7IH0KKworICAgICAgdW5zaWduZWQgaW50CisgICAgICBfX2luaXRfd2lubmVyKHVuc2lnbmVkIGludCBfX3Jvb3QpCisgICAgICB7CisJaWYgKF9fcm9vdCA+PSBfTV9rKQorCSAgcmV0dXJuIF9fcm9vdDsKKwllbHNlCisJICB7CisJICAgIHVuc2lnbmVkIGludCBfX2xlZnQgPSBfX2luaXRfd2lubmVyKDIgKiBfX3Jvb3QpOworCSAgICB1bnNpZ25lZCBpbnQgX19yaWdodCA9IF9faW5pdF93aW5uZXIoMiAqIF9fcm9vdCArIDEpOworCSAgICBpZiAoIV9NX2NvbXAoX01fbG9zZXJzW19fcmlnaHRdLl9NX2tleSwKKwkJCSBfTV9sb3NlcnNbX19sZWZ0XS5fTV9rZXkpKQorCSAgICAgIHsKKwkJLy8gTGVmdCBvbmUgaXMgbGVzcyBvciBlcXVhbC4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19yaWdodF07CisJCXJldHVybiBfX2xlZnQ7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQkvLyBSaWdodCBvbmUgaXMgbGVzcy4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19sZWZ0XTsKKwkJcmV0dXJuIF9fcmlnaHQ7CisJICAgICAgfQorCSAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfX2luaXQoKQorICAgICAgeworCV9NX2xvc2Vyc1swXSA9IF9NX2xvc2Vyc1tfX2luaXRfd2lubmVyKDEpXTsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkvLyBubyBkdW1teSBzZXF1ZW5jZSBjYW4gZXZlciBiZSBhdCB0aGUgdG9wIGF0IHRoZSBiZWdpbm5pbmcKKwkvLyAoMCBzZXF1ZW5jZXMhKQorCV9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfTV9sb3NlcnNbMF0uX01fc291cmNlICE9IC0xKTsKKyNlbmRpZgorICAgICAgfQorCisgICAgICAvLyBEbyBub3QgcGFzcyBhIGNvbnN0IHJlZmVyZW5jZSBzaW5jZSBfX2tleSB3aWxsIGJlIHVzZWQgYXMKKyAgICAgIC8vIGxvY2FsIHZhcmlhYmxlLgorICAgICAgdm9pZAorICAgICAgX19kZWxldGVfbWluX2luc2VydChfVHAgX19rZXksIGJvb2wpCisgICAgICB7CisgICAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJLy8gbm8gZHVtbXkgc2VxdWVuY2UgY2FuIGV2ZXIgYmUgYXQgdGhlIHRvcCEKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX01fbG9zZXJzWzBdLl9NX3NvdXJjZSAhPSAtMSk7CisjZW5kaWYKKworCWludCBfX3NvdXJjZSA9IF9NX2xvc2Vyc1swXS5fTV9zb3VyY2U7CisJZm9yICh1bnNpZ25lZCBpbnQgX19wb3MgPSAoX01fayArIF9fc291cmNlKSAvIDI7IF9fcG9zID4gMDsKKwkgICAgIF9fcG9zIC89IDIpCisJICB7CisJICAgIC8vIFRoZSBzbWFsbGVyIG9uZSBnZXRzIHByb21vdGVkLCB0aWVzIGFyZSBicm9rZW4gYnkgX01fc291cmNlLgorCSAgICBpZiAoX01fY29tcChfTV9sb3NlcnNbX19wb3NdLl9NX2tleSwgX19rZXkpCisgICAgICAgIAl8fCAoIV9NX2NvbXAoX19rZXksIF9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5KQorICAgICAgICAgICAgICAgICAgICAmJiBfTV9sb3NlcnNbX19wb3NdLl9NX3NvdXJjZSA8IF9fc291cmNlKSkKKwkgICAgICB7CisJCS8vIFRoZSBvdGhlciBvbmUgaXMgc21hbGxlci4KKwkJc3RkOjpzd2FwKF9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlLCBfX3NvdXJjZSk7CisJCXN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9rZXksIF9fa2V5KTsKKwkgICAgICB9CisJICB9CisKKwlfTV9sb3NlcnNbMF0uX01fc291cmNlID0gX19zb3VyY2U7CisJX01fbG9zZXJzWzBdLl9NX2tleSA9IF9fa2V5OworICAgICAgfQorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBOb24tU3RhYmxlIGltcGxlbWVudGF0aW9uIG9mIHVuZ3VhcmRlZCBfTG9zZXJUcmVlLgorICAgKgorICAgKiBTdGFibGUgaW1wbGVtZW50YXRpb24gaXMgYWJvdmUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNsYXNzIF9Mb3NlclRyZWVVbmd1YXJkZWQ8LyogX19zdGFibGUgPT0gKi9mYWxzZSwgX1RwLCBfQ29tcGFyZT4KKyAgICA6IHB1YmxpYyBfTG9zZXJUcmVlVW5ndWFyZGVkQmFzZTxfVHAsIF9Db21wYXJlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0xvc2VyVHJlZVVuZ3VhcmRlZEJhc2U8X1RwLCBfQ29tcGFyZT4gX0Jhc2U7CisgICAgICB1c2luZyBfQmFzZTo6X01fazsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2xvc2VyczsKKworICAgIHB1YmxpYzoKKyAgICAgIF9Mb3NlclRyZWVVbmd1YXJkZWQodW5zaWduZWQgaW50IF9faywgY29uc3QgX1RwJiBfX3NlbnRpbmVsLAorCQkJICBfQ29tcGFyZSBfX2NvbXAgPSBzdGQ6Omxlc3M8X1RwPigpKQorICAgICAgOiBfQmFzZTo6X0xvc2VyVHJlZVVuZ3VhcmRlZEJhc2UoX19rLCBfX3NlbnRpbmVsLCBfX2NvbXApCisgICAgICB7IH0KKworICAgICAgdW5zaWduZWQgaW50CisgICAgICBfX2luaXRfd2lubmVyKHVuc2lnbmVkIGludCBfX3Jvb3QpCisgICAgICB7CisJaWYgKF9fcm9vdCA+PSBfTV9rKQorCSAgcmV0dXJuIF9fcm9vdDsKKwllbHNlCisJICB7CisJICAgIHVuc2lnbmVkIGludCBfX2xlZnQgPSBfX2luaXRfd2lubmVyKDIgKiBfX3Jvb3QpOworCSAgICB1bnNpZ25lZCBpbnQgX19yaWdodCA9IF9faW5pdF93aW5uZXIoMiAqIF9fcm9vdCArIDEpOworCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworCSAgICAvLyBJZiBfX2xlZnQgb25lIGlzIHNlbnRpbmVsIHRoZW4gX19yaWdodCBvbmUgbXVzdCBiZSwgdG9vLgorCSAgICBpZiAoX01fbG9zZXJzW19fbGVmdF0uX01fc291cmNlID09IC0xKQorCSAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfTV9sb3NlcnNbX19yaWdodF0uX01fc291cmNlID09IC0xKTsKKyNlbmRpZgorCisJICAgIGlmICghX01fY29tcChfTV9sb3NlcnNbX19yaWdodF0uX01fa2V5LAorCQkJIF9NX2xvc2Vyc1tfX2xlZnRdLl9NX2tleSkpCisJICAgICAgeworCQkvLyBMZWZ0IG9uZSBpcyBsZXNzIG9yIGVxdWFsLgorCQlfTV9sb3NlcnNbX19yb290XSA9IF9NX2xvc2Vyc1tfX3JpZ2h0XTsKKwkJcmV0dXJuIF9fbGVmdDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8vIFJpZ2h0IG9uZSBpcyBsZXNzLgorCQlfTV9sb3NlcnNbX19yb290XSA9IF9NX2xvc2Vyc1tfX2xlZnRdOworCQlyZXR1cm4gX19yaWdodDsKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9faW5pdCgpCisgICAgICB7CisJX01fbG9zZXJzWzBdID0gX01fbG9zZXJzW19faW5pdF93aW5uZXIoMSldOworCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworCS8vIG5vIGR1bW15IHNlcXVlbmNlIGNhbiBldmVyIGJlIGF0IHRoZSB0b3AgYXQgdGhlIGJlZ2lubmluZworCS8vICgwIHNlcXVlbmNlcyEpCisJX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9NX2xvc2Vyc1swXS5fTV9zb3VyY2UgIT0gLTEpOworI2VuZGlmCisgICAgICB9CisKKyAgICAgIC8vIERvIG5vdCBwYXNzIGEgY29uc3QgcmVmZXJlbmNlIHNpbmNlIF9fa2V5IHdpbGwgYmUgdXNlZCBhcworICAgICAgLy8gbG9jYWwgdmFyaWFibGUuCisgICAgICB2b2lkCisgICAgICBfX2RlbGV0ZV9taW5faW5zZXJ0KF9UcCBfX2tleSwgYm9vbCkKKyAgICAgIHsKKyAgICAgICAgdXNpbmcgc3RkOjpzd2FwOworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkvLyBubyBkdW1teSBzZXF1ZW5jZSBjYW4gZXZlciBiZSBhdCB0aGUgdG9wIQorCV9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfTV9sb3NlcnNbMF0uX01fc291cmNlICE9IC0xKTsKKyNlbmRpZgorCisJaW50IF9fc291cmNlID0gX01fbG9zZXJzWzBdLl9NX3NvdXJjZTsKKwlmb3IgKHVuc2lnbmVkIGludCBfX3BvcyA9IChfTV9rICsgX19zb3VyY2UpIC8gMjsgX19wb3MgPiAwOworCSAgICAgX19wb3MgLz0gMikKKwkgIHsKKwkgICAgLy8gVGhlIHNtYWxsZXIgb25lIGdldHMgcHJvbW90ZWQuCisJICAgIGlmIChfTV9jb21wKF9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5LCBfX2tleSkpCisJICAgICAgeworCQkvLyBUaGUgb3RoZXIgb25lIGlzIHNtYWxsZXIuCisJCXN0ZDo6c3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX3NvdXJjZSwgX19zb3VyY2UpOworCQlzd2FwKF9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5LCBfX2tleSk7CisJICAgICAgfQorCSAgfQorCisJX01fbG9zZXJzWzBdLl9NX3NvdXJjZSA9IF9fc291cmNlOworCV9NX2xvc2Vyc1swXS5fTV9rZXkgPSBfX2tleTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgVW5ndWFyZGVkIGxvc2VyIHRyZWUsIGtlZXBpbmcgb25seSBwb2ludGVycyB0byB0aGUKKyAgKiBlbGVtZW50cyBpbiB0aGUgdHJlZSBzdHJ1Y3R1cmUuCisgICoKKyAgKiAgTm8gZ3VhcmRpbmcgaXMgZG9uZSwgdGhlcmVmb3JlIG5vdCBhIHNpbmdsZSBpbnB1dCBzZXF1ZW5jZSBtdXN0CisgICogIHJ1biBlbXB0eS4gIFRoaXMgaXMgYSB2ZXJ5IGZhc3QgdmFyaWFudC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjbGFzcyBfTG9zZXJUcmVlUG9pbnRlclVuZ3VhcmRlZEJhc2UKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgc3RydWN0IF9Mb3NlcgorICAgICAgeworCWludCBfTV9zb3VyY2U7CisJY29uc3QgX1RwKiBfTV9rZXlwOworICAgICAgfTsKKworICAgICAgdW5zaWduZWQgaW50IF9NX2lrLCBfTV9rLCBfTV9vZmZzZXQ7CisgICAgICBfTG9zZXIqIF9NX2xvc2VyczsKKyAgICAgIF9Db21wYXJlIF9NX2NvbXA7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIF9Mb3NlclRyZWVQb2ludGVyVW5ndWFyZGVkQmFzZSh1bnNpZ25lZCBpbnQgX19rLCBjb25zdCBfVHAmIF9fc2VudGluZWwsCisJCQkJICAgICBfQ29tcGFyZSBfX2NvbXAgPSBzdGQ6Omxlc3M8X1RwPigpKQorICAgICAgOiBfTV9jb21wKF9fY29tcCkKKyAgICAgIHsKKwlfTV9payA9IF9fazsKKworCS8vIE5leHQgZ3JlYXRlciBwb3dlciBvZiAyLgorCV9NX2sgPSAxIDw8IChfX3JkX2xvZzIoX01faWsgLSAxKSArIDEpOworCV9NX29mZnNldCA9IF9NX2s7CisJLy8gQXZvaWQgZGVmYXVsdC1jb25zdHJ1Y3RpbmcgX01fbG9zZXJzW10uX01fa2V5CisJX01fbG9zZXJzID0gbmV3IF9Mb3NlclsyICogX01fa107CisKKwlmb3IgKHVuc2lnbmVkIGludCBfX2kgPSBfTV9rICsgX01faWsgLSAxOyBfX2kgPCAoMiAqIF9NX2spOyArK19faSkKKwkgIHsKKwkgICAgX01fbG9zZXJzW19faV0uX01fa2V5cCA9ICZfX3NlbnRpbmVsOworCSAgICBfTV9sb3NlcnNbX19pXS5fTV9zb3VyY2UgPSAtMTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgfl9Mb3NlclRyZWVQb2ludGVyVW5ndWFyZGVkQmFzZSgpCisgICAgICB7IGRlbGV0ZVtdIF9NX2xvc2VyczsgfQorCisgICAgICBpbnQKKyAgICAgIF9fZ2V0X21pbl9zb3VyY2UoKQorICAgICAgeworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkvLyBubyBkdW1teSBzZXF1ZW5jZSBjYW4gZXZlciBiZSBhdCB0aGUgdG9wIQorCV9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfTV9sb3NlcnNbMF0uX01fc291cmNlICE9IC0xKTsKKyNlbmRpZgorCXJldHVybiBfTV9sb3NlcnNbMF0uX01fc291cmNlOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfX2luc2VydF9zdGFydChjb25zdCBfVHAmIF9fa2V5LCBpbnQgX19zb3VyY2UsIGJvb2wpCisgICAgICB7CisJdW5zaWduZWQgaW50IF9fcG9zID0gX01fayArIF9fc291cmNlOworCisJX01fbG9zZXJzW19fcG9zXS5fTV9rZXlwID0gJl9fa2V5OworCV9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlID0gX19zb3VyY2U7CisgICAgICB9CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFN0YWJsZSB1bmd1YXJkZWQgX0xvc2VyVHJlZSB2YXJpYW50IHN0b3JpbmcgcG9pbnRlcnMuCisgICAqCisgICAqIFVuc3RhYmxlIHZhcmlhbnQgaXMgaW1wbGVtZW50ZWQgYmVsb3cgdXNpbmcgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUvKiBkZWZhdWx0ID09IHRydWUgKi8sIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY2xhc3MgX0xvc2VyVHJlZVBvaW50ZXJVbmd1YXJkZWQKKyAgICA6IHB1YmxpYyBfTG9zZXJUcmVlUG9pbnRlclVuZ3VhcmRlZEJhc2U8X1RwLCBfQ29tcGFyZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9Mb3NlclRyZWVQb2ludGVyVW5ndWFyZGVkQmFzZTxfVHAsIF9Db21wYXJlPiBfQmFzZTsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9rOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6X01fbG9zZXJzOworCisgICAgcHVibGljOgorICAgICAgX0xvc2VyVHJlZVBvaW50ZXJVbmd1YXJkZWQodW5zaWduZWQgaW50IF9faywgY29uc3QgX1RwJiBfX3NlbnRpbmVsLAorCQkJCSBfQ29tcGFyZSBfX2NvbXAgPSBzdGQ6Omxlc3M8X1RwPigpKQorICAgICAgOiBfQmFzZTo6X0xvc2VyVHJlZVBvaW50ZXJVbmd1YXJkZWRCYXNlKF9faywgX19zZW50aW5lbCwgX19jb21wKQorICAgICAgeyB9CisKKyAgICAgIHVuc2lnbmVkIGludAorICAgICAgX19pbml0X3dpbm5lcih1bnNpZ25lZCBpbnQgX19yb290KQorICAgICAgeworCWlmIChfX3Jvb3QgPj0gX01faykKKwkgIHJldHVybiBfX3Jvb3Q7CisJZWxzZQorCSAgeworCSAgICB1bnNpZ25lZCBpbnQgX19sZWZ0ID0gX19pbml0X3dpbm5lcigyICogX19yb290KTsKKwkgICAgdW5zaWduZWQgaW50IF9fcmlnaHQgPSBfX2luaXRfd2lubmVyKDIgKiBfX3Jvb3QgKyAxKTsKKwkgICAgaWYgKCFfTV9jb21wKCpfTV9sb3NlcnNbX19yaWdodF0uX01fa2V5cCwKKwkJCSAqX01fbG9zZXJzW19fbGVmdF0uX01fa2V5cCkpCisJICAgICAgeworCQkvLyBMZWZ0IG9uZSBpcyBsZXNzIG9yIGVxdWFsLgorCQlfTV9sb3NlcnNbX19yb290XSA9IF9NX2xvc2Vyc1tfX3JpZ2h0XTsKKwkJcmV0dXJuIF9fbGVmdDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8vIFJpZ2h0IG9uZSBpcyBsZXNzLgorCQlfTV9sb3NlcnNbX19yb290XSA9IF9NX2xvc2Vyc1tfX2xlZnRdOworCQlyZXR1cm4gX19yaWdodDsKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9faW5pdCgpCisgICAgICB7CisJX01fbG9zZXJzWzBdID0gX01fbG9zZXJzW19faW5pdF93aW5uZXIoMSldOworCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworCS8vIG5vIGR1bW15IHNlcXVlbmNlIGNhbiBldmVyIGJlIGF0IHRoZSB0b3AgYXQgdGhlIGJlZ2lubmluZworCS8vICgwIHNlcXVlbmNlcyEpCisJX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9NX2xvc2Vyc1swXS5fTV9zb3VyY2UgIT0gLTEpOworI2VuZGlmCisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9fZGVsZXRlX21pbl9pbnNlcnQoY29uc3QgX1RwJiBfX2tleSwgYm9vbCBfX3N1cCkKKyAgICAgIHsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJLy8gbm8gZHVtbXkgc2VxdWVuY2UgY2FuIGV2ZXIgYmUgYXQgdGhlIHRvcCEKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX01fbG9zZXJzWzBdLl9NX3NvdXJjZSAhPSAtMSk7CisjZW5kaWYKKworCWNvbnN0IF9UcCogX19rZXlwID0gJl9fa2V5OworCWludCBfX3NvdXJjZSA9IF9NX2xvc2Vyc1swXS5fTV9zb3VyY2U7CisJZm9yICh1bnNpZ25lZCBpbnQgX19wb3MgPSAoX01fayArIF9fc291cmNlKSAvIDI7IF9fcG9zID4gMDsKKwkgICAgIF9fcG9zIC89IDIpCisJICB7CisJICAgIC8vIFRoZSBzbWFsbGVyIG9uZSBnZXRzIHByb21vdGVkLCB0aWVzIGFyZSBicm9rZW4gYnkgX01fc291cmNlLgorCSAgICBpZiAoX01fY29tcCgqX01fbG9zZXJzW19fcG9zXS5fTV9rZXlwLCAqX19rZXlwKQorCQl8fCAoIV9NX2NvbXAoKl9fa2V5cCwgKl9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5cCkKKwkJICAgICYmIF9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlIDwgX19zb3VyY2UpKQorCSAgICAgIHsKKwkJLy8gVGhlIG90aGVyIG9uZSBpcyBzbWFsbGVyLgorCQlzdGQ6OnN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9zb3VyY2UsIF9fc291cmNlKTsKKwkJc3RkOjpzd2FwKF9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5cCwgX19rZXlwKTsKKwkgICAgICB9CisJICB9CisKKwlfTV9sb3NlcnNbMF0uX01fc291cmNlID0gX19zb3VyY2U7CisJX01fbG9zZXJzWzBdLl9NX2tleXAgPSBfX2tleXA7CisgICAgICB9CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFVuc3RhYmxlIHVuZ3VhcmRlZCBfTG9zZXJUcmVlIHZhcmlhbnQgc3RvcmluZyBwb2ludGVycy4KKyAgICoKKyAgICogU3RhYmxlIHZhcmlhbnQgaXMgYWJvdmUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNsYXNzIF9Mb3NlclRyZWVQb2ludGVyVW5ndWFyZGVkPC8qIF9fc3RhYmxlID09ICovZmFsc2UsIF9UcCwgX0NvbXBhcmU+CisgICAgOiBwdWJsaWMgX0xvc2VyVHJlZVBvaW50ZXJVbmd1YXJkZWRCYXNlPF9UcCwgX0NvbXBhcmU+CisgICAgeworICAgICAgdHlwZWRlZiBfTG9zZXJUcmVlUG9pbnRlclVuZ3VhcmRlZEJhc2U8X1RwLCBfQ29tcGFyZT4gX0Jhc2U7CisgICAgICB1c2luZyBfQmFzZTo6X01fazsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2xvc2VyczsKKworICBwdWJsaWM6CisgICAgICBfTG9zZXJUcmVlUG9pbnRlclVuZ3VhcmRlZCh1bnNpZ25lZCBpbnQgX19rLCBjb25zdCBfVHAmIF9fc2VudGluZWwsCisJCQkJIF9Db21wYXJlIF9fY29tcCA9IHN0ZDo6bGVzczxfVHA+KCkpCisgICAgICA6IF9CYXNlOjpfTG9zZXJUcmVlUG9pbnRlclVuZ3VhcmRlZEJhc2UoX19rLCBfX3NlbnRpbmVsLCBfX2NvbXApCisgICAgICB7IH0KKworICAgICAgdW5zaWduZWQgaW50CisgICAgICBfX2luaXRfd2lubmVyKHVuc2lnbmVkIGludCBfX3Jvb3QpCisgICAgICB7CisJaWYgKF9fcm9vdCA+PSBfTV9rKQorCSAgcmV0dXJuIF9fcm9vdDsKKwllbHNlCisJICB7CisJICAgIHVuc2lnbmVkIGludCBfX2xlZnQgPSBfX2luaXRfd2lubmVyKDIgKiBfX3Jvb3QpOworCSAgICB1bnNpZ25lZCBpbnQgX19yaWdodCA9IF9faW5pdF93aW5uZXIoMiAqIF9fcm9vdCArIDEpOworCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworCSAgICAvLyBJZiBfX2xlZnQgb25lIGlzIHNlbnRpbmVsIHRoZW4gX19yaWdodCBvbmUgbXVzdCBiZSwgdG9vLgorCSAgICBpZiAoX01fbG9zZXJzW19fbGVmdF0uX01fc291cmNlID09IC0xKQorCSAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfTV9sb3NlcnNbX19yaWdodF0uX01fc291cmNlID09IC0xKTsKKyNlbmRpZgorCisJICAgIGlmICghX01fY29tcCgqX01fbG9zZXJzW19fcmlnaHRdLl9NX2tleXAsCisJCQkgKl9NX2xvc2Vyc1tfX2xlZnRdLl9NX2tleXApKQorCSAgICAgIHsKKwkJLy8gTGVmdCBvbmUgaXMgbGVzcyBvciBlcXVhbC4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19yaWdodF07CisJCXJldHVybiBfX2xlZnQ7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQkvLyBSaWdodCBvbmUgaXMgbGVzcy4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19sZWZ0XTsKKwkJcmV0dXJuIF9fcmlnaHQ7CisJICAgICAgfQorCSAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfX2luaXQoKQorICAgICAgeworCV9NX2xvc2Vyc1swXSA9IF9NX2xvc2Vyc1tfX2luaXRfd2lubmVyKDEpXTsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkvLyBubyBkdW1teSBzZXF1ZW5jZSBjYW4gZXZlciBiZSBhdCB0aGUgdG9wIGF0IHRoZSBiZWdpbm5pbmcKKwkvLyAoMCBzZXF1ZW5jZXMhKQorCV9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfTV9sb3NlcnNbMF0uX01fc291cmNlICE9IC0xKTsKKyNlbmRpZgorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfX2RlbGV0ZV9taW5faW5zZXJ0KGNvbnN0IF9UcCYgX19rZXksIGJvb2wgX19zdXApCisgICAgICB7CisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworCS8vIG5vIGR1bW15IHNlcXVlbmNlIGNhbiBldmVyIGJlIGF0IHRoZSB0b3AhCisJX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9NX2xvc2Vyc1swXS5fTV9zb3VyY2UgIT0gLTEpOworI2VuZGlmCisKKwljb25zdCBfVHAqIF9fa2V5cCA9ICZfX2tleTsKKwlpbnQgX19zb3VyY2UgPSBfTV9sb3NlcnNbMF0uX01fc291cmNlOworCWZvciAodW5zaWduZWQgaW50IF9fcG9zID0gKF9NX2sgKyBfX3NvdXJjZSkgLyAyOyBfX3BvcyA+IDA7CisJICAgICBfX3BvcyAvPSAyKQorCSAgeworCSAgICAvLyBUaGUgc21hbGxlciBvbmUgZ2V0cyBwcm9tb3RlZC4KKwkgICAgaWYgKF9NX2NvbXAoKihfTV9sb3NlcnNbX19wb3NdLl9NX2tleXApLCAqX19rZXlwKSkKKwkgICAgICB7CisJCS8vIFRoZSBvdGhlciBvbmUgaXMgc21hbGxlci4KKwkJc3RkOjpzd2FwKF9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlLCBfX3NvdXJjZSk7CisJCXN0ZDo6c3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX2tleXAsIF9fa2V5cCk7CisJICAgICAgfQorCSAgfQorCisJX01fbG9zZXJzWzBdLl9NX3NvdXJjZSA9IF9fc291cmNlOworCV9NX2xvc2Vyc1swXS5fTV9rZXlwID0gX19rZXlwOworICAgICAgfQorICAgIH07Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfTE9TRVJUUkVFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbWVyZ2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbWVyZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2Q0YjQ1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9tZXJnZS5oCkBAIC0wLDAgKzEsMjUxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvbWVyZ2UuaAorICogIEBicmllZiBQYXJhbGxlbCBpbXBsZW1lbnRhdGlvbiBvZiBzdGQ6Om1lcmdlKCkuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX01FUkdFX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNpY19pdGVyYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ28uaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgTWVyZ2Ugcm91dGluZSBiZWluZyBhYmxlIHRvIG1lcmdlIG9ubHkgdGhlIEBjIF9fbWF4X2xlbmd0aAorICAgKiBzbWFsbGVzdCBlbGVtZW50cy4KKyAgICoKKyAgICogVGhlIEBjIF9fYmVnaW4gaXRlcmF0b3JzIGFyZSBhZHZhbmNlZCBhY2NvcmRpbmdseSwgdGhleSBtaWdodCBub3QKKyAgICogcmVhY2ggQGMgX19lbmQsIGluIGNvbnRyYXN0IHRvIHRoZSB1c3VhbCB2YXJpYW50LgorICAgKiBAcGFyYW0gX19iZWdpbjEgQmVnaW4gaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX2VuZDEgRW5kIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19iZWdpbjIgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19lbmQyIEVuZCBpdGVyYXRvciBvZiBzZWNvbmQgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX3RhcmdldCBUYXJnZXQgYmVnaW4gaXRlcmF0b3IuCisgICAqIEBwYXJhbSBfX21heF9sZW5ndGggTWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gbWVyZ2UuCisgICAqIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICogQHJldHVybiBPdXRwdXQgZW5kIGl0ZXJhdG9yLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19tZXJnZV9hZHZhbmNlX3VzdWFsKF9SQUl0ZXIxJiBfX2JlZ2luMSwgX1JBSXRlcjEgX19lbmQxLAorCQkJICBfUkFJdGVyMiYgX19iZWdpbjIsIF9SQUl0ZXIyIF9fZW5kMiwKKwkJCSAgX091dHB1dEl0ZXJhdG9yIF9fdGFyZ2V0LAorCQkJICBfRGlmZmVyZW5jZVRwIF9fbWF4X2xlbmd0aCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICB3aGlsZSAoX19iZWdpbjEgIT0gX19lbmQxICYmIF9fYmVnaW4yICE9IF9fZW5kMiAmJiBfX21heF9sZW5ndGggPiAwKQorICAgICAgICB7CisgICAgICAgICAgLy8gYXJyYXkxW19faTFdIDwgYXJyYXkwW2kwXQorICAgICAgICAgIGlmIChfX2NvbXAoKl9fYmVnaW4yLCAqX19iZWdpbjEpKQorICAgICAgICAgICAgKl9fdGFyZ2V0KysgPSAqX19iZWdpbjIrKzsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAqX190YXJnZXQrKyA9ICpfX2JlZ2luMSsrOworICAgICAgICAgIC0tX19tYXhfbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgIGlmIChfX2JlZ2luMSAhPSBfX2VuZDEpCisgICAgICAgIHsKKyAgICAgICAgICBfX3RhcmdldCA9IHN0ZDo6Y29weShfX2JlZ2luMSwgX19iZWdpbjEgKyBfX21heF9sZW5ndGgsIF9fdGFyZ2V0KTsKKyAgICAgICAgICBfX2JlZ2luMSArPSBfX21heF9sZW5ndGg7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9fdGFyZ2V0ID0gc3RkOjpjb3B5KF9fYmVnaW4yLCBfX2JlZ2luMiArIF9fbWF4X2xlbmd0aCwgX190YXJnZXQpOworICAgICAgICAgIF9fYmVnaW4yICs9IF9fbWF4X2xlbmd0aDsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIF9fdGFyZ2V0OworICAgIH0KKworICAvKiogQGJyaWVmIE1lcmdlIHJvdXRpbmUgYmVpbmcgYWJsZSB0byBtZXJnZSBvbmx5IHRoZSBAYyBfX21heF9sZW5ndGgKKyAgICogc21hbGxlc3QgZWxlbWVudHMuCisgICAqCisgICAqIFRoZSBAYyBfX2JlZ2luIGl0ZXJhdG9ycyBhcmUgYWR2YW5jZWQgYWNjb3JkaW5nbHksIHRoZXkgbWlnaHQgbm90CisgICAqIHJlYWNoIEBjIF9fZW5kLCBpbiBjb250cmFzdCB0byB0aGUgdXN1YWwgdmFyaWFudC4KKyAgICogU3BlY2lhbGx5IGRlc2lnbmVkIGNvZGUgc2hvdWxkIGFsbG93IHRoZSBjb21waWxlciB0byBnZW5lcmF0ZQorICAgKiBjb25kaXRpb25hbCBtb3ZlcyBpbnN0ZWFkIG9mIGJyYW5jaGVzLgorICAgKiBAcGFyYW0gX19iZWdpbjEgQmVnaW4gaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX2VuZDEgRW5kIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19iZWdpbjIgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19lbmQyIEVuZCBpdGVyYXRvciBvZiBzZWNvbmQgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX3RhcmdldCBUYXJnZXQgYmVnaW4gaXRlcmF0b3IuCisgICAqIEBwYXJhbSBfX21heF9sZW5ndGggTWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gbWVyZ2UuCisgICAqIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICogQHJldHVybiBPdXRwdXQgZW5kIGl0ZXJhdG9yLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19tZXJnZV9hZHZhbmNlX21vdmMoX1JBSXRlcjEmIF9fYmVnaW4xLCBfUkFJdGVyMSBfX2VuZDEsCisJCQkgX1JBSXRlcjImIF9fYmVnaW4yLCBfUkFJdGVyMiBfX2VuZDIsCisJCQkgX091dHB1dEl0ZXJhdG9yIF9fdGFyZ2V0LAorCQkJIF9EaWZmZXJlbmNlVHAgX19tYXhfbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjE+Ojp2YWx1ZV90eXBlCisgICAgICAgIF9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMj46OnZhbHVlX3R5cGUKKyAgICAgICAgX1ZhbHVlVHlwZTI7CisKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX19tYXhfbGVuZ3RoID49IDApOworI2VuZGlmCisKKyAgICAgIHdoaWxlIChfX2JlZ2luMSAhPSBfX2VuZDEgJiYgX19iZWdpbjIgIT0gX19lbmQyICYmIF9fbWF4X2xlbmd0aCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBfUkFJdGVyMSBfX25leHQxID0gX19iZWdpbjEgKyAxOworICAgICAgICAgIF9SQUl0ZXIyIF9fbmV4dDIgPSBfX2JlZ2luMiArIDE7CisgICAgICAgICAgX1ZhbHVlVHlwZTEgX19lbGVtZW50MSA9ICpfX2JlZ2luMTsKKyAgICAgICAgICBfVmFsdWVUeXBlMiBfX2VsZW1lbnQyID0gKl9fYmVnaW4yOworCisgICAgICAgICAgaWYgKF9fY29tcChfX2VsZW1lbnQyLCBfX2VsZW1lbnQxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19lbGVtZW50MSA9IF9fZWxlbWVudDI7CisgICAgICAgICAgICAgIF9fYmVnaW4yID0gX19uZXh0MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfX2JlZ2luMSA9IF9fbmV4dDE7CisKKyAgICAgICAgICAqX190YXJnZXQgPSBfX2VsZW1lbnQxOworCisgICAgICAgICAgKytfX3RhcmdldDsKKyAgICAgICAgICAtLV9fbWF4X2xlbmd0aDsKKyAgICAgICAgfQorICAgICAgaWYgKF9fYmVnaW4xICE9IF9fZW5kMSkKKyAgICAgICAgeworICAgICAgICAgIF9fdGFyZ2V0ID0gc3RkOjpjb3B5KF9fYmVnaW4xLCBfX2JlZ2luMSArIF9fbWF4X2xlbmd0aCwgX190YXJnZXQpOworICAgICAgICAgIF9fYmVnaW4xICs9IF9fbWF4X2xlbmd0aDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX190YXJnZXQgPSBzdGQ6OmNvcHkoX19iZWdpbjIsIF9fYmVnaW4yICsgX19tYXhfbGVuZ3RoLCBfX3RhcmdldCk7CisgICAgICAgICAgX19iZWdpbjIgKz0gX19tYXhfbGVuZ3RoOworICAgICAgICB9CisgICAgICByZXR1cm4gX190YXJnZXQ7CisgICAgfQorCisgIC8qKiBAYnJpZWYgTWVyZ2Ugcm91dGluZSBiZWluZyBhYmxlIHRvIG1lcmdlIG9ubHkgdGhlIEBjIF9fbWF4X2xlbmd0aAorICAgKiBzbWFsbGVzdCBlbGVtZW50cy4KKyAgICoKKyAgICogIFRoZSBAYyBfX2JlZ2luIGl0ZXJhdG9ycyBhcmUgYWR2YW5jZWQgYWNjb3JkaW5nbHksIHRoZXkgbWlnaHQgbm90CisgICAqICByZWFjaCBAYyBfX2VuZCwgaW4gY29udHJhc3QgdG8gdGhlIHVzdWFsIHZhcmlhbnQuCisgICAqICBTdGF0aWMgc3dpdGNoIG9uIHdoZXRoZXIgdG8gdXNlIHRoZSBjb25kaXRpb25hbC1tb3ZlIHZhcmlhbnQuCisgICAqICBAcGFyYW0gX19iZWdpbjEgQmVnaW4gaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQxIEVuZCBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2JlZ2luMiBCZWdpbiBpdGVyYXRvciBvZiBzZWNvbmQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQyIEVuZCBpdGVyYXRvciBvZiBzZWNvbmQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX190YXJnZXQgVGFyZ2V0IGJlZ2luIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtIF9fbWF4X2xlbmd0aCBNYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byBtZXJnZS4KKyAgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICogIEByZXR1cm4gT3V0cHV0IGVuZCBpdGVyYXRvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX21lcmdlX2FkdmFuY2UoX1JBSXRlcjEmIF9fYmVnaW4xLCBfUkFJdGVyMSBfX2VuZDEsCisJCSAgICBfUkFJdGVyMiYgX19iZWdpbjIsIF9SQUl0ZXIyIF9fZW5kMiwKKwkJICAgIF9PdXRwdXRJdGVyYXRvciBfX3RhcmdldCwgX0RpZmZlcmVuY2VUcCBfX21heF9sZW5ndGgsCisJCSAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX21heF9sZW5ndGgpCisKKyAgICAgIHJldHVybiBfX21lcmdlX2FkdmFuY2VfbW92YyhfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLAorCQkJCSAgX190YXJnZXQsIF9fbWF4X2xlbmd0aCwgX19jb21wKTsKKyAgICB9CisKKyAgLyoqIEBicmllZiBNZXJnZSByb3V0aW5lIGZhbGxiYWNrIHRvIHNlcXVlbnRpYWwgaW4gY2FzZSB0aGUKKyAgICAgIGl0ZXJhdG9ycyBvZiB0aGUgdHdvIGlucHV0IHNlcXVlbmNlcyBhcmUgb2YgZGlmZmVyZW50IHR5cGUuCisgICAgICAqICBAcGFyYW0gX19iZWdpbjEgQmVnaW4gaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAgICAqICBAcGFyYW0gX19lbmQxIEVuZCBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICAgICogIEBwYXJhbSBfX2JlZ2luMiBCZWdpbiBpdGVyYXRvciBvZiBzZWNvbmQgc2VxdWVuY2UuCisgICAgICAqICBAcGFyYW0gX19lbmQyIEVuZCBpdGVyYXRvciBvZiBzZWNvbmQgc2VxdWVuY2UuCisgICAgICAqICBAcGFyYW0gX190YXJnZXQgVGFyZ2V0IGJlZ2luIGl0ZXJhdG9yLgorICAgICAgKiAgQHBhcmFtIF9fbWF4X2xlbmd0aCBNYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byBtZXJnZS4KKyAgICAgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICAgICogIEByZXR1cm4gT3V0cHV0IGVuZCBpdGVyYXRvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfUkFJdGVyMywgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIF9SQUl0ZXIzCisgICAgX19wYXJhbGxlbF9tZXJnZV9hZHZhbmNlKF9SQUl0ZXIxJiBfX2JlZ2luMSwgX1JBSXRlcjEgX19lbmQxLAorCQkJICAgICBfUkFJdGVyMiYgX19iZWdpbjIsCisJCQkgICAgIC8vIGRpZmZlcmVudCBpdGVyYXRvcnMsIHBhcmFsbGVsIGltcGxlbWVudGF0aW9uCisJCQkgICAgIC8vIG5vdCBhdmFpbGFibGUKKwkJCSAgICAgX1JBSXRlcjIgX19lbmQyLCBfUkFJdGVyMyBfX3RhcmdldCwgdHlwZW5hbWUKKwkJCSAgICAgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjE+OjoKKwkJCSAgICAgZGlmZmVyZW5jZV90eXBlIF9fbWF4X2xlbmd0aCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsgcmV0dXJuIF9fbWVyZ2VfYWR2YW5jZShfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3RhcmdldCwKKwkJCSAgICAgX19tYXhfbGVuZ3RoLCBfX2NvbXApOyB9CisKKyAgLyoqIEBicmllZiBQYXJhbGxlbCBtZXJnZSByb3V0aW5lIGJlaW5nIGFibGUgdG8gbWVyZ2Ugb25seSB0aGUgQGMKKyAgICogX19tYXhfbGVuZ3RoIHNtYWxsZXN0IGVsZW1lbnRzLgorICAgKgorICAgKiAgVGhlIEBjIF9fYmVnaW4gaXRlcmF0b3JzIGFyZSBhZHZhbmNlZCBhY2NvcmRpbmdseSwgdGhleSBtaWdodCBub3QKKyAgICogIHJlYWNoIEBjIF9fZW5kLCBpbiBjb250cmFzdCB0byB0aGUgdXN1YWwgdmFyaWFudC4KKyAgICogIFRoZSBmdW5jdGlvbmFsaXR5IGlzIHByb2plY3RlZCBvbnRvIHBhcmFsbGVsX211bHRpd2F5X21lcmdlLgorICAgKiAgQHBhcmFtIF9fYmVnaW4xIEJlZ2luIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kMSBFbmQgaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19iZWdpbjIgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kMiBFbmQgaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fdGFyZ2V0IFRhcmdldCBiZWdpbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSBfX21heF9sZW5ndGggTWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gbWVyZ2UuCisgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqICBAcmV0dXJuIE91dHB1dCBlbmQgaXRlcmF0b3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjMsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfUkFJdGVyMworICAgIF9fcGFyYWxsZWxfbWVyZ2VfYWR2YW5jZShfUkFJdGVyMSYgX19iZWdpbjEsIF9SQUl0ZXIxIF9fZW5kMSwKKwkJCSAgICAgX1JBSXRlcjEmIF9fYmVnaW4yLCBfUkFJdGVyMSBfX2VuZDIsCisJCQkgICAgIF9SQUl0ZXIzIF9fdGFyZ2V0LCB0eXBlbmFtZQorCQkJICAgICBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMT46OgorCQkJICAgICBkaWZmZXJlbmNlX3R5cGUgX19tYXhfbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZQorICAgICAgICAgIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMT46OgorICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlMSAvKiA9PSBkaWZmZXJlbmNlX3R5cGUyICovOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMz46OgorICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlMzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpwYWlyPF9SQUl0ZXIxLCBfUkFJdGVyMT4KKyAgICAgICAgX0l0ZXJhdG9yUGFpcjsKKworICAgICAgX0l0ZXJhdG9yUGFpciBfX3NlcXNbMl0gPSB7IHN0ZDo6bWFrZV9wYWlyKF9fYmVnaW4xLCBfX2VuZDEpLAorCQkJCSAgc3RkOjptYWtlX3BhaXIoX19iZWdpbjIsIF9fZW5kMikgfTsKKyAgICAgIF9SQUl0ZXIzIF9fdGFyZ2V0X2VuZCA9IHBhcmFsbGVsX211bHRpd2F5X21lcmdlCisJPCAvKiBfX3N0YWJsZSA9ICovIHRydWUsIC8qIF9fc2VudGluZWxzID0gKi8gZmFsc2U+CisJKF9fc2VxcywgX19zZXFzICsgMiwgX190YXJnZXQsIG11bHRpd2F5X21lcmdlX2V4YWN0X3NwbGl0dGluZworCSA8IC8qIF9fc3RhYmxlID0gKi8gdHJ1ZSwgX0l0ZXJhdG9yUGFpciosCisJIF9Db21wYXJlLCBfRGlmZmVyZW5jZVR5cGUxPiwgX19tYXhfbGVuZ3RoLCBfX2NvbXAsCisJIG9tcF9nZXRfbWF4X3RocmVhZHMoKSk7CisKKyAgICAgIHJldHVybiBfX3RhcmdldF9lbmQ7CisgICAgfQorfSAgICAgICAvL25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9tdWx0aXNlcV9zZWxlY3Rpb24uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbXVsdGlzZXFfc2VsZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0NmM5YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbXVsdGlzZXFfc2VsZWN0aW9uLmgKQEAgLTAsMCArMSw2NDQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9tdWx0aXNlcV9zZWxlY3Rpb24uaAorICogIEBicmllZiBGdW5jdGlvbnMgdG8gZmluZCBlbGVtZW50cyBvZiBhIGNlcnRhaW4gZ2xvYmFsIF9fcmFuayBpbgorICogIG11bHRpcGxlIHNvcnRlZCBzZXF1ZW5jZXMuICBBbHNvIHNlcnZlcyBmb3Igc3BsaXR0aW5nIHN1Y2gKKyAqICBzZXF1ZW5jZSBzZXRzLgorICoKKyAqICBUaGUgYWxnb3JpdGhtIGRlc2NyaXB0aW9uIGNhbiBiZSBmb3VuZCBpbiAKKyAqCisgKiAgUC4gSi4gVmFybWFuLCBTLiBELiBTY2hldWZsZXIsIEIuIFIuIEl5ZXIsIGFuZCBHLiBSLiBSaWNhcmQuCisgKiAgTWVyZ2luZyBNdWx0aXBsZSBMaXN0cyBvbiBIaWVyYXJjaGljYWwtTWVtb3J5IE11bHRpcHJvY2Vzc29ycy4KKyAqICBKb3VybmFsIG9mIFBhcmFsbGVsIGFuZCBEaXN0cmlidXRlZCBDb21wdXRpbmcsIDEyKDIpOjE3MeKAkzE3NywgMTk5MS4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX01VTFRJU0VRX1NFTEVDVElPTl9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX01VTFRJU0VRX1NFTEVDVElPTl9IIDEKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxxdWV1ZT4KKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ28uaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgQ29tcGFyZSBfX2EgcGFpciBvZiB0eXBlcyBsZXhpY29ncmFwaGljYWxseSwgYXNjZW5kaW5nLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMiwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY2xhc3MgX0xleGljb2dyYXBoaWMKKyAgICA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxzdGQ6OnBhaXI8X1QxLCBfVDI+LAorCQkJCSAgc3RkOjpwYWlyPF9UMSwgX1QyPiwgYm9vbD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIF9Db21wYXJlJiBfTV9jb21wOworCisgICAgcHVibGljOgorICAgICAgX0xleGljb2dyYXBoaWMoX0NvbXBhcmUmIF9fY29tcCkgOiBfTV9jb21wKF9fY29tcCkgeyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpwYWlyPF9UMSwgX1QyPiYgX19wMSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPF9UMSwgX1QyPiYgX19wMikgY29uc3QKKyAgICAgIHsKKyAgICAgICAgaWYgKF9NX2NvbXAoX19wMS5maXJzdCwgX19wMi5maXJzdCkpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgaWYgKF9NX2NvbXAoX19wMi5maXJzdCwgX19wMS5maXJzdCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIEZpcnN0cyBhcmUgZXF1YWwuCisgICAgICAgIHJldHVybiBfX3AxLnNlY29uZCA8IF9fcDIuc2Vjb25kOworICAgICAgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBDb21wYXJlIF9fYSBwYWlyIG9mIHR5cGVzIGxleGljb2dyYXBoaWNhbGx5LCBkZXNjZW5kaW5nLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMiwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY2xhc3MgX0xleGljb2dyYXBoaWNSZXZlcnNlIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBib29sPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgX0NvbXBhcmUmIF9NX2NvbXA7CisKKyAgICBwdWJsaWM6CisgICAgICBfTGV4aWNvZ3JhcGhpY1JldmVyc2UoX0NvbXBhcmUmIF9fY29tcCkgOiBfTV9jb21wKF9fY29tcCkgeyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpwYWlyPF9UMSwgX1QyPiYgX19wMSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPF9UMSwgX1QyPiYgX19wMikgY29uc3QKKyAgICAgIHsKKyAgICAgICAgaWYgKF9NX2NvbXAoX19wMi5maXJzdCwgX19wMS5maXJzdCkpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgaWYgKF9NX2NvbXAoX19wMS5maXJzdCwgX19wMi5maXJzdCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIEZpcnN0cyBhcmUgZXF1YWwuCisgICAgICAgIHJldHVybiBfX3AyLnNlY29uZCA8IF9fcDEuc2Vjb25kOworICAgICAgfQorICAgIH07CisKKyAgLyoqIAorICAgKiAgQGJyaWVmIFNwbGl0cyBzZXZlcmFsIHNvcnRlZCBzZXF1ZW5jZXMgYXQgYSBjZXJ0YWluIGdsb2JhbCBfX3JhbmssCisgICAqICByZXN1bHRpbmcgaW4gYSBzcGxpdHRpbmcgcG9pbnQgZm9yIGVhY2ggc2VxdWVuY2UuCisgICAqICBUaGUgc2VxdWVuY2VzIGFyZSBwYXNzZWQgdmlhIGEgc2VxdWVuY2Ugb2YgcmFuZG9tLWFjY2VzcworICAgKiAgaXRlcmF0b3IgcGFpcnMsIG5vbmUgb2YgdGhlIHNlcXVlbmNlcyBtYXkgYmUgZW1wdHkuICBJZiB0aGVyZQorICAgKiAgYXJlIHNldmVyYWwgZXF1YWwgZWxlbWVudHMgYWNyb3NzIHRoZSBzcGxpdCwgdGhlIG9uZXMgb24gdGhlCisgICAqICBfX2xlZnQgc2lkZSB3aWxsIGJlIGNob3NlbiBmcm9tIHNlcXVlbmNlcyB3aXRoIHNtYWxsZXIgbnVtYmVyLgorICAgKiAgQHBhcmFtIF9fYmVnaW5fc2VxcyBCZWdpbiBvZiB0aGUgc2VxdWVuY2Ugb2YgaXRlcmF0b3IgcGFpcnMuCisgICAqICBAcGFyYW0gX19lbmRfc2VxcyBFbmQgb2YgdGhlIHNlcXVlbmNlIG9mIGl0ZXJhdG9yIHBhaXJzLgorICAgKiAgQHBhcmFtIF9fcmFuayBUaGUgZ2xvYmFsIHJhbmsgdG8gcGFydGl0aW9uIGF0LgorICAgKiAgQHBhcmFtIF9fYmVnaW5fb2Zmc2V0cyBBIHJhbmRvbS1hY2Nlc3MgX19zZXF1ZW5jZSBfX2JlZ2luIHdoZXJlIHRoZQorICAgKiAgX19yZXN1bHQgd2lsbCBiZSBzdG9yZWQgaW4uIEVhY2ggZWxlbWVudCBvZiB0aGUgc2VxdWVuY2UgaXMgYW4KKyAgICogIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9uIHRoZSBncmVhdGVyIHBhcnQgb2YKKyAgICogIHRoZSByZXNwZWN0aXZlIF9fc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19jb21wIFRoZSBvcmRlcmluZyBmdW5jdG9yLCBkZWZhdWx0cyB0byBzdGQ6Omxlc3M8X1RwPi4gCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuU2VxcywgdHlwZW5hbWUgX1JhbmtUeXBlLCB0eXBlbmFtZSBfUmFua0l0ZXJhdG9yLAorICAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIG11bHRpc2VxX3BhcnRpdGlvbihfUmFuU2VxcyBfX2JlZ2luX3NlcXMsIF9SYW5TZXFzIF9fZW5kX3NlcXMsCisgICAgICAgICAgICAgICAgICAgICAgIF9SYW5rVHlwZSBfX3JhbmssCisgICAgICAgICAgICAgICAgICAgICAgIF9SYW5rSXRlcmF0b3IgX19iZWdpbl9vZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXAgPSBzdGQ6Omxlc3M8CisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPHR5cGVuYW1lCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SYW5TZXFzPjo6dmFsdWVfdHlwZTo6CisgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3R5cGU+Ojp2YWx1ZV90eXBlPigpKSAvLyBzdGQ6Omxlc3M8X1RwPgorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19lbmRfc2VxcyAtIF9fYmVnaW5fc2VxcykKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUmFuU2Vxcz46OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUKKyAgICAgICAgX0l0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUmFuU2Vxcz46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgICBfU2VxTnVtYmVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXQ+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICAgICAgICAgICAgIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0Pjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworCisgICAgICBfTGV4aWNvZ3JhcGhpYzxfVmFsdWVUeXBlLCBfU2VxTnVtYmVyLCBfQ29tcGFyZT4gX19sY29tcChfX2NvbXApOworICAgICAgX0xleGljb2dyYXBoaWNSZXZlcnNlPF9WYWx1ZVR5cGUsIF9TZXFOdW1iZXIsIF9Db21wYXJlPiBfX2xyY29tcChfX2NvbXApOworCisgICAgICAvLyBOdW1iZXIgb2Ygc2VxdWVuY2VzLCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdG90YWwgKHBvc3NpYmx5CisgICAgICAvLyBpbmNsdWRpbmcgcGFkZGluZykuCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19tID0gc3RkOjpkaXN0YW5jZShfX2JlZ2luX3NlcXMsIF9fZW5kX3NlcXMpLCBfX25uID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICBfX25tYXgsIF9fbiwgX19yOworCisgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyBfX2krKykKKyAgICAgICAgeworICAgICAgICAgIF9fbm4gKz0gc3RkOjpkaXN0YW5jZShfX2JlZ2luX3NlcXNbX19pXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luX3NlcXNbX19pXS5zZWNvbmQpOworICAgICAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVCgKKyAgICAgICAgICAgIHN0ZDo6ZGlzdGFuY2UoX19iZWdpbl9zZXFzW19faV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmVnaW5fc2Vxc1tfX2ldLnNlY29uZCkgPiAwKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoX19yYW5rID09IF9fbm4pCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyBfX2krKykKKyAgICAgICAgICAgIF9fYmVnaW5fb2Zmc2V0c1tfX2ldID0gX19iZWdpbl9zZXFzW19faV0uc2Vjb25kOyAvLyBWZXJ5IGVuZC4KKyAgICAgICAgICAvLyBSZXR1cm4gX19tIC0gMTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9fbSAhPSAwKTsKKyAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX25uICE9IDApOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9fcmFuayA+PSAwKTsKKyAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX3JhbmsgPCBfX25uKTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlKiBfX25zID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX21dOworICAgICAgX0RpZmZlcmVuY2VUeXBlKiBfX2EgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbV07CisgICAgICBfRGlmZmVyZW5jZVR5cGUqIF9fYiA9IG5ldyBfRGlmZmVyZW5jZVR5cGVbX19tXTsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2w7CisKKyAgICAgIF9fbnNbMF0gPSBzdGQ6OmRpc3RhbmNlKF9fYmVnaW5fc2Vxc1swXS5maXJzdCwgX19iZWdpbl9zZXFzWzBdLnNlY29uZCk7CisgICAgICBfX25tYXggPSBfX25zWzBdOworICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspCisgICAgICAgIHsKKyAgICAgICAgICBfX25zW19faV0gPSBzdGQ6OmRpc3RhbmNlKF9fYmVnaW5fc2Vxc1tfX2ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbl9zZXFzW19faV0uc2Vjb25kKTsKKyAgICAgICAgICBfX25tYXggPSBzdGQ6Om1heChfX25tYXgsIF9fbnNbX19pXSk7CisgICAgICAgIH0KKworICAgICAgX19yID0gX19yZF9sb2cyKF9fbm1heCkgKyAxOworCisgICAgICAvLyBQYWQgYWxsIGxpc3RzIHRvIHRoaXMgbGVuZ3RoLCBhdCBsZWFzdCBhcyBsb25nIGFzIGFueSBuc1tfX2ldLAorICAgICAgLy8gZXF1YWxpdHkgaWZmIF9fbm1heCA9IDJeX19rIC0gMS4KKyAgICAgIF9fbCA9ICgxVUxMIDw8IF9fcikgLSAxOworCisgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyBfX2krKykKKyAgICAgICAgeworICAgICAgICAgIF9fYVtfX2ldID0gMDsKKyAgICAgICAgICBfX2JbX19pXSA9IF9fbDsKKyAgICAgICAgfQorICAgICAgX19uID0gX19sIC8gMjsKKworICAgICAgLy8gSW52YXJpYW50czoKKyAgICAgIC8vIDAgPD0gX19hW19faV0gPD0gX19uc1tfX2ldLCAwIDw9IF9fYltfX2ldIDw9IF9fbAorCisjZGVmaW5lIF9fUyhfX2kpIChfX2JlZ2luX3NlcXNbX19pXS5maXJzdCkKKworICAgICAgLy8gSW5pdGlhbCBwYXJ0aXRpb24uCisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8X1ZhbHVlVHlwZSwgX1NlcU51bWJlcj4gPiBfX3NhbXBsZTsKKworICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspCisgICAgICAgIGlmIChfX24gPCBfX25zW19faV0pICAgIC8vX19zZXF1ZW5jZSBsb25nIGVub3VnaAorICAgICAgICAgIF9fc2FtcGxlLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihfX1MoX19pKVtfX25dLCBfX2kpKTsKKyAgICAgIF9fZ251X3NlcXVlbnRpYWw6OnNvcnQoX19zYW1wbGUuYmVnaW4oKSwgX19zYW1wbGUuZW5kKCksIF9fbGNvbXApOworCisgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyBfX2krKykgICAgICAgLy9jb25jZXB0dWFsIGluZmluaXR5CisgICAgICAgIGlmIChfX24gPj0gX19uc1tfX2ldKSAgIC8vX19zZXF1ZW5jZSB0b28gc2hvcnQsIGNvbmNlcHR1YWwgaW5maW5pdHkKKyAgICAgICAgICBfX3NhbXBsZS5wdXNoX2JhY2soCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihfX1MoX19pKVswXSAvKl9fZHVtbXkgZWxlbWVudCovLCBfX2kpKTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbG9jYWxyYW5rID0gX19yYW5rIC8gX19sOworCisgICAgICBfU2VxTnVtYmVyIF9fajsKKyAgICAgIGZvciAoX19qID0gMDsKKyAgICAgICAgICAgX19qIDwgX19sb2NhbHJhbmsgJiYgKChfX24gKyAxKSA8PSBfX25zW19fc2FtcGxlW19fal0uc2Vjb25kXSk7CisgICAgICAgICAgICsrX19qKQorICAgICAgICBfX2FbX19zYW1wbGVbX19qXS5zZWNvbmRdICs9IF9fbiArIDE7CisgICAgICBmb3IgKDsgX19qIDwgX19tOyBfX2orKykKKyAgICAgICAgX19iW19fc2FtcGxlW19fal0uc2Vjb25kXSAtPSBfX24gKyAxOworICAgICAgCisgICAgICAvLyBGdXJ0aGVyIHJlZmluZW1lbnQuCisgICAgICB3aGlsZSAoX19uID4gMCkKKyAgICAgICAgeworICAgICAgICAgIF9fbiAvPSAyOworCisgICAgICAgICAgX1NlcU51bWJlciBfX2xtYXhfc2VxID0gLTE7ICAvLyB0byBhdm9pZCB3YXJuaW5nCisgICAgICAgICAgY29uc3QgX1ZhbHVlVHlwZSogX19sbWF4ID0gMDsgLy8gaW1wb3NzaWJsZSB0byBhdm9pZCB0aGUgd2FybmluZz8KKyAgICAgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyBfX2krKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKF9fYVtfX2ldID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoIV9fbG1heCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIF9fbG1heCA9ICYoX19TKF9faSlbX19hW19faV0gLSAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgX19sbWF4X3NlcSA9IF9faTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgLy8gTWF4LCBmYXZvciByZWFyIHNlcXVlbmNlcy4KKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9fY29tcChfX1MoX19pKVtfX2FbX19pXSAtIDFdLCAqX19sbWF4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19sbWF4ID0gJihfX1MoX19pKVtfX2FbX19pXSAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19sbWF4X3NlcSA9IF9faTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9TZXFOdW1iZXIgX19pOworICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19tOyBfX2krKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbWlkZGxlID0gKF9fYltfX2ldICsgX19hW19faV0pIC8gMjsKKyAgICAgICAgICAgICAgaWYgKF9fbG1heCAmJiBfX21pZGRsZSA8IF9fbnNbX19pXSAmJgorICAgICAgICAgICAgICAgICAgX19sY29tcChzdGQ6Om1ha2VfcGFpcihfX1MoX19pKVtfX21pZGRsZV0sIF9faSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigqX19sbWF4LCBfX2xtYXhfc2VxKSkpCisgICAgICAgICAgICAgICAgX19hW19faV0gPSBzdGQ6Om1pbihfX2FbX19pXSArIF9fbiArIDEsIF9fbnNbX19pXSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX2JbX19pXSAtPSBfX24gKyAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbGVmdHNpemUgPSAwOworICAgICAgICAgIGZvciAoX1NlcU51bWJlciBfX2kgPSAwOyBfX2kgPCBfX207IF9faSsrKQorICAgICAgICAgICAgICBfX2xlZnRzaXplICs9IF9fYVtfX2ldIC8gKF9fbiArIDEpOworCisgICAgICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fc2tldyA9IF9fcmFuayAvIChfX24gKyAxKSAtIF9fbGVmdHNpemU7CisKKyAgICAgICAgICBpZiAoX19za2V3ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgbGVmdCwgZmluZCBzbWFsbGVzdC4KKyAgICAgICAgICAgICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxzdGQ6OnBhaXI8X1ZhbHVlVHlwZSwgX1NlcU51bWJlcj4sCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPF9WYWx1ZVR5cGUsIF9TZXFOdW1iZXI+ID4sCisgICAgICAgICAgICAgICAgX0xleGljb2dyYXBoaWNSZXZlcnNlPF9WYWx1ZVR5cGUsIF9TZXFOdW1iZXIsIF9Db21wYXJlPiA+CisgICAgICAgICAgICAgICAgX19wcShfX2xyY29tcCk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyBfX2krKykKKyAgICAgICAgICAgICAgICBpZiAoX19iW19faV0gPCBfX25zW19faV0pCisgICAgICAgICAgICAgICAgICBfX3BxLnB1c2goc3RkOjptYWtlX3BhaXIoX19TKF9faSlbX19iW19faV1dLCBfX2kpKTsKKworICAgICAgICAgICAgICBmb3IgKDsgX19za2V3ICE9IDAgJiYgIV9fcHEuZW1wdHkoKTsgLS1fX3NrZXcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX1NlcU51bWJlciBfX3NvdXJjZSA9IF9fcHEudG9wKCkuc2Vjb25kOworICAgICAgICAgICAgICAgICAgX19wcS5wb3AoKTsKKworICAgICAgICAgICAgICAgICAgX19hW19fc291cmNlXQorICAgICAgICAgICAgICAgICAgICAgID0gc3RkOjptaW4oX19hW19fc291cmNlXSArIF9fbiArIDEsIF9fbnNbX19zb3VyY2VdKTsKKyAgICAgICAgICAgICAgICAgIF9fYltfX3NvdXJjZV0gKz0gX19uICsgMTsKKworICAgICAgICAgICAgICAgICAgaWYgKF9fYltfX3NvdXJjZV0gPCBfX25zW19fc291cmNlXSkKKyAgICAgICAgICAgICAgICAgICAgX19wcS5wdXNoKAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKF9fUyhfX3NvdXJjZSlbX19iW19fc291cmNlXV0sIF9fc291cmNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKF9fc2tldyA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIE1vdmUgdG8gdGhlIHJpZ2h0LCBmaW5kIGdyZWF0ZXN0LgorICAgICAgICAgICAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPHN0ZDo6cGFpcjxfVmFsdWVUeXBlLCBfU2VxTnVtYmVyPiwKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8X1ZhbHVlVHlwZSwgX1NlcU51bWJlcj4gPiwKKyAgICAgICAgICAgICAgICBfTGV4aWNvZ3JhcGhpYzxfVmFsdWVUeXBlLCBfU2VxTnVtYmVyLCBfQ29tcGFyZT4gPgorICAgICAgICAgICAgICAgICAgX19wcShfX2xjb21wKTsKKworICAgICAgICAgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyBfX2krKykKKyAgICAgICAgICAgICAgICBpZiAoX19hW19faV0gPiAwKQorICAgICAgICAgICAgICAgICAgX19wcS5wdXNoKHN0ZDo6bWFrZV9wYWlyKF9fUyhfX2kpW19fYVtfX2ldIC0gMV0sIF9faSkpOworCisgICAgICAgICAgICAgIGZvciAoOyBfX3NrZXcgIT0gMDsgKytfX3NrZXcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX1NlcU51bWJlciBfX3NvdXJjZSA9IF9fcHEudG9wKCkuc2Vjb25kOworICAgICAgICAgICAgICAgICAgX19wcS5wb3AoKTsKKworICAgICAgICAgICAgICAgICAgX19hW19fc291cmNlXSAtPSBfX24gKyAxOworICAgICAgICAgICAgICAgICAgX19iW19fc291cmNlXSAtPSBfX24gKyAxOworCisgICAgICAgICAgICAgICAgICBpZiAoX19hW19fc291cmNlXSA+IDApCisgICAgICAgICAgICAgICAgICAgIF9fcHEucHVzaChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fUyhfX3NvdXJjZSlbX19hW19fc291cmNlXSAtIDFdLCBfX3NvdXJjZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvLyBQb3N0Y29uZGl0aW9uczoKKyAgICAgIC8vIF9fYVtfX2ldID09IF9fYltfX2ldIGluIG1vc3QgY2FzZXMsIGV4Y2VwdCB3aGVuIF9fYVtfX2ldIGhhcyBiZWVuCisgICAgICAvLyBjbGFtcGVkIGJlY2F1c2Ugb2YgaGF2aW5nIHJlYWNoZWQgdGhlIGJvdW5kYXJ5CisKKyAgICAgIC8vIE5vdyByZXR1cm4gdGhlIHJlc3VsdCwgY2FsY3VsYXRlIHRoZSBvZmZzZXQuCisKKyAgICAgIC8vIENvbXBhcmUgdGhlIGtleXMgb24gYm90aCBlZGdlcyBvZiB0aGUgYm9yZGVyLgorCisgICAgICAvLyBNYXhpbXVtIG9mIGxlZnQgZWRnZSwgbWluaW11bSBvZiByaWdodCBlZGdlLgorICAgICAgX1ZhbHVlVHlwZSogX19tYXhsZWZ0ID0gMDsKKyAgICAgIF9WYWx1ZVR5cGUqIF9fbWlucmlnaHQgPSAwOworICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX19hW19faV0gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9fbWF4bGVmdCkKKyAgICAgICAgICAgICAgICBfX21heGxlZnQgPSAmKF9fUyhfX2kpW19fYVtfX2ldIC0gMV0pOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLy8gTWF4LCBmYXZvciByZWFyIHNlcXVlbmNlcy4KKyAgICAgICAgICAgICAgICAgIGlmICghX19jb21wKF9fUyhfX2kpW19fYVtfX2ldIC0gMV0sICpfX21heGxlZnQpKQorICAgICAgICAgICAgICAgICAgICBfX21heGxlZnQgPSAmKF9fUyhfX2kpW19fYVtfX2ldIC0gMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoX19iW19faV0gPCBfX25zW19faV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX19taW5yaWdodCkKKyAgICAgICAgICAgICAgICBfX21pbnJpZ2h0ID0gJihfX1MoX19pKVtfX2JbX19pXV0pOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLy8gTWluLCBmYXZvciBmb3JlIHNlcXVlbmNlcy4KKyAgICAgICAgICAgICAgICAgIGlmIChfX2NvbXAoX19TKF9faSlbX19iW19faV1dLCAqX19taW5yaWdodCkpCisgICAgICAgICAgICAgICAgICAgIF9fbWlucmlnaHQgPSAmKF9fUyhfX2kpW19fYltfX2ldXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIF9TZXFOdW1iZXIgX19zZXEgPSAwOworICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspCisgICAgICAgIF9fYmVnaW5fb2Zmc2V0c1tfX2ldID0gX19TKF9faSkgKyBfX2FbX19pXTsKKworICAgICAgZGVsZXRlW10gX19uczsKKyAgICAgIGRlbGV0ZVtdIF9fYTsKKyAgICAgIGRlbGV0ZVtdIF9fYjsKKyAgICB9CisKKworICAvKiogCisgICAqICBAYnJpZWYgU2VsZWN0cyB0aGUgZWxlbWVudCBhdCBhIGNlcnRhaW4gZ2xvYmFsIF9fcmFuayBmcm9tIHNldmVyYWwKKyAgICogIHNvcnRlZCBzZXF1ZW5jZXMuCisgICAqCisgICAqICBUaGUgc2VxdWVuY2VzIGFyZSBwYXNzZWQgdmlhIGEgc2VxdWVuY2Ugb2YgcmFuZG9tLWFjY2VzcworICAgKiAgaXRlcmF0b3IgcGFpcnMsIG5vbmUgb2YgdGhlIHNlcXVlbmNlcyBtYXkgYmUgZW1wdHkuCisgICAqICBAcGFyYW0gX19iZWdpbl9zZXFzIEJlZ2luIG9mIHRoZSBzZXF1ZW5jZSBvZiBpdGVyYXRvciBwYWlycy4KKyAgICogIEBwYXJhbSBfX2VuZF9zZXFzIEVuZCBvZiB0aGUgc2VxdWVuY2Ugb2YgaXRlcmF0b3IgcGFpcnMuCisgICAqICBAcGFyYW0gX19yYW5rIFRoZSBnbG9iYWwgcmFuayB0byBwYXJ0aXRpb24gYXQuCisgICAqICBAcGFyYW0gX19vZmZzZXQgVGhlIHJhbmsgb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaW4gdGhlIGdsb2JhbAorICAgKiAgc3Vic2VxdWVuY2Ugb2YgZWxlbWVudHMgZXF1YWwgdG8gdGhlIHNlbGVjdGVkIGVsZW1lbnQuIElmIHRoZQorICAgKiAgc2VsZWN0ZWQgZWxlbWVudCBpcyB1bmlxdWUsIHRoaXMgbnVtYmVyIGlzIDAuCisgICAqICBAcGFyYW0gX19jb21wIFRoZSBvcmRlcmluZyBmdW5jdG9yLCBkZWZhdWx0cyB0byBzdGQ6Omxlc3MuIAorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmFuU2VxcywgdHlwZW5hbWUgX1JhbmtUeXBlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfVHAKKyAgICBtdWx0aXNlcV9zZWxlY3Rpb24oX1JhblNlcXMgX19iZWdpbl9zZXFzLCBfUmFuU2VxcyBfX2VuZF9zZXFzLAorICAgICAgICAgICAgICAgICAgICAgICBfUmFua1R5cGUgX19yYW5rLAorICAgICAgICAgICAgICAgICAgICAgICBfUmFua1R5cGUmIF9fb2Zmc2V0LCBfQ29tcGFyZSBfX2NvbXAgPSBzdGQ6Omxlc3M8X1RwPigpKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19lbmRfc2VxcyAtIF9fYmVnaW5fc2VxcykKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUmFuU2Vxcz46OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUKKyAgICAgICAgX0l0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUmFuU2Vxcz46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgICBfU2VxTnVtYmVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXQ+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICAgICAgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfTGV4aWNvZ3JhcGhpYzxfVHAsIF9TZXFOdW1iZXIsIF9Db21wYXJlPiBfX2xjb21wKF9fY29tcCk7CisgICAgICBfTGV4aWNvZ3JhcGhpY1JldmVyc2U8X1RwLCBfU2VxTnVtYmVyLCBfQ29tcGFyZT4gX19scmNvbXAoX19jb21wKTsKKworICAgICAgLy8gTnVtYmVyIG9mIHNlcXVlbmNlcywgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRvdGFsIChwb3NzaWJseQorICAgICAgLy8gaW5jbHVkaW5nIHBhZGRpbmcpLgorICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbSA9IHN0ZDo6ZGlzdGFuY2UoX19iZWdpbl9zZXFzLCBfX2VuZF9zZXFzKTsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX25uID0gMDsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX25tYXgsIF9fbiwgX19yOworCisgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyBfX2krKykKKyAgICAgICAgX19ubiArPSBzdGQ6OmRpc3RhbmNlKF9fYmVnaW5fc2Vxc1tfX2ldLmZpcnN0LAorCQkJICAgICAgX19iZWdpbl9zZXFzW19faV0uc2Vjb25kKTsKKworICAgICAgaWYgKF9fbSA9PSAwIHx8IF9fbm4gPT0gMCB8fCBfX3JhbmsgPCAwIHx8IF9fcmFuayA+PSBfX25uKQorICAgICAgICB7CisgICAgICAgICAgLy8gcmVzdWx0IHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBubyBkYXRhIG9yIF9fcmFuayBpcyBvdXRzaWRlIGJvdW5kcworICAgICAgICAgIHRocm93IHN0ZDo6ZXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworCisgICAgICBfRGlmZmVyZW5jZVR5cGUqIF9fbnMgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbV07CisgICAgICBfRGlmZmVyZW5jZVR5cGUqIF9fYSA9IG5ldyBfRGlmZmVyZW5jZVR5cGVbX19tXTsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSogX19iID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX21dOworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbDsKKworICAgICAgX19uc1swXSA9IHN0ZDo6ZGlzdGFuY2UoX19iZWdpbl9zZXFzWzBdLmZpcnN0LCBfX2JlZ2luX3NlcXNbMF0uc2Vjb25kKTsKKyAgICAgIF9fbm1heCA9IF9fbnNbMF07CisgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fbnNbX19pXSA9IHN0ZDo6ZGlzdGFuY2UoX19iZWdpbl9zZXFzW19faV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luX3NlcXNbX19pXS5zZWNvbmQpOworICAgICAgICAgIF9fbm1heCA9IHN0ZDo6bWF4KF9fbm1heCwgX19uc1tfX2ldKTsKKyAgICAgICAgfQorCisgICAgICBfX3IgPSBfX3JkX2xvZzIoX19ubWF4KSArIDE7CisKKyAgICAgIC8vIFBhZCBhbGwgbGlzdHMgdG8gdGhpcyBsZW5ndGgsIGF0IGxlYXN0IGFzIGxvbmcgYXMgYW55IG5zW19faV0sCisgICAgICAvLyBlcXVhbGl0eSBpZmYgX19ubWF4ID0gMl5fX2sgLSAxCisgICAgICBfX2wgPSBfX3JvdW5kX3VwX3RvX3BvdzIoX19yKSAtIDE7CisKKyAgICAgIGZvciAoX1NlcU51bWJlciBfX2kgPSAwOyBfX2kgPCBfX207ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX19hW19faV0gPSAwOworICAgICAgICAgIF9fYltfX2ldID0gX19sOworICAgICAgICB9CisgICAgICBfX24gPSBfX2wgLyAyOworCisgICAgICAvLyBJbnZhcmlhbnRzOgorICAgICAgLy8gMCA8PSBfX2FbX19pXSA8PSBfX25zW19faV0sIDAgPD0gX19iW19faV0gPD0gX19sCisKKyNkZWZpbmUgX19TKF9faSkgKF9fYmVnaW5fc2Vxc1tfX2ldLmZpcnN0KQorCisgICAgICAvLyBJbml0aWFsIHBhcnRpdGlvbi4KKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxfVHAsIF9TZXFOdW1iZXI+ID4gX19zYW1wbGU7CisKKyAgICAgIGZvciAoX1NlcU51bWJlciBfX2kgPSAwOyBfX2kgPCBfX207IF9faSsrKQorICAgICAgICBpZiAoX19uIDwgX19uc1tfX2ldKQorICAgICAgICAgIF9fc2FtcGxlLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihfX1MoX19pKVtfX25dLCBfX2kpKTsKKyAgICAgIF9fZ251X3NlcXVlbnRpYWw6OnNvcnQoX19zYW1wbGUuYmVnaW4oKSwgX19zYW1wbGUuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGNvbXAsIHNlcXVlbnRpYWxfdGFnKCkpOworCisgICAgICAvLyBDb25jZXB0dWFsIGluZmluaXR5LgorICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspCisgICAgICAgIGlmIChfX24gPj0gX19uc1tfX2ldKQorICAgICAgICAgIF9fc2FtcGxlLnB1c2hfYmFjaygKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKF9fUyhfX2kpWzBdIC8qX19kdW1teSBlbGVtZW50Ki8sIF9faSkpOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19sb2NhbHJhbmsgPSBfX3JhbmsgLyBfX2w7CisKKyAgICAgIF9TZXFOdW1iZXIgX19qOworICAgICAgZm9yIChfX2ogPSAwOworICAgICAgICAgICBfX2ogPCBfX2xvY2FscmFuayAmJiAoKF9fbiArIDEpIDw9IF9fbnNbX19zYW1wbGVbX19qXS5zZWNvbmRdKTsKKyAgICAgICAgICAgKytfX2opCisgICAgICAgIF9fYVtfX3NhbXBsZVtfX2pdLnNlY29uZF0gKz0gX19uICsgMTsKKyAgICAgIGZvciAoOyBfX2ogPCBfX207ICsrX19qKQorICAgICAgICBfX2JbX19zYW1wbGVbX19qXS5zZWNvbmRdIC09IF9fbiArIDE7CisKKyAgICAgIC8vIEZ1cnRoZXIgcmVmaW5lbWVudC4KKyAgICAgIHdoaWxlIChfX24gPiAwKQorICAgICAgICB7CisgICAgICAgICAgX19uIC89IDI7CisKKyAgICAgICAgICBjb25zdCBfVHAqIF9fbG1heCA9IDA7CisgICAgICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgKytfX2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChfX2FbX19pXSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKCFfX2xtYXgpCisgICAgICAgICAgICAgICAgICAgIF9fbG1heCA9ICYoX19TKF9faSlbX19hW19faV0gLSAxXSk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoX19jb21wKCpfX2xtYXgsIF9fUyhfX2kpW19fYVtfX2ldIC0gMV0pKSAgICAgIC8vbWF4CisgICAgICAgICAgICAgICAgICAgICAgICBfX2xtYXggPSAmKF9fUyhfX2kpW19fYVtfX2ldIC0gMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgX1NlcU51bWJlciBfX2k7CisgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX207IF9faSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfRGlmZmVyZW5jZVR5cGUgX19taWRkbGUgPSAoX19iW19faV0gKyBfX2FbX19pXSkgLyAyOworICAgICAgICAgICAgICBpZiAoX19sbWF4ICYmIF9fbWlkZGxlIDwgX19uc1tfX2ldCisgICAgICAgICAgICAgICAgICAmJiBfX2NvbXAoX19TKF9faSlbX19taWRkbGVdLCAqX19sbWF4KSkKKyAgICAgICAgICAgICAgICBfX2FbX19pXSA9IHN0ZDo6bWluKF9fYVtfX2ldICsgX19uICsgMSwgX19uc1tfX2ldKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9fYltfX2ldIC09IF9fbiArIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfRGlmZmVyZW5jZVR5cGUgX19sZWZ0c2l6ZSA9IDA7CisgICAgICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgKytfX2kpCisgICAgICAgICAgICAgIF9fbGVmdHNpemUgKz0gX19hW19faV0gLyAoX19uICsgMSk7CisKKyAgICAgICAgICBfRGlmZmVyZW5jZVR5cGUgX19za2V3ID0gX19yYW5rIC8gKF9fbiArIDEpIC0gX19sZWZ0c2l6ZTsKKworICAgICAgICAgIGlmIChfX3NrZXcgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBsZWZ0LCBmaW5kIHNtYWxsZXN0LgorICAgICAgICAgICAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPHN0ZDo6cGFpcjxfVHAsIF9TZXFOdW1iZXI+LAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxfVHAsIF9TZXFOdW1iZXI+ID4sCisgICAgICAgICAgICAgICAgX0xleGljb2dyYXBoaWNSZXZlcnNlPF9UcCwgX1NlcU51bWJlciwgX0NvbXBhcmU+ID4KKyAgICAgICAgICAgICAgICAgIF9fcHEoX19scmNvbXApOworCisgICAgICAgICAgICAgIGZvciAoX1NlcU51bWJlciBfX2kgPSAwOyBfX2kgPCBfX207ICsrX19pKQorICAgICAgICAgICAgICAgIGlmIChfX2JbX19pXSA8IF9fbnNbX19pXSkKKyAgICAgICAgICAgICAgICAgIF9fcHEucHVzaChzdGQ6Om1ha2VfcGFpcihfX1MoX19pKVtfX2JbX19pXV0sIF9faSkpOworCisgICAgICAgICAgICAgIGZvciAoOyBfX3NrZXcgIT0gMCAmJiAhX19wcS5lbXB0eSgpOyAtLV9fc2tldykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfU2VxTnVtYmVyIF9fc291cmNlID0gX19wcS50b3AoKS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICBfX3BxLnBvcCgpOworCisgICAgICAgICAgICAgICAgICBfX2FbX19zb3VyY2VdCisgICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6Om1pbihfX2FbX19zb3VyY2VdICsgX19uICsgMSwgX19uc1tfX3NvdXJjZV0pOworICAgICAgICAgICAgICAgICAgX19iW19fc291cmNlXSArPSBfX24gKyAxOworCisgICAgICAgICAgICAgICAgICBpZiAoX19iW19fc291cmNlXSA8IF9fbnNbX19zb3VyY2VdKQorICAgICAgICAgICAgICAgICAgICBfX3BxLnB1c2goCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoX19TKF9fc291cmNlKVtfX2JbX19zb3VyY2VdXSwgX19zb3VyY2UpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoX19za2V3IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgcmlnaHQsIGZpbmQgZ3JlYXRlc3QuCisgICAgICAgICAgICAgIHN0ZDo6cHJpb3JpdHlfcXVldWU8c3RkOjpwYWlyPF9UcCwgX1NlcU51bWJlcj4sCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPF9UcCwgX1NlcU51bWJlcj4gPiwKKyAgICAgICAgICAgICAgICBfTGV4aWNvZ3JhcGhpYzxfVHAsIF9TZXFOdW1iZXIsIF9Db21wYXJlPiA+IF9fcHEoX19sY29tcCk7CisKKyAgICAgICAgICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgKytfX2kpCisgICAgICAgICAgICAgICAgaWYgKF9fYVtfX2ldID4gMCkKKyAgICAgICAgICAgICAgICAgIF9fcHEucHVzaChzdGQ6Om1ha2VfcGFpcihfX1MoX19pKVtfX2FbX19pXSAtIDFdLCBfX2kpKTsKKworICAgICAgICAgICAgICBmb3IgKDsgX19za2V3ICE9IDA7ICsrX19za2V3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9TZXFOdW1iZXIgX19zb3VyY2UgPSBfX3BxLnRvcCgpLnNlY29uZDsKKyAgICAgICAgICAgICAgICAgIF9fcHEucG9wKCk7CisKKyAgICAgICAgICAgICAgICAgIF9fYVtfX3NvdXJjZV0gLT0gX19uICsgMTsKKyAgICAgICAgICAgICAgICAgIF9fYltfX3NvdXJjZV0gLT0gX19uICsgMTsKKworICAgICAgICAgICAgICAgICAgaWYgKF9fYVtfX3NvdXJjZV0gPiAwKQorICAgICAgICAgICAgICAgICAgICBfX3BxLnB1c2goc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICBfX1MoX19zb3VyY2UpW19fYVtfX3NvdXJjZV0gLSAxXSwgX19zb3VyY2UpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLy8gUG9zdGNvbmRpdGlvbnM6CisgICAgICAvLyBfX2FbX19pXSA9PSBfX2JbX19pXSBpbiBtb3N0IGNhc2VzLCBleGNlcHQgd2hlbiBfX2FbX19pXSBoYXMgYmVlbgorICAgICAgLy8gY2xhbXBlZCBiZWNhdXNlIG9mIGhhdmluZyByZWFjaGVkIHRoZSBib3VuZGFyeQorCisgICAgICAvLyBOb3cgcmV0dXJuIHRoZSByZXN1bHQsIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0LgorCisgICAgICAvLyBDb21wYXJlIHRoZSBrZXlzIG9uIGJvdGggZWRnZXMgb2YgdGhlIGJvcmRlci4KKworICAgICAgLy8gTWF4aW11bSBvZiBsZWZ0IGVkZ2UsIG1pbmltdW0gb2YgcmlnaHQgZWRnZS4KKyAgICAgIGJvb2wgX19tYXhsZWZ0c2V0ID0gZmFsc2UsIF9fbWlucmlnaHRzZXQgPSBmYWxzZTsKKworICAgICAgLy8gSW1wb3NzaWJsZSB0byBhdm9pZCB0aGUgd2FybmluZz8KKyAgICAgIF9UcCBfX21heGxlZnQsIF9fbWlucmlnaHQ7CisgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChfX2FbX19pXSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX19tYXhsZWZ0c2V0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fbWF4bGVmdCA9IF9fUyhfX2kpW19fYVtfX2ldIC0gMV07CisgICAgICAgICAgICAgICAgICBfX21heGxlZnRzZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8vIE1heC4KKyAgICAgICAgICAgICAgICAgIGlmIChfX2NvbXAoX19tYXhsZWZ0LCBfX1MoX19pKVtfX2FbX19pXSAtIDFdKSkKKyAgICAgICAgICAgICAgICAgICAgX19tYXhsZWZ0ID0gX19TKF9faSlbX19hW19faV0gLSAxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKF9fYltfX2ldIDwgX19uc1tfX2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9fbWlucmlnaHRzZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX19taW5yaWdodCA9IF9fUyhfX2kpW19fYltfX2ldXTsKKyAgICAgICAgICAgICAgICAgIF9fbWlucmlnaHRzZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8vIE1pbi4KKyAgICAgICAgICAgICAgICAgIGlmIChfX2NvbXAoX19TKF9faSlbX19iW19faV1dLCBfX21pbnJpZ2h0KSkKKyAgICAgICAgICAgICAgICAgICAgX19taW5yaWdodCA9IF9fUyhfX2kpW19fYltfX2ldXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIE1pbnJpZ2h0IGlzIHRoZSBfX3NwbGl0dGVyLCBpbiBhbnkgY2FzZS4KKworICAgICAgaWYgKCFfX21heGxlZnRzZXQgfHwgX19jb21wKF9fbWlucmlnaHQsIF9fbWF4bGVmdCkpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBHb29kIGx1Y2ssIGV2ZXJ5dGhpbmcgaXMgc3BsaXQgdW5hbWJpZ3VvdXNseS4KKyAgICAgICAgICBfX29mZnNldCA9IDA7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vIFdlIGhhdmUgdG8gY2FsY3VsYXRlIGFuIG9mZnNldC4KKyAgICAgICAgICBfX29mZnNldCA9IDA7CisKKyAgICAgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyArK19faSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RpZmZlcmVuY2VUeXBlIGxiCisgICAgICAgICAgICAgICAgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fUyhfX2kpLCBfX1MoX19pKSArIF9fbnNbX19pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19taW5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKSAtIF9fUyhfX2kpOworICAgICAgICAgICAgICBfX29mZnNldCArPSBfX2FbX19pXSAtIGxiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGRlbGV0ZVtdIF9fbnM7CisgICAgICBkZWxldGVbXSBfX2E7CisgICAgICBkZWxldGVbXSBfX2I7CisKKyAgICAgIHJldHVybiBfX21pbnJpZ2h0OworICAgIH0KK30KKworI3VuZGVmIF9fUworCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfTVVMVElTRVFfU0VMRUNUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbXVsdGl3YXlfbWVyZ2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbXVsdGl3YXlfbWVyZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWJiOTk0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9tdWx0aXdheV9tZXJnZS5oCkBAIC0wLDAgKzEsMjA3MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL211bHRpd2F5X21lcmdlLmgKKyogIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBzZXF1ZW50aWFsIGFuZCBwYXJhbGxlbCBtdWx0aXdheSBtZXJnZS4KKyoKKyogIEV4cGxhbmF0aW9ucyBvbiB0aGUgaGlnaC1zcGVlZCBtZXJnaW5nIHJvdXRpbmVzIGluIHRoZSBhcHBlbmRpeCBvZgorKgorKiAgUC4gU2FuZGVycy4KKyogIEZhc3QgcHJpb3JpdHkgcXVldWVzIGZvciBjYWNoZWQgbWVtb3J5LgorKiAgQUNNIEpvdXJuYWwgb2YgRXhwZXJpbWVudGFsIEFsZ29yaXRobWljcywgNSwgMjAwMC4KKyoKKyogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyIGFuZCBNYW51ZWwgSG9sdGdyZXdlLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX01VTFRJV0FZX01FUkdFX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfTVVMVElXQVlfTUVSR0VfSAorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnby5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvcGFyYWxsZWwuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9sb3NlcnRyZWUuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9tdWx0aXNlcV9zZWxlY3Rpb24uaD4KKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisjaW5jbHVkZSA8cGFyYWxsZWwvY2hlY2tlcnMuaD4KKyNlbmRpZgorCisvKiogQGJyaWVmIExlbmd0aCBvZiBhIHNlcXVlbmNlIGRlc2NyaWJlZCBieSBhIHBhaXIgb2YgaXRlcmF0b3JzLiAqLworI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9MRU5HVEgoX19zKSAoKF9fcykuc2Vjb25kIC0gKF9fcykuZmlyc3QpCisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX21lcmdlX2FkdmFuY2UoX1JBSXRlcjEmLCBfUkFJdGVyMSwgX1JBSXRlcjImLCBfUkFJdGVyMiwKKwkJICAgIF9PdXRwdXRJdGVyYXRvciwgX0RpZmZlcmVuY2VUcCwgX0NvbXBhcmUpOworCisgIC8qKiBAYnJpZWYgX0l0ZXJhdG9yIHdyYXBwZXIgc3VwcG9ydGluZyBhbiBpbXBsaWNpdCBzdXByZW11bSBhdCB0aGUgZW5kCisgICAqICAgICAgICAgb2YgdGhlIHNlcXVlbmNlLCBkb21pbmF0aW5nIGFsbCBjb21wYXJpc29ucy4KKyAgICoKKyAgICogVGhlIGltcGxpY2l0IHN1cHJlbXVtIGNvbWVzIHdpdGggYSBwZXJmb3JtYW5jZSBjb3N0LgorICAgKgorICAgKiBEZXJpdmluZyBmcm9tIF9SQUl0ZXIgaXMgbm90IHBvc3NpYmxlIHNpbmNlCisgICAqIF9SQUl0ZXIgbmVlZCBub3QgYmUgYSBjbGFzcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNsYXNzIF9HdWFyZGVkSXRlcmF0b3IKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIC8qKiBAYnJpZWYgQ3VycmVudCBpdGVyYXRvciBfX3Bvc2l0aW9uLiAqLworICAgICAgX1JBSXRlciBfTV9jdXJyZW50OworCisgICAgICAvKiogQGJyaWVmIEVuZCBpdGVyYXRvciBvZiB0aGUgc2VxdWVuY2UuICovCisgICAgICBfUkFJdGVyIF9NX2VuZDsKKworICAgICAgLyoqIEBicmllZiBfQ29tcGFyZS4gKi8KKyAgICAgIF9Db21wYXJlJiBfX2NvbXA7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogQGJyaWVmIENvbnN0cnVjdG9yLiBTZXRzIGl0ZXJhdG9yIHRvIGJlZ2lubmluZyBvZiBzZXF1ZW5jZS4KKyAgICAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIHNlcXVlbmNlLgorICAgICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBzZXF1ZW5jZS4KKyAgICAgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvciBwcm92aWRlZCBmb3IgYXNzb2NpYXRlZCBvdmVybG9hZGVkCisgICAgICAqICBjb21wYXJlIG9wZXJhdG9ycy4gKi8KKyAgICAgIF9HdWFyZGVkSXRlcmF0b3IoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLCBfQ29tcGFyZSYgX19jb21wKQorICAgICAgOiBfTV9jdXJyZW50KF9fYmVnaW4pLCBfTV9lbmQoX19lbmQpLCBfX2NvbXAoX19jb21wKQorICAgICAgeyB9CisKKyAgICAgIC8qKiBAYnJpZWYgUHJlLWluY3JlbWVudCBvcGVyYXRvci4KKyAgICAgICogIEByZXR1cm4gVGhpcy4gKi8KKyAgICAgIF9HdWFyZGVkSXRlcmF0b3I8X1JBSXRlciwgX0NvbXBhcmU+JgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJKytfTV9jdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqIEBicmllZiBEZXJlZmVyZW5jZSBvcGVyYXRvci4KKyAgICAgICogIEByZXR1cm4gUmVmZXJlbmNlZCBlbGVtZW50LiAqLworICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj46OnZhbHVlX3R5cGUmCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKl9NX2N1cnJlbnQ7IH0KKworICAgICAgLyoqIEBicmllZiBDb252ZXJ0IHRvIHdyYXBwZWQgaXRlcmF0b3IuCisgICAgICAqICBAcmV0dXJuIFdyYXBwZWQgaXRlcmF0b3IuICovCisgICAgICBvcGVyYXRvciBfUkFJdGVyKCkKKyAgICAgIHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgLyoqIEBicmllZiBDb21wYXJlIHR3byBlbGVtZW50cyByZWZlcmVuY2VkIGJ5IGd1YXJkZWQgaXRlcmF0b3JzLgorICAgICAgICogIEBwYXJhbSBfX2JpMSBGaXJzdCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gX19iaTIgU2Vjb25kIGl0ZXJhdG9yLgorICAgICAgICogIEByZXR1cm4gQGMgdHJ1ZSBpZiBsZXNzLiAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPChfR3VhcmRlZEl0ZXJhdG9yPF9SQUl0ZXIsIF9Db21wYXJlPiYgX19iaTEsCisJCV9HdWFyZGVkSXRlcmF0b3I8X1JBSXRlciwgX0NvbXBhcmU+JiBfX2JpMikKKyAgICAgIHsKKwlpZiAoX19iaTEuX01fY3VycmVudCA9PSBfX2JpMS5fTV9lbmQpICAgICAgIC8vIF9fYmkxIGlzIHN1cAorCSAgcmV0dXJuIF9fYmkyLl9NX2N1cnJlbnQgPT0gX19iaTIuX01fZW5kOyAgLy8gX19iaTIgaXMgbm90IHN1cAorCWlmIChfX2JpMi5fTV9jdXJyZW50ID09IF9fYmkyLl9NX2VuZCkgICAgICAgLy8gX19iaTIgaXMgc3VwCisJICByZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gKF9fYmkxLl9fY29tcCkoKl9fYmkxLCAqX19iaTIpOyAgICAgIC8vIG5vcm1hbCBjb21wYXJlCisgICAgICB9CisKKyAgICAgIC8qKiBAYnJpZWYgQ29tcGFyZSB0d28gZWxlbWVudHMgcmVmZXJlbmNlZCBieSBndWFyZGVkIGl0ZXJhdG9ycy4KKyAgICAgICAqICBAcGFyYW0gX19iaTEgRmlyc3QgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fYmkyIFNlY29uZCBpdGVyYXRvci4KKyAgICAgICAqICBAcmV0dXJuIEBjIFRydWUgaWYgbGVzcyBlcXVhbC4gKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcjw9KF9HdWFyZGVkSXRlcmF0b3I8X1JBSXRlciwgX0NvbXBhcmU+JiBfX2JpMSwKKwkJIF9HdWFyZGVkSXRlcmF0b3I8X1JBSXRlciwgX0NvbXBhcmU+JiBfX2JpMikKKyAgICAgIHsKKwlpZiAoX19iaTIuX01fY3VycmVudCA9PSBfX2JpMi5fTV9lbmQpICAgICAgIC8vIF9fYmkxIGlzIHN1cAorCSAgcmV0dXJuIF9fYmkxLl9NX2N1cnJlbnQgIT0gX19iaTEuX01fZW5kOyAgLy8gX19iaTIgaXMgbm90IHN1cAorCWlmIChfX2JpMS5fTV9jdXJyZW50ID09IF9fYmkxLl9NX2VuZCkgICAgICAgLy8gX19iaTIgaXMgc3VwCisJICByZXR1cm4gZmFsc2U7CisJcmV0dXJuICEoX19iaTEuX19jb21wKSgqX19iaTIsICpfX2JpMSk7ICAgICAvLyBub3JtYWwgY29tcGFyZQorICAgICAgfSAKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNsYXNzIF9Vbmd1YXJkZWRJdGVyYXRvcgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgLyoqIEBicmllZiBDdXJyZW50IGl0ZXJhdG9yIF9fcG9zaXRpb24uICovCisgICAgICBfUkFJdGVyIF9NX2N1cnJlbnQ7CisgICAgICAvKiogQGJyaWVmIF9Db21wYXJlLiAqLworICAgICAgX0NvbXBhcmUmIF9fY29tcDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBAYnJpZWYgQ29uc3RydWN0b3IuIFNldHMgaXRlcmF0b3IgdG8gYmVnaW5uaW5nIG9mIHNlcXVlbmNlLgorICAgICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2Ygc2VxdWVuY2UuCisgICAgICAqICBAcGFyYW0gX19lbmQgVW51c2VkLCBvbmx5IGZvciBjb21wYXRpYmlsaXR5LgorICAgICAgKiAgQHBhcmFtIF9fY29tcCBVbnVzZWQsIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkuICovCisgICAgICBfVW5ndWFyZGVkSXRlcmF0b3IoX1JBSXRlciBfX2JlZ2luLAorICAgICAgICAgICAgICAgIAkgX1JBSXRlciAvKiBfX2VuZCAqLywgX0NvbXBhcmUmIF9fY29tcCkKKyAgICAgIDogX01fY3VycmVudChfX2JlZ2luKSwgX19jb21wKF9fY29tcCkKKyAgICAgIHsgfQorCisgICAgICAvKiogQGJyaWVmIFByZS1pbmNyZW1lbnQgb3BlcmF0b3IuCisgICAgICAqICBAcmV0dXJuIFRoaXMuICovCisgICAgICBfVW5ndWFyZGVkSXRlcmF0b3I8X1JBSXRlciwgX0NvbXBhcmU+JgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJKytfTV9jdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqIEBicmllZiBEZXJlZmVyZW5jZSBvcGVyYXRvci4KKyAgICAgICogIEByZXR1cm4gUmVmZXJlbmNlZCBlbGVtZW50LiAqLworICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj46OnZhbHVlX3R5cGUmCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKl9NX2N1cnJlbnQ7IH0KKworICAgICAgLyoqIEBicmllZiBDb252ZXJ0IHRvIHdyYXBwZWQgaXRlcmF0b3IuCisgICAgICAqICBAcmV0dXJuIFdyYXBwZWQgaXRlcmF0b3IuICovCisgICAgICBvcGVyYXRvciBfUkFJdGVyKCkKKyAgICAgIHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgLyoqIEBicmllZiBDb21wYXJlIHR3byBlbGVtZW50cyByZWZlcmVuY2VkIGJ5IHVuZ3VhcmRlZCBpdGVyYXRvcnMuCisgICAgICAgKiAgQHBhcmFtIF9fYmkxIEZpcnN0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSBfX2JpMiBTZWNvbmQgaXRlcmF0b3IuCisgICAgICAgKiAgQHJldHVybiBAYyB0cnVlIGlmIGxlc3MuICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I8KF9Vbmd1YXJkZWRJdGVyYXRvcjxfUkFJdGVyLCBfQ29tcGFyZT4mIF9fYmkxLAorCQlfVW5ndWFyZGVkSXRlcmF0b3I8X1JBSXRlciwgX0NvbXBhcmU+JiBfX2JpMikKKyAgICAgIHsKKwkvLyBOb3JtYWwgY29tcGFyZS4KKwlyZXR1cm4gKF9fYmkxLl9fY29tcCkoKl9fYmkxLCAqX19iaTIpOworICAgICAgfQorCisgICAgICAvKiogQGJyaWVmIENvbXBhcmUgdHdvIGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgdW5ndWFyZGVkIGl0ZXJhdG9ycy4KKyAgICAgICAqICBAcGFyYW0gX19iaTEgRmlyc3QgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fYmkyIFNlY29uZCBpdGVyYXRvci4KKyAgICAgICAqICBAcmV0dXJuIEBjIFRydWUgaWYgbGVzcyBlcXVhbC4gKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcjw9KF9Vbmd1YXJkZWRJdGVyYXRvcjxfUkFJdGVyLCBfQ29tcGFyZT4mIF9fYmkxLAorCQkgX1VuZ3VhcmRlZEl0ZXJhdG9yPF9SQUl0ZXIsIF9Db21wYXJlPiYgX19iaTIpCisgICAgICB7CisJLy8gTm9ybWFsIGNvbXBhcmUuCisJcmV0dXJuICEoX19iaTEuX19jb21wKSgqX19iaTIsICpfX2JpMSk7CisgICAgICB9CisgICAgfTsKKworICAvKiogQGJyaWVmIEhpZ2hseSBlZmZpY2llbnQgMy13YXkgbWVyZ2luZyBwcm9jZWR1cmUuCisgICAqCisgICAqIE1lcmdpbmcgaXMgZG9uZSB3aXRoIHRoZSBhbGdvcml0aG0gaW1wbGVtZW50YXRpb24gZGVzY3JpYmVkIGJ5IFBldGVyCisgICAqIFNhbmRlcnMuICBCYXNpY2FsbHksIHRoZSBpZGVhIGlzIHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgbmVjZXNzYXJ5CisgICAqIGNvbXBhcmlzb24gYWZ0ZXIgbWVyZ2luZyBhbiBlbGVtZW50LiAgVGhlIGltcGxlbWVudGF0aW9uIHRyaWNrCisgICAqIHRoYXQgbWFrZXMgdGhpcyBmYXN0IGlzIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBzZXF1ZW5jZXMgaXMgc3RvcmVkCisgICAqIGluIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyICh0cmFuc2xhdGVkIGludG8gbGFiZWxzIGluIEMrKykuCisgICAqCisgICAqIFRoaXMgd29ya3Mgd2VsbCBmb3IgbWVyZ2luZyB1cCB0byA0IHNlcXVlbmNlcy4KKyAgICoKKyAgICogTm90ZSB0aGF0IG1ha2luZyB0aGUgbWVyZ2luZyBzdGFibGUgZG9lcyBAYSBub3QgY29tZSBhdCBhCisgICAqIHBlcmZvcm1hbmNlIGhpdC4KKyAgICoKKyAgICogV2hldGhlciB0aGUgbWVyZ2luZyBpcyBkb25lIGd1YXJkZWQgb3IgdW5ndWFyZGVkIGlzIHNlbGVjdGVkIGJ5IHRoZQorICAgKiB1c2VkIGl0ZXJhdG9yIGNsYXNzLgorICAgKgorICAgKiBAcGFyYW0gX19zZXFzX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGl0ZXJhdG9yIHBhaXIgaW5wdXQgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX3NlcXNfZW5kIEVuZCBpdGVyYXRvciBvZiBpdGVyYXRvciBwYWlyIGlucHV0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX190YXJnZXQgQmVnaW4gaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqIEBwYXJhbSBfX2xlbmd0aCBNYXhpbXVtIGxlbmd0aCB0byBtZXJnZSwgbGVzcyBlcXVhbCB0aGFuIHRoZQorICAgKiB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgYXZhaWxhYmxlLgorICAgKgorICAgKiBAcmV0dXJuIEVuZCBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuCisgICAqLworICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZSBSQUksIHR5cGVuYW1lIEM+IGNsYXNzIGl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfUkFJdGVySXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9SQUl0ZXIzLAorICAgICAgICAgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyMworICAgIG11bHRpd2F5X21lcmdlXzNfdmFyaWFudChfUkFJdGVySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkJICAgICBfUkFJdGVySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJCSAgICAgX1JBSXRlcjMgX190YXJnZXQsCisJCQkgICAgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fbGVuZ3RoKTsKKworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+CisJOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlCisJX1JBSXRlcjE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIGlmIChfX2xlbmd0aCA9PSAwKQorCXJldHVybiBfX3RhcmdldDsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgIF9EaWZmZXJlbmNlVHAgX19vcmlnX2xlbmd0aCA9IF9fbGVuZ3RoOworI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yPF9SQUl0ZXIxLCBfQ29tcGFyZT4KKwlfX3NlcTAoX19zZXFzX2JlZ2luWzBdLmZpcnN0LCBfX3NlcXNfYmVnaW5bMF0uc2Vjb25kLCBfX2NvbXApLAorCV9fc2VxMShfX3NlcXNfYmVnaW5bMV0uZmlyc3QsIF9fc2Vxc19iZWdpblsxXS5zZWNvbmQsIF9fY29tcCksCisJX19zZXEyKF9fc2Vxc19iZWdpblsyXS5maXJzdCwgX19zZXFzX2JlZ2luWzJdLnNlY29uZCwgX19jb21wKTsKKworICAgICAgaWYgKF9fc2VxMCA8PSBfX3NlcTEpCisJeworICAgICAgICAgIGlmIChfX3NlcTEgPD0gX19zZXEyKQorICAgICAgICAgICAgZ290byBfX3MwMTI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKF9fc2VxMiA8ICBfX3NlcTApCisgICAgICAgICAgICAgIGdvdG8gX19zMjAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBnb3RvIF9fczAyMTsKKwl9CisgICAgICBlbHNlCisJeworICAgICAgICAgIGlmIChfX3NlcTEgPD0gX19zZXEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoX19zZXEwIDw9IF9fc2VxMikKKyAgICAgICAgCWdvdG8gX19zMTAyOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgIAlnb3RvIF9fczEyMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3RvIF9fczIxMDsKKwl9CisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX01FUkdFXzNfQ0FTRShfX2EsIF9fYiwgX19jLCBfX2MwLCBfX2MxKSBcCisgICAgICBfX3MgIyMgX19hICMjIF9fYiAjIyBfX2MgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKl9fdGFyZ2V0ID0gKl9fc2VxICMjIF9fYTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkrK19fdGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCS0tX19sZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKytfX3NlcSAjIyBfX2E7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoX19sZW5ndGggPT0gMCkgZ290byBfX2ZpbmlzaDsgICAgICAgICAgICAgICAgICAgXAorCWlmIChfX3NlcSAjIyBfX2EgX19jMCBfX3NlcSAjIyBfX2IpIGdvdG8gX19zICMjIF9fYSAjIyBfX2IgIyMgX19jOyBcCisJaWYgKF9fc2VxICMjIF9fYSBfX2MxIF9fc2VxICMjIF9fYykgZ290byBfX3MgIyMgX19iICMjIF9fYSAjIyBfX2M7IFwKKwlnb3RvIF9fcyAjIyBfX2IgIyMgX19jICMjIF9fYTsKKworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfM19DQVNFKDAsIDEsIDIsIDw9LCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV8zX0NBU0UoMSwgMiwgMCwgPD0sIDwgKTsKKyAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX01FUkdFXzNfQ0FTRSgyLCAwLCAxLCA8ICwgPCApOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfM19DQVNFKDEsIDAsIDIsIDwgLCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV8zX0NBU0UoMCwgMiwgMSwgPD0sIDw9KTsKKyAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX01FUkdFXzNfQ0FTRSgyLCAxLCAwLCA8ICwgPCApOworCisjdW5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfM19DQVNFCisKKyAgICBfX2ZpbmlzaDoKKyAgICAgIDsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoCisJKChfUkFJdGVyMSlfX3NlcTAgLSBfX3NlcXNfYmVnaW5bMF0uZmlyc3QpICsKKwkoKF9SQUl0ZXIxKV9fc2VxMSAtIF9fc2Vxc19iZWdpblsxXS5maXJzdCkgKworCSgoX1JBSXRlcjEpX19zZXEyIC0gX19zZXFzX2JlZ2luWzJdLmZpcnN0KQorCT09IF9fb3JpZ19sZW5ndGgpOworI2VuZGlmCisKKyAgICAgIF9fc2Vxc19iZWdpblswXS5maXJzdCA9IF9fc2VxMDsKKyAgICAgIF9fc2Vxc19iZWdpblsxXS5maXJzdCA9IF9fc2VxMTsKKyAgICAgIF9fc2Vxc19iZWdpblsyXS5maXJzdCA9IF9fc2VxMjsKKworICAgICAgcmV0dXJuIF9fdGFyZ2V0OworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIEhpZ2hseSBlZmZpY2llbnQgNC13YXkgbWVyZ2luZyBwcm9jZWR1cmUuCisgICAqCisgICAqIE1lcmdpbmcgaXMgZG9uZSB3aXRoIHRoZSBhbGdvcml0aG0gaW1wbGVtZW50YXRpb24gZGVzY3JpYmVkIGJ5IFBldGVyCisgICAqIFNhbmRlcnMuIEJhc2ljYWxseSwgdGhlIGlkZWEgaXMgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBuZWNlc3NhcnkKKyAgICogY29tcGFyaXNvbiBhZnRlciBtZXJnaW5nIGFuIGVsZW1lbnQuICBUaGUgaW1wbGVtZW50YXRpb24gdHJpY2sKKyAgICogdGhhdCBtYWtlcyB0aGlzIGZhc3QgaXMgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIHNlcXVlbmNlcyBpcyBzdG9yZWQKKyAgICogaW4gdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgKHRyYW5zbGF0ZWQgaW50byBnb3RvIGxhYmVscyBpbiBDKyspLgorICAgKgorICAgKiBUaGlzIHdvcmtzIHdlbGwgZm9yIG1lcmdpbmcgdXAgdG8gNCBzZXF1ZW5jZXMuCisgICAqCisgICAqIE5vdGUgdGhhdCBtYWtpbmcgdGhlIG1lcmdpbmcgc3RhYmxlIGRvZXMgQGEgbm90IGNvbWUgYXQgYQorICAgKiBwZXJmb3JtYW5jZSBoaXQuCisgICAqCisgICAqIFdoZXRoZXIgdGhlIG1lcmdpbmcgaXMgZG9uZSBndWFyZGVkIG9yIHVuZ3VhcmRlZCBpcyBzZWxlY3RlZCBieSB0aGUKKyAgICogdXNlZCBpdGVyYXRvciBjbGFzcy4KKyAgICoKKyAgICogQHBhcmFtIF9fc2Vxc19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpdGVyYXRvciBwYWlyIGlucHV0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19zZXFzX2VuZCBFbmQgaXRlcmF0b3Igb2YgaXRlcmF0b3IgcGFpciBpbnB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fdGFyZ2V0IEJlZ2luIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiBAcGFyYW0gX19sZW5ndGggTWF4aW11bSBsZW5ndGggdG8gbWVyZ2UsIGxlc3MgZXF1YWwgdGhhbiB0aGUKKyAgICogdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGF2YWlsYWJsZS4KKyAgICoKKyAgICogQHJldHVybiBFbmQgaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLgorICAgKi8KKyAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWUgUkFJLCB0eXBlbmFtZSBDPiBjbGFzcyBpdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1JBSXRlckl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfUkFJdGVyMywKKyAgICAgICAgICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlcjMKKyAgICBtdWx0aXdheV9tZXJnZV80X3ZhcmlhbnQoX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIzIF9fdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2xlbmd0aCk7CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJJdGVyYXRvcj4KKwk6OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUKKwlfUkFJdGVyMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgaXRlcmF0b3I8X1JBSXRlcjEsIF9Db21wYXJlPgorCV9fc2VxMChfX3NlcXNfYmVnaW5bMF0uZmlyc3QsIF9fc2Vxc19iZWdpblswXS5zZWNvbmQsIF9fY29tcCksCisJX19zZXExKF9fc2Vxc19iZWdpblsxXS5maXJzdCwgX19zZXFzX2JlZ2luWzFdLnNlY29uZCwgX19jb21wKSwKKwlfX3NlcTIoX19zZXFzX2JlZ2luWzJdLmZpcnN0LCBfX3NlcXNfYmVnaW5bMl0uc2Vjb25kLCBfX2NvbXApLAorCV9fc2VxMyhfX3NlcXNfYmVnaW5bM10uZmlyc3QsIF9fc2Vxc19iZWdpblszXS5zZWNvbmQsIF9fY29tcCk7CisKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfREVDSVNJT04oX19hLCBfX2IsIF9fYywgX19kKSB7ICBcCisJaWYgKF9fc2VxICMjIF9fZCA8IF9fc2VxICMjIF9fYSkJCSAgXAorCSAgZ290byBfX3MgIyMgX19kICMjIF9fYSAjIyBfX2IgIyMgX19jOwkJICBcCisJaWYgKF9fc2VxICMjIF9fZCA8IF9fc2VxICMjIF9fYikJCSAgXAorCSAgZ290byBfX3MgIyMgX19hICMjIF9fZCAjIyBfX2IgIyMgX19jOwkJICBcCisJaWYgKF9fc2VxICMjIF9fZCA8IF9fc2VxICMjIF9fYykJCSAgXAorCSAgZ290byBfX3MgIyMgX19hICMjIF9fYiAjIyBfX2QgIyMgX19jOwkJICBcCisJZ290byBfX3MgIyMgX19hICMjIF9fYiAjIyBfX2MgIyMgX19kOyAgfQorCisgICAgICBpZiAoX19zZXEwIDw9IF9fc2VxMSkKKwl7CisgICAgICAgICAgaWYgKF9fc2VxMSA8PSBfX3NlcTIpCisgICAgICAgICAgICBfR0xJQkNYWF9QQVJBTExFTF9ERUNJU0lPTigwLDEsMiwzKQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiAoX19zZXEyIDwgX19zZXEwKQorICAgICAgICAJX0dMSUJDWFhfUEFSQUxMRUxfREVDSVNJT04oMiwwLDEsMykKKyAgICAgICAgCWVsc2UKKyAgICAgICAgICAgICAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0RFQ0lTSU9OKDAsMiwxLDMpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgIGVsc2UKKwl7CisgICAgICAgICAgaWYgKF9fc2VxMSA8PSBfX3NlcTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChfX3NlcTAgPD0gX19zZXEyKQorICAgICAgICAJX0dMSUJDWFhfUEFSQUxMRUxfREVDSVNJT04oMSwwLDIsMykKKyAgICAgICAgCWVsc2UKKyAgICAgICAgICAgICAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0RFQ0lTSU9OKDEsMiwwLDMpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfR0xJQkNYWF9QQVJBTExFTF9ERUNJU0lPTigyLDEsMCwzKQorICAgICAgICAgICAgICB9CisKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKF9fYSwgX19iLCBfX2MsIF9fZCwgIFwKKwkJCQkgICAgICAgX19jMCwgX19jMSwgX19jMikgICAgXAorICAgICAgX19zICMjIF9fYSAjIyBfX2IgIyMgX19jICMjIF9fZDogICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKF9fbGVuZ3RoID09IDApIGdvdG8gX19maW5pc2g7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKl9fdGFyZ2V0ID0gKl9fc2VxICMjIF9fYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKytfX3RhcmdldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgLS1fX2xlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKytfX3NlcSAjIyBfX2E7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKF9fc2VxICMjIF9fYSBfX2MwIF9fc2VxICMjIF9fYikgICAgICBcCisJZ290byBfX3MgIyMgX19hICMjIF9fYiAjIyBfX2MgIyMgX19kOyAgXAorICAgICAgaWYgKF9fc2VxICMjIF9fYSBfX2MxIF9fc2VxICMjIF9fYykgICAgICBcCisJZ290byBfX3MgIyMgX19iICMjIF9fYSAjIyBfX2MgIyMgX19kOyAgXAorICAgICAgaWYgKF9fc2VxICMjIF9fYSBfX2MyIF9fc2VxICMjIF9fZCkgICAgICBcCisJZ290byBfX3MgIyMgX19iICMjIF9fYyAjIyBfX2EgIyMgX19kOyAgXAorICAgICAgZ290byBfX3MgIyMgX19iICMjIF9fYyAjIyBfX2QgIyMgX19hOworCisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMCwgMSwgMiwgMywgPD0sIDw9LCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMCwgMSwgMywgMiwgPD0sIDw9LCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMCwgMiwgMSwgMywgPD0sIDw9LCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMCwgMiwgMywgMSwgPD0sIDw9LCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMCwgMywgMSwgMiwgPD0sIDw9LCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMCwgMywgMiwgMSwgPD0sIDw9LCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMSwgMCwgMiwgMywgPCAsIDw9LCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMSwgMCwgMywgMiwgPCAsIDw9LCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMSwgMiwgMCwgMywgPD0sIDwgLCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMSwgMiwgMywgMCwgPD0sIDw9LCA8ICk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMSwgMywgMCwgMiwgPD0sIDwgLCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMSwgMywgMiwgMCwgPD0sIDw9LCA8ICk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMiwgMCwgMSwgMywgPCAsIDwgLCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMiwgMCwgMywgMSwgPCAsIDw9LCA8ICk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMiwgMSwgMCwgMywgPCAsIDwgLCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMiwgMSwgMywgMCwgPCAsIDw9LCA8ICk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMiwgMywgMCwgMSwgPD0sIDwgLCA8ICk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMiwgMywgMSwgMCwgPD0sIDwgLCA8ICk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMywgMCwgMSwgMiwgPCAsIDwgLCA8ICk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMywgMCwgMiwgMSwgPCAsIDwgLCA8ICk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMywgMSwgMCwgMiwgPCAsIDwgLCA8ICk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMywgMSwgMiwgMCwgPCAsIDwgLCA8ICk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMywgMiwgMCwgMSwgPCAsIDwgLCA8ICk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UoMywgMiwgMSwgMCwgPCAsIDwgLCA8ICk7CisKKyN1bmRlZiBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV80X0NBU0UKKyN1bmRlZiBfR0xJQkNYWF9QQVJBTExFTF9ERUNJU0lPTgorCisgICAgX19maW5pc2g6CisgICAgICA7CisKKyAgICAgIF9fc2Vxc19iZWdpblswXS5maXJzdCA9IF9fc2VxMDsKKyAgICAgIF9fc2Vxc19iZWdpblsxXS5maXJzdCA9IF9fc2VxMTsKKyAgICAgIF9fc2Vxc19iZWdpblsyXS5maXJzdCA9IF9fc2VxMjsKKyAgICAgIF9fc2Vxc19iZWdpblszXS5maXJzdCA9IF9fc2VxMzsKKworICAgICAgcmV0dXJuIF9fdGFyZ2V0OworICAgIH0KKworICAvKiogQGJyaWVmIE11bHRpLXdheSBtZXJnaW5nIHByb2NlZHVyZSBmb3IgYSBoaWdoIGJyYW5jaGluZyBmYWN0b3IsCisgICAqICAgICAgICAgZ3VhcmRlZCBjYXNlLgorICAgKgorICAgKiBUaGlzIG1lcmdpbmcgdmFyaWFudCB1c2VzIGEgTG9zZXJUcmVlIGNsYXNzIGFzIHNlbGVjdGVkIGJ5IDx0dD5fTFQ8L3R0Pi4KKyAgICoKKyAgICogU3RhYmlsaXR5IGlzIHNlbGVjdGVkIHRocm91Z2ggdGhlIHVzZWQgTG9zZXJUcmVlIGNsYXNzIDx0dD5fTFQ8L3R0Pi4KKyAgICoKKyAgICogQXQgbGVhc3Qgb25lIG5vbi1lbXB0eSBzZXF1ZW5jZSBpcyByZXF1aXJlZC4KKyAgICoKKyAgICogQHBhcmFtIF9fc2Vxc19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpdGVyYXRvciBwYWlyIGlucHV0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19zZXFzX2VuZCBFbmQgaXRlcmF0b3Igb2YgaXRlcmF0b3IgcGFpciBpbnB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fdGFyZ2V0IEJlZ2luIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiBAcGFyYW0gX19sZW5ndGggTWF4aW11bSBsZW5ndGggdG8gbWVyZ2UsIGxlc3MgZXF1YWwgdGhhbiB0aGUKKyAgICogdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGF2YWlsYWJsZS4KKyAgICoKKyAgICogQHJldHVybiBFbmQgaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0xULAorICAgICAgICAgICB0eXBlbmFtZSBfUkFJdGVySXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9SQUl0ZXIzLAorICAgICAgICAgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyMworICAgIG11bHRpd2F5X21lcmdlX2xvc2VyX3RyZWUoX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjMgX190YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2xlbmd0aCkKKworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlckl0ZXJhdG9yPgorCTo6ZGlmZmVyZW5jZV90eXBlIF9TZXFOdW1iZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJJdGVyYXRvcj4KKwk6OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUKKwlfUkFJdGVyMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgX1NlcU51bWJlciBfX2sgPSBzdGF0aWNfY2FzdDxfU2VxTnVtYmVyPihfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKTsKKworICAgICAgX0xUIF9fbHQoX19rLCBfX2NvbXApOworCisgICAgICAvLyBEZWZhdWx0IHZhbHVlIGZvciBwb3RlbnRpYWxseSBub24tZGVmYXVsdC1jb25zdHJ1Y3RpYmxlIHR5cGVzLgorICAgICAgX1ZhbHVlVHlwZSogX19hcmJpdHJhcnlfZWxlbWVudCA9IDA7CisKKyAgICAgIGZvciAoX1NlcU51bWJlciBfX3QgPSAwOyBfX3QgPCBfX2s7ICsrX190KQorCXsKKyAgICAgICAgICBpZighX19hcmJpdHJhcnlfZWxlbWVudAorCSAgICAgJiYgX0dMSUJDWFhfUEFSQUxMRUxfTEVOR1RIKF9fc2Vxc19iZWdpbltfX3RdKSA+IDApCisgICAgICAgICAgICBfX2FyYml0cmFyeV9lbGVtZW50ID0gJigqX19zZXFzX2JlZ2luW19fdF0uZmlyc3QpOworCX0KKworICAgICAgZm9yIChfU2VxTnVtYmVyIF9fdCA9IDA7IF9fdCA8IF9fazsgKytfX3QpCisJeworICAgICAgICAgIGlmIChfX3NlcXNfYmVnaW5bX190XS5maXJzdCA9PSBfX3NlcXNfYmVnaW5bX190XS5zZWNvbmQpCisgICAgICAgICAgICBfX2x0Ll9faW5zZXJ0X3N0YXJ0KCpfX2FyYml0cmFyeV9lbGVtZW50LCBfX3QsIHRydWUpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fbHQuX19pbnNlcnRfc3RhcnQoKl9fc2Vxc19iZWdpbltfX3RdLmZpcnN0LCBfX3QsIGZhbHNlKTsKKwl9CisKKyAgICAgIF9fbHQuX19pbml0KCk7CisKKyAgICAgIF9TZXFOdW1iZXIgX19zb3VyY2U7CisKKyAgICAgIGZvciAoX0RpZmZlcmVuY2VUeXBlIF9faSA9IDA7IF9faSA8IF9fbGVuZ3RoOyArK19faSkKKwl7CisgICAgICAgICAgLy90YWtlIG91dAorICAgICAgICAgIF9fc291cmNlID0gX19sdC5fX2dldF9taW5fc291cmNlKCk7CisKKyAgICAgICAgICAqKF9fdGFyZ2V0KyspID0gKihfX3NlcXNfYmVnaW5bX19zb3VyY2VdLmZpcnN0KyspOworCisgICAgICAgICAgLy8gRmVlZC4KKyAgICAgICAgICBpZiAoX19zZXFzX2JlZ2luW19fc291cmNlXS5maXJzdCA9PSBfX3NlcXNfYmVnaW5bX19zb3VyY2VdLnNlY29uZCkKKyAgICAgICAgICAgIF9fbHQuX19kZWxldGVfbWluX2luc2VydCgqX19hcmJpdHJhcnlfZWxlbWVudCwgdHJ1ZSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgLy8gUmVwbGFjZSBmcm9tIHNhbWUgX19zb3VyY2UuCisgICAgICAgICAgICBfX2x0Ll9fZGVsZXRlX21pbl9pbnNlcnQoKl9fc2Vxc19iZWdpbltfX3NvdXJjZV0uZmlyc3QsIGZhbHNlKTsKKwl9CisKKyAgICAgIHJldHVybiBfX3RhcmdldDsKKyAgICB9CisKKyAgLyoqIEBicmllZiBNdWx0aS13YXkgbWVyZ2luZyBwcm9jZWR1cmUgZm9yIGEgaGlnaCBicmFuY2hpbmcgZmFjdG9yLAorICAgKiAgICAgICAgIHVuZ3VhcmRlZCBjYXNlLgorICAgKgorICAgKiBNZXJnaW5nIGlzIGRvbmUgdXNpbmcgdGhlIExvc2VyVHJlZSBjbGFzcyA8dHQ+X0xUPC90dD4uCisgICAqCisgICAqIFN0YWJpbGl0eSBpcyBzZWxlY3RlZCBieSB0aGUgdXNlZCBMb3NlclRyZWVzLgorICAgKgorICAgKiBAcHJlIE5vIGlucHV0IHdpbGwgcnVuIG91dCBvZiBlbGVtZW50cyBkdXJpbmcgdGhlIG1lcmdlLgorICAgKgorICAgKiBAcGFyYW0gX19zZXFzX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGl0ZXJhdG9yIHBhaXIgaW5wdXQgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX3NlcXNfZW5kIEVuZCBpdGVyYXRvciBvZiBpdGVyYXRvciBwYWlyIGlucHV0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX190YXJnZXQgQmVnaW4gaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqIEBwYXJhbSBfX2xlbmd0aCBNYXhpbXVtIGxlbmd0aCB0byBtZXJnZSwgbGVzcyBlcXVhbCB0aGFuIHRoZQorICAgKiB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgYXZhaWxhYmxlLgorICAgKgorICAgKiBAcmV0dXJuIEVuZCBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTFQsCisJICAgdHlwZW5hbWUgX1JBSXRlckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXIzLAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXIzCisgICAgbXVsdGl3YXlfbWVyZ2VfbG9zZXJfdHJlZV91bmd1YXJkZWQoX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCQkJX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkJCV9SQUl0ZXIzIF9fdGFyZ2V0LAorICAgICAgIGNvbnN0IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPAorCSAgX1JBSXRlckl0ZXJhdG9yPjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZT46OnZhbHVlX3R5cGUmCisJCQkJCV9fc2VudGluZWwsCisJCQkJCV9EaWZmZXJlbmNlVHAgX19sZW5ndGgsCisJCQkJCV9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fbGVuZ3RoKQorICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+CisJOjpkaWZmZXJlbmNlX3R5cGUgX1NlcU51bWJlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlckl0ZXJhdG9yPgorCTo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZQorCV9SQUl0ZXIxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICBfU2VxTnVtYmVyIF9fayA9IF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW47CisKKyAgICAgIF9MVCBfX2x0KF9faywgX19zZW50aW5lbCwgX19jb21wKTsKKworICAgICAgZm9yIChfU2VxTnVtYmVyIF9fdCA9IDA7IF9fdCA8IF9fazsgKytfX3QpCisJeworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX19zZXFzX2JlZ2luW19fdF0uZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gX19zZXFzX2JlZ2luW19fdF0uc2Vjb25kKTsKKyNlbmRpZgorICAgICAgICAgIF9fbHQuX19pbnNlcnRfc3RhcnQoKl9fc2Vxc19iZWdpbltfX3RdLmZpcnN0LCBfX3QsIGZhbHNlKTsKKwl9CisKKyAgICAgIF9fbHQuX19pbml0KCk7CisKKyAgICAgIF9TZXFOdW1iZXIgX19zb3VyY2U7CisKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19pID0gMDsKKyNlbmRpZgorCisgICAgICBfUkFJdGVyMyBfX3RhcmdldF9lbmQgPSBfX3RhcmdldCArIF9fbGVuZ3RoOworICAgICAgd2hpbGUgKF9fdGFyZ2V0IDwgX190YXJnZXRfZW5kKQorCXsKKyAgICAgICAgICAvLyBUYWtlIG91dC4KKyAgICAgICAgICBfX3NvdXJjZSA9IF9fbHQuX19nZXRfbWluX3NvdXJjZSgpOworCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworICAgICAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVCgwIDw9IF9fc291cmNlICYmIF9fc291cmNlIDwgX19rKTsKKyAgICAgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX19pID09IDAKKyAgICAgICAgICAgICAgfHwgIV9fY29tcCgqKF9fc2Vxc19iZWdpbltfX3NvdXJjZV0uZmlyc3QpLCAqKF9fdGFyZ2V0IC0gMSkpKTsKKyNlbmRpZgorCisgICAgICAgICAgLy8gRmVlZC4KKyAgICAgICAgICAqKF9fdGFyZ2V0KyspID0gKihfX3NlcXNfYmVnaW5bX19zb3VyY2VdLmZpcnN0KyspOworCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworICAgICAgICAgICsrX19pOworI2VuZGlmCisgICAgICAgICAgLy8gUmVwbGFjZSBmcm9tIHNhbWUgX19zb3VyY2UuCisgICAgICAgICAgX19sdC5fX2RlbGV0ZV9taW5faW5zZXJ0KCpfX3NlcXNfYmVnaW5bX19zb3VyY2VdLmZpcnN0LCBmYWxzZSk7CisJfQorCisgICAgICByZXR1cm4gX190YXJnZXQ7CisgICAgfQorCisKKyAgLyoqIEBicmllZiBNdWx0aS13YXkgbWVyZ2luZyBwcm9jZWR1cmUgZm9yIGEgaGlnaCBicmFuY2hpbmcgZmFjdG9yLAorICAgKiAgICAgICAgIHJlcXVpcmluZyBzZW50aW5lbHMgdG8gZXhpc3QuCisgICAqCisgICAqIEB0cGFyYW0gVW5ndWFyZGVkTG9zZXJUcmVlIF9Mb3NlciBUcmVlIHZhcmlhbnQgdG8gdXNlIGZvciB0aGUgdW5ndWFyZGVkCisgICAqICAgbWVyZ2luZy4KKyAgICoKKyAgICogQHBhcmFtIF9fc2Vxc19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpdGVyYXRvciBwYWlyIGlucHV0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19zZXFzX2VuZCBFbmQgaXRlcmF0b3Igb2YgaXRlcmF0b3IgcGFpciBpbnB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fdGFyZ2V0IEJlZ2luIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiBAcGFyYW0gX19sZW5ndGggTWF4aW11bSBsZW5ndGggdG8gbWVyZ2UsIGxlc3MgZXF1YWwgdGhhbiB0aGUKKyAgICogdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGF2YWlsYWJsZS4KKyAgICoKKyAgICogQHJldHVybiBFbmQgaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVW5ndWFyZGVkTG9zZXJUcmVlLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyMywKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXIzCisgICAgbXVsdGl3YXlfbWVyZ2VfbG9zZXJfdHJlZV9zZW50aW5lbChfUkFJdGVySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkJCSAgICAgICBfUkFJdGVySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJCQkgICAgICAgX1JBSXRlcjMgX190YXJnZXQsCisgICAgICBjb25zdCB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czwKKwlfUkFJdGVySXRlcmF0b3I+Ojp2YWx1ZV90eXBlOjpmaXJzdF90eXBlPjo6dmFsdWVfdHlwZSYKKwkJCQkgICAgICAgX19zZW50aW5lbCwKKwkJCQkgICAgICAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwKKwkJCQkgICAgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19sZW5ndGgpCisKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJJdGVyYXRvcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJJdGVyYXRvcj4KKwk6OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUKKwlfUkFJdGVyMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgX1JBSXRlcjMgX190YXJnZXRfZW5kOworCisgICAgICBmb3IgKF9SQUl0ZXJJdGVyYXRvciBfX3MgPSBfX3NlcXNfYmVnaW47IF9fcyAhPSBfX3NlcXNfZW5kOyArK19fcykKKwkvLyBNb3ZlIHRoZSBzZXF1ZW5jZSBlbmRzIHRvIHRoZSBzZW50aW5lbC4gIFRoaXMgaGFzIHRoZQorCS8vIGVmZmVjdCB0aGF0IHRoZSBzZW50aW5lbCBhcHBlYXJzIHRvIGJlIHdpdGhpbiB0aGUgc2VxdWVuY2UuIFRoZW4sCisJLy8gd2UgY2FuIHVzZSB0aGUgdW5ndWFyZGVkIHZhcmlhbnQgaWYgd2UgbWVyZ2Ugb3V0IGFzIG1hbnkKKwkvLyBub24tc2VudGluZWwgZWxlbWVudHMgYXMgd2UgaGF2ZS4KKwkrKygoKl9fcykuc2Vjb25kKTsKKworICAgICAgX190YXJnZXRfZW5kID0gbXVsdGl3YXlfbWVyZ2VfbG9zZXJfdHJlZV91bmd1YXJkZWQ8VW5ndWFyZGVkTG9zZXJUcmVlPgorCShfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LCBfX3NlbnRpbmVsLCBfX2xlbmd0aCwgX19jb21wKTsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX3RhcmdldF9lbmQgPT0gX190YXJnZXQgKyBfX2xlbmd0aCk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX19pc19zb3J0ZWQoX190YXJnZXQsIF9fdGFyZ2V0X2VuZCwgX19jb21wKSk7CisjZW5kaWYKKworICAgICAgLy8gUmVzdG9yZSB0aGUgc2VxdWVuY2UgZW5kcyBzbyB0aGUgc2VudGluZWxzIGFyZSBub3QgY29udGFpbmVkIGluIHRoZQorICAgICAgLy8gc2VxdWVuY2UgYW55IG1vcmUgKHNlZSBjb21tZW50IGluIGxvb3AgYWJvdmUpLgorICAgICAgZm9yIChfUkFJdGVySXRlcmF0b3IgX19zID0gX19zZXFzX2JlZ2luOyBfX3MgIT0gX19zZXFzX2VuZDsgKytfX3MpCisJLS0oKCpfX3MpLnNlY29uZCk7CisKKyAgICAgIHJldHVybiBfX3RhcmdldF9lbmQ7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVHJhaXRzIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBsb3NlciB0cmVlIHNob3VsZAorICAgKiAgIHVzZSBwb2ludGVycyBvciBjb3BpZXMuCisgICAqCisgICAqIFRoZSBmaWVsZCAiX01fdXNlX3BvaW50ZXIiIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdXNlIHBvaW50ZXJzCisgICAqIGluIGhlIGxvc2VyIHRyZWVzIG9yIHdoZXRoZXIgdG8gY29weSB0aGUgdmFsdWVzIGludG8gdGhlIGxvc2VyIHRyZWUuCisgICAqCisgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHVzZSBwb2ludGVycyBpZiB0aGUgZGF0YSB0eXBlIGlzIDQgdGltZXMgYXMKKyAgICogYmlnIGFzIHRoZSBwb2ludGVyIHRvIGl0LgorICAgKgorICAgKiBTcGVjaWFsaXplIGZvciB5b3VyIGRhdGEgdHlwZSB0byBjdXN0b21pemUgdGhlIGJlaGF2aW9yLgorICAgKgorICAgKiBFeGFtcGxlOgorICAgKgorICAgKiAgIHRlbXBsYXRlPD4KKyAgICogICBzdHJ1Y3QgX0xvc2VyVHJlZVRyYWl0czxpbnQ+CisgICAqICAgeyBzdGF0aWMgY29uc3QgYm9vbCBfTV91c2VfcG9pbnRlciA9IGZhbHNlOyB9OworICAgKgorICAgKiAgIHRlbXBsYXRlPD4KKyAgICogICBzdHJ1Y3QgX0xvc2VyVHJlZVRyYWl0czxoZWF2eXdlaWdodF90eXBlPgorICAgKiAgIHsgc3RhdGljIGNvbnN0IGJvb2wgX01fdXNlX3BvaW50ZXIgPSB0cnVlOyB9OworICAgKgorICAgKiBAcGFyYW0gX1RwIHR5cGUgdG8gZ2l2ZSB0aGUgbG9zZXIgdHJlZSB0cmFpdHMgZm9yLgorICAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0xvc2VyVHJlZVRyYWl0cworICAgIHsKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFRydWUgaWZmIHRvIHVzZSBwb2ludGVycyBpbnN0ZWFkIG9mIHZhbHVlcyBpbiBsb3NlciB0cmVlcy4KKyAgICAgICAqCisgICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byB1c2UgcG9pbnRlcnMgaWYgdGhlIGRhdGEgdHlwZSBpcyBmb3VyCisgICAgICAgKiB0aW1lcyBhcyBiaWcgYXMgdGhlIHBvaW50ZXIgdG8gaXQuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9NX3VzZV9wb2ludGVyID0gKHNpemVvZihfVHApID4gNCAqIHNpemVvZihfVHAqKSk7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFN3aXRjaCBmb3IgMy13YXkgbWVyZ2luZyB3aXRoIF9fc2VudGluZWxzIHR1cm5lZCBvZmYuCisgICAqCisgICAqIE5vdGUgdGhhdCAzLXdheSBtZXJnaW5nIGlzIGFsd2F5cyBzdGFibGUhCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc2VudGluZWxzIC8qZGVmYXVsdCA9PSBmYWxzZSovLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyMywKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHN0cnVjdCBfX211bHRpd2F5X21lcmdlXzNfdmFyaWFudF9zZW50aW5lbF9zd2l0Y2gKKyAgICB7CisgICAgICBfUkFJdGVyMworICAgICAgb3BlcmF0b3IoKShfUkFJdGVySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkgX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCSBfUkFJdGVyMyBfX3RhcmdldCwKKwkJIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCkKKyAgICAgIHsgcmV0dXJuIG11bHRpd2F5X21lcmdlXzNfdmFyaWFudDxfR3VhcmRlZEl0ZXJhdG9yPgorCSAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fbGVuZ3RoLCBfX2NvbXApOyB9CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFN3aXRjaCBmb3IgMy13YXkgbWVyZ2luZyB3aXRoIF9fc2VudGluZWxzIHR1cm5lZCBvbi4KKyAgICoKKyAgICogTm90ZSB0aGF0IDMtd2F5IG1lcmdpbmcgaXMgYWx3YXlzIHN0YWJsZSEKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyMywKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHN0cnVjdCBfX211bHRpd2F5X21lcmdlXzNfdmFyaWFudF9zZW50aW5lbF9zd2l0Y2g8dHJ1ZSwgX1JBSXRlckl0ZXJhdG9yLAorCQkJCQkJICAgICAgX1JBSXRlcjMsIF9EaWZmZXJlbmNlVHAsCisJCQkJCQkgICAgICBfQ29tcGFyZT4KKyAgICB7CisgICAgICBfUkFJdGVyMworICAgICAgb3BlcmF0b3IoKShfUkFJdGVySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkgX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCSBfUkFJdGVyMyBfX3RhcmdldCwKKwkJIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCkKKyAgICAgIHsgcmV0dXJuIG11bHRpd2F5X21lcmdlXzNfdmFyaWFudDxfVW5ndWFyZGVkSXRlcmF0b3I+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwgX19sZW5ndGgsIF9fY29tcCk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgU3dpdGNoIGZvciA0LXdheSBtZXJnaW5nIHdpdGggX19zZW50aW5lbHMgdHVybmVkIG9mZi4KKyAgICoKKyAgICogTm90ZSB0aGF0IDQtd2F5IG1lcmdpbmcgaXMgYWx3YXlzIHN0YWJsZSEKKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zZW50aW5lbHMgLypkZWZhdWx0ID09IGZhbHNlKi8sCisJICAgdHlwZW5hbWUgX1JBSXRlckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXIzLAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgc3RydWN0IF9fbXVsdGl3YXlfbWVyZ2VfNF92YXJpYW50X3NlbnRpbmVsX3N3aXRjaAorICAgIHsKKyAgICAgIF9SQUl0ZXIzCisgICAgICBvcGVyYXRvcigpKF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCSBfUkFJdGVySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJIF9SQUl0ZXIzIF9fdGFyZ2V0LAorCQkgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wKQorICAgICAgeyByZXR1cm4gbXVsdGl3YXlfbWVyZ2VfNF92YXJpYW50PF9HdWFyZGVkSXRlcmF0b3I+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwgX19sZW5ndGgsIF9fY29tcCk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgU3dpdGNoIGZvciA0LXdheSBtZXJnaW5nIHdpdGggX19zZW50aW5lbHMgdHVybmVkIG9uLgorICAgKgorICAgKiBOb3RlIHRoYXQgNC13YXkgbWVyZ2luZyBpcyBhbHdheXMgc3RhYmxlIQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXIzLAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgc3RydWN0IF9fbXVsdGl3YXlfbWVyZ2VfNF92YXJpYW50X3NlbnRpbmVsX3N3aXRjaDx0cnVlLCBfUkFJdGVySXRlcmF0b3IsCisJCQkJCQkgICAgICBfUkFJdGVyMywgX0RpZmZlcmVuY2VUcCwKKwkJCQkJCSAgICAgIF9Db21wYXJlPgorICAgIHsKKyAgICAgIF9SQUl0ZXIzCisgICAgICBvcGVyYXRvcigpKF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCSBfUkFJdGVySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJIF9SQUl0ZXIzIF9fdGFyZ2V0LAorCQkgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wKQorICAgICAgeyByZXR1cm4gbXVsdGl3YXlfbWVyZ2VfNF92YXJpYW50PF9Vbmd1YXJkZWRJdGVyYXRvcj4KKwkgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LCBfX2xlbmd0aCwgX19jb21wKTsgfQorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBTd2l0Y2ggZm9yIGstd2F5IG1lcmdpbmcgd2l0aCBfX3NlbnRpbmVscyB0dXJuZWQgb24uCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc2VudGluZWxzLAorCSAgIGJvb2wgX19zdGFibGUsCisJICAgdHlwZW5hbWUgX1JBSXRlckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXIzLAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgc3RydWN0IF9fbXVsdGl3YXlfbWVyZ2Vfa192YXJpYW50X3NlbnRpbmVsX3N3aXRjaAorICAgIHsKKyAgICAgIF9SQUl0ZXIzCisgICAgICBvcGVyYXRvcigpKF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCSBfUkFJdGVySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJIF9SQUl0ZXIzIF9fdGFyZ2V0LAorICAgICAgY29uc3QgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8CisgICAgICBfUkFJdGVySXRlcmF0b3I+Ojp2YWx1ZV90eXBlOjpmaXJzdF90eXBlPjo6dmFsdWVfdHlwZSYKKwkJIF9fc2VudGluZWwsCisJCSBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXApCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+CisJICA6OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUKKwkgIF9SQUl0ZXIxOworCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjE+Ojp2YWx1ZV90eXBlCisJICBfVmFsdWVUeXBlOworCisJcmV0dXJuIG11bHRpd2F5X21lcmdlX2xvc2VyX3RyZWVfc2VudGluZWw8CisJdHlwZW5hbWUgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8CisJX0xvc2VyVHJlZVRyYWl0czxfVmFsdWVUeXBlPjo6X01fdXNlX3BvaW50ZXIsCisJICBfTG9zZXJUcmVlUG9pbnRlclVuZ3VhcmRlZDxfX3N0YWJsZSwgX1ZhbHVlVHlwZSwgX0NvbXBhcmU+LAorCSAgX0xvc2VyVHJlZVVuZ3VhcmRlZDxfX3N0YWJsZSwgX1ZhbHVlVHlwZSwgX0NvbXBhcmU+CisgICAgICAgICAgPjo6X190eXBlPgorCSAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fc2VudGluZWwsIF9fbGVuZ3RoLCBfX2NvbXApOworICAgICAgfQorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBTd2l0Y2ggZm9yIGstd2F5IG1lcmdpbmcgd2l0aCBfX3NlbnRpbmVscyB0dXJuZWQgb2ZmLgorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwKKwkgICB0eXBlbmFtZSBfUkFJdGVySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlcjMsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBzdHJ1Y3QgX19tdWx0aXdheV9tZXJnZV9rX3ZhcmlhbnRfc2VudGluZWxfc3dpdGNoPGZhbHNlLCBfX3N0YWJsZSwKKwkJCQkJCSAgICAgIF9SQUl0ZXJJdGVyYXRvciwKKwkJCQkJCSAgICAgIF9SQUl0ZXIzLCBfRGlmZmVyZW5jZVRwLAorCQkJCQkJICAgICAgX0NvbXBhcmU+CisgICAgeworICAgICAgX1JBSXRlcjMKKyAgICAgIG9wZXJhdG9yKCkoX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJIF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkgX1JBSXRlcjMgX190YXJnZXQsCisgICAgICAgY29uc3QgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8CisgICAgICAgX1JBSXRlckl0ZXJhdG9yPjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZT46OnZhbHVlX3R5cGUmCisJCSBfX3NlbnRpbmVsLAorCQkgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wKQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlckl0ZXJhdG9yPgorCSAgOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlCisJICBfUkFJdGVyMTsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPjo6dmFsdWVfdHlwZQorCSAgX1ZhbHVlVHlwZTsKKworCXJldHVybiBtdWx0aXdheV9tZXJnZV9sb3Nlcl90cmVlPAorCXR5cGVuYW1lIF9fZ251X2N4eDo6X19jb25kaXRpb25hbF90eXBlPAorCV9Mb3NlclRyZWVUcmFpdHM8X1ZhbHVlVHlwZT46Ol9NX3VzZV9wb2ludGVyLAorCSAgX0xvc2VyVHJlZVBvaW50ZXI8X19zdGFibGUsIF9WYWx1ZVR5cGUsIF9Db21wYXJlPiwKKwkgIF9Mb3NlclRyZWU8X19zdGFibGUsIF9WYWx1ZVR5cGUsIF9Db21wYXJlPgorICAgICAgICAgID46Ol9fdHlwZSA+KF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fbGVuZ3RoLCBfX2NvbXApOworICAgICAgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBTZXF1ZW50aWFsIG11bHRpLXdheSBtZXJnaW5nIHN3aXRjaC4KKyAgICoKKyAgICogIFRoZSBfR0xJQkNYWF9QQVJBTExFTF9ERUNJU0lPTiBpcyBiYXNlZCBvbiB0aGUgYnJhbmNoaW5nIGZhY3RvciBhbmQKKyAgICogIHJ1bnRpbWUgc2V0dGluZ3MuCisgICAqICBAcGFyYW0gX19zZXFzX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGl0ZXJhdG9yIHBhaXIgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19zZXFzX2VuZCBFbmQgaXRlcmF0b3Igb2YgaXRlcmF0b3IgcGFpciBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX3RhcmdldCBCZWdpbiBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqICBAcGFyYW0gX19sZW5ndGggTWF4aW11bSBsZW5ndGggdG8gbWVyZ2UsIHBvc3NpYmx5IGxhcmdlciB0aGFuIHRoZQorICAgKiAgbnVtYmVyIG9mIGVsZW1lbnRzIGF2YWlsYWJsZS4KKyAgICogIEBwYXJhbSBfX3NlbnRpbmVsIFRoZSBzZXF1ZW5jZXMgaGF2ZSBfX2EgX19zZW50aW5lbCBlbGVtZW50LgorICAgKiAgQHJldHVybiBFbmQgaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLiAqLworICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLAorCSAgIGJvb2wgX19zZW50aW5lbHMsCisJICAgdHlwZW5hbWUgX1JBSXRlckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXIzLAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlcjMKKyAgICBfX3NlcXVlbnRpYWxfbXVsdGl3YXlfbWVyZ2UoX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCQlfUkFJdGVySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJCQlfUkFJdGVyMyBfX3RhcmdldCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPAorCV9SQUl0ZXJJdGVyYXRvcj46OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGU+Ojp2YWx1ZV90eXBlJgorCQkJCV9fc2VudGluZWwsCisJCQkJX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19sZW5ndGgpCisKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJJdGVyYXRvcj4KKwk6OmRpZmZlcmVuY2VfdHlwZSBfU2VxTnVtYmVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+CisJOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlCisJX1JBSXRlcjE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICBmb3IgKF9SQUl0ZXJJdGVyYXRvciBfX3MgPSBfX3NlcXNfYmVnaW47IF9fcyAhPSBfX3NlcXNfZW5kOyArK19fcykKKwl7CisgICAgICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9faXNfc29ydGVkKCgqX19zKS5maXJzdCwKKwkJCQkJICAgICAgICgqX19zKS5zZWNvbmQsIF9fY29tcCkpOworCX0KKyNlbmRpZgorCisgICAgICBfRGlmZmVyZW5jZVRwIF9fdG90YWxfbGVuZ3RoID0gMDsKKyAgICAgIGZvciAoX1JBSXRlckl0ZXJhdG9yIF9fcyA9IF9fc2Vxc19iZWdpbjsgX19zICE9IF9fc2Vxc19lbmQ7ICsrX19zKQorCV9fdG90YWxfbGVuZ3RoICs9IF9HTElCQ1hYX1BBUkFMTEVMX0xFTkdUSCgqX19zKTsKKworICAgICAgX19sZW5ndGggPSBzdGQ6Om1pbjxfRGlmZmVyZW5jZVRwPihfX2xlbmd0aCwgX190b3RhbF9sZW5ndGgpOworCisgICAgICBpZihfX2xlbmd0aCA9PSAwKQorCXJldHVybiBfX3RhcmdldDsKKworICAgICAgX1JBSXRlcjMgX19yZXR1cm5fdGFyZ2V0ID0gX190YXJnZXQ7CisgICAgICBfU2VxTnVtYmVyIF9fayA9IHN0YXRpY19jYXN0PF9TZXFOdW1iZXI+KF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pOworCisgICAgICBzd2l0Y2ggKF9faykKKwl7CisJY2FzZSAwOgorICAgICAgICAgIGJyZWFrOworCWNhc2UgMToKKyAgICAgICAgICBfX3JldHVybl90YXJnZXQgPSBzdGQ6OmNvcHkoX19zZXFzX2JlZ2luWzBdLmZpcnN0LAorCQkJCSAgICAgIF9fc2Vxc19iZWdpblswXS5maXJzdCArIF9fbGVuZ3RoLAorCQkJCSAgICAgIF9fdGFyZ2V0KTsKKyAgICAgICAgICBfX3NlcXNfYmVnaW5bMF0uZmlyc3QgKz0gX19sZW5ndGg7CisgICAgICAgICAgYnJlYWs7CisJY2FzZSAyOgorICAgICAgICAgIF9fcmV0dXJuX3RhcmdldCA9IF9fbWVyZ2VfYWR2YW5jZShfX3NlcXNfYmVnaW5bMF0uZmlyc3QsCisJCQkJCSAgICBfX3NlcXNfYmVnaW5bMF0uc2Vjb25kLAorCQkJCQkgICAgX19zZXFzX2JlZ2luWzFdLmZpcnN0LAorCQkJCQkgICAgX19zZXFzX2JlZ2luWzFdLnNlY29uZCwKKwkJCQkJICAgIF9fdGFyZ2V0LCBfX2xlbmd0aCwgX19jb21wKTsKKyAgICAgICAgICBicmVhazsKKwljYXNlIDM6CisgICAgICAgICAgX19yZXR1cm5fdGFyZ2V0ID0gX19tdWx0aXdheV9tZXJnZV8zX3ZhcmlhbnRfc2VudGluZWxfc3dpdGNoCisJICAgIDxfX3NlbnRpbmVscywgX1JBSXRlckl0ZXJhdG9yLCBfUkFJdGVyMywgX0RpZmZlcmVuY2VUcCwgX0NvbXBhcmU+KCkKKwkgICAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fbGVuZ3RoLCBfX2NvbXApOworICAgICAgICAgIGJyZWFrOworCWNhc2UgNDoKKyAgICAgICAgICBfX3JldHVybl90YXJnZXQgPSBfX211bHRpd2F5X21lcmdlXzRfdmFyaWFudF9zZW50aW5lbF9zd2l0Y2gKKwkgICAgPF9fc2VudGluZWxzLCBfUkFJdGVySXRlcmF0b3IsIF9SQUl0ZXIzLCBfRGlmZmVyZW5jZVRwLCBfQ29tcGFyZT4oKQorCSAgICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwgX19sZW5ndGgsIF9fY29tcCk7CisgICAgICAgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIF9fcmV0dXJuX3RhcmdldCA9IF9fbXVsdGl3YXlfbWVyZ2Vfa192YXJpYW50X3NlbnRpbmVsX3N3aXRjaAorCSAgICA8X19zZW50aW5lbHMsIF9fc3RhYmxlLCBfUkFJdGVySXRlcmF0b3IsIF9SQUl0ZXIzLCBfRGlmZmVyZW5jZVRwLAorCSAgICAgX0NvbXBhcmU+KCkKKwkgICAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fc2VudGluZWwsIF9fbGVuZ3RoLCBfX2NvbXApOworCSAgYnJlYWs7CisJfQorI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVCgKKwlfX2lzX3NvcnRlZChfX3RhcmdldCwgX190YXJnZXQgKyBfX2xlbmd0aCwgX19jb21wKSk7CisjZW5kaWYKKworICAgICAgcmV0dXJuIF9fcmV0dXJuX3RhcmdldDsKKyAgICB9CisKKyAgLyoqCisgICAqIEBicmllZiBTdGFibGUgc29ydGluZyBmdW5jdG9yLgorICAgKgorICAgKiBVc2VkIHRvIHJlZHVjZSBjb2RlIGluc3RhbmNpYXRpb24gaW4gbXVsdGl3YXlfbWVyZ2Vfc2FtcGxpbmdfc3BsaXR0aW5nLgorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwgY2xhc3MgX1JBSXRlciwgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICBzdHJ1Y3QgX1NhbXBsaW5nU29ydGVyCisgICAgeworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShfUkFJdGVyIF9fZmlyc3QsIF9SQUl0ZXIgX19sYXN0LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgICAgIHsgX19nbnVfc2VxdWVudGlhbDo6c3RhYmxlX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOyB9CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIE5vbi1fX3N0YWJsZSBzb3J0aW5nIGZ1bmN0b3IuCisgICAqCisgICAqIFVzZWQgdG8gcmVkdWNlIGNvZGUgaW5zdGFudGlhdGlvbiBpbiBtdWx0aXdheV9tZXJnZV9zYW1wbGluZ19zcGxpdHRpbmcuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfUkFJdGVyLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgIHN0cnVjdCBfU2FtcGxpbmdTb3J0ZXI8ZmFsc2UsIF9SQUl0ZXIsIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgeworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShfUkFJdGVyIF9fZmlyc3QsIF9SQUl0ZXIgX19sYXN0LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgICAgIHsgX19nbnVfc2VxdWVudGlhbDo6c29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgU2FtcGxpbmcgYmFzZWQgc3BsaXR0aW5nIGZvciBwYXJhbGxlbCBtdWx0aXdheS1tZXJnZSByb3V0aW5lLgorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwKKwkgICB0eXBlbmFtZSBfUkFJdGVySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUeXBlPgorICAgIHZvaWQKKyAgICBtdWx0aXdheV9tZXJnZV9zYW1wbGluZ19zcGxpdHRpbmcoX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCQkgICAgICBfUkFJdGVySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJCQkgICAgICBfRGlmZmVyZW5jZVR5cGUgX19sZW5ndGgsCisJCQkJICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fdG90YWxfbGVuZ3RoLAorCQkJCSAgICAgIF9Db21wYXJlIF9fY29tcCwKKyAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPF9EaWZmZXJlbmNlVHlwZSwgX0RpZmZlcmVuY2VUeXBlPiA+ICpfX3BpZWNlcykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJJdGVyYXRvcj4KKwk6OmRpZmZlcmVuY2VfdHlwZSBfU2VxTnVtYmVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+CisJOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlCisJX1JBSXRlcjE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIF9fayBzZXF1ZW5jZXMuCisgICAgICBjb25zdCBfU2VxTnVtYmVyIF9faworCT0gc3RhdGljX2Nhc3Q8X1NlcU51bWJlcj4oX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbik7CisKKyAgICAgIGNvbnN0IF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworCisgICAgICBjb25zdCBfRGlmZmVyZW5jZVR5cGUgX19udW1fc2FtcGxlcyA9CisJX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubWVyZ2Vfb3ZlcnNhbXBsaW5nICogX19udW1fdGhyZWFkczsKKworICAgICAgX1ZhbHVlVHlwZSogX19zYW1wbGVzID0gc3RhdGljX2Nhc3Q8X1ZhbHVlVHlwZSo+CisJKDo6b3BlcmF0b3IgbmV3KHNpemVvZihfVmFsdWVUeXBlKSAqIF9fayAqIF9fbnVtX3NhbXBsZXMpKTsKKyAgICAgIC8vIFNhbXBsZS4KKyAgICAgIGZvciAoX1NlcU51bWJlciBfX3MgPSAwOyBfX3MgPCBfX2s7ICsrX19zKQorCWZvciAoX0RpZmZlcmVuY2VUeXBlIF9faSA9IDA7IF9faSA8IF9fbnVtX3NhbXBsZXM7ICsrX19pKQorCSAgeworCSAgICBfRGlmZmVyZW5jZVR5cGUgc2FtcGxlX2luZGV4ID0gc3RhdGljX2Nhc3Q8X0RpZmZlcmVuY2VUeXBlPgorCSAgICAgIChfR0xJQkNYWF9QQVJBTExFTF9MRU5HVEgoX19zZXFzX2JlZ2luW19fc10pCisJICAgICAgICogKGRvdWJsZShfX2kgKyAxKSAvIChfX251bV9zYW1wbGVzICsgMSkpCisJICAgICAgICogKGRvdWJsZShfX2xlbmd0aCkgLyBfX3RvdGFsX2xlbmd0aCkpOworCSAgICBuZXcoJihfX3NhbXBsZXNbX19zICogX19udW1fc2FtcGxlcyArIF9faV0pKQorICAgICAgICAgICAgICBfVmFsdWVUeXBlKF9fc2Vxc19iZWdpbltfX3NdLmZpcnN0W3NhbXBsZV9pbmRleF0pOworCSAgfQorCisgICAgICAvLyBTb3J0IHN0YWJsZSBvciBub24tc3RhYmxlLCBkZXBlbmRpbmcgb24gdmFsdWUgb2YgdGVtcGxhdGUgcGFyYW1ldGVyCisgICAgICAvLyAiX19zdGFibGUiLgorICAgICAgX1NhbXBsaW5nU29ydGVyPF9fc3RhYmxlLCBfVmFsdWVUeXBlKiwgX0NvbXBhcmU+KCkKKwkoX19zYW1wbGVzLCBfX3NhbXBsZXMgKyAoX19udW1fc2FtcGxlcyAqIF9fayksIF9fY29tcCk7CisKKyAgICAgIGZvciAoX1RocmVhZEluZGV4IF9fc2xhYiA9IDA7IF9fc2xhYiA8IF9fbnVtX3RocmVhZHM7ICsrX19zbGFiKQorCS8vIEZvciBlYWNoIHNsYWIgLyBwcm9jZXNzb3IuCisJZm9yIChfU2VxTnVtYmVyIF9fc2VxID0gMDsgX19zZXEgPCBfX2s7ICsrX19zZXEpCisJICB7CisJICAgIC8vIEZvciBlYWNoIHNlcXVlbmNlLgorCSAgICBpZiAoX19zbGFiID4gMCkKKwkgICAgICBfX3BpZWNlc1tfX3NsYWJdW19fc2VxXS5maXJzdCA9IHN0ZDo6dXBwZXJfYm91bmQKKwkJKF9fc2Vxc19iZWdpbltfX3NlcV0uZmlyc3QsIF9fc2Vxc19iZWdpbltfX3NlcV0uc2Vjb25kLAorCQkgX19zYW1wbGVzW19fbnVtX3NhbXBsZXMgKiBfX2sgKiBfX3NsYWIgLyBfX251bV90aHJlYWRzXSwKKwkJIF9fY29tcCkKKwkJLSBfX3NlcXNfYmVnaW5bX19zZXFdLmZpcnN0OworCSAgICBlbHNlCisJICAgICAgLy8gQWJzb2x1dGUgYmVnaW5uaW5nLgorCSAgICAgIF9fcGllY2VzW19fc2xhYl1bX19zZXFdLmZpcnN0ID0gMDsKKwkgICAgaWYgKChfX3NsYWIgKyAxKSA8IF9fbnVtX3RocmVhZHMpCisJICAgICAgX19waWVjZXNbX19zbGFiXVtfX3NlcV0uc2Vjb25kID0gc3RkOjp1cHBlcl9ib3VuZAorCQkoX19zZXFzX2JlZ2luW19fc2VxXS5maXJzdCwgX19zZXFzX2JlZ2luW19fc2VxXS5zZWNvbmQsCisJCSBfX3NhbXBsZXNbX19udW1fc2FtcGxlcyAqIF9fayAqIChfX3NsYWIgKyAxKSAvIF9fbnVtX3RocmVhZHNdLAorCQkgX19jb21wKQorCQktIF9fc2Vxc19iZWdpbltfX3NlcV0uZmlyc3Q7CisJICAgIGVsc2UKKyAgICAgICAgICAgICAgLy8gQWJzb2x1dGUgZW5kLgorCSAgICAgIF9fcGllY2VzW19fc2xhYl1bX19zZXFdLnNlY29uZCA9CisJCV9HTElCQ1hYX1BBUkFMTEVMX0xFTkdUSChfX3NlcXNfYmVnaW5bX19zZXFdKTsKKwkgIH0KKworICAgICAgZm9yIChfU2VxTnVtYmVyIF9fcyA9IDA7IF9fcyA8IF9fazsgKytfX3MpCisJZm9yIChfRGlmZmVyZW5jZVR5cGUgX19pID0gMDsgX19pIDwgX19udW1fc2FtcGxlczsgKytfX2kpCisJICBfX3NhbXBsZXNbX19zICogX19udW1fc2FtcGxlcyArIF9faV0ufl9WYWx1ZVR5cGUoKTsKKyAgICAgIDo6b3BlcmF0b3IgZGVsZXRlKF9fc2FtcGxlcyk7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgRXhhY3Qgc3BsaXR0aW5nIGZvciBwYXJhbGxlbCBtdWx0aXdheS1tZXJnZSByb3V0aW5lLgorICAgKgorICAgKiBOb25lIG9mIHRoZSBwYXNzZWQgc2VxdWVuY2VzIG1heSBiZSBlbXB0eS4KKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUsCisJICAgdHlwZW5hbWUgX1JBSXRlckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHlwZT4KKyAgICB2b2lkCisgICAgbXVsdGl3YXlfbWVyZ2VfZXhhY3Rfc3BsaXR0aW5nKF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCQkJICAgX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkJICAgX0RpZmZlcmVuY2VUeXBlIF9fbGVuZ3RoLAorCQkJCSAgIF9EaWZmZXJlbmNlVHlwZSBfX3RvdGFsX2xlbmd0aCwKKwkJCQkgICBfQ29tcGFyZSBfX2NvbXAsCisgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPF9EaWZmZXJlbmNlVHlwZSwgX0RpZmZlcmVuY2VUeXBlPiA+ICpfX3BpZWNlcykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJJdGVyYXRvcj4KKwk6OmRpZmZlcmVuY2VfdHlwZSBfU2VxTnVtYmVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+CisJOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlCisJX1JBSXRlcjE7CisKKyAgICAgIGNvbnN0IGJvb2wgX190aWdodCA9IChfX3RvdGFsX2xlbmd0aCA9PSBfX2xlbmd0aCk7CisKKyAgICAgIC8vIF9fayBzZXF1ZW5jZXMuCisgICAgICBjb25zdCBfU2VxTnVtYmVyIF9fayA9IF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW47CisKKyAgICAgIGNvbnN0IF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworCisgICAgICAvLyAoU2V0dGluZ3M6Om11bHRpd2F5X21lcmdlX3NwbGl0dGluZworICAgICAgLy8gID09IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OkVYQUNUKS4KKyAgICAgIHN0ZDo6dmVjdG9yPF9SQUl0ZXIxPiogX19vZmZzZXRzID0gCisJbmV3IHN0ZDo6dmVjdG9yPF9SQUl0ZXIxPltfX251bV90aHJlYWRzXTsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxfUkFJdGVyMSwgX1JBSXRlcjE+ID4gX19zZShfX2spOworCisgICAgICBjb3B5KF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX19zZS5iZWdpbigpKTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlKiBfX2JvcmRlcnMgPQorCW5ldyBfRGlmZmVyZW5jZVR5cGVbX19udW1fdGhyZWFkcyArIDFdOworICAgICAgX19lcXVhbGx5X3NwbGl0KF9fbGVuZ3RoLCBfX251bV90aHJlYWRzLCBfX2JvcmRlcnMpOworCisgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX3MgPSAwOyBfX3MgPCAoX19udW1fdGhyZWFkcyAtIDEpOyArK19fcykKKwl7CisJICBfX29mZnNldHNbX19zXS5yZXNpemUoX19rKTsKKwkgIG11bHRpc2VxX3BhcnRpdGlvbihfX3NlLmJlZ2luKCksIF9fc2UuZW5kKCksIF9fYm9yZGVyc1tfX3MgKyAxXSwKKwkJCSAgICAgX19vZmZzZXRzW19fc10uYmVnaW4oKSwgX19jb21wKTsKKworCSAgLy8gTGFzdCBvbmUgYWxzbyBuZWVkZWQgYW5kIGF2YWlsYWJsZS4KKwkgIGlmICghX190aWdodCkKKwkgICAgeworCSAgICAgIF9fb2Zmc2V0c1tfX251bV90aHJlYWRzIC0gMV0ucmVzaXplKF9fayk7CisJICAgICAgbXVsdGlzZXFfcGFydGl0aW9uKF9fc2UuYmVnaW4oKSwgX19zZS5lbmQoKSwKKwkJCQkgX0RpZmZlcmVuY2VUeXBlKF9fbGVuZ3RoKSwKKwkJCQkgX19vZmZzZXRzW19fbnVtX3RocmVhZHMgLSAxXS5iZWdpbigpLAorCQkJCSBfX2NvbXApOworCSAgICB9CisJfQorICAgICAgZGVsZXRlW10gX19ib3JkZXJzOworCisgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX3NsYWIgPSAwOyBfX3NsYWIgPCBfX251bV90aHJlYWRzOyArK19fc2xhYikKKwl7CisJICAvLyBGb3IgZWFjaCBzbGFiIC8gcHJvY2Vzc29yLgorCSAgZm9yIChfU2VxTnVtYmVyIF9fc2VxID0gMDsgX19zZXEgPCBfX2s7ICsrX19zZXEpCisJICAgIHsKKwkgICAgICAvLyBGb3IgZWFjaCBzZXF1ZW5jZS4KKwkgICAgICBpZiAoX19zbGFiID09IDApCisJCXsKKwkJICAvLyBBYnNvbHV0ZSBiZWdpbm5pbmcuCisJCSAgX19waWVjZXNbX19zbGFiXVtfX3NlcV0uZmlyc3QgPSAwOworCQl9CisJICAgICAgZWxzZQorCQlfX3BpZWNlc1tfX3NsYWJdW19fc2VxXS5maXJzdCA9CisJCSAgX19waWVjZXNbX19zbGFiIC0gMV1bX19zZXFdLnNlY29uZDsKKwkgICAgICBpZiAoIV9fdGlnaHQgfHwgX19zbGFiIDwgKF9fbnVtX3RocmVhZHMgLSAxKSkKKwkJX19waWVjZXNbX19zbGFiXVtfX3NlcV0uc2Vjb25kID0KKwkJICBfX29mZnNldHNbX19zbGFiXVtfX3NlcV0gLSBfX3NlcXNfYmVnaW5bX19zZXFdLmZpcnN0OworCSAgICAgIGVsc2UKKwkJeworCQkgIC8vIF9fc2xhYiA9PSBfX251bV90aHJlYWRzIC0gMQorCQkgIF9fcGllY2VzW19fc2xhYl1bX19zZXFdLnNlY29uZCA9CisgICAgICAgICAgICAgICAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0xFTkdUSChfX3NlcXNfYmVnaW5bX19zZXFdKTsKKwkJfQorCSAgICB9CisJfQorICAgICAgZGVsZXRlW10gX19vZmZzZXRzOworICAgIH0KKworICAvKiogQGJyaWVmIFBhcmFsbGVsIG11bHRpLXdheSBtZXJnZSByb3V0aW5lLgorICAgKgorICAgKiBUaGUgX0dMSUJDWFhfUEFSQUxMRUxfREVDSVNJT04gaXMgYmFzZWQgb24gdGhlIGJyYW5jaGluZyBmYWN0b3IKKyAgICogYW5kIHJ1bnRpbWUgc2V0dGluZ3MuCisgICAqCisgICAqIE11c3Qgbm90IGJlIGNhbGxlZCBpZiB0aGUgbnVtYmVyIG9mIHNlcXVlbmNlcyBpcyAxLgorICAgKgorICAgKiBAdHBhcmFtIF9TcGxpdHRlciBmdW5jdG9yIHRvIHNwbGl0IGlucHV0IChlaXRoZXIgX19leGFjdCBvciBzYW1wbGluZyBiYXNlZCkKKyAgICogQHRwYXJhbSBfX3N0YWJsZSBTdGFibGUgbWVyZ2luZyBpbmN1cnMgYSBwZXJmb3JtYW5jZSBwZW5hbHR5LgorICAgKiBAdHBhcmFtIF9fc2VudGluZWwgSWdub3JlZC4KKyAgICoKKyAgICogQHBhcmFtIF9fc2Vxc19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpdGVyYXRvciBwYWlyIGlucHV0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19zZXFzX2VuZCBFbmQgaXRlcmF0b3Igb2YgaXRlcmF0b3IgcGFpciBpbnB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fdGFyZ2V0IEJlZ2luIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiBAcGFyYW0gX19sZW5ndGggTWF4aW11bSBsZW5ndGggdG8gbWVyZ2UsIHBvc3NpYmx5IGxhcmdlciB0aGFuIHRoZQorICAgKiBudW1iZXIgb2YgZWxlbWVudHMgYXZhaWxhYmxlLgorICAgKiBAcmV0dXJuIEVuZCBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLAorCSAgIGJvb2wgX19zZW50aW5lbHMsCisJICAgdHlwZW5hbWUgX1JBSXRlckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXIzLAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX1NwbGl0dGVyLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXIzCisgICAgcGFyYWxsZWxfbXVsdGl3YXlfbWVyZ2UoX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVySXRlcmF0b3IgX19zZXFzX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMyBfX3RhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU3BsaXR0ZXIgX19zcGxpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcykKKyAgICAgIHsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4gPiAxKTsKKyNlbmRpZgorCisJX0dMSUJDWFhfQ0FMTChfX2xlbmd0aCkKKworCXR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlckl0ZXJhdG9yPgorCSAgOjpkaWZmZXJlbmNlX3R5cGUgX1NlcU51bWJlcjsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJJdGVyYXRvcj4KKyAgICAgICAgICA6OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUKKyAgICAgICAgICBfUkFJdGVyMTsKKwl0eXBlZGVmIHR5cGVuYW1lCisgICAgICAgICAgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjE+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisKKwkvLyBMZWF2ZSBvbmx5IG5vbi1lbXB0eSBzZXF1ZW5jZXMuCisJdHlwZWRlZiBzdGQ6OnBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIxPiBzZXFfdHlwZTsKKwlzZXFfdHlwZSogX19uZV9zZXFzID0gbmV3IHNlcV90eXBlW19fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW5dOworCV9TZXFOdW1iZXIgX19rID0gMDsKKwlfRGlmZmVyZW5jZVR5cGUgX190b3RhbF9sZW5ndGggPSAwOworCWZvciAoX1JBSXRlckl0ZXJhdG9yIF9fcmFpaSA9IF9fc2Vxc19iZWdpbjsKKyAgICAgICAgICAgICBfX3JhaWkgIT0gX19zZXFzX2VuZDsgKytfX3JhaWkpCisgICAgICAgICAgeworICAgICAgICAgICAgX0RpZmZlcmVuY2VUcCBfX3NlcV9sZW5ndGggPSBfR0xJQkNYWF9QQVJBTExFTF9MRU5HVEgoKl9fcmFpaSk7CisgICAgICAgICAgICBpZihfX3NlcV9sZW5ndGggPiAwKQorICAgICAgICAgICAgICB7CisgICAgICAgIAlfX3RvdGFsX2xlbmd0aCArPSBfX3NlcV9sZW5ndGg7CisgICAgICAgIAlfX25lX3NlcXNbX19rKytdID0gKl9fcmFpaTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworCV9HTElCQ1hYX0NBTEwoX190b3RhbF9sZW5ndGgpCisKKwlfX2xlbmd0aCA9IHN0ZDo6bWluPF9EaWZmZXJlbmNlVHA+KF9fbGVuZ3RoLCBfX3RvdGFsX2xlbmd0aCk7CisKKwlpZiAoX190b3RhbF9sZW5ndGggPT0gMCB8fCBfX2sgPT0gMCkKKwkgIHsKKwkgICAgZGVsZXRlW10gX19uZV9zZXFzOworCSAgICByZXR1cm4gX190YXJnZXQ7CisJICB9CisKKwlzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8X0RpZmZlcmVuY2VUeXBlLCBfRGlmZmVyZW5jZVR5cGU+ID4qIF9fcGllY2VzOworCisJX19udW1fdGhyZWFkcyA9IHN0YXRpY19jYXN0PF9UaHJlYWRJbmRleD4KKyAgICAgICAgICAoc3RkOjptaW48X0RpZmZlcmVuY2VUeXBlPihfX251bV90aHJlYWRzLCBfX3RvdGFsX2xlbmd0aCkpOworCisjICAgICAgIHByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMgKF9fbnVtX3RocmVhZHMpCisJeworIyAgICAgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJICB7CisJICAgIF9fbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisJICAgIC8vIFRocmVhZCBfX3Qgd2lsbCBoYXZlIHRvIG1lcmdlIHBpZWNlc1tfX2lhbV1bMC4uX19rIC0gMV0KKwkgICAgX19waWVjZXMgPSBuZXcgc3RkOjp2ZWN0b3I8CisJICAgIHN0ZDo6cGFpcjxfRGlmZmVyZW5jZVR5cGUsIF9EaWZmZXJlbmNlVHlwZT4gPltfX251bV90aHJlYWRzXTsKKwkgICAgZm9yIChfVGhyZWFkSW5kZXggX19zID0gMDsgX19zIDwgX19udW1fdGhyZWFkczsgKytfX3MpCisJICAgICAgX19waWVjZXNbX19zXS5yZXNpemUoX19rKTsKKworCSAgICBfRGlmZmVyZW5jZVR5cGUgX19udW1fc2FtcGxlcyA9CisJICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubWVyZ2Vfb3ZlcnNhbXBsaW5nCisJICAgICAgKiBfX251bV90aHJlYWRzOworCisJICAgIF9fc3BsaXR0ZXIoX19uZV9zZXFzLCBfX25lX3NlcXMgKyBfX2ssIF9fbGVuZ3RoLCBfX3RvdGFsX2xlbmd0aCwKKwkJICAgICAgIF9fY29tcCwgX19waWVjZXMpOworCSAgfSAvL3NpbmdsZQorCisJICBfVGhyZWFkSW5kZXggX19pYW0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKworCSAgX0RpZmZlcmVuY2VUeXBlIF9fdGFyZ2V0X3Bvc2l0aW9uID0gMDsKKworCSAgZm9yIChfU2VxTnVtYmVyIF9fYyA9IDA7IF9fYyA8IF9fazsgKytfX2MpCisJICAgIF9fdGFyZ2V0X3Bvc2l0aW9uICs9IF9fcGllY2VzW19faWFtXVtfX2NdLmZpcnN0OworCisJICBzZXFfdHlwZSogX19jaHVua3MgPSBuZXcgc2VxX3R5cGVbX19rXTsKKworCSAgZm9yIChfU2VxTnVtYmVyIF9fcyA9IDA7IF9fcyA8IF9fazsgKytfX3MpCisJICAgIF9fY2h1bmtzW19fc10gPSBzdGQ6Om1ha2VfcGFpcihfX25lX3NlcXNbX19zXS5maXJzdAorCQkJCQkgICArIF9fcGllY2VzW19faWFtXVtfX3NdLmZpcnN0LAorCQkJCQkgICBfX25lX3NlcXNbX19zXS5maXJzdAorCQkJCQkgICArIF9fcGllY2VzW19faWFtXVtfX3NdLnNlY29uZCk7CisKKwkgIGlmKF9fbGVuZ3RoID4gX190YXJnZXRfcG9zaXRpb24pCisJICAgIF9fc2VxdWVudGlhbF9tdWx0aXdheV9tZXJnZTxfX3N0YWJsZSwgX19zZW50aW5lbHM+CisJICAgICAgKF9fY2h1bmtzLCBfX2NodW5rcyArIF9faywgX190YXJnZXQgKyBfX3RhcmdldF9wb3NpdGlvbiwKKwkgICAgICAgKihfX3NlcXNfYmVnaW4tPnNlY29uZCksIF9fbGVuZ3RoIC0gX190YXJnZXRfcG9zaXRpb24sIF9fY29tcCk7CisKKwkgIGRlbGV0ZVtdIF9fY2h1bmtzOworCX0gLy8gcGFyYWxsZWwKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoCisgICAgICAgICAgX19pc19zb3J0ZWQoX190YXJnZXQsIF9fdGFyZ2V0ICsgX19sZW5ndGgsIF9fY29tcCkpOworI2VuZGlmCisKKwlfX2sgPSAwOworCS8vIFVwZGF0ZSBlbmRzIG9mIHNlcXVlbmNlcy4KKwlmb3IgKF9SQUl0ZXJJdGVyYXRvciBfX3JhaWkgPSBfX3NlcXNfYmVnaW47CisgICAgICAgICAgICAgX19yYWlpICE9IF9fc2Vxc19lbmQ7ICsrX19yYWlpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGggPSBfR0xJQkNYWF9QQVJBTExFTF9MRU5HVEgoKl9fcmFpaSk7CisgICAgICAgICAgICBpZihfX2xlbmd0aCA+IDApCisgICAgICAgICAgICAgICgqX19yYWlpKS5maXJzdCArPSBfX3BpZWNlc1tfX251bV90aHJlYWRzIC0gMV1bX19rKytdLnNlY29uZDsKKyAgICAgICAgICB9CisKKwlkZWxldGVbXSBfX3BpZWNlczsKKwlkZWxldGVbXSBfX25lX3NlcXM7CisKKwlyZXR1cm4gX190YXJnZXQgKyBfX2xlbmd0aDsKKyAgICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIE11bHRpd2F5IE1lcmdlIEZyb250ZW5kLgorICAgKgorICAgKiBNZXJnZSB0aGUgc2VxdWVuY2VzIHNwZWNpZmllZCBieSBzZXFzX2JlZ2luIGFuZCBfX3NlcXNfZW5kIGludG8KKyAgICogX190YXJnZXQuICBfX3NlcXNfYmVnaW4gYW5kIF9fc2Vxc19lbmQgbXVzdCBwb2ludCB0byBhIHNlcXVlbmNlIG9mCisgICAqIHBhaXJzLiAgVGhlc2UgcGFpcnMgbXVzdCBjb250YWluIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcKKyAgICogb2YgYSBzZXF1ZW5jZSBpbiB0aGVpciBmaXJzdCBlbnRyeSBhbmQgYW4gaXRlcmF0b3IgdGhlIF9NX2VuZCBvZgorICAgKiB0aGUgc2FtZSBzZXF1ZW5jZSBpbiB0aGVpciBzZWNvbmQgZW50cnkuCisgICAqCisgICAqIFRpZXMgYXJlIGJyb2tlbiBhcmJpdHJhcmlseS4gIFNlZSBzdGFibGVfbXVsdGl3YXlfbWVyZ2UgZm9yIGEgdmFyaWFudAorICAgKiB0aGF0IGJyZWFrcyB0aWVzIGJ5IHNlcXVlbmNlIG51bWJlciBidXQgaXMgc2xvd2VyLgorICAgKgorICAgKiBUaGUgZmlyc3QgZW50cmllcyBvZiB0aGUgcGFpcnMgKGkuZS4gdGhlIGJlZ2luIGl0ZXJhdG9ycykgd2lsbCBiZSBtb3ZlZAorICAgKiBmb3J3YXJkLgorICAgKgorICAgKiBUaGUgb3V0cHV0IHNlcXVlbmNlIGhhcyB0byBwcm92aWRlIGVub3VnaCBzcGFjZSBmb3IgYWxsIGVsZW1lbnRzCisgICAqIHRoYXQgYXJlIHdyaXR0ZW4gdG8gaXQuCisgICAqCisgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBtZXJnZSB0aGUgaW5wdXQgc2VxdWVuY2VzOgorICAgKgorICAgKiAtIG5vdCBzdGFibGUKKyAgICogLSBwYXJhbGxlbCwgZGVwZW5kaW5nIG9uIHRoZSBpbnB1dCBzaXplIGFuZCBTZXR0aW5ncworICAgKiAtIHVzaW5nIHNhbXBsaW5nIGZvciBzcGxpdHRpbmcKKyAgICogLSBub3QgdXNpbmcgc2VudGluZWxzCisgICAqCisgICAqIEV4YW1wbGU6CisgICAqCisgICAqIDxwcmU+CisgICAqICAgaW50IHNlcXVlbmNlc1sxMF1bMTBdOworICAgKiAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IDEwOyArK19faSkKKyAgICogICAgIGZvciAoaW50IF9faiA9IDA7IF9faSA8IDEwOyArK19faikKKyAgICogICAgICAgc2VxdWVuY2VzW19faV1bX19qXSA9IF9fajsKKyAgICoKKyAgICogICBpbnQgX19vdXRbMzNdOworICAgKiAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQqPiA+IHNlcXM7CisgICAqICAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgMTA7ICsrX19pKQorICAgKiAgICAgeyBzZXFzLnB1c2goc3RkOjptYWtlX3BhaXI8aW50Kj4oc2VxdWVuY2VzW19faV0sCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZXNbX19pXSArIDEwKSkgfQorICAgKgorICAgKiAgIG11bHRpd2F5X21lcmdlKHNlcXMuYmVnaW4oKSwgc2Vxcy5lbmQoKSwgX190YXJnZXQsIHN0ZDo6bGVzczxpbnQ+KCksIDMzKTsKKyAgICogPC9wcmU+CisgICAqCisgICAqIEBzZWUgc3RhYmxlX211bHRpd2F5X21lcmdlCisgICAqCisgICAqIEBwcmUgQWxsIGlucHV0IHNlcXVlbmNlcyBtdXN0IGJlIHNvcnRlZC4KKyAgICogQHByZSBUYXJnZXQgbXVzdCBwcm92aWRlIGVub3VnaCBzcGFjZSB0byBtZXJnZSBvdXQgbGVuZ3RoIGVsZW1lbnRzIG9yCisgICAqICAgIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYWxsIHNlcXVlbmNlcywgd2hpY2hldmVyIGlzIHNtYWxsZXIuCisgICAqCisgICAqIEBwb3N0IFtfX3RhcmdldCwgcmV0dXJuIF9fdmFsdWUpIGNvbnRhaW5zIG1lcmdlZCBfX2VsZW1lbnRzIGZyb20gdGhlCisgICAqICAgIGlucHV0IHNlcXVlbmNlcy4KKyAgICogQHBvc3QgcmV0dXJuIF9fdmFsdWUgLSBfX3RhcmdldCA9IG1pbihfX2xlbmd0aCwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFsbAorICAgKiAgICBzZXF1ZW5jZXMpLgorICAgKgorICAgKiBAdHBhcmFtIF9SQUl0ZXJQYWlySXRlcmF0b3IgaXRlcmF0b3Igb3ZlciBzZXF1ZW5jZQorICAgKiAgICBvZiBwYWlycyBvZiBpdGVyYXRvcnMKKyAgICogQHRwYXJhbSBfUkFJdGVyT3V0IGl0ZXJhdG9yIG92ZXIgdGFyZ2V0IHNlcXVlbmNlCisgICAqIEB0cGFyYW0gX0RpZmZlcmVuY2VUcCBkaWZmZXJlbmNlIHR5cGUgZm9yIHRoZSBzZXF1ZW5jZQorICAgKiBAdHBhcmFtIF9Db21wYXJlIHN0cmljdCB3ZWFrIG9yZGVyaW5nIHR5cGUgdG8gY29tcGFyZSBlbGVtZW50cworICAgKiAgICBpbiBzZXF1ZW5jZXMKKyAgICoKKyAgICogQHBhcmFtIF9fc2Vxc19iZWdpbiAgX19iZWdpbiBvZiBzZXF1ZW5jZSBfX3NlcXVlbmNlCisgICAqIEBwYXJhbSBfX3NlcXNfZW5kICAgIF9NX2VuZCBvZiBzZXF1ZW5jZSBfX3NlcXVlbmNlCisgICAqIEBwYXJhbSBfX3RhcmdldCAgICAgIHRhcmdldCBzZXF1ZW5jZSB0byBtZXJnZSB0by4KKyAgICogQHBhcmFtIF9fY29tcCAgICAgICAgc3RyaWN0IHdlYWsgb3JkZXJpbmcgdG8gdXNlIGZvciBlbGVtZW50IGNvbXBhcmlzb24uCisgICAqIEBwYXJhbSBfX2xlbmd0aCBNYXhpbXVtIGxlbmd0aCB0byBtZXJnZSwgcG9zc2libHkgbGFyZ2VyIHRoYW4gdGhlCisgICAqIG51bWJlciBvZiBlbGVtZW50cyBhdmFpbGFibGUuCisgICAqCisgICAqIEByZXR1cm4gX01fZW5kIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZQorICAgKi8KKyAgLy8gbXVsdGl3YXlfbWVyZ2UKKyAgLy8gcHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyUGFpckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJPdXQsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyT3V0CisgICAgbXVsdGl3YXlfbWVyZ2UoX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCSAgIF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJICAgX1JBSXRlck91dCBfX3RhcmdldCwKKwkJICAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wLAorCQkgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbikKKworICAgICAgLy8gY2F0Y2ggc3BlY2lhbCBjYXNlOiBubyBzZXF1ZW5jZXMKKyAgICAgIGlmIChfX3NlcXNfYmVnaW4gPT0gX19zZXFzX2VuZCkKKwlyZXR1cm4gX190YXJnZXQ7CisKKyAgICAgIC8vIEV4ZWN1dGUgbXVsdGl3YXkgbWVyZ2UgKnNlcXVlbnRpYWxseSouCisgICAgICByZXR1cm4gX19zZXF1ZW50aWFsX211bHRpd2F5X21lcmdlCisJPC8qIF9fc3RhYmxlID0gKi8gZmFsc2UsIC8qIF9fc2VudGluZWxzID0gKi8gZmFsc2U+CisJKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsCisJICooX19zZXFzX2JlZ2luLT5zZWNvbmQpLCBfX2xlbmd0aCwgX19jb21wKTsKKyAgICB9CisKKyAgLy8gcHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyUGFpckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJPdXQsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyT3V0CisgICAgbXVsdGl3YXlfbWVyZ2UoX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCSAgIF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJICAgX1JBSXRlck91dCBfX3RhcmdldCwKKwkJICAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wLAorCQkgICBfX2dudV9wYXJhbGxlbDo6ZXhhY3RfdGFnIF9fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pCisKKyAgICAgIC8vIGNhdGNoIHNwZWNpYWwgY2FzZTogbm8gc2VxdWVuY2VzCisgICAgICBpZiAoX19zZXFzX2JlZ2luID09IF9fc2Vxc19lbmQpCisJcmV0dXJuIF9fdGFyZ2V0OworCisgICAgICAvLyBFeGVjdXRlIG1lcmdlOyBtYXliZSBwYXJhbGxlbCwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgbWVyZ2VkCisgICAgICAvLyBlbGVtZW50cyBhbmQgdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgYW5kIGdsb2JhbCB0aHJlc2hvbGRzIGluCisgICAgICAvLyBTZXR0aW5ncy4KKyAgICAgIGlmICgoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbiA+IDEpCisJICAmJiBfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICAoKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pID49CisgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5tdWx0aXdheV9tZXJnZV9taW5pbWFsX2spCisgICAgICAgICAgICAmJiAoKF9TZXF1ZW5jZUluZGV4KV9fbGVuZ3RoID49CisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm11bHRpd2F5X21lcmdlX21pbmltYWxfbikpKQorCXJldHVybiBwYXJhbGxlbF9tdWx0aXdheV9tZXJnZQorCSAgPC8qIF9fc3RhYmxlID0gKi8gZmFsc2UsIC8qIF9fc2VudGluZWxzID0gKi8gZmFsc2U+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICBtdWx0aXdheV9tZXJnZV9leGFjdF9zcGxpdHRpbmc8LyogX19zdGFibGUgPSAqLyBmYWxzZSwKKwkgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyUGFpckl0ZXJhdG9yPgorCSAgIDo6dmFsdWVfdHlwZSosIF9Db21wYXJlLCBfRGlmZmVyZW5jZVRwPiwKKwkgICBzdGF0aWNfY2FzdDxfRGlmZmVyZW5jZVR5cGU+KF9fbGVuZ3RoKSwgX19jb21wLAorCSAgIF9fdGFnLl9fZ2V0X251bV90aHJlYWRzKCkpOworICAgICAgZWxzZQorCXJldHVybiBfX3NlcXVlbnRpYWxfbXVsdGl3YXlfbWVyZ2UKKwkgIDwvKiBfX3N0YWJsZSA9ICovIGZhbHNlLCAvKiBfX3NlbnRpbmVscyA9ICovIGZhbHNlPgorCSAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsCisJICAgKihfX3NlcXNfYmVnaW4tPnNlY29uZCksIF9fbGVuZ3RoLCBfX2NvbXApOworICAgIH0KKworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJQYWlySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlck91dCwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXJPdXQKKyAgICBtdWx0aXdheV9tZXJnZShfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJICAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkgICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCSAgIF9fZ251X3BhcmFsbGVsOjpzYW1wbGluZ190YWcgX190YWcpCisgICAgeworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbikKKworICAgICAgLy8gY2F0Y2ggc3BlY2lhbCBjYXNlOiBubyBzZXF1ZW5jZXMKKyAgICAgIGlmIChfX3NlcXNfYmVnaW4gPT0gX19zZXFzX2VuZCkKKwlyZXR1cm4gX190YXJnZXQ7CisKKyAgICAgIC8vIEV4ZWN1dGUgbWVyZ2U7IG1heWJlIHBhcmFsbGVsLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBtZXJnZWQKKyAgICAgIC8vIGVsZW1lbnRzIGFuZCB0aGUgbnVtYmVyIG9mIHNlcXVlbmNlcyBhbmQgZ2xvYmFsIHRocmVzaG9sZHMgaW4KKyAgICAgIC8vIFNldHRpbmdzLgorICAgICAgaWYgKChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luID4gMSkKKwkgICYmIF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgICgoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbikgPj0KKyAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm11bHRpd2F5X21lcmdlX21pbmltYWxfaykKKyAgICAgICAgICAgICYmICgoX1NlcXVlbmNlSW5kZXgpX19sZW5ndGggPj0KKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubXVsdGl3YXlfbWVyZ2VfbWluaW1hbF9uKSkpCisJcmV0dXJuIHBhcmFsbGVsX211bHRpd2F5X21lcmdlCisJICA8LyogX19zdGFibGUgPSAqLyBmYWxzZSwgLyogX19zZW50aW5lbHMgPSAqLyBmYWxzZT4KKwkgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LAorCSAgIG11bHRpd2F5X21lcmdlX2V4YWN0X3NwbGl0dGluZzwvKiBfX3N0YWJsZSA9ICovIGZhbHNlLAorCSAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJQYWlySXRlcmF0b3I+CisJICAgOjp2YWx1ZV90eXBlKiwgX0NvbXBhcmUsIF9EaWZmZXJlbmNlVHA+LAorCSAgIHN0YXRpY19jYXN0PF9EaWZmZXJlbmNlVHlwZT4oX19sZW5ndGgpLCBfX2NvbXAsCisJICAgX190YWcuX19nZXRfbnVtX3RocmVhZHMoKSk7CisgICAgICBlbHNlCisJcmV0dXJuIF9fc2VxdWVudGlhbF9tdWx0aXdheV9tZXJnZQorCSAgPC8qIF9fc3RhYmxlID0gKi8gZmFsc2UsIC8qIF9fc2VudGluZWxzID0gKi8gZmFsc2U+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICAqKF9fc2Vxc19iZWdpbi0+c2Vjb25kKSwgX19sZW5ndGgsIF9fY29tcCk7CisgICAgfQorCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIG11bHRpd2F5X21lcmdlKF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkgICBfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCSAgIF9SQUl0ZXJPdXQgX190YXJnZXQsCisJCSAgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCwKKwkJICAgcGFyYWxsZWxfdGFnIF9fdGFnID0gcGFyYWxsZWxfdGFnKDApKQorICAgIHsgcmV0dXJuIG11bHRpd2F5X21lcmdlKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fbGVuZ3RoLAorCQkJICAgIF9fY29tcCwgZXhhY3RfdGFnKF9fdGFnLl9fZ2V0X251bV90aHJlYWRzKCkpKTsgfQorCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIG11bHRpd2F5X21lcmdlKF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkgICBfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCSAgIF9SQUl0ZXJPdXQgX190YXJnZXQsCisJCSAgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCwKKwkJICAgZGVmYXVsdF9wYXJhbGxlbF90YWcgX190YWcpCisgICAgeyByZXR1cm4gbXVsdGl3YXlfbWVyZ2UoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwgX19sZW5ndGgsCisJCQkgICAgX19jb21wLCBleGFjdF90YWcoX190YWcuX19nZXRfbnVtX3RocmVhZHMoKSkpOyB9CisKKyAgLy8gc3RhYmxlX211bHRpd2F5X21lcmdlCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIHN0YWJsZV9tdWx0aXdheV9tZXJnZShfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCSAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCQkgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworICAgICAgX0dMSUJDWFhfQ0FMTChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKQorCisgICAgICAvLyBjYXRjaCBzcGVjaWFsIGNhc2U6IG5vIHNlcXVlbmNlcworICAgICAgaWYgKF9fc2Vxc19iZWdpbiA9PSBfX3NlcXNfZW5kKQorCXJldHVybiBfX3RhcmdldDsKKworICAgICAgLy8gRXhlY3V0ZSBtdWx0aXdheSBtZXJnZSAqc2VxdWVudGlhbGx5Ki4KKyAgICAgIHJldHVybiBfX3NlcXVlbnRpYWxfbXVsdGl3YXlfbWVyZ2UKKwk8LyogX19zdGFibGUgPSAqLyB0cnVlLCAvKiBfX3NlbnRpbmVscyA9ICovIGZhbHNlPgorICAgICAgICAgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LAorCSAgICooX19zZXFzX2JlZ2luLT5zZWNvbmQpLCBfX2xlbmd0aCwgX19jb21wKTsKKyAgICB9CisKKyAgLy8gcHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyUGFpckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJPdXQsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyT3V0CisgICAgc3RhYmxlX211bHRpd2F5X21lcmdlKF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkJICBfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkgIF9SQUl0ZXJPdXQgX190YXJnZXQsCisJCQkgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCwKKwkJCSAgX19nbnVfcGFyYWxsZWw6OmV4YWN0X3RhZyBfX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworICAgICAgX0dMSUJDWFhfQ0FMTChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKQorCisgICAgICAvLyBjYXRjaCBzcGVjaWFsIGNhc2U6IG5vIHNlcXVlbmNlcworICAgICAgaWYgKF9fc2Vxc19iZWdpbiA9PSBfX3NlcXNfZW5kKQorCXJldHVybiBfX3RhcmdldDsKKworICAgICAgLy8gRXhlY3V0ZSBtZXJnZTsgbWF5YmUgcGFyYWxsZWwsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIG1lcmdlZAorICAgICAgLy8gZWxlbWVudHMgYW5kIHRoZSBudW1iZXIgb2Ygc2VxdWVuY2VzIGFuZCBnbG9iYWwgdGhyZXNob2xkcyBpbgorICAgICAgLy8gU2V0dGluZ3MuCisgICAgICBpZiAoKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4gPiAxKQorCSAgJiYgX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgKChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKSA+PQorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5tdWx0aXdheV9tZXJnZV9taW5pbWFsX2spCisgICAgICAgICAgICAmJiAoKF9TZXF1ZW5jZUluZGV4KV9fbGVuZ3RoID49CisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm11bHRpd2F5X21lcmdlX21pbmltYWxfbikpKQorCXJldHVybiBwYXJhbGxlbF9tdWx0aXdheV9tZXJnZQorICAgICAgICAgIDwvKiBfX3N0YWJsZSA9ICovIHRydWUsIC8qIF9fc2VudGluZWxzID0gKi8gZmFsc2U+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICBtdWx0aXdheV9tZXJnZV9leGFjdF9zcGxpdHRpbmc8LyogX19zdGFibGUgPSAqLyB0cnVlLAorCSAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJQYWlySXRlcmF0b3I+CisJICAgOjp2YWx1ZV90eXBlKiwgX0NvbXBhcmUsIF9EaWZmZXJlbmNlVHA+LAorCSAgIHN0YXRpY19jYXN0PF9EaWZmZXJlbmNlVHlwZT4oX19sZW5ndGgpLCBfX2NvbXAsCisJICAgX190YWcuX19nZXRfbnVtX3RocmVhZHMoKSk7CisgICAgICBlbHNlCisJcmV0dXJuIF9fc2VxdWVudGlhbF9tdWx0aXdheV9tZXJnZQorCSAgPC8qIF9fc3RhYmxlID0gKi8gdHJ1ZSwgLyogX19zZW50aW5lbHMgPSAqLyBmYWxzZT4KKwkgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LAorCSAgICooX19zZXFzX2JlZ2luLT5zZWNvbmQpLCBfX2xlbmd0aCwgX19jb21wKTsKKyAgICB9CisKKyAgLy8gcHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyUGFpckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJPdXQsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyT3V0CisgICAgc3RhYmxlX211bHRpd2F5X21lcmdlKF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkJICBfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkgIF9SQUl0ZXJPdXQgX190YXJnZXQsCisJCQkgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCwKKwkJCSAgc2FtcGxpbmdfdGFnIF9fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pCisKKyAgICAgIC8vIGNhdGNoIHNwZWNpYWwgY2FzZTogbm8gc2VxdWVuY2VzCisgICAgICBpZiAoX19zZXFzX2JlZ2luID09IF9fc2Vxc19lbmQpCisJcmV0dXJuIF9fdGFyZ2V0OworCisgICAgICAvLyBFeGVjdXRlIG1lcmdlOyBtYXliZSBwYXJhbGxlbCwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgbWVyZ2VkCisgICAgICAvLyBlbGVtZW50cyBhbmQgdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgYW5kIGdsb2JhbCB0aHJlc2hvbGRzIGluCisgICAgICAvLyBTZXR0aW5ncy4KKyAgICAgIGlmICgoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbiA+IDEpCisJICAmJiBfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICAoKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pID49CisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm11bHRpd2F5X21lcmdlX21pbmltYWxfaykKKyAgICAgICAgICAgICYmICgoX1NlcXVlbmNlSW5kZXgpX19sZW5ndGggPj0KKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubXVsdGl3YXlfbWVyZ2VfbWluaW1hbF9uKSkpCisJcmV0dXJuIHBhcmFsbGVsX211bHRpd2F5X21lcmdlCisgICAgICAgICAgPC8qIF9fc3RhYmxlID0gKi8gdHJ1ZSwgLyogX19zZW50aW5lbHMgPSAqLyBmYWxzZT4KKwkgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LAorCSAgIG11bHRpd2F5X21lcmdlX3NhbXBsaW5nX3NwbGl0dGluZzwvKiBfX3N0YWJsZSA9ICovIHRydWUsCisJICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlclBhaXJJdGVyYXRvcj4KKwkgICA6OnZhbHVlX3R5cGUqLCBfQ29tcGFyZSwgX0RpZmZlcmVuY2VUcD4sCisJICAgc3RhdGljX2Nhc3Q8X0RpZmZlcmVuY2VUeXBlPihfX2xlbmd0aCksIF9fY29tcCwKKwkgICBfX3RhZy5fX2dldF9udW1fdGhyZWFkcygpKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gX19zZXF1ZW50aWFsX211bHRpd2F5X21lcmdlCisgICAgICAgICAgPC8qIF9fc3RhYmxlID0gKi8gdHJ1ZSwgLyogX19zZW50aW5lbHMgPSAqLyBmYWxzZT4KKwkgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LAorCSAgICooX19zZXFzX2JlZ2luLT5zZWNvbmQpLCBfX2xlbmd0aCwgX19jb21wKTsKKyAgICB9CisKKyAgLy8gcHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyUGFpckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJPdXQsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyT3V0CisgICAgc3RhYmxlX211bHRpd2F5X21lcmdlKF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkJICBfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkgIF9SQUl0ZXJPdXQgX190YXJnZXQsCisJCQkgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCwKKwkJCSAgcGFyYWxsZWxfdGFnIF9fdGFnID0gcGFyYWxsZWxfdGFnKDApKQorICAgIHsKKyAgICAgIHJldHVybiBzdGFibGVfbXVsdGl3YXlfbWVyZ2UKKwkoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwgX19sZW5ndGgsIF9fY29tcCwKKwkgZXhhY3RfdGFnKF9fdGFnLl9fZ2V0X251bV90aHJlYWRzKCkpKTsKKyAgICB9CisKKyAgLy8gcHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyUGFpckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJPdXQsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyT3V0CisgICAgc3RhYmxlX211bHRpd2F5X21lcmdlKF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkJICBfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkgIF9SQUl0ZXJPdXQgX190YXJnZXQsCisJCQkgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCwKKwkJCSAgZGVmYXVsdF9wYXJhbGxlbF90YWcgX190YWcpCisgICAgeworICAgICAgcmV0dXJuIHN0YWJsZV9tdWx0aXdheV9tZXJnZQorCShfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LCBfX2xlbmd0aCwgX19jb21wLAorCSBleGFjdF90YWcoX190YWcuX19nZXRfbnVtX3RocmVhZHMoKSkpOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIE11bHRpd2F5IE1lcmdlIEZyb250ZW5kLgorICAgKgorICAgKiBNZXJnZSB0aGUgc2VxdWVuY2VzIHNwZWNpZmllZCBieSBzZXFzX2JlZ2luIGFuZCBfX3NlcXNfZW5kIGludG8KKyAgICogX190YXJnZXQuICBfX3NlcXNfYmVnaW4gYW5kIF9fc2Vxc19lbmQgbXVzdCBwb2ludCB0byBhIHNlcXVlbmNlIG9mCisgICAqIHBhaXJzLiAgVGhlc2UgcGFpcnMgbXVzdCBjb250YWluIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcKKyAgICogb2YgYSBzZXF1ZW5jZSBpbiB0aGVpciBmaXJzdCBlbnRyeSBhbmQgYW4gaXRlcmF0b3IgdGhlIF9NX2VuZCBvZgorICAgKiB0aGUgc2FtZSBzZXF1ZW5jZSBpbiB0aGVpciBzZWNvbmQgZW50cnkuCisgICAqCisgICAqIFRpZXMgYXJlIGJyb2tlbiBhcmJpdHJhcmlseS4gIFNlZSBzdGFibGVfbXVsdGl3YXlfbWVyZ2UgZm9yIGEgdmFyaWFudAorICAgKiB0aGF0IGJyZWFrcyB0aWVzIGJ5IHNlcXVlbmNlIG51bWJlciBidXQgaXMgc2xvd2VyLgorICAgKgorICAgKiBUaGUgZmlyc3QgZW50cmllcyBvZiB0aGUgcGFpcnMgKGkuZS4gdGhlIGJlZ2luIGl0ZXJhdG9ycykgd2lsbCBiZSBtb3ZlZAorICAgKiBmb3J3YXJkIGFjY29yZGluZ2x5LgorICAgKgorICAgKiBUaGUgb3V0cHV0IHNlcXVlbmNlIGhhcyB0byBwcm92aWRlIGVub3VnaCBzcGFjZSBmb3IgYWxsIGVsZW1lbnRzCisgICAqIHRoYXQgYXJlIHdyaXR0ZW4gdG8gaXQuCisgICAqCisgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBtZXJnZSB0aGUgaW5wdXQgc2VxdWVuY2VzOgorICAgKgorICAgKiAtIG5vdCBzdGFibGUKKyAgICogLSBwYXJhbGxlbCwgZGVwZW5kaW5nIG9uIHRoZSBpbnB1dCBzaXplIGFuZCBTZXR0aW5ncworICAgKiAtIHVzaW5nIHNhbXBsaW5nIGZvciBzcGxpdHRpbmcKKyAgICogLSB1c2luZyBzZW50aW5lbHMKKyAgICoKKyAgICogWW91IGhhdmUgdG8gdGFrZSBjYXJlIHRoYXQgdGhlIGVsZW1lbnQgdGhlIF9NX2VuZCBpdGVyYXRvciBwb2ludHMgdG8gaXMKKyAgICogcmVhZGFibGUgYW5kIGNvbnRhaW5zIGEgdmFsdWUgdGhhdCBpcyBncmVhdGVyIHRoYW4gYW55IG90aGVyIG5vbi1zZW50aW5lbAorICAgKiB2YWx1ZSBpbiBhbGwgc2VxdWVuY2VzLgorICAgKgorICAgKiBFeGFtcGxlOgorICAgKgorICAgKiA8cHJlPgorICAgKiAgIGludCBzZXF1ZW5jZXNbMTBdWzExXTsKKyAgICogICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCAxMDsgKytfX2kpCisgICAqICAgICBmb3IgKGludCBfX2ogPSAwOyBfX2kgPCAxMTsgKytfX2opCisgICAqICAgICAgIHNlcXVlbmNlc1tfX2ldW19fal0gPSBfX2o7IC8vIF9fbGFzdCBvbmUgaXMgc2VudGluZWwhCisgICAqCisgICAqICAgaW50IF9fb3V0WzMzXTsKKyAgICogICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50Kj4gPiBzZXFzOworICAgKiAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IDEwOyArK19faSkKKyAgICogICAgIHsgc2Vxcy5wdXNoKHN0ZDo6bWFrZV9wYWlyPGludCo+KHNlcXVlbmNlc1tfX2ldLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VzW19faV0gKyAxMCkpIH0KKyAgICoKKyAgICogICBtdWx0aXdheV9tZXJnZShzZXFzLmJlZ2luKCksIHNlcXMuZW5kKCksIF9fdGFyZ2V0LCBzdGQ6Omxlc3M8aW50PigpLCAzMyk7CisgICAqIDwvcHJlPgorICAgKgorICAgKiBAcHJlIEFsbCBpbnB1dCBzZXF1ZW5jZXMgbXVzdCBiZSBzb3J0ZWQuCisgICAqIEBwcmUgVGFyZ2V0IG11c3QgcHJvdmlkZSBlbm91Z2ggc3BhY2UgdG8gbWVyZ2Ugb3V0IGxlbmd0aCBlbGVtZW50cyBvcgorICAgKiAgICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFsbCBzZXF1ZW5jZXMsIHdoaWNoZXZlciBpcyBzbWFsbGVyLgorICAgKiBAcHJlIEZvciBlYWNoIEBjIF9faSwgQGMgX19zZXFzX2JlZ2luW19faV0uc2Vjb25kIG11c3QgYmUgdGhlIGVuZAorICAgKiAgICBtYXJrZXIgb2YgdGhlIHNlcXVlbmNlLCBidXQgYWxzbyByZWZlcmVuY2UgdGhlIG9uZSBtb3JlIF9fc2VudGluZWwKKyAgICogICAgZWxlbWVudC4KKyAgICoKKyAgICogQHBvc3QgW19fdGFyZ2V0LCByZXR1cm4gX192YWx1ZSkgY29udGFpbnMgbWVyZ2VkIF9fZWxlbWVudHMgZnJvbSB0aGUKKyAgICogICAgaW5wdXQgc2VxdWVuY2VzLgorICAgKiBAcG9zdCByZXR1cm4gX192YWx1ZSAtIF9fdGFyZ2V0ID0gbWluKF9fbGVuZ3RoLCBudW1iZXIgb2YgZWxlbWVudHMgaW4gYWxsCisgICAqICAgIHNlcXVlbmNlcykuCisgICAqCisgICAqIEBzZWUgc3RhYmxlX211bHRpd2F5X21lcmdlX3NlbnRpbmVscworICAgKgorICAgKiBAdHBhcmFtIF9SQUl0ZXJQYWlySXRlcmF0b3IgaXRlcmF0b3Igb3ZlciBzZXF1ZW5jZQorICAgKiAgICBvZiBwYWlycyBvZiBpdGVyYXRvcnMKKyAgICogQHRwYXJhbSBfUkFJdGVyT3V0IGl0ZXJhdG9yIG92ZXIgdGFyZ2V0IHNlcXVlbmNlCisgICAqIEB0cGFyYW0gX0RpZmZlcmVuY2VUcCBkaWZmZXJlbmNlIHR5cGUgZm9yIHRoZSBzZXF1ZW5jZQorICAgKiBAdHBhcmFtIF9Db21wYXJlIHN0cmljdCB3ZWFrIG9yZGVyaW5nIHR5cGUgdG8gY29tcGFyZSBlbGVtZW50cworICAgKiAgICBpbiBzZXF1ZW5jZXMKKyAgICoKKyAgICogQHBhcmFtIF9fc2Vxc19iZWdpbiAgX19iZWdpbiBvZiBzZXF1ZW5jZSBfX3NlcXVlbmNlCisgICAqIEBwYXJhbSBfX3NlcXNfZW5kICAgIF9NX2VuZCBvZiBzZXF1ZW5jZSBfX3NlcXVlbmNlCisgICAqIEBwYXJhbSBfX3RhcmdldCAgICAgIHRhcmdldCBzZXF1ZW5jZSB0byBtZXJnZSB0by4KKyAgICogQHBhcmFtIF9fY29tcCAgICAgICAgc3RyaWN0IHdlYWsgb3JkZXJpbmcgdG8gdXNlIGZvciBlbGVtZW50IGNvbXBhcmlzb24uCisgICAqIEBwYXJhbSBfX2xlbmd0aCBNYXhpbXVtIGxlbmd0aCB0byBtZXJnZSwgcG9zc2libHkgbGFyZ2VyIHRoYW4gdGhlCisgICAqIG51bWJlciBvZiBlbGVtZW50cyBhdmFpbGFibGUuCisgICAqCisgICAqIEByZXR1cm4gX01fZW5kIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZQorICAgKi8KKyAgLy8gbXVsdGl3YXlfbWVyZ2Vfc2VudGluZWxzCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIG11bHRpd2F5X21lcmdlX3NlbnRpbmVscyhfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCSAgICAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJICAgICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJICAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCQkgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworICAgICAgX0dMSUJDWFhfQ0FMTChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKQorCisgICAgICAvLyBjYXRjaCBzcGVjaWFsIGNhc2U6IG5vIHNlcXVlbmNlcworICAgICAgaWYgKF9fc2Vxc19iZWdpbiA9PSBfX3NlcXNfZW5kKQorCXJldHVybiBfX3RhcmdldDsKKworICAgICAgLy8gRXhlY3V0ZSBtdWx0aXdheSBtZXJnZSAqc2VxdWVudGlhbGx5Ki4KKyAgICAgIHJldHVybiBfX3NlcXVlbnRpYWxfbXVsdGl3YXlfbWVyZ2UKKwk8LyogX19zdGFibGUgPSAqLyBmYWxzZSwgLyogX19zZW50aW5lbHMgPSAqLyB0cnVlPgorICAgICAgICAgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsCisgICAgICAgICAgIF9fdGFyZ2V0LCAqKF9fc2Vxc19iZWdpbi0+c2Vjb25kKSwgX19sZW5ndGgsIF9fY29tcCk7CisgICAgfQorCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIG11bHRpd2F5X21lcmdlX3NlbnRpbmVscyhfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCSAgICAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJICAgICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJICAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCQkgICAgIF9fZ251X3BhcmFsbGVsOjpleGFjdF90YWcgX190YWcpCisgICAgeworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbikKKworICAgICAgLy8gY2F0Y2ggc3BlY2lhbCBjYXNlOiBubyBzZXF1ZW5jZXMKKyAgICAgIGlmIChfX3NlcXNfYmVnaW4gPT0gX19zZXFzX2VuZCkKKwlyZXR1cm4gX190YXJnZXQ7CisKKyAgICAgIC8vIEV4ZWN1dGUgbWVyZ2U7IG1heWJlIHBhcmFsbGVsLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBtZXJnZWQKKyAgICAgIC8vIGVsZW1lbnRzIGFuZCB0aGUgbnVtYmVyIG9mIHNlcXVlbmNlcyBhbmQgZ2xvYmFsIHRocmVzaG9sZHMgaW4KKyAgICAgIC8vIFNldHRpbmdzLgorICAgICAgaWYgKChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luID4gMSkKKwkgICYmIF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgICgoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbikgPj0KKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubXVsdGl3YXlfbWVyZ2VfbWluaW1hbF9rKQorICAgICAgICAgICAgJiYgKChfU2VxdWVuY2VJbmRleClfX2xlbmd0aCA+PQorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5tdWx0aXdheV9tZXJnZV9taW5pbWFsX24pKSkKKwlyZXR1cm4gcGFyYWxsZWxfbXVsdGl3YXlfbWVyZ2UKKyAgICAgICAgICA8LyogX19zdGFibGUgPSAqLyBmYWxzZSwgLyogX19zZW50aW5lbHMgPSAqLyB0cnVlPgorCSAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsCisJICAgbXVsdGl3YXlfbWVyZ2VfZXhhY3Rfc3BsaXR0aW5nPC8qIF9fc3RhYmxlID0gKi8gZmFsc2UsCisJICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlclBhaXJJdGVyYXRvcj4KKwkgICA6OnZhbHVlX3R5cGUqLCBfQ29tcGFyZSwgX0RpZmZlcmVuY2VUcD4sCisJICAgc3RhdGljX2Nhc3Q8X0RpZmZlcmVuY2VUeXBlPihfX2xlbmd0aCksIF9fY29tcCwKKwkgICBfX3RhZy5fX2dldF9udW1fdGhyZWFkcygpKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gX19zZXF1ZW50aWFsX211bHRpd2F5X21lcmdlCisgICAgICAgICAgPC8qIF9fc3RhYmxlID0gKi8gZmFsc2UsIC8qIF9fc2VudGluZWxzID0gKi8gdHJ1ZT4KKwkgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LAorCSAgICooX19zZXFzX2JlZ2luLT5zZWNvbmQpLCBfX2xlbmd0aCwgX19jb21wKTsKKyAgICB9CisKKyAgLy8gcHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyUGFpckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJPdXQsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyT3V0CisgICAgbXVsdGl3YXlfbWVyZ2Vfc2VudGluZWxzKF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkJICAgICBfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkgICAgIF9SQUl0ZXJPdXQgX190YXJnZXQsCisJCQkgICAgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCwKKwkJCSAgICAgc2FtcGxpbmdfdGFnIF9fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pCisKKyAgICAgIC8vIGNhdGNoIHNwZWNpYWwgY2FzZTogbm8gc2VxdWVuY2VzCisgICAgICBpZiAoX19zZXFzX2JlZ2luID09IF9fc2Vxc19lbmQpCisJcmV0dXJuIF9fdGFyZ2V0OworCisgICAgICAvLyBFeGVjdXRlIG1lcmdlOyBtYXliZSBwYXJhbGxlbCwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgbWVyZ2VkCisgICAgICAvLyBlbGVtZW50cyBhbmQgdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgYW5kIGdsb2JhbCB0aHJlc2hvbGRzIGluCisgICAgICAvLyBTZXR0aW5ncy4KKyAgICAgIGlmICgoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbiA+IDEpCisJICAmJiBfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICAoKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pID49CisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm11bHRpd2F5X21lcmdlX21pbmltYWxfaykKKyAgICAgICAgICAgICYmICgoX1NlcXVlbmNlSW5kZXgpX19sZW5ndGggPj0KKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubXVsdGl3YXlfbWVyZ2VfbWluaW1hbF9uKSkpCisJcmV0dXJuIHBhcmFsbGVsX211bHRpd2F5X21lcmdlCisgICAgICAgICAgPC8qIF9fc3RhYmxlID0gKi8gZmFsc2UsIC8qIF9fc2VudGluZWxzID0gKi8gdHJ1ZT4KKwkgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LAorCSAgIG11bHRpd2F5X21lcmdlX3NhbXBsaW5nX3NwbGl0dGluZzwvKiBfX3N0YWJsZSA9ICovIGZhbHNlLAorCSAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJQYWlySXRlcmF0b3I+CisJICAgOjp2YWx1ZV90eXBlKiwgX0NvbXBhcmUsIF9EaWZmZXJlbmNlVHA+LAorCSAgIHN0YXRpY19jYXN0PF9EaWZmZXJlbmNlVHlwZT4oX19sZW5ndGgpLCBfX2NvbXAsCisJICAgX190YWcuX19nZXRfbnVtX3RocmVhZHMoKSk7CisgICAgICBlbHNlCisJcmV0dXJuIF9fc2VxdWVudGlhbF9tdWx0aXdheV9tZXJnZQorICAgICAgICAgIDwvKiBfX3N0YWJsZSA9ICovZmFsc2UsIC8qIF9fc2VudGluZWxzID0gKi8gdHJ1ZT4oCisgICAgICAgICAgICBfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LAorCSAgICAqKF9fc2Vxc19iZWdpbi0+c2Vjb25kKSwgX19sZW5ndGgsIF9fY29tcCk7CisgICAgfQorCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIG11bHRpd2F5X21lcmdlX3NlbnRpbmVscyhfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCSAgICAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJICAgICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJICAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCQkgICAgIHBhcmFsbGVsX3RhZyBfX3RhZyA9IHBhcmFsbGVsX3RhZygwKSkKKyAgICB7CisgICAgICByZXR1cm4gbXVsdGl3YXlfbWVyZ2Vfc2VudGluZWxzCisJKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fbGVuZ3RoLCBfX2NvbXAsCisJIGV4YWN0X3RhZyhfX3RhZy5fX2dldF9udW1fdGhyZWFkcygpKSk7CisgICAgfQorCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIG11bHRpd2F5X21lcmdlX3NlbnRpbmVscyhfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCSAgICAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJICAgICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJICAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCQkgICAgIGRlZmF1bHRfcGFyYWxsZWxfdGFnIF9fdGFnKQorICAgIHsKKyAgICAgIHJldHVybiBtdWx0aXdheV9tZXJnZV9zZW50aW5lbHMKKwkoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwgX19sZW5ndGgsIF9fY29tcCwKKwkgZXhhY3RfdGFnKF9fdGFnLl9fZ2V0X251bV90aHJlYWRzKCkpKTsKKyAgICB9CisKKyAgLy8gc3RhYmxlX211bHRpd2F5X21lcmdlX3NlbnRpbmVscworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJQYWlySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlck91dCwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXJPdXQKKyAgICBzdGFibGVfbXVsdGl3YXlfbWVyZ2Vfc2VudGluZWxzKF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkJCSAgICBfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkJICAgIF9SQUl0ZXJPdXQgX190YXJnZXQsCisJCQkJICAgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCwKKwkJCQkgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pCisKKyAgICAgIC8vIGNhdGNoIHNwZWNpYWwgY2FzZTogbm8gc2VxdWVuY2VzCisgICAgICBpZiAoX19zZXFzX2JlZ2luID09IF9fc2Vxc19lbmQpCisJcmV0dXJuIF9fdGFyZ2V0OworCisgICAgICAvLyBFeGVjdXRlIG11bHRpd2F5IG1lcmdlICpzZXF1ZW50aWFsbHkqLgorICAgICAgcmV0dXJuIF9fc2VxdWVudGlhbF9tdWx0aXdheV9tZXJnZQorCTwvKiBfX3N0YWJsZSA9ICovIHRydWUsIC8qIF9fc2VudGluZWxzID0gKi8gdHJ1ZT4KKwkoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgKihfX3NlcXNfYmVnaW4tPnNlY29uZCksIF9fbGVuZ3RoLCBfX2NvbXApOworICAgIH0KKworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJQYWlySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlck91dCwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXJPdXQKKyAgICBzdGFibGVfbXVsdGl3YXlfbWVyZ2Vfc2VudGluZWxzKF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkJCSAgICBfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkJICAgIF9SQUl0ZXJPdXQgX190YXJnZXQsCisJCQkJICAgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCwKKwkJCQkgICAgX19nbnVfcGFyYWxsZWw6OmV4YWN0X3RhZyBfX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworICAgICAgX0dMSUJDWFhfQ0FMTChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKQorCisgICAgICAvLyBjYXRjaCBzcGVjaWFsIGNhc2U6IG5vIHNlcXVlbmNlcworICAgICAgaWYgKF9fc2Vxc19iZWdpbiA9PSBfX3NlcXNfZW5kKQorCXJldHVybiBfX3RhcmdldDsKKworICAgICAgLy8gRXhlY3V0ZSBtZXJnZTsgbWF5YmUgcGFyYWxsZWwsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIG1lcmdlZAorICAgICAgLy8gZWxlbWVudHMgYW5kIHRoZSBudW1iZXIgb2Ygc2VxdWVuY2VzIGFuZCBnbG9iYWwgdGhyZXNob2xkcyBpbgorICAgICAgLy8gU2V0dGluZ3MuCisgICAgICBpZiAoKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4gPiAxKQorCSAgJiYgX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgKChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKSA+PQorICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubXVsdGl3YXlfbWVyZ2VfbWluaW1hbF9rKQorICAgICAgICAgICAgJiYgKChfU2VxdWVuY2VJbmRleClfX2xlbmd0aCA+PQorICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubXVsdGl3YXlfbWVyZ2VfbWluaW1hbF9uKSkpCisJcmV0dXJuIHBhcmFsbGVsX211bHRpd2F5X21lcmdlCisgICAgICAgICAgPC8qIF9fc3RhYmxlID0gKi8gdHJ1ZSwgLyogX19zZW50aW5lbHMgPSAqLyB0cnVlPgorCSAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsCisJICAgbXVsdGl3YXlfbWVyZ2VfZXhhY3Rfc3BsaXR0aW5nPC8qIF9fc3RhYmxlID0gKi8gdHJ1ZSwKKwkgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyUGFpckl0ZXJhdG9yPgorCSAgIDo6dmFsdWVfdHlwZSosIF9Db21wYXJlLCBfRGlmZmVyZW5jZVRwPiwKKwkgICBzdGF0aWNfY2FzdDxfRGlmZmVyZW5jZVR5cGU+KF9fbGVuZ3RoKSwgX19jb21wLAorCSAgIF9fdGFnLl9fZ2V0X251bV90aHJlYWRzKCkpOworICAgICAgZWxzZQorCXJldHVybiBfX3NlcXVlbnRpYWxfbXVsdGl3YXlfbWVyZ2UKKyAgICAgICAgICA8LyogX19zdGFibGUgPSAqLyB0cnVlLCAvKiBfX3NlbnRpbmVscyA9ICovIHRydWU+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICAqKF9fc2Vxc19iZWdpbi0+c2Vjb25kKSwgX19sZW5ndGgsIF9fY29tcCk7CisgICAgfQorCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIHN0YWJsZV9tdWx0aXdheV9tZXJnZV9zZW50aW5lbHMoX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCQkJICAgIF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJCQkgICAgX1JBSXRlck91dCBfX3RhcmdldCwKKwkJCQkgICAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwKKwkJCQkgICAgX0NvbXBhcmUgX19jb21wLAorCQkJCSAgICBzYW1wbGluZ190YWcgX190YWcpCisgICAgeworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbikKKworICAgICAgLy8gY2F0Y2ggc3BlY2lhbCBjYXNlOiBubyBzZXF1ZW5jZXMKKyAgICAgIGlmIChfX3NlcXNfYmVnaW4gPT0gX19zZXFzX2VuZCkKKwlyZXR1cm4gX190YXJnZXQ7CisKKyAgICAgIC8vIEV4ZWN1dGUgbWVyZ2U7IG1heWJlIHBhcmFsbGVsLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBtZXJnZWQKKyAgICAgIC8vIGVsZW1lbnRzIGFuZCB0aGUgbnVtYmVyIG9mIHNlcXVlbmNlcyBhbmQgZ2xvYmFsIHRocmVzaG9sZHMgaW4KKyAgICAgIC8vIFNldHRpbmdzLgorICAgICAgaWYgKChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luID4gMSkKKwkgICYmIF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgICgoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbikgPj0KKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubXVsdGl3YXlfbWVyZ2VfbWluaW1hbF9rKQorICAgICAgICAgICAgJiYgKChfU2VxdWVuY2VJbmRleClfX2xlbmd0aCA+PQorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5tdWx0aXdheV9tZXJnZV9taW5pbWFsX24pKSkKKwlyZXR1cm4gcGFyYWxsZWxfbXVsdGl3YXlfbWVyZ2UKKyAgICAgICAgICA8LyogX19zdGFibGUgPSAqLyB0cnVlLCAvKiBfX3NlbnRpbmVscyA9ICovIHRydWU+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICBtdWx0aXdheV9tZXJnZV9zYW1wbGluZ19zcGxpdHRpbmc8LyogX19zdGFibGUgPSAqLyB0cnVlLAorCSAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJQYWlySXRlcmF0b3I+CisJICAgOjp2YWx1ZV90eXBlKiwgX0NvbXBhcmUsIF9EaWZmZXJlbmNlVHA+LAorCSAgIHN0YXRpY19jYXN0PF9EaWZmZXJlbmNlVHlwZT4oX19sZW5ndGgpLCBfX2NvbXAsCisJICAgX190YWcuX19nZXRfbnVtX3RocmVhZHMoKSk7CisgICAgICBlbHNlCisJcmV0dXJuIF9fc2VxdWVudGlhbF9tdWx0aXdheV9tZXJnZQorICAgICAgICAgIDwvKiBfX3N0YWJsZSA9ICovIHRydWUsIC8qIF9fc2VudGluZWxzID0gKi8gdHJ1ZT4KKwkgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LAorCSAgICooX19zZXFzX2JlZ2luLT5zZWNvbmQpLCBfX2xlbmd0aCwgX19jb21wKTsKKyAgICB9CisKKyAgLy8gcHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyUGFpckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJPdXQsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyT3V0CisgICAgc3RhYmxlX211bHRpd2F5X21lcmdlX3NlbnRpbmVscyhfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCQkgICAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJCSAgICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJCSAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLAorCQkJCSAgICBfQ29tcGFyZSBfX2NvbXAsCisJCQkJICAgIHBhcmFsbGVsX3RhZyBfX3RhZyA9IHBhcmFsbGVsX3RhZygwKSkKKyAgICB7CisgICAgICByZXR1cm4gc3RhYmxlX211bHRpd2F5X21lcmdlX3NlbnRpbmVscworCShfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LCBfX2xlbmd0aCwgX19jb21wLAorCSBleGFjdF90YWcoX190YWcuX19nZXRfbnVtX3RocmVhZHMoKSkpOworICAgIH0KKworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJQYWlySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlck91dCwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXJPdXQKKyAgICBzdGFibGVfbXVsdGl3YXlfbWVyZ2Vfc2VudGluZWxzKF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkJCSAgICBfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkJICAgIF9SQUl0ZXJPdXQgX190YXJnZXQsCisJCQkJICAgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCwKKwkJCQkgICAgZGVmYXVsdF9wYXJhbGxlbF90YWcgX190YWcpCisgICAgeworICAgICAgcmV0dXJuIHN0YWJsZV9tdWx0aXdheV9tZXJnZV9zZW50aW5lbHMKKwkoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwgX19sZW5ndGgsIF9fY29tcCwKKwkgZXhhY3RfdGFnKF9fdGFnLl9fZ2V0X251bV90aHJlYWRzKCkpKTsKKyAgICB9Cit9OyAvLyBuYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX01VTFRJV0FZX01FUkdFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbXVsdGl3YXlfbWVyZ2Vzb3J0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL211bHRpd2F5X21lcmdlc29ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NWNlYzIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL211bHRpd2F5X21lcmdlc29ydC5oCkBAIC0wLDAgKzEsNDgwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvbXVsdGl3YXlfbWVyZ2Vzb3J0LmgKKyAqICBAYnJpZWYgUGFyYWxsZWwgbXVsdGl3YXkgbWVyZ2Ugc29ydC4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfTVVMVElXQVlfTUVSR0VTT1JUX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfTVVMVElXQVlfTUVSR0VTT1JUX0ggMQorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8cGFyYWxsZWwvYmFzaWNfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvcGFyYWxsZWwuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9tdWx0aXdheV9tZXJnZS5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLyoqIEBicmllZiBTdWJzZXF1ZW5jZSBkZXNjcmlwdGlvbi4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0RpZmZlcmVuY2VUcD4KKyAgICBzdHJ1Y3QgX1BpZWNlCisgICAgeworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgLyoqIEBicmllZiBCZWdpbiBvZiBzdWJzZXF1ZW5jZS4gKi8KKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfTV9iZWdpbjsKKworICAgICAgLyoqIEBicmllZiBFbmQgb2Ygc3Vic2VxdWVuY2UuICovCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX01fZW5kOworICAgIH07CisKKyAgLyoqIEBicmllZiBEYXRhIGFjY2Vzc2VkIGJ5IGFsbCB0aHJlYWRzLgorICAgKgorICAgKiAgUE1XTVMgPSBwYXJhbGxlbCBtdWx0aXdheSBtZXJnZXNvcnQgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICBzdHJ1Y3QgX1BNV01TU29ydGluZ0RhdGEKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgLyoqIEBicmllZiBOdW1iZXIgb2YgdGhyZWFkcyBpbnZvbHZlZC4gKi8KKyAgICAgIF9UaHJlYWRJbmRleCBfTV9udW1fdGhyZWFkczsKKworICAgICAgLyoqIEBicmllZiBJbnB1dCBfX2JlZ2luLiAqLworICAgICAgX1JBSXRlciBfTV9zb3VyY2U7CisKKyAgICAgIC8qKiBAYnJpZWYgU3RhcnQgaW5kaWNlcywgcGVyIHRocmVhZC4gKi8KKyAgICAgIF9EaWZmZXJlbmNlVHlwZSogX01fc3RhcnRzOworCisgICAgICAvKiogQGJyaWVmIFN0b3JhZ2UgaW4gd2hpY2ggdG8gc29ydC4gKi8KKyAgICAgIF9WYWx1ZVR5cGUqKiBfTV90ZW1wb3Jhcnk7CisKKyAgICAgIC8qKiBAYnJpZWYgU2FtcGxlcy4gKi8KKyAgICAgIF9WYWx1ZVR5cGUqIF9NX3NhbXBsZXM7CisKKyAgICAgIC8qKiBAYnJpZWYgT2Zmc2V0cyB0byBhZGQgdG8gdGhlIGZvdW5kIHBvc2l0aW9ucy4gKi8KKyAgICAgIF9EaWZmZXJlbmNlVHlwZSogX01fb2Zmc2V0czsKKworICAgICAgLyoqIEBicmllZiBQaWVjZXMgb2YgZGF0YSB0byBtZXJnZSBAYyBbdGhyZWFkXVtfX3NlcXVlbmNlXSAqLworICAgICAgc3RkOjp2ZWN0b3I8X1BpZWNlPF9EaWZmZXJlbmNlVHlwZT4gPiogX01fcGllY2VzOworICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIFNlbGVjdCBfTV9zYW1wbGVzIGZyb20gYSBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX3NkIFBvaW50ZXIgdG8gYWxnb3JpdGhtIGRhdGEuIF9SZXN1bHQgd2lsbCBiZSBwbGFjZWQgaW4KKyAgICogIEBjIF9fc2QtPl9NX3NhbXBsZXMuCisgICAqICBAcGFyYW0gX19udW1fc2FtcGxlcyBOdW1iZXIgb2YgX01fc2FtcGxlcyB0byBzZWxlY3QuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwPgorICAgIHZvaWQKKyAgICBfX2RldGVybWluZV9zYW1wbGVzKF9QTVdNU1NvcnRpbmdEYXRhPF9SQUl0ZXI+KiBfX3NkLAorCQkJX0RpZmZlcmVuY2VUcCBfX251bV9zYW1wbGVzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfVGhyZWFkSW5kZXggX19pYW0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlKiBfX2VzID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX251bV9zYW1wbGVzICsgMl07CisKKyAgICAgIF9fZXF1YWxseV9zcGxpdChfX3NkLT5fTV9zdGFydHNbX19pYW0gKyAxXSAtIF9fc2QtPl9NX3N0YXJ0c1tfX2lhbV0sIAorCQkgICAgICBfX251bV9zYW1wbGVzICsgMSwgX19lcyk7CisKKyAgICAgIGZvciAoX0RpZmZlcmVuY2VUeXBlIF9faSA9IDA7IF9faSA8IF9fbnVtX3NhbXBsZXM7ICsrX19pKQorCTo6bmV3KCYoX19zZC0+X01fc2FtcGxlc1tfX2lhbSAqIF9fbnVtX3NhbXBsZXMgKyBfX2ldKSkKKwkgICAgX1ZhbHVlVHlwZShfX3NkLT5fTV9zb3VyY2VbX19zZC0+X01fc3RhcnRzW19faWFtXQorCQkJCSAgICAgICArIF9fZXNbX19pICsgMV1dKTsKKworICAgICAgZGVsZXRlW10gX19lczsKKyAgICB9CisKKyAgLyoqIEBicmllZiBTcGxpdCBjb25zaXN0ZW50bHkuICovCisgIHRlbXBsYXRlPGJvb2wgX19leGFjdCwgdHlwZW5hbWUgX1JBSXRlciwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX1NvcnRpbmdQbGFjZXNJdGVyYXRvcj4KKyAgICBzdHJ1Y3QgX1NwbGl0Q29uc2lzdGVudGx5CisgICAgeyB9OworCisgIC8qKiBAYnJpZWYgU3BsaXQgYnkgZXhhY3Qgc3BsaXR0aW5nLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZSwKKwkgICB0eXBlbmFtZSBfU29ydGluZ1BsYWNlc0l0ZXJhdG9yPgorICAgIHN0cnVjdCBfU3BsaXRDb25zaXN0ZW50bHk8dHJ1ZSwgX1JBSXRlciwgX0NvbXBhcmUsIF9Tb3J0aW5nUGxhY2VzSXRlcmF0b3I+CisgICAgeworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVGhyZWFkSW5kZXggX19pYW0sCisJCSBfUE1XTVNTb3J0aW5nRGF0YTxfUkFJdGVyPiogX19zZCwKKwkJIF9Db21wYXJlJiBfX2NvbXAsCisJCSBjb25zdCB0eXBlbmFtZQorCQkgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorCQkgX19udW1fc2FtcGxlcykgY29uc3QKKyAgICAgIHsKKyMgICAgICAgcHJhZ21hIG9tcCBiYXJyaWVyCisKKwlzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8X1NvcnRpbmdQbGFjZXNJdGVyYXRvciwKKwkgICAgICAgICAgICAgICAgICAgICAgX1NvcnRpbmdQbGFjZXNJdGVyYXRvcj4gPgorCSAgX19zZXFzKF9fc2QtPl9NX251bV90aHJlYWRzKTsKKwlmb3IgKF9UaHJlYWRJbmRleCBfX3MgPSAwOyBfX3MgPCBfX3NkLT5fTV9udW1fdGhyZWFkczsgX19zKyspCisJICBfX3NlcXNbX19zXSA9IHN0ZDo6bWFrZV9wYWlyKF9fc2QtPl9NX3RlbXBvcmFyeVtfX3NdLAorCQkJCSAgICAgICBfX3NkLT5fTV90ZW1wb3JhcnlbX19zXQorCQkJCSAgICAgICArIChfX3NkLT5fTV9zdGFydHNbX19zICsgMV0KKwkJCQkJICAtIF9fc2QtPl9NX3N0YXJ0c1tfX3NdKSk7CisKKwlzdGQ6OnZlY3RvcjxfU29ydGluZ1BsYWNlc0l0ZXJhdG9yPiBfX29mZnNldHMoX19zZC0+X01fbnVtX3RocmVhZHMpOworCisJLy8gaWYgbm90IGxhc3QgdGhyZWFkCisJaWYgKF9faWFtIDwgX19zZC0+X01fbnVtX3RocmVhZHMgLSAxKQorCSAgbXVsdGlzZXFfcGFydGl0aW9uKF9fc2Vxcy5iZWdpbigpLCBfX3NlcXMuZW5kKCksCisJCQkgICAgIF9fc2QtPl9NX3N0YXJ0c1tfX2lhbSArIDFdLCBfX29mZnNldHMuYmVnaW4oKSwKKwkJCSAgICAgX19jb21wKTsKKworCWZvciAoX1RocmVhZEluZGV4IF9fc2VxID0gMDsgX19zZXEgPCBfX3NkLT5fTV9udW1fdGhyZWFkczsgX19zZXErKykKKwkgIHsKKwkgICAgLy8gZm9yIGVhY2ggc2VxdWVuY2UKKwkgICAgaWYgKF9faWFtIDwgKF9fc2QtPl9NX251bV90aHJlYWRzIC0gMSkpCisJICAgICAgX19zZC0+X01fcGllY2VzW19faWFtXVtfX3NlcV0uX01fZW5kCisJCT0gX19vZmZzZXRzW19fc2VxXSAtIF9fc2Vxc1tfX3NlcV0uZmlyc3Q7CisJICAgIGVsc2UKKwkgICAgICAvLyB2ZXJ5IGVuZCBvZiB0aGlzIHNlcXVlbmNlCisJICAgICAgX19zZC0+X01fcGllY2VzW19faWFtXVtfX3NlcV0uX01fZW5kID0KKwkJX19zZC0+X01fc3RhcnRzW19fc2VxICsgMV0gLSBfX3NkLT5fTV9zdGFydHNbX19zZXFdOworCSAgfQorCisjICAgICAgIHByYWdtYSBvbXAgYmFycmllcgorCisJZm9yIChfVGhyZWFkSW5kZXggX19zZXEgPSAwOyBfX3NlcSA8IF9fc2QtPl9NX251bV90aHJlYWRzOyBfX3NlcSsrKQorCSAgeworCSAgICAvLyBGb3IgZWFjaCBzZXF1ZW5jZS4KKwkgICAgaWYgKF9faWFtID4gMCkKKwkgICAgICBfX3NkLT5fTV9waWVjZXNbX19pYW1dW19fc2VxXS5fTV9iZWdpbiA9CisJCV9fc2QtPl9NX3BpZWNlc1tfX2lhbSAtIDFdW19fc2VxXS5fTV9lbmQ7CisJICAgIGVsc2UKKwkgICAgICAvLyBBYnNvbHV0ZSBiZWdpbm5pbmcuCisJICAgICAgX19zZC0+X01fcGllY2VzW19faWFtXVtfX3NlcV0uX01fYmVnaW4gPSAwOworCSAgfQorICAgICAgfQorICB9OworCisgIC8qKiBAYnJpZWYgU3BsaXQgYnkgc2FtcGxpbmcuICovIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZSwKKwkgICB0eXBlbmFtZSBfU29ydGluZ1BsYWNlc0l0ZXJhdG9yPgorICAgIHN0cnVjdCBfU3BsaXRDb25zaXN0ZW50bHk8ZmFsc2UsIF9SQUl0ZXIsIF9Db21wYXJlLCBfU29ydGluZ1BsYWNlc0l0ZXJhdG9yPgorICAgIHsKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RocmVhZEluZGV4IF9faWFtLAorCQkgX1BNV01TU29ydGluZ0RhdGE8X1JBSXRlcj4qIF9fc2QsCisJCSBfQ29tcGFyZSYgX19jb21wLAorCQkgY29uc3QgdHlwZW5hbWUKKwkJIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKwkJIF9fbnVtX3NhbXBsZXMpIGNvbnN0CisgICAgICB7CisJdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworCV9fZGV0ZXJtaW5lX3NhbXBsZXMoX19zZCwgX19udW1fc2FtcGxlcyk7CisKKyMgICAgICAgcHJhZ21hIG9tcCBiYXJyaWVyCisKKyMgICAgICAgcHJhZ21hIG9tcCBzaW5nbGUKKwlfX2dudV9zZXF1ZW50aWFsOjpzb3J0KF9fc2QtPl9NX3NhbXBsZXMsCisJCQkgICAgICAgX19zZC0+X01fc2FtcGxlcworCQkJICAgICAgICsgKF9fbnVtX3NhbXBsZXMgKiBfX3NkLT5fTV9udW1fdGhyZWFkcyksCisJCQkgICAgICAgX19jb21wKTsKKworIyAgICAgICBwcmFnbWEgb21wIGJhcnJpZXIKKworCWZvciAoX1RocmVhZEluZGV4IF9fcyA9IDA7IF9fcyA8IF9fc2QtPl9NX251bV90aHJlYWRzOyArK19fcykKKwkgIHsKKwkgICAgLy8gRm9yIGVhY2ggc2VxdWVuY2UuCisJICAgIGlmIChfX251bV9zYW1wbGVzICogX19pYW0gPiAwKQorCSAgICAgIF9fc2QtPl9NX3BpZWNlc1tfX2lhbV1bX19zXS5fTV9iZWdpbiA9CisgICAgICAgICAgICAgICAgc3RkOjpsb3dlcl9ib3VuZChfX3NkLT5fTV90ZW1wb3JhcnlbX19zXSwKKwkJCQkgX19zZC0+X01fdGVtcG9yYXJ5W19fc10KKwkJCQkgKyAoX19zZC0+X01fc3RhcnRzW19fcyArIDFdCisJCQkJICAgIC0gX19zZC0+X01fc3RhcnRzW19fc10pLAorCQkJCSBfX3NkLT5fTV9zYW1wbGVzW19fbnVtX3NhbXBsZXMgKiBfX2lhbV0sCisJCQkJIF9fY29tcCkKKyAgICAgICAgICAgICAgICAtIF9fc2QtPl9NX3RlbXBvcmFyeVtfX3NdOworCSAgICBlbHNlCisJICAgICAgLy8gQWJzb2x1dGUgYmVnaW5uaW5nLgorCSAgICAgIF9fc2QtPl9NX3BpZWNlc1tfX2lhbV1bX19zXS5fTV9iZWdpbiA9IDA7CisKKwkgICAgaWYgKChfX251bV9zYW1wbGVzICogKF9faWFtICsgMSkpIDwKKwkJKF9fbnVtX3NhbXBsZXMgKiBfX3NkLT5fTV9udW1fdGhyZWFkcykpCisJICAgICAgX19zZC0+X01fcGllY2VzW19faWFtXVtfX3NdLl9NX2VuZCA9CisgICAgICAgICAgICAgICAgc3RkOjpsb3dlcl9ib3VuZChfX3NkLT5fTV90ZW1wb3JhcnlbX19zXSwKKwkJCQkgX19zZC0+X01fdGVtcG9yYXJ5W19fc10KKwkJCQkgKyAoX19zZC0+X01fc3RhcnRzW19fcyArIDFdCisJCQkJICAgIC0gX19zZC0+X01fc3RhcnRzW19fc10pLAorCQkJCSBfX3NkLT5fTV9zYW1wbGVzW19fbnVtX3NhbXBsZXMgKiAoX19pYW0gKyAxKV0sCisJCQkJIF9fY29tcCkKKyAgICAgICAgICAgICAgICAtIF9fc2QtPl9NX3RlbXBvcmFyeVtfX3NdOworCSAgICBlbHNlCisJICAgICAgLy8gQWJzb2x1dGUgZW5kLgorCSAgICAgIF9fc2QtPl9NX3BpZWNlc1tfX2lhbV1bX19zXS5fTV9lbmQgPSAoX19zZC0+X01fc3RhcnRzW19fcyArIDFdCisJCQkJCQkgICAgLSBfX3NkLT5fTV9zdGFydHNbX19zXSk7CisJICB9CisgICAgICB9CisgIH07CisgIAorICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLCB0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBzdHJ1Y3QgX19wb3NzaWJseV9zdGFibGVfc29ydAorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBzdHJ1Y3QgX19wb3NzaWJseV9zdGFibGVfc29ydDx0cnVlLCBfUkFJdGVyLCBfQ29tcGFyZT4KKyAgICB7CisgICAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgX1JBSXRlciYgX19iZWdpbiwKKwkJICAgICAgY29uc3QgX1JBSXRlciYgX19lbmQsIF9Db21wYXJlJiBfX2NvbXApIGNvbnN0CisgICAgICB7IF9fZ251X3NlcXVlbnRpYWw6OnN0YWJsZV9zb3J0KF9fYmVnaW4sIF9fZW5kLCBfX2NvbXApOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBzdHJ1Y3QgX19wb3NzaWJseV9zdGFibGVfc29ydDxmYWxzZSwgX1JBSXRlciwgX0NvbXBhcmU+CisgICAgeworICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IF9SQUl0ZXIgX19iZWdpbiwKKwkJICAgICAgY29uc3QgX1JBSXRlciBfX2VuZCwgX0NvbXBhcmUmIF9fY29tcCkgY29uc3QKKyAgICAgIHsgX19nbnVfc2VxdWVudGlhbDo6c29ydChfX2JlZ2luLCBfX2VuZCwgX19jb21wKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwgdHlwZW5hbWUgU2VxX1JBSXRlciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZSwKKwkgICB0eXBlbmFtZSBEaWZmVHlwZT4KKyAgICBzdHJ1Y3QgX19wb3NzaWJseV9zdGFibGVfbXVsdGl3YXlfbWVyZ2UKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2VxX1JBSXRlciwgdHlwZW5hbWUgX1JBSXRlciwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0RpZmZUeXBlPgorICAgIHN0cnVjdCBfX3Bvc3NpYmx5X3N0YWJsZV9tdWx0aXdheV9tZXJnZTx0cnVlLCBTZXFfUkFJdGVyLAorCQkJCQkgICAgX1JBSXRlciwgX0NvbXBhcmUsIF9EaWZmVHlwZT4KKyAgICB7CisgICAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgU2VxX1JBSXRlciYgX19zZXFzX2JlZ2luLAorCQkgICAgICBjb25zdCBTZXFfUkFJdGVyJiBfX3NlcXNfZW5kLAorCQkgICAgICBjb25zdCBfUkFJdGVyJiBfX3RhcmdldCwKKwkJICAgICAgX0NvbXBhcmUmIF9fY29tcCwKKwkJICAgICAgX0RpZmZUeXBlIF9fbGVuZ3RoX2FtKSBjb25zdAorICAgICAgeyBzdGFibGVfbXVsdGl3YXlfbWVyZ2UoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkJCSAgICAgIF9fbGVuZ3RoX2FtLCBfX2NvbXAsIHNlcXVlbnRpYWxfdGFnKCkpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBTZXFfUkFJdGVyLCB0eXBlbmFtZSBfUkFJdGVyLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfRGlmZlR5cGU+CisgICAgc3RydWN0IF9fcG9zc2libHlfc3RhYmxlX211bHRpd2F5X21lcmdlPGZhbHNlLCBTZXFfUkFJdGVyLAorCQkJCQkgICAgX1JBSXRlciwgX0NvbXBhcmUsIF9EaWZmVHlwZT4KKyAgICB7CisgICAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgU2VxX1JBSXRlciYgX19zZXFzX2JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcV9SQUl0ZXImIF9fc2Vxc19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JBSXRlciYgX190YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUmIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICBfRGlmZlR5cGUgX19sZW5ndGhfYW0pIGNvbnN0CisgICAgICB7IG11bHRpd2F5X21lcmdlKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fbGVuZ3RoX2FtLAorCQkgICAgICAgX19jb21wLCBzZXF1ZW50aWFsX3RhZygpKTsgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBQTVdNUyBjb2RlIGV4ZWN1dGVkIGJ5IGVhY2ggdGhyZWFkLgorICAgKiAgQHBhcmFtIF9fc2QgUG9pbnRlciB0byBhbGdvcml0aG0gZGF0YS4KKyAgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUsIGJvb2wgX19leGFjdCwgdHlwZW5hbWUgX1JBSXRlciwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgcGFyYWxsZWxfc29ydF9td21zX3B1KF9QTVdNU1NvcnRpbmdEYXRhPF9SQUl0ZXI+KiBfX3NkLAorCQkJICBfQ29tcGFyZSYgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfVGhyZWFkSW5kZXggX19pYW0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKworICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgdGhyZWFkJ3MgY2h1bmssIGJlZm9yZSBtZXJnaW5nLgorICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbGVuZ3RoX2xvY2FsID0KKwlfX3NkLT5fTV9zdGFydHNbX19pYW0gKyAxXSAtIF9fc2QtPl9NX3N0YXJ0c1tfX2lhbV07CisKKyAgICAgIC8vIFNvcnQgaW4gdGVtcG9yYXJ5IHN0b3JhZ2UsIGxlYXZlIHNwYWNlIGZvciBzZW50aW5lbC4KKworICAgICAgdHlwZWRlZiBfVmFsdWVUeXBlKiBfU29ydGluZ1BsYWNlc0l0ZXJhdG9yOworCisgICAgICBfX3NkLT5fTV90ZW1wb3JhcnlbX19pYW1dID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8X1ZhbHVlVHlwZSo+KDo6b3BlcmF0b3IgbmV3KHNpemVvZihfVmFsdWVUeXBlKQorCQkJCQkJKiAoX19sZW5ndGhfbG9jYWwgKyAxKSkpOworCisgICAgICAvLyBDb3B5IHRoZXJlLgorICAgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoX19zZC0+X01fc291cmNlICsgX19zZC0+X01fc3RhcnRzW19faWFtXSwKKwkJCSAgICAgIF9fc2QtPl9NX3NvdXJjZSArIF9fc2QtPl9NX3N0YXJ0c1tfX2lhbV0KKwkJCSAgICAgICsgX19sZW5ndGhfbG9jYWwsCisJCQkgICAgICBfX3NkLT5fTV90ZW1wb3JhcnlbX19pYW1dKTsKKworICAgICAgX19wb3NzaWJseV9zdGFibGVfc29ydDxfX3N0YWJsZSwgX1NvcnRpbmdQbGFjZXNJdGVyYXRvciwgX0NvbXBhcmU+KCkKKyAgICAgICAgKF9fc2QtPl9NX3RlbXBvcmFyeVtfX2lhbV0sCisJIF9fc2QtPl9NX3RlbXBvcmFyeVtfX2lhbV0gKyBfX2xlbmd0aF9sb2NhbCwKKyAgICAgICAgIF9fY29tcCk7CisKKyAgICAgIC8vIEludmFyaWFudDogbG9jYWxseSBzb3J0ZWQgc3Vic2VxdWVuY2UgaW4gc2QtPl9NX3RlbXBvcmFyeVtfX2lhbV0sCisgICAgICAvLyBfX3NkLT5fTV90ZW1wb3JhcnlbX19pYW1dICsgX19sZW5ndGhfbG9jYWwuCisKKyAgICAgIC8vIE5vIGJhcnJpZXIgaGVyZTogU3luY2hyb25pemF0aW9uIGlzIGRvbmUgYnkgdGhlIHNwbGl0dGluZyByb3V0aW5lLgorCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19udW1fc2FtcGxlcyA9CisgICAgICAgIF9TZXR0aW5nczo6Z2V0KCkuc29ydF9td21zX292ZXJzYW1wbGluZyAqIF9fc2QtPl9NX251bV90aHJlYWRzIC0gMTsKKyAgICAgIF9TcGxpdENvbnNpc3RlbnRseTxfX2V4YWN0LCBfUkFJdGVyLCBfQ29tcGFyZSwgX1NvcnRpbmdQbGFjZXNJdGVyYXRvcj4oKQorICAgICAgICAoX19pYW0sIF9fc2QsIF9fY29tcCwgX19udW1fc2FtcGxlcyk7CisKKyAgICAgIC8vIE9mZnNldCBmcm9tIF9fdGFyZ2V0IF9fYmVnaW4sIF9fbGVuZ3RoIGFmdGVyIG1lcmdpbmcuCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19vZmZzZXQgPSAwLCBfX2xlbmd0aF9hbSA9IDA7CisgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX3MgPSAwOyBfX3MgPCBfX3NkLT5fTV9udW1fdGhyZWFkczsgX19zKyspCisJeworCSAgX19sZW5ndGhfYW0gKz0gKF9fc2QtPl9NX3BpZWNlc1tfX2lhbV1bX19zXS5fTV9lbmQKKwkJCSAgLSBfX3NkLT5fTV9waWVjZXNbX19pYW1dW19fc10uX01fYmVnaW4pOworCSAgX19vZmZzZXQgKz0gX19zZC0+X01fcGllY2VzW19faWFtXVtfX3NdLl9NX2JlZ2luOworCX0KKworICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjwKKyAgICAgICAgc3RkOjpwYWlyPF9Tb3J0aW5nUGxhY2VzSXRlcmF0b3IsIF9Tb3J0aW5nUGxhY2VzSXRlcmF0b3I+ID4KKyAgICAgICAgX1NlcVZlY3RvcjsKKyAgICAgIF9TZXFWZWN0b3IgX19zZXFzKF9fc2QtPl9NX251bV90aHJlYWRzKTsKKworICAgICAgZm9yIChfVGhyZWFkSW5kZXggX19zID0gMDsgX19zIDwgX19zZC0+X01fbnVtX3RocmVhZHM7ICsrX19zKQorCXsKKwkgIF9fc2Vxc1tfX3NdID0KKwkgICAgc3RkOjptYWtlX3BhaXIoX19zZC0+X01fdGVtcG9yYXJ5W19fc10KKwkJCSAgICsgX19zZC0+X01fcGllY2VzW19faWFtXVtfX3NdLl9NX2JlZ2luLAorCQkJICAgX19zZC0+X01fdGVtcG9yYXJ5W19fc10KKwkJCSAgICsgX19zZC0+X01fcGllY2VzW19faWFtXVtfX3NdLl9NX2VuZCk7CisJfQorCisgICAgICBfX3Bvc3NpYmx5X3N0YWJsZV9tdWx0aXdheV9tZXJnZTwKKyAgICAgICAgX19zdGFibGUsIHR5cGVuYW1lIF9TZXFWZWN0b3I6Oml0ZXJhdG9yLAorCV9SQUl0ZXIsIF9Db21wYXJlLCBfRGlmZmVyZW5jZVR5cGU+KCkoX19zZXFzLmJlZ2luKCksIF9fc2Vxcy5lbmQoKSwKKwkJCQkgICAgIF9fc2QtPl9NX3NvdXJjZSArIF9fb2Zmc2V0LCBfX2NvbXAsCisJCQkJICAgICBfX2xlbmd0aF9hbSk7CisKKyMgICAgIHByYWdtYSBvbXAgYmFycmllcgorCisgICAgICBmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX2kgPSAwOyBfX2kgPCBfX2xlbmd0aF9sb2NhbDsgKytfX2kpCisJX19zZC0+X01fdGVtcG9yYXJ5W19faWFtXVtfX2ldLn5fVmFsdWVUeXBlKCk7CisgICAgICA6Om9wZXJhdG9yIGRlbGV0ZShfX3NkLT5fTV90ZW1wb3JhcnlbX19pYW1dKTsKKyAgICB9CisKKyAgLyoqIEBicmllZiBQTVdNUyBtYWluIGNhbGwuCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2Ygc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqICBAcGFyYW0gX19udW1fdGhyZWFkcyBOdW1iZXIgb2YgdGhyZWFkcyB0byB1c2UuCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLCBib29sIF9fZXhhY3QsIHR5cGVuYW1lIF9SQUl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBwYXJhbGxlbF9zb3J0X213bXMoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorCQkgICAgICAgX0NvbXBhcmUgX19jb21wLAorCQkgICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMpCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2VuZCAtIF9fYmVnaW4pCisKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19uID0gX19lbmQgLSBfX2JlZ2luOworCisgICAgICBpZiAoX19uIDw9IDEpCisJcmV0dXJuOworCisgICAgICAvLyBhdCBsZWFzdCBvbmUgZWxlbWVudCBwZXIgdGhyZWFkCisgICAgICBpZiAoX19udW1fdGhyZWFkcyA+IF9fbikKKwlfX251bV90aHJlYWRzID0gc3RhdGljX2Nhc3Q8X1RocmVhZEluZGV4PihfX24pOworCisgICAgICAvLyBzaGFyZWQgdmFyaWFibGVzCisgICAgICBfUE1XTVNTb3J0aW5nRGF0YTxfUkFJdGVyPiBfX3NkOworICAgICAgX0RpZmZlcmVuY2VUeXBlKiBfX3N0YXJ0czsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3NpemU7CisKKyMgICAgIHByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoX19udW1fdGhyZWFkcykKKyAgICAgIHsKKyAgICAgICAgX19udW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsgLy9ubyBtb3JlIHRocmVhZHMgdGhhbiByZXF1ZXN0ZWQKKworIyAgICAgICBwcmFnbWEgb21wIHNpbmdsZQorCXsKKwkgIF9fc2QuX01fbnVtX3RocmVhZHMgPSBfX251bV90aHJlYWRzOworCSAgX19zZC5fTV9zb3VyY2UgPSBfX2JlZ2luOworCSAgCisJICBfX3NkLl9NX3RlbXBvcmFyeSA9IG5ldyBfVmFsdWVUeXBlKltfX251bV90aHJlYWRzXTsKKworCSAgaWYgKCFfX2V4YWN0KQorCSAgICB7CisJICAgICAgX19zaXplID0KKwkJKF9TZXR0aW5nczo6Z2V0KCkuc29ydF9td21zX292ZXJzYW1wbGluZyAqIF9fbnVtX3RocmVhZHMgLSAxKQorCQkqIF9fbnVtX3RocmVhZHM7CisJICAgICAgX19zZC5fTV9zYW1wbGVzID0gc3RhdGljX2Nhc3Q8X1ZhbHVlVHlwZSo+CisJCSg6Om9wZXJhdG9yIG5ldyhfX3NpemUgKiBzaXplb2YoX1ZhbHVlVHlwZSkpKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBfX3NkLl9NX3NhbXBsZXMgPSAwOworCisJICBfX3NkLl9NX29mZnNldHMgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbnVtX3RocmVhZHMgLSAxXTsKKwkgIF9fc2QuX01fcGllY2VzCisJICAgID0gbmV3IHN0ZDo6dmVjdG9yPF9QaWVjZTxfRGlmZmVyZW5jZVR5cGU+ID5bX19udW1fdGhyZWFkc107CisJICBmb3IgKF9UaHJlYWRJbmRleCBfX3MgPSAwOyBfX3MgPCBfX251bV90aHJlYWRzOyArK19fcykKKwkgICAgX19zZC5fTV9waWVjZXNbX19zXS5yZXNpemUoX19udW1fdGhyZWFkcyk7CisJICBfX3N0YXJ0cyA9IF9fc2QuX01fc3RhcnRzID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX251bV90aHJlYWRzICsgMV07CisKKwkgIF9EaWZmZXJlbmNlVHlwZSBfX2NodW5rX2xlbmd0aCA9IF9fbiAvIF9fbnVtX3RocmVhZHM7CisJICBfRGlmZmVyZW5jZVR5cGUgX19zcGxpdCA9IF9fbiAlIF9fbnVtX3RocmVhZHM7CisJICBfRGlmZmVyZW5jZVR5cGUgX19wb3MgPSAwOworCSAgZm9yIChfVGhyZWFkSW5kZXggX19pID0gMDsgX19pIDwgX19udW1fdGhyZWFkczsgKytfX2kpCisJICAgIHsKKwkgICAgICBfX3N0YXJ0c1tfX2ldID0gX19wb3M7CisJICAgICAgX19wb3MgKz0gKChfX2kgPCBfX3NwbGl0KQorCQkJPyAoX19jaHVua19sZW5ndGggKyAxKSA6IF9fY2h1bmtfbGVuZ3RoKTsKKwkgICAgfQorCSAgX19zdGFydHNbX19udW1fdGhyZWFkc10gPSBfX3BvczsKKwl9IC8vc2luZ2xlCisKKyAgICAgICAgLy8gTm93IHNvcnQgaW4gcGFyYWxsZWwuCisgICAgICAgIHBhcmFsbGVsX3NvcnRfbXdtc19wdTxfX3N0YWJsZSwgX19leGFjdD4oJl9fc2QsIF9fY29tcCk7CisgICAgICB9IC8vcGFyYWxsZWwKKworICAgICAgZGVsZXRlW10gX19zdGFydHM7CisgICAgICBkZWxldGVbXSBfX3NkLl9NX3RlbXBvcmFyeTsKKworICAgICAgaWYgKCFfX2V4YWN0KQorCXsKKwkgIGZvciAoX0RpZmZlcmVuY2VUeXBlIF9faSA9IDA7IF9faSA8IF9fc2l6ZTsgKytfX2kpCisJICAgIF9fc2QuX01fc2FtcGxlc1tfX2ldLn5fVmFsdWVUeXBlKCk7CisJICA6Om9wZXJhdG9yIGRlbGV0ZShfX3NkLl9NX3NhbXBsZXMpOworCX0KKworICAgICAgZGVsZXRlW10gX19zZC5fTV9vZmZzZXRzOworICAgICAgZGVsZXRlW10gX19zZC5fTV9waWVjZXM7CisgICAgfQorCit9IC8vbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9NVUxUSVdBWV9NRVJHRVNPUlRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9udW1lcmljIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9udW1lcmljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNTQ2MTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL251bWVyaWMKQEAgLTAsMCArMSw1MTQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogQGZpbGUgcGFyYWxsZWwvbnVtZXJpYworKgorICogQGJyaWVmIFBhcmFsbGVsIFNUTCBmdW5jdGlvbiBjYWxscyBjb3JyZXNwb25kaW5nIHRvIHN0bF9udW1lcmljLmguCisgKiBUaGUgZnVuY3Rpb25zIGRlZmluZWQgaGVyZSBtYWlubHkgZG8gY2FzZSBzd2l0Y2hlcyBhbmQKKyAqIGNhbGwgdGhlIGFjdHVhbCBwYXJhbGxlbGl6ZWQgdmVyc2lvbnMgaW4gb3RoZXIgZmlsZXMuCisgKiBJbmxpbmluZyBwb2xpY3k6IEZ1bmN0aW9ucyB0aGF0IGJhc2ljYWxseSBvbmx5IGNvbnRhaW4gb25lIGZ1bmN0aW9uIGNhbGwsCisgKiBhcmUgZGVjbGFyZWQgaW5saW5lLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlciBhbmQgRmVsaXggUHV0emUuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfTlVNRVJJQ19ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX05VTUVSSUNfSCAxCisKKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvbnVtZXJpY2Z3ZC5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvZm9yX2VhY2guaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9mb3JfZWFjaF9zZWxlY3RvcnMuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9wYXJ0aWFsX3N1bS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3BhcmFsbGVsCit7CisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2suCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBhY2N1bXVsYXRlKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9UcCBfX2luaXQsIAorICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjphY2N1bXVsYXRlKF9fYmVnaW4sIF9fZW5kLCBfX2luaXQpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgaW5saW5lIF9UcAorICAgIGFjY3VtdWxhdGUoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX1RwIF9faW5pdCwKKyAgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3AsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6YWNjdW11bGF0ZShfX2JlZ2luLCBfX2VuZCwgX19pbml0LCBfX2JpbmFyeV9vcCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnPgorICAgIGlubGluZSBfVHAKKyAgICBfX2FjY3VtdWxhdGVfc3dpdGNoKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgX1RwIF9faW5pdCwgX0l0ZXJhdG9yVGFnKSAKKyAgICB7IHJldHVybiBhY2N1bXVsYXRlKF9fYmVnaW4sIF9fZW5kLCBfX2luaXQsCisJCQlfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnPgorICAgIGlubGluZSBfVHAKKyAgICBfX2FjY3VtdWxhdGVfc3dpdGNoKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9UcCBfX2luaXQsIAorICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3AsIF9JdGVyYXRvclRhZykKKyAgICB7IHJldHVybiBhY2N1bXVsYXRlKF9fYmVnaW4sIF9fZW5kLCBfX2luaXQsIF9fYmluYXJ5X29wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9fUkFJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgX1RwCisgICAgX19hY2N1bXVsYXRlX3N3aXRjaChfX1JBSXRlciBfX2JlZ2luLCBfX1JBSXRlciBfX2VuZCwgCisgICAgICAgICAgICAgICAgICAgICAgX1RwIF9faW5pdCwgX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCwgCisgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIAorICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcgIAorICAgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX3VuYmFsYW5jZWQpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuYWNjdW11bGF0ZV9taW5pbWFsX24KKyAgICAgICAgICAgICYmIF9fZ251X3BhcmFsbGVsOjpfX2lzX3BhcmFsbGVsKF9fcGFyYWxsZWxpc21fdGFnKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19yZXMgPSBfX2luaXQ7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fYWNjdW11bGF0ZV9zZWxlY3RvcjxfX1JBSXRlcj4KKyAgICAgICAgICAgIF9fbXlfc2VsZWN0b3I7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzX2VkKF9fYmVnaW4sIF9fZW5kLAorCQkJCQkJIF9fZ251X3BhcmFsbGVsOjpfTm90aGluZygpLAorCQkJCQkJIF9fbXlfc2VsZWN0b3IsCisJCQkJCQkgX19nbnVfcGFyYWxsZWw6OgorCQkJCQkJIF9fYWNjdW11bGF0ZV9iaW5vcF9yZWR1Y3QKKwkJCQkJICAgICAgIDxfQmluYXJ5T3BlcmF0aW9uPihfX2JpbmFyeV9vcCksCisJCQkJCQkgX19yZXMsIF9fcmVzLCAtMSk7CisgICAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBhY2N1bXVsYXRlKF9fYmVnaW4sIF9fZW5kLCBfX2luaXQsIF9fYmluYXJ5X29wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgYWNjdW11bGF0ZShfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfVHAgX19pbml0LCAKKyAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+IF9JdGVyYXRvclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yVHJhaXRzOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisKKyAgICAgIHJldHVybiBfX2FjY3VtdWxhdGVfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX2luaXQsCisJCQkJIF9fZ251X3BhcmFsbGVsOjpfUGx1czxfVHAsIF9WYWx1ZVR5cGU+KCksCisJCQkJIF9JdGVyYXRvckNhdGVnb3J5KCksIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIGFjY3VtdWxhdGUoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX1RwIF9faW5pdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX0l0ZXJhdG9yVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3JUcmFpdHM6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKworICAgICAgcmV0dXJuIF9fYWNjdW11bGF0ZV9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9faW5pdCwKKwkJCQkgX19nbnVfcGFyYWxsZWw6Ol9QbHVzPF9UcCwgX1ZhbHVlVHlwZT4oKSwKKwkJCQkgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIGlubGluZSBfVHAKKyAgICBhY2N1bXVsYXRlKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9UcCBfX2luaXQsIAorICAgICAgICAgICAgICAgX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCwgCisgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX0l0ZXJhdG9yVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3JUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fYWNjdW11bGF0ZV9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9faW5pdCwgX19iaW5hcnlfb3AsIAorCQkJCSBfSXRlcmF0b3JDYXRlZ29yeSgpLCBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIGlubGluZSBfVHAKKyAgICBhY2N1bXVsYXRlKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9UcCBfX2luaXQsIAorICAgICAgICAgICAgICAgX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCkgCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfSXRlcmF0b3JUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICByZXR1cm4gX19hY2N1bXVsYXRlX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19pbml0LCBfX2JpbmFyeV9vcCwgCisJCQkJIF9JdGVyYXRvckNhdGVnb3J5KCkpOworICAgIH0KKworCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2suCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgaW5uZXJfcHJvZHVjdChfSUl0ZXIxIF9fZmlyc3QxLCBfSUl0ZXIxIF9fbGFzdDEsIAorICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2ZpcnN0MiwgX1RwIF9faW5pdCwKKyAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6aW5uZXJfcHJvZHVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9faW5pdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjEsIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjI+CisgICAgaW5saW5lIF9UcAorICAgIGlubmVyX3Byb2R1Y3QoX0lJdGVyMSBfX2ZpcnN0MSwgX0lJdGVyMSBfX2xhc3QxLAorICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2ZpcnN0MiwgX1RwIF9faW5pdCwgX0JpbmFyeUZ1bmN0aW9uMSBfX2JpbmFyeV9vcDEsIAorICAgICAgICAgICAgICAgICAgX0JpbmFyeUZ1bmN0aW9uMiBfX2JpbmFyeV9vcDIsCisgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmlubmVyX3Byb2R1Y3QoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaW5hcnlfb3AxLCBfX2JpbmFyeV9vcDIpOyB9CisKKyAgLy8gUGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjEsIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjI+CisgICAgX1RwCisgICAgX19pbm5lcl9wcm9kdWN0X3N3aXRjaChfUkFJdGVyMSBfX2ZpcnN0MSwKKwkJCSAgIF9SQUl0ZXIxIF9fbGFzdDEsCisJCQkgICBfUkFJdGVyMiBfX2ZpcnN0MiwgX1RwIF9faW5pdCwKKwkJCSAgIF9CaW5hcnlGdW5jdGlvbjEgX19iaW5hcnlfb3AxLAorCQkJICAgX0JpbmFyeUZ1bmN0aW9uMiBfX2JpbmFyeV9vcDIsCisJCQkgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKwkJCSAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorCQkJICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZworCQkJICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfdW5iYWxhbmNlZCkKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKChfX2xhc3QxIC0gX19maXJzdDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlX21pbmltYWxfbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXNfcGFyYWxsZWwoX19wYXJhbGxlbGlzbV90YWcpKSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3JlcyA9IF9faW5pdDsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICBfX2lubmVyX3Byb2R1Y3Rfc2VsZWN0b3I8X1JBSXRlcjEsCisgICAgICAgICAgICBfUkFJdGVyMiwgX1RwPiBfX215X3NlbGVjdG9yKF9fZmlyc3QxLCBfX2ZpcnN0Mik7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzX2VkKAorICAgICAgICAgICAgICAgIF9fZmlyc3QxLCBfX2xhc3QxLCBfX2JpbmFyeV9vcDIsIF9fbXlfc2VsZWN0b3IsIF9fYmluYXJ5X29wMSwKKyAgICAgICAgICAgICAgICBfX3JlcywgX19yZXMsIC0xKTsKKyAgICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGlubmVyX3Byb2R1Y3QoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2luaXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgfQorCisgIC8vIE5vIHBhcmFsbGVsaXNtIGZvciBpbnB1dCBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeUZ1bmN0aW9uMSwgdHlwZW5hbWUgX0JpbmFyeUZ1bmN0aW9uMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMj4KKyAgICBpbmxpbmUgX1RwCisgICAgX19pbm5lcl9wcm9kdWN0X3N3aXRjaChfSUl0ZXIxIF9fZmlyc3QxLCBfSUl0ZXIxIF9fbGFzdDEsIAorCQkJICAgX0lJdGVyMiBfX2ZpcnN0MiwgX1RwIF9faW5pdCwgCisJCQkgICBfQmluYXJ5RnVuY3Rpb24xIF9fYmluYXJ5X29wMSwKKwkJCSAgIF9CaW5hcnlGdW5jdGlvbjIgX19iaW5hcnlfb3AyLCAKKwkJCSAgIF9JdGVyYXRvclRhZzEsIF9JdGVyYXRvclRhZzIpCisgICAgeyByZXR1cm4gaW5uZXJfcHJvZHVjdChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9faW5pdCwgX19iaW5hcnlfb3AxLAorCQkJICAgX19iaW5hcnlfb3AyLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjEsIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjI+CisgICAgaW5saW5lIF9UcAorICAgIGlubmVyX3Byb2R1Y3QoX0lJdGVyMSBfX2ZpcnN0MSwgX0lJdGVyMSBfX2xhc3QxLCAKKyAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19maXJzdDIsIF9UcCBfX2luaXQsIF9CaW5hcnlGdW5jdGlvbjEgX19iaW5hcnlfb3AxLCAKKyAgICAgICAgICAgICAgICAgIF9CaW5hcnlGdW5jdGlvbjIgX19iaW5hcnlfb3AyLCAKKyAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyMT4gX1RyYWl0c1R5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTE6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5MTsKKworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX1RyYWl0c1R5cGUyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTI6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5MjsKKworICAgICAgcmV0dXJuIF9faW5uZXJfcHJvZHVjdF9zd2l0Y2goX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2luaXQsCisJCQkJICAgIF9fYmluYXJ5X29wMSwgX19iaW5hcnlfb3AyLAorCQkJCSAgICBfSXRlcmF0b3JDYXRlZ29yeTEoKSwgX0l0ZXJhdG9yQ2F0ZWdvcnkyKCksCisJCQkJICAgIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1RwLAorICAgICAgICAgICB0eXBlbmFtZSBfQmluYXJ5RnVuY3Rpb24xLCB0eXBlbmFtZSBfQmluYXJ5RnVuY3Rpb24yPgorICAgIGlubGluZSBfVHAKKyAgICBpbm5lcl9wcm9kdWN0KF9JSXRlcjEgX19maXJzdDEsIF9JSXRlcjEgX19sYXN0MSwgCisgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fZmlyc3QyLCBfVHAgX19pbml0LCBfQmluYXJ5RnVuY3Rpb24xIF9fYmluYXJ5X29wMSwgCisgICAgICAgICAgICAgICAgICBfQmluYXJ5RnVuY3Rpb24yIF9fYmluYXJ5X29wMikKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfVHJhaXRzVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlMTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnkxOworCisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXIyPiBfVHJhaXRzVHlwZTI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlMjo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnkyOworCisgICAgICByZXR1cm4gX19pbm5lcl9wcm9kdWN0X3N3aXRjaChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9faW5pdCwKKwkJCQkgICAgX19iaW5hcnlfb3AxLCBfX2JpbmFyeV9vcDIsCisJCQkJICAgIF9JdGVyYXRvckNhdGVnb3J5MSgpLAorCQkJCSAgICBfSXRlcmF0b3JDYXRlZ29yeTIoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgaW5uZXJfcHJvZHVjdChfSUl0ZXIxIF9fZmlyc3QxLCBfSUl0ZXIxIF9fbGFzdDEsIAorICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2ZpcnN0MiwgX1RwIF9faW5pdCwgCisgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcjE+IF9UcmFpdHNUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGUxOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX1RyYWl0c1R5cGUyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTI6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9NdWx0aXBsaWVzPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj46OnJlc3VsdF90eXBlCisgICAgICAgIF9NdWx0aXBsaWVzUmVzdWx0VHlwZTsKKyAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6aW5uZXJfcHJvZHVjdChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9faW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGx1czxfVHAsIF9NdWx0aXBsaWVzUmVzdWx0VHlwZT4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NdWx0aXBsaWVzPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBpbm5lcl9wcm9kdWN0KF9JSXRlcjEgX19maXJzdDEsIF9JSXRlcjEgX19sYXN0MSwgCisgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fZmlyc3QyLCBfVHAgX19pbml0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcjE+IF9UcmFpdHNUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGUxOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX1RyYWl0c1R5cGUyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTI6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9NdWx0aXBsaWVzPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj46OnJlc3VsdF90eXBlCisgICAgICAgIF9NdWx0aXBsaWVzUmVzdWx0VHlwZTsKKyAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6aW5uZXJfcHJvZHVjdChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9faW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGx1czxfVHAsIF9NdWx0aXBsaWVzUmVzdWx0VHlwZT4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NdWx0aXBsaWVzPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4oKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2suCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBwYXJ0aWFsX3N1bShfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpwYXJ0aWFsX3N1bShfX2JlZ2luLCBfX2VuZCwgX19yZXN1bHQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgcGFydGlhbF9zdW0oX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5fb3AsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6cGFydGlhbF9zdW0oX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0LCBfX2Jpbl9vcCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbiwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgX19wYXJ0aWFsX3N1bV9zd2l0Y2goX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwKKwkJCSBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlPcGVyYXRpb24gX19iaW5fb3AsCisJCQkgX0l0ZXJhdG9yVGFnMSwgX0l0ZXJhdG9yVGFnMikKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6cGFydGlhbF9zdW0oX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0LCBfX2Jpbl9vcCk7IH0KKworICAvLyBQYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3BhcnRpYWxfc3VtX3N3aXRjaChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLAorCQkJIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0JpbmFyeU9wZXJhdGlvbiBfX2Jpbl9vcCwKKwkJCSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKwkJCSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZCAtIF9fYmVnaW4pCisgICAgICAgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5wYXJ0aWFsX3N1bV9taW5pbWFsX24pKQorICAgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6Ol9fcGFyYWxsZWxfcGFydGlhbF9zdW0oX19iZWdpbiwgX19lbmQsCisJCQkJCQkgICAgICBfX3Jlc3VsdCwgX19iaW5fb3ApOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gcGFydGlhbF9zdW0oX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0LCBfX2Jpbl9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHBhcnRpYWxfc3VtKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6OnBhcnRpYWxfc3VtKF9fYmVnaW4sIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jlc3VsdCwgc3RkOjpwbHVzPF9WYWx1ZVR5cGU+KCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBwYXJ0aWFsX3N1bShfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCkKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+IF9JVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lUcmFpdHNUeXBlOjppdGVyYXRvcl9jYXRlZ29yeSBfSUl0ZXJhdG9yQ2F0ZWdvcnk7CisKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9PdXRwdXRJdGVyYXRvcj4gX09UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfT1RyYWl0c1R5cGU6Oml0ZXJhdG9yX2NhdGVnb3J5IF9PSXRlckNhdGVnb3J5OworCisgICAgICByZXR1cm4gX19wYXJ0aWFsX3N1bV9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0LCBfX2JpbmFyeV9vcCwKKwkJCQkgIF9JSXRlcmF0b3JDYXRlZ29yeSgpLCBfT0l0ZXJDYXRlZ29yeSgpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIGFkamFjZW50X2RpZmZlcmVuY2UoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjphZGphY2VudF9kaWZmZXJlbmNlKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgYWRqYWNlbnRfZGlmZmVyZW5jZShfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5T3BlcmF0aW9uIF9fYmluX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjphZGphY2VudF9kaWZmZXJlbmNlKF9fYmVnaW4sIF9fZW5kLAorCQkJCQkJIF9fcmVzdWx0LCBfX2Jpbl9vcCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbiwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgX19hZGphY2VudF9kaWZmZXJlbmNlX3N3aXRjaChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLAorCQkJCSBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisJCQkJIF9CaW5hcnlPcGVyYXRpb24gX19iaW5fb3AsIF9JdGVyYXRvclRhZzEsCisJCQkJIF9JdGVyYXRvclRhZzIpCisgICAgeyByZXR1cm4gYWRqYWNlbnRfZGlmZmVyZW5jZShfX2JlZ2luLCBfX2VuZCwgX19yZXN1bHQsIF9fYmluX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgLy8gUGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19hZGphY2VudF9kaWZmZXJlbmNlX3N3aXRjaChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLAorCQkJCSBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisJCQkJIF9CaW5hcnlPcGVyYXRpb24gX19iaW5fb3AsCisJCQkJIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorCQkJCSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKwkJCQkgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbQorCQkJCSBfX3BhcmFsbGVsaXNtX3RhZworCQkJCSA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF9iYWxhbmNlZCkKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZCAtIF9fYmVnaW4pCisgICAgICAgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5hZGphY2VudF9kaWZmZXJlbmNlX21pbmltYWxfbgorICAgICAgICAgICAgJiYgX19nbnVfcGFyYWxsZWw6Ol9faXNfcGFyYWxsZWwoX19wYXJhbGxlbGlzbV90YWcpKSkKKyAgICAgICAgeworICAgICAgICAgIGJvb2wgX19kdW1teSA9IHRydWU7CisgICAgICAgICAgdHlwZWRlZiBfX2dudV9wYXJhbGxlbDo6X0l0ZXJhdG9yUGFpcjxfSUl0ZXIsIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnPiBfSXRUcmlwOworICAgICAgICAgICpfX3Jlc3VsdCA9ICpfX2JlZ2luOworICAgICAgICAgIF9JdFRyaXAgX19iZWdpbl9wYWlyKF9fYmVnaW4gKyAxLCBfX3Jlc3VsdCArIDEpLAorICAgICAgICAgICAgX19lbmRfcGFpcihfX2VuZCwgX19yZXN1bHQgKyAoX19lbmQgLSBfX2JlZ2luKSk7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fYWRqYWNlbnRfZGlmZmVyZW5jZV9zZWxlY3RvcjxfSXRUcmlwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jdGlvbmFsaXR5OworICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjoKKyAgICAgICAgICAgIF9fZm9yX2VhY2hfdGVtcGxhdGVfcmFuZG9tX2FjY2Vzc19lZCgKKyAgICAgICAgICAgICAgICBfX2JlZ2luX3BhaXIsIF9fZW5kX3BhaXIsIF9fYmluX29wLCBfX2Z1bmN0aW9uYWxpdHksCisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9EdW1teVJlZHVjdCgpLCBfX2R1bW15LCBfX2R1bW15LCAtMSk7CisgICAgICAgICAgcmV0dXJuIF9fZnVuY3Rpb25hbGl0eS5fTV9maW5pc2hfaXRlcmF0b3I7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGFkamFjZW50X2RpZmZlcmVuY2UoX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0LCBfX2Jpbl9vcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIGFkamFjZW50X2RpZmZlcmVuY2UoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHJldHVybiBhZGphY2VudF9kaWZmZXJlbmNlKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCwKKwkJCQkgc3RkOjptaW51czxfVmFsdWVUeXBlPigpLAorCQkJCSBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBhZGphY2VudF9kaWZmZXJlbmNlKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHJldHVybiBhZGphY2VudF9kaWZmZXJlbmNlKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCwKKwkJCQkgc3RkOjptaW51czxfVmFsdWVUeXBlPigpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIGFkamFjZW50X2RpZmZlcmVuY2UoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfSVRyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JVHJhaXRzVHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0lJdGVyYXRvckNhdGVnb3J5OworCisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX09UcmFpdHNUeXBlOjppdGVyYXRvcl9jYXRlZ29yeSBfT0l0ZXJDYXRlZ29yeTsKKworICAgICAgcmV0dXJuIF9fYWRqYWNlbnRfZGlmZmVyZW5jZV9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0LAorCQkJCQkgIF9fYmluYXJ5X29wLAorCQkJCQkgIF9JSXRlcmF0b3JDYXRlZ29yeSgpLAorCQkJCQkgIF9PSXRlckNhdGVnb3J5KCksCisJCQkJCSAgX19wYXJhbGxlbGlzbV90YWcpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBhZGphY2VudF9kaWZmZXJlbmNlKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsCisJCQlfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfSVRyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JVHJhaXRzVHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0lJdGVyYXRvckNhdGVnb3J5OworCisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX09UcmFpdHNUeXBlOjppdGVyYXRvcl9jYXRlZ29yeSBfT0l0ZXJDYXRlZ29yeTsKKworICAgICAgcmV0dXJuIF9fYWRqYWNlbnRfZGlmZmVyZW5jZV9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0LAorCQkJCQkgIF9fYmluYXJ5X29wLAorCQkJCQkgIF9JSXRlcmF0b3JDYXRlZ29yeSgpLAorCQkJCQkgIF9PSXRlckNhdGVnb3J5KCkpOworICAgIH0KK30gLy8gZW5kIG5hbWVzcGFjZQorfSAvLyBlbmQgbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9OVU1FUklDX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbnVtZXJpY2Z3ZC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9udW1lcmljZndkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzZDJmMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbnVtZXJpY2Z3ZC5oCkBAIC0wLDAgKzEsMjAzIEBACisvLyA8cGFyYWxsZWwvbnVtZXJpYz4gRm9yd2FyZCBkZWNsYXJhdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL251bWVyaWNmd2QuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfTlVNRVJJQ0ZXRF9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX05VTUVSSUNGV0RfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPHBhcmFsbGVsL3RhZ3MuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9zZXR0aW5ncy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3BhcmFsbGVsCit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIGFjY3VtdWxhdGUoX0lJdGVyLCBfSUl0ZXIsIF9UcCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgYWNjdW11bGF0ZShfSUl0ZXIsIF9JSXRlciwgX1RwLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIGFjY3VtdWxhdGUoX0lJdGVyLCBfSUl0ZXIsIF9UcCwgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UYWc+CisgICAgX1RwCisgICAgX19hY2N1bXVsYXRlX3N3aXRjaChfSUl0ZXIsIF9JSXRlciwgX1RwLCBfVGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0JpbmFyeU9wZXI+CisgICAgX1RwCisgICAgYWNjdW11bGF0ZShfSUl0ZXIsIF9JSXRlciwgX1RwLCBfQmluYXJ5T3Blcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9CaW5hcnlPcGVyPgorICAgIF9UcAorICAgIGFjY3VtdWxhdGUoX0lJdGVyLCBfSUl0ZXIsIF9UcCwgX0JpbmFyeU9wZXIsCisgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQmluYXJ5T3Blcj4KKyAgICBfVHAKKyAgICBhY2N1bXVsYXRlKF9JSXRlciwgX0lJdGVyLCBfVHAsIF9CaW5hcnlPcGVyLAorICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9CaW5hcnlPcGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfVGFnPgorICAgIF9UcAorICAgIF9fYWNjdW11bGF0ZV9zd2l0Y2goX0lJdGVyLCBfSUl0ZXIsIF9UcCwgX0JpbmFyeU9wZXIsIF9UYWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0JpbmFyeU9wZXI+CisgICAgX1RwCisgICAgX19hY2N1bXVsYXRlX3N3aXRjaChfUkFJdGVyLCBfUkFJdGVyLCBfVHAsIF9CaW5hcnlPcGVyLAorICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbQorICAgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX3VuYmFsYW5jZWQpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIGFkamFjZW50X2RpZmZlcmVuY2UoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9CaW5hcnlPcGVyPgorICAgIF9PSXRlcgorICAgIGFkamFjZW50X2RpZmZlcmVuY2UoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX0JpbmFyeU9wZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIGFkamFjZW50X2RpZmZlcmVuY2UoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9CaW5hcnlPcGVyPgorICAgIF9PSXRlcgorICAgIGFkamFjZW50X2RpZmZlcmVuY2UoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX0JpbmFyeU9wZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIKKyAgICBhZGphY2VudF9kaWZmZXJlbmNlKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX0JpbmFyeU9wZXI+CisgICAgX09JdGVyCisgICAgYWRqYWNlbnRfZGlmZmVyZW5jZShfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBfQmluYXJ5T3BlciwgCisgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX0JpbmFyeU9wZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9UYWcxLCB0eXBlbmFtZSBfVGFnMj4KKyAgICBfT0l0ZXIKKyAgICBfX2FkamFjZW50X2RpZmZlcmVuY2Vfc3dpdGNoKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9CaW5hcnlPcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UYWcxLCBfVGFnMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9CaW5hcnlPcGVyPgorICAgIF9PSXRlcgorICAgIF9fYWRqYWNlbnRfZGlmZmVyZW5jZV9zd2l0Y2goX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX0JpbmFyeU9wZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfdW5iYWxhbmNlZCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIGlubmVyX3Byb2R1Y3QoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX1RwKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgaW5uZXJfcHJvZHVjdChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfVHAsCisgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBpbm5lcl9wcm9kdWN0KF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9UcCwKKyAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeUZ1bmN0aW9uMSwgdHlwZW5hbWUgX0JpbmFyeUZ1bmN0aW9uMj4KKyAgICBfVHAKKyAgICBpbm5lcl9wcm9kdWN0KF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9UcCwKKyAgICAgICAgICAgICAgICAgIF9CaW5hcnlGdW5jdGlvbjEsIF9CaW5hcnlGdW5jdGlvbjIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeUZ1bmN0aW9uMSwgdHlwZW5hbWUgX0JpbmFyeUZ1bmN0aW9uMj4KKyAgICBfVHAKKyAgICBpbm5lcl9wcm9kdWN0KF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9UcCwgX0JpbmFyeUZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgIF9CaW5hcnlGdW5jdGlvbjIsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1RwLAorICAgICAgICAgICB0eXBlbmFtZSBCaW5hcnlGdW5jdGlvbjEsIHR5cGVuYW1lIEJpbmFyeUZ1bmN0aW9uMj4KKyAgICBfVHAKKyAgICBpbm5lcl9wcm9kdWN0KF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9UcCwgQmluYXJ5RnVuY3Rpb24xLAorICAgICAgICAgICAgICAgICAgQmluYXJ5RnVuY3Rpb24yLCBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgQmluYXJ5RnVuY3Rpb24xLCB0eXBlbmFtZSBCaW5hcnlGdW5jdGlvbjI+CisgICAgX1RwCisgICAgX19pbm5lcl9wcm9kdWN0X3N3aXRjaChfUkFJdGVyMSwgX1JBSXRlcjEsIF9SQUl0ZXIyLCBfVHAsIEJpbmFyeUZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlGdW5jdGlvbjIsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbQorICAgICAgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX3VuYmFsYW5jZWQpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeUZ1bmN0aW9uMSwgdHlwZW5hbWUgX0JpbmFyeUZ1bmN0aW9uMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX1RhZzEsIHR5cGVuYW1lIF9UYWcyPgorICAgIF9UcAorICAgIF9faW5uZXJfcHJvZHVjdF9zd2l0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX1RwLCBfQmluYXJ5RnVuY3Rpb24xLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5RnVuY3Rpb24yLCBfVGFnMSwgX1RhZzIpOworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyCisgICAgcGFydGlhbF9zdW0oX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX0JpbmFyeU9wZXI+CisgICAgX09JdGVyCisgICAgcGFydGlhbF9zdW0oX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX0JpbmFyeU9wZXIsCisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIKKyAgICBwYXJ0aWFsX3N1bShfSUl0ZXIsIF9JSXRlciwgX09JdGVyIF9fcmVzdWx0KTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX0JpbmFyeU9wZXI+CisgICAgX09JdGVyCisgICAgcGFydGlhbF9zdW0oX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX0JpbmFyeU9wZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfQmluYXJ5T3BlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1RhZzEsIHR5cGVuYW1lIF9UYWcyPgorICAgIF9PSXRlcgorICAgIF9fcGFydGlhbF9zdW1fc3dpdGNoKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9CaW5hcnlPcGVyLCBfVGFnMSwgX1RhZzIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfQmluYXJ5T3Blcj4KKyAgICBfT0l0ZXIKKyAgICBfX3BhcnRpYWxfc3VtX3N3aXRjaChfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBfQmluYXJ5T3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKK30gLy8gZW5kIG5hbWVzcGFjZQorfSAvLyBlbmQgbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9OVU1FUklDRldEX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvb21wX2xvb3AuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvb21wX2xvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2VkZmY1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9vbXBfbG9vcC5oCkBAIC0wLDAgKzEsMTE1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvb21wX2xvb3AuaAorICogIEBicmllZiBQYXJhbGxlbGl6YXRpb24gb2YgZW1iYXJyYXNzaW5nbHkgcGFyYWxsZWwgZXhlY3V0aW9uIGJ5CisgKiAgbWVhbnMgb2YgYW4gT3Blbk1QIGZvciBsb29wLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgRmVsaXggUHV0emUuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfT01QX0xPT1BfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9PTVBfTE9PUF9IIDEKKworI2luY2x1ZGUgPG9tcC5oPgorCisjaW5jbHVkZSA8cGFyYWxsZWwvc2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNpY19pdGVyYXRvci5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2Jhc2UuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgRW1iYXJyYXNzaW5nbHkgcGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzCisgICAqIGl0ZXJhdG9ycywgdXNpbmcgYW4gT3Blbk1QIGZvciBsb29wLgorICAgKgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgZWxlbWVudCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgZWxlbWVudCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX28gVXNlci1zdXBwbGllZCBmdW5jdG9yIChjb21wYXJhdG9yLCBwcmVkaWNhdGUsIGFkZGluZworICAgKiAgZnVuY3RvciwgZXRjLikuCisgICAqICBAcGFyYW0gX19mIEZ1bmN0b3IgdG8gQGEgcHJvY2VzcyBhbiBlbGVtZW50IHdpdGggX19vcCAoZGVwZW5kcyBvbgorICAgKiAgZGVzaXJlZCBmdW5jdGlvbmFsaXR5LCBlLiBnLiBmb3Igc3RkOjpmb3JfZWFjaCgpLCAuLi4pLgorICAgKiAgQHBhcmFtIF9fciBGdW5jdG9yIHRvIEBhIGFkZCBhIHNpbmdsZSBfX3Jlc3VsdCB0byB0aGUgYWxyZWFkeQorICAgKiAgcHJvY2Vzc2VkIGVsZW1lbnRzIChkZXBlbmRzIG9uIGZ1bmN0aW9uYWxpdHkpLgorICAgKiAgQHBhcmFtIF9fYmFzZSBCYXNlIHZhbHVlIGZvciByZWR1Y3Rpb24uCisgICAqICBAcGFyYW0gX19vdXRwdXQgUG9pbnRlciB0byBwb3NpdGlvbiB3aGVyZSBmaW5hbCByZXN1bHQgaXMgd3JpdHRlbiB0bworICAgKiAgQHBhcmFtIF9fYm91bmQgTWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgcHJvY2Vzc2VkIChlLiBnLiBmb3IKKyAgICogIHN0ZDo6Y291bnRfbigpKS4KKyAgICogIEByZXR1cm4gVXNlci1zdXBwbGllZCBmdW5jdG9yICh0aGF0IG1heSBjb250YWluIGEgcGFydCBvZiB0aGUgcmVzdWx0KS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsCisJICAgdHlwZW5hbWUgX09wLAorCSAgIHR5cGVuYW1lIF9GdSwKKwkgICB0eXBlbmFtZSBfUmVkLAorCSAgIHR5cGVuYW1lIF9SZXN1bHQ+CisgICAgX09wCisgICAgX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzX29tcF9sb29wKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJCQkJICAgICAgIF9PcCBfX28sIF9GdSYgX19mLCBfUmVkIF9fciwKKwkJCQkJICAgICAgIF9SZXN1bHQgX19iYXNlLAorCQkJCQkgICAgICAgX1Jlc3VsdCYgX19vdXRwdXQsCisgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9fYm91bmQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICAgIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbGVuZ3RoID0gX19lbmQgLSBfX2JlZ2luOworICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMgPSBfX2dudV9wYXJhbGxlbDo6bWluPF9EaWZmZXJlbmNlVHlwZT4KKwkoX19nZXRfbWF4X3RocmVhZHMoKSwgX19sZW5ndGgpOworCisgICAgICBfUmVzdWx0ICpfX3RocmVhZF9yZXN1bHRzOworCisjICAgICBwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKF9fbnVtX3RocmVhZHMpCisgICAgICB7CisjICAgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJeworCSAgX19udW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKwkgIF9fdGhyZWFkX3Jlc3VsdHMgPSBuZXcgX1Jlc3VsdFtfX251bV90aHJlYWRzXTsKKworCSAgZm9yIChfVGhyZWFkSW5kZXggX19pID0gMDsgX19pIDwgX19udW1fdGhyZWFkczsgKytfX2kpCisJICAgIF9fdGhyZWFkX3Jlc3VsdHNbX19pXSA9IF9SZXN1bHQoKTsKKwl9CisKKyAgICAgICAgX1RocmVhZEluZGV4IF9faWFtID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLCBfU2V0dGluZ3M6OmdldCgpLndvcmtzdGVhbGluZ19jaHVua19zaXplKQorICAgICAgICBmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX3BvcyA9IDA7IF9fcG9zIDwgX19sZW5ndGg7ICsrX19wb3MpCisgICAgICAgICAgX190aHJlYWRfcmVzdWx0c1tfX2lhbV0gPSBfX3IoX190aHJlYWRfcmVzdWx0c1tfX2lhbV0sCisJCQkJCV9fZihfX28sIF9fYmVnaW4rX19wb3MpKTsKKyAgICAgIH0gLy9wYXJhbGxlbAorCisgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX2kgPSAwOyBfX2kgPCBfX251bV90aHJlYWRzOyArK19faSkKKyAgICAgICAgX19vdXRwdXQgPSBfX3IoX19vdXRwdXQsIF9fdGhyZWFkX3Jlc3VsdHNbX19pXSk7CisKKyAgICAgIGRlbGV0ZSBbXSBfX3RocmVhZF9yZXN1bHRzOworCisgICAgICAvLyBQb2ludHMgdG8gbGFzdCBlbGVtZW50IHByb2Nlc3NlZCAobmVlZGVkIGFzIHJldHVybiB2YWx1ZSBmb3IKKyAgICAgIC8vIHNvbWUgYWxnb3JpdGhtcyBsaWtlIHRyYW5zZm9ybSkuCisgICAgICBfX2YuX01fZmluaXNoX2l0ZXJhdG9yID0gX19iZWdpbiArIF9fbGVuZ3RoOworCisgICAgICByZXR1cm4gX19vOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9PTVBfTE9PUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL29tcF9sb29wX3N0YXRpYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9vbXBfbG9vcF9zdGF0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWZkMDk3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9vbXBfbG9vcF9zdGF0aWMuaApAQCAtMCwwICsxLDExNSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL29tcF9sb29wX3N0YXRpYy5oCisgKiAgQGJyaWVmIFBhcmFsbGVsaXphdGlvbiBvZiBlbWJhcnJhc3NpbmdseSBwYXJhbGxlbCBleGVjdXRpb24gYnkKKyAqICBtZWFucyBvZiBhbiBPcGVuTVAgZm9yIGxvb3Agd2l0aCBzdGF0aWMgc2NoZWR1bGluZy4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEZlbGl4IFB1dHplLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX09NUF9MT09QX1NUQVRJQ19ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX09NUF9MT09QX1NUQVRJQ19IIDEKKworI2luY2x1ZGUgPG9tcC5oPgorCisjaW5jbHVkZSA8cGFyYWxsZWwvc2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNpY19pdGVyYXRvci5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLyoqIEBicmllZiBFbWJhcnJhc3NpbmdseSBwYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MKKyAgICogaXRlcmF0b3JzLCB1c2luZyBhbiBPcGVuTVAgZm9yIGxvb3Agd2l0aCBzdGF0aWMgc2NoZWR1bGluZy4KKyAgICoKKyAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGVsZW1lbnQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIGVsZW1lbnQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19vIFVzZXItc3VwcGxpZWQgZnVuY3RvciAoY29tcGFyYXRvciwgcHJlZGljYXRlLCBhZGRpbmcKKyAgICogIGZ1bmN0b3IsIC4uLikuCisgICAqICBAcGFyYW0gX19mIEZ1bmN0b3IgdG8gQGEgcHJvY2VzcyBhbiBlbGVtZW50IHdpdGggX19vcCAoZGVwZW5kcyBvbgorICAgKiAgZGVzaXJlZCBmdW5jdGlvbmFsaXR5LCBlLiBnLiBmb3Igc3RkOjpmb3JfZWFjaCgpLCAuLi4pLgorICAgKiAgQHBhcmFtIF9fciBGdW5jdG9yIHRvIEBhIGFkZCBhIHNpbmdsZSBfX3Jlc3VsdCB0byB0aGUgYWxyZWFkeSBwcm9jZXNzZWQKKyAgICogIF9fZWxlbWVudHMgKGRlcGVuZHMgb24gZnVuY3Rpb25hbGl0eSkuCisgICAqICBAcGFyYW0gX19iYXNlIEJhc2UgdmFsdWUgZm9yIHJlZHVjdGlvbi4KKyAgICogIEBwYXJhbSBfX291dHB1dCBQb2ludGVyIHRvIHBvc2l0aW9uIHdoZXJlIGZpbmFsIHJlc3VsdCBpcyB3cml0dGVuIHRvCisgICAqICBAcGFyYW0gX19ib3VuZCBNYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBwcm9jZXNzZWQgKGUuIGcuIGZvcgorICAgKiAgc3RkOjpjb3VudF9uKCkpLgorICAgKiAgQHJldHVybiBVc2VyLXN1cHBsaWVkIGZ1bmN0b3IgKHRoYXQgbWF5IGNvbnRhaW4gYSBwYXJ0IG9mIHRoZSByZXN1bHQpLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwKKwkgICB0eXBlbmFtZSBfT3AsCisJICAgdHlwZW5hbWUgX0Z1LAorCSAgIHR5cGVuYW1lIF9SZWQsCisJICAgdHlwZW5hbWUgX1Jlc3VsdD4KKyAgICBfT3AKKyAgICBfX2Zvcl9lYWNoX3RlbXBsYXRlX3JhbmRvbV9hY2Nlc3Nfb21wX2xvb3Bfc3RhdGljKF9SQUl0ZXIgX19iZWdpbiwKKwkJCQkJCSAgICAgIF9SQUl0ZXIgX19lbmQsIF9PcCBfX28sCisJCQkJCQkgICAgICBfRnUmIF9fZiwgX1JlZCBfX3IsCisJCQkJCQkgICAgICBfUmVzdWx0IF9fYmFzZSwKKwkJCQkJCSAgICAgIF9SZXN1bHQmIF9fb3V0cHV0LAorICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj46OmRpZmZlcmVuY2VfdHlwZSBfX2JvdW5kKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbGVuZ3RoID0gX19lbmQgLSBfX2JlZ2luOworICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMgPSBzdGQ6Om1pbjxfRGlmZmVyZW5jZVR5cGU+CisJKF9fZ2V0X21heF90aHJlYWRzKCksIF9fbGVuZ3RoKTsKKworICAgICAgX1Jlc3VsdCAqX190aHJlYWRfcmVzdWx0czsKKworIyAgICAgcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyhfX251bV90aHJlYWRzKQorICAgICAgeworIyAgICAgICBwcmFnbWEgb21wIHNpbmdsZQorCXsKKwkgIF9fbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisJICBfX3RocmVhZF9yZXN1bHRzID0gbmV3IF9SZXN1bHRbX19udW1fdGhyZWFkc107CisKKwkgIGZvciAoX1RocmVhZEluZGV4IF9faSA9IDA7IF9faSA8IF9fbnVtX3RocmVhZHM7ICsrX19pKQorCSAgICBfX3RocmVhZF9yZXN1bHRzW19faV0gPSBfUmVzdWx0KCk7CisJfQorCisgICAgICAgIF9UaHJlYWRJbmRleCBfX2lhbSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljLCBfU2V0dGluZ3M6OmdldCgpLndvcmtzdGVhbGluZ19jaHVua19zaXplKQorICAgICAgICBmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX3BvcyA9IDA7IF9fcG9zIDwgX19sZW5ndGg7ICsrX19wb3MpCisgICAgICAgICAgX190aHJlYWRfcmVzdWx0c1tfX2lhbV0gPSBfX3IoX190aHJlYWRfcmVzdWx0c1tfX2lhbV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mKF9fbywgX19iZWdpbitfX3BvcykpOworICAgICAgfSAvL3BhcmFsbGVsCisKKyAgICAgIGZvciAoX1RocmVhZEluZGV4IF9faSA9IDA7IF9faSA8IF9fbnVtX3RocmVhZHM7ICsrX19pKQorCV9fb3V0cHV0ID0gX19yKF9fb3V0cHV0LCBfX3RocmVhZF9yZXN1bHRzW19faV0pOworCisgICAgICBkZWxldGUgW10gX190aHJlYWRfcmVzdWx0czsKKworICAgICAgLy8gUG9pbnRzIHRvIGxhc3QgZWxlbWVudCBwcm9jZXNzZWQgKG5lZWRlZCBhcyByZXR1cm4gdmFsdWUgZm9yCisgICAgICAvLyBzb21lIGFsZ29yaXRobXMgbGlrZSB0cmFuc2Zvcm0pLgorICAgICAgX19mLmZpbmlzaF9pdGVyYXRvciA9IF9fYmVnaW4gKyBfX2xlbmd0aDsKKworICAgICAgcmV0dXJuIF9fbzsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfT01QX0xPT1BfU1RBVElDX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcGFyX2xvb3AuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcGFyX2xvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzA2OTcxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9wYXJfbG9vcC5oCkBAIC0wLDAgKzEsMTM5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvcGFyX2xvb3AuaAorICogIEBicmllZiBQYXJhbGxlbGl6YXRpb24gb2YgZW1iYXJyYXNzaW5nbHkgcGFyYWxsZWwgZXhlY3V0aW9uIGJ5CisgKiAgbWVhbnMgb2YgZXF1YWwgc3BsaXR0aW5nLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgRmVsaXggUHV0emUuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfUEFSX0xPT1BfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9QQVJfTE9PUF9IIDEKKworI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3NldHRpbmdzLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvYmFzZS5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2VxdWFsbHlfc3BsaXQuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgRW1iYXJyYXNzaW5nbHkgcGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzCisgICAqIGl0ZXJhdG9ycywgdXNpbmcgaGFuZC1jcmFmdGVkIHBhcmFsbGVsaXphdGlvbiBieSBlcXVhbCBzcGxpdHRpbmcKKyAgICogdGhlIHdvcmsuCisgICAqCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBlbGVtZW50IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBlbGVtZW50IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fbyBVc2VyLXN1cHBsaWVkIGZ1bmN0b3IgKGNvbXBhcmF0b3IsIHByZWRpY2F0ZSwgYWRkaW5nCisgICAqICBmdW5jdG9yLCAuLi4pCisgICAqICBAcGFyYW0gX19mIEZ1bmN0b3IgdG8gInByb2Nlc3MiIGFuIGVsZW1lbnQgd2l0aCBfX29wIChkZXBlbmRzIG9uCisgICAqICBkZXNpcmVkIGZ1bmN0aW9uYWxpdHksIGUuIGcuIGZvciBzdGQ6OmZvcl9lYWNoKCksIC4uLikuCisgICAqICBAcGFyYW0gX19yIEZ1bmN0b3IgdG8gImFkZCIgYSBzaW5nbGUgX19yZXN1bHQgdG8gdGhlIGFscmVhZHkKKyAgICogIHByb2Nlc3NlZCBlbGVtZW50cyAoZGVwZW5kcyBvbiBmdW5jdGlvbmFsaXR5KS4KKyAgICogIEBwYXJhbSBfX2Jhc2UgQmFzZSB2YWx1ZSBmb3IgcmVkdWN0aW9uLgorICAgKiAgQHBhcmFtIF9fb3V0cHV0IFBvaW50ZXIgdG8gcG9zaXRpb24gd2hlcmUgZmluYWwgcmVzdWx0IGlzIHdyaXR0ZW4gdG8KKyAgICogIEBwYXJhbSBfX2JvdW5kIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHByb2Nlc3NlZCAoZS4gZy4gZm9yCisgICAqICBzdGQ6OmNvdW50X24oKSkuCisgICAqICBAcmV0dXJuIFVzZXItc3VwcGxpZWQgZnVuY3RvciAodGhhdCBtYXkgY29udGFpbiBhIHBhcnQgb2YgdGhlIHJlc3VsdCkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLAorCSAgIHR5cGVuYW1lIF9PcCwKKwkgICB0eXBlbmFtZSBfRnUsCisJICAgdHlwZW5hbWUgX1JlZCwKKwkgICB0eXBlbmFtZSBfUmVzdWx0PgorICAgIF9PcAorICAgIF9fZm9yX2VhY2hfdGVtcGxhdGVfcmFuZG9tX2FjY2Vzc19lZChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCQkJCSBfT3AgX19vLCBfRnUmIF9fZiwgX1JlZCBfX3IsCisJCQkJCSBfUmVzdWx0IF9fYmFzZSwgX1Jlc3VsdCYgX19vdXRwdXQsCisgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9fYm91bmQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisgICAgICBjb25zdCBfRGlmZmVyZW5jZVR5cGUgX19sZW5ndGggPSBfX2VuZCAtIF9fYmVnaW47CisgICAgICBfUmVzdWx0ICpfX3RocmVhZF9yZXN1bHRzOworICAgICAgYm9vbCogX19jb25zdHJ1Y3RlZDsKKworICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMgPSBfX2dudV9wYXJhbGxlbDo6bWluPF9EaWZmZXJlbmNlVHlwZT4KKwkoX19nZXRfbWF4X3RocmVhZHMoKSwgX19sZW5ndGgpOworCisjICAgICBwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKF9fbnVtX3RocmVhZHMpCisgICAgICB7CisjICAgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJeworCSAgX19udW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKwkgIF9fdGhyZWFkX3Jlc3VsdHMgPSBzdGF0aWNfY2FzdDxfUmVzdWx0Kj4KKwkgICAgKDo6b3BlcmF0b3IgbmV3KF9fbnVtX3RocmVhZHMgKiBzaXplb2YoX1Jlc3VsdCkpKTsKKwkgIF9fY29uc3RydWN0ZWQgPSBuZXcgYm9vbFtfX251bV90aHJlYWRzXTsKKwl9CisKKwlfVGhyZWFkSW5kZXggX19pYW0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKworCS8vIE5ldXRyYWwgZWxlbWVudC4KKwlfUmVzdWx0KiBfX3JlZHVjdDsKKworCV9EaWZmZXJlbmNlVHlwZQorCSAgX19zdGFydCA9IF9fZXF1YWxseV9zcGxpdF9wb2ludChfX2xlbmd0aCwgX19udW1fdGhyZWFkcywgX19pYW0pLAorCSAgX19zdG9wID0gX19lcXVhbGx5X3NwbGl0X3BvaW50KF9fbGVuZ3RoLCBfX251bV90aHJlYWRzLCBfX2lhbSArIDEpOworCisJaWYgKF9fc3RhcnQgPCBfX3N0b3ApCisJICB7CisJICAgIF9fcmVkdWN0ID0gbmV3IF9SZXN1bHQoX19mKF9fbywgX19iZWdpbiArIF9fc3RhcnQpKTsKKwkgICAgKytfX3N0YXJ0OworCSAgICBfX2NvbnN0cnVjdGVkW19faWFtXSA9IHRydWU7CisJICB9CisJZWxzZQorCSAgX19jb25zdHJ1Y3RlZFtfX2lhbV0gPSBmYWxzZTsKKworCWZvciAoOyBfX3N0YXJ0IDwgX19zdG9wOyArK19fc3RhcnQpCisJICAqX19yZWR1Y3QgPSBfX3IoKl9fcmVkdWN0LCBfX2YoX19vLCBfX2JlZ2luICsgX19zdGFydCkpOworCisJaWYgKF9fY29uc3RydWN0ZWRbX19pYW1dKQorCSAgeworCSAgICA6Om5ldygmX190aHJlYWRfcmVzdWx0c1tfX2lhbV0pIF9SZXN1bHQoKl9fcmVkdWN0KTsKKwkgICAgZGVsZXRlIF9fcmVkdWN0OworCSAgfQorICAgICAgfSAvL3BhcmFsbGVsCisKKyAgICAgIGZvciAoX1RocmVhZEluZGV4IF9faSA9IDA7IF9faSA8IF9fbnVtX3RocmVhZHM7ICsrX19pKQorCWlmIChfX2NvbnN0cnVjdGVkW19faV0pCisJICB7CisJICAgIF9fb3V0cHV0ID0gX19yKF9fb3V0cHV0LCBfX3RocmVhZF9yZXN1bHRzW19faV0pOworCSAgICBfX3RocmVhZF9yZXN1bHRzW19faV0ufl9SZXN1bHQoKTsKKwkgIH0KKworICAgICAgLy8gUG9pbnRzIHRvIGxhc3QgZWxlbWVudCBwcm9jZXNzZWQgKG5lZWRlZCBhcyByZXR1cm4gdmFsdWUgZm9yCisgICAgICAvLyBzb21lIGFsZ29yaXRobXMgbGlrZSB0cmFuc2Zvcm0pLgorICAgICAgX19mLl9NX2ZpbmlzaF9pdGVyYXRvciA9IF9fYmVnaW4gKyBfX2xlbmd0aDsKKworICAgICAgOjpvcGVyYXRvciBkZWxldGUoX190aHJlYWRfcmVzdWx0cyk7CisKKyAgICAgIGRlbGV0ZVtdIF9fY29uc3RydWN0ZWQ7CisKKyAgICAgIHJldHVybiBfX287CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX1BBUl9MT09QX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcGFyYWxsZWwuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcGFyYWxsZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmJjZWJmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9wYXJhbGxlbC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9wYXJhbGxlbC5oCisgKiAgQGJyaWVmIEVuZC11c2VyIGluY2x1ZGUgZmlsZS4gUHJvdmlkZXMgYWR2YW5jZWQgc2V0dGluZ3MgYW5kCisgKiAgdHVuaW5nIG9wdGlvbnMuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBGZWxpeCBQdXR6ZSBhbmQgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9QQVJBTExFTF9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX1BBUkFMTEVMX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9jb21waWxldGltZV9zZXR0aW5ncy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3R5cGVzLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvdGFncy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3NldHRpbmdzLmg+CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9QQVJBTExFTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3BhcnRpYWxfc3VtLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3BhcnRpYWxfc3VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1MWJhZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcGFydGlhbF9zdW0uaApAQCAtMCwwICsxLDIzMCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL3BhcnRpYWxfc3VtLmgKKyAqICBAYnJpZWYgUGFyYWxsZWwgaW1wbGVtZW50YXRpb24gb2Ygc3RkOjpwYXJ0aWFsX3N1bSgpLCBpLmUuIHByZWZpeAorKiAgc3Vtcy4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfUEFSVElBTF9TVU1fSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9QQVJUSUFMX1NVTV9IIDEKKworI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3BhcmFsbGVsLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvbnVtZXJpY2Z3ZC5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLy8gUHJvYmxlbTogdGhlcmUgaXMgbm8gMC1lbGVtZW50IGdpdmVuLgorCisgIC8qKiBAYnJpZWYgQmFzZSBjYXNlIHByZWZpeCBzdW0gcm91dGluZS4KKyAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX3Jlc3VsdCBCZWdpbiBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19iaW5fb3AgQXNzb2NpYXRpdmUgYmluYXJ5IGZ1bmN0aW9uLgorICAgKiAgQHBhcmFtIF9fdmFsdWUgU3RhcnQgdmFsdWUuIE11c3QgYmUgcGFzc2VkIHNpbmNlIHRoZSBuZXV0cmFsCisgICAqICBlbGVtZW50IGlzIHVua25vd24gaW4gZ2VuZXJhbC4KKyAgICogIEByZXR1cm4gRW5kIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fcGFyYWxsZWxfcGFydGlhbF9zdW1fYmFzZWNhc2UoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwKKwkJCQkgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorCQkJCSAgICBfQmluYXJ5T3BlcmF0aW9uIF9fYmluX29wLAorICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHMgPF9JSXRlcj46OnZhbHVlX3R5cGUgX192YWx1ZSkKKyAgICB7CisgICAgICBpZiAoX19iZWdpbiA9PSBfX2VuZCkKKwlyZXR1cm4gX19yZXN1bHQ7CisKKyAgICAgIHdoaWxlIChfX2JlZ2luICE9IF9fZW5kKQorCXsKKwkgIF9fdmFsdWUgPSBfX2Jpbl9vcChfX3ZhbHVlLCAqX19iZWdpbik7CisJICAqX19yZXN1bHQgPSBfX3ZhbHVlOworCSAgKytfX3Jlc3VsdDsKKwkgICsrX19iZWdpbjsKKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKiBAYnJpZWYgUGFyYWxsZWwgcGFydGlhbCBzdW0gaW1wbGVtZW50YXRpb24sIHR3by1waGFzZSBhcHByb2FjaCwKKyAgICAgIG5vIHJlY3Vyc2lvbi4KKyAgICAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICAgICogIEBwYXJhbSBfX3Jlc3VsdCBCZWdpbiBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuCisgICAgICAqICBAcGFyYW0gX19iaW5fb3AgQXNzb2NpYXRpdmUgYmluYXJ5IGZ1bmN0aW9uLgorICAgICAgKiAgQHBhcmFtIF9fbiBMZW5ndGggb2Ygc2VxdWVuY2UuCisgICAgICAqICBAcmV0dXJuIEVuZCBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuCisgICAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19wYXJhbGxlbF9wYXJ0aWFsX3N1bV9saW5lYXIoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwKKwkJCQkgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJCQkgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5fb3AsCisgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUgX19uKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIGlmIChfX2JlZ2luID09IF9fZW5kKQorCXJldHVybiBfX3Jlc3VsdDsKKworICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMgPQorICAgICAgICBzdGQ6Om1pbjxfRGlmZmVyZW5jZVR5cGU+KF9fZ2V0X21heF90aHJlYWRzKCksIF9fbiAtIDEpOworCisgICAgICBpZiAoX19udW1fdGhyZWFkcyA8IDIpCisJeworCSAgKl9fcmVzdWx0ID0gKl9fYmVnaW47CisJICByZXR1cm4gX19wYXJhbGxlbF9wYXJ0aWFsX3N1bV9iYXNlY2FzZShfX2JlZ2luICsgMSwgX19lbmQsCisJCQkJCQkgX19yZXN1bHQgKyAxLCBfX2Jpbl9vcCwKKwkJCQkJCSAqX19iZWdpbik7CisJfQorCisgICAgICBfRGlmZmVyZW5jZVR5cGUqIF9fYm9yZGVyczsKKyAgICAgIF9WYWx1ZVR5cGUqIF9fc3VtczsKKworICAgICAgY29uc3QgX1NldHRpbmdzJiBfX3MgPSBfU2V0dGluZ3M6OmdldCgpOworCisjICAgICBwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKF9fbnVtX3RocmVhZHMpCisgICAgICB7CisjICAgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJeworCSAgX19udW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKwkgICAgCisJICBfX2JvcmRlcnMgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbnVtX3RocmVhZHMgKyAyXTsKKworCSAgaWYgKF9fcy5wYXJ0aWFsX3N1bV9kaWxhdGlvbiA9PSAxLjBmKQorCSAgICBfX2VxdWFsbHlfc3BsaXQoX19uLCBfX251bV90aHJlYWRzICsgMSwgX19ib3JkZXJzKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2ZpcnN0X3BhcnRfbGVuZ3RoID0KKwkJICBzdGQ6Om1heDxfRGlmZmVyZW5jZVR5cGU+KDEsCisJCSAgICBfX24gLyAoMS4wZiArIF9fcy5wYXJ0aWFsX3N1bV9kaWxhdGlvbiAqIF9fbnVtX3RocmVhZHMpKTsKKwkgICAgICBfRGlmZmVyZW5jZVR5cGUgX19jaHVua19sZW5ndGggPQorCQkgIChfX24gLSBfX2ZpcnN0X3BhcnRfbGVuZ3RoKSAvIF9fbnVtX3RocmVhZHM7CisJICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fYm9yZGVyc3RhcnQgPQorCQkgIF9fbiAtIF9fbnVtX3RocmVhZHMgKiBfX2NodW5rX2xlbmd0aDsKKwkgICAgICBfX2JvcmRlcnNbMF0gPSAwOworCSAgICAgIGZvciAoX1RocmVhZEluZGV4IF9faSA9IDE7IF9faSA8IChfX251bV90aHJlYWRzICsgMSk7ICsrX19pKQorCQl7CisJCSAgX19ib3JkZXJzW19faV0gPSBfX2JvcmRlcnN0YXJ0OworCQkgIF9fYm9yZGVyc3RhcnQgKz0gX19jaHVua19sZW5ndGg7CisJCX0KKwkgICAgICBfX2JvcmRlcnNbX19udW1fdGhyZWFkcyArIDFdID0gX19uOworCSAgICB9CisKKwkgIF9fc3VtcyA9IHN0YXRpY19jYXN0PF9WYWx1ZVR5cGUqPig6Om9wZXJhdG9yIG5ldyhzaXplb2YoX1ZhbHVlVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBfX251bV90aHJlYWRzKSk7CisJICBfT3V0cHV0SXRlcmF0b3IgX190YXJnZXRfZW5kOworCX0gLy9zaW5nbGUKKworICAgICAgICBfVGhyZWFkSW5kZXggX19pYW0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgaWYgKF9faWFtID09IDApCisgICAgICAgICAgeworICAgICAgICAgICAgKl9fcmVzdWx0ID0gKl9fYmVnaW47CisgICAgICAgICAgICBfX3BhcmFsbGVsX3BhcnRpYWxfc3VtX2Jhc2VjYXNlKF9fYmVnaW4gKyAxLAorCQkJCQkgICAgX19iZWdpbiArIF9fYm9yZGVyc1sxXSwKKwkJCQkJICAgIF9fcmVzdWx0ICsgMSwKKwkJCQkJICAgIF9fYmluX29wLCAqX19iZWdpbik7CisgICAgICAgICAgICA6Om5ldygmKF9fc3Vtc1tfX2lhbV0pKSBfVmFsdWVUeXBlKCooX19yZXN1bHQgKyBfX2JvcmRlcnNbMV0gLSAxKSk7CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgOjpuZXcoJihfX3N1bXNbX19pYW1dKSkKKyAgICAgICAgICAgICAgX1ZhbHVlVHlwZShfX2dudV9wYXJhbGxlbDo6YWNjdW11bGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbiArIF9fYm9yZGVyc1tfX2lhbV0gKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luICsgX19ib3JkZXJzW19faWFtICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooX19iZWdpbiArIF9fYm9yZGVyc1tfX2lhbV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Jpbl9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpKTsKKyAgICAgICAgICB9CisKKyMgICAgICAgcHJhZ21hIG9tcCBiYXJyaWVyCisKKyMgICAgICAgcHJhZ21hIG9tcCBzaW5nbGUKKwlfX3BhcmFsbGVsX3BhcnRpYWxfc3VtX2Jhc2VjYXNlKF9fc3VtcyArIDEsIF9fc3VtcyArIF9fbnVtX3RocmVhZHMsCisJCQkJCV9fc3VtcyArIDEsIF9fYmluX29wLCBfX3N1bXNbMF0pOworCisjICAgICAgIHByYWdtYSBvbXAgYmFycmllcgorCisJLy8gU3RpbGwgc2FtZSB0ZWFtLgorICAgICAgICBfX3BhcmFsbGVsX3BhcnRpYWxfc3VtX2Jhc2VjYXNlKF9fYmVnaW4gKyBfX2JvcmRlcnNbX19pYW0gKyAxXSwKKwkJCQkJX19iZWdpbiArIF9fYm9yZGVyc1tfX2lhbSArIDJdLAorCQkJCQlfX3Jlc3VsdCArIF9fYm9yZGVyc1tfX2lhbSArIDFdLAorCQkJCQlfX2Jpbl9vcCwgX19zdW1zW19faWFtXSk7CisgICAgICB9IC8vcGFyYWxsZWwKKworICAgICAgZm9yIChfVGhyZWFkSW5kZXggX19pID0gMDsgX19pIDwgX19udW1fdGhyZWFkczsgKytfX2kpCisJX19zdW1zW19faV0ufl9WYWx1ZVR5cGUoKTsKKyAgICAgIDo6b3BlcmF0b3IgZGVsZXRlKF9fc3Vtcyk7CisKKyAgICAgIGRlbGV0ZVtdIF9fYm9yZGVyczsKKworICAgICAgcmV0dXJuIF9fcmVzdWx0ICsgX19uOworICAgIH0KKworICAvKiogQGJyaWVmIFBhcmFsbGVsIHBhcnRpYWwgc3VtIGZyb250LV9fZW5kLgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fcmVzdWx0IEJlZ2luIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2Jpbl9vcCBBc3NvY2lhdGl2ZSBiaW5hcnkgZnVuY3Rpb24uCisgICAqICBAcmV0dXJuIEVuZCBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3BhcmFsbGVsX3BhcnRpYWxfc3VtKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsCisJCQkgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlPcGVyYXRpb24gX19iaW5fb3ApCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2JlZ2luIC0gX19lbmQpCisKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX24gPSBfX2VuZCAtIF9fYmVnaW47CisKKyAgICAgIHN3aXRjaCAoX1NldHRpbmdzOjpnZXQoKS5wYXJ0aWFsX3N1bV9hbGdvcml0aG0pCisJeworCWNhc2UgTElORUFSOgorCSAgLy8gTmVlZCBhbiBpbml0aWFsIG9mZnNldC4KKwkgIHJldHVybiBfX3BhcmFsbGVsX3BhcnRpYWxfc3VtX2xpbmVhcihfX2JlZ2luLCBfX2VuZCwgX19yZXN1bHQsCisJCQkJCSAgICAgICBfX2Jpbl9vcCwgX19uKTsKKwlkZWZhdWx0OgorCSAgLy8gUGFydGlhbF9zdW0gYWxnb3JpdGhtIG5vdCBpbXBsZW1lbnRlZC4KKwkgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVCgwKTsKKwkgIHJldHVybiBfX3Jlc3VsdCArIF9fbjsKKwl9CisgICAgfQorfQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfUEFSVElBTF9TVU1fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9wYXJ0aXRpb24uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcGFydGl0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNjNDNkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcGFydGl0aW9uLmgKQEAgLTAsMCArMSw0MzQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9wYXJ0aXRpb24uaAorICogIEBicmllZiBQYXJhbGxlbCBpbXBsZW1lbnRhdGlvbiBvZiBzdGQ6OnBhcnRpdGlvbigpLAorICogIHN0ZDo6bnRoX2VsZW1lbnQoKSwgYW5kIHN0ZDo6cGFydGlhbF9zb3J0KCkuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyIGFuZCBGZWxpeCBQdXR6ZS4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9QQVJUSVRJT05fSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9QQVJUSVRJT05fSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNpY19pdGVyYXRvci5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3NvcnQuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9yYW5kb21fbnVtYmVyLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnby5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3BhcmFsbGVsLmg+CisKKy8qKiBAYnJpZWYgRGVjaWRlIHdoZXRoZXIgdG8gZGVjbGFyZSBjZXJ0YWluIHZhcmlhYmxlcyB2b2xhdGlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVk9MQVRJTEUgdm9sYXRpbGUKKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgUGFyYWxsZWwgaW1wbGVtZW50YXRpb24gb2Ygc3RkOjpwYXJ0aXRpb24uCisgICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UgdG8gc3BsaXQuCisgICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZSB0byBzcGxpdC4KKyAgICAqICBAcGFyYW0gX19wcmVkIFBhcnRpdGlvbiBwcmVkaWNhdGUsIHBvc3NpYmx5IGluY2x1ZGluZyBzb21lIGtpbmQKKyAgICAqICAgICAgICAgb2YgcGl2b3QuCisgICAgKiAgQHBhcmFtIF9fbnVtX3RocmVhZHMgTWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2UgZm9yIHRoaXMgdGFzay4KKyAgICAqICBAcmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBub3QgZnVsZmlsbGluZyB0aGUgcHJlZGljYXRlLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBfX3BhcmFsbGVsX3BhcnRpdGlvbihfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCQkgX1ByZWRpY2F0ZSBfX3ByZWQsIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19uID0gX19lbmQgLSBfX2JlZ2luOworCisgICAgICBfR0xJQkNYWF9DQUxMKF9fbikKKworICAgICAgY29uc3QgX1NldHRpbmdzJiBfX3MgPSBfU2V0dGluZ3M6OmdldCgpOworCisgICAgICAvLyBzaGFyZWQKKyAgICAgIF9HTElCQ1hYX1ZPTEFUSUxFIF9EaWZmZXJlbmNlVHlwZSBfX2xlZnQgPSAwLCBfX3JpZ2h0ID0gX19uIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Rpc3QgPSBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19sZWZ0b3Zlcl9sZWZ0LCBfX2xlZnRvdmVyX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGVmdG5ldywgX19yaWdodG5ldzsKKworICAgICAgLy8ganVzdCAwIG9yIDEsIGJ1dCBpbnQgdG8gYWxsb3cgYXRvbWljIG9wZXJhdGlvbnMKKyAgICAgIGludCogX19yZXNlcnZlZF9sZWZ0ID0gMCwgKiBfX3Jlc2VydmVkX3JpZ2h0ID0gMDsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fY2h1bmtfc2l6ZSA9IF9fcy5wYXJ0aXRpb25fY2h1bmtfc2l6ZTsKKworICAgICAgLy9hdCBsZWFzdCB0d28gY2h1bmtzIHBlciB0aHJlYWQKKyAgICAgIGlmIChfX2Rpc3QgPj0gMiAqIF9fbnVtX3RocmVhZHMgKiBfX2NodW5rX3NpemUpCisjICAgICAgIHByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoX19udW1fdGhyZWFkcykKKwl7CisjICAgICAgICAgcHJhZ21hIG9tcCBzaW5nbGUKKwkgIHsKKwkgICAgX19udW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKwkgICAgX19yZXNlcnZlZF9sZWZ0ID0gbmV3IGludFtfX251bV90aHJlYWRzXTsKKwkgICAgX19yZXNlcnZlZF9yaWdodCA9IG5ldyBpbnRbX19udW1fdGhyZWFkc107CisKKwkgICAgaWYgKF9fcy5wYXJ0aXRpb25fY2h1bmtfc2hhcmUgPiAwLjApCisJICAgICAgX19jaHVua19zaXplID0gc3RkOjptYXg8X0RpZmZlcmVuY2VUeXBlPgorCQkoX19zLnBhcnRpdGlvbl9jaHVua19zaXplLCAoZG91YmxlKV9fbiAKKwkJICogX19zLnBhcnRpdGlvbl9jaHVua19zaGFyZSAvIChkb3VibGUpX19udW1fdGhyZWFkcyk7CisJICAgIGVsc2UKKwkgICAgICBfX2NodW5rX3NpemUgPSBfX3MucGFydGl0aW9uX2NodW5rX3NpemU7CisJICB9CisKKwkgIHdoaWxlIChfX2Rpc3QgPj0gMiAqIF9fbnVtX3RocmVhZHMgKiBfX2NodW5rX3NpemUpCisJICAgIHsKKyMgICAgICAgICAgICAgcHJhZ21hIG9tcCBzaW5nbGUKKwkgICAgICB7CisJCV9EaWZmZXJlbmNlVHlwZSBfX251bV9jaHVua3MgPSBfX2Rpc3QgLyBfX2NodW5rX3NpemU7CisKKwkJZm9yIChfVGhyZWFkSW5kZXggX19yID0gMDsgX19yIDwgX19udW1fdGhyZWFkczsgKytfX3IpCisJCSAgeworCQkgICAgX19yZXNlcnZlZF9sZWZ0IFtfX3JdID0gMDsgLy8gZmFsc2UKKwkJICAgIF9fcmVzZXJ2ZWRfcmlnaHRbX19yXSA9IDA7IC8vIGZhbHNlCisJCSAgfQorCQlfX2xlZnRvdmVyX2xlZnQgPSAwOworCQlfX2xlZnRvdmVyX3JpZ2h0ID0gMDsKKwkgICAgICB9IC8vaW1wbGljaXQgYmFycmllcgorCisJICAgICAgLy8gUHJpdmF0ZS4KKwkgICAgICBfRGlmZmVyZW5jZVR5cGUgX190aHJlYWRfbGVmdCwgX190aHJlYWRfbGVmdF9ib3JkZXIsCisJCSAgICAgICAgICAgICAgX190aHJlYWRfcmlnaHQsIF9fdGhyZWFkX3JpZ2h0X2JvcmRlcjsKKworCSAgICAgIF9fdGhyZWFkX2xlZnQgPSBfX2xlZnQgKyAxOworCSAgICAgIC8vIEp1c3QgdG8gc2F0aXNmeSB0aGUgY29uZGl0aW9uIGJlbG93LgorCSAgICAgIF9fdGhyZWFkX2xlZnRfYm9yZGVyID0gX190aHJlYWRfbGVmdCAtIDE7CisKKwkgICAgICBfX3RocmVhZF9yaWdodCA9IF9fbiAtIDE7CisgICAgICAgICAgICAgLy8gSnVzdCB0byBzYXRpc2Z5IHRoZSBjb25kaXRpb24gYmVsb3cuCisJICAgICAgX190aHJlYWRfcmlnaHRfYm9yZGVyID0gX190aHJlYWRfcmlnaHQgKyAxOworCisJICAgICAgYm9vbCBfX2lhbV9maW5pc2hlZCA9IGZhbHNlOworCSAgICAgIHdoaWxlICghX19pYW1fZmluaXNoZWQpCisJCXsKKwkJICBpZiAoX190aHJlYWRfbGVmdCA+IF9fdGhyZWFkX2xlZnRfYm9yZGVyKQorCQkgICAgeworICAgICAgICAgICAgICAgICAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2Zvcm1lcl9kaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmV0Y2hfYW5kX2FkZCgmX19kaXN0LCAtX19jaHVua19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoX19mb3JtZXJfZGlzdCA8IF9fY2h1bmtfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19mZXRjaF9hbmRfYWRkKCZfX2Rpc3QsIF9fY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9faWFtX2ZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RocmVhZF9sZWZ0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZldGNoX2FuZF9hZGQoJl9fbGVmdCwgX19jaHVua19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX190aHJlYWRfbGVmdF9ib3JkZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGhyZWFkX2xlZnQgKyAoX19jaHVua19zaXplIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCSAgICB9CisKKwkJICBpZiAoX190aHJlYWRfcmlnaHQgPCBfX3RocmVhZF9yaWdodF9ib3JkZXIpCisJCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fZm9ybWVyX2Rpc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mZXRjaF9hbmRfYWRkKCZfX2Rpc3QsIC1fX2NodW5rX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2Zvcm1lcl9kaXN0IDwgX19jaHVua19zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZldGNoX2FuZF9hZGQoJl9fZGlzdCwgX19jaHVua19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19pYW1fZmluaXNoZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGhyZWFkX3JpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZldGNoX2FuZF9hZGQoJl9fcmlnaHQsIC1fX2NodW5rX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RocmVhZF9yaWdodF9ib3JkZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGhyZWFkX3JpZ2h0IC0gKF9fY2h1bmtfc2l6ZSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkgICAgfQorCisJCSAgLy8gU3dhcCBhcyB1c3VhbC4KKwkJICB3aGlsZSAoX190aHJlYWRfbGVmdCA8IF9fdGhyZWFkX3JpZ2h0KQorCQkgICAgeworCQkgICAgICB3aGlsZSAoX19wcmVkKF9fYmVnaW5bX190aHJlYWRfbGVmdF0pCisJCQkgICAgICYmIF9fdGhyZWFkX2xlZnQgPD0gX190aHJlYWRfbGVmdF9ib3JkZXIpCisJCQkrK19fdGhyZWFkX2xlZnQ7CisJCSAgICAgIHdoaWxlICghX19wcmVkKF9fYmVnaW5bX190aHJlYWRfcmlnaHRdKQorCQkJICAgICAmJiBfX3RocmVhZF9yaWdodCA+PSBfX3RocmVhZF9yaWdodF9ib3JkZXIpCisJCQktLV9fdGhyZWFkX3JpZ2h0OworCisJCSAgICAgIGlmIChfX3RocmVhZF9sZWZ0ID4gX190aHJlYWRfbGVmdF9ib3JkZXIKKwkJCSAgfHwgX190aHJlYWRfcmlnaHQgPCBfX3RocmVhZF9yaWdodF9ib3JkZXIpCisJCQkvLyBGZXRjaCBuZXcgY2h1bmsoX19zKS4KKwkJCWJyZWFrOworCisJCSAgICAgIHN0ZDo6aXRlcl9zd2FwKF9fYmVnaW4gKyBfX3RocmVhZF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luICsgX190aHJlYWRfcmlnaHQpOworCQkgICAgICArK19fdGhyZWFkX2xlZnQ7CisJCSAgICAgIC0tX190aHJlYWRfcmlnaHQ7CisJCSAgICB9CisJCX0KKworCSAgICAgIC8vIE5vdyBzd2FwIHRoZSBsZWZ0b3ZlciBjaHVua3MgdG8gdGhlIHJpZ2h0IHBsYWNlcy4KKwkgICAgICBpZiAoX190aHJlYWRfbGVmdCA8PSBfX3RocmVhZF9sZWZ0X2JvcmRlcikKKyMgICAgICAgICAgICAgICBwcmFnbWEgb21wIGF0b21pYworCQkrK19fbGVmdG92ZXJfbGVmdDsKKwkgICAgICBpZiAoX190aHJlYWRfcmlnaHQgPj0gX190aHJlYWRfcmlnaHRfYm9yZGVyKQorIyAgICAgICAgICAgICAgIHByYWdtYSBvbXAgYXRvbWljCisJCSsrX19sZWZ0b3Zlcl9yaWdodDsKKworIyAgICAgICAgICAgICBwcmFnbWEgb21wIGJhcnJpZXIKKworICAgICAgICAgICAgICBfRGlmZmVyZW5jZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgX19sZWZ0b2xkID0gX19sZWZ0LAorICAgICAgICAgICAgICAgICAgICBfX2xlZnRuZXcgPSBfX2xlZnQgLSBfX2xlZnRvdmVyX2xlZnQgKiBfX2NodW5rX3NpemUsCisgICAgICAgICAgICAgICAgICAgIF9fcmlnaHRvbGQgPSBfX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICBfX3JpZ2h0bmV3ID0gX19yaWdodCArIF9fbGVmdG92ZXJfcmlnaHQgKiBfX2NodW5rX3NpemU7CisKKwkgICAgICAvLyA8PT4gX190aHJlYWRfbGVmdF9ib3JkZXIgKyAoX19jaHVua19zaXplIC0gMSkgPj0gX19sZWZ0bmV3CisJICAgICAgaWYgKF9fdGhyZWFkX2xlZnQgPD0gX190aHJlYWRfbGVmdF9ib3JkZXIKKwkJICAmJiBfX3RocmVhZF9sZWZ0X2JvcmRlciA+PSBfX2xlZnRuZXcpCisJCXsKKwkJICAvLyBDaHVuayBhbHJlYWR5IGluIHBsYWNlLCByZXNlcnZlIHNwb3QuCisJCV9fcmVzZXJ2ZWRfbGVmdFsoX19sZWZ0IC0gKF9fdGhyZWFkX2xlZnRfYm9yZGVyICsgMSkpCisJCQkJLyBfX2NodW5rX3NpemVdID0gMTsKKwkJfQorCisJICAgICAgLy8gPD0+IF9fdGhyZWFkX3JpZ2h0X2JvcmRlciAtIChfX2NodW5rX3NpemUgLSAxKSA8PSBfX3JpZ2h0bmV3CisJICAgICAgaWYgKF9fdGhyZWFkX3JpZ2h0ID49IF9fdGhyZWFkX3JpZ2h0X2JvcmRlcgorCQkgICYmIF9fdGhyZWFkX3JpZ2h0X2JvcmRlciA8PSBfX3JpZ2h0bmV3KQorCQl7CisJCSAgLy8gQ2h1bmsgYWxyZWFkeSBpbiBwbGFjZSwgcmVzZXJ2ZSBzcG90LgorCQkgIF9fcmVzZXJ2ZWRfcmlnaHRbKChfX3RocmVhZF9yaWdodF9ib3JkZXIgLSAxKSAtIF9fcmlnaHQpCisJCQkJICAgLyBfX2NodW5rX3NpemVdID0gMTsKKwkJfQorCisjICAgICAgICAgICAgIHByYWdtYSBvbXAgYmFycmllcgorCisJICAgICAgaWYgKF9fdGhyZWFkX2xlZnQgPD0gX190aHJlYWRfbGVmdF9ib3JkZXIKKwkJICAmJiBfX3RocmVhZF9sZWZ0X2JvcmRlciA8IF9fbGVmdG5ldykKKwkJeworCQkgIC8vIEZpbmQgc3BvdCBhbmQgc3dhcC4KKwkJICBfRGlmZmVyZW5jZVR5cGUgX19zd2Fwc3RhcnQgPSAtMTsKKyAgICAgICAgICAgICAgICAgIGZvciAoaW50IF9fciA9IDA7IF9fciA8IF9fbGVmdG92ZXJfbGVmdDsgKytfX3IpCisgICAgICAgICAgICAgICAgICAgIGlmIChfX3Jlc2VydmVkX2xlZnRbX19yXSA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBfX2NvbXBhcmVfYW5kX3N3YXAoJihfX3Jlc2VydmVkX2xlZnRbX19yXSksIDAsIDEpKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fc3dhcHN0YXJ0ID0gX19sZWZ0b2xkIC0gKF9fciArIDEpICogX19jaHVua19zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworCQkgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX3N3YXBzdGFydCAhPSAtMSk7CisjZW5kaWYKKworCQkgIHN0ZDo6c3dhcF9yYW5nZXMoX19iZWdpbiArIF9fdGhyZWFkX2xlZnRfYm9yZGVyCisJCQkJICAgLSAoX19jaHVua19zaXplIC0gMSksCisJCQkJICAgX19iZWdpbiArIF9fdGhyZWFkX2xlZnRfYm9yZGVyICsgMSwKKwkJCQkgICBfX2JlZ2luICsgX19zd2Fwc3RhcnQpOworCQl9CisKKwkgICAgICBpZiAoX190aHJlYWRfcmlnaHQgPj0gX190aHJlYWRfcmlnaHRfYm9yZGVyCisJCSAgJiYgX190aHJlYWRfcmlnaHRfYm9yZGVyID4gX19yaWdodG5ldykKKwkJeworCQkgIC8vIEZpbmQgc3BvdCBhbmQgc3dhcAorCQkgIF9EaWZmZXJlbmNlVHlwZSBfX3N3YXBzdGFydCA9IC0xOworICAgICAgICAgICAgICAgICAgZm9yIChpbnQgX19yID0gMDsgX19yIDwgX19sZWZ0b3Zlcl9yaWdodDsgKytfX3IpCisgICAgICAgICAgICAgICAgICAgIGlmIChfX3Jlc2VydmVkX3JpZ2h0W19fcl0gPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgX19jb21wYXJlX2FuZF9zd2FwKCYoX19yZXNlcnZlZF9yaWdodFtfX3JdKSwgMCwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19zd2Fwc3RhcnQgPSBfX3JpZ2h0b2xkICsgX19yICogX19jaHVua19zaXplICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIH0KKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkJICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX19zd2Fwc3RhcnQgIT0gLTEpOworI2VuZGlmCisKKwkJICBzdGQ6OnN3YXBfcmFuZ2VzKF9fYmVnaW4gKyBfX3RocmVhZF9yaWdodF9ib3JkZXIsCisJCQkJICAgX19iZWdpbiArIF9fdGhyZWFkX3JpZ2h0X2JvcmRlcgorCQkJCSAgICsgX19jaHVua19zaXplLCBfX2JlZ2luICsgX19zd2Fwc3RhcnQpOworCSAgICAgIH0KKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisjICAgICAgICAgICAgIHByYWdtYSBvbXAgYmFycmllcgorCisjICAgICAgICAgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJICAgICAgeworCQlmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX3IgPSAwOyBfX3IgPCBfX2xlZnRvdmVyX2xlZnQ7ICsrX19yKQorCQkgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX3Jlc2VydmVkX2xlZnRbX19yXSA9PSAxKTsKKwkJZm9yIChfRGlmZmVyZW5jZVR5cGUgX19yID0gMDsgX19yIDwgX19sZWZ0b3Zlcl9yaWdodDsgKytfX3IpCisJCSAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9fcmVzZXJ2ZWRfcmlnaHRbX19yXSA9PSAxKTsKKwkgICAgICB9CisjZW5kaWYKKworCSAgICAgIF9fbGVmdCA9IF9fbGVmdG5ldzsKKwkgICAgICBfX3JpZ2h0ID0gX19yaWdodG5ldzsKKyAgICAgICAgICAgICAgX19kaXN0ID0gX19yaWdodCAtIF9fbGVmdCArIDE7CisJICAgIH0KKworIyAgICAgICAgICAgcHJhZ21hIG9tcCBmbHVzaChfX2xlZnQsIF9fcmlnaHQpCisJfSAvLyBlbmQgInJlY3Vyc2lvbiIgLy9wYXJhbGxlbAorCisgICAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2ZpbmFsX2xlZnQgPSBfX2xlZnQsIF9fZmluYWxfcmlnaHQgPSBfX3JpZ2h0OworCisJd2hpbGUgKF9fZmluYWxfbGVmdCA8IF9fZmluYWxfcmlnaHQpCisJICB7CisJICAgIC8vIEdvIHJpZ2h0IHVudGlsIGtleSBpcyBnZXEgdGhhbiBwaXZvdC4KKwkgICAgd2hpbGUgKF9fcHJlZChfX2JlZ2luW19fZmluYWxfbGVmdF0pCisJCSAgICYmIF9fZmluYWxfbGVmdCA8IF9fZmluYWxfcmlnaHQpCisJICAgICAgKytfX2ZpbmFsX2xlZnQ7CisKKwkgICAgLy8gR28gbGVmdCB1bnRpbCBrZXkgaXMgbGVzcyB0aGFuIHBpdm90LgorCSAgICB3aGlsZSAoIV9fcHJlZChfX2JlZ2luW19fZmluYWxfcmlnaHRdKQorCQkgICAmJiBfX2ZpbmFsX2xlZnQgPCBfX2ZpbmFsX3JpZ2h0KQorCSAgICAgIC0tX19maW5hbF9yaWdodDsKKworCSAgICBpZiAoX19maW5hbF9sZWZ0ID09IF9fZmluYWxfcmlnaHQpCisJICAgICAgYnJlYWs7CisJICAgIHN0ZDo6aXRlcl9zd2FwKF9fYmVnaW4gKyBfX2ZpbmFsX2xlZnQsIF9fYmVnaW4gKyBfX2ZpbmFsX3JpZ2h0KTsKKwkgICAgKytfX2ZpbmFsX2xlZnQ7CisJICAgIC0tX19maW5hbF9yaWdodDsKKwkgIH0KKworCS8vIEFsbCBlbGVtZW50cyBvbiB0aGUgbGVmdCBzaWRlIGFyZSA8IHBpdiwgYWxsIGVsZW1lbnRzIG9uIHRoZQorCS8vIHJpZ2h0IGFyZSA+PSBwaXYKKwlkZWxldGVbXSBfX3Jlc2VydmVkX2xlZnQ7CisJZGVsZXRlW10gX19yZXNlcnZlZF9yaWdodDsKKworCS8vIEVsZW1lbnQgImJldHdlZW4iIF9fZmluYWxfbGVmdCBhbmQgX19maW5hbF9yaWdodCBtaWdodCBub3QgaGF2ZQorCS8vIGJlZW4gcmVnYXJkZWQgeWV0CisJaWYgKF9fZmluYWxfbGVmdCA8IF9fbiAmJiAhX19wcmVkKF9fYmVnaW5bX19maW5hbF9sZWZ0XSkpCisJICAvLyBSZWFsbHkgc3dhcHBlZC4KKwkgIHJldHVybiBfX2ZpbmFsX2xlZnQ7CisJZWxzZQorCSAgcmV0dXJuIF9fZmluYWxfbGVmdCArIDE7CisgICAgfQorCisgIC8qKgorICAgICogIEBicmllZiBQYXJhbGxlbCBpbXBsZW1lbnRhdGlvbiBvZiBzdGQ6Om50aF9lbGVtZW50KCkuCisgICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAgKiAgQHBhcmFtIF9fbnRoIF9JdGVyYXRvciBvZiBlbGVtZW50IHRoYXQgbXVzdCBiZSBpbiBwb3NpdGlvbiBhZnRlcndhcmRzLgorICAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQgCisgICAgX19wYXJhbGxlbF9udGhfZWxlbWVudChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19udGgsIAorCQkJICAgX1JBSXRlciBfX2VuZCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfR0xJQkNYWF9DQUxMKF9fZW5kIC0gX19iZWdpbikKKworICAgICAgX1JBSXRlciBfX3NwbGl0OworICAgICAgX1JhbmRvbU51bWJlciBfX3JuZzsKKworICAgICAgY29uc3QgX1NldHRpbmdzJiBfX3MgPSBfU2V0dGluZ3M6OmdldCgpOworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbWluaW11bV9sZW5ndGggPSBzdGQ6Om1heDxfRGlmZmVyZW5jZVR5cGU+KDIsCisgICAgICAgIHN0ZDo6bWF4KF9fcy5udGhfZWxlbWVudF9taW5pbWFsX24sIF9fcy5wYXJ0aXRpb25fbWluaW1hbF9uKSk7CisKKyAgICAgIC8vIEJyZWFrIGlmIGlucHV0IHJhbmdlIHRvIHNtYWxsLgorICAgICAgd2hpbGUgKHN0YXRpY19jYXN0PF9TZXF1ZW5jZUluZGV4PihfX2VuZCAtIF9fYmVnaW4pID49IF9fbWluaW11bV9sZW5ndGgpCisJeworICAgICAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX24gPSBfX2VuZCAtIF9fYmVnaW47CisKKyAgICAgICAgICBfUkFJdGVyIF9fcGl2b3RfcG9zID0gX19iZWdpbiArIF9fcm5nKF9fbik7CisKKyAgICAgICAgICAvLyBTd2FwIF9fcGl2b3RfcG9zIHZhbHVlIHRvIGVuZC4KKyAgICAgICAgICBpZiAoX19waXZvdF9wb3MgIT0gKF9fZW5kIC0gMSkpCisgICAgICAgICAgICBzdGQ6Oml0ZXJfc3dhcChfX3Bpdm90X3BvcywgX19lbmQgLSAxKTsKKyAgICAgICAgICBfX3Bpdm90X3BvcyA9IF9fZW5kIC0gMTsKKworICAgICAgICAgIC8vIF9Db21wYXJlIG11c3QgaGF2ZSBmaXJzdF92YWx1ZV90eXBlLCBzZWNvbmRfdmFsdWVfdHlwZSwKKyAgICAgICAgICAvLyByZXN1bHRfdHlwZQorICAgICAgICAgIC8vIF9Db21wYXJlID09CisgICAgICAgICAgLy8gX19nbnVfcGFyYWxsZWw6Ol9MZXhpY29ncmFwaGljPFMsIGludCwKKwkgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X0xlc3M8UywgUz4gPgorICAgICAgICAgIC8vIF9fcGl2b3RfcG9zID09IHN0ZDo6cGFpcjxTLCBpbnQ+KgorICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX2JpbmRlcjJuZDxfQ29tcGFyZSwgX1ZhbHVlVHlwZSwgX1ZhbHVlVHlwZSwgYm9vbD4KKyAgICAgICAgICAgIF9fcHJlZChfX2NvbXAsICpfX3Bpdm90X3Bvcyk7CisKKyAgICAgICAgICAvLyBEaXZpZGUsIGxlYXZlIHBpdm90IHVuY2hhbmdlZCBpbiBsYXN0IHBsYWNlLgorICAgICAgICAgIF9SQUl0ZXIgX19zcGxpdF9wb3MxLCBfX3NwbGl0X3BvczI7CisgICAgICAgICAgX19zcGxpdF9wb3MxID0gX19iZWdpbiArIF9fcGFyYWxsZWxfcGFydGl0aW9uKF9fYmVnaW4sIF9fZW5kIC0gMSwKKwkJCQkJCQlfX3ByZWQsCisJCQkJCQkJX19nZXRfbWF4X3RocmVhZHMoKSk7CisKKyAgICAgICAgICAvLyBMZWZ0IHNpZGU6IDwgX19waXZvdF9wb3M7IF9fcmlnaHQgc2lkZTogPj0gX19waXZvdF9wb3MKKworICAgICAgICAgIC8vIFN3YXAgcGl2b3QgYmFjayB0byBtaWRkbGUuCisgICAgICAgICAgaWYgKF9fc3BsaXRfcG9zMSAhPSBfX3Bpdm90X3BvcykKKyAgICAgICAgICAgIHN0ZDo6aXRlcl9zd2FwKF9fc3BsaXRfcG9zMSwgX19waXZvdF9wb3MpOworICAgICAgICAgIF9fcGl2b3RfcG9zID0gX19zcGxpdF9wb3MxOworCisgICAgICAgICAgLy8gSW4gY2FzZSBhbGwgZWxlbWVudHMgYXJlIGVxdWFsLCBfX3NwbGl0X3BvczEgPT0gMAorICAgICAgICAgIGlmICgoX19zcGxpdF9wb3MxICsgMSAtIF9fYmVnaW4pIDwgKF9fbiA+PiA3KQorICAgICAgICAgICAgICB8fCAoX19lbmQgLSBfX3NwbGl0X3BvczEpIDwgKF9fbiA+PiA3KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gVmVyeSB1bmVxdWFsIHNwbGl0LCBvbmUgcGFydCBzbWFsbGVyIHRoYW4gb25lIDEyOHRoCisgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIG5vdCBzdHJpY3RseSBsYXJnZXIgdGhhbiB0aGUgcGl2b3QuCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX3VuYXJ5X25lZ2F0ZTxfX2dudV9wYXJhbGxlbDo6CisgICAgICAgIAlfX2JpbmRlcjFzdDxfQ29tcGFyZSwgX1ZhbHVlVHlwZSwKKwkJICAgICAgICAgICAgX1ZhbHVlVHlwZSwgYm9vbD4sIF9WYWx1ZVR5cGU+CisgICAgICAgIAlfX3ByZWQoX19nbnVfcGFyYWxsZWw6Ol9fYmluZGVyMXN0PF9Db21wYXJlLCBfVmFsdWVUeXBlLAorCQkgICAgICAgX1ZhbHVlVHlwZSwgYm9vbD4oX19jb21wLCAqX19waXZvdF9wb3MpKTsKKworICAgICAgICAgICAgICAvLyBGaW5kIG90aGVyIGVuZCBvZiBwaXZvdC1lcXVhbCByYW5nZS4KKyAgICAgICAgICAgICAgX19zcGxpdF9wb3MyID0gX19nbnVfc2VxdWVudGlhbDo6cGFydGl0aW9uKF9fc3BsaXRfcG9zMSArIDEsCisJCQkJCQkJIF9fZW5kLCBfX3ByZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vIE9ubHkgc2tpcCB0aGUgcGl2b3QuCisgICAgICAgICAgICBfX3NwbGl0X3BvczIgPSBfX3NwbGl0X3BvczEgKyAxOworCisgICAgICAgICAgLy8gQ29tcGFyZSBpdGVyYXRvcnMuCisgICAgICAgICAgaWYgKF9fc3BsaXRfcG9zMiA8PSBfX250aCkKKyAgICAgICAgICAgIF9fYmVnaW4gPSBfX3NwbGl0X3BvczI7CisgICAgICAgICAgZWxzZSBpZiAoX19udGggPCBfX3NwbGl0X3BvczEpCisgICAgICAgICAgICBfX2VuZCA9IF9fc3BsaXRfcG9zMTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKwl9CisKKyAgICAgIC8vIE9ubHkgYXQgbW9zdCBfU2V0dGluZ3M6OnBhcnRpdGlvbl9taW5pbWFsX24gX19lbGVtZW50cyBfX2xlZnQuCisgICAgICBfX2dudV9zZXF1ZW50aWFsOjpudGhfZWxlbWVudChfX2JlZ2luLCBfX250aCwgX19lbmQsIF9fY29tcCk7CisgICAgfQorCisgIC8qKiBAYnJpZWYgUGFyYWxsZWwgaW1wbGVtZW50YXRpb24gb2Ygc3RkOjpwYXJ0aWFsX3NvcnQoKS4KKyAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICogIEBwYXJhbSBfX21pZGRsZSBTb3J0IHVudGlsIHRoaXMgcG9zaXRpb24uCisgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fcGFyYWxsZWxfcGFydGlhbF9zb3J0KF9SQUl0ZXIgX19iZWdpbiwKKwkJCSAgICBfUkFJdGVyIF9fbWlkZGxlLAorCQkJICAgIF9SQUl0ZXIgX19lbmQsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBfX3BhcmFsbGVsX250aF9lbGVtZW50KF9fYmVnaW4sIF9fbWlkZGxlLCBfX2VuZCwgX19jb21wKTsKKyAgICAgIHN0ZDo6c29ydChfX2JlZ2luLCBfX21pZGRsZSwgX19jb21wKTsKKyAgICB9CisKK30gLy9uYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKKworI3VuZGVmIF9HTElCQ1hYX1ZPTEFUSUxFCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9QQVJUSVRJT05fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9xdWV1ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTViOWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3F1ZXVlLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9xdWV1ZS5oCisgKiAgQGJyaWVmIExvY2stZnJlZSBkb3VibGUtZW5kZWQgcXVldWUuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX1FVRVVFX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfUVVFVUVfSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC90eXBlcy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2Jhc2UuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9jb21wYXRpYmlsaXR5Lmg+CisKKy8qKiBAYnJpZWYgRGVjaWRlIHdoZXRoZXIgdG8gZGVjbGFyZSBjZXJ0YWluIHZhcmlhYmxlIHZvbGF0aWxlIGluIHRoaXMgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVk9MQVRJTEUgdm9sYXRpbGUKKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKkBicmllZiBEb3VibGUtZW5kZWQgcXVldWUgb2YgYm91bmRlZCBzaXplLCBhbGxvd2luZyBsb2NrLWZyZWUKKyAgICogIGF0b21pYyBhY2Nlc3MuICBwdXNoX2Zyb250KCkgYW5kIHBvcF9mcm9udCgpIG11c3Qgbm90IGJlIGNhbGxlZAorICAgKiAgY29uY3VycmVudGx5IHRvIGVhY2ggb3RoZXIsIHdoaWxlIHBvcF9iYWNrKCkgY2FuIGJlIGNhbGxlZAorICAgKiAgY29uY3VycmVudGx5IGF0IGFsbCB0aW1lcy4KKyAgICogIEBjIGVtcHR5KCksIEBjIHNpemUoKSwgYW5kIEBjIHRvcCgpIGFyZSBpbnRlbnRpb25hbGx5IG5vdCBwcm92aWRlZC4KKyAgICogIENhbGxpbmcgdGhlbSB3b3VsZCBub3QgbWFrZSBzZW5zZSBpbiBhIGNvbmN1cnJlbnQgc2V0dGluZy4KKyAgICogIEBwYXJhbSBfVHAgQ29udGFpbmVkIGVsZW1lbnQgdHlwZS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9SZXN0cmljdGVkQm91bmRlZENvbmN1cnJlbnRRdWV1ZQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgLyoqIEBicmllZiBBcnJheSBvZiBlbGVtZW50cywgc2VlbiBhcyBjeWNsaWMgYnVmZmVyLiAqLworICAgICAgX1RwKiBfTV9iYXNlOworCisgICAgICAvKiogQGJyaWVmIE1heGltYWwgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBhdCB0aGUgc2FtZSB0aW1lLiAqLworICAgICAgX1NlcXVlbmNlSW5kZXggX01fbWF4X3NpemU7CisKKyAgICAgIC8qKiBAYnJpZWYgQ3ljbGljIF9fYmVnaW4gYW5kIF9fZW5kIHBvaW50ZXJzIGNvbnRhaW5lZCBpbiBvbmUKKyAgICAgICAgICBhdG9taWNhbGx5IGNoYW5nZWFibGUgdmFsdWUuICovCisgICAgICBfR0xJQkNYWF9WT0xBVElMRSBfQ0FTYWJsZSBfTV9ib3JkZXJzOworCisgICAgcHVibGljOgorICAgICAgLyoqIEBicmllZiBDb25zdHJ1Y3Rvci4gTm90IHRvIGJlIGNhbGxlZCBjb25jdXJyZW50LCBvZiBjb3Vyc2UuCisgICAgICAgKiAgQHBhcmFtIF9fbWF4X3NpemUgTWF4aW1hbCBudW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgY29udGFpbmVkLiAqLworICAgICAgX1Jlc3RyaWN0ZWRCb3VuZGVkQ29uY3VycmVudFF1ZXVlKF9TZXF1ZW5jZUluZGV4IF9fbWF4X3NpemUpCisgICAgICB7CisgICAgICAgIF9NX21heF9zaXplID0gX19tYXhfc2l6ZTsKKyAgICAgICAgX01fYmFzZSA9IG5ldyBfVHBbX19tYXhfc2l6ZV07CisgICAgICAgIF9NX2JvcmRlcnMgPSBfX2VuY29kZTIoMCwgMCk7CisjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgfQorCisgICAgICAvKiogQGJyaWVmIERlc3RydWN0b3IuIE5vdCB0byBiZSBjYWxsZWQgY29uY3VycmVudCwgb2YgY291cnNlLiAqLworICAgICAgfl9SZXN0cmljdGVkQm91bmRlZENvbmN1cnJlbnRRdWV1ZSgpCisgICAgICB7IGRlbGV0ZVtdIF9NX2Jhc2U7IH0KKworICAgICAgLyoqIEBicmllZiBQdXNoZXMgb25lIGVsZW1lbnQgaW50byB0aGUgcXVldWUgYXQgdGhlIGZyb250IGVuZC4KKyAgICAgICAqICBNdXN0IG5vdCBiZSBjYWxsZWQgY29uY3VycmVudGx5IHdpdGggcG9wX2Zyb250KCkuICovCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KGNvbnN0IF9UcCYgX190KQorICAgICAgeworICAgICAgICBfQ0FTYWJsZSBfX2Zvcm1lcl9ib3JkZXJzID0gX01fYm9yZGVyczsKKyAgICAgICAgaW50IF9fZm9ybWVyX2Zyb250LCBfX2Zvcm1lcl9iYWNrOworICAgICAgICBfX2RlY29kZTIoX19mb3JtZXJfYm9yZGVycywgX19mb3JtZXJfZnJvbnQsIF9fZm9ybWVyX2JhY2spOworICAgICAgICAqKF9NX2Jhc2UgKyBfX2Zvcm1lcl9mcm9udCAlIF9NX21heF9zaXplKSA9IF9fdDsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICAgIC8vIE90aGVyd2lzZTogZnJvbnQgLSBiYWNrID4gX01fbWF4X3NpemUgZXZlbnR1YWxseS4KKyAgICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKCgoX19mb3JtZXJfZnJvbnQgKyAxKSAtIF9fZm9ybWVyX2JhY2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBfTV9tYXhfc2l6ZSk7CisjZW5kaWYKKyAgICAgICAgX19mZXRjaF9hbmRfYWRkKCZfTV9ib3JkZXJzLCBfX2VuY29kZTIoMSwgMCkpOworICAgICAgfQorCisgICAgICAvKiogQGJyaWVmIFBvcHMgb25lIGVsZW1lbnQgZnJvbSB0aGUgcXVldWUgYXQgdGhlIGZyb250IGVuZC4KKyAgICAgICAqICBNdXN0IG5vdCBiZSBjYWxsZWQgY29uY3VycmVudGx5IHdpdGggcG9wX2Zyb250KCkuICovCisgICAgICBib29sCisgICAgICBwb3BfZnJvbnQoX1RwJiBfX3QpCisgICAgICB7CisgICAgICAgIGludCBfX2Zvcm1lcl9mcm9udCwgX19mb3JtZXJfYmFjazsKKyNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIF9fZGVjb2RlMihfTV9ib3JkZXJzLCBfX2Zvcm1lcl9mcm9udCwgX19mb3JtZXJfYmFjayk7CisgICAgICAgIHdoaWxlIChfX2Zvcm1lcl9mcm9udCA+IF9fZm9ybWVyX2JhY2spCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gQ2hhbmNlLgorICAgICAgICAgICAgX0NBU2FibGUgX19mb3JtZXJfYm9yZGVycyA9IF9fZW5jb2RlMihfX2Zvcm1lcl9mcm9udCwKKwkJCQkJCSAgX19mb3JtZXJfYmFjayk7CisgICAgICAgICAgICBfQ0FTYWJsZSBfX25ld19ib3JkZXJzID0gX19lbmNvZGUyKF9fZm9ybWVyX2Zyb250IC0gMSwKKwkJCQkJICAgICAgIF9fZm9ybWVyX2JhY2spOworICAgICAgICAgICAgaWYgKF9fY29tcGFyZV9hbmRfc3dhcCgmX01fYm9yZGVycywgX19mb3JtZXJfYm9yZGVycywKKwkJCQkgICBfX25ld19ib3JkZXJzKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fdCA9ICooX01fYmFzZSArIChfX2Zvcm1lcl9mcm9udCAtIDEpICUgX01fbWF4X3NpemUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICB9CisjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICAgICAgX19kZWNvZGUyKF9NX2JvcmRlcnMsIF9fZm9ybWVyX2Zyb250LCBfX2Zvcm1lcl9iYWNrKTsKKyAgICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLyoqIEBicmllZiBQb3BzIG9uZSBlbGVtZW50IGZyb20gdGhlIHF1ZXVlIGF0IHRoZSBmcm9udCBlbmQuCisgICAgICAgKiAgTXVzdCBub3QgYmUgY2FsbGVkIGNvbmN1cnJlbnRseSB3aXRoIHBvcF9mcm9udCgpLiAqLworICAgICAgYm9vbAorICAgICAgcG9wX2JhY2soX1RwJiBfX3QpICAgICAgICAvL3F1ZXVlIGJlaGF2aW9yCisgICAgICB7CisgICAgICAgIGludCBfX2Zvcm1lcl9mcm9udCwgX19mb3JtZXJfYmFjazsKKyNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIF9fZGVjb2RlMihfTV9ib3JkZXJzLCBfX2Zvcm1lcl9mcm9udCwgX19mb3JtZXJfYmFjayk7CisgICAgICAgIHdoaWxlIChfX2Zvcm1lcl9mcm9udCA+IF9fZm9ybWVyX2JhY2spCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gQ2hhbmNlLgorICAgICAgICAgICAgX0NBU2FibGUgX19mb3JtZXJfYm9yZGVycyA9IF9fZW5jb2RlMihfX2Zvcm1lcl9mcm9udCwKKwkJCQkJCSAgX19mb3JtZXJfYmFjayk7CisgICAgICAgICAgICBfQ0FTYWJsZSBfX25ld19ib3JkZXJzID0gX19lbmNvZGUyKF9fZm9ybWVyX2Zyb250LAorCQkJCQkgICAgICAgX19mb3JtZXJfYmFjayArIDEpOworICAgICAgICAgICAgaWYgKF9fY29tcGFyZV9hbmRfc3dhcCgmX01fYm9yZGVycywgX19mb3JtZXJfYm9yZGVycywKKwkJCQkgICBfX25ld19ib3JkZXJzKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fdCA9ICooX01fYmFzZSArIF9fZm9ybWVyX2JhY2sgJSBfTV9tYXhfc2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgIH0KKyNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgICAgICBfX2RlY29kZTIoX01fYm9yZGVycywgX19mb3JtZXJfZnJvbnQsIF9fZm9ybWVyX2JhY2spOworICAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICB9OworfSAgICAgICAvL25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAorCisjdW5kZWYgX0dMSUJDWFhfVk9MQVRJTEUKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX1FVRVVFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcXVpY2tzb3J0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3F1aWNrc29ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNzRjYTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3F1aWNrc29ydC5oCkBAIC0wLDAgKzEsMTc2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvcXVpY2tzb3J0LmgKKyAqICBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSB1bmJhbGFuY2VkIHBhcmFsbGVsIHF1aWNrc29ydCAoaW4tcGxhY2UpLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9RVUlDS1NPUlRfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9RVUlDS1NPUlRfSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC9wYXJhbGxlbC5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3BhcnRpdGlvbi5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLyoqIEBicmllZiBVbmJhbGFuY2VkIHF1aWNrc29ydCBkaXZpZGUgc3RlcC4KKyAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIHN1YnNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBzdWJzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICogIEBwYXJhbSBfX3Bpdm90X3JhbmsgRGVzaXJlZCBfX3Jhbmsgb2YgdGhlIHBpdm90LgorICAgKiAgQHBhcmFtIF9fbnVtX3NhbXBsZXMgQ2hvb3NlIHBpdm90IGZyb20gdGhhdCBtYW55IHNhbXBsZXMuCisgICAqICBAcGFyYW0gX19udW1fdGhyZWFkcyBOdW1iZXIgb2YgdGhyZWFkcyB0aGF0IGFyZSBhbGxvd2VkIHRvIHdvcmsgb24KKyAgICogIHRoaXMgcGFydC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBfX3BhcmFsbGVsX3NvcnRfcXNfZGl2aWRlKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJCSAgICAgIF9Db21wYXJlIF9fY29tcCwgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHMKKwkJCSAgICAgIDxfUkFJdGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9fcGl2b3RfcmFuaywKKwkJCSAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzCisJCQkgICAgICA8X1JBSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorCQkJICAgICAgX19udW1fc2FtcGxlcywgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX24gPSBfX2VuZCAtIF9fYmVnaW47CisgICAgICBfX251bV9zYW1wbGVzID0gc3RkOjptaW4oX19udW1fc2FtcGxlcywgX19uKTsKKworICAgICAgLy8gQWxsb2NhdGUgdW5pbml0aWFsaXplZCwgdG8gYXZvaWQgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIF9WYWx1ZVR5cGUqIF9fc2FtcGxlcyA9IHN0YXRpY19jYXN0PF9WYWx1ZVR5cGUqPgorCSg6Om9wZXJhdG9yIG5ldyhfX251bV9zYW1wbGVzICogc2l6ZW9mKF9WYWx1ZVR5cGUpKSk7CisKKyAgICAgIGZvciAoX0RpZmZlcmVuY2VUeXBlIF9fcyA9IDA7IF9fcyA8IF9fbnVtX3NhbXBsZXM7ICsrX19zKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIF9faW5kZXggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+CisJICAgIChfX3MpICogX19uIC8gX19udW1fc2FtcGxlczsKKyAgICAgICAgICA6Om5ldygmKF9fc2FtcGxlc1tfX3NdKSkgX1ZhbHVlVHlwZShfX2JlZ2luW19faW5kZXhdKTsKKyAgICAgICAgfQorCisgICAgICBfX2dudV9zZXF1ZW50aWFsOjpzb3J0KF9fc2FtcGxlcywgX19zYW1wbGVzICsgX19udW1fc2FtcGxlcywgX19jb21wKTsKKworICAgICAgX1ZhbHVlVHlwZSYgX19waXZvdCA9IF9fc2FtcGxlc1tfX3Bpdm90X3JhbmsgKiBfX251bV9zYW1wbGVzIC8gX19uXTsKKworICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fYmluZGVyMm5kPF9Db21wYXJlLCBfVmFsdWVUeXBlLCBfVmFsdWVUeXBlLCBib29sPgorICAgICAgICBfX3ByZWQoX19jb21wLCBfX3Bpdm90KTsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3NwbGl0ID0gX19wYXJhbGxlbF9wYXJ0aXRpb24oX19iZWdpbiwgX19lbmQsCisJCQkJCQkgICAgIF9fcHJlZCwgX19udW1fdGhyZWFkcyk7CisKKyAgICAgIGZvciAoX0RpZmZlcmVuY2VUeXBlIF9fcyA9IDA7IF9fcyA8IF9fbnVtX3NhbXBsZXM7ICsrX19zKQorCV9fc2FtcGxlc1tfX3NdLn5fVmFsdWVUeXBlKCk7CisgICAgICA6Om9wZXJhdG9yIGRlbGV0ZShfX3NhbXBsZXMpOworCisgICAgICByZXR1cm4gX19zcGxpdDsKKyAgICB9CisKKyAgLyoqIEBicmllZiBVbmJhbGFuY2VkIHF1aWNrc29ydCBjb25xdWVyIHN0ZXAuCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBzdWJzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2Ygc3Vic2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqICBAcGFyYW0gX19udW1fdGhyZWFkcyBOdW1iZXIgb2YgdGhyZWFkcyB0aGF0IGFyZSBhbGxvd2VkIHRvIHdvcmsgb24KKyAgICogIHRoaXMgcGFydC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX3BhcmFsbGVsX3NvcnRfcXNfY29ucXVlcihfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCQkgICAgICAgX0NvbXBhcmUgX19jb21wLAorCQkJICAgICAgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBpZiAoX19udW1fdGhyZWFkcyA8PSAxKQorICAgICAgICB7CisgICAgICAgICAgX19nbnVfc2VxdWVudGlhbDo6c29ydChfX2JlZ2luLCBfX2VuZCwgX19jb21wKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbiA9IF9fZW5kIC0gX19iZWdpbiwgX19waXZvdF9yYW5rOworCisgICAgICBpZiAoX19uIDw9IDEpCisgICAgICAgIHJldHVybjsKKworICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHNfbGVmdDsKKworICAgICAgaWYgKChfX251bV90aHJlYWRzICUgMikgPT0gMSkKKyAgICAgICAgX19udW1fdGhyZWFkc19sZWZ0ID0gX19udW1fdGhyZWFkcyAvIDIgKyAxOworICAgICAgZWxzZQorICAgICAgICBfX251bV90aHJlYWRzX2xlZnQgPSBfX251bV90aHJlYWRzIC8gMjsKKworICAgICAgX19waXZvdF9yYW5rID0gX19uICogX19udW1fdGhyZWFkc19sZWZ0IC8gX19udW1fdGhyZWFkczsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fc3BsaXQgPSBfX3BhcmFsbGVsX3NvcnRfcXNfZGl2aWRlCisJKF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsIF9fcGl2b3RfcmFuaywKKwkgX1NldHRpbmdzOjpnZXQoKS5zb3J0X3FzX251bV9zYW1wbGVzX3ByZXNldCwgX19udW1fdGhyZWFkcyk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIG51bV90aHJlYWRzKDIpCisgICAgICB7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICAgIF9fcGFyYWxsZWxfc29ydF9xc19jb25xdWVyKF9fYmVnaW4sIF9fYmVnaW4gKyBfX3NwbGl0LAorCQkJCSAgIF9fY29tcCwgX19udW1fdGhyZWFkc19sZWZ0KTsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgICAgX19wYXJhbGxlbF9zb3J0X3FzX2NvbnF1ZXIoX19iZWdpbiArIF9fc3BsaXQsIF9fZW5kLAorCQkJCSAgIF9fY29tcCwgX19udW1fdGhyZWFkcyAtIF9fbnVtX3RocmVhZHNfbGVmdCk7CisgICAgICB9CisgICAgfQorCisKKyAgLyoqIEBicmllZiBVbmJhbGFuY2VkIHF1aWNrc29ydCBtYWluIGNhbGwuCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3IgaW5wdXQgc2VxdWVuY2UsIGlnbm9yZWQuCisgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqICBAcGFyYW0gX19udW1fdGhyZWFkcyBOdW1iZXIgb2YgdGhyZWFkcyB0aGF0IGFyZSBhbGxvd2VkIHRvIHdvcmsgb24KKyAgICogIHRoaXMgcGFydC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX3BhcmFsbGVsX3NvcnRfcXMoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorCQkgICAgICAgX0NvbXBhcmUgX19jb21wLAorCQkgICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMpCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX24pCisKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19uID0gX19lbmQgLSBfX2JlZ2luOworCisgICAgICAvLyBBdCBsZWFzdCBvbmUgZWxlbWVudCBwZXIgcHJvY2Vzc29yLgorICAgICAgaWYgKF9fbnVtX3RocmVhZHMgPiBfX24pCisgICAgICAgIF9fbnVtX3RocmVhZHMgPSBzdGF0aWNfY2FzdDxfVGhyZWFkSW5kZXg+KF9fbik7CisKKyAgICAgIF9fcGFyYWxsZWxfc29ydF9xc19jb25xdWVyKAorICAgICAgICBfX2JlZ2luLCBfX2JlZ2luICsgX19uLCBfX2NvbXAsIF9fbnVtX3RocmVhZHMpOworICAgIH0KKworfSAvL25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfUVVJQ0tTT1JUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcmFuZG9tX251bWJlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9yYW5kb21fbnVtYmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhZWI5OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcmFuZG9tX251bWJlci5oCkBAIC0wLDAgKzEsMTI1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvcmFuZG9tX251bWJlci5oCisgKiAgQGJyaWVmIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGJhc2VkIG9uIHRoZSBNZXJzZW5uZSB0d2lzdGVyLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9SQU5ET01fTlVNQkVSX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfUkFORE9NX05VTUJFUl9IIDEKKworI2luY2x1ZGUgPHBhcmFsbGVsL3R5cGVzLmg+CisjaW5jbHVkZSA8dHIxL3JhbmRvbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKiogQGJyaWVmIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLCBiYXNlZCBvbiB0aGUgTWVyc2VubmUgdHdpc3Rlci4gKi8KKyAgY2xhc3MgX1JhbmRvbU51bWJlcgorICB7CisgIHByaXZhdGU6CisgICAgc3RkOjp0cjE6Om10MTk5MzcgICBfTV9tdDsKKyAgICB1aW50NjRfdCAgICAgICAgICAgIF9NX3N1cHJlbXVtOworICAgIHVpbnQ2NF90ICAgICAgICAgICAgX01fcmFuZF9zdXA7CisgICAgZG91YmxlICAgICAgICAgICAgICBfTV9zdXByZW11bV9yZWNpcHJvY2FsOworICAgIGRvdWJsZSAgICAgICAgICAgICAgX01fcmFuZF9zdXBfcmVjaXByb2NhbDsKKworICAgIC8vIEFzc3VtZWQgdG8gYmUgdHdpY2UgYXMgbG9uZyBhcyB0aGUgdXN1YWwgcmFuZG9tIG51bWJlci4KKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgX19jYWNoZTsKKworICAgIC8vIEJpdCByZXN1bHRzLgorICAgIGludCBfX2JpdHNfbGVmdDsKKyAgICAKKyAgICBzdGF0aWMgdWludDMyX3QKKyAgICBfX3NjYWxlX2Rvd24odWludDY0X3QgX194LAorI2lmIF9HTElCQ1hYX1NDQUxFX0RPV05fRlBVCisgICAgICAgICAgICAgICB1aW50NjRfdCAvKl9NX3N1cHJlbXVtKi8sIGRvdWJsZSBfTV9zdXByZW11bV9yZWNpcHJvY2FsKQorI2Vsc2UKKyAgICAgICAgICAgICAgIHVpbnQ2NF90IF9NX3N1cHJlbXVtLCBkb3VibGUgLypfTV9zdXByZW11bV9yZWNpcHJvY2FsKi8pCisjZW5kaWYKKyAgICAgICAgeworI2lmIF9HTElCQ1hYX1NDQUxFX0RPV05fRlBVCisgICAgICAgICAgcmV0dXJuIHVpbnQzMl90KF9feCAqIF9NX3N1cHJlbXVtX3JlY2lwcm9jYWwpOworI2Vsc2UKKyAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9feCAlIF9NX3N1cHJlbXVtKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgcHVibGljOgorICAgIC8qKiBAYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU2VlZCB3aXRoIDAuICovCisgICAgX1JhbmRvbU51bWJlcigpCisgICAgOiBfTV9tdCgwKSwgX01fc3VwcmVtdW0oMHgxMDAwMDAwMDBVTEwpLAorICAgICAgX01fcmFuZF9zdXAoMVVMTCA8PCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6ZGlnaXRzKSwKKyAgICAgIF9NX3N1cHJlbXVtX3JlY2lwcm9jYWwoZG91YmxlKF9NX3N1cHJlbXVtKSAvIGRvdWJsZShfTV9yYW5kX3N1cCkpLAorICAgICAgX01fcmFuZF9zdXBfcmVjaXByb2NhbCgxLjAgLyBkb3VibGUoX01fcmFuZF9zdXApKSwKKyAgICAgIF9fY2FjaGUoMCksIF9fYml0c19sZWZ0KDApIHsgfQorCisgICAgLyoqIEBicmllZiBDb25zdHJ1Y3Rvci4KKyAgICAgKiAgQHBhcmFtIF9fc2VlZCBSYW5kb20gX19zZWVkLgorICAgICAqICBAcGFyYW0gX01fc3VwcmVtdW0gR2VuZXJhdGUgaW50ZWdlciByYW5kb20gbnVtYmVycyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGludGVydmFsIEBjIFswLF9NX3N1cHJlbXVtKS4gKi8KKyAgICBfUmFuZG9tTnVtYmVyKHVpbnQzMl90IF9fc2VlZCwgdWludDY0X3QgX01fc3VwcmVtdW0gPSAweDEwMDAwMDAwMFVMTCkKKyAgICA6IF9NX210KF9fc2VlZCksIF9NX3N1cHJlbXVtKF9NX3N1cHJlbXVtKSwKKyAgICAgIF9NX3JhbmRfc3VwKDFVTEwgPDwgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46OmRpZ2l0cyksCisgICAgICBfTV9zdXByZW11bV9yZWNpcHJvY2FsKGRvdWJsZShfTV9zdXByZW11bSkgLyBkb3VibGUoX01fcmFuZF9zdXApKSwKKyAgICAgIF9NX3JhbmRfc3VwX3JlY2lwcm9jYWwoMS4wIC8gZG91YmxlKF9NX3JhbmRfc3VwKSksCisgICAgICBfX2NhY2hlKDApLCBfX2JpdHNfbGVmdCgwKSB7IH0KKworICAgIC8qKiBAYnJpZWYgR2VuZXJhdGUgdW5zaWduZWQgcmFuZG9tIDMyLWJpdCBpbnRlZ2VyLiAqLworICAgIHVpbnQzMl90CisgICAgb3BlcmF0b3IoKSgpCisgICAgeyByZXR1cm4gX19zY2FsZV9kb3duKF9NX210KCksIF9NX3N1cHJlbXVtLCBfTV9zdXByZW11bV9yZWNpcHJvY2FsKTsgfQorCisgICAgLyoqIEBicmllZiBHZW5lcmF0ZSB1bnNpZ25lZCByYW5kb20gMzItYml0IGludGVnZXIgaW4gdGhlCisgICAgICAgIGludGVydmFsIEBjIFswLGxvY2FsX3N1cHJlbXVtKS4gKi8KKyAgICB1aW50MzJfdAorICAgIG9wZXJhdG9yKCkodWludDY0X3QgbG9jYWxfc3VwcmVtdW0pCisgICAgeworICAgICAgcmV0dXJuIF9fc2NhbGVfZG93bihfTV9tdCgpLCBsb2NhbF9zdXByZW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZShsb2NhbF9zdXByZW11bSAqIF9NX3JhbmRfc3VwX3JlY2lwcm9jYWwpKTsKKyAgICB9CisKKyAgICAvKiogQGJyaWVmIEdlbmVyYXRlIGEgbnVtYmVyIG9mIHJhbmRvbSBiaXRzLCBydW4tdGltZSBwYXJhbWV0ZXIuCisgICAgICogIEBwYXJhbSBfX2JpdHMgTnVtYmVyIG9mIGJpdHMgdG8gZ2VuZXJhdGUuICovCisgICAgdW5zaWduZWQgbG9uZworICAgIF9fZ2VucmFuZF9iaXRzKGludCBfX2JpdHMpCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBfX3JlcyA9IF9fY2FjaGUgJiAoKDEgPDwgX19iaXRzKSAtIDEpOworICAgICAgX19jYWNoZSA9IF9fY2FjaGUgPj4gX19iaXRzOworICAgICAgX19iaXRzX2xlZnQgLT0gX19iaXRzOworICAgICAgaWYgKF9fYml0c19sZWZ0IDwgMzIpCisgICAgICAgIHsKKyAgICAgICAgICBfX2NhY2hlIHw9ICgodWludDY0X3QoX01fbXQoKSkpIDw8IF9fYml0c19sZWZ0KTsKKyAgICAgICAgICBfX2JpdHNfbGVmdCArPSAzMjsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIF9fcmVzOworICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9SQU5ET01fTlVNQkVSX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcmFuZG9tX3NodWZmbGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcmFuZG9tX3NodWZmbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWVlZmM5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9yYW5kb21fc2h1ZmZsZS5oCkBAIC0wLDAgKzEsNTMzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvcmFuZG9tX3NodWZmbGUuaAorICogIEBicmllZiBQYXJhbGxlbCBpbXBsZW1lbnRhdGlvbiBvZiBzdGQ6OnJhbmRvbV9zaHVmZmxlKCkuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX1JBTkRPTV9TSFVGRkxFX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfUkFORE9NX1NIVUZGTEVfSCAxCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8Yml0cy9zdGxfbnVtZXJpYy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3BhcmFsbGVsLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvcmFuZG9tX251bWJlci5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLyoqIEBicmllZiBUeXBlIHRvIGhvbGQgdGhlIGluZGV4IG9mIGEgYmluLgorICAgICoKKyAgICAqICBTaW5jZSBtYW55IHZhcmlhYmxlcyBvZiB0aGlzIHR5cGUgYXJlIGFsbG9jYXRlZCwgaXQgc2hvdWxkIGJlCisgICAgKiAgY2hvc2VuIGFzIHNtYWxsIGFzIHBvc3NpYmxlLgorICAgICovCisgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgX0JpbkluZGV4OworCisgIC8qKiBAYnJpZWYgRGF0YSBrbm93biB0byBldmVyeSB0aHJlYWQgcGFydGljaXBhdGluZyBpbgorICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fcGFyYWxsZWxfcmFuZG9tX3NodWZmbGUoKS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICBzdHJ1Y3QgX0RSYW5kb21TaHVmZmxpbmdHbG9iYWxEYXRhCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIC8qKiBAYnJpZWYgQmVnaW4gaXRlcmF0b3Igb2YgdGhlIF9fc291cmNlLiAqLworICAgICAgX1JBSXRlciYgX01fc291cmNlOworCisgICAgICAvKiogQGJyaWVmIFRlbXBvcmFyeSBhcnJheXMgZm9yIGVhY2ggdGhyZWFkLiAqLworICAgICAgX1ZhbHVlVHlwZSoqIF9NX3RlbXBvcmFyaWVzOworCisgICAgICAvKiogQGJyaWVmIFR3by1kaW1lbnNpb25hbCBhcnJheSB0byBob2xkIHRoZSB0aHJlYWQtYmluIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgRGltZW5zaW9ucyAoX01fbnVtX3RocmVhZHMgKyAxKSBfX3ggKF9NX251bV9iaW5zICsgMSkuICovCisgICAgICBfRGlmZmVyZW5jZVR5cGUqKiBfTV9kaXN0OworCisgICAgICAvKiogQGJyaWVmIFN0YXJ0IGluZGV4ZXMgb2YgdGhlIHRocmVhZHMnIF9fY2h1bmtzLiAqLworICAgICAgX0RpZmZlcmVuY2VUeXBlKiBfTV9zdGFydHM7CisKKyAgICAgIC8qKiBAYnJpZWYgTnVtYmVyIG9mIHRoZSB0aHJlYWQgdGhhdCB3aWxsIGZ1cnRoZXIgcHJvY2VzcyB0aGUKKyAgICAgICAgICBjb3JyZXNwb25kaW5nIGJpbi4gKi8KKyAgICAgIF9UaHJlYWRJbmRleCogX01fYmluX3Byb2M7CisKKyAgICAgIC8qKiBAYnJpZWYgTnVtYmVyIG9mIGJpbnMgdG8gZGlzdHJpYnV0ZSB0by4gKi8KKyAgICAgIGludCBfTV9udW1fYmluczsKKworICAgICAgLyoqIEBicmllZiBOdW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gYWRkcmVzcyB0aGUgYmlucy4gKi8KKyAgICAgIGludCBfTV9udW1fYml0czsKKworICAgICAgLyoqIEBicmllZiBDb25zdHJ1Y3Rvci4gKi8KKyAgICAgIF9EUmFuZG9tU2h1ZmZsaW5nR2xvYmFsRGF0YShfUkFJdGVyJiBfX3NvdXJjZSkKKyAgICAgIDogX01fc291cmNlKF9fc291cmNlKSB7IH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgTG9jYWwgZGF0YSBmb3IgYSB0aHJlYWQgcGFydGljaXBhdGluZyBpbgorICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fcGFyYWxsZWxfcmFuZG9tX3NodWZmbGUoKS4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIHN0cnVjdCBfRFJTU29ydGVyUFUKKyAgICB7CisgICAgICAvKiogQGJyaWVmIE51bWJlciBvZiB0aHJlYWRzIHBhcnRpY2lwYXRpbmcgaW4gdG90YWwuICovCisgICAgICBpbnQgX01fbnVtX3RocmVhZHM7CisKKyAgICAgIC8qKiBAYnJpZWYgQmVnaW4gaW5kZXggZm9yIGJpbnMgdGFrZW4gY2FyZSBvZiBieSB0aGlzIHRocmVhZC4gKi8KKyAgICAgIF9CaW5JbmRleCBfTV9iaW5zX2JlZ2luOworCisgICAgICAvKiogQGJyaWVmIEVuZCBpbmRleCBmb3IgYmlucyB0YWtlbiBjYXJlIG9mIGJ5IHRoaXMgdGhyZWFkLiAqLworICAgICAgX0JpbkluZGV4IF9fYmluc19lbmQ7CisKKyAgICAgIC8qKiBAYnJpZWYgUmFuZG9tIF9NX3NlZWQgZm9yIHRoaXMgdGhyZWFkLiAqLworICAgICAgdWludDMyX3QgX01fc2VlZDsKKworICAgICAgLyoqIEBicmllZiBQb2ludGVyIHRvIGdsb2JhbCBkYXRhLiAqLworICAgICAgX0RSYW5kb21TaHVmZmxpbmdHbG9iYWxEYXRhPF9SQUl0ZXI+KiBfTV9zZDsKKyAgICB9OworCisgIC8qKiBAYnJpZWYgR2VuZXJhdGUgYSByYW5kb20gbnVtYmVyIGluIEBjIFswLDJeX19sb2dwKS4KKyAgICAqICBAcGFyYW0gX19sb2dwIExvZ2FyaXRobSAoYmFzaXMgMikgb2YgdGhlIHVwcGVyIHJhbmdlIF9fYm91bmQuCisgICAgKiAgQHBhcmFtIF9fcm5nIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIHVzZS4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIGlubGluZSBpbnQKKyAgICBfX3JhbmRvbV9udW1iZXJfcG93MihpbnQgX19sb2dwLCBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JuZykKKyAgICB7IHJldHVybiBfX3JuZy5fX2dlbnJhbmRfYml0cyhfX2xvZ3ApOyB9CisKKyAgLyoqIEBicmllZiBSYW5kb20gc2h1ZmZsZSBjb2RlIGV4ZWN1dGVkIGJ5IGVhY2ggdGhyZWFkLgorICAgICogIEBwYXJhbSBfX3B1cyBBcnJheSBvZiB0aHJlYWQtbG9jYWwgZGF0YSByZWNvcmRzLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIHZvaWQgCisgICAgX19wYXJhbGxlbF9yYW5kb21fc2h1ZmZsZV9kcnNfcHUoX0RSU1NvcnRlclBVPF9SQUl0ZXIsCisJCQkJICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPiogX19wdXMpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIF9UaHJlYWRJbmRleCBfX2lhbSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgX0RSU1NvcnRlclBVPF9SQUl0ZXIsIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+KiBfX2QgPSAmX19wdXNbX19pYW1dOworICAgICAgX0RSYW5kb21TaHVmZmxpbmdHbG9iYWxEYXRhPF9SQUl0ZXI+KiBfX3NkID0gX19kLT5fTV9zZDsKKworICAgICAgLy8gSW5kZXhpbmc6IF9NX2Rpc3RbYmluXVtwcm9jZXNzb3JdCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19sZW5ndGggPSAoX19zZC0+X01fc3RhcnRzW19faWFtICsgMV0KKwkJCQkgIC0gX19zZC0+X01fc3RhcnRzW19faWFtXSk7CisgICAgICBfQmluSW5kZXgqIF9fb3JhY2xlcyA9IG5ldyBfQmluSW5kZXhbX19sZW5ndGhdOworICAgICAgX0RpZmZlcmVuY2VUeXBlKiBfX2Rpc3QgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fc2QtPl9NX251bV9iaW5zICsgMV07CisgICAgICBfQmluSW5kZXgqIF9fYmluX3Byb2MgPSBuZXcgX0JpbkluZGV4W19fc2QtPl9NX251bV9iaW5zXTsKKyAgICAgIF9WYWx1ZVR5cGUqKiBfX3RlbXBvcmFyaWVzID0gbmV3IF9WYWx1ZVR5cGUqW19fZC0+X01fbnVtX3RocmVhZHNdOworCisgICAgICAvLyBDb21wdXRlIG9yYWNsZXMgYW5kIGNvdW50IGFwcGVhcmFuY2VzLgorICAgICAgZm9yIChfQmluSW5kZXggX19iID0gMDsgX19iIDwgX19zZC0+X01fbnVtX2JpbnMgKyAxOyArK19fYikKKwlfX2Rpc3RbX19iXSA9IDA7CisgICAgICBpbnQgX19udW1fYml0cyA9IF9fc2QtPl9NX251bV9iaXRzOworCisgICAgICBfUmFuZG9tTnVtYmVyIF9fcm5nKF9fZC0+X01fc2VlZCk7CisKKyAgICAgIC8vIEZpcnN0IG1haW4gbG9vcC4KKyAgICAgIGZvciAoX0RpZmZlcmVuY2VUeXBlIF9faSA9IDA7IF9faSA8IF9fbGVuZ3RoOyArK19faSkKKwl7CisgICAgICAgICAgX0JpbkluZGV4IF9fb3JhY2xlID0gX19yYW5kb21fbnVtYmVyX3BvdzIoX19udW1fYml0cywgX19ybmcpOworICAgICAgICAgIF9fb3JhY2xlc1tfX2ldID0gX19vcmFjbGU7CisKKyAgICAgICAgICAvLyBUbyBhbGxvdyBwcmVmaXggKHBhcnRpYWwpIHN1bS4KKyAgICAgICAgICArKyhfX2Rpc3RbX19vcmFjbGUgKyAxXSk7CisJfQorCisgICAgICBmb3IgKF9CaW5JbmRleCBfX2IgPSAwOyBfX2IgPCBfX3NkLT5fTV9udW1fYmlucyArIDE7ICsrX19iKQorCV9fc2QtPl9NX2Rpc3RbX19iXVtfX2lhbSArIDFdID0gX19kaXN0W19fYl07CisKKyMgICAgIHByYWdtYSBvbXAgYmFycmllcgorCisjICAgICBwcmFnbWEgb21wIHNpbmdsZQorICAgICAgeworCS8vIFN1bSB1cCBiaW5zLCBfX3NkLT5fTV9kaXN0W19fcyArIDFdW19fZC0+X01fbnVtX3RocmVhZHNdIG5vdworCS8vIGNvbnRhaW5zIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gYmluIF9fcworCWZvciAoX0JpbkluZGV4IF9fcyA9IDA7IF9fcyA8IF9fc2QtPl9NX251bV9iaW5zOyArK19fcykKKyAgICAgICAgICBfX2dudV9zZXF1ZW50aWFsOjpwYXJ0aWFsX3N1bShfX3NkLT5fTV9kaXN0W19fcyArIDFdLAorCQkJCQlfX3NkLT5fTV9kaXN0W19fcyArIDFdCisJCQkJCSsgX19kLT5fTV9udW1fdGhyZWFkcyArIDEsCisJCQkJCV9fc2QtPl9NX2Rpc3RbX19zICsgMV0pOworICAgICAgfQorCisjICAgICBwcmFnbWEgb21wIGJhcnJpZXIKKworICAgICAgX1NlcXVlbmNlSW5kZXggX19vZmZzZXQgPSAwLCBfX2dsb2JhbF9vZmZzZXQgPSAwOworICAgICAgZm9yIChfQmluSW5kZXggX19zID0gMDsgX19zIDwgX19kLT5fTV9iaW5zX2JlZ2luOyArK19fcykKKwlfX2dsb2JhbF9vZmZzZXQgKz0gX19zZC0+X01fZGlzdFtfX3MgKyAxXVtfX2QtPl9NX251bV90aHJlYWRzXTsKKworIyAgICAgcHJhZ21hIG9tcCBiYXJyaWVyCisKKyAgICAgIGZvciAoX0JpbkluZGV4IF9fcyA9IF9fZC0+X01fYmluc19iZWdpbjsgX19zIDwgX19kLT5fX2JpbnNfZW5kOyArK19fcykKKwl7CisgICAgICAgICAgZm9yIChpbnQgX190ID0gMDsgX190IDwgX19kLT5fTV9udW1fdGhyZWFkcyArIDE7ICsrX190KQorICAgICAgICAgICAgX19zZC0+X01fZGlzdFtfX3MgKyAxXVtfX3RdICs9IF9fb2Zmc2V0OworICAgICAgICAgIF9fb2Zmc2V0ID0gX19zZC0+X01fZGlzdFtfX3MgKyAxXVtfX2QtPl9NX251bV90aHJlYWRzXTsKKwl9CisKKyAgICAgIF9fc2QtPl9NX3RlbXBvcmFyaWVzW19faWFtXSA9IHN0YXRpY19jYXN0PF9WYWx1ZVR5cGUqPgorCSg6Om9wZXJhdG9yIG5ldyhzaXplb2YoX1ZhbHVlVHlwZSkgKiBfX29mZnNldCkpOworCisjICAgICBwcmFnbWEgb21wIGJhcnJpZXIKKworICAgICAgLy8gRHJhdyBsb2NhbCBjb3BpZXMgdG8gYXZvaWQgZmFsc2Ugc2hhcmluZy4KKyAgICAgIGZvciAoX0JpbkluZGV4IF9fYiA9IDA7IF9fYiA8IF9fc2QtPl9NX251bV9iaW5zICsgMTsgKytfX2IpCisJX19kaXN0W19fYl0gPSBfX3NkLT5fTV9kaXN0W19fYl1bX19pYW1dOworICAgICAgZm9yIChfQmluSW5kZXggX19iID0gMDsgX19iIDwgX19zZC0+X01fbnVtX2JpbnM7ICsrX19iKQorCV9fYmluX3Byb2NbX19iXSA9IF9fc2QtPl9NX2Jpbl9wcm9jW19fYl07CisgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX3QgPSAwOyBfX3QgPCBfX2QtPl9NX251bV90aHJlYWRzOyArK19fdCkKKwlfX3RlbXBvcmFyaWVzW19fdF0gPSBfX3NkLT5fTV90ZW1wb3Jhcmllc1tfX3RdOworCisgICAgICBfUkFJdGVyIF9fc291cmNlID0gX19zZC0+X01fc291cmNlOworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fc3RhcnQgPSBfX3NkLT5fTV9zdGFydHNbX19pYW1dOworCisgICAgICAvLyBEaXN0cmlidXRlIGFjY29yZGluZyB0byBvcmFjbGVzLCBzZWNvbmQgbWFpbiBsb29wLgorICAgICAgZm9yIChfRGlmZmVyZW5jZVR5cGUgX19pID0gMDsgX19pIDwgX19sZW5ndGg7ICsrX19pKQorCXsKKyAgICAgICAgICBfQmluSW5kZXggX190YXJnZXRfYmluID0gX19vcmFjbGVzW19faV07CisgICAgICAgICAgX1RocmVhZEluZGV4IF9fdGFyZ2V0X3AgPSBfX2Jpbl9wcm9jW19fdGFyZ2V0X2Jpbl07CisKKyAgICAgICAgICAvLyBMYXN0IGNvbHVtbiBbX19kLT5fTV9udW1fdGhyZWFkc10gc3RheXMgdW5jaGFuZ2VkLgorCSAgOjpuZXcoJihfX3RlbXBvcmFyaWVzW19fdGFyZ2V0X3BdW19fZGlzdFtfX3RhcmdldF9iaW4gKyAxXSsrXSkpCisgICAgICAgICAgICAgIF9WYWx1ZVR5cGUoKihfX3NvdXJjZSArIF9faSArIF9fc3RhcnQpKTsKKwl9CisKKyAgICAgIGRlbGV0ZVtdIF9fb3JhY2xlczsKKyAgICAgIGRlbGV0ZVtdIF9fZGlzdDsKKyAgICAgIGRlbGV0ZVtdIF9fYmluX3Byb2M7CisgICAgICBkZWxldGVbXSBfX3RlbXBvcmFyaWVzOworCisjICAgICBwcmFnbWEgb21wIGJhcnJpZXIKKworICAgICAgLy8gU2h1ZmZsZSBiaW5zIGludGVybmFsbHkuCisgICAgICBmb3IgKF9CaW5JbmRleCBfX2IgPSBfX2QtPl9NX2JpbnNfYmVnaW47IF9fYiA8IF9fZC0+X19iaW5zX2VuZDsgKytfX2IpCisJeworICAgICAgICAgIF9WYWx1ZVR5cGUqIF9fYmVnaW4gPQorCSAgICAoX19zZC0+X01fdGVtcG9yYXJpZXNbX19pYW1dCisJICAgICArIChfX2IgPT0gX19kLT5fTV9iaW5zX2JlZ2luCisJCT8gMCA6IF9fc2QtPl9NX2Rpc3RbX19iXVtfX2QtPl9NX251bV90aHJlYWRzXSkpLAorCSAgICAqX19lbmQgPSAoX19zZC0+X01fdGVtcG9yYXJpZXNbX19pYW1dCisJCSAgICAgICsgX19zZC0+X01fZGlzdFtfX2IgKyAxXVtfX2QtPl9NX251bV90aHJlYWRzXSk7CisKKyAgICAgICAgICBfX3NlcXVlbnRpYWxfcmFuZG9tX3NodWZmbGUoX19iZWdpbiwgX19lbmQsIF9fcm5nKTsKKyAgICAgICAgICBzdGQ6OmNvcHkoX19iZWdpbiwgX19lbmQsIF9fc2QtPl9NX3NvdXJjZSArIF9fZ2xvYmFsX29mZnNldAorCQkgICAgKyAoX19iID09IF9fZC0+X01fYmluc19iZWdpbgorCQkgICAgICAgPyAwIDogX19zZC0+X01fZGlzdFtfX2JdW19fZC0+X01fbnVtX3RocmVhZHNdKSk7CisJfQorCisgICAgICBmb3IgKF9TZXF1ZW5jZUluZGV4IF9faSA9IDA7IF9faSA8IF9fb2Zmc2V0OyArK19faSkKKwlfX3NkLT5fTV90ZW1wb3Jhcmllc1tfX2lhbV1bX19pXS5+X1ZhbHVlVHlwZSgpOworICAgICAgOjpvcGVyYXRvciBkZWxldGUoX19zZC0+X01fdGVtcG9yYXJpZXNbX19pYW1dKTsKKyAgICB9CisKKyAgLyoqIEBicmllZiBSb3VuZCB1cCB0byB0aGUgbmV4dCBncmVhdGVyIHBvd2VyIG9mIDIuCisgICAgKiAgQHBhcmFtIF9feCBfSW50ZWdlciB0byByb3VuZCB1cCAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwIAorICAgIF9fcm91bmRfdXBfdG9fcG93MihfVHAgX194KQorICAgIHsKKyAgICAgIGlmIChfX3ggPD0gMSkKKwlyZXR1cm4gMTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gKF9UcCkxIDw8IChfX3JkX2xvZzIoX194IC0gMSkgKyAxKTsKKyAgICB9CisKKyAgLyoqIEBicmllZiBNYWluIHBhcmFsbGVsIHJhbmRvbSBzaHVmZmxlIHN0ZXAuCisgICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2Ygc2VxdWVuY2UuCisgICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBzZXF1ZW5jZS4KKyAgICAqICBAcGFyYW0gX19uIExlbmd0aCBvZiBzZXF1ZW5jZS4KKyAgICAqICBAcGFyYW0gX19udW1fdGhyZWFkcyBOdW1iZXIgb2YgdGhyZWFkcyB0byB1c2UuCisgICAgKiAgQHBhcmFtIF9fcm5nIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIHVzZS4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX3BhcmFsbGVsX3JhbmRvbV9zaHVmZmxlX2RycyhfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCQkJICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0cworCQkJCSAgPF9SQUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUgX19uLAorCQkJCSAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMsCisJCQkJICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JuZykKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX0dMSUJDWFhfQ0FMTChfX24pCisKKyAgICAgIGNvbnN0IF9TZXR0aW5ncyYgX19zID0gX1NldHRpbmdzOjpnZXQoKTsKKworICAgICAgaWYgKF9fbnVtX3RocmVhZHMgPiBfX24pCisJX19udW1fdGhyZWFkcyA9IHN0YXRpY19jYXN0PF9UaHJlYWRJbmRleD4oX19uKTsKKworICAgICAgX0JpbkluZGV4IF9fbnVtX2JpbnMsIF9fbnVtX2JpbnNfY2FjaGU7CisKKyNpZiBfR0xJQkNYWF9SQU5ET01fU0hVRkZMRV9DT05TSURFUl9MMQorICAgICAgLy8gVHJ5IHRoZSBMMSBjYWNoZSBmaXJzdC4KKworICAgICAgLy8gTXVzdCBmaXQgaW50byBMMS4KKyAgICAgIF9fbnVtX2JpbnNfY2FjaGUgPQorCXN0ZDo6bWF4PF9EaWZmZXJlbmNlVHlwZT4oMSwgX19uIC8gKF9fcy5MMV9jYWNoZV9zaXplX2xiCisJCQkJCSAgICAvIHNpemVvZihfVmFsdWVUeXBlKSkpOworICAgICAgX19udW1fYmluc19jYWNoZSA9IF9fcm91bmRfdXBfdG9fcG93MihfX251bV9iaW5zX2NhY2hlKTsKKworICAgICAgLy8gTm8gbW9yZSBidWNrZXRzIHRoYW4gVExCIGVudHJpZXMsIHBvd2VyIG9mIDIKKyAgICAgIC8vIFBvd2VyIG9mIDIgYW5kIGF0IGxlYXN0IG9uZSBlbGVtZW50IHBlciBiaW4sIGF0IG1vc3QgdGhlIFRMQiBzaXplLgorICAgICAgX19udW1fYmlucyA9IHN0ZDo6bWluPF9EaWZmZXJlbmNlVHlwZT4oX19uLCBfX251bV9iaW5zX2NhY2hlKTsKKworI2lmIF9HTElCQ1hYX1JBTkRPTV9TSFVGRkxFX0NPTlNJREVSX1RMQgorICAgICAgLy8gMiBUTEIgZW50cmllcyBuZWVkZWQgcGVyIGJpbi4KKyAgICAgIF9fbnVtX2JpbnMgPSBzdGQ6Om1pbjxfRGlmZmVyZW5jZVR5cGU+KF9fcy5UTEJfc2l6ZSAvIDIsIF9fbnVtX2JpbnMpOworI2VuZGlmCisgICAgICBfX251bV9iaW5zID0gX19yb3VuZF91cF90b19wb3cyKF9fbnVtX2JpbnMpOworCisgICAgICBpZiAoX19udW1fYmlucyA8IF9fbnVtX2JpbnNfY2FjaGUpCisJeworI2VuZGlmCisgICAgICAgICAgLy8gTm93IHRyeSB0aGUgTDIgY2FjaGUKKyAgICAgICAgICAvLyBNdXN0IGZpdCBpbnRvIEwyCisgICAgICAgICAgX19udW1fYmluc19jYWNoZSA9IHN0YXRpY19jYXN0PF9CaW5JbmRleD4KKwkgICAgKHN0ZDo6bWF4PF9EaWZmZXJlbmNlVHlwZT4oMSwgX19uIC8gKF9fcy5MMl9jYWNoZV9zaXplCisJCQkJCQkgLyBzaXplb2YoX1ZhbHVlVHlwZSkpKSk7CisgICAgICAgICAgX19udW1fYmluc19jYWNoZSA9IF9fcm91bmRfdXBfdG9fcG93MihfX251bV9iaW5zX2NhY2hlKTsKKworICAgICAgICAgIC8vIE5vIG1vcmUgYnVja2V0cyB0aGFuIFRMQiBlbnRyaWVzLCBwb3dlciBvZiAyLgorICAgICAgICAgIF9fbnVtX2JpbnMgPSBzdGF0aWNfY2FzdDxfQmluSW5kZXg+CisJICAgIChzdGQ6Om1pbihfX24sIHN0YXRpY19jYXN0PF9EaWZmZXJlbmNlVHlwZT4oX19udW1fYmluc19jYWNoZSkpKTsKKyAgICAgICAgICAvLyBQb3dlciBvZiAyIGFuZCBhdCBsZWFzdCBvbmUgZWxlbWVudCBwZXIgYmluLCBhdCBtb3N0IHRoZSBUTEIgc2l6ZS4KKyNpZiBfR0xJQkNYWF9SQU5ET01fU0hVRkZMRV9DT05TSURFUl9UTEIKKyAgICAgICAgICAvLyAyIFRMQiBlbnRyaWVzIG5lZWRlZCBwZXIgYmluLgorICAgICAgICAgIF9fbnVtX2JpbnMgPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDxfRGlmZmVyZW5jZVR5cGU+KF9fcy5UTEJfc2l6ZSAvIDIpLAorCQkJCV9fbnVtX2JpbnMpOworI2VuZGlmCisgICAgICAgICAgICBfX251bV9iaW5zID0gX19yb3VuZF91cF90b19wb3cyKF9fbnVtX2JpbnMpOworI2lmIF9HTElCQ1hYX1JBTkRPTV9TSFVGRkxFX0NPTlNJREVSX0wxCisJfQorI2VuZGlmCisKKyAgICAgIF9fbnVtX2JpbnMgPSBfX3JvdW5kX3VwX3RvX3BvdzIoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heDxfQmluSW5kZXg+KF9fbnVtX3RocmVhZHMsIF9fbnVtX2JpbnMpKTsKKworICAgICAgaWYgKF9fbnVtX3RocmVhZHMgPD0gMSkKKyAgICAgIHsKKyAgICAgICAgX1JhbmRvbU51bWJlciBfX2Rlcml2ZWRfcm5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcm5nKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSkpOworCV9fc2VxdWVudGlhbF9yYW5kb21fc2h1ZmZsZShfX2JlZ2luLCBfX2VuZCwgX19kZXJpdmVkX3JuZyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgX0RSYW5kb21TaHVmZmxpbmdHbG9iYWxEYXRhPF9SQUl0ZXI+IF9fc2QoX19iZWdpbik7CisgICAgICBfRFJTU29ydGVyUFU8X1JBSXRlciwgX1JhbmRvbU51bWJlciA+KiBfX3B1czsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSogX19zdGFydHM7CisKKyMgICAgIHByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoX19udW1fdGhyZWFkcykKKyAgICAgIHsKKwlfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKyMgICAgICAgcHJhZ21hIG9tcCBzaW5nbGUKKwl7CisJICBfX3B1cyA9IG5ldyBfRFJTU29ydGVyUFU8X1JBSXRlciwgX1JhbmRvbU51bWJlcj5bX19udW1fdGhyZWFkc107CisJICAKKwkgIF9fc2QuX01fdGVtcG9yYXJpZXMgPSBuZXcgX1ZhbHVlVHlwZSpbX19udW1fdGhyZWFkc107CisJICBfX3NkLl9NX2Rpc3QgPSBuZXcgX0RpZmZlcmVuY2VUeXBlKltfX251bV9iaW5zICsgMV07CisJICBfX3NkLl9NX2Jpbl9wcm9jID0gbmV3IF9UaHJlYWRJbmRleFtfX251bV9iaW5zXTsKKwkgIGZvciAoX0JpbkluZGV4IF9fYiA9IDA7IF9fYiA8IF9fbnVtX2JpbnMgKyAxOyArK19fYikKKwkgICAgX19zZC5fTV9kaXN0W19fYl0gPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbnVtX3RocmVhZHMgKyAxXTsKKwkgIGZvciAoX0JpbkluZGV4IF9fYiA9IDA7IF9fYiA8IChfX251bV9iaW5zICsgMSk7ICsrX19iKQorCSAgICB7CisJICAgICAgX19zZC5fTV9kaXN0WzBdWzBdID0gMDsKKwkgICAgICBfX3NkLl9NX2Rpc3RbX19iXVswXSA9IDA7CisJICAgIH0KKwkgIF9fc3RhcnRzID0gX19zZC5fTV9zdGFydHMgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbnVtX3RocmVhZHMgKyAxXTsKKwkgIGludCBfX2Jpbl9jdXJzb3IgPSAwOworCSAgX19zZC5fTV9udW1fYmlucyA9IF9fbnVtX2JpbnM7CisJICBfX3NkLl9NX251bV9iaXRzID0gX19yZF9sb2cyKF9fbnVtX2JpbnMpOworCisJICBfRGlmZmVyZW5jZVR5cGUgX19jaHVua19sZW5ndGggPSBfX24gLyBfX251bV90aHJlYWRzLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBfX3NwbGl0ID0gX19uICUgX19udW1fdGhyZWFkcywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgX19zdGFydCA9IDA7CisJICBfRGlmZmVyZW5jZVR5cGUgX19iaW5fY2h1bmtfbGVuZ3RoID0gX19udW1fYmlucyAvIF9fbnVtX3RocmVhZHMsCisJICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmluX3NwbGl0ID0gX19udW1fYmlucyAlIF9fbnVtX3RocmVhZHM7CisJICBmb3IgKF9UaHJlYWRJbmRleCBfX2kgPSAwOyBfX2kgPCBfX251bV90aHJlYWRzOyArK19faSkKKwkgICAgeworCSAgICAgIF9fc3RhcnRzW19faV0gPSBfX3N0YXJ0OworCSAgICAgIF9fc3RhcnQgKz0gKF9faSA8IF9fc3BsaXQKKwkJCSAgPyAoX19jaHVua19sZW5ndGggKyAxKSA6IF9fY2h1bmtfbGVuZ3RoKTsKKwkgICAgICBpbnQgX19qID0gX19wdXNbX19pXS5fTV9iaW5zX2JlZ2luID0gX19iaW5fY3Vyc29yOworCisJICAgICAgLy8gUmFuZ2Ugb2YgYmlucyBmb3IgdGhpcyBwcm9jZXNzb3IuCisJICAgICAgX19iaW5fY3Vyc29yICs9IChfX2kgPCBfX2Jpbl9zcGxpdAorCQkJICAgICAgID8gKF9fYmluX2NodW5rX2xlbmd0aCArIDEpCisJCQkgICAgICAgOiBfX2Jpbl9jaHVua19sZW5ndGgpOworCSAgICAgIF9fcHVzW19faV0uX19iaW5zX2VuZCA9IF9fYmluX2N1cnNvcjsKKwkgICAgICBmb3IgKDsgX19qIDwgX19iaW5fY3Vyc29yOyArK19faikKKwkJX19zZC5fTV9iaW5fcHJvY1tfX2pdID0gX19pOworCSAgICAgIF9fcHVzW19faV0uX01fbnVtX3RocmVhZHMgPSBfX251bV90aHJlYWRzOworCSAgICAgIF9fcHVzW19faV0uX01fc2VlZCA9IF9fcm5nKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSk7CisJICAgICAgX19wdXNbX19pXS5fTV9zZCA9ICZfX3NkOworCSAgICB9CisJICBfX3N0YXJ0c1tfX251bV90aHJlYWRzXSA9IF9fc3RhcnQ7CisJfSAvL3NpbmdsZQorICAgICAgICAgIC8vIE5vdyBzaHVmZmxlIGluIHBhcmFsbGVsLgorCV9fcGFyYWxsZWxfcmFuZG9tX3NodWZmbGVfZHJzX3B1KF9fcHVzKTsKKyAgICAgIH0gIC8vIHBhcmFsbGVsCisKKyAgICAgIGRlbGV0ZVtdIF9fc3RhcnRzOworICAgICAgZGVsZXRlW10gX19zZC5fTV9iaW5fcHJvYzsKKyAgICAgIGZvciAoaW50IF9fcyA9IDA7IF9fcyA8IChfX251bV9iaW5zICsgMSk7ICsrX19zKQorCWRlbGV0ZVtdIF9fc2QuX01fZGlzdFtfX3NdOworICAgICAgZGVsZXRlW10gX19zZC5fTV9kaXN0OworICAgICAgZGVsZXRlW10gX19zZC5fTV90ZW1wb3JhcmllczsKKworICAgICAgZGVsZXRlW10gX19wdXM7CisgICAgfQorCisgIC8qKiBAYnJpZWYgU2VxdWVudGlhbCBjYWNoZS1lZmZpY2llbnQgcmFuZG9tIHNodWZmbGUuCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2Ygc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19ybmcgUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdG8gdXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICB2b2lkCisgICAgX19zZXF1ZW50aWFsX3JhbmRvbV9zaHVmZmxlKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJCQlfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JuZykKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbiA9IF9fZW5kIC0gX19iZWdpbjsKKyAgICAgIGNvbnN0IF9TZXR0aW5ncyYgX19zID0gX1NldHRpbmdzOjpnZXQoKTsKKworICAgICAgX0JpbkluZGV4IF9fbnVtX2JpbnMsIF9fbnVtX2JpbnNfY2FjaGU7CisKKyNpZiBfR0xJQkNYWF9SQU5ET01fU0hVRkZMRV9DT05TSURFUl9MMQorICAgICAgLy8gVHJ5IHRoZSBMMSBjYWNoZSBmaXJzdCwgbXVzdCBmaXQgaW50byBMMS4KKyAgICAgIF9fbnVtX2JpbnNfY2FjaGUgPSBzdGQ6Om1heDxfRGlmZmVyZW5jZVR5cGU+CisJKDEsIF9fbiAvIChfX3MuTDFfY2FjaGVfc2l6ZV9sYiAvIHNpemVvZihfVmFsdWVUeXBlKSkpOworICAgICAgX19udW1fYmluc19jYWNoZSA9IF9fcm91bmRfdXBfdG9fcG93MihfX251bV9iaW5zX2NhY2hlKTsKKworICAgICAgLy8gTm8gbW9yZSBidWNrZXRzIHRoYW4gVExCIGVudHJpZXMsIHBvd2VyIG9mIDIKKyAgICAgIC8vIFBvd2VyIG9mIDIgYW5kIGF0IGxlYXN0IG9uZSBlbGVtZW50IHBlciBiaW4sIGF0IG1vc3QgdGhlIFRMQiBzaXplCisgICAgICBfX251bV9iaW5zID0gc3RkOjptaW4oX19uLCAoX0RpZmZlcmVuY2VUeXBlKV9fbnVtX2JpbnNfY2FjaGUpOworI2lmIF9HTElCQ1hYX1JBTkRPTV9TSFVGRkxFX0NPTlNJREVSX1RMQgorICAgICAgLy8gMiBUTEIgZW50cmllcyBuZWVkZWQgcGVyIGJpbgorICAgICAgX19udW1fYmlucyA9IHN0ZDo6bWluKChfRGlmZmVyZW5jZVR5cGUpX19zLlRMQl9zaXplIC8gMiwgX19udW1fYmlucyk7CisjZW5kaWYKKyAgICAgIF9fbnVtX2JpbnMgPSBfX3JvdW5kX3VwX3RvX3BvdzIoX19udW1fYmlucyk7CisKKyAgICAgIGlmIChfX251bV9iaW5zIDwgX19udW1fYmluc19jYWNoZSkKKwl7CisjZW5kaWYKKyAgICAgICAgICAvLyBOb3cgdHJ5IHRoZSBMMiBjYWNoZSwgbXVzdCBmaXQgaW50byBMMi4KKyAgICAgICAgICBfX251bV9iaW5zX2NhY2hlID0gc3RhdGljX2Nhc3Q8X0JpbkluZGV4PgorCSAgICAoc3RkOjptYXg8X0RpZmZlcmVuY2VUeXBlPigxLCBfX24gLyAoX19zLkwyX2NhY2hlX3NpemUKKwkJCQkJCSAvIHNpemVvZihfVmFsdWVUeXBlKSkpKTsKKyAgICAgICAgICBfX251bV9iaW5zX2NhY2hlID0gX19yb3VuZF91cF90b19wb3cyKF9fbnVtX2JpbnNfY2FjaGUpOworCisgICAgICAgICAgLy8gTm8gbW9yZSBidWNrZXRzIHRoYW4gVExCIGVudHJpZXMsIHBvd2VyIG9mIDIKKyAgICAgICAgICAvLyBQb3dlciBvZiAyIGFuZCBhdCBsZWFzdCBvbmUgZWxlbWVudCBwZXIgYmluLCBhdCBtb3N0IHRoZSBUTEIgc2l6ZS4KKyAgICAgICAgICBfX251bV9iaW5zID0gc3RhdGljX2Nhc3Q8X0JpbkluZGV4PgorCSAgICAoc3RkOjptaW4oX19uLCBzdGF0aWNfY2FzdDxfRGlmZmVyZW5jZVR5cGU+KF9fbnVtX2JpbnNfY2FjaGUpKSk7CisKKyNpZiBfR0xJQkNYWF9SQU5ET01fU0hVRkZMRV9DT05TSURFUl9UTEIKKyAgICAgICAgICAvLyAyIFRMQiBlbnRyaWVzIG5lZWRlZCBwZXIgYmluCisgICAgICAgICAgX19udW1fYmlucyA9IHN0ZDo6bWluPF9EaWZmZXJlbmNlVHlwZT4oX19zLlRMQl9zaXplIC8gMiwgX19udW1fYmlucyk7CisjZW5kaWYKKyAgICAgICAgICBfX251bV9iaW5zID0gX19yb3VuZF91cF90b19wb3cyKF9fbnVtX2JpbnMpOworI2lmIF9HTElCQ1hYX1JBTkRPTV9TSFVGRkxFX0NPTlNJREVSX0wxCisJfQorI2VuZGlmCisKKyAgICAgIGludCBfX251bV9iaXRzID0gX19yZF9sb2cyKF9fbnVtX2JpbnMpOworCisgICAgICBpZiAoX19udW1fYmlucyA+IDEpCisJeworICAgICAgICAgIF9WYWx1ZVR5cGUqIF9fdGFyZ2V0ID0KKwkgICAgc3RhdGljX2Nhc3Q8X1ZhbHVlVHlwZSo+KDo6b3BlcmF0b3IgbmV3KHNpemVvZihfVmFsdWVUeXBlKSAqIF9fbikpOworICAgICAgICAgIF9CaW5JbmRleCogX19vcmFjbGVzID0gbmV3IF9CaW5JbmRleFtfX25dOworICAgICAgICAgIF9EaWZmZXJlbmNlVHlwZSogX19kaXN0MCA9IG5ldyBfRGlmZmVyZW5jZVR5cGVbX19udW1fYmlucyArIDFdLAorICAgICAgICAgICAgICAgIAkgKiBfX2Rpc3QxID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX251bV9iaW5zICsgMV07CisKKyAgICAgICAgICBmb3IgKGludCBfX2IgPSAwOyBfX2IgPCBfX251bV9iaW5zICsgMTsgKytfX2IpCisgICAgICAgICAgICBfX2Rpc3QwW19fYl0gPSAwOworCisgICAgICAgICAgX1JhbmRvbU51bWJlciBfX2JpdHJuZyhfX3JuZygweEZGRkZGRkZGKSk7CisKKyAgICAgICAgICBmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfQmluSW5kZXggX19vcmFjbGUgPSBfX3JhbmRvbV9udW1iZXJfcG93MihfX251bV9iaXRzLCBfX2JpdHJuZyk7CisgICAgICAgICAgICAgIF9fb3JhY2xlc1tfX2ldID0gX19vcmFjbGU7CisKKyAgICAgICAgICAgICAgLy8gVG8gYWxsb3cgcHJlZml4IChwYXJ0aWFsKSBzdW0uCisgICAgICAgICAgICAgICsrKF9fZGlzdDBbX19vcmFjbGUgKyAxXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBTdW0gdXAgYmlucy4KKyAgICAgICAgICBfX2dudV9zZXF1ZW50aWFsOjpwYXJ0aWFsX3N1bShfX2Rpc3QwLCBfX2Rpc3QwICsgX19udW1fYmlucyArIDEsCisJCQkJCV9fZGlzdDApOworCisgICAgICAgICAgZm9yIChpbnQgX19iID0gMDsgX19iIDwgX19udW1fYmlucyArIDE7ICsrX19iKQorICAgICAgICAgICAgX19kaXN0MVtfX2JdID0gX19kaXN0MFtfX2JdOworCisgICAgICAgICAgLy8gRGlzdHJpYnV0ZSBhY2NvcmRpbmcgdG8gb3JhY2xlcy4KKyAgICAgICAgICBmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICAgICAgOjpuZXcoJihfX3RhcmdldFsoX19kaXN0MFtfX29yYWNsZXNbX19pXV0pKytdKSkgCisJCV9WYWx1ZVR5cGUoKihfX2JlZ2luICsgX19pKSk7CisKKyAgICAgICAgICBmb3IgKGludCBfX2IgPSAwOyBfX2IgPCBfX251bV9iaW5zOyArK19fYikKKwkgICAgX19zZXF1ZW50aWFsX3JhbmRvbV9zaHVmZmxlKF9fdGFyZ2V0ICsgX19kaXN0MVtfX2JdLAorCQkJCQlfX3RhcmdldCArIF9fZGlzdDFbX19iICsgMV0sIF9fcm5nKTsKKworICAgICAgICAgIC8vIENvcHkgZWxlbWVudHMgYmFjay4KKyAgICAgICAgICBzdGQ6OmNvcHkoX190YXJnZXQsIF9fdGFyZ2V0ICsgX19uLCBfX2JlZ2luKTsKKworICAgICAgICAgIGRlbGV0ZVtdIF9fZGlzdDA7CisgICAgICAgICAgZGVsZXRlW10gX19kaXN0MTsKKyAgICAgICAgICBkZWxldGVbXSBfX29yYWNsZXM7CisJICAKKwkgIGZvciAoX0RpZmZlcmVuY2VUeXBlIF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJICAgIF9fdGFyZ2V0W19faV0ufl9WYWx1ZVR5cGUoKTsKKyAgICAgICAgICA6Om9wZXJhdG9yIGRlbGV0ZShfX3RhcmdldCk7CisJfQorICAgICAgZWxzZQorCV9fZ251X3NlcXVlbnRpYWw6OnJhbmRvbV9zaHVmZmxlKF9fYmVnaW4sIF9fZW5kLCBfX3JuZyk7CisgICAgfQorCisgIC8qKiBAYnJpZWYgUGFyYWxsZWwgcmFuZG9tIHB1YmxpYyBjYWxsLgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2Ygc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fcm5nIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIHVzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3BhcmFsbGVsX3JhbmRvbV9zaHVmZmxlKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJCSAgICAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3IgX19ybmcgPSBfUmFuZG9tTnVtYmVyKCkpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19uID0gX19lbmQgLSBfX2JlZ2luOworICAgICAgX19wYXJhbGxlbF9yYW5kb21fc2h1ZmZsZV9kcnMoX19iZWdpbiwgX19lbmQsIF9fbiwKKwkJCQkgICAgX19nZXRfbWF4X3RocmVhZHMoKSwgX19ybmcpOworICAgIH0KK30KKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX1JBTkRPTV9TSFVGRkxFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvc2VhcmNoLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3NlYXJjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjODg2OTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3NlYXJjaC5oCkBAIC0wLDAgKzEsMTcyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvc2VhcmNoLmgKKyAqICBAYnJpZWYgUGFyYWxsZWwgaW1wbGVtZW50YXRpb24gYmFzZSBmb3Igc3RkOjpzZWFyY2goKSBhbmQKKyAqICBzdGQ6OnNlYXJjaF9uKCkuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBGZWxpeCBQdXR6ZS4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9TRUFSQ0hfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9TRUFSQ0hfSCAxCisKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorCisjaW5jbHVkZSA8cGFyYWxsZWwvcGFyYWxsZWwuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9lcXVhbGx5X3NwbGl0Lmg+CisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKioKKyAgICogIEBicmllZiBQcmVjYWxjdWxhdGUgX19hZHZhbmNlcyBmb3IgS251dGgtTW9ycmlzLVByYXR0IGFsZ29yaXRobS4KKyAgICogIEBwYXJhbSBfX2VsZW1lbnRzIEJlZ2luIGl0ZXJhdG9yIG9mIHNlcXVlbmNlIHRvIHNlYXJjaCBmb3IuCisgICAqICBAcGFyYW0gX19sZW5ndGggTGVuZ3RoIG9mIHNlcXVlbmNlIHRvIHNlYXJjaCBmb3IuCisgICAqICBAcGFyYW0gX19vZmYgUmV0dXJuZWQgX19vZmZzZXRzLiAKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHA+CisgICAgdm9pZAorICAgIF9fY2FsY19ib3JkZXJzKF9SQUl0ZXIgX19lbGVtZW50cywgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgCisJCSAgIF9EaWZmZXJlbmNlVHAqIF9fb2ZmKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIF9fb2ZmWzBdID0gLTE7CisgICAgICBpZiAoX19sZW5ndGggPiAxKQorCV9fb2ZmWzFdID0gMDsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2sgPSAwOworICAgICAgZm9yIChfRGlmZmVyZW5jZVR5cGUgX19qID0gMjsgX19qIDw9IF9fbGVuZ3RoOyBfX2orKykKKwl7CisgICAgICAgICAgd2hpbGUgKChfX2sgPj0gMCkgJiYgIShfX2VsZW1lbnRzW19fa10gPT0gX19lbGVtZW50c1tfX2otMV0pKQorICAgICAgICAgICAgX19rID0gX19vZmZbX19rXTsKKyAgICAgICAgICBfX29mZltfX2pdID0gKytfX2s7CisJfQorICAgIH0KKworICAvLyBHZW5lcmljIHBhcmFsbGVsIGZpbmQgYWxnb3JpdGhtIChyZXF1aXJlcyByYW5kb20gYWNjZXNzIGl0ZXJhdG9yKS4KKworICAvKiogQGJyaWVmIFBhcmFsbGVsIHN0ZDo6c2VhcmNoLgorICAgKiAgQHBhcmFtIF9fYmVnaW4xIEJlZ2luIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kMSBFbmQgaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19iZWdpbjIgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kMiBFbmQgaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fcHJlZCBGaW5kIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gUGxhY2Ugb2YgZmluZGluZyBpbiBmaXJzdCBzZXF1ZW5jZXMuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9fUkFJdGVyMSwKKyAgICAgICAgICAgdHlwZW5hbWUgX19SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZD4KKyAgICBfX1JBSXRlcjEKKyAgICBfX3NlYXJjaF90ZW1wbGF0ZShfX1JBSXRlcjEgX19iZWdpbjEsIF9fUkFJdGVyMSBfX2VuZDEsCisJCSAgICAgIF9fUkFJdGVyMiBfX2JlZ2luMiwgX19SQUl0ZXIyIF9fZW5kMiwKKwkJICAgICAgX1ByZWQgX19wcmVkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X19SQUl0ZXIxPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIF9HTElCQ1hYX0NBTEwoKF9fZW5kMSAtIF9fYmVnaW4xKSArIChfX2VuZDIgLSBfX2JlZ2luMikpOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19wYXR0ZXJuX2xlbmd0aCA9IF9fZW5kMiAtIF9fYmVnaW4yOworCisgICAgICAvLyBQYXR0ZXJuIHRvbyBzaG9ydC4KKyAgICAgIGlmKF9fcGF0dGVybl9sZW5ndGggPD0gMCkKKwlyZXR1cm4gX19lbmQxOworCisgICAgICAvLyBMYXN0IHBvaW50IHRvIHN0YXJ0IHNlYXJjaC4KKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2lucHV0X2xlbmd0aCA9IChfX2VuZDEgLSBfX2JlZ2luMSkgLSBfX3BhdHRlcm5fbGVuZ3RoOworCisgICAgICAvLyBXaGVyZSBpcyBmaXJzdCBvY2N1cnJlbmNlIG9mIHBhdHRlcm4/IGRlZmF1bHRzIHRvIGVuZC4KKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3Jlc3VsdCA9IChfX2VuZDEgLSBfX2JlZ2luMSk7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgKl9fc3BsaXR0ZXJzOworCisgICAgICAvLyBQYXR0ZXJuIHRvbyBsb25nLgorICAgICAgaWYgKF9faW5wdXRfbGVuZ3RoIDwgMCkKKwlyZXR1cm4gX19lbmQxOworCisgICAgICBvbXBfbG9ja190IF9fcmVzdWx0X2xvY2s7CisgICAgICBvbXBfaW5pdF9sb2NrKCZfX3Jlc3VsdF9sb2NrKTsKKworICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMgPSBzdGQ6Om1heDxfRGlmZmVyZW5jZVR5cGU+CisJKDEsIHN0ZDo6bWluPF9EaWZmZXJlbmNlVHlwZT4oX19pbnB1dF9sZW5ndGgsCisJCQkJICAgICAgX19nZXRfbWF4X3RocmVhZHMoKSkpOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19hZHZhbmNlc1tfX3BhdHRlcm5fbGVuZ3RoXTsKKyAgICAgIF9fY2FsY19ib3JkZXJzKF9fYmVnaW4yLCBfX3BhdHRlcm5fbGVuZ3RoLCBfX2FkdmFuY2VzKTsKKworIyAgICAgcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyhfX251bV90aHJlYWRzKQorICAgICAgeworIyAgICAgICBwcmFnbWEgb21wIHNpbmdsZQorCXsKKwkgIF9fbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisJICBfX3NwbGl0dGVycyA9IG5ldyBfRGlmZmVyZW5jZVR5cGVbX19udW1fdGhyZWFkcyArIDFdOworCSAgX19lcXVhbGx5X3NwbGl0KF9faW5wdXRfbGVuZ3RoLCBfX251bV90aHJlYWRzLCBfX3NwbGl0dGVycyk7CisJfQorCisJX1RocmVhZEluZGV4IF9faWFtID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisKKwlfRGlmZmVyZW5jZVR5cGUgX19zdGFydCA9IF9fc3BsaXR0ZXJzW19faWFtXSwKKwkgICAgICAgICAgICAgICAgIF9fc3RvcCA9IF9fc3BsaXR0ZXJzW19faWFtICsgMV07CisKKwlfRGlmZmVyZW5jZVR5cGUgX19wb3NfaW5fcGF0dGVybiA9IDA7CisJYm9vbCBfX2ZvdW5kX3BhdHRlcm4gPSBmYWxzZTsKKworCXdoaWxlIChfX3N0YXJ0IDw9IF9fc3RvcCAmJiAhX19mb3VuZF9wYXR0ZXJuKQorCSAgeworCSAgICAvLyBHZXQgbmV3IHZhbHVlIG9mIHJlc3VsdC4KKyNwcmFnbWEgb21wIGZsdXNoKF9fcmVzdWx0KQorCSAgICAvLyBObyBjaGFuY2UgZm9yIHRoaXMgdGhyZWFkIHRvIGZpbmQgZmlyc3Qgb2NjdXJyZW5jZS4KKwkgICAgaWYgKF9fcmVzdWx0IDwgX19zdGFydCkKKwkgICAgICBicmVhazsKKwkgICAgd2hpbGUgKF9fcHJlZChfX2JlZ2luMVtfX3N0YXJ0ICsgX19wb3NfaW5fcGF0dGVybl0sCisJCQkgIF9fYmVnaW4yW19fcG9zX2luX3BhdHRlcm5dKSkKKwkgICAgICB7CisJCSsrX19wb3NfaW5fcGF0dGVybjsKKwkJaWYgKF9fcG9zX2luX3BhdHRlcm4gPT0gX19wYXR0ZXJuX2xlbmd0aCkKKwkJICB7CisJCSAgICAvLyBGb3VuZCBuZXcgY2FuZGlkYXRlIGZvciByZXN1bHQuCisJCSAgICBvbXBfc2V0X2xvY2soJl9fcmVzdWx0X2xvY2spOworCQkgICAgX19yZXN1bHQgPSBzdGQ6Om1pbihfX3Jlc3VsdCwgX19zdGFydCk7CisJCSAgICBvbXBfdW5zZXRfbG9jaygmX19yZXN1bHRfbG9jayk7CisKKwkJICAgIF9fZm91bmRfcGF0dGVybiA9IHRydWU7CisJCSAgICBicmVhazsKKwkJICB9CisJICAgICAgfQorCSAgICAvLyBNYWtlIHNhZmUganVtcC4KKwkgICAgX19zdGFydCArPSAoX19wb3NfaW5fcGF0dGVybiAtIF9fYWR2YW5jZXNbX19wb3NfaW5fcGF0dGVybl0pOworCSAgICBfX3Bvc19pbl9wYXR0ZXJuID0gKF9fYWR2YW5jZXNbX19wb3NfaW5fcGF0dGVybl0gPCAwCisJCQkJPyAwIDogX19hZHZhbmNlc1tfX3Bvc19pbl9wYXR0ZXJuXSk7CisJICB9CisgICAgICB9IC8vcGFyYWxsZWwKKworICAgICAgb21wX2Rlc3Ryb3lfbG9jaygmX19yZXN1bHRfbG9jayk7CisKKyAgICAgIGRlbGV0ZVtdIF9fc3BsaXR0ZXJzOworICAgICAgCisgICAgICAvLyBSZXR1cm4gaXRlcmF0b3Igb24gZm91bmQgZWxlbWVudC4KKyAgICAgIHJldHVybiAoX19iZWdpbjEgKyBfX3Jlc3VsdCk7CisgICAgfQorfSAvLyBlbmQgbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9TRUFSQ0hfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9zZXRfb3BlcmF0aW9ucy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9zZXRfb3BlcmF0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOGIxZjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3NldF9vcGVyYXRpb25zLmgKQEAgLTAsMCArMSw1MjkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogQGZpbGUgcGFyYWxsZWwvc2V0X29wZXJhdGlvbnMuaAorICogQGJyaWVmIFBhcmFsbGVsIGltcGxlbWVudGF0aW9ucyBvZiBzZXQgb3BlcmF0aW9ucyBmb3IgcmFuZG9tLWFjY2VzcworICogaXRlcmF0b3JzLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgTWFyaXVzIEVsdmVydCBhbmQgRmVsaXggQm9uZGFyZW5rby4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9TRVRfT1BFUkFUSU9OU19ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX1NFVF9PUEVSQVRJT05TX0ggMQorCisjaW5jbHVkZSA8b21wLmg+CisKKyNpbmNsdWRlIDxwYXJhbGxlbC9zZXR0aW5ncy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL211bHRpc2VxX3NlbGVjdGlvbi5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19jb3B5X3RhaWwoc3RkOjpwYWlyPF9JSXRlciwgX0lJdGVyPiBfX2IsCisJCXN0ZDo6cGFpcjxfSUl0ZXIsIF9JSXRlcj4gX19lLCBfT3V0cHV0SXRlcmF0b3IgX19yKQorICAgIHsKKyAgICAgIGlmIChfX2IuZmlyc3QgIT0gX19lLmZpcnN0KQorCXsKKyAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAqX19yKysgPSAqX19iLmZpcnN0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgd2hpbGUgKF9fYi5maXJzdCAhPSBfX2UuZmlyc3QpOworCX0KKyAgICAgIGVsc2UKKwl7CisgICAgICAgICAgd2hpbGUgKF9fYi5zZWNvbmQgIT0gX19lLnNlY29uZCkKKyAgICAgICAgICAgICpfX3IrKyA9ICpfX2Iuc2Vjb25kKys7CisJfQorICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHN0cnVjdCBfX3N5bW1ldHJpY19kaWZmZXJlbmNlX2Z1bmMKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnBhaXI8X0lJdGVyLCBfSUl0ZXI+IF9JdGVyYXRvclBhaXI7CisKKyAgICAgIF9fc3ltbWV0cmljX2RpZmZlcmVuY2VfZnVuYyhfQ29tcGFyZSBfX2NvbXApIDogX01fY29tcChfX2NvbXApIHt9CisKKyAgICAgIF9Db21wYXJlIF9NX2NvbXA7CisKKyAgICAgIF9PdXRwdXRJdGVyYXRvcgorICAgICAgX01faW52b2tlKF9JSXRlciBfX2EsIF9JSXRlciBfX2IsIF9JSXRlciBfX2MsIF9JSXRlciBfX2QsCisJCV9PdXRwdXRJdGVyYXRvciBfX3IpIGNvbnN0CisgICAgICB7CisJd2hpbGUgKF9fYSAhPSBfX2IgJiYgX19jICE9IF9fZCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoX01fY29tcCgqX19hLCAqX19jKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAJKl9fciA9ICpfX2E7CisgICAgICAgIAkrK19fYTsKKyAgICAgICAgCSsrX19yOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfTV9jb21wKCpfX2MsICpfX2EpKQorICAgICAgICAgICAgICB7CisgICAgICAgIAkqX19yID0gKl9fYzsKKyAgICAgICAgCSsrX19jOworICAgICAgICAJKytfX3I7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAJKytfX2E7CisgICAgICAgIAkrK19fYzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwlyZXR1cm4gc3RkOjpjb3B5KF9fYywgX19kLCBzdGQ6OmNvcHkoX19hLCBfX2IsIF9fcikpOworICAgICAgfQorCisgICAgICBfRGlmZmVyZW5jZVR5cGUKKyAgICAgIF9fY291bnQoX0lJdGVyIF9fYSwgX0lJdGVyIF9fYiwgX0lJdGVyIF9fYywgX0lJdGVyIF9fZCkgY29uc3QKKyAgICAgIHsKKwlfRGlmZmVyZW5jZVR5cGUgX19jb3VudGVyID0gMDsKKworCXdoaWxlIChfX2EgIT0gX19iICYmIF9fYyAhPSBfX2QpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKF9NX2NvbXAoKl9fYSwgKl9fYykpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSsrX19hOworICAgICAgICAJKytfX2NvdW50ZXI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9NX2NvbXAoKl9fYywgKl9fYSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSsrX19jOworICAgICAgICAJKytfX2NvdW50ZXI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAJKytfX2E7CisgICAgICAgIAkrK19fYzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworCXJldHVybiBfX2NvdW50ZXIgKyAoX19iIC0gX19hKSArIChfX2QgLSBfX2MpOworICAgICAgfQorCisgICAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICAgIF9fZmlyc3RfZW1wdHkoX0lJdGVyIF9fYywgX0lJdGVyIF9fZCwgX091dHB1dEl0ZXJhdG9yIF9fb3V0KSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpjb3B5KF9fYywgX19kLCBfX291dCk7IH0KKworICAgICAgX091dHB1dEl0ZXJhdG9yCisgICAgICBfX3NlY29uZF9lbXB0eShfSUl0ZXIgX19hLCBfSUl0ZXIgX19iLCBfT3V0cHV0SXRlcmF0b3IgX19vdXQpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6OmNvcHkoX19hLCBfX2IsIF9fb3V0KTsgfQorICAgIH07CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgc3RydWN0IF9fZGlmZmVyZW5jZV9mdW5jCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpwYWlyPF9JSXRlciwgX0lJdGVyPiBfSXRlcmF0b3JQYWlyOworCisgICAgICBfX2RpZmZlcmVuY2VfZnVuYyhfQ29tcGFyZSBfX2NvbXApIDogX01fY29tcChfX2NvbXApIHt9CisKKyAgICAgIF9Db21wYXJlIF9NX2NvbXA7CisKKyAgICAgIF9PdXRwdXRJdGVyYXRvcgorICAgICAgX01faW52b2tlKF9JSXRlciBfX2EsIF9JSXRlciBfX2IsIF9JSXRlciBfX2MsIF9JSXRlciBfX2QsCisJCV9PdXRwdXRJdGVyYXRvciBfX3IpIGNvbnN0CisgICAgICB7CisJd2hpbGUgKF9fYSAhPSBfX2IgJiYgX19jICE9IF9fZCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoX01fY29tcCgqX19hLCAqX19jKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAJKl9fciA9ICpfX2E7CisgICAgICAgIAkrK19fYTsKKyAgICAgICAgCSsrX19yOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfTV9jb21wKCpfX2MsICpfX2EpKQorICAgICAgICAgICAgICB7ICsrX19jOyB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSsrX19hOworICAgICAgICAJKytfX2M7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJcmV0dXJuIHN0ZDo6Y29weShfX2EsIF9fYiwgX19yKTsKKyAgICAgIH0KKworICAgICAgX0RpZmZlcmVuY2VUeXBlCisgICAgICBfX2NvdW50KF9JSXRlciBfX2EsIF9JSXRlciBfX2IsCisJICAgICAgX0lJdGVyIF9fYywgX0lJdGVyIF9fZCkgY29uc3QKKyAgICAgIHsKKwlfRGlmZmVyZW5jZVR5cGUgX19jb3VudGVyID0gMDsKKworCXdoaWxlIChfX2EgIT0gX19iICYmIF9fYyAhPSBfX2QpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKF9NX2NvbXAoKl9fYSwgKl9fYykpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSsrX19hOworICAgICAgICAJKytfX2NvdW50ZXI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9NX2NvbXAoKl9fYywgKl9fYSkpCisgICAgICAgICAgICAgIHsgKytfX2M7IH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyArK19fYTsgKytfX2M7IH0KKyAgICAgICAgICB9CisKKwlyZXR1cm4gX19jb3VudGVyICsgKF9fYiAtIF9fYSk7CisgICAgICB9CisKKyAgICAgIF9PdXRwdXRJdGVyYXRvcgorICAgICAgX19maXJzdF9lbXB0eShfSUl0ZXIsIF9JSXRlciwgX091dHB1dEl0ZXJhdG9yIF9fb3V0KSBjb25zdAorICAgICAgeyByZXR1cm4gX19vdXQ7IH0KKworICAgICAgX091dHB1dEl0ZXJhdG9yCisgICAgICBfX3NlY29uZF9lbXB0eShfSUl0ZXIgX19hLCBfSUl0ZXIgX19iLCBfT3V0cHV0SXRlcmF0b3IgX19vdXQpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6OmNvcHkoX19hLCBfX2IsIF9fb3V0KTsgfQorICAgIH07CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgc3RydWN0IF9faW50ZXJzZWN0aW9uX2Z1bmMKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnBhaXI8X0lJdGVyLCBfSUl0ZXI+IF9JdGVyYXRvclBhaXI7CisKKyAgICAgIF9faW50ZXJzZWN0aW9uX2Z1bmMoX0NvbXBhcmUgX19jb21wKSA6IF9NX2NvbXAoX19jb21wKSB7fQorCisgICAgICBfQ29tcGFyZSBfTV9jb21wOworCisgICAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICAgIF9NX2ludm9rZShfSUl0ZXIgX19hLCBfSUl0ZXIgX19iLCBfSUl0ZXIgX19jLCBfSUl0ZXIgX19kLAorCQlfT3V0cHV0SXRlcmF0b3IgX19yKSBjb25zdAorICAgICAgeworCXdoaWxlIChfX2EgIT0gX19iICYmIF9fYyAhPSBfX2QpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKF9NX2NvbXAoKl9fYSwgKl9fYykpCisgICAgICAgICAgICAgIHsgKytfX2E7IH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9NX2NvbXAoKl9fYywgKl9fYSkpCisgICAgICAgICAgICAgIHsgKytfX2M7IH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAJKl9fciA9ICpfX2E7CisgICAgICAgIAkrK19fYTsKKyAgICAgICAgCSsrX19jOworICAgICAgICAJKytfX3I7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKwlyZXR1cm4gX19yOworICAgICAgfQorCisgICAgICBfRGlmZmVyZW5jZVR5cGUKKyAgICAgIF9fY291bnQoX0lJdGVyIF9fYSwgX0lJdGVyIF9fYiwgX0lJdGVyIF9fYywgX0lJdGVyIF9fZCkgY29uc3QKKyAgICAgIHsKKwlfRGlmZmVyZW5jZVR5cGUgX19jb3VudGVyID0gMDsKKworCXdoaWxlIChfX2EgIT0gX19iICYmIF9fYyAhPSBfX2QpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKF9NX2NvbXAoKl9fYSwgKl9fYykpCisgICAgICAgICAgICAgIHsgKytfX2E7IH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9NX2NvbXAoKl9fYywgKl9fYSkpCisgICAgICAgICAgICAgIHsgKytfX2M7IH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAJKytfX2E7CisgICAgICAgIAkrK19fYzsKKyAgICAgICAgCSsrX19jb3VudGVyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisJcmV0dXJuIF9fY291bnRlcjsKKyAgICAgIH0KKworICAgICAgX091dHB1dEl0ZXJhdG9yCisgICAgICBfX2ZpcnN0X2VtcHR5KF9JSXRlciwgX0lJdGVyLCBfT3V0cHV0SXRlcmF0b3IgX19vdXQpIGNvbnN0CisgICAgICB7IHJldHVybiBfX291dDsgfQorCisgICAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICAgIF9fc2Vjb25kX2VtcHR5KF9JSXRlciwgX0lJdGVyLCBfT3V0cHV0SXRlcmF0b3IgX19vdXQpIGNvbnN0CisgICAgICB7IHJldHVybiBfX291dDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0lJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3IsIGNsYXNzIF9Db21wYXJlPgorICAgIHN0cnVjdCBfX3VuaW9uX2Z1bmMKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfX3VuaW9uX2Z1bmMoX0NvbXBhcmUgX19jb21wKSA6IF9NX2NvbXAoX19jb21wKSB7fQorCisgICAgICBfQ29tcGFyZSBfTV9jb21wOworCisgICAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICAgIF9NX2ludm9rZShfSUl0ZXIgX19hLCBjb25zdCBfSUl0ZXIgX19iLCBfSUl0ZXIgX19jLAorCQljb25zdCBfSUl0ZXIgX19kLCBfT3V0cHV0SXRlcmF0b3IgX19yKSBjb25zdAorICAgICAgeworCXdoaWxlIChfX2EgIT0gX19iICYmIF9fYyAhPSBfX2QpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKF9NX2NvbXAoKl9fYSwgKl9fYykpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSpfX3IgPSAqX19hOworICAgICAgICAJKytfX2E7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9NX2NvbXAoKl9fYywgKl9fYSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSpfX3IgPSAqX19jOworICAgICAgICAJKytfX2M7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAJKl9fciA9ICpfX2E7CisgICAgICAgIAkrK19fYTsKKyAgICAgICAgCSsrX19jOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICArK19fcjsKKyAgICAgICAgICB9CisJcmV0dXJuIHN0ZDo6Y29weShfX2MsIF9fZCwgc3RkOjpjb3B5KF9fYSwgX19iLCBfX3IpKTsKKyAgICAgIH0KKworICAgICAgX0RpZmZlcmVuY2VUeXBlCisgICAgICBfX2NvdW50KF9JSXRlciBfX2EsIF9JSXRlciBfX2IsIF9JSXRlciBfX2MsIF9JSXRlciBfX2QpIGNvbnN0CisgICAgICB7CisJX0RpZmZlcmVuY2VUeXBlIF9fY291bnRlciA9IDA7CisKKwl3aGlsZSAoX19hICE9IF9fYiAmJiBfX2MgIT0gX19kKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfTV9jb21wKCpfX2EsICpfX2MpKQorICAgICAgICAgICAgICB7ICsrX19hOyB9CisgICAgICAgICAgICBlbHNlIGlmIChfTV9jb21wKCpfX2MsICpfX2EpKQorICAgICAgICAgICAgICB7ICsrX19jOyB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSsrX19hOworICAgICAgICAJKytfX2M7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrX19jb3VudGVyOworICAgICAgICAgIH0KKworCV9fY291bnRlciArPSAoX19iIC0gX19hKTsKKwlfX2NvdW50ZXIgKz0gKF9fZCAtIF9fYyk7CisJcmV0dXJuIF9fY291bnRlcjsKKyAgICAgIH0KKworICAgICAgX091dHB1dEl0ZXJhdG9yCisgICAgICBfX2ZpcnN0X2VtcHR5KF9JSXRlciBfX2MsIF9JSXRlciBfX2QsIF9PdXRwdXRJdGVyYXRvciBfX291dCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6Y29weShfX2MsIF9fZCwgX19vdXQpOyB9CisKKyAgICAgIF9PdXRwdXRJdGVyYXRvcgorICAgICAgX19zZWNvbmRfZW1wdHkoX0lJdGVyIF9fYSwgX0lJdGVyIF9fYiwgX091dHB1dEl0ZXJhdG9yIF9fb3V0KSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpjb3B5KF9fYSwgX19iLCBfX291dCk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfT3BlcmF0aW9uPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fcGFyYWxsZWxfc2V0X29wZXJhdGlvbihfSUl0ZXIgX19iZWdpbjEsIF9JSXRlciBfX2VuZDEsCisJCQkgICAgIF9JSXRlciBfX2JlZ2luMiwgX0lJdGVyIF9fZW5kMiwKKwkJCSAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfT3BlcmF0aW9uIF9fb3ApCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTCgoX19lbmQxIC0gX19iZWdpbjEpICsgKF9fZW5kMiAtIF9fYmVnaW4yKSkKKworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpwYWlyPF9JSXRlciwgX0lJdGVyPiBfSXRlcmF0b3JQYWlyOworCisgICAgICBpZiAoX19iZWdpbjEgPT0gX19lbmQxKQorCXJldHVybiBfX29wLl9fZmlyc3RfZW1wdHkoX19iZWdpbjIsIF9fZW5kMiwgX19yZXN1bHQpOworCisgICAgICBpZiAoX19iZWdpbjIgPT0gX19lbmQyKQorCXJldHVybiBfX29wLl9fc2Vjb25kX2VtcHR5KF9fYmVnaW4xLCBfX2VuZDEsIF9fcmVzdWx0KTsKKworICAgICAgY29uc3QgX0RpZmZlcmVuY2VUeXBlIF9fc2l6ZSA9IChfX2VuZDEgLSBfX2JlZ2luMSkgKyAoX19lbmQyIC0gX19iZWdpbjIpOworCisgICAgICBjb25zdCBfSXRlcmF0b3JQYWlyIF9fc2VxdWVuY2VbMl0gPSB7IHN0ZDo6bWFrZV9wYWlyKF9fYmVnaW4xLCBfX2VuZDEpLAorCQkJCQkgICAgc3RkOjptYWtlX3BhaXIoX19iZWdpbjIsIF9fZW5kMikgfTsKKyAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3JldHVybl92YWx1ZSA9IF9fcmVzdWx0OworICAgICAgX0RpZmZlcmVuY2VUeXBlICpfX2JvcmRlcnM7CisgICAgICBfSXRlcmF0b3JQYWlyICpfX2Jsb2NrX2JlZ2luczsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSogX19sZW5ndGhzOworCisgICAgICBfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcyA9CisgICAgICAgICAgc3RkOjptaW48X0RpZmZlcmVuY2VUeXBlPihfX2dldF9tYXhfdGhyZWFkcygpLAorICAgICAgICAgICAgICBzdGQ6Om1pbihfX2VuZDEgLSBfX2JlZ2luMSwgX19lbmQyIC0gX19iZWdpbjIpKTsKKworIyAgICAgcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyhfX251bV90aHJlYWRzKQorICAgICAgeworIyAgICAgICBwcmFnbWEgb21wIHNpbmdsZQorCXsKKwkgIF9fbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisKKwkgIF9fYm9yZGVycyA9IG5ldyBfRGlmZmVyZW5jZVR5cGVbX19udW1fdGhyZWFkcyArIDJdOworCSAgX19lcXVhbGx5X3NwbGl0KF9fc2l6ZSwgX19udW1fdGhyZWFkcyArIDEsIF9fYm9yZGVycyk7CisJICBfX2Jsb2NrX2JlZ2lucyA9IG5ldyBfSXRlcmF0b3JQYWlyW19fbnVtX3RocmVhZHMgKyAxXTsKKwkgIC8vIFZlcnkgX19zdGFydC4KKwkgIF9fYmxvY2tfYmVnaW5zWzBdID0gc3RkOjptYWtlX3BhaXIoX19iZWdpbjEsIF9fYmVnaW4yKTsKKwkgIF9fbGVuZ3RocyA9IG5ldyBfRGlmZmVyZW5jZVR5cGVbX19udW1fdGhyZWFkc107CisJfSAvL3NpbmdsZQorCisJX1RocmVhZEluZGV4IF9faWFtID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisKKwkvLyBfUmVzdWx0IGZyb20gbXVsdGlzZXFfcGFydGl0aW9uLgorCV9JSXRlciBfX29mZnNldFsyXTsKKwljb25zdCBfRGlmZmVyZW5jZVR5cGUgX19yYW5rID0gX19ib3JkZXJzW19faWFtICsgMV07CisKKwltdWx0aXNlcV9wYXJ0aXRpb24oX19zZXF1ZW5jZSwgX19zZXF1ZW5jZSArIDIsCisJCQkgICBfX3JhbmssIF9fb2Zmc2V0LCBfX29wLl9NX2NvbXApOworCisJLy8gYWxsb3dlZCB0byByZWFkPworCS8vIHRvZ2V0aGVyCisJLy8gKihfX29mZnNldFsgMCBdIC0gMSkgPT0gKl9fb2Zmc2V0WyAxIF0KKwlpZiAoX19vZmZzZXRbIDAgXSAhPSBfX2JlZ2luMSAmJiBfX29mZnNldFsxXSAhPSBfX2VuZDIKKwkgICAgJiYgIV9fb3AuX01fY29tcCgqKF9fb2Zmc2V0WzBdIC0gMSksICpfX29mZnNldFsxXSkKKwkgICAgJiYgIV9fb3AuX01fY29tcCgqX19vZmZzZXRbMV0sICooX19vZmZzZXRbMF0gLSAxKSkpCisJICB7CisJICAgIC8vIEF2b2lkIHNwbGl0IGJldHdlZW4gZ2xvYmFsbHkgZXF1YWwgZWxlbWVudHM6IG1vdmUgb25lIHRvCisJICAgIC8vIGZyb250IGluIGZpcnN0IHNlcXVlbmNlLgorICAgICAgICAgICAgICAtLV9fb2Zmc2V0WzBdOworCSAgfQorCisJX0l0ZXJhdG9yUGFpciBfX2Jsb2NrX2VuZCA9IF9fYmxvY2tfYmVnaW5zW19faWFtICsgMV0gPQorCSAgX0l0ZXJhdG9yUGFpcihfX29mZnNldFswXSwgX19vZmZzZXRbMV0pOworCisJLy8gTWFrZSBzdXJlIGFsbCB0aHJlYWRzIGhhdmUgdGhlaXIgYmxvY2tfYmVnaW4gcmVzdWx0IHdyaXR0ZW4gb3V0LgorIyAgICAgICBwcmFnbWEgb21wIGJhcnJpZXIKKworCV9JdGVyYXRvclBhaXIgX19ibG9ja19iZWdpbiA9IF9fYmxvY2tfYmVnaW5zW19faWFtXTsKKworCS8vIEJlZ2luIHdvcmtpbmcgZm9yIHRoZSBmaXJzdCBibG9jaywgd2hpbGUgdGhlIG90aGVycyBleGNlcHQKKwkvLyB0aGUgbGFzdCBzdGFydCB0byBjb3VudC4KKwlpZiAoX19pYW0gPT0gMCkKKwkgIHsKKwkgICAgLy8gVGhlIGZpcnN0IHRocmVhZCBjYW4gY29weSBhbHJlYWR5LgorCSAgICBfX2xlbmd0aHNbIF9faWFtIF0gPQorCSAgICAgIF9fb3AuX01faW52b2tlKF9fYmxvY2tfYmVnaW4uZmlyc3QsIF9fYmxvY2tfZW5kLmZpcnN0LAorCQkJICAgICBfX2Jsb2NrX2JlZ2luLnNlY29uZCwgX19ibG9ja19lbmQuc2Vjb25kLAorCQkJICAgICBfX3Jlc3VsdCkgLSBfX3Jlc3VsdDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIF9fbGVuZ3Roc1sgX19pYW0gXSA9CisJICAgICAgX19vcC5fX2NvdW50KF9fYmxvY2tfYmVnaW4uZmlyc3QsIF9fYmxvY2tfZW5kLmZpcnN0LAorCQkJICAgX19ibG9ja19iZWdpbi5zZWNvbmQsIF9fYmxvY2tfZW5kLnNlY29uZCk7CisJICB9CisKKwkvLyBNYWtlIHN1cmUgZXZlcnlvbmUgd3JvdGUgdGhlaXIgbGVuZ3Rocy4KKyMgICAgICAgcHJhZ21hIG9tcCBiYXJyaWVyCisKKwlfT3V0cHV0SXRlcmF0b3IgX19yID0gX19yZXN1bHQ7CisKKwlpZiAoX19pYW0gPT0gMCkKKwkgIHsKKwkgICAgLy8gRG8gdGhlIGxhc3QgYmxvY2suCisJICAgIGZvciAoX1RocmVhZEluZGV4IF9faSA9IDA7IF9faSA8IF9fbnVtX3RocmVhZHM7ICsrX19pKQorCSAgICAgIF9fciArPSBfX2xlbmd0aHNbX19pXTsKKworCSAgICBfX2Jsb2NrX2JlZ2luID0gX19ibG9ja19iZWdpbnNbX19udW1fdGhyZWFkc107CisKKwkgICAgLy8gUmV0dXJuIHRoZSByZXN1bHQgaXRlcmF0b3Igb2YgdGhlIGxhc3QgYmxvY2suCisJICAgIF9fcmV0dXJuX3ZhbHVlID0KKwkgICAgICBfX29wLl9NX2ludm9rZShfX2Jsb2NrX2JlZ2luLmZpcnN0LCBfX2VuZDEsCisJCQkgICAgIF9fYmxvY2tfYmVnaW4uc2Vjb25kLCBfX2VuZDIsIF9fcik7CisKKwkgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZvciAoX1RocmVhZEluZGV4IF9faSA9IDA7IF9faSA8IF9faWFtOyArK19faSkKKyAgICAgICAgCV9fciArPSBfX2xlbmd0aHNbIF9faSBdOworCisgICAgICAgICAgICAgIC8vIFJlc2V0IGJlZ2lucyBmb3IgY29weSBwYXNzLgorICAgICAgICAgICAgICBfX29wLl9NX2ludm9rZShfX2Jsb2NrX2JlZ2luLmZpcnN0LCBfX2Jsb2NrX2VuZC5maXJzdCwKKwkJCSAgICAgX19ibG9ja19iZWdpbi5zZWNvbmQsIF9fYmxvY2tfZW5kLnNlY29uZCwgX19yKTsKKyAgICAgICAgICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXR1cm5fdmFsdWU7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgX19wYXJhbGxlbF9zZXRfdW5pb24oX0lJdGVyIF9fYmVnaW4xLCBfSUl0ZXIgX19lbmQxLAorCQkJIF9JSXRlciBfX2JlZ2luMiwgX0lJdGVyIF9fZW5kMiwKKwkJCSBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICByZXR1cm4gX19wYXJhbGxlbF9zZXRfb3BlcmF0aW9uKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsCisJCQkJICAgICAgX19yZXN1bHQsCisJCQkJICAgICAgX191bmlvbl9mdW5jPCBfSUl0ZXIsIF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgICAgICBfQ29tcGFyZT4oX19jb21wKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgX19wYXJhbGxlbF9zZXRfaW50ZXJzZWN0aW9uKF9JSXRlciBfX2JlZ2luMSwgX0lJdGVyIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIAlfSUl0ZXIgX19iZWdpbjIsIF9JSXRlciBfX2VuZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAJX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgcmV0dXJuIF9fcGFyYWxsZWxfc2V0X29wZXJhdGlvbihfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLAorCQkJCSAgICAgIF9fcmVzdWx0LAorCQkJCSAgICAgIF9faW50ZXJzZWN0aW9uX2Z1bmM8X0lJdGVyLAorCQkJCSAgICAgIF9PdXRwdXRJdGVyYXRvciwgX0NvbXBhcmU+KF9fY29tcCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fcGFyYWxsZWxfc2V0X2RpZmZlcmVuY2UoX0lJdGVyIF9fYmVnaW4xLCBfSUl0ZXIgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lJdGVyIF9fYmVnaW4yLCBfSUl0ZXIgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgcmV0dXJuIF9fcGFyYWxsZWxfc2V0X29wZXJhdGlvbihfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLAorCQkJCSAgICAgIF9fcmVzdWx0LAorCQkJCSAgICAgIF9fZGlmZmVyZW5jZV9mdW5jPF9JSXRlciwKKwkJCQkgICAgICBfT3V0cHV0SXRlcmF0b3IsIF9Db21wYXJlPihfX2NvbXApKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3BhcmFsbGVsX3NldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfSUl0ZXIgX19iZWdpbjEsIF9JSXRlciBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlfSUl0ZXIgX19iZWdpbjIsIF9JSXRlciBfX2VuZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgcmV0dXJuIF9fcGFyYWxsZWxfc2V0X29wZXJhdGlvbihfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLAorCQkJCSAgICAgIF9fcmVzdWx0LAorCQkJCSAgICAgIF9fc3ltbWV0cmljX2RpZmZlcmVuY2VfZnVuYzxfSUl0ZXIsCisJCQkJICAgICAgX091dHB1dEl0ZXJhdG9yLCBfQ29tcGFyZT4oX19jb21wKSk7CisgICAgfQorfQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfU0VUX09QRVJBVElPTlNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9zZXR0aW5ncy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9zZXR0aW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNDYyMTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3NldHRpbmdzLmgKQEAgLTAsMCArMSwzNDMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9zZXR0aW5ncy5oCisgKiAgQGJyaWVmIFJ1bnRpbWUgc2V0dGluZ3MgYW5kIHR1bmluZyBwYXJhbWV0ZXJzLCBoZXVyaXN0aWNzIHRvIGRlY2lkZQorICogIHdoZXRoZXIgdG8gdXNlIHBhcmFsbGVsaXplZCBhbGdvcml0aG1zLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICoKKyAqICBAc2VjdGlvbiBwYXJhbGxlbGl6YXRpb25fZGVjaXNpb24gCisgKiAgVGhlIGRlY2lzaW9uIHdoZXRoZXIgdG8gcnVuIGFuIGFsZ29yaXRobSBpbiBwYXJhbGxlbC4KKyAqCisgKiAgVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0aGUgdXNlciBjYW4gc3dpdGNoIG9uIGFuZCBfX29mZiB0aGUgcGFyYWxsZWwKKyAqICBleGVjdXRpb24gb2YgYW4gYWxnb3JpdGhtLCBib3RoIGF0IGNvbXBpbGUtIGFuZCBydW4tdGltZS4KKyAqCisgKiAgT25seSBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBjYW4gYmUgZm9yY2VkIGF0IGNvbXBpbGUtdGltZS4gIFRoaXMKKyAqICByZWR1Y2VzIGNvZGUgc2l6ZSBhbmQgcHJvdGVjdHMgY29kZSBwYXJ0cyB0aGF0IGhhdmUKKyAqICBub24tdGhyZWFkLXNhZmUgc2lkZSBlZmZlY3RzLgorICoKKyAqICBVbHRpbWF0ZWx5LCBmb3JjaW5nIHBhcmFsbGVsIGV4ZWN1dGlvbiBhdCBjb21waWxlLXRpbWUgbWFrZXMKKyAqICBzZW5zZS4gIE9mdGVuLCB0aGUgc2VxdWVudGlhbCBhbGdvcml0aG0gaW1wbGVtZW50YXRpb24gaXMgdXNlZCBhcworICogIGEgc3Vicm91dGluZSwgc28gbm8gcmVkdWN0aW9uIGluIGNvZGUgc2l6ZSBjYW4gYmUgYWNoaWV2ZWQuICBBbHNvLAorICogIHRoZSBtYWNoaW5lIHRoZSBwcm9ncmFtIGlzIHJ1biBvbiBtaWdodCBoYXZlIG9ubHkgb25lIHByb2Nlc3NvcgorICogIGNvcmUsIHNvIHRvIGF2b2lkIG92ZXJoZWFkLCB0aGUgYWxnb3JpdGhtIGlzIGV4ZWN1dGVkCisgKiAgc2VxdWVudGlhbGx5LgorICoKKyAqICBUbyBmb3JjZSBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBvZiBhbiBhbGdvcml0aG0gdWx0aW1hdGVseSBhdAorICogIGNvbXBpbGUtdGltZSwgdGhlIHVzZXIgbXVzdCBhZGQgdGhlIHRhZworKiAgZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpIHRvIHRoZSBlbmQgb2YgdGhlIHBhcmFtZXRlciBsaXN0LAorICogIGUuIGcuCisgKgorICogIFxjb2RlCisgKiAgc3RkOjpzb3J0KF9fdi5iZWdpbigpLCBfX3YuZW5kKCksIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAqICBcZW5kY29kZQorICoKKyAqICBUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgb3ZlcmxvYWRlZCBhbGdvcml0aG0gdmFyaWFudHMuICBObworICogIGFkZGl0aW9uYWwgY29kZSB3aWxsIGJlIGluc3RhbnRpYXRlZCwgYXQgYWxsLiAgVGhlIHNhbWUgaG9sZHMgZm9yCisgKiAgbW9zdCBhbGdvcml0aG0gY2FsbHMgd2l0aCBpdGVyYXRvcnMgbm90IHByb3ZpZGluZyByYW5kb20gYWNjZXNzLgorICoKKyAqICBJZiB0aGUgYWxnb3JpdGhtIGNhbGwgaXMgbm90IGZvcmNlZCB0byBiZSBleGVjdXRlZCBzZXF1ZW50aWFsbHkKKyAqICBhdCBjb21waWxlLXRpbWUsIHRoZSBkZWNpc2lvbiBpcyBtYWRlIGF0IHJ1bi10aW1lLgorICogIFRoZSBnbG9iYWwgdmFyaWFibGUgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6YWxnb3JpdGhtX3N0cmF0ZWd5CisgKiAgaXMgY2hlY2tlZC4gX0l0IGlzIGEgdHJpc3RhdGUgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0bzoKKyAqCisgKiAgYS4gZm9yY2Vfc2VxdWVudGlhbCwgbWVhbmluZyB0aGUgc2VxdWVudGlhbCBhbGdvcml0aG0gaXMgZXhlY3V0ZWQuCisqICBiLiBmb3JjZV9wYXJhbGxlbCwgbWVhbmluZyB0aGUgcGFyYWxsZWwgYWxnb3JpdGhtIGlzIGV4ZWN1dGVkLgorKiAgYy4gaGV1cmlzdGljCisgKgorICogIEZvciBoZXVyaXN0aWMsIHRoZSBwYXJhbGxlbCBhbGdvcml0aG0gaW1wbGVtZW50YXRpb24gaXMgY2FsbGVkCisgKiAgb25seSBpZiB0aGUgaW5wdXQgc2l6ZSBpcyBzdWZmaWNpZW50bHkgbGFyZ2UuICBGb3IgbW9zdAorICogIGFsZ29yaXRobXMsIHRoZSBpbnB1dCBzaXplIGlzIHRoZSAoY29tYmluZWQpIGxlbmd0aCBvZiB0aGUgaW5wdXQKKyogIHNlcXVlbmNlKF9fcykuICBUaGUgdGhyZXNob2xkIGNhbiBiZSBzZXQgYnkgdGhlIHVzZXIsIGluZGl2aWR1YWxseQorICogIGZvciBlYWNoIGFsZ29yaXRobS4gIFRoZSBhY2NvcmRpbmcgdmFyaWFibGVzIGFyZSBjYWxsZWQKKyogIGdudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpbYWxnb3JpdGhtXV9taW5pbWFsX24gLgorICoKKyAqICBGb3Igc29tZSBvZiB0aGUgYWxnb3JpdGhtcywgdGhlcmUgYXJlIGV2ZW4gbW9yZSB0dW5pbmcgb3B0aW9ucywKKyAqICBlLiBnLiB0aGUgYWJpbGl0eSB0byBjaG9vc2UgZnJvbSBtdWx0aXBsZSBhbGdvcml0aG0gdmFyaWFudHMuICBTZWUKKyAqICBiZWxvdyBmb3IgZGV0YWlscy4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIgYW5kIEZlbGl4IFB1dHplLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX1NFVFRJTkdTX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfU0VUVElOR1NfSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC90eXBlcy5oPgorCisvKiogCisgICogQGJyaWVmIERldGVybWluZSBhdCBjb21waWxlKD8pLXRpbWUgaWYgdGhlIHBhcmFsbGVsIHZhcmlhbnQgb2YgYW4KKyAgKiBhbGdvcml0aG0gc2hvdWxkIGJlIGNhbGxlZC4KKyAgKiBAcGFyYW0gX19jIEEgY29uZGl0aW9uIHRoYXQgaXMgY29udmVydGlibGUgdG8gYm9vbCB0aGF0IGlzIG92ZXJydWxlZCBieQorICAqIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmFsZ29yaXRobV9zdHJhdGVneS4gVXN1YWxseSBhIGRlY2lzaW9uCisgICogYmFzZWQgb24gdGhlIGlucHV0IHNpemUuCisgICovCisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTihfX2MpIFwKKyAgKF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLmFsZ29yaXRobV9zdHJhdGVneSBcCisgICAgIT0gX19nbnVfcGFyYWxsZWw6OmZvcmNlX3NlcXVlbnRpYWwgXAorICAmJiAoKF9fZ251X3BhcmFsbGVsOjpfX2dldF9tYXhfdGhyZWFkcygpID4gMSAmJiAoX19jKSkgXAorICAgICB8fCBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5hbGdvcml0aG1fc3RyYXRlZ3kgXAorICAgICAgICA9PSBfX2dudV9wYXJhbGxlbDo6Zm9yY2VfcGFyYWxsZWwpKQorCisvKgoraW5saW5lIGJvb2wKK3BhcmFsbGVsX2NvbmRpdGlvbihib29sIF9fYykKK3sKKyAgYm9vbCByZXQgPSBmYWxzZTsKKyAgY29uc3QgX1NldHRpbmdzJiBfX3MgPSBfU2V0dGluZ3M6OmdldCgpOworICBpZiAoX19zLmFsZ29yaXRobV9zdHJhdGVneSAhPSBmb3JjZV9zZXFlbnRpYWwpCisgICAgeworICAgICAgaWYgKF9fcy5hbGdvcml0aG1fc3RyYXRlZ3kgPT0gZm9yY2VfcGFyYWxsZWwpCisgICAgICAgIHJldCA9IHRydWU7CisgICAgICBlbHNlCisgICAgICAgIHJldCA9IF9fZ2V0X21heF90aHJlYWRzKCkgPiAxICYmIF9fYzsKKyAgICB9CisgIHJldHVybiByZXQ7Cit9CisqLworCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLy8vIGNsYXNzIF9TZXR0aW5ncworICAvLy8gUnVuLXRpbWUgc2V0dGluZ3MgZm9yIHRoZSBwYXJhbGxlbCBtb2RlIGluY2x1ZGluZyBhbGwgdHVuYWJsZSBwYXJhbWV0ZXJzLgorICBzdHJ1Y3QgX1NldHRpbmdzCisgIHsKKyAgICBfQWxnb3JpdGhtU3RyYXRlZ3kgICAgICAgICAgYWxnb3JpdGhtX3N0cmF0ZWd5OworICAgIAorICAgIF9Tb3J0QWxnb3JpdGhtICAgICAgICAgICAgICBzb3J0X2FsZ29yaXRobTsKKyAgICBfUGFydGlhbFN1bUFsZ29yaXRobSAgICAgICAgcGFydGlhbF9zdW1fYWxnb3JpdGhtOworICAgIF9NdWx0aXdheU1lcmdlQWxnb3JpdGhtICAgICBtdWx0aXdheV9tZXJnZV9hbGdvcml0aG07CisgICAgX0ZpbmRBbGdvcml0aG0gICAgICAgICAgICAgIGZpbmRfYWxnb3JpdGhtOworCisgICAgX1NwbGl0dGluZ0FsZ29yaXRobSAgICAgICAgIHNvcnRfc3BsaXR0aW5nOworICAgIF9TcGxpdHRpbmdBbGdvcml0aG0gICAgICAgICBtZXJnZV9zcGxpdHRpbmc7CisgICAgX1NwbGl0dGluZ0FsZ29yaXRobSAgICAgICAgIG11bHRpd2F5X21lcmdlX3NwbGl0dGluZzsKKworICAgIC8vIFBlci1hbGdvcml0aG0gc2V0dGluZ3MuCisKKyAgICAvLy8gTWluaW1hbCBpbnB1dCBzaXplIGZvciBhY2N1bXVsYXRlLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBhY2N1bXVsYXRlX21pbmltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIGFkamFjZW50X2RpZmZlcmVuY2UuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGFkamFjZW50X2RpZmZlcmVuY2VfbWluaW1hbF9uOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgY291bnQgYW5kIGNvdW50X2lmLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBjb3VudF9taW5pbWFsX247CisKKyAgICAvLy8gTWluaW1hbCBpbnB1dCBzaXplIGZvciBmaWxsLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBmaWxsX21pbmltYWxfbjsKKworICAgIC8vLyBCbG9jayBzaXplIGluY3JlYXNlIGZhY3RvciBmb3IgZmluZC4KKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgZmluZF9pbmNyZWFzaW5nX2ZhY3RvcjsKKworICAgIC8vLyBJbml0aWFsIGJsb2NrIHNpemUgZm9yIGZpbmQuCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIGZpbmRfaW5pdGlhbF9ibG9ja19zaXplOworCisgICAgLy8vIE1heGltYWwgYmxvY2sgc2l6ZSBmb3IgZmluZC4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgZmluZF9tYXhpbXVtX2Jsb2NrX3NpemU7CisKKyAgICAvLy8gU3RhcnQgd2l0aCBsb29raW5nIGZvciB0aGlzIG1hbnkgZWxlbWVudHMgc2VxdWVudGlhbGx5LCBmb3IgZmluZC4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgZmluZF9zZXF1ZW50aWFsX3NlYXJjaF9zaXplOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgZm9yX2VhY2guCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIGZvcl9lYWNoX21pbmltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIGdlbmVyYXRlLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBnZW5lcmF0ZV9taW5pbWFsX247CisKKyAgICAvLy8gTWluaW1hbCBpbnB1dCBzaXplIGZvciBtYXhfZWxlbWVudC4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgbWF4X2VsZW1lbnRfbWluaW1hbF9uOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgbWVyZ2UuCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIG1lcmdlX21pbmltYWxfbjsKKworICAgIC8vLyBPdmVyc2FtcGxpbmcgZmFjdG9yIGZvciBtZXJnZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgbWVyZ2Vfb3ZlcnNhbXBsaW5nOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgbWluX2VsZW1lbnQuCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIG1pbl9lbGVtZW50X21pbmltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIG11bHRpd2F5X21lcmdlLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBtdWx0aXdheV9tZXJnZV9taW5pbWFsX247CisKKyAgICAvLy8gT3ZlcnNhbXBsaW5nIGZhY3RvciBmb3IgbXVsdGl3YXlfbWVyZ2UuCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpd2F5X21lcmdlX21pbmltYWxfazsKKworICAgIC8vLyBPdmVyc2FtcGxpbmcgZmFjdG9yIGZvciBtdWx0aXdheV9tZXJnZS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgbXVsdGl3YXlfbWVyZ2Vfb3ZlcnNhbXBsaW5nOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgbnRoX2VsZW1lbnQuCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIG50aF9lbGVtZW50X21pbmltYWxfbjsKKworICAgIC8vLyBDaHVuayBzaXplIGZvciBwYXJ0aXRpb24uCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIHBhcnRpdGlvbl9jaHVua19zaXplOworCisgICAgLy8vIENodW5rIHNpemUgZm9yIHBhcnRpdGlvbiwgcmVsYXRpdmUgdG8gaW5wdXQgc2l6ZS4gIElmID4gMC4wLAorICAgIC8vLyB0aGlzIHZhbHVlIG92ZXJyaWRlcyBwYXJ0aXRpb25fY2h1bmtfc2l6ZS4KKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX2NodW5rX3NoYXJlOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgcGFydGl0aW9uLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBwYXJ0aXRpb25fbWluaW1hbF9uOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgcGFydGlhbF9zb3J0LgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBwYXJ0aWFsX3NvcnRfbWluaW1hbF9uOworCisgICAgLy8vIFJhdGlvIGZvciBwYXJ0aWFsX3N1bS4gQXNzdW1lICJzdW0gYW5kIHdyaXRlIHJlc3VsdCIgdG8gYmUKKyAgICAvLy8gdGhpcyBmYWN0b3Igc2xvd2VyIHRoYW4ganVzdCAic3VtIi4KKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbF9zdW1fZGlsYXRpb247CisKKyAgICAvLy8gTWluaW1hbCBpbnB1dCBzaXplIGZvciBwYXJ0aWFsX3N1bS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgcGFydGlhbF9zdW1fbWluaW1hbF9uOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgcmFuZG9tX3NodWZmbGUuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIHJhbmRvbV9zaHVmZmxlX21pbmltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIHJlcGxhY2UgYW5kIHJlcGxhY2VfaWYuCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIHJlcGxhY2VfbWluaW1hbF9uOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3Igc2V0X2RpZmZlcmVuY2UuCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIHNldF9kaWZmZXJlbmNlX21pbmltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIHNldF9pbnRlcnNlY3Rpb24uCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIHNldF9pbnRlcnNlY3Rpb25fbWluaW1hbF9uOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3Igc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2VfbWluaW1hbF9uOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3Igc2V0X3VuaW9uLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBzZXRfdW5pb25fbWluaW1hbF9uOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgcGFyYWxsZWwgc29ydGluZy4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgc29ydF9taW5pbWFsX247CisKKyAgICAvLy8gT3ZlcnNhbXBsaW5nIGZhY3RvciBmb3IgcGFyYWxsZWwgc3RkOjpzb3J0IChNV01TKS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgc29ydF9td21zX292ZXJzYW1wbGluZzsKKworICAgIC8vLyBTdWNoIG1hbnkgc2FtcGxlcyB0byB0YWtlIHRvIGZpbmQgYSBnb29kIHBpdm90IChxdWlja3NvcnQpLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBzb3J0X3FzX251bV9zYW1wbGVzX3ByZXNldDsKKworICAgIC8vLyBNYXhpbWFsIHN1YnNlcXVlbmNlIF9fbGVuZ3RoIHRvIHN3aXRjaCB0byB1bmJhbGFuY2VkIF9fYmFzZSBjYXNlLgorICAgIC8vLyBBcHBsaWVzIHRvIHN0ZDo6c29ydCB3aXRoIGR5bmFtaWNhbGx5IGxvYWQtYmFsYW5jZWQgcXVpY2tzb3J0LgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBzb3J0X3FzYl9iYXNlX2Nhc2VfbWF4aW1hbF9uOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgcGFyYWxsZWwgc3RkOjp0cmFuc2Zvcm0uCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIHRyYW5zZm9ybV9taW5pbWFsX247CisKKyAgICAvLy8gTWluaW1hbCBpbnB1dCBzaXplIGZvciB1bmlxdWVfY29weS4gCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIHVuaXF1ZV9jb3B5X21pbmltYWxfbjsKKworICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICB3b3Jrc3RlYWxpbmdfY2h1bmtfc2l6ZTsKKworICAgIC8vIEhhcmR3YXJlIGRlcGVuZGVudCB0dW5pbmcgcGFyYW1ldGVycy4KKworICAgIC8vLyBzaXplIG9mIHRoZSBMMSBjYWNoZSBpbiBieXRlcyAodW5kZXJlc3RpbWF0aW9uKS4KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICAgICAgICAgTDFfY2FjaGVfc2l6ZTsKKworICAgIC8vLyBzaXplIG9mIHRoZSBMMiBjYWNoZSBpbiBieXRlcyAodW5kZXJlc3RpbWF0aW9uKS4KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICAgICAgICAgTDJfY2FjaGVfc2l6ZTsKKworICAgIC8vLyBzaXplIG9mIHRoZSBUcmFuc2xhdGlvbiBMb29rYXNpZGUgQnVmZmVyICh1bmRlcmVzdGltYXRpb24pLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBUTEJfc2l6ZTsKKworICAgIC8vLyBPdmVyZXN0aW1hdGlvbiBvZiBjYWNoZSBsaW5lIHNpemUuICBVc2VkIHRvIGF2b2lkIGZhbHNlCisgICAgLy8vIHNoYXJpbmcsIGkuZS4gZWxlbWVudHMgb2YgZGlmZmVyZW50IHRocmVhZHMgYXJlIGF0IGxlYXN0IHRoaXMKKyAgICAvLy8gYW1vdW50IGFwYXJ0LgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBjYWNoZV9saW5lX3NpemU7CisKKyAgICAvLyBTdGF0aXN0aWNzLgorCisgICAgLy8vIFRoZSBudW1iZXIgb2Ygc3RvbGVuIHJhbmdlcyBpbiBsb2FkLWJhbGFuY2VkIHF1aWNrc29ydC4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgcXNiX3N0ZWFsczsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIHNlYXJjaCBhbmQgc2VhcmNoX24uCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIHNlYXJjaF9taW5pbWFsX247CisKKyAgICAvLy8gQmxvY2sgc2l6ZSBzY2FsZS1kb3duIGZhY3RvciB3aXRoIHJlc3BlY3QgdG8gY3VycmVudCBwb3NpdGlvbi4KKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgZmluZF9zY2FsZV9mYWN0b3I7CisKKyAgICAvLy8gR2V0IHRoZSBnbG9iYWwgc2V0dGluZ3MuCisgICAgX0dMSUJDWFhfQ09OU1Qgc3RhdGljIGNvbnN0IF9TZXR0aW5ncyYKKyAgICBnZXQoKSB0aHJvdygpOworCisgICAgLy8vIFNldCB0aGUgZ2xvYmFsIHNldHRpbmdzLgorICAgIHN0YXRpYyB2b2lkCisgICAgc2V0KF9TZXR0aW5ncyYpIHRocm93KCk7CisKKyAgICBleHBsaWNpdCAKKyAgICBfU2V0dGluZ3MoKSA6CisgICAgICAgICAgICBhbGdvcml0aG1fc3RyYXRlZ3koaGV1cmlzdGljKSwKKyAgICAgICAgICAgIHNvcnRfYWxnb3JpdGhtKE1XTVMpLAorICAgICAgICAgICAgcGFydGlhbF9zdW1fYWxnb3JpdGhtKExJTkVBUiksCisgICAgICAgICAgICBtdWx0aXdheV9tZXJnZV9hbGdvcml0aG0oTE9TRVJfVFJFRSksCisgICAgICAgICAgICBmaW5kX2FsZ29yaXRobShDT05TVEFOVF9TSVpFX0JMT0NLUyksCisgICAgICAgICAgICBzb3J0X3NwbGl0dGluZyhFWEFDVCksCisgICAgICAgICAgICBtZXJnZV9zcGxpdHRpbmcoRVhBQ1QpLAorICAgICAgICAgICAgbXVsdGl3YXlfbWVyZ2Vfc3BsaXR0aW5nKEVYQUNUKSwKKyAgICAgICAgICAgIGFjY3VtdWxhdGVfbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgYWRqYWNlbnRfZGlmZmVyZW5jZV9taW5pbWFsX24oMTAwMCksCisgICAgICAgICAgICBjb3VudF9taW5pbWFsX24oMTAwMCksCisgICAgICAgICAgICBmaWxsX21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIGZpbmRfaW5jcmVhc2luZ19mYWN0b3IoMi4wKSwKKyAgICAgICAgICAgIGZpbmRfaW5pdGlhbF9ibG9ja19zaXplKDI1NiksCisgICAgICAgICAgICBmaW5kX21heGltdW1fYmxvY2tfc2l6ZSg4MTkyKSwKKyAgICAgICAgICAgIGZpbmRfc2VxdWVudGlhbF9zZWFyY2hfc2l6ZSgyNTYpLAorICAgICAgICAgICAgZm9yX2VhY2hfbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgZ2VuZXJhdGVfbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgbWF4X2VsZW1lbnRfbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgbWVyZ2VfbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgbWVyZ2Vfb3ZlcnNhbXBsaW5nKDEwKSwKKyAgICAgICAgICAgIG1pbl9lbGVtZW50X21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIG11bHRpd2F5X21lcmdlX21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIG11bHRpd2F5X21lcmdlX21pbmltYWxfaygyKSwgbXVsdGl3YXlfbWVyZ2Vfb3ZlcnNhbXBsaW5nKDEwKSwKKyAgICAgICAgICAgIG50aF9lbGVtZW50X21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIHBhcnRpdGlvbl9jaHVua19zaXplKDEwMDApLAorICAgICAgICAgICAgcGFydGl0aW9uX2NodW5rX3NoYXJlKDAuMCksCisgICAgICAgICAgICBwYXJ0aXRpb25fbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgcGFydGlhbF9zb3J0X21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIHBhcnRpYWxfc3VtX2RpbGF0aW9uKDEuMGYpLAorICAgICAgICAgICAgcGFydGlhbF9zdW1fbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgcmFuZG9tX3NodWZmbGVfbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgcmVwbGFjZV9taW5pbWFsX24oMTAwMCksCisgICAgICAgICAgICBzZXRfZGlmZmVyZW5jZV9taW5pbWFsX24oMTAwMCksCisgICAgICAgICAgICBzZXRfaW50ZXJzZWN0aW9uX21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV9taW5pbWFsX24oMTAwMCksCisgICAgICAgICAgICBzZXRfdW5pb25fbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgc29ydF9taW5pbWFsX24oMTAwMCksCisgICAgICAgICAgICBzb3J0X213bXNfb3ZlcnNhbXBsaW5nKDEwKSwKKyAgICAgICAgICAgIHNvcnRfcXNfbnVtX3NhbXBsZXNfcHJlc2V0KDEwMCksCisgICAgICAgICAgICBzb3J0X3FzYl9iYXNlX2Nhc2VfbWF4aW1hbF9uKDEwMCksCisgICAgICAgICAgICB0cmFuc2Zvcm1fbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgdW5pcXVlX2NvcHlfbWluaW1hbF9uKDEwMDAwKSwKKyAgICAgICAgICAgIHdvcmtzdGVhbGluZ19jaHVua19zaXplKDEwMCksCisgICAgICAgICAgICBMMV9jYWNoZV9zaXplKDE2IDw8IDEwKSwKKyAgICAgICAgICAgIEwyX2NhY2hlX3NpemUoMjU2IDw8IDEwKSwKKyAgICAgICAgICAgIFRMQl9zaXplKDEyOCksCisgICAgICAgICAgICBjYWNoZV9saW5lX3NpemUoNjQpLAorICAgICAgICAgICAgcXNiX3N0ZWFscygwKSwKKyAgICAgICAgICAgIHNlYXJjaF9taW5pbWFsX24oMTAwMCksCisgICAgICAgICAgICBmaW5kX3NjYWxlX2ZhY3RvcigwLjAxZikKKyAgICB7IH0KKyAgfTsKK30KKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX1NFVFRJTkdTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvc29ydC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9zb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1Nzk1MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvc29ydC5oCkBAIC0wLDAgKzEsMjM4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvc29ydC5oCisgKiAgQGJyaWVmIFBhcmFsbGVsIHNvcnRpbmcgYWxnb3JpdGhtIHN3aXRjaC4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfU09SVF9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX1NPUlRfSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNpY19pdGVyYXRvci5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvcGFyYWxsZWwuaD4KKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyNpbmNsdWRlIDxwYXJhbGxlbC9jaGVja2Vycy5oPgorI2VuZGlmCisKKyNpZiBfR0xJQkNYWF9NRVJHRVNPUlQKKyNpbmNsdWRlIDxwYXJhbGxlbC9tdWx0aXdheV9tZXJnZXNvcnQuaD4KKyNlbmRpZgorCisjaWYgX0dMSUJDWFhfUVVJQ0tTT1JUCisjaW5jbHVkZSA8cGFyYWxsZWwvcXVpY2tzb3J0Lmg+CisjZW5kaWYKKworI2lmIF9HTElCQ1hYX0JBTF9RVUlDS1NPUlQKKyNpbmNsdWRlIDxwYXJhbGxlbC9iYWxhbmNlZF9xdWlja3NvcnQuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLy9wcm90b3R5cGUKKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwgdHlwZW5hbWUgX1JBSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9QYXJhbGxlbGlzbT4KKyAgICB2b2lkCisgICAgX19wYXJhbGxlbF9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJICAgIF9Db21wYXJlIF9fY29tcCwgX1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc20pOworICAgICAgICAKKyAgLyoqIAorICAgKiAgQGJyaWVmIENob29zZSBtdWx0aXdheSBtZXJnZXNvcnQsIHNwbGl0dGluZyB2YXJpYW50IGF0IHJ1bi10aW1lLAorICAgKiAgZm9yIHBhcmFsbGVsIHNvcnRpbmcuCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqICBAdHBhcmFtIF9fc3RhYmxlIFNvcnQgc3RhYmxlLgorICAgKiAgQGNhbGxncmFwaCAKKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUsIHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSB2b2lkCisgICAgX19wYXJhbGxlbF9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJICAgIF9Db21wYXJlIF9fY29tcCwgbXVsdGl3YXlfbWVyZ2Vzb3J0X3RhZyBfX3BhcmFsbGVsaXNtKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19lbmQgLSBfX2JlZ2luKQorCisgICAgICBpZihfU2V0dGluZ3M6OmdldCgpLnNvcnRfc3BsaXR0aW5nID09IEVYQUNUKQorCXBhcmFsbGVsX3NvcnRfbXdtczxfX3N0YWJsZSwgdHJ1ZT4KKwkgIChfX2JlZ2luLCBfX2VuZCwgX19jb21wLCBfX3BhcmFsbGVsaXNtLl9fZ2V0X251bV90aHJlYWRzKCkpOworICAgICAgZWxzZQorCXBhcmFsbGVsX3NvcnRfbXdtczxfX3N0YWJsZSwgZmFsc2U+CisJICAoX19iZWdpbiwgX19lbmQsIF9fY29tcCwgX19wYXJhbGxlbGlzbS5fX2dldF9udW1fdGhyZWFkcygpKTsKKyAgICB9CisKKyAgLyoqIAorICAgKiAgQGJyaWVmIENob29zZSBtdWx0aXdheSBtZXJnZXNvcnQgd2l0aCBleGFjdCBzcGxpdHRpbmcsCisgICAqICBmb3IgcGFyYWxsZWwgc29ydGluZy4KKyAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICogIEB0cGFyYW0gX19zdGFibGUgU29ydCBzdGFibGUuCisgICAqICBAY2FsbGdyYXBoIAorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwgdHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3BhcmFsbGVsX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorCQkgICAgX0NvbXBhcmUgX19jb21wLAorCQkgICAgbXVsdGl3YXlfbWVyZ2Vzb3J0X2V4YWN0X3RhZyBfX3BhcmFsbGVsaXNtKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19lbmQgLSBfX2JlZ2luKQorCisgICAgICBwYXJhbGxlbF9zb3J0X213bXM8X19zdGFibGUsIHRydWU+CisgICAgICAgIChfX2JlZ2luLCBfX2VuZCwgX19jb21wLCBfX3BhcmFsbGVsaXNtLl9fZ2V0X251bV90aHJlYWRzKCkpOworICAgIH0KKworICAvKiogCisgICAqICBAYnJpZWYgQ2hvb3NlIG11bHRpd2F5IG1lcmdlc29ydCB3aXRoIHNwbGl0dGluZyBieSBzYW1wbGluZywKKyAgICogIGZvciBwYXJhbGxlbCBzb3J0aW5nLgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiAgQHRwYXJhbSBfX3N0YWJsZSBTb3J0IHN0YWJsZS4KKyAgICogIEBjYWxsZ3JhcGggCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLCB0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fcGFyYWxsZWxfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCSAgICBfQ29tcGFyZSBfX2NvbXAsCisJCSAgICBtdWx0aXdheV9tZXJnZXNvcnRfc2FtcGxpbmdfdGFnIF9fcGFyYWxsZWxpc20pCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2VuZCAtIF9fYmVnaW4pCisKKyAgICAgIHBhcmFsbGVsX3NvcnRfbXdtczxfX3N0YWJsZSwgZmFsc2U+CisgICAgICAoX19iZWdpbiwgX19lbmQsIF9fY29tcCwgX19wYXJhbGxlbGlzbS5fX2dldF9udW1fdGhyZWFkcygpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ2hvb3NlIHF1aWNrc29ydCBmb3IgcGFyYWxsZWwgc29ydGluZy4KKyAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICogIEB0cGFyYW0gX19zdGFibGUgU29ydCBzdGFibGUuCisgICAqICBAY2FsbGdyYXBoIAorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwgdHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3BhcmFsbGVsX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorCQkgICAgX0NvbXBhcmUgX19jb21wLCBxdWlja3NvcnRfdGFnIF9fcGFyYWxsZWxpc20pCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2VuZCAtIF9fYmVnaW4pCisKKyAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX3N0YWJsZSA9PSBmYWxzZSk7CisKKyAgICAgIF9fcGFyYWxsZWxfc29ydF9xcyhfX2JlZ2luLCBfX2VuZCwgX19jb21wLAorCQkJIF9fcGFyYWxsZWxpc20uX19nZXRfbnVtX3RocmVhZHMoKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENob29zZSBiYWxhbmNlZCBxdWlja3NvcnQgZm9yIHBhcmFsbGVsIHNvcnRpbmcuCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqICBAdHBhcmFtIF9fc3RhYmxlIFNvcnQgc3RhYmxlLgorICAgKiAgQGNhbGxncmFwaCAKKyAgICovCisgICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLCB0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICAgaW5saW5lIHZvaWQKKyAgICAgX19wYXJhbGxlbF9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJICAgICBfQ29tcGFyZSBfX2NvbXAsIGJhbGFuY2VkX3F1aWNrc29ydF90YWcgX19wYXJhbGxlbGlzbSkKKyAgICAgeworICAgICAgIF9HTElCQ1hYX0NBTEwoX19lbmQgLSBfX2JlZ2luKQorCisgICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9fc3RhYmxlID09IGZhbHNlKTsKKworICAgICAgIF9fcGFyYWxsZWxfc29ydF9xc2IoX19iZWdpbiwgX19lbmQsIF9fY29tcCwKKwkJCSAgIF9fcGFyYWxsZWxpc20uX19nZXRfbnVtX3RocmVhZHMoKSk7CisgICAgIH0KKworICAvKiogCisgICAqICBAYnJpZWYgQ2hvb3NlIG11bHRpd2F5IG1lcmdlc29ydCB3aXRoIGV4YWN0IHNwbGl0dGluZywKKyAgICogIGZvciBwYXJhbGxlbCBzb3J0aW5nLgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiAgQHRwYXJhbSBfX3N0YWJsZSBTb3J0IHN0YWJsZS4KKyAgICogIEBjYWxsZ3JhcGggCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLCB0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fcGFyYWxsZWxfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCSAgICBfQ29tcGFyZSBfX2NvbXAsIGRlZmF1bHRfcGFyYWxsZWxfdGFnIF9fcGFyYWxsZWxpc20pCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2VuZCAtIF9fYmVnaW4pCisKKyAgICAgIF9fcGFyYWxsZWxfc29ydDxfX3N0YWJsZT4KKwkoX19iZWdpbiwgX19lbmQsIF9fY29tcCwKKwkgbXVsdGl3YXlfbWVyZ2Vzb3J0X2V4YWN0X3RhZyhfX3BhcmFsbGVsaXNtLl9fZ2V0X251bV90aHJlYWRzKCkpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ2hvb3NlIGEgcGFyYWxsZWwgc29ydGluZyBhbGdvcml0aG0uCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqICBAdHBhcmFtIF9fc3RhYmxlIFNvcnQgc3RhYmxlLgorICAgKiAgQGNhbGxncmFwaCAKKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUsIHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSB2b2lkCisgICAgX19wYXJhbGxlbF9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJICAgIF9Db21wYXJlIF9fY29tcCwgcGFyYWxsZWxfdGFnIF9fcGFyYWxsZWxpc20pCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2VuZCAtIF9fYmVnaW4pCisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgaWYgKGZhbHNlKSA7CisjaWYgX0dMSUJDWFhfTUVSR0VTT1JUCisgICAgICBlbHNlIGlmIChfX3N0YWJsZSB8fCBfU2V0dGluZ3M6OmdldCgpLnNvcnRfYWxnb3JpdGhtID09IE1XTVMpCisgICAgICAgIHsKKyAgICAgICAgICBpZihfU2V0dGluZ3M6OmdldCgpLnNvcnRfc3BsaXR0aW5nID09IEVYQUNUKQorICAgICAgICAgICAgcGFyYWxsZWxfc29ydF9td21zPF9fc3RhYmxlLCB0cnVlPgorICAgICAgICAgICAgICAoX19iZWdpbiwgX19lbmQsIF9fY29tcCwgX19wYXJhbGxlbGlzbS5fX2dldF9udW1fdGhyZWFkcygpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwYXJhbGxlbF9zb3J0X213bXM8ZmFsc2UsIGZhbHNlPgorICAgICAgICAgICAgICAoX19iZWdpbiwgX19lbmQsIF9fY29tcCwgX19wYXJhbGxlbGlzbS5fX2dldF9udW1fdGhyZWFkcygpKTsKKyAgICAgICAgfQorI2VuZGlmCisjaWYgX0dMSUJDWFhfUVVJQ0tTT1JUCisgICAgICBlbHNlIGlmIChfU2V0dGluZ3M6OmdldCgpLnNvcnRfYWxnb3JpdGhtID09IFFTKQorICAgICAgICBfX3BhcmFsbGVsX3NvcnRfcXMoX19iZWdpbiwgX19lbmQsIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcGFyYWxsZWxpc20uX19nZXRfbnVtX3RocmVhZHMoKSk7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9CQUxfUVVJQ0tTT1JUCisgICAgICBlbHNlIGlmIChfU2V0dGluZ3M6OmdldCgpLnNvcnRfYWxnb3JpdGhtID09IFFTX0JBTEFOQ0VEKQorICAgICAgICBfX3BhcmFsbGVsX3NvcnRfcXNiKF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wYXJhbGxlbGlzbS5fX2dldF9udW1fdGhyZWFkcygpKTsKKyNlbmRpZgorICAgICAgZWxzZQorICAgICAgICBfX2dudV9zZXF1ZW50aWFsOjpzb3J0KF9fYmVnaW4sIF9fZW5kLCBfX2NvbXApOworICAgIH0KK30gLy8gZW5kIG5hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfU09SVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3RhZ3MuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvdGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOTA4ODAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3RhZ3MuaApAQCAtMCwwICsxLDE4NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiBAZmlsZSBwYXJhbGxlbC90YWdzLmgKKyAqIEBicmllZiBUYWdzIGZvciBjb21waWxlLXRpbWUgc2VsZWN0aW9uLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlciBhbmQgRmVsaXggUHV0emUuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfVEFHU19ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX1RBR1NfSCAxCisKKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC90eXBlcy5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLyoqIEBicmllZiBGb3JjZXMgc2VxdWVudGlhbCBleGVjdXRpb24gYXQgY29tcGlsZSB0aW1lLiAqLworICBzdHJ1Y3Qgc2VxdWVudGlhbF90YWcgeyB9OworCisgIC8qKiBAYnJpZWYgUmVjb21tZW5kcyBwYXJhbGxlbCBleGVjdXRpb24gYXQgY29tcGlsZSB0aW1lLAorICAgKiAgb3B0aW9uYWxseSB1c2luZyBhIHVzZXItc3BlY2lmaWVkIG51bWJlciBvZiB0aHJlYWRzLiAqLworICBzdHJ1Y3QgcGFyYWxsZWxfdGFnCisgIHsKKyAgICBwcml2YXRlOgorICAgICAgX1RocmVhZEluZGV4IF9NX251bV90aHJlYWRzOworCisgICAgcHVibGljOgorICAgICAgLyoqIEBicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yLiBVc2UgZGVmYXVsdCBudW1iZXIgb2YgdGhyZWFkcy4gKi8KKyAgICAgIHBhcmFsbGVsX3RhZygpCisgICAgICB7IF9NX251bV90aHJlYWRzID0gMDsgfQorCisgICAgICAvKiogQGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IuIFJlY29tbWVuZCBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtIF9fbnVtX3RocmVhZHMgRGVzaXJlZCBudW1iZXIgb2YgdGhyZWFkcy4gKi8KKyAgICAgIHBhcmFsbGVsX3RhZyhfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcykKKyAgICAgIHsgX01fbnVtX3RocmVhZHMgPSBfX251bV90aHJlYWRzOyB9CisKKyAgICAgIC8qKiBAYnJpZWYgRmluZCBvdXQgZGVzaXJlZCBudW1iZXIgb2YgdGhyZWFkcy4KKyAgICAgICAqICBAcmV0dXJuIERlc2lyZWQgbnVtYmVyIG9mIHRocmVhZHMuICovCisgICAgICBfVGhyZWFkSW5kZXggX19nZXRfbnVtX3RocmVhZHMoKQorICAgICAgeworICAgICAgICBpZihfTV9udW1fdGhyZWFkcyA9PSAwKQorICAgICAgICAgIHJldHVybiBvbXBfZ2V0X21heF90aHJlYWRzKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gX01fbnVtX3RocmVhZHM7CisgICAgICB9CisKKyAgICAgIC8qKiBAYnJpZWYgU2V0IHRoZSBkZXNpcmVkIG51bWJlciBvZiB0aHJlYWRzLgorICAgICAgICogIEBwYXJhbSBfX251bV90aHJlYWRzIERlc2lyZWQgbnVtYmVyIG9mIHRocmVhZHMuICovCisgICAgICB2b2lkIHNldF9udW1fdGhyZWFkcyhfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcykKKyAgICAgIHsgX01fbnVtX3RocmVhZHMgPSBfX251bV90aHJlYWRzOyB9CisgIH07CisKKyAgLyoqIEBicmllZiBSZWNvbW1lbmRzIHBhcmFsbGVsIGV4ZWN1dGlvbiB1c2luZyB0aGUKKyAgICAgIGRlZmF1bHQgcGFyYWxsZWwgYWxnb3JpdGhtLiAqLworICBzdHJ1Y3QgZGVmYXVsdF9wYXJhbGxlbF90YWcgOiBwdWJsaWMgcGFyYWxsZWxfdGFnCisgIHsKKyAgICBkZWZhdWx0X3BhcmFsbGVsX3RhZygpIHsgfQorICAgIGRlZmF1bHRfcGFyYWxsZWxfdGFnKF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzKQorICAgIDogcGFyYWxsZWxfdGFnKF9fbnVtX3RocmVhZHMpIHsgfQorICB9OworCisgIC8qKiBAYnJpZWYgUmVjb21tZW5kcyBwYXJhbGxlbCBleGVjdXRpb24gdXNpbmcgZHluYW1pYworICAgICAgbG9hZC1iYWxhbmNpbmcgYXQgY29tcGlsZSB0aW1lLiAqLworICBzdHJ1Y3QgYmFsYW5jZWRfdGFnIDogcHVibGljIHBhcmFsbGVsX3RhZyB7IH07CisKKyAgLyoqIEBicmllZiBSZWNvbW1lbmRzIHBhcmFsbGVsIGV4ZWN1dGlvbiB1c2luZyBzdGF0aWMKKyAgICAgIGxvYWQtYmFsYW5jaW5nIGF0IGNvbXBpbGUgdGltZS4gKi8KKyAgc3RydWN0IHVuYmFsYW5jZWRfdGFnIDogcHVibGljIHBhcmFsbGVsX3RhZyB7IH07CisKKyAgLyoqIEBicmllZiBSZWNvbW1lbmRzIHBhcmFsbGVsIGV4ZWN1dGlvbiB1c2luZyBPcGVuTVAgZHluYW1pYworICAgICAgbG9hZC1iYWxhbmNpbmcgYXQgY29tcGlsZSB0aW1lLiAqLworICBzdHJ1Y3Qgb21wX2xvb3BfdGFnIDogcHVibGljIHBhcmFsbGVsX3RhZyB7IH07CisKKyAgLyoqIEBicmllZiBSZWNvbW1lbmRzIHBhcmFsbGVsIGV4ZWN1dGlvbiB1c2luZyBPcGVuTVAgc3RhdGljCisgICAgICBsb2FkLWJhbGFuY2luZyBhdCBjb21waWxlIHRpbWUuICovCisgIHN0cnVjdCBvbXBfbG9vcF9zdGF0aWNfdGFnIDogcHVibGljIHBhcmFsbGVsX3RhZyB7IH07CisKKworICAvKiogQGJyaWVmIEJhc2UgY2xhc3MgZm9yIGZvciBzdGQ6OmZpbmQoKSB2YXJpYW50cy4gKi8KKyAgc3RydWN0IGZpbmRfdGFnIHsgfTsKKworCisgIC8qKiBAYnJpZWYgRm9yY2VzIHBhcmFsbGVsIG1lcmdpbmcKKyAgICogIHdpdGggZXhhY3Qgc3BsaXR0aW5nLCBhdCBjb21waWxlIHRpbWUuICovCisgIHN0cnVjdCBleGFjdF90YWcgOiBwdWJsaWMgcGFyYWxsZWxfdGFnCisgIHsKKyAgICBleGFjdF90YWcoKSB7IH0KKyAgICBleGFjdF90YWcoX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMpCisgICAgOiBwYXJhbGxlbF90YWcoX19udW1fdGhyZWFkcykgeyB9CisgIH07CisKKyAgLyoqIEBicmllZiBGb3JjZXMgcGFyYWxsZWwgbWVyZ2luZworICAgKiAgd2l0aCBleGFjdCBzcGxpdHRpbmcsIGF0IGNvbXBpbGUgdGltZS4gKi8KKyAgc3RydWN0IHNhbXBsaW5nX3RhZyA6IHB1YmxpYyBwYXJhbGxlbF90YWcKKyAgeworICAgIHNhbXBsaW5nX3RhZygpIHsgfQorICAgIHNhbXBsaW5nX3RhZyhfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcykKKyAgICA6IHBhcmFsbGVsX3RhZyhfX251bV90aHJlYWRzKSB7IH0KKyAgfTsKKworCisgIC8qKiBAYnJpZWYgRm9yY2VzIHBhcmFsbGVsIHNvcnRpbmcgdXNpbmcgbXVsdGl3YXkgbWVyZ2Vzb3J0CisgICAqICBhdCBjb21waWxlIHRpbWUuICovCisgIHN0cnVjdCBtdWx0aXdheV9tZXJnZXNvcnRfdGFnIDogcHVibGljIHBhcmFsbGVsX3RhZworICB7CisgICAgbXVsdGl3YXlfbWVyZ2Vzb3J0X3RhZygpIHsgfQorICAgIG11bHRpd2F5X21lcmdlc29ydF90YWcoX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMpCisgICAgOiBwYXJhbGxlbF90YWcoX19udW1fdGhyZWFkcykgeyB9CisgIH07CisKKyAgLyoqIEBicmllZiBGb3JjZXMgcGFyYWxsZWwgc29ydGluZyB1c2luZyBtdWx0aXdheSBtZXJnZXNvcnQKKyAgICogIHdpdGggZXhhY3Qgc3BsaXR0aW5nIGF0IGNvbXBpbGUgdGltZS4gKi8KKyAgc3RydWN0IG11bHRpd2F5X21lcmdlc29ydF9leGFjdF90YWcgOiBwdWJsaWMgcGFyYWxsZWxfdGFnCisgIHsKKyAgICBtdWx0aXdheV9tZXJnZXNvcnRfZXhhY3RfdGFnKCkgeyB9CisgICAgbXVsdGl3YXlfbWVyZ2Vzb3J0X2V4YWN0X3RhZyhfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcykKKyAgICA6IHBhcmFsbGVsX3RhZyhfX251bV90aHJlYWRzKSB7IH0KKyAgfTsKKworICAvKiogQGJyaWVmIEZvcmNlcyBwYXJhbGxlbCBzb3J0aW5nIHVzaW5nIG11bHRpd2F5IG1lcmdlc29ydAorICAgKiAgd2l0aCBzcGxpdHRpbmcgYnkgc2FtcGxpbmcgYXQgY29tcGlsZSB0aW1lLiAqLworICBzdHJ1Y3QgbXVsdGl3YXlfbWVyZ2Vzb3J0X3NhbXBsaW5nX3RhZyA6IHB1YmxpYyBwYXJhbGxlbF90YWcKKyAgeworICAgIG11bHRpd2F5X21lcmdlc29ydF9zYW1wbGluZ190YWcoKSB7IH0KKyAgICBtdWx0aXdheV9tZXJnZXNvcnRfc2FtcGxpbmdfdGFnKF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzKQorICAgIDogcGFyYWxsZWxfdGFnKF9fbnVtX3RocmVhZHMpIHsgfQorICB9OworCisgIC8qKiBAYnJpZWYgRm9yY2VzIHBhcmFsbGVsIHNvcnRpbmcgdXNpbmcgdW5iYWxhbmNlZCBxdWlja3NvcnQKKyAgICogIGF0IGNvbXBpbGUgdGltZS4gKi8KKyAgc3RydWN0IHF1aWNrc29ydF90YWcgOiBwdWJsaWMgcGFyYWxsZWxfdGFnCisgIHsKKyAgICBxdWlja3NvcnRfdGFnKCkgeyB9CisgICAgcXVpY2tzb3J0X3RhZyhfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcykKKyAgICA6IHBhcmFsbGVsX3RhZyhfX251bV90aHJlYWRzKSB7IH0KKyAgfTsKKworICAvKiogQGJyaWVmIEZvcmNlcyBwYXJhbGxlbCBzb3J0aW5nIHVzaW5nIGJhbGFuY2VkIHF1aWNrc29ydAorICAgKiAgYXQgY29tcGlsZSB0aW1lLiAqLworICBzdHJ1Y3QgYmFsYW5jZWRfcXVpY2tzb3J0X3RhZyA6IHB1YmxpYyBwYXJhbGxlbF90YWcKKyAgeworICAgIGJhbGFuY2VkX3F1aWNrc29ydF90YWcoKSB7IH0KKyAgICBiYWxhbmNlZF9xdWlja3NvcnRfdGFnKF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzKQorICAgIDogcGFyYWxsZWxfdGFnKF9fbnVtX3RocmVhZHMpIHsgfQorICB9OworCisKKyAgLyoqIEBicmllZiBTZWxlY3RzIHRoZSBncm93aW5nIGJsb2NrIHNpemUgdmFyaWFudCBmb3Igc3RkOjpmaW5kKCkuCisgICAgICBAc2VlIF9HTElCQ1hYX0ZJTkRfR1JPV0lOR19CTE9DS1MgKi8KKyAgc3RydWN0IGdyb3dpbmdfYmxvY2tzX3RhZyA6IHB1YmxpYyBmaW5kX3RhZyB7IH07CisKKyAgLyoqIEBicmllZiBTZWxlY3RzIHRoZSBjb25zdGFudCBibG9jayBzaXplIHZhcmlhbnQgZm9yIHN0ZDo6ZmluZCgpLgorICAgICAgQHNlZSBfR0xJQkNYWF9GSU5EX0NPTlNUQU5UX1NJWkVfQkxPQ0tTICovCisgIHN0cnVjdCBjb25zdGFudF9zaXplX2Jsb2Nrc190YWcgOiBwdWJsaWMgZmluZF90YWcgeyB9OworCisgIC8qKiBAYnJpZWYgU2VsZWN0cyB0aGUgZXF1YWwgc3BsaXR0aW5nIHZhcmlhbnQgZm9yIHN0ZDo6ZmluZCgpLgorICAgICAgQHNlZSBfR0xJQkNYWF9GSU5EX0VRVUFMX1NQTElUICovCisgIHN0cnVjdCBlcXVhbF9zcGxpdF90YWcgOiBwdWJsaWMgZmluZF90YWcgeyB9OworfQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfVEFHU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3R5cGVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5ZjNlYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvdHlwZXMuaApAQCAtMCwwICsxLDEzNyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL3R5cGVzLmgKKyAqICBAYnJpZWYgQmFzaWMgdHlwZXMgYW5kIHR5cGVkZWZzLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlciBhbmQgRmVsaXggUHV0emUuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfVFlQRVNfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9UWVBFU19IIDEKKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHRyMS9jc3RkaW50PgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLy8gRW51bWVyYXRlZCB0eXBlcy4KKworICAvLy8gUnVuLXRpbWUgZXF1aXZhbGVudHMgZm9yIHRoZSBjb21waWxlLXRpbWUgdGFncy4KKyAgZW51bSBfUGFyYWxsZWxpc20KKyAgICB7CisgICAgICAvLy8gTm90IHBhcmFsbGVsLgorICAgICAgc2VxdWVudGlhbCwKKworICAgICAgLy8vIFBhcmFsbGVsIHVuYmFsYW5jZWQgKGVxdWFsLXNpemVkIGNodW5rcykuCisgICAgICBwYXJhbGxlbF91bmJhbGFuY2VkLAorCisgICAgICAvLy8gUGFyYWxsZWwgYmFsYW5jZWQgKHdvcmstc3RlYWxpbmcpLgorICAgICAgcGFyYWxsZWxfYmFsYW5jZWQsCisKKyAgICAgIC8vLyBQYXJhbGxlbCB3aXRoIE9wZW5NUCBkeW5hbWljIGxvYWQtYmFsYW5jaW5nLgorICAgICAgcGFyYWxsZWxfb21wX2xvb3AsCisKKyAgICAgIC8vLyBQYXJhbGxlbCB3aXRoIE9wZW5NUCBzdGF0aWMgbG9hZC1iYWxhbmNpbmcuCisgICAgICBwYXJhbGxlbF9vbXBfbG9vcF9zdGF0aWMsCisKKyAgICAgIC8vLyBQYXJhbGxlbCB3aXRoIE9wZW5NUCB0YXNrcXVldWUgY29uc3RydWN0LgorICAgICAgcGFyYWxsZWxfdGFza3F1ZXVlCisgICAgfTsKKworICAvLy8gU3RyYXRlZ2llcyBmb3IgcnVuLXRpbWUgYWxnb3JpdGhtIHNlbGVjdGlvbjogCisgIC8vIGZvcmNlX3NlcXVlbnRpYWwsIGZvcmNlX3BhcmFsbGVsLCBoZXVyaXN0aWMuCisgIGVudW0gX0FsZ29yaXRobVN0cmF0ZWd5CisgICAgeworICAgICAgaGV1cmlzdGljLAorICAgICAgZm9yY2Vfc2VxdWVudGlhbCwKKyAgICAgIGZvcmNlX3BhcmFsbGVsCisgICAgfTsKKworICAvLy8gU29ydGluZyBhbGdvcml0aG1zOiAKKyAgLy8gbXVsdGktd2F5IG1lcmdlc29ydCwgcXVpY2tzb3J0LCBsb2FkLWJhbGFuY2VkIHF1aWNrc29ydC4KKyAgZW51bSBfU29ydEFsZ29yaXRobSAKKyAgICB7IAorICAgICAgTVdNUywgCisgICAgICBRUywgCisgICAgICBRU19CQUxBTkNFRCAKKyAgICB9OworCisgIC8vLyBNZXJnaW5nIGFsZ29yaXRobXM6IAorICAvLyBidWJibGVzb3J0LWFsaWtlLCBsb3Nlci10cmVlIHZhcmlhbnRzLCBlbnVtIF9fc2VudGluZWwuCisgIGVudW0gX011bHRpd2F5TWVyZ2VBbGdvcml0aG0KKyAgICB7CisgICAgICBMT1NFUl9UUkVFCisgICAgfTsKKworICAvLy8gUGFydGlhbCBzdW0gYWxnb3JpdGhtczogcmVjdXJzaXZlLCBsaW5lYXIuCisgIGVudW0gX1BhcnRpYWxTdW1BbGdvcml0aG0gCisgICAgeyAKKyAgICAgIFJFQ1VSU0lWRSwgCisgICAgICBMSU5FQVIgCisgICAgfTsKKworICAvLy8gU29ydGluZy9tZXJnaW5nIGFsZ29yaXRobXM6IHNhbXBsaW5nLCBfX2V4YWN0LgorICBlbnVtIF9TcGxpdHRpbmdBbGdvcml0aG0gCisgICAgeyAKKyAgICAgIFNBTVBMSU5HLCAKKyAgICAgIEVYQUNUIAorICAgIH07CisKKyAgLy8vIEZpbmQgYWxnb3JpdGhtczoKKyAgLy8gZ3Jvd2luZyBibG9ja3MsIGVxdWFsLXNpemVkIGJsb2NrcywgZXF1YWwgc3BsaXR0aW5nLgorICBlbnVtIF9GaW5kQWxnb3JpdGhtIAorICAgIHsgCisgICAgICBHUk9XSU5HX0JMT0NLUywgCisgICAgICBDT05TVEFOVF9TSVpFX0JMT0NLUywgCisgICAgICBFUVVBTF9TUExJVCAKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgVW5zaWduZWQgaW50ZWdlciB0byBpbmRleCBfX2VsZW1lbnRzLgorICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBlYWNoIGFsZ29yaXRobSBtdXN0IGZpdCBpbnRvIHRoaXMgdHlwZS4KKyAgICovCisgIHR5cGVkZWYgdWludDY0X3QgX1NlcXVlbmNlSW5kZXg7CisKKyAgLyoqCisgICAqIEBicmllZiBVbnNpZ25lZCBpbnRlZ2VyIHRvIGluZGV4IGEgdGhyZWFkIG51bWJlci4KKyAgICogVGhlIG1heGltdW0gdGhyZWFkIG51bWJlciAoZm9yIGVhY2ggcHJvY2Vzc29yKSBtdXN0IGZpdCBpbnRvIHRoaXMgdHlwZS4KKyAgICovCisgIHR5cGVkZWYgdWludDE2X3QgX1RocmVhZEluZGV4OworCisgIC8vIFhYWCBhdG9taWNzIGludGVyZmFjZT8KKyAgLy8vIExvbmdlc3QgY29tcGFyZS1hbmQtc3dhcHBhYmxlIGludGVnZXIgdHlwZSBvbiB0aGlzIHBsYXRmb3JtLgorICB0eXBlZGVmIGludDY0X3QgX0NBU2FibGU7CisKKyAgLy8vIE51bWJlciBvZiBiaXRzIG9mIF9DQVNhYmxlLgorICBzdGF0aWMgY29uc3QgaW50IF9DQVNhYmxlX2JpdHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9DQVNhYmxlPjo6ZGlnaXRzOworCisgIC8vLyA6Ol9DQVNhYmxlIHdpdGggdGhlIHJpZ2h0IGhhbGYgb2YgYml0cyBzZXQgdG8gMS4KKyAgc3RhdGljIGNvbnN0IF9DQVNhYmxlIF9DQVNhYmxlX21hc2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX0NBU2FibGUoMSkgPDwgKF9DQVNhYmxlX2JpdHMgLyAyKSkgLSAxKTsKK30KKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvdW5pcXVlX2NvcHkuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvdW5pcXVlX2NvcHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTIwYzM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC91bmlxdWVfY29weS5oCkBAIC0wLDAgKzEsMTk3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvdW5pcXVlX2NvcHkuaAorICogIEBicmllZiBQYXJhbGxlbCBpbXBsZW1lbnRhdGlvbnMgb2Ygc3RkOjp1bmlxdWVfY29weSgpLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgUm9iZXJ0IEdlaXNiZXJnZXIgYW5kIFJvYmluIERhcHAuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfVU5JUVVFX0NPUFlfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9VTklRVUVfQ09QWV9IIDEKKworI2luY2x1ZGUgPHBhcmFsbGVsL3BhcmFsbGVsLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvbXVsdGlzZXFfc2VsZWN0aW9uLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKiogQGJyaWVmIFBhcmFsbGVsIHN0ZDo6dW5pcXVlX2NvcHkoKSwgdy9fX28gZXhwbGljaXQgZXF1YWxpdHkgcHJlZGljYXRlLgorICAgICogIEBwYXJhbSBfX2ZpcnN0IEJlZ2luIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgICogIEBwYXJhbSBfX2xhc3QgRW5kIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgICogIEBwYXJhbSBfX3Jlc3VsdCBCZWdpbiBpdGVyYXRvciBvZiByZXN1bHQgX19zZXF1ZW5jZS4KKyAgICAqICBAcGFyYW0gX19iaW5hcnlfcHJlZCBFcXVhbGl0eSBwcmVkaWNhdGUuCisgICAgKiAgQHJldHVybiBFbmQgaXRlcmF0b3Igb2YgcmVzdWx0IF9fc2VxdWVuY2UuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwKKyAgICAgICAgICAgY2xhc3MgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fcGFyYWxsZWxfdW5pcXVlX2NvcHkoX0lJdGVyIF9fZmlyc3QsIF9JSXRlciBfX2xhc3QsCisJCQkgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisJCQkgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2xhc3QgLSBfX2ZpcnN0KQorCisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19zaXplID0gX19sYXN0IC0gX19maXJzdDsKKworICAgICAgaWYgKF9fc2l6ZSA9PSAwKQorCXJldHVybiBfX3Jlc3VsdDsKKworICAgICAgLy8gTGV0IHRoZSBmaXJzdCB0aHJlYWQgcHJvY2VzcyB0d28gcGFydHMuCisgICAgICBfRGlmZmVyZW5jZVR5cGUgKl9fY291bnRlcjsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSAqX19ib3JkZXJzOworCisgICAgICBfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcyA9IF9fZ2V0X21heF90aHJlYWRzKCk7CisgICAgICAvLyBGaXJzdCBwYXJ0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBlbGVtZW50LgorIyAgICAgcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyhfX251bV90aHJlYWRzKQorICAgICAgeworIyAgICAgICBwcmFnbWEgb21wIHNpbmdsZQorCXsKKwkgIF9fbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisJICBfX2JvcmRlcnMgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbnVtX3RocmVhZHMgKyAyXTsKKwkgIF9fZXF1YWxseV9zcGxpdChfX3NpemUsIF9fbnVtX3RocmVhZHMgKyAxLCBfX2JvcmRlcnMpOworCSAgX19jb3VudGVyID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX251bV90aHJlYWRzICsgMV07CisJfQorCisJX1RocmVhZEluZGV4IF9faWFtID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisKKwlfRGlmZmVyZW5jZVR5cGUgX19iZWdpbiwgX19lbmQ7CisKKwkvLyBDaGVjayBmb3IgbGVuZ3RoIHdpdGhvdXQgZHVwbGljYXRlcworCS8vIE5lZWRlZCBmb3IgcG9zaXRpb24gaW4gb3V0cHV0CisJX0RpZmZlcmVuY2VUeXBlIF9faSA9IDA7CisJX091dHB1dEl0ZXJhdG9yIF9fb3V0ID0gX19yZXN1bHQ7CisKKwlpZiAoX19pYW0gPT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfX2JlZ2luID0gX19ib3JkZXJzWzBdICsgMTsgICAvLyA9PSAxCisgICAgICAgICAgICBfX2VuZCA9IF9fYm9yZGVyc1tfX2lhbSArIDFdOworCisgICAgICAgICAgICArK19faTsKKyAgICAgICAgICAgICpfX291dCsrID0gKl9fZmlyc3Q7CisKKyAgICAgICAgICAgIGZvciAoX0lJdGVyIF9faXRlciA9IF9fZmlyc3QgKyBfX2JlZ2luOyBfX2l0ZXIgPCBfX2ZpcnN0ICsgX19lbmQ7CisJCSArK19faXRlcikKKyAgICAgICAgICAgICAgeworICAgICAgICAJaWYgKCFfX2JpbmFyeV9wcmVkKCpfX2l0ZXIsICooX19pdGVyIC0gMSkpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK19faTsKKyAgICAgICAgICAgICAgICAgICAgKl9fb3V0KysgPSAqX19pdGVyOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCWVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBfX2JlZ2luID0gX19ib3JkZXJzW19faWFtXTsgLy9vbmUgcGFydAorICAgICAgICAgICAgX19lbmQgPSBfX2JvcmRlcnNbX19pYW0gKyAxXTsKKworICAgICAgICAgICAgZm9yIChfSUl0ZXIgX19pdGVyID0gX19maXJzdCArIF9fYmVnaW47IF9faXRlciA8IF9fZmlyc3QgKyBfX2VuZDsKKwkJICsrX19pdGVyKQorICAgICAgICAgICAgICB7CisgICAgICAgIAlpZiAoIV9fYmluYXJ5X3ByZWQoKl9faXRlciwgKihfX2l0ZXIgLSAxKSkpCisgICAgICAgICAgICAgICAgICArK19faTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwlfX2NvdW50ZXJbX19pYW1dID0gX19pOworCisJLy8gTGFzdCBwYXJ0IHN0aWxsIHVudG91Y2hlZC4KKwlfRGlmZmVyZW5jZVR5cGUgX19iZWdpbl9vdXRwdXQ7CisKKyMgICAgICAgcHJhZ21hIG9tcCBiYXJyaWVyCisKKwkvLyBTdG9yZSByZXN1bHQgaW4gb3V0cHV0IG9uIGNhbGN1bGF0ZWQgcG9zaXRpb25zLgorCV9fYmVnaW5fb3V0cHV0ID0gMDsKKworCWlmIChfX2lhbSA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoX1RocmVhZEluZGV4IF9fdCA9IDA7IF9fdCA8IF9fbnVtX3RocmVhZHM7ICsrX190KQorICAgICAgICAgICAgICBfX2JlZ2luX291dHB1dCArPSBfX2NvdW50ZXJbX190XTsKKworICAgICAgICAgICAgX19pID0gMDsKKworICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9faXRlcl9vdXQgPSBfX3Jlc3VsdCArIF9fYmVnaW5fb3V0cHV0OworCisgICAgICAgICAgICBfX2JlZ2luID0gX19ib3JkZXJzW19fbnVtX3RocmVhZHNdOworICAgICAgICAgICAgX19lbmQgPSBfX3NpemU7CisKKyAgICAgICAgICAgIGZvciAoX0lJdGVyIF9faXRlciA9IF9fZmlyc3QgKyBfX2JlZ2luOyBfX2l0ZXIgPCBfX2ZpcnN0ICsgX19lbmQ7CisJCSArK19faXRlcikKKyAgICAgICAgICAgICAgeworICAgICAgICAJaWYgKF9faXRlciA9PSBfX2ZpcnN0CisJCSAgICB8fCAhX19iaW5hcnlfcHJlZCgqX19pdGVyLCAqKF9faXRlciAtIDEpKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytfX2k7CisgICAgICAgICAgICAgICAgICAgICpfX2l0ZXJfb3V0KysgPSAqX19pdGVyOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fY291bnRlcltfX251bV90aHJlYWRzXSA9IF9faTsKKyAgICAgICAgICB9CisJZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoX1RocmVhZEluZGV4IF9fdCA9IDA7IF9fdCA8IF9faWFtOyBfX3QrKykKKyAgICAgICAgICAgICAgX19iZWdpbl9vdXRwdXQgKz0gX19jb3VudGVyW19fdF07CisKKyAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX2l0ZXJfb3V0ID0gX19yZXN1bHQgKyBfX2JlZ2luX291dHB1dDsKKyAgICAgICAgICAgIGZvciAoX0lJdGVyIF9faXRlciA9IF9fZmlyc3QgKyBfX2JlZ2luOyBfX2l0ZXIgPCBfX2ZpcnN0ICsgX19lbmQ7CisJCSArK19faXRlcikKKyAgICAgICAgICAgICAgeworICAgICAgICAJaWYgKCFfX2JpbmFyeV9wcmVkKCpfX2l0ZXIsICooX19pdGVyIC0gMSkpKQorICAgICAgICAgICAgICAgICAgKl9faXRlcl9vdXQrKyA9ICpfX2l0ZXI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2VuZF9vdXRwdXQgPSAwOworICAgICAgZm9yIChfVGhyZWFkSW5kZXggX190ID0gMDsgX190IDwgX19udW1fdGhyZWFkcyArIDE7IF9fdCsrKQorCV9fZW5kX291dHB1dCArPSBfX2NvdW50ZXJbX190XTsKKworICAgICAgZGVsZXRlW10gX19ib3JkZXJzOworCisgICAgICByZXR1cm4gX19yZXN1bHQgKyBfX2VuZF9vdXRwdXQ7CisgICAgfQorCisgIC8qKiBAYnJpZWYgUGFyYWxsZWwgc3RkOjp1bmlxdWVfY29weSgpLCB3aXRob3V0IGV4cGxpY2l0IGVxdWFsaXR5IHByZWRpY2F0ZQorICAgICogIEBwYXJhbSBfX2ZpcnN0IEJlZ2luIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgICogIEBwYXJhbSBfX2xhc3QgRW5kIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgICogIEBwYXJhbSBfX3Jlc3VsdCBCZWdpbiBpdGVyYXRvciBvZiByZXN1bHQgX19zZXF1ZW5jZS4KKyAgICAqICBAcmV0dXJuIEVuZCBpdGVyYXRvciBvZiByZXN1bHQgX19zZXF1ZW5jZS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fcGFyYWxsZWxfdW5pcXVlX2NvcHkoX0lJdGVyIF9fZmlyc3QsIF9JSXRlciBfX2xhc3QsCisJCQkgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKyAgICAgIHJldHVybiBfX3BhcmFsbGVsX3VuaXF1ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsCisJCQkJICAgIHN0ZDo6ZXF1YWxfdG88X1ZhbHVlVHlwZT4oKSk7CisgICAgfQorCit9Ly9uYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX1VOSVFVRV9DT1BZX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvd29ya3N0ZWFsaW5nLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3dvcmtzdGVhbGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YWI5M2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3dvcmtzdGVhbGluZy5oCkBAIC0wLDAgKzEsMzEyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvd29ya3N0ZWFsaW5nLmgKKyAqICBAYnJpZWYgUGFyYWxsZWxpemF0aW9uIG9mIGVtYmFycmFzc2luZ2x5IHBhcmFsbGVsIGV4ZWN1dGlvbiBieQorICogIG1lYW5zIG9mIHdvcmstc3RlYWxpbmcuCisgKgorICogIFdvcmsgc3RlYWxpbmcgaXMgZGVzY3JpYmVkIGluCisgKgorICogIFIuIEQuIEJsdW1vZmUgYW5kIEMuIEUuIExlaXNlcnNvbi4KKyAqICBTY2hlZHVsaW5nIG11bHRpdGhyZWFkZWQgY29tcHV0YXRpb25zIGJ5IHdvcmsgc3RlYWxpbmcuCisgKiAgSm91cm5hbCBvZiB0aGUgQUNNLCA0Nig1KTo3MjDigJM3NDgsIDE5OTkuCisgKgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgRmVsaXggUHV0emUuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfV09SS1NURUFMSU5HX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfV09SS1NURUFMSU5HX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvcGFyYWxsZWwuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9yYW5kb21fbnVtYmVyLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvY29tcGF0aWJpbGl0eS5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKworI2RlZmluZSBfR0xJQkNYWF9KT0JfVk9MQVRJTEUgdm9sYXRpbGUKKworICAvKiogQGJyaWVmIE9uZSBfX2pvYiBmb3IgYSBjZXJ0YWluIHRocmVhZC4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0RpZmZlcmVuY2VUcD4KKyAgICBzdHJ1Y3QgX0pvYgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIC8qKiBAYnJpZWYgRmlyc3QgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgQ2hhbmdlZCBieSBvd25pbmcgYW5kIHN0ZWFsaW5nIHRocmVhZC4gQnkgc3RlYWxpbmcgdGhyZWFkLAorICAgICAgICogIGFsd2F5cyBpbmNyZW1lbnRlZC4gKi8KKyAgICAgIF9HTElCQ1hYX0pPQl9WT0xBVElMRSBfRGlmZmVyZW5jZVR5cGUgX01fZmlyc3Q7CisKKyAgICAgIC8qKiBAYnJpZWYgTGFzdCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBDaGFuZ2VkIGJ5IG93bmluZyB0aHJlYWQgb25seS4gKi8KKyAgICAgIF9HTElCQ1hYX0pPQl9WT0xBVElMRSBfRGlmZmVyZW5jZVR5cGUgX01fbGFzdDsKKworICAgICAgLyoqIEBicmllZiBOdW1iZXIgb2YgZWxlbWVudHMsIGkuZS4gQGMgX01fbGFzdC1fTV9maXJzdCsxLgorICAgICAgICoKKyAgICAgICAqICBDaGFuZ2VkIGJ5IG93bmluZyB0aHJlYWQgb25seS4gKi8KKyAgICAgIF9HTElCQ1hYX0pPQl9WT0xBVElMRSBfRGlmZmVyZW5jZVR5cGUgX01fbG9hZDsKKyAgICB9OworCisgIC8qKiBAYnJpZWYgV29yayBzdGVhbGluZyBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICAgICoKKyAgICAqICBVc2VzIE8oMSkgYWRkaXRpb25hbCBtZW1vcnkuIFN5bmNocm9uaXphdGlvbiBhdCBqb2IgbGlzdHMgaXMKKyAgICAqICBkb25lIHdpdGggYXRvbWljIG9wZXJhdGlvbnMuCisgICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgZWxlbWVudCBzZXF1ZW5jZS4KKyAgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIGVsZW1lbnQgc2VxdWVuY2UuCisgICAgKiAgQHBhcmFtIF9fb3AgVXNlci1zdXBwbGllZCBmdW5jdG9yIChjb21wYXJhdG9yLCBwcmVkaWNhdGUsIGFkZGluZworICAgICogIGZ1bmN0b3IsIC4uLikuCisgICAgKiAgQHBhcmFtIF9fZiBGdW5jdG9yIHRvIEBhIHByb2Nlc3MgYW4gZWxlbWVudCB3aXRoIF9fb3AgKGRlcGVuZHMgb24KKyAgICAqICBkZXNpcmVkIGZ1bmN0aW9uYWxpdHksIGUuIGcuIGZvciBzdGQ6OmZvcl9lYWNoKCksIC4uLikuCisgICAgKiAgQHBhcmFtIF9fciBGdW5jdG9yIHRvIEBhIGFkZCBhIHNpbmdsZSBfX3Jlc3VsdCB0byB0aGUgYWxyZWFkeQorICAgICogIHByb2Nlc3NlZCBlbGVtZW50cyAoZGVwZW5kcyBvbiBmdW5jdGlvbmFsaXR5KS4KKyAgICAqICBAcGFyYW0gX19iYXNlIEJhc2UgdmFsdWUgZm9yIHJlZHVjdGlvbi4KKyAgICAqICBAcGFyYW0gX19vdXRwdXQgUG9pbnRlciB0byBwb3NpdGlvbiB3aGVyZSBmaW5hbCByZXN1bHQgaXMgd3JpdHRlbiB0bworICAgICogIEBwYXJhbSBfX2JvdW5kIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHByb2Nlc3NlZCAoZS4gZy4gZm9yCisgICAgKiAgc3RkOjpjb3VudF9uKCkpLgorICAgICogIEByZXR1cm4gVXNlci1zdXBwbGllZCBmdW5jdG9yICh0aGF0IG1heSBjb250YWluIGEgcGFydCBvZiB0aGUgcmVzdWx0KS4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3AsCisgICAgICAgICAgIHR5cGVuYW1lIF9GdSwKKyAgICAgICAgICAgdHlwZW5hbWUgX1JlZCwKKyAgICAgICAgICAgdHlwZW5hbWUgX1Jlc3VsdD4KKyAgICBfT3AKKyAgICBfX2Zvcl9lYWNoX3RlbXBsYXRlX3JhbmRvbV9hY2Nlc3Nfd29ya3N0ZWFsaW5nKF9SQUl0ZXIgX19iZWdpbiwKKwkJCQkJCSAgIF9SQUl0ZXIgX19lbmQsIF9PcCBfX29wLAorCQkJCQkJICAgX0Z1JiBfX2YsIF9SZWQgX19yLAorCQkJCQkJICAgX1Jlc3VsdCBfX2Jhc2UsCisJCQkJCQkgICBfUmVzdWx0JiBfX291dHB1dCwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUgX19ib3VuZCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fZW5kIC0gX19iZWdpbikKKworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIGNvbnN0IF9TZXR0aW5ncyYgX19zID0gX1NldHRpbmdzOjpnZXQoKTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fY2h1bmtfc2l6ZSA9CisgICAgICAgICAgc3RhdGljX2Nhc3Q8X0RpZmZlcmVuY2VUeXBlPihfX3Mud29ya3N0ZWFsaW5nX2NodW5rX3NpemUpOworCisgICAgICAvLyBIb3cgbWFueSBqb2JzPworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbGVuZ3RoID0gKF9fYm91bmQgPCAwKSA/IChfX2VuZCAtIF9fYmVnaW4pIDogX19ib3VuZDsKKworICAgICAgLy8gVG8gYXZvaWQgZmFsc2Ugc2hhcmluZyBpbiBhIGNhY2hlIGxpbmUuCisgICAgICBjb25zdCBpbnQgX19zdHJpZGUgPSAoX19zLmNhY2hlX2xpbmVfc2l6ZSAqIDEwCisJCQkgICAgLyBzaXplb2YoX0pvYjxfRGlmZmVyZW5jZVR5cGU+KSArIDEpOworCisgICAgICAvLyBUb3RhbCBudW1iZXIgb2YgdGhyZWFkcyBjdXJyZW50bHkgd29ya2luZy4KKyAgICAgIF9UaHJlYWRJbmRleCBfX2J1c3kgPSAwOworCisgICAgICBfSm9iPF9EaWZmZXJlbmNlVHlwZT4gKl9fam9iOworCisgICAgICBvbXBfbG9ja190IF9fb3V0cHV0X2xvY2s7CisgICAgICBvbXBfaW5pdF9sb2NrKCZfX291dHB1dF9sb2NrKTsKKworICAgICAgLy8gV3JpdGUgYmFzZSB2YWx1ZSB0byBvdXRwdXQuCisgICAgICBfX291dHB1dCA9IF9fYmFzZTsKKworICAgICAgLy8gTm8gbW9yZSB0aHJlYWRzIHRoYW4gam9icywgYXQgbGVhc3Qgb25lIHRocmVhZC4KKyAgICAgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzID0gX19nbnVfcGFyYWxsZWw6Om1heDxfVGhyZWFkSW5kZXg+CisJKDEsIF9fZ251X3BhcmFsbGVsOjptaW48X0RpZmZlcmVuY2VUeXBlPihfX2xlbmd0aCwKKwkJCQkJCSBfX2dldF9tYXhfdGhyZWFkcygpKSk7CisKKyMgICAgIHByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKF9fYnVzeSkgbnVtX3RocmVhZHMoX19udW1fdGhyZWFkcykKKyAgICAgIHsKKyMgICAgICAgcHJhZ21hIG9tcCBzaW5nbGUKKwl7CisJICBfX251bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworCisJICAvLyBDcmVhdGUgam9iIGRlc2NyaXB0aW9uIGFycmF5LgorCSAgX19qb2IgPSBuZXcgX0pvYjxfRGlmZmVyZW5jZVR5cGU+W19fbnVtX3RocmVhZHMgKiBfX3N0cmlkZV07CisJfQorCisJLy8gSW5pdGlhbGl6YXRpb24gcGhhc2UuCisKKwkvLyBGbGFncyBmb3IgZXZlcnkgdGhyZWFkIGlmIGl0IGlzIGRvaW5nIHByb2R1Y3RpdmUgd29yay4KKwlib29sIF9faWFtX3dvcmtpbmcgPSBmYWxzZTsKKworCS8vIFRocmVhZCBpZC4KKwlfVGhyZWFkSW5kZXggX19pYW0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKworCS8vIFRoaXMgam9iLgorCV9Kb2I8X0RpZmZlcmVuY2VUeXBlPiYgX19teV9qb2IgPSBfX2pvYltfX2lhbSAqIF9fc3RyaWRlXTsKKworCS8vIFJhbmRvbSBudW1iZXIgKGZvciB3b3JrIHN0ZWFsaW5nKS4KKwlfVGhyZWFkSW5kZXggX192aWN0aW07CisKKwkvLyBMb2NhbCB2YWx1ZSBmb3IgcmVkdWN0aW9uLgorCV9SZXN1bHQgX19yZXN1bHQgPSBfUmVzdWx0KCk7CisKKwkvLyBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc3RlYWwgaW4gb25lIGF0dGVtcHQuCisJX0RpZmZlcmVuY2VUeXBlIF9fc3RlYWw7CisKKwkvLyBFdmVyeSB0aHJlYWQgaGFzIGl0cyBvd24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKwkvLyAobW9kdWxvIF9fbnVtX3RocmVhZHMpLgorCV9SYW5kb21OdW1iZXIgX19yYW5kX2dlbihfX2lhbSwgX19udW1fdGhyZWFkcyk7CisKKwkvLyBUaGlzIHRocmVhZCBpcyBjdXJyZW50bHkgd29ya2luZy4KKyMgICAgICAgcHJhZ21hIG9tcCBhdG9taWMKKwkrK19fYnVzeTsKKworCV9faWFtX3dvcmtpbmcgPSB0cnVlOworCisJLy8gSG93IG1hbnkgam9icyBwZXIgdGhyZWFkPyBsYXN0IHRocmVhZCBnZXRzIHRoZSByZXN0LgorCV9fbXlfam9iLl9NX2ZpcnN0ID0gc3RhdGljX2Nhc3Q8X0RpZmZlcmVuY2VUeXBlPgorCSAgKF9faWFtICogKF9fbGVuZ3RoIC8gX19udW1fdGhyZWFkcykpOworCisJX19teV9qb2IuX01fbGFzdCA9IChfX2lhbSA9PSAoX19udW1fdGhyZWFkcyAtIDEpCisJCQkgICAgPyAoX19sZW5ndGggLSAxKQorCQkJICAgIDogKChfX2lhbSArIDEpICogKF9fbGVuZ3RoIC8gX19udW1fdGhyZWFkcykgLSAxKSk7CisJX19teV9qb2IuX01fbG9hZCA9IF9fbXlfam9iLl9NX2xhc3QgLSBfX215X2pvYi5fTV9maXJzdCArIDE7CisKKwkvLyBJbml0IHJlc3VsdCB3aXRoIF9NX2ZpcnN0IHZhbHVlICh0byBoYXZlIGEgYmFzZSB2YWx1ZSBmb3IgcmVkdWN0aW9uKQorCWlmIChfX215X2pvYi5fTV9maXJzdCA8PSBfX215X2pvYi5fTV9sYXN0KQorCSAgeworCSAgICAvLyBDYW5ub3QgdXNlIHZvbGF0aWxlIHZhcmlhYmxlIGRpcmVjdGx5LgorCSAgICBfRGlmZmVyZW5jZVR5cGUgX19teV9maXJzdCA9IF9fbXlfam9iLl9NX2ZpcnN0OworCSAgICBfX3Jlc3VsdCA9IF9fZihfX29wLCBfX2JlZ2luICsgX19teV9maXJzdCk7CisJICAgICsrX19teV9qb2IuX01fZmlyc3Q7CisJICAgIC0tX19teV9qb2IuX01fbG9hZDsKKwkgIH0KKworCV9SQUl0ZXIgX19jdXJyZW50OworCisjICAgICAgIHByYWdtYSBvbXAgYmFycmllcgorCisJLy8gQWN0dWFsIHdvcmsgcGhhc2UKKwkvLyBXb3JrIG9uIG93biBvciBzdG9sZW4gY3VycmVudCBzdGFydAorCXdoaWxlIChfX2J1c3kgPiAwKQorCSAgeworCSAgICAvLyBXb3JrIHVudGlsIG5vIHByb2R1Y3RpdmUgdGhyZWFkIGxlZnQuCisjICAgICAgICAgICBwcmFnbWEgb21wIGZsdXNoKF9fYnVzeSkKKworCSAgICAvLyBUaHJlYWQgaGFzIG93biB3b3JrIHRvIGRvCisJICAgIHdoaWxlIChfX215X2pvYi5fTV9maXJzdCA8PSBfX215X2pvYi5fTV9sYXN0KQorCSAgICAgIHsKKwkJLy8gZmV0Y2gtYW5kLWFkZCBjYWxsCisJCS8vIFJlc2VydmUgY3VycmVudCBqb2IgYmxvY2sgKHNpemUgX19jaHVua19zaXplKSBpbiBteSBxdWV1ZS4KKwkJX0RpZmZlcmVuY2VUeXBlIF9fY3VycmVudF9qb2IgPQorCQkgIF9fZmV0Y2hfYW5kX2FkZDxfRGlmZmVyZW5jZVR5cGU+KCYoX19teV9qb2IuX01fZmlyc3QpLAorCQkJCQkJICAgX19jaHVua19zaXplKTsKKworCQkvLyBVcGRhdGUgX01fbG9hZCwgdG8gbWFrZSB0aGUgdGhyZWUgdmFsdWVzIGNvbnNpc3RlbnQsCisJCS8vIF9NX2ZpcnN0IG1pZ2h0IGhhdmUgYmVlbiBjaGFuZ2VkIGluIHRoZSBtZWFudGltZQorCQlfX215X2pvYi5fTV9sb2FkID0gX19teV9qb2IuX01fbGFzdCAtIF9fbXlfam9iLl9NX2ZpcnN0ICsgMTsKKwkJZm9yIChfRGlmZmVyZW5jZVR5cGUgX19qb2JfY291bnRlciA9IDA7CisJCSAgICAgX19qb2JfY291bnRlciA8IF9fY2h1bmtfc2l6ZQorCQkgICAgICAgJiYgX19jdXJyZW50X2pvYiA8PSBfX215X2pvYi5fTV9sYXN0OworCQkgICAgICsrX19qb2JfY291bnRlcikKKwkJICB7CisJCSAgICAvLyBZZXM6IHByb2Nlc3MgaXQhCisJCSAgICBfX2N1cnJlbnQgPSBfX2JlZ2luICsgX19jdXJyZW50X2pvYjsKKwkJICAgICsrX19jdXJyZW50X2pvYjsKKworCQkgICAgLy8gRG8gYWN0dWFsIHdvcmsuCisJCSAgICBfX3Jlc3VsdCA9IF9fcihfX3Jlc3VsdCwgX19mKF9fb3AsIF9fY3VycmVudCkpOworCQkgIH0KKworIyAgICAgICAgICAgICAgIHByYWdtYSBvbXAgZmx1c2goX19idXN5KQorCSAgICAgIH0KKworCSAgICAvLyBBZnRlciByZWFjaGluZyB0aGlzIHBvaW50LCBhIHRocmVhZCdzIF9fam9iIGxpc3QgaXMgZW1wdHkuCisJICAgIGlmIChfX2lhbV93b3JraW5nKQorCSAgICAgIHsKKwkJLy8gVGhpcyB0aHJlYWQgbm8gbG9uZ2VyIGhhcyB3b3JrLgorIyAgICAgICAgICAgICAgIHByYWdtYSBvbXAgYXRvbWljCisJCS0tX19idXN5OworCisJCV9faWFtX3dvcmtpbmcgPSBmYWxzZTsKKwkgICAgICB9CisKKwkgICAgX0RpZmZlcmVuY2VUeXBlIF9fc3VwcG9zZWRfZmlyc3QsIF9fc3VwcG9zZWRfbGFzdCwKKwkgICAgICAgICAgICAgICAgICAgIF9fc3VwcG9zZWRfbG9hZDsKKwkgICAgZG8KKwkgICAgICB7CisJCS8vIEZpbmQgcmFuZG9tIG5vbmVtcHR5IGRlcXVlIChub3Qgb3duKSwgZG8gY29uc2lzdGVuY3kgY2hlY2suCisJCV9feWllbGQoKTsKKyMgICAgICAgICAgICAgICBwcmFnbWEgb21wIGZsdXNoKF9fYnVzeSkKKwkJX192aWN0aW0gPSBfX3JhbmRfZ2VuKCk7CisJCV9fc3VwcG9zZWRfZmlyc3QgPSBfX2pvYltfX3ZpY3RpbSAqIF9fc3RyaWRlXS5fTV9maXJzdDsKKwkJX19zdXBwb3NlZF9sYXN0ID0gX19qb2JbX192aWN0aW0gKiBfX3N0cmlkZV0uX01fbGFzdDsKKwkJX19zdXBwb3NlZF9sb2FkID0gX19qb2JbX192aWN0aW0gKiBfX3N0cmlkZV0uX01fbG9hZDsKKwkgICAgICB9CisJICAgIHdoaWxlIChfX2J1c3kgPiAwCisJCSAgICYmICgoX19zdXBwb3NlZF9sb2FkIDw9IDApCisJCSAgICAgICB8fCAoKF9fc3VwcG9zZWRfZmlyc3QgKyBfX3N1cHBvc2VkX2xvYWQgLSAxKQorCQkJICAgIT0gX19zdXBwb3NlZF9sYXN0KSkpOworCisJICAgIGlmIChfX2J1c3kgPT0gMCkKKwkgICAgICBicmVhazsKKworCSAgICBpZiAoX19zdXBwb3NlZF9sb2FkID4gMCkKKwkgICAgICB7CisJCS8vIEhhcyB3b3JrIGFuZCB3b3JrIHRvIGRvLgorCQkvLyBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc3RlYWwgKGF0IGxlYXN0IG9uZSkuCisJCV9fc3RlYWwgPSAoX19zdXBwb3NlZF9sb2FkIDwgMikgPyAxIDogX19zdXBwb3NlZF9sb2FkIC8gMjsKKworCQkvLyBQdXNoIF9fdmljdGltJ3MgY3VycmVudCBzdGFydCBmb3J3YXJkLgorCQlfRGlmZmVyZW5jZVR5cGUgX19zdG9sZW5fZmlyc3QgPQorCQkgIF9fZmV0Y2hfYW5kX2FkZDxfRGlmZmVyZW5jZVR5cGU+CisJCSAgKCYoX19qb2JbX192aWN0aW0gKiBfX3N0cmlkZV0uX01fZmlyc3QpLCBfX3N0ZWFsKTsKKwkJX0RpZmZlcmVuY2VUeXBlIF9fc3RvbGVuX3RyeSA9IChfX3N0b2xlbl9maXJzdCArIF9fc3RlYWwKKwkJCQkJCS0gX0RpZmZlcmVuY2VUeXBlKDEpKTsKKworCQlfX215X2pvYi5fTV9maXJzdCA9IF9fc3RvbGVuX2ZpcnN0OworCQlfX215X2pvYi5fTV9sYXN0ID0gX19nbnVfcGFyYWxsZWw6Om1pbihfX3N0b2xlbl90cnksCisJCQkJCQkgICAgICAgX19zdXBwb3NlZF9sYXN0KTsKKwkJX19teV9qb2IuX01fbG9hZCA9IF9fbXlfam9iLl9NX2xhc3QgLSBfX215X2pvYi5fTV9maXJzdCArIDE7CisKKwkJLy8gSGFzIHBvdGVudGlhbCB3b3JrIGFnYWluLgorIyAgICAgICAgICAgICAgIHByYWdtYSBvbXAgYXRvbWljCisJCSsrX19idXN5OworCQlfX2lhbV93b3JraW5nID0gdHJ1ZTsKKworIyAgICAgICAgICAgICAgIHByYWdtYSBvbXAgZmx1c2goX19idXN5KQorCSAgICAgIH0KKyMgICAgICAgICAgIHByYWdtYSBvbXAgZmx1c2goX19idXN5KQorCSAgfSAvLyBlbmQgd2hpbGUgX19idXN5ID4gMAorCS8vIEFkZCBhY2N1bXVsYXRlZCByZXN1bHQgdG8gb3V0cHV0LgorCW9tcF9zZXRfbG9jaygmX19vdXRwdXRfbG9jayk7CisJX19vdXRwdXQgPSBfX3IoX19vdXRwdXQsIF9fcmVzdWx0KTsKKwlvbXBfdW5zZXRfbG9jaygmX19vdXRwdXRfbG9jayk7CisgICAgICB9CisKKyAgICAgIGRlbGV0ZVtdIF9fam9iOworCisgICAgICAvLyBQb2ludHMgdG8gbGFzdCBlbGVtZW50IHByb2Nlc3NlZCAobmVlZGVkIGFzIHJldHVybiB2YWx1ZSBmb3IKKyAgICAgIC8vIHNvbWUgYWxnb3JpdGhtcyBsaWtlIHRyYW5zZm9ybSkKKyAgICAgIF9fZi5fTV9maW5pc2hfaXRlcmF0b3IgPSBfX2JlZ2luICsgX19sZW5ndGg7CisKKyAgICAgIG9tcF9kZXN0cm95X2xvY2soJl9fb3V0cHV0X2xvY2spOworCisgICAgICByZXR1cm4gX19vcDsKKyAgICB9Cit9IC8vIGVuZCBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX1dPUktTVEVBTElOR19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvYXJyYXkgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvYXJyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2ZGE2YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9hcnJheQpAQCAtMCwwICsxLDI2NyBAQAorLy8gUHJvZmlsZSBhcnJheSBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9hcnJheQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX0FSUkFZCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfQVJSQVkgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcHJvZmlsZQoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBzdHJ1Y3QgYXJyYXkKKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCAJICAgIAkJCSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUqCQkJICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgIAkgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgIAkgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCAgICAgICAgICAgICAgICAgICAgCSAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgCSAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPgkgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gU3VwcG9ydCBmb3IgemVyby1zaXplZCBhcnJheXMgbWFuZGF0b3J5LgorICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6X19hcnJheV90cmFpdHM8X1RwLCBfTm0+IF9BVF9UeXBlOworICAgICAgdHlwZW5hbWUgX0FUX1R5cGU6Ol9UeXBlICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2VsZW1zOworCisgICAgICAvLyBObyBleHBsaWNpdCBjb25zdHJ1Y3QvY29weS9kZXN0cm95IGZvciBhZ2dyZWdhdGUgdHlwZS4KKworICAgICAgLy8gRFIgNzc2LgorICAgICAgdm9pZAorICAgICAgZmlsbChjb25zdCB2YWx1ZV90eXBlJiBfX3UpCisgICAgICB7IHN0ZDo6ZmlsbF9uKGJlZ2luKCksIHNpemUoKSwgX191KTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGFycmF5JiBfX290aGVyKQorICAgICAgbm9leGNlcHQobm9leGNlcHQoc3dhcChzdGQ6OmRlY2x2YWw8X1RwJj4oKSwgc3RkOjpkZWNsdmFsPF9UcCY+KCkpKSkKKyAgICAgIHsgc3RkOjpzd2FwX3JhbmdlcyhiZWdpbigpLCBlbmQoKSwgX19vdGhlci5iZWdpbigpKTsgfQorCisgICAgICAvLyBJdGVyYXRvcnMuCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoZGF0YSgpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKGRhdGEoKSArIF9ObSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihkYXRhKCkgKyBfTm0pOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IgCisgICAgICByYmVnaW4oKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIHJiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmVuZCgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgCisgICAgICByZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihkYXRhKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGRhdGEoKSArIF9ObSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIGNyZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgLy8gQ2FwYWNpdHkuCisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIAorICAgICAgc2l6ZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIF9ObTsgfQorCisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlIAorICAgICAgbWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBfTm07IH0KKworICAgICAgY29uc3RleHByIGJvb2wgCisgICAgICBlbXB0eSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisKKyAgICAgIC8vIEVsZW1lbnQgYWNjZXNzLgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCisgICAgICB7CXJldHVybiBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCBfX24pOyB9CisKKyAgICAgIGNvbnN0ZXhwciBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIF9fbik7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBhdChzaXplX3R5cGUgX19uKQorICAgICAgeworCWlmIChfX24gPj0gX05tKQorCSAgc3RkOjpfX3Rocm93X291dF9vZl9yYW5nZShfX04oImFycmF5OjphdCIpKTsKKwlyZXR1cm4gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgX19uKTsKKyAgICAgIH0KKworICAgICAgY29uc3RleHByIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwkvLyBSZXN1bHQgb2YgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBtdXN0IGJlIGFuIGx2YWx1ZSBzbyB1c2UKKwkvLyBib29sZWFuID8gbHZhbHVlIDogKHRocm93LWV4cHIsIGx2YWx1ZSkKKwlyZXR1cm4gX19uIDwgX05tID8gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgX19uKQorCSAgOiAoc3RkOjpfX3Rocm93X291dF9vZl9yYW5nZShfX04oImFycmF5OjphdCIpKSwKKwkgICAgIF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIDApKTsKKyAgICAgIH0KKworICAgICAgcmVmZXJlbmNlIAorICAgICAgZnJvbnQoKQorICAgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KKworICAgICAgY29uc3RleHByIGNvbnN0X3JlZmVyZW5jZSAKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIDApOyB9CisKKyAgICAgIHJlZmVyZW5jZSAKKyAgICAgIGJhY2soKQorICAgICAgeyByZXR1cm4gX05tID8gKihlbmQoKSAtIDEpIDogKmVuZCgpOyB9CisKKyAgICAgIGNvbnN0ZXhwciBjb25zdF9yZWZlcmVuY2UgCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX05tID8gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgX05tIC0gMSkKKyAJICAgICAgICAgICA6IF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIDApOwkgIAorICAgICAgfQorCisgICAgICBwb2ludGVyCisgICAgICBkYXRhKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgMCkpOyB9CisKKyAgICAgIGNvbnN0X3BvaW50ZXIKKyAgICAgIGRhdGEoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCAwKSk7IH0KKyAgICB9OworCisgIC8vIEFycmF5IGNvbXBhcmlzb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbCAKKyAgICBvcGVyYXRvcj09KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gc3RkOjplcXVhbChfX29uZS5iZWdpbigpLCBfX29uZS5lbmQoKSwgX190d28uYmVnaW4oKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiAhKF9fb25lID09IF9fdHdvKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19hLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fYikKKyAgICB7IAorICAgICAgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX19hLmJlZ2luKCksIF9fYS5lbmQoKSwKKwkJCQkJICBfX2IuYmVnaW4oKSwgX19iLmVuZCgpKTsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gX190d28gPCBfX29uZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuICEoX19vbmUgPiBfX3R3byk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiAhKF9fb25lIDwgX190d28pOyB9CisKKyAgLy8gU3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgbm9leGNlcHQobm9leGNlcHQoX19vbmUuc3dhcChfX3R3bykpKQorICAgIHsgX19vbmUuc3dhcChfX3R3byk7IH0KKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW50LCB0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBjb25zdGV4cHIgX1RwJgorICAgIGdldChhcnJheTxfVHAsIF9ObT4mIF9fYXJyKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX0ludCA8IF9ObSwgImluZGV4IGlzIG91dCBvZiBib3VuZHMiKTsKKyAgICAgIHJldHVybiBfR0xJQkNYWF9TVERfQzo6X19hcnJheV90cmFpdHM8X1RwLCBfTm0+OjoKKwlfU19yZWYoX19hcnIuX01fZWxlbXMsIF9JbnQpOworICAgIH0KKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW50LCB0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBjb25zdGV4cHIgX1RwJiYKKyAgICBnZXQoYXJyYXk8X1RwLCBfTm0+JiYgX19hcnIpIG5vZXhjZXB0CisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChfSW50IDwgX05tLCAiaW5kZXggaXMgb3V0IG9mIGJvdW5kcyIpOworICAgICAgcmV0dXJuIHN0ZDo6bW92ZShnZXQ8X0ludD4oX19hcnIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgY29uc3RleHByIGNvbnN0IF9UcCYKKyAgICBnZXQoY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX2Fycikgbm9leGNlcHQKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9JbnQgPCBfTm0sICJpbmRleCBpcyBvdXQgb2YgYm91bmRzIik7CisgICAgICByZXR1cm4gX0dMSUJDWFhfU1REX0M6Ol9fYXJyYXlfdHJhaXRzPF9UcCwgX05tPjo6CisJX1NfcmVmKF9fYXJyLl9NX2VsZW1zLCBfSW50KTsKKyAgICB9Cit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKKworICAvLyBUdXBsZSBpbnRlcmZhY2UgdG8gY2xhc3MgdGVtcGxhdGUgYXJyYXkuCisKKyAgLy8vIHR1cGxlX3NpemUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IHR1cGxlX3NpemU8X19wcm9maWxlOjphcnJheTxfVHAsIF9ObT4+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIF9ObT4geyB9OworCisgIC8vLyB0dXBsZV9lbGVtZW50CisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PF9JbnQsIF9fcHJvZmlsZTo6YXJyYXk8X1RwLCBfTm0+PgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX0ludCA8IF9ObSwgImluZGV4IGlzIG91dCBvZiBib3VuZHMiKTsKKyAgICAgIHR5cGVkZWYgX1RwIHR5cGU7CisgICAgfTsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0dMSUJDWFhfUFJPRklMRV9BUlJBWQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2Jhc2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzN2YwNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9iYXNlLmgKQEAgLTAsMCArMSw1OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9iYXNlLmgKKyAqICBAYnJpZWYgU2VxdWVudGlhbCBoZWxwZXIgZnVuY3Rpb25zLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwcm9maWxlIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBMaXhpYSBMaXUKKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX0JBU0VfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX0JBU0VfSCAxCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHByb2ZpbGUvaW1wbC9wcm9maWxlci5oPgorCisvLyBQcm9maWxpbmcgbW9kZSBuYW1lc3BhY2VzLgorCisvKioKKyAqIEBuYW1lc3BhY2Ugc3RkOjpfX3Byb2ZpbGUKKyAqIEBicmllZiBHTlUgcHJvZmlsZSBjb2RlLCByZXBsYWNlcyBzdGFuZGFyZCBiZWhhdmlvciB3aXRoIHByb2ZpbGUgYmVoYXZpb3IuCisgKi8KK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KSAKK3sgCisgIG5hbWVzcGFjZSBfX3Byb2ZpbGUgeyB9IAorfQorCisvKioKKyAqIEBuYW1lc3BhY2UgX19nbnVfcHJvZmlsZQorICogQGJyaWVmIEdOVSBwcm9maWxlIGNvZGUgZm9yIHB1YmxpYyB1c2UuCisgKi8KK25hbWVzcGFjZSBfX2dudV9wcm9maWxlCit7CisgIC8vIEltcG9ydCBhbGwgdGhlIHByb2ZpbGUgdmVyc2lvbnMgb2YgY29tcG9uZW50cyBpbiBuYW1lc3BhY2Ugc3RkLgorICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpfX3Byb2ZpbGU7Cit9CisKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BST0ZJTEVfQkFTRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvYml0c2V0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2JpdHNldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTY1MGIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2JpdHNldApAQCAtMCwwICsxLDM4MiBAQAorLy8gUHJvZmlsaW5nIGJpdHNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9iaXRzZXQKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9CSVRTRVQKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9CSVRTRVQKKworI2luY2x1ZGUgPGJpdHNldD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19wcm9maWxlCit7CisgIC8vLyBDbGFzcyBzdGQ6OmJpdHNldCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIGNsYXNzIGJpdHNldAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjpiaXRzZXQ8X05iPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OmJpdHNldDxfTmI+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgLy8gYml0IHJlZmVyZW5jZToKKyAgICAgIGNsYXNzIHJlZmVyZW5jZQorICAgICAgOiBwcml2YXRlIF9CYXNlOjpyZWZlcmVuY2UKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgX0Jhc2VfcmVmOworCisJZnJpZW5kIGNsYXNzIGJpdHNldDsKKwlyZWZlcmVuY2UoKTsKKworCXJlZmVyZW5jZShjb25zdCBfQmFzZV9yZWYmIF9fYmFzZSwgYml0c2V0KiBfX3NlcSkgX0dMSUJDWFhfTk9FWENFUFQKKwk6IF9CYXNlX3JlZihfX2Jhc2UpCisJeyB9CisKKyAgICAgIHB1YmxpYzoKKwlyZWZlcmVuY2UoY29uc3QgcmVmZXJlbmNlJiBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisJOiBfQmFzZV9yZWYoX194KQorCXsgfQorCisJcmVmZXJlbmNlJgorCW9wZXJhdG9yPShib29sIF9feCkgX0dMSUJDWFhfTk9FWENFUFQKKwl7CisJICAqc3RhdGljX2Nhc3Q8X0Jhc2VfcmVmKj4odGhpcykgPSBfX3g7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJcmVmZXJlbmNlJgorCW9wZXJhdG9yPShjb25zdCByZWZlcmVuY2UmIF9feCkgX0dMSUJDWFhfTk9FWENFUFQKKwl7CisJICAqc3RhdGljX2Nhc3Q8X0Jhc2VfcmVmKj4odGhpcykgPSBfX3g7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJYm9vbAorCW9wZXJhdG9yfigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisJeworCSAgcmV0dXJuIH4oKnN0YXRpY19jYXN0PGNvbnN0IF9CYXNlX3JlZio+KHRoaXMpKTsKKwl9CisKKwlvcGVyYXRvciBib29sKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKwl7CisJICByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9CYXNlX3JlZio+KHRoaXMpOworCX0KKworCXJlZmVyZW5jZSYKKwlmbGlwKCkgX0dMSUJDWFhfTk9FWENFUFQKKwl7CisJICBfQmFzZV9yZWY6OmZsaXAoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisgICAgICB9OworCisgICAgICAvLyAyMy4zLjUuMSBjb25zdHJ1Y3RvcnM6CisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgYml0c2V0KCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIDogX0Jhc2UoKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0ZXhwciBiaXRzZXQodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKSBub2V4Y2VwdAorI2Vsc2UKKyAgICAgIGJpdHNldCh1bnNpZ25lZCBsb25nIF9fdmFsKQorI2VuZGlmCisgICAgICA6IF9CYXNlKF9fdmFsKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIGJpdHNldChjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fc3RyLAorCSAgICAgICB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorCSAgICAgICBfX3BvcyA9IDAsCisJICAgICAgIHR5cGVuYW1lIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisJICAgICAgIF9fbiA9IChzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Om5wb3MpKQorCTogX0Jhc2UoX19zdHIsIF9fcG9zLCBfX24pIHsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAzOTYuIHdoYXQgYXJlIGNoYXJhY3RlcnMgemVybyBhbmQgb25lLgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisJYml0c2V0KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zdHIsCisJICAgICAgIHR5cGVuYW1lIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisJICAgICAgIF9fcG9zLAorCSAgICAgICB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorCSAgICAgICBfX24sCisJICAgICAgIF9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKQorCTogX0Jhc2UoX19zdHIsIF9fcG9zLCBfX24sIF9femVybywgX19vbmUpIHsgfQorCisgICAgICBiaXRzZXQoY29uc3QgX0Jhc2UmIF9feCkgOiBfQmFzZShfX3gpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBiaXRzZXQoY29uc3QgX0NoYXJUKiBfX3N0ciwKKwkgICAgICAgdHlwZW5hbWUgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJUPjo6c2l6ZV90eXBlIF9fbgorCSAgICAgICA9IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVD46Om5wb3MsCisJICAgICAgIF9DaGFyVCBfX3plcm8gPSBfQ2hhclQoJzAnKSwgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpCisJOiBfQmFzZShfX3N0ciwgX19uLCBfX3plcm8sIF9fb25lKSB7IH0KKyNlbmRpZgorCisgICAgICAvLyAyMy4zLjUuMiBiaXRzZXQgb3BlcmF0aW9uczoKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3ImPShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX01fYmFzZSgpICY9IF9fcmhzOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvcnw9KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfTV9iYXNlKCkgfD0gX19yaHM7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yXj0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9NX2Jhc2UoKSBePSBfX3JoczsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3I8PD0oc2l6ZV90IF9fcG9zKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9NX2Jhc2UoKSA8PD0gX19wb3M7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yPj49KHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfTV9iYXNlKCkgPj49IF9fcG9zOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBzZXQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9CYXNlOjpzZXQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDE4Ni4gYml0c2V0OjpzZXQoKSBzZWNvbmQgcGFyYW1ldGVyIHNob3VsZCBiZSBib29sCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIHNldChzaXplX3QgX19wb3MsIGJvb2wgX192YWwgPSB0cnVlKQorICAgICAgeworCV9CYXNlOjpzZXQoX19wb3MsIF9fdmFsKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgcmVzZXQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9CYXNlOjpyZXNldCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICByZXNldChzaXplX3QgX19wb3MpCisgICAgICB7CisJX0Jhc2U6OnJlc2V0KF9fcG9zKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+CisgICAgICBvcGVyYXRvcn4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gYml0c2V0KH5fTV9iYXNlKCkpOyB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgZmxpcCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX0Jhc2U6OmZsaXAoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgZmxpcChzaXplX3QgX19wb3MpCisgICAgICB7CisJX0Jhc2U6OmZsaXAoX19wb3MpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMS4gQml0c2V0IG1pbm9yIHByb2JsZW1zCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90IF9fcG9zKQorICAgICAgeworCXJldHVybiByZWZlcmVuY2UoX01fYmFzZSgpW19fcG9zXSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDExLiBCaXRzZXQgbWlub3IgcHJvYmxlbXMKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBvcGVyYXRvcltdKHNpemVfdCBfX3BvcykgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX0Jhc2U6Om9wZXJhdG9yW10oX19wb3MpOworICAgICAgfQorCisgICAgICB1c2luZyBfQmFzZTo6dG9fdWxvbmc7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdXNpbmcgX0Jhc2U6OnRvX3VsbG9uZzsKKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgICAgICB0b19zdHJpbmcoKSBjb25zdAorICAgICAgICB7IHJldHVybiBfTV9iYXNlKCkudGVtcGxhdGUgdG9fc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPigpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDM5Ni4gd2hhdCBhcmUgY2hhcmFjdGVycyB6ZXJvIGFuZCBvbmUuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKwl0b19zdHJpbmcoX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpIGNvbnN0CisJeworCSAgcmV0dXJuIF9NX2Jhc2UoKS50ZW1wbGF0ZQorCSAgICB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+KF9femVybywgX19vbmUpOworCX0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM0LiBiaXRzZXQ6OnRvX3N0cmluZygpIGhhcmQgdG8gdXNlLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorICAgICAgICB0b19zdHJpbmcoKSBjb25zdAorICAgICAgICB7IHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA4NTMuIHRvX3N0cmluZyBuZWVkcyB1cGRhdGluZyB3aXRoIHplcm8gYW5kIG9uZS4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorCXRvX3N0cmluZyhfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkgY29uc3QKKwl7IHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLAorCSAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oX196ZXJvLCBfX29uZSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+CisgICAgICAgIHRvX3N0cmluZygpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gdG9fc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+KCk7CisgICAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUPgorCXN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorCXRvX3N0cmluZyhfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkgY29uc3QKKwl7CisJICByZXR1cm4gdG9fc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oX196ZXJvLCBfX29uZSk7CisJfQorCisgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LCBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgICAgICB0b19zdHJpbmcoKSBjb25zdAorICAgICAgeworCXJldHVybiB0b19zdHJpbmc8Y2hhcixzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4oKTsKKyAgICAgIH0KKworICAgICAgc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICAgICAgdG9fc3RyaW5nKGNoYXIgX196ZXJvLCBjaGFyIF9fb25lID0gJzEnKSBjb25zdAorICAgICAgeworCXJldHVybiB0b19zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwKKwkgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4oX196ZXJvLCBfX29uZSk7CisgICAgICB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpjb3VudDsKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX2Jhc2UoKSA9PSBfX3JoczsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX2Jhc2UoKSAhPSBfX3JoczsgfQorCisgICAgICB1c2luZyBfQmFzZTo6dGVzdDsKKyAgICAgIHVzaW5nIF9CYXNlOjphbGw7CisgICAgICB1c2luZyBfQmFzZTo6YW55OworICAgICAgdXNpbmcgX0Jhc2U6Om5vbmU7CisKKyAgICAgIGJpdHNldDxfTmI+CisgICAgICBvcGVyYXRvcjw8KHNpemVfdCBfX3BvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9NX2Jhc2UoKSA8PCBfX3Bvcyk7IH0KKworICAgICAgYml0c2V0PF9OYj4KKyAgICAgIG9wZXJhdG9yPj4oc2l6ZV90IF9fcG9zKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oX01fYmFzZSgpID4+IF9fcG9zKTsgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIGJpdHNldDxfTmI+CisgICAgb3BlcmF0b3ImKGNvbnN0IGJpdHNldDxfTmI+JiBfX3gsIGNvbnN0IGJpdHNldDxfTmI+JiBfX3kpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oX194KSAmPSBfX3k7IH0KKworICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIGJpdHNldDxfTmI+CisgICAgb3BlcmF0b3J8KGNvbnN0IGJpdHNldDxfTmI+JiBfX3gsIGNvbnN0IGJpdHNldDxfTmI+JiBfX3kpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oX194KSB8PSBfX3k7IH0KKworICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIGJpdHNldDxfTmI+CisgICAgb3BlcmF0b3JeKGNvbnN0IGJpdHNldDxfTmI+JiBfX3gsIGNvbnN0IGJpdHNldDxfTmI+JiBfX3kpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oX194KSBePSBfX3k7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHNpemVfdCBfTmI+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgYml0c2V0PF9OYj4mIF9feCkKKyAgICB7IHJldHVybiBfX2lzID4+IF9feC5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHNpemVfdCBfTmI+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgYml0c2V0PF9OYj4mIF9feCkKKyAgICB7IHJldHVybiBfX29zIDw8IF9feC5fTV9iYXNlKCk7IH0KK30gLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvLyBEUiAxMTgyLgorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBiaXRzZXQuCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgc3RydWN0IGhhc2g8X19wcm9maWxlOjpiaXRzZXQ8X05iPj4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9fcHJvZmlsZTo6Yml0c2V0PF9OYj4+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fcHJvZmlsZTo6Yml0c2V0PF9OYj4mIF9fYikgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6aGFzaDxfR0xJQkNYWF9TVERfQzo6Yml0c2V0PF9OYj4+KCkoX19iLl9NX2Jhc2UoKSk7IH0KKyAgICB9OworI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9kZXF1ZSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9kZXF1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTgyNjg0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2RlcXVlCkBAIC0wLDAgKzEsNDY2IEBACisvLyBQcm9maWxpbmcgZGVxdWUgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvZGVxdWUKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9ERVFVRQorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX0RFUVVFIDEKKworI2luY2x1ZGUgPGRlcXVlPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgLy8vIENsYXNzIHN0ZDo6ZGVxdWUgd3JhcHBlciB3aXRoIHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8X1RwPiA+CisgICAgY2xhc3MgZGVxdWUKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6ZGVxdWU8X1RwLCBfQWxsb2NhdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgIF9HTElCQ1hYX1NURF9DOjpkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZXZlcnNlX2l0ZXJhdG9yICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiBfVHAJCQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IJCQkgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3BvaW50ZXIgICAgICAgICBjb25zdF9wb2ludGVyOworCisgICAgICAvLyAyMy4yLjEuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQKKyAgICAgIGRlcXVlKGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19hKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGV4cGxpY2l0CisgICAgICBkZXF1ZShzaXplX3R5cGUgX19uKQorICAgICAgOiBfQmFzZShfX24pIHsgfQorCisgICAgICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUsCisJICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpIHsgfQorI2Vsc2UKKyAgICAgIGV4cGxpY2l0CisgICAgICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUgPSBfVHAoKSwKKwkgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX24sIF9fdmFsdWUsIF9fYSkgeyB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIGRlcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisJOiBfQmFzZShfX2ZpcnN0LCBfX2xhc3QsIF9fYSkKKyAgICAgICAgeyB9CisKKyAgICAgIGRlcXVlKGNvbnN0IGRlcXVlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyAgICAgIGRlcXVlKGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBkZXF1ZShkZXF1ZSYmIF9feCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IH0KKworICAgICAgZGVxdWUoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgfmRlcXVlKCkgX0dMSUJDWFhfTk9FWENFUFQgeyB9CisKKyAgICAgIGRlcXVlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGRlcXVlJiBfX3gpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3g7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgZGVxdWUmCisgICAgICBvcGVyYXRvcj0oZGVxdWUmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGRlcXVlJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX19sOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgdm9pZAorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfQmFzZTo6YXNzaWduKF9fZmlyc3QsIF9fbGFzdCk7CisJfQorCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3QpCisgICAgICB7CisJX0Jhc2U6OmFzc2lnbihfX24sIF9fdCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX0Jhc2U6OmFzc2lnbihfX2wpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gMjMuMi4xLjIgY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeikKKyAgICAgIHsKKwlfQmFzZTo6cmVzaXplKF9fc3opOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIGNvbnN0IF9UcCYgX19jKQorICAgICAgeworCV9CYXNlOjpyZXNpemUoX19zeiwgX19jKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIF9UcCBfX2MgPSBfVHAoKSkKKyAgICAgIHsKKwlfQmFzZTo6cmVzaXplKF9fc3osIF9fYyk7CisgICAgICB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHVzaW5nIF9CYXNlOjpzaHJpbmtfdG9fZml0OworI2VuZGlmCisKKyAgICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKworICAgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlyZXR1cm4gX01fYmFzZSgpW19fbl07CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeworCXJldHVybiBfTV9iYXNlKClbX19uXTsKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmF0OworCisgICAgICByZWZlcmVuY2UKKyAgICAgIGZyb250KCkKKyAgICAgIHsKKwlyZXR1cm4gX0Jhc2U6OmZyb250KCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeworCXJldHVybiBfQmFzZTo6ZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBiYWNrKCkKKyAgICAgIHsKKwlyZXR1cm4gX0Jhc2U6OmJhY2soKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX0Jhc2U6OmJhY2soKTsKKyAgICAgIH0KKworICAgICAgLy8gMjMuMi4xLjMgbW9kaWZpZXJzOgorICAgICAgdm9pZAorICAgICAgcHVzaF9mcm9udChjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6cHVzaF9mcm9udChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2soY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnB1c2hfYmFjayhfX3gpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgcHVzaF9mcm9udChfVHAmJiBfX3gpCisgICAgICB7IGVtcGxhY2VfZnJvbnQoc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfYmFjayhfVHAmJiBfX3gpCisgICAgICB7IGVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgZW1wbGFjZV9mcm9udChfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBfQmFzZTo6ZW1wbGFjZV9mcm9udChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgZW1wbGFjZV9iYWNrKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9CYXNlOjplbXBsYWNlX2JhY2soc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBlbXBsYWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfX3JlcyA9IF9CYXNlOjplbXBsYWNlKF9fcG9zaXRpb24sCisJCQkJCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9fcmVzKTsKKwl9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKwl0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIF9feCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9fcmVzKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX1RwJiYgX194KQorICAgICAgeyByZXR1cm4gZW1wbGFjZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX0Jhc2U6Omluc2VydChfX3AsIF9fbCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworCV9CYXNlOjppbnNlcnQoX19wb3NpdGlvbiwgX19uLCBfX3gpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwKKwkgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCk7CisJfQorCisgICAgICB2b2lkCisgICAgICBwb3BfZnJvbnQoKQorICAgICAgeworCV9CYXNlOjpwb3BfZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcG9wX2JhY2soKQorICAgICAgeworCV9CYXNlOjpwb3BfYmFjaygpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlpZiAoX19wb3NpdGlvbiA9PSBiZWdpbigpIHx8IF9fcG9zaXRpb24gPT0gZW5kKCktMSkKKwkgIHsKKwkgICAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uKSk7CisJICB9CisJZWxzZQorCSAgeworCSAgICB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbik7CisJICAgIHJldHVybiBpdGVyYXRvcihfX3Jlcyk7CisJICB9CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisgICAgICAgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdCwgX19sYXN0KSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoZGVxdWUmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6c3dhcChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX0Jhc2U6OmNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIF9HTElCQ1hYX05PRVhDRVBUICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPCBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoZGVxdWU8X1RwLCBfQWxsb2M+JiBfX2xocywgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ZvcndhcmRfbGlzdCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9mb3J3YXJkX2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlMDQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9mb3J3YXJkX2xpc3QKQEAgLTAsMCArMSwxODIgQEAKKy8vIDxmb3J3YXJkX2xpc3Q+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2ZvcndhcmRfbGlzdAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9GT1JXQVJEX0xJU1QKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9GT1JXQVJEX0xJU1QgMQorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPGZvcndhcmRfbGlzdD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19wcm9maWxlCit7CisgIC8vLyBDbGFzcyBzdGQ6OmZvcndhcmRfbGlzdCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGZvcndhcmRfbGlzdAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjpmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6Zm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiBfQmFzZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fYWxsb2NfdHJhaXRzPF9BbGxvYz46OnRlbXBsYXRlCisgICAgICAgIHJlYmluZDxfR0xJQkNYWF9TVERfQzo6X0Z3ZF9saXN0X25vZGU8X1RwPj46Om90aGVyIF9Ob2RlX2FsbG9jX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2FsbG9jX3RyYWl0czxfTm9kZV9hbGxvY190eXBlPiBfTm9kZV9hbGxvY190cmFpdHM7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworCisgICAgICAvLyAyMy4yLjMuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQKKyAgICAgIGZvcndhcmRfbGlzdChjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX19hbCkgeyB9CisKKyAgICAgIGZvcndhcmRfbGlzdChjb25zdCBmb3J3YXJkX2xpc3QmIF9fbGlzdCwgY29uc3QgX0FsbG9jJiBfX2FsKQorICAgICAgOiBfQmFzZShfX2xpc3QsIF9fYWwpCisgICAgICB7IH0KKworICAgICAgZm9yd2FyZF9saXN0KGZvcndhcmRfbGlzdCYmIF9fbGlzdCwgY29uc3QgX0FsbG9jJiBfX2FsKQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX19saXN0KSwgX19hbCkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgZm9yd2FyZF9saXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IF9BbGxvYyYgX19hbCA9IF9BbGxvYygpKQorICAgICAgOiBfQmFzZShfX24sIF9fYWwpCisgICAgICB7IH0KKworICAgICAgZm9yd2FyZF9saXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2FsKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorICAgICAgICBmb3J3YXJkX2xpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisgICAgICAgIDogX0Jhc2UoX19maXJzdCwgX19sYXN0LCBfX2FsKQorICAgICAgICB7IH0KKworICAgICAgZm9yd2FyZF9saXN0KGNvbnN0IGZvcndhcmRfbGlzdCYgX19saXN0KQorICAgICAgOiBfQmFzZShfX2xpc3QpCisgICAgICB7IH0KKworICAgICAgZm9yd2FyZF9saXN0KGZvcndhcmRfbGlzdCYmIF9fbGlzdCkgbm9leGNlcHQKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9fbGlzdCkpIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3Qoc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX19pbCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX19pbCwgX19hbCkKKyAgICAgIHsgfQorCisgICAgICB+Zm9yd2FyZF9saXN0KCkgbm9leGNlcHQKKyAgICAgIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3QmCisgICAgICBvcGVyYXRvcj0oY29uc3QgZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBfX2xpc3Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBmb3J3YXJkX2xpc3QmCisgICAgICBvcGVyYXRvcj0oZm9yd2FyZF9saXN0JiYgX19saXN0KQorICAgICAgbm9leGNlcHQoX05vZGVfYWxsb2NfdHJhaXRzOjpfU19ub3Rocm93X21vdmUoKSkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IHN0ZDo6bW92ZShfX2xpc3QpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgZm9yd2FyZF9saXN0JgorICAgICAgb3BlcmF0b3I9KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWwpCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBfX2lsOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIG5vZXhjZXB0ICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gX19seC5fTV9iYXNlKCkgPT0gX19seS5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuIF9fbHguX01fYmFzZSgpIDwgX19seS5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gIShfX2x4ID09IF9fbHkpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuIChfX2x5IDwgX19seCk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiAhKF9fbHggPCBfX2x5KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuICEoX19seSA8IF9fbHgpOyB9CisKKyAgLy8vIFNlZSBzdGQ6OmZvcndhcmRfbGlzdDo6c3dhcCgpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKwkgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IF9fbHguc3dhcChfX2x5KTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODFiYjY0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXIuaApAQCAtMCwwICsxLDQwNSBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXIuaAorICogIEBicmllZiBJbnRlcmZhY2Ugb2YgdGhlIHByb2ZpbGluZyBydW50aW1lIGxpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBMaXhpYSBMaXUgYW5kIFNpbHZpdXMgUnVzLgorCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworLy8gTWVjaGFuaXNtIHRvIGRlZmluZSBkYXRhIHdpdGggaW5saW5lIGxpbmthZ2UuCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX1VOSU5JVF9EQVRBKF9fdHlwZSwgX19uYW1lKSAgICAgICAgICAgICBcCisgIGlubGluZSBfX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fZ2V0XyMjX19uYW1lKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIF9fdHlwZSBfX25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIF9fbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX3R5cGUsIF9fbmFtZSwgX19pbml0aWFsX3ZhbHVlLi4uKSBcCisgIGlubGluZSBfX3R5cGUmIF9fZ2V0XyMjX19uYW1lKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBfX3R5cGUgX19uYW1lKF9faW5pdGlhbF92YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gX19uYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbmFtZSkgXAorICBfX2dldF8jI19fbmFtZSgpCisKK25hbWVzcGFjZSBfX2dudV9wcm9maWxlCit7CisgIC8qKiBAYnJpZWYgUmVlbnRyYW5jZSBndWFyZC4KKyAgICoKKyAgICogTWVjaGFuaXNtIHRvIHByb3RlY3QgYWxsIF9fZ251X3Byb2ZpbGUgb3BlcmF0aW9ucyBhZ2FpbnN0IHJlY3Vyc2lvbiwKKyAgICogbXVsdGl0aHJlYWRlZCBhbmQgZXhjZXB0aW9uIHJlZW50cmFuY2UuCisgICAqLworICBzdHJ1Y3QgX19yZWVudHJhbmNlX2d1YXJkCisgIHsKKyAgICBzdGF0aWMgYm9vbAorICAgIF9fZ2V0X2luKCkKKyAgICB7CisgICAgICBpZiAoX19pbnNpZGUoKSA9PSB0cnVlKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGVsc2UKKwl7CisJICBfX2luc2lkZSgpID0gdHJ1ZTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCYKKyAgICBfX2luc2lkZSgpCisgICAgeworICAgICAgc3RhdGljIF9fdGhyZWFkIGJvb2wgX1NfaW5zaWRlKGZhbHNlKTsKKyAgICAgIHJldHVybiBfU19pbnNpZGU7CisgICAgfQorCisgICAgX19yZWVudHJhbmNlX2d1YXJkKCkgeyB9CisgICAgfl9fcmVlbnRyYW5jZV9ndWFyZCgpIHsgX19pbnNpZGUoKSA9IGZhbHNlOyB9CisgIH07CisKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKF9feC4uLikJICAgICAgCVwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fZ251X3Byb2ZpbGU6Ol9fcmVlbnRyYW5jZV9ndWFyZDo6X19nZXRfaW4oKSkgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fcmVlbnRyYW5jZV9ndWFyZCBfX2dldF9vdXQ7IAkJXAorICAgICAgX194OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMuCisgIC8vIERvbid0IHVzZSBhbnkgX19nbnVfcHJvZmlsZTo6IGluIHVzZXIgY29kZS4KKyAgLy8gSW5zdGVhZCwgdXNlIHRoZSBfX3Byb2ZjeHguLi4gbWFjcm9zLCB3aGljaCBvZmZlciBndWFyZGVkIGFjY2Vzcy4KKyAgYm9vbCBfX3R1cm5fb24oKTsKKyAgYm9vbCBfX3R1cm5fb2ZmKCk7CisgIGJvb2wgX19pc19pbnZhbGlkKCk7CisgIGJvb2wgX19pc19vbigpOworICBib29sIF9faXNfb2ZmKCk7CisgIHZvaWQgX19yZXBvcnQodm9pZCk7CisgIHZvaWQgX190cmFjZV9oYXNodGFibGVfc2l6ZV9yZXNpemUoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90LCBzdGQ6OnNpemVfdCk7CisgIHZvaWQgX190cmFjZV9oYXNodGFibGVfc2l6ZV9kZXN0cnVjdChjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QsIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX2hhc2h0YWJsZV9zaXplX2NvbnN0cnVjdChjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3NpemVfcmVzaXplKGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3NpemVfZGVzdHJ1Y3QoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90LCBzdGQ6OnNpemVfdCk7CisgIHZvaWQgX190cmFjZV92ZWN0b3Jfc2l6ZV9jb25zdHJ1Y3QoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX2hhc2hfZnVuY19kZXN0cnVjdChjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QsIHN0ZDo6c2l6ZV90LAorCQkJCSAgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfaGFzaF9mdW5jX2NvbnN0cnVjdChjb25zdCB2b2lkKik7CisgIHZvaWQgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9kZXN0cnVjdChjb25zdCB2b2lkKik7CisgIHZvaWQgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9jb25zdHJ1Y3QoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaW5zZXJ0KGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaXRlcmF0ZShjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaW52YWxpZF9vcGVyYXRvcihjb25zdCB2b2lkKik7CisgIHZvaWQgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9yZXNpemUoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90LCBzdGQ6OnNpemVfdCk7CisgIHZvaWQgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9maW5kKGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCk7CisKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2xpc3RfZGVzdHJ1Y3QoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbGlzdF90b19zbGlzdF9jb25zdHJ1Y3QoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbGlzdF90b19zbGlzdF9yZXdpbmQoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbGlzdF90b19zbGlzdF9vcGVyYXRpb24oY29uc3Qgdm9pZCopOworCisgIHZvaWQgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9kZXN0cnVjdChjb25zdCB2b2lkKik7CisgIHZvaWQgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9jb25zdHJ1Y3QoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfaW5zZXJ0KGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfaXRlcmF0ZShjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfaW52YWxpZF9vcGVyYXRvcihjb25zdCB2b2lkKik7CisgIHZvaWQgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9yZXNpemUoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90LCBzdGQ6OnNpemVfdCk7CisKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2V0X2Rlc3RydWN0KGNvbnN0IHZvaWQqKTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2V0X2NvbnN0cnVjdChjb25zdCB2b2lkKik7CisgIHZvaWQgX190cmFjZV9saXN0X3RvX3NldF9pbnNlcnQoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90LCBzdGQ6OnNpemVfdCk7IAorICB2b2lkIF9fdHJhY2VfbGlzdF90b19zZXRfaXRlcmF0ZShjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfbGlzdF90b19zZXRfaW52YWxpZF9vcGVyYXRvcihjb25zdCB2b2lkKik7CisgIHZvaWQgX190cmFjZV9saXN0X3RvX3NldF9maW5kKGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCk7IAorCisgIHZvaWQgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9jb25zdHJ1Y3QoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZShjb25zdCB2b2lkKik7CisgIHZvaWQgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnNlcnQoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90LAorCQkJCQkgICBzdGQ6OnNpemVfdCk7CisgIHZvaWQgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9lcmFzZShjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QsCisJCQkJCSAgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaXRlcmF0ZShjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZChjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZGVzdHJ1Y3QoY29uc3Qgdm9pZCopOworfSAvLyBuYW1lc3BhY2UgX19nbnVfcHJvZmlsZQorCisvLyBNYXN0ZXIgc3dpdGNoIHR1cm5zIG9uIGFsbCBkaWFnbm9zdGljcyB0aGF0IGFyZSBub3QgZXhwbGljaXRseSB0dXJuZWQgb2ZmLgorI2lmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9OT19IQVNIVEFCTEVfVE9PX1NNQUxMCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfSEFTSFRBQkxFX1RPT19TTUFMTAorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTk9fSEFTSFRBQkxFX1RPT19MQVJHRQorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX0hBU0hUQUJMRV9UT09fTEFSR0UKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX05PX1ZFQ1RPUl9UT09fU01BTEwKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9WRUNUT1JfVE9PX1NNQUxMCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9OT19WRUNUT1JfVE9PX0xBUkdFCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfVkVDVE9SX1RPT19MQVJHRQorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTk9fSU5FRkZJQ0lFTlRfSEFTSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX0lORUZGSUNJRU5UX0hBU0gKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX05PX1ZFQ1RPUl9UT19MSVNUCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfVkVDVE9SX1RPX0xJU1QKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX05PX0xJU1RfVE9fU0xJU1QKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9MSVNUX1RPX1NMSVNUCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9OT19MSVNUX1RPX1ZFQ1RPUgorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX0xJU1RfVE9fVkVDVE9SCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9OT19NQVBfVE9fVU5PUkRFUkVEX01BUAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX01BUF9UT19VTk9SREVSRURfTUFQCisjZW5kaWYKKyNlbmRpZgorCisvLyBFeHBvc2UgZ2xvYmFsIG1hbmFnZW1lbnQgcm91dGluZXMgdG8gdXNlciBjb2RlLgorI2lmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyNkZWZpbmUgX19wcm9mY3h4X3JlcG9ydCgpIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKF9fZ251X3Byb2ZpbGU6Ol9fcmVwb3J0KCkpCisjZGVmaW5lIF9fcHJvZmN4eF90dXJuX29uKCkgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoX19nbnVfcHJvZmlsZTo6X190dXJuX29uKCkpCisjZGVmaW5lIF9fcHJvZmN4eF90dXJuX29mZigpIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKF9fZ251X3Byb2ZpbGU6Ol9fdHVybl9vZmYoKSkKKyNkZWZpbmUgX19wcm9mY3h4X2lzX2ludmFsaWQoKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRChfX2dudV9wcm9maWxlOjpfX2lzX2ludmFsaWQoKSkKKyNkZWZpbmUgX19wcm9mY3h4X2lzX29uKCkgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoX19nbnVfcHJvZmlsZTo6X19pc19vbigpKQorI2RlZmluZSBfX3Byb2ZjeHhfaXNfb2ZmKCkgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoX19nbnVfcHJvZmlsZTo6X19pc19vZmYoKSkKKyNlbHNlCisjZGVmaW5lIF9fcHJvZmN4eF9yZXBvcnQoKQorI2RlZmluZSBfX3Byb2ZjeHhfdHVybl9vbigpCisjZGVmaW5lIF9fcHJvZmN4eF90dXJuX29mZigpCisjZGVmaW5lIF9fcHJvZmN4eF9pc19pbnZhbGlkKCkKKyNkZWZpbmUgX19wcm9mY3h4X2lzX29uKCkKKyNkZWZpbmUgX19wcm9mY3h4X2lzX29mZigpCisjZW5kaWYKKworLy8gVHVybiBvbi9vZmYgaW5zdHJ1bWVudGF0aW9uIGZvciBIQVNIVEFCTEVfVE9PX1NNQUxMIGFuZCBIQVNIVEFCTEVfVE9PX0xBUkdFLgorI2lmIChkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEVfSEFTSFRBQkxFX1RPT19TTUFMTCkgXAorICAgICB8fCBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEVfSEFTSFRBQkxFX1RPT19MQVJHRSkpCisjZGVmaW5lIF9fcHJvZmN4eF9oYXNodGFibGVfcmVzaXplKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfaGFzaHRhYmxlX3NpemVfcmVzaXplKF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9oYXNodGFibGVfc2l6ZV9kZXN0cnVjdChfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfaGFzaHRhYmxlX2NvbnN0cnVjdChfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX2hhc2h0YWJsZV9zaXplX2NvbnN0cnVjdChfX3gpKQorI2Vsc2UKKyNkZWZpbmUgX19wcm9mY3h4X2hhc2h0YWJsZV9yZXNpemUoX194Li4uKSAgCisjZGVmaW5lIF9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QoX194Li4uKSAKKyNkZWZpbmUgX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QoX194Li4uKSAgCisjZW5kaWYKKworLy8gVHVybiBvbi9vZmYgaW5zdHJ1bWVudGF0aW9uIGZvciBWRUNUT1JfVE9PX1NNQUxMIGFuZCBWRUNUT1JfVE9PX0xBUkdFLgorI2lmIChkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEVfVkVDVE9SX1RPT19TTUFMTCkgXAorICAgICB8fCBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEVfVkVDVE9SX1RPT19MQVJHRSkpCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfcmVzaXplKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfdmVjdG9yX3NpemVfcmVzaXplKF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfZGVzdHJ1Y3QoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV92ZWN0b3Jfc2l6ZV9kZXN0cnVjdChfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdChfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX3ZlY3Rvcl9zaXplX2NvbnN0cnVjdChfX3gpKQorI2Vsc2UKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9yZXNpemUoX194Li4uKSAgCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfZGVzdHJ1Y3QoX194Li4uKSAKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QoX194Li4uKSAgCisjZW5kaWYgCisKKy8vIFR1cm4gb24vb2ZmIGluc3RydW1lbnRhdGlvbiBmb3IgSU5FRkZJQ0lFTlRfSEFTSC4KKyNpZiBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEVfSU5FRkZJQ0lFTlRfSEFTSCkKKyNkZWZpbmUgX19wcm9mY3h4X2luZWZmaWNpZW50X2hhc2hfaXNfb24oKSBcCisgIF9fZ251X3Byb2ZpbGU6Ol9faXNfb24oKQorI2RlZmluZSBfX3Byb2ZjeHhfaGFzaHRhYmxlX2NvbnN0cnVjdDIoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9oYXNoX2Z1bmNfY29uc3RydWN0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QyKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfaGFzaF9mdW5jX2Rlc3RydWN0KF9feCkpCisjZWxzZQorI2RlZmluZSBfX3Byb2ZjeHhfaW5lZmZpY2llbnRfaGFzaF9pc19vbigpIGZhbHNlCisjZGVmaW5lIF9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QyKF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QyKF9feC4uLikKKyNlbmRpZgorCisvLyBUdXJuIG9uL29mZiBpbnN0cnVtZW50YXRpb24gZm9yIFZFQ1RPUl9UT19MSVNULgorI2lmIGRlZmluZWQoX0dMSUJDWFhfUFJPRklMRV9WRUNUT1JfVE9fTElTVCkKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QyKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfY29uc3RydWN0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfZGVzdHJ1Y3QyKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfZGVzdHJ1Y3QoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9pbnNlcnQoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV92ZWN0b3JfdG9fbGlzdF9pbnNlcnQoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9pdGVyYXRlKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaXRlcmF0ZShfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX2ludmFsaWRfb3BlcmF0b3IoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV92ZWN0b3JfdG9fbGlzdF9pbnZhbGlkX29wZXJhdG9yKF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfcmVzaXplMihfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX3ZlY3Rvcl90b19saXN0X3Jlc2l6ZShfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX2ZpbmQoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV92ZWN0b3JfdG9fbGlzdF9maW5kKF9feCkpCisjZWxzZQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX2Rlc3RydWN0MihfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0MihfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfaW5zZXJ0KF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9pdGVyYXRlKF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9pbnZhbGlkX29wZXJhdG9yKF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9yZXNpemUyKF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9maW5kKF9feC4uLikKKyNlbmRpZgorCisvLyBUdXJuIG9uL29mZiBpbnN0cnVtZW50YXRpb24gZm9yIExJU1RfVE9fVkVDVE9SLiAKKyNpZiBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEVfTElTVF9UT19WRUNUT1IpCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdDIoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9saXN0X3RvX3ZlY3Rvcl9jb25zdHJ1Y3QoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfZGVzdHJ1Y3QyKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbGlzdF90b192ZWN0b3JfZGVzdHJ1Y3QoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfaW5zZXJ0KF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbGlzdF90b192ZWN0b3JfaW5zZXJ0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2l0ZXJhdGUoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9saXN0X3RvX3ZlY3Rvcl9pdGVyYXRlKF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2ludmFsaWRfb3BlcmF0b3IoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9saXN0X3RvX3ZlY3Rvcl9pbnZhbGlkX29wZXJhdG9yKF9feCkpCisjZWxzZQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9kZXN0cnVjdDIoX194Li4uKQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfaW5zZXJ0KF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfaXRlcmF0ZShfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2ludmFsaWRfb3BlcmF0b3IoX194Li4uKQorI2VuZGlmCisKKy8vIFR1cm4gb24vb2ZmIGluc3RydW1lbnRhdGlvbiBmb3IgTElTVF9UT19TTElTVC4gIAorI2lmIGRlZmluZWQoX0dMSUJDWFhfUFJPRklMRV9MSVNUX1RPX1NMSVNUKQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9yZXdpbmQoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9saXN0X3RvX3NsaXN0X3Jld2luZChfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9vcGVyYXRpb24oX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9saXN0X3RvX3NsaXN0X29wZXJhdGlvbihfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9kZXN0cnVjdChfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX2xpc3RfdG9fc2xpc3RfZGVzdHJ1Y3QoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0KF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbGlzdF90b19zbGlzdF9jb25zdHJ1Y3QoX194KSkKKyNlbHNlCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X3Jld2luZChfX3guLi4pICAKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3Rfb3BlcmF0aW9uKF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfZGVzdHJ1Y3QoX194Li4uKSAKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0KF9feC4uLikgIAorI2VuZGlmIAorCisvLyBUdXJuIG9uL29mZiBpbnN0cnVtZW50YXRpb24gZm9yIE1BUF9UT19VTk9SREVSRURfTUFQLgorI2lmIGRlZmluZWQoX0dMSUJDWFhfUFJPRklMRV9NQVBfVE9fVU5PUkRFUkVEX01BUCkKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2NvbnN0cnVjdChfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2NvbnN0cnVjdChfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZGVzdHJ1Y3QoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9kZXN0cnVjdChfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5zZXJ0KF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5zZXJ0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9lcmFzZShfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2VyYXNlKF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pdGVyYXRlKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaXRlcmF0ZShfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZShfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9maW5kKF9feCkpCisjZWxzZQorI2RlZmluZSBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfY29uc3RydWN0KF9feC4uLikgXAorICAKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2Rlc3RydWN0KF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydChfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9lcmFzZShfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pdGVyYXRlKF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoX194Li4uKQorI2RlZmluZSBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZChfX3guLi4pCisjZW5kaWYKKworLy8gU2V0IGRlZmF1bHQgdmFsdWVzIGZvciBjb21waWxlLXRpbWUgY3VzdG9taXphYmxlIHZhcmlhYmxlcy4KKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9UUkFDRV9QQVRIX1JPT1QKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9UUkFDRV9QQVRIX1JPT1QgImxpYnN0ZGN4eC1wcm9maWxlIgorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfVFJBQ0VfRU5WX1ZBUgorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1RSQUNFX0VOVl9WQVIgIl9HTElCQ1hYX1BST0ZJTEVfVFJBQ0VfUEFUSF9ST09UIgorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTUFYX1dBUk5fQ09VTlRfRU5WX1ZBUgorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX01BWF9XQVJOX0NPVU5UX0VOVl9WQVIgXAorICAiX0dMSUJDWFhfUFJPRklMRV9NQVhfV0FSTl9DT1VOVCIKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX01BWF9XQVJOX0NPVU5UCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfTUFYX1dBUk5fQ09VTlQgMTAKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX01BWF9TVEFDS19ERVBUSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX01BWF9TVEFDS19ERVBUSCAzMgorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTUFYX1NUQUNLX0RFUFRIX0VOVl9WQVIKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NQVhfU1RBQ0tfREVQVEhfRU5WX1ZBUiBcCisgICJfR0xJQkNYWF9QUk9GSUxFX01BWF9TVEFDS19ERVBUSCIKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX01FTV9QRVJfRElBR05PU1RJQworI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX01FTV9QRVJfRElBR05PU1RJQyAoMSA8PCAyOCkKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX01FTV9QRVJfRElBR05PU1RJQ19FTlZfVkFSCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfTUVNX1BFUl9ESUFHTk9TVElDX0VOVl9WQVIgXAorICAiX0dMSUJDWFhfUFJPRklMRV9NRU1fUEVSX0RJQUdOT1NUSUMiCisjZW5kaWYKKworLy8gSW5zdHJ1bWVudGF0aW9uIGhvb2sgaW1wbGVtZW50YXRpb25zLgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9oYXNoX2Z1bmMuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfaGFzaHRhYmxlX3NpemUuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbWFwX3RvX3Vub3JkZXJlZF9tYXAuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3NpemUuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3RvX2xpc3QuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b19zbGlzdC5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9saXN0X3RvX3ZlY3Rvci5oIgorCisjZW5kaWYgLy8gX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9hbGdvcy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfYWxnb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGRiMjUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfYWxnb3MuaApAQCAtMCwwICsxLDExMSBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXJfYWxnb3MuaAorICogIEBicmllZiBBbGdvcml0aG1zIHVzZWQgYnkgdGhlIHByb2ZpbGUgZXh0ZW5zaW9uLgorICoKKyAqICBUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIGF2b2lkIGluY2x1ZGluZyBcPGFsZ29yaXRobVw+IG9yIFw8Yml0cy9zdGxfYWxnby5oXD4uCisgKiAgSW5jbHVkaW5nIHRob3NlIGZpbGVzIHdvdWxkIHJlc3VsdCBpbiByZWN1cnNpdmUgaW5jbHVkZXMuCisgKiAgVGhlc2UgaW1wbGVtZW50YXRpb25zIGFyZSBvdmVyc2ltcGxpZmllZC4gIEluIGdlbmVyYWwsIGVmZmljaWVuY3kgbWF5IGJlCisgKiAgc2FjcmlmaWNlZCB0byBtaW5pbWl6ZSBtYWludGVuYW5jZSBvdmVyaGVhZC4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfQUxHT1NfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0FMR09TX0ggMQorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICAvKiBIZWxwZXIgZm9yIF9fdG9wX24uICBJbnNlcnQgaW4gc29ydGVkIHZlY3RvciwgYnV0IG5vdCBiZXlvbmQgTnRoIGVsZW0uICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIHZvaWQKKyAgICBfX2luc2VydF90b3BfbihfQ29udGFpbmVyJiBfX291dHB1dCwKKwkJICAgY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSwKKwkJICAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6c2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBfX2l0ID0gX19vdXRwdXQuYmVnaW4oKTsKKyAgICAgIHR5cGVuYW1lIF9Db250YWluZXI6OnNpemVfdHlwZSBfX2NvdW50ID0gMDsKKworICAgICAgLy8gU2tpcCB1cCB0byBOIC0gMSBlbGVtZW50cyBsYXJnZXIgdGhhbiBWQUxVRS4KKyAgICAgIC8vIFhYWDogQ291bGQgZG8gYmluYXJ5IHNlYXJjaCBmb3IgcmFuZG9tIGl0ZXJhdG9ycy4KKyAgICAgIHdoaWxlICh0cnVlKQorCXsKKwkgIGlmIChfX2NvdW50ID49IF9fbikKKwkgICAgLy8gVkFMVUUgaXMgbm90IGluIHRvcCBOLgorCSAgICByZXR1cm47CisKKwkgIGlmIChfX2l0ID09IF9fb3V0cHV0LmVuZCgpKQorCSAgICBicmVhazsKKworCSAgaWYgKCpfX2l0IDwgX192YWx1ZSkKKwkgICAgYnJlYWs7CisKKwkgICsrX19pdDsKKwkgICsrX19jb3VudDsKKwl9CisKKyAgICAgIF9fb3V0cHV0Lmluc2VydChfX2l0LCBfX3ZhbHVlKTsKKyAgICB9CisKKyAgLyogQ29weSB0aGUgdG9wIE4gZWxlbWVudHMgaW4gSU5QVVQsIHNvcnRlZCBpbiByZXZlcnNlIG9yZGVyLCB0byBPVVRQVVQuICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIHZvaWQKKyAgICBfX3RvcF9uKGNvbnN0IF9Db250YWluZXImIF9faW5wdXQsIF9Db250YWluZXImIF9fb3V0cHV0LAorCSAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjpzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9fb3V0cHV0LmNsZWFyKCk7CisgICAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBfX2l0OworICAgICAgZm9yIChfX2l0ID0gX19pbnB1dC5iZWdpbigpOyBfX2l0ICE9IF9faW5wdXQuZW5kKCk7ICsrX19pdCkKKwlfX2luc2VydF90b3BfbihfX291dHB1dCwgKl9faXQsIF9fbik7CisgICAgfQorCisgIC8qIFNpbXBsaWZpZWQgY2xvbmUgb2Ygc3RkOjpmb3JfZWFjaC4gICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRnVuY3Rpb24+CisgICAgX0Z1bmN0aW9uIAorICAgIF9fZm9yX2VhY2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfRnVuY3Rpb24gX19mKQorICAgIHsKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCV9fZigqX19maXJzdCk7CisgICAgICByZXR1cm4gX19mOworICAgIH0KKworICAvKiBTaW1wbGlmaWVkIGNsb25lIG9mIHN0ZDo6cmVtb3ZlLiAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3JlbW92ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICAgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIGlmKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2ZpcnN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgICArK19fZmlyc3Q7CisgICAgICBmb3IoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCWlmKCEoKl9fZmlyc3QgPT0gX192YWx1ZSkpCisJICB7CisJICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworCSAgICArK19fcmVzdWx0OworCSAgfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfQUxHT1NfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfY29udGFpbmVyX3NpemUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2NvbnRhaW5lcl9zaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjZGIwZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2NvbnRhaW5lcl9zaXplLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2NvbnRhaW5lcl9zaXplLmgKKyAqICBAYnJpZWYgRGlhZ25vc3RpY3MgZm9yIGNvbnRhaW5lciBzaXplcy4KKyAqLworCisvLyBXcml0dGVuIGJ5IExpeGlhIExpdSBhbmQgU2lsdml1cyBSdXMuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9DT05UQUlORVJfU0laRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfQ09OVEFJTkVSX1NJWkVfSCAxCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfdHJhY2UuaCIKKworbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKK3sKKyAgLyoqIEBicmllZiBBIGNvbnRhaW5lciBzaXplIGluc3RydW1lbnRhdGlvbiBsaW5lIGluIHRoZSBvYmplY3QgdGFibGUuICAqLworICBjbGFzcyBfX2NvbnRhaW5lcl9zaXplX2luZm8KKyAgOiBwdWJsaWMgX19vYmplY3RfaW5mb19iYXNlIAorICB7CisgIHB1YmxpYzoKKyAgICBfX2NvbnRhaW5lcl9zaXplX2luZm8oKQorICAgIDogX01faW5pdCgwKSwgX01fbWF4KDApLCBfTV9taW4oMCksIF9NX3RvdGFsKDApLCBfTV9pdGVtX21pbigwKSwKKyAgICAgIF9NX2l0ZW1fbWF4KDApLCBfTV9pdGVtX3RvdGFsKDApLCBfTV9jb3VudCgwKSwgX01fcmVzaXplKDApLCBfTV9jb3N0KDApIAorICAgIHsgfQorCisgICAgX19jb250YWluZXJfc2l6ZV9pbmZvKGNvbnN0IF9fY29udGFpbmVyX3NpemVfaW5mbyYgX19vKQorICAgIDogX19vYmplY3RfaW5mb19iYXNlKF9fbyksIF9NX2luaXQoX19vLl9NX2luaXQpLCBfTV9tYXgoX19vLl9NX21heCksCisgICAgICBfTV9taW4oX19vLl9NX21pbiksIF9NX3RvdGFsKF9fby5fTV90b3RhbCksCisgICAgICBfTV9pdGVtX21pbihfX28uX01faXRlbV9taW4pLCBfTV9pdGVtX21heChfX28uX01faXRlbV9tYXgpLAorICAgICAgX01faXRlbV90b3RhbChfX28uX01faXRlbV90b3RhbCksIF9NX2NvdW50KF9fby5fTV9jb3VudCksCisgICAgICBfTV9yZXNpemUoX19vLl9NX3Jlc2l6ZSksIF9NX2Nvc3QoX19vLl9NX2Nvc3QpCisgICAgeyB9CisKKyAgICBfX2NvbnRhaW5lcl9zaXplX2luZm8oX19zdGFja190IF9fc3RhY2ssIHN0ZDo6c2l6ZV90IF9fbnVtKQorICAgIDogX19vYmplY3RfaW5mb19iYXNlKF9fc3RhY2spLCBfTV9pbml0KF9fbnVtKSwgX01fbWF4KF9fbnVtKSwKKyAgICAgIF9NX21pbigwKSwgX01fdG90YWwoMCksIF9NX2l0ZW1fbWluKDApLCBfTV9pdGVtX21heCgwKSwKKyAgICAgIF9NX2l0ZW1fdG90YWwoMCksIF9NX2NvdW50KDApLCBfTV9yZXNpemUoMCksIF9NX2Nvc3QoMCkKKyAgICB7IH0KKworICAgIHZpcnR1YWwgfl9fY29udGFpbmVyX3NpemVfaW5mbygpIHsgfQorCisgICAgdm9pZAorICAgIF9fd3JpdGUoRklMRSogX19mKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6ZnByaW50ZihfX2YsICIlWnUgJVp1ICVadSAlWnUgJVp1ICVadSAlWnUgJVp1ICVadSAlWnVcbiIsIAorCQkgICBfTV9pbml0LCBfTV9jb3VudCwgX01fY29zdCwgX01fcmVzaXplLCBfTV9taW4sIF9NX21heCwKKwkJICAgX01fdG90YWwsIF9NX2l0ZW1fbWluLCBfTV9pdGVtX21heCwgX01faXRlbV90b3RhbCk7CisgICAgfQorCisgICAgZmxvYXQKKyAgICBfX21hZ25pdHVkZSgpIGNvbnN0CisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KF9NX2Nvc3QpOyB9CisKKyAgICBzdGQ6OnN0cmluZworICAgIF9fYWR2aWNlKCkgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBfX21lc3NhZ2U7CisgICAgICBpZiAoX01faW5pdCA8IF9NX2l0ZW1fbWF4KQorCV9fbWVzc2FnZSA8PCAiY2hhbmdlIGluaXRpYWwgY29udGFpbmVyIHNpemUgZnJvbSAiIDw8IF9NX2luaXQKKwkJICA8PCAiIHRvICIgPDwgX01faXRlbV9tYXg7CisgICAgICByZXR1cm4gX19tZXNzYWdlLnN0cigpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX21lcmdlKGNvbnN0IF9fY29udGFpbmVyX3NpemVfaW5mbyYgX19vKQorICAgIHsKKyAgICAgIF9NX2luaXQgICAgICAgID0gc3RkOjptYXgoX01faW5pdCwgX19vLl9NX2luaXQpOworICAgICAgX01fbWF4ICAgICAgICAgPSBzdGQ6Om1heChfTV9tYXgsIF9fby5fTV9tYXgpOworICAgICAgX01faXRlbV9tYXggICAgPSBzdGQ6Om1heChfTV9pdGVtX21heCwgX19vLl9NX2l0ZW1fbWF4KTsKKyAgICAgIF9NX21pbiAgICAgICAgID0gc3RkOjptaW4oX01fbWluLCBfX28uX01fbWluKTsKKyAgICAgIF9NX2l0ZW1fbWluICAgID0gc3RkOjptaW4oX01faXRlbV9taW4sIF9fby5fTV9pdGVtX21pbik7CisgICAgICBfTV90b3RhbCAgICAgICs9IF9fby5fTV90b3RhbDsKKyAgICAgIF9NX2l0ZW1fdG90YWwgKz0gX19vLl9NX2l0ZW1fdG90YWw7CisgICAgICBfTV9jb3VudCAgICAgICs9IF9fby5fTV9jb3VudDsKKyAgICAgIF9NX2Nvc3QgICAgICAgKz0gX19vLl9NX2Nvc3Q7CisgICAgICBfTV9yZXNpemUgICAgICs9IF9fby5fTV9yZXNpemU7CisgICAgfQorCisgICAgLy8gQ2FsbCBpZiBhIGNvbnRhaW5lciBpcyBkZXN0cnVjdGVkIG9yIGNsZWFuZWQuCisgICAgdm9pZAorICAgIF9fZGVzdHJ1Y3Qoc3RkOjpzaXplX3QgX19udW0sIHN0ZDo6c2l6ZV90IF9faW51bSkKKyAgICB7CisgICAgICBfTV9tYXggPSBzdGQ6Om1heChfTV9tYXgsIF9fbnVtKTsKKyAgICAgIF9NX2l0ZW1fbWF4ID0gc3RkOjptYXgoX01faXRlbV9tYXgsIF9faW51bSk7CisgICAgICBpZiAoX01fbWluID09IDApCisJeworCSAgX01fbWluID0gX19udW07IAorCSAgX01faXRlbV9taW4gPSBfX2ludW07CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9NX21pbiA9IHN0ZDo6bWluKF9NX21pbiwgX19udW0pOworCSAgX01faXRlbV9taW4gPSBzdGQ6Om1pbihfTV9pdGVtX21pbiwgX19pbnVtKTsKKwl9CisgICAgICBfTV90b3RhbCArPSBfX251bTsKKyAgICAgIF9NX2l0ZW1fdG90YWwgKz0gX19pbnVtOworICAgICAgX01fY291bnQgKz0gMTsKKyAgICB9CisKKyAgICAvLyBFc3RpbWF0ZSB0aGUgY29zdCBvZiByZXNpemUvcmVoYXNoLiAKKyAgICBmbG9hdAorICAgIF9fcmVzaXplX2Nvc3Qoc3RkOjpzaXplX3QgX19mcm9tLCBzdGQ6OnNpemVfdCkKKyAgICB7IHJldHVybiBfX2Zyb207IH0KKworICAgIC8vIENhbGwgaWYgY29udGFpbmVyIGlzIHJlc2l6ZWQuCisgICAgdm9pZAorICAgIF9fcmVzaXplKHN0ZDo6c2l6ZV90IF9fZnJvbSwgc3RkOjpzaXplX3QgX190bykKKyAgICB7CisgICAgICBfTV9jb3N0ICs9IHRoaXMtPl9fcmVzaXplX2Nvc3QoX19mcm9tLCBfX3RvKTsKKyAgICAgIF9NX3Jlc2l6ZSArPSAxOworICAgICAgX01fbWF4ID0gc3RkOjptYXgoX01fbWF4LCBfX3RvKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNpemVfdCBfTV9pbml0OworICAgIHN0ZDo6c2l6ZV90IF9NX21heDsgIC8vIHJhbmdlIG9mICMgYnVja2V0cworICAgIHN0ZDo6c2l6ZV90IF9NX21pbjsKKyAgICBzdGQ6OnNpemVfdCBfTV90b3RhbDsKKyAgICBzdGQ6OnNpemVfdCBfTV9pdGVtX21pbjsgIC8vIHJhbmdlIG9mICMgaXRlbXMKKyAgICBzdGQ6OnNpemVfdCBfTV9pdGVtX21heDsKKyAgICBzdGQ6OnNpemVfdCBfTV9pdGVtX3RvdGFsOworICAgIHN0ZDo6c2l6ZV90IF9NX2NvdW50OworICAgIHN0ZDo6c2l6ZV90IF9NX3Jlc2l6ZTsKKyAgICBzdGQ6OnNpemVfdCBfTV9jb3N0OworICB9OworCisKKyAgLyoqIEBicmllZiBBIGNvbnRhaW5lciBzaXplIGluc3RydW1lbnRhdGlvbiBsaW5lIGluIHRoZSBzdGFjayB0YWJsZS4gICovCisgIGNsYXNzIF9fY29udGFpbmVyX3NpemVfc3RhY2tfaW5mbworICA6IHB1YmxpYyBfX2NvbnRhaW5lcl9zaXplX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgX19jb250YWluZXJfc2l6ZV9zdGFja19pbmZvKGNvbnN0IF9fY29udGFpbmVyX3NpemVfaW5mbyYgX19vKQorICAgIDogX19jb250YWluZXJfc2l6ZV9pbmZvKF9fbykgeyB9CisgIH07CisKKyAgCisgIC8qKiBAYnJpZWYgQ29udGFpbmVyIHNpemUgaW5zdHJ1bWVudGF0aW9uIHRyYWNlIHByb2R1Y2VyLiAgKi8KKyAgY2xhc3MgX190cmFjZV9jb250YWluZXJfc2l6ZQorICA6IHB1YmxpYyBfX3RyYWNlX2Jhc2U8X19jb250YWluZXJfc2l6ZV9pbmZvLCBfX2NvbnRhaW5lcl9zaXplX3N0YWNrX2luZm8+IAorICB7CisgIHB1YmxpYzoKKyAgICB+X190cmFjZV9jb250YWluZXJfc2l6ZSgpIHsgfQorCisgICAgX190cmFjZV9jb250YWluZXJfc2l6ZSgpCisgICAgOiBfX3RyYWNlX2Jhc2U8X19jb250YWluZXJfc2l6ZV9pbmZvLCBfX2NvbnRhaW5lcl9zaXplX3N0YWNrX2luZm8+KCkgeyB9OworCisgICAgLy8gSW5zZXJ0IGEgbmV3IG5vZGUgYXQgY29uc3RydWN0IHdpdGggb2JqZWN0LCBjYWxsc3RhY2sgYW5kIGluaXRpYWwgc2l6ZS4gCisgICAgdm9pZAorICAgIF9faW5zZXJ0KGNvbnN0IF9fb2JqZWN0X3QgX19vYmosIF9fc3RhY2tfdCBfX3N0YWNrLCBzdGQ6OnNpemVfdCBfX251bSkKKyAgICB7IF9fYWRkX29iamVjdChfX29iaiwgX19jb250YWluZXJfc2l6ZV9pbmZvKF9fc3RhY2ssIF9fbnVtKSk7IH0KKworICAgIC8vIFhYWCBVbmRlZmluZWQ/CisgICAgdm9pZAorICAgIF9fY29uc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX2ludW0pOworICAKKyAgICAvLyBDYWxsIGF0IGRlc3RydWN0aW9uL2NsZWFuIHRvIHNldCBjb250YWluZXIgZmluYWwgc2l6ZS4KKyAgICB2b2lkCisgICAgX19kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19udW0sIHN0ZDo6c2l6ZV90IF9faW51bSkKKyAgICB7CisgICAgICBpZiAoIV9faXNfb24oKSkKKwlyZXR1cm47CisKKyAgICAgIF9fb2JqZWN0X3QgX19vYmpfaGFuZGxlID0gc3RhdGljX2Nhc3Q8X19vYmplY3RfdD4oX19vYmopOworCisgICAgICBfX2NvbnRhaW5lcl9zaXplX2luZm8qIF9fb2JqZWN0X2luZm8gPSBfX2dldF9vYmplY3RfaW5mbyhfX29ial9oYW5kbGUpOworICAgICAgaWYgKCFfX29iamVjdF9pbmZvKQorCXJldHVybjsKKworICAgICAgX19vYmplY3RfaW5mby0+X19kZXN0cnVjdChfX251bSwgX19pbnVtKTsKKyAgICAgIF9fcmV0aXJlX29iamVjdChfX29ial9oYW5kbGUpOworICAgIH0KKworICAgIC8vIENhbGwgYXQgcmVzaXplIHRvIHNldCByZXNpemUvY29zdCBpbmZvcm1hdGlvbi4KKyAgICB2b2lkCisgICAgX19yZXNpemUoY29uc3Qgdm9pZCogX19vYmosIGludCBfX2Zyb20sIGludCBfX3RvKQorICAgIHsKKyAgICAgIGlmICghX19pc19vbigpKQorCXJldHVybjsKKworICAgICAgX19jb250YWluZXJfc2l6ZV9pbmZvKiBfX29iamVjdF9pbmZvID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKCFfX29iamVjdF9pbmZvKQorCXJldHVybjsKKworICAgICAgX19vYmplY3RfaW5mby0+X19yZXNpemUoX19mcm9tLCBfX3RvKTsKKyAgICB9CisgIH07CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0NPTlRBSU5FUl9TSVpFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2hhc2hfZnVuYy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfaGFzaF9mdW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3NDRlMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2hhc2hfZnVuYy5oCkBAIC0wLDAgKzEsMTc0IEBACisvLyAtKi0gQysrIC0qLQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvaW1wbC9wcm9maWxlcl9oYXNoX2Z1bmMuaAorICogIEBicmllZiBEYXRhIHN0cnVjdHVyZXMgdG8gcmVwcmVzZW50IHByb2ZpbGluZyB0cmFjZXMuCisgKi8KKworLy8gV3JpdHRlbiBieSBMaXhpYSBMaXUgYW5kIFNpbHZpdXMgUnVzLgorCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfSEFTSF9GVU5DX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9IQVNIX0ZVTkNfSCAxCisKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXIuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oIgorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICAvKiogQGJyaWVmIEEgaGFzaCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24gbGluZSBpbiB0aGUgb2JqZWN0IHRhYmxlLiAgKi8KKyAgY2xhc3MgX19oYXNoZnVuY19pbmZvCisgIDogcHVibGljIF9fb2JqZWN0X2luZm9fYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICBfX2hhc2hmdW5jX2luZm8oKQorICAgIDogX01fbG9uZ2VzdF9jaGFpbigwKSwgX01fYWNjZXNzZXMoMCksIF9NX2hvcHMoMCkgeyB9CisKKyAgICBfX2hhc2hmdW5jX2luZm8oY29uc3QgX19oYXNoZnVuY19pbmZvJiBfX28pCisgICAgOiBfX29iamVjdF9pbmZvX2Jhc2UoX19vKSwgX01fbG9uZ2VzdF9jaGFpbihfX28uX01fbG9uZ2VzdF9jaGFpbiksCisgICAgICBfTV9hY2Nlc3NlcyhfX28uX01fYWNjZXNzZXMpLCBfTV9ob3BzKF9fby5fTV9ob3BzKSB7IH0KKworICAgIF9faGFzaGZ1bmNfaW5mbyhfX3N0YWNrX3QgX19zdGFjaykKKyAgICA6IF9fb2JqZWN0X2luZm9fYmFzZShfX3N0YWNrKSwgX01fbG9uZ2VzdF9jaGFpbigwKSwKKyAgICAgIF9NX2FjY2Vzc2VzKDApLCBfTV9ob3BzKDApIHsgfQorCisgICAgdmlydHVhbCB+X19oYXNoZnVuY19pbmZvKCkgeyB9CisKKyAgICB2b2lkCisgICAgX19tZXJnZShjb25zdCBfX2hhc2hmdW5jX2luZm8mIF9fbykKKyAgICB7CisgICAgICBfTV9sb25nZXN0X2NoYWluICA9IHN0ZDo6bWF4KF9NX2xvbmdlc3RfY2hhaW4sIF9fby5fTV9sb25nZXN0X2NoYWluKTsKKyAgICAgIF9NX2FjY2Vzc2VzICAgICAgKz0gX19vLl9NX2FjY2Vzc2VzOworICAgICAgX01faG9wcyAgICAgICAgICArPSBfX28uX01faG9wczsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19kZXN0cnVjdChzdGQ6OnNpemVfdCBfX2NoYWluLCBzdGQ6OnNpemVfdCBfX2FjY2Vzc2VzLAorCSAgICAgICBzdGQ6OnNpemVfdCBfX2hvcHMpCisgICAgeyAKKyAgICAgIF9NX2xvbmdlc3RfY2hhaW4gID0gc3RkOjptYXgoX01fbG9uZ2VzdF9jaGFpbiwgX19jaGFpbik7CisgICAgICBfTV9hY2Nlc3NlcyAgICAgICs9IF9fYWNjZXNzZXM7CisgICAgICBfTV9ob3BzICAgICAgICAgICs9IF9faG9wczsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX193cml0ZShGSUxFKiBfX2YpIGNvbnN0CisgICAgeyBzdGQ6OmZwcmludGYoX19mLCAiJVp1ICVadSAlWnVcbiIsIF9NX2hvcHMsCisJCSAgIF9NX2FjY2Vzc2VzLCBfTV9sb25nZXN0X2NoYWluKTsgfQorCisgICAgZmxvYXQKKyAgICBfX21hZ25pdHVkZSgpIGNvbnN0CisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KF9NX2hvcHMpOyB9CisKKyAgICBzdGQ6OnN0cmluZworICAgIF9fYWR2aWNlKCkgY29uc3QKKyAgICB7IHJldHVybiAiY2hhbmdlIGhhc2ggZnVuY3Rpb24iOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNpemVfdCBfTV9sb25nZXN0X2NoYWluOworICAgIHN0ZDo6c2l6ZV90IF9NX2FjY2Vzc2VzOworICAgIHN0ZDo6c2l6ZV90IF9NX2hvcHM7CisgIH07CisKKworICAvKiogQGJyaWVmIEEgaGFzaCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24gbGluZSBpbiB0aGUgc3RhY2sgdGFibGUuICAqLworICBjbGFzcyBfX2hhc2hmdW5jX3N0YWNrX2luZm8gCisgIDogcHVibGljIF9faGFzaGZ1bmNfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBfX2hhc2hmdW5jX3N0YWNrX2luZm8oY29uc3QgX19oYXNoZnVuY19pbmZvJiBfX28pCisgICAgOiBfX2hhc2hmdW5jX2luZm8oX19vKSB7IH0KKyAgfTsKKworCisgIC8qKiBAYnJpZWYgSGFzaCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24gcHJvZHVjZXIuICAqLworICBjbGFzcyBfX3RyYWNlX2hhc2hfZnVuYworICA6IHB1YmxpYyBfX3RyYWNlX2Jhc2U8X19oYXNoZnVuY19pbmZvLCBfX2hhc2hmdW5jX3N0YWNrX2luZm8+IAorICB7CisgIHB1YmxpYzoKKyAgICBfX3RyYWNlX2hhc2hfZnVuYygpCisgICAgOiBfX3RyYWNlX2Jhc2U8X19oYXNoZnVuY19pbmZvLCBfX2hhc2hmdW5jX3N0YWNrX2luZm8+KCkKKyAgICB7IF9faWQgPSAiaGFzaC1kaXN0ciI7IH0KKworICAgIH5fX3RyYWNlX2hhc2hfZnVuYygpIHt9CisgICAgCisgICAgLy8gSW5zZXJ0IGEgbmV3IG5vZGUgYXQgY29uc3RydWN0IHdpdGggb2JqZWN0LCBjYWxsc3RhY2sgYW5kIGluaXRpYWwgc2l6ZS4KKyAgICB2b2lkCisgICAgX19pbnNlcnQoX19vYmplY3RfdCBfX29iaiwgX19zdGFja190IF9fc3RhY2spCisgICAgeyBfX2FkZF9vYmplY3QoX19vYmosIF9faGFzaGZ1bmNfaW5mbyhfX3N0YWNrKSk7IH0KKworICAgIC8vIENhbGwgYXQgZGVzdHJ1Y3Rpb24vY2xlYW4gdG8gc2V0IGNvbnRhaW5lciBmaW5hbCBzaXplLgorICAgIHZvaWQKKyAgICBfX2Rlc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX2NoYWluLAorCSAgICAgICBzdGQ6OnNpemVfdCBfX2FjY2Vzc2VzLCBzdGQ6OnNpemVfdCBfX2hvcHMpCisgICAgeworICAgICAgaWYgKCFfX2lzX29uKCkpCisJcmV0dXJuOworCisgICAgICAvLyBGaXJzdCBmaW5kIHRoZSBpdGVtIGZyb20gdGhlIGxpdmUgb2JqZWN0cyBhbmQgdXBkYXRlIHRoZSBpbmZvcm1hdGlvbnMuCisgICAgICBfX2hhc2hmdW5jX2luZm8qIF9fb2JqcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmICghX19vYmpzKQorCXJldHVybjsKKworICAgICAgX19vYmpzLT5fX2Rlc3RydWN0KF9fY2hhaW4sIF9fYWNjZXNzZXMsIF9faG9wcyk7CisgICAgICBfX3JldGlyZV9vYmplY3QoX19vYmopOworICAgIH0KKyAgfTsKKworCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfaGFzaF9mdW5jX2luaXQoKQorICB7IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNoX2Z1bmMpID0gbmV3IF9fdHJhY2VfaGFzaF9mdW5jKCk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2hhc2hfZnVuY19yZXBvcnQoRklMRSogX19mLCBfX3dhcm5pbmdfdmVjdG9yX3QmIF9fd2FybmluZ3MpCisgIHsKKyAgICBpZiAoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2hfZnVuYykpCisgICAgICB7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2hfZnVuYyktPl9fY29sbGVjdF93YXJuaW5ncyhfX3dhcm5pbmdzKTsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfaGFzaF9mdW5jKS0+X193cml0ZShfX2YpOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9oYXNoX2Z1bmNfY29uc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2hfZnVuYyktPl9faW5zZXJ0KF9fb2JqLCBfX2dldF9zdGFjaygpKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfaGFzaF9mdW5jX2Rlc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX2NoYWluLAorCQkJICAgICBzdGQ6OnNpemVfdCBfX2FjY2Vzc2VzLCBzdGQ6OnNpemVfdCBfX2hvcHMpCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfaGFzaF9mdW5jKS0+X19kZXN0cnVjdChfX29iaiwgX19jaGFpbiwKKwkJCQkJCSAgICBfX2FjY2Vzc2VzLCBfX2hvcHMpOworICB9CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0hBU0hfRlVOQ19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9oYXNodGFibGVfc2l6ZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfaGFzaHRhYmxlX3NpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWViYTllCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfaGFzaHRhYmxlX3NpemUuaApAQCAtMCwwICsxLDk4IEBACisvLyAtKi0gQysrIC0qLQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvaW1wbC9wcm9maWxlcl9oYXNodGFibGVfc2l6ZS5oCisgKiAgQGJyaWVmIENvbGxlY3Rpb24gb2YgaGFzaHRhYmxlIHNpemUgdHJhY2VzLgorICovCisKKy8vIFdyaXR0ZW4gYnkgTGl4aWEgTGl1IGFuZCBTaWx2aXVzIFJ1cy4KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0hBU0hUQUJMRV9TSVpFX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9IQVNIVEFCTEVfU0laRV9IIDEKKworI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlci5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9ub2RlLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3RyYWNlLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3N0YXRlLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2NvbnRhaW5lcl9zaXplLmgiCisKK25hbWVzcGFjZSBfX2dudV9wcm9maWxlCit7CisgIC8qKiBAYnJpZWYgSGFzaHRhYmxlIHNpemUgaW5zdHJ1bWVudGF0aW9uIHRyYWNlIHByb2R1Y2VyLiAgKi8KKyAgY2xhc3MgX190cmFjZV9oYXNodGFibGVfc2l6ZQorICA6IHB1YmxpYyBfX3RyYWNlX2NvbnRhaW5lcl9zaXplCisgIHsKKyAgcHVibGljOgorICAgIF9fdHJhY2VfaGFzaHRhYmxlX3NpemUoKQorICAgIDogX190cmFjZV9jb250YWluZXJfc2l6ZSgpCisgICAgeyBfX2lkID0gImhhc2h0YWJsZS1zaXplIjsgfQorICB9OworCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfaGFzaHRhYmxlX3NpemVfaW5pdCgpCisgIHsgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2h0YWJsZV9zaXplKSA9IG5ldyBfX3RyYWNlX2hhc2h0YWJsZV9zaXplKCk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2hhc2h0YWJsZV9zaXplX3JlcG9ydChGSUxFKiBfX2YsIF9fd2FybmluZ192ZWN0b3JfdCYgX193YXJuaW5ncykKKyAgeworICAgIGlmIChfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfaGFzaHRhYmxlX3NpemUpKQorICAgICAgeworCV9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNodGFibGVfc2l6ZSktPgorCSAgX19jb2xsZWN0X3dhcm5pbmdzKF9fd2FybmluZ3MpOworCV9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNodGFibGVfc2l6ZSktPl9fd3JpdGUoX19mKTsKKyAgICAgIH0KKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfaGFzaHRhYmxlX3NpemVfY29uc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX251bSkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKyAgCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2h0YWJsZV9zaXplKS0+X19pbnNlcnQoX19vYmosIF9fZ2V0X3N0YWNrKCksCisJCQkJCQkgICAgICAgX19udW0pOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9oYXNodGFibGVfc2l6ZV9kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19udW0sIAorCQkJCSAgc3RkOjpzaXplX3QgX19pbnVtKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2h0YWJsZV9zaXplKS0+X19kZXN0cnVjdChfX29iaiwgX19udW0sIF9faW51bSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2hhc2h0YWJsZV9zaXplX3Jlc2l6ZShjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19mcm9tLCAKKwkJCQlzdGQ6OnNpemVfdCBfX3RvKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2h0YWJsZV9zaXplKS0+X19yZXNpemUoX19vYmosIF9fZnJvbSwgX190byk7CisgIH0KKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcHJvZmlsZQorCisjZW5kaWYgLyogX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9IQVNIVEFCTEVfU0laRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9saXN0X3RvX3NsaXN0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9saXN0X3RvX3NsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjZWNmMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2xpc3RfdG9fc2xpc3QuaApAQCAtMCwwICsxLDIwOCBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b19zbGlzdC5oCisgKiAgQGJyaWVmIERpYWdub3N0aWNzIGZvciBsaXN0IHRvIHNsaXN0LgorICovCisKKy8vIFdyaXR0ZW4gYnkgQ2hhbmdoZWUgSnVuZy4KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0xJU1RfVE9fU0xJU1RfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0xJU1RfVE9fU0xJU1RfSCAxCisKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXIuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oIgorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICBjbGFzcyBfX2xpc3Qyc2xpc3RfaW5mbworICA6IHB1YmxpYyBfX29iamVjdF9pbmZvX2Jhc2UKKyAgeworICBwdWJsaWM6CisgICAgX19saXN0MnNsaXN0X2luZm8oKQorICAgIDogX01fcmV3aW5kKGZhbHNlKSwgX01fb3BlcmF0aW9ucygwKSB7IH0KKyAgCisgICAgX19saXN0MnNsaXN0X2luZm8oX19zdGFja190IF9fc3RhY2spCisgICAgOiBfX29iamVjdF9pbmZvX2Jhc2UoX19zdGFjayksIF9NX3Jld2luZChmYWxzZSksIF9NX29wZXJhdGlvbnMoMCkgeyB9CisKKyAgICB2aXJ0dWFsIH5fX2xpc3Qyc2xpc3RfaW5mbygpIHsgfQorCisgICAgX19saXN0MnNsaXN0X2luZm8oY29uc3QgX19saXN0MnNsaXN0X2luZm8mIF9fbykKKyAgICA6IF9fb2JqZWN0X2luZm9fYmFzZShfX28pLCBfTV9yZXdpbmQoX19vLl9NX3Jld2luZCksCisgICAgICBfTV9vcGVyYXRpb25zKF9fby5fTV9vcGVyYXRpb25zKSB7IH0KKyAgCisgICAgLy8gWFhYOiB0aGUgbWFnbml0dWRlIHNob3VsZCBiZSBtdWx0aXBsaWVkIHdpdGggYSBjb25zdGFudCBmYWN0b3IgRiwKKyAgICAvLyB3aGVyZSBGIGlzIDEgd2hlbiB0aGUgbWFsbG9jIHNpemUgY2xhc3Mgb2YgbGlzdCBub2RlcyBpcyBkaWZmZXJlbnQKKyAgICAvLyBmcm9tIHRoZSBtYWxsb2Mgc2l6ZSBjbGFzcyBvZiBzbGlzdCBub2Rlcy4gIFdoZW4gdGhleSBmYWxsIGludG8gdGhlIHNhbWUKKyAgICAvLyBjbGFzcywgdGhlIG9ubHkgc2xpc3QgYmVuZWZpdCBpcyBmcm9tIGhhdmluZyB0byBzZXQgZmV3ZXIgbGlua3MsIHNvCisgICAgLy8gdGhlIGZhY3RvciBGIHNob3VsZCBiZSBtdWNoIHNtYWxsZXIsIGNsb3NlciB0byAwIHRoYW4gdG8gMS4KKyAgICAvLyBUaGlzIGNvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHBhc3NpbmcgdGhlIHNpemUgY2xhc3NlcyBpbiB0aGUgY29uZmlnIAorICAgIC8vIGZpbGUuICBGb3Igbm93LCB3ZSBhbHdheXMgYXNzdW1lIEYgdG8gYmUgMS4KKworICAgIGZsb2F0CisgICAgX19tYWduaXR1ZGUoKSBjb25zdAorICAgIHsKKyAgICAgIGlmICghX01fcmV3aW5kKQorCXJldHVybiBfTV9vcGVyYXRpb25zOworICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KKyAgICAKKyAgICB2b2lkCisgICAgX19tZXJnZShjb25zdCBfX2xpc3Qyc2xpc3RfaW5mbyYpIHsgfQorCisgICAgdm9pZAorICAgIF9fd3JpdGUoRklMRSogX19mKSBjb25zdAorICAgIHsgc3RkOjpmcHJpbnRmKF9fZiwgIiVzXG4iLCBfTV9yZXdpbmQgPyAiaW52YWxpZCIgOiAidmFsaWQiKTsgfQorCisgICAgc3RkOjpzdHJpbmcKKyAgICBfX2FkdmljZSgpIGNvbnN0CisgICAgeyByZXR1cm4gImNoYW5nZSBzdGQ6Omxpc3QgdG8gc3RkOjpmb3J3YXJkX2xpc3QiOyB9CisKKyAgICB2b2lkCisgICAgX19vcHJfcmV3aW5kKCkKKyAgICB7CisgICAgICBfTV9yZXdpbmQgPSB0cnVlOworICAgICAgX01fdmFsaWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19yZWNvcmRfb3BlcmF0aW9uKCkKKyAgICB7ICsrX01fb3BlcmF0aW9uczsgfQorCisgICAgYm9vbAorICAgIF9faGFzX3Jld2luZCgpCisgICAgeyByZXR1cm4gX01fcmV3aW5kOyB9CisKKyAgcHJpdmF0ZToKKyAgICBib29sIF9NX3Jld2luZDsKKyAgICBzdGQ6OnNpemVfdCBfTV9vcGVyYXRpb25zOworICB9OworCisgIGNsYXNzIF9fbGlzdDJzbGlzdF9zdGFja19pbmZvCisgIDogcHVibGljIF9fbGlzdDJzbGlzdF9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIF9fbGlzdDJzbGlzdF9zdGFja19pbmZvKGNvbnN0IF9fbGlzdDJzbGlzdF9pbmZvJiBfX28pIAorICAgIDogX19saXN0MnNsaXN0X2luZm8oX19vKSB7IH0KKyAgfTsKKworICBjbGFzcyBfX3RyYWNlX2xpc3RfdG9fc2xpc3QKKyAgOiBwdWJsaWMgX190cmFjZV9iYXNlPF9fbGlzdDJzbGlzdF9pbmZvLCBfX2xpc3Qyc2xpc3Rfc3RhY2tfaW5mbz4gCisgIHsKKyAgcHVibGljOgorICAgIH5fX3RyYWNlX2xpc3RfdG9fc2xpc3QoKSB7IH0KKworICAgIF9fdHJhY2VfbGlzdF90b19zbGlzdCgpCisgICAgOiBfX3RyYWNlX2Jhc2U8X19saXN0MnNsaXN0X2luZm8sIF9fbGlzdDJzbGlzdF9zdGFja19pbmZvPigpCisgICAgeyBfX2lkID0gImxpc3QtdG8tc2xpc3QiOyB9CisKKyAgICB2b2lkCisgICAgX19vcHJfcmV3aW5kKGNvbnN0IHZvaWQqIF9fb2JqKQorICAgIHsKKyAgICAgIF9fbGlzdDJzbGlzdF9pbmZvKiBfX3JlcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmIChfX3JlcykKKwlfX3Jlcy0+X19vcHJfcmV3aW5kKCk7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fcmVjb3JkX29wZXJhdGlvbihjb25zdCB2b2lkKiBfX29iaikKKyAgICB7CisgICAgICBfX2xpc3Qyc2xpc3RfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoX19yZXMpCisJX19yZXMtPl9fcmVjb3JkX29wZXJhdGlvbigpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX2luc2VydChjb25zdCBfX29iamVjdF90IF9fb2JqLCBfX3N0YWNrX3QgX19zdGFjaykKKyAgICB7IF9fYWRkX29iamVjdChfX29iaiwgX19saXN0MnNsaXN0X2luZm8oX19zdGFjaykpOyB9CisgIAorICAgIHZvaWQKKyAgICBfX2Rlc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqKQorICAgIHsKKyAgICAgIGlmICghX19pc19vbigpKQorCXJldHVybjsKKworICAgICAgX19saXN0MnNsaXN0X2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKCFfX3JlcykKKwlyZXR1cm47CisKKyAgICAgIF9fcmV0aXJlX29iamVjdChfX29iaik7CisgICAgfQorICB9OworCisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3NsaXN0X2luaXQoKQorICB7IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3NsaXN0KSA9IG5ldyBfX3RyYWNlX2xpc3RfdG9fc2xpc3QoKTsgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbGlzdF90b19zbGlzdF9yZXBvcnQoRklMRSogX19mLCBfX3dhcm5pbmdfdmVjdG9yX3QmIF9fd2FybmluZ3MpCisgIHsKKyAgICBpZiAoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fc2xpc3QpKQorICAgICAgeworCV9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3NsaXN0KS0+CisJICBfX2NvbGxlY3Rfd2FybmluZ3MoX193YXJuaW5ncyk7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fc2xpc3QpLT5fX3dyaXRlKF9fZik7CisgICAgICB9CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fc2xpc3RfcmV3aW5kKGNvbnN0IHZvaWQqIF9fb2JqKSAKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3NsaXN0KS0+X19vcHJfcmV3aW5kKF9fb2JqKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbGlzdF90b19zbGlzdF9vcGVyYXRpb24oY29uc3Qgdm9pZCogX19vYmopIAorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fc2xpc3QpLT5fX3JlY29yZF9vcGVyYXRpb24oX19vYmopOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3NsaXN0X2NvbnN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3NsaXN0KS0+X19pbnNlcnQoX19vYmosIF9fZ2V0X3N0YWNrKCkpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3NsaXN0X2Rlc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fc2xpc3QpLT5fX2Rlc3RydWN0KF9fb2JqKTsKKyAgfQorCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wcm9maWxlCisjZW5kaWYgLyogX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9MSVNUX1RPX1NMSVNUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2xpc3RfdG9fdmVjdG9yLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9saXN0X3RvX3ZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjE0MzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9saXN0X3RvX3ZlY3Rvci5oCkBAIC0wLDAgKzEsMzI0IEBACisvLyAtKi0gQysrIC0qLQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvaW1wbC9wcm9maWxlcl9saXN0X3RvX3ZlY3Rvci5oCisgKiAgQGJyaWVmIGRpYWdub3N0aWNzIGZvciBsaXN0IHRvIHZlY3Rvci4KKyAqLworCisvLyBXcml0dGVuIGJ5IENoYW5naGVlIEp1bmcuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9MSVNUX1RPX1ZFQ1RPUl9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTElTVF9UT19WRUNUT1JfSCAxCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfdHJhY2UuaCIKKworbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKK3sKKyAgLyoqIEBicmllZiBBIGxpc3QtdG8tdmVjdG9yIGluc3RydW1lbnRhdGlvbiBsaW5lIGluIHRoZSBvYmplY3QgdGFibGUuICAqLworICBjbGFzcyBfX2xpc3QydmVjdG9yX2luZm8KKyAgOiBwdWJsaWMgX19vYmplY3RfaW5mb19iYXNlCisgIHsKKyAgcHVibGljOgorICAgIF9fbGlzdDJ2ZWN0b3JfaW5mbygpCisgICAgOiBfTV9zaGlmdF9jb3VudCgwKSwgX01faXRlcmF0ZSgwKSwgX01fcmVzaXplKDApLCBfTV9saXN0X2Nvc3QoMCksCisgICAgICBfTV92ZWN0b3JfY29zdCgwKSwgX01fdmFsaWQodHJ1ZSksIF9NX21heF9zaXplKDApIHsgfQorCisgICAgX19saXN0MnZlY3Rvcl9pbmZvKF9fc3RhY2tfdCBfX3N0YWNrKQorICAgIDogX19vYmplY3RfaW5mb19iYXNlKF9fc3RhY2spLCBfTV9zaGlmdF9jb3VudCgwKSwgX01faXRlcmF0ZSgwKSwKKyAgICAgIF9NX3Jlc2l6ZSgwKSwgX01fbGlzdF9jb3N0KDApLCBfTV92ZWN0b3JfY29zdCgwKSwgX01fdmFsaWQodHJ1ZSksCisgICAgICBfTV9tYXhfc2l6ZSgwKSB7IH0KKworICAgIHZpcnR1YWwgfl9fbGlzdDJ2ZWN0b3JfaW5mbygpIHsgfQorCisgICAgX19saXN0MnZlY3Rvcl9pbmZvKGNvbnN0IF9fbGlzdDJ2ZWN0b3JfaW5mbyYgX19vKQorICAgIDogX19vYmplY3RfaW5mb19iYXNlKF9fbyksIF9NX3NoaWZ0X2NvdW50KF9fby5fTV9zaGlmdF9jb3VudCksCisgICAgICBfTV9pdGVyYXRlKF9fby5fTV9pdGVyYXRlKSwgX01fcmVzaXplKF9fby5fTV9yZXNpemUpLAorICAgICAgX01fbGlzdF9jb3N0KF9fby5fTV9saXN0X2Nvc3QpLCBfTV92ZWN0b3JfY29zdChfX28uX01fdmVjdG9yX2Nvc3QpLAorICAgICAgX01fdmFsaWQoX19vLl9NX3ZhbGlkKSwgX01fbWF4X3NpemUoX19vLl9NX21heF9zaXplKSB7IH0KKworICAgIHZvaWQKKyAgICBfX21lcmdlKGNvbnN0IF9fbGlzdDJ2ZWN0b3JfaW5mbyYgX19vKQorICAgIHsKKyAgICAgIF9NX3NoaWZ0X2NvdW50ICArPSBfX28uX01fc2hpZnRfY291bnQ7CisgICAgICBfTV9pdGVyYXRlICAgICAgKz0gX19vLl9NX2l0ZXJhdGU7CisgICAgICBfTV92ZWN0b3JfY29zdCAgKz0gX19vLl9NX3ZlY3Rvcl9jb3N0OworICAgICAgX01fbGlzdF9jb3N0ICAgICs9IF9fby5fTV9saXN0X2Nvc3Q7CisgICAgICBfTV92YWxpZCAgICAgICAgJj0gX19vLl9NX3ZhbGlkOworICAgICAgX01fcmVzaXplICAgICAgICs9IF9fby5fTV9yZXNpemU7CisgICAgICBfTV9tYXhfc2l6ZSAgICAgPSBzdGQ6Om1heCggX01fbWF4X3NpemUsIF9fby5fTV9tYXhfc2l6ZSk7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fd3JpdGUoRklMRSogX19mKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6ZnByaW50ZihfX2YsICIlWnUgJVp1ICVadSAlLjBmICUuMGZcbiIsIF9NX3NoaWZ0X2NvdW50LAorCQkgICBfTV9yZXNpemUsIF9NX2l0ZXJhdGUsIF9NX3ZlY3Rvcl9jb3N0LCBfTV9saXN0X2Nvc3QpOworICAgIH0KKworICAgIGZsb2F0CisgICAgX19tYWduaXR1ZGUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2xpc3RfY29zdCAtIF9NX3ZlY3Rvcl9jb3N0OyB9CisgIAorICAgIHN0ZDo6c3RyaW5nCisgICAgX19hZHZpY2UoKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIF9fc3N0cmVhbTsKKyAgICAgIF9fc3N0cmVhbSAKKwk8PCAiY2hhbmdlIHN0ZDo6bGlzdCB0byBzdGQ6OnZlY3RvciBhbmQgaXRzIGluaXRpYWwgc2l6ZSBmcm9tIDAgdG8gIgorCTw8IF9NX21heF9zaXplOworICAgICAgcmV0dXJuIF9fc3N0cmVhbS5zdHIoKTsKKyAgICB9CisKKyAgICBzdGQ6OnNpemVfdAorICAgIF9fc2hpZnRfY291bnQoKQorICAgIHsgcmV0dXJuIF9NX3NoaWZ0X2NvdW50OyB9CisgIAorICAgIHN0ZDo6c2l6ZV90CisgICAgX19pdGVyYXRlKCkKKyAgICB7IHJldHVybiBfTV9pdGVyYXRlOyB9CisgIAorICAgIGZsb2F0CisgICAgX19saXN0X2Nvc3QoKQorICAgIHsgcmV0dXJuIF9NX2xpc3RfY29zdDsgfQorICAKKyAgICBzdGQ6OnNpemVfdAorICAgIF9fcmVzaXplKCkKKyAgICB7IHJldHVybiBfTV9yZXNpemU7IH0KKyAgCisgICAgdm9pZAorICAgIF9fc2V0X2xpc3RfY29zdChmbG9hdCBfX2xjKQorICAgIHsgX01fbGlzdF9jb3N0ID0gX19sYzsgfQorICAgIAorICAgIHZvaWQKKyAgICBfX3NldF92ZWN0b3JfY29zdChmbG9hdCBfX3ZjKQorICAgIHsgX01fdmVjdG9yX2Nvc3QgPSBfX3ZjOyB9CisgICAgCisgICAgYm9vbAorICAgIF9faXNfdmFsaWQoKQorICAgIHsgcmV0dXJuIF9NX3ZhbGlkOyB9CisgICAgCisgICAgdm9pZAorICAgIF9fc2V0X2ludmFsaWQoKQorICAgIHsgX01fdmFsaWQgPSBmYWxzZTsgfQorCisgICAgdm9pZAorICAgIF9fb3ByX2luc2VydChzdGQ6OnNpemVfdCBfX3NoaWZ0LCBzdGQ6OnNpemVfdCBfX3NpemUpCisgICAgeworICAgICAgX01fc2hpZnRfY291bnQgKz0gX19zaGlmdDsKKyAgICAgIF9NX21heF9zaXplID0gc3RkOjptYXgoX01fbWF4X3NpemUsIF9fc2l6ZSk7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fb3ByX2l0ZXJhdGUoc3RkOjpzaXplX3QgX19udW0pCisgICAgeyBfTV9pdGVyYXRlICs9IF9fbnVtO30KKworICAgIHZvaWQKKyAgICBfX3Jlc2l6ZShzdGQ6OnNpemVfdCBfX2Zyb20sIHN0ZDo6c2l6ZV90KQorICAgIHsgX01fcmVzaXplICs9IF9fZnJvbTsgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpzaXplX3QgX01fc2hpZnRfY291bnQ7CisgICAgc3RkOjpzaXplX3QgX01faXRlcmF0ZTsKKyAgICBzdGQ6OnNpemVfdCBfTV9yZXNpemU7CisgICAgZmxvYXQgX01fbGlzdF9jb3N0OworICAgIGZsb2F0IF9NX3ZlY3Rvcl9jb3N0OworICAgIGJvb2wgIF9NX3ZhbGlkOworICAgIHN0ZDo6c2l6ZV90IF9NX21heF9zaXplOworICB9OworCisgIGNsYXNzIF9fbGlzdDJ2ZWN0b3Jfc3RhY2tfaW5mbyAKKyAgOiBwdWJsaWMgX19saXN0MnZlY3Rvcl9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIF9fbGlzdDJ2ZWN0b3Jfc3RhY2tfaW5mbyhjb25zdCBfX2xpc3QydmVjdG9yX2luZm8mIF9fbykgCisgICAgOiBfX2xpc3QydmVjdG9yX2luZm8oX19vKSB7fQorICB9OworCisgIGNsYXNzIF9fdHJhY2VfbGlzdF90b192ZWN0b3IKKyAgOiBwdWJsaWMgX190cmFjZV9iYXNlPF9fbGlzdDJ2ZWN0b3JfaW5mbywgX19saXN0MnZlY3Rvcl9zdGFja19pbmZvPiAKKyAgeworICBwdWJsaWM6CisgICAgX190cmFjZV9saXN0X3RvX3ZlY3RvcigpCisgICAgOiBfX3RyYWNlX2Jhc2U8X19saXN0MnZlY3Rvcl9pbmZvLCBfX2xpc3QydmVjdG9yX3N0YWNrX2luZm8+KCkKKyAgICB7IF9faWQgPSAibGlzdC10by12ZWN0b3IiOyB9CisKKyAgICB+X190cmFjZV9saXN0X3RvX3ZlY3RvcigpIHsgfQorCisgICAgLy8gSW5zZXJ0IGEgbmV3IG5vZGUgYXQgY29uc3RydWN0IHdpdGggb2JqZWN0LCBjYWxsc3RhY2sgYW5kIGluaXRpYWwgc2l6ZS4KKyAgICB2b2lkCisgICAgX19pbnNlcnQoX19vYmplY3RfdCBfX29iaiwgX19zdGFja190IF9fc3RhY2spCisgICAgeyBfX2FkZF9vYmplY3QoX19vYmosIF9fbGlzdDJ2ZWN0b3JfaW5mbyhfX3N0YWNrKSk7IH0KKworICAgIC8vIENhbGwgYXQgZGVzdHJ1Y3Rpb24vY2xlYW4gdG8gc2V0IGNvbnRhaW5lciBmaW5hbCBzaXplLgorICAgIHZvaWQKKyAgICBfX2Rlc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqKQorICAgIHsKKyAgICAgIGlmICghX19pc19vbigpKQorCXJldHVybjsKKworICAgICAgX19saXN0MnZlY3Rvcl9pbmZvKiBfX3JlcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmICghX19yZXMpCisJcmV0dXJuOworCisgICAgICBmbG9hdCBfX3ZjID0gX192ZWN0b3JfY29zdChfX3Jlcy0+X19zaGlmdF9jb3VudCgpLCBfX3Jlcy0+X19pdGVyYXRlKCkpOworICAgICAgZmxvYXQgX19sYyA9IF9fbGlzdF9jb3N0KF9fcmVzLT5fX3NoaWZ0X2NvdW50KCksIF9fcmVzLT5fX2l0ZXJhdGUoKSk7CisgICAgICBfX3Jlcy0+X19zZXRfdmVjdG9yX2Nvc3QoX192Yyk7CisgICAgICBfX3Jlcy0+X19zZXRfbGlzdF9jb3N0KF9fbGMpOworICAgICAgX19yZXRpcmVfb2JqZWN0KF9fb2JqKTsKKyAgICB9CisKKyAgICAvLyBGaW5kIHRoZSBub2RlIGluIHRoZSBsaXZlIG1hcC4KKyAgICBfX2xpc3QydmVjdG9yX2luZm8qIF9fZmluZChjb25zdCB2b2lkKiBfX29iaik7CisKKyAgICAvLyBDb2xsZWN0IGNvc3Qgb2Ygb3BlcmF0aW9ucy4KKyAgICB2b2lkCisgICAgX19vcHJfaW5zZXJ0KGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX3NoaWZ0LCBzdGQ6OnNpemVfdCBfX3NpemUpCisgICAgeworICAgICAgX19saXN0MnZlY3Rvcl9pbmZvKiBfX3JlcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmIChfX3JlcykKKwlfX3Jlcy0+X19vcHJfaW5zZXJ0KF9fc2hpZnQsIF9fc2l6ZSk7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fb3ByX2l0ZXJhdGUoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fbnVtKQorICAgIHsKKyAgICAgIF9fbGlzdDJ2ZWN0b3JfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoX19yZXMpCisJX19yZXMtPl9fb3ByX2l0ZXJhdGUoX19udW0pOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX2ludmFsaWRfb3BlcmF0b3IoY29uc3Qgdm9pZCogX19vYmopCisgICAgeworICAgICAgX19saXN0MnZlY3Rvcl9pbmZvKiBfX3JlcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmIChfX3JlcykKKwlfX3Jlcy0+X19zZXRfaW52YWxpZCgpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX3Jlc2l6ZShjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19mcm9tLCBzdGQ6OnNpemVfdCBfX3RvKQorICAgIHsKKyAgICAgIF9fbGlzdDJ2ZWN0b3JfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoX19yZXMpCisJX19yZXMtPl9fcmVzaXplKF9fZnJvbSwgX190byk7CisgICAgfQorCisgICAgZmxvYXQKKyAgICBfX3ZlY3Rvcl9jb3N0KHN0ZDo6c2l6ZV90IF9fc2hpZnQsIHN0ZDo6c2l6ZV90IF9faXRlcmF0ZSkKKyAgICB7CisgICAgICAvLyBUaGUgcmVzdWx0aW5nIHZlY3RvciB3aWxsIHVzZSBhICdyZXNlcnZlJyBtZXRob2QuCisgICAgICByZXR1cm4gKF9fc2hpZnQKKwkgICAgICAqIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3ZlY3Rvcl9zaGlmdF9jb3N0X2ZhY3RvcikuX192YWx1ZQorCSAgICAgICsgX19pdGVyYXRlCisJICAgICAgKiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX192ZWN0b3JfaXRlcmF0ZV9jb3N0X2ZhY3RvcikuX192YWx1ZSk7IAorICAgIH0KKworICAgIGZsb2F0CisgICAgX19saXN0X2Nvc3Qoc3RkOjpzaXplX3QgX19zaGlmdCwgc3RkOjpzaXplX3QgX19pdGVyYXRlKQorICAgIHsKKyAgICAgIHJldHVybiAoX19zaGlmdAorCSAgICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbGlzdF9zaGlmdF9jb3N0X2ZhY3RvcikuX192YWx1ZQorCSAgICAgICsgX19pdGVyYXRlCisJICAgICAgKiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19saXN0X2l0ZXJhdGVfY29zdF9mYWN0b3IpLl9fdmFsdWUpOyAKKyAgICB9CisgIH07CisKKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2luaXQoKQorICB7IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3ZlY3RvcikgPSBuZXcgX190cmFjZV9saXN0X3RvX3ZlY3RvcigpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9yZXBvcnQoRklMRSogX19mLCBfX3dhcm5pbmdfdmVjdG9yX3QmIF9fd2FybmluZ3MpCisgIHsKKyAgICBpZiAoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fdmVjdG9yKSkKKyAgICAgIHsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b192ZWN0b3IpLT4KKwkgIF9fY29sbGVjdF93YXJuaW5ncyhfX3dhcm5pbmdzKTsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b192ZWN0b3IpLT5fX3dyaXRlKF9fZik7CisgICAgICB9CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2NvbnN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3ZlY3RvciktPl9faW5zZXJ0KF9fb2JqLCBfX2dldF9zdGFjaygpKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfZGVzdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b192ZWN0b3IpLT5fX2Rlc3RydWN0KF9fb2JqKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfaW5zZXJ0KGNvbnN0IHZvaWQqIF9fb2JqLCAKKwkJCQlzdGQ6OnNpemVfdCBfX3NoaWZ0LCBzdGQ6OnNpemVfdCBfX3NpemUpCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b192ZWN0b3IpLT5fX29wcl9pbnNlcnQoX19vYmosIF9fc2hpZnQsIAorCQkJCQkJCSAgIF9fc2l6ZSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2l0ZXJhdGUoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fbnVtID0gMSkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3ZlY3RvciktPl9fb3ByX2l0ZXJhdGUoX19vYmosIF9fbnVtKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfaW52YWxpZF9vcGVyYXRvcihjb25zdCB2b2lkKiBfX29iaikKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3ZlY3RvciktPl9faW52YWxpZF9vcGVyYXRvcihfX29iaik7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX3Jlc2l6ZShjb25zdCB2b2lkKiBfX29iaiwgCisJCQkJc3RkOjpzaXplX3QgX19mcm9tLCBzdGQ6OnNpemVfdCBfX3RvKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fdmVjdG9yKS0+X19yZXNpemUoX19vYmosIF9fZnJvbSwgX190byk7CisgIH0KKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcHJvZmlsZQorI2VuZGlmIC8qIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTElTVF9UT19WRUNUT1JfSF9fICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9tYXBfdG9fdW5vcmRlcmVkX21hcC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbWFwX3RvX3Vub3JkZXJlZF9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjU2YzA2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbWFwX3RvX3Vub3JkZXJlZF9tYXAuaApAQCAtMCwwICsxLDI5MCBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXJfbWFwX3RvX3Vub3JkZXJlZF9tYXAuaAorICogIEBicmllZiBEaWFnbm9zdGljcyBmb3IgbWFwIHRvIHVub3JkZXJlZF9tYXAuCisgKi8KKworLy8gV3JpdHRlbiBieSBTaWx2aXVzIFJ1cy4KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX01BUF9UT19VTk9SREVSRURfTUFQX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9NQVBfVE9fVU5PUkRFUkVEX01BUF9IIDEKKworI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlci5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9ub2RlLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3RyYWNlLmgiCisKK25hbWVzcGFjZSBfX2dudV9wcm9maWxlCit7CisgIGlubGluZSBpbnQKKyAgX19sb2cyKHN0ZDo6c2l6ZV90IF9fc2l6ZSkKKyAgeworICAgIGZvciAoaW50IF9fYml0X2NvdW50ID0gc2l6ZW9mKHN0ZDo6c2l6ZV90KSAtIDE7IF9fYml0X2NvdW50ID49IDA7CisJIC0tIF9fYml0X2NvdW50KSAKKyAgICAgIGlmICgoMiA8PCBfX2JpdF9jb3VudCkgJiBfX3NpemUpCisJcmV0dXJuIF9fYml0X2NvdW50OworICAgIHJldHVybiAwOworICB9CisKKyAgaW5saW5lIGZsb2F0CisgIF9fbWFwX2luc2VydF9jb3N0KHN0ZDo6c2l6ZV90IF9fc2l6ZSkKKyAgeyByZXR1cm4gKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX21hcF9pbnNlcnRfY29zdF9mYWN0b3IpLl9fdmFsdWUgCisJICAgICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KF9fbG9nMihfX3NpemUpKSk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgX19tYXBfZXJhc2VfY29zdChzdGQ6OnNpemVfdCBfX3NpemUpCisgIHsgcmV0dXJuIChfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19tYXBfZXJhc2VfY29zdF9mYWN0b3IpLl9fdmFsdWUKKwkgICAgKiBzdGF0aWNfY2FzdDxmbG9hdD4oX19sb2cyKF9fc2l6ZSkpKTsgfQorCisgIGlubGluZSBmbG9hdAorICBfX21hcF9maW5kX2Nvc3Qoc3RkOjpzaXplX3QgX19zaXplKQorICB7IHJldHVybiAoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbWFwX2ZpbmRfY29zdF9mYWN0b3IpLl9fdmFsdWUKKwkgICAgKiBzdGF0aWNfY2FzdDxmbG9hdD4oX19sb2cyKF9fc2l6ZSkpKTsgfQorCisgIC8qKiBAYnJpZWYgQSBtYXAtdG8tdW5vcmRlcmVkX21hcCBpbnN0cnVtZW50YXRpb24gbGluZSBpbiB0aGUgCisgICAgICBvYmplY3QgdGFibGUuICAqLworICBjbGFzcyBfX21hcDJ1bWFwX2luZm8KKyAgOiBwdWJsaWMgX19vYmplY3RfaW5mb19iYXNlCisgIHsKKyAgcHVibGljOgorICAgIF9fbWFwMnVtYXBfaW5mbygpCisgICAgOiBfTV9pbnNlcnQoMCksIF9NX2VyYXNlKDApLCBfTV9maW5kKDApLCBfTV9pdGVyYXRlKDApLAorICAgICAgX01fdW1hcF9jb3N0KDAuMCksIF9NX21hcF9jb3N0KDAuMCksIF9NX3ZhbGlkKHRydWUpIHsgfQorICAgIAorICAgIF9fbWFwMnVtYXBfaW5mbyhfX3N0YWNrX3QgX19zdGFjaykKKyAgICA6IF9fb2JqZWN0X2luZm9fYmFzZShfX3N0YWNrKSwgX01faW5zZXJ0KDApLCBfTV9lcmFzZSgwKSwgX01fZmluZCgwKSwgCisgICAgICBfTV9pdGVyYXRlKDApLCBfTV91bWFwX2Nvc3QoMC4wKSwgX01fbWFwX2Nvc3QoMC4wKSwgX01fdmFsaWQodHJ1ZSkgeyB9CisKKyAgICB2aXJ0dWFsIH5fX21hcDJ1bWFwX2luZm8oKSB7IH0KKworICAgIF9fbWFwMnVtYXBfaW5mbyhjb25zdCBfX21hcDJ1bWFwX2luZm8mIF9fbykKKyAgICA6IF9fb2JqZWN0X2luZm9fYmFzZShfX28pLCBfTV9pbnNlcnQoX19vLl9NX2luc2VydCksCisgICAgICBfTV9lcmFzZShfX28uX01fZXJhc2UpLCBfTV9maW5kKF9fby5fTV9maW5kKSwKKyAgICAgIF9NX2l0ZXJhdGUoX19vLl9NX2l0ZXJhdGUpLCBfTV91bWFwX2Nvc3QoX19vLl9NX3VtYXBfY29zdCksCisgICAgICBfTV9tYXBfY29zdChfX28uX01fbWFwX2Nvc3QpLCBfTV92YWxpZChfX28uX01fdmFsaWQpIHsgfQorCisgICAgdm9pZAorICAgIF9fbWVyZ2UoY29uc3QgX19tYXAydW1hcF9pbmZvJiBfX28pCisgICAgeworICAgICAgX01faW5zZXJ0ICAgICs9IF9fby5fTV9pbnNlcnQ7CisgICAgICBfTV9lcmFzZSAgICAgKz0gX19vLl9NX2VyYXNlOworICAgICAgX01fZmluZCAgICAgICs9IF9fby5fTV9maW5kOworICAgICAgX01fdW1hcF9jb3N0ICs9IF9fby5fTV91bWFwX2Nvc3Q7CisgICAgICBfTV9tYXBfY29zdCAgKz0gX19vLl9NX21hcF9jb3N0OworICAgICAgX01fdmFsaWQgICAgICY9IF9fby5fTV92YWxpZDsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX193cml0ZShGSUxFKiBfX2YpIGNvbnN0CisgICAgeworICAgICAgc3RkOjpmcHJpbnRmKF9fZiwgIiVadSAlWnUgJVp1ICVadSAlLjBmICUuMGYgJXNcbiIsCisJCSAgIF9NX2luc2VydCwgX01fZXJhc2UsIF9NX2ZpbmQsIF9NX2l0ZXJhdGUsIF9NX21hcF9jb3N0LAorCQkgICBfTV91bWFwX2Nvc3QsIF9NX3ZhbGlkID8gInZhbGlkIiA6ICJpbnZhbGlkIik7CisgICAgfQorCisgICAgZmxvYXQKKyAgICBfX21hZ25pdHVkZSgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fbWFwX2Nvc3QgLSBfTV91bWFwX2Nvc3Q7IH0KKworICAgIHN0ZDo6c3RyaW5nCisgICAgX19hZHZpY2UoKSBjb25zdAorICAgIHsgcmV0dXJuICJjaGFuZ2Ugc3RkOjptYXAgdG8gc3RkOjp1bm9yZGVyZWRfbWFwIjsgfQorCisgICAgdm9pZAorICAgIF9fcmVjb3JkX2luc2VydChzdGQ6OnNpemVfdCBfX3NpemUsIHN0ZDo6c2l6ZV90IF9fY291bnQpCisgICAgeworICAgICAgX01faW5zZXJ0ICs9IF9fY291bnQ7CisgICAgICBfTV9tYXBfY29zdCArPSBfX2NvdW50ICogX19tYXBfaW5zZXJ0X2Nvc3QoX19zaXplKTsKKyAgICAgIF9NX3VtYXBfY29zdAorCSs9IChfX2NvdW50CisJICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdW1hcF9pbnNlcnRfY29zdF9mYWN0b3IpLl9fdmFsdWUpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX3JlY29yZF9lcmFzZShzdGQ6OnNpemVfdCBfX3NpemUsIHN0ZDo6c2l6ZV90IF9fY291bnQpCisgICAgeworICAgICAgX01fZXJhc2UgKz0gX19jb3VudDsKKyAgICAgIF9NX21hcF9jb3N0ICs9IF9fY291bnQgKiBfX21hcF9lcmFzZV9jb3N0KF9fc2l6ZSk7CisgICAgICBfTV91bWFwX2Nvc3QKKwkrPSAoX19jb3VudAorCSAgICAqIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3VtYXBfZXJhc2VfY29zdF9mYWN0b3IpLl9fdmFsdWUpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX3JlY29yZF9maW5kKHN0ZDo6c2l6ZV90IF9fc2l6ZSkKKyAgICB7CisgICAgICBfTV9maW5kICs9IDE7CisgICAgICBfTV9tYXBfY29zdCArPSBfX21hcF9maW5kX2Nvc3QoX19zaXplKTsKKyAgICAgIF9NX3VtYXBfY29zdCArPSBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX191bWFwX2ZpbmRfY29zdF9mYWN0b3IpLl9fdmFsdWU7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fcmVjb3JkX2l0ZXJhdGUoc3RkOjpzaXplX3QgX19jb3VudCkKKyAgICB7CisgICAgICBfTV9pdGVyYXRlICs9IF9fY291bnQ7CisgICAgICBfTV9tYXBfY29zdAorCSs9IChfX2NvdW50CisJICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbWFwX2l0ZXJhdGVfY29zdF9mYWN0b3IpLl9fdmFsdWUpOworICAgICAgX01fdW1hcF9jb3N0CisJKz0gKF9fY291bnQKKwkgICAgKiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX191bWFwX2l0ZXJhdGVfY29zdF9mYWN0b3IpLl9fdmFsdWUpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX3JlY29yZF9pbnZhbGlkYXRlKCkKKyAgICB7IF9NX3ZhbGlkID0gZmFsc2U7IH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6c2l6ZV90IF9NX2luc2VydDsKKyAgICBzdGQ6OnNpemVfdCBfTV9lcmFzZTsKKyAgICBzdGQ6OnNpemVfdCBfTV9maW5kOworICAgIHN0ZDo6c2l6ZV90IF9NX2l0ZXJhdGU7CisgICAgZmxvYXQgX01fdW1hcF9jb3N0OworICAgIGZsb2F0IF9NX21hcF9jb3N0OworICAgIGJvb2wgIF9NX3ZhbGlkOworICB9OworCisKKyAgLyoqIEBicmllZiBBIG1hcC10by11bm9yZGVyZWRfbWFwIGluc3RydW1lbnRhdGlvbiBsaW5lIGluIHRoZSAKKyAgICAgIHN0YWNrIHRhYmxlLiAgKi8KKyAgY2xhc3MgX19tYXAydW1hcF9zdGFja19pbmZvIAorICA6IHB1YmxpYyBfX21hcDJ1bWFwX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgX19tYXAydW1hcF9zdGFja19pbmZvKGNvbnN0IF9fbWFwMnVtYXBfaW5mbyYgX19vKQorICAgIDogX19tYXAydW1hcF9pbmZvKF9fbykgeyB9CisgIH07CisKKyAgLyoqIEBicmllZiBNYXAtdG8tdW5vcmRlcmVkX21hcCBpbnN0cnVtZW50YXRpb24gcHJvZHVjZXIuICAqLworICBjbGFzcyBfX3RyYWNlX21hcDJ1bWFwCisgIDogcHVibGljIF9fdHJhY2VfYmFzZTxfX21hcDJ1bWFwX2luZm8sIF9fbWFwMnVtYXBfc3RhY2tfaW5mbz4gCisgIHsKKyAgcHVibGljOgorICAgIF9fdHJhY2VfbWFwMnVtYXAoKQorICAgIDogX190cmFjZV9iYXNlPF9fbWFwMnVtYXBfaW5mbywgX19tYXAydW1hcF9zdGFja19pbmZvPigpCisgICAgeyBfX2lkID0gIm1hcC10by11bm9yZGVyZWQtbWFwIjsgfQorICB9OworCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5pdCgpCisgIHsgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21hcDJ1bWFwKSA9IG5ldyBfX3RyYWNlX21hcDJ1bWFwKCk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX3JlcG9ydChGSUxFKiBfX2YsCisJCQkJICAgICAgX193YXJuaW5nX3ZlY3Rvcl90JiBfX3dhcm5pbmdzKQorICB7CisgICAgaWYgKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCkpIAorICAgICAgeworCV9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCktPl9fY29sbGVjdF93YXJuaW5ncyhfX3dhcm5pbmdzKTsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWFwMnVtYXApLT5fX3dyaXRlKF9fZik7CisgICAgICB9CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2NvbnN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCktPgorICAgICAgX19hZGRfb2JqZWN0KF9fb2JqLCBfX21hcDJ1bWFwX2luZm8oX19nZXRfc3RhY2soKSkpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCktPl9fcmV0aXJlX29iamVjdChfX29iaik7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydChjb25zdCB2b2lkKiBfX29iaiwgCisJCQkJICAgICAgc3RkOjpzaXplX3QgX19zaXplLCBzdGQ6OnNpemVfdCBfX2NvdW50KQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX19tYXAydW1hcF9pbmZvKiBfX2luZm8KKyAgICAgID0gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21hcDJ1bWFwKS0+X19nZXRfb2JqZWN0X2luZm8oX19vYmopOworCisgICAgaWYgKF9faW5mbykKKyAgICAgIF9faW5mby0+X19yZWNvcmRfaW5zZXJ0KF9fc2l6ZSwgX19jb3VudCk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2VyYXNlKGNvbnN0IHZvaWQqIF9fb2JqLCAKKwkJCQkgICAgIHN0ZDo6c2l6ZV90IF9fc2l6ZSwgc3RkOjpzaXplX3QgX19jb3VudCkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkgCisgICAgICByZXR1cm47CisKKyAgICBfX21hcDJ1bWFwX2luZm8qIF9faW5mbyAKKyAgICAgID0gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21hcDJ1bWFwKS0+X19nZXRfb2JqZWN0X2luZm8oX19vYmopOworCisgICAgaWYgKF9faW5mbykKKyAgICAgIF9faW5mby0+X19yZWNvcmRfZXJhc2UoX19zaXplLCBfX2NvdW50KTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19zaXplKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX19tYXAydW1hcF9pbmZvKiBfX2luZm8KKyAgICAgID0gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21hcDJ1bWFwKS0+X19nZXRfb2JqZWN0X2luZm8oX19vYmopOworCisgICAgaWYgKF9faW5mbykKKyAgICAgIF9faW5mby0+X19yZWNvcmRfZmluZChfX3NpemUpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9pdGVyYXRlKGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX2NvdW50KQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX19tYXAydW1hcF9pbmZvKiBfX2luZm8KKyAgICAgID0gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21hcDJ1bWFwKS0+X19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgIAorICAgIGlmIChfX2luZm8pCisgICAgICBfX2luZm8tPl9fcmVjb3JkX2l0ZXJhdGUoX19jb3VudCk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfX21hcDJ1bWFwX2luZm8qIF9faW5mbworICAgICAgPSBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWFwMnVtYXApLT5fX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisKKyAgICBpZiAoX19pbmZvKQorICAgICAgX19pbmZvLT5fX3JlY29yZF9pbnZhbGlkYXRlKCk7CisgIH0KKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcHJvZmlsZQorI2VuZGlmIC8qIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTUFQX1RPX1VOT1JERVJFRF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZWNhMzEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9ub2RlLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaAorICogIEBicmllZiBEYXRhIHN0cnVjdHVyZXMgdG8gcmVwcmVzZW50IGEgc2luZ2xlIHByb2ZpbGluZyBldmVudC4KKyAqLworCisvLyBXcml0dGVuIGJ5IExpeGlhIExpdSBhbmQgU2lsdml1cyBSdXMuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9OT0RFX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9OT0RFX0ggMQorCisjaW5jbHVkZSA8Y3N0ZGlvPiAvLyBGSUxFLCBmcHJpbnRmCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaWYgZGVmaW5lZCBfR0xJQkNYWF9IQVZFX0VYRUNJTkZPX0gKKyNpbmNsdWRlIDxleGVjaW5mby5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9wcm9maWxlCit7CisgIHR5cGVkZWYgY29uc3Qgdm9pZCogX19vYmplY3RfdDsKKyAgdHlwZWRlZiB2b2lkKiBfX2luc3RydWN0aW9uX2FkZHJlc3NfdDsKKyAgdHlwZWRlZiBzdGQ6Ol9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8X19pbnN0cnVjdGlvbl9hZGRyZXNzX3Q+IF9fc3RhY2tfbnB0OworICB0eXBlZGVmIF9fc3RhY2tfbnB0KiBfX3N0YWNrX3Q7CisKKyAgc3RkOjpzaXplX3QgX19zdGFja19tYXhfZGVwdGgoKTsKKworICBpbmxpbmUgX19zdGFja190CisgIF9fZ2V0X3N0YWNrKCkKKyAgeworI2lmIGRlZmluZWQgX0dMSUJDWFhfSEFWRV9FWEVDSU5GT19ICisgICAgc3RkOjpzaXplX3QgX19tYXhfZGVwdGggPSBfX3N0YWNrX21heF9kZXB0aCgpOworICAgIGlmIChfX21heF9kZXB0aCA9PSAwKQorICAgICAgcmV0dXJuIDA7CisgICAgX19zdGFja19ucHQgX19idWZmZXIoX19tYXhfZGVwdGgpOworICAgIGludCBfX2RlcHRoID0gYmFja3RyYWNlKCZfX2J1ZmZlclswXSwgX19tYXhfZGVwdGgpOworICAgIF9fc3RhY2tfdCBfX3N0YWNrID0gbmV3IF9fc3RhY2tfbnB0KF9fZGVwdGgpOworICAgIF9fYnVpbHRpbl9tZW1jcHkoJigqX19zdGFjaylbMF0sICZfX2J1ZmZlclswXSwKKwkJICAgICBfX2RlcHRoICogc2l6ZW9mKF9fb2JqZWN0X3QpKTsKKyAgICByZXR1cm4gX19zdGFjazsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgfQorCisgIGlubGluZSBzdGQ6OnNpemVfdAorICBfX3NpemUoX19zdGFja190IF9fc3RhY2spCisgIHsKKyAgICBpZiAoIV9fc3RhY2spCisgICAgICByZXR1cm4gMDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gX19zdGFjay0+c2l6ZSgpOworICB9CisKKyAgLy8gWFhYCisgIGlubGluZSB2b2lkCisgIF9fd3JpdGUoRklMRSogX19mLCBfX3N0YWNrX3QgX19zdGFjaykKKyAgeworICAgIGlmICghX19zdGFjaykKKyAgICAgIHJldHVybjsKKyAgCisgICAgX19zdGFja19ucHQ6OmNvbnN0X2l0ZXJhdG9yIF9faXQ7CisgICAgZm9yIChfX2l0ID0gX19zdGFjay0+YmVnaW4oKTsgX19pdCAhPSBfX3N0YWNrLT5lbmQoKTsgKytfX2l0KQorICAgICAgc3RkOjpmcHJpbnRmKF9fZiwgIiVwICIsICpfX2l0KTsKKyAgfQorCisgIC8qKiBAYnJpZWYgSGFzaCBmdW5jdGlvbiBmb3Igc3VtbWFyeSB0cmFjZSB1c2luZyBjYWxsIHN0YWNrIGFzIGluZGV4LiAgKi8KKyAgY2xhc3MgX19zdGFja19oYXNoIAorICB7CisgIHB1YmxpYzoKKyAgICBzdGQ6OnNpemVfdAorICAgIG9wZXJhdG9yKCkoX19zdGFja190IF9fcykgY29uc3QKKyAgICB7CisgICAgICBpZiAoIV9fcykgCisJcmV0dXJuIDA7CisKKyAgICAgIHN0ZDo6c2l6ZV90IF9faW5kZXggPSAwOworICAgICAgX19zdGFja19ucHQ6OmNvbnN0X2l0ZXJhdG9yIF9faXQ7CisgICAgICBmb3IgKF9faXQgPSBfX3MtPmJlZ2luKCk7IF9faXQgIT0gX19zLT5lbmQoKTsgKytfX2l0KQorCV9faW5kZXggKz0gcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnNpemVfdD4oKl9faXQpOworICAgICAgcmV0dXJuIF9faW5kZXg7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcigpIChfX3N0YWNrX3QgX19zdGFjazEsIF9fc3RhY2tfdCBfX3N0YWNrMikgY29uc3QKKyAgICB7CisgICAgICBpZiAoIV9fc3RhY2sxICYmICFfX3N0YWNrMikKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIGlmICghX19zdGFjazEgfHwgIV9fc3RhY2syKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmIChfX3N0YWNrMS0+c2l6ZSgpICE9IF9fc3RhY2syLT5zaXplKCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBzdGQ6OnNpemVfdCBfX2J5dGVfc2l6ZQorCT0gX19zdGFjazEtPnNpemUoKSAqIHNpemVvZihfX3N0YWNrX25wdDo6dmFsdWVfdHlwZSk7CisgICAgICByZXR1cm4gX19idWlsdGluX21lbWNtcCgmKCpfX3N0YWNrMSlbMF0sICYoKl9fc3RhY2syKVswXSwKKwkJCSAgICAgIF9fYnl0ZV9zaXplKSA9PSAwOworICAgIH0KKyAgfTsKKworCisgIC8qKiBAYnJpZWYgQmFzZSBjbGFzcyBmb3IgYSBsaW5lIGluIHRoZSBvYmplY3QgdGFibGUuICAqLworICBjbGFzcyBfX29iamVjdF9pbmZvX2Jhc2UKKyAgeworICBwdWJsaWM6CisgICAgX19vYmplY3RfaW5mb19iYXNlKCkgeyB9CisKKyAgICBfX29iamVjdF9pbmZvX2Jhc2UoX19zdGFja190IF9fc3RhY2spCisgICAgOiBfTV9zdGFjayhfX3N0YWNrKSwgX01fdmFsaWQodHJ1ZSkgeyB9CisKKyAgICBfX29iamVjdF9pbmZvX2Jhc2UoY29uc3QgX19vYmplY3RfaW5mb19iYXNlJiBfX28pCisgICAgOiBfTV9zdGFjayhfX28uX01fc3RhY2spLCBfTV92YWxpZChfX28uX01fdmFsaWQpIHsgfQorCisgICAgdmlydHVhbCB+X19vYmplY3RfaW5mb19iYXNlKCkgeyB9CisKKyAgICBib29sCisgICAgX19pc192YWxpZCgpIGNvbnN0IAorICAgIHsgcmV0dXJuIF9NX3ZhbGlkOyB9CisgICAgCisgICAgX19zdGFja190CisgICAgX19zdGFjaygpIGNvbnN0CisgICAgeyByZXR1cm4gX01fc3RhY2s7IH0KKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgX193cml0ZShGSUxFKiBfX2YpIGNvbnN0ID0gMDsKKworICBwcm90ZWN0ZWQ6CisgICAgX19zdGFja190IF9NX3N0YWNrOworICAgIGJvb2wgX01fdmFsaWQ7CisgIH07CisKKworICAvKiogQGJyaWVmIEJhc2UgY2xhc3MgZm9yIGEgbGluZSBpbiB0aGUgc3RhY2sgdGFibGUuICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfX29iamVjdF9pbmZvPgorICAgIGNsYXNzIF9fc3RhY2tfaW5mb19iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIF9fc3RhY2tfaW5mb19iYXNlKCkgeyB9CisgICAgICBfX3N0YWNrX2luZm9fYmFzZShjb25zdCBfX29iamVjdF9pbmZvJiBfX2luZm8pID0gMDsKKyAgICAgIHZpcnR1YWwgfl9fc3RhY2tfaW5mb19iYXNlKCkge30KKyAgICAgIHZvaWQgX19tZXJnZShjb25zdCBfX29iamVjdF9pbmZvJiBfX2luZm8pID0gMDsKKyAgICAgIHZpcnR1YWwgZmxvYXQgX19tYWduaXR1ZGUoKSBjb25zdCA9IDA7CisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9fZ2V0X2lkKCkgY29uc3QgPSAwOworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX05PREVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfc3RhdGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzOTcwNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3N0YXRlLmgKQEAgLTAsMCArMSw2OSBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXJfc3RhdGUuaAorICogIEBicmllZiBHbG9iYWwgcHJvZmlsZXIgc3RhdGUuCisgKi8KKworLy8gV3JpdHRlbiBieSBMaXhpYSBMaXUgYW5kIFNpbHZpdXMgUnVzLgorCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfU1RBVEVfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX1NUQVRFX0ggMQorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICBlbnVtIF9fc3RhdGVfdHlwZSB7IF9fT04sIF9fT0ZGLCBfX0lOVkFMSUQgfTsKKworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fc3RhdGVfdHlwZSwgX19zdGF0ZSwgX19JTlZBTElEKTsKKworICBpbmxpbmUgYm9vbAorICBfX3R1cm4oX19zdGF0ZV90eXBlIF9fcykKKyAgeyAKKyAgICBfX3N0YXRlX3R5cGUgaW52KF9fSU5WQUxJRCk7CisgICAgcmV0dXJuIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbigmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fc3RhdGUpLAorCQkJCSAgICAgICAmaW52LCBfX3MsIGZhbHNlLCBfX0FUT01JQ19BQ1FfUkVMLCAKKwkJCQkgICAgICAgX19BVE9NSUNfUkVMQVhFRCk7CisgIH0KKworICBpbmxpbmUgYm9vbAorICBfX3R1cm5fb24oKQorICB7IHJldHVybiBfX3R1cm4oX19PTik7IH0KKworICBpbmxpbmUgYm9vbAorICBfX3R1cm5fb2ZmKCkKKyAgeyByZXR1cm4gX190dXJuKF9fT0ZGKTsgfQorCisgIGlubGluZSBib29sCisgIF9faXNfb24oKQorICB7IHJldHVybiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19zdGF0ZSkgPT0gX19PTjsgfQorCisgIGlubGluZSBib29sCisgIF9faXNfb2ZmKCkKKyAgeyByZXR1cm4gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fc3RhdGUpID09IF9fT0ZGOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgX19pc19pbnZhbGlkKCkKKyAgeyByZXR1cm4gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fc3RhdGUpID09IF9fSU5WQUxJRDsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgX19nbnVfcHJvZmlsZQorI2VuZGlmIC8qIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfU1RBVEVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfdHJhY2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5MDdmOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3RyYWNlLmgKQEAgLTAsMCArMSw2NTkgQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3RyYWNlLmgKKyAqICBAYnJpZWYgRGF0YSBzdHJ1Y3R1cmVzIHRvIHJlcHJlc2VudCBwcm9maWxpbmcgdHJhY2VzLgorICovCisKKy8vIFdyaXR0ZW4gYnkgTGl4aWEgTGl1IGFuZCBTaWx2aXVzIFJ1cy4KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX1RSQUNFX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9UUkFDRV9IIDEKKworI2luY2x1ZGUgPGNzdGRpbz4gIC8vIGZvcGVuLCBmY2xvc2UsIGZwcmludGYsIEZJTEUKKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4gLy8gYXRvZiwgYXRvaSwgc3RydG9sLCBnZXRlbnYsIGF0ZXhpdCwgYWJvcnQKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNkZWZpbmUgX0dMSUJDWFhfSU1QTF9VTk9SREVSRURfTUFQIHN0ZDo6X0dMSUJDWFhfU1REX0M6OnVub3JkZXJlZF9tYXAKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2Vsc2UKKyNpbmNsdWRlIDx0cjEvdW5vcmRlcmVkX21hcD4KKyNkZWZpbmUgX0dMSUJDWFhfSU1QTF9VTk9SREVSRURfTUFQIHN0ZDo6dHIxOjp1bm9yZGVyZWRfbWFwCisjZW5kaWYKKworI2luY2x1ZGUgPGV4dC9jb25jdXJyZW5jZS5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2FsZ29zLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3N0YXRlLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaCIKKworbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKK3sKKyAgLyoqIEBicmllZiBJbnRlcm5hbCBlbnZpcm9ubWVudC4gIFZhbHVlcyBjYW4gYmUgc2V0IG9uZSBvZiB0d28gd2F5czoKKyAgICAgIDEuIEluIGNvbmZpZyBmaWxlICJ2YXIgPSB2YWx1ZSIuICBUaGUgZGVmYXVsdCBjb25maWcgZmlsZSBwYXRoIGlzIAorICAgICAgICAgbGlic3RkY3h4LXByb2ZpbGUuY29uZi4KKyAgICAgIDIuIEJ5IHNldHRpbmcgcHJvY2VzcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICBGb3IgaW5zdGFuY2UsIGluIGEgQmFzaAorICAgICAgICAgc2hlbGwgeW91IGNhbiBzZXQgdGhlIHVuaXQgY29zdCBvZiBpdGVyYXRpbmcgdGhyb3VnaCBhIG1hcCBsaWtlIHRoaXM6CisgICAgICAgICBleHBvcnQgX19tYXBfaXRlcmF0ZV9jb3N0X2ZhY3Rvcj01LjAuCisJIElmIGEgdmFsdWUgaXMgc2V0IGJvdGggaW4gdGhlIGlucHV0IGZpbGUgYW5kIHRocm91Z2ggYW4gZW52aXJvbm1lbnQKKwkgdmFyaWFibGUsIHRoZSBlbnZpcm9ubWVudCB2YWx1ZSB0YWtlcyBwcmVjZWRlbmNlLiAgKi8KKyAgdHlwZWRlZiBfR0xJQkNYWF9JTVBMX1VOT1JERVJFRF9NQVA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBfX2Vudl90OworCisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX1VOSU5JVF9EQVRBKF9fZW52X3QsIF9fZW52KTsKKworICAvKiogQGJyaWVmIE1hc3RlciBsb2NrLiAgKi8KKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfVU5JTklUX0RBVEEoX19nbnVfY3h4OjpfX211dGV4LCBfX2dsb2JhbF9sb2NrKTsKKworICAvKiogQGJyaWVmIFJlcHJlc2VudGF0aW9uIG9mIGEgd2FybmluZy4gICovCisgIHN0cnVjdCBfX3dhcm5pbmdfZGF0YQorICB7CisgICAgZmxvYXQgX19tYWduaXR1ZGU7CisgICAgX19zdGFja190IF9fY29udGV4dDsKKyAgICBjb25zdCBjaGFyKiBfX3dhcm5pbmdfaWQ7CisgICAgc3RkOjpzdHJpbmcgX193YXJuaW5nX21lc3NhZ2U7CisKKyAgICBfX3dhcm5pbmdfZGF0YSgpCisgICAgOiBfX21hZ25pdHVkZSgwLjApLCBfX2NvbnRleHQoMCksIF9fd2FybmluZ19pZCgwKSB7IH0KKworICAgIF9fd2FybmluZ19kYXRhKGZsb2F0IF9fbSwgX19zdGFja190IF9fYywgY29uc3QgY2hhciogX19pZCwgCisJCSAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfX21zZykKKyAgICA6IF9fbWFnbml0dWRlKF9fbSksIF9fY29udGV4dChfX2MpLCBfX3dhcm5pbmdfaWQoX19pZCksIAorICAgICAgX193YXJuaW5nX21lc3NhZ2UoX19tc2cpIHsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfX3dhcm5pbmdfZGF0YSYgX19vdGhlcikgY29uc3QKKyAgICB7IHJldHVybiBfX21hZ25pdHVkZSA8IF9fb3RoZXIuX19tYWduaXR1ZGU7IH0KKyAgfTsKKworICB0eXBlZGVmIHN0ZDo6X0dMSUJDWFhfU1REX0M6OnZlY3RvcjxfX3dhcm5pbmdfZGF0YT4gX193YXJuaW5nX3ZlY3Rvcl90OworCisgIC8vIERlZmluZWQgaW4gcHJvZmlsZXJfPGRpYWdub3N0aWMgbmFtZT4uaC4KKyAgY2xhc3MgX190cmFjZV9oYXNoX2Z1bmM7CisgIGNsYXNzIF9fdHJhY2VfaGFzaHRhYmxlX3NpemU7CisgIGNsYXNzIF9fdHJhY2VfbWFwMnVtYXA7CisgIGNsYXNzIF9fdHJhY2VfdmVjdG9yX3NpemU7CisgIGNsYXNzIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3Q7CisgIGNsYXNzIF9fdHJhY2VfbGlzdF90b19zbGlzdDsgCisgIGNsYXNzIF9fdHJhY2VfbGlzdF90b192ZWN0b3I7IAorICB2b2lkIF9fdHJhY2VfdmVjdG9yX3NpemVfaW5pdCgpOworICB2b2lkIF9fdHJhY2VfaGFzaHRhYmxlX3NpemVfaW5pdCgpOworICB2b2lkIF9fdHJhY2VfaGFzaF9mdW5jX2luaXQoKTsKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2luaXQoKTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2xpc3RfaW5pdCgpOyAgCisgIHZvaWQgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9pbml0KCk7ICAKKyAgdm9pZCBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2luaXQoKTsKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl9zaXplX3JlcG9ydChGSUxFKiwgX193YXJuaW5nX3ZlY3Rvcl90Jik7CisgIHZvaWQgX190cmFjZV9oYXNodGFibGVfc2l6ZV9yZXBvcnQoRklMRSosIF9fd2FybmluZ192ZWN0b3JfdCYpOworICB2b2lkIF9fdHJhY2VfaGFzaF9mdW5jX3JlcG9ydChGSUxFKiwgX193YXJuaW5nX3ZlY3Rvcl90Jik7CisgIHZvaWQgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9yZXBvcnQoRklMRSosIF9fd2FybmluZ192ZWN0b3JfdCYpOworICB2b2lkIF9fdHJhY2VfbGlzdF90b19zbGlzdF9yZXBvcnQoRklMRSosIF9fd2FybmluZ192ZWN0b3JfdCYpOyAKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX3JlcG9ydChGSUxFKiwgX193YXJuaW5nX3ZlY3Rvcl90Jik7CisgIHZvaWQgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9yZXBvcnQoRklMRSosIF9fd2FybmluZ192ZWN0b3JfdCYpOworCisgIHN0cnVjdCBfX2Nvc3RfZmFjdG9yCisgIHsKKyAgICBjb25zdCBjaGFyKiBfX2Vudl92YXI7CisgICAgZmxvYXQgX192YWx1ZTsKKyAgfTsKKworICB0eXBlZGVmIHN0ZDo6X0dMSUJDWFhfU1REX0M6OnZlY3RvcjxfX2Nvc3RfZmFjdG9yKj4gX19jb3N0X2ZhY3Rvcl92ZWN0b3I7CisKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX3RyYWNlX2hhc2hfZnVuYyosIF9TX2hhc2hfZnVuYywgMCk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX190cmFjZV9oYXNodGFibGVfc2l6ZSosIF9TX2hhc2h0YWJsZV9zaXplLCAwKTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX3RyYWNlX21hcDJ1bWFwKiwgX1NfbWFwMnVtYXAsIDApOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fdHJhY2VfdmVjdG9yX3NpemUqLCBfU192ZWN0b3Jfc2l6ZSwgMCk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX190cmFjZV92ZWN0b3JfdG9fbGlzdCosIF9TX3ZlY3Rvcl90b19saXN0LCAwKTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX3RyYWNlX2xpc3RfdG9fc2xpc3QqLCBfU19saXN0X3RvX3NsaXN0LCAwKTsgCisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX190cmFjZV9saXN0X3RvX3ZlY3RvciosIF9TX2xpc3RfdG9fdmVjdG9yLCAwKTsKKworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fdmVjdG9yX3NoaWZ0X2Nvc3RfZmFjdG9yLCAKKwkJCSAgICAgICB7Il9fdmVjdG9yX3NoaWZ0X2Nvc3RfZmFjdG9yIiwgMS4wfSk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX192ZWN0b3JfaXRlcmF0ZV9jb3N0X2ZhY3RvciwKKwkJCSAgICAgICB7Il9fdmVjdG9yX2l0ZXJhdGVfY29zdF9mYWN0b3IiLCAxLjB9KTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX3ZlY3Rvcl9yZXNpemVfY29zdF9mYWN0b3IsCisJCQkgICAgICAgeyJfX3ZlY3Rvcl9yZXNpemVfY29zdF9mYWN0b3IiLCAxLjB9KTsgCisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX19saXN0X3NoaWZ0X2Nvc3RfZmFjdG9yLAorCQkJICAgICAgIHsiX19saXN0X3NoaWZ0X2Nvc3RfZmFjdG9yIiwgMC4wfSk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX19saXN0X2l0ZXJhdGVfY29zdF9mYWN0b3IsCisJCQkgICAgICAgeyJfX2xpc3RfaXRlcmF0ZV9jb3N0X2ZhY3RvciIsIDEwLjB9KTsgCisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX19saXN0X3Jlc2l6ZV9jb3N0X2ZhY3RvciwKKwkJCSAgICAgICB7Il9fbGlzdF9yZXNpemVfY29zdF9mYWN0b3IiLCAwLjB9KTsgCisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX19tYXBfaW5zZXJ0X2Nvc3RfZmFjdG9yLAorCQkJICAgICAgIHsiX19tYXBfaW5zZXJ0X2Nvc3RfZmFjdG9yIiwgMS41fSk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX19tYXBfZXJhc2VfY29zdF9mYWN0b3IsCisJCQkgICAgICAgeyJfX21hcF9lcmFzZV9jb3N0X2ZhY3RvciIsIDEuNX0pOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fbWFwX2ZpbmRfY29zdF9mYWN0b3IsCisJCQkgICAgICAgeyJfX21hcF9maW5kX2Nvc3RfZmFjdG9yIiwgMX0pOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fbWFwX2l0ZXJhdGVfY29zdF9mYWN0b3IsCisJCQkgICAgICAgeyJfX21hcF9pdGVyYXRlX2Nvc3RfZmFjdG9yIiwgMi4zfSk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX191bWFwX2luc2VydF9jb3N0X2ZhY3RvciwKKwkJCSAgICAgICB7Il9fdW1hcF9pbnNlcnRfY29zdF9mYWN0b3IiLCAxMi4wfSk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX191bWFwX2VyYXNlX2Nvc3RfZmFjdG9yLAorCQkJICAgICAgIHsiX191bWFwX2VyYXNlX2Nvc3RfZmFjdG9yIiwgMTIuMH0pOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fdW1hcF9maW5kX2Nvc3RfZmFjdG9yLAorCQkJICAgICAgIHsiX191bWFwX2ZpbmRfY29zdF9mYWN0b3IiLCAxMC4wfSk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX191bWFwX2l0ZXJhdGVfY29zdF9mYWN0b3IsCisJCQkgICAgICAgeyJfX3VtYXBfaXRlcmF0ZV9jb3N0X2ZhY3RvciIsIDEuN30pOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3JfdmVjdG9yKiwgX19jb3N0X2ZhY3RvcnMsIDApOworCisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoY29uc3QgY2hhciosIF9TX3RyYWNlX2ZpbGVfbmFtZSwKKwkJCSAgICAgICBfR0xJQkNYWF9QUk9GSUxFX1RSQUNFX1BBVEhfUk9PVCk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoc3RkOjpzaXplX3QsIF9TX21heF93YXJuX2NvdW50LAorCQkJICAgICAgIF9HTElCQ1hYX1BST0ZJTEVfTUFYX1dBUk5fQ09VTlQpOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKHN0ZDo6c2l6ZV90LCBfU19tYXhfc3RhY2tfZGVwdGgsCisJCQkgICAgICAgX0dMSUJDWFhfUFJPRklMRV9NQVhfU1RBQ0tfREVQVEgpOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKHN0ZDo6c2l6ZV90LCBfU19tYXhfbWVtLAorCQkJICAgICAgIF9HTElCQ1hYX1BST0ZJTEVfTUVNX1BFUl9ESUFHTk9TVElDKTsKKworICBpbmxpbmUgc3RkOjpzaXplX3QKKyAgX19zdGFja19tYXhfZGVwdGgoKQorICB7IHJldHVybiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWF4X3N0YWNrX2RlcHRoKTsgfQorCisgIGlubGluZSBzdGQ6OnNpemVfdAorICBfX21heF9tZW0oKQorICB7IHJldHVybiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWF4X21lbSk7IH0KKworICAvKiogQGJyaWVmIEJhc2UgY2xhc3MgZm9yIGFsbCB0cmFjZSBwcm9kdWNlcnMuICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfX29iamVjdF9pbmZvLCB0eXBlbmFtZSBfX3N0YWNrX2luZm8+CisgICAgY2xhc3MgX190cmFjZV9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIERvIG5vdCBwaWNrIHRoZSBpbml0aWFsIHNpemUgdG9vIGxhcmdlLCBhcyB3ZSBkb24ndCBrbm93IHdoaWNoCisgICAgICAvLyBkaWFnbm9zdGljcyBhcmUgbW9yZSBhY3RpdmUuCisgICAgICBfX3RyYWNlX2Jhc2UoKQorICAgICAgOiBfX29iamVjdF90YWJsZSgxMDAwMCksIF9fc3RhY2tfdGFibGUoMTAwMDApLAorCV9fc3RhY2tfdGFibGVfYnl0ZV9zaXplKDApLCBfX2lkKDApIHsgfQorCisgICAgICB2aXJ0dWFsIH5fX3RyYWNlX2Jhc2UoKSB7IH0KKworICAgICAgdm9pZCBfX2FkZF9vYmplY3QoX19vYmplY3RfdCBvYmplY3QsIF9fb2JqZWN0X2luZm8gX19pbmZvKTsKKyAgICAgIF9fb2JqZWN0X2luZm8qIF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqZWN0X3QgX19vYmplY3QpOworICAgICAgdm9pZCBfX3JldGlyZV9vYmplY3QoX19vYmplY3RfdCBfX29iamVjdCk7CisgICAgICB2b2lkIF9fd3JpdGUoRklMRSogX19mKTsKKyAgICAgIHZvaWQgX19jb2xsZWN0X3dhcm5pbmdzKF9fd2FybmluZ192ZWN0b3JfdCYgX193YXJuaW5ncyk7CisKKyAgICBwcml2YXRlOgorICAgICAgX19nbnVfY3h4OjpfX211dGV4IF9fb2JqZWN0X3RhYmxlX2xvY2s7CisgICAgICBfX2dudV9jeHg6Ol9fbXV0ZXggX19zdGFja190YWJsZV9sb2NrOworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9JTVBMX1VOT1JERVJFRF9NQVA8X19vYmplY3RfdCwgCisJCQkJCSAgX19vYmplY3RfaW5mbz4gX19vYmplY3RfdGFibGVfdDsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfSU1QTF9VTk9SREVSRURfTUFQPF9fc3RhY2tfdCwgX19zdGFja19pbmZvLAorCQkJCQkgIF9fc3RhY2tfaGFzaCwgCisJCQkJCSAgX19zdGFja19oYXNoPiBfX3N0YWNrX3RhYmxlX3Q7CisgICAgICBfX29iamVjdF90YWJsZV90IF9fb2JqZWN0X3RhYmxlOworICAgICAgX19zdGFja190YWJsZV90IF9fc3RhY2tfdGFibGU7CisgICAgICBzdGQ6OnNpemVfdCBfX3N0YWNrX3RhYmxlX2J5dGVfc2l6ZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIGNvbnN0IGNoYXIqIF9faWQ7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfX29iamVjdF9pbmZvLCB0eXBlbmFtZSBfX3N0YWNrX2luZm8+CisgICAgdm9pZAorICAgIF9fdHJhY2VfYmFzZTxfX29iamVjdF9pbmZvLCBfX3N0YWNrX2luZm8+OjoKKyAgICBfX2NvbGxlY3Rfd2FybmluZ3MoX193YXJuaW5nX3ZlY3Rvcl90JiBfX3dhcm5pbmdzKQorICAgIHsKKyAgICAgIGZvciAodHlwZW5hbWUgX19zdGFja190YWJsZV90OjppdGVyYXRvciBfX2l0CisJICAgICA9IF9fc3RhY2tfdGFibGUuYmVnaW4oKTsgX19pdCAhPSBfX3N0YWNrX3RhYmxlLmVuZCgpOyArK19faXQpCisJX193YXJuaW5ncy5wdXNoX2JhY2soX193YXJuaW5nX2RhdGEoKCpfX2l0KS5zZWNvbmQuX19tYWduaXR1ZGUoKSwKKwkJCQkJICAgICgqX19pdCkuZmlyc3QsIF9faWQsCisJCQkJCSAgICAoKl9faXQpLnNlY29uZC5fX2FkdmljZSgpKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9fb2JqZWN0X2luZm8sIHR5cGVuYW1lIF9fc3RhY2tfaW5mbz4KKyAgICB2b2lkCisgICAgX190cmFjZV9iYXNlPF9fb2JqZWN0X2luZm8sIF9fc3RhY2tfaW5mbz46OgorICAgIF9fYWRkX29iamVjdChfX29iamVjdF90IF9fb2JqZWN0LCBfX29iamVjdF9pbmZvIF9faW5mbykKKyAgICB7CisgICAgICBpZiAoX19tYXhfbWVtKCkgPT0gMCAKKwkgIHx8IF9fb2JqZWN0X3RhYmxlLnNpemUoKSAqIHNpemVvZihfX29iamVjdF9pbmZvKSA8PSBfX21heF9tZW0oKSkKKwl7CisJICB0aGlzLT5fX29iamVjdF90YWJsZV9sb2NrLmxvY2soKTsKKwkgIF9fb2JqZWN0X3RhYmxlLmluc2VydCh0eXBlbmFtZSBfX29iamVjdF90YWJsZV90OjoKKwkJCQl2YWx1ZV90eXBlKF9fb2JqZWN0LCBfX2luZm8pKTsKKwkgIHRoaXMtPl9fb2JqZWN0X3RhYmxlX2xvY2sudW5sb2NrKCk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfX29iamVjdF9pbmZvLCB0eXBlbmFtZSBfX3N0YWNrX2luZm8+CisgICAgX19vYmplY3RfaW5mbyoKKyAgICBfX3RyYWNlX2Jhc2U8X19vYmplY3RfaW5mbywgX19zdGFja19pbmZvPjo6CisgICAgX19nZXRfb2JqZWN0X2luZm8oX19vYmplY3RfdCBfX29iamVjdCkKKyAgICB7CisgICAgICAvLyBYWFg6IFJldmlzaXQgdGhpcyB0byBzZWUgaWYgd2UgY2FuIGRlY3JlYXNlIG11dGV4IHNwYW5zLgorICAgICAgLy8gV2l0aG91dCB0aGlzIG11dGV4LCB0aGUgb2JqZWN0IHRhYmxlIGNvdWxkIGJlIHJlaGFzaGVkIGR1cmluZyBhbgorICAgICAgLy8gaW5zZXJ0aW9uIG9uIGFub3RoZXIgdGhyZWFkLCB3aGljaCBjb3VsZCByZXN1bHQgaW4gYSBzZWdmYXVsdC4KKyAgICAgIHRoaXMtPl9fb2JqZWN0X3RhYmxlX2xvY2subG9jaygpOworICAgICAgdHlwZW5hbWUgX19vYmplY3RfdGFibGVfdDo6aXRlcmF0b3IgX19vYmplY3RfaXQKKwk9ICBfX29iamVjdF90YWJsZS5maW5kKF9fb2JqZWN0KTsKKworICAgICAgaWYgKF9fb2JqZWN0X2l0ID09IF9fb2JqZWN0X3RhYmxlLmVuZCgpKQorCXsKKwkgIHRoaXMtPl9fb2JqZWN0X3RhYmxlX2xvY2sudW5sb2NrKCk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgdGhpcy0+X19vYmplY3RfdGFibGVfbG9jay51bmxvY2soKTsKKwkgIHJldHVybiAmX19vYmplY3RfaXQtPnNlY29uZDsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9fb2JqZWN0X2luZm8sIHR5cGVuYW1lIF9fc3RhY2tfaW5mbz4KKyAgICB2b2lkCisgICAgX190cmFjZV9iYXNlPF9fb2JqZWN0X2luZm8sIF9fc3RhY2tfaW5mbz46OgorICAgIF9fcmV0aXJlX29iamVjdChfX29iamVjdF90IF9fb2JqZWN0KQorICAgIHsKKyAgICAgIHRoaXMtPl9fb2JqZWN0X3RhYmxlX2xvY2subG9jaygpOworICAgICAgdGhpcy0+X19zdGFja190YWJsZV9sb2NrLmxvY2soKTsKKyAgICAgIHR5cGVuYW1lIF9fb2JqZWN0X3RhYmxlX3Q6Oml0ZXJhdG9yIF9fb2JqZWN0X2l0CisJPSBfX29iamVjdF90YWJsZS5maW5kKF9fb2JqZWN0KTsKKyAgCisgICAgICBpZiAoX19vYmplY3RfaXQgIT0gX19vYmplY3RfdGFibGUuZW5kKCkpCisJeworCSAgY29uc3QgX19vYmplY3RfaW5mbyYgX19pbmZvID0gX19vYmplY3RfaXQtPnNlY29uZDsKKwkgIGNvbnN0IF9fc3RhY2tfdCYgX19zdGFjayA9IF9faW5mby5fX3N0YWNrKCk7CisJICB0eXBlbmFtZSBfX3N0YWNrX3RhYmxlX3Q6Oml0ZXJhdG9yIF9fc3RhY2tfaXQKKwkgICAgPSBfX3N0YWNrX3RhYmxlLmZpbmQoX19zdGFjayk7CisgICAgCisJICBpZiAoX19zdGFja19pdCA9PSBfX3N0YWNrX3RhYmxlLmVuZCgpKQorCSAgICB7CisJICAgICAgLy8gRmlyc3Qgb2NjdXJlbmNlIG9mIHRoaXMgY2FsbCBjb250ZXh0LgorCSAgICAgIGlmIChfX21heF9tZW0oKSA9PSAwIHx8IF9fc3RhY2tfdGFibGVfYnl0ZV9zaXplIDwgX19tYXhfbWVtKCkpIAorCQl7CisJCSAgX19zdGFja190YWJsZV9ieXRlX3NpemUgCisJCSAgICArPSAoc2l6ZW9mKF9faW5zdHJ1Y3Rpb25fYWRkcmVzc190KSAqIF9fc2l6ZShfX3N0YWNrKQorCQkJKyBzaXplb2YoX19zdGFjaykgKyBzaXplb2YoX19zdGFja19pbmZvKSk7CisJCSAgX19zdGFja190YWJsZS5pbnNlcnQobWFrZV9wYWlyKF9fc3RhY2ssCisJCQkJCQkgX19zdGFja19pbmZvKF9faW5mbykpKTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvLyBNZXJnZSBvYmplY3QgaW5mbyBpbnRvIGluZm8gc3VtbWFyeSBmb3IgdGhpcyBjYWxsIGNvbnRleHQuCisJICAgICAgX19zdGFja19pdC0+c2Vjb25kLl9fbWVyZ2UoX19pbmZvKTsKKwkgICAgICBkZWxldGUgX19zdGFjazsKKwkgICAgfQorCSAgX19vYmplY3RfdGFibGUuZXJhc2UoX19vYmplY3QpOworCX0KKworICAgICAgdGhpcy0+X19vYmplY3RfdGFibGVfbG9jay51bmxvY2soKTsKKyAgICAgIHRoaXMtPl9fc3RhY2tfdGFibGVfbG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX19vYmplY3RfaW5mbywgdHlwZW5hbWUgX19zdGFja19pbmZvPgorICAgIHZvaWQKKyAgICBfX3RyYWNlX2Jhc2U8X19vYmplY3RfaW5mbywgX19zdGFja19pbmZvPjo6CisgICAgX193cml0ZShGSUxFKiBfX2YpCisgICAgeworICAgICAgZm9yICh0eXBlbmFtZSBfX3N0YWNrX3RhYmxlX3Q6Oml0ZXJhdG9yIF9faXQKKwkgICAgID0gX19zdGFja190YWJsZS5iZWdpbigpOyBfX2l0ICE9IF9fc3RhY2tfdGFibGUuZW5kKCk7ICsrX19pdCkKKwlpZiAoX19pdC0+c2Vjb25kLl9faXNfdmFsaWQoKSkKKwkgIHsKKwkgICAgc3RkOjpmcHJpbnRmKF9fZiwgX19pZCk7CisJICAgIHN0ZDo6ZnByaW50ZihfX2YsICJ8Iik7CisJICAgIF9fZ251X3Byb2ZpbGU6Ol9fd3JpdGUoX19mLCBfX2l0LT5maXJzdCk7CisJICAgIHN0ZDo6ZnByaW50ZihfX2YsICJ8Iik7CisJICAgIF9faXQtPnNlY29uZC5fX3dyaXRlKF9fZik7CisJICB9CisgICAgfQorCisgIGlubGluZSBzdGQ6OnNpemVfdAorICBfX2Vudl90b19zaXplX3QoY29uc3QgY2hhciogX19lbnZfdmFyLCBzdGQ6OnNpemVfdCBfX2RlZmF1bHRfdmFsdWUpCisgIHsKKyAgICBjaGFyKiBfX2Vudl92YWx1ZSA9IHN0ZDo6Z2V0ZW52KF9fZW52X3Zhcik7CisgICAgaWYgKF9fZW52X3ZhbHVlKQorICAgICAgeworCWVycm5vID0gMDsKKwlsb25nIF9fY29udmVydGVkX3ZhbHVlID0gc3RkOjpzdHJ0b2woX19lbnZfdmFsdWUsIDAsIDEwKTsKKwlpZiAoZXJybm8gfHwgX19jb252ZXJ0ZWRfdmFsdWUgPCAwKQorCSAgeworCSAgICBzdGQ6OmZwcmludGYoc3RkZXJyLAorCQkJICJCYWQgdmFsdWUgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlICclcycuXG4iLAorCQkJIF9fZW52X3Zhcik7CisJICAgIHN0ZDo6YWJvcnQoKTsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KF9fY29udmVydGVkX3ZhbHVlKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gX19kZWZhdWx0X3ZhbHVlOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX19zZXRfbWF4X3N0YWNrX3RyYWNlX2RlcHRoKCkKKyAgeworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXhfc3RhY2tfZGVwdGgpCisgICAgICA9IF9fZW52X3RvX3NpemVfdChfR0xJQkNYWF9QUk9GSUxFX01BWF9TVEFDS19ERVBUSF9FTlZfVkFSLAorCQkJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21heF9zdGFja19kZXB0aCkpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX19zZXRfbWF4X21lbSgpCisgIHsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWF4X21lbSkgCisgICAgICA9IF9fZW52X3RvX3NpemVfdChfR0xJQkNYWF9QUk9GSUxFX01FTV9QRVJfRElBR05PU1RJQ19FTlZfVkFSLAorCQkJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21heF9tZW0pKTsKKyAgfQorCisgIGlubGluZSBpbnQKKyAgX19sb2dfbWFnbml0dWRlKGZsb2F0IF9fZikKKyAgeworICAgIGNvbnN0IGZsb2F0IF9fbG9nX2Jhc2UgPSAxMC4wOworICAgIGludCBfX3Jlc3VsdCA9IDA7CisgICAgaW50IF9fc2lnbiA9IDE7CisKKyAgICBpZiAoX19mIDwgMCkgCisgICAgICB7CisJX19mID0gLV9fZjsKKwlfX3NpZ24gPSAtMTsKKyAgICAgIH0KKworICAgIHdoaWxlIChfX2YgPiBfX2xvZ19iYXNlKSAKKyAgICAgIHsKKwkrK19fcmVzdWx0OworCV9fZiAvPSAxMC4wOworICAgICAgfQorICAgIHJldHVybiBfX3NpZ24gKiBfX3Jlc3VsdDsKKyAgfQorCisgIGlubGluZSBGSUxFKiAKKyAgX19vcGVuX291dHB1dF9maWxlKGNvbnN0IGNoYXIqIF9fZXh0ZW5zaW9uKQorICB7CisgICAgLy8gVGhlIHBhdGggaXMgbWFkZSBvZiBfU190cmFjZV9maWxlX25hbWUgKyAiLiIgKyBleHRlbnNpb24uCisgICAgc3RkOjpzaXplX3QgX19yb290X2xlbiAKKyAgICAgID0gX19idWlsdGluX3N0cmxlbihfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdHJhY2VfZmlsZV9uYW1lKSk7CisgICAgc3RkOjpzaXplX3QgX19leHRfbGVuID0gX19idWlsdGluX3N0cmxlbihfX2V4dGVuc2lvbik7CisgICAgY2hhciogX19maWxlX25hbWUgPSBuZXcgY2hhcltfX3Jvb3RfbGVuICsgMSArIF9fZXh0X2xlbiArIDFdOworICAgIF9fYnVpbHRpbl9tZW1jcHkoX19maWxlX25hbWUsCisJCSAgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3RyYWNlX2ZpbGVfbmFtZSksCisJCSAgICAgX19yb290X2xlbik7CisgICAgKihfX2ZpbGVfbmFtZSArIF9fcm9vdF9sZW4pID0gJy4nOworICAgIF9fYnVpbHRpbl9tZW1jcHkoX19maWxlX25hbWUgKyBfX3Jvb3RfbGVuICsgMSwKKwkJICAgICBfX2V4dGVuc2lvbiwgX19leHRfbGVuICsgMSk7CisKKyAgICBGSUxFKiBfX291dF9maWxlID0gc3RkOjpmb3BlbihfX2ZpbGVfbmFtZSwgInciKTsKKyAgICBpZiAoIV9fb3V0X2ZpbGUpCisgICAgICB7CisJc3RkOjpmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIHRyYWNlIGZpbGUgJyVzJy5cbiIsCisJCSAgICAgX19maWxlX25hbWUpOworCXN0ZDo6YWJvcnQoKTsKKyAgICAgIH0KKworICAgIGRlbGV0ZVtdIF9fZmlsZV9uYW1lOworICAgIHJldHVybiBfX291dF9maWxlOworICB9CisKKyAgc3RydWN0IF9fd2FybgorICB7CisgICAgRklMRSogX19maWxlOworCisgICAgX193YXJuKEZJTEUqIF9fZikKKyAgICB7IF9fZmlsZSA9IF9fZjsgfQorCisgICAgdm9pZAorICAgIG9wZXJhdG9yKCkoY29uc3QgX193YXJuaW5nX2RhdGEmIF9faW5mbykKKyAgICB7CisgICAgICBzdGQ6OmZwcmludGYoX19maWxlLCAgX19pbmZvLl9fd2FybmluZ19pZCk7CisgICAgICBzdGQ6OmZwcmludGYoX19maWxlLCAiOiBpbXByb3ZlbWVudCA9ICVkIiwKKwkJICAgX19sb2dfbWFnbml0dWRlKF9faW5mby5fX21hZ25pdHVkZSkpOworICAgICAgc3RkOjpmcHJpbnRmKF9fZmlsZSwgIjogY2FsbCBzdGFjayA9ICIpOworICAgICAgX19nbnVfcHJvZmlsZTo6X193cml0ZShfX2ZpbGUsIF9faW5mby5fX2NvbnRleHQpOworICAgICAgc3RkOjpmcHJpbnRmKF9fZmlsZSwgIjogYWR2aWNlID0gJXNcbiIsCisJCSAgIF9faW5mby5fX3dhcm5pbmdfbWVzc2FnZS5jX3N0cigpKTsKKyAgICB9CisgIH07CisKKyAgLyoqIEBicmllZiBGaW5hbCByZXBvcnQgbWV0aG9kLCByZWdpc3RlcmVkIHdpdGggQGIgYXRleGl0LgorICAgKgorICAgKiBUaGlzIGNhbiBhbHNvIGJlIGNhbGxlZCBkaXJlY3RseSBieSB1c2VyIGNvZGUsIGluY2x1ZGluZyBzaWduYWwgaGFuZGxlcnMuCisgICAqIEl0IGlzIHByb3RlY3RlZCBhZ2FpbnN0IGRlYWRsb2NrcyBieSB0aGUgcmVlbnRyYW5jZSBndWFyZCBpbiBwcm9maWxlci5oLgorICAgKiBIb3dldmVyLCB3aGVuIGNhbGxlZCBmcm9tIGEgc2lnbmFsIGhhbmRsZXIgdGhhdCB0cmlnZ2VycyB3aGlsZSB3aXRoaW4KKyAgICogX19nbnVfcHJvZmlsZSAodW5kZXIgdGhlIGd1YXJkZWQgem9uZSksIG5vIG91dHB1dCB3aWxsIGJlIHByb2R1Y2VkLgorICAgKi8KKyAgaW5saW5lIHZvaWQKKyAgX19yZXBvcnQodm9pZCkKKyAgeworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2dsb2JhbF9sb2NrKS5sb2NrKCk7CisKKyAgICBfX3dhcm5pbmdfdmVjdG9yX3QgX193YXJuaW5ncywgX190b3Bfd2FybmluZ3M7CisKKyAgICBGSUxFKiBfX3Jhd19maWxlID0gX19vcGVuX291dHB1dF9maWxlKCJyYXciKTsKKyAgICBfX3RyYWNlX3ZlY3Rvcl9zaXplX3JlcG9ydChfX3Jhd19maWxlLCBfX3dhcm5pbmdzKTsKKyAgICBfX3RyYWNlX2hhc2h0YWJsZV9zaXplX3JlcG9ydChfX3Jhd19maWxlLCBfX3dhcm5pbmdzKTsKKyAgICBfX3RyYWNlX2hhc2hfZnVuY19yZXBvcnQoX19yYXdfZmlsZSwgX193YXJuaW5ncyk7CisgICAgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9yZXBvcnQoX19yYXdfZmlsZSwgX193YXJuaW5ncyk7CisgICAgX190cmFjZV9saXN0X3RvX3NsaXN0X3JlcG9ydChfX3Jhd19maWxlLCBfX3dhcm5pbmdzKTsKKyAgICBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX3JlcG9ydChfX3Jhd19maWxlLCBfX3dhcm5pbmdzKTsKKyAgICBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX3JlcG9ydChfX3Jhd19maWxlLCBfX3dhcm5pbmdzKTsKKyAgICBzdGQ6OmZjbG9zZShfX3Jhd19maWxlKTsKKworICAgIC8vIFNvcnQgZGF0YSBieSBtYWduaXR1ZGUsIGtlZXBpbmcganVzdCB0b3AgTi4KKyAgICBzdGQ6OnNpemVfdCBfX2N1dG9mZiA9IHN0ZDo6bWluKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXhfd2Fybl9jb3VudCksCisJCQkJICAgIF9fd2FybmluZ3Muc2l6ZSgpKTsKKyAgICBfX3RvcF9uKF9fd2FybmluZ3MsIF9fdG9wX3dhcm5pbmdzLCBfX2N1dG9mZik7CisKKyAgICBGSUxFKiBfX3dhcm5fZmlsZSA9IF9fb3Blbl9vdXRwdXRfZmlsZSgidHh0Iik7CisgICAgX19mb3JfZWFjaChfX3RvcF93YXJuaW5ncy5iZWdpbigpLCBfX3RvcF93YXJuaW5ncy5lbmQoKSwKKwkgICAgICAgX193YXJuKF9fd2Fybl9maWxlKSk7CisgICAgc3RkOjpmY2xvc2UoX193YXJuX2ZpbGUpOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fZ2xvYmFsX2xvY2spLnVubG9jaygpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX19zZXRfdHJhY2VfcGF0aCgpCisgIHsKKyAgICBjaGFyKiBfX2Vudl90cmFjZV9maWxlX25hbWUgPSBzdGQ6OmdldGVudihfR0xJQkNYWF9QUk9GSUxFX1RSQUNFX0VOVl9WQVIpOworCisgICAgaWYgKF9fZW52X3RyYWNlX2ZpbGVfbmFtZSkKKyAgICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU190cmFjZV9maWxlX25hbWUpID0gX19lbnZfdHJhY2VfZmlsZV9uYW1lOworCisgICAgLy8gTWFrZSBzdXJlIGVhcmx5IHRoYXQgd2UgY2FuIGNyZWF0ZSB0aGUgdHJhY2UgZmlsZS4KKyAgICBzdGQ6OmZjbG9zZShfX29wZW5fb3V0cHV0X2ZpbGUoInR4dCIpKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fc2V0X21heF93YXJuX2NvdW50KCkKKyAgeworICAgIGNoYXIqIF9fZW52X21heF93YXJuX2NvdW50X3N0cgorICAgICAgPSBzdGQ6OmdldGVudihfR0xJQkNYWF9QUk9GSUxFX01BWF9XQVJOX0NPVU5UX0VOVl9WQVIpOworCisgICAgaWYgKF9fZW52X21heF93YXJuX2NvdW50X3N0cikKKyAgICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXhfd2Fybl9jb3VudCkKKwk9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihzdGQ6OmF0b2koX19lbnZfbWF4X3dhcm5fY291bnRfc3RyKSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3JlYWRfY29zdF9mYWN0b3JzKCkKKyAgeworICAgIHN0ZDo6c3RyaW5nIF9fY29uZl9maWxlX25hbWUoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3RyYWNlX2ZpbGVfbmFtZSkpOworICAgIF9fY29uZl9maWxlX25hbWUgKz0gIi5jb25mIjsKKworICAgIHN0ZDo6aWZzdHJlYW0gX19jb25mX2ZpbGUoX19jb25mX2ZpbGVfbmFtZS5jX3N0cigpKTsKKworICAgIGlmIChfX2NvbmZfZmlsZS5pc19vcGVuKCkpCisgICAgICB7CisJc3RkOjpzdHJpbmcgX19saW5lOworCisJd2hpbGUgKHN0ZDo6Z2V0bGluZShfX2NvbmZfZmlsZSwgX19saW5lKSkKKwkgIHsKKwkgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBfX2kgPSBfX2xpbmUuZmluZF9maXJzdF9ub3Rfb2YoIiBcdFxuXHYiKTsKKworCSAgICBpZiAoX19saW5lLmxlbmd0aCgpIDw9IDAgfHwgX19saW5lW19faV0gPT0gJyMnKQorCSAgICAgIC8vIFNraXAgZW1wdHkgbGluZXMgb3IgY29tbWVudHMuCisJICAgICAgY29udGludWU7CisJICB9CisKKwkvLyBUcmltLgorCV9fbGluZS5lcmFzZShfX3JlbW92ZShfX2xpbmUuYmVnaW4oKSwgX19saW5lLmVuZCgpLCAnICcpLAorCQkgICAgIF9fbGluZS5lbmQoKSk7CisJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBfX3BvcyA9IF9fbGluZS5maW5kKCI9Iik7CisJc3RkOjpzdHJpbmcgX19mYWN0b3JfbmFtZSA9IF9fbGluZS5zdWJzdHIoMCwgX19wb3MpOworCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgX19lbmQgPSBfX2xpbmUuZmluZF9maXJzdF9vZigiO1xuIik7CisJc3RkOjpzdHJpbmcgX19mYWN0b3JfdmFsdWUgPSBfX2xpbmUuc3Vic3RyKF9fcG9zICsgMSwgX19lbmQgLSBfX3Bvcyk7CisKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19lbnYpW19fZmFjdG9yX25hbWVdID0gX19mYWN0b3JfdmFsdWU7CisgICAgICB9CisgIH0KKworICBzdHJ1Y3QgX19jb3N0X2ZhY3Rvcl93cml0ZXIKKyAgeworICAgIEZJTEUqIF9fZmlsZTsKKworICAgIF9fY29zdF9mYWN0b3Jfd3JpdGVyKEZJTEUqIF9fZikKKyAgICA6IF9fZmlsZShfX2YpIHsgfQorCisgICAgdm9pZAorICAgIG9wZXJhdG9yKCkgKGNvbnN0IF9fY29zdF9mYWN0b3IqIF9fZmFjdG9yKQorICAgIHsgc3RkOjpmcHJpbnRmKF9fZmlsZSwgIiVzID0gJWZcbiIsIF9fZmFjdG9yLT5fX2Vudl92YXIsCisJCSAgIF9fZmFjdG9yLT5fX3ZhbHVlKTsgfQorICB9OworCisgIGlubGluZSB2b2lkCisgIF9fd3JpdGVfY29zdF9mYWN0b3JzKCkKKyAgeworICAgIEZJTEUqIF9fZmlsZSA9IF9fb3Blbl9vdXRwdXRfZmlsZSgiY29uZi5vdXQiKTsKKyAgICBfX2Zvcl9lYWNoKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPmJlZ2luKCksCisJICAgICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPmVuZCgpLAorCSAgICAgICBfX2Nvc3RfZmFjdG9yX3dyaXRlcihfX2ZpbGUpKTsKKyAgICBzdGQ6OmZjbG9zZShfX2ZpbGUpOworICB9CisKKyAgc3RydWN0IF9fY29zdF9mYWN0b3Jfc2V0dGVyCisgIHsKKyAgICB2b2lkCisgICAgb3BlcmF0b3IoKShfX2Nvc3RfZmFjdG9yKiBfX2ZhY3RvcikKKyAgICB7CisgICAgICAvLyBMb29rIGl0IHVwIGluIHRoZSBwcm9jZXNzIGVudmlyb25tZW50IGZpcnN0LgorICAgICAgY29uc3QgY2hhciogX19lbnZfdmFsdWUgPSBzdGQ6OmdldGVudihfX2ZhY3Rvci0+X19lbnZfdmFyKTsKKworICAgICAgaWYgKCFfX2Vudl92YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgIC8vIExvb2sgaXQgdXAgaW4gdGhlIGNvbmZpZyBmaWxlLgorICAgICAgICAgIF9fZW52X3Q6Oml0ZXJhdG9yIF9faXQgCisJICAgID0gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fZW52KS5maW5kKF9fZmFjdG9yLT5fX2Vudl92YXIpOworICAgICAgICAgIGlmIChfX2l0ICE9IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2VudikuZW5kKCkpCisgICAgICAgICAgICBfX2Vudl92YWx1ZSA9ICgqX19pdCkuc2Vjb25kLmNfc3RyKCk7CisgICAgICAgIH0KKworICAgICAgaWYgKF9fZW52X3ZhbHVlKQorICAgICAgICBfX2ZhY3Rvci0+X192YWx1ZSA9IHN0ZDo6YXRvZihfX2Vudl92YWx1ZSk7CisgICAgfQorICB9OworCisgIGlubGluZSB2b2lkCisgIF9fc2V0X2Nvc3RfZmFjdG9ycygpCisgIHsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpID0gbmV3IF9fY29zdF9mYWN0b3JfdmVjdG9yOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX192ZWN0b3Jfc2hpZnRfY29zdF9mYWN0b3IpKTsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdmVjdG9yX2l0ZXJhdGVfY29zdF9mYWN0b3IpKTsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdmVjdG9yX3Jlc2l6ZV9jb3N0X2ZhY3RvcikpOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19saXN0X3NoaWZ0X2Nvc3RfZmFjdG9yKSk7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2xpc3RfaXRlcmF0ZV9jb3N0X2ZhY3RvcikpOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19saXN0X3Jlc2l6ZV9jb3N0X2ZhY3RvcikpOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19tYXBfaW5zZXJ0X2Nvc3RfZmFjdG9yKSk7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX21hcF9lcmFzZV9jb3N0X2ZhY3RvcikpOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19tYXBfZmluZF9jb3N0X2ZhY3RvcikpOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19tYXBfaXRlcmF0ZV9jb3N0X2ZhY3RvcikpOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX191bWFwX2luc2VydF9jb3N0X2ZhY3RvcikpOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX191bWFwX2VyYXNlX2Nvc3RfZmFjdG9yKSk7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3VtYXBfZmluZF9jb3N0X2ZhY3RvcikpOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX191bWFwX2l0ZXJhdGVfY29zdF9mYWN0b3IpKTsKKyAgICBfX2Zvcl9lYWNoKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPmJlZ2luKCksCisJICAgICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPmVuZCgpLAorCSAgICAgICBfX2Nvc3RfZmFjdG9yX3NldHRlcigpKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fcHJvZmN4eF9pbml0X3VuY29uZGl0aW9uYWwoKQorICB7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fZ2xvYmFsX2xvY2spLmxvY2soKTsKKworICAgIGlmIChfX2lzX2ludmFsaWQoKSkKKyAgICAgIHsKKwlfX3NldF9tYXhfd2Fybl9jb3VudCgpOworCisJaWYgKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXhfd2Fybl9jb3VudCkgPT0gMCkKKwkgIF9fdHVybl9vZmYoKTsKKwllbHNlCisJICB7CisJICAgIF9fc2V0X21heF9zdGFja190cmFjZV9kZXB0aCgpOworCSAgICBfX3NldF9tYXhfbWVtKCk7CisJICAgIF9fc2V0X3RyYWNlX3BhdGgoKTsKKwkgICAgX19yZWFkX2Nvc3RfZmFjdG9ycygpOyAKKwkgICAgX19zZXRfY29zdF9mYWN0b3JzKCk7CisJICAgIF9fd3JpdGVfY29zdF9mYWN0b3JzKCk7CisKKwkgICAgX190cmFjZV92ZWN0b3Jfc2l6ZV9pbml0KCk7CisJICAgIF9fdHJhY2VfaGFzaHRhYmxlX3NpemVfaW5pdCgpOworCSAgICBfX3RyYWNlX2hhc2hfZnVuY19pbml0KCk7CisJICAgIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaW5pdCgpOworCSAgICBfX3RyYWNlX2xpc3RfdG9fc2xpc3RfaW5pdCgpOyAKKwkgICAgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9pbml0KCk7CisJICAgIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5pdCgpOworCisJICAgIHN0ZDo6YXRleGl0KF9fcmVwb3J0KTsKKworCSAgICBfX3R1cm5fb24oKTsKKwkgIH0KKyAgICAgIH0KKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2dsb2JhbF9sb2NrKS51bmxvY2soKTsKKyAgfQorCisgIC8qKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBieSBlYWNoIGluc3RydW1lbnRhdGlvbiBwb2ludC4KKyAgICoKKyAgICogVGhlIGNvbW1vbiBwYXRoIGlzIGlubGluZWQgZnVsbHkuCisgICAqLworICBpbmxpbmUgYm9vbAorICBfX3Byb2ZjeHhfaW5pdCgpCisgIHsKKyAgICBpZiAoX19pc19pbnZhbGlkKCkpCisgICAgICBfX3Byb2ZjeHhfaW5pdF91bmNvbmRpdGlvbmFsKCk7CisKKyAgICByZXR1cm4gX19pc19vbigpOworICB9CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3NpemUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3ZlY3Rvcl9zaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjYjVmZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3ZlY3Rvcl9zaXplLmgKQEAgLTAsMCArMSw5NyBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3NpemUuaAorICogIEBicmllZiBDb2xsZWN0aW9uIG9mIHZlY3RvciBzaXplIHRyYWNlcy4KKyAqLworCisvLyBXcml0dGVuIGJ5IExpeGlhIExpdSBhbmQgU2lsdml1cyBSdXMuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9WRUNUT1JfU0laRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfVkVDVE9SX1NJWkVfSCAxCisKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXIuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9zdGF0ZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9jb250YWluZXJfc2l6ZS5oIgorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICAvKiogQGJyaWVmIEhhc2h0YWJsZSBzaXplIGluc3RydW1lbnRhdGlvbiB0cmFjZSBwcm9kdWNlci4gICovCisgIGNsYXNzIF9fdHJhY2VfdmVjdG9yX3NpemUKKyAgOiBwdWJsaWMgX190cmFjZV9jb250YWluZXJfc2l6ZQorICB7CisgIHB1YmxpYzoKKyAgICBfX3RyYWNlX3ZlY3Rvcl9zaXplKCkKKyAgICA6IF9fdHJhY2VfY29udGFpbmVyX3NpemUoKQorICAgIHsgX19pZCA9ICJ2ZWN0b3Itc2l6ZSI7IH0KKyAgfTsKKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX3ZlY3Rvcl9zaXplX2luaXQoKQorICB7IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3Jfc2l6ZSkgPSBuZXcgX190cmFjZV92ZWN0b3Jfc2l6ZSgpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3Jfc2l6ZV9yZXBvcnQoRklMRSogX19mLCBfX3dhcm5pbmdfdmVjdG9yX3QmIF9fd2FybmluZ3MpCisgIHsKKyAgICBpZiAoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl9zaXplKSkKKyAgICAgIHsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdmVjdG9yX3NpemUpLT5fX2NvbGxlY3Rfd2FybmluZ3MoX193YXJuaW5ncyk7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl9zaXplKS0+X193cml0ZShfX2YpOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3Jfc2l6ZV9jb25zdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fbnVtKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl9zaXplKS0+X19pbnNlcnQoX19vYmosIF9fZ2V0X3N0YWNrKCksCisJCQkJCQkgICAgX19udW0pOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3Jfc2l6ZV9kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19udW0sCisJCQkgICAgICAgc3RkOjpzaXplX3QgX19pbnVtKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl9zaXplKS0+X19kZXN0cnVjdChfX29iaiwgX19udW0sIF9faW51bSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX3ZlY3Rvcl9zaXplX3Jlc2l6ZShjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19mcm9tLAorCQkJICAgICBzdGQ6OnNpemVfdCBfX3RvKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl9zaXplKS0+X19yZXNpemUoX19vYmosIF9fZnJvbSwgX190byk7CisgIH0KKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcHJvZmlsZQorCisjZW5kaWYgLyogX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9WRUNUT1JfU0laRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl92ZWN0b3JfdG9fbGlzdC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3RvX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGUzNzhiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3RvX2xpc3QuaApAQCAtMCwwICsxLDM0NyBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3RvX2xpc3QuaAorICogIEBicmllZiBkaWFnbm9zdGljcyBmb3IgdmVjdG9yIHRvIGxpc3QuCisgKi8KKworLy8gV3JpdHRlbiBieSBMaXhpYSBMaXUgYW5kIFNpbHZpdXMgUnVzLgorCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfVkVDVE9SX1RPX0xJU1RfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX1ZFQ1RPUl9UT19MSVNUX0ggMQorCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfdHJhY2UuaCIKKworbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKK3sKKyAgLyoqIEBicmllZiBBIHZlY3Rvci10by1saXN0IGluc3RydW1lbnRhdGlvbiBsaW5lIGluIHRoZSBvYmplY3QgdGFibGUuICAqLworICBjbGFzcyBfX3ZlY3RvcjJsaXN0X2luZm8KKyAgOiBwdWJsaWMgX19vYmplY3RfaW5mb19iYXNlCisgIHsKKyAgcHVibGljOgorICAgIF9fdmVjdG9yMmxpc3RfaW5mbygpCisgICAgOiBfTV9zaGlmdF9jb3VudCgwKSwgX01faXRlcmF0ZSgwKSwgX01fcmVzaXplKDApLCBfTV9saXN0X2Nvc3QoMCksCisgICAgICBfTV92ZWN0b3JfY29zdCgwKSwgX01fdmFsaWQodHJ1ZSkgeyB9CisKKyAgICBfX3ZlY3RvcjJsaXN0X2luZm8oX19zdGFja190IF9fc3RhY2spCisgICAgOiBfX29iamVjdF9pbmZvX2Jhc2UoX19zdGFjayksIF9NX3NoaWZ0X2NvdW50KDApLCBfTV9pdGVyYXRlKDApLAorICAgICAgX01fcmVzaXplKDApLCBfTV9saXN0X2Nvc3QoMCksIF9NX3ZlY3Rvcl9jb3N0KDApLCBfTV92YWxpZCh0cnVlKSB7IH0KKworICAgIHZpcnR1YWwgfl9fdmVjdG9yMmxpc3RfaW5mbygpIHsgfQorCisgICAgX192ZWN0b3IybGlzdF9pbmZvKGNvbnN0IF9fdmVjdG9yMmxpc3RfaW5mbyYgX19vKQorICAgIDogX19vYmplY3RfaW5mb19iYXNlKF9fbyksIF9NX3NoaWZ0X2NvdW50KF9fby5fTV9zaGlmdF9jb3VudCksCisgICAgICBfTV9pdGVyYXRlKF9fby5fTV9pdGVyYXRlKSwgX01fcmVzaXplKF9fby5fTV9yZXNpemUpLAorICAgICAgX01fbGlzdF9jb3N0KF9fby5fTV9saXN0X2Nvc3QpLCBfTV92ZWN0b3JfY29zdChfX28uX01fdmVjdG9yX2Nvc3QpLAorICAgICAgX01fdmFsaWQoX19vLl9NX3ZhbGlkKSB7IH0KKworICAgIHZvaWQKKyAgICBfX21lcmdlKGNvbnN0IF9fdmVjdG9yMmxpc3RfaW5mbyYgX19vKQorICAgIHsKKyAgICAgIF9NX3NoaWZ0X2NvdW50ICArPSBfX28uX01fc2hpZnRfY291bnQ7CisgICAgICBfTV9pdGVyYXRlICAgICAgKz0gX19vLl9NX2l0ZXJhdGU7CisgICAgICBfTV92ZWN0b3JfY29zdCAgKz0gX19vLl9NX3ZlY3Rvcl9jb3N0OworICAgICAgX01fbGlzdF9jb3N0ICAgICs9IF9fby5fTV9saXN0X2Nvc3Q7CisgICAgICBfTV92YWxpZCAgICAgICAgJj0gX19vLl9NX3ZhbGlkOworICAgICAgX01fcmVzaXplICAgICAgICs9IF9fby5fTV9yZXNpemU7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fd3JpdGUoRklMRSogX19mKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6ZnByaW50ZihfX2YsICIlWnUgJVp1ICVadSAlLjBmICUuMGZcbiIsIF9NX3NoaWZ0X2NvdW50LAorCQkgICBfTV9yZXNpemUsIF9NX2l0ZXJhdGUsIF9NX3ZlY3Rvcl9jb3N0LCBfTV9saXN0X2Nvc3QpOworICAgIH0KKworICAgIGZsb2F0CisgICAgX19tYWduaXR1ZGUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3ZlY3Rvcl9jb3N0IC0gX01fbGlzdF9jb3N0OyB9CisKKyAgICBzdGQ6OnN0cmluZworICAgIF9fYWR2aWNlKCkgY29uc3QgCisgICAgeyByZXR1cm4gImNoYW5nZSBzdGQ6OnZlY3RvciB0byBzdGQ6Omxpc3QiOyB9CisKKyAgICBzdGQ6OnNpemVfdAorICAgIF9fc2hpZnRfY291bnQoKQorICAgIHsgcmV0dXJuIF9NX3NoaWZ0X2NvdW50OyB9CisKKyAgICBzdGQ6OnNpemVfdAorICAgIF9faXRlcmF0ZSgpCisgICAgeyByZXR1cm4gX01faXRlcmF0ZTsgfQorCisgICAgZmxvYXQKKyAgICBfX2xpc3RfY29zdCgpCisgICAgeyByZXR1cm4gX01fbGlzdF9jb3N0OyB9CisKKyAgICBzdGQ6OnNpemVfdAorICAgIF9fcmVzaXplKCkKKyAgICB7IHJldHVybiBfTV9yZXNpemU7IH0KKworICAgIHZvaWQKKyAgICBfX3NldF9saXN0X2Nvc3QoZmxvYXQgX19sYykKKyAgICB7IF9NX2xpc3RfY29zdCA9IF9fbGM7IH0KKyAgICAKKyAgICB2b2lkCisgICAgX19zZXRfdmVjdG9yX2Nvc3QoZmxvYXQgX192YykKKyAgICB7IF9NX3ZlY3Rvcl9jb3N0ID0gX192YzsgfQorICAgIAorICAgIGJvb2wKKyAgICBfX2lzX3ZhbGlkKCkKKyAgICB7IHJldHVybiBfTV92YWxpZDsgfQorICAgIAorICAgIHZvaWQKKyAgICBfX3NldF9pbnZhbGlkKCkKKyAgICB7IF9NX3ZhbGlkID0gZmFsc2U7IH0KKworICAgIHZvaWQKKyAgICBfX29wcl9pbnNlcnQoc3RkOjpzaXplX3QgX19wb3MsIHN0ZDo6c2l6ZV90IF9fbnVtKQorICAgIHsgX01fc2hpZnRfY291bnQgKz0gX19udW0gLSBfX3BvczsgfQorCisgICAgdm9pZAorICAgIF9fb3ByX2l0ZXJhdGUoc3RkOjpzaXplX3QgX19udW0pCisgICAgeyBfTV9pdGVyYXRlICs9IF9fbnVtOyB9CisKKyAgICB2b2lkCisgICAgX19yZXNpemUoc3RkOjpzaXplX3QgX19mcm9tLCBzdGQ6OnNpemVfdCkKKyAgICB7IF9NX3Jlc2l6ZSArPSBfX2Zyb207IH0KKworICAgIHZvaWQKKyAgICBfX29wcl9maW5kKHN0ZDo6c2l6ZV90IF9fc2l6ZSkKKyAgICB7CisgICAgICAvLyBVc2UgYXZlcmFnZSBjYXNlIGNvbXBsZXhpdHkuCisgICAgICBfTV9pdGVyYXRlICs9IDMuMCAvIDQuMCAqIF9fc2l6ZTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNpemVfdCBfTV9zaGlmdF9jb3VudDsKKyAgICBzdGQ6OnNpemVfdCBfTV9pdGVyYXRlOworICAgIHN0ZDo6c2l6ZV90IF9NX3Jlc2l6ZTsKKyAgICBmbG9hdCBfTV9saXN0X2Nvc3Q7CisgICAgZmxvYXQgX01fdmVjdG9yX2Nvc3Q7CisgICAgYm9vbCAgX01fdmFsaWQ7CisgIH07CisKKworICAvKiogQGJyaWVmIEEgdmVjdG9yLXRvLWxpc3QgaW5zdHJ1bWVudGF0aW9uIGxpbmUgaW4gdGhlIHN0YWNrIHRhYmxlLiAgKi8KKyAgY2xhc3MgX192ZWN0b3IybGlzdF9zdGFja19pbmZvCisgIDogcHVibGljIF9fdmVjdG9yMmxpc3RfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBfX3ZlY3RvcjJsaXN0X3N0YWNrX2luZm8oY29uc3QgX192ZWN0b3IybGlzdF9pbmZvJiBfX28pIAorICAgIDogX192ZWN0b3IybGlzdF9pbmZvKF9fbykgeyB9CisgIH07CisKKworICAvKiogQGJyaWVmIFZlY3Rvci10by1saXN0IGluc3RydW1lbnRhdGlvbiBwcm9kdWNlci4gICovCisgIGNsYXNzIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3QKKyAgOiBwdWJsaWMgX190cmFjZV9iYXNlPF9fdmVjdG9yMmxpc3RfaW5mbywgX192ZWN0b3IybGlzdF9zdGFja19pbmZvPiAKKyAgeworICBwdWJsaWM6CisgICAgX190cmFjZV92ZWN0b3JfdG9fbGlzdCgpCisgICAgOiBfX3RyYWNlX2Jhc2U8X192ZWN0b3IybGlzdF9pbmZvLCBfX3ZlY3RvcjJsaXN0X3N0YWNrX2luZm8+KCkKKyAgICB7IF9faWQgPSAidmVjdG9yLXRvLWxpc3QiOyB9CisKKyAgICB+X190cmFjZV92ZWN0b3JfdG9fbGlzdCgpIHsgfQorCisgICAgLy8gSW5zZXJ0IGEgbmV3IG5vZGUgYXQgY29uc3RydWN0IHdpdGggb2JqZWN0LCBjYWxsc3RhY2sgYW5kIGluaXRpYWwgc2l6ZS4gCisgICAgdm9pZAorICAgIF9faW5zZXJ0KF9fb2JqZWN0X3QgX19vYmosIF9fc3RhY2tfdCBfX3N0YWNrKQorICAgIHsgX19hZGRfb2JqZWN0KF9fb2JqLCBfX3ZlY3RvcjJsaXN0X2luZm8oX19zdGFjaykpOyB9CisKKyAgICAvLyBDYWxsIGF0IGRlc3RydWN0aW9uL2NsZWFuIHRvIHNldCBjb250YWluZXIgZmluYWwgc2l6ZS4KKyAgICB2b2lkCisgICAgX19kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgICB7CisgICAgICBpZiAoIV9faXNfb24oKSkKKwlyZXR1cm47CisKKyAgICAgIF9fdmVjdG9yMmxpc3RfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoIV9fcmVzKQorCXJldHVybjsKKworICAgICAgZmxvYXQgX192YyA9IF9fdmVjdG9yX2Nvc3QoX19yZXMtPl9fc2hpZnRfY291bnQoKSwgX19yZXMtPl9faXRlcmF0ZSgpLAorCQkJCSBfX3Jlcy0+X19yZXNpemUoKSk7CisgICAgICBmbG9hdCBfX2xjID0gX19saXN0X2Nvc3QoX19yZXMtPl9fc2hpZnRfY291bnQoKSwgX19yZXMtPl9faXRlcmF0ZSgpLAorCQkJICAgICAgIF9fcmVzLT5fX3Jlc2l6ZSgpKTsKKyAgICAgIF9fcmVzLT5fX3NldF92ZWN0b3JfY29zdChfX3ZjKTsKKyAgICAgIF9fcmVzLT5fX3NldF9saXN0X2Nvc3QoX19sYyk7CisKKyAgICAgIF9fcmV0aXJlX29iamVjdChfX29iaik7CisgICAgfQorCisgICAgLy8gRmluZCB0aGUgbm9kZSBpbiB0aGUgbGl2ZSBtYXAuCisgICAgLy8gWFhYIFVuZGVmaW5lZD8hPworICAgIF9fdmVjdG9yMmxpc3RfaW5mbyogX19maW5kKGNvbnN0IHZvaWQqIF9fb2JqKTsKKworICAgIC8vIENvbGxlY3QgY29zdCBvZiBvcGVyYXRpb25zLgorICAgIHZvaWQKKyAgICBfX29wcl9pbnNlcnQoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fcG9zLCBzdGQ6OnNpemVfdCBfX251bSkKKyAgICB7CisgICAgICBfX3ZlY3RvcjJsaXN0X2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKF9fcmVzKQorCV9fcmVzLT5fX29wcl9pbnNlcnQoX19wb3MsIF9fbnVtKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19vcHJfaXRlcmF0ZShjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19udW0pCisgICAgeworICAgICAgX192ZWN0b3IybGlzdF9pbmZvKiBfX3JlcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmIChfX3JlcykKKwlfX3Jlcy0+X19vcHJfaXRlcmF0ZShfX251bSk7CisgICAgfQorCisgICAgdm9pZAorICAgIF9faW52YWxpZF9vcGVyYXRvcihjb25zdCB2b2lkKiBfX29iaikKKyAgICB7CisgICAgICBfX3ZlY3RvcjJsaXN0X2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKF9fcmVzKQorCV9fcmVzLT5fX3NldF9pbnZhbGlkKCk7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fcmVzaXplKGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX2Zyb20sIHN0ZDo6c2l6ZV90IF9fdG8pCisgICAgeworICAgICAgX192ZWN0b3IybGlzdF9pbmZvKiBfX3JlcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmIChfX3JlcykKKwlfX3Jlcy0+X19yZXNpemUoX19mcm9tLCBfX3RvKTsKKyAgICB9CisKKyAgICBmbG9hdAorICAgIF9fdmVjdG9yX2Nvc3Qoc3RkOjpzaXplX3QgX19zaGlmdCwgc3RkOjpzaXplX3QgX19pdGVyYXRlLAorCQkgIHN0ZDo6c2l6ZV90IF9fcmVzaXplKQorICAgIHsKKyAgICAgIHJldHVybiAoX19zaGlmdAorCSAgICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdmVjdG9yX3NoaWZ0X2Nvc3RfZmFjdG9yKS5fX3ZhbHVlCisJICAgICAgKyBfX2l0ZXJhdGUKKwkgICAgICAqIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3ZlY3Rvcl9pdGVyYXRlX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlCisJICAgICAgKyBfX3Jlc2l6ZQorCSAgICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdmVjdG9yX3Jlc2l6ZV9jb3N0X2ZhY3RvcikuX192YWx1ZSk7CisgICAgfQorCisgICAgZmxvYXQKKyAgICBfX2xpc3RfY29zdChzdGQ6OnNpemVfdCBfX3NoaWZ0LCBzdGQ6OnNpemVfdCBfX2l0ZXJhdGUsCisJCXN0ZDo6c2l6ZV90IF9fcmVzaXplKQorICAgIHsKKyAgICAgIHJldHVybiAoX19zaGlmdAorCSAgICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbGlzdF9zaGlmdF9jb3N0X2ZhY3RvcikuX192YWx1ZQorCSAgICAgICsgX19pdGVyYXRlCisJICAgICAgKiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19saXN0X2l0ZXJhdGVfY29zdF9mYWN0b3IpLl9fdmFsdWUKKwkgICAgICArIF9fcmVzaXplCisJICAgICAgKiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19saXN0X3Jlc2l6ZV9jb3N0X2ZhY3RvcikuX192YWx1ZSk7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fb3ByX2ZpbmQoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fc2l6ZSkKKyAgICB7CisgICAgICBfX3ZlY3RvcjJsaXN0X2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKF9fcmVzKQorCV9fcmVzLT5fX29wcl9maW5kKF9fc2l6ZSk7CisgICAgfQorICB9OworCisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9pbml0KCkKKyAgeyBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdmVjdG9yX3RvX2xpc3QpID0gbmV3IF9fdHJhY2VfdmVjdG9yX3RvX2xpc3QoKTsgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfcmVwb3J0KEZJTEUqIF9fZiwgX193YXJuaW5nX3ZlY3Rvcl90JiBfX3dhcm5pbmdzKQorICB7CisgICAgaWYgKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3JfdG9fbGlzdCkpCisgICAgICB7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KS0+CisJICBfX2NvbGxlY3Rfd2FybmluZ3MoX193YXJuaW5ncyk7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KS0+X193cml0ZShfX2YpOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9jb25zdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdmVjdG9yX3RvX2xpc3QpLT5fX2luc2VydChfX29iaiwgX19nZXRfc3RhY2soKSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2Rlc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KS0+X19kZXN0cnVjdChfX29iaik7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2luc2VydChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19wb3MsCisJCQkJc3RkOjpzaXplX3QgX19udW0pCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdmVjdG9yX3RvX2xpc3QpLT5fX29wcl9pbnNlcnQoX19vYmosIF9fcG9zLAorCQkJCQkJCSAgIF9fbnVtKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaXRlcmF0ZShjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19udW0gPSAxKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KS0+X19vcHJfaXRlcmF0ZShfX29iaiwgX19udW0pOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9pbnZhbGlkX29wZXJhdG9yKGNvbnN0IHZvaWQqIF9fb2JqKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KS0+X19pbnZhbGlkX29wZXJhdG9yKF9fb2JqKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfcmVzaXplKGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX2Zyb20sCisJCQkJc3RkOjpzaXplX3QgX190bykKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3JfdG9fbGlzdCktPl9fcmVzaXplKF9fb2JqLCBfX2Zyb20sIF9fdG8pOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9maW5kKGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX3NpemUpCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdmVjdG9yX3RvX2xpc3QpLT5fX29wcl9maW5kKF9fb2JqLCBfX3NpemUpOworICB9CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX1ZFQ1RPUl9UT19MSVNUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pdGVyYXRvcl90cmFja2VyLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaXRlcmF0b3JfdHJhY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MWVmZjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaXRlcmF0b3JfdHJhY2tlci5oCkBAIC0wLDAgKzEsMjc0IEBACisvLyBQcm9maWxpbmcgaXRlcmF0b3IgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvaXRlcmF0b3JfdHJhY2tlci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfSVRFUkFUT1JfVFJBQ0tFUgorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX0lURVJBVE9SX1RSQUNLRVIgMQorCisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcHJvZmlsZQoreworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGNsYXNzIF9faXRlcmF0b3JfdHJhY2tlciAKKyAgICB7CisgICAgICB0eXBlZGVmIF9faXRlcmF0b3JfdHJhY2tlciBfU2VsZjsKKworICAgICAgLy8gVGhlIHVuZGVybHlpbmcgaXRlcmF0b3IKKyAgICAgIF9JdGVyYXRvciBfTV9jdXJyZW50OworCisgICAgICAvLyBUaGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZQorICAgICAgY29uc3QgX1NlcXVlbmNlKiBfTV9kczsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPiBfVHJhaXRzOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfSXRlcmF0b3IJCSAgICAgICAgICAgICAgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OyAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6dmFsdWVfdHlwZSAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6ZGlmZmVyZW5jZV90eXBlICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpyZWZlcmVuY2UgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvaW50ZXIgICAgICAgICAgIHBvaW50ZXI7CisKKyAgICAgIF9faXRlcmF0b3JfdHJhY2tlcigpCisgICAgICA6IF9NX2N1cnJlbnQoKSwgX01fZHMoMCkgeyB9CisKKyAgICAgIF9faXRlcmF0b3JfdHJhY2tlcihjb25zdCBfSXRlcmF0b3ImIF9faSwgY29uc3QgX1NlcXVlbmNlKiBfX3NlcSkgCisgICAgICA6IF9NX2N1cnJlbnQoX19pKSwgX01fZHMoX19zZXEpIHsgfQorCisgICAgICBfX2l0ZXJhdG9yX3RyYWNrZXIoY29uc3QgX19pdGVyYXRvcl90cmFja2VyJiBfX3gpIAorICAgICAgOiBfTV9jdXJyZW50KF9feC5fTV9jdXJyZW50KSwgX01fZHMoX194Ll9NX2RzKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX011dGFibGVJdGVyYXRvcj4KKyAgICAgICAgX19pdGVyYXRvcl90cmFja2VyKGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfTXV0YWJsZUl0ZXJhdG9yLAorCQkJICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZgorCQkJICAgPChzdGQ6Ol9fYXJlX3NhbWU8X011dGFibGVJdGVyYXRvciwgdHlwZW5hbWUKKwkJCSAgICAgX1NlcXVlbmNlOjppdGVyYXRvcjo6X0Jhc2VfaXRlcmF0b3I+OjpfX3ZhbHVlKSwKKwkJCSAgIF9TZXF1ZW5jZT46Ol9fdHlwZT4mIF9feCkKKwk6ICBfTV9jdXJyZW50KF9feC5iYXNlKCkpLCBfTV9kcyhfX3guX01fZ2V0X3NlcXVlbmNlKCkpIHsgfQorCisgICAgICBfSXRlcmF0b3IKKyAgICAgIGJhc2UoKSBjb25zdCB7IHJldHVybiBfTV9jdXJyZW50OyB9CisgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29udmVyc2lvbiB0byB1bmRlcmx5aW5nIG5vbi1kZWJ1ZyBpdGVyYXRvciB0byBhbGxvdworICAgICAgICogYmV0dGVyIGludGVyYWN0aW9uIHdpdGggbm9uLXByb2ZpbGUgY29udGFpbmVycy4KKyAgICAgICAqLworICAgICAgb3BlcmF0b3IgX0l0ZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fY3VycmVudDsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJipfTV9jdXJyZW50OyB9CisKKyAgICAgIF9faXRlcmF0b3JfdHJhY2tlciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9NX2RzLT5fTV9wcm9maWxlX2l0ZXJhdGUoKTsKKwkrK19NX2N1cnJlbnQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfX2l0ZXJhdG9yX3RyYWNrZXIKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9NX2RzLT5fTV9wcm9maWxlX2l0ZXJhdGUoKTsKKwlfX2l0ZXJhdG9yX3RyYWNrZXIgX190bXAoKnRoaXMpOworCSsrX01fY3VycmVudDsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIF9faXRlcmF0b3JfdHJhY2tlciYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCV9NX2RzLT5fTV9wcm9maWxlX2l0ZXJhdGUoMSk7CisJLS1fTV9jdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX19pdGVyYXRvcl90cmFja2VyCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlfTV9kcy0+X01fcHJvZmlsZV9pdGVyYXRlKDEpOworCV9faXRlcmF0b3JfdHJhY2tlciBfX3RtcCgqdGhpcyk7CisJLS1fTV9jdXJyZW50OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgX19pdGVyYXRvcl90cmFja2VyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlciYgX194KQorICAgICAgeworCV9NX2N1cnJlbnQgPSBfX3guX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpfTV9jdXJyZW50OyB9CisKKyAgICAgIC8vIC0tLS0tLSBSYW5kb20gYWNjZXNzIGl0ZXJhdG9yIHJlcXVpcmVtZW50cyAtLS0tLS0KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikgY29uc3QgCisgICAgICB7IHJldHVybiBfTV9jdXJyZW50W19fbl07IH0KKworICAgICAgX19pdGVyYXRvcl90cmFja2VyJgorICAgICAgb3BlcmF0b3IrPShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikKKyAgICAgIHsKKwlfTV9jdXJyZW50ICs9IF9fbjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9faXRlcmF0b3JfdHJhY2tlcgorICAgICAgb3BlcmF0b3IrKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKSBjb25zdAorICAgICAgeworCV9faXRlcmF0b3JfdHJhY2tlciBfX3RtcCgqdGhpcyk7CisJX190bXAgKz0gX19uOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgX19pdGVyYXRvcl90cmFja2VyJgorICAgICAgb3BlcmF0b3ItPShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikKKyAgICAgIHsKKwlfTV9jdXJyZW50ICs9IC1fX247CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfX2l0ZXJhdG9yX3RyYWNrZXIKKyAgICAgIG9wZXJhdG9yLShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikgY29uc3QKKyAgICAgIHsKKwlfX2l0ZXJhdG9yX3RyYWNrZXIgX190bXAoKnRoaXMpOworCV9fdG1wIC09IF9fbjsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ZpbmQoKQorICAgICAgeyBfTV9kcy0+X01fcHJvZmlsZV9maW5kKCk7IH0KKworICAgICAgY29uc3QgX1NlcXVlbmNlKgorICAgICAgX01fZ2V0X3NlcXVlbmNlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9TZXF1ZW5jZSo+KF9NX2RzKTsgfQorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpID09IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpID09IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpICE9IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKyAgICAgICAgICAgICAgIGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSAhPSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPCBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPCBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA8PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA8PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPiBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPiBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA+PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA+PSBfX3Jocy5iYXNlKCk7IH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIEFjY29yZGluZyB0byB0aGUgcmVzb2x1dGlvbiBvZiBEUjE3OSBub3Qgb25seSB0aGUgdmFyaW91cyBjb21wYXJpc29uCisgIC8vIG9wZXJhdG9ycyBidXQgYWxzbyBvcGVyYXRvci0gbXVzdCBhY2NlcHQgbWl4ZWQgaXRlcmF0b3IvY29uc3RfaXRlcmF0b3IKKyAgLy8gcGFyYW1ldGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgb3BlcmF0b3ItKGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpIC0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIHR5cGVuYW1lIF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT46OmRpZmZlcmVuY2VfdHlwZQorICAgIG9wZXJhdG9yLShjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgLSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPgorICAgIG9wZXJhdG9yKyh0eXBlbmFtZSBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLF9TZXF1ZW5jZT46OmRpZmZlcmVuY2VfdHlwZQorCSAgICAgIF9fbiwKKwkgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2kpCisgICAgeyByZXR1cm4gX19pICsgX19uOyB9CisJCit9ICAvLyBuYW1lc3BhY2UgX19wcm9maWxlCit9ICAvLyBuYW1lc3BhY2Ugc3RkCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9saXN0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3MGM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9saXN0CkBAIC0wLDAgKzEsNjU3IEBACisvLyBQcm9maWxpbmcgbGlzdCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9saXN0CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTElTVAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX0xJU1QgMQorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxwcm9maWxlL2Jhc2UuaD4gCisjaW5jbHVkZSA8cHJvZmlsZS9pdGVyYXRvcl90cmFja2VyLmg+IAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgLyoqIEBicmllZiBMaXN0IHdyYXBwZXIgd2l0aCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24uICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8X1RwPiA+CisgICAgY2xhc3MgbGlzdAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjpsaXN0PF9UcCwgX0FsbG9jYXRvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjpsaXN0PF9UcCwgX0FsbG9jYXRvcj4gX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBfX2l0ZXJhdG9yX3RyYWNrZXI8dHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yLCBsaXN0PiAgICAgICAgCisJCQkJICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19pdGVyYXRvcl90cmFja2VyPHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciwgbGlzdD4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiBfVHAJCQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IJCQkgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3BvaW50ZXIgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gMjMuMi4yLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0CisgICAgICBsaXN0KGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19hKSAKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0KHRoaXMpOyAJLy8gbGlzdDJzbGlzdAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKHRoaXMpOyAJLy8gbGlzdDJ2ZWN0b3IKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGV4cGxpY2l0CisgICAgICBsaXN0KHNpemVfdHlwZSBfX24pCisgICAgICA6IF9CYXNlKF9fbikgCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdCh0aGlzKTsgCisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdDIodGhpcyk7IAorICAgICAgfQorCisgICAgICBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSwKKwkgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX192YWx1ZSwgX19hKSAKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0KHRoaXMpOyAKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0Mih0aGlzKTsgCisgICAgICB9CisjZWxzZQorICAgICAgZXhwbGljaXQKKyAgICAgIGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlID0gX1RwKCksCisJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX24sIF9fdmFsdWUsIF9fYSkgCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdCh0aGlzKTsgCisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdDIodGhpcyk7IAorICAgICAgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2ZpcnN0LCBfX2xhc3QsIF9fYSkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0KHRoaXMpOyAKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0Mih0aGlzKTsgCisgICAgICB9CisKKyAgICAgIGxpc3QoY29uc3QgbGlzdCYgX194KQorICAgICAgOiBfQmFzZShfX3gpIAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QodGhpcyk7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKHRoaXMpOyAKKyAgICAgIH0KKworICAgICAgbGlzdChjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpIAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QodGhpcyk7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKHRoaXMpOyAKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGxpc3QobGlzdCYmIF9feCkgbm9leGNlcHQKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdCh0aGlzKTsgCisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdDIodGhpcyk7IAorICAgICAgfQorCisgICAgICBsaXN0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgOiBfQmFzZShfX2wsIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgfmxpc3QoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfZGVzdHJ1Y3QodGhpcyk7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9kZXN0cnVjdDIodGhpcyk7IAorICAgICAgfQorCisgICAgICBsaXN0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGxpc3QmIF9feCkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IF9feDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBsaXN0JgorICAgICAgb3BlcmF0b3I9KGxpc3QmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGxpc3QmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBfX2w7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CV9CYXNlOjphc3NpZ24oX19sKTsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX0Jhc2U6OmFzc2lnbihfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdCkKKyAgICAgIHsJX0Jhc2U6OmFzc2lnbihfX24sIF9fdCk7IH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisKKyAgICAgIC8vIGl0ZXJhdG9yczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfcmV3aW5kKHRoaXMpOworICAgICAgICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X3Jld2luZCh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X3Jld2luZCh0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOworICAgICAgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfcmV3aW5kKHRoaXMpOworICAgICAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7CisgICAgICB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gMjMuMi4yLjIgY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeikKKyAgICAgIHsgX0Jhc2U6OnJlc2l6ZShfX3N6KTsgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIGNvbnN0IF9UcCYgX19jKQorICAgICAgeyBfQmFzZTo6cmVzaXplKF9fc3osIF9fYyk7IH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIF9UcCBfX2MgPSBfVHAoKSkKKyAgICAgIHsgX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOyB9CisjZW5kaWYKKworICAgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgICByZWZlcmVuY2UKKyAgICAgIGZyb250KCkKKyAgICAgIHsgcmV0dXJuIF9CYXNlOjpmcm9udCgpOyB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2U6OmZyb250KCk7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBiYWNrKCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfcmV3aW5kKHRoaXMpOworCXJldHVybiBfQmFzZTo6YmFjaygpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9yZXdpbmQodGhpcyk7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8vIDIzLjIuMi4zIG1vZGlmaWVyczoKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9pbnZhbGlkX29wZXJhdG9yKHRoaXMpOworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9vcGVyYXRpb24odGhpcyk7CisgICAgICAgIF9CYXNlOjpwdXNoX2Zyb250KF9feCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB1c2luZyBfQmFzZTo6ZW1wbGFjZV9mcm9udDsKKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBwb3BfZnJvbnQoKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9vcGVyYXRpb24odGhpcyk7CisJX0Jhc2U6OnBvcF9mcm9udCgpOworICAgICAgfQorCisgICAgICB1c2luZyBfQmFzZTo6cHVzaF9iYWNrOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdXNpbmcgX0Jhc2U6OmVtcGxhY2VfYmFjazsKKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBwb3BfYmFjaygpCisgICAgICB7CisJaXRlcmF0b3IgX192aWN0aW0gPSBlbmQoKTsKKwktLV9fdmljdGltOworCV9CYXNlOjpwb3BfYmFjaygpOworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9yZXdpbmQodGhpcyk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVtcGxhY2UoX19wb3NpdGlvbi5iYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksCisJCQkgIHRoaXMpOworCX0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworICAgICAgICBfTV9wcm9maWxlX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLCBzaXplKCkpOworICAgICAgICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX194KSwgdGhpcyk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9UcCYmIF9feCkKKyAgICAgIHsgCisgICAgICAgIF9NX3Byb2ZpbGVfaW5zZXJ0KHRoaXMsIF9fcG9zaXRpb24sIHNpemUoKSk7CisgICAgICAgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW1wbGFjZShfX3Bvc2l0aW9uLmJhc2UoKSwgc3RkOjptb3ZlKF9feCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7IAorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisgICAgICAgIF9NX3Byb2ZpbGVfaW5zZXJ0KHRoaXMsIF9fcG9zaXRpb24sIHNpemUoKSk7CisgICAgICAgIF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9fbCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworICAgICAgICBfTV9wcm9maWxlX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLCBzaXplKCkpOworCV9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9fbiwgX194KTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwl7CisJICBfTV9wcm9maWxlX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLCBzaXplKCkpOworCSAgX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX19maXJzdCwgX19sYXN0KTsKKwl9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgewlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpLCBfX2xhc3QuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobGlzdCYgX194KQorICAgICAgewlfQmFzZTo6c3dhcChfX3gpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsJX0Jhc2U6OmNsZWFyKCk7IH0KKworICAgICAgLy8gMjMuMi4yLjQgbGlzdCBvcGVyYXRpb25zOgorICAgICAgdm9pZAorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiYgX194KQorI2Vsc2UKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gpCisjZW5kaWYKKyAgICAgIHsgdGhpcy0+c3BsaWNlKF9fcG9zaXRpb24sIF9HTElCQ1hYX01PVkUoX194KSwgX194LmJlZ2luKCksIF9feC5lbmQoKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gpCisgICAgICB7IHRoaXMtPnNwbGljZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19pKQorICAgICAgeyB0aGlzLT5zcGxpY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCksIF9faSk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmJiBfX3gsIGl0ZXJhdG9yIF9faSkKKyNlbHNlCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194LCBpdGVyYXRvciBfX2kpCisjZW5kaWYKKyAgICAgIHsKKwkvLyBXZSB1c2VkIHRvIHBlcmZvcm0gdGhlIHNwbGljZV9hbGxvYyBjaGVjazogIG5vdCBhbnltb3JlLCByZWR1bmRhbnQKKwkvLyBhZnRlciBpbXBsZW1lbnRpbmcgdGhlIHJlbGV2YW50IGJpdHMgb2YgTjE1OTkuCisKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJX0Jhc2U6OnNwbGljZShfX3Bvc2l0aW9uLmJhc2UoKSwgX0dMSUJDWFhfTU9WRShfX3guX01fYmFzZSgpKSwKKwkJICAgICAgX19pLmJhc2UoKSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYmIF9feCwgaXRlcmF0b3IgX19maXJzdCwKKwkgICAgIGl0ZXJhdG9yIF9fbGFzdCkKKyNlbHNlCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194LCBpdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgaXRlcmF0b3IgX19sYXN0KQorI2VuZGlmCisgICAgICB7CisJLy8gV2UgdXNlZCB0byBwZXJmb3JtIHRoZSBzcGxpY2VfYWxsb2MgY2hlY2s6ICBub3QgYW55bW9yZSwgcmVkdW5kYW50CisJLy8gYWZ0ZXIgaW1wbGVtZW50aW5nIHRoZSByZWxldmFudCBiaXRzIG9mIE4xNTk5LgorCisJX0Jhc2U6OnNwbGljZShfX3Bvc2l0aW9uLmJhc2UoKSwgX0dMSUJDWFhfTU9WRShfX3guX01fYmFzZSgpKSwKKwkJICAgICAgX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyB0aGlzLT5zcGxpY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCksIF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICByZW1vdmUoY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgICAgeworCWZvciAoaXRlcmF0b3IgX194ID0gYmVnaW4oKTsgX194ICE9IGVuZCgpOyApCisJICB7CisJICAgIGlmICgqX194ID09IF9fdmFsdWUpCisJICAgICAgX194ID0gZXJhc2UoX194KTsKKwkgICAgZWxzZQorCSAgICAgICsrX194OworCSAgfQorICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfUHJlZGljYXRlPgorICAgICAgICB2b2lkCisgICAgICAgIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkKKyAgICAgICAgeworCSAgZm9yIChpdGVyYXRvciBfX3ggPSBiZWdpbigpOyBfX3ggIT0gZW5kKCk7ICkKKwkgICAgeworICAgICAgICAgICAgICBfX3Byb2ZjeHhfbGlzdF9vcGVyYXRpb24odGhpcyk7CisJICAgICAgaWYgKF9fcHJlZCgqX194KSkKKwkJX194ID0gZXJhc2UoX194KTsKKwkgICAgICBlbHNlCisJCSsrX194OworCSAgICB9CisJfQorCisgICAgICB2b2lkCisgICAgICB1bmlxdWUoKQorICAgICAgeworCWl0ZXJhdG9yIF9fZmlyc3QgPSBiZWdpbigpOworCWl0ZXJhdG9yIF9fbGFzdCA9IGVuZCgpOworCWlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwkgIHJldHVybjsKKwlpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworCXdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpCisJICB7CisgICAgICAgICAgICBfX3Byb2ZjeHhfbGlzdF9vcGVyYXRpb24odGhpcyk7CisJICAgIGlmICgqX19maXJzdCA9PSAqX19uZXh0KQorCSAgICAgIGVyYXNlKF9fbmV4dCk7CisJICAgIGVsc2UKKwkgICAgICBfX2ZpcnN0ID0gX19uZXh0OworCSAgICBfX25leHQgPSBfX2ZpcnN0OworCSAgfQorICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorICAgICAgICB2b2lkCisgICAgICAgIHVuaXF1ZShfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpCisgICAgICAgIHsKKwkgIGl0ZXJhdG9yIF9fZmlyc3QgPSBiZWdpbigpOworCSAgaXRlcmF0b3IgX19sYXN0ID0gZW5kKCk7CisJICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJICAgIHJldHVybjsKKwkgIGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisJICB3aGlsZSAoKytfX25leHQgIT0gX19sYXN0KQorCSAgICB7CisgICAgICAgICAgICAgIF9fcHJvZmN4eF9saXN0X29wZXJhdGlvbih0aGlzKTsKKwkgICAgICBpZiAoX19iaW5hcnlfcHJlZCgqX19maXJzdCwgKl9fbmV4dCkpCisJCWVyYXNlKF9fbmV4dCk7CisJICAgICAgZWxzZQorCQlfX2ZpcnN0ID0gX19uZXh0OworCSAgICAgIF9fbmV4dCA9IF9fZmlyc3Q7CisJICAgIH0KKwl9CisKKyAgICAgIHZvaWQKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBtZXJnZShsaXN0JiYgX194KQorI2Vsc2UKKyAgICAgIG1lcmdlKGxpc3QmIF9feCkKKyNlbmRpZgorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAzMDAuIGxpc3Q6Om1lcmdlKCkgc3BlY2lmaWNhdGlvbiBpbmNvbXBsZXRlCisJaWYgKHRoaXMgIT0gJl9feCkKKwkgIHsgX0Jhc2U6Om1lcmdlKF9HTElCQ1hYX01PVkUoX194Ll9NX2Jhc2UoKSkpOyB9CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBtZXJnZShsaXN0JiBfX3gpCisgICAgICB7IHRoaXMtPm1lcmdlKHN0ZDo6bW92ZShfX3gpKTsgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Db21wYXJlPgorICAgICAgICB2b2lkCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgICBtZXJnZShsaXN0JiYgX194LCBfQ29tcGFyZSBfX2NvbXApCisjZWxzZQorICAgICAgICBtZXJnZShsaXN0JiBfX3gsIF9Db21wYXJlIF9fY29tcCkKKyNlbmRpZgorICAgICAgICB7CisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyAzMDAuIGxpc3Q6Om1lcmdlKCkgc3BlY2lmaWNhdGlvbiBpbmNvbXBsZXRlCisJICBpZiAodGhpcyAhPSAmX194KQorCSAgICB7IF9CYXNlOjptZXJnZShfR0xJQkNYWF9NT1ZFKF9feC5fTV9iYXNlKCkpLCBfX2NvbXApOyB9CisJfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbXBhcmU+CisgICAgICAgIHZvaWQKKyAgICAgICAgbWVyZ2UobGlzdCYgX194LCBfQ29tcGFyZSBfX2NvbXApCisgICAgICAgIHsgdGhpcy0+bWVyZ2Uoc3RkOjptb3ZlKF9feCksIF9fY29tcCk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBzb3J0KCkgeyBfQmFzZTo6c29ydCgpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICAgIHZvaWQKKyAgICAgICAgc29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fcHJlZCkgeyBfQmFzZTo6c29ydChfX3ByZWQpOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpyZXZlcnNlOworCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorCisgICAgICB2b2lkIF9NX3Byb2ZpbGVfZmluZCgpIGNvbnN0CisgICAgICB7IH0KKworICAgICAgdm9pZCBfTV9wcm9maWxlX2l0ZXJhdGUoaW50IF9fcmV3aW5kID0gMCkgY29uc3QgCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X29wZXJhdGlvbih0aGlzKTsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfaXRlcmF0ZSh0aGlzKTsgCisgICAgICAgIGlmIChfX3Jld2luZCkKKyAgICAgICAgICBfX3Byb2ZjeHhfbGlzdF9yZXdpbmQodGhpcyk7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgc2l6ZV90eXBlIF9NX3Byb2ZpbGVfaW5zZXJ0KHZvaWQqIG9iaiwgaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX3NpemUpCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX3NoaWZ0ID0gMDsKKyAgICAgICAgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9faXQgPSBfX3Bvcy5iYXNlKCk7CisgICAgICAgIGZvciAoIDsgX19pdCE9X0Jhc2U6OmVuZCgpOyBfX2l0KyspCisgICAgICAgICAgX19zaGlmdCsrOworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9yZXdpbmQodGhpcyk7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X29wZXJhdGlvbih0aGlzKTsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfaW5zZXJ0KHRoaXMsIF9fc2hpZnQsIF9fc2l6ZSk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgIT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPCBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDw9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9tYXAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMDdmNTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvbWFwCkBAIC0wLDAgKzEsMzUgQEAKKy8vIFByb2ZpbGluZyBtYXAvbXVsdGltYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9tYXAKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9NQVAKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NQVAgMQorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHByb2ZpbGUvbWFwLmg+CisjaW5jbHVkZSA8cHJvZmlsZS9tdWx0aW1hcC5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9tYXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGFmMmJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL21hcC5oCkBAIC0wLDAgKzEsNTYxIEBACisvLyBQcm9maWxpbmcgbWFwIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvbWFwLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9NQVBfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX01BUF9IIDEKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8cHJvZmlsZS9iYXNlLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcHJvZmlsZQoreworICAvLy8gQ2xhc3Mgc3RkOjptYXAgd3JhcHBlciB3aXRoIHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZSA9IHN0ZDo6bGVzczxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiA+CisgICAgY2xhc3MgbWFwCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6Om1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6Om1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzOgorICAgICAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIDIzLjMuMS4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdAorICAgICAgbWFwKGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2NvbXAsIF9fYSkKKyAgICAgIHsgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2NvbnN0cnVjdCh0aGlzKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKwk6IF9CYXNlKF9fZmlyc3QsIF9fbGFzdCwgX19jb21wLCBfX2EpCisgICAgICAgIHsgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2NvbnN0cnVjdCh0aGlzKTsgfQorCisgICAgICBtYXAoY29uc3QgbWFwJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkKKyAgICAgIHsgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2NvbnN0cnVjdCh0aGlzKTsgfQorCisgICAgICBtYXAoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KQorICAgICAgeyBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfY29uc3RydWN0KHRoaXMpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBtYXAobWFwJiYgX194KQorICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X0NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IH0KKworICAgICAgbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgY29uc3QgX0NvbXBhcmUmIF9fYyA9IF9Db21wYXJlKCksCisJICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2MsIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgfm1hcCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9kZXN0cnVjdCh0aGlzKTsgfQorCisgICAgICBtYXAmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbWFwJiBfX3gpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3g7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgbWFwJgorICAgICAgb3BlcmF0b3I9KG1hcCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+c3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDEzMy4gbWFwIG1pc3NpbmcgZ2V0X2FsbG9jYXRvcigpCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IgCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfQmFzZTo6YmVnaW4oKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX0Jhc2U6OmJlZ2luKCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfQmFzZTo6ZW5kKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfQmFzZTo6ZW5kKCk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKHRoaXMpOworICAgICAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IAorICAgICAgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOworICAgICAgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUodGhpcyk7CisgICAgICAgIHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOworICAgICAgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUodGhpcyk7CisgICAgICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUodGhpcyk7CisgICAgICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworICAgICAgLy8gMjMuMy4xLjIgZWxlbWVudCBhY2Nlc3M6CisgICAgICBtYXBwZWRfdHlwZSYKKyAgICAgIG9wZXJhdG9yW10oY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQodGhpcywgc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIF9CYXNlOjpvcGVyYXRvcltdKF9fayk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBtYXBwZWRfdHlwZSYKKyAgICAgIG9wZXJhdG9yW10oa2V5X3R5cGUmJiBfX2spCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9maW5kKHRoaXMsIHNpemUoKSk7CisgICAgICAgIHJldHVybiBfQmFzZTo6b3BlcmF0b3JbXShzdGQ6Om1vdmUoX19rKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBhdChjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZCh0aGlzLCBzaXplKCkpOworICAgICAgICByZXR1cm4gX0Jhc2U6OmF0KF9fayk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IG1hcHBlZF90eXBlJgorICAgICAgYXQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQodGhpcywgc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIF9CYXNlOjphdChfX2spOworICAgICAgfQorCisgICAgICAvLyBtb2RpZmllcnM6CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydCh0aGlzLCBzaXplKCksIDEpOworCSAgYXV0byBfX3JlcyA9IF9CYXNlOjplbXBsYWNlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICByZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3Jlcy5maXJzdCksCisJCQkJCSAgIF9fcmVzLnNlY29uZCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgc2l6ZV90eXBlIHNpemVfYmVmb3JlID0gc2l6ZSgpOworCSAgYXV0byBfX3JlcyA9IF9CYXNlOjplbXBsYWNlX2hpbnQoX19wb3MsCisJCQkJCSAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5zZXJ0KHRoaXMsIHNpemVfYmVmb3JlLAorCQkJCQkJc2l6ZSgpIC0gc2l6ZV9iZWZvcmUpOworCSAgcmV0dXJuIF9fcmVzOworCX0KKyNlbmRpZgorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5zZXJ0KHRoaXMsIHNpemUoKSwgMSk7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX194KTsKKwlyZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3Jlcy5maXJzdCksCisJCQkJCSBfX3Jlcy5zZWNvbmQpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgICBpbnNlcnQoX1BhaXImJiBfX3gpCisgICAgICAgIHsKKwkgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnNlcnQodGhpcywgc2l6ZSgpLCAxKTsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworCSAgc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcworCSAgICA9IF9CYXNlOjppbnNlcnQoc3RkOjpmb3J3YXJkPF9QYWlyPihfX3gpKTsKKwkgIHJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fcmVzLmZpcnN0KSwKKwkJCQkJICAgX19yZXMuc2Vjb25kKTsKKwl9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19saXN0KQorICAgICAgeyAKKyAgICAgICAgc2l6ZV90eXBlIHNpemVfYmVmb3JlID0gc2l6ZSgpOworICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fbGlzdCk7IAorICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5zZXJ0KHRoaXMsIHNpemVfYmVmb3JlLCAKKwkJCQkJICAgICAgc2l6ZSgpIC0gc2l6ZV9iZWZvcmUpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbHNlCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2VuZGlmCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBzaXplX2JlZm9yZSA9IHNpemUoKTsKKwlpdGVyYXRvciBfX2kgPSBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIF9feCkpOworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5zZXJ0KHRoaXMsIHNpemVfYmVmb3JlLAorCQkJCQkgICAgICBzaXplKCkgLSBzaXplX2JlZm9yZSk7CisJcmV0dXJuIF9faTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfUGFpciYmIF9feCkKKyAgICAgICAgeworCSAgc2l6ZV90eXBlIHNpemVfYmVmb3JlID0gc2l6ZSgpOworCSAgaXRlcmF0b3IgX19pCisJICAgID0gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLCBzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpKTsKKwkgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnNlcnQodGhpcywgc2l6ZV9iZWZvcmUsIAorCQkJCQkJc2l6ZSgpIC0gc2l6ZV9iZWZvcmUpOworCSAgcmV0dXJuIF9faTsKKyAgICAgIH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisgICAgICAgICAgc2l6ZV90eXBlIHNpemVfYmVmb3JlID0gc2l6ZSgpOworCSAgX0Jhc2U6Omluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnNlcnQodGhpcywgc2l6ZV9iZWZvcmUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSgpIC0gc2l6ZV9iZWZvcmUpOworCX0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCWl0ZXJhdG9yIF9faSA9IF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uKTsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2VyYXNlKHRoaXMsIHNpemUoKSwgMSk7CisgICAgICAgIHJldHVybiBfX2k7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gZXJhc2UoY29uc3RfaXRlcmF0b3IoX19wb3NpdGlvbikpOyB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbik7CisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9lcmFzZSh0aGlzLCBzaXplKCksIDEpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwlpdGVyYXRvciBfX3ZpY3RpbSA9IGZpbmQoX194KTsKKwlpZiAoX192aWN0aW0gPT0gZW5kKCkpCisJICByZXR1cm4gMDsKKwllbHNlCisJeworCSAgX0Jhc2U6OmVyYXNlKF9fdmljdGltKTsKKwkgIHJldHVybiAxOworCX0KKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdCwgX19sYXN0KSk7IH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9CYXNlOjplcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgc3dhcChtYXAmIF9feCkKKyAgICAgIHsgX0Jhc2U6OnN3YXAoX194KTsgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHRoaXMtPmVyYXNlKGJlZ2luKCksIGVuZCgpKTsgfQorCisgICAgICAvLyBvYnNlcnZlcnM6CisgICAgICB1c2luZyBfQmFzZTo6a2V5X2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6dmFsdWVfY29tcDsKKworICAgICAgLy8gMjMuMy4xLjMgbWFwIG9wZXJhdGlvbnM6CisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZCh0aGlzLCBzaXplKCkpOworICAgICAgICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9maW5kKHRoaXMsIHNpemUoKSk7CisgICAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpKTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZCh0aGlzLCBzaXplKCkpOworICAgICAgICByZXR1cm4gX0Jhc2U6OmNvdW50KF9feCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUodGhpcyk7CisgICAgICAgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSk7IAorICAgICAgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKHRoaXMpOworICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCkpOyAKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjp1cHBlcl9ib3VuZChfX3gpKTsgCisgICAgICB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUodGhpcyk7CisgICAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSk7IAorICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcmVzID0KKwlfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJICAgICAgaXRlcmF0b3IoX19yZXMuc2Vjb25kKSk7CisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9maW5kKHRoaXMsIHNpemUoKSk7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisJc3RkOjpwYWlyPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLCBfQmFzZV9jb25zdF9pdGVyYXRvcj4gX19yZXMgPQorCV9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihjb25zdF9pdGVyYXRvcihfX3Jlcy5maXJzdCksCisJCQkgICAgICBjb25zdF9pdGVyYXRvcihfX3Jlcy5zZWNvbmQpKTsKKyAgICAgIH0KKworICAgICAgX0Jhc2UmIAorICAgICAgX01fYmFzZSgpIF9HTElCQ1hYX05PRVhDRVBUICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IAorICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoJl9fbGhzKTsKKyAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKCZfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKTsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IAorICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoJl9fbGhzKTsKKyAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKCZfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoJl9fbGhzKTsKKyAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKCZfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKCZfX2xocyk7CisgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSgmX19yaHMpOworICAgICAgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7CisgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSgmX19saHMpOworICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoJl9fcmhzKTsKKyAgICAgIHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHMuX01fYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKCZfX2xocyk7CisgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSgmX19yaHMpOworICAgICAgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+IF9fcmhzLl9NX2Jhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19wcm9maWxlCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvbXVsdGltYXAuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9tdWx0aW1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmY2QwMjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvbXVsdGltYXAuaApAQCAtMCwwICsxLDQwOCBAQAorLy8gUHJvZmlsaW5nIG11bHRpbWFwIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL211bHRpbWFwLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9NVUxUSU1BUF9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfTVVMVElNQVBfSCAxCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgLy8vIENsYXNzIHN0ZDo6bXVsdGltYXAgd3JhcHBlciB3aXRoIHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZSA9IHN0ZDo6bGVzczxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiA+CisgICAgY2xhc3MgbXVsdGltYXAKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6bXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjptdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzOgorICAgICAgdHlwZWRlZiBfS2V5CQkJCSAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9UcAkJCQkgICAgIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfY29tcGFyZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJldmVyc2VfaXRlcmF0b3IgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3BvaW50ZXIgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKworICAgICAgLy8gMjMuMy4xLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0IG11bHRpbWFwKGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCQkJY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2NvbXAsIF9fYSkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgICAgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCwgX19hKSB7IH0KKworICAgICAgbXVsdGltYXAoY29uc3QgbXVsdGltYXAmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgbXVsdGltYXAoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIG11bHRpbWFwKG11bHRpbWFwJiYgX194KQorICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X0NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IH0KKworICAgICAgbXVsdGltYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2MgPSBfQ29tcGFyZSgpLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2MsIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgfm11bHRpbWFwKCkgX0dMSUJDWFhfTk9FWENFUFQgeyB9CisKKyAgICAgIG11bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IG11bHRpbWFwJiBfX3gpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3g7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0obXVsdGltYXAmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIG11bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworICAgICAgLy8gbW9kaWZpZXJzOgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbXBsYWNlX2hpbnQoX19wb3MsCisJCQkJCSAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpOworCX0KKyNlbmRpZgorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX194KSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChfUGFpciYmIF9feCkKKyAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpKTsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbGlzdCkKKyAgICAgIHsgX0Jhc2U6Omluc2VydChfX2xpc3QpOyB9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2Vsc2UKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZW5kaWYKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbiwgX194KSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfUGFpciYmIF9feCkKKyAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLAorCQkJCQlzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpKTsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX0Jhc2U6Omluc2VydChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbikpOyB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24pOyB9CisjZW5kaWYKKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeworCXN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IF9fdmljdGltcyA9IHRoaXMtPmVxdWFsX3JhbmdlKF9feCk7CisJc2l6ZV90eXBlIF9fY291bnQgPSAwOworCXdoaWxlIChfX3ZpY3RpbXMuZmlyc3QgIT0gX192aWN0aW1zLnNlY29uZCkKKwl7CisJICBpdGVyYXRvciBfX3ZpY3RpbSA9IF9fdmljdGltcy5maXJzdCsrOworCSAgX0Jhc2U6OmVyYXNlKF9fdmljdGltKTsKKwkgICsrX19jb3VudDsKKwl9CisJcmV0dXJuIF9fY291bnQ7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fZmlyc3QsIF9fbGFzdCkpOyB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBfQmFzZTo6ZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobXVsdGltYXAmIF9feCkKKyAgICAgIHsgX0Jhc2U6OnN3YXAoX194KTsgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHRoaXMtPmVyYXNlKGJlZ2luKCksIGVuZCgpKTsgfQorCisgICAgICAvLyBvYnNlcnZlcnM6CisgICAgICB1c2luZyBfQmFzZTo6a2V5X2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6dmFsdWVfY29tcDsKKworICAgICAgLy8gMjMuMy4xLjMgbXVsdGltYXAgb3BlcmF0aW9uczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSk7IH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmNvdW50OworCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjp1cHBlcl9ib3VuZChfX3gpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjp1cHBlcl9ib3VuZChfX3gpKTsgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcmVzID0KKwlfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJICAgICAgaXRlcmF0b3IoX19yZXMuc2Vjb25kKSk7CisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisJc3RkOjpwYWlyPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLCBfQmFzZV9jb25zdF9pdGVyYXRvcj4gX19yZXMgPQorCV9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihjb25zdF9pdGVyYXRvcihfX3Jlcy5maXJzdCksCisJCQkgICAgICBjb25zdF9pdGVyYXRvcihfX3Jlcy5zZWNvbmQpKTsKKyAgICAgIH0KKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgX0dMSUJDWFhfTk9FWENFUFQgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDw9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9tdWx0aXNldC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL211bHRpc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3NDZiNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9tdWx0aXNldC5oCkBAIC0wLDAgKzEsMzkzIEBACisvLyBQcm9maWxpbmcgbXVsdGlzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvbXVsdGlzZXQuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwcm9maWxlIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX01VTFRJU0VUX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NVUxUSVNFVF9IIDEKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcHJvZmlsZQoreworICAvLy8gQ2xhc3Mgc3RkOjptdWx0aXNldCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSA9IHN0ZDo6bGVzczxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8X0tleT4gPgorICAgIGNsYXNzIG11bHRpc2V0CisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6Om11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6Om11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzOgorICAgICAgdHlwZWRlZiBfS2V5CQkJCSAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9LZXkJCQkJICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZQkJCQkgICAgIGtleV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZQkJCQkgICAgIHZhbHVlX2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IJCQkgICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlCSAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIC8vIDIzLjMuMy4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdCBtdWx0aXNldChjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkJCWNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19jb21wLCBfX2EpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJCSBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisJOiBfQmFzZShfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCwgX19hKSB7IH0KKworICAgICAgbXVsdGlzZXQoY29uc3QgbXVsdGlzZXQmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgbXVsdGlzZXQoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIG11bHRpc2V0KG11bHRpc2V0JiYgX194KQorICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X0NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IH0KKworICAgICAgbXVsdGlzZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2NvbXAsIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgfm11bHRpc2V0KCkgX0dMSUJDWFhfTk9FWENFUFQgeyB9CisKKyAgICAgIG11bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IG11bHRpc2V0JiBfX3gpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3g7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0obXVsdGlzZXQmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIG11bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworICAgICAgLy8gbW9kaWZpZXJzOgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW1wbGFjZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbXBsYWNlX2hpbnQoX19wb3MsCisJCQkJCSAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpOworCX0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX194KSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoc3RkOjptb3ZlKF9feCkpKTsgfQorI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLCBfX3gpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSkpOyB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyBfQmFzZTo6aW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgX0Jhc2U6Omluc2VydChfX2wpOyB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24pKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uKTsgfQorI2VuZGlmCisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBfX3ZpY3RpbXMgPSB0aGlzLT5lcXVhbF9yYW5nZShfX3gpOworCXNpemVfdHlwZSBfX2NvdW50ID0gMDsKKwl3aGlsZSAoX192aWN0aW1zLmZpcnN0ICE9IF9fdmljdGltcy5zZWNvbmQpCisJeworCSAgaXRlcmF0b3IgX192aWN0aW0gPSBfX3ZpY3RpbXMuZmlyc3QrKzsKKwkgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSk7CisJICArK19fY291bnQ7CisJfQorCXJldHVybiBfX2NvdW50OworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX2ZpcnN0LCBfX2xhc3QpKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX0Jhc2U6OmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBzd2FwKG11bHRpc2V0JiBfX3gpCisgICAgICB7IF9CYXNlOjpzd2FwKF9feCk7IH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyB0aGlzLT5lcmFzZShiZWdpbigpLCBlbmQoKSk7IH0KKworICAgICAgLy8gb2JzZXJ2ZXJzOgorICAgICAgdXNpbmcgX0Jhc2U6OmtleV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6OnZhbHVlX2NvbXA7CisKKyAgICAgIC8vIG11bHRpc2V0IG9wZXJhdGlvbnM6CisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSk7IH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmNvdW50OworCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCkpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSk7IH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisgICAgICAgIF9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCksCisJCQkgICAgICBpdGVyYXRvcihfX3Jlcy5zZWNvbmQpKTsKKyAgICAgIH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcmVzID0KKyAgICAgICAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKF9fcmVzLmZpcnN0KSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9fcmVzLnNlY29uZCkpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorCisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPCBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICB2b2lkCisgICAgc3dhcChtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKwkgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gX194LnN3YXAoX195KTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9zZXQgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTA0MzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvc2V0CkBAIC0wLDAgKzEsMzUgQEAKKy8vIFByb2ZpbGluZyBzZXQvbXVsdGlzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9zZXQKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9TRVQKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9TRVQgMQorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHByb2ZpbGUvc2V0Lmg+CisjaW5jbHVkZSA8cHJvZmlsZS9tdWx0aXNldC5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9zZXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGQwYmM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL3NldC5oCkBAIC0wLDAgKzEsNDA3IEBACisvLyBQcm9maWxpbmcgc2V0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL3NldC5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfU0VUX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9TRVRfSCAxCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkgCit7CituYW1lc3BhY2UgX19wcm9maWxlCit7CisgIC8vLyBDbGFzcyBzdGQ6OnNldCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSA9IHN0ZDo6bGVzczxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8X0tleT4gPgorICAgIGNsYXNzIHNldAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjpzZXQ8X0tleSxfQ29tcGFyZSxfQWxsb2NhdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OnNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlczoKKyAgICAgIHR5cGVkZWYgX0tleQkJCQkgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9LZXkJCQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlCQkJCSAgICBrZXlfY29tcGFyZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUJCQkJICAgIHZhbHVlX2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IJCQkgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKworICAgICAgLy8gMjMuMy4zLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0IHNldChjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2NvbXAsIF9fYSkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICBzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorCTogX0Jhc2UoX19maXJzdCwgX19sYXN0LCBfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIHNldChjb25zdCBzZXQmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgc2V0KGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzZXQoc2V0JiYgX194KQorICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X0NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IH0KKworICAgICAgc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2NvbXAsIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgfnNldCgpIF9HTElCQ1hYX05PRVhDRVBUIHsgfQorCisgICAgICBzZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3Qgc2V0JiBfX3gpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3g7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc2V0JgorICAgICAgb3BlcmF0b3I9KHNldCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+c3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgc2V0JgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworICAgICAgLy8gbW9kaWZpZXJzOgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIGF1dG8gX19yZXMgPSBfQmFzZTo6ZW1wbGFjZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJCQkgICBfX3Jlcy5zZWNvbmQpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW1wbGFjZV9oaW50KF9fcG9zLAorCQkJCQkgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKTsKKwl9CisjZW5kaWYKKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzID0gX0Jhc2U6Omluc2VydChfX3gpOworCXJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fcmVzLmZpcnN0KSwKKwkJCQkJIF9fcmVzLnNlY29uZCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzCisJICA9IF9CYXNlOjppbnNlcnQoc3RkOjptb3ZlKF9feCkpOworCXJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fcmVzLmZpcnN0KSwKKwkJCQkJIF9fcmVzLnNlY29uZCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIF9feCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpKSk7IH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IF9CYXNlOjppbnNlcnQoX19maXJzdCwgX19sYXN0KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyBfQmFzZTo6aW5zZXJ0KF9fbCk7IH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbikpOyB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24pOyB9CisjZW5kaWYKKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeworCWl0ZXJhdG9yIF9fdmljdGltID0gZmluZChfX3gpOworCWlmIChfX3ZpY3RpbSA9PSBlbmQoKSkKKyAgICAgICAgICByZXR1cm4gMDsKKwllbHNlCisgICAgICAgIHsKKwkgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSk7CisJICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX2ZpcnN0LCBfX2xhc3QpKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX0Jhc2U6OmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBzd2FwKHNldCYgX194KQorICAgICAgeyBfQmFzZTo6c3dhcChfX3gpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgdGhpcy0+ZXJhc2UoYmVnaW4oKSwgZW5kKCkpOyB9CisKKyAgICAgIC8vIG9ic2VydmVyczoKKyAgICAgIHVzaW5nIF9CYXNlOjprZXlfY29tcDsKKyAgICAgIHVzaW5nIF9CYXNlOjp2YWx1ZV9jb21wOworCisgICAgICAvLyBzZXQgb3BlcmF0aW9uczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpKTsgfQorCisgICAgICB1c2luZyBfQmFzZTo6Y291bnQ7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCkpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjp1cHBlcl9ib3VuZChfX3gpKTsgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcmVzID0KKyAgICAgICAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0KSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCkpOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19yZXMgPQorICAgICAgICBfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kKSk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIF9HTElCQ1hYX05PRVhDRVBUICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDw9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIHZvaWQKKyAgICBzd2FwKHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feCwKKwkgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5zd2FwKF9feSk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19wcm9maWxlCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvdW5vcmRlcmVkX2Jhc2UuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS91bm9yZGVyZWRfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OTQyMTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvdW5vcmRlcmVkX2Jhc2UuaApAQCAtMCwwICsxLDI2MiBAQAorLy8gUHJvZmlsaW5nIHVub3JkZXJlZCBjb250YWluZXJzIGltcGxlbWVudGF0aW9uIGRldGFpbHMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvdW5vcmRlcmVkX2Jhc2UuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwcm9maWxlIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1VOT1JERVJFRAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1VOT1JERVJFRCAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcHJvZmlsZQoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5vcmRlcmVkQ29udCwKKwkgICB0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX0NhY2hlX2hhc2hfY29kZT4KKyAgICBzdHJ1Y3QgX0J1Y2tldF9pbmRleF9oZWxwZXI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Vub3JkZXJlZENvbnQsIHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBzdHJ1Y3QgX0J1Y2tldF9pbmRleF9oZWxwZXI8X1Vub3JkZXJlZENvbnQsIF9WYWx1ZSwgdHJ1ZT4KKyAgICB7CisgICAgICBzdGF0aWMgc3RkOjpzaXplX3QKKyAgICAgIGJ1Y2tldChjb25zdCBfVW5vcmRlcmVkQ29udCYgX191YywKKwkgICAgIGNvbnN0IF9fZGV0YWlsOjpfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4qIF9fbm9kZSkKKyAgICAgIHsgcmV0dXJuIF9fbm9kZS0+X01faGFzaF9jb2RlICUgX191Yy5idWNrZXRfY291bnQoKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Vub3JkZXJlZENvbnQsIHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBzdHJ1Y3QgX0J1Y2tldF9pbmRleF9oZWxwZXI8X1Vub3JkZXJlZENvbnQsIF9WYWx1ZSwgZmFsc2U+CisgICAgeworICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90CisgICAgICBidWNrZXQoY29uc3QgX1Vub3JkZXJlZENvbnQmIF9fdWMsCisJICAgICBjb25zdCBfX2RldGFpbDo6X0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiogX19ub2RlKQorICAgICAgeyByZXR1cm4gX191Yy5idWNrZXQoX19ub2RlLT5fTV92KTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Vub3JkZXJlZENvbnQsIHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9NYXBwZWQ+CisgICAgc3RydWN0IF9CdWNrZXRfaW5kZXhfaGVscGVyPF9Vbm9yZGVyZWRDb250LAorCQkJCXN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfTWFwcGVkPiwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX01hcHBlZD4gX1ZhbHVlOworCisgICAgICBzdGF0aWMgc3RkOjpzaXplX3QKKyAgICAgIGJ1Y2tldChjb25zdCBfVW5vcmRlcmVkQ29udCYgX191YywKKwkgICAgIGNvbnN0IF9fZGV0YWlsOjpfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiBfX25vZGUpCisgICAgICB7IHJldHVybiBfX3VjLmJ1Y2tldChfX25vZGUtPl9NX3YuZmlyc3QpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5vcmRlcmVkQ29udCwgdHlwZW5hbWUgX1ZhbHVlLCBib29sIF9DYWNoZV9oYXNoX2NvZGU+CisgICAgc3RkOjpzaXplX3QKKyAgICBfX2dldF9idWNrZXRfaW5kZXgoY29uc3QgX1Vub3JkZXJlZENvbnQmIF9fdWMsCisJCSAgICAgICBjb25zdCBfX2RldGFpbDo6X0hhc2hfbm9kZTxfVmFsdWUsIF9DYWNoZV9oYXNoX2NvZGU+KiBfX25vZGUpCisgICAgeworICAgICAgdXNpbmcgX19idWNrZXRfaW5kZXhfaGVscGVyCisJPSBfQnVja2V0X2luZGV4X2hlbHBlcjxfVW5vcmRlcmVkQ29udCwgX1ZhbHVlLCBfQ2FjaGVfaGFzaF9jb2RlPjsKKyAgICAgIHJldHVybiBfX2J1Y2tldF9pbmRleF9oZWxwZXI6OmJ1Y2tldChfX3VjLCBfX25vZGUpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5vcmRlcmVkQ29udCwKKwkgICB0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX0NhY2hlX2hhc2hfY29kZT4KKyAgICBzdHJ1Y3QgX0VxdWFsX2hlbHBlcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5vcmRlcmVkQ29udCwgdHlwZW5hbWUgX1ZhbHVlPgorICAgIHN0cnVjdCBfRXF1YWxfaGVscGVyPF9Vbm9yZGVyZWRDb250LCBfVmFsdWUsIHRydWU+CisgICAgeworICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90CisgICAgICBhcmVfZXF1YWwoY29uc3QgX1Vub3JkZXJlZENvbnQmIF9fdWMsCisJCWNvbnN0IF9fZGV0YWlsOjpfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4qIF9fbGhzLAorCQljb25zdCBfX2RldGFpbDo6X0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+KiBfX3JocykKKyAgICAgIHsKKwlyZXR1cm4gX19saHMtPl9NX2hhc2hfY29kZSA9PSBfX3Jocy0+X01faGFzaF9jb2RlCisJICAmJiBfX3VjLmtleV9lcSgpKF9fbGhzLT5fTV92LCBfX3Jocy0+X01fdik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5vcmRlcmVkQ29udCwKKwkgICB0eXBlbmFtZSBfVmFsdWU+CisgICAgc3RydWN0IF9FcXVhbF9oZWxwZXI8X1Vub3JkZXJlZENvbnQsIF9WYWx1ZSwgZmFsc2U+CisgICAgeworICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90CisgICAgICBhcmVfZXF1YWwoY29uc3QgX1Vub3JkZXJlZENvbnQmIF9fdWMsCisJCWNvbnN0IF9fZGV0YWlsOjpfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiBfX2xocywKKwkJY29uc3QgX19kZXRhaWw6Ol9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qIF9fcmhzKQorICAgICAgeyByZXR1cm4gX191Yy5rZXlfZXEoKShfX2xocy0+X01fdiwgX19yaHMtPl9NX3YpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5vcmRlcmVkQ29udCwKKwkgICB0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfTWFwcGVkPgorICAgIHN0cnVjdCBfRXF1YWxfaGVscGVyPF9Vbm9yZGVyZWRDb250LCBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX01hcHBlZD4sIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX01hcHBlZD4gX1ZhbHVlOworCisgICAgICBzdGF0aWMgc3RkOjpzaXplX3QKKyAgICAgIGFyZV9lcXVhbChjb25zdCBfVW5vcmRlcmVkQ29udCYgX191YywKKwkJY29uc3QgX19kZXRhaWw6Ol9IYXNoX25vZGU8X1ZhbHVlLCB0cnVlPiogX19saHMsCisJCWNvbnN0IF9fZGV0YWlsOjpfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4qIF9fcmhzKQorICAgICAgeworCXJldHVybiBfX2xocy0+X01faGFzaF9jb2RlID09IF9fcmhzLT5fTV9oYXNoX2NvZGUKKwkgICYmIF9fdWMua2V5X2VxKCkoX19saHMtPl9NX3YuZmlyc3QsIF9fcmhzLT5fTV92LmZpcnN0KTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbm9yZGVyZWRDb250LAorCSAgIHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9NYXBwZWQ+CisgICAgc3RydWN0IF9FcXVhbF9oZWxwZXI8X1Vub3JkZXJlZENvbnQsIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfTWFwcGVkPiwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX01hcHBlZD4gX1ZhbHVlOworCisgICAgICBzdGF0aWMgc3RkOjpzaXplX3QKKyAgICAgIGFyZV9lcXVhbChjb25zdCBfVW5vcmRlcmVkQ29udCYgX191YywKKwkJY29uc3QgX19kZXRhaWw6Ol9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qIF9fbGhzLAorCQljb25zdCBfX2RldGFpbDo6X0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiogX19yaHMpCisgICAgICB7IHJldHVybiBfX3VjLmtleV9lcSgpKF9fbGhzLT5fTV92LmZpcnN0LCBfX3Jocy0+X01fdi5maXJzdCk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbm9yZGVyZWRDb250LCB0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX0NhY2hlX2hhc2hfY29kZT4KKyAgICBib29sCisgICAgX19hcmVfZXF1YWwoY29uc3QgX1Vub3JkZXJlZENvbnQmIF9fdWMsCisJCWNvbnN0IF9fZGV0YWlsOjpfSGFzaF9ub2RlPF9WYWx1ZSwgX0NhY2hlX2hhc2hfY29kZT4qIF9fbGhzLAorCQljb25zdCBfX2RldGFpbDo6X0hhc2hfbm9kZTxfVmFsdWUsIF9DYWNoZV9oYXNoX2NvZGU+KiBfX3JocykKKyAgeworICAgIHVzaW5nIF9fZXF1YWxfaGVscGVyCisgICAgICA9IF9FcXVhbF9oZWxwZXI8X1Vub3JkZXJlZENvbnQsIF9WYWx1ZSwgX0NhY2hlX2hhc2hfY29kZT47CisgICAgcmV0dXJuIF9fZXF1YWxfaGVscGVyOjphcmVfZXF1YWwoX191YywgX19saHMsIF9fcmhzKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbm9yZGVyZWRDb250LCBib29sIF9VbmlxdWVfa2V5cz4KKyAgICBjbGFzcyBfVW5vcmRlcmVkX3Byb2ZpbGUKKyAgICB7CisgICAgICBfVW5vcmRlcmVkQ29udCYKKyAgICAgIF9NX2Nvbmp1cmUoKQorICAgICAgeyByZXR1cm4gKihzdGF0aWNfY2FzdDxfVW5vcmRlcmVkQ29udCo+KHRoaXMpKTsgfQorCisgICAgICB1c2luZyBfX3VuaXF1ZV9rZXlzID0gc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBfVW5pcXVlX2tleXM+OworCisgICAgcHJvdGVjdGVkOgorICAgICAgX1Vub3JkZXJlZF9wcm9maWxlKCkKKyAgICAgIHsKKwlhdXRvJiBfX3VjID0gX01fY29uanVyZSgpOworICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2NvbnN0cnVjdCgmX191YywgX191Yy5idWNrZXRfY291bnQoKSk7CisJX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QyKCZfX3VjKTsKKyAgICAgIH0KKyAgICAgIF9Vbm9yZGVyZWRfcHJvZmlsZShjb25zdCBfVW5vcmRlcmVkX3Byb2ZpbGUmKQorCTogX1Vub3JkZXJlZF9wcm9maWxlKCkgeyB9CisgICAgICBfVW5vcmRlcmVkX3Byb2ZpbGUoX1Vub3JkZXJlZF9wcm9maWxlJiYpCisJOiBfVW5vcmRlcmVkX3Byb2ZpbGUoKSB7IH0KKworICAgICAgfl9Vbm9yZGVyZWRfcHJvZmlsZSgpIG5vZXhjZXB0CisgICAgICB7CisJYXV0byYgX191YyA9IF9NX2Nvbmp1cmUoKTsKKyAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9kZXN0cnVjdCgmX191YywgX191Yy5idWNrZXRfY291bnQoKSwgX191Yy5zaXplKCkpOworICAgICAgICBfTV9wcm9maWxlX2Rlc3RydWN0KCk7CisgICAgICB9CisKKyAgICAgIF9Vbm9yZGVyZWRfcHJvZmlsZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfVW5vcmRlcmVkX3Byb2ZpbGUmKSA9IGRlZmF1bHQ7CisKKyAgICAgIF9Vbm9yZGVyZWRfcHJvZmlsZSYKKyAgICAgIG9wZXJhdG9yPShfVW5vcmRlcmVkX3Byb2ZpbGUmJikgPSBkZWZhdWx0OworCisgICAgICB2b2lkCisgICAgICBfTV9wcm9maWxlX2Rlc3RydWN0KCkKKyAgICAgIHsKKwlpZiAoIV9fcHJvZmN4eF9pbmVmZmljaWVudF9oYXNoX2lzX29uKCkpCisJICByZXR1cm47CisKKwlfTV9wcm9maWxlX2Rlc3RydWN0KF9fdW5pcXVlX2tleXMoKSk7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01fcHJvZmlsZV9kZXN0cnVjdChzdGQ6OnRydWVfdHlwZSk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3Byb2ZpbGVfZGVzdHJ1Y3Qoc3RkOjpmYWxzZV90eXBlKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbm9yZGVyZWRDb250LCBib29sIF9VbmlxdWVfa2V5cz4KKyAgICB2b2lkCisgICAgX1Vub3JkZXJlZF9wcm9maWxlPF9Vbm9yZGVyZWRDb250LCBfVW5pcXVlX2tleXM+OjoKKyAgICBfTV9wcm9maWxlX2Rlc3RydWN0KHN0ZDo6dHJ1ZV90eXBlKQorICAgIHsKKyAgICAgIGF1dG8mIF9fdWMgPSBfTV9jb25qdXJlKCk7CisgICAgICBzdGQ6OnNpemVfdCBfX2hvcHMgPSAwLCBfX2xjID0gMCwgX19jaGFpbiA9IDA7CisgICAgICBhdXRvIF9faXQgPSBfX3VjLmJlZ2luKCk7CisgICAgICB3aGlsZSAoX19pdCAhPSBfX3VjLmVuZCgpKQorCXsKKwkgIGF1dG8gX19ia3QgPSBfX2dldF9idWNrZXRfaW5kZXgoX191YywgX19pdC5fTV9jdXIpOworCSAgYXV0byBfX2xpdCA9IF9fdWMuYmVnaW4oX19ia3QpOworCSAgYXV0byBfX2xlbmQgPSBfX3VjLmVuZChfX2JrdCk7CisJICBmb3IgKCsrX19pdCwgKytfX2xpdDsgX19saXQgIT0gX19sZW5kOyArK19faXQsICsrX19saXQpCisJICAgICsrX19jaGFpbjsKKwkgIGlmIChfX2NoYWluKQorCSAgICB7CisJICAgICAgKytfX2NoYWluOworCSAgICAgIF9fbGMgPSBfX2xjID4gX19jaGFpbiA/IF9fbGMgOiBfX2NoYWluOworCSAgICAgIF9faG9wcyArPSBfX2NoYWluICogKF9fY2hhaW4gLSAxKSAvIDI7CisJICAgICAgX19jaGFpbiA9IDA7CisJICAgIH0KKwl9CisgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0MigmX191YywgX19sYywgX191Yy5zaXplKCksIF9faG9wcyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbm9yZGVyZWRDb250LCBib29sIF9VbmlxdWVfa2V5cz4KKyAgICB2b2lkCisgICAgX1Vub3JkZXJlZF9wcm9maWxlPF9Vbm9yZGVyZWRDb250LCBfVW5pcXVlX2tleXM+OjoKKyAgICBfTV9wcm9maWxlX2Rlc3RydWN0KHN0ZDo6ZmFsc2VfdHlwZSkKKyAgICB7CisgICAgICBhdXRvJiBfX3VjID0gX01fY29uanVyZSgpOworICAgICAgc3RkOjpzaXplX3QgX19ob3BzID0gMCwgX19sYyA9IDAsIF9fY2hhaW4gPSAwLCBfX3VuaXF1ZV9zaXplID0gMDsKKyAgICAgIGF1dG8gX19pdCA9IF9fdWMuYmVnaW4oKTsKKyAgICAgIHdoaWxlIChfX2l0ICE9IF9fdWMuZW5kKCkpCisJeworCSAgYXV0byBfX2JrdCA9IF9fZ2V0X2J1Y2tldF9pbmRleChfX3VjLCBfX2l0Ll9NX2N1cik7CisJICBhdXRvIF9fbGl0ID0gX191Yy5iZWdpbihfX2JrdCk7CisJICBhdXRvIF9fbGVuZCA9IF9fdWMuZW5kKF9fYmt0KTsKKwkgIGF1dG8gX19waXQgPSBfX2l0OworCSAgKytfX3VuaXF1ZV9zaXplOworCSAgZm9yICgrK19faXQsICsrX19saXQ7IF9fbGl0ICE9IF9fbGVuZDsgKytfX2l0LCArK19fbGl0KQorCSAgICB7CisJICAgICAgaWYgKCFfX2FyZV9lcXVhbChfX3VjLCBfX3BpdC5fTV9jdXIsIF9faXQuX01fY3VyKSkKKwkJeworCQkgICsrX19jaGFpbjsKKwkJICArK19fdW5pcXVlX3NpemU7CisJCSAgX19waXQgPSBfX2l0OworCQl9CisJICAgIH0KKwkgIGlmIChfX2NoYWluKQorCSAgICB7CisJICAgICAgKytfX2NoYWluOworCSAgICAgIF9fbGMgPSBfX2xjID4gX19jaGFpbiA/IF9fbGMgOiBfX2NoYWluOworCSAgICAgIF9faG9wcyArPSBfX2NoYWluICogKF9fY2hhaW4gLSAxKSAvIDI7CisJICAgICAgX19jaGFpbiA9IDA7CisJICAgIH0KKwl9CisgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0MigmX191YywgX19sYywgX191bmlxdWVfc2l6ZSwgX19ob3BzKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL3Vub3JkZXJlZF9tYXAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvdW5vcmRlcmVkX21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWI5NDAzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL3Vub3JkZXJlZF9tYXAKQEAgLTAsMCArMSw1MDIgQEAKKy8vIFByb2ZpbGluZyB1bm9yZGVyZWRfbWFwL3Vub3JkZXJlZF9tdWx0aW1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL3Vub3JkZXJlZF9tYXAKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9VTk9SREVSRURfTUFQCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfVU5PUkRFUkVEX01BUCAxCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8cHJvZmlsZS9iYXNlLmg+CisjaW5jbHVkZSA8cHJvZmlsZS91bm9yZGVyZWRfYmFzZS5oPgorCisjZGVmaW5lIF9HTElCQ1hYX0JBU0UgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPgorI2RlZmluZSBfR0xJQkNYWF9TVERfQkFTRSBfR0xJQkNYWF9TVERfQzo6X0dMSUJDWFhfQkFTRQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgLy8vIENsYXNzIHN0ZDo6dW5vcmRlcmVkX21hcCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0hhc2ggPSBzdGQ6Omhhc2g8X0tleT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9tYXAKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQkFTRSwKKyAgICAgIHB1YmxpYyBfVW5vcmRlcmVkX3Byb2ZpbGU8dW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiwKKwkJCQl0cnVlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0dMSUJDWFhfU1REX0JBU0UgX0Jhc2U7CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIG5vZXhjZXB0ICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfdHlwZSAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Om1hcHBlZF90eXBlICAgICAgbWFwcGVkX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfbWFwKHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHVub3JkZXJlZF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCSAgICAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwkgIDogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgICAgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tYXAoY29uc3QgdW5vcmRlcmVkX21hcCYpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX21hcChjb25zdCBfQmFzZSYgX194KQorCTogX0Jhc2UoX194KQorICAgICAgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tYXAodW5vcmRlcmVkX21hcCYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJCSAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB1bm9yZGVyZWRfbWFwJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHVub3JkZXJlZF9tYXAmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tYXAmCisgICAgICBvcGVyYXRvcj0odW5vcmRlcmVkX21hcCYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX01fYmFzZSgpID0gX19sOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSwKKwkJCQkgICAgIF9CYXNlOjpzaXplKCkpOworICAgICAgICB0aGlzLT5fTV9wcm9maWxlX2Rlc3RydWN0KCk7CisJX0Jhc2U6OmNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworCSAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBfX3JlcworCSAgICA9IF9CYXNlOjplbXBsYWNlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsKKwkgIHJldHVybiBfX3JlczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9faXQsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworCSAgaXRlcmF0b3IgX19yZXMKKwkgICAgPSBfQmFzZTo6ZW1wbGFjZV9oaW50KF9faXQsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsKKwkgIHJldHVybiBfX3JlczsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyAKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fbCk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgIH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKyAgICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19vYmopOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2l0ZXIsIGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKKyAgICAgIHsgCisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOyAKKyAgICAgICAgaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9faXRlciwgX192KTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgICAgaW5zZXJ0KF9QYWlyJiYgX19vYmopCisgICAgICAgIHsKKwkgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworCSAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBfX3JlcworCSAgICA9IF9CYXNlOjppbnNlcnQoc3RkOjpmb3J3YXJkPF9QYWlyPihfX29iaikpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faXRlciwgX1BhaXImJiBfX3YpCisgICAgICAgIHsgCisJICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsgCisJICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19pdGVyLCBzdGQ6OmZvcndhcmQ8X1BhaXI+KF9fdikpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkKKyAgICAgICAgeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorCSAgX0Jhc2U6Omluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorCX0KKworICAgICAgLy8gb3BlcmF0b3JbXQorICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBvcGVyYXRvcltdKGNvbnN0IF9LZXkmIF9faykKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIG1hcHBlZF90eXBlJiBfX3JlcyA9IF9NX2Jhc2UoKVtfX2tdOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBvcGVyYXRvcltdKF9LZXkmJiBfX2spCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBtYXBwZWRfdHlwZSYgX19yZXMgPSBfTV9iYXNlKClbc3RkOjptb3ZlKF9fayldOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3dhcCh1bm9yZGVyZWRfbWFwJiBfX3gpCisgICAgICB7IF9CYXNlOjpzd2FwKF9feC5fTV9iYXNlKCkpOyB9CisKKyAgICAgIHZvaWQgcmVoYXNoKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisJX0Jhc2U6OnJlaGFzaChfX24pOworCV9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShzaXplX3R5cGUgX19vbGRfc2l6ZSkKKyAgICAgIHsKKwlzaXplX3R5cGUgX19uZXdfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKwlpZiAoX19vbGRfc2l6ZSAhPSBfX25ld19zaXplKQorCSAgX19wcm9mY3h4X2hhc2h0YWJsZV9yZXNpemUodGhpcywgX19vbGRfc2l6ZSwgX19uZXdfc2l6ZSk7CisgICAgICB9CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9HTElCQ1hYX1NURF9CQVNFJj4oX194KSA9PSBfX3k7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworI3VuZGVmIF9HTElCQ1hYX0JBU0UKKyN1bmRlZiBfR0xJQkNYWF9TVERfQkFTRQorI2RlZmluZSBfR0xJQkNYWF9CQVNFIHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPgorI2RlZmluZSBfR0xJQkNYWF9TVERfQkFTRSBfR0xJQkNYWF9TVERfQzo6X0dMSUJDWFhfQkFTRQorCisgIC8vLyBDbGFzcyBzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0hhc2ggPSBzdGQ6Omhhc2g8X0tleT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9tdWx0aW1hcAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9CQVNFLAorICAgICAgcHVibGljIF9Vbm9yZGVyZWRfcHJvZmlsZTx1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLAorCQkJCQkJICAgX0hhc2gsIF9QcmVkLCBfQWxsb2M+LAorCQkJCWZhbHNlPgorICAgIHsgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0dMSUJDWFhfU1REX0JBU0UgX0Jhc2U7CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIG5vZXhjZXB0ICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfdHlwZSAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB1bm9yZGVyZWRfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQkgICBzaXplX3R5cGUgX19uID0gMCwKKwkJCSAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJICA6IF9CYXNlKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwKGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcCYpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwKGNvbnN0IF9CYXNlJiBfX3gpCisJOiBfQmFzZShfX3gpCisgICAgICB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwKHVub3JkZXJlZF9tdWx0aW1hcCYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJCSBzaXplX3R5cGUgX19uID0gMCwKKwkJCSBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB1bm9yZGVyZWRfbXVsdGltYXAmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfbXVsdGltYXAmJikgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX01fYmFzZSgpID0gX19sOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBub2V4Y2VwdAorICAgICAgeworCV9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QodGhpcywgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpLCAKKwkJCQkgICAgIF9CYXNlOjpzaXplKCkpOworCXRoaXMtPl9NX3Byb2ZpbGVfZGVzdHJ1Y3QoKTsKKwlfQmFzZTo6Y2xlYXIoKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworCSAgaXRlcmF0b3IgX19yZXMKKwkgICAgPSBfQmFzZTo6ZW1wbGFjZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7CisJICByZXR1cm4gX19yZXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX2l0LCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKwkgIGl0ZXJhdG9yIF9fcmVzCisJICAgID0gX0Jhc2U6OmVtcGxhY2VfaGludChfX2l0LCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7CisJICByZXR1cm4gX19yZXM7CisJfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgCisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fbCk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKyAgICAgICAgaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9fb2JqKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19pdGVyLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpCisgICAgICB7IAorICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsgCisgICAgICAgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX2l0ZXIsIF9fdik7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBpbnNlcnQoX1BhaXImJiBfX29iaikKKyAgICAgICAgeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisJICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoc3RkOjpmb3J3YXJkPF9QYWlyPihfX29iaikpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faXRlciwgX1BhaXImJiBfX3YpCisgICAgICAgIHsKKwkgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOyAKKwkgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX2l0ZXIsIHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX192KSk7CisJICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisJICByZXR1cm4gX19yZXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0KQorICAgICAgICB7CisJICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsgCisJICBfQmFzZTo6aW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7CisJICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisJfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVub3JkZXJlZF9tdWx0aW1hcCYgX194KQorICAgICAgeyBfQmFzZTo6c3dhcChfX3guX01fYmFzZSgpKTsgfQorCisgICAgICB2b2lkCisgICAgICByZWhhc2goc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIF9CYXNlOjpyZWhhc2goX19uKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHNpemVfdHlwZSBfX29sZF9zaXplKQorICAgICAgeworCXNpemVfdHlwZSBfX25ld19zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBpZiAoX19vbGRfc2l6ZSAhPSBfX25ld19zaXplKQorICAgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfcmVzaXplKHRoaXMsIF9fb2xkX3NpemUsIF9fbmV3X3NpemUpOworICAgICAgfQorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9HTElCQ1hYX1NURF9CQVNFJj4oX194KSA9PSBfX3k7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyN1bmRlZiBfR0xJQkNYWF9CQVNFCisjdW5kZWYgX0dMSUJDWFhfU1REX0JBU0UKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL3Vub3JkZXJlZF9zZXQgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvdW5vcmRlcmVkX3NldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzAxNWFjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL3Vub3JkZXJlZF9zZXQKQEAgLTAsMCArMSw0NjMgQEAKKy8vIFByb2ZpbGluZyB1bm9yZGVyZWRfc2V0L3Vub3JkZXJlZF9tdWx0aXNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL3Vub3JkZXJlZF9zZXQKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9VTk9SREVSRURfU0VUCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfVU5PUkRFUkVEX1NFVCAxCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCisjaW5jbHVkZSA8cHJvZmlsZS9iYXNlLmg+CisjaW5jbHVkZSA8cHJvZmlsZS91bm9yZGVyZWRfYmFzZS5oPgorCisjZGVmaW5lIF9HTElCQ1hYX0JBU0UgdW5vcmRlcmVkX3NldDxfS2V5LCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4KKyNkZWZpbmUgX0dMSUJDWFhfU1REX0JBU0UgX0dMSUJDWFhfU1REX0M6Ol9HTElCQ1hYX0JBU0UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19wcm9maWxlCit7CisgIC8qKiBAYnJpZWYgVW5vcmRlcmVkX3NldCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLiAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgCisJICAgdHlwZW5hbWUgX0hhc2ggPSBzdGQ6Omhhc2g8X0tleT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9ICBzdGQ6OmFsbG9jYXRvcjxfS2V5PiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX3NldAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9CQVNFLAorICAgICAgcHVibGljIF9Vbm9yZGVyZWRfcHJvZmlsZTx1bm9yZGVyZWRfc2V0PF9LZXksIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiwKKwkJCQl0cnVlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0JBU0UgX0Jhc2U7CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIG5vZXhjZXB0ICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfdHlwZSAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9zZXQoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJICAgICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCSAgOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHVub3JkZXJlZF9zZXQoY29uc3QgdW5vcmRlcmVkX3NldCYpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX3NldChjb25zdCBfQmFzZSYgX194KQorCTogX0Jhc2UoX194KQorICAgICAgeyB9CisKKyAgICAgIHVub3JkZXJlZF9zZXQodW5vcmRlcmVkX3NldCYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9zZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJCSAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHVub3JkZXJlZF9zZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX3NldCYpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX3NldCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfc2V0JiYpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX3NldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwlfTV9iYXNlKCkgPSBfX2w7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVub3JkZXJlZF9zZXQmIF9feCkKKyAgICAgIHsgX0Jhc2U6OnN3YXAoX194KTsgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QodGhpcywgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZTo6c2l6ZSgpKTsKKyAgICAgICAgdGhpcy0+X01fcHJvZmlsZV9kZXN0cnVjdCgpOworICAgICAgICBfQmFzZTo6Y2xlYXIoKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisJICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IF9fcmVzCisJICAgID0gX0Jhc2U6OmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOworCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19pdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisJICBpdGVyYXRvciBfX3JlcworCSAgICA9IF9CYXNlOjplbXBsYWNlX2hpbnQoX19pdCwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOworCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IAorICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKyAgICAgICAgX0Jhc2U6Omluc2VydChfX2wpOyAKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IF9fcmVzID0gX0Jhc2U6Omluc2VydChfX29iaik7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faXRlciwgY29uc3QgdmFsdWVfdHlwZSYgX192KQorICAgICAgeyAKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorICAgICAgICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19pdGVyLCBfX3YpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX29iaikKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gX19yZXMgPSBfQmFzZTo6aW5zZXJ0KHN0ZDo6bW92ZShfX29iaikpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2l0ZXIsIHZhbHVlX3R5cGUmJiBfX3YpCisgICAgICB7IAorICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKyAgICAgICAgaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9faXRlciwgc3RkOjptb3ZlKF9fdikpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkKKyAgICAgICAgeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorCSAgX0Jhc2U6Omluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorCX0KKworICAgICAgdm9pZAorICAgICAgcmVoYXNoKHNpemVfdHlwZSBfX24pCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBfQmFzZTo6cmVoYXNoKF9fbik7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShzaXplX3R5cGUgX19vbGRfc2l6ZSkKKyAgICAgIHsKKwlzaXplX3R5cGUgX19uZXdfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKwlpZiAoX19vbGRfc2l6ZSAhPSBfX25ld19zaXplKQorCSAgX19wcm9mY3h4X2hhc2h0YWJsZV9yZXNpemUodGhpcywgX19vbGRfc2l6ZSwgX19uZXdfc2l6ZSk7CisgICAgICB9CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHVub3JkZXJlZF9zZXQ8X0tleSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9zZXQ8X0tleSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9zZXQ8X0tleSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9zZXQ8X0tleSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX0dMSUJDWFhfU1REX0JBU0UmPihfX3gpID09IF9feTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfc2V0PF9LZXksIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfc2V0PF9LZXksIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworI3VuZGVmIF9HTElCQ1hYX0JBU0UKKyN1bmRlZiBfR0xJQkNYWF9TVERfQkFTRQorI2RlZmluZSBfR0xJQkNYWF9TVERfQkFTRSBfR0xJQkNYWF9TVERfQzo6X0dMSUJDWFhfQkFTRQorI2RlZmluZSBfR0xJQkNYWF9CQVNFIHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPgorCisgIC8qKiBAYnJpZWYgVW5vcmRlcmVkX211bHRpc2V0IHdyYXBwZXIgd2l0aCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24uICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0hhc2ggPSBzdGQ6Omhhc2g8X1ZhbHVlPiwKKwkgICB0eXBlbmFtZSBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X1ZhbHVlPiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSAgc3RkOjphbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX211bHRpc2V0CisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0JBU0UsCisgICAgICBwdWJsaWMgX1Vub3JkZXJlZF9wcm9maWxlPHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsCisJCQkJCQkgICBfSGFzaCwgX1ByZWQsIF9BbGxvYz4sCisJCQkJZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQkFTRSBfQmFzZTsKKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgbm9leGNlcHQgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV90eXBlICAgICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICBleHBsaWNpdAorICAgICAgdW5vcmRlcmVkX211bHRpc2V0KHNpemVfdHlwZSBfX24gPSAxMCwKKwkJCSBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHVub3JkZXJlZF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJCSAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkJICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwkgIDogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoY29uc3QgdW5vcmRlcmVkX211bHRpc2V0JikgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoY29uc3QgX0Jhc2UmIF9feCkKKwk6IF9CYXNlKF9feCkKKyAgICAgIHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQodW5vcmRlcmVkX211bHRpc2V0JiYpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX211bHRpc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkJIHNpemVfdHlwZSBfX24gPSAwLAorCQkJIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfbXVsdGlzZXQmJikgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX01fYmFzZSgpID0gX19sOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGlzZXQmIF9feCkKKyAgICAgIHsgX0Jhc2U6OnN3YXAoX194KTsgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QodGhpcywgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZTo6c2l6ZSgpKTsKKyAgICAgICAgdGhpcy0+X01fcHJvZmlsZV9kZXN0cnVjdCgpOworICAgICAgICBfQmFzZTo6Y2xlYXIoKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworCSAgaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZW1wbGFjZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7CisJICByZXR1cm4gX19yZXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX2l0LCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKwkgIGl0ZXJhdG9yIF9fcmVzCisJICAgID0gX0Jhc2U6OmVtcGxhY2VfaGludChfX2l0LCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7CisJICByZXR1cm4gX19yZXM7CisJfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgCisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fbCk7IAorICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19vYmopOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2l0ZXIsIGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorICAgICAgICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19pdGVyLCBfX3YpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydCh2YWx1ZV90eXBlJiYgX19vYmopCisgICAgICB7CisJc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChzdGQ6Om1vdmUoX19vYmopKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19pdGVyLCB2YWx1ZV90eXBlJiYgX192KQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsgCisgICAgICAgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX2l0ZXIsIHN0ZDo6bW92ZShfX3YpKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpCisgICAgICAgIHsKKwkgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOyAKKwkgIF9CYXNlOjppbnNlcnQoX19maXJzdCwgX19sYXN0KTsKKwkgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlaGFzaChzaXplX3R5cGUgX19uKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKyAgICAgICAgX0Jhc2U6OnJlaGFzaChfX24pOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01fcHJvZmlsZV9yZXNpemUoc2l6ZV90eXBlIF9fb2xkX3NpemUpCisgICAgICB7CisJc2l6ZV90eXBlIF9fbmV3X3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIGlmIChfX29sZF9zaXplICE9IF9fbmV3X3NpemUpCisgICAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9yZXNpemUodGhpcywgX19vbGRfc2l6ZSwgX19uZXdfc2l6ZSk7CisgICAgICB9CisgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX0dMSUJDWFhfU1REX0JBU0UmPihfX3gpID09IF9feTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyN1bmRlZiBfR0xJQkNYWF9CQVNFCisjdW5kZWYgX0dMSUJDWFhfU1REX0JBU0UKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL3ZlY3RvciBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS92ZWN0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyZTQyOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS92ZWN0b3IKQEAgLTAsMCArMSw1NTQgQEAKKy8vIFByb2ZpbGluZyB2ZWN0b3IgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS92ZWN0b3IKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9WRUNUT1IKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9WRUNUT1IgMQorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8cHJvZmlsZS9iYXNlLmg+CisjaW5jbHVkZSA8cHJvZmlsZS9pdGVyYXRvcl90cmFja2VyLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcHJvZmlsZQoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIHZlY3RvcgorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OnZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+IF9CYXNlOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fYWxsb2NfdHJhaXRzPF9BbGxvY2F0b3I+ICBfQWxsb2NfdHJhaXRzOworI2VuZGlmCisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBfX2l0ZXJhdG9yX3RyYWNrZXI8dHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yLCB2ZWN0b3I+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9faXRlcmF0b3JfdHJhY2tlcjx0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IsIHZlY3Rvcj4KKwkJCQkgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiBfVHAJCQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IJCQkgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3BvaW50ZXIgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIAorICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgX0dMSUJDWFhfTk9FWENFUFQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgLy8gMjMuMi40LjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0CisgICAgICB2ZWN0b3IoY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2EpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdDIodGhpcyk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBleHBsaWNpdAorICAgICAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2EpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdDIodGhpcyk7CisgICAgICB9CisKKyAgICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUsCisJICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6ICBfQmFzZShfX24sIF9fdmFsdWUsIF9fYSkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSk7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0Mih0aGlzKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICBleHBsaWNpdAorICAgICAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSA9IF9UcCgpLAorCSAgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX24sIF9fdmFsdWUsIF9fYSkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSk7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0Mih0aGlzKTsKKyAgICAgIH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgdmVjdG9yKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorCTogX0Jhc2UoX19maXJzdCwgX19sYXN0LCBfX2EpCisgICAgICAgIHsKKwkgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCkpOworCSAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QyKHRoaXMpOworCX0KKworICAgICAgdmVjdG9yKGNvbnN0IHZlY3RvciYgX194KQorICAgICAgOiBfQmFzZShfX3gpIAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdCh0aGlzLCB0aGlzLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QyKHRoaXMpOworICAgICAgfQorCisgICAgICAvLy8gQ29uc3RydWN0aW9uIGZyb20gYSByZWxlYXNlLW1vZGUgdmVjdG9yCisgICAgICB2ZWN0b3IoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSAKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdDIodGhpcyk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2ZWN0b3IodmVjdG9yJiYgX194KSBub2V4Y2VwdAorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSk7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0Mih0aGlzKTsKKyAgICAgIH0KKworICAgICAgdmVjdG9yKGNvbnN0IF9CYXNlJiBfX3gsIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSkKKyAgICAgIDogX0Jhc2UoX194LCBfX2EpCisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdCh0aGlzLCB0aGlzLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QyKHRoaXMpOworICAgICAgfQorCisgICAgICB2ZWN0b3IodmVjdG9yJiYgX194LCBjb25zdCBfQWxsb2NhdG9yJiBfX2EpIG5vZXhjZXB0CisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpLCBfX2EpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdDIodGhpcyk7CisgICAgICB9CisKKyAgICAgIHZlY3Rvcihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgfnZlY3RvcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfZGVzdHJ1Y3QodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSwgdGhpcy0+c2l6ZSgpKTsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9kZXN0cnVjdDIodGhpcyk7CisgICAgICB9CisKKyAgICAgIHZlY3RvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB2ZWN0b3ImIF9feCkKKyAgICAgIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBfX3g7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZlY3RvciYKKyAgICAgIG9wZXJhdG9yPSh2ZWN0b3ImJiBfX3gpIG5vZXhjZXB0KF9BbGxvY190cmFpdHM6Ol9TX25vdGhyb3dfbW92ZSgpKQorICAgICAgeworCV9fcHJvZmN4eF92ZWN0b3JfZGVzdHJ1Y3QodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSwgdGhpcy0+c2l6ZSgpKTsKKwlfX3Byb2ZjeHhfdmVjdG9yX2Rlc3RydWN0Mih0aGlzKTsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IHN0ZDo6bW92ZShfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdmVjdG9yJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX19sOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6YXNzaWduOworICAgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIDIzLjIuNC4yIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3opCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfaW52YWxpZF9vcGVyYXRvcih0aGlzKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSwgX19zeik7CisgICAgICAgIF9CYXNlOjpyZXNpemUoX19zeik7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeiwgY29uc3QgX1RwJiBfX2MpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfaW52YWxpZF9vcGVyYXRvcih0aGlzKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSwgX19zeik7CisgICAgICAgIF9CYXNlOjpyZXNpemUoX19zeiwgX19jKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIF9UcCBfX2MgPSBfVHAoKSkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9pbnZhbGlkX29wZXJhdG9yKHRoaXMpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZSh0aGlzLCB0aGlzLT5jYXBhY2l0eSgpLCBfX3N6KTsKKyAgICAgICAgX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOworICAgICAgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB1c2luZyBfQmFzZTo6c2hyaW5rX3RvX2ZpdDsKKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzOgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfaW52YWxpZF9vcGVyYXRvcih0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9NX2Jhc2UoKVtfX25dOworICAgICAgfQorICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfaW52YWxpZF9vcGVyYXRvcih0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9NX2Jhc2UoKVtfX25dOworICAgICAgfQorCisgICAgICB1c2luZyBfQmFzZTo6YXQ7CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeyAKKyAgICAgICAgcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX0Jhc2U6OmZyb250KCk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgYmFjaygpCisgICAgICB7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDQ2NC4gU3VnZ2VzdGlvbiBmb3IgbmV3IG1lbWJlciBmdW5jdGlvbnMgaW4gc3RhbmRhcmQgY29udGFpbmVycy4KKyAgICAgIHVzaW5nIF9CYXNlOjpkYXRhOworCisgICAgICAvLyAyMy4yLjQuMyBtb2RpZmllcnM6CisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2soY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gdGhpcy0+Y2FwYWNpdHkoKTsKKwlfQmFzZTo6cHVzaF9iYWNrKF9feCk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHRoaXMsIF9fb2xkX3NpemUsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKF9UcCYmIF9feCkKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5jYXBhY2l0eSgpOworICAgICAgICBfQmFzZTo6cHVzaF9iYWNrKHN0ZDo6bW92ZShfX3gpKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUodGhpcywgX19vbGRfc2l6ZSwgdGhpcy0+Y2FwYWNpdHkoKSk7CisgICAgICB9CisKKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLmJhc2UoKSAtIF9CYXNlOjpiZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zaXplKCkpOworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPmNhcGFjaXR5KCk7CisJdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX194KTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUodGhpcywgX19vbGRfc2l6ZSwgdGhpcy0+Y2FwYWNpdHkoKSk7CisJcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX1RwJiYgX194KQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLmJhc2UoKSAtIF9CYXNlOjpiZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zaXplKCkpOworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPmNhcGFjaXR5KCk7CisJdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX194KTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUodGhpcywgX19vbGRfc2l6ZSwgdGhpcy0+Y2FwYWNpdHkoKSk7CisJcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGVtcGxhY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgIHsKKwkgIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfX3JlcworCSAgICA9IF9CYXNlOjplbXBsYWNlKF9fcG9zaXRpb24uYmFzZSgpLAorCQkJICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgdGhpcy0+aW5zZXJ0KF9fcG9zaXRpb24sIF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodmVjdG9yJiYgX194KQorICAgICAgeworICAgICAgICBfQmFzZTo6c3dhcChfX3gpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodmVjdG9yJiBfX3gpCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCQkJbm9leGNlcHQoX0FsbG9jX3RyYWl0czo6X1Nfbm90aHJvd19zd2FwKCkpCisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgX0Jhc2U6OnN3YXAoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLmJhc2UoKSAtIF9CYXNlOjpiZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zaXplKCkpOworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPmNhcGFjaXR5KCk7CisgICAgICAgIF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbiwgX19uLCBfX3gpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZSh0aGlzLCBfX29sZF9zaXplLCB0aGlzLT5jYXBhY2l0eSgpKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwKKyAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfaW5zZXJ0KHRoaXMsIF9fcG9zaXRpb24uYmFzZSgpLV9CYXNlOjpiZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zaXplKCkpOworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPmNhcGFjaXR5KCk7CisgICAgICAgIF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUodGhpcywgX19vbGRfc2l6ZSwgdGhpcy0+Y2FwYWNpdHkoKSk7CisgICAgICB9CisKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpKTsKKwlyZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorCXR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfX3JlcyA9IF9CYXNlOjplcmFzZShfX2ZpcnN0LmJhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGFzdC5iYXNlKCkpOworCXJldHVybiBpdGVyYXRvcihfX3JlcywgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9kZXN0cnVjdCh0aGlzLCB0aGlzLT5jYXBhY2l0eSgpLCB0aGlzLT5zaXplKCkpOworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2Rlc3RydWN0Mih0aGlzKTsKKyAgICAgICAgX0Jhc2U6OmNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIGlubGluZSB2b2lkIF9NX3Byb2ZpbGVfZmluZCgpIGNvbnN0IAorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9maW5kKHRoaXMsIHNpemUoKSk7IAorICAgICAgfQorCisgICAgICBpbmxpbmUgdm9pZCBfTV9wcm9maWxlX2l0ZXJhdGUoaW50IF9fcmV3aW5kID0gMCkgY29uc3QgCisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2l0ZXJhdGUodGhpcyk7IAorICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQgX01fcHJvZmlsZV9yZXNpemUodm9pZCogb2JqLCBzaXplX3R5cGUgX19vbGRfc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX25ld19zaXplKQorICAgICAgeworICAgICAgICBpZiAoX19vbGRfc2l6ZSA8IF9fbmV3X3NpemUpIHsKKyAgICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX3Jlc2l6ZSh0aGlzLCB0aGlzLT5zaXplKCksIF9fbmV3X3NpemUpOworICAgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfcmVzaXplMih0aGlzLCB0aGlzLT5zaXplKCksIF9fbmV3X3NpemUpOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsCisgICAgICAgICAgIGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsCisgICAgICAgICAgIGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX2xocywKKyAgICAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPCBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsCisgICAgICAgICAgIGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsCisgICAgICAgICAgIGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX2xocywKKyAgICAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsIHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHZlY3RvcjxfVHAsIF9BbGxvYz4mJiBfX2xocywgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX2xocywgdmVjdG9yPF9UcCwgX0FsbG9jPiYmIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLy8gRFIgMTE4Mi4KKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgdmVjdG9yPGJvb2w+LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IGhhc2g8X19wcm9maWxlOjp2ZWN0b3I8Ym9vbCwgX0FsbG9jPj4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9fcHJvZmlsZTo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fcHJvZmlsZTo6dmVjdG9yPGJvb2wsIF9BbGxvYz4mIF9fYikgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6aGFzaDxfR0xJQkNYWF9TVERfQzo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+KCkKKwkgIChfX2IuX01fYmFzZSgpKTsgfQorICAgIH07CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9xdWV1ZSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcXVldWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllN2Y1NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcXVldWUKQEAgLTAsMCArMSw2NiBAQAorLy8gPHF1ZXVlPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgaW5jbHVkZS9xdWV1ZQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9RVUVVRQorI2RlZmluZSBfR0xJQkNYWF9RVUVVRSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxiaXRzL3N0bF9oZWFwLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9xdWV1ZS5oPgorCisjZW5kaWYgLyogX0dMSUJDWFhfUVVFVUUgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcmFuZG9tIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9yYW5kb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViMzgyNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcmFuZG9tCkBAIC0wLDAgKzEsNTggQEAKKy8vIDxyYW5kb20+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3JhbmRvbQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9SQU5ET00KKyNkZWZpbmUgX0dMSUJDWFhfUkFORE9NIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworI2luY2x1ZGUgPGNzdGRpbnQ+IC8vIEZvciB1aW50X2Zhc3QzMl90LCB1aW50X2Zhc3Q2NF90LCB1aW50X2xlYXN0MzJfdAorI2luY2x1ZGUgPGJpdHMvcmFuZG9tLmg+CisjaW5jbHVkZSA8Yml0cy9vcHRfcmFuZG9tLmg+CisjaW5jbHVkZSA8Yml0cy9yYW5kb20udGNjPgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfUkFORE9NCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3JhdGlvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9yYXRpbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmJmOTkyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9yYXRpbwpAQCAtMCwwICsxLDUzOCBAQAorLy8gcmF0aW8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIAorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvcmF0aW8KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUkFUSU8KKyNkZWZpbmUgX0dMSUJDWFhfUkFUSU8gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBkZWZncm91cCByYXRpbyBSYXRpb25hbCBBcml0aG1ldGljCisgICAqIEBpbmdyb3VwIHV0aWxpdGllcworICAgKgorICAgKiBDb21waWxlIHRpbWUgcmVwcmVzZW50YXRpb24gb2YgZmluaXRlIHJhdGlvbmFsIG51bWJlcnMuCisgICAqIEB7CisgICAqLworCisgIHRlbXBsYXRlPGludG1heF90IF9Qbj4KKyAgICBzdHJ1Y3QgX19zdGF0aWNfc2lnbgorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8aW50bWF4X3QsIChfUG4gPCAwKSA/IC0xIDogMT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8aW50bWF4X3QgX1BuPgorICAgIHN0cnVjdCBfX3N0YXRpY19hYnMKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGludG1heF90LCBfUG4gKiBfX3N0YXRpY19zaWduPF9Qbj46OnZhbHVlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTxpbnRtYXhfdCBfUG4sIGludG1heF90IF9Rbj4KKyAgICBzdHJ1Y3QgX19zdGF0aWNfZ2NkCisgICAgOiBfX3N0YXRpY19nY2Q8X1FuLCAoX1BuICUgX1FuKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8aW50bWF4X3QgX1BuPgorICAgIHN0cnVjdCBfX3N0YXRpY19nY2Q8X1BuLCAwPgorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8aW50bWF4X3QsIF9fc3RhdGljX2FiczxfUG4+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8aW50bWF4X3QgX1FuPgorICAgIHN0cnVjdCBfX3N0YXRpY19nY2Q8MCwgX1FuPgorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8aW50bWF4X3QsIF9fc3RhdGljX2FiczxfUW4+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgLy8gTGV0IGMgPSAyXihoYWxmICMgb2YgYml0cyBpbiBhbiBpbnRtYXhfdCkKKyAgLy8gdGhlbiB3ZSBmaW5kIGExLCBhMCwgYjEsIGIwIHMudC4gTiA9IGExKmMgKyBhMCwgTSA9IGIxKmMgKyBiMAorICAvLyBUaGUgbXVsdGlwbGljYXRpb24gb2YgTiBhbmQgTSBiZWNvbWVzLAorICAvLyBOICogTSA9IChhMSAqIGIxKWNeMiArIChhMCAqIGIxICsgYjAgKiBhMSljICsgYTAgKiBiMAorICAvLyBNdWx0aXBsaWNhdGlvbiBpcyBzYWZlIGlmIGVhY2ggdGVybSBhbmQgdGhlIHN1bSBvZiB0aGUgdGVybXMKKyAgLy8gaXMgcmVwcmVzZW50YWJsZSBieSBpbnRtYXhfdC4KKyAgdGVtcGxhdGU8aW50bWF4X3QgX1BuLCBpbnRtYXhfdCBfUW4+CisgICAgc3RydWN0IF9fc2FmZV9tdWx0aXBseQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgc3RhdGljIGNvbnN0IHVpbnRtYXhfdCBfX2MgPSB1aW50bWF4X3QoMSkgPDwgKHNpemVvZihpbnRtYXhfdCkgKiA0KTsKKworICAgICAgc3RhdGljIGNvbnN0IHVpbnRtYXhfdCBfX2EwID0gX19zdGF0aWNfYWJzPF9Qbj46OnZhbHVlICUgX19jOworICAgICAgc3RhdGljIGNvbnN0IHVpbnRtYXhfdCBfX2ExID0gX19zdGF0aWNfYWJzPF9Qbj46OnZhbHVlIC8gX19jOworICAgICAgc3RhdGljIGNvbnN0IHVpbnRtYXhfdCBfX2IwID0gX19zdGF0aWNfYWJzPF9Rbj46OnZhbHVlICUgX19jOworICAgICAgc3RhdGljIGNvbnN0IHVpbnRtYXhfdCBfX2IxID0gX19zdGF0aWNfYWJzPF9Rbj46OnZhbHVlIC8gX19jOworCisgICAgICBzdGF0aWNfYXNzZXJ0KF9fYTEgPT0gMCB8fCBfX2IxID09IDAsIAorCQkgICAgIm92ZXJmbG93IGluIG11bHRpcGxpY2F0aW9uIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fYTAgKiBfX2IxICsgX19iMCAqIF9fYTEgPCAoX19jID4+IDEpLCAKKwkJICAgICJvdmVyZmxvdyBpbiBtdWx0aXBsaWNhdGlvbiIpOworICAgICAgc3RhdGljX2Fzc2VydChfX2IwICogX19hMCA8PSBfX0lOVE1BWF9NQVhfXywgCisJCSAgICAib3ZlcmZsb3cgaW4gbXVsdGlwbGljYXRpb24iKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoKF9fYTAgKiBfX2IxICsgX19iMCAqIF9fYTEpICogX19jCisJCSAgICA8PSBfX0lOVE1BWF9NQVhfXyAtICBfX2IwICogX19hMCwKKwkJICAgICJvdmVyZmxvdyBpbiBtdWx0aXBsaWNhdGlvbiIpOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNvbnN0IGludG1heF90IHZhbHVlID0gX1BuICogX1FuOworICAgIH07CisKKyAgLy8gU29tZSBkb3VibGUtcHJlY2lzaW9uIHV0aWxpdGllcywgd2hlcmUgbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgYXMKKyAgLy8gX19oaSoyXig4KnNpemVvZih1aW50bWF4X3QpKSArIF9fbG8uCisgIHRlbXBsYXRlPHVpbnRtYXhfdCBfX2hpMSwgdWludG1heF90IF9fbG8xLCB1aW50bWF4X3QgX19oaTIsIHVpbnRtYXhfdCBfX2xvMj4KKyAgICBzdHJ1Y3QgX19iaWdfbGVzcworICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faGkxIDwgX19oaTIKKwkJCSAgICAgICB8fCAoX19oaTEgPT0gX19oaTIgJiYgX19sbzEgPCBfX2xvMikpPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx1aW50bWF4X3QgX19oaTEsIHVpbnRtYXhfdCBfX2xvMSwgdWludG1heF90IF9faGkyLCB1aW50bWF4X3QgX19sbzI+CisgICAgc3RydWN0IF9fYmlnX2FkZAorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fbG8gPSBfX2xvMSArIF9fbG8yOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19oaSA9IChfX2hpMSArIF9faGkyICsKKwkJCQkJIChfX2xvMSArIF9fbG8yIDwgX19sbzEpKTsgLy8gY2FycnkKKyAgICB9OworCisgIC8vIFN1YnRyYWN0IGEgbnVtYmVyIGZyb20gYSBiaWdnZXIgb25lLgorICB0ZW1wbGF0ZTx1aW50bWF4X3QgX19oaTEsIHVpbnRtYXhfdCBfX2xvMSwgdWludG1heF90IF9faGkyLCB1aW50bWF4X3QgX19sbzI+CisgICAgc3RydWN0IF9fYmlnX3N1YgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoIV9fYmlnX2xlc3M8X19oaTEsIF9fbG8xLCBfX2hpMiwgX19sbzI+Ojp2YWx1ZSwKKwkJICAgICJJbnRlcm5hbCBsaWJyYXJ5IGVycm9yIik7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2xvID0gX19sbzEgLSBfX2xvMjsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9faGkgPSAoX19oaTEgLSBfX2hpMiAtCisJCQkJCSAoX19sbzEgPCBfX2xvMikpOyAvLyBjYXJyeQorICAgIH07CisKKyAgLy8gU2FtZSBwcmluY2lwbGUgYXMgX19zYWZlX211bHRpcGx5LgorICB0ZW1wbGF0ZTx1aW50bWF4X3QgX194LCB1aW50bWF4X3QgX195PgorICAgIHN0cnVjdCBfX2JpZ19tdWwKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fYyA9IHVpbnRtYXhfdCgxKSA8PCAoc2l6ZW9mKGludG1heF90KSAqIDQpOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX194MCA9IF9feCAlIF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9feDEgPSBfX3ggLyBfX2M7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3kwID0gX195ICUgX19jOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX195MSA9IF9feSAvIF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9feDB5MCA9IF9feDAgKiBfX3kwOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX194MHkxID0gX194MCAqIF9feTE7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3gxeTAgPSBfX3gxICogX195MDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9feDF5MSA9IF9feDEgKiBfX3kxOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19taXggPSBfX3gweTEgKyBfX3gxeTA7IC8vIHBvc3NpYmxlIGNhcnJ5Li4uCisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX21peF9sbyA9IF9fbWl4ICogX19jOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19taXhfaGkKKyAgICAgID0gX19taXggLyBfX2MgKyAoKF9fbWl4IDwgX194MHkxKSA/IF9fYyA6IDApOyAvLyAuLi4gYWRkZWQgaGVyZQorICAgICAgdHlwZWRlZiBfX2JpZ19hZGQ8X19taXhfaGksIF9fbWl4X2xvLCBfX3gxeTEsIF9feDB5MD4gX1JlczsKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2hpID0gX1Jlczo6X19oaTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fbG8gPSBfUmVzOjpfX2xvOworICAgIH07CisKKyAgLy8gQWRhcHRlZCBmcm9tIF9fdWRpdl9xcm5uZF9jIGluIGxvbmdsb25nLmgKKyAgLy8gVGhpcyB2ZXJzaW9uIGFzc3VtZXMgdGhhdCB0aGUgaGlnaCBiaXQgb2YgX19kIGlzIDEuCisgIHRlbXBsYXRlPHVpbnRtYXhfdCBfX24xLCB1aW50bWF4X3QgX19uMCwgdWludG1heF90IF9fZD4KKyAgICBzdHJ1Y3QgX19iaWdfZGl2X2ltcGwKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHN0YXRpY19hc3NlcnQoX19kID49ICh1aW50bWF4X3QoMSkgPDwgKHNpemVvZihpbnRtYXhfdCkgKiA4IC0gMSkpLAorCQkgICAgIkludGVybmFsIGxpYnJhcnkgZXJyb3IiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19uMSA8IF9fZCwgIkludGVybmFsIGxpYnJhcnkgZXJyb3IiKTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fYyA9IHVpbnRtYXhfdCgxKSA8PCAoc2l6ZW9mKGludG1heF90KSAqIDQpOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19kMSA9IF9fZCAvIF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fZDAgPSBfX2QgJSBfX2M7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fcTF4ID0gX19uMSAvIF9fZDE7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3IxeCA9IF9fbjEgJSBfX2QxOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19tID0gX19xMXggKiBfX2QwOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19yMXkgPSBfX3IxeCAqIF9fYyArIF9fbjAgLyBfX2M7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3IxeiA9IF9fcjF5ICsgX19kOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19yMQorICAgICAgPSAoKF9fcjF5IDwgX19tKSA/ICgoX19yMXogPj0gX19kKSAmJiAoX19yMXogPCBfX20pKQorCSA/IChfX3IxeiArIF9fZCkgOiBfX3IxeiA6IF9fcjF5KSAtIF9fbTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fcTEKKyAgICAgID0gX19xMXggLSAoKF9fcjF5IDwgX19tKQorCQkgPyAoKF9fcjF6ID49IF9fZCkgJiYgKF9fcjF6IDwgX19tKSkgPyAyIDogMSA6IDApOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19xMHggPSBfX3IxIC8gX19kMTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fcjB4ID0gX19yMSAlIF9fZDE7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX24gPSBfX3EweCAqIF9fZDA7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3IweSA9IF9fcjB4ICogX19jICsgX19uMCAlIF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fcjB6ID0gX19yMHkgKyBfX2Q7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3IwCisgICAgICA9ICgoX19yMHkgPCBfX24pID8gKChfX3IweiA+PSBfX2QpICYmIChfX3IweiA8IF9fbikpCisJID8gKF9fcjB6ICsgX19kKSA6IF9fcjB6IDogX19yMHkpIC0gX19uOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19xMAorICAgICAgPSBfX3EweCAtICgoX19yMHkgPCBfX24pID8gKChfX3IweiA+PSBfX2QpCisJCQkJICAmJiAoX19yMHogPCBfX24pKSA/IDIgOiAxIDogMCk7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3F1b3QgPSBfX3ExICogX19jICsgX19xMDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fcmVtID0gX19yMDsKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fYmlnX211bDxfX3F1b3QsIF9fZD4gX1Byb2Q7CisgICAgICB0eXBlZGVmIF9fYmlnX2FkZDxfUHJvZDo6X19oaSwgX1Byb2Q6Ol9fbG8sIDAsIF9fcmVtPiBfU3VtOworICAgICAgc3RhdGljX2Fzc2VydChfU3VtOjpfX2hpID09IF9fbjEgJiYgX1N1bTo6X19sbyA9PSBfX24wLAorCQkgICAgIkludGVybmFsIGxpYnJhcnkgZXJyb3IiKTsKKyAgfTsKKworICB0ZW1wbGF0ZTx1aW50bWF4X3QgX19uMSwgdWludG1heF90IF9fbjAsIHVpbnRtYXhfdCBfX2Q+CisgICAgc3RydWN0IF9fYmlnX2RpdgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgc3RhdGljX2Fzc2VydChfX2QgIT0gMCwgIkludGVybmFsIGxpYnJhcnkgZXJyb3IiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSwKKwkJICAgICJUaGlzIGxpYnJhcnkgY2FsbHMgX19idWlsdGluX2NsemxsIG9uIHVpbnRtYXhfdCwgd2hpY2ggIgorCQkgICAgImlzIHVuc2FmZSBvbiB5b3VyIHBsYXRmb3JtLiBQbGVhc2UgY29tcGxhaW4gdG8gIgorCQkgICAgImh0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS8iKTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IF9fc2hpZnQgPSBfX2J1aWx0aW5fY2x6bGwoX19kKTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IF9fY29zaGlmdF8gPSBzaXplb2YodWludG1heF90KSAqIDggLSBfX3NoaWZ0OworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgX19jb3NoaWZ0ID0gKF9fc2hpZnQgIT0gMCkgPyBfX2Nvc2hpZnRfIDogMDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fYzEgPSB1aW50bWF4X3QoMSkgPDwgX19zaGlmdDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fYzIgPSB1aW50bWF4X3QoMSkgPDwgX19jb3NoaWZ0OworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19uZXdfZCA9IF9fZCAqIF9fYzE7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX25ld19uMCA9IF9fbjAgKiBfX2MxOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19uMV9zaGlmdGVkID0gKF9fbjEgJSBfX2QpICogX19jMTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fbjBfdG9wID0gKF9fc2hpZnQgIT0gMCkgPyAoX19uMCAvIF9fYzIpIDogMDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fbmV3X24xID0gX19uMV9zaGlmdGVkICsgX19uMF90b3A7CisgICAgICB0eXBlZGVmIF9fYmlnX2Rpdl9pbXBsPF9fbmV3X24xLCBfX25ld19uMCwgX19uZXdfZD4gX1JlczsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fcXVvdF9oaSA9IF9fbjEgLyBfX2Q7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3F1b3RfbG8gPSBfUmVzOjpfX3F1b3Q7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3JlbSA9IF9SZXM6Ol9fcmVtIC8gX19jMTsKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fYmlnX211bDxfX3F1b3RfbG8sIF9fZD4gX1AwOworICAgICAgdHlwZWRlZiBfX2JpZ19tdWw8X19xdW90X2hpLCBfX2Q+IF9QMTsKKyAgICAgIHR5cGVkZWYgX19iaWdfYWRkPF9QMDo6X19oaSwgX1AwOjpfX2xvLCBfUDE6Ol9fbG8sIF9fcmVtPiBfU3VtOworICAgICAgLy8gTm8gb3ZlcmZsb3cuCisgICAgICBzdGF0aWNfYXNzZXJ0KF9QMTo6X19oaSA9PSAwLCAiSW50ZXJuYWwgbGlicmFyeSBlcnJvciIpOworICAgICAgc3RhdGljX2Fzc2VydChfU3VtOjpfX2hpID49IF9QMDo6X19oaSwgIkludGVybmFsIGxpYnJhcnkgZXJyb3IiKTsKKyAgICAgIC8vIE1hdGNoZXMgdGhlIGlucHV0IGRhdGEuCisgICAgICBzdGF0aWNfYXNzZXJ0KF9TdW06Ol9faGkgPT0gX19uMSAmJiBfU3VtOjpfX2xvID09IF9fbjAsCisJCSAgICAiSW50ZXJuYWwgbGlicmFyeSBlcnJvciIpOworICAgICAgc3RhdGljX2Fzc2VydChfX3JlbSA8IF9fZCwgIkludGVybmFsIGxpYnJhcnkgZXJyb3IiKTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIFByb3ZpZGVzIGNvbXBpbGUtdGltZSByYXRpb25hbCBhcml0aG1ldGljLgorICAgKgorICAgKiAgVGhpcyBjbGFzcyB0ZW1wbGF0ZSByZXByZXNlbnRzIGFueSBmaW5pdGUgcmF0aW9uYWwgbnVtYmVyIHdpdGggYQorICAgKiAgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciByZXByZXNlbnRhYmxlIGJ5IGNvbXBpbGUtdGltZSBjb25zdGFudHMgb2YKKyAgICogIHR5cGUgaW50bWF4X3QuIFRoZSByYXRpbyBpcyBzaW1wbGlmaWVkIHdoZW4gaW5zdGFudGlhdGVkLgorICAgKgorICAgKiAgRm9yIGV4YW1wbGU6CisgICAqICBAY29kZQorICAgKiAgICBzdGQ6OnJhdGlvPDcsLTIxPjo6bnVtID09IC0xOworICAgKiAgICBzdGQ6OnJhdGlvPDcsLTIxPjo6ZGVuID09IDM7CisgICAqICBAZW5kY29kZQorICAgKiAgCisgICovCisgIHRlbXBsYXRlPGludG1heF90IF9OdW0sIGludG1heF90IF9EZW4gPSAxPgorICAgIHN0cnVjdCByYXRpbworICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX0RlbiAhPSAwLCAiZGVub21pbmF0b3IgY2Fubm90IGJlIHplcm8iKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX051bSA+PSAtX19JTlRNQVhfTUFYX18gJiYgX0RlbiA+PSAtX19JTlRNQVhfTUFYX18sCisJCSAgICAib3V0IG9mIHJhbmdlIik7CisKKyAgICAgIC8vIE5vdGU6IHNpZ24oTikgKiBhYnMoTikgPT0gTgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRtYXhfdCBudW0gPQorICAgICAgICBfTnVtICogX19zdGF0aWNfc2lnbjxfRGVuPjo6dmFsdWUgLyBfX3N0YXRpY19nY2Q8X051bSwgX0Rlbj46OnZhbHVlOworCisgICAgICBzdGF0aWMgY29uc3RleHByIGludG1heF90IGRlbiA9CisgICAgICAgIF9fc3RhdGljX2FiczxfRGVuPjo6dmFsdWUgLyBfX3N0YXRpY19nY2Q8X051bSwgX0Rlbj46OnZhbHVlOworCisgICAgICB0eXBlZGVmIHJhdGlvPG51bSwgZGVuPiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8aW50bWF4X3QgX051bSwgaW50bWF4X3QgX0Rlbj4KKyAgICBjb25zdGV4cHIgaW50bWF4X3QgcmF0aW88X051bSwgX0Rlbj46Om51bTsKKworICB0ZW1wbGF0ZTxpbnRtYXhfdCBfTnVtLCBpbnRtYXhfdCBfRGVuPgorICAgIGNvbnN0ZXhwciBpbnRtYXhfdCByYXRpbzxfTnVtLCBfRGVuPjo6ZGVuOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHN0cnVjdCBfX3JhdGlvX211bHRpcGx5CisgICAgeworICAgIHByaXZhdGU6CisgICAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgX19nY2QxID0KKyAgICAgICAgX19zdGF0aWNfZ2NkPF9SMTo6bnVtLCBfUjI6OmRlbj46OnZhbHVlOworICAgICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fZ2NkMiA9CisgICAgICAgIF9fc3RhdGljX2djZDxfUjI6Om51bSwgX1IxOjpkZW4+Ojp2YWx1ZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgcmF0aW88CisgICAgICAgIF9fc2FmZV9tdWx0aXBseTwoX1IxOjpudW0gLyBfX2djZDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgKF9SMjo6bnVtIC8gX19nY2QyKT46OnZhbHVlLAorICAgICAgICBfX3NhZmVfbXVsdGlwbHk8KF9SMTo6ZGVuIC8gX19nY2QyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfUjI6OmRlbiAvIF9fZ2NkMSk+Ojp2YWx1ZT4gdHlwZTsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRtYXhfdCBudW0gPSB0eXBlOjpudW07CisgICAgICBzdGF0aWMgY29uc3RleHByIGludG1heF90IGRlbiA9IHR5cGU6OmRlbjsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIGNvbnN0ZXhwciBpbnRtYXhfdCBfX3JhdGlvX211bHRpcGx5PF9SMSwgX1IyPjo6bnVtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIGNvbnN0ZXhwciBpbnRtYXhfdCBfX3JhdGlvX211bHRpcGx5PF9SMSwgX1IyPjo6ZGVuOworCisgIC8vLyByYXRpb19tdWx0aXBseQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICB1c2luZyByYXRpb19tdWx0aXBseSA9IHR5cGVuYW1lIF9fcmF0aW9fbXVsdGlwbHk8X1IxLCBfUjI+Ojp0eXBlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHN0cnVjdCBfX3JhdGlvX2RpdmlkZQorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX1IyOjpudW0gIT0gMCwgImRpdmlzaW9uIGJ5IDAiKTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JhdGlvX211bHRpcGx5PAorICAgICAgICBfUjEsCisgICAgICAgIHJhdGlvPF9SMjo6ZGVuLCBfUjI6Om51bT4+Ojp0eXBlIHR5cGU7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50bWF4X3QgbnVtID0gdHlwZTo6bnVtOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRtYXhfdCBkZW4gPSB0eXBlOjpkZW47CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBjb25zdGV4cHIgaW50bWF4X3QgX19yYXRpb19kaXZpZGU8X1IxLCBfUjI+OjpudW07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgY29uc3RleHByIGludG1heF90IF9fcmF0aW9fZGl2aWRlPF9SMSwgX1IyPjo6ZGVuOworCisgIC8vLyByYXRpb19kaXZpZGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgdXNpbmcgcmF0aW9fZGl2aWRlID0gdHlwZW5hbWUgX19yYXRpb19kaXZpZGU8X1IxLCBfUjI+Ojp0eXBlOworCisgIC8vLyByYXRpb19lcXVhbAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBzdHJ1Y3QgcmF0aW9fZXF1YWwKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9SMTo6bnVtID09IF9SMjo6bnVtICYmIF9SMTo6ZGVuID09IF9SMjo6ZGVuPgorICAgIHsgfTsKKyAgCisgIC8vLyByYXRpb19ub3RfZXF1YWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IHJhdGlvX25vdF9lcXVhbAorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgIXJhdGlvX2VxdWFsPF9SMSwgX1IyPjo6dmFsdWU+CisgICAgeyB9OworCisgIC8vIEJvdGggbnVtYmVycyBhcmUgcG9zaXRpdmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyLAorICAgICAgICAgICB0eXBlbmFtZSBfTGVmdCA9IF9fYmlnX211bDxfUjE6Om51bSxfUjI6OmRlbj4sCisgICAgICAgICAgIHR5cGVuYW1lIF9SaWdodCA9IF9fYmlnX211bDxfUjI6Om51bSxfUjE6OmRlbj4gPgorICAgIHN0cnVjdCBfX3JhdGlvX2xlc3NfaW1wbF8xCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2JpZ19sZXNzPF9MZWZ0OjpfX2hpLCBfTGVmdDo6X19sbywKKyAgICAgICAgICAgX1JpZ2h0OjpfX2hpLCBfUmlnaHQ6Ol9fbG8+Ojp2YWx1ZT4KKyAgICB7IH07IAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyLAorCSAgIGJvb2wgPSAoX1IxOjpudW0gPT0gMCB8fCBfUjI6Om51bSA9PSAwCisJCSAgIHx8IChfX3N0YXRpY19zaWduPF9SMTo6bnVtPjo6dmFsdWUKKwkJICAgICAgICE9IF9fc3RhdGljX3NpZ248X1IyOjpudW0+Ojp2YWx1ZSkpLAorCSAgIGJvb2wgPSAoX19zdGF0aWNfc2lnbjxfUjE6Om51bT46OnZhbHVlID09IC0xCisJCSAgICYmIF9fc3RhdGljX3NpZ248X1IyOjpudW0+Ojp2YWx1ZSA9PSAtMSk+CisgICAgc3RydWN0IF9fcmF0aW9fbGVzc19pbXBsCisgICAgOiBfX3JhdGlvX2xlc3NfaW1wbF8xPF9SMSwgX1IyPjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBzdHJ1Y3QgX19yYXRpb19sZXNzX2ltcGw8X1IxLCBfUjIsIHRydWUsIGZhbHNlPgorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX1IxOjpudW0gPCBfUjI6Om51bT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IF9fcmF0aW9fbGVzc19pbXBsPF9SMSwgX1IyLCBmYWxzZSwgdHJ1ZT4KKyAgICA6IF9fcmF0aW9fbGVzc19pbXBsXzE8cmF0aW88LV9SMjo6bnVtLCBfUjI6OmRlbj4sCisgICAgICAgICAgIHJhdGlvPC1fUjE6Om51bSwgX1IxOjpkZW4+ID46OnR5cGUKKyAgICB7IH07CisKKyAgLy8vIHJhdGlvX2xlc3MKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IHJhdGlvX2xlc3MKKyAgICA6IF9fcmF0aW9fbGVzc19pbXBsPF9SMSwgX1IyPjo6dHlwZQorICAgIHsgfTsKKyAgICAKKyAgLy8vIHJhdGlvX2xlc3NfZXF1YWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IHJhdGlvX2xlc3NfZXF1YWwKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsICFyYXRpb19sZXNzPF9SMiwgX1IxPjo6dmFsdWU+CisgICAgeyB9OworICAKKyAgLy8vIHJhdGlvX2dyZWF0ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IHJhdGlvX2dyZWF0ZXIKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIHJhdGlvX2xlc3M8X1IyLCBfUjE+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgLy8vIHJhdGlvX2dyZWF0ZXJfZXF1YWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IHJhdGlvX2dyZWF0ZXJfZXF1YWwKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsICFyYXRpb19sZXNzPF9SMSwgX1IyPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyLAorICAgICAgYm9vbCA9IChfUjE6Om51bSA+PSAwKSwKKyAgICAgIGJvb2wgPSAoX1IyOjpudW0gPj0gMCksCisgICAgICBib29sID0gcmF0aW9fbGVzczxyYXRpbzxfX3N0YXRpY19hYnM8X1IxOjpudW0+Ojp2YWx1ZSwgX1IxOjpkZW4+LAorICAgICAgICByYXRpbzxfX3N0YXRpY19hYnM8X1IyOjpudW0+Ojp2YWx1ZSwgX1IyOjpkZW4+ID46OnZhbHVlPgorICAgIHN0cnVjdCBfX3JhdGlvX2FkZF9pbXBsCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmF0aW9fYWRkX2ltcGw8CisgICAgICAgIHJhdGlvPC1fUjE6Om51bSwgX1IxOjpkZW4+LAorICAgICAgICByYXRpbzwtX1IyOjpudW0sIF9SMjo6ZGVuPiA+Ojp0eXBlIF9fdDsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHJhdGlvPC1fX3Q6Om51bSwgX190OjpkZW4+IHR5cGU7CisgICAgfTsKKworICAvLyBUcnVlIGFkZGl0aW9uIG9mIG5vbm5lZ2F0aXZlIG51bWJlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyLCBib29sIF9fYj4KKyAgICBzdHJ1Y3QgX19yYXRpb19hZGRfaW1wbDxfUjEsIF9SMiwgdHJ1ZSwgdHJ1ZSwgX19iPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19nID0gX19zdGF0aWNfZ2NkPF9SMTo6ZGVuLCBfUjI6OmRlbj46OnZhbHVlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19kMiA9IF9SMjo6ZGVuIC8gX19nOworICAgICAgdHlwZWRlZiBfX2JpZ19tdWw8X1IxOjpkZW4sIF9fZDI+IF9fZDsKKyAgICAgIHR5cGVkZWYgX19iaWdfbXVsPF9SMTo6bnVtLCBfUjI6OmRlbiAvIF9fZz4gX194OworICAgICAgdHlwZWRlZiBfX2JpZ19tdWw8X1IyOjpudW0sIF9SMTo6ZGVuIC8gX19nPiBfX3k7CisgICAgICB0eXBlZGVmIF9fYmlnX2FkZDxfX3g6Ol9faGksIF9feDo6X19sbywgX195OjpfX2hpLCBfX3k6Ol9fbG8+IF9fbjsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19uOjpfX2hpID49IF9feDo6X19oaSwgIkludGVybmFsIGxpYnJhcnkgZXJyb3IiKTsKKyAgICAgIHR5cGVkZWYgX19iaWdfZGl2PF9fbjo6X19oaSwgX19uOjpfX2xvLCBfX2c+IF9fbmc7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2cyID0gX19zdGF0aWNfZ2NkPF9fbmc6Ol9fcmVtLCBfX2c+Ojp2YWx1ZTsKKyAgICAgIHR5cGVkZWYgX19iaWdfZGl2PF9fbjo6X19oaSwgX19uOjpfX2xvLCBfX2cyPiBfX25fZmluYWw7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fbl9maW5hbDo6X19yZW0gPT0gMCwgIkludGVybmFsIGxpYnJhcnkgZXJyb3IiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19uX2ZpbmFsOjpfX3F1b3RfaGkgPT0gMCAmJgorICAgICAgICBfX25fZmluYWw6Ol9fcXVvdF9sbyA8PSBfX0lOVE1BWF9NQVhfXywgIm92ZXJmbG93IGluIGFkZGl0aW9uIik7CisgICAgICB0eXBlZGVmIF9fYmlnX211bDxfUjE6OmRlbiAvIF9fZzIsIF9fZDI+IF9fZF9maW5hbDsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19kX2ZpbmFsOjpfX2hpID09IDAgJiYKKyAgICAgICAgX19kX2ZpbmFsOjpfX2xvIDw9IF9fSU5UTUFYX01BWF9fLCAib3ZlcmZsb3cgaW4gYWRkaXRpb24iKTsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHJhdGlvPF9fbl9maW5hbDo6X19xdW90X2xvLCBfX2RfZmluYWw6Ol9fbG8+IHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBzdHJ1Y3QgX19yYXRpb19hZGRfaW1wbDxfUjEsIF9SMiwgZmFsc2UsIHRydWUsIHRydWU+CisgICAgOiBfX3JhdGlvX2FkZF9pbXBsPF9SMiwgX1IxPgorICAgIHsgfTsKKworICAvLyBUcnVlIHN1YnRyYWN0aW9uIG9mIG5vbm5lZ2F0aXZlIG51bWJlcnMgeWllbGRpbmcgYSBub25uZWdhdGl2ZSByZXN1bHQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHN0cnVjdCBfX3JhdGlvX2FkZF9pbXBsPF9SMSwgX1IyLCB0cnVlLCBmYWxzZSwgZmFsc2U+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2cgPSBfX3N0YXRpY19nY2Q8X1IxOjpkZW4sIF9SMjo6ZGVuPjo6dmFsdWU7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2QyID0gX1IyOjpkZW4gLyBfX2c7CisgICAgICB0eXBlZGVmIF9fYmlnX211bDxfUjE6OmRlbiwgX19kMj4gX19kOworICAgICAgdHlwZWRlZiBfX2JpZ19tdWw8X1IxOjpudW0sIF9SMjo6ZGVuIC8gX19nPiBfX3g7CisgICAgICB0eXBlZGVmIF9fYmlnX211bDwtX1IyOjpudW0sIF9SMTo6ZGVuIC8gX19nPiBfX3k7CisgICAgICB0eXBlZGVmIF9fYmlnX3N1YjxfX3g6Ol9faGksIF9feDo6X19sbywgX195OjpfX2hpLCBfX3k6Ol9fbG8+IF9fbjsKKyAgICAgIHR5cGVkZWYgX19iaWdfZGl2PF9fbjo6X19oaSwgX19uOjpfX2xvLCBfX2c+IF9fbmc7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2cyID0gX19zdGF0aWNfZ2NkPF9fbmc6Ol9fcmVtLCBfX2c+Ojp2YWx1ZTsKKyAgICAgIHR5cGVkZWYgX19iaWdfZGl2PF9fbjo6X19oaSwgX19uOjpfX2xvLCBfX2cyPiBfX25fZmluYWw7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fbl9maW5hbDo6X19yZW0gPT0gMCwgIkludGVybmFsIGxpYnJhcnkgZXJyb3IiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19uX2ZpbmFsOjpfX3F1b3RfaGkgPT0gMCAmJgorICAgICAgICBfX25fZmluYWw6Ol9fcXVvdF9sbyA8PSBfX0lOVE1BWF9NQVhfXywgIm92ZXJmbG93IGluIGFkZGl0aW9uIik7CisgICAgICB0eXBlZGVmIF9fYmlnX211bDxfUjE6OmRlbiAvIF9fZzIsIF9fZDI+IF9fZF9maW5hbDsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19kX2ZpbmFsOjpfX2hpID09IDAgJiYKKyAgICAgICAgX19kX2ZpbmFsOjpfX2xvIDw9IF9fSU5UTUFYX01BWF9fLCAib3ZlcmZsb3cgaW4gYWRkaXRpb24iKTsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHJhdGlvPF9fbl9maW5hbDo6X19xdW90X2xvLCBfX2RfZmluYWw6Ol9fbG8+IHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBzdHJ1Y3QgX19yYXRpb19hZGQKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmF0aW9fYWRkX2ltcGw8X1IxLCBfUjI+Ojp0eXBlIHR5cGU7CisgICAgICBzdGF0aWMgY29uc3RleHByIGludG1heF90IG51bSA9IHR5cGU6Om51bTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50bWF4X3QgZGVuID0gdHlwZTo6ZGVuOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgY29uc3RleHByIGludG1heF90IF9fcmF0aW9fYWRkPF9SMSwgX1IyPjo6bnVtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIGNvbnN0ZXhwciBpbnRtYXhfdCBfX3JhdGlvX2FkZDxfUjEsIF9SMj46OmRlbjsKKworICAvLy8gcmF0aW9fYWRkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHVzaW5nIHJhdGlvX2FkZCA9IHR5cGVuYW1lIF9fcmF0aW9fYWRkPF9SMSwgX1IyPjo6dHlwZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBzdHJ1Y3QgX19yYXRpb19zdWJ0cmFjdAorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yYXRpb19hZGQ8CisgICAgICAgIF9SMSwKKyAgICAgICAgcmF0aW88LV9SMjo6bnVtLCBfUjI6OmRlbj4+Ojp0eXBlIHR5cGU7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50bWF4X3QgbnVtID0gdHlwZTo6bnVtOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRtYXhfdCBkZW4gPSB0eXBlOjpkZW47CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBjb25zdGV4cHIgaW50bWF4X3QgX19yYXRpb19zdWJ0cmFjdDxfUjEsIF9SMj46Om51bTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBjb25zdGV4cHIgaW50bWF4X3QgX19yYXRpb19zdWJ0cmFjdDxfUjEsIF9SMj46OmRlbjsKKworICAvLy8gcmF0aW9fc3VidHJhY3QKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgdXNpbmcgcmF0aW9fc3VidHJhY3QgPSB0eXBlbmFtZSBfX3JhdGlvX3N1YnRyYWN0PF9SMSwgX1IyPjo6dHlwZTsKKworCisgIHR5cGVkZWYgcmF0aW88MSwgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMD4gYXR0bzsKKyAgdHlwZWRlZiByYXRpbzwxLCAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwPiBmZW10bzsKKyAgdHlwZWRlZiByYXRpbzwxLCAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwPiBwaWNvOworICB0eXBlZGVmIHJhdGlvPDEsICAgICAgICAgICAgICAgIDEwMDAwMDAwMDA+IG5hbm87CisgIHR5cGVkZWYgcmF0aW88MSwgICAgICAgICAgICAgICAgICAgMTAwMDAwMD4gbWljcm87CisgIHR5cGVkZWYgcmF0aW88MSwgICAgICAgICAgICAgICAgICAgICAgMTAwMD4gbWlsbGk7CisgIHR5cGVkZWYgcmF0aW88MSwgICAgICAgICAgICAgICAgICAgICAgIDEwMD4gY2VudGk7CisgIHR5cGVkZWYgcmF0aW88MSwgICAgICAgICAgICAgICAgICAgICAgICAxMD4gZGVjaTsKKyAgdHlwZWRlZiByYXRpbzwgICAgICAgICAgICAgICAgICAgICAgIDEwLCAxPiBkZWNhOworICB0eXBlZGVmIHJhdGlvPCAgICAgICAgICAgICAgICAgICAgICAxMDAsIDE+IGhlY3RvOworICB0eXBlZGVmIHJhdGlvPCAgICAgICAgICAgICAgICAgICAgIDEwMDAsIDE+IGtpbG87CisgIHR5cGVkZWYgcmF0aW88ICAgICAgICAgICAgICAgICAgMTAwMDAwMCwgMT4gbWVnYTsKKyAgdHlwZWRlZiByYXRpbzwgICAgICAgICAgICAgICAxMDAwMDAwMDAwLCAxPiBnaWdhOworICB0eXBlZGVmIHJhdGlvPCAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAsIDE+IHRlcmE7CisgIHR5cGVkZWYgcmF0aW88ICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMCwgMT4gcGV0YTsKKyAgdHlwZWRlZiByYXRpbzwgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwLCAxPiBleGE7CisKKyAgLy8gQH0gZ3JvdXAgcmF0aW8KK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy9fR0xJQkNYWF9SQVRJTwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9yZWdleCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcmVnZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3ZjViYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcmVnZXgKQEAgLTAsMCArMSw2NiBAQAorLy8gPHJlZ2V4PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9yZWdleAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9SRUdFWAorI2RlZmluZSBfR0xJQkNYWF9SRUdFWCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyMgaW5jbHVkZSA8aW9zZndkPgorI2VuZGlmCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKyNpbmNsdWRlIDxiaXRzL3JlZ2V4X2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGJpdHMvcmVnZXhfZXJyb3IuaD4KKyNpbmNsdWRlIDxiaXRzL3JlZ2V4X2N1cnNvci5oPgorI2luY2x1ZGUgPGJpdHMvcmVnZXhfbmZhLmg+CisjaW5jbHVkZSA8Yml0cy9yZWdleF9jb21waWxlci5oPgorI2luY2x1ZGUgPGJpdHMvcmVnZXhfZ3JlcF9tYXRjaGVyLmg+CisjaW5jbHVkZSA8Yml0cy9yZWdleC5oPgorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX1JFR0VYCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Njb3BlZF9hbGxvY2F0b3IgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Njb3BlZF9hbGxvY2F0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViMTkzNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc2NvcGVkX2FsbG9jYXRvcgpAQCAtMCwwICsxLDQ2MyBAQAorLy8gPHNjb3BlZF9hbGxvY2F0b3I+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3Njb3BlZF9hbGxvY2F0b3IKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX1NDT1BFRF9BTExPQ0FUT1IKKyNkZWZpbmUgX1NDT1BFRF9BTExPQ0FUT1IgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDxiaXRzL2FsbG9jX3RyYWl0cy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIF9QcmVkLCB0eXBlbmFtZS4uLiBfQWxsb2NzPgorICAgIHN0cnVjdCBfX2FueV9vZjsKKworICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FsbG9jcz4KKyAgICBzdHJ1Y3QgX19hbnlfb2Y8X1ByZWQsIF9BbGxvYywgX0FsbG9jcy4uLj4KKyAgICA6IF9fb3JfPF9QcmVkPF9BbGxvYz4sIF9fYW55X29mPF9QcmVkLCBfQWxsb2NzLi4uPj4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9fYW55X29mPF9QcmVkLCBfQWxsb2M+CisgICAgOiBfUHJlZDxfQWxsb2M+CisgICAgeyB9OworCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBhbGxvY2F0b3JzCisgICAqIEB7CisgICAqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX19wcm9wYWdhdGVfb25fY29weQorICAgIDogYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+Ojpwcm9wYWdhdGVfb25fY29udGFpbmVyX2NvcHlfYXNzaWdubWVudAorICAgIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBfX3Byb3BhZ2F0ZV9vbl9tb3ZlCisgICAgOiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50CisgICAgeyB9OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9fcHJvcGFnYXRlX29uX3N3YXAKKyAgICA6IGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPjo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwCisgICAgeyB9OworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBhdXRvCisgICAgX19kb19vdXRlcm1vc3QoX0FsbG9jJiBfX2EsIF9BbGxvYyopIC0+IGRlY2x0eXBlKF9fYS5vdXRlcl9hbGxvY2F0b3IoKSkKKyAgICB7IHJldHVybiBfX2Eub3V0ZXJfYWxsb2NhdG9yKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIF9BbGxvYyYKKyAgICBfX2RvX291dGVybW9zdChfQWxsb2MmIF9fYSwgLi4uKQorICAgIHsgcmV0dXJuIF9fYTsgfQorCisgIC8vIFRPRE86IG1ha2UgcmVjdXJzaXZlIChzZWUgbm90ZSBpbiAyMC4xMi40LzEpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYXV0bworICAgIF9fb3V0ZXJtb3N0KF9BbGxvYyYgX19hKSAtPiBkZWNsdHlwZShfX2RvX291dGVybW9zdChfX2EsICZfX2EpKQorICAgIHsgcmV0dXJuIF9fZG9fb3V0ZXJtb3N0KF9fYSwgJl9fYSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0ZXJBbGxvYywgdHlwZW5hbWUuLi4gX0lubmVyQWxsb2NzPgorICAgIGNsYXNzIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4gCisgICAgc3RydWN0IF9faW5uZXJfdHlwZV9pbXBsOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRlcj4KKyAgICBzdHJ1Y3QgX19pbm5lcl90eXBlX2ltcGw8X091dGVyPgorICAgIHsKKyAgICAgIHR5cGVkZWYgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPF9PdXRlcj4gX190eXBlOworCisgICAgICBfX2lubmVyX3R5cGVfaW1wbCgpID0gZGVmYXVsdDsKKyAgICAgIF9faW5uZXJfdHlwZV9pbXBsKGNvbnN0IF9faW5uZXJfdHlwZV9pbXBsJikgPSBkZWZhdWx0OworICAgICAgX19pbm5lcl90eXBlX2ltcGwoX19pbm5lcl90eXBlX2ltcGwmJikgPSBkZWZhdWx0OworICAgICAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgICBfX2lubmVyX3R5cGVfaW1wbChjb25zdCBfX2lubmVyX3R5cGVfaW1wbDxfQWxsb2M+JiBfX290aGVyKQorICAgICAgeyB9CisgICAgICAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIF9faW5uZXJfdHlwZV9pbXBsKF9faW5uZXJfdHlwZV9pbXBsPF9BbGxvYz4mJiBfX290aGVyKQorICAgICAgeyB9CisgICAgICAKKyAgICAgIF9fdHlwZSYgCisgICAgICBfTV9nZXQoX190eXBlKiBfX3ApIG5vZXhjZXB0IHsgcmV0dXJuICpfX3A7IH0KKworICAgICAgY29uc3QgX190eXBlJiAKKyAgICAgIF9NX2dldChjb25zdCBfX3R5cGUqIF9fcCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gKl9fcDsgfQorICAgICAgCisgICAgICB0dXBsZTw+IAorICAgICAgX01fdGllKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gdHVwbGU8PigpOyB9CisgICAgICAKKyAgICAgIGJvb2wgCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9faW5uZXJfdHlwZV9pbXBsJikgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHRydWU7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRlciwgdHlwZW5hbWUgX0lubmVySGVhZCwgdHlwZW5hbWUuLi4gX0lubmVyVGFpbD4KKyAgICBzdHJ1Y3QgX19pbm5lcl90eXBlX2ltcGw8X091dGVyLCBfSW5uZXJIZWFkLCBfSW5uZXJUYWlsLi4uPgorICAgIHsKKyAgICAgIHR5cGVkZWYgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPF9Jbm5lckhlYWQsIF9Jbm5lclRhaWwuLi4+IF9fdHlwZTsKKyAgICAgIAorICAgICAgX19pbm5lcl90eXBlX2ltcGwoKSA9IGRlZmF1bHQ7CisgICAgICBfX2lubmVyX3R5cGVfaW1wbChjb25zdCBfX2lubmVyX3R5cGVfaW1wbCYpID0gZGVmYXVsdDsKKyAgICAgIF9faW5uZXJfdHlwZV9pbXBsKF9faW5uZXJfdHlwZV9pbXBsJiYpID0gZGVmYXVsdDsKKyAgICAgIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FsbG9jcz4KKyAgICAgIF9faW5uZXJfdHlwZV9pbXBsKGNvbnN0IF9faW5uZXJfdHlwZV9pbXBsPF9BbGxvY3MuLi4+JiBfX290aGVyKQorICAgICAgOiBfTV9pbm5lcihfX290aGVyLl9NX2lubmVyKSB7IH0KKyAgICAgIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FsbG9jcz4KKyAgICAgIF9faW5uZXJfdHlwZV9pbXBsKF9faW5uZXJfdHlwZV9pbXBsPF9BbGxvY3MuLi4+JiYgX19vdGhlcikKKyAgICAgIDogX01faW5uZXIoc3RkOjptb3ZlKF9fb3RoZXIuX01faW5uZXIpKSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgZXhwbGljaXQKKyAgICAgIF9faW5uZXJfdHlwZV9pbXBsKF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgOiBfTV9pbm5lcihzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pIHsgfQorCisgICAgICBfX3R5cGUmIAorICAgICAgX01fZ2V0KHZvaWQqKSBub2V4Y2VwdCB7IHJldHVybiBfTV9pbm5lcjsgfQorICAgICAgCisgICAgICBjb25zdCBfX3R5cGUmIAorICAgICAgX01fZ2V0KGNvbnN0IHZvaWQqKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBfTV9pbm5lcjsgfQorICAgICAgCisgICAgICB0dXBsZTxjb25zdCBfSW5uZXJIZWFkJiwgY29uc3QgX0lubmVyVGFpbCYuLi4+IAorICAgICAgX01fdGllKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2lubmVyLl9NX3RpZSgpOyB9CisgICAgICAKKyAgICAgIGJvb2wgCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9faW5uZXJfdHlwZV9pbXBsJiBfX290aGVyKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faW5uZXIgPT0gX19vdGhlci5fTV9pbm5lcjsgfQorICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uPiBmcmllbmQgY2xhc3MgX19pbm5lcl90eXBlX2ltcGw7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWUuLi4+IGZyaWVuZCBjbGFzcyBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I7CisgICAgICAKKyAgICAgIF9fdHlwZSBfTV9pbm5lcjsKKyAgICB9OworCisgIC8vLyBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0ZXJBbGxvYywgdHlwZW5hbWUuLi4gX0lubmVyQWxsb2NzPgorICAgIGNsYXNzIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcgorICAgIDogcHVibGljIF9PdXRlckFsbG9jCisgICAgeworICAgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9PdXRlckFsbG9jPiBfX3RyYWl0czsKKworICAgICAgdHlwZWRlZiBfX2lubmVyX3R5cGVfaW1wbDxfT3V0ZXJBbGxvYywgX0lubmVyQWxsb2NzLi4uPiBfX2lubmVyX3R5cGU7CisgICAgICBfX2lubmVyX3R5cGUgX01faW5uZXI7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRlciwgdHlwZW5hbWUuLi4gX0lubmVyPgorICAgICAgICBmcmllbmQgY2xhc3Mgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4KKyAgICAgICAgZnJpZW5kIGNsYXNzIF9faW5uZXJfdHlwZV9pbXBsOworCisgICAgICB0dXBsZTxjb25zdCBfT3V0ZXJBbGxvYyYsIGNvbnN0IF9Jbm5lckFsbG9jcyYuLi4+CisgICAgICBfTV90aWUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjp0dXBsZV9jYXQoc3RkOjp0aWUob3V0ZXJfYWxsb2NhdG9yKCkpLCBfTV9pbm5lci5fTV90aWUoKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCXVzaW5nIF9fb3V0ZXJtb3N0X3R5cGUgPSB0eXBlbmFtZQorCSAgc3RkOjpkZWNheTxkZWNsdHlwZShfX291dGVybW9zdChzdGQ6OmRlY2x2YWw8X0FsbG9jJj4oKSkpPjo6dHlwZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCXVzaW5nIF9fb3V0ZXJtb3N0X2FsbG9jX3RyYWl0cworCSAgPSBhbGxvY2F0b3JfdHJhaXRzPF9fb3V0ZXJtb3N0X3R5cGU8X0FsbG9jPj47CisgICAgICAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQgCisgICAgICAgIF9NX2NvbnN0cnVjdChfX3VzZXNfYWxsb2MwLCBfVHAqIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgX19vdXRlcm1vc3RfYWxsb2NfdHJhaXRzPHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcj4gX09fdHJhaXRzOworCSAgX09fdHJhaXRzOjpjb25zdHJ1Y3QoX19vdXRlcm1vc3QoKnRoaXMpLCBfX3AsCisJCQkgICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgICAgfQorCisgICAgICB0eXBlZGVmIF9fdXNlc19hbGxvYzE8dHlwZW5hbWUgX19pbm5lcl90eXBlOjpfX3R5cGU+IF9fdXNlc19hbGxvYzFfOworICAgICAgdHlwZWRlZiBfX3VzZXNfYWxsb2MyPHR5cGVuYW1lIF9faW5uZXJfdHlwZTo6X190eXBlPiBfX3VzZXNfYWxsb2MyXzsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZCAKKyAgICAgICAgX01fY29uc3RydWN0KF9fdXNlc19hbGxvYzFfLCBfVHAqIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgX19vdXRlcm1vc3RfYWxsb2NfdHJhaXRzPHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcj4gX09fdHJhaXRzOworCSAgX09fdHJhaXRzOjpjb25zdHJ1Y3QoX19vdXRlcm1vc3QoKnRoaXMpLCBfX3AsCisJCQkgICAgICAgYWxsb2NhdG9yX2FyZywgaW5uZXJfYWxsb2NhdG9yKCksCisJCQkgICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkIAorICAgICAgICBfTV9jb25zdHJ1Y3QoX191c2VzX2FsbG9jMl8sIF9UcCogX19wLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgeworCSAgdHlwZWRlZiBfX291dGVybW9zdF9hbGxvY190cmFpdHM8c2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPiBfT190cmFpdHM7CisJICBfT190cmFpdHM6OmNvbnN0cnVjdChfX291dGVybW9zdCgqdGhpcyksIF9fcCwKKwkJCSAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4sCisJCQkgICAgICAgaW5uZXJfYWxsb2NhdG9yKCkpOworICAgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgICAgc3RhdGljIF9BbGxvYworICAgICAgICBfU19zZWxlY3Rfb25fY29weShjb25zdCBfQWxsb2MmIF9fYSkKKyAgICAgICAgeworICAgICAgICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+IF9fYV90cmFpdHM7CisgICAgICAgICAgcmV0dXJuIF9fYV90cmFpdHM6OnNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oX19hKTsKKyAgICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdC4uLiBfSW5kaWNlcz4KKyAgICAgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yKHR1cGxlPGNvbnN0IF9PdXRlckFsbG9jJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Jbm5lckFsbG9jcyYuLi4+IF9fcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbmRleF90dXBsZTxfSW5kaWNlcy4uLj4pCisgICAgICAgIDogX091dGVyQWxsb2MoX1Nfc2VsZWN0X29uX2NvcHkoc3RkOjpnZXQ8MD4oX19yZWZzKSkpLAorICAgICAgICAgIF9NX2lubmVyKF9TX3NlbGVjdF9vbl9jb3B5KHN0ZDo6Z2V0PF9JbmRpY2VzKzE+KF9fcmVmcykpLi4uKQorICAgICAgICB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX091dGVyQWxsb2MgICAgICAgICAgICAgICAgICAgICAgIG91dGVyX2FsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lubmVyX3R5cGU6Ol9fdHlwZSAgICAgaW5uZXJfYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHM6OnZhbHVlX3R5cGUgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHM6OnNpemVfdHlwZSAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0czo6ZGlmZmVyZW5jZV90eXBlICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzOjpwb2ludGVyICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzOjpjb25zdF9wb2ludGVyICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzOjp2b2lkX3BvaW50ZXIgICAgICAgICAgIHZvaWRfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHM6OmNvbnN0X3ZvaWRfcG9pbnRlciAgICAgY29uc3Rfdm9pZF9wb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPAorICAgICAgICBfX2FueV9vZjxfX3Byb3BhZ2F0ZV9vbl9jb3B5LCBfT3V0ZXJBbGxvYywgX0lubmVyQWxsb2NzLi4uPjo6dmFsdWUsCisgICAgICAgIHRydWVfdHlwZSwgZmFsc2VfdHlwZT46OnR5cGUgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9jb3B5X2Fzc2lnbm1lbnQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPAorICAgICAgICBfX2FueV9vZjxfX3Byb3BhZ2F0ZV9vbl9tb3ZlLCBfT3V0ZXJBbGxvYywgX0lubmVyQWxsb2NzLi4uPjo6dmFsdWUsCisgICAgICAgIHRydWVfdHlwZSwgZmFsc2VfdHlwZT46OnR5cGUgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPAorICAgICAgICBfX2FueV9vZjxfX3Byb3BhZ2F0ZV9vbl9zd2FwLCBfT3V0ZXJBbGxvYywgX0lubmVyQWxsb2NzLi4uPjo6dmFsdWUsCisgICAgICAgIHRydWVfdHlwZSwgZmFsc2VfdHlwZT46OnR5cGUgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwOworCisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgICAgICBzdHJ1Y3QgcmViaW5kCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlZGVmIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjwKKyAgICAgICAgICAgIHR5cGVuYW1lIF9fdHJhaXRzOjp0ZW1wbGF0ZSByZWJpbmRfYWxsb2M8X1RwPiwKKyAgICAgICAgICAgIF9Jbm5lckFsbG9jcy4uLj4gb3RoZXI7CisgICAgICAgIH07CisKKyAgICAgIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcigpIDogX091dGVyQWxsb2MoKSwgX01faW5uZXIoKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX091dGVyMj4KKyAgICAgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yKF9PdXRlcjImJiBfX291dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0lubmVyQWxsb2NzJi4uLiBfX2lubmVyKQorICAgICAgICA6IF9PdXRlckFsbG9jKHN0ZDo6Zm9yd2FyZDxfT3V0ZXIyPihfX291dGVyKSksCisgICAgICAgICAgX01faW5uZXIoX19pbm5lci4uLikKKyAgICAgICAgeyB9CisKKyAgICAgIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcihjb25zdCBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3ImIF9fb3RoZXIpCisgICAgICA6IF9PdXRlckFsbG9jKF9fb3RoZXIub3V0ZXJfYWxsb2NhdG9yKCkpLAorCV9NX2lubmVyKF9fb3RoZXIuX01faW5uZXIpCisgICAgICB7IH0KKworICAgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yKHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvciYmIF9fb3RoZXIpCisgICAgICA6IF9PdXRlckFsbG9jKHN0ZDo6bW92ZShfX290aGVyLm91dGVyX2FsbG9jYXRvcigpKSksCisJX01faW5uZXIoc3RkOjptb3ZlKF9fb3RoZXIuX01faW5uZXIpKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRlcjI+CisgICAgICAgIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcigKKyAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxfT3V0ZXIyLCBfSW5uZXJBbGxvY3MuLi4+JiBfX290aGVyKQorICAgICAgICA6IF9PdXRlckFsbG9jKF9fb3RoZXIub3V0ZXJfYWxsb2NhdG9yKCkpLAorICAgICAgICAgIF9NX2lubmVyKF9fb3RoZXIuX01faW5uZXIpCisgICAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0ZXIyPgorICAgICAgICBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3IoCisgICAgICAgICAgICBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I8X091dGVyMiwgX0lubmVyQWxsb2NzLi4uPiYmIF9fb3RoZXIpCisgICAgICAgIDogX091dGVyQWxsb2Moc3RkOjptb3ZlKF9fb3RoZXIub3V0ZXJfYWxsb2NhdG9yKCkpKSwKKyAgICAgICAgICBfTV9pbm5lcihzdGQ6Om1vdmUoX19vdGhlci5fTV9pbm5lcikpCisgICAgICAgIHsgfQorCisgICAgICBpbm5lcl9hbGxvY2F0b3JfdHlwZSYgaW5uZXJfYWxsb2NhdG9yKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2lubmVyLl9NX2dldCh0aGlzKTsgfQorCisgICAgICBjb25zdCBpbm5lcl9hbGxvY2F0b3JfdHlwZSYgaW5uZXJfYWxsb2NhdG9yKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2lubmVyLl9NX2dldCh0aGlzKTsgfQorCisgICAgICBvdXRlcl9hbGxvY2F0b3JfdHlwZSYgb3V0ZXJfYWxsb2NhdG9yKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9PdXRlckFsbG9jJj4oKnRoaXMpOyB9CisKKyAgICAgIGNvbnN0IG91dGVyX2FsbG9jYXRvcl90eXBlJiBvdXRlcl9hbGxvY2F0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX091dGVyQWxsb2MmPigqdGhpcyk7IH0KKworICAgICAgcG9pbnRlciBhbGxvY2F0ZShzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gX190cmFpdHM6OmFsbG9jYXRlKG91dGVyX2FsbG9jYXRvcigpLCBfX24pOyB9CisKKyAgICAgIHBvaW50ZXIgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Rfdm9pZF9wb2ludGVyIF9faGludCkKKyAgICAgIHsgcmV0dXJuIF9fdHJhaXRzOjphbGxvY2F0ZShvdXRlcl9hbGxvY2F0b3IoKSwgX19uLCBfX2hpbnQpOyB9CisKKyAgICAgIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIF9fdHJhaXRzOjpkZWFsbG9jYXRlKG91dGVyX2FsbG9jYXRvcigpLCBfX3AsIF9fbik7IH0KKworICAgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fdHJhaXRzOjptYXhfc2l6ZShvdXRlcl9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZCBjb25zdHJ1Y3QoX1RwKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7CisgICAgICAgICAgYXV0byYgX19pbm5lciA9IGlubmVyX2FsbG9jYXRvcigpOworICAgICAgICAgIGF1dG8gX191c2VfdGFnCisgICAgICAgICAgICA9IF9fdXNlX2FsbG9jPF9UcCwgaW5uZXJfYWxsb2NhdG9yX3R5cGUsIF9BcmdzLi4uPihfX2lubmVyKTsKKyAgICAgICAgICBfTV9jb25zdHJ1Y3QoX191c2VfdGFnLCBfX3AsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDIsIHR5cGVuYW1lLi4uIF9BcmdzMSwKKwkgICAgICAgdHlwZW5hbWUuLi4gX0FyZ3MyPgorCXZvaWQKKwljb25zdHJ1Y3QocGFpcjxfVDEsIF9UMj4qIF9fcCwgcGllY2V3aXNlX2NvbnN0cnVjdF90LAorCQkgIHR1cGxlPF9BcmdzMS4uLj4gX194LCB0dXBsZTxfQXJnczIuLi4+IF9feSkKKwl7CisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyAyMjAzLiAgd3JvbmcgYXJndW1lbnQgdHlwZXMgZm9yIHBpZWNld2lzZSBjb25zdHJ1Y3Rpb24KKwkgIGF1dG8mIF9faW5uZXIgPSBpbm5lcl9hbGxvY2F0b3IoKTsKKwkgIGF1dG8gX194X3VzZV90YWcKKwkgICAgPSBfX3VzZV9hbGxvYzxfVDEsIGlubmVyX2FsbG9jYXRvcl90eXBlLCBfQXJnczEuLi4+KF9faW5uZXIpOworCSAgYXV0byBfX3lfdXNlX3RhZworCSAgICA9IF9fdXNlX2FsbG9jPF9UMiwgaW5uZXJfYWxsb2NhdG9yX3R5cGUsIF9BcmdzMi4uLj4oX19pbm5lcik7CisJICB0eXBlZGVmIF9fb3V0ZXJtb3N0X2FsbG9jX3RyYWl0czxzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I+IF9PX3RyYWl0czsKKwkgIF9PX3RyYWl0czo6Y29uc3RydWN0KF9fb3V0ZXJtb3N0KCp0aGlzKSwgX19wLCBwaWVjZXdpc2VfY29uc3RydWN0LAorCQkJICAgICAgIF9NX2NvbnN0cnVjdF9wKF9feF91c2VfdGFnLCBfX3gpLAorCQkJICAgICAgIF9NX2NvbnN0cnVjdF9wKF9feV91c2VfdGFnLCBfX3kpKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorCXZvaWQKKwljb25zdHJ1Y3QocGFpcjxfVDEsIF9UMj4qIF9fcCkKKwl7IGNvbnN0cnVjdChfX3AsIHBpZWNld2lzZV9jb25zdHJ1Y3QsIHR1cGxlPD4oKSwgdHVwbGU8PigpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMiwgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfVnA+CisJdm9pZAorCWNvbnN0cnVjdChwYWlyPF9UMSwgX1QyPiogX19wLCBfVXAmJiBfX3UsIF9WcCYmIF9fdikKKwl7CisJICBjb25zdHJ1Y3QoX19wLCBwaWVjZXdpc2VfY29uc3RydWN0LAorCQkgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2FyZDxfVXA+KF9fdSkpLAorCQkgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2FyZDxfVnA+KF9fdikpKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyLCB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9WcD4KKwl2b2lkCisJY29uc3RydWN0KHBhaXI8X1QxLCBfVDI+KiBfX3AsIGNvbnN0IHBhaXI8X1VwLCBfVnA+JiBfX3gpCisJeworCSAgY29uc3RydWN0KF9fcCwgcGllY2V3aXNlX2NvbnN0cnVjdCwKKwkJICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShfX3guZmlyc3QpLAorCQkgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKF9feC5zZWNvbmQpKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyLCB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9WcD4KKwl2b2lkCisJY29uc3RydWN0KHBhaXI8X1QxLCBfVDI+KiBfX3AsIHBhaXI8X1VwLCBfVnA+JiYgX194KQorCXsKKwkgIGNvbnN0cnVjdChfX3AsIHBpZWNld2lzZV9jb25zdHJ1Y3QsCisJCSAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RkOjpmb3J3YXJkPF9VcD4oX194LmZpcnN0KSksCisJCSAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RkOjpmb3J3YXJkPF9WcD4oX194LnNlY29uZCkpKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgdm9pZCBkZXN0cm95KF9UcCogX19wKQorICAgICAgICB7CisJICB0eXBlZGVmIF9fb3V0ZXJtb3N0X2FsbG9jX3RyYWl0czxzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I+IF9PX3RyYWl0czsKKwkgIF9PX3RyYWl0czo6ZGVzdHJveShfX291dGVybW9zdCgqdGhpcyksIF9fcCk7CisJfQorCisgICAgICBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3IKKyAgICAgIHNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oKSBjb25zdAorICAgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CdWlsZF9pbmRleF90dXBsZTxzaXplb2YuLi4oX0lubmVyQWxsb2NzKT46Ol9fdHlwZQorCSAgICBfSW5kaWNlczsKKyAgICAgICAgcmV0dXJuIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcihfTV90aWUoKSwgX0luZGljZXMoKSk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfT3V0QTEsIHR5cGVuYW1lIF9PdXRBMiwgdHlwZW5hbWUuLi4gX0luQT4KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxfT3V0QTEsIF9JbkEuLi4+JiBfX2EsCisgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxfT3V0QTIsIF9JbkEuLi4+JiBfX2IpIG5vZXhjZXB0OworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UdXBsZT4KKwlfVHVwbGUmJgorCV9NX2NvbnN0cnVjdF9wKF9fdXNlc19hbGxvYzAsIF9UdXBsZSYgX190KQorCXsgcmV0dXJuIHN0ZDo6bW92ZShfX3QpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0ZDo6dHVwbGU8YWxsb2NhdG9yX2FyZ190LCBpbm5lcl9hbGxvY2F0b3JfdHlwZSYsIF9BcmdzLi4uPgorCV9NX2NvbnN0cnVjdF9wKF9fdXNlc19hbGxvYzFfLCBzdGQ6OnR1cGxlPF9BcmdzLi4uPiYgX190KQorCXsKKwkgIHR5cGVkZWYgc3RkOjp0dXBsZTxhbGxvY2F0b3JfYXJnX3QsIGlubmVyX2FsbG9jYXRvcl90eXBlJj4gX1R1cGxlOworCSAgcmV0dXJuIHN0ZDo6dHVwbGVfY2F0KF9UdXBsZShhbGxvY2F0b3JfYXJnLCBpbm5lcl9hbGxvY2F0b3IoKSksCisJCQkJc3RkOjptb3ZlKF9fdCkpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RkOjp0dXBsZTxfQXJncy4uLiwgaW5uZXJfYWxsb2NhdG9yX3R5cGUmPgorCV9NX2NvbnN0cnVjdF9wKF9fdXNlc19hbGxvYzJfLCBzdGQ6OnR1cGxlPF9BcmdzLi4uPiYgX190KQorCXsKKwkgIHR5cGVkZWYgc3RkOjp0dXBsZTxpbm5lcl9hbGxvY2F0b3JfdHlwZSY+IF9UdXBsZTsKKwkgIHJldHVybiBzdGQ6OnR1cGxlX2NhdChzdGQ6Om1vdmUoX190KSwgX1R1cGxlKGlubmVyX2FsbG9jYXRvcigpKSk7CisJfQorICAgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9PdXRBMSwgdHlwZW5hbWUgX091dEEyLCB0eXBlbmFtZS4uLiBfSW5BPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I8X091dEExLCBfSW5BLi4uPiYgX19hLAorICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPF9PdXRBMiwgX0luQS4uLj4mIF9fYikgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gX19hLm91dGVyX2FsbG9jYXRvcigpID09IF9fYi5vdXRlcl9hbGxvY2F0b3IoKQorICAgICAgICAgICYmIF9fYS5fTV9pbm5lciA9PSBfX2IuX01faW5uZXI7CisgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfT3V0QTEsIHR5cGVuYW1lIF9PdXRBMiwgdHlwZW5hbWUuLi4gX0luQT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPF9PdXRBMSwgX0luQS4uLj4mIF9fYSwKKyAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxfT3V0QTIsIF9JbkEuLi4+JiBfX2IpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIShfX2EgPT0gX19iKTsgfQorCisgIC8vLyBAfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX1NDT1BFRF9BTExPQ0FUT1IKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc2V0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlNDY0NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc2V0CkBAIC0wLDAgKzEsNzMgQEAKKy8vIDxzZXQ+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL3NldAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9TRVQKKyNkZWZpbmUgX0dMSUJDWFhfU0VUIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9zdGxfdHJlZS5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3NldC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX211bHRpc2V0Lmg+CisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGluY2x1ZGUgPGRlYnVnL3NldD4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfUFJPRklMRQorIyBpbmNsdWRlIDxwcm9maWxlL3NldD4KKyNlbmRpZgorCisjZW5kaWYgLyogX0dMSUJDWFhfU0VUICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3NzdHJlYW0gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3NzdHJlYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxZmQ0NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc3N0cmVhbQpAQCAtMCwwICsxLDYwMiBAQAorLy8gU3RyaW5nIGJhc2VkIHN0cmVhbXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvc3N0cmVhbQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjcgIFN0cmluZy1iYXNlZCBzdHJlYW1zCisvLworCisjaWZuZGVmIF9HTElCQ1hYX1NTVFJFQU0KKyNkZWZpbmUgX0dMSUJDWFhfU1NUUkVBTSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGlzdHJlYW0+CisjaW5jbHVkZSA8b3N0cmVhbT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFsyNy43LjFdIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3N0cmluZ2J1ZgorICAvKioKKyAgICogIEBicmllZiAgVGhlIGFjdHVhbCB3b3JrIG9mIGlucHV0IGFuZCBvdXRwdXQgKGZvciBzdGQ6OnN0cmluZykuCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgQHRwYXJhbSBfQ2hhclQgIFR5cGUgb2YgY2hhcmFjdGVyIHN0cmVhbS4KKyAgICogIEB0cGFyYW0gX1RyYWl0cyAgVHJhaXRzIGZvciBjaGFyYWN0ZXIgdHlwZSwgZGVmYXVsdHMgdG8KKyAgICogICAgICAgICAgICAgICAgICAgY2hhcl90cmFpdHM8X0NoYXJUPi4KKyAgICogIEB0cGFyYW0gX0FsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gYWxsb2NhdG9yPF9DaGFyVD4uCisgICAqCisgICAqICBUaGlzIGNsYXNzIGFzc29jaWF0ZXMgZWl0aGVyIG9yIGJvdGggb2YgaXRzIGlucHV0IGFuZCBvdXRwdXQgc2VxdWVuY2VzCisgICAqICB3aXRoIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycywgd2hpY2ggY2FuIGJlIGluaXRpYWxpemVkIGZyb20sIG9yIG1hZGUKKyAgICogIGF2YWlsYWJsZSBhcywgYSBAYyBzdGQ6OmJhc2ljX3N0cmluZy4gIChQYXJhcGhyYXNlZCBmcm9tIFsyNy43LjFdLzEuKQorICAgKgorICAgKiAgRm9yIHRoaXMgY2xhc3MsIG9wZW4gbW9kZXMgKG9mIHR5cGUgQGMgaW9zX2Jhc2U6Om9wZW5tb2RlKSBoYXZlCisgICAqICBAYyBpbiBzZXQgaWYgdGhlIGlucHV0IHNlcXVlbmNlIGNhbiBiZSByZWFkLCBhbmQgQGMgb3V0IHNldCBpZiB0aGUKKyAgICogIG91dHB1dCBzZXF1ZW5jZSBjYW4gYmUgd3JpdHRlbi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYmFzaWNfc3RyaW5nYnVmIDogcHVibGljIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQgCQkJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMgCQkJCQl0cmFpdHNfdHlwZTsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDI1MS4gYmFzaWNfc3RyaW5nYnVmIG1pc3NpbmcgYWxsb2NhdG9yX3R5cGUKKyAgICAgIHR5cGVkZWYgX0FsbG9jCQkJCSAgICAgICAJYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAJCWludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIAkJb2ZmX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+ICAJX19zdHJlYW1idWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgX1RyYWl0cywgX0FsbG9jPiAJX19zdHJpbmdfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zdHJpbmdfdHlwZTo6c2l6ZV90eXBlCQlfX3NpemVfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBQbGFjZSB0byBzdGFzaCBpbiB8fCBvdXQgfHwgaW4gfCBvdXQgc2V0dGluZ3MgZm9yIGN1cnJlbnQgc3RyaW5nYnVmLgorICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIAlfTV9tb2RlOworCisgICAgICAvLyBEYXRhIE1lbWJlcnM6CisgICAgICBfX3N0cmluZ190eXBlIAkJX01fc3RyaW5nOworCisgICAgcHVibGljOgorICAgICAgLy8gQ29uc3RydWN0b3JzOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdGFydHMgd2l0aCBhbiBlbXB0eSBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBXaGV0aGVyIHRoZSBidWZmZXIgY2FuIHJlYWQsIG9yIHdyaXRlLCBvciBib3RoLgorICAgICAgICoKKyAgICAgICAqICBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgcGFyZW50IGNsYXNzIHVzaW5nIGl0cworICAgICAgICogIG93biBkZWZhdWx0IGN0b3IuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX3N0cmluZ2J1Zihpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgICAgIDogX19zdHJlYW1idWZfdHlwZSgpLCBfTV9tb2RlKF9fbW9kZSksIF9NX3N0cmluZygpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdGFydHMgd2l0aCBhbiBleGlzdGluZyBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIEEgc3RyaW5nIHRvIGNvcHkgYXMgYSBzdGFydGluZyBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgIFdoZXRoZXIgdGhlIGJ1ZmZlciBjYW4gcmVhZCwgb3Igd3JpdGUsIG9yIGJvdGguCisgICAgICAgKgorICAgICAgICogIFRoaXMgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdGhlIHBhcmVudCBjbGFzcyB1c2luZyBpdHMKKyAgICAgICAqICBvd24gZGVmYXVsdCBjdG9yLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19zdHJpbmdidWYoY29uc3QgX19zdHJpbmdfdHlwZSYgX19zdHIsCisJCSAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KQorICAgICAgOiBfX3N0cmVhbWJ1Zl90eXBlKCksIF9NX21vZGUoKSwgX01fc3RyaW5nKF9fc3RyLmRhdGEoKSwgX19zdHIuc2l6ZSgpKQorICAgICAgeyBfTV9zdHJpbmdidWZfaW5pdChfX21vZGUpOyB9CisKKyAgICAgIC8vIEdldCBhbmQgc2V0OgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb3B5aW5nIG91dCB0aGUgc3RyaW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICBBIGNvcHkgb2Ygb25lIG9mIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlcy4KKyAgICAgICAqCisgICAgICAgKiAgPGVtPklmIHRoZSBidWZmZXIgaXMgb25seSBjcmVhdGVkIGluIGlucHV0IG1vZGUsIHRoZSB1bmRlcmx5aW5nCisgICAgICAgKiAgY2hhcmFjdGVyIHNlcXVlbmNlIGlzIGVxdWFsIHRvIHRoZSBpbnB1dCBzZXF1ZW5jZTsgb3RoZXJ3aXNlLCBpdAorICAgICAgICogIGlzIGVxdWFsIHRvIHRoZSBvdXRwdXQgc2VxdWVuY2UuPC9lbT4gWzI3LjcuMS4yXS8xCisgICAgICAqLworICAgICAgX19zdHJpbmdfdHlwZQorICAgICAgc3RyKCkgY29uc3QKKyAgICAgIHsKKwlfX3N0cmluZ190eXBlIF9fcmV0OworCWlmICh0aGlzLT5wcHRyKCkpCisJICB7CisJICAgIC8vIFRoZSBjdXJyZW50IGVncHRyKCkgbWF5IG5vdCBiZSB0aGUgYWN0dWFsIHN0cmluZyBlbmQuCisJICAgIGlmICh0aGlzLT5wcHRyKCkgPiB0aGlzLT5lZ3B0cigpKQorCSAgICAgIF9fcmV0ID0gX19zdHJpbmdfdHlwZSh0aGlzLT5wYmFzZSgpLCB0aGlzLT5wcHRyKCkpOworCSAgICBlbHNlCisgCSAgICAgIF9fcmV0ID0gX19zdHJpbmdfdHlwZSh0aGlzLT5wYmFzZSgpLCB0aGlzLT5lZ3B0cigpKTsKKwkgIH0KKwllbHNlCisJICBfX3JldCA9IF9NX3N0cmluZzsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0dGluZyBhIG5ldyBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBzdHJpbmcgdG8gdXNlIGFzIGEgbmV3IHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqICBEZWFsbG9jYXRlcyBhbnkgcHJldmlvdXMgc3RvcmVkIHNlcXVlbmNlLCB0aGVuIGNvcGllcyBAYSBzIHRvCisgICAgICAgKiAgdXNlIGFzIGEgbmV3IG9uZS4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBzdHIoY29uc3QgX19zdHJpbmdfdHlwZSYgX19zKQorICAgICAgeworCS8vIENhbm5vdCB1c2UgX01fc3RyaW5nID0gX19zLCBzaW5jZSB2MyBzdHJpbmdzIGFyZSBDT1cuCisJX01fc3RyaW5nLmFzc2lnbihfX3MuZGF0YSgpLCBfX3Muc2l6ZSgpKTsKKwlfTV9zdHJpbmdidWZfaW5pdChfTV9tb2RlKTsKKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIENvbW1vbiBpbml0aWFsaXphdGlvbiBjb2RlIGdvZXMgaGVyZS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX3N0cmluZ2J1Zl9pbml0KGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgICB7CisJX01fbW9kZSA9IF9fbW9kZTsKKwlfX3NpemVfdHlwZSBfX2xlbiA9IDA7CisJaWYgKF9NX21vZGUgJiAoaW9zX2Jhc2U6OmF0ZSB8IGlvc19iYXNlOjphcHApKQorCSAgX19sZW4gPSBfTV9zdHJpbmcuc2l6ZSgpOworCV9NX3N5bmMoY29uc3RfY2FzdDxjaGFyX3R5cGUqPihfTV9zdHJpbmcuZGF0YSgpKSwgMCwgX19sZW4pOworICAgICAgfQorCisgICAgICB2aXJ0dWFsIHN0cmVhbXNpemUKKyAgICAgIHNob3dtYW55YygpCisgICAgICB7IAorCXN0cmVhbXNpemUgX19yZXQgPSAtMTsKKwlpZiAoX01fbW9kZSAmIGlvc19iYXNlOjppbikKKwkgIHsKKwkgICAgX01fdXBkYXRlX2VncHRyKCk7CisJICAgIF9fcmV0ID0gdGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKTsKKwkgIH0KKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgaW50X3R5cGUKKyAgICAgIHVuZGVyZmxvdygpOworCisgICAgICB2aXJ0dWFsIGludF90eXBlCisgICAgICBwYmFja2ZhaWwoaW50X3R5cGUgX19jID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKworICAgICAgdmlydHVhbCBpbnRfdHlwZQorICAgICAgb3ZlcmZsb3coaW50X3R5cGUgX19jID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNYW5pcHVsYXRlcyB0aGUgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19zICBQb2ludGVyIHRvIGEgYnVmZmVyIGFyZWEuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFNpemUgb2YgQGEgX19zLgorICAgICAgICogIEByZXR1cm4gIEBjIHRoaXMKKyAgICAgICAqCisgICAgICAgKiAgSWYgbm8gYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgYW5kIGJvdGggQGEgX19zIGFuZCBAYSBfX24gYXJlCisgICAgICAgKiAgbm9uLXplcm8sIHRoZW4gQGMgX19zIGlzIHVzZWQgYXMgYSBidWZmZXI7IHNlZQorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTFjaDI1czAyLmh0bWwKKyAgICAgICAqICBmb3IgbW9yZS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIF9fc3RyZWFtYnVmX3R5cGUqCisgICAgICBzZXRidWYoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgICAgeworCWlmIChfX3MgJiYgX19uID49IDApCisJICB7CisJICAgIC8vIFRoaXMgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBiZWhhdmlvciwgYW5kIGFzc3VtZXMKKwkgICAgLy8gdGhhdCBhbiBleHRlcm5hbCBjaGFyX3R5cGUgYXJyYXkgb2YgbGVuZ3RoIF9fbiBleGlzdHMKKwkgICAgLy8gYW5kIGhhcyBiZWVuIHByZS1hbGxvY2F0ZWQuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLAorCSAgICAvLyB0aGluZ3Mgd2lsbCBxdWlja2x5IGJsb3cgdXAuCisJICAgIAorCSAgICAvLyBTdGVwIDE6IERlc3Ryb3kgdGhlIGN1cnJlbnQgaW50ZXJuYWwgYXJyYXkuCisJICAgIF9NX3N0cmluZy5jbGVhcigpOworCSAgICAKKwkgICAgLy8gU3RlcCAyOiBVc2UgdGhlIGV4dGVybmFsIGFycmF5LgorCSAgICBfTV9zeW5jKF9fcywgX19uLCAwKTsKKwkgIH0KKwlyZXR1cm4gdGhpczsKKyAgICAgIH0KKworICAgICAgdmlydHVhbCBwb3NfdHlwZQorICAgICAgc2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksCisJICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworCisgICAgICB2aXJ0dWFsIHBvc190eXBlCisgICAgICBzZWVrcG9zKHBvc190eXBlIF9fc3AsCisJICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworCisgICAgICAvLyBJbnRlcm5hbCBmdW5jdGlvbiBmb3IgY29ycmVjdGx5IHVwZGF0aW5nIHRoZSBpbnRlcm5hbCBidWZmZXIKKyAgICAgIC8vIGZvciBhIHBhcnRpY3VsYXIgX01fc3RyaW5nLCBkdWUgdG8gaW5pdGlhbGl6YXRpb24gb3IgcmUtc2l6aW5nCisgICAgICAvLyBvZiBhbiBleGlzdGluZyBfTV9zdHJpbmcuCisgICAgICB2b2lkCisgICAgICBfTV9zeW5jKGNoYXJfdHlwZSogX19iYXNlLCBfX3NpemVfdHlwZSBfX2ksIF9fc2l6ZV90eXBlIF9fbyk7CisKKyAgICAgIC8vIEludGVybmFsIGZ1bmN0aW9uIGZvciBjb3JyZWN0bHkgdXBkYXRpbmcgZWdwdHIoKSB0byB0aGUgYWN0dWFsCisgICAgICAvLyBzdHJpbmcgZW5kLgorICAgICAgdm9pZAorICAgICAgX01fdXBkYXRlX2VncHRyKCkKKyAgICAgIHsKKwljb25zdCBib29sIF9fdGVzdGluID0gX01fbW9kZSAmIGlvc19iYXNlOjppbjsKKwlpZiAodGhpcy0+cHB0cigpICYmIHRoaXMtPnBwdHIoKSA+IHRoaXMtPmVncHRyKCkpCisJICB7CisJICAgIGlmIChfX3Rlc3RpbikKKwkgICAgICB0aGlzLT5zZXRnKHRoaXMtPmViYWNrKCksIHRoaXMtPmdwdHIoKSwgdGhpcy0+cHB0cigpKTsKKwkgICAgZWxzZQorCSAgICAgIHRoaXMtPnNldGcodGhpcy0+cHB0cigpLCB0aGlzLT5wcHRyKCksIHRoaXMtPnBwdHIoKSk7CisJICB9CisgICAgICB9CisKKyAgICAgIC8vIFdvcmtzIGFyb3VuZCB0aGUgaXNzdWUgd2l0aCBwYnVtcCwgcGFydCBvZiB0aGUgcHJvdGVjdGVkCisgICAgICAvLyBpbnRlcmZhY2Ugb2YgYmFzaWNfc3RyZWFtYnVmLCB0YWtpbmcganVzdCBhbiBpbnQuCisgICAgICB2b2lkCisgICAgICBfTV9wYnVtcChjaGFyX3R5cGUqIF9fcGJlZywgY2hhcl90eXBlKiBfX3BlbmQsIG9mZl90eXBlIF9fb2ZmKTsKKyAgICB9OworCisKKyAgLy8gWzI3LjcuMl0gVGVtcGxhdGUgY2xhc3MgYmFzaWNfaXN0cmluZ3N0cmVhbQorICAvKioKKyAgICogIEBicmllZiAgQ29udHJvbGxpbmcgaW5wdXQgZm9yIHN0ZDo6c3RyaW5nLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIEB0cGFyYW0gX0NoYXJUICBUeXBlIG9mIGNoYXJhY3RlciBzdHJlYW0uCisgICAqICBAdHBhcmFtIF9UcmFpdHMgIFRyYWl0cyBmb3IgY2hhcmFjdGVyIHR5cGUsIGRlZmF1bHRzIHRvCisgICAqICAgICAgICAgICAgICAgICAgIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisgICAqICBAdHBhcmFtIF9BbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxfQ2hhclQ+LgorICAgKgorICAgKiAgVGhpcyBjbGFzcyBzdXBwb3J0cyByZWFkaW5nIGZyb20gb2JqZWN0cyBvZiB0eXBlIHN0ZDo6YmFzaWNfc3RyaW5nLAorICAgKiAgdXNpbmcgdGhlIGluaGVyaXRlZCBmdW5jdGlvbnMgZnJvbSBzdGQ6OmJhc2ljX2lzdHJlYW0uICBUbyBjb250cm9sCisgICAqICB0aGUgYXNzb2NpYXRlZCBzZXF1ZW5jZSwgYW4gaW5zdGFuY2Ugb2Ygc3RkOjpiYXNpY19zdHJpbmdidWYgaXMgdXNlZCwKKyAgICogIHdoaWNoIHRoaXMgcGFnZSByZWZlcnMgdG8gYXMgQGMgc2IuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIGJhc2ljX2lzdHJpbmdzdHJlYW0gOiBwdWJsaWMgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQgCQkJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMgCQkJCQl0cmFpdHNfdHlwZTsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDI1MS4gYmFzaWNfc3RyaW5nYnVmIG1pc3NpbmcgYWxsb2NhdG9yX3R5cGUKKyAgICAgIHR5cGVkZWYgX0FsbG9jCQkJCSAgICAgICAJYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAJCWludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIAkJb2ZmX3R5cGU7CisKKyAgICAgIC8vIE5vbi1zdGFuZGFyZCB0eXBlczoKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAJX19zdHJpbmdfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAJX19zdHJpbmdidWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPglfX2lzdHJlYW1fdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICBfX3N0cmluZ2J1Zl90eXBlCV9NX3N0cmluZ2J1ZjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENvbnN0cnVjdG9yczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBzdGFydHMgd2l0aCBhbiBlbXB0eSBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBXaGV0aGVyIHRoZSBidWZmZXIgY2FuIHJlYWQsIG9yIHdyaXRlLCBvciBib3RoLgorICAgICAgICoKKyAgICAgICAqICBAYyBpb3NfYmFzZTo6aW4gaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbiBAYSBfX21vZGUuCisgICAgICAgKgorICAgICAgICogIEluaXRpYWxpemVzIEBjIHNiIHVzaW5nIEBjIF9fbW9kZXxpbiwgYW5kIHBhc3NlcyBAYyAmc2IgdG8gdGhlIGJhc2UKKyAgICAgICAqICBjbGFzcyBpbml0aWFsaXplci4gIERvZXMgbm90IGFsbG9jYXRlIGFueSBidWZmZXIuCisgICAgICAgKgorICAgICAgICogIFRoYXQncyBhIGxpZS4gIFdlIGluaXRpYWxpemUgdGhlIGJhc2UgY2xhc3Mgd2l0aCBOVUxMLCBiZWNhdXNlIHRoZQorICAgICAgICogIHN0cmluZyBjbGFzcyBkb2VzIGl0cyBvd24gbWVtb3J5IG1hbmFnZW1lbnQuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX2lzdHJpbmdzdHJlYW0oaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbikKKyAgICAgIDogX19pc3RyZWFtX3R5cGUoKSwgX01fc3RyaW5nYnVmKF9fbW9kZSB8IGlvc19iYXNlOjppbikKKyAgICAgIHsgdGhpcy0+aW5pdCgmX01fc3RyaW5nYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN0YXJ0cyB3aXRoIGFuIGV4aXN0aW5nIHN0cmluZyBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgQSBzdHJpbmcgdG8gY29weSBhcyBhIHN0YXJ0aW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgV2hldGhlciB0aGUgYnVmZmVyIGNhbiByZWFkLCBvciB3cml0ZSwgb3IgYm90aC4KKyAgICAgICAqCisgICAgICAgKiAgQGMgaW9zX2Jhc2U6OmluIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gQGEgbW9kZS4KKyAgICAgICAqCisgICAgICAgKiAgSW5pdGlhbGl6ZXMgQGMgc2IgdXNpbmcgQGEgc3RyIGFuZCBAYyBtb2RlfGluLCBhbmQgcGFzc2VzIEBjICZzYgorICAgICAgICogIHRvIHRoZSBiYXNlIGNsYXNzIGluaXRpYWxpemVyLgorICAgICAgICoKKyAgICAgICAqICBUaGF0J3MgYSBsaWUuICBXZSBpbml0aWFsaXplIHRoZSBiYXNlIGNsYXNzIHdpdGggTlVMTCwgYmVjYXVzZSB0aGUKKyAgICAgICAqICBzdHJpbmcgY2xhc3MgZG9lcyBpdHMgb3duIG1lbW9yeSBtYW5hZ2VtZW50LgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19pc3RyaW5nc3RyZWFtKGNvbnN0IF9fc3RyaW5nX3R5cGUmIF9fc3RyLAorCQkJICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluKQorICAgICAgOiBfX2lzdHJlYW1fdHlwZSgpLCBfTV9zdHJpbmdidWYoX19zdHIsIF9fbW9kZSB8IGlvc19iYXNlOjppbikKKyAgICAgIHsgdGhpcy0+aW5pdCgmX01fc3RyaW5nYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGJ1ZmZlciBpcyBkZWFsbG9jYXRlZCBieSB0aGUgc3RyaW5nYnVmIG9iamVjdCwgbm90IHRoZQorICAgICAgICogIGZvcm1hdHRpbmcgc3RyZWFtLgorICAgICAgKi8KKyAgICAgIH5iYXNpY19pc3RyaW5nc3RyZWFtKCkKKyAgICAgIHsgfQorCisgICAgICAvLyBNZW1iZXJzOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBY2Nlc3NpbmcgdGhlIHVuZGVybHlpbmcgYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gIFRoZSBjdXJyZW50IGJhc2ljX3N0cmluZ2J1ZiBidWZmZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaGlkZXMgYm90aCBzaWduYXR1cmVzIG9mIHN0ZDo6YmFzaWNfaW9zOjpyZGJ1ZigpLgorICAgICAgKi8KKyAgICAgIF9fc3RyaW5nYnVmX3R5cGUqCisgICAgICByZGJ1ZigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9jYXN0PF9fc3RyaW5nYnVmX3R5cGUqPigmX01fc3RyaW5nYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvcHlpbmcgb3V0IHRoZSBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gIEBjIHJkYnVmKCktPnN0cigpCisgICAgICAqLworICAgICAgX19zdHJpbmdfdHlwZQorICAgICAgc3RyKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3N0cmluZ2J1Zi5zdHIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldHRpbmcgYSBuZXcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgc3RyaW5nIHRvIHVzZSBhcyBhIG5ldyBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgcmRidWYoKS0+c3RyKHMpLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN0cihjb25zdCBfX3N0cmluZ190eXBlJiBfX3MpCisgICAgICB7IF9NX3N0cmluZ2J1Zi5zdHIoX19zKTsgfQorICAgIH07CisKKworICAvLyBbMjcuNy4zXSBUZW1wbGF0ZSBjbGFzcyBiYXNpY19vc3RyaW5nc3RyZWFtCisgIC8qKgorICAgKiAgQGJyaWVmICBDb250cm9sbGluZyBvdXRwdXQgZm9yIHN0ZDo6c3RyaW5nLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIEB0cGFyYW0gX0NoYXJUICBUeXBlIG9mIGNoYXJhY3RlciBzdHJlYW0uCisgICAqICBAdHBhcmFtIF9UcmFpdHMgIFRyYWl0cyBmb3IgY2hhcmFjdGVyIHR5cGUsIGRlZmF1bHRzIHRvCisgICAqICAgICAgICAgICAgICAgICAgIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisgICAqICBAdHBhcmFtIF9BbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxfQ2hhclQ+LgorICAgKgorICAgKiAgVGhpcyBjbGFzcyBzdXBwb3J0cyB3cml0aW5nIHRvIG9iamVjdHMgb2YgdHlwZSBzdGQ6OmJhc2ljX3N0cmluZywKKyAgICogIHVzaW5nIHRoZSBpbmhlcml0ZWQgZnVuY3Rpb25zIGZyb20gc3RkOjpiYXNpY19vc3RyZWFtLiAgVG8gY29udHJvbAorICAgKiAgdGhlIGFzc29jaWF0ZWQgc2VxdWVuY2UsIGFuIGluc3RhbmNlIG9mIHN0ZDo6YmFzaWNfc3RyaW5nYnVmIGlzIHVzZWQsCisgICAqICB3aGljaCB0aGlzIHBhZ2UgcmVmZXJzIHRvIGFzIEBjIHNiLgorICAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYmFzaWNfb3N0cmluZ3N0cmVhbSA6IHB1YmxpYyBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVCAJCQkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAJCQkJCXRyYWl0c190eXBlOworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjUxLiBiYXNpY19zdHJpbmdidWYgbWlzc2luZyBhbGxvY2F0b3JfdHlwZQorICAgICAgdHlwZWRlZiBfQWxsb2MJCQkJICAgICAgIAlhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIAkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSAJCXBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgCQlvZmZfdHlwZTsKKworICAgICAgLy8gTm9uLXN0YW5kYXJkIHR5cGVzOgorICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IAlfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IAlfX3N0cmluZ2J1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+CV9fb3N0cmVhbV90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9fc3RyaW5nYnVmX3R5cGUJX01fc3RyaW5nYnVmOworCisgICAgcHVibGljOgorICAgICAgLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3I6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3Igc3RhcnRzIHdpdGggYW4gZW1wdHkgc3RyaW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgV2hldGhlciB0aGUgYnVmZmVyIGNhbiByZWFkLCBvciB3cml0ZSwgb3IgYm90aC4KKyAgICAgICAqCisgICAgICAgKiAgQGMgaW9zX2Jhc2U6Om91dCBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIEBhIG1vZGUuCisgICAgICAgKgorICAgICAgICogIEluaXRpYWxpemVzIEBjIHNiIHVzaW5nIEBjIG1vZGV8b3V0LCBhbmQgcGFzc2VzIEBjICZzYiB0byB0aGUgYmFzZQorICAgICAgICogIGNsYXNzIGluaXRpYWxpemVyLiAgRG9lcyBub3QgYWxsb2NhdGUgYW55IGJ1ZmZlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhhdCdzIGEgbGllLiAgV2UgaW5pdGlhbGl6ZSB0aGUgYmFzZSBjbGFzcyB3aXRoIE5VTEwsIGJlY2F1c2UgdGhlCisgICAgICAgKiAgc3RyaW5nIGNsYXNzIGRvZXMgaXRzIG93biBtZW1vcnkgbWFuYWdlbWVudC4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfb3N0cmluZ3N0cmVhbShpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6Om91dCkKKyAgICAgIDogX19vc3RyZWFtX3R5cGUoKSwgX01fc3RyaW5nYnVmKF9fbW9kZSB8IGlvc19iYXNlOjpvdXQpCisgICAgICB7IHRoaXMtPmluaXQoJl9NX3N0cmluZ2J1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdGFydHMgd2l0aCBhbiBleGlzdGluZyBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIEEgc3RyaW5nIHRvIGNvcHkgYXMgYSBzdGFydGluZyBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgIFdoZXRoZXIgdGhlIGJ1ZmZlciBjYW4gcmVhZCwgb3Igd3JpdGUsIG9yIGJvdGguCisgICAgICAgKgorICAgICAgICogIEBjIGlvc19iYXNlOjpvdXQgaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbiBAYSBtb2RlLgorICAgICAgICoKKyAgICAgICAqICBJbml0aWFsaXplcyBAYyBzYiB1c2luZyBAYSBzdHIgYW5kIEBjIG1vZGV8b3V0LCBhbmQgcGFzc2VzIEBjICZzYgorICAgICAgICogIHRvIHRoZSBiYXNlIGNsYXNzIGluaXRpYWxpemVyLgorICAgICAgICoKKyAgICAgICAqICBUaGF0J3MgYSBsaWUuICBXZSBpbml0aWFsaXplIHRoZSBiYXNlIGNsYXNzIHdpdGggTlVMTCwgYmVjYXVzZSB0aGUKKyAgICAgICAqICBzdHJpbmcgY2xhc3MgZG9lcyBpdHMgb3duIG1lbW9yeSBtYW5hZ2VtZW50LgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19vc3RyaW5nc3RyZWFtKGNvbnN0IF9fc3RyaW5nX3R5cGUmIF9fc3RyLAorCQkJICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6Om91dCkKKyAgICAgIDogX19vc3RyZWFtX3R5cGUoKSwgX01fc3RyaW5nYnVmKF9fc3RyLCBfX21vZGUgfCBpb3NfYmFzZTo6b3V0KQorICAgICAgeyB0aGlzLT5pbml0KCZfTV9zdHJpbmdidWYpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlIGRlc3RydWN0b3IgZG9lcyBub3RoaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGUgYnVmZmVyIGlzIGRlYWxsb2NhdGVkIGJ5IHRoZSBzdHJpbmdidWYgb2JqZWN0LCBub3QgdGhlCisgICAgICAgKiAgZm9ybWF0dGluZyBzdHJlYW0uCisgICAgICAqLworICAgICAgfmJhc2ljX29zdHJpbmdzdHJlYW0oKQorICAgICAgeyB9CisKKyAgICAgIC8vIE1lbWJlcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGN1cnJlbnQgYmFzaWNfc3RyaW5nYnVmIGJ1ZmZlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBoaWRlcyBib3RoIHNpZ25hdHVyZXMgb2Ygc3RkOjpiYXNpY19pb3M6OnJkYnVmKCkuCisgICAgICAqLworICAgICAgX19zdHJpbmdidWZfdHlwZSoKKyAgICAgIHJkYnVmKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8X19zdHJpbmdidWZfdHlwZSo+KCZfTV9zdHJpbmdidWYpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29weWluZyBvdXQgdGhlIHN0cmluZyBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgQGMgcmRidWYoKS0+c3RyKCkKKyAgICAgICovCisgICAgICBfX3N0cmluZ190eXBlCisgICAgICBzdHIoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fc3RyaW5nYnVmLnN0cigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0dGluZyBhIG5ldyBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBzdHJpbmcgdG8gdXNlIGFzIGEgbmV3IHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyByZGJ1ZigpLT5zdHIocykuCisgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3RyKGNvbnN0IF9fc3RyaW5nX3R5cGUmIF9fcykKKyAgICAgIHsgX01fc3RyaW5nYnVmLnN0cihfX3MpOyB9CisgICAgfTsKKworCisgIC8vIFsyNy43LjRdIFRlbXBsYXRlIGNsYXNzIGJhc2ljX3N0cmluZ3N0cmVhbQorICAvKioKKyAgICogIEBicmllZiAgQ29udHJvbGxpbmcgaW5wdXQgYW5kIG91dHB1dCBmb3Igc3RkOjpzdHJpbmcuCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgQHRwYXJhbSBfQ2hhclQgIFR5cGUgb2YgY2hhcmFjdGVyIHN0cmVhbS4KKyAgICogIEB0cGFyYW0gX1RyYWl0cyAgVHJhaXRzIGZvciBjaGFyYWN0ZXIgdHlwZSwgZGVmYXVsdHMgdG8KKyAgICogICAgICAgICAgICAgICAgICAgY2hhcl90cmFpdHM8X0NoYXJUPi4KKyAgICogIEB0cGFyYW0gX0FsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gYWxsb2NhdG9yPF9DaGFyVD4uCisgICAqCisgICAqICBUaGlzIGNsYXNzIHN1cHBvcnRzIHJlYWRpbmcgZnJvbSBhbmQgd3JpdGluZyB0byBvYmplY3RzIG9mIHR5cGUKKyAgICogIHN0ZDo6YmFzaWNfc3RyaW5nLCB1c2luZyB0aGUgaW5oZXJpdGVkIGZ1bmN0aW9ucyBmcm9tCisgICAqICBzdGQ6OmJhc2ljX2lvc3RyZWFtLiAgVG8gY29udHJvbCB0aGUgYXNzb2NpYXRlZCBzZXF1ZW5jZSwgYW4gaW5zdGFuY2UKKyAgICogIG9mIHN0ZDo6YmFzaWNfc3RyaW5nYnVmIGlzIHVzZWQsIHdoaWNoIHRoaXMgcGFnZSByZWZlcnMgdG8gYXMgQGMgc2IuCisgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBiYXNpY19zdHJpbmdzdHJlYW0gOiBwdWJsaWMgYmFzaWNfaW9zdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgX0NoYXJUIAkJCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzIAkJCQkJdHJhaXRzX3R5cGU7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNTEuIGJhc2ljX3N0cmluZ2J1ZiBtaXNzaW5nIGFsbG9jYXRvcl90eXBlCisgICAgICB0eXBlZGVmIF9BbGxvYwkJCQkgICAgICAgCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSAJCW9mZl90eXBlOworCisgICAgICAvLyBOb24tc3RhbmRhcmQgVHlwZXM6CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gCV9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gCV9fc3RyaW5nYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX2lvc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+CV9faW9zdHJlYW1fdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICBfX3N0cmluZ2J1Zl90eXBlCV9NX3N0cmluZ2J1ZjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIHN0YXJ0cyB3aXRoIGFuIGVtcHR5IHN0cmluZyBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX20gIFdoZXRoZXIgdGhlIGJ1ZmZlciBjYW4gcmVhZCwgb3Igd3JpdGUsIG9yIGJvdGguCisgICAgICAgKgorICAgICAgICogIEluaXRpYWxpemVzIEBjIHNiIHVzaW5nIHRoZSBtb2RlIGZyb20gQGMgX19tLCBhbmQgcGFzc2VzIEBjCisgICAgICAgKiAgJnNiIHRvIHRoZSBiYXNlIGNsYXNzIGluaXRpYWxpemVyLiAgRG9lcyBub3QgYWxsb2NhdGUgYW55CisgICAgICAgKiAgYnVmZmVyLgorICAgICAgICoKKyAgICAgICAqICBUaGF0J3MgYSBsaWUuICBXZSBpbml0aWFsaXplIHRoZSBiYXNlIGNsYXNzIHdpdGggTlVMTCwgYmVjYXVzZSB0aGUKKyAgICAgICAqICBzdHJpbmcgY2xhc3MgZG9lcyBpdHMgb3duIG1lbW9yeSBtYW5hZ2VtZW50LgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19zdHJpbmdzdHJlYW0oaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbSA9IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6aW4pCisgICAgICA6IF9faW9zdHJlYW1fdHlwZSgpLCBfTV9zdHJpbmdidWYoX19tKQorICAgICAgeyB0aGlzLT5pbml0KCZfTV9zdHJpbmdidWYpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3RhcnRzIHdpdGggYW4gZXhpc3Rpbmcgc3RyaW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBBIHN0cmluZyB0byBjb3B5IGFzIGEgc3RhcnRpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19tICBXaGV0aGVyIHRoZSBidWZmZXIgY2FuIHJlYWQsIG9yIHdyaXRlLCBvciBib3RoLgorICAgICAgICoKKyAgICAgICAqICBJbml0aWFsaXplcyBAYyBzYiB1c2luZyBAYSBfX3N0ciBhbmQgQGMgX19tLCBhbmQgcGFzc2VzIEBjICZzYgorICAgICAgICogIHRvIHRoZSBiYXNlIGNsYXNzIGluaXRpYWxpemVyLgorICAgICAgICoKKyAgICAgICAqICBUaGF0J3MgYSBsaWUuICBXZSBpbml0aWFsaXplIHRoZSBiYXNlIGNsYXNzIHdpdGggTlVMTCwgYmVjYXVzZSB0aGUKKyAgICAgICAqICBzdHJpbmcgY2xhc3MgZG9lcyBpdHMgb3duIG1lbW9yeSBtYW5hZ2VtZW50LgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19zdHJpbmdzdHJlYW0oY29uc3QgX19zdHJpbmdfdHlwZSYgX19zdHIsCisJCQkgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbSA9IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6aW4pCisgICAgICA6IF9faW9zdHJlYW1fdHlwZSgpLCBfTV9zdHJpbmdidWYoX19zdHIsIF9fbSkKKyAgICAgIHsgdGhpcy0+aW5pdCgmX01fc3RyaW5nYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGJ1ZmZlciBpcyBkZWFsbG9jYXRlZCBieSB0aGUgc3RyaW5nYnVmIG9iamVjdCwgbm90IHRoZQorICAgICAgICogIGZvcm1hdHRpbmcgc3RyZWFtLgorICAgICAgKi8KKyAgICAgIH5iYXNpY19zdHJpbmdzdHJlYW0oKQorICAgICAgeyB9CisKKyAgICAgIC8vIE1lbWJlcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGN1cnJlbnQgYmFzaWNfc3RyaW5nYnVmIGJ1ZmZlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBoaWRlcyBib3RoIHNpZ25hdHVyZXMgb2Ygc3RkOjpiYXNpY19pb3M6OnJkYnVmKCkuCisgICAgICAqLworICAgICAgX19zdHJpbmdidWZfdHlwZSoKKyAgICAgIHJkYnVmKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8X19zdHJpbmdidWZfdHlwZSo+KCZfTV9zdHJpbmdidWYpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29weWluZyBvdXQgdGhlIHN0cmluZyBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgQGMgcmRidWYoKS0+c3RyKCkKKyAgICAgICovCisgICAgICBfX3N0cmluZ190eXBlCisgICAgICBzdHIoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fc3RyaW5nYnVmLnN0cigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0dGluZyBhIG5ldyBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBzdHJpbmcgdG8gdXNlIGFzIGEgbmV3IHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyByZGJ1ZigpLT5zdHIocykuCisgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3RyKGNvbnN0IF9fc3RyaW5nX3R5cGUmIF9fcykKKyAgICAgIHsgX01fc3RyaW5nYnVmLnN0cihfX3MpOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaW5jbHVkZSA8Yml0cy9zc3RyZWFtLnRjYz4KKworI2VuZGlmIC8qIF9HTElCQ1hYX1NTVFJFQU0gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc3RhY2sgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3N0YWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MjgyZTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3N0YWNrCkBAIC0wLDAgKzEsNjMgQEAKKy8vIDxzdGFjaz4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvc3RhY2sKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfU1RBQ0sKKyNkZWZpbmUgX0dMSUJDWFhfU1RBQ0sgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxiaXRzL3N0bF9zdGFjay5oPgorCisjZW5kaWYgLyogX0dMSUJDWFhfU1RBQ0sgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc3RkZXhjZXB0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zdGRleGNlcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3MWRkNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc3RkZXhjZXB0CkBAIC0wLDAgKzEsMTU4IEBACisvLyBTdGFuZGFyZCBleGNlcHRpb24gY2xhc3NlcyAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvc3RkZXhjZXB0CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisvLworLy8gSVNPIEMrKyAxOS4xICBFeGNlcHRpb24gY2xhc3NlcworLy8KKworI2lmbmRlZiBfR0xJQkNYWF9TVERFWENFUFQKKyNkZWZpbmUgX0dMSUJDWFhfU1RERVhDRVBUIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBleGNlcHRpb25zCisgICAqIEB7CisgICAqLworCisgIC8qKiBMb2dpYyBlcnJvcnMgcmVwcmVzZW50IHByb2JsZW1zIGluIHRoZSBpbnRlcm5hbCBsb2dpYyBvZiBhIHByb2dyYW07CisgICAqICBpbiB0aGVvcnksIHRoZXNlIGFyZSBwcmV2ZW50YWJsZSwgYW5kIGV2ZW4gZGV0ZWN0YWJsZSBiZWZvcmUgdGhlCisgICAqICBwcm9ncmFtIHJ1bnMgKGUuZy4sIHZpb2xhdGlvbnMgb2YgY2xhc3MgaW52YXJpYW50cykuCisgICAqICBAYnJpZWYgT25lIG9mIHR3byBzdWJjbGFzc2VzIG9mIGV4Y2VwdGlvbi4KKyAgICovCisgIGNsYXNzIGxvZ2ljX2Vycm9yIDogcHVibGljIGV4Y2VwdGlvbiAKKyAgeworICAgIHN0cmluZyBfTV9tc2c7CisKKyAgcHVibGljOgorICAgIC8qKiBUYWtlcyBhIGNoYXJhY3RlciBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IuICAqLworICAgIGV4cGxpY2l0IAorICAgIGxvZ2ljX2Vycm9yKGNvbnN0IHN0cmluZyYgX19hcmcpOworCisgICAgdmlydHVhbCB+bG9naWNfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyAgICAvKiogUmV0dXJucyBhIEMtc3R5bGUgY2hhcmFjdGVyIHN0cmluZyBkZXNjcmliaW5nIHRoZSBnZW5lcmFsIGNhdXNlIG9mCisgICAgICogIHRoZSBjdXJyZW50IGVycm9yICh0aGUgc2FtZSBzdHJpbmcgcGFzc2VkIHRvIHRoZSBjdG9yKS4gICovCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiAKKyAgICB3aGF0KCkgY29uc3QgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworICB9OworCisgIC8qKiBUaHJvd24gYnkgdGhlIGxpYnJhcnksIG9yIGJ5IHlvdSwgdG8gcmVwb3J0IGRvbWFpbiBlcnJvcnMgKGRvbWFpbiBpbgorICAgKiAgdGhlIG1hdGhlbWF0aWNhbCBzZW5zZSkuICAqLworICBjbGFzcyBkb21haW5fZXJyb3IgOiBwdWJsaWMgbG9naWNfZXJyb3IgCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IGRvbWFpbl9lcnJvcihjb25zdCBzdHJpbmcmIF9fYXJnKTsKKyAgICB2aXJ0dWFsIH5kb21haW5fZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisgIH07CisKKyAgLyoqIFRocm93biB0byByZXBvcnQgaW52YWxpZCBhcmd1bWVudHMgdG8gZnVuY3Rpb25zLiAgKi8KKyAgY2xhc3MgaW52YWxpZF9hcmd1bWVudCA6IHB1YmxpYyBsb2dpY19lcnJvciAKKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgaW52YWxpZF9hcmd1bWVudChjb25zdCBzdHJpbmcmIF9fYXJnKTsKKyAgICB2aXJ0dWFsIH5pbnZhbGlkX2FyZ3VtZW50KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworICB9OworCisgIC8qKiBUaHJvd24gd2hlbiBhbiBvYmplY3QgaXMgY29uc3RydWN0ZWQgdGhhdCB3b3VsZCBleGNlZWQgaXRzIG1heGltdW0KKyAgICogIHBlcm1pdHRlZCBzaXplIChlLmcuLCBhIGJhc2ljX3N0cmluZyBpbnN0YW5jZSkuICAqLworICBjbGFzcyBsZW5ndGhfZXJyb3IgOiBwdWJsaWMgbG9naWNfZXJyb3IgCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IGxlbmd0aF9lcnJvcihjb25zdCBzdHJpbmcmIF9fYXJnKTsKKyAgICB2aXJ0dWFsIH5sZW5ndGhfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisgIH07CisKKyAgLyoqIFRoaXMgcmVwcmVzZW50cyBhbiBhcmd1bWVudCB3aG9zZSB2YWx1ZSBpcyBub3Qgd2l0aGluIHRoZSBleHBlY3RlZAorICAgKiAgcmFuZ2UgKGUuZy4sIGJvdW5kYXJ5IGNoZWNrcyBpbiBiYXNpY19zdHJpbmcpLiAgKi8KKyAgY2xhc3Mgb3V0X29mX3JhbmdlIDogcHVibGljIGxvZ2ljX2Vycm9yIAorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBvdXRfb2ZfcmFuZ2UoY29uc3Qgc3RyaW5nJiBfX2FyZyk7CisgICAgdmlydHVhbCB+b3V0X29mX3JhbmdlKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworICB9OworCisgIC8qKiBSdW50aW1lIGVycm9ycyByZXByZXNlbnQgcHJvYmxlbXMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgYSBwcm9ncmFtOworICAgKiAgdGhleSBjYW5ub3QgYmUgZWFzaWx5IHByZWRpY3RlZCBhbmQgY2FuIGdlbmVyYWxseSBvbmx5IGJlIGNhdWdodCBhcworICAgKiAgdGhlIHByb2dyYW0gZXhlY3V0ZXMuCisgICAqICBAYnJpZWYgT25lIG9mIHR3byBzdWJjbGFzc2VzIG9mIGV4Y2VwdGlvbi4KKyAgICovCisgIGNsYXNzIHJ1bnRpbWVfZXJyb3IgOiBwdWJsaWMgZXhjZXB0aW9uIAorICB7CisgICAgc3RyaW5nIF9NX21zZzsKKworICBwdWJsaWM6CisgICAgLyoqIFRha2VzIGEgY2hhcmFjdGVyIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlcnJvci4gICovCisgICAgZXhwbGljaXQgCisgICAgcnVudGltZV9lcnJvcihjb25zdCBzdHJpbmcmIF9fYXJnKTsKKworICAgIHZpcnR1YWwgfnJ1bnRpbWVfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyAgICAvKiogUmV0dXJucyBhIEMtc3R5bGUgY2hhcmFjdGVyIHN0cmluZyBkZXNjcmliaW5nIHRoZSBnZW5lcmFsIGNhdXNlIG9mCisgICAgICogIHRoZSBjdXJyZW50IGVycm9yICh0aGUgc2FtZSBzdHJpbmcgcGFzc2VkIHRvIHRoZSBjdG9yKS4gICovCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiAKKyAgICB3aGF0KCkgY29uc3QgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworICB9OworCisgIC8qKiBUaHJvd24gdG8gaW5kaWNhdGUgcmFuZ2UgZXJyb3JzIGluIGludGVybmFsIGNvbXB1dGF0aW9ucy4gICovCisgIGNsYXNzIHJhbmdlX2Vycm9yIDogcHVibGljIHJ1bnRpbWVfZXJyb3IgCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IHJhbmdlX2Vycm9yKGNvbnN0IHN0cmluZyYgX19hcmcpOworICAgIHZpcnR1YWwgfnJhbmdlX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworICB9OworCisgIC8qKiBUaHJvd24gdG8gaW5kaWNhdGUgYXJpdGhtZXRpYyBvdmVyZmxvdy4gICovCisgIGNsYXNzIG92ZXJmbG93X2Vycm9yIDogcHVibGljIHJ1bnRpbWVfZXJyb3IgCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IG92ZXJmbG93X2Vycm9yKGNvbnN0IHN0cmluZyYgX19hcmcpOworICAgIHZpcnR1YWwgfm92ZXJmbG93X2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworICB9OworCisgIC8qKiBUaHJvd24gdG8gaW5kaWNhdGUgYXJpdGhtZXRpYyB1bmRlcmZsb3cuICAqLworICBjbGFzcyB1bmRlcmZsb3dfZXJyb3IgOiBwdWJsaWMgcnVudGltZV9lcnJvciAKKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgdW5kZXJmbG93X2Vycm9yKGNvbnN0IHN0cmluZyYgX19hcmcpOworICAgIHZpcnR1YWwgfnVuZGVyZmxvd19lcnJvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyAgfTsKKworICAvLyBAfSBncm91cCBleGNlcHRpb25zCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HTElCQ1hYX1NUREVYQ0VQVCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zdHJlYW1idWYgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3N0cmVhbWJ1ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmEzODcxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zdHJlYW1idWYKQEAgLTAsMCArMSw4MzAgQEAKKy8vIFN0cmVhbSBidWZmZXIgY2xhc3NlcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9zdHJlYW1idWYKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy41ICBTdHJlYW0gYnVmZmVycworLy8KKworI2lmbmRlZiBfR0xJQlhYX1NUUkVBTUJVRgorI2RlZmluZSBfR0xJQlhYX1NUUkVBTUJVRiAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGJpdHMvbG9jYWxlZndkLmg+CisjaW5jbHVkZSA8Yml0cy9pb3NfYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RyZWFtc2l6ZQorICAgIF9fY29weV9zdHJlYW1idWZzX2VvZihiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiosCisJCQkgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiwgYm9vbCYpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBUaGUgYWN0dWFsIHdvcmsgb2YgaW5wdXQgYW5kIG91dHB1dCAoaW50ZXJmYWNlKS4KKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBAdHBhcmFtIF9DaGFyVCAgVHlwZSBvZiBjaGFyYWN0ZXIgc3RyZWFtLgorICAgKiAgQHRwYXJhbSBfVHJhaXRzICBUcmFpdHMgZm9yIGNoYXJhY3RlciB0eXBlLCBkZWZhdWx0cyB0bworICAgKiAgICAgICAgICAgICAgICAgICBjaGFyX3RyYWl0czxfQ2hhclQ+LgorICAgKgorICAgKiAgVGhpcyBpcyBhIGJhc2UgY2xhc3MuICBEZXJpdmVkIHN0cmVhbSBidWZmZXJzIGVhY2ggY29udHJvbCBhCisgICAqICBwYWlyIG9mIGNoYXJhY3RlciBzZXF1ZW5jZXM6ICBvbmUgZm9yIGlucHV0LCBhbmQgb25lIGZvciBvdXRwdXQuCisgICAqCisgICAqICBTZWN0aW9uIFsyNy41LjFdIG9mIHRoZSBzdGFuZGFyZCBkZXNjcmliZXMgdGhlIHJlcXVpcmVtZW50cyBhbmQKKyAgICogIGJlaGF2aW9yIG9mIHN0cmVhbSBidWZmZXIgY2xhc3Nlcy4gIFRoYXQgc2VjdGlvbiAodGhyZWUgcGFyYWdyYXBocykKKyAgICogIGlzIHJlcHJvZHVjZWQgaGVyZSwgZm9yIHNpbXBsaWNpdHkgYW5kIGFjY3VyYWN5LgorICAgKgorICAgKiAgLSMgU3RyZWFtIGJ1ZmZlcnMgY2FuIGltcG9zZSB2YXJpb3VzIGNvbnN0cmFpbnRzIG9uIHRoZSBzZXF1ZW5jZXMKKyAgICogICAgIHRoZXkgY29udHJvbC4gIFNvbWUgY29uc3RyYWludHMgYXJlOgorICAgKiAgICAgLSBUaGUgY29udHJvbGxlZCBpbnB1dCBzZXF1ZW5jZSBjYW4gYmUgbm90IHJlYWRhYmxlLgorICAgKiAgICAgLSBUaGUgY29udHJvbGxlZCBvdXRwdXQgc2VxdWVuY2UgY2FuIGJlIG5vdCB3cml0YWJsZS4KKyAgICogICAgIC0gVGhlIGNvbnRyb2xsZWQgc2VxdWVuY2VzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRlbnRzIG9mCisgICAqICAgICAgIG90aGVyIHJlcHJlc2VudGF0aW9ucyBmb3IgY2hhcmFjdGVyIHNlcXVlbmNlcywgc3VjaCBhcyBleHRlcm5hbAorICAgKiAgICAgICBmaWxlcy4KKyAgICogICAgIC0gVGhlIGNvbnRyb2xsZWQgc2VxdWVuY2VzIGNhbiBzdXBwb3J0IG9wZXJhdGlvbnMgQGUgZGlyZWN0bHkgdG8gb3IKKyAgICogICAgICAgZnJvbSBhc3NvY2lhdGVkIHNlcXVlbmNlcy4KKyAgICogICAgIC0gVGhlIGNvbnRyb2xsZWQgc2VxdWVuY2VzIGNhbiBpbXBvc2UgbGltaXRhdGlvbnMgb24gaG93IHRoZQorICAgKiAgICAgICBwcm9ncmFtIGNhbiByZWFkIGNoYXJhY3RlcnMgZnJvbSBhIHNlcXVlbmNlLCB3cml0ZSBjaGFyYWN0ZXJzIHRvCisgICAqICAgICAgIGEgc2VxdWVuY2UsIHB1dCBjaGFyYWN0ZXJzIGJhY2sgaW50byBhbiBpbnB1dCBzZXF1ZW5jZSwgb3IgYWx0ZXIKKyAgICogICAgICAgdGhlIHN0cmVhbSBwb3NpdGlvbi4KKyAgICogICAgIC4KKyAgICogIC0jIEVhY2ggc2VxdWVuY2UgaXMgY2hhcmFjdGVyaXplZCBieSB0aHJlZSBwb2ludGVycyB3aGljaCwgaWYgbm9uLW51bGwsCisgICAqICAgICBhbGwgcG9pbnQgaW50byB0aGUgc2FtZSBAYyBjaGFyVCBhcnJheSBvYmplY3QuICBUaGUgYXJyYXkgb2JqZWN0CisgICAqICAgICByZXByZXNlbnRzLCBhdCBhbnkgbW9tZW50LCBhIChzdWIpc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBmcm9tIHRoZQorICAgKiAgICAgc2VxdWVuY2UuICBPcGVyYXRpb25zIHBlcmZvcm1lZCBvbiBhIHNlcXVlbmNlIGFsdGVyIHRoZSB2YWx1ZXMKKyAgICogICAgIHN0b3JlZCBpbiB0aGVzZSBwb2ludGVycywgcGVyZm9ybSByZWFkcyBhbmQgd3JpdGVzIGRpcmVjdGx5IHRvIG9yCisgICAqICAgICBmcm9tIGFzc29jaWF0ZWQgc2VxdWVuY2VzLCBhbmQgYWx0ZXIgPGVtPnRoZSBzdHJlYW0gcG9zaXRpb248L2VtPiBhbmQKKyAgICogICAgIGNvbnZlcnNpb24gc3RhdGUgYXMgbmVlZGVkIHRvIG1haW50YWluIHRoaXMgc3Vic2VxdWVuY2UgcmVsYXRpb25zaGlwLgorICAgKiAgICAgVGhlIHRocmVlIHBvaW50ZXJzIGFyZToKKyAgICogICAgIC0gdGhlIDxlbT5iZWdpbm5pbmcgcG9pbnRlcjwvZW0+LCBvciBsb3dlc3QgZWxlbWVudCBhZGRyZXNzIGluIHRoZQorICAgKiAgICAgICBhcnJheSAoY2FsbGVkIEBlIHhiZWcgaGVyZSk7CisgICAqICAgICAtIHRoZSA8ZW0+bmV4dCBwb2ludGVyPC9lbT4sIG9yIG5leHQgZWxlbWVudCBhZGRyZXNzIHRoYXQgaXMgYQorICAgKiAgICAgICBjdXJyZW50IGNhbmRpZGF0ZSBmb3IgcmVhZGluZyBvciB3cml0aW5nIChjYWxsZWQgQGUgeG5leHQgaGVyZSk7CisgICAqICAgICAtIHRoZSA8ZW0+ZW5kIHBvaW50ZXI8L2VtPiwgb3IgZmlyc3QgZWxlbWVudCBhZGRyZXNzIGJleW9uZCB0aGUKKyAgICogICAgICAgZW5kIG9mIHRoZSBhcnJheSAoY2FsbGVkIEBlIHhlbmQgaGVyZSkuCisgICAqICAgICAuCisgICAqICAtIyBUaGUgZm9sbG93aW5nIHNlbWFudGljIGNvbnN0cmFpbnRzIHNoYWxsIGFsd2F5cyBhcHBseSBmb3IgYW55IHNldAorICAgKiAgICAgb2YgdGhyZWUgcG9pbnRlcnMgZm9yIGEgc2VxdWVuY2UsIHVzaW5nIHRoZSBwb2ludGVyIG5hbWVzIGdpdmVuCisgICAqICAgICBpbW1lZGlhdGVseSBhYm92ZToKKyAgICogICAgIC0gSWYgQGUgeG5leHQgaXMgbm90IGEgbnVsbCBwb2ludGVyLCB0aGVuIEBlIHhiZWcgYW5kIEBlIHhlbmQgc2hhbGwKKyAgICogICAgICAgYWxzbyBiZSBub24tbnVsbCBwb2ludGVycyBpbnRvIHRoZSBzYW1lIEBjIGNoYXJUIGFycmF5LCBhcworICAgKiAgICAgICBkZXNjcmliZWQgYWJvdmU7IG90aGVyd2lzZSwgQGUgeGJlZyBhbmQgQGUgeGVuZCBzaGFsbCBhbHNvIGJlIG51bGwuCisgICAqICAgICAtIElmIEBlIHhuZXh0IGlzIG5vdCBhIG51bGwgcG9pbnRlciBhbmQgQGUgeG5leHQgPCBAZSB4ZW5kIGZvciBhbgorICAgKiAgICAgICBvdXRwdXQgc2VxdWVuY2UsIHRoZW4gYSA8ZW0+d3JpdGUgcG9zaXRpb248L2VtPiBpcyBhdmFpbGFibGUuCisgICAqICAgICAgIEluIHRoaXMgY2FzZSwgQGUgKnhuZXh0IHNoYWxsIGJlIGFzc2lnbmFibGUgYXMgdGhlIG5leHQgZWxlbWVudAorICAgKiAgICAgICB0byB3cml0ZSAodG8gcHV0LCBvciB0byBzdG9yZSBhIGNoYXJhY3RlciB2YWx1ZSwgaW50byB0aGUgc2VxdWVuY2UpLgorICAgKiAgICAgLSBJZiBAZSB4bmV4dCBpcyBub3QgYSBudWxsIHBvaW50ZXIgYW5kIEBlIHhiZWcgPCBAZSB4bmV4dCBmb3IgYW4KKyAgICogICAgICAgaW5wdXQgc2VxdWVuY2UsIHRoZW4gYSA8ZW0+cHV0YmFjayBwb3NpdGlvbjwvZW0+IGlzIGF2YWlsYWJsZS4KKyAgICogICAgICAgSW4gdGhpcyBjYXNlLCBAZSB4bmV4dFstMV0gc2hhbGwgaGF2ZSBhIGRlZmluZWQgdmFsdWUgYW5kIGlzIHRoZQorICAgKiAgICAgICBuZXh0IChwcmVjZWRpbmcpIGVsZW1lbnQgdG8gc3RvcmUgYSBjaGFyYWN0ZXIgdGhhdCBpcyBwdXQgYmFjaworICAgKiAgICAgICBpbnRvIHRoZSBpbnB1dCBzZXF1ZW5jZS4KKyAgICogICAgIC0gSWYgQGUgeG5leHQgaXMgbm90IGEgbnVsbCBwb2ludGVyIGFuZCBAZSB4bmV4dDwgQGUgeGVuZCBmb3IgYW4KKyAgICogICAgICAgaW5wdXQgc2VxdWVuY2UsIHRoZW4gYSA8ZW0+cmVhZCBwb3NpdGlvbjwvZW0+IGlzIGF2YWlsYWJsZS4KKyAgICogICAgICAgSW4gdGhpcyBjYXNlLCBAZSAqeG5leHQgc2hhbGwgaGF2ZSBhIGRlZmluZWQgdmFsdWUgYW5kIGlzIHRoZQorICAgKiAgICAgICBuZXh0IGVsZW1lbnQgdG8gcmVhZCAodG8gZ2V0LCBvciB0byBvYnRhaW4gYSBjaGFyYWN0ZXIgdmFsdWUsCisgICAqICAgICAgIGZyb20gdGhlIHNlcXVlbmNlKS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIGJhc2ljX3N0cmVhbWJ1ZiAKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgVGhlc2UgYXJlIHN0YW5kYXJkIHR5cGVzLiAgVGhleSBwZXJtaXQgYSBzdGFuZGFyZGl6ZWQgd2F5IG9mCisgICAgICAgKiAgcmVmZXJyaW5nIHRvIG5hbWVzIG9mIChvciBuYW1lcyBkZXBlbmRlbnQgb24pIHRoZSB0ZW1wbGF0ZQorICAgICAgICogIHBhcmFtZXRlcnMsIHdoaWNoIGFyZSBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24uCisgICAgICAqLworICAgICAgdHlwZWRlZiBfQ2hhclQgCQkJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMgCQkJCQl0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIAkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSAJCXBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgCQlvZmZfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLy8vIFRoaXMgaXMgYSBub24tc3RhbmRhcmQgdHlwZS4KKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+ICAJX19zdHJlYW1idWZfdHlwZTsKKyAgICAgIC8vQH0KKyAgICAgIAorICAgICAgZnJpZW5kIGNsYXNzIGJhc2ljX2lvczxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjsKKyAgICAgIGZyaWVuZCBjbGFzcyBiYXNpY19pc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+OworICAgICAgZnJpZW5kIGNsYXNzIGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT47CisgICAgICBmcmllbmQgY2xhc3MgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjsKKyAgICAgIGZyaWVuZCBjbGFzcyBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+OworCisgICAgICBmcmllbmQgc3RyZWFtc2l6ZQorICAgICAgX19jb3B5X3N0cmVhbWJ1ZnNfZW9mPD4oYmFzaWNfc3RyZWFtYnVmKiwgYmFzaWNfc3RyZWFtYnVmKiwgYm9vbCYpOworCisgICAgICB0ZW1wbGF0ZTxib29sIF9Jc01vdmUsIHR5cGVuYW1lIF9DaGFyVDI+CisgICAgICAgIGZyaWVuZCB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfY2hhcjxfQ2hhclQyPjo6X192YWx1ZSwgCisJCQkJCSAgICAgICBfQ2hhclQyKj46Ol9fdHlwZQorICAgICAgICBfX2NvcHlfbW92ZV9hMihpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+LAorCQkgICAgICAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiwgX0NoYXJUMiopOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQyPgorICAgICAgICBmcmllbmQgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUMj46Ol9fdmFsdWUsCisJCQkJICBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+ID46Ol9fdHlwZQorICAgICAgICBmaW5kKGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4sIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4sCisJICAgICBjb25zdCBfQ2hhclQyJik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVDIsIHR5cGVuYW1lIF9UcmFpdHMyPgorICAgICAgICBmcmllbmQgYmFzaWNfaXN0cmVhbTxfQ2hhclQyLCBfVHJhaXRzMj4mCisgICAgICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQyLCBfVHJhaXRzMj4mLCBfQ2hhclQyKik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVDIsIHR5cGVuYW1lIF9UcmFpdHMyLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICAgIGZyaWVuZCBiYXNpY19pc3RyZWFtPF9DaGFyVDIsIF9UcmFpdHMyPiYKKyAgICAgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVDIsIF9UcmFpdHMyPiYsCisJCSAgIGJhc2ljX3N0cmluZzxfQ2hhclQyLCBfVHJhaXRzMiwgX0FsbG9jPiYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQyLCB0eXBlbmFtZSBfVHJhaXRzMiwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBmcmllbmQgYmFzaWNfaXN0cmVhbTxfQ2hhclQyLCBfVHJhaXRzMj4mCisgICAgICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTxfQ2hhclQyLCBfVHJhaXRzMj4mLAorCQliYXNpY19zdHJpbmc8X0NoYXJUMiwgX1RyYWl0czIsIF9BbGxvYz4mLCBfQ2hhclQyKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8qCisgICAgICAgKiAgVGhpcyBpcyBiYXNlZCBvbiBfSU9fRklMRSwganVzdCByZW9yZGVyZWQgdG8gYmUgbW9yZSBjb25zaXN0ZW50LAorICAgICAgICogIGFuZCBpcyBpbnRlbmRlZCB0byBiZSB0aGUgbW9zdCBtaW5pbWFsIGFic3RyYWN0aW9uIGZvciBhbgorICAgICAgICogIGludGVybmFsIGJ1ZmZlci4KKyAgICAgICAqICAtICBnZXQgPT0gaW5wdXQgPT0gcmVhZAorICAgICAgICogIC0gIHB1dCA9PSBvdXRwdXQgPT0gd3JpdGUKKyAgICAgICovCisgICAgICBjaGFyX3R5cGUqIAkJX01faW5fYmVnOyAgICAgLy8vPCBTdGFydCBvZiBnZXQgYXJlYS4KKyAgICAgIGNoYXJfdHlwZSogCQlfTV9pbl9jdXI7ICAgICAvLy88IEN1cnJlbnQgcmVhZCBhcmVhLgorICAgICAgY2hhcl90eXBlKiAJCV9NX2luX2VuZDsgICAgIC8vLzwgRW5kIG9mIGdldCBhcmVhLgorICAgICAgY2hhcl90eXBlKiAJCV9NX291dF9iZWc7ICAgIC8vLzwgU3RhcnQgb2YgcHV0IGFyZWEuCisgICAgICBjaGFyX3R5cGUqIAkJX01fb3V0X2N1cjsgICAgLy8vPCBDdXJyZW50IHB1dCBhcmVhLgorICAgICAgY2hhcl90eXBlKiAJCV9NX291dF9lbmQ7ICAgIC8vLzwgRW5kIG9mIHB1dCBhcmVhLgorCisgICAgICAvLy8gQ3VycmVudCBsb2NhbGUgc2V0dGluZy4KKyAgICAgIGxvY2FsZSAJCQlfTV9idWZfbG9jYWxlOwkKKworICBwdWJsaWM6CisgICAgICAvLy8gRGVzdHJ1Y3RvciBkZWFsbG9jYXRlcyBubyBidWZmZXIgc3BhY2UuCisgICAgICB2aXJ0dWFsIAorICAgICAgfmJhc2ljX3N0cmVhbWJ1ZigpIAorICAgICAgeyB9CisKKyAgICAgIC8vIFsyNy41LjIuMi4xXSBsb2NhbGVzCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEVudHJ5IHBvaW50IGZvciBpbWJ1ZSgpLgorICAgICAgICogIEBwYXJhbSAgX19sb2MgIFRoZSBuZXcgbG9jYWxlLgorICAgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91cyBsb2NhbGUuCisgICAgICAgKgorICAgICAgICogIENhbGxzIHRoZSBkZXJpdmVkIGltYnVlKF9fbG9jKS4KKyAgICAgICovCisgICAgICBsb2NhbGUgCisgICAgICBwdWJpbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgICAgeworCWxvY2FsZSBfX3RtcCh0aGlzLT5nZXRsb2MoKSk7CisJdGhpcy0+aW1idWUoX19sb2MpOworCV9NX2J1Zl9sb2NhbGUgPSBfX2xvYzsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTG9jYWxlIGFjY2Vzcy4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBsb2NhbGUgaW4gZWZmZWN0LgorICAgICAgICoKKyAgICAgICAqICBJZiBwdWJpbWJ1ZShsb2MpIGhhcyBiZWVuIGNhbGxlZCwgdGhlbiB0aGUgbW9zdCByZWNlbnQgQGMgbG9jCisgICAgICAgKiAgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UgdGhlIGdsb2JhbCBsb2NhbGUgaW4gZWZmZWN0IGF0IHRoZSB0aW1lCisgICAgICAgKiAgb2YgY29uc3RydWN0aW9uIGlzIHJldHVybmVkLgorICAgICAgKi8KKyAgICAgIGxvY2FsZSAgIAorICAgICAgZ2V0bG9jKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2J1Zl9sb2NhbGU7IH0gCisKKyAgICAgIC8vIFsyNy41LjIuMi4yXSBidWZmZXIgbWFuYWdlbWVudCBhbmQgcG9zaXRpb25pbmcKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRW50cnkgcG9pbnRzIGZvciBkZXJpdmVkIGJ1ZmZlciBmdW5jdGlvbnMuCisgICAgICAgKgorICAgICAgICogIFRoZSBwdWJsaWMgdmVyc2lvbnMgb2YgQGMgcHViZm9vIGRpc3BhdGNoIHRvIHRoZSBwcm90ZWN0ZWQKKyAgICAgICAqICBkZXJpdmVkIEBjIGZvbyBtZW1iZXIgZnVuY3Rpb25zLCBwYXNzaW5nIHRoZSBhcmd1bWVudHMgKGlmIGFueSkKKyAgICAgICAqICBhbmQgcmV0dXJuaW5nIHRoZSByZXN1bHQgdW5jaGFuZ2VkLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmVhbWJ1ZioKKyAgICAgIHB1YnNldGJ1ZihjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pIAorICAgICAgeyByZXR1cm4gdGhpcy0+c2V0YnVmKF9fcywgX19uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFsdGVycyB0aGUgc3RyZWFtIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19vZmYgIE9mZnNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fd2F5ICBWYWx1ZSBmb3IgaW9zX2Jhc2U6OnNlZWtkaXIuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgVmFsdWUgZm9yIGlvc19iYXNlOjpvcGVubW9kZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgdmlydHVhbCBzZWVrb2ZmIGZ1bmN0aW9uLgorICAgICAgKi8KKyAgICAgIHBvc190eXBlIAorICAgICAgcHVic2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksIAorCQkgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgICB7IHJldHVybiB0aGlzLT5zZWVrb2ZmKF9fb2ZmLCBfX3dheSwgX19tb2RlKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFsdGVycyB0aGUgc3RyZWFtIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19zcCAgUG9zaXRpb24KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSBWYWx1ZSBmb3IgaW9zX2Jhc2U6Om9wZW5tb2RlLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyB2aXJ0dWFsIHNlZWtwb3MgZnVuY3Rpb24uCisgICAgICAqLworICAgICAgcG9zX3R5cGUgCisgICAgICBwdWJzZWVrcG9zKHBvc190eXBlIF9fc3AsCisJCSBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnNlZWtwb3MoX19zcCwgX19tb2RlKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENhbGxzIHZpcnR1YWwgc3luYyBmdW5jdGlvbi4KKyAgICAgICovCisgICAgICBpbnQgCisgICAgICBwdWJzeW5jKCkgeyByZXR1cm4gdGhpcy0+c3luYygpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vIFsyNy41LjIuMi4zXSBnZXQgYXJlYQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBMb29raW5nIGFoZWFkIGludG8gdGhlIHN0cmVhbS4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYXZhaWxhYmxlLgorICAgICAgICoKKyAgICAgICAqICBJZiBhIHJlYWQgcG9zaXRpb24gaXMgYXZhaWxhYmxlLCByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycworICAgICAgICogIGF2YWlsYWJsZSBmb3IgcmVhZGluZyBiZWZvcmUgdGhlIGJ1ZmZlciBtdXN0IGJlIHJlZmlsbGVkLgorICAgICAgICogIE90aGVyd2lzZSByZXR1cm5zIHRoZSBkZXJpdmVkIEBjIHNob3dtYW55YygpLgorICAgICAgKi8KKyAgICAgIHN0cmVhbXNpemUgCisgICAgICBpbl9hdmFpbCgpIAorICAgICAgeyAKKwljb25zdCBzdHJlYW1zaXplIF9fcmV0ID0gdGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKTsKKwlyZXR1cm4gX19yZXQgPyBfX3JldCA6IHRoaXMtPnNob3dtYW55YygpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEdldHRpbmcgdGhlIG5leHQgY2hhcmFjdGVyLgorICAgICAgICogIEByZXR1cm4gIFRoZSBuZXh0IGNoYXJhY3Rlciwgb3IgZW9mLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyBzYnVtcGMoKSwgYW5kIGlmIHRoYXQgZnVuY3Rpb24gcmV0dXJucworICAgICAgICogIEBjIHRyYWl0czo6ZW9mKCksIHNvIGRvZXMgdGhpcyBmdW5jdGlvbi4gIE90aGVyd2lzZSwgQGMgc2dldGMoKS4KKyAgICAgICovCisgICAgICBpbnRfdHlwZSAKKyAgICAgIHNuZXh0YygpCisgICAgICB7CisJaW50X3R5cGUgX19yZXQgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZSh0aGlzLT5zYnVtcGMoKSwgCisJCQkJCQkgICAgICAgX19yZXQpLCB0cnVlKSkKKwkgIF9fcmV0ID0gdGhpcy0+c2dldGMoKTsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgR2V0dGluZyB0aGUgbmV4dCBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG5leHQgY2hhcmFjdGVyLCBvciBlb2YuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBpbnB1dCByZWFkIHBvc2l0aW9uIGlzIGF2YWlsYWJsZSwgcmV0dXJucyB0aGF0IGNoYXJhY3RlcgorICAgICAgICogIGFuZCBpbmNyZW1lbnRzIHRoZSByZWFkIHBvaW50ZXIsIG90aGVyd2lzZSBjYWxscyBhbmQgcmV0dXJucworICAgICAgICogIEBjIHVmbG93KCkuCisgICAgICAqLworICAgICAgaW50X3R5cGUgCisgICAgICBzYnVtcGMoKQorICAgICAgeworCWludF90eXBlIF9fcmV0OworCWlmIChfX2J1aWx0aW5fZXhwZWN0KHRoaXMtPmdwdHIoKSA8IHRoaXMtPmVncHRyKCksIHRydWUpKQorCSAgeworCSAgICBfX3JldCA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqdGhpcy0+Z3B0cigpKTsKKwkgICAgdGhpcy0+Z2J1bXAoMSk7CisJICB9CisJZWxzZSAKKwkgIF9fcmV0ID0gdGhpcy0+dWZsb3coKTsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgR2V0dGluZyB0aGUgbmV4dCBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG5leHQgY2hhcmFjdGVyLCBvciBlb2YuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBpbnB1dCByZWFkIHBvc2l0aW9uIGlzIGF2YWlsYWJsZSwgcmV0dXJucyB0aGF0IGNoYXJhY3RlciwKKyAgICAgICAqICBvdGhlcndpc2UgY2FsbHMgYW5kIHJldHVybnMgQGMgdW5kZXJmbG93KCkuICBEb2VzIG5vdCBtb3ZlIHRoZSAKKyAgICAgICAqICByZWFkIHBvc2l0aW9uIGFmdGVyIGZldGNoaW5nIHRoZSBjaGFyYWN0ZXIuCisgICAgICAqLworICAgICAgaW50X3R5cGUgCisgICAgICBzZ2V0YygpCisgICAgICB7CisJaW50X3R5cGUgX19yZXQ7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QodGhpcy0+Z3B0cigpIDwgdGhpcy0+ZWdwdHIoKSwgdHJ1ZSkpCisJICBfX3JldCA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqdGhpcy0+Z3B0cigpKTsKKwllbHNlIAorCSAgX19yZXQgPSB0aGlzLT51bmRlcmZsb3coKTsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRW50cnkgcG9pbnQgZm9yIHhzZ2V0bi4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgQSBidWZmZXIgYXJlYS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgQSBjb3VudC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyB4c2dldG4oX19zLF9fbikuICBUaGUgZWZmZWN0IGlzIHRvIGZpbGwgQGEgX19zWzBdIHRocm91Z2gKKyAgICAgICAqICBAYSBfX3NbX19uLTFdIHdpdGggY2hhcmFjdGVycyBmcm9tIHRoZSBpbnB1dCBzZXF1ZW5jZSwgaWYgcG9zc2libGUuCisgICAgICAqLworICAgICAgc3RyZWFtc2l6ZSAKKyAgICAgIHNnZXRuKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnhzZ2V0bihfX3MsIF9fbik7IH0KKworICAgICAgLy8gWzI3LjUuMi4yLjRdIHB1dGJhY2sKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHVzaGluZyBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgX19jICBUaGUgY2hhcmFjdGVyIHRvIHB1c2ggYmFjay4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgcHJldmlvdXMgY2hhcmFjdGVyLCBpZiBwb3NzaWJsZS4KKyAgICAgICAqCisgICAgICAgKiAgU2ltaWxhciB0byBzdW5nZXRjKCksIGJ1dCBAYSBfX2MgaXMgcHVzaGVkIG9udG8gdGhlIHN0cmVhbQorICAgICAgICogIGluc3RlYWQgb2YgPGVtPnRoZSBwcmV2aW91cyBjaGFyYWN0ZXIuPC9lbT4gSWYgc3VjY2Vzc2Z1bCwKKyAgICAgICAqICB0aGUgbmV4dCBjaGFyYWN0ZXIgZmV0Y2hlZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gd2lsbCBiZSBAYQorICAgICAgICogIF9fYy4KKyAgICAgICovCisgICAgICBpbnRfdHlwZSAKKyAgICAgIHNwdXRiYWNrYyhjaGFyX3R5cGUgX19jKQorICAgICAgeworCWludF90eXBlIF9fcmV0OworCWNvbnN0IGJvb2wgX190ZXN0cG9zID0gdGhpcy0+ZWJhY2soKSA8IHRoaXMtPmdwdHIoKTsKKwlpZiAoX19idWlsdGluX2V4cGVjdCghX190ZXN0cG9zIHx8IAorCQkJICAgICAhdHJhaXRzX3R5cGU6OmVxKF9fYywgdGhpcy0+Z3B0cigpWy0xXSksIGZhbHNlKSkKKwkgIF9fcmV0ID0gdGhpcy0+cGJhY2tmYWlsKHRyYWl0c190eXBlOjp0b19pbnRfdHlwZShfX2MpKTsKKwllbHNlIAorCSAgeworCSAgICB0aGlzLT5nYnVtcCgtMSk7CisJICAgIF9fcmV0ID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworCSAgfQorCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNb3ZpbmcgYmFja3dhcmRzIGluIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIGNoYXJhY3RlciwgaWYgcG9zc2libGUuCisgICAgICAgKgorICAgICAgICogIElmIGEgcHV0YmFjayBwb3NpdGlvbiBpcyBhdmFpbGFibGUsIHRoaXMgZnVuY3Rpb24gZGVjcmVtZW50cworICAgICAgICogIHRoZSBpbnB1dCBwb2ludGVyIGFuZCByZXR1cm5zIHRoYXQgY2hhcmFjdGVyLiAgT3RoZXJ3aXNlLAorICAgICAgICogIGNhbGxzIGFuZCByZXR1cm5zIHBiYWNrZmFpbCgpLiAgVGhlIGVmZmVjdCBpcyB0byBAYSB1bmdldAorICAgICAgICogIHRoZSBsYXN0IGNoYXJhY3RlciBAYSBnb3R0ZW4uCisgICAgICAqLworICAgICAgaW50X3R5cGUgCisgICAgICBzdW5nZXRjKCkKKyAgICAgIHsKKwlpbnRfdHlwZSBfX3JldDsKKwlpZiAoX19idWlsdGluX2V4cGVjdCh0aGlzLT5lYmFjaygpIDwgdGhpcy0+Z3B0cigpLCB0cnVlKSkKKwkgIHsKKwkgICAgdGhpcy0+Z2J1bXAoLTEpOworCSAgICBfX3JldCA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqdGhpcy0+Z3B0cigpKTsKKwkgIH0KKwllbHNlIAorCSAgX19yZXQgPSB0aGlzLT5wYmFja2ZhaWwoKTsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIC8vIFsyNy41LjIuMi41XSBwdXQgYXJlYQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFbnRyeSBwb2ludCBmb3IgYWxsIHNpbmdsZS1jaGFyYWN0ZXIgb3V0cHV0IGZ1bmN0aW9ucy4KKyAgICAgICAqICBAcGFyYW0gIF9fYyAgQSBjaGFyYWN0ZXIgdG8gb3V0cHV0LgorICAgICAgICogIEByZXR1cm4gIEBhIF9fYywgaWYgcG9zc2libGUuCisgICAgICAgKgorICAgICAgICogIE9uZSBvZiB0d28gcHVibGljIG91dHB1dCBmdW5jdGlvbnMuCisgICAgICAgKgorICAgICAgICogIElmIGEgd3JpdGUgcG9zaXRpb24gaXMgYXZhaWxhYmxlIGZvciB0aGUgb3V0cHV0IHNlcXVlbmNlIChpLmUuLAorICAgICAgICogIHRoZSBidWZmZXIgaXMgbm90IGZ1bGwpLCBzdG9yZXMgQGEgX19jIGluIHRoYXQgcG9zaXRpb24sIGluY3JlbWVudHMKKyAgICAgICAqICB0aGUgcG9zaXRpb24sIGFuZCByZXR1cm5zIEBjIHRyYWl0czo6dG9faW50X3R5cGUoX19jKS4gIElmIGEgd3JpdGUKKyAgICAgICAqICBwb3NpdGlvbiBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm5zIEBjIG92ZXJmbG93KF9fYykuCisgICAgICAqLworICAgICAgaW50X3R5cGUgCisgICAgICBzcHV0YyhjaGFyX3R5cGUgX19jKQorICAgICAgeworCWludF90eXBlIF9fcmV0OworCWlmIChfX2J1aWx0aW5fZXhwZWN0KHRoaXMtPnBwdHIoKSA8IHRoaXMtPmVwcHRyKCksIHRydWUpKQorCSAgeworCSAgICAqdGhpcy0+cHB0cigpID0gX19jOworCSAgICB0aGlzLT5wYnVtcCgxKTsKKwkgICAgX19yZXQgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX19jKTsKKwkgIH0KKwllbHNlCisJICBfX3JldCA9IHRoaXMtPm92ZXJmbG93KHRyYWl0c190eXBlOjp0b19pbnRfdHlwZShfX2MpKTsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRW50cnkgcG9pbnQgZm9yIGFsbCBzaW5nbGUtY2hhcmFjdGVyIG91dHB1dCBmdW5jdGlvbnMuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIEEgYnVmZmVyIHJlYWQgYXJlYS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgQSBjb3VudC4KKyAgICAgICAqCisgICAgICAgKiAgT25lIG9mIHR3byBwdWJsaWMgb3V0cHV0IGZ1bmN0aW9ucy4KKyAgICAgICAqCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgeHNwdXRuKF9fcyxfX24pLiAgVGhlIGVmZmVjdCBpcyB0byB3cml0ZSBAYSBfX3NbMF0gdGhyb3VnaAorICAgICAgICogIEBhIF9fc1tfX24tMV0gdG8gdGhlIG91dHB1dCBzZXF1ZW5jZSwgaWYgcG9zc2libGUuCisgICAgICAqLworICAgICAgc3RyZWFtc2l6ZSAKKyAgICAgIHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnhzcHV0bihfX3MsIF9fbik7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQmFzZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqCisgICAgICAgKiAgT25seSBjYWxsZWQgZnJvbSBkZXJpdmVkIGNvbnN0cnVjdG9ycywgYW5kIHNldHMgdXAgYWxsIHRoZQorICAgICAgICogIGJ1ZmZlciBkYXRhIHRvIHplcm8sIGluY2x1ZGluZyB0aGUgcG9pbnRlcnMgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICogIGJhc2ljX3N0cmVhbWJ1ZiBjbGFzcyBkZXNjcmlwdGlvbi4gIE5vdGUgdGhhdCwgYXMgYSByZXN1bHQsCisgICAgICAgKiAgLSB0aGUgY2xhc3Mgc3RhcnRzIHdpdGggbm8gcmVhZCBub3Igd3JpdGUgcG9zaXRpb25zIGF2YWlsYWJsZSwKKyAgICAgICAqICAtIHRoaXMgaXMgbm90IGFuIGVycm9yCisgICAgICAqLworICAgICAgYmFzaWNfc3RyZWFtYnVmKCkKKyAgICAgIDogX01faW5fYmVnKDApLCBfTV9pbl9jdXIoMCksIF9NX2luX2VuZCgwKSwgCisgICAgICBfTV9vdXRfYmVnKDApLCBfTV9vdXRfY3VyKDApLCBfTV9vdXRfZW5kKDApLAorICAgICAgX01fYnVmX2xvY2FsZShsb2NhbGUoKSkgCisgICAgICB7IH0KKworICAgICAgLy8gWzI3LjUuMi4zLjFdIGdldCBhcmVhIGFjY2VzcworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBY2Nlc3MgdG8gdGhlIGdldCBhcmVhLgorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIHRvIG90aGVyIHByb3RlY3RlZCBmdW5jdGlvbnMsCisgICAgICAgKiAgaW5jbHVkaW5nIGRlcml2ZWQgY2xhc3Nlcy4KKyAgICAgICAqCisgICAgICAgKiAgLSBlYmFjaygpIHJldHVybnMgdGhlIGJlZ2lubmluZyBwb2ludGVyIGZvciB0aGUgaW5wdXQgc2VxdWVuY2UKKyAgICAgICAqICAtIGdwdHIoKSByZXR1cm5zIHRoZSBuZXh0IHBvaW50ZXIgZm9yIHRoZSBpbnB1dCBzZXF1ZW5jZQorICAgICAgICogIC0gZWdwdHIoKSByZXR1cm5zIHRoZSBlbmQgcG9pbnRlciBmb3IgdGhlIGlucHV0IHNlcXVlbmNlCisgICAgICAqLworICAgICAgY2hhcl90eXBlKiAKKyAgICAgIGViYWNrKCkgY29uc3QgeyByZXR1cm4gX01faW5fYmVnOyB9CisKKyAgICAgIGNoYXJfdHlwZSogCisgICAgICBncHRyKCkgIGNvbnN0IHsgcmV0dXJuIF9NX2luX2N1cjsgIH0KKworICAgICAgY2hhcl90eXBlKiAKKyAgICAgIGVncHRyKCkgY29uc3QgeyByZXR1cm4gX01faW5fZW5kOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTW92aW5nIHRoZSByZWFkIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19uICBUaGUgZGVsdGEgYnkgd2hpY2ggdG8gbW92ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBqdXN0IGFkdmFuY2VzIHRoZSByZWFkIHBvc2l0aW9uIHdpdGhvdXQgcmV0dXJuaW5nIGFueSBkYXRhLgorICAgICAgKi8KKyAgICAgIHZvaWQgCisgICAgICBnYnVtcChpbnQgX19uKSB7IF9NX2luX2N1ciArPSBfX247IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXR0aW5nIHRoZSB0aHJlZSByZWFkIGFyZWEgcG9pbnRlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX2diZWcgIEEgcG9pbnRlci4KKyAgICAgICAqICBAcGFyYW0gIF9fZ25leHQgIEEgcG9pbnRlci4KKyAgICAgICAqICBAcGFyYW0gIF9fZ2VuZCAgQSBwb2ludGVyLgorICAgICAgICogIEBwb3N0ICBAYSBfX2diZWcgPT0gQGMgZWJhY2soKSwgQGEgX19nbmV4dCA9PSBAYyBncHRyKCksIGFuZAorICAgICAgICogICAgICAgICBAYSBfX2dlbmQgPT0gQGMgZWdwdHIoKQorICAgICAgKi8KKyAgICAgIHZvaWQgCisgICAgICBzZXRnKGNoYXJfdHlwZSogX19nYmVnLCBjaGFyX3R5cGUqIF9fZ25leHQsIGNoYXJfdHlwZSogX19nZW5kKQorICAgICAgeworCV9NX2luX2JlZyA9IF9fZ2JlZzsKKwlfTV9pbl9jdXIgPSBfX2duZXh0OworCV9NX2luX2VuZCA9IF9fZ2VuZDsKKyAgICAgIH0KKworICAgICAgLy8gWzI3LjUuMi4zLjJdIHB1dCBhcmVhIGFjY2VzcworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBY2Nlc3MgdG8gdGhlIHB1dCBhcmVhLgorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIHRvIG90aGVyIHByb3RlY3RlZCBmdW5jdGlvbnMsCisgICAgICAgKiAgaW5jbHVkaW5nIGRlcml2ZWQgY2xhc3Nlcy4KKyAgICAgICAqCisgICAgICAgKiAgLSBwYmFzZSgpIHJldHVybnMgdGhlIGJlZ2lubmluZyBwb2ludGVyIGZvciB0aGUgb3V0cHV0IHNlcXVlbmNlCisgICAgICAgKiAgLSBwcHRyKCkgcmV0dXJucyB0aGUgbmV4dCBwb2ludGVyIGZvciB0aGUgb3V0cHV0IHNlcXVlbmNlCisgICAgICAgKiAgLSBlcHB0cigpIHJldHVybnMgdGhlIGVuZCBwb2ludGVyIGZvciB0aGUgb3V0cHV0IHNlcXVlbmNlCisgICAgICAqLworICAgICAgY2hhcl90eXBlKiAKKyAgICAgIHBiYXNlKCkgY29uc3QgeyByZXR1cm4gX01fb3V0X2JlZzsgfQorCisgICAgICBjaGFyX3R5cGUqIAorICAgICAgcHB0cigpIGNvbnN0IHsgcmV0dXJuIF9NX291dF9jdXI7IH0KKworICAgICAgY2hhcl90eXBlKiAKKyAgICAgIGVwcHRyKCkgY29uc3QgeyByZXR1cm4gX01fb3V0X2VuZDsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmluZyB0aGUgd3JpdGUgcG9zaXRpb24uCisgICAgICAgKiAgQHBhcmFtICBfX24gIFRoZSBkZWx0YSBieSB3aGljaCB0byBtb3ZlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGp1c3QgYWR2YW5jZXMgdGhlIHdyaXRlIHBvc2l0aW9uIHdpdGhvdXQgcmV0dXJuaW5nIGFueSBkYXRhLgorICAgICAgKi8KKyAgICAgIHZvaWQgCisgICAgICBwYnVtcChpbnQgX19uKSB7IF9NX291dF9jdXIgKz0gX19uOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0dGluZyB0aGUgdGhyZWUgd3JpdGUgYXJlYSBwb2ludGVycy4KKyAgICAgICAqICBAcGFyYW0gIF9fcGJlZyAgQSBwb2ludGVyLgorICAgICAgICogIEBwYXJhbSAgX19wZW5kICBBIHBvaW50ZXIuCisgICAgICAgKiAgQHBvc3QgIEBhIF9fcGJlZyA9PSBAYyBwYmFzZSgpLCBAYSBfX3BiZWcgPT0gQGMgcHB0cigpLCBhbmQKKyAgICAgICAqICAgICAgICAgQGEgX19wZW5kID09IEBjIGVwcHRyKCkKKyAgICAgICovCisgICAgICB2b2lkIAorICAgICAgc2V0cChjaGFyX3R5cGUqIF9fcGJlZywgY2hhcl90eXBlKiBfX3BlbmQpCisgICAgICB7IAorCV9NX291dF9iZWcgPSBfTV9vdXRfY3VyID0gX19wYmVnOyAKKwlfTV9vdXRfZW5kID0gX19wZW5kOworICAgICAgfQorCisgICAgICAvLyBbMjcuNS4yLjRdIHZpcnR1YWwgZnVuY3Rpb25zCisgICAgICAvLyBbMjcuNS4yLjQuMV0gbG9jYWxlcworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDaGFuZ2VzIHRyYW5zbGF0aW9ucy4KKyAgICAgICAqICBAcGFyYW0gIF9fbG9jICBBIG5ldyBsb2NhbGUuCisgICAgICAgKgorICAgICAgICogIFRyYW5zbGF0aW9ucyBkb25lIGR1cmluZyBJL08gd2hpY2ggZGVwZW5kIG9uIHRoZSBjdXJyZW50CisgICAgICAgKiAgbG9jYWxlIGFyZSBjaGFuZ2VkIGJ5IHRoaXMgY2FsbC4gIFRoZSBzdGFuZGFyZCBhZGRzLAorICAgICAgICogIDxlbT5CZXR3ZWVuIGludm9jYXRpb25zIG9mIHRoaXMgZnVuY3Rpb24gYSBjbGFzcyBkZXJpdmVkCisgICAgICAgKiAgZnJvbSBzdHJlYW1idWYgY2FuIHNhZmVseSBjYWNoZSByZXN1bHRzIG9mIGNhbGxzIHRvIGxvY2FsZQorICAgICAgICogIGZ1bmN0aW9ucyBhbmQgdG8gbWVtYmVycyBvZiBmYWNldHMgc28gb2J0YWluZWQuPC9lbT4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIEJhc2UgY2xhc3MgdmVyc2lvbiBkb2VzIG5vdGhpbmcuCisgICAgICAqLworICAgICAgdmlydHVhbCB2b2lkIAorICAgICAgaW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYykgCisgICAgICB7IH0KKworICAgICAgLy8gWzI3LjUuMi40LjJdIGJ1ZmZlciBtYW5hZ2VtZW50IGFuZCBwb3NpdGlvbmluZworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNYW5pcHVsYXRlcyB0aGUgYnVmZmVyLgorICAgICAgICoKKyAgICAgICAqICBFYWNoIGRlcml2ZWQgY2xhc3MgcHJvdmlkZXMgaXRzIG93biBhcHByb3ByaWF0ZSBiZWhhdmlvci4gIFNlZQorICAgICAgICogIHRoZSBuZXh0LXRvLWxhc3QgcGFyYWdyYXBoIG9mIAorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTFjaDI1czAyLmh0bWwKKyAgICAgICAqICBmb3IgbW9yZSBvbiB0aGlzIGZ1bmN0aW9uLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgQmFzZSBjbGFzcyB2ZXJzaW9uIGRvZXMgbm90aGluZywgcmV0dXJucyBAYyB0aGlzLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSxfVHJhaXRzPiogCisgICAgICBzZXRidWYoY2hhcl90eXBlKiwgc3RyZWFtc2l6ZSkKKyAgICAgIHsJcmV0dXJuIHRoaXM7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBbHRlcnMgdGhlIHN0cmVhbSBwb3NpdGlvbnMuCisgICAgICAgKgorICAgICAgICogIEVhY2ggZGVyaXZlZCBjbGFzcyBwcm92aWRlcyBpdHMgb3duIGFwcHJvcHJpYXRlIGJlaGF2aW9yLgorICAgICAgICogIEBub3RlICBCYXNlIGNsYXNzIHZlcnNpb24gZG9lcyBub3RoaW5nLCByZXR1cm5zIGEgQGMgcG9zX3R5cGUKKyAgICAgICAqICAgICAgICAgdGhhdCByZXByZXNlbnRzIGFuIGludmFsaWQgc3RyZWFtIHBvc2l0aW9uLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgcG9zX3R5cGUgCisgICAgICBzZWVrb2ZmKG9mZl90eXBlLCBpb3NfYmFzZTo6c2Vla2RpciwKKwkgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgLypfX21vZGUqLyA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgICB7IHJldHVybiBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOyB9IAorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFsdGVycyB0aGUgc3RyZWFtIHBvc2l0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiAgRWFjaCBkZXJpdmVkIGNsYXNzIHByb3ZpZGVzIGl0cyBvd24gYXBwcm9wcmlhdGUgYmVoYXZpb3IuCisgICAgICAgKiAgQG5vdGUgIEJhc2UgY2xhc3MgdmVyc2lvbiBkb2VzIG5vdGhpbmcsIHJldHVybnMgYSBAYyBwb3NfdHlwZQorICAgICAgICogICAgICAgICB0aGF0IHJlcHJlc2VudHMgYW4gaW52YWxpZCBzdHJlYW0gcG9zaXRpb24uCisgICAgICAqLworICAgICAgdmlydHVhbCBwb3NfdHlwZSAKKyAgICAgIHNlZWtwb3MocG9zX3R5cGUsIAorCSAgICAgIGlvc19iYXNlOjpvcGVubW9kZSAvKl9fbW9kZSovID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgICAgIHsgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7IH0gCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3luY2hyb25pemVzIHRoZSBidWZmZXIgYXJyYXlzIHdpdGggdGhlIGNvbnRyb2xsZWQgc2VxdWVuY2VzLgorICAgICAgICogIEByZXR1cm4gIC0xIG9uIGZhaWx1cmUuCisgICAgICAgKgorICAgICAgICogIEVhY2ggZGVyaXZlZCBjbGFzcyBwcm92aWRlcyBpdHMgb3duIGFwcHJvcHJpYXRlIGJlaGF2aW9yLAorICAgICAgICogIGluY2x1ZGluZyB0aGUgZGVmaW5pdGlvbiBvZiBAYSBmYWlsdXJlLgorICAgICAgICogIEBub3RlICBCYXNlIGNsYXNzIHZlcnNpb24gZG9lcyBub3RoaW5nLCByZXR1cm5zIHplcm8uCisgICAgICAqLworICAgICAgdmlydHVhbCBpbnQgCisgICAgICBzeW5jKCkgeyByZXR1cm4gMDsgfQorCisgICAgICAvLyBbMjcuNS4yLjQuM10gZ2V0IGFyZWEKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW52ZXN0aWdhdGluZyB0aGUgZGF0YSBhdmFpbGFibGUuCisgICAgICAgKiAgQHJldHVybiAgQW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGF2YWlsYWJsZSBpbiB0aGUKKyAgICAgICAqICAgICAgICAgICBpbnB1dCBzZXF1ZW5jZSwgb3IgLTEuCisgICAgICAgKgorICAgICAgICogIDxlbT5JZiBpdCByZXR1cm5zIGEgcG9zaXRpdmUgdmFsdWUsIHRoZW4gc3VjY2Vzc2l2ZSBjYWxscyB0bworICAgICAgICogIEBjIHVuZGVyZmxvdygpIHdpbGwgbm90IHJldHVybiBAYyB0cmFpdHM6OmVvZigpIHVudGlsIGF0CisgICAgICAgKiAgbGVhc3QgdGhhdCBudW1iZXIgb2YgY2hhcmFjdGVycyBoYXZlIGJlZW4gc3VwcGxpZWQuICBJZiBAYworICAgICAgICogIHNob3dtYW55YygpIHJldHVybnMgLTEsIHRoZW4gY2FsbHMgdG8gQGMgdW5kZXJmbG93KCkgb3IgQGMKKyAgICAgICAqICB1ZmxvdygpIHdpbGwgZmFpbC48L2VtPiBbMjcuNS4yLjQuM10vMQorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgQmFzZSBjbGFzcyB2ZXJzaW9uIGRvZXMgbm90aGluZywgcmV0dXJucyB6ZXJvLgorICAgICAgICogIEBub3RlICBUaGUgc3RhbmRhcmQgYWRkcyB0aGF0IDxlbT50aGUgaW50ZW50aW9uIGlzIG5vdCBvbmx5IHRoYXQgdGhlCisgICAgICAgKiAgICAgICAgIGNhbGxzIFt0byB1bmRlcmZsb3cgb3IgdWZsb3ddIHdpbGwgbm90IHJldHVybiBAYyBlb2YoKSBidXQKKyAgICAgICAqICAgICAgICAgdGhhdCB0aGV5IHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LjwvZW0+CisgICAgICAgKiAgQG5vdGUgIFRoZSBzdGFuZGFyZCBhZGRzIHRoYXQgPGVtPnRoZSBtb3JwaGVtZXMgb2YgQGMgc2hvd21hbnljIGFyZQorICAgICAgICogICAgICAgICBAYiBlcy1ob3ctbWFueS1zZWUsIG5vdCBAYiBzaG93LW1hbmljLjwvZW0+CisgICAgICAqLworICAgICAgdmlydHVhbCBzdHJlYW1zaXplIAorICAgICAgc2hvd21hbnljKCkgeyByZXR1cm4gMDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE11bHRpcGxlIGNoYXJhY3RlciBleHRyYWN0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19zICBBIGJ1ZmZlciBhcmVhLgorICAgICAgICogIEBwYXJhbSAgX19uICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGFzc2lnbi4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYXNzaWduZWQuCisgICAgICAgKgorICAgICAgICogIEZpbGxzIEBhIF9fc1swXSB0aHJvdWdoIEBhIF9fc1tfX24tMV0gd2l0aCBjaGFyYWN0ZXJzIGZyb20gdGhlIGlucHV0CisgICAgICAgKiAgc2VxdWVuY2UsIGFzIGlmIGJ5IEBjIHNidW1wYygpLiAgU3RvcHMgd2hlbiBlaXRoZXIgQGEgX19uIGNoYXJhY3RlcnMKKyAgICAgICAqICBoYXZlIGJlZW4gY29waWVkLCBvciB3aGVuIEBjIHRyYWl0czo6ZW9mKCkgd291bGQgYmUgY29waWVkLgorICAgICAgICoKKyAgICAgICAqICBJdCBpcyBleHBlY3RlZCB0aGF0IGRlcml2ZWQgY2xhc3NlcyBwcm92aWRlIGEgbW9yZSBlZmZpY2llbnQKKyAgICAgICAqICBpbXBsZW1lbnRhdGlvbiBieSBvdmVycmlkaW5nIHRoaXMgZGVmaW5pdGlvbi4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHN0cmVhbXNpemUgCisgICAgICB4c2dldG4oY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGZXRjaGVzIG1vcmUgZGF0YSBmcm9tIHRoZSBjb250cm9sbGVkIHNlcXVlbmNlLgorICAgICAgICogIEByZXR1cm4gIFRoZSBmaXJzdCBjaGFyYWN0ZXIgZnJvbSB0aGUgPGVtPnBlbmRpbmcgc2VxdWVuY2U8L2VtPi4KKyAgICAgICAqCisgICAgICAgKiAgSW5mb3JtYWxseSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgaW5wdXQgYnVmZmVyIGlzCisgICAgICAgKiAgZXhoYXVzdGVkIChvciBkb2VzIG5vdCBleGlzdCwgYXMgYnVmZmVyaW5nIG5lZWQgbm90IGFjdHVhbGx5IGJlCisgICAgICAgKiAgZG9uZSkuICBJZiBhIGJ1ZmZlciBleGlzdHMsIGl0IGlzIEBhIHJlZmlsbGVkLiAgSW4gZWl0aGVyIGNhc2UsIHRoZQorICAgICAgICogIG5leHQgYXZhaWxhYmxlIGNoYXJhY3RlciBpcyByZXR1cm5lZCwgb3IgQGMgdHJhaXRzOjplb2YoKSB0bworICAgICAgICogIGluZGljYXRlIGEgbnVsbCBwZW5kaW5nIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqICBGb3IgYSBmb3JtYWwgZGVmaW5pdGlvbiBvZiB0aGUgcGVuZGluZyBzZXF1ZW5jZSwgc2VlIGEgZ29vZCB0ZXh0CisgICAgICAgKiAgc3VjaCBhcyBMYW5nZXIgJiBLcmVmdCwgb3IgWzI3LjUuMi40LjNdLzctMTQuCisgICAgICAgKgorICAgICAgICogIEEgZnVuY3Rpb25pbmcgaW5wdXQgc3RyZWFtYnVmIGNhbiBiZSBjcmVhdGVkIGJ5IG92ZXJyaWRpbmcgb25seQorICAgICAgICogIHRoaXMgZnVuY3Rpb24gKG5vIGJ1ZmZlciBhcmVhIHdpbGwgYmUgdXNlZCkuICBGb3IgYW4gZXhhbXBsZSwgc2VlCisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQxMWNoMjUuaHRtbAorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgQmFzZSBjbGFzcyB2ZXJzaW9uIGRvZXMgbm90aGluZywgcmV0dXJucyBlb2YoKS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGludF90eXBlIAorICAgICAgdW5kZXJmbG93KCkKKyAgICAgIHsgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZldGNoZXMgbW9yZSBkYXRhIGZyb20gdGhlIGNvbnRyb2xsZWQgc2VxdWVuY2UuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGZpcnN0IGNoYXJhY3RlciBmcm9tIHRoZSA8ZW0+cGVuZGluZyBzZXF1ZW5jZTwvZW0+LgorICAgICAgICoKKyAgICAgICAqICBJbmZvcm1hbGx5LCB0aGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgQGMgdW5kZXJmbG93KCksCisgICAgICAgKiAgYW5kIGluIGZhY3QgaXMgcmVxdWlyZWQgdG8gY2FsbCB0aGF0IGZ1bmN0aW9uLiAgSXQgYWxzbyByZXR1cm5zCisgICAgICAgKiAgdGhlIG5ldyBjaGFyYWN0ZXIsIGxpa2UgQGMgdW5kZXJmbG93KCkgZG9lcy4gIEhvd2V2ZXIsIHRoaXMKKyAgICAgICAqICBmdW5jdGlvbiBhbHNvIG1vdmVzIHRoZSByZWFkIHBvc2l0aW9uIGZvcndhcmQgYnkgb25lLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaW50X3R5cGUgCisgICAgICB1ZmxvdygpIAorICAgICAgeworCWludF90eXBlIF9fcmV0ID0gdHJhaXRzX3R5cGU6OmVvZigpOworCWNvbnN0IGJvb2wgX190ZXN0ZW9mID0gdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKHRoaXMtPnVuZGVyZmxvdygpLCAKKwkJCQkJCQlfX3JldCk7CisJaWYgKCFfX3Rlc3Rlb2YpCisJICB7CisJICAgIF9fcmV0ID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworCSAgICB0aGlzLT5nYnVtcCgxKTsKKwkgIH0KKwlyZXR1cm4gX19yZXQ7ICAgIAorICAgICAgfQorCisgICAgICAvLyBbMjcuNS4yLjQuNF0gcHV0YmFjaworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUcmllcyB0byBiYWNrIHVwIHRoZSBpbnB1dCBzZXF1ZW5jZS4KKyAgICAgICAqICBAcGFyYW0gIF9fYyAgVGhlIGNoYXJhY3RlciB0byBiZSBpbnNlcnRlZCBiYWNrIGludG8gdGhlIHNlcXVlbmNlLgorICAgICAgICogIEByZXR1cm4gIGVvZigpIG9uIGZhaWx1cmUsIDxlbT5zb21lIG90aGVyIHZhbHVlPC9lbT4gb24gc3VjY2VzcworICAgICAgICogIEBwb3N0ICBUaGUgY29uc3RyYWludHMgb2YgQGMgZ3B0cigpLCBAYyBlYmFjaygpLCBhbmQgQGMgcHB0cigpCisgICAgICAgKiAgICAgICAgIGFyZSB0aGUgc2FtZSBhcyBmb3IgQGMgdW5kZXJmbG93KCkuCisgICAgICAgKgorICAgICAgICogIEBub3RlICBCYXNlIGNsYXNzIHZlcnNpb24gZG9lcyBub3RoaW5nLCByZXR1cm5zIGVvZigpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaW50X3R5cGUgCisgICAgICBwYmFja2ZhaWwoaW50X3R5cGUgX19jICA9IHRyYWl0c190eXBlOjplb2YoKSkKKyAgICAgIHsgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsgfQorCisgICAgICAvLyBQdXQgYXJlYToKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTXVsdGlwbGUgY2hhcmFjdGVyIGluc2VydGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgQSBidWZmZXIgYXJlYS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB3cml0ZS4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbi4KKyAgICAgICAqCisgICAgICAgKiAgV3JpdGVzIEBhIF9fc1swXSB0aHJvdWdoIEBhIF9fc1tfX24tMV0gdG8gdGhlIG91dHB1dCBzZXF1ZW5jZSwgYXMgaWYKKyAgICAgICAqICBieSBAYyBzcHV0YygpLiAgU3RvcHMgd2hlbiBlaXRoZXIgQGEgbiBjaGFyYWN0ZXJzIGhhdmUgYmVlbgorICAgICAgICogIGNvcGllZCwgb3Igd2hlbiBAYyBzcHV0YygpIHdvdWxkIHJldHVybiBAYyB0cmFpdHM6OmVvZigpLgorICAgICAgICoKKyAgICAgICAqICBJdCBpcyBleHBlY3RlZCB0aGF0IGRlcml2ZWQgY2xhc3NlcyBwcm92aWRlIGEgbW9yZSBlZmZpY2llbnQKKyAgICAgICAqICBpbXBsZW1lbnRhdGlvbiBieSBvdmVycmlkaW5nIHRoaXMgZGVmaW5pdGlvbi4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHN0cmVhbXNpemUgCisgICAgICB4c3B1dG4oY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdW1lcyBkYXRhIGZyb20gdGhlIGJ1ZmZlcjsgd3JpdGVzIHRvIHRoZQorICAgICAgICogICAgICAgICAgY29udHJvbGxlZCBzZXF1ZW5jZS4KKyAgICAgICAqICBAcGFyYW0gIF9fYyAgQW4gYWRkaXRpb25hbCBjaGFyYWN0ZXIgdG8gY29uc3VtZS4KKyAgICAgICAqICBAcmV0dXJuICBlb2YoKSB0byBpbmRpY2F0ZSBmYWlsdXJlLCBzb21ldGhpbmcgZWxzZSAodXN1YWxseQorICAgICAgICogICAgICAgICAgIEBhIF9fYywgb3Igbm90X2VvZigpKQorICAgICAgICoKKyAgICAgICAqICBJbmZvcm1hbGx5LCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyCisgICAgICAgKiAgaXMgZnVsbCAob3IgZG9lcyBub3QgZXhpc3QsIGFzIGJ1ZmZlcmluZyBuZWVkIG5vdCBhY3R1YWxseQorICAgICAgICogIGJlIGRvbmUpLiAgSWYgYSBidWZmZXIgZXhpc3RzLCBpdCBpcyBAYSBjb25zdW1lZCwgd2l0aAorICAgICAgICogIDxlbT5zb21lIGVmZmVjdDwvZW0+IG9uIHRoZSBjb250cm9sbGVkIHNlcXVlbmNlLgorICAgICAgICogIChUeXBpY2FsbHksIHRoZSBidWZmZXIgaXMgd3JpdHRlbiBvdXQgdG8gdGhlIHNlcXVlbmNlCisgICAgICAgKiAgdmVyYmF0aW0uKSAgSW4gZWl0aGVyIGNhc2UsIHRoZSBjaGFyYWN0ZXIgQGEgYyBpcyBhbHNvCisgICAgICAgKiAgd3JpdHRlbiBvdXQsIGlmIEBhIF9fYyBpcyBub3QgQGMgZW9mKCkuCisgICAgICAgKgorICAgICAgICogIEZvciBhIGZvcm1hbCBkZWZpbml0aW9uIG9mIHRoaXMgZnVuY3Rpb24sIHNlZSBhIGdvb2QgdGV4dAorICAgICAgICogIHN1Y2ggYXMgTGFuZ2VyICYgS3JlZnQsIG9yIFsyNy41LjIuNC41XS8zLTcuCisgICAgICAgKgorICAgICAgICogIEEgZnVuY3Rpb25pbmcgb3V0cHV0IHN0cmVhbWJ1ZiBjYW4gYmUgY3JlYXRlZCBieSBvdmVycmlkaW5nIG9ubHkKKyAgICAgICAqICB0aGlzIGZ1bmN0aW9uIChubyBidWZmZXIgYXJlYSB3aWxsIGJlIHVzZWQpLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgQmFzZSBjbGFzcyB2ZXJzaW9uIGRvZXMgbm90aGluZywgcmV0dXJucyBlb2YoKS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGludF90eXBlIAorICAgICAgb3ZlcmZsb3coaW50X3R5cGUgX19jICA9IHRyYWl0c190eXBlOjplb2YoKSkKKyAgICAgIHsgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsgfQorCisjaWYgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyAgICAvLyBBbm5leCBELjYKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRvc3NlcyBhIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgQWR2YW5jZXMgdGhlIHJlYWQgcG9pbnRlciwgaWdub3JpbmcgdGhlIGNoYXJhY3RlciB0aGF0IHdvdWxkIGhhdmUKKyAgICAgICAqICBiZWVuIHJlYWQuCisgICAgICAgKgorICAgICAgICogIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvbWwvbGlic3RkYysrLzIwMDItMDUvbXNnMDAxNjguaHRtbAorICAgICAgICovCisgICAgICB2b2lkIAorICAgICAgc3Rvc3NjKCkgCisgICAgICB7CisJaWYgKHRoaXMtPmdwdHIoKSA8IHRoaXMtPmVncHRyKCkpIAorCSAgdGhpcy0+Z2J1bXAoMSk7CisJZWxzZSAKKwkgIHRoaXMtPnVmbG93KCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gQWxzbyB1c2VkIGJ5IHNwZWNpYWxpemF0aW9ucyBmb3IgY2hhciBhbmQgd2NoYXJfdCBpbiBzcmMuCisgICAgICB2b2lkIAorICAgICAgX19zYWZlX2didW1wKHN0cmVhbXNpemUgX19uKSB7IF9NX2luX2N1ciArPSBfX247IH0KKworICAgICAgdm9pZAorICAgICAgX19zYWZlX3BidW1wKHN0cmVhbXNpemUgX19uKSB7IF9NX291dF9jdXIgKz0gX19uOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gU2lkZSBlZmZlY3Qgb2YgRFIgNTAuIAorICAgICAgYmFzaWNfc3RyZWFtYnVmKGNvbnN0IGJhc2ljX3N0cmVhbWJ1ZiYgX19zYikKKyAgICAgIDogX01faW5fYmVnKF9fc2IuX01faW5fYmVnKSwgX01faW5fY3VyKF9fc2IuX01faW5fY3VyKSwgCisgICAgICBfTV9pbl9lbmQoX19zYi5fTV9pbl9lbmQpLCBfTV9vdXRfYmVnKF9fc2IuX01fb3V0X2JlZyksIAorICAgICAgX01fb3V0X2N1cihfX3NiLl9NX291dF9jdXIpLCBfTV9vdXRfZW5kKF9fc2IuX01fb3V0X2N1ciksCisgICAgICBfTV9idWZfbG9jYWxlKF9fc2IuX01fYnVmX2xvY2FsZSkgCisgICAgICB7IH0KKworICAgICAgYmFzaWNfc3RyZWFtYnVmJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGJhc2ljX3N0cmVhbWJ1ZiYpIHsgcmV0dXJuICp0aGlzOyB9OworICAgIH07CisKKyAgLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZGVjbGFyYXRpb25zLCBkZWZpbmVkIGluIHNyYy9zdHJlYW1idWYuY2MuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJlYW1zaXplCisgICAgX19jb3B5X3N0cmVhbWJ1ZnNfZW9mKGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPiogX19zYmluLAorCQkJICBiYXNpY19zdHJlYW1idWY8Y2hhcj4qIF9fc2JvdXQsIGJvb2wmIF9faW5lb2YpOworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICBzdHJlYW1zaXplCisgICAgX19jb3B5X3N0cmVhbWJ1ZnNfZW9mKGJhc2ljX3N0cmVhbWJ1Zjx3Y2hhcl90PiogX19zYmluLAorCQkJICBiYXNpY19zdHJlYW1idWY8d2NoYXJfdD4qIF9fc2JvdXQsIGJvb2wmIF9faW5lb2YpOworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2luY2x1ZGUgPGJpdHMvc3RyZWFtYnVmLnRjYz4KKworI2VuZGlmIC8qIF9HTElCQ1hYX1NUUkVBTUJVRiAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zdHJpbmcgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3N0cmluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2FlM2I2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zdHJpbmcKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29tcG9uZW50cyBmb3IgbWFuaXB1bGF0aW5nIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3N0cmluZworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIxICBTdHJpbmdzIGxpYnJhcnkKKy8vCisKKyNpZm5kZWYgX0dMSUJDWFhfU1RSSU5HCisjZGVmaW5lIF9HTElCQ1hYX1NUUklORwkxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdHJpbmdmd2QuaD4KKyNpbmNsdWRlIDxiaXRzL2NoYXJfdHJhaXRzLmg+ICAvLyBOQjogSW4gdHVybiBpbmNsdWRlcyBzdGxfYWxnb2Jhc2UuaAorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9jcHBfdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZWZ3ZC5oPiAgICAvLyBGb3Igb3BlcmF0b3JzID4+LCA8PCwgYW5kIGdldGxpbmUuCisjaW5jbHVkZSA8Yml0cy9vc3RyZWFtX2luc2VydC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX2Z1bmNzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPiAvLyBGb3IgbGVzcworI2luY2x1ZGUgPGV4dC9udW1lcmljX3RyYWl0cy5oPiAKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPiAKKyNpbmNsdWRlIDxiaXRzL3JhbmdlX2FjY2Vzcy5oPgorI2luY2x1ZGUgPGJpdHMvYmFzaWNfc3RyaW5nLmg+CisjaW5jbHVkZSA8Yml0cy9iYXNpY19zdHJpbmcudGNjPiAKKworI2VuZGlmIC8qIF9HTElCQ1hYX1NUUklORyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zeXN0ZW1fZXJyb3IgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3N5c3RlbV9lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjNiNzRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zeXN0ZW1fZXJyb3IKQEAgLTAsMCArMSwzNzggQEAKKy8vIDxzeXN0ZW1fZXJyb3I+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3N5c3RlbV9lcnJvcgorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9TWVNURU1fRVJST1IKKyNkZWZpbmUgX0dMSUJDWFhfU1lTVEVNX0VSUk9SIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9lcnJvcl9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgY2xhc3MgZXJyb3JfY29kZTsKKyAgY2xhc3MgZXJyb3JfY29uZGl0aW9uOworICBjbGFzcyBlcnJvcl9jYXRlZ29yeTsKKyAgY2xhc3Mgc3lzdGVtX2Vycm9yOworCisgIC8vLyBpc19lcnJvcl9jb2RlX2VudW0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19lcnJvcl9jb2RlX2VudW0gOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgLy8vIGlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZXJyb3JfY29uZGl0aW9uX2VudW0gOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PiAKKyAgICBzdHJ1Y3QgaXNfZXJyb3JfY29uZGl0aW9uX2VudW08ZXJyYz4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisKKyAgLy8vIGVycm9yX2NhdGVnb3J5CisgIGNsYXNzIGVycm9yX2NhdGVnb3J5CisgIHsKKyAgcHJvdGVjdGVkOgorICAgIGVycm9yX2NhdGVnb3J5KCkgbm9leGNlcHQ7CisKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfmVycm9yX2NhdGVnb3J5KCkgbm9leGNlcHQ7CisKKyAgICBlcnJvcl9jYXRlZ29yeShjb25zdCBlcnJvcl9jYXRlZ29yeSYpID0gZGVsZXRlOworICAgIGVycm9yX2NhdGVnb3J5JiBvcGVyYXRvcj0oY29uc3QgZXJyb3JfY2F0ZWdvcnkmKSA9IGRlbGV0ZTsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciogCisgICAgbmFtZSgpIGNvbnN0IG5vZXhjZXB0ID0gMDsKKworICAgIHZpcnR1YWwgc3RyaW5nIAorICAgIG1lc3NhZ2UoaW50KSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGVycm9yX2NvbmRpdGlvbgorICAgIGRlZmF1bHRfZXJyb3JfY29uZGl0aW9uKGludCBfX2kpIGNvbnN0IG5vZXhjZXB0OworCisgICAgdmlydHVhbCBib29sIAorICAgIGVxdWl2YWxlbnQoaW50IF9faSwgY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX2NvbmQpIGNvbnN0IG5vZXhjZXB0OworCisgICAgdmlydHVhbCBib29sIAorICAgIGVxdWl2YWxlbnQoY29uc3QgZXJyb3JfY29kZSYgX19jb2RlLCBpbnQgX19pKSBjb25zdCBub2V4Y2VwdDsKKworICAgIGJvb2wgCisgICAgb3BlcmF0b3I8KGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX290aGVyKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGxlc3M8Y29uc3QgZXJyb3JfY2F0ZWdvcnkqPigpKHRoaXMsICZfX290aGVyKTsgfQorCisgICAgYm9vbCAKKyAgICBvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX290aGVyKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHRoaXMgPT0gJl9fb3RoZXI7IH0KKworICAgIGJvb2wgCisgICAgb3BlcmF0b3IhPShjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19vdGhlcikgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiB0aGlzICE9ICZfX290aGVyOyB9CisgIH07CisKKyAgLy8gRFIgODkwLgorICBfR0xJQkNYWF9DT05TVCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgc3lzdGVtX2NhdGVnb3J5KCkgbm9leGNlcHQ7CisgIF9HTElCQ1hYX0NPTlNUIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBnZW5lcmljX2NhdGVnb3J5KCkgbm9leGNlcHQ7CisKKyAgZXJyb3JfY29kZSBtYWtlX2Vycm9yX2NvZGUoZXJyYykgbm9leGNlcHQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNoOworCisgIC8vLyBlcnJvcl9jb2RlCisgIC8vIEltcGxlbWVudGF0aW9uLXNwZWNpZmljIGVycm9yIGlkZW50aWZpY2F0aW9uCisgIHN0cnVjdCBlcnJvcl9jb2RlCisgIHsKKyAgICBlcnJvcl9jb2RlKCkgbm9leGNlcHQKKyAgICA6IF9NX3ZhbHVlKDApLCBfTV9jYXQoJnN5c3RlbV9jYXRlZ29yeSgpKSB7IH0KKworICAgIGVycm9yX2NvZGUoaW50IF9fdiwgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fY2F0KSBub2V4Y2VwdAorICAgIDogX01fdmFsdWUoX192KSwgX01fY2F0KCZfX2NhdCkgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXJyb3JDb2RlRW51bSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgZW5hYmxlX2lmPGlzX2Vycm9yX2NvZGVfZW51bTxfRXJyb3JDb2RlRW51bT46OnZhbHVlPjo6dHlwZT4KKyAgICAgIGVycm9yX2NvZGUoX0Vycm9yQ29kZUVudW0gX19lKSBub2V4Y2VwdAorICAgICAgeyAqdGhpcyA9IG1ha2VfZXJyb3JfY29kZShfX2UpOyB9CisKKyAgICB2b2lkIAorICAgIGFzc2lnbihpbnQgX192LCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19jYXQpIG5vZXhjZXB0CisgICAgeworICAgICAgX01fdmFsdWUgPSBfX3Y7CisgICAgICBfTV9jYXQgPSAmX19jYXQ7IAorICAgIH0KKworICAgIHZvaWQgCisgICAgY2xlYXIoKSBub2V4Y2VwdAorICAgIHsgYXNzaWduKDAsIHN5c3RlbV9jYXRlZ29yeSgpKTsgfQorCisgICAgLy8gRFIgODA0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9FcnJvckNvZGVFbnVtPgorICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2Vycm9yX2NvZGVfZW51bTxfRXJyb3JDb2RlRW51bT46OnZhbHVlLAorCQkJIGVycm9yX2NvZGUmPjo6dHlwZQorICAgICAgb3BlcmF0b3I9KF9FcnJvckNvZGVFbnVtIF9fZSkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuICp0aGlzID0gbWFrZV9lcnJvcl9jb2RlKF9fZSk7IH0KKworICAgIGludAorICAgIHZhbHVlKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gX01fdmFsdWU7IH0KKyAgICAgIAorICAgIGNvbnN0IGVycm9yX2NhdGVnb3J5JiAgCisgICAgY2F0ZWdvcnkoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiAqX01fY2F0OyB9CisKKyAgICBlcnJvcl9jb25kaXRpb24gCisgICAgZGVmYXVsdF9lcnJvcl9jb25kaXRpb24oKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHN0cmluZyAKKyAgICBtZXNzYWdlKCkgY29uc3QKKyAgICB7IHJldHVybiBjYXRlZ29yeSgpLm1lc3NhZ2UodmFsdWUoKSk7IH0KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX3ZhbHVlICE9IDAgPyB0cnVlIDogZmFsc2U7IH0KKworICAgIC8vIERSIDgwNC4KKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgaGFzaDxlcnJvcl9jb2RlPjsKKworICAgIGludCAgICAgICAgICAgIAkJX01fdmFsdWU7CisgICAgY29uc3QgZXJyb3JfY2F0ZWdvcnkqIAlfTV9jYXQ7CisgIH07CisKKyAgLy8gMTkuNC4yLjYgbm9uLW1lbWJlciBmdW5jdGlvbnMKKyAgaW5saW5lIGVycm9yX2NvZGUKKyAgbWFrZV9lcnJvcl9jb2RlKGVycmMgX19lKSBub2V4Y2VwdAorICB7IHJldHVybiBlcnJvcl9jb2RlKHN0YXRpY19jYXN0PGludD4oX19lKSwgZ2VuZXJpY19jYXRlZ29yeSgpKTsgfQorCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yPChjb25zdCBlcnJvcl9jb2RlJiBfX2xocywgY29uc3QgZXJyb3JfY29kZSYgX19yaHMpIG5vZXhjZXB0CisgIHsgCisgICAgcmV0dXJuIChfX2xocy5jYXRlZ29yeSgpIDwgX19yaHMuY2F0ZWdvcnkoKQorCSAgICB8fCAoX19saHMuY2F0ZWdvcnkoKSA9PSBfX3Jocy5jYXRlZ29yeSgpCisJCSYmIF9fbGhzLnZhbHVlKCkgPCBfX3Jocy52YWx1ZSgpKSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBlcnJvcl9jb2RlJiBfX2UpCisgICAgeyByZXR1cm4gKF9fb3MgPDwgX19lLmNhdGVnb3J5KCkubmFtZSgpIDw8ICc6JyA8PCBfX2UudmFsdWUoKSk7IH0KKworICBlcnJvcl9jb25kaXRpb24gbWFrZV9lcnJvcl9jb25kaXRpb24oZXJyYykgbm9leGNlcHQ7CisKKyAgLy8vIGVycm9yX2NvbmRpdGlvbgorICAvLyBQb3J0YWJsZSBlcnJvciBpZGVudGlmaWNhdGlvbgorICBzdHJ1Y3QgZXJyb3JfY29uZGl0aW9uIAorICB7CisgICAgZXJyb3JfY29uZGl0aW9uKCkgbm9leGNlcHQKKyAgICA6IF9NX3ZhbHVlKDApLCBfTV9jYXQoJmdlbmVyaWNfY2F0ZWdvcnkoKSkgeyB9CisKKyAgICBlcnJvcl9jb25kaXRpb24oaW50IF9fdiwgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fY2F0KSBub2V4Y2VwdAorICAgIDogX01fdmFsdWUoX192KSwgX01fY2F0KCZfX2NhdCkgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXJyb3JDb25kaXRpb25FbnVtLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJIGVuYWJsZV9pZjxpc19lcnJvcl9jb25kaXRpb25fZW51bTxfRXJyb3JDb25kaXRpb25FbnVtPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgZXJyb3JfY29uZGl0aW9uKF9FcnJvckNvbmRpdGlvbkVudW0gX19lKSBub2V4Y2VwdAorICAgICAgeyAqdGhpcyA9IG1ha2VfZXJyb3JfY29uZGl0aW9uKF9fZSk7IH0KKworICAgIHZvaWQKKyAgICBhc3NpZ24oaW50IF9fdiwgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fY2F0KSBub2V4Y2VwdAorICAgIHsKKyAgICAgIF9NX3ZhbHVlID0gX192OworICAgICAgX01fY2F0ID0gJl9fY2F0OworICAgIH0KKworICAgIC8vIERSIDgwNC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXJyb3JDb25kaXRpb25FbnVtPgorICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtCisJCQkgPF9FcnJvckNvbmRpdGlvbkVudW0+Ojp2YWx1ZSwgZXJyb3JfY29uZGl0aW9uJj46OnR5cGUKKyAgICAgIG9wZXJhdG9yPShfRXJyb3JDb25kaXRpb25FbnVtIF9fZSkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuICp0aGlzID0gbWFrZV9lcnJvcl9jb25kaXRpb24oX19lKTsgfQorCisgICAgdm9pZCAKKyAgICBjbGVhcigpIG5vZXhjZXB0CisgICAgeyBhc3NpZ24oMCwgZ2VuZXJpY19jYXRlZ29yeSgpKTsgfQorCisgICAgLy8gMTkuNC4zLjQgb2JzZXJ2ZXJzCisgICAgaW50CisgICAgdmFsdWUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBfTV92YWx1ZTsgfQorCisgICAgY29uc3QgZXJyb3JfY2F0ZWdvcnkmCisgICAgY2F0ZWdvcnkoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiAqX01fY2F0OyB9CisKKyAgICBzdHJpbmcgCisgICAgbWVzc2FnZSgpIGNvbnN0CisgICAgeyByZXR1cm4gY2F0ZWdvcnkoKS5tZXNzYWdlKHZhbHVlKCkpOyB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV92YWx1ZSAhPSAwID8gdHJ1ZSA6IGZhbHNlOyB9CisKKyAgICAvLyBEUiA4MDQuCisgIHByaXZhdGU6CisgICAgaW50IAkJCV9NX3ZhbHVlOworICAgIGNvbnN0IGVycm9yX2NhdGVnb3J5KiAJX01fY2F0OworICB9OworCisgIC8vIDE5LjQuMy42IG5vbi1tZW1iZXIgZnVuY3Rpb25zCisgIGlubGluZSBlcnJvcl9jb25kaXRpb24KKyAgbWFrZV9lcnJvcl9jb25kaXRpb24oZXJyYyBfX2UpIG5vZXhjZXB0CisgIHsgcmV0dXJuIGVycm9yX2NvbmRpdGlvbihzdGF0aWNfY2FzdDxpbnQ+KF9fZSksIGdlbmVyaWNfY2F0ZWdvcnkoKSk7IH0KKworICBpbmxpbmUgYm9vbCAKKyAgb3BlcmF0b3I8KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19saHMsCisJICAgIGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19yaHMpIG5vZXhjZXB0CisgIHsKKyAgICByZXR1cm4gKF9fbGhzLmNhdGVnb3J5KCkgPCBfX3Jocy5jYXRlZ29yeSgpCisJICAgIHx8IChfX2xocy5jYXRlZ29yeSgpID09IF9fcmhzLmNhdGVnb3J5KCkKKwkJJiYgX19saHMudmFsdWUoKSA8IF9fcmhzLnZhbHVlKCkpKTsKKyAgfQorCisgIC8vIDE5LjQuNCBDb21wYXJpc29uIG9wZXJhdG9ycworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NvZGUmIF9fbGhzLCBjb25zdCBlcnJvcl9jb2RlJiBfX3Jocykgbm9leGNlcHQKKyAgeyByZXR1cm4gKF9fbGhzLmNhdGVnb3J5KCkgPT0gX19yaHMuY2F0ZWdvcnkoKQorCSAgICAmJiBfX2xocy52YWx1ZSgpID09IF9fcmhzLnZhbHVlKCkpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3I9PShjb25zdCBlcnJvcl9jb2RlJiBfX2xocywgY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX3Jocykgbm9leGNlcHQKKyAgeworICAgIHJldHVybiAoX19saHMuY2F0ZWdvcnkoKS5lcXVpdmFsZW50KF9fbGhzLnZhbHVlKCksIF9fcmhzKQorCSAgICB8fCBfX3Jocy5jYXRlZ29yeSgpLmVxdWl2YWxlbnQoX19saHMsIF9fcmhzLnZhbHVlKCkpKTsKKyAgfQorCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yPT0oY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX2xocywgY29uc3QgZXJyb3JfY29kZSYgX19yaHMpIG5vZXhjZXB0CisgIHsKKyAgICByZXR1cm4gKF9fcmhzLmNhdGVnb3J5KCkuZXF1aXZhbGVudChfX3Jocy52YWx1ZSgpLCBfX2xocykKKwkgICAgfHwgX19saHMuY2F0ZWdvcnkoKS5lcXVpdmFsZW50KF9fcmhzLCBfX2xocy52YWx1ZSgpKSk7CisgIH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19saHMsCisJICAgICBjb25zdCBlcnJvcl9jb25kaXRpb24mIF9fcmhzKSBub2V4Y2VwdAorICB7CisgICAgcmV0dXJuIChfX2xocy5jYXRlZ29yeSgpID09IF9fcmhzLmNhdGVnb3J5KCkKKwkgICAgJiYgX19saHMudmFsdWUoKSA9PSBfX3Jocy52YWx1ZSgpKTsKKyAgfQorCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yIT0oY29uc3QgZXJyb3JfY29kZSYgX19saHMsIGNvbnN0IGVycm9yX2NvZGUmIF9fcmhzKSBub2V4Y2VwdAorICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yIT0oY29uc3QgZXJyb3JfY29kZSYgX19saHMsIGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19yaHMpIG5vZXhjZXB0CisgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3IhPShjb25zdCBlcnJvcl9jb25kaXRpb24mIF9fbGhzLCBjb25zdCBlcnJvcl9jb2RlJiBfX3Jocykgbm9leGNlcHQKKyAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvciE9KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19saHMsCisJICAgICBjb25zdCBlcnJvcl9jb25kaXRpb24mIF9fcmhzKSBub2V4Y2VwdAorICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisKKyAgLyoqIAorICAgKiAgQGJyaWVmIFRocm93biB0byBpbmRpY2F0ZSBlcnJvciBjb2RlIG9mIHVuZGVybHlpbmcgc3lzdGVtLgorICAgKgorICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgKi8KKyAgY2xhc3Mgc3lzdGVtX2Vycm9yIDogcHVibGljIHN0ZDo6cnVudGltZV9lcnJvcgorICB7CisgIHByaXZhdGU6CisgICAgZXJyb3JfY29kZSAJX01fY29kZTsKKworICBwdWJsaWM6CisgICAgc3lzdGVtX2Vycm9yKGVycm9yX2NvZGUgX19lYyA9IGVycm9yX2NvZGUoKSkKKyAgICA6IHJ1bnRpbWVfZXJyb3IoX19lYy5tZXNzYWdlKCkpLCBfTV9jb2RlKF9fZWMpIHsgfQorCisgICAgc3lzdGVtX2Vycm9yKGVycm9yX2NvZGUgX19lYywgY29uc3Qgc3RyaW5nJiBfX3doYXQpCisgICAgOiBydW50aW1lX2Vycm9yKF9fd2hhdCArICI6ICIgKyBfX2VjLm1lc3NhZ2UoKSksIF9NX2NvZGUoX19lYykgeyB9CisKKyAgICAvKgorICAgICAqIFRPRE86IEFkZCBjb25zdCBjaGFyKiBjdG9ycyB0byBhbGwgZXhjZXB0aW9ucy4KKyAgICAgKgorICAgICAqIHN5c3RlbV9lcnJvcihlcnJvcl9jb2RlIF9fZWMsIGNvbnN0IGNoYXIqIF9fd2hhdCkKKyAgICAgKiA6IHJ1bnRpbWVfZXJyb3IoX193aGF0ICsgKCI6ICIgKyBfX2VjLm1lc3NhZ2UoKSkpLCBfTV9jb2RlKF9fZWMpIHsgfQorICAgICAqCisgICAgICogc3lzdGVtX2Vycm9yKGludCBfX3YsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX2VjYXQsIGNvbnN0IGNoYXIqIF9fd2hhdCkKKyAgICAgKiA6IHJ1bnRpbWVfZXJyb3IoX193aGF0ICsgKCI6ICIgKyBfX2VjLm1lc3NhZ2UoKSkpLAorICAgICAqICAgX01fY29kZShlcnJvcl9jb2RlKF9fdiwgX19lY2F0KSkgeyB9CisgICAgICovCisKKyAgICBzeXN0ZW1fZXJyb3IoaW50IF9fdiwgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fZWNhdCkKKyAgICA6IHJ1bnRpbWVfZXJyb3IoZXJyb3JfY29kZShfX3YsIF9fZWNhdCkubWVzc2FnZSgpKSwKKyAgICAgIF9NX2NvZGUoX192LCBfX2VjYXQpIHsgfQorCisgICAgc3lzdGVtX2Vycm9yKGludCBfX3YsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX2VjYXQsIGNvbnN0IHN0cmluZyYgX193aGF0KQorICAgIDogcnVudGltZV9lcnJvcihfX3doYXQgKyAiOiAiICsgZXJyb3JfY29kZShfX3YsIF9fZWNhdCkubWVzc2FnZSgpKSwKKyAgICAgIF9NX2NvZGUoX192LCBfX2VjYXQpIHsgfQorCisgICAgdmlydHVhbCB+c3lzdGVtX2Vycm9yKCkgbm9leGNlcHQ7CisKKyAgICBjb25zdCBlcnJvcl9jb2RlJiAKKyAgICBjb2RlKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gX01fY29kZTsgfQorICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpZm5kZWYgX0dMSUJDWFhfQ09NUEFUSUJJTElUWV9DWFgwWAorCisjaW5jbHVkZSA8Yml0cy9mdW5jdGlvbmFsX2hhc2guaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIERSIDExODIuCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIGVycm9yX2NvZGUuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxlcnJvcl9jb2RlPgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgZXJyb3JfY29kZT4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgZXJyb3JfY29kZSYgX19lKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworCWNvbnN0IHNpemVfdCBfX3RtcCA9IHN0ZDo6X0hhc2hfaW1wbDo6aGFzaChfX2UuX01fdmFsdWUpOworCXJldHVybiBzdGQ6Ol9IYXNoX2ltcGw6Ol9faGFzaF9jb21iaW5lKF9fZS5fTV9jYXQsIF9fdG1wKTsKKyAgICAgIH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9DT01QQVRJQklMSVRZX0NYWDBYCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfU1lTVEVNX0VSUk9SCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RnbWF0aC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90Z21hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDllNTM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90Z21hdGguaApAQCAtMCwwICsxLDQyIEBACisvLyAtKi0gQysrIC0qLSBjb21wYXRpYmlsaXR5IGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRnbWF0aC5oCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgaW5jbHVkZSA8Y3RnbWF0aD4KKyNlbHNlCisjIGlmIF9HTElCQ1hYX0hBVkVfVEdNQVRIX0gKKyMgIGluY2x1ZGVfbmV4dCA8dGdtYXRoLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9UR01BVEhfSAorI2RlZmluZSBfR0xJQkNYWF9UR01BVEhfSCAxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90aHJlYWQgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RocmVhZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTdlMjFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90aHJlYWQKQEAgLTAsMCArMSwzMDIgQEAKKy8vIDx0aHJlYWQ+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3RocmVhZAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9USFJFQUQKKyNkZWZpbmUgX0dMSUJDWFhfVEhSRUFEIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGlvbmFsX2hhc2guaD4KKyNpbmNsdWRlIDxiaXRzL2d0aHIuaD4KKworI2lmIGRlZmluZWQoX0dMSUJDWFhfSEFTX0dUSFJFQURTKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMSkKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgdGhyZWFkcyBUaHJlYWRzCisgICAqIEBpbmdyb3VwIGNvbmN1cnJlbmN5CisgICAqCisgICAqIENsYXNzZXMgZm9yIHRocmVhZCBzdXBwb3J0LgorICAgKiBAeworICAgKi8KKworICAvLy8gdGhyZWFkCisgIGNsYXNzIHRocmVhZAorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9fZ3RocmVhZF90CQkJbmF0aXZlX2hhbmRsZV90eXBlOworICAgIHN0cnVjdCBfSW1wbF9iYXNlOworICAgIHR5cGVkZWYgc2hhcmVkX3B0cjxfSW1wbF9iYXNlPglfX3NoYXJlZF9iYXNlX3R5cGU7CisKKyAgICAvLy8gdGhyZWFkOjppZAorICAgIGNsYXNzIGlkCisgICAgeworICAgICAgbmF0aXZlX2hhbmRsZV90eXBlCV9NX3RocmVhZDsKKworICAgIHB1YmxpYzoKKyAgICAgIGlkKCkgbm9leGNlcHQgOiBfTV90aHJlYWQoKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGlkKG5hdGl2ZV9oYW5kbGVfdHlwZSBfX2lkKSA6IF9NX3RocmVhZChfX2lkKSB7IH0KKworICAgIHByaXZhdGU6CisgICAgICBmcmllbmQgY2xhc3MgdGhyZWFkOworICAgICAgZnJpZW5kIGNsYXNzIGhhc2g8dGhyZWFkOjppZD47CisKKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KHRocmVhZDo6aWQgX194LCB0aHJlYWQ6OmlkIF9feSkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fZ3RocmVhZF9lcXVhbChfX3guX01fdGhyZWFkLCBfX3kuX01fdGhyZWFkKTsgfQorCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I8KHRocmVhZDo6aWQgX194LCB0aHJlYWQ6OmlkIF9feSkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9feC5fTV90aHJlYWQgPCBfX3kuX01fdGhyZWFkOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKwlmcmllbmQgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX291dCwgdGhyZWFkOjppZCBfX2lkKTsKKyAgICB9OworCisgICAgLy8gU2ltcGxlIGJhc2UgdHlwZSB0aGF0IHRoZSB0ZW1wbGF0aXplZCwgZGVyaXZlZCBjbGFzcyBjb250YWluaW5nCisgICAgLy8gYW4gYXJiaXRyYXJ5IGZ1bmN0b3IgY2FuIGJlIGNvbnZlcnRlZCB0byBhbmQgY2FsbGVkLgorICAgIHN0cnVjdCBfSW1wbF9iYXNlCisgICAgeworICAgICAgX19zaGFyZWRfYmFzZV90eXBlCV9NX3RoaXNfcHRyOworCisgICAgICBpbmxpbmUgdmlydHVhbCB+X0ltcGxfYmFzZSgpOworCisgICAgICB2aXJ0dWFsIHZvaWQgX01fcnVuKCkgPSAwOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2FsbGFibGU+CisgICAgICBzdHJ1Y3QgX0ltcGwgOiBwdWJsaWMgX0ltcGxfYmFzZQorICAgICAgeworCV9DYWxsYWJsZQkJX01fZnVuYzsKKworCV9JbXBsKF9DYWxsYWJsZSYmIF9fZikgOiBfTV9mdW5jKHN0ZDo6Zm9yd2FyZDxfQ2FsbGFibGU+KF9fZikpCisJeyB9CisKKwl2b2lkCisJX01fcnVuKCkgeyBfTV9mdW5jKCk7IH0KKyAgICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICBpZAkJCQlfTV9pZDsKKworICBwdWJsaWM6CisgICAgdGhyZWFkKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAvLyAyMDk3LiAgcGFja2FnZWRfdGFzayBjb25zdHJ1Y3RvcnMgc2hvdWxkIGJlIGNvbnN0cmFpbmVkCisgICAgdGhyZWFkKHRocmVhZCYpID0gZGVsZXRlOworICAgIHRocmVhZChjb25zdCB0aHJlYWQmKSA9IGRlbGV0ZTsKKworICAgIHRocmVhZCh0aHJlYWQmJiBfX3QpIG5vZXhjZXB0CisgICAgeyBzd2FwKF9fdCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DYWxsYWJsZSwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICBleHBsaWNpdCAKKyAgICAgIHRocmVhZChfQ2FsbGFibGUmJiBfX2YsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgeworICAgICAgICBfTV9zdGFydF90aHJlYWQoX01fbWFrZV9yb3V0aW5lKHN0ZDo6X19iaW5kX3NpbXBsZSgKKyAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8X0NhbGxhYmxlPihfX2YpLAorICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpKTsKKyAgICAgIH0KKworICAgIH50aHJlYWQoKQorICAgIHsKKyAgICAgIGlmIChqb2luYWJsZSgpKQorCXN0ZDo6dGVybWluYXRlKCk7CisgICAgfQorCisgICAgdGhyZWFkJiBvcGVyYXRvcj0oY29uc3QgdGhyZWFkJikgPSBkZWxldGU7CisKKyAgICB0aHJlYWQmIG9wZXJhdG9yPSh0aHJlYWQmJiBfX3QpIG5vZXhjZXB0CisgICAgeworICAgICAgaWYgKGpvaW5hYmxlKCkpCisJc3RkOjp0ZXJtaW5hdGUoKTsKKyAgICAgIHN3YXAoX190KTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkCisgICAgc3dhcCh0aHJlYWQmIF9fdCkgbm9leGNlcHQKKyAgICB7IHN0ZDo6c3dhcChfTV9pZCwgX190Ll9NX2lkKTsgfQorCisgICAgYm9vbAorICAgIGpvaW5hYmxlKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiAhKF9NX2lkID09IGlkKCkpOyB9CisKKyAgICB2b2lkCisgICAgam9pbigpOworCisgICAgdm9pZAorICAgIGRldGFjaCgpOworCisgICAgdGhyZWFkOjppZAorICAgIGdldF9pZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01faWQ7IH0KKworICAgIC8qKiBAcHJlIHRocmVhZCBpcyBqb2luYWJsZQorICAgICAqLworICAgIG5hdGl2ZV9oYW5kbGVfdHlwZQorICAgIG5hdGl2ZV9oYW5kbGUoKQorICAgIHsgcmV0dXJuIF9NX2lkLl9NX3RocmVhZDsgfQorCisgICAgLy8gUmV0dXJucyBhIHZhbHVlIHRoYXQgaGludHMgYXQgdGhlIG51bWJlciBvZiBoYXJkd2FyZSB0aHJlYWQgY29udGV4dHMuCisgICAgc3RhdGljIHVuc2lnbmVkIGludAorICAgIGhhcmR3YXJlX2NvbmN1cnJlbmN5KCkgbm9leGNlcHQ7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkCisgICAgX01fc3RhcnRfdGhyZWFkKF9fc2hhcmVkX2Jhc2VfdHlwZSk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2FsbGFibGU+CisgICAgICBzaGFyZWRfcHRyPF9JbXBsPF9DYWxsYWJsZT4+CisgICAgICBfTV9tYWtlX3JvdXRpbmUoX0NhbGxhYmxlJiYgX19mKQorICAgICAgeworCS8vIENyZWF0ZSBhbmQgYWxsb2NhdGUgZnVsbCBkYXRhIHN0cnVjdHVyZSwgbm90IGJhc2UuCisJcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8X0ltcGw8X0NhbGxhYmxlPj4oc3RkOjpmb3J3YXJkPF9DYWxsYWJsZT4oX19mKSk7CisgICAgICB9CisgIH07CisKKyAgaW5saW5lIHRocmVhZDo6X0ltcGxfYmFzZTo6fl9JbXBsX2Jhc2UoKSA9IGRlZmF1bHQ7CisKKyAgaW5saW5lIHZvaWQKKyAgc3dhcCh0aHJlYWQmIF9feCwgdGhyZWFkJiBfX3kpIG5vZXhjZXB0CisgIHsgX194LnN3YXAoX195KTsgfQorCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yIT0odGhyZWFkOjppZCBfX3gsIHRocmVhZDo6aWQgX195KSBub2V4Y2VwdAorICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3I8PSh0aHJlYWQ6OmlkIF9feCwgdGhyZWFkOjppZCBfX3kpIG5vZXhjZXB0CisgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yPih0aHJlYWQ6OmlkIF9feCwgdGhyZWFkOjppZCBfX3kpIG5vZXhjZXB0CisgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yPj0odGhyZWFkOjppZCBfX3gsIHRocmVhZDo6aWQgX195KSBub2V4Y2VwdAorICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICAvLyBEUiA4ODkuCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHRocmVhZDo6aWQuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDx0aHJlYWQ6OmlkPgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgdGhyZWFkOjppZD4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdGhyZWFkOjppZCYgX19pZCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X0hhc2hfaW1wbDo6aGFzaChfX2lkLl9NX3RocmVhZCk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX291dCwgdGhyZWFkOjppZCBfX2lkKQorICAgIHsKKyAgICAgIGlmIChfX2lkID09IHRocmVhZDo6aWQoKSkKKwlyZXR1cm4gX19vdXQgPDwgInRocmVhZDo6aWQgb2YgYSBub24tZXhlY3V0aW5nIHRocmVhZCI7CisgICAgICBlbHNlCisJcmV0dXJuIF9fb3V0IDw8IF9faWQuX01fdGhyZWFkOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqIEBuYW1lc3BhY2Ugc3RkOjp0aGlzX3RocmVhZAorICAgKiAgQGJyaWVmIElTTyBDKysgMjAxMSBlbnRpdGllcyBzdWItbmFtZXNwYWNlIGZvciB0aHJlYWQuCisgICAqICAzMC4zLjIgTmFtZXNwYWNlIHRoaXNfdGhyZWFkLgorICAgKi8KKyAgbmFtZXNwYWNlIHRoaXNfdGhyZWFkCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8vLyBnZXRfaWQKKyAgICBpbmxpbmUgdGhyZWFkOjppZAorICAgIGdldF9pZCgpIG5vZXhjZXB0IHsgcmV0dXJuIHRocmVhZDo6aWQoX19ndGhyZWFkX3NlbGYoKSk7IH0KKworICAgIC8vLyB5aWVsZAorICAgIGlubGluZSB2b2lkCisgICAgeWllbGQoKSBub2V4Y2VwdAorICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfU0NIRURfWUlFTEQKKyAgICAgIF9fZ3RocmVhZF95aWVsZCgpOworI2VuZGlmCisgICAgfQorCisgICAgdm9pZAorICAgIF9fc2xlZXBfZm9yKGNocm9ubzo6c2Vjb25kcywgY2hyb25vOjpuYW5vc2Vjb25kcyk7CisKKyAgICAvLy8gc2xlZXBfZm9yCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZD4KKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzbGVlcF9mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19ydGltZSkKKyAgICAgIHsKKwlhdXRvIF9fcyA9IGNocm9ubzo6ZHVyYXRpb25fY2FzdDxjaHJvbm86OnNlY29uZHM+KF9fcnRpbWUpOworCWF1dG8gX19ucyA9IGNocm9ubzo6ZHVyYXRpb25fY2FzdDxjaHJvbm86Om5hbm9zZWNvbmRzPihfX3J0aW1lIC0gX19zKTsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTkFOT1NMRUVQCisJX19ndGhyZWFkX3RpbWVfdCBfX3RzID0KKwkgIHsKKwkgICAgc3RhdGljX2Nhc3Q8c3RkOjp0aW1lX3Q+KF9fcy5jb3VudCgpKSwKKwkgICAgc3RhdGljX2Nhc3Q8bG9uZz4oX19ucy5jb3VudCgpKQorCSAgfTsKKwk6Om5hbm9zbGVlcCgmX190cywgMCk7CisjZWxzZQorCV9fc2xlZXBfZm9yKF9fcywgX19ucyk7CisjZW5kaWYKKyAgICAgIH0KKworICAgIC8vLyBzbGVlcF91bnRpbAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cmF0aW9uPgorICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHNsZWVwX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYXRpbWUpCisgICAgICB7IHNsZWVwX2ZvcihfX2F0aW1lIC0gX0Nsb2NrOjpub3coKSk7IH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfQorCisgIC8vIEB9IGdyb3VwIHRocmVhZHMKKworfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9HTElCQ1hYX0hBU19HVEhSRUFEUyAmJiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9USFJFQUQKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2FycmF5IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvYXJyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliZTQxZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2FycmF5CkBAIC0wLDAgKzEsMjUxIEBACisvLyBjbGFzcyB0ZW1wbGF0ZSBhcnJheSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2FycmF5CisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0FSUkFZCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9BUlJBWSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiBBIHN0YW5kYXJkIGNvbnRhaW5lciBmb3Igc3RvcmluZyBhIGZpeGVkIHNpemUgc2VxdWVuY2Ugb2YgZWxlbWVudHMuCisgICAqCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjYiPnJldmVyc2libGUgY29udGFpbmVyPC9hPiwgYW5kIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY3Ij5zZXF1ZW5jZTwvYT4uCisgICAqCisgICAqICBTZXRzIHN1cHBvcnQgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuCisgICAqCisgICAqICBAcGFyYW0gIFRwICBUeXBlIG9mIGVsZW1lbnQuIFJlcXVpcmVkIHRvIGJlIGEgY29tcGxldGUgdHlwZS4KKyAgICogIEBwYXJhbSAgTiAgTnVtYmVyIG9mIGVsZW1lbnRzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBzdHJ1Y3QgYXJyYXkKKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCAJICAgIAkJCSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgIAkgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgIAkgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUqICAgICAgICAgIAkJICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqCQkJICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90ICAgICAgICAgICAgICAgICAgICAJICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAJICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+CSAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyBTdXBwb3J0IGZvciB6ZXJvLXNpemVkIGFycmF5cyBtYW5kYXRvcnkuCisgICAgICB2YWx1ZV90eXBlIF9NX2luc3RhbmNlW19ObSA/IF9ObSA6IDFdOworCisgICAgICAvLyBObyBleHBsaWNpdCBjb25zdHJ1Y3QvY29weS9kZXN0cm95IGZvciBhZ2dyZWdhdGUgdHlwZS4KKworICAgICAgdm9pZAorICAgICAgYXNzaWduKGNvbnN0IHZhbHVlX3R5cGUmIF9fdSkKKyAgICAgIHsgc3RkOjpmaWxsX24oYmVnaW4oKSwgc2l6ZSgpLCBfX3UpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoYXJyYXkmIF9fb3RoZXIpCisgICAgICB7IHN0ZDo6c3dhcF9yYW5nZXMoYmVnaW4oKSwgZW5kKCksIF9fb3RoZXIuYmVnaW4oKSk7IH0KKworICAgICAgLy8gSXRlcmF0b3JzLgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHN0ZDo6X19hZGRyZXNzb2YoX01faW5zdGFuY2VbMF0pKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCAKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHN0ZDo6X19hZGRyZXNzb2YoX01faW5zdGFuY2VbMF0pKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHN0ZDo6X19hZGRyZXNzb2YoX01faW5zdGFuY2VbX05tXSkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3Ioc3RkOjpfX2FkZHJlc3NvZihfTV9pbnN0YW5jZVtfTm1dKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIHJiZWdpbigpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IgCisgICAgICByZW5kKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIHJlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICAvLyBDYXBhY2l0eS4KKyAgICAgIHNpemVfdHlwZSAKKyAgICAgIHNpemUoKSBjb25zdCB7IHJldHVybiBfTm07IH0KKworICAgICAgc2l6ZV90eXBlIAorICAgICAgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTm07IH0KKworICAgICAgYm9vbCAKKyAgICAgIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKworICAgICAgLy8gRWxlbWVudCBhY2Nlc3MuCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2luc3RhbmNlW19fbl07IH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9pbnN0YW5jZVtfX25dOyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlpZiAoX19uID49IF9ObSkKKwkgIHN0ZDo6X190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJhcnJheTo6YXQiKSk7CisJcmV0dXJuIF9NX2luc3RhbmNlW19fbl07CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlpZiAoX19uID49IF9ObSkKKwkgIHN0ZDo6X190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJhcnJheTo6YXQiKSk7CisJcmV0dXJuIF9NX2luc3RhbmNlW19fbl07CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZSAKKyAgICAgIGZyb250KCkKKyAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZSAKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisKKyAgICAgIHJlZmVyZW5jZSAKKyAgICAgIGJhY2soKQorICAgICAgeyByZXR1cm4gX05tID8gKihlbmQoKSAtIDEpIDogKmVuZCgpOyB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZSAKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeyByZXR1cm4gX05tID8gKihlbmQoKSAtIDEpIDogKmVuZCgpOyB9CisKKyAgICAgIF9UcCoKKyAgICAgIGRhdGEoKQorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfTV9pbnN0YW5jZVswXSk7IH0KKworICAgICAgY29uc3QgX1RwKgorICAgICAgZGF0YSgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9NX2luc3RhbmNlWzBdKTsgfQorICAgIH07CisKKyAgLy8gQXJyYXkgY29tcGFyaXNvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sIAorICAgIG9wZXJhdG9yPT0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiBzdGQ6OmVxdWFsKF9fb25lLmJlZ2luKCksIF9fb25lLmVuZCgpLCBfX3R3by5iZWdpbigpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuICEoX19vbmUgPT0gX190d28pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX2EsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19iKQorICAgIHsgCisgICAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfX2EuYmVnaW4oKSwgX19hLmVuZCgpLAorCQkJCQkgIF9fYi5iZWdpbigpLCBfX2IuZW5kKCkpOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiBfX3R3byA8IF9fb25lOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gIShfX29uZSA+IF9fdHdvKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuICEoX19vbmUgPCBfX3R3byk7IH0KKworICAvLyBTcGVjaWFsaXplZCBhbGdvcml0aG1zIFs2LjIuMi4yXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyBfX29uZS5zd2FwKF9fdHdvKTsgfQorCisgIC8vIFR1cGxlIGludGVyZmFjZSB0byBjbGFzcyB0ZW1wbGF0ZSBhcnJheSBbNi4yLjIuNV0uCisKKyAgLy8vIHR1cGxlX3NpemUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICBjbGFzcyB0dXBsZV9zaXplOworCisgIC8vLyB0dXBsZV9lbGVtZW50CisgIHRlbXBsYXRlPGludCBfSW50LCB0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgdHVwbGVfZWxlbWVudDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBzdHJ1Y3QgdHVwbGVfc2l6ZTxhcnJheTxfVHAsIF9ObT4gPgorICAgIHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IF9ObTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBjb25zdCBpbnQKKyAgICB0dXBsZV9zaXplPGFycmF5PF9UcCwgX05tPiA+Ojp2YWx1ZTsgIAorCisgIHRlbXBsYXRlPGludCBfSW50LCB0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBzdHJ1Y3QgdHVwbGVfZWxlbWVudDxfSW50LCBhcnJheTxfVHAsIF9ObT4gPgorICAgIHsgdHlwZWRlZiBfVHAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTxpbnQgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIF9UcCYKKyAgICBnZXQoYXJyYXk8X1RwLCBfTm0+JiBfX2FycikKKyAgICB7IHJldHVybiBfX2FycltfSW50XTsgfQorCisgIHRlbXBsYXRlPGludCBfSW50LCB0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgY29uc3QgX1RwJgorICAgIGdldChjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fYXJyKQorICAgIHsgcmV0dXJuIF9fYXJyW19JbnRdOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0FSUkFZCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9iZXNzZWxfZnVuY3Rpb24udGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvYmVzc2VsX2Z1bmN0aW9uLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQ4MWI4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvYmVzc2VsX2Z1bmN0aW9uLnRjYwpAQCAtMCwwICsxLDYyOCBAQAorLy8gU3BlY2lhbCBmdW5jdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvYmVzc2VsX2Z1bmN0aW9uLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9jbWF0aH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MiBUUjE6IDUuMiAgU3BlY2lhbCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQuCisvLworLy8gUmVmZXJlbmNlczoKKy8vICAgKDEpIEhhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMsCisvLyAgICAgICBlZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKy8vICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywKKy8vICAgICAgIFNlY3Rpb24gOSwgcHAuIDM1NS00MzQsIFNlY3Rpb24gMTAgcHAuIDQzNS00NzgKKy8vICAgKDIpIFRoZSBHbnUgU2NpZW50aWZpYyBMaWJyYXJ5LCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3NsCisvLyAgICgzKSBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCBieSBXLiBILiBQcmVzcywgUy4gQS4gVGV1a29sc2t5LAorLy8gICAgICAgVy4gVC4gVmV0dGVybGluZywgQi4gUC4gRmxhbm5lcnksIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzICgxOTkyKSwKKy8vICAgICAgIDJuZCBlZCwgcHAuIDI0MC0yNDUKKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQkVTU0VMX0ZVTkNUSU9OX1RDQworI2RlZmluZSBfR0xJQkNYWF9UUjFfQkVTU0VMX0ZVTkNUSU9OX1RDQyAxCisKKyNpbmNsdWRlICJzcGVjaWFsX2Z1bmN0aW9uX3V0aWwuaCIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIFs1LjJdIFNwZWNpYWwgZnVuY3Rpb25zCisKKyAgLy8gSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIENvbXB1dGUgdGhlIGdhbW1hIGZ1bmN0aW9ucyByZXF1aXJlZCBieSB0aGUgVGVtbWUgc2VyaWVzCisgICAgICogICAgICAgICAgZXhwYW5zaW9ucyBvZiBAZiQgTl9cbnUoeCkgQGYkIGFuZCBAZiQgS19cbnUoeCkgQGYkLgorICAgICAqICAgQGZbCisgICAgICogICAgIFxHYW1tYV8xID0gXGZyYWN7MX17MlxtdX0KKyAgICAgKiAgICAgICAgICAgICAgICBbXGZyYWN7MX17XEdhbW1hKDEgLSBcbXUpfSAtIFxmcmFjezF9e1xHYW1tYSgxICsgXG11KX1dCisgICAgICogICBAZl0KKyAgICAgKiAgIGFuZAorICAgICAqICAgQGZbCisgICAgICogICAgIFxHYW1tYV8yID0gXGZyYWN7MX17Mn0KKyAgICAgKiAgICAgICAgICAgICAgICBbXGZyYWN7MX17XEdhbW1hKDEgLSBcbXUpfSArIFxmcmFjezF9e1xHYW1tYSgxICsgXG11KX1dCisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIEBmJCAtMS8yIDw9IFxtdSA8PSAxLzIgQGYkIGlzIEBmJCBcbXUgPSBcbnUgLSBOIEBmJCBhbmQgQGYkIE4gQGYkLgorICAgICAqICAgaXMgdGhlIG5lYXJlc3QgaW50ZWdlciB0byBAZiQgXG51IEBmJC4KKyAgICAgKiAgIFRoZSB2YWx1ZXMgb2YgXGYkIFxHYW1tYSgxICsgXG11KSBcZiQgYW5kIFxmJCBcR2FtbWEoMSAtIFxtdSkgXGYkCisgICAgICogICBhcmUgcmV0dXJuZWQgYXMgd2VsbC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBhY2N1cmFjeSByZXF1aXJlbWVudHMgb24gdGhpcyBhcmUgZXhxdWlzaXRlLgorICAgICAqCisgICAgICogICBAcGFyYW0gX19tdSAgICAgVGhlIGlucHV0IHBhcmFtZXRlciBvZiB0aGUgZ2FtbWEgZnVuY3Rpb25zLgorICAgICAqICAgQHBhcmFtIF9fZ2FtMSAgIFRoZSBvdXRwdXQgZnVuY3Rpb24gXGYkIFxHYW1tYV8xKFxtdSkgXGYkCisgICAgICogICBAcGFyYW0gX19nYW0yICAgVGhlIG91dHB1dCBmdW5jdGlvbiBcZiQgXEdhbW1hXzIoXG11KSBcZiQKKyAgICAgKiAgIEBwYXJhbSBfX2dhbXBsICBUaGUgb3V0cHV0IGZ1bmN0aW9uIFxmJCBcR2FtbWEoMSArIFxtdSkgXGYkCisgICAgICogICBAcGFyYW0gX19nYW1taSAgVGhlIG91dHB1dCBmdW5jdGlvbiBcZiQgXEdhbW1hKDEgLSBcbXUpIFxmJAorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fZ2FtbWFfdGVtbWUoX1RwIF9fbXUsCisgICAgICAgICAgICAgICAgICBfVHAgJiBfX2dhbTEsIF9UcCAmIF9fZ2FtMiwgX1RwICYgX19nYW1wbCwgX1RwICYgX19nYW1taSkKKyAgICB7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgX19nYW1wbCA9IF9UcCgxKSAvIHN0ZDo6dHIxOjp0Z2FtbWEoX1RwKDEpICsgX19tdSk7CisgICAgICBfX2dhbW1pID0gX1RwKDEpIC8gc3RkOjp0cjE6OnRnYW1tYShfVHAoMSkgLSBfX211KTsKKyNlbHNlCisgICAgICBfX2dhbXBsID0gX1RwKDEpIC8gX19nYW1tYShfVHAoMSkgKyBfX211KTsKKyAgICAgIF9fZ2FtbWkgPSBfVHAoMSkgLyBfX2dhbW1hKF9UcCgxKSAtIF9fbXUpOworI2VuZGlmCisKKyAgICAgIGlmIChzdGQ6OmFicyhfX211KSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpKQorICAgICAgICBfX2dhbTEgPSAtX1RwKF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19nYW1tYV9lKCkpOworICAgICAgZWxzZQorICAgICAgICBfX2dhbTEgPSAoX19nYW1taSAtIF9fZ2FtcGwpIC8gKF9UcCgyKSAqIF9fbXUpOworCisgICAgICBfX2dhbTIgPSAoX19nYW1taSArIF9fZ2FtcGwpIC8gKF9UcCgyKSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBDb21wdXRlIHRoZSBCZXNzZWwgQGYkIEpfXG51KHgpIEBmJCBhbmQgTmV1bWFubgorICAgICAqICAgICAgICAgICBAZiQgTl9cbnUoeCkgQGYkIGZ1bmN0aW9ucyBhbmQgdGhlaXIgZmlyc3QgZGVyaXZhdGl2ZXMKKyAgICAgKiAgICAgICAgICAgQGYkIEonX1xudSh4KSBAZiQgYW5kIEBmJCBOJ19cbnUoeCkgQGYkIHJlc3BlY3RpdmVseS4KKyAgICAgKiAgICAgICAgICAgVGhlc2UgZm91ciBmdW5jdGlvbnMgYXJlIGNvbXB1dGVkIHRvZ2V0aGVyIGZvciBudW1lcmljYWwKKyAgICAgKiAgICAgICAgICAgc3RhYmlsaXR5LgorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fbnUgIFRoZSBvcmRlciBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9ucy4KKyAgICAgKiAgIEBwYXJhbSAgX194ICAgVGhlIGFyZ3VtZW50IG9mIHRoZSBCZXNzZWwgZnVuY3Rpb25zLgorICAgICAqICAgQHBhcmFtICBfX0pudSAgVGhlIG91dHB1dCBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQuCisgICAgICogICBAcGFyYW0gIF9fTm51ICBUaGUgb3V0cHV0IE5ldW1hbm4gZnVuY3Rpb24gKEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQpLgorICAgICAqICAgQHBhcmFtICBfX0pwbnUgIFRoZSBvdXRwdXQgZGVyaXZhdGl2ZSBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgorICAgICAqICAgQHBhcmFtICBfX05wbnUgIFRoZSBvdXRwdXQgZGVyaXZhdGl2ZSBvZiB0aGUgTmV1bWFubiBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX2Jlc3NlbF9qbihfVHAgX19udSwgX1RwIF9feCwKKyAgICAgICAgICAgICAgICBfVHAgJiBfX0pudSwgX1RwICYgX19ObnUsIF9UcCAmIF9fSnBudSwgX1RwICYgX19OcG51KQorICAgIHsKKyAgICAgIGlmIChfX3ggPT0gX1RwKDApKQorICAgICAgICB7CisgICAgICAgICAgaWYgKF9fbnUgPT0gX1RwKDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX0pudSA9IF9UcCgxKTsKKyAgICAgICAgICAgICAgX19KcG51ID0gX1RwKDApOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKF9fbnUgPT0gX1RwKDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX0pudSA9IF9UcCgwKTsKKyAgICAgICAgICAgICAgX19KcG51ID0gX1RwKDAuNUwpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19KbnUgPSBfVHAoMCk7CisgICAgICAgICAgICAgIF9fSnBudSA9IF9UcCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfX05udSA9IC1zdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmluZmluaXR5KCk7CisgICAgICAgICAgX19OcG51ID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjppbmZpbml0eSgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgIC8vICBXaGVuIHRoZSBtdWx0aXBsaWVyIGlzIE4gaS5lLgorICAgICAgLy8gIGZwX21pbiA9IE4gKiBtaW4oKQorICAgICAgLy8gIFRoZW4gSl8wIGFuZCBOXzAgdGFuayBhdCB4ID0gOCAqIE4gKEpfMCA9IDAgYW5kIE5fMCA9IG5hbikhCisgICAgICAvL2NvbnN0IF9UcCBfX2ZwX21pbiA9IF9UcCgyMCkgKiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1pbigpOworICAgICAgY29uc3QgX1RwIF9fZnBfbWluID0gc3RkOjpzcXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWluKCkpOworICAgICAgY29uc3QgaW50IF9fbWF4X2l0ZXIgPSAxNTAwMDsKKyAgICAgIGNvbnN0IF9UcCBfX3hfbWluID0gX1RwKDIpOworCisgICAgICBjb25zdCBpbnQgX19ubCA9IChfX3ggPCBfX3hfbWluCisgICAgICAgICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8aW50PihfX251ICsgX1RwKDAuNUwpKQorICAgICAgICAgICAgICAgICAgICA6IHN0ZDo6bWF4KDAsIHN0YXRpY19jYXN0PGludD4oX19udSAtIF9feCArIF9UcCgxLjVMKSkpKTsKKworICAgICAgY29uc3QgX1RwIF9fbXUgPSBfX251IC0gX19ubDsKKyAgICAgIGNvbnN0IF9UcCBfX211MiA9IF9fbXUgKiBfX211OworICAgICAgY29uc3QgX1RwIF9feGkgPSBfVHAoMSkgLyBfX3g7CisgICAgICBjb25zdCBfVHAgX194aTIgPSBfVHAoMikgKiBfX3hpOworICAgICAgX1RwIF9fdyA9IF9feGkyIC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCk7CisgICAgICBpbnQgX19pc2lnbiA9IDE7CisgICAgICBfVHAgX19oID0gX19udSAqIF9feGk7CisgICAgICBpZiAoX19oIDwgX19mcF9taW4pCisgICAgICAgIF9faCA9IF9fZnBfbWluOworICAgICAgX1RwIF9fYiA9IF9feGkyICogX19udTsKKyAgICAgIF9UcCBfX2QgPSBfVHAoMCk7CisgICAgICBfVHAgX19jID0gX19oOworICAgICAgaW50IF9faTsKKyAgICAgIGZvciAoX19pID0gMTsgX19pIDw9IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX19iICs9IF9feGkyOworICAgICAgICAgIF9fZCA9IF9fYiAtIF9fZDsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX19kKSA8IF9fZnBfbWluKQorICAgICAgICAgICAgX19kID0gX19mcF9taW47CisgICAgICAgICAgX19jID0gX19iIC0gX1RwKDEpIC8gX19jOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX2MpIDwgX19mcF9taW4pCisgICAgICAgICAgICBfX2MgPSBfX2ZwX21pbjsKKyAgICAgICAgICBfX2QgPSBfVHAoMSkgLyBfX2Q7CisgICAgICAgICAgY29uc3QgX1RwIF9fZGVsID0gX19jICogX19kOworICAgICAgICAgIF9faCAqPSBfX2RlbDsKKyAgICAgICAgICBpZiAoX19kIDwgX1RwKDApKQorICAgICAgICAgICAgX19pc2lnbiA9IC1fX2lzaWduOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX2RlbCAtIF9UcCgxKSkgPCBfX2VwcykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBpZiAoX19pID4gX19tYXhfaXRlcikKKyAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJBcmd1bWVudCB4IHRvbyBsYXJnZSBpbiBfX2Jlc3NlbF9qbjsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyeSBhc3ltcHRvdGljIGV4cGFuc2lvbi4iKSk7CisgICAgICBfVHAgX19KbnVsID0gX19pc2lnbiAqIF9fZnBfbWluOworICAgICAgX1RwIF9fSnBudWwgPSBfX2ggKiBfX0pudWw7CisgICAgICBfVHAgX19KbnVsMSA9IF9fSm51bDsKKyAgICAgIF9UcCBfX0pwbnUxID0gX19KcG51bDsKKyAgICAgIF9UcCBfX2ZhY3QgPSBfX251ICogX194aTsKKyAgICAgIGZvciAoIGludCBfX2wgPSBfX25sOyBfX2wgPj0gMTsgLS1fX2wgKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fSm51dGVtcCA9IF9fZmFjdCAqIF9fSm51bCArIF9fSnBudWw7CisgICAgICAgICAgX19mYWN0IC09IF9feGk7CisgICAgICAgICAgX19KcG51bCA9IF9fZmFjdCAqIF9fSm51dGVtcCAtIF9fSm51bDsKKyAgICAgICAgICBfX0pudWwgPSBfX0pudXRlbXA7CisgICAgICAgIH0KKyAgICAgIGlmIChfX0pudWwgPT0gX1RwKDApKQorICAgICAgICBfX0pudWwgPSBfX2VwczsKKyAgICAgIF9UcCBfX2Y9IF9fSnBudWwgLyBfX0pudWw7CisgICAgICBfVHAgX19ObXUsIF9fTm51MSwgX19OcG11LCBfX0ptdTsKKyAgICAgIGlmIChfX3ggPCBfX3hfbWluKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9feDIgPSBfX3ggLyBfVHAoMik7CisgICAgICAgICAgY29uc3QgX1RwIF9fcGltdSA9IF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpICogX19tdTsKKyAgICAgICAgICBfVHAgX19mYWN0ID0gKHN0ZDo6YWJzKF9fcGltdSkgPCBfX2VwcworICAgICAgICAgICAgICAgICAgICAgID8gX1RwKDEpIDogX19waW11IC8gc3RkOjpzaW4oX19waW11KSk7CisgICAgICAgICAgX1RwIF9fZCA9IC1zdGQ6OmxvZyhfX3gyKTsKKyAgICAgICAgICBfVHAgX19lID0gX19tdSAqIF9fZDsKKyAgICAgICAgICBfVHAgX19mYWN0MiA9IChzdGQ6OmFicyhfX2UpIDwgX19lcHMKKyAgICAgICAgICAgICAgICAgICAgICAgPyBfVHAoMSkgOiBzdGQ6OnNpbmgoX19lKSAvIF9fZSk7CisgICAgICAgICAgX1RwIF9fZ2FtMSwgX19nYW0yLCBfX2dhbXBsLCBfX2dhbW1pOworICAgICAgICAgIF9fZ2FtbWFfdGVtbWUoX19tdSwgX19nYW0xLCBfX2dhbTIsIF9fZ2FtcGwsIF9fZ2FtbWkpOworICAgICAgICAgIF9UcCBfX2ZmID0gKF9UcCgyKSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpKQorICAgICAgICAgICAgICAgICAgICogX19mYWN0ICogKF9fZ2FtMSAqIHN0ZDo6Y29zaChfX2UpICsgX19nYW0yICogX19mYWN0MiAqIF9fZCk7CisgICAgICAgICAgX19lID0gc3RkOjpleHAoX19lKTsKKyAgICAgICAgICBfVHAgX19wID0gX19lIC8gKF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpICogX19nYW1wbCk7CisgICAgICAgICAgX1RwIF9fcSA9IF9UcCgxKSAvIChfX2UgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSAqIF9fZ2FtbWkpOworICAgICAgICAgIGNvbnN0IF9UcCBfX3BpbXUyID0gX19waW11IC8gX1RwKDIpOworICAgICAgICAgIF9UcCBfX2ZhY3QzID0gKHN0ZDo6YWJzKF9fcGltdTIpIDwgX19lcHMKKyAgICAgICAgICAgICAgICAgICAgICAgPyBfVHAoMSkgOiBzdGQ6OnNpbihfX3BpbXUyKSAvIF9fcGltdTIgKTsKKyAgICAgICAgICBfVHAgX19yID0gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkgKiBfX3BpbXUyICogX19mYWN0MyAqIF9fZmFjdDM7CisgICAgICAgICAgX1RwIF9fYyA9IF9UcCgxKTsKKyAgICAgICAgICBfX2QgPSAtX194MiAqIF9feDI7CisgICAgICAgICAgX1RwIF9fc3VtID0gX19mZiArIF9fciAqIF9fcTsKKyAgICAgICAgICBfVHAgX19zdW0xID0gX19wOworICAgICAgICAgIGZvciAoX19pID0gMTsgX19pIDw9IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX2ZmID0gKF9faSAqIF9fZmYgKyBfX3AgKyBfX3EpIC8gKF9faSAqIF9faSAtIF9fbXUyKTsKKyAgICAgICAgICAgICAgX19jICo9IF9fZCAvIF9UcChfX2kpOworICAgICAgICAgICAgICBfX3AgLz0gX1RwKF9faSkgLSBfX211OworICAgICAgICAgICAgICBfX3EgLz0gX1RwKF9faSkgKyBfX211OworICAgICAgICAgICAgICBjb25zdCBfVHAgX19kZWwgPSBfX2MgKiAoX19mZiArIF9fciAqIF9fcSk7CisgICAgICAgICAgICAgIF9fc3VtICs9IF9fZGVsOyAKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fZGVsMSA9IF9fYyAqIF9fcCAtIF9faSAqIF9fZGVsOworICAgICAgICAgICAgICBfX3N1bTEgKz0gX19kZWwxOworICAgICAgICAgICAgICBpZiAoIHN0ZDo6YWJzKF9fZGVsKSA8IF9fZXBzICogKF9UcCgxKSArIHN0ZDo6YWJzKF9fc3VtKSkgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmICggX19pID4gX19tYXhfaXRlciApCisgICAgICAgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIkJlc3NlbCB5IHNlcmllcyBmYWlsZWQgdG8gY29udmVyZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2Jlc3NlbF9qbi4iKSk7CisgICAgICAgICAgX19ObXUgPSAtX19zdW07CisgICAgICAgICAgX19ObnUxID0gLV9fc3VtMSAqIF9feGkyOworICAgICAgICAgIF9fTnBtdSA9IF9fbXUgKiBfX3hpICogX19ObXUgLSBfX05udTE7CisgICAgICAgICAgX19KbXUgPSBfX3cgLyAoX19OcG11IC0gX19mICogX19ObXUpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19hID0gX1RwKDAuMjVMKSAtIF9fbXUyOworICAgICAgICAgIF9UcCBfX3EgPSBfVHAoMSk7CisgICAgICAgICAgX1RwIF9fcCA9IC1fX3hpIC8gX1RwKDIpOworICAgICAgICAgIF9UcCBfX2JyID0gX1RwKDIpICogX194OworICAgICAgICAgIF9UcCBfX2JpID0gX1RwKDIpOworICAgICAgICAgIF9UcCBfX2ZhY3QgPSBfX2EgKiBfX3hpIC8gKF9fcCAqIF9fcCArIF9fcSAqIF9fcSk7CisgICAgICAgICAgX1RwIF9fY3IgPSBfX2JyICsgX19xICogX19mYWN0OworICAgICAgICAgIF9UcCBfX2NpID0gX19iaSArIF9fcCAqIF9fZmFjdDsKKyAgICAgICAgICBfVHAgX19kZW4gPSBfX2JyICogX19iciArIF9fYmkgKiBfX2JpOworICAgICAgICAgIF9UcCBfX2RyID0gX19iciAvIF9fZGVuOworICAgICAgICAgIF9UcCBfX2RpID0gLV9fYmkgLyBfX2RlbjsKKyAgICAgICAgICBfVHAgX19kbHIgPSBfX2NyICogX19kciAtIF9fY2kgKiBfX2RpOworICAgICAgICAgIF9UcCBfX2RsaSA9IF9fY3IgKiBfX2RpICsgX19jaSAqIF9fZHI7CisgICAgICAgICAgX1RwIF9fdGVtcCA9IF9fcCAqIF9fZGxyIC0gX19xICogX19kbGk7CisgICAgICAgICAgX19xID0gX19wICogX19kbGkgKyBfX3EgKiBfX2RscjsKKyAgICAgICAgICBfX3AgPSBfX3RlbXA7CisgICAgICAgICAgaW50IF9faTsKKyAgICAgICAgICBmb3IgKF9faSA9IDI7IF9faSA8PSBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19hICs9IF9UcCgyICogKF9faSAtIDEpKTsKKyAgICAgICAgICAgICAgX19iaSArPSBfVHAoMik7CisgICAgICAgICAgICAgIF9fZHIgPSBfX2EgKiBfX2RyICsgX19icjsKKyAgICAgICAgICAgICAgX19kaSA9IF9fYSAqIF9fZGkgKyBfX2JpOworICAgICAgICAgICAgICBpZiAoc3RkOjphYnMoX19kcikgKyBzdGQ6OmFicyhfX2RpKSA8IF9fZnBfbWluKQorICAgICAgICAgICAgICAgIF9fZHIgPSBfX2ZwX21pbjsKKyAgICAgICAgICAgICAgX19mYWN0ID0gX19hIC8gKF9fY3IgKiBfX2NyICsgX19jaSAqIF9fY2kpOworICAgICAgICAgICAgICBfX2NyID0gX19iciArIF9fY3IgKiBfX2ZhY3Q7CisgICAgICAgICAgICAgIF9fY2kgPSBfX2JpIC0gX19jaSAqIF9fZmFjdDsKKyAgICAgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fY3IpICsgc3RkOjphYnMoX19jaSkgPCBfX2ZwX21pbikKKyAgICAgICAgICAgICAgICBfX2NyID0gX19mcF9taW47CisgICAgICAgICAgICAgIF9fZGVuID0gX19kciAqIF9fZHIgKyBfX2RpICogX19kaTsKKyAgICAgICAgICAgICAgX19kciAvPSBfX2RlbjsKKyAgICAgICAgICAgICAgX19kaSAvPSAtX19kZW47CisgICAgICAgICAgICAgIF9fZGxyID0gX19jciAqIF9fZHIgLSBfX2NpICogX19kaTsKKyAgICAgICAgICAgICAgX19kbGkgPSBfX2NyICogX19kaSArIF9fY2kgKiBfX2RyOworICAgICAgICAgICAgICBfX3RlbXAgPSBfX3AgKiBfX2RsciAtIF9fcSAqIF9fZGxpOworICAgICAgICAgICAgICBfX3EgPSBfX3AgKiBfX2RsaSArIF9fcSAqIF9fZGxyOworICAgICAgICAgICAgICBfX3AgPSBfX3RlbXA7CisgICAgICAgICAgICAgIGlmIChzdGQ6OmFicyhfX2RsciAtIF9UcCgxKSkgKyBzdGQ6OmFicyhfX2RsaSkgPCBfX2VwcykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKF9faSA+IF9fbWF4X2l0ZXIpCisgICAgICAgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIkxlbnR6J3MgbWV0aG9kIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fYmVzc2VsX2puLiIpKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19nYW0gPSAoX19wIC0gX19mKSAvIF9fcTsKKyAgICAgICAgICBfX0ptdSA9IHN0ZDo6c3FydChfX3cgLyAoKF9fcCAtIF9fZikgKiBfX2dhbSArIF9fcSkpOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgICAgICBfX0ptdSA9IHN0ZDo6dHIxOjpjb3B5c2lnbihfX0ptdSwgX19KbnVsKTsKKyNlbHNlCisgICAgICAgICAgaWYgKF9fSm11ICogX19KbnVsIDwgX1RwKDApKQorICAgICAgICAgICAgX19KbXUgPSAtX19KbXU7CisjZW5kaWYKKyAgICAgICAgICBfX05tdSA9IF9fZ2FtICogX19KbXU7CisgICAgICAgICAgX19OcG11ID0gKF9fcCArIF9fcSAvIF9fZ2FtKSAqIF9fTm11OworICAgICAgICAgIF9fTm51MSA9IF9fbXUgKiBfX3hpICogX19ObXUgLSBfX05wbXU7CisgICAgICB9CisgICAgICBfX2ZhY3QgPSBfX0ptdSAvIF9fSm51bDsKKyAgICAgIF9fSm51ID0gX19mYWN0ICogX19KbnVsMTsKKyAgICAgIF9fSnBudSA9IF9fZmFjdCAqIF9fSnBudTE7CisgICAgICBmb3IgKF9faSA9IDE7IF9faSA8PSBfX25sOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX05udXRlbXAgPSAoX19tdSArIF9faSkgKiBfX3hpMiAqIF9fTm51MSAtIF9fTm11OworICAgICAgICAgIF9fTm11ID0gX19ObnUxOworICAgICAgICAgIF9fTm51MSA9IF9fTm51dGVtcDsKKyAgICAgICAgfQorICAgICAgX19ObnUgPSBfX05tdTsKKyAgICAgIF9fTnBudSA9IF9fbnUgKiBfX3hpICogX19ObXUgLSBfX05udTE7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFRoaXMgcm91dGluZSBjb21wdXRlcyB0aGUgYXN5bXB0b3RpYyBjeWxpbmRyaWNhbCBCZXNzZWwKKyAgICAgKiAgICAgICAgICBhbmQgTmV1bWFubiBmdW5jdGlvbnMgb2Ygb3JkZXIgbnU6IFxmJCBKX3tcbnV9IFxmJCwKKyAgICAgKiAgICAgICAgICBcZiQgTl97XG51fSBcZiQuCisgICAgICoKKyAgICAgKiAgIFJlZmVyZW5jZXM6CisgICAgICogICAgKDEpIEhhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMsCisgICAgICogICAgICAgIGVkLiBNaWx0b24gQWJyYW1vd2l0eiBhbmQgSXJlbmUgQS4gU3RlZ3VuLAorICAgICAqICAgICAgICBEb3ZlciBQdWJsaWNhdGlvbnMsCisgICAgICogICAgICAgIFNlY3Rpb24gOSBwLiAzNjQsIEVxdWF0aW9ucyA5LjIuNS05LjIuMTAKKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX251ICBUaGUgb3JkZXIgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbnMuCisgICAgICogICBAcGFyYW0gIF9feCAgIFRoZSBhcmd1bWVudCBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9ucy4KKyAgICAgKiAgIEBwYXJhbSAgX19KbnUgIFRoZSBvdXRwdXQgQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgorICAgICAqICAgQHBhcmFtICBfX05udSAgVGhlIG91dHB1dCBOZXVtYW5uIGZ1bmN0aW9uIChCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIHNlY29uZCBraW5kKS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX2N5bF9iZXNzZWxfam5fYXN5bXAoX1RwIF9fbnUsIF9UcCBfX3gsIF9UcCAmIF9fSm51LCBfVHAgJiBfX05udSkKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19tdSAgID0gX1RwKDQpICogX19udSAqIF9fbnU7CisgICAgICBjb25zdCBfVHAgX19tdW0xID0gX19tdSAtIF9UcCgxKTsKKyAgICAgIGNvbnN0IF9UcCBfX211bTkgPSBfX211IC0gX1RwKDkpOworICAgICAgY29uc3QgX1RwIF9fbXVtMjUgPSBfX211IC0gX1RwKDI1KTsKKyAgICAgIGNvbnN0IF9UcCBfX211bTQ5ID0gX19tdSAtIF9UcCg0OSk7CisgICAgICBjb25zdCBfVHAgX194eCA9IF9UcCg2NCkgKiBfX3ggKiBfX3g7CisgICAgICBjb25zdCBfVHAgX19QID0gX1RwKDEpIC0gX19tdW0xICogX19tdW05IC8gKF9UcCgyKSAqIF9feHgpCisgICAgICAgICAgICAgICAgICAgICogKF9UcCgxKSAtIF9fbXVtMjUgKiBfX211bTQ5IC8gKF9UcCgxMikgKiBfX3h4KSk7CisgICAgICBjb25zdCBfVHAgX19RID0gX19tdW0xIC8gKF9UcCg4KSAqIF9feCkKKyAgICAgICAgICAgICAgICAgICAgKiAoX1RwKDEpIC0gX19tdW05ICogX19tdW0yNSAvIChfVHAoNikgKiBfX3h4KSk7CisKKyAgICAgIGNvbnN0IF9UcCBfX2NoaSA9IF9feCAtIChfX251ICsgX1RwKDAuNUwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpXzIoKTsKKyAgICAgIGNvbnN0IF9UcCBfX2MgPSBzdGQ6OmNvcyhfX2NoaSk7CisgICAgICBjb25zdCBfVHAgX19zID0gc3RkOjpzaW4oX19jaGkpOworCisgICAgICBjb25zdCBfVHAgX19jb2VmID0gc3RkOjpzcXJ0KF9UcCgyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSAqIF9feCkpOworICAgICAgX19KbnUgPSBfX2NvZWYgKiAoX19jICogX19QIC0gX19zICogX19RKTsKKyAgICAgIF9fTm51ID0gX19jb2VmICogKF9fcyAqIF9fUCArIF9fYyAqIF9fUSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBjeWxpbmRyaWNhbCBCZXNzZWwgZnVuY3Rpb25zCisgICAgICogICAgICAgICAgb2Ygb3JkZXIgXGYkIFxudSBcZiQ6IFxmJCBKX3tcbnV9IFxmJCBvciBcZiQgSV97XG51fSBcZiQKKyAgICAgKiAgICAgICAgICBieSBzZXJpZXMgZXhwYW5zaW9uLgorICAgICAqCisgICAgICogICBUaGUgbW9kaWZpZWQgY3lsaW5kcmljYWwgQmVzc2VsIGZ1bmN0aW9uIGlzOgorICAgICAqICAgQGZbCisgICAgICogICAgWl97XG51fSh4KSA9IFxzdW1fe2s9MH1ee1xpbmZ0eX0KKyAgICAgKiAgICAgICAgICAgICAgXGZyYWN7XHNpZ21hXmsgKHgvMilee1xudSArIDJrfX17ayFcR2FtbWEoXG51K2srMSl9CisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIFxmJCBcc2lnbWEgPSArMSBcZiQgb3JcZiQgIC0xIFxmJCBmb3IKKyAgICAgKiAgIFxmJCBaID0gSSBcZiQgb3IgXGYkIEogXGYkIHJlc3BlY3RpdmVseS4KKyAgICAgKiAKKyAgICAgKiAgIFNlZSBBYnJhbW93aXR6ICYgU3RlZ3VuLCA5LjEuMTAKKyAgICAgKiAgICAgICBBYnJhbW93aXR6ICYgU3RlZ3VuLCA5LjYuNworICAgICAqICAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorICAgICAqICAgICAgICBlZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKyAgICAgKiAgICAgICAgRG92ZXIgUHVibGljYXRpb25zLAorICAgICAqICAgICAgICBFcXVhdGlvbiA5LjEuMTAgcC4gMzYwIGFuZCBFcXVhdGlvbiA5LjYuMTAgcC4gMzc1CisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19udSAgVGhlIG9yZGVyIG9mIHRoZSBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgIFRoZSBhcmd1bWVudCBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3NnbiAgVGhlIHNpZ24gb2YgdGhlIGFsdGVybmF0ZSB0ZXJtcworICAgICAqICAgICAgICAgICAgICAgICAgLTEgZm9yIHRoZSBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQuCisgICAgICogICAgICAgICAgICAgICAgICArMSBmb3IgdGhlIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBvdXRwdXQgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jeWxfYmVzc2VsX2lqX3NlcmllcyhfVHAgX19udSwgX1RwIF9feCwgX1RwIF9fc2duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIpCisgICAgeworICAgICAgaWYgKF9feCA9PSBfVHAoMCkpCisJcmV0dXJuIF9fbnUgPT0gX1RwKDApID8gX1RwKDEpIDogX1RwKDApOworCisgICAgICBjb25zdCBfVHAgX194MiA9IF9feCAvIF9UcCgyKTsKKyAgICAgIF9UcCBfX2ZhY3QgPSBfX251ICogc3RkOjpsb2coX194Mik7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgX19mYWN0IC09IHN0ZDo6dHIxOjpsZ2FtbWEoX19udSArIF9UcCgxKSk7CisjZWxzZQorICAgICAgX19mYWN0IC09IF9fbG9nX2dhbW1hKF9fbnUgKyBfVHAoMSkpOworI2VuZGlmCisgICAgICBfX2ZhY3QgPSBzdGQ6OmV4cChfX2ZhY3QpOworICAgICAgY29uc3QgX1RwIF9feHg0ID0gX19zZ24gKiBfX3gyICogX194MjsKKyAgICAgIF9UcCBfX0puID0gX1RwKDEpOworICAgICAgX1RwIF9fdGVybSA9IF9UcCgxKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMTsgX19pIDwgX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfX3Rlcm0gKj0gX194eDQgLyAoX1RwKF9faSkgKiAoX19udSArIF9UcChfX2kpKSk7CisgICAgICAgICAgX19KbiArPSBfX3Rlcm07CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fdGVybSAvIF9fSm4pIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19mYWN0ICogX19KbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIEJlc3NlbCBmdW5jdGlvbiBvZiBvcmRlciBcZiQgXG51IFxmJDoKKyAgICAgKiAgICAgICAgICAgXGYkIEpfe1xudX0oeCkgXGYkLgorICAgICAqCisgICAgICogICBUaGUgY3lsaW5kcmljYWwgQmVzc2VsIGZ1bmN0aW9uIGlzOgorICAgICAqICAgQGZbCisgICAgICogICAgSl97XG51fSh4KSA9IFxzdW1fe2s9MH1ee1xpbmZ0eX0KKyAgICAgKiAgICAgICAgICAgICAgXGZyYWN7KC0xKV5rICh4LzIpXntcbnUgKyAya319e2shXEdhbW1hKFxudStrKzEpfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19udSAgVGhlIG9yZGVyIG9mIHRoZSBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgIFRoZSBhcmd1bWVudCBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIG91dHB1dCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fY3lsX2Jlc3NlbF9qKF9UcCBfX251LCBfVHAgX194KQorICAgIHsKKyAgICAgIGlmIChfX251IDwgX1RwKDApIHx8IF9feCA8IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2N5bF9iZXNzZWxfai4iKSk7CisgICAgICBlbHNlIGlmIChfX2lzbmFuKF9fbnUpIHx8IF9faXNuYW4oX194KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX3ggKiBfX3ggPCBfVHAoMTApICogKF9fbnUgKyBfVHAoMSkpKQorICAgICAgICByZXR1cm4gX19jeWxfYmVzc2VsX2lqX3NlcmllcyhfX251LCBfX3gsIC1fVHAoMSksIDIwMCk7CisgICAgICBlbHNlIGlmIChfX3ggPiBfVHAoMTAwMCkpCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19KX251LCBfX05fbnU7CisgICAgICAgICAgX19jeWxfYmVzc2VsX2puX2FzeW1wKF9fbnUsIF9feCwgX19KX251LCBfX05fbnUpOworICAgICAgICAgIHJldHVybiBfX0pfbnU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX0pfbnUsIF9fTl9udSwgX19KcF9udSwgX19OcF9udTsKKyAgICAgICAgICBfX2Jlc3NlbF9qbihfX251LCBfX3gsIF9fSl9udSwgX19OX251LCBfX0pwX251LCBfX05wX251KTsKKyAgICAgICAgICByZXR1cm4gX19KX251OworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBOZXVtYW5uIGZ1bmN0aW9uIG9mIG9yZGVyIFxmJCBcbnUgXGYkOgorICAgICAqICAgICAgICAgICBcZiQgTl97XG51fSh4KSBcZiQuCisgICAgICoKKyAgICAgKiAgIFRoZSBOZXVtYW5uIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgIE5fe1xudX0oeCkgPSBcZnJhY3tKX3tcbnV9KHgpIFxjb3MgXG51XHBpIC0gSl97LVxudX0oeCl9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB7XHNpbiBcbnVccGl9CisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIGZvciBpbnRlZ3JhbCBcZiQgXG51ID0gbiBcZiQgYSBsaW1pdCBpcyB0YWtlbjoKKyAgICAgKiAgIFxmJCBsaW1fe1xudSBcdG8gbn0gXGYkLgorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fbnUgIFRoZSBvcmRlciBvZiB0aGUgTmV1bWFubiBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX194ICAgVGhlIGFyZ3VtZW50IG9mIHRoZSBOZXVtYW5uIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIG91dHB1dCBOZXVtYW5uIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2N5bF9uZXVtYW5uX24oX1RwIF9fbnUsIF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9fbnUgPCBfVHAoMCkgfHwgX194IDwgX1RwKDApKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQmFkIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fY3lsX25ldW1hbm5fbi4iKSk7CisgICAgICBlbHNlIGlmIChfX2lzbmFuKF9fbnUpIHx8IF9faXNuYW4oX194KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX3ggPiBfVHAoMTAwMCkpCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19KX251LCBfX05fbnU7CisgICAgICAgICAgX19jeWxfYmVzc2VsX2puX2FzeW1wKF9fbnUsIF9feCwgX19KX251LCBfX05fbnUpOworICAgICAgICAgIHJldHVybiBfX05fbnU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX0pfbnUsIF9fTl9udSwgX19KcF9udSwgX19OcF9udTsKKyAgICAgICAgICBfX2Jlc3NlbF9qbihfX251LCBfX3gsIF9fSl9udSwgX19OX251LCBfX0pwX251LCBfX05wX251KTsKKyAgICAgICAgICByZXR1cm4gX19OX251OworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgQ29tcHV0ZSB0aGUgc3BoZXJpY2FsIEJlc3NlbCBAZiQgal9uKHgpIEBmJAorICAgICAqICAgICAgICAgICBhbmQgTmV1bWFubiBAZiQgbl9uKHgpIEBmJCBmdW5jdGlvbnMgYW5kIHRoZWlyIGZpcnN0CisgICAgICogICAgICAgICAgIGRlcml2YXRpdmVzIEBmJCBqJ19uKHgpIEBmJCBhbmQgQGYkIG4nX24oeCkgQGYkCisgICAgICogICAgICAgICAgIHJlc3BlY3RpdmVseS4KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX24gIFRoZSBvcmRlciBvZiB0aGUgc3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIHNwaGVyaWNhbCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9fal9uICBUaGUgb3V0cHV0IHNwaGVyaWNhbCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9fbl9uICBUaGUgb3V0cHV0IHNwaGVyaWNhbCBOZXVtYW5uIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX2pwX24gVGhlIG91dHB1dCBkZXJpdmF0aXZlIG9mIHRoZSBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX25wX24gVGhlIG91dHB1dCBkZXJpdmF0aXZlIG9mIHRoZSBzcGhlcmljYWwgTmV1bWFubiBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3NwaF9iZXNzZWxfam4odW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCwKKyAgICAgICAgICAgICAgICAgICAgX1RwICYgX19qX24sIF9UcCAmIF9fbl9uLCBfVHAgJiBfX2pwX24sIF9UcCAmIF9fbnBfbikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19udSA9IF9UcChfX24pICsgX1RwKDAuNUwpOworCisgICAgICBfVHAgX19KX251LCBfX05fbnUsIF9fSnBfbnUsIF9fTnBfbnU7CisgICAgICBfX2Jlc3NlbF9qbihfX251LCBfX3gsIF9fSl9udSwgX19OX251LCBfX0pwX251LCBfX05wX251KTsKKworICAgICAgY29uc3QgX1RwIF9fZmFjdG9yID0gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3NxcnRwaW8yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAvIHN0ZDo6c3FydChfX3gpOworCisgICAgICBfX2pfbiA9IF9fZmFjdG9yICogX19KX251OworICAgICAgX19uX24gPSBfX2ZhY3RvciAqIF9fTl9udTsKKyAgICAgIF9fanBfbiA9IF9fZmFjdG9yICogX19KcF9udSAtIF9fal9uIC8gKF9UcCgyKSAqIF9feCk7CisgICAgICBfX25wX24gPSBfX2ZhY3RvciAqIF9fTnBfbnUgLSBfX25fbiAvIChfVHAoMikgKiBfX3gpOworCisgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uCisgICAgICogICAgICAgICAgIEBmJCBqX24oeCkgQGYkIG9mIG9yZGVyIG4uCisgICAgICoKKyAgICAgKiAgIFRoZSBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICBqX24oeCkgPSBcbGVmdCggXGZyYWN7XHBpfXsyeH0gXHJpZ2h0KSBeezEvMn0gSl97bisxLzJ9KHgpCisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX24gIFRoZSBvcmRlciBvZiB0aGUgc3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIHNwaGVyaWNhbCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgb3V0cHV0IHNwaGVyaWNhbCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3NwaF9iZXNzZWwodW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX194IDwgX1RwKDApKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQmFkIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fc3BoX2Jlc3NlbC4iKSk7CisgICAgICBlbHNlIGlmIChfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX194ID09IF9UcCgwKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChfX24gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBfVHAoMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIF9UcCgwKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fal9uLCBfX25fbiwgX19qcF9uLCBfX25wX247CisgICAgICAgICAgX19zcGhfYmVzc2VsX2puKF9fbiwgX194LCBfX2pfbiwgX19uX24sIF9fanBfbiwgX19ucF9uKTsKKyAgICAgICAgICByZXR1cm4gX19qX247CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIHNwaGVyaWNhbCBOZXVtYW5uIGZ1bmN0aW9uCisgICAgICogICAgICAgICAgIEBmJCBuX24oeCkgQGYkLgorICAgICAqCisgICAgICogICBUaGUgc3BoZXJpY2FsIE5ldW1hbm4gZnVuY3Rpb24gaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgIG5fbih4KSA9IFxsZWZ0KCBcZnJhY3tccGl9ezJ4fSBccmlnaHQpIF57MS8yfSBOX3tuKzEvMn0oeCkKKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fbiAgVGhlIG9yZGVyIG9mIHRoZSBzcGhlcmljYWwgTmV1bWFubiBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIHNwaGVyaWNhbCBOZXVtYW5uIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIG91dHB1dCBzcGhlcmljYWwgTmV1bWFubiBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fc3BoX25ldW1hbm4odW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX194IDwgX1RwKDApKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQmFkIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fc3BoX25ldW1hbm4uIikpOworICAgICAgZWxzZSBpZiAoX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9feCA9PSBfVHAoMCkpCisgICAgICAgIHJldHVybiAtc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjppbmZpbml0eSgpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fal9uLCBfX25fbiwgX19qcF9uLCBfX25wX247CisgICAgICAgICAgX19zcGhfYmVzc2VsX2puKF9fbiwgX194LCBfX2pfbiwgX19uX24sIF9fanBfbiwgX19ucF9uKTsKKyAgICAgICAgICByZXR1cm4gX19uX247CisgICAgICAgIH0KKyAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0JFU1NFTF9GVU5DVElPTl9UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2JldGFfZnVuY3Rpb24udGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvYmV0YV9mdW5jdGlvbi50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0MmEyYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2JldGFfZnVuY3Rpb24udGNjCkBAIC0wLDAgKzEsMTk3IEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9iZXRhX2Z1bmN0aW9uLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9jbWF0aH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MiBUUjE6IDUuMiAgU3BlY2lhbCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQgYmFzZWQgb246CisvLyAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorLy8gICAgICAgZWQuIE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisvLyAgICAgICBEb3ZlciBQdWJsaWNhdGlvbnMsCisvLyAgICAgICBTZWN0aW9uIDYsIHBwLiAyNTMtMjY2CisvLyAgICgyKSBUaGUgR251IFNjaWVudGlmaWMgTGlicmFyeSwgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dzbAorLy8gICAoMykgTnVtZXJpY2FsIFJlY2lwZXMgaW4gQywgYnkgVy4gSC4gUHJlc3MsIFMuIEEuIFRldWtvbHNreSwKKy8vICAgICAgIFcuIFQuIFZldHRlcmxpbmcsIEIuIFAuIEZsYW5uZXJ5LCBDYW1icmlkZ2UgVW5pdmVyc2l0eSBQcmVzcyAoMTk5MiksCisvLyAgICAgICAybmQgZWQsIHBwLiAyMTMtMjE2CisvLyAgICg0KSBHYW1tYSwgRXhwbG9yaW5nIEV1bGVyJ3MgQ29uc3RhbnQsIEp1bGlhbiBIYXZpbCwKKy8vICAgICAgIFByaW5jZXRvbiwgMjAwMy4KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQkVUQV9GVU5DVElPTl9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0JFVEFfRlVOQ1RJT05fVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIFs1LjJdIFNwZWNpYWwgZnVuY3Rpb25zCisKKyAgLy8gSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGJldGEgZnVuY3Rpb246IFxmJEIoeCx5KVxmJC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBiZXRhIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkKKyAgICAgKiAgIEBmWworICAgICAqICAgICBCKHgseSkgPSBcZnJhY3tcR2FtbWEoeClcR2FtbWEoeSl9e1xHYW1tYSh4K3kpfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBiZXRhIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtIF9feSBUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBiZXRhIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGJldGEgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fYmV0YV9nYW1tYShfVHAgX194LCBfVHAgX195KQorICAgIHsKKworICAgICAgX1RwIF9fYmV0OworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIGlmIChfX3ggPiBfX3kpCisgICAgICAgIHsKKyAgICAgICAgICBfX2JldCA9IHN0ZDo6dHIxOjp0Z2FtbWEoX194KQorICAgICAgICAgICAgICAgIC8gc3RkOjp0cjE6OnRnYW1tYShfX3ggKyBfX3kpOworICAgICAgICAgIF9fYmV0ICo9IHN0ZDo6dHIxOjp0Z2FtbWEoX195KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX19iZXQgPSBzdGQ6OnRyMTo6dGdhbW1hKF9feSkKKyAgICAgICAgICAgICAgICAvIHN0ZDo6dHIxOjp0Z2FtbWEoX194ICsgX195KTsKKyAgICAgICAgICBfX2JldCAqPSBzdGQ6OnRyMTo6dGdhbW1hKF9feCk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICBpZiAoX194ID4gX195KQorICAgICAgICB7CisgICAgICAgICAgX19iZXQgPSBfX2dhbW1hKF9feCkgLyBfX2dhbW1hKF9feCArIF9feSk7CisgICAgICAgICAgX19iZXQgKj0gX19nYW1tYShfX3kpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfX2JldCA9IF9fZ2FtbWEoX195KSAvIF9fZ2FtbWEoX194ICsgX195KTsKKyAgICAgICAgICBfX2JldCAqPSBfX2dhbW1hKF9feCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICByZXR1cm4gX19iZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgYmV0YSBmdW5jdGlvbiBcZiRCKHgseSlcZiQgdXNpbmcKKyAgICAgKiAgICAgICAgICAgdGhlIGxvZyBnYW1tYSBmdW5jdGlvbnMuCisgICAgICogCisgICAgICogICBUaGUgYmV0YSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5CisgICAgICogICBAZlsKKyAgICAgKiAgICAgQih4LHkpID0gXGZyYWN7XEdhbW1hKHgpXEdhbW1hKHkpfXtcR2FtbWEoeCt5KX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gX194IFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYmV0YSBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSBfX3kgVGhlIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgYmV0YSBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBiZXRhIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2JldGFfbGdhbW1hKF9UcCBfX3gsIF9UcCBfX3kpCisgICAgeworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIF9UcCBfX2JldCA9IHN0ZDo6dHIxOjpsZ2FtbWEoX194KQorICAgICAgICAgICAgICAgICsgc3RkOjp0cjE6OmxnYW1tYShfX3kpCisgICAgICAgICAgICAgICAgLSBzdGQ6OnRyMTo6bGdhbW1hKF9feCArIF9feSk7CisjZWxzZQorICAgICAgX1RwIF9fYmV0ID0gX19sb2dfZ2FtbWEoX194KQorICAgICAgICAgICAgICAgICsgX19sb2dfZ2FtbWEoX195KQorICAgICAgICAgICAgICAgIC0gX19sb2dfZ2FtbWEoX194ICsgX195KTsKKyNlbmRpZgorICAgICAgX19iZXQgPSBzdGQ6OmV4cChfX2JldCk7CisgICAgICByZXR1cm4gX19iZXQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBiZXRhIGZ1bmN0aW9uIFxmJEIoeCx5KVxmJCB1c2luZworICAgICAqICAgICAgICAgICB0aGUgcHJvZHVjdCBmb3JtLgorICAgICAqIAorICAgICAqICAgVGhlIGJldGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgIEIoeCx5KSA9IFxmcmFje1xHYW1tYSh4KVxHYW1tYSh5KX17XEdhbW1hKHgreSl9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGJldGEgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gX195IFRoZSBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIGJldGEgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgYmV0YSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19iZXRhX3Byb2R1Y3QoX1RwIF9feCwgX1RwIF9feSkKKyAgICB7CisKKyAgICAgIF9UcCBfX2JldCA9IChfX3ggKyBfX3kpIC8gKF9feCAqIF9feSk7CisKKyAgICAgIHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwMDAwMDsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9fayA9IDE7IF9fayA8IF9fbWF4X2l0ZXI7ICsrX19rKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fdGVybSA9IChfVHAoMSkgKyAoX194ICsgX195KSAvIF9faykKKyAgICAgICAgICAgICAgICAgICAgIC8gKChfVHAoMSkgKyBfX3ggLyBfX2spICogKF9UcCgxKSArIF9feSAvIF9faykpOworICAgICAgICAgIF9fYmV0ICo9IF9fdGVybTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19iZXQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBiZXRhIGZ1bmN0aW9uIFxmJCBCKHgseSkgXGYkLgorICAgICAqIAorICAgICAqICAgVGhlIGJldGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgIEIoeCx5KSA9IFxmcmFje1xHYW1tYSh4KVxHYW1tYSh5KX17XEdhbW1hKHgreSl9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGJldGEgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gX195IFRoZSBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIGJldGEgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgYmV0YSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fYmV0YShfVHAgX194LCBfVHAgX195KQorICAgIHsKKyAgICAgIGlmIChfX2lzbmFuKF9feCkgfHwgX19pc25hbihfX3kpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9fYmV0YV9sZ2FtbWEoX194LCBfX3kpOworICAgIH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2Ugc3RkOjp0cjE6Ol9fZGV0YWlsCit9Cit9CisKKyNlbmRpZiAvLyBfX0dMSUJDWFhfVFIxX0JFVEFfRlVOQ1RJT05fVENDCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jY29tcGxleCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2Njb21wbGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNjU3NmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jY29tcGxleApAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgY2NvbXBsZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jY29tcGxleAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DQ09NUExFWAorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ0NPTVBMRVggMQorCisjaW5jbHVkZSA8dHIxL2NvbXBsZXg+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ0NPTVBMRVgKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NjdHlwZSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NjdHlwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGJhMTU4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY2N0eXBlCkBAIC0wLDAgKzEsNDkgQEAKKy8vIFRSMSBjY3R5cGUgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jY3R5cGUKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ0NUWVBFCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DQ1RZUEUgMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X0NUWVBFX1RSMQorCisjdW5kZWYgaXNibGFuaworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgdXNpbmcgOjppc2JsYW5rOworfQorfQorCisjZW5kaWYKKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9DQ1RZUEUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NmZW52IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY2ZlbnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0YTg5YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NmZW52CkBAIC0wLDAgKzEsODEgQEAKKy8vIFRSMSBjZmVudiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NmZW52CisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NGRU5WCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DRkVOViAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKyNpZiBfR0xJQkNYWF9IQVZFX0ZFTlZfSAorIyBpbmNsdWRlIDxmZW52Lmg+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfRkVOVl9UUjEKKworI3VuZGVmIGZlY2xlYXJleGNlcHQKKyN1bmRlZiBmZWdldGV4Y2VwdGZsYWcKKyN1bmRlZiBmZXJhaXNlZXhjZXB0CisjdW5kZWYgZmVzZXRleGNlcHRmbGFnCisjdW5kZWYgZmV0ZXN0ZXhjZXB0CisjdW5kZWYgZmVnZXRyb3VuZAorI3VuZGVmIGZlc2V0cm91bmQKKyN1bmRlZiBmZWdldGVudgorI3VuZGVmIGZlaG9sZGV4Y2VwdAorI3VuZGVmIGZlc2V0ZW52CisjdW5kZWYgZmV1cGRhdGVlbnYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIHR5cGVzCisgIHVzaW5nIDo6ZmVudl90OworICB1c2luZyA6OmZleGNlcHRfdDsKKworICAvLyBmdW5jdGlvbnMKKyAgdXNpbmcgOjpmZWNsZWFyZXhjZXB0OworICB1c2luZyA6OmZlZ2V0ZXhjZXB0ZmxhZzsKKyAgdXNpbmcgOjpmZXJhaXNlZXhjZXB0OworICB1c2luZyA6OmZlc2V0ZXhjZXB0ZmxhZzsKKyAgdXNpbmcgOjpmZXRlc3RleGNlcHQ7CisKKyAgdXNpbmcgOjpmZWdldHJvdW5kOworICB1c2luZyA6OmZlc2V0cm91bmQ7CisKKyAgdXNpbmcgOjpmZWdldGVudjsKKyAgdXNpbmcgOjpmZWhvbGRleGNlcHQ7CisgIHVzaW5nIDo6ZmVzZXRlbnY7CisgIHVzaW5nIDo6ZmV1cGRhdGVlbnY7Cit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5X0ZFTlZfVFIxCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ0ZFTlYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NmbG9hdCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NmbG9hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDY3ZmEwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY2Zsb2F0CkBAIC0wLDAgKzEsNDIgQEAKKy8vIFRSMSBjZmxvYXQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jZmxvYXQKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ0ZMT0FUCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DRkxPQVQgMQorCisjaW5jbHVkZSA8Y2Zsb2F0PgorCisjaWZuZGVmIERFQ0lNQUxfRElHCisjZGVmaW5lIERFQ0lNQUxfRElHIF9fREVDSU1BTF9ESUdfXworI2VuZGlmCisKKyNpZm5kZWYgRkxUX0VWQUxfTUVUSE9ECisjZGVmaW5lIEZMVF9FVkFMX01FVEhPRCBfX0ZMVF9FVkFMX01FVEhPRF9fCisjZW5kaWYKKworI2VuZGlmIC8vX0dMSUJDWFhfVFIxX0NGTE9BVCAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NpbnR0eXBlcyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NpbnR0eXBlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWU1MWVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY2ludHR5cGVzCkBAIC0wLDAgKzEsODQgQEAKKy8vIFRSMSBjaW50dHlwZXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jaW50dHlwZXMKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ0lOVFRZUEVTCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DSU5UVFlQRVMgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDx0cjEvY3N0ZGludD4KKworLy8gRm9yIDguMTEuMS8xIChzZWUgQzk5LCBOb3RlIDE4NCkKKyNpZiBfR0xJQkNYWF9IQVZFX0lOVFRZUEVTX0gKKyMgaWZuZGVmIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjICBkZWZpbmUgX1VOREVGX19TVERDX0ZPUk1BVF9NQUNST1MKKyMgIGRlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUworIyBlbmRpZgorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorIyBpZmRlZiBfVU5ERUZfX1NURENfRk9STUFUX01BQ1JPUworIyAgdW5kZWYgX19TVERDX0ZPUk1BVF9NQUNST1MKKyMgIHVuZGVmIF9VTkRFRl9fU1REQ19GT1JNQVRfTUFDUk9TCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfSU5UVFlQRVNfVFIxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyB0eXBlcworICB1c2luZyA6OmltYXhkaXZfdDsKKworICAvLyBmdW5jdGlvbnMKKyAgdXNpbmcgOjppbWF4YWJzOworCisgIC8vIE1heSBjb2xsaWRlIHdpdGggX0xvbmdsb25nIGFicyhfTG9uZ2xvbmcpLCBhbmQgaXMgbm90IGRlc2NyaWJlZAorICAvLyBhbnl3aGVyZSBvdXRzaWRlIHRoZSBzeW5vcHNpcy4gIExpa2VseSwgYSBkZWZlY3QuCisgIC8vCisgIC8vIGludG1heF90IGFicyhpbnRtYXhfdCkKKworICB1c2luZyA6OmltYXhkaXY7CisKKyAgLy8gTGlrZXdpc2UsIHdpdGggbGxkaXZfdCBkaXYoX0xvbmdsb25nLCBfTG9uZ2xvbmcpLgorICAvLworICAvLyBpbWF4ZGl2X3QgZGl2KGludG1heF90LCBpbnRtYXhfdCkKKworICB1c2luZyA6OnN0cnRvaW1heDsKKyAgdXNpbmcgOjpzdHJ0b3VtYXg7CisKKyNpZiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9XQ0hBUl9UKSAmJiBfR0xJQkNYWF9VU0VfQzk5X0lOVFRZUEVTX1dDSEFSX1RfVFIxCisgIHVzaW5nIDo6d2NzdG9pbWF4OworICB1c2luZyA6Ondjc3RvdW1heDsKKyNlbmRpZgorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9JTlRUWVBFU19UUjEKKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9DSU5UVFlQRVMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NsaW1pdHMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jbGltaXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTA5ODgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jbGltaXRzCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFRSMSBjbGltaXRzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY2xpbWl0cworICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DTElNSVRTCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DTElNSVRTIDEKKworI2luY2x1ZGUgPGNsaW1pdHM+CisKKyNpZm5kZWYgTExPTkdfTUlOCisjZGVmaW5lIExMT05HX01JTiAoLV9fTE9OR19MT05HX01BWF9fIC0gMSkKKyNlbmRpZgorCisjaWZuZGVmIExMT05HX01BWAorI2RlZmluZSBMTE9OR19NQVggX19MT05HX0xPTkdfTUFYX18KKyNlbmRpZgorCisjaWZuZGVmIFVMTE9OR19NQVgKKyNkZWZpbmUgVUxMT05HX01BWCAoX19MT05HX0xPTkdfTUFYX18gKiAyVUxMICsgMSkKKyNlbmRpZgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NMSU1JVFMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NtYXRoIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY21hdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1OGFmYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NtYXRoCkBAIC0wLDAgKzEsMTQ0MCBAQAorLy8gVFIxIGNtYXRoIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY21hdGgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ01BVEgKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NNQVRIIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Y21hdGg+CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisKKyN1bmRlZiBhY29zaAorI3VuZGVmIGFjb3NoZgorI3VuZGVmIGFjb3NobAorI3VuZGVmIGFzaW5oCisjdW5kZWYgYXNpbmhmCisjdW5kZWYgYXNpbmhsCisjdW5kZWYgYXRhbmgKKyN1bmRlZiBhdGFuaGYKKyN1bmRlZiBhdGFuaGwKKyN1bmRlZiBjYnJ0CisjdW5kZWYgY2JydGYKKyN1bmRlZiBjYnJ0bAorI3VuZGVmIGNvcHlzaWduCisjdW5kZWYgY29weXNpZ25mCisjdW5kZWYgY29weXNpZ25sCisjdW5kZWYgZXJmCisjdW5kZWYgZXJmZgorI3VuZGVmIGVyZmwKKyN1bmRlZiBlcmZjCisjdW5kZWYgZXJmY2YKKyN1bmRlZiBlcmZjbAorI3VuZGVmIGV4cDIKKyN1bmRlZiBleHAyZgorI3VuZGVmIGV4cDJsCisjdW5kZWYgZXhwbTEKKyN1bmRlZiBleHBtMWYKKyN1bmRlZiBleHBtMWwKKyN1bmRlZiBmZGltCisjdW5kZWYgZmRpbWYKKyN1bmRlZiBmZGltbAorI3VuZGVmIGZtYQorI3VuZGVmIGZtYWYKKyN1bmRlZiBmbWFsCisjdW5kZWYgZm1heAorI3VuZGVmIGZtYXhmCisjdW5kZWYgZm1heGwKKyN1bmRlZiBmbWluCisjdW5kZWYgZm1pbmYKKyN1bmRlZiBmbWlubAorI3VuZGVmIGh5cG90CisjdW5kZWYgaHlwb3RmCisjdW5kZWYgaHlwb3RsCisjdW5kZWYgaWxvZ2IKKyN1bmRlZiBpbG9nYmYKKyN1bmRlZiBpbG9nYmwKKyN1bmRlZiBsZ2FtbWEKKyN1bmRlZiBsZ2FtbWFmCisjdW5kZWYgbGdhbW1hbAorI3VuZGVmIGxscmludAorI3VuZGVmIGxscmludGYKKyN1bmRlZiBsbHJpbnRsCisjdW5kZWYgbGxyb3VuZAorI3VuZGVmIGxscm91bmRmCisjdW5kZWYgbGxyb3VuZGwKKyN1bmRlZiBsb2cxcAorI3VuZGVmIGxvZzFwZgorI3VuZGVmIGxvZzFwbAorI3VuZGVmIGxvZzIKKyN1bmRlZiBsb2cyZgorI3VuZGVmIGxvZzJsCisjdW5kZWYgbG9nYgorI3VuZGVmIGxvZ2JmCisjdW5kZWYgbG9nYmwKKyN1bmRlZiBscmludAorI3VuZGVmIGxyaW50ZgorI3VuZGVmIGxyaW50bAorI3VuZGVmIGxyb3VuZAorI3VuZGVmIGxyb3VuZGYKKyN1bmRlZiBscm91bmRsCisjdW5kZWYgbmFuCisjdW5kZWYgbmFuZgorI3VuZGVmIG5hbmwKKyN1bmRlZiBuZWFyYnlpbnQKKyN1bmRlZiBuZWFyYnlpbnRmCisjdW5kZWYgbmVhcmJ5aW50bAorI3VuZGVmIG5leHRhZnRlcgorI3VuZGVmIG5leHRhZnRlcmYKKyN1bmRlZiBuZXh0YWZ0ZXJsCisjdW5kZWYgbmV4dHRvd2FyZAorI3VuZGVmIG5leHR0b3dhcmRmCisjdW5kZWYgbmV4dHRvd2FyZGwKKyN1bmRlZiByZW1haW5kZXIKKyN1bmRlZiByZW1haW5kZXJmCisjdW5kZWYgcmVtYWluZGVybAorI3VuZGVmIHJlbXF1bworI3VuZGVmIHJlbXF1b2YKKyN1bmRlZiByZW1xdW9sCisjdW5kZWYgcmludAorI3VuZGVmIHJpbnRmCisjdW5kZWYgcmludGwKKyN1bmRlZiByb3VuZAorI3VuZGVmIHJvdW5kZgorI3VuZGVmIHJvdW5kbAorI3VuZGVmIHNjYWxibG4KKyN1bmRlZiBzY2FsYmxuZgorI3VuZGVmIHNjYWxibG5sCisjdW5kZWYgc2NhbGJuCisjdW5kZWYgc2NhbGJuZgorI3VuZGVmIHNjYWxibmwKKyN1bmRlZiB0Z2FtbWEKKyN1bmRlZiB0Z2FtbWFmCisjdW5kZWYgdGdhbW1hbAorI3VuZGVmIHRydW5jCisjdW5kZWYgdHJ1bmNmCisjdW5kZWYgdHJ1bmNsCisKKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisKKyAgLy8gdHlwZXMKKyAgdXNpbmcgOjpkb3VibGVfdDsKKyAgdXNpbmcgOjpmbG9hdF90OworCisgIC8vIGZ1bmN0aW9ucworICB1c2luZyA6OmFjb3NoOworICB1c2luZyA6OmFjb3NoZjsKKyAgdXNpbmcgOjphY29zaGw7CisKKyAgdXNpbmcgOjphc2luaDsKKyAgdXNpbmcgOjphc2luaGY7CisgIHVzaW5nIDo6YXNpbmhsOworCisgIHVzaW5nIDo6YXRhbmg7CisgIHVzaW5nIDo6YXRhbmhmOworICB1c2luZyA6OmF0YW5obDsKKworICB1c2luZyA6OmNicnQ7CisgIHVzaW5nIDo6Y2JydGY7CisgIHVzaW5nIDo6Y2JydGw7CisKKyAgdXNpbmcgOjpjb3B5c2lnbjsKKyAgdXNpbmcgOjpjb3B5c2lnbmY7CisgIHVzaW5nIDo6Y29weXNpZ25sOworCisgIHVzaW5nIDo6ZXJmOworICB1c2luZyA6OmVyZmY7CisgIHVzaW5nIDo6ZXJmbDsKKworICB1c2luZyA6OmVyZmM7CisgIHVzaW5nIDo6ZXJmY2Y7CisgIHVzaW5nIDo6ZXJmY2w7CisKKyAgdXNpbmcgOjpleHAyOworICB1c2luZyA6OmV4cDJmOworICB1c2luZyA6OmV4cDJsOworCisgIHVzaW5nIDo6ZXhwbTE7CisgIHVzaW5nIDo6ZXhwbTFmOworICB1c2luZyA6OmV4cG0xbDsKKworICB1c2luZyA6OmZkaW07CisgIHVzaW5nIDo6ZmRpbWY7CisgIHVzaW5nIDo6ZmRpbWw7CisKKyAgdXNpbmcgOjpmbWE7CisgIHVzaW5nIDo6Zm1hZjsKKyAgdXNpbmcgOjpmbWFsOworCisgIHVzaW5nIDo6Zm1heDsKKyAgdXNpbmcgOjpmbWF4ZjsKKyAgdXNpbmcgOjpmbWF4bDsKKworICB1c2luZyA6OmZtaW47CisgIHVzaW5nIDo6Zm1pbmY7CisgIHVzaW5nIDo6Zm1pbmw7CisKKyAgdXNpbmcgOjpoeXBvdDsKKyAgdXNpbmcgOjpoeXBvdGY7CisgIHVzaW5nIDo6aHlwb3RsOworCisgIHVzaW5nIDo6aWxvZ2I7CisgIHVzaW5nIDo6aWxvZ2JmOworICB1c2luZyA6Omlsb2dibDsKKworICB1c2luZyA6OmxnYW1tYTsKKyAgdXNpbmcgOjpsZ2FtbWFmOworICB1c2luZyA6OmxnYW1tYWw7CisKKyAgdXNpbmcgOjpsbHJpbnQ7CisgIHVzaW5nIDo6bGxyaW50ZjsKKyAgdXNpbmcgOjpsbHJpbnRsOworCisgIHVzaW5nIDo6bGxyb3VuZDsKKyAgdXNpbmcgOjpsbHJvdW5kZjsKKyAgdXNpbmcgOjpsbHJvdW5kbDsKKworICB1c2luZyA6OmxvZzFwOworICB1c2luZyA6OmxvZzFwZjsKKyAgdXNpbmcgOjpsb2cxcGw7CisKKyAgdXNpbmcgOjpsb2cyOworICB1c2luZyA6OmxvZzJmOworICB1c2luZyA6OmxvZzJsOworCisgIHVzaW5nIDo6bG9nYjsKKyAgdXNpbmcgOjpsb2diZjsKKyAgdXNpbmcgOjpsb2dibDsKKworICB1c2luZyA6OmxyaW50OworICB1c2luZyA6OmxyaW50ZjsKKyAgdXNpbmcgOjpscmludGw7CisKKyAgdXNpbmcgOjpscm91bmQ7CisgIHVzaW5nIDo6bHJvdW5kZjsKKyAgdXNpbmcgOjpscm91bmRsOworCisgIHVzaW5nIDo6bmFuOworICB1c2luZyA6Om5hbmY7CisgIHVzaW5nIDo6bmFubDsKKworICB1c2luZyA6Om5lYXJieWludDsKKyAgdXNpbmcgOjpuZWFyYnlpbnRmOworICB1c2luZyA6Om5lYXJieWludGw7CisKKyAgdXNpbmcgOjpuZXh0YWZ0ZXI7CisgIHVzaW5nIDo6bmV4dGFmdGVyZjsKKyAgdXNpbmcgOjpuZXh0YWZ0ZXJsOworCisgIHVzaW5nIDo6bmV4dHRvd2FyZDsKKyAgdXNpbmcgOjpuZXh0dG93YXJkZjsKKyAgdXNpbmcgOjpuZXh0dG93YXJkbDsKKworICB1c2luZyA6OnJlbWFpbmRlcjsKKyAgdXNpbmcgOjpyZW1haW5kZXJmOworICB1c2luZyA6OnJlbWFpbmRlcmw7CisKKyAgdXNpbmcgOjpyZW1xdW87CisgIHVzaW5nIDo6cmVtcXVvZjsKKyAgdXNpbmcgOjpyZW1xdW9sOworCisgIHVzaW5nIDo6cmludDsKKyAgdXNpbmcgOjpyaW50ZjsKKyAgdXNpbmcgOjpyaW50bDsKKworICB1c2luZyA6OnJvdW5kOworICB1c2luZyA6OnJvdW5kZjsKKyAgdXNpbmcgOjpyb3VuZGw7CisKKyAgdXNpbmcgOjpzY2FsYmxuOworICB1c2luZyA6OnNjYWxibG5mOworICB1c2luZyA6OnNjYWxibG5sOworCisgIHVzaW5nIDo6c2NhbGJuOworICB1c2luZyA6OnNjYWxibmY7CisgIHVzaW5nIDo6c2NhbGJubDsKKworICB1c2luZyA6OnRnYW1tYTsKKyAgdXNpbmcgOjp0Z2FtbWFmOworICB1c2luZyA6OnRnYW1tYWw7CisKKyAgdXNpbmcgOjp0cnVuYzsKKyAgdXNpbmcgOjp0cnVuY2Y7CisgIHVzaW5nIDo6dHJ1bmNsOworCisjZW5kaWYKKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSAorI2lmICFfR0xJQkNYWF9VU0VfQzk5X0ZQX01BQ1JPU19EWU5BTUlDCisKKyAgLy8vIEZ1bmN0aW9uIHRlbXBsYXRlIGRlZmluaXRpb25zIFs4LjE2LjNdLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGZwY2xhc3NpZnkoX1RwIF9fZikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2ZwY2xhc3NpZnkoRlBfTkFOLCBGUF9JTkZJTklURSwgRlBfTk9STUFMLAorCQkJCSAgRlBfU1VCTk9STUFMLCBGUF9aRVJPLCBfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNmaW5pdGUoX1RwIF9fZikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzZmluaXRlKF9fdHlwZShfX2YpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc2luZihfVHAgX19mKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNpbmYoX190eXBlKF9fZikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzbmFuKF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc25hbihfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNub3JtYWwoX1RwIF9fZikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbm9ybWFsKF9fdHlwZShfX2YpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBzaWduYml0KF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9zaWduYml0KF9fdHlwZShfX2YpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc2dyZWF0ZXIoX1RwIF9fZjEsIF9UcCBfX2YyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNncmVhdGVyKF9fdHlwZShfX2YxKSwgX190eXBlKF9fZjIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc2dyZWF0ZXJlcXVhbChfVHAgX19mMSwgX1RwIF9fZjIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXJlcXVhbChfX3R5cGUoX19mMSksIF9fdHlwZShfX2YyKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNsZXNzKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbGVzcyhfX3R5cGUoX19mMSksIF9fdHlwZShfX2YyKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNsZXNzZXF1YWwoX1RwIF9fZjEsIF9UcCBfX2YyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNsZXNzZXF1YWwoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzbGVzc2dyZWF0ZXIoX1RwIF9fZjEsIF9UcCBfX2YyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNsZXNzZ3JlYXRlcihfX3R5cGUoX19mMSksIF9fdHlwZShfX2YyKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXN1bm9yZGVyZWQoX1RwIF9fZjEsIF9UcCBfX2YyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXN1bm9yZGVyZWQoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworI2VuZGlmCisjZW5kaWYKKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKworICAvLy8gQWRkaXRpb25hbCBvdmVybG9hZHMgWzguMTYuNF0uCisgIHVzaW5nIHN0ZDo6YWNvczsKKworICBpbmxpbmUgZmxvYXQKKyAgYWNvc2goZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYWNvc2hmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgYWNvc2gobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYWNvc2hsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBhY29zaChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9hY29zaChfX3gpOyB9CisKKyAgdXNpbmcgc3RkOjphc2luOworCisgIGlubGluZSBmbG9hdAorICBhc2luaChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hc2luaGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBhc2luaChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hc2luaGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGFzaW5oKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2FzaW5oKF9feCk7IH0KKworICB1c2luZyBzdGQ6OmF0YW47CisgIHVzaW5nIHN0ZDo6YXRhbjI7CisKKyAgaW5saW5lIGZsb2F0CisgIGF0YW5oKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2F0YW5oZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGF0YW5oKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2F0YW5obChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgYXRhbmgoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fYXRhbmgoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICBjYnJ0KGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2NicnRmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgY2JydChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYnJ0bChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgY2JydChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYnJ0KF9feCk7IH0KKworICB1c2luZyBzdGQ6OmNlaWw7CisKKyAgaW5saW5lIGZsb2F0CisgIGNvcHlzaWduKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fY29weXNpZ25mKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBjb3B5c2lnbihsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2NvcHlzaWdubChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIGNvcHlzaWduKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBjb3B5c2lnbihfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICB1c2luZyBzdGQ6OmNvczsKKyAgdXNpbmcgc3RkOjpjb3NoOyAgCisKKyAgaW5saW5lIGZsb2F0CisgIGVyZihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9lcmZmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZXJmKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2VyZmwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGVyZihfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9lcmYoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICBlcmZjKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2VyZmNmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZXJmYyhsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9lcmZjbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgZXJmYyhfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9lcmZjKF9feCk7IH0KKworICB1c2luZyBzdGQ6OmV4cDsKKworICBpbmxpbmUgZmxvYXQKKyAgZXhwMihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9leHAyZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGV4cDIobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXhwMmwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGV4cDIoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZXhwMihfX3gpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIGV4cG0xKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2V4cG0xZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGV4cG0xKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2V4cG0xbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgZXhwbTEoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZXhwbTEoX194KTsgfQorCisgIC8vIE5vdGU6IHdlIGRlYWwgd2l0aCBmYWJzIGluIGEgc3BlY2lhbCB3YXksIGJlY2F1c2UgYW4gdXNpbmcgc3RkOjpmYWJzCisgIC8vIHdvdWxkIGJyaW5nIGluIGFsc28gdGhlIG92ZXJsb2FkcyBmb3IgY29tcGxleCB0eXBlcywgd2hpY2ggaW4gQysrMHgKKyAgLy8gbW9kZSBoYXZlIGEgZGlmZmVyZW50IHJldHVybiB0eXBlLgorICAvLyBXaXRoIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTywgbWF0aC5oIGltcG9ydHMgc3RkOjpmYWJzIGluIHRoZQorICAvLyBnbG9iYWwgbmFtZXNwYWNlIGFmdGVyIHRoZSBkZWNsYXJhdGlvbnMgb2YgdGhlIGZsb2F0IC8gZG91YmxlIC8gbG9uZworICAvLyBkb3VibGUgb3ZlcmxvYWRzIGJ1dCBiZWZvcmUgdGhlIHN0ZDo6Y29tcGxleCBvdmVybG9hZHMuCisgIHVzaW5nIDo6ZmFiczsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIGZsb2F0CisgIGZhYnMoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmFic2YoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBmYWJzKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZhYnNsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBmYWJzKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2ZhYnMoX194KTsgfQorI2VuZGlmCisKKyAgaW5saW5lIGZsb2F0CisgIGZkaW0oZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mZGltZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZmRpbShsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZkaW1sKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgZmRpbShfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gZmRpbShfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICB1c2luZyBzdGQ6OmZsb29yOworCisgIGlubGluZSBmbG9hdAorICBmbWEoZmxvYXQgX194LCBmbG9hdCBfX3ksIGZsb2F0IF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2ZtYWYoX194LCBfX3ksIF9feik7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZm1hKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195LCBsb25nIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWFsKF9feCwgX195LCBfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9WcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMzxfVHAsIF9VcCwgX1ZwPjo6X190eXBlCisgICAgZm1hKF9UcCBfX3gsIF9VcCBfX3ksIF9WcCBfX3opCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8zPF9UcCwgX1VwLCBfVnA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGZtYShfX3R5cGUoX194KSwgX190eXBlKF9feSksIF9fdHlwZShfX3opKTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGZtYXgoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWF4ZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZm1heChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZtYXhsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgZm1heChfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gZm1heChfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgZm1pbihmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZtaW5mKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBmbWluKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fZm1pbmwoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUKKyAgICBmbWluKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBmbWluKF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIHVzaW5nIHN0ZDo6Zm1vZDsKKyAgdXNpbmcgc3RkOjpmcmV4cDsKKworICBpbmxpbmUgZmxvYXQKKyAgaHlwb3QoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9oeXBvdGYoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGh5cG90KGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faHlwb3RsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgaHlwb3QoX1RwIF9feSwgX1VwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGh5cG90KF9fdHlwZShfX3kpLCBfX3R5cGUoX194KSk7CisgICAgfQorCisgIGlubGluZSBpbnQKKyAgaWxvZ2IoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faWxvZ2JmKF9feCk7IH0KKworICBpbmxpbmUgaW50CisgIGlsb2diKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lsb2dibChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaWxvZ2IoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5faWxvZ2IoX194KTsgfQorCisgIHVzaW5nIHN0ZDo6bGRleHA7CisKKyAgaW5saW5lIGZsb2F0CisgIGxnYW1tYShmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sZ2FtbWFmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgbGdhbW1hKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xnYW1tYWwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxnYW1tYShfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sZ2FtbWEoX194KTsgfQorCisgIGlubGluZSBsb25nIGxvbmcKKyAgbGxyaW50KGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xscmludGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGxvbmcKKyAgbGxyaW50KGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xscmludGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGxvbmcgbG9uZz46Ol9fdHlwZQorICAgIGxscmludChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sbHJpbnQoX194KTsgfQorCisgIGlubGluZSBsb25nIGxvbmcKKyAgbGxyb3VuZChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sbHJvdW5kZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgbG9uZworICBsbHJvdW5kKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xscm91bmRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBsb25nIGxvbmc+OjpfX3R5cGUKKyAgICBsbHJvdW5kKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xscm91bmQoX194KTsgfQorCisgIHVzaW5nIHN0ZDo6bG9nOworICB1c2luZyBzdGQ6OmxvZzEwOworCisgIGlubGluZSBmbG9hdAorICBsb2cxcChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cxcGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBsb2cxcChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cxcGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxvZzFwKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xvZzFwKF9feCk7IH0KKworICAvLyBEUiA1NjguCisgIGlubGluZSBmbG9hdAorICBsb2cyKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xvZzJmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgbG9nMihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cybChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgbG9nMihfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cyKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgbG9nYihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2diZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGxvZ2IobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nYmwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxvZ2IoX1RwIF9feCkKKyAgICB7CisgICAgICByZXR1cm4gX19idWlsdGluX2xvZ2IoX194KTsKKyAgICB9CisKKyAgaW5saW5lIGxvbmcKKyAgbHJpbnQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbHJpbnRmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZworICBscmludChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9scmludGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGxvbmc+OjpfX3R5cGUKKyAgICBscmludChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9scmludChfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcKKyAgbHJvdW5kKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xyb3VuZGYoX194KTsgfQorCisgIGlubGluZSBsb25nCisgIGxyb3VuZChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9scm91bmRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBsb25nPjo6X190eXBlCisgICAgbHJvdW5kKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xyb3VuZChfX3gpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIG5lYXJieWludChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZWFyYnlpbnRmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgbmVhcmJ5aW50KGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX25lYXJieWludGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIG5lYXJieWludChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZWFyYnlpbnQoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICBuZXh0YWZ0ZXIoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0YWZ0ZXJmKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBuZXh0YWZ0ZXIobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0YWZ0ZXJsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgbmV4dGFmdGVyKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBuZXh0YWZ0ZXIoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIG5leHR0b3dhcmQoZmxvYXQgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0dG93YXJkZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgbmV4dHRvd2FyZChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX25leHR0b3dhcmRsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIG5leHR0b3dhcmQoX1RwIF9feCwgbG9uZyBkb3VibGUgX195KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0dG93YXJkKF9feCwgX195KTsgfQorCisgIC8vIERSIDU1MC4gV2hhdCBzaG91bGQgdGhlIHJldHVybiB0eXBlIG9mIHBvdyhmbG9hdCxpbnQpIGJlPworICAvLyBOQjogQysrMHggYW5kIFRSMSAhPSBDKyswMy4KKyAgLy8gICB1c2luZyBzdGQ6OnBvdzsKKworICBpbmxpbmUgZmxvYXQKKyAgcmVtYWluZGVyKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fcmVtYWluZGVyZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgcmVtYWluZGVyKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fcmVtYWluZGVybChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIHJlbWFpbmRlcihfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gcmVtYWluZGVyKF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICByZW1xdW8oZmxvYXQgX194LCBmbG9hdCBfX3ksIGludCogX19wcXVvKQorICB7IHJldHVybiBfX2J1aWx0aW5fcmVtcXVvZihfX3gsIF9feSwgX19wcXVvKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICByZW1xdW8obG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3ksIGludCogX19wcXVvKQorICB7IHJldHVybiBfX2J1aWx0aW5fcmVtcXVvbChfX3gsIF9feSwgX19wcXVvKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgcmVtcXVvKF9UcCBfX3gsIF9VcCBfX3ksIGludCogX19wcXVvKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gcmVtcXVvKF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSwgX19wcXVvKTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIHJpbnQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fcmludGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICByaW50KGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3JpbnRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICByaW50KF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3JpbnQoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICByb3VuZChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yb3VuZGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICByb3VuZChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yb3VuZGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHJvdW5kKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3JvdW5kKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgc2NhbGJsbihmbG9hdCBfX3gsIGxvbmcgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibG5mKF9feCwgX19leCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgc2NhbGJsbihsb25nIGRvdWJsZSBfX3gsIGxvbmcgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibG5sKF9feCwgX19leCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBzY2FsYmxuKF9UcCBfX3gsIGxvbmcgX19leCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fc2NhbGJsbihfX3gsIF9fZXgpOyB9CisgCisgIGlubGluZSBmbG9hdAorICBzY2FsYm4oZmxvYXQgX194LCBpbnQgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibmYoX194LCBfX2V4KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBzY2FsYm4obG9uZyBkb3VibGUgX194LCBpbnQgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibmwoX194LCBfX2V4KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHNjYWxibihfVHAgX194LCBpbnQgX19leCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fc2NhbGJuKF9feCwgX19leCk7IH0KKworICB1c2luZyBzdGQ6OnNpbjsKKyAgdXNpbmcgc3RkOjpzaW5oOworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHVzaW5nIHN0ZDo6dGFuOworICB1c2luZyBzdGQ6OnRhbmg7CisKKyAgaW5saW5lIGZsb2F0CisgIHRnYW1tYShmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl90Z2FtbWFmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgdGdhbW1hKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RnYW1tYWwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHRnYW1tYShfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl90Z2FtbWEoX194KTsgfQorIAorICBpbmxpbmUgZmxvYXQKKyAgdHJ1bmMoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fdHJ1bmNmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgdHJ1bmMobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fdHJ1bmNsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICB0cnVuYyhfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl90cnVuYyhfX3gpOyB9CisKKyNlbmRpZgorX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBEUiA1NTAuIFdoYXQgc2hvdWxkIHRoZSByZXR1cm4gdHlwZSBvZiBwb3coZmxvYXQsaW50KSBiZT8KKyAgLy8gTkI6IEMrKzB4IGFuZCBUUjEgIT0gQysrMDMuCisgIGlubGluZSBkb3VibGUKKyAgcG93KGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIHN0ZDo6cG93KF9feCwgX195KTsgfQorCisgIGlubGluZSBmbG9hdAorICBwb3coZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIHN0ZDo6cG93KF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBwb3cobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIHN0ZDo6cG93KF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgcG93KF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvdyhfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx0cjEvdHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDx0cjEvZ2FtbWEudGNjPgorI2luY2x1ZGUgPHRyMS9iZXNzZWxfZnVuY3Rpb24udGNjPgorI2luY2x1ZGUgPHRyMS9iZXRhX2Z1bmN0aW9uLnRjYz4KKyNpbmNsdWRlIDx0cjEvZWxsX2ludGVncmFsLnRjYz4KKyNpbmNsdWRlIDx0cjEvZXhwX2ludGVncmFsLnRjYz4KKyNpbmNsdWRlIDx0cjEvaHlwZXJnZW9tZXRyaWMudGNjPgorI2luY2x1ZGUgPHRyMS9sZWdlbmRyZV9mdW5jdGlvbi50Y2M+CisjaW5jbHVkZSA8dHIxL21vZGlmaWVkX2Jlc3NlbF9mdW5jLnRjYz4KKyNpbmNsdWRlIDx0cjEvcG9seV9oZXJtaXRlLnRjYz4KKyNpbmNsdWRlIDx0cjEvcG9seV9sYWd1ZXJyZS50Y2M+CisjaW5jbHVkZSA8dHIxL3JpZW1hbm5femV0YS50Y2M+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGRlZmdyb3VwIHRyMV9tYXRoX3NwZWNfZnVuYyBNYXRoZW1hdGljYWwgU3BlY2lhbCBGdW5jdGlvbnMKKyAgICogQGluZ3JvdXAgbnVtZXJpY3MKKyAgICoKKyAgICogQSBjb2xsZWN0aW9uIG9mIGFkdmFuY2VkIG1hdGhlbWF0aWNhbCBzcGVjaWFsIGZ1bmN0aW9ucy4KKyAgICogQHsKKyAgICovCisKKyAgaW5saW5lIGZsb2F0CisgIGFzc29jX2xhZ3VlcnJlZih1bnNpZ25lZCBpbnQgX19uLCB1bnNpZ25lZCBpbnQgX19tLCBmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2Fzc29jX2xhZ3VlcnJlPGZsb2F0PihfX24sIF9fbSwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBhc3NvY19sYWd1ZXJyZWwodW5zaWduZWQgaW50IF9fbiwgdW5zaWduZWQgaW50IF9fbSwgbG9uZyBkb3VibGUgX194KQorICB7CisgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2Fzc29jX2xhZ3VlcnJlPGxvbmcgZG91YmxlPihfX24sIF9fbSwgX194KTsKKyAgfQorCisgIC8vLyAgNS4yLjEuMSAgQXNzb2NpYXRlZCBMYWd1ZXJyZSBwb2x5bm9taWFscy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBhc3NvY19sYWd1ZXJyZSh1bnNpZ25lZCBpbnQgX19uLCB1bnNpZ25lZCBpbnQgX19tLCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19hc3NvY19sYWd1ZXJyZTxfX3R5cGU+KF9fbiwgX19tLCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgYXNzb2NfbGVnZW5kcmVmKHVuc2lnbmVkIGludCBfX2wsIHVuc2lnbmVkIGludCBfX20sIGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fYXNzb2NfbGVnZW5kcmVfcDxmbG9hdD4oX19sLCBfX20sIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgYXNzb2NfbGVnZW5kcmVsKHVuc2lnbmVkIGludCBfX2wsIHVuc2lnbmVkIGludCBfX20sIGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fYXNzb2NfbGVnZW5kcmVfcDxsb25nIGRvdWJsZT4oX19sLCBfX20sIF9feCk7IH0KKworICAvLy8gIDUuMi4xLjIgIEFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGFzc29jX2xlZ2VuZHJlKHVuc2lnbmVkIGludCBfX2wsIHVuc2lnbmVkIGludCBfX20sIF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2Fzc29jX2xlZ2VuZHJlX3A8X190eXBlPihfX2wsIF9fbSwgX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGJldGFmKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2RldGFpbDo6X19iZXRhPGZsb2F0PihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgYmV0YWwobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2JldGE8bG9uZyBkb3VibGU+KF9feCwgX195KTsgfQorCisgIC8vLyAgNS4yLjEuMyAgQmV0YSBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcHgsIHR5cGVuYW1lIF9UcHk+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RweCwgX1RweT46Ol9fdHlwZQorICAgIGJldGEoX1RweCBfX3gsIF9UcHkgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHB4LCBfVHB5Pjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19iZXRhPF9fdHlwZT4oX194LCBfX3kpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgY29tcF9lbGxpbnRfMWYoZmxvYXQgX19rKQorICB7IHJldHVybiBfX2RldGFpbDo6X19jb21wX2VsbGludF8xPGZsb2F0PihfX2spOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGNvbXBfZWxsaW50XzFsKGxvbmcgZG91YmxlIF9faykKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY29tcF9lbGxpbnRfMTxsb25nIGRvdWJsZT4oX19rKTsgfQorCisgIC8vLyAgNS4yLjEuNCAgQ29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWxzIG9mIHRoZSBmaXJzdCBraW5kLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGNvbXBfZWxsaW50XzEoX1RwIF9faykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fY29tcF9lbGxpbnRfMTxfX3R5cGU+KF9fayk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBjb21wX2VsbGludF8yZihmbG9hdCBfX2spCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2NvbXBfZWxsaW50XzI8ZmxvYXQ+KF9fayk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgY29tcF9lbGxpbnRfMmwobG9uZyBkb3VibGUgX19rKQorICB7IHJldHVybiBfX2RldGFpbDo6X19jb21wX2VsbGludF8yPGxvbmcgZG91YmxlPihfX2spOyB9CisKKyAgLy8vICA1LjIuMS41ICBDb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbHMgb2YgdGhlIHNlY29uZCBraW5kLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGNvbXBfZWxsaW50XzIoX1RwIF9faykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fY29tcF9lbGxpbnRfMjxfX3R5cGU+KF9fayk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBjb21wX2VsbGludF8zZihmbG9hdCBfX2ssIGZsb2F0IF9fbnUpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2NvbXBfZWxsaW50XzM8ZmxvYXQ+KF9faywgX19udSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgY29tcF9lbGxpbnRfM2wobG9uZyBkb3VibGUgX19rLCBsb25nIGRvdWJsZSBfX251KQorICB7IHJldHVybiBfX2RldGFpbDo6X19jb21wX2VsbGludF8zPGxvbmcgZG91YmxlPihfX2ssIF9fbnUpOyB9CisKKyAgLy8vICA1LjIuMS42ICBDb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbHMgb2YgdGhlIHRoaXJkIGtpbmQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1Rwbj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9UcG4+OjpfX3R5cGUKKyAgICBjb21wX2VsbGludF8zKF9UcCBfX2ssIF9UcG4gX19udSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVHBuPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19jb21wX2VsbGludF8zPF9fdHlwZT4oX19rLCBfX251KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGNvbmZfaHlwZXJnZihmbG9hdCBfX2EsIGZsb2F0IF9fYywgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19jb25mX2h5cGVyZzxmbG9hdD4oX19hLCBfX2MsIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgY29uZl9oeXBlcmdsKGxvbmcgZG91YmxlIF9fYSwgbG9uZyBkb3VibGUgX19jLCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2NvbmZfaHlwZXJnPGxvbmcgZG91YmxlPihfX2EsIF9fYywgX194KTsgfQorCisgIC8vLyAgNS4yLjEuNyAgQ29uZmx1ZW50IGh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwYSwgdHlwZW5hbWUgX1RwYywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8zPF9UcGEsIF9UcGMsIF9UcD46Ol9fdHlwZQorICAgIGNvbmZfaHlwZXJnKF9UcGEgX19hLCBfVHBjIF9fYywgX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzM8X1RwYSwgX1RwYywgX1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19jb25mX2h5cGVyZzxfX3R5cGU+KF9fYSwgX19jLCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgY3lsX2Jlc3NlbF9pZihmbG9hdCBfX251LCBmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2N5bF9iZXNzZWxfaTxmbG9hdD4oX19udSwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBjeWxfYmVzc2VsX2lsKGxvbmcgZG91YmxlIF9fbnUsIGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY3lsX2Jlc3NlbF9pPGxvbmcgZG91YmxlPihfX251LCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS44ICBSZWd1bGFyIG1vZGlmaWVkIGN5bGluZHJpY2FsIEJlc3NlbCBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcG51LCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwbnUsIF9UcD46Ol9fdHlwZQorICAgIGN5bF9iZXNzZWxfaShfVHBudSBfX251LCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHBudSwgX1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19jeWxfYmVzc2VsX2k8X190eXBlPihfX251LCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgY3lsX2Jlc3NlbF9qZihmbG9hdCBfX251LCBmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2N5bF9iZXNzZWxfajxmbG9hdD4oX19udSwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBjeWxfYmVzc2VsX2psKGxvbmcgZG91YmxlIF9fbnUsIGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY3lsX2Jlc3NlbF9qPGxvbmcgZG91YmxlPihfX251LCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS45ICBDeWxpbmRyaWNhbCBCZXNzZWwgZnVuY3Rpb25zIChvZiB0aGUgZmlyc3Qga2luZCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcG51LCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwbnUsIF9UcD46Ol9fdHlwZQorICAgIGN5bF9iZXNzZWxfaihfVHBudSBfX251LCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHBudSwgX1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19jeWxfYmVzc2VsX2o8X190eXBlPihfX251LCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgY3lsX2Jlc3NlbF9rZihmbG9hdCBfX251LCBmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2N5bF9iZXNzZWxfazxmbG9hdD4oX19udSwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBjeWxfYmVzc2VsX2tsKGxvbmcgZG91YmxlIF9fbnUsIGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY3lsX2Jlc3NlbF9rPGxvbmcgZG91YmxlPihfX251LCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4xMCAgSXJyZWd1bGFyIG1vZGlmaWVkIGN5bGluZHJpY2FsIEJlc3NlbCBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcG51LCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwbnUsIF9UcD46Ol9fdHlwZQorICAgIGN5bF9iZXNzZWxfayhfVHBudSBfX251LCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHBudSwgX1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19jeWxfYmVzc2VsX2s8X190eXBlPihfX251LCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgY3lsX25ldW1hbm5mKGZsb2F0IF9fbnUsIGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY3lsX25ldW1hbm5fbjxmbG9hdD4oX19udSwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBjeWxfbmV1bWFubmwobG9uZyBkb3VibGUgX19udSwgbG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19jeWxfbmV1bWFubl9uPGxvbmcgZG91YmxlPihfX251LCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4xMSAgQ3lsaW5kcmljYWwgTmV1bWFubiBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcG51LCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwbnUsIF9UcD46Ol9fdHlwZQorICAgIGN5bF9uZXVtYW5uKF9UcG51IF9fbnUsIF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcG51LCBfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2N5bF9uZXVtYW5uX248X190eXBlPihfX251LCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgZWxsaW50XzFmKGZsb2F0IF9faywgZmxvYXQgX19waGkpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2VsbGludF8xPGZsb2F0PihfX2ssIF9fcGhpKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBlbGxpbnRfMWwobG9uZyBkb3VibGUgX19rLCBsb25nIGRvdWJsZSBfX3BoaSkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fZWxsaW50XzE8bG9uZyBkb3VibGU+KF9faywgX19waGkpOyB9CisKKyAgLy8vICA1LjIuMS4xMiAgSW5jb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbHMgb2YgdGhlIGZpcnN0IGtpbmQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9UcHA+OjpfX3R5cGUKKyAgICBlbGxpbnRfMShfVHAgX19rLCBfVHBwIF9fcGhpKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9UcHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2VsbGludF8xPF9fdHlwZT4oX19rLCBfX3BoaSk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBlbGxpbnRfMmYoZmxvYXQgX19rLCBmbG9hdCBfX3BoaSkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fZWxsaW50XzI8ZmxvYXQ+KF9faywgX19waGkpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGVsbGludF8ybChsb25nIGRvdWJsZSBfX2ssIGxvbmcgZG91YmxlIF9fcGhpKQorICB7IHJldHVybiBfX2RldGFpbDo6X19lbGxpbnRfMjxsb25nIGRvdWJsZT4oX19rLCBfX3BoaSk7IH0KKworICAvLy8gIDUuMi4xLjEzICBJbmNvbXBsZXRlIGVsbGlwdGljIGludGVncmFscyBvZiB0aGUgc2Vjb25kIGtpbmQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9UcHA+OjpfX3R5cGUKKyAgICBlbGxpbnRfMihfVHAgX19rLCBfVHBwIF9fcGhpKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9UcHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2VsbGludF8yPF9fdHlwZT4oX19rLCBfX3BoaSk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBlbGxpbnRfM2YoZmxvYXQgX19rLCBmbG9hdCBfX251LCBmbG9hdCBfX3BoaSkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fZWxsaW50XzM8ZmxvYXQ+KF9faywgX19udSwgX19waGkpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGVsbGludF8zbChsb25nIGRvdWJsZSBfX2ssIGxvbmcgZG91YmxlIF9fbnUsIGxvbmcgZG91YmxlIF9fcGhpKQorICB7IHJldHVybiBfX2RldGFpbDo6X19lbGxpbnRfMzxsb25nIGRvdWJsZT4oX19rLCBfX251LCBfX3BoaSk7IH0KKworICAvLy8gIDUuMi4xLjE0ICBJbmNvbXBsZXRlIGVsbGlwdGljIGludGVncmFscyBvZiB0aGUgdGhpcmQga2luZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHBuLCB0eXBlbmFtZSBfVHBwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8zPF9UcCwgX1RwbiwgX1RwcD46Ol9fdHlwZQorICAgIGVsbGludF8zKF9UcCBfX2ssIF9UcG4gX19udSwgX1RwcCBfX3BoaSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzM8X1RwLCBfVHBuLCBfVHBwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19lbGxpbnRfMzxfX3R5cGU+KF9faywgX19udSwgX19waGkpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgZXhwaW50ZihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2V4cGludDxmbG9hdD4oX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBleHBpbnRsKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fZXhwaW50PGxvbmcgZG91YmxlPihfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4xNSAgRXhwb25lbnRpYWwgaW50ZWdyYWxzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGV4cGludChfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19leHBpbnQ8X190eXBlPihfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgaGVybWl0ZWYodW5zaWduZWQgaW50IF9fbiwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19wb2x5X2hlcm1pdGU8ZmxvYXQ+KF9fbiwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBoZXJtaXRlbCh1bnNpZ25lZCBpbnQgX19uLCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3BvbHlfaGVybWl0ZTxsb25nIGRvdWJsZT4oX19uLCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4xNiAgSGVybWl0ZSBwb2x5bm9taWFscy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBoZXJtaXRlKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX3BvbHlfaGVybWl0ZTxfX3R5cGU+KF9fbiwgX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGh5cGVyZ2YoZmxvYXQgX19hLCBmbG9hdCBfX2IsIGZsb2F0IF9fYywgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19oeXBlcmc8ZmxvYXQ+KF9fYSwgX19iLCBfX2MsIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgaHlwZXJnbChsb25nIGRvdWJsZSBfX2EsIGxvbmcgZG91YmxlIF9fYiwgbG9uZyBkb3VibGUgX19jLCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2h5cGVyZzxsb25nIGRvdWJsZT4oX19hLCBfX2IsIF9fYywgX194KTsgfQorCisgIC8vLyAgNS4yLjEuMTcgIEh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwYSwgdHlwZW5hbWUgX1RwYiwgdHlwZW5hbWUgX1RwYywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV80PF9UcGEsIF9UcGIsIF9UcGMsIF9UcD46Ol9fdHlwZQorICAgIGh5cGVyZyhfVHBhIF9fYSwgX1RwYiBfX2IsIF9UcGMgX19jLCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfNDxfVHBhLCBfVHBiLCBfVHBjLCBfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2h5cGVyZzxfX3R5cGU+KF9fYSwgX19iLCBfX2MsIF9feCk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBsYWd1ZXJyZWYodW5zaWduZWQgaW50IF9fbiwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19sYWd1ZXJyZTxmbG9hdD4oX19uLCBfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGxhZ3VlcnJlbCh1bnNpZ25lZCBpbnQgX19uLCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2xhZ3VlcnJlPGxvbmcgZG91YmxlPihfX24sIF9feCk7IH0KKworICAvLy8gIDUuMi4xLjE4ICBMYWd1ZXJyZSBwb2x5bm9taWFscy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBsYWd1ZXJyZSh1bnNpZ25lZCBpbnQgX19uLCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19sYWd1ZXJyZTxfX3R5cGU+KF9fbiwgX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGxlZ2VuZHJlZih1bnNpZ25lZCBpbnQgX19uLCBmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3BvbHlfbGVnZW5kcmVfcDxmbG9hdD4oX19uLCBfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGxlZ2VuZHJlbCh1bnNpZ25lZCBpbnQgX19uLCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3BvbHlfbGVnZW5kcmVfcDxsb25nIGRvdWJsZT4oX19uLCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4xOSAgTGVnZW5kcmUgcG9seW5vbWlhbHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgbGVnZW5kcmUodW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fcG9seV9sZWdlbmRyZV9wPF9fdHlwZT4oX19uLCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgcmllbWFubl96ZXRhZihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3JpZW1hbm5femV0YTxmbG9hdD4oX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICByaWVtYW5uX3pldGFsKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fcmllbWFubl96ZXRhPGxvbmcgZG91YmxlPihfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4yMCAgUmllbWFubiB6ZXRhIGZ1bmN0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIHJpZW1hbm5femV0YShfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19yaWVtYW5uX3pldGE8X190eXBlPihfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgc3BoX2Jlc3NlbGYodW5zaWduZWQgaW50IF9fbiwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19zcGhfYmVzc2VsPGZsb2F0PihfX24sIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgc3BoX2Jlc3NlbGwodW5zaWduZWQgaW50IF9fbiwgbG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19zcGhfYmVzc2VsPGxvbmcgZG91YmxlPihfX24sIF9feCk7IH0KKworICAvLy8gIDUuMi4xLjIxICBTcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBzcGhfYmVzc2VsKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX3NwaF9iZXNzZWw8X190eXBlPihfX24sIF9feCk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBzcGhfbGVnZW5kcmVmKHVuc2lnbmVkIGludCBfX2wsIHVuc2lnbmVkIGludCBfX20sIGZsb2F0IF9fdGhldGEpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3NwaF9sZWdlbmRyZTxmbG9hdD4oX19sLCBfX20sIF9fdGhldGEpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHNwaF9sZWdlbmRyZWwodW5zaWduZWQgaW50IF9fbCwgdW5zaWduZWQgaW50IF9fbSwgbG9uZyBkb3VibGUgX190aGV0YSkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fc3BoX2xlZ2VuZHJlPGxvbmcgZG91YmxlPihfX2wsIF9fbSwgX190aGV0YSk7IH0KKworICAvLy8gIDUuMi4xLjIyICBTcGhlcmljYWwgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgc3BoX2xlZ2VuZHJlKHVuc2lnbmVkIGludCBfX2wsIHVuc2lnbmVkIGludCBfX20sIF9UcCBfX3RoZXRhKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19zcGhfbGVnZW5kcmU8X190eXBlPihfX2wsIF9fbSwgX190aGV0YSk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBzcGhfbmV1bWFubmYodW5zaWduZWQgaW50IF9fbiwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19zcGhfbmV1bWFubjxmbG9hdD4oX19uLCBfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHNwaF9uZXVtYW5ubCh1bnNpZ25lZCBpbnQgX19uLCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3NwaF9uZXVtYW5uPGxvbmcgZG91YmxlPihfX24sIF9feCk7IH0KKworICAvLy8gIDUuMi4xLjIzICBTcGhlcmljYWwgTmV1bWFubiBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgc3BoX25ldW1hbm4odW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fc3BoX25ldW1hbm48X190eXBlPihfX24sIF9feCk7CisgICAgfQorCisgIC8qIEB9ICovIC8vIHRyMV9tYXRoX3NwZWNfZnVuYworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ01BVEgKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NvbXBsZXggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jb21wbGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ODc4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jb21wbGV4CkBAIC0wLDAgKzEsNDE4IEBACisvLyBUUjEgY29tcGxleCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NvbXBsZXgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ09NUExFWAorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ09NUExFWCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGNvbXBsZXg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgY29tcGxleF9udW1iZXJzCisgICAqIEB7CisgICAqLworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB1c2luZyBzdGQ6OmFjb3M7CisgIHVzaW5nIHN0ZDo6YXNpbjsKKyAgdXNpbmcgc3RkOjphdGFuOworI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBhY29zKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gc3RkOjpjb21wbGV4PF9UcD4gYXNpbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGF0YW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gc3RkOjpjb21wbGV4PF9UcD4gYWNvc2goY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBhc2luaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGF0YW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisKKyAgLy8gVGhlIHN0ZDo6ZmFicyByZXR1cm4gdHlwZSBpbiBDKysweCBtb2RlIGlzIGRpZmZlcmVudCAoanVzdCBfVHApLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGZhYnMoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2Fjb3MoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiBfX3QgPSBzdGQ6OnRyMTo6YXNpbihfX3opOworICAgICAgY29uc3QgX1RwIF9fcGlfMiA9IDEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMxMzIxNjkxNjM5NzUxNEw7CisgICAgICByZXR1cm4gc3RkOjpjb21wbGV4PF9UcD4oX19waV8yIC0gX190LnJlYWwoKSwgLV9fdC5pbWFnKCkpOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWF9UUjEKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9hY29zKF9fY29tcGxleF9fIGZsb2F0IF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhY29zZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfYWNvcyhfX2NvbXBsZXhfXyBkb3VibGUgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3MoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfYWNvcyhjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3NsKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYWNvcyhjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hY29zKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgLy8vIGFjb3MoX196KSBbOC4xLjJdLgorICAvLyAgRWZmZWN0czogIEJlaGF2ZXMgdGhlIHNhbWUgYXMgQzk5IGZ1bmN0aW9uIGNhY29zLCBkZWZpbmVkCisgIC8vICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDcuMy41LjEuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhY29zKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2Fjb3MoX196KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hc2luKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgc3RkOjpjb21wbGV4PF9UcD4gX190KC1fX3ouaW1hZygpLCBfX3oucmVhbCgpKTsKKyAgICAgIF9fdCA9IHN0ZDo6dHIxOjphc2luaChfX3QpOworICAgICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxfVHA+KF9fdC5pbWFnKCksIC1fX3QucmVhbCgpKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYXNpbihfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXNpbmYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2FzaW4oX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2luKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2FzaW4oY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2lubChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFzaW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXNpbihfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhc2luKF9feikgWzguMS4zXS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYXNpbiwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNS4yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXNpbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hc2luKF9feik7IH0KKyNlbmRpZgorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2F0YW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19yMiA9IF9fei5yZWFsKCkgKiBfX3oucmVhbCgpOworICAgICAgY29uc3QgX1RwIF9feCA9IF9UcCgxLjApIC0gX19yMiAtIF9fei5pbWFnKCkgKiBfX3ouaW1hZygpOworCisgICAgICBfVHAgX19udW0gPSBfX3ouaW1hZygpICsgX1RwKDEuMCk7CisgICAgICBfVHAgX19kZW4gPSBfX3ouaW1hZygpIC0gX1RwKDEuMCk7CisKKyAgICAgIF9fbnVtID0gX19yMiArIF9fbnVtICogX19udW07CisgICAgICBfX2RlbiA9IF9fcjIgKyBfX2RlbiAqIF9fZGVuOworCisgICAgICByZXR1cm4gc3RkOjpjb21wbGV4PF9UcD4oX1RwKDAuNSkgKiBhdGFuMihfVHAoMi4wKSAqIF9fei5yZWFsKCksIF9feCksCisJCQkgICAgICAgX1RwKDAuMjUpICogbG9nKF9fbnVtIC8gX19kZW4pKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYXRhbihfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXRhbmYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2F0YW4oX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhdGFuKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2F0YW4oY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhdGFubChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGF0YW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXRhbihfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhdGFuKF9feikgWzguMS40XS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYXRhbiwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNS4zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXRhbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hdGFuKF9feik7IH0KKyNlbmRpZgorCisjZW5kaWYgLy8gQysrMTEKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfYWNvc2goY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICAvLyBLYWhhbidzIGZvcm11bGEuCisgICAgICByZXR1cm4gX1RwKDIuMCkgKiBzdGQ6OmxvZyhzdGQ6OnNxcnQoX1RwKDAuNSkgKiAoX196ICsgX1RwKDEuMCkpKQorCQkJCSArIHN0ZDo6c3FydChfVHAoMC41KSAqIChfX3ogLSBfVHAoMS4wKSkpKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYWNvc2goX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3NoZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfYWNvc2goX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhY29zaChfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hY29zaChjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3NobChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFjb3NoKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2Fjb3NoKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgLy8vIGFjb3NoKF9feikgWzguMS41XS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYWNvc2gsIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjYuMS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFjb3NoKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2Fjb3NoKF9feik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hc2luaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIHN0ZDo6Y29tcGxleDxfVHA+IF9fdCgoX196LnJlYWwoKSAtIF9fei5pbWFnKCkpCisJCQkgICAgKiAoX196LnJlYWwoKSArIF9fei5pbWFnKCkpICsgX1RwKDEuMCksCisJCQkgICAgX1RwKDIuMCkgKiBfX3oucmVhbCgpICogX196LmltYWcoKSk7CisgICAgICBfX3QgPSBzdGQ6OnNxcnQoX190KTsKKworICAgICAgcmV0dXJuIHN0ZDo6bG9nKF9fdCArIF9feik7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMQorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2FzaW5oKF9fY29tcGxleF9fIGZsb2F0IF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2luaGYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2FzaW5oKF9fY29tcGxleF9fIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXNpbmgoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfYXNpbmgoY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2luaGwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhc2luaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hc2luaChfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhc2luaChfX3opIFs4LjEuNl0uCisgIC8vICBFZmZlY3RzOiAgQmVoYXZlcyB0aGUgc2FtZSBhcyBDOTkgZnVuY3Rpb24gY2FzaW4sIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjYuMi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFzaW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2FzaW5oKF9feik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hdGFuaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2kyID0gX196LmltYWcoKSAqIF9fei5pbWFnKCk7CisgICAgICBjb25zdCBfVHAgX194ID0gX1RwKDEuMCkgLSBfX2kyIC0gX196LnJlYWwoKSAqIF9fei5yZWFsKCk7CisKKyAgICAgIF9UcCBfX251bSA9IF9UcCgxLjApICsgX196LnJlYWwoKTsKKyAgICAgIF9UcCBfX2RlbiA9IF9UcCgxLjApIC0gX196LnJlYWwoKTsKKworICAgICAgX19udW0gPSBfX2kyICsgX19udW0gKiBfX251bTsKKyAgICAgIF9fZGVuID0gX19pMiArIF9fZGVuICogX19kZW47CisKKyAgICAgIHJldHVybiBzdGQ6OmNvbXBsZXg8X1RwPihfVHAoMC4yNSkgKiAobG9nKF9fbnVtKSAtIGxvZyhfX2RlbikpLAorCQkJICAgICAgIF9UcCgwLjUpICogYXRhbjIoX1RwKDIuMCkgKiBfX3ouaW1hZygpLCBfX3gpKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYXRhbmgoX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2F0YW5oZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfYXRhbmgoX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhdGFuaChfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hdGFuaChjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2F0YW5obChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGF0YW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2F0YW5oKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgLy8vIGF0YW5oKF9feikgWzguMS43XS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYXRhbmgsIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjYuMy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGF0YW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2F0YW5oKF9feik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICAvLy8gZmFicyhfX3opIFs4LjEuOF0uCisgICAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYWJzLCBkZWZpbmVkCisgICAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjguMS4KKyAgICBmYWJzKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gc3RkOjphYnMoX196KTsgfQorCisgIC8vLyBBZGRpdGlvbmFsIG92ZXJsb2FkcyBbOC4xLjldLgorI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgYXJnKF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworI2lmIChfR0xJQkNYWF9VU0VfQzk5X01BVEggJiYgIV9HTElCQ1hYX1VTRV9DOTlfRlBfTUFDUk9TX0RZTkFNSUMpCisgICAgICByZXR1cm4gc3RkOjpzaWduYml0KF9feCkgPyBfX3R5cGUoMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI5TCkKKwkgICAgICAgICAgICAgICAgICAgICAgIDogX190eXBlKCk7CisjZWxzZQorICAgICAgcmV0dXJuIHN0ZDo6YXJnKHN0ZDo6Y29tcGxleDxfX3R5cGU+KF9feCkpOworI2VuZGlmCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgaW1hZyhfVHApCisgICAgeyByZXR1cm4gX1RwKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIG5vcm0oX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX190eXBlKF9feCkgKiBfX3R5cGUoX194KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICByZWFsKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX194OyB9CisKKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb3coY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1VwJiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvdyhzdGQ6OmNvbXBsZXg8X190eXBlPihfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb3coY29uc3QgX1RwJiBfX3gsIGNvbnN0IHN0ZDo6Y29tcGxleDxfVXA+JiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvdyhfX3R5cGUoX194KSwgc3RkOjpjb21wbGV4PF9fdHlwZT4oX195KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb3coY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feCwgY29uc3Qgc3RkOjpjb21wbGV4PF9VcD4mIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIHN0ZDo6cG93KHN0ZDo6Y29tcGxleDxfX3R5cGU+KF9feCksCisJCSAgICAgIHN0ZDo6Y29tcGxleDxfX3R5cGU+KF9feSkpOworICAgIH0KKworICB1c2luZyBzdGQ6OmFyZzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgY29uaihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIHN0ZDo6Y29uaihfX3opOyB9ICAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDx0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGU+CisgICAgY29uaihfVHAgX194KQorICAgIHsgcmV0dXJuIF9feDsgfQorCisgIHVzaW5nIHN0ZDo6aW1hZzsKKyAgdXNpbmcgc3RkOjpub3JtOworICB1c2luZyBzdGQ6OnBvbGFyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb2xhcihjb25zdCBfVHAmIF9fcmhvLCBjb25zdCBfVXAmIF9fdGhldGEpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvbGFyKF9fdHlwZShfX3JobyksIF9fdHlwZShfX3RoZXRhKSk7CisgICAgfQorCisgIHVzaW5nIHN0ZDo6cmVhbDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgcG93KGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX195KQorICAgIHsgcmV0dXJuIHN0ZDo6cG93KF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBwb3coY29uc3QgX1RwJiBfX3gsIGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3kpCisgICAgeyByZXR1cm4gc3RkOjpwb3coX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIHBvdyhjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX195KQorICAgIHsgcmV0dXJuIHN0ZDo6cG93KF9feCwgX195KTsgfQorCisvLyBAfSBncm91cCBjb21wbGV4X251bWJlcnMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ09NUExFWApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY29tcGxleC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY29tcGxleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Yjc4OWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jb21wbGV4LmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIGNvbXBsZXguaCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NvbXBsZXguaAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DT01QTEVYX0gKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NPTVBMRVhfSCAxCisKKyNpbmNsdWRlIDx0cjEvY2NvbXBsZXg+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ09NUExFWF9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jc3RkYXJnIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3N0ZGFyZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzU3NzcyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3N0ZGFyZwpAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgY3N0ZGFyZyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NzdGRhcmcKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ1NUREFSRworI2RlZmluZSBfR0xJQkNYWF9UUjFfQ1NUREFSRyAxCisKKyNpbmNsdWRlIDxjc3RkYXJnPgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NTVERBUkcKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NzdGRib29sIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3N0ZGJvb2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmOWVlMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NzdGRib29sCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFRSMSBjc3RkYm9vbCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NzdGRib29sCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NTVERCT09MCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DU1REQk9PTCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKyNpZiBfR0xJQkNYWF9IQVZFX1NUREJPT0xfSAorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbmRpZgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NTVERCT09MCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jc3RkaW50IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3N0ZGludApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODNhNzA4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3N0ZGludApAQCAtMCwwICsxLDEwNCBAQAorLy8gVFIxIGNzdGRpbnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jc3RkaW50CisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NTVERJTlQKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NTVERJTlQgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisvLyBGb3IgOC4yMi4xLzEgKHNlZSBDOTksIE5vdGVzIDIxOSwgMjIwLCAyMjIpCisjIGlmIF9HTElCQ1hYX0hBVkVfU1RESU5UX0gKKyMgIGlmbmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjICAgZGVmaW5lIF9VTkRFRl9fU1REQ19MSU1JVF9NQUNST1MKKyMgICBkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworIyAgZW5kaWYKKyMgIGlmbmRlZiBfX1NURENfQ09OU1RBTlRfTUFDUk9TCisjICAgZGVmaW5lIF9VTkRFRl9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgICBkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyAgZW5kaWYKKyMgIGluY2x1ZGUgPHN0ZGludC5oPgorIyAgaWZkZWYgX1VOREVGX19TVERDX0xJTUlUX01BQ1JPUworIyAgIHVuZGVmIF9fU1REQ19MSU1JVF9NQUNST1MKKyMgICB1bmRlZiBfVU5ERUZfX1NURENfTElNSVRfTUFDUk9TCisjICBlbmRpZgorIyAgaWZkZWYgX1VOREVGX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyAgIHVuZGVmIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgICB1bmRlZiBfVU5ERUZfX1NURENfQ09OU1RBTlRfTUFDUk9TCisjICBlbmRpZgorIyBlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICB1c2luZyA6OmludDhfdDsKKyAgdXNpbmcgOjppbnQxNl90OworICB1c2luZyA6OmludDMyX3Q7CisgIHVzaW5nIDo6aW50NjRfdDsKKworICB1c2luZyA6OmludF9mYXN0OF90OworICB1c2luZyA6OmludF9mYXN0MTZfdDsKKyAgdXNpbmcgOjppbnRfZmFzdDMyX3Q7CisgIHVzaW5nIDo6aW50X2Zhc3Q2NF90OworCisgIHVzaW5nIDo6aW50X2xlYXN0OF90OworICB1c2luZyA6OmludF9sZWFzdDE2X3Q7CisgIHVzaW5nIDo6aW50X2xlYXN0MzJfdDsKKyAgdXNpbmcgOjppbnRfbGVhc3Q2NF90OworCisgIHVzaW5nIDo6aW50bWF4X3Q7CisgIHVzaW5nIDo6aW50cHRyX3Q7CisgIAorICB1c2luZyA6OnVpbnQ4X3Q7CisgIHVzaW5nIDo6dWludDE2X3Q7CisgIHVzaW5nIDo6dWludDMyX3Q7CisgIHVzaW5nIDo6dWludDY0X3Q7CisKKyAgdXNpbmcgOjp1aW50X2Zhc3Q4X3Q7CisgIHVzaW5nIDo6dWludF9mYXN0MTZfdDsKKyAgdXNpbmcgOjp1aW50X2Zhc3QzMl90OworICB1c2luZyA6OnVpbnRfZmFzdDY0X3Q7CisKKyAgdXNpbmcgOjp1aW50X2xlYXN0OF90OworICB1c2luZyA6OnVpbnRfbGVhc3QxNl90OworICB1c2luZyA6OnVpbnRfbGVhc3QzMl90OworICB1c2luZyA6OnVpbnRfbGVhc3Q2NF90OworCisgIHVzaW5nIDo6dWludG1heF90OworICB1c2luZyA6OnVpbnRwdHJfdDsKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NTVERJTlQKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3N0ZGlvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3N0ZGlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YmE1YzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jc3RkaW8KQEAgLTAsMCArMSw1MyBAQAorLy8gVFIxIGNzdGRpbyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NzdGRpbworICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DU1RESU8KKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NTVERJTyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGNzdGRpbz4KKworI2lmIF9HTElCQ1hYX1VTRV9DOTkKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIHVzaW5nIHN0ZDo6c25wcmludGY7CisgIHVzaW5nIHN0ZDo6dnNucHJpbnRmOworCisgIHVzaW5nIHN0ZDo6dmZzY2FuZjsKKyAgdXNpbmcgc3RkOjp2c2NhbmY7CisgIHVzaW5nIHN0ZDo6dnNzY2FuZjsKK30KK30KKworI2VuZGlmCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ1NURElPCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jc3RkbGliIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3N0ZGxpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzVlN2IwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3N0ZGxpYgpAQCAtMCwwICsxLDcyIEBACisvLyBUUjEgY3N0ZGxpYiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NzdGRsaWIKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ1NURExJQgorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ1NURExJQiAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGNzdGRsaWI+CisKKyNpZiBfR0xJQkNYWF9IT1NURUQKKworI2lmIF9HTElCQ1hYX1VTRV9DOTkKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfTE9OR19MT05HX0RZTkFNSUMKKyAgLy8gdHlwZXMKKyAgdXNpbmcgc3RkOjpsbGRpdl90OworCisgIC8vIGZ1bmN0aW9ucworICB1c2luZyBzdGQ6OmxsYWJzOworICB1c2luZyBzdGQ6OmxsZGl2OworI2VuZGlmCisKKyAgdXNpbmcgc3RkOjphdG9sbDsKKyAgdXNpbmcgc3RkOjpzdHJ0b2xsOworICB1c2luZyBzdGQ6OnN0cnRvdWxsOworCisgIHVzaW5nIHN0ZDo6c3RydG9mOworICB1c2luZyBzdGQ6OnN0cnRvbGQ7CisKKyAgLy8gb3ZlcmxvYWRzCisgIHVzaW5nIHN0ZDo6YWJzOworI2lmICFfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19EWU5BTUlDCisgIHVzaW5nIHN0ZDo6ZGl2OworI2VuZGlmCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5IAorCisjZW5kaWYgLy8gX0dMSUJDWFhfSE9TVEVECisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ1NURExJQgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3RnbWF0aCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N0Z21hdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiOTZiYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N0Z21hdGgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIGN0Z21hdGggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jdGdtYXRoCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NUR01BVEgKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NUR01BVEggMQorCisjaW5jbHVkZSA8dHIxL2NtYXRoPgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NUR01BVEgKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N0aW1lIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3RpbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3ZDRlNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N0aW1lCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRSMSBjdGltZSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2N0aW1lCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NUSU1FCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DVElNRSAxCisKKyNpbmNsdWRlIDxjdGltZT4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9DVElNRQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3R5cGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI3NTgwYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N0eXBlLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIGN0eXBlLmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jdHlwZS5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX1RSMV9DVFlQRV9ICisjZGVmaW5lIF9UUjFfQ1RZUEVfSCAxCisKKyNpbmNsdWRlIDx0cjEvY2N0eXBlPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N3Y2hhciBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N3Y2hhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWIxZjhhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3djaGFyCkBAIC0wLDAgKzEsNjUgQEAKKy8vIFRSMSBjd2NoYXIgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jd2NoYXIKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ1dDSEFSCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DV0NIQVIgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxjd2NoYXI+CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyNpZiBfR0xJQkNYWF9IQVZFX1dDU1RPRgorICB1c2luZyBzdGQ6Ondjc3RvZjsKKyNlbmRpZgorI2lmIF9HTElCQ1hYX0hBVkVfVkZXU0NBTkYKKyAgdXNpbmcgc3RkOjp2ZndzY2FuZjsKKyNlbmRpZgorI2lmIF9HTElCQ1hYX0hBVkVfVlNXU0NBTkYKKyAgdXNpbmcgc3RkOjp2c3dzY2FuZjsKKyNlbmRpZgorI2lmIF9HTElCQ1hYX0hBVkVfVldTQ0FORgorICB1c2luZyBzdGQ6OnZ3c2NhbmY7CisjZW5kaWYKKworI2lmIF9HTElCQ1hYX1VTRV9DOTkKKyAgdXNpbmcgc3RkOjp3Y3N0b2xkOworICB1c2luZyBzdGQ6Ondjc3RvbGw7CisgIHVzaW5nIHN0ZDo6d2NzdG91bGw7CisjZW5kaWYKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ1dDSEFSCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jd2N0eXBlIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3djdHlwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTY2YmIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3djdHlwZQpAQCAtMCwwICsxLDUwIEBACisvLyBUUjEgY3djdHlwZSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2N3Y3R5cGUKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ1dDVFlQRQorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ1dDVFlQRSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGN3Y3R5cGU+CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyNpZiBfR0xJQkNYWF9IQVZFX0lTV0JMQU5LCisgIHVzaW5nIHN0ZDo6aXN3Ymxhbms7CisjZW5kaWYgIAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX1dDSEFSX1QKKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9DV0NUWVBFCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9lbGxfaW50ZWdyYWwudGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZWxsX2ludGVncmFsLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTMwNzZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZWxsX2ludGVncmFsLnRjYwpAQCAtMCwwICsxLDc1MCBAQAorLy8gU3BlY2lhbCBmdW5jdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvZWxsX2ludGVncmFsLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9jbWF0aH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MiBUUjE6IDUuMiAgU3BlY2lhbCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQgYmFzZWQgb246CisvLyAgICgxKSAgQi4gQy4gQ2FybHNvbiBOdW1lci4gTWF0aC4gMzMsIDEgKDE5NzkpCisvLyAgICgyKSAgQi4gQy4gQ2FybHNvbiwgU3BlY2lhbCBGdW5jdGlvbnMgb2YgQXBwbGllZCBNYXRoZW1hdGljcyAoMTk3NykKKy8vICAgKDMpICBUaGUgR251IFNjaWVudGlmaWMgTGlicmFyeSwgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dzbAorLy8gICAoNCkgIE51bWVyaWNhbCBSZWNpcGVzIGluIEMsIDJuZCBlZCwgYnkgVy4gSC4gUHJlc3MsIFMuIEEuIFRldWtvbHNreSwKKy8vICAgICAgICBXLiBULiBWZXR0ZXJsaW5nLCBCLiBQLiBGbGFubmVyeSwgQ2FtYnJpZGdlIFVuaXZlcnNpdHkgUHJlc3MKKy8vICAgICAgICAoMTk5MiksIHBwLiAyNjEtMjY5CisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0VMTF9JTlRFR1JBTF9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0VMTF9JTlRFR1JBTF9UQ0MgMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgLy8gWzUuMl0gU3BlY2lhbCBmdW5jdGlvbnMKKworICAvLyBJbXBsZW1lbnRhdGlvbi1zcGFjZSBkZXRhaWxzLgorICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uIEBmJCBSX0YoeCx5LHopIEBmJAorICAgICAqICAgICAgICAgIG9mIHRoZSBmaXJzdCBraW5kLgorICAgICAqIAorICAgICAqICAgVGhlIENhcmxzb24gZWxsaXB0aWMgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIFJfRih4LHkseikgPSBcZnJhY3sxfXsyfSBcaW50XzBeXGluZnR5CisgICAgICogICAgICAgICAgICAgICAgIFxmcmFje2R0fXsodCArIHgpXnsxLzJ9KHQgKyB5KV57MS8yfSh0ICsgeileezEvMn19CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBmaXJzdCBvZiB0aHJlZSBzeW1tZXRyaWMgYXJndW1lbnRzLgorICAgICAqICAgQHBhcmFtICBfX3kgIFRoZSBzZWNvbmQgb2YgdGhyZWUgc3ltbWV0cmljIGFyZ3VtZW50cy4KKyAgICAgKiAgIEBwYXJhbSAgX196ICBUaGUgdGhpcmQgb2YgdGhyZWUgc3ltbWV0cmljIGFyZ3VtZW50cy4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2VsbGludF9yZihfVHAgX194LCBfVHAgX195LCBfVHAgX196KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX21pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWluKCk7CisgICAgICBjb25zdCBfVHAgX19tYXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1heCgpOworICAgICAgY29uc3QgX1RwIF9fbG9saW0gPSBfVHAoNSkgKiBfX21pbjsKKyAgICAgIGNvbnN0IF9UcCBfX3VwbGltID0gX19tYXggLyBfVHAoNSk7CisKKyAgICAgIGlmIChfX3ggPCBfVHAoMCkgfHwgX195IDwgX1RwKDApIHx8IF9feiA8IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkFyZ3VtZW50IGxlc3MgdGhhbiB6ZXJvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fZWxsaW50X3JmLiIpKTsKKyAgICAgIGVsc2UgaWYgKF9feCArIF9feSA8IF9fbG9saW0gfHwgX194ICsgX196IDwgX19sb2xpbQorICAgICAgICAgICAgfHwgX195ICsgX196IDwgX19sb2xpbSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkFyZ3VtZW50IHRvbyBzbWFsbCBpbiBfX2VsbGludF9yZiIpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX2MwID0gX1RwKDEpIC8gX1RwKDQpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MxID0gX1RwKDEpIC8gX1RwKDI0KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMiA9IF9UcCgxKSAvIF9UcCgxMCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzMgPSBfVHAoMykgLyBfVHAoNDQpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2M0ID0gX1RwKDEpIC8gX1RwKDE0KTsKKworICAgICAgICAgIF9UcCBfX3huID0gX194OworICAgICAgICAgIF9UcCBfX3luID0gX195OworICAgICAgICAgIF9UcCBfX3puID0gX196OworCisgICAgICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fZXJydG9sID0gc3RkOjpwb3coX19lcHMsIF9UcCgxKSAvIF9UcCg2KSk7CisgICAgICAgICAgX1RwIF9fbXU7CisgICAgICAgICAgX1RwIF9feG5kZXYsIF9feW5kZXYsIF9fem5kZXY7CisKKyAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2l0ZXIgPSAwOyBfX2l0ZXIgPCBfX21heF9pdGVyOyArK19faXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19tdSA9IChfX3huICsgX195biArIF9fem4pIC8gX1RwKDMpOworICAgICAgICAgICAgICBfX3huZGV2ID0gMiAtIChfX211ICsgX194bikgLyBfX211OworICAgICAgICAgICAgICBfX3luZGV2ID0gMiAtIChfX211ICsgX195bikgLyBfX211OworICAgICAgICAgICAgICBfX3puZGV2ID0gMiAtIChfX211ICsgX196bikgLyBfX211OworICAgICAgICAgICAgICBfVHAgX19lcHNpbG9uID0gc3RkOjptYXgoc3RkOjphYnMoX194bmRldiksIHN0ZDo6YWJzKF9feW5kZXYpKTsKKyAgICAgICAgICAgICAgX19lcHNpbG9uID0gc3RkOjptYXgoX19lcHNpbG9uLCBzdGQ6OmFicyhfX3puZGV2KSk7CisgICAgICAgICAgICAgIGlmIChfX2Vwc2lsb24gPCBfX2VycnRvbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9feG5yb290ID0gc3RkOjpzcXJ0KF9feG4pOworICAgICAgICAgICAgICBjb25zdCBfVHAgX195bnJvb3QgPSBzdGQ6OnNxcnQoX195bik7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3pucm9vdCA9IHN0ZDo6c3FydChfX3puKTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fbGFtYmRhID0gX194bnJvb3QgKiAoX195bnJvb3QgKyBfX3pucm9vdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX195bnJvb3QgKiBfX3pucm9vdDsKKyAgICAgICAgICAgICAgX194biA9IF9fYzAgKiAoX194biArIF9fbGFtYmRhKTsKKyAgICAgICAgICAgICAgX195biA9IF9fYzAgKiAoX195biArIF9fbGFtYmRhKTsKKyAgICAgICAgICAgICAgX196biA9IF9fYzAgKiAoX196biArIF9fbGFtYmRhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnN0IF9UcCBfX2UyID0gX194bmRldiAqIF9feW5kZXYgLSBfX3puZGV2ICogX196bmRldjsKKyAgICAgICAgICBjb25zdCBfVHAgX19lMyA9IF9feG5kZXYgKiBfX3luZGV2ICogX196bmRldjsKKyAgICAgICAgICBjb25zdCBfVHAgX19zICA9IF9UcCgxKSArIChfX2MxICogX19lMiAtIF9fYzIgLSBfX2MzICogX19lMykgKiBfX2UyCisgICAgICAgICAgICAgICAgICAgKyBfX2M0ICogX19lMzsKKworICAgICAgICAgIHJldHVybiBfX3MgLyBzdGQ6OnNxcnQoX19tdSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIGZpcnN0IGtpbmQKKyAgICAgKiAgICAgICAgICBAZiQgSyhrKSBAZiQgYnkgc2VyaWVzIGV4cGFuc2lvbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgZmlyc3Qga2luZCBpcyBkZWZpbmVkIGFzCisgICAgICogICBAZlsKKyAgICAgKiAgICAgSyhrKSA9IEYoayxccGkvMikgPSBcaW50XzBee1xwaS8yfVxmcmFje2RcdGhldGF9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHNxcnR7MSAtIGteMnNpbl4yXHRoZXRhfX0KKyAgICAgKiAgIEBmXQorICAgICAqIAorICAgICAqICAgVGhpcyByb3V0aW5lIGlzIG5vdCBiYWQgYXMgbG9uZyBhcyB8a3wgaXMgc29tZXdoYXQgc21hbGxlciB0aGFuIDEKKyAgICAgKiAgIGJ1dCBpcyBub3QgaXMgZ29vZCBhcyB0aGUgQ2FybHNvbiBlbGxpcHRpYyBpbnRlZ3JhbCBmb3JtdWxhdGlvbi4KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19rICBUaGUgYXJndW1lbnQgb2YgdGhlIGNvbXBsZXRlIGVsbGlwdGljIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGNvbXBsZXRlIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2NvbXBfZWxsaW50XzFfc2VyaWVzKF9UcCBfX2spCisgICAgeworCisgICAgICBjb25zdCBfVHAgX19rayA9IF9fayAqIF9fazsKKworICAgICAgX1RwIF9fdGVybSA9IF9fa2sgLyBfVHAoNCk7CisgICAgICBfVHAgX19zdW0gPSBfVHAoMSkgKyBfX3Rlcm07CisKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwMDsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDI7IF9faSA8IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX190ZXJtICo9ICgyICogX19pIC0gMSkgKiBfX2trIC8gKDIgKiBfX2kpOworICAgICAgICAgIGlmIChfX3Rlcm0gPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIF9fc3VtICs9IF9fdGVybTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpXzIoKSAqIF9fc3VtOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIGZpcnN0IGtpbmQKKyAgICAgKiAgICAgICAgICAgQGYkIEsoaykgQGYkIHVzaW5nIHRoZSBDYXJsc29uIGZvcm11bGF0aW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSBmaXJzdCBraW5kIGlzIGRlZmluZWQgYXMKKyAgICAgKiAgIEBmWworICAgICAqICAgICBLKGspID0gRihrLFxwaS8yKSA9IFxpbnRfMF57XHBpLzJ9XGZyYWN7ZFx0aGV0YX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHNxcnR7MSAtIGteMiBzaW5eMlx0aGV0YX19CisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIEBmJCBGKGssXHBoaSkgQGYkIGlzIHRoZSBpbmNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZQorICAgICAqICAgZmlyc3Qga2luZC4KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19rICBUaGUgYXJndW1lbnQgb2YgdGhlIGNvbXBsZXRlIGVsbGlwdGljIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGNvbXBsZXRlIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2NvbXBfZWxsaW50XzEoX1RwIF9faykKKyAgICB7CisKKyAgICAgIGlmIChfX2lzbmFuKF9faykpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoc3RkOjphYnMoX19rKSA+PSBfVHAoMSkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX19lbGxpbnRfcmYoX1RwKDApLCBfVHAoMSkgLSBfX2sgKiBfX2ssIF9UcCgxKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBpbmNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSBmaXJzdCBraW5kCisgICAgICogICAgICAgICAgIEBmJCBGKGssXHBoaSkgQGYkIHVzaW5nIHRoZSBDYXJsc29uIGZvcm11bGF0aW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGluY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIGZpcnN0IGtpbmQgaXMgZGVmaW5lZCBhcworICAgICAqICAgQGZbCisgICAgICogICAgIEYoayxccGhpKSA9IFxpbnRfMF57XHBoaX1cZnJhY3tkXHRoZXRhfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHNxcnR7MSAtIGteMiBzaW5eMlx0aGV0YX19CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19rICBUaGUgYXJndW1lbnQgb2YgdGhlIGVsbGlwdGljIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3BoaSAgVGhlIGludGVncmFsIGxpbWl0IGFyZ3VtZW50IG9mIHRoZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19lbGxpbnRfMShfVHAgX19rLCBfVHAgX19waGkpCisgICAgeworCisgICAgICBpZiAoX19pc25hbihfX2spIHx8IF9faXNuYW4oX19waGkpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKHN0ZDo6YWJzKF9faykgPiBfVHAoMSkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJCYWQgYXJndW1lbnQgaW4gX19lbGxpbnRfMS4iKSk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyAgUmVkdWNlIHBoaSB0byAtcGkvMiA8IHBoaSA8ICtwaS8yLgorICAgICAgICAgIGNvbnN0IGludCBfX24gPSBzdGQ6OmZsb29yKF9fcGhpIC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfVHAoMC41TCkpOworICAgICAgICAgIGNvbnN0IF9UcCBfX3BoaV9yZWQgPSBfX3BoaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX24gKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKTsKKworICAgICAgICAgIGNvbnN0IF9UcCBfX3MgPSBzdGQ6OnNpbihfX3BoaV9yZWQpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MgPSBzdGQ6OmNvcyhfX3BoaV9yZWQpOworCisgICAgICAgICAgY29uc3QgX1RwIF9fRiA9IF9fcworICAgICAgICAgICAgICAgICAgICAgICAgKiBfX2VsbGludF9yZihfX2MgKiBfX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCgxKSAtIF9fayAqIF9fayAqIF9fcyAqIF9fcywgX1RwKDEpKTsKKworICAgICAgICAgIGlmIChfX24gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBfX0Y7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIF9fRiArIF9UcCgyKSAqIF9fbiAqIF9fY29tcF9lbGxpbnRfMShfX2spOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSBzZWNvbmQga2luZAorICAgICAqICAgICAgICAgIEBmJCBFKGspIEBmJCBieSBzZXJpZXMgZXhwYW5zaW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSBzZWNvbmQga2luZCBpcyBkZWZpbmVkIGFzCisgICAgICogICBAZlsKKyAgICAgKiAgICAgRShrLFxwaS8yKSA9IFxpbnRfMF57XHBpLzJ9XHNxcnR7MSAtIGteMiBzaW5eMlx0aGV0YX0KKyAgICAgKiAgIEBmXQorICAgICAqIAorICAgICAqICAgVGhpcyByb3V0aW5lIGlzIG5vdCBiYWQgYXMgbG9uZyBhcyB8a3wgaXMgc29tZXdoYXQgc21hbGxlciB0aGFuIDEKKyAgICAgKiAgIGJ1dCBpcyBub3QgaXMgZ29vZCBhcyB0aGUgQ2FybHNvbiBlbGxpcHRpYyBpbnRlZ3JhbCBmb3JtdWxhdGlvbi4KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19rICBUaGUgYXJndW1lbnQgb2YgdGhlIGNvbXBsZXRlIGVsbGlwdGljIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGNvbXBsZXRlIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBzZWNvbmQga2luZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jb21wX2VsbGludF8yX3NlcmllcyhfVHAgX19rKQorICAgIHsKKworICAgICAgY29uc3QgX1RwIF9fa2sgPSBfX2sgKiBfX2s7CisKKyAgICAgIF9UcCBfX3Rlcm0gPSBfX2trOworICAgICAgX1RwIF9fc3VtID0gX190ZXJtOworCisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAyOyBfX2kgPCBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX2kybSA9IDIgKiBfX2kgLSAxOworICAgICAgICAgIGNvbnN0IF9UcCBfX2kyID0gMiAqIF9faTsKKyAgICAgICAgICBfX3Rlcm0gKj0gX19pMm0gKiBfX2kybSAqIF9fa2sgLyAoX19pMiAqIF9faTIpOworICAgICAgICAgIGlmIChfX3Rlcm0gPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIF9fc3VtICs9IF9fdGVybSAvIF9faTJtOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGlfMigpICogKF9UcCgxKSAtIF9fc3VtKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIENhcmxzb24gZWxsaXB0aWMgZnVuY3Rpb24gb2YgdGhlIHNlY29uZCBraW5kCisgICAgICogICAgICAgICAgIEBmJCBSX0QoeCx5LHopID0gUl9KKHgseSx6LHopIEBmJCB3aGVyZQorICAgICAqICAgICAgICAgICBAZiQgUl9KKHgseSx6LHApIEBmJCBpcyB0aGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbgorICAgICAqICAgICAgICAgICBvZiB0aGUgdGhpcmQga2luZC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBzZWNvbmQga2luZCBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgICAgUl9EKHgseSx6KSA9IFxmcmFjezN9ezJ9IFxpbnRfMF5caW5mdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgXGZyYWN7ZHR9eyh0ICsgeCleezEvMn0odCArIHkpXnsxLzJ9KHQgKyB6KV57My8yfX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBCYXNlZCBvbiBDYXJsc29uJ3MgYWxnb3JpdGhtczoKKyAgICAgKiAgIC0gIEIuIEMuIENhcmxzb24gTnVtZXIuIE1hdGguIDMzLCAxICgxOTc5KQorICAgICAqICAgLSAgQi4gQy4gQ2FybHNvbiwgU3BlY2lhbCBGdW5jdGlvbnMgb2YgQXBwbGllZCBNYXRoZW1hdGljcyAoMTk3NykKKyAgICAgKiAgIC0gIE51bWVyaWNhbCBSZWNpcGVzIGluIEMsIDJuZCBlZCwgcHAuIDI2MS0yNjksCisgICAgICogICAgICBieSBQcmVzcywgVGV1a29sc2t5LCBWZXR0ZXJsaW5nLCBGbGFubmVyeSAoMTk5MikKKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBmaXJzdCBvZiB0d28gc3ltbWV0cmljIGFyZ3VtZW50cy4KKyAgICAgKiAgIEBwYXJhbSAgX195ICBUaGUgc2Vjb25kIG9mIHR3byBzeW1tZXRyaWMgYXJndW1lbnRzLgorICAgICAqICAgQHBhcmFtICBfX3ogIFRoZSB0aGlyZCBhcmd1bWVudC4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBzZWNvbmQga2luZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19lbGxpbnRfcmQoX1RwIF9feCwgX1RwIF9feSwgX1RwIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgIGNvbnN0IF9UcCBfX2VycnRvbCA9IHN0ZDo6cG93KF9fZXBzIC8gX1RwKDgpLCBfVHAoMSkgLyBfVHAoNikpOworICAgICAgY29uc3QgX1RwIF9fbWluID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptaW4oKTsKKyAgICAgIGNvbnN0IF9UcCBfX21heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWF4KCk7CisgICAgICBjb25zdCBfVHAgX19sb2xpbSA9IF9UcCgyKSAvIHN0ZDo6cG93KF9fbWF4LCBfVHAoMikgLyBfVHAoMykpOworICAgICAgY29uc3QgX1RwIF9fdXBsaW0gPSBzdGQ6OnBvdyhfVHAoMC4xTCkgKiBfX2VycnRvbCAvIF9fbWluLCBfVHAoMikgLyBfVHAoMykpOworCisgICAgICBpZiAoX194IDwgX1RwKDApIHx8IF9feSA8IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkFyZ3VtZW50IGxlc3MgdGhhbiB6ZXJvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fZWxsaW50X3JkLiIpKTsKKyAgICAgIGVsc2UgaWYgKF9feCArIF9feSA8IF9fbG9saW0gfHwgX196IDwgX19sb2xpbSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkFyZ3VtZW50IHRvbyBzbWFsbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2VsbGludF9yZC4iKSk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMCA9IF9UcCgxKSAvIF9UcCg0KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMSA9IF9UcCgzKSAvIF9UcCgxNCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzIgPSBfVHAoMSkgLyBfVHAoNik7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzMgPSBfVHAoOSkgLyBfVHAoMjIpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2M0ID0gX1RwKDMpIC8gX1RwKDI2KTsKKworICAgICAgICAgIF9UcCBfX3huID0gX194OworICAgICAgICAgIF9UcCBfX3luID0gX195OworICAgICAgICAgIF9UcCBfX3puID0gX196OworICAgICAgICAgIF9UcCBfX3NpZ21hID0gX1RwKDApOworICAgICAgICAgIF9UcCBfX3Bvd2VyNCA9IF9UcCgxKTsKKworICAgICAgICAgIF9UcCBfX211OworICAgICAgICAgIF9UcCBfX3huZGV2LCBfX3luZGV2LCBfX3puZGV2OworCisgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDA7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pdGVyID0gMDsgX19pdGVyIDwgX19tYXhfaXRlcjsgKytfX2l0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fbXUgPSAoX194biArIF9feW4gKyBfVHAoMykgKiBfX3puKSAvIF9UcCg1KTsKKyAgICAgICAgICAgICAgX194bmRldiA9IChfX211IC0gX194bikgLyBfX211OworICAgICAgICAgICAgICBfX3luZGV2ID0gKF9fbXUgLSBfX3luKSAvIF9fbXU7CisgICAgICAgICAgICAgIF9fem5kZXYgPSAoX19tdSAtIF9fem4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX1RwIF9fZXBzaWxvbiA9IHN0ZDo6bWF4KHN0ZDo6YWJzKF9feG5kZXYpLCBzdGQ6OmFicyhfX3luZGV2KSk7CisgICAgICAgICAgICAgIF9fZXBzaWxvbiA9IHN0ZDo6bWF4KF9fZXBzaWxvbiwgc3RkOjphYnMoX196bmRldikpOworICAgICAgICAgICAgICBpZiAoX19lcHNpbG9uIDwgX19lcnJ0b2wpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIF9UcCBfX3hucm9vdCA9IHN0ZDo6c3FydChfX3huKTsKKyAgICAgICAgICAgICAgX1RwIF9feW5yb290ID0gc3RkOjpzcXJ0KF9feW4pOworICAgICAgICAgICAgICBfVHAgX196bnJvb3QgPSBzdGQ6OnNxcnQoX196bik7CisgICAgICAgICAgICAgIF9UcCBfX2xhbWJkYSA9IF9feG5yb290ICogKF9feW5yb290ICsgX196bnJvb3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9feW5yb290ICogX196bnJvb3Q7CisgICAgICAgICAgICAgIF9fc2lnbWEgKz0gX19wb3dlcjQgLyAoX196bnJvb3QgKiAoX196biArIF9fbGFtYmRhKSk7CisgICAgICAgICAgICAgIF9fcG93ZXI0ICo9IF9fYzA7CisgICAgICAgICAgICAgIF9feG4gPSBfX2MwICogKF9feG4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICAgIF9feW4gPSBfX2MwICogKF9feW4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICAgIF9fem4gPSBfX2MwICogKF9fem4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICB9CisKKwkgIC8vIE5vdGU6IF9fZWEgaXMgYW4gU1BVIGJhZG5hbWUuCisgICAgICAgICAgX1RwIF9fZWFhID0gX194bmRldiAqIF9feW5kZXY7CisgICAgICAgICAgX1RwIF9fZWIgPSBfX3puZGV2ICogX196bmRldjsKKyAgICAgICAgICBfVHAgX19lYyA9IF9fZWFhIC0gX19lYjsKKyAgICAgICAgICBfVHAgX19lZCA9IF9fZWFhIC0gX1RwKDYpICogX19lYjsKKyAgICAgICAgICBfVHAgX19lZiA9IF9fZWQgKyBfX2VjICsgX19lYzsKKyAgICAgICAgICBfVHAgX19zMSA9IF9fZWQgKiAoLV9fYzEgKyBfX2MzICogX19lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9UcCgzKSAtIF9UcCgzKSAqIF9fYzQgKiBfX3puZGV2ICogX19lZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9UcCgyKSk7CisgICAgICAgICAgX1RwIF9fczIgPSBfX3puZGV2CisgICAgICAgICAgICAgICAgICAgKiAoX19jMiAqIF9fZWYKKyAgICAgICAgICAgICAgICAgICAgKyBfX3puZGV2ICogKC1fX2MzICogX19lYyAtIF9fem5kZXYgKiBfX2M0IC0gX19lYWEpKTsKKworICAgICAgICAgIHJldHVybiBfVHAoMykgKiBfX3NpZ21hICsgX19wb3dlcjQgKiAoX1RwKDEpICsgX19zMSArIF9fczIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX19tdSAqIHN0ZDo6c3FydChfX211KSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSBzZWNvbmQga2luZAorICAgICAqICAgICAgICAgICBAZiQgRShrKSBAZiQgdXNpbmcgdGhlIENhcmxzb24gZm9ybXVsYXRpb24uCisgICAgICogCisgICAgICogICBUaGUgY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIHNlY29uZCBraW5kIGlzIGRlZmluZWQgYXMKKyAgICAgKiAgIEBmWworICAgICAqICAgICBFKGssXHBpLzIpID0gXGludF8wXntccGkvMn1cc3FydHsxIC0ga14yIHNpbl4yXHRoZXRhfQorICAgICAqICAgQGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fayAgVGhlIGFyZ3VtZW50IG9mIHRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fY29tcF9lbGxpbnRfMihfVHAgX19rKQorICAgIHsKKworICAgICAgaWYgKF9faXNuYW4oX19rKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChzdGQ6OmFicyhfX2spID09IDEpCisgICAgICAgIHJldHVybiBfVHAoMSk7CisgICAgICBlbHNlIGlmIChzdGQ6OmFicyhfX2spID4gX1RwKDEpKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQmFkIGFyZ3VtZW50IGluIF9fY29tcF9lbGxpbnRfMi4iKSk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19rayA9IF9fayAqIF9fazsKKworICAgICAgICAgIHJldHVybiBfX2VsbGludF9yZihfVHAoMCksIF9UcCgxKSAtIF9fa2ssIF9UcCgxKSkKKyAgICAgICAgICAgICAgIC0gX19rayAqIF9fZWxsaW50X3JkKF9UcCgwKSwgX1RwKDEpIC0gX19raywgX1RwKDEpKSAvIF9UcCgzKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgaW5jb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgc2Vjb25kIGtpbmQKKyAgICAgKiAgICAgICAgICAgQGYkIEUoayxccGhpKSBAZiQgdXNpbmcgdGhlIENhcmxzb24gZm9ybXVsYXRpb24uCisgICAgICogCisgICAgICogICBUaGUgaW5jb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgc2Vjb25kIGtpbmQgaXMgZGVmaW5lZCBhcworICAgICAqICAgQGZbCisgICAgICogICAgIEUoayxccGhpKSA9IFxpbnRfMF57XHBoaX0gXHNxcnR7MSAtIGteMiBzaW5eMlx0aGV0YX0KKyAgICAgKiAgIEBmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX2sgIFRoZSBhcmd1bWVudCBvZiB0aGUgZWxsaXB0aWMgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9fcGhpICBUaGUgaW50ZWdyYWwgbGltaXQgYXJndW1lbnQgb2YgdGhlIGVsbGlwdGljIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBzZWNvbmQga2luZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19lbGxpbnRfMihfVHAgX19rLCBfVHAgX19waGkpCisgICAgeworCisgICAgICBpZiAoX19pc25hbihfX2spIHx8IF9faXNuYW4oX19waGkpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKHN0ZDo6YWJzKF9faykgPiBfVHAoMSkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJCYWQgYXJndW1lbnQgaW4gX19lbGxpbnRfMi4iKSk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyAgUmVkdWNlIHBoaSB0byAtcGkvMiA8IHBoaSA8ICtwaS8yLgorICAgICAgICAgIGNvbnN0IGludCBfX24gPSBzdGQ6OmZsb29yKF9fcGhpIC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfVHAoMC41TCkpOworICAgICAgICAgIGNvbnN0IF9UcCBfX3BoaV9yZWQgPSBfX3BoaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX24gKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKTsKKworICAgICAgICAgIGNvbnN0IF9UcCBfX2trID0gX19rICogX19rOworICAgICAgICAgIGNvbnN0IF9UcCBfX3MgPSBzdGQ6OnNpbihfX3BoaV9yZWQpOworICAgICAgICAgIGNvbnN0IF9UcCBfX3NzID0gX19zICogX19zOworICAgICAgICAgIGNvbnN0IF9UcCBfX3NzcyA9IF9fc3MgKiBfX3M7CisgICAgICAgICAgY29uc3QgX1RwIF9fYyA9IHN0ZDo6Y29zKF9fcGhpX3JlZCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fY2MgPSBfX2MgKiBfX2M7CisKKyAgICAgICAgICBjb25zdCBfVHAgX19FID0gX19zCisgICAgICAgICAgICAgICAgICAgICAgICAqIF9fZWxsaW50X3JmKF9fY2MsIF9UcCgxKSAtIF9fa2sgKiBfX3NzLCBfVHAoMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAtIF9fa2sgKiBfX3NzcworICAgICAgICAgICAgICAgICAgICAgICAgKiBfX2VsbGludF9yZChfX2NjLCBfVHAoMSkgLSBfX2trICogX19zcywgX1RwKDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgLyBfVHAoMyk7CisKKyAgICAgICAgICBpZiAoX19uID09IDApCisgICAgICAgICAgICByZXR1cm4gX19FOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBfX0UgKyBfVHAoMikgKiBfX24gKiBfX2NvbXBfZWxsaW50XzIoX19rKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbgorICAgICAqICAgICAgICAgICBAZiQgUl9DKHgseSkgPSBSX0YoeCx5LHkpIEBmJCB3aGVyZSBAZiQgUl9GKHgseSx6KSBAZiQKKyAgICAgKiAgICAgICAgICAgaXMgdGhlIENhcmxzb24gZWxsaXB0aWMgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQuCisgICAgICogCisgICAgICogICBUaGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgICAgUl9DKHgseSkgPSBcZnJhY3sxfXsyfSBcaW50XzBeXGluZnR5CisgICAgICogICAgICAgICAgICAgICAgIFxmcmFje2R0fXsodCArIHgpXnsxLzJ9KHQgKyB5KX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBCYXNlZCBvbiBDYXJsc29uJ3MgYWxnb3JpdGhtczoKKyAgICAgKiAgIC0gIEIuIEMuIENhcmxzb24gTnVtZXIuIE1hdGguIDMzLCAxICgxOTc5KQorICAgICAqICAgLSAgQi4gQy4gQ2FybHNvbiwgU3BlY2lhbCBGdW5jdGlvbnMgb2YgQXBwbGllZCBNYXRoZW1hdGljcyAoMTk3NykKKyAgICAgKiAgIC0gIE51bWVyaWNhbCBSZWNpcGVzIGluIEMsIDJuZCBlZCwgcHAuIDI2MS0yNjksCisgICAgICogICAgICBieSBQcmVzcywgVGV1a29sc2t5LCBWZXR0ZXJsaW5nLCBGbGFubmVyeSAoMTk5MikKKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBmaXJzdCBhcmd1bWVudC4KKyAgICAgKiAgIEBwYXJhbSAgX195ICBUaGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAqICAgQHJldHVybiAgVGhlIENhcmxzb24gZWxsaXB0aWMgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZWxsaW50X3JjKF9UcCBfX3gsIF9UcCBfX3kpCisgICAgeworICAgICAgY29uc3QgX1RwIF9fbWluID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptaW4oKTsKKyAgICAgIGNvbnN0IF9UcCBfX21heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWF4KCk7CisgICAgICBjb25zdCBfVHAgX19sb2xpbSA9IF9UcCg1KSAqIF9fbWluOworICAgICAgY29uc3QgX1RwIF9fdXBsaW0gPSBfX21heCAvIF9UcCg1KTsKKworICAgICAgaWYgKF9feCA8IF9UcCgwKSB8fCBfX3kgPCBfVHAoMCkgfHwgX194ICsgX195IDwgX19sb2xpbSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkFyZ3VtZW50IGxlc3MgdGhhbiB6ZXJvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fZWxsaW50X3JjLiIpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX2MwID0gX1RwKDEpIC8gX1RwKDQpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MxID0gX1RwKDEpIC8gX1RwKDcpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MyID0gX1RwKDkpIC8gX1RwKDIyKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMyA9IF9UcCgzKSAvIF9UcCgxMCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzQgPSBfVHAoMykgLyBfVHAoOCk7CisKKyAgICAgICAgICBfVHAgX194biA9IF9feDsKKyAgICAgICAgICBfVHAgX195biA9IF9feTsKKworICAgICAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2VycnRvbCA9IHN0ZDo6cG93KF9fZXBzIC8gX1RwKDMwKSwgX1RwKDEpIC8gX1RwKDYpKTsKKyAgICAgICAgICBfVHAgX19tdTsKKyAgICAgICAgICBfVHAgX19zbjsKKworICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwOworICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IF9faXRlciA9IDA7IF9faXRlciA8IF9fbWF4X2l0ZXI7ICsrX19pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX211ID0gKF9feG4gKyBfVHAoMikgKiBfX3luKSAvIF9UcCgzKTsKKyAgICAgICAgICAgICAgX19zbiA9IChfX3luICsgX19tdSkgLyBfX211IC0gX1RwKDIpOworICAgICAgICAgICAgICBpZiAoc3RkOjphYnMoX19zbikgPCBfX2VycnRvbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fbGFtYmRhID0gX1RwKDIpICogc3RkOjpzcXJ0KF9feG4pICogc3RkOjpzcXJ0KF9feW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX195bjsKKyAgICAgICAgICAgICAgX194biA9IF9fYzAgKiAoX194biArIF9fbGFtYmRhKTsKKyAgICAgICAgICAgICAgX195biA9IF9fYzAgKiAoX195biArIF9fbGFtYmRhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9UcCBfX3MgPSBfX3NuICogX19zbgorICAgICAgICAgICAgICAgICAgKiAoX19jMyArIF9fc24qKF9fYzEgKyBfX3NuICogKF9fYzQgKyBfX3NuICogX19jMikpKTsKKworICAgICAgICAgIHJldHVybiAoX1RwKDEpICsgX19zKSAvIHN0ZDo6c3FydChfX211KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBAZiQgUl9KKHgseSx6LHApIEBmJAorICAgICAqICAgICAgICAgICBvZiB0aGUgdGhpcmQga2luZC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSB0aGlyZCBraW5kIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgICBSX0ooeCx5LHoscCkgPSBcZnJhY3szfXsyfSBcaW50XzBeXGluZnR5CisgICAgICogICAgICAgXGZyYWN7ZHR9eyh0ICsgeCleezEvMn0odCArIHkpXnsxLzJ9KHQgKyB6KV57MS8yfSh0ICsgcCl9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQmFzZWQgb24gQ2FybHNvbidzIGFsZ29yaXRobXM6CisgICAgICogICAtICBCLiBDLiBDYXJsc29uIE51bWVyLiBNYXRoLiAzMywgMSAoMTk3OSkKKyAgICAgKiAgIC0gIEIuIEMuIENhcmxzb24sIFNwZWNpYWwgRnVuY3Rpb25zIG9mIEFwcGxpZWQgTWF0aGVtYXRpY3MgKDE5NzcpCisgICAgICogICAtICBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCAybmQgZWQsIHBwLiAyNjEtMjY5LAorICAgICAqICAgICAgYnkgUHJlc3MsIFRldWtvbHNreSwgVmV0dGVybGluZywgRmxhbm5lcnkgKDE5OTIpCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgZmlyc3Qgb2YgdGhyZWUgc3ltbWV0cmljIGFyZ3VtZW50cy4KKyAgICAgKiAgIEBwYXJhbSAgX195ICBUaGUgc2Vjb25kIG9mIHRocmVlIHN5bW1ldHJpYyBhcmd1bWVudHMuCisgICAgICogICBAcGFyYW0gIF9feiAgVGhlIHRoaXJkIG9mIHRocmVlIHN5bW1ldHJpYyBhcmd1bWVudHMuCisgICAgICogICBAcGFyYW0gIF9fcCAgVGhlIGZvdXJ0aCBhcmd1bWVudC4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBmb3VydGgga2luZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19lbGxpbnRfcmooX1RwIF9feCwgX1RwIF9feSwgX1RwIF9feiwgX1RwIF9fcCkKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19taW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1pbigpOworICAgICAgY29uc3QgX1RwIF9fbWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptYXgoKTsKKyAgICAgIGNvbnN0IF9UcCBfX2xvbGltID0gc3RkOjpwb3coX1RwKDUpICogX19taW4sIF9UcCgxKS9fVHAoMykpOworICAgICAgY29uc3QgX1RwIF9fdXBsaW0gPSBfVHAoMC4zTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICogc3RkOjpwb3coX1RwKDAuMkwpICogX19tYXgsIF9UcCgxKS9fVHAoMykpOworCisgICAgICBpZiAoX194IDwgX1RwKDApIHx8IF9feSA8IF9UcCgwKSB8fCBfX3ogPCBfVHAoMCkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCBsZXNzIHRoYW4gemVybyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2VsbGludF9yai4iKSk7CisgICAgICBlbHNlIGlmIChfX3ggKyBfX3kgPCBfX2xvbGltIHx8IF9feCArIF9feiA8IF9fbG9saW0KKyAgICAgICAgICAgIHx8IF9feSArIF9feiA8IF9fbG9saW0gfHwgX19wIDwgX19sb2xpbSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkFyZ3VtZW50IHRvbyBzbWFsbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2VsbGludF9yaiIpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX2MwID0gX1RwKDEpIC8gX1RwKDQpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MxID0gX1RwKDMpIC8gX1RwKDE0KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMiA9IF9UcCgxKSAvIF9UcCgzKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMyA9IF9UcCgzKSAvIF9UcCgyMik7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzQgPSBfVHAoMykgLyBfVHAoMjYpOworCisgICAgICAgICAgX1RwIF9feG4gPSBfX3g7CisgICAgICAgICAgX1RwIF9feW4gPSBfX3k7CisgICAgICAgICAgX1RwIF9fem4gPSBfX3o7CisgICAgICAgICAgX1RwIF9fcG4gPSBfX3A7CisgICAgICAgICAgX1RwIF9fc2lnbWEgPSBfVHAoMCk7CisgICAgICAgICAgX1RwIF9fcG93ZXI0ID0gX1RwKDEpOworCisgICAgICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fZXJydG9sID0gc3RkOjpwb3coX19lcHMgLyBfVHAoOCksIF9UcCgxKSAvIF9UcCg2KSk7CisKKyAgICAgICAgICBfVHAgX19sYW1iZGEsIF9fbXU7CisgICAgICAgICAgX1RwIF9feG5kZXYsIF9feW5kZXYsIF9fem5kZXYsIF9fcG5kZXY7CisKKyAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2l0ZXIgPSAwOyBfX2l0ZXIgPCBfX21heF9pdGVyOyArK19faXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19tdSA9IChfX3huICsgX195biArIF9fem4gKyBfVHAoMikgKiBfX3BuKSAvIF9UcCg1KTsKKyAgICAgICAgICAgICAgX194bmRldiA9IChfX211IC0gX194bikgLyBfX211OworICAgICAgICAgICAgICBfX3luZGV2ID0gKF9fbXUgLSBfX3luKSAvIF9fbXU7CisgICAgICAgICAgICAgIF9fem5kZXYgPSAoX19tdSAtIF9fem4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX19wbmRldiA9IChfX211IC0gX19wbikgLyBfX211OworICAgICAgICAgICAgICBfVHAgX19lcHNpbG9uID0gc3RkOjptYXgoc3RkOjphYnMoX194bmRldiksIHN0ZDo6YWJzKF9feW5kZXYpKTsKKyAgICAgICAgICAgICAgX19lcHNpbG9uID0gc3RkOjptYXgoX19lcHNpbG9uLCBzdGQ6OmFicyhfX3puZGV2KSk7CisgICAgICAgICAgICAgIF9fZXBzaWxvbiA9IHN0ZDo6bWF4KF9fZXBzaWxvbiwgc3RkOjphYnMoX19wbmRldikpOworICAgICAgICAgICAgICBpZiAoX19lcHNpbG9uIDwgX19lcnJ0b2wpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3hucm9vdCA9IHN0ZDo6c3FydChfX3huKTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9feW5yb290ID0gc3RkOjpzcXJ0KF9feW4pOworICAgICAgICAgICAgICBjb25zdCBfVHAgX196bnJvb3QgPSBzdGQ6OnNxcnQoX196bik7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2xhbWJkYSA9IF9feG5yb290ICogKF9feW5yb290ICsgX196bnJvb3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9feW5yb290ICogX196bnJvb3Q7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2FscGhhMSA9IF9fcG4gKiAoX194bnJvb3QgKyBfX3lucm9vdCArIF9fem5yb290KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9feG5yb290ICogX195bnJvb3QgKiBfX3pucm9vdDsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fYWxwaGEyID0gX19hbHBoYTEgKiBfX2FscGhhMTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fYmV0YSA9IF9fcG4gKiAoX19wbiArIF9fbGFtYmRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChfX3BuICsgX19sYW1iZGEpOworICAgICAgICAgICAgICBfX3NpZ21hICs9IF9fcG93ZXI0ICogX19lbGxpbnRfcmMoX19hbHBoYTIsIF9fYmV0YSk7CisgICAgICAgICAgICAgIF9fcG93ZXI0ICo9IF9fYzA7CisgICAgICAgICAgICAgIF9feG4gPSBfX2MwICogKF9feG4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICAgIF9feW4gPSBfX2MwICogKF9feW4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICAgIF9fem4gPSBfX2MwICogKF9fem4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICAgIF9fcG4gPSBfX2MwICogKF9fcG4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICB9CisKKwkgIC8vIE5vdGU6IF9fZWEgaXMgYW4gU1BVIGJhZG5hbWUuCisgICAgICAgICAgX1RwIF9fZWFhID0gX194bmRldiAqIChfX3luZGV2ICsgX196bmRldikgKyBfX3luZGV2ICogX196bmRldjsKKyAgICAgICAgICBfVHAgX19lYiA9IF9feG5kZXYgKiBfX3luZGV2ICogX196bmRldjsKKyAgICAgICAgICBfVHAgX19lYyA9IF9fcG5kZXYgKiBfX3BuZGV2OworICAgICAgICAgIF9UcCBfX2UyID0gX19lYWEgLSBfVHAoMykgKiBfX2VjOworICAgICAgICAgIF9UcCBfX2UzID0gX19lYiArIF9UcCgyKSAqIF9fcG5kZXYgKiAoX19lYWEgLSBfX2VjKTsKKyAgICAgICAgICBfVHAgX19zMSA9IF9UcCgxKSArIF9fZTIgKiAoLV9fYzEgKyBfVHAoMykgKiBfX2MzICogX19lMiAvIF9UcCg0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX1RwKDMpICogX19jNCAqIF9fZTMgLyBfVHAoMikpOworICAgICAgICAgIF9UcCBfX3MyID0gX19lYiAqIChfX2MyIC8gX1RwKDIpCisgICAgICAgICAgICAgICAgICAgKyBfX3BuZGV2ICogKC1fX2MzIC0gX19jMyArIF9fcG5kZXYgKiBfX2M0KSk7CisgICAgICAgICAgX1RwIF9fczMgPSBfX3BuZGV2ICogX19lYWEgKiAoX19jMiAtIF9fcG5kZXYgKiBfX2MzKQorICAgICAgICAgICAgICAgICAgIC0gX19jMiAqIF9fcG5kZXYgKiBfX2VjOworCisgICAgICAgICAgcmV0dXJuIF9UcCgzKSAqIF9fc2lnbWEgKyBfX3Bvd2VyNCAqIChfX3MxICsgX19zMiArIF9fczMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChfX211ICogc3RkOjpzcXJ0KF9fbXUpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBjb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgdGhpcmQga2luZAorICAgICAqICAgICAgICAgIEBmJCBcUGkoayxcbnUpID0gXFBpKGssXG51LFxwaS8yKSBAZiQgdXNpbmcgdGhlCisgICAgICogICAgICAgICAgQ2FybHNvbiBmb3JtdWxhdGlvbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgdGhpcmQga2luZCBpcyBkZWZpbmVkIGFzCisgICAgICogICBAZlsKKyAgICAgKiAgICAgXFBpKGssXG51KSA9IFxpbnRfMF57XHBpLzJ9CisgICAgICogICAgICAgICAgICAgICAgICAgXGZyYWN7ZFx0aGV0YX0KKyAgICAgKiAgICAgICAgICAgICAgICAgeygxIC0gXG51IFxzaW5eMlx0aGV0YSlcc3FydHsxIC0ga14yIFxzaW5eMlx0aGV0YX19CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19rICBUaGUgYXJndW1lbnQgb2YgdGhlIGVsbGlwdGljIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX251ICBUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgdGhpcmQga2luZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jb21wX2VsbGludF8zKF9UcCBfX2ssIF9UcCBfX251KQorICAgIHsKKworICAgICAgaWYgKF9faXNuYW4oX19rKSB8fCBfX2lzbmFuKF9fbnUpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9fbnUgPT0gX1RwKDEpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjppbmZpbml0eSgpOworICAgICAgZWxzZSBpZiAoc3RkOjphYnMoX19rKSA+IF9UcCgxKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCBpbiBfX2NvbXBfZWxsaW50XzMuIikpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fa2sgPSBfX2sgKiBfX2s7CisKKyAgICAgICAgICByZXR1cm4gX19lbGxpbnRfcmYoX1RwKDApLCBfVHAoMSkgLSBfX2trLCBfVHAoMSkpCisgICAgICAgICAgICAgICAtIF9fbnUKKyAgICAgICAgICAgICAgICogX19lbGxpbnRfcmooX1RwKDApLCBfVHAoMSkgLSBfX2trLCBfVHAoMSksIF9UcCgxKSArIF9fbnUpCisgICAgICAgICAgICAgICAvIF9UcCgzKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBpbmNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSB0aGlyZCBraW5kCisgICAgICogICAgICAgICAgQGYkIFxQaShrLFxudSxccGhpKSBAZiQgdXNpbmcgdGhlIENhcmxzb24gZm9ybXVsYXRpb24uCisgICAgICogCisgICAgICogICBUaGUgaW5jb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgdGhpcmQga2luZCBpcyBkZWZpbmVkIGFzCisgICAgICogICBAZlsKKyAgICAgKiAgICAgXFBpKGssXG51LFxwaGkpID0gXGludF8wXntccGhpfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBcZnJhY3tkXHRoZXRhfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoMSAtIFxudSBcc2luXjJcdGhldGEpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxzcXJ0ezEgLSBrXjIgXHNpbl4yXHRoZXRhfX0KKyAgICAgKiAgIEBmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX2sgIFRoZSBhcmd1bWVudCBvZiB0aGUgZWxsaXB0aWMgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9fbnUgIFRoZSBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIGVsbGlwdGljIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3BoaSAgVGhlIGludGVncmFsIGxpbWl0IGFyZ3VtZW50IG9mIHRoZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgdGhpcmQga2luZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19lbGxpbnRfMyhfVHAgX19rLCBfVHAgX19udSwgX1RwIF9fcGhpKQorICAgIHsKKworICAgICAgaWYgKF9faXNuYW4oX19rKSB8fCBfX2lzbmFuKF9fbnUpIHx8IF9faXNuYW4oX19waGkpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKHN0ZDo6YWJzKF9faykgPiBfVHAoMSkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJCYWQgYXJndW1lbnQgaW4gX19lbGxpbnRfMy4iKSk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyAgUmVkdWNlIHBoaSB0byAtcGkvMiA8IHBoaSA8ICtwaS8yLgorICAgICAgICAgIGNvbnN0IGludCBfX24gPSBzdGQ6OmZsb29yKF9fcGhpIC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfVHAoMC41TCkpOworICAgICAgICAgIGNvbnN0IF9UcCBfX3BoaV9yZWQgPSBfX3BoaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX24gKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKTsKKworICAgICAgICAgIGNvbnN0IF9UcCBfX2trID0gX19rICogX19rOworICAgICAgICAgIGNvbnN0IF9UcCBfX3MgPSBzdGQ6OnNpbihfX3BoaV9yZWQpOworICAgICAgICAgIGNvbnN0IF9UcCBfX3NzID0gX19zICogX19zOworICAgICAgICAgIGNvbnN0IF9UcCBfX3NzcyA9IF9fc3MgKiBfX3M7CisgICAgICAgICAgY29uc3QgX1RwIF9fYyA9IHN0ZDo6Y29zKF9fcGhpX3JlZCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fY2MgPSBfX2MgKiBfX2M7CisKKyAgICAgICAgICBjb25zdCBfVHAgX19QaSA9IF9fcworICAgICAgICAgICAgICAgICAgICAgICAgICogX19lbGxpbnRfcmYoX19jYywgX1RwKDEpIC0gX19rayAqIF9fc3MsIF9UcCgxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtIF9fbnUgKiBfX3NzcworICAgICAgICAgICAgICAgICAgICAgICAgICogX19lbGxpbnRfcmooX19jYywgX1RwKDEpIC0gX19rayAqIF9fc3MsIF9UcCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCgxKSArIF9fbnUgKiBfX3NzKSAvIF9UcCgzKTsKKworICAgICAgICAgIGlmIChfX24gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBfX1BpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBfX1BpICsgX1RwKDIpICogX19uICogX19jb21wX2VsbGludF8zKF9faywgX19udSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0VMTF9JTlRFR1JBTF9UQ0MKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZXhwX2ludGVncmFsLnRjYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2V4cF9pbnRlZ3JhbC50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjMDNhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2V4cF9pbnRlZ3JhbC50Y2MKQEAgLTAsMCArMSw1MjYgQEAKKy8vIFNwZWNpYWwgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2V4cF9pbnRlZ3JhbC50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvY21hdGh9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODIgVFIxOiA1LjIgIFNwZWNpYWwgZnVuY3Rpb25zCisvLworCisvLyAgV3JpdHRlbiBieSBFZHdhcmQgU21pdGgtUm93bGFuZCBiYXNlZCBvbjoKKy8vCisvLyAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorLy8gICAgICAgRWQuIGJ5IE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisvLyAgICAgICBEb3ZlciBQdWJsaWNhdGlvbnMsIE5ldy1Zb3JrLCBTZWN0aW9uIDUsIHBwLiAyMjgtMjUxLgorLy8gICAoMikgVGhlIEdudSBTY2llbnRpZmljIExpYnJhcnksIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nc2wKKy8vICAgKDMpIE51bWVyaWNhbCBSZWNpcGVzIGluIEMsIGJ5IFcuIEguIFByZXNzLCBTLiBBLiBUZXVrb2xza3ksCisvLyAgICAgICBXLiBULiBWZXR0ZXJsaW5nLCBCLiBQLiBGbGFubmVyeSwgQ2FtYnJpZGdlIFVuaXZlcnNpdHkgUHJlc3MgKDE5OTIpLAorLy8gICAgICAgMm5kIGVkLCBwcC4gMjIyLTIyNS4KKy8vCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0VYUF9JTlRFR1JBTF9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0VYUF9JTlRFR1JBTF9UQ0MgMQorCisjaW5jbHVkZSAic3BlY2lhbF9mdW5jdGlvbl91dGlsLmgiCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyBbNS4yXSBTcGVjaWFsIGZ1bmN0aW9ucworCisgIC8vIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IF9UcCBfX2V4cGludF9FMShfVHApOworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBAZiQgRV8xKHgpIEBmJAorICAgICAqICAgICAgICAgIGJ5IHNlcmllcyBzdW1tYXRpb24uICBUaGlzIHNob3VsZCBiZSBnb29kCisgICAgICogICAgICAgICAgZm9yIEBmJCB4IDwgMSBAZiQuCisgICAgICogCisgICAgICogICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgaXMgZ2l2ZW4gYnkKKyAgICAgKiAgICAgICAgICBcZlsKKyAgICAgKiAgICAgICAgICAgIEVfMSh4KSA9IFxpbnRfezF9XntcaW5mdHl9IFxmcmFje2Veey14dH19e3R9IGR0CisgICAgICogICAgICAgICAgXGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19leHBpbnRfRTFfc2VyaWVzKF9UcCBfX3gpCisgICAgeworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICBfVHAgX190ZXJtID0gX1RwKDEpOworICAgICAgX1RwIF9fZXN1bSA9IF9UcCgwKTsKKyAgICAgIF9UcCBfX29zdW0gPSBfVHAoMCk7CisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDE7IF9faSA8IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX190ZXJtICo9IC0gX194IC8gX19pOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0pIDwgX19lcHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoX190ZXJtID49IF9UcCgwKSkKKyAgICAgICAgICAgIF9fZXN1bSArPSBfX3Rlcm0gLyBfX2k7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX19vc3VtICs9IF9fdGVybSAvIF9faTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gLSBfX2VzdW0gLSBfX29zdW0KKyAgICAgICAgICAgICAtIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19nYW1tYV9lKCkgLSBzdGQ6OmxvZyhfX3gpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBAZiQgRV8xKHgpIEBmJAorICAgICAqICAgICAgICAgIGJ5IGFzeW1wdG90aWMgZXhwYW5zaW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsIGlzIGdpdmVuIGJ5CisgICAgICogICAgICAgICAgXGZbCisgICAgICogICAgICAgICAgICBFXzEoeCkgPSBcaW50X3sxfV5caW5mdHkgXGZyYWN7ZV57LXh0fX17dH0gZHQKKyAgICAgKiAgICAgICAgICBcZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2V4cGludF9FMV9hc3ltcChfVHAgX194KQorICAgIHsKKyAgICAgIF9UcCBfX3Rlcm0gPSBfVHAoMSk7CisgICAgICBfVHAgX19lc3VtID0gX1RwKDEpOworICAgICAgX1RwIF9fb3N1bSA9IF9UcCgwKTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwMDsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDE7IF9faSA8IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fcHJldiA9IF9fdGVybTsKKyAgICAgICAgICBfX3Rlcm0gKj0gLSBfX2kgLyBfX3g7CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fdGVybSkgPiBzdGQ6OmFicyhfX3ByZXYpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKF9fdGVybSA+PSBfVHAoMCkpCisgICAgICAgICAgICBfX2VzdW0gKz0gX190ZXJtOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fb3N1bSArPSBfX3Rlcm07CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIHN0ZDo6ZXhwKC0gX194KSAqIChfX2VzdW0gKyBfX29zdW0pIC8gX194OworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBAZiQgRV9uKHgpIEBmJAorICAgICAqICAgICAgICAgIGJ5IHNlcmllcyBzdW1tYXRpb24uCisgICAgICogCisgICAgICogICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgaXMgZ2l2ZW4gYnkKKyAgICAgKiAgICAgICAgICBcZlsKKyAgICAgKiAgICAgICAgICAgIEVfbih4KSA9IFxpbnRfezF9XlxpbmZ0eSBcZnJhY3tlXnsteHR9fXt0Xm59IGR0CisgICAgICogICAgICAgICAgXGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fbiAgVGhlIG9yZGVyIG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2V4cGludF9Fbl9zZXJpZXModW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDsKKyAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgY29uc3QgaW50IF9fbm0xID0gX19uIC0gMTsKKyAgICAgIF9UcCBfX2FucyA9IChfX25tMSAhPSAwCisgICAgICAgICAgICAgICAgPyBfVHAoMSkgLyBfX25tMSA6IC1zdGQ6OmxvZyhfX3gpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX2dhbW1hX2UoKSk7CisgICAgICBfVHAgX19mYWN0ID0gX1RwKDEpOworICAgICAgZm9yIChpbnQgX19pID0gMTsgX19pIDw9IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX19mYWN0ICo9IC1fX3ggLyBfVHAoX19pKTsKKyAgICAgICAgICBfVHAgX19kZWw7CisgICAgICAgICAgaWYgKCBfX2kgIT0gX19ubTEgKQorICAgICAgICAgICAgX19kZWwgPSAtX19mYWN0IC8gX1RwKF9faSAtIF9fbm0xKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9UcCBfX3BzaSA9IC1fX251bWVyaWNfY29uc3RhbnRzPF9UcD46OmdhbW1hX2UoKTsKKyAgICAgICAgICAgICAgZm9yIChpbnQgX19paSA9IDE7IF9faWkgPD0gX19ubTE7ICsrX19paSkKKyAgICAgICAgICAgICAgICBfX3BzaSArPSBfVHAoMSkgLyBfVHAoX19paSk7CisgICAgICAgICAgICAgIF9fZGVsID0gX19mYWN0ICogKF9fcHNpIC0gc3RkOjpsb2coX194KSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgIF9fYW5zICs9IF9fZGVsOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX2RlbCkgPCBfX2VwcyAqIHN0ZDo6YWJzKF9fYW5zKSkKKyAgICAgICAgICAgIHJldHVybiBfX2FuczsKKyAgICAgICAgfQorICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJTZXJpZXMgc3VtbWF0aW9uIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fZXhwaW50X0VuX3Nlcmllcy4iKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGV4cG9uZW50aWFsIGludGVncmFsIEBmJCBFX24oeCkgQGYkCisgICAgICogICAgICAgICAgYnkgY29udGludWVkIGZyYWN0aW9ucy4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyBnaXZlbiBieQorICAgICAqICAgICAgICAgIFxmWworICAgICAqICAgICAgICAgICAgRV9uKHgpID0gXGludF97MX1eXGluZnR5IFxmcmFje2Veey14dH19e3Rebn0gZHQKKyAgICAgKiAgICAgICAgICBcZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19uICBUaGUgb3JkZXIgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZXhwaW50X0VuX2NvbnRfZnJhYyh1bnNpZ25lZCBpbnQgX19uLCBfVHAgX194KQorICAgIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwOworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICBjb25zdCBfVHAgX19mcF9taW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1pbigpOworICAgICAgY29uc3QgaW50IF9fbm0xID0gX19uIC0gMTsKKyAgICAgIF9UcCBfX2IgPSBfX3ggKyBfVHAoX19uKTsKKyAgICAgIF9UcCBfX2MgPSBfVHAoMSkgLyBfX2ZwX21pbjsKKyAgICAgIF9UcCBfX2QgPSBfVHAoMSkgLyBfX2I7CisgICAgICBfVHAgX19oID0gX19kOworICAgICAgZm9yICggdW5zaWduZWQgaW50IF9faSA9IDE7IF9faSA8PSBfX21heF9pdGVyOyArK19faSApCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19hID0gLV9UcChfX2kgKiAoX19ubTEgKyBfX2kpKTsKKyAgICAgICAgICBfX2IgKz0gX1RwKDIpOworICAgICAgICAgIF9fZCA9IF9UcCgxKSAvIChfX2EgKiBfX2QgKyBfX2IpOworICAgICAgICAgIF9fYyA9IF9fYiArIF9fYSAvIF9fYzsKKyAgICAgICAgICBjb25zdCBfVHAgX19kZWwgPSBfX2MgKiBfX2Q7CisgICAgICAgICAgX19oICo9IF9fZGVsOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX2RlbCAtIF9UcCgxKSkgPCBfX2VwcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fYW5zID0gX19oICogc3RkOjpleHAoLV9feCk7CisgICAgICAgICAgICAgIHJldHVybiBfX2FuczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJDb250aW51ZWQgZnJhY3Rpb24gZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19leHBpbnRfRW5fY29udF9mcmFjLiIpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgQGYkIEVfbih4KSBAZiQKKyAgICAgKiAgICAgICAgICBieSByZWN1cnNpb24uICBVc2UgdXB3YXJkIHJlY3Vyc2lvbiBmb3IgQGYkIHggPCBuIEBmJAorICAgICAqICAgICAgICAgIGFuZCBkb3dud2FyZCByZWN1cnNpb24gKE1pbGxlcidzIGFsZ29yaXRobSkgb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqICAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsIGlzIGdpdmVuIGJ5CisgICAgICogICAgICAgICAgXGZbCisgICAgICogICAgICAgICAgICBFX24oeCkgPSBcaW50X3sxfV5caW5mdHkgXGZyYWN7ZV57LXh0fX17dF5ufSBkdAorICAgICAqICAgICAgICAgIFxmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX24gIFRoZSBvcmRlciBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19leHBpbnRfRW5fcmVjdXJzaW9uKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gpCisgICAgeworICAgICAgX1RwIF9fRW47CisgICAgICBfVHAgX19FMSA9IF9fZXhwaW50X0UxKF9feCk7CisgICAgICBpZiAoX194IDwgX1RwKF9fbikpCisgICAgICAgIHsKKyAgICAgICAgICAvLyAgRm9yd2FyZCByZWN1cnNpb24gaXMgc3RhYmxlIG9ubHkgZm9yIG4gPCB4LgorICAgICAgICAgIF9fRW4gPSBfX0UxOworICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IF9faiA9IDI7IF9faiA8IF9fbjsgKytfX2opCisgICAgICAgICAgICBfX0VuID0gKHN0ZDo6ZXhwKC1fX3gpIC0gX194ICogX19FbikgLyBfVHAoX19qIC0gMSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vICBCYWNrd2FyZCByZWN1cnNpb24gaXMgc3RhYmxlIG9ubHkgZm9yIG4gPj0geC4KKyAgICAgICAgICBfX0VuID0gX1RwKDEpOworICAgICAgICAgIGNvbnN0IGludCBfX04gPSBfX24gKyAyMDsgIC8vICBUT0RPOiBDaGVjayB0aGlzIHN0YXJ0aW5nIG51bWJlci4KKyAgICAgICAgICBfVHAgX19zYXZlID0gX1RwKDApOworICAgICAgICAgIGZvciAoaW50IF9faiA9IF9fTjsgX19qID4gMDsgLS1fX2opCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fRW4gPSAoc3RkOjpleHAoLV9feCkgLSBfX2ogKiBfX0VuKSAvIF9feDsKKyAgICAgICAgICAgICAgaWYgKF9faiA9PSBfX24pCisgICAgICAgICAgICAgICAgX19zYXZlID0gX19FbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9UcCBfX25vcm0gPSBfX0VuIC8gX19FMTsKKyAgICAgICAgICAgIF9fRW4gLz0gX19ub3JtOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBfX0VuOworICAgIH0KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgQGYkIEVpKHgpIEBmJAorICAgICAqICAgICAgICAgIGJ5IHNlcmllcyBzdW1tYXRpb24uCisgICAgICogCisgICAgICogICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgaXMgZ2l2ZW4gYnkKKyAgICAgKiAgICAgICAgICBcZlsKKyAgICAgKiAgICAgICAgICAgIEVpKHgpID0gLVxpbnRfey14fV5caW5mdHkgXGZyYWN7ZV50fXt0fSBkdAorICAgICAqICAgICAgICAgIFxmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZXhwaW50X0VpX3NlcmllcyhfVHAgX194KQorICAgIHsKKyAgICAgIF9UcCBfX3Rlcm0gPSBfVHAoMSk7CisgICAgICBfVHAgX19zdW0gPSBfVHAoMCk7CisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAxOyBfX2kgPCBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fdGVybSAqPSBfX3ggLyBfX2k7CisgICAgICAgICAgX19zdW0gKz0gX190ZXJtIC8gX19pOworICAgICAgICAgIGlmIChfX3Rlcm0gPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSAqIF9fc3VtKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19nYW1tYV9lKCkgKyBfX3N1bSArIHN0ZDo6bG9nKF9feCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGV4cG9uZW50aWFsIGludGVncmFsIEBmJCBFaSh4KSBAZiQKKyAgICAgKiAgICAgICAgICBieSBhc3ltcHRvdGljIGV4cGFuc2lvbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyBnaXZlbiBieQorICAgICAqICAgICAgICAgIFxmWworICAgICAqICAgICAgICAgICAgRWkoeCkgPSAtXGludF97LXh9XlxpbmZ0eSBcZnJhY3tlXnR9e3R9IGR0CisgICAgICogICAgICAgICAgXGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19leHBpbnRfRWlfYXN5bXAoX1RwIF9feCkKKyAgICB7CisgICAgICBfVHAgX190ZXJtID0gX1RwKDEpOworICAgICAgX1RwIF9fc3VtID0gX1RwKDEpOworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDAwOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMTsgX19pIDwgX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19wcmV2ID0gX190ZXJtOworICAgICAgICAgIF9fdGVybSAqPSBfX2kgLyBfX3g7CisgICAgICAgICAgaWYgKF9fdGVybSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKF9fdGVybSA+PSBfX3ByZXYpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3N1bSArPSBfX3Rlcm07CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIHN0ZDo6ZXhwKF9feCkgKiBfX3N1bSAvIF9feDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgQGYkIEVpKHgpIEBmJC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyBnaXZlbiBieQorICAgICAqICAgICAgICAgIFxmWworICAgICAqICAgICAgICAgICAgRWkoeCkgPSAtXGludF97LXh9XlxpbmZ0eSBcZnJhY3tlXnR9e3R9IGR0CisgICAgICogICAgICAgICAgXGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19leHBpbnRfRWkoX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX194IDwgX1RwKDApKQorICAgICAgICByZXR1cm4gLV9fZXhwaW50X0UxKC1fX3gpOworICAgICAgZWxzZSBpZiAoX194IDwgLXN0ZDo6bG9nKHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpKSkKKyAgICAgICAgcmV0dXJuIF9fZXhwaW50X0VpX3NlcmllcyhfX3gpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX19leHBpbnRfRWlfYXN5bXAoX194KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgQGYkIEVfMSh4KSBAZiQuCisgICAgICogCisgICAgICogICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgaXMgZ2l2ZW4gYnkKKyAgICAgKiAgICAgICAgICBcZlsKKyAgICAgKiAgICAgICAgICAgIEVfMSh4KSA9IFxpbnRfezF9XlxpbmZ0eSBcZnJhY3tlXnsteHR9fXt0fSBkdAorICAgICAqICAgICAgICAgIFxmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZXhwaW50X0UxKF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9feCA8IF9UcCgwKSkKKyAgICAgICAgcmV0dXJuIC1fX2V4cGludF9FaSgtX194KTsKKyAgICAgIGVsc2UgaWYgKF9feCA8IF9UcCgxKSkKKyAgICAgICAgcmV0dXJuIF9fZXhwaW50X0UxX3NlcmllcyhfX3gpOworICAgICAgZWxzZSBpZiAoX194IDwgX1RwKDEwMCkpICAvLyAgVE9ETzogRmluZCBhIGdvb2QgYXN5bXB0b3RpYyBzd2l0Y2ggcG9pbnQuCisgICAgICAgIHJldHVybiBfX2V4cGludF9Fbl9jb250X2ZyYWMoMSwgX194KTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9fZXhwaW50X0UxX2FzeW1wKF9feCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGV4cG9uZW50aWFsIGludGVncmFsIEBmJCBFX24oeCkgQGYkCisgICAgICogICAgICAgICAgZm9yIGxhcmdlIGFyZ3VtZW50LgorICAgICAqIAorICAgICAqICAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsIGlzIGdpdmVuIGJ5CisgICAgICogICAgICAgICAgXGZbCisgICAgICogICAgICAgICAgICBFX24oeCkgPSBcaW50X3sxfV5caW5mdHkgXGZyYWN7ZV57LXh0fX17dF5ufSBkdAorICAgICAqICAgICAgICAgIFxmXQorICAgICAqIAorICAgICAqICAgVGhpcyBpcyBzb21ldGhpbmcgb2YgYW4gZXh0ZW5zaW9uLgorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX24gIFRoZSBvcmRlciBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19leHBpbnRfYXN5bXAodW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICBfVHAgX190ZXJtID0gX1RwKDEpOworICAgICAgX1RwIF9fc3VtID0gX1RwKDEpOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMTsgX19pIDw9IF9fbjsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19wcmV2ID0gX190ZXJtOworICAgICAgICAgIF9fdGVybSAqPSAtKF9fbiAtIF9faSArIDEpIC8gX194OworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0pID4gc3RkOjphYnMoX19wcmV2KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIF9fc3VtICs9IF9fdGVybTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gc3RkOjpleHAoLV9feCkgKiBfX3N1bSAvIF9feDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgQGYkIEVfbih4KSBAZiQKKyAgICAgKiAgICAgICAgICBmb3IgbGFyZ2Ugb3JkZXIuCisgICAgICogCisgICAgICogICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgaXMgZ2l2ZW4gYnkKKyAgICAgKiAgICAgICAgICBcZlsKKyAgICAgKiAgICAgICAgICAgIEVfbih4KSA9IFxpbnRfezF9XlxpbmZ0eSBcZnJhY3tlXnsteHR9fXt0Xm59IGR0CisgICAgICogICAgICAgICAgXGZdCisgICAgICogICAgICAgIAorICAgICAqICAgVGhpcyBpcyBzb21ldGhpbmcgb2YgYW4gZXh0ZW5zaW9uLgorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX24gIFRoZSBvcmRlciBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19leHBpbnRfbGFyZ2Vfbih1bnNpZ25lZCBpbnQgX19uLCBfVHAgX194KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX3hwbiA9IF9feCArIF9fbjsKKyAgICAgIGNvbnN0IF9UcCBfX3hwbjIgPSBfX3hwbiAqIF9feHBuOworICAgICAgX1RwIF9fdGVybSA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX3N1bSA9IF9UcCgxKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDE7IF9faSA8PSBfX247ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fcHJldiA9IF9fdGVybTsKKyAgICAgICAgICBfX3Rlcm0gKj0gKF9fbiAtIDIgKiAoX19pIC0gMSkgKiBfX3gpIC8gX194cG4yOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0pIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3N1bSArPSBfX3Rlcm07CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIHN0ZDo6ZXhwKC1fX3gpICogX19zdW0gLyBfX3hwbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgQGYkIEVfbih4KSBAZiQuCisgICAgICogCisgICAgICogICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgaXMgZ2l2ZW4gYnkKKyAgICAgKiAgICAgICAgICBcZlsKKyAgICAgKiAgICAgICAgICAgIEVfbih4KSA9IFxpbnRfezF9XlxpbmZ0eSBcZnJhY3tlXnsteHR9fXt0Xm59IGR0CisgICAgICogICAgICAgICAgXGZdCisgICAgICogICBUaGlzIGlzIHNvbWV0aGluZyBvZiBhbiBleHRlbnNpb24uCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fbiAgVGhlIG9yZGVyIG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2V4cGludCh1bnNpZ25lZCBpbnQgX19uLCBfVHAgX194KQorICAgIHsKKyAgICAgIC8vICBSZXR1cm4gTmFOIG9uIE5hTiBpbnB1dC4KKyAgICAgIGlmIChfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX19uIDw9IDEgJiYgX194ID09IF9UcCgwKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6aW5maW5pdHkoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX0UwID0gc3RkOjpleHAoX194KSAvIF9feDsKKyAgICAgICAgICBpZiAoX19uID09IDApCisgICAgICAgICAgICByZXR1cm4gX19FMDsKKworICAgICAgICAgIF9UcCBfX0UxID0gX19leHBpbnRfRTEoX194KTsKKyAgICAgICAgICBpZiAoX19uID09IDEpCisgICAgICAgICAgICByZXR1cm4gX19FMTsKKworICAgICAgICAgIGlmIChfX3ggPT0gX1RwKDApKQorICAgICAgICAgICAgcmV0dXJuIF9UcCgxKSAvIHN0YXRpY19jYXN0PF9UcD4oX19uIC0gMSk7CisKKyAgICAgICAgICBfVHAgX19FbiA9IF9fZXhwaW50X0VuX3JlY3Vyc2lvbihfX24sIF9feCk7CisKKyAgICAgICAgICByZXR1cm4gX19FbjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBAZiQgRWkoeCkgQGYkLgorICAgICAqIAorICAgICAqICAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsIGlzIGdpdmVuIGJ5CisgICAgICogICBcZlsKKyAgICAgKiAgICAgRWkoeCkgPSAtXGludF97LXh9XlxpbmZ0eSBcZnJhY3tlXnR9e3R9IGR0CisgICAgICogICBcZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX19leHBpbnQoX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9fZXhwaW50X0VpKF9feCk7CisgICAgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBzdGQ6OnRyMTo6X19kZXRhaWwKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9FWFBfSU5URUdSQUxfVENDCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9mZW52LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9mZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmYmVhZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2ZlbnYuaApAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgZmVudi5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvZmVudi5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX1RSMV9GRU5WX0gKKyNkZWZpbmUgX1RSMV9GRU5WX0ggMQorCisjaW5jbHVkZSA8dHIxL2NmZW52PgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2Zsb2F0LmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9mbG9hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OTc2N2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9mbG9hdC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRSMSBmbG9hdC5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvZmxvYXQuaAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9UUjFfRkxPQVRfSAorI2RlZmluZSBfVFIxX0ZMT0FUX0ggMQorCisjaW5jbHVkZSA8dHIxL2NmbG9hdD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9mdW5jdGlvbmFsIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZnVuY3Rpb25hbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzc5ZmJlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZnVuY3Rpb25hbApAQCAtMCwwICsxLDIzMDggQEAKKy8vIFRSMSBmdW5jdGlvbmFsIGhlYWRlciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2Z1bmN0aW9uYWwKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9GVU5DVElPTkFMCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9GVU5DVElPTkFMIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPgorCisjaW5jbHVkZSA8dHlwZWluZm8+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPHRyMS90dXBsZT4KKyNpbmNsdWRlIDx0cjEvdHlwZV90cmFpdHM+CisjaW5jbHVkZSA8Yml0cy9zdHJpbmdmd2QuaD4KKyNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbF9oYXNoLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+IC8vIGZvciBzdGQ6Ol9fYWRkcmVzc29mCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyAgaW5jbHVkZSA8dHlwZV90cmFpdHM+IC8vIGZvciBpbnRlZ3JhbF9jb25zdGFudCwgdHJ1ZV90eXBlLCBmYWxzZV90eXBlCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyAgdGVtcGxhdGU8aW50PiBzdHJ1Y3QgX1BsYWNlaG9sZGVyOworICB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgX0JpbmQ7CisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0JpbmRfcmVzdWx0OworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisjZW5kaWYKKworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtYmVyUG9pbnRlcj4KKyAgICBjbGFzcyBfTWVtX2ZuOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DbGFzcz4KKyAgICBfTWVtX2ZuPF9UcCBfQ2xhc3M6Oio+CisgICAgbWVtX2ZuKF9UcCBfQ2xhc3M6OiopOworCisgIC8qKgorICAgKiAgQWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIF9IYXNfcmVzdWx0X3R5cGUsIHdoaWNoIHVzZXMgU0ZJTkFFIHRvCisgICAqICBkZXRlcm1pbmUgaWYgdGhlIHR5cGUgX1RwIGhhcyBhIHB1YmxpY2x5LWFjY2Vzc2libGUgbWVtYmVyIHR5cGUKKyAgICogIHJlc3VsdF90eXBlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX0hhc19yZXN1bHRfdHlwZV9oZWxwZXIgOiBfX3NmaW5hZV90eXBlcworICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgc3RydWN0IF9XcmFwX3R5cGUKKwl7IH07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgc3RhdGljIF9fb25lIF9fdGVzdChfV3JhcF90eXBlPHR5cGVuYW1lIF9VcDo6cmVzdWx0X3R5cGU+Kik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgc3RhdGljIF9fdHdvIF9fdGVzdCguLi4pOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzaXplb2YoX190ZXN0PF9UcD4oMCkpID09IDE7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9IYXNfcmVzdWx0X3R5cGUKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsCisJICAgICAgX0hhc19yZXN1bHRfdHlwZV9oZWxwZXI8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgLyoqCisgICAqICAKKyAgKi8KKyAgLy8vIElmIHdlIGhhdmUgZm91bmQgYSByZXN1bHRfdHlwZSwgZXh0cmFjdCBpdC4KKyAgdGVtcGxhdGU8Ym9vbCBfSGFzX3Jlc3VsdF90eXBlLCB0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICBzdHJ1Y3QgX01heWJlX2dldF9yZXN1bHRfdHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICBzdHJ1Y3QgX01heWJlX2dldF9yZXN1bHRfdHlwZTx0cnVlLCBfRnVuY3Rvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9GdW5jdG9yOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQmFzZSBjbGFzcyBmb3IgYW55IGZ1bmN0aW9uIG9iamVjdCB0aGF0IGhhcyBhIHdlYWsgcmVzdWx0IHR5cGUsIGFzCisgICAqICBkZWZpbmVkIGluIDMuMy8zIG9mIFRSMS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGwKKyAgICA6IF9NYXliZV9nZXRfcmVzdWx0X3R5cGU8X0hhc19yZXN1bHRfdHlwZTxfRnVuY3Rvcj46OnZhbHVlLCBfRnVuY3Rvcj4KKyAgICB7CisgICAgfTsKKworICAvLy8gUmV0cmlldmUgdGhlIHJlc3VsdCB0eXBlIGZvciBhIGZ1bmN0aW9uIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4gCisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyhfQXJnVHlwZXMuLi4pPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgcmVzdWx0IHR5cGUgZm9yIGEgZnVuY3Rpb24gcmVmZXJlbmNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+IAorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoJikoX0FyZ1R5cGVzLi4uKT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICAvLy8gUmV0cmlldmUgdGhlIHJlc3VsdCB0eXBlIGZvciBhIGZ1bmN0aW9uIHBvaW50ZXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4gCisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcygqKShfQXJnVHlwZXMuLi4pPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIC8vLyBSZXRyaWV2ZSByZXN1bHQgdHlwZSBmb3IgYSBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlci4gCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPiAKKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLik+CisgICAgeworICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgLy8vIFJldHJpZXZlIHJlc3VsdCB0eXBlIGZvciBhIGNvbnN0IG1lbWJlciBmdW5jdGlvbiBwb2ludGVyLiAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+IAorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSBjb25zdD4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICAvLy8gUmV0cmlldmUgcmVzdWx0IHR5cGUgZm9yIGEgdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIuIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4gCisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pIHZvbGF0aWxlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIC8vLyBSZXRyaWV2ZSByZXN1bHQgdHlwZSBmb3IgYSBjb25zdCB2b2xhdGlsZSBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlci4gCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPiAKKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLiljb25zdCB2b2xhdGlsZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICAvKioKKyAgICogIFN0cmlwIHRvcC1sZXZlbCBjdi1xdWFsaWZpZXJzIGZyb20gdGhlIGZ1bmN0aW9uIG9iamVjdCBhbmQgbGV0CisgICAqICBfV2Vha19yZXN1bHRfdHlwZV9pbXBsIHBlcmZvcm0gdGhlIHJlYWwgd29yay4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlCisgICAgOiBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPHR5cGVuYW1lIHJlbW92ZV9jdjxfRnVuY3Rvcj46OnR5cGU+CisgICAgeworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBjbGFzcyByZXN1bHRfb2Y7CisKKyAgLyoqCisgICAqICBBY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgcmVzdWx0X29mLiBXaGVuIF9IYXNfcmVzdWx0X3R5cGUgaXMKKyAgICogIHRydWUsIGdldHMgaXRzIHJlc3VsdCBmcm9tIF9XZWFrX3Jlc3VsdF90eXBlLiBPdGhlcndpc2UsIHVzZXMKKyAgICogIHRoZSBmdW5jdGlvbiBvYmplY3QncyBtZW1iZXIgdGVtcGxhdGUgcmVzdWx0IHRvIGV4dHJhY3QgdGhlCisgICAqICByZXN1bHQgdHlwZS4KKyAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfSGFzX3Jlc3VsdF90eXBlLCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBfUmVzdWx0X29mX2ltcGw7CisKKyAgLy8gSGFuZGxlIG1lbWJlciBkYXRhIHBvaW50ZXJzIHVzaW5nIF9NZW1fZm4ncyBsb2dpYworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9vZl9pbXBsPGZhbHNlLCBfUmVzIF9DbGFzczo6KihfVDEpPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX01lbV9mbjxfUmVzIF9DbGFzczo6Kj4KKyAgICAgICAgICAgICAgICA6OnRlbXBsYXRlIF9SZXN1bHRfdHlwZTxfVDE+Ojp0eXBlIHR5cGU7CisgICAgfTsKKworICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgd2UgY2FuIGRldGVybWluZSBhIHJlc3VsdCB0eXBlIGZyb20gQGMgRnVuY3RvciAKKyAgICogYWxvbmUuCisgICAqLyAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyByZXN1bHRfb2Y8X0Z1bmN0b3IoX0FyZ1R5cGVzLi4uKT4KKyAgICA6IHB1YmxpYyBfUmVzdWx0X29mX2ltcGw8CisgICAgICAgICAgICAgICBfSGFzX3Jlc3VsdF90eXBlPF9XZWFrX3Jlc3VsdF90eXBlPF9GdW5jdG9yPiA+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIF9GdW5jdG9yKF9BcmdUeXBlcy4uLik+CisgICAgeworICAgIH07CisKKyAgLy8vIFdlIGFscmVhZHkga25vdyB0aGUgcmVzdWx0IHR5cGUgZm9yIEBjIEZ1bmN0b3I7IHVzZSBpdC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9vZl9pbXBsPHRydWUsIF9GdW5jdG9yKF9BcmdUeXBlcy4uLik+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfV2Vha19yZXN1bHRfdHlwZTxfRnVuY3Rvcj46OnJlc3VsdF90eXBlIHR5cGU7CisgICAgfTsKKworICAvKioKKyAgICogV2UgbmVlZCB0byBjb21wdXRlIHRoZSByZXN1bHQgdHlwZSBmb3IgdGhpcyBpbnZvY2F0aW9uIHRoZSBoYXJkIAorICAgKiB3YXkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfUmVzdWx0X29mX2ltcGw8ZmFsc2UsIF9GdW5jdG9yKF9BcmdUeXBlcy4uLik+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRnVuY3RvcgorICAgICAgICAgICAgICAgIDo6dGVtcGxhdGUgcmVzdWx0PF9GdW5jdG9yKF9BcmdUeXBlcy4uLik+Ojp0eXBlIHR5cGU7CisgICAgfTsKKworICAvKioKKyAgICogSXQgaXMgdW5zYWZlIHRvIGFjY2VzcyA6OnJlc3VsdCB3aGVuIHRoZXJlIGFyZSB6ZXJvIGFyZ3VtZW50cywgc28gd2UgCisgICAqIHJldHVybiBAYyB2b2lkIGluc3RlYWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9vZl9pbXBsPGZhbHNlLCBfRnVuY3RvcigpPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdm9pZCB0eXBlOworICAgIH07CisKKyAgLy8vIERldGVybWluZXMgaWYgdGhlIHR5cGUgX1RwIGRlcml2ZXMgZnJvbSB1bmFyeV9mdW5jdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfRGVyaXZlc19mcm9tX3VuYXJ5X2Z1bmN0aW9uIDogX19zZmluYWVfdHlwZXMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1Jlcz4KKyAgICAgICAgc3RhdGljIF9fb25lIF9fdGVzdChjb25zdCB2b2xhdGlsZSB1bmFyeV9mdW5jdGlvbjxfVDEsIF9SZXM+Kik7CisKKyAgICAgIC8vIEl0J3MgdGVtcHRpbmcgdG8gY2hhbmdlICIuLi4iIHRvIGNvbnN0IHZvbGF0aWxlIHZvaWQqLCBidXQKKyAgICAgIC8vIHRoYXQgZmFpbHMgd2hlbiBfVHAgaXMgYSBmdW5jdGlvbiB0eXBlLgorICAgICAgc3RhdGljIF9fdHdvIF9fdGVzdCguLi4pOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzaXplb2YoX190ZXN0KChfVHAqKTApKSA9PSAxOworICAgIH07CisKKyAgLy8vIERldGVybWluZXMgaWYgdGhlIHR5cGUgX1RwIGRlcml2ZXMgZnJvbSBiaW5hcnlfZnVuY3Rpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0Rlcml2ZXNfZnJvbV9iaW5hcnlfZnVuY3Rpb24gOiBfX3NmaW5hZV90eXBlcworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDIsIHR5cGVuYW1lIF9SZXM+CisgICAgICAgIHN0YXRpYyBfX29uZSBfX3Rlc3QoY29uc3Qgdm9sYXRpbGUgYmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBfUmVzPiopOworCisgICAgICAvLyBJdCdzIHRlbXB0aW5nIHRvIGNoYW5nZSAiLi4uIiB0byBjb25zdCB2b2xhdGlsZSB2b2lkKiwgYnV0CisgICAgICAvLyB0aGF0IGZhaWxzIHdoZW4gX1RwIGlzIGEgZnVuY3Rpb24gdHlwZS4KKyAgICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc2l6ZW9mKF9fdGVzdCgoX1RwKikwKSkgPT0gMTsKKyAgICB9OworCisgIC8vLyBUdXJucyBhIGZ1bmN0aW9uIHR5cGUgaW50byBhIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgX0lzRnVuY3Rpb25UeXBlID0gaXNfZnVuY3Rpb248X1RwPjo6dmFsdWU+CisgICAgc3RydWN0IF9GdW5jdGlvbl90b19mdW5jdGlvbl9wb2ludGVyCisgICAgeworICAgICAgdHlwZWRlZiBfVHAgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0Z1bmN0aW9uX3RvX2Z1bmN0aW9uX3BvaW50ZXI8X1RwLCB0cnVlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwKiB0eXBlOworICAgIH07CisKKyAgLyoqCisgICAqIEludm9rZSBhIGZ1bmN0aW9uIG9iamVjdCwgd2hpY2ggbWF5IGJlIGVpdGhlciBhIG1lbWJlciBwb2ludGVyIG9yIGEKKyAgICogZnVuY3Rpb24gb2JqZWN0LiBUaGUgZmlyc3QgcGFyYW1ldGVyIHdpbGwgdGVsbCB3aGljaC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPAorICAgICAgICAgICAgICghaXNfbWVtYmVyX3BvaW50ZXI8X0Z1bmN0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiAhaXNfZnVuY3Rpb248X0Z1bmN0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiAhaXNfZnVuY3Rpb248dHlwZW5hbWUgcmVtb3ZlX3BvaW50ZXI8X0Z1bmN0b3I+Ojp0eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjxfRnVuY3RvcihfQXJncy4uLik+Ojp0eXBlCisgICAgICAgICAgID46Ol9fdHlwZQorICAgIF9faW52b2tlKF9GdW5jdG9yJiBfX2YsIF9BcmdzJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgcmV0dXJuIF9fZihfX2FyZ3MuLi4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwKKyAgICAgICAgICAgICAoaXNfbWVtYmVyX3BvaW50ZXI8X0Z1bmN0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiAhaXNfZnVuY3Rpb248X0Z1bmN0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiAhaXNfZnVuY3Rpb248dHlwZW5hbWUgcmVtb3ZlX3BvaW50ZXI8X0Z1bmN0b3I+Ojp0eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjxfRnVuY3RvcihfQXJncy4uLik+Ojp0eXBlCisgICAgICAgICAgID46Ol9fdHlwZQorICAgIF9faW52b2tlKF9GdW5jdG9yJiBfX2YsIF9BcmdzJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgcmV0dXJuIG1lbV9mbihfX2YpKF9fYXJncy4uLik7CisgICAgfQorCisgIC8vIFRvIHBpY2sgdXAgZnVuY3Rpb24gcmVmZXJlbmNlcyAodGhhdCB3aWxsIGJlY29tZSBmdW5jdGlvbiBwb2ludGVycykKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8CisgICAgICAgICAgICAgKGlzX3BvaW50ZXI8X0Z1bmN0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiBpc19mdW5jdGlvbjx0eXBlbmFtZSByZW1vdmVfcG9pbnRlcjxfRnVuY3Rvcj46OnR5cGU+Ojp2YWx1ZSksCisgICAgICAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPF9GdW5jdG9yKF9BcmdzLi4uKT46OnR5cGUKKyAgICAgICAgICAgPjo6X190eXBlCisgICAgX19pbnZva2UoX0Z1bmN0b3IgX19mLCBfQXJncyYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHJldHVybiBfX2YoX19hcmdzLi4uKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBLbm93aW5nIHdoaWNoIG9mIHVuYXJ5X2Z1bmN0aW9uIGFuZCBiaW5hcnlfZnVuY3Rpb24gX1RwIGRlcml2ZXMKKyAgICogIGZyb20sIGRlcml2ZXMgZnJvbSB0aGUgc2FtZSBhbmQgZW5zdXJlcyB0aGF0IHJlZmVyZW5jZV93cmFwcGVyCisgICAqICB3aWxsIGhhdmUgYSB3ZWFrIHJlc3VsdCB0eXBlLiBTZWUgY2FzZXMgYmVsb3cuCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9VbmFyeSwgYm9vbCBfQmluYXJ5LCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlX2ltcGw7CisKKyAgLy8gTm90IGEgdW5hcnlfZnVuY3Rpb24gb3IgYmluYXJ5X2Z1bmN0aW9uLCBzbyB0cnkgYSB3ZWFrIHJlc3VsdCB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlX2ltcGw8ZmFsc2UsIGZhbHNlLCBfVHA+CisgICAgOiBfV2Vha19yZXN1bHRfdHlwZTxfVHA+CisgICAgeyB9OworCisgIC8vIHVuYXJ5X2Z1bmN0aW9uIGJ1dCBub3QgYmluYXJ5X2Z1bmN0aW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2VfaW1wbDx0cnVlLCBmYWxzZSwgX1RwPgorICAgIDogdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX1RwOjphcmd1bWVudF90eXBlLAorCQkgICAgIHR5cGVuYW1lIF9UcDo6cmVzdWx0X3R5cGU+CisgICAgeyB9OworCisgIC8vIGJpbmFyeV9mdW5jdGlvbiBidXQgbm90IHVuYXJ5X2Z1bmN0aW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2VfaW1wbDxmYWxzZSwgdHJ1ZSwgX1RwPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9UcDo6Zmlyc3RfYXJndW1lbnRfdHlwZSwKKwkJICAgICAgdHlwZW5hbWUgX1RwOjpzZWNvbmRfYXJndW1lbnRfdHlwZSwKKwkJICAgICAgdHlwZW5hbWUgX1RwOjpyZXN1bHRfdHlwZT4KKyAgICB7IH07CisKKyAgLy8gQm90aCB1bmFyeV9mdW5jdGlvbiBhbmQgYmluYXJ5X2Z1bmN0aW9uLiBJbXBvcnQgcmVzdWx0X3R5cGUgdG8KKyAgLy8gYXZvaWQgY29uZmxpY3RzLgorICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZV9pbXBsPHRydWUsIHRydWUsIF9UcD4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9UcDo6YXJndW1lbnRfdHlwZSwKKwkJICAgICB0eXBlbmFtZSBfVHA6OnJlc3VsdF90eXBlPiwKKyAgICAgIGJpbmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfVHA6OmZpcnN0X2FyZ3VtZW50X3R5cGUsCisJCSAgICAgIHR5cGVuYW1lIF9UcDo6c2Vjb25kX2FyZ3VtZW50X3R5cGUsCisJCSAgICAgIHR5cGVuYW1lIF9UcDo6cmVzdWx0X3R5cGU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHA6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgLyoqCisgICAqICBEZXJpdmVzIGZyb20gdW5hcnlfZnVuY3Rpb24gb3IgYmluYXJ5X2Z1bmN0aW9uIHdoZW4gaXQKKyAgICogIGNhbi4gU3BlY2lhbGl6YXRpb25zIGhhbmRsZSBhbGwgb2YgdGhlIGVhc3kgY2FzZXMuIFRoZSBwcmltYXJ5CisgICAqICB0ZW1wbGF0ZSBkZXRlcm1pbmVzIHdoYXQgdG8gZG8gd2l0aCBhIGNsYXNzIHR5cGUsIHdoaWNoIG1heQorICAgKiAgZGVyaXZlIGZyb20gYm90aCB1bmFyeV9mdW5jdGlvbiBhbmQgYmluYXJ5X2Z1bmN0aW9uLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlCisgICAgOiBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZV9pbXBsPAorICAgICAgX0Rlcml2ZXNfZnJvbV91bmFyeV9mdW5jdGlvbjxfVHA+Ojp2YWx1ZSwKKyAgICAgIF9EZXJpdmVzX2Zyb21fYmluYXJ5X2Z1bmN0aW9uPF9UcD46OnZhbHVlLAorICAgICAgX1RwPgorICAgIHsgfTsKKworICAvLyAtIGEgZnVuY3Rpb24gdHlwZSAodW5hcnkpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEpPgorICAgIDogdW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgZnVuY3Rpb24gdHlwZSAoYmluYXJ5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEsIF9UMik+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgKHVuYXJ5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMoKikoX1QxKT4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPF9UMSwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSAoYmluYXJ5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcygqKShfVDEsIF9UMik+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlICh1bmFyeSwgbm8gcXVhbGlmaWVycykKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKCk+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxfVDEqLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAoYmluYXJ5LCBubyBxdWFsaWZpZXJzKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKShfVDIpPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPF9UMSosIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKHVuYXJ5LCBjb25zdCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKCkgY29uc3Q+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxjb25zdCBfVDEqLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAoYmluYXJ5LCBjb25zdCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoX1QyKSBjb25zdD4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjxjb25zdCBfVDEqLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlICh1bmFyeSwgdm9sYXRpbGUpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKSgpIHZvbGF0aWxlPgorICAgIDogdW5hcnlfZnVuY3Rpb248dm9sYXRpbGUgX1QxKiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKGJpbmFyeSwgdm9sYXRpbGUpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKF9UMikgdm9sYXRpbGU+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248dm9sYXRpbGUgX1QxKiwgX1QyLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAodW5hcnksIGNvbnN0IHZvbGF0aWxlKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoKSBjb25zdCB2b2xhdGlsZT4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IHZvbGF0aWxlIF9UMSosIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlIChiaW5hcnksIGNvbnN0IHZvbGF0aWxlKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKShfVDIpIGNvbnN0IHZvbGF0aWxlPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IHZvbGF0aWxlIF9UMSosIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8vIHJlZmVyZW5jZV93cmFwcGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyByZWZlcmVuY2Vfd3JhcHBlcgorICAgIDogcHVibGljIF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPgorICAgIHsKKyAgICAgIC8vIElmIF9UcCBpcyBhIGZ1bmN0aW9uIHR5cGUsIHdlIGNhbid0IGZvcm0gcmVzdWx0X29mPF9UcCguLi4pPiwKKyAgICAgIC8vIHNvIHR1cm4gaXQgaW50byBhIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Z1bmN0aW9uX3RvX2Z1bmN0aW9uX3BvaW50ZXI8X1RwPjo6dHlwZQorICAgICAgICBfTV9mdW5jX3R5cGU7CisKKyAgICAgIF9UcCogX01fZGF0YTsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCB0eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgcmVmZXJlbmNlX3dyYXBwZXIoX1RwJiBfX2luZGF0YSkKKyAgICAgIDogX01fZGF0YShzdGQ6Ol9fYWRkcmVzc29mKF9faW5kYXRhKSkKKyAgICAgIHsgfQorCisgICAgICByZWZlcmVuY2Vfd3JhcHBlcihjb25zdCByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+JiBfX2lucmVmKToKKyAgICAgIF9NX2RhdGEoX19pbnJlZi5fTV9kYXRhKQorICAgICAgeyB9CisKKyAgICAgIHJlZmVyZW5jZV93cmFwcGVyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHJlZmVyZW5jZV93cmFwcGVyPF9UcD4mIF9faW5yZWYpCisgICAgICB7CisgICAgICAgIF9NX2RhdGEgPSBfX2lucmVmLl9NX2RhdGE7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgb3BlcmF0b3IgX1RwJigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5nZXQoKTsgfQorCisgICAgICBfVHAmCisgICAgICBnZXQoKSBjb25zdAorICAgICAgeyByZXR1cm4gKl9NX2RhdGE7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjxfTV9mdW5jX3R5cGUoX0FyZ3MuLi4pPjo6dHlwZQorICAgICAgICBvcGVyYXRvcigpKF9BcmdzJi4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsKKwkgIHJldHVybiBfX2ludm9rZShnZXQoKSwgX19hcmdzLi4uKTsKKwl9CisgICAgfTsKKworCisgIC8vIERlbm90ZXMgYSByZWZlcmVuY2Ugc2hvdWxkIGJlIHRha2VuIHRvIGEgdmFyaWFibGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcmVmZXJlbmNlX3dyYXBwZXI8X1RwPgorICAgIHJlZihfVHAmIF9fdCkKKyAgICB7IHJldHVybiByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+KF9fdCk7IH0KKworICAvLyBEZW5vdGVzIGEgY29uc3QgcmVmZXJlbmNlIHNob3VsZCBiZSB0YWtlbiB0byBhIHZhcmlhYmxlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IF9UcD4KKyAgICBjcmVmKGNvbnN0IF9UcCYgX190KQorICAgIHsgcmV0dXJuIHJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IF9UcD4oX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcmVmZXJlbmNlX3dyYXBwZXI8X1RwPgorICAgIHJlZihyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+IF9fdCkKKyAgICB7IHJldHVybiByZWYoX190LmdldCgpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgX1RwPgorICAgIGNyZWYocmVmZXJlbmNlX3dyYXBwZXI8X1RwPiBfX3QpCisgICAgeyByZXR1cm4gY3JlZihfX3QuZ2V0KCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sPgorICAgIHN0cnVjdCBfTWVtX2ZuX2NvbnN0X29yX25vbgorICAgIHsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfTWVtX2ZuX2NvbnN0X29yX25vbjxfVHAsIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwJiB0eXBlOworICAgIH07CisKKyAgLyoqCisgICAqIERlcml2ZXMgZnJvbSBAYyB1bmFyeV9mdW5jdGlvbiBvciBAYyBiaW5hcnlfZnVuY3Rpb24sIG9yIHBlcmhhcHMKKyAgICogbm90aGluZywgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHByb3ZpZGVkLiBUaGUKKyAgICogcHJpbWFyeSB0ZW1wbGF0ZSBpcyB0aGUgYmFzaXMgY2FzZSwgd2hpY2ggZGVyaXZlcyBub3RoaW5nLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPiAKKyAgICBzdHJ1Y3QgX01heWJlX3VuYXJ5X29yX2JpbmFyeV9mdW5jdGlvbiB7IH07CisKKyAgLy8vIERlcml2ZXMgZnJvbSBAYyB1bmFyeV9mdW5jdGlvbiwgYXMgYXBwcm9wcmlhdGUuIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+IAorICAgIHN0cnVjdCBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIF9UMT4KKyAgICA6IHN0ZDo6dW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPiB7IH07CisKKyAgLy8vIERlcml2ZXMgZnJvbSBAYyBiaW5hcnlfZnVuY3Rpb24sIGFzIGFwcHJvcHJpYXRlLiAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+IAorICAgIHN0cnVjdCBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIF9UMSwgX1QyPgorICAgIDogc3RkOjpiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+IHsgfTsKKworICAvLy8gSW1wbGVtZW50YXRpb24gb2YgQGMgbWVtX2ZuIGZvciBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9NZW1fZm48X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pPgorICAgIDogcHVibGljIF9NYXliZV91bmFyeV9vcl9iaW5hcnlfZnVuY3Rpb248X1JlcywgX0NsYXNzKiwgX0FyZ1R5cGVzLi4uPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyAoX0NsYXNzOjoqX0Z1bmN0b3IpKF9BcmdUeXBlcy4uLik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcworICAgICAgICBfTV9jYWxsKF9UcCYgX19vYmplY3QsIGNvbnN0IHZvbGF0aWxlIF9DbGFzcyAqLCAKKyAgICAgICAgICAgICAgICBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgICB7IHJldHVybiAoX19vYmplY3QuKl9fcG1mKShfX2FyZ3MuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcworICAgICAgICBfTV9jYWxsKF9UcCYgX19wdHIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gKCgqX19wdHIpLipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworCisgICAgICBleHBsaWNpdCBfTWVtX2ZuKF9GdW5jdG9yIF9fcG1mKSA6IF9fcG1mKF9fcG1mKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIF9SZXMKKyAgICAgIG9wZXJhdG9yKCkoX0NsYXNzJiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgICAgLy8gSGFuZGxlIHBvaW50ZXJzCisgICAgICBfUmVzCisgICAgICBvcGVyYXRvcigpKF9DbGFzcyogX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19vYmplY3QtPipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgc21hcnQgcG9pbnRlcnMsIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzIHRvIGRlcml2ZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcworCW9wZXJhdG9yKCkoX1RwJiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gX01fY2FsbChfX29iamVjdCwgJl9fb2JqZWN0LCBfX2FyZ3MuLi4pOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX0Z1bmN0b3IgX19wbWY7CisgICAgfTsKKworICAvLy8gSW1wbGVtZW50YXRpb24gb2YgQGMgbWVtX2ZuIGZvciBjb25zdCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9NZW1fZm48X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pIGNvbnN0PgorICAgIDogcHVibGljIF9NYXliZV91bmFyeV9vcl9iaW5hcnlfZnVuY3Rpb248X1JlcywgY29uc3QgX0NsYXNzKiwgCisJCQkJCSAgICAgX0FyZ1R5cGVzLi4uPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyAoX0NsYXNzOjoqX0Z1bmN0b3IpKF9BcmdUeXBlcy4uLikgY29uc3Q7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcworICAgICAgICBfTV9jYWxsKF9UcCYgX19vYmplY3QsIGNvbnN0IHZvbGF0aWxlIF9DbGFzcyAqLCAKKyAgICAgICAgICAgICAgICBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgICB7IHJldHVybiAoX19vYmplY3QuKl9fcG1mKShfX2FyZ3MuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcworICAgICAgICBfTV9jYWxsKF9UcCYgX19wdHIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gKCgqX19wdHIpLipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworCisgICAgICBleHBsaWNpdCBfTWVtX2ZuKF9GdW5jdG9yIF9fcG1mKSA6IF9fcG1mKF9fcG1mKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIF9SZXMKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0NsYXNzJiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgICAgLy8gSGFuZGxlIHBvaW50ZXJzCisgICAgICBfUmVzCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9DbGFzcyogX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19vYmplY3QtPipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgc21hcnQgcG9pbnRlcnMsIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzIHRvIGRlcml2ZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcyBvcGVyYXRvcigpKF9UcCYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9NX2NhbGwoX19vYmplY3QsICZfX29iamVjdCwgX19hcmdzLi4uKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9GdW5jdG9yIF9fcG1mOworICAgIH07CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIEBjIG1lbV9mbiBmb3Igdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfTWVtX2ZuPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSB2b2xhdGlsZT4KKyAgICA6IHB1YmxpYyBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIHZvbGF0aWxlIF9DbGFzcyosIAorCQkJCQkgICAgIF9BcmdUeXBlcy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgKF9DbGFzczo6Kl9GdW5jdG9yKShfQXJnVHlwZXMuLi4pIHZvbGF0aWxlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKyAgICAgICAgX01fY2FsbChfVHAmIF9fb2JqZWN0LCBjb25zdCB2b2xhdGlsZSBfQ2xhc3MgKiwgCisgICAgICAgICAgICAgICAgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKyAgICAgICAgX01fY2FsbChfVHAmIF9fcHRyLCBjb25zdCB2b2xhdGlsZSB2b2lkICosIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuICgoKl9fcHRyKS4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKworICAgICAgZXhwbGljaXQgX01lbV9mbihfRnVuY3RvciBfX3BtZikgOiBfX3BtZihfX3BtZikgeyB9CisKKyAgICAgIC8vIEhhbmRsZSBvYmplY3RzCisgICAgICBfUmVzCisgICAgICBvcGVyYXRvcigpKHZvbGF0aWxlIF9DbGFzcyYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19vYmplY3QuKl9fcG1mKShfX2FyZ3MuLi4pOyB9CisKKyAgICAgIC8vIEhhbmRsZSBwb2ludGVycworICAgICAgX1JlcworICAgICAgb3BlcmF0b3IoKSh2b2xhdGlsZSBfQ2xhc3MqIF9fb2JqZWN0LCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LT4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgICAgLy8gSGFuZGxlIHNtYXJ0IHBvaW50ZXJzLCByZWZlcmVuY2VzIGFuZCBwb2ludGVycyB0byBkZXJpdmVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKwlvcGVyYXRvcigpKF9UcCYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9NX2NhbGwoX19vYmplY3QsICZfX29iamVjdCwgX19hcmdzLi4uKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9GdW5jdG9yIF9fcG1mOworICAgIH07CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIEBjIG1lbV9mbiBmb3IgY29uc3Qgdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfTWVtX2ZuPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSBjb25zdCB2b2xhdGlsZT4KKyAgICA6IHB1YmxpYyBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIGNvbnN0IHZvbGF0aWxlIF9DbGFzcyosIAorCQkJCQkgICAgIF9BcmdUeXBlcy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgKF9DbGFzczo6Kl9GdW5jdG9yKShfQXJnVHlwZXMuLi4pIGNvbnN0IHZvbGF0aWxlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKyAgICAgICAgX01fY2FsbChfVHAmIF9fb2JqZWN0LCBjb25zdCB2b2xhdGlsZSBfQ2xhc3MgKiwgCisgICAgICAgICAgICAgICAgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKyAgICAgICAgX01fY2FsbChfVHAmIF9fcHRyLCBjb25zdCB2b2xhdGlsZSB2b2lkICosIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuICgoKl9fcHRyKS4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKworICAgICAgZXhwbGljaXQgX01lbV9mbihfRnVuY3RvciBfX3BtZikgOiBfX3BtZihfX3BtZikgeyB9CisKKyAgICAgIC8vIEhhbmRsZSBvYmplY3RzCisgICAgICBfUmVzIAorICAgICAgb3BlcmF0b3IoKShjb25zdCB2b2xhdGlsZSBfQ2xhc3MmIF9fb2JqZWN0LCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgcG9pbnRlcnMKKyAgICAgIF9SZXMgCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHZvbGF0aWxlIF9DbGFzcyogX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19vYmplY3QtPipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgc21hcnQgcG9pbnRlcnMsIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzIHRvIGRlcml2ZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcyBvcGVyYXRvcigpKF9UcCYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9NX2NhbGwoX19vYmplY3QsICZfX29iamVjdCwgX19hcmdzLi4uKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9GdW5jdG9yIF9fcG1mOworICAgIH07CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3M+CisgICAgY2xhc3MgX01lbV9mbjxfUmVzIF9DbGFzczo6Kj4KKyAgICB7CisgICAgICAvLyBUaGlzIGJpdCBvZiBnZW5pdXMgaXMgZHVlIHRvIFBldGVyIERpbW92LCBpbXByb3ZlZCBzbGlnaHRseSBieQorICAgICAgLy8gRG91Z2xhcyBHcmVnb3IuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMmCisgICAgICAgIF9NX2NhbGwoX1RwJiBfX29iamVjdCwgX0NsYXNzICopIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9fb2JqZWN0LipfX3BtOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgICAgICBfUmVzJgorICAgICAgICBfTV9jYWxsKF9UcCYgX19vYmplY3QsIF9VcCAqIGNvbnN0ICopIGNvbnN0CisgICAgICAgIHsgcmV0dXJuICgqX19vYmplY3QpLipfX3BtOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgICAgICBjb25zdCBfUmVzJgorICAgICAgICBfTV9jYWxsKF9UcCYgX19vYmplY3QsIGNvbnN0IF9VcCAqIGNvbnN0ICopIGNvbnN0CisgICAgICAgIHsgcmV0dXJuICgqX19vYmplY3QpLipfX3BtOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29uc3QgX1JlcyYKKyAgICAgICAgX01fY2FsbChfVHAmIF9fb2JqZWN0LCBjb25zdCBfQ2xhc3MgKikgY29uc3QKKyAgICAgICAgeyByZXR1cm4gX19vYmplY3QuKl9fcG07IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb25zdCBfUmVzJgorICAgICAgICBfTV9jYWxsKF9UcCYgX19wdHIsIGNvbnN0IHZvbGF0aWxlIHZvaWQqKSBjb25zdAorICAgICAgICB7IHJldHVybiAoKl9fcHRyKS4qX19wbTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0YXRpYyBfVHAmIF9fZ2V0X3JlZigpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyBfX3NmaW5hZV90eXBlczo6X19vbmUgX19jaGVja19jb25zdChfVHAmLCBfQ2xhc3MqKTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgICAgICBzdGF0aWMgX19zZmluYWVfdHlwZXM6Ol9fb25lIF9fY2hlY2tfY29uc3QoX1RwJiwgX1VwICogY29uc3QgKik7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICAgICAgc3RhdGljIF9fc2ZpbmFlX3R5cGVzOjpfX3R3byBfX2NoZWNrX2NvbnN0KF9UcCYsIGNvbnN0IF9VcCAqIGNvbnN0ICopOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgX19zZmluYWVfdHlwZXM6Ol9fdHdvIF9fY2hlY2tfY29uc3QoX1RwJiwgY29uc3QgX0NsYXNzKik7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyBfX3NmaW5hZV90eXBlczo6X190d28gX19jaGVja19jb25zdChfVHAmLCBjb25zdCB2b2xhdGlsZSB2b2lkKik7CisKKyAgICBwdWJsaWM6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0cnVjdCBfUmVzdWx0X3R5cGUKKwk6IF9NZW1fZm5fY29uc3Rfb3Jfbm9uPF9SZXMsCisJICAoc2l6ZW9mKF9fc2ZpbmFlX3R5cGVzOjpfX3R3bykKKwkgICA9PSBzaXplb2YoX19jaGVja19jb25zdDxfVHA+KF9fZ2V0X3JlZjxfVHA+KCksIChfVHAqKTApKSk+CisgICAgICAgIHsgfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICAgICAgc3RydWN0IHJlc3VsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWTWVtLCB0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0cnVjdCByZXN1bHQ8X0NWTWVtKF9UcCk+CisJOiBwdWJsaWMgX1Jlc3VsdF90eXBlPF9UcD4geyB9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZNZW0sIHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RydWN0IHJlc3VsdDxfQ1ZNZW0oX1RwJik+CisJOiBwdWJsaWMgX1Jlc3VsdF90eXBlPF9UcD4geyB9OworCisgICAgICBleHBsaWNpdAorICAgICAgX01lbV9mbihfUmVzIF9DbGFzczo6Kl9fcG0pIDogX19wbShfX3BtKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIF9SZXMmCisgICAgICBvcGVyYXRvcigpKF9DbGFzcyYgX19vYmplY3QpIGNvbnN0CisgICAgICB7IHJldHVybiBfX29iamVjdC4qX19wbTsgfQorCisgICAgICBjb25zdCBfUmVzJgorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQ2xhc3MmIF9fb2JqZWN0KSBjb25zdAorICAgICAgeyByZXR1cm4gX19vYmplY3QuKl9fcG07IH0KKworICAgICAgLy8gSGFuZGxlIHBvaW50ZXJzCisgICAgICBfUmVzJgorICAgICAgb3BlcmF0b3IoKShfQ2xhc3MqIF9fb2JqZWN0KSBjb25zdAorICAgICAgeyByZXR1cm4gX19vYmplY3QtPipfX3BtOyB9CisKKyAgICAgIGNvbnN0IF9SZXMmCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9DbGFzcyogX19vYmplY3QpIGNvbnN0CisgICAgICB7IHJldHVybiBfX29iamVjdC0+Kl9fcG07IH0KKworICAgICAgLy8gSGFuZGxlIHNtYXJ0IHBvaW50ZXJzIGFuZCBkZXJpdmVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHR5cGVuYW1lIF9SZXN1bHRfdHlwZTxfVHA+Ojp0eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1RwJiBfX3Vua25vd24pIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9NX2NhbGwoX191bmtub3duLCAmX191bmtub3duKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9SZXMgX0NsYXNzOjoqX19wbTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIFJldHVybnMgYSBmdW5jdGlvbiBvYmplY3QgdGhhdCBmb3J3YXJkcyB0byB0aGUgbWVtYmVyCisgICAqICBwb2ludGVyIEBhIHBtLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ2xhc3M+CisgICAgaW5saW5lIF9NZW1fZm48X1RwIF9DbGFzczo6Kj4KKyAgICBtZW1fZm4oX1RwIF9DbGFzczo6KiBfX3BtKQorICAgIHsKKyAgICAgIHJldHVybiBfTWVtX2ZuPF9UcCBfQ2xhc3M6Oio+KF9fcG0pOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0eXBlIF9UcCBpcyBhIGZ1bmN0aW9uIG9iamVjdAorICAgKiAgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdWJleHByZXNzaW9uIHdoZW4gZXZhbHVhdGluZyBjYWxscyB0bworICAgKiAgZnVuY3Rpb24gb2JqZWN0cyByZXR1cm5lZCBieSBiaW5kKCkuIFtUUjEgMy42LjFdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3QgYm9vbCBpc19iaW5kX2V4cHJlc3Npb248X1RwPjo6dmFsdWU7CisKKyAgLyoqCisgICAqICBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdHlwZSBfVHAgaXMgYSBwbGFjZWhvbGRlciBpbiBhCisgICAqICBiaW5kKCkgZXhwcmVzc2lvbiBhbmQsIGlmIHNvLCB3aGljaCBwbGFjZWhvbGRlciBpdCBpcy4gW1RSMSAzLjYuMl0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfcGxhY2Vob2xkZXIKKyAgICB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAwOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdCBpbnQgaXNfcGxhY2Vob2xkZXI8X1RwPjo6dmFsdWU7CisKKyAgLy8vIFRoZSB0eXBlIG9mIHBsYWNlaG9sZGVyIG9iamVjdHMgZGVmaW5lZCBieSBsaWJzdGRjKysuCisgIHRlbXBsYXRlPGludCBfTnVtPiBzdHJ1Y3QgX1BsYWNlaG9sZGVyIHsgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqIEBuYW1lc3BhY2Ugc3RkOjp0cjE6OnBsYWNlaG9sZGVycworICAgKiAgQGJyaWVmIFN1Yi1uYW1lc3BhY2UgZm9yIHRyMS9mdW5jdGlvbmFsLgorICAgKi8KKyAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycyAKKyAgeyAKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyAgICAvKiAgRGVmaW5lIGEgbGFyZ2UgbnVtYmVyIG9mIHBsYWNlaG9sZGVycy4gVGhlcmUgaXMgbm8gd2F5IHRvCisgICAgICogIHNpbXBsaWZ5IHRoaXMgd2l0aCB2YXJpYWRpYyB0ZW1wbGF0ZXMsIGJlY2F1c2Ugd2UncmUgaW50cm9kdWNpbmcKKyAgICAgKiAgdW5pcXVlIG5hbWVzIGZvciBlYWNoLgorICAgICAqLworICAgIG5hbWVzcGFjZSAKKyAgICB7CisgICAgICBfUGxhY2Vob2xkZXI8MT4gXzE7CisgICAgICBfUGxhY2Vob2xkZXI8Mj4gXzI7CisgICAgICBfUGxhY2Vob2xkZXI8Mz4gXzM7CisgICAgICBfUGxhY2Vob2xkZXI8ND4gXzQ7CisgICAgICBfUGxhY2Vob2xkZXI8NT4gXzU7CisgICAgICBfUGxhY2Vob2xkZXI8Nj4gXzY7CisgICAgICBfUGxhY2Vob2xkZXI8Nz4gXzc7CisgICAgICBfUGxhY2Vob2xkZXI8OD4gXzg7CisgICAgICBfUGxhY2Vob2xkZXI8OT4gXzk7CisgICAgICBfUGxhY2Vob2xkZXI8MTA+IF8xMDsKKyAgICAgIF9QbGFjZWhvbGRlcjwxMT4gXzExOworICAgICAgX1BsYWNlaG9sZGVyPDEyPiBfMTI7CisgICAgICBfUGxhY2Vob2xkZXI8MTM+IF8xMzsKKyAgICAgIF9QbGFjZWhvbGRlcjwxND4gXzE0OworICAgICAgX1BsYWNlaG9sZGVyPDE1PiBfMTU7CisgICAgICBfUGxhY2Vob2xkZXI8MTY+IF8xNjsKKyAgICAgIF9QbGFjZWhvbGRlcjwxNz4gXzE3OworICAgICAgX1BsYWNlaG9sZGVyPDE4PiBfMTg7CisgICAgICBfUGxhY2Vob2xkZXI8MTk+IF8xOTsKKyAgICAgIF9QbGFjZWhvbGRlcjwyMD4gXzIwOworICAgICAgX1BsYWNlaG9sZGVyPDIxPiBfMjE7CisgICAgICBfUGxhY2Vob2xkZXI8MjI+IF8yMjsKKyAgICAgIF9QbGFjZWhvbGRlcjwyMz4gXzIzOworICAgICAgX1BsYWNlaG9sZGVyPDI0PiBfMjQ7CisgICAgICBfUGxhY2Vob2xkZXI8MjU+IF8yNTsKKyAgICAgIF9QbGFjZWhvbGRlcjwyNj4gXzI2OworICAgICAgX1BsYWNlaG9sZGVyPDI3PiBfMjc7CisgICAgICBfUGxhY2Vob2xkZXI8Mjg+IF8yODsKKyAgICAgIF9QbGFjZWhvbGRlcjwyOT4gXzI5OworICAgIH0gCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9CisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisgIC8qKgorICAgKiAgUGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiBpc19wbGFjZWhvbGRlciB0aGF0IHByb3ZpZGVzIHRoZSBwbGFjZWhvbGRlcgorICAgKiAgbnVtYmVyIGZvciB0aGUgcGxhY2Vob2xkZXIgb2JqZWN0cyBkZWZpbmVkIGJ5IGxpYnN0ZGMrKy4KKyAgICovCisgIHRlbXBsYXRlPGludCBfTnVtPgorICAgIHN0cnVjdCBpc19wbGFjZWhvbGRlcjxfUGxhY2Vob2xkZXI8X051bT4gPgorICAgIHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IF9OdW07IH07CisKKyAgdGVtcGxhdGU8aW50IF9OdW0+CisgICAgY29uc3QgaW50IGlzX3BsYWNlaG9sZGVyPF9QbGFjZWhvbGRlcjxfTnVtPiA+Ojp2YWx1ZTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8aW50IF9OdW0+CisgICAgc3RydWN0IGlzX3BsYWNlaG9sZGVyPHN0ZDo6X1BsYWNlaG9sZGVyPF9OdW0+PgorICAgIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsIF9OdW0+CisgICAgeyB9OworCisgIHRlbXBsYXRlPGludCBfTnVtPgorICAgIHN0cnVjdCBpc19wbGFjZWhvbGRlcjxjb25zdCBzdGQ6Ol9QbGFjZWhvbGRlcjxfTnVtPj4KKyAgICA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCBfTnVtPgorICAgIHsgfTsKKyNlbmRpZgorCisgIC8qKgorICAgKiBTdG9yZXMgYSB0dXBsZSBvZiBpbmRpY2VzLiBVc2VkIGJ5IGJpbmQoKSB0byBleHRyYWN0IHRoZSBlbGVtZW50cworICAgKiBpbiBhIHR1cGxlLiAKKyAgICovCisgIHRlbXBsYXRlPGludC4uLiBfSW5kZXhlcz4KKyAgICBzdHJ1Y3QgX0luZGV4X3R1cGxlIHsgfTsKKworICAvLy8gQnVpbGRzIGFuIF9JbmRleF90dXBsZTwwLCAxLCAyLCAuLi4sIF9OdW0tMT4uCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9OdW0sIHR5cGVuYW1lIF9UdXBsZSA9IF9JbmRleF90dXBsZTw+ID4KKyAgICBzdHJ1Y3QgX0J1aWxkX2luZGV4X3R1cGxlOworIAorICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfTnVtLCBpbnQuLi4gX0luZGV4ZXM+IAorICAgIHN0cnVjdCBfQnVpbGRfaW5kZXhfdHVwbGU8X051bSwgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiA+CisgICAgOiBfQnVpbGRfaW5kZXhfdHVwbGU8X051bSAtIDEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLiwgc2l6ZW9mLi4uKF9JbmRleGVzKT4gPgorICAgIHsKKyAgICB9OworCisgIHRlbXBsYXRlPGludC4uLiBfSW5kZXhlcz4KKyAgICBzdHJ1Y3QgX0J1aWxkX2luZGV4X3R1cGxlPDAsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiBfX3R5cGU7CisgICAgfTsKKworICAvKiogCisgICAqIFVzZWQgYnkgX1NhZmVfdHVwbGVfZWxlbWVudCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIHR1cGxlCisgICAqIGVsZW1lbnQgYXQgdGhpcyBwb3NpdGlvbi4KKyAgICovCisgIHN0cnVjdCBfTm9fdHVwbGVfZWxlbWVudDsKKworICAvKioKKyAgICogSW1wbGVtZW50YXRpb24gaGVscGVyIGZvciBfU2FmZV90dXBsZV9lbGVtZW50LiBUaGlzIHByaW1hcnkKKyAgICogdGVtcGxhdGUgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBpdCBpcyBzYWZlIHRvIHVzZSBAYworICAgKiB0dXBsZV9lbGVtZW50LgorICAgKi8KKyAgdGVtcGxhdGU8aW50IF9faSwgdHlwZW5hbWUgX1R1cGxlLCBib29sIF9Jc1NhZmU+CisgICAgc3RydWN0IF9TYWZlX3R1cGxlX2VsZW1lbnRfaW1wbAorICAgIDogdHVwbGVfZWxlbWVudDxfX2ksIF9UdXBsZT4geyB9OworCisgIC8qKgorICAgKiBJbXBsZW1lbnRhdGlvbiBoZWxwZXIgZm9yIF9TYWZlX3R1cGxlX2VsZW1lbnQuIFRoaXMgcGFydGlhbAorICAgKiBzcGVjaWFsaXphdGlvbiBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGl0IGlzIG5vdCBzYWZlIHRvIHVzZSBAYworICAgKiB0dXBsZV9lbGVtZW50LiBXZSBqdXN0IHJldHVybiBAYyBfTm9fdHVwbGVfZWxlbWVudC4KKyAgICovCisgIHRlbXBsYXRlPGludCBfX2ksIHR5cGVuYW1lIF9UdXBsZT4KKyAgICBzdHJ1Y3QgX1NhZmVfdHVwbGVfZWxlbWVudF9pbXBsPF9faSwgX1R1cGxlLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9Ob190dXBsZV9lbGVtZW50IHR5cGU7CisgICAgfTsKKworICAvKioKKyAgICogTGlrZSB0dXBsZV9lbGVtZW50LCBidXQgcmV0dXJucyBAYyBfTm9fdHVwbGVfZWxlbWVudCB3aGVuCisgICAqIHR1cGxlX2VsZW1lbnQgd291bGQgcmV0dXJuIGFuIGVycm9yLgorICAgKi8KKyB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZSBfVHVwbGU+CisgICBzdHJ1Y3QgX1NhZmVfdHVwbGVfZWxlbWVudAorICAgOiBfU2FmZV90dXBsZV9lbGVtZW50X2ltcGw8X19pLCBfVHVwbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9faSA+PSAwICYmIF9faSA8IHR1cGxlX3NpemU8X1R1cGxlPjo6dmFsdWUpPgorICAgeworICAgfTsKKworICAvKioKKyAgICogIE1hcHMgYW4gYXJndW1lbnQgdG8gYmluZCgpIGludG8gYW4gYWN0dWFsIGFyZ3VtZW50IHRvIHRoZSBib3VuZAorICAgKiAgZnVuY3Rpb24gb2JqZWN0IFtUUjEgMy42LjMvNV0uIE9ubHkgdGhlIGZpcnN0IHBhcmFtZXRlciBzaG91bGQKKyAgICogIGJlIHNwZWNpZmllZDogdGhlIHJlc3QgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGFtb25nIHRoZSB2YXJpb3VzCisgICAqICBpbXBsZW1lbnRhdGlvbnMuIE5vdGUgdGhhdCwgYWx0aG91Z2ggdGhpcyBjbGFzcyBpcyBhIGZ1bmN0aW9uCisgICAqICBvYmplY3QsIGl0IGlzbid0IGVudGlyZWx5IG5vcm1hbCBiZWNhdXNlIGl0IHRha2VzIG9ubHkgdHdvCisgICAqICBwYXJhbWV0ZXJzIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUKKyAgICogIGJpbmQgZXhwcmVzc2lvbi4gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgYm91bmQgYXJndW1lbnQgYW5kCisgICAqICB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgcmVmZXJlbmNlcyB0byB0aGUKKyAgICogIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BcmcsCisgICAgICAgICAgIGJvb2wgX0lzQmluZEV4cCA9IGlzX2JpbmRfZXhwcmVzc2lvbjxfQXJnPjo6dmFsdWUsCisgICAgICAgICAgIGJvb2wgX0lzUGxhY2Vob2xkZXIgPSAoaXNfcGxhY2Vob2xkZXI8X0FyZz46OnZhbHVlID4gMCk+CisgICAgY2xhc3MgX011OworCisgIC8qKgorICAgKiAgSWYgdGhlIGFyZ3VtZW50IGlzIHJlZmVyZW5jZV93cmFwcGVyPF9UcD4sIHJldHVybnMgdGhlCisgICAqICB1bmRlcmx5aW5nIHJlZmVyZW5jZS4gW1RSMSAzLjYuMy81IGJ1bGxldCAxXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9NdTxyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+LCBmYWxzZSwgZmFsc2U+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwJiByZXN1bHRfdHlwZTsKKworICAgICAgLyogTm90ZTogVGhpcyB3b24ndCBhY3R1YWxseSB3b3JrIGZvciBjb25zdCB2b2xhdGlsZQorICAgICAgICogcmVmZXJlbmNlX3dyYXBwZXJzLCBiZWNhdXNlIHJlZmVyZW5jZV93cmFwcGVyOjpnZXQoKSBpcyBjb25zdAorICAgICAgICogYnV0IG5vdCB2b2xhdGlsZS1xdWFsaWZpZWQuIFRoaXMgbWlnaHQgYmUgYSBkZWZlY3QgaW4gdGhlIFRSLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZSZWYsIHR5cGVuYW1lIF9UdXBsZT4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQ1ZSZWYmIF9fYXJnLCBjb25zdCBfVHVwbGUmKSBjb25zdCB2b2xhdGlsZQorICAgICAgICB7IHJldHVybiBfX2FyZy5nZXQoKTsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBJZiB0aGUgYXJndW1lbnQgaXMgYSBiaW5kIGV4cHJlc3Npb24sIHdlIGludm9rZSB0aGUgdW5kZXJseWluZworICAgKiAgZnVuY3Rpb24gb2JqZWN0IHdpdGggdGhlIHNhbWUgY3YtcXVhbGlmaWVycyBhcyB3ZSBhcmUgZ2l2ZW4gYW5kCisgICAqICBwYXNzIGFsb25nIGFsbCBvZiBvdXIgYXJndW1lbnRzICh1bndyYXBwZWQpLiBbVFIxIDMuNi4zLzUgYnVsbGV0IDJdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorICAgIGNsYXNzIF9NdTxfQXJnLCB0cnVlLCBmYWxzZT4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4gY2xhc3MgcmVzdWx0OworCisgICAgICAvLyBEZXRlcm1pbmUgdGhlIHJlc3VsdCB0eXBlIHdoZW4gd2UgcGFzcyB0aGUgYXJndW1lbnRzIGFsb25nLiBUaGlzCisgICAgICAvLyBpbnZvbHZlcyBwYXNzaW5nIGFsb25nIHRoZSBjdi1xdWFsaWZpZXJzIHBsYWNlZCBvbiBfTXUgYW5kCisgICAgICAvLyB1bndyYXBwaW5nIHRoZSBhcmd1bWVudCBidW5kbGUuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZNdSwgdHlwZW5hbWUgX0NWQXJnLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgY2xhc3MgcmVzdWx0PF9DVk11KF9DVkFyZywgdHVwbGU8X0FyZ3MuLi4+KT4KKwk6IHB1YmxpYyByZXN1bHRfb2Y8X0NWQXJnKF9BcmdzLi4uKT4geyB9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZBcmcsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8X0NWQXJnKF9BcmdzLi4uKT46OnR5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQ1ZBcmcmIF9fYXJnLAorCQkgICBjb25zdCB0dXBsZTxfQXJncy4uLj4mIF9fdHVwbGUpIGNvbnN0IHZvbGF0aWxlCisgICAgICAgIHsKKwkgIC8vIENvbnN0cnVjdCBhbiBpbmRleCB0dXBsZSBhbmQgZm9yd2FyZCB0byBfX2NhbGwKKwkgIHR5cGVkZWYgdHlwZW5hbWUgX0J1aWxkX2luZGV4X3R1cGxlPHNpemVvZi4uLihfQXJncyk+OjpfX3R5cGUKKwkgICAgX0luZGV4ZXM7CisJICByZXR1cm4gdGhpcy0+X19jYWxsKF9fYXJnLCBfX3R1cGxlLCBfSW5kZXhlcygpKTsKKwl9CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gSW52b2tlcyB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QgX19hcmcgYnkgdW5wYWNraW5nIGFsbAorICAgICAgLy8gb2YgdGhlIGFyZ3VtZW50cyBpbiB0aGUgdHVwbGUuIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWQXJnLCB0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8X0NWQXJnKF9BcmdzLi4uKT46OnR5cGUKKyAgICAgICAgX19jYWxsKF9DVkFyZyYgX19hcmcsIGNvbnN0IHR1cGxlPF9BcmdzLi4uPiYgX190dXBsZSwKKwkgICAgICAgY29uc3QgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiYpIGNvbnN0IHZvbGF0aWxlCisgICAgICAgIHsKKwkgIHJldHVybiBfX2FyZyh0cjE6OmdldDxfSW5kZXhlcz4oX190dXBsZSkuLi4pOworCX0KKyAgICB9OworCisgIC8qKgorICAgKiAgSWYgdGhlIGFyZ3VtZW50IGlzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBOdGggYXJndW1lbnQsIHJldHVybnMKKyAgICogIGEgcmVmZXJlbmNlIHRvIHRoZSBOdGggYXJndW1lbnQgdG8gdGhlIGJpbmQgZnVuY3Rpb24gb2JqZWN0LgorICAgKiAgW1RSMSAzLjYuMy81IGJ1bGxldCAzXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICBjbGFzcyBfTXU8X0FyZywgZmFsc2UsIHRydWU+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+IGNsYXNzIHJlc3VsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWTXUsIHR5cGVuYW1lIF9DVkFyZywgdHlwZW5hbWUgX1R1cGxlPgorICAgICAgICBjbGFzcyByZXN1bHQ8X0NWTXUoX0NWQXJnLCBfVHVwbGUpPgorICAgICAgICB7CisJICAvLyBBZGQgYSByZWZlcmVuY2UsIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZG9uZSBmb3IgdXMuCisJICAvLyBUaGlzIGFsbG93cyB1cyB0byBiZSBhIGxpdHRsZSBiaXQgc2xvcHB5IGluIGNvbnN0cnVjdGluZworCSAgLy8gdGhlIHR1cGxlIHRoYXQgd2UgcGFzcyB0byByZXN1bHRfb2Y8Li4uPi4KKwkgIHR5cGVkZWYgdHlwZW5hbWUgX1NhZmVfdHVwbGVfZWxlbWVudDwoaXNfcGxhY2Vob2xkZXI8X0FyZz46OnZhbHVlCisJCQkJCQktIDEpLCBfVHVwbGU+Ojp0eXBlCisJICAgIF9fYmFzZV90eXBlOworCisJcHVibGljOgorCSAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfcmVmZXJlbmNlPF9fYmFzZV90eXBlPjo6dHlwZSB0eXBlOworCX07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UdXBsZT4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0PF9NdShfQXJnLCBfVHVwbGUpPjo6dHlwZQorICAgICAgICBvcGVyYXRvcigpKGNvbnN0IHZvbGF0aWxlIF9BcmcmLCBjb25zdCBfVHVwbGUmIF9fdHVwbGUpIGNvbnN0IHZvbGF0aWxlCisgICAgICAgIHsKKwkgIHJldHVybiA6OnN0ZDo6dHIxOjpnZXQ8KGlzX3BsYWNlaG9sZGVyPF9Bcmc+Ojp2YWx1ZSAtIDEpPihfX3R1cGxlKTsKKwl9CisgICAgfTsKKworICAvKioKKyAgICogIElmIHRoZSBhcmd1bWVudCBpcyBqdXN0IGEgdmFsdWUsIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhhdAorICAgKiAgdmFsdWUuIFRoZSBjdi1xdWFsaWZpZXJzIG9uIHRoZSByZWZlcmVuY2UgYXJlIHRoZSBzYW1lIGFzIHRoZQorICAgKiAgY3YtcXVhbGlmaWVycyBvbiB0aGUgX011IG9iamVjdC4gW1RSMSAzLjYuMy81IGJ1bGxldCA0XQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICBjbGFzcyBfTXU8X0FyZywgZmFsc2UsIGZhbHNlPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPiBzdHJ1Y3QgcmVzdWx0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZNdSwgdHlwZW5hbWUgX0NWQXJnLCB0eXBlbmFtZSBfVHVwbGU+CisgICAgICAgIHN0cnVjdCByZXN1bHQ8X0NWTXUoX0NWQXJnLCBfVHVwbGUpPgorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9yZWZlcmVuY2U8X0NWQXJnPjo6dHlwZSB0eXBlOworCX07CisKKyAgICAgIC8vIFBpY2sgdXAgdGhlIGN2LXF1YWxpZmllcnMgb2YgdGhlIGFyZ3VtZW50CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZBcmcsIHR5cGVuYW1lIF9UdXBsZT4KKyAgICAgICAgX0NWQXJnJgorICAgICAgICBvcGVyYXRvcigpKF9DVkFyZyYgX19hcmcsIGNvbnN0IF9UdXBsZSYpIGNvbnN0IHZvbGF0aWxlCisgICAgICAgIHsgcmV0dXJuIF9fYXJnOyB9CisgICAgfTsKKworICAvKioKKyAgICogIE1hcHMgbWVtYmVyIHBvaW50ZXJzIGludG8gaW5zdGFuY2VzIG9mIF9NZW1fZm4gYnV0IGxlYXZlcyBhbGwKKyAgICogIG90aGVyIGZ1bmN0aW9uIG9iamVjdHMgdW50b3VjaGVkLiBVc2VkIGJ5IHRyMTo6YmluZCgpLiBUaGUKKyAgICogIHByaW1hcnkgdGVtcGxhdGUgaGFuZGxlcyB0aGUgbm9uLS1tZW1iZXItcG9pbnRlciBjYXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwIHR5cGU7CisgICAgICAKKyAgICAgIHN0YXRpYyBjb25zdCBfVHAmCisgICAgICBfX2RvX3dyYXAoY29uc3QgX1RwJiBfX3gpCisgICAgICB7IHJldHVybiBfX3g7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgTWFwcyBtZW1iZXIgcG9pbnRlcnMgaW50byBpbnN0YW5jZXMgb2YgX01lbV9mbiBidXQgbGVhdmVzIGFsbAorICAgKiAgb3RoZXIgZnVuY3Rpb24gb2JqZWN0cyB1bnRvdWNoZWQuIFVzZWQgYnkgdHIxOjpiaW5kKCkuIFRoaXMKKyAgICogIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaGFuZGxlcyB0aGUgbWVtYmVyIHBvaW50ZXIgY2FzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NsYXNzPgorICAgIHN0cnVjdCBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcjxfVHAgX0NsYXNzOjoqPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX01lbV9mbjxfVHAgX0NsYXNzOjoqPiB0eXBlOworICAgICAgCisgICAgICBzdGF0aWMgdHlwZQorICAgICAgX19kb193cmFwKF9UcCBfQ2xhc3M6OiogX19wbSkKKyAgICAgIHsgcmV0dXJuIHR5cGUoX19wbSk7IH0KKyAgICB9OworCisgIC8vLyBUeXBlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QgcmV0dXJuZWQgZnJvbSBiaW5kKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IF9CaW5kOworCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0JvdW5kX2FyZ3M+CisgICAgY2xhc3MgX0JpbmQ8X0Z1bmN0b3IoX0JvdW5kX2FyZ3MuLi4pPgorICAgIDogcHVibGljIF9XZWFrX3Jlc3VsdF90eXBlPF9GdW5jdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0JpbmQgX19zZWxmX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CdWlsZF9pbmRleF90dXBsZTxzaXplb2YuLi4oX0JvdW5kX2FyZ3MpPjo6X190eXBlIAorICAgICAgICBfQm91bmRfaW5kZXhlczsKKworICAgICAgX0Z1bmN0b3IgX01fZjsKKyAgICAgIHR1cGxlPF9Cb3VuZF9hcmdzLi4uPiBfTV9ib3VuZF9hcmdzOworCisgICAgICAvLyBDYWxsIHVucXVhbGlmaWVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8CisgICAgICAgICAgICAgICAgICAgX0Z1bmN0b3IodHlwZW5hbWUgcmVzdWx0X29mPF9NdTxfQm91bmRfYXJncz4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9Cb3VuZF9hcmdzLCB0dXBsZTxfQXJncy4uLj4pPjo6dHlwZS4uLikKKyAgICAgICAgICAgICAgICAgPjo6dHlwZQorICAgICAgICBfX2NhbGwoY29uc3QgdHVwbGU8X0FyZ3MuLi4+JiBfX2FyZ3MsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4pCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKyAgICAgICAgICAgICAgICAgICAgICAodHIxOjpnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKyAgICAgICAgfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8CisgICAgICAgICAgICAgICAgICAgY29uc3QgX0Z1bmN0b3IodHlwZW5hbWUgcmVzdWx0X29mPF9NdTxfQm91bmRfYXJncz4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgX0JvdW5kX2FyZ3MsIHR1cGxlPF9BcmdzLi4uPikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlLi4uKT46OnR5cGUKKyAgICAgICAgX19jYWxsKGNvbnN0IHR1cGxlPF9BcmdzLi4uPiYgX19hcmdzLCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisgICAgICAgICAgICAgICAgICAgICAgKHRyMTo6Z2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgICAgLy8gQ2FsbCBhcyB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPAorICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIF9GdW5jdG9yKHR5cGVuYW1lIHJlc3VsdF9vZjxfTXU8X0JvdW5kX2FyZ3M+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIF9Cb3VuZF9hcmdzLCB0dXBsZTxfQXJncy4uLj4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZS4uLik+Ojp0eXBlCisgICAgICAgIF9fY2FsbChjb25zdCB0dXBsZTxfQXJncy4uLj4mIF9fYXJncywgCisgICAgICAgICAgICAgICBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KSB2b2xhdGlsZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisgICAgICAgICAgICAgICAgICAgICAgKHRyMTo6Z2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdCB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvbGF0aWxlIF9GdW5jdG9yKHR5cGVuYW1lIHJlc3VsdF9vZjxfTXU8X0JvdW5kX2FyZ3M+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHZvbGF0aWxlIF9Cb3VuZF9hcmdzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZTxfQXJncy4uLj4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZS4uLik+Ojp0eXBlCisgICAgICAgIF9fY2FsbChjb25zdCB0dXBsZTxfQXJncy4uLj4mIF9fYXJncywgCisgICAgICAgICAgICAgICBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KSBjb25zdCB2b2xhdGlsZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisgICAgICAgICAgICAgICAgICAgICAgKHRyMTo6Z2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdCBfQmluZChfRnVuY3RvciBfX2YsIF9Cb3VuZF9hcmdzLi4uIF9fYm91bmRfYXJncykKKyAgICAgICAgOiBfTV9mKF9fZiksIF9NX2JvdW5kX2FyZ3MoX19ib3VuZF9hcmdzLi4uKSB7IH0KKworICAgICAgLy8gQ2FsbCB1bnF1YWxpZmllZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjwKKyAgICAgICAgICAgICAgICAgICBfRnVuY3Rvcih0eXBlbmFtZSByZXN1bHRfb2Y8X011PF9Cb3VuZF9hcmdzPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX0JvdW5kX2FyZ3MsIHR1cGxlPF9BcmdzLi4uPik+Ojp0eXBlLi4uKQorICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX0FyZ3MmLi4uIF9fYXJncykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiB0aGlzLT5fX2NhbGwodHIxOjp0aWUoX19hcmdzLi4uKSwgX0JvdW5kX2luZGV4ZXMoKSk7CisgICAgICAgIH0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBfRnVuY3Rvcih0eXBlbmFtZSByZXN1bHRfb2Y8X011PF9Cb3VuZF9hcmdzPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgX0JvdW5kX2FyZ3MsIHR1cGxlPF9BcmdzLi4uPik+Ojp0eXBlLi4uKQorICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX0FyZ3MmLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiB0aGlzLT5fX2NhbGwodHIxOjp0aWUoX19hcmdzLi4uKSwgX0JvdW5kX2luZGV4ZXMoKSk7CisgICAgICAgIH0KKworCisgICAgICAvLyBDYWxsIGFzIHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPAorICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIF9GdW5jdG9yKHR5cGVuYW1lIHJlc3VsdF9vZjxfTXU8X0JvdW5kX2FyZ3M+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2xhdGlsZSBfQm91bmRfYXJncywgdHVwbGU8X0FyZ3MuLi4+KT46OnR5cGUuLi4pCisgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQXJncyYuLi4gX19hcmdzKSB2b2xhdGlsZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHRoaXMtPl9fY2FsbCh0cjE6OnRpZShfX2FyZ3MuLi4pLCBfQm91bmRfaW5kZXhlcygpKTsKKyAgICAgICAgfQorCisKKyAgICAgIC8vIENhbGwgYXMgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8CisgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9sYXRpbGUgX0Z1bmN0b3IodHlwZW5hbWUgcmVzdWx0X29mPF9NdTxfQm91bmRfYXJncz4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHZvbGF0aWxlIF9Cb3VuZF9hcmdzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGU8X0FyZ3MuLi4+KT46OnR5cGUuLi4pCisgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQXJncyYuLi4gX19hcmdzKSBjb25zdCB2b2xhdGlsZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHRoaXMtPl9fY2FsbCh0cjE6OnRpZShfX2FyZ3MuLi4pLCBfQm91bmRfaW5kZXhlcygpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgLy8vIFR5cGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdCByZXR1cm5lZCBmcm9tIGJpbmQ8Uj4oKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgX0JpbmRfcmVzdWx0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQm91bmRfYXJncz4KKyAgICBjbGFzcyBfQmluZF9yZXN1bHQ8X1Jlc3VsdCwgX0Z1bmN0b3IoX0JvdW5kX2FyZ3MuLi4pPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0JpbmRfcmVzdWx0IF9fc2VsZl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQnVpbGRfaW5kZXhfdHVwbGU8c2l6ZW9mLi4uKF9Cb3VuZF9hcmdzKT46Ol9fdHlwZSAKKyAgICAgICAgX0JvdW5kX2luZGV4ZXM7CisKKyAgICAgIF9GdW5jdG9yIF9NX2Y7CisgICAgICB0dXBsZTxfQm91bmRfYXJncy4uLj4gX01fYm91bmRfYXJnczsKKworICAgICAgLy8gQ2FsbCB1bnF1YWxpZmllZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKyAgICAgICAgX1Jlc3VsdAorICAgICAgICBfX2NhbGwoY29uc3QgdHVwbGU8X0FyZ3MuLi4+JiBfX2FyZ3MsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4pCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKyAgICAgICAgICAgICAgICAgICAgICAodHIxOjpnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKyAgICAgICAgfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorICAgICAgICBfUmVzdWx0CisgICAgICAgIF9fY2FsbChjb25zdCB0dXBsZTxfQXJncy4uLj4mIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorICAgICAgICAgICAgICAgICAgICAgICh0cjE6OmdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworICAgICAgICB9CisKKyAgICAgIC8vIENhbGwgYXMgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCBpbnQuLi4gX0luZGV4ZXM+CisgICAgICAgIF9SZXN1bHQKKyAgICAgICAgX19jYWxsKGNvbnN0IHR1cGxlPF9BcmdzLi4uPiYgX19hcmdzLCAKKyAgICAgICAgICAgICAgIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4pIHZvbGF0aWxlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKyAgICAgICAgICAgICAgICAgICAgICAodHIxOjpnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKyAgICAgICAgfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0IHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorICAgICAgICBfUmVzdWx0CisgICAgICAgIF9fY2FsbChjb25zdCB0dXBsZTxfQXJncy4uLj4mIF9fYXJncywgCisgICAgICAgICAgICAgICBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KSBjb25zdCB2b2xhdGlsZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisgICAgICAgICAgICAgICAgICAgICAgKHRyMTo6Z2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1Jlc3VsdCByZXN1bHRfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9CaW5kX3Jlc3VsdChfRnVuY3RvciBfX2YsIF9Cb3VuZF9hcmdzLi4uIF9fYm91bmRfYXJncykKKyAgICAgIDogX01fZihfX2YpLCBfTV9ib3VuZF9hcmdzKF9fYm91bmRfYXJncy4uLikgeyB9CisKKyAgICAgIC8vIENhbGwgdW5xdWFsaWZpZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9BcmdzJi4uLiBfX2FyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy0+X19jYWxsKHRyMTo6dGllKF9fYXJncy4uLiksIF9Cb3VuZF9pbmRleGVzKCkpOworICAgICAgICB9CisKKyAgICAgIC8vIENhbGwgYXMgY29uc3QKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9BcmdzJi4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy0+X19jYWxsKHRyMTo6dGllKF9fYXJncy4uLiksIF9Cb3VuZF9pbmRleGVzKCkpOworICAgICAgICB9CisKKyAgICAgIC8vIENhbGwgYXMgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9BcmdzJi4uLiBfX2FyZ3MpIHZvbGF0aWxlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy0+X19jYWxsKHRyMTo6dGllKF9fYXJncy4uLiksIF9Cb3VuZF9pbmRleGVzKCkpOworICAgICAgICB9CisKKyAgICAgIC8vIENhbGwgYXMgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9BcmdzJi4uLiBfX2FyZ3MpIGNvbnN0IHZvbGF0aWxlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy0+X19jYWxsKHRyMTo6dGllKF9fYXJncy4uLiksIF9Cb3VuZF9pbmRleGVzKCkpOworICAgICAgICB9CisgICAgfTsKKworICAvLy8gQ2xhc3MgdGVtcGxhdGUgX0JpbmQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248X0JpbmQ8X1NpZ25hdHVyZT4gPgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY29uc3QgYm9vbCBpc19iaW5kX2V4cHJlc3Npb248X0JpbmQ8X1NpZ25hdHVyZT4gPjo6dmFsdWU7CisKKyAgLy8vIENsYXNzIHRlbXBsYXRlIF9CaW5kIGlzIGFsd2F5cyBhIGJpbmQgZXhwcmVzc2lvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IF9CaW5kPF9TaWduYXR1cmU+ID4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGNvbnN0IGJvb2wgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IF9CaW5kPF9TaWduYXR1cmU+ID46OnZhbHVlOworCisgIC8vLyBDbGFzcyB0ZW1wbGF0ZSBfQmluZCBpcyBhbHdheXMgYSBiaW5kIGV4cHJlc3Npb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjx2b2xhdGlsZSBfQmluZDxfU2lnbmF0dXJlPiA+CisgICAgeyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBjb25zdCBib29sIGlzX2JpbmRfZXhwcmVzc2lvbjx2b2xhdGlsZSBfQmluZDxfU2lnbmF0dXJlPiA+Ojp2YWx1ZTsKKworICAvLy8gQ2xhc3MgdGVtcGxhdGUgX0JpbmQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248Y29uc3Qgdm9sYXRpbGUgX0JpbmQ8X1NpZ25hdHVyZT4gPgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY29uc3QgYm9vbCBpc19iaW5kX2V4cHJlc3Npb248Y29uc3Qgdm9sYXRpbGUgX0JpbmQ8X1NpZ25hdHVyZT4gPjo6dmFsdWU7CisKKyAgLy8vIENsYXNzIHRlbXBsYXRlIF9CaW5kX3Jlc3VsdCBpcyBhbHdheXMgYSBiaW5kIGV4cHJlc3Npb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxfQmluZF9yZXN1bHQ8X1Jlc3VsdCwgX1NpZ25hdHVyZT4gPgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY29uc3QgYm9vbCBpc19iaW5kX2V4cHJlc3Npb248X0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+ID46OnZhbHVlOworCisgIC8vLyBDbGFzcyB0ZW1wbGF0ZSBfQmluZF9yZXN1bHQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248Y29uc3QgX0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+ID4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGNvbnN0IGJvb2wKKyAgICBpc19iaW5kX2V4cHJlc3Npb248Y29uc3QgX0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+ID46OnZhbHVlOworCisgIC8vLyBDbGFzcyB0ZW1wbGF0ZSBfQmluZF9yZXN1bHQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248dm9sYXRpbGUgX0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+ID4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGNvbnN0IGJvb2wKKyAgICBpc19iaW5kX2V4cHJlc3Npb248dm9sYXRpbGUgX0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+ID46OnZhbHVlOworCisgIC8vLyBDbGFzcyB0ZW1wbGF0ZSBfQmluZF9yZXN1bHQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdAorICAgIGlzX2JpbmRfZXhwcmVzc2lvbjxjb25zdCB2b2xhdGlsZSBfQmluZF9yZXN1bHQ8X1Jlc3VsdCwgX1NpZ25hdHVyZT4gPgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY29uc3QgYm9vbAorICAgIGlzX2JpbmRfZXhwcmVzc2lvbjxjb25zdCB2b2xhdGlsZSBfQmluZF9yZXN1bHQ8X1Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TaWduYXR1cmU+ID46OnZhbHVlOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248c3RkOjpfQmluZDxfU2lnbmF0dXJlPj4KKyAgICA6IHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IHN0ZDo6X0JpbmQ8X1NpZ25hdHVyZT4+CisgICAgOiB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjx2b2xhdGlsZSBzdGQ6Ol9CaW5kPF9TaWduYXR1cmU+PgorICAgIDogdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248Y29uc3Qgdm9sYXRpbGUgc3RkOjpfQmluZDxfU2lnbmF0dXJlPj4KKyAgICA6IHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPHN0ZDo6X0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+PgorICAgIDogdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248Y29uc3Qgc3RkOjpfQmluZF9yZXN1bHQ8X1Jlc3VsdCwgX1NpZ25hdHVyZT4+CisgICAgOiB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjx2b2xhdGlsZSBzdGQ6Ol9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfU2lnbmF0dXJlPj4KKyAgICA6IHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IHZvbGF0aWxlIHN0ZDo6X0JpbmRfcmVzdWx0PF9SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU2lnbmF0dXJlPj4KKyAgICA6IHRydWVfdHlwZSB7IH07CisjZW5kaWYKKworICAvLy8gYmluZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGlubGluZQorICAgIF9CaW5kPHR5cGVuYW1lIF9NYXliZV93cmFwX21lbWJlcl9wb2ludGVyPF9GdW5jdG9yPjo6dHlwZShfQXJnVHlwZXMuLi4pPgorICAgIGJpbmQoX0Z1bmN0b3IgX19mLCBfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8X0Z1bmN0b3I+IF9fbWF5YmVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19tYXliZV90eXBlOjp0eXBlIF9fZnVuY3Rvcl90eXBlOworICAgICAgdHlwZWRlZiBfQmluZDxfX2Z1bmN0b3JfdHlwZShfQXJnVHlwZXMuLi4pPiBfX3Jlc3VsdF90eXBlOworICAgICAgcmV0dXJuIF9fcmVzdWx0X3R5cGUoX19tYXliZV90eXBlOjpfX2RvX3dyYXAoX19mKSwgX19hcmdzLi4uKTsKKyAgICB9IAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgaW5saW5lCisgICAgX0JpbmRfcmVzdWx0PF9SZXN1bHQsCisJCSB0eXBlbmFtZSBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcjxfRnVuY3Rvcj46OnR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX0FyZ1R5cGVzLi4uKT4KKyAgICBiaW5kKF9GdW5jdG9yIF9fZiwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICB7CisgICAgICB0eXBlZGVmIF9NYXliZV93cmFwX21lbWJlcl9wb2ludGVyPF9GdW5jdG9yPiBfX21heWJlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbWF5YmVfdHlwZTo6dHlwZSBfX2Z1bmN0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9fZnVuY3Rvcl90eXBlKF9BcmdUeXBlcy4uLik+CisJX19yZXN1bHRfdHlwZTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdF90eXBlKF9fbWF5YmVfdHlwZTo6X19kb193cmFwKF9fZiksIF9fYXJncy4uLik7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEV4Y2VwdGlvbiBjbGFzcyB0aHJvd24gd2hlbiBjbGFzcyB0ZW1wbGF0ZSBmdW5jdGlvbidzCisgICAqICBvcGVyYXRvcigpIGlzIGNhbGxlZCB3aXRoIGFuIGVtcHR5IHRhcmdldC4KKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICovCisgIGNsYXNzIGJhZF9mdW5jdGlvbl9jYWxsIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uIHsgfTsKKworICAvKioKKyAgICogIFRoZSBpbnRlZ3JhbCBjb25zdGFudCBleHByZXNzaW9uIDAgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGEKKyAgICogIHBvaW50ZXIgdG8gdGhpcyB0eXBlLiBJdCBpcyB1c2VkIGJ5IHRoZSBmdW5jdGlvbiB0ZW1wbGF0ZSB0bworICAgKiAgYWNjZXB0IE5VTEwgcG9pbnRlcnMuCisgICAqLworICBzdHJ1Y3QgX01fY2xlYXJfdHlwZTsKKworICAvKioKKyAgICogIFRyYWl0IGlkZW50aWZ5aW5nIEBhIGxvY2F0aW9uLWludmFyaWFudCB0eXBlcywgbWVhbmluZyB0aGF0IHRoZQorICAgKiAgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IChvciBhbnkgb2YgaXRzIG1lbWJlcnMpIHdpbGwgbm90IGVzY2FwZS4KKyAgICogIEFsc28gaW1wbGllcyBhIHRyaXZpYWwgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19sb2NhdGlvbl9pbnZhcmlhbnQKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAoaXNfcG9pbnRlcjxfVHA+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzX21lbWJlcl9wb2ludGVyPF9UcD46OnZhbHVlKT4KKyAgICB7CisgICAgfTsKKworICBjbGFzcyBfVW5kZWZpbmVkX2NsYXNzOworCisgIHVuaW9uIF9Ob2NvcHlfdHlwZXMKKyAgeworICAgIHZvaWQqICAgICAgIF9NX29iamVjdDsKKyAgICBjb25zdCB2b2lkKiBfTV9jb25zdF9vYmplY3Q7CisgICAgdm9pZCAoKl9NX2Z1bmN0aW9uX3BvaW50ZXIpKCk7CisgICAgdm9pZCAoX1VuZGVmaW5lZF9jbGFzczo6Kl9NX21lbWJlcl9wb2ludGVyKSgpOworICB9OworCisgIHVuaW9uIF9BbnlfZGF0YQorICB7CisgICAgdm9pZCogICAgICAgX01fYWNjZXNzKCkgICAgICAgeyByZXR1cm4gJl9NX3BvZF9kYXRhWzBdOyB9CisgICAgY29uc3Qgdm9pZCogX01fYWNjZXNzKCkgY29uc3QgeyByZXR1cm4gJl9NX3BvZF9kYXRhWzBdOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAmCisgICAgICBfTV9hY2Nlc3MoKQorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9UcCo+KF9NX2FjY2VzcygpKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgY29uc3QgX1RwJgorICAgICAgX01fYWNjZXNzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfVHAqPihfTV9hY2Nlc3MoKSk7IH0KKworICAgIF9Ob2NvcHlfdHlwZXMgX01fdW51c2VkOworICAgIGNoYXIgX01fcG9kX2RhdGFbc2l6ZW9mKF9Ob2NvcHlfdHlwZXMpXTsKKyAgfTsKKworICBlbnVtIF9NYW5hZ2VyX29wZXJhdGlvbgorICB7CisgICAgX19nZXRfdHlwZV9pbmZvLAorICAgIF9fZ2V0X2Z1bmN0b3JfcHRyLAorICAgIF9fY2xvbmVfZnVuY3RvciwKKyAgICBfX2Rlc3Ryb3lfZnVuY3RvcgorICB9OworCisgIC8vIFNpbXBsZSB0eXBlIHdyYXBwZXIgdGhhdCBoZWxwcyBhdm9pZCBhbm5veWluZyBjb25zdCBwcm9ibGVtcworICAvLyB3aGVuIGNhc3RpbmcgYmV0d2VlbiB2b2lkIHBvaW50ZXJzIGFuZCBwb2ludGVycy10by1wb2ludGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfU2ltcGxlX3R5cGVfd3JhcHBlcgorICAgIHsKKyAgICAgIF9TaW1wbGVfdHlwZV93cmFwcGVyKF9UcCBfX3ZhbHVlKSA6IF9fdmFsdWUoX192YWx1ZSkgeyB9CisKKyAgICAgIF9UcCBfX3ZhbHVlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2xvY2F0aW9uX2ludmFyaWFudDxfU2ltcGxlX3R5cGVfd3JhcHBlcjxfVHA+ID4KKyAgICA6IF9faXNfbG9jYXRpb25faW52YXJpYW50PF9UcD4KKyAgICB7CisgICAgfTsKKworICAvLyBDb252ZXJ0cyBhIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uIG9iamVjdCBpbnRvIGEgY2FsbGFibGUKKyAgLy8gZnVuY3Rpb24gb2JqZWN0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICBpbmxpbmUgX0Z1bmN0b3ImCisgICAgX19jYWxsYWJsZV9mdW5jdG9yKF9GdW5jdG9yJiBfX2YpCisgICAgeyByZXR1cm4gX19mOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01lbWJlciwgdHlwZW5hbWUgX0NsYXNzPgorICAgIGlubGluZSBfTWVtX2ZuPF9NZW1iZXIgX0NsYXNzOjoqPgorICAgIF9fY2FsbGFibGVfZnVuY3RvcihfTWVtYmVyIF9DbGFzczo6KiAmX19wKQorICAgIHsgcmV0dXJuIG1lbV9mbihfX3ApOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01lbWJlciwgdHlwZW5hbWUgX0NsYXNzPgorICAgIGlubGluZSBfTWVtX2ZuPF9NZW1iZXIgX0NsYXNzOjoqPgorICAgIF9fY2FsbGFibGVfZnVuY3RvcihfTWVtYmVyIF9DbGFzczo6KiBjb25zdCAmX19wKQorICAgIHsgcmV0dXJuIG1lbV9mbihfX3ApOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBjbGFzcyBmdW5jdGlvbjsKKworICAvLy8gQmFzZSBjbGFzcyBvZiBhbGwgcG9seW1vcnBoaWMgZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXJzLgorICBjbGFzcyBfRnVuY3Rpb25fYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3QgX01fbWF4X3NpemUgPSBzaXplb2YoX05vY29weV90eXBlcyk7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IF9NX21heF9hbGlnbiA9IF9fYWxpZ25vZl9fKF9Ob2NvcHlfdHlwZXMpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBjbGFzcyBfQmFzZV9tYW5hZ2VyCisgICAgICB7CisgICAgICBwcm90ZWN0ZWQ6CisJc3RhdGljIGNvbnN0IGJvb2wgX19zdG9yZWRfbG9jYWxseSA9CisgICAgICAgIChfX2lzX2xvY2F0aW9uX2ludmFyaWFudDxfRnVuY3Rvcj46OnZhbHVlCisgICAgICAgICAmJiBzaXplb2YoX0Z1bmN0b3IpIDw9IF9NX21heF9zaXplCisgICAgICAgICAmJiBfX2FsaWdub2ZfXyhfRnVuY3RvcikgPD0gX01fbWF4X2FsaWduCisgICAgICAgICAmJiAoX01fbWF4X2FsaWduICUgX19hbGlnbm9mX18oX0Z1bmN0b3IpID09IDApKTsKKwkKKwl0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9fc3RvcmVkX2xvY2FsbHk+IF9Mb2NhbF9zdG9yYWdlOworCisJLy8gUmV0cmlldmUgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBvYmplY3QKKwlzdGF0aWMgX0Z1bmN0b3IqCisJX01fZ2V0X3BvaW50ZXIoY29uc3QgX0FueV9kYXRhJiBfX3NvdXJjZSkKKwl7CisJICBjb25zdCBfRnVuY3RvciogX19wdHIgPQorCSAgICBfX3N0b3JlZF9sb2NhbGx5PyBzdGQ6Ol9fYWRkcmVzc29mKF9fc291cmNlLl9NX2FjY2VzczxfRnVuY3Rvcj4oKSkKKwkgICAgLyogaGF2ZSBzdG9yZWQgYSBwb2ludGVyICovIDogX19zb3VyY2UuX01fYWNjZXNzPF9GdW5jdG9yKj4oKTsKKwkgIHJldHVybiBjb25zdF9jYXN0PF9GdW5jdG9yKj4oX19wdHIpOworCX0KKworCS8vIENsb25lIGEgbG9jYXRpb24taW52YXJpYW50IGZ1bmN0aW9uIG9iamVjdCB0aGF0IGZpdHMgd2l0aGluCisJLy8gYW4gX0FueV9kYXRhIHN0cnVjdHVyZS4KKwlzdGF0aWMgdm9pZAorCV9NX2Nsb25lKF9BbnlfZGF0YSYgX19kZXN0LCBjb25zdCBfQW55X2RhdGEmIF9fc291cmNlLCB0cnVlX3R5cGUpCisJeworCSAgbmV3IChfX2Rlc3QuX01fYWNjZXNzKCkpIF9GdW5jdG9yKF9fc291cmNlLl9NX2FjY2VzczxfRnVuY3Rvcj4oKSk7CisJfQorCisJLy8gQ2xvbmUgYSBmdW5jdGlvbiBvYmplY3QgdGhhdCBpcyBub3QgbG9jYXRpb24taW52YXJpYW50IG9yCisJLy8gdGhhdCBjYW5ub3QgZml0IGludG8gYW4gX0FueV9kYXRhIHN0cnVjdHVyZS4KKwlzdGF0aWMgdm9pZAorCV9NX2Nsb25lKF9BbnlfZGF0YSYgX19kZXN0LCBjb25zdCBfQW55X2RhdGEmIF9fc291cmNlLCBmYWxzZV90eXBlKQorCXsKKwkgIF9fZGVzdC5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpID0KKwkgICAgbmV3IF9GdW5jdG9yKCpfX3NvdXJjZS5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpKTsKKwl9CisKKwkvLyBEZXN0cm95aW5nIGEgbG9jYXRpb24taW52YXJpYW50IG9iamVjdCBtYXkgc3RpbGwgcmVxdWlyZQorCS8vIGRlc3RydWN0aW9uLgorCXN0YXRpYyB2b2lkCisJX01fZGVzdHJveShfQW55X2RhdGEmIF9fdmljdGltLCB0cnVlX3R5cGUpCisJeworCSAgX192aWN0aW0uX01fYWNjZXNzPF9GdW5jdG9yPigpLn5fRnVuY3RvcigpOworCX0KKwkKKwkvLyBEZXN0cm95aW5nIGFuIG9iamVjdCBsb2NhdGVkIG9uIHRoZSBoZWFwLgorCXN0YXRpYyB2b2lkCisJX01fZGVzdHJveShfQW55X2RhdGEmIF9fdmljdGltLCBmYWxzZV90eXBlKQorCXsKKwkgIGRlbGV0ZSBfX3ZpY3RpbS5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpOworCX0KKwkKKyAgICAgIHB1YmxpYzoKKwlzdGF0aWMgYm9vbAorCV9NX21hbmFnZXIoX0FueV9kYXRhJiBfX2Rlc3QsIGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UsCisJCSAgIF9NYW5hZ2VyX29wZXJhdGlvbiBfX29wKQorCXsKKwkgIHN3aXRjaCAoX19vcCkKKwkgICAgeworI2lmZGVmIF9fR1hYX1JUVEkKKwkgICAgY2FzZSBfX2dldF90eXBlX2luZm86CisJICAgICAgX19kZXN0Ll9NX2FjY2Vzczxjb25zdCB0eXBlX2luZm8qPigpID0gJnR5cGVpZChfRnVuY3Rvcik7CisJICAgICAgYnJlYWs7CisjZW5kaWYKKwkgICAgY2FzZSBfX2dldF9mdW5jdG9yX3B0cjoKKwkgICAgICBfX2Rlc3QuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9IF9NX2dldF9wb2ludGVyKF9fc291cmNlKTsKKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgY2FzZSBfX2Nsb25lX2Z1bmN0b3I6CisJICAgICAgX01fY2xvbmUoX19kZXN0LCBfX3NvdXJjZSwgX0xvY2FsX3N0b3JhZ2UoKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBfX2Rlc3Ryb3lfZnVuY3RvcjoKKwkgICAgICBfTV9kZXN0cm95KF9fZGVzdCwgX0xvY2FsX3N0b3JhZ2UoKSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKwlzdGF0aWMgdm9pZAorCV9NX2luaXRfZnVuY3RvcihfQW55X2RhdGEmIF9fZnVuY3RvciwgY29uc3QgX0Z1bmN0b3ImIF9fZikKKwl7IF9NX2luaXRfZnVuY3RvcihfX2Z1bmN0b3IsIF9fZiwgX0xvY2FsX3N0b3JhZ2UoKSk7IH0KKwkKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorCSAgc3RhdGljIGJvb2wKKwkgIF9NX25vdF9lbXB0eV9mdW5jdGlvbihjb25zdCBmdW5jdGlvbjxfU2lnbmF0dXJlPiYgX19mKQorICAgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9fZik7IH0KKworCXRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwkgIHN0YXRpYyBib29sCisJICBfTV9ub3RfZW1wdHlfZnVuY3Rpb24oY29uc3QgX1RwKiYgX19mcCkKKwkgIHsgcmV0dXJuIF9fZnA7IH0KKworCXRlbXBsYXRlPHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUgX1RwPgorCSAgc3RhdGljIGJvb2wKKwkgIF9NX25vdF9lbXB0eV9mdW5jdGlvbihfVHAgX0NsYXNzOjoqIGNvbnN0JiBfX21wKQorCSAgeyByZXR1cm4gX19tcDsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCSAgc3RhdGljIGJvb2wKKwkgIF9NX25vdF9lbXB0eV9mdW5jdGlvbihjb25zdCBfVHAmKQorCSAgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICBwcml2YXRlOgorCXN0YXRpYyB2b2lkCisJX01faW5pdF9mdW5jdG9yKF9BbnlfZGF0YSYgX19mdW5jdG9yLCBjb25zdCBfRnVuY3RvciYgX19mLCB0cnVlX3R5cGUpCisJeyBuZXcgKF9fZnVuY3Rvci5fTV9hY2Nlc3MoKSkgX0Z1bmN0b3IoX19mKTsgfQorCisJc3RhdGljIHZvaWQKKwlfTV9pbml0X2Z1bmN0b3IoX0FueV9kYXRhJiBfX2Z1bmN0b3IsIGNvbnN0IF9GdW5jdG9yJiBfX2YsIGZhbHNlX3R5cGUpCisJeyBfX2Z1bmN0b3IuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9IG5ldyBfRnVuY3RvcihfX2YpOyB9CisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBjbGFzcyBfUmVmX21hbmFnZXIgOiBwdWJsaWMgX0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcio+CisgICAgICB7CisJdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcio+IF9CYXNlOworCisgICAgcHVibGljOgorCXN0YXRpYyBib29sCisJX01fbWFuYWdlcihfQW55X2RhdGEmIF9fZGVzdCwgY29uc3QgX0FueV9kYXRhJiBfX3NvdXJjZSwKKwkJICAgX01hbmFnZXJfb3BlcmF0aW9uIF9fb3ApCisJeworCSAgc3dpdGNoIChfX29wKQorCSAgICB7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgICBjYXNlIF9fZ2V0X3R5cGVfaW5mbzoKKwkgICAgICBfX2Rlc3QuX01fYWNjZXNzPGNvbnN0IHR5cGVfaW5mbyo+KCkgPSAmdHlwZWlkKF9GdW5jdG9yKTsKKwkgICAgICBicmVhazsKKyNlbmRpZgorCSAgICBjYXNlIF9fZ2V0X2Z1bmN0b3JfcHRyOgorCSAgICAgIF9fZGVzdC5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpID0gKl9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX3NvdXJjZSk7CisJICAgICAgcmV0dXJuIGlzX2NvbnN0PF9GdW5jdG9yPjo6dmFsdWU7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGRlZmF1bHQ6CisJICAgICAgX0Jhc2U6Ol9NX21hbmFnZXIoX19kZXN0LCBfX3NvdXJjZSwgX19vcCk7CisJICAgIH0KKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKwlzdGF0aWMgdm9pZAorCV9NX2luaXRfZnVuY3RvcihfQW55X2RhdGEmIF9fZnVuY3RvciwgcmVmZXJlbmNlX3dyYXBwZXI8X0Z1bmN0b3I+IF9fZikKKwl7CisJICBfQmFzZTo6X01faW5pdF9mdW5jdG9yKF9fZnVuY3Rvciwgc3RkOjpfX2FkZHJlc3NvZihfX2YuZ2V0KCkpKTsKKwl9CisgICAgICB9OworCisgICAgX0Z1bmN0aW9uX2Jhc2UoKSA6IF9NX21hbmFnZXIoMCkgeyB9CisgICAgCisgICAgfl9GdW5jdGlvbl9iYXNlKCkKKyAgICB7CisgICAgICBpZiAoX01fbWFuYWdlcikKKwlfTV9tYW5hZ2VyKF9NX2Z1bmN0b3IsIF9NX2Z1bmN0b3IsIF9fZGVzdHJveV9mdW5jdG9yKTsKKyAgICB9CisKKworICAgIGJvb2wgX01fZW1wdHkoKSBjb25zdCB7IHJldHVybiAhX01fbWFuYWdlcjsgfQorCisgICAgdHlwZWRlZiBib29sICgqX01hbmFnZXJfdHlwZSkoX0FueV9kYXRhJiwgY29uc3QgX0FueV9kYXRhJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTWFuYWdlcl9vcGVyYXRpb24pOworCisgICAgX0FueV9kYXRhICAgICBfTV9mdW5jdG9yOworICAgIF9NYW5hZ2VyX3R5cGUgX01fbWFuYWdlcjsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlLCB0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9GdW5jdGlvbl9oYW5kbGVyPF9SZXMoX0FyZ1R5cGVzLi4uKSwgX0Z1bmN0b3I+CisgICAgOiBwdWJsaWMgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8X0Z1bmN0b3I+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcj4gX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgX1JlcworICAgICAgX01faW52b2tlKGNvbnN0IF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgICAgeworICAgICAgICByZXR1cm4gKCpfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19mdW5jdG9yKSkoX19hcmdzLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI8dm9pZChfQXJnVHlwZXMuLi4pLCBfRnVuY3Rvcj4KKyAgICA6IHB1YmxpYyBfRnVuY3Rpb25fYmFzZTo6X0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPF9GdW5jdG9yPiBfQmFzZTsKKworICAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX01faW52b2tlKGNvbnN0IF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgICAgeworICAgICAgICAoKl9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX2Z1bmN0b3IpKShfX2FyZ3MuLi4pOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjxfUmVzKF9BcmdUeXBlcy4uLiksIHJlZmVyZW5jZV93cmFwcGVyPF9GdW5jdG9yPiA+CisgICAgOiBwdWJsaWMgX0Z1bmN0aW9uX2Jhc2U6Ol9SZWZfbWFuYWdlcjxfRnVuY3Rvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5jdGlvbl9iYXNlOjpfUmVmX21hbmFnZXI8X0Z1bmN0b3I+IF9CYXNlOworCisgICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBfUmVzCisgICAgICBfTV9pbnZva2UoY29uc3QgX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpCisgICAgICB7CisgICAgICAgIHJldHVybiAKKyAgICAgICAgICBfX2NhbGxhYmxlX2Z1bmN0b3IoKipfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19mdW5jdG9yKSkoX19hcmdzLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI8dm9pZChfQXJnVHlwZXMuLi4pLCByZWZlcmVuY2Vfd3JhcHBlcjxfRnVuY3Rvcj4gPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfUmVmX21hbmFnZXI8X0Z1bmN0b3I+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X1JlZl9tYW5hZ2VyPF9GdW5jdG9yPiBfQmFzZTsKKworICAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX01faW52b2tlKGNvbnN0IF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgICAgeworICAgICAgICBfX2NhbGxhYmxlX2Z1bmN0b3IoKipfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19mdW5jdG9yKSkoX19hcmdzLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUgX01lbWJlciwgdHlwZW5hbWUgX1JlcywgCisgICAgICAgICAgIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjxfUmVzKF9BcmdUeXBlcy4uLiksIF9NZW1iZXIgX0NsYXNzOjoqPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9oYW5kbGVyPHZvaWQoX0FyZ1R5cGVzLi4uKSwgX01lbWJlciBfQ2xhc3M6Oio+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25faGFuZGxlcjx2b2lkKF9BcmdUeXBlcy4uLiksIF9NZW1iZXIgX0NsYXNzOjoqPgorICAgICAgICBfQmFzZTsKKworICAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgX1JlcworICAgICAgX01faW52b2tlKGNvbnN0IF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgICAgeworICAgICAgICByZXR1cm4gdHIxOjoKKwkgIG1lbV9mbihfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19mdW5jdG9yKS0+X192YWx1ZSkoX19hcmdzLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUgX01lbWJlciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9GdW5jdGlvbl9oYW5kbGVyPHZvaWQoX0FyZ1R5cGVzLi4uKSwgX01lbWJlciBfQ2xhc3M6Oio+CisgICAgOiBwdWJsaWMgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8CisgICAgICAgICAgICAgICAgIF9TaW1wbGVfdHlwZV93cmFwcGVyPCBfTWVtYmVyIF9DbGFzczo6KiA+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9NZW1iZXIgX0NsYXNzOjoqIF9GdW5jdG9yOworICAgICAgdHlwZWRlZiBfU2ltcGxlX3R5cGVfd3JhcHBlcjxfRnVuY3Rvcj4gX1dyYXBwZXI7CisgICAgICB0eXBlZGVmIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPF9XcmFwcGVyPiBfQmFzZTsKKworICAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgYm9vbAorICAgICAgX01fbWFuYWdlcihfQW55X2RhdGEmIF9fZGVzdCwgY29uc3QgX0FueV9kYXRhJiBfX3NvdXJjZSwKKyAgICAgICAgICAgICAgICAgX01hbmFnZXJfb3BlcmF0aW9uIF9fb3ApCisgICAgICB7CisgICAgICAgIHN3aXRjaCAoX19vcCkKKwkgIHsKKyNpZmRlZiBfX0dYWF9SVFRJCisJICBjYXNlIF9fZ2V0X3R5cGVfaW5mbzoKKwkgICAgX19kZXN0Ll9NX2FjY2Vzczxjb25zdCB0eXBlX2luZm8qPigpID0gJnR5cGVpZChfRnVuY3Rvcik7CisJICAgIGJyZWFrOworI2VuZGlmCSAgICAKKwkgIGNhc2UgX19nZXRfZnVuY3Rvcl9wdHI6CisJICAgIF9fZGVzdC5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpID0KKwkgICAgICAmX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fc291cmNlKS0+X192YWx1ZTsKKwkgICAgYnJlYWs7CisJICAgIAorCSAgZGVmYXVsdDoKKwkgICAgX0Jhc2U6Ol9NX21hbmFnZXIoX19kZXN0LCBfX3NvdXJjZSwgX19vcCk7CisJICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKwl0cjE6Om1lbV9mbihfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19mdW5jdG9yKS0+X192YWx1ZSkoX19hcmdzLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8vLyBjbGFzcyBmdW5jdGlvbgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPgorICAgIDogcHVibGljIF9NYXliZV91bmFyeV9vcl9iaW5hcnlfZnVuY3Rpb248X1JlcywgX0FyZ1R5cGVzLi4uPiwKKyAgICAgIHByaXZhdGUgX0Z1bmN0aW9uX2Jhc2UKKyAgICB7CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICAvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgc2FmZV9ib29sIGlkaW9tLgorICAgICAgc3RydWN0IF9IaWRkZW5fdHlwZQorICAgICAgeworCV9IaWRkZW5fdHlwZSogX01fYm9vbDsKKyAgICAgIH07CisKKyAgICAgIC8vLyBUaGlzIHR5cGVkZWYgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIHNhZmVfYm9vbCBpZGlvbS4KKyAgICAgIHR5cGVkZWYgX0hpZGRlbl90eXBlKiBfSGlkZGVuX3R5cGU6OiogX1NhZmVfYm9vbDsKKyNlbmRpZgorCisgICAgICB0eXBlZGVmIF9SZXMgX1NpZ25hdHVyZV90eXBlKF9BcmdUeXBlcy4uLik7CisgICAgICAKKyAgICAgIHN0cnVjdCBfVXNlbGVzcyB7IH07CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisgICAgICAKKyAgICAgIC8vIFszLjcuMi4xXSBjb25zdHJ1Y3QvY29weS9kZXN0cm95CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBEZWZhdWx0IGNvbnN0cnVjdCBjcmVhdGVzIGFuIGVtcHR5IGZ1bmN0aW9uIGNhbGwgd3JhcHBlci4KKyAgICAgICAqICBAcG9zdCBAYyAhKGJvb2wpKnRoaXMKKyAgICAgICAqLworICAgICAgZnVuY3Rpb24oKSA6IF9GdW5jdGlvbl9iYXNlKCkgeyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBEZWZhdWx0IGNvbnN0cnVjdCBjcmVhdGVzIGFuIGVtcHR5IGZ1bmN0aW9uIGNhbGwgd3JhcHBlci4KKyAgICAgICAqICBAcG9zdCBAYyAhKGJvb2wpKnRoaXMKKyAgICAgICAqLworICAgICAgZnVuY3Rpb24oX01fY2xlYXJfdHlwZSopIDogX0Z1bmN0aW9uX2Jhc2UoKSB7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICVGdW5jdGlvbiBjb3B5IGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSB4IEEgJWZ1bmN0aW9uIG9iamVjdCB3aXRoIGlkZW50aWNhbCBjYWxsIHNpZ25hdHVyZS4KKyAgICAgICAqICBAcG9zdCBAYyAoYm9vbCkqdGhpcyA9PSAoYm9vbCl4CisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVmdW5jdGlvbiBjb250YWlucyBhIGNvcHkgb2YgdGhlIHRhcmdldCBvZiBAYQorICAgICAgICogIHggKGlmIGl0IGhhcyBvbmUpLgorICAgICAgICovCisgICAgICBmdW5jdGlvbihjb25zdCBmdW5jdGlvbiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEJ1aWxkcyBhICVmdW5jdGlvbiB0aGF0IHRhcmdldHMgYSBjb3B5IG9mIHRoZSBpbmNvbWluZworICAgICAgICogIGZ1bmN0aW9uIG9iamVjdC4KKyAgICAgICAqICBAcGFyYW0gZiBBICVmdW5jdGlvbiBvYmplY3QgdGhhdCBpcyBjYWxsYWJsZSB3aXRoIHBhcmFtZXRlcnMgb2YKKyAgICAgICAqICB0eXBlIEBjIFQxLCBAYyBUMiwgLi4uLCBAYyBUTiBhbmQgcmV0dXJucyBhIHZhbHVlIGNvbnZlcnRpYmxlCisgICAgICAgKiAgdG8gQGMgUmVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlZnVuY3Rpb24gb2JqZWN0IHdpbGwgdGFyZ2V0IGEgY29weSBvZiBAYQorICAgICAgICogIGYuIElmIEBhIGYgaXMgQGMgcmVmZXJlbmNlX3dyYXBwZXI8Rj4sIHRoZW4gdGhpcyBmdW5jdGlvbgorICAgICAgICogIG9iamVjdCB3aWxsIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uIG9iamVjdCBAYworICAgICAgICogIGYuZ2V0KCkuIElmIEBhIGYgaXMgYSBOVUxMIGZ1bmN0aW9uIHBvaW50ZXIgb3IgTlVMTAorICAgICAgICogIHBvaW50ZXItdG8tbWVtYmVyLCB0aGUgbmV3bHktY3JlYXRlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgQGEgZiBpcyBhIG5vbi1OVUxMIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYW4gb2JqZWN0IG9mIHR5cGUgQGMKKyAgICAgICAqICByZWZlcmVuY2Vfd3JhcHBlcjxGPiwgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICAgIGZ1bmN0aW9uKF9GdW5jdG9yIF9fZiwKKyAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc19pbnRlZ3JhbDxfRnVuY3Rvcj46OnZhbHVlLCBfVXNlbGVzcz46Ol9fdHlwZQorICAgICAgICAgICAgICAgICAgID0gX1VzZWxlc3MoKSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0geCBBICVmdW5jdGlvbiB3aXRoIGlkZW50aWNhbCBjYWxsIHNpZ25hdHVyZS4KKyAgICAgICAqICBAcG9zdCBAYyAoYm9vbCkqdGhpcyA9PSAoYm9vbCl4CisgICAgICAgKiAgQHJldHVybnMgQGMgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgVGhlIHRhcmdldCBvZiBAYSB4IGlzIGNvcGllZCB0byBAYyAqdGhpcy4gSWYgQGEgeCBoYXMgbm8KKyAgICAgICAqICB0YXJnZXQsIHRoZW4gQGMgKnRoaXMgd2lsbCBiZSBlbXB0eS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgQGEgeCB0YXJnZXRzIGEgZnVuY3Rpb24gcG9pbnRlciBvciBhIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uCisgICAgICAgKiAgb2JqZWN0LCB0aGVuIHRoaXMgb3BlcmF0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGZ1bmN0aW9uJiBfX3gpCisgICAgICB7CisgICAgICAgIGZ1bmN0aW9uKF9feCkuc3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICVGdW5jdGlvbiBhc3NpZ25tZW50IHRvIHplcm8uCisgICAgICAgKiAgQHBvc3QgQGMgIShib29sKSp0aGlzCisgICAgICAgKiAgQHJldHVybnMgQGMgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgVGhlIHRhcmdldCBvZiBAYyAqdGhpcyBpcyBkZWFsbG9jYXRlZCwgbGVhdmluZyBpdCBlbXB0eS4KKyAgICAgICAqLworICAgICAgZnVuY3Rpb24mCisgICAgICBvcGVyYXRvcj0oX01fY2xlYXJfdHlwZSopCisgICAgICB7CisgICAgICAgIGlmIChfTV9tYW5hZ2VyKQorCSAgeworCSAgICBfTV9tYW5hZ2VyKF9NX2Z1bmN0b3IsIF9NX2Z1bmN0b3IsIF9fZGVzdHJveV9mdW5jdG9yKTsKKwkgICAgX01fbWFuYWdlciA9IDA7CisJICAgIF9NX2ludm9rZXIgPSAwOworCSAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gYXNzaWdubWVudCB0byBhIG5ldyB0YXJnZXQuCisgICAgICAgKiAgQHBhcmFtIGYgQSAlZnVuY3Rpb24gb2JqZWN0IHRoYXQgaXMgY2FsbGFibGUgd2l0aCBwYXJhbWV0ZXJzIG9mCisgICAgICAgKiAgdHlwZSBAYyBUMSwgQGMgVDIsIC4uLiwgQGMgVE4gYW5kIHJldHVybnMgYSB2YWx1ZSBjb252ZXJ0aWJsZQorICAgICAgICogIHRvIEBjIFJlcy4KKyAgICAgICAqICBAcmV0dXJuIEBjICp0aGlzCisgICAgICAgKgorICAgICAgICogIFRoaXMgICVmdW5jdGlvbiBvYmplY3Qgd3JhcHBlciB3aWxsIHRhcmdldCBhIGNvcHkgb2YgQGEKKyAgICAgICAqICBmLiBJZiBAYSBmIGlzIEBjIHJlZmVyZW5jZV93cmFwcGVyPEY+LCB0aGVuIHRoaXMgZnVuY3Rpb24KKyAgICAgICAqICBvYmplY3Qgd2lsbCBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiBvYmplY3QgQGMKKyAgICAgICAqICBmLmdldCgpLiBJZiBAYSBmIGlzIGEgTlVMTCBmdW5jdGlvbiBwb2ludGVyIG9yIE5VTEwKKyAgICAgICAqICBwb2ludGVyLXRvLW1lbWJlciwgQGMgdGhpcyBvYmplY3Qgd2lsbCBiZSBlbXB0eS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgQGEgZiBpcyBhIG5vbi1OVUxMIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYW4gb2JqZWN0IG9mIHR5cGUgQGMKKyAgICAgICAqICByZWZlcmVuY2Vfd3JhcHBlcjxGPiwgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8IWlzX2ludGVncmFsPF9GdW5jdG9yPjo6dmFsdWUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiY+OjpfX3R5cGUKKwlvcGVyYXRvcj0oX0Z1bmN0b3IgX19mKQorCXsKKwkgIGZ1bmN0aW9uKF9fZikuc3dhcCgqdGhpcyk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICAvLyBbMy43LjIuMl0gZnVuY3Rpb24gbW9kaWZpZXJzCisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBTd2FwIHRoZSB0YXJnZXRzIG9mIHR3byAlZnVuY3Rpb24gb2JqZWN0cy4KKyAgICAgICAqICBAcGFyYW0gZiBBICVmdW5jdGlvbiB3aXRoIGlkZW50aWNhbCBjYWxsIHNpZ25hdHVyZS4KKyAgICAgICAqCisgICAgICAgKiAgU3dhcCB0aGUgdGFyZ2V0cyBvZiBAYyB0aGlzIGZ1bmN0aW9uIG9iamVjdCBhbmQgQGEgZi4gVGhpcworICAgICAgICogIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQgc3dhcChmdW5jdGlvbiYgX194KQorICAgICAgeworCXN0ZDo6c3dhcChfTV9mdW5jdG9yLCBfX3guX01fZnVuY3Rvcik7CisJc3RkOjpzd2FwKF9NX21hbmFnZXIsIF9feC5fTV9tYW5hZ2VyKTsKKwlzdGQ6OnN3YXAoX01faW52b2tlciwgX194Ll9NX2ludm9rZXIpOworICAgICAgfQorCisgICAgICAvLyBbMy43LjIuM10gZnVuY3Rpb24gY2FwYWNpdHkKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIERldGVybWluZSBpZiB0aGUgJWZ1bmN0aW9uIHdyYXBwZXIgaGFzIGEgdGFyZ2V0LgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuIEBjIHRydWUgd2hlbiB0aGlzICVmdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSB0YXJnZXQsCisgICAgICAgKiAgb3IgQGMgZmFsc2Ugd2hlbiBpdCBpcyBlbXB0eS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0CisgICAgICB7IHJldHVybiAhX01fZW1wdHkoKTsgfQorI2Vsc2UKKyAgICAgIG9wZXJhdG9yIF9TYWZlX2Jvb2woKSBjb25zdAorICAgICAgeworICAgICAgICBpZiAoX01fZW1wdHkoKSkKKwkgIHJldHVybiAwOworCWVsc2UKKwkgIHJldHVybiAmX0hpZGRlbl90eXBlOjpfTV9ib29sOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIFszLjcuMi40XSBmdW5jdGlvbiBpbnZvY2F0aW9uCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJbnZva2VzIHRoZSBmdW5jdGlvbiB0YXJnZXRlZCBieSBAYyAqdGhpcy4KKyAgICAgICAqICBAcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSB0YXJnZXQuCisgICAgICAgKiAgQHRocm93cyBiYWRfZnVuY3Rpb25fY2FsbCB3aGVuIEBjICEoYm9vbCkqdGhpcworICAgICAgICoKKyAgICAgICAqICBUaGUgZnVuY3Rpb24gY2FsbCBvcGVyYXRvciBpbnZva2VzIHRoZSB0YXJnZXQgZnVuY3Rpb24gb2JqZWN0CisgICAgICAgKiAgc3RvcmVkIGJ5IEBjIHRoaXMuCisgICAgICAgKi8KKyAgICAgIF9SZXMgb3BlcmF0b3IoKShfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdDsKKworI2lmZGVmIF9fR1hYX1JUVEkKKyAgICAgIC8vIFszLjcuMi41XSBmdW5jdGlvbiB0YXJnZXQgYWNjZXNzCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBmdW5jdGlvbiBvYmplY3QKKyAgICAgICAqICB3cmFwcGVyLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJucyB0aGUgdHlwZSBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZnVuY3Rpb24gb2JqZWN0LCBvcgorICAgICAgICogIEBjIHR5cGVpZCh2b2lkKSBpZiBAYyAhKGJvb2wpKnRoaXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3QgdHlwZV9pbmZvJiB0YXJnZXRfdHlwZSgpIGNvbnN0OworICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQWNjZXNzIHRoZSBzdG9yZWQgdGFyZ2V0IGZ1bmN0aW9uIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RvcmVkIHRhcmdldCBmdW5jdGlvbiBvYmplY3QsCisgICAgICAgKiAgaWYgQGMgdHlwZWlkKEZ1bmN0b3IpLmVxdWFscyh0YXJnZXRfdHlwZSgpKTsgb3RoZXJ3aXNlLCBhIE5VTEwKKyAgICAgICAqICBwb2ludGVyLgorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+ICAgICAgIF9GdW5jdG9yKiB0YXJnZXQoKTsKKyAgICAgIAorICAgICAgLy8vIEBvdmVybG9hZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+IGNvbnN0IF9GdW5jdG9yKiB0YXJnZXQoKSBjb25zdDsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIFszLjcuMi42XSB1bmRlZmluZWQgb3BlcmF0b3JzCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rpb24+CisJdm9pZCBvcGVyYXRvcj09KGNvbnN0IGZ1bmN0aW9uPF9GdW5jdGlvbj4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdGlvbj4KKwl2b2lkIG9wZXJhdG9yIT0oY29uc3QgZnVuY3Rpb248X0Z1bmN0aW9uPiYpIGNvbnN0OworCisgICAgICB0eXBlZGVmIF9SZXMgKCpfSW52b2tlcl90eXBlKShjb25zdCBfQW55X2RhdGEmLCBfQXJnVHlwZXMuLi4pOworICAgICAgX0ludm9rZXJfdHlwZSBfTV9pbnZva2VyOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBmdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+OjoKKyAgICBmdW5jdGlvbihjb25zdCBmdW5jdGlvbiYgX194KQorICAgIDogX0Z1bmN0aW9uX2Jhc2UoKQorICAgIHsKKyAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihfX3gpKQorCXsKKwkgIF9NX2ludm9rZXIgPSBfX3guX01faW52b2tlcjsKKwkgIF9NX21hbmFnZXIgPSBfX3guX01fbWFuYWdlcjsKKwkgIF9feC5fTV9tYW5hZ2VyKF9NX2Z1bmN0b3IsIF9feC5fTV9mdW5jdG9yLCBfX2Nsb25lX2Z1bmN0b3IpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgICAgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPjo6CisgICAgICBmdW5jdGlvbihfRnVuY3RvciBfX2YsCisJICAgICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgICAgICFpc19pbnRlZ3JhbDxfRnVuY3Rvcj46OnZhbHVlLCBfVXNlbGVzcz46Ol9fdHlwZSkKKyAgICAgIDogX0Z1bmN0aW9uX2Jhc2UoKQorICAgICAgeworCXR5cGVkZWYgX0Z1bmN0aW9uX2hhbmRsZXI8X1NpZ25hdHVyZV90eXBlLCBfRnVuY3Rvcj4gX015X2hhbmRsZXI7CisKKwlpZiAoX015X2hhbmRsZXI6Ol9NX25vdF9lbXB0eV9mdW5jdGlvbihfX2YpKQorCSAgeworCSAgICBfTV9pbnZva2VyID0gJl9NeV9oYW5kbGVyOjpfTV9pbnZva2U7CisJICAgIF9NX21hbmFnZXIgPSAmX015X2hhbmRsZXI6Ol9NX21hbmFnZXI7CisJICAgIF9NeV9oYW5kbGVyOjpfTV9pbml0X2Z1bmN0b3IoX01fZnVuY3RvciwgX19mKTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgX1JlcworICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgIG9wZXJhdG9yKCkoX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICB7CisgICAgICBpZiAoX01fZW1wdHkoKSkKKwlfR0xJQkNYWF9USFJPV19PUl9BQk9SVChiYWRfZnVuY3Rpb25fY2FsbCgpKTsKKyAgICAgIHJldHVybiBfTV9pbnZva2VyKF9NX2Z1bmN0b3IsIF9fYXJncy4uLik7CisgICAgfQorCisjaWZkZWYgX19HWFhfUlRUSQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY29uc3QgdHlwZV9pbmZvJgorICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgIHRhcmdldF90eXBlKCkgY29uc3QKKyAgICB7CisgICAgICBpZiAoX01fbWFuYWdlcikKKyAgICAgICAgeworICAgICAgICAgIF9BbnlfZGF0YSBfX3R5cGVpbmZvX3Jlc3VsdDsKKyAgICAgICAgICBfTV9tYW5hZ2VyKF9fdHlwZWluZm9fcmVzdWx0LCBfTV9mdW5jdG9yLCBfX2dldF90eXBlX2luZm8pOworICAgICAgICAgIHJldHVybiAqX190eXBlaW5mb19yZXN1bHQuX01fYWNjZXNzPGNvbnN0IHR5cGVfaW5mbyo+KCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwlyZXR1cm4gdHlwZWlkKHZvaWQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBfRnVuY3RvcioKKyAgICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgICAgdGFyZ2V0KCkKKyAgICAgIHsKKwlpZiAodHlwZWlkKF9GdW5jdG9yKSA9PSB0YXJnZXRfdHlwZSgpICYmIF9NX21hbmFnZXIpCisJICB7CisJICAgIF9BbnlfZGF0YSBfX3B0cjsKKwkgICAgaWYgKF9NX21hbmFnZXIoX19wdHIsIF9NX2Z1bmN0b3IsIF9fZ2V0X2Z1bmN0b3JfcHRyKQorCQkmJiAhaXNfY29uc3Q8X0Z1bmN0b3I+Ojp2YWx1ZSkKKwkgICAgICByZXR1cm4gMDsKKwkgICAgZWxzZQorCSAgICAgIHJldHVybiBfX3B0ci5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpOworCSAgfQorCWVsc2UKKwkgIHJldHVybiAwOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICAgIGNvbnN0IF9GdW5jdG9yKgorICAgICAgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPjo6CisgICAgICB0YXJnZXQoKSBjb25zdAorICAgICAgeworCWlmICh0eXBlaWQoX0Z1bmN0b3IpID09IHRhcmdldF90eXBlKCkgJiYgX01fbWFuYWdlcikKKwkgIHsKKwkgICAgX0FueV9kYXRhIF9fcHRyOworCSAgICBfTV9tYW5hZ2VyKF9fcHRyLCBfTV9mdW5jdG9yLCBfX2dldF9mdW5jdG9yX3B0cik7CisJICAgIHJldHVybiBfX3B0ci5fTV9hY2Nlc3M8Y29uc3QgX0Z1bmN0b3IqPigpOworCSAgfQorCWVsc2UKKwkgIHJldHVybiAwOworICAgICAgfQorI2VuZGlmCisKKyAgLy8gWzMuNy4yLjddIG51bGwgcG9pbnRlciBjb21wYXJpc29ucworCisgIC8qKgorICAgKiAgQGJyaWVmIENvbXBhcmVzIGEgcG9seW1vcnBoaWMgZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXIgYWdhaW5zdCAwCisgICAqICAodGhlIE5VTEwgcG9pbnRlcikuCisgICAqICBAcmV0dXJucyBAYyB0cnVlIGlmIHRoZSB3cmFwcGVyIGhhcyBubyB0YXJnZXQsIEBjIGZhbHNlIG90aGVyd2lzZQorICAgKgorICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZnVuY3Rpb248X1NpZ25hdHVyZT4mIF9fZiwgX01fY2xlYXJfdHlwZSopCisgICAgeyByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KF9fZik7IH0KKworICAvLy8gQG92ZXJsb2FkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KF9NX2NsZWFyX3R5cGUqLCBjb25zdCBmdW5jdGlvbjxfU2lnbmF0dXJlPiYgX19mKQorICAgIHsgcmV0dXJuICFzdGF0aWNfY2FzdDxib29sPihfX2YpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29tcGFyZXMgYSBwb2x5bW9ycGhpYyBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlciBhZ2FpbnN0IDAKKyAgICogICh0aGUgTlVMTCBwb2ludGVyKS4KKyAgICogIEByZXR1cm5zIEBjIGZhbHNlIGlmIHRoZSB3cmFwcGVyIGhhcyBubyB0YXJnZXQsIEBjIHRydWUgb3RoZXJ3aXNlCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBmdW5jdGlvbjxfU2lnbmF0dXJlPiYgX19mLCBfTV9jbGVhcl90eXBlKikKKyAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxib29sPihfX2YpOyB9CisKKyAgLy8vIEBvdmVybG9hZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShfTV9jbGVhcl90eXBlKiwgY29uc3QgZnVuY3Rpb248X1NpZ25hdHVyZT4mIF9fZikKKyAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxib29sPihfX2YpOyB9CisKKyAgLy8gWzMuNy4yLjhdIHNwZWNpYWxpemVkIGFsZ29yaXRobXMKKworICAvKioKKyAgICogIEBicmllZiBTd2FwIHRoZSB0YXJnZXRzIG9mIHR3byBwb2x5bW9ycGhpYyBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlcnMuCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChmdW5jdGlvbjxfU2lnbmF0dXJlPiYgX194LCBmdW5jdGlvbjxfU2lnbmF0dXJlPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBpc19wbGFjZWhvbGRlcjsKKworICB0ZW1wbGF0ZTxpbnQgX051bT4KKyAgICBzdHJ1Y3QgaXNfcGxhY2Vob2xkZXI8dHIxOjpfUGxhY2Vob2xkZXI8X051bT4+CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxpbnQsIF9OdW0+CisgICAgeyB9OworCisgIHRlbXBsYXRlPGludCBfTnVtPgorICAgIHN0cnVjdCBpc19wbGFjZWhvbGRlcjxjb25zdCB0cjE6Ol9QbGFjZWhvbGRlcjxfTnVtPj4KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGludCwgX051bT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb247CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPHRyMTo6X0JpbmQ8X1NpZ25hdHVyZT4+CisgICAgOiB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxjb25zdCB0cjE6Ol9CaW5kPF9TaWduYXR1cmU+PgorICAgIDogdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248dm9sYXRpbGUgdHIxOjpfQmluZDxfU2lnbmF0dXJlPj4KKyAgICA6IHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IHZvbGF0aWxlIHRyMTo6X0JpbmQ8X1NpZ25hdHVyZT4+CisgICAgOiB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjx0cjE6Ol9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfU2lnbmF0dXJlPj4KKyAgICA6IHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IHRyMTo6X0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+PgorICAgIDogdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248dm9sYXRpbGUgdHIxOjpfQmluZF9yZXN1bHQ8X1Jlc3VsdCwgX1NpZ25hdHVyZT4+CisgICAgOiB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxjb25zdCB2b2xhdGlsZSB0cjE6Ol9CaW5kX3Jlc3VsdDxfUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NpZ25hdHVyZT4+CisgICAgOiB0cnVlX3R5cGUgeyB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyNlbmRpZgorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0ZVTkNUSU9OQUwKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2Z1bmN0aW9uYWxfaGFzaC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZnVuY3Rpb25hbF9oYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3NGExNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2Z1bmN0aW9uYWxfaGFzaC5oCkBAIC0wLDAgKzEsMTk2IEBACisvLyBUUjEgZnVuY3Rpb25hbF9oYXNoLmggaGVhZGVyIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvZnVuY3Rpb25hbF9oYXNoLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvZnVuY3Rpb25hbH0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9GVU5DVElPTkFMX0hBU0hfSAorI2RlZmluZSBfR0xJQkNYWF9UUjFfRlVOQ1RJT05BTF9IQVNIX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLy8gQ2xhc3MgdGVtcGxhdGUgaGFzaC4KKyAgLy8gRGVjbGFyYXRpb24gb2YgZGVmYXVsdCBoYXNoIGZ1bmN0b3Igc3RkOjp0cjE6Omhhc2guICBUaGUgdHlwZXMgZm9yCisgIC8vIHdoaWNoIHN0ZDo6dHIxOjpoYXNoPFQ+IGlzIHdlbGwtZGVmaW5lZCBpcyBpbiBjbGF1c2UgNi4zLjMuIG9mIHRoZSBQRFRSLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc2ggOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjxfVHAsIHNpemVfdD4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoX1RwIF9fdmFsKSBjb25zdDsKKyAgICB9OworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9ucyBmb3IgcG9pbnRlciB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNoPF9UcCo+IDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248X1RwKiwgc2l6ZV90PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShfVHAqIF9fcCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihfX3ApOyB9CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb25zIGZvciBpbnRlZ2VyIHR5cGVzLgorI2RlZmluZSBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKF9UcCkgCVwKKyAgdGVtcGxhdGU8PgkJCQkJCVwKKyAgICBpbmxpbmUgc2l6ZV90CQkJCQlcCisgICAgaGFzaDxfVHA+OjpvcGVyYXRvcigpKF9UcCBfX3ZhbCkgY29uc3QJCVwKKyAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fdmFsKTsgfQorCisgIF9UUjFfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goYm9vbCk7CisgIF9UUjFfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goY2hhcik7CisgIF9UUjFfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goc2lnbmVkIGNoYXIpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIGNoYXIpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHdjaGFyX3QpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHNob3J0KTsKKyAgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChpbnQpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGxvbmcpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGxvbmcgbG9uZyk7CisgIF9UUjFfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2godW5zaWduZWQgc2hvcnQpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIGludCk7CisgIF9UUjFfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2godW5zaWduZWQgbG9uZyk7CisgIF9UUjFfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2godW5zaWduZWQgbG9uZyBsb25nKTsKKworI3VuZGVmIF9UUjFfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2gKKworICAvLyBGb3dsZXIgLyBOb2xsIC8gVm8gKEZOVikgSGFzaCAodHlwZSBGTlYtMWEpCisgIC8vIChVc2VkIGJ5IHRoZSBuZXh0IHNwZWNpYWxpemF0aW9ucyBvZiBzdGQ6OnRyMTo6aGFzaC4pCisKKyAgLy8vIER1bW15IGdlbmVyaWMgaW1wbGVtZW50YXRpb24gKGZvciBzaXplb2Yoc2l6ZV90KSAhPSA0LCA4KS4KKyAgdGVtcGxhdGU8c2l6ZV90PgorICAgIHN0cnVjdCBfRm52X2hhc2hfYmFzZQorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIHNpemVfdAorICAgICAgICBoYXNoKGNvbnN0IF9UcCogX19wdHIsIHNpemVfdCBfX2NsZW5ndGgpCisgICAgICAgIHsKKwkgIHNpemVfdCBfX3Jlc3VsdCA9IDA7CisJICBjb25zdCBjaGFyKiBfX2NwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihfX3B0cik7CisJICBmb3IgKDsgX19jbGVuZ3RoOyAtLV9fY2xlbmd0aCkKKwkgICAgX19yZXN1bHQgPSAoX19yZXN1bHQgKiAxMzEpICsgKl9fY3B0cisrOworCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX0Zudl9oYXNoX2Jhc2U8ND4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyBzaXplX3QKKyAgICAgICAgaGFzaChjb25zdCBfVHAqIF9fcHRyLCBzaXplX3QgX19jbGVuZ3RoKQorICAgICAgICB7CisJICBzaXplX3QgX19yZXN1bHQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KDIxNjYxMzYyNjFVTCk7CisJICBjb25zdCBjaGFyKiBfX2NwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihfX3B0cik7CisJICBmb3IgKDsgX19jbGVuZ3RoOyAtLV9fY2xlbmd0aCkKKwkgICAgeworCSAgICAgIF9fcmVzdWx0IF49IHN0YXRpY19jYXN0PHNpemVfdD4oKl9fY3B0cisrKTsKKwkgICAgICBfX3Jlc3VsdCAqPSBzdGF0aWNfY2FzdDxzaXplX3Q+KDE2Nzc3NjE5VUwpOworCSAgICB9CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgIH07CisgIAorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9GbnZfaGFzaF9iYXNlPDg+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICAgIGhhc2goY29uc3QgX1RwKiBfX3B0ciwgc2l6ZV90IF9fY2xlbmd0aCkKKyAgICAgICAgeworCSAgc2l6ZV90IF9fcmVzdWx0CisJICAgID0gc3RhdGljX2Nhc3Q8c2l6ZV90PigxNDY5NTk4MTAzOTM0NjY1NjAzN1VMTCk7CisJICBjb25zdCBjaGFyKiBfX2NwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihfX3B0cik7CisJICBmb3IgKDsgX19jbGVuZ3RoOyAtLV9fY2xlbmd0aCkKKwkgICAgeworCSAgICAgIF9fcmVzdWx0IF49IHN0YXRpY19jYXN0PHNpemVfdD4oKl9fY3B0cisrKTsKKwkgICAgICBfX3Jlc3VsdCAqPSBzdGF0aWNfY2FzdDxzaXplX3Q+KDEwOTk1MTE2MjgyMTFVTEwpOworCSAgICB9CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgIH07CisKKyAgc3RydWN0IF9GbnZfaGFzaAorICA6IHB1YmxpYyBfRm52X2hhc2hfYmFzZTxzaXplb2Yoc2l6ZV90KT4KKyAgeworICAgIHVzaW5nIF9GbnZfaGFzaF9iYXNlPHNpemVvZihzaXplX3QpPjo6aGFzaDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0YXRpYyBzaXplX3QKKyAgICAgIGhhc2goY29uc3QgX1RwJiBfX3ZhbCkKKyAgICAgIHsgcmV0dXJuIGhhc2goJl9fdmFsLCBzaXplb2YoX192YWwpKTsgfQorICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbnMgZm9yIGZsb2F0LgorICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHNpemVfdAorICAgIGhhc2g8ZmxvYXQ+OjpvcGVyYXRvcigpKGZsb2F0IF9fdmFsKSBjb25zdAorICAgIHsKKyAgICAgIC8vIDAgYW5kIC0wIGJvdGggaGFzaCB0byB6ZXJvLgorICAgICAgcmV0dXJuIF9fdmFsICE9IDAuMGYgPyBzdGQ6OnRyMTo6X0Zudl9oYXNoOjpoYXNoKF9fdmFsKSA6IDA7CisgICAgfQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbnMgZm9yIGRvdWJsZS4KKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzaXplX3QKKyAgICBoYXNoPGRvdWJsZT46Om9wZXJhdG9yKCkoZG91YmxlIF9fdmFsKSBjb25zdAorICAgIHsKKyAgICAgIC8vIDAgYW5kIC0wIGJvdGggaGFzaCB0byB6ZXJvLgorICAgICAgcmV0dXJuIF9fdmFsICE9IDAuMCA/IHN0ZDo6dHIxOjpfRm52X2hhc2g6Omhhc2goX192YWwpIDogMDsKKyAgICB9CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9ucyBmb3IgbG9uZyBkb3VibGUuCisgIHRlbXBsYXRlPD4KKyAgICBfR0xJQkNYWF9QVVJFIHNpemVfdAorICAgIGhhc2g8bG9uZyBkb3VibGU+OjpvcGVyYXRvcigpKGxvbmcgZG91YmxlIF9fdmFsKSBjb25zdDsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gb2YgbWVtYmVyIG9wZXJhdG9yIGZvciBub24tYnVpbHRpbiB0eXBlcy4KKyAgdGVtcGxhdGU8PgorICAgIF9HTElCQ1hYX1BVUkUgc2l6ZV90CisgICAgaGFzaDxzdHJpbmc+OjpvcGVyYXRvcigpKHN0cmluZykgY29uc3Q7CisKKyAgdGVtcGxhdGU8PgorICAgIF9HTElCQ1hYX1BVUkUgc2l6ZV90CisgICAgaGFzaDxjb25zdCBzdHJpbmcmPjo6b3BlcmF0b3IoKShjb25zdCBzdHJpbmcmKSBjb25zdDsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICBfR0xJQkNYWF9QVVJFIHNpemVfdAorICAgIGhhc2g8d3N0cmluZz46Om9wZXJhdG9yKCkod3N0cmluZykgY29uc3Q7CisKKyAgdGVtcGxhdGU8PgorICAgIF9HTElCQ1hYX1BVUkUgc2l6ZV90CisgICAgaGFzaDxjb25zdCB3c3RyaW5nJj46Om9wZXJhdG9yKCkoY29uc3Qgd3N0cmluZyYpIGNvbnN0OworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0ZVTkNUSU9OQUxfSEFTSF9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9nYW1tYS50Y2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9nYW1tYS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjMTlhMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2dhbW1hLnRjYwpAQCAtMCwwICsxLDQ2OSBAQAorLy8gU3BlY2lhbCBmdW5jdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvZ2FtbWEudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2NtYXRofQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyIFRSMTogNS4yICBTcGVjaWFsIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBFZHdhcmQgU21pdGgtUm93bGFuZCBiYXNlZCBvbjoKKy8vICAgKDEpIEhhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMsCisvLyAgICAgICBlZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKy8vICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywKKy8vICAgICAgIFNlY3Rpb24gNiwgcHAuIDI1My0yNjYKKy8vICAgKDIpIFRoZSBHbnUgU2NpZW50aWZpYyBMaWJyYXJ5LCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3NsCisvLyAgICgzKSBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCBieSBXLiBILiBQcmVzcywgUy4gQS4gVGV1a29sc2t5LAorLy8gICAgICAgVy4gVC4gVmV0dGVybGluZywgQi4gUC4gRmxhbm5lcnksIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzICgxOTkyKSwKKy8vICAgICAgIDJuZCBlZCwgcHAuIDIxMy0yMTYKKy8vICAgKDQpIEdhbW1hLCBFeHBsb3JpbmcgRXVsZXIncyBDb25zdGFudCwgSnVsaWFuIEhhdmlsLAorLy8gICAgICAgUHJpbmNldG9uLCAyMDAzLgorCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9HQU1NQV9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0dBTU1BX1RDQyAxCisKKyNpbmNsdWRlICJzcGVjaWFsX2Z1bmN0aW9uX3V0aWwuaCIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBUaGlzIHJldHVybnMgQmVybm91bGxpIG51bWJlcnMgZnJvbSBhIHRhYmxlIG9yIGJ5IHN1bW1hdGlvbgorICAgICAqICAgICAgICAgIGZvciBsYXJnZXIgdmFsdWVzLgorICAgICAqCisgICAgICogICBSZWN1cnNpb24gaXMgdW5zdGFibGUuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX24gdGhlIG9yZGVyIG4gb2YgdGhlIEJlcm5vdWxsaSBudW1iZXIuCisgICAgICogICBAcmV0dXJuICBUaGUgQmVybm91bGxpIG51bWJlciBvZiBvcmRlciBuLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19iZXJub3VsbGlfc2VyaWVzKHVuc2lnbmVkIGludCBfX24pCisgICAgeworCisgICAgICBzdGF0aWMgY29uc3QgX1RwIF9fbnVtWzI4XSA9IHsKKyAgICAgICAgX1RwKDFVTCksICAgICAgICAgICAgICAgICAgICAgICAgLV9UcCgxVUwpIC8gX1RwKDJVTCksCisgICAgICAgIF9UcCgxVUwpIC8gX1RwKDZVTCksICAgICAgICAgICAgIF9UcCgwVUwpLAorICAgICAgICAtX1RwKDFVTCkgLyBfVHAoMzBVTCksICAgICAgICAgICBfVHAoMFVMKSwKKyAgICAgICAgX1RwKDFVTCkgLyBfVHAoNDJVTCksICAgICAgICAgICAgX1RwKDBVTCksCisgICAgICAgIC1fVHAoMVVMKSAvIF9UcCgzMFVMKSwgICAgICAgICAgIF9UcCgwVUwpLAorICAgICAgICBfVHAoNVVMKSAvIF9UcCg2NlVMKSwgICAgICAgICAgICBfVHAoMFVMKSwKKyAgICAgICAgLV9UcCg2OTFVTCkgLyBfVHAoMjczMFVMKSwgICAgICAgX1RwKDBVTCksCisgICAgICAgIF9UcCg3VUwpIC8gX1RwKDZVTCksICAgICAgICAgICAgIF9UcCgwVUwpLAorICAgICAgICAtX1RwKDM2MTdVTCkgLyBfVHAoNTEwVUwpLCAgICAgICBfVHAoMFVMKSwKKyAgICAgICAgX1RwKDQzODY3VUwpIC8gX1RwKDc5OFVMKSwgICAgICAgX1RwKDBVTCksCisgICAgICAgIC1fVHAoMTc0NjExKSAvIF9UcCgzMzBVTCksICAgICAgIF9UcCgwVUwpLAorICAgICAgICBfVHAoODU0NTEzVUwpIC8gX1RwKDEzOFVMKSwgICAgICBfVHAoMFVMKSwKKyAgICAgICAgLV9UcCgyMzYzNjQwOTFVTCkgLyBfVHAoMjczMFVMKSwgX1RwKDBVTCksCisgICAgICAgIF9UcCg4NTUzMTAzVUwpIC8gX1RwKDZVTCksICAgICAgIF9UcCgwVUwpCisgICAgICB9OworCisgICAgICBpZiAoX19uID09IDApCisgICAgICAgIHJldHVybiBfVHAoMSk7CisKKyAgICAgIGlmIChfX24gPT0gMSkKKyAgICAgICAgcmV0dXJuIC1fVHAoMSkgLyBfVHAoMik7CisKKyAgICAgIC8vICBUYWtlIGNhcmUgb2YgdGhlIHJlc3Qgb2YgdGhlIG9kZCBvbmVzLgorICAgICAgaWYgKF9fbiAlIDIgPT0gMSkKKyAgICAgICAgcmV0dXJuIF9UcCgwKTsKKworICAgICAgLy8gIFRha2UgY2FyZSBvZiBzb21lIHNtYWxsIGV2ZW5zIHRoYXQgYXJlIHBhaW5mdWwgZm9yIHRoZSBzZXJpZXMuCisgICAgICBpZiAoX19uIDwgMjgpCisgICAgICAgIHJldHVybiBfX251bVtfX25dOworCisKKyAgICAgIF9UcCBfX2ZhY3QgPSBfVHAoMSk7CisgICAgICBpZiAoKF9fbiAvIDIpICUgMiA9PSAwKQorICAgICAgICBfX2ZhY3QgKj0gX1RwKC0xKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9fayA9IDE7IF9fayA8PSBfX247ICsrX19rKQorICAgICAgICBfX2ZhY3QgKj0gX19rIC8gKF9UcCgyKSAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpKTsKKyAgICAgIF9fZmFjdCAqPSBfVHAoMik7CisKKyAgICAgIF9UcCBfX3N1bSA9IF9UcCgwKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDE7IF9faSA8IDEwMDA7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fdGVybSA9IHN0ZDo6cG93KF9UcChfX2kpLCAtX1RwKF9fbikpOworICAgICAgICAgIGlmIChfX3Rlcm0gPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIF9fc3VtICs9IF9fdGVybTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19mYWN0ICogX19zdW07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBUaGlzIHJldHVybnMgQmVybm91bGxpIG51bWJlciBcZiRCX25cZiQuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX24gdGhlIG9yZGVyIG4gb2YgdGhlIEJlcm5vdWxsaSBudW1iZXIuCisgICAgICogICBAcmV0dXJuICBUaGUgQmVybm91bGxpIG51bWJlciBvZiBvcmRlciBuLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX19iZXJub3VsbGkoaW50IF9fbikKKyAgICB7IHJldHVybiBfX2Jlcm5vdWxsaV9zZXJpZXM8X1RwPihfX24pOyB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiBcZiRsb2coXEdhbW1hKHgpKVxmJCBieSBhc3ltcHRvdGljIGV4cGFuc2lvbgorICAgICAqICAgICAgICAgIHdpdGggQmVybm91bGxpIG51bWJlciBjb2VmZmljaWVudHMuICBUaGlzIGlzIGxpa2UKKyAgICAgKiAgICAgICAgICBTdGVybGluZydzIGFwcHJveGltYXRpb24uCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBsb2cgb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGxvZ2FyaXRobSBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fbG9nX2dhbW1hX2Jlcm5vdWxsaShfVHAgX194KQorICAgIHsKKyAgICAgIF9UcCBfX2xnID0gKF9feCAtIF9UcCgwLjVMKSkgKiBzdGQ6OmxvZyhfX3gpIC0gX194CisgICAgICAgICAgICAgICArIF9UcCgwLjVMKSAqIHN0ZDo6bG9nKF9UcCgyKQorICAgICAgICAgICAgICAgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSk7CisKKyAgICAgIGNvbnN0IF9UcCBfX3h4ID0gX194ICogX194OworICAgICAgX1RwIF9faGVscCA9IF9UcCgxKSAvIF9feDsKKyAgICAgIGZvciAoIHVuc2lnbmVkIGludCBfX2kgPSAxOyBfX2kgPCAyMDsgKytfX2kgKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fMmkgPSBfVHAoMiAqIF9faSk7CisgICAgICAgICAgX19oZWxwIC89IF9fMmkgKiAoX18yaSAtIF9UcCgxKSkgKiBfX3h4OworICAgICAgICAgIF9fbGcgKz0gX19iZXJub3VsbGk8X1RwPigyICogX19pKSAqIF9faGVscDsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19sZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiBcZiRsb2coXEdhbW1hKHgpKVxmJCBieSB0aGUgTGFuY3pvcyBtZXRob2QuCisgICAgICogICAgICAgICAgVGhpcyBtZXRob2QgZG9taW5hdGVzIGFsbCBvdGhlcnMgb24gdGhlIHBvc2l0aXZlIGF4aXMgSSB0aGluay4KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgYXJndW1lbnQgb2YgdGhlIGxvZyBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgbG9nYXJpdGhtIG9mIHRoZSBnYW1tYSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19sb2dfZ2FtbWFfbGFuY3pvcyhfVHAgX194KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX3htMSA9IF9feCAtIF9UcCgxKTsKKworICAgICAgc3RhdGljIGNvbnN0IF9UcCBfX2xhbmN6b3NfY2hlYl83WzldID0geworICAgICAgIF9UcCggMC45OTk5OTk5OTk5OTk4MDk5MzIyNzY4NDcwMDQ3MzQ3OEwpLAorICAgICAgIF9UcCggNjc2LjUyMDM2ODEyMTg4NTA5ODU2NzAwOTE5MDQ0NDAxOUwpLAorICAgICAgIF9UcCgtMTI1OS4xMzkyMTY3MjI0MDI4NzA0NzE1NjA3ODc1NTI4M0wpLAorICAgICAgIF9UcCggNzcxLjMyMzQyODc3NzY1MzA3ODg0ODY1MjgyNTg4OTRMKSwKKyAgICAgICBfVHAoLTE3Ni42MTUwMjkxNjIxNDA1OTkwNjU4NDU1MTM1NEwpLAorICAgICAgIF9UcCggMTIuNTA3MzQzMjc4Njg2OTA0ODE0NDU4OTM2ODUzTCksCisgICAgICAgX1RwKC0wLjEzODU3MTA5NTI2NTcyMDExNjg5NTU0NzA3TCksCisgICAgICAgX1RwKCA5Ljk4NDM2OTU3ODAxOTU3MDg1OTU2M2UtNkwpLAorICAgICAgIF9UcCggMS41MDU2MzI3MzUxNDkzMTE1NTgzNGUtN0wpCisgICAgICB9OworCisgICAgICBzdGF0aWMgY29uc3QgX1RwIF9fTE9HUk9PVDJQSQorICAgICAgICAgID0gX1RwKDAuOTE4OTM4NTMzMjA0NjcyNzQxNzgwMzI5NzM2NDA1NjE3NkwpOworCisgICAgICBfVHAgX19zdW0gPSBfX2xhbmN6b3NfY2hlYl83WzBdOworICAgICAgZm9yKHVuc2lnbmVkIGludCBfX2sgPSAxOyBfX2sgPCA5OyArK19faykKKyAgICAgICAgX19zdW0gKz0gX19sYW5jem9zX2NoZWJfN1tfX2tdIC8gKF9feG0xICsgX19rKTsKKworICAgICAgY29uc3QgX1RwIF9fdGVybTEgPSAoX194bTEgKyBfVHAoMC41TCkpCisgICAgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6bG9nKChfX3htMSArIF9UcCg3LjVMKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLyBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fZXVsZXIoKSk7CisgICAgICBjb25zdCBfVHAgX190ZXJtMiA9IF9fTE9HUk9PVDJQSSArIHN0ZDo6bG9nKF9fc3VtKTsKKyAgICAgIGNvbnN0IF9UcCBfX3Jlc3VsdCA9IF9fdGVybTEgKyAoX190ZXJtMiAtIF9UcCg3KSk7CisKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiBcZiQgbG9nKHxcR2FtbWEoeCl8KSBcZiQuCisgICAgICogICAgICAgICAgVGhpcyB3aWxsIHJldHVybiB2YWx1ZXMgZXZlbiBmb3IgXGYkIHggPCAwIFxmJC4KKyAgICAgKiAgICAgICAgICBUbyByZWNvdmVyIHRoZSBzaWduIG9mIFxmJCBcR2FtbWEoeCkgXGYkIGZvcgorICAgICAqICAgICAgICAgIGFueSBhcmd1bWVudCB1c2UgQGEgX19sb2dfZ2FtbWFfc2lnbi4KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgYXJndW1lbnQgb2YgdGhlIGxvZyBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgbG9nYXJpdGhtIG9mIHRoZSBnYW1tYSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19sb2dfZ2FtbWEoX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX194ID4gX1RwKDAuNUwpKQorICAgICAgICByZXR1cm4gX19sb2dfZ2FtbWFfbGFuY3pvcyhfX3gpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fc2luX2ZhY3QKKyAgICAgICAgICAgICAgICAgPSBzdGQ6OmFicyhzdGQ6OnNpbihfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSAqIF9feCkpOworICAgICAgICAgIGlmIChfX3Npbl9mYWN0ID09IF9UcCgwKSkKKyAgICAgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCBpcyBub25wb3NpdGl2ZSBpbnRlZ2VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2xvZ19nYW1tYSIpKTsKKyAgICAgICAgICByZXR1cm4gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX2xucGkoKQorICAgICAgICAgICAgICAgICAgICAgLSBzdGQ6OmxvZyhfX3Npbl9mYWN0KQorICAgICAgICAgICAgICAgICAgICAgLSBfX2xvZ19nYW1tYV9sYW5jem9zKF9UcCgxKSAtIF9feCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgc2lnbiBvZiBcZiQgXEdhbW1hKHgpIFxmJC4KKyAgICAgKiAgICAgICAgICBBdCBub25wb3NpdGl2ZSBpbnRlZ2VycyB6ZXJvIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogICBAcGFyYW0gX194IFRoZSBhcmd1bWVudCBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgc2lnbiBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fbG9nX2dhbW1hX3NpZ24oX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX194ID4gX1RwKDApKQorICAgICAgICByZXR1cm4gX1RwKDEpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fc2luX2ZhY3QKKyAgICAgICAgICAgICAgICAgID0gc3RkOjpzaW4oX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkgKiBfX3gpOworICAgICAgICAgIGlmIChfX3Npbl9mYWN0ID4gX1RwKDApKQorICAgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgICBlbHNlIGlmIChfX3Npbl9mYWN0IDwgX1RwKDApKQorICAgICAgICAgICAgcmV0dXJuIC1fVHAoMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIF9UcCgwKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgdGhlIGJpbm9taWFsIGNvZWZmaWNpZW50LgorICAgICAqICAgVGhlIGJpbm9taWFsIGNvZWZmaWNpZW50IGlzIGdpdmVuIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICBcbGVmdCggIFxyaWdodCkgPSBcZnJhY3tuIX17KG4taykhIGshfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX24gVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBiaW5vbWlhbCBjb2VmZmljaWVudC4KKyAgICAgKiAgIEBwYXJhbSBfX2sgVGhlIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgYmlub21pYWwgY29lZmZpY2llbnQuCisgICAgICogICBAcmV0dXJuICBUaGUgYmlub21pYWwgY29lZmZpY2llbnQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fbG9nX2JpbmNvZWYodW5zaWduZWQgaW50IF9fbiwgdW5zaWduZWQgaW50IF9faykKKyAgICB7CisgICAgICAvLyAgTWF4IGUgZXhwb25lbnQgYmVmb3JlIG92ZXJmbG93LgorICAgICAgc3RhdGljIGNvbnN0IF9UcCBfX21heF9iaW5jb2VmZgorICAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptYXhfZXhwb25lbnQxMAorICAgICAgICAgICAgICAgICAgICAgICogc3RkOjpsb2coX1RwKDEwKSkgLSBfVHAoMSk7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgX1RwIF9fY29lZmYgPSAgc3RkOjp0cjE6OmxnYW1tYShfVHAoMSArIF9fbikpCisgICAgICAgICAgICAgICAgICAtIHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKDEgKyBfX2spKQorICAgICAgICAgICAgICAgICAgLSBzdGQ6OnRyMTo6bGdhbW1hKF9UcCgxICsgX19uIC0gX19rKSk7CisjZWxzZQorICAgICAgX1RwIF9fY29lZmYgPSAgX19sb2dfZ2FtbWEoX1RwKDEgKyBfX24pKQorICAgICAgICAgICAgICAgICAgLSBfX2xvZ19nYW1tYShfVHAoMSArIF9faykpCisgICAgICAgICAgICAgICAgICAtIF9fbG9nX2dhbW1hKF9UcCgxICsgX19uIC0gX19rKSk7CisjZW5kaWYKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgYmlub21pYWwgY29lZmZpY2llbnQuCisgICAgICogICBUaGUgYmlub21pYWwgY29lZmZpY2llbnQgaXMgZ2l2ZW4gYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgIFxsZWZ0KCAgXHJpZ2h0KSA9IFxmcmFje24hfXsobi1rKSEgayF9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9fbiBUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGJpbm9taWFsIGNvZWZmaWNpZW50LgorICAgICAqICAgQHBhcmFtIF9fayBUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBiaW5vbWlhbCBjb2VmZmljaWVudC4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBiaW5vbWlhbCBjb2VmZmljaWVudC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19iaW5jb2VmKHVuc2lnbmVkIGludCBfX24sIHVuc2lnbmVkIGludCBfX2spCisgICAgeworICAgICAgLy8gIE1heCBlIGV4cG9uZW50IGJlZm9yZSBvdmVyZmxvdy4KKyAgICAgIHN0YXRpYyBjb25zdCBfVHAgX19tYXhfYmluY29lZmYKKyAgICAgICAgICAgICAgICAgICAgICA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWF4X2V4cG9uZW50MTAKKyAgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6bG9nKF9UcCgxMCkpIC0gX1RwKDEpOworCisgICAgICBjb25zdCBfVHAgX19sb2dfY29lZmYgPSBfX2xvZ19iaW5jb2VmPF9UcD4oX19uLCBfX2spOworICAgICAgaWYgKF9fbG9nX2NvZWZmID4gX19tYXhfYmluY29lZmYpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gc3RkOjpleHAoX19sb2dfY29lZmYpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIFxmJCBcR2FtbWEoeCkgXGYkLgorICAgICAqCisgICAgICogICBAcGFyYW0gX194IFRoZSBhcmd1bWVudCBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZ2FtbWEgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfX2dhbW1hKF9UcCBfX3gpCisgICAgeyByZXR1cm4gc3RkOjpleHAoX19sb2dfZ2FtbWEoX194KSk7IH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgZGlnYW1tYSBmdW5jdGlvbiBieSBzZXJpZXMgZXhwYW5zaW9uLgorICAgICAqICAgVGhlIGRpZ2FtbWEgb3IgQGYkIFxwc2koeCkgQGYkIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkKKyAgICAgKiAgIEBmWworICAgICAqICAgICBccHNpKHgpID0gXGZyYWN7XEdhbW1hJyh4KX17XEdhbW1hKHgpfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIFRoZSBzZXJpZXMgaXMgZ2l2ZW4gYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHBzaSh4KSA9IC1cZ2FtbWFfRSAtIFxmcmFjezF9e3h9CisgICAgICogICAgICAgICAgICAgIFxzdW1fe2s9MX1ee1xpbmZ0eX0gXGZyYWN7eH17ayh4ICsgayl9CisgICAgICogICBAZl0KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19wc2lfc2VyaWVzKF9UcCBfX3gpCisgICAgeworICAgICAgX1RwIF9fc3VtID0gLV9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19nYW1tYV9lKCkgLSBfVHAoMSkgLyBfX3g7CisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDAwMDsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9fayA9IDE7IF9fayA8IF9fbWF4X2l0ZXI7ICsrX19rKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fdGVybSA9IF9feCAvIChfX2sgKiAoX19rICsgX194KSk7CisgICAgICAgICAgX19zdW0gKz0gX190ZXJtOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0gLyBfX3N1bSkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICByZXR1cm4gX19zdW07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBkaWdhbW1hIGZ1bmN0aW9uIGZvciBsYXJnZSBhcmd1bWVudC4KKyAgICAgKiAgIFRoZSBkaWdhbW1hIG9yIEBmJCBccHNpKHgpIEBmJCBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHBzaSh4KSA9IFxmcmFje1xHYW1tYScoeCl9e1xHYW1tYSh4KX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBUaGUgYXN5bXB0b3RpYyBzZXJpZXMgaXMgZ2l2ZW4gYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHBzaSh4KSA9IFxsbih4KSAtIFxmcmFjezF9ezJ4fQorICAgICAqICAgICAgICAgICAgIC0gXHN1bV97bj0xfV57XGluZnR5fSBcZnJhY3tCX3sybn19ezIgbiB4Xnsybn19CisgICAgICogICBAZl0KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19wc2lfYXN5bXAoX1RwIF9feCkKKyAgICB7CisgICAgICBfVHAgX19zdW0gPSBzdGQ6OmxvZyhfX3gpIC0gX1RwKDAuNUwpIC8gX194OworICAgICAgY29uc3QgX1RwIF9feHggPSBfX3ggKiBfX3g7CisgICAgICBfVHAgX194cCA9IF9feHg7CisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9fayA9IDE7IF9fayA8IF9fbWF4X2l0ZXI7ICsrX19rKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fdGVybSA9IF9fYmVybm91bGxpPF9UcD4oMiAqIF9faykgLyAoMiAqIF9fayAqIF9feHApOworICAgICAgICAgIF9fc3VtIC09IF9fdGVybTsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX190ZXJtIC8gX19zdW0pIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3hwICo9IF9feHg7CisgICAgICAgIH0KKyAgICAgIHJldHVybiBfX3N1bTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGRpZ2FtbWEgZnVuY3Rpb24uCisgICAgICogICBUaGUgZGlnYW1tYSBvciBAZiQgXHBzaSh4KSBAZiQgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgIFxwc2koeCkgPSBcZnJhY3tcR2FtbWEnKHgpfXtcR2FtbWEoeCl9CisgICAgICogICBAZl0KKyAgICAgKiAgIEZvciBuZWdhdGl2ZSBhcmd1bWVudCB0aGUgcmVmbGVjdGlvbiBmb3JtdWxhIGlzIHVzZWQ6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHBzaSh4KSA9IFxwc2koMS14KSAtIFxwaSBcY290KFxwaSB4KQorICAgICAqICAgQGZdCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fcHNpKF9UcCBfX3gpCisgICAgeworICAgICAgY29uc3QgaW50IF9fbiA9IHN0YXRpY19jYXN0PGludD4oX194ICsgMC41TCk7CisgICAgICBjb25zdCBfVHAgX19lcHMgPSBfVHAoNCkgKiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgIGlmIChfX24gPD0gMCAmJiBzdGQ6OmFicyhfX3ggLSBfVHAoX19uKSkgPCBfX2VwcykKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX3ggPCBfVHAoMCkpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19waSA9IF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpOworICAgICAgICAgIHJldHVybiBfX3BzaShfVHAoMSkgLSBfX3gpCisgICAgICAgICAgICAgICAtIF9fcGkgKiBzdGQ6OmNvcyhfX3BpICogX194KSAvIHN0ZDo6c2luKF9fcGkgKiBfX3gpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfX3ggPiBfVHAoMTAwKSkKKyAgICAgICAgcmV0dXJuIF9fcHNpX2FzeW1wKF9feCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX3BzaV9zZXJpZXMoX194KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIHBvbHlnYW1tYSBmdW5jdGlvbiBAZiQgXHBzaV57KG4pfSh4KSBAZiQuCisgICAgICogCisgICAgICogICBUaGUgcG9seWdhbW1hIGZ1bmN0aW9uIGlzIHJlbGF0ZWQgdG8gdGhlIEh1cndpdHogemV0YSBmdW5jdGlvbjoKKyAgICAgKiAgIEBmWworICAgICAqICAgICBccHNpXnsobil9KHgpID0gKC0xKV57bisxfSBtISBcemV0YShtKzEseCkKKyAgICAgKiAgIEBmXQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3BzaSh1bnNpZ25lZCBpbnQgX19uLCBfVHAgX194KQorICAgIHsKKyAgICAgIGlmIChfX3ggPD0gX1RwKDApKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQXJndW1lbnQgb3V0IG9mIHJhbmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fcHNpIikpOworICAgICAgZWxzZSBpZiAoX19uID09IDApCisgICAgICAgIHJldHVybiBfX3BzaShfX3gpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9faHpldGEgPSBfX2h1cndpdHpfemV0YShfVHAoX19uICsgMSksIF9feCk7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgICAgIGNvbnN0IF9UcCBfX2xuX25mYWN0ID0gc3RkOjp0cjE6OmxnYW1tYShfVHAoX19uICsgMSkpOworI2Vsc2UKKyAgICAgICAgICBjb25zdCBfVHAgX19sbl9uZmFjdCA9IF9fbG9nX2dhbW1hKF9UcChfX24gKyAxKSk7CisjZW5kaWYKKyAgICAgICAgICBfVHAgX19yZXN1bHQgPSBzdGQ6OmV4cChfX2xuX25mYWN0KSAqIF9faHpldGE7CisgICAgICAgICAgaWYgKF9fbiAlIDIgPT0gMSkKKyAgICAgICAgICAgIF9fcmVzdWx0ID0gLV9fcmVzdWx0OworICAgICAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2Ugc3RkOjp0cjE6Ol9fZGV0YWlsCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfR0FNTUFfVENDCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2hhc2h0YWJsZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvaGFzaHRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZiZmQxZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2hhc2h0YWJsZS5oCkBAIC0wLDAgKzEsMTE4MSBAQAorLy8gVFIxIGhhc2h0YWJsZS5oIGhlYWRlciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2hhc2h0YWJsZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4KKyAqICBAaGVhZGVybmFtZXt0cjEvdW5vcmRlcmVkX3NldCwgdHIxL3Vub3JkZXJlZF9tYXB9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfSEFTSFRBQkxFX0gKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0hBU0hUQUJMRV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8dHIxL2hhc2h0YWJsZV9wb2xpY3kuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIENsYXNzIHRlbXBsYXRlIF9IYXNodGFibGUsIGNsYXNzIGRlZmluaXRpb24uCisKKyAgLy8gTWVhbmluZyBvZiBjbGFzcyB0ZW1wbGF0ZSBfSGFzaHRhYmxlJ3MgdGVtcGxhdGUgcGFyYW1ldGVycworCisgIC8vIF9LZXkgYW5kIF9WYWx1ZTogYXJiaXRyYXJ5IENvcHlDb25zdHJ1Y3RpYmxlIHR5cGVzLgorCisgIC8vIF9BbGxvY2F0b3I6IGFuIGFsbG9jYXRvciB0eXBlIChbbGliLmFsbG9jYXRvci5yZXF1aXJlbWVudHNdKSB3aG9zZQorICAvLyB2YWx1ZSB0eXBlIGlzIFZhbHVlLiAgQXMgYSBjb25mb3JtaW5nIGV4dGVuc2lvbiwgd2UgYWxsb3cgZm9yCisgIC8vIHZhbHVlIHR5cGUgIT0gVmFsdWUuCisKKyAgLy8gX0V4dHJhY3RLZXk6IGZ1bmN0aW9uIG9iamVjdCB0aGF0IHRha2VzIGEgb2JqZWN0IG9mIHR5cGUgVmFsdWUKKyAgLy8gYW5kIHJldHVybnMgYSB2YWx1ZSBvZiB0eXBlIF9LZXkuCisKKyAgLy8gX0VxdWFsOiBmdW5jdGlvbiBvYmplY3QgdGhhdCB0YWtlcyB0d28gb2JqZWN0cyBvZiB0eXBlIGsgYW5kIHJldHVybnMKKyAgLy8gYSBib29sLWxpa2UgdmFsdWUgdGhhdCBpcyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlcXVhbC4KKworICAvLyBfSDE6IHRoZSBoYXNoIGZ1bmN0aW9uLiAgQSB1bmFyeSBmdW5jdGlvbiBvYmplY3Qgd2l0aCBhcmd1bWVudCB0eXBlCisgIC8vIEtleSBhbmQgcmVzdWx0IHR5cGUgc2l6ZV90LiAgUmV0dXJuIHZhbHVlcyBzaG91bGQgYmUgZGlzdHJpYnV0ZWQKKyAgLy8gb3ZlciB0aGUgZW50aXJlIHJhbmdlIFswLCBudW1lcmljX2xpbWl0czxzaXplX3Q+Ojo6bWF4KCldLgorCisgIC8vIF9IMjogdGhlIHJhbmdlLWhhc2hpbmcgZnVuY3Rpb24gKGluIHRoZSB0ZXJtaW5vbG9neSBvZiBUYXZvcmkgYW5kCisgIC8vIERyZWl6aW4pLiAgQSBiaW5hcnkgZnVuY3Rpb24gb2JqZWN0IHdob3NlIGFyZ3VtZW50IHR5cGVzIGFuZCByZXN1bHQKKyAgLy8gdHlwZSBhcmUgYWxsIHNpemVfdC4gIEdpdmVuIGFyZ3VtZW50cyByIGFuZCBOLCB0aGUgcmV0dXJuIHZhbHVlIGlzCisgIC8vIGluIHRoZSByYW5nZSBbMCwgTikuCisKKyAgLy8gX0hhc2g6IHRoZSByYW5nZWQgaGFzaCBmdW5jdGlvbiAoVGF2b3JpIGFuZCBEcmVpemluKS4gQSBiaW5hcnkgZnVuY3Rpb24KKyAgLy8gd2hvc2UgYXJndW1lbnQgdHlwZXMgYXJlIF9LZXkgYW5kIHNpemVfdCBhbmQgd2hvc2UgcmVzdWx0IHR5cGUgaXMKKyAgLy8gc2l6ZV90LiAgR2l2ZW4gYXJndW1lbnRzIGsgYW5kIE4sIHRoZSByZXR1cm4gdmFsdWUgaXMgaW4gdGhlIHJhbmdlCisgIC8vIFswLCBOKS4gIERlZmF1bHQ6IGhhc2goaywgTikgPSBoMihoMShrKSwgTikuICBJZiBfSGFzaCBpcyBhbnl0aGluZyBvdGhlcgorICAvLyB0aGFuIHRoZSBkZWZhdWx0LCBfSDEgYW5kIF9IMiBhcmUgaWdub3JlZC4KKworICAvLyBfUmVoYXNoUG9saWN5OiBQb2xpY3kgY2xhc3Mgd2l0aCB0aHJlZSBtZW1iZXJzLCBhbGwgb2Ygd2hpY2ggZ292ZXJuCisgIC8vIHRoZSBidWNrZXQgY291bnQuIF9NX25leHRfYmt0KG4pIHJldHVybnMgYSBidWNrZXQgY291bnQgbm8gc21hbGxlcgorICAvLyB0aGFuIG4uICBfTV9ia3RfZm9yX2VsZW1lbnRzKG4pIHJldHVybnMgYSBidWNrZXQgY291bnQgYXBwcm9wcmlhdGUKKyAgLy8gZm9yIGFuIGVsZW1lbnQgY291bnQgb2Ygbi4gIF9NX25lZWRfcmVoYXNoKG5fYmt0LCBuX2VsdCwgbl9pbnMpCisgIC8vIGRldGVybWluZXMgd2hldGhlciwgaWYgdGhlIGN1cnJlbnQgYnVja2V0IGNvdW50IGlzIG5fYmt0IGFuZCB0aGUKKyAgLy8gY3VycmVudCBlbGVtZW50IGNvdW50IGlzIG5fZWx0LCB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBidWNrZXQKKyAgLy8gY291bnQuICBJZiBzbywgcmV0dXJucyBtYWtlX3BhaXIodHJ1ZSwgbiksIHdoZXJlIG4gaXMgdGhlIG5ldworICAvLyBidWNrZXQgY291bnQuICBJZiBub3QsIHJldHVybnMgbWFrZV9wYWlyKGZhbHNlLCA8YW55dGhpbmc+KS4KKworICAvLyA/Pz8gUmlnaHQgbm93IGl0IGlzIGhhcmQtd2lyZWQgdGhhdCB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgbmV2ZXIKKyAgLy8gc2hyaW5rcy4gIFNob3VsZCB3ZSBhbGxvdyBfUmVoYXNoUG9saWN5IHRvIGNoYW5nZSB0aGF0PworCisgIC8vIF9fY2FjaGVfaGFzaF9jb2RlOiBib29sLiAgdHJ1ZSBpZiB3ZSBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGhhc2gKKyAgLy8gZnVuY3Rpb24gYWxvbmcgd2l0aCB0aGUgdmFsdWUuICBUaGlzIGlzIGEgdGltZS1zcGFjZSB0cmFkZW9mZi4KKyAgLy8gU3RvcmluZyBpdCBtYXkgaW1wcm92ZSBsb29rdXAgc3BlZWQgYnkgcmVkdWNpbmcgdGhlIG51bWJlciBvZiB0aW1lcworICAvLyB3ZSBuZWVkIHRvIGNhbGwgdGhlIEVxdWFsIGZ1bmN0aW9uLgorCisgIC8vIF9fY29uc3RhbnRfaXRlcmF0b3JzOiBib29sLiAgdHJ1ZSBpZiBpdGVyYXRvciBhbmQgY29uc3RfaXRlcmF0b3IgYXJlCisgIC8vIGJvdGggY29uc3RhbnQgaXRlcmF0b3IgdHlwZXMuICBUaGlzIGlzIHRydWUgZm9yIHVub3JkZXJlZF9zZXQgYW5kCisgIC8vIHVub3JkZXJlZF9tdWx0aXNldCwgZmFsc2UgZm9yIHVub3JkZXJlZF9tYXAgYW5kIHVub3JkZXJlZF9tdWx0aW1hcC4KKworICAvLyBfX3VuaXF1ZV9rZXlzOiBib29sLiAgdHJ1ZSBpZiB0aGUgcmV0dXJuIHZhbHVlIG9mIF9IYXNodGFibGU6OmNvdW50KGspCisgIC8vIGlzIGFsd2F5cyBhdCBtb3N0IG9uZSwgZmFsc2UgaWYgaXQgbWF5IGJlIGFuIGFyYml0cmFyeSBudW1iZXIuICBUaGlzCisgIC8vIHRydWUgZm9yIHVub3JkZXJlZF9zZXQgYW5kIHVub3JkZXJlZF9tYXAsIGZhbHNlIGZvciB1bm9yZGVyZWRfbXVsdGlzZXQKKyAgLy8gYW5kIHVub3JkZXJlZF9tdWx0aW1hcC4KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvY2F0b3IsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlLAorCSAgIGJvb2wgX19jb25zdGFudF9pdGVyYXRvcnMsCisJICAgYm9vbCBfX3VuaXF1ZV9rZXlzPgorICAgIGNsYXNzIF9IYXNodGFibGUKKyAgICA6IHB1YmxpYyBfX2RldGFpbDo6X1JlaGFzaF9iYXNlPF9SZWhhc2hQb2xpY3ksCisJCQkJICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLAorCQkJCQkgICAgICAgX0V4dHJhY3RLZXksCisJCQkJCSAgICAgICBfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwKKwkJCQkJICAgICAgIF9SZWhhc2hQb2xpY3ksCisJCQkJCSAgICAgICBfX2NhY2hlX2hhc2hfY29kZSwKKwkJCQkJICAgICAgIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCQkgICAgICAgX191bmlxdWVfa2V5cz4gPiwKKyAgICAgIHB1YmxpYyBfX2RldGFpbDo6X0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCQkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfX2NhY2hlX2hhc2hfY29kZT4sCisgICAgICBwdWJsaWMgX19kZXRhaWw6Ol9NYXBfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfX3VuaXF1ZV9rZXlzLAorCQkJCSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwKKwkJCQkJICAgIF9FeHRyYWN0S2V5LAorCQkJCQkgICAgX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCQkJCSAgICBfUmVoYXNoUG9saWN5LAorCQkJCQkgICAgX19jYWNoZV9oYXNoX2NvZGUsCisJCQkJCSAgICBfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkJICAgIF9fdW5pcXVlX2tleXM+ID4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiBfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9FcXVhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2VxdWFsOworICAgICAgLy8gbWFwcGVkX3R5cGUsIGlmIHByZXNlbnQsIGNvbWVzIGZyb20gX01hcF9iYXNlLgorICAgICAgLy8gaGFzaGVyLCBpZiBwcmVzZW50LCBjb21lcyBmcm9tIF9IYXNoX2NvZGVfYmFzZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6ZGlmZmVyZW5jZV90eXBlICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OnNpemVfdHlwZSAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjpwb2ludGVyICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6cmVmZXJlbmNlICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSAgICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIF9fZGV0YWlsOjpfTm9kZV9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkgICAgICAgX19jYWNoZV9oYXNoX2NvZGU+CisJCQkJCQkJICBsb2NhbF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19kZXRhaWw6Ol9Ob2RlX2NvbnN0X2l0ZXJhdG9yPHZhbHVlX3R5cGUsCisJCQkJCSAgICAgX19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJCSAgICAgX19jYWNoZV9oYXNoX2NvZGU+CisJCQkJCQkJICBjb25zdF9sb2NhbF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBfX2RldGFpbDo6X0hhc2h0YWJsZV9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkJICAgIF9fY2FjaGVfaGFzaF9jb2RlPgorCQkJCQkJCSAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZGV0YWlsOjpfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPHZhbHVlX3R5cGUsCisJCQkJCQkgIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCQkJICBfX2NhY2hlX2hhc2hfY29kZT4KKwkJCQkJCQkgIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5MiwgdHlwZW5hbWUgX1ZhbHVlMiwgdHlwZW5hbWUgX0V4MiwgYm9vbCBfX3VuaXF1ZTIsCisJICAgICAgIHR5cGVuYW1lIF9IYXNodGFibGUyPgorCWZyaWVuZCBzdHJ1Y3QgX19kZXRhaWw6Ol9NYXBfYmFzZTsKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZGV0YWlsOjpfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZV9oYXNoX2NvZGU+IF9Ob2RlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8X05vZGU+OjpvdGhlcgorCQkJCQkJCV9Ob2RlX2FsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8X05vZGUqPjo6b3RoZXIKKwkJCQkJCQlfQnVja2V0X2FsbG9jYXRvcl90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxfVmFsdWU+OjpvdGhlcgorCQkJCQkJCV9WYWx1ZV9hbGxvY2F0b3JfdHlwZTsKKworICAgICAgX05vZGVfYWxsb2NhdG9yX3R5cGUgICBfTV9ub2RlX2FsbG9jYXRvcjsKKyAgICAgIF9Ob2RlKiogICAgICAgICAgICAgICAgX01fYnVja2V0czsKKyAgICAgIHNpemVfdHlwZSAgICAgICAgICAgICAgX01fYnVja2V0X2NvdW50OworICAgICAgc2l6ZV90eXBlICAgICAgICAgICAgICBfTV9lbGVtZW50X2NvdW50OworICAgICAgX1JlaGFzaFBvbGljeSAgICAgICAgICBfTV9yZWhhc2hfcG9saWN5OworCisgICAgICBfTm9kZSoKKyAgICAgIF9NX2FsbG9jYXRlX25vZGUoY29uc3QgdmFsdWVfdHlwZSYgX192KTsKKworICAgICAgdm9pZAorICAgICAgX01fZGVhbGxvY2F0ZV9ub2RlKF9Ob2RlKiBfX24pOworCisgICAgICB2b2lkCisgICAgICBfTV9kZWFsbG9jYXRlX25vZGVzKF9Ob2RlKiosIHNpemVfdHlwZSk7CisKKyAgICAgIF9Ob2RlKioKKyAgICAgIF9NX2FsbG9jYXRlX2J1Y2tldHMoc2l6ZV90eXBlIF9fbik7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfTm9kZSoqLCBzaXplX3R5cGUgX19uKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENvbnN0cnVjdG9yLCBkZXN0cnVjdG9yLCBhc3NpZ25tZW50LCBzd2FwCisgICAgICBfSGFzaHRhYmxlKHNpemVfdHlwZSBfX2J1Y2tldF9oaW50LAorCQkgY29uc3QgX0gxJiwgY29uc3QgX0gyJiwgY29uc3QgX0hhc2gmLAorCQkgY29uc3QgX0VxdWFsJiwgY29uc3QgX0V4dHJhY3RLZXkmLAorCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJX0hhc2h0YWJsZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgIHNpemVfdHlwZSBfX2J1Y2tldF9oaW50LAorCQkgICBjb25zdCBfSDEmLCBjb25zdCBfSDImLCBjb25zdCBfSGFzaCYsCisJCSAgIGNvbnN0IF9FcXVhbCYsIGNvbnN0IF9FeHRyYWN0S2V5JiwKKwkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmKTsKKworICAgICAgX0hhc2h0YWJsZShjb25zdCBfSGFzaHRhYmxlJik7CisKKyAgICAgIF9IYXNodGFibGUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX0hhc2h0YWJsZSYpOworCisgICAgICB+X0hhc2h0YWJsZSgpOworCisgICAgICB2b2lkIHN3YXAoX0hhc2h0YWJsZSYpOworCisgICAgICAvLyBCYXNpYyBjb250YWluZXIgb3BlcmF0aW9ucworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsKKwlpdGVyYXRvciBfX2koX01fYnVja2V0cyk7CisJaWYgKCFfX2kuX01fY3VyX25vZGUpCisJICBfX2kuX01faW5jcl9idWNrZXQoKTsKKwlyZXR1cm4gX19pOworICAgICAgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeworCWNvbnN0X2l0ZXJhdG9yIF9faShfTV9idWNrZXRzKTsKKwlpZiAoIV9faS5fTV9jdXJfbm9kZSkKKwkgIF9faS5fTV9pbmNyX2J1Y2tldCgpOworCXJldHVybiBfX2k7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX01fYnVja2V0cyArIF9NX2J1Y2tldF9jb3VudCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9idWNrZXRzICsgX01fYnVja2V0X2NvdW50KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZWxlbWVudF9jb3VudDsgfQorCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfTV9ub2RlX2FsbG9jYXRvcik7IH0KKworICAgICAgX1ZhbHVlX2FsbG9jYXRvcl90eXBlCisgICAgICBfTV9nZXRfVmFsdWVfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9WYWx1ZV9hbGxvY2F0b3JfdHlwZShfTV9ub2RlX2FsbG9jYXRvcik7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ub2RlX2FsbG9jYXRvci5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8vIE9ic2VydmVycworICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZXE7IH0KKworICAgICAgLy8gaGFzaF9mdW5jdGlvbiwgaWYgcHJlc2VudCwgY29tZXMgZnJvbSBfSGFzaF9jb2RlX2Jhc2UuCisKKyAgICAgIC8vIEJ1Y2tldCBvcGVyYXRpb25zCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9idWNrZXRfY291bnQ7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1heF9zaXplKCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpkaXN0YW5jZShiZWdpbihfX24pLCBlbmQoX19uKSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgdGhpcy0+X01faGFzaF9jb2RlKF9fayksCisJCQkJICAgICBidWNrZXRfY291bnQoKSk7CisgICAgICB9CisKKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gbG9jYWxfaXRlcmF0b3IoX01fYnVja2V0c1tfX25dKTsgfQorCisgICAgICBsb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSkKKyAgICAgIHsgcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKDApOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX01fYnVja2V0c1tfX25dKTsgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKDApOyB9CisKKyAgICAgIGZsb2F0CisgICAgICBsb2FkX2ZhY3RvcigpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihzaXplKCkpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJ1Y2tldF9jb3VudCgpKTsKKyAgICAgIH0KKworICAgICAgLy8gbWF4X2xvYWRfZmFjdG9yLCBpZiBwcmVzZW50LCBjb21lcyBmcm9tIF9SZWhhc2hfYmFzZS4KKworICAgICAgLy8gR2VuZXJhbGl6YXRpb24gb2YgbWF4X2xvYWRfZmFjdG9yLiAgRXh0ZW5zaW9uLCBub3QgZm91bmQgaW4gVFIxLiAgT25seQorICAgICAgLy8gdXNlZnVsIGlmIF9SZWhhc2hQb2xpY3kgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQuCisgICAgICBjb25zdCBfUmVoYXNoUG9saWN5JgorICAgICAgX19yZWhhc2hfcG9saWN5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3JlaGFzaF9wb2xpY3k7IH0KKworICAgICAgdm9pZAorICAgICAgX19yZWhhc2hfcG9saWN5KGNvbnN0IF9SZWhhc2hQb2xpY3kmKTsKKworICAgICAgLy8gTG9va3VwLgorICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fayk7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0OworCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0OworCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fayk7CisKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdDsKKworICAgIHByaXZhdGU6CQkJLy8gRmluZCwgaW5zZXJ0IGFuZCBlcmFzZSBoZWxwZXIgZnVuY3Rpb25zCisgICAgICAvLyA/Pz8gVGhpcyBkaXNwYXRjaGluZyBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSBmYWN0IHRoYXQgd2UgZG9uJ3QKKyAgICAgIC8vIGhhdmUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiBtZW1iZXIgdGVtcGxhdGVzOyBpdCB3b3VsZCBiZQorICAgICAgLy8gYmV0dGVyIHRvIGp1c3Qgc3BlY2lhbGl6ZSBpbnNlcnQgb24gX191bmlxdWVfa2V5cy4gIFRoZXJlIG1heSBiZSBhCisgICAgICAvLyBjbGVhbmVyIHdvcmthcm91bmQuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19jb25kaXRpb25hbF90eXBlPF9fdW5pcXVlX2tleXMsCisJCSAgICAgICAJICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4sIGl0ZXJhdG9yPjo6X190eXBlCisJX0luc2VydF9SZXR1cm5fVHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTxfX3VuaXF1ZV9rZXlzLAorCQkJCQkgIHN0ZDo6X1NlbGVjdDFzdDxfSW5zZXJ0X1JldHVybl9UeXBlPiwKKwkJCQkgIAkgIHN0ZDo6X0lkZW50aXR5PF9JbnNlcnRfUmV0dXJuX1R5cGU+CisJCQkJICAgPjo6X190eXBlCisJX0luc2VydF9Db252X1R5cGU7CisKKyAgICAgIF9Ob2RlKgorICAgICAgX01fZmluZF9ub2RlKF9Ob2RlKiwgY29uc3Qga2V5X3R5cGUmLAorCQkgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUpIGNvbnN0OworCisgICAgICBpdGVyYXRvcgorICAgICAgX01faW5zZXJ0X2J1Y2tldChjb25zdCB2YWx1ZV90eXBlJiwgc2l6ZV90eXBlLAorCQkgICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlKTsKKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgX01faW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmLCBzdGQ6OnRyMTo6dHJ1ZV90eXBlKTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2luc2VydChjb25zdCB2YWx1ZV90eXBlJiwgc3RkOjp0cjE6OmZhbHNlX3R5cGUpOworCisgICAgICB2b2lkCisgICAgICBfTV9lcmFzZV9ub2RlKF9Ob2RlKiwgX05vZGUqKik7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBJbnNlcnQgYW5kIGVyYXNlCisgICAgICBfSW5zZXJ0X1JldHVybl9UeXBlCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX192KQorICAgICAgeyByZXR1cm4gX01faW5zZXJ0KF9fdiwgc3RkOjp0cjE6OmludGVncmFsX2NvbnN0YW50PGJvb2wsCisJCQkgX191bmlxdWVfa2V5cz4oKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciwgY29uc3QgdmFsdWVfdHlwZSYgX192KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0luc2VydF9Db252X1R5cGUoKSh0aGlzLT5pbnNlcnQoX192KSkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IsIGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9JbnNlcnRfQ29udl9UeXBlKCkodGhpcy0+aW5zZXJ0KF9fdikpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl2b2lkCisJaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvcik7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvcik7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmKTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yLCBpdGVyYXRvcik7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3IpOworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgICAvLyBTZXQgbnVtYmVyIG9mIGJ1Y2tldHMgdG8gYmUgYXBwcm9wcmlhdGUgZm9yIGNvbnRhaW5lciBvZiBuIGVsZW1lbnQuCisgICAgICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19uKTsKKworICAgIHByaXZhdGU6CisgICAgICAvLyBVbmNvbmRpdGlvbmFsbHkgY2hhbmdlIHNpemUgb2YgYnVja2V0IGFycmF5IHRvIG4uCisgICAgICB2b2lkIF9NX3JlaGFzaChzaXplX3R5cGUgX19uKTsKKyAgICB9OworCisKKyAgLy8gRGVmaW5pdGlvbnMgb2YgY2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZSdzIG91dC1vZi1saW5lIG1lbWJlciBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+OjpfTm9kZSoKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9hbGxvY2F0ZV9ub2RlKGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKKyAgICB7CisgICAgICBfTm9kZSogX19uID0gX01fbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisgICAgICBfX3RyeQorCXsKKwkgIF9NX2dldF9WYWx1ZV9hbGxvY2F0b3IoKS5jb25zdHJ1Y3QoJl9fbi0+X01fdiwgX192KTsKKwkgIF9fbi0+X01fbmV4dCA9IDA7CisJICByZXR1cm4gX19uOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIF9NX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUoX19uLCAxKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX01fZGVhbGxvY2F0ZV9ub2RlKF9Ob2RlKiBfX24pCisgICAgeworICAgICAgX01fZ2V0X1ZhbHVlX2FsbG9jYXRvcigpLmRlc3Ryb3koJl9fbi0+X01fdik7CisgICAgICBfTV9ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKF9fbiwgMSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9NX2RlYWxsb2NhdGVfbm9kZXMoX05vZGUqKiBfX2FycmF5LCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90eXBlIF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJeworCSAgX05vZGUqIF9fcCA9IF9fYXJyYXlbX19pXTsKKwkgIHdoaWxlIChfX3ApCisJICAgIHsKKwkgICAgICBfTm9kZSogX190bXAgPSBfX3A7CisJICAgICAgX19wID0gX19wLT5fTV9uZXh0OworCSAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZShfX3RtcCk7CisJICAgIH0KKwkgIF9fYXJyYXlbX19pXSA9IDA7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX19jaGMsIF9fY2l0LCBfX3VrPjo6X05vZGUqKgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9NX2FsbG9jYXRlX2J1Y2tldHMoc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfQnVja2V0X2FsbG9jYXRvcl90eXBlIF9fYWxsb2MoX01fbm9kZV9hbGxvY2F0b3IpOworCisgICAgICAvLyBXZSBhbGxvY2F0ZSBvbmUgZXh0cmEgYnVja2V0IHRvIGhvbGQgYSBzZW50aW5lbCwgYW4gYXJiaXRyYXJ5CisgICAgICAvLyBub24tbnVsbCBwb2ludGVyLiAgSXRlcmF0b3IgaW5jcmVtZW50IHJlbGllcyBvbiB0aGlzLgorICAgICAgX05vZGUqKiBfX3AgPSBfX2FsbG9jLmFsbG9jYXRlKF9fbiArIDEpOworICAgICAgc3RkOjpmaWxsKF9fcCwgX19wICsgX19uLCAoX05vZGUqKSAwKTsKKyAgICAgIF9fcFtfX25dID0gcmVpbnRlcnByZXRfY2FzdDxfTm9kZSo+KDB4MTAwMCk7CisgICAgICByZXR1cm4gX19wOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoX05vZGUqKiBfX3AsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX0J1Y2tldF9hbGxvY2F0b3JfdHlwZSBfX2FsbG9jKF9NX25vZGVfYWxsb2NhdG9yKTsKKyAgICAgIF9fYWxsb2MuZGVhbGxvY2F0ZShfX3AsIF9fbiArIDEpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9IYXNodGFibGUoc2l6ZV90eXBlIF9fYnVja2V0X2hpbnQsCisJICAgICAgIGNvbnN0IF9IMSYgX19oMSwgY29uc3QgX0gyJiBfX2gyLCBjb25zdCBfSGFzaCYgX19oLAorCSAgICAgICBjb25zdCBfRXF1YWwmIF9fZXEsIGNvbnN0IF9FeHRyYWN0S2V5JiBfX2V4aywKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fZGV0YWlsOjpfUmVoYXNoX2Jhc2U8X1JlaGFzaFBvbGljeSwgX0hhc2h0YWJsZT4oKSwKKyAgICAgIF9fZGV0YWlsOjpfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJCV9IMSwgX0gyLCBfSGFzaCwgX19jaGM+KF9fZXhrLCBfX2VxLAorCQkJCQkJCV9faDEsIF9faDIsIF9faCksCisgICAgICBfX2RldGFpbDo6X01hcF9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9fdWssIF9IYXNodGFibGU+KCksCisgICAgICBfTV9ub2RlX2FsbG9jYXRvcihfX2EpLAorICAgICAgX01fYnVja2V0X2NvdW50KDApLAorICAgICAgX01fZWxlbWVudF9jb3VudCgwKSwKKyAgICAgIF9NX3JlaGFzaF9wb2xpY3koKQorICAgIHsKKyAgICAgIF9NX2J1Y2tldF9jb3VudCA9IF9NX3JlaGFzaF9wb2xpY3kuX01fbmV4dF9ia3QoX19idWNrZXRfaGludCk7CisgICAgICBfTV9idWNrZXRzID0gX01fYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRfY291bnQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCSBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgICAgX0hhc2h0YWJsZShfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJIHNpemVfdHlwZSBfX2J1Y2tldF9oaW50LAorCQkgY29uc3QgX0gxJiBfX2gxLCBjb25zdCBfSDImIF9faDIsIGNvbnN0IF9IYXNoJiBfX2gsCisJCSBjb25zdCBfRXF1YWwmIF9fZXEsIGNvbnN0IF9FeHRyYWN0S2V5JiBfX2V4aywKKwkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IF9fZGV0YWlsOjpfUmVoYXNoX2Jhc2U8X1JlaGFzaFBvbGljeSwgX0hhc2h0YWJsZT4oKSwKKwlfX2RldGFpbDo6X0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCQkgIF9IMSwgX0gyLCBfSGFzaCwgX19jaGM+KF9fZXhrLCBfX2VxLAorCQkJCQkJCSAgX19oMSwgX19oMiwgX19oKSwKKwlfX2RldGFpbDo6X01hcF9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9fdWssIF9IYXNodGFibGU+KCksCisJX01fbm9kZV9hbGxvY2F0b3IoX19hKSwKKwlfTV9idWNrZXRfY291bnQoMCksCisJX01fZWxlbWVudF9jb3VudCgwKSwKKwlfTV9yZWhhc2hfcG9saWN5KCkKKyAgICAgIHsKKwlfTV9idWNrZXRfY291bnQgPSBzdGQ6Om1heChfTV9yZWhhc2hfcG9saWN5Ll9NX25leHRfYmt0KF9fYnVja2V0X2hpbnQpLAorCQkJCSAgIF9NX3JlaGFzaF9wb2xpY3kuCisJCQkJICAgX01fYmt0X2Zvcl9lbGVtZW50cyhfX2RldGFpbDo6CisJCQkJCQkgICAgICAgX19kaXN0YW5jZV9mdyhfX2YsCisJCQkJCQkJCSAgICAgX19sKSkpOworCV9NX2J1Y2tldHMgPSBfTV9hbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldF9jb3VudCk7CisJX190cnkKKwkgIHsKKwkgICAgZm9yICg7IF9fZiAhPSBfX2w7ICsrX19mKQorCSAgICAgIHRoaXMtPmluc2VydCgqX19mKTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgY2xlYXIoKTsKKwkgICAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldHMsIF9NX2J1Y2tldF9jb3VudCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX0hhc2h0YWJsZShjb25zdCBfSGFzaHRhYmxlJiBfX2h0KQorICAgIDogX19kZXRhaWw6Ol9SZWhhc2hfYmFzZTxfUmVoYXNoUG9saWN5LCBfSGFzaHRhYmxlPihfX2h0KSwKKyAgICAgIF9fZGV0YWlsOjpfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJCV9IMSwgX0gyLCBfSGFzaCwgX19jaGM+KF9faHQpLAorICAgICAgX19kZXRhaWw6Ol9NYXBfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfX3VrLCBfSGFzaHRhYmxlPihfX2h0KSwKKyAgICAgIF9NX25vZGVfYWxsb2NhdG9yKF9faHQuX01fbm9kZV9hbGxvY2F0b3IpLAorICAgICAgX01fYnVja2V0X2NvdW50KF9faHQuX01fYnVja2V0X2NvdW50KSwKKyAgICAgIF9NX2VsZW1lbnRfY291bnQoX19odC5fTV9lbGVtZW50X2NvdW50KSwKKyAgICAgIF9NX3JlaGFzaF9wb2xpY3koX19odC5fTV9yZWhhc2hfcG9saWN5KQorICAgIHsKKyAgICAgIF9NX2J1Y2tldHMgPSBfTV9hbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldF9jb3VudCk7CisgICAgICBfX3RyeQorCXsKKwkgIGZvciAoc2l6ZV90eXBlIF9faSA9IDA7IF9faSA8IF9faHQuX01fYnVja2V0X2NvdW50OyArK19faSkKKwkgICAgeworCSAgICAgIF9Ob2RlKiBfX24gPSBfX2h0Ll9NX2J1Y2tldHNbX19pXTsKKwkgICAgICBfTm9kZSoqIF9fdGFpbCA9IF9NX2J1Y2tldHMgKyBfX2k7CisJICAgICAgd2hpbGUgKF9fbikKKwkJeworCQkgICpfX3RhaWwgPSBfTV9hbGxvY2F0ZV9ub2RlKF9fbi0+X01fdik7CisJCSAgdGhpcy0+X01fY29weV9jb2RlKCpfX3RhaWwsIF9fbik7CisJCSAgX190YWlsID0gJigoKl9fdGFpbCktPl9NX25leHQpOworCQkgIF9fbiA9IF9fbi0+X01fbmV4dDsKKwkJfQorCSAgICB9CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgY2xlYXIoKTsKKwkgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRzLCBfTV9idWNrZXRfY291bnQpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az4mCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgb3BlcmF0b3I9KGNvbnN0IF9IYXNodGFibGUmIF9faHQpCisgICAgeworICAgICAgX0hhc2h0YWJsZSBfX3RtcChfX2h0KTsKKyAgICAgIHRoaXMtPnN3YXAoX190bXApOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIH5fSGFzaHRhYmxlKCkKKyAgICB7CisgICAgICBjbGVhcigpOworICAgICAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldHMsIF9NX2J1Y2tldF9jb3VudCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIHN3YXAoX0hhc2h0YWJsZSYgX194KQorICAgIHsKKyAgICAgIC8vIFRoZSBvbmx5IGJhc2UgY2xhc3Mgd2l0aCBtZW1iZXIgdmFyaWFibGVzIGlzIGhhc2hfY29kZV9iYXNlLiAgV2UKKyAgICAgIC8vIGRlZmluZSBfSGFzaF9jb2RlX2Jhc2U6Ol9NX3N3YXAgYmVjYXVzZSBkaWZmZXJlbnQgc3BlY2lhbGl6YXRpb25zCisgICAgICAvLyBoYXZlIGRpZmZlcmVudCBtZW1iZXJzLgorICAgICAgX19kZXRhaWw6Ol9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJX0gxLCBfSDIsIF9IYXNoLCBfX2NoYz46Ol9NX3N3YXAoX194KTsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDMxLiBTd2FwcGluZyBjb250YWluZXJzIHdpdGggdW5lcXVhbCBhbGxvY2F0b3JzLgorICAgICAgc3RkOjpfX2FsbG9jX3N3YXA8X05vZGVfYWxsb2NhdG9yX3R5cGU+OjpfU19kb19pdChfTV9ub2RlX2FsbG9jYXRvciwKKwkJCQkJCQlfX3guX01fbm9kZV9hbGxvY2F0b3IpOworCisgICAgICBzdGQ6OnN3YXAoX01fcmVoYXNoX3BvbGljeSwgX194Ll9NX3JlaGFzaF9wb2xpY3kpOworICAgICAgc3RkOjpzd2FwKF9NX2J1Y2tldHMsIF9feC5fTV9idWNrZXRzKTsKKyAgICAgIHN0ZDo6c3dhcChfTV9idWNrZXRfY291bnQsIF9feC5fTV9idWNrZXRfY291bnQpOworICAgICAgc3RkOjpzd2FwKF9NX2VsZW1lbnRfY291bnQsIF9feC5fTV9lbGVtZW50X2NvdW50KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX19yZWhhc2hfcG9saWN5KGNvbnN0IF9SZWhhc2hQb2xpY3kmIF9fcG9sKQorICAgIHsKKyAgICAgIF9NX3JlaGFzaF9wb2xpY3kgPSBfX3BvbDsKKyAgICAgIHNpemVfdHlwZSBfX25fYmt0ID0gX19wb2wuX01fYmt0X2Zvcl9lbGVtZW50cyhfTV9lbGVtZW50X2NvdW50KTsKKyAgICAgIGlmIChfX25fYmt0ID4gX01fYnVja2V0X2NvdW50KQorCV9NX3JlaGFzaChfX25fYmt0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46Oml0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKQorICAgIHsKKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSwgX01fYnVja2V0X2NvdW50KTsKKyAgICAgIF9Ob2RlKiBfX3AgPSBfTV9maW5kX25vZGUoX01fYnVja2V0c1tfX25dLCBfX2ssIF9fY29kZSk7CisgICAgICByZXR1cm4gX19wID8gaXRlcmF0b3IoX19wLCBfTV9idWNrZXRzICsgX19uKSA6IHRoaXMtPmVuZCgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX19jaGMsIF9fY2l0LCBfX3VrPjo6Y29uc3RfaXRlcmF0b3IKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgeworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfTV9idWNrZXRfY291bnQpOworICAgICAgX05vZGUqIF9fcCA9IF9NX2ZpbmRfbm9kZShfTV9idWNrZXRzW19fbl0sIF9faywgX19jb2RlKTsKKyAgICAgIHJldHVybiBfX3AgPyBjb25zdF9pdGVyYXRvcihfX3AsIF9NX2J1Y2tldHMgKyBfX24pIDogdGhpcy0+ZW5kKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+OjpzaXplX3R5cGUKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSwgX01fYnVja2V0X2NvdW50KTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgICAgIGZvciAoX05vZGUqIF9fcCA9IF9NX2J1Y2tldHNbX19uXTsgX19wOyBfX3AgPSBfX3AtPl9NX25leHQpCisJaWYgKHRoaXMtPl9NX2NvbXBhcmUoX19rLCBfX2NvZGUsIF9fcCkpCisJICArK19fcmVzdWx0OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHN0ZDo6cGFpcjx0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwKKwkJCQkgIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwKKwkJCQkgIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQkJICBfX2NoYywgX19jaXQsIF9fdWs+OjppdGVyYXRvciwKKwkgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwKKwkJCQkgIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwKKwkJCQkgIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQkJICBfX2NoYywgX19jaXQsIF9fdWs+OjppdGVyYXRvcj4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgIHsKKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSwgX01fYnVja2V0X2NvdW50KTsKKyAgICAgIF9Ob2RlKiogX19oZWFkID0gX01fYnVja2V0cyArIF9fbjsKKyAgICAgIF9Ob2RlKiBfX3AgPSBfTV9maW5kX25vZGUoKl9faGVhZCwgX19rLCBfX2NvZGUpOworCisgICAgICBpZiAoX19wKQorCXsKKwkgIF9Ob2RlKiBfX3AxID0gX19wLT5fTV9uZXh0OworCSAgZm9yICg7IF9fcDE7IF9fcDEgPSBfX3AxLT5fTV9uZXh0KQorCSAgICBpZiAoIXRoaXMtPl9NX2NvbXBhcmUoX19rLCBfX2NvZGUsIF9fcDEpKQorCSAgICAgIGJyZWFrOworCisJICBpdGVyYXRvciBfX2ZpcnN0KF9fcCwgX19oZWFkKTsKKwkgIGl0ZXJhdG9yIF9fbGFzdChfX3AxLCBfX2hlYWQpOworCSAgaWYgKCFfX3AxKQorCSAgICBfX2xhc3QuX01faW5jcl9idWNrZXQoKTsKKwkgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihfX2ZpcnN0LCBfX2xhc3QpOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIodGhpcy0+ZW5kKCksIHRoaXMtPmVuZCgpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICBzdGQ6OnBhaXI8dHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsCisJCQkJICBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsCisJCQkJICBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJCSAgX19jaGMsIF9fY2l0LCBfX3VrPjo6Y29uc3RfaXRlcmF0b3IsCisJICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsCisJCQkJICBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsCisJCQkJICBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJCSAgX19jaGMsIF9fY2l0LCBfX3VrPjo6Y29uc3RfaXRlcmF0b3I+CisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICB7CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSB0aGlzLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUsIF9NX2J1Y2tldF9jb3VudCk7CisgICAgICBfTm9kZSoqIF9faGVhZCA9IF9NX2J1Y2tldHMgKyBfX247CisgICAgICBfTm9kZSogX19wID0gX01fZmluZF9ub2RlKCpfX2hlYWQsIF9faywgX19jb2RlKTsKKworICAgICAgaWYgKF9fcCkKKwl7CisJICBfTm9kZSogX19wMSA9IF9fcC0+X01fbmV4dDsKKwkgIGZvciAoOyBfX3AxOyBfX3AxID0gX19wMS0+X01fbmV4dCkKKwkgICAgaWYgKCF0aGlzLT5fTV9jb21wYXJlKF9faywgX19jb2RlLCBfX3AxKSkKKwkgICAgICBicmVhazsKKworCSAgY29uc3RfaXRlcmF0b3IgX19maXJzdChfX3AsIF9faGVhZCk7CisJICBjb25zdF9pdGVyYXRvciBfX2xhc3QoX19wMSwgX19oZWFkKTsKKwkgIGlmICghX19wMSkKKwkgICAgX19sYXN0Ll9NX2luY3JfYnVja2V0KCk7CisJICByZXR1cm4gc3RkOjptYWtlX3BhaXIoX19maXJzdCwgX19sYXN0KTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRoaXMtPmVuZCgpLCB0aGlzLT5lbmQoKSk7CisgICAgfQorCisgIC8vIEZpbmQgdGhlIG5vZGUgd2hvc2Uga2V5IGNvbXBhcmVzIGVxdWFsIHRvIGssIGJlZ2lubmluZyB0aGUgc2VhcmNoCisgIC8vIGF0IHAgKHVzdWFsbHkgdGhlIGhlYWQgb2YgYSBidWNrZXQpLiAgUmV0dXJuIHplcm8gaWYgbm8gbm9kZSBpcyBmb3VuZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksCisJCQlfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46Ol9Ob2RlKgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9NX2ZpbmRfbm9kZShfTm9kZSogX19wLCBjb25zdCBrZXlfdHlwZSYgX19rLAorCQl0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlKSBjb25zdAorICAgIHsKKyAgICAgIGZvciAoOyBfX3A7IF9fcCA9IF9fcC0+X01fbmV4dCkKKwlpZiAodGhpcy0+X01fY29tcGFyZShfX2ssIF9fY29kZSwgX19wKSkKKwkgIHJldHVybiBfX3A7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLy8gSW5zZXJ0IHYgaW4gYnVja2V0IG4gKGFzc3VtZXMgbm8gZWxlbWVudCB3aXRoIGl0cyBrZXkgYWxyZWFkeSBwcmVzZW50KS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46Oml0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX01faW5zZXJ0X2J1Y2tldChjb25zdCB2YWx1ZV90eXBlJiBfX3YsIHNpemVfdHlwZSBfX24sCisJCSAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlKQorICAgIHsKKyAgICAgIHN0ZDo6cGFpcjxib29sLCBzdGQ6OnNpemVfdD4gX19kb19yZWhhc2gKKwk9IF9NX3JlaGFzaF9wb2xpY3kuX01fbmVlZF9yZWhhc2goX01fYnVja2V0X2NvdW50LAorCQkJCQkgIF9NX2VsZW1lbnRfY291bnQsIDEpOworCisgICAgICAvLyBBbGxvY2F0ZSB0aGUgbmV3IG5vZGUgYmVmb3JlIGRvaW5nIHRoZSByZWhhc2ggc28gdGhhdCB3ZSBkb24ndAorICAgICAgLy8gZG8gYSByZWhhc2ggaWYgdGhlIGFsbG9jYXRpb24gdGhyb3dzLgorICAgICAgX05vZGUqIF9fbmV3X25vZGUgPSBfTV9hbGxvY2F0ZV9ub2RlKF9fdik7CisKKyAgICAgIF9fdHJ5CisJeworCSAgaWYgKF9fZG9fcmVoYXNoLmZpcnN0KQorCSAgICB7CisJICAgICAgY29uc3Qga2V5X3R5cGUmIF9fayA9IHRoaXMtPl9NX2V4dHJhY3QoX192KTsKKwkgICAgICBfX24gPSB0aGlzLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUsIF9fZG9fcmVoYXNoLnNlY29uZCk7CisJICAgICAgX01fcmVoYXNoKF9fZG9fcmVoYXNoLnNlY29uZCk7CisJICAgIH0KKworCSAgX19uZXdfbm9kZS0+X01fbmV4dCA9IF9NX2J1Y2tldHNbX19uXTsKKwkgIHRoaXMtPl9NX3N0b3JlX2NvZGUoX19uZXdfbm9kZSwgX19jb2RlKTsKKwkgIF9NX2J1Y2tldHNbX19uXSA9IF9fbmV3X25vZGU7CisJICArK19NX2VsZW1lbnRfY291bnQ7CisJICByZXR1cm4gaXRlcmF0b3IoX19uZXdfbm9kZSwgX01fYnVja2V0cyArIF9fbik7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgX01fZGVhbGxvY2F0ZV9ub2RlKF9fbmV3X25vZGUpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICAvLyBJbnNlcnQgdiBpZiBubyBlbGVtZW50IHdpdGggaXRzIGtleSBpcyBhbHJlYWR5IHByZXNlbnQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgc3RkOjpwYWlyPHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLAorCQkJCSAgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLAorCQkJCSAgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCQkgIF9fY2hjLCBfX2NpdCwgX191az46Oml0ZXJhdG9yLCBib29sPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICBfTV9pbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX192LCBzdGQ6OnRyMTo6dHJ1ZV90eXBlKQorICAgIHsKKyAgICAgIGNvbnN0IGtleV90eXBlJiBfX2sgPSB0aGlzLT5fTV9leHRyYWN0KF9fdik7CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzaXplX3R5cGUgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfTV9idWNrZXRfY291bnQpOworCisgICAgICBpZiAoX05vZGUqIF9fcCA9IF9NX2ZpbmRfbm9kZShfTV9idWNrZXRzW19fbl0sIF9faywgX19jb2RlKSkKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19wLCBfTV9idWNrZXRzICsgX19uKSwgZmFsc2UpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKF9NX2luc2VydF9idWNrZXQoX192LCBfX24sIF9fY29kZSksIHRydWUpOworICAgIH0KKworICAvLyBJbnNlcnQgdiB1bmNvbmRpdGlvbmFsbHkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+OjppdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9NX2luc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3YsIHN0ZDo6dHIxOjpmYWxzZV90eXBlKQorICAgIHsKKyAgICAgIHN0ZDo6cGFpcjxib29sLCBzdGQ6OnNpemVfdD4gX19kb19yZWhhc2gKKwk9IF9NX3JlaGFzaF9wb2xpY3kuX01fbmVlZF9yZWhhc2goX01fYnVja2V0X2NvdW50LAorCQkJCQkgIF9NX2VsZW1lbnRfY291bnQsIDEpOworICAgICAgaWYgKF9fZG9fcmVoYXNoLmZpcnN0KQorCV9NX3JlaGFzaChfX2RvX3JlaGFzaC5zZWNvbmQpOworCisgICAgICBjb25zdCBrZXlfdHlwZSYgX19rID0gdGhpcy0+X01fZXh0cmFjdChfX3YpOworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc2l6ZV90eXBlIF9fbiA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSwgX01fYnVja2V0X2NvdW50KTsKKworICAgICAgLy8gRmlyc3QgZmluZCB0aGUgbm9kZSwgYXZvaWQgbGVha2luZyBuZXdfbm9kZSBpZiBjb21wYXJlIHRocm93cy4KKyAgICAgIF9Ob2RlKiBfX3ByZXYgPSBfTV9maW5kX25vZGUoX01fYnVja2V0c1tfX25dLCBfX2ssIF9fY29kZSk7CisgICAgICBfTm9kZSogX19uZXdfbm9kZSA9IF9NX2FsbG9jYXRlX25vZGUoX192KTsKKworICAgICAgaWYgKF9fcHJldikKKwl7CisJICBfX25ld19ub2RlLT5fTV9uZXh0ID0gX19wcmV2LT5fTV9uZXh0OworCSAgX19wcmV2LT5fTV9uZXh0ID0gX19uZXdfbm9kZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgX19uZXdfbm9kZS0+X01fbmV4dCA9IF9NX2J1Y2tldHNbX19uXTsKKwkgIF9NX2J1Y2tldHNbX19uXSA9IF9fbmV3X25vZGU7CisJfQorICAgICAgdGhpcy0+X01fc3RvcmVfY29kZShfX25ld19ub2RlLCBfX2NvZGUpOworCisgICAgICArK19NX2VsZW1lbnRfY291bnQ7CisgICAgICByZXR1cm4gaXRlcmF0b3IoX19uZXdfbm9kZSwgX01fYnVja2V0cyArIF9fbik7CisgICAgfQorCisgIC8vIEZvciBlcmFzZShpdGVyYXRvcikgYW5kIGVyYXNlKGNvbnN0X2l0ZXJhdG9yKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX01fZXJhc2Vfbm9kZShfTm9kZSogX19wLCBfTm9kZSoqIF9fYikKKyAgICB7CisgICAgICBfTm9kZSogX19jdXIgPSAqX19iOworICAgICAgaWYgKF9fY3VyID09IF9fcCkKKwkqX19iID0gX19jdXItPl9NX25leHQ7CisgICAgICBlbHNlCisJeworCSAgX05vZGUqIF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0OworCSAgd2hpbGUgKF9fbmV4dCAhPSBfX3ApCisJICAgIHsKKwkgICAgICBfX2N1ciA9IF9fbmV4dDsKKwkgICAgICBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkgICAgfQorCSAgX19jdXItPl9NX25leHQgPSBfX25leHQtPl9NX25leHQ7CisJfQorCisgICAgICBfTV9kZWFsbG9jYXRlX25vZGUoX19wKTsKKyAgICAgIC0tX01fZWxlbWVudF9jb3VudDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJc2l6ZV90eXBlIF9fbl9lbHQgPSBfX2RldGFpbDo6X19kaXN0YW5jZV9mdyhfX2ZpcnN0LCBfX2xhc3QpOworCXN0ZDo6cGFpcjxib29sLCBzdGQ6OnNpemVfdD4gX19kb19yZWhhc2gKKwkgID0gX01fcmVoYXNoX3BvbGljeS5fTV9uZWVkX3JlaGFzaChfTV9idWNrZXRfY291bnQsCisJCQkJCSAgICBfTV9lbGVtZW50X2NvdW50LCBfX25fZWx0KTsKKwlpZiAoX19kb19yZWhhc2guZmlyc3QpCisJICBfTV9yZWhhc2goX19kb19yZWhhc2guc2Vjb25kKTsKKworCWZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgdGhpcy0+aW5zZXJ0KCpfX2ZpcnN0KTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX19jaGMsIF9fY2l0LCBfX3VrPjo6aXRlcmF0b3IKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9fcmVzdWx0ID0gX19pdDsKKyAgICAgICsrX19yZXN1bHQ7CisgICAgICBfTV9lcmFzZV9ub2RlKF9faXQuX01fY3VyX25vZGUsIF9faXQuX01fY3VyX2J1Y2tldCk7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+Ojpjb25zdF9pdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9faXQpCisgICAgeworICAgICAgY29uc3RfaXRlcmF0b3IgX19yZXN1bHQgPSBfX2l0OworICAgICAgKytfX3Jlc3VsdDsKKyAgICAgIF9NX2VyYXNlX25vZGUoX19pdC5fTV9jdXJfbm9kZSwgX19pdC5fTV9jdXJfYnVja2V0KTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46OnNpemVfdHlwZQorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfTV9idWNrZXRfY291bnQpOworICAgICAgc2l6ZV90eXBlIF9fcmVzdWx0ID0gMDsKKworICAgICAgX05vZGUqKiBfX3Nsb3QgPSBfTV9idWNrZXRzICsgX19uOworICAgICAgd2hpbGUgKCpfX3Nsb3QgJiYgIXRoaXMtPl9NX2NvbXBhcmUoX19rLCBfX2NvZGUsICpfX3Nsb3QpKQorCV9fc2xvdCA9ICYoKCpfX3Nsb3QpLT5fTV9uZXh0KTsKKworICAgICAgX05vZGUqKiBfX3NhdmVkX3Nsb3QgPSAwOworICAgICAgd2hpbGUgKCpfX3Nsb3QgJiYgdGhpcy0+X01fY29tcGFyZShfX2ssIF9fY29kZSwgKl9fc2xvdCkpCisJeworCSAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgLy8gNTI2LiBJcyBpdCB1bmRlZmluZWQgaWYgYSBmdW5jdGlvbiBpbiB0aGUgc3RhbmRhcmQgY2hhbmdlcworCSAgLy8gaW4gcGFyYW1ldGVycz8KKwkgIGlmICgmdGhpcy0+X01fZXh0cmFjdCgoKl9fc2xvdCktPl9NX3YpICE9ICZfX2spCisJICAgIHsKKwkgICAgICBfTm9kZSogX19wID0gKl9fc2xvdDsKKwkgICAgICAqX19zbG90ID0gX19wLT5fTV9uZXh0OworCSAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZShfX3ApOworCSAgICAgIC0tX01fZWxlbWVudF9jb3VudDsKKwkgICAgICArK19fcmVzdWx0OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfX3NhdmVkX3Nsb3QgPSBfX3Nsb3Q7CisJICAgICAgX19zbG90ID0gJigoKl9fc2xvdCktPl9NX25leHQpOworCSAgICB9CisJfQorCisgICAgICBpZiAoX19zYXZlZF9zbG90KQorCXsKKwkgIF9Ob2RlKiBfX3AgPSAqX19zYXZlZF9zbG90OworCSAgKl9fc2F2ZWRfc2xvdCA9IF9fcC0+X01fbmV4dDsKKwkgIF9NX2RlYWxsb2NhdGVfbm9kZShfX3ApOworCSAgLS1fTV9lbGVtZW50X2NvdW50OworCSAgKytfX3Jlc3VsdDsKKwl9CisKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgLy8gPz8/IFRoaXMgY291bGQgYmUgb3B0aW1pemVkIGJ5IHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhlIGJ1Y2tldAorICAvLyBzdHJ1Y3R1cmUsIGJ1dCBpdCdzIG5vdCBjbGVhciB0aGF0IGl0J3Mgd29ydGggZG9pbmcuICBJdCBwcm9iYWJseQorICAvLyB3b3VsZG4ndCBldmVuIGJlIGFuIG9wdGltaXphdGlvbiB1bmxlc3MgdGhlIGxvYWQgZmFjdG9yIGlzIGxhcmdlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX19jaGMsIF9fY2l0LCBfX3VrPjo6aXRlcmF0b3IKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCV9fZmlyc3QgPSB0aGlzLT5lcmFzZShfX2ZpcnN0KTsKKyAgICAgIHJldHVybiBfX2xhc3Q7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+Ojpjb25zdF9pdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJX19maXJzdCA9IHRoaXMtPmVyYXNlKF9fZmlyc3QpOworICAgICAgcmV0dXJuIF9fbGFzdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgY2xlYXIoKQorICAgIHsKKyAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZXMoX01fYnVja2V0cywgX01fYnVja2V0X2NvdW50KTsKKyAgICAgIF9NX2VsZW1lbnRfY291bnQgPSAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICByZWhhc2goc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfTV9yZWhhc2goc3RkOjptYXgoX01fcmVoYXNoX3BvbGljeS5fTV9uZXh0X2JrdChfX24pLAorCQkJIF9NX3JlaGFzaF9wb2xpY3kuX01fYmt0X2Zvcl9lbGVtZW50cyhfTV9lbGVtZW50X2NvdW50CisJCQkJCQkJICAgICAgKyAxKSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9yZWhhc2goc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfTm9kZSoqIF9fbmV3X2FycmF5ID0gX01fYWxsb2NhdGVfYnVja2V0cyhfX24pOworICAgICAgX190cnkKKwl7CisJICBmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPCBfTV9idWNrZXRfY291bnQ7ICsrX19pKQorCSAgICB3aGlsZSAoX05vZGUqIF9fcCA9IF9NX2J1Y2tldHNbX19pXSkKKwkgICAgICB7CisJCXN0ZDo6c2l6ZV90IF9fbmV3X2luZGV4ID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9fcCwgX19uKTsKKwkJX01fYnVja2V0c1tfX2ldID0gX19wLT5fTV9uZXh0OworCQlfX3AtPl9NX25leHQgPSBfX25ld19hcnJheVtfX25ld19pbmRleF07CisJCV9fbmV3X2FycmF5W19fbmV3X2luZGV4XSA9IF9fcDsKKwkgICAgICB9CisJICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0cywgX01fYnVja2V0X2NvdW50KTsKKwkgIF9NX2J1Y2tldF9jb3VudCA9IF9fbjsKKwkgIF9NX2J1Y2tldHMgPSBfX25ld19hcnJheTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICAvLyBBIGZhaWx1cmUgaGVyZSBtZWFucyB0aGF0IGEgaGFzaCBmdW5jdGlvbiB0aHJldyBhbiBleGNlcHRpb24uCisJICAvLyBXZSBjYW4ndCByZXN0b3JlIHRoZSBwcmV2aW91cyBzdGF0ZSB3aXRob3V0IGNhbGxpbmcgdGhlIGhhc2gKKwkgIC8vIGZ1bmN0aW9uIGFnYWluLCBzbyB0aGUgb25seSBzZW5zaWJsZSByZWNvdmVyeSBpcyB0byBkZWxldGUKKwkgIC8vIGV2ZXJ5dGhpbmcuCisJICBfTV9kZWFsbG9jYXRlX25vZGVzKF9fbmV3X2FycmF5LCBfX24pOworCSAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9fbmV3X2FycmF5LCBfX24pOworCSAgX01fZGVhbGxvY2F0ZV9ub2RlcyhfTV9idWNrZXRzLCBfTV9idWNrZXRfY291bnQpOworCSAgX01fZWxlbWVudF9jb3VudCA9IDA7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHRyMQorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfSEFTSFRBQkxFX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2hhc2h0YWJsZV9wb2xpY3kuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2hhc2h0YWJsZV9wb2xpY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2M4MmRhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvaGFzaHRhYmxlX3BvbGljeS5oCkBAIC0wLDAgKzEsNzgzIEBACisvLyBJbnRlcm5hbCBwb2xpY3kgaGVhZGVyIGZvciBUUjEgdW5vcmRlcmVkX3NldCBhbmQgdW5vcmRlcmVkX21hcCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2hhc2h0YWJsZV9wb2xpY3kuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIAorICogIEBoZWFkZXJuYW1le3RyMS91bm9yZGVyZWRfbWFwLCB0cjEvdW5vcmRlcmVkX3NldH0KKyAqLworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sgCituYW1lc3BhY2UgdHIxCit7CituYW1lc3BhY2UgX19kZXRhaWwKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gSGVscGVyIGZ1bmN0aW9uOiByZXR1cm4gZGlzdGFuY2UoZmlyc3QsIGxhc3QpIGZvciBmb3J3YXJkCisgIC8vIGl0ZXJhdG9ycywgb3IgMCBmb3IgaW5wdXQgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTxjbGFzcyBfSXRlcmF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fZGlzdGFuY2VfZncoX0l0ZXJhdG9yIF9fZmlyc3QsIF9JdGVyYXRvciBfX2xhc3QsCisJCSAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeyByZXR1cm4gMDsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19kaXN0YW5jZV9mdyhfSXRlcmF0b3IgX19maXJzdCwgX0l0ZXJhdG9yIF9fbGFzdCwKKwkJICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsgcmV0dXJuIHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19kaXN0YW5jZV9mdyhfSXRlcmF0b3IgX19maXJzdCwgX0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9UYWc7CisgICAgICByZXR1cm4gX19kaXN0YW5jZV9mdyhfX2ZpcnN0LCBfX2xhc3QsIF9UYWcoKSk7CisgICAgfQorCisgIC8vIEF1eGlsaWFyeSB0eXBlcyB1c2VkIGZvciBhbGwgaW5zdGFudGlhdGlvbnMgb2YgX0hhc2h0YWJsZTogbm9kZXMKKyAgLy8gYW5kIGl0ZXJhdG9ycy4KKyAgCisgIC8vIE5vZGVzLCB1c2VkIHRvIHdyYXAgZWxlbWVudHMgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlLiAgQSBwb2xpY3kKKyAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyIG9mIGNsYXNzIHRlbXBsYXRlIF9IYXNodGFibGUgY29udHJvbHMgd2hldGhlcgorICAvLyBub2RlcyBhbHNvIHN0b3JlIGEgaGFzaCBjb2RlLiBJbiBzb21lIGNhc2VzIChlLmcuIHN0cmluZ3MpIHRoaXMKKyAgLy8gbWF5IGJlIGEgcGVyZm9ybWFuY2Ugd2luLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jYWNoZV9oYXNoX2NvZGU+CisgICAgc3RydWN0IF9IYXNoX25vZGU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIHN0cnVjdCBfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4KKyAgICB7CisgICAgICBfVmFsdWUgICAgICAgX01fdjsKKyAgICAgIHN0ZDo6c2l6ZV90ICBfTV9oYXNoX2NvZGU7CisgICAgICBfSGFzaF9ub2RlKiAgX01fbmV4dDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBzdHJ1Y3QgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPgorICAgIHsKKyAgICAgIF9WYWx1ZSAgICAgICBfTV92OworICAgICAgX0hhc2hfbm9kZSogIF9NX25leHQ7CisgICAgfTsKKworICAvLyBMb2NhbCBpdGVyYXRvcnMsIHVzZWQgdG8gaXRlcmF0ZSB3aXRoaW4gYSBidWNrZXQgYnV0IG5vdCBiZXR3ZWVuCisgIC8vIGJ1Y2tldHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfTm9kZV9pdGVyYXRvcl9iYXNlCisgICAgeworICAgICAgX05vZGVfaXRlcmF0b3JfYmFzZShfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCkKKyAgICAgIDogX01fY3VyKF9fcCkgeyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luY3IoKQorICAgICAgeyBfTV9jdXIgPSBfTV9jdXItPl9NX25leHQ7IH0KKworICAgICAgX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiAgX01fY3VyOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9fY2FjaGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPiYgX194LAorCSAgICAgICBjb25zdCBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fY3VyID09IF9feS5fTV9jdXI7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jYWNoZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9jdXIgIT0gX195Ll9NX2N1cjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NvbnN0YW50X2l0ZXJhdG9ycywgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfTm9kZV9pdGVyYXRvcgorICAgIDogcHVibGljIF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZQorICAgICAgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8X19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJICAgIGNvbnN0IF9WYWx1ZSosIF9WYWx1ZSo+OjpfX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZQorICAgICAgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8X19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJICAgIGNvbnN0IF9WYWx1ZSYsIF9WYWx1ZSY+OjpfX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICBfTm9kZV9pdGVyYXRvcigpCisgICAgICA6IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPigwKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9Ob2RlX2l0ZXJhdG9yKF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPiogX19wKQorICAgICAgOiBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oX19wKSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY3VyLT5fTV92OyB9CisgIAorICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHRoaXMtPl9NX2N1ci0+X01fdik7IH0KKworICAgICAgX05vZGVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgCisJdGhpcy0+X01faW5jcigpOworCXJldHVybiAqdGhpczsgCisgICAgICB9CisgIAorICAgICAgX05vZGVfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyAKKwlfTm9kZV9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NvbnN0YW50X2l0ZXJhdG9ycywgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfTm9kZV9jb25zdF9pdGVyYXRvcgorICAgIDogcHVibGljIF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCBfVmFsdWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9WYWx1ZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgX05vZGVfY29uc3RfaXRlcmF0b3IoKQorICAgICAgOiBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oMCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfTm9kZV9jb25zdF9pdGVyYXRvcihfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCkKKyAgICAgIDogX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+KF9fcCkgeyB9CisKKyAgICAgIF9Ob2RlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9Ob2RlX2l0ZXJhdG9yPF9WYWx1ZSwgX19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkgICBfX2NhY2hlPiYgX194KQorICAgICAgOiBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oX194Ll9NX2N1cikgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2N1ci0+X01fdjsgfQorICAKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZih0aGlzLT5fTV9jdXItPl9NX3YpOyB9CisKKyAgICAgIF9Ob2RlX2NvbnN0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IAorCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7IAorICAgICAgfQorICAKKyAgICAgIF9Ob2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgCisJX05vZGVfY29uc3RfaXRlcmF0b3IgX190bXAoKnRoaXMpOworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jYWNoZT4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlCisgICAgeworICAgICAgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlKF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPiogX19ub2RlLAorCQkJICAgICAgIF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPioqIF9fYnVja2V0KQorICAgICAgOiBfTV9jdXJfbm9kZShfX25vZGUpLCBfTV9jdXJfYnVja2V0KF9fYnVja2V0KSB7IH0KKworICAgICAgdm9pZAorICAgICAgX01faW5jcigpCisgICAgICB7CisJX01fY3VyX25vZGUgPSBfTV9jdXJfbm9kZS0+X01fbmV4dDsKKwlpZiAoIV9NX2N1cl9ub2RlKQorCSAgX01faW5jcl9idWNrZXQoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01faW5jcl9idWNrZXQoKTsKKworICAgICAgX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiAgIF9NX2N1cl9ub2RlOworICAgICAgX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiogIF9NX2N1cl9idWNrZXQ7CisgICAgfTsKKworICAvLyBHbG9iYWwgaXRlcmF0b3JzLCB1c2VkIGZvciBhcmJpdHJhcnkgaXRlcmF0aW9uIHdpdGhpbiBhIGhhc2gKKyAgLy8gdGFibGUuICBMYXJnZXIgYW5kIG1vcmUgZXhwZW5zaXZlIHRoYW4gbG9jYWwgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jYWNoZT4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT46OgorICAgIF9NX2luY3JfYnVja2V0KCkKKyAgICB7CisgICAgICArK19NX2N1cl9idWNrZXQ7CisKKyAgICAgIC8vIFRoaXMgbG9vcCByZXF1aXJlcyB0aGUgYnVja2V0IGFycmF5IHRvIGhhdmUgYSBub24tbnVsbCBzZW50aW5lbC4KKyAgICAgIHdoaWxlICghKl9NX2N1cl9idWNrZXQpCisJKytfTV9jdXJfYnVja2V0OworICAgICAgX01fY3VyX25vZGUgPSAqX01fY3VyX2J1Y2tldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9fY2FjaGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+JiBfX3gsCisJICAgICAgIGNvbnN0IF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2N1cl9ub2RlID09IF9feS5fTV9jdXJfbm9kZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NhY2hlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPiYgX194LAorCSAgICAgICBjb25zdCBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9jdXJfbm9kZSAhPSBfX3kuX01fY3VyX25vZGU7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jb25zdGFudF9pdGVyYXRvcnMsIGJvb2wgX19jYWNoZT4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9pdGVyYXRvcgorICAgIDogcHVibGljIF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+CisgICAgeworICAgICAgdHlwZWRlZiBfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTxfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkgICAgY29uc3QgX1ZhbHVlKiwgX1ZhbHVlKj46Ol9fdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTxfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkgICAgY29uc3QgX1ZhbHVlJiwgX1ZhbHVlJj46Ol9fdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIF9IYXNodGFibGVfaXRlcmF0b3IoKQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPigwLCAwKSB7IH0KKworICAgICAgX0hhc2h0YWJsZV9pdGVyYXRvcihfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCwKKwkJCSAgX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiogX19iKQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPihfX3AsIF9fYikgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yKF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPioqIF9fYikKKyAgICAgIDogX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oKl9fYiwgX19iKSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY3VyX25vZGUtPl9NX3Y7IH0KKyAgCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YodGhpcy0+X01fY3VyX25vZGUtPl9NX3YpOyB9CisKKyAgICAgIF9IYXNodGFibGVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgCisJdGhpcy0+X01faW5jcigpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgCisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgCisJX0hhc2h0YWJsZV9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NvbnN0YW50X2l0ZXJhdG9ycywgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1ZhbHVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVmFsdWUmICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3IoKQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPigwLCAwKSB7IH0KKworICAgICAgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcihfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCwKKwkJCQlfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qKiBfX2IpCisgICAgICA6IF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+KF9fcCwgX19iKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3IoX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiogX19iKQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPigqX19iLCBfX2IpIHsgfQorCisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbHVlLAorCQkJCV9fY29uc3RhbnRfaXRlcmF0b3JzLCBfX2NhY2hlPiYgX194KQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPihfX3guX01fY3VyX25vZGUsCisJCQkJCQkgIF9feC5fTV9jdXJfYnVja2V0KSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY3VyX25vZGUtPl9NX3Y7IH0KKyAgCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YodGhpcy0+X01fY3VyX25vZGUtPl9NX3YpOyB9CisKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgCisJdGhpcy0+X01faW5jcigpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgCisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgCisJX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICB9OworCisKKyAgLy8gTWFueSBvZiBjbGFzcyB0ZW1wbGF0ZSBfSGFzaHRhYmxlJ3MgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgcG9saWN5CisgIC8vIGNsYXNzZXMuICBUaGVzZSBhcmUgZGVmYXVsdHMgZm9yIHRoZSBwb2xpY2llcy4KKworICAvLyBEZWZhdWx0IHJhbmdlIGhhc2hpbmcgZnVuY3Rpb246IHVzZSBkaXZpc2lvbiB0byBmb2xkIGEgbGFyZ2UgbnVtYmVyCisgIC8vIGludG8gdGhlIHJhbmdlIFswLCBOKS4KKyAgc3RydWN0IF9Nb2RfcmFuZ2VfaGFzaGluZworICB7CisgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCBmaXJzdF9hcmd1bWVudF90eXBlOworICAgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCByZXN1bHRfdHlwZTsKKworICAgIHJlc3VsdF90eXBlCisgICAgb3BlcmF0b3IoKShmaXJzdF9hcmd1bWVudF90eXBlIF9fbnVtLCBzZWNvbmRfYXJndW1lbnRfdHlwZSBfX2RlbikgY29uc3QKKyAgICB7IHJldHVybiBfX251bSAlIF9fZGVuOyB9CisgIH07CisKKyAgLy8gRGVmYXVsdCByYW5nZWQgaGFzaCBmdW5jdGlvbiBILiAgSW4gcHJpbmNpcGxlIGl0IHNob3VsZCBiZSBhCisgIC8vIGZ1bmN0aW9uIG9iamVjdCBjb21wb3NlZCBmcm9tIG9iamVjdHMgb2YgdHlwZSBIMSBhbmQgSDIgc3VjaCB0aGF0CisgIC8vIGgoaywgTikgPSBoMihoMShrKSwgTiksIGJ1dCB0aGF0IHdvdWxkIG1lYW4gbWFraW5nIGV4dHJhIGNvcGllcyBvZgorICAvLyBoMSBhbmQgaDIuICBTbyBpbnN0ZWFkIHdlJ2xsIGp1c3QgdXNlIGEgdGFnIHRvIHRlbGwgY2xhc3MgdGVtcGxhdGUKKyAgLy8gaGFzaHRhYmxlIHRvIGRvIHRoYXQgY29tcG9zaXRpb24uCisgIHN0cnVjdCBfRGVmYXVsdF9yYW5nZWRfaGFzaCB7IH07CisKKyAgLy8gRGVmYXVsdCB2YWx1ZSBmb3IgcmVoYXNoIHBvbGljeS4gIEJ1Y2tldCBzaXplIGlzICh1c3VhbGx5KSB0aGUKKyAgLy8gc21hbGxlc3QgcHJpbWUgdGhhdCBrZWVwcyB0aGUgbG9hZCBmYWN0b3Igc21hbGwgZW5vdWdoLgorICBzdHJ1Y3QgX1ByaW1lX3JlaGFzaF9wb2xpY3kKKyAgeworICAgIF9QcmltZV9yZWhhc2hfcG9saWN5KGZsb2F0IF9feiA9IDEuMCkKKyAgICA6IF9NX21heF9sb2FkX2ZhY3RvcihfX3opLCBfTV9ncm93dGhfZmFjdG9yKDIuZiksIF9NX25leHRfcmVzaXplKDApIHsgfQorCisgICAgZmxvYXQKKyAgICBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX21heF9sb2FkX2ZhY3RvcjsgfSAgICAgIAorCisgICAgLy8gUmV0dXJuIGEgYnVja2V0IHNpemUgbm8gc21hbGxlciB0aGFuIG4uCisgICAgc3RkOjpzaXplX3QKKyAgICBfTV9uZXh0X2JrdChzdGQ6OnNpemVfdCBfX24pIGNvbnN0OworICAgIAorICAgIC8vIFJldHVybiBhIGJ1Y2tldCBjb3VudCBhcHByb3ByaWF0ZSBmb3IgbiBlbGVtZW50cworICAgIHN0ZDo6c2l6ZV90CisgICAgX01fYmt0X2Zvcl9lbGVtZW50cyhzdGQ6OnNpemVfdCBfX24pIGNvbnN0OworICAgIAorICAgIC8vIF9fbl9ia3QgaXMgY3VycmVudCBidWNrZXQgY291bnQsIF9fbl9lbHQgaXMgY3VycmVudCBlbGVtZW50IGNvdW50LAorICAgIC8vIGFuZCBfX25faW5zIGlzIG51bWJlciBvZiBlbGVtZW50cyB0byBiZSBpbnNlcnRlZC4gIERvIHdlIG5lZWQgdG8KKyAgICAvLyBpbmNyZWFzZSBidWNrZXQgY291bnQ/ICBJZiBzbywgcmV0dXJuIG1ha2VfcGFpcih0cnVlLCBuKSwgd2hlcmUgbgorICAgIC8vIGlzIHRoZSBuZXcgYnVja2V0IGNvdW50LiAgSWYgbm90LCByZXR1cm4gbWFrZV9wYWlyKGZhbHNlLCAwKS4KKyAgICBzdGQ6OnBhaXI8Ym9vbCwgc3RkOjpzaXplX3Q+CisgICAgX01fbmVlZF9yZWhhc2goc3RkOjpzaXplX3QgX19uX2JrdCwgc3RkOjpzaXplX3QgX19uX2VsdCwKKwkJICAgc3RkOjpzaXplX3QgX19uX2lucykgY29uc3Q7CisKKyAgICBlbnVtIHsgX1Nfbl9wcmltZXMgPSBzaXplb2YodW5zaWduZWQgbG9uZykgIT0gOCA/IDI1NiA6IDI1NiArIDQ4IH07CisKKyAgICBmbG9hdCAgICAgICAgICAgICAgICBfTV9tYXhfbG9hZF9mYWN0b3I7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgX01fZ3Jvd3RoX2ZhY3RvcjsKKyAgICBtdXRhYmxlIHN0ZDo6c2l6ZV90ICBfTV9uZXh0X3Jlc2l6ZTsKKyAgfTsKKworICBleHRlcm4gY29uc3QgdW5zaWduZWQgbG9uZyBfX3ByaW1lX2xpc3RbXTsKKworICAvLyBYWFggVGhpcyBpcyBhIGhhY2suICBUaGVyZSdzIG5vIGdvb2QgcmVhc29uIGZvciBhbnkgb2YKKyAgLy8gX1ByaW1lX3JlaGFzaF9wb2xpY3kncyBtZW1iZXIgZnVuY3Rpb25zIHRvIGJlIGlubGluZS4gIAorCisgIC8vIFJldHVybiBhIHByaW1lIG5vIHNtYWxsZXIgdGhhbiBuLgorICBpbmxpbmUgc3RkOjpzaXplX3QKKyAgX1ByaW1lX3JlaGFzaF9wb2xpY3k6OgorICBfTV9uZXh0X2JrdChzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgIHsKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBfX3AgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fcHJpbWVfbGlzdCwgX19wcmltZV9saXN0CisJCQkJCQkrIF9TX25fcHJpbWVzLCBfX24pOworICAgIF9NX25leHRfcmVzaXplID0gCisgICAgICBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oX19idWlsdGluX2NlaWwoKl9fcCAqIF9NX21heF9sb2FkX2ZhY3RvcikpOworICAgIHJldHVybiAqX19wOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBzbWFsbGVzdCBwcmltZSBwIHN1Y2ggdGhhdCBhbHBoYSBwID49IG4sIHdoZXJlIGFscGhhCisgIC8vIGlzIHRoZSBsb2FkIGZhY3Rvci4KKyAgaW5saW5lIHN0ZDo6c2l6ZV90CisgIF9QcmltZV9yZWhhc2hfcG9saWN5OjoKKyAgX01fYmt0X2Zvcl9lbGVtZW50cyhzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgIHsKKyAgICBjb25zdCBmbG9hdCBfX21pbl9ia3RzID0gX19uIC8gX01fbWF4X2xvYWRfZmFjdG9yOworICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcqIF9fcCA9IHN0ZDo6bG93ZXJfYm91bmQoX19wcmltZV9saXN0LCBfX3ByaW1lX2xpc3QKKwkJCQkJCSsgX1Nfbl9wcmltZXMsIF9fbWluX2JrdHMpOworICAgIF9NX25leHRfcmVzaXplID0KKyAgICAgIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihfX2J1aWx0aW5fY2VpbCgqX19wICogX01fbWF4X2xvYWRfZmFjdG9yKSk7CisgICAgcmV0dXJuICpfX3A7CisgIH0KKworICAvLyBGaW5kcyB0aGUgc21hbGxlc3QgcHJpbWUgcCBzdWNoIHRoYXQgYWxwaGEgcCA+IF9fbl9lbHQgKyBfX25faW5zLgorICAvLyBJZiBwID4gX19uX2JrdCwgcmV0dXJuIG1ha2VfcGFpcih0cnVlLCBwKTsgb3RoZXJ3aXNlIHJldHVybgorICAvLyBtYWtlX3BhaXIoZmFsc2UsIDApLiAgSW4gcHJpbmNpcGxlIHRoaXMgaXNuJ3QgdmVyeSBkaWZmZXJlbnQgZnJvbSAKKyAgLy8gX01fYmt0X2Zvcl9lbGVtZW50cy4KKworICAvLyBUaGUgb25seSB0cmlja3kgcGFydCBpcyB0aGF0IHdlJ3JlIGNhY2hpbmcgdGhlIGVsZW1lbnQgY291bnQgYXQKKyAgLy8gd2hpY2ggd2UgbmVlZCB0byByZWhhc2gsIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gYSBmbG9hdGluZy1wb2ludAorICAvLyBtdWx0aXBseSBmb3IgZXZlcnkgaW5zZXJ0aW9uLgorCisgIGlubGluZSBzdGQ6OnBhaXI8Ym9vbCwgc3RkOjpzaXplX3Q+CisgIF9QcmltZV9yZWhhc2hfcG9saWN5OjoKKyAgX01fbmVlZF9yZWhhc2goc3RkOjpzaXplX3QgX19uX2JrdCwgc3RkOjpzaXplX3QgX19uX2VsdCwKKwkJIHN0ZDo6c2l6ZV90IF9fbl9pbnMpIGNvbnN0CisgIHsKKyAgICBpZiAoX19uX2VsdCArIF9fbl9pbnMgPiBfTV9uZXh0X3Jlc2l6ZSkKKyAgICAgIHsKKwlmbG9hdCBfX21pbl9ia3RzID0gKChmbG9hdChfX25faW5zKSArIGZsb2F0KF9fbl9lbHQpKQorCQkJICAgIC8gX01fbWF4X2xvYWRfZmFjdG9yKTsKKwlpZiAoX19taW5fYmt0cyA+IF9fbl9ia3QpCisJICB7CisJICAgIF9fbWluX2JrdHMgPSBzdGQ6Om1heChfX21pbl9ia3RzLCBfTV9ncm93dGhfZmFjdG9yICogX19uX2JrdCk7CisJICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcqIF9fcCA9CisJICAgICAgc3RkOjpsb3dlcl9ib3VuZChfX3ByaW1lX2xpc3QsIF9fcHJpbWVfbGlzdCArIF9TX25fcHJpbWVzLAorCQkJICAgICAgIF9fbWluX2JrdHMpOworCSAgICBfTV9uZXh0X3Jlc2l6ZSA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PgorCSAgICAgIChfX2J1aWx0aW5fY2VpbCgqX19wICogX01fbWF4X2xvYWRfZmFjdG9yKSk7CisJICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0cnVlLCAqX19wKTsKKwkgIH0KKwllbHNlIAorCSAgeworCSAgICBfTV9uZXh0X3Jlc2l6ZSA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PgorCSAgICAgIChfX2J1aWx0aW5fY2VpbChfX25fYmt0ICogX01fbWF4X2xvYWRfZmFjdG9yKSk7CisJICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihmYWxzZSwgMCk7CisJICB9CisgICAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGZhbHNlLCAwKTsKKyAgfQorCisgIC8vIEJhc2UgY2xhc3NlcyBmb3Igc3RkOjp0cjE6Ol9IYXNodGFibGUuICBXZSBkZWZpbmUgdGhlc2UgYmFzZQorICAvLyBjbGFzc2VzIGJlY2F1c2UgaW4gc29tZSBjYXNlcyB3ZSB3YW50IHRvIGRvIGRpZmZlcmVudCB0aGluZ3MKKyAgLy8gZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBhIHBvbGljeSBjbGFzcy4gIEluIHNvbWUgY2FzZXMgdGhlCisgIC8vIHBvbGljeSBjbGFzcyBhZmZlY3RzIHdoaWNoIG1lbWJlciBmdW5jdGlvbnMgYW5kIG5lc3RlZCB0eXBlZGVmcworICAvLyBhcmUgZGVmaW5lZDsgd2UgaGFuZGxlIHRoYXQgYnkgc3BlY2lhbGl6aW5nIGJhc2UgY2xhc3MgdGVtcGxhdGVzLgorICAvLyBTZXZlcmFsIG9mIHRoZSBiYXNlIGNsYXNzIHRlbXBsYXRlcyBuZWVkIHRvIGFjY2VzcyBvdGhlciBtZW1iZXJzCisgIC8vIG9mIGNsYXNzIHRlbXBsYXRlIF9IYXNodGFibGUsIHNvIHdlIHVzZSB0aGUgImN1cmlvdXNseSByZWN1cnJpbmcKKyAgLy8gdGVtcGxhdGUgcGF0dGVybiIgZm9yIHRoZW0uCisKKyAgLy8gY2xhc3MgdGVtcGxhdGUgX01hcF9iYXNlLiAgSWYgdGhlIGhhc2h0YWJsZSBoYXMgYSB2YWx1ZSB0eXBlIG9mIHRoZQorICAvLyBmb3JtIHBhaXI8VDEsIFQyPiBhbmQgYSBrZXkgZXh0cmFjdGlvbiBwb2xpY3kgdGhhdCByZXR1cm5zIHRoZQorICAvLyBmaXJzdCBwYXJ0IG9mIHRoZSBwYWlyLCB0aGUgaGFzaHRhYmxlIGdldHMgYSBtYXBwZWRfdHlwZSB0eXBlZGVmLgorICAvLyBJZiBpdCBzYXRpc2ZpZXMgdGhvc2UgY3JpdGVyaWEgYW5kIGFsc28gaGFzIHVuaXF1ZSBrZXlzLCB0aGVuIGl0CisgIC8vIGFsc28gZ2V0cyBhbiBvcGVyYXRvcltdLiAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0V4LCBib29sIF9fdW5pcXVlLAorCSAgIHR5cGVuYW1lIF9IYXNodGFibGU+CisgICAgc3RydWN0IF9NYXBfYmFzZSB7IH07CisJICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lIF9IYXNodGFibGU+CisgICAgc3RydWN0IF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgc3RkOjpfU2VsZWN0MXN0PF9QYWlyPiwgZmFsc2UsIF9IYXNodGFibGU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUGFpcjo6c2Vjb25kX3R5cGUgbWFwcGVkX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgX0hhc2h0YWJsZT4KKyAgICBzdHJ1Y3QgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBzdGQ6Ol9TZWxlY3Qxc3Q8X1BhaXI+LCB0cnVlLCBfSGFzaHRhYmxlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXI6OnNlY29uZF90eXBlIG1hcHBlZF90eXBlOworICAgICAgCisgICAgICBtYXBwZWRfdHlwZSYKKyAgICAgIG9wZXJhdG9yW10oY29uc3QgX0tleSYgX19rKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSBfSGFzaHRhYmxlPgorICAgIHR5cGVuYW1lIF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgc3RkOjpfU2VsZWN0MXN0PF9QYWlyPiwKKwkJICAgICAgIHRydWUsIF9IYXNodGFibGU+OjptYXBwZWRfdHlwZSYKKyAgICBfTWFwX2Jhc2U8X0tleSwgX1BhaXIsIHN0ZDo6X1NlbGVjdDFzdDxfUGFpcj4sIHRydWUsIF9IYXNodGFibGU+OjoKKyAgICBvcGVyYXRvcltdKGNvbnN0IF9LZXkmIF9faykKKyAgICB7CisgICAgICBfSGFzaHRhYmxlKiBfX2ggPSBzdGF0aWNfY2FzdDxfSGFzaHRhYmxlKj4odGhpcyk7CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gX19oLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IF9faC0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLAorCQkJCQkgICAgIF9faC0+X01fYnVja2V0X2NvdW50KTsKKworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X05vZGUqIF9fcCA9CisJX19oLT5fTV9maW5kX25vZGUoX19oLT5fTV9idWNrZXRzW19fbl0sIF9faywgX19jb2RlKTsKKyAgICAgIGlmICghX19wKQorCXJldHVybiBfX2gtPl9NX2luc2VydF9idWNrZXQoc3RkOjptYWtlX3BhaXIoX19rLCBtYXBwZWRfdHlwZSgpKSwKKwkJCQkgICAgIF9fbiwgX19jb2RlKS0+c2Vjb25kOworICAgICAgcmV0dXJuIChfX3AtPl9NX3YpLnNlY29uZDsKKyAgICB9CisKKyAgLy8gY2xhc3MgdGVtcGxhdGUgX1JlaGFzaF9iYXNlLiAgR2l2ZSBoYXNodGFibGUgdGhlIG1heF9sb2FkX2ZhY3RvcgorICAvLyBmdW5jdGlvbnMgaWZmIHRoZSByZWhhc2ggcG9saWN5IGlzIF9QcmltZV9yZWhhc2hfcG9saWN5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfSGFzaHRhYmxlPgorICAgIHN0cnVjdCBfUmVoYXNoX2Jhc2UgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9IYXNodGFibGU+CisgICAgc3RydWN0IF9SZWhhc2hfYmFzZTxfUHJpbWVfcmVoYXNoX3BvbGljeSwgX0hhc2h0YWJsZT4KKyAgICB7CisgICAgICBmbG9hdAorICAgICAgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3QKKyAgICAgIHsKKwljb25zdCBfSGFzaHRhYmxlKiBfX3RoaXMgPSBzdGF0aWNfY2FzdDxjb25zdCBfSGFzaHRhYmxlKj4odGhpcyk7CisJcmV0dXJuIF9fdGhpcy0+X19yZWhhc2hfcG9saWN5KCkubWF4X2xvYWRfZmFjdG9yKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX3opCisgICAgICB7CisJX0hhc2h0YWJsZSogX190aGlzID0gc3RhdGljX2Nhc3Q8X0hhc2h0YWJsZSo+KHRoaXMpOworCV9fdGhpcy0+X19yZWhhc2hfcG9saWN5KF9QcmltZV9yZWhhc2hfcG9saWN5KF9feikpOworICAgICAgfQorICAgIH07CisKKyAgLy8gQ2xhc3MgdGVtcGxhdGUgX0hhc2hfY29kZV9iYXNlLiAgRW5jYXBzdWxhdGVzIHR3byBwb2xpY3kgaXNzdWVzIHRoYXQKKyAgLy8gYXJlbid0IHF1aXRlIG9ydGhvZ29uYWwuCisgIC8vICAgKDEpIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdXNpbmcgYSByYW5nZWQgaGFzaCBmdW5jdGlvbiBhbmQgdXNpbmcKKyAgLy8gICAgICAgdGhlIGNvbWJpbmF0aW9uIG9mIGEgaGFzaCBmdW5jdGlvbiBhbmQgYSByYW5nZS1oYXNoaW5nIGZ1bmN0aW9uLgorICAvLyAgICAgICBJbiB0aGUgZm9ybWVyIGNhc2Ugd2UgZG9uJ3QgaGF2ZSBzdWNoIHRoaW5ncyBhcyBoYXNoIGNvZGVzLCBzbworICAvLyAgICAgICB3ZSBoYXZlIGEgZHVtbXkgdHlwZSBhcyBwbGFjZWhvbGRlci4KKyAgLy8gICAoMikgV2hldGhlciBvciBub3Qgd2UgY2FjaGUgaGFzaCBjb2Rlcy4gIENhY2hpbmcgaGFzaCBjb2RlcyBpcworICAvLyAgICAgICBtZWFuaW5nbGVzcyBpZiB3ZSBoYXZlIGEgcmFuZ2VkIGhhc2ggZnVuY3Rpb24uCisgIC8vIFdlIGFsc28gcHV0IHRoZSBrZXkgZXh0cmFjdGlvbiBhbmQgZXF1YWxpdHkgY29tcGFyaXNvbiBmdW5jdGlvbiAKKyAgLy8gb2JqZWN0cyBoZXJlLCBmb3IgY29udmVuaWVuY2UuCisgIAorICAvLyBQcmltYXJ5IHRlbXBsYXRlOiB1bnVzZWQgZXhjZXB0IGFzIGEgaG9vayBmb3Igc3BlY2lhbGl6YXRpb25zLiAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIHN0cnVjdCBfSGFzaF9jb2RlX2Jhc2U7CisKKyAgLy8gU3BlY2lhbGl6YXRpb246IHJhbmdlZCBoYXNoIGZ1bmN0aW9uLCBubyBjYWNoaW5nIGhhc2ggY29kZXMuICBIMQorICAvLyBhbmQgSDIgYXJlIHByb3ZpZGVkIGJ1dCBpZ25vcmVkLiAgV2UgZGVmaW5lIGEgZHVtbXkgaGFzaCBjb2RlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaD4KKyAgICBzdHJ1Y3QgX0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLCBfSDIsCisJCQkgICBfSGFzaCwgZmFsc2U+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9IYXNoX2NvZGVfYmFzZShjb25zdCBfRXh0cmFjdEtleSYgX19leCwgY29uc3QgX0VxdWFsJiBfX2VxLAorCQkgICAgICBjb25zdCBfSDEmLCBjb25zdCBfSDImLCBjb25zdCBfSGFzaCYgX19oKQorICAgICAgOiBfTV9leHRyYWN0KF9fZXgpLCBfTV9lcShfX2VxKSwgX01fcmFuZ2VkX2hhc2goX19oKSB7IH0KKworICAgICAgdHlwZWRlZiB2b2lkKiBfSGFzaF9jb2RlX3R5cGU7CisgIAorICAgICAgX0hhc2hfY29kZV90eXBlCisgICAgICBfTV9oYXNoX2NvZGUoY29uc3QgX0tleSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiAwOyB9CisgIAorICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfS2V5JiBfX2ssIF9IYXNoX2NvZGVfdHlwZSwKKwkJICAgICAgc3RkOjpzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmFuZ2VkX2hhc2goX19rLCBfX24pOyB9CisKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAgICBfTV9idWNrZXRfaW5kZXgoY29uc3QgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiogX19wLAorCQkgICAgICBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9yYW5nZWRfaGFzaChfTV9leHRyYWN0KF9fcC0+X01fdiksIF9fbik7IH0KKyAgCisgICAgICBib29sCisgICAgICBfTV9jb21wYXJlKGNvbnN0IF9LZXkmIF9faywgX0hhc2hfY29kZV90eXBlLAorCQkgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiogX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXEoX19rLCBfTV9leHRyYWN0KF9fbi0+X01fdikpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N0b3JlX2NvZGUoX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiosIF9IYXNoX2NvZGVfdHlwZSkgY29uc3QKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jb3B5X2NvZGUoX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiosCisJCSAgIGNvbnN0IF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qKSBjb25zdAorICAgICAgeyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N3YXAoX0hhc2hfY29kZV9iYXNlJiBfX3gpCisgICAgICB7CisJc3RkOjpzd2FwKF9NX2V4dHJhY3QsIF9feC5fTV9leHRyYWN0KTsKKwlzdGQ6OnN3YXAoX01fZXEsIF9feC5fTV9lcSk7CisJc3RkOjpzd2FwKF9NX3JhbmdlZF9oYXNoLCBfX3guX01fcmFuZ2VkX2hhc2gpOworICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgX0V4dHJhY3RLZXkgIF9NX2V4dHJhY3Q7CisgICAgICBfRXF1YWwgICAgICAgX01fZXE7CisgICAgICBfSGFzaCAgICAgICAgX01fcmFuZ2VkX2hhc2g7CisgICAgfTsKKworCisgIC8vIE5vIHNwZWNpYWxpemF0aW9uIGZvciByYW5nZWQgaGFzaCBmdW5jdGlvbiB3aGlsZSBjYWNoaW5nIGhhc2ggY29kZXMuCisgIC8vIFRoYXQgY29tYmluYXRpb24gaXMgbWVhbmluZ2xlc3MsIGFuZCB0cnlpbmcgdG8gZG8gaXQgaXMgYW4gZXJyb3IuCisgIAorICAKKyAgLy8gU3BlY2lhbGl6YXRpb246IHJhbmdlZCBoYXNoIGZ1bmN0aW9uLCBjYWNoZSBoYXNoIGNvZGVzLiAgVGhpcworICAvLyBjb21iaW5hdGlvbiBpcyBtZWFuaW5nbGVzcywgc28gd2UgcHJvdmlkZSBvbmx5IGEgZGVjbGFyYXRpb24KKyAgLy8gYW5kIG5vIGRlZmluaXRpb24uICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoPgorICAgIHN0cnVjdCBfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsIF9IMiwKKwkJCSAgIF9IYXNoLCB0cnVlPjsKKworICAvLyBTcGVjaWFsaXphdGlvbjogaGFzaCBmdW5jdGlvbiBhbmQgcmFuZ2UtaGFzaGluZyBmdW5jdGlvbiwgbm8KKyAgLy8gY2FjaGluZyBvZiBoYXNoIGNvZGVzLiAgSCBpcyBwcm92aWRlZCBidXQgaWdub3JlZC4gIFByb3ZpZGVzCisgIC8vIHR5cGVkZWYgYW5kIGFjY2Vzc29yIHJlcXVpcmVkIGJ5IFRSMS4gIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMj4KKyAgICBzdHJ1Y3QgX0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLCBfSDIsCisJCQkgICBfRGVmYXVsdF9yYW5nZWRfaGFzaCwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBfSDEgaGFzaGVyOworCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3Rpb24oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDE7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9IYXNoX2NvZGVfYmFzZShjb25zdCBfRXh0cmFjdEtleSYgX19leCwgY29uc3QgX0VxdWFsJiBfX2VxLAorCQkgICAgICBjb25zdCBfSDEmIF9faDEsIGNvbnN0IF9IMiYgX19oMiwKKwkJICAgICAgY29uc3QgX0RlZmF1bHRfcmFuZ2VkX2hhc2gmKQorICAgICAgOiBfTV9leHRyYWN0KF9fZXgpLCBfTV9lcShfX2VxKSwgX01faDEoX19oMSksIF9NX2gyKF9faDIpIHsgfQorCisgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IF9IYXNoX2NvZGVfdHlwZTsKKworICAgICAgX0hhc2hfY29kZV90eXBlCisgICAgICBfTV9oYXNoX2NvZGUoY29uc3QgX0tleSYgX19rKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDEoX19rKTsgfQorICAgICAgCisgICAgICBzdGQ6OnNpemVfdAorICAgICAgX01fYnVja2V0X2luZGV4KGNvbnN0IF9LZXkmLCBfSGFzaF9jb2RlX3R5cGUgX19jLAorCQkgICAgICBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMihfX2MsIF9fbik7IH0KKworICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiBfX3AsCisJCSAgICAgIHN0ZDo6c2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gyKF9NX2gxKF9NX2V4dHJhY3QoX19wLT5fTV92KSksIF9fbik7IH0KKworICAgICAgYm9vbAorICAgICAgX01fY29tcGFyZShjb25zdCBfS2V5JiBfX2ssIF9IYXNoX2NvZGVfdHlwZSwKKwkJIF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2VxKF9faywgX01fZXh0cmFjdChfX24tPl9NX3YpKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zdG9yZV9jb2RlKF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qLCBfSGFzaF9jb2RlX3R5cGUpIGNvbnN0CisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fY29weV9jb2RlKF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qLAorCQkgICBjb25zdCBfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KikgY29uc3QKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9IYXNoX2NvZGVfYmFzZSYgX194KQorICAgICAgeworCXN0ZDo6c3dhcChfTV9leHRyYWN0LCBfX3guX01fZXh0cmFjdCk7CisJc3RkOjpzd2FwKF9NX2VxLCBfX3guX01fZXEpOworCXN0ZDo6c3dhcChfTV9oMSwgX194Ll9NX2gxKTsKKwlzdGQ6OnN3YXAoX01faDIsIF9feC5fTV9oMik7CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfRXh0cmFjdEtleSAgX01fZXh0cmFjdDsKKyAgICAgIF9FcXVhbCAgICAgICBfTV9lcTsKKyAgICAgIF9IMSAgICAgICAgICBfTV9oMTsKKyAgICAgIF9IMiAgICAgICAgICBfTV9oMjsKKyAgICB9OworCisgIC8vIFNwZWNpYWxpemF0aW9uOiBoYXNoIGZ1bmN0aW9uIGFuZCByYW5nZS1oYXNoaW5nIGZ1bmN0aW9uLCAKKyAgLy8gY2FjaGluZyBoYXNoIGNvZGVzLiAgSCBpcyBwcm92aWRlZCBidXQgaWdub3JlZC4gIFByb3ZpZGVzCisgIC8vIHR5cGVkZWYgYW5kIGFjY2Vzc29yIHJlcXVpcmVkIGJ5IFRSMS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDI+CisgICAgc3RydWN0IF9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwgX0gyLAorCQkJICAgX0RlZmF1bHRfcmFuZ2VkX2hhc2gsIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiBfSDEgaGFzaGVyOworICAgICAgCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3Rpb24oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDE7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9IYXNoX2NvZGVfYmFzZShjb25zdCBfRXh0cmFjdEtleSYgX19leCwgY29uc3QgX0VxdWFsJiBfX2VxLAorCQkgICAgICBjb25zdCBfSDEmIF9faDEsIGNvbnN0IF9IMiYgX19oMiwKKwkJICAgICAgY29uc3QgX0RlZmF1bHRfcmFuZ2VkX2hhc2gmKQorICAgICAgOiBfTV9leHRyYWN0KF9fZXgpLCBfTV9lcShfX2VxKSwgX01faDEoX19oMSksIF9NX2gyKF9faDIpIHsgfQorCisgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IF9IYXNoX2NvZGVfdHlwZTsKKyAgCisgICAgICBfSGFzaF9jb2RlX3R5cGUKKyAgICAgIF9NX2hhc2hfY29kZShjb25zdCBfS2V5JiBfX2spIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMShfX2spOyB9CisgIAorICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfS2V5JiwgX0hhc2hfY29kZV90eXBlIF9fYywKKwkJICAgICAgc3RkOjpzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDIoX19jLCBfX24pOyB9CisKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAgICBfTV9idWNrZXRfaW5kZXgoY29uc3QgX0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+KiBfX3AsCisJCSAgICAgIHN0ZDo6c2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gyKF9fcC0+X01faGFzaF9jb2RlLCBfX24pOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2NvbXBhcmUoY29uc3QgX0tleSYgX19rLCBfSGFzaF9jb2RlX3R5cGUgX19jLAorCQkgX0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+KiBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfX2MgPT0gX19uLT5fTV9oYXNoX2NvZGUgJiYgX01fZXEoX19rLCBfTV9leHRyYWN0KF9fbi0+X01fdikpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N0b3JlX2NvZGUoX0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+KiBfX24sIF9IYXNoX2NvZGVfdHlwZSBfX2MpIGNvbnN0CisgICAgICB7IF9fbi0+X01faGFzaF9jb2RlID0gX19jOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NvcHlfY29kZShfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4qIF9fdG8sCisJCSAgIGNvbnN0IF9IYXNoX25vZGU8X1ZhbHVlLCB0cnVlPiogX19mcm9tKSBjb25zdAorICAgICAgeyBfX3RvLT5fTV9oYXNoX2NvZGUgPSBfX2Zyb20tPl9NX2hhc2hfY29kZTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9IYXNoX2NvZGVfYmFzZSYgX194KQorICAgICAgeworCXN0ZDo6c3dhcChfTV9leHRyYWN0LCBfX3guX01fZXh0cmFjdCk7CisJc3RkOjpzd2FwKF9NX2VxLCBfX3guX01fZXEpOworCXN0ZDo6c3dhcChfTV9oMSwgX194Ll9NX2gxKTsKKwlzdGQ6OnN3YXAoX01faDIsIF9feC5fTV9oMik7CisgICAgICB9CisgICAgICAKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfRXh0cmFjdEtleSAgX01fZXh0cmFjdDsKKyAgICAgIF9FcXVhbCAgICAgICBfTV9lcTsKKyAgICAgIF9IMSAgICAgICAgICBfTV9oMTsKKyAgICAgIF9IMiAgICAgICAgICBfTV9oMjsKKyAgICB9OworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvaHlwZXJnZW9tZXRyaWMudGNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvaHlwZXJnZW9tZXRyaWMudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZjcyNTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9oeXBlcmdlb21ldHJpYy50Y2MKQEAgLTAsMCArMSw3NzUgQEAKKy8vIFNwZWNpYWwgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2h5cGVyZ2VvbWV0cmljLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9jbWF0aH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MiBUUjE6IDUuMiAgU3BlY2lhbCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQgYmFzZWQ6CisvLyAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorLy8gICAgICAgZWQuIE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisvLyAgICAgICBEb3ZlciBQdWJsaWNhdGlvbnMsCisvLyAgICAgICBTZWN0aW9uIDYsIHBwLiA1NTUtNTY2CisvLyAgICgyKSBUaGUgR251IFNjaWVudGlmaWMgTGlicmFyeSwgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dzbAorCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9IWVBFUkdFT01FVFJJQ19UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0hZUEVSR0VPTUVUUklDX1RDQyAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyBbNS4yXSBTcGVjaWFsIGZ1bmN0aW9ucworCisgIC8vIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgY29uZmx1ZW50IGh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9uCisgICAgICogICAgICAgICAgYnkgc2VyaWVzIGV4cGFuc2lvbi4KKyAgICAgKiAKKyAgICAgKiAgIEBmWworICAgICAqICAgICBfMUZfMShhO2M7eCkgPSBcZnJhY3tcR2FtbWEoYyl9e1xHYW1tYShhKX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcc3VtX3tuPTB9XntcaW5mdHl9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgXGZyYWN7XEdhbW1hKGErbil9e1xHYW1tYShjK24pfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxmcmFje3hebn17biF9CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIElmIGEgYW5kIGIgYXJlIGludGVnZXJzIGFuZCBhIDwgMCBhbmQgZWl0aGVyIGIgPiAwIG9yIGIgPCBhCisgICAgICogICB0aGVuIHRoZSBzZXJpZXMgaXMgYSBwb2x5bm9taWFsIHdpdGggYSBmaW5pdGUgbnVtYmVyIG9mCisgICAgICogICB0ZXJtcy4gIElmIGIgaXMgYW4gaW50ZWdlciBhbmQgYiA8PSAwIHRoZSBjb25mbHVlbnQKKyAgICAgKiAgIGh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZC4KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX2EgIFRoZSAibnVtZXJhdG9yIiBwYXJhbWV0ZXIuCisgICAgICogICBAcGFyYW0gIF9fYyAgVGhlICJkZW5vbWluYXRvciIgcGFyYW1ldGVyLgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgY29uZmx1ZW50IGh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jb25mX2h5cGVyZ19zZXJpZXMoX1RwIF9fYSwgX1RwIF9fYywgX1RwIF9feCkKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKworICAgICAgX1RwIF9fdGVybSA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX0ZhYyA9IF9UcCgxKTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwMDAwOworICAgICAgdW5zaWduZWQgaW50IF9faTsKKyAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfX3Rlcm0gKj0gKF9fYSArIF9UcChfX2kpKSAqIF9feAorICAgICAgICAgICAgICAgICAgLyAoKF9fYyArIF9UcChfX2kpKSAqIF9UcCgxICsgX19pKSk7CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fdGVybSkgPCBfX2VwcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgX19GYWMgKz0gX190ZXJtOworICAgICAgICB9CisgICAgICBpZiAoX19pID09IF9fbWF4X2l0ZXIpCisgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiU2VyaWVzIGZhaWxlZCB0byBjb252ZXJnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19jb25mX2h5cGVyZ19zZXJpZXMuIikpOworCisgICAgICByZXR1cm4gX19GYWM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBSZXR1cm4gdGhlIGh5cG9nZW9tZXRyaWMgZnVuY3Rpb24gQGYkIF8yRl8xKGEsYjtjO3gpIEBmJAorICAgICAqICAgICAgICAgIGJ5IGFuIGl0ZXJhdGl2ZSBwcm9jZWR1cmUgZGVzY3JpYmVkIGluCisgICAgICogICAgICAgICAgTHVrZSwgQWxnb3JpdGhtcyBmb3IgdGhlIENvbXB1dGF0aW9uIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMuCisgICAgICoKKyAgICAgKiAgTGlrZSB0aGUgY2FzZSBvZiB0aGUgMkYxIHJhdGlvbmFsIGFwcHJveGltYXRpb25zLCB0aGVzZSBhcmUgCisgICAgICogIHByb2JhYmx5IGd1YXJhbnRlZWQgdG8gY29udmVyZ2UgZm9yIHggPCAwLCBiYXJyaW5nIGdyb3NzICAgIAorICAgICAqICBudW1lcmljYWwgaW5zdGFiaWxpdHkgaW4gdGhlIHByZS1hc3ltcHRvdGljIHJlZ2ltZS4gICAgICAgICAKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jb25mX2h5cGVyZ19sdWtlKF9UcCBfX2EsIF9UcCBfX2MsIF9UcCBfX3hpbikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19iaWcgPSBzdGQ6OnBvdyhzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1heCgpLCBfVHAoMC4xNkwpKTsKKyAgICAgIGNvbnN0IGludCBfX25tYXggPSAyMDAwMDsKKyAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgY29uc3QgX1RwIF9feCAgPSAtX194aW47CisgICAgICBjb25zdCBfVHAgX194MyA9IF9feCAqIF9feCAqIF9feDsKKyAgICAgIGNvbnN0IF9UcCBfX3QwID0gX19hIC8gX19jOworICAgICAgY29uc3QgX1RwIF9fdDEgPSAoX19hICsgX1RwKDEpKSAvIChfVHAoMikgKiBfX2MpOworICAgICAgY29uc3QgX1RwIF9fdDIgPSAoX19hICsgX1RwKDIpKSAvIChfVHAoMikgKiAoX19jICsgX1RwKDEpKSk7CisgICAgICBfVHAgX19GID0gX1RwKDEpOworICAgICAgX1RwIF9fcHJlYzsKKworICAgICAgX1RwIF9fQm5tMyA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX0JubTIgPSBfVHAoMSkgKyBfX3QxICogX194OworICAgICAgX1RwIF9fQm5tMSA9IF9UcCgxKSArIF9fdDIgKiBfX3ggKiAoX1RwKDEpICsgX190MSAvIF9UcCgzKSAqIF9feCk7CisKKyAgICAgIF9UcCBfX0FubTMgPSBfVHAoMSk7CisgICAgICBfVHAgX19Bbm0yID0gX19Cbm0yIC0gX190MCAqIF9feDsKKyAgICAgIF9UcCBfX0FubTEgPSBfX0JubTEgLSBfX3QwICogKF9UcCgxKSArIF9fdDIgKiBfX3gpICogX194CisgICAgICAgICAgICAgICAgICsgX190MCAqIF9fdDEgKiAoX19jIC8gKF9fYyArIF9UcCgxKSkpICogX194ICogX194OworCisgICAgICBpbnQgX19uID0gMzsKKyAgICAgIHdoaWxlKDEpCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19ucGFtMSA9IF9UcChfX24gLSAxKSArIF9fYTsKKyAgICAgICAgICBfVHAgX19ucGNtMSA9IF9UcChfX24gLSAxKSArIF9fYzsKKyAgICAgICAgICBfVHAgX19ucGFtMiA9IF9UcChfX24gLSAyKSArIF9fYTsKKyAgICAgICAgICBfVHAgX19ucGNtMiA9IF9UcChfX24gLSAyKSArIF9fYzsKKyAgICAgICAgICBfVHAgX190bm0xICA9IF9UcCgyICogX19uIC0gMSk7CisgICAgICAgICAgX1RwIF9fdG5tMyAgPSBfVHAoMiAqIF9fbiAtIDMpOworICAgICAgICAgIF9UcCBfX3RubTUgID0gX1RwKDIgKiBfX24gLSA1KTsKKyAgICAgICAgICBfVHAgX19GMSA9ICAoX1RwKF9fbiAtIDIpIC0gX19hKSAvIChfVHAoMikgKiBfX3RubTMgKiBfX25wY20xKTsKKyAgICAgICAgICBfVHAgX19GMiA9ICAoX1RwKF9fbikgKyBfX2EpICogX19ucGFtMQorICAgICAgICAgICAgICAgICAgIC8gKF9UcCg0KSAqIF9fdG5tMSAqIF9fdG5tMyAqIF9fbnBjbTIgKiBfX25wY20xKTsKKyAgICAgICAgICBfVHAgX19GMyA9IC1fX25wYW0yICogX19ucGFtMSAqIChfVHAoX19uIC0gMikgLSBfX2EpCisgICAgICAgICAgICAgICAgICAgLyAoX1RwKDgpICogX190bm0zICogX190bm0zICogX190bm01CisgICAgICAgICAgICAgICAgICAgKiAoX1RwKF9fbiAtIDMpICsgX19jKSAqIF9fbnBjbTIgKiBfX25wY20xKTsKKyAgICAgICAgICBfVHAgX19FICA9IC1fX25wYW0xICogKF9UcChfX24gLSAxKSAtIF9fYykKKyAgICAgICAgICAgICAgICAgICAvIChfVHAoMikgKiBfX3RubTMgKiBfX25wY20yICogX19ucGNtMSk7CisKKyAgICAgICAgICBfVHAgX19BbiA9IChfVHAoMSkgKyBfX0YxICogX194KSAqIF9fQW5tMQorICAgICAgICAgICAgICAgICAgICsgKF9fRSArIF9fRjIgKiBfX3gpICogX194ICogX19Bbm0yICsgX19GMyAqIF9feDMgKiBfX0FubTM7CisgICAgICAgICAgX1RwIF9fQm4gPSAoX1RwKDEpICsgX19GMSAqIF9feCkgKiBfX0JubTEKKyAgICAgICAgICAgICAgICAgICArIChfX0UgKyBfX0YyICogX194KSAqIF9feCAqIF9fQm5tMiArIF9fRjMgKiBfX3gzICogX19Cbm0zOworICAgICAgICAgIF9UcCBfX3IgPSBfX0FuIC8gX19CbjsKKworICAgICAgICAgIF9fcHJlYyA9IHN0ZDo6YWJzKChfX0YgLSBfX3IpIC8gX19GKTsKKyAgICAgICAgICBfX0YgPSBfX3I7CisKKyAgICAgICAgICBpZiAoX19wcmVjIDwgX19lcHMgfHwgX19uID4gX19ubWF4KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX19BbikgPiBfX2JpZyB8fCBzdGQ6OmFicyhfX0JuKSA+IF9fYmlnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX0FuICAgLz0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm4gICAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Bbm0xIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0JubTEgLz0gX19iaWc7CisgICAgICAgICAgICAgIF9fQW5tMiAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Cbm0yIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0FubTMgLz0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm5tMyAvPSBfX2JpZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChzdGQ6OmFicyhfX0FuKSA8IF9UcCgxKSAvIF9fYmlnCisgICAgICAgICAgICAgICAgfHwgc3RkOjphYnMoX19CbikgPCBfVHAoMSkgLyBfX2JpZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19BbiAgICo9IF9fYmlnOworICAgICAgICAgICAgICBfX0JuICAgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQW5tMSAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Cbm0xICo9IF9fYmlnOworICAgICAgICAgICAgICBfX0FubTIgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm5tMiAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Bbm0zICo9IF9fYmlnOworICAgICAgICAgICAgICBfX0JubTMgKj0gX19iaWc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICArK19fbjsKKyAgICAgICAgICBfX0JubTMgPSBfX0JubTI7CisgICAgICAgICAgX19Cbm0yID0gX19Cbm0xOworICAgICAgICAgIF9fQm5tMSA9IF9fQm47CisgICAgICAgICAgX19Bbm0zID0gX19Bbm0yOworICAgICAgICAgIF9fQW5tMiA9IF9fQW5tMTsKKyAgICAgICAgICBfX0FubTEgPSBfX0FuOworICAgICAgICB9CisKKyAgICAgIGlmIChfX24gPj0gX19ubWF4KQorICAgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIkl0ZXJhdGlvbiBmYWlsZWQgdG8gY29udmVyZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fY29uZl9oeXBlcmdfbHVrZS4iKSk7CisKKyAgICAgIHJldHVybiBfX0Y7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBjb25mbHVlbnQgaHlwb2dlb21ldHJpYyBmdW5jdGlvbgorICAgICAqICAgICAgICAgICBAZiQgXzFGXzEoYTtjO3gpIEBmJC4KKyAgICAgKiAKKyAgICAgKiAgIEB0b2RvICBIYW5kbGUgYiA9PSBub25wb3NpdGl2ZSBpbnRlZ2VyIGJsb3d1cCAtIHJldHVybiBOYU4uCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19hICBUaGUgQGEgbnVtZXJhdG9yIHBhcmFtZXRlci4KKyAgICAgKiAgIEBwYXJhbSAgX19jICBUaGUgQGEgZGVub21pbmF0b3IgcGFyYW1ldGVyLgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgY29uZmx1ZW50IGh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jb25mX2h5cGVyZyhfVHAgX19hLCBfVHAgX19jLCBfVHAgX194KQorICAgIHsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBjb25zdCBfVHAgX19jX25pbnQgPSBzdGQ6OnRyMTo6bmVhcmJ5aW50KF9fYyk7CisjZWxzZQorICAgICAgY29uc3QgX1RwIF9fY19uaW50ID0gc3RhdGljX2Nhc3Q8aW50PihfX2MgKyBfVHAoMC41TCkpOworI2VuZGlmCisgICAgICBpZiAoX19pc25hbihfX2EpIHx8IF9faXNuYW4oX19jKSB8fCBfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX19jX25pbnQgPT0gX19jICYmIF9fY19uaW50IDw9IDApCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmluZmluaXR5KCk7CisgICAgICBlbHNlIGlmIChfX2EgPT0gX1RwKDApKQorICAgICAgICByZXR1cm4gX1RwKDEpOworICAgICAgZWxzZSBpZiAoX19jID09IF9fYSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6ZXhwKF9feCk7CisgICAgICBlbHNlIGlmIChfX3ggPCBfVHAoMCkpCisgICAgICAgIHJldHVybiBfX2NvbmZfaHlwZXJnX2x1a2UoX19hLCBfX2MsIF9feCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX2NvbmZfaHlwZXJnX3NlcmllcyhfX2EsIF9fYywgX194KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgaHlwb2dlb21ldHJpYyBmdW5jdGlvbiBAZiQgXzJGXzEoYSxiO2M7eCkgQGYkCisgICAgICogICBieSBzZXJpZXMgZXhwYW5zaW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGh5cG9nZW9tZXRyaWMgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgIF8yRl8xKGEsYjtjO3gpID0gXGZyYWN7XEdhbW1hKGMpfXtcR2FtbWEoYSlcR2FtbWEoYil9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgXHN1bV97bj0wfV57XGluZnR5fQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxmcmFje1xHYW1tYShhK24pXEdhbW1hKGIrbil9e1xHYW1tYShjK24pfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxmcmFje3hebn17biF9CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIFRoaXMgd29ya3MgYW5kIGl0J3MgcHJldHR5IGZhc3QuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19hICBUaGUgZmlyc3QgQGEgbnVtZXJhdG9yIHBhcmFtZXRlci4KKyAgICAgKiAgIEBwYXJhbSAgX19hICBUaGUgc2Vjb25kIEBhIG51bWVyYXRvciBwYXJhbWV0ZXIuCisgICAgICogICBAcGFyYW0gIF9fYyAgVGhlIEBhIGRlbm9taW5hdG9yIHBhcmFtZXRlci4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9faHlwZXJnX3NlcmllcyhfVHAgX19hLCBfVHAgX19iLCBfVHAgX19jLCBfVHAgX194KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworCisgICAgICBfVHAgX190ZXJtID0gX1RwKDEpOworICAgICAgX1RwIF9fRmFiYyA9IF9UcCgxKTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwMDAwOworICAgICAgdW5zaWduZWQgaW50IF9faTsKKyAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfX3Rlcm0gKj0gKF9fYSArIF9UcChfX2kpKSAqIChfX2IgKyBfVHAoX19pKSkgKiBfX3gKKyAgICAgICAgICAgICAgICAgIC8gKChfX2MgKyBfVHAoX19pKSkgKiBfVHAoMSArIF9faSkpOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0pIDwgX19lcHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIF9fRmFiYyArPSBfX3Rlcm07CisgICAgICAgIH0KKyAgICAgIGlmIChfX2kgPT0gX19tYXhfaXRlcikKKyAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJTZXJpZXMgZmFpbGVkIHRvIGNvbnZlcmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2h5cGVyZ19zZXJpZXMuIikpOworCisgICAgICByZXR1cm4gX19GYWJjOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgaHlwb2dlb21ldHJpYyBmdW5jdGlvbiBAZiQgXzJGXzEoYSxiO2M7eCkgQGYkCisgICAgICogICAgICAgICAgIGJ5IGFuIGl0ZXJhdGl2ZSBwcm9jZWR1cmUgZGVzY3JpYmVkIGluCisgICAgICogICAgICAgICAgIEx1a2UsIEFsZ29yaXRobXMgZm9yIHRoZSBDb21wdXRhdGlvbiBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2h5cGVyZ19sdWtlKF9UcCBfX2EsIF9UcCBfX2IsIF9UcCBfX2MsIF9UcCBfX3hpbikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19iaWcgPSBzdGQ6OnBvdyhzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1heCgpLCBfVHAoMC4xNkwpKTsKKyAgICAgIGNvbnN0IGludCBfX25tYXggPSAyMDAwMDsKKyAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgY29uc3QgX1RwIF9feCAgPSAtX194aW47CisgICAgICBjb25zdCBfVHAgX194MyA9IF9feCAqIF9feCAqIF9feDsKKyAgICAgIGNvbnN0IF9UcCBfX3QwID0gX19hICogX19iIC8gX19jOworICAgICAgY29uc3QgX1RwIF9fdDEgPSAoX19hICsgX1RwKDEpKSAqIChfX2IgKyBfVHAoMSkpIC8gKF9UcCgyKSAqIF9fYyk7CisgICAgICBjb25zdCBfVHAgX190MiA9IChfX2EgKyBfVHAoMikpICogKF9fYiArIF9UcCgyKSkKKyAgICAgICAgICAgICAgICAgICAgIC8gKF9UcCgyKSAqIChfX2MgKyBfVHAoMSkpKTsKKworICAgICAgX1RwIF9fRiA9IF9UcCgxKTsKKworICAgICAgX1RwIF9fQm5tMyA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX0JubTIgPSBfVHAoMSkgKyBfX3QxICogX194OworICAgICAgX1RwIF9fQm5tMSA9IF9UcCgxKSArIF9fdDIgKiBfX3ggKiAoX1RwKDEpICsgX190MSAvIF9UcCgzKSAqIF9feCk7CisKKyAgICAgIF9UcCBfX0FubTMgPSBfVHAoMSk7CisgICAgICBfVHAgX19Bbm0yID0gX19Cbm0yIC0gX190MCAqIF9feDsKKyAgICAgIF9UcCBfX0FubTEgPSBfX0JubTEgLSBfX3QwICogKF9UcCgxKSArIF9fdDIgKiBfX3gpICogX194CisgICAgICAgICAgICAgICAgICsgX190MCAqIF9fdDEgKiAoX19jIC8gKF9fYyArIF9UcCgxKSkpICogX194ICogX194OworCisgICAgICBpbnQgX19uID0gMzsKKyAgICAgIHdoaWxlICgxKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fbnBhbTEgPSBfVHAoX19uIC0gMSkgKyBfX2E7CisgICAgICAgICAgY29uc3QgX1RwIF9fbnBibTEgPSBfVHAoX19uIC0gMSkgKyBfX2I7CisgICAgICAgICAgY29uc3QgX1RwIF9fbnBjbTEgPSBfVHAoX19uIC0gMSkgKyBfX2M7CisgICAgICAgICAgY29uc3QgX1RwIF9fbnBhbTIgPSBfVHAoX19uIC0gMikgKyBfX2E7CisgICAgICAgICAgY29uc3QgX1RwIF9fbnBibTIgPSBfVHAoX19uIC0gMikgKyBfX2I7CisgICAgICAgICAgY29uc3QgX1RwIF9fbnBjbTIgPSBfVHAoX19uIC0gMikgKyBfX2M7CisgICAgICAgICAgY29uc3QgX1RwIF9fdG5tMSAgPSBfVHAoMiAqIF9fbiAtIDEpOworICAgICAgICAgIGNvbnN0IF9UcCBfX3RubTMgID0gX1RwKDIgKiBfX24gLSAzKTsKKyAgICAgICAgICBjb25zdCBfVHAgX190bm01ICA9IF9UcCgyICogX19uIC0gNSk7CisgICAgICAgICAgY29uc3QgX1RwIF9fbjIgPSBfX24gKiBfX247CisgICAgICAgICAgY29uc3QgX1RwIF9fRjEgPSAoX1RwKDMpICogX19uMiArIChfX2EgKyBfX2IgLSBfVHAoNikpICogX19uCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBfVHAoMikgLSBfX2EgKiBfX2IgLSBfVHAoMikgKiAoX19hICsgX19iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAvIChfVHAoMikgKiBfX3RubTMgKiBfX25wY20xKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19GMiA9IC0oX1RwKDMpICogX19uMiAtIChfX2EgKyBfX2IgKyBfVHAoNikpICogX19uCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBfVHAoMikgLSBfX2EgKiBfX2IpICogX19ucGFtMSAqIF9fbnBibTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAvIChfVHAoNCkgKiBfX3RubTEgKiBfX3RubTMgKiBfX25wY20yICogX19ucGNtMSk7CisgICAgICAgICAgY29uc3QgX1RwIF9fRjMgPSAoX19ucGFtMiAqIF9fbnBhbTEgKiBfX25wYm0yICogX19ucGJtMQorICAgICAgICAgICAgICAgICAgICAgICAgICogKF9UcChfX24gLSAyKSAtIF9fYSkgKiAoX1RwKF9fbiAtIDIpIC0gX19iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAvIChfVHAoOCkgKiBfX3RubTMgKiBfX3RubTMgKiBfX3RubTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIChfVHAoX19uIC0gMykgKyBfX2MpICogX19ucGNtMiAqIF9fbnBjbTEpOworICAgICAgICAgIGNvbnN0IF9UcCBfX0UgID0gLV9fbnBhbTEgKiBfX25wYm0xICogKF9UcChfX24gLSAxKSAtIF9fYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAvIChfVHAoMikgKiBfX3RubTMgKiBfX25wY20yICogX19ucGNtMSk7CisKKyAgICAgICAgICBfVHAgX19BbiA9IChfVHAoMSkgKyBfX0YxICogX194KSAqIF9fQW5tMQorICAgICAgICAgICAgICAgICAgICsgKF9fRSArIF9fRjIgKiBfX3gpICogX194ICogX19Bbm0yICsgX19GMyAqIF9feDMgKiBfX0FubTM7CisgICAgICAgICAgX1RwIF9fQm4gPSAoX1RwKDEpICsgX19GMSAqIF9feCkgKiBfX0JubTEKKyAgICAgICAgICAgICAgICAgICArIChfX0UgKyBfX0YyICogX194KSAqIF9feCAqIF9fQm5tMiArIF9fRjMgKiBfX3gzICogX19Cbm0zOworICAgICAgICAgIGNvbnN0IF9UcCBfX3IgPSBfX0FuIC8gX19CbjsKKworICAgICAgICAgIGNvbnN0IF9UcCBfX3ByZWMgPSBzdGQ6OmFicygoX19GIC0gX19yKSAvIF9fRik7CisgICAgICAgICAgX19GID0gX19yOworCisgICAgICAgICAgaWYgKF9fcHJlYyA8IF9fZXBzIHx8IF9fbiA+IF9fbm1heCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fQW4pID4gX19iaWcgfHwgc3RkOjphYnMoX19CbikgPiBfX2JpZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19BbiAgIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0JuICAgLz0gX19iaWc7CisgICAgICAgICAgICAgIF9fQW5tMSAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Cbm0xIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0FubTIgLz0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm5tMiAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Bbm0zIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0JubTMgLz0gX19iaWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoc3RkOjphYnMoX19BbikgPCBfVHAoMSkgLyBfX2JpZworICAgICAgICAgICAgICAgIHx8IHN0ZDo6YWJzKF9fQm4pIDwgX1RwKDEpIC8gX19iaWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fQW4gICAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19CbiAgICo9IF9fYmlnOworICAgICAgICAgICAgICBfX0FubTEgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm5tMSAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Bbm0yICo9IF9fYmlnOworICAgICAgICAgICAgICBfX0JubTIgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQW5tMyAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Cbm0zICo9IF9fYmlnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgKytfX247CisgICAgICAgICAgX19Cbm0zID0gX19Cbm0yOworICAgICAgICAgIF9fQm5tMiA9IF9fQm5tMTsKKyAgICAgICAgICBfX0JubTEgPSBfX0JuOworICAgICAgICAgIF9fQW5tMyA9IF9fQW5tMjsKKyAgICAgICAgICBfX0FubTIgPSBfX0FubTE7CisgICAgICAgICAgX19Bbm0xID0gX19BbjsKKyAgICAgICAgfQorCisgICAgICBpZiAoX19uID49IF9fbm1heCkKKyAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJJdGVyYXRpb24gZmFpbGVkIHRvIGNvbnZlcmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2h5cGVyZ19sdWtlLiIpKTsKKworICAgICAgcmV0dXJuIF9fRjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIFJldHVybiB0aGUgaHlwb2dlb21ldHJpYyBmdW5jdGlvbiBAZiQgXzJGXzEoYSxiO2M7eCkgQGYkIAorICAgICAqICBieSB0aGUgcmVmbGVjdGlvbiBmb3JtdWxhZSBpbiBBYnJhbW93aXR6ICYgU3RlZ3VuIGZvcm11bGEKKyAgICAgKiAgMTUuMy42IGZvciBkID0gYyAtIGEgLSBiIG5vdCBpbnRlZ3JhbCBhbmQgZm9ybXVsYSAxNS4zLjExIGZvcgorICAgICAqICBkID0gYyAtIGEgLSBiIGludGVncmFsLiAgVGhpcyBhc3N1bWVzIGEsIGIsIGMgIT0gbmVnYXRpdmUKKyAgICAgKiAgaW50ZWdlci4KKyAgICAgKgorICAgICAqICAgVGhlIGh5cG9nZW9tZXRyaWMgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgIF8yRl8xKGEsYjtjO3gpID0gXGZyYWN7XEdhbW1hKGMpfXtcR2FtbWEoYSlcR2FtbWEoYil9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgXHN1bV97bj0wfV57XGluZnR5fQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxmcmFje1xHYW1tYShhK24pXEdhbW1hKGIrbil9e1xHYW1tYShjK24pfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxmcmFje3hebn17biF9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgVGhlIHJlZmxlY3Rpb24gZm9ybXVsYSBmb3Igbm9uaW50ZWdyYWwgQGYkIGQgPSBjIC0gYSAtIGIgQGYkIGlzOgorICAgICAqICAgQGZbCisgICAgICogICAgIF8yRl8xKGEsYjtjO3gpID0gXGZyYWN7XEdhbW1hKGMpXEdhbW1hKGQpfXtcR2FtbWEoYy1hKVxHYW1tYShjLWIpfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8yRl8xKGEsYjsxLWQ7MS14KQorICAgICAqICAgICAgICAgICAgICAgICAgICArIFxmcmFje1xHYW1tYShjKVxHYW1tYSgtZCl9e1xHYW1tYShhKVxHYW1tYShiKX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfMkZfMShjLWEsYy1iOzErZDsxLXgpCisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgVGhlIHJlZmxlY3Rpb24gZm9ybXVsYSBmb3IgaW50ZWdyYWwgQGYkIG0gPSBjIC0gYSAtIGIgQGYkIGlzOgorICAgICAqICAgQGZbCisgICAgICogICAgIF8yRl8xKGEsYjthK2IrbTt4KSA9IFxmcmFje1xHYW1tYShtKVxHYW1tYShhK2IrbSl9e1xHYW1tYShhK20pXEdhbW1hKGIrbSl9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBcc3VtX3trPTB9XnttLTF9IFxmcmFjeyhtK2EpX2sobStiKV9rfXtrISgxLW0pX2t9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgLSAKKyAgICAgKiAgIEBmXQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2h5cGVyZ19yZWZsZWN0KF9UcCBfX2EsIF9UcCBfX2IsIF9UcCBfX2MsIF9UcCBfX3gpCisgICAgeworICAgICAgY29uc3QgX1RwIF9fZCA9IF9fYyAtIF9fYSAtIF9fYjsKKyAgICAgIGNvbnN0IGludCBfX2ludGQgID0gc3RkOjpmbG9vcihfX2QgKyBfVHAoMC41TCkpOworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICBjb25zdCBfVHAgX190b2xlciA9IF9UcCgxMDAwKSAqIF9fZXBzOworICAgICAgY29uc3QgX1RwIF9fbG9nX21heCA9IHN0ZDo6bG9nKHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWF4KCkpOworICAgICAgY29uc3QgYm9vbCBfX2RfaW50ZWdlciA9IChzdGQ6OmFicyhfX2QgLSBfX2ludGQpIDwgX190b2xlcik7CisKKyAgICAgIGlmIChfX2RfaW50ZWdlcikKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX2xuX29teCA9IHN0ZDo6bG9nKF9UcCgxKSAtIF9feCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fYWQgPSBzdGQ6OmFicyhfX2QpOworICAgICAgICAgIF9UcCBfX0YxLCBfX0YyOworCisgICAgICAgICAgX1RwIF9fZDEsIF9fZDI7CisgICAgICAgICAgaWYgKF9fZCA+PSBfVHAoMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fZDEgPSBfX2Q7CisgICAgICAgICAgICAgIF9fZDIgPSBfVHAoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX2QxID0gX1RwKDApOworICAgICAgICAgICAgICBfX2QyID0gX19kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgY29uc3QgX1RwIF9fbG5nX2MgPSBfX2xvZ19nYW1tYShfX2MpOworCisgICAgICAgICAgLy8gIEV2YWx1YXRlIEYxLgorICAgICAgICAgIGlmIChfX2FkIDwgX19lcHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vICBkID0gYyAtIGEgLSBiID0gMC4KKyAgICAgICAgICAgICAgX19GMSA9IF9UcCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgYm9vbCBfX29rX2QxID0gdHJ1ZTsKKyAgICAgICAgICAgICAgX1RwIF9fbG5nX2FkLCBfX2xuZ19hZDEsIF9fbG5nX2JkMTsKKyAgICAgICAgICAgICAgX190cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfX2xuZ19hZCA9IF9fbG9nX2dhbW1hKF9fYWQpOworICAgICAgICAgICAgICAgICAgX19sbmdfYWQxID0gX19sb2dfZ2FtbWEoX19hICsgX19kMSk7CisgICAgICAgICAgICAgICAgICBfX2xuZ19iZDEgPSBfX2xvZ19nYW1tYShfX2IgKyBfX2QxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fb2tfZDEgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKF9fb2tfZDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogR2FtbWEgZnVuY3Rpb25zIGluIHRoZSBkZW5vbWluYXRvciBhcmUgb2suCisgICAgICAgICAgICAgICAgICAgKiBQcm9jZWVkIHdpdGggZXZhbHVhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgX1RwIF9fc3VtMSA9IF9UcCgxKTsKKyAgICAgICAgICAgICAgICAgIF9UcCBfX3Rlcm0gPSBfVHAoMSk7CisgICAgICAgICAgICAgICAgICBfVHAgX19sbl9wcmUxID0gX19sbmdfYWQgKyBfX2xuZ19jICsgX19kMiAqIF9fbG5fb214CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19sbmdfYWQxIC0gX19sbmdfYmQxOworCisgICAgICAgICAgICAgICAgICAvKiBEbyBGMSBzdW0uCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGZvciAoaW50IF9faSA9IDE7IF9faSA8IF9fYWQ7ICsrX19pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IF9faiA9IF9faSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgX190ZXJtICo9IChfX2EgKyBfX2QyICsgX19qKSAqIChfX2IgKyBfX2QyICsgX19qKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX1RwKDEpICsgX19kMiArIF9faikgLyBfX2kgKiAoX1RwKDEpIC0gX194KTsKKyAgICAgICAgICAgICAgICAgICAgICBfX3N1bTEgKz0gX190ZXJtOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGlmIChfX2xuX3ByZTEgPiBfX2xvZ19tYXgpCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiT3ZlcmZsb3cgb2YgZ2FtbWEgZnVuY3Rpb25zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiBfX2h5cGVyZ19sdWtlLiIpKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX19GMSA9IHN0ZDo6ZXhwKF9fbG5fcHJlMSkgKiBfX3N1bTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLy8gIEdhbW1hIGZ1bmN0aW9ucyBpbiB0aGUgZGVub21pbmF0b3Igd2VyZSBub3Qgb2suCisgICAgICAgICAgICAgICAgICAvLyAgU28gdGhlIEYxIHRlcm0gaXMgemVyby4KKyAgICAgICAgICAgICAgICAgIF9fRjEgPSBfVHAoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyBlbmQgRjEgZXZhbHVhdGlvbgorCisgICAgICAgICAgLy8gRXZhbHVhdGUgRjIuCisgICAgICAgICAgYm9vbCBfX29rX2QyID0gdHJ1ZTsKKyAgICAgICAgICBfVHAgX19sbmdfYWQyLCBfX2xuZ19iZDI7CisgICAgICAgICAgX190cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19sbmdfYWQyID0gX19sb2dfZ2FtbWEoX19hICsgX19kMik7CisgICAgICAgICAgICAgIF9fbG5nX2JkMiA9IF9fbG9nX2dhbW1hKF9fYiArIF9fZDIpOworICAgICAgICAgICAgfQorICAgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX29rX2QyID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoX19va19kMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gIEdhbW1hIGZ1bmN0aW9ucyBpbiB0aGUgZGVub21pbmF0b3IgYXJlIG9rLgorICAgICAgICAgICAgICAvLyAgUHJvY2VlZCB3aXRoIGV2YWx1YXRpb24uCisgICAgICAgICAgICAgIGNvbnN0IGludCBfX21heGl0ZXIgPSAyMDAwOworICAgICAgICAgICAgICBjb25zdCBfVHAgX19wc2lfMSA9IC1fX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fZ2FtbWFfZSgpOworICAgICAgICAgICAgICBjb25zdCBfVHAgX19wc2lfMXBkID0gX19wc2koX1RwKDEpICsgX19hZCk7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3BzaV9hcGQxID0gX19wc2koX19hICsgX19kMSk7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3BzaV9icGQxID0gX19wc2koX19iICsgX19kMSk7CisKKyAgICAgICAgICAgICAgX1RwIF9fcHNpX3Rlcm0gPSBfX3BzaV8xICsgX19wc2lfMXBkIC0gX19wc2lfYXBkMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIF9fcHNpX2JwZDEgLSBfX2xuX29teDsKKyAgICAgICAgICAgICAgX1RwIF9fZmFjdCA9IF9UcCgxKTsKKyAgICAgICAgICAgICAgX1RwIF9fc3VtMiA9IF9fcHNpX3Rlcm07CisgICAgICAgICAgICAgIF9UcCBfX2xuX3ByZTIgPSBfX2xuZ19jICsgX19kMSAqIF9fbG5fb214CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX2xuZ19hZDIgLSBfX2xuZ19iZDI7CisKKyAgICAgICAgICAgICAgLy8gRG8gRjIgc3VtLgorICAgICAgICAgICAgICBpbnQgX19qOworICAgICAgICAgICAgICBmb3IgKF9faiA9IDE7IF9faiA8IF9fbWF4aXRlcjsgKytfX2opCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLy8gIFZhbHVlcyBmb3IgcHNpIGZ1bmN0aW9ucyB1c2UgcmVjdXJyZW5jZTsKKyAgICAgICAgICAgICAgICAgIC8vICBBYnJhbW93aXR6ICYgU3RlZ3VuIDYuMy41CisgICAgICAgICAgICAgICAgICBjb25zdCBfVHAgX190ZXJtMSA9IF9UcCgxKSAvIF9UcChfX2opCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9UcCgxKSAvIChfX2FkICsgX19qKTsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3Rlcm0yID0gX1RwKDEpIC8gKF9fYSArIF9fZDEgKyBfVHAoX19qIC0gMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9UcCgxKSAvIChfX2IgKyBfX2QxICsgX1RwKF9faiAtIDEpKTsKKyAgICAgICAgICAgICAgICAgIF9fcHNpX3Rlcm0gKz0gX190ZXJtMSAtIF9fdGVybTI7CisgICAgICAgICAgICAgICAgICBfX2ZhY3QgKj0gKF9fYSArIF9fZDEgKyBfVHAoX19qIC0gMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICogKF9fYiArIF9fZDEgKyBfVHAoX19qIC0gMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKChfX2FkICsgX19qKSAqIF9faikgKiAoX1RwKDEpIC0gX194KTsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2RlbHRhID0gX19mYWN0ICogX19wc2lfdGVybTsKKyAgICAgICAgICAgICAgICAgIF9fc3VtMiArPSBfX2RlbHRhOworICAgICAgICAgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fZGVsdGEpIDwgX19lcHMgKiBzdGQ6OmFicyhfX3N1bTIpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChfX2ogPT0gX19tYXhpdGVyKQorICAgICAgICAgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiU3VtIEYyIGZhaWxlZCB0byBjb252ZXJnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2h5cGVyZ19yZWZsZWN0IikpOworCisgICAgICAgICAgICAgIGlmIChfX3N1bTIgPT0gX1RwKDApKQorICAgICAgICAgICAgICAgIF9fRjIgPSBfVHAoMCk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX0YyID0gc3RkOjpleHAoX19sbl9wcmUyKSAqIF9fc3VtMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIEdhbW1hIGZ1bmN0aW9ucyBpbiB0aGUgZGVub21pbmF0b3Igbm90IG9rLgorICAgICAgICAgICAgICAvLyBTbyB0aGUgRjIgdGVybSBpcyB6ZXJvLgorICAgICAgICAgICAgICBfX0YyID0gX1RwKDApOworICAgICAgICAgICAgfSAvLyBlbmQgRjIgZXZhbHVhdGlvbgorCisgICAgICAgICAgY29uc3QgX1RwIF9fc2duXzIgPSAoX19pbnRkICUgMiA9PSAxID8gLV9UcCgxKSA6IF9UcCgxKSk7CisgICAgICAgICAgY29uc3QgX1RwIF9fRiA9IF9fRjEgKyBfX3Nnbl8yICogX19GMjsKKworICAgICAgICAgIHJldHVybiBfX0Y7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vICBkID0gYyAtIGEgLSBiIG5vdCBhbiBpbnRlZ2VyLgorCisgICAgICAgICAgLy8gIFRoZXNlIGdhbW1hIGZ1bmN0aW9ucyBhcHBlYXIgaW4gdGhlIGRlbm9taW5hdG9yLCBzbyB3ZQorICAgICAgICAgIC8vICBjYXRjaCB0aGVpciBoYXJtbGVzcyBkb21haW4gZXJyb3JzIGFuZCBzZXQgdGhlIHRlcm1zIHRvIHplcm8uCisgICAgICAgICAgYm9vbCBfX29rMSA9IHRydWU7CisgICAgICAgICAgX1RwIF9fc2duX2cxY2EgPSBfVHAoMCksIF9fbG5fZzFjYSA9IF9UcCgwKTsKKyAgICAgICAgICBfVHAgX19zZ25fZzFjYiA9IF9UcCgwKSwgX19sbl9nMWNiID0gX1RwKDApOworICAgICAgICAgIF9fdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fc2duX2cxY2EgPSBfX2xvZ19nYW1tYV9zaWduKF9fYyAtIF9fYSk7CisgICAgICAgICAgICAgIF9fbG5fZzFjYSA9IF9fbG9nX2dhbW1hKF9fYyAtIF9fYSk7CisgICAgICAgICAgICAgIF9fc2duX2cxY2IgPSBfX2xvZ19nYW1tYV9zaWduKF9fYyAtIF9fYik7CisgICAgICAgICAgICAgIF9fbG5fZzFjYiA9IF9fbG9nX2dhbW1hKF9fYyAtIF9fYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgX19jYXRjaCguLi4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fb2sxID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBib29sIF9fb2syID0gdHJ1ZTsKKyAgICAgICAgICBfVHAgX19zZ25fZzJhID0gX1RwKDApLCBfX2xuX2cyYSA9IF9UcCgwKTsKKyAgICAgICAgICBfVHAgX19zZ25fZzJiID0gX1RwKDApLCBfX2xuX2cyYiA9IF9UcCgwKTsKKyAgICAgICAgICBfX3RyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX3Nnbl9nMmEgPSBfX2xvZ19nYW1tYV9zaWduKF9fYSk7CisgICAgICAgICAgICAgIF9fbG5fZzJhID0gX19sb2dfZ2FtbWEoX19hKTsKKyAgICAgICAgICAgICAgX19zZ25fZzJiID0gX19sb2dfZ2FtbWFfc2lnbihfX2IpOworICAgICAgICAgICAgICBfX2xuX2cyYiA9IF9fbG9nX2dhbW1hKF9fYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgX19jYXRjaCguLi4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fb2syID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBjb25zdCBfVHAgX19zZ25fZ2MgPSBfX2xvZ19nYW1tYV9zaWduKF9fYyk7CisgICAgICAgICAgY29uc3QgX1RwIF9fbG5fZ2MgPSBfX2xvZ19nYW1tYShfX2MpOworICAgICAgICAgIGNvbnN0IF9UcCBfX3Nnbl9nZCA9IF9fbG9nX2dhbW1hX3NpZ24oX19kKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19sbl9nZCA9IF9fbG9nX2dhbW1hKF9fZCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fc2duX2dtZCA9IF9fbG9nX2dhbW1hX3NpZ24oLV9fZCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fbG5fZ21kID0gX19sb2dfZ2FtbWEoLV9fZCk7CisKKyAgICAgICAgICBjb25zdCBfVHAgX19zZ24xID0gX19zZ25fZ2MgKiBfX3Nnbl9nZCAgKiBfX3Nnbl9nMWNhICogX19zZ25fZzFjYjsKKyAgICAgICAgICBjb25zdCBfVHAgX19zZ24yID0gX19zZ25fZ2MgKiBfX3Nnbl9nbWQgKiBfX3Nnbl9nMmEgICogX19zZ25fZzJiOworCisgICAgICAgICAgX1RwIF9fcHJlMSwgX19wcmUyOworICAgICAgICAgIGlmIChfX29rMSAmJiBfX29rMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX1RwIF9fbG5fcHJlMSA9IF9fbG5fZ2MgKyBfX2xuX2dkICAtIF9fbG5fZzFjYSAtIF9fbG5fZzFjYjsKKyAgICAgICAgICAgICAgX1RwIF9fbG5fcHJlMiA9IF9fbG5fZ2MgKyBfX2xuX2dtZCAtIF9fbG5fZzJhICAtIF9fbG5fZzJiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfX2QgKiBzdGQ6OmxvZyhfVHAoMSkgLSBfX3gpOworICAgICAgICAgICAgICBpZiAoX19sbl9wcmUxIDwgX19sb2dfbWF4ICYmIF9fbG5fcHJlMiA8IF9fbG9nX21heCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfX3ByZTEgPSBzdGQ6OmV4cChfX2xuX3ByZTEpOworICAgICAgICAgICAgICAgICAgX19wcmUyID0gc3RkOjpleHAoX19sbl9wcmUyKTsKKyAgICAgICAgICAgICAgICAgIF9fcHJlMSAqPSBfX3NnbjE7CisgICAgICAgICAgICAgICAgICBfX3ByZTIgKj0gX19zZ24yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiT3ZlcmZsb3cgb2YgZ2FtbWEgZnVuY3Rpb25zICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19oeXBlcmdfcmVmbGVjdCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoX19vazEgJiYgIV9fb2syKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfVHAgX19sbl9wcmUxID0gX19sbl9nYyArIF9fbG5fZ2QgLSBfX2xuX2cxY2EgLSBfX2xuX2cxY2I7CisgICAgICAgICAgICAgIGlmIChfX2xuX3ByZTEgPCBfX2xvZ19tYXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX19wcmUxID0gc3RkOjpleHAoX19sbl9wcmUxKTsKKyAgICAgICAgICAgICAgICAgIF9fcHJlMSAqPSBfX3NnbjE7CisgICAgICAgICAgICAgICAgICBfX3ByZTIgPSBfVHAoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJPdmVyZmxvdyBvZiBnYW1tYSBmdW5jdGlvbnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2h5cGVyZ19yZWZsZWN0IikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICghX19vazEgJiYgX19vazIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9UcCBfX2xuX3ByZTIgPSBfX2xuX2djICsgX19sbl9nbWQgLSBfX2xuX2cyYSAtIF9fbG5fZzJiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfX2QgKiBzdGQ6OmxvZyhfVHAoMSkgLSBfX3gpOworICAgICAgICAgICAgICBpZiAoX19sbl9wcmUyIDwgX19sb2dfbWF4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fcHJlMSA9IF9UcCgwKTsKKyAgICAgICAgICAgICAgICAgIF9fcHJlMiA9IHN0ZDo6ZXhwKF9fbG5fcHJlMik7CisgICAgICAgICAgICAgICAgICBfX3ByZTIgKj0gX19zZ24yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiT3ZlcmZsb3cgb2YgZ2FtbWEgZnVuY3Rpb25zICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19oeXBlcmdfcmVmbGVjdCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX3ByZTEgPSBfVHAoMCk7CisgICAgICAgICAgICAgIF9fcHJlMiA9IF9UcCgwKTsKKyAgICAgICAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJVbmRlcmZsb3cgb2YgZ2FtbWEgZnVuY3Rpb25zICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2h5cGVyZ19yZWZsZWN0IikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgY29uc3QgX1RwIF9fRjEgPSBfX2h5cGVyZ19zZXJpZXMoX19hLCBfX2IsIF9UcCgxKSAtIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAoMSkgLSBfX3gpOworICAgICAgICAgIGNvbnN0IF9UcCBfX0YyID0gX19oeXBlcmdfc2VyaWVzKF9fYyAtIF9fYSwgX19jIC0gX19iLCBfVHAoMSkgKyBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwKDEpIC0gX194KTsKKworICAgICAgICAgIGNvbnN0IF9UcCBfX0YgPSBfX3ByZTEgKiBfX0YxICsgX19wcmUyICogX19GMjsKKworICAgICAgICAgIHJldHVybiBfX0Y7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgaHlwb2dlb21ldHJpYyBmdW5jdGlvbiBAZiQgXzJGXzEoYSxiO2M7eCkgQGYkLgorICAgICAqCisgICAgICogICBUaGUgaHlwb2dlb21ldHJpYyBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXzJGXzEoYSxiO2M7eCkgPSBcZnJhY3tcR2FtbWEoYyl9e1xHYW1tYShhKVxHYW1tYShiKX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcc3VtX3tuPTB9XntcaW5mdHl9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgXGZyYWN7XEdhbW1hKGErbilcR2FtbWEoYituKX17XEdhbW1hKGMrbil9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgXGZyYWN7eF5ufXtuIX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fYSAgVGhlIGZpcnN0IEBhIG51bWVyYXRvciBwYXJhbWV0ZXIuCisgICAgICogICBAcGFyYW0gIF9fYSAgVGhlIHNlY29uZCBAYSBudW1lcmF0b3IgcGFyYW1ldGVyLgorICAgICAqICAgQHBhcmFtICBfX2MgIFRoZSBAYSBkZW5vbWluYXRvciBwYXJhbWV0ZXIuCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgY29uZmx1ZW50IGh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2h5cGVyZyhfVHAgX19hLCBfVHAgX19iLCBfVHAgX19jLCBfVHAgX194KQorICAgIHsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBjb25zdCBfVHAgX19hX25pbnQgPSBzdGQ6OnRyMTo6bmVhcmJ5aW50KF9fYSk7CisgICAgICBjb25zdCBfVHAgX19iX25pbnQgPSBzdGQ6OnRyMTo6bmVhcmJ5aW50KF9fYik7CisgICAgICBjb25zdCBfVHAgX19jX25pbnQgPSBzdGQ6OnRyMTo6bmVhcmJ5aW50KF9fYyk7CisjZWxzZQorICAgICAgY29uc3QgX1RwIF9fYV9uaW50ID0gc3RhdGljX2Nhc3Q8aW50PihfX2EgKyBfVHAoMC41TCkpOworICAgICAgY29uc3QgX1RwIF9fYl9uaW50ID0gc3RhdGljX2Nhc3Q8aW50PihfX2IgKyBfVHAoMC41TCkpOworICAgICAgY29uc3QgX1RwIF9fY19uaW50ID0gc3RhdGljX2Nhc3Q8aW50PihfX2MgKyBfVHAoMC41TCkpOworI2VuZGlmCisgICAgICBjb25zdCBfVHAgX190b2xlciA9IF9UcCgxMDAwKSAqIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgaWYgKHN0ZDo6YWJzKF9feCkgPj0gX1RwKDEpKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQXJndW1lbnQgb3V0c2lkZSB1bml0IGNpcmNsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2h5cGVyZy4iKSk7CisgICAgICBlbHNlIGlmIChfX2lzbmFuKF9fYSkgfHwgX19pc25hbihfX2IpCisgICAgICAgICAgICB8fCBfX2lzbmFuKF9fYykgfHwgX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9fY19uaW50ID09IF9fYyAmJiBfX2NfbmludCA8PSBfVHAoMCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmluZmluaXR5KCk7CisgICAgICBlbHNlIGlmIChzdGQ6OmFicyhfX2MgLSBfX2IpIDwgX190b2xlciB8fCBzdGQ6OmFicyhfX2MgLSBfX2EpIDwgX190b2xlcikKKyAgICAgICAgcmV0dXJuIHN0ZDo6cG93KF9UcCgxKSAtIF9feCwgX19jIC0gX19hIC0gX19iKTsKKyAgICAgIGVsc2UgaWYgKF9fYSA+PSBfVHAoMCkgJiYgX19iID49IF9UcCgwKSAmJiBfX2MgPj0gX1RwKDApCisgICAgICAgICAgICAmJiBfX3ggPj0gX1RwKDApICYmIF9feCA8IF9UcCgwLjk5NUwpKQorICAgICAgICByZXR1cm4gX19oeXBlcmdfc2VyaWVzKF9fYSwgX19iLCBfX2MsIF9feCk7CisgICAgICBlbHNlIGlmIChzdGQ6OmFicyhfX2EpIDwgX1RwKDEwKSAmJiBzdGQ6OmFicyhfX2IpIDwgX1RwKDEwKSkKKyAgICAgICAgeworICAgICAgICAgIC8vICBGb3IgaW50ZWdlciBhIGFuZCBiIHRoZSBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbiBpcyBhCisgICAgICAgICAgLy8gIGZpbml0ZSBwb2x5bm9taWFsLgorICAgICAgICAgIGlmIChfX2EgPCBfVHAoMCkgICYmICBzdGQ6OmFicyhfX2EgLSBfX2FfbmludCkgPCBfX3RvbGVyKQorICAgICAgICAgICAgcmV0dXJuIF9faHlwZXJnX3NlcmllcyhfX2FfbmludCwgX19iLCBfX2MsIF9feCk7CisgICAgICAgICAgZWxzZSBpZiAoX19iIDwgX1RwKDApICAmJiAgc3RkOjphYnMoX19iIC0gX19iX25pbnQpIDwgX190b2xlcikKKyAgICAgICAgICAgIHJldHVybiBfX2h5cGVyZ19zZXJpZXMoX19hLCBfX2JfbmludCwgX19jLCBfX3gpOworICAgICAgICAgIGVsc2UgaWYgKF9feCA8IC1fVHAoMC4yNUwpKQorICAgICAgICAgICAgcmV0dXJuIF9faHlwZXJnX2x1a2UoX19hLCBfX2IsIF9fYywgX194KTsKKyAgICAgICAgICBlbHNlIGlmIChfX3ggPCBfVHAoMC41TCkpCisgICAgICAgICAgICByZXR1cm4gX19oeXBlcmdfc2VyaWVzKF9fYSwgX19iLCBfX2MsIF9feCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fYykgPiBfVHAoMTApKQorICAgICAgICAgICAgICByZXR1cm4gX19oeXBlcmdfc2VyaWVzKF9fYSwgX19iLCBfX2MsIF9feCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJldHVybiBfX2h5cGVyZ19yZWZsZWN0KF9fYSwgX19iLCBfX2MsIF9feCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9faHlwZXJnX2x1a2UoX19hLCBfX2IsIF9fYywgX194KTsKKyAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0hZUEVSR0VPTUVUUklDX1RDQwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvaW50dHlwZXMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2ludHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlMmNlOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2ludHR5cGVzLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIGludHR5cGVzLmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9pbnR0eXBlcy5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0lOVFRZUEVTX0gKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0lOVFRZUEVTX0ggMQorCisjaW5jbHVkZSA8dHIxL2NpbnR0eXBlcz4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9JTlRUWVBFU19ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9sZWdlbmRyZV9mdW5jdGlvbi50Y2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9sZWdlbmRyZV9mdW5jdGlvbi50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlY2YwMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2xlZ2VuZHJlX2Z1bmN0aW9uLnRjYwpAQCAtMCwwICsxLDMwMyBAQAorLy8gU3BlY2lhbCBmdW5jdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvbGVnZW5kcmVfZnVuY3Rpb24udGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2NtYXRofQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyIFRSMTogNS4yICBTcGVjaWFsIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBFZHdhcmQgU21pdGgtUm93bGFuZCBiYXNlZCBvbjoKKy8vICAgKDEpIEhhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMsCisvLyAgICAgICBlZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKy8vICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywKKy8vICAgICAgIFNlY3Rpb24gOCwgcHAuIDMzMS0zNDEKKy8vICAgKDIpIFRoZSBHbnUgU2NpZW50aWZpYyBMaWJyYXJ5LCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3NsCisvLyAgICgzKSBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCBieSBXLiBILiBQcmVzcywgUy4gQS4gVGV1a29sc2t5LAorLy8gICAgICAgVy4gVC4gVmV0dGVybGluZywgQi4gUC4gRmxhbm5lcnksIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzICgxOTkyKSwKKy8vICAgICAgIDJuZCBlZCwgcHAuIDI1Mi0yNTQKKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfTEVHRU5EUkVfRlVOQ1RJT05fVENDCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9MRUdFTkRSRV9GVU5DVElPTl9UQ0MgMQorCisjaW5jbHVkZSAic3BlY2lhbF9mdW5jdGlvbl91dGlsLmgiCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyBbNS4yXSBTcGVjaWFsIGZ1bmN0aW9ucworCisgIC8vIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBMZWdlbmRyZSBwb2x5bm9taWFsIGJ5IHJlY3Vyc2lvbiBvbiBvcmRlcgorICAgICAqICAgICAgICAgICBAZiQgbCBAZiQuCisgICAgICogCisgICAgICogICBUaGUgTGVnZW5kcmUgZnVuY3Rpb24gb2YgQGYkIGwgQGYkIGFuZCBAZiQgeCBAZiQsCisgICAgICogICBAZiQgUF9sKHgpIEBmJCwgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICBQX2woeCkgPSBcZnJhY3sxfXsyXmwgbCF9XGZyYWN7ZF5sfXtkeF5sfSh4XjIgLSAxKV57bH0KKyAgICAgKiAgIEBmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBsICBUaGUgb3JkZXIgb2YgdGhlIExlZ2VuZHJlIHBvbHlub21pYWwuICBAZiRsID49IDBAZiQuCisgICAgICogICBAcGFyYW0gIHggIFRoZSBhcmd1bWVudCBvZiB0aGUgTGVnZW5kcmUgcG9seW5vbWlhbC4gIEBmJHx4fCA8PSAxQGYkLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3BvbHlfbGVnZW5kcmVfcCh1bnNpZ25lZCBpbnQgX19sLCBfVHAgX194KQorICAgIHsKKworICAgICAgaWYgKChfX3ggPCBfVHAoLTEpKSB8fCAoX194ID4gX1RwKCsxKSkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCBvdXQgb2YgcmFuZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gX19wb2x5X2xlZ2VuZHJlX3AuIikpOworICAgICAgZWxzZSBpZiAoX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9feCA9PSArX1RwKDEpKQorICAgICAgICByZXR1cm4gK19UcCgxKTsKKyAgICAgIGVsc2UgaWYgKF9feCA9PSAtX1RwKDEpKQorICAgICAgICByZXR1cm4gKF9fbCAlIDIgPT0gMSA/IC1fVHAoMSkgOiArX1RwKDEpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3BfbG0yID0gX1RwKDEpOworICAgICAgICAgIGlmIChfX2wgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBfX3BfbG0yOworCisgICAgICAgICAgX1RwIF9fcF9sbTEgPSBfX3g7CisgICAgICAgICAgaWYgKF9fbCA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIF9fcF9sbTE7CisKKyAgICAgICAgICBfVHAgX19wX2wgPSAwOworICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IF9fbGwgPSAyOyBfX2xsIDw9IF9fbDsgKytfX2xsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyAgVGhpcyBhcnJhbmdlbWVudCBpcyBzdXBwb3NlZCB0byBiZSBiZXR0ZXIgZm9yIHJvdW5kb2ZmCisgICAgICAgICAgICAgIC8vICBwcm90ZWN0aW9uLCBBcmZrZW4sIDJuZCBFZCwgRXEgMTIuMTdhLgorICAgICAgICAgICAgICBfX3BfbCA9IF9UcCgyKSAqIF9feCAqIF9fcF9sbTEgLSBfX3BfbG0yCisgICAgICAgICAgICAgICAgICAgIC0gKF9feCAqIF9fcF9sbTEgLSBfX3BfbG0yKSAvIF9UcChfX2xsKTsKKyAgICAgICAgICAgICAgX19wX2xtMiA9IF9fcF9sbTE7CisgICAgICAgICAgICAgIF9fcF9sbTEgPSBfX3BfbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBfX3BfbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbiBieSByZWN1cnNpb24KKyAgICAgKiAgICAgICAgICAgb24gQGYkIGwgQGYkLgorICAgICAqIAorICAgICAqICAgVGhlIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBMZWdlbmRyZSBmdW5jdGlvbgorICAgICAqICAgQGYkIFBfbCh4KSBAZiQgYnkgdGhlIFJvZHJpZ3VlcyBmb3JtdWxhOgorICAgICAqICAgQGZbCisgICAgICogICAgIFBfbF5tKHgpID0gKDEgLSB4XjIpXnttLzJ9XGZyYWN7ZF5tfXtkeF5tfVBfbCh4KQorICAgICAqICAgQGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIGwgIFRoZSBvcmRlciBvZiB0aGUgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgQGYkIGwgPj0gMCBAZiQuCisgICAgICogICBAcGFyYW0gIG0gIFRoZSBvcmRlciBvZiB0aGUgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgQGYkIG0gPD0gbCBAZiQuCisgICAgICogICBAcGFyYW0gIHggIFRoZSBhcmd1bWVudCBvZiB0aGUgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgQGYkIHx4fCA8PSAxIEBmJC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19hc3NvY19sZWdlbmRyZV9wKHVuc2lnbmVkIGludCBfX2wsIHVuc2lnbmVkIGludCBfX20sIF9UcCBfX3gpCisgICAgeworCisgICAgICBpZiAoX194IDwgX1RwKC0xKSB8fCBfX3ggPiBfVHAoKzEpKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIF9fYXNzb2NfbGVnZW5kcmVfcC4iKSk7CisgICAgICBlbHNlIGlmIChfX20gPiBfX2wpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJEZWdyZWUgb3V0IG9mIHJhbmdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIF9fYXNzb2NfbGVnZW5kcmVfcC4iKSk7CisgICAgICBlbHNlIGlmIChfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX19tID09IDApCisgICAgICAgIHJldHVybiBfX3BvbHlfbGVnZW5kcmVfcChfX2wsIF9feCk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19wX21tID0gX1RwKDEpOworICAgICAgICAgIGlmIChfX20gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyAgVHdvIHNxdWFyZSByb290cyBzZWVtIG1vcmUgYWNjdXJhdGUgbW9yZSBvZiB0aGUgdGltZQorICAgICAgICAgICAgICAvLyAgdGhhbiBqdXN0IG9uZS4KKyAgICAgICAgICAgICAgX1RwIF9fcm9vdCA9IHN0ZDo6c3FydChfVHAoMSkgLSBfX3gpICogc3RkOjpzcXJ0KF9UcCgxKSArIF9feCk7CisgICAgICAgICAgICAgIF9UcCBfX2ZhY3QgPSBfVHAoMSk7CisgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDE7IF9faSA8PSBfX207ICsrX19pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fcF9tbSAqPSAtX19mYWN0ICogX19yb290OworICAgICAgICAgICAgICAgICAgX19mYWN0ICs9IF9UcCgyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKF9fbCA9PSBfX20pCisgICAgICAgICAgICByZXR1cm4gX19wX21tOworCisgICAgICAgICAgX1RwIF9fcF9tcDFtID0gX1RwKDIgKiBfX20gKyAxKSAqIF9feCAqIF9fcF9tbTsKKyAgICAgICAgICBpZiAoX19sID09IF9fbSArIDEpCisgICAgICAgICAgICByZXR1cm4gX19wX21wMW07CisKKyAgICAgICAgICBfVHAgX19wX2xtMm0gPSBfX3BfbW07CisgICAgICAgICAgX1RwIF9fUF9sbTFtID0gX19wX21wMW07CisgICAgICAgICAgX1RwIF9fcF9sbSA9IF9UcCgwKTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2ogPSBfX20gKyAyOyBfX2ogPD0gX19sOyArK19faikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19wX2xtID0gKF9UcCgyICogX19qIC0gMSkgKiBfX3ggKiBfX1BfbG0xbQorICAgICAgICAgICAgICAgICAgICAgIC0gX1RwKF9faiArIF9fbSAtIDEpICogX19wX2xtMm0pIC8gX1RwKF9faiAtIF9fbSk7CisgICAgICAgICAgICAgIF9fcF9sbTJtID0gX19QX2xtMW07CisgICAgICAgICAgICAgIF9fUF9sbTFtID0gX19wX2xtOworICAgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIF9fcF9sbTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgc3BoZXJpY2FsIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24uCisgICAgICogCisgICAgICogICBUaGUgc3BoZXJpY2FsIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24gb2YgQGYkIGwgQGYkLCBAZiQgbSBAZiQsCisgICAgICogICBhbmQgQGYkIFx0aGV0YSBAZiQgaXMgZGVmaW5lZCBhcyBAZiQgWV9sXm0oXHRoZXRhLDApIEBmJCB3aGVyZQorICAgICAqICAgQGZbCisgICAgICogICAgICBZX2xebShcdGhldGEsXHBoaSkgPSAoLTEpXm1bXGZyYWN7KDJsKzEpfXs0XHBpfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxmcmFjeyhsLW0pIX17KGwrbSkhfV0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIFBfbF5tKFxjb3NcdGhldGEpIFxleHBee2ltXHBoaX0KKyAgICAgKiAgIEBmXQorICAgICAqICAgaXMgdGhlIHNwaGVyaWNhbCBoYXJtb25pYyBmdW5jdGlvbiBhbmQgQGYkIFBfbF5tKHgpIEBmJCBpcyB0aGUKKyAgICAgKiAgIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24uCisgICAgICogCisgICAgICogICBUaGlzIGZ1bmN0aW9uIGRpZmZlcnMgZnJvbSB0aGUgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbiBieQorICAgICAqICAgYXJndW1lbnQgKEBmJHggPSBcY29zKFx0aGV0YSlAZiQpIGFuZCBieSBhIG5vcm1hbGl6YXRpb24gZmFjdG9yCisgICAgICogICBidXQgdGhpcyBmYWN0b3IgaXMgcmF0aGVyIGxhcmdlIGZvciBsYXJnZSBAZiQgbCBAZiQgYW5kIEBmJCBtIEBmJAorICAgICAqICAgYW5kIHNvIHRoaXMgZnVuY3Rpb24gaXMgc3RhYmxlIGZvciBsYXJnZXIgZGlmZmVyZW5jZXMgb2YgQGYkIGwgQGYkCisgICAgICogICBhbmQgQGYkIG0gQGYkLgorICAgICAqIAorICAgICAqICAgQHBhcmFtICBsICBUaGUgb3JkZXIgb2YgdGhlIHNwaGVyaWNhbCBhc3NvY2lhdGVkIExlZ2VuZHJlIGZ1bmN0aW9uLgorICAgICAqICAgICAgICAgICAgICBAZiQgbCA+PSAwIEBmJC4KKyAgICAgKiAgIEBwYXJhbSAgbSAgVGhlIG9yZGVyIG9mIHRoZSBzcGhlcmljYWwgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgQGYkIG0gPD0gbCBAZiQuCisgICAgICogICBAcGFyYW0gIHRoZXRhICBUaGUgcmFkaWFuIGFuZ2xlIGFyZ3VtZW50IG9mIHRoZSBzcGhlcmljYWwgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgICAgICAgTGVnZW5kcmUgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3NwaF9sZWdlbmRyZSh1bnNpZ25lZCBpbnQgX19sLCB1bnNpZ25lZCBpbnQgX19tLCBfVHAgX190aGV0YSkKKyAgICB7CisgICAgICBpZiAoX19pc25hbihfX3RoZXRhKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisKKyAgICAgIGNvbnN0IF9UcCBfX3ggPSBzdGQ6OmNvcyhfX3RoZXRhKTsKKworICAgICAgaWYgKF9fbCA8IF9fbSkKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJCYWQgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX3NwaF9sZWdlbmRyZS4iKSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9fbSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fUCA9IF9fcG9seV9sZWdlbmRyZV9wKF9fbCwgX194KTsKKyAgICAgICAgICBfVHAgX19mYWN0ID0gc3RkOjpzcXJ0KF9UcCgyICogX19sICsgMSkKKyAgICAgICAgICAgICAgICAgICAgIC8gKF9UcCg0KSAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpKSk7CisgICAgICAgICAgX19QICo9IF9fZmFjdDsKKyAgICAgICAgICByZXR1cm4gX19QOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfX3ggPT0gX1RwKDEpIHx8IF9feCA9PSAtX1RwKDEpKQorICAgICAgICB7CisgICAgICAgICAgLy8gIG0gPiAwIGhlcmUKKyAgICAgICAgICByZXR1cm4gX1RwKDApOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyBtID4gMCBhbmQgfHh8IDwgMSBoZXJlCisKKyAgICAgICAgICAvLyBTdGFydGluZyB2YWx1ZSBmb3IgcmVjdXJzaW9uLgorICAgICAgICAgIC8vIFlfbV5tKHgpID0gc3FydCggKDJtKzEpLyg0cGkgbSkgZ2FtbWEobSsxLzIpL2dhbW1hKG0pICkKKyAgICAgICAgICAvLyAgICAgICAgICAgICAoLTEpXm0gKDEteF4yKV4obS8yKSAvIHBpXigxLzQpCisgICAgICAgICAgY29uc3QgX1RwIF9fc2duID0gKCBfX20gJSAyID09IDEgPyAtX1RwKDEpIDogX1RwKDEpKTsKKyAgICAgICAgICBjb25zdCBfVHAgX195X21wMW1fZmFjdG9yID0gX194ICogc3RkOjpzcXJ0KF9UcCgyICogX19tICsgMykpOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgICAgICBjb25zdCBfVHAgX19sbmNpcmMgPSBzdGQ6OnRyMTo6bG9nMXAoLV9feCAqIF9feCk7CisjZWxzZQorICAgICAgICAgIGNvbnN0IF9UcCBfX2xuY2lyYyA9IHN0ZDo6bG9nKF9UcCgxKSAtIF9feCAqIF9feCk7CisjZW5kaWYKKyAgICAgICAgICAvLyAgR2FtbWEobSsxLzIpIC8gR2FtbWEobSkKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgY29uc3QgX1RwIF9fbG5wb2NoID0gc3RkOjp0cjE6OmxnYW1tYShfVHAoX19tICsgX1RwKDAuNUwpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzdGQ6OnRyMTo6bGdhbW1hKF9UcChfX20pKTsKKyNlbHNlCisgICAgICAgICAgY29uc3QgX1RwIF9fbG5wb2NoID0gX19sb2dfZ2FtbWEoX1RwKF9fbSArIF9UcCgwLjVMKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19sb2dfZ2FtbWEoX1RwKF9fbSkpOworI2VuZGlmCisgICAgICAgICAgY29uc3QgX1RwIF9fbG5wcmVfdmFsID0KKyAgICAgICAgICAgICAgICAgICAgLV9UcCgwLjI1TCkgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fbG5waSgpCisgICAgICAgICAgICAgICAgICAgICsgX1RwKDAuNUwpICogKF9fbG5wb2NoICsgX19tICogX19sbmNpcmMpOworICAgICAgICAgIF9UcCBfX3NyID0gc3RkOjpzcXJ0KChfVHAoMikgKyBfVHAoMSkgLyBfX20pCisgICAgICAgICAgICAgICAgICAgLyAoX1RwKDQpICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkpKTsKKyAgICAgICAgICBfVHAgX195X21tID0gX19zZ24gKiBfX3NyICogc3RkOjpleHAoX19sbnByZV92YWwpOworICAgICAgICAgIF9UcCBfX3lfbXAxbSA9IF9feV9tcDFtX2ZhY3RvciAqIF9feV9tbTsKKworICAgICAgICAgIGlmIChfX2wgPT0gX19tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXR1cm4gX195X21tOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKF9fbCA9PSBfX20gKyAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXR1cm4gX195X21wMW07CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfVHAgX195X2xtID0gX1RwKDApOworCisgICAgICAgICAgICAgIC8vIENvbXB1dGUgWV9sXm0sIGwgPiBtKzEsIHVwd2FyZCByZWN1cnNpb24gb24gbC4KKyAgICAgICAgICAgICAgZm9yICggaW50IF9fbGwgPSBfX20gKyAyOyBfX2xsIDw9IF9fbDsgKytfX2xsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3JhdDEgPSBfVHAoX19sbCAtIF9fbSkgLyBfVHAoX19sbCArIF9fbSk7CisgICAgICAgICAgICAgICAgICBjb25zdCBfVHAgX19yYXQyID0gX1RwKF9fbGwgLSBfX20gLSAxKSAvIF9UcChfX2xsICsgX19tIC0gMSk7CisgICAgICAgICAgICAgICAgICBjb25zdCBfVHAgX19mYWN0MSA9IHN0ZDo6c3FydChfX3JhdDEgKiBfVHAoMiAqIF9fbGwgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogX1RwKDIgKiBfX2xsIC0gMSkpOworICAgICAgICAgICAgICAgICAgY29uc3QgX1RwIF9fZmFjdDIgPSBzdGQ6OnNxcnQoX19yYXQxICogX19yYXQyICogX1RwKDIgKiBfX2xsICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9UcCgyICogX19sbCAtIDMpKTsKKyAgICAgICAgICAgICAgICAgIF9feV9sbSA9IChfX3ggKiBfX3lfbXAxbSAqIF9fZmFjdDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAtIChfX2xsICsgX19tIC0gMSkgKiBfX3lfbW0gKiBfX2ZhY3QyKSAvIF9UcChfX2xsIC0gX19tKTsKKyAgICAgICAgICAgICAgICAgIF9feV9tbSA9IF9feV9tcDFtOworICAgICAgICAgICAgICAgICAgX195X21wMW0gPSBfX3lfbG07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHJldHVybiBfX3lfbG07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0xFR0VORFJFX0ZVTkNUSU9OX1RDQwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvbGltaXRzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9saW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWFkNDM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvbGltaXRzLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIGxpbWl0cy5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvbGltaXRzLmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfVFIxX0xJTUlUU19ICisjZGVmaW5lIF9UUjFfTElNSVRTX0ggMQorCisjaW5jbHVkZSA8dHIxL2NsaW1pdHM+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvbWF0aC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTc2NmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9tYXRoLmgKQEAgLTAsMCArMSwxODYgQEAKKy8vIFRSMSBtYXRoLmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9tYXRoLmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfTUFUSF9ICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9NQVRIX0ggMQorCisjaW5jbHVkZSA8dHIxL2NtYXRoPgorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCit1c2luZyBzdGQ6OnRyMTo6YWNvczsKK3VzaW5nIHN0ZDo6dHIxOjphY29zaDsKK3VzaW5nIHN0ZDo6dHIxOjphc2luOwordXNpbmcgc3RkOjp0cjE6OmFzaW5oOwordXNpbmcgc3RkOjp0cjE6OmF0YW47Cit1c2luZyBzdGQ6OnRyMTo6YXRhbjI7Cit1c2luZyBzdGQ6OnRyMTo6YXRhbmg7Cit1c2luZyBzdGQ6OnRyMTo6Y2JydDsKK3VzaW5nIHN0ZDo6dHIxOjpjZWlsOwordXNpbmcgc3RkOjp0cjE6OmNvcHlzaWduOwordXNpbmcgc3RkOjp0cjE6OmNvczsKK3VzaW5nIHN0ZDo6dHIxOjpjb3NoOwordXNpbmcgc3RkOjp0cjE6OmVyZjsKK3VzaW5nIHN0ZDo6dHIxOjplcmZjOwordXNpbmcgc3RkOjp0cjE6OmV4cDsKK3VzaW5nIHN0ZDo6dHIxOjpleHAyOwordXNpbmcgc3RkOjp0cjE6OmV4cG0xOwordXNpbmcgc3RkOjp0cjE6OmZhYnM7Cit1c2luZyBzdGQ6OnRyMTo6ZmRpbTsKK3VzaW5nIHN0ZDo6dHIxOjpmbG9vcjsKK3VzaW5nIHN0ZDo6dHIxOjpmbWE7Cit1c2luZyBzdGQ6OnRyMTo6Zm1heDsKK3VzaW5nIHN0ZDo6dHIxOjpmbWluOwordXNpbmcgc3RkOjp0cjE6OmZtb2Q7Cit1c2luZyBzdGQ6OnRyMTo6ZnJleHA7Cit1c2luZyBzdGQ6OnRyMTo6aHlwb3Q7Cit1c2luZyBzdGQ6OnRyMTo6aWxvZ2I7Cit1c2luZyBzdGQ6OnRyMTo6bGRleHA7Cit1c2luZyBzdGQ6OnRyMTo6bGdhbW1hOwordXNpbmcgc3RkOjp0cjE6OmxscmludDsKK3VzaW5nIHN0ZDo6dHIxOjpsbHJvdW5kOwordXNpbmcgc3RkOjp0cjE6OmxvZzsKK3VzaW5nIHN0ZDo6dHIxOjpsb2cxMDsKK3VzaW5nIHN0ZDo6dHIxOjpsb2cxcDsKK3VzaW5nIHN0ZDo6dHIxOjpsb2cyOwordXNpbmcgc3RkOjp0cjE6OmxvZ2I7Cit1c2luZyBzdGQ6OnRyMTo6bHJpbnQ7Cit1c2luZyBzdGQ6OnRyMTo6bHJvdW5kOwordXNpbmcgc3RkOjp0cjE6Om5lYXJieWludDsKK3VzaW5nIHN0ZDo6dHIxOjpuZXh0YWZ0ZXI7Cit1c2luZyBzdGQ6OnRyMTo6bmV4dHRvd2FyZDsKK3VzaW5nIHN0ZDo6dHIxOjpwb3c7Cit1c2luZyBzdGQ6OnRyMTo6cmVtYWluZGVyOwordXNpbmcgc3RkOjp0cjE6OnJlbXF1bzsKK3VzaW5nIHN0ZDo6dHIxOjpyaW50OwordXNpbmcgc3RkOjp0cjE6OnJvdW5kOwordXNpbmcgc3RkOjp0cjE6OnNjYWxibG47Cit1c2luZyBzdGQ6OnRyMTo6c2NhbGJuOwordXNpbmcgc3RkOjp0cjE6OnNpbjsKK3VzaW5nIHN0ZDo6dHIxOjpzaW5oOwordXNpbmcgc3RkOjp0cjE6OnNxcnQ7Cit1c2luZyBzdGQ6OnRyMTo6dGFuOwordXNpbmcgc3RkOjp0cjE6OnRhbmg7Cit1c2luZyBzdGQ6OnRyMTo6dGdhbW1hOwordXNpbmcgc3RkOjp0cjE6OnRydW5jOworCisjZW5kaWYKKwordXNpbmcgc3RkOjp0cjE6OmFzc29jX2xhZ3VlcnJlZjsKK3VzaW5nIHN0ZDo6dHIxOjphc3NvY19sYWd1ZXJyZTsKK3VzaW5nIHN0ZDo6dHIxOjphc3NvY19sYWd1ZXJyZWw7CisKK3VzaW5nIHN0ZDo6dHIxOjphc3NvY19sZWdlbmRyZWY7Cit1c2luZyBzdGQ6OnRyMTo6YXNzb2NfbGVnZW5kcmU7Cit1c2luZyBzdGQ6OnRyMTo6YXNzb2NfbGVnZW5kcmVsOworCit1c2luZyBzdGQ6OnRyMTo6YmV0YWY7Cit1c2luZyBzdGQ6OnRyMTo6YmV0YTsKK3VzaW5nIHN0ZDo6dHIxOjpiZXRhbDsKKwordXNpbmcgc3RkOjp0cjE6OmNvbXBfZWxsaW50XzFmOwordXNpbmcgc3RkOjp0cjE6OmNvbXBfZWxsaW50XzE7Cit1c2luZyBzdGQ6OnRyMTo6Y29tcF9lbGxpbnRfMWw7CisKK3VzaW5nIHN0ZDo6dHIxOjpjb21wX2VsbGludF8yZjsKK3VzaW5nIHN0ZDo6dHIxOjpjb21wX2VsbGludF8yOwordXNpbmcgc3RkOjp0cjE6OmNvbXBfZWxsaW50XzJsOworCit1c2luZyBzdGQ6OnRyMTo6Y29tcF9lbGxpbnRfM2Y7Cit1c2luZyBzdGQ6OnRyMTo6Y29tcF9lbGxpbnRfMzsKK3VzaW5nIHN0ZDo6dHIxOjpjb21wX2VsbGludF8zbDsKKwordXNpbmcgc3RkOjp0cjE6OmNvbmZfaHlwZXJnZjsKK3VzaW5nIHN0ZDo6dHIxOjpjb25mX2h5cGVyZzsKK3VzaW5nIHN0ZDo6dHIxOjpjb25mX2h5cGVyZ2w7CisKK3VzaW5nIHN0ZDo6dHIxOjpjeWxfYmVzc2VsX2lmOwordXNpbmcgc3RkOjp0cjE6OmN5bF9iZXNzZWxfaTsKK3VzaW5nIHN0ZDo6dHIxOjpjeWxfYmVzc2VsX2lsOworCit1c2luZyBzdGQ6OnRyMTo6Y3lsX2Jlc3NlbF9qZjsKK3VzaW5nIHN0ZDo6dHIxOjpjeWxfYmVzc2VsX2o7Cit1c2luZyBzdGQ6OnRyMTo6Y3lsX2Jlc3NlbF9qbDsKKwordXNpbmcgc3RkOjp0cjE6OmN5bF9iZXNzZWxfa2Y7Cit1c2luZyBzdGQ6OnRyMTo6Y3lsX2Jlc3NlbF9rOwordXNpbmcgc3RkOjp0cjE6OmN5bF9iZXNzZWxfa2w7CisKK3VzaW5nIHN0ZDo6dHIxOjpjeWxfbmV1bWFubmY7Cit1c2luZyBzdGQ6OnRyMTo6Y3lsX25ldW1hbm47Cit1c2luZyBzdGQ6OnRyMTo6Y3lsX25ldW1hbm5sOworCit1c2luZyBzdGQ6OnRyMTo6ZWxsaW50XzFmOwordXNpbmcgc3RkOjp0cjE6OmVsbGludF8xOwordXNpbmcgc3RkOjp0cjE6OmVsbGludF8xbDsKKwordXNpbmcgc3RkOjp0cjE6OmVsbGludF8yZjsKK3VzaW5nIHN0ZDo6dHIxOjplbGxpbnRfMjsKK3VzaW5nIHN0ZDo6dHIxOjplbGxpbnRfMmw7CisKK3VzaW5nIHN0ZDo6dHIxOjplbGxpbnRfM2Y7Cit1c2luZyBzdGQ6OnRyMTo6ZWxsaW50XzM7Cit1c2luZyBzdGQ6OnRyMTo6ZWxsaW50XzNsOworCit1c2luZyBzdGQ6OnRyMTo6ZXhwaW50ZjsKK3VzaW5nIHN0ZDo6dHIxOjpleHBpbnQ7Cit1c2luZyBzdGQ6OnRyMTo6ZXhwaW50bDsKKwordXNpbmcgc3RkOjp0cjE6Omhlcm1pdGVmOwordXNpbmcgc3RkOjp0cjE6Omhlcm1pdGU7Cit1c2luZyBzdGQ6OnRyMTo6aGVybWl0ZWw7CisKK3VzaW5nIHN0ZDo6dHIxOjpoeXBlcmdmOwordXNpbmcgc3RkOjp0cjE6Omh5cGVyZzsKK3VzaW5nIHN0ZDo6dHIxOjpoeXBlcmdsOworCit1c2luZyBzdGQ6OnRyMTo6bGFndWVycmVmOwordXNpbmcgc3RkOjp0cjE6OmxhZ3VlcnJlOwordXNpbmcgc3RkOjp0cjE6OmxhZ3VlcnJlbDsKKwordXNpbmcgc3RkOjp0cjE6OmxlZ2VuZHJlZjsKK3VzaW5nIHN0ZDo6dHIxOjpsZWdlbmRyZTsKK3VzaW5nIHN0ZDo6dHIxOjpsZWdlbmRyZWw7CisKK3VzaW5nIHN0ZDo6dHIxOjpyaWVtYW5uX3pldGFmOwordXNpbmcgc3RkOjp0cjE6OnJpZW1hbm5femV0YTsKK3VzaW5nIHN0ZDo6dHIxOjpyaWVtYW5uX3pldGFsOworCit1c2luZyBzdGQ6OnRyMTo6c3BoX2Jlc3NlbGY7Cit1c2luZyBzdGQ6OnRyMTo6c3BoX2Jlc3NlbDsKK3VzaW5nIHN0ZDo6dHIxOjpzcGhfYmVzc2VsbDsKKwordXNpbmcgc3RkOjp0cjE6OnNwaF9sZWdlbmRyZWY7Cit1c2luZyBzdGQ6OnRyMTo6c3BoX2xlZ2VuZHJlOwordXNpbmcgc3RkOjp0cjE6OnNwaF9sZWdlbmRyZWw7CisKK3VzaW5nIHN0ZDo6dHIxOjpzcGhfbmV1bWFubmY7Cit1c2luZyBzdGQ6OnRyMTo6c3BoX25ldW1hbm47Cit1c2luZyBzdGQ6OnRyMTo6c3BoX25ldW1hbm5sOworCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX01BVEhfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvbWVtb3J5IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvbWVtb3J5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNGNlNTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9tZW1vcnkKQEAgLTAsMCArMSw1MiBAQAorLy8gPHRyMS9tZW1vcnk+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogQGZpbGUgdHIxL21lbW9yeQorICogVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX01FTU9SWQorI2RlZmluZSBfR0xJQkNYWF9UUjFfTUVNT1JZIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgZGVmaW5lZChfR0xJQkNYWF9JTkNMVURFX0FTX0NYWDExKQorIyAgZXJyb3IgVFIxIGhlYWRlciBjYW5ub3QgYmUgaW5jbHVkZWQgZnJvbSBDKysxMSBoZWFkZXIKKyNlbmRpZgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4gICAgICAgIAkvLyBzdGQ6OmV4Y2VwdGlvbgorI2luY2x1ZGUgPHR5cGVpbmZvPiAgICAgICAgIAkvLyBzdGQ6OnR5cGVfaW5mbyBpbiBnZXRfZGVsZXRlcgorI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+ICAvLyBzdGQ6OnN3YXAKKyNpbmNsdWRlIDxpb3Nmd2Q+ICAgICAgICAgICAJLy8gc3RkOjpiYXNpY19vc3RyZWFtCisjaW5jbHVkZSA8ZXh0L2F0b21pY2l0eS5oPgorI2luY2x1ZGUgPGV4dC9jb25jdXJyZW5jZS5oPgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPiAJLy8gc3RkOjpsZXNzCisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyNpbmNsdWRlIDx0cjEvdHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dHIxL3NoYXJlZF9wdHIuaD4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9NRU1PUlkKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL21vZGlmaWVkX2Jlc3NlbF9mdW5jLnRjYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL21vZGlmaWVkX2Jlc3NlbF9mdW5jLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDFmYjkwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvbW9kaWZpZWRfYmVzc2VsX2Z1bmMudGNjCkBAIC0wLDAgKzEsNDM1IEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9tb2RpZmllZF9iZXNzZWxfZnVuYy50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvY21hdGh9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODIgVFIxOiA1LjIgIFNwZWNpYWwgZnVuY3Rpb25zCisvLworCisvLyBXcml0dGVuIGJ5IEVkd2FyZCBTbWl0aC1Sb3dsYW5kLgorLy8KKy8vIFJlZmVyZW5jZXM6CisvLyAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorLy8gICAgICAgRWQuIE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisvLyAgICAgICBEb3ZlciBQdWJsaWNhdGlvbnMsCisvLyAgICAgICBTZWN0aW9uIDksIHBwLiAzNTUtNDM0LCBTZWN0aW9uIDEwIHBwLiA0MzUtNDc4CisvLyAgICgyKSBUaGUgR251IFNjaWVudGlmaWMgTGlicmFyeSwgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dzbAorLy8gICAoMykgTnVtZXJpY2FsIFJlY2lwZXMgaW4gQywgYnkgVy4gSC4gUHJlc3MsIFMuIEEuIFRldWtvbHNreSwKKy8vICAgICAgIFcuIFQuIFZldHRlcmxpbmcsIEIuIFAuIEZsYW5uZXJ5LCBDYW1icmlkZ2UgVW5pdmVyc2l0eSBQcmVzcyAoMTk5MiksCisvLyAgICAgICAybmQgZWQsIHBwLiAyNDYtMjQ5LgorCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9NT0RJRklFRF9CRVNTRUxfRlVOQ19UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX01PRElGSUVEX0JFU1NFTF9GVU5DX1RDQyAxCisKKyNpbmNsdWRlICJzcGVjaWFsX2Z1bmN0aW9uX3V0aWwuaCIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIFs1LjJdIFNwZWNpYWwgZnVuY3Rpb25zCisKKyAgLy8gSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBDb21wdXRlIHRoZSBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb25zIEBmJCBJX1xudSh4KSBAZiQgYW5kCisgICAgICogICAgICAgICAgIEBmJCBLX1xudSh4KSBAZiQgYW5kIHRoZWlyIGZpcnN0IGRlcml2YXRpdmVzCisgICAgICogICAgICAgICAgIEBmJCBJJ19cbnUoeCkgQGYkIGFuZCBAZiQgSydfXG51KHgpIEBmJCByZXNwZWN0aXZlbHkuCisgICAgICogICAgICAgICAgIFRoZXNlIGZvdXIgZnVuY3Rpb25zIGFyZSBjb21wdXRlZCB0b2dldGhlciBmb3IgbnVtZXJpY2FsCisgICAgICogICAgICAgICAgIHN0YWJpbGl0eS4KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX251ICBUaGUgb3JkZXIgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbnMuCisgICAgICogICBAcGFyYW0gIF9feCAgIFRoZSBhcmd1bWVudCBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9ucy4KKyAgICAgKiAgIEBwYXJhbSAgX19JbnUgIFRoZSBvdXRwdXQgcmVndWxhciBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9fS251ICBUaGUgb3V0cHV0IGlycmVndWxhciBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9fSXBudSAgVGhlIG91dHB1dCBkZXJpdmF0aXZlIG9mIHRoZSByZWd1bGFyCisgICAgICogICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX0twbnUgIFRoZSBvdXRwdXQgZGVyaXZhdGl2ZSBvZiB0aGUgaXJyZWd1bGFyCisgICAgICogICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fYmVzc2VsX2lrKF9UcCBfX251LCBfVHAgX194LAorICAgICAgICAgICAgICAgIF9UcCAmIF9fSW51LCBfVHAgJiBfX0tudSwgX1RwICYgX19JcG51LCBfVHAgJiBfX0twbnUpCisgICAgeworICAgICAgaWYgKF9feCA9PSBfVHAoMCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX19udSA9PSBfVHAoMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fSW51ID0gX1RwKDEpOworICAgICAgICAgICAgICBfX0lwbnUgPSBfVHAoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoX19udSA9PSBfVHAoMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fSW51ID0gX1RwKDApOworICAgICAgICAgICAgICBfX0lwbnUgPSBfVHAoMC41TCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX0ludSA9IF9UcCgwKTsKKyAgICAgICAgICAgICAgX19JcG51ID0gX1RwKDApOworICAgICAgICAgICAgfQorICAgICAgICAgIF9fS251ID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjppbmZpbml0eSgpOworICAgICAgICAgIF9fS3BudSA9IC1zdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmluZmluaXR5KCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgY29uc3QgX1RwIF9fZnBfbWluID0gX1RwKDEwKSAqIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgY29uc3QgaW50IF9fbWF4X2l0ZXIgPSAxNTAwMDsKKyAgICAgIGNvbnN0IF9UcCBfX3hfbWluID0gX1RwKDIpOworCisgICAgICBjb25zdCBpbnQgX19ubCA9IHN0YXRpY19jYXN0PGludD4oX19udSArIF9UcCgwLjVMKSk7CisKKyAgICAgIGNvbnN0IF9UcCBfX211ID0gX19udSAtIF9fbmw7CisgICAgICBjb25zdCBfVHAgX19tdTIgPSBfX211ICogX19tdTsKKyAgICAgIGNvbnN0IF9UcCBfX3hpID0gX1RwKDEpIC8gX194OworICAgICAgY29uc3QgX1RwIF9feGkyID0gX1RwKDIpICogX194aTsKKyAgICAgIF9UcCBfX2ggPSBfX251ICogX194aTsKKyAgICAgIGlmICggX19oIDwgX19mcF9taW4gKQorICAgICAgICBfX2ggPSBfX2ZwX21pbjsKKyAgICAgIF9UcCBfX2IgPSBfX3hpMiAqIF9fbnU7CisgICAgICBfVHAgX19kID0gX1RwKDApOworICAgICAgX1RwIF9fYyA9IF9faDsKKyAgICAgIGludCBfX2k7CisgICAgICBmb3IgKCBfX2kgPSAxOyBfX2kgPD0gX19tYXhfaXRlcjsgKytfX2kgKQorICAgICAgICB7CisgICAgICAgICAgX19iICs9IF9feGkyOworICAgICAgICAgIF9fZCA9IF9UcCgxKSAvIChfX2IgKyBfX2QpOworICAgICAgICAgIF9fYyA9IF9fYiArIF9UcCgxKSAvIF9fYzsKKyAgICAgICAgICBjb25zdCBfVHAgX19kZWwgPSBfX2MgKiBfX2Q7CisgICAgICAgICAgX19oICo9IF9fZGVsOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX2RlbCAtIF9UcCgxKSkgPCBfX2VwcykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBpZiAoX19pID4gX19tYXhfaXRlcikKKyAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJBcmd1bWVudCB4IHRvbyBsYXJnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19iZXNzZWxfaWs7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnkgYXN5bXB0b3RpYyBleHBhbnNpb24uIikpOworICAgICAgX1RwIF9fSW51bCA9IF9fZnBfbWluOworICAgICAgX1RwIF9fSXBudWwgPSBfX2ggKiBfX0ludWw7CisgICAgICBfVHAgX19JbnVsMSA9IF9fSW51bDsKKyAgICAgIF9UcCBfX0lwbnUxID0gX19JcG51bDsKKyAgICAgIF9UcCBfX2ZhY3QgPSBfX251ICogX194aTsKKyAgICAgIGZvciAoaW50IF9fbCA9IF9fbmw7IF9fbCA+PSAxOyAtLV9fbCkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX0ludXRlbXAgPSBfX2ZhY3QgKiBfX0ludWwgKyBfX0lwbnVsOworICAgICAgICAgIF9fZmFjdCAtPSBfX3hpOworICAgICAgICAgIF9fSXBudWwgPSBfX2ZhY3QgKiBfX0ludXRlbXAgKyBfX0ludWw7CisgICAgICAgICAgX19JbnVsID0gX19JbnV0ZW1wOworICAgICAgICB9CisgICAgICBfVHAgX19mID0gX19JcG51bCAvIF9fSW51bDsKKyAgICAgIF9UcCBfX0ttdSwgX19LbnUxOworICAgICAgaWYgKF9feCA8IF9feF9taW4pCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX194MiA9IF9feCAvIF9UcCgyKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19waW11ID0gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkgKiBfX211OworICAgICAgICAgIGNvbnN0IF9UcCBfX2ZhY3QgPSAoc3RkOjphYnMoX19waW11KSA8IF9fZXBzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfVHAoMSkgOiBfX3BpbXUgLyBzdGQ6OnNpbihfX3BpbXUpKTsKKyAgICAgICAgICBfVHAgX19kID0gLXN0ZDo6bG9nKF9feDIpOworICAgICAgICAgIF9UcCBfX2UgPSBfX211ICogX19kOworICAgICAgICAgIGNvbnN0IF9UcCBfX2ZhY3QyID0gKHN0ZDo6YWJzKF9fZSkgPCBfX2VwcworICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX1RwKDEpIDogc3RkOjpzaW5oKF9fZSkgLyBfX2UpOworICAgICAgICAgIF9UcCBfX2dhbTEsIF9fZ2FtMiwgX19nYW1wbCwgX19nYW1taTsKKyAgICAgICAgICBfX2dhbW1hX3RlbW1lKF9fbXUsIF9fZ2FtMSwgX19nYW0yLCBfX2dhbXBsLCBfX2dhbW1pKTsKKyAgICAgICAgICBfVHAgX19mZiA9IF9fZmFjdAorICAgICAgICAgICAgICAgICAgICogKF9fZ2FtMSAqIHN0ZDo6Y29zaChfX2UpICsgX19nYW0yICogX19mYWN0MiAqIF9fZCk7CisgICAgICAgICAgX1RwIF9fc3VtID0gX19mZjsKKyAgICAgICAgICBfX2UgPSBzdGQ6OmV4cChfX2UpOworICAgICAgICAgIF9UcCBfX3AgPSBfX2UgLyAoX1RwKDIpICogX19nYW1wbCk7CisgICAgICAgICAgX1RwIF9fcSA9IF9UcCgxKSAvIChfVHAoMikgKiBfX2UgKiBfX2dhbW1pKTsKKyAgICAgICAgICBfVHAgX19jID0gX1RwKDEpOworICAgICAgICAgIF9fZCA9IF9feDIgKiBfX3gyOworICAgICAgICAgIF9UcCBfX3N1bTEgPSBfX3A7CisgICAgICAgICAgaW50IF9faTsKKyAgICAgICAgICBmb3IgKF9faSA9IDE7IF9faSA8PSBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19mZiA9IChfX2kgKiBfX2ZmICsgX19wICsgX19xKSAvIChfX2kgKiBfX2kgLSBfX211Mik7CisgICAgICAgICAgICAgIF9fYyAqPSBfX2QgLyBfX2k7CisgICAgICAgICAgICAgIF9fcCAvPSBfX2kgLSBfX211OworICAgICAgICAgICAgICBfX3EgLz0gX19pICsgX19tdTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fZGVsID0gX19jICogX19mZjsKKyAgICAgICAgICAgICAgX19zdW0gKz0gX19kZWw7IAorICAgICAgICAgICAgICBjb25zdCBfVHAgX19kZWwxID0gX19jICogKF9fcCAtIF9faSAqIF9fZmYpOworICAgICAgICAgICAgICBfX3N1bTEgKz0gX19kZWwxOworICAgICAgICAgICAgICBpZiAoc3RkOjphYnMoX19kZWwpIDwgX19lcHMgKiBzdGQ6OmFicyhfX3N1bSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKF9faSA+IF9fbWF4X2l0ZXIpCisgICAgICAgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIkJlc3NlbCBrIHNlcmllcyBmYWlsZWQgdG8gY29udmVyZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2Jlc3NlbF9pay4iKSk7CisgICAgICAgICAgX19LbXUgPSBfX3N1bTsKKyAgICAgICAgICBfX0tudTEgPSBfX3N1bTEgKiBfX3hpMjsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fYiA9IF9UcCgyKSAqIChfVHAoMSkgKyBfX3gpOworICAgICAgICAgIF9UcCBfX2QgPSBfVHAoMSkgLyBfX2I7CisgICAgICAgICAgX1RwIF9fZGVsaCA9IF9fZDsKKyAgICAgICAgICBfVHAgX19oID0gX19kZWxoOworICAgICAgICAgIF9UcCBfX3ExID0gX1RwKDApOworICAgICAgICAgIF9UcCBfX3EyID0gX1RwKDEpOworICAgICAgICAgIF9UcCBfX2ExID0gX1RwKDAuMjVMKSAtIF9fbXUyOworICAgICAgICAgIF9UcCBfX3EgPSBfX2MgPSBfX2ExOworICAgICAgICAgIF9UcCBfX2EgPSAtX19hMTsKKyAgICAgICAgICBfVHAgX19zID0gX1RwKDEpICsgX19xICogX19kZWxoOworICAgICAgICAgIGludCBfX2k7CisgICAgICAgICAgZm9yIChfX2kgPSAyOyBfX2kgPD0gX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fYSAtPSAyICogKF9faSAtIDEpOworICAgICAgICAgICAgICBfX2MgPSAtX19hICogX19jIC8gX19pOworICAgICAgICAgICAgICBjb25zdCBfVHAgX19xbmV3ID0gKF9fcTEgLSBfX2IgKiBfX3EyKSAvIF9fYTsKKyAgICAgICAgICAgICAgX19xMSA9IF9fcTI7CisgICAgICAgICAgICAgIF9fcTIgPSBfX3FuZXc7CisgICAgICAgICAgICAgIF9fcSArPSBfX2MgKiBfX3FuZXc7CisgICAgICAgICAgICAgIF9fYiArPSBfVHAoMik7CisgICAgICAgICAgICAgIF9fZCA9IF9UcCgxKSAvIChfX2IgKyBfX2EgKiBfX2QpOworICAgICAgICAgICAgICBfX2RlbGggPSAoX19iICogX19kIC0gX1RwKDEpKSAqIF9fZGVsaDsKKyAgICAgICAgICAgICAgX19oICs9IF9fZGVsaDsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fZGVscyA9IF9fcSAqIF9fZGVsaDsKKyAgICAgICAgICAgICAgX19zICs9IF9fZGVsczsKKyAgICAgICAgICAgICAgaWYgKCBzdGQ6OmFicyhfX2RlbHMgLyBfX3MpIDwgX19lcHMgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChfX2kgPiBfX21heF9pdGVyKQorICAgICAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJTdGVlZCdzIG1ldGhvZCBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2Jlc3NlbF9pay4iKSk7CisgICAgICAgICAgX19oID0gX19hMSAqIF9faDsKKyAgICAgICAgICBfX0ttdSA9IHN0ZDo6c3FydChfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSAvIChfVHAoMikgKiBfX3gpKQorICAgICAgICAgICAgICAgICogc3RkOjpleHAoLV9feCkgLyBfX3M7CisgICAgICAgICAgX19LbnUxID0gX19LbXUgKiAoX19tdSArIF9feCArIF9UcCgwLjVMKSAtIF9faCkgKiBfX3hpOworICAgICAgICB9CisKKyAgICAgIF9UcCBfX0twbXUgPSBfX211ICogX194aSAqIF9fS211IC0gX19LbnUxOworICAgICAgX1RwIF9fSW51bXUgPSBfX3hpIC8gKF9fZiAqIF9fS211IC0gX19LcG11KTsKKyAgICAgIF9fSW51ID0gX19JbnVtdSAqIF9fSW51bDEgLyBfX0ludWw7CisgICAgICBfX0lwbnUgPSBfX0ludW11ICogX19JcG51MSAvIF9fSW51bDsKKyAgICAgIGZvciAoIF9faSA9IDE7IF9faSA8PSBfX25sOyArK19faSApCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19LbnV0ZW1wID0gKF9fbXUgKyBfX2kpICogX194aTIgKiBfX0tudTEgKyBfX0ttdTsKKyAgICAgICAgICBfX0ttdSA9IF9fS251MTsKKyAgICAgICAgICBfX0tudTEgPSBfX0tudXRlbXA7CisgICAgICAgIH0KKyAgICAgIF9fS251ID0gX19LbXU7CisgICAgICBfX0twbnUgPSBfX251ICogX194aSAqIF9fS211IC0gX19LbnUxOworICAKKyAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIHJlZ3VsYXIgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uIG9mIG9yZGVyCisgICAgICogICAgICAgICAgIFxmJCBcbnUgXGYkOiBcZiQgSV97XG51fSh4KSBcZiQuCisgICAgICoKKyAgICAgKiAgIFRoZSByZWd1bGFyIG1vZGlmaWVkIGN5bGluZHJpY2FsIEJlc3NlbCBmdW5jdGlvbiBpczoKKyAgICAgKiAgIEBmWworICAgICAqICAgIElfe1xudX0oeCkgPSBcc3VtX3trPTB9XntcaW5mdHl9CisgICAgICogICAgICAgICAgICAgIFxmcmFjeyh4LzIpXntcbnUgKyAya319e2shXEdhbW1hKFxudStrKzEpfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19udSAgVGhlIG9yZGVyIG9mIHRoZSByZWd1bGFyIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX194ICAgVGhlIGFyZ3VtZW50IG9mIHRoZSByZWd1bGFyIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBvdXRwdXQgcmVndWxhciBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fY3lsX2Jlc3NlbF9pKF9UcCBfX251LCBfVHAgX194KQorICAgIHsKKyAgICAgIGlmIChfX251IDwgX1RwKDApIHx8IF9feCA8IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2N5bF9iZXNzZWxfaS4iKSk7CisgICAgICBlbHNlIGlmIChfX2lzbmFuKF9fbnUpIHx8IF9faXNuYW4oX194KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX3ggKiBfX3ggPCBfVHAoMTApICogKF9fbnUgKyBfVHAoMSkpKQorICAgICAgICByZXR1cm4gX19jeWxfYmVzc2VsX2lqX3NlcmllcyhfX251LCBfX3gsICtfVHAoMSksIDIwMCk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19JX251LCBfX0tfbnUsIF9fSXBfbnUsIF9fS3BfbnU7CisgICAgICAgICAgX19iZXNzZWxfaWsoX19udSwgX194LCBfX0lfbnUsIF9fS19udSwgX19JcF9udSwgX19LcF9udSk7CisgICAgICAgICAgcmV0dXJuIF9fSV9udTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgaXJyZWd1bGFyIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbgorICAgICAqICAgICAgICAgICBcZiQgS197XG51fSh4KSBcZiQgb2Ygb3JkZXIgXGYkIFxudSBcZiQuCisgICAgICoKKyAgICAgKiAgIFRoZSBpcnJlZ3VsYXIgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgIEtfe1xudX0oeCkgPSBcZnJhY3tccGl9ezJ9CisgICAgICogICAgICAgICAgICAgICAgICAgXGZyYWN7SV97LVxudX0oeCkgLSBJX3tcbnV9KHgpfXtcc2luIFxudVxwaX0KKyAgICAgKiAgIEBmXQorICAgICAqICAgd2hlcmUgZm9yIGludGVncmFsIFxmJCBcbnUgPSBuIFxmJCBhIGxpbWl0IGlzIHRha2VuOgorICAgICAqICAgXGYkIGxpbV97XG51IFx0byBufSBcZiQuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19udSAgVGhlIG9yZGVyIG9mIHRoZSBpcnJlZ3VsYXIgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3ggICBUaGUgYXJndW1lbnQgb2YgdGhlIGlycmVndWxhciBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgb3V0cHV0IGlycmVndWxhciBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fY3lsX2Jlc3NlbF9rKF9UcCBfX251LCBfVHAgX194KQorICAgIHsKKyAgICAgIGlmIChfX251IDwgX1RwKDApIHx8IF9feCA8IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2N5bF9iZXNzZWxfay4iKSk7CisgICAgICBlbHNlIGlmIChfX2lzbmFuKF9fbnUpIHx8IF9faXNuYW4oX194KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19JX251LCBfX0tfbnUsIF9fSXBfbnUsIF9fS3BfbnU7CisgICAgICAgICAgX19iZXNzZWxfaWsoX19udSwgX194LCBfX0lfbnUsIF9fS19udSwgX19JcF9udSwgX19LcF9udSk7CisgICAgICAgICAgcmV0dXJuIF9fS19udTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIENvbXB1dGUgdGhlIHNwaGVyaWNhbCBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb25zCisgICAgICogICAgICAgICAgIEBmJCBpX24oeCkgQGYkIGFuZCBAZiQga19uKHgpIEBmJCBhbmQgdGhlaXIgZmlyc3QKKyAgICAgKiAgICAgICAgICAgZGVyaXZhdGl2ZXMgQGYkIGknX24oeCkgQGYkIGFuZCBAZiQgaydfbih4KSBAZiQKKyAgICAgKiAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fbiAgVGhlIG9yZGVyIG9mIHRoZSBtb2RpZmllZCBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgbW9kaWZpZWQgc3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19pX24gIFRoZSBvdXRwdXQgcmVndWxhciBtb2RpZmllZCBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX2tfbiAgVGhlIG91dHB1dCBpcnJlZ3VsYXIgbW9kaWZpZWQgc3BoZXJpY2FsCisgICAgICogICAgICAgICAgICAgICAgICBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9faXBfbiAgVGhlIG91dHB1dCBkZXJpdmF0aXZlIG9mIHRoZSByZWd1bGFyIG1vZGlmaWVkCisgICAgICogICAgICAgICAgICAgICAgICAgc3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19rcF9uICBUaGUgb3V0cHV0IGRlcml2YXRpdmUgb2YgdGhlIGlycmVndWxhciBtb2RpZmllZAorICAgICAqICAgICAgICAgICAgICAgICAgIHNwaGVyaWNhbCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX19zcGhfYmVzc2VsX2lrKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gsCisgICAgICAgICAgICAgICAgICAgIF9UcCAmIF9faV9uLCBfVHAgJiBfX2tfbiwgX1RwICYgX19pcF9uLCBfVHAgJiBfX2twX24pCisgICAgeworICAgICAgY29uc3QgX1RwIF9fbnUgPSBfVHAoX19uKSArIF9UcCgwLjVMKTsKKworICAgICAgX1RwIF9fSV9udSwgX19JcF9udSwgX19LX251LCBfX0twX251OworICAgICAgX19iZXNzZWxfaWsoX19udSwgX194LCBfX0lfbnUsIF9fS19udSwgX19JcF9udSwgX19LcF9udSk7CisKKyAgICAgIGNvbnN0IF9UcCBfX2ZhY3RvciA9IF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19zcXJ0cGlvMigpCisgICAgICAgICAgICAgICAgICAgICAgICAgLyBzdGQ6OnNxcnQoX194KTsKKworICAgICAgX19pX24gPSBfX2ZhY3RvciAqIF9fSV9udTsKKyAgICAgIF9fa19uID0gX19mYWN0b3IgKiBfX0tfbnU7CisgICAgICBfX2lwX24gPSBfX2ZhY3RvciAqIF9fSXBfbnUgLSBfX2lfbiAvIChfVHAoMikgKiBfX3gpOworICAgICAgX19rcF9uID0gX19mYWN0b3IgKiBfX0twX251IC0gX19rX24gLyAoX1RwKDIpICogX194KTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIENvbXB1dGUgdGhlIEFpcnkgZnVuY3Rpb25zCisgICAgICogICAgICAgICAgIEBmJCBBaSh4KSBAZiQgYW5kIEBmJCBCaSh4KSBAZiQgYW5kIHRoZWlyIGZpcnN0CisgICAgICogICAgICAgICAgIGRlcml2YXRpdmVzIEBmJCBBaScoeCkgQGYkIGFuZCBAZiQgQmkoeCkgQGYkCisgICAgICogICAgICAgICAgIHJlc3BlY3RpdmVseS4KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX24gIFRoZSBvcmRlciBvZiB0aGUgQWlyeSBmdW5jdGlvbnMuCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBBaXJ5IGZ1bmN0aW9ucy4KKyAgICAgKiAgIEBwYXJhbSAgX19pX24gIFRoZSBvdXRwdXQgQWlyeSBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19rX24gIFRoZSBvdXRwdXQgQWlyeSBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19pcF9uICBUaGUgb3V0cHV0IGRlcml2YXRpdmUgb2YgdGhlIEFpcnkgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9fa3BfbiAgVGhlIG91dHB1dCBkZXJpdmF0aXZlIG9mIHRoZSBBaXJ5IGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fYWlyeShfVHAgX194LCBfVHAgJiBfX0FpLCBfVHAgJiBfX0JpLCBfVHAgJiBfX0FpcCwgX1RwICYgX19CaXApCisgICAgeworICAgICAgY29uc3QgX1RwIF9fYWJzeCA9IHN0ZDo6YWJzKF9feCk7CisgICAgICBjb25zdCBfVHAgX19yb290eCA9IHN0ZDo6c3FydChfX2Fic3gpOworICAgICAgY29uc3QgX1RwIF9feiA9IF9UcCgyKSAqIF9fYWJzeCAqIF9fcm9vdHggLyBfVHAoMyk7CisKKyAgICAgIGlmIChfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX194ID4gX1RwKDApKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fSV9udSwgX19JcF9udSwgX19LX251LCBfX0twX251OworCisgICAgICAgICAgX19iZXNzZWxfaWsoX1RwKDEpIC8gX1RwKDMpLCBfX3osIF9fSV9udSwgX19LX251LCBfX0lwX251LCBfX0twX251KTsKKyAgICAgICAgICBfX0FpID0gX19yb290eCAqIF9fS19udQorICAgICAgICAgICAgICAgLyAoX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3NxcnQzKCkKKyAgICAgICAgICAgICAgICAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpKTsKKyAgICAgICAgICBfX0JpID0gX19yb290eCAqIChfX0tfbnUgLyBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKQorICAgICAgICAgICAgICAgICArIF9UcCgyKSAqIF9fSV9udSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19zcXJ0MygpKTsKKworICAgICAgICAgIF9fYmVzc2VsX2lrKF9UcCgyKSAvIF9UcCgzKSwgX196LCBfX0lfbnUsIF9fS19udSwgX19JcF9udSwgX19LcF9udSk7CisgICAgICAgICAgX19BaXAgPSAtX194ICogX19LX251CisgICAgICAgICAgICAgICAgLyAoX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3NxcnQzKCkKKyAgICAgICAgICAgICAgICAgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSk7CisgICAgICAgICAgX19CaXAgPSBfX3ggKiAoX19LX251IC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkKKyAgICAgICAgICAgICAgICAgICAgICArIF9UcCgyKSAqIF9fSV9udQorICAgICAgICAgICAgICAgICAgICAgIC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3NxcnQzKCkpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfX3ggPCBfVHAoMCkpCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19KX251LCBfX0pwX251LCBfX05fbnUsIF9fTnBfbnU7CisKKyAgICAgICAgICBfX2Jlc3NlbF9qbihfVHAoMSkgLyBfVHAoMyksIF9feiwgX19KX251LCBfX05fbnUsIF9fSnBfbnUsIF9fTnBfbnUpOworICAgICAgICAgIF9fQWkgPSBfX3Jvb3R4ICogKF9fSl9udQorICAgICAgICAgICAgICAgICAgICAtIF9fTl9udSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19zcXJ0MygpKSAvIF9UcCgyKTsKKyAgICAgICAgICBfX0JpID0gLV9fcm9vdHggKiAoX19OX251CisgICAgICAgICAgICAgICAgICAgICsgX19KX251IC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3NxcnQzKCkpIC8gX1RwKDIpOworCisgICAgICAgICAgX19iZXNzZWxfam4oX1RwKDIpIC8gX1RwKDMpLCBfX3osIF9fSl9udSwgX19OX251LCBfX0pwX251LCBfX05wX251KTsKKyAgICAgICAgICBfX0FpcCA9IF9fYWJzeCAqIChfX05fbnUgLyBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fc3FydDMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICArIF9fSl9udSkgLyBfVHAoMik7CisgICAgICAgICAgX19CaXAgPSBfX2Fic3ggKiAoX19KX251IC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3NxcnQzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX05fbnUpIC8gX1RwKDIpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyAgUmVmZXJlbmNlOgorICAgICAgICAgIC8vICAgIEFicmFtb3dpdHogJiBTdGVndW4sIHBhZ2UgNDQ2IHNlY3Rpb24gMTAuNC40IG9uIEFpcnkgZnVuY3Rpb25zLgorICAgICAgICAgIC8vICBUaGUgbnVtYmVyIGlzIEFpKDApID0gM157LTIvM30vXEdhbW1hKDIvMykuCisgICAgICAgICAgX19BaSA9IF9UcCgwLjM1NTAyODA1Mzg4NzgxNzIzOTI2TCk7CisgICAgICAgICAgX19CaSA9IF9fQWkgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fc3FydDMoKTsKKworICAgICAgICAgIC8vICBSZWZlcmVuY2U6CisgICAgICAgICAgLy8gICAgQWJyYW1vd2l0eiAmIFN0ZWd1biwgcGFnZSA0NDYgc2VjdGlvbiAxMC40LjUgb24gQWlyeSBmdW5jdGlvbnMuCisgICAgICAgICAgLy8gIFRoZSBudW1iZXIgaXMgQWknKDApID0gLTNeey0xLzN9L1xHYW1tYSgxLzMpLgorICAgICAgICAgIF9fQWlwID0gLV9UcCgwLjI1ODgxOTQwMzc5MjgwNjc5ODQwTCk7CisgICAgICAgICAgX19CaXAgPSAtX19BaXAgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fc3FydDMoKTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm47CisgICAgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBzdGQ6OnRyMTo6X19kZXRhaWwKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9NT0RJRklFRF9CRVNTRUxfRlVOQ19UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3BvbHlfaGVybWl0ZS50Y2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9wb2x5X2hlcm1pdGUudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMDVmNzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9wb2x5X2hlcm1pdGUudGNjCkBAIC0wLDAgKzEsMTI0IEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9wb2x5X2hlcm1pdGUudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2NtYXRofQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyIFRSMTogNS4yICBTcGVjaWFsIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBFZHdhcmQgU21pdGgtUm93bGFuZCBiYXNlZCBvbjoKKy8vICAgKDEpIEhhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMsCisvLyAgICAgICBFZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKy8vICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywgU2VjdGlvbiAyMiBwcC4gNzczLTgwMgorCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9QT0xZX0hFUk1JVEVfVENDCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9QT0xZX0hFUk1JVEVfVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIFs1LjJdIFNwZWNpYWwgZnVuY3Rpb25zCisKKyAgLy8gSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBIZXJtaXRlIHBvbHlub21pYWwKKyAgICAgKiAgICAgICAgICBvZiBvcmRlciBuOiBcZiQgSF9uKHgpIFxmJCBieSByZWN1cnNpb24gb24gbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBIZXJtaXRlIHBvbHlub21pYWwgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICBIX24oeCkgPSAoLTEpXm4gZV57eF4yfSBcZnJhY3tkXm59e2R4Xm59IGVeey14XjJ9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9fbiBUaGUgb3JkZXIgb2YgdGhlIEhlcm1pdGUgcG9seW5vbWlhbC4KKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBIZXJtaXRlIHBvbHlub21pYWwuCisgICAgICogICBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSGVybWl0ZSBwb2x5bm9taWFsIG9mIG9yZGVyIG4KKyAgICAgKiAgICAgICAgICAgYW5kIGFyZ3VtZW50IHguCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fcG9seV9oZXJtaXRlX3JlY3Vyc2lvbih1bnNpZ25lZCBpbnQgX19uLCBfVHAgX194KQorICAgIHsKKyAgICAgIC8vICBDb21wdXRlIEhfMC4KKyAgICAgIF9UcCBfX0hfMCA9IDE7CisgICAgICBpZiAoX19uID09IDApCisgICAgICAgIHJldHVybiBfX0hfMDsKKworICAgICAgLy8gIENvbXB1dGUgSF8xLgorICAgICAgX1RwIF9fSF8xID0gMiAqIF9feDsKKyAgICAgIGlmIChfX24gPT0gMSkKKyAgICAgICAgcmV0dXJuIF9fSF8xOworCisgICAgICAvLyAgQ29tcHV0ZSBIX24uCisgICAgICBfVHAgX19IX24sIF9fSF9ubTEsIF9fSF9ubTI7CisgICAgICB1bnNpZ25lZCBpbnQgX19pOworICAgICAgZm9yICAoX19IX25tMiA9IF9fSF8wLCBfX0hfbm0xID0gX19IXzEsIF9faSA9IDI7IF9faSA8PSBfX247ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX19IX24gPSAyICogKF9feCAqIF9fSF9ubTEgLSAoX19pIC0gMSkgKiBfX0hfbm0yKTsKKyAgICAgICAgICBfX0hfbm0yID0gX19IX25tMTsKKyAgICAgICAgICBfX0hfbm0xID0gX19IX247CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fSF9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIEhlcm1pdGUgcG9seW5vbWlhbAorICAgICAqICAgICAgICAgIG9mIG9yZGVyIG46IFxmJCBIX24oeCkgXGYkLgorICAgICAqIAorICAgICAqICAgVGhlIEhlcm1pdGUgcG9seW5vbWlhbCBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgIEhfbih4KSA9ICgtMSlebiBlXnt4XjJ9IFxmcmFje2Rebn17ZHhebn0gZV57LXheMn0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gX19uIFRoZSBvcmRlciBvZiB0aGUgSGVybWl0ZSBwb2x5bm9taWFsLgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgYXJndW1lbnQgb2YgdGhlIEhlcm1pdGUgcG9seW5vbWlhbC4KKyAgICAgKiAgIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBIZXJtaXRlIHBvbHlub21pYWwgb2Ygb3JkZXIgbgorICAgICAqICAgICAgICAgICBhbmQgYXJndW1lbnQgeC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fcG9seV9oZXJtaXRlKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9faXNuYW4oX194KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX3BvbHlfaGVybWl0ZV9yZWN1cnNpb24oX19uLCBfX3gpOworICAgIH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2Ugc3RkOjp0cjE6Ol9fZGV0YWlsCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfUE9MWV9IRVJNSVRFX1RDQwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvcG9seV9sYWd1ZXJyZS50Y2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9wb2x5X2xhZ3VlcnJlLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQ0YTE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvcG9seV9sYWd1ZXJyZS50Y2MKQEAgLTAsMCArMSwzMTkgQEAKKy8vIFNwZWNpYWwgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3BvbHlfbGFndWVycmUudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2NtYXRofQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyIFRSMTogNS4yICBTcGVjaWFsIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBFZHdhcmQgU21pdGgtUm93bGFuZCBiYXNlZCBvbjoKKy8vICAgKDEpIEhhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMsCisvLyAgICAgICBFZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKy8vICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywKKy8vICAgICAgIFNlY3Rpb24gMTMsIHBwLiA1MDktNTEwLCBTZWN0aW9uIDIyIHBwLiA3NzMtODAyCisvLyAgICgyKSBUaGUgR251IFNjaWVudGlmaWMgTGlicmFyeSwgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dzbAorCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9QT0xZX0xBR1VFUlJFX1RDQworI2RlZmluZSBfR0xJQkNYWF9UUjFfUE9MWV9MQUdVRVJSRV9UQ0MgMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgLy8gWzUuMl0gU3BlY2lhbCBmdW5jdGlvbnMKKworICAvLyBJbXBsZW1lbnRhdGlvbi1zcGFjZSBkZXRhaWxzLgorICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLyoqCisgICAgICogICBAYnJpZWYgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgTGFndWVycmUgcG9seW5vbWlhbCAKKyAgICAgKiAgICAgICAgICBvZiBvcmRlciBAZiQgbiBAZiQsIGRlZ3JlZSBAZiQgXGFscGhhIEBmJCBmb3IgbGFyZ2Ugbi4KKyAgICAgKiAgIEFicmFtb3dpdHogJiBTdGVndW4sIDEzLjUuMjEKKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9fbiBUaGUgb3JkZXIgb2YgdGhlIExhZ3VlcnJlIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtIF9fYWxwaGEgVGhlIGRlZ3JlZSBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gX194IFRoZSBhcmd1bWVudCBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24gb2Ygb3JkZXIgbiwKKyAgICAgKiAgICAgICAgICAgZGVncmVlIEBmJCBcYWxwaGEgQGYkLCBhbmQgYXJndW1lbnQgeC4KKyAgICAgKgorICAgICAqICBUaGlzIGlzIGZyb20gdGhlIEdOVSBTY2llbnRpZmljIExpYnJhcnkuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwYSwgdHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fcG9seV9sYWd1ZXJyZV9sYXJnZV9uKHVuc2lnbmVkIF9fbiwgX1RwYSBfX2FscGhhMSwgX1RwIF9feCkKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19hID0gLV9UcChfX24pOworICAgICAgY29uc3QgX1RwIF9fYiA9IF9UcChfX2FscGhhMSkgKyBfVHAoMSk7CisgICAgICBjb25zdCBfVHAgX19ldGEgPSBfVHAoMikgKiBfX2IgLSBfVHAoNCkgKiBfX2E7CisgICAgICBjb25zdCBfVHAgX19jb3MydGggPSBfX3ggLyBfX2V0YTsKKyAgICAgIGNvbnN0IF9UcCBfX3NpbjJ0aCA9IF9UcCgxKSAtIF9fY29zMnRoOworICAgICAgY29uc3QgX1RwIF9fdGggPSBzdGQ6OmFjb3Moc3RkOjpzcXJ0KF9fY29zMnRoKSk7CisgICAgICBjb25zdCBfVHAgX19wcmVfaCA9IF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waV8yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpXzIoKQorICAgICAgICAgICAgICAgICAgICAgICAgKiBfX2V0YSAqIF9fZXRhICogX19jb3MydGggKiBfX3NpbjJ0aDsKKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIGNvbnN0IF9UcCBfX2xnX2IgPSBzdGQ6OnRyMTo6bGdhbW1hKF9UcChfX24pICsgX19iKTsKKyAgICAgIGNvbnN0IF9UcCBfX2xuZmFjdCA9IHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKF9fbiArIDEpKTsKKyNlbHNlCisgICAgICBjb25zdCBfVHAgX19sZ19iID0gX19sb2dfZ2FtbWEoX1RwKF9fbikgKyBfX2IpOworICAgICAgY29uc3QgX1RwIF9fbG5mYWN0ID0gX19sb2dfZ2FtbWEoX1RwKF9fbiArIDEpKTsKKyNlbmRpZgorCisgICAgICBfVHAgX19wcmVfdGVybTEgPSBfVHAoMC41TCkgKiAoX1RwKDEpIC0gX19iKQorICAgICAgICAgICAgICAgICAgICAgICogc3RkOjpsb2coX1RwKDAuMjVMKSAqIF9feCAqIF9fZXRhKTsKKyAgICAgIF9UcCBfX3ByZV90ZXJtMiA9IF9UcCgwLjI1TCkgKiBzdGQ6OmxvZyhfX3ByZV9oKTsKKyAgICAgIF9UcCBfX2xucHJlID0gX19sZ19iIC0gX19sbmZhY3QgKyBfVHAoMC41TCkgKiBfX3gKKyAgICAgICAgICAgICAgICAgICAgICArIF9fcHJlX3Rlcm0xIC0gX19wcmVfdGVybTI7CisgICAgICBfVHAgX19zZXJfdGVybTEgPSBzdGQ6OnNpbihfX2EgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSk7CisgICAgICBfVHAgX19zZXJfdGVybTIgPSBzdGQ6OnNpbihfVHAoMC4yNUwpICogX19ldGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKF9UcCgyKSAqIF9fdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHN0ZDo6c2luKF9UcCgyKSAqIF9fdGgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpXzQoKSk7CisgICAgICBfVHAgX19zZXIgPSBfX3Nlcl90ZXJtMSArIF9fc2VyX3Rlcm0yOworCisgICAgICByZXR1cm4gc3RkOjpleHAoX19sbnByZSkgKiBfX3NlcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIEV2YWx1YXRlIHRoZSBwb2x5bm9taWFsIGJhc2VkIG9uIHRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMKKyAgICAgKiAgICAgICAgICBmdW5jdGlvbiBpbiBhIHNhZmUgd2F5LCB3aXRoIG5vIHJlc3RyaWN0aW9uIG9uIHRoZSBhcmd1bWVudHMuCisgICAgICoKKyAgICAgKiAgIFRoZSBhc3NvY2lhdGVkIExhZ3VlcnJlIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIExfbl5cYWxwaGEoeCkgPSBcZnJhY3soXGFscGhhICsgMSlfbn17biF9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgIF8xRl8xKC1uOyBcYWxwaGEgKyAxOyB4KQorICAgICAqICAgQGZdCisgICAgICogICB3aGVyZSBAZiQgKFxhbHBoYSlfbiBAZiQgaXMgdGhlIFBvY2hoYW1tZXIgc3ltYm9sIGFuZAorICAgICAqICAgQGYkIF8xRl8xKGE7IGM7IHgpIEBmJCBpcyB0aGUgY29uZmx1ZW50IGh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9uLgorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB4ICE9IDAuCisgICAgICoKKyAgICAgKiAgVGhpcyBpcyBmcm9tIHRoZSBHTlUgU2NpZW50aWZpYyBMaWJyYXJ5LgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcGEsIHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3BvbHlfbGFndWVycmVfaHlwZXJnKHVuc2lnbmVkIGludCBfX24sIF9UcGEgX19hbHBoYTEsIF9UcCBfX3gpCisgICAgeworICAgICAgY29uc3QgX1RwIF9fYiA9IF9UcChfX2FscGhhMSkgKyBfVHAoMSk7CisgICAgICBjb25zdCBfVHAgX19teCA9IC1fX3g7CisgICAgICBjb25zdCBfVHAgX190Y19zZ24gPSAoX194IDwgX1RwKDApID8gX1RwKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKF9fbiAlIDIgPT0gMSkgPyAtX1RwKDEpIDogX1RwKDEpKSk7CisgICAgICAvLyAgR2V0IHx4fF5uL24hCisgICAgICBfVHAgX190YyA9IF9UcCgxKTsKKyAgICAgIGNvbnN0IF9UcCBfX2F4ID0gc3RkOjphYnMoX194KTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9fayA9IDE7IF9fayA8PSBfX247ICsrX19rKQorICAgICAgICBfX3RjICo9IChfX2F4IC8gX19rKTsKKworICAgICAgX1RwIF9fdGVybSA9IF9fdGMgKiBfX3RjX3NnbjsKKyAgICAgIF9UcCBfX3N1bSA9IF9fdGVybTsKKyAgICAgIGZvciAoaW50IF9fayA9IGludChfX24pIC0gMTsgX19rID49IDA7IC0tX19rKQorICAgICAgICB7CisgICAgICAgICAgX190ZXJtICo9ICgoX19iICsgX1RwKF9faykpIC8gX1RwKGludChfX24pIC0gX19rKSkKKyAgICAgICAgICAgICAgICAgICogX1RwKF9fayArIDEpIC8gX19teDsKKyAgICAgICAgICBfX3N1bSArPSBfX3Rlcm07CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fc3VtOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgTGFndWVycmUgcG9seW5vbWlhbCAKKyAgICAgKiAgICAgICAgICBvZiBvcmRlciBAZiQgbiBAZiQsIGRlZ3JlZSBAZiQgXGFscGhhIEBmJDogQGYkIExfbl5cYWxwaGEoeCkgQGYkCisgICAgICogICAgICAgICAgYnkgcmVjdXJzaW9uLgorICAgICAqCisgICAgICogICBUaGUgYXNzb2NpYXRlZCBMYWd1ZXJyZSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5CisgICAgICogICBAZlsKKyAgICAgKiAgICAgICBMX25eXGFscGhhKHgpID0gXGZyYWN7KFxhbHBoYSArIDEpX259e24hfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBfMUZfMSgtbjsgXGFscGhhICsgMTsgeCkKKyAgICAgKiAgIEBmXQorICAgICAqICAgd2hlcmUgQGYkIChcYWxwaGEpX24gQGYkIGlzIHRoZSBQb2NoaGFtbWVyIHN5bWJvbCBhbmQKKyAgICAgKiAgIEBmJCBfMUZfMShhOyBjOyB4KSBAZiQgaXMgdGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqICAgVGhlIGFzc29jaWF0ZWQgTGFndWVycmUgcG9seW5vbWlhbCBpcyBkZWZpbmVkIGZvciBpbnRlZ3JhbAorICAgICAqICAgQGYkIFxhbHBoYSA9IG0gQGYkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgICAgTF9uXm0oeCkgPSAoLTEpXm0gXGZyYWN7ZF5tfXtkeF5tfSBMX3tuICsgbX0oeCkKKyAgICAgKiAgIEBmXQorICAgICAqICAgd2hlcmUgdGhlIExhZ3VlcnJlIHBvbHlub21pYWwgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIExfbih4KSA9IFxmcmFje2VeeH17biF9IFxmcmFje2Rebn17ZHhebn0gKHhebmVeey14fSkKKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gX19uIFRoZSBvcmRlciBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gX19hbHBoYSBUaGUgZGVncmVlIG9mIHRoZSBMYWd1ZXJyZSBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBMYWd1ZXJyZSBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBMYWd1ZXJyZSBmdW5jdGlvbiBvZiBvcmRlciBuLAorICAgICAqICAgICAgICAgICBkZWdyZWUgQGYkIFxhbHBoYSBAZiQsIGFuZCBhcmd1bWVudCB4LgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcGEsIHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3BvbHlfbGFndWVycmVfcmVjdXJzaW9uKHVuc2lnbmVkIGludCBfX24sIF9UcGEgX19hbHBoYTEsIF9UcCBfX3gpCisgICAgeworICAgICAgLy8gICBDb21wdXRlIGxfMC4KKyAgICAgIF9UcCBfX2xfMCA9IF9UcCgxKTsKKyAgICAgIGlmICAoX19uID09IDApCisgICAgICAgIHJldHVybiBfX2xfMDsKKworICAgICAgLy8gIENvbXB1dGUgbF8xXmFscGhhLgorICAgICAgX1RwIF9fbF8xID0gLV9feCArIF9UcCgxKSArIF9UcChfX2FscGhhMSk7CisgICAgICBpZiAgKF9fbiA9PSAxKQorICAgICAgICByZXR1cm4gX19sXzE7CisKKyAgICAgIC8vICBDb21wdXRlIGxfbl5hbHBoYSBieSByZWN1cnNpb24gb24gbi4KKyAgICAgIF9UcCBfX2xfbjIgPSBfX2xfMDsKKyAgICAgIF9UcCBfX2xfbjEgPSBfX2xfMTsKKyAgICAgIF9UcCBfX2xfbiA9IF9UcCgwKTsKKyAgICAgIGZvciAgKHVuc2lnbmVkIGludCBfX25uID0gMjsgX19ubiA8PSBfX247ICsrX19ubikKKyAgICAgICAgeworICAgICAgICAgICAgX19sX24gPSAoX1RwKDIgKiBfX25uIC0gMSkgKyBfVHAoX19hbHBoYTEpIC0gX194KQorICAgICAgICAgICAgICAgICAgKiBfX2xfbjEgLyBfVHAoX19ubikKKyAgICAgICAgICAgICAgICAgIC0gKF9UcChfX25uIC0gMSkgKyBfVHAoX19hbHBoYTEpKSAqIF9fbF9uMiAvIF9UcChfX25uKTsKKyAgICAgICAgICAgIF9fbF9uMiA9IF9fbF9uMTsKKyAgICAgICAgICAgIF9fbF9uMSA9IF9fbF9uOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBfX2xfbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBhc3NvY2lhdGVkIExhZ3VlcnJlIHBvbHlub21pYWwKKyAgICAgKiAgICAgICAgICBvZiBvcmRlciBuLCBkZWdyZWUgQGYkIFxhbHBoYSBAZiQ6IEBmJCBMX25eYWxwaGEoeCkgQGYkLgorICAgICAqCisgICAgICogICBUaGUgYXNzb2NpYXRlZCBMYWd1ZXJyZSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5CisgICAgICogICBAZlsKKyAgICAgKiAgICAgICBMX25eXGFscGhhKHgpID0gXGZyYWN7KFxhbHBoYSArIDEpX259e24hfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBfMUZfMSgtbjsgXGFscGhhICsgMTsgeCkKKyAgICAgKiAgIEBmXQorICAgICAqICAgd2hlcmUgQGYkIChcYWxwaGEpX24gQGYkIGlzIHRoZSBQb2NoaGFtbWVyIHN5bWJvbCBhbmQKKyAgICAgKiAgIEBmJCBfMUZfMShhOyBjOyB4KSBAZiQgaXMgdGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqICAgVGhlIGFzc29jaWF0ZWQgTGFndWVycmUgcG9seW5vbWlhbCBpcyBkZWZpbmVkIGZvciBpbnRlZ3JhbAorICAgICAqICAgQGYkIFxhbHBoYSA9IG0gQGYkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgICAgTF9uXm0oeCkgPSAoLTEpXm0gXGZyYWN7ZF5tfXtkeF5tfSBMX3tuICsgbX0oeCkKKyAgICAgKiAgIEBmXQorICAgICAqICAgd2hlcmUgdGhlIExhZ3VlcnJlIHBvbHlub21pYWwgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIExfbih4KSA9IFxmcmFje2VeeH17biF9IFxmcmFje2Rebn17ZHhebn0gKHhebmVeey14fSkKKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gX19uIFRoZSBvcmRlciBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gX19hbHBoYSBUaGUgZGVncmVlIG9mIHRoZSBMYWd1ZXJyZSBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBMYWd1ZXJyZSBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBMYWd1ZXJyZSBmdW5jdGlvbiBvZiBvcmRlciBuLAorICAgICAqICAgICAgICAgICBkZWdyZWUgQGYkIFxhbHBoYSBAZiQsIGFuZCBhcmd1bWVudCB4LgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcGEsIHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3BvbHlfbGFndWVycmUodW5zaWduZWQgaW50IF9fbiwgX1RwYSBfX2FscGhhMSwgX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX194IDwgX1RwKDApKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiTmVnYXRpdmUgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19wb2x5X2xhZ3VlcnJlLiIpKTsKKyAgICAgIC8vICBSZXR1cm4gTmFOIG9uIE5hTiBpbnB1dC4KKyAgICAgIGVsc2UgaWYgKF9faXNuYW4oX194KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX24gPT0gMCkKKyAgICAgICAgcmV0dXJuIF9UcCgxKTsKKyAgICAgIGVsc2UgaWYgKF9fbiA9PSAxKQorICAgICAgICByZXR1cm4gX1RwKDEpICsgX1RwKF9fYWxwaGExKSAtIF9feDsKKyAgICAgIGVsc2UgaWYgKF9feCA9PSBfVHAoMCkpCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19wcm9kID0gX1RwKF9fYWxwaGExKSArIF9UcCgxKTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2sgPSAyOyBfX2sgPD0gX19uOyArK19faykKKyAgICAgICAgICAgIF9fcHJvZCAqPSAoX1RwKF9fYWxwaGExKSArIF9UcChfX2spKSAvIF9UcChfX2spOworICAgICAgICAgIHJldHVybiBfX3Byb2Q7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9fbiA+IDEwMDAwMDAwICYmIF9UcChfX2FscGhhMSkgPiAtX1RwKDEpCisgICAgICAgICAgICAmJiBfX3ggPCBfVHAoMikgKiAoX1RwKF9fYWxwaGExKSArIF9UcCgxKSkgKyBfVHAoNCAqIF9fbikpCisgICAgICAgIHJldHVybiBfX3BvbHlfbGFndWVycmVfbGFyZ2VfbihfX24sIF9fYWxwaGExLCBfX3gpOworICAgICAgZWxzZSBpZiAoX1RwKF9fYWxwaGExKSA+PSBfVHAoMCkKKyAgICAgICAgICAgfHwgKF9feCA+IF9UcCgwKSAmJiBfVHAoX19hbHBoYTEpIDwgLV9UcChfX24gKyAxKSkpCisgICAgICAgIHJldHVybiBfX3BvbHlfbGFndWVycmVfcmVjdXJzaW9uKF9fbiwgX19hbHBoYTEsIF9feCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX3BvbHlfbGFndWVycmVfaHlwZXJnKF9fbiwgX19hbHBoYTEsIF9feCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgYXNzb2NpYXRlZCBMYWd1ZXJyZSBwb2x5bm9taWFsCisgICAgICogICAgICAgICAgb2Ygb3JkZXIgbiwgZGVncmVlIG06IEBmJCBMX25ebSh4KSBAZiQuCisgICAgICoKKyAgICAgKiAgIFRoZSBhc3NvY2lhdGVkIExhZ3VlcnJlIHBvbHlub21pYWwgaXMgZGVmaW5lZCBmb3IgaW50ZWdyYWwKKyAgICAgKiAgIEBmJCBcYWxwaGEgPSBtIEBmJCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIExfbl5tKHgpID0gKC0xKV5tIFxmcmFje2RebX17ZHhebX0gTF97biArIG19KHgpCisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIHRoZSBMYWd1ZXJyZSBwb2x5bm9taWFsIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgICBMX24oeCkgPSBcZnJhY3tlXnh9e24hfSBcZnJhY3tkXm59e2R4Xm59ICh4Xm5lXnsteH0pCisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9fbiBUaGUgb3JkZXIgb2YgdGhlIExhZ3VlcnJlIHBvbHlub21pYWwuCisgICAgICogICBAcGFyYW0gX19tIFRoZSBkZWdyZWUgb2YgdGhlIExhZ3VlcnJlIHBvbHlub21pYWwuCisgICAgICogICBAcGFyYW0gX194IFRoZSBhcmd1bWVudCBvZiB0aGUgTGFndWVycmUgcG9seW5vbWlhbC4KKyAgICAgKiAgIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBhc3NvY2lhdGVkIExhZ3VlcnJlIHBvbHlub21pYWwgb2Ygb3JkZXIgbiwKKyAgICAgKiAgICAgICAgICAgZGVncmVlIG0sIGFuZCBhcmd1bWVudCB4LgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX19hc3NvY19sYWd1ZXJyZSh1bnNpZ25lZCBpbnQgX19uLCB1bnNpZ25lZCBpbnQgX19tLCBfVHAgX194KQorICAgIHsgcmV0dXJuIF9fcG9seV9sYWd1ZXJyZTx1bnNpZ25lZCBpbnQsIF9UcD4oX19uLCBfX20sIF9feCk7IH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIExhZ3VlcnJlIHBvbHlub21pYWwKKyAgICAgKiAgICAgICAgICBvZiBvcmRlciBuOiBAZiQgTF9uKHgpIEBmJC4KKyAgICAgKgorICAgICAqICAgVGhlIExhZ3VlcnJlIHBvbHlub21pYWwgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIExfbih4KSA9IFxmcmFje2VeeH17biF9IFxmcmFje2Rebn17ZHhebn0gKHhebmVeey14fSkKKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gX19uIFRoZSBvcmRlciBvZiB0aGUgTGFndWVycmUgcG9seW5vbWlhbC4KKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBMYWd1ZXJyZSBwb2x5bm9taWFsLgorICAgICAqICAgQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExhZ3VlcnJlIHBvbHlub21pYWwgb2Ygb3JkZXIgbgorICAgICAqICAgICAgICAgICBhbmQgYXJndW1lbnQgeC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fbGFndWVycmUodW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7IHJldHVybiBfX3BvbHlfbGFndWVycmU8dW5zaWduZWQgaW50LCBfVHA+KF9fbiwgMCwgX194KTsgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBzdGQ6OnRyMTo6X19kZXRhaWwKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9QT0xZX0xBR1VFUlJFX1RDQwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvcmFuZG9tIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvcmFuZG9tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDMwODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9yYW5kb20KQEAgLTAsMCArMSw1MCBAQAorLy8gcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogQGZpbGUgdHIxL3JhbmRvbQorICogVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1JBTkRPTQorI2RlZmluZSBfR0xJQkNYWF9UUjFfUkFORE9NIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L251bWVyaWNfdHJhaXRzLmg+CisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyNpbmNsdWRlIDx0cjEvdHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dHIxL2NtYXRoPgorI2luY2x1ZGUgPHRyMS9yYW5kb20uaD4KKyNpbmNsdWRlIDx0cjEvcmFuZG9tLnRjYz4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9SQU5ET00KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3JhbmRvbS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvcmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmOTUzZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3JhbmRvbS5oCkBAIC0wLDAgKzEsMjQxNyBAQAorLy8gcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogQGZpbGUgdHIxL3JhbmRvbS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL3JhbmRvbX0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9SQU5ET01fSAorI2RlZmluZSBfR0xJQkNYWF9UUjFfUkFORE9NX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyBbNS4xXSBSYW5kb20gbnVtYmVyIGdlbmVyYXRpb24KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgdHIxX3JhbmRvbSBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyAgICogQSBmYWNpbGl0eSBmb3IgZ2VuZXJhdGluZyByYW5kb20gbnVtYmVycyBvbiBzZWxlY3RlZCBkaXN0cmlidXRpb25zLgorICAgKiBAeworICAgKi8KKworICAvKgorICAgKiBJbXBsZW1lbnRhdGlvbi1zcGFjZSBkZXRhaWxzLgorICAgKi8KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgaW50IF9fdywgCisJICAgICBib29sID0gX193IDwgc3RkOjpudW1lcmljX2xpbWl0czxfVUludFR5cGU+OjpkaWdpdHM+CisgICAgICBzdHJ1Y3QgX1NoaWZ0CisgICAgICB7IHN0YXRpYyBjb25zdCBfVUludFR5cGUgX192YWx1ZSA9IDA7IH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIGludCBfX3c+CisgICAgICBzdHJ1Y3QgX1NoaWZ0PF9VSW50VHlwZSwgX193LCB0cnVlPgorICAgICAgeyBzdGF0aWMgY29uc3QgX1VJbnRUeXBlIF9fdmFsdWUgPSBfVUludFR5cGUoMSkgPDwgX193OyB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX19hLCBfVHAgX19jLCBfVHAgX19tLCBib29sPgorICAgICAgc3RydWN0IF9Nb2Q7CisKKyAgICAvLyBEaXNwYXRjaCBiYXNlZCBvbiBtb2R1bHVzIHZhbHVlIHRvIHByZXZlbnQgZGl2aWRlLWJ5LXplcm8gY29tcGlsZS10aW1lCisgICAgLy8gZXJyb3JzIHdoZW4gbSA9PSAwLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX1RwIF9fYSwgX1RwIF9fYywgX1RwIF9fbT4KKyAgICAgIGlubGluZSBfVHAKKyAgICAgIF9fbW9kKF9UcCBfX3gpCisgICAgICB7IHJldHVybiBfTW9kPF9UcCwgX19hLCBfX2MsIF9fbSwgX19tID09IDA+OjpfX2NhbGMoX194KTsgfQorCisgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTwoc2l6ZW9mKHVuc2lnbmVkKSA9PSA0KSwKKwkJICAgIHVuc2lnbmVkLCB1bnNpZ25lZCBsb25nPjo6X190eXBlIF9VSW50MzJUeXBlOworCisgICAgLyoKKyAgICAgKiBBbiBhZGFwdG9yIGNsYXNzIGZvciBjb252ZXJ0aW5nIHRoZSBvdXRwdXQgb2YgYW55IEdlbmVyYXRvciBpbnRvCisgICAgICogdGhlIGlucHV0IGZvciBhIHNwZWNpZmljIERpc3RyaWJ1dGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRW5naW5lLCB0eXBlbmFtZSBfRGlzdHJpYnV0aW9uPgorICAgICAgc3RydWN0IF9BZGFwdG9yCisgICAgICB7IAorCXR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRW5naW5lPjo6dHlwZSBfQkVuZ2luZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CRW5naW5lOjpyZXN1bHRfdHlwZSAgICAgICAgICAgX0VuZ2luZV9yZXN1bHRfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9EaXN0cmlidXRpb246OmlucHV0X3R5cGUgICAgICAgcmVzdWx0X3R5cGU7CisKKyAgICAgIHB1YmxpYzoKKwlfQWRhcHRvcihjb25zdCBfRW5naW5lJiBfX2cpCisJOiBfTV9nKF9fZykgeyB9CisKKwlyZXN1bHRfdHlwZQorCW1pbigpIGNvbnN0CisJeworCSAgcmVzdWx0X3R5cGUgX19yZXR1cm5fdmFsdWU7CisJICBpZiAoaXNfaW50ZWdyYWw8X0VuZ2luZV9yZXN1bHRfdHlwZT46OnZhbHVlCisJICAgICAgJiYgaXNfaW50ZWdyYWw8cmVzdWx0X3R5cGU+Ojp2YWx1ZSkKKwkgICAgX19yZXR1cm5fdmFsdWUgPSBfTV9nLm1pbigpOworCSAgZWxzZQorCSAgICBfX3JldHVybl92YWx1ZSA9IHJlc3VsdF90eXBlKDApOworCSAgcmV0dXJuIF9fcmV0dXJuX3ZhbHVlOworCX0KKworCXJlc3VsdF90eXBlCisJbWF4KCkgY29uc3QKKwl7CisJICByZXN1bHRfdHlwZSBfX3JldHVybl92YWx1ZTsKKwkgIGlmIChpc19pbnRlZ3JhbDxfRW5naW5lX3Jlc3VsdF90eXBlPjo6dmFsdWUKKwkgICAgICAmJiBpc19pbnRlZ3JhbDxyZXN1bHRfdHlwZT46OnZhbHVlKQorCSAgICBfX3JldHVybl92YWx1ZSA9IF9NX2cubWF4KCk7CisJICBlbHNlIGlmICghaXNfaW50ZWdyYWw8cmVzdWx0X3R5cGU+Ojp2YWx1ZSkKKwkgICAgX19yZXR1cm5fdmFsdWUgPSByZXN1bHRfdHlwZSgxKTsKKwkgIGVsc2UKKwkgICAgX19yZXR1cm5fdmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCkgLSAxOworCSAgcmV0dXJuIF9fcmV0dXJuX3ZhbHVlOworCX0KKworCS8qCisJICogQ29udmVydHMgYSB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIGFkYXB0ZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKwkgKiBpbnRvIGEgdmFsdWUgaW4gdGhlIGlucHV0IGRvbWFpbiBmb3IgdGhlIGRlcGVuZGVudCByYW5kb20gbnVtYmVyCisJICogZGlzdHJpYnV0aW9uLgorCSAqCisJICogQmVjYXVzZSB0aGUgdHlwZSB0cmFpdHMgYXJlIGNvbXBpbGUgdGltZSBjb25zdGFudHMgb25seSB0aGUKKwkgKiBhcHByb3ByaWF0ZSBjbGF1c2Ugb2YgdGhlIGlmIHN0YXRlbWVudHMgd2lsbCBhY3R1YWxseSBiZSBlbWl0dGVkCisJICogYnkgdGhlIGNvbXBpbGVyLgorCSAqLworCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKSgpCisJeworCSAgcmVzdWx0X3R5cGUgX19yZXR1cm5fdmFsdWU7CisJICBpZiAoaXNfaW50ZWdyYWw8X0VuZ2luZV9yZXN1bHRfdHlwZT46OnZhbHVlCisJICAgICAgJiYgaXNfaW50ZWdyYWw8cmVzdWx0X3R5cGU+Ojp2YWx1ZSkKKwkgICAgX19yZXR1cm5fdmFsdWUgPSBfTV9nKCk7CisJICBlbHNlIGlmICghaXNfaW50ZWdyYWw8X0VuZ2luZV9yZXN1bHRfdHlwZT46OnZhbHVlCisJCSAgICYmICFpc19pbnRlZ3JhbDxyZXN1bHRfdHlwZT46OnZhbHVlKQorCSAgICBfX3JldHVybl92YWx1ZSA9IHJlc3VsdF90eXBlKF9NX2coKSAtIF9NX2cubWluKCkpCisJICAgICAgLyByZXN1bHRfdHlwZShfTV9nLm1heCgpIC0gX01fZy5taW4oKSk7CisJICBlbHNlIGlmIChpc19pbnRlZ3JhbDxfRW5naW5lX3Jlc3VsdF90eXBlPjo6dmFsdWUKKwkJICAgJiYgIWlzX2ludGVncmFsPHJlc3VsdF90eXBlPjo6dmFsdWUpCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gcmVzdWx0X3R5cGUoX01fZygpIC0gX01fZy5taW4oKSkKKwkgICAgICAvIHJlc3VsdF90eXBlKF9NX2cubWF4KCkgLSBfTV9nLm1pbigpICsgcmVzdWx0X3R5cGUoMSkpOworCSAgZWxzZQorCSAgICBfX3JldHVybl92YWx1ZSA9ICgoKF9NX2coKSAtIF9NX2cubWluKCkpIAorCQkJICAgICAgIC8gKF9NX2cubWF4KCkgLSBfTV9nLm1pbigpKSkKKwkJCSAgICAgICogc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpKTsKKwkgIHJldHVybiBfX3JldHVybl92YWx1ZTsKKwl9CisKKyAgICAgIHByaXZhdGU6CisJX0VuZ2luZSBfTV9nOworICAgICAgfTsKKworICAgIC8vIFNwZWNpYWxpemF0aW9uIGZvciBfRW5naW5lKi4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRW5naW5lLCB0eXBlbmFtZSBfRGlzdHJpYnV0aW9uPgorICAgICAgc3RydWN0IF9BZGFwdG9yPF9FbmdpbmUqLCBfRGlzdHJpYnV0aW9uPgorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX0VuZ2luZTo6cmVzdWx0X3R5cGUgICAgICBfRW5naW5lX3Jlc3VsdF90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX0Rpc3RyaWJ1dGlvbjo6aW5wdXRfdHlwZSByZXN1bHRfdHlwZTsKKworICAgICAgcHVibGljOgorCV9BZGFwdG9yKF9FbmdpbmUqIF9fZykKKwk6IF9NX2coX19nKSB7IH0KKworCXJlc3VsdF90eXBlCisJbWluKCkgY29uc3QKKwl7CisJICByZXN1bHRfdHlwZSBfX3JldHVybl92YWx1ZTsKKwkgIGlmIChpc19pbnRlZ3JhbDxfRW5naW5lX3Jlc3VsdF90eXBlPjo6dmFsdWUKKwkgICAgICAmJiBpc19pbnRlZ3JhbDxyZXN1bHRfdHlwZT46OnZhbHVlKQorCSAgICBfX3JldHVybl92YWx1ZSA9IF9NX2ctPm1pbigpOworCSAgZWxzZQorCSAgICBfX3JldHVybl92YWx1ZSA9IHJlc3VsdF90eXBlKDApOworCSAgcmV0dXJuIF9fcmV0dXJuX3ZhbHVlOworCX0KKworCXJlc3VsdF90eXBlCisJbWF4KCkgY29uc3QKKwl7CisJICByZXN1bHRfdHlwZSBfX3JldHVybl92YWx1ZTsKKwkgIGlmIChpc19pbnRlZ3JhbDxfRW5naW5lX3Jlc3VsdF90eXBlPjo6dmFsdWUKKwkgICAgICAmJiBpc19pbnRlZ3JhbDxyZXN1bHRfdHlwZT46OnZhbHVlKQorCSAgICBfX3JldHVybl92YWx1ZSA9IF9NX2ctPm1heCgpOworCSAgZWxzZSBpZiAoIWlzX2ludGVncmFsPHJlc3VsdF90eXBlPjo6dmFsdWUpCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gcmVzdWx0X3R5cGUoMSk7CisJICBlbHNlCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpIC0gMTsKKwkgIHJldHVybiBfX3JldHVybl92YWx1ZTsKKwl9CisKKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoKQorCXsKKwkgIHJlc3VsdF90eXBlIF9fcmV0dXJuX3ZhbHVlOworCSAgaWYgKGlzX2ludGVncmFsPF9FbmdpbmVfcmVzdWx0X3R5cGU+Ojp2YWx1ZQorCSAgICAgICYmIGlzX2ludGVncmFsPHJlc3VsdF90eXBlPjo6dmFsdWUpCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gKCpfTV9nKSgpOworCSAgZWxzZSBpZiAoIWlzX2ludGVncmFsPF9FbmdpbmVfcmVzdWx0X3R5cGU+Ojp2YWx1ZQorCQkgICAmJiAhaXNfaW50ZWdyYWw8cmVzdWx0X3R5cGU+Ojp2YWx1ZSkKKwkgICAgX19yZXR1cm5fdmFsdWUgPSByZXN1bHRfdHlwZSgoKl9NX2cpKCkgLSBfTV9nLT5taW4oKSkKKwkgICAgICAvIHJlc3VsdF90eXBlKF9NX2ctPm1heCgpIC0gX01fZy0+bWluKCkpOworCSAgZWxzZSBpZiAoaXNfaW50ZWdyYWw8X0VuZ2luZV9yZXN1bHRfdHlwZT46OnZhbHVlCisJCSAgICYmICFpc19pbnRlZ3JhbDxyZXN1bHRfdHlwZT46OnZhbHVlKQorCSAgICBfX3JldHVybl92YWx1ZSA9IHJlc3VsdF90eXBlKCgqX01fZykoKSAtIF9NX2ctPm1pbigpKQorCSAgICAgIC8gcmVzdWx0X3R5cGUoX01fZy0+bWF4KCkgLSBfTV9nLT5taW4oKSArIHJlc3VsdF90eXBlKDEpKTsKKwkgIGVsc2UKKwkgICAgX19yZXR1cm5fdmFsdWUgPSAoKCgoKl9NX2cpKCkgLSBfTV9nLT5taW4oKSkgCisJCQkgICAgICAgLyAoX01fZy0+bWF4KCkgLSBfTV9nLT5taW4oKSkpCisJCQkgICAgICAqIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKSk7CisJICByZXR1cm4gX19yZXR1cm5fdmFsdWU7CisJfQorCisgICAgICBwcml2YXRlOgorCV9FbmdpbmUqIF9NX2c7CisgICAgICB9OworCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBQcm9kdWNlcyByYW5kb20gbnVtYmVycyBvbiBhIGdpdmVuIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiB1c2luZyBhCisgICAqIG5vbi11bmlmb3JtIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBlbmdpbmUuCisgICAqCisgICAqIEB0b2RvIHRoZSBlbmdpbmVfdmFsdWVfdHlwZSBuZWVkcyB0byBiZSBzdHVkaWVkIG1vcmUgY2FyZWZ1bGx5LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0VuZ2luZSwgdHlwZW5hbWUgX0Rpc3Q+CisgICAgY2xhc3MgdmFyaWF0ZV9nZW5lcmF0b3IKKyAgICB7CisgICAgICAvLyBDb25jZXB0IHJlcXVpcmVtZW50cy4KKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfRW5naW5lLCBfQ29weUNvbnN0cnVjdGlibGVDb25jZXB0KQorICAgICAgLy8gIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfRW5naW5lLCBfRW5naW5lQ29uY2VwdCkKKyAgICAgIC8vICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX0Rpc3QsIF9FbmdpbmVDb25jZXB0KQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfRW5naW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX19kZXRhaWw6Ol9BZGFwdG9yPF9FbmdpbmUsIF9EaXN0PiAgICAgZW5naW5lX3ZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9EaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRGlzdDo6cmVzdWx0X3R5cGUgICAgICAgICAgICByZXN1bHRfdHlwZTsKKworICAgICAgLy8gdHIxOjUuMS4xIHRhYmxlIDUuMSByZXF1aXJlbWVudAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPAorCWlzX2FyaXRobWV0aWM8cmVzdWx0X3R5cGU+Ojp2YWx1ZSwgcmVzdWx0X3R5cGU+OjpfX3R5cGUgX0lzVmFsaWRUeXBlOworCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSB2YXJpYXRlIGdlbmVyYXRvciB3aXRoIHRoZSB1bmlmb3JtIHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvciBAcCBfX2VuZyBmb3IgdGhlIHJhbmRvbSBkaXN0cmlidXRpb24gQHAgX19kaXN0LgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgQW55IGV4Y2VwdGlvbnMgd2hpY2ggbWF5IHRocm93biBieSB0aGUgY29weSBjb25zdHJ1Y3RvcnMgb2YKKyAgICAgICAqIHRoZSBAcCBfRW5naW5lIG9yIEBwIF9EaXN0IG9iamVjdHMuCisgICAgICAgKi8KKyAgICAgIHZhcmlhdGVfZ2VuZXJhdG9yKGVuZ2luZV90eXBlIF9fZW5nLCBkaXN0cmlidXRpb25fdHlwZSBfX2Rpc3QpCisgICAgICA6IF9NX2VuZ2luZShfX2VuZyksIF9NX2Rpc3QoX19kaXN0KSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBuZXh0IGdlbmVyYXRlZCB2YWx1ZSBvbiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpCisgICAgICB7IHJldHVybiBfTV9kaXN0KF9NX2VuZ2luZSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBXVEY/CisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfVHAgX192YWx1ZSkKKyAgICAgICAgeyByZXR1cm4gX01fZGlzdChfTV9lbmdpbmUsIF9fdmFsdWUpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyB1bmlmb3JtIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGVuZ2luZV92YWx1ZV90eXBlJgorICAgICAgZW5naW5lKCkKKyAgICAgIHsgcmV0dXJuIF9NX2VuZ2luZTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgdW5pZm9ybSByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICovCisgICAgICBjb25zdCBlbmdpbmVfdmFsdWVfdHlwZSYKKyAgICAgIGVuZ2luZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9lbmdpbmU7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIHJhbmRvbSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIGRpc3RyaWJ1dGlvbl90eXBlJgorICAgICAgZGlzdHJpYnV0aW9uKCkKKyAgICAgIHsgcmV0dXJuIF9NX2Rpc3Q7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIHJhbmRvbSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0IGRpc3RyaWJ1dGlvbl90eXBlJgorICAgICAgZGlzdHJpYnV0aW9uKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2Rpc3Q7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBjbG9zZWQgbG93ZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbiBpbnRlcnZhbC4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kaXN0cmlidXRpb24oKS5taW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIGNsb3NlZCB1cHBlciBib3VuZCBvZiB0aGUgZGlzdHJpYnV0aW9uIGludGVydmFsLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRpc3RyaWJ1dGlvbigpLm1heCgpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgZW5naW5lX3ZhbHVlX3R5cGUgX01fZW5naW5lOworICAgICAgZGlzdHJpYnV0aW9uX3R5cGUgX01fZGlzdDsKKyAgICB9OworCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHRyMV9yYW5kb21fZ2VuZXJhdG9ycyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvcnMKKyAgICogQGluZ3JvdXAgdHIxX3JhbmRvbQorICAgKgorICAgKiBUaGVzZSBjbGFzc2VzIGRlZmluZSBvYmplY3RzIHdoaWNoIHByb3ZpZGUgcmFuZG9tIG9yIHBzZXVkb3JhbmRvbQorICAgKiBudW1iZXJzLCBlaXRoZXIgZnJvbSBhIGRpc2NyZXRlIG9yIGEgY29udGludW91cyBpbnRlcnZhbC4gIFRoZQorICAgKiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBzdXBwbGllZCBhcyBhIHBhcnQgb2YgdGhpcyBsaWJyYXJ5IGFyZQorICAgKiBhbGwgdW5pZm9ybSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgd2hpY2ggcHJvdmlkZSBhIHNlcXVlbmNlIG9mCisgICAqIHJhbmRvbSBudW1iZXIgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIG92ZXIgdGhlaXIgcmFuZ2UuCisgICAqCisgICAqIEEgbnVtYmVyIGdlbmVyYXRvciBpcyBhIGZ1bmN0aW9uIG9iamVjdCB3aXRoIGFuIG9wZXJhdG9yKCkgdGhhdAorICAgKiB0YWtlcyB6ZXJvIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIG51bWJlci4KKyAgICoKKyAgICogQSBjb21wbGlhbnQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgbXVzdCBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcKKyAgICogcmVxdWlyZW1lbnRzLiAgPHRhYmxlIGJvcmRlcj0xIGNlbGxwYWRkaW5nPTEwIGNlbGxzcGFjaW5nPTA+CisgICAqIDxjYXB0aW9uIGFsaWduPXRvcD5SYW5kb20gTnVtYmVyIEdlbmVyYXRvciBSZXF1aXJlbWVudHM8L2NhcHRpb24+CisgICAqIDx0cj48dGQ+VG8gYmUgZG9jdW1lbnRlZC48L3RkPjwvdHI+IDwvdGFibGU+CisgICAqIAorICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogQGJyaWVmIEEgbW9kZWwgb2YgYSBsaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgKgorICAgKiBBIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRoYXQgcHJvZHVjZXMgcHNldWRvcmFuZG9tIG51bWJlcnMgdXNpbmcgdGhlCisgICAqIGxpbmVhciBmdW5jdGlvbiBAZiR4X3tpKzF9XGxlZnRhcnJvdyhheF97aX0gKyBjKSBcYm1vZCBtIEBmJC4KKyAgICoKKyAgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBAcCBfVUludFR5cGUgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlCisgICAqIGxhcmdlIGVub3VnaCB0byBzdG9yZSB2YWx1ZXMgdXAgdG8gKF9fbS0xKS4gSWYgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcgorICAgKiBAcCBfX20gaXMgMCwgdGhlIG1vZHVsdXMgQHAgX19tIHVzZWQgaXMKKyAgICogc3RkOjpudW1lcmljX2xpbWl0czxfVUludFR5cGU+OjptYXgoKSBwbHVzIDEuIE90aGVyd2lzZSwgdGhlIHRlbXBsYXRlCisgICAqIHBhcmFtZXRlcnMgQHAgX19hIGFuZCBAcCBfX2MgbXVzdCBiZSBsZXNzIHRoYW4gQHAgX19tLgorICAgKgorICAgKiBUaGUgc2l6ZSBvZiB0aGUgc3RhdGUgaXMgQGYkIDEgQGYkLgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIGNsYXNzIGxpbmVhcl9jb25ncnVlbnRpYWwKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1VJbnRUeXBlLCBfVW5zaWduZWRJbnRlZ2VyQ29uY2VwdCkKKyAgICAgIC8vICBfX2dsaWJjcHBfY2xhc3NfcmVxdWlyZXMoX19hIDwgX19tICYmIF9fYyA8IF9fbSkKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgX1VJbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgICAvKiogVGhlIG11bHRpcGxpZXIuICovCisgICAgICBzdGF0aWMgY29uc3QgX1VJbnRUeXBlIG11bHRpcGxpZXIgPSBfX2E7CisgICAgICAvKiogQW4gaW5jcmVtZW50LiAqLworICAgICAgc3RhdGljIGNvbnN0IF9VSW50VHlwZSBpbmNyZW1lbnQgPSBfX2M7CisgICAgICAvKiogVGhlIG1vZHVsdXMuICovCisgICAgICBzdGF0aWMgY29uc3QgX1VJbnRUeXBlIG1vZHVsdXMgPSBfX207CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhICVsaW5lYXJfY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZSB3aXRoCisgICAgICAgKiBzZWVkIEBwIF9fcy4gIFRoZSBkZWZhdWx0IHNlZWQgdmFsdWUgaXMgMS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19zIFRoZSBpbml0aWFsIHNlZWQgdmFsdWUuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBsaW5lYXJfY29uZ3J1ZW50aWFsKHVuc2lnbmVkIGxvbmcgX194MCA9IDEpCisgICAgICB7IHRoaXMtPnNlZWQoX194MCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgJWxpbmVhcl9jb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lCisgICAgICAgKiBzZWVkZWQgZnJvbSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIEBwIF9fZy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19nIFRoZSBzZWVkIGdlbmVyYXRvciBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgbGluZWFyX2NvbmdydWVudGlhbChfR2VuJiBfX2cpCisgICAgICAgIHsgdGhpcy0+c2VlZChfX2cpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogUmVzZWVkcyB0aGUgJWxpbmVhcl9jb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lCisgICAgICAgKiBzZXF1ZW5jZSB0byB0aGUgc2VlZCBAZyBfX3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcyBUaGUgbmV3IHNlZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNlZWQodW5zaWduZWQgbG9uZyBfX3MgPSAxKTsKKworICAgICAgLyoqCisgICAgICAgKiBSZXNlZWRzIHRoZSAlbGluZWFyX2NvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUKKyAgICAgICAqIHNlcXVlbmNlIHVzaW5nIHZhbHVlcyBmcm9tIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gQHAgX19nLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2cgdGhlIHNlZWQgZ2VuZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX0dlbiYgX19nKQorICAgICAgICB7IHNlZWQoX19nLCB0eXBlbmFtZSBpc19mdW5kYW1lbnRhbDxfR2VuPjo6dHlwZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIHZhbHVlIGluIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAgICAgKgorICAgICAgICogVGhlIG1pbmltdW0gZGVwZW5kcyBvbiB0aGUgQHAgX19jIHBhcmFtZXRlcjogaWYgaXQgaXMgemVybywgdGhlCisgICAgICAgKiBtaW5pbXVtIGdlbmVyYXRlZCBtdXN0IGJlID4gMCwgb3RoZXJ3aXNlIDAgaXMgYWxsb3dlZC4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgX19tPihfX2MpID09IDApID8gMSA6IDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHZhbHVlIGluIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX19tIC0gMTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG5leHQgcmFuZG9tIG51bWJlciBpbiB0aGUgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKCk7CisKKyAgICAgIC8qKgorICAgICAgICogQ29tcGFyZXMgdHdvIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgZXF1YWxpdHkuCisgICAgICAgKiAgCisgICAgICAgKiBAcGFyYW0gX19saHMgQSBsaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBsaW5lYXJfY29uZ3J1ZW50aWFsJiBfX2xocywKKwkJIGNvbnN0IGxpbmVhcl9jb25ncnVlbnRpYWwmIF9fcmhzKQorICAgICAgeyByZXR1cm4gX19saHMuX01feCA9PSBfX3Jocy5fTV94OyB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29tcGFyZXMgdHdvIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSBsaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBub3QgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgbGluZWFyX2NvbmdydWVudGlhbCYgX19saHMsCisJCSBjb25zdCBsaW5lYXJfY29uZ3J1ZW50aWFsJiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogV3JpdGVzIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdGF0ZSB4KGkpIG9mIHggdG8gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyAgVGhlIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX19sY3IgQSAlIGxpbmVhcl9jb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKiBAcmV0dXJucyBfX29zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUxLCBfVUludFR5cGUxIF9fYTEsIF9VSW50VHlwZTEgX19jMSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX20xLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgbGluZWFyX2NvbmdydWVudGlhbDxfVUludFR5cGUxLCBfX2ExLCBfX2MxLAorCQkgICBfX20xPiYgX19sY3IpOworCisgICAgICAvKioKKyAgICAgICAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBlbmdpbmUgYnkgcmVhZGluZyBpdHMgdGV4dHVhbAorICAgICAgICogcmVwcmVzZW50YXRpb24gZnJvbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIFRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgd3JpdHRlbiB1c2luZyBhbgorICAgICAgICogb3V0cHV0IHN0cmVhbSB3aG9zZSBpbWJ1ZWQgbG9jYWxlIGFuZCB3aG9zZSB0eXBlJ3MgdGVtcGxhdGUKKyAgICAgICAqIHNwZWNpYWxpemF0aW9uIGFyZ3VtZW50cyBfQ2hhclQgYW5kIF9UcmFpdHMgd2VyZSB0aGUgc2FtZSBhcyB0aG9zZSBvZgorICAgICAgICogQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyAgVGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX2xjciBBICUgbGluZWFyX2NvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqIEByZXR1cm5zIF9faXMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZTEsIF9VSW50VHlwZTEgX19hMSwgX1VJbnRUeXBlMSBfX2MxLAorCSAgICAgICBfVUludFR5cGUxIF9fbTEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZTEsIF9fYTEsIF9fYzEsIF9fbTE+JiBfX2xjcik7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9HZW4mIF9fZywgdHJ1ZV90eXBlKQorICAgICAgICB7IHJldHVybiBzZWVkKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KF9fZykpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfR2VuJiBfX2csIGZhbHNlX3R5cGUpOworCisgICAgICBfVUludFR5cGUgX01feDsKKyAgICB9OworCisgIC8qKgorICAgKiBUaGUgY2xhc3NpYyBNaW5pbXVtIFN0YW5kYXJkIHJhbmQwIG9mIExld2lzLCBHb29kbWFuLCBhbmQgTWlsbGVyLgorICAgKi8KKyAgdHlwZWRlZiBsaW5lYXJfY29uZ3J1ZW50aWFsPHVuc2lnbmVkIGxvbmcsIDE2ODA3LCAwLCAyMTQ3NDgzNjQ3PiBtaW5zdGRfcmFuZDA7CisKKyAgLyoqCisgICAqIEFuIGFsdGVybmF0aXZlIExDUiAoTGVobWVyIEdlbmVyYXRvciBmdW5jdGlvbikgLgorICAgKi8KKyAgdHlwZWRlZiBsaW5lYXJfY29uZ3J1ZW50aWFsPHVuc2lnbmVkIGxvbmcsIDQ4MjcxLCAwLCAyMTQ3NDgzNjQ3PiBtaW5zdGRfcmFuZDsKKworCisgIC8qKgorICAgKiBBIGdlbmVyYWxpemVkIGZlZWRiYWNrIHNoaWZ0IHJlZ2lzdGVyIGRpc2NyZXRlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgKgorICAgKiBUaGlzIGFsZ29yaXRobSBhdm9pZHMgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIGFuZCBpcyBkZXNpZ25lZCB0byBiZQorICAgKiBmcmllbmRseSB0byBhIHBpcGVsaW5lZCBhcmNoaXRlY3R1cmUuICBJZiB0aGUgcGFyYW1ldGVycyBhcmUgY2hvc2VuCisgICAqIGNvcnJlY3RseSwgdGhpcyBnZW5lcmF0b3Igd2lsbCBwcm9kdWNlIG51bWJlcnMgd2l0aCBhIHZlcnkgbG9uZyBwZXJpb2QgYW5kCisgICAqIGZhaXJseSBnb29kIGFwcGFyZW50IGVudHJvcHksIGFsdGhvdWdoIHN0aWxsIG5vdCBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcuCisgICAqCisgICAqIFRoZSBiZXN0IHdheSB0byB1c2UgdGhpcyBnZW5lcmF0b3IgaXMgd2l0aCB0aGUgcHJlZGVmaW5lZCBtdDE5OTM3IGNsYXNzLgorICAgKgorICAgKiBUaGlzIGFsZ29yaXRobSB3YXMgb3JpZ2luYWxseSBpbnZlbnRlZCBieSBNYWtvdG8gTWF0c3Vtb3RvIGFuZAorICAgKiBUYWt1amkgTmlzaGltdXJhLgorICAgKgorICAgKiBAdmFyIHdvcmRfc2l6ZSAgIFRoZSBudW1iZXIgb2YgYml0cyBpbiBlYWNoIGVsZW1lbnQgb2YgdGhlIHN0YXRlIHZlY3Rvci4KKyAgICogQHZhciBzdGF0ZV9zaXplICBUaGUgZGVncmVlIG9mIHJlY3Vyc2lvbi4KKyAgICogQHZhciBzaGlmdF9zaXplICBUaGUgcGVyaW9kIHBhcmFtZXRlci4KKyAgICogQHZhciBtYXNrX2JpdHMgICBUaGUgc2VwYXJhdGlvbiBwb2ludCBiaXQgaW5kZXguCisgICAqIEB2YXIgcGFyYW1ldGVyX2EgVGhlIGxhc3Qgcm93IG9mIHRoZSB0d2lzdCBtYXRyaXguCisgICAqIEB2YXIgb3V0cHV0X3UgICAgVGhlIGZpcnN0IHJpZ2h0LXNoaWZ0IHRlbXBlcmluZyBtYXRyaXggcGFyYW1ldGVyLgorICAgKiBAdmFyIG91dHB1dF9zICAgIFRoZSBmaXJzdCBsZWZ0LXNoaWZ0IHRlbXBlcmluZyBtYXRyaXggcGFyYW1ldGVyLgorICAgKiBAdmFyIG91dHB1dF9iICAgIFRoZSBmaXJzdCBsZWZ0LXNoaWZ0IHRlbXBlcmluZyBtYXRyaXggbWFzay4KKyAgICogQHZhciBvdXRwdXRfdCAgICBUaGUgc2Vjb25kIGxlZnQtc2hpZnQgdGVtcGVyaW5nIG1hdHJpeCBwYXJhbWV0ZXIuCisgICAqIEB2YXIgb3V0cHV0X2MgICAgVGhlIHNlY29uZCBsZWZ0LXNoaWZ0IHRlbXBlcmluZyBtYXRyaXggbWFzay4KKyAgICogQHZhciBvdXRwdXRfbCAgICBUaGUgc2Vjb25kIHJpZ2h0LXNoaWZ0IHRlbXBlcmluZyBtYXRyaXggcGFyYW1ldGVyLgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsIF9VSW50VHlwZSBfX2IsIGludCBfX3QsCisJICAgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjbGFzcyBtZXJzZW5uZV90d2lzdGVyCisgICAgeworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9VSW50VHlwZSwgX1Vuc2lnbmVkSW50ZWdlckNvbmNlcHQpCisKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlcworICAgICAgdHlwZWRlZiBfVUludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8vIHBhcmFtZXRlciB2YWx1ZXMKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgd29yZF9zaXplICAgPSBfX3c7CisgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgIHN0YXRlX3NpemUgID0gX19uOworICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICBzaGlmdF9zaXplICA9IF9fbTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgbWFza19iaXRzICAgPSBfX3I7CisgICAgICBzdGF0aWMgY29uc3QgX1VJbnRUeXBlIHBhcmFtZXRlcl9hID0gX19hOworICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICBvdXRwdXRfdSAgICA9IF9fdTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgb3V0cHV0X3MgICAgPSBfX3M7CisgICAgICBzdGF0aWMgY29uc3QgX1VJbnRUeXBlIG91dHB1dF9iICAgID0gX19iOworICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICBvdXRwdXRfdCAgICA9IF9fdDsKKyAgICAgIHN0YXRpYyBjb25zdCBfVUludFR5cGUgb3V0cHV0X2MgICAgPSBfX2M7CisgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgIG91dHB1dF9sICAgID0gX19sOworCisgICAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIG1lbWJlciBmdW5jdGlvbgorICAgICAgbWVyc2VubmVfdHdpc3RlcigpCisgICAgICB7IHNlZWQoKTsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgbWVyc2VubmVfdHdpc3Rlcih1bnNpZ25lZCBsb25nIF9fdmFsdWUpCisgICAgICB7IHNlZWQoX192YWx1ZSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgbWVyc2VubmVfdHdpc3RlcihfR2VuJiBfX2cpCisgICAgICAgIHsgc2VlZChfX2cpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNlZWQoKQorICAgICAgeyBzZWVkKDU0ODlVTCk7IH0KKworICAgICAgdm9pZAorICAgICAgc2VlZCh1bnNpZ25lZCBsb25nIF9fdmFsdWUpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX0dlbiYgX19nKQorICAgICAgICB7IHNlZWQoX19nLCB0eXBlbmFtZSBpc19mdW5kYW1lbnRhbDxfR2VuPjo6dHlwZSgpKTsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIDA7IH07CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWUgLSAxOyB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKCk7CisKKyAgICAgIC8qKgorICAgICAgICogQ29tcGFyZXMgdHdvICUgbWVyc2VubmVfdHdpc3RlciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3RzIG9mCisgICAgICAgKiB0aGUgc2FtZSB0eXBlIGZvciBlcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAlIG1lcnNlbm5lX3R3aXN0ZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJSBtZXJzZW5uZV90d2lzdGVyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBtZXJzZW5uZV90d2lzdGVyJiBfX2xocywKKwkJIGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXImIF9fcmhzKQorICAgICAgeyByZXR1cm4gc3RkOjplcXVhbChfX2xocy5fTV94LCBfX2xocy5fTV94ICsgc3RhdGVfc2l6ZSwgX19yaHMuX01feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gJSBtZXJzZW5uZV90d2lzdGVyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdHMgb2YKKyAgICAgICAqIHRoZSBzYW1lIHR5cGUgZm9yIGluZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJSBtZXJzZW5uZV90d2lzdGVyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICUgbWVyc2VubmVfdHdpc3RlciByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXImIF9fbGhzLAorCQkgY29uc3QgbWVyc2VubmVfdHdpc3RlciYgX19yaHMpCisgICAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEluc2VydHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIG1lcnNlbm5lX3R3aXN0ZXIgcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICUgbWVyc2VubmVfdHdpc3RlciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlMSwgaW50IF9fdzEsIGludCBfX24xLCBpbnQgX19tMSwgaW50IF9fcjEsCisJICAgICAgIF9VSW50VHlwZTEgX19hMSwgaW50IF9fdTEsIGludCBfX3MxLCBfVUludFR5cGUxIF9fYjEsIGludCBfX3QxLAorCSAgICAgICBfVUludFR5cGUxIF9fYzEsIGludCBfX2wxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUxLCBfX3cxLCBfX24xLCBfX20xLCBfX3IxLAorCQkgICBfX2ExLCBfX3UxLCBfX3MxLCBfX2IxLCBfX3QxLCBfX2MxLCBfX2wxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBFeHRyYWN0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICUgbWVyc2VubmVfdHdpc3RlciByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICUgbWVyc2VubmVfdHdpc3RlciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggZXh0cmFjdGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlMSwgaW50IF9fdzEsIGludCBfX24xLCBpbnQgX19tMSwgaW50IF9fcjEsCisJICAgICAgIF9VSW50VHlwZTEgX19hMSwgaW50IF9fdTEsIGludCBfX3MxLCBfVUludFR5cGUxIF9fYjEsIGludCBfX3QxLAorCSAgICAgICBfVUludFR5cGUxIF9fYzEsIGludCBfX2wxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUxLCBfX3cxLCBfX24xLCBfX20xLCBfX3IxLAorCQkgICBfX2ExLCBfX3UxLCBfX3MxLCBfX2IxLCBfX3QxLCBfX2MxLCBfX2wxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX0dlbiYgX19nLCB0cnVlX3R5cGUpCisgICAgICAgIHsgcmV0dXJuIHNlZWQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oX19nKSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9HZW4mIF9fZywgZmFsc2VfdHlwZSk7CisKKyAgICAgIF9VSW50VHlwZSBfTV94W3N0YXRlX3NpemVdOworICAgICAgaW50ICAgICAgIF9NX3A7CisgICAgfTsKKworICAvKioKKyAgICogVGhlIGNsYXNzaWMgTWVyc2VubmUgVHdpc3Rlci4KKyAgICoKKyAgICogUmVmZXJlbmNlOgorICAgKiBNLiBNYXRzdW1vdG8gYW5kIFQuIE5pc2hpbXVyYSwgTWVyc2VubmUgVHdpc3RlcjogQSA2MjMtRGltZW5zaW9uYWxseQorICAgKiBFcXVpZGlzdHJpYnV0ZWQgVW5pZm9ybSBQc2V1ZG8tUmFuZG9tIE51bWJlciBHZW5lcmF0b3IsIEFDTSBUcmFuc2FjdGlvbnMKKyAgICogb24gTW9kZWxpbmcgYW5kIENvbXB1dGVyIFNpbXVsYXRpb24sIFZvbC4gOCwgTm8uIDEsIEphbnVhcnkgMTk5OCwgcHAgMy0zMC4KKyAgICovCisgIHR5cGVkZWYgbWVyc2VubmVfdHdpc3RlcjwKKyAgICB1bnNpZ25lZCBsb25nLCAzMiwgNjI0LCAzOTcsIDMxLAorICAgIDB4OTkwOGIwZGZ1bCwgMTEsIDcsCisgICAgMHg5ZDJjNTY4MHVsLCAxNSwKKyAgICAweGVmYzYwMDAwdWwsIDE4CisgICAgPiBtdDE5OTM3OworCisKKyAgLyoqCisgICAqIEBicmllZiBUaGUgTWFyc2FnbGlhLVphbWFuIGdlbmVyYXRvci4KKyAgICogCisgICAqIFRoaXMgaXMgYSBtb2RlbCBvZiBhIEdlbmVyYWxpemVkIEZpYm9uYWNjaSBkaXNjcmV0ZSByYW5kb20gbnVtYmVyCisgICAqIGdlbmVyYXRvciwgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHRoZSBTV0MgZ2VuZXJhdG9yLgorICAgKgorICAgKiBBIGRpc2NyZXRlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRoYXQgcHJvZHVjZXMgcHNldWRvcmFuZG9tCisgICAqIG51bWJlcnMgdXNpbmcgQGYkeF97aX1cbGVmdGFycm93KHhfe2kgLSBzfSAtIHhfe2kgLSByfSAtCisgICAqIGNhcnJ5X3tpLTF9KSBcYm1vZCBtIEBmJC4KKyAgICoKKyAgICogVGhlIHNpemUgb2YgdGhlIHN0YXRlIGlzIEBmJCByIEBmJAorICAgKiBhbmQgdGhlIG1heGltdW0gcGVyaW9kIG9mIHRoZSBnZW5lcmF0b3IgaXMgQGYkIG1eciAtIG1ecyAtMSBAZiQuCisgICAqCisgICAqIE4xNjg4WzQuMTNdIHNheXMgPGVtPnRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgX0ludFR5cGUgc2hhbGwgZGVub3RlCisgICAqIGFuIGludGVncmFsIHR5cGUgbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIHZhbHVlcyB1cCB0byBtPC9lbT4uCisgICAqCisgICAqIEB2YXIgX01feCAgICAgVGhlIHN0YXRlIG9mIHRoZSBnZW5lcmF0b3IuICBUaGlzIGlzIGEgcmluZyBidWZmZXIuCisgICAqIEB2YXIgX01fY2FycnkgVGhlIGNhcnJ5LgorICAgKiBAdmFyIF9NX3AgICAgIEN1cnJlbnQgaW5kZXggb2YgeChpIC0gcikuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgX0ludFR5cGUgX19tLCBpbnQgX19zLCBpbnQgX19yPgorICAgIGNsYXNzIHN1YnRyYWN0X3dpdGhfY2FycnkKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX0ludFR5cGUsIF9JbnRlZ2VyQ29uY2VwdCkKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgX0ludFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAKKyAgICAgIC8vIHBhcmFtZXRlciB2YWx1ZXMKKyAgICAgIHN0YXRpYyBjb25zdCBfSW50VHlwZSBtb2R1bHVzICAgPSBfX207CisgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgbG9uZ19sYWcgID0gX19yOworICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgIHNob3J0X2xhZyA9IF9fczsKKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgZGVmYXVsdC1pbml0aWFsaXplZCAlIHN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yLgorICAgICAgICovCisgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5KCkKKyAgICAgIHsgdGhpcy0+c2VlZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhbiBleHBsaWNpdGx5IHNlZWRlZCAlIHN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgc3VidHJhY3Rfd2l0aF9jYXJyeSh1bnNpZ25lZCBsb25nIF9fdmFsdWUpCisgICAgICB7IHRoaXMtPnNlZWQoX192YWx1ZSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgJXN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lCisgICAgICAgKiBzZWVkZWQgZnJvbSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIEBwIF9fZy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19nIFRoZSBzZWVkIGdlbmVyYXRvciBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgc3VidHJhY3Rfd2l0aF9jYXJyeShfR2VuJiBfX2cpCisgICAgICAgIHsgdGhpcy0+c2VlZChfX2cpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogU2VlZHMgdGhlIGluaXRpYWwgc3RhdGUgQGYkIHhfMCBAZiQgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqIE4xNjg4WzQuMTldIG1vZGlmaWVzIHRoaXMgYXMgZm9sbG93cy4gIElmIEBwIF9fdmFsdWUgPT0gMCwKKyAgICAgICAqIHNldHMgdmFsdWUgdG8gMTk3ODA1MDMuICBJbiBhbnkgY2FzZSwgd2l0aCBhIGxpbmVhcgorICAgICAgICogY29uZ3J1ZW50aWFsIGdlbmVyYXRvciBsY2coaSkgaGF2aW5nIHBhcmFtZXRlcnMgQGYkIG1fe2xjZ30gPQorICAgICAgICogMjE0NzQ4MzU2MywgYV97bGNnfSA9IDQwMDE0LCBjX3tsY2d9ID0gMCwgYW5kIGxjZygwKSA9IHZhbHVlCisgICAgICAgKiBAZiQsIHNldHMgQGYkIHhfey1yfSBcZG90cyB4X3stMX0gQGYkIHRvIEBmJCBsY2coMSkgXGJtb2QgbQorICAgICAgICogXGRvdHMgbGNnKHIpIFxibW9kIG0gQGYkIHJlc3BlY3RpdmVseS4gIElmIEBmJCB4X3stMX0gPSAwIEBmJAorICAgICAgICogc2V0IGNhcnJ5IHRvIDEsIG90aGVyd2lzZSBzZXRzIGNhcnJ5IHRvIDAuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNlZWQodW5zaWduZWQgbG9uZyBfX3ZhbHVlID0gMTk3ODA1MDMpOworCisgICAgICAvKioKKyAgICAgICAqIFNlZWRzIHRoZSBpbml0aWFsIHN0YXRlIEBmJCB4XzAgQGYkIG9mIHRoZSAlIHN1YnRyYWN0X3dpdGhfY2FycnkKKyAgICAgICAqIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX0dlbiYgX19nKQorICAgICAgICB7IHNlZWQoX19nLCB0eXBlbmFtZSBpc19mdW5kYW1lbnRhbDxfR2VuPjo6dHlwZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIGluY2x1c2l2ZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSByYW5nZSBvZiByYW5kb20gaW50ZWdlcnMKKyAgICAgICAqIHJldHVybmVkIGJ5IHRoaXMgZ2VuZXJhdG9yLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBpbmNsdXNpdmUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2Ugb2YgcmFuZG9tIGludGVnZXJzCisgICAgICAgKiByZXR1cm5lZCBieSB0aGlzIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5tb2R1bHVzIC0gMTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG5leHQgcmFuZG9tIG51bWJlciBpbiB0aGUgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKCk7CisKKyAgICAgIC8qKgorICAgICAgICogQ29tcGFyZXMgdHdvICUgc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3RzIG9mCisgICAgICAgKiB0aGUgc2FtZSB0eXBlIGZvciBlcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAlIHN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5JiBfX2xocywKKwkJIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnkmIF9fcmhzKQorICAgICAgeyByZXR1cm4gc3RkOjplcXVhbChfX2xocy5fTV94LCBfX2xocy5fTV94ICsgbG9uZ19sYWcsIF9fcmhzLl9NX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29tcGFyZXMgdHdvICUgc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3RzIG9mCisgICAgICAgKiB0aGUgc2FtZSB0eXBlIGZvciBpbmVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICUgc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlIHN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5JiBfX2xocywKKwkJIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnkmIF9fcmhzKQorICAgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBJbnNlcnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlIHN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgX0ludFR5cGUxIF9fbTEsIGludCBfX3MxLCBpbnQgX19yMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2Fycnk8X0ludFR5cGUxLCBfX20xLCBfX3MxLAorCQkgICBfX3IxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBFeHRyYWN0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICUgc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICUgc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggZXh0cmFjdGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCBfSW50VHlwZTEgX19tMSwgaW50IF9fczEsIGludCBfX3IxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3VidHJhY3Rfd2l0aF9jYXJyeTxfSW50VHlwZTEsIF9fbTEsIF9fczEsIF9fcjE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfR2VuJiBfX2csIHRydWVfdHlwZSkKKyAgICAgICAgeyByZXR1cm4gc2VlZChzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihfX2cpKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX0dlbiYgX19nLCBmYWxzZV90eXBlKTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fYWRkX3Vuc2lnbmVkPF9JbnRUeXBlPjo6X190eXBlIF9VSW50VHlwZTsKKworICAgICAgX1VJbnRUeXBlICBfTV94W2xvbmdfbGFnXTsKKyAgICAgIF9VSW50VHlwZSAgX01fY2Fycnk7CisgICAgICBpbnQgICAgICAgIF9NX3A7CisgICAgfTsKKworCisgIC8qKgorICAgKiBAYnJpZWYgVGhlIE1hcnNhZ2xpYS1aYW1hbiBnZW5lcmF0b3IgKGZsb2F0cyB2ZXJzaW9uKS4KKyAgICoKKyAgICogQHZhciBfTV94ICAgICBUaGUgc3RhdGUgb2YgdGhlIGdlbmVyYXRvci4gIFRoaXMgaXMgYSByaW5nIGJ1ZmZlci4KKyAgICogQHZhciBfTV9jYXJyeSBUaGUgY2FycnkuCisgICAqIEB2YXIgX01fcCAgICAgQ3VycmVudCBpbmRleCBvZiB4KGkgLSByKS4KKyAgICogQHZhciBfTV9ucG93cyBQcmVjb21wdXRlZCBuZWdhdGl2ZSBwb3dlcnMgb2YgMi4gICAKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgaW50IF9fdywgaW50IF9fcywgaW50IF9fcj4KKyAgICBjbGFzcyBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgCisgICAgICAvLyBwYXJhbWV0ZXIgdmFsdWVzCisgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgd29yZF9zaXplID0gX193OworICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgIGxvbmdfbGFnICA9IF9fcjsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICBzaG9ydF9sYWcgPSBfX3M7CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhIGRlZmF1bHQtaW5pdGlhbGl6ZWQgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIHJhbmRvbQorICAgICAgICogbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSgpCisgICAgICB7CisJdGhpcy0+c2VlZCgpOworCV9NX2luaXRpYWxpemVfbnBvd3MoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4cGxpY2l0bHkgc2VlZGVkICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxKHVuc2lnbmVkIGxvbmcgX192YWx1ZSkKKyAgICAgIHsKKwl0aGlzLT5zZWVkKF9fdmFsdWUpOworCV9NX2luaXRpYWxpemVfbnBvd3MoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZQorICAgICAgICogc2VlZGVkIGZyb20gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBAcCBfX2cuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fZyBUaGUgc2VlZCBnZW5lcmF0b3IgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEoX0dlbiYgX19nKQorICAgICAgICB7CisJICB0aGlzLT5zZWVkKF9fZyk7CisJICBfTV9pbml0aWFsaXplX25wb3dzKCk7CSAgCisJfQorCisgICAgICAvKioKKyAgICAgICAqIFNlZWRzIHRoZSBpbml0aWFsIHN0YXRlIEBmJCB4XzAgQGYkIG9mIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZCh1bnNpZ25lZCBsb25nIF9fdmFsdWUgPSAxOTc4MDUwMyk7CisKKyAgICAgIC8qKgorICAgICAgICogU2VlZHMgdGhlIGluaXRpYWwgc3RhdGUgQGYkIHhfMCBAZiQgb2YgdGhlICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMQorICAgICAgICogcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfR2VuJiBfX2cpCisgICAgICAgIHsgc2VlZChfX2csIHR5cGVuYW1lIGlzX2Z1bmRhbWVudGFsPF9HZW4+Ojp0eXBlKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2Ugb2YgcmFuZG9tIGZsb2F0cworICAgICAgICogcmV0dXJuZWQgYnkgdGhpcyBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gMC4wOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2Ugb2YgcmFuZG9tIGZsb2F0cworICAgICAgICogcmV0dXJuZWQgYnkgdGhpcyBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gMS4wOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbmV4dCByYW5kb20gbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKTsKKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdHMKKyAgICAgICAqIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgICAgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSYgX19saHMsCisJCSBjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxJiBfX3JocykKKyAgICAgIHsKKwlmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBsb25nX2xhZzsgKytfX2kpCisJICBpZiAoIXN0ZDo6ZXF1YWwoX19saHMuX01feFtfX2ldLCBfX2xocy5fTV94W19faV0gKyBfX24sCisJCQkgIF9fcmhzLl9NX3hbX19pXSkpCisJICAgIHJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdHMKKyAgICAgICAqIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGluZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgICBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfMDEmIF9fbGhzLAorCQkgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSYgX19yaHMpCisgICAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEluc2VydHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEgcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgaW50IF9fdzEsIGludCBfX3MxLCBpbnQgX19yMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8X1JlYWxUeXBlMSwgX193MSwgX19zMSwKKwkJICAgX19yMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogRXh0cmFjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEgcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGV4dHJhY3RlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIGludCBfX3cxLCBpbnQgX19zMSwgaW50IF9fcjEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPF9SZWFsVHlwZTEsIF9fdzEsIF9fczEsIF9fcjE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfR2VuJiBfX2csIHRydWVfdHlwZSkKKyAgICAgICAgeyByZXR1cm4gc2VlZChzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihfX2cpKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX0dlbiYgX19nLCBmYWxzZV90eXBlKTsKKworICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZV9ucG93cygpOworCisgICAgICBzdGF0aWMgY29uc3QgaW50IF9fbiA9IChfX3cgKyAzMSkgLyAzMjsKKworICAgICAgdHlwZWRlZiBfX2RldGFpbDo6X1VJbnQzMlR5cGUgX1VJbnQzMlR5cGU7CisgICAgICBfVUludDMyVHlwZSAgX01feFtsb25nX2xhZ11bX19uXTsKKyAgICAgIF9SZWFsVHlwZSAgICBfTV9ucG93c1tfX25dOworICAgICAgX1VJbnQzMlR5cGUgIF9NX2NhcnJ5OworICAgICAgaW50ICAgICAgICAgIF9NX3A7CisgICAgfTsKKworICB0eXBlZGVmIHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8ZmxvYXQsIDI0LCAxMCwgMjQ+ICAgcmFubHV4X2Jhc2VfMDE7CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyA1MDguIEJhZCBwYXJhbWV0ZXJzIGZvciByYW5sdXg2NF9iYXNlXzAxLgorICB0eXBlZGVmIHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8ZG91YmxlLCA0OCwgNSwgMTI+IHJhbmx1eDY0X2Jhc2VfMDE7ICAKKworCisgIC8qKgorICAgKiBQcm9kdWNlcyByYW5kb20gbnVtYmVycyBmcm9tIHNvbWUgYmFzZSBlbmdpbmUgYnkgZGlzY2FyZGluZyBibG9ja3Mgb2YKKyAgICogZGF0YS4KKyAgICoKKyAgICogMCA8PSBAcCBfX3IgPD0gQHAgX19wCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgaW50IF9fcCwgaW50IF9fcj4KKyAgICBjbGFzcyBkaXNjYXJkX2Jsb2NrCisgICAgeworICAgICAgLy8gX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKHR5cGVuYW1lIGJhc2VfdHlwZTo6cmVzdWx0X3R5cGUsCisgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJpdGhtZXRpY1R5cGVDb25jZXB0KQorCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nIGdlbmVyYXRvciBlbmdpbmUuICovCisgICAgICB0eXBlZGVmIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yICAgYmFzZV90eXBlOworICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIHZhbHVlLiAqLworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworCisgICAgICAvLyBwYXJhbWV0ZXIgdmFsdWVzCisgICAgICBzdGF0aWMgY29uc3QgaW50IGJsb2NrX3NpemUgPSBfX3A7CisgICAgICBzdGF0aWMgY29uc3QgaW50IHVzZWRfYmxvY2sgPSBfX3I7CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhIGRlZmF1bHQgJWRpc2NhcmRfYmxvY2sgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIFRoZSB1bmRlcmx5aW5nIGVuZ2luZSBpcyBkZWZhdWx0IGNvbnN0cnVjdGVkIGFzIHdlbGwuCisgICAgICAgKi8KKyAgICAgIGRpc2NhcmRfYmxvY2soKQorICAgICAgOiBfTV9uKDApIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIENvcHkgY29uc3RydWN0cyBhICVkaXNjYXJkX2Jsb2NrIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBDb3BpZXMgYW4gZXhpc3RpbmcgYmFzZSBjbGFzcyByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqIEBwYXJhbSBybmcgQW4gZXhpc3RpbmcgKGJhc2UgY2xhc3MpIGVuZ2luZSBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBkaXNjYXJkX2Jsb2NrKGNvbnN0IGJhc2VfdHlwZSYgX19ybmcpCisgICAgICA6IF9NX2IoX19ybmcpLCBfTV9uKDApIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIFNlZWQgY29uc3RydWN0cyBhICVkaXNjYXJkX2Jsb2NrIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBDb25zdHJ1Y3RzIHRoZSB1bmRlcmx5aW5nIGdlbmVyYXRvciBlbmdpbmUgc2VlZGVkIHdpdGggQHAgX19zLgorICAgICAgICogQHBhcmFtIF9fcyBBIHNlZWQgdmFsdWUgZm9yIHRoZSBiYXNlIGNsYXNzIGVuZ2luZS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGRpc2NhcmRfYmxvY2sodW5zaWduZWQgbG9uZyBfX3MpCisgICAgICA6IF9NX2IoX19zKSwgX01fbigwKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZW5lcmF0b3IgY29uc3RydWN0IGEgJWRpc2NhcmRfYmxvY2sgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2cgQSBzZWVkIGdlbmVyYXRvciBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgZGlzY2FyZF9ibG9jayhfR2VuJiBfX2cpCisJOiBfTV9iKF9fZyksIF9NX24oMCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogUmVzZWVkcyB0aGUgJWRpc2NhcmRfYmxvY2sgb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQgc2VlZCBmb3IgdGhlCisgICAgICAgKiB1bmRlcmx5aW5nIGJhc2UgY2xhc3MgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqLworICAgICAgdm9pZCBzZWVkKCkKKyAgICAgIHsKKwlfTV9iLnNlZWQoKTsKKwlfTV9uID0gMDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBSZXNlZWRzIHRoZSAlZGlzY2FyZF9ibG9jayBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gc2VlZCBnZW5lcmF0b3IKKyAgICAgICAqIGZ1bmN0aW9uLgorICAgICAgICogQHBhcmFtIF9fZyBBIHNlZWQgZ2VuZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkIHNlZWQoX0dlbiYgX19nKQorICAgICAgICB7CisJICBfTV9iLnNlZWQoX19nKTsKKwkgIF9NX24gPSAwOworCX0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIGdlbmVyYXRvciBlbmdpbmUgb2JqZWN0LgorICAgICAgICovCisgICAgICBjb25zdCBiYXNlX3R5cGUmCisgICAgICBiYXNlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2I7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlciByYW5nZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9iLm1pbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbWF4aW11bSB2YWx1ZSBpbiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYi5tYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpOworCisgICAgICAvKioKKyAgICAgICAqIENvbXBhcmVzIHR3byAlZGlzY2FyZF9ibG9jayByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3RzIG9mCisgICAgICAgKiB0aGUgc2FtZSB0eXBlIGZvciBlcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAlZGlzY2FyZF9ibG9jayByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlZGlzY2FyZF9ibG9jayByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgZGlzY2FyZF9ibG9jayYgX19saHMsIGNvbnN0IGRpc2NhcmRfYmxvY2smIF9fcmhzKQorICAgICAgeyByZXR1cm4gKF9fbGhzLl9NX2IgPT0gX19yaHMuX01fYikgJiYgKF9fbGhzLl9NX24gPT0gX19yaHMuX01fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gJWRpc2NhcmRfYmxvY2sgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0cyBvZgorICAgICAgICogdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAlZGlzY2FyZF9ibG9jayByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlZGlzY2FyZF9ibG9jayByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IGRpc2NhcmRfYmxvY2smIF9fbGhzLCBjb25zdCBkaXNjYXJkX2Jsb2NrJiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogSW5zZXJ0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICVkaXNjYXJkX2Jsb2NrIHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlZGlzY2FyZF9ibG9jayByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxLCBpbnQgX19wMSwgaW50IF9fcjEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBkaXNjYXJkX2Jsb2NrPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwKKwkJICAgX19wMSwgX19yMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogRXh0cmFjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIHN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlZGlzY2FyZF9ibG9jayByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggZXh0cmFjdGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxLCBpbnQgX19wMSwgaW50IF9fcjEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBkaXNjYXJkX2Jsb2NrPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwKKwkJICAgX19wMSwgX19yMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgYmFzZV90eXBlIF9NX2I7CisgICAgICBpbnQgICAgICAgX01fbjsKKyAgICB9OworCisKKyAgLyoqCisgICAqIEphbWVzJ3MgbHV4dXJ5LWxldmVsLTMgaW50ZWdlciBhZGFwdGF0aW9uIG9mIEx1ZXNjaGVyJ3MgZ2VuZXJhdG9yLgorICAgKi8KKyAgdHlwZWRlZiBkaXNjYXJkX2Jsb2NrPAorICAgIHN1YnRyYWN0X3dpdGhfY2Fycnk8dW5zaWduZWQgbG9uZywgKDFVTCA8PCAyNCksIDEwLCAyND4sCisgICAgICAyMjMsCisgICAgICAyNAorICAgICAgPiByYW5sdXgzOworCisgIC8qKgorICAgKiBKYW1lcydzIGx1eHVyeS1sZXZlbC00IGludGVnZXIgYWRhcHRhdGlvbiBvZiBMdWVzY2hlcidzIGdlbmVyYXRvci4KKyAgICovCisgIHR5cGVkZWYgZGlzY2FyZF9ibG9jazwKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5PHVuc2lnbmVkIGxvbmcsICgxVUwgPDwgMjQpLCAxMCwgMjQ+LAorICAgICAgMzg5LAorICAgICAgMjQKKyAgICAgID4gcmFubHV4NDsKKworICB0eXBlZGVmIGRpc2NhcmRfYmxvY2s8CisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxmbG9hdCwgMjQsIDEwLCAyND4sCisgICAgICAyMjMsCisgICAgICAyNAorICAgICAgPiByYW5sdXgzXzAxOworCisgIHR5cGVkZWYgZGlzY2FyZF9ibG9jazwKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPGZsb2F0LCAyNCwgMTAsIDI0PiwKKyAgICAgIDM4OSwKKyAgICAgIDI0CisgICAgICA+IHJhbmx1eDRfMDE7CisKKworICAvKioKKyAgICogQSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBhZGFwdG9yIGNsYXNzIHRoYXQgY29tYmluZXMgdHdvIHJhbmRvbSBudW1iZXIKKyAgICogZ2VuZXJhdG9yIGVuZ2luZXMgaW50byBhIHNpbmdsZSBvdXRwdXQgc2VxdWVuY2UuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIGludCBfX3MxLAorCSAgIGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgaW50IF9fczI+CisgICAgY2xhc3MgeG9yX2NvbWJpbmUKKyAgICB7CisgICAgICAvLyBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXModHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxOjoKKyAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZSwgQXJpdGhtZXRpY1R5cGVDb25jZXB0KQorICAgICAgLy8gX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMjo6CisgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X3R5cGUsIEFyaXRobWV0aWNUeXBlQ29uY2VwdCkKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZmlyc3QgdW5kZXJseWluZyBnZW5lcmF0b3IgZW5naW5lLiAqLworICAgICAgdHlwZWRlZiBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEgICBiYXNlMV90eXBlOworICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgdW5kZXJseWluZyBnZW5lcmF0b3IgZW5naW5lLiAqLworICAgICAgdHlwZWRlZiBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIgICBiYXNlMl90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZTFfdHlwZTo6cmVzdWx0X3R5cGUgX1Jlc3VsdF90eXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZTJfdHlwZTo6cmVzdWx0X3R5cGUgX1Jlc3VsdF90eXBlMjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8KHNpemVvZihfUmVzdWx0X3R5cGUxKQorCQkJCQkJICAgICAgPiBzaXplb2YoX1Jlc3VsdF90eXBlMikpLAorCV9SZXN1bHRfdHlwZTEsIF9SZXN1bHRfdHlwZTI+OjpfX3R5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8vIHBhcmFtZXRlciB2YWx1ZXMKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgc2hpZnQxID0gX19zMTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgc2hpZnQyID0gX19zMjsKKworICAgICAgLy8gY29uc3RydWN0b3JzIGFuZCBtZW1iZXIgZnVuY3Rpb24KKyAgICAgIHhvcl9jb21iaW5lKCkKKyAgICAgIDogX01fYjEoKSwgX01fYjIoKQkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9tYXgoKTsgfQorCisgICAgICB4b3JfY29tYmluZShjb25zdCBiYXNlMV90eXBlJiBfX3JuZzEsIGNvbnN0IGJhc2UyX3R5cGUmIF9fcm5nMikKKyAgICAgIDogX01fYjEoX19ybmcxKSwgX01fYjIoX19ybmcyKQorICAgICAgeyBfTV9pbml0aWFsaXplX21heCgpOyB9CisKKyAgICAgIHhvcl9jb21iaW5lKHVuc2lnbmVkIGxvbmcgX19zKQorICAgICAgOiBfTV9iMShfX3MpLCBfTV9iMihfX3MgKyAxKQorICAgICAgeyBfTV9pbml0aWFsaXplX21heCgpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHhvcl9jb21iaW5lKF9HZW4mIF9fZykKKwk6IF9NX2IxKF9fZyksIF9NX2IyKF9fZykKKyAgICAgICAgeyBfTV9pbml0aWFsaXplX21heCgpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNlZWQoKQorICAgICAgeworCV9NX2IxLnNlZWQoKTsKKwlfTV9iMi5zZWVkKCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfR2VuJiBfX2cpCisgICAgICAgIHsKKwkgIF9NX2IxLnNlZWQoX19nKTsKKwkgIF9NX2IyLnNlZWQoX19nKTsKKwl9CisKKyAgICAgIGNvbnN0IGJhc2UxX3R5cGUmCisgICAgICBiYXNlMSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9iMTsgfQorCisgICAgICBjb25zdCBiYXNlMl90eXBlJgorICAgICAgYmFzZTIoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYjI7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiAwOyB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbWF4OyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbmV4dCByYW5kb20gbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgLy8gTkI6IE5vdCBleGFjdGx5IHRoZSBUUjEgZm9ybXVsYSwgcGVyIE4yMDc5IGluc3RlYWQuCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpCisgICAgICB7CisJcmV0dXJuICgocmVzdWx0X3R5cGUoX01fYjEoKSAtIF9NX2IxLm1pbigpKSA8PCBzaGlmdDEpCisJCV4gKHJlc3VsdF90eXBlKF9NX2IyKCkgLSBfTV9iMi5taW4oKSkgPDwgc2hpZnQyKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29tcGFyZXMgdHdvICV4b3JfY29tYmluZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3RzIG9mCisgICAgICAgKiB0aGUgc2FtZSB0eXBlIGZvciBlcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAleG9yX2NvbWJpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJXhvcl9jb21iaW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCB4b3JfY29tYmluZSYgX19saHMsIGNvbnN0IHhvcl9jb21iaW5lJiBfX3JocykKKyAgICAgIHsKKwlyZXR1cm4gKF9fbGhzLmJhc2UxKCkgPT0gX19yaHMuYmFzZTEoKSkKKwkgICAgICAgICYmIChfX2xocy5iYXNlMigpID09IF9fcmhzLmJhc2UyKCkpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbXBhcmVzIHR3byAleG9yX2NvbWJpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0cyBvZgorICAgICAgICogdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAleG9yX2NvbWJpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJXhvcl9jb21iaW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBub3QgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgeG9yX2NvbWJpbmUmIF9fbGhzLCBjb25zdCB4b3JfY29tYmluZSYgX19yaHMpCisgICAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEluc2VydHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAleG9yX2NvbWJpbmUgcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICV4b3JfY29tYmluZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxMSwgaW50IF9fczExLAorCSAgICAgICBjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIxLCBpbnQgX19zMjEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCB4b3JfY29tYmluZTxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjExLCBfX3MxMSwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyMSwgX19zMjE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEV4dHJhY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJXhvcl9jb21iaW5lIHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXhvcl9jb21iaW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjExLCBpbnQgX19zMTEsCisJICAgICAgIGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMjEsIGludCBfX3MyMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHhvcl9jb21iaW5lPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMTEsIF9fczExLAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIxLCBfX3MyMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZV9tYXgoKTsKKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIF9NX2luaXRpYWxpemVfbWF4X2F1eChyZXN1bHRfdHlwZSwgcmVzdWx0X3R5cGUsIGludCk7CisKKyAgICAgIGJhc2UxX3R5cGUgIF9NX2IxOworICAgICAgYmFzZTJfdHlwZSAgX01fYjI7CisgICAgICByZXN1bHRfdHlwZSBfTV9tYXg7CisgICAgfTsKKworCisgIC8qKgorICAgKiBBIHN0YW5kYXJkIGludGVyZmFjZSB0byBhIHBsYXRmb3JtLXNwZWNpZmljIG5vbi1kZXRlcm1pbmlzdGljCisgICAqIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIChpZiBhbnkgYXJlIGF2YWlsYWJsZSkuCisgICAqLworICBjbGFzcyByYW5kb21fZGV2aWNlCisgIHsKKyAgcHVibGljOgorICAgIC8vIHR5cGVzCisgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVzdWx0X3R5cGU7CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBtZW1iZXIgZnVuY3Rpb25zCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfUkFORE9NX1RSMQorCisgICAgZXhwbGljaXQKKyAgICByYW5kb21fZGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3Rva2VuID0gIi9kZXYvdXJhbmRvbSIpCisgICAgeworICAgICAgaWYgKChfX3Rva2VuICE9ICIvZGV2L3VyYW5kb20iICYmIF9fdG9rZW4gIT0gIi9kZXYvcmFuZG9tIikKKwkgIHx8ICEoX01fZmlsZSA9IHN0ZDo6Zm9wZW4oX190b2tlbi5jX3N0cigpLCAicmIiKSkpCisJc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJyYW5kb21fZGV2aWNlOjoiCisJCQkJICAgICAgICJyYW5kb21fZGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJikiKSk7CisgICAgfQorCisgICAgfnJhbmRvbV9kZXZpY2UoKQorICAgIHsgc3RkOjpmY2xvc2UoX01fZmlsZSk7IH0KKworI2Vsc2UKKworICAgIGV4cGxpY2l0CisgICAgcmFuZG9tX2RldmljZShjb25zdCBzdGQ6OnN0cmluZyYgX190b2tlbiA9ICJtdDE5OTM3IikKKyAgICA6IF9NX210KF9NX3N0cnRvdWwoX190b2tlbikpIHsgfQorCisgIHByaXZhdGU6CisgICAgc3RhdGljIHVuc2lnbmVkIGxvbmcKKyAgICBfTV9zdHJ0b3VsKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3N0cikKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIF9fcmV0ID0gNTQ4OVVMOworICAgICAgaWYgKF9fc3RyICE9ICJtdDE5OTM3IikKKwl7CisJICBjb25zdCBjaGFyKiBfX25wdHIgPSBfX3N0ci5jX3N0cigpOworCSAgY2hhciogX19lbmRwdHI7CisJICBfX3JldCA9IHN0ZDo6c3RydG91bChfX25wdHIsICZfX2VuZHB0ciwgMCk7CisJICBpZiAoKl9fbnB0ciA9PSAnXDAnIHx8ICpfX2VuZHB0ciAhPSAnXDAnKQorCSAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oInJhbmRvbV9kZXZpY2U6Ol9NX3N0cnRvdWwiCisJCQkJCSAgICIoY29uc3Qgc3RkOjpzdHJpbmcmKSIpKTsKKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHB1YmxpYzoKKworI2VuZGlmCisKKyAgICByZXN1bHRfdHlwZQorICAgIG1pbigpIGNvbnN0CisgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1pbigpOyB9CisKKyAgICByZXN1bHRfdHlwZQorICAgIG1heCgpIGNvbnN0CisgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICBkb3VibGUKKyAgICBlbnRyb3B5KCkgY29uc3QKKyAgICB7IHJldHVybiAwLjA7IH0KKworICAgIHJlc3VsdF90eXBlCisgICAgb3BlcmF0b3IoKSgpCisgICAgeworI2lmZGVmIF9HTElCQ1hYX1VTRV9SQU5ET01fVFIxCisgICAgICByZXN1bHRfdHlwZSBfX3JldDsKKyAgICAgIHN0ZDo6ZnJlYWQocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oJl9fcmV0KSwgc2l6ZW9mKHJlc3VsdF90eXBlKSwKKwkJIDEsIF9NX2ZpbGUpOworICAgICAgcmV0dXJuIF9fcmV0OworI2Vsc2UKKyAgICAgIHJldHVybiBfTV9tdCgpOworI2VuZGlmCisgICAgfQorCisgIHByaXZhdGU6CisgICAgcmFuZG9tX2RldmljZShjb25zdCByYW5kb21fZGV2aWNlJik7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgcmFuZG9tX2RldmljZSYpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1JBTkRPTV9UUjEKKyAgICBGSUxFKiAgICAgICAgX01fZmlsZTsKKyNlbHNlCisgICAgbXQxOTkzNyAgICAgIF9NX210OworI2VuZGlmCisgIH07CisKKyAgLyogQH0gKi8gLy8gZ3JvdXAgdHIxX3JhbmRvbV9nZW5lcmF0b3JzCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHRyMV9yYW5kb21fZGlzdHJpYnV0aW9ucyBSYW5kb20gTnVtYmVyIERpc3RyaWJ1dGlvbnMKKyAgICogQGluZ3JvdXAgdHIxX3JhbmRvbQorICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgdHIxX3JhbmRvbV9kaXN0cmlidXRpb25zX2Rpc2NyZXRlIERpc2NyZXRlIERpc3RyaWJ1dGlvbnMKKyAgICogQGluZ3JvdXAgdHIxX3JhbmRvbV9kaXN0cmlidXRpb25zCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiBAYnJpZWYgVW5pZm9ybSBkaXNjcmV0ZSBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKiBBIGRpc2NyZXRlIHJhbmRvbSBkaXN0cmlidXRpb24gb24gdGhlIHJhbmdlIEBmJFttaW4sIG1heF1AZiQgd2l0aCBlcXVhbAorICAgKiBwcm9iYWJpbGl0eSB0aHJvdWdob3V0IHRoZSByYW5nZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlID0gaW50PgorICAgIGNsYXNzIHVuaWZvcm1faW50CisgICAgeworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9JbnRUeXBlLCBfSW50ZWdlckNvbmNlcHQpCisgCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9JbnRUeXBlIGlucHV0X3R5cGU7CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9JbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgdW5pZm9ybV9pbnQoX0ludFR5cGUgX19taW4gPSAwLCBfSW50VHlwZSBfX21heCA9IDkpCisgICAgICA6IF9NX21pbihfX21pbiksIF9NX21heChfX21heCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fbWluIDw9IF9NX21heCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgaW5jbHVzaXZlIGxvd2VyIGJvdW5kIG9mIHRoZSBkaXN0cmlidXRpb24gcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbWluOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgaW5jbHVzaXZlIHVwcGVyIGJvdW5kIG9mIHRoZSBkaXN0cmlidXRpb24gcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbWF4OyB9CisKKyAgICAgIC8qKgorICAgICAgICogUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKgorICAgICAgICogRG9lcyBub3RoaW5nIGZvciB0aGUgdW5pZm9ybSBpbnRlZ2VyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIGEgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlCisgICAgICAgKiBAZiQobWluLCBtYXgpQGYkLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yOjpyZXN1bHRfdHlwZQorCSAgICBfVVJlc3VsdF90eXBlOworCSAgcmV0dXJuIF9NX2NhbGwoX191cm5nLCBfTV9taW4sIF9NX21heCwKKwkJCSB0eXBlbmFtZSBpc19pbnRlZ3JhbDxfVVJlc3VsdF90eXBlPjo6dHlwZSgpKTsKKwl9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyBhIHVuaWZvcm0gcmFuZG9tIG51bWJlciBpbiB0aGUgcmFuZ2UgQGYkWzAsIG4pQGYkLgorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWltZWQgYXQgdXNlIHdpdGggc3RkOjpyYW5kb21fc2h1ZmZsZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywgcmVzdWx0X3R5cGUgX19uKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yOjpyZXN1bHRfdHlwZQorCSAgICBfVVJlc3VsdF90eXBlOworCSAgcmV0dXJuIF9NX2NhbGwoX191cm5nLCAwLCBfX24gLSAxLAorCQkJIHR5cGVuYW1lIGlzX2ludGVncmFsPF9VUmVzdWx0X3R5cGU+Ojp0eXBlKCkpOworCX0KKworICAgICAgLyoqCisgICAgICAgKiBJbnNlcnRzIGEgJXVuaWZvcm1faW50IHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uIEBwIF9feCBpbnRvIHRoZQorICAgICAgICogb3V0cHV0IHN0cmVhbSBAcCBvcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAldW5pZm9ybV9pbnQgcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgdW5pZm9ybV9pbnQ8X0ludFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBFeHRyYWN0cyBhICV1bmlmb3JtX2ludCByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXVuaWZvcm1faW50IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgdW5pZm9ybV9pbnQ8X0ludFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgX01fY2FsbChfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQlyZXN1bHRfdHlwZSBfX21pbiwgcmVzdWx0X3R5cGUgX19tYXgsIHRydWVfdHlwZSk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBfTV9jYWxsKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCXJlc3VsdF90eXBlIF9fbWluLCByZXN1bHRfdHlwZSBfX21heCwgZmFsc2VfdHlwZSkKKyAgICAgICAgeworCSAgcmV0dXJuIHJlc3VsdF90eXBlKChfX3VybmcoKSAtIF9fdXJuZy5taW4oKSkKKwkJCSAgICAgLyAoX191cm5nLm1heCgpIC0gX191cm5nLm1pbigpKQorCQkJICAgICAqIChfX21heCAtIF9fbWluICsgMSkpICsgX19taW47CisJfQorCisgICAgICBfSW50VHlwZSBfTV9taW47CisgICAgICBfSW50VHlwZSBfTV9tYXg7CisgICAgfTsKKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBCZXJub3VsbGkgcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIEdlbmVyYXRlcyBhIHNlcXVlbmNlIG9mIHRydWUgYW5kIGZhbHNlIHZhbHVlcyB3aXRoIGxpa2VsaWhvb2QgQGYkIHAgQGYkCisgICAqIHRoYXQgdHJ1ZSB3aWxsIGNvbWUgdXAgYW5kIEBmJCAoMSAtIHApIEBmJCB0aGF0IGZhbHNlIHdpbGwgYXBwZWFyLgorICAgKi8KKyAgY2xhc3MgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbgorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGludCAgaW5wdXRfdHlwZTsKKyAgICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uIHdpdGggbGlrZWxpaG9vZCBAcCBwLgorICAgICAqCisgICAgICogQHBhcmFtIF9fcCAgW0lOXSAgVGhlIGxpa2VsaWhvb2Qgb2YgYSB0cnVlIHJlc3VsdCBiZWluZyByZXR1cm5lZC4gIE11c3QKKyAgICAgKiBiZSBpbiB0aGUgaW50ZXJ2YWwgQGYkIFswLCAxXSBAZiQuCisgICAgICovCisgICAgZXhwbGljaXQKKyAgICBiZXJub3VsbGlfZGlzdHJpYnV0aW9uKGRvdWJsZSBfX3AgPSAwLjUpCisgICAgOiBfTV9wKF9fcCkKKyAgICB7IAorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKChfTV9wID49IDAuMCkgJiYgKF9NX3AgPD0gMS4wKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgQHAgcCBwYXJhbWV0ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgKi8KKyAgICBkb3VibGUKKyAgICBwKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9wOyB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgKgorICAgICAqIERvZXMgbm90aGluZyBmb3IgYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uLgorICAgICAqLworICAgIHZvaWQKKyAgICByZXNldCgpIHsgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgQmVybm91bGxpYW4gc2VxdWVuY2UuCisgICAgICovCisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgeworCWlmICgoX191cm5nKCkgLSBfX3VybmcubWluKCkpIDwgX01fcCAqIChfX3VybmcubWF4KCkgLSBfX3VybmcubWluKCkpKQorCSAgcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0cyBhICViZXJub3VsbGlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICogQHBhcmFtIF9feCAgQSAlYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSBjb25zdCBiZXJub3VsbGlfZGlzdHJpYnV0aW9uJiBfX3gpOworCisgICAgLyoqCisgICAgICogRXh0cmFjdHMgYSAlYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gX194ICBBICViZXJub3VsbGlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgKgorICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSBiZXJub3VsbGlfZGlzdHJpYnV0aW9uJiBfX3gpCisgICAgICB7IHJldHVybiBfX2lzID4+IF9feC5fTV9wOyB9CisKKyAgcHJpdmF0ZToKKyAgICBkb3VibGUgX01fcDsKKyAgfTsKKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBkaXNjcmV0ZSBnZW9tZXRyaWMgcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgZ2VvbWV0cmljIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMgCisgICAqIEBmJCBwKGkpID0gKDEgLSBwKXBee2ktMX0gQGYkIHdoZXJlIEBmJCBwIEBmJCBpcyB0aGUgcGFyYW1ldGVyIG9mIHRoZQorICAgKiBkaXN0cmlidXRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSA9IGludCwgdHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIGdlb21ldHJpY19kaXN0cmlidXRpb24KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXMKKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIGlucHV0X3R5cGU7CisgICAgICB0eXBlZGVmIF9JbnRUeXBlICByZXN1bHRfdHlwZTsKKworICAgICAgLy8gY29uc3RydWN0b3JzIGFuZCBtZW1iZXIgZnVuY3Rpb24KKyAgICAgIGV4cGxpY2l0CisgICAgICBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uKGNvbnN0IF9SZWFsVHlwZSYgX19wID0gX1JlYWxUeXBlKDAuNSkpCisgICAgICA6IF9NX3AoX19wKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVCgoX01fcCA+IDAuMCkgJiYgKF9NX3AgPCAxLjApKTsKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgZGlzdHJpYnV0aW9uIHBhcmFtZXRlciBAcCBwLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIHAoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcDsgfQorCisgICAgICB2b2lkCisgICAgICByZXNldCgpIHsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKTsKKworICAgICAgLyoqCisgICAgICAgKiBJbnNlcnRzIGEgJWdlb21ldHJpY19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWdlb21ldHJpY19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCB0eXBlbmFtZSBfUmVhbFR5cGUxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTEsIF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEV4dHJhY3RzIGEgJWdlb21ldHJpY19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVnZW9tZXRyaWNfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIGdlb21ldHJpY19kaXN0cmlidXRpb24mIF9feCkKKyAgICAgICAgeworCSAgX19pcyA+PiBfX3guX01fcDsKKwkgIF9feC5fTV9pbml0aWFsaXplKCk7CisJICByZXR1cm4gX19pczsKKwl9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZSgpCisgICAgICB7IF9NX2xvZ19wID0gc3RkOjpsb2coX01fcCk7IH0KKworICAgICAgX1JlYWxUeXBlIF9NX3A7CisgICAgICBfUmVhbFR5cGUgX01fbG9nX3A7CisgICAgfTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBjbGFzcyBub3JtYWxfZGlzdHJpYnV0aW9uOworCisgIC8qKgorICAgKiBAYnJpZWYgQSBkaXNjcmV0ZSBQb2lzc29uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIFBvaXNzb24gcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcworICAgKiBAZiQgcChpKSA9IFxmcmFje21lYW5eaX17aSF9IGVeey1tZWFufSBAZiQgd2hlcmUgQGYkIG1lYW4gQGYkIGlzIHRoZQorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlID0gaW50LCB0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgcG9pc3Nvbl9kaXN0cmlidXRpb24KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXMKKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIGlucHV0X3R5cGU7CisgICAgICB0eXBlZGVmIF9JbnRUeXBlICByZXN1bHRfdHlwZTsKKworICAgICAgLy8gY29uc3RydWN0b3JzIGFuZCBtZW1iZXIgZnVuY3Rpb24KKyAgICAgIGV4cGxpY2l0CisgICAgICBwb2lzc29uX2Rpc3RyaWJ1dGlvbihjb25zdCBfUmVhbFR5cGUmIF9fbWVhbiA9IF9SZWFsVHlwZSgxKSkKKyAgICAgIDogX01fbWVhbihfX21lYW4pLCBfTV9uZCgpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX21lYW4gPiAwLjApOworCV9NX2luaXRpYWxpemUoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBkaXN0cmlidXRpb24gcGFyYW1ldGVyIEBwIG1lYW4uCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgbWVhbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9tZWFuOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fbmQucmVzZXQoKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKTsKKworICAgICAgLyoqCisgICAgICAgKiBJbnNlcnRzIGEgJXBvaXNzb25fZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVwb2lzc29uX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9SZWFsVHlwZTEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTEsIF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEV4dHJhY3RzIGEgJXBvaXNzb25fZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlcG9pc3Nvbl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9SZWFsVHlwZTEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTEsIF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemUoKTsKKworICAgICAgLy8gTkI6IFVudXNlZCB3aGVuIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEgaXMgdW5kZWZpbmVkLgorICAgICAgbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IF9NX25kOworCisgICAgICBfUmVhbFR5cGUgX01fbWVhbjsKKworICAgICAgLy8gSG9zdHMgZWl0aGVyIGxvZyhtZWFuKSBvciB0aGUgdGhyZXNob2xkIG9mIHRoZSBzaW1wbGUgbWV0aG9kLgorICAgICAgX1JlYWxUeXBlIF9NX2xtX3RocjsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBfUmVhbFR5cGUgX01fbGZtLCBfTV9zbSwgX01fZCwgX01fc2N4LCBfTV8xY3gsIF9NX2MyYiwgX01fY2I7CisjZW5kaWYKKyAgICB9OworCisKKyAgLyoqCisgICAqIEBicmllZiBBIGRpc2NyZXRlIGJpbm9taWFsIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIGJpbm9taWFsIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMgCisgICAqIEBmJCBwKGkpID0gXGJpbm9te259e2l9IHBeaSAoMSAtIHApXnt0IC0gaX0gQGYkIHdoZXJlIEBmJCB0IEBmJAorICAgKiBhbmQgQGYkIHAgQGYkIGFyZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUgPSBpbnQsIHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBiaW5vbWlhbF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXMKKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIGlucHV0X3R5cGU7CisgICAgICB0eXBlZGVmIF9JbnRUeXBlICByZXN1bHRfdHlwZTsKKworICAgICAgLy8gY29uc3RydWN0b3JzIGFuZCBtZW1iZXIgZnVuY3Rpb24KKyAgICAgIGV4cGxpY2l0CisgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb24oX0ludFR5cGUgX190ID0gMSwKKwkJCSAgICBjb25zdCBfUmVhbFR5cGUmIF9fcCA9IF9SZWFsVHlwZSgwLjUpKQorICAgICAgOiBfTV90KF9fdCksIF9NX3AoX19wKSwgX01fbmQoKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVCgoX01fdCA+PSAwKSAmJiAoX01fcCA+PSAwLjApICYmIChfTV9wIDw9IDEuMCkpOworCV9NX2luaXRpYWxpemUoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBkaXN0cmlidXRpb24gQHAgdCBwYXJhbWV0ZXIuCisgICAgICAgKi8KKyAgICAgIF9JbnRUeXBlCisgICAgICB0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3Q7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBkaXN0cmlidXRpb24gQHAgcCBwYXJhbWV0ZXIuCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fbmQucmVzZXQoKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKTsKKworICAgICAgLyoqCisgICAgICAgKiBJbnNlcnRzIGEgJWJpbm9taWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlYmlub21pYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgdHlwZW5hbWUgX1JlYWxUeXBlMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTEsIF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEV4dHJhY3RzIGEgJWJpbm9taWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWJpbm9taWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgdHlwZW5hbWUgX1JlYWxUeXBlMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTEsIF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemUoKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIF9NX3dhaXRpbmcoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywgX0ludFR5cGUgX190KTsKKworICAgICAgLy8gTkI6IFVudXNlZCB3aGVuIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEgaXMgdW5kZWZpbmVkLgorICAgICAgbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IF9NX25kOworCisgICAgICBfUmVhbFR5cGUgX01fcTsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBfUmVhbFR5cGUgX01fZDEsIF9NX2QyLCBfTV9zMSwgX01fczIsIF9NX2MsCisJICAgICAgICBfTV9hMSwgX01fYTEyMywgX01fcywgX01fbGYsIF9NX2xwMXA7CisjZW5kaWYKKyAgICAgIF9SZWFsVHlwZSBfTV9wOworICAgICAgX0ludFR5cGUgIF9NX3Q7CisKKyAgICAgIGJvb2wgICAgICBfTV9lYXN5OworICAgIH07CisKKyAgLyogQH0gKi8gLy8gZ3JvdXAgdHIxX3JhbmRvbV9kaXN0cmlidXRpb25zX2Rpc2NyZXRlCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHRyMV9yYW5kb21fZGlzdHJpYnV0aW9uc19jb250aW51b3VzIENvbnRpbnVvdXMgRGlzdHJpYnV0aW9ucworICAgKiBAaW5ncm91cCB0cjFfcmFuZG9tX2Rpc3RyaWJ1dGlvbnMKKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIEBicmllZiBVbmlmb3JtIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogQSBjb250aW51b3VzIHJhbmRvbSBkaXN0cmlidXRpb24gb24gdGhlIHJhbmdlIFttaW4sIG1heCkgd2l0aCBlcXVhbAorICAgKiBwcm9iYWJpbGl0eSB0aHJvdWdob3V0IHRoZSByYW5nZS4gIFRoZSBVUk5HIHNob3VsZCBiZSByZWFsLXZhbHVlZCBhbmQKKyAgICogZGVsaXZlciBudW1iZXIgaW4gdGhlIHJhbmdlIFswLCAxKS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyB1bmlmb3JtX3JlYWwKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXMKKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIGlucHV0X3R5cGU7CisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhIHVuaWZvcm1fcmVhbCBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbWluIFtJTl0gIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fbWF4IFtJTl0gIFRoZSB1cHBlciBib3VuZCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgdW5pZm9ybV9yZWFsKF9SZWFsVHlwZSBfX21pbiA9IF9SZWFsVHlwZSgwKSwKKwkJICAgX1JlYWxUeXBlIF9fbWF4ID0gX1JlYWxUeXBlKDEpKQorICAgICAgOiBfTV9taW4oX19taW4pLCBfTV9tYXgoX19tYXgpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX21pbiA8PSBfTV9tYXgpOworICAgICAgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX21pbjsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX21heDsgfQorCisgICAgICB2b2lkCisgICAgICByZXNldCgpIHsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgICB7IHJldHVybiAoX191cm5nKCkgKiAoX01fbWF4IC0gX01fbWluKSkgKyBfTV9taW47IH0KKworICAgICAgLyoqCisgICAgICAgKiBJbnNlcnRzIGEgJXVuaWZvcm1fcmVhbCByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbiBAcCBfX3ggaW50byB0aGUKKyAgICAgICAqIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAldW5pZm9ybV9yZWFsIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCB1bmlmb3JtX3JlYWw8X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogRXh0cmFjdHMgYSAldW5pZm9ybV9yZWFsIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAldW5pZm9ybV9yZWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHVuaWZvcm1fcmVhbDxfUmVhbFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICBfUmVhbFR5cGUgX01fbWluOworICAgICAgX1JlYWxUeXBlIF9NX21heDsKKyAgICB9OworCisKKyAgLyoqCisgICAqIEBicmllZiBBbiBleHBvbmVudGlhbCBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgZXhwb25lbnRpYWwgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcyAKKyAgICogQGYkIHAoeCkgPSBcbGFtYmRhIGVeey1cbGFtYmRhIHh9IEBmJC4KKyAgICoKKyAgICogPHRhYmxlIGJvcmRlcj0xIGNlbGxwYWRkaW5nPTEwIGNlbGxzcGFjaW5nPTA+CisgICAqIDxjYXB0aW9uIGFsaWduPXRvcD5EaXN0cmlidXRpb24gU3RhdGlzdGljczwvY2FwdGlvbj4KKyAgICogPHRyPjx0ZD5NZWFuPC90ZD48dGQ+QGYkIFxmcmFjezF9e1xsYW1iZGF9IEBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5NZWRpYW48L3RkPjx0ZD5AZiQgXGZyYWN7XGxuIDJ9e1xsYW1iZGF9IEBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5Nb2RlPC90ZD48dGQ+QGYkIHplcm8gQGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPlJhbmdlPC90ZD48dGQ+QGYkWzAsIFxpbmZ0eV1AZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+U3RhbmRhcmQgRGV2aWF0aW9uPC90ZD48dGQ+QGYkIFxmcmFjezF9e1xsYW1iZGF9IEBmJDwvdGQ+PC90cj4KKyAgICogPC90YWJsZT4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBleHBvbmVudGlhbF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXMKKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIGlucHV0X3R5cGU7CisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhbiBleHBvbmVudGlhbCBkaXN0cmlidXRpb24gd2l0aCBpbnZlcnNlIHNjYWxlIHBhcmFtZXRlcgorICAgICAgICogQGYkIFxsYW1iZGEgQGYkLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uKGNvbnN0IHJlc3VsdF90eXBlJiBfX2xhbWJkYSA9IHJlc3VsdF90eXBlKDEpKQorICAgICAgOiBfTV9sYW1iZGEoX19sYW1iZGEpCisgICAgICB7IAorCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9sYW1iZGEgPiAwKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBpbnZlcnNlIHNjYWxlIHBhcmFtZXRlciBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIGxhbWJkYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9sYW1iZGE7IH0KKworICAgICAgLyoqCisgICAgICAgKiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBIYXMgbm8gZWZmZWN0IG9uIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbnMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICAgIHsgcmV0dXJuIC1zdGQ6OmxvZyhfX3VybmcoKSkgLyBfTV9sYW1iZGE7IH0KKworICAgICAgLyoqCisgICAgICAgKiBJbnNlcnRzIGEgJWV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBleHBvbmVudGlhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogRXh0cmFjdHMgYSAlZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCBBICVleHBvbmVudGlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uJiBfX3gpCisgICAgICAgIHsgcmV0dXJuIF9faXMgPj4gX194Ll9NX2xhbWJkYTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHJlc3VsdF90eXBlIF9NX2xhbWJkYTsKKyAgICB9OworCisKKyAgLyoqCisgICAqIEBicmllZiBBIG5vcm1hbCBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMgCisgICAqIEBmJCBwKHgpID0gXGZyYWN7MX17XHNpZ21hIFxzcXJ0ezIgXHBpfX0gCisgICAqICAgICAgICAgICAgZV57LSBcZnJhY3t7eCAtIG1lYW59XiB7Mn19ezIgXHNpZ21hIF4gezJ9fSB9IEBmJC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBub3JtYWxfZGlzdHJpYnV0aW9uCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSBpbnB1dF90eXBlOworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggcGFyYW1ldGVycyBAZiQgbWVhbiBAZiQgYW5kCisgICAgICAgKiBAZiQgXHNpZ21hIEBmJC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG5vcm1hbF9kaXN0cmlidXRpb24oY29uc3QgcmVzdWx0X3R5cGUmIF9fbWVhbiA9IHJlc3VsdF90eXBlKDApLAorCQkJICBjb25zdCByZXN1bHRfdHlwZSYgX19zaWdtYSA9IHJlc3VsdF90eXBlKDEpKQorICAgICAgOiBfTV9tZWFuKF9fbWVhbiksIF9NX3NpZ21hKF9fc2lnbWEpLCBfTV9zYXZlZF9hdmFpbGFibGUoZmFsc2UpCisgICAgICB7IAorCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9zaWdtYSA+IDApOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG1lYW4gb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBtZWFuKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX21lYW47IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBAZiQgXHNpZ21hIEBmJCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIHNpZ21hKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3NpZ21hOyB9CisKKyAgICAgIC8qKgorICAgICAgICogUmVzZXRzIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fc2F2ZWRfYXZhaWxhYmxlID0gZmFsc2U7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZyk7CisKKyAgICAgIC8qKgorICAgICAgICogSW5zZXJ0cyBhICVub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEV4dHJhY3RzIGEgJW5vcm1hbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgcmVzdWx0X3R5cGUgX01fbWVhbjsKKyAgICAgIHJlc3VsdF90eXBlIF9NX3NpZ21hOworICAgICAgcmVzdWx0X3R5cGUgX01fc2F2ZWQ7CisgICAgICBib29sICAgICAgICBfTV9zYXZlZF9hdmFpbGFibGU7ICAgICAKKyAgICB9OworCisKKyAgLyoqCisgICAqIEBicmllZiBBIGdhbW1hIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBnYW1tYSBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIGlzIAorICAgKiBAZiQgcCh4KSA9IFxmcmFjezF9e1xHYW1tYShcYWxwaGEpfSB4XntcYWxwaGEgLSAxfSBlXnsteH0gQGYkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIGdhbW1hX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlcworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgaW5wdXRfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgZ2FtbWEgZGlzdHJpYnV0aW9uIHdpdGggcGFyYW1ldGVycyBAZiQgXGFscGhhIEBmJC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGdhbW1hX2Rpc3RyaWJ1dGlvbihjb25zdCByZXN1bHRfdHlwZSYgX19hbHBoYV92YWwgPSByZXN1bHRfdHlwZSgxKSkKKyAgICAgIDogX01fYWxwaGEoX19hbHBoYV92YWwpCisgICAgICB7IAorCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9hbHBoYSA+IDApOworCV9NX2luaXRpYWxpemUoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBAZiQgXGFscGhhIEBmJCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIGFscGhhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2FscGhhOyB9CisKKyAgICAgIC8qKgorICAgICAgICogUmVzZXRzIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpOworCisgICAgICAvKioKKyAgICAgICAqIEluc2VydHMgYSAlZ2FtbWFfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVnYW1tYV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBFeHRyYWN0cyBhICVnYW1tYV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVnYW1tYV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgZ2FtbWFfZGlzdHJpYnV0aW9uJiBfX3gpCisgICAgICAgIHsKKwkgIF9faXMgPj4gX194Ll9NX2FscGhhOworCSAgX194Ll9NX2luaXRpYWxpemUoKTsKKwkgIHJldHVybiBfX2lzOworCX0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplKCk7CisKKyAgICAgIHJlc3VsdF90eXBlIF9NX2FscGhhOworCisgICAgICAvLyBIb3N0cyBlaXRoZXIgbGFtYmRhIG9mIEdCIG9yIGQgb2YgbW9kaWZpZWQgVmFkdXZhJ3MuCisgICAgICByZXN1bHRfdHlwZSBfTV9sX2Q7CisgICAgfTsKKworICAvKiBAfSAqLyAvLyBncm91cCB0cjFfcmFuZG9tX2Rpc3RyaWJ1dGlvbnNfY29udGludW91cworICAvKiBAfSAqLyAvLyBncm91cCB0cjFfcmFuZG9tX2Rpc3RyaWJ1dGlvbnMKKyAgLyogQH0gKi8gLy8gZ3JvdXAgdHIxX3JhbmRvbQorX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfUkFORE9NX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3JhbmRvbS50Y2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9yYW5kb20udGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjRkNGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9yYW5kb20udGNjCkBAIC0wLDAgKzEsMTcyMSBAQAorLy8gcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIChvdXQgb2YgbGluZSkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworCisvKiogQGZpbGUgdHIxL3JhbmRvbS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvcmFuZG9tfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1JBTkRPTV9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1JBTkRPTV9UQ0MgMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgLyoKKyAgICogKEZ1cnRoZXIpIGltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgICAqLworICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLy8gR2VuZXJhbCBjYXNlIGZvciB4ID0gKGF4ICsgYykgbW9kIG0gLS0gdXNlIFNjaHJhZ2UncyBhbGdvcml0aG0gdG8gYXZvaWQKKyAgICAvLyBpbnRlZ2VyIG92ZXJmbG93LgorICAgIC8vCisgICAgLy8gQmVjYXVzZSBhIGFuZCBjIGFyZSBjb21waWxlLXRpbWUgaW50ZWdyYWwgY29uc3RhbnRzIHRoZSBjb21waWxlciBraW5kbHkKKyAgICAvLyBlbGlkZXMgYW55IHVucmVhY2hhYmxlIHBhdGhzLgorICAgIC8vCisgICAgLy8gUHJlY29uZGl0aW9uczogIGEgPiAwLCBtID4gMC4KKyAgICAvLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX1RwIF9fYSwgX1RwIF9fYywgX1RwIF9fbSwgYm9vbD4KKyAgICAgIHN0cnVjdCBfTW9kCisgICAgICB7CisJc3RhdGljIF9UcAorCV9fY2FsYyhfVHAgX194KQorCXsKKwkgIGlmIChfX2EgPT0gMSkKKwkgICAgX194ICU9IF9fbTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0YXRpYyBjb25zdCBfVHAgX19xID0gX19tIC8gX19hOworCSAgICAgIHN0YXRpYyBjb25zdCBfVHAgX19yID0gX19tICUgX19hOworCSAgICAgIAorCSAgICAgIF9UcCBfX3QxID0gX19hICogKF9feCAlIF9fcSk7CisJICAgICAgX1RwIF9fdDIgPSBfX3IgKiAoX194IC8gX19xKTsKKwkgICAgICBpZiAoX190MSA+PSBfX3QyKQorCQlfX3ggPSBfX3QxIC0gX190MjsKKwkgICAgICBlbHNlCisJCV9feCA9IF9fbSAtIF9fdDIgKyBfX3QxOworCSAgICB9CisKKwkgIGlmIChfX2MgIT0gMCkKKwkgICAgeworCSAgICAgIGNvbnN0IF9UcCBfX2QgPSBfX20gLSBfX3g7CisJICAgICAgaWYgKF9fZCA+IF9fYykKKwkJX194ICs9IF9fYzsKKwkgICAgICBlbHNlCisJCV9feCA9IF9fYyAtIF9fZDsKKwkgICAgfQorCSAgcmV0dXJuIF9feDsKKwl9CisgICAgICB9OworCisgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBtID09IDAgLS0gdXNlIHVuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgYXMgbW9kdWxvCisgICAgLy8gb3BlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX19hLCBfVHAgX19jLCBfVHAgX19tPgorICAgICAgc3RydWN0IF9Nb2Q8X1RwLCBfX2EsIF9fYywgX19tLCB0cnVlPgorICAgICAgeworCXN0YXRpYyBfVHAKKwlfX2NhbGMoX1RwIF9feCkKKwl7IHJldHVybiBfX2EgKiBfX3ggKyBfX2M7IH0KKyAgICAgIH07CisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICBjb25zdCBfVUludFR5cGUKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46Om11bHRpcGxpZXI7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIGNvbnN0IF9VSW50VHlwZQorICAgIGxpbmVhcl9jb25ncnVlbnRpYWw8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPjo6aW5jcmVtZW50OworCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICBjb25zdCBfVUludFR5cGUKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46Om1vZHVsdXM7CisKKyAgLyoqCisgICAqIFNlZWRzIHRoZSBMQ1Igd2l0aCBpbnRlZ3JhbCB2YWx1ZSBAcCBfX3gwLCBhZGp1c3RlZCBzbyB0aGF0IHRoZSAKKyAgICogcmluZyBpZGVudGl0eSBpcyBuZXZlciBhIG1lbWJlciBvZiB0aGUgY29udmVyZ2VuY2Ugc2V0LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIHZvaWQKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46OgorICAgIHNlZWQodW5zaWduZWQgbG9uZyBfX3gwKQorICAgIHsKKyAgICAgIGlmICgoX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgX19tPihfX2MpID09IDApCisJICAmJiAoX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgX19tPihfX3gwKSA9PSAwKSkKKwlfTV94ID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgX19tPigxKTsKKyAgICAgIGVsc2UKKwlfTV94ID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgX19tPihfX3gwKTsKKyAgICB9CisKKyAgLyoqCisgICAqIFNlZWRzIHRoZSBMQ1IgZW5naW5lIHdpdGggYSB2YWx1ZSBnZW5lcmF0ZWQgYnkgQHAgX19nLgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICB2b2lkCisgICAgICBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46OgorICAgICAgc2VlZChfR2VuJiBfX2csIGZhbHNlX3R5cGUpCisgICAgICB7CisJX1VJbnRUeXBlIF9feDAgPSBfX2coKTsKKwlpZiAoKF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsIF9fbT4oX19jKSA9PSAwKQorCSAgICAmJiAoX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgX19tPihfX3gwKSA9PSAwKSkKKwkgIF9NX3ggPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLCAxLCAwLCBfX20+KDEpOworCWVsc2UKKwkgIF9NX3ggPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLCAxLCAwLCBfX20+KF9feDApOworICAgICAgfQorCisgIC8qKgorICAgKiBHZXRzIHRoZSBuZXh0IGdlbmVyYXRlZCB2YWx1ZSBpbiBzZXF1ZW5jZS4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICB0eXBlbmFtZSBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46OnJlc3VsdF90eXBlCisgICAgbGluZWFyX2NvbmdydWVudGlhbDxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjoKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisgICAgICBfTV94ID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT4oX01feCk7CisgICAgICByZXR1cm4gX01feDsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT4mIF9fbGNyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6Zml4ZWQgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX29zLndpZGVuKCcgJykpOworCisgICAgICBfX29zIDw8IF9fbGNyLl9NX3g7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20sCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGxpbmVhcl9jb25ncnVlbnRpYWw8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPiYgX19sY3IpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMpOworCisgICAgICBfX2lzID4+IF9fbGNyLl9NX3g7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9IAorCisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBpbnQKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46OndvcmRfc2l6ZTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBpbnQgX190LCBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIGNvbnN0IGludAorICAgIG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX3MsCisJCSAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6c3RhdGVfc2l6ZTsKKyAgICAKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBpbnQKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46OnNoaWZ0X3NpemU7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBpbnQKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46Om1hc2tfYml0czsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBpbnQgX190LCBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIGNvbnN0IF9VSW50VHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX3MsCisJCSAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6cGFyYW1ldGVyX2E7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBpbnQKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46Om91dHB1dF91OworCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIGludCBfX3QsIF9VSW50VHlwZSBfX2MsIGludCBfX2w+CisgICAgY29uc3QgaW50CisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+OjpvdXRwdXRfczsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBpbnQgX190LCBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIGNvbnN0IF9VSW50VHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX3MsCisJCSAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6b3V0cHV0X2I7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBpbnQKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46Om91dHB1dF90OworCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIGludCBfX3QsIF9VSW50VHlwZSBfX2MsIGludCBfX2w+CisgICAgY29uc3QgX1VJbnRUeXBlCisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+OjpvdXRwdXRfYzsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBpbnQgX190LCBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIGNvbnN0IGludAorICAgIG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX3MsCisJCSAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6b3V0cHV0X2w7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICB2b2lkCisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+OjoKKyAgICBzZWVkKHVuc2lnbmVkIGxvbmcgX192YWx1ZSkKKyAgICB7CisgICAgICBfTV94WzBdID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwKKwlfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZT4oX192YWx1ZSk7CisKKyAgICAgIGZvciAoaW50IF9faSA9IDE7IF9faSA8IHN0YXRlX3NpemU7ICsrX19pKQorCXsKKwkgIF9VSW50VHlwZSBfX3ggPSBfTV94W19faSAtIDFdOworCSAgX194IF49IF9feCA+PiAoX193IC0gMik7CisJICBfX3ggKj0gMTgxMjQzMzI1M3VsOworCSAgX194ICs9IF9faTsKKwkgIF9NX3hbX19pXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsCisJICAgIF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlPihfX3gpOwkgIAorCX0KKyAgICAgIF9NX3AgPSBzdGF0ZV9zaXplOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBpbnQgX190LCBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICB2b2lkCisgICAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6CisgICAgICBzZWVkKF9HZW4mIF9fZ2VuLCBmYWxzZV90eXBlKQorICAgICAgeworCWZvciAoaW50IF9faSA9IDA7IF9faSA8IHN0YXRlX3NpemU7ICsrX19pKQorCSAgX01feFtfX2ldID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwKKwkgICAgX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWU+KF9fZ2VuKCkpOworCV9NX3AgPSBzdGF0ZV9zaXplOworICAgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIGludCBfX3QsIF9VSW50VHlwZSBfX2MsIGludCBfX2w+CisgICAgdHlwZW5hbWUKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46OnJlc3VsdF90eXBlCisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+OjoKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisgICAgICAvLyBSZWxvYWQgdGhlIHZlY3RvciAtIGNvc3QgaXMgTyhuKSBhbW9ydGl6ZWQgb3ZlciBuIGNhbGxzLgorICAgICAgaWYgKF9NX3AgPj0gc3RhdGVfc2l6ZSkKKwl7CisJICBjb25zdCBfVUludFR5cGUgX191cHBlcl9tYXNrID0gKH5fVUludFR5cGUoKSkgPDwgX19yOworCSAgY29uc3QgX1VJbnRUeXBlIF9fbG93ZXJfbWFzayA9IH5fX3VwcGVyX21hc2s7CisKKwkgIGZvciAoaW50IF9fayA9IDA7IF9fayA8IChfX24gLSBfX20pOyArK19faykKKwkgICAgeworCSAgICAgIF9VSW50VHlwZSBfX3kgPSAoKF9NX3hbX19rXSAmIF9fdXBwZXJfbWFzaykKKwkJCSAgICAgICB8IChfTV94W19fayArIDFdICYgX19sb3dlcl9tYXNrKSk7CisJICAgICAgX01feFtfX2tdID0gKF9NX3hbX19rICsgX19tXSBeIChfX3kgPj4gMSkKKwkJCSAgIF4gKChfX3kgJiAweDAxKSA/IF9fYSA6IDApKTsKKwkgICAgfQorCisJICBmb3IgKGludCBfX2sgPSAoX19uIC0gX19tKTsgX19rIDwgKF9fbiAtIDEpOyArK19faykKKwkgICAgeworCSAgICAgIF9VSW50VHlwZSBfX3kgPSAoKF9NX3hbX19rXSAmIF9fdXBwZXJfbWFzaykKKwkJCSAgICAgICB8IChfTV94W19fayArIDFdICYgX19sb3dlcl9tYXNrKSk7CisJICAgICAgX01feFtfX2tdID0gKF9NX3hbX19rICsgKF9fbSAtIF9fbildIF4gKF9feSA+PiAxKQorCQkJICAgXiAoKF9feSAmIDB4MDEpID8gX19hIDogMCkpOworCSAgICB9CisKKwkgIF9VSW50VHlwZSBfX3kgPSAoKF9NX3hbX19uIC0gMV0gJiBfX3VwcGVyX21hc2spCisJCQkgICB8IChfTV94WzBdICYgX19sb3dlcl9tYXNrKSk7CisJICBfTV94W19fbiAtIDFdID0gKF9NX3hbX19tIC0gMV0gXiAoX195ID4+IDEpCisJCQkgICBeICgoX195ICYgMHgwMSkgPyBfX2EgOiAwKSk7CisJICBfTV9wID0gMDsKKwl9CisKKyAgICAgIC8vIENhbGN1bGF0ZSBvKHgoaSkpLgorICAgICAgcmVzdWx0X3R5cGUgX196ID0gX01feFtfTV9wKytdOworICAgICAgX196IF49IChfX3ogPj4gX191KTsKKyAgICAgIF9feiBePSAoX196IDw8IF9fcykgJiBfX2I7CisgICAgICBfX3ogXj0gKF9feiA8PCBfX3QpICYgX19jOworICAgICAgX196IF49IChfX3ogPj4gX19sKTsKKworICAgICAgcmV0dXJuIF9fejsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsIF9VSW50VHlwZSBfX2IsIGludCBfX3QsCisJICAgX1VJbnRUeXBlIF9fYywgaW50IF9fbCwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sCisJICAgICAgIF9fciwgX19hLCBfX3UsIF9fcywgX19iLCBfX3QsIF9fYywgX19sPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZCB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX24gLSAxOyArK19faSkKKwlfX29zIDw8IF9feC5fTV94W19faV0gPDwgX19zcGFjZTsKKyAgICAgIF9fb3MgPDwgX194Ll9NX3hbX19uIC0gMV07CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwKKwkgICBfVUludFR5cGUgX19jLCBpbnQgX19sLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwKKwkgICAgICAgX19yLCBfX2EsIF9fdSwgX19zLCBfX2IsIF9fdCwgX19jLCBfX2w+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCV9faXMgPj4gX194Ll9NX3hbX19pXTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCBfSW50VHlwZSBfX20sIGludCBfX3MsIGludCBfX3I+CisgICAgY29uc3QgX0ludFR5cGUKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5PF9JbnRUeXBlLCBfX20sIF9fcywgX19yPjo6bW9kdWx1czsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgX0ludFR5cGUgX19tLCBpbnQgX19zLCBpbnQgX19yPgorICAgIGNvbnN0IGludAorICAgIHN1YnRyYWN0X3dpdGhfY2Fycnk8X0ludFR5cGUsIF9fbSwgX19zLCBfX3I+Ojpsb25nX2xhZzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgX0ludFR5cGUgX19tLCBpbnQgX19zLCBpbnQgX19yPgorICAgIGNvbnN0IGludAorICAgIHN1YnRyYWN0X3dpdGhfY2Fycnk8X0ludFR5cGUsIF9fbSwgX19zLCBfX3I+OjpzaG9ydF9sYWc7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIF9JbnRUeXBlIF9fbSwgaW50IF9fcywgaW50IF9fcj4KKyAgICB2b2lkCisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeTxfSW50VHlwZSwgX19tLCBfX3MsIF9fcj46OgorICAgIHNlZWQodW5zaWduZWQgbG9uZyBfX3ZhbHVlKQorICAgIHsKKyAgICAgIGlmIChfX3ZhbHVlID09IDApCisJX192YWx1ZSA9IDE5NzgwNTAzOworCisgICAgICBzdGQ6OnRyMTo6bGluZWFyX2NvbmdydWVudGlhbDx1bnNpZ25lZCBsb25nLCA0MDAxNCwgMCwgMjE0NzQ4MzU2Mz4KKwlfX2xjZyhfX3ZhbHVlKTsKKworICAgICAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgbG9uZ19sYWc7ICsrX19pKQorCV9NX3hbX19pXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsIG1vZHVsdXM+KF9fbGNnKCkpOworCisgICAgICBfTV9jYXJyeSA9IChfTV94W2xvbmdfbGFnIC0gMV0gPT0gMCkgPyAxIDogMDsKKyAgICAgIF9NX3AgPSAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgX0ludFR5cGUgX19tLCBpbnQgX19zLCBpbnQgX19yPgorICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICB2b2lkCisgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5PF9JbnRUeXBlLCBfX20sIF9fcywgX19yPjo6CisgICAgICBzZWVkKF9HZW4mIF9fZ2VuLCBmYWxzZV90eXBlKQorICAgICAgeworCWNvbnN0IGludCBfX24gPSAoc3RkOjpudW1lcmljX2xpbWl0czxfVUludFR5cGU+OjpkaWdpdHMgKyAzMSkgLyAzMjsKKworCWZvciAoaW50IF9faSA9IDA7IF9faSA8IGxvbmdfbGFnOyArK19faSkKKwkgIHsKKwkgICAgX1VJbnRUeXBlIF9fdG1wID0gMDsKKwkgICAgX1VJbnRUeXBlIF9fZmFjdG9yID0gMTsKKwkgICAgZm9yIChpbnQgX19qID0gMDsgX19qIDwgX19uOyArK19faikKKwkgICAgICB7CisJCV9fdG1wICs9IF9fZGV0YWlsOjpfX21vZDxfX2RldGFpbDo6X1VJbnQzMlR5cGUsIDEsIDAsIDA+CisJCSAgICAgICAgIChfX2dlbigpKSAqIF9fZmFjdG9yOworCQlfX2ZhY3RvciAqPSBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgMzI+OjpfX3ZhbHVlOworCSAgICAgIH0KKwkgICAgX01feFtfX2ldID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgbW9kdWx1cz4oX190bXApOworCSAgfQorCV9NX2NhcnJ5ID0gKF9NX3hbbG9uZ19sYWcgLSAxXSA9PSAwKSA/IDEgOiAwOworCV9NX3AgPSAwOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCBfSW50VHlwZSBfX20sIGludCBfX3MsIGludCBfX3I+CisgICAgdHlwZW5hbWUgc3VidHJhY3Rfd2l0aF9jYXJyeTxfSW50VHlwZSwgX19tLCBfX3MsIF9fcj46OnJlc3VsdF90eXBlCisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeTxfSW50VHlwZSwgX19tLCBfX3MsIF9fcj46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIC8vIERlcml2ZSBzaG9ydCBsYWcgaW5kZXggZnJvbSBjdXJyZW50IGluZGV4LgorICAgICAgaW50IF9fcHMgPSBfTV9wIC0gc2hvcnRfbGFnOworICAgICAgaWYgKF9fcHMgPCAwKQorCV9fcHMgKz0gbG9uZ19sYWc7CisKKyAgICAgIC8vIENhbGN1bGF0ZSBuZXcgeChpKSB3aXRob3V0IG92ZXJmbG93IG9yIGRpdmlzaW9uLgorICAgICAgLy8gTkI6IFRoYW5rcyB0byB0aGUgcmVxdWlyZW1lbnRzIGZvciBfSW50VHlwZSwgX01feFtfTV9wXSArIF9NX2NhcnJ5CisgICAgICAvLyBjYW5ub3Qgb3ZlcmZsb3cuCisgICAgICBfVUludFR5cGUgX194aTsKKyAgICAgIGlmIChfTV94W19fcHNdID49IF9NX3hbX01fcF0gKyBfTV9jYXJyeSkKKwl7CisJICBfX3hpID0gX01feFtfX3BzXSAtIF9NX3hbX01fcF0gLSBfTV9jYXJyeTsKKwkgIF9NX2NhcnJ5ID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgX194aSA9IG1vZHVsdXMgLSBfTV94W19NX3BdIC0gX01fY2FycnkgKyBfTV94W19fcHNdOworCSAgX01fY2FycnkgPSAxOworCX0KKyAgICAgIF9NX3hbX01fcF0gPSBfX3hpOworCisgICAgICAvLyBBZGp1c3QgY3VycmVudCBpbmRleCB0byBsb29wIGFyb3VuZCBpbiByaW5nIGJ1ZmZlci4KKyAgICAgIGlmICgrK19NX3AgPj0gbG9uZ19sYWcpCisJX01fcCA9IDA7CisKKyAgICAgIHJldHVybiBfX3hpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgX0ludFR5cGUgX19tLCBpbnQgX19zLCBpbnQgX19yLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5PF9JbnRUeXBlLCBfX20sIF9fcywgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZCB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX3I7ICsrX19pKQorCV9fb3MgPDwgX194Ll9NX3hbX19pXSA8PCBfX3NwYWNlOworICAgICAgX19vcyA8PCBfX3guX01fY2Fycnk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgX0ludFR5cGUgX19tLCBpbnQgX19zLCBpbnQgX19yLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5PF9JbnRUeXBlLCBfX20sIF9fcywgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgX19yOyArK19faSkKKwlfX2lzID4+IF9feC5fTV94W19faV07CisgICAgICBfX2lzID4+IF9feC5fTV9jYXJyeTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgaW50IF9fdywgaW50IF9fcywgaW50IF9fcj4KKyAgICBjb25zdCBpbnQKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPF9SZWFsVHlwZSwgX193LCBfX3MsIF9fcj46OndvcmRfc2l6ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIGludCBfX3csIGludCBfX3MsIGludCBfX3I+CisgICAgY29uc3QgaW50CisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxfUmVhbFR5cGUsIF9fdywgX19zLCBfX3I+Ojpsb25nX2xhZzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIGludCBfX3csIGludCBfX3MsIGludCBfX3I+CisgICAgY29uc3QgaW50CisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxfUmVhbFR5cGUsIF9fdywgX19zLCBfX3I+OjpzaG9ydF9sYWc7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBpbnQgX193LCBpbnQgX19zLCBpbnQgX19yPgorICAgIHZvaWQKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPF9SZWFsVHlwZSwgX193LCBfX3MsIF9fcj46OgorICAgIF9NX2luaXRpYWxpemVfbnBvd3MoKQorICAgIHsKKyAgICAgIGZvciAoaW50IF9faiA9IDA7IF9faiA8IF9fbjsgKytfX2opCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCV9NX25wb3dzW19fal0gPSBzdGQ6OnRyMTo6bGRleHAoX1JlYWxUeXBlKDEpLCAtX193ICsgX19qICogMzIpOworI2Vsc2UKKyAgICAgICAgX01fbnBvd3NbX19qXSA9IHN0ZDo6cG93KF9SZWFsVHlwZSgyKSwgLV9fdyArIF9faiAqIDMyKTsKKyNlbmRpZgorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIGludCBfX3csIGludCBfX3MsIGludCBfX3I+CisgICAgdm9pZAorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8X1JlYWxUeXBlLCBfX3csIF9fcywgX19yPjo6CisgICAgc2VlZCh1bnNpZ25lZCBsb25nIF9fdmFsdWUpCisgICAgeworICAgICAgaWYgKF9fdmFsdWUgPT0gMCkKKwlfX3ZhbHVlID0gMTk3ODA1MDM7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDUxMi4gU2VlZGluZyBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIGZyb20gYSBzaW5nbGUgdW5zaWduZWQgbG9uZy4KKyAgICAgIHN0ZDo6dHIxOjpsaW5lYXJfY29uZ3J1ZW50aWFsPHVuc2lnbmVkIGxvbmcsIDQwMDE0LCAwLCAyMTQ3NDgzNTYzPgorCV9fbGNnKF9fdmFsdWUpOworCisgICAgICB0aGlzLT5zZWVkKF9fbGNnKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBpbnQgX193LCBpbnQgX19zLCBpbnQgX19yPgorICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICB2b2lkCisgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPF9SZWFsVHlwZSwgX193LCBfX3MsIF9fcj46OgorICAgICAgc2VlZChfR2VuJiBfX2dlbiwgZmFsc2VfdHlwZSkKKyAgICAgIHsKKwlmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBsb25nX2xhZzsgKytfX2kpCisJICB7CisJICAgIGZvciAoaW50IF9faiA9IDA7IF9faiA8IF9fbiAtIDE7ICsrX19qKQorCSAgICAgIF9NX3hbX19pXVtfX2pdID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50MzJUeXBlLCAxLCAwLCAwPihfX2dlbigpKTsKKwkgICAgX01feFtfX2ldW19fbiAtIDFdID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50MzJUeXBlLCAxLCAwLAorCSAgICAgIF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnQzMlR5cGUsIF9fdyAlIDMyPjo6X192YWx1ZT4oX19nZW4oKSk7CisJICB9CisKKwlfTV9jYXJyeSA9IDE7CisJZm9yIChpbnQgX19qID0gMDsgX19qIDwgX19uOyArK19faikKKwkgIGlmIChfTV94W2xvbmdfbGFnIC0gMV1bX19qXSAhPSAwKQorCSAgICB7CisJICAgICAgX01fY2FycnkgPSAwOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwlfTV9wID0gMDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIGludCBfX3csIGludCBfX3MsIGludCBfX3I+CisgICAgdHlwZW5hbWUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxfUmVhbFR5cGUsIF9fdywgX19zLCBfX3I+OjpyZXN1bHRfdHlwZQorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8X1JlYWxUeXBlLCBfX3csIF9fcywgX19yPjo6CisgICAgb3BlcmF0b3IoKSgpCisgICAgeworICAgICAgLy8gRGVyaXZlIHNob3J0IGxhZyBpbmRleCBmcm9tIGN1cnJlbnQgaW5kZXguCisgICAgICBpbnQgX19wcyA9IF9NX3AgLSBzaG9ydF9sYWc7CisgICAgICBpZiAoX19wcyA8IDApCisJX19wcyArPSBsb25nX2xhZzsKKworICAgICAgX1VJbnQzMlR5cGUgX19uZXdfY2Fycnk7CisgICAgICBmb3IgKGludCBfX2ogPSAwOyBfX2ogPCBfX24gLSAxOyArK19faikKKwl7CisJICBpZiAoX01feFtfX3BzXVtfX2pdID4gX01feFtfTV9wXVtfX2pdCisJICAgICAgfHwgKF9NX3hbX19wc11bX19qXSA9PSBfTV94W19NX3BdW19fal0gJiYgX01fY2FycnkgPT0gMCkpCisJICAgIF9fbmV3X2NhcnJ5ID0gMDsKKwkgIGVsc2UKKwkgICAgX19uZXdfY2FycnkgPSAxOworCisJICBfTV94W19NX3BdW19fal0gPSBfTV94W19fcHNdW19fal0gLSBfTV94W19NX3BdW19fal0gLSBfTV9jYXJyeTsKKwkgIF9NX2NhcnJ5ID0gX19uZXdfY2Fycnk7CisJfQorCisgICAgICBpZiAoX01feFtfX3BzXVtfX24gLSAxXSA+IF9NX3hbX01fcF1bX19uIC0gMV0KKwkgIHx8IChfTV94W19fcHNdW19fbiAtIDFdID09IF9NX3hbX01fcF1bX19uIC0gMV0gJiYgX01fY2FycnkgPT0gMCkpCisJX19uZXdfY2FycnkgPSAwOworICAgICAgZWxzZQorCV9fbmV3X2NhcnJ5ID0gMTsKKyAgICAgIAorICAgICAgX01feFtfTV9wXVtfX24gLSAxXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludDMyVHlwZSwgMSwgMCwKKwlfX2RldGFpbDo6X1NoaWZ0PF9VSW50MzJUeXBlLCBfX3cgJSAzMj46Ol9fdmFsdWU+CisJKF9NX3hbX19wc11bX19uIC0gMV0gLSBfTV94W19NX3BdW19fbiAtIDFdIC0gX01fY2FycnkpOworICAgICAgX01fY2FycnkgPSBfX25ld19jYXJyeTsKKworICAgICAgcmVzdWx0X3R5cGUgX19yZXQgPSAwLjA7CisgICAgICBmb3IgKGludCBfX2ogPSAwOyBfX2ogPCBfX247ICsrX19qKQorCV9fcmV0ICs9IF9NX3hbX01fcF1bX19qXSAqIF9NX25wb3dzW19fal07CisKKyAgICAgIC8vIEFkanVzdCBjdXJyZW50IGluZGV4IHRvIGxvb3AgYXJvdW5kIGluIHJpbmcgYnVmZmVyLgorICAgICAgaWYgKCsrX01fcCA+PSBsb25nX2xhZykKKwlfTV9wID0gMDsKKworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIGludCBfX3csIGludCBfX3MsIGludCBfX3IsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8X1JlYWxUeXBlLCBfX3csIF9fcywgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZCB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX3I7ICsrX19pKQorCWZvciAoaW50IF9faiA9IDA7IF9faiA8IF9feC5fX247ICsrX19qKQorCSAgX19vcyA8PCBfX3guX01feFtfX2ldW19fal0gPDwgX19zcGFjZTsKKyAgICAgIF9fb3MgPDwgX194Ll9NX2NhcnJ5OworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBpbnQgX193LCBpbnQgX19zLCBpbnQgX19yLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPF9SZWFsVHlwZSwgX193LCBfX3MsIF9fcj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fcjsgKytfX2kpCisJZm9yIChpbnQgX19qID0gMDsgX19qIDwgX194Ll9fbjsgKytfX2opCisJICBfX2lzID4+IF9feC5fTV94W19faV1bX19qXTsKKyAgICAgIF9faXMgPj4gX194Ll9NX2NhcnJ5OworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBpbnQgX19wLCBpbnQgX19yPgorICAgIGNvbnN0IGludAorICAgIGRpc2NhcmRfYmxvY2s8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIF9fcCwgX19yPjo6YmxvY2tfc2l6ZTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgaW50IF9fcCwgaW50IF9fcj4KKyAgICBjb25zdCBpbnQKKyAgICBkaXNjYXJkX2Jsb2NrPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBfX3AsIF9fcj46OnVzZWRfYmxvY2s7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGludCBfX3AsIGludCBfX3I+CisgICAgdHlwZW5hbWUgZGlzY2FyZF9ibG9jazxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwKKwkJCSAgIF9fcCwgX19yPjo6cmVzdWx0X3R5cGUKKyAgICBkaXNjYXJkX2Jsb2NrPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBfX3AsIF9fcj46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIGlmIChfTV9uID49IHVzZWRfYmxvY2spCisJeworCSAgd2hpbGUgKF9NX24gPCBibG9ja19zaXplKQorCSAgICB7CisJICAgICAgX01fYigpOworCSAgICAgICsrX01fbjsKKwkgICAgfQorCSAgX01fbiA9IDA7CisJfQorICAgICAgKytfTV9uOworICAgICAgcmV0dXJuIF9NX2IoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGludCBfX3AsIGludCBfX3IsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGRpc2NhcmRfYmxvY2s8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsCisJICAgICAgIF9fcCwgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZAorCQkgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgX19vcyA8PCBfX3guX01fYiA8PCBfX3NwYWNlIDw8IF9feC5fTV9uOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGludCBfX3AsIGludCBfX3IsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGRpc2NhcmRfYmxvY2s8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIF9fcCwgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX19pcyA+PiBfX3guX01fYiA+PiBfX3guX01fbjsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgaW50IF9fczEsCisJICAgY2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBpbnQgX19zMj4KKyAgICBjb25zdCBpbnQKKyAgICB4b3JfY29tYmluZTxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIF9fczEsCisJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgX19zMj46OnNoaWZ0MTsKKyAgICAgCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgaW50IF9fczEsCisJICAgY2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBpbnQgX19zMj4KKyAgICBjb25zdCBpbnQKKyAgICB4b3JfY29tYmluZTxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIF9fczEsCisJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgX19zMj46OnNoaWZ0MjsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIGludCBfX3MxLAorCSAgIGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgaW50IF9fczI+CisgICAgdm9pZAorICAgIHhvcl9jb21iaW5lPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgX19zMSwKKwkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBfX3MyPjo6CisgICAgX01faW5pdGlhbGl6ZV9tYXgoKQorICAgIHsKKyAgICAgIGNvbnN0IGludCBfX3cgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6ZGlnaXRzOworCisgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX20xID0KKwlzdGQ6Om1pbihyZXN1bHRfdHlwZShfTV9iMS5tYXgoKSAtIF9NX2IxLm1pbigpKSwKKwkJIF9fZGV0YWlsOjpfU2hpZnQ8cmVzdWx0X3R5cGUsIF9fdyAtIF9fczE+OjpfX3ZhbHVlIC0gMSk7CisKKyAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fbTIgPQorCXN0ZDo6bWluKHJlc3VsdF90eXBlKF9NX2IyLm1heCgpIC0gX01fYjIubWluKCkpLAorCQkgX19kZXRhaWw6Ol9TaGlmdDxyZXN1bHRfdHlwZSwgX193IC0gX19zMj46Ol9fdmFsdWUgLSAxKTsKKworICAgICAgLy8gTkI6IEluIFRSMSBzMSBpcyBub3QgcmVxdWlyZWQgdG8gYmUgPj0gczIuCisgICAgICBpZiAoX19zMSA8IF9fczIpCisJX01fbWF4ID0gX01faW5pdGlhbGl6ZV9tYXhfYXV4KF9fbTIsIF9fbTEsIF9fczIgLSBfX3MxKSA8PCBfX3MxOworICAgICAgZWxzZQorCV9NX21heCA9IF9NX2luaXRpYWxpemVfbWF4X2F1eChfX20xLCBfX20yLCBfX3MxIC0gX19zMikgPDwgX19zMjsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxLCBpbnQgX19zMSwKKwkgICBjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIsIGludCBfX3MyPgorICAgIHR5cGVuYW1lIHhvcl9jb21iaW5lPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgX19zMSwKKwkJCSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIsIF9fczI+OjpyZXN1bHRfdHlwZQorICAgIHhvcl9jb21iaW5lPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgX19zMSwKKwkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBfX3MyPjo6CisgICAgX01faW5pdGlhbGl6ZV9tYXhfYXV4KHJlc3VsdF90eXBlIF9fYSwgcmVzdWx0X3R5cGUgX19iLCBpbnQgX19kKQorICAgIHsKKyAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fdHdvMmQgPSByZXN1bHRfdHlwZSgxKSA8PCBfX2Q7CisgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX2MgPSBfX2EgKiBfX3R3bzJkOworCisgICAgICBpZiAoX19hID09IDAgfHwgX19iIDwgX190d28yZCkKKwlyZXR1cm4gX19jICsgX19iOworCisgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX3QgPSBzdGQ6Om1heChfX2MsIF9fYik7CisgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX3UgPSBzdGQ6Om1pbihfX2MsIF9fYik7CisKKyAgICAgIHJlc3VsdF90eXBlIF9fdWIgPSBfX3U7CisgICAgICByZXN1bHRfdHlwZSBfX3A7CisgICAgICBmb3IgKF9fcCA9IDA7IF9fdWIgIT0gMTsgX191YiA+Pj0gMSkKKwkrK19fcDsKKworICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX190d28ycCA9IHJlc3VsdF90eXBlKDEpIDw8IF9fcDsKKyAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fayA9IF9fdCAvIF9fdHdvMnA7CisKKyAgICAgIGlmIChfX2sgJiAxKQorCXJldHVybiAoX19rICsgMSkgKiBfX3R3bzJwIC0gMTsKKworICAgICAgaWYgKF9fYyA+PSBfX2IpCisJcmV0dXJuIChfX2sgKyAxKSAqIF9fdHdvMnAgKyBfTV9pbml0aWFsaXplX21heF9hdXgoKF9fdCAlIF9fdHdvMnApCisJCQkJCQkJICAgLyBfX3R3bzJkLAorCQkJCQkJCSAgIF9fdSAlIF9fdHdvMnAsIF9fZCk7CisgICAgICBlbHNlCisJcmV0dXJuIChfX2sgKyAxKSAqIF9fdHdvMnAgKyBfTV9pbml0aWFsaXplX21heF9hdXgoKF9fdSAlIF9fdHdvMnApCisJCQkJCQkJICAgLyBfX3R3bzJkLAorCQkJCQkJCSAgIF9fdCAlIF9fdHdvMnAsIF9fZCk7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgaW50IF9fczEsCisJICAgY2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBpbnQgX19zMiwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgeG9yX2NvbWJpbmU8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxLCBfX3MxLAorCSAgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIsIF9fczI+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OmZpeGVkIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisKKyAgICAgIF9fb3MgPDwgX194LmJhc2UxKCkgPDwgX19zcGFjZSA8PCBfX3guYmFzZTIoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgcmV0dXJuIF9fb3M7IAorICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIGludCBfX3MxLAorCSAgIGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgaW50IF9fczIsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHhvcl9jb21iaW5lPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgX19zMSwKKwkgICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBfX3MyPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX19pcyA+PiBfX3guX01fYjEgPj4gX194Ll9NX2IyOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSB1bmlmb3JtX2ludDxfSW50VHlwZT46OnJlc3VsdF90eXBlCisgICAgICB1bmlmb3JtX2ludDxfSW50VHlwZT46OgorICAgICAgX01fY2FsbChfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCSAgICAgIHJlc3VsdF90eXBlIF9fbWluLCByZXN1bHRfdHlwZSBfX21heCwgdHJ1ZV90eXBlKQorICAgICAgeworCS8vIFhYWCBNdXN0IGJlIGZpeGVkIHRvIHdvcmsgd2VsbCBmb3IgKmFyYml0cmFyeSogX191cm5nLm1heCgpLAorCS8vIF9fdXJuZy5taW4oKSwgX19tYXgsIF9fbWluLiAgQ3VycmVudGx5IHdvcmtzIGZpbmUgb25seSBpbiB0aGUKKwkvLyBtb3N0IGNvbW1vbiBjYXNlIF9fdXJuZy5tYXgoKSAtIF9fdXJuZy5taW4oKSA+PSBfX21heCAtIF9fbWluLAorCS8vIHdpdGggX191cm5nLm1heCgpID4gX191cm5nLm1pbigpID49IDAuCisJdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fYWRkX3Vuc2lnbmVkPHR5cGVuYW1lCisJICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjo6cmVzdWx0X3R5cGU+OjpfX3R5cGUgX191cm50eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2FkZF91bnNpZ25lZDxyZXN1bHRfdHlwZT46Ol9fdHlwZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdXR5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTwoc2l6ZW9mKF9fdXJudHlwZSkKKwkJCQkJCQk+IHNpemVvZihfX3V0eXBlKSksCisJICBfX3VybnR5cGUsIF9fdXR5cGU+OjpfX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgX191Y3R5cGU7CisKKwlyZXN1bHRfdHlwZSBfX3JldDsKKworCWNvbnN0IF9fdXJudHlwZSBfX3Vybm1pbiA9IF9fdXJuZy5taW4oKTsKKwljb25zdCBfX3VybnR5cGUgX191cm5tYXggPSBfX3VybmcubWF4KCk7CisJY29uc3QgX191cm50eXBlIF9fdXJucmFuZ2UgPSBfX3Vybm1heCAtIF9fdXJubWluOworCWNvbnN0IF9fdWN0eXBlIF9fdXJhbmdlID0gX19tYXggLSBfX21pbjsKKwljb25zdCBfX3VjdHlwZSBfX3VkZW5vbSA9IChfX3VybnJhbmdlIDw9IF9fdXJhbmdlCisJCQkJICAgPyAxIDogX191cm5yYW5nZSAvIChfX3VyYW5nZSArIDEpKTsKKwlkbworCSAgX19yZXQgPSAoX191cm50eXBlKF9fdXJuZygpKSAtICBfX3Vybm1pbikgLyBfX3VkZW5vbTsKKwl3aGlsZSAoX19yZXQgPiBfX21heCAtIF9fbWluKTsKKworCXJldHVybiBfX3JldCArIF9fbWluOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgdW5pZm9ybV9pbnQ8X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgX19vcyA8PCBfX3gubWluKCkgPDwgX19zcGFjZSA8PCBfX3gubWF4KCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHVuaWZvcm1faW50PF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX19pcyA+PiBfX3guX01fbWluID4+IF9feC5fTV9tYXg7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBiZXJub3VsbGlfZGlzdHJpYnV0aW9uJiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fb3Mud2lkZW4oJyAnKSk7CisgICAgICBfX29zLnByZWNpc2lvbihfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8ZG91YmxlPjo6X19tYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5wKCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlLCBfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZSwgX1JlYWxUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7CisJLy8gQWJvdXQgdGhlIGVwc2lsb24gdGhpbmcgc2VlIHRoaXMgdGhyZWFkOgorICAgICAgICAvLyBodHRwOi8vZ2NjLmdudS5vcmcvbWwvZ2NjLXBhdGNoZXMvMjAwNi0xMC9tc2cwMDk3MS5odG1sCisJY29uc3QgX1JlYWxUeXBlIF9fbmFmID0KKwkgICgxIC0gc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjplcHNpbG9uKCkpIC8gMjsKKwkvLyBUaGUgbGFyZ2VzdCBfUmVhbFR5cGUgY29udmVydGlibGUgdG8gX0ludFR5cGUuCisJY29uc3QgX1JlYWxUeXBlIF9fdGhyID0KKwkgIHN0ZDo6bnVtZXJpY19saW1pdHM8X0ludFR5cGU+OjptYXgoKSArIF9fbmFmOworCisJX1JlYWxUeXBlIF9fY2FuZDsKKwlkbworCSAgX19jYW5kID0gc3RkOjpjZWlsKHN0ZDo6bG9nKF9fdXJuZygpKSAvIF9NX2xvZ19wKTsKKwl3aGlsZSAoX19jYW5kID49IF9fdGhyKTsKKworCXJldHVybiByZXN1bHRfdHlwZShfX2NhbmQgKyBfX25hZik7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9SZWFsVHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZSwgX1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX29zLndpZGVuKCcgJykpOworICAgICAgX19vcy5wcmVjaXNpb24oX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPF9SZWFsVHlwZT46Ol9fbWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gucCgpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHZvaWQKKyAgICBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZSwgX1JlYWxUeXBlPjo6CisgICAgX01faW5pdGlhbGl6ZSgpCisgICAgeworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIGlmIChfTV9tZWFuID49IDEyKQorCXsKKwkgIGNvbnN0IF9SZWFsVHlwZSBfX20gPSBzdGQ6OmZsb29yKF9NX21lYW4pOworCSAgX01fbG1fdGhyID0gc3RkOjpsb2coX01fbWVhbik7CisJICBfTV9sZm0gPSBzdGQ6OnRyMTo6bGdhbW1hKF9fbSArIDEpOworCSAgX01fc20gPSBzdGQ6OnNxcnQoX19tKTsKKworCSAgY29uc3QgX1JlYWxUeXBlIF9fcGlfNCA9IDAuNzg1Mzk4MTYzMzk3NDQ4MzA5NjE1NjYwODQ1ODE5ODc1N0w7CisJICBjb25zdCBfUmVhbFR5cGUgX19keCA9IHN0ZDo6c3FydCgyICogX19tICogc3RkOjpsb2coMzIgKiBfX20KKwkJCQkJCQkgICAgICAvIF9fcGlfNCkpOworCSAgX01fZCA9IHN0ZDo6dHIxOjpyb3VuZChzdGQ6Om1heChfUmVhbFR5cGUoNiksCisJCQkJCSAgc3RkOjptaW4oX19tLCBfX2R4KSkpOworCSAgY29uc3QgX1JlYWxUeXBlIF9fY3ggPSAyICogX19tICsgX01fZDsKKwkgIF9NX3NjeCA9IHN0ZDo6c3FydChfX2N4IC8gMik7CisJICBfTV8xY3ggPSAxIC8gX19jeDsKKworCSAgX01fYzJiID0gc3RkOjpzcXJ0KF9fcGlfNCAqIF9fY3gpICogc3RkOjpleHAoX01fMWN4KTsKKwkgIF9NX2NiID0gMiAqIF9fY3ggKiBzdGQ6OmV4cCgtX01fZCAqIF9NXzFjeCAqICgxICsgX01fZCAvIDIpKSAvIF9NX2Q7CisJfQorICAgICAgZWxzZQorI2VuZGlmCisJX01fbG1fdGhyID0gc3RkOjpleHAoLV9NX21lYW4pOworICAgICAgfQorCisgIC8qKgorICAgKiBBIHJlamVjdGlvbiBhbGdvcml0aG0gd2hlbiBtZWFuID49IDEyIGFuZCBhIHNpbXBsZSBtZXRob2QgYmFzZWQKKyAgICogdXBvbiB0aGUgbXVsdGlwbGljYXRpb24gb2YgdW5pZm9ybSByYW5kb20gdmFyaWF0ZXMgb3RoZXJ3aXNlLgorICAgKiBOQjogVGhlIGZvcm1lciBpcyBhdmFpbGFibGUgb25seSBpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAqIGlzIGRlZmluZWQuCisgICAqCisgICAqIFJlZmVyZW5jZToKKyAgICogRGV2cm95ZSwgTC4gTm9uLVVuaWZvcm0gUmFuZG9tIFZhcmlhdGVzIEdlbmVyYXRpb24uIFNwcmluZ2VyLVZlcmxhZywKKyAgICogTmV3IFlvcmssIDE5ODYsIENoLiBYLCBTZWN0cy4gMy4zICYgMy40ICgrIEVycmF0YSEpLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlLCBfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgeworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKwlpZiAoX01fbWVhbiA+PSAxMikKKwkgIHsKKwkgICAgX1JlYWxUeXBlIF9feDsKKworCSAgICAvLyBTZWUgY29tbWVudHMgYWJvdmUuLi4KKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fbmFmID0KKwkgICAgICAoMSAtIHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6ZXBzaWxvbigpKSAvIDI7CisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3RociA9CisJICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxfSW50VHlwZT46Om1heCgpICsgX19uYWY7CisKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fbSA9IHN0ZDo6Zmxvb3IoX01fbWVhbik7CisJICAgIC8vIHNxcnQocGkgLyAyKQorCSAgICBjb25zdCBfUmVhbFR5cGUgX19zcGlfMiA9IDEuMjUzMzE0MTM3MzE1NTAwMjUxMjA3ODgyNjQyNDA1NTIyNkw7CisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX2MxID0gX01fc20gKiBfX3NwaV8yOworCSAgICBjb25zdCBfUmVhbFR5cGUgX19jMiA9IF9NX2MyYiArIF9fYzE7IAorCSAgICBjb25zdCBfUmVhbFR5cGUgX19jMyA9IF9fYzIgKyAxOworCSAgICBjb25zdCBfUmVhbFR5cGUgX19jNCA9IF9fYzMgKyAxOworCSAgICAvLyBlXigxIC8gNzgpCisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX2UxNzggPSAxLjAxMjkwMzA0NzkzMjAwMTg1ODMxODU1MTQ3Nzc1MTI5ODNMOworCSAgICBjb25zdCBfUmVhbFR5cGUgX19jNSA9IF9fYzQgKyBfX2UxNzg7CisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX2MgPSBfTV9jYiArIF9fYzU7CisJICAgIGNvbnN0IF9SZWFsVHlwZSBfXzJjeCA9IDIgKiAoMiAqIF9fbSArIF9NX2QpOworCisJICAgIGJvb2wgX19yZWplY3QgPSB0cnVlOworCSAgICBkbworCSAgICAgIHsKKwkJY29uc3QgX1JlYWxUeXBlIF9fdSA9IF9fYyAqIF9fdXJuZygpOworCQljb25zdCBfUmVhbFR5cGUgX19lID0gLXN0ZDo6bG9nKF9fdXJuZygpKTsKKworCQlfUmVhbFR5cGUgX193ID0gMC4wOworCQkKKwkJaWYgKF9fdSA8PSBfX2MxKQorCQkgIHsKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX24gPSBfTV9uZChfX3VybmcpOworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9feSA9IC1zdGQ6OmFicyhfX24pICogX01fc20gLSAxOworCQkgICAgX194ID0gc3RkOjpmbG9vcihfX3kpOworCQkgICAgX193ID0gLV9fbiAqIF9fbiAvIDI7CisJCSAgICBpZiAoX194IDwgLV9fbSkKKwkJICAgICAgY29udGludWU7CisJCSAgfQorCQllbHNlIGlmIChfX3UgPD0gX19jMikKKwkJICB7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX19uID0gX01fbmQoX191cm5nKTsKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3kgPSAxICsgc3RkOjphYnMoX19uKSAqIF9NX3NjeDsKKwkJICAgIF9feCA9IHN0ZDo6Y2VpbChfX3kpOworCQkgICAgX193ID0gX195ICogKDIgLSBfX3kpICogX01fMWN4OworCQkgICAgaWYgKF9feCA+IF9NX2QpCisJCSAgICAgIGNvbnRpbnVlOworCQkgIH0KKwkJZWxzZSBpZiAoX191IDw9IF9fYzMpCisJCSAgLy8gTkI6IFRoaXMgY2FzZSBub3QgaW4gdGhlIGJvb2ssIG5vciBpbiB0aGUgRXJyYXRhLAorCQkgIC8vIGJ1dCBzaG91bGQgYmUgb2suLi4KKwkJICBfX3ggPSAtMTsKKwkJZWxzZSBpZiAoX191IDw9IF9fYzQpCisJCSAgX194ID0gMDsKKwkJZWxzZSBpZiAoX191IDw9IF9fYzUpCisJCSAgX194ID0gMTsKKwkJZWxzZQorCQkgIHsKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3YgPSAtc3RkOjpsb2coX191cm5nKCkpOworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9feSA9IF9NX2QgKyBfX3YgKiBfXzJjeCAvIF9NX2Q7CisJCSAgICBfX3ggPSBzdGQ6OmNlaWwoX195KTsKKwkJICAgIF9fdyA9IC1fTV9kICogX01fMWN4ICogKDEgKyBfX3kgLyAyKTsKKwkJICB9CisKKwkJX19yZWplY3QgPSAoX193IC0gX19lIC0gX194ICogX01fbG1fdGhyCisJCQkgICAgPiBfTV9sZm0gLSBzdGQ6OnRyMTo6bGdhbW1hKF9feCArIF9fbSArIDEpKTsKKworCQlfX3JlamVjdCB8PSBfX3ggKyBfX20gPj0gX190aHI7CisKKwkgICAgICB9IHdoaWxlIChfX3JlamVjdCk7CisKKwkgICAgcmV0dXJuIHJlc3VsdF90eXBlKF9feCArIF9fbSArIF9fbmFmKTsKKwkgIH0KKwllbHNlCisjZW5kaWYKKwkgIHsKKwkgICAgX0ludFR5cGUgICAgIF9feCA9IDA7CisJICAgIF9SZWFsVHlwZSBfX3Byb2QgPSAxLjA7CisKKwkgICAgZG8KKwkgICAgICB7CisJCV9fcHJvZCAqPSBfX3VybmcoKTsKKwkJX194ICs9IDE7CisJICAgICAgfQorCSAgICB3aGlsZSAoX19wcm9kID4gX01fbG1fdGhyKTsKKworCSAgICByZXR1cm4gX194IC0gMTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX1JlYWxUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZSwgX1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPF9SZWFsVHlwZT46Ol9fbWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gubWVhbigpIDw8IF9fc3BhY2UgPDwgX194Ll9NX25kOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9SZWFsVHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9faXMgPj4gX194Ll9NX21lYW4gPj4gX194Ll9NX25kOworICAgICAgX194Ll9NX2luaXRpYWxpemUoKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdm9pZAorICAgIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZSwgX1JlYWxUeXBlPjo6CisgICAgX01faW5pdGlhbGl6ZSgpCisgICAgeworICAgICAgY29uc3QgX1JlYWxUeXBlIF9fcDEyID0gX01fcCA8PSAwLjUgPyBfTV9wIDogMS4wIC0gX01fcDsKKworICAgICAgX01fZWFzeSA9IHRydWU7CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBpZiAoX01fdCAqIF9fcDEyID49IDgpCisJeworCSAgX01fZWFzeSA9IGZhbHNlOworCSAgY29uc3QgX1JlYWxUeXBlIF9fbnAgPSBzdGQ6OmZsb29yKF9NX3QgKiBfX3AxMik7CisJICBjb25zdCBfUmVhbFR5cGUgX19wYSA9IF9fbnAgLyBfTV90OworCSAgY29uc3QgX1JlYWxUeXBlIF9fMXAgPSAxIC0gX19wYTsKKwkgIAorCSAgY29uc3QgX1JlYWxUeXBlIF9fcGlfNCA9IDAuNzg1Mzk4MTYzMzk3NDQ4MzA5NjE1NjYwODQ1ODE5ODc1N0w7CisJICBjb25zdCBfUmVhbFR5cGUgX19kMXggPQorCSAgICBzdGQ6OnNxcnQoX19ucCAqIF9fMXAgKiBzdGQ6OmxvZygzMiAqIF9fbnAKKwkJCQkJICAgICAvICg4MSAqIF9fcGlfNCAqIF9fMXApKSk7CisJICBfTV9kMSA9IHN0ZDo6dHIxOjpyb3VuZChzdGQ6Om1heChfUmVhbFR5cGUoMSksIF9fZDF4KSk7CisJICBjb25zdCBfUmVhbFR5cGUgX19kMnggPQorCSAgICBzdGQ6OnNxcnQoX19ucCAqIF9fMXAgKiBzdGQ6OmxvZygzMiAqIF9NX3QgKiBfXzFwCisJCQkJCSAgICAgLyAoX19waV80ICogX19wYSkpKTsKKwkgIF9NX2QyID0gc3RkOjp0cjE6OnJvdW5kKHN0ZDo6bWF4KF9SZWFsVHlwZSgxKSwgX19kMngpKTsKKwkgIAorCSAgLy8gc3FydChwaSAvIDIpCisJICBjb25zdCBfUmVhbFR5cGUgX19zcGlfMiA9IDEuMjUzMzE0MTM3MzE1NTAwMjUxMjA3ODgyNjQyNDA1NTIyNkw7CisJICBfTV9zMSA9IHN0ZDo6c3FydChfX25wICogX18xcCkgKiAoMSArIF9NX2QxIC8gKDQgKiBfX25wKSk7CisJICBfTV9zMiA9IHN0ZDo6c3FydChfX25wICogX18xcCkgKiAoMSArIF9NX2QyIC8gKDQgKiBfTV90ICogX18xcCkpOworCSAgX01fYyA9IDIgKiBfTV9kMSAvIF9fbnA7CisJICBfTV9hMSA9IHN0ZDo6ZXhwKF9NX2MpICogX01fczEgKiBfX3NwaV8yOworCSAgY29uc3QgX1JlYWxUeXBlIF9fYTEyID0gX01fYTEgKyBfTV9zMiAqIF9fc3BpXzI7CisJICBjb25zdCBfUmVhbFR5cGUgX19zMXMgPSBfTV9zMSAqIF9NX3MxOworCSAgX01fYTEyMyA9IF9fYTEyICsgKHN0ZDo6ZXhwKF9NX2QxIC8gKF9NX3QgKiBfXzFwKSkKKwkJCSAgICAgKiAyICogX19zMXMgLyBfTV9kMQorCQkJICAgICAqIHN0ZDo6ZXhwKC1fTV9kMSAqIF9NX2QxIC8gKDIgKiBfX3MxcykpKTsKKwkgIGNvbnN0IF9SZWFsVHlwZSBfX3MycyA9IF9NX3MyICogX01fczI7CisJICBfTV9zID0gKF9NX2ExMjMgKyAyICogX19zMnMgLyBfTV9kMgorCQkgICogc3RkOjpleHAoLV9NX2QyICogX01fZDIgLyAoMiAqIF9fczJzKSkpOworCSAgX01fbGYgPSAoc3RkOjp0cjE6OmxnYW1tYShfX25wICsgMSkKKwkJICAgKyBzdGQ6OnRyMTo6bGdhbW1hKF9NX3QgLSBfX25wICsgMSkpOworCSAgX01fbHAxcCA9IHN0ZDo6bG9nKF9fcGEgLyBfXzFwKTsKKworCSAgX01fcSA9IC1zdGQ6OmxvZygxIC0gKF9fcDEyIC0gX19wYSkgLyBfXzFwKTsKKwl9CisgICAgICBlbHNlCisjZW5kaWYKKwlfTV9xID0gLXN0ZDo6bG9nKDEgLSBfX3AxMik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT46OgorICAgICAgX01fd2FpdGluZyhfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLCBfSW50VHlwZSBfX3QpCisgICAgICB7CisJX0ludFR5cGUgICAgX194ID0gMDsKKwlfUmVhbFR5cGUgX19zdW0gPSAwOworCisJZG8KKwkgIHsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fZSA9IC1zdGQ6OmxvZyhfX3VybmcoKSk7CisJICAgIF9fc3VtICs9IF9fZSAvIChfX3QgLSBfX3gpOworCSAgICBfX3ggKz0gMTsKKwkgIH0KKwl3aGlsZSAoX19zdW0gPD0gX01fcSk7CisKKwlyZXR1cm4gX194IC0gMTsKKyAgICAgIH0KKworICAvKioKKyAgICogQSByZWplY3Rpb24gYWxnb3JpdGhtIHdoZW4gdCAqIHAgPj0gOCBhbmQgYSBzaW1wbGUgd2FpdGluZyB0aW1lCisgICAqIG1ldGhvZCAtIHRoZSBzZWNvbmQgaW4gdGhlIHJlZmVyZW5jZWQgYm9vayAtIG90aGVyd2lzZS4KKyAgICogTkI6IFRoZSBmb3JtZXIgaXMgYXZhaWxhYmxlIG9ubHkgaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgKiBpcyBkZWZpbmVkLgorICAgKgorICAgKiBSZWZlcmVuY2U6CisgICAqIERldnJveWUsIEwuIE5vbi1Vbmlmb3JtIFJhbmRvbSBWYXJpYXRlcyBHZW5lcmF0aW9uLiBTcHJpbmdlci1WZXJsYWcsCisgICAqIE5ldyBZb3JrLCAxOTg2LCBDaC4gWCwgU2VjdC4gNCAoKyBFcnJhdGEhKS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgeworCXJlc3VsdF90eXBlIF9fcmV0OworCWNvbnN0IF9SZWFsVHlwZSBfX3AxMiA9IF9NX3AgPD0gMC41ID8gX01fcCA6IDEuMCAtIF9NX3A7CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJaWYgKCFfTV9lYXN5KQorCSAgeworCSAgICBfUmVhbFR5cGUgX194OworCisJICAgIC8vIFNlZSBjb21tZW50cyBhYm92ZS4uLgorCSAgICBjb25zdCBfUmVhbFR5cGUgX19uYWYgPQorCSAgICAgICgxIC0gc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjplcHNpbG9uKCkpIC8gMjsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fdGhyID0KKwkgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPF9JbnRUeXBlPjo6bWF4KCkgKyBfX25hZjsKKworCSAgICBjb25zdCBfUmVhbFR5cGUgX19ucCA9IHN0ZDo6Zmxvb3IoX01fdCAqIF9fcDEyKTsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fcGEgPSBfX25wIC8gX01fdDsKKworCSAgICAvLyBzcXJ0KHBpIC8gMikKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fc3BpXzIgPSAxLjI1MzMxNDEzNzMxNTUwMDI1MTIwNzg4MjY0MjQwNTUyMjZMOworCSAgICBjb25zdCBfUmVhbFR5cGUgX19hMSA9IF9NX2ExOworCSAgICBjb25zdCBfUmVhbFR5cGUgX19hMTIgPSBfX2ExICsgX01fczIgKiBfX3NwaV8yOworCSAgICBjb25zdCBfUmVhbFR5cGUgX19hMTIzID0gX01fYTEyMzsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fczFzID0gX01fczEgKiBfTV9zMTsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fczJzID0gX01fczIgKiBfTV9zMjsKKworCSAgICBib29sIF9fcmVqZWN0OworCSAgICBkbworCSAgICAgIHsKKwkJY29uc3QgX1JlYWxUeXBlIF9fdSA9IF9NX3MgKiBfX3VybmcoKTsKKworCQlfUmVhbFR5cGUgX192OworCisJCWlmIChfX3UgPD0gX19hMSkKKwkJICB7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX19uID0gX01fbmQoX191cm5nKTsKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3kgPSBfTV9zMSAqIHN0ZDo6YWJzKF9fbik7CisJCSAgICBfX3JlamVjdCA9IF9feSA+PSBfTV9kMTsKKwkJICAgIGlmICghX19yZWplY3QpCisJCSAgICAgIHsKKwkJCWNvbnN0IF9SZWFsVHlwZSBfX2UgPSAtc3RkOjpsb2coX191cm5nKCkpOworCQkJX194ID0gc3RkOjpmbG9vcihfX3kpOworCQkJX192ID0gLV9fZSAtIF9fbiAqIF9fbiAvIDIgKyBfTV9jOworCQkgICAgICB9CisJCSAgfQorCQllbHNlIGlmIChfX3UgPD0gX19hMTIpCisJCSAgeworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9fbiA9IF9NX25kKF9fdXJuZyk7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX195ID0gX01fczIgKiBzdGQ6OmFicyhfX24pOworCQkgICAgX19yZWplY3QgPSBfX3kgPj0gX01fZDI7CisJCSAgICBpZiAoIV9fcmVqZWN0KQorCQkgICAgICB7CisJCQljb25zdCBfUmVhbFR5cGUgX19lID0gLXN0ZDo6bG9nKF9fdXJuZygpKTsKKwkJCV9feCA9IHN0ZDo6Zmxvb3IoLV9feSk7CisJCQlfX3YgPSAtX19lIC0gX19uICogX19uIC8gMjsKKwkJICAgICAgfQorCQkgIH0KKwkJZWxzZSBpZiAoX191IDw9IF9fYTEyMykKKwkJICB7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX19lMSA9IC1zdGQ6OmxvZyhfX3VybmcoKSk7CQkgICAgCisJCSAgICBjb25zdCBfUmVhbFR5cGUgX19lMiA9IC1zdGQ6OmxvZyhfX3VybmcoKSk7CisKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3kgPSBfTV9kMSArIDIgKiBfX3MxcyAqIF9fZTEgLyBfTV9kMTsKKwkJICAgIF9feCA9IHN0ZDo6Zmxvb3IoX195KTsKKwkJICAgIF9fdiA9ICgtX19lMiArIF9NX2QxICogKDEgLyAoX01fdCAtIF9fbnApCisJCQkJCSAgICAtX195IC8gKDIgKiBfX3MxcykpKTsKKwkJICAgIF9fcmVqZWN0ID0gZmFsc2U7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9fZTEgPSAtc3RkOjpsb2coX191cm5nKCkpOwkJICAgIAorCQkgICAgY29uc3QgX1JlYWxUeXBlIF9fZTIgPSAtc3RkOjpsb2coX191cm5nKCkpOworCisJCSAgICBjb25zdCBfUmVhbFR5cGUgX195ID0gX01fZDIgKyAyICogX19zMnMgKiBfX2UxIC8gX01fZDI7CisJCSAgICBfX3ggPSBzdGQ6OmZsb29yKC1fX3kpOworCQkgICAgX192ID0gLV9fZTIgLSBfTV9kMiAqIF9feSAvICgyICogX19zMnMpOworCQkgICAgX19yZWplY3QgPSBmYWxzZTsKKwkJICB9CisKKwkJX19yZWplY3QgPSBfX3JlamVjdCB8fCBfX3ggPCAtX19ucCB8fCBfX3ggPiBfTV90IC0gX19ucDsKKwkJaWYgKCFfX3JlamVjdCkKKwkJICB7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX19sZnggPQorCQkgICAgICBzdGQ6OnRyMTo6bGdhbW1hKF9fbnAgKyBfX3ggKyAxKQorCQkgICAgICArIHN0ZDo6dHIxOjpsZ2FtbWEoX01fdCAtIChfX25wICsgX194KSArIDEpOworCQkgICAgX19yZWplY3QgPSBfX3YgPiBfTV9sZiAtIF9fbGZ4ICsgX194ICogX01fbHAxcDsKKwkJICB9CisKKwkJX19yZWplY3QgfD0gX194ICsgX19ucCA+PSBfX3RocjsKKwkgICAgICB9CisJICAgIHdoaWxlIChfX3JlamVjdCk7CisKKwkgICAgX194ICs9IF9fbnAgKyBfX25hZjsKKworCSAgICBjb25zdCBfSW50VHlwZSBfX3ogPSBfTV93YWl0aW5nKF9fdXJuZywgX01fdCAtIF9JbnRUeXBlKF9feCkpOyAKKwkgICAgX19yZXQgPSBfSW50VHlwZShfX3gpICsgX196OworCSAgfQorCWVsc2UKKyNlbmRpZgorCSAgX19yZXQgPSBfTV93YWl0aW5nKF9fdXJuZywgX01fdCk7CisKKwlpZiAoX19wMTIgIT0gX01fcCkKKwkgIF9fcmV0ID0gX01fdCAtIF9fcmV0OworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX1JlYWxUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfUmVhbFR5cGU+OjpfX21heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LnQoKSA8PCBfX3NwYWNlIDw8IF9feC5wKCkgCisJICAgPDwgX19zcGFjZSA8PCBfX3guX01fbmQ7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX1JlYWxUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9faXMgPj4gX194Ll9NX3QgPj4gX194Ll9NX3AgPj4gX194Ll9NX25kOworICAgICAgX194Ll9NX2luaXRpYWxpemUoKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHVuaWZvcm1fcmVhbDxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1JlYWxUeXBlPjo6X19tYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5taW4oKSA8PCBfX3NwYWNlIDw8IF9feC5tYXgoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHVuaWZvcm1fcmVhbDxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfX2lzID4+IF9feC5fTV9taW4gPj4gX194Ll9NX21heDsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fb3Mud2lkZW4oJyAnKSk7CisgICAgICBfX29zLnByZWNpc2lvbihfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1JlYWxUeXBlPjo6X19tYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5sYW1iZGEoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisKKyAgLyoqCisgICAqIFBvbGFyIG1ldGhvZCBkdWUgdG8gTWFyc2FnbGlhLgorICAgKgorICAgKiBEZXZyb3llLCBMLiBOb24tVW5pZm9ybSBSYW5kb20gVmFyaWF0ZXMgR2VuZXJhdGlvbi4gU3ByaW5nZXItVmVybGFnLAorICAgKiBOZXcgWW9yaywgMTk4NiwgQ2guIFYsIFNlY3QuIDQuNC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7CisJcmVzdWx0X3R5cGUgX19yZXQ7CisKKwlpZiAoX01fc2F2ZWRfYXZhaWxhYmxlKQorCSAgeworCSAgICBfTV9zYXZlZF9hdmFpbGFibGUgPSBmYWxzZTsKKwkgICAgX19yZXQgPSBfTV9zYXZlZDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHJlc3VsdF90eXBlIF9feCwgX195LCBfX3IyOworCSAgICBkbworCSAgICAgIHsKKwkJX194ID0gcmVzdWx0X3R5cGUoMi4wKSAqIF9fdXJuZygpIC0gMS4wOworCQlfX3kgPSByZXN1bHRfdHlwZSgyLjApICogX191cm5nKCkgLSAxLjA7CisJCV9fcjIgPSBfX3ggKiBfX3ggKyBfX3kgKiBfX3k7CisJICAgICAgfQorCSAgICB3aGlsZSAoX19yMiA+IDEuMCB8fCBfX3IyID09IDAuMCk7CisKKwkgICAgY29uc3QgcmVzdWx0X3R5cGUgX19tdWx0ID0gc3RkOjpzcXJ0KC0yICogc3RkOjpsb2coX19yMikgLyBfX3IyKTsKKwkgICAgX01fc2F2ZWQgPSBfX3ggKiBfX211bHQ7CisJICAgIF9NX3NhdmVkX2F2YWlsYWJsZSA9IHRydWU7CisJICAgIF9fcmV0ID0gX195ICogX19tdWx0OworCSAgfQorCQorCV9fcmV0ID0gX19yZXQgKiBfTV9zaWdtYSArIF9NX21lYW47CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPF9SZWFsVHlwZT46Ol9fbWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guX01fc2F2ZWRfYXZhaWxhYmxlIDw8IF9fc3BhY2UKKwkgICA8PCBfX3gubWVhbigpIDw8IF9fc3BhY2UKKwkgICA8PCBfX3guc2lnbWEoKTsKKyAgICAgIGlmIChfX3guX01fc2F2ZWRfYXZhaWxhYmxlKQorCV9fb3MgPDwgX19zcGFjZSA8PCBfX3guX01fc2F2ZWQ7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9faXMgPj4gX194Ll9NX3NhdmVkX2F2YWlsYWJsZSA+PiBfX3guX01fbWVhbgorCSAgID4+IF9feC5fTV9zaWdtYTsKKyAgICAgIGlmIChfX3guX01fc2F2ZWRfYXZhaWxhYmxlKQorCV9faXMgPj4gX194Ll9NX3NhdmVkOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHZvaWQKKyAgICBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgX01faW5pdGlhbGl6ZSgpCisgICAgeworICAgICAgaWYgKF9NX2FscGhhID49IDEpCisJX01fbF9kID0gc3RkOjpzcXJ0KDIgKiBfTV9hbHBoYSAtIDEpOworICAgICAgZWxzZQorCV9NX2xfZCA9IChzdGQ6OnBvdyhfTV9hbHBoYSwgX01fYWxwaGEgLyAoMSAtIF9NX2FscGhhKSkKKwkJICAqICgxIC0gX01fYWxwaGEpKTsKKyAgICB9CisKKyAgLyoqCisgICAqIENoZW5nJ3MgcmVqZWN0aW9uIGFsZ29yaXRobSBHQiBmb3IgYWxwaGEgPj0gMSBhbmQgYSBtb2RpZmljYXRpb24KKyAgICogb2YgVmFkdXZhJ3MgcmVqZWN0aW9uIGZyb20gV2VpYnVsbCBhbGdvcml0aG0gZHVlIHRvIERldnJveWUgZm9yCisgICAqIGFscGhhIDwgMS4KKyAgICoKKyAgICogUmVmZXJlbmNlczoKKyAgICogQ2hlbmcsIFIuIEMuIFRoZSBHZW5lcmF0aW9uIG9mIEdhbW1hIFJhbmRvbSBWYXJpYWJsZXMgd2l0aCBOb24taW50ZWdyYWwKKyAgICogU2hhcGUgUGFyYW1ldGVyLiBBcHBsaWVkIFN0YXRpc3RpY3MsIDI2LCA3MS03NSwgMTk3Ny4KKyAgICoKKyAgICogVmFkdXZhLCBJLiBDb21wdXRlciBHZW5lcmF0aW9uIG9mIEdhbW1hIEdhbmRvbSBWYXJpYWJsZXMgYnkgUmVqZWN0aW9uCisgICAqIGFuZCBDb21wb3NpdGlvbiBQcm9jZWR1cmVzLiBNYXRoLiBPcGVyYXRpb25zZm9yc2NodW5nIGFuZCBTdGF0aXN0aWssCisgICAqIFNlcmllcyBpbiBTdGF0aXN0aWNzLCA4LCA1NDUtNTc2LCAxOTc3LgorICAgKgorICAgKiBEZXZyb3llLCBMLiBOb24tVW5pZm9ybSBSYW5kb20gVmFyaWF0ZXMgR2VuZXJhdGlvbi4gU3ByaW5nZXItVmVybGFnLAorICAgKiBOZXcgWW9yaywgMTk4NiwgQ2guIElYLCBTZWN0LiAzLjQgKCsgRXJyYXRhISkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgIHsKKwlyZXN1bHRfdHlwZSBfX3g7CisKKwlib29sIF9fcmVqZWN0OworCWlmIChfTV9hbHBoYSA+PSAxKQorCSAgeworCSAgICAvLyBhbHBoYSAtIGxvZyg0KQorCSAgICBjb25zdCByZXN1bHRfdHlwZSBfX2IgPSBfTV9hbHBoYQorCSAgICAgIC0gcmVzdWx0X3R5cGUoMS4zODYyOTQzNjExMTk4OTA2MTg4MzQ0NjQyNDI5MTYzNTMxTCk7CisJICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fYyA9IF9NX2FscGhhICsgX01fbF9kOworCSAgICBjb25zdCByZXN1bHRfdHlwZSBfXzFsID0gMSAvIF9NX2xfZDsKKworCSAgICAvLyAxICsgbG9nKDkgLyAyKQorCSAgICBjb25zdCByZXN1bHRfdHlwZSBfX2sgPSAyLjUwNDA3NzM5Njc3NjI3NDA3MzM3MzI1ODM1MjM4Njg3NDhMOworCisJICAgIGRvCisJICAgICAgeworCQljb25zdCByZXN1bHRfdHlwZSBfX3UgPSBfX3VybmcoKTsKKwkJY29uc3QgcmVzdWx0X3R5cGUgX192ID0gX191cm5nKCk7CisKKwkJY29uc3QgcmVzdWx0X3R5cGUgX195ID0gX18xbCAqIHN0ZDo6bG9nKF9fdiAvICgxIC0gX192KSk7CisJCV9feCA9IF9NX2FscGhhICogc3RkOjpleHAoX195KTsKKworCQljb25zdCByZXN1bHRfdHlwZSBfX3ogPSBfX3UgKiBfX3YgKiBfX3Y7CisJCWNvbnN0IHJlc3VsdF90eXBlIF9fciA9IF9fYiArIF9fYyAqIF9feSAtIF9feDsKKworCQlfX3JlamVjdCA9IF9fciA8IHJlc3VsdF90eXBlKDQuNSkgKiBfX3ogLSBfX2s7CisJCWlmIChfX3JlamVjdCkKKwkJICBfX3JlamVjdCA9IF9fciA8IHN0ZDo6bG9nKF9feik7CisJICAgICAgfQorCSAgICB3aGlsZSAoX19yZWplY3QpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgY29uc3QgcmVzdWx0X3R5cGUgX19jID0gMSAvIF9NX2FscGhhOworCisJICAgIGRvCisJICAgICAgeworCQljb25zdCByZXN1bHRfdHlwZSBfX3ogPSAtc3RkOjpsb2coX191cm5nKCkpOworCQljb25zdCByZXN1bHRfdHlwZSBfX2UgPSAtc3RkOjpsb2coX191cm5nKCkpOworCisJCV9feCA9IHN0ZDo6cG93KF9feiwgX19jKTsKKworCQlfX3JlamVjdCA9IF9feiArIF9fZSA8IF9NX2xfZCArIF9feDsKKwkgICAgICB9CisJICAgIHdoaWxlIChfX3JlamVjdCk7CisJICB9CisKKwlyZXR1cm4gX194OworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fb3Mud2lkZW4oJyAnKSk7CisgICAgICBfX29zLnByZWNpc2lvbihfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1JlYWxUeXBlPjo6X19tYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5hbHBoYSgpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3JlZ2V4IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvcmVnZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjYzNhOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3JlZ2V4CkBAIC0wLDAgKzEsMjczMCBAQAorLy8gY2xhc3MgdGVtcGxhdGUgcmVnZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiBAZmlsZSB0cjEvcmVnZXgKKyAqIEBhdXRob3IgU3RlcGhlbiBNLiBXZWJiICA8c3RlcGhlbi53ZWJiQGJyZWdtYXNvZnQuY2E+CisgKiBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfUkVHRVgKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1JFR0VYIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKy8qKgorICogQGRlZmdyb3VwIHRyMV9yZWdleCBSZWd1bGFyIEV4cHJlc3Npb25zCisgKiBBIGZhY2lsaXR5IGZvciBwZXJmb3JtaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIG1hdGNoaW5nLgorICovCisgLy9AeworCisvKiogQG5hbWVzcGFjZSBzdGQ6OnJlZ2V4X2NvbnN0YW50cworICogIEBicmllZiBJU08gQysrIDB4IGVudGl0aWVzIHN1YiBuYW1lc3BhY2UgZm9yIHJlZ2V4LgorICovCituYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAbmFtZSA1LjEgUmVndWxhciBFeHByZXNzaW9uIFN5bnRheCBPcHRpb25zCisgICAqLworICAvL0B7CisgIGVudW0gX19zeW50YXhfb3B0aW9uCisgICAgeworICAgICAgX1NfaWNhc2UsCisgICAgICBfU19ub3N1YnMsCisgICAgICBfU19vcHRpbWl6ZSwKKyAgICAgIF9TX2NvbGxhdGUsCisgICAgICBfU19FQ01BU2NyaXB0LAorICAgICAgX1NfYmFzaWMsCisgICAgICBfU19leHRlbmRlZCwKKyAgICAgIF9TX2F3aywKKyAgICAgIF9TX2dyZXAsCisgICAgICBfU19lZ3JlcCwKKyAgICAgIF9TX3N5bnRheF9sYXN0CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFRoaXMgaXMgYSBiaXRtYXNrIHR5cGUgaW5kaWNhdGluZyBob3cgdG8gaW50ZXJwcmV0IHRoZSByZWdleC4KKyAgICoKKyAgICogVGhlIEBjIHN5bnRheF9vcHRpb25fdHlwZSBpcyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJ1dCBpdCBpcyB2YWxpZCB0bworICAgKiBwZXJmb3JtIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiB0aGVzZSB2YWx1ZXMgYW5kIGV4cGVjdCB0aGUgcmlnaHQgdGhpbmcgdG8KKyAgICogaGFwcGVuLgorICAgKgorICAgKiBBIHZhbGlkIHZhbHVlIG9mIHR5cGUgc3ludGF4X29wdGlvbl90eXBlIHNoYWxsIGhhdmUgZXhhY3RseSBvbmUgb2YgdGhlCisgICAqIGVsZW1lbnRzIEBjIEVDTUFTY3JpcHQsIEBjIGJhc2ljLCBAYyBleHRlbmRlZCwgQGMgYXdrLCBAYyBncmVwLCBAYyBlZ3JlcAorICAgKiAlc2V0LgorICAgKi8KKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgc3ludGF4X29wdGlvbl90eXBlOworCisgIC8qKiAKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIG1hdGNoaW5nIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYWdhaW5zdCBhIGNoYXJhY3RlcgorICAgKiBzZXF1ZW5jZSBzaGFsbCBiZSBwZXJmb3JtZWQgd2l0aG91dCByZWdhcmQgdG8gY2FzZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBzeW50YXhfb3B0aW9uX3R5cGUgaWNhc2UgICAgICA9IDEgPDwgX1NfaWNhc2U7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHdoZW4gYSByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCBhZ2FpbnN0IGEgY2hhcmFjdGVyCisgICAqIGNvbnRhaW5lciBzZXF1ZW5jZSwgbm8gc3ViLWV4cHJlc3Npb24gbWF0Y2hlcyBhcmUgdG8gYmUgc3RvcmVkIGluIHRoZQorICAgKiBzdXBwbGllZCBtYXRjaF9yZXN1bHRzIHN0cnVjdHVyZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBzeW50YXhfb3B0aW9uX3R5cGUgbm9zdWJzICAgICA9IDEgPDwgX1Nfbm9zdWJzOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBzaG91bGQgcGF5IG1vcmUgYXR0ZW50aW9uIHRvCisgICAqIHRoZSBzcGVlZCB3aXRoIHdoaWNoIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG1hdGNoZWQsIGFuZCBsZXNzIHRvIHRoZQorICAgKiBzcGVlZCB3aXRoIHdoaWNoIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzIGFyZSBjb25zdHJ1Y3RlZC4gT3RoZXJ3aXNlCisgICAqIGl0IGhhcyBubyBkZXRlY3RhYmxlIGVmZmVjdCBvbiB0aGUgcHJvZ3JhbSBvdXRwdXQuCisgICAqLworICBzdGF0aWMgY29uc3Qgc3ludGF4X29wdGlvbl90eXBlIG9wdGltaXplICAgPSAxIDw8IF9TX29wdGltaXplOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCBjaGFyYWN0ZXIgcmFuZ2VzIG9mIHRoZSBmb3JtIFthLWJdIHNob3VsZCBiZSBsb2NhbGUKKyAgICogc2Vuc2l0aXZlLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IHN5bnRheF9vcHRpb25fdHlwZSBjb2xsYXRlICAgID0gMSA8PCBfU19jb2xsYXRlOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBFQ01BU2NyaXB0IGluIEVDTUEtMjYyIFtFY21hIEludGVybmF0aW9uYWwsIEVDTUFTY3JpcHQKKyAgICogTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU3RhbmRhcmQgRWNtYS0yNjIsIHRoaXJkIGVkaXRpb24sIDE5OTldLCBhcworICAgKiBtb2RpZmllZCBpbiB0cjEgc2VjdGlvbiBbNy4xM10uICBUaGlzIGdyYW1tYXIgaXMgc2ltaWxhciB0byB0aGF0IGRlZmluZWQKKyAgICogaW4gdGhlIFBFUkwgc2NyaXB0aW5nIGxhbmd1YWdlIGJ1dCBleHRlbmRlZCB3aXRoIGVsZW1lbnRzIGZvdW5kIGluIHRoZQorICAgKiBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb24gZ3JhbW1hci4KKyAgICovCisgIHN0YXRpYyBjb25zdCBzeW50YXhfb3B0aW9uX3R5cGUgRUNNQVNjcmlwdCA9IDEgPDwgX1NfRUNNQVNjcmlwdDsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGdyYW1tYXIgcmVjb2duaXplZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBpcworICAgKiB0aGF0IHVzZWQgYnkgUE9TSVggYmFzaWMgcmVndWxhciBleHByZXNzaW9ucyBpbiBJRUVFIFN0ZCAxMDAzLjEtMjAwMSwKKyAgICogUG9ydGFibGUgT3BlcmF0aW5nIFN5c3RlbSBJbnRlcmZhY2UgKFBPU0lYKSwgQmFzZSBEZWZpbml0aW9ucyBhbmQKKyAgICogSGVhZGVycywgU2VjdGlvbiA5LCBSZWd1bGFyIEV4cHJlc3Npb25zIFtJRUVFLCBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IC0tCisgICAqIFBvcnRhYmxlIE9wZXJhdGluZyBTeXN0ZW0gSW50ZXJmYWNlIChQT1NJWCksIElFRUUgU3RhbmRhcmQgMTAwMy4xLTIwMDFdLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IHN5bnRheF9vcHRpb25fdHlwZSBiYXNpYyAgICAgID0gMSA8PCBfU19iYXNpYzsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGdyYW1tYXIgcmVjb2duaXplZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBpcworICAgKiB0aGF0IHVzZWQgYnkgUE9TSVggZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9ucyBpbiBJRUVFIFN0ZCAxMDAzLjEtMjAwMSwKKyAgICogUG9ydGFibGUgT3BlcmF0aW5nIFN5c3RlbSBJbnRlcmZhY2UgKFBPU0lYKSwgQmFzZSBEZWZpbml0aW9ucyBhbmQgSGVhZGVycywKKyAgICogU2VjdGlvbiA5LCBSZWd1bGFyIEV4cHJlc3Npb25zLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IHN5bnRheF9vcHRpb25fdHlwZSBleHRlbmRlZCAgID0gMSA8PCBfU19leHRlbmRlZDsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGdyYW1tYXIgcmVjb2duaXplZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBpcworICAgKiB0aGF0IHVzZWQgYnkgUE9TSVggdXRpbGl0eSBhd2sgaW4gSUVFRSBTdGQgMTAwMy4xLTIwMDEuICBUaGlzIG9wdGlvbiBpcworICAgKiBpZGVudGljYWwgdG8gc3ludGF4X29wdGlvbl90eXBlIGV4dGVuZGVkLCBleGNlcHQgdGhhdCBDLXN0eWxlIGVzY2FwZQorICAgKiBzZXF1ZW5jZXMgYXJlIHN1cHBvcnRlZC4gIFRoZXNlIHNlcXVlbmNlcyBhcmU6IAorICAgKiBcXFxcLCBcXGEsIFxcYiwgXFxmLCAKKyAgICogXFxuLCBcXHIsIFxcdCAsIFxcdiwgCisgICAqIFxcJmFwb3M7LCAmYXBvczssIGFuZCBcXGRkZCAKKyAgICogKHdoZXJlIGRkZCBpcyBvbmUsIHR3bywgb3IgdGhyZWUgb2N0YWwgZGlnaXRzKS4gIAorICAgKi8KKyAgc3RhdGljIGNvbnN0IHN5bnRheF9vcHRpb25fdHlwZSBhd2sgICAgICAgID0gMSA8PCBfU19hd2s7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFtbWFyIHJlY29nbml6ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgaXMKKyAgICogdGhhdCB1c2VkIGJ5IFBPU0lYIHV0aWxpdHkgZ3JlcCBpbiBJRUVFIFN0ZCAxMDAzLjEtMjAwMS4gIFRoaXMgb3B0aW9uIGlzCisgICAqIGlkZW50aWNhbCB0byBzeW50YXhfb3B0aW9uX3R5cGUgYmFzaWMsIGV4Y2VwdCB0aGF0IG5ld2xpbmVzIGFyZSB0cmVhdGVkCisgICAqIGFzIHdoaXRlc3BhY2UuCisgICAqLworICBzdGF0aWMgY29uc3Qgc3ludGF4X29wdGlvbl90eXBlIGdyZXAgICAgICAgPSAxIDw8IF9TX2dyZXA7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFtbWFyIHJlY29nbml6ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgaXMKKyAgICogdGhhdCB1c2VkIGJ5IFBPU0lYIHV0aWxpdHkgZ3JlcCB3aGVuIGdpdmVuIHRoZSAtRSBvcHRpb24gaW4KKyAgICogSUVFRSBTdGQgMTAwMy4xLTIwMDEuICBUaGlzIG9wdGlvbiBpcyBpZGVudGljYWwgdG8gc3ludGF4X29wdGlvbl90eXBlIAorICAgKiBleHRlbmRlZCwgZXhjZXB0IHRoYXQgbmV3bGluZXMgYXJlIHRyZWF0ZWQgYXMgd2hpdGVzcGFjZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBzeW50YXhfb3B0aW9uX3R5cGUgZWdyZXAgICAgICA9IDEgPDwgX1NfZWdyZXA7CisKKyAgLy9AfQorCisgIC8qKgorICAgKiBAbmFtZSA1LjIgTWF0Y2hpbmcgUnVsZXMKKyAgICoKKyAgICogTWF0Y2hpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gYWdhaW5zdCBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgW2ZpcnN0LAorICAgKiBsYXN0KSBwcm9jZWVkcyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIHRoZSBncmFtbWFyIHNwZWNpZmllZCBmb3IgdGhlCisgICAqIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QsIG1vZGlmaWVkIGFjY29yZGluZyB0byB0aGUgZWZmZWN0cyBsaXN0ZWQKKyAgICogYmVsb3cgZm9yIGFueSBiaXRtYXNrIGVsZW1lbnRzIHNldC4KKyAgICoKKyAgICovCisgIC8vQHsKKworICBlbnVtIF9fbWF0Y2hfZmxhZworICAgIHsKKyAgICAgIF9TX25vdF9ib2wsCisgICAgICBfU19ub3RfZW9sLAorICAgICAgX1Nfbm90X2JvdywKKyAgICAgIF9TX25vdF9lb3csCisgICAgICBfU19hbnksCisgICAgICBfU19ub3RfbnVsbCwKKyAgICAgIF9TX2NvbnRpbnVvdXMsCisgICAgICBfU19wcmV2X2F2YWlsLAorICAgICAgX1Nfc2VkLAorICAgICAgX1Nfbm9fY29weSwKKyAgICAgIF9TX2ZpcnN0X29ubHksCisgICAgICBfU19tYXRjaF9mbGFnX2xhc3QKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgVGhpcyBpcyBhIGJpdG1hc2sgdHlwZSBpbmRpY2F0aW5nIHJlZ2V4IG1hdGNoaW5nIHJ1bGVzLgorICAgKgorICAgKiBUaGUgQGMgbWF0Y2hfZmxhZ190eXBlIGlzIGltcGxlbWVudGF0aW9uIGRlZmluZWQgYnV0IGl0IGlzIHZhbGlkIHRvCisgICAqIHBlcmZvcm0gYml0d2lzZSBvcGVyYXRpb25zIG9uIHRoZXNlIHZhbHVlcyBhbmQgZXhwZWN0IHRoZSByaWdodCB0aGluZyB0bworICAgKiBoYXBwZW4uCisgICAqLworICB0eXBlZGVmIHN0ZDo6Yml0c2V0PF9TX21hdGNoX2ZsYWdfbGFzdD4gbWF0Y2hfZmxhZ190eXBlOworCisgIC8qKgorICAgKiBUaGUgZGVmYXVsdCBtYXRjaGluZyBydWxlcy4KKyAgICovCisgIHN0YXRpYyBjb25zdCBtYXRjaF9mbGFnX3R5cGUgbWF0Y2hfZGVmYXVsdCAgICAgPSAwOworCisgIC8qKgorICAgKiBUaGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzZXF1ZW5jZSBbZmlyc3QsIGxhc3QpIGlzIHRyZWF0ZWQgYXMgdGhvdWdoIGl0CisgICAqIGlzIG5vdCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSwgc28gdGhlIGNoYXJhY3RlciAoXikgaW4gdGhlIHJlZ3VsYXIKKyAgICogZXhwcmVzc2lvbiBzaGFsbCBub3QgbWF0Y2ggW2ZpcnN0LCBmaXJzdCkuCisgICAqLworICBzdGF0aWMgY29uc3QgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX25vdF9ib2wgICAgID0gMSA8PCBfU19ub3RfYm9sOworCisgIC8qKgorICAgKiBUaGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHNlcXVlbmNlIFtmaXJzdCwgbGFzdCkgaXMgdHJlYXRlZCBhcyB0aG91Z2ggaXQKKyAgICogaXMgbm90IGF0IHRoZSBlbmQgb2YgYSBsaW5lLCBzbyB0aGUgY2hhcmFjdGVyICgkKSBpbiB0aGUgcmVndWxhcgorICAgKiBleHByZXNzaW9uIHNoYWxsIG5vdCBtYXRjaCBbbGFzdCwgbGFzdCkuCisgICAqLworICBzdGF0aWMgY29uc3QgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX25vdF9lb2wgICAgID0gMSA8PCBfU19ub3RfZW9sOworICAgCisgIC8qKgorICAgKiBUaGUgZXhwcmVzc2lvbiBcXGIgaXMgbm90IG1hdGNoZWQgYWdhaW5zdCB0aGUgc3ViLXNlcXVlbmNlCisgICAqIFtmaXJzdCxmaXJzdCkuCisgICAqLworICBzdGF0aWMgY29uc3QgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX25vdF9ib3cgICAgID0gMSA8PCBfU19ub3RfYm93OworICAgCisgIC8qKgorICAgKiBUaGUgZXhwcmVzc2lvbiBcXGIgc2hvdWxkIG5vdCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHN1Yi1zZXF1ZW5jZQorICAgKiBbbGFzdCxsYXN0KS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBtYXRjaF9mbGFnX3R5cGUgbWF0Y2hfbm90X2VvdyAgICAgPSAxIDw8IF9TX25vdF9lb3c7CisgICAKKyAgLyoqCisgICAqIElmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggaXMgcG9zc2libGUgdGhlbiBhbnkgbWF0Y2ggaXMgYW4gYWNjZXB0YWJsZQorICAgKiByZXN1bHQuCisgICAqLworICBzdGF0aWMgY29uc3QgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX2FueSAgICAgICAgID0gMSA8PCBfU19hbnk7CisgICAKKyAgLyoqCisgICAqIFRoZSBleHByZXNzaW9uIGRvZXMgbm90IG1hdGNoIGFuIGVtcHR5IHNlcXVlbmNlLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9ub3RfbnVsbCAgICA9IDEgPDwgX1Nfbm90X251bGw7CisgICAKKyAgLyoqCisgICAqIFRoZSBleHByZXNzaW9uIG9ubHkgbWF0Y2hlcyBhIHN1Yi1zZXF1ZW5jZSB0aGF0IGJlZ2lucyBhdCBmaXJzdCAuCisgICAqLworICBzdGF0aWMgY29uc3QgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX2NvbnRpbnVvdXMgID0gMSA8PCBfU19jb250aW51b3VzOworICAgCisgIC8qKgorICAgKiAtLWZpcnN0IGlzIGEgdmFsaWQgaXRlcmF0b3IgcG9zaXRpb24uICBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgdGhlbiB0aGUKKyAgICogZmxhZ3MgbWF0Y2hfbm90X2JvbCBhbmQgbWF0Y2hfbm90X2JvdyBhcmUgaWdub3JlZCBieSB0aGUgcmVndWxhcgorICAgKiBleHByZXNzaW9uIGFsZ29yaXRobXMgNy4xMSBhbmQgaXRlcmF0b3JzIDcuMTIuCisgICAqLworICBzdGF0aWMgY29uc3QgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX3ByZXZfYXZhaWwgID0gMSA8PCBfU19wcmV2X2F2YWlsOworCisgIC8qKgorICAgKiBXaGVuIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIGlzIHRvIGJlIHJlcGxhY2VkIGJ5IGEgbmV3IHN0cmluZywgdGhlCisgICAqIG5ldyBzdHJpbmcgaXMgY29uc3RydWN0ZWQgdXNpbmcgdGhlIHJ1bGVzIHVzZWQgYnkgdGhlIEVDTUFTY3JpcHQgcmVwbGFjZQorICAgKiBmdW5jdGlvbiBpbiBFQ01BLSAyNjIgW0VjbWEgSW50ZXJuYXRpb25hbCwgRUNNQVNjcmlwdCBMYW5ndWFnZQorICAgKiBTcGVjaWZpY2F0aW9uLCBTdGFuZGFyZCBFY21hLTI2MiwgdGhpcmQgZWRpdGlvbiwgMTk5OV0sIHBhcnQgMTUuNS40LjExCisgICAqIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZS4gSW4gYWRkaXRpb24sIGR1cmluZyBzZWFyY2ggYW5kIHJlcGxhY2UKKyAgICogb3BlcmF0aW9ucyBhbGwgbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogYXJlIGxvY2F0ZWQgYW5kIHJlcGxhY2VkLCBhbmQgc2VjdGlvbnMgb2YgdGhlIGlucHV0IHRoYXQgZGlkIG5vdCBtYXRjaAorICAgKiB0aGUgZXhwcmVzc2lvbiBhcmUgY29waWVkIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0IHN0cmluZy4KKyAgICogCisgICAqIEZvcm1hdCBzdHJpbmdzIChmcm9tIEVDTUEtMjYyIFsxNS41LjQuMTFdKToKKyAgICogQGxpICQkICBUaGUgZG9sbGFyLXNpZ24gaXRzZWxmICgkKQorICAgKiBAbGkgJCYgIFRoZSBtYXRjaGVkIHN1YnN0cmluZy4KKyAgICogQGxpICRgICBUaGUgcG9ydGlvbiBvZiBAYSBzdHJpbmcgdGhhdCBwcmVjZWRlcyB0aGUgbWF0Y2hlZCBzdWJzdHJpbmcuCisgICAqICAgICAgICAgVGhpcyB3b3VsZCBiZSBtYXRjaF9yZXN1bHRzOjpwcmVmaXgoKS4KKyAgICogQGxpICQnICBUaGUgcG9ydGlvbiBvZiBAYSBzdHJpbmcgdGhhdCBmb2xsb3dzIHRoZSBtYXRjaGVkIHN1YnN0cmluZy4KKyAgICogICAgICAgICBUaGlzIHdvdWxkIGJlIG1hdGNoX3Jlc3VsdHM6OnN1ZmZpeCgpLgorICAgKiBAbGkgJG4gIFRoZSBudGggY2FwdHVyZSwgd2hlcmUgbiBpcyBpbiBbMSw5XSBhbmQgJG4gaXMgbm90IGZvbGxvd2VkIGJ5IGEKKyAgICogICAgICAgICBkZWNpbWFsIGRpZ2l0LiAgSWYgbiA8PSBtYXRjaF9yZXN1bHRzOjpzaXplKCkgYW5kIHRoZSBudGggY2FwdHVyZQorICAgKiAgICAgICAgIGlzIHVuZGVmaW5lZCwgdXNlIHRoZSBlbXB0eSBzdHJpbmcgaW5zdGVhZC4gIElmIG4gPgorICAgKiAgICAgICAgIG1hdGNoX3Jlc3VsdHM6OnNpemUoKSwgdGhlIHJlc3VsdCBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorICAgKiBAbGkgJG5uIFRoZSBubnRoIGNhcHR1cmUsIHdoZXJlIG5uIGlzIGEgdHdvLWRpZ2l0IGRlY2ltYWwgbnVtYmVyIG9uCisgICAqICAgICAgICAgWzAxLCA5OV0uICBJZiBubiA8PSBtYXRjaF9yZXN1bHRzOjpzaXplKCkgYW5kIHRoZSBudGggY2FwdHVyZSBpcworICAgKiAgICAgICAgIHVuZGVmaW5lZCwgdXNlIHRoZSBlbXB0eSBzdHJpbmcgaW5zdGVhZC4gSWYKKyAgICogICAgICAgICBubiA+IG1hdGNoX3Jlc3VsdHM6OnNpemUoKSwgdGhlIHJlc3VsdCBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBmb3JtYXRfZGVmYXVsdCAgICA9IDA7CisKKyAgLyoqCisgICAqIFdoZW4gYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggaXMgdG8gYmUgcmVwbGFjZWQgYnkgYSBuZXcgc3RyaW5nLCB0aGUKKyAgICogbmV3IHN0cmluZyBpcyBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgcnVsZXMgdXNlZCBieSB0aGUgUE9TSVggc2VkIHV0aWxpdHkKKyAgICogaW4gSUVFRSBTdGQgMTAwMy4xLSAyMDAxIFtJRUVFLCBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IC0tIFBvcnRhYmxlCisgICAqIE9wZXJhdGluZyBTeXN0ZW0gSW50ZXJmYWNlIChQT1NJWCksIElFRUUgU3RhbmRhcmQgMTAwMy4xLTIwMDFdLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBmb3JtYXRfc2VkICAgICAgICA9IDEgPDwgX1Nfc2VkOworCisgIC8qKgorICAgKiBEdXJpbmcgYSBzZWFyY2ggYW5kIHJlcGxhY2Ugb3BlcmF0aW9uLCBzZWN0aW9ucyBvZiB0aGUgY2hhcmFjdGVyCisgICAqIGNvbnRhaW5lciBzZXF1ZW5jZSBiZWluZyBzZWFyY2hlZCB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgcmVndWxhcgorICAgKiBleHByZXNzaW9uIHNoYWxsIG5vdCBiZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBzdHJpbmcuCisgICAqLworICBzdGF0aWMgY29uc3QgbWF0Y2hfZmxhZ190eXBlIGZvcm1hdF9ub19jb3B5ICAgID0gMSA8PCBfU19ub19jb3B5OworCisgIC8qKgorICAgKiBXaGVuIHNwZWNpZmllZCBkdXJpbmcgYSBzZWFyY2ggYW5kIHJlcGxhY2Ugb3BlcmF0aW9uLCBvbmx5IHRoZSBmaXJzdAorICAgKiBvY2N1cnJlbmNlIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc2hhbGwgYmUgcmVwbGFjZWQuCisgICAqLworICBzdGF0aWMgY29uc3QgbWF0Y2hfZmxhZ190eXBlIGZvcm1hdF9maXJzdF9vbmx5ID0gMSA8PCBfU19maXJzdF9vbmx5OworCisgIC8vQH0KKworICAvKioKKyAgICogQG5hbWUgNS4zIEVycm9yIFR5cGVzCisgICAqLworICAvL0B7CisgCisgIGVudW0gZXJyb3JfdHlwZQorICAgIHsKKyAgICAgIF9TX2Vycm9yX2NvbGxhdGUsCisgICAgICBfU19lcnJvcl9jdHlwZSwKKyAgICAgIF9TX2Vycm9yX2VzY2FwZSwKKyAgICAgIF9TX2Vycm9yX2JhY2tyZWYsCisgICAgICBfU19lcnJvcl9icmFjaywKKyAgICAgIF9TX2Vycm9yX3BhcmVuLAorICAgICAgX1NfZXJyb3JfYnJhY2UsCisgICAgICBfU19lcnJvcl9iYWRicmFjZSwKKyAgICAgIF9TX2Vycm9yX3JhbmdlLAorICAgICAgX1NfZXJyb3Jfc3BhY2UsCisgICAgICBfU19lcnJvcl9iYWRyZXBlYXQsCisgICAgICBfU19lcnJvcl9jb21wbGV4aXR5LAorICAgICAgX1NfZXJyb3Jfc3RhY2ssCisgICAgICBfU19lcnJvcl9sYXN0CisgICAgfTsKKworICAvKiogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIGFuIGludmFsaWQgY29sbGF0aW5nIGVsZW1lbnQgbmFtZS4gKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3JfY29sbGF0ZShfU19lcnJvcl9jb2xsYXRlKTsKKworICAvKiogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIGFuIGludmFsaWQgY2hhcmFjdGVyIGNsYXNzIG5hbWUuICovCisgIHN0YXRpYyBjb25zdCBlcnJvcl90eXBlIGVycm9yX2N0eXBlKF9TX2Vycm9yX2N0eXBlKTsKKworICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIGFuIGludmFsaWQgZXNjYXBlZCBjaGFyYWN0ZXIsIG9yIGEgdHJhaWxpbmcKKyAgICogZXNjYXBlLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3JfZXNjYXBlKF9TX2Vycm9yX2VzY2FwZSk7CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGJhY2sgcmVmZXJlbmNlLiAqLworICBzdGF0aWMgY29uc3QgZXJyb3JfdHlwZSBlcnJvcl9iYWNrcmVmKF9TX2Vycm9yX2JhY2tyZWYpOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgbWlzbWF0Y2hlZCBbIGFuZCBdLiAqLworICBzdGF0aWMgY29uc3QgZXJyb3JfdHlwZSBlcnJvcl9icmFjayhfU19lcnJvcl9icmFjayk7CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBtaXNtYXRjaGVkICggYW5kICkuICovCisgIHN0YXRpYyBjb25zdCBlcnJvcl90eXBlIGVycm9yX3BhcmVuKF9TX2Vycm9yX3BhcmVuKTsKKworICAvKiogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIG1pc21hdGNoZWQgeyBhbmQgfSAqLworICBzdGF0aWMgY29uc3QgZXJyb3JfdHlwZSBlcnJvcl9icmFjZShfU19lcnJvcl9icmFjZSk7CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIHJhbmdlIGluIGEge30gZXhwcmVzc2lvbi4gKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3JfYmFkYnJhY2UoX1NfZXJyb3JfYmFkYnJhY2UpOworCisgIC8qKgorICAgKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgYW4gaW52YWxpZCBjaGFyYWN0ZXIgcmFuZ2UsCisgICAqIHN1Y2ggYXMgW2ItYV0gaW4gbW9zdCBlbmNvZGluZ3MuCisgICAqLworICBzdGF0aWMgY29uc3QgZXJyb3JfdHlwZSBlcnJvcl9yYW5nZShfU19lcnJvcl9yYW5nZSk7CisKKyAgLyoqCisgICAqIFRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGNvbnZlcnQgdGhlIGV4cHJlc3Npb24gaW50byBhCisgICAqIGZpbml0ZSBzdGF0ZSBtYWNoaW5lLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3Jfc3BhY2UoX1NfZXJyb3Jfc3BhY2UpOworCisgIC8qKgorICAgKiBPbmUgb2YgPGVtPio/K3s8L2VtPiB3YXMgbm90IHByZWNlZGVkIGJ5IGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3JfYmFkcmVwZWF0KF9TX2Vycm9yX2JhZHJlcGVhdCk7CisKKyAgLyoqCisgICAqIFRoZSBjb21wbGV4aXR5IG9mIGFuIGF0dGVtcHRlZCBtYXRjaCBhZ2FpbnN0IGEgcmVndWxhciBleHByZXNzaW9uCisgICAqIGV4Y2VlZGVkIGEgcHJlLXNldCBsZXZlbC4KKyAgICovCisgIHN0YXRpYyBjb25zdCBlcnJvcl90eXBlIGVycm9yX2NvbXBsZXhpdHkoX1NfZXJyb3JfY29tcGxleGl0eSk7CisKKyAgLyoqCisgICAqIFRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQorICAgKiByZWd1bGFyIGV4cHJlc3Npb24gY291bGQgbWF0Y2ggdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAqLworICBzdGF0aWMgY29uc3QgZXJyb3JfdHlwZSBlcnJvcl9zdGFjayhfU19lcnJvcl9zdGFjayk7CisKKyAgLy9AfQorX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9CisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gWzcuOF0gQ2xhc3MgcmVnZXhfZXJyb3IKKyAgLyoqCisgICAqICBAYnJpZWYgQSByZWd1bGFyIGV4cHJlc3Npb24gZXhjZXB0aW9uIGNsYXNzLgorICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgKgorICAgKiAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaWJyYXJ5IHRocm93cyBvYmplY3RzIG9mIHRoaXMgY2xhc3Mgb24gZXJyb3IuCisgICAqLworICBjbGFzcyByZWdleF9lcnJvcgorICA6IHB1YmxpYyBzdGQ6OnJ1bnRpbWVfZXJyb3IKKyAgeworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSByZWdleF9lcnJvciBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWNvZGUgdGhlIHJlZ2V4IGVycm9yIGNvZGUuCisgICAgICovCisgICAgZXhwbGljaXQKKyAgICByZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX3R5cGUgX19lY29kZSkKKyAgICA6IHN0ZDo6cnVudGltZV9lcnJvcigicmVnZXhfZXJyb3IiKSwgX01fY29kZShfX2Vjb2RlKQorICAgIHsgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIEdldHMgdGhlIHJlZ2V4IGVycm9yIGNvZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJucyB0aGUgcmVnZXggZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICByZWdleF9jb25zdGFudHM6OmVycm9yX3R5cGUKKyAgICBjb2RlKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9jb2RlOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfdHlwZSBfTV9jb2RlOworICB9OworCisgIC8vIFs3LjddIENsYXNzIHJlZ2V4X3RyYWl0cworICAvKioKKyAgICogQGJyaWVmIERlc2NyaWJlcyBhc3BlY3RzIG9mIGEgcmVndWxhciBleHByZXNzaW9uLgorICAgKgorICAgKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0cmFpdHMgY2xhc3MgdGhhdCBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cyBvZiB0cjEKKyAgICogc2VjdGlvbiBbNy4yXS4KKyAgICoKKyAgICogVGhlIGNsYXNzICVyZWdleCBpcyBwYXJhbWV0ZXJpemVkIGFyb3VuZCBhIHNldCBvZiByZWxhdGVkIHR5cGVzIGFuZAorICAgKiBmdW5jdGlvbnMgdXNlZCB0byBjb21wbGV0ZSB0aGUgZGVmaW5pdGlvbiBvZiBpdHMgc2VtYW50aWNzLiAgVGhpcyBjbGFzcworICAgKiBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cyBvZiBzdWNoIGEgdHJhaXRzIGNsYXNzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGU+CisgICAgc3RydWN0IHJlZ2V4X3RyYWl0cworICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9DaF90eXBlICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyX3R5cGU+IHN0cmluZ190eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmxvY2FsZSAgICAgICAgICAgICAgICAgIGxvY2FsZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmN0eXBlX2Jhc2U6Om1hc2sgICAgICAgIGNoYXJfY2xhc3NfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBkZWZhdWx0IHRyYWl0cyBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3RyYWl0cygpCisgICAgICB7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2l2ZXMgdGhlIGxlbmd0aCBvZiBhIEMtc3R5bGUgc3RyaW5nIHN0YXJ0aW5nIGF0IEBwIF9fcC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19wIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJldHdlZW4gQHAgKl9fcCBhbmQgdGhlIGZpcnN0CisgICAgICAgKiBkZWZhdWx0LWluaXRpYWxpemVkIHZhbHVlIG9mIHR5cGUgQHAgY2hhcl90eXBlLiAgSW4gb3RoZXIgd29yZHMsIHVzZXMKKyAgICAgICAqIHRoZSBDLXN0cmluZyBhbGdvcml0aG0gZm9yIGRldGVybWluaW5nIHRoZSBsZW5ndGggb2YgYSBzZXF1ZW5jZSBvZgorICAgICAgICogY2hhcmFjdGVycy4KKyAgICAgICAqLworICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90CisgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3ApCisgICAgICB7IHJldHVybiBzdHJpbmdfdHlwZTo6dHJhaXRzX3R5cGU6Omxlbmd0aChfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFBlcmZvcm1zIHRoZSBpZGVudGl0eSB0cmFuc2xhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gYyBBIGNoYXJhY3RlciB0byB0aGUgbG9jYWxlLXNwZWNpZmljIGNoYXJhY3RlciBzZXQuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgYy4KKyAgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB0cmFuc2xhdGUoY2hhcl90eXBlIF9fYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fYzsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBUcmFuc2xhdGVzIGEgY2hhcmFjdGVyIGludG8gYSBjYXNlLWluc2Vuc2l0aXZlIGVxdWl2YWxlbnQuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGMgQSBjaGFyYWN0ZXIgdG8gdGhlIGxvY2FsZS1zcGVjaWZpYyBjaGFyYWN0ZXIgc2V0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbG93ZXItY2FzZSBlcXVpdmFsZW50IG9mIGMuCisgICAgICAgKiBAdGhyb3dzIHN0ZDo6YmFkX2Nhc3QgaWYgdGhlIGltYnVlZCBsb2NhbGUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY3R5cGUKKyAgICAgICAqICAgICAgICAgZmFjZXQuCisgICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgdHJhbnNsYXRlX25vY2FzZShjaGFyX3R5cGUgX19jKSBjb25zdAorICAgICAgeworCXVzaW5nIHN0ZDo6Y3R5cGU7CisJdXNpbmcgc3RkOjp1c2VfZmFjZXQ7CisJcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxjaGFyX3R5cGU+ID4oX01fbG9jYWxlKS50b2xvd2VyKF9fYyk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYSBzb3J0IGtleSBmb3IgYSBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGZpcnN0IGJlZ2lubmluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIGxhc3QgIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiBSZXR1cm5zIGEgc29ydCBrZXkgZm9yIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZGVzaWduYXRlZCBieSB0aGUKKyAgICAgICAqIGl0ZXJhdG9yIHJhbmdlIFtGMSwgRjIpIHN1Y2ggdGhhdCBpZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIFtHMSwgRzIpCisgICAgICAgKiBzb3J0cyBiZWZvcmUgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBbSDEsIEgyKSB0aGVuCisgICAgICAgKiB2LnRyYW5zZm9ybShHMSwgRzIpIDwgdi50cmFuc2Zvcm0oSDEsIEgyKS4KKyAgICAgICAqCisgICAgICAgKiBXaGF0IHRoaXMgcmVhbGx5IGRvZXMgaXMgcHJvdmlkZSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBjb21wYXJlIGEKKyAgICAgICAqIHN0cmluZyB0byBtdWx0aXBsZSBvdGhlciBzdHJpbmdzIGluIGxvY2FsZXMgd2l0aCBmYW5jeSBjb2xsYXRpb24KKyAgICAgICAqIHJ1bGVzIGFuZCBlcXVpdmFsZW5jZSBjbGFzc2VzLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIGEgbG9jYWxlLXNwZWNpZmljIHNvcnQga2V5IGVxdWl2YWxlbnQgdG8gdGhlIGlucHV0IHJhbmdlLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3Mgc3RkOjpiYWRfY2FzdCBpZiB0aGUgY3VycmVudCBsb2NhbGUgZG9lcyBub3QgaGF2ZSBhIGNvbGxhdGUKKyAgICAgICAqICAgICAgICAgZmFjZXQuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RfaXRlcj4KKyAgICAgICAgc3RyaW5nX3R5cGUKKyAgICAgICAgdHJhbnNmb3JtKF9Gd2RfaXRlciBfX2ZpcnN0LCBfRndkX2l0ZXIgX19sYXN0KSBjb25zdAorICAgICAgICB7CisJICB1c2luZyBzdGQ6OmNvbGxhdGU7CisJICB1c2luZyBzdGQ6OnVzZV9mYWNldDsKKwkgIGNvbnN0IGNvbGxhdGU8X0NoX3R5cGU+JiBfX2ModXNlX2ZhY2V0PAorCQkJCSAgICAgICBjb2xsYXRlPF9DaF90eXBlPiA+KF9NX2xvY2FsZSkpOworCSAgc3RyaW5nX3R5cGUgX19zKF9fZmlyc3QsIF9fbGFzdCk7CisJICByZXR1cm4gX19jLnRyYW5zZm9ybShfX3MuZGF0YSgpLCBfX3MuZGF0YSgpICsgX19zLnNpemUoKSk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEdW5uby4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gZmlyc3QgYmVnaW5uaW5nIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKiBAcGFyYW0gbGFzdCAgb25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEVmZmVjdHM6IGlmIHR5cGVpZCh1c2VfZmFjZXQ8Y29sbGF0ZTxfQ2hfdHlwZT4gPikgPT0KKyAgICAgICAqIHR5cGVpZChjb2xsYXRlX2J5bmFtZTxfQ2hfdHlwZT4pIGFuZCB0aGUgZm9ybSBvZiB0aGUgc29ydCBrZXkKKyAgICAgICAqIHJldHVybmVkIGJ5IGNvbGxhdGVfYnluYW1lPF9DaF90eXBlPjo6dHJhbnNmb3JtKGZpcnN0LCBsYXN0KSBpcyBrbm93bgorICAgICAgICogYW5kIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBhIHByaW1hcnkgc29ydCBrZXkgdGhlbiByZXR1cm5zIHRoYXQga2V5LAorICAgICAgICogb3RoZXJ3aXNlIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLiBXVEY/PworICAgICAgICoKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkX2l0ZXI+CisgICAgICAgIHN0cmluZ190eXBlCisgICAgICAgIHRyYW5zZm9ybV9wcmltYXJ5KF9Gd2RfaXRlciBfX2ZpcnN0LCBfRndkX2l0ZXIgX19sYXN0KSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhIGNvbGxhdGlvbiBlbGVtZW50IGJ5IG5hbWUuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGZpcnN0IGJlZ2lubmluZyBvZiB0aGUgY29sbGF0aW9uIGVsZW1lbnQgbmFtZS4KKyAgICAgICAqIEBwYXJhbSBsYXN0ICBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBjb2xsYXRpb24gZWxlbWVudCBuYW1lLgorICAgICAgICogCisgICAgICAgKiBAcmV0dXJucyBhIHNlcXVlbmNlIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgdGhhdCByZXByZXNlbnRzIHRoZQorICAgICAgICogY29sbGF0aW5nIGVsZW1lbnQgY29uc2lzdGluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGRlc2lnbmF0ZWQgYnkKKyAgICAgICAqIHRoZSBpdGVyYXRvciByYW5nZSBbZmlyc3QsIGxhc3QpLiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUKKyAgICAgICAqIGNoYXJhY3RlciBzZXF1ZW5jZSBpcyBub3QgYSB2YWxpZCBjb2xsYXRpbmcgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZF9pdGVyPgorICAgICAgICBzdHJpbmdfdHlwZQorICAgICAgICBsb29rdXBfY29sbGF0ZW5hbWUoX0Z3ZF9pdGVyIF9fZmlyc3QsIF9Gd2RfaXRlciBfX2xhc3QpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBNYXBzIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgdG8gYSBuYW1lZCBjaGFyYWN0ZXIKKyAgICAgICAqICAgICAgICBjbGFzc2lmaWNhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gZmlyc3QgYmVnaW5uaW5nIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKiBAcGFyYW0gbGFzdCAgb25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIGFuIHVuc3BlY2lmaWVkIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgY2hhcmFjdGVyCisgICAgICAgKiBjbGFzc2lmaWNhdGlvbiBuYW1lZCBieSB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGRlc2lnbmF0ZWQgYnkgdGhlCisgICAgICAgKiBpdGVyYXRvciByYW5nZSBbZmlyc3QsIGxhc3QpLiBUaGUgdmFsdWUgcmV0dXJuZWQgc2hhbGwgYmUgaW5kZXBlbmRlbnQKKyAgICAgICAqIG9mIHRoZSBjYXNlIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UuIElmIHRoZSBuYW1lCisgICAgICAgKiBpcyBub3QgcmVjb2duaXplZCB0aGVuIHJldHVybnMgYSB2YWx1ZSB0aGF0IGNvbXBhcmVzIGVxdWFsIHRvIDAuCisgICAgICAgKgorICAgICAgICogQXQgbGVhc3QgdGhlIGZvbGxvd2luZyBuYW1lcyAob3IgdGhlaXIgd2lkZS1jaGFyYWN0ZXIgZXF1aXZhbGVudCkgYXJlCisgICAgICAgKiBzdXBwb3J0ZWQuCisgICAgICAgKiAtIGQKKyAgICAgICAqIC0gdworICAgICAgICogLSBzCisgICAgICAgKiAtIGFsbnVtCisgICAgICAgKiAtIGFscGhhCisgICAgICAgKiAtIGJsYW5rCisgICAgICAgKiAtIGNudHJsCisgICAgICAgKiAtIGRpZ2l0CisgICAgICAgKiAtIGdyYXBoCisgICAgICAgKiAtIGxvd2VyCisgICAgICAgKiAtIHByaW50CisgICAgICAgKiAtIHB1bmN0CisgICAgICAgKiAtIHNwYWNlCisgICAgICAgKiAtIHVwcGVyCisgICAgICAgKiAtIHhkaWdpdAorICAgICAgICoKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkX2l0ZXI+CisgICAgICAgIGNoYXJfY2xhc3NfdHlwZQorICAgICAgICBsb29rdXBfY2xhc3NuYW1lKF9Gd2RfaXRlciBfX2ZpcnN0LCBfRndkX2l0ZXIgX19sYXN0KSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRGV0ZXJtaW5lcyBpZiBAcCBjIGlzIGEgbWVtYmVyIG9mIGFuIGlkZW50aWZpZWQgY2xhc3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGMgYSBjaGFyYWN0ZXIuCisgICAgICAgKiBAcGFyYW0gZiBhIGNsYXNzIHR5cGUgKGFzIHJldHVybmVkIGZyb20gbG9va3VwX2NsYXNzbmFtZSkuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIEBwIGMgaXMgYSBtZW1iZXIgb2YgdGhlIGNsYXNzaWZpY2F0aW9uCisgICAgICAgKiByZXByZXNlbnRlZCBieSBAcCBmLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKgorICAgICAgICogQHRocm93cyBzdGQ6OmJhZF9jYXN0IGlmIHRoZSBjdXJyZW50IGxvY2FsZSBkb2VzIG5vdCBoYXZlIGEgY3R5cGUKKyAgICAgICAqICAgICAgICAgZmFjZXQuCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGlzY3R5cGUoX0NoX3R5cGUgX19jLCBjaGFyX2NsYXNzX3R5cGUgX19mKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29udmVydHMgYSBkaWdpdCB0byBhbiBpbnQuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGNoICAgIGEgY2hhcmFjdGVyIHJlcHJlc2VudGluZyBhIGRpZ2l0LgorICAgICAgICogQHBhcmFtIHJhZGl4IHRoZSByYWRpeCBpZiB0aGUgbnVtZXJpYyBjb252ZXJzaW9uIChsaW1pdGVkIHRvIDgsIDEwLAorICAgICAgICogICAgICAgICAgICAgIG9yIDE2KS4KKyAgICAgICAqIAorICAgICAgICogQHJldHVybnMgdGhlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBkaWdpdCBjaCBpbiBiYXNlIHJhZGl4IGlmIHRoZQorICAgICAgICogY2hhcmFjdGVyIGNoIGlzIGEgdmFsaWQgZGlnaXQgaW4gYmFzZSByYWRpeDsgb3RoZXJ3aXNlIHJldHVybnMgLTEuCisgICAgICAgKi8KKyAgICAgIGludAorICAgICAgdmFsdWUoX0NoX3R5cGUgX19jaCwgaW50IF9fcmFkaXgpIGNvbnN0OworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbWJ1ZXMgdGhlIHJlZ2V4X3RyYWl0cyBvYmplY3Qgd2l0aCBhIGNvcHkgb2YgYSBuZXcgbG9jYWxlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBsb2MgQSBsb2NhbGUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgYSBjb3B5IG9mIHRoZSBwcmV2aW91cyBsb2NhbGUgaW4gdXNlIGJ5IHRoZSByZWdleF90cmFpdHMKKyAgICAgICAqICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAbm90ZSBDYWxsaW5nIGltYnVlIHdpdGggYSBkaWZmZXJlbnQgbG9jYWxlIHRoYW4gdGhlIG9uZSBjdXJyZW50bHkgaW4KKyAgICAgICAqICAgICAgIHVzZSBpbnZhbGlkYXRlcyBhbGwgY2FjaGVkIGRhdGEgaGVsZCBieSAqdGhpcy4KKyAgICAgICAqLworICAgICAgbG9jYWxlX3R5cGUKKyAgICAgIGltYnVlKGxvY2FsZV90eXBlIF9fbG9jKQorICAgICAgeworCXN0ZDo6c3dhcChfTV9sb2NhbGUsIF9fbG9jKTsKKwlyZXR1cm4gX19sb2M7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IGxvY2FsZSBpbiB1c2UgYnkgdGhlIHJlZ2V4X3RyYWl0cworICAgICAgICogb2JqZWN0LgorICAgICAgICovCisgICAgICBsb2NhbGVfdHlwZQorICAgICAgZ2V0bG9jKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2xvY2FsZTsgfQorICAgICAgCisgICAgcHJvdGVjdGVkOgorICAgICAgbG9jYWxlX3R5cGUgX01fbG9jYWxlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGU+CisgICAgYm9vbCByZWdleF90cmFpdHM8X0NoX3R5cGU+OjoKKyAgICBpc2N0eXBlKF9DaF90eXBlIF9fYywgY2hhcl9jbGFzc190eXBlIF9fZikgY29uc3QKKyAgICB7CisgICAgICB1c2luZyBzdGQ6OmN0eXBlOworICAgICAgdXNpbmcgc3RkOjp1c2VfZmFjZXQ7CisgICAgICBjb25zdCBjdHlwZTxfQ2hfdHlwZT4mIF9fY3R5cGUodXNlX2ZhY2V0PAorCQkJCSAgICAgY3R5cGU8X0NoX3R5cGU+ID4oX01fbG9jYWxlKSk7CisgICAgICAKKyAgICAgIGlmIChfX2N0eXBlLmlzKF9fYywgX19mKSkKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIAorICAgICAgLy8gc3BlY2lhbCBjYXNlIG9mIHVuZGVyc2NvcmUgaW4gW1s6dzpdXQorICAgICAgaWYgKF9fYyA9PSBfX2N0eXBlLndpZGVuKCdfJykpCisJeworCSAgY29uc3QgY2hhciogY29uc3QgX193YltdID0gInciOworCSAgY2hhcl9jbGFzc190eXBlIF9fd3QgPSB0aGlzLT5sb29rdXBfY2xhc3NuYW1lKF9fd2IsCisJCQkJCQkJX193YiArIHNpemVvZihfX3diKSk7CisJICBpZiAoX19mIHwgX193dCkKKwkgICAgcmV0dXJuIHRydWU7CisJfQorICAgIAorICAgICAgLy8gc3BlY2lhbCBjYXNlIG9mIFtbOnNwYWNlOl1dIGluIFtbOmJsYW5rOl1dCisgICAgICBpZiAoX19jID09IF9fY3R5cGUuaXNzcGFjZShfX2MpKQorCXsKKwkgIGNvbnN0IGNoYXIqIGNvbnN0IF9fYmJbXSA9ICJibGFuayI7CisJICBjaGFyX2NsYXNzX3R5cGUgX19idCA9IHRoaXMtPmxvb2t1cF9jbGFzc25hbWUoX19iYiwKKwkJCQkJCQlfX2JiICsgc2l6ZW9mKF9fYmIpKTsKKwkgIGlmIChfX2YgfCBfX2J0KQorCSAgICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICAKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGU+CisgICAgaW50IHJlZ2V4X3RyYWl0czxfQ2hfdHlwZT46OgorICAgIHZhbHVlKF9DaF90eXBlIF9fY2gsIGludCBfX3JhZGl4KSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6YmFzaWNfaXN0cmluZ3N0cmVhbTxfQ2hfdHlwZT4gX19pcyhzdHJpbmdfdHlwZSgxLCBfX2NoKSk7CisgICAgICBpbnQgX192OworICAgICAgaWYgKF9fcmFkaXggPT0gOCkKKwlfX2lzID4+IHN0ZDo6b2N0OworICAgICAgZWxzZSBpZiAoX19yYWRpeCA9PSAxNikKKwlfX2lzID4+IHN0ZDo6aGV4OworICAgICAgX19pcyA+PiBfX3Y7CisgICAgICByZXR1cm4gX19pcy5mYWlsKCkgPyAtMSA6IF9fdjsKKyAgICB9CisKKyAgLy8gWzcuOF0gQ2xhc3MgYmFzaWNfcmVnZXgKKyAgLyoqCisgICAqIE9iamVjdHMgb2Ygc3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IHJlZ3VsYXIgZXhwcmVzc2lvbnMKKyAgICogY29uc3RydWN0ZWQgZnJvbSBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVyIHR5cGUgQHAgX0NoX3R5cGUuCisgICAqCisgICAqIFN0b3JhZ2UgZm9yIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgYWxsb2NhdGVkIGFuZCBkZWFsbG9jYXRlZCBhcworICAgKiBuZWNlc3NhcnkgYnkgdGhlIG1lbWJlciBmdW5jdGlvbnMgb2YgdGhpcyBjbGFzcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzID0gcmVnZXhfdHJhaXRzPF9DaF90eXBlPiA+CisgICAgY2xhc3MgYmFzaWNfcmVnZXgKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXM6CisgICAgICB0eXBlZGVmIF9DaF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgZmxhZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUnhfdHJhaXRzOjpsb2NhbGVfdHlwZSAgbG9jYWxlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SeF90cmFpdHM6OnN0cmluZ190eXBlICBzdHJpbmdfdHlwZTsKKworICAgICAgLyoqCisgICAgICAgKiBAbmFtZSBDb25zdGFudHMKKyAgICAgICAqIHRyMSBbNy44LjFdIHN0ZCBbMjguOC4xXQorICAgICAgICovCisgICAgICAvL0B7CisgICAgICBzdGF0aWMgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgaWNhc2UKKyAgICAgICAgPSByZWdleF9jb25zdGFudHM6OmljYXNlOworICAgICAgc3RhdGljIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIG5vc3VicworICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6bm9zdWJzOworICAgICAgc3RhdGljIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIG9wdGltaXplCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjpvcHRpbWl6ZTsKKyAgICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBjb2xsYXRlCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjpjb2xsYXRlOworICAgICAgc3RhdGljIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIEVDTUFTY3JpcHQKKyAgICAgICAgPSByZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQ7CisgICAgICBzdGF0aWMgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgYmFzaWMKKyAgICAgICAgPSByZWdleF9jb25zdGFudHM6OmJhc2ljOworICAgICAgc3RhdGljIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGV4dGVuZGVkCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjpleHRlbmRlZDsKKyAgICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBhd2sKKyAgICAgICAgPSByZWdleF9jb25zdGFudHM6OmF3azsKKyAgICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBncmVwCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjpncmVwOworICAgICAgc3RhdGljIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGVncmVwCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjplZ3JlcDsKKyAgICAgIC8vQH0KKworICAgICAgLy8gWzcuOC4yXSBjb25zdHJ1Y3QvY29weS9kZXN0cm95CisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBkb2VzIG5vdCBtYXRjaCBhbnkKKyAgICAgICAqIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgoKQorICAgICAgOiBfTV9mbGFncyhyZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQpLCBfTV9wYXR0ZXJuKCksIF9NX21hcmtfY291bnQoMCkKKyAgICAgIHsgX01fY29tcGlsZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgc2VxdWVuY2UKKyAgICAgICAqIFtwLCBwICsgY2hhcl90cmFpdHM8X0NoX3R5cGU+OjpsZW5ndGgocCkpIGludGVycHJldGVkIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAqIGZsYWdzIGluIEBwIGYuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHAgQSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZworICAgICAgICogICAgICAgICAgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBmIEZsYWdzIGluZGljYXRpbmcgdGhlIHN5bnRheCBydWxlcyBhbmQgb3B0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIEBwIHAgaXMgbm90IGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfcmVnZXgoY29uc3QgX0NoX3R5cGUqIF9fcCwKKwkJICBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorICAgICAgOiBfTV9mbGFncyhfX2YpLCBfTV9wYXR0ZXJuKF9fcCksIF9NX21hcmtfY291bnQoMCkKKyAgICAgIHsgX01fY29tcGlsZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgc2VxdWVuY2UKKyAgICAgICAqIFtwLCBwICsgbGVuKSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZsYWdzIGluIEBwIGYuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHAgICBBIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyCisgICAgICAgKiAgICAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gbGVuIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gZiAgIEZsYWdzIGluZGljYXRpbmcgdGhlIHN5bnRheCBydWxlcyBhbmQgb3B0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIEBwIHAgaXMgbm90IGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleChjb25zdCBfQ2hfdHlwZSogX19wLCBzdGQ6OnNpemVfdCBfX2xlbiwgZmxhZ190eXBlIF9fZikKKyAgICAgIDogX01fZmxhZ3MoX19mKSAsIF9NX3BhdHRlcm4oX19wLCBfX2xlbiksIF9NX21hcmtfY291bnQoMCkKKyAgICAgIHsgX01fY29tcGlsZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHktY29uc3RydWN0cyBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcmhzIEEgQHAgcmVnZXggb2JqZWN0LgorICAgICAqLworICAgICAgYmFzaWNfcmVnZXgoY29uc3QgYmFzaWNfcmVnZXgmIF9fcmhzKQorICAgICAgOiBfTV9mbGFncyhfX3Jocy5fTV9mbGFncyksIF9NX3BhdHRlcm4oX19yaHMuX01fcGF0dGVybiksCisJX01fbWFya19jb3VudChfX3Jocy5fTV9tYXJrX2NvdW50KQorICAgICAgeyBfTV9jb21waWxlKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSBzdHJpbmcKKyAgICAgICAqIEBwIHMgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmbGFncyBpbiBAcCBmLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBzIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gZiBGbGFncyBpbmRpY2F0aW5nIHRoZSBzeW50YXggcnVsZXMgYW5kIG9wdGlvbnMuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBzIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBiYXNpY19yZWdleChjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcywKKwkJICAgIGZsYWdfdHlwZSBfX2YgPSByZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQpCisJOiBfTV9mbGFncyhfX2YpLCBfTV9wYXR0ZXJuKF9fcy5iZWdpbigpLCBfX3MuZW5kKCkpLCBfTV9tYXJrX2NvdW50KDApCisgICAgICAgIHsgX01fY29tcGlsZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgcmFuZ2UKKyAgICAgICAqIFtmaXJzdCwgbGFzdCkgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmbGFncyBpbiBAcCBmLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBmaXJzdCBUaGUgc3RhcnQgb2YgYSByYW5nZSBjb250YWluaW5nIGEgdmFsaWQgcmVndWxhcgorICAgICAgICogICAgICAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gbGFzdCAgVGhlIGVuZCBvZiBhIHJhbmdlIGNvbnRhaW5pbmcgYSB2YWxpZCByZWd1bGFyCisgICAgICAgKiAgICAgICAgICAgICAgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBmICAgICBUaGUgZm9ybWF0IGZsYWdzIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBbZmlyc3QsIGxhc3QpIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGJhc2ljX3JlZ2V4KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgCisJCSAgICBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorCTogX01fZmxhZ3MoX19mKSwgX01fcGF0dGVybihfX2ZpcnN0LCBfX2xhc3QpLCBfTV9tYXJrX2NvdW50KDApCisgICAgICAgIHsgX01fY29tcGlsZSgpOyB9CisKKyNpZmRlZiBfR0xJQkNYWF9JTkNMVURFX0FTX0NYWDExCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gbCAgVGhlIGluaXRpYWxpemVyIGxpc3QuCisgICAgICAgKiBAcGFyYW0gZiAgVGhlIGZvcm1hdCBmbGFncyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgQHAgbCBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4KGluaXRpYWxpemVyX2xpc3Q8X0NoX3R5cGU+IF9fbCwKKwkJICBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorCTogX01fZmxhZ3MoX19mKSwgX01fcGF0dGVybihfX2wuYmVnaW4oKSwgX19sLmVuZCgpKSwgX01fbWFya19jb3VudCgwKQorICAgICAgICB7IF9NX2NvbXBpbGUoKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERlc3Ryb3lzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICB+YmFzaWNfcmVnZXgoKQorICAgICAgeyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgb25lIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhbm90aGVyLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBiYXNpY19yZWdleCYgX19yaHMpCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19yaHMpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlcGxhY2VzIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGggYSBuZXcgb25lIGNvbnN0cnVjdGVkIGZyb20KKyAgICAgICAqIGEgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBBIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgbnVsbC10ZXJtaW5hdGVkIEMtc3R5bGUgc3RyaW5nCisgICAgICAgKiAgICAgICAgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX0NoX3R5cGUqIF9fcCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihfX3AsIGZsYWdzKCkpOyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlcGxhY2VzIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGggYSBuZXcgb25lIGNvbnN0cnVjdGVkIGZyb20KKyAgICAgICAqIGEgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBBIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGVyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICAgICAgYmFzaWNfcmVnZXgmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIF9DaF90eXBlcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3MpCisgICAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihfX3MsIGZsYWdzKCkpOyB9CisKKyAgICAgIC8vIFs3LjguM10gYXNzaWduCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiB0aGUgcmVhbCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB0aGF0IEFub3RoZXIgcmVndWxhciBleHByZXNzaW9uIG9iamVjdC4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgmCisgICAgICBhc3NpZ24oY29uc3QgYmFzaWNfcmVnZXgmIF9fdGhhdCkKKyAgICAgIHsKKwliYXNpY19yZWdleCBfX3RtcChfX3RoYXQpOworCXRoaXMtPnN3YXAoX190bXApOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gdG8gYSByZWdleCBvYmplY3QgZnJvbSBhCisgICAgICAgKiBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICogcGF0dGVybi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcCAgICAgQSBwb2ludGVyIHRvIGEgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcKKyAgICAgICAqICAgICAgICAgICAgICBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgorICAgICAgICogQHBhcmFtIGZsYWdzIFN5bnRheCBvcHRpb24gZmxhZ3MuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBwIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAqIHBhdHRlcm4gaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIEBwIGZsYWdzLiAgSWYgcmVnZXhfZXJyb3IgaXMgdGhyb3duLAorICAgICAgICogKnRoaXMgcmVtYWlucyB1bmNoYW5nZWQuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgYXNzaWduKGNvbnN0IF9DaF90eXBlKiBfX3AsCisJICAgICBmbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihzdHJpbmdfdHlwZShfX3ApLCBfX2ZsYWdzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIGEgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhIHJlZ2V4IG9iamVjdCBmcm9tIGEKKyAgICAgICAqIEMtc3R5bGUgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcCAgICAgQSBwb2ludGVyIHRvIGEgQy1zdHlsZSBzdHJpbmcgY29udGFpbmluZyBhCisgICAgICAgKiAgICAgICAgICAgICAgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCisgICAgICAgKiBAcGFyYW0gbGVuICAgVGhlIGxlbmd0aCBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gc3RyaW5nLgorICAgICAgICogQHBhcmFtIGZsYWdzIFN5bnRheCBvcHRpb24gZmxhZ3MuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBwIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAqIHBhdHRlcm4gaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIEBwIGZsYWdzLiAgSWYgcmVnZXhfZXJyb3IgaXMgdGhyb3duLAorICAgICAgICogKnRoaXMgcmVtYWlucyB1bmNoYW5nZWQuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgYXNzaWduKGNvbnN0IF9DaF90eXBlKiBfX3AsIHN0ZDo6c2l6ZV90IF9fbGVuLCBmbGFnX3R5cGUgX19mbGFncykKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihzdHJpbmdfdHlwZShfX3AsIF9fbGVuKSwgX19mbGFncyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gdG8gYSByZWdleCBvYmplY3QgZnJvbSBhIAorICAgICAgICogc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcyAgICAgQSBzdHJpbmcgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgorICAgICAgICogQHBhcmFtIGZsYWdzIFN5bnRheCBvcHRpb24gZmxhZ3MuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBwIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAqIHBhdHRlcm4gaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIEBwIGZsYWdzLiAgSWYgcmVnZXhfZXJyb3IgaXMgdGhyb3duLAorICAgICAgICogKnRoaXMgcmVtYWlucyB1bmNoYW5nZWQuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgICBhc3NpZ24oY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHlwZXJhaXRzLCBfQWxsb2NhdG9yPiYgX19zLAorCSAgICAgICBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorICAgICAgICB7IAorCSAgYmFzaWNfcmVnZXggX190bXAoX19zLCBfX2YpOworCSAgdGhpcy0+c3dhcChfX3RtcCk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIGEgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhIHJlZ2V4IG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gZmlyc3QgVGhlIHN0YXJ0IG9mIGEgcmFuZ2UgY29udGFpbmluZyBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgICAgICBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIGxhc3QgIFRoZSBlbmQgb2YgYSByYW5nZSBjb250YWluaW5nIGEgdmFsaWQgcmVndWxhcgorICAgICAgICogICAgICAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gZmxhZ3MgU3ludGF4IG9wdGlvbiBmbGFncy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIHAgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICogcGF0dGVybiBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gQHAgZmxhZ3MuICBJZiByZWdleF9lcnJvciBpcyB0aHJvd24sCisgICAgICAgKiB0aGUgb2JqZWN0IHJlbWFpbnMgdW5jaGFuZ2VkLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgYmFzaWNfcmVnZXgmCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgIGZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorICAgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oc3RyaW5nX3R5cGUoX19maXJzdCwgX19sYXN0KSwgX19mbGFncyk7IH0KKworI2lmZGVmIF9HTElCQ1hYX0lOQ0xVREVfQVNfQ1hYMTEKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgYSBuZXcgcmVndWxhciBleHByZXNzaW9uIHRvIGEgcmVnZXggb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBsICAgICBBbiBpbml0aWFsaXplciBsaXN0IHJlcHJlc2VudGluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBmbGFncyBTeW50YXggb3B0aW9uIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgQHAgbCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcmVndWxhcgorICAgICAgICogZXhwcmVzc2lvbiBwYXR0ZXJuIGludGVycHJldGVkIGFjY29yZGluZyB0byBAcCBmbGFncy4gIElmIHJlZ2V4X2Vycm9yCisgICAgICAgKiBpcyB0aHJvd24sIHRoZSBvYmplY3QgcmVtYWlucyB1bmNoYW5nZWQuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8X0NoX3R5cGU+IF9fbCwKKwkgICAgIGZsYWdfdHlwZSBfX2YgPSByZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQpCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19sLmJlZ2luKCksIF9fbC5lbmQoKSwgX19mKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIFs3LjguNF0gY29uc3Qgb3BlcmF0aW9ucworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbnVtYmVyIG9mIG1hcmtlZCBzdWJleHByZXNzaW9ucyB3aXRoaW4gdGhlIHJlZ3VsYXIKKyAgICAgICAqIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGludAorICAgICAgbWFya19jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9tYXJrX2NvdW50OyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIGZsYWdzIHVzZWQgdG8gY29uc3RydWN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAqIG9yIGluIHRoZSBsYXN0IGNhbGwgdG8gYXNzaWduKCkuCisgICAgICAgKi8KKyAgICAgIGZsYWdfdHlwZQorICAgICAgZmxhZ3MoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZmxhZ3M7IH0KKyAgICAgIAorICAgICAgLy8gWzcuOC41XSBsb2NhbGUKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEltYnVlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBsb2NhbGUuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGxvYyBBIGxvY2FsZS4KKyAgICAgICAqLworICAgICAgbG9jYWxlX3R5cGUKKyAgICAgIGltYnVlKGxvY2FsZV90eXBlIF9fbG9jKQorICAgICAgeyByZXR1cm4gX01fdHJhaXRzLmltYnVlKF9fbG9jKTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBsb2NhbGUgY3VycmVudGx5IGltYnVlZCBpbiB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgKiAgICAgICAgb2JqZWN0LgorICAgICAgICovCisgICAgICBsb2NhbGVfdHlwZQorICAgICAgZ2V0bG9jKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3RyYWl0cy5nZXRsb2MoKTsgfQorICAgICAgCisgICAgICAvLyBbNy44LjZdIHN3YXAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFN3YXBzIHRoZSBjb250ZW50cyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIG9iamVjdHMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHJocyBBbm90aGVyIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoYmFzaWNfcmVnZXgmIF9fcmhzKQorICAgICAgeworCXN0ZDo6c3dhcChfTV9mbGFncywgICAgICBfX3Jocy5fTV9mbGFncyk7CisJc3RkOjpzd2FwKF9NX3BhdHRlcm4sICAgIF9fcmhzLl9NX3BhdHRlcm4pOworCXN0ZDo6c3dhcChfTV9tYXJrX2NvdW50LCBfX3Jocy5fTV9tYXJrX2NvdW50KTsKKwlzdGQ6OnN3YXAoX01fdHJhaXRzLCAgICAgX19yaHMuX01fdHJhaXRzKTsKKyAgICAgIH0KKyAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21waWxlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIGludG8gYSBORkEuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZCBfTV9jb21waWxlKCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBmbGFnX3R5cGUgICAgX01fZmxhZ3M7CisgICAgICBzdHJpbmdfdHlwZSAgX01fcGF0dGVybjsKKyAgICAgIHVuc2lnbmVkIGludCBfTV9tYXJrX2NvdW50OworICAgICAgX1J4X3RyYWl0cyAgIF9NX3RyYWl0czsKKyAgICB9OworICAKKyAgLyoqIEBicmllZiBTdGFuZGFyZCByZWd1bGFyIGV4cHJlc3Npb25zLiAqLworICB0eXBlZGVmIGJhc2ljX3JlZ2V4PGNoYXI+ICAgIHJlZ2V4OworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8qKiBAYnJpZWYgU3RhbmRhcmQgd2lkZS1jaGFyYWN0ZXIgcmVndWxhciBleHByZXNzaW9ucy4gKi8KKyAgdHlwZWRlZiBiYXNpY19yZWdleDx3Y2hhcl90PiB3cmVnZXg7CisjZW5kaWYKKworCisgIC8vIFs3LjguNl0gYmFzaWNfcmVnZXggc3dhcAorICAvKioKKyAgICogQGJyaWVmIFN3YXBzIHRoZSBjb250ZW50cyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIG9iamVjdHMuCisgICAqIEBwYXJhbSBsaHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uLgorICAgKiBAcGFyYW0gcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX2xocywKKwkgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKKworICAvLyBbNy45XSBDbGFzcyB0ZW1wbGF0ZSBzdWJfbWF0Y2gKKyAgLyoqCisgICAqIEEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBtYXRjaGVkIGJ5IGEgcGFydGljdWxhciBtYXJrZWQgc3ViLWV4cHJlc3Npb24uCisgICAqCisgICAqIEFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGVzc2VudGlhbGx5IGEgcGFpciBvZiBpdGVyYXRvcnMgbWFya2luZyBhCisgICAqIG1hdGNoZWQgc3ViZXhwcmVzc2lvbiB3aXRoaW4gYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBtYXRjaC4gU3VjaAorICAgKiBvYmplY3RzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYW5kIGNvbXBhcmVkIHdpdGggc3RkOjpiYXNpY19zdHJpbmcgb2JqZWN0cworICAgKiBvZiBhIHNpbWlsYXIgYmFzZSBjaGFyYWN0ZXIgdHlwZSBhcyB0aGUgcGF0dGVybiBtYXRjaGVkIGJ5IHRoZSByZWd1bGFyCisgICAqIGV4cHJlc3Npb24uCisgICAqCisgICAqIFRoZSBpdGVyYXRvcnMgdGhhdCBtYWtlIHVwIHRoZSBwYWlyIGFyZSB0aGUgdXN1YWwgaGFsZi1vcGVuIGludGVydmFsCisgICAqIHJlZmVyZW5jaW5nIHRoZSBhY3R1YWwgb3JpZ2luYWwgcGF0dGVybiBtYXRjaGVkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBjbGFzcyBzdWJfbWF0Y2ggOiBwdWJsaWMgc3RkOjpwYWlyPF9CaUl0ZXIsIF9CaUl0ZXI+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+Ojp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0JpSXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKworICAgIHB1YmxpYzoKKyAgICAgIGJvb2wgbWF0Y2hlZDsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoaW5nIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICBkaWZmZXJlbmNlX3R5cGUKKyAgICAgIGxlbmd0aCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5tYXRjaGVkID8gc3RkOjpkaXN0YW5jZSh0aGlzLT5maXJzdCwgdGhpcy0+c2Vjb25kKSA6IDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbWF0Y2hpbmcgc2VxdWVuY2UgYXMgYSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdGhlIG1hdGNoaW5nIHNlcXVlbmNlIGFzIGEgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqIFRoaXMgaXMgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gb3BlcmF0b3IuICBJdCBpcyBpZGVudGljYWwgdG8gdGhlCisgICAgICAgKiBzdHIoKSBtZW1iZXIgZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgd2lsbCB3YW50IHRvIHBvcCB1cCBpbgorICAgICAgICogdW5leHBlY3RlZCBwbGFjZXMgYW5kIGNhdXNlIGEgZ3JlYXQgZGVhbCBvZiBjb25mdXNpb24gYW5kIGN1cnNpbmcKKyAgICAgICAqIGZyb20gdGhlIHVud2FyeS4KKyAgICAgICAqLworICAgICAgb3BlcmF0b3IgYmFzaWNfc3RyaW5nPHZhbHVlX3R5cGU+KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gdGhpcy0+bWF0Y2hlZAorCSAgPyBzdGQ6OmJhc2ljX3N0cmluZzx2YWx1ZV90eXBlPih0aGlzLT5maXJzdCwgdGhpcy0+c2Vjb25kKQorCSAgOiBzdGQ6OmJhc2ljX3N0cmluZzx2YWx1ZV90eXBlPigpOworICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBtYXRjaGluZyBzZXF1ZW5jZSBhcyBhIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0aGUgbWF0Y2hpbmcgc2VxdWVuY2UgYXMgYSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZzx2YWx1ZV90eXBlPgorICAgICAgc3RyKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gdGhpcy0+bWF0Y2hlZAorCSAgPyBzdGQ6OmJhc2ljX3N0cmluZzx2YWx1ZV90eXBlPih0aGlzLT5maXJzdCwgdGhpcy0+c2Vjb25kKQorCSAgOiBzdGQ6OmJhc2ljX3N0cmluZzx2YWx1ZV90eXBlPigpOworICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyB0aGlzIGFuZCBhbm90aGVyIG1hdGNoZWQgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHMgQW5vdGhlciBtYXRjaGVkIHNlcXVlbmNlIHRvIGNvbXBhcmUgdG8gdGhpcyBvbmUuCisgICAgICAgKgorICAgICAgICogQHJldHZhbCA8MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2Ugd2lsbCBjb2xsYXRlIGJlZm9yZSBAcCBzLgorICAgICAgICogQHJldHZhbCA9MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2UgaXMgZXF1aXZhbGVudCB0byBAcCBzLgorICAgICAgICogQHJldHZhbCA8MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2Ugd2lsbCBjb2xsYXRlIGFmdGVyIEBwIHMuCisgICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShjb25zdCBzdWJfbWF0Y2gmIF9fcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnN0cigpLmNvbXBhcmUoX19zLnN0cigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyB0aGlzIHN1Yl9tYXRjaCB0byBhIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcyBBIHN0cmluZyB0byBjb21wYXJlIHRvIHRoaXMgc3ViX21hdGNoLgorICAgICAgICoKKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBiZWZvcmUgQHAgcy4KKyAgICAgICAqIEByZXR2YWwgPTAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIGlzIGVxdWl2YWxlbnQgdG8gQHAgcy4KKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBhZnRlciBAcCBzLgorICAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3QgYmFzaWNfc3RyaW5nPHZhbHVlX3R5cGU+JiBfX3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5zdHIoKS5jb21wYXJlKF9fcyk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdGhpcyBzdWJfbWF0Y2ggdG8gYSBDLXN0eWxlIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcyBBIEMtc3R5bGUgc3RyaW5nIHRvIGNvbXBhcmUgdG8gdGhpcyBzdWJfbWF0Y2guCisgICAgICAgKgorICAgICAgICogQHJldHZhbCA8MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2Ugd2lsbCBjb2xsYXRlIGJlZm9yZSBAcCBzLgorICAgICAgICogQHJldHZhbCA9MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2UgaXMgZXF1aXZhbGVudCB0byBAcCBzLgorICAgICAgICogQHJldHZhbCA8MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2Ugd2lsbCBjb2xsYXRlIGFmdGVyIEBwIHMuCisgICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShjb25zdCB2YWx1ZV90eXBlKiBfX3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5zdHIoKS5jb21wYXJlKF9fcyk7IH0KKyAgICB9OworICAKKyAgCisgIC8qKiBAYnJpZWYgU3RhbmRhcmQgcmVnZXggc3VibWF0Y2ggb3ZlciBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gKi8KKyAgdHlwZWRlZiBzdWJfbWF0Y2g8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNzdWJfbWF0Y2g7CisgIC8qKiBAYnJpZWYgU3RhbmRhcmQgcmVnZXggc3VibWF0Y2ggb3ZlciBhIHN0YW5kYXJkIHN0cmluZy4gKi8KKyAgdHlwZWRlZiBzdWJfbWF0Y2g8c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gIHNzdWJfbWF0Y2g7CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgLyoqIEBicmllZiBSZWdleCBzdWJtYXRjaCBvdmVyIGEgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgd2lkZSBzdHJpbmcuICovCisgIHR5cGVkZWYgc3ViX21hdGNoPGNvbnN0IHdjaGFyX3QqPiAgICAgICAgICB3Y3N1Yl9tYXRjaDsKKyAgLyoqIEBicmllZiBSZWdleCBzdWJtYXRjaCBvdmVyIGEgc3RhbmRhcmQgd2lkZSBzdHJpbmcuICovCisgIHR5cGVkZWYgc3ViX21hdGNoPHdzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiB3c3N1Yl9tYXRjaDsKKyNlbmRpZgorCisgIC8vIFs3LjkuMl0gc3ViX21hdGNoIG5vbi1tZW1iZXIgb3BlcmF0b3JzCisgIAorICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBsaHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA9PSAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgaW5lcXVpdmFsZW5jZSBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBsaHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBub3QgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaUl0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgIT0gMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIHR3byByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2hlcy4KKyAgICogQHBhcmFtIGxocyBGaXJzdCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgU2Vjb25kIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgcHJlY2VkZXMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19saHMsCisJICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBsaHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpIDw9IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBsaHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID49IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBsaHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHN1Y2NlZWRzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPiAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uCisgICAqICAgICAgICBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgIGlzIGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA9PSBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uCisgICAqICAgICAgICBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgIGlzIG5vdCBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX2xocywgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgIT0gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHByZWNlZGVzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSwKKwkgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX2xocywgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgIHsgcmV0dXJuIF9fbGhzIDwgX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHN1Y2NlZWRzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSwgCisJICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19saHMsIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzID4gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fbGhzLCBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA+PSBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgZG9lcyBub3Qgc3VjY2VlZCBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGJhc2ljX3N0cmluZzwKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSwKKwkgICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19saHMsIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzIDw9IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgaXMgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLnN0cigpID09IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgaW5lcXVpdmFsZW5jZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYQorICAgKiAgICAgICAgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBpcyBub3QgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLnN0cigpICE9IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBwcmVjZWRlcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCBjbGFzcyBfQ2hfdHJhaXRzLCBjbGFzcyBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPCBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgc3VjY2VlZHMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0NoX3RyYWl0cywgY2xhc3MgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzwKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLnN0cigpID4gX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0NoX3RyYWl0cywgY2xhc3MgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA+PSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgZG9lcyBub3Qgc3VjY2VlZCBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCBjbGFzcyBfQ2hfdHJhaXRzLCBjbGFzcyBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLnN0cigpIDw9IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSBDIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogICAgICAgIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgQyBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA9PSBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgYW4gaXRlcmF0b3IgdmFsdWUgYW5kIGEgcmVndWxhcgorICAgKiAgICAgICAgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgaXMgbm90IGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzICE9IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBwcmVjZWRlcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzIDwgX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHN1Y2NlZWRzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19saHMsCisJICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPiBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgZG9lcyBub3QgcHJlY2VkZSBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPj0gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzIDw9IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHBvaW50ZXIgdG8gYSBzdHJpbmc/CisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA9PSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHBvaW50ZXIgdG8gYSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGlzIG5vdCBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSAhPSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgcHJlY2VkZXMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA8IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBzdWNjZWVkcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLnN0cigpID4gX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLnN0cigpID49IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBzdWNjZWVkIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA8PSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiAgICAgICAgc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGlzIGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzID09IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgaW5lcXVpdmFsZW5jZSBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogICAgICAgIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBpcyBub3QgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgIT0gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHByZWNlZGVzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwodHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPCBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgc3VjY2VlZHMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPih0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX2xocywKKwkgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA+IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBwcmVjZWRlIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA+PSBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgZG9lcyBub3Qgc3VjY2VlZCBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPD0gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYQorICAgKiAgICAgICAgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgY29uc3Qgc3RyaW5nIHJlZmVyZW5jZS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgIGlzIGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLnN0cigpID09IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgaW5lcXVpdmFsZW5jZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYQorICAgKiAgICAgICAgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgY29uc3Qgc3RyaW5nIHJlZmVyZW5jZS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgaXMgbm90IGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLnN0cigpICE9IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgY29uc3Qgc3RyaW5nIHJlZmVyZW5jZS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgcHJlY2VkZXMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA8IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgY29uc3Qgc3RyaW5nIHJlZmVyZW5jZS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgc3VjY2VlZHMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA+IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgY29uc3Qgc3RyaW5nIHJlZmVyZW5jZS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgZG9lcyBub3QgcHJlY2VkZSBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPj0gX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBjb25zdCBzdHJpbmcgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBzdWNjZWVkIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA8PSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5zZXJ0cyBhIG1hdGNoZWQgc3RyaW5nIGludG8gYW4gb3V0cHV0IHN0cmVhbS4KKyAgICoKKyAgICogQHBhcmFtIG9zIFRoZSBvdXRwdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gbSAgQSBzdWJtYXRjaCBzdHJpbmcuCisgICAqCisgICAqIEByZXR1cm5zIHRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN1Ym1hdGNoIHN0cmluZyBpbnNlcnRlZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUKKyAgICBiYXNpY19vc3RyZWFtPF9DaF90eXBlLCBfQ2hfdHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoX3R5cGUsIF9DaF90cmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX20pCisgICAgeyByZXR1cm4gX19vcyA8PCBfX20uc3RyKCk7IH0KKworICAvLyBbNy4xMF0gQ2xhc3MgdGVtcGxhdGUgbWF0Y2hfcmVzdWx0cworICAvKioKKyAgICogQGJyaWVmIFRoZSByZXN1bHRzIG9mIGEgbWF0Y2ggb3Igc2VhcmNoIG9wZXJhdGlvbi4KKyAgICoKKyAgICogQSBjb2xsZWN0aW9uIG9mIGNoYXJhY3RlciBzZXF1ZW5jZXMgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgYSByZWd1bGFyCisgICAqIGV4cHJlc3Npb24gbWF0Y2guICBTdG9yYWdlIGZvciB0aGUgY29sbGVjdGlvbiBpcyBhbGxvY2F0ZWQgYW5kIGZyZWVkIGFzCisgICAqIG5lY2Vzc2FyeSBieSB0aGUgbWVtYmVyIGZ1bmN0aW9ucyBvZiBjbGFzcyB0ZW1wbGF0ZSBtYXRjaF9yZXN1bHRzLgorICAgKgorICAgKiBUaGlzIGNsYXNzIHNhdGlzZmllcyB0aGUgU2VxdWVuY2UgcmVxdWlyZW1lbnRzLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdAorICAgKiBvbmx5IHRoZSBvcGVyYXRpb25zIGRlZmluZWQgZm9yIGEgY29uc3QtcXVhbGlmaWVkIFNlcXVlbmNlIGFyZSBzdXBwb3J0ZWQuCisgICAqCisgICAqIFRoZSBzdWJfbWF0Y2ggb2JqZWN0IHN0b3JlZCBhdCBpbmRleCAwIHJlcHJlc2VudHMgc3ViLWV4cHJlc3Npb24gMCwgaS5lLgorICAgKiB0aGUgd2hvbGUgbWF0Y2guIEluIHRoaXMgY2FzZSB0aGUgc3ViX21hdGNoIG1lbWJlciBtYXRjaGVkIGlzIGFsd2F5cyB0cnVlLgorICAgKiBUaGUgc3ViX21hdGNoIG9iamVjdCBzdG9yZWQgYXQgaW5kZXggbiBkZW5vdGVzIHdoYXQgbWF0Y2hlZCB0aGUgbWFya2VkCisgICAqIHN1Yi1leHByZXNzaW9uIG4gd2l0aGluIHRoZSBtYXRjaGVkIGV4cHJlc3Npb24uIElmIHRoZSBzdWItZXhwcmVzc2lvbiBuCisgICAqIHBhcnRpY2lwYXRlZCBpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCB0aGVuIHRoZSBzdWJfbWF0Y2ggbWVtYmVyCisgICAqIG1hdGNoZWQgZXZhbHVhdGVzIHRvIHRydWUsIGFuZCBtZW1iZXJzIGZpcnN0IGFuZCBzZWNvbmQgZGVub3RlIHRoZSByYW5nZQorICAgKiBvZiBjaGFyYWN0ZXJzIFtmaXJzdCwgc2Vjb25kKSB3aGljaCBmb3JtZWQgdGhhdCBtYXRjaC4gT3RoZXJ3aXNlIG1hdGNoZWQKKyAgICogaXMgZmFsc2UsIGFuZCBtZW1iZXJzIGZpcnN0IGFuZCBzZWNvbmQgcG9pbnQgdG8gdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UKKyAgICogdGhhdCB3YXMgc2VhcmNoZWQuCisgICAqCisgICAqIEBub3N1Ymdyb3VwaW5nCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yID0gYWxsb2NhdG9yPHN1Yl9tYXRjaDxfQmlfaXRlcj4gPiA+CisgICAgY2xhc3MgbWF0Y2hfcmVzdWx0cworICAgIDogcHJpdmF0ZSBzdGQ6OnZlY3RvcjxzdGQ6OnRyMTo6c3ViX21hdGNoPF9CaV9pdGVyPiwgX0FsbG9jYXRvcj4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjp0cjE6OnN1Yl9tYXRjaDxfQmlfaXRlcj4sIF9BbGxvY2F0b3I+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CYXNlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLj8gUHVibGljIFR5cGVzCisgICAgICAgKi8KKyAgICAgIC8vQHsKKyAgICAgIHR5cGVkZWYgc3ViX21hdGNoPF9CaV9pdGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdF9yZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6c2l6ZV90eXBlICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKyAgICAgIC8vQH0KKyAgCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBAbmFtZSAxMC4xIENvbnN0cnVjdGlvbiwgQ29weWluZywgYW5kIERlc3RydWN0aW9uCisgICAgICAgKi8KKyAgICAgIC8vQHsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIGRlZmF1bHQgJW1hdGNoX3Jlc3VsdHMgY29udGFpbmVyLgorICAgICAgICogQHBvc3Qgc2l6ZSgpIHJldHVybnMgMCBhbmQgc3RyKCkgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBtYXRjaF9yZXN1bHRzKGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2VfdHlwZShfX2EpLCBfTV9tYXRjaGVkKGZhbHNlKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHkgY29uc3RydWN0cyBhICVtYXRjaF9yZXN1bHRzLgorICAgICAgICovCisgICAgICBtYXRjaF9yZXN1bHRzKGNvbnN0IG1hdGNoX3Jlc3VsdHMmIF9fcmhzKQorICAgICAgOiBfQmFzZV90eXBlKF9fcmhzKSwgX01fbWF0Y2hlZChfX3Jocy5fTV9tYXRjaGVkKSwKKwlfTV9wcmVmaXgoX19yaHMuX01fcHJlZml4KSwgX01fc3VmZml4KF9fcmhzLl9NX3N1ZmZpeCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIHJocyB0byAqdGhpcy4KKyAgICAgICAqLworICAgICAgbWF0Y2hfcmVzdWx0cyYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBtYXRjaF9yZXN1bHRzJiBfX3JocykKKyAgICAgIHsKKwltYXRjaF9yZXN1bHRzIF9fdG1wKF9fcmhzKTsKKwl0aGlzLT5zd2FwKF9fdG1wKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERlc3Ryb3lzIGEgJW1hdGNoX3Jlc3VsdHMgb2JqZWN0LgorICAgICAgICovCisgICAgICB+bWF0Y2hfcmVzdWx0cygpCisgICAgICB7IH0KKyAgICAgIAorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLjIgU2l6ZQorICAgICAgICovCisgICAgICAvL0B7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG51bWJlciBvZiBtYXRjaGVzIGFuZCBzdWJtYXRjaGVzLgorICAgICAgICoKKyAgICAgICAqIFRoZSBudW1iZXIgb2YgbWF0Y2hlcyBmb3IgYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gd2lsbCBiZSBlaXRoZXIgMAorICAgICAgICogaWYgdGhlcmUgd2FzIG5vIG1hdGNoIG9yIG1hcmtfY291bnQoKSArIDEgaWYgYSBtYXRjaCB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgICAqIFNvbWUgbWF0Y2hlcyBtYXkgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdGhlIG51bWJlciBvZiBtYXRjaGVzIGZvdW5kLgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbWF0Y2hlZCA/IF9CYXNlX3R5cGU6OnNpemUoKSArIDEgOiAwOyB9CisgICAgICAKKyAgICAgIC8vc2l6ZV90eXBlCisgICAgICAvL21heF9zaXplKCkgY29uc3Q7CisgICAgICB1c2luZyBfQmFzZV90eXBlOjptYXhfc2l6ZTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5kaWNhdGVzIGlmIHRoZSAlbWF0Y2hfcmVzdWx0cyBjb250YWlucyBubyByZXN1bHRzLgorICAgICAgICogQHJldHZhbCB0cnVlIFRoZSAlbWF0Y2hfcmVzdWx0cyBvYmplY3QgaXMgZW1wdHkuCisgICAgICAgKiBAcmV0dmFsIGZhbHNlIFRoZSAlbWF0Y2hfcmVzdWx0cyBvYmplY3QgaXMgbm90IGVtcHR5LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorICAgICAgCisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgMTAuMyBFbGVtZW50IEFjY2VzcworICAgICAgICovCisgICAgICAvL0B7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgaW5kaWNhdGVkIHN1Ym1hdGNoLgorICAgICAgICogQHBhcmFtIHN1YiBpbmRpY2F0ZXMgdGhlIHN1Ym1hdGNoLgorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRpY2F0ZWQgc3VibWF0Y2gsIG9yIHRoZQorICAgICAgICogbGVuZ3RoIG9mIHRoZSBlbnRpcmUgbWF0Y2ggaWYgQHAgc3ViIGlzIHplcm8gKHRoZSBkZWZhdWx0KS4KKyAgICAgICAqLworICAgICAgZGlmZmVyZW5jZV90eXBlCisgICAgICBsZW5ndGgoc2l6ZV90eXBlIF9fc3ViID0gMCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX21hdGNoZWQgPyB0aGlzLT5zdHIoX19zdWIpLmxlbmd0aCgpIDogMDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5kaWNhdGVkIHN1Ym1hdGNoLgorICAgICAgICogQHBhcmFtIHN1YiBpbmRpY2F0ZXMgdGhlIHN1Ym1hdGNoLgorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFyZ2V0CisgICAgICAgKiBzZXF1ZW5jZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdWJtYXRjaCwgdW5sZXNzIHRoZSB2YWx1ZSBvZiBAcCBzdWIKKyAgICAgICAqIGlzIHplcm8gKHRoZSBkZWZhdWx0KSwgaW4gd2hpY2ggY2FzZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9mZnNldAorICAgICAgICogZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YXJnZXQgc2VxdWVuY2UgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgICAqIG1hdGNoLgorICAgICAgICovCisgICAgICBkaWZmZXJlbmNlX3R5cGUKKyAgICAgIHBvc2l0aW9uKHNpemVfdHlwZSBfX3N1YiA9IDApIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9NX21hdGNoZWQgPyBzdGQ6OmRpc3RhbmNlKHRoaXMtPnByZWZpeCgpLmZpcnN0LAorCQkJCQkgICgqdGhpcylbX19zdWJdLmZpcnN0KSA6IDA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG1hdGNoIG9yIHN1Ym1hdGNoIGNvbnZlcnRlZCB0byBhIHN0cmluZyB0eXBlLgorICAgICAgICogQHBhcmFtIHN1YiBpbmRpY2F0ZXMgdGhlIHN1Ym1hdGNoLgorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgc3VibWF0Y2ggKG9yIG1hdGNoLCBpZiBAcCBzdWIgaXMgemVybykgZXh0cmFjdGVkCisgICAgICAgKiBmcm9tIHRoZSB0YXJnZXQgcmFuZ2UgYW5kIGNvbnZlcnRlZCB0byB0aGUgYXNzb2NpYXRlZCBzdHJpbmcgdHlwZS4KKyAgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIHN0cihzaXplX3R5cGUgX19zdWIgPSAwKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbWF0Y2hlZCA/ICgqdGhpcylbX19zdWJdLnN0cigpIDogc3RyaW5nX3R5cGUoKTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgJXN1Yl9tYXRjaCByZWZlcmVuY2UgZm9yIHRoZSBtYXRjaCBvciBzdWJtYXRjaC4KKyAgICAgICAqIEBwYXJhbSBzdWIgaW5kaWNhdGVzIHRoZSBzdWJtYXRjaC4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGluZGljYXRlZCBzdWJtYXRjaCwgb3IgdGhlIGVudGlyZQorICAgICAgICogbWF0Y2ggaWYgQHAgc3ViIGlzIHplcm8uCisgICAgICAgKgorICAgICAgICogSWYgQHAgc3ViID49IHNpemUoKSB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhICVzdWJfbWF0Y2ggd2l0aCBhCisgICAgICAgKiBzcGVjaWFsIHZhbHVlIGluZGljYXRpbmcgbm8gc3VibWF0Y2guCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19zdWIpIGNvbnN0CisgICAgICB7IHJldHVybiBfQmFzZV90eXBlOjpvcGVyYXRvcltdKF9fc3ViKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgJXN1Yl9tYXRjaCByZXByZXNlbnRpbmcgdGhlIG1hdGNoIHByZWZpeC4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGdldHMgYSByZWZlcmVuY2UgdG8gYSAlc3ViX21hdGNoIG9iamVjdCByZXByZXNlbnRpbmcgdGhlCisgICAgICAgKiBwYXJ0IG9mIHRoZSB0YXJnZXQgcmFuZ2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgdGhlIHRhcmdldCByYW5nZSBhbmQgdGhlCisgICAgICAgKiBzdGFydCBvZiB0aGUgbWF0Y2guCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgcHJlZml4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3ByZWZpeDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgJXN1Yl9tYXRjaCByZXByZXNlbnRpbmcgdGhlIG1hdGNoIHN1ZmZpeC4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGdldHMgYSByZWZlcmVuY2UgdG8gYSAlc3ViX21hdGNoIG9iamVjdCByZXByZXNlbnRpbmcgdGhlCisgICAgICAgKiBwYXJ0IG9mIHRoZSB0YXJnZXQgcmFuZ2UgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSBtYXRjaCBhbmQgdGhlIGVuZCBvZgorICAgICAgICogdGhlIHRhcmdldCByYW5nZS4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBzdWZmaXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fc3VmZml4OyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYW4gaXRlcmF0b3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSAlc3ViX21hdGNoIGNvbGxlY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfQmFzZV90eXBlOjpiZWdpbigpOyB9CisgICAgICAKKyNpZmRlZiBfR0xJQkNYWF9JTkNMVURFX0FTX0NYWDExCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGFuIGl0ZXJhdG9yIHRvIHRoZSBzdGFydCBvZiB0aGUgJXN1Yl9tYXRjaCBjb2xsZWN0aW9uLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6OmJlZ2luKCk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGFuIGl0ZXJhdG9yIHRvIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2VfdHlwZTo6ZW5kKCk7IH0KKyAgICAgIAorI2lmZGVmIF9HTElCQ1hYX0lOQ0xVREVfQVNfQ1hYMTEKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYW4gaXRlcmF0b3IgdG8gb25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2VfdHlwZTo6ZW5kKCk7IH0KKyNlbmRpZgorCisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgMTAuNCBGb3JtYXR0aW5nCisgICAgICAgKgorICAgICAgICogVGhlc2UgZnVuY3Rpb25zIHBlcmZvcm0gZm9ybWF0dGVkIHN1YnN0aXR1dGlvbiBvZiB0aGUgbWF0Y2hlZAorICAgICAgICogY2hhcmFjdGVyIHNlcXVlbmNlcyBpbnRvIHRoZWlyIHRhcmdldC4gIFRoZSBmb3JtYXQgc3BlY2lmaWVycworICAgICAgICogYW5kIGVzY2FwZSBzZXF1ZW5jZXMgYWNjZXB0ZWQgYnkgdGhlc2UgZnVuY3Rpb25zIGFyZQorICAgICAgICogZGV0ZXJtaW5lZCBieSB0aGVpciBAcCBmbGFncyBwYXJhbWV0ZXIgYXMgZG9jdW1lbnRlZCBhYm92ZS4KKyAgICAgICAqLworICAgICAgIC8vQHsKKworICAgICAgLyoqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX091dF9pdGVyPgorICAgICAgICBfT3V0X2l0ZXIKKyAgICAgICAgZm9ybWF0KF9PdXRfaXRlciBfX291dCwgY29uc3Qgc3RyaW5nX3R5cGUmIF9fZm10LAorCSAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjpmb3JtYXRfZGVmYXVsdCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHN0cmluZ190eXBlCisgICAgICBmb3JtYXQoY29uc3Qgc3RyaW5nX3R5cGUmIF9fZm10LAorCSAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCSAgICAgPSByZWdleF9jb25zdGFudHM6OmZvcm1hdF9kZWZhdWx0KSBjb25zdDsKKworICAgICAgLy9AfSAKKworICAgICAgLyoqCisgICAgICAgKiBAbmFtZSAxMC41IEFsbG9jYXRvcgorICAgICAgICovCisgICAgICAvL0B7IAorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgY29weSBvZiB0aGUgYWxsb2NhdG9yLgorICAgICAgICovCisgICAgICAvL2FsbG9jYXRvcl90eXBlCisgICAgICAvL2dldF9hbGxvY2F0b3IoKSBjb25zdDsKKyAgICAgIHVzaW5nIF9CYXNlX3R5cGU6OmdldF9hbGxvY2F0b3I7CisgICAgICAKKyAgICAgIC8vQH0gCisKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgMTAuNiBTd2FwCisgICAgICAgKi8KKyAgICAgICAvL0B7IAorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTd2FwcyB0aGUgY29udGVudHMgb2YgdHdvIG1hdGNoX3Jlc3VsdHMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobWF0Y2hfcmVzdWx0cyYgX190aGF0KQorICAgICAgeworCV9CYXNlX3R5cGU6OnN3YXAoX190aGF0KTsKKwlzdGQ6OnN3YXAoX01fbWF0Y2hlZCwgX190aGF0Ll9NX21hdGNoZWQpOworCXN0ZDo6c3dhcChfTV9wcmVmaXgsICBfX3RoYXQuX01fcHJlZml4KTsKKwlzdGQ6OnN3YXAoX01fc3VmZml4LCAgX190aGF0Ll9NX3N1ZmZpeCk7CisgICAgICB9CisgICAgICAvL0B9IAorICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgIGJvb2wgICAgICAgX01fbWF0Y2hlZDsKKyAgICAgIHZhbHVlX3R5cGUgX01fcHJlZml4OworICAgICAgdmFsdWVfdHlwZSBfTV9zdWZmaXg7CisgICAgfTsKKyAgCisgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czxjb25zdCBjaGFyKj4gICAgICAgICAgICAgY21hdGNoOworICB0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gIHNtYXRjaDsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8Y29uc3Qgd2NoYXJfdCo+ICAgICAgICAgIHdjbWF0Y2g7CisgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czx3c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gd3NtYXRjaDsKKyNlbmRpZgorCisgIC8vIG1hdGNoX3Jlc3VsdHMgY29tcGFyaXNvbnMKKyAgLyoqCisgICAqIEBicmllZiBDb21wYXJlcyB0d28gbWF0Y2hfcmVzdWx0cyBmb3IgZXF1YWxpdHkuCisgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIHJlZmVyIHRvIHRoZSBzYW1lIG1hdGNoLAorICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvY2F0b3I+JiBfX20xLAorCSAgICAgICBjb25zdCBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2NhdG9yPiYgX19tMik7CisKKyAgLyoqCisgICAqIEBicmllZiBDb21wYXJlcyB0d28gbWF0Y2hfcmVzdWx0cyBmb3IgaW5lcXVhbGl0eS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgZG8gbm90IHJlZmVyIHRvIHRoZSBzYW1lIG1hdGNoLAorICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jYXRvcj4mIF9fbTEsCisJICAgICAgIGNvbnN0IG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvY2F0b3I+JiBfX20yKQorICAgIHsgcmV0dXJuICEoX19tMSA9PSBfX20yKTsgfQorCisgIC8vIFs3LjEwLjZdIG1hdGNoX3Jlc3VsdHMgc3dhcAorICAvKioKKyAgICogQGJyaWVmIFN3YXBzIHR3byBtYXRjaCByZXN1bHRzLgorICAgKiBAcGFyYW0gbGhzIEEgbWF0Y2ggcmVzdWx0LgorICAgKiBAcGFyYW0gcmhzIEEgbWF0Y2ggcmVzdWx0LgorICAgKgorICAgKiBUaGUgY29udGVudHMgb2YgdGhlIHR3byBtYXRjaF9yZXN1bHRzIG9iamVjdHMgYXJlIHN3YXBwZWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCisgIC8vIFs3LjExLjJdIEZ1bmN0aW9uIHRlbXBsYXRlIHJlZ2V4X21hdGNoCisgIC8qKgorICAgKiBAbmFtZSBNYXRjaGluZywgU2VhcmNoaW5nLCBhbmQgUmVwbGFjaW5nCisgICAqLworICAvL0B7CisKKyAgLyoqCisgICAqIEBicmllZiBEZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIEBwIGUKKyAgICogYW5kIGFsbCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIFtmaXJzdCwgbGFzdCkuCisgICAqCisgICAqIEBwYXJhbSBmaXJzdCBCZWdpbm5pbmcgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogQHBhcmFtIGxhc3QgIE9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogQHBhcmFtIG0gICAgIFRoZSBtYXRjaCByZXN1bHRzLgorICAgKiBAcGFyYW0gcmUgICAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICogQHBhcmFtIGZsYWdzIENvbnRyb2xzIGhvdyB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQuCisgICAqCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCBleGlzdHMuCisgICAqIEByZXR2YWwgZmFsc2UgT3RoZXJ3aXNlLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKgorICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQWxsb2NhdG9yLAorCSAgIHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGJvb2wKKyAgICByZWdleF9tYXRjaChfQmlfaXRlciBfX2ZpcnN0LCBfQmlfaXRlciBfX2xhc3QsCisJCW1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvY2F0b3I+JiBfX20sCisJCWNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQk9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKKyAgLyoqCisgICAqIEBicmllZiBJbmRpY2F0ZXMgaWYgdGhlcmUgaXMgYSBtYXRjaCBiZXR3ZWVuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gQHAgZQorICAgKiBhbmQgYWxsIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgW2ZpcnN0LCBsYXN0KS4KKyAgICoKKyAgICogQHBhcmFtIGZpcnN0IEJlZ2lubmluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIHRvIG1hdGNoLgorICAgKiBAcGFyYW0gbGFzdCAgT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIHRvIG1hdGNoLgorICAgKiBAcGFyYW0gcmUgICAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICogQHBhcmFtIGZsYWdzIENvbnRyb2xzIGhvdyB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQuCisgICAqCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCBleGlzdHMuCisgICAqIEByZXR2YWwgZmFsc2UgT3RoZXJ3aXNlLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGJvb2wKKyAgICByZWdleF9tYXRjaChfQmlfaXRlciBfX2ZpcnN0LCBfQmlfaXRlciBfX2xhc3QsCisJCWNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQk9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7IAorICAgICAgbWF0Y2hfcmVzdWx0czxfQmlfaXRlcj4gX193aGF0OworICAgICAgcmV0dXJuIHJlZ2V4X21hdGNoKF9fZmlyc3QsIF9fbGFzdCwgX193aGF0LCBfX3JlLCBfX2ZsYWdzKTsKKyAgICB9CisKKyAgLyoqCisgICAqIEBicmllZiBEZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIEBwIGUKKyAgICogYW5kIGEgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gcyAgVGhlIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byBtYXRjaC4KKyAgICogQHBhcmFtIG0gIFRoZSBtYXRjaCByZXN1bHRzLgorICAgKiBAcGFyYW0gcmUgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICogQHBhcmFtIGYgIENvbnRyb2xzIGhvdyB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQuCisgICAqCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCBleGlzdHMuCisgICAqIEByZXR2YWwgZmFsc2UgT3RoZXJ3aXNlLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9tYXRjaChjb25zdCBfQ2hfdHlwZSogX19zLAorCQltYXRjaF9yZXN1bHRzPGNvbnN0IF9DaF90eXBlKiwgX0FsbG9jYXRvcj4mIF9fbSwKKwkJY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQlyZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2YKKwkJPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfbWF0Y2goX19zLCBfX3MgKyBfUnhfdHJhaXRzOjpsZW5ndGgoX19zKSwgX19tLCBfX3JlLCBfX2YpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBEZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIEBwIGUKKyAgICogYW5kIGEgc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gcyAgICAgVGhlIHN0cmluZyB0byBtYXRjaC4KKyAgICogQHBhcmFtIG0gICAgIFRoZSBtYXRjaCByZXN1bHRzLgorICAgKiBAcGFyYW0gcmUgICAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICogQHBhcmFtIGZsYWdzIENvbnRyb2xzIGhvdyB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQuCisgICAqCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCBleGlzdHMuCisgICAqIEByZXR2YWwgZmFsc2UgT3RoZXJ3aXNlLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfbWF0Y2goY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3MsCisJCW1hdGNoX3Jlc3VsdHM8dHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCAKKwkJX0NoX3RyYWl0cywgX0NoX2FsbG9jPjo6Y29uc3RfaXRlcmF0b3IsIF9BbGxvY2F0b3I+JiBfX20sCisJCWNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQk9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7IHJldHVybiByZWdleF9tYXRjaChfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX20sIF9fcmUsIF9fZmxhZ3MpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBJbmRpY2F0ZXMgaWYgdGhlcmUgaXMgYSBtYXRjaCBiZXR3ZWVuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gQHAgZQorICAgKiBhbmQgYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCisgICAqCisgICAqIEBwYXJhbSBzICBUaGUgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIG1hdGNoLgorICAgKiBAcGFyYW0gcmUgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICogQHBhcmFtIGYgIENvbnRyb2xzIGhvdyB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQuCisgICAqCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCBleGlzdHMuCisgICAqIEByZXR2YWwgZmFsc2UgT3RoZXJ3aXNlLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGUsIGNsYXNzIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9tYXRjaChjb25zdCBfQ2hfdHlwZSogX19zLAorCQljb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fcmUsCisJCXJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZgorCQk9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7IHJldHVybiByZWdleF9tYXRjaChfX3MsIF9fcyArIF9SeF90cmFpdHM6Omxlbmd0aChfX3MpLCBfX3JlLCBfX2YpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBJbmRpY2F0ZXMgaWYgdGhlcmUgaXMgYSBtYXRjaCBiZXR3ZWVuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gQHAgZQorICAgKiBhbmQgYSBzdHJpbmcuCisgICAqCisgICAqIEBwYXJhbSBzICAgICBbSU5dIFRoZSBzdHJpbmcgdG8gbWF0Y2guCisgICAqIEBwYXJhbSByZSAgICBbSU5dIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBmbGFncyBbSU5dIENvbnRyb2xzIGhvdyB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQuCisgICAqCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCBleGlzdHMuCisgICAqIEByZXR2YWwgZmFsc2UgT3RoZXJ3aXNlLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX1N0cl9hbGxvY2F0b3IsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9tYXRjaChjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIF9DaF90cmFpdHMsIF9TdHJfYWxsb2NhdG9yPiYgX19zLAorCQljb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fcmUsCisJCXJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfbWF0Y2goX19zLmJlZ2luKCksIF9fcy5lbmQoKSwgX19yZSwgX19mbGFncyk7IH0KKworICAvLyBbNy4xMS4zXSBGdW5jdGlvbiB0ZW1wbGF0ZSByZWdleF9zZWFyY2gKKyAgLyoqCisgICAqIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSByYW5nZS4KKyAgICogQHBhcmFtIGZpcnN0IFtJTl0gIFRoZSBzdGFydCBvZiB0aGUgc3RyaW5nIHRvIHNlYXJjaC4KKyAgICogQHBhcmFtIGxhc3QgIFtJTl0gIE9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIHN0cmluZyB0byBzZWFyY2guCisgICAqIEBwYXJhbSBtICAgICBbT1VUXSBUaGUgbWF0Y2ggcmVzdWx0cy4KKyAgICogQHBhcmFtIHJlICAgIFtJTl0gIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICogQHBhcmFtIGZsYWdzIFtJTl0gIFNlYXJjaCBwb2xpY3kgZmxhZ3MuCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEByZXR2YWwgZmFsc2UgTm8gbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLCB0aGUgY29udGVudCBvZiAlbSBpcworICAgKiAgICAgICAgICAgICAgIHVuZGVmaW5lZC4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICoKKyAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0FsbG9jYXRvciwKKwkgICB0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChfQmlfaXRlciBfX2ZpcnN0LCBfQmlfaXRlciBfX2xhc3QsCisJCSBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2NhdG9yPiYgX19tLAorCQkgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQkgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgIC8qKgorICAgKiBTZWFyY2hlcyBmb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aGluIGEgcmFuZ2UuCisgICAqIEBwYXJhbSBmaXJzdCBbSU5dICBUaGUgc3RhcnQgb2YgdGhlIHN0cmluZyB0byBzZWFyY2guCisgICAqIEBwYXJhbSBsYXN0ICBbSU5dICBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBzdHJpbmcgdG8gc2VhcmNoLgorICAgKiBAcGFyYW0gcmUgICAgW0lOXSAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLgorICAgKiBAcGFyYW0gZmxhZ3MgW0lOXSAgU2VhcmNoIHBvbGljeSBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEBkb2N0b2RvCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9zZWFyY2goX0JpX2l0ZXIgX19maXJzdCwgX0JpX2l0ZXIgX19sYXN0LAorCQkgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQkgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeworICAgICAgbWF0Y2hfcmVzdWx0czxfQmlfaXRlcj4gX193aGF0OworICAgICAgcmV0dXJuIHJlZ2V4X3NlYXJjaChfX2ZpcnN0LCBfX2xhc3QsIF9fd2hhdCwgX19yZSwgX19mbGFncyk7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgU2VhcmNoZXMgZm9yIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIEMtc3RyaW5nLgorICAgKiBAcGFyYW0gcyBbSU5dICBBIEMtc3RyaW5nIHRvIHNlYXJjaCBmb3IgdGhlIHJlZ2V4LgorICAgKiBAcGFyYW0gbSBbT1VUXSBUaGUgc2V0IG9mIHJlZ2V4IG1hdGNoZXMuCisgICAqIEBwYXJhbSBlIFtJTl0gIFRoZSByZWdleCB0byBzZWFyY2ggZm9yIGluIEBwIHMuCisgICAqIEBwYXJhbSBmIFtJTl0gIFRoZSBzZWFyY2ggZmxhZ3MuCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEByZXR2YWwgZmFsc2UgTm8gbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLCB0aGUgY29udGVudCBvZiAlbSBpcworICAgKiAgICAgICAgICAgICAgIHVuZGVmaW5lZC4KKyAgICogQGRvY3RvZG8KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCBjbGFzcyBfQWxsb2NhdG9yLCBjbGFzcyBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfc2VhcmNoKGNvbnN0IF9DaF90eXBlKiBfX3MsCisJCSBtYXRjaF9yZXN1bHRzPGNvbnN0IF9DaF90eXBlKiwgX0FsbG9jYXRvcj4mIF9fbSwKKwkJIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19lLAorCQkgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mCisJCSA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7IHJldHVybiByZWdleF9zZWFyY2goX19zLCBfX3MgKyBfUnhfdHJhaXRzOjpsZW5ndGgoX19zKSwgX19tLCBfX2UsIF9fZik7IH0KKworICAvKioKKyAgICogQGJyaWVmIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSBDLXN0cmluZy4KKyAgICogQHBhcmFtIHMgW0lOXSAgVGhlIEMtc3RyaW5nIHRvIHNlYXJjaC4KKyAgICogQHBhcmFtIGUgW0lOXSAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLgorICAgKiBAcGFyYW0gZiBbSU5dICBTZWFyY2ggcG9saWN5IGZsYWdzLgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAcmV0dmFsIGZhbHNlIE5vIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQGRvY3RvZG8KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfc2VhcmNoKGNvbnN0IF9DaF90eXBlKiBfX3MsCisJCSBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZgorCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfc2VhcmNoKF9fcywgX19zICsgX1J4X3RyYWl0czo6bGVuZ3RoKF9fcyksIF9fZSwgX19mKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgU2VhcmNoZXMgZm9yIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIHN0cmluZy4KKyAgICogQHBhcmFtIHMgICAgIFtJTl0gIFRoZSBzdHJpbmcgdG8gc2VhcmNoLgorICAgKiBAcGFyYW0gZSAgICAgW0lOXSAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLgorICAgKiBAcGFyYW0gZmxhZ3MgW0lOXSAgU2VhcmNoIHBvbGljeSBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEBkb2N0b2RvCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfU3RyaW5nX2FsbG9jYXRvciwKKwkgICB0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIF9DaF90cmFpdHMsCisJCSBfU3RyaW5nX2FsbG9jYXRvcj4mIF9fcywKKwkJIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19lLAorCQkgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfc2VhcmNoKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fZSwgX19mbGFncyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSBzdHJpbmcuCisgICAqIEBwYXJhbSBzIFtJTl0gIEEgQysrIHN0cmluZyB0byBzZWFyY2ggZm9yIHRoZSByZWdleC4KKyAgICogQHBhcmFtIG0gW09VVF0gVGhlIHNldCBvZiByZWdleCBtYXRjaGVzLgorICAgKiBAcGFyYW0gZSBbSU5dICBUaGUgcmVnZXggdG8gc2VhcmNoIGZvciBpbiBAcCBzLgorICAgKiBAcGFyYW0gZiBbSU5dICBUaGUgc2VhcmNoIGZsYWdzLgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAcmV0dmFsIGZhbHNlIE5vIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZywgdGhlIGNvbnRlbnQgb2YgJW0gaXMKKyAgICogICAgICAgICAgICAgICB1bmRlZmluZWQuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2MsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0NoX3R5cGUsCisJICAgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcywKKwkJIG1hdGNoX3Jlc3VsdHM8dHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaF90eXBlLAorCQkgX0NoX3RyYWl0cywgX0NoX2FsbG9jPjo6Y29uc3RfaXRlcmF0b3IsIF9BbGxvY2F0b3I+JiBfX20sCisJCSBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZgorCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfc2VhcmNoKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fbSwgX19lLCBfX2YpOyB9CisKKyAgLy8gdHIxIFs3LjExLjRdIHN0ZCBbMjguMTEuNF0gRnVuY3Rpb24gdGVtcGxhdGUgcmVnZXhfcmVwbGFjZQorICAvKioKKyAgICogQGRvY3RvZG8KKyAgICogQHBhcmFtIG91dAorICAgKiBAcGFyYW0gZmlyc3QKKyAgICogQHBhcmFtIGxhc3QKKyAgICogQHBhcmFtIGUKKyAgICogQHBhcmFtIGZtdAorICAgKiBAcGFyYW0gZmxhZ3MKKyAgICoKKyAgICogQHJldHVybnMgb3V0CisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqCisgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX091dF9pdGVyLCB0eXBlbmFtZSBfQmlfaXRlciwKKwkgICB0eXBlbmFtZSBfUnhfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfdHlwZT4KKyAgICBpbmxpbmUgX091dF9pdGVyCisgICAgcmVnZXhfcmVwbGFjZShfT3V0X2l0ZXIgX19vdXQsIF9CaV9pdGVyIF9fZmlyc3QsIF9CaV9pdGVyIF9fbGFzdCwKKwkJICBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJICBjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGU+JiBfX2ZtdCwKKwkJICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJCSAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgIC8qKgorICAgKiBAZG9jdG9kbworICAgKiBAcGFyYW0gcworICAgKiBAcGFyYW0gZQorICAgKiBAcGFyYW0gZm10CisgICAqIEBwYXJhbSBmbGFncworICAgKgorICAgKiBAcmV0dXJucyBhIGNvcHkgb2Ygc3RyaW5nIEBwIHMgd2l0aCByZXBsYWNlbWVudHMuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUnhfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfdHlwZT4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaF90eXBlPgorICAgIHJlZ2V4X3JlcGxhY2UoY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlPiYgX19zLAorCQkgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19lLAorCQkgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZT4mIF9fZm10LAorCQkgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7CisgICAgICBzdGQ6OnN0cmluZyBfX3Jlc3VsdDsKKyAgICAgIHJlZ2V4X3JlcGxhY2Uoc3RkOjpiYWNrX2luc2VydGVyKF9fcmVzdWx0KSwKKwkJICAgIF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fZSwgX19mbXQsIF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvL0B9CisKKyAgLy8gdHIxIFs3LjEyLjFdIHN0ZCBbMjguMTJdIENsYXNzIHRlbXBsYXRlIHJlZ2V4X2l0ZXJhdG9yCisgIC8qKgorICAgKiBBbiBpdGVyYXRvciBhZGFwdG9yIHRoYXQgd2lsbCBwcm92aWRlIHJlcGVhdGVkIGNhbGxzIG9mIHJlZ2V4X3NlYXJjaCBvdmVyIAorICAgKiBhIHJhbmdlIHVudGlsIG5vIG1vcmUgbWF0Y2hlcyByZW1haW4uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwKKwkgICB0eXBlbmFtZSBfQ2hfdHlwZSA9IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgdHlwZW5hbWUgX1J4X3RyYWl0cyA9IHJlZ2V4X3RyYWl0czxfQ2hfdHlwZT4gPgorICAgIGNsYXNzIHJlZ2V4X2l0ZXJhdG9yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+ICByZWdleF90eXBlOworICAgICAgdHlwZWRlZiBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyPiAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUHJvdmlkZXMgYSBzaW5ndWxhciBpdGVyYXRvciwgdXNlZnVsIGZvciBpbmRpY2F0aW5nCisgICAgICAgKiBvbmUtcGFzdC10aGUtZW5kIG9mIGEgcmFuZ2UuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X2l0ZXJhdG9yKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhICVyZWdleF9pdGVyYXRvci4uLgorICAgICAgICogQHBhcmFtIGEgIFtJTl0gVGhlIHN0YXJ0IG9mIGEgdGV4dCByYW5nZSB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gYiAgW0lOXSBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSB0ZXh0IHJhbmdlIHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSByZSBbSU5dIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2guCisgICAgICAgKiBAcGFyYW0gbSAgW0lOXSBQb2xpY3kgZmxhZ3MgZm9yIG1hdGNoIHJ1bGVzLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF9pdGVyYXRvcihfQmlfaXRlciBfX2EsIF9CaV9pdGVyIF9fYiwgY29uc3QgcmVnZXhfdHlwZSYgX19yZSwKKwkJICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX20KKwkJICAgICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKKyAgICAgIC8qKgorICAgICAgICogQ29weSBjb25zdHJ1Y3RzIGEgJXJlZ2V4X2l0ZXJhdG9yLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF9pdGVyYXRvcihjb25zdCByZWdleF9pdGVyYXRvciYgX19yaHMpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgcmVnZXhfaXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgcmVnZXhfaXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgcmVnZXhfaXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIGNvbnN0IHZhbHVlX3R5cGUmCisgICAgICBvcGVyYXRvciooKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIGNvbnN0IHZhbHVlX3R5cGUqCisgICAgICBvcGVyYXRvci0+KCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCk7CisgICAgICAKKyAgICBwcml2YXRlOgorICAgICAgLy8gdGhlc2UgbWVtYmVycyBhcmUgc2hvd24gZm9yIGV4cG9zaXRpb24gb25seToKKyAgICAgIF9CaV9pdGVyICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOworICAgICAgX0JpX2l0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOworICAgICAgY29uc3QgcmVnZXhfdHlwZSogICAgICAgICAgICAgICAgcHJlZ2V4OworICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgZmxhZ3M7CisgICAgICBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyPiAgICAgICAgICBtYXRjaDsKKyAgICB9OworICAKKyAgdHlwZWRlZiByZWdleF9pdGVyYXRvcjxjb25zdCBjaGFyKj4gICAgICAgICAgICAgY3JlZ2V4X2l0ZXJhdG9yOworICB0eXBlZGVmIHJlZ2V4X2l0ZXJhdG9yPHN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICBzcmVnZXhfaXRlcmF0b3I7CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdHlwZWRlZiByZWdleF9pdGVyYXRvcjxjb25zdCB3Y2hhcl90Kj4gICAgICAgICAgd2NyZWdleF9pdGVyYXRvcjsKKyAgdHlwZWRlZiByZWdleF9pdGVyYXRvcjx3c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gd3NyZWdleF9pdGVyYXRvcjsKKyNlbmRpZgorCisgIC8vIFs3LjEyLjJdIENsYXNzIHRlbXBsYXRlIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yCisgIC8qKgorICAgKiBJdGVyYXRlcyBvdmVyIHN1Ym1hdGNoZXMgaW4gYSByYW5nZSAob3IgQGEgc3BsaXRzIGEgdGV4dCBzdHJpbmcpLgorICAgKgorICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGl0ZXJhdG9yIGlzIHRvIGVudW1lcmF0ZSBhbGwsIG9yIGFsbCBzcGVjaWZpZWQsCisgICAqIG1hdGNoZXMgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aGluIGEgdGV4dCByYW5nZS4gIFRoZSBkZXJlZmVyZW5jZWQKKyAgICogdmFsdWUgb2YgYW4gaXRlcmF0b3Igb2YgdGhpcyBjbGFzcyBpcyBhIHN0ZDo6dHIxOjpzdWJfbWF0Y2ggb2JqZWN0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUgPSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgIHR5cGVuYW1lIF9SeF90cmFpdHMgPSByZWdleF90cmFpdHM8X0NoX3R5cGU+ID4KKyAgICBjbGFzcyByZWdleF90b2tlbl9pdGVyYXRvcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiByZWdleF90eXBlOworICAgICAgdHlwZWRlZiBzdWJfbWF0Y2g8X0JpX2l0ZXI+ICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIAorICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERlZmF1bHQgY29uc3RydWN0cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogCisgICAgICAgKiBBIGRlZmF1bHQtY29uc3RydWN0ZWQgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yIGlzIGEgc2luZ3VsYXIgaXRlcmF0b3IKKyAgICAgICAqIHRoYXQgd2lsbCBjb21wYXJlIGVxdWFsIHRvIHRoZSBvbmUtcGFzdC10aGUtZW5kIHZhbHVlIGZvciBhbnkKKyAgICAgICAqIGl0ZXJhdG9yIG9mIHRoZSBzYW1lIHR5cGUuCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4uLgorICAgICAgICogQHBhcmFtIGEgICAgICAgICAgW0lOXSBUaGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gc2VhcmNoLgorICAgICAgICogQHBhcmFtIGIgICAgICAgICAgW0lOXSBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSByZSAgICAgICAgIFtJTl0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLgorICAgICAgICogQHBhcmFtIHN1Ym1hdGNoICAgW0lOXSBXaGljaCBzdWJtYXRjaCB0byByZXR1cm4uICBUaGVyZSBhcmUgc29tZQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsIHZhbHVlcyBmb3IgdGhpcyBwYXJhbWV0ZXI6CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIC0gLTEgZWFjaCBlbnVtZXJhdGVkIHN1YmV4cHJlc3Npb24gZG9lcyBOT1QKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uIChha2EgZmllbGQKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpdHRpbmcpCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIC0gMCB0aGUgZW50aXJlIHN0cmluZyBtYXRjaGluZyB0aGUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJleHByZXNzaW9uIGlzIHJldHVybmVkIGZvciBlYWNoIG1hdGNoCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIHRoZSB0ZXh0LgorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAtID4wIGVudW1lcmF0ZXMgb25seSB0aGUgaW5kaWNhdGVkCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZXhwcmVzc2lvbiBmcm9tIGEgbWF0Y2ggd2l0aGluIHRoZSB0ZXh0LgorICAgICAgICogQHBhcmFtIG0gICAgICAgICAgW0lOXSBQb2xpY3kgZmxhZ3MgZm9yIG1hdGNoIHJ1bGVzLgorICAgICAgICoKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoX0JpX2l0ZXIgX19hLCBfQmlfaXRlciBfX2IsIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsCisJCQkgICBpbnQgX19zdWJtYXRjaCA9IDAsCisJCQkgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX20KKwkJCSAgID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLi4uCisgICAgICAgKiBAcGFyYW0gYSAgICAgICAgICBbSU5dIFRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gYiAgICAgICAgICBbSU5dIE9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIHRleHQgdG8gc2VhcmNoLgorICAgICAgICogQHBhcmFtIHJlICAgICAgICAgW0lOXSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiBAcGFyYW0gc3VibWF0Y2hlcyBbSU5dIEEgbGlzdCBvZiBzdWJleHByZXNzaW9ucyB0byByZXR1cm4gZm9yIGVhY2gKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIHdpdGhpbiB0aGUgdGV4dC4KKyAgICAgICAqIEBwYXJhbSBtICAgICAgICAgIFtJTl0gUG9saWN5IGZsYWdzIGZvciBtYXRjaCBydWxlcy4KKyAgICAgICAqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKF9CaV9pdGVyIF9fYSwgX0JpX2l0ZXIgX19iLAorCQkJICAgY29uc3QgcmVnZXhfdHlwZSYgX19yZSwKKwkJCSAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIF9fc3VibWF0Y2hlcywKKwkJCSAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fbQorCQkJICAgICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4uLgorICAgICAgICogQHBhcmFtIGEgICAgICAgICAgW0lOXSBUaGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gc2VhcmNoLgorICAgICAgICogQHBhcmFtIGIgICAgICAgICAgW0lOXSBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSByZSAgICAgICAgIFtJTl0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLgorICAgICAgICogQHBhcmFtIHN1Ym1hdGNoZXMgW0lOXSBBIGxpc3Qgb2Ygc3ViZXhwcmVzc2lvbnMgdG8gcmV0dXJuIGZvciBlYWNoCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCB3aXRoaW4gdGhlIHRleHQuCisgICAgICAgKiBAcGFyYW0gbSAgICAgICAgICBbSU5dIFBvbGljeSBmbGFncyBmb3IgbWF0Y2ggcnVsZXMuCisgICAgICAgCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9ObT4KKyAgICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoX0JpX2l0ZXIgX19hLCBfQmlfaXRlciBfX2IsCisJCQkgICAgIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsCisJCQkgICAgIGNvbnN0IGludCAoJl9fc3VibWF0Y2hlcylbX05tXSwKKwkJCSAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tCisJCQkgICAgID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29weSBjb25zdHJ1Y3RzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLgorICAgICAgICogQHBhcmFtIHJocyBbSU5dIEEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yIHRvIGNvcHkuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoY29uc3QgcmVnZXhfdG9rZW5faXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhICVyZWdleF90b2tlbl9pdGVyYXRvciB0byBhbm90aGVyLgorICAgICAgICogQHBhcmFtIHJocyBbSU5dIEEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yIHRvIGNvcHkuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgcmVnZXhfdG9rZW5faXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IgdG8gYW5vdGhlciBmb3IgZXF1YWxpdHkuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCByZWdleF90b2tlbl9pdGVyYXRvciYgX19yaHMpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyBhICVyZWdleF90b2tlbl9pdGVyYXRvciB0byBhbm90aGVyIGZvciBpbmVxdWFsaXR5LgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgcmVnZXhfdG9rZW5faXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRGVyZWZlcmVuY2VzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0IHZhbHVlX3R5cGUmCisgICAgICBvcGVyYXRvciooKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2VsZWN0cyBhICVyZWdleF90b2tlbl9pdGVyYXRvciBtZW1iZXIuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3QgdmFsdWVfdHlwZSoKKyAgICAgIG9wZXJhdG9yLT4oKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5jcmVtZW50cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICByZWdleF90b2tlbl9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUG9zdGluY3JlbWVudHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KTsKKyAgICAgIAorICAgIHByaXZhdGU6IC8vIGRhdGEgbWVtYmVycyBmb3IgZXhwb3NpdGlvbiBvbmx5OgorICAgICAgdHlwZWRlZiByZWdleF9pdGVyYXRvcjxfQmlfaXRlciwgX0NoX3R5cGUsIF9SeF90cmFpdHM+IHBvc2l0aW9uX2l0ZXJhdG9yOworCisgICAgICBwb3NpdGlvbl9pdGVyYXRvciBfX3Bvc2l0aW9uOworICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19yZXN1bHQ7CisgICAgICB2YWx1ZV90eXBlICAgICAgICBfX3N1ZmZpeDsKKyAgICAgIHN0ZDo6c2l6ZV90ICAgICAgIF9fbjsKKyAgICAgIHN0ZDo6dmVjdG9yPGludD4gIF9fc3ViczsKKyAgICB9OworCisgIC8qKiBAYnJpZWYgVG9rZW4gaXRlcmF0b3IgZm9yIEMtc3R5bGUgTlVMTC10ZXJtaW5hdGVkIHN0cmluZ3MuICovCisgIHR5cGVkZWYgcmVnZXhfdG9rZW5faXRlcmF0b3I8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNyZWdleF90b2tlbl9pdGVyYXRvcjsKKyAgLyoqIEBicmllZiBUb2tlbiBpdGVyYXRvciBmb3Igc3RhbmRhcmQgc3RyaW5ncy4gKi8KKyAgdHlwZWRlZiByZWdleF90b2tlbl9pdGVyYXRvcjxzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiAgc3JlZ2V4X3Rva2VuX2l0ZXJhdG9yOworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8qKiBAYnJpZWYgVG9rZW4gaXRlcmF0b3IgZm9yIEMtc3R5bGUgTlVMTC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5ncy4gKi8KKyAgdHlwZWRlZiByZWdleF90b2tlbl9pdGVyYXRvcjxjb25zdCB3Y2hhcl90Kj4gICAgICAgICAgd2NyZWdleF90b2tlbl9pdGVyYXRvcjsKKyAgLyoqIEBicmllZiBUb2tlbiBpdGVyYXRvciBmb3Igc3RhbmRhcmQgd2lkZS1jaGFyYWN0ZXIgc3RyaW5ncy4gKi8KKyAgdHlwZWRlZiByZWdleF90b2tlbl9pdGVyYXRvcjx3c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gd3NyZWdleF90b2tlbl9pdGVyYXRvcjsKKyNlbmRpZgorICAKKyAgLy9AfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9SRUdFWApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvcmllbWFubl96ZXRhLnRjYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3JpZW1hbm5femV0YS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyMzIwNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3JpZW1hbm5femV0YS50Y2MKQEAgLTAsMCArMSw0MzMgQEAKKy8vIFNwZWNpYWwgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3JpZW1hbm5femV0YS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvY21hdGh9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODIgVFIxOiA1LjIgIFNwZWNpYWwgZnVuY3Rpb25zCisvLworCisvLyBXcml0dGVuIGJ5IEVkd2FyZCBTbWl0aC1Sb3dsYW5kIGJhc2VkIG9uOgorLy8gICAoMSkgSGFuZGJvb2sgb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9ucywKKy8vICAgICAgIEVkLiBieSBNaWx0b24gQWJyYW1vd2l0eiBhbmQgSXJlbmUgQS4gU3RlZ3VuLAorLy8gICAgICAgRG92ZXIgUHVibGljYXRpb25zLCBOZXctWW9yaywgU2VjdGlvbiA1LCBwcC4gODA3LTgwOC4KKy8vICAgKDIpIFRoZSBHbnUgU2NpZW50aWZpYyBMaWJyYXJ5LCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3NsCisvLyAgICgzKSBHYW1tYSwgRXhwbG9yaW5nIEV1bGVyJ3MgQ29uc3RhbnQsIEp1bGlhbiBIYXZpbCwKKy8vICAgICAgIFByaW5jZXRvbiwgMjAwMy4KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfUklFTUFOTl9aRVRBX1RDQworI2RlZmluZSBfR0xJQkNYWF9UUjFfUklFTUFOTl9aRVRBX1RDQyAxCisKKyNpbmNsdWRlICJzcGVjaWFsX2Z1bmN0aW9uX3V0aWwuaCIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIFs1LjJdIFNwZWNpYWwgZnVuY3Rpb25zCisKKyAgLy8gSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBDb21wdXRlIHRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gQGYkIFx6ZXRhKHMpIEBmJAorICAgICAqICAgICAgICAgICBieSBzdW1tYXRpb24gZm9yIHMgPiAxLgorICAgICAqIAorICAgICAqICAgVGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgIFxmWworICAgICAqICAgICAgXHpldGEocykgPSBcc3VtX3trPTF9XntcaW5mdHl9IFxmcmFjezF9e2tee3N9fSBmb3IgcyA+IDEKKyAgICAgKiAgICBcZl0KKyAgICAgKiAgIEZvciBzIDwgMSB1c2UgdGhlIHJlZmxlY3Rpb24gZm9ybXVsYToKKyAgICAgKiAgICBcZlsKKyAgICAgKiAgICAgIFx6ZXRhKHMpID0gMl5zIFxwaV57cy0xfSBcR2FtbWEoMS1zKSBcemV0YSgxLXMpCisgICAgICogICAgXGZdCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fcmllbWFubl96ZXRhX3N1bShfVHAgX19zKQorICAgIHsKKyAgICAgIC8vICBBIHVzZXIgc2hvdWxkbid0IGdldCB0byB0aGlzLgorICAgICAgaWYgKF9fcyA8IF9UcCgxKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCBpbiB6ZXRhIHN1bS4iKSk7CisKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBtYXhfaXRlciA9IDEwMDAwOworICAgICAgX1RwIF9femV0YSA9IF9UcCgwKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9fayA9IDE7IF9fayA8IG1heF9pdGVyOyArK19faykKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3Rlcm0gPSBzdGQ6OnBvdyhzdGF0aWNfY2FzdDxfVHA+KF9fayksIC1fX3MpOworICAgICAgICAgIGlmIChfX3Rlcm0gPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgX196ZXRhICs9IF9fdGVybTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX196ZXRhOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIEV2YWx1YXRlIHRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gQGYkIFx6ZXRhKHMpIEBmJAorICAgICAqICAgICAgICAgICBieSBhbiBhbHRlcm5hdGUgc2VyaWVzIGZvciBzID4gMC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBieToKKyAgICAgKiAgICBcZlsKKyAgICAgKiAgICAgIFx6ZXRhKHMpID0gXHN1bV97az0xfV57XGluZnR5fSBcZnJhY3sxfXtrXntzfX0gZm9yIHMgPiAxCisgICAgICogICAgXGZdCisgICAgICogICBGb3IgcyA8IDEgdXNlIHRoZSByZWZsZWN0aW9uIGZvcm11bGE6CisgICAgICogICAgXGZbCisgICAgICogICAgICBcemV0YShzKSA9IDJecyBccGlee3MtMX0gXEdhbW1hKDEtcykgXHpldGEoMS1zKQorICAgICAqICAgIFxmXQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3JpZW1hbm5femV0YV9hbHQoX1RwIF9fcykKKyAgICB7CisgICAgICBfVHAgX19zZ24gPSBfVHAoMSk7CisgICAgICBfVHAgX196ZXRhID0gX1RwKDApOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMTsgX19pIDwgMTAwMDAwMDA7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fdGVybSA9IF9fc2duIC8gc3RkOjpwb3coX19pLCBfX3MpOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0pIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3pldGEgKz0gX190ZXJtOworICAgICAgICAgIF9fc2duICo9IF9UcCgtMSk7CisgICAgICAgIH0KKyAgICAgIF9femV0YSAvPSBfVHAoMSkgLSBzdGQ6OnBvdyhfVHAoMiksIF9UcCgxKSAtIF9fcyk7CisKKyAgICAgIHJldHVybiBfX3pldGE7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgRXZhbHVhdGUgdGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBieSBzZXJpZXMgZm9yIGFsbCBzICE9IDEuCisgICAgICogICAgICAgICAgIENvbnZlcmdlbmNlIGlzIGdyZWF0IHVudGlsIGxhcmdpc2ggbmVnYXRpdmUgbnVtYmVycy4KKyAgICAgKiAgICAgICAgICAgVGhlbiB0aGUgY29udmVyZ2VuY2Ugb2YgdGhlID4gMCBzdW0gZ2V0cyBiZXR0ZXIuCisgICAgICoKKyAgICAgKiAgIFRoZSBzZXJpZXMgaXM6CisgICAgICogICAgXGZbCisgICAgICogICAgICBcemV0YShzKSA9IFxmcmFjezF9ezEtMl57MS1zfX0KKyAgICAgKiAgICAgICAgICAgICAgICAgXHN1bV97bj0wfV57XGluZnR5fSBcZnJhY3sxfXsyXntuKzF9fQorICAgICAqICAgICAgICAgICAgICAgICBcc3VtX3trPTB9XntufSAoLTEpXmsgXGZyYWN7biF9eyhuLWspIWshfSAoaysxKV57LXN9CisgICAgICogICAgXGZdCisgICAgICogICBIYXZpbCAyMDAzLCBwLiAyMDYuCisgICAgICoKKyAgICAgKiAgIFRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBieToKKyAgICAgKiAgICBcZlsKKyAgICAgKiAgICAgIFx6ZXRhKHMpID0gXHN1bV97az0xfV57XGluZnR5fSBcZnJhY3sxfXtrXntzfX0gZm9yIHMgPiAxCisgICAgICogICAgXGZdCisgICAgICogICBGb3IgcyA8IDEgdXNlIHRoZSByZWZsZWN0aW9uIGZvcm11bGE6CisgICAgICogICAgXGZbCisgICAgICogICAgICBcemV0YShzKSA9IDJecyBccGlee3MtMX0gXEdhbW1hKDEtcykgXHpldGEoMS1zKQorICAgICAqICAgIFxmXQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3JpZW1hbm5femV0YV9nbG9iKF9UcCBfX3MpCisgICAgeworICAgICAgX1RwIF9femV0YSA9IF9UcCgwKTsKKworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICAvLyAgTWF4IGUgZXhwb25lbnQgYmVmb3JlIG92ZXJmbG93LgorICAgICAgY29uc3QgX1RwIF9fbWF4X2JpbmNvZWZmID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptYXhfZXhwb25lbnQxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RkOjpsb2coX1RwKDEwKSkgLSBfVHAoMSk7CisKKyAgICAgIC8vICBUaGlzIHNlcmllcyB3b3JrcyB1bnRpbCB0aGUgYmlub21pYWwgY29lZmZpY2llbnQgYmxvd3MgdXAKKyAgICAgIC8vICBzbyB1c2UgcmVmbGVjdGlvbi4KKyAgICAgIGlmIChfX3MgPCBfVHAoMCkpCisgICAgICAgIHsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgaWYgKHN0ZDo6dHIxOjpmbW9kKF9fcyxfVHAoMikpID09IF9UcCgwKSkKKyAgICAgICAgICAgIHJldHVybiBfVHAoMCk7CisgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9UcCBfX3pldGEgPSBfX3JpZW1hbm5femV0YV9nbG9iKF9UcCgxKSAtIF9fcyk7CisgICAgICAgICAgICAgIF9femV0YSAqPSBzdGQ6OnBvdyhfVHAoMikKKyAgICAgICAgICAgICAgICAgICAgICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCksIF9fcykKKyAgICAgICAgICAgICAgICAgICAgICogc3RkOjpzaW4oX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpXzIoKSAqIF9fcykKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6ZXhwKHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKDEpIC0gX19zKSkKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6ZXhwKF9fbG9nX2dhbW1hKF9UcCgxKSAtIF9fcykpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgIC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCk7CisgICAgICAgICAgICAgIHJldHVybiBfX3pldGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgX1RwIF9fbnVtID0gX1RwKDAuNUwpOworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4aXQgPSAxMDAwMDsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDA7IF9faSA8IF9fbWF4aXQ7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgYm9vbCBfX3B1bnQgPSBmYWxzZTsKKyAgICAgICAgICBfVHAgX19zZ24gPSBfVHAoMSk7CisgICAgICAgICAgX1RwIF9fdGVybSA9IF9UcCgwKTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2ogPSAwOyBfX2ogPD0gX19pOyArK19faikKKyAgICAgICAgICAgIHsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgICAgIF9UcCBfX2JpbmNvZWZmID0gIHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKDEgKyBfX2kpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzdGQ6OnRyMTo6bGdhbW1hKF9UcCgxICsgX19qKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3RkOjp0cjE6OmxnYW1tYShfVHAoMSArIF9faSAtIF9faikpOworI2Vsc2UKKyAgICAgICAgICAgICAgX1RwIF9fYmluY29lZmYgPSAgX19sb2dfZ2FtbWEoX1RwKDEgKyBfX2kpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX2xvZ19nYW1tYShfVHAoMSArIF9faikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIF9fbG9nX2dhbW1hKF9UcCgxICsgX19pIC0gX19qKSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgaWYgKF9fYmluY29lZmYgPiBfX21heF9iaW5jb2VmZikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvLyAgVGhpcyBvbmx5IGdldHMgaGl0IGZvciB4IDw8IDAuCisgICAgICAgICAgICAgICAgICBfX3B1bnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBfX2JpbmNvZWZmID0gc3RkOjpleHAoX19iaW5jb2VmZik7CisgICAgICAgICAgICAgIF9fdGVybSArPSBfX3NnbiAqIF9fYmluY29lZmYgKiBzdGQ6OnBvdyhfVHAoMSArIF9faiksIC1fX3MpOworICAgICAgICAgICAgICBfX3NnbiAqPSBfVHAoLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChfX3B1bnQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3Rlcm0gKj0gX19udW07CisgICAgICAgICAgX196ZXRhICs9IF9fdGVybTsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX190ZXJtL19femV0YSkgPCBfX2VwcykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIF9fbnVtICo9IF9UcCgwLjVMKTsKKyAgICAgICAgfQorCisgICAgICBfX3pldGEgLz0gX1RwKDEpIC0gc3RkOjpwb3coX1RwKDIpLCBfVHAoMSkgLSBfX3MpOworCisgICAgICByZXR1cm4gX196ZXRhOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIENvbXB1dGUgdGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBAZiQgXHpldGEocykgQGYkCisgICAgICogICAgICAgICAgIHVzaW5nIHRoZSBwcm9kdWN0IG92ZXIgcHJpbWUgZmFjdG9ycy4KKyAgICAgKiAgICBcZlsKKyAgICAgKiAgICAgIFx6ZXRhKHMpID0gXFBpX3tpPTF9XlxpbmZ0eSBcZnJhY3sxfXsxIC0gcF9pXnstc319CisgICAgICogICAgXGZdCisgICAgICogICAgd2hlcmUgQGYkIHtwX2l9IEBmJCBhcmUgdGhlIHByaW1lIG51bWJlcnMuCisgICAgICogCisgICAgICogICBUaGUgUmllbWFubiB6ZXRhIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnk6CisgICAgICogICAgXGZbCisgICAgICogICAgICBcemV0YShzKSA9IFxzdW1fe2s9MX1ee1xpbmZ0eX0gXGZyYWN7MX17a157c319IGZvciBzID4gMQorICAgICAqICAgIFxmXQorICAgICAqICAgRm9yIHMgPCAxIHVzZSB0aGUgcmVmbGVjdGlvbiBmb3JtdWxhOgorICAgICAqICAgIFxmWworICAgICAqICAgICAgXHpldGEocykgPSAyXnMgXHBpXntzLTF9IFxHYW1tYSgxLXMpIFx6ZXRhKDEtcykKKyAgICAgKiAgICBcZl0KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19yaWVtYW5uX3pldGFfcHJvZHVjdChfVHAgX19zKQorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBfVHAgX19wcmltZVtdID0geworICAgICAgICBfVHAoMiksIF9UcCgzKSwgX1RwKDUpLCBfVHAoNyksIF9UcCgxMSksIF9UcCgxMyksIF9UcCgxNyksIF9UcCgxOSksCisgICAgICAgIF9UcCgyMyksIF9UcCgyOSksIF9UcCgzMSksIF9UcCgzNyksIF9UcCg0MSksIF9UcCg0MyksIF9UcCg0NyksCisgICAgICAgIF9UcCg1MyksIF9UcCg1OSksIF9UcCg2MSksIF9UcCg2NyksIF9UcCg3MSksIF9UcCg3MyksIF9UcCg3OSksCisgICAgICAgIF9UcCg4MyksIF9UcCg4OSksIF9UcCg5NyksIF9UcCgxMDEpLCBfVHAoMTAzKSwgX1RwKDEwNyksIF9UcCgxMDkpCisgICAgICB9OworICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBfX251bV9wcmltZXMgPSBzaXplb2YoX19wcmltZSkgLyBzaXplb2YoX1RwKTsKKworICAgICAgX1RwIF9femV0YSA9IF9UcCgxKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDA7IF9faSA8IF9fbnVtX3ByaW1lczsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19mYWN0ID0gX1RwKDEpIC0gc3RkOjpwb3coX19wcmltZVtfX2ldLCAtX19zKTsKKyAgICAgICAgICBfX3pldGEgKj0gX19mYWN0OworICAgICAgICAgIGlmIChfVHAoMSkgLSBfX2ZhY3QgPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIF9femV0YSA9IF9UcCgxKSAvIF9femV0YTsKKworICAgICAgcmV0dXJuIF9femV0YTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBAZiQgXHpldGEocykgQGYkLgorICAgICAqIAorICAgICAqICAgVGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgIFxmWworICAgICAqICAgICAgXHpldGEocykgPSBcc3VtX3trPTF9XntcaW5mdHl9IGteey1zfSBmb3IgcyA+IDEKKyAgICAgKiAgICAgICAgICAgICAgICAgXGZyYWN7KDJccGkpXnN9e3BpfSBzaW4oXGZyYWN7XHBpIHN9ezJ9KQorICAgICAqICAgICAgICAgICAgICAgICBcR2FtbWEgKDEgLSBzKSBcemV0YSAoMSAtIHMpIGZvciBzIDwgMQorICAgICAqICAgIFxmXQorICAgICAqICAgRm9yIHMgPCAxIHVzZSB0aGUgcmVmbGVjdGlvbiBmb3JtdWxhOgorICAgICAqICAgIFxmWworICAgICAqICAgICAgXHpldGEocykgPSAyXnMgXHBpXntzLTF9IFxHYW1tYSgxLXMpIFx6ZXRhKDEtcykKKyAgICAgKiAgICBcZl0KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19yaWVtYW5uX3pldGEoX1RwIF9fcykKKyAgICB7CisgICAgICBpZiAoX19pc25hbihfX3MpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9fcyA9PSBfVHAoMSkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmluZmluaXR5KCk7CisgICAgICBlbHNlIGlmIChfX3MgPCAtX1RwKDE5KSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3pldGEgPSBfX3JpZW1hbm5femV0YV9wcm9kdWN0KF9UcCgxKSAtIF9fcyk7CisgICAgICAgICAgX196ZXRhICo9IHN0ZDo6cG93KF9UcCgyKSAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpLCBfX3MpCisgICAgICAgICAgICAgICAgICogc3RkOjpzaW4oX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpXzIoKSAqIF9fcykKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgICAgICAgICogc3RkOjpleHAoc3RkOjp0cjE6OmxnYW1tYShfVHAoMSkgLSBfX3MpKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgKiBzdGQ6OmV4cChfX2xvZ19nYW1tYShfVHAoMSkgLSBfX3MpKQorI2VuZGlmCisgICAgICAgICAgICAgICAgIC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCk7CisgICAgICAgICAgcmV0dXJuIF9femV0YTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX19zIDwgX1RwKDIwKSkKKyAgICAgICAgeworICAgICAgICAgIC8vICBHbG9iYWwgZG91YmxlIHN1bSBvciBNY0xhdXJpbj8KKyAgICAgICAgICBib29sIF9fZ2xvYiA9IHRydWU7CisgICAgICAgICAgaWYgKF9fZ2xvYikKKyAgICAgICAgICAgIHJldHVybiBfX3JpZW1hbm5femV0YV9nbG9iKF9fcyk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoX19zID4gX1RwKDEpKQorICAgICAgICAgICAgICAgIHJldHVybiBfX3JpZW1hbm5femV0YV9zdW0oX19zKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9UcCBfX3pldGEgPSBzdGQ6OnBvdyhfVHAoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSwgX19zKQorICAgICAgICAgICAgICAgICAgICAgICAgICogc3RkOjpzaW4oX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpXzIoKSAqIF9fcykKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RkOjp0cjE6OnRnYW1tYShfVHAoMSkgLSBfX3MpCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6ZXhwKF9fbG9nX2dhbW1hKF9UcCgxKSAtIF9fcykpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBfX3JpZW1hbm5femV0YV9zdW0oX1RwKDEpIC0gX19zKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBfX3pldGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX3JpZW1hbm5femV0YV9wcm9kdWN0KF9fcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBIdXJ3aXR6IHpldGEgZnVuY3Rpb24gQGYkIFx6ZXRhKHgscykgQGYkCisgICAgICogICAgICAgICAgIGZvciBhbGwgcyAhPSAxIGFuZCB4ID4gLTEuCisgICAgICogCisgICAgICogICBUaGUgSHVyd2l0eiB6ZXRhIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHpldGEoeCxzKSA9IFxzdW1fe249MH1ee1xpbmZ0eX0gXGZyYWN7MX17KG4gKyB4KV5zfQorICAgICAqICAgQGZdCisgICAgICogICBUaGUgUmllbWFubiB6ZXRhIGZ1bmN0aW9uIGlzIGEgc3BlY2lhbCBjYXNlOgorICAgICAqICAgQGZbCisgICAgICogICAgIFx6ZXRhKHMpID0gXHpldGEoMSxzKQorICAgICAqICAgQGZdCisgICAgICogCisgICAgICogICBUaGlzIGZ1bmN0aW9ucyB1c2VzIHRoZSBkb3VibGUgc3VtIHRoYXQgY29udmVyZ2VzIGZvciBzICE9IDEKKyAgICAgKiAgIGFuZCB4ID4gLTE6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHpldGEoeCxzKSA9IFxmcmFjezF9e3MtMX0KKyAgICAgKiAgICAgICAgICAgICAgICBcc3VtX3tuPTB9XntcaW5mdHl9IFxmcmFjezF9e24gKyAxfQorICAgICAqICAgICAgICAgICAgICAgIFxzdW1fe2s9MH1ee259ICgtMSleayBcZnJhY3tuIX17KG4taykhayF9ICh4K2spXnstc30KKyAgICAgKiAgIEBmXQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2h1cndpdHpfemV0YV9nbG9iKF9UcCBfX2EsIF9UcCBfX3MpCisgICAgeworICAgICAgX1RwIF9femV0YSA9IF9UcCgwKTsKKworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICAvLyAgTWF4IGUgZXhwb25lbnQgYmVmb3JlIG92ZXJmbG93LgorICAgICAgY29uc3QgX1RwIF9fbWF4X2JpbmNvZWZmID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptYXhfZXhwb25lbnQxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RkOjpsb2coX1RwKDEwKSkgLSBfVHAoMSk7CisKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heGl0ID0gMTAwMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAwOyBfX2kgPCBfX21heGl0OyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIGJvb2wgX19wdW50ID0gZmFsc2U7CisgICAgICAgICAgX1RwIF9fc2duID0gX1RwKDEpOworICAgICAgICAgIF9UcCBfX3Rlcm0gPSBfVHAoMCk7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19qID0gMDsgX19qIDw9IF9faTsgKytfX2opCisgICAgICAgICAgICB7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgICAgICAgICBfVHAgX19iaW5jb2VmZiA9ICBzdGQ6OnRyMTo6bGdhbW1hKF9UcCgxICsgX19pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3RkOjp0cjE6OmxnYW1tYShfVHAoMSArIF9faikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKDEgKyBfX2kgLSBfX2opKTsKKyNlbHNlCisgICAgICAgICAgICAgIF9UcCBfX2JpbmNvZWZmID0gIF9fbG9nX2dhbW1hKF9UcCgxICsgX19pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19sb2dfZ2FtbWEoX1RwKDEgKyBfX2opKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX2xvZ19nYW1tYShfVHAoMSArIF9faSAtIF9faikpOworI2VuZGlmCisgICAgICAgICAgICAgIGlmIChfX2JpbmNvZWZmID4gX19tYXhfYmluY29lZmYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLy8gIFRoaXMgb25seSBnZXRzIGhpdCBmb3IgeCA8PCAwLgorICAgICAgICAgICAgICAgICAgX19wdW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgX19iaW5jb2VmZiA9IHN0ZDo6ZXhwKF9fYmluY29lZmYpOworICAgICAgICAgICAgICBfX3Rlcm0gKz0gX19zZ24gKiBfX2JpbmNvZWZmICogc3RkOjpwb3coX1RwKF9fYSArIF9faiksIC1fX3MpOworICAgICAgICAgICAgICBfX3NnbiAqPSBfVHAoLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChfX3B1bnQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3Rlcm0gLz0gX1RwKF9faSArIDEpOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0gLyBfX3pldGEpIDwgX19lcHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3pldGEgKz0gX190ZXJtOworICAgICAgICB9CisKKyAgICAgIF9femV0YSAvPSBfX3MgLSBfVHAoMSk7CisKKyAgICAgIHJldHVybiBfX3pldGE7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBIdXJ3aXR6IHpldGEgZnVuY3Rpb24gQGYkIFx6ZXRhKHgscykgQGYkCisgICAgICogICAgICAgICAgIGZvciBhbGwgcyAhPSAxIGFuZCB4ID4gLTEuCisgICAgICogCisgICAgICogICBUaGUgSHVyd2l0eiB6ZXRhIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHpldGEoeCxzKSA9IFxzdW1fe249MH1ee1xpbmZ0eX0gXGZyYWN7MX17KG4gKyB4KV5zfQorICAgICAqICAgQGZdCisgICAgICogICBUaGUgUmllbWFubiB6ZXRhIGZ1bmN0aW9uIGlzIGEgc3BlY2lhbCBjYXNlOgorICAgICAqICAgQGZbCisgICAgICogICAgIFx6ZXRhKHMpID0gXHpldGEoMSxzKQorICAgICAqICAgQGZdCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfX2h1cndpdHpfemV0YShfVHAgX19hLCBfVHAgX19zKQorICAgIHsgcmV0dXJuIF9faHVyd2l0el96ZXRhX2dsb2IoX19hLCBfX3MpOyB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX1JJRU1BTk5fWkVUQV9UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3NoYXJlZF9wdHIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3NoYXJlZF9wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YThmMDY1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc2hhcmVkX3B0ci5oCkBAIC0wLDAgKzEsMTE3MiBAQAorLy8gPHRyMS9zaGFyZWRfcHRyLmg+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vICBzaGFyZWRfY291bnQuaHBwCisvLyAgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzIFBldGVyIERpbW92IGFuZCBNdWx0aSBNZWRpYSBMdGQuCisKKy8vICBzaGFyZWRfcHRyLmhwcAorLy8gIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBHcmVnIENvbHZpbiBhbmQgQmVtYW4gRGF3ZXMuCisvLyAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIFBldGVyIERpbW92CisKKy8vICB3ZWFrX3B0ci5ocHAKKy8vICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMgUGV0ZXIgRGltb3YKKworLy8gIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzLmhwcAorLy8gIENvcHlyaWdodCAoQykgMjAwMiBQZXRlciBEaW1vdgorCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKKy8vIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEdDQyBOb3RlOiAgYmFzZWQgb24gdmVyc2lvbiAxLjMyLjAgb2YgdGhlIEJvb3N0IGxpYnJhcnkuCisKKy8qKiBAZmlsZSB0cjEvc2hhcmVkX3B0ci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9UUjFfU0hBUkVEX1BUUl9ICisjZGVmaW5lIF9UUjFfU0hBUkVEX1BUUl9IIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgLyoqCisgICAqICBAYnJpZWYgIEV4Y2VwdGlvbiBwb3NzaWJseSB0aHJvd24gYnkgQGMgc2hhcmVkX3B0ci4KKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICovCisgIGNsYXNzIGJhZF93ZWFrX3B0ciA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgorICB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGNoYXIgY29uc3QqCisgICAgd2hhdCgpIGNvbnN0IHRocm93KCkKKyAgICB7IHJldHVybiAidHIxOjpiYWRfd2Vha19wdHIiOyB9CisgIH07CisKKyAgLy8gU3Vic3RpdHV0ZSBmb3IgYmFkX3dlYWtfcHRyIG9iamVjdCBpbiB0aGUgY2FzZSBvZiAtZm5vLWV4Y2VwdGlvbnMuCisgIGlubGluZSB2b2lkCisgIF9fdGhyb3dfYmFkX3dlYWtfcHRyKCkKKyAgeyBfR0xJQkNYWF9USFJPV19PUl9BQk9SVChiYWRfd2Vha19wdHIoKSk7IH0KKworICB1c2luZyBfX2dudV9jeHg6Ol9Mb2NrX3BvbGljeTsKKyAgdXNpbmcgX19nbnVfY3h4OjpfX2RlZmF1bHRfbG9ja19wb2xpY3k7CisgIHVzaW5nIF9fZ251X2N4eDo6X1Nfc2luZ2xlOworICB1c2luZyBfX2dudV9jeHg6Ol9TX211dGV4OworICB1c2luZyBfX2dudV9jeHg6Ol9TX2F0b21pYzsKKworICAvLyBFbXB0eSBoZWxwZXIgY2xhc3MgZXhjZXB0IHdoZW4gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGlzIF9TX211dGV4LgorICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9NdXRleF9iYXNlCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIFRoZSBhdG9taWMgcG9saWN5IHVzZXMgZnVsbHktZmVuY2VkIGJ1aWx0aW5zLCBzaW5nbGUgZG9lc24ndCBjYXJlLgorICAgICAgZW51bSB7IF9TX25lZWRfYmFycmllcnMgPSAwIH07CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgX011dGV4X2Jhc2U8X1NfbXV0ZXg+CisgICAgOiBwdWJsaWMgX19nbnVfY3h4OjpfX211dGV4CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIFRoaXMgcG9saWN5IGlzIHVzZWQgd2hlbiBhdG9taWMgYnVpbHRpbnMgYXJlIG5vdCBhdmFpbGFibGUuCisgICAgICAvLyBUaGUgcmVwbGFjZW1lbnQgYXRvbWljIG9wZXJhdGlvbnMgbWlnaHQgbm90IGhhdmUgdGhlIG5lY2Vzc2FyeQorICAgICAgLy8gbWVtb3J5IGJhcnJpZXJzLgorICAgICAgZW51bSB7IF9TX25lZWRfYmFycmllcnMgPSAxIH07CisgICAgfTsKKworICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0X2xvY2tfcG9saWN5PgorICAgIGNsYXNzIF9TcF9jb3VudGVkX2Jhc2UKKyAgICA6IHB1YmxpYyBfTXV0ZXhfYmFzZTxfTHA+CisgICAgeworICAgIHB1YmxpYzogIAorICAgICAgX1NwX2NvdW50ZWRfYmFzZSgpCisgICAgICA6IF9NX3VzZV9jb3VudCgxKSwgX01fd2Vha19jb3VudCgxKSB7IH0KKyAgICAgIAorICAgICAgdmlydHVhbAorICAgICAgfl9TcF9jb3VudGVkX2Jhc2UoKSAvLyBub3Rocm93IAorICAgICAgeyB9CisgIAorICAgICAgLy8gQ2FsbGVkIHdoZW4gX01fdXNlX2NvdW50IGRyb3BzIHRvIHplcm8sIHRvIHJlbGVhc2UgdGhlIHJlc291cmNlcworICAgICAgLy8gbWFuYWdlZCBieSAqdGhpcy4KKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgX01fZGlzcG9zZSgpID0gMDsgLy8gbm90aHJvdworICAgICAgCisgICAgICAvLyBDYWxsZWQgd2hlbiBfTV93ZWFrX2NvdW50IGRyb3BzIHRvIHplcm8uCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3koKSAvLyBub3Rocm93CisgICAgICB7IGRlbGV0ZSB0aGlzOyB9CisgICAgICAKKyAgICAgIHZpcnR1YWwgdm9pZCoKKyAgICAgIF9NX2dldF9kZWxldGVyKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJikgPSAwOworCisgICAgICB2b2lkCisgICAgICBfTV9hZGRfcmVmX2NvcHkoKQorICAgICAgeyBfX2dudV9jeHg6Ol9fYXRvbWljX2FkZF9kaXNwYXRjaCgmX01fdXNlX2NvdW50LCAxKTsgfQorICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX2FkZF9yZWZfbG9jaygpOworICAgICAgCisgICAgICB2b2lkCisgICAgICBfTV9yZWxlYXNlKCkgLy8gbm90aHJvdworICAgICAgeworICAgICAgICAvLyBCZSByYWNlLWRldGVjdG9yLWZyaWVuZGx5LiAgRm9yIG1vcmUgaW5mbyBzZWUgYml0cy9jKytjb25maWcuCisgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmX01fdXNlX2NvdW50KTsKKwlpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3VzZV9jb3VudCwgLTEpID09IDEpCisJICB7CisgICAgICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUigmX01fdXNlX2NvdW50KTsKKwkgICAgX01fZGlzcG9zZSgpOworCSAgICAvLyBUaGVyZSBtdXN0IGJlIGEgbWVtb3J5IGJhcnJpZXIgYmV0d2VlbiBkaXNwb3NlKCkgYW5kIGRlc3Ryb3koKQorCSAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgZWZmZWN0cyBvZiBkaXNwb3NlKCkgYXJlIG9ic2VydmVkIGluIHRoZQorCSAgICAvLyB0aHJlYWQgdGhhdCBydW5zIGRlc3Ryb3koKS4KKwkgICAgLy8gU2VlIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwNS0xMS9tc2cwMDEzNi5odG1sCisJICAgIGlmIChfTXV0ZXhfYmFzZTxfTHA+OjpfU19uZWVkX2JhcnJpZXJzKQorCSAgICAgIHsKKwkgICAgICAgIF9HTElCQ1hYX1JFQURfTUVNX0JBUlJJRVI7CisJICAgICAgICBfR0xJQkNYWF9XUklURV9NRU1fQkFSUklFUjsKKwkgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJlIHJhY2UtZGV0ZWN0b3ItZnJpZW5kbHkuICBGb3IgbW9yZSBpbmZvIHNlZSBiaXRzL2MrK2NvbmZpZy4KKyAgICAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmX01fd2Vha19jb3VudCk7CisJICAgIGlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmX01fd2Vha19jb3VudCwKKwkJCQkJCSAgICAgICAtMSkgPT0gMSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZfTV93ZWFrX2NvdW50KTsKKwkgICAgICAgIF9NX2Rlc3Ryb3koKTsKKyAgICAgICAgICAgICAgfQorCSAgfQorICAgICAgfQorICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX3dlYWtfYWRkX3JlZigpIC8vIG5vdGhyb3cKKyAgICAgIHsgX19nbnVfY3h4OjpfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9NX3dlYWtfY291bnQsIDEpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3dlYWtfcmVsZWFzZSgpIC8vIG5vdGhyb3cKKyAgICAgIHsKKyAgICAgICAgLy8gQmUgcmFjZS1kZXRlY3Rvci1mcmllbmRseS4gRm9yIG1vcmUgaW5mbyBzZWUgYml0cy9jKytjb25maWcuCisgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmX01fd2Vha19jb3VudCk7CisJaWYgKF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZfTV93ZWFrX2NvdW50LCAtMSkgPT0gMSkKKwkgIHsKKyAgICAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZfTV93ZWFrX2NvdW50KTsKKwkgICAgaWYgKF9NdXRleF9iYXNlPF9McD46Ol9TX25lZWRfYmFycmllcnMpCisJICAgICAgeworCSAgICAgICAgLy8gU2VlIF9NX3JlbGVhc2UoKSwKKwkgICAgICAgIC8vIGRlc3Ryb3koKSBtdXN0IG9ic2VydmUgcmVzdWx0cyBvZiBkaXNwb3NlKCkKKwkgICAgICAgIF9HTElCQ1hYX1JFQURfTUVNX0JBUlJJRVI7CisJICAgICAgICBfR0xJQkNYWF9XUklURV9NRU1fQkFSUklFUjsKKwkgICAgICB9CisJICAgIF9NX2Rlc3Ryb3koKTsKKwkgIH0KKyAgICAgIH0KKyAgCisgICAgICBsb25nCisgICAgICBfTV9nZXRfdXNlX2NvdW50KCkgY29uc3QgLy8gbm90aHJvdworICAgICAgeworICAgICAgICAvLyBObyBtZW1vcnkgYmFycmllciBpcyB1c2VkIGhlcmUgc28gdGhlcmUgaXMgbm8gc3luY2hyb25pemF0aW9uCisgICAgICAgIC8vIHdpdGggb3RoZXIgdGhyZWFkcy4KKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3Qgdm9sYXRpbGUgX0F0b21pY193b3JkJj4oX01fdXNlX2NvdW50KTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6ICAKKyAgICAgIF9TcF9jb3VudGVkX2Jhc2UoX1NwX2NvdW50ZWRfYmFzZSBjb25zdCYpOworICAgICAgX1NwX2NvdW50ZWRfYmFzZSYgb3BlcmF0b3I9KF9TcF9jb3VudGVkX2Jhc2UgY29uc3QmKTsKKworICAgICAgX0F0b21pY193b3JkICBfTV91c2VfY291bnQ7ICAgICAvLyAjc2hhcmVkCisgICAgICBfQXRvbWljX3dvcmQgIF9NX3dlYWtfY291bnQ7ICAgIC8vICN3ZWFrICsgKCNzaGFyZWQgIT0gMCkKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9TcF9jb3VudGVkX2Jhc2U8X1Nfc2luZ2xlPjo6CisgICAgX01fYWRkX3JlZl9sb2NrKCkKKyAgICB7CisgICAgICBpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3VzZV9jb3VudCwgMSkgPT0gMCkKKwl7CisJICBfTV91c2VfY291bnQgPSAwOworCSAgX190aHJvd19iYWRfd2Vha19wdHIoKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9TcF9jb3VudGVkX2Jhc2U8X1NfbXV0ZXg+OjoKKyAgICBfTV9hZGRfcmVmX2xvY2soKQorICAgIHsKKyAgICAgIF9fZ251X2N4eDo6X19zY29wZWRfbG9jayBzZW50cnkoKnRoaXMpOworICAgICAgaWYgKF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZfTV91c2VfY291bnQsIDEpID09IDApCisJeworCSAgX01fdXNlX2NvdW50ID0gMDsKKwkgIF9fdGhyb3dfYmFkX3dlYWtfcHRyKCk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTw+IAorICAgIGlubGluZSB2b2lkCisgICAgX1NwX2NvdW50ZWRfYmFzZTxfU19hdG9taWM+OjoKKyAgICBfTV9hZGRfcmVmX2xvY2soKQorICAgIHsKKyAgICAgIC8vIFBlcmZvcm0gbG9jay1mcmVlIGFkZC1pZi1ub3QtemVybyBvcGVyYXRpb24uCisgICAgICBfQXRvbWljX3dvcmQgX19jb3VudCA9IF9NX3VzZV9jb3VudDsKKyAgICAgIGRvCisJeworCSAgaWYgKF9fY291bnQgPT0gMCkKKwkgICAgX190aHJvd19iYWRfd2Vha19wdHIoKTsKKwkgIC8vIFJlcGxhY2UgdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZSB3aXRoIHRoZSBvbGQgdmFsdWUgKyAxLCBhcworCSAgLy8gbG9uZyBhcyBpdCdzIG5vdCBjaGFuZ2VkIG1lYW53aGlsZS4gCisJfQorICAgICAgd2hpbGUgKCFfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24oJl9NX3VzZV9jb3VudCwgJl9fY291bnQsIF9fY291bnQgKyAxLAorCQkJCQkgIHRydWUsIF9fQVRPTUlDX0FDUV9SRUwsIAorCQkJCQkgIF9fQVRPTUlDX1JFTEFYRUQpKTsKKyAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHIsIHR5cGVuYW1lIF9EZWxldGVyLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9TcF9jb3VudGVkX2Jhc2VfaW1wbAorICAgIDogcHVibGljIF9TcF9jb3VudGVkX2Jhc2U8X0xwPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBQcmVjb25kaXRpb246IF9fZChfX3ApIG11c3Qgbm90IHRocm93LgorICAgICAgX1NwX2NvdW50ZWRfYmFzZV9pbXBsKF9QdHIgX19wLCBfRGVsZXRlciBfX2QpCisgICAgICA6IF9NX3B0cihfX3ApLCBfTV9kZWwoX19kKSB7IH0KKyAgICAKKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgX01fZGlzcG9zZSgpIC8vIG5vdGhyb3cKKyAgICAgIHsgX01fZGVsKF9NX3B0cik7IH0KKyAgICAgIAorICAgICAgdmlydHVhbCB2b2lkKgorICAgICAgX01fZ2V0X2RlbGV0ZXIoY29uc3Qgc3RkOjp0eXBlX2luZm8mIF9fdGkpCisgICAgICB7CisjaWZkZWYgX19HWFhfUlRUSQorICAgICAgICByZXR1cm4gX190aSA9PSB0eXBlaWQoX0RlbGV0ZXIpID8gJl9NX2RlbCA6IDA7CisjZWxzZQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgICAgfQorICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgIF9TcF9jb3VudGVkX2Jhc2VfaW1wbChjb25zdCBfU3BfY291bnRlZF9iYXNlX2ltcGwmKTsKKyAgICAgIF9TcF9jb3VudGVkX2Jhc2VfaW1wbCYgb3BlcmF0b3I9KGNvbnN0IF9TcF9jb3VudGVkX2Jhc2VfaW1wbCYpOworICAgICAgCisgICAgICBfUHRyICAgICAgX01fcHRyOyAgLy8gY29weSBjb25zdHJ1Y3RvciBtdXN0IG5vdCB0aHJvdworICAgICAgX0RlbGV0ZXIgIF9NX2RlbDsgIC8vIGNvcHkgY29uc3RydWN0b3IgbXVzdCBub3QgdGhyb3cKKyAgICB9OworCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHAgPSBfX2RlZmF1bHRfbG9ja19wb2xpY3k+CisgICAgY2xhc3MgX193ZWFrX2NvdW50OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1NwX2RlbGV0ZXIKKyAgICB7CisgICAgICB0eXBlZGVmIHZvaWQgcmVzdWx0X3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCogYXJndW1lbnRfdHlwZTsKKyAgICAgIHZvaWQgb3BlcmF0b3IoKShfVHAqIF9fcCkgY29uc3QgeyBkZWxldGUgX19wOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0X2xvY2tfcG9saWN5PgorICAgIGNsYXNzIF9fc2hhcmVkX2NvdW50CisgICAgeworICAgIHB1YmxpYzogCisgICAgICBfX3NoYXJlZF9jb3VudCgpCisgICAgICA6IF9NX3BpKDApIC8vIG5vdGhyb3cKKyAgICAgIHsgfQorICAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHI+CisgICAgICAgIF9fc2hhcmVkX2NvdW50KF9QdHIgX19wKSA6IF9NX3BpKDApCisgICAgICAgIHsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dHIxOjpyZW1vdmVfcG9pbnRlcjxfUHRyPjo6dHlwZSBfVHA7CisJICAgICAgX01fcGkgPSBuZXcgX1NwX2NvdW50ZWRfYmFzZV9pbXBsPF9QdHIsIF9TcF9kZWxldGVyPF9UcD4sIF9McD4oCisJICAgICAgICAgIF9fcCwgX1NwX2RlbGV0ZXI8X1RwPigpKTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBkZWxldGUgX19wOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyLCB0eXBlbmFtZSBfRGVsZXRlcj4KKyAgICAgICAgX19zaGFyZWRfY291bnQoX1B0ciBfX3AsIF9EZWxldGVyIF9fZCkgOiBfTV9waSgwKQorICAgICAgICB7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgX01fcGkgPSBuZXcgX1NwX2NvdW50ZWRfYmFzZV9pbXBsPF9QdHIsIF9EZWxldGVyLCBfTHA+KF9fcCwgX19kKTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfX2QoX19wKTsgLy8gQ2FsbCBfRGVsZXRlciBvbiBfX3AuCisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisKKyAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYXV0b19wdHI8X1RwPiB0byBwcm92aWRlIHRoZSBzdHJvbmcgZ3VhcmFudGVlLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBfX3NoYXJlZF9jb3VudChzdGQ6OmF1dG9fcHRyPF9UcD4mIF9fcikKKwk6IF9NX3BpKG5ldyBfU3BfY291bnRlZF9iYXNlX2ltcGw8X1RwKiwKKwkJX1NwX2RlbGV0ZXI8X1RwPiwgX0xwID4oX19yLmdldCgpLCBfU3BfZGVsZXRlcjxfVHA+KCkpKQorICAgICAgICB7IF9fci5yZWxlYXNlKCk7IH0KKworICAgICAgLy8gVGhyb3cgYmFkX3dlYWtfcHRyIHdoZW4gX19yLl9NX2dldF91c2VfY291bnQoKSA9PSAwLgorICAgICAgZXhwbGljaXQKKyAgICAgIF9fc2hhcmVkX2NvdW50KGNvbnN0IF9fd2Vha19jb3VudDxfTHA+JiBfX3IpOworICAKKyAgICAgIH5fX3NoYXJlZF9jb3VudCgpIC8vIG5vdGhyb3cKKyAgICAgIHsKKwlpZiAoX01fcGkgIT0gMCkKKwkgIF9NX3BpLT5fTV9yZWxlYXNlKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIF9fc2hhcmVkX2NvdW50KGNvbnN0IF9fc2hhcmVkX2NvdW50JiBfX3IpCisgICAgICA6IF9NX3BpKF9fci5fTV9waSkgLy8gbm90aHJvdworICAgICAgeworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX2FkZF9yZWZfY29weSgpOworICAgICAgfQorICAKKyAgICAgIF9fc2hhcmVkX2NvdW50JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9fc2hhcmVkX2NvdW50JiBfX3IpIC8vIG5vdGhyb3cKKyAgICAgIHsKKwlfU3BfY291bnRlZF9iYXNlPF9McD4qIF9fdG1wID0gX19yLl9NX3BpOworCWlmIChfX3RtcCAhPSBfTV9waSkKKwkgIHsKKwkgICAgaWYgKF9fdG1wICE9IDApCisJICAgICAgX190bXAtPl9NX2FkZF9yZWZfY29weSgpOworCSAgICBpZiAoX01fcGkgIT0gMCkKKwkgICAgICBfTV9waS0+X01fcmVsZWFzZSgpOworCSAgICBfTV9waSA9IF9fdG1wOworCSAgfQorCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9fc2hhcmVkX2NvdW50JiBfX3IpIC8vIG5vdGhyb3cKKyAgICAgIHsKKwlfU3BfY291bnRlZF9iYXNlPF9McD4qIF9fdG1wID0gX19yLl9NX3BpOworCV9fci5fTV9waSA9IF9NX3BpOworCV9NX3BpID0gX190bXA7CisgICAgICB9CisgIAorICAgICAgbG9uZworICAgICAgX01fZ2V0X3VzZV9jb3VudCgpIGNvbnN0IC8vIG5vdGhyb3cKKyAgICAgIHsgcmV0dXJuIF9NX3BpICE9IDAgPyBfTV9waS0+X01fZ2V0X3VzZV9jb3VudCgpIDogMDsgfQorCisgICAgICBib29sCisgICAgICBfTV91bmlxdWUoKSBjb25zdCAvLyBub3Rocm93CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9nZXRfdXNlX2NvdW50KCkgPT0gMTsgfQorICAgICAgCisgICAgICBmcmllbmQgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX19zaGFyZWRfY291bnQmIF9fYSwgY29uc3QgX19zaGFyZWRfY291bnQmIF9fYikKKyAgICAgIHsgcmV0dXJuIF9fYS5fTV9waSA9PSBfX2IuX01fcGk7IH0KKyAgCisgICAgICBmcmllbmQgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPChjb25zdCBfX3NoYXJlZF9jb3VudCYgX19hLCBjb25zdCBfX3NoYXJlZF9jb3VudCYgX19iKQorICAgICAgeyByZXR1cm4gc3RkOjpsZXNzPF9TcF9jb3VudGVkX2Jhc2U8X0xwPio+KCkoX19hLl9NX3BpLCBfX2IuX01fcGkpOyB9CisgIAorICAgICAgdm9pZCoKKyAgICAgIF9NX2dldF9kZWxldGVyKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBfX3RpKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGkgPyBfTV9waS0+X01fZ2V0X2RlbGV0ZXIoX190aSkgOiAwOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgZnJpZW5kIGNsYXNzIF9fd2Vha19jb3VudDxfTHA+OworCisgICAgICBfU3BfY291bnRlZF9iYXNlPF9McD4qICBfTV9waTsKKyAgICB9OworCisKKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfX3dlYWtfY291bnQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgX193ZWFrX2NvdW50KCkKKyAgICAgIDogX01fcGkoMCkgLy8gbm90aHJvdworICAgICAgeyB9CisgIAorICAgICAgX193ZWFrX2NvdW50KGNvbnN0IF9fc2hhcmVkX2NvdW50PF9McD4mIF9fcikKKyAgICAgIDogX01fcGkoX19yLl9NX3BpKSAvLyBub3Rocm93CisgICAgICB7CisJaWYgKF9NX3BpICE9IDApCisJICBfTV9waS0+X01fd2Vha19hZGRfcmVmKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIF9fd2Vha19jb3VudChjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19yKQorICAgICAgOiBfTV9waShfX3IuX01fcGkpIC8vIG5vdGhyb3cKKyAgICAgIHsKKwlpZiAoX01fcGkgIT0gMCkKKwkgIF9NX3BpLT5fTV93ZWFrX2FkZF9yZWYoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgfl9fd2Vha19jb3VudCgpIC8vIG5vdGhyb3cKKyAgICAgIHsKKwlpZiAoX01fcGkgIT0gMCkKKwkgIF9NX3BpLT5fTV93ZWFrX3JlbGVhc2UoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgX193ZWFrX2NvdW50PF9McD4mCisgICAgICBvcGVyYXRvcj0oY29uc3QgX19zaGFyZWRfY291bnQ8X0xwPiYgX19yKSAvLyBub3Rocm93CisgICAgICB7CisJX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiBfX3RtcCA9IF9fci5fTV9waTsKKwlpZiAoX190bXAgIT0gMCkKKwkgIF9fdG1wLT5fTV93ZWFrX2FkZF9yZWYoKTsKKwlpZiAoX01fcGkgIT0gMCkKKwkgIF9NX3BpLT5fTV93ZWFrX3JlbGVhc2UoKTsKKwlfTV9waSA9IF9fdG1wOyAgCisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgCisgICAgICBfX3dlYWtfY291bnQ8X0xwPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19yKSAvLyBub3Rocm93CisgICAgICB7CisJX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiBfX3RtcCA9IF9fci5fTV9waTsKKwlpZiAoX190bXAgIT0gMCkKKwkgIF9fdG1wLT5fTV93ZWFrX2FkZF9yZWYoKTsKKwlpZiAoX01fcGkgIT0gMCkKKwkgIF9NX3BpLT5fTV93ZWFrX3JlbGVhc2UoKTsKKwlfTV9waSA9IF9fdG1wOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fc3dhcChfX3dlYWtfY291bnQ8X0xwPiYgX19yKSAvLyBub3Rocm93CisgICAgICB7CisJX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiBfX3RtcCA9IF9fci5fTV9waTsKKwlfX3IuX01fcGkgPSBfTV9waTsKKwlfTV9waSA9IF9fdG1wOworICAgICAgfQorICAKKyAgICAgIGxvbmcKKyAgICAgIF9NX2dldF91c2VfY291bnQoKSBjb25zdCAvLyBub3Rocm93CisgICAgICB7IHJldHVybiBfTV9waSAhPSAwID8gX01fcGktPl9NX2dldF91c2VfY291bnQoKSA6IDA7IH0KKworICAgICAgZnJpZW5kIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9fd2Vha19jb3VudDxfTHA+JiBfX2EsIGNvbnN0IF9fd2Vha19jb3VudDxfTHA+JiBfX2IpCisgICAgICB7IHJldHVybiBfX2EuX01fcGkgPT0gX19iLl9NX3BpOyB9CisgICAgICAKKyAgICAgIGZyaWVuZCBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I8KGNvbnN0IF9fd2Vha19jb3VudDxfTHA+JiBfX2EsIGNvbnN0IF9fd2Vha19jb3VudDxfTHA+JiBfX2IpCisgICAgICB7IHJldHVybiBzdGQ6Omxlc3M8X1NwX2NvdW50ZWRfYmFzZTxfTHA+Kj4oKShfX2EuX01fcGksIF9fYi5fTV9waSk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBmcmllbmQgY2xhc3MgX19zaGFyZWRfY291bnQ8X0xwPjsKKworICAgICAgX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiAgX01fcGk7CisgICAgfTsKKworICAvLyBub3cgdGhhdCBfX3dlYWtfY291bnQgaXMgZGVmaW5lZCB3ZSBjYW4gZGVmaW5lIHRoaXMgY29uc3RydWN0b3I6CisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lCisgICAgX19zaGFyZWRfY291bnQ8X0xwPjo6CisgICAgX19zaGFyZWRfY291bnQoY29uc3QgX193ZWFrX2NvdW50PF9McD4mIF9fcikKKyAgICA6IF9NX3BpKF9fci5fTV9waSkKKyAgICB7CisgICAgICBpZiAoX01fcGkgIT0gMCkKKwlfTV9waS0+X01fYWRkX3JlZl9sb2NrKCk7CisgICAgICBlbHNlCisJX190aHJvd19iYWRfd2Vha19wdHIoKTsKKyAgICB9CisKKyAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McCA9IF9fZGVmYXVsdF9sb2NrX3BvbGljeT4KKyAgICBjbGFzcyBfX3NoYXJlZF9wdHI7CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHAgPSBfX2RlZmF1bHRfbG9ja19wb2xpY3k+CisgICAgY2xhc3MgX193ZWFrX3B0cjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHAgPSBfX2RlZmF1bHRfbG9ja19wb2xpY3k+CisgICAgY2xhc3MgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpczsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3Mgc2hhcmVkX3B0cjsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyB3ZWFrX3B0cjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM7CisKKyAgLy8gU3VwcG9ydCBmb3IgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuCisKKyAgLy8gRnJpZW5kIG9mIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHAsIHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgdm9pZAorICAgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKGNvbnN0IF9fc2hhcmVkX2NvdW50PF9McD4mLAorCQkJCSAgICAgY29uc3QgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpczxfVHAxLAorCQkJCSAgICAgX0xwPiosIGNvbnN0IF9UcDIqKTsKKworICAvLyBGcmllbmQgb2YgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgdm9pZAorICAgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKGNvbnN0IF9fc2hhcmVkX2NvdW50PD4mLAorCQkJCSAgICAgY29uc3QgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8X1RwMT4qLAorCQkJCSAgICAgY29uc3QgX1RwMiopOworCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiwgLi4uKQorICAgIHsgfQorCisKKyAgc3RydWN0IF9fc3RhdGljX2Nhc3RfdGFnIHsgfTsKKyAgc3RydWN0IF9fY29uc3RfY2FzdF90YWcgeyB9OworICBzdHJ1Y3QgX19keW5hbWljX2Nhc3RfdGFnIHsgfTsKKworICAvLyBBIHNtYXJ0IHBvaW50ZXIgd2l0aCByZWZlcmVuY2UtY291bnRlZCBjb3B5IHNlbWFudGljcy4gIFRoZQorICAvLyBvYmplY3QgcG9pbnRlZCB0byBpcyBkZWxldGVkIHdoZW4gdGhlIGxhc3Qgc2hhcmVkX3B0ciBwb2ludGluZyB0bworICAvLyBpdCBpcyBkZXN0cm95ZWQgb3IgcmVzZXQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfX3NoYXJlZF9wdHIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgICBlbGVtZW50X3R5cGU7CisgICAgICAKKyAgICAgIF9fc2hhcmVkX3B0cigpCisgICAgICA6IF9NX3B0cigwKSwgX01fcmVmY291bnQoKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBfX3NoYXJlZF9wdHIoX1RwMSogX19wKQorCTogX01fcHRyKF9fcCksIF9NX3JlZmNvdW50KF9fcCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwMSosIF9UcCo+KQorCSAgdHlwZWRlZiBpbnQgX0lzQ29tcGxldGVbc2l6ZW9mKF9UcDEpXTsKKwkgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKF9NX3JlZmNvdW50LCBfX3AsIF9fcCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfRGVsZXRlcj4KKyAgICAgICAgX19zaGFyZWRfcHRyKF9UcDEqIF9fcCwgX0RlbGV0ZXIgX19kKQorICAgICAgICA6IF9NX3B0cihfX3ApLCBfTV9yZWZjb3VudChfX3AsIF9fZCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwMSosIF9UcCo+KQorCSAgLy8gVE9ETyByZXF1aXJlcyBfRGVsZXRlciBDb3B5Q29uc3RydWN0aWJsZSBhbmQgX19kKF9fcCkgd2VsbC1mb3JtZWQKKwkgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKF9NX3JlZmNvdW50LCBfX3AsIF9fcCk7CisJfQorICAgICAgCisgICAgICAvLyAgZ2VuZXJhdGVkIGNvcHkgY29uc3RydWN0b3IsIGFzc2lnbm1lbnQsIGRlc3RydWN0b3IgYXJlIGZpbmUuCisgICAgICAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIF9fc2hhcmVkX3B0cihjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKQorCTogX01fcHRyKF9fci5fTV9wdHIpLCBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG5ldmVyIHRocm93cworICAgICAgICB7IF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcDEqLCBfVHAqPikgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBfX3NoYXJlZF9wdHIoY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3IpCisJOiBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG1heSB0aHJvdworICAgICAgICB7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisJICAvLyBJdCBpcyBub3cgc2FmZSB0byBjb3B5IF9fci5fTV9wdHIsIGFzIF9NX3JlZmNvdW50KF9fci5fTV9yZWZjb3VudCkKKwkgIC8vIGRpZCBub3QgdGhyb3cuCisJICBfTV9wdHIgPSBfX3IuX01fcHRyOworCX0KKworI2lmIChfX2NwbHVzcGx1cyA8IDIwMTEwM0wpIHx8IF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgICAvLyBQb3N0Y29uZGl0aW9uOiB1c2VfY291bnQoKSA9PSAxIGFuZCBfX3IuZ2V0KCkgPT0gMAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgX19zaGFyZWRfcHRyKHN0ZDo6YXV0b19wdHI8X1RwMT4mIF9fcikKKwk6IF9NX3B0cihfX3IuZ2V0KCkpLCBfTV9yZWZjb3VudCgpCisgICAgICAgIHsgLy8gVE9ETyByZXF1cmllcyBkZWxldGUgX19yLnJlbGVhc2UoKSB3ZWxsLWZvcm1lZAorCSAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwMSosIF9UcCo+KQorCSAgdHlwZWRlZiBpbnQgX0lzQ29tcGxldGVbc2l6ZW9mKF9UcDEpXTsKKwkgIF9UcDEqIF9fdG1wID0gX19yLmdldCgpOworCSAgX01fcmVmY291bnQgPSBfX3NoYXJlZF9jb3VudDxfTHA+KF9fcik7CisJICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihfTV9yZWZjb3VudCwgX190bXAsIF9fdG1wKTsKKwl9CisKKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3NoYXJlZF9wdHIoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fciwgX19zdGF0aWNfY2FzdF90YWcpCisJOiBfTV9wdHIoc3RhdGljX2Nhc3Q8ZWxlbWVudF90eXBlKj4oX19yLl9NX3B0cikpLAorCSAgX01fcmVmY291bnQoX19yLl9NX3JlZmNvdW50KQorICAgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgX19zaGFyZWRfcHRyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IsIF9fY29uc3RfY2FzdF90YWcpCisJOiBfTV9wdHIoY29uc3RfY2FzdDxlbGVtZW50X3R5cGUqPihfX3IuX01fcHRyKSksCisJICBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpCisgICAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3NoYXJlZF9wdHIoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fciwgX19keW5hbWljX2Nhc3RfdGFnKQorCTogX01fcHRyKGR5bmFtaWNfY2FzdDxlbGVtZW50X3R5cGUqPihfX3IuX01fcHRyKSksCisJICBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpCisgICAgICAgIHsKKwkgIGlmIChfTV9wdHIgPT0gMCkgLy8gbmVlZCB0byBhbGxvY2F0ZSBuZXcgY291bnRlciAtLSB0aGUgY2FzdCBmYWlsZWQKKwkgICAgX01fcmVmY291bnQgPSBfX3NoYXJlZF9jb3VudDxfTHA+KCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3NoYXJlZF9wdHImCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgICAgeworCSAgX01fcHRyID0gX19yLl9NX3B0cjsKKwkgIF9NX3JlZmNvdW50ID0gX19yLl9NX3JlZmNvdW50OyAvLyBfX3NoYXJlZF9jb3VudDo6b3A9IGRvZXNuJ3QgdGhyb3cKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyNpZiAoX19jcGx1c3BsdXMgPCAyMDExMDNMKSB8fCBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgX19zaGFyZWRfcHRyJgorICAgICAgICBvcGVyYXRvcj0oc3RkOjphdXRvX3B0cjxfVHAxPiYgX19yKQorICAgICAgICB7CisJICBfX3NoYXJlZF9wdHIoX19yKS5zd2FwKCp0aGlzKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgcmVzZXQoKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgX19zaGFyZWRfcHRyKCkuc3dhcCgqdGhpcyk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgdm9pZAorICAgICAgICByZXNldChfVHAxKiBfX3ApIC8vIF9UcDEgbXVzdCBiZSBjb21wbGV0ZS4KKyAgICAgICAgeworCSAgLy8gQ2F0Y2ggc2VsZi1yZXNldCBlcnJvcnMuCisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19wID09IDAgfHwgX19wICE9IF9NX3B0cik7IAorCSAgX19zaGFyZWRfcHRyKF9fcCkuc3dhcCgqdGhpcyk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfRGVsZXRlcj4KKyAgICAgICAgdm9pZAorICAgICAgICByZXNldChfVHAxKiBfX3AsIF9EZWxldGVyIF9fZCkKKyAgICAgICAgeyBfX3NoYXJlZF9wdHIoX19wLCBfX2QpLnN3YXAoKnRoaXMpOyB9CisKKyAgICAgIC8vIEFsbG93IGNsYXNzIGluc3RhbnRpYXRpb24gd2hlbiBfVHAgaXMgW2N2LXF1YWxdIHZvaWQuCisgICAgICB0eXBlbmFtZSBzdGQ6OnRyMTo6YWRkX3JlZmVyZW5jZTxfVHA+Ojp0eXBlCisgICAgICBvcGVyYXRvciooKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fcHRyICE9IDApOworCXJldHVybiAqX01fcHRyOworICAgICAgfQorCisgICAgICBfVHAqCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3B0ciAhPSAwKTsKKwlyZXR1cm4gX01fcHRyOworICAgICAgfQorICAgIAorICAgICAgX1RwKgorICAgICAgZ2V0KCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IHJldHVybiBfTV9wdHI7IH0KKworICAgICAgLy8gSW1wbGljaXQgY29udmVyc2lvbiB0byAiYm9vbCIKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfVHAqIF9fc2hhcmVkX3B0cjo6Kl9fdW5zcGVjaWZpZWRfYm9vbF90eXBlOworCisgICAgcHVibGljOgorICAgICAgb3BlcmF0b3IgX191bnNwZWNpZmllZF9ib29sX3R5cGUoKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgcmV0dXJuIF9NX3B0ciA9PSAwID8gMCA6ICZfX3NoYXJlZF9wdHI6Ol9NX3B0cjsgfQorCisgICAgICBib29sCisgICAgICB1bmlxdWUoKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX3VuaXF1ZSgpOyB9CisKKyAgICAgIGxvbmcKKyAgICAgIHVzZV9jb3VudCgpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeyByZXR1cm4gX01fcmVmY291bnQuX01fZ2V0X3VzZV9jb3VudCgpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19vdGhlcikgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7CisJc3RkOjpzd2FwKF9NX3B0ciwgX19vdGhlci5fTV9wdHIpOworCV9NX3JlZmNvdW50Ll9NX3N3YXAoX19vdGhlci5fTV9yZWZjb3VudCk7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZCoKKyAgICAgIF9NX2dldF9kZWxldGVyKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBfX3RpKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmVmY291bnQuX01fZ2V0X2RlbGV0ZXIoX190aSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McDE+CisgICAgICAgIGJvb2wKKyAgICAgICAgX01fbGVzcyhjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwMT4mIF9fcmhzKSBjb25zdAorICAgICAgICB7IHJldHVybiBfTV9yZWZjb3VudCA8IF9fcmhzLl9NX3JlZmNvdW50OyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHAxPiBmcmllbmQgY2xhc3MgX19zaGFyZWRfcHRyOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McDE+IGZyaWVuZCBjbGFzcyBfX3dlYWtfcHRyOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRGVsLCB0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwMT4KKyAgICAgICAgZnJpZW5kIF9EZWwqIGdldF9kZWxldGVyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHAxPiYpOworCisgICAgICAvLyBGcmllbmRzIGluamVjdGVkIGludG8gZW5jbG9zaW5nIG5hbWVzcGFjZSBhbmQgZm91bmQgYnkgQURMOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgZnJpZW5kIGlubGluZSBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgX19zaGFyZWRfcHRyJiBfX2EsIGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX2IpCisgICAgICAgIHsgcmV0dXJuIF9fYS5nZXQoKSA9PSBfX2IuZ2V0KCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgZnJpZW5kIGlubGluZSBib29sCisgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgX19zaGFyZWRfcHRyJiBfX2EsIGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX2IpCisgICAgICAgIHsgcmV0dXJuIF9fYS5nZXQoKSAhPSBfX2IuZ2V0KCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgZnJpZW5kIGlubGluZSBib29sCisgICAgICAgIG9wZXJhdG9yPChjb25zdCBfX3NoYXJlZF9wdHImIF9fYSwgY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fYikKKyAgICAgICAgeyByZXR1cm4gX19hLl9NX2xlc3MoX19iKTsgfQorCisgICAgICBfVHAqICAgICAgICAgCSAgIF9NX3B0cjsgICAgICAgICAvLyBDb250YWluZWQgcG9pbnRlci4KKyAgICAgIF9fc2hhcmVkX2NvdW50PF9McD4gIF9NX3JlZmNvdW50OyAgICAvLyBSZWZlcmVuY2UgY291bnRlci4KKyAgICB9OworCisgIC8vIDIuMi4zLjggc2hhcmVkX3B0ciBzcGVjaWFsaXplZCBhbGdvcml0aG1zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fYSwgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19iKQorICAgIHsgX19hLnN3YXAoX19iKTsgfQorCisgIC8vIDIuMi4zLjkgc2hhcmVkX3B0ciBjYXN0cworICAvKiAgVGhlIHNlZW1pbmdseSBlcXVpdmFsZW50CisgICAqICAgICAgICAgICBzaGFyZWRfcHRyPF9UcCwgX0xwPihzdGF0aWNfY2FzdDxfVHAqPihfX3IuZ2V0KCkpKQorICAgKiAgd2lsbCBldmVudHVhbGx5IHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3VyLAorICAgKiAgYXR0ZW1wdGluZyB0byBkZWxldGUgdGhlIHNhbWUgb2JqZWN0IHR3aWNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+CisgICAgc3RhdGljX3BvaW50ZXJfY2FzdChjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKQorICAgIHsgcmV0dXJuIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4oX19yLCBfX3N0YXRpY19jYXN0X3RhZygpKTsgfQorCisgIC8qICBUaGUgc2VlbWluZ2x5IGVxdWl2YWxlbnQKKyAgICogICAgICAgICAgIHNoYXJlZF9wdHI8X1RwLCBfTHA+KGNvbnN0X2Nhc3Q8X1RwKj4oX19yLmdldCgpKSkKKyAgICogIHdpbGwgZXZlbnR1YWxseSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW91ciwKKyAgICogIGF0dGVtcHRpbmcgdG8gZGVsZXRlIHRoZSBzYW1lIG9iamVjdCB0d2ljZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgX19zaGFyZWRfcHRyPF9UcCwgX0xwPgorICAgIGNvbnN0X3BvaW50ZXJfY2FzdChjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKQorICAgIHsgcmV0dXJuIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4oX19yLCBfX2NvbnN0X2Nhc3RfdGFnKCkpOyB9CisKKyAgLyogIFRoZSBzZWVtaW5nbHkgZXF1aXZhbGVudAorICAgKiAgICAgICAgICAgc2hhcmVkX3B0cjxfVHAsIF9McD4oZHluYW1pY19jYXN0PF9UcCo+KF9fci5nZXQoKSkpCisgICAqICB3aWxsIGV2ZW50dWFsbHkgcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvdXIsCisgICAqICBhdHRlbXB0aW5nIHRvIGRlbGV0ZSB0aGUgc2FtZSBvYmplY3QgdHdpY2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4KKyAgICBkeW5hbWljX3BvaW50ZXJfY2FzdChjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKQorICAgIHsgcmV0dXJuIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4oX19yLCBfX2R5bmFtaWNfY2FzdF90YWcoKSk7IH0KKworICAvLyAyLjIuMy43IHNoYXJlZF9wdHIgSS9PCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaCwgdHlwZW5hbWUgX1RyLCB0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaCwgX1RyPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2gsIF9Ucj4mIF9fb3MsIAorCSAgICAgICBjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX3ApCisgICAgeworICAgICAgX19vcyA8PCBfX3AuZ2V0KCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgLy8gMi4yLjMuMTAgc2hhcmVkX3B0ciBnZXRfZGVsZXRlciAoZXhwZXJpbWVudGFsKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRGVsLCB0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIF9EZWwqCisgICAgZ2V0X2RlbGV0ZXIoY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19wKQorICAgIHsKKyNpZmRlZiBfX0dYWF9SVFRJCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X0RlbCo+KF9fcC5fTV9nZXRfZGVsZXRlcih0eXBlaWQoX0RlbCkpKTsKKyNlbHNlCisgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfX3dlYWtfcHRyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwIGVsZW1lbnRfdHlwZTsKKyAgICAgIAorICAgICAgX193ZWFrX3B0cigpCisgICAgICA6IF9NX3B0cigwKSwgX01fcmVmY291bnQoKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgfQorCisgICAgICAvLyBHZW5lcmF0ZWQgY29weSBjb25zdHJ1Y3RvciwgYXNzaWdubWVudCwgZGVzdHJ1Y3RvciBhcmUgZmluZS4KKyAgICAgIAorICAgICAgLy8gVGhlICJvYnZpb3VzIiBjb252ZXJ0aW5nIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uOgorICAgICAgLy8KKyAgICAgIC8vICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgLy8gICAgX193ZWFrX3B0cihjb25zdCBfX3dlYWtfcHRyPF9UcDEsIF9McD4mIF9fcikKKyAgICAgIC8vICAgIDogX01fcHRyKF9fci5fTV9wdHIpLCBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG5ldmVyIHRocm93cworICAgICAgLy8gICAgeyB9CisgICAgICAvLworICAgICAgLy8gaGFzIGEgc2VyaW91cyBwcm9ibGVtLgorICAgICAgLy8KKyAgICAgIC8vICBfX3IuX01fcHRyIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBpbnZhbGlkYXRlZC4gVGhlIF9NX3B0cihfX3IuX01fcHRyKQorICAgICAgLy8gIGNvbnZlcnNpb24gbWF5IHJlcXVpcmUgYWNjZXNzIHRvICpfX3IuX01fcHRyICh2aXJ0dWFsIGluaGVyaXRhbmNlKS4KKyAgICAgIC8vCisgICAgICAvLyBJdCBpcyBub3QgcG9zc2libGUgdG8gYXZvaWQgc3B1cmlvdXMgYWNjZXNzIHZpb2xhdGlvbnMgc2luY2UKKyAgICAgIC8vIGluIG11bHRpdGhyZWFkZWQgcHJvZ3JhbXMgX19yLl9NX3B0ciBtYXkgYmUgaW52YWxpZGF0ZWQgYXQgYW55IHBvaW50LgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgX193ZWFrX3B0cihjb25zdCBfX3dlYWtfcHRyPF9UcDEsIF9McD4mIF9fcikKKwk6IF9NX3JlZmNvdW50KF9fci5fTV9yZWZjb3VudCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcDEqLCBfVHAqPikKKwkgIF9NX3B0ciA9IF9fci5sb2NrKCkuZ2V0KCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3dlYWtfcHRyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IpCisJOiBfTV9wdHIoX19yLl9NX3B0ciksIF9NX3JlZmNvdW50KF9fci5fTV9yZWZjb3VudCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICAgIHsgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwMSosIF9UcCo+KSB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIF9fd2Vha19wdHImCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBfX3dlYWtfcHRyPF9UcDEsIF9McD4mIF9fcikgLy8gbmV2ZXIgdGhyb3dzCisgICAgICAgIHsKKwkgIF9NX3B0ciA9IF9fci5sb2NrKCkuZ2V0KCk7CisJICBfTV9yZWZjb3VudCA9IF9fci5fTV9yZWZjb3VudDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisgICAgICAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIF9fd2Vha19wdHImCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgICAgeworCSAgX01fcHRyID0gX19yLl9NX3B0cjsKKwkgIF9NX3JlZmNvdW50ID0gX19yLl9NX3JlZmNvdW50OworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgX19zaGFyZWRfcHRyPF9UcCwgX0xwPgorICAgICAgbG9jaygpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeworI2lmZGVmIF9fR1RIUkVBRFMKKwkvLyBPcHRpbWl6YXRpb246IGF2b2lkIHRocm93IG92ZXJoZWFkLgorCWlmIChleHBpcmVkKCkpCisJICByZXR1cm4gX19zaGFyZWRfcHRyPGVsZW1lbnRfdHlwZSwgX0xwPigpOworCisJX190cnkKKwkgIHsKKwkgICAgcmV0dXJuIF9fc2hhcmVkX3B0cjxlbGVtZW50X3R5cGUsIF9McD4oKnRoaXMpOworCSAgfQorCV9fY2F0Y2goY29uc3QgYmFkX3dlYWtfcHRyJikKKwkgIHsKKwkgICAgLy8gUTogSG93IGNhbiB3ZSBnZXQgaGVyZT8KKwkgICAgLy8gQTogQW5vdGhlciB0aHJlYWQgbWF5IGhhdmUgaW52YWxpZGF0ZWQgciBhZnRlciB0aGUKKwkgICAgLy8gICAgdXNlX2NvdW50IHRlc3QgYWJvdmUuCisJICAgIHJldHVybiBfX3NoYXJlZF9wdHI8ZWxlbWVudF90eXBlLCBfTHA+KCk7CisJICB9CisJCisjZWxzZQorCS8vIE9wdGltaXphdGlvbjogYXZvaWQgdHJ5L2NhdGNoIG92ZXJoZWFkIHdoZW4gc2luZ2xlIHRocmVhZGVkLgorCXJldHVybiBleHBpcmVkKCkgPyBfX3NoYXJlZF9wdHI8ZWxlbWVudF90eXBlLCBfTHA+KCkKKwkgICAgICAgICAgICAgICAgIDogX19zaGFyZWRfcHRyPGVsZW1lbnRfdHlwZSwgX0xwPigqdGhpcyk7CisKKyNlbmRpZgorICAgICAgfSAvLyBYWFggTVQKKworICAgICAgbG9uZworICAgICAgdXNlX2NvdW50KCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IHJldHVybiBfTV9yZWZjb3VudC5fTV9nZXRfdXNlX2NvdW50KCk7IH0KKworICAgICAgYm9vbAorICAgICAgZXhwaXJlZCgpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeyByZXR1cm4gX01fcmVmY291bnQuX01fZ2V0X3VzZV9jb3VudCgpID09IDA7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVzZXQoKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgX193ZWFrX3B0cigpLnN3YXAoKnRoaXMpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoX193ZWFrX3B0ciYgX19zKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fcHRyLCBfX3MuX01fcHRyKTsKKwlfTV9yZWZjb3VudC5fTV9zd2FwKF9fcy5fTV9yZWZjb3VudCk7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gVXNlZCBieSBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzLgorICAgICAgdm9pZAorICAgICAgX01fYXNzaWduKF9UcCogX19wdHIsIGNvbnN0IF9fc2hhcmVkX2NvdW50PF9McD4mIF9fcmVmY291bnQpCisgICAgICB7CisJX01fcHRyID0gX19wdHI7CisJX01fcmVmY291bnQgPSBfX3JlZmNvdW50OworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBib29sCisgICAgICAgIF9NX2xlc3MoY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3JocykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gX01fcmVmY291bnQgPCBfX3Jocy5fTV9yZWZjb3VudDsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwMT4gZnJpZW5kIGNsYXNzIF9fc2hhcmVkX3B0cjsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHAxPiBmcmllbmQgY2xhc3MgX193ZWFrX3B0cjsKKyAgICAgIGZyaWVuZCBjbGFzcyBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzPF9UcCwgX0xwPjsKKyAgICAgIGZyaWVuZCBjbGFzcyBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczxfVHA+OworCisgICAgICAvLyBGcmllbmQgaW5qZWN0ZWQgaW50byBuYW1lc3BhY2UgYW5kIGZvdW5kIGJ5IEFETC4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGZyaWVuZCBpbmxpbmUgYm9vbAorICAgICAgICBvcGVyYXRvcjwoY29uc3QgX193ZWFrX3B0ciYgX19saHMsIGNvbnN0IF9fd2Vha19wdHI8X1RwMSwgX0xwPiYgX19yaHMpCisgICAgICAgIHsgcmV0dXJuIF9fbGhzLl9NX2xlc3MoX19yaHMpOyB9CisKKyAgICAgIF9UcCogICAgICAgCSBfTV9wdHI7ICAgICAgICAgLy8gQ29udGFpbmVkIHBvaW50ZXIuCisgICAgICBfX3dlYWtfY291bnQ8X0xwPiAgX01fcmVmY291bnQ7ICAgIC8vIFJlZmVyZW5jZSBjb3VudGVyLgorICAgIH07CisKKyAgLy8gMi4yLjQuNyB3ZWFrX3B0ciBzcGVjaWFsaXplZCBhbGdvcml0aG1zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9fd2Vha19wdHI8X1RwLCBfTHA+JiBfX2EsIF9fd2Vha19wdHI8X1RwLCBfTHA+JiBfX2IpCisgICAgeyBfX2Euc3dhcChfX2IpOyB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcworICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzKCkgeyB9CisgICAgICAKKyAgICAgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoY29uc3QgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYpIHsgfQorICAgICAgCisgICAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgfl9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoKSB7IH0KKyAgICAgIAorICAgIHB1YmxpYzoKKyAgICAgIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4KKyAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKQorICAgICAgeyByZXR1cm4gX19zaGFyZWRfcHRyPF9UcCwgX0xwPih0aGlzLT5fTV93ZWFrX3RoaXMpOyB9CisKKyAgICAgIF9fc2hhcmVkX3B0cjxjb25zdCBfVHAsIF9McD4KKyAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSBjb25zdAorICAgICAgeyByZXR1cm4gX19zaGFyZWRfcHRyPGNvbnN0IF9UcCwgX0xwPih0aGlzLT5fTV93ZWFrX3RoaXMpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV93ZWFrX2Fzc2lnbihfVHAxKiBfX3AsIGNvbnN0IF9fc2hhcmVkX2NvdW50PF9McD4mIF9fbikgY29uc3QKKyAgICAgICAgeyBfTV93ZWFrX3RoaXMuX01fYXNzaWduKF9fcCwgX19uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBmcmllbmQgdm9pZAorICAgICAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX3BuLAorCQkJCQkgY29uc3QgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcyogX19wZSwKKwkJCQkJIGNvbnN0IF9UcDEqIF9fcHgpCisgICAgICAgIHsKKwkgIGlmIChfX3BlICE9IDApCisJICAgIF9fcGUtPl9NX3dlYWtfYXNzaWduKGNvbnN0X2Nhc3Q8X1RwMSo+KF9fcHgpLCBfX3BuKTsKKwl9CisKKyAgICAgIG11dGFibGUgX193ZWFrX3B0cjxfVHAsIF9McD4gIF9NX3dlYWtfdGhpczsKKyAgICB9OworCisKKyAgLy8gVGhlIGFjdHVhbCBzaGFyZWRfcHRyLCB3aXRoIGZvcndhcmRpbmcgY29uc3RydWN0b3JzIGFuZAorICAvLyBhc3NpZ25tZW50IG9wZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHNoYXJlZF9wdHIKKyAgICA6IHB1YmxpYyBfX3NoYXJlZF9wdHI8X1RwPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBzaGFyZWRfcHRyKCkKKyAgICAgIDogX19zaGFyZWRfcHRyPF9UcD4oKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgc2hhcmVkX3B0cihfVHAxKiBfX3ApCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3ApIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfRGVsZXRlcj4KKyAgICAgICAgc2hhcmVkX3B0cihfVHAxKiBfX3AsIF9EZWxldGVyIF9fZCkKKwk6IF9fc2hhcmVkX3B0cjxfVHA+KF9fcCwgX19kKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgc2hhcmVkX3B0cihjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3IpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBzaGFyZWRfcHRyKGNvbnN0IHdlYWtfcHRyPF9UcDE+JiBfX3IpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3IpIHsgfQorCisjaWYgKF9fY3BsdXNwbHVzIDwgMjAxMTAzTCkgfHwgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIHNoYXJlZF9wdHIoc3RkOjphdXRvX3B0cjxfVHAxPiYgX19yKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19yKSB7IH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fciwgX19zdGF0aWNfY2FzdF90YWcpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3IsIF9fc3RhdGljX2Nhc3RfdGFnKCkpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fciwgX19jb25zdF9jYXN0X3RhZykKKwk6IF9fc2hhcmVkX3B0cjxfVHA+KF9fciwgX19jb25zdF9jYXN0X3RhZygpKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgc2hhcmVkX3B0cihjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IsIF9fZHluYW1pY19jYXN0X3RhZykKKwk6IF9fc2hhcmVkX3B0cjxfVHA+KF9fciwgX19keW5hbWljX2Nhc3RfdGFnKCkpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBzaGFyZWRfcHRyJgorICAgICAgICBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgICAgeworCSAgdGhpcy0+X19zaGFyZWRfcHRyPF9UcD46Om9wZXJhdG9yPShfX3IpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworI2lmIChfX2NwbHVzcGx1cyA8IDIwMTEwM0wpIHx8IF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBzaGFyZWRfcHRyJgorICAgICAgICBvcGVyYXRvcj0oc3RkOjphdXRvX3B0cjxfVHAxPiYgX19yKQorICAgICAgICB7CisJICB0aGlzLT5fX3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KF9fcik7CisJICByZXR1cm4gKnRoaXM7CisJfQorI2VuZGlmCisgICAgfTsKKworICAvLyAyLjIuMy44IHNoYXJlZF9wdHIgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3NoYXJlZF9wdHI8X1RwPiYgX19hLCBfX3NoYXJlZF9wdHI8X1RwPiYgX19iKQorICAgIHsgX19hLnN3YXAoX19iKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMT4KKyAgICBpbmxpbmUgc2hhcmVkX3B0cjxfVHA+CisgICAgc3RhdGljX3BvaW50ZXJfY2FzdChjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpCisgICAgeyByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KF9fciwgX19zdGF0aWNfY2FzdF90YWcoKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDE+CisgICAgaW5saW5lIHNoYXJlZF9wdHI8X1RwPgorICAgIGNvbnN0X3BvaW50ZXJfY2FzdChjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpCisgICAgeyByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KF9fciwgX19jb25zdF9jYXN0X3RhZygpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMT4KKyAgICBpbmxpbmUgc2hhcmVkX3B0cjxfVHA+CisgICAgZHluYW1pY19wb2ludGVyX2Nhc3QoY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yKQorICAgIHsgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPihfX3IsIF9fZHluYW1pY19jYXN0X3RhZygpKTsgfQorCisKKyAgLy8gVGhlIGFjdHVhbCB3ZWFrX3B0ciwgd2l0aCBmb3J3YXJkaW5nIGNvbnN0cnVjdG9ycyBhbmQKKyAgLy8gYXNzaWdubWVudCBvcGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyB3ZWFrX3B0cgorICAgIDogcHVibGljIF9fd2Vha19wdHI8X1RwPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB3ZWFrX3B0cigpCisgICAgICA6IF9fd2Vha19wdHI8X1RwPigpIHsgfQorICAgICAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICB3ZWFrX3B0cihjb25zdCB3ZWFrX3B0cjxfVHAxPiYgX19yKQorCTogX193ZWFrX3B0cjxfVHA+KF9fcikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHdlYWtfcHRyKGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fcikKKwk6IF9fd2Vha19wdHI8X1RwPihfX3IpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICB3ZWFrX3B0ciYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IHdlYWtfcHRyPF9UcDE+JiBfX3IpIC8vIG5ldmVyIHRocm93cworICAgICAgICB7CisJICB0aGlzLT5fX3dlYWtfcHRyPF9UcD46Om9wZXJhdG9yPShfX3IpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgd2Vha19wdHImCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpIC8vIG5ldmVyIHRocm93cworICAgICAgICB7CisJICB0aGlzLT5fX3dlYWtfcHRyPF9UcD46Om9wZXJhdG9yPShfX3IpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgc2hhcmVkX3B0cjxfVHA+CisgICAgICBsb2NrKCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7CisjaWZkZWYgX19HVEhSRUFEUworCWlmICh0aGlzLT5leHBpcmVkKCkpCisJICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KCk7CisKKwlfX3RyeQorCSAgeworCSAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KCp0aGlzKTsKKwkgIH0KKwlfX2NhdGNoKGNvbnN0IGJhZF93ZWFrX3B0ciYpCisJICB7CisJICAgIHJldHVybiBzaGFyZWRfcHRyPF9UcD4oKTsKKwkgIH0KKyNlbHNlCisJcmV0dXJuIHRoaXMtPmV4cGlyZWQoKSA/IHNoYXJlZF9wdHI8X1RwPigpCisJICAgICAgICAgICAgICAgICAgICAgICA6IHNoYXJlZF9wdHI8X1RwPigqdGhpcyk7CisjZW5kaWYKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcworICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcygpIHsgfQorICAgICAgCisgICAgICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyhjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYpIHsgfQorCisgICAgICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICB+ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHNoYXJlZF9wdHI8X1RwPgorICAgICAgc2hhcmVkX2Zyb21fdGhpcygpCisgICAgICB7IHJldHVybiBzaGFyZWRfcHRyPF9UcD4odGhpcy0+X01fd2Vha190aGlzKTsgfQorCisgICAgICBzaGFyZWRfcHRyPGNvbnN0IF9UcD4KKyAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSBjb25zdAorICAgICAgeyByZXR1cm4gc2hhcmVkX3B0cjxjb25zdCBfVHA+KHRoaXMtPl9NX3dlYWtfdGhpcyk7IH0KKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX3dlYWtfYXNzaWduKF9UcDEqIF9fcCwgY29uc3QgX19zaGFyZWRfY291bnQ8PiYgX19uKSBjb25zdAorICAgICAgICB7IF9NX3dlYWtfdGhpcy5fTV9hc3NpZ24oX19wLCBfX24pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGZyaWVuZCB2b2lkCisgICAgICAgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKGNvbnN0IF9fc2hhcmVkX2NvdW50PD4mIF9fcG4sCisJCQkJCSBjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyogX19wZSwKKwkJCQkJIGNvbnN0IF9UcDEqIF9fcHgpCisgICAgICAgIHsKKwkgIGlmIChfX3BlICE9IDApCisJICAgIF9fcGUtPl9NX3dlYWtfYXNzaWduKGNvbnN0X2Nhc3Q8X1RwMSo+KF9fcHgpLCBfX3BuKTsKKwl9CisKKyAgICAgIG11dGFibGUgd2Vha19wdHI8X1RwPiAgX01fd2Vha190aGlzOworICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYgLy8gX1RSMV9TSEFSRURfUFRSX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3NwZWNpYWxfZnVuY3Rpb25fdXRpbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3BlY2lhbF9mdW5jdGlvbl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlYzA1MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3NwZWNpYWxfZnVuY3Rpb25fdXRpbC5oCkBAIC0wLDAgKzEsMTM1IEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3NwZWNpYWxfZnVuY3Rpb25fdXRpbC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2NtYXRofQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyIFRSMTogNS4yICBTcGVjaWFsIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBFZHdhcmQgU21pdGgtUm93bGFuZCBiYXNlZCBvbiBudW1lcm91cyBtYXRoZW1hdGljcyBib29rcy4KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfU1BFQ0lBTF9GVU5DVElPTl9VVElMX0gKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1NQRUNJQUxfRlVOQ1RJT05fVVRJTF9IIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvLy8gQSBjbGFzcyB0byBlbmNhcHN1bGF0ZSB0eXBlIGRlcGVuZGVudCBmbG9hdGluZyBwb2ludAorICAgIC8vLyBjb25zdGFudHMuICBOb3QgZXZlcnl0aGluZyB3aWxsIGJlIGFibGUgdG8gYmUgZXhwcmVzc2VkIGFzCisgICAgLy8vIHR5cGUgbG9naWMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2Zsb2F0aW5nX3BvaW50X2NvbnN0YW50CisgICAgeworICAgICAgc3RhdGljIGNvbnN0IF9UcCBfX3ZhbHVlOworICAgIH07CisKKworICAgIC8vLyBBIHN0cnVjdHVyZSBmb3IgbnVtZXJpYyBjb25zdGFudHMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgc3RydWN0IF9fbnVtZXJpY19jb25zdGFudHMKKyAgICAgIHsKKyAgICAgICAgLy8vICBDb25zdGFudCBAZiQgXHBpIEBmJC4KKyAgICAgICAgc3RhdGljIF9UcCBfX3BpKCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyOUwpOyB9CisgICAgICAgIC8vLyAgQ29uc3RhbnQgQGYkIFxwaSAvIDIgQGYkLgorICAgICAgICBzdGF0aWMgX1RwIF9fcGlfMigpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigxLjU3MDc5NjMyNjc5NDg5NjYxOTIzMTMyMTY5MTYzOTc1MTRMKTsgfQorICAgICAgICAvLy8gIENvbnN0YW50IEBmJCBccGkgLyAzIEBmJC4KKyAgICAgICAgc3RhdGljIF9UcCBfX3BpXzMoKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMS4wNDcxOTc1NTExOTY1OTc3NDYxNTQyMTQ0NjEwOTMxNjc2TCk7IH0KKyAgICAgICAgLy8vICBDb25zdGFudCBAZiQgXHBpIC8gNCBAZiQuCisgICAgICAgIHN0YXRpYyBfVHAgX19waV80KCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDAuNzg1Mzk4MTYzMzk3NDQ4MzA5NjE1NjYwODQ1ODE5ODc1N0wpOyB9CisgICAgICAgIC8vLyAgQ29uc3RhbnQgQGYkIDEgLyBccGkgQGYkLgorICAgICAgICBzdGF0aWMgX1RwIF9fMV9waSgpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigwLjMxODMwOTg4NjE4Mzc5MDY3MTUzNzc2NzUyNjc0NTAyODdMKTsgfQorICAgICAgICAvLy8gIENvbnN0YW50IEBmJCAyIC8gXHNxcnQoXHBpKSBAZiQuCisgICAgICAgIHN0YXRpYyBfVHAgX18yX3NxcnRwaSgpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigxLjEyODM3OTE2NzA5NTUxMjU3Mzg5NjE1ODkwMzEyMTU0NTJMKTsgfQorICAgICAgICAvLy8gIENvbnN0YW50IEBmJCBcc3FydCgyKSBAZiQuCisgICAgICAgIHN0YXRpYyBfVHAgX19zcXJ0MigpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigxLjQxNDIxMzU2MjM3MzA5NTA0ODgwMTY4ODcyNDIwOTY5ODFMKTsgfQorICAgICAgICAvLy8gIENvbnN0YW50IEBmJCBcc3FydCgzKSBAZiQuCisgICAgICAgIHN0YXRpYyBfVHAgX19zcXJ0MygpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigxLjczMjA1MDgwNzU2ODg3NzI5MzUyNzQ0NjM0MTUwNTg3MjNMKTsgfQorICAgICAgICAvLy8gIENvbnN0YW50IEBmJCBcc3FydChccGkvMikgQGYkLgorICAgICAgICBzdGF0aWMgX1RwIF9fc3FydHBpbzIoKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMS4yNTMzMTQxMzczMTU1MDAyNTEyMDc4ODI2NDI0MDU1MjI2TCk7IH0KKyAgICAgICAgLy8vICBDb25zdGFudCBAZiQgMSAvIHNxcnQoMikgQGYkLgorICAgICAgICBzdGF0aWMgX1RwIF9fc3FydDFfMigpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigwLjcwNzEwNjc4MTE4NjU0NzUyNDQwMDg0NDM2MjEwNDg0OTBMKTsgfQorICAgICAgICAvLy8gIENvbnN0YW50IEBmJCBcbG9nKFxwaSkgQGYkLgorICAgICAgICBzdGF0aWMgX1RwIF9fbG5waSgpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigxLjE0NDcyOTg4NTg0OTQwMDE3NDE0MzQyNzM1MTM1MzA1ODdMKTsgfQorICAgICAgICAvLy8gIENvbnN0YW50IEV1bGVyJ3MgY29uc3RhbnQgQGYkIFxnYW1tYV9FIEBmJC4KKyAgICAgICAgc3RhdGljIF9UcCBfX2dhbW1hX2UoKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMC41NzcyMTU2NjQ5MDE1MzI4NjA2MDY1MTIwOTAwODI0MDI0TCk7IH0KKyAgICAgICAgLy8vICBDb25zdGFudCBFdWxlci1NYXNjaGVyb25pIEBmJCBlIEBmJAorICAgICAgICBzdGF0aWMgX1RwIF9fZXVsZXIoKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMi43MTgyODE4Mjg0NTkwNDUyMzUzNjAyODc0NzEzNTI2NjI1TCk7IH0KKyAgICAgIH07CisKKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSCAmJiAhX0dMSUJDWFhfVVNFX0M5OV9GUF9NQUNST1NfRFlOQU1JQworCisgICAgLy8vIFRoaXMgaXMgYSB3cmFwcGVyIGZvciB0aGUgaXNuYW4gZnVuY3Rpb24uIE90aGVyd2lzZSwgZm9yIE5hTiwKKyAgICAvLy8gYWxsIGNvbXBhcmlzb25zIHJlc3VsdCBpbiBmYWxzZS4gSWYvd2hlbiB3ZSBidWlsZCBhIHN0ZDo6aXNuYW4KKyAgICAvLy8gb3V0IG9mIGludHJpbnNpY3MsIHRoaXMgd2lsbCBkaXNhcHBlYXIgY29tcGxldGVseSBpbiBmYXZvciBvZgorICAgIC8vLyBzdGQ6OmlzbmFuLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbCBfX2lzbmFuKF9UcCBfX3gpCisgICAgeyByZXR1cm4gc3RkOjppc25hbihfX3gpOyB9CisKKyNlbHNlCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wgX19pc25hbihjb25zdCBfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc25hbihfX3gpOyB9CisKKyAgICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIGJvb2wgX19pc25hbjxmbG9hdD4oZmxvYXQgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc25hbmYoX194KTsgfQorCisgICAgdGVtcGxhdGU8PgorICAgIGlubGluZSBib29sIF9faXNuYW48bG9uZyBkb3VibGU+KGxvbmcgZG91YmxlIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5faXNuYW5sKF9feCk7IH0KKworI2VuZGlmCisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIF9fZGV0YWlsCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfU1BFQ0lBTF9GVU5DVElPTl9VVElMX0gKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkYXJnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9zdGRhcmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzM5NmNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkYXJnLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIHN0ZGFyZy5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvc3RkYXJnLmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfVFIxX1NUREFSR19ICisjZGVmaW5lIF9UUjFfU1REQVJHX0ggMQorCisjaW5jbHVkZSA8dHIxL2NzdGRhcmc+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkYm9vbC5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkYm9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTJmNTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9zdGRib29sLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIHN0ZGJvb2wuaCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3N0ZGJvb2wuaAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9UUjFfU1REQk9PTF9ICisjZGVmaW5lIF9UUjFfU1REQk9PTF9IIDEKKworI2luY2x1ZGUgPHRyMS9jc3RkYm9vbD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9zdGRpbnQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3N0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOWUxZGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9zdGRpbnQuaApAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgc3RkaW50LmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9zdGRpbnQuaAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9UUjFfU1RESU5UX0gKKyNkZWZpbmUgX1RSMV9TVERJTlRfSCAxCisKKyNpbmNsdWRlIDx0cjEvY3N0ZGludD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9zdGRpby5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTVlMDc5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkaW8uaApAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgc3RkaW8uaCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3N0ZGlvLmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfVFIxX1NURElPX0gKKyNkZWZpbmUgX1RSMV9TVERJT19IIDEKKworI2luY2x1ZGUgPHRyMS9jc3RkaW8+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkbGliLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9zdGRsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzcwYzI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkbGliLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gVFIxIHN0ZGxpYi5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvc3RkbGliLmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfU1RETElCX0gKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1NURExJQl9IIDEKKworI2luY2x1ZGUgPHRyMS9jc3RkbGliPgorCisjaWYgX0dMSUJDWFhfSE9TVEVECisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5CisKK3VzaW5nIHN0ZDo6dHIxOjphdG9sbDsKK3VzaW5nIHN0ZDo6dHIxOjpzdHJ0b2xsOwordXNpbmcgc3RkOjp0cjE6OnN0cnRvdWxsOworCit1c2luZyBzdGQ6OnRyMTo6YWJzOworI2lmICFfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19EWU5BTUlDCit1c2luZyBzdGQ6OnRyMTo6ZGl2OworI2VuZGlmCisKKyNlbmRpZgorCisjZW5kaWYKKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9TVERMSUJfSAorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS90Z21hdGguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3RnbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYzliZDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS90Z21hdGguaApAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgdGdtYXRoLmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS90Z21hdGguaAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9UR01BVEhfSAorI2RlZmluZSBfR0xJQkNYWF9UUjFfVEdNQVRIX0ggMQorCisjaW5jbHVkZSA8dHIxL2N0Z21hdGg+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfVEdNQVRIX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3R1cGxlIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvdHVwbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3Y2MzMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3R1cGxlCkBAIC0wLDAgKzEsNDI2IEBACisvLyBjbGFzcyB0ZW1wbGF0ZSB0dXBsZSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3R1cGxlCisqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyovCisKKy8vIENocmlzIEplZmZlcnNvbiA8Y2hyaXNAYnViYmxlc2NvcGUubmV0PgorLy8gVmFyaWFkaWMgVGVtcGxhdGVzIHN1cHBvcnQgYnkgRG91Z2xhcyBHcmVnb3IgPGRvdWcuZ3JlZ29yQGdtYWlsLmNvbT4KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfVFVQTEUKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1RVUExFIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEFkZHMgYSBjb25zdCByZWZlcmVuY2UgdG8gYSBub24tcmVmZXJlbmNlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfY19yZWYKKyAgICB7IHR5cGVkZWYgY29uc3QgX1RwJiB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfY19yZWY8X1RwJj4KKyAgICB7IHR5cGVkZWYgX1RwJiB0eXBlOyB9OworCisgIC8vIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBub24tcmVmZXJlbmNlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfcmVmCisgICAgeyB0eXBlZGVmIF9UcCYgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX3JlZjxfVHAmPgorICAgIHsgdHlwZWRlZiBfVHAmIHR5cGU7IH07CisKKyAgLyoqCisgICAqIENvbnRhaW5zIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEBjIHR1cGxlIHRlbXBsYXRlLCBzdG9yZWQKKyAgICogYXMgYSByZWN1cnNpdmUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGZyb20gdGhlIGZpcnN0IGVsZW1lbnQgKG1vc3QKKyAgICogZGVyaXZlZCBjbGFzcykgdG8gdGhlIGxhc3QgKGxlYXN0IGRlcml2ZWQgY2xhc3MpLiBUaGUgQGMgSWR4CisgICAqIHBhcmFtZXRlciBnaXZlcyB0aGUgMC1iYXNlZCBpbmRleCBvZiB0aGUgZWxlbWVudCBzdG9yZWQgYXQgdGhpcworICAgKiBwb2ludCBpbiB0aGUgaGllcmFyY2h5OyB3ZSB1c2UgaXQgdG8gaW1wbGVtZW50IGEgY29uc3RhbnQtdGltZQorICAgKiBnZXQoKSBvcGVyYXRpb24uCisgICAqLworICB0ZW1wbGF0ZTxpbnQgX0lkeCwgdHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIHN0cnVjdCBfVHVwbGVfaW1wbDsgCisKKyAgLyoqCisgICAqIFplcm8tZWxlbWVudCB0dXBsZSBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpcyB0aGUgYmFzaXMgY2FzZSBmb3IgdGhlIAorICAgKiBpbmhlcml0YW5jZSByZWN1cnNpb24uCisgICAqLworICB0ZW1wbGF0ZTxpbnQgX0lkeD4KKyAgICBzdHJ1Y3QgX1R1cGxlX2ltcGw8X0lkeD4geyB9OworCisgIC8qKgorICAgKiBSZWN1cnNpdmUgdHVwbGUgaW1wbGVtZW50YXRpb24uIEhlcmUgd2Ugc3RvcmUgdGhlIEBjIEhlYWQgZWxlbWVudAorICAgKiBhbmQgZGVyaXZlIGZyb20gYSBAYyBUdXBsZV9pbXBsIGNvbnRhaW5pbmcgdGhlIHJlbWFpbmluZyBlbGVtZW50cworICAgKiAod2hpY2ggY29udGFpbnMgdGhlIEBjIFRhaWwpLgorICAgKi8KKyAgdGVtcGxhdGU8aW50IF9JZHgsIHR5cGVuYW1lIF9IZWFkLCB0eXBlbmFtZS4uLiBfVGFpbD4KKyAgICBzdHJ1Y3QgX1R1cGxlX2ltcGw8X0lkeCwgX0hlYWQsIF9UYWlsLi4uPgorICAgIDogcHVibGljIF9UdXBsZV9pbXBsPF9JZHggKyAxLCBfVGFpbC4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UdXBsZV9pbXBsPF9JZHggKyAxLCBfVGFpbC4uLj4gX0luaGVyaXRlZDsKKyAgICAgIAorICAgICAgX0hlYWQgX01faGVhZDsKKyAgICAgIAorICAgICAgX0luaGVyaXRlZCYgICAgICAgX01fdGFpbCgpICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgICBjb25zdCBfSW5oZXJpdGVkJiBfTV90YWlsKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KKyAgICAgIAorICAgICAgX1R1cGxlX2ltcGwoKSA6IF9Jbmhlcml0ZWQoKSwgX01faGVhZCgpIHsgfQorICAgICAgCisgICAgICBleHBsaWNpdCAKKyAgICAgIF9UdXBsZV9pbXBsKHR5cGVuYW1lIF9fYWRkX2NfcmVmPF9IZWFkPjo6dHlwZSBfX2hlYWQsCisJCSAgdHlwZW5hbWUgX19hZGRfY19yZWY8X1RhaWw+Ojp0eXBlLi4uIF9fdGFpbCkKKyAgICAgIDogX0luaGVyaXRlZChfX3RhaWwuLi4pLCBfTV9oZWFkKF9faGVhZCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgICBfVHVwbGVfaW1wbChjb25zdCBfVHVwbGVfaW1wbDxfSWR4LCBfVUVsZW1lbnRzLi4uPiYgX19pbikKKyAgICAgIDogX0luaGVyaXRlZChfX2luLl9NX3RhaWwoKSksIF9NX2hlYWQoX19pbi5fTV9oZWFkKSB7IH0KKworICAgICAgX1R1cGxlX2ltcGwoY29uc3QgX1R1cGxlX2ltcGwmIF9faW4pCisgICAgICA6IF9Jbmhlcml0ZWQoX19pbi5fTV90YWlsKCkpLCBfTV9oZWFkKF9faW4uX01faGVhZCkgeyB9CisgICAgIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICAgICAgX1R1cGxlX2ltcGwmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBfVHVwbGVfaW1wbDxfSWR4LCBfVUVsZW1lbnRzLi4uPiYgX19pbikKKyAgICAgICAgeworCSAgX01faGVhZCA9IF9faW4uX01faGVhZDsKKwkgIF9NX3RhaWwoKSA9IF9faW4uX01fdGFpbCgpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgX1R1cGxlX2ltcGwmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1R1cGxlX2ltcGwmIF9faW4pCisgICAgICB7CisJX01faGVhZCA9IF9faW4uX01faGVhZDsKKwlfTV90YWlsKCkgPSBfX2luLl9NX3RhaWwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+IAorICAgIGNsYXNzIHR1cGxlIDogcHVibGljIF9UdXBsZV9pbXBsPDAsIF9FbGVtZW50cy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UdXBsZV9pbXBsPDAsIF9FbGVtZW50cy4uLj4gX0luaGVyaXRlZDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR1cGxlKCkgOiBfSW5oZXJpdGVkKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB0dXBsZSh0eXBlbmFtZSBfX2FkZF9jX3JlZjxfRWxlbWVudHM+Ojp0eXBlLi4uIF9fZWxlbWVudHMpCisgICAgICA6IF9Jbmhlcml0ZWQoX19lbGVtZW50cy4uLikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgICAgIHR1cGxlKGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX2luKQorCTogX0luaGVyaXRlZChfX2luKSB7IH0KKworICAgICAgdHVwbGUoY29uc3QgdHVwbGUmIF9faW4pCisgICAgICA6IF9Jbmhlcml0ZWQoX19pbikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgICAgIHR1cGxlJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9faW4pCisgICAgICAgIHsKKwkgIHN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmPigqdGhpcykgPSBfX2luOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdHVwbGUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIF9faW4pCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCY+KCp0aGlzKSA9IF9faW47CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PiBjbGFzcyB0dXBsZTw+IHsgfTsKKworICAvLyAyLWVsZW1lbnQgdHVwbGUsIHdpdGggY29uc3RydWN0aW9uIGFuZCBhc3NpZ25tZW50IGZyb20gYSBwYWlyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBjbGFzcyB0dXBsZTxfVDEsIF9UMj4gOiBwdWJsaWMgX1R1cGxlX2ltcGw8MCwgX1QxLCBfVDI+CisgICAgeworICAgICAgdHlwZWRlZiBfVHVwbGVfaW1wbDwwLCBfVDEsIF9UMj4gX0luaGVyaXRlZDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR1cGxlKCkgOiBfSW5oZXJpdGVkKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB0dXBsZSh0eXBlbmFtZSBfX2FkZF9jX3JlZjxfVDE+Ojp0eXBlIF9fYTEsCisJICAgIHR5cGVuYW1lIF9fYWRkX2NfcmVmPF9UMj46OnR5cGUgX19hMikKKyAgICAgIDogX0luaGVyaXRlZChfX2ExLCBfX2EyKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTI+CisgICAgICAgIHR1cGxlKGNvbnN0IHR1cGxlPF9VMSwgX1UyPiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoX19pbikgeyB9CisKKyAgICAgIHR1cGxlKGNvbnN0IHR1cGxlJiBfX2luKQorICAgICAgOiBfSW5oZXJpdGVkKF9faW4pIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKyAgICAgICAgdHVwbGUoY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9faW4pCisJOiBfSW5oZXJpdGVkKF9UdXBsZV9pbXBsPDAsIAorCQkgICAgIHR5cGVuYW1lIF9fYWRkX2NfcmVmPF9VMT46OnR5cGUsCisJCSAgICAgdHlwZW5hbWUgX19hZGRfY19yZWY8X1UyPjo6dHlwZT4oX19pbi5maXJzdCwgCisJCQkJCQkgICAgICBfX2luLnNlY29uZCkpCisgICAgICAgIHsgfQorICAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorICAgICAgICB0dXBsZSYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IHR1cGxlPF9VMSwgX1UyPiYgX19pbikKKyAgICAgICAgeworCSAgc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCY+KCp0aGlzKSA9IF9faW47CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0dXBsZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgX19pbikKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gX19pbjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorICAgICAgICB0dXBsZSYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IHBhaXI8X1UxLCBfVTI+JiBfX2luKQorICAgICAgICB7CisJICB0aGlzLT5fTV9oZWFkID0gX19pbi5maXJzdDsKKwkgIHRoaXMtPl9NX3RhaWwoKS5fTV9oZWFkID0gX19pbi5zZWNvbmQ7CisJICByZXR1cm4gKnRoaXM7CisJfQorICAgIH07CisKKyAgCisgIC8vLyBHaXZlcyB0aGUgdHlwZSBvZiB0aGUgaXRoIGVsZW1lbnQgb2YgYSBnaXZlbiB0dXBsZSB0eXBlLgorICB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ7CisKKyAgLyoqCisgICAqIFJlY3Vyc2l2ZSBjYXNlIGZvciB0dXBsZV9lbGVtZW50OiBzdHJpcCBvZmYgdGhlIGZpcnN0IGVsZW1lbnQgaW4KKyAgICogdGhlIHR1cGxlIGFuZCByZXRyaWV2ZSB0aGUgKGktMSl0aCBlbGVtZW50IG9mIHRoZSByZW1haW5pbmcgdHVwbGUuCisgICAqLworICB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8X19pLCB0dXBsZTxfSGVhZCwgX1RhaWwuLi4+ID4KKyAgICA6IHR1cGxlX2VsZW1lbnQ8X19pIC0gMSwgdHVwbGU8X1RhaWwuLi4+ID4geyB9OworCisgIC8qKgorICAgKiBCYXNpcyBjYXNlIGZvciB0dXBsZV9lbGVtZW50OiBUaGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgb25lIHdlJ3JlIHNlZWtpbmcuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8MCwgdHVwbGU8X0hlYWQsIF9UYWlsLi4uPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfSGVhZCB0eXBlOworICAgIH07CisKKyAgLy8vIEZpbmRzIHRoZSBzaXplIG9mIGEgZ2l2ZW4gdHVwbGUgdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCB0dXBsZV9zaXplOworCisgIC8vLyBjbGFzcyB0dXBsZV9zaXplCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBzdHJ1Y3QgdHVwbGVfc2l6ZTx0dXBsZTxfRWxlbWVudHMuLi4+ID4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gc2l6ZW9mLi4uKF9FbGVtZW50cyk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgY29uc3QgaW50IHR1cGxlX3NpemU8dHVwbGU8X0VsZW1lbnRzLi4uPiA+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fYWRkX3JlZjxfSGVhZD46OnR5cGUKKyAgICBfX2dldF9oZWxwZXIoX1R1cGxlX2ltcGw8X19pLCBfSGVhZCwgX1RhaWwuLi4+JiBfX3QpCisgICAgeworICAgICAgcmV0dXJuIF9fdC5fTV9oZWFkOworICAgIH0KKworICB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fYWRkX2NfcmVmPF9IZWFkPjo6dHlwZQorICAgIF9fZ2V0X2hlbHBlcihjb25zdCBfVHVwbGVfaW1wbDxfX2ksIF9IZWFkLCBfVGFpbC4uLj4mIF9fdCkKKyAgICB7CisgICAgICByZXR1cm4gX190Ll9NX2hlYWQ7CisgICAgfQorCisgIC8vIFJldHVybiBhIHJlZmVyZW5jZSAoY29uc3QgcmVmZXJlbmNlKSB0byB0aGUgaXRoIGVsZW1lbnQgb2YgYSB0dXBsZS4KKyAgLy8gQW55IGNvbnN0IG9yIG5vbi1jb25zdCByZWYgZWxlbWVudHMgYXJlIHJldHVybmVkIHdpdGggdGhlaXIgb3JpZ2luYWwgdHlwZS4KKyAgdGVtcGxhdGU8aW50IF9faSwgdHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2FkZF9yZWY8CisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfX2ksIHR1cGxlPF9FbGVtZW50cy4uLj4gPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgZ2V0KHR1cGxlPF9FbGVtZW50cy4uLj4mIF9fdCkKKyAgICB7IAorICAgICAgcmV0dXJuIF9fZ2V0X2hlbHBlcjxfX2k+KF9fdCk7IAorICAgIH0KKworICB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fYWRkX2NfcmVmPAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X19pLCB0dXBsZTxfRWxlbWVudHMuLi4+ID46OnR5cGUKKyAgICAgICAgICAgICAgICAgICAgPjo6dHlwZQorICAgIGdldChjb25zdCB0dXBsZTxfRWxlbWVudHMuLi4+JiBfX3QpCisgICAgeworICAgICAgcmV0dXJuIF9fZ2V0X2hlbHBlcjxfX2k+KF9fdCk7CisgICAgfQorCisgIC8vIFRoaXMgY2xhc3MgaGVscHMgY29uc3RydWN0IHRoZSB2YXJpb3VzIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBvbiB0dXBsZXMKKyAgdGVtcGxhdGU8aW50IF9fY2hlY2tfZXF1YWxfc2l6ZSwgaW50IF9faSwgaW50IF9faiwKKwkgICB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX190dXBsZV9jb21wYXJlOworCisgIHRlbXBsYXRlPGludCBfX2ksIGludCBfX2osIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3R1cGxlX2NvbXBhcmU8MCwgX19pLCBfX2osIF9UcCwgX1VwPgorICAgIHsKKyAgICAgIHN0YXRpYyBib29sIF9fZXEoY29uc3QgX1RwJiBfX3QsIGNvbnN0IF9VcCYgX191KQorICAgICAgeworCXJldHVybiAoZ2V0PF9faT4oX190KSA9PSBnZXQ8X19pPihfX3UpICYmCisJCV9fdHVwbGVfY29tcGFyZTwwLCBfX2krMSwgX19qLCBfVHAsIF9VcD46Ol9fZXEoX190LCBfX3UpKTsKKyAgICAgIH0KKyAgICAgCisgICAgICBzdGF0aWMgYm9vbCBfX2xlc3MoY29uc3QgX1RwJiBfX3QsIGNvbnN0IF9VcCYgX191KQorICAgICAgeworCXJldHVybiAoKGdldDxfX2k+KF9fdCkgPCBnZXQ8X19pPihfX3UpKQorCQl8fCAhKGdldDxfX2k+KF9fdSkgPCBnZXQ8X19pPihfX3QpKSAmJgorCQlfX3R1cGxlX2NvbXBhcmU8MCwgX19pKzEsIF9faiwgX1RwLCBfVXA+OjpfX2xlc3MoX190LCBfX3UpKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPGludCBfX2ksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3R1cGxlX2NvbXBhcmU8MCwgX19pLCBfX2ksIF9UcCwgX1VwPgorICAgIHsKKyAgICAgIHN0YXRpYyBib29sIF9fZXEoY29uc3QgX1RwJiwgY29uc3QgX1VwJikKKyAgICAgIHsgcmV0dXJuIHRydWU7IH0KKyAgICAgCisgICAgICBzdGF0aWMgYm9vbCBfX2xlc3MoY29uc3QgX1RwJiwgY29uc3QgX1VwJikKKyAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgIGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX3UpCisgICAgeworICAgICAgdHlwZWRlZiB0dXBsZTxfVEVsZW1lbnRzLi4uPiBfVHA7CisgICAgICB0eXBlZGVmIHR1cGxlPF9VRWxlbWVudHMuLi4+IF9VcDsKKyAgICAgIHJldHVybiAoX190dXBsZV9jb21wYXJlPHR1cGxlX3NpemU8X1RwPjo6dmFsdWUgLSB0dXBsZV9zaXplPF9VcD46OnZhbHVlLAorCSAgICAgIDAsIHR1cGxlX3NpemU8X1RwPjo6dmFsdWUsIF9UcCwgX1VwPjo6X19lcShfX3QsIF9fdSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgdHVwbGU8X1RFbGVtZW50cy4uLj4mIF9fdCwKKwkgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHVwbGU8X1RFbGVtZW50cy4uLj4gX1RwOworICAgICAgdHlwZWRlZiB0dXBsZTxfVUVsZW1lbnRzLi4uPiBfVXA7CisgICAgICByZXR1cm4gKF9fdHVwbGVfY29tcGFyZTx0dXBsZV9zaXplPF9UcD46OnZhbHVlIC0gdHVwbGVfc2l6ZTxfVXA+Ojp2YWx1ZSwKKwkgICAgICAwLCB0dXBsZV9zaXplPF9UcD46OnZhbHVlLCBfVHAsIF9VcD46Ol9fbGVzcyhfX3QsIF9fdSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsgcmV0dXJuICEoX190ID09IF9fdSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9fdSkKKyAgICB7IHJldHVybiBfX3UgPCBfX3Q7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsgcmV0dXJuICEoX191IDwgX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9URWxlbWVudHMsIHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgIGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX3UpCisgICAgeyByZXR1cm4gIShfX3QgPCBfX3UpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHJlZmVyZW5jZV93cmFwcGVyOworCisgIC8vIEhlbHBlciB3aGljaCBhZGRzIGEgcmVmZXJlbmNlIHRvIGEgdHlwZSB3aGVuIGdpdmVuIGEgcmVmZXJlbmNlX3dyYXBwZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3N0cmlwX3JlZmVyZW5jZV93cmFwcGVyCisgICAgeworICAgICAgdHlwZWRlZiBfVHAgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3N0cmlwX3JlZmVyZW5jZV93cmFwcGVyPHJlZmVyZW5jZV93cmFwcGVyPF9UcD4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwJiBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fc3RyaXBfcmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgcmVmZXJlbmNlX3dyYXBwZXI8X1RwPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfVHAmIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBpbmxpbmUgdHVwbGU8dHlwZW5hbWUgX19zdHJpcF9yZWZlcmVuY2Vfd3JhcHBlcjxfRWxlbWVudHM+OjpfX3R5cGUuLi4+CisgICAgbWFrZV90dXBsZShfRWxlbWVudHMuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHVwbGU8dHlwZW5hbWUgX19zdHJpcF9yZWZlcmVuY2Vfd3JhcHBlcjxfRWxlbWVudHM+OjpfX3R5cGUuLi4+CisgICAgICAgIF9fcmVzdWx0X3R5cGU7CisgICAgICByZXR1cm4gX19yZXN1bHRfdHlwZShfX2FyZ3MuLi4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgaW5saW5lIHR1cGxlPF9FbGVtZW50cyYuLi4+CisgICAgdGllKF9FbGVtZW50cyYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHJldHVybiB0dXBsZTxfRWxlbWVudHMmLi4uPihfX2FyZ3MuLi4pOworICAgIH0KKworICAvLyBBIGNsYXNzIChhbmQgaW5zdGFuY2UpIHdoaWNoIGNhbiBiZSB1c2VkIGluICd0aWUnIHdoZW4gYW4gZWxlbWVudAorICAvLyBvZiBhIHR1cGxlIGlzIG5vdCByZXF1aXJlZAorICBzdHJ1Y3QgX1N3YWxsb3dfYXNzaWduCisgIHsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgICBfU3dhbGxvd19hc3NpZ24mCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1RwJikKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgIH07CisKKyAgLy8gVE9ETzogUHV0IHRoaXMgaW4gc29tZSBraW5kIG9mIHNoYXJlZCBmaWxlLgorICBuYW1lc3BhY2UKKyAgeworICAgIF9Td2FsbG93X2Fzc2lnbiBpZ25vcmU7CisgIH07IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfVFVQTEUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3R5cGVfdHJhaXRzIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvdHlwZV90cmFpdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3OTI3NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3R5cGVfdHJhaXRzCkBAIC0wLDAgKzEsNjg3IEBACisvLyBUUjEgdHlwZV90cmFpdHMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS90eXBlX3RyYWl0cworICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9UWVBFX1RSQUlUUworI2RlZmluZSBfR0xJQkNYWF9UUjFfVFlQRV9UUkFJVFMgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIG1ldGFwcm9ncmFtbWluZworICAgKiBAeworICAgKi8KKworICBzdHJ1Y3QgX19zZmluYWVfdHlwZXMKKyAgeworICAgIHR5cGVkZWYgY2hhciBfX29uZTsKKyAgICB0eXBlZGVmIHN0cnVjdCB7IGNoYXIgX19hcnJbMl07IH0gX190d287CisgIH07CisKKyNkZWZpbmUgX0RFRklORV9TUEVDXzBfSEVMUEVSICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPD4KKworI2RlZmluZSBfREVGSU5FX1NQRUNfMV9IRUxQRVIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCisjZGVmaW5lIF9ERUZJTkVfU1BFQ18yX0hFTFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DcD4KKworI2RlZmluZSBfREVGSU5FX1NQRUMoX09yZGVyLCBfVHJhaXQsIF9UeXBlLCBfVmFsdWUpICAgIFwKKyAgX0RFRklORV9TUEVDXyMjX09yZGVyIyNfSEVMUEVSICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IF9UcmFpdDxfVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9WYWx1ZT4geyB9OworCisgIC8vIGhlbHBlciBjbGFzc2VzIFs0LjNdLgorCisgIC8vLyBpbnRlZ3JhbF9jb25zdGFudAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9UcCBfX3Y+CisgICAgc3RydWN0IGludGVncmFsX2NvbnN0YW50CisgICAgeworICAgICAgc3RhdGljIGNvbnN0IF9UcCAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9fdjsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8X1RwLCBfX3Y+ICAgdHlwZTsKKyAgICB9OworICAKKyAgLy8vIHR5cGVkZWYgZm9yIHRydWVfdHlwZQorICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGJvb2wsIHRydWU+ICAgICB0cnVlX3R5cGU7CisKKyAgLy8vIHR5cGVkZWYgZm9yIGZhbHNlX3R5cGUKKyAgdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBmYWxzZT4gICAgZmFsc2VfdHlwZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9UcCBfX3Y+CisgICAgY29uc3QgX1RwIGludGVncmFsX2NvbnN0YW50PF9UcCwgX192Pjo6dmFsdWU7CisKKyAgLy8vIHJlbW92ZV9jdgorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2N2OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2lzX3ZvaWRfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX3ZvaWRfaGVscGVyLCB2b2lkLCB0cnVlKQorCisgIC8vIHByaW1hcnkgdHlwZSBjYXRlZ29yaWVzIFs0LjUuMV0uCisKKyAgLy8vIGlzX3ZvaWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc192b2lkCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfdm9pZF9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgYm9vbCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCBjaGFyLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHNpZ25lZCBjaGFyLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHVuc2lnbmVkIGNoYXIsIHRydWUpCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCB3Y2hhcl90LCB0cnVlKQorI2VuZGlmCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgc2hvcnQsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgdW5zaWduZWQgc2hvcnQsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgaW50LCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHVuc2lnbmVkIGludCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCBsb25nLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHVuc2lnbmVkIGxvbmcsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgbG9uZyBsb25nLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHVuc2lnbmVkIGxvbmcgbG9uZywgdHJ1ZSkKKworICAvLy8gaXNfaW50ZWdyYWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19pbnRlZ3JhbAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX2ludGVncmFsX2hlbHBlcjx0eXBlbmFtZQorCQkJCSAgICAgIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWUpPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc19mbG9hdGluZ19wb2ludF9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfZmxvYXRpbmdfcG9pbnRfaGVscGVyLCBmbG9hdCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfZmxvYXRpbmdfcG9pbnRfaGVscGVyLCBkb3VibGUsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2Zsb2F0aW5nX3BvaW50X2hlbHBlciwgbG9uZyBkb3VibGUsIHRydWUpCisKKyAgLy8vIGlzX2Zsb2F0aW5nX3BvaW50CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZmxvYXRpbmdfcG9pbnQKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19mbG9hdGluZ19wb2ludF9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2FycmF5CisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc19hcnJheQorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX1NpemU+CisgICAgc3RydWN0IGlzX2FycmF5PF9UcFtfU2l6ZV0+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2FycmF5PF9UcFtdPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfcG9pbnRlcl9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKyAgX0RFRklORV9TUEVDKDEsIF9faXNfcG9pbnRlcl9oZWxwZXIsIF9UcCosIHRydWUpCisKKyAgLy8vIGlzX3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19wb2ludGVyCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfcG9pbnRlcl9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX3JlZmVyZW5jZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3JlZmVyZW5jZTsKKworICAvLy8gaXNfZnVuY3Rpb24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygyLCBfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcl9oZWxwZXIsIF9UcCBfQ3A6OiosCisJICAgICAgICFpc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZSkKKworICAvLy8gaXNfbWVtYmVyX29iamVjdF9wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbWVtYmVyX29iamVjdF9wb2ludGVyCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyX2hlbHBlcjwKKwkJCQkgICAgICB0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygyLCBfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyX2hlbHBlciwgX1RwIF9DcDo6KiwKKwkgICAgICAgaXNfZnVuY3Rpb248X1RwPjo6dmFsdWUpCisKKyAgLy8vIGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcl9oZWxwZXI8CisJCQkJICAgICAgdHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vLyBpc19lbnVtCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZW51bQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfZW51bShfVHApPgorICAgIHsgfTsKKworICAvLy8gaXNfdW5pb24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc191bmlvbgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfdW5pb24oX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2NsYXNzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfY2xhc3MKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2NsYXNzKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBpc19mdW5jdGlvbgorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb24KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLik+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLikgY29uc3Q+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLikgY29uc3Q+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLikgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLikgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvLyBjb21wb3NpdGUgdHlwZSB0cmFpdHMgWzQuNS4yXS4KKyAgCisgIC8vLyBpc19hcml0aG1ldGljCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfYXJpdGhtZXRpYworICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZQorCQkJCSAgICAgIHx8IGlzX2Zsb2F0aW5nX3BvaW50PF9UcD46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2Z1bmRhbWVudGFsCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZnVuZGFtZW50YWwKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoaXNfYXJpdGhtZXRpYzxfVHA+Ojp2YWx1ZQorCQkJCSAgICAgIHx8IGlzX3ZvaWQ8X1RwPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLy8gaXNfb2JqZWN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfb2JqZWN0CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgIShpc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZQorCQkJCSAgICAgICB8fCBpc19yZWZlcmVuY2U8X1RwPjo6dmFsdWUKKwkJCQkgICAgICAgfHwgaXNfdm9pZDxfVHA+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vLyBpc19tZW1iZXJfcG9pbnRlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX21lbWJlcl9wb2ludGVyOworCisgIC8vLyBpc19zY2FsYXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19zY2FsYXIKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoaXNfYXJpdGhtZXRpYzxfVHA+Ojp2YWx1ZQorCQkJCSAgICAgIHx8IGlzX2VudW08X1RwPjo6dmFsdWUKKwkJCQkgICAgICB8fCBpc19wb2ludGVyPF9UcD46OnZhbHVlCisJCQkJICAgICAgfHwgaXNfbWVtYmVyX3BvaW50ZXI8X1RwPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLy8gaXNfY29tcG91bmQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19jb21wb3VuZAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsICFpc19mdW5kYW1lbnRhbDxfVHA+Ojp2YWx1ZT4geyB9OworCisgIC8vLyBpc19tZW1iZXJfcG9pbnRlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbWVtYmVyX3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygyLCBfX2lzX21lbWJlcl9wb2ludGVyX2hlbHBlciwgX1RwIF9DcDo6KiwgdHJ1ZSkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgIHN0cnVjdCBpc19tZW1iZXJfcG9pbnRlcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX21lbWJlcl9wb2ludGVyX2hlbHBlcjwKKwkJCQkgICAgICB0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8gdHlwZSBwcm9wZXJ0aWVzIFs0LjUuM10uCisgIC8vLyBpc19jb25zdAorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfY29uc3QKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2NvbnN0PF9UcCBjb25zdD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworICAKKyAgLy8vIGlzX3ZvbGF0aWxlCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc192b2xhdGlsZQorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfdm9sYXRpbGU8X1RwIHZvbGF0aWxlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLy8vIGlzX2VtcHR5CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZW1wdHkKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2VtcHR5KF9UcCk+CisgICAgeyB9OworCisgIC8vLyBpc19wb2x5bW9ycGhpYworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3BvbHltb3JwaGljCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19wb2x5bW9ycGhpYyhfVHApPgorICAgIHsgfTsKKworICAvLy8gaXNfYWJzdHJhY3QKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19hYnN0cmFjdAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfYWJzdHJhY3QoX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGhhc192aXJ0dWFsX2Rlc3RydWN0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfdmlydHVhbF9kZXN0cnVjdG9yCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBhbGlnbm1lbnRfb2YKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhbGlnbm1lbnRfb2YKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgX19hbGlnbm9mX18oX1RwKT4geyB9OworICAKKyAgLy8vIHJhbmsKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IHJhbmsKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgMD4geyB9OworICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX1NpemU+CisgICAgc3RydWN0IHJhbms8X1RwW19TaXplXT4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgMSArIHJhbms8X1RwPjo6dmFsdWU+IHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJhbms8X1RwW10+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDEgKyByYW5rPF9UcD46OnZhbHVlPiB7IH07CisKKyAgLy8vIGV4dGVudAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdW5zaWduZWQgX1VpbnQgPSAwPgorICAgIHN0cnVjdCBleHRlbnQKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgMD4geyB9OworICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB1bnNpZ25lZCBfVWludCwgc3RkOjpzaXplX3QgX1NpemU+CisgICAgc3RydWN0IGV4dGVudDxfVHBbX1NpemVdLCBfVWludD4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwKKwkJCSAgICAgICBfVWludCA9PSAwID8gX1NpemUgOiBleHRlbnQ8X1RwLAorCQkJCQkJCSAgIF9VaW50IC0gMT46OnZhbHVlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHVuc2lnbmVkIF9VaW50PgorICAgIHN0cnVjdCBleHRlbnQ8X1RwW10sIF9VaW50PgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LAorCQkJICAgICAgIF9VaW50ID09IDAgPyAwIDogZXh0ZW50PF9UcCwKKwkJCQkJCSAgICAgICBfVWludCAtIDE+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgLy8gcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHR5cGVzIFs0LjZdLgorCisgIC8vLyBpc19zYW1lCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfc2FtZQorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfc2FtZTxfVHAsIF9UcD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vIGNvbnN0LXZvbGF0aWxlIG1vZGlmaWNhdGlvbnMgWzQuNy4xXS4KKworICAvLy8gcmVtb3ZlX2NvbnN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2NvbnN0CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9jb25zdDxfVHAgY29uc3Q+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKyAgCisgIC8vLyByZW1vdmVfdm9sYXRpbGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfdm9sYXRpbGUKKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3ZvbGF0aWxlPF9UcCB2b2xhdGlsZT4KKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworICAKKyAgLy8vIHJlbW92ZV9jdgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9jdgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgIHJlbW92ZV9jb25zdDx0eXBlbmFtZSByZW1vdmVfdm9sYXRpbGU8X1RwPjo6dHlwZT46OnR5cGUgICAgIHR5cGU7CisgICAgfTsKKyAgCisgIC8vLyBhZGRfY29uc3QKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhZGRfY29uc3QKKyAgICB7IHR5cGVkZWYgX1RwIGNvbnN0ICAgICB0eXBlOyB9OworICAgCisgIC8vLyBhZGRfdm9sYXRpbGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhZGRfdm9sYXRpbGUKKyAgICB7IHR5cGVkZWYgX1RwIHZvbGF0aWxlICAgICB0eXBlOyB9OworICAKKyAgLy8vIGFkZF9jdgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGFkZF9jdgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgIGFkZF9jb25zdDx0eXBlbmFtZSBhZGRfdm9sYXRpbGU8X1RwPjo6dHlwZT46OnR5cGUgICAgIHR5cGU7CisgICAgfTsKKworICAvLyBhcnJheSBtb2RpZmljYXRpb25zIFs0LjcuM10uCisKKyAgLy8vIHJlbW92ZV9leHRlbnQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfZXh0ZW50CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9TaXplPgorICAgIHN0cnVjdCByZW1vdmVfZXh0ZW50PF9UcFtfU2l6ZV0+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9leHRlbnQ8X1RwW10+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICAvLy8gcmVtb3ZlX2FsbF9leHRlbnRzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2FsbF9leHRlbnRzCisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9TaXplPgorICAgIHN0cnVjdCByZW1vdmVfYWxsX2V4dGVudHM8X1RwW19TaXplXT4KKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbF9leHRlbnRzPF9UcD46OnR5cGUgICAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfYWxsX2V4dGVudHM8X1RwW10+CisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGxfZXh0ZW50czxfVHA+Ojp0eXBlICAgICB0eXBlOyB9OworCisgIC8vIHBvaW50ZXIgbW9kaWZpY2F0aW9ucyBbNC43LjRdLgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWU+CisgICAgc3RydWN0IF9fcmVtb3ZlX3BvaW50ZXJfaGVscGVyCisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfcG9pbnRlcl9oZWxwZXI8X1RwLCBfVXAqPgorICAgIHsgdHlwZWRlZiBfVXAgICAgIHR5cGU7IH07CisKKyAgLy8vIHJlbW92ZV9wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3BvaW50ZXIKKyAgICA6IHB1YmxpYyBfX3JlbW92ZV9wb2ludGVyX2hlbHBlcjxfVHAsIHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZTsKKworICAvLy8gYWRkX3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhZGRfcG9pbnRlcgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGUqICAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc19yZWZlcmVuY2UKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3JlZmVyZW5jZTxfVHAmPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19wb2QKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX3BvZChfVHApIHx8IGlzX3ZvaWQ8X1RwPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX3RyaXZpYWxfY29uc3RydWN0b3IKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19wb2Q8X1RwPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX3RyaXZpYWxfY29weQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3BvZDxfVHA+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfdHJpdmlhbF9hc3NpZ24KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19wb2Q8X1RwPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3BvZDxfVHA+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfbm90aHJvd19jb25zdHJ1Y3RvcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3BvZDxfVHA+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfbm90aHJvd19jb3B5CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfcG9kPF9UcD46OnZhbHVlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc19ub3Rocm93X2Fzc2lnbgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3BvZDxfVHA+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfc2lnbmVkX2hlbHBlcgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworICBfREVGSU5FX1NQRUMoMCwgX19pc19zaWduZWRfaGVscGVyLCBzaWduZWQgY2hhciwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfc2lnbmVkX2hlbHBlciwgc2hvcnQsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX3NpZ25lZF9oZWxwZXIsIGludCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfc2lnbmVkX2hlbHBlciwgbG9uZywgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfc2lnbmVkX2hlbHBlciwgbG9uZyBsb25nLCB0cnVlKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfc2lnbmVkCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfc2lnbmVkX2hlbHBlcjx0eXBlbmFtZQorCQkJCSAgICAgIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWUpPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc191bnNpZ25lZF9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfdW5zaWduZWRfaGVscGVyLCB1bnNpZ25lZCBjaGFyLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc191bnNpZ25lZF9oZWxwZXIsIHVuc2lnbmVkIHNob3J0LCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc191bnNpZ25lZF9oZWxwZXIsIHVuc2lnbmVkIGludCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfdW5zaWduZWRfaGVscGVyLCB1bnNpZ25lZCBsb25nLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc191bnNpZ25lZF9oZWxwZXIsIHVuc2lnbmVkIGxvbmcgbG9uZywgdHJ1ZSkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3Vuc2lnbmVkCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfdW5zaWduZWRfaGVscGVyPHR5cGVuYW1lCisJCQkJICAgICAgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CYXNlLCB0eXBlbmFtZSBfRGVyaXZlZD4KKyAgICBzdHJ1Y3QgX19pc19iYXNlX29mX2hlbHBlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2N2PF9CYXNlPjo6dHlwZSAgICBfTm9Ddl9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY3Y8X0Rlcml2ZWQ+Ojp0eXBlIF9Ob0N2X0Rlcml2ZWQ7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gKGlzX3NhbWU8X0Jhc2UsIF9EZXJpdmVkPjo6dmFsdWUKKwkJCQkgICB8fCAoX19pc19iYXNlX29mKF9CYXNlLCBfRGVyaXZlZCkKKwkJCQkgICAgICAgJiYgIWlzX3NhbWU8X05vQ3ZfQmFzZSwKKwkJCQkgICAgICAgICAgICAgICAgICAgX05vQ3ZfRGVyaXZlZD46OnZhbHVlKSk7CisgICAgfTsKKyAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Jhc2UsIHR5cGVuYW1lIF9EZXJpdmVkPgorICAgIHN0cnVjdCBpc19iYXNlX29mCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKwkJCSAgICAgICBfX2lzX2Jhc2Vfb2ZfaGVscGVyPF9CYXNlLCBfRGVyaXZlZD46Ol9fdmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8+CisgICAgc3RydWN0IF9faXNfY29udmVydGlibGVfc2ltcGxlCisgICAgOiBwdWJsaWMgX19zZmluYWVfdHlwZXMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHN0YXRpYyBfX29uZSBfX3Rlc3QoX1RvKTsKKyAgICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKKyAgICAgIHN0YXRpYyBfRnJvbSBfX21ha2VGcm9tKCk7CisgICAgCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX192YWx1ZSA9IHNpemVvZihfX3Rlc3QoX19tYWtlRnJvbSgpKSkgPT0gMTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWRkX3JlZmVyZW5jZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfaW50X29yX2NyZWYKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSBfX3JyX1RwOworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX192YWx1ZSA9IChpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZQorCQkJCSAgIHx8IChpc19pbnRlZ3JhbDxfX3JyX1RwPjo6dmFsdWUKKwkJCQkgICAgICAgJiYgaXNfY29uc3Q8X19ycl9UcD46OnZhbHVlCisJCQkJICAgICAgICYmICFpc192b2xhdGlsZTxfX3JyX1RwPjo6dmFsdWUpKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8sCisJICAgYm9vbCA9IChpc192b2lkPF9Gcm9tPjo6dmFsdWUgfHwgaXNfdm9pZDxfVG8+Ojp2YWx1ZQorCQkgICB8fCBpc19mdW5jdGlvbjxfVG8+Ojp2YWx1ZSB8fCBpc19hcnJheTxfVG8+Ojp2YWx1ZQorCQkgICAvLyBUaGlzIHNwZWNpYWwgY2FzZSBpcyBoZXJlIG9ubHkgdG8gYXZvaWQgd2FybmluZ3MuCQorCQkgICB8fCAoaXNfZmxvYXRpbmdfcG9pbnQ8dHlwZW5hbWUKKwkJICAgICAgIHJlbW92ZV9yZWZlcmVuY2U8X0Zyb20+Ojp0eXBlPjo6dmFsdWUKKwkJICAgICAgICYmIF9faXNfaW50X29yX2NyZWY8X1RvPjo6X192YWx1ZSkpPgorICAgIHN0cnVjdCBfX2lzX2NvbnZlcnRpYmxlX2hlbHBlcgorICAgIHsKKyAgICAgIC8vICJBbiBpbWFnaW5hcnkgbHZhbHVlIG9mIHR5cGUgRnJvbS4uLiIuCisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gKF9faXNfY29udmVydGlibGVfc2ltcGxlPHR5cGVuYW1lCisJCQkJICAgYWRkX3JlZmVyZW5jZTxfRnJvbT46OnR5cGUsIF9Ubz46Ol9fdmFsdWUpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9Ubz4KKyAgICBzdHJ1Y3QgX19pc19jb252ZXJ0aWJsZV9oZWxwZXI8X0Zyb20sIF9UbywgdHJ1ZT4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIF9fdmFsdWUgPSAoaXNfdm9pZDxfVG8+Ojp2YWx1ZQorCQkJCSAgIHx8IChfX2lzX2ludF9vcl9jcmVmPF9Ubz46Ol9fdmFsdWUKKwkJCQkgICAgICAgJiYgIWlzX3ZvaWQ8X0Zyb20+Ojp2YWx1ZSkpOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8+CisgICAgc3RydWN0IGlzX2NvbnZlcnRpYmxlCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKwkJCSAgICAgICBfX2lzX2NvbnZlcnRpYmxlX2hlbHBlcjxfRnJvbSwgX1RvPjo6X192YWx1ZT4KKyAgICB7IH07CisKKyAgLy8gcmVmZXJlbmNlIG1vZGlmaWNhdGlvbnMgWzQuNy4yXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlCisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9yZWZlcmVuY2U8X1RwJj4KKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIC8vIE5COiBDYXJlZnVsIHdpdGggcmVmZXJlbmNlIHRvIHZvaWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbCA9IChpc192b2lkPF9UcD46OnZhbHVlCisJCQkJIHx8IGlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSk+CisgICAgc3RydWN0IF9fYWRkX3JlZmVyZW5jZV9oZWxwZXIKKyAgICB7IHR5cGVkZWYgX1RwJiAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfcmVmZXJlbmNlX2hlbHBlcjxfVHAsIHRydWU+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGFkZF9yZWZlcmVuY2UKKyAgICA6IHB1YmxpYyBfX2FkZF9yZWZlcmVuY2VfaGVscGVyPF9UcD4KKyAgICB7IH07CisKKyAgLy8gb3RoZXIgdHJhbnNmb3JtYXRpb25zIFs0LjhdLgorICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfTGVuLCBzdGQ6OnNpemVfdCBfQWxpZ24+CisgICAgc3RydWN0IGFsaWduZWRfc3RvcmFnZQorICAgIHsgCisgICAgICB1bmlvbiB0eXBlCisgICAgICB7CisJdW5zaWduZWQgY2hhciBfX2RhdGFbX0xlbl07CisJc3RydWN0IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKChfQWxpZ24pKSkpIHsgfSBfX2FsaWduOyAKKyAgICAgIH07CisgICAgfTsKKworI3VuZGVmIF9ERUZJTkVfU1BFQ18wX0hFTFBFUgorI3VuZGVmIF9ERUZJTkVfU1BFQ18xX0hFTFBFUgorI3VuZGVmIF9ERUZJTkVfU1BFQ18yX0hFTFBFUgorI3VuZGVmIF9ERUZJTkVfU1BFQworCisgIC8vLyBAfSBncm91cCBtZXRhcHJvZ3JhbW1pbmcKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfVFlQRV9UUkFJVFMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3Vub3JkZXJlZF9tYXAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS91bm9yZGVyZWRfbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTIzNjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS91bm9yZGVyZWRfbWFwCkBAIC0wLDAgKzEsNDQgQEAKKy8vIFRSMSB1bm9yZGVyZWRfbWFwIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvdW5vcmRlcmVkX21hcAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9VTk9SREVSRURfTUFQCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9VTk9SREVSRURfTUFQIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4gLy8gZXF1YWxfdG8sIF9JZGVudGl0eSwgX1NlbGVjdDFzdAorI2luY2x1ZGUgPGJpdHMvc3RyaW5nZndkLmg+CisjaW5jbHVkZSA8dHIxL3R5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsX2hhc2guaD4KKyNpbmNsdWRlIDx0cjEvaGFzaHRhYmxlLmg+CisjaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9tYXAuaD4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9VTk9SREVSRURfTUFQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS91bm9yZGVyZWRfbWFwLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS91bm9yZGVyZWRfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3NTBkNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3Vub3JkZXJlZF9tYXAuaApAQCAtMCwwICsxLDI3OCBAQAorLy8gVFIxIHVub3JkZXJlZF9tYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS91bm9yZGVyZWRfbWFwLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvdW5vcmRlcmVkX21hcH0KKyAqLworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gTkI6IFdoZW4gd2UgZ2V0IHR5cGVkZWYgdGVtcGxhdGVzIHRoZXNlIGNsYXNzIGRlZmluaXRpb25zCisgIC8vIHdpbGwgYmUgdW5uZWNlc3NhcnkuCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X0tleT4sCisJICAgY2xhc3MgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4sCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZSA9IGZhbHNlPgorICAgIGNsYXNzIF9fdW5vcmRlcmVkX21hcAorICAgIDogcHVibGljIF9IYXNodGFibGU8X0tleSwgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4sIF9BbGxvYywKKwkJCXN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LCBfUHJlZCwKKwkJCV9IYXNoLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nLAorCQkJX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LAorCQkJX19jYWNoZV9oYXNoX2NvZGUsIGZhbHNlLCB0cnVlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0hhc2h0YWJsZTxfS2V5LCBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiwgX0FsbG9jLAorCQkJIHN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LCBfUHJlZCwKKwkJCSBfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCSBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQkgX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LAorCQkJIF9fY2FjaGVfaGFzaF9jb2RlLCBmYWxzZSwgdHJ1ZT4KKwlfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9fdW5vcmRlcmVkX21hcChzaXplX3R5cGUgX19uID0gMTAsCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcoKSwKKwkgICAgICBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwKKwkgICAgICBfX2VxbCwgc3RkOjpfU2VsZWN0MXN0PHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4oKSwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCV9fdW5vcmRlcmVkX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJCXNpemVfdHlwZSBfX24gPSAxMCwKKwkJCWNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nKCksCisJCV9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCgpLAorCQlfX2VxbCwgc3RkOjpfU2VsZWN0MXN0PHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4oKSwgX19hKQorCXsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfS2V5PiwKKwkgICBjbGFzcyBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X0tleT4sCisJICAgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiwKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlID0gZmFsc2U+CisgICAgY2xhc3MgX191bm9yZGVyZWRfbXVsdGltYXAKKyAgICA6IHB1YmxpYyBfSGFzaHRhYmxlPF9LZXksIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+LAorCQkJX0FsbG9jLAorCQkJc3RkOjpfU2VsZWN0MXN0PHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4sIF9QcmVkLAorCQkJX0hhc2gsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcsCisJCQlfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQlfX2RldGFpbDo6X1ByaW1lX3JlaGFzaF9wb2xpY3ksCisJCQlfX2NhY2hlX2hhc2hfY29kZSwgZmFsc2UsIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0hhc2h0YWJsZTxfS2V5LCBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiwKKwkJCSBfQWxsb2MsCisJCQkgc3RkOjpfU2VsZWN0MXN0PHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4sIF9QcmVkLAorCQkJIF9IYXNoLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nLAorCQkJIF9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCwKKwkJCSBfX2RldGFpbDo6X1ByaW1lX3JlaGFzaF9wb2xpY3ksCisJCQkgX19jYWNoZV9oYXNoX2NvZGUsIGZhbHNlLCBmYWxzZT4KKwlfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9fdW5vcmRlcmVkX211bHRpbWFwKHNpemVfdHlwZSBfX24gPSAxMCwKKwkJCSAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCSAgICAgIF9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCgpLAorCSAgICAgIF9fZXFsLCBzdGQ6Ol9TZWxlY3Qxc3Q8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPigpLCBfX2EpCisgICAgICB7IH0KKworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwlfX3Vub3JkZXJlZF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJCSAgICAgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSBfX24gPSAwLAorCQkJICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcoKSwKKwkJX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoKCksCisJCV9fZXFsLCBzdGQ6Ol9TZWxlY3Qxc3Q8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPigpLCBfX2EpCisJeyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jLAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGU+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9fdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwKKwkgX0FsbG9jLCBfX2NhY2hlX2hhc2hfY29kZT4mIF9feCwKKwkgX191bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLAorCSBfQWxsb2MsIF9fY2FjaGVfaGFzaF9jb2RlPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2MsCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoX191bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsCisJIF9BbGxvYywgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3gsCisJIF9fdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLAorCSBfQWxsb2MsIF9fY2FjaGVfaGFzaF9jb2RlPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgY29tcG9zZWQgb2YgdW5pcXVlIGtleXMgKGNvbnRhaW5pbmcKKyAgICogIGF0IG1vc3Qgb25lIG9mIGVhY2gga2V5IHZhbHVlKSB0aGF0IGFzc29jaWF0ZXMgdmFsdWVzIG9mIGFub3RoZXIgdHlwZQorICAgKiAgd2l0aCB0aGUga2V5cy4KKyAgICoKKyAgICogIEBpbmdyb3VwIHVub3JkZXJlZF9hc3NvY2lhdGl2ZV9jb250YWluZXJzCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGFuZAorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjeHgiPnVub3JkZXJlZCBhc3NvY2lhdGl2ZSBjb250YWluZXI8L2E+CisgICAqCisgICAqICBAcGFyYW0gIEtleSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEBwYXJhbSAgVHAgIFR5cGUgb2YgbWFwcGVkIG9iamVjdHMuCisgICAqICBAcGFyYW0gIEhhc2ggIEhhc2hpbmcgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGhhc2g8VmFsdWU+LgorICAgKiAgQHBhcmFtICBQcmVkICBQcmVkaWNhdGUgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGVxdWFsX3RvPFZhbHVlPi4KKyAgICogIEBwYXJhbSAgQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8S2V5Pi4KKyAgICoKKyAgICogVGhlIHJlc3VsdGluZyB2YWx1ZSB0eXBlIG9mIHRoZSBjb250YWluZXIgaXMgc3RkOjpwYWlyPGNvbnN0IEtleSwgVHA+LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfS2V5PiwKKwkgICBjbGFzcyBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X0tleT4sCisJICAgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX21hcAorICAgIDogcHVibGljIF9fdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX191bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+ICBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgdW5vcmRlcmVkX21hcChzaXplX3R5cGUgX19uID0gMTAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdW5vcmRlcmVkX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJICAgICAgc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisJeyB9CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBBIHN0YW5kYXJkIGNvbnRhaW5lciBjb21wb3NlZCBvZiBlcXVpdmFsZW50IGtleXMKKyAgICogIChwb3NzaWJseSBjb250YWluaW5nIG11bHRpcGxlIG9mIGVhY2gga2V5IHZhbHVlKSB0aGF0IGFzc29jaWF0ZXMKKyAgICogIHZhbHVlcyBvZiBhbm90aGVyIHR5cGUgd2l0aCB0aGUga2V5cy4KKyAgICoKKyAgICogIEBpbmdyb3VwIHVub3JkZXJlZF9hc3NvY2lhdGl2ZV9jb250YWluZXJzCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGFuZAorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjeHgiPnVub3JkZXJlZCBhc3NvY2lhdGl2ZSBjb250YWluZXI8L2E+CisgICAqCisgICAqICBAcGFyYW0gIEtleSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEBwYXJhbSAgVHAgIFR5cGUgb2YgbWFwcGVkIG9iamVjdHMuCisgICAqICBAcGFyYW0gIEhhc2ggIEhhc2hpbmcgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGhhc2g8VmFsdWU+LgorICAgKiAgQHBhcmFtICBQcmVkICBQcmVkaWNhdGUgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGVxdWFsX3RvPFZhbHVlPi4KKyAgICogIEBwYXJhbSAgQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8S2V5Pi4KKyAgICoKKyAgICogVGhlIHJlc3VsdGluZyB2YWx1ZSB0eXBlIG9mIHRoZSBjb250YWluZXIgaXMgc3RkOjpwYWlyPGNvbnN0IEtleSwgVHA+LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfS2V5PiwKKwkgICBjbGFzcyBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X0tleT4sCisJICAgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX211bHRpbWFwCisgICAgOiBwdWJsaWMgX191bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+ICBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgdW5vcmRlcmVkX211bHRpbWFwKHNpemVfdHlwZSBfX24gPSAxMCwKKwkJCSBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXVub3JkZXJlZF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJCSAgIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgX19uID0gMCwKKwkJCSAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorCXsgfQorCisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvdW5vcmRlcmVkX3NldCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3Vub3JkZXJlZF9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc2OGE2MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3Vub3JkZXJlZF9zZXQKQEAgLTAsMCArMSw0NCBAQAorLy8gVFIxIHVub3JkZXJlZF9zZXQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS91bm9yZGVyZWRfc2V0CisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1VOT1JERVJFRF9TRVQKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1VOT1JERVJFRF9TRVQgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPiAvLyBlcXVhbF90bywgX0lkZW50aXR5LCBfU2VsZWN0MXN0CisjaW5jbHVkZSA8Yml0cy9zdHJpbmdmd2QuaD4KKyNpbmNsdWRlIDx0cjEvdHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWxfaGFzaC5oPgorI2luY2x1ZGUgPHRyMS9oYXNodGFibGUuaD4KKyNpbmNsdWRlIDx0cjEvdW5vcmRlcmVkX3NldC5oPgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX1VOT1JERVJFRF9TRVQKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3Vub3JkZXJlZF9zZXQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3Vub3JkZXJlZF9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjcxMmU3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvdW5vcmRlcmVkX3NldC5oCkBAIC0wLDAgKzEsMjY3IEBACisvLyBUUjEgdW5vcmRlcmVkX3NldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3Vub3JkZXJlZF9zZXQuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS91bm9yZGVyZWRfc2V0fQorICovCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBOQjogV2hlbiB3ZSBnZXQgdHlwZWRlZiB0ZW1wbGF0ZXMgdGhlc2UgY2xhc3MgZGVmaW5pdGlvbnMKKyAgLy8gd2lsbCBiZSB1bm5lY2Vzc2FyeS4KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9WYWx1ZT4sCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZSA9IGZhbHNlPgorICAgIGNsYXNzIF9fdW5vcmRlcmVkX3NldAorICAgIDogcHVibGljIF9IYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9BbGxvYywKKwkJCXN0ZDo6X0lkZW50aXR5PF9WYWx1ZT4sIF9QcmVkLAorCQkJX0hhc2gsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcsCisJCQlfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQlfX2RldGFpbDo6X1ByaW1lX3JlaGFzaF9wb2xpY3ksCisJCQlfX2NhY2hlX2hhc2hfY29kZSwgdHJ1ZSwgdHJ1ZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9BbGxvYywKKwkJCSBzdGQ6Ol9JZGVudGl0eTxfVmFsdWU+LCBfUHJlZCwKKwkJCSBfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCSBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQkgX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LAorCQkJIF9fY2FjaGVfaGFzaF9jb2RlLCB0cnVlLCB0cnVlPgorCV9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgX191bm9yZGVyZWRfc2V0KHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCSAgICAgIF9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCgpLCBfX2VxbCwKKwkgICAgICBzdGQ6Ol9JZGVudGl0eTxfVmFsdWU+KCksIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwlfX3Vub3JkZXJlZF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQlzaXplX3R5cGUgX19uID0gMTAsCisJCQljb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCWNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCWNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCQlfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwgX19lcWwsCisJCXN0ZDo6X0lkZW50aXR5PF9WYWx1ZT4oKSwgX19hKQorCXsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9WYWx1ZT4sCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZSA9IGZhbHNlPgorICAgIGNsYXNzIF9fdW5vcmRlcmVkX211bHRpc2V0CisgICAgOiBwdWJsaWMgX0hhc2h0YWJsZTxfVmFsdWUsIF9WYWx1ZSwgX0FsbG9jLAorCQkJc3RkOjpfSWRlbnRpdHk8X1ZhbHVlPiwgX1ByZWQsCisJCQlfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCV9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCwKKwkJCV9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCV9fY2FjaGVfaGFzaF9jb2RlLCB0cnVlLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9BbGxvYywKKwkJCSBzdGQ6Ol9JZGVudGl0eTxfVmFsdWU+LCBfUHJlZCwKKwkJCSBfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCSBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQkgX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LAorCQkJIF9fY2FjaGVfaGFzaF9jb2RlLCB0cnVlLCBmYWxzZT4KKwlfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9fdW5vcmRlcmVkX211bHRpc2V0KHNpemVfdHlwZSBfX24gPSAxMCwKKwkJCSAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCSAgICAgIF9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCgpLCBfX2VxbCwKKwkgICAgICBzdGQ6Ol9JZGVudGl0eTxfVmFsdWU+KCksIF9fYSkKKyAgICAgIHsgfQorCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCV9fdW5vcmRlcmVkX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkJICAgICB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCQlfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwgX19lcWwsCisJCXN0ZDo6X0lkZW50aXR5PF9WYWx1ZT4oKSwgX19hKQorCXsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYywKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYywgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3gsCisJIF9fdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jLCBfX2NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jLAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGU+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9fdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLAorCSBfQWxsb2MsIF9fY2FjaGVfaGFzaF9jb2RlPiYgX194LAorCSBfX3Vub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwKKwkgX0FsbG9jLCBfX2NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIGNvbXBvc2VkIG9mIHVuaXF1ZSBrZXlzIChjb250YWluaW5nCisgICAqICBhdCBtb3N0IG9uZSBvZiBlYWNoIGtleSB2YWx1ZSkgaW4gd2hpY2ggdGhlIGVsZW1lbnRzJyBrZXlzIGFyZQorICAgKiAgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhbmQKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sI3h4Ij51bm9yZGVyZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPgorICAgKgorICAgKiAgQHBhcmFtICBWYWx1ZSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEBwYXJhbSAgSGFzaCAgSGFzaGluZyBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gaGFzaDxWYWx1ZT4uCisgICAqICBAcGFyYW0gIFByZWQgIFByZWRpY2F0ZSBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gZXF1YWxfdG88VmFsdWU+LgorICAgKiAgQHBhcmFtICBBbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxLZXk+LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9WYWx1ZT4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9zZXQKKyAgICA6IHB1YmxpYyBfX3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9zZXQoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXVub3JkZXJlZF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCSAgICAgIHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorCXsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgY29tcG9zZWQgb2YgZXF1aXZhbGVudCBrZXlzCisgICAqICAocG9zc2libHkgY29udGFpbmluZyBtdWx0aXBsZSBvZiBlYWNoIGtleSB2YWx1ZSkgaW4gd2hpY2ggdGhlCisgICAqICBlbGVtZW50cycga2V5cyBhcmUgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhbmQKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sI3h4Ij51bm9yZGVyZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPgorICAgKgorICAgKiAgQHBhcmFtICBWYWx1ZSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEBwYXJhbSAgSGFzaCAgSGFzaGluZyBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gaGFzaDxWYWx1ZT4uCisgICAqICBAcGFyYW0gIFByZWQgIFByZWRpY2F0ZSBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gZXF1YWxfdG88VmFsdWU+LgorICAgKiAgQHBhcmFtICBBbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxLZXk+LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9WYWx1ZT4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9tdWx0aXNldAorICAgIDogcHVibGljIF9fdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+CisgICAgeworICAgICAgdHlwZWRlZiBfX3Vub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl1bm9yZGVyZWRfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQkgICB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKwl7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS91dGlsaXR5IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvdXRpbGl0eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODJkMmQ1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvdXRpbGl0eQpAQCAtMCwwICsxLDEwOCBAQAorLy8gVFIxIHV0aWxpdHkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS91dGlsaXR5CisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1VUSUxJVFkKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1VUSUxJVFkgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3JlbG9wcy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3BhaXIuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICBjbGFzcyB0dXBsZV9zaXplOworCisgIHRlbXBsYXRlPGludCBfSW50LCBjbGFzcyBfVHA+CisgICAgY2xhc3MgdHVwbGVfZWxlbWVudDsKKworICAgLy8gVmFyaW91cyBmdW5jdGlvbnMgd2hpY2ggZ2l2ZSBzdGQ6OnBhaXIgYSB0dXBsZS1saWtlIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KKyAgICBzdHJ1Y3QgdHVwbGVfc2l6ZTxzdGQ6OnBhaXI8X1RwMSwgX1RwMj4gPgorICAgIHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDI7IH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KKyAgICBjb25zdCBpbnQKKyAgICB0dXBsZV9zaXplPHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiA+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PDAsIHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiA+CisgICAgeyB0eXBlZGVmIF9UcDEgdHlwZTsgfTsKKyAKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KKyAgICBzdHJ1Y3QgdHVwbGVfZWxlbWVudDwxLCBzdGQ6OnBhaXI8X1RwMSwgX1RwMj4gPgorICAgIHsgdHlwZWRlZiBfVHAyIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8aW50IF9JbnQ+CisgICAgc3RydWN0IF9fcGFpcl9nZXQ7CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3BhaXJfZ2V0PDA+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICAgIHN0YXRpYyBfVHAxJiBfX2dldChzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mIF9fcGFpcikKKyAgICAgIHsgcmV0dXJuIF9fcGFpci5maXJzdDsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgICAgc3RhdGljIGNvbnN0IF9UcDEmIF9fY29uc3RfZ2V0KGNvbnN0IHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgX19wYWlyKQorICAgICAgeyByZXR1cm4gX19wYWlyLmZpcnN0OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fcGFpcl9nZXQ8MT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgICAgc3RhdGljIF9UcDImIF9fZ2V0KHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgX19wYWlyKQorICAgICAgeyByZXR1cm4gX19wYWlyLnNlY29uZDsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgICAgc3RhdGljIGNvbnN0IF9UcDImIF9fY29uc3RfZ2V0KGNvbnN0IHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgX19wYWlyKQorICAgICAgeyByZXR1cm4gX19wYWlyLnNlY29uZDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8aW50IF9JbnQsIGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgaW5saW5lIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0ludCwgc3RkOjpwYWlyPF9UcDEsIF9UcDI+ID46OnR5cGUmCisgICAgZ2V0KHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgX19pbikKKyAgICB7IHJldHVybiBfX3BhaXJfZ2V0PF9JbnQ+OjpfX2dldChfX2luKTsgfQorCisgIHRlbXBsYXRlPGludCBfSW50LCBjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICAgIGlubGluZSBjb25zdCB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JbnQsIHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiA+Ojp0eXBlJgorICAgIGdldChjb25zdCBzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mIF9faW4pCisgICAgeyByZXR1cm4gX19wYWlyX2dldDxfSW50Pjo6X19jb25zdF9nZXQoX19pbik7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfVVRJTElUWQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvd2NoYXIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3djaGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxNmE4NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3djaGFyLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIHdjaGFyLmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS93Y2hhci5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1dDSEFSX0gKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1dDSEFSX0ggMQorCisjaW5jbHVkZSA8dHIxL2N3Y2hhcj4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9XQ0hBUl9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS93Y3R5cGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3djdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNjhhMTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS93Y3R5cGUuaApAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgd2N0eXBlLmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS93Y3R5cGUuaAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9XQ1RZUEVfSAorI2RlZmluZSBfR0xJQkNYWF9UUjFfV0NUWVBFX0ggMQorCisjaW5jbHVkZSA8dHIxL2N3Y3R5cGU+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfV0NUWVBFX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIyL2Jvb2xfc2V0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjIvYm9vbF9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhNTZlMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIyL2Jvb2xfc2V0CkBAIC0wLDAgKzEsMzIwIEBACisvLyBUUjIgPGJvb2xfc2V0PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIyL2Jvb2xfc2V0CisgKiAgVGhpcyBpcyBhIFRSMiBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjJfQk9PTF9TRVQKKyNkZWZpbmUgX0dMSUJDWFhfVFIyX0JPT0xfU0VUIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8dHlwZWluZm8+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMgoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIGJvb2xfc2V0CisgICAqCisgICAqICBTZWUgTjIxMzYsIEJvb2xfc2V0OiBtdWx0aS12YWx1ZWQgbG9naWMKKyAgICogIGJ5IEhlcnbpIEJy9m5uaW1hbm4sIEd1aWxsYXVtZSBNZWxxdWlvbmQsIFN5bHZhaW4gUGlvbi4KKyAgICoKKyAgICogIFRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIGJvb2wgaXMgc2xpcHBlcnkhICBJIG1heSB1c2UgdGhlIG5ldworICAgKiAgZXhwbGljaXQgY29udmVyc2lvbi4gIFRoaXMgaGFzIGJlZW4gc3BlY2lhbGl6ZWQgaW4gdGhlIGxhbmd1YWdlCisgICAqICBzbyB0aGF0IGluIGNvbnRleHRzIHJlcXVpcmluZyBhIGJvb2wgdGhlIGNvbnZlcnNpb24gaGFwcGVucworICAgKiAgaW1wbGljaXRseS4gIFRodXMgbW9zdCBvYmplY3Rpb25zIHNob3VsZCBiZSBlbGltaW5hdGVkLgorICAgKi8KKyAgY2xhc3MgYm9vbF9zZXQKKyAgeworICBwdWJsaWM6CisKKyAgICAvLy8gIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgY29uc3RleHByIGJvb2xfc2V0KCkgOiBfTV9iKF9TX2ZhbHNlKSB7IH0KKworICAgIC8vLyAgQ29uc3RydWN0b3IgZnJvbSBib29sLgorICAgIGNvbnN0ZXhwciBib29sX3NldChib29sIF9fdCkgOiBfTV9iKF9Cb29sX3NldF92YWwoX190KSkgeyB9CisKKyAgICAvLyBJJ20gbm90IHN1cmUgYWJvdXQgdGhpcy4KKyAgICBib29sIGNvbnRhaW5zKGJvb2xfc2V0IF9fYikgY29uc3QKKyAgICB7IHJldHVybiB0aGlzLT5pc19zaW5nbGV0b24oKSAmJiB0aGlzLT5lcXVhbHMoX19iKTsgfQorCisgICAgLy8vICBSZXR1cm4gdHJ1ZSBpZiBzdGF0ZXMgYXJlIGVxdWFsLgorICAgIGJvb2wgZXF1YWxzKGJvb2xfc2V0IF9fYikgY29uc3QKKyAgICB7IHJldHVybiBfX2IuX01fYiA9PSBfTV9iOyB9CisKKyAgICAvLy8gIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgZW1wdHkuCisgICAgYm9vbCBpc19lbXB0eXNldCgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fYiA9PSBfU19lbXB0eTsgfQorCisgICAgLy8vICBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGluZGV0ZXJtaW5hdGUuCisgICAgYm9vbCBpc19pbmRldGVybWluYXRlKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9iID09IF9TX2luZGV0OyB9CisKKyAgICAvLy8gIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgZmFsc2Ugb3IgdHJ1ZSAobm9ybWFsIGJvb2xlYW4pLgorICAgIGJvb2wgaXNfc2luZ2xldG9uKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9iID09IF9TX2ZhbHNlIHx8IF9NX2IgPT0gX1NfdHJ1ZV87IH0KKworICAgIC8vLyAgQ29udmVyc2lvbiB0byBib29sLgorICAgIC8vZXhwbGljaXQKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QKKyAgICB7CisgICAgICBpZiAoISBpc19zaW5nbGV0b24oKSkKKwl0aHJvdyBzdGQ6OmJhZF9jYXN0KCk7CisgICAgICByZXR1cm4gX01fYjsKKyAgICB9CisKKyAgICAvLy8KKyAgICBzdGF0aWMgYm9vbF9zZXQgaW5kZXRlcm1pbmF0ZSgpCisgICAgeworICAgICAgYm9vbF9zZXQgX19iOworICAgICAgX19iLl9NX2IgPSBfU19pbmRldDsKKyAgICAgIHJldHVybiBfX2I7CisgICAgfQorCisgICAgLy8vCisgICAgc3RhdGljIGJvb2xfc2V0IGVtcHR5c2V0KCkKKyAgICB7CisgICAgICBib29sX3NldCBfX2I7CisgICAgICBfX2IuX01fYiA9IF9TX2VtcHR5OworICAgICAgcmV0dXJuIF9fYjsKKyAgICB9CisKKyAgICBmcmllbmQgYm9vbF9zZXQKKyAgICBvcGVyYXRvciEoYm9vbF9zZXQgX19iKQorICAgIHsgcmV0dXJuIF9fYi5fTV9ub3QoKTsgfQorCisgICAgZnJpZW5kIGJvb2xfc2V0CisgICAgb3BlcmF0b3JeKGJvb2xfc2V0IF9fcywgYm9vbF9zZXQgX190KQorICAgIHsgcmV0dXJuIF9fcy5fTV94b3IoX190KTsgfQorCisgICAgZnJpZW5kIGJvb2xfc2V0CisgICAgb3BlcmF0b3J8KGJvb2xfc2V0IF9fcywgYm9vbF9zZXQgX190KQorICAgIHsgcmV0dXJuIF9fcy5fTV9vcihfX3QpOyB9CisKKyAgICBmcmllbmQgYm9vbF9zZXQKKyAgICBvcGVyYXRvciYoYm9vbF9zZXQgX19zLCBib29sX3NldCBfX3QpCisgICAgeyByZXR1cm4gX19zLl9NX2FuZChfX3QpOyB9CisKKyAgICBmcmllbmQgYm9vbF9zZXQKKyAgICBvcGVyYXRvcj09KGJvb2xfc2V0IF9fcywgYm9vbF9zZXQgX190KQorICAgIHsgcmV0dXJuIF9fcy5fTV9lcShfX3QpOyB9CisKKworICAgIC8vICBUaGVzZSBvdmVybG9hZHMgcmVwbGFjZSB0aGUgZmFjZXQgYWRkaXRpb25zIGluIHRoZSBwYXBlciEKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENoYXJULCB0eXBlbmFtZSBUcmFpdHM+CisgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPENoYXJULCBUcmFpdHM+JgorICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08Q2hhclQsIFRyYWl0cz4mIF9fb3V0LCBib29sX3NldCBfX2IpCisgICAgICB7CisJaW50IF9fYSA9IF9fYi5fTV9iOworCV9fb3V0IDw8IF9fYTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENoYXJULCB0eXBlbmFtZSBUcmFpdHM+CisgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPENoYXJULCBUcmFpdHM+JgorICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08Q2hhclQsIFRyYWl0cz4mIF9faW4sIGJvb2xfc2V0JiBfX2IpCisgICAgICB7CisJbG9uZyBfX2M7CisJX19pbiA+PiBfX2M7CisJaWYgKF9fYyA+PSBfU19mYWxzZSAmJiBfX2MgPCBfU19lbXB0eSkKKwkgIF9fYi5fTV9iID0gc3RhdGljX2Nhc3Q8X0Jvb2xfc2V0X3ZhbD4oX19jKTsKKyAgICAgIH0KKworICBwcml2YXRlOgorCisgICAgLy8vCisgICAgZW51bSBfQm9vbF9zZXRfdmFsOiB1bnNpZ25lZCBjaGFyCisgICAgeworICAgICAgX1NfZmFsc2UgPSAwLAorICAgICAgX1NfdHJ1ZV8gPSAxLAorICAgICAgX1NfaW5kZXQgPSAyLAorICAgICAgX1NfZW1wdHkgPSAzCisgICAgfTsKKworICAgIC8vLyAgQm9vbCBzZXQgc3RhdGUuCisgICAgX0Jvb2xfc2V0X3ZhbCBfTV9iOworCisgICAgLy8vCisgICAgYm9vbF9zZXQoX0Jvb2xfc2V0X3ZhbCBfX2MpIDogX01fYihfX2MpIHsgfQorCisgICAgLy8vCisgICAgYm9vbF9zZXQgX01fbm90KCkgY29uc3QKKyAgICB7IHJldHVybiBfU19ub3RbdGhpcy0+X01fYl07IH0KKworICAgIC8vLworICAgIGJvb2xfc2V0IF9NX3hvcihib29sX3NldCBfX2IpIGNvbnN0CisgICAgeyByZXR1cm4gX1NfeG9yW3RoaXMtPl9NX2JdW19fYi5fTV9iXTsgfQorCisgICAgLy8vCisgICAgYm9vbF9zZXQgX01fb3IoYm9vbF9zZXQgX19iKSBjb25zdAorICAgIHsgcmV0dXJuIF9TX29yW3RoaXMtPl9NX2JdW19fYi5fTV9iXTsgfQorCisgICAgLy8vCisgICAgYm9vbF9zZXQgX01fYW5kKGJvb2xfc2V0IF9fYikgY29uc3QKKyAgICB7IHJldHVybiBfU19hbmRbdGhpcy0+X01fYl1bX19iLl9NX2JdOyB9CisKKyAgICAvLy8KKyAgICBib29sX3NldCBfTV9lcShib29sX3NldCBfX2IpIGNvbnN0CisgICAgeyByZXR1cm4gX1NfZXFbdGhpcy0+X01fYl1bX19iLl9NX2JdOyB9CisKKyAgICAvLy8KKyAgICBzdGF0aWMgX0Jvb2xfc2V0X3ZhbCBfU19ub3RbNF07CisKKyAgICAvLy8KKyAgICBzdGF0aWMgX0Jvb2xfc2V0X3ZhbCBfU194b3JbNF1bNF07CisKKyAgICAvLy8KKyAgICBzdGF0aWMgX0Jvb2xfc2V0X3ZhbCBfU19vcls0XVs0XTsKKworICAgIC8vLworICAgIHN0YXRpYyBfQm9vbF9zZXRfdmFsIF9TX2FuZFs0XVs0XTsKKworICAgIC8vLworICAgIHN0YXRpYyBfQm9vbF9zZXRfdmFsIF9TX2VxWzRdWzRdOworICB9OworCisgIC8vICAyMC4yLjMuMiBib29sX3NldCB2YWx1ZXMKKworICBpbmxpbmUgYm9vbAorICBjb250YWlucyhib29sX3NldCBfX3MsIGJvb2xfc2V0IF9fdCkKKyAgeyByZXR1cm4gX19zLmNvbnRhaW5zKF9fdCk7IH0KKworICBpbmxpbmUgYm9vbAorICBlcXVhbHMoYm9vbF9zZXQgX19zLCBib29sX3NldCBfX3QpCisgIHsgcmV0dXJuIF9fcy5lcXVhbHMoX190KTsgfQorCisgIGlubGluZSBib29sCisgIGlzX2VtcHR5c2V0KGJvb2xfc2V0IF9fYikKKyAgeyByZXR1cm4gX19iLmlzX2VtcHR5c2V0KCk7IH0KKworICBpbmxpbmUgYm9vbAorICBpc19pbmRldGVybWluYXRlKGJvb2xfc2V0IF9fYikKKyAgeyByZXR1cm4gX19iLmlzX2luZGV0ZXJtaW5hdGUoKTsgfQorCisgIGlubGluZSBib29sCisgIGlzX3NpbmdsZXRvbihib29sX3NldCBfX2IpCisgIHsgcmV0dXJuIF9fYi5pc19zaW5nbGV0b24oKTsgfQorCisgIGlubGluZSBib29sCisgIGNlcnRhaW5seShib29sX3NldCBfX2IpCisgIHsgcmV0dXJuICEgX19iLmNvbnRhaW5zKGZhbHNlKTsgfQorCisgIGlubGluZSBib29sCisgIHBvc3NpYmx5KGJvb2xfc2V0IF9fYikKKyAgeyByZXR1cm4gX19iLmNvbnRhaW5zKHRydWUpOyB9CisKKworICAvLyAgMjAuMi4zLjMgYm9vbF9zZXQgc2V0IG9wZXJhdGlvbnMKKworICBpbmxpbmUgYm9vbF9zZXQKKyAgc2V0X3VuaW9uKGJvb2wgX19zLCBib29sX3NldCBfX3QpCisgIHsgcmV0dXJuIGJvb2xfc2V0KF9fcykgfCBfX3Q7IH0KKworICBpbmxpbmUgYm9vbF9zZXQKKyAgc2V0X3VuaW9uKGJvb2xfc2V0IF9fcywgYm9vbCBfX3QpCisgIHsgcmV0dXJuIF9fcyB8IGJvb2xfc2V0KF9fdCk7IH0KKworICBpbmxpbmUgYm9vbF9zZXQKKyAgc2V0X3VuaW9uKGJvb2xfc2V0IF9fcywgYm9vbF9zZXQgX190KQorICB7IHJldHVybiBfX3MgfCBfX3Q7IH0KKworICBpbmxpbmUgYm9vbF9zZXQKKyAgc2V0X2ludGVyc2VjdGlvbihib29sIF9fcywgYm9vbF9zZXQgX190KQorICB7IHJldHVybiBib29sX3NldChfX3MpICYgX190OyB9CisKKyAgaW5saW5lIGJvb2xfc2V0CisgIHNldF9pbnRlcnNlY3Rpb24oYm9vbF9zZXQgX19zLCBib29sIF9fdCkKKyAgeyByZXR1cm4gX19zICYgYm9vbF9zZXQoX190KTsgfQorCisgIGlubGluZSBib29sX3NldAorICBzZXRfaW50ZXJzZWN0aW9uKGJvb2xfc2V0IF9fcywgYm9vbF9zZXQgX190KQorICB7IHJldHVybiBfX3MgJiBfX3Q7IH0KKworICBpbmxpbmUgYm9vbF9zZXQKKyAgc2V0X2NvbXBsZW1lbnQoYm9vbF9zZXQgX19iKQorICB7IHJldHVybiAhIF9fYjsgfQorCisKKyAgLy8gIDIwLjIuMy40IGJvb2xfc2V0IGxvZ2ljYWwgb3BlcmF0b3JzCisKKyAgaW5saW5lIGJvb2xfc2V0CisgIG9wZXJhdG9yXihib29sIF9fcywgYm9vbF9zZXQgX190KQorICB7IHJldHVybiBib29sX3NldChfX3MpIF4gX190OyB9CisKKyAgaW5saW5lIGJvb2xfc2V0CisgIG9wZXJhdG9yXihib29sX3NldCBfX3MsIGJvb2wgX190KQorICB7IHJldHVybiBfX3MgXiBib29sX3NldChfX3QpOyB9CisKKyAgaW5saW5lIGJvb2xfc2V0CisgIG9wZXJhdG9yfChib29sIF9fcywgYm9vbF9zZXQgX190KQorICB7IHJldHVybiBib29sX3NldChfX3MpIHwgX190OyB9CisKKyAgaW5saW5lIGJvb2xfc2V0CisgIG9wZXJhdG9yfChib29sX3NldCBfX3MsIGJvb2wgX190KQorICB7IHJldHVybiBfX3MgfCBib29sX3NldChfX3QpOyB9CisKKyAgaW5saW5lIGJvb2xfc2V0CisgIG9wZXJhdG9yJihib29sIF9fcywgYm9vbF9zZXQgX190KQorICB7IHJldHVybiBib29sX3NldChfX3MpICYgX190OyB9CisKKyAgaW5saW5lIGJvb2xfc2V0CisgIG9wZXJhdG9yJihib29sX3NldCBfX3MsIGJvb2wgX190KQorICB7IHJldHVybiBfX3MgJiBib29sX3NldChfX3QpOyB9CisKKworICAvLyAgMjAuMi4zLjUgYm9vbF9zZXQgcmVsYXRpb25hbCBvcGVyYXRvcnMKKworICBpbmxpbmUgYm9vbF9zZXQKKyAgb3BlcmF0b3I9PShib29sIF9fcywgYm9vbF9zZXQgX190KQorICB7IHJldHVybiBib29sX3NldChfX3MpID09IF9fdDsgfQorCisgIGlubGluZSBib29sX3NldAorICBvcGVyYXRvcj09KGJvb2xfc2V0IF9fcywgYm9vbCBfX3QpCisgIHsgcmV0dXJuIF9fcyA9PSBib29sX3NldChfX3QpOyB9CisKKyAgaW5saW5lIGJvb2xfc2V0CisgIG9wZXJhdG9yIT0oYm9vbCBfX3MsIGJvb2xfc2V0IF9fdCkKKyAgeyByZXR1cm4gISAoX19zID09IF9fdCk7IH0KKworICBpbmxpbmUgYm9vbF9zZXQKKyAgb3BlcmF0b3IhPShib29sX3NldCBfX3MsIGJvb2wgX190KQorICB7IHJldHVybiAhIChfX3MgPT0gX190KTsgfQorCisgIGlubGluZSBib29sX3NldAorICBvcGVyYXRvciE9KGJvb2xfc2V0IF9fcywgYm9vbF9zZXQgX190KQorICB7IHJldHVybiAhIChfX3MgPT0gX190KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KKworI2luY2x1ZGUgPHRyMi9ib29sX3NldC50Y2M+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjJfQk9PTF9TRVQKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIyL2Jvb2xfc2V0LnRjYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIyL2Jvb2xfc2V0LnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDg4N2NjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjIvYm9vbF9zZXQudGNjCkBAIC0wLDAgKzEsMjc3IEBACisvLyBUUjIgPGJvb2xfc2V0PiBzdXBwb3J0IGZpbGVzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjIvYm9vbF9zZXQudGNjCisgKiAgVGhpcyBpcyBhIFRSMiBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjJfQk9PTF9TRVRfVENDCisjZGVmaW5lIF9HTElCQ1hYX1RSMl9CT09MX1NFVF9UQ0MgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMgoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICBib29sX3NldDo6X0Jvb2xfc2V0X3ZhbAorICBib29sX3NldDo6X1Nfbm90WzRdID0KKyAgeyBfU190cnVlXywgX1NfZmFsc2UsIF9TX2luZGV0LCBfU19lbXB0eSB9OworCisgIGJvb2xfc2V0OjpfQm9vbF9zZXRfdmFsCisgIGJvb2xfc2V0OjpfU194b3JbNF1bNF0gPQorICB7IHsgX1NfZmFsc2UsIF9TX3RydWVfLCBfU19pbmRldCwgX1NfZW1wdHkgfSwKKyAgICB7IF9TX3RydWVfLCBfU19mYWxzZSwgX1NfaW5kZXQsIF9TX2VtcHR5IH0sCisgICAgeyBfU19pbmRldCwgX1NfaW5kZXQsIF9TX2luZGV0LCBfU19lbXB0eSB9LAorICAgIHsgX1NfZW1wdHksIF9TX2VtcHR5LCBfU19lbXB0eSwgX1NfZW1wdHkgfSB9OworCisgIGJvb2xfc2V0OjpfQm9vbF9zZXRfdmFsCisgIGJvb2xfc2V0OjpfU19vcls0XVs0XSA9CisgIHsgeyBfU19mYWxzZSwgX1NfdHJ1ZV8sIF9TX2luZGV0LCBfU19lbXB0eSB9LAorICAgIHsgX1NfdHJ1ZV8sIF9TX3RydWVfLCBfU190cnVlXywgX1NfZW1wdHkgfSwKKyAgICB7IF9TX2luZGV0LCBfU190cnVlXywgX1NfaW5kZXQsIF9TX2VtcHR5IH0sCisgICAgeyBfU19lbXB0eSwgX1NfZW1wdHksIF9TX2VtcHR5LCBfU19lbXB0eSB9IH07CisKKyAgYm9vbF9zZXQ6Ol9Cb29sX3NldF92YWwKKyAgYm9vbF9zZXQ6Ol9TX2FuZFs0XVs0XSA9CisgIHsgeyBfU19mYWxzZSwgX1NfZmFsc2UsIF9TX2ZhbHNlLCBfU19lbXB0eSB9LAorICAgIHsgX1NfZmFsc2UsIF9TX3RydWVfLCBfU19pbmRldCwgX1NfZW1wdHkgfSwKKyAgICB7IF9TX2ZhbHNlLCBfU19pbmRldCwgX1NfaW5kZXQsIF9TX2VtcHR5IH0sCisgICAgeyBfU19lbXB0eSwgX1NfZW1wdHksIF9TX2VtcHR5LCBfU19lbXB0eSB9IH07CisKKyAgYm9vbF9zZXQ6Ol9Cb29sX3NldF92YWwKKyAgYm9vbF9zZXQ6Ol9TX2VxWzRdWzRdID0KKyAgeyB7IF9TX3RydWVfLCBfU19mYWxzZSwgX1NfaW5kZXQsIF9TX2VtcHR5IH0sCisgICAgeyBfU19mYWxzZSwgX1NfdHJ1ZV8sIF9TX2luZGV0LCBfU19lbXB0eSB9LAorICAgIHsgX1NfaW5kZXQsIF9TX2luZGV0LCBfU19pbmRldCwgX1NfZW1wdHkgfSwKKyAgICB7IF9TX2VtcHR5LCBfU19lbXB0eSwgX1NfZW1wdHksIF9TX2VtcHR5IH0gfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKy8vICBJIG9iamVjdCB0byB0aGVzZSB0aGluZ3MuCisvLyAgVGhlIHN0dWZmIGluIGxvY2FsZSBmYWNldHMgYXJlIGZvciBiYXNpYyB0eXBlcy4KKy8vICBJIHRoaW5rIHdlIGNvdWxkIGhhY2sgb3BlcmF0b3I8PCBhbmQgb3BlcmF0b3I+Pi4KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOdW1lcmljIHBhcnNpbmcuCisgICAgICAgKgorICAgICAgICogIFBhcnNlcyB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIGJvb2wgQGEgdi4gIEl0IGRvZXMgc28gYnkgY2FsbGluZworICAgICAgICogIG51bV9nZXQ6OmRvX2dldCgpLgorICAgICAgICoKKyAgICAgICAqICBJZiBpb3NfYmFzZTo6Ym9vbGFscGhhIGlzIHNldCwgYXR0ZW1wdHMgdG8gcmVhZAorICAgICAgICogIGN0eXBlPENoYXJUPjo6dHJ1ZW5hbWUoKSBvciBjdHlwZTxDaGFyVD46OmZhbHNlbmFtZSgpLiAgU2V0cworICAgICAgICogIEBhIHYgdG8gdHJ1ZSBvciBmYWxzZSBpZiBzdWNjZXNzZnVsLiAgU2V0cyBlcnIgdG8KKyAgICAgICAqICBpb3NfYmFzZTo6ZmFpbGJpdCBpZiByZWFkaW5nIHRoZSBzdHJpbmcgZmFpbHMuICBTZXRzIGVyciB0bworICAgICAgICogIGlvc19iYXNlOjplb2ZiaXQgaWYgdGhlIHN0cmVhbSBpcyBlbXB0aWVkLgorICAgICAgICoKKyAgICAgICAqICBJZiBpb3NfYmFzZTo6Ym9vbGFscGhhIGlzIG5vdCBzZXQsIHByb2NlZWRzIGFzIHdpdGggcmVhZGluZyBhIGxvbmcsCisgICAgICAgKiAgZXhjZXB0IGlmIHRoZSB2YWx1ZSBpcyAxLCBzZXRzIEBhIHYgdG8gdHJ1ZSwgaWYgdGhlIHZhbHVlIGlzIDAsIHNldHMKKyAgICAgICAqICBAYSB2IHRvIGZhbHNlLCBhbmQgb3RoZXJ3aXNlIHNldCBlcnIgdG8gaW9zX2Jhc2U6OmZhaWxiaXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgaW4gIFN0YXJ0IG9mIGlucHV0IHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIGVuZCAgRW5kIG9mIGlucHV0IHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIGlvICBTb3VyY2Ugb2YgbG9jYWxlIGFuZCBmbGFncy4KKyAgICAgICAqICBAcGFyYW0gIGVyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgdiAgVmFsdWUgdG8gZm9ybWF0IGFuZCBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgcmVhZGluZy4KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX2luLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBib29sJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisgICAgICAgKi8KKy8qCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgYm9vbF9zZXQmIF9fdikgY29uc3QKKyAgICB7CisgICAgICBpZiAoIShfX2lvLmZsYWdzKCkgJiBpb3NfYmFzZTo6Ym9vbGFscGhhKSkKKwl7CisJICAvLyBQYXJzZSBib29sIHZhbHVlcyBhcyBsb25nLgorCSAgLy8gTkI6IFdlIGNhbid0IGp1c3QgY2FsbCBkb19nZXQobG9uZykgaGVyZSwgYXMgaXQgbWlnaHQKKwkgIC8vIHJlZmVyIHRvIGEgZGVyaXZlZCBjbGFzcy4KKwkgIGxvbmcgX19sID0gLTE7CisJICBfX2JlZyA9IF9NX2V4dHJhY3RfaW50KF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fbCk7CisJICBpZiAoX19jID49IF9TX2ZhbHNlICYmIF9fYyA8IF9TX2VtcHR5KQorCSAgICBfX2IuX01fYiA9IHN0YXRpY19jYXN0PF9Cb29sX3NldF92YWw+KF9fYyk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvLyBXaGF0IHNob3VsZCB3ZSBkbyBoZXJlPworCSAgICAgIF9fdiA9IHRydWU7CisJICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgICAgICBpZiAoX19iZWcgPT0gX19lbmQpCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLy8gUGFyc2UgYm9vbCB2YWx1ZXMgYXMgYWxwaGFudW1lcmljLgorCSAgdHlwZWRlZiBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4gIF9fY2FjaGVfdHlwZTsKKwkgIF9fdXNlX2NhY2hlPF9fY2FjaGVfdHlwZT4gX191YzsKKwkgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCSAgY29uc3QgX19jYWNoZV90eXBlKiBfX2xjID0gX191YyhfX2xvYyk7CisKKwkgIGJvb2wgX190ZXN0ZiA9IHRydWU7CisJICBib29sIF9fdGVzdHQgPSB0cnVlOworCSAgYm9vbCBfX2RvbmVmID0gX19sYy0+X01fZmFsc2VuYW1lX3NpemUgPT0gMDsKKwkgIGJvb2wgX19kb25ldCA9IF9fbGMtPl9NX3RydWVuYW1lX3NpemUgPT0gMDsKKwkgIGJvb2wgX190ZXN0ZW9mID0gZmFsc2U7CisJICBzaXplX3QgX19uID0gMDsKKwkgIHdoaWxlICghX19kb25lZiB8fCAhX19kb25ldCkKKwkgICAgeworCSAgICAgIGlmIChfX2JlZyA9PSBfX2VuZCkKKwkJeworCQkgIF9fdGVzdGVvZiA9IHRydWU7CisJCSAgYnJlYWs7CisJCX0KKworCSAgICAgIGNvbnN0IGNoYXJfdHlwZSBfX2MgPSAqX19iZWc7CisKKwkgICAgICBpZiAoIV9fZG9uZWYpCisJCV9fdGVzdGYgPSBfX2MgPT0gX19sYy0+X01fZmFsc2VuYW1lW19fbl07CisKKwkgICAgICBpZiAoIV9fdGVzdGYgJiYgX19kb25ldCkKKwkJYnJlYWs7CisKKwkgICAgICBpZiAoIV9fZG9uZXQpCisJCV9fdGVzdHQgPSBfX2MgPT0gX19sYy0+X01fdHJ1ZW5hbWVbX19uXTsKKworCSAgICAgIGlmICghX190ZXN0dCAmJiBfX2RvbmVmKQorCQlicmVhazsKKworCSAgICAgIGlmICghX190ZXN0dCAmJiAhX190ZXN0ZikKKwkJYnJlYWs7CisKKwkgICAgICArK19fbjsKKwkgICAgICArK19fYmVnOworCisJICAgICAgX19kb25lZiA9ICFfX3Rlc3RmIHx8IF9fbiA+PSBfX2xjLT5fTV9mYWxzZW5hbWVfc2l6ZTsKKwkgICAgICBfX2RvbmV0ID0gIV9fdGVzdHQgfHwgX19uID49IF9fbGMtPl9NX3RydWVuYW1lX3NpemU7CisJICAgIH0KKwkgIGlmIChfX3Rlc3RmICYmIF9fbiA9PSBfX2xjLT5fTV9mYWxzZW5hbWVfc2l6ZSAmJiBfX24pCisJICAgIHsKKwkgICAgICBfX3YgPSBmYWxzZTsKKwkgICAgICBpZiAoX190ZXN0dCAmJiBfX24gPT0gX19sYy0+X01fdHJ1ZW5hbWVfc2l6ZSkKKwkJX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgICAgICBlbHNlCisJCV9fZXJyID0gX190ZXN0ZW9mID8gaW9zX2Jhc2U6OmVvZmJpdCA6IGlvc19iYXNlOjpnb29kYml0OworCSAgICB9CisJICBlbHNlIGlmIChfX3Rlc3R0ICYmIF9fbiA9PSBfX2xjLT5fTV90cnVlbmFtZV9zaXplICYmIF9fbikKKwkgICAgeworCSAgICAgIF9fdiA9IHRydWU7CisJICAgICAgX19lcnIgPSBfX3Rlc3Rlb2YgPyBpb3NfYmFzZTo6ZW9mYml0IDogaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgICAgICAvLyAyMy4gTnVtX2dldCBvdmVyZmxvdyByZXN1bHQuCisJICAgICAgX192ID0gZmFsc2U7CisJICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgICAgICBpZiAoX190ZXN0ZW9mKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKyovCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTnVtZXJpYyBmb3JtYXR0aW5nLgorICAgICAgICoKKyAgICAgICAqICBGb3JtYXRzIHRoZSBib29sZWFuIEBhIHYgYW5kIGluc2VydHMgaXQgaW50byBhIHN0cmVhbS4gIEl0IGRvZXMgc28KKyAgICAgICAqICBieSBjYWxsaW5nIG51bV9wdXQ6OmRvX3B1dCgpLgorICAgICAgICoKKyAgICAgICAqICBJZiBpb3NfYmFzZTo6Ym9vbGFscGhhIGlzIHNldCwgd3JpdGVzIGN0eXBlPENoYXJUPjo6dHJ1ZW5hbWUoKSBvcgorICAgICAgICogIGN0eXBlPENoYXJUPjo6ZmFsc2VuYW1lKCkuICBPdGhlcndpc2UgZm9ybWF0cyBAYSB2IGFzIGFuIGludC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBzICBTdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICAgKiAgQHBhcmFtICBpbyAgU291cmNlIG9mIGxvY2FsZSBhbmQgZmxhZ3MuCisgICAgICAgKiAgQHBhcmFtICBmaWxsICBDaGFyX3R5cGUgdG8gdXNlIGZvciBmaWxsaW5nLgorICAgICAgICogIEBwYXJhbSAgdiAgVmFsdWUgdG8gZm9ybWF0IGFuZCBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsIGJvb2wgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdik7IH0KKyAgICAgICAqLworCisvKgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIF9PdXRJdGVyCisgICAgbnVtX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLCBib29sX3NldCBfX3YpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lvLmZsYWdzKCk7CisgICAgICBpZiAoKF9fZmxhZ3MgJiBpb3NfYmFzZTo6Ym9vbGFscGhhKSA9PSAwKQorCXsKKwkgIGNvbnN0IGxvbmcgX19sID0gX192OworCSAgX19zID0gX01faW5zZXJ0X2ludChfX3MsIF9faW8sIF9fZmlsbCwgX19sKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdHlwZWRlZiBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4gX19jYWNoZV90eXBlOworCSAgX191c2VfY2FjaGU8X19jYWNoZV90eXBlPiBfX3VjOworCSAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisJICBjb25zdCBfX2NhY2hlX3R5cGUqIF9fbGMgPSBfX3VjKF9fbG9jKTsKKworCSAgY29uc3QgX0NoYXJUKiBfX25hbWUgPSBfX3YgPyBfX2xjLT5fTV90cnVlbmFtZQorCQkJCSAgICAgOiBfX2xjLT5fTV9mYWxzZW5hbWU7CisJICBpbnQgX19sZW4gPSBfX3YgPyBfX2xjLT5fTV90cnVlbmFtZV9zaXplCisJCQkgIDogX19sYy0+X01fZmFsc2VuYW1lX3NpemU7CisKKwkgIGNvbnN0IHN0cmVhbXNpemUgX193ID0gX19pby53aWR0aCgpOworCSAgaWYgKF9fdyA+IHN0YXRpY19jYXN0PHN0cmVhbXNpemU+KF9fbGVuKSkKKwkgICAgeworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19wbGVuID0gX193IC0gX19sZW47CisJICAgICAgX0NoYXJUKiBfX3BzCisJCT0gc3RhdGljX2Nhc3Q8X0NoYXJUKj4oX19idWlsdGluX2FsbG9jYShzaXplb2YoX0NoYXJUKQorCQkJCQkJCSogX19wbGVuKSk7CisKKwkgICAgICBjaGFyX3RyYWl0czxfQ2hhclQ+Ojphc3NpZ24oX19wcywgX19wbGVuLCBfX2ZpbGwpOworCSAgICAgIF9faW8ud2lkdGgoMCk7CisKKwkgICAgICBpZiAoKF9fZmxhZ3MgJiBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpID09IGlvc19iYXNlOjpsZWZ0KQorCQl7CisJCSAgX19zID0gc3RkOjpfX3dyaXRlKF9fcywgX19uYW1lLCBfX2xlbik7CisJCSAgX19zID0gc3RkOjpfX3dyaXRlKF9fcywgX19wcywgX19wbGVuKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fcHMsIF9fcGxlbik7CisJCSAgX19zID0gc3RkOjpfX3dyaXRlKF9fcywgX19uYW1lLCBfX2xlbik7CisJCX0KKwkgICAgICByZXR1cm4gX19zOworCSAgICB9CisJICBfX2lvLndpZHRoKDApOworCSAgX19zID0gc3RkOjpfX3dyaXRlKF9fcywgX19uYW1lLCBfX2xlbik7CisJfQorICAgICAgcmV0dXJuIF9fczsKKyAgICB9CisqLworCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIyX0JPT0xfU0VUX1RDQwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjIvZHluYW1pY19iaXRzZXQgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMi9keW5hbWljX2JpdHNldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmU5ZGMyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjIvZHluYW1pY19iaXRzZXQKQEAgLTAsMCArMSwxNDcyIEBACisvLyBUUjIgPGR5bmFtaWNfYml0c2V0PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIyL2R5bmFtaWNfYml0c2V0CisgKiAgVGhpcyBpcyBhIFRSMiBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjJfRFlOQU1JQ19CSVRTRVQKKyNkZWZpbmUgX0dMSUJDWFhfVFIyX0RZTkFNSUNfQklUU0VUIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWVtb3J5PiAvLyBGb3Igc3RkOjphbGxvY2F0b3IKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+ICAgLy8gRm9yIGludmFsaWRfYXJndW1lbnQsIG91dF9vZl9yYW5nZSwKKwkJCQkvLyBvdmVyZmxvd19lcnJvcgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxiaXRzL2N4eGFiaV9mb3JjZWQuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIyCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgRHluYW1pYyBCaXRzZXQuCisgICAqCisgICAqICBTZWUgTjIwNTAsCisgICAqICBQcm9wb3NhbCB0byBBZGQgYSBEeW5hbWljYWxseSBTaXplYWJsZSBCaXRzZXQgdG8gdGhlIFN0YW5kYXJkIExpYnJhcnkuCisgICAqLworbmFtZXNwYWNlIF9fZGV0YWlsCit7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBfQm9vbDJVQ2hhcgoreworICB0eXBlZGVmIFQgdHlwZTsKK307CisKK3RlbXBsYXRlPD4KK2NsYXNzIF9Cb29sMlVDaGFyPGJvb2w+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciB0eXBlOworfTsKKworfQorCisgIC8qKgorICAgKiAgQmFzZSBjbGFzcywgZ2VuZXJhbCBjYXNlLgorICAgKgorICAgKiAgU2VlIGRvY3VtZW50YXRpb24gZm9yIGR5bmFtaWNfYml0c2V0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1dvcmRUID0gdW5zaWduZWQgbG9uZyBsb25nLAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9Xb3JkVD4+CisgICAgc3RydWN0IF9fZHluYW1pY19iaXRzZXRfYmFzZQorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc191bnNpZ25lZDxfV29yZFQ+Ojp2YWx1ZSwgInRlbXBsYXRlIGFyZ3VtZW50ICIKKwkJICAgICJfV29yZFQgbm90IGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUiKTsKKworICAgICAgdHlwZWRlZiBfV29yZFQgYmxvY2tfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworCisgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIF9TX2JpdHNfcGVyX2Jsb2NrID0gX19DSEFSX0JJVF9fICogc2l6ZW9mKGJsb2NrX3R5cGUpOworICAgICAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBucG9zID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPigtMSk7CisKKyAgICAgIC8vLyAwIGlzIHRoZSBsZWFzdCBzaWduaWZpY2FudCB3b3JkLgorICAgICAgc3RkOjp2ZWN0b3I8YmxvY2tfdHlwZSwgYWxsb2NhdG9yX3R5cGU+IF9NX3c7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX2R5bmFtaWNfYml0c2V0X2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYWxsb2MgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV93KF9fYWxsb2MpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9fZHluYW1pY19iaXRzZXRfYmFzZShfX2R5bmFtaWNfYml0c2V0X2Jhc2UmJiBfX2IpCisgICAgICB7IHRoaXMtPl9NX3cuc3dhcChfX2IuX01fdyk7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9fZHluYW1pY19iaXRzZXRfYmFzZShzaXplX3R5cGUgX19uYml0cywgdW5zaWduZWQgbG9uZyBsb25nIF9fdmFsID0gMFVMTCwKKwkJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2FsbG9jID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01fdyhfX25iaXRzIC8gX1NfYml0c19wZXJfYmxvY2sKKwkgICAgICsgKF9fbmJpdHMgJSBfU19iaXRzX3Blcl9ibG9jayA+IDApLAorCSAgICAgX192YWwsIF9fYWxsb2MpCisgICAgICB7CisJdW5zaWduZWQgbG9uZyBsb25nIF9fbWFzayA9IH5zdGF0aWNfY2FzdDxibG9ja190eXBlPigwKTsKKwlzaXplX3QgX19uID0gc3RkOjptaW4odGhpcy0+X01fdy5zaXplKCksCisJCQkgICAgICBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSAvIHNpemVvZihibG9ja190eXBlKSk7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwkgIHsKKwkgICAgdGhpcy0+X01fd1tfX2ldID0gKF9fdmFsICYgX19tYXNrKSA+PiAoX19pICogX1NfYml0c19wZXJfYmxvY2spOworCSAgICBfX21hc2sgPDw9IF9TX2JpdHNfcGVyX2Jsb2NrOworCSAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hc3NpZ24oY29uc3QgX19keW5hbWljX2JpdHNldF9iYXNlJiBfX2IpCisgICAgICB7IHRoaXMtPl9NX3cgPSBfX2IuX01fdzsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9fZHluYW1pY19iaXRzZXRfYmFzZSYgX19iKQorICAgICAgeyB0aGlzLT5fTV93LnN3YXAoX19iLl9NX3cpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NsZWFyKCkKKyAgICAgIHsgdGhpcy0+X01fdy5jbGVhcigpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3Jlc2l6ZShzaXplX3QgX19uYml0cywgYm9vbCBfX3ZhbHVlKQorICAgICAgeworCXNpemVfdCBfX3N6ID0gX19uYml0cyAvIF9TX2JpdHNfcGVyX2Jsb2NrOworCWlmIChfX25iaXRzICUgX1NfYml0c19wZXJfYmxvY2sgPiAwKQorCSAgKytfX3N6OworCWlmIChfX3N6ICE9IHRoaXMtPl9NX3cuc2l6ZSgpKQorCSAgdGhpcy0+X01fdy5yZXNpemUoX19zeik7CisgICAgICB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX3cuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIHN0YXRpYyBzaXplX3R5cGUKKyAgICAgIF9TX3doaWNod29yZChzaXplX3R5cGUgX19wb3MpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX3BvcyAvIF9TX2JpdHNfcGVyX2Jsb2NrOyB9CisKKyAgICAgIHN0YXRpYyBzaXplX3R5cGUKKyAgICAgIF9TX3doaWNoYnl0ZShzaXplX3R5cGUgX19wb3MpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiAoX19wb3MgJSBfU19iaXRzX3Blcl9ibG9jaykgLyBfX0NIQVJfQklUX187IH0KKworICAgICAgc3RhdGljIHNpemVfdHlwZQorICAgICAgX1Nfd2hpY2hiaXQoc2l6ZV90eXBlIF9fcG9zKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19wb3MgJSBfU19iaXRzX3Blcl9ibG9jazsgfQorCisgICAgICBzdGF0aWMgYmxvY2tfdHlwZQorICAgICAgX1NfbWFza2JpdChzaXplX3R5cGUgX19wb3MpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiAoc3RhdGljX2Nhc3Q8YmxvY2tfdHlwZT4oMSkpIDw8IF9TX3doaWNoYml0KF9fcG9zKTsgfQorCisgICAgICBibG9ja190eXBlJgorICAgICAgX01fZ2V0d29yZChzaXplX3R5cGUgX19wb3MpCisgICAgICB7IHJldHVybiB0aGlzLT5fTV93W19TX3doaWNod29yZChfX3BvcyldOyB9CisKKyAgICAgIGJsb2NrX3R5cGUKKyAgICAgIF9NX2dldHdvcmQoc2l6ZV90eXBlIF9fcG9zKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fd1tfU193aGljaHdvcmQoX19wb3MpXTsgfQorCisgICAgICBibG9ja190eXBlJgorICAgICAgX01faGl3b3JkKCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX3dbX01fdy5zaXplKCkgLSAxXTsgfQorCisgICAgICBibG9ja190eXBlCisgICAgICBfTV9oaXdvcmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fd1tfTV93LnNpemUoKSAtIDFdOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2FuZChjb25zdCBfX2R5bmFtaWNfYml0c2V0X2Jhc2UmIF9feCkKKyAgICAgIHsKKwlpZiAoX194Ll9NX3cuc2l6ZSgpID09IHRoaXMtPl9NX3cuc2l6ZSgpKQorCSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+X01fdy5zaXplKCk7ICsrX19pKQorCSAgICB0aGlzLT5fTV93W19faV0gJj0gX194Ll9NX3dbX19pXTsKKwllbHNlCisJICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX29yKGNvbnN0IF9fZHluYW1pY19iaXRzZXRfYmFzZSYgX194KQorICAgICAgeworCWlmIChfX3guX01fdy5zaXplKCkgPT0gdGhpcy0+X01fdy5zaXplKCkpCisJICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5fTV93LnNpemUoKTsgKytfX2kpCisJICAgIHRoaXMtPl9NX3dbX19pXSB8PSBfX3guX01fd1tfX2ldOworCWVsc2UKKwkgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9feG9yKGNvbnN0IF9fZHluYW1pY19iaXRzZXRfYmFzZSYgX194KQorICAgICAgeworCWlmIChfX3guX01fdy5zaXplKCkgPT0gdGhpcy0+X01fdy5zaXplKCkpCisJICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5fTV93LnNpemUoKTsgKytfX2kpCisJICAgIHRoaXMtPl9NX3dbX19pXSBePSBfX3guX01fd1tfX2ldOworCWVsc2UKKwkgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fZGlmKGNvbnN0IF9fZHluYW1pY19iaXRzZXRfYmFzZSYgX194KQorICAgICAgeworCWlmIChfX3guX01fdy5zaXplKCkgPT0gdGhpcy0+X01fdy5zaXplKCkpCisJICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5fTV93LnNpemUoKTsgKytfX2kpCisJICAgIHRoaXMtPl9NX3dbX19pXSAmPSB+X194Ll9NX3dbX19pXTsKKwllbHNlCisJICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2xlZnRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpOworCisgICAgICB2b2lkCisgICAgICBfTV9kb19yaWdodF9zaGlmdChzaXplX3QgX19zaGlmdCk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2ZsaXAoKQorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPl9NX3cuc2l6ZSgpOyArK19faSkKKwkgIHRoaXMtPl9NX3dbX19pXSA9IH50aGlzLT5fTV93W19faV07CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3NldCgpCisgICAgICB7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+X01fdy5zaXplKCk7ICsrX19pKQorCSAgdGhpcy0+X01fd1tfX2ldID0gfnN0YXRpY19jYXN0PGJsb2NrX3R5cGU+KDApOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19yZXNldCgpCisgICAgICB7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+X01fdy5zaXplKCk7ICsrX19pKQorCSAgdGhpcy0+X01fd1tfX2ldID0gc3RhdGljX2Nhc3Q8YmxvY2tfdHlwZT4oMCk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2lzX2VxdWFsKGNvbnN0IF9fZHluYW1pY19iaXRzZXRfYmFzZSYgX194KSBjb25zdAorICAgICAgeworCWlmIChfX3guc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKwkgIHsKKwkgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+X01fdy5zaXplKCk7ICsrX19pKQorCSAgICAgIGlmICh0aGlzLT5fTV93W19faV0gIT0gX194Ll9NX3dbX19pXSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICByZXR1cm4gdHJ1ZTsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2lzX2xlc3MoY29uc3QgX19keW5hbWljX2JpdHNldF9iYXNlJiBfX3gpIGNvbnN0CisgICAgICB7CisJaWYgKF9feC5zaXplKCkgPT0gdGhpcy0+c2l6ZSgpKQorCSAgeworCSAgICBmb3IgKHNpemVfdCBfX2kgPSB0aGlzLT5fTV93LnNpemUoKTsgX19pID4gMDsgLS1fX2kpCisJICAgICAgeworCQlpZiAodGhpcy0+X01fd1tfX2ktMV0gPCBfX3guX01fd1tfX2ktMV0pCisJCSAgcmV0dXJuIHRydWU7CisJCWVsc2UgaWYgKHRoaXMtPl9NX3dbX19pLTFdID4gX194Ll9NX3dbX19pLTFdKQorCQkgIHJldHVybiBmYWxzZTsKKwkgICAgICB9CisJICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHNpemVfdAorICAgICAgX01fYXJlX2FsbF9hdXgoKSBjb25zdAorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPl9NX3cuc2l6ZSgpIC0gMTsgKytfX2kpCisJICBpZiAoX01fd1tfX2ldICE9IH5zdGF0aWNfY2FzdDxibG9ja190eXBlPigwKSkKKwkgICAgcmV0dXJuIDA7CisJcmV0dXJuICgodGhpcy0+X01fdy5zaXplKCkgLSAxKSAqIF9TX2JpdHNfcGVyX2Jsb2NrCisJCSsgX19idWlsdGluX3BvcGNvdW50bCh0aGlzLT5fTV9oaXdvcmQoKSkpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBfTV9pc19hbnkoKSBjb25zdAorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPl9NX3cuc2l6ZSgpOyArK19faSkKKwkgIGlmICh0aGlzLT5fTV93W19faV0gIT0gc3RhdGljX2Nhc3Q8YmxvY2tfdHlwZT4oMCkpCisJICAgIHJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgX01faXNfc3Vic2V0X29mKGNvbnN0IF9fZHluYW1pY19iaXRzZXRfYmFzZSYgX19iKQorICAgICAgeworCWlmIChfX2Iuc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKwkgIHsKKwkgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX01fdy5zaXplKCk7ICsrX19pKQorCSAgICAgIGlmICh0aGlzLT5fTV93W19faV0gIT0gKHRoaXMtPl9NX3dbX19pXSB8IF9fYi5fTV93W19faV0pKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIHJldHVybiB0cnVlOworCSAgfQorCWVsc2UKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgX01faXNfcHJvcGVyX3N1YnNldF9vZihjb25zdCBfX2R5bmFtaWNfYml0c2V0X2Jhc2UmIF9fYikgY29uc3QKKyAgICAgIHsKKwlpZiAodGhpcy0+aXNfc3Vic2V0X29mKF9fYikpCisJICB7CisJICAgIGlmICgqdGhpcyA9PSBfX2IpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICBlbHNlCisJICAgICAgcmV0dXJuIHRydWU7CisJICB9CisJZWxzZQorCSAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBzaXplX3QKKyAgICAgIF9NX2RvX2NvdW50KCkgY29uc3QKKyAgICAgIHsKKwlzaXplX3QgX19yZXN1bHQgPSAwOworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPl9NX3cuc2l6ZSgpOyArK19faSkKKwkgIF9fcmVzdWx0ICs9IF9fYnVpbHRpbl9wb3Bjb3VudGwodGhpcy0+X01fd1tfX2ldKTsKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fc2l6ZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV93LnNpemUoKTsgfQorCisgICAgICB1bnNpZ25lZCBsb25nCisgICAgICBfTV9kb190b191bG9uZygpIGNvbnN0OworCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICAgIF9NX2RvX3RvX3VsbG9uZygpIGNvbnN0OworCisgICAgICAvLyBmaW5kIGZpcnN0ICJvbiIgYml0CisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2RvX2ZpbmRfZmlyc3Qoc2l6ZV90IF9fbm90X2ZvdW5kKSBjb25zdDsKKworICAgICAgLy8gZmluZCB0aGUgbmV4dCAib24iIGJpdCB0aGF0IGZvbGxvd3MgInByZXYiCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2RvX2ZpbmRfbmV4dChzaXplX3QgX19wcmV2LCBzaXplX3QgX19ub3RfZm91bmQpIGNvbnN0OworCisgICAgICAvLyBkbyBhcHBlbmQgb2YgYmxvY2sKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2FwcGVuZF9ibG9jayhibG9ja190eXBlIF9fYmxvY2ssIHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsKKwlzaXplX3QgX19vZmZzZXQgPSBfX3BvcyAlIF9TX2JpdHNfcGVyX2Jsb2NrOworCWlmIChfX29mZnNldCA9PSAwKQorCSAgdGhpcy0+X01fdy5wdXNoX2JhY2soX19ibG9jayk7CisJZWxzZQorCSAgeworCSAgICB0aGlzLT5fTV9oaXdvcmQoKSB8PSAoX19ibG9jayA8PCBfX29mZnNldCk7CisJICAgIHRoaXMtPl9NX3cucHVzaF9iYWNrKF9fYmxvY2sgPj4gKF9TX2JpdHNfcGVyX2Jsb2NrIC0gX19vZmZzZXQpKTsKKwkgIH0KKyAgICAgIH0KKyAgICB9OworCisgIC8vIERlZmluaXRpb25zIG9mIG5vbi1pbmxpbmUgZnVuY3Rpb25zIGZyb20gX19keW5hbWljX2JpdHNldF9iYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19keW5hbWljX2JpdHNldF9iYXNlPF9Xb3JkVCwgX0FsbG9jPjo6X01fZG9fbGVmdF9zaGlmdChzaXplX3QgX19zaGlmdCkKKyAgICB7CisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX3NoaWZ0ICE9IDAsIDEpKQorCXsKKwkgIGNvbnN0IHNpemVfdCBfX3dzaGlmdCA9IF9fc2hpZnQgLyBfU19iaXRzX3Blcl9ibG9jazsKKwkgIGNvbnN0IHNpemVfdCBfX29mZnNldCA9IF9fc2hpZnQgJSBfU19iaXRzX3Blcl9ibG9jazsKKworCSAgaWYgKF9fb2Zmc2V0ID09IDApCisJICAgIGZvciAoc2l6ZV90IF9fbiA9IHRoaXMtPl9NX3cuc2l6ZSgpIC0gMTsgX19uID49IF9fd3NoaWZ0OyAtLV9fbikKKwkgICAgICB0aGlzLT5fTV93W19fbl0gPSB0aGlzLT5fTV93W19fbiAtIF9fd3NoaWZ0XTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0IHNpemVfdCBfX3N1Yl9vZmZzZXQgPSBfU19iaXRzX3Blcl9ibG9jayAtIF9fb2Zmc2V0OworCSAgICAgIGZvciAoc2l6ZV90IF9fbiA9IF9NX3cuc2l6ZSgpIC0gMTsgX19uID4gX193c2hpZnQ7IC0tX19uKQorCQl0aGlzLT5fTV93W19fbl0gPSAoKHRoaXMtPl9NX3dbX19uIC0gX193c2hpZnRdIDw8IF9fb2Zmc2V0KQorCQkJICAgICB8ICh0aGlzLT5fTV93W19fbiAtIF9fd3NoaWZ0IC0gMV0gPj4gX19zdWJfb2Zmc2V0KSk7CisJICAgICAgdGhpcy0+X01fd1tfX3dzaGlmdF0gPSB0aGlzLT5fTV93WzBdIDw8IF9fb2Zmc2V0OworCSAgICB9CisKKwkgIC8vLy8gc3RkOjpmaWxsKHRoaXMtPl9NX3cuYmVnaW4oKSwgdGhpcy0+X01fdy5iZWdpbigpICsgX193c2hpZnQsCisJICAvLy8vICAgICAgICAgIHN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fZHluYW1pY19iaXRzZXRfYmFzZTxfV29yZFQsIF9BbGxvYz46Ol9NX2RvX3JpZ2h0X3NoaWZ0KHNpemVfdCBfX3NoaWZ0KQorICAgIHsKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KF9fc2hpZnQgIT0gMCwgMSkpCisJeworCSAgY29uc3Qgc2l6ZV90IF9fd3NoaWZ0ID0gX19zaGlmdCAvIF9TX2JpdHNfcGVyX2Jsb2NrOworCSAgY29uc3Qgc2l6ZV90IF9fb2Zmc2V0ID0gX19zaGlmdCAlIF9TX2JpdHNfcGVyX2Jsb2NrOworCSAgY29uc3Qgc2l6ZV90IF9fbGltaXQgPSB0aGlzLT5fTV93LnNpemUoKSAtIF9fd3NoaWZ0IC0gMTsKKworCSAgaWYgKF9fb2Zmc2V0ID09IDApCisJICAgIGZvciAoc2l6ZV90IF9fbiA9IDA7IF9fbiA8PSBfX2xpbWl0OyArK19fbikKKwkgICAgICB0aGlzLT5fTV93W19fbl0gPSB0aGlzLT5fTV93W19fbiArIF9fd3NoaWZ0XTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0IHNpemVfdCBfX3N1Yl9vZmZzZXQgPSAoX1NfYml0c19wZXJfYmxvY2sKKwkJCQkJICAgLSBfX29mZnNldCk7CisJICAgICAgZm9yIChzaXplX3QgX19uID0gMDsgX19uIDwgX19saW1pdDsgKytfX24pCisJCXRoaXMtPl9NX3dbX19uXSA9ICgodGhpcy0+X01fd1tfX24gKyBfX3dzaGlmdF0gPj4gX19vZmZzZXQpCisJCQkgICAgIHwgKHRoaXMtPl9NX3dbX19uICsgX193c2hpZnQgKyAxXSA8PCBfX3N1Yl9vZmZzZXQpKTsKKwkgICAgICB0aGlzLT5fTV93W19fbGltaXRdID0gdGhpcy0+X01fd1tfTV93LnNpemUoKS0xXSA+PiBfX29mZnNldDsKKwkgICAgfQorCisJICAvLy8vc3RkOjpmaWxsKHRoaXMtPl9NX3cuYmVnaW4oKSArIF9fbGltaXQgKyAxLCB0aGlzLT5fTV93LmVuZCgpLAorCSAgLy8vLyAgICAgICAgICBzdGF0aWNfY2FzdDxfV29yZFQ+KDApKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Xb3JkVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHVuc2lnbmVkIGxvbmcKKyAgICBfX2R5bmFtaWNfYml0c2V0X2Jhc2U8X1dvcmRULCBfQWxsb2M+OjpfTV9kb190b191bG9uZygpIGNvbnN0CisgICAgeworICAgICAgc2l6ZV90IF9fbiA9IHNpemVvZih1bnNpZ25lZCBsb25nKSAvIHNpemVvZihibG9ja190eXBlKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IF9fbjsgX19pIDwgdGhpcy0+X01fdy5zaXplKCk7ICsrX19pKQorCWlmICh0aGlzLT5fTV93W19faV0pCisJICBfX3Rocm93X292ZXJmbG93X2Vycm9yKF9fTigiX19keW5hbWljX2JpdHNldF9iYXNlOjpfTV9kb190b191bG9uZyIpKTsKKyAgICAgIHVuc2lnbmVkIGxvbmcgX19yZXMgPSAwVUw7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX24gJiYgX19pIDwgdGhpcy0+X01fdy5zaXplKCk7ICsrX19pKQorCV9fcmVzICs9IHRoaXMtPl9NX3dbX19pXSA8PCAoX19pICogX1NfYml0c19wZXJfYmxvY2spOworICAgICAgcmV0dXJuIF9fcmVzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICBfX2R5bmFtaWNfYml0c2V0X2Jhc2U8X1dvcmRULCBfQWxsb2M+OjpfTV9kb190b191bGxvbmcoKSBjb25zdAorICAgIHsKKyAgICAgIHNpemVfdCBfX24gPSBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSAvIHNpemVvZihibG9ja190eXBlKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IF9fbjsgX19pIDwgdGhpcy0+X01fdy5zaXplKCk7ICsrX19pKQorCWlmICh0aGlzLT5fTV93W19faV0pCisJICBfX3Rocm93X292ZXJmbG93X2Vycm9yKF9fTigiX19keW5hbWljX2JpdHNldF9iYXNlOjpfTV9kb190b191bGxvbmciKSk7CisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgX19yZXMgPSAwVUxMOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uICYmIF9faSA8IHRoaXMtPl9NX3cuc2l6ZSgpOyArK19faSkKKwlfX3JlcyArPSB0aGlzLT5fTV93W19faV0gPDwgKF9faSAqIF9TX2JpdHNfcGVyX2Jsb2NrKTsKKyAgICAgIHJldHVybiBfX3JlczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc2l6ZV90CisgICAgX19keW5hbWljX2JpdHNldF9iYXNlPF9Xb3JkVCwgX0FsbG9jPgorICAgIDo6X01fZG9fZmluZF9maXJzdChzaXplX3QgX19ub3RfZm91bmQpIGNvbnN0CisgICAgeworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+X01fdy5zaXplKCk7ICsrX19pKQorCXsKKwkgIF9Xb3JkVCBfX3RoaXN3b3JkID0gdGhpcy0+X01fd1tfX2ldOworCSAgaWYgKF9fdGhpc3dvcmQgIT0gc3RhdGljX2Nhc3Q8X1dvcmRUPigwKSkKKwkgICAgcmV0dXJuIChfX2kgKiBfU19iaXRzX3Blcl9ibG9jaworCQkgICAgKyBfX2J1aWx0aW5fY3R6bChfX3RoaXN3b3JkKSk7CisJfQorICAgICAgLy8gbm90IGZvdW5kLCBzbyByZXR1cm4gYW4gaW5kaWNhdGlvbiBvZiBmYWlsdXJlLgorICAgICAgcmV0dXJuIF9fbm90X2ZvdW5kOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzaXplX3QKKyAgICBfX2R5bmFtaWNfYml0c2V0X2Jhc2U8X1dvcmRULCBfQWxsb2M+CisgICAgOjpfTV9kb19maW5kX25leHQoc2l6ZV90IF9fcHJldiwgc2l6ZV90IF9fbm90X2ZvdW5kKSBjb25zdAorICAgIHsKKyAgICAgIC8vIG1ha2UgYm91bmQgaW5jbHVzaXZlCisgICAgICArK19fcHJldjsKKworICAgICAgLy8gY2hlY2sgb3V0IG9mIGJvdW5kcworICAgICAgaWYgKF9fcHJldiA+PSB0aGlzLT5fTV93LnNpemUoKSAqIF9TX2JpdHNfcGVyX2Jsb2NrKQorCXJldHVybiBfX25vdF9mb3VuZDsKKworICAgICAgLy8gc2VhcmNoIGZpcnN0IHdvcmQKKyAgICAgIHNpemVfdCBfX2kgPSBfU193aGljaHdvcmQoX19wcmV2KTsKKyAgICAgIF9Xb3JkVCBfX3RoaXN3b3JkID0gdGhpcy0+X01fd1tfX2ldOworCisgICAgICAvLyBtYXNrIG9mZiBiaXRzIGJlbG93IGJvdW5kCisgICAgICBfX3RoaXN3b3JkICY9ICh+c3RhdGljX2Nhc3Q8X1dvcmRUPigwKSkgPDwgX1Nfd2hpY2hiaXQoX19wcmV2KTsKKworICAgICAgaWYgKF9fdGhpc3dvcmQgIT0gc3RhdGljX2Nhc3Q8X1dvcmRUPigwKSkKKwlyZXR1cm4gKF9faSAqIF9TX2JpdHNfcGVyX2Jsb2NrCisJCSsgX19idWlsdGluX2N0emwoX190aGlzd29yZCkpOworCisgICAgICAvLyBjaGVjayBzdWJzZXF1ZW50IHdvcmRzCisgICAgICBmb3IgKCsrX19pOyBfX2kgPCB0aGlzLT5fTV93LnNpemUoKTsgKytfX2kpCisJeworCSAgX190aGlzd29yZCA9IHRoaXMtPl9NX3dbX19pXTsKKwkgIGlmIChfX3RoaXN3b3JkICE9IHN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpCisJICAgIHJldHVybiAoX19pICogX1NfYml0c19wZXJfYmxvY2sKKwkJICAgICsgX19idWlsdGluX2N0emwoX190aGlzd29yZCkpOworCX0KKyAgICAgIC8vIG5vdCBmb3VuZCwgc28gcmV0dXJuIGFuIGluZGljYXRpb24gb2YgZmFpbHVyZS4KKyAgICAgIHJldHVybiBfX25vdF9mb3VuZDsKKyAgICB9IC8vIGVuZCBfTV9kb19maW5kX25leHQKKworICAvKioKKyAgICogIEBicmllZiAgVGhlICVkeW5hbWljX2JpdHNldCBjbGFzcyByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgYml0cy4KKyAgICoKKyAgICogIEBpbmdyb3VwIGNvbnRhaW5lcnMKKyAgICoKKyAgICogIChOb3RlIHRoYXQgJWR5bmFtaWNfYml0c2V0IGRvZXMgQGUgbm90IG1lZXQgdGhlIGZvcm1hbAorICAgKiAgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4uCisgICAqICBNYWlubHksIGl0IGxhY2tzIGl0ZXJhdG9ycy4pCisgICAqCisgICAqICBUaGUgdGVtcGxhdGUgYXJndW1lbnQsIEBhIE5iLCBtYXkgYmUgYW55IG5vbi1uZWdhdGl2ZSBudW1iZXIsCisgICAqICBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgYml0cyAoZS5nLiwgIjAiLCAiMTIiLCAiMTAyNCoxMDI0IikuCisgICAqCisgICAqICBJbiB0aGUgZ2VuZXJhbCB1bm9wdGltaXplZCBjYXNlLCBzdG9yYWdlIGlzIGFsbG9jYXRlZCBpbgorICAgKiAgd29yZC1zaXplZCBibG9ja3MuICBMZXQgQiBiZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSB3b3JkLCB0aGVuCisgICAqICAoTmIrKEItMSkpL0Igd29yZHMgd2lsbCBiZSB1c2VkIGZvciBzdG9yYWdlLiAgQiAtIE5iJUIgYml0cyBhcmUKKyAgICogIHVudXNlZC4gIChUaGV5IGFyZSB0aGUgaGlnaC1vcmRlciBiaXRzIGluIHRoZSBoaWdoZXN0IHdvcmQuKSAgSXQKKyAgICogIGlzIGEgY2xhc3MgaW52YXJpYW50IHRoYXQgdGhvc2UgdW51c2VkIGJpdHMgYXJlIGFsd2F5cyB6ZXJvLgorICAgKgorICAgKiAgSWYgeW91IHRoaW5rIG9mICVkeW5hbWljX2JpdHNldCBhcyAiYSBzaW1wbGUgYXJyYXkgb2YgYml0cywiIGJlCisgICAqICBhd2FyZSB0aGF0IHlvdXIgbWVudGFsIHBpY3R1cmUgaXMgcmV2ZXJzZWQ6IGEgJWR5bmFtaWNfYml0c2V0CisgICAqICBiZWhhdmVzIHRoZSBzYW1lIHdheSBhcyBiaXRzIGluIGludGVnZXJzIGRvLCB3aXRoIHRoZSBiaXQgYXQKKyAgICogIGluZGV4IDAgaW4gdGhlICJsZWFzdCBzaWduaWZpY2FudCAvIHJpZ2h0LWhhbmQiIHBvc2l0aW9uLCBhbmQKKyAgICogIHRoZSBiaXQgYXQgaW5kZXggTmItMSBpbiB0aGUgIm1vc3Qgc2lnbmlmaWNhbnQgLyBsZWZ0LWhhbmQiCisgICAqICBwb3NpdGlvbi4gIFRodXMsIHVubGlrZSBvdGhlciBjb250YWluZXJzLCBhICVkeW5hbWljX2JpdHNldCdzCisgICAqICBpbmRleCAiY291bnRzIGZyb20gcmlnaHQgdG8gbGVmdCwiIHRvIHB1dCBpdCB2ZXJ5IGxvb3NlbHkuCisgICAqCisgICAqICBUaGlzIGJlaGF2aW9yIGlzIHByZXNlcnZlZCB3aGVuIHRyYW5zbGF0aW5nIHRvIGFuZCBmcm9tIHN0cmluZ3MuCisgICAqICBGb3IgZXhhbXBsZSwgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGZvbGxvd2luZyBwcm9ncmFtIHByb2JhYmx5CisgICAqICBwcmludHMgImIoJ2EnKSBpcyAwMDAxMTAwMDAxIiBvbiBhIG1vZGVybiBBU0NJSSBzeXN0ZW0uCisgICAqCisgICAqICBAY29kZQorICAgKiAgICAgI2luY2x1ZGUgPGR5bmFtaWNfYml0c2V0PgorICAgKiAgICAgI2luY2x1ZGUgPGlvc3RyZWFtPgorICAgKiAgICAgI2luY2x1ZGUgPHNzdHJlYW0+CisgICAqCisgICAqICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgKgorICAgKiAgICAgaW50IG1haW4oKQorICAgKiAgICAgeworICAgKiAgICAgICAgIGxvbmcgICAgICAgICBhID0gJ2EnOworICAgKiAgICAgICAgIGR5bmFtaWNfYml0c2V0ICAgYihhKTsKKyAgICoKKyAgICogICAgICAgICBjb3V0IDw8ICJiKCdhJykgaXMgIiA8PCBiIDw8IGVuZGw7CisgICAqCisgICAqICAgICAgICAgb3N0cmluZ3N0cmVhbSBzOworICAgKiAgICAgICAgIHMgPDwgYjsKKyAgICogICAgICAgICBzdHJpbmcgIHN0ciA9IHMuc3RyKCk7CisgICAqICAgICAgICAgY291dCA8PCAiaW5kZXggMyBpbiB0aGUgc3RyaW5nIGlzICIgPDwgc3RyWzNdIDw8ICIgYnV0XG4iCisgICAqICAgICAgICAgICAgICA8PCAiaW5kZXggMyBpbiB0aGUgYml0c2V0IGlzICIgPDwgYlszXSA8PCBlbmRsOworICAgKiAgICAgfQorICAgKiAgQGVuZGNvZGUKKyAgICoKKyAgICogIEFsc28gc2VlOgorICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQxMmNoMzNzMDIuaHRtbAorICAgKiAgZm9yIGEgZGVzY3JpcHRpb24gb2YgZXh0ZW5zaW9ucy4KKyAgICoKKyAgICogIE1vc3Qgb2YgdGhlIGFjdHVhbCBjb2RlIGlzbid0IGNvbnRhaW5lZCBpbiAlZHluYW1pY19iaXRzZXQ8PgorICAgKiAgaXRzZWxmLCBidXQgaW4gdGhlIGJhc2UgY2xhc3MgX19keW5hbWljX2JpdHNldF9iYXNlLiAgVGhlIGJhc2UKKyAgICogIGNsYXNzIHdvcmtzIHdpdGggd2hvbGUgd29yZHMsIG5vdCB3aXRoIGluZGl2aWR1YWwgYml0cy4gIFRoaXMKKyAgICogIGFsbG93cyB1cyB0byBzcGVjaWFsaXplIF9fZHluYW1pY19iaXRzZXRfYmFzZSBmb3IgdGhlIGltcG9ydGFudAorICAgKiAgc3BlY2lhbCBjYXNlIHdoZXJlIHRoZSAlZHluYW1pY19iaXRzZXQgaXMgb25seSBhIHNpbmdsZSB3b3JkLgorICAgKgorICAgKiAgRXh0cmEgY29uZnVzaW9uIGNhbiByZXN1bHQgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIHN0b3JhZ2UgZm9yCisgICAqICBfX2R5bmFtaWNfYml0c2V0X2Jhc2UgQGUgaXMgYSB2ZWN0b3IsIGFuZCBpcyBpbmRleGVkIGFzIHN1Y2guICBUaGlzIGlzCisgICAqICBjYXJlZnVsbHkgZW5jYXBzdWxhdGVkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1dvcmRUID0gdW5zaWduZWQgbG9uZyBsb25nLAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9Xb3JkVD4+CisgICAgY2xhc3MgZHluYW1pY19iaXRzZXQKKyAgICA6IHByaXZhdGUgX19keW5hbWljX2JpdHNldF9iYXNlPF9Xb3JkVCwgX0FsbG9jPgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc191bnNpZ25lZDxfV29yZFQ+Ojp2YWx1ZSwgInRlbXBsYXRlIGFyZ3VtZW50ICIKKwkJICAgICJfV29yZFQgbm90IGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUiKTsKKworICAgIHB1YmxpYzoKKworICAgICAgdHlwZWRlZiBfX2R5bmFtaWNfYml0c2V0X2Jhc2U8X1dvcmRULCBfQWxsb2M+IF9CYXNlOworICAgICAgdHlwZWRlZiBfV29yZFQgYmxvY2tfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworCisgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIGJpdHNfcGVyX2Jsb2NrID0gX19DSEFSX0JJVF9fICogc2l6ZW9mKGJsb2NrX3R5cGUpOworICAgICAgLy8gVXNlIHRoaXM6IGNvbnN0ZXhwciBzaXplX3R5cGUgc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3R5cGU+OjptYXgoKS4KKyAgICAgIHN0YXRpYyBjb25zdCBzaXplX3R5cGUgbnBvcyA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpOworCisgICAgcHJpdmF0ZToKKworICAgICAgLy8gIENsZWFyIHRoZSB1bnVzZWQgYml0cyBpbiB0aGUgdXBwZXJtb3N0IHdvcmQuCisgICAgICB2b2lkCisgICAgICBfTV9kb19zYW5pdGl6ZSgpCisgICAgICB7CisJc2l6ZV90eXBlIF9fc2hpZnQgPSB0aGlzLT5fTV9OYiAlIGJpdHNfcGVyX2Jsb2NrOworCWlmIChfX3NoaWZ0ID4gMCkKKwkgIHRoaXMtPl9NX2hpd29yZCgpICY9IH4oKH5zdGF0aWNfY2FzdDxibG9ja190eXBlPigwKSkgPDwgX19zaGlmdCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFRoZXNlIHZlcnNpb25zIG9mIHNpbmdsZS1iaXQgc2V0LCByZXNldCwgZmxpcCwgYW5kIHRlc3QKKyAgICAgICAqICBkbyBubyByYW5nZSBjaGVja2luZy4KKyAgICAgICAqLworICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JgorICAgICAgX01fdW5jaGVja2VkX3NldChzaXplX3R5cGUgX19wb3MpCisgICAgICB7CisJdGhpcy0+X01fZ2V0d29yZChfX3BvcykgfD0gX0Jhc2U6Ol9TX21hc2tiaXQoX19wb3MpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JgorICAgICAgX01fdW5jaGVja2VkX3NldChzaXplX3R5cGUgX19wb3MsIGludCBfX3ZhbCkKKyAgICAgIHsKKwlpZiAoX192YWwpCisJICB0aGlzLT5fTV9nZXR3b3JkKF9fcG9zKSB8PSBfQmFzZTo6X1NfbWFza2JpdChfX3Bvcyk7CisJZWxzZQorCSAgdGhpcy0+X01fZ2V0d29yZChfX3BvcykgJj0gfl9CYXNlOjpfU19tYXNrYml0KF9fcG9zKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIF9NX3VuY2hlY2tlZF9yZXNldChzaXplX3R5cGUgX19wb3MpCisgICAgICB7CisJdGhpcy0+X01fZ2V0d29yZChfX3BvcykgJj0gfl9CYXNlOjpfU19tYXNrYml0KF9fcG9zKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIF9NX3VuY2hlY2tlZF9mbGlwKHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsKKwl0aGlzLT5fTV9nZXR3b3JkKF9fcG9zKSBePSBfQmFzZTo6X1NfbWFza2JpdChfX3Bvcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBfTV91bmNoZWNrZWRfdGVzdChzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgICB7IHJldHVybiAoKHRoaXMtPl9NX2dldHdvcmQoX19wb3MpICYgX0Jhc2U6Ol9TX21hc2tiaXQoX19wb3MpKQorCQkhPSBzdGF0aWNfY2FzdDxfV29yZFQ+KDApKTsgfQorCisgICAgICBzaXplX3R5cGUgX01fTmI7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqICBUaGlzIGVuY2Fwc3VsYXRlcyB0aGUgY29uY2VwdCBvZiBhIHNpbmdsZSBiaXQuICBBbiBpbnN0YW5jZQorICAgICAgICogIG9mIHRoaXMgY2xhc3MgaXMgYSBwcm94eSBmb3IgYW4gYWN0dWFsIGJpdDsgdGhpcyB3YXkgdGhlCisgICAgICAgKiAgaW5kaXZpZHVhbCBiaXQgb3BlcmF0aW9ucyBhcmUgZG9uZSBhcyBmYXN0ZXIgd29yZC1zaXplCisgICAgICAgKiAgYml0d2lzZSBpbnN0cnVjdGlvbnMuCisgICAgICAgKgorICAgICAgICogIE1vc3QgdXNlcnMgd2lsbCBuZXZlciBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzIGRpcmVjdGx5OworICAgICAgICogIGNvbnZlcnNpb25zIHRvIGFuZCBmcm9tIGJvb2wgYXJlIGF1dG9tYXRpYyBhbmQgc2hvdWxkIGJlCisgICAgICAgKiAgdHJhbnNwYXJlbnQuICBPdmVybG9hZGVkIG9wZXJhdG9ycyBoZWxwIHRvIHByZXNlcnZlIHRoZQorICAgICAgICogIGlsbHVzaW9uLgorICAgICAgICoKKyAgICAgICAqICAoT24gYSB0eXBpY2FsIHN5c3RlbSwgdGhpcyAiYml0ICVyZWZlcmVuY2UiIGlzIDY0IHRpbWVzIHRoZQorICAgICAgICogIHNpemUgb2YgYW4gYWN0dWFsIGJpdC4gIEhhLikKKyAgICAgICAqLworICAgICAgY2xhc3MgcmVmZXJlbmNlCisgICAgICB7CisJZnJpZW5kIGNsYXNzIGR5bmFtaWNfYml0c2V0OworCisJYmxvY2tfdHlwZSAqX01fd3A7CisJc2l6ZV90eXBlIF9NX2Jwb3M7CisKKwkvLyBsZWZ0IHVuZGVmaW5lZAorCXJlZmVyZW5jZSgpOworCisgICAgICBwdWJsaWM6CisJcmVmZXJlbmNlKGR5bmFtaWNfYml0c2V0JiBfX2IsIHNpemVfdHlwZSBfX3BvcykKKwl7CisJICB0aGlzLT5fTV93cCA9ICZfX2IuX01fZ2V0d29yZChfX3Bvcyk7CisJICB0aGlzLT5fTV9icG9zID0gX0Jhc2U6Ol9TX3doaWNoYml0KF9fcG9zKTsKKwl9CisKKwl+cmVmZXJlbmNlKCkKKwl7IH0KKworCS8vIEZvciBiW2ldID0gX194OworCXJlZmVyZW5jZSYKKwlvcGVyYXRvcj0oYm9vbCBfX3gpCisJeworCSAgaWYgKF9feCkKKwkgICAgKnRoaXMtPl9NX3dwIHw9IF9CYXNlOjpfU19tYXNrYml0KHRoaXMtPl9NX2Jwb3MpOworCSAgZWxzZQorCSAgICAqdGhpcy0+X01fd3AgJj0gfl9CYXNlOjpfU19tYXNrYml0KHRoaXMtPl9NX2Jwb3MpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCS8vIEZvciBiW2ldID0gYltfX2pdOworCXJlZmVyZW5jZSYKKwlvcGVyYXRvcj0oY29uc3QgcmVmZXJlbmNlJiBfX2opCisJeworCSAgaWYgKCgqKF9fai5fTV93cCkgJiBfQmFzZTo6X1NfbWFza2JpdChfX2ouX01fYnBvcykpKQorCSAgICAqdGhpcy0+X01fd3AgfD0gX0Jhc2U6Ol9TX21hc2tiaXQodGhpcy0+X01fYnBvcyk7CisJICBlbHNlCisJICAgICp0aGlzLT5fTV93cCAmPSB+X0Jhc2U6Ol9TX21hc2tiaXQodGhpcy0+X01fYnBvcyk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJLy8gRmxpcHMgdGhlIGJpdAorCWJvb2wKKwlvcGVyYXRvcn4oKSBjb25zdAorCXsgcmV0dXJuICgqKF9NX3dwKSAmIF9CYXNlOjpfU19tYXNrYml0KHRoaXMtPl9NX2Jwb3MpKSA9PSAwOyB9CisKKwkvLyBGb3IgX194ID0gYltpXTsKKwlvcGVyYXRvciBib29sKCkgY29uc3QKKwl7IHJldHVybiAoKih0aGlzLT5fTV93cCkgJiBfQmFzZTo6X1NfbWFza2JpdCh0aGlzLT5fTV9icG9zKSkgIT0gMDsgfQorCisJLy8gRm9yIGJbaV0uZmxpcCgpOworCXJlZmVyZW5jZSYKKwlmbGlwKCkKKwl7CisJICAqdGhpcy0+X01fd3AgXj0gX0Jhc2U6Ol9TX21hc2tiaXQodGhpcy0+X01fYnBvcyk7CisJICByZXR1cm4gKnRoaXM7CisJfQorICAgICAgfTsKKworICAgICAgZnJpZW5kIGNsYXNzIHJlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBib29sIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgLy8gMjMuMy41LjEgY29uc3RydWN0b3JzOgorICAgICAgLy8vIEFsbCBiaXRzIHNldCB0byB6ZXJvLgorICAgICAgZXhwbGljaXQKKyAgICAgIGR5bmFtaWNfYml0c2V0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2FsbG9jID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hbGxvYyksIF9NX05iKDApCisgICAgICB7IH0KKworICAgICAgLy8vIEluaXRpYWwgYml0cyBiaXR3aXNlLWNvcGllZCBmcm9tIGEgc2luZ2xlIHdvcmQgKG90aGVycyBzZXQgdG8gemVybykuCisgICAgICBleHBsaWNpdAorICAgICAgZHluYW1pY19iaXRzZXQoc2l6ZV90eXBlIF9fbmJpdHMsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCA9IDBVTEwsCisJCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYWxsb2MgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX25iaXRzLCBfX3ZhbCwgX19hbGxvYyksCisJX01fTmIoX19uYml0cykKKyAgICAgIHsgfQorCisgICAgICBkeW5hbWljX2JpdHNldChpbml0aWFsaXplcl9saXN0PGJsb2NrX3R5cGU+IF9faWwsCisJCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYWxsb2MgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2FsbG9jKSwgX01fTmIoMCkKKyAgICAgIHsgdGhpcy0+YXBwZW5kKF9faWwpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVXNlIGEgc3Vic2V0IG9mIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIEEgc3RyaW5nIG9mICcwJyBhbmQgJzEnIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgSW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBAcCBfX3N0ciB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtICBfX24gICAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQHAgX19wb3MgaXMgYmlnZ2VyIHRoZSBzaXplIG9mIEBwIF9fc3RyLgorICAgICAgICogIEB0aHJvdyAgc3RkOjppbnZhbGlkX2FyZ3VtZW50ICBJZiBhIGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSBzdHJpbmcKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgbmVpdGhlciAnMCcgbm9yICcxJy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MxPgorCWV4cGxpY2l0CisJZHluYW1pY19iaXRzZXQoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MxPiYgX19zdHIsCisJCSAgICAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jMT46OnNpemVfdHlwZQorCQkgICAgICAgX19wb3MgPSAwLAorCQkgICAgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYzE+OjpzaXplX3R5cGUKKwkJICAgICAgIF9fbiA9IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jMT46Om5wb3MsCisJCSAgICAgICBfQ2hhclQgX196ZXJvID0gX0NoYXJUKCcwJyksIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpLAorCQkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYWxsb2MgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19hbGxvYyksCisJICBfTV9OYigwKSAvLyBXYXRjaCBmb3IgbnBvcy4KKwl7CisJICBpZiAoX19wb3MgPiBfX3N0ci5zaXplKCkpCisJICAgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiZHluYW1pY19iaXRzZXQ6OmJpdHNldCBpbml0aWFsIHBvc2l0aW9uICIKKwkJCQkgICAgICJub3QgdmFsaWQiKSk7CisKKwkgIC8vIFdhdGNoIGZvciBucG9zLgorCSAgdGhpcy0+X01fTmIgPSAoX19uID4gX19zdHIuc2l6ZSgpID8gX19zdHIuc2l6ZSgpIC0gX19wb3MgOiBfX24pOworCSAgdGhpcy0+cmVzaXplKHRoaXMtPl9NX05iKTsKKwkgIHRoaXMtPl9NX2NvcHlfZnJvbV9zdHJpbmcoX19zdHIsIF9fcG9zLCBfX24sCisJCQkJICAgIF9DaGFyVCgnMCcpLCBfQ2hhclQoJzEnKSk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBmcm9tIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIEEgc3RyaW5nIG9mICcwJyBhbmQgJzEnIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHRocm93ICBzdGQ6OmludmFsaWRfYXJndW1lbnQgIElmIGEgY2hhcmFjdGVyIGFwcGVhcnMgaW4gdGhlIHN0cmluZworICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBpcyBuZWl0aGVyICcwJyBub3IgJzEnLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZHluYW1pY19iaXRzZXQoY29uc3QgY2hhciogX19zdHIsCisJCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYWxsb2MgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2FsbG9jKQorICAgICAgeworCXNpemVfdCBfX2xlbiA9IDA7CisJaWYgKF9fc3RyKQorCSAgd2hpbGUgKF9fc3RyW19fbGVuXSAhPSAnXDAnKQorCSAgICArK19fbGVuOworCXRoaXMtPnJlc2l6ZShfX2xlbik7CisJdGhpcy0+X01fY29weV9mcm9tX3B0cjxjaGFyLHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4+CisJCSAgIChfX3N0ciwgX19sZW4sIDAsIF9fbGVuLCAnMCcsICcxJyk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgZHluYW1pY19iaXRzZXQoY29uc3QgZHluYW1pY19iaXRzZXQmIF9fYikKKyAgICAgIDogX0Jhc2UoX19iKSwgX01fTmIoX19iLnNpemUoKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmUgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIGR5bmFtaWNfYml0c2V0KGR5bmFtaWNfYml0c2V0JiYgX19iKQorICAgICAgOiBfQmFzZShzdGQ6OmZvcndhcmQ8X0Jhc2U+KF9fYikpLCBfTV9OYihfX2Iuc2l6ZSgpKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3dhcCB3aXRoIGFub3RoZXIgYml0c2V0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKGR5bmFtaWNfYml0c2V0JiBfX2IpCisgICAgICB7CisJdGhpcy0+X01fc3dhcChfX2IpOworCXN0ZDo6c3dhcCh0aGlzLT5fTV9OYiwgX19iLl9NX05iKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ25tZW50LgorICAgICAgICovCisgICAgICBkeW5hbWljX2JpdHNldCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBkeW5hbWljX2JpdHNldCYgX19iKQorICAgICAgeworCWlmICgmX19iICE9IHRoaXMpCisJICB7CisJICAgIHRoaXMtPl9NX2Fzc2lnbihfX2IpOworCSAgICB0aGlzLT5fTV9OYiA9IF9fYi5fTV9OYjsKKwkgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNb3ZlIGFzc2lnbm1lbnQuCisgICAgICAgKi8KKyAgICAgIGR5bmFtaWNfYml0c2V0JgorICAgICAgb3BlcmF0b3I9KGR5bmFtaWNfYml0c2V0JiYgX19iKQorICAgICAgeworCXRoaXMtPnN3YXAoX19iKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIHRoZSBhbGxvY2F0b3IgZm9yIHRoZSBiaXRzZXQuCisgICAgICAgKi8KKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2dldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2l6ZSB0aGUgYml0c2V0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbmJpdHMsIGJvb2wgX192YWx1ZSA9IGZhbHNlKQorICAgICAgeworCXRoaXMtPl9NX3Jlc2l6ZShfX25iaXRzLCBfX3ZhbHVlKTsKKwl0aGlzLT5fTV9OYiA9IF9fbmJpdHM7CisJdGhpcy0+X01fZG9fc2FuaXRpemUoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDbGVhciB0aGUgYml0c2V0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7CisJdGhpcy0+X01fY2xlYXIoKTsKKwl0aGlzLT5fTV9OYiA9IDA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHVzaCBhIGJpdCBvbnRvIHRoZSBoaWdoIGVuZCBvZiB0aGUgYml0c2V0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2soYm9vbCBfX2JpdCkKKyAgICAgIHsKKwlpZiAoc2l6ZV90IF9fb2Zmc2V0ID0gdGhpcy0+c2l6ZSgpICUgYml0c19wZXJfYmxvY2sgPT0gMCkKKwkgIHRoaXMtPl9NX2RvX2FwcGVuZF9ibG9jayhibG9ja190eXBlKDApLCB0aGlzLT5fTV9OYik7CisJKyt0aGlzLT5fTV9OYjsKKwl0aGlzLT5fTV91bmNoZWNrZWRfc2V0KHRoaXMtPl9NX05iLCBfX2JpdCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgYmxvY2suCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGFwcGVuZChibG9ja190eXBlIF9fYmxvY2spCisgICAgICB7CisJdGhpcy0+X01fZG9fYXBwZW5kX2Jsb2NrKF9fYmxvY2ssIHRoaXMtPl9NX05iKTsKKwl0aGlzLT5fTV9OYiArPSBiaXRzX3Blcl9ibG9jazsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGFwcGVuZChpbml0aWFsaXplcl9saXN0PGJsb2NrX3R5cGU+IF9faWwpCisgICAgICB7IHRoaXMtPmFwcGVuZChfX2lsLmJlZ2luKCksIF9faWwuZW5kKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGFuIGl0ZXJhdG9yIHJhbmdlIG9mIGJsb2Nrcy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9CbG9ja0lucHV0SXRlcmF0b3I+CisJdm9pZAorCWFwcGVuZChfQmxvY2tJbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9CbG9ja0lucHV0SXRlcmF0b3IgX19sYXN0KQorCXsKKwkgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgICB0aGlzLT5hcHBlbmQoKl9fZmlyc3QpOworCX0KKworICAgICAgLy8gMjMuMy41LjIgZHluYW1pY19iaXRzZXQgb3BlcmF0aW9uczoKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgT3BlcmF0aW9ucyBvbiBkeW5hbWljX2JpdHNldHMuCisgICAgICAgKiAgQHBhcmFtICBfX3JocyAgQSBzYW1lLXNpemVkIGR5bmFtaWNfYml0c2V0LgorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBzaG91bGQgYmUgc2VsZi1leHBsYW5hdG9yeS4KKyAgICAgICAqLworICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JgorICAgICAgb3BlcmF0b3ImPShjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9fcmhzKQorICAgICAgeworCXRoaXMtPl9NX2RvX2FuZChfX3Jocyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mCisgICAgICBvcGVyYXRvciY9KGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYmIF9fcmhzKQorICAgICAgeworCXRoaXMtPl9NX2RvX2FuZChzdGQ6Om1vdmUoX19yaHMpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIG9wZXJhdG9yfD0oY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3JocykKKyAgICAgIHsKKwl0aGlzLT5fTV9kb19vcihfX3Jocyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mCisgICAgICBvcGVyYXRvcl49KGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX19yaHMpCisgICAgICB7CisJdGhpcy0+X01fZG9feG9yKF9fcmhzKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIG9wZXJhdG9yLT0oY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3JocykKKyAgICAgIHsKKwl0aGlzLT5fTV9kb19kaWYoX19yaHMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBPcGVyYXRpb25zIG9uIGR5bmFtaWNfYml0c2V0cy4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zIFRoZSBudW1iZXIgb2YgcGxhY2VzIHRvIHNoaWZ0LgorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBzaG91bGQgYmUgc2VsZi1leHBsYW5hdG9yeS4KKyAgICAgICAqLworICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JgorICAgICAgb3BlcmF0b3I8PD0oc2l6ZV90eXBlIF9fcG9zKQorICAgICAgeworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9fcG9zIDwgdGhpcy0+X01fTmIsIDEpKQorCSAgeworCSAgICB0aGlzLT5fTV9kb19sZWZ0X3NoaWZ0KF9fcG9zKTsKKwkgICAgdGhpcy0+X01fZG9fc2FuaXRpemUoKTsKKwkgIH0KKwllbHNlCisJICB0aGlzLT5fTV9kb19yZXNldCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JgorICAgICAgb3BlcmF0b3I+Pj0oc2l6ZV90eXBlIF9fcG9zKQorICAgICAgeworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9fcG9zIDwgdGhpcy0+X01fTmIsIDEpKQorCSAgeworCSAgICB0aGlzLT5fTV9kb19yaWdodF9zaGlmdChfX3Bvcyk7CisJICAgIHRoaXMtPl9NX2RvX3Nhbml0aXplKCk7CisJICB9CisJZWxzZQorCSAgdGhpcy0+X01fZG9fcmVzZXQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICAvL0B9CisKKyAgICAgIC8vIFNldCwgcmVzZXQsIGFuZCBmbGlwLgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFNldHMgZXZlcnkgYml0IHRvIHRydWUuCisgICAgICAgKi8KKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIHNldCgpCisgICAgICB7CisJdGhpcy0+X01fZG9fc2V0KCk7CisJdGhpcy0+X01fZG9fc2FuaXRpemUoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBTZXRzIGEgZ2l2ZW4gYml0IHRvIGEgcGFydGljdWxhciB2YWx1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBUaGUgaW5kZXggb2YgdGhlIGJpdC4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsICBFaXRoZXIgdHJ1ZSBvciBmYWxzZSwgZGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX3BvcyBpcyBiaWdnZXIgdGhlIHNpemUgb2YgdGhlICVzZXQuCisgICAgICAgKi8KKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIHNldChzaXplX3R5cGUgX19wb3MsIGJvb2wgX192YWwgPSB0cnVlKQorICAgICAgeworCWlmIChfX3BvcyA+PSBfTV9OYikKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiZHluYW1pY19iaXRzZXQ6OnNldCIpKTsKKwlyZXR1cm4gdGhpcy0+X01fdW5jaGVja2VkX3NldChfX3BvcywgX192YWwpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgU2V0cyBldmVyeSBiaXQgdG8gZmFsc2UuCisgICAgICAgKi8KKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsKKwl0aGlzLT5fTV9kb19yZXNldCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFNldHMgYSBnaXZlbiBiaXQgdG8gZmFsc2UuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgVGhlIGluZGV4IG9mIHRoZSBiaXQuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgaXMgYmlnZ2VyIHRoZSBzaXplIG9mIHRoZSAlc2V0LgorICAgICAgICoKKyAgICAgICAqICBTYW1lIGFzIHdyaXRpbmcgQGMgc2V0KF9fcG9zLCBmYWxzZSkuCisgICAgICAgKi8KKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIHJlc2V0KHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsKKwlpZiAoX19wb3MgPj0gX01fTmIpCisJICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oImR5bmFtaWNfYml0c2V0OjpyZXNldCIpKTsKKwlyZXR1cm4gdGhpcy0+X01fdW5jaGVja2VkX3Jlc2V0KF9fcG9zKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRvZ2dsZXMgZXZlcnkgYml0IHRvIGl0cyBvcHBvc2l0ZSB2YWx1ZS4KKyAgICAgICAqLworICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JgorICAgICAgZmxpcCgpCisgICAgICB7CisJdGhpcy0+X01fZG9fZmxpcCgpOworCXRoaXMtPl9NX2RvX3Nhbml0aXplKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVG9nZ2xlcyBhIGdpdmVuIGJpdCB0byBpdHMgb3Bwb3NpdGUgdmFsdWUuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgVGhlIGluZGV4IG9mIHRoZSBiaXQuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgaXMgYmlnZ2VyIHRoZSBzaXplIG9mIHRoZSAlc2V0LgorICAgICAgICovCisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mCisgICAgICBmbGlwKHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsKKwlpZiAoX19wb3MgPj0gX01fTmIpCisJICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oImR5bmFtaWNfYml0c2V0OjpmbGlwIikpOworCXJldHVybiB0aGlzLT5fTV91bmNoZWNrZWRfZmxpcChfX3Bvcyk7CisgICAgICB9CisKKyAgICAgIC8vLyBTZWUgdGhlIG5vLWFyZ3VtZW50IGZsaXAoKS4KKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPgorICAgICAgb3BlcmF0b3J+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPigqdGhpcykuZmxpcCgpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXJyYXktaW5kZXhpbmcgc3VwcG9ydC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBJbmRleCBpbnRvIHRoZSAlZHluYW1pY19iaXRzZXQuCisgICAgICAgKiAgQHJldHVybiBBIGJvb2wgZm9yIGEgJ2NvbnN0ICVkeW5hbWljX2JpdHNldCcuICBGb3Igbm9uLWNvbnN0CisgICAgICAgKiAgICAgICAgICAgYml0c2V0cywgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlZmVyZW5jZSBwcm94eSBjbGFzcy4KKyAgICAgICAqICBAbm90ZSBUaGVzZSBvcGVyYXRvcnMgZG8gbm8gcmFuZ2UgY2hlY2tpbmcgYW5kIHRocm93IG5vCisgICAgICAgKiAgICAgICAgIGV4Y2VwdGlvbnMsIGFzIHJlcXVpcmVkIGJ5IERSIDExIHRvIHRoZSBzdGFuZGFyZC4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsgcmV0dXJuIHJlZmVyZW5jZSgqdGhpcyxfX3Bvcyk7IH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3VuY2hlY2tlZF90ZXN0KF9fcG9zKTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgUmV0dXJucyBhIG51bWVyaWNhbCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgJWR5bmFtaWNfYml0c2V0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBpbnRlZ3JhbCBlcXVpdmFsZW50IG9mIHRoZSBiaXRzLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdmVyZmxvd19lcnJvciAgSWYgdGhlcmUgYXJlIHRvbyBtYW55IGJpdHMgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIGFuIEBjIHVuc2lnbmVkIEBjIGxvbmcuCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGxvbmcKKyAgICAgIHRvX3Vsb25nKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2RvX3RvX3Vsb25nKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFJldHVybnMgYSBudW1lcmljYWwgaW50ZXJwcmV0YXRpb24gb2YgdGhlICVkeW5hbWljX2JpdHNldC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgaW50ZWdyYWwgZXF1aXZhbGVudCBvZiB0aGUgYml0cy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3ZlcmZsb3dfZXJyb3IgIElmIHRoZXJlIGFyZSB0b28gbWFueSBiaXRzIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRlZCBpbiBhbiBAYyB1bnNpZ25lZCBAYyBsb25nLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICAgIHRvX3VsbG9uZygpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9kb190b191bGxvbmcoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgUmV0dXJucyBhIGNoYXJhY3RlciBpbnRlcnByZXRhdGlvbiBvZiB0aGUgJWR5bmFtaWNfYml0c2V0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBzdHJpbmcgZXF1aXZhbGVudCBvZiB0aGUgYml0cy4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGUgb3JkZXJpbmcgb2YgdGhlIGJpdHM6ICBkZWNyZWFzaW5nIGNoYXJhY3RlciBwb3NpdGlvbnMKKyAgICAgICAqICBjb3JyZXNwb25kIHRvIGluY3JlYXNpbmcgYml0IHBvc2l0aW9ucyAoc2VlIHRoZSBtYWluIGNsYXNzIG5vdGVzIGZvcgorICAgICAgICogIGFuIGV4YW1wbGUpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQgPSBjaGFyLAorCSAgICAgICB0eXBlbmFtZSBfVHJhaXRzID0gc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgICAgICB0eXBlbmFtZSBfQWxsb2MxID0gc3RkOjphbGxvY2F0b3I8X0NoYXJUPj4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYzE+CisJdG9fc3RyaW5nKF9DaGFyVCBfX3plcm8gPSBfQ2hhclQoJzAnKSwgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpIGNvbnN0CisJeworCSAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MxPiBfX3Jlc3VsdDsKKwkgIF9NX2NvcHlfdG9fc3RyaW5nKF9fcmVzdWx0LCBfX3plcm8sIF9fb25lKTsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisKKyAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHN0cmluZyBvcGVyYXRpb25zLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCXZvaWQKKwlfTV9jb3B5X2Zyb21fcHRyKGNvbnN0IF9DaGFyVCosIHNpemVfdCwgc2l6ZV90LCBzaXplX3QsCisJCQkgX0NoYXJULCBfQ2hhclQpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYzE+CisJdm9pZAorCV9NX2NvcHlfZnJvbV9zdHJpbmcoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULAorCQkJICAgIF9UcmFpdHMsIF9BbGxvYzE+JiBfX3N0ciwgc2l6ZV90IF9fcG9zLCBzaXplX3QgX19uLAorCQkJICAgIF9DaGFyVCBfX3plcm8gPSBfQ2hhclQoJzAnKSwKKwkJCSAgICBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkKKwl7IF9NX2NvcHlfZnJvbV9wdHI8X0NoYXJULCBfVHJhaXRzPihfX3N0ci5kYXRhKCksIF9fc3RyLnNpemUoKSwKKwkJCQkJICAgIF9fcG9zLCBfX24sIF9femVybywgX19vbmUpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jMT4KKwl2b2lkCisJX01fY29weV90b19zdHJpbmcoc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MxPiYgX19zdHIsCisJCQkgIF9DaGFyVCBfX3plcm8gPSBfQ2hhclQoJzAnKSwKKwkJCSAgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpIGNvbnN0OworCisgICAgICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgd2hpY2ggYXJlIHNldC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZG9fY291bnQoKTsgfQorCisgICAgICAvLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJpdHMuCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fTmI7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBibG9ja3MuCisgICAgICBzaXplX3R5cGUKKyAgICAgIG51bV9ibG9ja3MoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fc2l6ZSgpOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGR5bmFtaWNfYml0c2V0IGlzIGVtcHR5LgorICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gKHRoaXMtPl9NX05iID09IDApOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgYSBkeW5hbWljX2JpdHNldCBvYmplY3QgaGF2aW5nIHRoZSBzYW1lCisgICAgICAvLy8gdHlwZSBhcyAqdGhpcy4KKyAgICAgIC8vLyBUaGUgcmVhbCBhbnN3ZXIgaXMgbWF4KCkgKiBiaXRzX3Blcl9ibG9jayBidXQgaXMgbGlrZWx5IHRvIG92ZXJmbG93LgorICAgICAgY29uc3RleHByIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxibG9ja190eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRlc3RzIHRoZSB2YWx1ZSBvZiBhIGJpdC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBUaGUgaW5kZXggb2YgYSBiaXQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHZhbHVlIGF0IEBhIF9fcG9zLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zIGlzIGJpZ2dlciB0aGUgc2l6ZSBvZiB0aGUgJXNldC4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgdGVzdChzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgICB7CisJaWYgKF9fcG9zID49IF9NX05iKQorCSAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJkeW5hbWljX2JpdHNldDo6dGVzdCIpKTsKKwlyZXR1cm4gX01fdW5jaGVja2VkX3Rlc3QoX19wb3MpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVGVzdHMgd2hldGhlciBhbGwgdGhlIGJpdHMgYXJlIG9uLgorICAgICAgICogIEByZXR1cm4gIFRydWUgaWYgYWxsIHRoZSBiaXRzIGFyZSBzZXQuCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGFsbCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9hcmVfYWxsX2F1eCgpID09IF9NX05iOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUZXN0cyB3aGV0aGVyIGFueSBvZiB0aGUgYml0cyBhcmUgb24uCisgICAgICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgYml0IGlzIHNldC4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgYW55KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2lzX2FueSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUZXN0cyB3aGV0aGVyIGFueSBvZiB0aGUgYml0cyBhcmUgb24uCisgICAgICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBub25lIG9mIHRoZSBiaXRzIGFyZSBzZXQuCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIG5vbmUoKSBjb25zdAorICAgICAgeyByZXR1cm4gIXRoaXMtPl9NX2lzX2FueSgpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBTZWxmLWV4cGxhbmF0b3J5LgorICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+CisgICAgICBvcGVyYXRvcjw8KHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPigqdGhpcykgPDw9IF9fcG9zOyB9CisKKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPgorICAgICAgb3BlcmF0b3I+PihzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgICB7IHJldHVybiBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4oKnRoaXMpID4+PSBfX3BvczsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmRzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgIm9uIiBiaXQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBiaXQgc2V0LCBvciBzaXplKCkgaWYgbm90IGZvdW5kLgorICAgICAgICogIEBzYSAgZmluZF9uZXh0CisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9kb19maW5kX2ZpcnN0KHRoaXMtPl9NX05iKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmRzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCAib24iIGJpdCBhZnRlciBwcmV2LgorICAgICAgICogIEByZXR1cm4gIFRoZSBpbmRleCBvZiB0aGUgbmV4dCBiaXQgc2V0LCBvciBzaXplKCkgaWYgbm90IGZvdW5kLgorICAgICAgICogIEBwYXJhbSAgX19wcmV2ICBXaGVyZSB0byBzdGFydCBzZWFyY2hpbmcuCisgICAgICAgKiAgQHNhICBmaW5kX2ZpcnN0CisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9uZXh0KHNpemVfdCBfX3ByZXYpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9kb19maW5kX25leHQoX19wcmV2LCB0aGlzLT5fTV9OYik7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfc3Vic2V0X29mKGNvbnN0IGR5bmFtaWNfYml0c2V0JiBfX2IpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pc19zdWJzZXRfb2YoX19iKTsgfQorCisgICAgICBib29sCisgICAgICBpc19wcm9wZXJfc3Vic2V0X29mKGNvbnN0IGR5bmFtaWNfYml0c2V0JiBfX2IpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pc19wcm9wZXJfc3Vic2V0X29mKF9fYik7IH0KKyAgICB9OworCisgIC8vIERlZmluaXRpb25zIG9mIG5vbi1pbmxpbmUgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgdm9pZAorICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+OjoKKyAgICAgIF9NX2NvcHlfZnJvbV9wdHIoY29uc3QgX0NoYXJUKiBfX3N0ciwgc2l6ZV90IF9fbGVuLAorCQkgICAgICAgc2l6ZV90IF9fcG9zLCBzaXplX3QgX19uLCBfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUpCisgICAgICB7CisJcmVzZXQoKTsKKwljb25zdCBzaXplX3QgX19uYml0cyA9IHN0ZDo6bWluKF9NX05iLCBzdGQ6Om1pbihfX24sIF9fbGVuIC0gX19wb3MpKTsKKwlmb3IgKHNpemVfdCBfX2kgPSBfX25iaXRzOyBfX2kgPiAwOyAtLV9faSkKKwkgIHsKKwkgICAgY29uc3QgX0NoYXJUIF9fYyA9IF9fc3RyW19fcG9zICsgX19uYml0cyAtIF9faV07CisJICAgIGlmIChfVHJhaXRzOjplcShfX2MsIF9femVybykpCisJICAgICAgOworCSAgICBlbHNlIGlmIChfVHJhaXRzOjplcShfX2MsIF9fb25lKSkKKwkgICAgICBfTV91bmNoZWNrZWRfc2V0KF9faSAtIDEpOworCSAgICBlbHNlCisJICAgICAgX190aHJvd19pbnZhbGlkX2FyZ3VtZW50KF9fTigiZHluYW1pY19iaXRzZXQ6Ol9NX2NvcHlfZnJvbV9wdHIiKSk7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MxPgorICAgICAgdm9pZAorICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+OjoKKyAgICAgIF9NX2NvcHlfdG9fc3RyaW5nKHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jMT4mIF9fc3RyLAorCQkJX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lKSBjb25zdAorICAgICAgeworCV9fc3RyLmFzc2lnbihfTV9OYiwgX196ZXJvKTsKKwlmb3IgKHNpemVfdCBfX2kgPSBfTV9OYjsgX19pID4gMDsgLS1fX2kpCisJICBpZiAoX01fdW5jaGVja2VkX3Rlc3QoX19pIC0gMSkpCisJICAgIF9UcmFpdHM6OmFzc2lnbihfX3N0cltfTV9OYiAtIF9faV0sIF9fb25lKTsKKyAgICAgIH0KKworCisgIC8vQHsKKyAgLy8vIFRoZXNlIGNvbXBhcmlzb25zIGZvciBlcXVhbGl0eS9pbmVxdWFsaXR5IGFyZSwgd2VsbCwgQGUgYml0d2lzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9pc19lcXVhbChfX3Jocyk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuICFfX2xocy5fTV9pc19lcXVhbChfX3Jocyk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9pc19sZXNzKF9fcmhzKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Xb3JkVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA+IF9fcmhzKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Xb3JkVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzIDwgX19saHM7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7IH0KKyAgLy9AfQorCisgIC8vIDIzLjMuNS4zIGJpdHNldCBvcGVyYXRpb25zOgorICAvL0B7CisgIC8qKgorICAgKiAgQGJyaWVmICBHbG9iYWwgYml0d2lzZSBvcGVyYXRpb25zIG9uIGJpdHNldHMuCisgICAqICBAcGFyYW0gIF9feCAgQSBiaXRzZXQuCisgICAqICBAcGFyYW0gIF9feSAgQSBiaXRzZXQgb2YgdGhlIHNhbWUgc2l6ZSBhcyBAYSBfX3guCisgICAqICBAcmV0dXJuICBBIG5ldyBiaXRzZXQuCisgICAqCisgICAqICBUaGVzZSBzaG91bGQgYmUgc2VsZi1leHBsYW5hdG9yeS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Xb3JkVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4KKyAgICBvcGVyYXRvciYoY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3kpCisgICAgeworICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+IF9fcmVzdWx0KF9feCk7CisgICAgICBfX3Jlc3VsdCAmPSBfX3k7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Xb3JkVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcnwoY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3kpCisgICAgeworICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+IF9fcmVzdWx0KF9feCk7CisgICAgICBfX3Jlc3VsdCB8PSBfX3k7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+CisgICAgb3BlcmF0b3JeKGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX195KQorICAgIHsKKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiBfX3Jlc3VsdChfX3gpOworICAgICAgX19yZXN1bHQgXj0gX195OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yLShjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9feSkKKyAgICB7CisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4gX19yZXN1bHQoX194KTsKKyAgICAgIF9fcmVzdWx0IC09IF9feTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisgIC8vQH0KKworICAvL0B7CisgIC8qKgorICAgKiAgQGJyaWVmIEdsb2JhbCBJL08gb3BlcmF0b3JzIGZvciBiaXRzZXRzLgorICAgKgorICAgKiAgRGlyZWN0IEkvTyBiZXR3ZWVuIHN0cmVhbXMgYW5kIGJpdHNldHMgaXMgc3VwcG9ydGVkLiAgT3V0cHV0IGlzCisgICAqICBzdHJhaWdodGZvcndhcmQuICBJbnB1dCB3aWxsIHNraXAgd2hpdGVzcGFjZSBhbmQgb25seSBhY2NlcHQgJzAnCisgICAqICBhbmQgJzEnIGNoYXJhY3RlcnMuICBUaGUgJWR5bmFtaWNfYml0c2V0IHdpbGwgZ3JvdyBhcyBuZWNlc3NhcnkKKyAgICogIHRvIGhvbGQgdGhlIHN0cmluZyBvZiBiaXRzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLAorCSAgIHR5cGVuYW1lIF9Xb3JkVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzPiBfX3RtcDsKKyAgICAgIF9fdG1wLnJlc2VydmUoX194LnNpemUoKSk7CisKKyAgICAgIGNvbnN0IGNoYXJfdHlwZSBfX3plcm8gPSBfX2lzLndpZGVuKCcwJyk7CisgICAgICBjb25zdCBjaGFyX3R5cGUgX19vbmUgPSBfX2lzLndpZGVuKCcxJyk7CisKKyAgICAgIHR5cGVuYW1lIF9faW9zX2Jhc2U6Omlvc3RhdGUgX19zdGF0ZSA9IF9faW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6c2VudHJ5IF9fc2VudHJ5KF9faXMpOworICAgICAgaWYgKF9fc2VudHJ5KQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICB3aGlsZSAoMSkKKwkJeworCQkgIHN0YXRpYyB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX2VvZiA9IF9UcmFpdHM6OmVvZigpOworCisJCSAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX19jMSA9IF9faXMucmRidWYoKS0+c2J1bXBjKCk7CisJCSAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYzEsIF9fZW9mKSkKKwkJICAgIHsKKwkJICAgICAgX19zdGF0ZSB8PSBfX2lvc19iYXNlOjplb2ZiaXQ7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgY29uc3QgY2hhcl90eXBlIF9fYzIgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jMSk7CisJCSAgICAgIGlmIChfVHJhaXRzOjplcShfX2MyLCBfX3plcm8pKQorCQkJX190bXAucHVzaF9iYWNrKF9femVybyk7CisJCSAgICAgIGVsc2UgaWYgKF9UcmFpdHM6OmVxKF9fYzIsIF9fb25lKSkKKwkJCV9fdG1wLnB1c2hfYmFjayhfX29uZSk7CisJCSAgICAgIGVsc2UgaWYgKF9UcmFpdHM6OgorCQkJICAgICAgIGVxX2ludF90eXBlKF9faXMucmRidWYoKS0+c3B1dGJhY2tjKF9fYzIpLAorCQkJCQkgICBfX2VvZikpCisJCQl7CisJCQkgIF9fc3RhdGUgfD0gX19pb3NfYmFzZTo6ZmFpbGJpdDsKKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIF9faXMuX01fc2V0c3RhdGUoX19pb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgX19pcy5fTV9zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOyB9CisJfQorCisgICAgICBfX3gucmVzaXplKF9fdG1wLnNpemUoKSk7CisKKyAgICAgIGlmIChfX3RtcC5lbXB0eSgpICYmIF9feC5zaXplKCkpCisJX19zdGF0ZSB8PSBfX2lvc19iYXNlOjpmYWlsYml0OworICAgICAgZWxzZQorCV9feC5fTV9jb3B5X2Zyb21fc3RyaW5nKF9fdG1wLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDApLCBfX3guc2l6ZSgpLAorCQkJCV9femVybywgX19vbmUpOworICAgICAgaWYgKF9fc3RhdGUpCisJX19pcy5zZXRzdGF0ZShfX3N0YXRlKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLAorCSAgICB0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9feCkKKyAgICB7CisgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHM+IF9fdG1wOworCisgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0ID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4+KF9fb3MuZ2V0bG9jKCkpOworICAgICAgX194Ll9NX2NvcHlfdG9fc3RyaW5nKF9fdG1wLCBfX2N0LndpZGVuKCcwJyksIF9fY3Qud2lkZW4oJzEnKSk7CisgICAgICByZXR1cm4gX19vcyA8PCBfX3RtcDsKKyAgICB9CisgIC8vQH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIHRyMgorfSAvLyBzdGQKKworI3VuZGVmIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JECisKKyNlbmRpZiAvKiBfR0xJQkNYWF9UUjJfRFlOQU1JQ19CSVRTRVQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIyL3JhdGlvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjIvcmF0aW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4ZDU4NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIyL3JhdGlvCkBAIC0wLDAgKzEsNTkgQEAKKy8vIFRSMiA8cmF0aW8+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjIvcmF0aW8KKyAqICBUaGlzIGlzIGEgVFIyIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaW5jbHVkZSA8cmF0aW8+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMgoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTxpbnRtYXhfdCBfUG4sIHNpemVfdCBfQml0LAorCSAgICAgYm9vbCA9IF9CaXQgPCBzdGF0aWNfY2FzdDxzaXplX3Q+CisJCQkgIChzdGQ6Om51bWVyaWNfbGltaXRzPGludG1heF90Pjo6ZGlnaXRzKT4KKyAgICBzdHJ1Y3QgX19zYWZlX2xzaGlmdAorICAgIHsgc3RhdGljIGNvbnN0IGludG1heF90IF9fdmFsdWUgPSAwOyB9OworCisgICAgdGVtcGxhdGU8aW50bWF4X3QgX1BuLCBzaXplX3QgX0JpdD4KKyAgICAgIHN0cnVjdCBfX3NhZmVfbHNoaWZ0PF9QbiwgX0JpdCwgdHJ1ZT4KKyAgICAgIHsgc3RhdGljIGNvbnN0IGludG1heF90IF9fdmFsdWUgPSBfUG4gPDwgX0JpdDsgfTsKKworICAvLy8gQWRkIGJpbmFyeSBwcmVmaXhlcyAoSUVDIDYwMDI3LTIgQS4yIGFuZCBJU08vSUVDIDgwMDAwKS4KKyAgdHlwZWRlZiByYXRpbzxfX3NhZmVfbHNoaWZ0PDEsIDEwPjo6X192YWx1ZSwgMT4ga2liaTsKKyAgdHlwZWRlZiByYXRpbzxfX3NhZmVfbHNoaWZ0PDEsIDIwPjo6X192YWx1ZSwgMT4gbWViaTsKKyAgdHlwZWRlZiByYXRpbzxfX3NhZmVfbHNoaWZ0PDEsIDMwPjo6X192YWx1ZSwgMT4gZ2liaTsKKyAgdHlwZWRlZiByYXRpbzxfX3NhZmVfbHNoaWZ0PDEsIDQwPjo6X192YWx1ZSwgMT4gdGViaTsKKyAgdHlwZWRlZiByYXRpbzxfX3NhZmVfbHNoaWZ0PDEsIDUwPjo6X192YWx1ZSwgMT4gcGViaTsKKyAgdHlwZWRlZiByYXRpbzxfX3NhZmVfbHNoaWZ0PDEsIDYwPjo6X192YWx1ZSwgMT4gZXhiaTsKKyAgLy90eXBlZGVmIHJhdGlvPF9fc2FmZV9sc2hpZnQ8MSwgNzA+OjpfX3ZhbHVlLCAxPiB6ZWJpOworICAvL3R5cGVkZWYgcmF0aW88X19zYWZlX2xzaGlmdDwxLCA4MD46Ol9fdmFsdWUsIDE+IHlvYmk7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjIvdHlwZV90cmFpdHMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMi90eXBlX3RyYWl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjE2MTI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjIvdHlwZV90cmFpdHMKQEAgLTAsMCArMSwxMDYgQEAKKy8vIFRSMiA8dHlwZV90cmFpdHM+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjIvdHlwZV90cmFpdHMKKyAqICBUaGlzIGlzIGEgVFIyIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMl9UWVBFX1RSQUlUUworI2RlZmluZSBfR0xJQkNYWF9UUjJfVFlQRV9UUkFJVFMgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIyCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBtZXRhcHJvZ3JhbW1pbmcKKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqICBTZWUgTjI5NjU6IFR5cGUgdHJhaXRzIGFuZCBiYXNlIGNsYXNzZXMKKyAgICogIGJ5IE1pY2hhZWwgU3BlcnR1cworICAgKi8KKworICAvKioKKyAgICogIFNpbXBsZSB0eXBlbGlzdC4gQ29tcGlsZS10aW1lIGxpc3Qgb2YgdHlwZXMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgc3RydWN0IF9fcmVmbGVjdGlvbl90eXBlbGlzdDsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGVtcHR5IHR5cGVsaXN0LgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fcmVmbGVjdGlvbl90eXBlbGlzdDw+CisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OnRydWVfdHlwZQkJCQkJZW1wdHk7CisgICAgfTsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZpcnN0LCB0eXBlbmFtZS4uLiBfUmVzdD4KKyAgICBzdHJ1Y3QgX19yZWZsZWN0aW9uX3R5cGVsaXN0PF9GaXJzdCwgX1Jlc3QuLi4+CisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmZhbHNlX3R5cGUJCQkJCWVtcHR5OworCisgICAgICBzdHJ1Y3QgZmlyc3QKKyAgICAgIHsKKwl0eXBlZGVmIF9GaXJzdAkJCQkJCXR5cGU7CisgICAgICB9OworCisgICAgICBzdHJ1Y3QgcmVzdAorICAgICAgeworCXR5cGVkZWYgX19yZWZsZWN0aW9uX3R5cGVsaXN0PF9SZXN0Li4uPgkJCXR5cGU7CisgICAgICB9OworICAgIH07CisKKyAgLy8vIFNlcXVlbmNlIGFic3RyYWN0aW9uIG1ldGFmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBhIHR5cGVsaXN0LgorCisKKworICAvLy8gRW51bWVyYXRlIGFsbCB0aGUgYmFzZSBjbGFzc2VzIG9mIGEgY2xhc3MuIEZvcm0gb2YgYSB0eXBlbGlzdC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBiYXNlcworICAgIHsKKyAgICAgIHR5cGVkZWYgX19yZWZsZWN0aW9uX3R5cGVsaXN0PF9fYmFzZXMoX1RwKS4uLj4JCXR5cGU7CisgICAgfTsKKworICAvLy8gRW51bWVyYXRlIGFsbCB0aGUgZGlyZWN0IGJhc2UgY2xhc3NlcyBvZiBhIGNsYXNzLiBGb3JtIG9mIGEgdHlwZWxpc3QuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgZGlyZWN0X2Jhc2VzCisgICAgeworICAgICAgdHlwZWRlZiBfX3JlZmxlY3Rpb25fdHlwZWxpc3Q8X19kaXJlY3RfYmFzZXMoX1RwKS4uLj4JdHlwZTsKKyAgICB9OworCisgIC8vLyBAfSBncm91cCBtZXRhcHJvZ3JhbW1pbmcKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjJfVFlQRV9UUkFJVFMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHVwbGUgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3R1cGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYjMwZTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3R1cGxlCkBAIC0wLDAgKzEsMTA5OCBAQAorLy8gPHR1cGxlPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS90dXBsZQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UVVBMRQorI2RlZmluZSBfR0xJQkNYWF9UVVBMRSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGJpdHMvdXNlc19hbGxvY2F0b3IuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGFkZHRvZ3JvdXAgdXRpbGl0aWVzCisgICAqICBAeworICAgKi8KKworICAvLyBBZGRzIGEgY29uc3QgcmVmZXJlbmNlIHRvIGEgbm9uLXJlZmVyZW5jZSB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX2NfcmVmCisgICAgeyB0eXBlZGVmIGNvbnN0IF9UcCYgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX2NfcmVmPF9UcCY+CisgICAgeyB0eXBlZGVmIF9UcCYgdHlwZTsgfTsKKworICAvLyBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgbm9uLXJlZmVyZW5jZSB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX3JlZgorICAgIHsgdHlwZWRlZiBfVHAmIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FkZF9yZWY8X1RwJj4KKyAgICB7IHR5cGVkZWYgX1RwJiB0eXBlOyB9OworCisgIC8vIEFkZHMgYW4gcnZhbHVlIHJlZmVyZW5jZSB0byBhIG5vbi1yZWZlcmVuY2UgdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FkZF9yX3JlZgorICAgIHsgdHlwZWRlZiBfVHAmJiB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfcl9yZWY8X1RwJj4KKyAgICB7IHR5cGVkZWYgX1RwJiB0eXBlOyB9OworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JZHgsIHR5cGVuYW1lIF9IZWFkLCBib29sIF9Jc0VtcHR5Tm90RmluYWw+CisgICAgc3RydWN0IF9IZWFkX2Jhc2U7CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0lkeCwgdHlwZW5hbWUgX0hlYWQ+CisgICAgc3RydWN0IF9IZWFkX2Jhc2U8X0lkeCwgX0hlYWQsIHRydWU+CisgICAgOiBwdWJsaWMgX0hlYWQKKyAgICB7CisgICAgICBjb25zdGV4cHIgX0hlYWRfYmFzZSgpCisgICAgICA6IF9IZWFkKCkgeyB9CisKKyAgICAgIGNvbnN0ZXhwciBfSGVhZF9iYXNlKGNvbnN0IF9IZWFkJiBfX2gpCisgICAgICA6IF9IZWFkKF9faCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSGVhZCwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBlbmFibGVfaWY8IWlzX2NvbnZlcnRpYmxlPF9VSGVhZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3VzZXNfYWxsb2NfYmFzZT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgY29uc3RleHByIF9IZWFkX2Jhc2UoX1VIZWFkJiYgX19oKQorCTogX0hlYWQoc3RkOjpmb3J3YXJkPF9VSGVhZD4oX19oKSkgeyB9CisKKyAgICAgIF9IZWFkX2Jhc2UoX191c2VzX2FsbG9jMCkKKyAgICAgIDogX0hlYWQoKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCV9IZWFkX2Jhc2UoX191c2VzX2FsbG9jMTxfQWxsb2M+IF9fYSkKKwk6IF9IZWFkKGFsbG9jYXRvcl9hcmcsICpfX2EuX01fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKwlfSGVhZF9iYXNlKF9fdXNlc19hbGxvYzI8X0FsbG9jPiBfX2EpCisJOiBfSGVhZCgqX19hLl9NX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUhlYWQ+CisJX0hlYWRfYmFzZShfX3VzZXNfYWxsb2MwLCBfVUhlYWQmJiBfX3VoZWFkKQorCTogX0hlYWQoc3RkOjpmb3J3YXJkPF9VSGVhZD4oX191aGVhZCkpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9VSGVhZD4KKwlfSGVhZF9iYXNlKF9fdXNlc19hbGxvYzE8X0FsbG9jPiBfX2EsIF9VSGVhZCYmIF9fdWhlYWQpCisJOiBfSGVhZChhbGxvY2F0b3JfYXJnLCAqX19hLl9NX2EsIHN0ZDo6Zm9yd2FyZDxfVUhlYWQ+KF9fdWhlYWQpKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfVUhlYWQ+CisJX0hlYWRfYmFzZShfX3VzZXNfYWxsb2MyPF9BbGxvYz4gX19hLCBfVUhlYWQmJiBfX3VoZWFkKQorCTogX0hlYWQoc3RkOjpmb3J3YXJkPF9VSGVhZD4oX191aGVhZCksICpfX2EuX01fYSkgeyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX0hlYWQmCisgICAgICBfTV9oZWFkKF9IZWFkX2Jhc2UmIF9fYikgbm9leGNlcHQgeyByZXR1cm4gX19iOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgX0hlYWQmCisgICAgICBfTV9oZWFkKGNvbnN0IF9IZWFkX2Jhc2UmIF9fYikgbm9leGNlcHQgeyByZXR1cm4gX19iOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSWR4LCB0eXBlbmFtZSBfSGVhZD4KKyAgICBzdHJ1Y3QgX0hlYWRfYmFzZTxfSWR4LCBfSGVhZCwgZmFsc2U+CisgICAgeworICAgICAgY29uc3RleHByIF9IZWFkX2Jhc2UoKQorICAgICAgOiBfTV9oZWFkX2ltcGwoKSB7IH0KKworICAgICAgY29uc3RleHByIF9IZWFkX2Jhc2UoY29uc3QgX0hlYWQmIF9faCkKKyAgICAgIDogX01faGVhZF9pbXBsKF9faCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSGVhZCwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBlbmFibGVfaWY8IWlzX2NvbnZlcnRpYmxlPF9VSGVhZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3VzZXNfYWxsb2NfYmFzZT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgY29uc3RleHByIF9IZWFkX2Jhc2UoX1VIZWFkJiYgX19oKQorCTogX01faGVhZF9pbXBsKHN0ZDo6Zm9yd2FyZDxfVUhlYWQ+KF9faCkpIHsgfQorCisgICAgICBfSGVhZF9iYXNlKF9fdXNlc19hbGxvYzApCisgICAgICA6IF9NX2hlYWRfaW1wbCgpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisJX0hlYWRfYmFzZShfX3VzZXNfYWxsb2MxPF9BbGxvYz4gX19hKQorCTogX01faGVhZF9pbXBsKGFsbG9jYXRvcl9hcmcsICpfX2EuX01fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKwlfSGVhZF9iYXNlKF9fdXNlc19hbGxvYzI8X0FsbG9jPiBfX2EpCisJOiBfTV9oZWFkX2ltcGwoKl9fYS5fTV9hKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VIZWFkPgorCV9IZWFkX2Jhc2UoX191c2VzX2FsbG9jMCwgX1VIZWFkJiYgX191aGVhZCkKKwk6IF9NX2hlYWRfaW1wbChzdGQ6OmZvcndhcmQ8X1VIZWFkPihfX3VoZWFkKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1VIZWFkPgorCV9IZWFkX2Jhc2UoX191c2VzX2FsbG9jMTxfQWxsb2M+IF9fYSwgX1VIZWFkJiYgX191aGVhZCkKKwk6IF9NX2hlYWRfaW1wbChhbGxvY2F0b3JfYXJnLCAqX19hLl9NX2EsIHN0ZDo6Zm9yd2FyZDxfVUhlYWQ+KF9fdWhlYWQpKQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9VSGVhZD4KKwlfSGVhZF9iYXNlKF9fdXNlc19hbGxvYzI8X0FsbG9jPiBfX2EsIF9VSGVhZCYmIF9fdWhlYWQpCisJOiBfTV9oZWFkX2ltcGwoc3RkOjpmb3J3YXJkPF9VSGVhZD4oX191aGVhZCksICpfX2EuX01fYSkgeyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX0hlYWQmCisgICAgICBfTV9oZWFkKF9IZWFkX2Jhc2UmIF9fYikgbm9leGNlcHQgeyByZXR1cm4gX19iLl9NX2hlYWRfaW1wbDsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IF9IZWFkJgorICAgICAgX01faGVhZChjb25zdCBfSGVhZF9iYXNlJiBfX2IpIG5vZXhjZXB0IHsgcmV0dXJuIF9fYi5fTV9oZWFkX2ltcGw7IH0KKworICAgICAgX0hlYWQgX01faGVhZF9pbXBsOworICAgIH07CisKKyAgLyoqCisgICAqIENvbnRhaW5zIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEBjIHR1cGxlIHRlbXBsYXRlLCBzdG9yZWQKKyAgICogYXMgYSByZWN1cnNpdmUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGZyb20gdGhlIGZpcnN0IGVsZW1lbnQgKG1vc3QKKyAgICogZGVyaXZlZCBjbGFzcykgdG8gdGhlIGxhc3QgKGxlYXN0IGRlcml2ZWQgY2xhc3MpLiBUaGUgQGMgSWR4CisgICAqIHBhcmFtZXRlciBnaXZlcyB0aGUgMC1iYXNlZCBpbmRleCBvZiB0aGUgZWxlbWVudCBzdG9yZWQgYXQgdGhpcworICAgKiBwb2ludCBpbiB0aGUgaGllcmFyY2h5OyB3ZSB1c2UgaXQgdG8gaW1wbGVtZW50IGEgY29uc3RhbnQtdGltZQorICAgKiBnZXQoKSBvcGVyYXRpb24uCisgICAqLworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSWR4LCB0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgc3RydWN0IF9UdXBsZV9pbXBsOyAKKworICAvKioKKyAgICogWmVyby1lbGVtZW50IHR1cGxlIGltcGxlbWVudGF0aW9uLiBUaGlzIGlzIHRoZSBiYXNpcyBjYXNlIGZvciB0aGUgCisgICAqIGluaGVyaXRhbmNlIHJlY3Vyc2lvbi4KKyAgICovCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JZHg+CisgICAgc3RydWN0IF9UdXBsZV9pbXBsPF9JZHg+CisgICAgeworICAgICAgdGVtcGxhdGU8c3RkOjpzaXplX3QsIHR5cGVuYW1lLi4uPiBmcmllbmQgY2xhc3MgX1R1cGxlX2ltcGw7CisKKyAgICAgIF9UdXBsZV9pbXBsKCkgPSBkZWZhdWx0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgICAgIF9UdXBsZV9pbXBsKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgICAgX1R1cGxlX2ltcGwoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmLCBjb25zdCBfVHVwbGVfaW1wbCYpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgICAgIF9UdXBsZV9pbXBsKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiwgX1R1cGxlX2ltcGwmJikgeyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2b2lkIF9NX3N3YXAoX1R1cGxlX2ltcGwmKSBub2V4Y2VwdCB7IC8qIG5vLW9wICovIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19lbXB0eV9ub25fdHVwbGUgOiBpc19lbXB0eTxfVHA+IHsgfTsKKworICAvLyBVc2luZyBFQk8gZm9yIGVsZW1lbnRzIHRoYXQgYXJlIHR1cGxlcyBjYXVzZXMgYW1iaWd1b3VzIGJhc2UgZXJyb3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRWwwLCB0eXBlbmFtZS4uLiBfRWw+CisgICAgc3RydWN0IF9faXNfZW1wdHlfbm9uX3R1cGxlPHR1cGxlPF9FbDAsIF9FbC4uLj4+IDogZmFsc2VfdHlwZSB7IH07CisKKyAgLy8gVXNlIHRoZSBFbXB0eSBCYXNlLWNsYXNzIE9wdGltaXphdGlvbiBmb3IgZW1wdHksIG5vbi1maW5hbCB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHVzaW5nIF9fZW1wdHlfbm90X2ZpbmFsCisgICAgPSB0eXBlbmFtZSBjb25kaXRpb25hbDxfX2lzX2ZpbmFsKF9UcCksIGZhbHNlX3R5cGUsCisJCQkgICBfX2lzX2VtcHR5X25vbl90dXBsZTxfVHA+Pjo6dHlwZTsKKworICAvKioKKyAgICogUmVjdXJzaXZlIHR1cGxlIGltcGxlbWVudGF0aW9uLiBIZXJlIHdlIHN0b3JlIHRoZSBAYyBIZWFkIGVsZW1lbnQKKyAgICogYW5kIGRlcml2ZSBmcm9tIGEgQGMgVHVwbGVfaW1wbCBjb250YWluaW5nIHRoZSByZW1haW5pbmcgZWxlbWVudHMKKyAgICogKHdoaWNoIGNvbnRhaW5zIHRoZSBAYyBUYWlsKS4KKyAgICovCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JZHgsIHR5cGVuYW1lIF9IZWFkLCB0eXBlbmFtZS4uLiBfVGFpbD4KKyAgICBzdHJ1Y3QgX1R1cGxlX2ltcGw8X0lkeCwgX0hlYWQsIF9UYWlsLi4uPgorICAgIDogcHVibGljIF9UdXBsZV9pbXBsPF9JZHggKyAxLCBfVGFpbC4uLj4sCisgICAgICBwcml2YXRlIF9IZWFkX2Jhc2U8X0lkeCwgX0hlYWQsIF9fZW1wdHlfbm90X2ZpbmFsPF9IZWFkPjo6dmFsdWU+CisgICAgeworICAgICAgdGVtcGxhdGU8c3RkOjpzaXplX3QsIHR5cGVuYW1lLi4uPiBmcmllbmQgY2xhc3MgX1R1cGxlX2ltcGw7CisKKyAgICAgIHR5cGVkZWYgX1R1cGxlX2ltcGw8X0lkeCArIDEsIF9UYWlsLi4uPiBfSW5oZXJpdGVkOworICAgICAgdHlwZWRlZiBfSGVhZF9iYXNlPF9JZHgsIF9IZWFkLCBfX2VtcHR5X25vdF9maW5hbDxfSGVhZD46OnZhbHVlPiBfQmFzZTsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBfSGVhZCYgIAorICAgICAgX01faGVhZChfVHVwbGVfaW1wbCYgX190KSBub2V4Y2VwdCB7IHJldHVybiBfQmFzZTo6X01faGVhZChfX3QpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgX0hlYWQmCisgICAgICBfTV9oZWFkKGNvbnN0IF9UdXBsZV9pbXBsJiBfX3QpIG5vZXhjZXB0IHsgcmV0dXJuIF9CYXNlOjpfTV9oZWFkKF9fdCk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBfSW5oZXJpdGVkJgorICAgICAgX01fdGFpbChfVHVwbGVfaW1wbCYgX190KSBub2V4Y2VwdCB7IHJldHVybiBfX3Q7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBfSW5oZXJpdGVkJgorICAgICAgX01fdGFpbChjb25zdCBfVHVwbGVfaW1wbCYgX190KSBub2V4Y2VwdCB7IHJldHVybiBfX3Q7IH0KKworICAgICAgY29uc3RleHByIF9UdXBsZV9pbXBsKCkKKyAgICAgIDogX0luaGVyaXRlZCgpLCBfQmFzZSgpIHsgfQorCisgICAgICBleHBsaWNpdCAKKyAgICAgIGNvbnN0ZXhwciBfVHVwbGVfaW1wbChjb25zdCBfSGVhZCYgX19oZWFkLCBjb25zdCBfVGFpbCYuLi4gX190YWlsKQorICAgICAgOiBfSW5oZXJpdGVkKF9fdGFpbC4uLiksIF9CYXNlKF9faGVhZCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSGVhZCwgdHlwZW5hbWUuLi4gX1VUYWlsLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgICAgICAgICBlbmFibGVfaWY8c2l6ZW9mLi4uKF9UYWlsKSA9PSBzaXplb2YuLi4oX1VUYWlsKT46OnR5cGU+IAorICAgICAgICBleHBsaWNpdAorICAgICAgICBjb25zdGV4cHIgX1R1cGxlX2ltcGwoX1VIZWFkJiYgX19oZWFkLCBfVVRhaWwmJi4uLiBfX3RhaWwpCisJOiBfSW5oZXJpdGVkKHN0ZDo6Zm9yd2FyZDxfVVRhaWw+KF9fdGFpbCkuLi4pLAorCSAgX0Jhc2Uoc3RkOjpmb3J3YXJkPF9VSGVhZD4oX19oZWFkKSkgeyB9CisKKyAgICAgIGNvbnN0ZXhwciBfVHVwbGVfaW1wbChjb25zdCBfVHVwbGVfaW1wbCYpID0gZGVmYXVsdDsKKworICAgICAgY29uc3RleHByCisgICAgICBfVHVwbGVfaW1wbChfVHVwbGVfaW1wbCYmIF9faW4pCisgICAgICBub2V4Y2VwdChfX2FuZF88aXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8X0hlYWQ+LAorCSAgICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8X0luaGVyaXRlZD4+Ojp2YWx1ZSkKKyAgICAgIDogX0luaGVyaXRlZChzdGQ6Om1vdmUoX01fdGFpbChfX2luKSkpLCAKKwlfQmFzZShzdGQ6OmZvcndhcmQ8X0hlYWQ+KF9NX2hlYWQoX19pbikpKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICAgICAgY29uc3RleHByIF9UdXBsZV9pbXBsKGNvbnN0IF9UdXBsZV9pbXBsPF9JZHgsIF9VRWxlbWVudHMuLi4+JiBfX2luKQorCTogX0luaGVyaXRlZChfVHVwbGVfaW1wbDxfSWR4LCBfVUVsZW1lbnRzLi4uPjo6X01fdGFpbChfX2luKSksCisJICBfQmFzZShfVHVwbGVfaW1wbDxfSWR4LCBfVUVsZW1lbnRzLi4uPjo6X01faGVhZChfX2luKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSGVhZCwgdHlwZW5hbWUuLi4gX1VUYWlscz4KKyAgICAgICAgY29uc3RleHByIF9UdXBsZV9pbXBsKF9UdXBsZV9pbXBsPF9JZHgsIF9VSGVhZCwgX1VUYWlscy4uLj4mJiBfX2luKQorCTogX0luaGVyaXRlZChzdGQ6Om1vdmUKKwkJICAgICAoX1R1cGxlX2ltcGw8X0lkeCwgX1VIZWFkLCBfVVRhaWxzLi4uPjo6X01fdGFpbChfX2luKSkpLAorCSAgX0Jhc2Uoc3RkOjpmb3J3YXJkPF9VSGVhZD4KKwkJKF9UdXBsZV9pbXBsPF9JZHgsIF9VSGVhZCwgX1VUYWlscy4uLj46Ol9NX2hlYWQoX19pbikpKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCV9UdXBsZV9pbXBsKGFsbG9jYXRvcl9hcmdfdCBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EpCisJOiBfSW5oZXJpdGVkKF9fdGFnLCBfX2EpLAorICAgICAgICAgIF9CYXNlKF9fdXNlX2FsbG9jPF9IZWFkPihfX2EpKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCV9UdXBsZV9pbXBsKGFsbG9jYXRvcl9hcmdfdCBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsCisJCSAgICBjb25zdCBfSGVhZCYgX19oZWFkLCBjb25zdCBfVGFpbCYuLi4gX190YWlsKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBfX3RhaWwuLi4pLAorICAgICAgICAgIF9CYXNlKF9fdXNlX2FsbG9jPF9IZWFkLCBfQWxsb2MsIF9IZWFkPihfX2EpLCBfX2hlYWQpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9VSGVhZCwgdHlwZW5hbWUuLi4gX1VUYWlsLAorICAgICAgICAgICAgICAgdHlwZW5hbWUgPSB0eXBlbmFtZSBlbmFibGVfaWY8c2l6ZW9mLi4uKF9UYWlsKQorCQkJCQkgICAgID09IHNpemVvZi4uLihfVVRhaWwpPjo6dHlwZT4KKwlfVHVwbGVfaW1wbChhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLAorCSAgICAgICAgICAgIF9VSGVhZCYmIF9faGVhZCwgX1VUYWlsJiYuLi4gX190YWlsKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBzdGQ6OmZvcndhcmQ8X1VUYWlsPihfX3RhaWwpLi4uKSwKKyAgICAgICAgICBfQmFzZShfX3VzZV9hbGxvYzxfSGVhZCwgX0FsbG9jLCBfVUhlYWQ+KF9fYSksCisJICAgICAgICBzdGQ6OmZvcndhcmQ8X1VIZWFkPihfX2hlYWQpKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBfVHVwbGVfaW1wbChhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLAorCSAgICAgICAgICAgIGNvbnN0IF9UdXBsZV9pbXBsJiBfX2luKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBfTV90YWlsKF9faW4pKSwgCisgICAgICAgICAgX0Jhc2UoX191c2VfYWxsb2M8X0hlYWQsIF9BbGxvYywgX0hlYWQ+KF9fYSksIF9NX2hlYWQoX19pbikpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisJX1R1cGxlX2ltcGwoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkgICAgICAgICAgICBfVHVwbGVfaW1wbCYmIF9faW4pCisJOiBfSW5oZXJpdGVkKF9fdGFnLCBfX2EsIHN0ZDo6bW92ZShfTV90YWlsKF9faW4pKSksIAorCSAgX0Jhc2UoX191c2VfYWxsb2M8X0hlYWQsIF9BbGxvYywgX0hlYWQ+KF9fYSksCisJICAgICAgICBzdGQ6OmZvcndhcmQ8X0hlYWQ+KF9NX2hlYWQoX19pbikpKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorCV9UdXBsZV9pbXBsKGFsbG9jYXRvcl9hcmdfdCBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsCisJICAgICAgICAgICAgY29uc3QgX1R1cGxlX2ltcGw8X0lkeCwgX1VFbGVtZW50cy4uLj4mIF9faW4pCisJOiBfSW5oZXJpdGVkKF9fdGFnLCBfX2EsCisJCSAgICAgX1R1cGxlX2ltcGw8X0lkeCwgX1VFbGVtZW50cy4uLj46Ol9NX3RhaWwoX19pbikpLAorCSAgX0Jhc2UoX191c2VfYWxsb2M8X0hlYWQsIF9BbGxvYywgX0hlYWQ+KF9fYSksCisJCV9UdXBsZV9pbXBsPF9JZHgsIF9VRWxlbWVudHMuLi4+OjpfTV9oZWFkKF9faW4pKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfVUhlYWQsIHR5cGVuYW1lLi4uIF9VVGFpbHM+CisJX1R1cGxlX2ltcGwoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkgICAgICAgICAgICBfVHVwbGVfaW1wbDxfSWR4LCBfVUhlYWQsIF9VVGFpbHMuLi4+JiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoX190YWcsIF9fYSwgc3RkOjptb3ZlCisJCSAgICAgKF9UdXBsZV9pbXBsPF9JZHgsIF9VSGVhZCwgX1VUYWlscy4uLj46Ol9NX3RhaWwoX19pbikpKSwKKwkgIF9CYXNlKF9fdXNlX2FsbG9jPF9IZWFkLCBfQWxsb2MsIF9VSGVhZD4oX19hKSwKKyAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8X1VIZWFkPgorCQkoX1R1cGxlX2ltcGw8X0lkeCwgX1VIZWFkLCBfVVRhaWxzLi4uPjo6X01faGVhZChfX2luKSkpIHsgfQorCisgICAgICBfVHVwbGVfaW1wbCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfVHVwbGVfaW1wbCYgX19pbikKKyAgICAgIHsKKwlfTV9oZWFkKCp0aGlzKSA9IF9NX2hlYWQoX19pbik7CisJX01fdGFpbCgqdGhpcykgPSBfTV90YWlsKF9faW4pOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1R1cGxlX2ltcGwmCisgICAgICBvcGVyYXRvcj0oX1R1cGxlX2ltcGwmJiBfX2luKQorICAgICAgbm9leGNlcHQoX19hbmRfPGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9IZWFkPiwKKwkgICAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9Jbmhlcml0ZWQ+Pjo6dmFsdWUpCisgICAgICB7CisJX01faGVhZCgqdGhpcykgPSBzdGQ6OmZvcndhcmQ8X0hlYWQ+KF9NX2hlYWQoX19pbikpOworCV9NX3RhaWwoKnRoaXMpID0gc3RkOjptb3ZlKF9NX3RhaWwoX19pbikpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICAgICAgX1R1cGxlX2ltcGwmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBfVHVwbGVfaW1wbDxfSWR4LCBfVUVsZW1lbnRzLi4uPiYgX19pbikKKyAgICAgICAgeworCSAgX01faGVhZCgqdGhpcykgPSBfVHVwbGVfaW1wbDxfSWR4LCBfVUVsZW1lbnRzLi4uPjo6X01faGVhZChfX2luKTsKKwkgIF9NX3RhaWwoKnRoaXMpID0gX1R1cGxlX2ltcGw8X0lkeCwgX1VFbGVtZW50cy4uLj46Ol9NX3RhaWwoX19pbik7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUhlYWQsIHR5cGVuYW1lLi4uIF9VVGFpbHM+CisgICAgICAgIF9UdXBsZV9pbXBsJgorICAgICAgICBvcGVyYXRvcj0oX1R1cGxlX2ltcGw8X0lkeCwgX1VIZWFkLCBfVVRhaWxzLi4uPiYmIF9faW4pCisgICAgICAgIHsKKwkgIF9NX2hlYWQoKnRoaXMpID0gc3RkOjpmb3J3YXJkPF9VSGVhZD4KKwkgICAgKF9UdXBsZV9pbXBsPF9JZHgsIF9VSGVhZCwgX1VUYWlscy4uLj46Ol9NX2hlYWQoX19pbikpOworCSAgX01fdGFpbCgqdGhpcykgPSBzdGQ6Om1vdmUKKwkgICAgKF9UdXBsZV9pbXBsPF9JZHgsIF9VSGVhZCwgX1VUYWlscy4uLj46Ol9NX3RhaWwoX19pbikpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N3YXAoX1R1cGxlX2ltcGwmIF9faW4pCisgICAgICBub2V4Y2VwdChub2V4Y2VwdChzd2FwKHN0ZDo6ZGVjbHZhbDxfSGVhZCY+KCksCisJCQkgICAgIHN0ZDo6ZGVjbHZhbDxfSGVhZCY+KCkpKQorCSAgICAgICAmJiBub2V4Y2VwdChfTV90YWlsKF9faW4pLl9NX3N3YXAoX01fdGFpbChfX2luKSkpKQorICAgICAgeworCXVzaW5nIHN0ZDo6c3dhcDsKKwlzd2FwKF9NX2hlYWQoKnRoaXMpLCBfTV9oZWFkKF9faW4pKTsKKwlfSW5oZXJpdGVkOjpfTV9zd2FwKF9NX3RhaWwoX19pbikpOworICAgICAgfQorICAgIH07CisKKyAgLy8vIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUsIHR1cGxlCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9FbGVtZW50cz4gCisgICAgY2xhc3MgdHVwbGUgOiBwdWJsaWMgX1R1cGxlX2ltcGw8MCwgX0VsZW1lbnRzLi4uPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1R1cGxlX2ltcGw8MCwgX0VsZW1lbnRzLi4uPiBfSW5oZXJpdGVkOworCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIHR1cGxlKCkKKyAgICAgIDogX0luaGVyaXRlZCgpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgY29uc3RleHByIHR1cGxlKGNvbnN0IF9FbGVtZW50cyYuLi4gX19lbGVtZW50cykKKyAgICAgIDogX0luaGVyaXRlZChfX2VsZW1lbnRzLi4uKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VFbGVtZW50cywgdHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBlbmFibGVfaWY8X19hbmRfPGlzX2NvbnZlcnRpYmxlPF9VRWxlbWVudHMsCisJCQkJCV9FbGVtZW50cz4uLi4+Ojp2YWx1ZT46OnR5cGU+CisJZXhwbGljaXQKKyAgICAgICAgY29uc3RleHByIHR1cGxlKF9VRWxlbWVudHMmJi4uLiBfX2VsZW1lbnRzKQorCTogX0luaGVyaXRlZChzdGQ6OmZvcndhcmQ8X1VFbGVtZW50cz4oX19lbGVtZW50cykuLi4pIHsJfQorCisgICAgICBjb25zdGV4cHIgdHVwbGUoY29uc3QgdHVwbGUmKSA9IGRlZmF1bHQ7CisKKyAgICAgIGNvbnN0ZXhwciB0dXBsZSh0dXBsZSYmKSA9IGRlZmF1bHQ7IAorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVUVsZW1lbnRzLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIGVuYWJsZV9pZjxfX2FuZF88aXNfY29udmVydGlibGU8Y29uc3QgX1VFbGVtZW50cyYsCisJCQkJCV9FbGVtZW50cz4uLi4+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGNvbnN0ZXhwciB0dXBsZShjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX19pbikKKyAgICAgICAgOiBfSW5oZXJpdGVkKHN0YXRpY19jYXN0PGNvbnN0IF9UdXBsZV9pbXBsPDAsIF9VRWxlbWVudHMuLi4+Jj4oX19pbikpCisgICAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVUVsZW1lbnRzLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIGVuYWJsZV9pZjxfX2FuZF88aXNfY29udmVydGlibGU8X1VFbGVtZW50cywKKwkJCQkJX0VsZW1lbnRzPi4uLj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgY29uc3RleHByIHR1cGxlKHR1cGxlPF9VRWxlbWVudHMuLi4+JiYgX19pbikKKyAgICAgICAgOiBfSW5oZXJpdGVkKHN0YXRpY19jYXN0PF9UdXBsZV9pbXBsPDAsIF9VRWxlbWVudHMuLi4+JiY+KF9faW4pKSB7IH0KKworICAgICAgLy8gQWxsb2NhdG9yLWV4dGVuZGVkIGNvbnN0cnVjdG9ycy4KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCXR1cGxlKGFsbG9jYXRvcl9hcmdfdCBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EpCisJOiBfSW5oZXJpdGVkKF9fdGFnLCBfX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisJdHVwbGUoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkgICAgICBjb25zdCBfRWxlbWVudHMmLi4uIF9fZWxlbWVudHMpCisJOiBfSW5oZXJpdGVkKF9fdGFnLCBfX2EsIF9fZWxlbWVudHMuLi4pIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9VRWxlbWVudHMsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPHNpemVvZi4uLihfVUVsZW1lbnRzKQorCQkJID09IHNpemVvZi4uLihfRWxlbWVudHMpPjo6dHlwZT4KKwl0dXBsZShhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLAorCSAgICAgIF9VRWxlbWVudHMmJi4uLiBfX2VsZW1lbnRzKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBzdGQ6OmZvcndhcmQ8X1VFbGVtZW50cz4oX19lbGVtZW50cykuLi4pCisgICAgICAgCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisJdHVwbGUoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwgY29uc3QgdHVwbGUmIF9faW4pCisJOiBfSW5oZXJpdGVkKF9fdGFnLCBfX2EsIHN0YXRpY19jYXN0PGNvbnN0IF9Jbmhlcml0ZWQmPihfX2luKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKwl0dXBsZShhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLCB0dXBsZSYmIF9faW4pCisJOiBfSW5oZXJpdGVkKF9fdGFnLCBfX2EsIHN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmJj4oX19pbikpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9VRWxlbWVudHMsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPHNpemVvZi4uLihfVUVsZW1lbnRzKQorCQkJID09IHNpemVvZi4uLihfRWxlbWVudHMpPjo6dHlwZT4KKwl0dXBsZShhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLAorCSAgICAgIGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX2luKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLAorCSAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBfVHVwbGVfaW1wbDwwLCBfVUVsZW1lbnRzLi4uPiY+KF9faW4pKQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9VRWxlbWVudHMsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPHNpemVvZi4uLihfVUVsZW1lbnRzKQorCQkJID09IHNpemVvZi4uLihfRWxlbWVudHMpPjo6dHlwZT4KKwl0dXBsZShhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLAorCSAgICAgIHR1cGxlPF9VRWxlbWVudHMuLi4+JiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoX190YWcsIF9fYSwKKwkgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X1R1cGxlX2ltcGw8MCwgX1VFbGVtZW50cy4uLj4mJj4oX19pbikpCisJeyB9CisKKyAgICAgIHR1cGxlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiBfX2luKQorICAgICAgeworCXN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmPigqdGhpcykgPSBfX2luOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdHVwbGUmCisgICAgICBvcGVyYXRvcj0odHVwbGUmJiBfX2luKQorICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X0luaGVyaXRlZD46OnZhbHVlKQorICAgICAgeworCXN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmPigqdGhpcykgPSBzdGQ6Om1vdmUoX19pbik7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVUVsZW1lbnRzLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjxzaXplb2YuLi4oX1VFbGVtZW50cykKKwkJCSA9PSBzaXplb2YuLi4oX0VsZW1lbnRzKT46OnR5cGU+CisgICAgICAgIHR1cGxlJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9faW4pCisgICAgICAgIHsKKwkgIHN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmPigqdGhpcykgPSBfX2luOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VFbGVtZW50cywgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBlbmFibGVfaWY8c2l6ZW9mLi4uKF9VRWxlbWVudHMpCisJCQkgPT0gc2l6ZW9mLi4uKF9FbGVtZW50cyk+Ojp0eXBlPgorICAgICAgICB0dXBsZSYKKyAgICAgICAgb3BlcmF0b3I9KHR1cGxlPF9VRWxlbWVudHMuLi4+JiYgX19pbikKKyAgICAgICAgeworCSAgc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCY+KCp0aGlzKSA9IHN0ZDo6bW92ZShfX2luKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodHVwbGUmIF9faW4pCisgICAgICBub2V4Y2VwdChub2V4Y2VwdChfX2luLl9NX3N3YXAoX19pbikpKQorICAgICAgeyBfSW5oZXJpdGVkOjpfTV9zd2FwKF9faW4pOyB9CisgICAgfTsKKworICAvLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiwgemVyby1lbGVtZW50IHR1cGxlLgorICB0ZW1wbGF0ZTw+ICAKKyAgICBjbGFzcyB0dXBsZTw+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHZvaWQgc3dhcCh0dXBsZSYpIG5vZXhjZXB0IHsgLyogbm8tb3AgKi8gfQorICAgIH07CisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24sIDItZWxlbWVudCB0dXBsZS4KKyAgLy8vIEluY2x1ZGVzIGNvbnN0cnVjdGlvbiBhbmQgYXNzaWdubWVudCBmcm9tIGEgcGFpci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgY2xhc3MgdHVwbGU8X1QxLCBfVDI+IDogcHVibGljIF9UdXBsZV9pbXBsPDAsIF9UMSwgX1QyPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1R1cGxlX2ltcGw8MCwgX1QxLCBfVDI+IF9Jbmhlcml0ZWQ7CisKKyAgICBwdWJsaWM6CisgICAgICBjb25zdGV4cHIgdHVwbGUoKQorICAgICAgOiBfSW5oZXJpdGVkKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBjb25zdGV4cHIgdHVwbGUoY29uc3QgX1QxJiBfX2ExLCBjb25zdCBfVDImIF9fYTIpCisgICAgICA6IF9Jbmhlcml0ZWQoX19hMSwgX19hMikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjxfX2FuZF88aXNfY29udmVydGlibGU8X1UxLCBfVDE+LAorCQkJCWlzX2NvbnZlcnRpYmxlPF9VMiwgX1QyPj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgY29uc3RleHByIHR1cGxlKF9VMSYmIF9fYTEsIF9VMiYmIF9fYTIpCisJOiBfSW5oZXJpdGVkKHN0ZDo6Zm9yd2FyZDxfVTE+KF9fYTEpLCBzdGQ6OmZvcndhcmQ8X1UyPihfX2EyKSkgeyB9CisKKyAgICAgIGNvbnN0ZXhwciB0dXBsZShjb25zdCB0dXBsZSYpID0gZGVmYXVsdDsKKworICAgICAgY29uc3RleHByIHR1cGxlKHR1cGxlJiYpID0gZGVmYXVsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwllbmFibGVfaWY8X19hbmRfPGlzX2NvbnZlcnRpYmxlPGNvbnN0IF9VMSYsIF9UMT4sCisJCQkgaXNfY29udmVydGlibGU8Y29uc3QgX1UyJiwgX1QyPj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgY29uc3RleHByIHR1cGxlKGNvbnN0IHR1cGxlPF9VMSwgX1UyPiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoc3RhdGljX2Nhc3Q8Y29uc3QgX1R1cGxlX2ltcGw8MCwgX1UxLCBfVTI+Jj4oX19pbikpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMiwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBlbmFibGVfaWY8X19hbmRfPGlzX2NvbnZlcnRpYmxlPF9VMSwgX1QxPiwKKwkJCQlpc19jb252ZXJ0aWJsZTxfVTIsIF9UMj4+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGNvbnN0ZXhwciB0dXBsZSh0dXBsZTxfVTEsIF9VMj4mJiBfX2luKQorCTogX0luaGVyaXRlZChzdGF0aWNfY2FzdDxfVHVwbGVfaW1wbDwwLCBfVTEsIF9VMj4mJj4oX19pbikpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMiwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCWVuYWJsZV9pZjxfX2FuZF88aXNfY29udmVydGlibGU8Y29uc3QgX1UxJiwgX1QxPiwKKwkJCSBpc19jb252ZXJ0aWJsZTxjb25zdCBfVTImLCBfVDI+Pjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBjb25zdGV4cHIgdHVwbGUoY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9faW4pCisJOiBfSW5oZXJpdGVkKF9faW4uZmlyc3QsIF9faW4uc2Vjb25kKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPF9fYW5kXzxpc19jb252ZXJ0aWJsZTxfVTEsIF9UMT4sCisJCQkJaXNfY29udmVydGlibGU8X1UyLCBfVDI+Pjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBjb25zdGV4cHIgdHVwbGUocGFpcjxfVTEsIF9VMj4mJiBfX2luKQorCTogX0luaGVyaXRlZChzdGQ6OmZvcndhcmQ8X1UxPihfX2luLmZpcnN0KSwKKwkJICAgICBzdGQ6OmZvcndhcmQ8X1UyPihfX2luLnNlY29uZCkpIHsgfQorCisgICAgICAvLyBBbGxvY2F0b3ItZXh0ZW5kZWQgY29uc3RydWN0b3JzLgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisJdHVwbGUoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSkKKwk6IF9Jbmhlcml0ZWQoX190YWcsIF9fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKwl0dXBsZShhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLAorCSAgICAgIGNvbnN0IF9UMSYgX19hMSwgY29uc3QgX1QyJiBfX2EyKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBfX2ExLCBfX2EyKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKwl0dXBsZShhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLCBfVTEmJiBfX2ExLCBfVTImJiBfX2EyKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBzdGQ6OmZvcndhcmQ8X1UxPihfX2ExKSwKKwkgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPF9VMj4oX19hMikpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisJdHVwbGUoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwgY29uc3QgdHVwbGUmIF9faW4pCisJOiBfSW5oZXJpdGVkKF9fdGFnLCBfX2EsIHN0YXRpY19jYXN0PGNvbnN0IF9Jbmhlcml0ZWQmPihfX2luKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKwl0dXBsZShhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLCB0dXBsZSYmIF9faW4pCisJOiBfSW5oZXJpdGVkKF9fdGFnLCBfX2EsIHN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmJj4oX19pbikpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorCXR1cGxlKGFsbG9jYXRvcl9hcmdfdCBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsCisJICAgICAgY29uc3QgdHVwbGU8X1UxLCBfVTI+JiBfX2luKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLAorCSAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBfVHVwbGVfaW1wbDwwLCBfVTEsIF9VMj4mPihfX2luKSkKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKwl0dXBsZShhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLCB0dXBsZTxfVTEsIF9VMj4mJiBfX2luKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBzdGF0aWNfY2FzdDxfVHVwbGVfaW1wbDwwLCBfVTEsIF9VMj4mJj4oX19pbikpCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTI+CisgICAgICAgIHR1cGxlKGFsbG9jYXRvcl9hcmdfdCBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsCisJICAgICAgY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9faW4pCisJOiBfSW5oZXJpdGVkKF9fdGFnLCBfX2EsIF9faW4uZmlyc3QsIF9faW4uc2Vjb25kKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKyAgICAgICAgdHVwbGUoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwgcGFpcjxfVTEsIF9VMj4mJiBfX2luKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBzdGQ6OmZvcndhcmQ8X1UxPihfX2luLmZpcnN0KSwKKwkJICAgICBzdGQ6OmZvcndhcmQ8X1UyPihfX2luLnNlY29uZCkpIHsgfQorCisgICAgICB0dXBsZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgX19pbikKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gX19pbjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHR1cGxlJgorICAgICAgb3BlcmF0b3I9KHR1cGxlJiYgX19pbikKKyAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9Jbmhlcml0ZWQ+Ojp2YWx1ZSkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gc3RkOjptb3ZlKF9faW4pOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTI+CisgICAgICAgIHR1cGxlJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgdHVwbGU8X1UxLCBfVTI+JiBfX2luKQorICAgICAgICB7CisJICBzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gX19pbjsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorICAgICAgICB0dXBsZSYKKyAgICAgICAgb3BlcmF0b3I9KHR1cGxlPF9VMSwgX1UyPiYmIF9faW4pCisgICAgICAgIHsKKwkgIHN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmPigqdGhpcykgPSBzdGQ6Om1vdmUoX19pbik7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKyAgICAgICAgdHVwbGUmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBwYWlyPF9VMSwgX1UyPiYgX19pbikKKyAgICAgICAgeworCSAgdGhpcy0+X01faGVhZCgqdGhpcykgPSBfX2luLmZpcnN0OworCSAgdGhpcy0+X01fdGFpbCgqdGhpcykuX01faGVhZCgqdGhpcykgPSBfX2luLnNlY29uZDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorICAgICAgICB0dXBsZSYKKyAgICAgICAgb3BlcmF0b3I9KHBhaXI8X1UxLCBfVTI+JiYgX19pbikKKyAgICAgICAgeworCSAgdGhpcy0+X01faGVhZCgqdGhpcykgPSBzdGQ6OmZvcndhcmQ8X1UxPihfX2luLmZpcnN0KTsKKwkgIHRoaXMtPl9NX3RhaWwoKnRoaXMpLl9NX2hlYWQoKnRoaXMpID0gc3RkOjpmb3J3YXJkPF9VMj4oX19pbi5zZWNvbmQpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdm9pZAorICAgICAgc3dhcCh0dXBsZSYgX19pbikKKyAgICAgIG5vZXhjZXB0KG5vZXhjZXB0KF9faW4uX01fc3dhcChfX2luKSkpCisgICAgICB7IF9Jbmhlcml0ZWQ6Ol9NX3N3YXAoX19pbik7IH0KKyAgICB9OworCisKKyAgLy8vIEdpdmVzIHRoZSB0eXBlIG9mIHRoZSBpdGggZWxlbWVudCBvZiBhIGdpdmVuIHR1cGxlIHR5cGUuCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50OworCisgIC8qKgorICAgKiBSZWN1cnNpdmUgY2FzZSBmb3IgdHVwbGVfZWxlbWVudDogc3RyaXAgb2ZmIHRoZSBmaXJzdCBlbGVtZW50IGluCisgICAqIHRoZSB0dXBsZSBhbmQgcmV0cmlldmUgdGhlIChpLTEpdGggZWxlbWVudCBvZiB0aGUgcmVtYWluaW5nIHR1cGxlLgorICAgKi8KKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX19pLCB0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8X19pLCB0dXBsZTxfSGVhZCwgX1RhaWwuLi4+ID4KKyAgICA6IHR1cGxlX2VsZW1lbnQ8X19pIC0gMSwgdHVwbGU8X1RhaWwuLi4+ID4geyB9OworCisgIC8qKgorICAgKiBCYXNpcyBjYXNlIGZvciB0dXBsZV9lbGVtZW50OiBUaGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgb25lIHdlJ3JlIHNlZWtpbmcuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8MCwgdHVwbGU8X0hlYWQsIF9UYWlsLi4uPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfSGVhZCB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX19pLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8X19pLCBjb25zdCBfVHA+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZQorICAgICAgYWRkX2NvbnN0PHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X19pLCBfVHA+Ojp0eXBlPjo6dHlwZSB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX19pLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8X19pLCB2b2xhdGlsZSBfVHA+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZQorICAgICAgYWRkX3ZvbGF0aWxlPHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X19pLCBfVHA+Ojp0eXBlPjo6dHlwZSB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX19pLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8X19pLCBjb25zdCB2b2xhdGlsZSBfVHA+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZQorICAgICAgYWRkX2N2PHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X19pLCBfVHA+Ojp0eXBlPjo6dHlwZSB0eXBlOworICAgIH07CisKKyAgLy8vIEZpbmRzIHRoZSBzaXplIG9mIGEgZ2l2ZW4gdHVwbGUgdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCB0dXBsZV9zaXplOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgdHVwbGVfc2l6ZTxjb25zdCBfVHA+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8CisgICAgICAgICAgICAgdHlwZW5hbWUgcmVtb3ZlX2N2PGRlY2x0eXBlKHR1cGxlX3NpemU8X1RwPjo6dmFsdWUpPjo6dHlwZSwKKyAgICAgICAgICAgICB0dXBsZV9zaXplPF9UcD46OnZhbHVlPiB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCB0dXBsZV9zaXplPHZvbGF0aWxlIF9UcD4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDwKKyAgICAgICAgICAgICB0eXBlbmFtZSByZW1vdmVfY3Y8ZGVjbHR5cGUodHVwbGVfc2l6ZTxfVHA+Ojp2YWx1ZSk+Ojp0eXBlLAorICAgICAgICAgICAgIHR1cGxlX3NpemU8X1RwPjo6dmFsdWU+IHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHR1cGxlX3NpemU8Y29uc3Qgdm9sYXRpbGUgX1RwPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PAorICAgICAgICAgICAgIHR5cGVuYW1lIHJlbW92ZV9jdjxkZWNsdHlwZSh0dXBsZV9zaXplPF9UcD46OnZhbHVlKT46OnR5cGUsCisgICAgICAgICAgICAgdHVwbGVfc2l6ZTxfVHA+Ojp2YWx1ZT4geyB9OworCisgIC8vLyBjbGFzcyB0dXBsZV9zaXplCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBzdHJ1Y3QgdHVwbGVfc2l6ZTx0dXBsZTxfRWxlbWVudHMuLi4+PgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LCBzaXplb2YuLi4oX0VsZW1lbnRzKT4geyB9OworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUgX0hlYWQsIHR5cGVuYW1lLi4uIF9UYWlsPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2FkZF9yZWY8X0hlYWQ+Ojp0eXBlCisgICAgX19nZXRfaGVscGVyKF9UdXBsZV9pbXBsPF9faSwgX0hlYWQsIF9UYWlsLi4uPiYgX190KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9UdXBsZV9pbXBsPF9faSwgX0hlYWQsIF9UYWlsLi4uPjo6X01faGVhZChfX3QpOyB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX19pLCB0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fYWRkX2NfcmVmPF9IZWFkPjo6dHlwZQorICAgIF9fZ2V0X2hlbHBlcihjb25zdCBfVHVwbGVfaW1wbDxfX2ksIF9IZWFkLCBfVGFpbC4uLj4mIF9fdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfVHVwbGVfaW1wbDxfX2ksIF9IZWFkLCBfVGFpbC4uLj46Ol9NX2hlYWQoX190KTsgfQorCisgIC8vIFJldHVybiBhIHJlZmVyZW5jZSAoY29uc3QgcmVmZXJlbmNlLCBydmFsdWUgcmVmZXJlbmNlKSB0byB0aGUgaXRoIGVsZW1lbnQKKyAgLy8gb2YgYSB0dXBsZS4gIEFueSBjb25zdCBvciBub24tY29uc3QgcmVmIGVsZW1lbnRzIGFyZSByZXR1cm5lZCB3aXRoIHRoZWlyCisgIC8vIG9yaWdpbmFsIHR5cGUuCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2FkZF9yZWY8CisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfX2ksIHR1cGxlPF9FbGVtZW50cy4uLj4+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICBnZXQodHVwbGU8X0VsZW1lbnRzLi4uPiYgX190KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHN0ZDo6X19nZXRfaGVscGVyPF9faT4oX190KTsgfQorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2FkZF9jX3JlZjwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9faSwgdHVwbGU8X0VsZW1lbnRzLi4uPj46OnR5cGUKKyAgICAgICAgICAgICAgICAgICAgPjo6dHlwZQorICAgIGdldChjb25zdCB0dXBsZTxfRWxlbWVudHMuLi4+JiBfX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gc3RkOjpfX2dldF9oZWxwZXI8X19pPihfX3QpOyB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX19pLCB0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fYWRkX3JfcmVmPAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X19pLCB0dXBsZTxfRWxlbWVudHMuLi4+Pjo6dHlwZQorICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgZ2V0KHR1cGxlPF9FbGVtZW50cy4uLj4mJiBfX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gc3RkOjpmb3J3YXJkPHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X19pLAorCXR1cGxlPF9FbGVtZW50cy4uLj4+Ojp0eXBlJiY+KGdldDxfX2k+KF9fdCkpOyB9CisKKyAgLy8gVGhpcyBjbGFzcyBoZWxwcyBjb25zdHJ1Y3QgdGhlIHZhcmlvdXMgY29tcGFyaXNvbiBvcGVyYXRpb25zIG9uIHR1cGxlcworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2NoZWNrX2VxdWFsX3NpemUsIHN0ZDo6c2l6ZV90IF9faSwgc3RkOjpzaXplX3QgX19qLAorCSAgIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3R1cGxlX2NvbXBhcmU7CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX19pLCBzdGQ6OnNpemVfdCBfX2osIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3R1cGxlX2NvbXBhcmU8MCwgX19pLCBfX2osIF9UcCwgX1VwPgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCAKKyAgICAgIF9fZXEoY29uc3QgX1RwJiBfX3QsIGNvbnN0IF9VcCYgX191KQorICAgICAgeworCXJldHVybiAoZ2V0PF9faT4oX190KSA9PSBnZXQ8X19pPihfX3UpICYmCisJCV9fdHVwbGVfY29tcGFyZTwwLCBfX2kgKyAxLCBfX2osIF9UcCwgX1VwPjo6X19lcShfX3QsIF9fdSkpOworICAgICAgfQorICAgICAKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCAKKyAgICAgIF9fbGVzcyhjb25zdCBfVHAmIF9fdCwgY29uc3QgX1VwJiBfX3UpCisgICAgICB7CisJcmV0dXJuICgoZ2V0PF9faT4oX190KSA8IGdldDxfX2k+KF9fdSkpCisJCXx8ICEoZ2V0PF9faT4oX191KSA8IGdldDxfX2k+KF9fdCkpICYmCisJCV9fdHVwbGVfY29tcGFyZTwwLCBfX2kgKyAxLCBfX2osIF9UcCwgX1VwPjo6X19sZXNzKF9fdCwgX191KSk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2ksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3R1cGxlX2NvbXBhcmU8MCwgX19pLCBfX2ksIF9UcCwgX1VwPgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCAKKyAgICAgIF9fZXEoY29uc3QgX1RwJiwgY29uc3QgX1VwJikgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCAKKyAgICAgIF9fbGVzcyhjb25zdCBfVHAmLCBjb25zdCBfVXAmKSB7IHJldHVybiBmYWxzZTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RFbGVtZW50cywgdHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICBjb25zdGV4cHIgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdHVwbGU8X1RFbGVtZW50cy4uLj4mIF9fdCwKKwkgICAgICAgY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9fdSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR1cGxlPF9URWxlbWVudHMuLi4+IF9UcDsKKyAgICAgIHR5cGVkZWYgdHVwbGU8X1VFbGVtZW50cy4uLj4gX1VwOworICAgICAgcmV0dXJuIGJvb2woX190dXBsZV9jb21wYXJlPHR1cGxlX3NpemU8X1RwPjo6dmFsdWUgLSB0dXBsZV9zaXplPF9VcD46OnZhbHVlLAorCSAgICAgIDAsIHR1cGxlX3NpemU8X1RwPjo6dmFsdWUsIF9UcCwgX1VwPjo6X19lcShfX3QsIF9fdSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGNvbnN0ZXhwciBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9fdSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR1cGxlPF9URWxlbWVudHMuLi4+IF9UcDsKKyAgICAgIHR5cGVkZWYgdHVwbGU8X1VFbGVtZW50cy4uLj4gX1VwOworICAgICAgcmV0dXJuIGJvb2woX190dXBsZV9jb21wYXJlPHR1cGxlX3NpemU8X1RwPjo6dmFsdWUgLSB0dXBsZV9zaXplPF9VcD46OnZhbHVlLAorCSAgICAgIDAsIHR1cGxlX3NpemU8X1RwPjo6dmFsdWUsIF9UcCwgX1VwPjo6X19sZXNzKF9fdCwgX191KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9URWxlbWVudHMsIHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsgcmV0dXJuICEoX190ID09IF9fdSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGlubGluZSBjb25zdGV4cHIgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgIGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX3UpCisgICAgeyByZXR1cm4gX191IDwgX190OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RFbGVtZW50cywgdHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgIGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX3UpCisgICAgeyByZXR1cm4gIShfX3UgPCBfX3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RFbGVtZW50cywgdHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgIGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX3UpCisgICAgeyByZXR1cm4gIShfX3QgPCBfX3UpOyB9CisKKyAgLy8gTkI6IERSIDcwNS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIGNvbnN0ZXhwciB0dXBsZTx0eXBlbmFtZSBfX2RlY2F5X2FuZF9zdHJpcDxfRWxlbWVudHM+OjpfX3R5cGUuLi4+CisgICAgbWFrZV90dXBsZShfRWxlbWVudHMmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgdHlwZWRlZiB0dXBsZTx0eXBlbmFtZSBfX2RlY2F5X2FuZF9zdHJpcDxfRWxlbWVudHM+OjpfX3R5cGUuLi4+CisJX19yZXN1bHRfdHlwZTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdF90eXBlKHN0ZDo6Zm9yd2FyZDxfRWxlbWVudHM+KF9fYXJncykuLi4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgdHVwbGU8X0VsZW1lbnRzJiYuLi4+CisgICAgZm9yd2FyZF9hc190dXBsZShfRWxlbWVudHMmJi4uLiBfX2FyZ3MpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gdHVwbGU8X0VsZW1lbnRzJiYuLi4+KHN0ZDo6Zm9yd2FyZDxfRWxlbWVudHM+KF9fYXJncykuLi4pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfdHVwbGVfbGlrZV9pbXBsIDogZmFsc2VfdHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVHBzPgorICAgIHN0cnVjdCBfX2lzX3R1cGxlX2xpa2VfaW1wbDx0dXBsZTxfVHBzLi4uPj4gOiB0cnVlX3R5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9faXNfdHVwbGVfbGlrZV9pbXBsPHBhaXI8X1QxLCBfVDI+PiA6IHRydWVfdHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBzdHJ1Y3QgX19pc190dXBsZV9saWtlX2ltcGw8YXJyYXk8X1RwLCBfTm0+PiA6IHRydWVfdHlwZQorICAgIHsgfTsKKworICAvLyBJbnRlcm5hbCB0eXBlIHRyYWl0IHRoYXQgYWxsb3dzIHVzIHRvIHNmaW5hZS1wcm90ZWN0IHR1cGxlX2NhdC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX3R1cGxlX2xpa2UKKyAgICA6IHB1YmxpYyBfX2lzX3R1cGxlX2xpa2VfaW1wbDx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jdgorICAgICAgICAgICAgPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlPjo6dHlwZT46OnR5cGUKKyAgICB7IH07CisKKyAgLy8gU3RvcmVzIGEgdHVwbGUgb2YgaW5kaWNlcy4gIEFsc28gdXNlZCBieSBiaW5kKCkgdG8gZXh0cmFjdCB0aGUgZWxlbWVudHMKKyAgLy8gaW4gYSB0dXBsZS4gCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzPgorICAgIHN0cnVjdCBfSW5kZXhfdHVwbGUKKyAgICB7CisgICAgICB0eXBlZGVmIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLiwgc2l6ZW9mLi4uKF9JbmRleGVzKT4gX19uZXh0OworICAgIH07CisKKyAgLy8gQnVpbGRzIGFuIF9JbmRleF90dXBsZTwwLCAxLCAyLCAuLi4sIF9OdW0tMT4uCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9OdW0+CisgICAgc3RydWN0IF9CdWlsZF9pbmRleF90dXBsZQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0J1aWxkX2luZGV4X3R1cGxlPF9OdW0gLSAxPjo6X190eXBlOjpfX25leHQgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfQnVpbGRfaW5kZXhfdHVwbGU8MD4KKyAgICB7CisgICAgICB0eXBlZGVmIF9JbmRleF90dXBsZTw+IF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90LCB0eXBlbmFtZSwgdHlwZW5hbWUsIHN0ZDo6c2l6ZV90PgorICAgIHN0cnVjdCBfX21ha2VfdHVwbGVfaW1wbDsKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSWR4LCB0eXBlbmFtZSBfVHVwbGUsIHR5cGVuYW1lLi4uIF9UcCwKKyAgICAgICAgICAgc3RkOjpzaXplX3QgX05tPgorICAgIHN0cnVjdCBfX21ha2VfdHVwbGVfaW1wbDxfSWR4LCB0dXBsZTxfVHAuLi4+LCBfVHVwbGUsIF9ObT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbWFrZV90dXBsZV9pbXBsPF9JZHggKyAxLCB0dXBsZTxfVHAuLi4sCisJdHlwZW5hbWUgc3RkOjp0dXBsZV9lbGVtZW50PF9JZHgsIF9UdXBsZT46OnR5cGU+LCBfVHVwbGUsIF9ObT46Ol9fdHlwZQorICAgICAgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX05tLCB0eXBlbmFtZSBfVHVwbGUsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICBzdHJ1Y3QgX19tYWtlX3R1cGxlX2ltcGw8X05tLCB0dXBsZTxfVHAuLi4+LCBfVHVwbGUsIF9ObT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR1cGxlPF9UcC4uLj4gX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1R1cGxlPgorICAgIHN0cnVjdCBfX2RvX21ha2VfdHVwbGUKKyAgICA6IHB1YmxpYyBfX21ha2VfdHVwbGVfaW1wbDwwLCB0dXBsZTw+LCBfVHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0dXBsZV9zaXplPF9UdXBsZT46OnZhbHVlPgorICAgIHsgfTsKKworICAvLyBSZXR1cm5zIHRoZSBzdGQ6OnR1cGxlIGVxdWl2YWxlbnQgb2YgYSB0dXBsZS1saWtlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UdXBsZT4KKyAgICBzdHJ1Y3QgX19tYWtlX3R1cGxlCisgICAgOiBwdWJsaWMgX19kb19tYWtlX3R1cGxlPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2N2CisgICAgICAgICAgICA8dHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPF9UdXBsZT46OnR5cGU+Ojp0eXBlPgorICAgIHsgfTsKKworICAvLyBDb21iaW5lcyBzZXZlcmFsIHN0ZDo6dHVwbGUncyBpbnRvIGEgc2luZ2xlIG9uZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4+CisgICAgc3RydWN0IF9fY29tYmluZV90dXBsZXM7CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2NvbWJpbmVfdHVwbGVzPD4KKyAgICB7CisgICAgICB0eXBlZGVmIHR1cGxlPD4gX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RzPgorICAgIHN0cnVjdCBfX2NvbWJpbmVfdHVwbGVzPHR1cGxlPF9Ucy4uLj4+CisgICAgeworICAgICAgdHlwZWRlZiB0dXBsZTxfVHMuLi4+IF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9UMXMsIHR5cGVuYW1lLi4uIF9UMnMsIHR5cGVuYW1lLi4uIF9SZW0+CisgICAgc3RydWN0IF9fY29tYmluZV90dXBsZXM8dHVwbGU8X1Qxcy4uLj4sIHR1cGxlPF9UMnMuLi4+LCBfUmVtLi4uPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19jb21iaW5lX3R1cGxlczx0dXBsZTxfVDFzLi4uLCBfVDJzLi4uPiwKKwkJCQkJX1JlbS4uLj46Ol9fdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLyBDb21wdXRlcyB0aGUgcmVzdWx0IHR5cGUgb2YgdHVwbGVfY2F0IGdpdmVuIGEgc2V0IG9mIHR1cGxlLWxpa2UgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9UcGxzPgorICAgIHN0cnVjdCBfX3R1cGxlX2NhdF9yZXN1bHQKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY29tYmluZV90dXBsZXMKKyAgICAgICAgPHR5cGVuYW1lIF9fbWFrZV90dXBsZTxfVHBscz46Ol9fdHlwZS4uLj46Ol9fdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLyBIZWxwZXIgdG8gZGV0ZXJtaW5lIHRoZSBpbmRleCBzZXQgZm9yIHRoZSBmaXJzdCB0dXBsZS1saWtlCisgIC8vIHR5cGUgb2YgYSBnaXZlbiBzZXQuCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uPgorICAgIHN0cnVjdCBfX21ha2VfMXN0X2luZGljZXM7CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX21ha2VfMXN0X2luZGljZXM8PgorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpfSW5kZXhfdHVwbGU8PiBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9UcGxzPgorICAgIHN0cnVjdCBfX21ha2VfMXN0X2luZGljZXM8X1RwLCBfVHBscy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X0J1aWxkX2luZGV4X3R1cGxlPHN0ZDo6dHVwbGVfc2l6ZTwKKwl0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZT46OnZhbHVlPjo6X190eXBlIF9fdHlwZTsKKyAgICB9OworCisgIC8vIFBlcmZvcm1zIHRoZSBhY3R1YWwgY29uY2F0ZW5hdGlvbiBieSBzdGVwLXdpc2UgZXhwYW5kaW5nIHR1cGxlLWxpa2UKKyAgLy8gb2JqZWN0cyBpbnRvIHRoZSBlbGVtZW50cywgIHdoaWNoIGFyZSBmaW5hbGx5IGZvcndhcmRlZCBpbnRvIHRoZQorICAvLyByZXN1bHQgdHVwbGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9JbmRpY2VzLCB0eXBlbmFtZS4uLiBfVHBscz4KKyAgICBzdHJ1Y3QgX190dXBsZV9jb25jYXRlcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCBzdGQ6OnNpemVfdC4uLiBfSXMsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX1RwbHM+CisgICAgc3RydWN0IF9fdHVwbGVfY29uY2F0ZXI8X1JldCwgc3RkOjpfSW5kZXhfdHVwbGU8X0lzLi4uPiwgX1RwLCBfVHBscy4uLj4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVXM+CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1JldAorICAgICAgICBfU19kbyhfVHAmJiBfX3RwLCBfVHBscyYmLi4uIF9fdHBzLCBfVXMmJi4uLiBfX3VzKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIF9fbWFrZV8xc3RfaW5kaWNlczxfVHBscy4uLj46Ol9fdHlwZSBfX2lkeDsKKwkgIHR5cGVkZWYgX190dXBsZV9jb25jYXRlcjxfUmV0LCBfX2lkeCwgX1RwbHMuLi4+ICAgICAgX19uZXh0OworCSAgcmV0dXJuIF9fbmV4dDo6X1NfZG8oc3RkOjpmb3J3YXJkPF9UcGxzPihfX3RwcykuLi4sCisJCQkgICAgICAgc3RkOjpmb3J3YXJkPF9Vcz4oX191cykuLi4sCisJCQkgICAgICAgc3RkOjpnZXQ8X0lzPihzdGQ6OmZvcndhcmQ8X1RwPihfX3RwKSkuLi4pOworCX0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQ+CisgICAgc3RydWN0IF9fdHVwbGVfY29uY2F0ZXI8X1JldCwgc3RkOjpfSW5kZXhfdHVwbGU8Pj4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVXM+CisJc3RhdGljIGNvbnN0ZXhwciBfUmV0CisJX1NfZG8oX1VzJiYuLi4gX191cykKKyAgICAgICAgeworCSAgcmV0dXJuIF9SZXQoc3RkOjpmb3J3YXJkPF9Vcz4oX191cykuLi4pOworCX0KKyAgICB9OworCisgIC8vLyB0dXBsZV9jYXQKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RwbHMsIHR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgICAgZW5hYmxlX2lmPF9fYW5kXzxfX2lzX3R1cGxlX2xpa2U8X1RwbHM+Li4uPjo6dmFsdWU+Ojp0eXBlPgorICAgIGNvbnN0ZXhwciBhdXRvCisgICAgdHVwbGVfY2F0KF9UcGxzJiYuLi4gX190cGxzKQorICAgIC0+IHR5cGVuYW1lIF9fdHVwbGVfY2F0X3Jlc3VsdDxfVHBscy4uLj46Ol9fdHlwZQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190dXBsZV9jYXRfcmVzdWx0PF9UcGxzLi4uPjo6X190eXBlIF9fcmV0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21ha2VfMXN0X2luZGljZXM8X1RwbHMuLi4+OjpfX3R5cGUgX19pZHg7CisgICAgICB0eXBlZGVmIF9fdHVwbGVfY29uY2F0ZXI8X19yZXQsIF9faWR4LCBfVHBscy4uLj4gX19jb25jYXRlcjsKKyAgICAgIHJldHVybiBfX2NvbmNhdGVyOjpfU19kbyhzdGQ6OmZvcndhcmQ8X1RwbHM+KF9fdHBscykuLi4pOworICAgIH0KKworICAvLy8gdGllCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBpbmxpbmUgdHVwbGU8X0VsZW1lbnRzJi4uLj4KKyAgICB0aWUoX0VsZW1lbnRzJi4uLiBfX2FyZ3MpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gdHVwbGU8X0VsZW1lbnRzJi4uLj4oX19hcmdzLi4uKTsgfQorCisgIC8vLyBzd2FwCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBpbmxpbmUgdm9pZCAKKyAgICBzd2FwKHR1cGxlPF9FbGVtZW50cy4uLj4mIF9feCwgdHVwbGU8X0VsZW1lbnRzLi4uPiYgX195KQorICAgIG5vZXhjZXB0KG5vZXhjZXB0KF9feC5zd2FwKF9feSkpKQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIC8vIEEgY2xhc3MgKGFuZCBpbnN0YW5jZSkgd2hpY2ggY2FuIGJlIHVzZWQgaW4gJ3RpZScgd2hlbiBhbiBlbGVtZW50CisgIC8vIG9mIGEgdHVwbGUgaXMgbm90IHJlcXVpcmVkCisgIHN0cnVjdCBfU3dhbGxvd19hc3NpZ24KKyAgeworICAgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICAgIGNvbnN0IF9Td2FsbG93X2Fzc2lnbiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfVHAmKSBjb25zdAorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgfTsKKworICBjb25zdCBfU3dhbGxvd19hc3NpZ24gaWdub3Jle307CisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIHR1cGxlcworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVHlwZXMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgdXNlc19hbGxvY2F0b3I8dHVwbGU8X1R5cGVzLi4uPiwgX0FsbG9jPiA6IHRydWVfdHlwZSB7IH07CisKKyAgLy8gU2VlIHN0bF9wYWlyLmguLi4KKyAgdGVtcGxhdGU8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MxLCB0eXBlbmFtZS4uLiBfQXJnczI+CisgICAgICBpbmxpbmUKKyAgICAgIHBhaXI8X1QxLCBfVDI+OjoKKyAgICAgIHBhaXIocGllY2V3aXNlX2NvbnN0cnVjdF90LAorCSAgIHR1cGxlPF9BcmdzMS4uLj4gX19maXJzdCwgdHVwbGU8X0FyZ3MyLi4uPiBfX3NlY29uZCkKKyAgICAgIDogcGFpcihfX2ZpcnN0LCBfX3NlY29uZCwKKwkgICAgIHR5cGVuYW1lIF9CdWlsZF9pbmRleF90dXBsZTxzaXplb2YuLi4oX0FyZ3MxKT46Ol9fdHlwZSgpLAorCSAgICAgdHlwZW5hbWUgX0J1aWxkX2luZGV4X3R1cGxlPHNpemVvZi4uLihfQXJnczIpPjo6X190eXBlKCkpCisgICAgICB7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJnczEsIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzMSwKKyAgICAgICAgICAgICB0eXBlbmFtZS4uLiBfQXJnczIsIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzMj4KKyAgICAgIGlubGluZQorICAgICAgcGFpcjxfVDEsIF9UMj46OgorICAgICAgcGFpcih0dXBsZTxfQXJnczEuLi4+JiBfX3R1cGxlMSwgdHVwbGU8X0FyZ3MyLi4uPiYgX190dXBsZTIsCisJICAgX0luZGV4X3R1cGxlPF9JbmRleGVzMS4uLj4sIF9JbmRleF90dXBsZTxfSW5kZXhlczIuLi4+KQorICAgICAgOiBmaXJzdChzdGQ6OmZvcndhcmQ8X0FyZ3MxPihzdGQ6OmdldDxfSW5kZXhlczE+KF9fdHVwbGUxKSkuLi4pLAorICAgICAgICBzZWNvbmQoc3RkOjpmb3J3YXJkPF9BcmdzMj4oc3RkOjpnZXQ8X0luZGV4ZXMyPihfX3R1cGxlMikpLi4uKQorICAgICAgeyB9CisKKyAgLy8vIEB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFVQTEUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHlwZV90cmFpdHMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3R5cGVfdHJhaXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2I5ODYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3R5cGVfdHJhaXRzCkBAIC0wLDAgKzEsMjA3NCBAQAorLy8gQysrMTEgPHR5cGVfdHJhaXRzPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS90eXBlX3RyYWl0cworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UWVBFX1RSQUlUUworI2RlZmluZSBfR0xJQkNYWF9UWVBFX1RSQUlUUyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBtZXRhcHJvZ3JhbW1pbmcgTWV0YXByb2dyYW1taW5nCisgICAqIEBpbmdyb3VwIHV0aWxpdGllcworICAgKgorICAgKiBUZW1wbGF0ZSB1dGlsaXRpZXMgZm9yIGNvbXBpbGUtdGltZSBpbnRyb3NwZWN0aW9uIGFuZCBtb2RpZmljYXRpb24sCisgICAqIGluY2x1ZGluZyB0eXBlIGNsYXNzaWZpY2F0aW9uIHRyYWl0cywgdHlwZSBwcm9wZXJ0eSBpbnNwZWN0aW9uIHRyYWl0cworICAgKiBhbmQgdHlwZSB0cmFuc2Zvcm1hdGlvbiB0cmFpdHMuCisgICAqCisgICAqIEB7CisgICAqLworCisgIC8vLyBpbnRlZ3JhbF9jb25zdGFudAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9UcCBfX3Y+CisgICAgc3RydWN0IGludGVncmFsX2NvbnN0YW50CisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBfVHAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9fdjsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8X1RwLCBfX3Y+ICAgdHlwZTsKKyAgICAgIGNvbnN0ZXhwciBvcGVyYXRvciB2YWx1ZV90eXBlKCkgeyByZXR1cm4gdmFsdWU7IH0KKyAgICB9OworICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX192PgorICAgIGNvbnN0ZXhwciBfVHAgaW50ZWdyYWxfY29uc3RhbnQ8X1RwLCBfX3Y+Ojp2YWx1ZTsKKworICAvLy8gVGhlIHR5cGUgdXNlZCBhcyBhIGNvbXBpbGUtdGltZSBib29sZWFuIHdpdGggdHJ1ZSB2YWx1ZS4KKyAgdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCB0cnVlPiAgICAgdHJ1ZV90eXBlOworCisgIC8vLyBUaGUgdHlwZSB1c2VkIGFzIGEgY29tcGlsZS10aW1lIGJvb2xlYW4gd2l0aCBmYWxzZSB2YWx1ZS4KKyAgdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBmYWxzZT4gICAgZmFsc2VfdHlwZTsKKworICAvLyBNZXRhIHByb2dyYW1taW5nIGhlbHBlciB0eXBlcy4KKworICB0ZW1wbGF0ZTxib29sLCB0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgc3RydWN0IGNvbmRpdGlvbmFsOworCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uPgorICAgIHN0cnVjdCBfX29yXzsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fb3JfPD4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CMT4KKyAgICBzdHJ1Y3QgX19vcl88X0IxPgorICAgIDogcHVibGljIF9CMQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQjEsIHR5cGVuYW1lIF9CMj4KKyAgICBzdHJ1Y3QgX19vcl88X0IxLCBfQjI+CisgICAgOiBwdWJsaWMgY29uZGl0aW9uYWw8X0IxOjp2YWx1ZSwgX0IxLCBfQjI+Ojp0eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CMSwgdHlwZW5hbWUgX0IyLCB0eXBlbmFtZSBfQjMsIHR5cGVuYW1lLi4uIF9Cbj4KKyAgICBzdHJ1Y3QgX19vcl88X0IxLCBfQjIsIF9CMywgX0JuLi4uPgorICAgIDogcHVibGljIGNvbmRpdGlvbmFsPF9CMTo6dmFsdWUsIF9CMSwgX19vcl88X0IyLCBfQjMsIF9Cbi4uLj4+Ojp0eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uPgorICAgIHN0cnVjdCBfX2FuZF87CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2FuZF88PgorICAgIDogcHVibGljIHRydWVfdHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQjE+CisgICAgc3RydWN0IF9fYW5kXzxfQjE+CisgICAgOiBwdWJsaWMgX0IxCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CMSwgdHlwZW5hbWUgX0IyPgorICAgIHN0cnVjdCBfX2FuZF88X0IxLCBfQjI+CisgICAgOiBwdWJsaWMgY29uZGl0aW9uYWw8X0IxOjp2YWx1ZSwgX0IyLCBfQjE+Ojp0eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CMSwgdHlwZW5hbWUgX0IyLCB0eXBlbmFtZSBfQjMsIHR5cGVuYW1lLi4uIF9Cbj4KKyAgICBzdHJ1Y3QgX19hbmRfPF9CMSwgX0IyLCBfQjMsIF9Cbi4uLj4KKyAgICA6IHB1YmxpYyBjb25kaXRpb25hbDxfQjE6OnZhbHVlLCBfX2FuZF88X0IyLCBfQjMsIF9Cbi4uLj4sIF9CMT46OnR5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1BwPgorICAgIHN0cnVjdCBfX25vdF8KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAhX1BwOjp2YWx1ZT4KKyAgICB7IH07CisKKyAgc3RydWN0IF9fc2ZpbmFlX3R5cGVzCisgIHsKKyAgICB0eXBlZGVmIGNoYXIgX19vbmU7CisgICAgdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIF9fYXJyWzJdOyB9IF9fdHdvOworICB9OworCisgIC8vIEZvciBzZXZlcmFsIHNmaW5hZS1mcmllbmRseSB0cmFpdCBpbXBsZW1lbnRhdGlvbnMgd2UgdHJhbnNwb3J0IGJvdGggdGhlCisgIC8vIHJlc3VsdCBpbmZvcm1hdGlvbiAoYXMgdGhlIG1lbWJlciB0eXBlKSBhbmQgdGhlIGZhaWx1cmUgaW5mb3JtYXRpb24gKG5vCisgIC8vIG1lbWJlciB0eXBlKS4gVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gc3RkOjplbmFibGVfaWYsIGJ1dCB3ZSBjYW5ub3QgdXNlCisgIC8vIHRoZW0sIGJlY2F1c2Ugd2UgbmVlZCB0byBkZXJpdmUgZnJvbSB0aGVtIGFzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fc3VjY2Vzc190eXBlCisgICAgeyB0eXBlZGVmIF9UcCB0eXBlOyB9OworCisgIHN0cnVjdCBfX2ZhaWx1cmVfdHlwZQorICB7IH07CisKKyAgLy8gUHJpbWFyeSB0eXBlIGNhdGVnb3JpZXMuCisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IHJlbW92ZV9jdjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc192b2lkX2hlbHBlcgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc192b2lkX2hlbHBlcjx2b2lkPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLy8vIGlzX3ZvaWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc192b2lkCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfdm9pZF9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcjxib29sPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisgIAorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyPGNoYXI+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyPHNpZ25lZCBjaGFyPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcjx1bnNpZ25lZCBjaGFyPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyPHdjaGFyX3Q+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ3JhbF9oZWxwZXI8Y2hhcjE2X3Q+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyPGNoYXIzMl90PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcjxzaG9ydD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ3JhbF9oZWxwZXI8dW5zaWduZWQgc2hvcnQ+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyPGludD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ3JhbF9oZWxwZXI8dW5zaWduZWQgaW50PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcjxsb25nPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcjx1bnNpZ25lZCBsb25nPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcjxsb25nIGxvbmc+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyPHVuc2lnbmVkIGxvbmcgbG9uZz4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisjaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9JTlQxMjgpCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ3JhbF9oZWxwZXI8X19pbnQxMjg+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyPHVuc2lnbmVkIF9faW50MTI4PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisjZW5kaWYKKworICAvLy8gaXNfaW50ZWdyYWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19pbnRlZ3JhbAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX2ludGVncmFsX2hlbHBlcjx0eXBlbmFtZQorCQkJCSAgICAgIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWUpPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc19mbG9hdGluZ19wb2ludF9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfZmxvYXRpbmdfcG9pbnRfaGVscGVyPGZsb2F0PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2Zsb2F0aW5nX3BvaW50X2hlbHBlcjxkb3VibGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfZmxvYXRpbmdfcG9pbnRfaGVscGVyPGxvbmcgZG91YmxlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pICYmIGRlZmluZWQoX0dMSUJDWFhfVVNFX0ZMT0FUMTI4KSAmJiAoIWRlZmluZWQoX19jbGFuZ19fKSB8fCBfX2NsYW5nX21ham9yX18gPiAzIHx8IChfX2NsYW5nX21ham9yX18gPT0gMyAmJiBfX2NsYW5nX21pbm9yX18gPj0gNCkpCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19mbG9hdGluZ19wb2ludF9oZWxwZXI8X19mbG9hdDEyOD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworI2VuZGlmCisKKyAgLy8vIGlzX2Zsb2F0aW5nX3BvaW50CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZmxvYXRpbmdfcG9pbnQKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19mbG9hdGluZ19wb2ludF9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2FycmF5CisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc19hcnJheQorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX1NpemU+CisgICAgc3RydWN0IGlzX2FycmF5PF9UcFtfU2l6ZV0+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2FycmF5PF9UcFtdPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfcG9pbnRlcl9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfcG9pbnRlcl9oZWxwZXI8X1RwKj4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vLyBpc19wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfcG9pbnRlcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX3BvaW50ZXJfaGVscGVyPHR5cGVuYW1lCisJCQkJICAgICAgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vLyBpc19sdmFsdWVfcmVmZXJlbmNlCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc19sdmFsdWVfcmVmZXJlbmNlCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19sdmFsdWVfcmVmZXJlbmNlPF9UcCY+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvLy8gaXNfcnZhbHVlX3JlZmVyZW5jZQorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfcnZhbHVlX3JlZmVyZW5jZQorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfcnZhbHVlX3JlZmVyZW5jZTxfVHAmJj4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ3A+CisgICAgc3RydWN0IF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyX2hlbHBlcjxfVHAgX0NwOjoqPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsICFpc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZT4geyB9OworCisgIC8vLyBpc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXJfaGVscGVyPAorCQkJCSAgICAgIHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWUpPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcl9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DcD4KKyAgICBzdHJ1Y3QgX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcl9oZWxwZXI8X1RwIF9DcDo6Kj4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZT4geyB9OworCisgIC8vLyBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXJfaGVscGVyPAorCQkJCSAgICAgIHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLy8gaXNfZW51bQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2VudW0KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2VudW0oX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX3VuaW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfdW5pb24KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX3VuaW9uKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBpc19jbGFzcworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2NsYXNzCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19jbGFzcyhfVHApPgorICAgIHsgfTsKKworICAvLy8gaXNfZnVuY3Rpb24KKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IGlzX2Z1bmN0aW9uCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IGlzX2Z1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uLi4uKT4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pIGNvbnN0PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLikgY29uc3Q+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IGlzX2Z1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKSB2b2xhdGlsZT4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4uLi4pIHZvbGF0aWxlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IGlzX2Z1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uLi4uKSBjb25zdCB2b2xhdGlsZT4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2lzX251bGxwdHJfdF9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfbnVsbHB0cl90X2hlbHBlcjxzdGQ6Om51bGxwdHJfdD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vIF9faXNfbnVsbHB0cl90IChleHRlbnNpb24pLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbnVsbHB0cl90CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfbnVsbHB0cl90X2hlbHBlcjx0eXBlbmFtZQorCQkJCSAgICAgIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLyBDb21wb3NpdGUgdHlwZSBjYXRlZ29yaWVzLgorCisgIC8vLyBpc19yZWZlcmVuY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19yZWZlcmVuY2UKKyAgICA6IHB1YmxpYyBfX29yXzxpc19sdmFsdWVfcmVmZXJlbmNlPF9UcD4sCisgICAgICAgICAgICAgICAgICAgaXNfcnZhbHVlX3JlZmVyZW5jZTxfVHA+Pjo6dHlwZQorICAgIHsgfTsKKworICAvLy8gaXNfYXJpdGhtZXRpYworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2FyaXRobWV0aWMKKyAgICA6IHB1YmxpYyBfX29yXzxpc19pbnRlZ3JhbDxfVHA+LCBpc19mbG9hdGluZ19wb2ludDxfVHA+Pjo6dHlwZQorICAgIHsgfTsKKworICAvLy8gaXNfZnVuZGFtZW50YWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19mdW5kYW1lbnRhbAorICAgIDogcHVibGljIF9fb3JfPGlzX2FyaXRobWV0aWM8X1RwPiwgaXNfdm9pZDxfVHA+LCBfX2lzX251bGxwdHJfdDxfVHA+Pjo6dHlwZQorICAgIHsgfTsKKworICAvLy8gaXNfb2JqZWN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfb2JqZWN0CisgICAgOiBwdWJsaWMgX19ub3RfPF9fb3JfPGlzX2Z1bmN0aW9uPF9UcD4sIGlzX3JlZmVyZW5jZTxfVHA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpc192b2lkPF9UcD4+Pjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfbWVtYmVyX3BvaW50ZXI7CisKKyAgLy8vIGlzX3NjYWxhcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3NjYWxhcgorICAgIDogcHVibGljIF9fb3JfPGlzX2FyaXRobWV0aWM8X1RwPiwgaXNfZW51bTxfVHA+LCBpc19wb2ludGVyPF9UcD4sCisgICAgICAgICAgICAgICAgICAgaXNfbWVtYmVyX3BvaW50ZXI8X1RwPiwgX19pc19udWxscHRyX3Q8X1RwPj46OnR5cGUKKyAgICB7IH07CisKKyAgLy8vIGlzX2NvbXBvdW5kCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfY29tcG91bmQKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAhaXNfZnVuZGFtZW50YWw8X1RwPjo6dmFsdWU+IHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbWVtYmVyX3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ3A+CisgICAgc3RydWN0IF9faXNfbWVtYmVyX3BvaW50ZXJfaGVscGVyPF9UcCBfQ3A6Oio+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvLy8gaXNfbWVtYmVyX3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19tZW1iZXJfcG9pbnRlcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX21lbWJlcl9wb2ludGVyX2hlbHBlcjwKKwkJCQkgICAgICB0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8gVHlwZSBwcm9wZXJ0aWVzLgorCisgIC8vLyBpc19jb25zdAorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfY29uc3QKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2NvbnN0PF9UcCBjb25zdD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworICAKKyAgLy8vIGlzX3ZvbGF0aWxlCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc192b2xhdGlsZQorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfdm9sYXRpbGU8X1RwIHZvbGF0aWxlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLy8vIGlzX3RyaXZpYWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc190cml2aWFsCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc190cml2aWFsKF9UcCk+CisgICAgeyB9OworCisgIC8vIGlzX3RyaXZpYWxseV9jb3B5YWJsZSAoc3RpbGwgdW5pbXBsZW1lbnRlZCkKKworICAvLy8gaXNfc3RhbmRhcmRfbGF5b3V0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfc3RhbmRhcmRfbGF5b3V0CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19zdGFuZGFyZF9sYXlvdXQoX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX3BvZAorICAvLyBDb3VsZCB1c2UgaXNfc3RhbmRhcmRfbGF5b3V0ICYmIGlzX3RyaXZpYWwgaW5zdGVhZCBvZiB0aGUgYnVpbHRpbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19wb2QKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX3BvZChfVHApPgorICAgIHsgfTsKKworICAvLy8gaXNfbGl0ZXJhbF90eXBlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbGl0ZXJhbF90eXBlCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19saXRlcmFsX3R5cGUoX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2VtcHR5CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZW1wdHkKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2VtcHR5KF9UcCk+CisgICAgeyB9OworCisgIC8vLyBpc19wb2x5bW9ycGhpYworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3BvbHltb3JwaGljCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19wb2x5bW9ycGhpYyhfVHApPgorICAgIHsgfTsKKworICAvLy8gaXNfYWJzdHJhY3QKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19hYnN0cmFjdAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfYWJzdHJhY3QoX1RwKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLAorCSAgIGJvb2wgPSBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSwKKwkgICBib29sID0gaXNfZmxvYXRpbmdfcG9pbnQ8X1RwPjo6dmFsdWU+CisgICAgc3RydWN0IF9faXNfc2lnbmVkX2hlbHBlcgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19zaWduZWRfaGVscGVyPF9UcCwgZmFsc2UsIHRydWU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfc2lnbmVkX2hlbHBlcjxfVHAsIHRydWUsIGZhbHNlPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIHN0YXRpY19jYXN0PGJvb2w+KF9UcCgtMSkgPCBfVHAoMCkpPgorICAgIHsgfTsKKworICAvLy8gaXNfc2lnbmVkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfc2lnbmVkCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19zaWduZWRfaGVscGVyPF9UcD46OnZhbHVlPgorICAgIHsgfTsKKworICAvLy8gaXNfdW5zaWduZWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc191bnNpZ25lZAorICAgIDogcHVibGljIF9fYW5kXzxpc19hcml0aG1ldGljPF9UcD4sIF9fbm90Xzxpc19zaWduZWQ8X1RwPj4+Ojp0eXBlCisgICAgeyB9OworCisKKyAgLy8gRGVzdHJ1Y3RpYmxlIGFuZCBjb25zdHJ1Y3RpYmxlIHR5cGUgcHJvcGVydGllcy4KKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgYWRkX3J2YWx1ZV9yZWZlcmVuY2U7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFV0aWxpdHkgdG8gc2ltcGxpZnkgZXhwcmVzc2lvbnMgdXNlZCBpbiB1bmV2YWx1YXRlZCBvcGVyYW5kcworICAgKiAgQGluZ3JvdXAgdXRpbGl0aWVzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdHlwZW5hbWUgYWRkX3J2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSBkZWNsdmFsKCkgbm9leGNlcHQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHVuc2lnbmVkID0gMD4KKyAgICBzdHJ1Y3QgZXh0ZW50OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCByZW1vdmVfYWxsX2V4dGVudHM7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2FycmF5X2tub3duX2JvdW5kcworICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChleHRlbnQ8X1RwPjo6dmFsdWUgPiAwKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2FycmF5X3Vua25vd25fYm91bmRzCisgICAgOiBwdWJsaWMgX19hbmRfPGlzX2FycmF5PF9UcD4sIF9fbm90XzxleHRlbnQ8X1RwPj4+Ojp0eXBlCisgICAgeyB9OworICAgIAorICAvLyBJbiBOMzI5MCBpc19kZXN0cnVjdGlibGUgZG9lcyBub3Qgc2F5IGFueXRoaW5nIGFib3V0IGZ1bmN0aW9uCisgIC8vIHR5cGVzIGFuZCBhYnN0cmFjdCB0eXBlcywgc2VlIExXRyAyMDQ5LiBUaGlzIGltcGxlbWVudGF0aW9uCisgIC8vIGRlc2NyaWJlcyBmdW5jdGlvbiB0eXBlcyBhcyBub24tZGVzdHJ1Y3RpYmxlIGFuZCBhbGwgY29tcGxldGUKKyAgLy8gb2JqZWN0IHR5cGVzIGFzIGRlc3RydWN0aWJsZSwgaWZmIHRoZSBleHBsaWNpdCBkZXN0cnVjdG9yCisgIC8vIGNhbGwgZXhwcmVzc2lvbiBpcyB3ZWxsZm9ybWVkLgorICBzdHJ1Y3QgX19kb19pc19kZXN0cnVjdGlibGVfaW1wbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IGRlY2x0eXBlKGRlY2x2YWw8X1RwJj4oKS5+X1RwKCkpPgorICAgICAgc3RhdGljIHRydWVfdHlwZSBfX3Rlc3QoaW50KTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgICAgc3RhdGljIGZhbHNlX3R5cGUgX190ZXN0KC4uLik7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2Rlc3RydWN0aWJsZV9pbXBsCisgICAgOiBwdWJsaWMgX19kb19pc19kZXN0cnVjdGlibGVfaW1wbAorICAgIHsKKyAgICAgIHR5cGVkZWYgZGVjbHR5cGUoX190ZXN0PF9UcD4oMCkpIHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIGJvb2wgPSBfX29yXzxpc192b2lkPF9UcD4sCisgICAgICAgICAgICAgICAgICAgICAgICBfX2lzX2FycmF5X3Vua25vd25fYm91bmRzPF9UcD4sCisgICAgICAgICAgICAgICAgICAgICAgICBpc19mdW5jdGlvbjxfVHA+Pjo6dmFsdWUsCisgICAgICAgICAgIGJvb2wgPSBfX29yXzxpc19yZWZlcmVuY2U8X1RwPiwgaXNfc2NhbGFyPF9UcD4+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX19pc19kZXN0cnVjdGlibGVfc2FmZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfZGVzdHJ1Y3RpYmxlX3NhZmU8X1RwLCBmYWxzZSwgZmFsc2U+CisgICAgOiBwdWJsaWMgX19pc19kZXN0cnVjdGlibGVfaW1wbDx0eXBlbmFtZQorICAgICAgICAgICAgICAgcmVtb3ZlX2FsbF9leHRlbnRzPF9UcD46OnR5cGU+Ojp0eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19kZXN0cnVjdGlibGVfc2FmZTxfVHAsIHRydWUsIGZhbHNlPgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19kZXN0cnVjdGlibGVfc2FmZTxfVHAsIGZhbHNlLCB0cnVlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLy8vIGlzX2Rlc3RydWN0aWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2Rlc3RydWN0aWJsZQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX2Rlc3RydWN0aWJsZV9zYWZlPF9UcD46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8gaXNfbm90aHJvd19kZXN0cnVjdGlibGUgcmVxdWlyZXMgdGhhdCBpc19kZXN0cnVjdGlibGUgaXMKKyAgLy8gc2F0aXNmaWVkIGFzIHdlbGwuICBXZSByZWFsaXplIHRoYXQgYnkgbWltaWNpbmcgdGhlCisgIC8vIGltcGxlbWVudGF0aW9uIG9mIGlzX2Rlc3RydWN0aWJsZSBidXQgcmVmZXIgdG8gbm9leGNlcHQoZXhwcikKKyAgLy8gaW5zdGVhZCBvZiBkZWNsdHlwZShleHByKS4KKyAgc3RydWN0IF9fZG9faXNfbnRfZGVzdHJ1Y3RpYmxlX2ltcGwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0YXRpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBub2V4Y2VwdChkZWNsdmFsPF9UcCY+KCkufl9UcCgpKT4KKyAgICAgICAgX190ZXN0KGludCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICAgIHN0YXRpYyBmYWxzZV90eXBlIF9fdGVzdCguLi4pOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19udF9kZXN0cnVjdGlibGVfaW1wbAorICAgIDogcHVibGljIF9fZG9faXNfbnRfZGVzdHJ1Y3RpYmxlX2ltcGwKKyAgICB7CisgICAgICB0eXBlZGVmIGRlY2x0eXBlKF9fdGVzdDxfVHA+KDApKSB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLAorICAgICAgICAgICBib29sID0gX19vcl88aXNfdm9pZDxfVHA+LAorICAgICAgICAgICAgICAgICAgICAgICAgX19pc19hcnJheV91bmtub3duX2JvdW5kczxfVHA+LAorICAgICAgICAgICAgICAgICAgICAgICAgaXNfZnVuY3Rpb248X1RwPj46OnZhbHVlLAorICAgICAgICAgICBib29sID0gX19vcl88aXNfcmVmZXJlbmNlPF9UcD4sIGlzX3NjYWxhcjxfVHA+Pjo6dmFsdWU+CisgICAgc3RydWN0IF9faXNfbnRfZGVzdHJ1Y3RpYmxlX3NhZmU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX250X2Rlc3RydWN0aWJsZV9zYWZlPF9UcCwgZmFsc2UsIGZhbHNlPgorICAgIDogcHVibGljIF9faXNfbnRfZGVzdHJ1Y3RpYmxlX2ltcGw8dHlwZW5hbWUKKyAgICAgICAgICAgICAgIHJlbW92ZV9hbGxfZXh0ZW50czxfVHA+Ojp0eXBlPjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbnRfZGVzdHJ1Y3RpYmxlX3NhZmU8X1RwLCB0cnVlLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbnRfZGVzdHJ1Y3RpYmxlX3NhZmU8X1RwLCBmYWxzZSwgdHJ1ZT4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vLyBpc19ub3Rocm93X2Rlc3RydWN0aWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX25vdGhyb3dfZGVzdHJ1Y3RpYmxlCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfbnRfZGVzdHJ1Y3RpYmxlX3NhZmU8X1RwPjo6dmFsdWUpPgorICAgIHsgfTsKKworICBzdHJ1Y3QgX19kb19pc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfaW1wbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSA9IGRlY2x0eXBlKF9UcCgpKT4KKyAgICAgIHN0YXRpYyB0cnVlX3R5cGUgX190ZXN0KGludCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICAgIHN0YXRpYyBmYWxzZV90eXBlIF9fdGVzdCguLi4pOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfaW1wbAorICAgIDogcHVibGljIF9fZG9faXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2ltcGwKKyAgICB7CisgICAgICB0eXBlZGVmIGRlY2x0eXBlKF9fdGVzdDxfVHA+KDApKSB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2RlZmF1bHRfY29uc3RydWN0aWJsZV9hdG9tCisgICAgOiBwdWJsaWMgX19hbmRfPF9fbm90Xzxpc192b2lkPF9UcD4+LAorICAgICAgICAgICAgICAgICAgICBfX2lzX2RlZmF1bHRfY29uc3RydWN0aWJsZV9pbXBsPF9UcD4+Ojp0eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbCA9IGlzX2FycmF5PF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX2lzX2RlZmF1bHRfY29uc3RydWN0aWJsZV9zYWZlOworCisgIC8vIFRoZSBmb2xsb3dpbmcgdGVjaG5pcXVlIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBjdXJyZW50IGNvcmUgbGFuZ3VhZ2UKKyAgLy8gcmVzdHJpY3Rpb24sIHdoaWNoIGRvZXMgbm90IGFsbG93IGZvciBhcnJheSB0eXBlcyB0byBvY2N1ciBpbiAKKyAgLy8gZnVuY3Rpb25hbCBjYXN0cyBvZiB0aGUgZm9ybSBUKCkuICBDb21wbGV0ZSBhcnJheXMgY2FuIGJlIGRlZmF1bHQtCisgIC8vIGNvbnN0cnVjdGVkLCBpZiB0aGUgZWxlbWVudCB0eXBlIGlzIGRlZmF1bHQtY29uc3RydWN0aWJsZSwgYnV0IAorICAvLyBhcnJheXMgd2l0aCB1bmtub3duIGJvdW5kcyBhcmUgbm90LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX3NhZmU8X1RwLCB0cnVlPgorICAgIDogcHVibGljIF9fYW5kXzxfX2lzX2FycmF5X2tub3duX2JvdW5kczxfVHA+LAorCQkgICAgX19pc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfYXRvbTx0eXBlbmFtZQorICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9hbGxfZXh0ZW50czxfVHA+Ojp0eXBlPj46OnR5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2RlZmF1bHRfY29uc3RydWN0aWJsZV9zYWZlPF9UcCwgZmFsc2U+CisgICAgOiBwdWJsaWMgX19pc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfYXRvbTxfVHA+Ojp0eXBlCisgICAgeyB9OworCisgIC8vLyBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfc2FmZTwKKwkJCQkgICAgICBfVHA+Ojp2YWx1ZSk+CisgICAgeyB9OworCisKKyAgLy8gSW1wbGVtZW50YXRpb24gb2YgaXNfY29uc3RydWN0aWJsZS4KKworICAvLyBUaGUgaGFyZGVzdCBwYXJ0IG9mIHRoaXMgdHJhaXQgaXMgdGhlIGJpbmFyeSBkaXJlY3QtaW5pdGlhbGl6YXRpb24KKyAgLy8gY2FzZSwgYmVjYXVzZSB3ZSBoaXQgaW50byBhIGZ1bmN0aW9uYWwgY2FzdCBvZiB0aGUgZm9ybSBUKGFyZykuCisgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBkaWZmZXJlbnQgc3RyYXRlZ2llcyBkZXBlbmRpbmcgb24gdGhlCisgIC8vIHRhcmdldCB0eXBlIHRvIHJlZHVjZSB0aGUgdGVzdCBvdmVyaGVhZCBhcyBtdWNoIGFzIHBvc3NpYmxlOgorICAvLworICAvLyBhKSBGb3IgYSByZWZlcmVuY2UgdGFyZ2V0IHR5cGUsIHdlIHVzZSBhIHN0YXRpY19jYXN0IGV4cHJlc3Npb24gCisgIC8vICAgIG1vZHVsbyBpdHMgZXh0cmEgY2FzZXMuCisgIC8vCisgIC8vIGIpIEZvciBhIG5vbi1yZWZlcmVuY2UgdGFyZ2V0IHR5cGUgd2UgdXNlIGEgOjpuZXcgZXhwcmVzc2lvbi4KKyAgc3RydWN0IF9fZG9faXNfc3RhdGljX2Nhc3RhYmxlX2ltcGwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8sIHR5cGVuYW1lCisgICAgICAgICAgICAgPSBkZWNsdHlwZShzdGF0aWNfY2FzdDxfVG8+KGRlY2x2YWw8X0Zyb20+KCkpKT4KKyAgICAgIHN0YXRpYyB0cnVlX3R5cGUgX190ZXN0KGludCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgICBzdGF0aWMgZmFsc2VfdHlwZSBfX3Rlc3QoLi4uKTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvPgorICAgIHN0cnVjdCBfX2lzX3N0YXRpY19jYXN0YWJsZV9pbXBsCisgICAgOiBwdWJsaWMgX19kb19pc19zdGF0aWNfY2FzdGFibGVfaW1wbAorICAgIHsKKyAgICAgIHR5cGVkZWYgZGVjbHR5cGUoX190ZXN0PF9Gcm9tLCBfVG8+KDApKSB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9Ubz4KKyAgICBzdHJ1Y3QgX19pc19zdGF0aWNfY2FzdGFibGVfc2FmZQorICAgIDogcHVibGljIF9faXNfc3RhdGljX2Nhc3RhYmxlX2ltcGw8X0Zyb20sIF9Ubz46OnR5cGUKKyAgICB7IH07CisKKyAgLy8gX19pc19zdGF0aWNfY2FzdGFibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9Ubz4KKyAgICBzdHJ1Y3QgX19pc19zdGF0aWNfY2FzdGFibGUKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19zdGF0aWNfY2FzdGFibGVfc2FmZTwKKwkJCQkgICAgICBfRnJvbSwgX1RvPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLyBJbXBsZW1lbnRhdGlvbiBmb3Igbm9uLXJlZmVyZW5jZSB0eXBlcy4gVG8gbWVldCB0aGUgcHJvcGVyCisgIC8vIHZhcmlhYmxlIGRlZmluaXRpb24gc2VtYW50aWNzLCB3ZSBhbHNvIG5lZWQgdG8gdGVzdCBmb3IKKyAgLy8gaXNfZGVzdHJ1Y3RpYmxlIGluIHRoaXMgY2FzZS4KKyAgLy8gVGhpcyBmb3JtIHNob3VsZCBiZSBzaW1wbGlmaWVkIGJ5IGEgc2luZ2xlIGV4cHJlc3Npb246CisgIC8vIDo6ZGVsZXRlIDo6bmV3IF9UcChkZWNsdmFsPF9Bcmc+KCkpLCBzZWUgYysrLzUxMjIyLgorICBzdHJ1Y3QgX19kb19pc19kaXJlY3RfY29uc3RydWN0aWJsZV9pbXBsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BcmcsIHR5cGVuYW1lCisJICAgICA9IGRlY2x0eXBlKDo6bmV3IF9UcChkZWNsdmFsPF9Bcmc+KCkpKT4KKyAgICAgIHN0YXRpYyB0cnVlX3R5cGUgX190ZXN0KGludCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgICBzdGF0aWMgZmFsc2VfdHlwZSBfX3Rlc3QoLi4uKTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgc3RydWN0IF9faXNfZGlyZWN0X2NvbnN0cnVjdGlibGVfaW1wbAorICAgIDogcHVibGljIF9fZG9faXNfZGlyZWN0X2NvbnN0cnVjdGlibGVfaW1wbAorICAgIHsKKyAgICAgIHR5cGVkZWYgZGVjbHR5cGUoX190ZXN0PF9UcCwgX0FyZz4oMCkpIHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgc3RydWN0IF9faXNfZGlyZWN0X2NvbnN0cnVjdGlibGVfbmV3X3NhZmUKKyAgICA6IHB1YmxpYyBfX2FuZF88aXNfZGVzdHJ1Y3RpYmxlPF9UcD4sCisgICAgICAgICAgICAgICAgICAgIF9faXNfZGlyZWN0X2NvbnN0cnVjdGlibGVfaW1wbDxfVHAsIF9Bcmc+Pjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgc3RydWN0IGlzX3NhbWU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc19iYXNlX29mOworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8sIGJvb2wKKyAgICAgICAgICAgPSBfX25vdF88X19vcl88aXNfdm9pZDxfRnJvbT4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICBpc19mdW5jdGlvbjxfRnJvbT4+Pjo6dmFsdWU+CisgICAgc3RydWN0IF9faXNfYmFzZV90b19kZXJpdmVkX3JlZjsKKworICAvLyBEZXRlY3Qgd2hldGhlciB3ZSBoYXZlIGEgZG93bmNhc3Qgc2l0dWF0aW9uIGR1cmluZworICAvLyByZWZlcmVuY2UgYmluZGluZy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9Ubz4KKyAgICBzdHJ1Y3QgX19pc19iYXNlX3RvX2Rlcml2ZWRfcmVmPF9Gcm9tLCBfVG8sIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY3Y8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRnJvbQorICAgICAgICA+Ojp0eXBlPjo6dHlwZSBfX3NyY190OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY3Y8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVG8KKyAgICAgICAgPjo6dHlwZT46OnR5cGUgX19kc3RfdDsKKyAgICAgIHR5cGVkZWYgX19hbmRfPF9fbm90Xzxpc19zYW1lPF9fc3JjX3QsIF9fZHN0X3Q+PiwKKwkJICAgICBpc19iYXNlX29mPF9fc3JjX3QsIF9fZHN0X3Q+PiB0eXBlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gdHlwZTo6dmFsdWU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvPgorICAgIHN0cnVjdCBfX2lzX2Jhc2VfdG9fZGVyaXZlZF9yZWY8X0Zyb20sIF9UbywgZmFsc2U+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvLCBib29sCisgICAgICAgICAgID0gX19hbmRfPGlzX2x2YWx1ZV9yZWZlcmVuY2U8X0Zyb20+LAorICAgICAgICAgICAgICAgICAgICBpc19ydmFsdWVfcmVmZXJlbmNlPF9Ubz4+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX19pc19sdmFsdWVfdG9fcnZhbHVlX3JlZjsKKworICAvLyBEZXRlY3Qgd2hldGhlciB3ZSBoYXZlIGFuIGx2YWx1ZSBvZiBub24tZnVuY3Rpb24gdHlwZQorICAvLyBib3VuZCB0byBhIHJlZmVyZW5jZS1jb21wYXRpYmxlIHJ2YWx1ZS1yZWZlcmVuY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8+CisgICAgc3RydWN0IF9faXNfbHZhbHVlX3RvX3J2YWx1ZV9yZWY8X0Zyb20sIF9UbywgdHJ1ZT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jdjx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPAorICAgICAgICBfRnJvbT46OnR5cGU+Ojp0eXBlIF9fc3JjX3Q7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jdjx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPAorICAgICAgICBfVG8+Ojp0eXBlPjo6dHlwZSBfX2RzdF90OworICAgICAgdHlwZWRlZiBfX2FuZF88X19ub3RfPGlzX2Z1bmN0aW9uPF9fc3JjX3Q+PiwgCisgICAgICAgIF9fb3JfPGlzX3NhbWU8X19zcmNfdCwgX19kc3RfdD4sCisJCSAgICBpc19iYXNlX29mPF9fZHN0X3QsIF9fc3JjX3Q+Pj4gdHlwZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9IHR5cGU6OnZhbHVlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9Ubz4KKyAgICBzdHJ1Y3QgX19pc19sdmFsdWVfdG9fcnZhbHVlX3JlZjxfRnJvbSwgX1RvLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlCisgICAgeyB9OworCisgIC8vIEhlcmUgd2UgaGFuZGxlIGRpcmVjdC1pbml0aWFsaXphdGlvbiB0byBhIHJlZmVyZW5jZSB0eXBlIGFzIAorICAvLyBlcXVpdmFsZW50IHRvIGEgc3RhdGljX2Nhc3QgbW9kdWxvIG92ZXJzaG9vdGluZyBjb252ZXJzaW9ucy4KKyAgLy8gVGhlc2UgYXJlIHJlc3RyaWN0ZWQgdG8gdGhlIGZvbGxvd2luZyBjb252ZXJzaW9uczoKKyAgLy8gICAgYSkgQSBiYXNlIGNsYXNzIHZhbHVlIHRvIGEgZGVyaXZlZCBjbGFzcyByZWZlcmVuY2UKKyAgLy8gICAgYikgQW4gbHZhbHVlIHRvIGFuIHJ2YWx1ZS1yZWZlcmVuY2Ugb2YgcmVmZXJlbmNlLWNvbXBhdGlibGUgCisgIC8vICAgICAgIHR5cGVzIHRoYXQgYXJlIG5vdCBmdW5jdGlvbnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIHN0cnVjdCBfX2lzX2RpcmVjdF9jb25zdHJ1Y3RpYmxlX3JlZl9jYXN0CisgICAgOiBwdWJsaWMgX19hbmRfPF9faXNfc3RhdGljX2Nhc3RhYmxlPF9BcmcsIF9UcD4sCisgICAgICAgICAgICAgICAgICAgIF9fbm90XzxfX29yXzxfX2lzX2Jhc2VfdG9fZGVyaXZlZF9yZWY8X0FyZywgX1RwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXNfbHZhbHVlX3RvX3J2YWx1ZV9yZWY8X0FyZywgX1RwPgorICAgICAgICAgICAgICAgICAgID4+Pjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgc3RydWN0IF9faXNfZGlyZWN0X2NvbnN0cnVjdGlibGVfbmV3CisgICAgOiBwdWJsaWMgY29uZGl0aW9uYWw8aXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlLAorCQkJIF9faXNfZGlyZWN0X2NvbnN0cnVjdGlibGVfcmVmX2Nhc3Q8X1RwLCBfQXJnPiwKKwkJCSBfX2lzX2RpcmVjdF9jb25zdHJ1Y3RpYmxlX25ld19zYWZlPF9UcCwgX0FyZz4KKwkJCSA+Ojp0eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FyZz4KKyAgICBzdHJ1Y3QgX19pc19kaXJlY3RfY29uc3RydWN0aWJsZQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX2RpcmVjdF9jb25zdHJ1Y3RpYmxlX25ldzwKKwkJCQkgICAgICBfVHAsIF9Bcmc+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vIFNpbmNlIGRlZmF1bHQtY29uc3RydWN0aW9uIGFuZCBiaW5hcnkgZGlyZWN0LWluaXRpYWxpemF0aW9uIGhhdmUKKyAgLy8gYmVlbiBoYW5kbGVkIHNlcGFyYXRlbHksIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVtYWluaW5nCisgIC8vIG4tYXJ5IGNvbnN0cnVjdGlvbiBjYXNlcyBpcyByYXRoZXIgc3RyYWlnaHRmb3J3YXJkLiBXZSBjYW4gdXNlCisgIC8vIGhlcmUgYSBmdW5jdGlvbmFsIGNhc3QsIGJlY2F1c2UgYXJyYXkgdHlwZXMgYXJlIGV4Y2x1ZGVkIGFueXdheQorICAvLyBhbmQgdGhpcyBmb3JtIGlzIG5ldmVyIGludGVycHJldGVkIGFzIGEgQyBjYXN0LgorICBzdHJ1Y3QgX19kb19pc19uYXJ5X2NvbnN0cnVjdGlibGVfaW1wbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncywgdHlwZW5hbWUKKyAgICAgICAgICAgICA9IGRlY2x0eXBlKF9UcChkZWNsdmFsPF9BcmdzPigpLi4uKSk+CisgICAgICBzdGF0aWMgdHJ1ZV90eXBlIF9fdGVzdChpbnQpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lLi4uPgorICAgICAgc3RhdGljIGZhbHNlX3R5cGUgX190ZXN0KC4uLik7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19pc19uYXJ5X2NvbnN0cnVjdGlibGVfaW1wbAorICAgIDogcHVibGljIF9fZG9faXNfbmFyeV9jb25zdHJ1Y3RpYmxlX2ltcGwKKyAgICB7CisgICAgICB0eXBlZGVmIGRlY2x0eXBlKF9fdGVzdDxfVHAsIF9BcmdzLi4uPigwKSkgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IF9faXNfbmFyeV9jb25zdHJ1Y3RpYmxlCisgICAgOiBwdWJsaWMgX19pc19uYXJ5X2NvbnN0cnVjdGlibGVfaW1wbDxfVHAsIF9BcmdzLi4uPjo6dHlwZQorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mLi4uKF9BcmdzKSA+IDEsCisgICAgICAgICAgICAgICAgICAgICJPbmx5IHVzZWZ1bCBmb3IgPiAxIGFyZ3VtZW50cyIpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19pc19jb25zdHJ1Y3RpYmxlX2ltcGwKKyAgICA6IHB1YmxpYyBfX2lzX25hcnlfY29uc3RydWN0aWJsZTxfVHAsIF9BcmdzLi4uPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgc3RydWN0IF9faXNfY29uc3RydWN0aWJsZV9pbXBsPF9UcCwgX0FyZz4KKyAgICA6IHB1YmxpYyBfX2lzX2RpcmVjdF9jb25zdHJ1Y3RpYmxlPF9UcCwgX0FyZz4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2NvbnN0cnVjdGlibGVfaW1wbDxfVHA+CisgICAgOiBwdWJsaWMgaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9UcD4KKyAgICB7IH07CisKKyAgLy8vIGlzX2NvbnN0cnVjdGlibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgaXNfY29uc3RydWN0aWJsZQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX2NvbnN0cnVjdGlibGVfaW1wbDxfVHAsCisJCQkJICAgICAgX0FyZ3MuLi4+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbCA9IGlzX3ZvaWQ8X1RwPjo6dmFsdWU+CisgICAgc3RydWN0IF9faXNfY29weV9jb25zdHJ1Y3RpYmxlX2ltcGw7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2NvcHlfY29uc3RydWN0aWJsZV9pbXBsPF9UcCwgdHJ1ZT4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfY29weV9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBpc19jb25zdHJ1Y3RpYmxlPF9UcCwgY29uc3QgX1RwJj4KKyAgICB7IH07CisKKyAgLy8vIGlzX2NvcHlfY29uc3RydWN0aWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2NvcHlfY29uc3RydWN0aWJsZQorICAgIDogcHVibGljIF9faXNfY29weV9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgPSBpc192b2lkPF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX2lzX21vdmVfY29uc3RydWN0aWJsZV9pbXBsOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19tb3ZlX2NvbnN0cnVjdGlibGVfaW1wbDxfVHAsIHRydWU+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX21vdmVfY29uc3RydWN0aWJsZV9pbXBsPF9UcCwgZmFsc2U+CisgICAgOiBwdWJsaWMgaXNfY29uc3RydWN0aWJsZTxfVHAsIF9UcCYmPgorICAgIHsgfTsKKworICAvLy8gaXNfbW92ZV9jb25zdHJ1Y3RpYmxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbW92ZV9jb25zdHJ1Y3RpYmxlCisgICAgOiBwdWJsaWMgX19pc19tb3ZlX2NvbnN0cnVjdGlibGVfaW1wbDxfVHA+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19udF9kZWZhdWx0X2NvbnN0cnVjdGlibGVfYXRvbQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIG5vZXhjZXB0KF9UcCgpKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sID0gaXNfYXJyYXk8X1RwPjo6dmFsdWU+CisgICAgc3RydWN0IF9faXNfbnRfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2ltcGw7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX250X2RlZmF1bHRfY29uc3RydWN0aWJsZV9pbXBsPF9UcCwgdHJ1ZT4KKyAgICA6IHB1YmxpYyBfX2FuZF88X19pc19hcnJheV9rbm93bl9ib3VuZHM8X1RwPiwKKwkJICAgIF9faXNfbnRfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2F0b208dHlwZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZT4+Ojp0eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19udF9kZWZhdWx0X2NvbnN0cnVjdGlibGVfaW1wbDxfVHAsIGZhbHNlPgorICAgIDogcHVibGljIF9faXNfbnRfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2F0b208X1RwPgorICAgIHsgfTsKKworICAvLy8gaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZQorICAgIDogcHVibGljIF9fYW5kXzxpc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X1RwPiwKKyAgICAgICAgICAgICAgICAgICAgX19pc19udF9kZWZhdWx0X2NvbnN0cnVjdGlibGVfaW1wbDxfVHA+Pjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX2lzX250X2NvbnN0cnVjdGlibGVfaW1wbAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIG5vZXhjZXB0KF9UcChkZWNsdmFsPF9BcmdzPigpLi4uKSk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FyZz4KKyAgICBzdHJ1Y3QgX19pc19udF9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwLCBfQXJnPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9leGNlcHQoc3RhdGljX2Nhc3Q8X1RwPihkZWNsdmFsPF9Bcmc+KCkpKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX250X2NvbnN0cnVjdGlibGVfaW1wbDxfVHA+CisgICAgOiBwdWJsaWMgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X1RwPgorICAgIHsgfTsKKworICAvLy8gaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IGlzX25vdGhyb3dfY29uc3RydWN0aWJsZQorICAgIDogcHVibGljIF9fYW5kXzxpc19jb25zdHJ1Y3RpYmxlPF9UcCwgX0FyZ3MuLi4+LAorCQkgICAgX19pc19udF9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwLCBfQXJncy4uLj4+Ojp0eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbCA9IGlzX3ZvaWQ8X1RwPjo6dmFsdWU+CisgICAgc3RydWN0IF9faXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGVfaW1wbDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGVfaW1wbDxfVHAsIHRydWU+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBpc19ub3Rocm93X2NvbnN0cnVjdGlibGU8X1RwLCBjb25zdCBfVHAmPgorICAgIHsgfTsKKworICAvLy8gaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZQorICAgIDogcHVibGljIF9faXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGVfaW1wbDxfVHA+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbCA9IGlzX3ZvaWQ8X1RwPjo6dmFsdWU+CisgICAgc3RydWN0IF9faXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGVfaW1wbDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGVfaW1wbDxfVHAsIHRydWU+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBpc19ub3Rocm93X2NvbnN0cnVjdGlibGU8X1RwLCBfVHAmJj4KKyAgICB7IH07CisKKyAgLy8vIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBfX2lzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBjbGFzcyBfX2lzX2Fzc2lnbmFibGVfaGVscGVyCisgICAgOiBwdWJsaWMgX19zZmluYWVfdHlwZXMKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVXAxPgorICAgICAgICBzdGF0aWMgZGVjbHR5cGUoZGVjbHZhbDxfVHAxPigpID0gZGVjbHZhbDxfVXAxPigpLCBfX29uZSgpKQorCV9fdGVzdChpbnQpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9IHNpemVvZihfX3Rlc3Q8X1RwLCBfVXA+KDApKSA9PSAxOworICAgIH07CisKKyAgLy8vIGlzX2Fzc2lnbmFibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgc3RydWN0IGlzX2Fzc2lnbmFibGUKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXNfYXNzaWduYWJsZV9oZWxwZXI8X1RwLCBfVXA+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sID0gaXNfdm9pZDxfVHA+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX19pc19jb3B5X2Fzc2lnbmFibGVfaW1wbDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfY29weV9hc3NpZ25hYmxlX2ltcGw8X1RwLCB0cnVlPgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19jb3B5X2Fzc2lnbmFibGVfaW1wbDxfVHAsIGZhbHNlPgorICAgIDogcHVibGljIGlzX2Fzc2lnbmFibGU8X1RwJiwgY29uc3QgX1RwJj4KKyAgICB7IH07CisKKyAgLy8vIGlzX2NvcHlfYXNzaWduYWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2NvcHlfYXNzaWduYWJsZQorICAgIDogcHVibGljIF9faXNfY29weV9hc3NpZ25hYmxlX2ltcGw8X1RwPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgPSBpc192b2lkPF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX2lzX21vdmVfYXNzaWduYWJsZV9pbXBsOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19tb3ZlX2Fzc2lnbmFibGVfaW1wbDxfVHAsIHRydWU+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX21vdmVfYXNzaWduYWJsZV9pbXBsPF9UcCwgZmFsc2U+CisgICAgOiBwdWJsaWMgaXNfYXNzaWduYWJsZTxfVHAmLCBfVHAmJj4KKyAgICB7IH07CisKKyAgLy8vIGlzX21vdmVfYXNzaWduYWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX21vdmVfYXNzaWduYWJsZQorICAgIDogcHVibGljIF9faXNfbW92ZV9hc3NpZ25hYmxlX2ltcGw8X1RwPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX19pc19udF9hc3NpZ25hYmxlX2ltcGwKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBub2V4Y2VwdChkZWNsdmFsPF9UcD4oKSA9IGRlY2x2YWw8X1VwPigpKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX25vdGhyb3dfYXNzaWduYWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgaXNfbm90aHJvd19hc3NpZ25hYmxlCisgICAgOiBwdWJsaWMgX19hbmRfPGlzX2Fzc2lnbmFibGU8X1RwLCBfVXA+LAorCQkgICAgX19pc19udF9hc3NpZ25hYmxlX2ltcGw8X1RwLCBfVXA+Pjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgPSBpc192b2lkPF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX2lzX250X2NvcHlfYXNzaWduYWJsZV9pbXBsOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19udF9jb3B5X2Fzc2lnbmFibGVfaW1wbDxfVHAsIHRydWU+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX250X2NvcHlfYXNzaWduYWJsZV9pbXBsPF9UcCwgZmFsc2U+CisgICAgOiBwdWJsaWMgaXNfbm90aHJvd19hc3NpZ25hYmxlPF9UcCYsIGNvbnN0IF9UcCY+CisgICAgeyB9OworCisgIC8vLyBpc19ub3Rocm93X2NvcHlfYXNzaWduYWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX25vdGhyb3dfY29weV9hc3NpZ25hYmxlCisgICAgOiBwdWJsaWMgX19pc19udF9jb3B5X2Fzc2lnbmFibGVfaW1wbDxfVHA+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbCA9IGlzX3ZvaWQ8X1RwPjo6dmFsdWU+CisgICAgc3RydWN0IF9faXNfbnRfbW92ZV9hc3NpZ25hYmxlX2ltcGw7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX250X21vdmVfYXNzaWduYWJsZV9pbXBsPF9UcCwgdHJ1ZT4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbnRfbW92ZV9hc3NpZ25hYmxlX2ltcGw8X1RwLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBpc19ub3Rocm93X2Fzc2lnbmFibGU8X1RwJiwgX1RwJiY+CisgICAgeyB9OworCisgIC8vLyBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlCisgICAgOiBwdWJsaWMgX19pc19udF9tb3ZlX2Fzc2lnbmFibGVfaW1wbDxfVHA+CisgICAgeyB9OworCisgIC8vLyBpc190cml2aWFsbHlfY29uc3RydWN0aWJsZSAoc3RpbGwgdW5pbXBsZW1lbnRlZCkKKyAgCisgIC8vLyBpc190cml2aWFsbHlfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlIChzdGlsbCB1bmltcGxlbWVudGVkKQorCisgIC8vLyBpc190cml2aWFsbHlfY29weV9jb25zdHJ1Y3RpYmxlIChzdGlsbCB1bmltcGxlbWVudGVkKQorCisgIC8vLyBpc190cml2aWFsbHlfbW92ZV9jb25zdHJ1Y3RpYmxlIChzdGlsbCB1bmltcGxlbWVudGVkKQorCisgIC8vLyBpc190cml2aWFsbHlfYXNzaWduYWJsZSAoc3RpbGwgdW5pbXBsZW1lbnRlZCkKKworICAvLy8gaXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZSAoc3RpbGwgdW5pbXBsZW1lbnRlZCkKKworICAvLy8gaXNfdHJpdmlhbGx5X21vdmVfYXNzaWduYWJsZSAoc3RpbGwgdW5pbXBsZW1lbnRlZCkKKworICAvLy8gaXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBfX2FuZF88aXNfZGVzdHJ1Y3RpYmxlPF9UcD4sIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisJCQkgICAgICBfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoX1RwKT4+Ojp0eXBlCisgICAgeyB9OworCisgIC8vLyBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yICh0ZW1wb3JhcnkgbGVnYWN5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3IKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yICh0ZW1wb3JhcnkgbGVnYWN5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3IKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2hhc190cml2aWFsX2NvcHkoX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGhhc190cml2aWFsX2NvcHlfYXNzaWduICh0ZW1wb3JhcnkgbGVnYWN5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc190cml2aWFsX2NvcHlfYXNzaWduCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19oYXNfdHJpdmlhbF9hc3NpZ24oX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGhhc192aXJ0dWFsX2Rlc3RydWN0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfdmlydHVhbF9kZXN0cnVjdG9yCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yKF9UcCk+CisgICAgeyB9OworCisgIAorICAvLyB0eXBlIHByb3BlcnR5IHF1ZXJpZXMuCisKKyAgLy8vIGFsaWdubWVudF9vZgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGFsaWdubWVudF9vZgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LCBfX2FsaWdub2ZfXyhfVHApPiB7IH07CisgIAorICAvLy8gcmFuaworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgcmFuaworICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LCAwPiB7IH07CisgICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfU2l6ZT4KKyAgICBzdHJ1Y3QgcmFuazxfVHBbX1NpemVdPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LCAxICsgcmFuazxfVHA+Ojp2YWx1ZT4geyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmFuazxfVHBbXT4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgMSArIHJhbms8X1RwPjo6dmFsdWU+IHsgfTsKKworICAvLy8gZXh0ZW50CisgIHRlbXBsYXRlPHR5cGVuYW1lLCB1bnNpZ25lZCBfVWludD4KKyAgICBzdHJ1Y3QgZXh0ZW50CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDA+IHsgfTsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdW5zaWduZWQgX1VpbnQsIHN0ZDo6c2l6ZV90IF9TaXplPgorICAgIHN0cnVjdCBleHRlbnQ8X1RwW19TaXplXSwgX1VpbnQ+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsCisJCQkgICAgICAgX1VpbnQgPT0gMCA/IF9TaXplIDogZXh0ZW50PF9UcCwKKwkJCQkJCQkgICBfVWludCAtIDE+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB1bnNpZ25lZCBfVWludD4KKyAgICBzdHJ1Y3QgZXh0ZW50PF9UcFtdLCBfVWludD4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwKKwkJCSAgICAgICBfVWludCA9PSAwID8gMCA6IGV4dGVudDxfVHAsCisJCQkJCQkgICAgICAgX1VpbnQgLSAxPjo6dmFsdWU+CisgICAgeyB9OworCisKKyAgLy8gVHlwZSByZWxhdGlvbnMuCisKKyAgLy8vIGlzX3NhbWUKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc19zYW1lCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19zYW1lPF9UcCwgX1RwPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLy8vIGlzX2Jhc2Vfb2YKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Jhc2UsIHR5cGVuYW1lIF9EZXJpdmVkPgorICAgIHN0cnVjdCBpc19iYXNlX29mCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19iYXNlX29mKF9CYXNlLCBfRGVyaXZlZCk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8sCisgICAgICAgICAgIGJvb2wgPSBfX29yXzxpc192b2lkPF9Gcm9tPiwgaXNfZnVuY3Rpb248X1RvPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX2FycmF5PF9Ubz4+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX19pc19jb252ZXJ0aWJsZV9oZWxwZXIKKyAgICB7IHN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9IGlzX3ZvaWQ8X1RvPjo6dmFsdWU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9Ubz4KKyAgICBjbGFzcyBfX2lzX2NvbnZlcnRpYmxlX2hlbHBlcjxfRnJvbSwgX1RvLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBfX3NmaW5hZV90eXBlcworICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UbzE+CisgICAgICAgIHN0YXRpYyB2b2lkIF9fdGVzdF9hdXgoX1RvMSk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tMSwgdHlwZW5hbWUgX1RvMT4KKyAgICAgICAgc3RhdGljIGRlY2x0eXBlKF9fdGVzdF9hdXg8X1RvMT4oc3RkOjpkZWNsdmFsPF9Gcm9tMT4oKSksIF9fb25lKCkpCisJX190ZXN0KGludCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICAgICAgc3RhdGljIF9fdHdvIF9fdGVzdCguLi4pOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gc2l6ZW9mKF9fdGVzdDxfRnJvbSwgX1RvPigwKSkgPT0gMTsKKyAgICB9OworCisgIC8vLyBpc19jb252ZXJ0aWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvPgorICAgIHN0cnVjdCBpc19jb252ZXJ0aWJsZQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisJCQkgICAgICAgX19pc19jb252ZXJ0aWJsZV9oZWxwZXI8X0Zyb20sIF9Ubz46OnZhbHVlPgorICAgIHsgfTsKKworCisgIC8vIENvbnN0LXZvbGF0aWxlIG1vZGlmaWNhdGlvbnMuCisKKyAgLy8vIHJlbW92ZV9jb25zdAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9jb25zdAorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfY29uc3Q8X1RwIGNvbnN0PgorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisgIAorICAvLy8gcmVtb3ZlX3ZvbGF0aWxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3ZvbGF0aWxlCisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV92b2xhdGlsZTxfVHAgdm9sYXRpbGU+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKyAgCisgIC8vLyByZW1vdmVfY3YKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfY3YKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICByZW1vdmVfY29uc3Q8dHlwZW5hbWUgcmVtb3ZlX3ZvbGF0aWxlPF9UcD46OnR5cGU+Ojp0eXBlICAgICB0eXBlOworICAgIH07CisgIAorICAvLy8gYWRkX2NvbnN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWRkX2NvbnN0CisgICAgeyB0eXBlZGVmIF9UcCBjb25zdCAgICAgdHlwZTsgfTsKKyAgIAorICAvLy8gYWRkX3ZvbGF0aWxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWRkX3ZvbGF0aWxlCisgICAgeyB0eXBlZGVmIF9UcCB2b2xhdGlsZSAgICAgdHlwZTsgfTsKKyAgCisgIC8vLyBhZGRfY3YKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhZGRfY3YKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICBhZGRfY29uc3Q8dHlwZW5hbWUgYWRkX3ZvbGF0aWxlPF9UcD46OnR5cGU+Ojp0eXBlICAgICB0eXBlOworICAgIH07CisKKworICAvLyBSZWZlcmVuY2UgdHJhbnNmb3JtYXRpb25zLgorCisgIC8vLyByZW1vdmVfcmVmZXJlbmNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZQorICAgIHsgdHlwZWRlZiBfVHAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZTxfVHAmPgorICAgIHsgdHlwZWRlZiBfVHAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZTxfVHAmJj4KKyAgICB7IHR5cGVkZWYgX1RwICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsCisJICAgYm9vbCA9IF9fYW5kXzxfX25vdF88aXNfcmVmZXJlbmNlPF9UcD4+LAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fbm90Xzxpc192b2lkPF9UcD4+Pjo6dmFsdWUsCisJICAgYm9vbCA9IGlzX3J2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dmFsdWU+CisgICAgc3RydWN0IF9fYWRkX2x2YWx1ZV9yZWZlcmVuY2VfaGVscGVyCisgICAgeyB0eXBlZGVmIF9UcCAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FkZF9sdmFsdWVfcmVmZXJlbmNlX2hlbHBlcjxfVHAsIHRydWUsIGZhbHNlPgorICAgIHsgdHlwZWRlZiBfVHAmICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX2x2YWx1ZV9yZWZlcmVuY2VfaGVscGVyPF9UcCwgZmFsc2UsIHRydWU+CisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSYgICB0eXBlOyB9OworCisgIC8vLyBhZGRfbHZhbHVlX3JlZmVyZW5jZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGFkZF9sdmFsdWVfcmVmZXJlbmNlCisgICAgOiBwdWJsaWMgX19hZGRfbHZhbHVlX3JlZmVyZW5jZV9oZWxwZXI8X1RwPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIGJvb2wgPSBfX2FuZF88X19ub3RfPGlzX3JlZmVyZW5jZTxfVHA+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX25vdF88aXNfdm9pZDxfVHA+Pj46OnZhbHVlPgorICAgIHN0cnVjdCBfX2FkZF9ydmFsdWVfcmVmZXJlbmNlX2hlbHBlcgorICAgIHsgdHlwZWRlZiBfVHAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfcnZhbHVlX3JlZmVyZW5jZV9oZWxwZXI8X1RwLCB0cnVlPgorICAgIHsgdHlwZWRlZiBfVHAmJiAgIHR5cGU7IH07CisKKyAgLy8vIGFkZF9ydmFsdWVfcmVmZXJlbmNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWRkX3J2YWx1ZV9yZWZlcmVuY2UKKyAgICA6IHB1YmxpYyBfX2FkZF9ydmFsdWVfcmVmZXJlbmNlX2hlbHBlcjxfVHA+CisgICAgeyB9OworCisKKyAgLy8gU2lnbiBtb2RpZmljYXRpb25zLgorCisgIC8vIFV0aWxpdHkgZm9yIGNvbnN0cnVjdGluZyBpZGVudGljYWxseSBjdi1xdWFsaWZpZWQgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VbnF1YWxpZmllZCwgYm9vbCBfSXNDb25zdCwgYm9vbCBfSXNWb2w+CisgICAgc3RydWN0IF9fY3Zfc2VsZWN0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VucXVhbGlmaWVkPgorICAgIHN0cnVjdCBfX2N2X3NlbGVjdG9yPF9VbnF1YWxpZmllZCwgZmFsc2UsIGZhbHNlPgorICAgIHsgdHlwZWRlZiBfVW5xdWFsaWZpZWQgX190eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VbnF1YWxpZmllZD4KKyAgICBzdHJ1Y3QgX19jdl9zZWxlY3RvcjxfVW5xdWFsaWZpZWQsIGZhbHNlLCB0cnVlPgorICAgIHsgdHlwZWRlZiB2b2xhdGlsZSBfVW5xdWFsaWZpZWQgX190eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VbnF1YWxpZmllZD4KKyAgICBzdHJ1Y3QgX19jdl9zZWxlY3RvcjxfVW5xdWFsaWZpZWQsIHRydWUsIGZhbHNlPgorICAgIHsgdHlwZWRlZiBjb25zdCBfVW5xdWFsaWZpZWQgX190eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VbnF1YWxpZmllZD4KKyAgICBzdHJ1Y3QgX19jdl9zZWxlY3RvcjxfVW5xdWFsaWZpZWQsIHRydWUsIHRydWU+CisgICAgeyB0eXBlZGVmIGNvbnN0IHZvbGF0aWxlIF9VbnF1YWxpZmllZCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1F1YWxpZmllZCwgdHlwZW5hbWUgX1VucXVhbGlmaWVkLAorCSAgIGJvb2wgX0lzQ29uc3QgPSBpc19jb25zdDxfUXVhbGlmaWVkPjo6dmFsdWUsCisJICAgYm9vbCBfSXNWb2wgPSBpc192b2xhdGlsZTxfUXVhbGlmaWVkPjo6dmFsdWU+CisgICAgY2xhc3MgX19tYXRjaF9jdl9xdWFsaWZpZXJzCisgICAgeworICAgICAgdHlwZWRlZiBfX2N2X3NlbGVjdG9yPF9VbnF1YWxpZmllZCwgX0lzQ29uc3QsIF9Jc1ZvbD4gX19tYXRjaDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19tYXRjaDo6X190eXBlIF9fdHlwZTsgCisgICAgfTsKKworICAvLyBVdGlsaXR5IGZvciBmaW5kaW5nIHRoZSB1bnNpZ25lZCB2ZXJzaW9ucyBvZiBzaWduZWQgaW50ZWdyYWwgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkCisgICAgeyB0eXBlZGVmIF9UcCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX21ha2VfdW5zaWduZWQ8Y2hhcj4KKyAgICB7IHR5cGVkZWYgdW5zaWduZWQgY2hhciBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX21ha2VfdW5zaWduZWQ8c2lnbmVkIGNoYXI+CisgICAgeyB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkPHNob3J0PgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX21ha2VfdW5zaWduZWQ8aW50PgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBpbnQgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkPGxvbmc+CisgICAgeyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkPGxvbmcgbG9uZz4KKyAgICB7IHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9fdHlwZTsgfTsKKworI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfSU5UMTI4KQorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV91bnNpZ25lZDxfX2ludDEyOD4KKyAgICB7IHR5cGVkZWYgdW5zaWduZWQgX19pbnQxMjggX190eXBlOyB9OworI2VuZGlmCisKKyAgLy8gU2VsZWN0IGJldHdlZW4gaW50ZWdyYWwgYW5kIGVudW06IG5vdCBwb3NzaWJsZSB0byBiZSBib3RoLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIAorCSAgIGJvb2wgX0lzSW50ID0gaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUsCisJICAgYm9vbCBfSXNFbnVtID0gaXNfZW51bTxfVHA+Ojp2YWx1ZT4KKyAgICBjbGFzcyBfX21ha2VfdW5zaWduZWRfc2VsZWN0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9fbWFrZV91bnNpZ25lZF9zZWxlY3RvcjxfVHAsIHRydWUsIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX19tYWtlX3Vuc2lnbmVkPHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPiBfX3Vuc2lnbmVkdDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX191bnNpZ25lZHQ6Ol9fdHlwZSBfX3Vuc2lnbmVkX3R5cGU7CisgICAgICB0eXBlZGVmIF9fbWF0Y2hfY3ZfcXVhbGlmaWVyczxfVHAsIF9fdW5zaWduZWRfdHlwZT4gX19jdl91bnNpZ25lZDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19jdl91bnNpZ25lZDo6X190eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfX21ha2VfdW5zaWduZWRfc2VsZWN0b3I8X1RwLCBmYWxzZSwgdHJ1ZT4KKyAgICB7CisgICAgICAvLyBXaXRoIC1mc2hvcnQtZW51bXMsIGFuIGVudW0gbWF5IGJlIGFzIHNtYWxsIGFzIGEgY2hhci4KKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBfX3NtYWxsZXN0OworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX19iMCA9IHNpemVvZihfVHApIDw9IHNpemVvZihfX3NtYWxsZXN0KTsKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9fYjEgPSBzaXplb2YoX1RwKSA8PSBzaXplb2YodW5zaWduZWQgc2hvcnQpOworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX19iMiA9IHNpemVvZihfVHApIDw9IHNpemVvZih1bnNpZ25lZCBpbnQpOworICAgICAgdHlwZWRlZiBjb25kaXRpb25hbDxfX2IyLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmc+IF9fY29uZDI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY29uZDI6OnR5cGUgX19jb25kMl90eXBlOworICAgICAgdHlwZWRlZiBjb25kaXRpb25hbDxfX2IxLCB1bnNpZ25lZCBzaG9ydCwgX19jb25kMl90eXBlPiBfX2NvbmQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2NvbmQxOjp0eXBlIF9fY29uZDFfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8X19iMCwgX19zbWFsbGVzdCwgX19jb25kMV90eXBlPjo6dHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLyBHaXZlbiBhbiBpbnRlZ3JhbC9lbnVtIHR5cGUsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB1bnNpZ25lZAorICAvLyBpbnRlZ2VyIHR5cGUuCisgIC8vIFByaW1hcnkgdGVtcGxhdGUuCisgIC8vLyBtYWtlX3Vuc2lnbmVkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbWFrZV91bnNpZ25lZCAKKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgX19tYWtlX3Vuc2lnbmVkX3NlbGVjdG9yPF9UcD46Ol9fdHlwZSB0eXBlOyB9OworCisgIC8vIEludGVncmFsLCBidXQgZG9uJ3QgZGVmaW5lLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG1ha2VfdW5zaWduZWQ8Ym9vbD47CisKKworICAvLyBVdGlsaXR5IGZvciBmaW5kaW5nIHRoZSBzaWduZWQgdmVyc2lvbnMgb2YgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19tYWtlX3NpZ25lZAorICAgIHsgdHlwZWRlZiBfVHAgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3NpZ25lZDxjaGFyPgorICAgIHsgdHlwZWRlZiBzaWduZWQgY2hhciBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX21ha2Vfc2lnbmVkPHVuc2lnbmVkIGNoYXI+CisgICAgeyB0eXBlZGVmIHNpZ25lZCBjaGFyIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV9zaWduZWQ8dW5zaWduZWQgc2hvcnQ+CisgICAgeyB0eXBlZGVmIHNpZ25lZCBzaG9ydCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX21ha2Vfc2lnbmVkPHVuc2lnbmVkIGludD4KKyAgICB7IHR5cGVkZWYgc2lnbmVkIGludCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX21ha2Vfc2lnbmVkPHVuc2lnbmVkIGxvbmc+CisgICAgeyB0eXBlZGVmIHNpZ25lZCBsb25nIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV9zaWduZWQ8dW5zaWduZWQgbG9uZyBsb25nPgorICAgIHsgdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIF9fdHlwZTsgfTsKKworI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfSU5UMTI4KQorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV9zaWduZWQ8dW5zaWduZWQgX19pbnQxMjg+CisgICAgeyB0eXBlZGVmIF9faW50MTI4IF9fdHlwZTsgfTsKKyNlbmRpZgorCisgIC8vIFNlbGVjdCBiZXR3ZWVuIGludGVncmFsIGFuZCBlbnVtOiBub3QgcG9zc2libGUgdG8gYmUgYm90aC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCAKKwkgICBib29sIF9Jc0ludCA9IGlzX2ludGVncmFsPF9UcD46OnZhbHVlLAorCSAgIGJvb2wgX0lzRW51bSA9IGlzX2VudW08X1RwPjo6dmFsdWU+CisgICAgY2xhc3MgX19tYWtlX3NpZ25lZF9zZWxlY3RvcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX19tYWtlX3NpZ25lZF9zZWxlY3RvcjxfVHAsIHRydWUsIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX19tYWtlX3NpZ25lZDx0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT4gX19zaWduZWR0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3NpZ25lZHQ6Ol9fdHlwZSBfX3NpZ25lZF90eXBlOworICAgICAgdHlwZWRlZiBfX21hdGNoX2N2X3F1YWxpZmllcnM8X1RwLCBfX3NpZ25lZF90eXBlPiBfX2N2X3NpZ25lZDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19jdl9zaWduZWQ6Ol9fdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX19tYWtlX3NpZ25lZF9zZWxlY3RvcjxfVHAsIGZhbHNlLCB0cnVlPgorICAgIHsKKyAgICAgIC8vIFdpdGggLWZzaG9ydC1lbnVtcywgYW4gZW51bSBtYXkgYmUgYXMgc21hbGwgYXMgYSBjaGFyLgorICAgICAgdHlwZWRlZiBzaWduZWQgY2hhciBfX3NtYWxsZXN0OworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX19iMCA9IHNpemVvZihfVHApIDw9IHNpemVvZihfX3NtYWxsZXN0KTsKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9fYjEgPSBzaXplb2YoX1RwKSA8PSBzaXplb2Yoc2lnbmVkIHNob3J0KTsKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9fYjIgPSBzaXplb2YoX1RwKSA8PSBzaXplb2Yoc2lnbmVkIGludCk7CisgICAgICB0eXBlZGVmIGNvbmRpdGlvbmFsPF9fYjIsIHNpZ25lZCBpbnQsIHNpZ25lZCBsb25nPiBfX2NvbmQyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2NvbmQyOjp0eXBlIF9fY29uZDJfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uZGl0aW9uYWw8X19iMSwgc2lnbmVkIHNob3J0LCBfX2NvbmQyX3R5cGU+IF9fY29uZDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY29uZDE6OnR5cGUgX19jb25kMV90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxfX2IwLCBfX3NtYWxsZXN0LCBfX2NvbmQxX3R5cGU+Ojp0eXBlIF9fdHlwZTsKKyAgICB9OworCisgIC8vIEdpdmVuIGFuIGludGVncmFsL2VudW0gdHlwZSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHNpZ25lZAorICAvLyBpbnRlZ2VyIHR5cGUuCisgIC8vIFByaW1hcnkgdGVtcGxhdGUuCisgIC8vLyBtYWtlX3NpZ25lZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG1ha2Vfc2lnbmVkIAorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSBfX21ha2Vfc2lnbmVkX3NlbGVjdG9yPF9UcD46Ol9fdHlwZSB0eXBlOyB9OworCisgIC8vIEludGVncmFsLCBidXQgZG9uJ3QgZGVmaW5lLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG1ha2Vfc2lnbmVkPGJvb2w+OworCisKKyAgLy8gQXJyYXkgbW9kaWZpY2F0aW9ucy4KKworICAvLy8gcmVtb3ZlX2V4dGVudAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9leHRlbnQKKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX1NpemU+CisgICAgc3RydWN0IHJlbW92ZV9leHRlbnQ8X1RwW19TaXplXT4KKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2V4dGVudDxfVHBbXT4KKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIC8vLyByZW1vdmVfYWxsX2V4dGVudHMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfYWxsX2V4dGVudHMKKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX1NpemU+CisgICAgc3RydWN0IHJlbW92ZV9hbGxfZXh0ZW50czxfVHBbX1NpemVdPgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZSAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9hbGxfZXh0ZW50czxfVHBbXT4KKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbF9leHRlbnRzPF9UcD46OnR5cGUgICAgIHR5cGU7IH07CisKKworICAvLyBQb2ludGVyIG1vZGlmaWNhdGlvbnMuCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfcG9pbnRlcl9oZWxwZXIKKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3JlbW92ZV9wb2ludGVyX2hlbHBlcjxfVHAsIF9VcCo+CisgICAgeyB0eXBlZGVmIF9VcCAgICAgdHlwZTsgfTsKKworICAvLy8gcmVtb3ZlX3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfcG9pbnRlcgorICAgIDogcHVibGljIF9fcmVtb3ZlX3BvaW50ZXJfaGVscGVyPF9UcCwgdHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+CisgICAgeyB9OworCisgIC8vLyBhZGRfcG9pbnRlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGFkZF9wb2ludGVyCisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSogICAgIHR5cGU7IH07CisKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfTGVuPgorICAgIHN0cnVjdCBfX2FsaWduZWRfc3RvcmFnZV9tc2EKKyAgICB7IAorICAgICAgdW5pb24gX190eXBlCisgICAgICB7CisJdW5zaWduZWQgY2hhciBfX2RhdGFbX0xlbl07CisJc3RydWN0IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKSkgeyB9IF9fYWxpZ247IAorICAgICAgfTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIEFsaWdubWVudCB0eXBlLgorICAgKgorICAgKiAgVGhlIHZhbHVlIG9mIF9BbGlnbiBpcyBhIGRlZmF1bHQtYWxpZ25tZW50IHdoaWNoIHNoYWxsIGJlIHRoZQorICAgKiAgbW9zdCBzdHJpbmdlbnQgYWxpZ25tZW50IHJlcXVpcmVtZW50IGZvciBhbnkgQysrIG9iamVjdCB0eXBlCisgICAqICB3aG9zZSBzaXplIGlzIG5vIGdyZWF0ZXIgdGhhbiBfTGVuICgzLjkpLiBUaGUgbWVtYmVyIHR5cGVkZWYKKyAgICogIHR5cGUgc2hhbGwgYmUgYSBQT0QgdHlwZSBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaW5pdGlhbGl6ZWQKKyAgICogIHN0b3JhZ2UgZm9yIGFueSBvYmplY3Qgd2hvc2Ugc2l6ZSBpcyBhdCBtb3N0IF9MZW4gYW5kIHdob3NlCisgICAqICBhbGlnbm1lbnQgaXMgYSBkaXZpc29yIG9mIF9BbGlnbi4KKyAgKi8KKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0xlbiwgc3RkOjpzaXplX3QgX0FsaWduID0KKwkgICBfX2FsaWdub2ZfXyh0eXBlbmFtZSBfX2FsaWduZWRfc3RvcmFnZV9tc2E8X0xlbj46Ol9fdHlwZSk+CisgICAgc3RydWN0IGFsaWduZWRfc3RvcmFnZQorICAgIHsgCisgICAgICB1bmlvbiB0eXBlCisgICAgICB7CisJdW5zaWduZWQgY2hhciBfX2RhdGFbX0xlbl07CisJc3RydWN0IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKChfQWxpZ24pKSkpIHsgfSBfX2FsaWduOyAKKyAgICAgIH07CisgICAgfTsKKworCisgIC8vIERlY2F5IHRyYWl0IGZvciBhcnJheXMgYW5kIGZ1bmN0aW9ucywgdXNlZCBmb3IgcGVyZmVjdCBmb3J3YXJkaW5nCisgIC8vIGluIG1ha2VfcGFpciwgbWFrZV90dXBsZSwgZXRjLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIAorCSAgIGJvb2wgX0lzQXJyYXkgPSBpc19hcnJheTxfVXA+Ojp2YWx1ZSwKKwkgICBib29sIF9Jc0Z1bmN0aW9uID0gaXNfZnVuY3Rpb248X1VwPjo6dmFsdWU+IAorICAgIHN0cnVjdCBfX2RlY2F5X3NlbGVjdG9yOworCisgIC8vIE5COiBEUiA3MDUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4gCisgICAgc3RydWN0IF9fZGVjYXlfc2VsZWN0b3I8X1VwLCBmYWxzZSwgZmFsc2U+CisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jdjxfVXA+Ojp0eXBlIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+IAorICAgIHN0cnVjdCBfX2RlY2F5X3NlbGVjdG9yPF9VcCwgdHJ1ZSwgZmFsc2U+CisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9leHRlbnQ8X1VwPjo6dHlwZSogX190eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4gCisgICAgc3RydWN0IF9fZGVjYXlfc2VsZWN0b3I8X1VwLCBmYWxzZSwgdHJ1ZT4KKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgYWRkX3BvaW50ZXI8X1VwPjo6dHlwZSBfX3R5cGU7IH07CisKKyAgLy8vIGRlY2F5CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gCisgICAgY2xhc3MgZGVjYXkgCisgICAgeyAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlIF9fcmVtb3ZlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZGVjYXlfc2VsZWN0b3I8X19yZW1vdmVfdHlwZT46Ol9fdHlwZSB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHJlZmVyZW5jZV93cmFwcGVyOworCisgIC8vIEhlbHBlciB3aGljaCBhZGRzIGEgcmVmZXJlbmNlIHRvIGEgdHlwZSB3aGVuIGdpdmVuIGEgcmVmZXJlbmNlX3dyYXBwZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3N0cmlwX3JlZmVyZW5jZV93cmFwcGVyCisgICAgeworICAgICAgdHlwZWRlZiBfVHAgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3N0cmlwX3JlZmVyZW5jZV93cmFwcGVyPHJlZmVyZW5jZV93cmFwcGVyPF9UcD4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwJiBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fc3RyaXBfcmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgcmVmZXJlbmNlX3dyYXBwZXI8X1RwPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfVHAmIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19kZWNheV9hbmRfc3RyaXAKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc3RyaXBfcmVmZXJlbmNlX3dyYXBwZXI8CisJdHlwZW5hbWUgZGVjYXk8X1RwPjo6dHlwZT46Ol9fdHlwZSBfX3R5cGU7CisgICAgfTsKKworCisgIC8vIFByaW1hcnkgdGVtcGxhdGUuCisgIC8vLyBEZWZpbmUgYSBtZW1iZXIgdHlwZWRlZiBAYyB0eXBlIG9ubHkgaWYgYSBib29sZWFuIGNvbnN0YW50IGlzIHRydWUuCisgIHRlbXBsYXRlPGJvb2wsIHR5cGVuYW1lIF9UcCA9IHZvaWQ+CisgICAgc3RydWN0IGVuYWJsZV9pZiAKKyAgICB7IH07CisKKyAgLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgdHJ1ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBlbmFibGVfaWY8dHJ1ZSwgX1RwPgorICAgIHsgdHlwZWRlZiBfVHAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQ29uZD4KKyAgICB1c2luZyBfUmVxdWlyZSA9IHR5cGVuYW1lIGVuYWJsZV9pZjxfX2FuZF88X0NvbmQuLi4+Ojp2YWx1ZT46OnR5cGU7CisKKyAgLy8gUHJpbWFyeSB0ZW1wbGF0ZS4KKyAgLy8vIERlZmluZSBhIG1lbWJlciB0eXBlZGVmIEBjIHR5cGUgdG8gb25lIG9mIHR3byBhcmd1bWVudCB0eXBlcy4KKyAgdGVtcGxhdGU8Ym9vbCBfQ29uZCwgdHlwZW5hbWUgX0lmdHJ1ZSwgdHlwZW5hbWUgX0lmZmFsc2U+CisgICAgc3RydWN0IGNvbmRpdGlvbmFsCisgICAgeyB0eXBlZGVmIF9JZnRydWUgdHlwZTsgfTsKKworICAvLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBmYWxzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lmdHJ1ZSwgdHlwZW5hbWUgX0lmZmFsc2U+CisgICAgc3RydWN0IGNvbmRpdGlvbmFsPGZhbHNlLCBfSWZ0cnVlLCBfSWZmYWxzZT4KKyAgICB7IHR5cGVkZWYgX0lmZmFsc2UgdHlwZTsgfTsKKworICAvLy8gY29tbW9uX3R5cGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RwPgorICAgIHN0cnVjdCBjb21tb25fdHlwZTsKKworICAvLyBTZmluYWUtZnJpZW5kbHkgY29tbW9uX3R5cGUgaW1wbGVtZW50YXRpb246CisKKyAgc3RydWN0IF9fZG9fY29tbW9uX3R5cGVfaW1wbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgICBzdGF0aWMgX19zdWNjZXNzX3R5cGU8dHlwZW5hbWUgZGVjYXk8ZGVjbHR5cGUKKwkJCSAgICAodHJ1ZSA/IHN0ZDo6ZGVjbHZhbDxfVHA+KCkKKwkJCSAgICAgOiBzdGQ6OmRlY2x2YWw8X1VwPigpKT46OnR5cGU+IF9TX3Rlc3QoaW50KTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICAgIHN0YXRpYyBfX2ZhaWx1cmVfdHlwZSBfU190ZXN0KC4uLik7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgc3RydWN0IF9fY29tbW9uX3R5cGVfaW1wbAorICAgIDogcHJpdmF0ZSBfX2RvX2NvbW1vbl90eXBlX2ltcGwKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGRlY2F5PGRlY2x0eXBlKF9TX3Rlc3Q8X1RwLCBfVXA+KDApKT46OnR5cGUgdHlwZTsKKyAgICB9OworCisgIHN0cnVjdCBfX2RvX21lbWJlcl90eXBlX3dyYXBwZXIKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0YXRpYyBfX3N1Y2Nlc3NfdHlwZTx0eXBlbmFtZSBfVHA6OnR5cGU+IF9TX3Rlc3QoaW50KTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgICAgc3RhdGljIF9fZmFpbHVyZV90eXBlIF9TX3Rlc3QoLi4uKTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fbWVtYmVyX3R5cGVfd3JhcHBlcgorICAgIDogcHJpdmF0ZSBfX2RvX21lbWJlcl90eXBlX3dyYXBwZXIKKyAgICB7CisgICAgICB0eXBlZGVmIGRlY2x0eXBlKF9TX3Rlc3Q8X1RwPigwKSkgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX2V4cGFuZGVkX2NvbW1vbl90eXBlX3dyYXBwZXIKKyAgICB7CisgICAgICB0eXBlZGVmIGNvbW1vbl90eXBlPHR5cGVuYW1lIF9DVHA6OnR5cGUsIF9BcmdzLi4uPiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IF9fZXhwYW5kZWRfY29tbW9uX3R5cGVfd3JhcHBlcjxfX2ZhaWx1cmVfdHlwZSwgX0FyZ3MuLi4+CisgICAgeyB0eXBlZGVmIF9fZmFpbHVyZV90eXBlIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBjb21tb25fdHlwZTxfVHA+CisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIGRlY2F5PF9UcD46OnR5cGUgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgY29tbW9uX3R5cGU8X1RwLCBfVXA+CisgICAgOiBwdWJsaWMgX19jb21tb25fdHlwZV9pbXBsPF9UcCwgX1VwPjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUuLi4gX1ZwPgorICAgIHN0cnVjdCBjb21tb25fdHlwZTxfVHAsIF9VcCwgX1ZwLi4uPgorICAgIDogcHVibGljIF9fZXhwYW5kZWRfY29tbW9uX3R5cGVfd3JhcHBlcjx0eXBlbmFtZSBfX21lbWJlcl90eXBlX3dyYXBwZXI8CisgICAgICAgICAgICAgICBjb21tb25fdHlwZTxfVHAsIF9VcD4+Ojp0eXBlLCBfVnAuLi4+Ojp0eXBlCisgICAgeyB9OworCisgIC8vLyBUaGUgdW5kZXJseWluZyB0eXBlIG9mIGFuIGVudW0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgdW5kZXJseWluZ190eXBlCisgICAgeworICAgICAgdHlwZWRlZiBfX3VuZGVybHlpbmdfdHlwZShfVHApIHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fZGVjbHZhbF9wcm90ZWN0b3IKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3N0b3AgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyB0eXBlbmFtZSBhZGRfcnZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlIF9fZGVsZWdhdGUoKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgYWRkX3J2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZQorICAgIGRlY2x2YWwoKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19kZWNsdmFsX3Byb3RlY3RvcjxfVHA+OjpfX3N0b3AsCisJCSAgICAiZGVjbHZhbCgpIG11c3Qgbm90IGJlIHVzZWQhIik7CisgICAgICByZXR1cm4gX19kZWNsdmFsX3Byb3RlY3RvcjxfVHA+OjpfX2RlbGVnYXRlKCk7CisgICAgfQorCisgIC8vLyByZXN1bHRfb2YKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBjbGFzcyByZXN1bHRfb2Y7CisKKyAgLy8gU2ZpbmFlLWZyaWVuZGx5IHJlc3VsdF9vZiBpbXBsZW1lbnRhdGlvbjoKKworICAvLyBbZnVuYy5yZXF1aXJlXSBwYXJhZ3JhcGggMSBidWxsZXQgMToKKyAgc3RydWN0IF9fcmVzdWx0X29mX21lbWZ1bl9yZWZfaW1wbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZwLCB0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHN0YXRpYyBfX3N1Y2Nlc3NfdHlwZTxkZWNsdHlwZSgKKyAgICAgIChzdGQ6OmRlY2x2YWw8X1RwMT4oKS4qc3RkOjpkZWNsdmFsPF9GcD4oKSkoc3RkOjpkZWNsdmFsPF9BcmdzPigpLi4uKQorICAgICAgKT4gX1NfdGVzdChpbnQpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4+CisgICAgICBzdGF0aWMgX19mYWlsdXJlX3R5cGUgX1NfdGVzdCguLi4pOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1QdHIsIHR5cGVuYW1lIF9BcmcsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX3Jlc3VsdF9vZl9tZW1mdW5fcmVmCisgICAgOiBwcml2YXRlIF9fcmVzdWx0X29mX21lbWZ1bl9yZWZfaW1wbAorICAgIHsKKyAgICAgIHR5cGVkZWYgZGVjbHR5cGUoX1NfdGVzdDxfTWVtUHRyLCBfQXJnLCBfQXJncy4uLj4oMCkpIHR5cGU7CisgICAgfTsKKworICAvLyBbZnVuYy5yZXF1aXJlXSBwYXJhZ3JhcGggMSBidWxsZXQgMjoKKyAgc3RydWN0IF9fcmVzdWx0X29mX21lbWZ1bl9kZXJlZl9pbXBsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnAsIHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgc3RhdGljIF9fc3VjY2Vzc190eXBlPGRlY2x0eXBlKAorICAgICAgKCgqc3RkOjpkZWNsdmFsPF9UcDE+KCkpLipzdGQ6OmRlY2x2YWw8X0ZwPigpKShzdGQ6OmRlY2x2YWw8X0FyZ3M+KCkuLi4pCisgICAgICApPiBfU190ZXN0KGludCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4KKyAgICAgIHN0YXRpYyBfX2ZhaWx1cmVfdHlwZSBfU190ZXN0KC4uLik7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01lbVB0ciwgdHlwZW5hbWUgX0FyZywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IF9fcmVzdWx0X29mX21lbWZ1bl9kZXJlZgorICAgIDogcHJpdmF0ZSBfX3Jlc3VsdF9vZl9tZW1mdW5fZGVyZWZfaW1wbAorICAgIHsKKyAgICAgIHR5cGVkZWYgZGVjbHR5cGUoX1NfdGVzdDxfTWVtUHRyLCBfQXJnLCBfQXJncy4uLj4oMCkpIHR5cGU7CisgICAgfTsKKworICAvLyBbZnVuYy5yZXF1aXJlXSBwYXJhZ3JhcGggMSBidWxsZXQgMzoKKyAgc3RydWN0IF9fcmVzdWx0X29mX21lbW9ial9yZWZfaW1wbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZwLCB0eXBlbmFtZSBfVHAxPgorICAgICAgc3RhdGljIF9fc3VjY2Vzc190eXBlPGRlY2x0eXBlKAorICAgICAgc3RkOjpkZWNsdmFsPF9UcDE+KCkuKnN0ZDo6ZGVjbHZhbDxfRnA+KCkKKyAgICAgICk+IF9TX3Rlc3QoaW50KTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICAgIHN0YXRpYyBfX2ZhaWx1cmVfdHlwZSBfU190ZXN0KC4uLik7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01lbVB0ciwgdHlwZW5hbWUgX0FyZz4KKyAgICBzdHJ1Y3QgX19yZXN1bHRfb2ZfbWVtb2JqX3JlZgorICAgIDogcHJpdmF0ZSBfX3Jlc3VsdF9vZl9tZW1vYmpfcmVmX2ltcGwKKyAgICB7CisgICAgICB0eXBlZGVmIGRlY2x0eXBlKF9TX3Rlc3Q8X01lbVB0ciwgX0FyZz4oMCkpIHR5cGU7CisgICAgfTsKKworICAvLyBbZnVuYy5yZXF1aXJlXSBwYXJhZ3JhcGggMSBidWxsZXQgNDoKKyAgc3RydWN0IF9fcmVzdWx0X29mX21lbW9ial9kZXJlZl9pbXBsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnAsIHR5cGVuYW1lIF9UcDE+CisgICAgICBzdGF0aWMgX19zdWNjZXNzX3R5cGU8ZGVjbHR5cGUoCisgICAgICAoKnN0ZDo6ZGVjbHZhbDxfVHAxPigpKS4qc3RkOjpkZWNsdmFsPF9GcD4oKQorICAgICAgKT4gX1NfdGVzdChpbnQpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgICAgc3RhdGljIF9fZmFpbHVyZV90eXBlIF9TX3Rlc3QoLi4uKTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtUHRyLCB0eXBlbmFtZSBfQXJnPgorICAgIHN0cnVjdCBfX3Jlc3VsdF9vZl9tZW1vYmpfZGVyZWYKKyAgICA6IHByaXZhdGUgX19yZXN1bHRfb2ZfbWVtb2JqX2RlcmVmX2ltcGwKKyAgICB7CisgICAgICB0eXBlZGVmIGRlY2x0eXBlKF9TX3Rlc3Q8X01lbVB0ciwgX0FyZz4oMCkpIHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtUHRyLCB0eXBlbmFtZSBfQXJnPgorICAgIHN0cnVjdCBfX3Jlc3VsdF9vZl9tZW1vYmo7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZSBfQXJnPgorICAgIHN0cnVjdCBfX3Jlc3VsdF9vZl9tZW1vYmo8X1JlcyBfQ2xhc3M6OiosIF9Bcmc+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY3Y8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTwKKyAgICAgICAgX0FyZz46OnR5cGU+Ojp0eXBlIF9Bcmd2YWw7CisgICAgICB0eXBlZGVmIF9SZXMgX0NsYXNzOjoqIF9NZW1QdHI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPF9fb3JfPGlzX3NhbWU8X0FyZ3ZhbCwgX0NsYXNzPiwKKyAgICAgICAgaXNfYmFzZV9vZjxfQ2xhc3MsIF9Bcmd2YWw+Pjo6dmFsdWUsCisgICAgICAgIF9fcmVzdWx0X29mX21lbW9ial9yZWY8X01lbVB0ciwgX0FyZz4sCisgICAgICAgIF9fcmVzdWx0X29mX21lbW9ial9kZXJlZjxfTWVtUHRyLCBfQXJnPgorICAgICAgPjo6dHlwZTo6dHlwZSB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01lbVB0ciwgdHlwZW5hbWUgX0FyZywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IF9fcmVzdWx0X29mX21lbWZ1bjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lIF9BcmcsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX3Jlc3VsdF9vZl9tZW1mdW48X1JlcyBfQ2xhc3M6OiosIF9BcmcsIF9BcmdzLi4uPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2N2PHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8CisgICAgICAgIF9Bcmc+Ojp0eXBlPjo6dHlwZSBfQXJndmFsOworICAgICAgdHlwZWRlZiBfUmVzIF9DbGFzczo6KiBfTWVtUHRyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxfX29yXzxpc19zYW1lPF9Bcmd2YWwsIF9DbGFzcz4sCisgICAgICAgIGlzX2Jhc2Vfb2Y8X0NsYXNzLCBfQXJndmFsPj46OnZhbHVlLAorICAgICAgICBfX3Jlc3VsdF9vZl9tZW1mdW5fcmVmPF9NZW1QdHIsIF9BcmcsIF9BcmdzLi4uPiwKKyAgICAgICAgX19yZXN1bHRfb2ZfbWVtZnVuX2RlcmVmPF9NZW1QdHIsIF9BcmcsIF9BcmdzLi4uPgorICAgICAgPjo6dHlwZTo6dHlwZSB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8Ym9vbCwgYm9vbCwgdHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX19yZXN1bHRfb2ZfaW1wbAorICAgIHsKKyAgICAgIHR5cGVkZWYgX19mYWlsdXJlX3R5cGUgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1QdHIsIHR5cGVuYW1lIF9Bcmc+CisgICAgc3RydWN0IF9fcmVzdWx0X29mX2ltcGw8dHJ1ZSwgZmFsc2UsIF9NZW1QdHIsIF9Bcmc+CisgICAgOiBwdWJsaWMgX19yZXN1bHRfb2ZfbWVtb2JqPHR5cGVuYW1lIGRlY2F5PF9NZW1QdHI+Ojp0eXBlLCBfQXJnPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtUHRyLCB0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19yZXN1bHRfb2ZfaW1wbDxmYWxzZSwgdHJ1ZSwgX01lbVB0ciwgX0FyZywgX0FyZ3MuLi4+CisgICAgOiBwdWJsaWMgX19yZXN1bHRfb2ZfbWVtZnVuPHR5cGVuYW1lIGRlY2F5PF9NZW1QdHI+Ojp0eXBlLCBfQXJnLCBfQXJncy4uLj4KKyAgICB7IH07CisKKyAgLy8gW2Z1bmMucmVxdWlyZV0gcGFyYWdyYXBoIDEgYnVsbGV0IDU6CisgIHN0cnVjdCBfX3Jlc3VsdF9vZl9vdGhlcl9pbXBsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm4sIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgc3RhdGljIF9fc3VjY2Vzc190eXBlPGRlY2x0eXBlKAorICAgICAgc3RkOjpkZWNsdmFsPF9Gbj4oKShzdGQ6OmRlY2x2YWw8X0FyZ3M+KCkuLi4pCisgICAgICApPiBfU190ZXN0KGludCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4KKyAgICAgIHN0YXRpYyBfX2ZhaWx1cmVfdHlwZSBfU190ZXN0KC4uLik7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX19yZXN1bHRfb2ZfaW1wbDxmYWxzZSwgZmFsc2UsIF9GdW5jdG9yLCBfQXJnVHlwZXMuLi4+CisgICAgOiBwcml2YXRlIF9fcmVzdWx0X29mX290aGVyX2ltcGwKKyAgICB7CisgICAgICB0eXBlZGVmIGRlY2x0eXBlKF9TX3Rlc3Q8X0Z1bmN0b3IsIF9BcmdUeXBlcy4uLj4oMCkpIHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCByZXN1bHRfb2Y8X0Z1bmN0b3IoX0FyZ1R5cGVzLi4uKT4KKyAgICA6IHB1YmxpYyBfX3Jlc3VsdF9vZl9pbXBsPAorICAgICAgICBpc19tZW1iZXJfb2JqZWN0X3BvaW50ZXI8CisgICAgICAgICAgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRnVuY3Rvcj46OnR5cGUKKyAgICAgICAgPjo6dmFsdWUsCisgICAgICAgIGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyPAorICAgICAgICAgIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0Z1bmN0b3I+Ojp0eXBlCisgICAgICAgID46OnZhbHVlLAorCSAgICBfRnVuY3RvciwgX0FyZ1R5cGVzLi4uCisgICAgICA+Ojp0eXBlCisgICAgeyB9OworCisgIC8vLyBAfSBncm91cCBtZXRhcHJvZ3JhbW1pbmcKKwkKKyAgLyoqCisgICAqICBVc2UgU0ZJTkFFIHRvIGRldGVybWluZSBpZiB0aGUgdHlwZSBfVHAgaGFzIGEgcHVibGljbHktYWNjZXNzaWJsZQorICAgKiAgbWVtYmVyIHR5cGUgX05UWVBFLgorICAgKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFKF9OVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhc3MgX19oYXNfIyNfTlRZUEUjI19oZWxwZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6IF9fc2ZpbmFlX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RydWN0IF9XcmFwX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyBfX29uZSBfX3Rlc3QoX1dyYXBfdHlwZTx0eXBlbmFtZSBfVXA6Ol9OVFlQRT4qKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSBzaXplb2YoX190ZXN0PF9UcD4oMCkpID09IDE7IFwKKyAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJ1Y3QgX19oYXNfIyNfTlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19oYXNfIyNfTlRZUEUjI19oZWxwZXIgICAgICAgICAgICBcCisJCQk8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZT4gIFwKKyAgICB7IH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAgLy8gQysrMTEKKworI2VuZGlmICAvLyBfR0xJQkNYWF9UWVBFX1RSQUlUUwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90eXBlaW5kZXggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3R5cGVpbmRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTZkYjMwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90eXBlaW5kZXgKQEAgLTAsMCArMSwxMTIgQEAKKy8vIEMrKzExIDx0eXBlaW5kZXg+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3R5cGVpbmRleAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UWVBFSU5ERVgKKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUlOREVYIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPHR5cGVpbmZvPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBicmllZiBDbGFzcyB0eXBlX2luZGV4CisgICAqIEBpbmdyb3VwIHV0aWxpdGllcworICAgKgorICAgKiAgVGhlIGNsYXNzIHR5cGVfaW5kZXggcHJvdmlkZXMgYSBzaW1wbGUgd3JhcHBlciBmb3IgdHlwZV9pbmZvCisgICAqICB3aGljaCBjYW4gYmUgdXNlZCBhcyBhbiBpbmRleCB0eXBlIGluIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMKKyAgICogICgyMy42KSBhbmQgaW4gdW5vcmRlcmVkIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMgKDIzLjcpLgorICAgKi8KKyAgc3RydWN0IHR5cGVfaW5kZXgKKyAgeworICAgIHR5cGVfaW5kZXgoY29uc3QgdHlwZV9pbmZvJiBfX3Jocykgbm9leGNlcHQKKyAgICA6IF9NX3RhcmdldCgmX19yaHMpIHsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdHlwZV9pbmRleCYgX19yaHMpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gKl9NX3RhcmdldCA9PSAqX19yaHMuX01fdGFyZ2V0OyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB0eXBlX2luZGV4JiBfX3JocykgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiAqX01fdGFyZ2V0ICE9ICpfX3Jocy5fTV90YXJnZXQ7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgdHlwZV9pbmRleCYgX19yaHMpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fdGFyZ2V0LT5iZWZvcmUoKl9fcmhzLl9NX3RhcmdldCk7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHR5cGVfaW5kZXgmIF9fcmhzKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuICFfX3Jocy5fTV90YXJnZXQtPmJlZm9yZSgqX01fdGFyZ2V0KTsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCB0eXBlX2luZGV4JiBfX3JocykgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX3Jocy5fTV90YXJnZXQtPmJlZm9yZSgqX01fdGFyZ2V0KTsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgdHlwZV9pbmRleCYgX19yaHMpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gIV9NX3RhcmdldC0+YmVmb3JlKCpfX3Jocy5fTV90YXJnZXQpOyB9CisKKyAgICBzaXplX3QKKyAgICBoYXNoX2NvZGUoKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX3RhcmdldC0+aGFzaF9jb2RlKCk7IH0KKworICAgIGNvbnN0IGNoYXIqCisgICAgbmFtZSgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fdGFyZ2V0LT5uYW1lKCk7IH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IHR5cGVfaW5mbyogX01fdGFyZ2V0OworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gc3RydWN0IGhhc2g7CisKKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgdHlwZV9pbmRleC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHR5cGVfaW5kZXg+CisgICAgeworICAgICAgdHlwZWRlZiBzaXplX3QgICAgICAgIHJlc3VsdF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlX2luZGV4ICBhcmd1bWVudF90eXBlOworCisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdHlwZV9pbmRleCYgX190aSkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fdGkuaGFzaF9jb2RlKCk7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgIC8vIEMrKzExCisKKyNlbmRpZiAgLy8gX0dMSUJDWFhfVFlQRUlOREVYCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3R5cGVpbmZvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90eXBlaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTNkMGVmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90eXBlaW5mbwpAQCAtMCwwICsxLDIyMiBAQAorLy8gUlRUSSBzdXBwb3J0IGZvciAtKi0gQysrIC0qLQorLy8gQ29weXJpZ2h0IChDKSAxOTk0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorLy8KKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisvLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHlwZWluZm8KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX1RZUEVJTkZPCisjZGVmaW5lIF9UWVBFSU5GTworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxleGNlcHRpb24+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGJpdHMvaGFzaF9ieXRlcy5oPgorI2VuZGlmCisKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcHVzaChkZWZhdWx0KQorCitleHRlcm4gIkMrKyIgeworCituYW1lc3BhY2UgX19jeHhhYml2MQoreworICBjbGFzcyBfX2NsYXNzX3R5cGVfaW5mbzsKK30gLy8gbmFtZXNwYWNlIF9fY3h4YWJpdjEKKworLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdHlwZWluZm8gbmFtZXMgZm9yIHRoZSBzYW1lIHR5cGUgYXJlIG1lcmdlZCAoaW4gd2hpY2gKKy8vIGNhc2UgY29tcGFyaXNvbiBjYW4ganVzdCBjb21wYXJlIHBvaW50ZXJzKSBvciBub3QgKGluIHdoaWNoIGNhc2Ugc3RyaW5ncworLy8gbXVzdCBiZSBjb21wYXJlZCksIGFuZCB3aGV0aGVyIGNvbXBhcmlzb24gaXMgdG8gYmUgaW1wbGVtZW50ZWQgaW5saW5lIG9yCisvLyBub3QuICBXZSB1c2VkIHRvIGRvIGlubGluZSBwb2ludGVyIGNvbXBhcmlzb24gYnkgZGVmYXVsdCBpZiB3ZWFrIHN5bWJvbHMKKy8vIGFyZSBhdmFpbGFibGUsIGJ1dCBldmVuIHdpdGggd2VhayBzeW1ib2xzIHNvbWV0aW1lcyBuYW1lcyBhcmUgbm90IG1lcmdlZAorLy8gd2hlbiBvYmplY3RzIGFyZSBsb2FkZWQgd2l0aCBSVExEX0xPQ0FMLCBzbyBub3cgd2UgYWx3YXlzIHVzZSBzdHJjbXAgYnkKKy8vIGRlZmF1bHQuICBGb3IgQUJJIGNvbXBhdGliaWxpdHksIHdlIGRvIHRoZSBzdHJjbXAgaW5saW5lIGlmIHdlYWsgc3ltYm9scworLy8gYXJlIGF2YWlsYWJsZSwgYW5kIG91dC1vZi1saW5lIGlmIG5vdC4gIE91dC1vZi1saW5lIHBvaW50ZXIgY29tcGFyaXNvbgorLy8gaXMgdXNlZCB3aGVyZSB0aGUgb2JqZWN0IGZpbGVzIGFyZSB0byBiZSBwb3J0YWJsZSB0byBtdWx0aXBsZSBzeXN0ZW1zLAorLy8gc29tZSBvZiB3aGljaCBtYXkgbm90IGJlIGFibGUgdG8gdXNlIHBvaW50ZXIgY29tcGFyaXNvbiwgYnV0IHRoZQorLy8gcGFydGljdWxhciBzeXN0ZW0gZm9yIHdoaWNoIGxpYnN0ZGMrKyBpcyBiZWluZyBidWlsdCBjYW4gdXNlIHBvaW50ZXIKKy8vIGNvbXBhcmlzb247IGluIHBhcnRpY3VsYXIgZm9yIG1vc3QgQVJNIEVBQkkgc3lzdGVtcywgd2hlcmUgdGhlIEFCSQorLy8gc3BlY2lmaWVzIG91dC1vZi1saW5lIGNvbXBhcmlzb24uICBUaGUgY29tcGlsZXIncyB0YXJnZXQgY29uZmlndXJhdGlvbgorLy8gY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyBieSBkZWZpbmluZyBfX0dYWF9UWVBFSU5GT19FUVVBTElUWV9JTkxJTkUgdG8KKy8vIDEgb3IgMCB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCBjb21wYXJpc29uIGlzIGlubGluZSwgYW5kCisvLyBfX0dYWF9NRVJHRURfVFlQRUlORk9fTkFNRVMgdG8gMSBvciAwIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHBvaW50ZXIKKy8vIGNvbXBhcmlzb24gY2FuIGJlIHVzZWQuCisKKyNpZm5kZWYgX19HWFhfTUVSR0VEX1RZUEVJTkZPX05BTUVTCisvLyBCeSBkZWZhdWx0LCB0eXBlaW5mbyBuYW1lcyBhcmUgbm90IG1lcmdlZC4KKyNkZWZpbmUgX19HWFhfTUVSR0VEX1RZUEVJTkZPX05BTUVTIDAKKyNlbmRpZgorCisvLyBCeSBkZWZhdWx0IGZvbGxvdyB0aGUgb2xkIGlubGluZSBydWxlcyB0byBhdm9pZCBBQkkgY2hhbmdlcy4KKyNpZm5kZWYgX19HWFhfVFlQRUlORk9fRVFVQUxJVFlfSU5MSU5FCisgICNpZiAhX19HWFhfV0VBS19fCisgICAgI2RlZmluZSBfX0dYWF9UWVBFSU5GT19FUVVBTElUWV9JTkxJTkUgMAorICAjZWxzZQorICAgICNkZWZpbmUgX19HWFhfVFlQRUlORk9fRVFVQUxJVFlfSU5MSU5FIDEKKyAgI2VuZGlmCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZAoreworICAvKioKKyAgICogIEBicmllZiAgUGFydCBvZiBSVFRJLgorICAgKgorICAgKiAgVGhlIEBjIHR5cGVfaW5mbyBjbGFzcyBkZXNjcmliZXMgdHlwZSBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgYnkKKyAgICogIGFuIGltcGxlbWVudGF0aW9uLgorICAqLworICBjbGFzcyB0eXBlX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgLyoqIERlc3RydWN0b3IgZmlyc3QuIEJlaW5nIHRoZSBmaXJzdCBub24taW5saW5lIHZpcnR1YWwgZnVuY3Rpb24sIHRoaXMKKyAgICAgKiAgY29udHJvbHMgaW4gd2hpY2ggdHJhbnNsYXRpb24gdW5pdCB0aGUgdnRhYmxlIGlzIGVtaXR0ZWQuIFRoZQorICAgICAqICBjb21waWxlciBtYWtlcyB1c2Ugb2YgdGhhdCBpbmZvcm1hdGlvbiB0byBrbm93IHdoZXJlIHRvIGVtaXQKKyAgICAgKiAgdGhlIHJ1bnRpbWUtbWFuZGF0ZWQgdHlwZV9pbmZvIHN0cnVjdHVyZXMgaW4gdGhlIG5ldy1hYmkuICAqLworICAgIHZpcnR1YWwgfnR5cGVfaW5mbygpOworCisgICAgLyoqIFJldHVybnMgYW4gQGUgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBieXRlIHN0cmluZzsgdGhpcyBpcyBub3QKKyAgICAgKiAgcG9ydGFibGUgYmV0d2VlbiBjb21waWxlcnMhICAqLworICAgIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIF9fbmFtZVswXSA9PSAnKicgPyBfX25hbWUgKyAxIDogX19uYW1lOyB9CisKKyNpZiAhX19HWFhfVFlQRUlORk9fRVFVQUxJVFlfSU5MSU5FCisgICAgLy8gSW4gb2xkIGFiaSwgb3Igd2hlbiB3ZWFrIHN5bWJvbHMgYXJlIG5vdCBzdXBwb3J0ZWQsIHRoZXJlIGNhbgorICAgIC8vIGJlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBhIHR5cGVfaW5mbyBvYmplY3QgZm9yIG9uZQorICAgIC8vIHR5cGUuIFVuaXF1ZW5lc3MgbXVzdCB1c2UgdGhlIF9uYW1lIHZhbHVlLCBub3Qgb2JqZWN0IGFkZHJlc3MuCisgICAgYm9vbCBiZWZvcmUoY29uc3QgdHlwZV9pbmZvJiBfX2FyZykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQ7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHR5cGVfaW5mbyYgX19hcmcpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUOworI2Vsc2UKKyAgI2lmICFfX0dYWF9NRVJHRURfVFlQRUlORk9fTkFNRVMKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIEBjICp0aGlzIHByZWNlZGVzIEBjIF9fYXJnIGluIHRoZSBpbXBsZW1lbnRhdGlvbidzCisgICAgICogIGNvbGxhdGlvbiBvcmRlci4gICovCisgICAgLy8gRXZlbiB3aXRoIHRoZSBuZXcgYWJpLCBvbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBkbG9wZW4KKyAgICAvLyB3ZSBjYW4gcnVuIGludG8gY2FzZXMgd2hlcmUgdHlwZV9pbmZvIG5hbWVzIGFyZW4ndCBtZXJnZWQsCisgICAgLy8gc28gd2Ugc3RpbGwgbmVlZCB0byBkbyBzdHJpbmcgY29tcGFyaXNvbi4KKyAgICBib29sIGJlZm9yZShjb25zdCB0eXBlX2luZm8mIF9fYXJnKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIChfX25hbWVbMF0gPT0gJyonICYmIF9fYXJnLl9fbmFtZVswXSA9PSAnKicpCisJPyBfX25hbWUgPCBfX2FyZy5fX25hbWUKKwk6IF9fYnVpbHRpbl9zdHJjbXAgKF9fbmFtZSwgX19hcmcuX19uYW1lKSA8IDA7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCB0eXBlX2luZm8mIF9fYXJnKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHJldHVybiAoKF9fbmFtZSA9PSBfX2FyZy5fX25hbWUpCisJICAgICAgfHwgKF9fbmFtZVswXSAhPSAnKicgJiYKKwkJICBfX2J1aWx0aW5fc3RyY21wIChfX25hbWUsIF9fYXJnLl9fbmFtZSkgPT0gMCkpOworICAgIH0KKyAgI2Vsc2UKKyAgICAvLyBPbiBzb21lIHRhcmdldHMgd2UgY2FuIHJlbHkgb24gdHlwZV9pbmZvJ3MgTlRCUyBiZWluZyB1bmlxdWUsCisgICAgLy8gYW5kIHRoZXJlZm9yZSBhZGRyZXNzIGNvbXBhcmlzb25zIGFyZSBzdWZmaWNpZW50LgorICAgIGJvb2wgYmVmb3JlKGNvbnN0IHR5cGVfaW5mbyYgX19hcmcpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gX19uYW1lIDwgX19hcmcuX19uYW1lOyB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgdHlwZV9pbmZvJiBfX2FyZykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBfX25hbWUgPT0gX19hcmcuX19uYW1lOyB9CisgICNlbmRpZgorI2VuZGlmCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHR5cGVfaW5mbyYgX19hcmcpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gIW9wZXJhdG9yPT0oX19hcmcpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgc2l6ZV90IGhhc2hfY29kZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworIyAgaWYgIV9fR1hYX01FUkdFRF9UWVBFSU5GT19OQU1FUworICAgICAgcmV0dXJuIF9IYXNoX2J5dGVzKG5hbWUoKSwgX19idWlsdGluX3N0cmxlbihuYW1lKCkpLAorCQkJIHN0YXRpY19jYXN0PHNpemVfdD4oMHhjNzBmNjkwN1VMKSk7CisjICBlbHNlCisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KF9fbmFtZSk7CisjICBlbmRpZgorICAgIH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHBvaW50ZXIgdHlwZSBvZiBzb21lIGtpbmQKKyAgICB2aXJ0dWFsIGJvb2wgX19pc19wb2ludGVyX3AoKSBjb25zdDsKKworICAgIC8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBmdW5jdGlvbiB0eXBlCisgICAgdmlydHVhbCBib29sIF9faXNfZnVuY3Rpb25fcCgpIGNvbnN0OworCisgICAgLy8gVHJ5IGFuZCBjYXRjaCBhIHRocm93biB0eXBlLiBTdG9yZSBhbiBhZGp1c3RlZCBwb2ludGVyIHRvIHRoZQorICAgIC8vIGNhdWdodCB0eXBlIGluIFRIUl9PQkouIElmIFRIUl9UWVBFIGlzIG5vdCBhIHBvaW50ZXIgdHlwZSwgdGhlbgorICAgIC8vIFRIUl9PQkogcG9pbnRzIHRvIHRoZSB0aHJvd24gb2JqZWN0LiBJZiBUSFJfVFlQRSBpcyBhIHBvaW50ZXIKKyAgICAvLyB0eXBlLCB0aGVuIFRIUl9PQkogaXMgdGhlIHBvaW50ZXIgaXRzZWxmLiBPVVRFUiBpbmRpY2F0ZXMgdGhlCisgICAgLy8gbnVtYmVyIG9mIG91dGVyIHBvaW50ZXJzLCBhbmQgd2hldGhlciB0aGV5IHdlcmUgY29uc3QKKyAgICAvLyBxdWFsaWZpZWQuCisgICAgdmlydHVhbCBib29sIF9fZG9fY2F0Y2goY29uc3QgdHlwZV9pbmZvICpfX3Rocl90eXBlLCB2b2lkICoqX190aHJfb2JqLAorCQkJICAgIHVuc2lnbmVkIF9fb3V0ZXIpIGNvbnN0OworCisgICAgLy8gSW50ZXJuYWxseSB1c2VkIGR1cmluZyBjYXRjaCBtYXRjaGluZworICAgIHZpcnR1YWwgYm9vbCBfX2RvX3VwY2FzdChjb25zdCBfX2N4eGFiaXYxOjpfX2NsYXNzX3R5cGVfaW5mbyAqX190YXJnZXQsCisJCQkgICAgIHZvaWQgKipfX29ial9wdHIpIGNvbnN0OworCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBjaGFyICpfX25hbWU7CisKKyAgICBleHBsaWNpdCB0eXBlX2luZm8oY29uc3QgY2hhciAqX19uKTogX19uYW1lKF9fbikgeyB9CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gQXNzaWduaW5nIHR5cGVfaW5mbyBpcyBub3Qgc3VwcG9ydGVkLgorICAgIHR5cGVfaW5mbyYgb3BlcmF0b3I9KGNvbnN0IHR5cGVfaW5mbyYpOworICAgIHR5cGVfaW5mbyhjb25zdCB0eXBlX2luZm8mKTsKKyAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgVGhyb3duIGR1cmluZyBpbmNvcnJlY3QgdHlwZWNhc3RpbmcuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqCisgICAqICBJZiB5b3UgYXR0ZW1wdCBhbiBpbnZhbGlkIEBjIGR5bmFtaWNfY2FzdCBleHByZXNzaW9uLCBhbiBpbnN0YW5jZSBvZgorICAgKiAgdGhpcyBjbGFzcyAob3Igc29tZXRoaW5nIGRlcml2ZWQgZnJvbSB0aGlzIGNsYXNzKSBpcyB0aHJvd24uICAqLworICBjbGFzcyBiYWRfY2FzdCA6IHB1YmxpYyBleGNlcHRpb24KKyAgeworICBwdWJsaWM6CisgICAgYmFkX2Nhc3QoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAvLyBUaGlzIGRlY2xhcmF0aW9uIGlzIG5vdCB1c2VsZXNzOgorICAgIC8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy0zLjAuMi9nY2NfNi5odG1sI1NFQzExOAorICAgIHZpcnR1YWwgfmJhZF9jYXN0KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisgICAgLy8gU2VlIGNvbW1lbnQgaW4gZWhfZXhjZXB0aW9uLmNjLgorICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyAgfTsKKworICAvKioKKyAgICogIEBicmllZiBUaHJvd24gd2hlbiBhIE5VTEwgcG9pbnRlciBpbiBhIEBjIHR5cGVpZCBleHByZXNzaW9uIGlzIHVzZWQuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqLworICBjbGFzcyBiYWRfdHlwZWlkIDogcHVibGljIGV4Y2VwdGlvbgorICB7CisgIHB1YmxpYzoKKyAgICBiYWRfdHlwZWlkICgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgIC8vIFRoaXMgZGVjbGFyYXRpb24gaXMgbm90IHVzZWxlc3M6CisgICAgLy8gaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjLTMuMC4yL2djY182Lmh0bWwjU0VDMTE4CisgICAgdmlydHVhbCB+YmFkX3R5cGVpZCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKworICAgIC8vIFNlZSBjb21tZW50IGluIGVoX2V4Y2VwdGlvbi5jYy4KKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisgIH07Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworfSAvLyBleHRlcm4gIkMrKyIKKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwb3AKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Vub3JkZXJlZF9tYXAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Vub3JkZXJlZF9tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxMDE3MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdW5vcmRlcmVkX21hcApAQCAtMCwwICsxLDYxIEBACisvLyA8dW5vcmRlcmVkX21hcD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvdW5vcmRlcmVkX21hcAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9VTk9SREVSRURfTUFQCisjZGVmaW5lIF9HTElCQ1hYX1VOT1JERVJFRF9NQVAgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL2FsbG9jX3RyYWl0cy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+IC8vIGVxdWFsX3RvLCBfSWRlbnRpdHksIF9TZWxlY3Qxc3QKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0aW9uYWxfaGFzaC5oPgorI2luY2x1ZGUgPGJpdHMvaGFzaHRhYmxlLmg+CisjaW5jbHVkZSA8Yml0cy91bm9yZGVyZWRfbWFwLmg+CisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGluY2x1ZGUgPGRlYnVnL3Vub3JkZXJlZF9tYXA+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyMgaW5jbHVkZSA8cHJvZmlsZS91bm9yZGVyZWRfbWFwPgorI2VuZGlmCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVU5PUkRFUkVEX01BUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC91bm9yZGVyZWRfc2V0IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC91bm9yZGVyZWRfc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZTkxYWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Vub3JkZXJlZF9zZXQKQEAgLTAsMCArMSw2MCBAQAorLy8gPHVub3JkZXJlZF9zZXQ+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3Vub3JkZXJlZF9zZXQKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVU5PUkRFUkVEX1NFVAorI2RlZmluZSBfR0xJQkNYWF9VTk9SREVSRURfU0VUIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9hbGxvY190cmFpdHMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPiAvLyBlcXVhbF90bywgX0lkZW50aXR5LCBfU2VsZWN0MXN0CisjaW5jbHVkZSA8Yml0cy9mdW5jdGlvbmFsX2hhc2guaD4KKyNpbmNsdWRlIDxiaXRzL2hhc2h0YWJsZS5oPgorI2luY2x1ZGUgPGJpdHMvdW5vcmRlcmVkX3NldC5oPgorI2luY2x1ZGUgPGJpdHMvcmFuZ2VfYWNjZXNzLmg+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworIyBpbmNsdWRlIDxkZWJ1Zy91bm9yZGVyZWRfc2V0PgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9QUk9GSUxFCisjIGluY2x1ZGUgPHByb2ZpbGUvdW5vcmRlcmVkX3NldD4KKyNlbmRpZgorI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VTk9SREVSRURfU0VUCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3V0aWxpdHkgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3V0aWxpdHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE0MmVhNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdXRpbGl0eQpAQCAtMCwwICsxLDE2MCBAQAorLy8gPHV0aWxpdHk+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL3V0aWxpdHkKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1VUSUxJVFkKKyNkZWZpbmUgX0dMSUJDWFhfVVRJTElUWSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworLyoqCisgKiBAZGVmZ3JvdXAgdXRpbGl0aWVzIFV0aWxpdGllcworICoKKyAqIENvbXBvbmVudHMgZGVlbWVkIGdlbmVyYWxseSB1c2VmdWwuIEluY2x1ZGVzIHBhaXIsIHR1cGxlLAorICogZm9yd2FyZC9tb3ZlIGhlbHBlcnMsIHJhdGlvLCBmdW5jdGlvbiBvYmplY3QsIG1ldGFwcm9ncmFtbWluZyBhbmQKKyAqIHR5cGUgdHJhaXRzLCB0aW1lLCBkYXRlLCBhbmQgbWVtb3J5IGZ1bmN0aW9ucy4KKyAqLworCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9yZWxvcHMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9wYWlyLmg+CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICBjbGFzcyB0dXBsZV9zaXplOworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIGNsYXNzIF9UcD4KKyAgICBjbGFzcyB0dXBsZV9lbGVtZW50OworCisgICAvLyBWYXJpb3VzIGZ1bmN0aW9ucyB3aGljaCBnaXZlIHN0ZDo6cGFpciBhIHR1cGxlLWxpa2UgaW50ZXJmYWNlLgorICB0ZW1wbGF0ZTxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICAgIHN0cnVjdCB0dXBsZV9zaXplPHN0ZDo6cGFpcjxfVHAxLCBfVHAyPj4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgMj4geyB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8MCwgc3RkOjpwYWlyPF9UcDEsIF9UcDI+PgorICAgIHsgdHlwZWRlZiBfVHAxIHR5cGU7IH07CisgCisgIHRlbXBsYXRlPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8MSwgc3RkOjpwYWlyPF9UcDEsIF9UcDI+PgorICAgIHsgdHlwZWRlZiBfVHAyIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludD4KKyAgICBzdHJ1Y3QgX19wYWlyX2dldDsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fcGFpcl9nZXQ8MD4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgICAgICBzdGF0aWMgY29uc3RleHByIF9UcDEmCisgICAgICAgIF9fZ2V0KHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgX19wYWlyKSBub2V4Y2VwdAorICAgICAgICB7IHJldHVybiBfX3BhaXIuZmlyc3Q7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBfVHAxJiYKKyAgICAgICAgX19tb3ZlX2dldChzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mJiBfX3BhaXIpIG5vZXhjZXB0CisgICAgICAgIHsgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxfVHAxPihfX3BhaXIuZmlyc3QpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgX1RwMSYKKyAgICAgICAgX19jb25zdF9nZXQoY29uc3Qgc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiBfX3BhaXIpIG5vZXhjZXB0CisgICAgICAgIHsgcmV0dXJuIF9fcGFpci5maXJzdDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3BhaXJfZ2V0PDE+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBfVHAyJgorICAgICAgICBfX2dldChzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mIF9fcGFpcikgbm9leGNlcHQKKyAgICAgICAgeyByZXR1cm4gX19wYWlyLnNlY29uZDsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgICAgICBzdGF0aWMgY29uc3RleHByIF9UcDImJgorICAgICAgICBfX21vdmVfZ2V0KHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYmIF9fcGFpcikgbm9leGNlcHQKKyAgICAgICAgeyByZXR1cm4gc3RkOjpmb3J3YXJkPF9UcDI+KF9fcGFpci5zZWNvbmQpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgX1RwMiYKKyAgICAgICAgX19jb25zdF9nZXQoY29uc3Qgc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiBfX3BhaXIpIG5vZXhjZXB0CisgICAgICAgIHsgcmV0dXJuIF9fcGFpci5zZWNvbmQ7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgY29uc3RleHByIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0ludCwgc3RkOjpwYWlyPF9UcDEsIF9UcDI+Pjo6dHlwZSYKKyAgICBnZXQoc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiBfX2luKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fcGFpcl9nZXQ8X0ludD46Ol9fZ2V0KF9faW4pOyB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgY2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSW50LCBzdGQ6OnBhaXI8X1RwMSwgX1RwMj4+Ojp0eXBlJiYKKyAgICBnZXQoc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiYgX19pbikgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX3BhaXJfZ2V0PF9JbnQ+OjpfX21vdmVfZ2V0KHN0ZDo6bW92ZShfX2luKSk7IH0KKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW50LCBjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICAgIGNvbnN0ZXhwciBjb25zdCB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JbnQsIHN0ZDo6cGFpcjxfVHAxLCBfVHAyPj46OnR5cGUmCisgICAgZ2V0KGNvbnN0IHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgX19pbikgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX3BhaXJfZ2V0PF9JbnQ+OjpfX2NvbnN0X2dldChfX2luKTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgorCisjZW5kaWYgLyogX0dMSUJDWFhfVVRJTElUWSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC92YWxhcnJheSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdmFsYXJyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5NmFmNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdmFsYXJyYXkKQEAgLTAsMCArMSwxMjM1IEBACisvLyBUaGUgdGVtcGxhdGUgYW5kIGlubGluZXMgZm9yIHRoZSAtKi0gQysrIC0qLSB2YWxhcnJheSBjbGFzcy4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvdmFsYXJyYXkKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisvLyBXcml0dGVuIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPEdhYnJpZWwuRG9zLVJlaXNARFBUTWF0aHMuRU5TLUNhY2hhbi5Gcj4KKworI2lmbmRlZiBfR0xJQkNYWF9WQUxBUlJBWQorI2RlZmluZSBfR0xJQkNYWF9WQUxBUlJBWSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+IAorICAgIGNsYXNzIF9FeHByOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+IAorICAgIGNsYXNzIF9WYWxBcnJheTsgICAgCisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsIHRlbXBsYXRlPGNsYXNzLCBjbGFzcz4gY2xhc3MgX01ldGEsIGNsYXNzIF9Eb20+CisgICAgc3RydWN0IF9VbkNsb3M7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsCisgICAgICAgIHRlbXBsYXRlPGNsYXNzLCBjbGFzcz4gY2xhc3MgX01ldGExLAorICAgICAgICB0ZW1wbGF0ZTxjbGFzcywgY2xhc3M+IGNsYXNzIF9NZXRhMiwKKyAgICAgICAgY2xhc3MgX0RvbTEsIGNsYXNzIF9Eb20yPiAKKyAgICBjbGFzcyBfQmluQ2xvczsKKworICB0ZW1wbGF0ZTx0ZW1wbGF0ZTxjbGFzcywgY2xhc3M+IGNsYXNzIF9NZXRhLCBjbGFzcyBfRG9tPiAKKyAgICBjbGFzcyBfU0Nsb3M7CisKKyAgdGVtcGxhdGU8dGVtcGxhdGU8Y2xhc3MsIGNsYXNzPiBjbGFzcyBfTWV0YSwgY2xhc3MgX0RvbT4gCisgICAgY2xhc3MgX0dDbG9zOworICAgIAorICB0ZW1wbGF0ZTx0ZW1wbGF0ZTxjbGFzcywgY2xhc3M+IGNsYXNzIF9NZXRhLCBjbGFzcyBfRG9tPiAKKyAgICBjbGFzcyBfSUNsb3M7CisgICAgCisgIHRlbXBsYXRlPHRlbXBsYXRlPGNsYXNzLCBjbGFzcz4gY2xhc3MgX01ldGEsIGNsYXNzIF9Eb20+IAorICAgIGNsYXNzIF9WYWxGdW5DbG9zOworICAKKyAgdGVtcGxhdGU8dGVtcGxhdGU8Y2xhc3MsIGNsYXNzPiBjbGFzcyBfTWV0YSwgY2xhc3MgX0RvbT4gCisgICAgY2xhc3MgX1JlZkZ1bkNsb3M7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPiBjbGFzcyB2YWxhcnJheTsgICAvLyBBbiBhcnJheSBvZiB0eXBlIF9UcAorICBjbGFzcyBzbGljZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJMQVMtbGlrZSBzbGljZSBvdXQgb2YgYW4gYXJyYXkKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPiBjbGFzcyBzbGljZV9hcnJheTsKKyAgY2xhc3MgZ3NsaWNlOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmFsaXplZCBzbGljZSBvdXQgb2YgYW4gYXJyYXkKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPiBjbGFzcyBnc2xpY2VfYXJyYXk7CisgIHRlbXBsYXRlPGNsYXNzIF9UcD4gY2xhc3MgbWFza19hcnJheTsgICAgIC8vIG1hc2tlZCBhcnJheQorICB0ZW1wbGF0ZTxjbGFzcyBfVHA+IGNsYXNzIGluZGlyZWN0X2FycmF5OyAvLyBpbmRpcmVjdGVkIGFycmF5CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2luY2x1ZGUgPGJpdHMvdmFsYXJyYXlfYXJyYXkuaD4KKyNpbmNsdWRlIDxiaXRzL3ZhbGFycmF5X2JlZm9yZS5oPgorICAKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGRlZmdyb3VwIG51bWVyaWNfYXJyYXlzIE51bWVyaWMgQXJyYXlzCisgICAqIEBpbmdyb3VwIG51bWVyaWNzCisgICAqCisgICAqIENsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmb3IgcmVwcmVzZW50aW5nIGFuZCBtYW5pcHVsYXRpbmcgYXJyYXlzIG9mIGVsZW1lbnRzLgorICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogIEBicmllZiAgU21hcnQgYXJyYXkgZGVzaWduZWQgdG8gc3VwcG9ydCBudW1lcmljIHByb2Nlc3NpbmcuCisgICAqCisgICAqICBBIHZhbGFycmF5IGlzIGFuIGFycmF5IHRoYXQgcHJvdmlkZXMgY29uc3RyYWludHMgaW50ZW5kZWQgdG8gYWxsb3cgZm9yCisgICAqICBlZmZlY3RpdmUgb3B0aW1pemF0aW9uIG9mIG51bWVyaWMgYXJyYXkgcHJvY2Vzc2luZyBieSByZWR1Y2luZyB0aGUKKyAgICogIGFsaWFzaW5nIHRoYXQgY2FuIHJlc3VsdCBmcm9tIHBvaW50ZXIgcmVwcmVzZW50YXRpb25zLiAgSXQgcmVwcmVzZW50cyBhCisgICAqICBvbmUtZGltZW5zaW9uYWwgYXJyYXkgZnJvbSB3aGljaCBkaWZmZXJlbnQgbXVsdGlkaW1lbnNpb25hbCBzdWJzZXRzIGNhbgorICAgKiAgYmUgYWNjZXNzZWQgYW5kIG1vZGlmaWVkLgorICAgKiAgCisgICAqICBAdHBhcmFtICBfVHAgIFR5cGUgb2Ygb2JqZWN0IGluIHRoZSBhcnJheS4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9UcD4gCisgICAgY2xhc3MgdmFsYXJyYXkKKyAgICB7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfT3A+CisJc3RydWN0IF9VbmFyeU9wIAorCXsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgX19mdW48X09wLCBfVHA+OjpyZXN1bHRfdHlwZSBfX3J0OworCSAgdHlwZWRlZiBfRXhwcjxfVW5DbG9zPF9PcCwgX1ZhbEFycmF5LCBfVHA+LCBfX3J0PiBfUnQ7CisJfTsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICAgICAgCisJLy8gX2xpYi52YWxhcnJheS5jb25zXyBjb25zdHJ1Y3QvZGVzdHJveToKKyAgICAgIC8vLyAgQ29uc3RydWN0IGFuIGVtcHR5IGFycmF5LgorICAgICAgdmFsYXJyYXkoKTsKKworICAgICAgLy8vICBDb25zdHJ1Y3QgYW4gYXJyYXkgd2l0aCBAYSBuIGVsZW1lbnRzLgorICAgICAgZXhwbGljaXQgdmFsYXJyYXkoc2l6ZV90KTsKKworICAgICAgLy8vICBDb25zdHJ1Y3QgYW4gYXJyYXkgd2l0aCBAYSBuIGVsZW1lbnRzIGluaXRpYWxpemVkIHRvIEBhIHQuCisgICAgICB2YWxhcnJheShjb25zdCBfVHAmLCBzaXplX3QpOworCisgICAgICAvLy8gIENvbnN0cnVjdCBhbiBhcnJheSBpbml0aWFsaXplZCB0byB0aGUgZmlyc3QgQGEgbiBlbGVtZW50cyBvZiBAYSB0LgorICAgICAgdmFsYXJyYXkoY29uc3QgX1RwKiBfX3Jlc3RyaWN0X18sIHNpemVfdCk7CisKKyAgICAgIC8vLyAgQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgIHZhbGFycmF5KGNvbnN0IHZhbGFycmF5Jik7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLy8gIE1vdmUgY29uc3RydWN0b3IuCisgICAgICB2YWxhcnJheSh2YWxhcnJheSYmKSBub2V4Y2VwdDsKKyNlbmRpZgorCisgICAgICAvLy8gIENvbnN0cnVjdCBhbiBhcnJheSB3aXRoIHRoZSBzYW1lIHNpemUgYW5kIHZhbHVlcyBpbiBAYSBzYS4KKyAgICAgIHZhbGFycmF5KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBDb25zdHJ1Y3QgYW4gYXJyYXkgd2l0aCB0aGUgc2FtZSBzaXplIGFuZCB2YWx1ZXMgaW4gQGEgZ2EuCisgICAgICB2YWxhcnJheShjb25zdCBnc2xpY2VfYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIENvbnN0cnVjdCBhbiBhcnJheSB3aXRoIHRoZSBzYW1lIHNpemUgYW5kIHZhbHVlcyBpbiBAYSBtYS4KKyAgICAgIHZhbGFycmF5KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIENvbnN0cnVjdCBhbiBhcnJheSB3aXRoIHRoZSBzYW1lIHNpemUgYW5kIHZhbHVlcyBpbiBAYSBpYS4KKyAgICAgIHZhbGFycmF5KGNvbnN0IGluZGlyZWN0X2FycmF5PF9UcD4mKTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vLyAgQ29uc3RydWN0IGFuIGFycmF5IHdpdGggYW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiB2YWx1ZXMuCisgICAgICB2YWxhcnJheShpbml0aWFsaXplcl9saXN0PF9UcD4pOworI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisJdmFsYXJyYXkoY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lKTsKKworICAgICAgfnZhbGFycmF5KCkgX0dMSUJDWFhfTk9FWENFUFQ7CisKKyAgICAgIC8vIF9saWIudmFsYXJyYXkuYXNzaWduXyBhc3NpZ25tZW50OgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ24gZWxlbWVudHMgdG8gYW4gYXJyYXkuCisgICAgICAgKgorICAgICAgICogIEFzc2lnbiBlbGVtZW50cyBvZiBhcnJheSB0byB2YWx1ZXMgaW4gQGEgdi4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3YgIFZhbGFycmF5IHRvIGdldCB2YWx1ZXMgZnJvbS4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdik7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmUgYXNzaWduIGVsZW1lbnRzIHRvIGFuIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBNb3ZlIGFzc2lnbiBlbGVtZW50cyBvZiBhcnJheSB0byB2YWx1ZXMgaW4gQGEgdi4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3YgIFZhbGFycmF5IHRvIGdldCB2YWx1ZXMgZnJvbS4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I9KHZhbGFycmF5PF9UcD4mJiBfX3YpIG5vZXhjZXB0OworI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWduIGVsZW1lbnRzIHRvIGEgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIEFzc2lnbiBhbGwgZWxlbWVudHMgb2YgYXJyYXkgdG8gQGEgdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3QgIFZhbHVlIGZvciBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IF9UcCYgX190KTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ24gZWxlbWVudHMgdG8gYW4gYXJyYXkgc3Vic2V0LgorICAgICAgICoKKyAgICAgICAqICBBc3NpZ24gZWxlbWVudHMgb2YgYXJyYXkgdG8gdmFsdWVzIGluIEBhIHNhLiAgUmVzdWx0cyBhcmUgdW5kZWZpbmVkCisgICAgICAgKiAgaWYgQGEgc2EgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoaXMgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zYSAgQXJyYXkgc2xpY2UgdG8gZ2V0IHZhbHVlcyBmcm9tLgorICAgICAgICovCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3Qgc2xpY2VfYXJyYXk8X1RwPiYgX19zYSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWduIGVsZW1lbnRzIHRvIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgQXNzaWduIGVsZW1lbnRzIG9mIGFycmF5IHRvIHZhbHVlcyBpbiBAYSBnYS4gIFJlc3VsdHMgYXJlIHVuZGVmaW5lZAorICAgICAgICogIGlmIEBhIGdhIGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGlzIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fZ2EgIEFycmF5IHNsaWNlIHRvIGdldCB2YWx1ZXMgZnJvbS4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IGdzbGljZV9hcnJheTxfVHA+JiBfX2dhKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ24gZWxlbWVudHMgdG8gYW4gYXJyYXkgc3Vic2V0LgorICAgICAgICoKKyAgICAgICAqICBBc3NpZ24gZWxlbWVudHMgb2YgYXJyYXkgdG8gdmFsdWVzIGluIEBhIG1hLiAgUmVzdWx0cyBhcmUgdW5kZWZpbmVkCisgICAgICAgKiAgaWYgQGEgbWEgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoaXMgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19tYSAgQXJyYXkgc2xpY2UgdG8gZ2V0IHZhbHVlcyBmcm9tLgorICAgICAgICovCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3QgbWFza19hcnJheTxfVHA+JiBfX21hKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ24gZWxlbWVudHMgdG8gYW4gYXJyYXkgc3Vic2V0LgorICAgICAgICoKKyAgICAgICAqICBBc3NpZ24gZWxlbWVudHMgb2YgYXJyYXkgdG8gdmFsdWVzIGluIEBhIGlhLiAgUmVzdWx0cyBhcmUgdW5kZWZpbmVkCisgICAgICAgKiAgaWYgQGEgaWEgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoaXMgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19pYSAgQXJyYXkgc2xpY2UgdG8gZ2V0IHZhbHVlcyBmcm9tLgorICAgICAgICovCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3QgaW5kaXJlY3RfYXJyYXk8X1RwPiYgX19pYSk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbiBlbGVtZW50cyB0byBhbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICoKKyAgICAgICAqICBBc3NpZ24gZWxlbWVudHMgb2YgYXJyYXkgdG8gdmFsdWVzIGluIEBhIF9fbC4gIFJlc3VsdHMgYXJlIHVuZGVmaW5lZAorICAgICAgICogIGlmIEBhIF9fbCBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhpcyBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2wgIGluaXRpYWxpemVyX2xpc3QgdG8gZ2V0IHZhbHVlcyBmcm9tLgorICAgICAgICovCisgICAgICB2YWxhcnJheSYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2wpOworI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+IHZhbGFycmF5PF9UcD4mCisJb3BlcmF0b3I9IChjb25zdCBfRXhwcjxfRG9tLCBfVHA+Jik7CisKKyAgICAgIC8vIF9saWIudmFsYXJyYXkuYWNjZXNzXyBlbGVtZW50IGFjY2VzczoKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgaSd0aCBhcnJheSBlbGVtZW50LiAgCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19pICBJbmRleCBvZiBlbGVtZW50IHRvIHJldHVybi4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhlIGkndGggZWxlbWVudC4KKyAgICAgICAqLworICAgICAgX1RwJiAgICAgICAgICAgICAgICBvcGVyYXRvcltdKHNpemVfdCBfX2kpOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAzODkuIENvbnN0IG92ZXJsb2FkIG9mIHZhbGFycmF5OjpvcGVyYXRvcltdIHJldHVybnMgYnkgdmFsdWUuCisgICAgICBjb25zdCBfVHAmICAgICAgICAgIG9wZXJhdG9yW10oc2l6ZV90KSBjb25zdDsKKworICAgICAgLy8gX2xpYi52YWxhcnJheS5zdWJfIHN1YnNldCBvcGVyYXRpb25zOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYW4gYXJyYXkgc3Vic2V0LgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgbmV3IHZhbGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheQorICAgICAgICogIGluZGljYXRlZCBieSB0aGUgc2xpY2UgYXJndW1lbnQuICBUaGUgbmV3IHZhbGFycmF5IGhhcyB0aGUgc2FtZSBzaXplCisgICAgICAgKiAgYXMgdGhlIGlucHV0IHNsaWNlLiAgQHNlZSBzbGljZS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBzb3VyY2Ugc2xpY2UuCisgICAgICAgKiAgQHJldHVybiAgTmV3IHZhbGFycmF5IGNvbnRhaW5pbmcgZWxlbWVudHMgaW4gQGEgX19zLgorICAgICAgICovCisgICAgICBfRXhwcjxfU0Nsb3M8X1ZhbEFycmF5LCBfVHA+LCBfVHA+IG9wZXJhdG9yW10oc2xpY2UgX19zKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgc3Vic2V0LgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgbmV3IHZhbGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheQorICAgICAgICogIGluZGljYXRlZCBieSB0aGUgc2xpY2UgYXJndW1lbnQuICBUaGUgbmV3IHZhbGFycmF5IGhhcyB0aGUgc2FtZSBzaXplCisgICAgICAgKiAgYXMgdGhlIGlucHV0IHNsaWNlLiAgQHNlZSBzbGljZS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBzb3VyY2Ugc2xpY2UuCisgICAgICAgKiAgQHJldHVybiAgTmV3IHZhbGFycmF5IGNvbnRhaW5pbmcgZWxlbWVudHMgaW4gQGEgX19zLgorICAgICAgICovCisgICAgICBzbGljZV9hcnJheTxfVHA+ICAgIG9wZXJhdG9yW10oc2xpY2UgX19zKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYW4gYXJyYXkgc3Vic2V0LgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgc2xpY2VfYXJyYXkgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheQorICAgICAgICogIGluZGljYXRlZCBieSB0aGUgc2xpY2UgYXJndW1lbnQuICBAc2VlIGdzbGljZS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBzb3VyY2Ugc2xpY2UuCisgICAgICAgKiAgQHJldHVybiAgU2xpY2VfYXJyYXkgcmVmZXJlbmNpbmcgZWxlbWVudHMgaW5kaWNhdGVkIGJ5IEBhIF9fcy4KKyAgICAgICAqLworICAgICAgX0V4cHI8X0dDbG9zPF9WYWxBcnJheSwgX1RwPiwgX1RwPiBvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYgX19zKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgc3Vic2V0LgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgbmV3IHZhbGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheQorICAgICAgICogIGluZGljYXRlZCBieSB0aGUgZ3NsaWNlIGFyZ3VtZW50LiAgVGhlIG5ldyB2YWxhcnJheSBoYXMKKyAgICAgICAqICB0aGUgc2FtZSBzaXplIGFzIHRoZSBpbnB1dCBnc2xpY2UuICBAc2VlIGdzbGljZS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBzb3VyY2UgZ3NsaWNlLgorICAgICAgICogIEByZXR1cm4gIE5ldyB2YWxhcnJheSBjb250YWluaW5nIGVsZW1lbnRzIGluIEBhIF9fcy4KKyAgICAgICAqLworICAgICAgZ3NsaWNlX2FycmF5PF9UcD4gICBvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYgX19zKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYW4gYXJyYXkgc3Vic2V0LgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgbmV3IHZhbGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheQorICAgICAgICogIGluZGljYXRlZCBieSB0aGUgYXJndW1lbnQuICBUaGUgaW5wdXQgaXMgYSB2YWxhcnJheSBvZiBib29sIHdoaWNoCisgICAgICAgKiAgcmVwcmVzZW50cyBhIGJpdG1hc2sgaW5kaWNhdGluZyB3aGljaCBlbGVtZW50cyBzaG91bGQgYmUgY29waWVkIGludG8KKyAgICAgICAqICB0aGUgbmV3IHZhbGFycmF5LiAgRWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheSBpcyBhZGRlZCB0byB0aGUgcmV0dXJuCisgICAgICAgKiAgdmFsYXJyYXkgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiB0aGUgYXJndW1lbnQgaXMgdHJ1ZS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX20gIFRoZSB2YWxhcnJheSBiaXRtYXNrLgorICAgICAgICogIEByZXR1cm4gIE5ldyB2YWxhcnJheSBjb250YWluaW5nIGVsZW1lbnRzIGluZGljYXRlZCBieSBAYSBfX20uCisgICAgICAgKi8KKyAgICAgIHZhbGFycmF5PF9UcD4gICAgICAgb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxib29sPiYgX19tKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgc3Vic2V0LgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgbmV3IG1hc2tfYXJyYXkgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheQorICAgICAgICogIGluZGljYXRlZCBieSB0aGUgYXJndW1lbnQuICBUaGUgaW5wdXQgaXMgYSB2YWxhcnJheSBvZiBib29sIHdoaWNoCisgICAgICAgKiAgcmVwcmVzZW50cyBhIGJpdG1hc2sgaW5kaWNhdGluZyB3aGljaCBlbGVtZW50cyBhcmUgcGFydCBvZiB0aGUKKyAgICAgICAqICBzdWJzZXQuICBFbGVtZW50cyBvZiB0aGUgYXJyYXkgYXJlIHBhcnQgb2YgdGhlIHN1YnNldCBpZiB0aGUKKyAgICAgICAqICBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIGFyZ3VtZW50IGlzIHRydWUuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19tICBUaGUgdmFsYXJyYXkgYml0bWFzay4KKyAgICAgICAqICBAcmV0dXJuICBOZXcgdmFsYXJyYXkgY29udGFpbmluZyBlbGVtZW50cyBpbmRpY2F0ZWQgYnkgQGEgX19tLgorICAgICAgICovCisgICAgICBtYXNrX2FycmF5PF9UcD4gICAgIG9wZXJhdG9yW10oY29uc3QgdmFsYXJyYXk8Ym9vbD4mIF9fbSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIG5ldyB2YWxhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkKKyAgICAgICAqICBpbmRpY2F0ZWQgYnkgdGhlIGFyZ3VtZW50LiAgVGhlIGVsZW1lbnRzIGluIHRoZSBhcmd1bWVudCBhcmUKKyAgICAgICAqICBpbnRlcnByZXRlZCBhcyB0aGUgaW5kaWNlcyBvZiBlbGVtZW50cyBvZiB0aGlzIHZhbGFycmF5IHRvIGNvcHkgdG8KKyAgICAgICAqICB0aGUgcmV0dXJuIHZhbGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9faSAgVGhlIHZhbGFycmF5IGVsZW1lbnQgaW5kZXggbGlzdC4KKyAgICAgICAqICBAcmV0dXJuICBOZXcgdmFsYXJyYXkgY29udGFpbmluZyBlbGVtZW50cyBpbiBAYSBfX3MuCisgICAgICAgKi8KKyAgICAgIF9FeHByPF9JQ2xvczxfVmFsQXJyYXksIF9UcD4sIF9UcD4KKyAgICAgICAgb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2kpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBhIHJlZmVyZW5jZSB0byBhbiBhcnJheSBzdWJzZXQuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYW4gaW5kaXJlY3RfYXJyYXkgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheQorICAgICAgICogIGluZGljYXRlZCBieSB0aGUgYXJndW1lbnQuICBUaGUgZWxlbWVudHMgaW4gdGhlIGFyZ3VtZW50IGFyZQorICAgICAgICogIGludGVycHJldGVkIGFzIHRoZSBpbmRpY2VzIG9mIGVsZW1lbnRzIG9mIHRoaXMgdmFsYXJyYXkgdG8gaW5jbHVkZQorICAgICAgICogIGluIHRoZSBzdWJzZXQuICBUaGUgcmV0dXJuZWQgaW5kaXJlY3RfYXJyYXkgcmVmZXJzIHRvIHRoZXNlCisgICAgICAgKiAgZWxlbWVudHMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19pICBUaGUgdmFsYXJyYXkgZWxlbWVudCBpbmRleCBsaXN0LgorICAgICAgICogIEByZXR1cm4gIEluZGlyZWN0X2FycmF5IHJlZmVyZW5jaW5nIGVsZW1lbnRzIGluIEBhIF9faS4KKyAgICAgICAqLworICAgICAgaW5kaXJlY3RfYXJyYXk8X1RwPiBvcGVyYXRvcltdKGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSk7CisKKyAgICAgIC8vIF9saWIudmFsYXJyYXkudW5hcnlfIHVuYXJ5IG9wZXJhdG9yczoKKyAgICAgIC8vLyAgUmV0dXJuIGEgbmV3IHZhbGFycmF5IGJ5IGFwcGx5aW5nIHVuYXJ5ICsgdG8gZWFjaCBlbGVtZW50LgorICAgICAgdHlwZW5hbWUgX1VuYXJ5T3A8X191bmFyeV9wbHVzPjo6X1J0ICBvcGVyYXRvcisoKSBjb25zdDsKKworICAgICAgLy8vICBSZXR1cm4gYSBuZXcgdmFsYXJyYXkgYnkgYXBwbHlpbmcgdW5hcnkgLSB0byBlYWNoIGVsZW1lbnQuCisgICAgICB0eXBlbmFtZSBfVW5hcnlPcDxfX25lZ2F0ZT46Ol9SdCAgICAgIG9wZXJhdG9yLSgpIGNvbnN0OworCisgICAgICAvLy8gIFJldHVybiBhIG5ldyB2YWxhcnJheSBieSBhcHBseWluZyB1bmFyeSB+IHRvIGVhY2ggZWxlbWVudC4KKyAgICAgIHR5cGVuYW1lIF9VbmFyeU9wPF9fYml0d2lzZV9ub3Q+OjpfUnQgb3BlcmF0b3J+KCkgY29uc3Q7CisKKyAgICAgIC8vLyAgUmV0dXJuIGEgbmV3IHZhbGFycmF5IGJ5IGFwcGx5aW5nIHVuYXJ5ICEgdG8gZWFjaCBlbGVtZW50LgorICAgICAgdHlwZW5hbWUgX1VuYXJ5T3A8X19sb2dpY2FsX25vdD46Ol9SdCBvcGVyYXRvciEoKSBjb25zdDsKKworICAgICAgLy8gX2xpYi52YWxhcnJheS5jYXNzaWduXyBjb21wdXRlZCBhc3NpZ25tZW50OgorICAgICAgLy8vICBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgYXJyYXkgYnkgQGEgdC4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yKj0oY29uc3QgX1RwJik7CisKKyAgICAgIC8vLyAgRGl2aWRlIGVhY2ggZWxlbWVudCBvZiBhcnJheSBieSBAYSB0LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IvPShjb25zdCBfVHAmKTsKKworICAgICAgLy8vICBTZXQgZWFjaCBlbGVtZW50IGUgb2YgYXJyYXkgdG8gZSAlIEBhIHQuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvciU9KGNvbnN0IF9UcCYpOworCisgICAgICAvLy8gIEFkZCBAYSB0IHRvIGVhY2ggZWxlbWVudCBvZiBhcnJheS4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yKz0oY29uc3QgX1RwJik7CisKKyAgICAgIC8vLyAgU3VidHJhY3QgQGEgdCB0byBlYWNoIGVsZW1lbnQgb2YgYXJyYXkuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvci09KGNvbnN0IF9UcCYpOworCisgICAgICAvLy8gIFNldCBlYWNoIGVsZW1lbnQgZSBvZiBhcnJheSB0byBlIF4gQGEgdC4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yXj0oY29uc3QgX1RwJik7CisKKyAgICAgIC8vLyAgU2V0IGVhY2ggZWxlbWVudCBlIG9mIGFycmF5IHRvIGUgJiBAYSB0LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3ImPShjb25zdCBfVHAmKTsKKworICAgICAgLy8vICBTZXQgZWFjaCBlbGVtZW50IGUgb2YgYXJyYXkgdG8gZSB8IEBhIHQuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcnw9KGNvbnN0IF9UcCYpOworCisgICAgICAvLy8gIExlZnQgc2hpZnQgZWFjaCBlbGVtZW50IGUgb2YgYXJyYXkgYnkgQGEgdCBiaXRzLgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I8PD0oY29uc3QgX1RwJik7CisKKyAgICAgIC8vLyAgUmlnaHQgc2hpZnQgZWFjaCBlbGVtZW50IGUgb2YgYXJyYXkgYnkgQGEgdCBiaXRzLgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I+Pj0oY29uc3QgX1RwJik7CisKKyAgICAgIC8vLyAgTXVsdGlwbHkgZWxlbWVudHMgb2YgYXJyYXkgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IqPShjb25zdCB2YWxhcnJheTxfVHA+Jik7CisKKyAgICAgIC8vLyAgRGl2aWRlIGVsZW1lbnRzIG9mIGFycmF5IGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yLz0oY29uc3QgdmFsYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIE1vZHVsbyBlbGVtZW50cyBvZiBhcnJheSBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvciU9KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBBZGQgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IHRvIGVsZW1lbnRzIG9mIGFycmF5LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IrPShjb25zdCB2YWxhcnJheTxfVHA+Jik7CisKKyAgICAgIC8vLyAgU3VidHJhY3QgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IGZyb20gZWxlbWVudHMgb2YgYXJyYXkuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvci09KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBMb2dpY2FsIHhvciBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYgd2l0aCBlbGVtZW50cyBvZiBhcnJheS4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yXj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIExvZ2ljYWwgb3IgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IHdpdGggZWxlbWVudHMgb2YgYXJyYXkuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcnw9KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBMb2dpY2FsIGFuZCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYgd2l0aCBlbGVtZW50cyBvZiBhcnJheS4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yJj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIExlZnQgc2hpZnQgZWxlbWVudHMgb2YgYXJyYXkgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I8PD0oY29uc3QgdmFsYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIFJpZ2h0IHNoaWZ0IGVsZW1lbnRzIG9mIGFycmF5IGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPj49KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2YWxhcnJheTxfVHA+JiBvcGVyYXRvcio9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKTsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisJdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IvPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+Jik7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZhbGFycmF5PF9UcD4mIG9wZXJhdG9yJT0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpOworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2YWxhcnJheTxfVHA+JiBvcGVyYXRvcis9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKTsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisJdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3ItPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+Jik7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZhbGFycmF5PF9UcD4mIG9wZXJhdG9yXj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpOworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2YWxhcnJheTxfVHA+JiBvcGVyYXRvcnw9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKTsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisJdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3ImPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+Jik7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcjw8PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+Jik7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPj49KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKTsKKworICAgICAgLy8gX2xpYi52YWxhcnJheS5tZW1iZXJzXyBtZW1iZXIgZnVuY3Rpb25zOgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vLyAgU3dhcC4KKyAgICAgIHZvaWQgc3dhcCh2YWxhcnJheTxfVHA+JiBfX3YpIG5vZXhjZXB0OworI2VuZGlmCisKKyAgICAgIC8vLyAgUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYXJyYXkuCisgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiB0aGUgc3VtIG9mIGFsbCBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIEFjY3VtdWxhdGVzIHRoZSBzdW0gb2YgYWxsIGVsZW1lbnRzIGludG8gYSBUcCB1c2luZyArPS4gIFRoZSBvcmRlcgorICAgICAgICogIG9mIGFkZGluZyB0aGUgZWxlbWVudHMgaXMgdW5zcGVjaWZpZWQuCisgICAgICAgKi8KKyAgICAgIF9UcCAgICBzdW0oKSBjb25zdDsKKworICAgICAgLy8vICBSZXR1cm4gdGhlIG1pbmltdW0gZWxlbWVudCB1c2luZyBvcGVyYXRvcjwoKS4KKyAgICAgIF9UcCAgICBtaW4oKSBjb25zdDsJCisKKyAgICAgIC8vLyAgUmV0dXJuIHRoZSBtYXhpbXVtIGVsZW1lbnQgdXNpbmcgb3BlcmF0b3I8KCkuCisgICAgICBfVHAgICAgbWF4KCkgY29uc3Q7CQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBhIHNoaWZ0ZWQgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIEEgbmV3IHZhbGFycmF5IGlzIGNvbnN0cnVjdGVkIGFzIGEgY29weSBvZiB0aGlzIGFycmF5IHdpdGggZWxlbWVudHMKKyAgICAgICAqICBpbiBzaGlmdGVkIHBvc2l0aW9ucy4gIEZvciBhbiBlbGVtZW50IHdpdGggaW5kZXggaSwgdGhlIG5ldyBwb3NpdGlvbgorICAgICAgICogIGlzIGkgLSBuLiAgVGhlIG5ldyB2YWxhcnJheSBoYXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgY3VycmVudCBvbmUuCisgICAgICAgKiAgTmV3IGVsZW1lbnRzIHdpdGhvdXQgYSB2YWx1ZSBhcmUgc2V0IHRvIDAuICBFbGVtZW50cyB3aG9zZSBuZXcKKyAgICAgICAqICBwb3NpdGlvbiBpcyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIGFycmF5IGFyZSBkaXNjYXJkZWQuCisgICAgICAgKgorICAgICAgICogIFBvc2l0aXZlIGFyZ3VtZW50cyBzaGlmdCB0b3dhcmQgaW5kZXggMCwgZGlzY2FyZGluZyBlbGVtZW50cyBbMCwgbikuCisgICAgICAgKiAgTmVnYXRpdmUgYXJndW1lbnRzIGRpc2NhcmQgZWxlbWVudHMgZnJvbSB0aGUgdG9wIG9mIHRoZSBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBlbGVtZW50IHBvc2l0aW9ucyB0byBzaGlmdC4KKyAgICAgICAqICBAcmV0dXJuICBOZXcgdmFsYXJyYXkgd2l0aCBlbGVtZW50cyBpbiBzaGlmdGVkIHBvc2l0aW9ucy4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiBzaGlmdCAoaW50IF9fbikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGEgcm90YXRlZCBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgQSBuZXcgdmFsYXJyYXkgaXMgY29uc3RydWN0ZWQgYXMgYSBjb3B5IG9mIHRoaXMgYXJyYXkgd2l0aCBlbGVtZW50cworICAgICAgICogIGluIHNoaWZ0ZWQgcG9zaXRpb25zLiAgRm9yIGFuIGVsZW1lbnQgd2l0aCBpbmRleCBpLCB0aGUgbmV3IHBvc2l0aW9uCisgICAgICAgKiAgaXMgKGkgLSBuKSAlIHNpemUoKS4gIFRoZSBuZXcgdmFsYXJyYXkgaGFzIHRoZSBzYW1lIHNpemUgYXMgdGhlCisgICAgICAgKiAgY3VycmVudCBvbmUuICBFbGVtZW50cyB0aGF0IGFyZSBzaGlmdGVkIGJleW9uZCB0aGUgYXJyYXkgYm91bmRzIGFyZQorICAgICAgICogIHNoaWZ0ZWQgaW50byB0aGUgb3RoZXIgZW5kIG9mIHRoZSBhcnJheS4gIE5vIGVsZW1lbnRzIGFyZSBsb3N0LgorICAgICAgICoKKyAgICAgICAqICBQb3NpdGl2ZSBhcmd1bWVudHMgc2hpZnQgdG93YXJkIGluZGV4IDAsIHdyYXBwaW5nIGFyb3VuZCB0aGUgdG9wLgorICAgICAgICogIE5lZ2F0aXZlIGFyZ3VtZW50cyBzaGlmdCB0b3dhcmRzIHRoZSB0b3AsIHdyYXBwaW5nIGFyb3VuZCB0byAwLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGVsZW1lbnQgcG9zaXRpb25zIHRvIHJvdGF0ZS4KKyAgICAgICAqICBAcmV0dXJuICBOZXcgdmFsYXJyYXkgd2l0aCBlbGVtZW50cyBpbiBzaGlmdGVkIHBvc2l0aW9ucy4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiBjc2hpZnQoaW50IF9fbikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwbHkgYSBmdW5jdGlvbiB0byB0aGUgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBuZXcgdmFsYXJyYXkgd2l0aCBlbGVtZW50cyBhc3NpZ25lZCB0byB0aGUgcmVzdWx0IG9mCisgICAgICAgKiAgYXBwbHlpbmcgZnVuYyB0byB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHRoaXMgYXJyYXkuICBUaGUgbmV3CisgICAgICAgKiAgYXJyYXkgaGFzIHRoZSBzYW1lIHNpemUgYXMgdGhpcyBvbmUuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgZnVuYyAgRnVuY3Rpb24gb2YgVHAgcmV0dXJuaW5nIFRwIHRvIGFwcGx5LgorICAgICAgICogIEByZXR1cm4gIE5ldyB2YWxhcnJheSB3aXRoIHRyYW5zZm9ybWVkIGVsZW1lbnRzLgorICAgICAgICovCisgICAgICBfRXhwcjxfVmFsRnVuQ2xvczxfVmFsQXJyYXksIF9UcD4sIF9UcD4gYXBwbHkoX1RwIGZ1bmMoX1RwKSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwbHkgYSBmdW5jdGlvbiB0byB0aGUgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBuZXcgdmFsYXJyYXkgd2l0aCBlbGVtZW50cyBhc3NpZ25lZCB0byB0aGUgcmVzdWx0IG9mCisgICAgICAgKiAgYXBwbHlpbmcgZnVuYyB0byB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHRoaXMgYXJyYXkuICBUaGUgbmV3CisgICAgICAgKiAgYXJyYXkgaGFzIHRoZSBzYW1lIHNpemUgYXMgdGhpcyBvbmUuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgZnVuYyAgRnVuY3Rpb24gb2YgY29uc3QgVHAmIHJldHVybmluZyBUcCB0byBhcHBseS4KKyAgICAgICAqICBAcmV0dXJuICBOZXcgdmFsYXJyYXkgd2l0aCB0cmFuc2Zvcm1lZCBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgX0V4cHI8X1JlZkZ1bkNsb3M8X1ZhbEFycmF5LCBfVHA+LCBfVHA+IGFwcGx5KF9UcCBmdW5jKGNvbnN0IF9UcCYpKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXNpemUgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIFJlc2l6ZSB0aGlzIGFycmF5IHRvIEBhIHNpemUgYW5kIHNldCBhbGwgZWxlbWVudHMgdG8gQGEgYy4gIEFsbAorICAgICAgICogIHJlZmVyZW5jZXMgYW5kIGl0ZXJhdG9ycyBhcmUgaW52YWxpZGF0ZWQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zaXplICBOZXcgYXJyYXkgc2l6ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fYyAgTmV3IHZhbHVlIGZvciBhbGwgZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIHZvaWQgcmVzaXplKHNpemVfdCBfX3NpemUsIF9UcCBfX2MgPSBfVHAoKSk7CisKKyAgICBwcml2YXRlOgorICAgICAgc2l6ZV90IF9NX3NpemU7CisgICAgICBfVHAqIF9fcmVzdHJpY3RfXyBfTV9kYXRhOworICAgICAgCisgICAgICBmcmllbmQgY2xhc3MgX0FycmF5PF9UcD47CisgICAgfTsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29uc3QgX1RwJgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3QKKyAgICB7IAorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N1YnNjcmlwdChfX2kpOworICAgICAgcmV0dXJuIF9NX2RhdGFbX19pXTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAmCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShzaXplX3QgX19pKQorICAgIHsgCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3Vic2NyaXB0KF9faSk7CisgICAgICByZXR1cm4gX01fZGF0YVtfX2ldOworICAgIH0KKworICAvLyBAfSBncm91cCBudW1lcmljX2FycmF5cworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpbmNsdWRlIDxiaXRzL3ZhbGFycmF5X2FmdGVyLmg+CisjaW5jbHVkZSA8Yml0cy9zbGljZV9hcnJheS5oPgorI2luY2x1ZGUgPGJpdHMvZ3NsaWNlLmg+CisjaW5jbHVkZSA8Yml0cy9nc2xpY2VfYXJyYXkuaD4KKyNpbmNsdWRlIDxiaXRzL21hc2tfYXJyYXkuaD4KKyNpbmNsdWRlIDxiaXRzL2luZGlyZWN0X2FycmF5Lmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgbnVtZXJpY19hcnJheXMKKyAgICogQHsKKyAgICovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KCkgOiBfTV9zaXplKDApLCBfTV9kYXRhKDApIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSAKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShzaXplX3QgX19uKSAKKyAgICA6IF9NX3NpemUoX19uKSwgX01fZGF0YShfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX19uKSkKKyAgICB7IHN0ZDo6X192YWxhcnJheV9kZWZhdWx0X2NvbnN0cnVjdChfTV9kYXRhLCBfTV9kYXRhICsgX19uKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCBfVHAmIF9fdCwgc2l6ZV90IF9fbikKKyAgICA6IF9NX3NpemUoX19uKSwgX01fZGF0YShfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX19uKSkKKyAgICB7IHN0ZDo6X192YWxhcnJheV9maWxsX2NvbnN0cnVjdChfTV9kYXRhLCBfTV9kYXRhICsgX19uLCBfX3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IF9UcCogX19yZXN0cmljdF9fIF9fcCwgc2l6ZV90IF9fbikKKyAgICA6IF9NX3NpemUoX19uKSwgX01fZGF0YShfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX19uKSkKKyAgICB7IAorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9fcCAhPSAwIHx8IF9fbiA9PSAwKTsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfX3AsIF9fcCArIF9fbiwgX01fZGF0YSk7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lCisgICAgdmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkoY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KQorICAgIDogX01fc2l6ZShfX3YuX01fc2l6ZSksIF9NX2RhdGEoX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fdi5fTV9zaXplKSkKKyAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfX3YuX01fZGF0YSwgX192Ll9NX2RhdGEgKyBfTV9zaXplLAorCQkJCSAgICAgX01fZGF0YSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KHZhbGFycmF5PF9UcD4mJiBfX3YpIG5vZXhjZXB0CisgICAgOiBfTV9zaXplKF9fdi5fTV9zaXplKSwgX01fZGF0YShfX3YuX01fZGF0YSkKKyAgICB7CisgICAgICBfX3YuX01fc2l6ZSA9IDA7CisgICAgICBfX3YuX01fZGF0YSA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mIF9fc2EpCisgICAgOiBfTV9zaXplKF9fc2EuX01fc3opLCBfTV9kYXRhKF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfX3NhLl9NX3N6KSkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QKKwkoX19zYS5fTV9hcnJheSwgX19zYS5fTV9zeiwgX19zYS5fTV9zdHJpZGUsIF9BcnJheTxfVHA+KF9NX2RhdGEpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IGdzbGljZV9hcnJheTxfVHA+JiBfX2dhKQorICAgIDogX01fc2l6ZShfX2dhLl9NX2luZGV4LnNpemUoKSksCisgICAgICBfTV9kYXRhKF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfTV9zaXplKSkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QKKwkoX19nYS5fTV9hcnJheSwgX0FycmF5PHNpemVfdD4oX19nYS5fTV9pbmRleCksCisJIF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfTV9zaXplKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYgX19tYSkKKyAgICA6IF9NX3NpemUoX19tYS5fTV9zeiksIF9NX2RhdGEoX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fbWEuX01fc3opKQorICAgIHsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdAorCShfX21hLl9NX2FycmF5LCBfX21hLl9NX21hc2ssIF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfTV9zaXplKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IGluZGlyZWN0X2FycmF5PF9UcD4mIF9faWEpCisgICAgOiBfTV9zaXplKF9faWEuX01fc3opLCBfTV9kYXRhKF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfX2lhLl9NX3N6KSkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QKKwkoX19pYS5fTV9hcnJheSwgX19pYS5fTV9pbmRleCwgX0FycmF5PF9UcD4oX01fZGF0YSksIF9NX3NpemUpOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2wpCisgICAgOiBfTV9zaXplKF9fbC5zaXplKCkpLCBfTV9kYXRhKF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfX2wuc2l6ZSgpKSkKKyAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfTV9kYXRhKTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSkKKyAgICA6IF9NX3NpemUoX19lLnNpemUoKSksIF9NX2RhdGEoX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9NX3NpemUpKQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KF9fZSwgX01fc2l6ZSwgX0FycmF5PF9UcD4oX01fZGF0YSkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46On52YWxhcnJheSgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgc3RkOjpfX3ZhbGFycmF5X2Rlc3Ryb3lfZWxlbWVudHMoX01fZGF0YSwgX01fZGF0YSArIF9NX3NpemUpOworICAgICAgc3RkOjpfX3ZhbGFycmF5X3JlbGVhc2VfbWVtb3J5KF9NX2RhdGEpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA2MzAuIGFycmF5cyBvZiB2YWxhcnJheS4KKyAgICAgIGlmIChfTV9zaXplID09IF9fdi5fTV9zaXplKQorCXN0ZDo6X192YWxhcnJheV9jb3B5KF9fdi5fTV9kYXRhLCBfTV9zaXplLCBfTV9kYXRhKTsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAoX01fZGF0YSkKKwkgICAgeworCSAgICAgIHN0ZDo6X192YWxhcnJheV9kZXN0cm95X2VsZW1lbnRzKF9NX2RhdGEsIF9NX2RhdGEgKyBfTV9zaXplKTsKKwkgICAgICBzdGQ6Ol9fdmFsYXJyYXlfcmVsZWFzZV9tZW1vcnkoX01fZGF0YSk7CisJICAgIH0KKwkgIF9NX3NpemUgPSBfX3YuX01fc2l6ZTsKKwkgIF9NX2RhdGEgPSBfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX01fc2l6ZSk7CisJICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX192Ll9NX2RhdGEsIF9fdi5fTV9kYXRhICsgX01fc2l6ZSwKKwkJCQkJIF9NX2RhdGEpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPiYKKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0odmFsYXJyYXk8X1RwPiYmIF9fdikgbm9leGNlcHQKKyAgICB7CisgICAgICBpZiAoX01fZGF0YSkKKwl7CisJICBzdGQ6Ol9fdmFsYXJyYXlfZGVzdHJveV9lbGVtZW50cyhfTV9kYXRhLCBfTV9kYXRhICsgX01fc2l6ZSk7CisJICBzdGQ6Ol9fdmFsYXJyYXlfcmVsZWFzZV9tZW1vcnkoX01fZGF0YSk7CisJfQorICAgICAgX01fc2l6ZSA9IF9fdi5fTV9zaXplOworICAgICAgX01fZGF0YSA9IF9fdi5fTV9kYXRhOworICAgICAgX192Ll9NX3NpemUgPSAwOworICAgICAgX192Ll9NX2RhdGEgPSAwOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2wpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNjMwLiBhcnJheXMgb2YgdmFsYXJyYXkuCisgICAgICBpZiAoX01fc2l6ZSA9PSBfX2wuc2l6ZSgpKQorCXN0ZDo6X192YWxhcnJheV9jb3B5KF9fbC5iZWdpbigpLCBfX2wuc2l6ZSgpLCBfTV9kYXRhKTsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAoX01fZGF0YSkKKwkgICAgeworCSAgICAgIHN0ZDo6X192YWxhcnJheV9kZXN0cm95X2VsZW1lbnRzKF9NX2RhdGEsIF9NX2RhdGEgKyBfTV9zaXplKTsKKwkgICAgICBzdGQ6Ol9fdmFsYXJyYXlfcmVsZWFzZV9tZW1vcnkoX01fZGF0YSk7CisJICAgIH0KKwkgIF9NX3NpemUgPSBfX2wuc2l6ZSgpOworCSAgX01fZGF0YSA9IF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfTV9zaXplKTsKKwkgIHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfX2wuYmVnaW4oKSwgX19sLmJlZ2luKCkgKyBfTV9zaXplLAorCQkJCQkgX01fZGF0YSk7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPiYKKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgX1RwJiBfX3QpCisgICAgeworICAgICAgc3RkOjpfX3ZhbGFycmF5X2ZpbGwoX01fZGF0YSwgX01fc2l6ZSwgX190KTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+JgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBzbGljZV9hcnJheTxfVHA+JiBfX3NhKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9zaXplID09IF9fc2EuX01fc3opOworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19zYS5fTV9hcnJheSwgX19zYS5fTV9zeiwKKwkJCSAgIF9fc2EuX01fc3RyaWRlLCBfQXJyYXk8X1RwPihfTV9kYXRhKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPiYKKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgZ3NsaWNlX2FycmF5PF9UcD4mIF9fZ2EpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3NpemUgPT0gX19nYS5fTV9pbmRleC5zaXplKCkpOworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19nYS5fTV9hcnJheSwgX0FycmF5PHNpemVfdD4oX19nYS5fTV9pbmRleCksCisJCQkgICBfQXJyYXk8X1RwPihfTV9kYXRhKSwgX01fc2l6ZSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPiYKKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgbWFza19hcnJheTxfVHA+JiBfX21hKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9zaXplID09IF9fbWEuX01fc3opOworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19tYS5fTV9hcnJheSwgX19tYS5fTV9tYXNrLAorCQkJICAgX0FycmF5PF9UcD4oX01fZGF0YSksIF9NX3NpemUpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IGluZGlyZWN0X2FycmF5PF9UcD4mIF9faWEpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3NpemUgPT0gX19pYS5fTV9zeik7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2lhLl9NX2FycmF5LCBfX2lhLl9NX2luZGV4LAorCQkJICAgX0FycmF5PF9UcD4oX01fZGF0YSksIF9NX3NpemUpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSkKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA2MzAuIGFycmF5cyBvZiB2YWxhcnJheS4KKyAgICAgIGlmIChfTV9zaXplID09IF9fZS5zaXplKCkpCisJc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19lLCBfTV9zaXplLCBfQXJyYXk8X1RwPihfTV9kYXRhKSk7CisgICAgICBlbHNlCisJeworCSAgaWYgKF9NX2RhdGEpCisJICAgIHsKKwkgICAgICBzdGQ6Ol9fdmFsYXJyYXlfZGVzdHJveV9lbGVtZW50cyhfTV9kYXRhLCBfTV9kYXRhICsgX01fc2l6ZSk7CisJICAgICAgc3RkOjpfX3ZhbGFycmF5X3JlbGVhc2VfbWVtb3J5KF9NX2RhdGEpOworCSAgICB9CisJICBfTV9zaXplID0gX19lLnNpemUoKTsKKwkgIF9NX2RhdGEgPSBfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX01fc2l6ZSk7CisJICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX19lLCBfTV9zaXplLCBfQXJyYXk8X1RwPihfTV9kYXRhKSk7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9FeHByPF9TQ2xvczxfVmFsQXJyYXksX1RwPiwgX1RwPgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oc2xpY2UgX19zKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgX1NDbG9zPF9WYWxBcnJheSxfVHA+IF9DbG9zdXJlOworICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVHA+KF9DbG9zdXJlIChfQXJyYXk8X1RwPihfTV9kYXRhKSwgX19zKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc2xpY2VfYXJyYXk8X1RwPgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oc2xpY2UgX19zKQorICAgIHsgcmV0dXJuIHNsaWNlX2FycmF5PF9UcD4oX0FycmF5PF9UcD4oX01fZGF0YSksIF9fcyk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9FeHByPF9HQ2xvczxfVmFsQXJyYXksX1RwPiwgX1RwPgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgZ3NsaWNlJiBfX2dzKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dDbG9zPF9WYWxBcnJheSxfVHA+IF9DbG9zdXJlOworICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVHA+CisJKF9DbG9zdXJlKF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfX2dzLl9NX2luZGV4LT5fTV9pbmRleCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGdzbGljZV9hcnJheTxfVHA+CisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCBnc2xpY2UmIF9fZ3MpCisgICAgeworICAgICAgcmV0dXJuIGdzbGljZV9hcnJheTxfVHA+CisJKF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfX2dzLl9NX2luZGV4LT5fTV9pbmRleCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgdmFsYXJyYXk8Ym9vbD4mIF9fbSkgY29uc3QKKyAgICB7CisgICAgICBzaXplX3QgX19zID0gMDsKKyAgICAgIHNpemVfdCBfX2UgPSBfX20uc2l6ZSgpOworICAgICAgZm9yIChzaXplX3QgX19pPTA7IF9faTxfX2U7ICsrX19pKQorCWlmIChfX21bX19pXSkgKytfX3M7CisgICAgICByZXR1cm4gdmFsYXJyYXk8X1RwPihtYXNrX2FycmF5PF9UcD4oX0FycmF5PF9UcD4oX01fZGF0YSksIF9fcywKKwkJCQkJICAgX0FycmF5PGJvb2w+IChfX20pKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgbWFza19hcnJheTxfVHA+CisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxib29sPiYgX19tKQorICAgIHsKKyAgICAgIHNpemVfdCBfX3MgPSAwOworICAgICAgc2l6ZV90IF9fZSA9IF9fbS5zaXplKCk7CisgICAgICBmb3IgKHNpemVfdCBfX2k9MDsgX19pPF9fZTsgKytfX2kpCisJaWYgKF9fbVtfX2ldKSArK19fczsKKyAgICAgIHJldHVybiBtYXNrX2FycmF5PF9UcD4oX0FycmF5PF9UcD4oX01fZGF0YSksIF9fcywgX0FycmF5PGJvb2w+KF9fbSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9FeHByPF9JQ2xvczxfVmFsQXJyYXksX1RwPiwgX1RwPgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19pKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgX0lDbG9zPF9WYWxBcnJheSxfVHA+IF9DbG9zdXJlOworICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVHA+KF9DbG9zdXJlKCp0aGlzLCBfX2kpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBpbmRpcmVjdF9hcnJheTxfVHA+CisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2kpCisgICAgeworICAgICAgcmV0dXJuIGluZGlyZWN0X2FycmF5PF9UcD4oX0FycmF5PF9UcD4oX01fZGF0YSksIF9faS5zaXplKCksCisJCQkJIF9BcnJheTxzaXplX3Q+KF9faSkpOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgdmFsYXJyYXk8X1RwPjo6c3dhcCh2YWxhcnJheTxfVHA+JiBfX3YpIG5vZXhjZXB0CisgICAgeworICAgICAgc3RkOjpzd2FwKF9NX3NpemUsIF9fdi5fTV9zaXplKTsKKyAgICAgIHN0ZDo6c3dhcChfTV9kYXRhLCBfX3YuX01fZGF0YSk7CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGlubGluZSBzaXplX3QgCisgICAgdmFsYXJyYXk8X1RwPjo6c2l6ZSgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fc2l6ZTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgdmFsYXJyYXk8X1RwPjo6c3VtKCkgY29uc3QKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fc2l6ZSA+IDApOworICAgICAgcmV0dXJuIHN0ZDo6X192YWxhcnJheV9zdW0oX01fZGF0YSwgX01fZGF0YSArIF9NX3NpemUpOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgIGlubGluZSB2YWxhcnJheTxfVHA+CisgICAgIHZhbGFycmF5PF9UcD46OnNoaWZ0KGludCBfX24pIGNvbnN0CisgICAgIHsKKyAgICAgICB2YWxhcnJheTxfVHA+IF9fcmV0OworCisgICAgICAgaWYgKF9NX3NpemUgPT0gMCkKKwkgcmV0dXJuIF9fcmV0OworCisgICAgICAgX1RwKiBfX3Jlc3RyaWN0X18gX190bXBfTV9kYXRhID0KKwkgc3RkOjpfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX01fc2l6ZSk7CisKKyAgICAgICBpZiAoX19uID09IDApCisJIHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfTV9kYXRhLAorCQkJCQlfTV9kYXRhICsgX01fc2l6ZSwgX190bXBfTV9kYXRhKTsKKyAgICAgICBlbHNlIGlmIChfX24gPiAwKSAgICAgIC8vIHNoaWZ0IGxlZnQKKwkgeworCSAgIGlmIChzaXplX3QoX19uKSA+IF9NX3NpemUpCisJICAgICBfX24gPSBpbnQoX01fc2l6ZSk7CisKKwkgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX01fZGF0YSArIF9fbiwKKwkJCQkJICBfTV9kYXRhICsgX01fc2l6ZSwgX190bXBfTV9kYXRhKTsKKwkgICBzdGQ6Ol9fdmFsYXJyYXlfZGVmYXVsdF9jb25zdHJ1Y3QoX190bXBfTV9kYXRhICsgX01fc2l6ZSAtIF9fbiwKKwkJCQkJICAgICBfX3RtcF9NX2RhdGEgKyBfTV9zaXplKTsKKwkgfQorICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgLy8gc2hpZnQgcmlnaHQKKwkgeworCSAgIGlmICgtc2l6ZV90KF9fbikgPiBfTV9zaXplKQorCSAgICAgX19uID0gLWludChfTV9zaXplKTsKKworCSAgIHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfTV9kYXRhLCBfTV9kYXRhICsgX01fc2l6ZSArIF9fbiwKKwkJCQkJICBfX3RtcF9NX2RhdGEgLSBfX24pOworCSAgIHN0ZDo6X192YWxhcnJheV9kZWZhdWx0X2NvbnN0cnVjdChfX3RtcF9NX2RhdGEsCisJCQkJCSAgICAgX190bXBfTV9kYXRhIC0gX19uKTsKKwkgfQorCisgICAgICAgX19yZXQuX01fc2l6ZSA9IF9NX3NpemU7CisgICAgICAgX19yZXQuX01fZGF0YSA9IF9fdG1wX01fZGF0YTsKKyAgICAgICByZXR1cm4gX19yZXQ7CisgICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgIGlubGluZSB2YWxhcnJheTxfVHA+CisgICAgIHZhbGFycmF5PF9UcD46OmNzaGlmdChpbnQgX19uKSBjb25zdAorICAgICB7CisgICAgICAgdmFsYXJyYXk8X1RwPiBfX3JldDsKKworICAgICAgIGlmIChfTV9zaXplID09IDApCisJIHJldHVybiBfX3JldDsKKworICAgICAgIF9UcCogX19yZXN0cmljdF9fIF9fdG1wX01fZGF0YSA9CisJIHN0ZDo6X192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9NX3NpemUpOworCisgICAgICAgaWYgKF9fbiA9PSAwKQorCSBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX01fZGF0YSwKKwkJCQkJX01fZGF0YSArIF9NX3NpemUsIF9fdG1wX01fZGF0YSk7CisgICAgICAgZWxzZSBpZiAoX19uID4gMCkgICAgICAvLyBjc2hpZnQgbGVmdAorCSB7CisJICAgaWYgKHNpemVfdChfX24pID4gX01fc2l6ZSkKKwkgICAgIF9fbiA9IGludChfX24gJSBfTV9zaXplKTsKKworCSAgIHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfTV9kYXRhLCBfTV9kYXRhICsgX19uLAorCQkJCQkgIF9fdG1wX01fZGF0YSArIF9NX3NpemUgLSBfX24pOworCSAgIHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfTV9kYXRhICsgX19uLCBfTV9kYXRhICsgX01fc2l6ZSwKKwkJCQkJICBfX3RtcF9NX2RhdGEpOworCSB9CisgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAvLyBjc2hpZnQgcmlnaHQKKwkgeworCSAgIGlmICgtc2l6ZV90KF9fbikgPiBfTV9zaXplKQorCSAgICAgX19uID0gLWludCgtc2l6ZV90KF9fbikgJSBfTV9zaXplKTsKKworCSAgIHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfTV9kYXRhICsgX01fc2l6ZSArIF9fbiwKKwkJCQkJICBfTV9kYXRhICsgX01fc2l6ZSwgX190bXBfTV9kYXRhKTsKKwkgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX01fZGF0YSwgX01fZGF0YSArIF9NX3NpemUgKyBfX24sCisJCQkJCSAgX190bXBfTV9kYXRhIC0gX19uKTsKKwkgfQorCisgICAgICAgX19yZXQuX01fc2l6ZSA9IF9NX3NpemU7CisgICAgICAgX19yZXQuX01fZGF0YSA9IF9fdG1wX01fZGF0YTsKKyAgICAgICByZXR1cm4gX19yZXQ7CisgICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICB2YWxhcnJheTxfVHA+OjpyZXNpemUoc2l6ZV90IF9fbiwgX1RwIF9fYykKKyAgICB7CisgICAgICAvLyBUaGlzIGNvbXBsaWNhdGlvbiBpcyBzbyB0byBtYWtlIHZhbGFycmF5PHZhbGFycmF5PFQ+ID4gd29yaworICAgICAgLy8gZXZlbiB0aG91Z2ggaXQgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZC4gIE5vYm9keSBzaG91bGQKKyAgICAgIC8vIGJlIHNheWluZyB2YWxhcnJheTx2YWxhcnJheTxUPiA+IGFueXdheS4gIFNlZSB0aGUgc3BlY3MuCisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfZGVzdHJveV9lbGVtZW50cyhfTV9kYXRhLCBfTV9kYXRhICsgX01fc2l6ZSk7CisgICAgICBpZiAoX01fc2l6ZSAhPSBfX24pCisJeworCSAgc3RkOjpfX3ZhbGFycmF5X3JlbGVhc2VfbWVtb3J5KF9NX2RhdGEpOworCSAgX01fc2l6ZSA9IF9fbjsKKwkgIF9NX2RhdGEgPSBfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX19uKTsKKwl9CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfZmlsbF9jb25zdHJ1Y3QoX01fZGF0YSwgX01fZGF0YSArIF9fbiwgX19jKTsKKyAgICB9CisgICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgdmFsYXJyYXk8X1RwPjo6bWluKCkgY29uc3QKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fc2l6ZSA+IDApOworICAgICAgcmV0dXJuICpzdGQ6Om1pbl9lbGVtZW50KF9NX2RhdGEsIF9NX2RhdGEgKyBfTV9zaXplKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICB2YWxhcnJheTxfVHA+OjptYXgoKSBjb25zdAorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9zaXplID4gMCk7CisgICAgICByZXR1cm4gKnN0ZDo6bWF4X2VsZW1lbnQoX01fZGF0YSwgX01fZGF0YSArIF9NX3NpemUpOworICAgIH0KKyAgCisgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICBpbmxpbmUgX0V4cHI8X1ZhbEZ1bkNsb3M8X1ZhbEFycmF5LCBfVHA+LCBfVHA+CisgICAgdmFsYXJyYXk8X1RwPjo6YXBwbHkoX1RwIGZ1bmMoX1RwKSkgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIF9WYWxGdW5DbG9zPF9WYWxBcnJheSwgX1RwPiBfQ2xvc3VyZTsKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZSgqdGhpcywgZnVuYykpOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgaW5saW5lIF9FeHByPF9SZWZGdW5DbG9zPF9WYWxBcnJheSwgX1RwPiwgX1RwPgorICAgIHZhbGFycmF5PF9UcD46OmFwcGx5KF9UcCBmdW5jKGNvbnN0IF9UcCAmKSkgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIF9SZWZGdW5DbG9zPF9WYWxBcnJheSwgX1RwPiBfQ2xvc3VyZTsKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZSgqdGhpcywgZnVuYykpOworICAgIH0KKworI2RlZmluZSBfREVGSU5FX1ZBTEFSUkFZX1VOQVJZX09QRVJBVE9SKF9PcCwgX05hbWUpICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIGlubGluZSB0eXBlbmFtZSB2YWxhcnJheTxfVHA+Ojp0ZW1wbGF0ZSBfVW5hcnlPcDxfTmFtZT46Ol9SdCAgICAgIAlcCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3IgX09wKCkgY29uc3QJCQkJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgdHlwZWRlZiBfVW5DbG9zPF9OYW1lLCBfVmFsQXJyYXksIF9UcD4gX0Nsb3N1cmU7CSAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCBfVHA+OjpyZXN1bHRfdHlwZSBfUnQ7ICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9SdD4oX0Nsb3N1cmUoKnRoaXMpKTsJCQlcCisgICAgfQorCisgICAgX0RFRklORV9WQUxBUlJBWV9VTkFSWV9PUEVSQVRPUigrLCBfX3VuYXJ5X3BsdXMpCisgICAgX0RFRklORV9WQUxBUlJBWV9VTkFSWV9PUEVSQVRPUigtLCBfX25lZ2F0ZSkKKyAgICBfREVGSU5FX1ZBTEFSUkFZX1VOQVJZX09QRVJBVE9SKH4sIF9fYml0d2lzZV9ub3QpCisgICAgX0RFRklORV9WQUxBUlJBWV9VTkFSWV9PUEVSQVRPUiAoISwgX19sb2dpY2FsX25vdCkKKworI3VuZGVmIF9ERUZJTkVfVkFMQVJSQVlfVU5BUllfT1BFUkFUT1IKKworI2RlZmluZSBfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UKF9PcCwgX05hbWUpICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CQkJCQkJCVwKKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPiYJCQkJCQlcCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3IgX09wIyM9KGNvbnN0IF9UcCAmX190KQkJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfTV9zaXplLCBfX3QpOwlcCisgICAgICByZXR1cm4gKnRoaXM7CQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CQkJCQkJCVwKKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPiYJCQkJCQlcCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3IgX09wIyM9KGNvbnN0IHZhbGFycmF5PF9UcD4gJl9fdikJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3NpemUgPT0gX192Ll9NX3NpemUpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfTV9zaXplLCAJCVwKKwkJCSAgICAgICBfQXJyYXk8X1RwPihfX3YuX01fZGF0YSkpOwkJXAorICAgICAgcmV0dXJuICp0aGlzOwkJCQkJCQlcCisgICAgfQorCitfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UKCssIF9fcGx1cykKK19ERUZJTkVfVkFMQVJSQVlfQVVHTUVOVEVEX0FTU0lHTk1FTlQoLSwgX19taW51cykKK19ERUZJTkVfVkFMQVJSQVlfQVVHTUVOVEVEX0FTU0lHTk1FTlQoKiwgX19tdWx0aXBsaWVzKQorX0RFRklORV9WQUxBUlJBWV9BVUdNRU5URURfQVNTSUdOTUVOVCgvLCBfX2RpdmlkZXMpCitfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UKCUsIF9fbW9kdWx1cykKK19ERUZJTkVfVkFMQVJSQVlfQVVHTUVOVEVEX0FTU0lHTk1FTlQoXiwgX19iaXR3aXNlX3hvcikKK19ERUZJTkVfVkFMQVJSQVlfQVVHTUVOVEVEX0FTU0lHTk1FTlQoJiwgX19iaXR3aXNlX2FuZCkKK19ERUZJTkVfVkFMQVJSQVlfQVVHTUVOVEVEX0FTU0lHTk1FTlQofCwgX19iaXR3aXNlX29yKQorX0RFRklORV9WQUxBUlJBWV9BVUdNRU5URURfQVNTSUdOTUVOVCg8PCwgX19zaGlmdF9sZWZ0KQorX0RFRklORV9WQUxBUlJBWV9BVUdNRU5URURfQVNTSUdOTUVOVCg+PiwgX19zaGlmdF9yaWdodCkKKworI3VuZGVmIF9ERUZJTkVfVkFMQVJSQVlfQVVHTUVOVEVEX0FTU0lHTk1FTlQKKworI2RlZmluZSBfREVGSU5FX1ZBTEFSUkFZX0VYUFJfQVVHTUVOVEVEX0FTU0lHTk1FTlQoX09wLCBfTmFtZSkgICAgICAgICAgXAorICB0ZW1wbGF0ZTxjbGFzcyBfVHA+IHRlbXBsYXRlPGNsYXNzIF9Eb20+CQkJCVwKKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPiYJCQkJCQlcCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3IgX09wIyM9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSkJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfX2UsIF9NX3NpemUpOwlcCisgICAgICByZXR1cm4gKnRoaXM7CQkJCQkJCVwKKyAgICB9CisKK19ERUZJTkVfVkFMQVJSQVlfRVhQUl9BVUdNRU5URURfQVNTSUdOTUVOVCgrLCBfX3BsdXMpCitfREVGSU5FX1ZBTEFSUkFZX0VYUFJfQVVHTUVOVEVEX0FTU0lHTk1FTlQoLSwgX19taW51cykKK19ERUZJTkVfVkFMQVJSQVlfRVhQUl9BVUdNRU5URURfQVNTSUdOTUVOVCgqLCBfX211bHRpcGxpZXMpCitfREVGSU5FX1ZBTEFSUkFZX0VYUFJfQVVHTUVOVEVEX0FTU0lHTk1FTlQoLywgX19kaXZpZGVzKQorX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UKCUsIF9fbW9kdWx1cykKK19ERUZJTkVfVkFMQVJSQVlfRVhQUl9BVUdNRU5URURfQVNTSUdOTUVOVCheLCBfX2JpdHdpc2VfeG9yKQorX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UKCYsIF9fYml0d2lzZV9hbmQpCitfREVGSU5FX1ZBTEFSUkFZX0VYUFJfQVVHTUVOVEVEX0FTU0lHTk1FTlQofCwgX19iaXR3aXNlX29yKQorX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UKDw8LCBfX3NoaWZ0X2xlZnQpCitfREVGSU5FX1ZBTEFSUkFZX0VYUFJfQVVHTUVOVEVEX0FTU0lHTk1FTlQoPj4sIF9fc2hpZnRfcmlnaHQpCisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX0VYUFJfQVVHTUVOVEVEX0FTU0lHTk1FTlQKKyAgICAKKworI2RlZmluZSBfREVGSU5FX0JJTkFSWV9PUEVSQVRPUihfT3AsIF9OYW1lKQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCQkJCQlcCisgICAgaW5saW5lIF9FeHByPF9CaW5DbG9zPF9OYW1lLCBfVmFsQXJyYXksIF9WYWxBcnJheSwgX1RwLCBfVHA+LCAgICAgICBcCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCBfVHA+OjpyZXN1bHRfdHlwZT4gICAgICAgICAgICAgICBcCisgICAgb3BlcmF0b3IgX09wKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdiwgY29uc3QgdmFsYXJyYXk8X1RwPiYgX193KQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfX3Yuc2l6ZSgpID09IF9fdy5zaXplKCkpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgX0JpbkNsb3M8X05hbWUsIF9WYWxBcnJheSwgX1ZhbEFycmF5LCBfVHAsIF9UcD4gX0Nsb3N1cmU7IFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19mdW48X05hbWUsIF9UcD46OnJlc3VsdF90eXBlIF9SdDsgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1J0PihfQ2xvc3VyZShfX3YsIF9fdykpOyAgICAgICAgICAgICAgICAgIFwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfTmFtZSwgX1ZhbEFycmF5LF9Db25zdGFudCwgX1RwLCBfVHA+LCAgICAgICAgXAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX1RwPjo6cmVzdWx0X3R5cGU+ICAgICAgICAgICAgICAgXAorICAgIG9wZXJhdG9yIF9PcChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YsIGNvbnN0IF9UcCYgX190KQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9OYW1lLCBfVmFsQXJyYXksIF9Db25zdGFudCwgX1RwLCBfVHA+IF9DbG9zdXJlOwlcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCBfVHA+OjpyZXN1bHRfdHlwZSBfUnQ7ICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9SdD4oX0Nsb3N1cmUoX192LCBfX3QpKTsJICAgICAgICAgICAgICAgIFwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfTmFtZSwgX0NvbnN0YW50LCBfVmFsQXJyYXksIF9UcCwgX1RwPiwgICAgICAgXAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX1RwPjo6cmVzdWx0X3R5cGU+ICAgICAgICAgICAgICAgXAorICAgIG9wZXJhdG9yIF9PcChjb25zdCBfVHAmIF9fdCwgY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9OYW1lLCBfQ29uc3RhbnQsIF9WYWxBcnJheSwgX1RwLCBfVHA+IF9DbG9zdXJlOyBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCBfVHA+OjpyZXN1bHRfdHlwZSBfUnQ7ICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9SdD4oX0Nsb3N1cmUoX190LCBfX3YpKTsgICAgICAgIAkgICAgICAgIFwKKyAgICB9CisKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKCssIF9fcGx1cykKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKC0sIF9fbWludXMpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUigqLCBfX211bHRpcGxpZXMpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUigvLCBfX2RpdmlkZXMpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUiglLCBfX21vZHVsdXMpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUiheLCBfX2JpdHdpc2VfeG9yKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoJiwgX19iaXR3aXNlX2FuZCkKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKHwsIF9fYml0d2lzZV9vcikKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKDw8LCBfX3NoaWZ0X2xlZnQpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUig+PiwgX19zaGlmdF9yaWdodCkKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKCYmLCBfX2xvZ2ljYWxfYW5kKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IofHwsIF9fbG9naWNhbF9vcikKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKD09LCBfX2VxdWFsX3RvKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoIT0sIF9fbm90X2VxdWFsX3RvKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoPCwgX19sZXNzKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoPiwgX19ncmVhdGVyKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoPD0sIF9fbGVzc19lcXVhbCkKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKD49LCBfX2dyZWF0ZXJfZXF1YWwpCisKKyN1bmRlZiBfREVGSU5FX0JJTkFSWV9PUEVSQVRPUgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSB2YWxhcnJheS4KKyAgICogIEBwYXJhbSAgX192YSAgdmFsYXJyYXkuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgaW5saW5lIF9UcCoKKyAgICBiZWdpbih2YWxhcnJheTxfVHA+JiBfX3ZhKQorICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX192YVswXSk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSBjb25zdCB2YWxhcnJheS4KKyAgICogIEBwYXJhbSAgX192YSAgdmFsYXJyYXkuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgaW5saW5lIGNvbnN0IF9UcCoKKyAgICBiZWdpbihjb25zdCB2YWxhcnJheTxfVHA+JiBfX3ZhKQorICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX192YVswXSk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQgb2YKKyAgICogICAgICAgICAgdGhlIHZhbGFycmF5LgorICAgKiAgQHBhcmFtICBfX3ZhICB2YWxhcnJheS4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICBpbmxpbmUgX1RwKgorICAgIGVuZCh2YWxhcnJheTxfVHA+JiBfX3ZhKQorICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX192YVswXSkgKyBfX3ZhLnNpemUoKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudCBvZgorICAgKiAgICAgICAgICB0aGUgY29uc3QgdmFsYXJyYXkuCisgICAqICBAcGFyYW0gIF9fdmEgIHZhbGFycmF5LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGlubGluZSBjb25zdCBfVHAqCisgICAgZW5kKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdmEpCisgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3ZhWzBdKSArIF9fdmEuc2l6ZSgpOyB9CisjZW5kaWYgLy8gQysrMTEKKworICAvLyBAfSBncm91cCBudW1lcmljX2FycmF5cworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9WQUxBUlJBWSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC92ZWN0b3IgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3ZlY3RvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDFjNWU3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC92ZWN0b3IKQEAgLTAsMCArMSw4MSBAQAorLy8gPHZlY3Rvcj4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyBkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgaW5jbHVkZS92ZWN0b3IKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVkVDVE9SCisjZGVmaW5lIF9HTElCQ1hYX1ZFQ1RPUiAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9jb25zdHJ1Y3QuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF91bmluaXRpYWxpemVkLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfdmVjdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfYnZlY3Rvci5oPiAKKyNpbmNsdWRlIDxiaXRzL3JhbmdlX2FjY2Vzcy5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0VYUE9SVF9URU1QTEFURQorIyBpbmNsdWRlIDxiaXRzL3ZlY3Rvci50Y2M+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGluY2x1ZGUgPGRlYnVnL3ZlY3Rvcj4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfUFJPRklMRQorIyBpbmNsdWRlIDxwcm9maWxlL3ZlY3Rvcj4KKyNlbmRpZgorCisjZW5kaWYgLyogX0dMSUJDWFhfVkVDVE9SICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYXRvbWljX3dvcmQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYXRvbWljX3dvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjgzN2Y0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9hdG9taWNfd29yZC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vIExvdy1sZXZlbCB0eXBlIGZvciBhdG9taWMgb3BlcmF0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYXRvbWljX3dvcmQuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQVRPTUlDX1dPUkRfSAorI2RlZmluZSBfR0xJQkNYWF9BVE9NSUNfV09SRF9ICTEKKwordHlwZWRlZiBpbnQgX0F0b21pY193b3JkOworCisvLyBEZWZpbmUgdGhlc2UgdHdvIG1hY3JvcyB1c2luZyB0aGUgYXBwcm9wcmlhdGUgbWVtb3J5IGJhcnJpZXIgZm9yIHRoZSB0YXJnZXQuCisvLyBUaGUgY29tbWVudGVkIG91dCB2ZXJzaW9ucyBiZWxvdyBhcmUgdGhlIGRlZmF1bHRzLgorLy8gU2VlIGlhNjQvYXRvbWljX3dvcmQuaCBmb3IgYW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2guCisKKy8vIFRoaXMgb25lIHByZXZlbnRzIGxvYWRzIGZyb20gYmVpbmcgaG9pc3RlZCBhY3Jvc3MgdGhlIGJhcnJpZXI7CisvLyBpbiBvdGhlciB3b3JkcywgdGhpcyBpcyBhIExvYWQtTG9hZCBhY3F1aXJlIGJhcnJpZXIuCisvLyBUaGlzIGlzIG5lY2Vzc2FyeSBpZmYgVEFSR0VUX1JFTEFYRURfT1JERVJJTkcgaXMgZGVmaW5lZCBpbiB0bS5oLiAgCisvLyAjZGVmaW5lIF9HTElCQ1hYX1JFQURfTUVNX0JBUlJJRVIgX19hc20gX192b2xhdGlsZSAoIiI6OjoibWVtb3J5IikKKworLy8gVGhpcyBvbmUgcHJldmVudHMgc3RvcmVzIGZyb20gYmVpbmcgc3VuayBhY3Jvc3MgdGhlIGJhcnJpZXI7IGluIG90aGVyCisvLyB3b3JkcywgYSBTdG9yZS1TdG9yZSByZWxlYXNlIGJhcnJpZXIuCisvLyAjZGVmaW5lIF9HTElCQ1hYX1dSSVRFX01FTV9CQVJSSUVSIF9fYXNtIF9fdm9sYXRpbGUgKCIiOjo6Im1lbW9yeSIpCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYmFzaWNfZmlsZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9iYXNpY19maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlOGM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYmFzaWNfZmlsZS5oCkBAIC0wLDAgKzEsMTEwIEBACisvLyBXcmFwcGVyIG9mIEMtbGFuZ3VhZ2UgRklMRSBzdHJ1Y3QgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjggIEZpbGUtYmFzZWQgc3RyZWFtcworLy8KKworLyoqIEBmaWxlIGJpdHMvYmFzaWNfZmlsZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQkFTSUNfRklMRV9TVERJT19ICisjZGVmaW5lIF9HTElCQ1hYX0JBU0lDX0ZJTEVfU1RESU9fSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9jKytpby5oPiAgLy8gZm9yIF9fY19sb2NrIGFuZCBfX2NfZmlsZQorI2luY2x1ZGUgPGlvcz4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEdlbmVyaWMgZGVjbGFyYXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBfX2Jhc2ljX2ZpbGU7IAorCisgIC8vIFNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgX19iYXNpY19maWxlPGNoYXI+CisgICAgeworICAgICAgLy8gVW5kZXJseWluZyBkYXRhIHNvdXJjZS9zaW5rLgorICAgICAgX19jX2ZpbGUqIAlfTV9jZmlsZTsKKworICAgICAgLy8gVHJ1ZSBpZmYgd2Ugb3BlbmVkIF9NX2NmaWxlLCBhbmQgdGh1cyBtdXN0IGNsb3NlIGl0IG91cnNlbHZlcy4KKyAgICAgIGJvb2wgCQlfTV9jZmlsZV9jcmVhdGVkOworCisgICAgcHVibGljOgorICAgICAgX19iYXNpY19maWxlKF9fY19sb2NrKiBfX2xvY2sgPSAwKSB0aHJvdyAoKTsKKworICAgICAgX19iYXNpY19maWxlKiAKKyAgICAgIG9wZW4oY29uc3QgY2hhciogX19uYW1lLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlLCBpbnQgX19wcm90ID0gMDY2NCk7CisKKyAgICAgIF9fYmFzaWNfZmlsZSoKKyAgICAgIHN5c19vcGVuKF9fY19maWxlKiBfX2ZpbGUsIGlvc19iYXNlOjpvcGVubW9kZSk7CisKKyAgICAgIF9fYmFzaWNfZmlsZSoKKyAgICAgIHN5c19vcGVuKGludCBfX2ZkLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKSB0aHJvdyAoKTsKKworICAgICAgX19iYXNpY19maWxlKiAKKyAgICAgIGNsb3NlKCk7IAorCisgICAgICBfR0xJQkNYWF9QVVJFIGJvb2wgCisgICAgICBpc19vcGVuKCkgY29uc3QgdGhyb3cgKCk7CisKKyAgICAgIF9HTElCQ1hYX1BVUkUgaW50IAorICAgICAgZmQoKSB0aHJvdyAoKTsKKworICAgICAgX0dMSUJDWFhfUFVSRSBfX2NfZmlsZSoKKyAgICAgIGZpbGUoKSB0aHJvdyAoKTsKKworICAgICAgfl9fYmFzaWNfZmlsZSgpOworCisgICAgICBzdHJlYW1zaXplIAorICAgICAgeHNwdXRuKGNvbnN0IGNoYXIqIF9fcywgc3RyZWFtc2l6ZSBfX24pOworCisgICAgICBzdHJlYW1zaXplIAorICAgICAgeHNwdXRuXzIoY29uc3QgY2hhciogX19zMSwgc3RyZWFtc2l6ZSBfX24xLAorCSAgICAgICBjb25zdCBjaGFyKiBfX3MyLCBzdHJlYW1zaXplIF9fbjIpOworCisgICAgICBzdHJlYW1zaXplIAorICAgICAgeHNnZXRuKGNoYXIqIF9fcywgc3RyZWFtc2l6ZSBfX24pOworCisgICAgICBzdHJlYW1vZmYKKyAgICAgIHNlZWtvZmYoc3RyZWFtb2ZmIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX3dheSkgdGhyb3cgKCk7CisKKyAgICAgIGludCAKKyAgICAgIHN5bmMoKTsKKworICAgICAgc3RyZWFtc2l6ZQorICAgICAgc2hvd21hbnljKCk7CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYJCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2MrK2FsbG9jYXRvci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jKythbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDcwYmNjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jKythbGxvY2F0b3IuaApAQCAtMCwwICsxLDU1IEBACisvLyBCYXNlIHRvIHN0ZDo6YWxsb2NhdG9yIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2MrK2FsbG9jYXRvci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWVtb3J5fQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1hYX0FMTE9DQVRPUl9ICisjZGVmaW5lIF9HTElCQ1hYX0NYWF9BTExPQ0FUT1JfSCAxCisKKyNpbmNsdWRlIDxleHQvbmV3X2FsbG9jYXRvci5oPgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorbmFtZXNwYWNlIHN0ZAoreworICAvKioKKyAgICogIEBicmllZiAgQW4gYWxpYXMgdG8gdGhlIGJhc2UgY2xhc3MgZm9yIHN0ZDo6YWxsb2NhdG9yLgorICAgKiAgQGluZ3JvdXAgYWxsb2NhdG9ycworICAgKgorICAgKiAgVXNlZCB0byBzZXQgdGhlIHN0ZDo6YWxsb2NhdG9yIGJhc2UgY2xhc3MgdG8KKyAgICogIF9fZ251X2N4eDo6bmV3X2FsbG9jYXRvci4KKyAgICoKKyAgICogIEB0cGFyYW0gIF9UcCAgVHlwZSBvZiBhbGxvY2F0ZWQgb2JqZWN0LgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB1c2luZyBfX2FsbG9jYXRvcl9iYXNlID0gX19nbnVfY3h4OjpuZXdfYWxsb2NhdG9yPF9UcD47Cit9CisjZWxzZQorLy8gRGVmaW5lIG5ld19hbGxvY2F0b3IgYXMgdGhlIGJhc2UgY2xhc3MgdG8gc3RkOjphbGxvY2F0b3IuCisjIGRlZmluZSBfX2FsbG9jYXRvcl9iYXNlICBfX2dudV9jeHg6Om5ld19hbGxvY2F0b3IKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYysrY29uZmlnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2MrK2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZDEyYWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2MrK2NvbmZpZy5oCkBAIC0wLDAgKzEsMTY2NiBAQAorLy8gUHJlZGVmaW5lZCBzeW1ib2xzIGFuZCBtYWNyb3MgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvYysrY29uZmlnLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3Nmd2R9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9DWFhfQ09ORklHX0gKKyNkZWZpbmUgX0dMSUJDWFhfQ1hYX0NPTkZJR19IIDEKKworLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgQysrIGxpYnJhcnkgaW4gY29tcHJlc3NlZCBJU08gZGF0ZSBmb3JtYXQuCisjZGVmaW5lIF9fR0xJQkNYWF9fIDIwMTQwNTIyCisKKy8vIE1hY3JvcyBmb3IgdmFyaW91cyBhdHRyaWJ1dGVzLgorLy8gICBfR0xJQkNYWF9QVVJFCisvLyAgIF9HTElCQ1hYX0NPTlNUCisvLyAgIF9HTElCQ1hYX05PUkVUVVJOCisvLyAgIF9HTElCQ1hYX05PVEhST1cKKy8vICAgX0dMSUJDWFhfVklTSUJJTElUWQorI2lmbmRlZiBfR0xJQkNYWF9QVVJFCisjIGRlZmluZSBfR0xJQkNYWF9QVVJFIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9DT05TVAorIyBkZWZpbmUgX0dMSUJDWFhfQ09OU1QgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9OT1JFVFVSTgorIyBkZWZpbmUgX0dMSUJDWFhfTk9SRVRVUk4gX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpCisjZW5kaWYKKworLy8gU2VlIGJlbG93IGZvciBDKysKKyNpZm5kZWYgX0dMSUJDWFhfTk9USFJPVworIyBpZm5kZWYgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBfR0xJQkNYWF9OT1RIUk9XIF9fYXR0cmlidXRlX18oKF9fbm90aHJvd19fKSkKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIHZpc2liaWxpdHkgYXR0cmlidXRlcy4KKy8vICAgX0dMSUJDWFhfSEFWRV9BVFRSSUJVVEVfVklTSUJJTElUWQorLy8gICBfR0xJQkNYWF9WSVNJQklMSVRZCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FUVFJJQlVURV9WSVNJQklMSVRZIDEKKworI2lmIF9HTElCQ1hYX0hBVkVfQVRUUklCVVRFX1ZJU0lCSUxJVFkKKyMgZGVmaW5lIF9HTElCQ1hYX1ZJU0lCSUxJVFkoVikgX19hdHRyaWJ1dGVfXyAoKF9fdmlzaWJpbGl0eV9fICgjVikpKQorI2Vsc2UKKy8vIElmIHRoaXMgaXMgbm90IHN1cHBsaWVkIGJ5IHRoZSBPUy1zcGVjaWZpYyBvciBDUFUtc3BlY2lmaWMKKy8vIGhlYWRlcnMgaW5jbHVkZWQgYmVsb3csIGl0IHdpbGwgYmUgZGVmaW5lZCB0byBhbiBlbXB0eSBkZWZhdWx0LgorIyBkZWZpbmUgX0dMSUJDWFhfVklTSUJJTElUWShWKSBfR0xJQkNYWF9QU0VVRE9fVklTSUJJTElUWShWKQorI2VuZGlmCisKKy8vIE1hY3JvcyBmb3IgZGVwcmVjYXRlZCBhdHRyaWJ1dGVzLgorLy8gICBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorLy8gICBfR0xJQkNYWF9ERVBSRUNBVEVECisjaWZuZGVmIF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisjIGRlZmluZSBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRCAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19ERVBSRUNBVEVEKSAmJiAoX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0RFUFJFQ0FURUQgX19hdHRyaWJ1dGVfXyAoKF9fZGVwcmVjYXRlZF9fKSkKKyNlbHNlCisjIGRlZmluZSBfR0xJQkNYWF9ERVBSRUNBVEVECisjZW5kaWYKKworLy8gTWFjcm9zIGZvciBBQkkgdGFnIGF0dHJpYnV0ZXMuCisjaWZuZGVmIF9HTElCQ1hYX0FCSV9UQUdfQ1hYMTEKKyMgZGVmaW5lIF9HTElCQ1hYX0FCSV9UQUdfQ1hYMTEgX19hdHRyaWJ1dGUgKChfX2FiaV90YWdfXyAoImN4eDExIikpKQorI2VuZGlmCisKKworI2lmIF9fY3BsdXNwbHVzCisKKy8vIE1hY3JvIGZvciBjb25zdGV4cHIsIHRvIHN1cHBvcnQgaW4gbWl4ZWQgMDMvMHggbW9kZS4KKyNpZm5kZWYgX0dMSUJDWFhfQ09OU1RFWFBSCisjIGlmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgIGRlZmluZSBfR0xJQkNYWF9DT05TVEVYUFIgY29uc3RleHByCisjICBkZWZpbmUgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBjb25zdGV4cHIKKyMgZWxzZQorIyAgZGVmaW5lIF9HTElCQ1hYX0NPTlNURVhQUgorIyAgZGVmaW5lIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgY29uc3QKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBNYWNybyBmb3Igbm9leGNlcHQsIHRvIHN1cHBvcnQgaW4gbWl4ZWQgMDMvMHggbW9kZS4KKyNpZm5kZWYgX0dMSUJDWFhfTk9FWENFUFQKKyMgaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyAgZGVmaW5lIF9HTElCQ1hYX05PRVhDRVBUIG5vZXhjZXB0CisjICBkZWZpbmUgX0dMSUJDWFhfVVNFX05PRVhDRVBUIG5vZXhjZXB0CisjICBkZWZpbmUgX0dMSUJDWFhfVEhST1coX0VYQykKKyMgZWxzZQorIyAgZGVmaW5lIF9HTElCQ1hYX05PRVhDRVBUCisjICBkZWZpbmUgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHRocm93KCkKKyMgIGRlZmluZSBfR0xJQkNYWF9USFJPVyhfRVhDKSB0aHJvdyhfRVhDKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfTk9USFJPVworIyBkZWZpbmUgX0dMSUJDWFhfTk9USFJPVyBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX1RIUk9XX09SX0FCT1JUCisjIGlmIF9fRVhDRVBUSU9OUworIyAgZGVmaW5lIF9HTElCQ1hYX1RIUk9XX09SX0FCT1JUKF9FWEMpICh0aHJvdyAoX0VYQykpCisjIGVsc2UKKyMgIGRlZmluZSBfR0xJQkNYWF9USFJPV19PUl9BQk9SVChfRVhDKSAoX19idWlsdGluX2Fib3J0KCkpCisjIGVuZGlmCisjZW5kaWYKKworLy8gTWFjcm8gZm9yIGV4dGVybiB0ZW1wbGF0ZSwgaWUgY29udHJvbGluZyB0ZW1wbGF0ZSBsaW5rYWdlIHZpYSB1c2UKKy8vIG9mIGV4dGVybiBrZXl3b3JkIG9uIHRlbXBsYXRlIGRlY2xhcmF0aW9uLiBBcyBkb2N1bWVudGVkIGluIHRoZSBnKysKKy8vIG1hbnVhbCwgaXQgaW5oaWJpdHMgYWxsIGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGFuZCBpcyB1c2VkCisvLyB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5IHRvIGF2b2lkIG11bHRpcGxlIHdlYWsgZGVmaW5pdGlvbnMgZm9yCisvLyByZXF1aXJlZCB0eXBlcyB0aGF0IGFyZSBhbHJlYWR5IGV4cGxpY2l0bHkgaW5zdGFudGlhdGVkIGluIHRoZQorLy8gbGlicmFyeSBiaW5hcnkuIFRoaXMgc3Vic3RhbnRpYWxseSByZWR1Y2VzIHRoZSBiaW5hcnkgc2l6ZSBvZgorLy8gcmVzdWx0aW5nIGV4ZWN1dGFibGVzLgorLy8gU3BlY2lhbCBjYXNlOiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUgPT0gLTEgZGlzYWxsb3dzIGV4dGVybgorLy8gdGVtcGxhdGVzIG9ubHkgaW4gYmFzaWNfc3RyaW5nLCB0aHVzIGFjdGl2YXRpbmcgaXRzIGRlYnVnLW1vZGUKKy8vIGNoZWNrcyBldmVuIGF0IC1PMC4KKyMgZGVmaW5lIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURSAxCisKKy8qCisgIE91dGxpbmUgb2YgbGlic3RkYysrIG5hbWVzcGFjZXMuCisKKyAgbmFtZXNwYWNlIHN0ZAorICB7CisgICAgbmFtZXNwYWNlIF9fZGVidWcgeyB9CisgICAgbmFtZXNwYWNlIF9fcGFyYWxsZWwgeyB9CisgICAgbmFtZXNwYWNlIF9fcHJvZmlsZSB7IH0KKyAgICBuYW1lc3BhY2UgX19jeHgxOTk4IHsgfQorCisgICAgbmFtZXNwYWNlIF9fZGV0YWlsIHsgfQorCisgICAgbmFtZXNwYWNlIHJlbF9vcHMgeyB9CisKKyAgICBuYW1lc3BhY2UgdHIxCisgICAgeworICAgICAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycyB7IH0KKyAgICAgIG5hbWVzcGFjZSByZWdleF9jb25zdGFudHMgeyB9CisgICAgICBuYW1lc3BhY2UgX19kZXRhaWwgeyB9CisgICAgfQorCisgICAgbmFtZXNwYWNlIHRyMiB7IH0KKyAgICAKKyAgICBuYW1lc3BhY2UgZGVjaW1hbCB7IH0KKworICAgIG5hbWVzcGFjZSBjaHJvbm8geyB9CisgICAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycyB7IH0KKyAgICBuYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzIHsgfQorICAgIG5hbWVzcGFjZSB0aGlzX3RocmVhZCB7IH0KKyAgfQorCisgIG5hbWVzcGFjZSBhYmkgeyB9CisKKyAgbmFtZXNwYWNlIF9fZ251X2N4eAorICB7CisgICAgbmFtZXNwYWNlIF9fZGV0YWlsIHsgfQorICB9CisKKyAgRm9yIGZ1bGwgZGV0YWlscyBzZWU6CisgIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9sYXRlc3QtZG94eWdlbi9uYW1lc3BhY2VzLmh0bWwKKyovCituYW1lc3BhY2Ugc3RkCit7CisgIHR5cGVkZWYgX19TSVpFX1RZUEVfXyAJc2l6ZV90OworICB0eXBlZGVmIF9fUFRSRElGRl9UWVBFX18JcHRyZGlmZl90OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0eXBlZGVmIGRlY2x0eXBlKG51bGxwdHIpCW51bGxwdHJfdDsKKyNlbmRpZgorfQorCisKKy8vIERlZmluZWQgaWYgaW5saW5lIG5hbWVzcGFjZXMgYXJlIHVzZWQgZm9yIHZlcnNpb25pbmcuCisjIGRlZmluZSBfR0xJQkNYWF9JTkxJTkVfVkVSU0lPTiAwIAorCisvLyBJbmxpbmUgbmFtZXNwYWNlIGZvciBzeW1ib2wgdmVyc2lvbmluZy4KKyNpZiBfR0xJQkNYWF9JTkxJTkVfVkVSU0lPTgorCituYW1lc3BhY2Ugc3RkCit7CisgIGlubGluZSBuYW1lc3BhY2UgX183IHsgfQorCisgIG5hbWVzcGFjZSByZWxfb3BzIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKworICBuYW1lc3BhY2UgdHIxCisgIHsKKyAgICBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0KKyAgICBuYW1lc3BhY2UgcGxhY2Vob2xkZXJzIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKyAgICBuYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKyAgICBuYW1lc3BhY2UgX19kZXRhaWwgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorICB9CisKKyAgbmFtZXNwYWNlIHRyMgorICB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisKKyAgbmFtZXNwYWNlIGRlY2ltYWwgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorCisgIG5hbWVzcGFjZSBjaHJvbm8geyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorICBuYW1lc3BhY2UgcGxhY2Vob2xkZXJzIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKyAgbmFtZXNwYWNlIHJlZ2V4X2NvbnN0YW50cyB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisgIG5hbWVzcGFjZSB0aGlzX3RocmVhZCB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisKKyAgbmFtZXNwYWNlIF9fZGV0YWlsIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KK30KKworbmFtZXNwYWNlIF9fZ251X2N4eAoreworICBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0KKyAgbmFtZXNwYWNlIF9fZGV0YWlsIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KK30KKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OIG5hbWVzcGFjZSBfXzcgeworIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OIH0KKyNlbHNlCisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisjZW5kaWYKKworCisvLyBJbmxpbmUgbmFtZXNwYWNlcyBmb3Igc3BlY2lhbCBtb2RlczogZGVidWcsIHBhcmFsbGVsLCBwcm9maWxlLgorI2lmIGRlZmluZWQoX0dMSUJDWFhfREVCVUcpIHx8IGRlZmluZWQoX0dMSUJDWFhfUEFSQUxMRUwpIFwKKyAgICB8fCBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEUpCituYW1lc3BhY2Ugc3RkCit7CisgIC8vIE5vbi1pbmxpbmUgbmFtZXNwYWNlIGZvciBjb21wb25lbnRzIHJlcGxhY2VkIGJ5IGFsdGVybmF0ZXMgaW4gYWN0aXZlIG1vZGUuCisgIG5hbWVzcGFjZSBfX2N4eDE5OTgKKyAgeworI2lmIF9HTElCQ1hYX0lOTElORV9WRVJTSU9OCisgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9CisjZW5kaWYKKyAgfQorCisgIC8vIElubGluZSBuYW1lc3BhY2UgZm9yIGRlYnVnIG1vZGUuCisjIGlmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGlubGluZSBuYW1lc3BhY2UgX19kZWJ1ZyB7IH0KKyMgZW5kaWYKKworICAvLyBJbmxpbmUgbmFtZXNwYWNlcyBmb3IgcGFyYWxsZWwgbW9kZS4KKyMgaWZkZWYgX0dMSUJDWFhfUEFSQUxMRUwKKyAgaW5saW5lIG5hbWVzcGFjZSBfX3BhcmFsbGVsIHsgfQorIyBlbmRpZgorCisgIC8vIElubGluZSBuYW1lc3BhY2VzIGZvciBwcm9maWxlIG1vZGUKKyMgaWZkZWYgX0dMSUJDWFhfUFJPRklMRQorICBpbmxpbmUgbmFtZXNwYWNlIF9fcHJvZmlsZSB7IH0KKyMgZW5kaWYKK30KKworLy8gQ2hlY2sgZm9yIGludmFsaWQgdXNhZ2UgYW5kIHVuc3VwcG9ydGVkIG1peGVkLW1vZGUgdXNlLgorIyBpZiBkZWZpbmVkKF9HTElCQ1hYX0RFQlVHKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1BBUkFMTEVMKQorIyAgZXJyb3IgaWxsZWdhbCB1c2Ugb2YgbXVsdGlwbGUgaW5saW5lZCBuYW1lc3BhY2VzCisjIGVuZGlmCisjIGlmIGRlZmluZWQoX0dMSUJDWFhfUFJPRklMRSkgJiYgZGVmaW5lZChfR0xJQkNYWF9ERUJVRykKKyMgIGVycm9yIGlsbGVnYWwgdXNlIG9mIG11bHRpcGxlIGlubGluZWQgbmFtZXNwYWNlcworIyBlbmRpZgorIyBpZiBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEUpICYmIGRlZmluZWQoX0dMSUJDWFhfUEFSQUxMRUwpCisjICBlcnJvciBpbGxlZ2FsIHVzZSBvZiBtdWx0aXBsZSBpbmxpbmVkIG5hbWVzcGFjZXMKKyMgZW5kaWYKKworLy8gQ2hlY2sgZm9yIGludmFsaWQgdXNlIGR1ZSB0byBsYWNrIGZvciB3ZWFrIHN5bWJvbHMuCisjIGlmIF9fTk9fSU5MSU5FX18gJiYgIV9fR1hYX1dFQUtfXworIyAgd2FybmluZyBjdXJyZW50bHkgdXNpbmcgaW5saW5lZCBuYW1lc3BhY2UgbW9kZSB3aGljaCBtYXkgZmFpbCBcCisgICB3aXRob3V0IGlubGluaW5nIGR1ZSB0byBsYWNrIG9mIHdlYWsgc3ltYm9scworIyBlbmRpZgorI2VuZGlmCisKKy8vIE1hY3JvcyBmb3IgbmFtZXNwYWNlIHNjb3BlLiBFaXRoZXIgbmFtZXNwYWNlIHN0ZDo6IG9yIHRoZSBuYW1lCisvLyBvZiBzb21lIG5lc3RlZCBuYW1lc3BhY2Ugd2l0aGluIGl0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFjdGl2ZSBtb2RlLgorLy8gX0dMSUJDWFhfU1REX0EKKy8vIF9HTElCQ1hYX1NURF9DCisvLworLy8gTWFjcm9zIGZvciBvcGVuaW5nL2Nsb3NpbmcgY29uZGl0aW9uYWwgbmFtZXNwYWNlcy4KKy8vIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9BTEdPCisvLyBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0FMR08KKy8vIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKy8vIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCisjaWYgZGVmaW5lZChfR0xJQkNYWF9ERUJVRykgfHwgZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFKQorIyBkZWZpbmUgX0dMSUJDWFhfU1REX0MgX19jeHgxOTk4CisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSIFwKKwkgbmFtZXNwYWNlIF9HTElCQ1hYX1NURF9DIHsgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSIFwKKwkgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OIH0KKyMgdW5kZWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisjIGRlZmluZSBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUgLTEKKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfUEFSQUxMRUwKKyMgZGVmaW5lIF9HTElCQ1hYX1NURF9BIF9fY3h4MTk5OAorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0FMR08gXAorCSBuYW1lc3BhY2UgX0dMSUJDWFhfU1REX0EgeyBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPIFwKKwkgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OIH0KKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX1NURF9BCisjIGRlZmluZSBfR0xJQkNYWF9TVERfQSBzdGQKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX1NURF9DCisjIGRlZmluZSBfR0xJQkNYWF9TVERfQyBzdGQKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9BTEdPCisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQUxHTworI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPCisjIGRlZmluZSBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0FMR08KKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCisjIGRlZmluZSBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorI2VuZGlmCisKKy8vIEdMSUJDWFhfQUJJIERlcHJlY2F0ZWQKKy8vIERlZmluZSBpZiBjb21wYXRpYmlsaXR5IHNob3VsZCBiZSBwcm92aWRlZCBmb3IgLW1sb25nLWRvdWJsZS02NC4KKyN1bmRlZiBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQKKworLy8gSW5saW5lIG5hbWVzcGFjZSBmb3IgbG9uZyBkb3VibGUgMTI4IG1vZGUuCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCituYW1lc3BhY2Ugc3RkCit7CisgIGlubGluZSBuYW1lc3BhY2UgX19nbnVfY3h4X2xkYmwxMjggeyB9Cit9CisjIGRlZmluZSBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTCBfX2dudV9jeHhfbGRibDEyODo6CisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfTERCTCBuYW1lc3BhY2UgX19nbnVfY3h4X2xkYmwxMjggeworIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9MREJMIH0KKyNlbHNlCisjIGRlZmluZSBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTAorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0xEQkwKKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfTERCTAorI2VuZGlmCisKKy8vIEFzc2VydC4KKyNpZiAhZGVmaW5lZChfR0xJQkNYWF9ERUJVRykgJiYgIWRlZmluZWQoX0dMSUJDWFhfUEFSQUxMRUwpCisjIGRlZmluZSBfX2dsaWJjeHhfYXNzZXJ0KF9Db25kaXRpb24pCisjZWxzZQorbmFtZXNwYWNlIHN0ZAoreworICAvLyBBdm9pZCB0aGUgdXNlIG9mIGFzc2VydCwgYmVjYXVzZSB3ZSdyZSB0cnlpbmcgdG8ga2VlcCB0aGUgPGNhc3NlcnQ+CisgIC8vIGluY2x1ZGUgb3V0IG9mIHRoZSBtaXguCisgIGlubGluZSB2b2lkCisgIF9fcmVwbGFjZW1lbnRfYXNzZXJ0KGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSwKKwkJICAgICAgIGNvbnN0IGNoYXIqIF9fZnVuY3Rpb24sIGNvbnN0IGNoYXIqIF9fY29uZGl0aW9uKQorICB7CisgICAgX19idWlsdGluX3ByaW50ZigiJXM6JWQ6ICVzOiBBc3NlcnRpb24gJyVzJyBmYWlsZWQuXG4iLCBfX2ZpbGUsIF9fbGluZSwKKwkJICAgICBfX2Z1bmN0aW9uLCBfX2NvbmRpdGlvbik7CisgICAgX19idWlsdGluX2Fib3J0KCk7CisgIH0KK30KKyNkZWZpbmUgX19nbGliY3h4X2Fzc2VydChfQ29uZGl0aW9uKQkJCQkgICAJIFwKKyAgZG8gCQkJCQkJCQkJIFwKKyAgewkJCQkJCQkgICAgICAJCSBcCisgICAgaWYgKCEgKF9Db25kaXRpb24pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RkOjpfX3JlcGxhY2VtZW50X2Fzc2VydChfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIFwKKwkJCQkjX0NvbmRpdGlvbik7CQkJCSBcCisgIH0gd2hpbGUgKGZhbHNlKQorI2VuZGlmCisKKy8vIE1hY3JvcyBmb3IgcmFjZSBkZXRlY3RvcnMuCisvLyBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoQSkgYW5kCisvLyBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUihBKSBzaG91bGQgYmUgdXNlZCB0byBleHBsYWluCisvLyBhdG9taWMgKGxvY2stZnJlZSkgc3luY2hyb25pemF0aW9uIHRvIHJhY2UgZGV0ZWN0b3JzOgorLy8gdGhlIHJhY2UgZGV0ZWN0b3Igd2lsbCBpbmZlciBhIGhhcHBlbnMtYmVmb3JlIGFyYyBmcm9tIHRoZSBmb3JtZXIgdG8gdGhlCisvLyBsYXR0ZXIgd2hlbiB0aGV5IHNoYXJlIHRoZSBzYW1lIGFyZ3VtZW50IHBvaW50ZXIuCisvLworLy8gVGhlIG1vc3QgZnJlcXVlbnQgdXNlIGNhc2UgZm9yIHRoZXNlIG1hY3JvcyAoYW5kIHRoZSBvbmx5IGNhc2UgaW4gdGhlCisvLyBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBsaWJyYXJ5KSBpcyBhdG9taWMgcmVmZXJlbmNlIGNvdW50aW5nOgorLy8gICB2b2lkIF9NX3JlbW92ZV9yZWZlcmVuY2UoKQorLy8gICB7CisvLyAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKCZ0aGlzLT5fTV9yZWZjb3VudCk7CisvLyAgICAgaWYgKF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZ0aGlzLT5fTV9yZWZjb3VudCwgLTEpIDw9IDApCisvLyAgICAgICB7CisvLyAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZ0aGlzLT5fTV9yZWZjb3VudCk7CisvLyAgICAgICAgIF9NX2Rlc3Ryb3koX19hKTsKKy8vICAgICAgIH0KKy8vICAgfQorLy8gVGhlIGFubm90YXRpb25zIGluIHRoaXMgZXhhbXBsZSB0ZWxsIHRoZSByYWNlIGRldGVjdG9yIHRoYXQgYWxsIG1lbW9yeQorLy8gYWNjZXNzZXMgb2NjdXJyZWQgd2hlbiB0aGUgcmVmY291bnQgd2FzIHBvc2l0aXZlIGRvIG5vdCByYWNlIHdpdGgKKy8vIG1lbW9yeSBhY2Nlc3NlcyB3aGljaCBvY2N1cnJlZCBhZnRlciB0aGUgcmVmY291bnQgYmVjYW1lIHplcm8uCisjaWZuZGVmIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRQorIyBkZWZpbmUgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRShBKQorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSCisjIGRlZmluZSAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoQSkKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIEMgbGlua2FnZTogZGVmaW5lIGV4dGVybiAiQyIgbGlua2FnZSBvbmx5IHdoZW4gdXNpbmcgQysrLgorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fRVhURVJOX0MgZXh0ZXJuICJDIiB7CisjIGRlZmluZSBfR0xJQkNYWF9FTkRfRVhURVJOX0MgfQorCisjZWxzZSAvLyAhX19jcGx1c3BsdXMKKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX0VYVEVSTl9DCisjIGRlZmluZSBfR0xJQkNYWF9FTkRfRVhURVJOX0MKKyNlbmRpZgorCisKKy8vIEZpcnN0IGluY2x1ZGVzLgorCisvLyBQaWNrIHVwIGFueSBPUy1zcGVjaWZpYyBkZWZpbml0aW9ucy4KKyNpbmNsdWRlIDxiaXRzL29zX2RlZmluZXMuaD4KKworLy8gUGljayB1cCBhbnkgQ1BVLXNwZWNpZmljIGRlZmluaXRpb25zLgorI2luY2x1ZGUgPGJpdHMvY3B1X2RlZmluZXMuaD4KKworLy8gSWYgcGxhdGZvcm0gdXNlcyBuZWl0aGVyIHZpc2liaWxpdHkgbm9yIHBzdWVkby12aXNpYmlsaXR5LAorLy8gc3BlY2lmeSBlbXB0eSBkZWZhdWx0IGZvciBuYW1lc3BhY2UgYW5ub3RhdGlvbiBtYWNyb3MuCisjaWZuZGVmIF9HTElCQ1hYX1BTRVVET19WSVNJQklMSVRZCisjIGRlZmluZSBfR0xJQkNYWF9QU0VVRE9fVklTSUJJTElUWShWKQorI2VuZGlmCisKKy8vIENlcnRhaW4gZnVuY3Rpb24gZGVmaW5pdGlvbnMgdGhhdCBhcmUgbWVhbnQgdG8gYmUgb3ZlcnJpZGFibGUgZnJvbQorLy8gdXNlciBjb2RlIGFyZSBkZWNvcmF0ZWQgd2l0aCB0aGlzIG1hY3JvLiAgRm9yIHNvbWUgdGFyZ2V0cywgdGhpcworLy8gbWFjcm8gY2F1c2VzIHRoZXNlIGRlZmluaXRpb25zIHRvIGJlIHdlYWsuCisjaWZuZGVmIF9HTElCQ1hYX1dFQUtfREVGSU5JVElPTgorIyBkZWZpbmUgX0dMSUJDWFhfV0VBS19ERUZJTklUSU9OCisjZW5kaWYKKworCisvLyBUaGUgcmVtYWluZGVyIG9mIHRoZSBwcmV3cml0dGVuIGNvbmZpZyBpcyBhdXRvbWF0aWM7IGFsbCB0aGUKKy8vIHVzZXIgaG9va3MgYXJlIGxpc3RlZCBhYm92ZS4KKworLy8gQ3JlYXRlIGEgYm9vbGVhbiBmbGFnIHRvIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIC0tZmFzdC1tYXRoIGlzIHNldC4KKyNpZmRlZiBfX0ZBU1RfTUFUSF9fCisjIGRlZmluZSBfR0xJQkNYWF9GQVNUX01BVEggMQorI2Vsc2UKKyMgZGVmaW5lIF9HTElCQ1hYX0ZBU1RfTUFUSCAwCisjZW5kaWYKKworLy8gVGhpcyBtYXJrcyBzdHJpbmcgbGl0ZXJhbHMgaW4gaGVhZGVyIGZpbGVzIHRvIGJlIGV4dHJhY3RlZCBmb3IgZXZlbnR1YWwKKy8vIHRyYW5zbGF0aW9uLiAgSXQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIG1lc3NhZ2VzIGluIHRocm93biBleGNlcHRpb25zOyBzZWUKKy8vIHNyYy9mdW5jdGV4Y2VwdC5jYy4gIFdlIHVzZSBfX04gYmVjYXVzZSB0aGUgbW9yZSB0cmFkaXRpb25hbCBfTiBpcyB1c2VkCisvLyBmb3Igc29tZXRoaW5nIGVsc2UgdW5kZXIgY2VydGFpbiBPU2VzIChzZWUgQkFETkFNRVMpLgorI2RlZmluZSBfX04obXNnaWQpICAgICAobXNnaWQpCisKKy8vIEZvciBleGFtcGxlLCA8d2luZG93cy5oPiBpcyBrbm93biB0byAjZGVmaW5lIG1pbiBhbmQgbWF4IGFzIG1hY3Jvcy4uLgorI3VuZGVmIG1pbgorI3VuZGVmIG1heAorCisvLyBFbmQgb2YgcHJld3JpdHRlbiBjb25maWc7IHRoZSBzZXR0aW5ncyBkaXNjb3ZlcmVkIGF0IGNvbmZpZ3VyZSB0aW1lIGZvbGxvdy4KKy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGZyb20gY29uZmlnLmguaW4gYnkgY29uZmlndXJlLiAgKi8KKy8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFjb3NmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BQ09TRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYWNvc2wnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FDT1NMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhc2luZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVNJTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFzaW5sJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BU0lOTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSB0YXJnZXQgYXNzZW1ibGVyIHN1cHBvcnRzIC5zeW12ZXIgZGlyZWN0aXZlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FTX1NZTVZFUl9ESVJFQ1RJVkUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGF0YW4yZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVRBTjJGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdGFuMmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU4yTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXRhbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU5GIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdGFubCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVRBTkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGF0X3F1aWNrX2V4aXQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FUX1FVSUNLX0VYSVQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgdGFyZ2V0IGFzc2VtYmxlciBzdXBwb3J0cyB0aHJlYWQtbG9jYWwgc3RvcmFnZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX0NDX1RMUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNlaWxmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DRUlMRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY2VpbGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NFSUxMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxjb21wbGV4Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NPTVBMRVhfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY29zZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ09TRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY29zaGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0hGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjb3NobCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ09TSEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNvc2wnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0wgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0RMRkNOX0ggMQorCisvKiBEZWZpbmUgaWYgRUJBRE1TRyBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRUJBRE1TRyAxCisKKy8qIERlZmluZSBpZiBFQ0FOQ0VMRUQgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VDQU5DRUxFRCAxCisKKy8qIERlZmluZSBpZiBFQ0hJTEQgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VDSElMRCAxCisKKy8qIERlZmluZSBpZiBFSURSTSBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRUlEUk0gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGVuZGlhbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTkRJQU5fSCAxCisKKy8qIERlZmluZSBpZiBFTk9EQVRBIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTk9EQVRBIDEKKworLyogRGVmaW5lIGlmIEVOT0xJTksgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VOT0xJTksgMQorCisvKiBEZWZpbmUgaWYgRU5PU1BDIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTk9TUEMgMQorCisvKiBEZWZpbmUgaWYgRU5PU1IgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VOT1NSIDEKKworLyogRGVmaW5lIGlmIEVOT1NUUiBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU5PU1RSIDEKKworLyogRGVmaW5lIGlmIEVOT1RSRUNPVkVSQUJMRSBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU5PVFJFQ09WRVJBQkxFIDEKKworLyogRGVmaW5lIGlmIEVOT1RTVVAgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VOT1RTVVAgMQorCisvKiBEZWZpbmUgaWYgRU9WRVJGTE9XIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FT1ZFUkZMT1cgMQorCisvKiBEZWZpbmUgaWYgRU9XTkVSREVBRCBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU9XTkVSREVBRCAxCisKKy8qIERlZmluZSBpZiBFUEVSTSBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVBFUk0gMQorCisvKiBEZWZpbmUgaWYgRVBST1RPIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FUFJPVE8gMQorCisvKiBEZWZpbmUgaWYgRVRJTUUgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VUSU1FIDEKKworLyogRGVmaW5lIGlmIEVUSU1FRE9VVCBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVRJTUVET1VUIDEKKworLyogRGVmaW5lIGlmIEVUWFRCU1kgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VUWFRCU1kgMQorCisvKiBEZWZpbmUgaWYgRVdPVUxEQkxPQ0sgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VXT1VMREJMT0NLIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxleGVjaW5mby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FWEVDSU5GT19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBleHBmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FWFBGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBleHBsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FWFBMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmYWJzZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkFCU0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZhYnNsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GQUJTTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmVudi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GRU5WX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZpbml0ZScgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRklOSVRFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmaW5pdGVmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GSU5JVEVGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmaW5pdGVsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GSU5JVEVMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmbG9hdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTE9BVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmbG9vcmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZMT09SRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmxvb3JsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTE9PUkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZtb2RmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTU9ERiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZm1vZGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZNT0RMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmcGNsYXNzJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX0ZQQ0xBU1MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmcC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX0ZQX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmcmV4cGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZSRVhQRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnJleHBsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GUkVYUEwgMQorCisvKiBEZWZpbmUgaWYgX1Vud2luZF9HZXRJUEluZm8gaXMgYXZhaWxhYmxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0dFVElQSU5GTyAxCisKKy8qIERlZmluZSBpZiBnZXRzIGlzIGF2YWlsYWJsZSBpbiA8c3RkaW8uaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfR0VUUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaHlwb3QnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0hZUE9UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBoeXBvdGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0hZUE9URiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaHlwb3RsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVEwgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGljb252KCkgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSUNPTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGllZWVmcC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX0lFRUVGUF9IICovCisKKy8qIERlZmluZSBpZiBpbnQ2NF90IGlzIGF2YWlsYWJsZSBpbiA8c3RkaW50Lmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lOVDY0X1QgMQorCisvKiBEZWZpbmUgaWYgaW50NjRfdCBpcyBhIGxvbmcuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9JTlQ2NF9UX0xPTkcgKi8KKworLyogRGVmaW5lIGlmIGludDY0X3QgaXMgYSBsb25nIGxvbmcuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSU5UNjRfVF9MT05HX0xPTkcgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lOVFRZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlzaW5mJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU0lORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaXNpbmZmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU0lORkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlzaW5mbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkZMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc25hbicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNOQU4gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlzbmFuZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNOQU5GIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc25hbmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFOTCAxCisKKy8qIERlZmluZWQgaWYgaXN3YmxhbmsgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lTV0JMQU5LIDEKKworLyogRGVmaW5lIGlmIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0xDX01FU1NBR0VTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsZGV4cGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0xERVhQRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbGRleHBsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MREVYUEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpYmludGwuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9MSUJJTlRMX0ggKi8KKworLyogT25seSB1c2VkIGluIGJ1aWxkIGRpcmVjdG9yeSB0ZXN0c3VpdGVfaG9va3MuaC4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX0xJTUlUX0FTICovCisKKy8qIE9ubHkgdXNlZCBpbiBidWlsZCBkaXJlY3RvcnkgdGVzdHN1aXRlX2hvb2tzLmguICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9MSU1JVF9EQVRBICovCisKKy8qIE9ubHkgdXNlZCBpbiBidWlsZCBkaXJlY3RvcnkgdGVzdHN1aXRlX2hvb2tzLmguICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9MSU1JVF9GU0laRSAqLworCisvKiBPbmx5IHVzZWQgaW4gYnVpbGQgZGlyZWN0b3J5IHRlc3RzdWl0ZV9ob29rcy5oLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElNSVRfUlNTICovCisKKy8qIE9ubHkgdXNlZCBpbiBidWlsZCBkaXJlY3RvcnkgdGVzdHN1aXRlX2hvb2tzLmguICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9MSU1JVF9WTUVNICovCisKKy8qIERlZmluZSBpZiBmdXRleCBzeXNjYWxsIGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MSU5VWF9GVVRFWCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0xPQ0FMRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2cxMGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0xPRzEwRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbG9nMTBsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0cxMEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvZ2YnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0xPR0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvZ2wnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0xPR0wgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1hY2hpbmUvZW5kaWFuLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTUFDSElORV9FTkRJQU5fSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1hY2hpbmUvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9NQUNISU5FX1BBUkFNX0ggKi8KKworLyogRGVmaW5lIGlmIG1ic3RhdGVfdCBleGlzdHMgaW4gd2NoYXIuaC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9NQlNUQVRFX1QgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9NRU1PUllfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbW9kZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTU9ERiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbW9kZmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX01PREZGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtb2RmbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTU9ERkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5hbi5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX05BTl9IICovCisKKy8qIERlZmluZSBpZiBwb2xsIGlzIGF2YWlsYWJsZSBpbiA8cG9sbC5oPi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9QT0xMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwb3dmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9QT1dGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwb3dsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9QT1dMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBxZnBjbGFzcycgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9RRlBDTEFTUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHF1aWNrX2V4aXQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1FVSUNLX0VYSVQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGVudicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9TRVRFTlYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaW5jb3MnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkNPUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luY29zZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOQ09TRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luY29zbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOQ09TTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luaGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkhGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaW5obCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOSEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkwgMQorCisvKiBEZWZpbmVkIGlmIHNsZWVwIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TTEVFUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3FydGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NRUlRGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzcXJ0bCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1FSVEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFsaWduLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUREFMSUdOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGJvb2wuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1REQk9PTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RESU5UX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVERMSUJfSCAxCisKKy8qIERlZmluZSBpZiBzdHJlcnJvcl9sIGlzIGF2YWlsYWJsZSBpbiA8c3RyaW5nLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUUkVSUk9SX0wgMQorCisvKiBEZWZpbmUgaWYgc3RyZXJyb3JfciBpcyBhdmFpbGFibGUgaW4gPHN0cmluZy5oPi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJFUlJPUl9SIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUUklOR1NfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUUklOR19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b2YnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUUlRPRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9sZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RSVE9MRCAxCisKKy8qIERlZmluZSBpZiBzdHJ4ZnJtX2wgaXMgYXZhaWxhYmxlIGluIDxzdHJpbmcuaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RSWEZSTV9MIDEKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHRhcmdldCBydW50aW1lIGxpbmtlciBzdXBwb3J0cyBiaW5kaW5nIHRoZSBzYW1lIHN5bWJvbAorICAgdG8gZGlmZmVyZW50IHZlcnNpb25zLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZTVZFUl9TWU1CT0xfUkVOQU1JTkdfUlVOVElNRV9TVVBQT1JUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsaW8uaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9TWVNfRklMSU9fSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfSU9DVExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lwYy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfSVBDX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pc2FfZGVmcy5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX1NZU19JU0FfREVGU19IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL21hY2hpbmUuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9TWVNfTUFDSElORV9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19QQVJBTV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lTX1JFU09VUkNFX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBhIHN1aXRhYmxlIDxzeXMvc2R0Lmg+IGhlYWRlciBmaWxlICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9TWVNfU0RUX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VtLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19TRU1fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N5c2luZm8uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lTX1NZU0lORk9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lTX1RJTUVfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdWlvLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19VSU9fSCAxCisKKy8qIERlZmluZSBpZiBTX0lGUkVHIGlzIGF2YWlsYWJsZSBpbiA8c3lzL3N0YXQuaD4uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9TX0lGUkVHICovCisKKy8qIERlZmluZSBpZiBTX0lGUkVHIGlzIGF2YWlsYWJsZSBpbiA8c3lzL3N0YXQuaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU19JU1JFRyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGFuZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVEFORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGFuaGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkhGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0YW5obCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVEFOSEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRhbmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHRnbWF0aC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9UR01BVEhfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgdGhyZWFkLWxvY2FsIHN0b3JhZ2UuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVExTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVU5JU1REX0ggMQorCisvKiBEZWZpbmVkIGlmIHVzbGVlcCBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVVNMRUVQIDEKKworLyogRGVmaW5lZCBpZiB2ZndzY2FuZiBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVkZXU0NBTkYgMQorCisvKiBEZWZpbmVkIGlmIHZzd3NjYW5mIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9WU1dTQ0FORiAxCisKKy8qIERlZmluZWQgaWYgdndzY2FuZiBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVldTQ0FORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8d2NoYXIuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfV0NIQVJfSCAxCisKKy8qIERlZmluZWQgaWYgd2NzdG9mIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9XQ1NUT0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHdjdHlwZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9XQ1RZUEVfSCAxCisKKy8qIERlZmluZWQgaWYgU2xlZXAgZXhpc3RzLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfV0lOMzJfU0xFRVAgKi8KKworLyogRGVmaW5lIGlmIHdyaXRldiBpcyBhdmFpbGFibGUgaW4gPHN5cy91aW8uaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfV1JJVEVWIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfYWNvc2YnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FDT1NGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Fjb3NsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19BQ09TTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hc2luZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQVNJTkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfYXNpbmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FTSU5MICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2F0YW4yZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQVRBTjJGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2F0YW4ybCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQVRBTjJMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2F0YW5mJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19BVEFORiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hdGFubCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQVRBTkwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfY2VpbGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0NFSUxGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2NlaWxsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19DRUlMTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9jb3NmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19DT1NGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Nvc2hmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19DT1NIRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9jb3NobCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQ09TSEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfY29zbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQ09TTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9leHBmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19FWFBGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2V4cGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0VYUEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZmFic2YnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZBQlNGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2ZhYnNsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GQUJTTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9maW5pdGUnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZJTklURSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9maW5pdGVmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GSU5JVEVGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Zpbml0ZWwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZJTklURUwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZmxvb3JmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GTE9PUkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZmxvb3JsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GTE9PUkwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZm1vZGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZNT0RGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Ztb2RsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GTU9ETCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mcGNsYXNzJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GUENMQVNTICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2ZyZXhwZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRlJFWFBGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2ZyZXhwbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRlJFWFBMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2h5cG90JyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19IWVBPVCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9oeXBvdGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0hZUE9URiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9oeXBvdGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0hZUE9UTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9pc2luZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSVNJTkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaXNpbmZmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19JU0lORkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaXNpbmZsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19JU0lORkwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaXNuYW4nIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0lTTkFOICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2lzbmFuZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSVNOQU5GICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2lzbmFubCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSVNOQU5MICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2xkZXhwZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTERFWFBGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2xkZXhwbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTERFWFBMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2xvZzEwZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTE9HMTBGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2xvZzEwbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTE9HMTBMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2xvZ2YnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xPR0YgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfbG9nbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTE9HTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9tb2RmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19NT0RGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX21vZGZmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19NT0RGRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9tb2RmbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTU9ERkwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfcG93ZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fUE9XRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9wb3dsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19QT1dMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3FmcGNsYXNzJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19RRlBDTEFTUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zaW5jb3MnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkNPUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zaW5jb3NmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5DT1NGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NpbmNvc2wnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkNPU0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc2luZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fU0lORiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zaW5oZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fU0lOSEYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc2luaGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkhMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NpbmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc3FydGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NRUlRGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NxcnRsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TUVJUTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF90YW5mJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19UQU5GICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3RhbmhmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19UQU5IRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF90YW5obCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fVEFOSEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfdGFubCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fVEFOTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9fY3hhX3RocmVhZF9hdGV4aXRfaW1wbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fX0NYQV9USFJFQURfQVRFWElUX0lNUEwgKi8KKworLyogRGVmaW5lIGFzIGNvbnN0IGlmIHRoZSBkZWNsYXJhdGlvbiBvZiBpY29udigpIG5lZWRzIGNvbnN0LiAqLworI2RlZmluZSBfR0xJQkNYWF9JQ09OVl9DT05TVCAKKworLyogRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy4KKyAgICovCisjZGVmaW5lIExUX09CSkRJUiAiLmxpYnMvIgorCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9QQUNLQUdFICovCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9QQUNLQUdFX0JVR1JFUE9SVCAiIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIF9HTElCQ1hYX1BBQ0tBR0VfTkFNRSAicGFja2FnZS11bnVzZWQiCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUEFDS0FHRV9TVFJJTkcgInBhY2thZ2UtdW51c2VkIHZlcnNpb24tdW51c2VkIgorCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIF9HTElCQ1hYX1BBQ0tBR0VfVEFSTkFNRSAibGlic3RkYysrIgorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBfR0xJQkNYWF9QQUNLQUdFX1VSTCAiIgorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBfR0xJQkNYWF9QQUNLQUdFX19HTElCQ1hYX1ZFUlNJT04gInZlcnNpb24tdW51c2VkIgorCisvKiBUaGUgc2l6ZSBvZiBgY2hhcicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfQ0hBUiAqLworCisvKiBUaGUgc2l6ZSBvZiBgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9JTlQgKi8KKworLyogVGhlIHNpemUgb2YgYGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisvKiAjdW5kZWYgU0laRU9GX0xPTkcgKi8KKworLyogVGhlIHNpemUgb2YgYHNob3J0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9TSE9SVCAqLworCisvKiBUaGUgc2l6ZSBvZiBgdm9pZCAqJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9WT0lEX1AgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjZGVmaW5lIFNURENfSEVBREVSUyAxCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9WRVJTSU9OICovCisKKy8qIERlZmluZSBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgQysrMTEgYXRvbWljcy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TIDEKKworLyogRGVmaW5lIHRvIHVzZSBjb25jZXB0IGNoZWNraW5nIGNvZGUgZnJvbSB0aGUgYm9vc3QgbGlicmFyaWVzLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0NPTkNFUFRfQ0hFQ0tTICovCisKKy8qIERlZmluZSB0byAxIGlmIGEgZnVsbHkgZHluYW1pYyBiYXNpY19zdHJpbmcgaXMgd2FudGVkLCAwIHRvIGRpc2FibGUsCisgICB1bmRlZmluZWQgZm9yIHBsYXRmb3JtIGRlZmF1bHRzICovCisjZGVmaW5lIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HIDAKKworLyogRGVmaW5lIGlmIGd0aHJlYWRzIGxpYnJhcnkgaXMgYXZhaWxhYmxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVNfR1RIUkVBRFMgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBhIGZ1bGwgaG9zdGVkIGxpYnJhcnkgaXMgYnVpbHQsIG9yIDAgaWYgZnJlZXN0YW5kaW5nLiAqLworI2RlZmluZSBfR0xJQkNYWF9IT1NURUQgMQorCisvKiBEZWZpbmUgaWYgY29tcGF0aWJpbGl0eSBzaG91bGQgYmUgcHJvdmlkZWQgZm9yIC1tbG9uZy1kb3VibGUtNjQuICovCisKKy8qIERlZmluZSBpZiBwdHJkaWZmX3QgaXMgaW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9QVFJESUZGX1RfSVNfSU5UIDEKKworLyogRGVmaW5lIGlmIHVzaW5nIHNldHJsaW1pdCB0byBzZXQgcmVzb3VyY2UgbGltaXRzIGR1cmluZyAibWFrZSBjaGVjayIgKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9SRVNfTElNSVRTICovCisKKy8qIERlZmluZSBpZiBzaXplX3QgaXMgdW5zaWduZWQgaW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9TSVpFX1RfSVNfVUlOVCAxCisKKy8qIERlZmluZSBpZiB0aGUgY29tcGlsZXIgaXMgY29uZmlndXJlZCBmb3Igc2V0am1wL2xvbmdqbXAgZXhjZXB0aW9ucy4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9TSkxKX0VYQ0VQVElPTlMgKi8KKworLyogRGVmaW5lIHRvIHRoZSB2YWx1ZSBvZiB0aGUgRU9GIGludGVnZXIgY29uc3RhbnQuICovCisjZGVmaW5lIF9HTElCQ1hYX1NURElPX0VPRiAtMQorCisvKiBEZWZpbmUgdG8gdGhlIHZhbHVlIG9mIHRoZSBTRUVLX0NVUiBpbnRlZ2VyIGNvbnN0YW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9TVERJT19TRUVLX0NVUiAxCisKKy8qIERlZmluZSB0byB0aGUgdmFsdWUgb2YgdGhlIFNFRUtfRU5EIGludGVnZXIgY29uc3RhbnQuICovCisjZGVmaW5lIF9HTElCQ1hYX1NURElPX1NFRUtfRU5EIDIKKworLyogRGVmaW5lIHRvIHVzZSBzeW1ib2wgdmVyc2lvbmluZyBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICovCisjZGVmaW5lIF9HTElCQ1hYX1NZTVZFUiAxCisKKy8qIERlZmluZSB0byB1c2UgZGFyd2luIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1NZTVZFUl9EQVJXSU4gKi8KKworLyogRGVmaW5lIHRvIHVzZSBHTlUgdmVyc2lvbmluZyBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICovCisjZGVmaW5lIF9HTElCQ1hYX1NZTVZFUl9HTlUgMQorCisvKiBEZWZpbmUgdG8gdXNlIEdOVSBuYW1lc3BhY2UgdmVyc2lvbmluZyBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfU1lNVkVSX0dOVV9OQU1FU1BBQ0UgKi8KKworLyogRGVmaW5lIHRvIHVzZSBTdW4gdmVyc2lvbmluZyBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfU1lNVkVSX1NVTiAqLworCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBvciBtYWNyb3MgZnJvbSA8d2NoYXIuaD4sIDxtYXRoLmg+LCA8Y29tcGxleC5oPiwKKyAgIDxzdGRpby5oPiwgYW5kIDxzdGRsaWIuaD4gY2FuIGJlIHVzZWQgb3IgZXhwb3NlZC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OSAxCisKKy8qIERlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxjb21wbGV4Lmg+IHNob3VsZCBiZSB1c2VkIGluIDxjb21wbGV4Pi4gVXNpbmcKKyAgIGNvbXBpbGVyIGJ1aWx0aW5zIGZvciB0aGVzZSBmdW5jdGlvbnMgcmVxdWlyZXMgY29ycmVzcG9uZGluZyBDOTkgbGlicmFyeQorICAgZnVuY3Rpb25zIHRvIGJlIHByZXNlbnQuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWCAxCisKKy8qIERlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxjb21wbGV4Lmg+IHNob3VsZCBiZSB1c2VkIGluIDx0cjEvY29tcGxleD4uCisgICBVc2luZyBjb21waWxlciBidWlsdGlucyBmb3IgdGhlc2UgZnVuY3Rpb25zIHJlcXVpcmVzIGNvcnJlc3BvbmRpbmcgQzk5CisgICBsaWJyYXJ5IGZ1bmN0aW9ucyB0byBiZSBwcmVzZW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxIDEKKworLyogRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgaW4gPGN0eXBlLmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbiA8dHIxL2NjdHlwZT4gaW4KKyAgIG5hbWVzcGFjZSBzdGQ6OnRyMS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9DVFlQRV9UUjEgMQorCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8ZmVudi5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4gPHRyMS9jZmVudj4gaW4KKyAgIG5hbWVzcGFjZSBzdGQ6OnRyMS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9GRU5WX1RSMSAxCisKKy8qIERlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxpbnR0eXBlcy5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4KKyAgIDx0cjEvY2ludHR5cGVzPiBpbiBuYW1lc3BhY2Ugc3RkOjp0cjEuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfSU5UVFlQRVNfVFIxIDEKKworLyogRGVmaW5lIGlmIHdjaGFyX3QgQzk5IGZ1bmN0aW9ucyBpbiA8aW50dHlwZXMuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluCisgICA8dHIxL2NpbnR0eXBlcz4gaW4gbmFtZXNwYWNlIHN0ZDo6dHIxLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X0lOVFRZUEVTX1dDSEFSX1RfVFIxIDEKKworLyogRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgb3IgbWFjcm9zIGluIDxtYXRoLmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbiA8Y21hdGg+CisgICBpbiBuYW1lc3BhY2Ugc3RkLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X01BVEggMQorCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBvciBtYWNyb3MgaW4gPG1hdGguaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluCisgICA8dHIxL2NtYXRoPiBpbiBuYW1lc3BhY2Ugc3RkOjp0cjEuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEgMQorCisvKiBEZWZpbmUgaWYgQzk5IHR5cGVzIGluIDxzdGRpbnQuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluIDx0cjEvY3N0ZGludD4gaW4KKyAgIG5hbWVzcGFjZSBzdGQ6OnRyMS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxIDEKKworLyogRGVmaW5lZCBpZiBjbG9ja19nZXR0aW1lIGhhcyBtb25vdG9uaWMgY2xvY2sgc3VwcG9ydC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0NMT0NLX01PTk9UT05JQyAxCisKKy8qIERlZmluZWQgaWYgY2xvY2tfZ2V0dGltZSBzeXNjYWxsIGhhcyBtb25vdG9uaWMgYW5kIHJlYWx0aW1lIGNsb2NrIHN1cHBvcnQuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DTE9DS19HRVRUSU1FX1NZU0NBTEwgMQorCisvKiBEZWZpbmVkIGlmIGNsb2NrX2dldHRpbWUgaGFzIHJlYWx0aW1lIGNsb2NrIHN1cHBvcnQuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DTE9DS19SRUFMVElNRSAxCisKKy8qIERlZmluZSBpZiBJU08vSUVDIFRSIDI0NzMzIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgdHlwZXMgYXJlIHN1cHBvcnRlZCBvbgorICAgdGhpcyBob3N0LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfREVDSU1BTF9GTE9BVCAxCisKKy8qIERlZmluZSBpZiBfX2Zsb2F0MTI4IGlzIHN1cHBvcnRlZCBvbiB0aGlzIGhvc3QuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9GTE9BVDEyOCAxCisKKy8qIERlZmluZWQgaWYgZ2V0dGltZW9mZGF5IGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0dFVFRJTUVPRkRBWSAxCisKKy8qIERlZmluZSBpZiBnZXRfbnByb2NzIGlzIGF2YWlsYWJsZSBpbiA8c3lzL3N5c2luZm8uaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9HRVRfTlBST0NTIDEKKworLyogRGVmaW5lIGlmIF9faW50MTI4IGlzIHN1cHBvcnRlZCBvbiB0aGlzIGhvc3QuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfVVNFX0lOVDEyOCAqLworCisvKiBEZWZpbmUgaWYgTEZTIHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfTEZTIDEKKworLyogRGVmaW5lIGlmIGNvZGUgc3BlY2lhbGl6ZWQgZm9yIGxvbmcgbG9uZyBzaG91bGQgYmUgdXNlZC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0xPTkdfTE9ORyAxCisKKy8qIERlZmluZWQgaWYgbmFub3NsZWVwIGlzIGF2YWlsYWJsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9VU0VfTkFOT1NMRUVQICovCisKKy8qIERlZmluZSBpZiBOTFMgdHJhbnNsYXRpb25zIGFyZSB0byBiZSB1c2VkLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1VTRV9OTFMgKi8KKworLyogRGVmaW5lIGlmIHB0aHJlYWRzX251bV9wcm9jZXNzb3JzX25wIGlzIGF2YWlsYWJsZSBpbiA8cHRocmVhZC5oPi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9VU0VfUFRIUkVBRFNfTlVNX1BST0NFU1NPUlNfTlAgKi8KKworLyogRGVmaW5lIGlmIC9kZXYvcmFuZG9tIGFuZCAvZGV2L3VyYW5kb20gYXJlIGF2YWlsYWJsZSBmb3IgdGhlIHJhbmRvbV9kZXZpY2UKKyAgIG9mIFRSMSAoQ2hhcHRlciA1LjEpLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfUkFORE9NX1RSMSAxCisKKy8qIERlZmluZWQgaWYgc2NoZWRfeWllbGQgaXMgYXZhaWxhYmxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1VTRV9TQ0hFRF9ZSUVMRCAqLworCisvKiBEZWZpbmUgaWYgX1NDX05QUk9DRVNTT1JTX09OTE4gaXMgYXZhaWxhYmxlIGluIDx1bmlzdGQuaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9TQ19OUFJPQ0VTU09SU19PTkxOIDEKKworLyogRGVmaW5lIGlmIF9TQ19OUFJPQ19PTkxOIGlzIGF2YWlsYWJsZSBpbiA8dW5pc3RkLmg+LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1VTRV9TQ19OUFJPQ19PTkxOICovCisKKy8qIERlZmluZSBpZiBzeXNjdGwoKSwgQ1RMX0hXIGFuZCBIV19OQ1BVIGFyZSBhdmFpbGFibGUgaW4gPHN5cy9zeXNjdGwuaD4uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfVVNFX1NZU0NUTF9IV19OQ1BVICovCisKKy8qIERlZmluZSBpZiBjb2RlIHNwZWNpYWxpemVkIGZvciB3Y2hhcl90IHNob3VsZCBiZSB1c2VkLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfV0NIQVJfVCAxCisKKy8qIERlZmluZSB0byAxIGlmIGEgdmVyYm9zZSBsaWJyYXJ5IGlzIGJ1aWx0LCBvciAwIG90aGVyd2lzZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVkVSQk9TRSAxCisKKy8qIERlZmluZWQgaWYgYXMgY2FuIGhhbmRsZSByZHJhbmQuICovCisjZGVmaW5lIF9HTElCQ1hYX1g4Nl9SRFJBTkQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBtdXRleF90aW1lZGxvY2sgaXMgYXZhaWxhYmxlLiAqLworI2RlZmluZSBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLIDEKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0FDT1NGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQUNPU0YpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FDT1NGIDEKKyMgZGVmaW5lIGFjb3NmIF9hY29zZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BQ09TTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0FDT1NMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BQ09TTCAxCisjIGRlZmluZSBhY29zbCBfYWNvc2wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQVNJTkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BU0lORikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVNJTkYgMQorIyBkZWZpbmUgYXNpbmYgX2FzaW5mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0FTSU5MKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVNJTkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FTSU5MIDEKKyMgZGVmaW5lIGFzaW5sIF9hc2lubAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BVEFOMkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BVEFOMkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU4yRiAxCisjIGRlZmluZSBhdGFuMmYgX2F0YW4yZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BVEFOMkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BVEFOMkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU4yTCAxCisjIGRlZmluZSBhdGFuMmwgX2F0YW4ybAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BVEFORikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0FUQU5GKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFORiAxCisjIGRlZmluZSBhdGFuZiBfYXRhbmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQVRBTkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BVEFOTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVRBTkwgMQorIyBkZWZpbmUgYXRhbmwgX2F0YW5sCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0NFSUxGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQ0VJTEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0NFSUxGIDEKKyMgZGVmaW5lIGNlaWxmIF9jZWlsZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19DRUlMTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0NFSUxMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9DRUlMTCAxCisjIGRlZmluZSBjZWlsbCBfY2VpbGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQ09TRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0NPU0YpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0YgMQorIyBkZWZpbmUgY29zZiBfY29zZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19DT1NIRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0NPU0hGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT1NIRiAxCisjIGRlZmluZSBjb3NoZiBfY29zaGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQ09TSEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9DT1NITCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ09TSEwgMQorIyBkZWZpbmUgY29zaGwgX2Nvc2hsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0NPU0wpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9DT1NMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT1NMIDEKKyMgZGVmaW5lIGNvc2wgX2Nvc2wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRVhQRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0VYUEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0VYUEYgMQorIyBkZWZpbmUgZXhwZiBfZXhwZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19FWFBMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRVhQTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVhQTCAxCisjIGRlZmluZSBleHBsIF9leHBsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZBQlNGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRkFCU0YpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZBQlNGIDEKKyMgZGVmaW5lIGZhYnNmIF9mYWJzZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GQUJTTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZBQlNMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GQUJTTCAxCisjIGRlZmluZSBmYWJzbCBfZmFic2wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRklOSVRFKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRklOSVRFKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GSU5JVEUgMQorIyBkZWZpbmUgZmluaXRlIF9maW5pdGUKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRklOSVRFRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZJTklURUYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZJTklURUYgMQorIyBkZWZpbmUgZmluaXRlZiBfZmluaXRlZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GSU5JVEVMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRklOSVRFTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRklOSVRFTCAxCisjIGRlZmluZSBmaW5pdGVsIF9maW5pdGVsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZMT09SRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZMT09SRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkxPT1JGIDEKKyMgZGVmaW5lIGZsb29yZiBfZmxvb3JmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZMT09STCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZMT09STCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkxPT1JMIDEKKyMgZGVmaW5lIGZsb29ybCBfZmxvb3JsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZNT0RGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRk1PREYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZNT0RGIDEKKyMgZGVmaW5lIGZtb2RmIF9mbW9kZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GTU9ETCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZNT0RMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTU9ETCAxCisjIGRlZmluZSBmbW9kbCBfZm1vZGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRlBDTEFTUykgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZQQ0xBU1MpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZQQ0xBU1MgMQorIyBkZWZpbmUgZnBjbGFzcyBfZnBjbGFzcworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GUkVYUEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GUkVYUEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZSRVhQRiAxCisjIGRlZmluZSBmcmV4cGYgX2ZyZXhwZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GUkVYUEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GUkVYUEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZSRVhQTCAxCisjIGRlZmluZSBmcmV4cGwgX2ZyZXhwbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19IWVBPVCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0hZUE9UKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVCAxCisjIGRlZmluZSBoeXBvdCBfaHlwb3QKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSFlQT1RGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSFlQT1RGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVEYgMQorIyBkZWZpbmUgaHlwb3RmIF9oeXBvdGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSFlQT1RMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSFlQT1RMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVEwgMQorIyBkZWZpbmUgaHlwb3RsIF9oeXBvdGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSVNJTkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9JU0lORikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkYgMQorIyBkZWZpbmUgaXNpbmYgX2lzaW5mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0lTSU5GRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0lTSU5GRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkZGIDEKKyMgZGVmaW5lIGlzaW5mZiBfaXNpbmZmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0lTSU5GTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0lTSU5GTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkZMIDEKKyMgZGVmaW5lIGlzaW5mbCBfaXNpbmZsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0lTTkFOKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSVNOQU4pCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFOIDEKKyMgZGVmaW5lIGlzbmFuIF9pc25hbgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19JU05BTkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9JU05BTkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFORiAxCisjIGRlZmluZSBpc25hbmYgX2lzbmFuZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19JU05BTkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9JU05BTkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFOTCAxCisjIGRlZmluZSBpc25hbmwgX2lzbmFubAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19MREVYUEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9MREVYUEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0xERVhQRiAxCisjIGRlZmluZSBsZGV4cGYgX2xkZXhwZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19MREVYUEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9MREVYUEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0xERVhQTCAxCisjIGRlZmluZSBsZGV4cGwgX2xkZXhwbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19MT0cxMEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9MT0cxMEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0xPRzEwRiAxCisjIGRlZmluZSBsb2cxMGYgX2xvZzEwZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19MT0cxMEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9MT0cxMEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0xPRzEwTCAxCisjIGRlZmluZSBsb2cxMGwgX2xvZzEwbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19MT0dGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTE9HRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfTE9HRiAxCisjIGRlZmluZSBsb2dmIF9sb2dmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0xPR0wpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9MT0dMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0dMIDEKKyMgZGVmaW5lIGxvZ2wgX2xvZ2wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTU9ERikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX01PREYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX01PREYgMQorIyBkZWZpbmUgbW9kZiBfbW9kZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19NT0RGRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX01PREZGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9NT0RGRiAxCisjIGRlZmluZSBtb2RmZiBfbW9kZmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTU9ERkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9NT0RGTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfTU9ERkwgMQorIyBkZWZpbmUgbW9kZmwgX21vZGZsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1BPV0YpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9QT1dGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9QT1dGIDEKKyMgZGVmaW5lIHBvd2YgX3Bvd2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fUE9XTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1BPV0wpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1BPV0wgMQorIyBkZWZpbmUgcG93bCBfcG93bAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19RRlBDTEFTUykgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1FGUENMQVNTKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9RRlBDTEFTUyAxCisjIGRlZmluZSBxZnBjbGFzcyBfcWZwY2xhc3MKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU0lOQ09TKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lOQ09TKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5DT1MgMQorIyBkZWZpbmUgc2luY29zIF9zaW5jb3MKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU0lOQ09TRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkNPU0YpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkNPU0YgMQorIyBkZWZpbmUgc2luY29zZiBfc2luY29zZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TSU5DT1NMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lOQ09TTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOQ09TTCAxCisjIGRlZmluZSBzaW5jb3NsIF9zaW5jb3NsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NJTkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9TSU5GKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5GIDEKKyMgZGVmaW5lIHNpbmYgX3NpbmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU0lOSEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9TSU5IRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOSEYgMQorIyBkZWZpbmUgc2luaGYgX3NpbmhmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NJTkhMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lOSEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkhMIDEKKyMgZGVmaW5lIHNpbmhsIF9zaW5obAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TSU5MKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lOTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOTCAxCisjIGRlZmluZSBzaW5sIF9zaW5sCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NRUlRGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU1FSVEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NRUlRGIDEKKyMgZGVmaW5lIHNxcnRmIF9zcXJ0ZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TUVJUTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NRUlRMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TUVJUTCAxCisjIGRlZmluZSBzcXJ0bCBfc3FydGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU1RSVE9GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU1RSVE9GKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJUT0YgMQorIyBkZWZpbmUgc3RydG9mIF9zdHJ0b2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU1RSVE9MRCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NUUlRPTEQpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NUUlRPTEQgMQorIyBkZWZpbmUgc3RydG9sZCBfc3RydG9sZAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19UQU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfVEFORikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfVEFORiAxCisjIGRlZmluZSB0YW5mIF90YW5mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1RBTkhGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfVEFOSEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkhGIDEKKyMgZGVmaW5lIHRhbmhmIF90YW5oZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19UQU5ITCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1RBTkhMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5ITCAxCisjIGRlZmluZSB0YW5obCBfdGFuaGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fVEFOTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1RBTkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkwgMQorIyBkZWZpbmUgdGFubCBfdGFubAorI2VuZGlmCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9DWFhfQ09ORklHX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYysraW8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYysraW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzhjMTg2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jKytpby5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vIFVuZGVybHlpbmcgaW8gbGlicmFyeSBkZXRhaWxzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2MrK2lvLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3N9CisgKi8KKworLy8gY19pb19zdGRpby5oIC0gRGVmaW5lcyBmb3IgdXNpbmcgIkMiIHN0ZGlvLmgKKworI2lmbmRlZiBfR0xJQkNYWF9DWFhfSU9fSAorI2RlZmluZSBfR0xJQkNYWF9DWFhfSU9fSCAxCisKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Yml0cy9ndGhyLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0eXBlZGVmIF9fZ3RocmVhZF9tdXRleF90IF9fY19sb2NrOworCisgIC8vIGZvciBiYXNpY19maWxlLmgKKyAgdHlwZWRlZiBGSUxFIF9fY19maWxlOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jKytsb2NhbGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYysrbG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4ZDk3OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYysrbG9jYWxlLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8vIFdyYXBwZXIgZm9yIHVuZGVybHlpbmcgQy1sYW5ndWFnZSBsb2NhbGl6YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvYysrbG9jYWxlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjggIFN0YW5kYXJkIGxvY2FsZSBjYXRlZ29yaWVzLgorLy8KKworLy8gV3JpdHRlbiBieSBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKworI2lmbmRlZiBfR0xJQkNYWF9DWFhfTE9DQUxFX0gKKyNkZWZpbmUgX0dMSUJDWFhfQ1hYX0xPQ0FMRV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Y2xvY2FsZT4KKworI2RlZmluZSBfR0xJQkNYWF9DX0xPQ0FMRV9HTlUgMQorCisjZGVmaW5lIF9HTElCQ1hYX05VTV9DQVRFR09SSUVTIDYKKworI2lmIF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+IDIpCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgZXh0ZXJuICJDIiBfX3R5cGVvZih1c2Vsb2NhbGUpIF9fdXNlbG9jYWxlOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHR5cGVkZWYgX19sb2NhbGVfdAkJX19jX2xvY2FsZTsKKworICAvLyBDb252ZXJ0IG51bWVyaWMgdmFsdWUgb2YgdHlwZSBkb3VibGUgYW5kIGxvbmcgZG91YmxlIHRvIHN0cmluZyBhbmQKKyAgLy8gcmV0dXJuIGxlbmd0aCBvZiBzdHJpbmcuICBJZiB2c25wcmludGYgaXMgYXZhaWxhYmxlIHVzZSBpdCwgb3RoZXJ3aXNlCisgIC8vIGZhbGwgYmFjayB0byB0aGUgdW5zYWZlIHZzcHJpbnRmIHdoaWNoLCBpbiBnZW5lcmFsLCBjYW4gYmUgZGFuZ2Vyb3VzCisgIC8vIGFuZCBzaG91bGQgYmUgYXZvaWRlZC4KKyAgaW5saW5lIGludAorICBfX2NvbnZlcnRfZnJvbV92KGNvbnN0IF9fY19sb2NhbGUmIF9fY2xvYyBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpLAorCQkgICBjaGFyKiBfX291dCwKKwkJICAgY29uc3QgaW50IF9fc2l6ZSBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpLAorCQkgICBjb25zdCBjaGFyKiBfX2ZtdCwgLi4uKQorICB7CisjaWYgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID4gMikKKyAgICBfX2NfbG9jYWxlIF9fb2xkID0gX19nbnVfY3h4OjpfX3VzZWxvY2FsZShfX2Nsb2MpOworI2Vsc2UKKyAgICBjaGFyKiBfX29sZCA9IHN0ZDo6c2V0bG9jYWxlKExDX05VTUVSSUMsIDApOworICAgIGNoYXIqIF9fc2F2ID0gMDsKKyAgICBpZiAoX19idWlsdGluX3N0cmNtcChfX29sZCwgIkMiKSkKKyAgICAgIHsKKwljb25zdCBzaXplX3QgX19sZW4gPSBfX2J1aWx0aW5fc3RybGVuKF9fb2xkKSArIDE7CisJX19zYXYgPSBuZXcgY2hhcltfX2xlbl07CisJX19idWlsdGluX21lbWNweShfX3NhdiwgX19vbGQsIF9fbGVuKTsKKwlzdGQ6OnNldGxvY2FsZShMQ19OVU1FUklDLCAiQyIpOworICAgICAgfQorI2VuZGlmCisKKyAgICBfX2J1aWx0aW5fdmFfbGlzdCBfX2FyZ3M7CisgICAgX19idWlsdGluX3ZhX3N0YXJ0KF9fYXJncywgX19mbXQpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OQorICAgIGNvbnN0IGludCBfX3JldCA9IF9fYnVpbHRpbl92c25wcmludGYoX19vdXQsIF9fc2l6ZSwgX19mbXQsIF9fYXJncyk7CisjZWxzZQorICAgIGNvbnN0IGludCBfX3JldCA9IF9fYnVpbHRpbl92c3ByaW50ZihfX291dCwgX19mbXQsIF9fYXJncyk7CisjZW5kaWYKKworICAgIF9fYnVpbHRpbl92YV9lbmQoX19hcmdzKTsKKworI2lmIF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+IDIpCisgICAgX19nbnVfY3h4OjpfX3VzZWxvY2FsZShfX29sZCk7CisjZWxzZQorICAgIGlmIChfX3NhdikKKyAgICAgIHsKKwlzdGQ6OnNldGxvY2FsZShMQ19OVU1FUklDLCBfX3Nhdik7CisJZGVsZXRlIFtdIF9fc2F2OworICAgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIF9fcmV0OworICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2NwdV9kZWZpbmVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2NwdV9kZWZpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4MWQzZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvY3B1X2RlZmluZXMuaApAQCAtMCwwICsxLDMzIEBACisvLyBTcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgZ2VuZXJpYyBwbGF0Zm9ybXMgIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2NwdV9kZWZpbmVzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3Nmd2R9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9DUFVfREVGSU5FUworI2RlZmluZSBfR0xJQkNYWF9DUFVfREVGSU5FUyAxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jdHlwZV9iYXNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2N0eXBlX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDhlOTc4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jdHlwZV9iYXNlLmgKQEAgLTAsMCArMSw2MyBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvY3R5cGVfYmFzZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4xICBMb2NhbGVzCisvLworCisvLyBJbmZvcm1hdGlvbiBhcyBnbGVhbmVkIGZyb20gL3Vzci9pbmNsdWRlL2N0eXBlLmgKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vLyBAYnJpZWYgIEJhc2UgY2xhc3MgZm9yIGN0eXBlLgorICBzdHJ1Y3QgY3R5cGVfYmFzZQorICB7CisgICAgLy8gTm9uLXN0YW5kYXJkIHR5cGVkZWZzLgorICAgIHR5cGVkZWYgY29uc3QgaW50KiAJCV9fdG9fdHlwZTsKKworICAgIC8vIE5COiBPZmZzZXRzIGludG8gY3R5cGU8Y2hhcj46Ol9NX3RhYmxlIGZvcmNlIGEgcGFydGljdWxhciBzaXplCisgICAgLy8gb24gdGhlIG1hc2sgdHlwZS4gQmVjYXVzZSBvZiB0aGlzLCB3ZSBkb24ndCB1c2UgYW4gZW51bS4KKyAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IAltYXNrOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHVwcGVyICAgIAk9IF9JU3VwcGVyOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGxvd2VyIAk9IF9JU2xvd2VyOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGFscGhhIAk9IF9JU2FscGhhOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGRpZ2l0IAk9IF9JU2RpZ2l0OworICAgIHN0YXRpYyBjb25zdCBtYXNrIHhkaWdpdCAJPSBfSVN4ZGlnaXQ7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgc3BhY2UgCT0gX0lTc3BhY2U7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgcHJpbnQgCT0gX0lTcHJpbnQ7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgZ3JhcGggCT0gX0lTYWxwaGEgfCBfSVNkaWdpdCB8IF9JU3B1bmN0OworICAgIHN0YXRpYyBjb25zdCBtYXNrIGNudHJsIAk9IF9JU2NudHJsOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHB1bmN0IAk9IF9JU3B1bmN0OworICAgIHN0YXRpYyBjb25zdCBtYXNrIGFsbnVtIAk9IF9JU2FscGhhIHwgX0lTZGlnaXQ7CisgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvY3R5cGVfaW5saW5lLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2N0eXBlX2lubGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NjMxN2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2N0eXBlX2lubGluZS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vIExvY2FsZSBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2N0eXBlX2lubGluZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4xICBMb2NhbGVzCisvLworCisvLyBjdHlwZSBiaXRzIHRvIGJlIGlubGluZWQgZ28gaGVyZS4gTm9uLWlubGluYWJsZSAoaWUgdmlydHVhbCBkb18qKQorLy8gZnVuY3Rpb25zIGdvIGluIGN0eXBlLmNjCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICBib29sCisgIGN0eXBlPGNoYXI+OjoKKyAgaXMobWFzayBfX20sIGNoYXIgX19jKSBjb25zdAorICB7IHJldHVybiBfTV90YWJsZVtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihfX2MpXSAmIF9fbTsgfQorCisgIGNvbnN0IGNoYXIqCisgIGN0eXBlPGNoYXI+OjoKKyAgaXMoY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCwgbWFzayogX192ZWMpIGNvbnN0CisgIHsKKyAgICB3aGlsZSAoX19sb3cgPCBfX2hpZ2gpCisgICAgICAqX192ZWMrKyA9IF9NX3RhYmxlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCpfX2xvdysrKV07CisgICAgcmV0dXJuIF9faGlnaDsKKyAgfQorCisgIGNvbnN0IGNoYXIqCisgIGN0eXBlPGNoYXI+OjoKKyAgc2Nhbl9pcyhtYXNrIF9fbSwgY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3QKKyAgeworICAgIHdoaWxlIChfX2xvdyA8IF9faGlnaAorCSAgICYmICEoX01fdGFibGVbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKl9fbG93KV0gJiBfX20pKQorICAgICAgKytfX2xvdzsKKyAgICByZXR1cm4gX19sb3c7CisgIH0KKworICBjb25zdCBjaGFyKgorICBjdHlwZTxjaGFyPjo6CisgIHNjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoKSBjb25zdAorICB7CisgICAgd2hpbGUgKF9fbG93IDwgX19oaWdoCisJICAgJiYgKF9NX3RhYmxlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCpfX2xvdyldICYgX19tKSAhPSAwKQorICAgICAgKytfX2xvdzsKKyAgICByZXR1cm4gX19sb3c7CisgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jeHhhYmlfdHdlYWtzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2N4eGFiaV90d2Vha3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTg5NTM5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jeHhhYmlfdHdlYWtzLmgKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29udHJvbCB2YXJpb3VzIHRhcmdldCBzcGVjaWZpYyBBQkkgdHdlYWtzLiAgR2VuZXJpYyB2ZXJzaW9uLgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jeHhhYmlfdHdlYWtzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtjeHhhYmkuaH0KKyAqLworCisjaWZuZGVmIF9DWFhBQklfVFdFQUtTX0gKKyNkZWZpbmUgX0NYWEFCSV9UV0VBS1NfSCAxCisKKyNpZmRlZiBfX2NwbHVzcGx1cworbmFtZXNwYWNlIF9fY3h4YWJpdjEKK3sKKyAgZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmCisKKyAgLy8gVGhlIGdlbmVyaWMgQUJJIHVzZXMgdGhlIGZpcnN0IGJ5dGUgb2YgYSA2NC1iaXQgZ3VhcmQgdmFyaWFibGUuCisjZGVmaW5lIF9HTElCQ1hYX0dVQVJEX1RFU1QoeCkgKCooY2hhciAqKSAoeCkgIT0gMCkKKyNkZWZpbmUgX0dMSUJDWFhfR1VBUkRfU0VUKHgpICooY2hhciAqKSAoeCkgPSAxCisjZGVmaW5lIF9HTElCQ1hYX0dVQVJEX0JJVCBfX2d1YXJkX3Rlc3RfYml0ICgwLCAxKQorI2RlZmluZSBfR0xJQkNYWF9HVUFSRF9QRU5ESU5HX0JJVCBfX2d1YXJkX3Rlc3RfYml0ICgxLCAxKQorI2RlZmluZSBfR0xJQkNYWF9HVUFSRF9XQUlUSU5HX0JJVCBfX2d1YXJkX3Rlc3RfYml0ICgyLCAxKQorICBfX2V4dGVuc2lvbl9fIHR5cGVkZWYgaW50IF9fZ3VhcmQgX19hdHRyaWJ1dGVfXygobW9kZSAoX19ESV9fKSkpOworCisgIC8vIF9fY3hhX3ZlY19jdG9yIGhhcyB2b2lkIHJldHVybiB0eXBlLgorICB0eXBlZGVmIHZvaWQgX19jeGFfdmVjX2N0b3JfcmV0dXJuX3R5cGU7CisjZGVmaW5lIF9HTElCQ1hYX0NYQV9WRUNfQ1RPUl9SRVRVUk4oeCkgcmV0dXJuCisgIC8vIENvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgZG8gbm90IHJldHVybiBhIHZhbHVlLgorICB0eXBlZGVmIHZvaWQgX19jeGFfY2R0b3JfcmV0dXJuX3R5cGU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICB9Cit9IC8vIG5hbWVzcGFjZSBfX2N4eGFiaXYxCisjZW5kaWYKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9lcnJvcl9jb25zdGFudHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvZXJyb3JfY29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2ZDg4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvZXJyb3JfY29uc3RhbnRzLmgKQEAgLTAsMCArMSwxNzggQEAKKy8vIFNwZWNpZmljIGRlZmluaXRpb25zIGZvciBnZW5lcmljIHBsYXRmb3JtcyAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvZXJyb3JfY29uc3RhbnRzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtzeXN0ZW1fZXJyb3J9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9FUlJPUl9DT05TVEFOVFMKKyNkZWZpbmUgX0dMSUJDWFhfRVJST1JfQ09OU1RBTlRTIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Y2Vycm5vPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgZW51bSBjbGFzcyBlcnJjCisgICAgeworICAgICAgYWRkcmVzc19mYW1pbHlfbm90X3N1cHBvcnRlZCA9IAkJRUFGTk9TVVBQT1JULAorICAgICAgYWRkcmVzc19pbl91c2UgPSAJCQkJRUFERFJJTlVTRSwKKyAgICAgIGFkZHJlc3Nfbm90X2F2YWlsYWJsZSA9IAkJCUVBRERSTk9UQVZBSUwsCisgICAgICBhbHJlYWR5X2Nvbm5lY3RlZCA9IAkJCUVJU0NPTk4sCisgICAgICBhcmd1bWVudF9saXN0X3Rvb19sb25nID0gCQkJRTJCSUcsCisgICAgICBhcmd1bWVudF9vdXRfb2ZfZG9tYWluID0gCQkJRURPTSwKKyAgICAgIGJhZF9hZGRyZXNzID0gCQkJCUVGQVVMVCwKKyAgICAgIGJhZF9maWxlX2Rlc2NyaXB0b3IgPSAJCQlFQkFERiwKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRUJBRE1TRworICAgICAgYmFkX21lc3NhZ2UgPSAJCQkJRUJBRE1TRywKKyNlbmRpZgorCisgICAgICBicm9rZW5fcGlwZSA9IAkJCQlFUElQRSwKKyAgICAgIGNvbm5lY3Rpb25fYWJvcnRlZCA9IAkJCUVDT05OQUJPUlRFRCwKKyAgICAgIGNvbm5lY3Rpb25fYWxyZWFkeV9pbl9wcm9ncmVzcyA9IAkJRUFMUkVBRFksCisgICAgICBjb25uZWN0aW9uX3JlZnVzZWQgPSAJCQlFQ09OTlJFRlVTRUQsCisgICAgICBjb25uZWN0aW9uX3Jlc2V0ID0gCQkJRUNPTk5SRVNFVCwKKyAgICAgIGNyb3NzX2RldmljZV9saW5rID0gCQkJRVhERVYsCisgICAgICBkZXN0aW5hdGlvbl9hZGRyZXNzX3JlcXVpcmVkID0gCQlFREVTVEFERFJSRVEsCisgICAgICBkZXZpY2Vfb3JfcmVzb3VyY2VfYnVzeSA9IAkJRUJVU1ksCisgICAgICBkaXJlY3Rvcnlfbm90X2VtcHR5ID0gCQkJRU5PVEVNUFRZLAorICAgICAgZXhlY3V0YWJsZV9mb3JtYXRfZXJyb3IgPSAJCUVOT0VYRUMsCisgICAgICBmaWxlX2V4aXN0cyA9IAkgICAgICAgCQkJRUVYSVNULAorICAgICAgZmlsZV90b29fbGFyZ2UgPSAJCQkJRUZCSUcsCisgICAgICBmaWxlbmFtZV90b29fbG9uZyA9IAkJCUVOQU1FVE9PTE9ORywKKyAgICAgIGZ1bmN0aW9uX25vdF9zdXBwb3J0ZWQgPSAJCQlFTk9TWVMsCisgICAgICBob3N0X3VucmVhY2hhYmxlID0gCQkJRUhPU1RVTlJFQUNILAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FSURSTQorICAgICAgaWRlbnRpZmllcl9yZW1vdmVkID0gCQkJRUlEUk0sCisjZW5kaWYKKworICAgICAgaWxsZWdhbF9ieXRlX3NlcXVlbmNlID0gCQkJRUlMU0VRLAorICAgICAgaW5hcHByb3ByaWF0ZV9pb19jb250cm9sX29wZXJhdGlvbiA9IAlFTk9UVFksCisgICAgICBpbnRlcnJ1cHRlZCA9IAkJCQlFSU5UUiwKKyAgICAgIGludmFsaWRfYXJndW1lbnQgPSAJCQlFSU5WQUwsCisgICAgICBpbnZhbGlkX3NlZWsgPSAJCQkJRVNQSVBFLAorICAgICAgaW9fZXJyb3IgPSAJCQkJRUlPLAorICAgICAgaXNfYV9kaXJlY3RvcnkgPSAJCQkJRUlTRElSLAorICAgICAgbWVzc2FnZV9zaXplID0gCQkJCUVNU0dTSVpFLAorICAgICAgbmV0d29ya19kb3duID0gCQkJCUVORVRET1dOLAorICAgICAgbmV0d29ya19yZXNldCA9IAkJCQlFTkVUUkVTRVQsCisgICAgICBuZXR3b3JrX3VucmVhY2hhYmxlID0gCQkJRU5FVFVOUkVBQ0gsCisgICAgICBub19idWZmZXJfc3BhY2UgPSAJCQlFTk9CVUZTLAorICAgICAgbm9fY2hpbGRfcHJvY2VzcyA9IAkJCUVDSElMRCwKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU5PTElOSworICAgICAgbm9fbGluayA9IAkJCQlFTk9MSU5LLAorI2VuZGlmCisKKyAgICAgIG5vX2xvY2tfYXZhaWxhYmxlID0gCQkJRU5PTENLLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FTk9EQVRBCisgICAgICBub19tZXNzYWdlX2F2YWlsYWJsZSA9IAkJCUVOT0RBVEEsIAorI2VuZGlmCisKKyAgICAgIG5vX21lc3NhZ2UgPSAJCQkJRU5PTVNHLCAKKyAgICAgIG5vX3Byb3RvY29sX29wdGlvbiA9IAkJCUVOT1BST1RPT1BULAorICAgICAgbm9fc3BhY2Vfb25fZGV2aWNlID0gCQkJRU5PU1BDLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FTk9TUgorICAgICAgbm9fc3RyZWFtX3Jlc291cmNlcyA9IAkJCUVOT1NSLAorI2VuZGlmCisKKyAgICAgIG5vX3N1Y2hfZGV2aWNlX29yX2FkZHJlc3MgPSAJCUVOWElPLAorICAgICAgbm9fc3VjaF9kZXZpY2UgPSAJCQkJRU5PREVWLAorICAgICAgbm9fc3VjaF9maWxlX29yX2RpcmVjdG9yeSA9IAkJRU5PRU5ULAorICAgICAgbm9fc3VjaF9wcm9jZXNzID0gCQkJRVNSQ0gsCisgICAgICBub3RfYV9kaXJlY3RvcnkgPSAJCQlFTk9URElSLAorICAgICAgbm90X2Ffc29ja2V0ID0gCQkJCUVOT1RTT0NLLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FTk9TVFIKKyAgICAgIG5vdF9hX3N0cmVhbSA9IAkJCQlFTk9TVFIsCisjZW5kaWYKKworICAgICAgbm90X2Nvbm5lY3RlZCA9IAkJCQlFTk9UQ09OTiwKKyAgICAgIG5vdF9lbm91Z2hfbWVtb3J5ID0gCQkJRU5PTUVNLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FTk9UU1VQCisgICAgICBub3Rfc3VwcG9ydGVkID0gCQkJCUVOT1RTVVAsCisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRUNBTkNFTEVECisgICAgICBvcGVyYXRpb25fY2FuY2VsZWQgPSAJCQlFQ0FOQ0VMRUQsCisjZW5kaWYKKworICAgICAgb3BlcmF0aW9uX2luX3Byb2dyZXNzID0gCQkJRUlOUFJPR1JFU1MsCisgICAgICBvcGVyYXRpb25fbm90X3Blcm1pdHRlZCA9IAkJRVBFUk0sCisgICAgICBvcGVyYXRpb25fbm90X3N1cHBvcnRlZCA9IAkJRU9QTk9UU1VQUCwKKyAgICAgIG9wZXJhdGlvbl93b3VsZF9ibG9jayA9IAkJCUVXT1VMREJMT0NLLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FT1dORVJERUFECisgICAgICBvd25lcl9kZWFkID0gCQkJCUVPV05FUkRFQUQsCisjZW5kaWYKKworICAgICAgcGVybWlzc2lvbl9kZW5pZWQgPSAJCQlFQUNDRVMsCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VQUk9UTworICAgICAgcHJvdG9jb2xfZXJyb3IgPSAJCQkJRVBST1RPLAorI2VuZGlmCisKKyAgICAgIHByb3RvY29sX25vdF9zdXBwb3J0ZWQgPSAJCQlFUFJPVE9OT1NVUFBPUlQsCisgICAgICByZWFkX29ubHlfZmlsZV9zeXN0ZW0gPSAJCQlFUk9GUywKKyAgICAgIHJlc291cmNlX2RlYWRsb2NrX3dvdWxkX29jY3VyID0gCQlFREVBRExLLAorICAgICAgcmVzb3VyY2VfdW5hdmFpbGFibGVfdHJ5X2FnYWluID0gCQlFQUdBSU4sCisgICAgICByZXN1bHRfb3V0X29mX3JhbmdlID0gCQkJRVJBTkdFLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FTk9UUkVDT1ZFUkFCTEUKKyAgICAgIHN0YXRlX25vdF9yZWNvdmVyYWJsZSA9IAkJCUVOT1RSRUNPVkVSQUJMRSwKKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FVElNRQorICAgICAgc3RyZWFtX3RpbWVvdXQgPSAJCQkJRVRJTUUsCisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRVRYVEJTWQorICAgICAgdGV4dF9maWxlX2J1c3kgPSAJCQkJRVRYVEJTWSwKKyNlbmRpZgorCisgICAgICB0aW1lZF9vdXQgPSAJCQkJRVRJTUVET1VULAorICAgICAgdG9vX21hbnlfZmlsZXNfb3Blbl9pbl9zeXN0ZW0gPSAJCUVORklMRSwKKyAgICAgIHRvb19tYW55X2ZpbGVzX29wZW4gPSAJCQlFTUZJTEUsCisgICAgICB0b29fbWFueV9saW5rcyA9IAkJCQlFTUxJTkssCisgICAgICB0b29fbWFueV9zeW1ib2xpY19saW5rX2xldmVscyA9IAkJRUxPT1AsCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VPVkVSRkxPVworICAgICAgdmFsdWVfdG9vX2xhcmdlID0gCQkJRU9WRVJGTE9XLAorI2VuZGlmCisKKyAgICAgIHdyb25nX3Byb3RvY29sX3R5cGUgPSAJCQlFUFJPVE9UWVBFCisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvZXh0YysrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2V4dGMrKy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTllZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2V4dGMrKy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vIEMrKyBpbmNsdWRlcyB1c2VkIGZvciBwcmVjb21waWxpbmcgZXh0ZW5zaW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0YysrLmgKKyAqICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGZpbGUgZm9yIGEgcHJlY29tcGlsZWQgaGVhZGVyLgorICovCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyNpbmNsdWRlIDxiaXRzL3N0ZHRyMWMrKy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxleHQvYWxnb3JpdGhtPgorI2luY2x1ZGUgPGV4dC9hcnJheV9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvYXRvbWljaXR5Lmg+CisjaW5jbHVkZSA8ZXh0L2JpdG1hcF9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvY2FzdC5oPgorI2luY2x1ZGUgPGV4dC9jb25jdXJyZW5jZS5oPgorI2luY2x1ZGUgPGV4dC9kZWJ1Z19hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvZXh0cHRyX2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGV4dC9mdW5jdGlvbmFsPgorI2luY2x1ZGUgPGV4dC9pdGVyYXRvcj4KKyNpbmNsdWRlIDxleHQvbWFsbG9jX2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGV4dC9tZW1vcnk+CisjaW5jbHVkZSA8ZXh0L210X2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGV4dC9uZXdfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L251bWVyaWM+CisjaW5jbHVkZSA8ZXh0L3BvZF9jaGFyX3RyYWl0cy5oPgorI2luY2x1ZGUgPGV4dC9wb2ludGVyLmg+CisjaW5jbHVkZSA8ZXh0L3Bvb2xfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L3JiX3RyZWU+CisjaW5jbHVkZSA8ZXh0L3JvcGU+CisjaW5jbHVkZSA8ZXh0L3NsaXN0PgorI2luY2x1ZGUgPGV4dC9zdGRpb19maWxlYnVmLmg+CisjaW5jbHVkZSA8ZXh0L3N0ZGlvX3N5bmNfZmlsZWJ1Zi5oPgorI2luY2x1ZGUgPGV4dC90aHJvd19hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvdHlwZWxpc3QuaD4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvdnN0cmluZy5oPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9wcmlvcml0eV9xdWV1ZS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2V4Y2VwdGlvbi5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2hhc2hfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvbGlzdF91cGRhdGVfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90cmllX3BvbGljeS5ocHA+CisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0lDT05WCisgI2luY2x1ZGUgPGV4dC9jb2RlY3Z0X3NwZWNpYWxpemF0aW9ucy5oPgorICNpbmNsdWRlIDxleHQvZW5jX2ZpbGVidWYuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9ndGhyLWRlZmF1bHQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvZ3Roci1kZWZhdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3MWIxOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvZ3Roci1kZWZhdWx0LmgKQEAgLTAsMCArMSw4ODkgQEAKKy8qIFRocmVhZHMgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgbGliZ2NjMiBhbmQgbGlib2JqYy4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9HTElCQ1hYX0dDQ19HVEhSX1BPU0lYX0gKKyNkZWZpbmUgX0dMSUJDWFhfR0NDX0dUSFJfUE9TSVhfSAorCisvKiBQT1NJWCB0aHJlYWRzIHNwZWNpZmljIGRlZmluaXRpb25zLgorICAgRWFzeSwgc2luY2UgdGhlIGludGVyZmFjZSBpcyBqdXN0IG9uZS10by1vbmUgbWFwcGluZy4gICovCisKKyNkZWZpbmUgX19HVEhSRUFEUyAxCisjZGVmaW5lIF9fR1RIUkVBRFNfQ1hYMFggMQorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaWYgKChkZWZpbmVkKF9MSUJPQkpDKSB8fCBkZWZpbmVkKF9MSUJPQkpDX1dFQUspKSBcCisgICAgIHx8ICFkZWZpbmVkKF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0spKQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaWYgZGVmaW5lZChfUE9TSVhfVElNRU9VVFMpICYmIF9QT1NJWF9USU1FT1VUUyA+PSAwCisjICBkZWZpbmUgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSyAxCisjIGVsc2UKKyMgIGRlZmluZSBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLIDAKKyMgZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHB0aHJlYWRfdCBfX2d0aHJlYWRfdDsKK3R5cGVkZWYgcHRocmVhZF9rZXlfdCBfX2d0aHJlYWRfa2V5X3Q7Cit0eXBlZGVmIHB0aHJlYWRfb25jZV90IF9fZ3RocmVhZF9vbmNlX3Q7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBfX2d0aHJlYWRfbXV0ZXhfdDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdDsKK3R5cGVkZWYgcHRocmVhZF9jb25kX3QgX19ndGhyZWFkX2NvbmRfdDsKK3R5cGVkZWYgc3RydWN0IHRpbWVzcGVjIF9fZ3RocmVhZF90aW1lX3Q7CisKKy8qIFBPU0lYIGxpa2UgY29uZGl0aW9uYWwgdmFyaWFibGVzIGFyZSBzdXBwb3J0ZWQuICBQbGVhc2UgbG9vayBhdCBjb21tZW50cworICAgaW4gZ3Roci5oIGZvciBkZXRhaWxzLiAqLworI2RlZmluZSBfX0dUSFJFQURfSEFTX0NPTkQJMQorCisjZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIKKyNkZWZpbmUgX19HVEhSRUFEX01VVEVYX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX211dGV4X2luaXRfZnVuY3Rpb24KKyNkZWZpbmUgX19HVEhSRUFEX09OQ0VfSU5JVCBQVEhSRUFEX09OQ0VfSU5JVAorI2lmIGRlZmluZWQoUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVIpCisjZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVCBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUgorI2VsaWYgZGVmaW5lZChQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkKKyNkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QCisjZWxzZQorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9pbml0X2Z1bmN0aW9uCisjZW5kaWYKKyNkZWZpbmUgX19HVEhSRUFEX0NPTkRfSU5JVCBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVIKKyNkZWZpbmUgX19HVEhSRUFEX1RJTUVfSU5JVCB7MCwwfQorCisjaWZkZWYgX0dUSFJFQURfVVNFX01VVEVYX0lOSVRfRlVOQworIyB1bmRlZiBfX0dUSFJFQURfTVVURVhfSU5JVAorI2VuZGlmCisjaWZkZWYgX0dUSFJFQURfVVNFX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkMKKyMgdW5kZWYgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUCisjIHVuZGVmIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTgorIyBkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfaW5pdF9mdW5jdGlvbgorI2VuZGlmCisjaWZkZWYgX0dUSFJFQURfVVNFX0NPTkRfSU5JVF9GVU5DCisjIHVuZGVmIF9fR1RIUkVBRF9DT05EX0lOSVQKKyMgZGVmaW5lIF9fR1RIUkVBRF9DT05EX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX2NvbmRfaW5pdF9mdW5jdGlvbgorI2VuZGlmCisKKyNpZiBfX0dYWF9XRUFLX18gJiYgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSworIyBpZm5kZWYgX19ndGhyd19wcmFnbWEKKyMgIGRlZmluZSBfX2d0aHJ3X3ByYWdtYShwcmFnbWEpCisjIGVuZGlmCisjIGRlZmluZSBfX2d0aHJ3MihuYW1lLG5hbWUyLHR5cGUpIFwKKyAgc3RhdGljIF9fdHlwZW9mKHR5cGUpIG5hbWUgX19hdHRyaWJ1dGVfXyAoKF9fd2Vha3JlZl9fKCNuYW1lMikpKTsgXAorICBfX2d0aHJ3X3ByYWdtYSh3ZWFrIHR5cGUpCisjIGRlZmluZSBfX2d0aHJ3XyhuYW1lKSBfX2d0aHJ3XyAjIyBuYW1lCisjZWxzZQorIyBkZWZpbmUgX19ndGhydzIobmFtZSxuYW1lMix0eXBlKQorIyBkZWZpbmUgX19ndGhyd18obmFtZSkgbmFtZQorI2VuZGlmCisKKy8qIFR5cGljYWxseSwgX19ndGhyd19mb28gaXMgYSB3ZWFrIHJlZmVyZW5jZSB0byBzeW1ib2wgZm9vLiAgKi8KKyNkZWZpbmUgX19ndGhydyhuYW1lKSBfX2d0aHJ3MihfX2d0aHJ3XyAjIyBuYW1lLG5hbWUsbmFtZSkKKworX19ndGhydyhwdGhyZWFkX29uY2UpCitfX2d0aHJ3KHB0aHJlYWRfZ2V0c3BlY2lmaWMpCitfX2d0aHJ3KHB0aHJlYWRfc2V0c3BlY2lmaWMpCisKK19fZ3RocncocHRocmVhZF9jcmVhdGUpCitfX2d0aHJ3KHB0aHJlYWRfam9pbikKK19fZ3RocncocHRocmVhZF9lcXVhbCkKK19fZ3RocncocHRocmVhZF9zZWxmKQorX19ndGhydyhwdGhyZWFkX2RldGFjaCkKKyNpZm5kZWYgX19CSU9OSUNfXworX19ndGhydyhwdGhyZWFkX2NhbmNlbCkKKyNlbmRpZgorX19ndGhydyhzY2hlZF95aWVsZCkKKworX19ndGhydyhwdGhyZWFkX211dGV4X2xvY2spCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaykKKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKQorI2VuZGlmCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfdW5sb2NrKQorX19ndGhydyhwdGhyZWFkX211dGV4X2luaXQpCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkKKworX19ndGhydyhwdGhyZWFkX2NvbmRfaW5pdCkKK19fZ3RocncocHRocmVhZF9jb25kX2Jyb2FkY2FzdCkKK19fZ3RocncocHRocmVhZF9jb25kX3NpZ25hbCkKK19fZ3RocncocHRocmVhZF9jb25kX3dhaXQpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF90aW1lZHdhaXQpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9kZXN0cm95KQorCitfX2d0aHJ3KHB0aHJlYWRfa2V5X2NyZWF0ZSkKK19fZ3RocncocHRocmVhZF9rZXlfZGVsZXRlKQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9pbml0KQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KQorCisKKyNpZiBkZWZpbmVkKF9MSUJPQkpDKSB8fCBkZWZpbmVkKF9MSUJPQkpDX1dFQUspCisvKiBPYmplY3RpdmUtQy4gICovCitfX2d0aHJ3KHB0aHJlYWRfZXhpdCkKKyNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORworI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworX19ndGhydyhzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KQorX19ndGhydyhzY2hlZF9nZXRfcHJpb3JpdHlfbWluKQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HICovCitfX2d0aHJ3KHB0aHJlYWRfYXR0cl9kZXN0cm95KQorX19ndGhydyhwdGhyZWFkX2F0dHJfaW5pdCkKK19fZ3RocncocHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKQorI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworX19ndGhydyhwdGhyZWFkX2dldHNjaGVkcGFyYW0pCitfX2d0aHJ3KHB0aHJlYWRfc2V0c2NoZWRwYXJhbSkKKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfTElCT0JKQyB8fCBfTElCT0JKQ19XRUFLICovCisKKyNpZiBfX0dYWF9XRUFLX18gJiYgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSworCisvKiBPbiBTb2xhcmlzIDIuNiB1cCB0byA5LCB0aGUgbGliYyBleHBvc2VzIGEgUE9TSVggdGhyZWFkcyBpbnRlcmZhY2UgZXZlbiBpZgorICAgLXB0aHJlYWRzIGlzIG5vdCBzcGVjaWZpZWQuICBUaGUgZnVuY3Rpb25zIGFyZSBkdW1taWVzIGFuZCBtb3N0IHJldHVybiBhbgorICAgZXJyb3IgdmFsdWUuICBIb3dldmVyIHB0aHJlYWRfb25jZSByZXR1cm5zIDAgd2l0aG91dCBpbnZva2luZyB0aGUgcm91dGluZQorICAgaXQgaXMgcGFzc2VkIHNvIHdlIGNhbm5vdCBwcmV0ZW5kIHRoYXQgdGhlIGludGVyZmFjZSBpcyBhY3RpdmUgaWYgLXB0aHJlYWRzCisgICBpcyBub3Qgc3BlY2lmaWVkLiAgT24gU29sYXJpcyAyLjUuMSwgdGhlIGludGVyZmFjZSBpcyBub3QgZXhwb3NlZCBhdCBhbGwgc28KKyAgIHdlIG5lZWQgdG8gcGxheSB0aGUgdXN1YWwgZ2FtZSB3aXRoIHdlYWsgc3ltYm9scy4gIE9uIFNvbGFyaXMgMTAgYW5kIHVwLCBhCisgICB3b3JraW5nIGludGVyZmFjZSBpcyBhbHdheXMgZXhwb3NlZC4gIE9uIEZyZWVCU0QgNiBhbmQgbGF0ZXIsIGxpYmMgYWxzbworICAgZXhwb3NlcyBhIGR1bW15IFBPU0lYIHRocmVhZHMgaW50ZXJmYWNlLCBzaW1pbGFyIHRvIHdoYXQgU29sYXJpcyAyLjYgdXAKKyAgIHRvIDkgZG9lcy4gIEZyZWVCU0QgPj0gNzAwMDE0IGV2ZW4gcHJvdmlkZXMgYSBwdGhyZWFkX2NhbmNlbCBzdHViIGluIGxpYmMsCisgICB3aGljaCBtZWFucyB0aGUgYWx0ZXJuYXRlIF9fZ3RocmVhZF9hY3RpdmVfcCBiZWxvdyBjYW5ub3QgYmUgdXNlZCB0aGVyZS4gICovCisKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCAoZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfX3N2cjRfXykpCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgX19ndGhyZWFkX2FjdGl2ZSA9IC0xOworCitzdGF0aWMgdm9pZAorX19ndGhyZWFkX3RyaWdnZXIgKHZvaWQpCit7CisgIF9fZ3RocmVhZF9hY3RpdmUgPSAxOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICBzdGF0aWMgcHRocmVhZF9tdXRleF90IF9fZ3RocmVhZF9hY3RpdmVfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworICBzdGF0aWMgcHRocmVhZF9vbmNlX3QgX19ndGhyZWFkX2FjdGl2ZV9vbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CisKKyAgLyogQXZvaWQgcmVhZGluZyBfX2d0aHJlYWRfYWN0aXZlIHR3aWNlIG9uIHRoZSBtYWluIGNvZGUgcGF0aC4gICovCisgIGludCBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA9IF9fZ3RocmVhZF9hY3RpdmU7CisKKyAgLyogVGhpcyB0ZXN0IGlzIG5vdCBwcm90ZWN0ZWQgdG8gYXZvaWQgdGFraW5nIGEgbG9jayBvbiB0aGUgbWFpbiBjb2RlCisgICAgIHBhdGggc28gZXZlcnkgdXBkYXRlIG9mIF9fZ3RocmVhZF9hY3RpdmUgaW4gYSB0aHJlYWRlZCBwcm9ncmFtIG11c3QKKyAgICAgYmUgYXRvbWljIHdpdGggcmVnYXJkIHRvIHRoZSByZXN1bHQgb2YgdGhlIHRlc3QuICAqLworICBpZiAoX19idWlsdGluX2V4cGVjdCAoX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPCAwLCAwKSkKKyAgICB7CisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9vbmNlKSkKKwl7CisJICAvKiBJZiB0aGlzIHJlYWxseSBpcyBhIHRocmVhZGVkIHByb2dyYW0sIHRoZW4gd2UgbXVzdCBlbnN1cmUgdGhhdAorCSAgICAgX19ndGhyZWFkX2FjdGl2ZSBoYXMgYmVlbiBzZXQgdG8gMSBiZWZvcmUgZXhpdGluZyB0aGlzIGJsb2NrLiAgKi8KKwkgIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKCZfX2d0aHJlYWRfYWN0aXZlX211dGV4KTsKKwkgIF9fZ3RocndfKHB0aHJlYWRfb25jZSkgKCZfX2d0aHJlYWRfYWN0aXZlX29uY2UsIF9fZ3RocmVhZF90cmlnZ2VyKTsKKwkgIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoJl9fZ3RocmVhZF9hY3RpdmVfbXV0ZXgpOworCX0KKworICAgICAgLyogTWFrZSBzdXJlIHdlJ2xsIG5ldmVyIGVudGVyIHRoaXMgYmxvY2sgYWdhaW4uICAqLworICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmUgPCAwKQorCV9fZ3RocmVhZF9hY3RpdmUgPSAwOworCisgICAgICBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA9IF9fZ3RocmVhZF9hY3RpdmU7CisgICAgfQorCisgIHJldHVybiBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSAhPSAwOworfQorCisjZWxzZSAvKiBuZWl0aGVyIEZyZWVCU0Qgbm9yIFNvbGFyaXMgKi8KKworLyogRm9yIGEgcHJvZ3JhbSB0byBiZSBtdWx0aS10aHJlYWRlZCB0aGUgb25seSB0aGluZyB0aGF0IGl0IGNlcnRhaW5seSBtdXN0CisgICBiZSB1c2luZyBpcyBwdGhyZWFkX2NyZWF0ZS4gIEhvd2V2ZXIsIHRoZXJlIG1heSBiZSBvdGhlciBsaWJyYXJpZXMgdGhhdAorICAgaW50ZXJjZXB0IHB0aHJlYWRfY3JlYXRlIHdpdGggdGhlaXIgb3duIGRlZmluaXRpb25zIHRvIHdyYXAgcHRocmVhZHMKKyAgIGZ1bmN0aW9uYWxpdHkgZm9yIHNvbWUgcHVycG9zZS4gIEluIHRob3NlIGNhc2VzLCBwdGhyZWFkX2NyZWF0ZSBiZWluZworICAgZGVmaW5lZCBtaWdodCBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IGxpYnB0aHJlYWQgaXMgYWN0dWFsbHkgbGlua2VkCisgICBpbi4KKworICAgRm9yIHRoZSBHTlUgQyBsaWJyYXJ5LCB3ZSBjYW4gdXNlIGEga25vd24gaW50ZXJuYWwgbmFtZS4gIFRoaXMgaXMgYWx3YXlzCisgICBhdmFpbGFibGUgaW4gdGhlIEFCSSwgYnV0IG5vIG90aGVyIGxpYnJhcnkgd291bGQgZGVmaW5lIGl0LiAgVGhhdCBpcworICAgaWRlYWwsIHNpbmNlIGFueSBwdWJsaWMgcHRocmVhZCBmdW5jdGlvbiBtaWdodCBiZSBpbnRlcmNlcHRlZCBqdXN0IGFzCisgICBwdGhyZWFkX2NyZWF0ZSBtaWdodCBiZS4gIF9fcHRocmVhZF9rZXlfY3JlYXRlIGlzIGFuICJpbnRlcm5hbCIKKyAgIGltcGxlbWVudGF0aW9uIHN5bWJvbCwgYnV0IGl0IGlzIHBhcnQgb2YgdGhlIHB1YmxpYyBleHBvcnRlZCBBQkkuICBBbHNvLAorICAgaXQncyBhbW9uZyB0aGUgc3ltYm9scyB0aGF0IHRoZSBzdGF0aWMgbGlicHRocmVhZC5hIGFsd2F5cyBsaW5rcyBpbgorICAgd2hlbmV2ZXIgcHRocmVhZF9jcmVhdGUgaXMgdXNlZCwgc28gdGhlcmUgaXMgbm8gZGFuZ2VyIG9mIGEgZmFsc2UKKyAgIG5lZ2F0aXZlIHJlc3VsdCBpbiBhbnkgc3RhdGljYWxseS1saW5rZWQsIG11bHRpLXRocmVhZGVkIHByb2dyYW0uCisKKyAgIEZvciBvdGhlcnMsIHdlIGNob29zZSBwdGhyZWFkX2NhbmNlbCBhcyBhIGZ1bmN0aW9uIHRoYXQgc2VlbXMgdW5saWtlbHkKKyAgIHRvIGJlIHJlZGVmaW5lZCBieSBhbiBpbnRlcmNlcHRvciBsaWJyYXJ5LiAgVGhlIGJpb25pYyAoQW5kcm9pZCkgQworICAgbGlicmFyeSBkb2VzIG5vdCBwcm92aWRlIHB0aHJlYWRfY2FuY2VsLCBzbyB3ZSBkbyB1c2UgcHRocmVhZF9jcmVhdGUKKyAgIHRoZXJlIChhbmQgaW50ZXJjZXB0b3IgbGlicmFyaWVzIGxvc2UpLiAgKi8KKworI2lmZGVmIF9fR0xJQkNfXworX19ndGhydzIoX19ndGhyd18oX19wdGhyZWFkX2tleV9jcmVhdGUpLAorCSBfX3B0aHJlYWRfa2V5X2NyZWF0ZSwKKwkgcHRocmVhZF9rZXlfY3JlYXRlKQorIyBkZWZpbmUgR1RIUl9BQ1RJVkVfUFJPWFkJX19ndGhyd18oX19wdGhyZWFkX2tleV9jcmVhdGUpCisjZWxpZiBkZWZpbmVkIChfX0JJT05JQ19fKQorIyBkZWZpbmUgR1RIUl9BQ1RJVkVfUFJPWFkJX19ndGhyd18ocHRocmVhZF9jcmVhdGUpCisjZWxzZQorIyBkZWZpbmUgR1RIUl9BQ1RJVkVfUFJPWFkJX19ndGhyd18ocHRocmVhZF9jYW5jZWwpCisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgc3RhdGljIHZvaWQgKmNvbnN0IF9fZ3RocmVhZF9hY3RpdmVfcHRyCisgICAgPSBfX2V4dGVuc2lvbl9fICh2b2lkICopICZHVEhSX0FDVElWRV9QUk9YWTsKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfcHRyICE9IDA7Cit9CisKKyNlbmRpZiAvKiBGcmVlQlNEIG9yIFNvbGFyaXMgKi8KKworI2Vsc2UgLyogbm90IF9fR1hYX1dFQUtfXyAqLworCisvKiBTaW1pbGFyIHRvIFNvbGFyaXMsIEhQLVVYIDExIGZvciBQQS1SSVNDIHByb3ZpZGVzIHN0dWJzIGZvciBwdGhyZWFkCisgICBjYWxscyBpbiBzaGFyZWQgZmxhdm9ycyBvZiB0aGUgSFAtVVggQyBsaWJyYXJ5LiAgTW9zdCBvZiB0aGUgc3R1YnMKKyAgIGhhdmUgbm8gZnVuY3Rpb25hbGl0eS4gIFRoZSBkZXRhaWxzIGFyZSBkZXNjcmliZWQgaW4gdGhlICJsaWJjIGN1bXVsYXRpdmUKKyAgIHBhdGNoIiBmb3IgZWFjaCBzdWJ2ZXJzaW9uIG9mIEhQLVVYIDExLiAgVGhlcmUgYXJlIHR3byBzcGVjaWFsIGludGVyZmFjZXMKKyAgIHByb3ZpZGVkIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB0byBhIHNoYXJlZCBwdGhyZWFkCisgICBsaWJyYXJ5IG9yIG5vdC4gIEhvd2V2ZXIsIHRoZXNlIGludGVyZmFjZXMgYXJlbid0IGF2YWlsYWJsZSBpbiBlYXJseQorICAgbGlicHRocmVhZCBsaWJyYXJpZXMuICBXZSBhbHNvIG5lZWQgYSB0ZXN0IHRoYXQgd29ya3MgZm9yIGFyY2hpdmUKKyAgIGxpYnJhcmllcy4gIFdlIGNhbid0IHVzZSBwdGhyZWFkX29uY2UgYXMgc29tZSBsaWJjIHZlcnNpb25zIGNhbGwgdGhlCisgICBpbml0IGZ1bmN0aW9uLiAgV2UgYWxzbyBjYW4ndCB1c2UgcHRocmVhZF9jcmVhdGUgb3IgcHRocmVhZF9hdHRyX2luaXQKKyAgIGFzIHRoZXNlIGNyZWF0ZSBhIHRocmVhZCBhbmQgdGhlcmVieSBwcmV2ZW50IGNoYW5naW5nIHRoZSBkZWZhdWx0IHN0YWNrCisgICBzaXplLiAgVGhlIGZ1bmN0aW9uIHB0aHJlYWRfZGVmYXVsdF9zdGFja3NpemVfbnAgaXMgYXZhaWxhYmxlIGluIGJvdGgKKyAgIHRoZSBhcmNoaXZlIGFuZCBzaGFyZWQgdmVyc2lvbnMgb2YgbGlicHRocmVhZC4gICBJdCBjYW4gYmUgdXNlZCB0bworICAgZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHB0aHJlYWQgc3RhY2sgc2l6ZS4gIFRoZXJlIGlzIGEgc3R1YiBpbiBzb21lCisgICBzaGFyZWQgbGliYyB2ZXJzaW9ucyB3aGljaCByZXR1cm5zIGEgemVybyBzaXplIGlmIHB0aHJlYWRzIGFyZSBub3QKKyAgIGFjdGl2ZS4gIFdlIHByb3ZpZGUgYW4gZXF1aXZhbGVudCBzdHViIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBsaWJjCisgICBkb2Vzbid0IHByb3ZpZGUgb25lLiAgKi8KKworI2lmIGRlZmluZWQoX19ocHBhX18pICYmIGRlZmluZWQoX19ocHV4X18pCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgX19ndGhyZWFkX2FjdGl2ZSA9IC0xOworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICAvKiBBdm9pZCByZWFkaW5nIF9fZ3RocmVhZF9hY3RpdmUgdHdpY2Ugb24gdGhlIG1haW4gY29kZSBwYXRoLiAgKi8KKyAgaW50IF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgc2l6ZV90IF9fczsKKworICBpZiAoX19idWlsdGluX2V4cGVjdCAoX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPCAwLCAwKSkKKyAgICB7CisgICAgICBwdGhyZWFkX2RlZmF1bHRfc3RhY2tzaXplX25wICgwLCAmX19zKTsKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmUgPSBfX3MgPyAxIDogMDsKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgICB9CisKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlICE9IDA7Cit9CisKKyNlbHNlIC8qIG5vdCBocHBhLWhwdXggKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBocHBhLWhwdXggKi8KKworI2VuZGlmIC8qIF9fR1hYX1dFQUtfXyAqLworCisjaWZkZWYgX0xJQk9CSkMKKworLyogVGhpcyBpcyB0aGUgY29uZmlnLmggZmlsZSBpbiBsaWJvYmpjLyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZkZWYgSEFWRV9TQ0hFRF9ICisjIGluY2x1ZGUgPHNjaGVkLmg+CisjZW5kaWYKKworLyogS2V5IHN0cnVjdHVyZSBmb3IgbWFpbnRhaW5pbmcgdGhyZWFkIHNwZWNpZmljIHN0b3JhZ2UgKi8KK3N0YXRpYyBwdGhyZWFkX2tleV90IF9vYmpjX3RocmVhZF9zdG9yYWdlOworc3RhdGljIHB0aHJlYWRfYXR0cl90IF9vYmpjX3RocmVhZF9hdHRyaWJzOworCisvKiBUaHJlYWQgbG9jYWwgc3RvcmFnZSBmb3IgYSBzaW5nbGUgdGhyZWFkICovCitzdGF0aWMgdm9pZCAqdGhyZWFkX2xvY2FsX3N0b3JhZ2UgPSBOVUxMOworCisvKiBCYWNrZW5kIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworCisvKiBJbml0aWFsaXplIHRoZSB0aHJlYWRzIHN1YnN5c3RlbS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfaW5pdF90aHJlYWRfc3lzdGVtICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIHRocmVhZCBzdG9yYWdlIGtleS4gICovCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9rZXlfY3JlYXRlKSAoJl9vYmpjX3RocmVhZF9zdG9yYWdlLCBOVUxMKSA9PSAwKQorCXsKKwkgIC8qIFRoZSBub3JtYWwgZGVmYXVsdCBkZXRhY2ggc3RhdGUgZm9yIHRocmVhZHMgaXMKKwkgICAqIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHdoaWNoIGNhdXNlcyB0aHJlYWRzIHRvIG5vdCBkaWUKKwkgICAqIHdoZW4geW91IHRoaW5rIHRoZXkgc2hvdWxkLiAgKi8KKwkgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfaW5pdCkgKCZfb2JqY190aHJlYWRfYXR0cmlicykgPT0gMAorCSAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSkgKCZfb2JqY190aHJlYWRfYXR0cmlicywKKwkJCQkJICAgICAgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpID09IDApCisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgcmV0dXJuIC0xOworfQorCisvKiBDbG9zZSB0aGUgdGhyZWFkcyBzdWJzeXN0ZW0uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2Nsb3NlX3RocmVhZF9zeXN0ZW0gKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfa2V5X2RlbGV0ZSkgKF9vYmpjX3RocmVhZF9zdG9yYWdlKSA9PSAwCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfZGVzdHJveSkgKCZfb2JqY190aHJlYWRfYXR0cmlicykgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gLTE7Cit9CisKKy8qIEJhY2tlbmQgdGhyZWFkIGZ1bmN0aW9ucyAqLworCisvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIG9mIGV4ZWN1dGlvbi4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9kZXRhY2ggKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCit7CisgIG9iamNfdGhyZWFkX3QgdGhyZWFkX2lkOworICBwdGhyZWFkX3QgbmV3X3RocmVhZF9oYW5kbGU7CisKKyAgaWYgKCFfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCEoX19ndGhyd18ocHRocmVhZF9jcmVhdGUpICgmbmV3X3RocmVhZF9oYW5kbGUsICZfb2JqY190aHJlYWRfYXR0cmlicywKKwkJCQkgICh2b2lkICopIGZ1bmMsIGFyZykpKQorICAgIHRocmVhZF9pZCA9IChvYmpjX3RocmVhZF90KSBuZXdfdGhyZWFkX2hhbmRsZTsKKyAgZWxzZQorICAgIHRocmVhZF9pZCA9IE5VTEw7CisKKyAgcmV0dXJuIHRocmVhZF9pZDsKK30KKworLyogU2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X3ByaW9yaXR5IChpbnQgcHJpb3JpdHkpCit7CisgIGlmICghX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHsKKyNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORworI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworICAgICAgcHRocmVhZF90IHRocmVhZF9pZCA9IF9fZ3RocndfKHB0aHJlYWRfc2VsZikgKCk7CisgICAgICBpbnQgcG9saWN5OworICAgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtczsKKyAgICAgIGludCBwcmlvcml0eV9taW4sIHByaW9yaXR5X21heDsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSkgKHRocmVhZF9pZCwgJnBvbGljeSwgJnBhcmFtcykgPT0gMCkKKwl7CisJICBpZiAoKHByaW9yaXR5X21heCA9IF9fZ3RocndfKHNjaGVkX2dldF9wcmlvcml0eV9tYXgpIChwb2xpY3kpKSA9PSAtMSkKKwkgICAgcmV0dXJuIC0xOworCisJICBpZiAoKHByaW9yaXR5X21pbiA9IF9fZ3RocndfKHNjaGVkX2dldF9wcmlvcml0eV9taW4pIChwb2xpY3kpKSA9PSAtMSkKKwkgICAgcmV0dXJuIC0xOworCisJICBpZiAocHJpb3JpdHkgPiBwcmlvcml0eV9tYXgpCisJICAgIHByaW9yaXR5ID0gcHJpb3JpdHlfbWF4OworCSAgZWxzZSBpZiAocHJpb3JpdHkgPCBwcmlvcml0eV9taW4pCisJICAgIHByaW9yaXR5ID0gcHJpb3JpdHlfbWluOworCSAgcGFyYW1zLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHk7CisKKwkgIC8qCisJICAgKiBUaGUgc29sYXJpcyA3IGFuZCBzZXZlcmFsIG90aGVyIG1hbiBwYWdlcyBpbmNvcnJlY3RseSBzdGF0ZSB0aGF0CisJICAgKiB0aGlzIHNob3VsZCBiZSBhIHBvaW50ZXIgdG8gcG9saWN5IGJ1dCBwdGhyZWFkLmggaXMgdW5pdmVyc2FsbHkKKwkgICAqIGF0IG9kZHMgd2l0aCB0aGlzLgorCSAgICovCisJICBpZiAoX19ndGhyd18ocHRocmVhZF9zZXRzY2hlZHBhcmFtKSAodGhyZWFkX2lkLCBwb2xpY3ksICZwYXJhbXMpID09IDApCisJICAgIHJldHVybiAwOworCX0KKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORyAqLworICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZ2V0X3ByaW9yaXR5ICh2b2lkKQoreworI2lmZGVmIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaW50IHBvbGljeTsKKyAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbXM7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2dldHNjaGVkcGFyYW0pIChfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpLCAmcG9saWN5LCAmcGFyYW1zKSA9PSAwKQorCXJldHVybiBwYXJhbXMuc2NoZWRfcHJpb3JpdHk7CisgICAgICBlbHNlCisJcmV0dXJuIC0xOworICAgIH0KKyAgZWxzZQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisgICAgcmV0dXJuIE9CSkNfVEhSRUFEX0lOVEVSQUNUSVZFX1BSSU9SSVRZOworfQorCisvKiBZaWVsZCBvdXIgcHJvY2VzcyB0aW1lIHRvIGFub3RoZXIgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ndGhyZWFkX29iamNfdGhyZWFkX3lpZWxkICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIF9fZ3RocndfKHNjaGVkX3lpZWxkKSAoKTsKK30KKworLyogVGVybWluYXRlIHRoZSBjdXJyZW50IHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX2V4aXQgKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgLyogZXhpdCB0aGUgdGhyZWFkICovCisgICAgX19ndGhyd18ocHRocmVhZF9leGl0KSAoJl9fb2JqY190aHJlYWRfZXhpdF9zdGF0dXMpOworCisgIC8qIEZhaWxlZCBpZiB3ZSByZWFjaGVkIGhlcmUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBSZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgd2hpY2ggdW5pcXVlbHkgZGVzY3JpYmVzIGEgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgb2JqY190aHJlYWRfdAorX19ndGhyZWFkX29iamNfdGhyZWFkX2lkICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiAob2JqY190aHJlYWRfdCkgX19ndGhyd18ocHRocmVhZF9zZWxmKSAoKTsKKyAgZWxzZQorICAgIHJldHVybiAob2JqY190aHJlYWRfdCkgMTsKK30KKworLyogU2V0cyB0aGUgdGhyZWFkJ3MgbG9jYWwgc3RvcmFnZSBwb2ludGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X2RhdGEgKHZvaWQgKnZhbHVlKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NldHNwZWNpZmljKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UsIHZhbHVlKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHRocmVhZF9sb2NhbF9zdG9yYWdlID0gdmFsdWU7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIFJldHVybnMgdGhlIHRocmVhZCdzIGxvY2FsIHN0b3JhZ2UgcG9pbnRlci4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgKgorX19ndGhyZWFkX29iamNfdGhyZWFkX2dldF9kYXRhICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2dldHNwZWNpZmljKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UpOworICBlbHNlCisgICAgcmV0dXJuIHRocmVhZF9sb2NhbF9zdG9yYWdlOworfQorCisvKiBCYWNrZW5kIG11dGV4IGZ1bmN0aW9ucyAqLworCisvKiBBbGxvY2F0ZSBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9hbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIG11dGV4LT5iYWNrZW5kID0gb2JqY19tYWxsb2MgKHNpemVvZiAocHRocmVhZF9tdXRleF90KSk7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2luaXQpICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kLCBOVUxMKSkKKwl7CisJICBvYmpjX2ZyZWUgKG11dGV4LT5iYWNrZW5kKTsKKwkgIG11dGV4LT5iYWNrZW5kID0gTlVMTDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2RlYWxsb2NhdGUgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBpbnQgY291bnQ7CisKKyAgICAgIC8qCisgICAgICAgKiBQb3NpeCBUaHJlYWRzIHNwZWNpZmljYWxseSByZXF1aXJlIHRoYXQgdGhlIHRocmVhZCBiZSB1bmxvY2tlZAorICAgICAgICogZm9yIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkgdG8gd29yay4KKyAgICAgICAqLworCisgICAgICBkbworCXsKKwkgIGNvdW50ID0gX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKTsKKwkgIGlmIChjb3VudCA8IDApCisJICAgIHJldHVybiAtMTsKKwl9CisgICAgICB3aGlsZSAoY291bnQpOworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9tdXRleF9kZXN0cm95KSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkpCisJcmV0dXJuIC0xOworCisgICAgICBvYmpjX2ZyZWUgKG11dGV4LT5iYWNrZW5kKTsKKyAgICAgIG11dGV4LT5iYWNrZW5kID0gTlVMTDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBHcmFiIGEgbG9jayBvbiBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9sb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpICE9IDApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogVHJ5IHRvIGdyYWIgYSBsb2NrIG9uIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X3RyeWxvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9tdXRleF90cnlsb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBVbmxvY2sgdGhlIG11dGV4ICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfdW5sb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBCYWNrZW5kIGNvbmRpdGlvbiBtdXRleCBmdW5jdGlvbnMgKi8KKworLyogQWxsb2NhdGUgYSBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9hbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgY29uZGl0aW9uLT5iYWNrZW5kID0gb2JqY19tYWxsb2MgKHNpemVvZiAocHRocmVhZF9jb25kX3QpKTsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfY29uZF9pbml0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCwgTlVMTCkpCisJeworCSAgb2JqY19mcmVlIChjb25kaXRpb24tPmJhY2tlbmQpOworCSAgY29uZGl0aW9uLT5iYWNrZW5kID0gTlVMTDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fZGVhbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfY29uZF9kZXN0cm95KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCkpCisJcmV0dXJuIC0xOworCisgICAgICBvYmpjX2ZyZWUgKGNvbmRpdGlvbi0+YmFja2VuZCk7CisgICAgICBjb25kaXRpb24tPmJhY2tlbmQgPSBOVUxMOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl93YWl0IChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiwgb2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfd2FpdCkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQsCisJCQkgICAgICAocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBXYWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9icm9hZGNhc3QgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogV2FrZSB1cCBvbmUgdGhyZWFkIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9zaWduYWwgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfc2lnbmFsKSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UgLyogX0xJQk9CSkMgKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jcmVhdGUgKF9fZ3RocmVhZF90ICpfX3RocmVhZGlkLCB2b2lkICooKl9fZnVuYykgKHZvaWQqKSwKKwkJICB2b2lkICpfX2FyZ3MpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NyZWF0ZSkgKF9fdGhyZWFkaWQsIE5VTEwsIF9fZnVuYywgX19hcmdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9qb2luIChfX2d0aHJlYWRfdCBfX3RocmVhZGlkLCB2b2lkICoqX192YWx1ZV9wdHIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2pvaW4pIChfX3RocmVhZGlkLCBfX3ZhbHVlX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfZGV0YWNoIChfX2d0aHJlYWRfdCBfX3RocmVhZGlkKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9kZXRhY2gpIChfX3RocmVhZGlkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9lcXVhbCAoX19ndGhyZWFkX3QgX190MSwgX19ndGhyZWFkX3QgX190MikKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZXF1YWwpIChfX3QxLCBfX3QyKTsKK30KKworc3RhdGljIGlubGluZSBfX2d0aHJlYWRfdAorX19ndGhyZWFkX3NlbGYgKHZvaWQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3lpZWxkICh2b2lkKQoreworICByZXR1cm4gX19ndGhyd18oc2NoZWRfeWllbGQpICgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29uY2UgKF9fZ3RocmVhZF9vbmNlX3QgKl9fb25jZSwgdm9pZCAoKl9fZnVuYykgKHZvaWQpKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX29uY2UpIChfX29uY2UsIF9fZnVuYyk7CisgIGVsc2UKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfa2V5X2NyZWF0ZSAoX19ndGhyZWFkX2tleV90ICpfX2tleSwgdm9pZCAoKl9fZHRvcikgKHZvaWQgKikpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9jcmVhdGUpIChfX2tleSwgX19kdG9yKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9rZXlfZGVsZXRlIChfX2d0aHJlYWRfa2V5X3QgX19rZXkpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9kZWxldGUpIChfX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfX2d0aHJlYWRfZ2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZ2V0c3BlY2lmaWMpIChfX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfc2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSwgY29uc3Qgdm9pZCAqX19wdHIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NldHNwZWNpZmljKSAoX19rZXksIF9fcHRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2d0aHJlYWRfbXV0ZXhfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgX19ndGhyd18ocHRocmVhZF9tdXRleF9pbml0KSAoX19tdXRleCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfbG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaykgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3RpbWVkbG9jaykgKF9fbXV0ZXgsIF9fYWJzX3RpbWVvdXQpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3VubG9jaykgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiAhZGVmaW5lZCggUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlApIFwKKyAgfHwgZGVmaW5lZChfR1RIUkVBRF9VU0VfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQykKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2luaXRfZnVuY3Rpb24gKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBwdGhyZWFkX211dGV4YXR0cl90IF9fYXR0cjsKKyAgICAgIGludCBfX3I7CisKKyAgICAgIF9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQpICgmX19hdHRyKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpICgmX19hdHRyLAorCQkJCQkJICAgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUpOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleF9pbml0KSAoX19tdXRleCwgJl9fYXR0cik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KSAoJl9fYXR0cik7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfbG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X2xvY2sgKF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdHJ5bG9jayAoX19tdXRleCk7Cit9CisKKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90aW1lZGxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCwKKwkJCQkgICAgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKl9fYWJzX3RpbWVvdXQpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdGltZWRsb2NrIChfX211dGV4LCBfX2Fic190aW1lb3V0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19tdXRleCk7Cit9CisKKyNpZmRlZiBfR1RIUkVBRF9VU0VfQ09ORF9JTklUX0ZVTkMKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ndGhyZWFkX2NvbmRfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIF9fZ3RocndfKHB0aHJlYWRfY29uZF9pbml0KSAoX19jb25kLCBOVUxMKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfYnJvYWRjYXN0IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KSAoX19jb25kKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3NpZ25hbCAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3NpZ25hbCkgKF9fY29uZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF93YWl0IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQsIF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3dhaXQpIChfX2NvbmQsIF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfdGltZWR3YWl0IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQsIF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4LAorCQkJICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3RpbWVkd2FpdCkgKF9fY29uZCwgX19tdXRleCwgX19hYnNfdGltZW91dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF93YWl0X3JlY3Vyc2l2ZSAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kLAorCQkJICAgICAgIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9jb25kX3dhaXQgKF9fY29uZCwgX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF9kZXN0cm95IChfX2d0aHJlYWRfY29uZF90KiBfX2NvbmQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfZGVzdHJveSkgKF9fY29uZCk7Cit9CisKKyNlbmRpZiAvKiBfTElCT0JKQyAqLworCisjZW5kaWYgLyogISBfR0xJQkNYWF9HQ0NfR1RIUl9QT1NJWF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2d0aHItcG9zaXguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvZ3Roci1wb3NpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzFiMTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2d0aHItcG9zaXguaApAQCAtMCwwICsxLDg4OSBAQAorLyogVGhyZWFkcyBjb21wYXRpYmlsaXR5IHJvdXRpbmVzIGZvciBsaWJnY2MyIGFuZCBsaWJvYmpjLiAgKi8KKy8qIENvbXBpbGUgdGhpcyBvbmUgd2l0aCBnY2MuICAqLworLyogQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0dMSUJDWFhfR0NDX0dUSFJfUE9TSVhfSAorI2RlZmluZSBfR0xJQkNYWF9HQ0NfR1RIUl9QT1NJWF9ICisKKy8qIFBPU0lYIHRocmVhZHMgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisgICBFYXN5LCBzaW5jZSB0aGUgaW50ZXJmYWNlIGlzIGp1c3Qgb25lLXRvLW9uZSBtYXBwaW5nLiAgKi8KKworI2RlZmluZSBfX0dUSFJFQURTIDEKKyNkZWZpbmUgX19HVEhSRUFEU19DWFgwWCAxCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpZiAoKGRlZmluZWQoX0xJQk9CSkMpIHx8IGRlZmluZWQoX0xJQk9CSkNfV0VBSykpIFwKKyAgICAgfHwgIWRlZmluZWQoX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSykpCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpZiBkZWZpbmVkKF9QT1NJWF9USU1FT1VUUykgJiYgX1BPU0lYX1RJTUVPVVRTID49IDAKKyMgIGRlZmluZSBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLIDEKKyMgZWxzZQorIyAgZGVmaW5lIF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0sgMAorIyBlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgcHRocmVhZF90IF9fZ3RocmVhZF90OwordHlwZWRlZiBwdGhyZWFkX2tleV90IF9fZ3RocmVhZF9rZXlfdDsKK3R5cGVkZWYgcHRocmVhZF9vbmNlX3QgX19ndGhyZWFkX29uY2VfdDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IF9fZ3RocmVhZF9tdXRleF90OwordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90OwordHlwZWRlZiBwdGhyZWFkX2NvbmRfdCBfX2d0aHJlYWRfY29uZF90OwordHlwZWRlZiBzdHJ1Y3QgdGltZXNwZWMgX19ndGhyZWFkX3RpbWVfdDsKKworLyogUE9TSVggbGlrZSBjb25kaXRpb25hbCB2YXJpYWJsZXMgYXJlIHN1cHBvcnRlZC4gIFBsZWFzZSBsb29rIGF0IGNvbW1lbnRzCisgICBpbiBndGhyLmggZm9yIGRldGFpbHMuICovCisjZGVmaW5lIF9fR1RIUkVBRF9IQVNfQ09ORAkxCisKKyNkZWZpbmUgX19HVEhSRUFEX01VVEVYX0lOSVQgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgorI2RlZmluZSBfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTiBfX2d0aHJlYWRfbXV0ZXhfaW5pdF9mdW5jdGlvbgorI2RlZmluZSBfX0dUSFJFQURfT05DRV9JTklUIFBUSFJFQURfT05DRV9JTklUCisjaWYgZGVmaW5lZChQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUikKKyNkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSCisjZWxpZiBkZWZpbmVkKFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKQorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKKyNlbHNlCisjZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTiBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2luaXRfZnVuY3Rpb24KKyNlbmRpZgorI2RlZmluZSBfX0dUSFJFQURfQ09ORF9JTklUIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUgorI2RlZmluZSBfX0dUSFJFQURfVElNRV9JTklUIHswLDB9CisKKyNpZmRlZiBfR1RIUkVBRF9VU0VfTVVURVhfSU5JVF9GVU5DCisjIHVuZGVmIF9fR1RIUkVBRF9NVVRFWF9JTklUCisjZW5kaWYKKyNpZmRlZiBfR1RIUkVBRF9VU0VfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQworIyB1bmRlZiBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQKKyMgdW5kZWYgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OCisjIGRlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9pbml0X2Z1bmN0aW9uCisjZW5kaWYKKyNpZmRlZiBfR1RIUkVBRF9VU0VfQ09ORF9JTklUX0ZVTkMKKyMgdW5kZWYgX19HVEhSRUFEX0NPTkRfSU5JVAorIyBkZWZpbmUgX19HVEhSRUFEX0NPTkRfSU5JVF9GVU5DVElPTiBfX2d0aHJlYWRfY29uZF9pbml0X2Z1bmN0aW9uCisjZW5kaWYKKworI2lmIF9fR1hYX1dFQUtfXyAmJiBfR0xJQkNYWF9HVEhSRUFEX1VTRV9XRUFLCisjIGlmbmRlZiBfX2d0aHJ3X3ByYWdtYQorIyAgZGVmaW5lIF9fZ3RocndfcHJhZ21hKHByYWdtYSkKKyMgZW5kaWYKKyMgZGVmaW5lIF9fZ3RocncyKG5hbWUsbmFtZTIsdHlwZSkgXAorICBzdGF0aWMgX190eXBlb2YodHlwZSkgbmFtZSBfX2F0dHJpYnV0ZV9fICgoX193ZWFrcmVmX18oI25hbWUyKSkpOyBcCisgIF9fZ3RocndfcHJhZ21hKHdlYWsgdHlwZSkKKyMgZGVmaW5lIF9fZ3RocndfKG5hbWUpIF9fZ3RocndfICMjIG5hbWUKKyNlbHNlCisjIGRlZmluZSBfX2d0aHJ3MihuYW1lLG5hbWUyLHR5cGUpCisjIGRlZmluZSBfX2d0aHJ3XyhuYW1lKSBuYW1lCisjZW5kaWYKKworLyogVHlwaWNhbGx5LCBfX2d0aHJ3X2ZvbyBpcyBhIHdlYWsgcmVmZXJlbmNlIHRvIHN5bWJvbCBmb28uICAqLworI2RlZmluZSBfX2d0aHJ3KG5hbWUpIF9fZ3RocncyKF9fZ3RocndfICMjIG5hbWUsbmFtZSxuYW1lKQorCitfX2d0aHJ3KHB0aHJlYWRfb25jZSkKK19fZ3RocncocHRocmVhZF9nZXRzcGVjaWZpYykKK19fZ3RocncocHRocmVhZF9zZXRzcGVjaWZpYykKKworX19ndGhydyhwdGhyZWFkX2NyZWF0ZSkKK19fZ3RocncocHRocmVhZF9qb2luKQorX19ndGhydyhwdGhyZWFkX2VxdWFsKQorX19ndGhydyhwdGhyZWFkX3NlbGYpCitfX2d0aHJ3KHB0aHJlYWRfZGV0YWNoKQorI2lmbmRlZiBfX0JJT05JQ19fCitfX2d0aHJ3KHB0aHJlYWRfY2FuY2VsKQorI2VuZGlmCitfX2d0aHJ3KHNjaGVkX3lpZWxkKQorCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfbG9jaykKK19fZ3RocncocHRocmVhZF9tdXRleF90cnlsb2NrKQorI2lmIF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0sKK19fZ3RocncocHRocmVhZF9tdXRleF90aW1lZGxvY2spCisjZW5kaWYKK19fZ3RocncocHRocmVhZF9tdXRleF91bmxvY2spCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfaW5pdCkKK19fZ3RocncocHRocmVhZF9tdXRleF9kZXN0cm95KQorCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9pbml0KQorX19ndGhydyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KQorX19ndGhydyhwdGhyZWFkX2NvbmRfc2lnbmFsKQorX19ndGhydyhwdGhyZWFkX2NvbmRfd2FpdCkKK19fZ3RocncocHRocmVhZF9jb25kX3RpbWVkd2FpdCkKK19fZ3RocncocHRocmVhZF9jb25kX2Rlc3Ryb3kpCisKK19fZ3RocncocHRocmVhZF9rZXlfY3JlYXRlKQorX19ndGhydyhwdGhyZWFkX2tleV9kZWxldGUpCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQpCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpCisKKworI2lmIGRlZmluZWQoX0xJQk9CSkMpIHx8IGRlZmluZWQoX0xJQk9CSkNfV0VBSykKKy8qIE9iamVjdGl2ZS1DLiAgKi8KK19fZ3RocncocHRocmVhZF9leGl0KQorI2lmZGVmIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCitfX2d0aHJ3KHNjaGVkX2dldF9wcmlvcml0eV9tYXgpCitfX2d0aHJ3KHNjaGVkX2dldF9wcmlvcml0eV9taW4pCisjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisjZW5kaWYgLyogX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KK19fZ3RocncocHRocmVhZF9hdHRyX2Rlc3Ryb3kpCitfX2d0aHJ3KHB0aHJlYWRfYXR0cl9pbml0KQorX19ndGhydyhwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUpCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCitfX2d0aHJ3KHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSkKK19fZ3RocncocHRocmVhZF9zZXRzY2hlZHBhcmFtKQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9MSUJPQkpDIHx8IF9MSUJPQkpDX1dFQUsgKi8KKworI2lmIF9fR1hYX1dFQUtfXyAmJiBfR0xJQkNYWF9HVEhSRUFEX1VTRV9XRUFLCisKKy8qIE9uIFNvbGFyaXMgMi42IHVwIHRvIDksIHRoZSBsaWJjIGV4cG9zZXMgYSBQT1NJWCB0aHJlYWRzIGludGVyZmFjZSBldmVuIGlmCisgICAtcHRocmVhZHMgaXMgbm90IHNwZWNpZmllZC4gIFRoZSBmdW5jdGlvbnMgYXJlIGR1bW1pZXMgYW5kIG1vc3QgcmV0dXJuIGFuCisgICBlcnJvciB2YWx1ZS4gIEhvd2V2ZXIgcHRocmVhZF9vbmNlIHJldHVybnMgMCB3aXRob3V0IGludm9raW5nIHRoZSByb3V0aW5lCisgICBpdCBpcyBwYXNzZWQgc28gd2UgY2Fubm90IHByZXRlbmQgdGhhdCB0aGUgaW50ZXJmYWNlIGlzIGFjdGl2ZSBpZiAtcHRocmVhZHMKKyAgIGlzIG5vdCBzcGVjaWZpZWQuICBPbiBTb2xhcmlzIDIuNS4xLCB0aGUgaW50ZXJmYWNlIGlzIG5vdCBleHBvc2VkIGF0IGFsbCBzbworICAgd2UgbmVlZCB0byBwbGF5IHRoZSB1c3VhbCBnYW1lIHdpdGggd2VhayBzeW1ib2xzLiAgT24gU29sYXJpcyAxMCBhbmQgdXAsIGEKKyAgIHdvcmtpbmcgaW50ZXJmYWNlIGlzIGFsd2F5cyBleHBvc2VkLiAgT24gRnJlZUJTRCA2IGFuZCBsYXRlciwgbGliYyBhbHNvCisgICBleHBvc2VzIGEgZHVtbXkgUE9TSVggdGhyZWFkcyBpbnRlcmZhY2UsIHNpbWlsYXIgdG8gd2hhdCBTb2xhcmlzIDIuNiB1cAorICAgdG8gOSBkb2VzLiAgRnJlZUJTRCA+PSA3MDAwMTQgZXZlbiBwcm92aWRlcyBhIHB0aHJlYWRfY2FuY2VsIHN0dWIgaW4gbGliYywKKyAgIHdoaWNoIG1lYW5zIHRoZSBhbHRlcm5hdGUgX19ndGhyZWFkX2FjdGl2ZV9wIGJlbG93IGNhbm5vdCBiZSB1c2VkIHRoZXJlLiAgKi8KKworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IChkZWZpbmVkKF9fc3VuKSAmJiBkZWZpbmVkKF9fc3ZyNF9fKSkKKworc3RhdGljIHZvbGF0aWxlIGludCBfX2d0aHJlYWRfYWN0aXZlID0gLTE7CisKK3N0YXRpYyB2b2lkCitfX2d0aHJlYWRfdHJpZ2dlciAodm9pZCkKK3sKKyAgX19ndGhyZWFkX2FjdGl2ZSA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfYWN0aXZlX3AgKHZvaWQpCit7CisgIHN0YXRpYyBwdGhyZWFkX211dGV4X3QgX19ndGhyZWFkX2FjdGl2ZV9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCBfX2d0aHJlYWRfYWN0aXZlX29uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKworICAvKiBBdm9pZCByZWFkaW5nIF9fZ3RocmVhZF9hY3RpdmUgdHdpY2Ugb24gdGhlIG1haW4gY29kZSBwYXRoLiAgKi8KKyAgaW50IF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKworICAvKiBUaGlzIHRlc3QgaXMgbm90IHByb3RlY3RlZCB0byBhdm9pZCB0YWtpbmcgYSBsb2NrIG9uIHRoZSBtYWluIGNvZGUKKyAgICAgcGF0aCBzbyBldmVyeSB1cGRhdGUgb2YgX19ndGhyZWFkX2FjdGl2ZSBpbiBhIHRocmVhZGVkIHByb2dyYW0gbXVzdAorICAgICBiZSBhdG9taWMgd2l0aCByZWdhcmQgdG8gdGhlIHJlc3VsdCBvZiB0aGUgdGVzdC4gICovCisgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA8IDAsIDApKQorICAgIHsKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX29uY2UpKQorCXsKKwkgIC8qIElmIHRoaXMgcmVhbGx5IGlzIGEgdGhyZWFkZWQgcHJvZ3JhbSwgdGhlbiB3ZSBtdXN0IGVuc3VyZSB0aGF0CisJICAgICBfX2d0aHJlYWRfYWN0aXZlIGhhcyBiZWVuIHNldCB0byAxIGJlZm9yZSBleGl0aW5nIHRoaXMgYmxvY2suICAqLworCSAgX19ndGhyd18ocHRocmVhZF9tdXRleF9sb2NrKSAoJl9fZ3RocmVhZF9hY3RpdmVfbXV0ZXgpOworCSAgX19ndGhyd18ocHRocmVhZF9vbmNlKSAoJl9fZ3RocmVhZF9hY3RpdmVfb25jZSwgX19ndGhyZWFkX3RyaWdnZXIpOworCSAgX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spICgmX19ndGhyZWFkX2FjdGl2ZV9tdXRleCk7CisJfQorCisgICAgICAvKiBNYWtlIHN1cmUgd2UnbGwgbmV2ZXIgZW50ZXIgdGhpcyBibG9jayBhZ2Fpbi4gICovCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZSA8IDApCisJX19ndGhyZWFkX2FjdGl2ZSA9IDA7CisKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgICB9CisKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlICE9IDA7Cit9CisKKyNlbHNlIC8qIG5laXRoZXIgRnJlZUJTRCBub3IgU29sYXJpcyAqLworCisvKiBGb3IgYSBwcm9ncmFtIHRvIGJlIG11bHRpLXRocmVhZGVkIHRoZSBvbmx5IHRoaW5nIHRoYXQgaXQgY2VydGFpbmx5IG11c3QKKyAgIGJlIHVzaW5nIGlzIHB0aHJlYWRfY3JlYXRlLiAgSG93ZXZlciwgdGhlcmUgbWF5IGJlIG90aGVyIGxpYnJhcmllcyB0aGF0CisgICBpbnRlcmNlcHQgcHRocmVhZF9jcmVhdGUgd2l0aCB0aGVpciBvd24gZGVmaW5pdGlvbnMgdG8gd3JhcCBwdGhyZWFkcworICAgZnVuY3Rpb25hbGl0eSBmb3Igc29tZSBwdXJwb3NlLiAgSW4gdGhvc2UgY2FzZXMsIHB0aHJlYWRfY3JlYXRlIGJlaW5nCisgICBkZWZpbmVkIG1pZ2h0IG5vdCBuZWNlc3NhcmlseSBtZWFuIHRoYXQgbGlicHRocmVhZCBpcyBhY3R1YWxseSBsaW5rZWQKKyAgIGluLgorCisgICBGb3IgdGhlIEdOVSBDIGxpYnJhcnksIHdlIGNhbiB1c2UgYSBrbm93biBpbnRlcm5hbCBuYW1lLiAgVGhpcyBpcyBhbHdheXMKKyAgIGF2YWlsYWJsZSBpbiB0aGUgQUJJLCBidXQgbm8gb3RoZXIgbGlicmFyeSB3b3VsZCBkZWZpbmUgaXQuICBUaGF0IGlzCisgICBpZGVhbCwgc2luY2UgYW55IHB1YmxpYyBwdGhyZWFkIGZ1bmN0aW9uIG1pZ2h0IGJlIGludGVyY2VwdGVkIGp1c3QgYXMKKyAgIHB0aHJlYWRfY3JlYXRlIG1pZ2h0IGJlLiAgX19wdGhyZWFkX2tleV9jcmVhdGUgaXMgYW4gImludGVybmFsIgorICAgaW1wbGVtZW50YXRpb24gc3ltYm9sLCBidXQgaXQgaXMgcGFydCBvZiB0aGUgcHVibGljIGV4cG9ydGVkIEFCSS4gIEFsc28sCisgICBpdCdzIGFtb25nIHRoZSBzeW1ib2xzIHRoYXQgdGhlIHN0YXRpYyBsaWJwdGhyZWFkLmEgYWx3YXlzIGxpbmtzIGluCisgICB3aGVuZXZlciBwdGhyZWFkX2NyZWF0ZSBpcyB1c2VkLCBzbyB0aGVyZSBpcyBubyBkYW5nZXIgb2YgYSBmYWxzZQorICAgbmVnYXRpdmUgcmVzdWx0IGluIGFueSBzdGF0aWNhbGx5LWxpbmtlZCwgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbS4KKworICAgRm9yIG90aGVycywgd2UgY2hvb3NlIHB0aHJlYWRfY2FuY2VsIGFzIGEgZnVuY3Rpb24gdGhhdCBzZWVtcyB1bmxpa2VseQorICAgdG8gYmUgcmVkZWZpbmVkIGJ5IGFuIGludGVyY2VwdG9yIGxpYnJhcnkuICBUaGUgYmlvbmljIChBbmRyb2lkKSBDCisgICBsaWJyYXJ5IGRvZXMgbm90IHByb3ZpZGUgcHRocmVhZF9jYW5jZWwsIHNvIHdlIGRvIHVzZSBwdGhyZWFkX2NyZWF0ZQorICAgdGhlcmUgKGFuZCBpbnRlcmNlcHRvciBsaWJyYXJpZXMgbG9zZSkuICAqLworCisjaWZkZWYgX19HTElCQ19fCitfX2d0aHJ3MihfX2d0aHJ3XyhfX3B0aHJlYWRfa2V5X2NyZWF0ZSksCisJIF9fcHRocmVhZF9rZXlfY3JlYXRlLAorCSBwdGhyZWFkX2tleV9jcmVhdGUpCisjIGRlZmluZSBHVEhSX0FDVElWRV9QUk9YWQlfX2d0aHJ3XyhfX3B0aHJlYWRfa2V5X2NyZWF0ZSkKKyNlbGlmIGRlZmluZWQgKF9fQklPTklDX18pCisjIGRlZmluZSBHVEhSX0FDVElWRV9QUk9YWQlfX2d0aHJ3XyhwdGhyZWFkX2NyZWF0ZSkKKyNlbHNlCisjIGRlZmluZSBHVEhSX0FDVElWRV9QUk9YWQlfX2d0aHJ3XyhwdGhyZWFkX2NhbmNlbCkKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICBzdGF0aWMgdm9pZCAqY29uc3QgX19ndGhyZWFkX2FjdGl2ZV9wdHIKKyAgICA9IF9fZXh0ZW5zaW9uX18gKHZvaWQgKikgJkdUSFJfQUNUSVZFX1BST1hZOworICByZXR1cm4gX19ndGhyZWFkX2FjdGl2ZV9wdHIgIT0gMDsKK30KKworI2VuZGlmIC8qIEZyZWVCU0Qgb3IgU29sYXJpcyAqLworCisjZWxzZSAvKiBub3QgX19HWFhfV0VBS19fICovCisKKy8qIFNpbWlsYXIgdG8gU29sYXJpcywgSFAtVVggMTEgZm9yIFBBLVJJU0MgcHJvdmlkZXMgc3R1YnMgZm9yIHB0aHJlYWQKKyAgIGNhbGxzIGluIHNoYXJlZCBmbGF2b3JzIG9mIHRoZSBIUC1VWCBDIGxpYnJhcnkuICBNb3N0IG9mIHRoZSBzdHVicworICAgaGF2ZSBubyBmdW5jdGlvbmFsaXR5LiAgVGhlIGRldGFpbHMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgImxpYmMgY3VtdWxhdGl2ZQorICAgcGF0Y2giIGZvciBlYWNoIHN1YnZlcnNpb24gb2YgSFAtVVggMTEuICBUaGVyZSBhcmUgdHdvIHNwZWNpYWwgaW50ZXJmYWNlcworICAgcHJvdmlkZWQgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gYXBwbGljYXRpb24gaXMgbGlua2VkIHRvIGEgc2hhcmVkIHB0aHJlYWQKKyAgIGxpYnJhcnkgb3Igbm90LiAgSG93ZXZlciwgdGhlc2UgaW50ZXJmYWNlcyBhcmVuJ3QgYXZhaWxhYmxlIGluIGVhcmx5CisgICBsaWJwdGhyZWFkIGxpYnJhcmllcy4gIFdlIGFsc28gbmVlZCBhIHRlc3QgdGhhdCB3b3JrcyBmb3IgYXJjaGl2ZQorICAgbGlicmFyaWVzLiAgV2UgY2FuJ3QgdXNlIHB0aHJlYWRfb25jZSBhcyBzb21lIGxpYmMgdmVyc2lvbnMgY2FsbCB0aGUKKyAgIGluaXQgZnVuY3Rpb24uICBXZSBhbHNvIGNhbid0IHVzZSBwdGhyZWFkX2NyZWF0ZSBvciBwdGhyZWFkX2F0dHJfaW5pdAorICAgYXMgdGhlc2UgY3JlYXRlIGEgdGhyZWFkIGFuZCB0aGVyZWJ5IHByZXZlbnQgY2hhbmdpbmcgdGhlIGRlZmF1bHQgc3RhY2sKKyAgIHNpemUuICBUaGUgZnVuY3Rpb24gcHRocmVhZF9kZWZhdWx0X3N0YWNrc2l6ZV9ucCBpcyBhdmFpbGFibGUgaW4gYm90aAorICAgdGhlIGFyY2hpdmUgYW5kIHNoYXJlZCB2ZXJzaW9ucyBvZiBsaWJwdGhyZWFkLiAgIEl0IGNhbiBiZSB1c2VkIHRvCisgICBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgcHRocmVhZCBzdGFjayBzaXplLiAgVGhlcmUgaXMgYSBzdHViIGluIHNvbWUKKyAgIHNoYXJlZCBsaWJjIHZlcnNpb25zIHdoaWNoIHJldHVybnMgYSB6ZXJvIHNpemUgaWYgcHRocmVhZHMgYXJlIG5vdAorICAgYWN0aXZlLiAgV2UgcHJvdmlkZSBhbiBlcXVpdmFsZW50IHN0dWIgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIGxpYmMKKyAgIGRvZXNuJ3QgcHJvdmlkZSBvbmUuICAqLworCisjaWYgZGVmaW5lZChfX2hwcGFfXykgJiYgZGVmaW5lZChfX2hwdXhfXykKKworc3RhdGljIHZvbGF0aWxlIGludCBfX2d0aHJlYWRfYWN0aXZlID0gLTE7CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfYWN0aXZlX3AgKHZvaWQpCit7CisgIC8qIEF2b2lkIHJlYWRpbmcgX19ndGhyZWFkX2FjdGl2ZSB0d2ljZSBvbiB0aGUgbWFpbiBjb2RlIHBhdGguICAqLworICBpbnQgX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPSBfX2d0aHJlYWRfYWN0aXZlOworICBzaXplX3QgX19zOworCisgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA8IDAsIDApKQorICAgIHsKKyAgICAgIHB0aHJlYWRfZGVmYXVsdF9zdGFja3NpemVfbnAgKDAsICZfX3MpOworICAgICAgX19ndGhyZWFkX2FjdGl2ZSA9IF9fcyA/IDEgOiAwOworICAgICAgX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPSBfX2d0aHJlYWRfYWN0aXZlOworICAgIH0KKworICByZXR1cm4gX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgIT0gMDsKK30KKworI2Vsc2UgLyogbm90IGhwcGEtaHB1eCAqLworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICByZXR1cm4gMTsKK30KKworI2VuZGlmIC8qIGhwcGEtaHB1eCAqLworCisjZW5kaWYgLyogX19HWFhfV0VBS19fICovCisKKyNpZmRlZiBfTElCT0JKQworCisvKiBUaGlzIGlzIHRoZSBjb25maWcuaCBmaWxlIGluIGxpYm9iamMvICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBIQVZFX1NDSEVEX0gKKyMgaW5jbHVkZSA8c2NoZWQuaD4KKyNlbmRpZgorCisvKiBLZXkgc3RydWN0dXJlIGZvciBtYWludGFpbmluZyB0aHJlYWQgc3BlY2lmaWMgc3RvcmFnZSAqLworc3RhdGljIHB0aHJlYWRfa2V5X3QgX29iamNfdGhyZWFkX3N0b3JhZ2U7CitzdGF0aWMgcHRocmVhZF9hdHRyX3QgX29iamNfdGhyZWFkX2F0dHJpYnM7CisKKy8qIFRocmVhZCBsb2NhbCBzdG9yYWdlIGZvciBhIHNpbmdsZSB0aHJlYWQgKi8KK3N0YXRpYyB2b2lkICp0aHJlYWRfbG9jYWxfc3RvcmFnZSA9IE5VTEw7CisKKy8qIEJhY2tlbmQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICovCisKKy8qIEluaXRpYWxpemUgdGhlIHRocmVhZHMgc3Vic3lzdGVtLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19pbml0X3RocmVhZF9zeXN0ZW0gKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgdGhyZWFkIHN0b3JhZ2Uga2V5LiAgKi8KKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2tleV9jcmVhdGUpICgmX29iamNfdGhyZWFkX3N0b3JhZ2UsIE5VTEwpID09IDApCisJeworCSAgLyogVGhlIG5vcm1hbCBkZWZhdWx0IGRldGFjaCBzdGF0ZSBmb3IgdGhyZWFkcyBpcworCSAgICogUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgd2hpY2ggY2F1c2VzIHRocmVhZHMgdG8gbm90IGRpZQorCSAgICogd2hlbiB5b3UgdGhpbmsgdGhleSBzaG91bGQuICAqLworCSAgaWYgKF9fZ3RocndfKHB0aHJlYWRfYXR0cl9pbml0KSAoJl9vYmpjX3RocmVhZF9hdHRyaWJzKSA9PSAwCisJICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKSAoJl9vYmpjX3RocmVhZF9hdHRyaWJzLAorCQkJCQkgICAgICBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCkgPT0gMCkKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICByZXR1cm4gLTE7Cit9CisKKy8qIENsb3NlIHRoZSB0aHJlYWRzIHN1YnN5c3RlbS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY2xvc2VfdGhyZWFkX3N5c3RlbSAodm9pZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9rZXlfZGVsZXRlKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UpID09IDAKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfYXR0cl9kZXN0cm95KSAoJl9vYmpjX3RocmVhZF9hdHRyaWJzKSA9PSAwKQorICAgIHJldHVybiAwOworCisgIHJldHVybiAtMTsKK30KKworLyogQmFja2VuZCB0aHJlYWQgZnVuY3Rpb25zICovCisKKy8qIENyZWF0ZSBhIG5ldyB0aHJlYWQgb2YgZXhlY3V0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgb2JqY190aHJlYWRfdAorX19ndGhyZWFkX29iamNfdGhyZWFkX2RldGFjaCAodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKyAgb2JqY190aHJlYWRfdCB0aHJlYWRfaWQ7CisgIHB0aHJlYWRfdCBuZXdfdGhyZWFkX2hhbmRsZTsKKworICBpZiAoIV9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIShfX2d0aHJ3XyhwdGhyZWFkX2NyZWF0ZSkgKCZuZXdfdGhyZWFkX2hhbmRsZSwgJl9vYmpjX3RocmVhZF9hdHRyaWJzLAorCQkJCSAgKHZvaWQgKikgZnVuYywgYXJnKSkpCisgICAgdGhyZWFkX2lkID0gKG9iamNfdGhyZWFkX3QpIG5ld190aHJlYWRfaGFuZGxlOworICBlbHNlCisgICAgdGhyZWFkX2lkID0gTlVMTDsKKworICByZXR1cm4gdGhyZWFkX2lkOworfQorCisvKiBTZXQgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgcHJpb3JpdHkuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9zZXRfcHJpb3JpdHkgKGludCBwcmlvcml0eSkKK3sKKyAgaWYgKCFfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIC0xOworICBlbHNlCisgICAgeworI2lmZGVmIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCisgICAgICBwdGhyZWFkX3QgdGhyZWFkX2lkID0gX19ndGhyd18ocHRocmVhZF9zZWxmKSAoKTsKKyAgICAgIGludCBwb2xpY3k7CisgICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW1zOworICAgICAgaW50IHByaW9yaXR5X21pbiwgcHJpb3JpdHlfbWF4OworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9nZXRzY2hlZHBhcmFtKSAodGhyZWFkX2lkLCAmcG9saWN5LCAmcGFyYW1zKSA9PSAwKQorCXsKKwkgIGlmICgocHJpb3JpdHlfbWF4ID0gX19ndGhyd18oc2NoZWRfZ2V0X3ByaW9yaXR5X21heCkgKHBvbGljeSkpID09IC0xKQorCSAgICByZXR1cm4gLTE7CisKKwkgIGlmICgocHJpb3JpdHlfbWluID0gX19ndGhyd18oc2NoZWRfZ2V0X3ByaW9yaXR5X21pbikgKHBvbGljeSkpID09IC0xKQorCSAgICByZXR1cm4gLTE7CisKKwkgIGlmIChwcmlvcml0eSA+IHByaW9yaXR5X21heCkKKwkgICAgcHJpb3JpdHkgPSBwcmlvcml0eV9tYXg7CisJICBlbHNlIGlmIChwcmlvcml0eSA8IHByaW9yaXR5X21pbikKKwkgICAgcHJpb3JpdHkgPSBwcmlvcml0eV9taW47CisJICBwYXJhbXMuc2NoZWRfcHJpb3JpdHkgPSBwcmlvcml0eTsKKworCSAgLyoKKwkgICAqIFRoZSBzb2xhcmlzIDcgYW5kIHNldmVyYWwgb3RoZXIgbWFuIHBhZ2VzIGluY29ycmVjdGx5IHN0YXRlIHRoYXQKKwkgICAqIHRoaXMgc2hvdWxkIGJlIGEgcG9pbnRlciB0byBwb2xpY3kgYnV0IHB0aHJlYWQuaCBpcyB1bml2ZXJzYWxseQorCSAgICogYXQgb2RkcyB3aXRoIHRoaXMuCisJICAgKi8KKwkgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX3NldHNjaGVkcGFyYW0pICh0aHJlYWRfaWQsIHBvbGljeSwgJnBhcmFtcykgPT0gMCkKKwkgICAgcmV0dXJuIDA7CisJfQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkJ3MgcHJpb3JpdHkuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9nZXRfcHJpb3JpdHkgKHZvaWQpCit7CisjaWZkZWYgX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyNpZmRlZiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBpbnQgcG9saWN5OworICAgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtczsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSkgKF9fZ3RocndfKHB0aHJlYWRfc2VsZikgKCksICZwb2xpY3ksICZwYXJhbXMpID09IDApCisJcmV0dXJuIHBhcmFtcy5zY2hlZF9wcmlvcml0eTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gLTE7CisgICAgfQorICBlbHNlCisjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisjZW5kaWYgLyogX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyAgICByZXR1cm4gT0JKQ19USFJFQURfSU5URVJBQ1RJVkVfUFJJT1JJVFk7Cit9CisKKy8qIFlpZWxkIG91ciBwcm9jZXNzIHRpbWUgdG8gYW5vdGhlciB0aHJlYWQuICAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2d0aHJlYWRfb2JqY190aHJlYWRfeWllbGQgKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgX19ndGhyd18oc2NoZWRfeWllbGQpICgpOworfQorCisvKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZXhpdCAodm9pZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICAvKiBleGl0IHRoZSB0aHJlYWQgKi8KKyAgICBfX2d0aHJ3XyhwdGhyZWFkX2V4aXQpICgmX19vYmpjX3RocmVhZF9leGl0X3N0YXR1cyk7CisKKyAgLyogRmFpbGVkIGlmIHdlIHJlYWNoZWQgaGVyZSAqLworICByZXR1cm4gLTE7Cit9CisKKy8qIFJldHVybnMgYW4gaW50ZWdlciB2YWx1ZSB3aGljaCB1bmlxdWVseSBkZXNjcmliZXMgYSB0aHJlYWQuICAqLworc3RhdGljIGlubGluZSBvYmpjX3RocmVhZF90CitfX2d0aHJlYWRfb2JqY190aHJlYWRfaWQgKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIChvYmpjX3RocmVhZF90KSBfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpOworICBlbHNlCisgICAgcmV0dXJuIChvYmpjX3RocmVhZF90KSAxOworfQorCisvKiBTZXRzIHRoZSB0aHJlYWQncyBsb2NhbCBzdG9yYWdlIHBvaW50ZXIuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9zZXRfZGF0YSAodm9pZCAqdmFsdWUpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfc2V0c3BlY2lmaWMpIChfb2JqY190aHJlYWRfc3RvcmFnZSwgdmFsdWUpOworICBlbHNlCisgICAgeworICAgICAgdGhyZWFkX2xvY2FsX3N0b3JhZ2UgPSB2YWx1ZTsKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogUmV0dXJucyB0aGUgdGhyZWFkJ3MgbG9jYWwgc3RvcmFnZSBwb2ludGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfX2d0aHJlYWRfb2JqY190aHJlYWRfZ2V0X2RhdGEgKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZ2V0c3BlY2lmaWMpIChfb2JqY190aHJlYWRfc3RvcmFnZSk7CisgIGVsc2UKKyAgICByZXR1cm4gdGhyZWFkX2xvY2FsX3N0b3JhZ2U7Cit9CisKKy8qIEJhY2tlbmQgbXV0ZXggZnVuY3Rpb25zICovCisKKy8qIEFsbG9jYXRlIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2FsbG9jYXRlIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgbXV0ZXgtPmJhY2tlbmQgPSBvYmpjX21hbGxvYyAoc2l6ZW9mIChwdGhyZWFkX211dGV4X3QpKTsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfaW5pdCkgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQsIE5VTEwpKQorCXsKKwkgIG9iamNfZnJlZSAobXV0ZXgtPmJhY2tlbmQpOworCSAgbXV0ZXgtPmJhY2tlbmQgPSBOVUxMOworCSAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlYWxsb2NhdGUgYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfZGVhbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIGludCBjb3VudDsKKworICAgICAgLyoKKyAgICAgICAqIFBvc2l4IFRocmVhZHMgc3BlY2lmaWNhbGx5IHJlcXVpcmUgdGhhdCB0aGUgdGhyZWFkIGJlIHVubG9ja2VkCisgICAgICAgKiBmb3IgX19ndGhyd18ocHRocmVhZF9tdXRleF9kZXN0cm95KSB0byB3b3JrLgorICAgICAgICovCisKKyAgICAgIGRvCisJeworCSAgY291bnQgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3VubG9jaykgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpOworCSAgaWYgKGNvdW50IDwgMCkKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICAgIHdoaWxlIChjb3VudCk7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2Rlc3Ryb3kpICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKSkKKwlyZXR1cm4gLTE7CisKKyAgICAgIG9iamNfZnJlZSAobXV0ZXgtPmJhY2tlbmQpOworICAgICAgbXV0ZXgtPmJhY2tlbmQgPSBOVUxMOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEdyYWIgYSBsb2NrIG9uIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2xvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9tdXRleF9sb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBUcnkgdG8gZ3JhYiBhIGxvY2sgb24gYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfdHJ5bG9jayAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3RyeWxvY2spICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKSAhPSAwKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFVubG9jayB0aGUgbXV0ZXggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF91bmxvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKSAhPSAwKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEJhY2tlbmQgY29uZGl0aW9uIG11dGV4IGZ1bmN0aW9ucyAqLworCisvKiBBbGxvY2F0ZSBhIGNvbmRpdGlvbi4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX2FsbG9jYXRlIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbikKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBjb25kaXRpb24tPmJhY2tlbmQgPSBvYmpjX21hbGxvYyAoc2l6ZW9mIChwdGhyZWFkX2NvbmRfdCkpOworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9jb25kX2luaXQpICgocHRocmVhZF9jb25kX3QgKikgY29uZGl0aW9uLT5iYWNrZW5kLCBOVUxMKSkKKwl7CisJICBvYmpjX2ZyZWUgKGNvbmRpdGlvbi0+YmFja2VuZCk7CisJICBjb25kaXRpb24tPmJhY2tlbmQgPSBOVUxMOworCSAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlYWxsb2NhdGUgYSBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9kZWFsbG9jYXRlIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbikKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9jb25kX2Rlc3Ryb3kpICgocHRocmVhZF9jb25kX3QgKikgY29uZGl0aW9uLT5iYWNrZW5kKSkKKwlyZXR1cm4gLTE7CisKKyAgICAgIG9iamNfZnJlZSAoY29uZGl0aW9uLT5iYWNrZW5kKTsKKyAgICAgIGNvbmRpdGlvbi0+YmFja2VuZCA9IE5VTEw7CisgICAgfQorICByZXR1cm4gMDsKK30KKworLyogV2FpdCBvbiB0aGUgY29uZGl0aW9uICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX3dhaXQgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uLCBvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF93YWl0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCwKKwkJCSAgICAgIChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFdha2UgdXAgYWxsIHRocmVhZHMgd2FpdGluZyBvbiB0aGlzIGNvbmRpdGlvbi4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX2Jyb2FkY2FzdCAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF9icm9hZGNhc3QpICgocHRocmVhZF9jb25kX3QgKikgY29uZGl0aW9uLT5iYWNrZW5kKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBXYWtlIHVwIG9uZSB0aHJlYWQgd2FpdGluZyBvbiB0aGlzIGNvbmRpdGlvbi4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX3NpZ25hbCAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF9zaWduYWwpICgocHRocmVhZF9jb25kX3QgKikgY29uZGl0aW9uLT5iYWNrZW5kKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisjZWxzZSAvKiBfTElCT0JKQyAqLworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NyZWF0ZSAoX19ndGhyZWFkX3QgKl9fdGhyZWFkaWQsIHZvaWQgKigqX19mdW5jKSAodm9pZCopLAorCQkgIHZvaWQgKl9fYXJncykKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY3JlYXRlKSAoX190aHJlYWRpZCwgTlVMTCwgX19mdW5jLCBfX2FyZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2pvaW4gKF9fZ3RocmVhZF90IF9fdGhyZWFkaWQsIHZvaWQgKipfX3ZhbHVlX3B0cikKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfam9pbikgKF9fdGhyZWFkaWQsIF9fdmFsdWVfcHRyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9kZXRhY2ggKF9fZ3RocmVhZF90IF9fdGhyZWFkaWQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2RldGFjaCkgKF9fdGhyZWFkaWQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2VxdWFsIChfX2d0aHJlYWRfdCBfX3QxLCBfX2d0aHJlYWRfdCBfX3QyKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9lcXVhbCkgKF9fdDEsIF9fdDIpOworfQorCitzdGF0aWMgaW5saW5lIF9fZ3RocmVhZF90CitfX2d0aHJlYWRfc2VsZiAodm9pZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfc2VsZikgKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfeWllbGQgKHZvaWQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhzY2hlZF95aWVsZCkgKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb25jZSAoX19ndGhyZWFkX29uY2VfdCAqX19vbmNlLCB2b2lkICgqX19mdW5jKSAodm9pZCkpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfb25jZSkgKF9fb25jZSwgX19mdW5jKTsKKyAgZWxzZQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9rZXlfY3JlYXRlIChfX2d0aHJlYWRfa2V5X3QgKl9fa2V5LCB2b2lkICgqX19kdG9yKSAodm9pZCAqKSkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfa2V5X2NyZWF0ZSkgKF9fa2V5LCBfX2R0b3IpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2tleV9kZWxldGUgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfa2V5X2RlbGV0ZSkgKF9fa2V5KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICoKK19fZ3RocmVhZF9nZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90IF9fa2V5KQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9nZXRzcGVjaWZpYykgKF9fa2V5KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9zZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90IF9fa2V5LCBjb25zdCB2b2lkICpfX3B0cikKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfc2V0c3BlY2lmaWMpIChfX2tleSwgX19wdHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fZ3RocmVhZF9tdXRleF9pbml0X2Z1bmN0aW9uIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2luaXQpIChfX211dGV4LCBOVUxMKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF9kZXN0cm95KSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF9sb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF90cnlsb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2lmIF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0sKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdGltZWRsb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCwKKwkJCSAgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKl9fYWJzX3RpbWVvdXQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKSAoX19tdXRleCwgX19hYnNfdGltZW91dCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3VubG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2lmICFkZWZpbmVkKCBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkgXAorICB8fCBkZWZpbmVkKF9HVEhSRUFEX1VTRV9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DKQorc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgX19hdHRyOworICAgICAgaW50IF9fcjsKKworICAgICAgX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleGF0dHJfaW5pdCkgKCZfX2F0dHIpOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSkgKCZfX2F0dHIsCisJCQkJCQkgICBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2luaXQpIChfX211dGV4LCAmX19hdHRyKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpICgmX19hdHRyKTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfbG9jayAoX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RyeWxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF90cnlsb2NrIChfX211dGV4KTsKK30KKworI2lmIF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0sKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4LAorCQkJCSAgICAgY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqX19hYnNfdGltZW91dCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF90aW1lZGxvY2sgKF9fbXV0ZXgsIF9fYWJzX3RpbWVvdXQpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3VubG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X3VubG9jayAoX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2Rlc3Ryb3kgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF9kZXN0cm95IChfX211dGV4KTsKK30KKworI2lmZGVmIF9HVEhSRUFEX1VTRV9DT05EX0lOSVRfRlVOQworc3RhdGljIGlubGluZSB2b2lkCitfX2d0aHJlYWRfY29uZF9pbml0X2Z1bmN0aW9uIChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgX19ndGhyd18ocHRocmVhZF9jb25kX2luaXQpIChfX2NvbmQsIE5VTEwpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF9icm9hZGNhc3QgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF9icm9hZGNhc3QpIChfX2NvbmQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfc2lnbmFsIChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfc2lnbmFsKSAoX19jb25kKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3dhaXQgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCwgX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfd2FpdCkgKF9fY29uZCwgX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF90aW1lZHdhaXQgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCwgX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKl9fYWJzX3RpbWVvdXQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfdGltZWR3YWl0KSAoX19jb25kLCBfX211dGV4LCBfX2Fic190aW1lb3V0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3dhaXRfcmVjdXJzaXZlIChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQsCisJCQkgICAgICAgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX2NvbmRfd2FpdCAoX19jb25kLCBfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX2Rlc3Ryb3kgKF9fZ3RocmVhZF9jb25kX3QqIF9fY29uZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF9kZXN0cm95KSAoX19jb25kKTsKK30KKworI2VuZGlmIC8qIF9MSUJPQkpDICovCisKKyNlbmRpZiAvKiAhIF9HTElCQ1hYX0dDQ19HVEhSX1BPU0lYX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvZ3Roci1zaW5nbGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvZ3Roci1zaW5nbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWU1NzVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9ndGhyLXNpbmdsZS5oCkBAIC0wLDAgKzEsMjk4IEBACisvKiBUaHJlYWRzIGNvbXBhdGliaWxpdHkgcm91dGluZXMgZm9yIGxpYmdjYzIgYW5kIGxpYm9iamMuICAqLworLyogQ29tcGlsZSB0aGlzIG9uZSB3aXRoIGdjYy4gICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9HQ0NfR1RIUl9TSU5HTEVfSAorI2RlZmluZSBfR0xJQkNYWF9HQ0NfR1RIUl9TSU5HTEVfSAorCisvKiBKdXN0IHByb3ZpZGUgY29tcGF0aWJpbGl0eSBmb3IgbXV0ZXggaGFuZGxpbmcuICAqLworCit0eXBlZGVmIGludCBfX2d0aHJlYWRfa2V5X3Q7Cit0eXBlZGVmIGludCBfX2d0aHJlYWRfb25jZV90OwordHlwZWRlZiBpbnQgX19ndGhyZWFkX211dGV4X3Q7Cit0eXBlZGVmIGludCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3Q7CisKKyNkZWZpbmUgX19HVEhSRUFEX09OQ0VfSU5JVCAwCisjZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUIDAKKyNkZWZpbmUgX19HVEhSRUFEX01VVEVYX0lOSVRfRlVOQ1RJT04obXgpCisjZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVCAwCisKKyNkZWZpbmUgX0dMSUJDWFhfVU5VU0VEIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisKKyNpZmRlZiBfTElCT0JKQworCisvKiBUaHJlYWQgbG9jYWwgc3RvcmFnZSBmb3IgYSBzaW5nbGUgdGhyZWFkICovCitzdGF0aWMgdm9pZCAqdGhyZWFkX2xvY2FsX3N0b3JhZ2UgPSBOVUxMOworCisvKiBCYWNrZW5kIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworCisvKiBJbml0aWFsaXplIHRoZSB0aHJlYWRzIHN1YnN5c3RlbS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfaW5pdF90aHJlYWRfc3lzdGVtICh2b2lkKQoreworICAvKiBObyB0aHJlYWQgc3VwcG9ydCBhdmFpbGFibGUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBDbG9zZSB0aGUgdGhyZWFkcyBzdWJzeXN0ZW0uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2Nsb3NlX3RocmVhZF9zeXN0ZW0gKHZvaWQpCit7CisgIC8qIE5vIHRocmVhZCBzdXBwb3J0IGF2YWlsYWJsZSAqLworICByZXR1cm4gLTE7Cit9CisKKy8qIEJhY2tlbmQgdGhyZWFkIGZ1bmN0aW9ucyAqLworCisvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIG9mIGV4ZWN1dGlvbi4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9kZXRhY2ggKHZvaWQgKCogZnVuYykodm9pZCAqKSwgdm9pZCAqIGFyZyBfR0xJQkNYWF9VTlVTRUQpCit7CisgIC8qIE5vIHRocmVhZCBzdXBwb3J0IGF2YWlsYWJsZSAqLworICByZXR1cm4gTlVMTDsKK30KKworLyogU2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X3ByaW9yaXR5IChpbnQgcHJpb3JpdHkgX0dMSUJDWFhfVU5VU0VEKQoreworICAvKiBObyB0aHJlYWQgc3VwcG9ydCBhdmFpbGFibGUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkJ3MgcHJpb3JpdHkuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9nZXRfcHJpb3JpdHkgKHZvaWQpCit7CisgIHJldHVybiBPQkpDX1RIUkVBRF9JTlRFUkFDVElWRV9QUklPUklUWTsKK30KKworLyogWWllbGQgb3VyIHByb2Nlc3MgdGltZSB0byBhbm90aGVyIHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF95aWVsZCAodm9pZCkKK3sKKyAgcmV0dXJuOworfQorCisvKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZXhpdCAodm9pZCkKK3sKKyAgLyogTm8gdGhyZWFkIHN1cHBvcnQgYXZhaWxhYmxlICovCisgIC8qIFNob3VsZCB3ZSByZWFsbHkgZXhpdCB0aGUgcHJvZ3JhbSAqLworICAvKiBleGl0ICgmX19vYmpjX3RocmVhZF9leGl0X3N0YXR1cyk7ICovCisgIHJldHVybiAtMTsKK30KKworLyogUmV0dXJucyBhbiBpbnRlZ2VyIHZhbHVlIHdoaWNoIHVuaXF1ZWx5IGRlc2NyaWJlcyBhIHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9pZCAodm9pZCkKK3sKKyAgLyogTm8gdGhyZWFkIHN1cHBvcnQsIHVzZSAxLiAgKi8KKyAgcmV0dXJuIChvYmpjX3RocmVhZF90KSAxOworfQorCisvKiBTZXRzIHRoZSB0aHJlYWQncyBsb2NhbCBzdG9yYWdlIHBvaW50ZXIuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9zZXRfZGF0YSAodm9pZCAqdmFsdWUpCit7CisgIHRocmVhZF9sb2NhbF9zdG9yYWdlID0gdmFsdWU7CisgIHJldHVybiAwOworfQorCisvKiBSZXR1cm5zIHRoZSB0aHJlYWQncyBsb2NhbCBzdG9yYWdlIHBvaW50ZXIuICAqLworc3RhdGljIGlubGluZSB2b2lkICoKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9nZXRfZGF0YSAodm9pZCkKK3sKKyAgcmV0dXJuIHRocmVhZF9sb2NhbF9zdG9yYWdlOworfQorCisvKiBCYWNrZW5kIG11dGV4IGZ1bmN0aW9ucyAqLworCisvKiBBbGxvY2F0ZSBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9hbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlYWxsb2NhdGUgYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfZGVhbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEdyYWIgYSBsb2NrIG9uIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2xvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIC8qIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSB0aHJlYWQsIHNvIHdlIGFsd2F5cyBnZXQgdGhlIGxvY2sgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRyeSB0byBncmFiIGEgbG9jayBvbiBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF90cnlsb2NrIChvYmpjX211dGV4X3QgbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICAvKiBUaGVyZSBjYW4gb25seSBiZSBvbmUgdGhyZWFkLCBzbyB3ZSBhbHdheXMgZ2V0IHRoZSBsb2NrICovCisgIHJldHVybiAwOworfQorCisvKiBVbmxvY2sgdGhlIG11dGV4ICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfdW5sb2NrIChvYmpjX211dGV4X3QgbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworLyogQmFja2VuZCBjb25kaXRpb24gbXV0ZXggZnVuY3Rpb25zICovCisKKy8qIEFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fYWxsb2NhdGUgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uIF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlYWxsb2NhdGUgYSBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9kZWFsbG9jYXRlIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBXYWl0IG9uIHRoZSBjb25kaXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fd2FpdCAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24gX0dMSUJDWFhfVU5VU0VELAorCQkJICAgICAgIG9iamNfbXV0ZXhfdCBtdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBXYWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9icm9hZGNhc3QgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uIF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFdha2UgdXAgb25lIHRocmVhZCB3YWl0aW5nIG9uIHRoaXMgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fc2lnbmFsIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisjZWxzZSAvKiBfTElCT0JKQyAqLworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vbmNlIChfX2d0aHJlYWRfb25jZV90ICpfX29uY2UgX0dMSUJDWFhfVU5VU0VELCB2b2lkICgqX19mdW5jKSAodm9pZCkgX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX0dMSUJDWFhfVU5VU0VECitfX2d0aHJlYWRfa2V5X2NyZWF0ZSAoX19ndGhyZWFkX2tleV90ICpfX2tleSBfR0xJQkNYWF9VTlVTRUQsIHZvaWQgKCpfX2Z1bmMpICh2b2lkICopIF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX0dMSUJDWFhfVU5VU0VECitfX2d0aHJlYWRfa2V5X2RlbGV0ZSAoX19ndGhyZWFkX2tleV90IF9fa2V5IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfX2d0aHJlYWRfZ2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3NldHNwZWNpZmljIChfX2d0aHJlYWRfa2V5X3QgX19rZXkgX0dMSUJDWFhfVU5VU0VELCBjb25zdCB2b2lkICpfX3YgX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X2xvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2xvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF9sb2NrIChfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X3RyeWxvY2sgKF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19tdXRleCk7Cit9CisKKyNlbmRpZiAvKiBfTElCT0JKQyAqLworCisjdW5kZWYgX0dMSUJDWFhfVU5VU0VECisKKyNlbmRpZiAvKiAhIF9HTElCQ1hYX0dDQ19HVEhSX1NJTkdMRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2d0aHIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvZ3Roci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzM5NGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2d0aHIuaApAQCAtMCwwICsxLDE1NCBAQAorLyogVGhyZWFkcyBjb21wYXRpYmlsaXR5IHJvdXRpbmVzIGZvciBsaWJnY2MyLiAgKi8KKy8qIENvbXBpbGUgdGhpcyBvbmUgd2l0aCBnY2MuICAqLworLyogQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0dMSUJDWFhfR0NDX0dUSFJfSAorI2RlZmluZSBfR0xJQkNYWF9HQ0NfR1RIUl9ICisKKyNpZm5kZWYgX0dMSUJDWFhfSElERV9FWFBPUlRTCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKyNlbmRpZgorCisvKiBJZiB0aGlzIGZpbGUgaXMgY29tcGlsZWQgd2l0aCB0aHJlYWRzIHN1cHBvcnQsIGl0IG11c3QKKyAgICAgICAjZGVmaW5lIF9fR1RIUkVBRFMgMQorICAgdG8gaW5kaWNhdGUgdGhhdCB0aHJlYWRzIHN1cHBvcnQgaXMgcHJlc2VudC4gIEFsc28gaXQgaGFzIGRlZmluZQorICAgZnVuY3Rpb24KKyAgICAgaW50IF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgdGhhdCByZXR1cm5zIDEgaWYgdGhyZWFkIHN5c3RlbSBpcyBhY3RpdmUsIDAgaWYgbm90LgorCisgICBUaGUgdGhyZWFkcyBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgdGhlIGZvbGxvd2luZyB0eXBlczoKKyAgICAgX19ndGhyZWFkX2tleV90CisgICAgIF9fZ3RocmVhZF9vbmNlX3QKKyAgICAgX19ndGhyZWFkX211dGV4X3QKKyAgICAgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90CisKKyAgIFRoZSB0aHJlYWRzIGludGVyZmFjZSBtdXN0IGRlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvczoKKworICAgICBfX0dUSFJFQURfT05DRV9JTklUCisgICAgIAkJdG8gaW5pdGlhbGl6ZSBfX2d0aHJlYWRfb25jZV90CisgICAgIF9fR1RIUkVBRF9NVVRFWF9JTklUCisgICAgIAkJdG8gaW5pdGlhbGl6ZSBfX2d0aHJlYWRfbXV0ZXhfdCB0byBnZXQgYSBmYXN0CisJCW5vbi1yZWN1cnNpdmUgbXV0ZXguCisgICAgIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OCisJCXRvIGluaXRpYWxpemUgX19ndGhyZWFkX211dGV4X3QgdG8gZ2V0IGEgZmFzdAorCQlub24tcmVjdXJzaXZlIG11dGV4LgorCQlEZWZpbmUgdGhpcyB0byBhIGZ1bmN0aW9uIHdoaWNoIGxvb2tzIGxpa2UgdGhpczoKKwkJICB2b2lkIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OIChfX2d0aHJlYWRfbXV0ZXhfdCAqKQorICAgICAJCVNvbWUgc3lzdGVtcyBjYW4ndCBpbml0aWFsaXplIGEgbXV0ZXggd2l0aG91dCBhCisJCWZ1bmN0aW9uIGNhbGwuICBEb24ndCBkZWZpbmUgX19HVEhSRUFEX01VVEVYX0lOSVQgaW4gdGhpcyBjYXNlLgorICAgICBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQKKyAgICAgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OCisgICAgIAkJYXMgYWJvdmUsIGJ1dCBmb3IgYSByZWN1cnNpdmUgbXV0ZXguCisKKyAgIFRoZSB0aHJlYWRzIGludGVyZmFjZSBtdXN0IGRlZmluZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBmdW5jdGlvbnM6CisKKyAgICAgaW50IF9fZ3RocmVhZF9vbmNlIChfX2d0aHJlYWRfb25jZV90ICpvbmNlLCB2b2lkICgqZnVuYykgKCkpCisKKyAgICAgaW50IF9fZ3RocmVhZF9rZXlfY3JlYXRlIChfX2d0aHJlYWRfa2V5X3QgKmtleXAsIHZvaWQgKCpkdG9yKSAodm9pZCAqKSkKKyAgICAgaW50IF9fZ3RocmVhZF9rZXlfZGVsZXRlIChfX2d0aHJlYWRfa2V5X3Qga2V5KQorCisgICAgIHZvaWQgKl9fZ3RocmVhZF9nZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90IGtleSkKKyAgICAgaW50IF9fZ3RocmVhZF9zZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90IGtleSwgY29uc3Qgdm9pZCAqcHRyKQorCisgICAgIGludCBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX211dGV4X3QgKm11dGV4KTsKKyAgICAgaW50IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICptdXRleCk7CisKKyAgICAgaW50IF9fZ3RocmVhZF9tdXRleF9sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpOworICAgICBpbnQgX19ndGhyZWFkX211dGV4X3RyeWxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICptdXRleCk7CisgICAgIGludCBfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpOworCisgICAgIGludCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2xvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqbXV0ZXgpOworICAgICBpbnQgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm11dGV4KTsKKyAgICAgaW50IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm11dGV4KTsKKworICAgVGhlIGZvbGxvd2luZyBhcmUgc3VwcG9ydGVkIGluIFBPU0lYIHRocmVhZHMgb25seS4gVGhleSBhcmUgcmVxdWlyZWQgdG8KKyAgIGZpeCBhIGRlYWRsb2NrIGluIHN0YXRpYyBpbml0aWFsaXphdGlvbiBpbnNpZGUgbGlic3VwYysrLiBUaGUgaGVhZGVyIGZpbGUKKyAgIGd0aHItcG9zaXguaCBkZWZpbmVzIGEgc3ltYm9sIF9fR1RIUkVBRF9IQVNfQ09ORCB0byBzaWduaWZ5IHRoYXQgdGhlc2UgZXh0cmEKKyAgIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQuCisKKyAgIFR5cGVzOgorICAgICBfX2d0aHJlYWRfY29uZF90CisKKyAgIE1hY3JvczoKKyAgICAgX19HVEhSRUFEX0NPTkRfSU5JVAorICAgICBfX0dUSFJFQURfQ09ORF9JTklUX0ZVTkNUSU9OCisKKyAgIEludGVyZmFjZToKKyAgICAgaW50IF9fZ3RocmVhZF9jb25kX2Jyb2FkY2FzdCAoX19ndGhyZWFkX2NvbmRfdCAqY29uZCk7CisgICAgIGludCBfX2d0aHJlYWRfY29uZF93YWl0IChfX2d0aHJlYWRfY29uZF90ICpjb25kLCBfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpOworICAgICBpbnQgX19ndGhyZWFkX2NvbmRfd2FpdF9yZWN1cnNpdmUgKF9fZ3RocmVhZF9jb25kX3QgKmNvbmQsCisJCQkJCV9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqbXV0ZXgpOworCisgICBBbGwgZnVuY3Rpb25zIHJldHVybmluZyBpbnQgc2hvdWxkIHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgdGhlIGVycm9yCisgICBudW1iZXIuICBJZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIC0xIGlzIHJldHVybmVkLgorCisgICBJZiB0aGUgZm9sbG93aW5nIGFyZSBhbHNvIGRlZmluZWQsIHlvdSBzaG91bGQKKyAgICAgI2RlZmluZSBfX0dUSFJFQURTX0NYWDBYIDEKKyAgIHRvIGVuYWJsZSB0aGUgYysrMHggdGhyZWFkIGxpYnJhcnkuCisKKyAgIFR5cGVzOgorICAgICBfX2d0aHJlYWRfdAorICAgICBfX2d0aHJlYWRfdGltZV90CisKKyAgIEludGVyZmFjZToKKyAgICAgaW50IF9fZ3RocmVhZF9jcmVhdGUgKF9fZ3RocmVhZF90ICp0aHJlYWQsIHZvaWQgKigqZnVuYykgKHZvaWQqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZ3MpOworICAgICBpbnQgX19ndGhyZWFkX2pvaW4gKF9fZ3RocmVhZF90IHRocmVhZCwgdm9pZCAqKnZhbHVlX3B0cik7CisgICAgIGludCBfX2d0aHJlYWRfZGV0YWNoIChfX2d0aHJlYWRfdCB0aHJlYWQpOworICAgICBpbnQgX19ndGhyZWFkX2VxdWFsIChfX2d0aHJlYWRfdCB0MSwgX19ndGhyZWFkX3QgdDIpOworICAgICBfX2d0aHJlYWRfdCBfX2d0aHJlYWRfc2VsZiAodm9pZCk7CisgICAgIGludCBfX2d0aHJlYWRfeWllbGQgKHZvaWQpOworCisgICAgIGludCBfX2d0aHJlYWRfbXV0ZXhfdGltZWRsb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKmFic190aW1lb3V0KTsKKyAgICAgaW50IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdGltZWRsb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICphYnNfdGltZSk7CisKKyAgICAgaW50IF9fZ3RocmVhZF9jb25kX3NpZ25hbCAoX19ndGhyZWFkX2NvbmRfdCAqY29uZCk7CisgICAgIGludCBfX2d0aHJlYWRfY29uZF90aW1lZHdhaXQgKF9fZ3RocmVhZF9jb25kX3QgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ3RocmVhZF9tdXRleF90ICptdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqYWJzX3RpbWVvdXQpOworCisqLworCisjaWYgX19HWFhfV0VBS19fCisvKiBUaGUgcGUtY29mZiB3ZWFrIHN1cHBvcnQgaXNuJ3QgZnVsbHkgY29tcGF0aWJsZSB0byBFTEYncyB3ZWFrLgorICAgRm9yIHN0YXRpYyBsaWJyYXJpZXMgaXQgbWlnaHQgd291bGQgd29yaywgYnV0IGFzIHdlIG5lZWQgdG8gZGVhbAorICAgd2l0aCBzaGFyZWQgdmVyc2lvbnMgdG9vLCB3ZSBkaXNhYmxlIGl0IGZvciBtaW5ndy10YXJnZXRzLiAgKi8KKyNpZmRlZiBfX01JTkdXMzJfXworI3VuZGVmIF9HTElCQ1hYX0dUSFJFQURfVVNFX1dFQUsKKyNkZWZpbmUgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSyAwCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9HVEhSRUFEX1VTRV9XRUFLCisjZGVmaW5lIF9HTElCQ1hYX0dUSFJFQURfVVNFX1dFQUsgMQorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxiaXRzL2d0aHItZGVmYXVsdC5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0hJREVfRVhQT1JUUworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwb3AKKyNlbmRpZgorCisjZW5kaWYgLyogISBfR0xJQkNYWF9HQ0NfR1RIUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL21lc3NhZ2VzX21lbWJlcnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvbWVzc2FnZXNfbWVtYmVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDdlNDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL21lc3NhZ2VzX21lbWJlcnMuaApAQCAtMCwwICsxLDEzMCBAQAorLy8gc3RkOjptZXNzYWdlcyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCBHTlUgdmVyc2lvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9tZXNzYWdlc19tZW1iZXJzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjIuNy4xLjIgIG1lc3NhZ2VzIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKworI2luY2x1ZGUgPGxpYmludGwuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIE5vbi12aXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICAgbWVzc2FnZXM8X0NoYXJUPjo6bWVzc2FnZXMoc2l6ZV90IF9fcmVmcykKKyAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9jX2xvY2FsZV9tZXNzYWdlcyhfU19nZXRfY19sb2NhbGUoKSksIAorICAgICAgIF9NX25hbWVfbWVzc2FnZXMoX1NfZ2V0X2NfbmFtZSgpKQorICAgICB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgIG1lc3NhZ2VzPF9DaGFyVD46Om1lc3NhZ2VzKF9fY19sb2NhbGUgX19jbG9jLCBjb25zdCBjaGFyKiBfX3MsIAorCQkJCXNpemVfdCBfX3JlZnMpIAorICAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2NfbG9jYWxlX21lc3NhZ2VzKDApLCBfTV9uYW1lX21lc3NhZ2VzKDApCisgICAgIHsKKyAgICAgICBpZiAoX19idWlsdGluX3N0cmNtcChfX3MsIF9TX2dldF9jX25hbWUoKSkgIT0gMCkKKwkgeworCSAgIGNvbnN0IHNpemVfdCBfX2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4oX19zKSArIDE7CisJICAgY2hhciogX190bXAgPSBuZXcgY2hhcltfX2xlbl07CisJICAgX19idWlsdGluX21lbWNweShfX3RtcCwgX19zLCBfX2xlbik7CisJICAgX01fbmFtZV9tZXNzYWdlcyA9IF9fdG1wOworCSB9CisgICAgICAgZWxzZQorCSBfTV9uYW1lX21lc3NhZ2VzID0gX1NfZ2V0X2NfbmFtZSgpOworCisgICAgICAgLy8gTGFzdCB0byBhdm9pZCBsZWFraW5nIG1lbW9yeSBpZiBuZXcgdGhyb3dzLgorICAgICAgIF9NX2NfbG9jYWxlX21lc3NhZ2VzID0gX1NfY2xvbmVfY19sb2NhbGUoX19jbG9jKTsKKyAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBtZXNzYWdlczxfQ2hhclQ+OjpjYXRhbG9nIAorICAgIG1lc3NhZ2VzPF9DaGFyVD46Om9wZW4oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXI+JiBfX3MsIGNvbnN0IGxvY2FsZSYgX19sb2MsIAorCQkJICAgY29uc3QgY2hhciogX19kaXIpIGNvbnN0CisgICAgeyAKKyAgICAgIGJpbmR0ZXh0ZG9tYWluKF9fcy5jX3N0cigpLCBfX2Rpcik7CisgICAgICByZXR1cm4gdGhpcy0+ZG9fb3BlbihfX3MsIF9fbG9jKTsgCisgICAgfQorCisgIC8vIFZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIG1lc3NhZ2VzPF9DaGFyVD46On5tZXNzYWdlcygpCisgICAgeyAKKyAgICAgIGlmIChfTV9uYW1lX21lc3NhZ2VzICE9IF9TX2dldF9jX25hbWUoKSkKKwlkZWxldGUgW10gX01fbmFtZV9tZXNzYWdlczsKKyAgICAgIF9TX2Rlc3Ryb3lfY19sb2NhbGUoX01fY19sb2NhbGVfbWVzc2FnZXMpOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIG1lc3NhZ2VzPF9DaGFyVD46OmNhdGFsb2cgCisgICAgbWVzc2FnZXM8X0NoYXJUPjo6ZG9fb3Blbihjb25zdCBiYXNpY19zdHJpbmc8Y2hhcj4mIF9fcywgCisJCQkgICAgICBjb25zdCBsb2NhbGUmKSBjb25zdAorICAgIHsgCisgICAgICAvLyBObyBlcnJvciBjaGVja2luZyBpcyBkb25lLCBhc3N1bWUgdGhlIGNhdGFsb2cgZXhpc3RzIGFuZCBjYW4KKyAgICAgIC8vIGJlIHVzZWQuCisgICAgICB0ZXh0ZG9tYWluKF9fcy5jX3N0cigpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgdm9pZCAgICAKKyAgICBtZXNzYWdlczxfQ2hhclQ+Ojpkb19jbG9zZShjYXRhbG9nKSBjb25zdCAKKyAgICB7IH0KKworICAgLy8gbWVzc2FnZXNfYnluYW1lCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgIG1lc3NhZ2VzX2J5bmFtZTxfQ2hhclQ+OjptZXNzYWdlc19ieW5hbWUoY29uc3QgY2hhciogX19zLCBzaXplX3QgX19yZWZzKQorICAgICA6IG1lc3NhZ2VzPF9DaGFyVD4oX19yZWZzKSAKKyAgICAgeyAKKyAgICAgICBpZiAodGhpcy0+X01fbmFtZV9tZXNzYWdlcyAhPSBsb2NhbGU6OmZhY2V0OjpfU19nZXRfY19uYW1lKCkpCisJIHsKKwkgICBkZWxldGUgW10gdGhpcy0+X01fbmFtZV9tZXNzYWdlczsKKwkgICBpZiAoX19idWlsdGluX3N0cmNtcChfX3MsIGxvY2FsZTo6ZmFjZXQ6Ol9TX2dldF9jX25hbWUoKSkgIT0gMCkKKwkgICAgIHsKKwkgICAgICAgY29uc3Qgc2l6ZV90IF9fbGVuID0gX19idWlsdGluX3N0cmxlbihfX3MpICsgMTsKKwkgICAgICAgY2hhciogX190bXAgPSBuZXcgY2hhcltfX2xlbl07CisJICAgICAgIF9fYnVpbHRpbl9tZW1jcHkoX190bXAsIF9fcywgX19sZW4pOworCSAgICAgICB0aGlzLT5fTV9uYW1lX21lc3NhZ2VzID0gX190bXA7CisJICAgICB9CisJICAgZWxzZQorCSAgICAgdGhpcy0+X01fbmFtZV9tZXNzYWdlcyA9IGxvY2FsZTo6ZmFjZXQ6Ol9TX2dldF9jX25hbWUoKTsKKwkgfQorCisgICAgICAgaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19zLCAiQyIpICE9IDAKKwkgICAmJiBfX2J1aWx0aW5fc3RyY21wKF9fcywgIlBPU0lYIikgIT0gMCkKKwkgeworCSAgIHRoaXMtPl9TX2Rlc3Ryb3lfY19sb2NhbGUodGhpcy0+X01fY19sb2NhbGVfbWVzc2FnZXMpOworCSAgIHRoaXMtPl9TX2NyZWF0ZV9jX2xvY2FsZSh0aGlzLT5fTV9jX2xvY2FsZV9tZXNzYWdlcywgX19zKTsgCisJIH0KKyAgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL29wdF9yYW5kb20uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvb3B0X3JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNjdiNTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL29wdF9yYW5kb20uaApAQCAtMCwwICsxLDIxOSBAQAorLy8gT3B0aW1pemF0aW9ucyBmb3IgcmFuZG9tIG51bWJlciBmdW5jdGlvbnMsIHg4NiB2ZXJzaW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL29wdF9yYW5kb20uaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3JhbmRvbX0KKyAqLworCisjaWZuZGVmIF9CSVRTX09QVF9SQU5ET01fSAorI2RlZmluZSBfQklUU19PUFRfUkFORE9NX0ggMQorCisjaW5jbHVkZSA8eDg2aW50cmluLmg+CisKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworI2lmZGVmIF9fU1NFM19fCisgIHRlbXBsYXRlPD4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIG5vcm1hbF9kaXN0cmlidXRpb248ZG91YmxlPjo6CisgICAgICBfX2dlbmVyYXRlKHR5cGVuYW1lIG5vcm1hbF9kaXN0cmlidXRpb248ZG91YmxlPjo6cmVzdWx0X3R5cGUqIF9fZiwKKwkJIHR5cGVuYW1lIG5vcm1hbF9kaXN0cmlidXRpb248ZG91YmxlPjo6cmVzdWx0X3R5cGUqIF9fdCwKKwkJIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCXR5cGVkZWYgdWludDY0X3QgX191Y3R5cGU7CisKKwlpZiAoX19mID09IF9fdCkKKwkgIHJldHVybjsKKworCWlmIChfTV9zYXZlZF9hdmFpbGFibGUpCisJICB7CisJICAgIF9NX3NhdmVkX2F2YWlsYWJsZSA9IGZhbHNlOworCSAgICAqX19mKysgPSBfTV9zYXZlZCAqIF9fcGFyYW0uc3RkZGV2KCkgKyBfX3BhcmFtLm1lYW4oKTsKKworCSAgICBpZiAoX19mID09IF9fdCkKKwkgICAgICByZXR1cm47CisJICB9CisKKwljb25zdGV4cHIgdWludDY0X3QgX19tYXNrdmFsID0gMHhmZmZmZmZmZmZmZmZmdWxsOworCXN0YXRpYyBjb25zdCBfX20xMjhpIF9fbWFzayA9IF9tbV9zZXQxX2VwaTY0eChfX21hc2t2YWwpOworCXN0YXRpYyBjb25zdCBfX20xMjhpIF9fdHdvID0gX21tX3NldDFfZXBpNjR4KDB4NDAwMDAwMDAwMDAwMDAwMHVsbCk7CisJc3RhdGljIGNvbnN0IF9fbTEyOGQgX190aHJlZSA9IF9tbV9zZXQxX3BkKDMuMCk7CisJY29uc3QgX19tMTI4ZCBfX2F2ID0gX21tX3NldDFfcGQoX19wYXJhbS5tZWFuKCkpOworCisJY29uc3QgX191Y3R5cGUgX191cm5nbWluID0gX191cm5nLm1pbigpOworCWNvbnN0IF9fdWN0eXBlIF9fdXJuZ21heCA9IF9fdXJuZy5tYXgoKTsKKwljb25zdCBfX3VjdHlwZSBfX3VybmdyYW5nZSA9IF9fdXJuZ21heCAtIF9fdXJuZ21pbjsKKwljb25zdCBfX3VjdHlwZSBfX3Vlcm5ncmFuZ2UgPSBfX3VybmdyYW5nZSArIDE7CisKKwl3aGlsZSAoX19mICsgMSA8IF9fdCkKKwkgIHsKKwkgICAgZG91YmxlIF9fbGU7CisJICAgIF9fbTEyOGQgX194OworCSAgICBkbworCSAgICAgIHsKKyAgICAgICAgICAgICAgICB1bmlvbgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fbTEyOGkgX19pOworICAgICAgICAgICAgICAgICAgX19tMTI4ZCBfX2Q7CisJCX0gX192OworCisJCWlmIChfX3VybmdyYW5nZSA+IF9fbWFza3ZhbCkKKwkJICB7CisJCSAgICBpZiAoX19kZXRhaWw6Ol9Qb3dlcl9vZl8yKF9fdWVybmdyYW5nZSkpCisJCSAgICAgIF9fdi5fX2kgPSBfbW1fYW5kX3NpMTI4KF9tbV9zZXRfZXBpNjR4KF9fdXJuZygpLAorCQkJCQkJCSAgICAgX191cm5nKCkpLAorCQkJCQkgICAgICBfX21hc2spOworCQkgICAgZWxzZQorCQkgICAgICB7CisJCQljb25zdCBfX3VjdHlwZSBfX3VlcmFuZ2UgPSBfX21hc2t2YWwgKyAxOworCQkJY29uc3QgX191Y3R5cGUgX19zY2FsaW5nID0gX191cm5ncmFuZ2UgLyBfX3VlcmFuZ2U7CisJCQljb25zdCBfX3VjdHlwZSBfX3Bhc3QgPSBfX3VlcmFuZ2UgKiBfX3NjYWxpbmc7CisJCQl1aW50NjRfdCBfX3YxOworCQkJZG8KKwkJCSAgX192MSA9IF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbjsKKwkJCXdoaWxlIChfX3YxID49IF9fcGFzdCk7CisJCQlfX3YxIC89IF9fc2NhbGluZzsKKwkJCXVpbnQ2NF90IF9fdjI7CisJCQlkbworCQkJICBfX3YyID0gX191Y3R5cGUoX191cm5nKCkpIC0gX191cm5nbWluOworCQkJd2hpbGUgKF9fdjIgPj0gX19wYXN0KTsKKwkJCV9fdjIgLz0gX19zY2FsaW5nOworCisJCQlfX3YuX19pID0gX21tX3NldF9lcGk2NHgoX192MSwgX192Mik7CisJCSAgICAgIH0KKwkJICB9CisJCWVsc2UgaWYgKF9fdXJuZ3JhbmdlID09IF9fbWFza3ZhbCkKKwkJICBfX3YuX19pID0gX21tX3NldF9lcGk2NHgoX191cm5nKCksIF9fdXJuZygpKTsKKwkJZWxzZSBpZiAoKF9fdXJuZ3JhbmdlICsgMikgKiBfX3VybmdyYW5nZSA+PSBfX21hc2t2YWwKKwkJCSAmJiBfX2RldGFpbDo6X1Bvd2VyX29mXzIoX191ZXJuZ3JhbmdlKSkKKwkJICB7CisJCSAgICB1aW50NjRfdCBfX3YxID0gX191cm5nKCkgKiBfX3Vlcm5ncmFuZ2UgKyBfX3VybmcoKTsKKwkJICAgIHVpbnQ2NF90IF9fdjIgPSBfX3VybmcoKSAqIF9fdWVybmdyYW5nZSArIF9fdXJuZygpOworCisJCSAgICBfX3YuX19pID0gX21tX2FuZF9zaTEyOChfbW1fc2V0X2VwaTY0eChfX3YxLCBfX3YyKSwKKwkJCQkJICAgIF9fbWFzayk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgc2l6ZV90IF9fbnJuZyA9IDI7CisJCSAgICBfX3VjdHlwZSBfX2hpZ2ggPSBfX21hc2t2YWwgLyBfX3Vlcm5ncmFuZ2UgLyBfX3Vlcm5ncmFuZ2U7CisJCSAgICB3aGlsZSAoX19oaWdoID4gX191ZXJuZ3JhbmdlKQorCQkgICAgICB7CisJCQkrK19fbnJuZzsKKwkJCV9faGlnaCAvPSBfX3Vlcm5ncmFuZ2U7CisJCSAgICAgIH0KKwkJICAgIGNvbnN0IF9fdWN0eXBlIF9faGlnaHJhbmdlID0gX19oaWdoICsgMTsKKwkJICAgIGNvbnN0IF9fdWN0eXBlIF9fc2NhbGluZyA9IF9fdXJuZ3JhbmdlIC8gX19oaWdocmFuZ2U7CisJCSAgICBjb25zdCBfX3VjdHlwZSBfX3Bhc3QgPSBfX2hpZ2hyYW5nZSAqIF9fc2NhbGluZzsKKwkJICAgIF9fdWN0eXBlIF9fdG1wOworCisJCSAgICB1aW50NjRfdCBfX3YxOworCQkgICAgZG8KKwkJICAgICAgeworCQkJZG8KKwkJCSAgX190bXAgPSBfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW47CisJCQl3aGlsZSAoX190bXAgPj0gX19wYXN0KTsKKwkJCV9fdjEgPSBfX3RtcCAvIF9fc2NhbGluZzsKKwkJCWZvciAoc2l6ZV90IF9fY250ID0gMDsgX19jbnQgPCBfX25ybmc7ICsrX19jbnQpCisJCQkgIHsKKwkJCSAgICBfX3RtcCA9IF9fdjE7CisJCQkgICAgX192MSAqPSBfX3Vlcm5ncmFuZ2U7CisJCQkgICAgX192MSArPSBfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW47CisJCQkgIH0KKwkJICAgICAgfQorCQkgICAgd2hpbGUgKF9fdjEgPiBfX21hc2t2YWwgfHwgX192MSA8IF9fdG1wKTsKKworCQkgICAgdWludDY0X3QgX192MjsKKwkJICAgIGRvCisJCSAgICAgIHsKKwkJCWRvCisJCQkgIF9fdG1wID0gX191Y3R5cGUoX191cm5nKCkpIC0gX191cm5nbWluOworCQkJd2hpbGUgKF9fdG1wID49IF9fcGFzdCk7CisJCQlfX3YyID0gX190bXAgLyBfX3NjYWxpbmc7CisJCQlmb3IgKHNpemVfdCBfX2NudCA9IDA7IF9fY250IDwgX19ucm5nOyArK19fY250KQorCQkJICB7CisJCQkgICAgX190bXAgPSBfX3YyOworCQkJICAgIF9fdjIgKj0gX191ZXJuZ3JhbmdlOworCQkJICAgIF9fdjIgKz0gX191Y3R5cGUoX191cm5nKCkpIC0gX191cm5nbWluOworCQkJICB9CisJCSAgICAgIH0KKwkJICAgIHdoaWxlIChfX3YyID4gX19tYXNrdmFsIHx8IF9fdjIgPCBfX3RtcCk7CisJCSAgICAKKwkJICAgIF9fdi5fX2kgPSBfbW1fc2V0X2VwaTY0eChfX3YxLCBfX3YyKTsKKwkJICB9CisKKwkJX192Ll9faSA9IF9tbV9vcl9zaTEyOChfX3YuX19pLCBfX3R3byk7CisJCV9feCA9IF9tbV9zdWJfcGQoX192Ll9fZCwgX190aHJlZSk7CisJCV9fbTEyOGQgX19tID0gX21tX211bF9wZChfX3gsIF9feCk7CisJCV9fbGUgPSBfbW1fY3Z0c2RfZjY0KF9tbV9oYWRkX3BkIChfX20sIF9fbSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoX19sZSA9PSAwLjAgfHwgX19sZSA+PSAxLjApOworCisgICAgICAgICAgICBkb3VibGUgX19tdWx0ID0gKHN0ZDo6c3FydCgtMi4wICogc3RkOjpsb2coX19sZSkgLyBfX2xlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIF9fcGFyYW0uc3RkZGV2KCkpOworCisgICAgICAgICAgICBfX3ggPSBfbW1fYWRkX3BkKF9tbV9tdWxfcGQoX194LCBfbW1fc2V0MV9wZChfX211bHQpKSwgX19hdik7CisKKyAgICAgICAgICAgIF9tbV9zdG9yZXVfcGQoX19mLCBfX3gpOworICAgICAgICAgICAgX19mICs9IDI7CisgICAgICAgICAgfQorCisgICAgICAgIGlmIChfX2YgIT0gX190KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdF90eXBlIF9feCwgX195LCBfX3IyOworCisgICAgICAgICAgICBfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorICAgICAgICAgICAgICBfX2F1cm5nKF9fdXJuZyk7CisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3ggPSByZXN1bHRfdHlwZSgyLjApICogX19hdXJuZygpIC0gMS4wOworICAgICAgICAgICAgICAgIF9feSA9IHJlc3VsdF90eXBlKDIuMCkgKiBfX2F1cm5nKCkgLSAxLjA7CisgICAgICAgICAgICAgICAgX19yMiA9IF9feCAqIF9feCArIF9feSAqIF9feTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKF9fcjIgPiAxLjAgfHwgX19yMiA9PSAwLjApOworCisgICAgICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX211bHQgPSBzdGQ6OnNxcnQoLTIgKiBzdGQ6OmxvZyhfX3IyKSAvIF9fcjIpOworICAgICAgICAgICAgX01fc2F2ZWQgPSBfX3ggKiBfX211bHQ7CisgICAgICAgICAgICBfTV9zYXZlZF9hdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgKl9fZiA9IF9feSAqIF9fbXVsdCAqIF9fcGFyYW0uc3RkZGV2KCkgKyBfX3BhcmFtLm1lYW4oKTsKKyAgICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKworI2VuZGlmIC8vIF9CSVRTX09QVF9SQU5ET01fSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9vc19kZWZpbmVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL29zX2RlZmluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWU0MDc1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9vc19kZWZpbmVzLmgKQEAgLTAsMCArMSw0OCBAQAorLy8gU3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIEdOVS9MaW51eCAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvb3NfZGVmaW5lcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zZndkfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfT1NfREVGSU5FUworI2RlZmluZSBfR0xJQkNYWF9PU19ERUZJTkVTIDEKKworLy8gU3lzdGVtLXNwZWNpZmljICNkZWZpbmUsIHR5cGVkZWZzLCBjb3JyZWN0aW9ucywgZXRjLCBnbyBoZXJlLiAgVGhpcworLy8gZmlsZSB3aWxsIGNvbWUgYmVmb3JlIGFsbCBvdGhlcnMuCisKKy8vIFRoaXMga2VlcHMgaXNhbnVtLCBldCBhbCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQgYXMgbWFjcm9zLgorI2RlZmluZSBfX05PX0NUWVBFIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8vIFByb3ZpZGUgYSBkZWNsYXJhdGlvbiBmb3IgdGhlIHBvc3NpYmx5IGRlcHJlY2F0ZWQgZ2V0cyBmdW5jdGlvbiwgYXMKKy8vIGdsaWJjIDIuMTUgYW5kIGxhdGVyIGRvZXMgbm90IGRlY2xhcmUgZ2V0cyBmb3IgSVNPIEMxMSB3aGVuCisvLyBfX0dOVV9TT1VSQ0UgaXMgZGVmaW5lZC4KKyNpZiBfX0dMSUJDX1BSRVJFUSgyLDE1KSAmJiBkZWZpbmVkKF9HTlVfU09VUkNFKQorIyB1bmRlZiBfR0xJQkNYWF9IQVZFX0dFVFMKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvc3RkYysrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL3N0ZGMrKy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NTM3N2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL3N0ZGMrKy5oCkBAIC0wLDAgKzEsMTE3IEBACisvLyBDKysgaW5jbHVkZXMgdXNlZCBmb3IgcHJlY29tcGlsaW5nIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBzdGRjKysuaAorICogIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZmlsZSBmb3IgYSBwcmVjb21waWxlZCBoZWFkZXIuCisgKi8KKworLy8gMTcuNC4xLjIgSGVhZGVycworCisvLyBDCisjaWZuZGVmIF9HTElCQ1hYX05PX0FTU0VSVAorI2luY2x1ZGUgPGNhc3NlcnQ+CisjZW5kaWYKKyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPGNmbG9hdD4KKyNpbmNsdWRlIDxjaXNvNjQ2PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y2xvY2FsZT4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxjc2V0am1wPgorI2luY2x1ZGUgPGNzaWduYWw+CisjaW5jbHVkZSA8Y3N0ZGFyZz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y3RpbWU+CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8Y2NvbXBsZXg+CisjaW5jbHVkZSA8Y2ZlbnY+CisjaW5jbHVkZSA8Y2ludHR5cGVzPgorI2luY2x1ZGUgPGNzdGRhbGlnbj4KKyNpbmNsdWRlIDxjc3RkYm9vbD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGN0Z21hdGg+CisjaW5jbHVkZSA8Y3djaGFyPgorI2luY2x1ZGUgPGN3Y3R5cGU+CisjZW5kaWYKKworLy8gQysrCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxjb21wbGV4PgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3M+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGlzdHJlYW0+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3RyZWFtYnVmPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZhbGFycmF5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxmb3J3YXJkX2xpc3Q+CisjaW5jbHVkZSA8ZnV0dXJlPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8cmFuZG9tPgorI2luY2x1ZGUgPHJhdGlvPgorI2luY2x1ZGUgPHJlZ2V4PgorI2luY2x1ZGUgPHNjb3BlZF9hbGxvY2F0b3I+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx0eXBlaW5kZXg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL3N0ZHRyMWMrKy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9zdGR0cjFjKysuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmJmMTM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9zdGR0cjFjKysuaApAQCAtMCwwICsxLDUzIEBACisvLyBDKysgaW5jbHVkZXMgdXNlZCBmb3IgcHJlY29tcGlsaW5nIFRSMSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgc3RkdHIxYysrLmgKKyAqICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGZpbGUgZm9yIGEgcHJlY29tcGlsZWQgaGVhZGVyLgorICovCisKKyNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgorCisjaW5jbHVkZSA8dHIxL2FycmF5PgorI2luY2x1ZGUgPHRyMS9jY3R5cGU+CisjaW5jbHVkZSA8dHIxL2NmZW52PgorI2luY2x1ZGUgPHRyMS9jZmxvYXQ+CisjaW5jbHVkZSA8dHIxL2NpbnR0eXBlcz4KKyNpbmNsdWRlIDx0cjEvY2xpbWl0cz4KKyNpbmNsdWRlIDx0cjEvY21hdGg+CisjaW5jbHVkZSA8dHIxL2NvbXBsZXg+CisjaW5jbHVkZSA8dHIxL2NzdGRhcmc+CisjaW5jbHVkZSA8dHIxL2NzdGRib29sPgorI2luY2x1ZGUgPHRyMS9jc3RkaW50PgorI2luY2x1ZGUgPHRyMS9jc3RkaW8+CisjaW5jbHVkZSA8dHIxL2NzdGRsaWI+CisjaW5jbHVkZSA8dHIxL2N0Z21hdGg+CisjaW5jbHVkZSA8dHIxL2N0aW1lPgorI2luY2x1ZGUgPHRyMS9jd2NoYXI+CisjaW5jbHVkZSA8dHIxL2N3Y3R5cGU+CisjaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+CisjaW5jbHVkZSA8dHIxL3JhbmRvbT4KKyNpbmNsdWRlIDx0cjEvdHVwbGU+CisjaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dHIxL3V0aWxpdHk+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL3RpbWVfbWVtYmVycy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy90aW1lX21lbWJlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2IzY2MyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy90aW1lX21lbWJlcnMuaApAQCAtMCwwICsxLDg5IEBACisvLyBzdGQ6OnRpbWVfZ2V0LCBzdGQ6OnRpbWVfcHV0IGltcGxlbWVudGF0aW9uLCBHTlUgdmVyc2lvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy90aW1lX21lbWJlcnMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xvY2FsZX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMi41LjEuMiAtIHRpbWVfZ2V0IGZ1bmN0aW9ucworLy8gSVNPIEMrKyAxNDg4MjogMjIuMi41LjMuMiAtIHRpbWVfcHV0IGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfX3RpbWVwdW5jdDxfQ2hhclQ+OjpfX3RpbWVwdW5jdChzaXplX3QgX19yZWZzKSAKKyAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2RhdGEoMCksIF9NX2NfbG9jYWxlX3RpbWVwdW5jdCgwKSwgCisgICAgICBfTV9uYW1lX3RpbWVwdW5jdChfU19nZXRfY19uYW1lKCkpCisgICAgeyBfTV9pbml0aWFsaXplX3RpbWVwdW5jdCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIF9fdGltZXB1bmN0PF9DaGFyVD46Ol9fdGltZXB1bmN0KF9fY2FjaGVfdHlwZSogX19jYWNoZSwgc2l6ZV90IF9fcmVmcykgCisgICAgOiBmYWNldChfX3JlZnMpLCBfTV9kYXRhKF9fY2FjaGUpLCBfTV9jX2xvY2FsZV90aW1lcHVuY3QoMCksIAorICAgICAgX01fbmFtZV90aW1lcHVuY3QoX1NfZ2V0X2NfbmFtZSgpKQorICAgIHsgX01faW5pdGlhbGl6ZV90aW1lcHVuY3QoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfX3RpbWVwdW5jdDxfQ2hhclQ+OjpfX3RpbWVwdW5jdChfX2NfbG9jYWxlIF9fY2xvYywgY29uc3QgY2hhciogX19zLAorCQkJCSAgICAgc2l6ZV90IF9fcmVmcykgCisgICAgOiBmYWNldChfX3JlZnMpLCBfTV9kYXRhKDApLCBfTV9jX2xvY2FsZV90aW1lcHVuY3QoMCksIAorICAgICAgX01fbmFtZV90aW1lcHVuY3QoMCkKKyAgICB7CisgICAgICBpZiAoX19idWlsdGluX3N0cmNtcChfX3MsIF9TX2dldF9jX25hbWUoKSkgIT0gMCkKKwl7CisJICBjb25zdCBzaXplX3QgX19sZW4gPSBfX2J1aWx0aW5fc3RybGVuKF9fcykgKyAxOworCSAgY2hhciogX190bXAgPSBuZXcgY2hhcltfX2xlbl07CisJICBfX2J1aWx0aW5fbWVtY3B5KF9fdG1wLCBfX3MsIF9fbGVuKTsKKwkgIF9NX25hbWVfdGltZXB1bmN0ID0gX190bXA7CisJfQorICAgICAgZWxzZQorCV9NX25hbWVfdGltZXB1bmN0ID0gX1NfZ2V0X2NfbmFtZSgpOworCisgICAgICBfX3RyeQorCXsgX01faW5pdGlhbGl6ZV90aW1lcHVuY3QoX19jbG9jKTsgfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgaWYgKF9NX25hbWVfdGltZXB1bmN0ICE9IF9TX2dldF9jX25hbWUoKSkKKwkgICAgZGVsZXRlIFtdIF9NX25hbWVfdGltZXB1bmN0OworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgX190aW1lcHVuY3Q8X0NoYXJUPjo6fl9fdGltZXB1bmN0KCkKKyAgICB7IAorICAgICAgaWYgKF9NX25hbWVfdGltZXB1bmN0ICE9IF9TX2dldF9jX25hbWUoKSkKKwlkZWxldGUgW10gX01fbmFtZV90aW1lcHVuY3Q7CisgICAgICBkZWxldGUgX01fZGF0YTsgCisgICAgICBfU19kZXN0cm95X2NfbG9jYWxlKF9NX2NfbG9jYWxlX3RpbWVwdW5jdCk7IAorICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvZXh0L29wdF9yYW5kb20uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2V4dC9vcHRfcmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3NWIwNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2V4dC9vcHRfcmFuZG9tLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8vIE9wdGltaXphdGlvbnMgZm9yIHJhbmRvbSBudW1iZXIgZXh0ZW5zaW9ucywgeDg2IHZlcnNpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9yYW5kb20udGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXh0L3JhbmRvbX0KKyAqLworCisjaWZuZGVmIF9FWFRfT1BUX1JBTkRPTV9ICisjZGVmaW5lIF9FWFRfT1BUX1JBTkRPTV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KKworI2lmZGVmIF9fU1NFMl9fCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICBuYW1lc3BhY2UgeworCisgICAgdGVtcGxhdGU8c2l6ZV90IF9fc2wxLCBzaXplX3QgX19zbDIsIHNpemVfdCBfX3NyMSwgc2l6ZV90IF9fc3IyLAorCSAgICAgdWludDMyX3QgX19tc2sxLCB1aW50MzJfdCBfX21zazIsIHVpbnQzMl90IF9fbXNrMywgdWludDMyX3QgX19tc2s0PgorICAgICAgaW5saW5lIF9fbTEyOGkgX19zc2UyX3JlY3Vyc2lvbihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IsCisJCQkJICAgICAgX19tMTI4aSBfX2MsIF9fbTEyOGkgX19kKQorICAgICAgeworCV9fbTEyOGkgX195ID0gX21tX3NybGlfZXBpMzIoX19iLCBfX3NyMSk7CisJX19tMTI4aSBfX3ogPSBfbW1fc3JsaV9zaTEyOChfX2MsIF9fc3IyKTsKKwlfX20xMjhpIF9fdiA9IF9tbV9zbGxpX2VwaTMyKF9fZCwgX19zbDEpOworCV9feiA9IF9tbV94b3Jfc2kxMjgoX196LCBfX2EpOworCV9feiA9IF9tbV94b3Jfc2kxMjgoX196LCBfX3YpOworCV9fbTEyOGkgX194ID0gX21tX3NsbGlfc2kxMjgoX19hLCBfX3NsMik7CisJX195ID0gX21tX2FuZF9zaTEyOChfX3ksIF9tbV9zZXRfZXBpMzIoX19tc2s0LCBfX21zazMsIF9fbXNrMiwgX19tc2sxKSk7CisJX196ID0gX21tX3hvcl9zaTEyOChfX3osIF9feCk7CisJcmV0dXJuIF9tbV94b3Jfc2kxMjgoX196LCBfX3kpOworICAgICAgfQorCisgIH0KKworCisjZGVmaW5lIF9HTElCQ1hYX09QVF9IQVZFX1JBTkRPTV9TRk1UX0dFTl9SRUFECTEKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX19tLAorCSAgIHNpemVfdCBfX3BvczEsIHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLAorCSAgIHNpemVfdCBfX3NyMSwgc2l6ZV90IF9fc3IyLAorCSAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLAorCSAgIHVpbnQzMl90IF9fbXNrMywgdWludDMyX3QgX19tc2s0LAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MSwgdWludDMyX3QgX19wYXJpdHkyLAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MywgdWludDMyX3QgX19wYXJpdHk0PgorICAgIHZvaWQgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX19tLAorCQkJCQkgICBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCQkJCQkgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJCQkJCSAgIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsCisJCQkJCSAgIF9fcGFyaXR5ND46OgorICAgIF9NX2dlbl9yYW5kKHZvaWQpCisgICAgeworICAgICAgX19tMTI4aSBfX3IxID0gX21tX2xvYWRfc2kxMjgoJl9NX3N0YXRlW19NX25zdGF0ZSAtIDJdKTsKKyAgICAgIF9fbTEyOGkgX19yMiA9IF9tbV9sb2FkX3NpMTI4KCZfTV9zdGF0ZVtfTV9uc3RhdGUgLSAxXSk7CisKKyAgICAgIHNpemVfdCBfX2k7CisgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9NX25zdGF0ZSAtIF9fcG9zMTsgKytfX2kpCisJeworCSAgX19tMTI4aSBfX3IgPSBfX3NzZTJfcmVjdXJzaW9uPF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCQkJCQkgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0PgorCSAgICAoX01fc3RhdGVbX19pXSwgX01fc3RhdGVbX19pICsgX19wb3MxXSwgX19yMSwgX19yMik7CisJICBfbW1fc3RvcmVfc2kxMjgoJl9NX3N0YXRlW19faV0sIF9fcik7CisJICBfX3IxID0gX19yMjsKKwkgIF9fcjIgPSBfX3I7CisJfQorICAgICAgZm9yICg7IF9faSA8IF9NX25zdGF0ZTsgKytfX2kpCisJeworCSAgX19tMTI4aSBfX3IgPSBfX3NzZTJfcmVjdXJzaW9uPF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCQkJCQkgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0PgorCSAgICAoX01fc3RhdGVbX19pXSwgX01fc3RhdGVbX19pICsgX19wb3MxIC0gX01fbnN0YXRlXSwgX19yMSwgX19yMik7CisJICBfbW1fc3RvcmVfc2kxMjgoJl9NX3N0YXRlW19faV0sIF9fcik7CisJICBfX3IxID0gX19yMjsKKwkgIF9fcjIgPSBfX3I7CisJfQorCisgICAgICBfTV9wb3MgPSAwOworICAgIH0KKworCisjZGVmaW5lIF9HTElCQ1hYX09QVF9IQVZFX1JBTkRPTV9TRk1UX09QRVJBVE9SRVFVQUwJMQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX20sCisJICAgc2l6ZV90IF9fcG9zMSwgc2l6ZV90IF9fc2wxLCBzaXplX3QgX19zbDIsCisJICAgc2l6ZV90IF9fc3IxLCBzaXplX3QgX19zcjIsCisJICAgdWludDMyX3QgX19tc2sxLCB1aW50MzJfdCBfX21zazIsCisJICAgdWludDMyX3QgX19tc2szLCB1aW50MzJfdCBfX21zazQsCisJICAgdWludDMyX3QgX19wYXJpdHkxLCB1aW50MzJfdCBfX3Bhcml0eTIsCisJICAgdWludDMyX3QgX19wYXJpdHkzLCB1aW50MzJfdCBfX3Bhcml0eTQ+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX19nbnVfY3h4OjpzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLAorCSAgICAgICBfX20sIF9fcG9zMSwgX19zbDEsIF9fc2wyLCBfX3NyMSwgX19zcjIsCisJICAgICAgIF9fbXNrMSwgX19tc2syLCBfX21zazMsIF9fbXNrNCwKKwkgICAgICAgX19wYXJpdHkxLCBfX3Bhcml0eTIsIF9fcGFyaXR5MywgX19wYXJpdHk0PiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6c2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwKKwkgICAgICAgX19tLCBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCSAgICAgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJICAgICAgIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsIF9fcGFyaXR5ND4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fbTEyOGkgX19yZXMgPSBfbW1fY21wZXFfZXBpOChfX2xocy5fTV9zdGF0ZVswXSwgX19yaHMuX01fc3RhdGVbMF0pOworICAgICAgZm9yIChzaXplX3QgX19pID0gMTsgX19pIDwgX19saHMuX01fbnN0YXRlOyArK19faSkKKwlfX3JlcyA9IF9tbV9hbmRfc2kxMjgoX19yZXMsIF9tbV9jbXBlcV9lcGk4KF9fbGhzLl9NX3N0YXRlW19faV0sCisJCQkJCQkgICAgX19yaHMuX01fc3RhdGVbX19pXSkpOworICAgICAgcmV0dXJuIChfbW1fbW92ZW1hc2tfZXBpOChfX3JlcykgPT0gMHhmZmZmCisJICAgICAgJiYgX19saHMuX01fcG9zID09IF9fcmhzLl9NX3Bvcyk7CisgICAgfQorCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9fU1NFMl9fCisKKyNlbmRpZiAvLyBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXworCisjZW5kaWYgLy8gX0VYVF9PUFRfUkFORE9NX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYXRvbWljX3dvcmQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYXRvbWljX3dvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjgzN2Y0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9hdG9taWNfd29yZC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vIExvdy1sZXZlbCB0eXBlIGZvciBhdG9taWMgb3BlcmF0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYXRvbWljX3dvcmQuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQVRPTUlDX1dPUkRfSAorI2RlZmluZSBfR0xJQkNYWF9BVE9NSUNfV09SRF9ICTEKKwordHlwZWRlZiBpbnQgX0F0b21pY193b3JkOworCisvLyBEZWZpbmUgdGhlc2UgdHdvIG1hY3JvcyB1c2luZyB0aGUgYXBwcm9wcmlhdGUgbWVtb3J5IGJhcnJpZXIgZm9yIHRoZSB0YXJnZXQuCisvLyBUaGUgY29tbWVudGVkIG91dCB2ZXJzaW9ucyBiZWxvdyBhcmUgdGhlIGRlZmF1bHRzLgorLy8gU2VlIGlhNjQvYXRvbWljX3dvcmQuaCBmb3IgYW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2guCisKKy8vIFRoaXMgb25lIHByZXZlbnRzIGxvYWRzIGZyb20gYmVpbmcgaG9pc3RlZCBhY3Jvc3MgdGhlIGJhcnJpZXI7CisvLyBpbiBvdGhlciB3b3JkcywgdGhpcyBpcyBhIExvYWQtTG9hZCBhY3F1aXJlIGJhcnJpZXIuCisvLyBUaGlzIGlzIG5lY2Vzc2FyeSBpZmYgVEFSR0VUX1JFTEFYRURfT1JERVJJTkcgaXMgZGVmaW5lZCBpbiB0bS5oLiAgCisvLyAjZGVmaW5lIF9HTElCQ1hYX1JFQURfTUVNX0JBUlJJRVIgX19hc20gX192b2xhdGlsZSAoIiI6OjoibWVtb3J5IikKKworLy8gVGhpcyBvbmUgcHJldmVudHMgc3RvcmVzIGZyb20gYmVpbmcgc3VuayBhY3Jvc3MgdGhlIGJhcnJpZXI7IGluIG90aGVyCisvLyB3b3JkcywgYSBTdG9yZS1TdG9yZSByZWxlYXNlIGJhcnJpZXIuCisvLyAjZGVmaW5lIF9HTElCQ1hYX1dSSVRFX01FTV9CQVJSSUVSIF9fYXNtIF9fdm9sYXRpbGUgKCIiOjo6Im1lbW9yeSIpCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYmFzaWNfZmlsZS5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9iYXNpY19maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlOGM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYmFzaWNfZmlsZS5oCkBAIC0wLDAgKzEsMTEwIEBACisvLyBXcmFwcGVyIG9mIEMtbGFuZ3VhZ2UgRklMRSBzdHJ1Y3QgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjggIEZpbGUtYmFzZWQgc3RyZWFtcworLy8KKworLyoqIEBmaWxlIGJpdHMvYmFzaWNfZmlsZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQkFTSUNfRklMRV9TVERJT19ICisjZGVmaW5lIF9HTElCQ1hYX0JBU0lDX0ZJTEVfU1RESU9fSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9jKytpby5oPiAgLy8gZm9yIF9fY19sb2NrIGFuZCBfX2NfZmlsZQorI2luY2x1ZGUgPGlvcz4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEdlbmVyaWMgZGVjbGFyYXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBfX2Jhc2ljX2ZpbGU7IAorCisgIC8vIFNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgX19iYXNpY19maWxlPGNoYXI+CisgICAgeworICAgICAgLy8gVW5kZXJseWluZyBkYXRhIHNvdXJjZS9zaW5rLgorICAgICAgX19jX2ZpbGUqIAlfTV9jZmlsZTsKKworICAgICAgLy8gVHJ1ZSBpZmYgd2Ugb3BlbmVkIF9NX2NmaWxlLCBhbmQgdGh1cyBtdXN0IGNsb3NlIGl0IG91cnNlbHZlcy4KKyAgICAgIGJvb2wgCQlfTV9jZmlsZV9jcmVhdGVkOworCisgICAgcHVibGljOgorICAgICAgX19iYXNpY19maWxlKF9fY19sb2NrKiBfX2xvY2sgPSAwKSB0aHJvdyAoKTsKKworICAgICAgX19iYXNpY19maWxlKiAKKyAgICAgIG9wZW4oY29uc3QgY2hhciogX19uYW1lLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlLCBpbnQgX19wcm90ID0gMDY2NCk7CisKKyAgICAgIF9fYmFzaWNfZmlsZSoKKyAgICAgIHN5c19vcGVuKF9fY19maWxlKiBfX2ZpbGUsIGlvc19iYXNlOjpvcGVubW9kZSk7CisKKyAgICAgIF9fYmFzaWNfZmlsZSoKKyAgICAgIHN5c19vcGVuKGludCBfX2ZkLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKSB0aHJvdyAoKTsKKworICAgICAgX19iYXNpY19maWxlKiAKKyAgICAgIGNsb3NlKCk7IAorCisgICAgICBfR0xJQkNYWF9QVVJFIGJvb2wgCisgICAgICBpc19vcGVuKCkgY29uc3QgdGhyb3cgKCk7CisKKyAgICAgIF9HTElCQ1hYX1BVUkUgaW50IAorICAgICAgZmQoKSB0aHJvdyAoKTsKKworICAgICAgX0dMSUJDWFhfUFVSRSBfX2NfZmlsZSoKKyAgICAgIGZpbGUoKSB0aHJvdyAoKTsKKworICAgICAgfl9fYmFzaWNfZmlsZSgpOworCisgICAgICBzdHJlYW1zaXplIAorICAgICAgeHNwdXRuKGNvbnN0IGNoYXIqIF9fcywgc3RyZWFtc2l6ZSBfX24pOworCisgICAgICBzdHJlYW1zaXplIAorICAgICAgeHNwdXRuXzIoY29uc3QgY2hhciogX19zMSwgc3RyZWFtc2l6ZSBfX24xLAorCSAgICAgICBjb25zdCBjaGFyKiBfX3MyLCBzdHJlYW1zaXplIF9fbjIpOworCisgICAgICBzdHJlYW1zaXplIAorICAgICAgeHNnZXRuKGNoYXIqIF9fcywgc3RyZWFtc2l6ZSBfX24pOworCisgICAgICBzdHJlYW1vZmYKKyAgICAgIHNlZWtvZmYoc3RyZWFtb2ZmIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX3dheSkgdGhyb3cgKCk7CisKKyAgICAgIGludCAKKyAgICAgIHN5bmMoKTsKKworICAgICAgc3RyZWFtc2l6ZQorICAgICAgc2hvd21hbnljKCk7CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYJCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2MrK2FsbG9jYXRvci5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jKythbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDcwYmNjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jKythbGxvY2F0b3IuaApAQCAtMCwwICsxLDU1IEBACisvLyBCYXNlIHRvIHN0ZDo6YWxsb2NhdG9yIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2MrK2FsbG9jYXRvci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWVtb3J5fQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1hYX0FMTE9DQVRPUl9ICisjZGVmaW5lIF9HTElCQ1hYX0NYWF9BTExPQ0FUT1JfSCAxCisKKyNpbmNsdWRlIDxleHQvbmV3X2FsbG9jYXRvci5oPgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorbmFtZXNwYWNlIHN0ZAoreworICAvKioKKyAgICogIEBicmllZiAgQW4gYWxpYXMgdG8gdGhlIGJhc2UgY2xhc3MgZm9yIHN0ZDo6YWxsb2NhdG9yLgorICAgKiAgQGluZ3JvdXAgYWxsb2NhdG9ycworICAgKgorICAgKiAgVXNlZCB0byBzZXQgdGhlIHN0ZDo6YWxsb2NhdG9yIGJhc2UgY2xhc3MgdG8KKyAgICogIF9fZ251X2N4eDo6bmV3X2FsbG9jYXRvci4KKyAgICoKKyAgICogIEB0cGFyYW0gIF9UcCAgVHlwZSBvZiBhbGxvY2F0ZWQgb2JqZWN0LgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB1c2luZyBfX2FsbG9jYXRvcl9iYXNlID0gX19nbnVfY3h4OjpuZXdfYWxsb2NhdG9yPF9UcD47Cit9CisjZWxzZQorLy8gRGVmaW5lIG5ld19hbGxvY2F0b3IgYXMgdGhlIGJhc2UgY2xhc3MgdG8gc3RkOjphbGxvY2F0b3IuCisjIGRlZmluZSBfX2FsbG9jYXRvcl9iYXNlICBfX2dudV9jeHg6Om5ld19hbGxvY2F0b3IKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYysrY29uZmlnLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2MrK2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYjc1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2MrK2NvbmZpZy5oCkBAIC0wLDAgKzEsMTY2NiBAQAorLy8gUHJlZGVmaW5lZCBzeW1ib2xzIGFuZCBtYWNyb3MgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvYysrY29uZmlnLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3Nmd2R9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9DWFhfQ09ORklHX0gKKyNkZWZpbmUgX0dMSUJDWFhfQ1hYX0NPTkZJR19IIDEKKworLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgQysrIGxpYnJhcnkgaW4gY29tcHJlc3NlZCBJU08gZGF0ZSBmb3JtYXQuCisjZGVmaW5lIF9fR0xJQkNYWF9fIDIwMTQwNTIyCisKKy8vIE1hY3JvcyBmb3IgdmFyaW91cyBhdHRyaWJ1dGVzLgorLy8gICBfR0xJQkNYWF9QVVJFCisvLyAgIF9HTElCQ1hYX0NPTlNUCisvLyAgIF9HTElCQ1hYX05PUkVUVVJOCisvLyAgIF9HTElCQ1hYX05PVEhST1cKKy8vICAgX0dMSUJDWFhfVklTSUJJTElUWQorI2lmbmRlZiBfR0xJQkNYWF9QVVJFCisjIGRlZmluZSBfR0xJQkNYWF9QVVJFIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9DT05TVAorIyBkZWZpbmUgX0dMSUJDWFhfQ09OU1QgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9OT1JFVFVSTgorIyBkZWZpbmUgX0dMSUJDWFhfTk9SRVRVUk4gX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpCisjZW5kaWYKKworLy8gU2VlIGJlbG93IGZvciBDKysKKyNpZm5kZWYgX0dMSUJDWFhfTk9USFJPVworIyBpZm5kZWYgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBfR0xJQkNYWF9OT1RIUk9XIF9fYXR0cmlidXRlX18oKF9fbm90aHJvd19fKSkKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIHZpc2liaWxpdHkgYXR0cmlidXRlcy4KKy8vICAgX0dMSUJDWFhfSEFWRV9BVFRSSUJVVEVfVklTSUJJTElUWQorLy8gICBfR0xJQkNYWF9WSVNJQklMSVRZCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FUVFJJQlVURV9WSVNJQklMSVRZIDEKKworI2lmIF9HTElCQ1hYX0hBVkVfQVRUUklCVVRFX1ZJU0lCSUxJVFkKKyMgZGVmaW5lIF9HTElCQ1hYX1ZJU0lCSUxJVFkoVikgX19hdHRyaWJ1dGVfXyAoKF9fdmlzaWJpbGl0eV9fICgjVikpKQorI2Vsc2UKKy8vIElmIHRoaXMgaXMgbm90IHN1cHBsaWVkIGJ5IHRoZSBPUy1zcGVjaWZpYyBvciBDUFUtc3BlY2lmaWMKKy8vIGhlYWRlcnMgaW5jbHVkZWQgYmVsb3csIGl0IHdpbGwgYmUgZGVmaW5lZCB0byBhbiBlbXB0eSBkZWZhdWx0LgorIyBkZWZpbmUgX0dMSUJDWFhfVklTSUJJTElUWShWKSBfR0xJQkNYWF9QU0VVRE9fVklTSUJJTElUWShWKQorI2VuZGlmCisKKy8vIE1hY3JvcyBmb3IgZGVwcmVjYXRlZCBhdHRyaWJ1dGVzLgorLy8gICBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorLy8gICBfR0xJQkNYWF9ERVBSRUNBVEVECisjaWZuZGVmIF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisjIGRlZmluZSBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRCAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19ERVBSRUNBVEVEKSAmJiAoX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0RFUFJFQ0FURUQgX19hdHRyaWJ1dGVfXyAoKF9fZGVwcmVjYXRlZF9fKSkKKyNlbHNlCisjIGRlZmluZSBfR0xJQkNYWF9ERVBSRUNBVEVECisjZW5kaWYKKworLy8gTWFjcm9zIGZvciBBQkkgdGFnIGF0dHJpYnV0ZXMuCisjaWZuZGVmIF9HTElCQ1hYX0FCSV9UQUdfQ1hYMTEKKyMgZGVmaW5lIF9HTElCQ1hYX0FCSV9UQUdfQ1hYMTEgX19hdHRyaWJ1dGUgKChfX2FiaV90YWdfXyAoImN4eDExIikpKQorI2VuZGlmCisKKworI2lmIF9fY3BsdXNwbHVzCisKKy8vIE1hY3JvIGZvciBjb25zdGV4cHIsIHRvIHN1cHBvcnQgaW4gbWl4ZWQgMDMvMHggbW9kZS4KKyNpZm5kZWYgX0dMSUJDWFhfQ09OU1RFWFBSCisjIGlmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgIGRlZmluZSBfR0xJQkNYWF9DT05TVEVYUFIgY29uc3RleHByCisjICBkZWZpbmUgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBjb25zdGV4cHIKKyMgZWxzZQorIyAgZGVmaW5lIF9HTElCQ1hYX0NPTlNURVhQUgorIyAgZGVmaW5lIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgY29uc3QKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBNYWNybyBmb3Igbm9leGNlcHQsIHRvIHN1cHBvcnQgaW4gbWl4ZWQgMDMvMHggbW9kZS4KKyNpZm5kZWYgX0dMSUJDWFhfTk9FWENFUFQKKyMgaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyAgZGVmaW5lIF9HTElCQ1hYX05PRVhDRVBUIG5vZXhjZXB0CisjICBkZWZpbmUgX0dMSUJDWFhfVVNFX05PRVhDRVBUIG5vZXhjZXB0CisjICBkZWZpbmUgX0dMSUJDWFhfVEhST1coX0VYQykKKyMgZWxzZQorIyAgZGVmaW5lIF9HTElCQ1hYX05PRVhDRVBUCisjICBkZWZpbmUgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHRocm93KCkKKyMgIGRlZmluZSBfR0xJQkNYWF9USFJPVyhfRVhDKSB0aHJvdyhfRVhDKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfTk9USFJPVworIyBkZWZpbmUgX0dMSUJDWFhfTk9USFJPVyBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX1RIUk9XX09SX0FCT1JUCisjIGlmIF9fRVhDRVBUSU9OUworIyAgZGVmaW5lIF9HTElCQ1hYX1RIUk9XX09SX0FCT1JUKF9FWEMpICh0aHJvdyAoX0VYQykpCisjIGVsc2UKKyMgIGRlZmluZSBfR0xJQkNYWF9USFJPV19PUl9BQk9SVChfRVhDKSAoX19idWlsdGluX2Fib3J0KCkpCisjIGVuZGlmCisjZW5kaWYKKworLy8gTWFjcm8gZm9yIGV4dGVybiB0ZW1wbGF0ZSwgaWUgY29udHJvbGluZyB0ZW1wbGF0ZSBsaW5rYWdlIHZpYSB1c2UKKy8vIG9mIGV4dGVybiBrZXl3b3JkIG9uIHRlbXBsYXRlIGRlY2xhcmF0aW9uLiBBcyBkb2N1bWVudGVkIGluIHRoZSBnKysKKy8vIG1hbnVhbCwgaXQgaW5oaWJpdHMgYWxsIGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGFuZCBpcyB1c2VkCisvLyB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5IHRvIGF2b2lkIG11bHRpcGxlIHdlYWsgZGVmaW5pdGlvbnMgZm9yCisvLyByZXF1aXJlZCB0eXBlcyB0aGF0IGFyZSBhbHJlYWR5IGV4cGxpY2l0bHkgaW5zdGFudGlhdGVkIGluIHRoZQorLy8gbGlicmFyeSBiaW5hcnkuIFRoaXMgc3Vic3RhbnRpYWxseSByZWR1Y2VzIHRoZSBiaW5hcnkgc2l6ZSBvZgorLy8gcmVzdWx0aW5nIGV4ZWN1dGFibGVzLgorLy8gU3BlY2lhbCBjYXNlOiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUgPT0gLTEgZGlzYWxsb3dzIGV4dGVybgorLy8gdGVtcGxhdGVzIG9ubHkgaW4gYmFzaWNfc3RyaW5nLCB0aHVzIGFjdGl2YXRpbmcgaXRzIGRlYnVnLW1vZGUKKy8vIGNoZWNrcyBldmVuIGF0IC1PMC4KKyMgZGVmaW5lIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURSAxCisKKy8qCisgIE91dGxpbmUgb2YgbGlic3RkYysrIG5hbWVzcGFjZXMuCisKKyAgbmFtZXNwYWNlIHN0ZAorICB7CisgICAgbmFtZXNwYWNlIF9fZGVidWcgeyB9CisgICAgbmFtZXNwYWNlIF9fcGFyYWxsZWwgeyB9CisgICAgbmFtZXNwYWNlIF9fcHJvZmlsZSB7IH0KKyAgICBuYW1lc3BhY2UgX19jeHgxOTk4IHsgfQorCisgICAgbmFtZXNwYWNlIF9fZGV0YWlsIHsgfQorCisgICAgbmFtZXNwYWNlIHJlbF9vcHMgeyB9CisKKyAgICBuYW1lc3BhY2UgdHIxCisgICAgeworICAgICAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycyB7IH0KKyAgICAgIG5hbWVzcGFjZSByZWdleF9jb25zdGFudHMgeyB9CisgICAgICBuYW1lc3BhY2UgX19kZXRhaWwgeyB9CisgICAgfQorCisgICAgbmFtZXNwYWNlIHRyMiB7IH0KKyAgICAKKyAgICBuYW1lc3BhY2UgZGVjaW1hbCB7IH0KKworICAgIG5hbWVzcGFjZSBjaHJvbm8geyB9CisgICAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycyB7IH0KKyAgICBuYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzIHsgfQorICAgIG5hbWVzcGFjZSB0aGlzX3RocmVhZCB7IH0KKyAgfQorCisgIG5hbWVzcGFjZSBhYmkgeyB9CisKKyAgbmFtZXNwYWNlIF9fZ251X2N4eAorICB7CisgICAgbmFtZXNwYWNlIF9fZGV0YWlsIHsgfQorICB9CisKKyAgRm9yIGZ1bGwgZGV0YWlscyBzZWU6CisgIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9sYXRlc3QtZG94eWdlbi9uYW1lc3BhY2VzLmh0bWwKKyovCituYW1lc3BhY2Ugc3RkCit7CisgIHR5cGVkZWYgX19TSVpFX1RZUEVfXyAJc2l6ZV90OworICB0eXBlZGVmIF9fUFRSRElGRl9UWVBFX18JcHRyZGlmZl90OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0eXBlZGVmIGRlY2x0eXBlKG51bGxwdHIpCW51bGxwdHJfdDsKKyNlbmRpZgorfQorCisKKy8vIERlZmluZWQgaWYgaW5saW5lIG5hbWVzcGFjZXMgYXJlIHVzZWQgZm9yIHZlcnNpb25pbmcuCisjIGRlZmluZSBfR0xJQkNYWF9JTkxJTkVfVkVSU0lPTiAwIAorCisvLyBJbmxpbmUgbmFtZXNwYWNlIGZvciBzeW1ib2wgdmVyc2lvbmluZy4KKyNpZiBfR0xJQkNYWF9JTkxJTkVfVkVSU0lPTgorCituYW1lc3BhY2Ugc3RkCit7CisgIGlubGluZSBuYW1lc3BhY2UgX183IHsgfQorCisgIG5hbWVzcGFjZSByZWxfb3BzIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKworICBuYW1lc3BhY2UgdHIxCisgIHsKKyAgICBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0KKyAgICBuYW1lc3BhY2UgcGxhY2Vob2xkZXJzIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKyAgICBuYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKyAgICBuYW1lc3BhY2UgX19kZXRhaWwgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorICB9CisKKyAgbmFtZXNwYWNlIHRyMgorICB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisKKyAgbmFtZXNwYWNlIGRlY2ltYWwgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorCisgIG5hbWVzcGFjZSBjaHJvbm8geyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorICBuYW1lc3BhY2UgcGxhY2Vob2xkZXJzIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKyAgbmFtZXNwYWNlIHJlZ2V4X2NvbnN0YW50cyB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisgIG5hbWVzcGFjZSB0aGlzX3RocmVhZCB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisKKyAgbmFtZXNwYWNlIF9fZGV0YWlsIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KK30KKworbmFtZXNwYWNlIF9fZ251X2N4eAoreworICBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0KKyAgbmFtZXNwYWNlIF9fZGV0YWlsIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KK30KKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OIG5hbWVzcGFjZSBfXzcgeworIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OIH0KKyNlbHNlCisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisjZW5kaWYKKworCisvLyBJbmxpbmUgbmFtZXNwYWNlcyBmb3Igc3BlY2lhbCBtb2RlczogZGVidWcsIHBhcmFsbGVsLCBwcm9maWxlLgorI2lmIGRlZmluZWQoX0dMSUJDWFhfREVCVUcpIHx8IGRlZmluZWQoX0dMSUJDWFhfUEFSQUxMRUwpIFwKKyAgICB8fCBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEUpCituYW1lc3BhY2Ugc3RkCit7CisgIC8vIE5vbi1pbmxpbmUgbmFtZXNwYWNlIGZvciBjb21wb25lbnRzIHJlcGxhY2VkIGJ5IGFsdGVybmF0ZXMgaW4gYWN0aXZlIG1vZGUuCisgIG5hbWVzcGFjZSBfX2N4eDE5OTgKKyAgeworI2lmIF9HTElCQ1hYX0lOTElORV9WRVJTSU9OCisgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9CisjZW5kaWYKKyAgfQorCisgIC8vIElubGluZSBuYW1lc3BhY2UgZm9yIGRlYnVnIG1vZGUuCisjIGlmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGlubGluZSBuYW1lc3BhY2UgX19kZWJ1ZyB7IH0KKyMgZW5kaWYKKworICAvLyBJbmxpbmUgbmFtZXNwYWNlcyBmb3IgcGFyYWxsZWwgbW9kZS4KKyMgaWZkZWYgX0dMSUJDWFhfUEFSQUxMRUwKKyAgaW5saW5lIG5hbWVzcGFjZSBfX3BhcmFsbGVsIHsgfQorIyBlbmRpZgorCisgIC8vIElubGluZSBuYW1lc3BhY2VzIGZvciBwcm9maWxlIG1vZGUKKyMgaWZkZWYgX0dMSUJDWFhfUFJPRklMRQorICBpbmxpbmUgbmFtZXNwYWNlIF9fcHJvZmlsZSB7IH0KKyMgZW5kaWYKK30KKworLy8gQ2hlY2sgZm9yIGludmFsaWQgdXNhZ2UgYW5kIHVuc3VwcG9ydGVkIG1peGVkLW1vZGUgdXNlLgorIyBpZiBkZWZpbmVkKF9HTElCQ1hYX0RFQlVHKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1BBUkFMTEVMKQorIyAgZXJyb3IgaWxsZWdhbCB1c2Ugb2YgbXVsdGlwbGUgaW5saW5lZCBuYW1lc3BhY2VzCisjIGVuZGlmCisjIGlmIGRlZmluZWQoX0dMSUJDWFhfUFJPRklMRSkgJiYgZGVmaW5lZChfR0xJQkNYWF9ERUJVRykKKyMgIGVycm9yIGlsbGVnYWwgdXNlIG9mIG11bHRpcGxlIGlubGluZWQgbmFtZXNwYWNlcworIyBlbmRpZgorIyBpZiBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEUpICYmIGRlZmluZWQoX0dMSUJDWFhfUEFSQUxMRUwpCisjICBlcnJvciBpbGxlZ2FsIHVzZSBvZiBtdWx0aXBsZSBpbmxpbmVkIG5hbWVzcGFjZXMKKyMgZW5kaWYKKworLy8gQ2hlY2sgZm9yIGludmFsaWQgdXNlIGR1ZSB0byBsYWNrIGZvciB3ZWFrIHN5bWJvbHMuCisjIGlmIF9fTk9fSU5MSU5FX18gJiYgIV9fR1hYX1dFQUtfXworIyAgd2FybmluZyBjdXJyZW50bHkgdXNpbmcgaW5saW5lZCBuYW1lc3BhY2UgbW9kZSB3aGljaCBtYXkgZmFpbCBcCisgICB3aXRob3V0IGlubGluaW5nIGR1ZSB0byBsYWNrIG9mIHdlYWsgc3ltYm9scworIyBlbmRpZgorI2VuZGlmCisKKy8vIE1hY3JvcyBmb3IgbmFtZXNwYWNlIHNjb3BlLiBFaXRoZXIgbmFtZXNwYWNlIHN0ZDo6IG9yIHRoZSBuYW1lCisvLyBvZiBzb21lIG5lc3RlZCBuYW1lc3BhY2Ugd2l0aGluIGl0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFjdGl2ZSBtb2RlLgorLy8gX0dMSUJDWFhfU1REX0EKKy8vIF9HTElCQ1hYX1NURF9DCisvLworLy8gTWFjcm9zIGZvciBvcGVuaW5nL2Nsb3NpbmcgY29uZGl0aW9uYWwgbmFtZXNwYWNlcy4KKy8vIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9BTEdPCisvLyBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0FMR08KKy8vIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKy8vIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCisjaWYgZGVmaW5lZChfR0xJQkNYWF9ERUJVRykgfHwgZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFKQorIyBkZWZpbmUgX0dMSUJDWFhfU1REX0MgX19jeHgxOTk4CisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSIFwKKwkgbmFtZXNwYWNlIF9HTElCQ1hYX1NURF9DIHsgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSIFwKKwkgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OIH0KKyMgdW5kZWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisjIGRlZmluZSBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUgLTEKKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfUEFSQUxMRUwKKyMgZGVmaW5lIF9HTElCQ1hYX1NURF9BIF9fY3h4MTk5OAorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0FMR08gXAorCSBuYW1lc3BhY2UgX0dMSUJDWFhfU1REX0EgeyBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPIFwKKwkgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OIH0KKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX1NURF9BCisjIGRlZmluZSBfR0xJQkNYWF9TVERfQSBzdGQKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX1NURF9DCisjIGRlZmluZSBfR0xJQkNYWF9TVERfQyBzdGQKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9BTEdPCisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQUxHTworI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPCisjIGRlZmluZSBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0FMR08KKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCisjIGRlZmluZSBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorI2VuZGlmCisKKy8vIEdMSUJDWFhfQUJJIERlcHJlY2F0ZWQKKy8vIERlZmluZSBpZiBjb21wYXRpYmlsaXR5IHNob3VsZCBiZSBwcm92aWRlZCBmb3IgLW1sb25nLWRvdWJsZS02NC4KKyN1bmRlZiBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQKKworLy8gSW5saW5lIG5hbWVzcGFjZSBmb3IgbG9uZyBkb3VibGUgMTI4IG1vZGUuCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCituYW1lc3BhY2Ugc3RkCit7CisgIGlubGluZSBuYW1lc3BhY2UgX19nbnVfY3h4X2xkYmwxMjggeyB9Cit9CisjIGRlZmluZSBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTCBfX2dudV9jeHhfbGRibDEyODo6CisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfTERCTCBuYW1lc3BhY2UgX19nbnVfY3h4X2xkYmwxMjggeworIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9MREJMIH0KKyNlbHNlCisjIGRlZmluZSBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTAorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0xEQkwKKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfTERCTAorI2VuZGlmCisKKy8vIEFzc2VydC4KKyNpZiAhZGVmaW5lZChfR0xJQkNYWF9ERUJVRykgJiYgIWRlZmluZWQoX0dMSUJDWFhfUEFSQUxMRUwpCisjIGRlZmluZSBfX2dsaWJjeHhfYXNzZXJ0KF9Db25kaXRpb24pCisjZWxzZQorbmFtZXNwYWNlIHN0ZAoreworICAvLyBBdm9pZCB0aGUgdXNlIG9mIGFzc2VydCwgYmVjYXVzZSB3ZSdyZSB0cnlpbmcgdG8ga2VlcCB0aGUgPGNhc3NlcnQ+CisgIC8vIGluY2x1ZGUgb3V0IG9mIHRoZSBtaXguCisgIGlubGluZSB2b2lkCisgIF9fcmVwbGFjZW1lbnRfYXNzZXJ0KGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSwKKwkJICAgICAgIGNvbnN0IGNoYXIqIF9fZnVuY3Rpb24sIGNvbnN0IGNoYXIqIF9fY29uZGl0aW9uKQorICB7CisgICAgX19idWlsdGluX3ByaW50ZigiJXM6JWQ6ICVzOiBBc3NlcnRpb24gJyVzJyBmYWlsZWQuXG4iLCBfX2ZpbGUsIF9fbGluZSwKKwkJICAgICBfX2Z1bmN0aW9uLCBfX2NvbmRpdGlvbik7CisgICAgX19idWlsdGluX2Fib3J0KCk7CisgIH0KK30KKyNkZWZpbmUgX19nbGliY3h4X2Fzc2VydChfQ29uZGl0aW9uKQkJCQkgICAJIFwKKyAgZG8gCQkJCQkJCQkJIFwKKyAgewkJCQkJCQkgICAgICAJCSBcCisgICAgaWYgKCEgKF9Db25kaXRpb24pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RkOjpfX3JlcGxhY2VtZW50X2Fzc2VydChfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIFwKKwkJCQkjX0NvbmRpdGlvbik7CQkJCSBcCisgIH0gd2hpbGUgKGZhbHNlKQorI2VuZGlmCisKKy8vIE1hY3JvcyBmb3IgcmFjZSBkZXRlY3RvcnMuCisvLyBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoQSkgYW5kCisvLyBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUihBKSBzaG91bGQgYmUgdXNlZCB0byBleHBsYWluCisvLyBhdG9taWMgKGxvY2stZnJlZSkgc3luY2hyb25pemF0aW9uIHRvIHJhY2UgZGV0ZWN0b3JzOgorLy8gdGhlIHJhY2UgZGV0ZWN0b3Igd2lsbCBpbmZlciBhIGhhcHBlbnMtYmVmb3JlIGFyYyBmcm9tIHRoZSBmb3JtZXIgdG8gdGhlCisvLyBsYXR0ZXIgd2hlbiB0aGV5IHNoYXJlIHRoZSBzYW1lIGFyZ3VtZW50IHBvaW50ZXIuCisvLworLy8gVGhlIG1vc3QgZnJlcXVlbnQgdXNlIGNhc2UgZm9yIHRoZXNlIG1hY3JvcyAoYW5kIHRoZSBvbmx5IGNhc2UgaW4gdGhlCisvLyBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBsaWJyYXJ5KSBpcyBhdG9taWMgcmVmZXJlbmNlIGNvdW50aW5nOgorLy8gICB2b2lkIF9NX3JlbW92ZV9yZWZlcmVuY2UoKQorLy8gICB7CisvLyAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKCZ0aGlzLT5fTV9yZWZjb3VudCk7CisvLyAgICAgaWYgKF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZ0aGlzLT5fTV9yZWZjb3VudCwgLTEpIDw9IDApCisvLyAgICAgICB7CisvLyAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZ0aGlzLT5fTV9yZWZjb3VudCk7CisvLyAgICAgICAgIF9NX2Rlc3Ryb3koX19hKTsKKy8vICAgICAgIH0KKy8vICAgfQorLy8gVGhlIGFubm90YXRpb25zIGluIHRoaXMgZXhhbXBsZSB0ZWxsIHRoZSByYWNlIGRldGVjdG9yIHRoYXQgYWxsIG1lbW9yeQorLy8gYWNjZXNzZXMgb2NjdXJyZWQgd2hlbiB0aGUgcmVmY291bnQgd2FzIHBvc2l0aXZlIGRvIG5vdCByYWNlIHdpdGgKKy8vIG1lbW9yeSBhY2Nlc3NlcyB3aGljaCBvY2N1cnJlZCBhZnRlciB0aGUgcmVmY291bnQgYmVjYW1lIHplcm8uCisjaWZuZGVmIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRQorIyBkZWZpbmUgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRShBKQorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSCisjIGRlZmluZSAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoQSkKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIEMgbGlua2FnZTogZGVmaW5lIGV4dGVybiAiQyIgbGlua2FnZSBvbmx5IHdoZW4gdXNpbmcgQysrLgorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fRVhURVJOX0MgZXh0ZXJuICJDIiB7CisjIGRlZmluZSBfR0xJQkNYWF9FTkRfRVhURVJOX0MgfQorCisjZWxzZSAvLyAhX19jcGx1c3BsdXMKKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX0VYVEVSTl9DCisjIGRlZmluZSBfR0xJQkNYWF9FTkRfRVhURVJOX0MKKyNlbmRpZgorCisKKy8vIEZpcnN0IGluY2x1ZGVzLgorCisvLyBQaWNrIHVwIGFueSBPUy1zcGVjaWZpYyBkZWZpbml0aW9ucy4KKyNpbmNsdWRlIDxiaXRzL29zX2RlZmluZXMuaD4KKworLy8gUGljayB1cCBhbnkgQ1BVLXNwZWNpZmljIGRlZmluaXRpb25zLgorI2luY2x1ZGUgPGJpdHMvY3B1X2RlZmluZXMuaD4KKworLy8gSWYgcGxhdGZvcm0gdXNlcyBuZWl0aGVyIHZpc2liaWxpdHkgbm9yIHBzdWVkby12aXNpYmlsaXR5LAorLy8gc3BlY2lmeSBlbXB0eSBkZWZhdWx0IGZvciBuYW1lc3BhY2UgYW5ub3RhdGlvbiBtYWNyb3MuCisjaWZuZGVmIF9HTElCQ1hYX1BTRVVET19WSVNJQklMSVRZCisjIGRlZmluZSBfR0xJQkNYWF9QU0VVRE9fVklTSUJJTElUWShWKQorI2VuZGlmCisKKy8vIENlcnRhaW4gZnVuY3Rpb24gZGVmaW5pdGlvbnMgdGhhdCBhcmUgbWVhbnQgdG8gYmUgb3ZlcnJpZGFibGUgZnJvbQorLy8gdXNlciBjb2RlIGFyZSBkZWNvcmF0ZWQgd2l0aCB0aGlzIG1hY3JvLiAgRm9yIHNvbWUgdGFyZ2V0cywgdGhpcworLy8gbWFjcm8gY2F1c2VzIHRoZXNlIGRlZmluaXRpb25zIHRvIGJlIHdlYWsuCisjaWZuZGVmIF9HTElCQ1hYX1dFQUtfREVGSU5JVElPTgorIyBkZWZpbmUgX0dMSUJDWFhfV0VBS19ERUZJTklUSU9OCisjZW5kaWYKKworCisvLyBUaGUgcmVtYWluZGVyIG9mIHRoZSBwcmV3cml0dGVuIGNvbmZpZyBpcyBhdXRvbWF0aWM7IGFsbCB0aGUKKy8vIHVzZXIgaG9va3MgYXJlIGxpc3RlZCBhYm92ZS4KKworLy8gQ3JlYXRlIGEgYm9vbGVhbiBmbGFnIHRvIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIC0tZmFzdC1tYXRoIGlzIHNldC4KKyNpZmRlZiBfX0ZBU1RfTUFUSF9fCisjIGRlZmluZSBfR0xJQkNYWF9GQVNUX01BVEggMQorI2Vsc2UKKyMgZGVmaW5lIF9HTElCQ1hYX0ZBU1RfTUFUSCAwCisjZW5kaWYKKworLy8gVGhpcyBtYXJrcyBzdHJpbmcgbGl0ZXJhbHMgaW4gaGVhZGVyIGZpbGVzIHRvIGJlIGV4dHJhY3RlZCBmb3IgZXZlbnR1YWwKKy8vIHRyYW5zbGF0aW9uLiAgSXQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIG1lc3NhZ2VzIGluIHRocm93biBleGNlcHRpb25zOyBzZWUKKy8vIHNyYy9mdW5jdGV4Y2VwdC5jYy4gIFdlIHVzZSBfX04gYmVjYXVzZSB0aGUgbW9yZSB0cmFkaXRpb25hbCBfTiBpcyB1c2VkCisvLyBmb3Igc29tZXRoaW5nIGVsc2UgdW5kZXIgY2VydGFpbiBPU2VzIChzZWUgQkFETkFNRVMpLgorI2RlZmluZSBfX04obXNnaWQpICAgICAobXNnaWQpCisKKy8vIEZvciBleGFtcGxlLCA8d2luZG93cy5oPiBpcyBrbm93biB0byAjZGVmaW5lIG1pbiBhbmQgbWF4IGFzIG1hY3Jvcy4uLgorI3VuZGVmIG1pbgorI3VuZGVmIG1heAorCisvLyBFbmQgb2YgcHJld3JpdHRlbiBjb25maWc7IHRoZSBzZXR0aW5ncyBkaXNjb3ZlcmVkIGF0IGNvbmZpZ3VyZSB0aW1lIGZvbGxvdy4KKy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGZyb20gY29uZmlnLmguaW4gYnkgY29uZmlndXJlLiAgKi8KKy8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFjb3NmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BQ09TRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYWNvc2wnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FDT1NMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhc2luZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVNJTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFzaW5sJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BU0lOTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSB0YXJnZXQgYXNzZW1ibGVyIHN1cHBvcnRzIC5zeW12ZXIgZGlyZWN0aXZlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FTX1NZTVZFUl9ESVJFQ1RJVkUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGF0YW4yZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVRBTjJGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdGFuMmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU4yTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXRhbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU5GIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdGFubCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVRBTkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGF0X3F1aWNrX2V4aXQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FUX1FVSUNLX0VYSVQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgdGFyZ2V0IGFzc2VtYmxlciBzdXBwb3J0cyB0aHJlYWQtbG9jYWwgc3RvcmFnZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX0NDX1RMUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNlaWxmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DRUlMRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY2VpbGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NFSUxMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxjb21wbGV4Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NPTVBMRVhfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY29zZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ09TRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY29zaGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0hGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjb3NobCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ09TSEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNvc2wnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0wgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0RMRkNOX0ggMQorCisvKiBEZWZpbmUgaWYgRUJBRE1TRyBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRUJBRE1TRyAxCisKKy8qIERlZmluZSBpZiBFQ0FOQ0VMRUQgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VDQU5DRUxFRCAxCisKKy8qIERlZmluZSBpZiBFQ0hJTEQgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VDSElMRCAxCisKKy8qIERlZmluZSBpZiBFSURSTSBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRUlEUk0gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGVuZGlhbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTkRJQU5fSCAxCisKKy8qIERlZmluZSBpZiBFTk9EQVRBIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTk9EQVRBIDEKKworLyogRGVmaW5lIGlmIEVOT0xJTksgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VOT0xJTksgMQorCisvKiBEZWZpbmUgaWYgRU5PU1BDIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTk9TUEMgMQorCisvKiBEZWZpbmUgaWYgRU5PU1IgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VOT1NSIDEKKworLyogRGVmaW5lIGlmIEVOT1NUUiBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU5PU1RSIDEKKworLyogRGVmaW5lIGlmIEVOT1RSRUNPVkVSQUJMRSBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU5PVFJFQ09WRVJBQkxFIDEKKworLyogRGVmaW5lIGlmIEVOT1RTVVAgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VOT1RTVVAgMQorCisvKiBEZWZpbmUgaWYgRU9WRVJGTE9XIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FT1ZFUkZMT1cgMQorCisvKiBEZWZpbmUgaWYgRU9XTkVSREVBRCBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU9XTkVSREVBRCAxCisKKy8qIERlZmluZSBpZiBFUEVSTSBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVBFUk0gMQorCisvKiBEZWZpbmUgaWYgRVBST1RPIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FUFJPVE8gMQorCisvKiBEZWZpbmUgaWYgRVRJTUUgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VUSU1FIDEKKworLyogRGVmaW5lIGlmIEVUSU1FRE9VVCBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVRJTUVET1VUIDEKKworLyogRGVmaW5lIGlmIEVUWFRCU1kgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VUWFRCU1kgMQorCisvKiBEZWZpbmUgaWYgRVdPVUxEQkxPQ0sgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VXT1VMREJMT0NLIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxleGVjaW5mby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FWEVDSU5GT19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBleHBmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FWFBGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBleHBsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FWFBMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmYWJzZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkFCU0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZhYnNsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GQUJTTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmVudi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GRU5WX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZpbml0ZScgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRklOSVRFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmaW5pdGVmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GSU5JVEVGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmaW5pdGVsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GSU5JVEVMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmbG9hdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTE9BVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmbG9vcmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZMT09SRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmxvb3JsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTE9PUkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZtb2RmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTU9ERiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZm1vZGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZNT0RMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmcGNsYXNzJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX0ZQQ0xBU1MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmcC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX0ZQX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmcmV4cGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZSRVhQRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnJleHBsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GUkVYUEwgMQorCisvKiBEZWZpbmUgaWYgX1Vud2luZF9HZXRJUEluZm8gaXMgYXZhaWxhYmxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0dFVElQSU5GTyAxCisKKy8qIERlZmluZSBpZiBnZXRzIGlzIGF2YWlsYWJsZSBpbiA8c3RkaW8uaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfR0VUUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaHlwb3QnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0hZUE9UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBoeXBvdGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0hZUE9URiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaHlwb3RsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVEwgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGljb252KCkgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSUNPTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGllZWVmcC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX0lFRUVGUF9IICovCisKKy8qIERlZmluZSBpZiBpbnQ2NF90IGlzIGF2YWlsYWJsZSBpbiA8c3RkaW50Lmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lOVDY0X1QgMQorCisvKiBEZWZpbmUgaWYgaW50NjRfdCBpcyBhIGxvbmcuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSU5UNjRfVF9MT05HIDEKKworLyogRGVmaW5lIGlmIGludDY0X3QgaXMgYSBsb25nIGxvbmcuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9JTlQ2NF9UX0xPTkdfTE9ORyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lOVFRZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlzaW5mJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU0lORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaXNpbmZmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU0lORkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlzaW5mbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkZMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc25hbicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNOQU4gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlzbmFuZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNOQU5GIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc25hbmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFOTCAxCisKKy8qIERlZmluZWQgaWYgaXN3YmxhbmsgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lTV0JMQU5LIDEKKworLyogRGVmaW5lIGlmIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0xDX01FU1NBR0VTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsZGV4cGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0xERVhQRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbGRleHBsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MREVYUEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpYmludGwuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9MSUJJTlRMX0ggKi8KKworLyogT25seSB1c2VkIGluIGJ1aWxkIGRpcmVjdG9yeSB0ZXN0c3VpdGVfaG9va3MuaC4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX0xJTUlUX0FTICovCisKKy8qIE9ubHkgdXNlZCBpbiBidWlsZCBkaXJlY3RvcnkgdGVzdHN1aXRlX2hvb2tzLmguICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9MSU1JVF9EQVRBICovCisKKy8qIE9ubHkgdXNlZCBpbiBidWlsZCBkaXJlY3RvcnkgdGVzdHN1aXRlX2hvb2tzLmguICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9MSU1JVF9GU0laRSAqLworCisvKiBPbmx5IHVzZWQgaW4gYnVpbGQgZGlyZWN0b3J5IHRlc3RzdWl0ZV9ob29rcy5oLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElNSVRfUlNTICovCisKKy8qIE9ubHkgdXNlZCBpbiBidWlsZCBkaXJlY3RvcnkgdGVzdHN1aXRlX2hvb2tzLmguICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9MSU1JVF9WTUVNICovCisKKy8qIERlZmluZSBpZiBmdXRleCBzeXNjYWxsIGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MSU5VWF9GVVRFWCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0xPQ0FMRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2cxMGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0xPRzEwRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbG9nMTBsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0cxMEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvZ2YnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0xPR0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvZ2wnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0xPR0wgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1hY2hpbmUvZW5kaWFuLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTUFDSElORV9FTkRJQU5fSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1hY2hpbmUvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9NQUNISU5FX1BBUkFNX0ggKi8KKworLyogRGVmaW5lIGlmIG1ic3RhdGVfdCBleGlzdHMgaW4gd2NoYXIuaC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9NQlNUQVRFX1QgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9NRU1PUllfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbW9kZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTU9ERiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbW9kZmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX01PREZGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtb2RmbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTU9ERkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5hbi5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX05BTl9IICovCisKKy8qIERlZmluZSBpZiBwb2xsIGlzIGF2YWlsYWJsZSBpbiA8cG9sbC5oPi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9QT0xMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwb3dmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9QT1dGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwb3dsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9QT1dMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBxZnBjbGFzcycgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9RRlBDTEFTUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHF1aWNrX2V4aXQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1FVSUNLX0VYSVQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGVudicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9TRVRFTlYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaW5jb3MnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkNPUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luY29zZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOQ09TRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luY29zbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOQ09TTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luaGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkhGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaW5obCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOSEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkwgMQorCisvKiBEZWZpbmVkIGlmIHNsZWVwIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TTEVFUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3FydGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NRUlRGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzcXJ0bCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1FSVEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFsaWduLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUREFMSUdOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGJvb2wuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1REQk9PTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RESU5UX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVERMSUJfSCAxCisKKy8qIERlZmluZSBpZiBzdHJlcnJvcl9sIGlzIGF2YWlsYWJsZSBpbiA8c3RyaW5nLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUUkVSUk9SX0wgMQorCisvKiBEZWZpbmUgaWYgc3RyZXJyb3JfciBpcyBhdmFpbGFibGUgaW4gPHN0cmluZy5oPi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJFUlJPUl9SIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUUklOR1NfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUUklOR19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b2YnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUUlRPRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9sZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RSVE9MRCAxCisKKy8qIERlZmluZSBpZiBzdHJ4ZnJtX2wgaXMgYXZhaWxhYmxlIGluIDxzdHJpbmcuaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RSWEZSTV9MIDEKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHRhcmdldCBydW50aW1lIGxpbmtlciBzdXBwb3J0cyBiaW5kaW5nIHRoZSBzYW1lIHN5bWJvbAorICAgdG8gZGlmZmVyZW50IHZlcnNpb25zLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZTVZFUl9TWU1CT0xfUkVOQU1JTkdfUlVOVElNRV9TVVBQT1JUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsaW8uaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9TWVNfRklMSU9fSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfSU9DVExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lwYy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfSVBDX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pc2FfZGVmcy5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX1NZU19JU0FfREVGU19IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL21hY2hpbmUuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9TWVNfTUFDSElORV9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19QQVJBTV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lTX1JFU09VUkNFX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBhIHN1aXRhYmxlIDxzeXMvc2R0Lmg+IGhlYWRlciBmaWxlICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9TWVNfU0RUX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VtLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19TRU1fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N5c2luZm8uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lTX1NZU0lORk9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lTX1RJTUVfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdWlvLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19VSU9fSCAxCisKKy8qIERlZmluZSBpZiBTX0lGUkVHIGlzIGF2YWlsYWJsZSBpbiA8c3lzL3N0YXQuaD4uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9TX0lGUkVHICovCisKKy8qIERlZmluZSBpZiBTX0lGUkVHIGlzIGF2YWlsYWJsZSBpbiA8c3lzL3N0YXQuaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU19JU1JFRyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGFuZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVEFORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGFuaGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkhGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0YW5obCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVEFOSEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRhbmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHRnbWF0aC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9UR01BVEhfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgdGhyZWFkLWxvY2FsIHN0b3JhZ2UuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVExTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVU5JU1REX0ggMQorCisvKiBEZWZpbmVkIGlmIHVzbGVlcCBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVVNMRUVQIDEKKworLyogRGVmaW5lZCBpZiB2ZndzY2FuZiBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVkZXU0NBTkYgMQorCisvKiBEZWZpbmVkIGlmIHZzd3NjYW5mIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9WU1dTQ0FORiAxCisKKy8qIERlZmluZWQgaWYgdndzY2FuZiBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVldTQ0FORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8d2NoYXIuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfV0NIQVJfSCAxCisKKy8qIERlZmluZWQgaWYgd2NzdG9mIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9XQ1NUT0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHdjdHlwZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9XQ1RZUEVfSCAxCisKKy8qIERlZmluZWQgaWYgU2xlZXAgZXhpc3RzLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfV0lOMzJfU0xFRVAgKi8KKworLyogRGVmaW5lIGlmIHdyaXRldiBpcyBhdmFpbGFibGUgaW4gPHN5cy91aW8uaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfV1JJVEVWIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfYWNvc2YnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FDT1NGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Fjb3NsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19BQ09TTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hc2luZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQVNJTkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfYXNpbmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FTSU5MICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2F0YW4yZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQVRBTjJGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2F0YW4ybCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQVRBTjJMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2F0YW5mJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19BVEFORiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hdGFubCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQVRBTkwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfY2VpbGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0NFSUxGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2NlaWxsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19DRUlMTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9jb3NmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19DT1NGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Nvc2hmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19DT1NIRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9jb3NobCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQ09TSEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfY29zbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQ09TTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9leHBmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19FWFBGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2V4cGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0VYUEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZmFic2YnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZBQlNGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2ZhYnNsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GQUJTTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9maW5pdGUnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZJTklURSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9maW5pdGVmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GSU5JVEVGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Zpbml0ZWwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZJTklURUwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZmxvb3JmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GTE9PUkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZmxvb3JsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GTE9PUkwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZm1vZGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZNT0RGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Ztb2RsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GTU9ETCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mcGNsYXNzJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GUENMQVNTICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2ZyZXhwZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRlJFWFBGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2ZyZXhwbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRlJFWFBMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2h5cG90JyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19IWVBPVCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9oeXBvdGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0hZUE9URiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9oeXBvdGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0hZUE9UTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9pc2luZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSVNJTkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaXNpbmZmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19JU0lORkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaXNpbmZsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19JU0lORkwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaXNuYW4nIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0lTTkFOICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2lzbmFuZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSVNOQU5GICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2lzbmFubCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSVNOQU5MICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2xkZXhwZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTERFWFBGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2xkZXhwbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTERFWFBMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2xvZzEwZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTE9HMTBGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2xvZzEwbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTE9HMTBMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2xvZ2YnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xPR0YgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfbG9nbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTE9HTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9tb2RmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19NT0RGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX21vZGZmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19NT0RGRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9tb2RmbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTU9ERkwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfcG93ZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fUE9XRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9wb3dsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19QT1dMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3FmcGNsYXNzJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19RRlBDTEFTUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zaW5jb3MnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkNPUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zaW5jb3NmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5DT1NGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NpbmNvc2wnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkNPU0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc2luZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fU0lORiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zaW5oZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fU0lOSEYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc2luaGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkhMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NpbmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc3FydGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NRUlRGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NxcnRsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TUVJUTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF90YW5mJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19UQU5GICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3RhbmhmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19UQU5IRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF90YW5obCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fVEFOSEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfdGFubCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fVEFOTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9fY3hhX3RocmVhZF9hdGV4aXRfaW1wbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fX0NYQV9USFJFQURfQVRFWElUX0lNUEwgKi8KKworLyogRGVmaW5lIGFzIGNvbnN0IGlmIHRoZSBkZWNsYXJhdGlvbiBvZiBpY29udigpIG5lZWRzIGNvbnN0LiAqLworI2RlZmluZSBfR0xJQkNYWF9JQ09OVl9DT05TVCAKKworLyogRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy4KKyAgICovCisjZGVmaW5lIExUX09CSkRJUiAiLmxpYnMvIgorCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9QQUNLQUdFICovCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9QQUNLQUdFX0JVR1JFUE9SVCAiIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIF9HTElCQ1hYX1BBQ0tBR0VfTkFNRSAicGFja2FnZS11bnVzZWQiCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUEFDS0FHRV9TVFJJTkcgInBhY2thZ2UtdW51c2VkIHZlcnNpb24tdW51c2VkIgorCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIF9HTElCQ1hYX1BBQ0tBR0VfVEFSTkFNRSAibGlic3RkYysrIgorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBfR0xJQkNYWF9QQUNLQUdFX1VSTCAiIgorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBfR0xJQkNYWF9QQUNLQUdFX19HTElCQ1hYX1ZFUlNJT04gInZlcnNpb24tdW51c2VkIgorCisvKiBUaGUgc2l6ZSBvZiBgY2hhcicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfQ0hBUiAqLworCisvKiBUaGUgc2l6ZSBvZiBgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9JTlQgKi8KKworLyogVGhlIHNpemUgb2YgYGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisvKiAjdW5kZWYgU0laRU9GX0xPTkcgKi8KKworLyogVGhlIHNpemUgb2YgYHNob3J0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9TSE9SVCAqLworCisvKiBUaGUgc2l6ZSBvZiBgdm9pZCAqJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9WT0lEX1AgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjZGVmaW5lIFNURENfSEVBREVSUyAxCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9WRVJTSU9OICovCisKKy8qIERlZmluZSBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgQysrMTEgYXRvbWljcy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TIDEKKworLyogRGVmaW5lIHRvIHVzZSBjb25jZXB0IGNoZWNraW5nIGNvZGUgZnJvbSB0aGUgYm9vc3QgbGlicmFyaWVzLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0NPTkNFUFRfQ0hFQ0tTICovCisKKy8qIERlZmluZSB0byAxIGlmIGEgZnVsbHkgZHluYW1pYyBiYXNpY19zdHJpbmcgaXMgd2FudGVkLCAwIHRvIGRpc2FibGUsCisgICB1bmRlZmluZWQgZm9yIHBsYXRmb3JtIGRlZmF1bHRzICovCisjZGVmaW5lIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HIDAKKworLyogRGVmaW5lIGlmIGd0aHJlYWRzIGxpYnJhcnkgaXMgYXZhaWxhYmxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVNfR1RIUkVBRFMgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBhIGZ1bGwgaG9zdGVkIGxpYnJhcnkgaXMgYnVpbHQsIG9yIDAgaWYgZnJlZXN0YW5kaW5nLiAqLworI2RlZmluZSBfR0xJQkNYWF9IT1NURUQgMQorCisvKiBEZWZpbmUgaWYgY29tcGF0aWJpbGl0eSBzaG91bGQgYmUgcHJvdmlkZWQgZm9yIC1tbG9uZy1kb3VibGUtNjQuICovCisKKy8qIERlZmluZSBpZiBwdHJkaWZmX3QgaXMgaW50LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1BUUkRJRkZfVF9JU19JTlQgKi8KKworLyogRGVmaW5lIGlmIHVzaW5nIHNldHJsaW1pdCB0byBzZXQgcmVzb3VyY2UgbGltaXRzIGR1cmluZyAibWFrZSBjaGVjayIgKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9SRVNfTElNSVRTICovCisKKy8qIERlZmluZSBpZiBzaXplX3QgaXMgdW5zaWduZWQgaW50LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1NJWkVfVF9JU19VSU5UICovCisKKy8qIERlZmluZSBpZiB0aGUgY29tcGlsZXIgaXMgY29uZmlndXJlZCBmb3Igc2V0am1wL2xvbmdqbXAgZXhjZXB0aW9ucy4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9TSkxKX0VYQ0VQVElPTlMgKi8KKworLyogRGVmaW5lIHRvIHRoZSB2YWx1ZSBvZiB0aGUgRU9GIGludGVnZXIgY29uc3RhbnQuICovCisjZGVmaW5lIF9HTElCQ1hYX1NURElPX0VPRiAtMQorCisvKiBEZWZpbmUgdG8gdGhlIHZhbHVlIG9mIHRoZSBTRUVLX0NVUiBpbnRlZ2VyIGNvbnN0YW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9TVERJT19TRUVLX0NVUiAxCisKKy8qIERlZmluZSB0byB0aGUgdmFsdWUgb2YgdGhlIFNFRUtfRU5EIGludGVnZXIgY29uc3RhbnQuICovCisjZGVmaW5lIF9HTElCQ1hYX1NURElPX1NFRUtfRU5EIDIKKworLyogRGVmaW5lIHRvIHVzZSBzeW1ib2wgdmVyc2lvbmluZyBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICovCisjZGVmaW5lIF9HTElCQ1hYX1NZTVZFUiAxCisKKy8qIERlZmluZSB0byB1c2UgZGFyd2luIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1NZTVZFUl9EQVJXSU4gKi8KKworLyogRGVmaW5lIHRvIHVzZSBHTlUgdmVyc2lvbmluZyBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICovCisjZGVmaW5lIF9HTElCQ1hYX1NZTVZFUl9HTlUgMQorCisvKiBEZWZpbmUgdG8gdXNlIEdOVSBuYW1lc3BhY2UgdmVyc2lvbmluZyBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfU1lNVkVSX0dOVV9OQU1FU1BBQ0UgKi8KKworLyogRGVmaW5lIHRvIHVzZSBTdW4gdmVyc2lvbmluZyBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfU1lNVkVSX1NVTiAqLworCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBvciBtYWNyb3MgZnJvbSA8d2NoYXIuaD4sIDxtYXRoLmg+LCA8Y29tcGxleC5oPiwKKyAgIDxzdGRpby5oPiwgYW5kIDxzdGRsaWIuaD4gY2FuIGJlIHVzZWQgb3IgZXhwb3NlZC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OSAxCisKKy8qIERlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxjb21wbGV4Lmg+IHNob3VsZCBiZSB1c2VkIGluIDxjb21wbGV4Pi4gVXNpbmcKKyAgIGNvbXBpbGVyIGJ1aWx0aW5zIGZvciB0aGVzZSBmdW5jdGlvbnMgcmVxdWlyZXMgY29ycmVzcG9uZGluZyBDOTkgbGlicmFyeQorICAgZnVuY3Rpb25zIHRvIGJlIHByZXNlbnQuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWCAxCisKKy8qIERlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxjb21wbGV4Lmg+IHNob3VsZCBiZSB1c2VkIGluIDx0cjEvY29tcGxleD4uCisgICBVc2luZyBjb21waWxlciBidWlsdGlucyBmb3IgdGhlc2UgZnVuY3Rpb25zIHJlcXVpcmVzIGNvcnJlc3BvbmRpbmcgQzk5CisgICBsaWJyYXJ5IGZ1bmN0aW9ucyB0byBiZSBwcmVzZW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxIDEKKworLyogRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgaW4gPGN0eXBlLmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbiA8dHIxL2NjdHlwZT4gaW4KKyAgIG5hbWVzcGFjZSBzdGQ6OnRyMS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9DVFlQRV9UUjEgMQorCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8ZmVudi5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4gPHRyMS9jZmVudj4gaW4KKyAgIG5hbWVzcGFjZSBzdGQ6OnRyMS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9GRU5WX1RSMSAxCisKKy8qIERlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxpbnR0eXBlcy5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4KKyAgIDx0cjEvY2ludHR5cGVzPiBpbiBuYW1lc3BhY2Ugc3RkOjp0cjEuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfSU5UVFlQRVNfVFIxIDEKKworLyogRGVmaW5lIGlmIHdjaGFyX3QgQzk5IGZ1bmN0aW9ucyBpbiA8aW50dHlwZXMuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluCisgICA8dHIxL2NpbnR0eXBlcz4gaW4gbmFtZXNwYWNlIHN0ZDo6dHIxLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X0lOVFRZUEVTX1dDSEFSX1RfVFIxIDEKKworLyogRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgb3IgbWFjcm9zIGluIDxtYXRoLmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbiA8Y21hdGg+CisgICBpbiBuYW1lc3BhY2Ugc3RkLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X01BVEggMQorCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBvciBtYWNyb3MgaW4gPG1hdGguaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluCisgICA8dHIxL2NtYXRoPiBpbiBuYW1lc3BhY2Ugc3RkOjp0cjEuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEgMQorCisvKiBEZWZpbmUgaWYgQzk5IHR5cGVzIGluIDxzdGRpbnQuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluIDx0cjEvY3N0ZGludD4gaW4KKyAgIG5hbWVzcGFjZSBzdGQ6OnRyMS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxIDEKKworLyogRGVmaW5lZCBpZiBjbG9ja19nZXR0aW1lIGhhcyBtb25vdG9uaWMgY2xvY2sgc3VwcG9ydC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0NMT0NLX01PTk9UT05JQyAxCisKKy8qIERlZmluZWQgaWYgY2xvY2tfZ2V0dGltZSBzeXNjYWxsIGhhcyBtb25vdG9uaWMgYW5kIHJlYWx0aW1lIGNsb2NrIHN1cHBvcnQuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DTE9DS19HRVRUSU1FX1NZU0NBTEwgMQorCisvKiBEZWZpbmVkIGlmIGNsb2NrX2dldHRpbWUgaGFzIHJlYWx0aW1lIGNsb2NrIHN1cHBvcnQuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DTE9DS19SRUFMVElNRSAxCisKKy8qIERlZmluZSBpZiBJU08vSUVDIFRSIDI0NzMzIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgdHlwZXMgYXJlIHN1cHBvcnRlZCBvbgorICAgdGhpcyBob3N0LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfREVDSU1BTF9GTE9BVCAxCisKKy8qIERlZmluZSBpZiBfX2Zsb2F0MTI4IGlzIHN1cHBvcnRlZCBvbiB0aGlzIGhvc3QuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9GTE9BVDEyOCAxCisKKy8qIERlZmluZWQgaWYgZ2V0dGltZW9mZGF5IGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0dFVFRJTUVPRkRBWSAxCisKKy8qIERlZmluZSBpZiBnZXRfbnByb2NzIGlzIGF2YWlsYWJsZSBpbiA8c3lzL3N5c2luZm8uaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9HRVRfTlBST0NTIDEKKworLyogRGVmaW5lIGlmIF9faW50MTI4IGlzIHN1cHBvcnRlZCBvbiB0aGlzIGhvc3QuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9JTlQxMjggMQorCisvKiBEZWZpbmUgaWYgTEZTIHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfTEZTIDEKKworLyogRGVmaW5lIGlmIGNvZGUgc3BlY2lhbGl6ZWQgZm9yIGxvbmcgbG9uZyBzaG91bGQgYmUgdXNlZC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0xPTkdfTE9ORyAxCisKKy8qIERlZmluZWQgaWYgbmFub3NsZWVwIGlzIGF2YWlsYWJsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9VU0VfTkFOT1NMRUVQICovCisKKy8qIERlZmluZSBpZiBOTFMgdHJhbnNsYXRpb25zIGFyZSB0byBiZSB1c2VkLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1VTRV9OTFMgKi8KKworLyogRGVmaW5lIGlmIHB0aHJlYWRzX251bV9wcm9jZXNzb3JzX25wIGlzIGF2YWlsYWJsZSBpbiA8cHRocmVhZC5oPi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9VU0VfUFRIUkVBRFNfTlVNX1BST0NFU1NPUlNfTlAgKi8KKworLyogRGVmaW5lIGlmIC9kZXYvcmFuZG9tIGFuZCAvZGV2L3VyYW5kb20gYXJlIGF2YWlsYWJsZSBmb3IgdGhlIHJhbmRvbV9kZXZpY2UKKyAgIG9mIFRSMSAoQ2hhcHRlciA1LjEpLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfUkFORE9NX1RSMSAxCisKKy8qIERlZmluZWQgaWYgc2NoZWRfeWllbGQgaXMgYXZhaWxhYmxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1VTRV9TQ0hFRF9ZSUVMRCAqLworCisvKiBEZWZpbmUgaWYgX1NDX05QUk9DRVNTT1JTX09OTE4gaXMgYXZhaWxhYmxlIGluIDx1bmlzdGQuaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9TQ19OUFJPQ0VTU09SU19PTkxOIDEKKworLyogRGVmaW5lIGlmIF9TQ19OUFJPQ19PTkxOIGlzIGF2YWlsYWJsZSBpbiA8dW5pc3RkLmg+LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1VTRV9TQ19OUFJPQ19PTkxOICovCisKKy8qIERlZmluZSBpZiBzeXNjdGwoKSwgQ1RMX0hXIGFuZCBIV19OQ1BVIGFyZSBhdmFpbGFibGUgaW4gPHN5cy9zeXNjdGwuaD4uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfVVNFX1NZU0NUTF9IV19OQ1BVICovCisKKy8qIERlZmluZSBpZiBjb2RlIHNwZWNpYWxpemVkIGZvciB3Y2hhcl90IHNob3VsZCBiZSB1c2VkLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfV0NIQVJfVCAxCisKKy8qIERlZmluZSB0byAxIGlmIGEgdmVyYm9zZSBsaWJyYXJ5IGlzIGJ1aWx0LCBvciAwIG90aGVyd2lzZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVkVSQk9TRSAxCisKKy8qIERlZmluZWQgaWYgYXMgY2FuIGhhbmRsZSByZHJhbmQuICovCisjZGVmaW5lIF9HTElCQ1hYX1g4Nl9SRFJBTkQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBtdXRleF90aW1lZGxvY2sgaXMgYXZhaWxhYmxlLiAqLworI2RlZmluZSBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLIDEKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0FDT1NGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQUNPU0YpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FDT1NGIDEKKyMgZGVmaW5lIGFjb3NmIF9hY29zZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BQ09TTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0FDT1NMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BQ09TTCAxCisjIGRlZmluZSBhY29zbCBfYWNvc2wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQVNJTkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BU0lORikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVNJTkYgMQorIyBkZWZpbmUgYXNpbmYgX2FzaW5mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0FTSU5MKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVNJTkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FTSU5MIDEKKyMgZGVmaW5lIGFzaW5sIF9hc2lubAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BVEFOMkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BVEFOMkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU4yRiAxCisjIGRlZmluZSBhdGFuMmYgX2F0YW4yZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BVEFOMkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BVEFOMkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU4yTCAxCisjIGRlZmluZSBhdGFuMmwgX2F0YW4ybAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BVEFORikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0FUQU5GKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFORiAxCisjIGRlZmluZSBhdGFuZiBfYXRhbmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQVRBTkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BVEFOTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVRBTkwgMQorIyBkZWZpbmUgYXRhbmwgX2F0YW5sCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0NFSUxGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQ0VJTEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0NFSUxGIDEKKyMgZGVmaW5lIGNlaWxmIF9jZWlsZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19DRUlMTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0NFSUxMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9DRUlMTCAxCisjIGRlZmluZSBjZWlsbCBfY2VpbGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQ09TRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0NPU0YpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0YgMQorIyBkZWZpbmUgY29zZiBfY29zZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19DT1NIRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0NPU0hGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT1NIRiAxCisjIGRlZmluZSBjb3NoZiBfY29zaGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQ09TSEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9DT1NITCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ09TSEwgMQorIyBkZWZpbmUgY29zaGwgX2Nvc2hsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0NPU0wpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9DT1NMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT1NMIDEKKyMgZGVmaW5lIGNvc2wgX2Nvc2wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRVhQRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0VYUEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0VYUEYgMQorIyBkZWZpbmUgZXhwZiBfZXhwZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19FWFBMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRVhQTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVhQTCAxCisjIGRlZmluZSBleHBsIF9leHBsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZBQlNGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRkFCU0YpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZBQlNGIDEKKyMgZGVmaW5lIGZhYnNmIF9mYWJzZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GQUJTTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZBQlNMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GQUJTTCAxCisjIGRlZmluZSBmYWJzbCBfZmFic2wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRklOSVRFKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRklOSVRFKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GSU5JVEUgMQorIyBkZWZpbmUgZmluaXRlIF9maW5pdGUKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRklOSVRFRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZJTklURUYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZJTklURUYgMQorIyBkZWZpbmUgZmluaXRlZiBfZmluaXRlZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GSU5JVEVMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRklOSVRFTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRklOSVRFTCAxCisjIGRlZmluZSBmaW5pdGVsIF9maW5pdGVsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZMT09SRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZMT09SRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkxPT1JGIDEKKyMgZGVmaW5lIGZsb29yZiBfZmxvb3JmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZMT09STCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZMT09STCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkxPT1JMIDEKKyMgZGVmaW5lIGZsb29ybCBfZmxvb3JsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZNT0RGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRk1PREYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZNT0RGIDEKKyMgZGVmaW5lIGZtb2RmIF9mbW9kZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GTU9ETCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZNT0RMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTU9ETCAxCisjIGRlZmluZSBmbW9kbCBfZm1vZGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRlBDTEFTUykgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZQQ0xBU1MpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZQQ0xBU1MgMQorIyBkZWZpbmUgZnBjbGFzcyBfZnBjbGFzcworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GUkVYUEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GUkVYUEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZSRVhQRiAxCisjIGRlZmluZSBmcmV4cGYgX2ZyZXhwZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GUkVYUEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GUkVYUEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZSRVhQTCAxCisjIGRlZmluZSBmcmV4cGwgX2ZyZXhwbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19IWVBPVCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0hZUE9UKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVCAxCisjIGRlZmluZSBoeXBvdCBfaHlwb3QKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSFlQT1RGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSFlQT1RGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVEYgMQorIyBkZWZpbmUgaHlwb3RmIF9oeXBvdGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSFlQT1RMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSFlQT1RMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVEwgMQorIyBkZWZpbmUgaHlwb3RsIF9oeXBvdGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSVNJTkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9JU0lORikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkYgMQorIyBkZWZpbmUgaXNpbmYgX2lzaW5mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0lTSU5GRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0lTSU5GRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkZGIDEKKyMgZGVmaW5lIGlzaW5mZiBfaXNpbmZmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0lTSU5GTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0lTSU5GTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkZMIDEKKyMgZGVmaW5lIGlzaW5mbCBfaXNpbmZsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0lTTkFOKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSVNOQU4pCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFOIDEKKyMgZGVmaW5lIGlzbmFuIF9pc25hbgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19JU05BTkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9JU05BTkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFORiAxCisjIGRlZmluZSBpc25hbmYgX2lzbmFuZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19JU05BTkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9JU05BTkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFOTCAxCisjIGRlZmluZSBpc25hbmwgX2lzbmFubAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19MREVYUEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9MREVYUEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0xERVhQRiAxCisjIGRlZmluZSBsZGV4cGYgX2xkZXhwZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19MREVYUEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9MREVYUEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0xERVhQTCAxCisjIGRlZmluZSBsZGV4cGwgX2xkZXhwbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19MT0cxMEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9MT0cxMEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0xPRzEwRiAxCisjIGRlZmluZSBsb2cxMGYgX2xvZzEwZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19MT0cxMEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9MT0cxMEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0xPRzEwTCAxCisjIGRlZmluZSBsb2cxMGwgX2xvZzEwbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19MT0dGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTE9HRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfTE9HRiAxCisjIGRlZmluZSBsb2dmIF9sb2dmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0xPR0wpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9MT0dMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0dMIDEKKyMgZGVmaW5lIGxvZ2wgX2xvZ2wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTU9ERikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX01PREYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX01PREYgMQorIyBkZWZpbmUgbW9kZiBfbW9kZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19NT0RGRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX01PREZGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9NT0RGRiAxCisjIGRlZmluZSBtb2RmZiBfbW9kZmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTU9ERkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9NT0RGTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfTU9ERkwgMQorIyBkZWZpbmUgbW9kZmwgX21vZGZsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1BPV0YpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9QT1dGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9QT1dGIDEKKyMgZGVmaW5lIHBvd2YgX3Bvd2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fUE9XTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1BPV0wpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1BPV0wgMQorIyBkZWZpbmUgcG93bCBfcG93bAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19RRlBDTEFTUykgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1FGUENMQVNTKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9RRlBDTEFTUyAxCisjIGRlZmluZSBxZnBjbGFzcyBfcWZwY2xhc3MKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU0lOQ09TKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lOQ09TKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5DT1MgMQorIyBkZWZpbmUgc2luY29zIF9zaW5jb3MKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU0lOQ09TRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkNPU0YpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkNPU0YgMQorIyBkZWZpbmUgc2luY29zZiBfc2luY29zZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TSU5DT1NMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lOQ09TTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOQ09TTCAxCisjIGRlZmluZSBzaW5jb3NsIF9zaW5jb3NsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NJTkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9TSU5GKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5GIDEKKyMgZGVmaW5lIHNpbmYgX3NpbmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU0lOSEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9TSU5IRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOSEYgMQorIyBkZWZpbmUgc2luaGYgX3NpbmhmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NJTkhMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lOSEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkhMIDEKKyMgZGVmaW5lIHNpbmhsIF9zaW5obAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TSU5MKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lOTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOTCAxCisjIGRlZmluZSBzaW5sIF9zaW5sCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NRUlRGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU1FSVEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NRUlRGIDEKKyMgZGVmaW5lIHNxcnRmIF9zcXJ0ZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TUVJUTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NRUlRMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TUVJUTCAxCisjIGRlZmluZSBzcXJ0bCBfc3FydGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU1RSVE9GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU1RSVE9GKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJUT0YgMQorIyBkZWZpbmUgc3RydG9mIF9zdHJ0b2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU1RSVE9MRCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NUUlRPTEQpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NUUlRPTEQgMQorIyBkZWZpbmUgc3RydG9sZCBfc3RydG9sZAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19UQU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfVEFORikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfVEFORiAxCisjIGRlZmluZSB0YW5mIF90YW5mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1RBTkhGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfVEFOSEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkhGIDEKKyMgZGVmaW5lIHRhbmhmIF90YW5oZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19UQU5ITCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1RBTkhMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5ITCAxCisjIGRlZmluZSB0YW5obCBfdGFuaGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fVEFOTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1RBTkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkwgMQorIyBkZWZpbmUgdGFubCBfdGFubAorI2VuZGlmCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9DWFhfQ09ORklHX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYysraW8uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYysraW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzhjMTg2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jKytpby5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vIFVuZGVybHlpbmcgaW8gbGlicmFyeSBkZXRhaWxzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2MrK2lvLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3N9CisgKi8KKworLy8gY19pb19zdGRpby5oIC0gRGVmaW5lcyBmb3IgdXNpbmcgIkMiIHN0ZGlvLmgKKworI2lmbmRlZiBfR0xJQkNYWF9DWFhfSU9fSAorI2RlZmluZSBfR0xJQkNYWF9DWFhfSU9fSCAxCisKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Yml0cy9ndGhyLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0eXBlZGVmIF9fZ3RocmVhZF9tdXRleF90IF9fY19sb2NrOworCisgIC8vIGZvciBiYXNpY19maWxlLmgKKyAgdHlwZWRlZiBGSUxFIF9fY19maWxlOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jKytsb2NhbGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYysrbG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4ZDk3OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYysrbG9jYWxlLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8vIFdyYXBwZXIgZm9yIHVuZGVybHlpbmcgQy1sYW5ndWFnZSBsb2NhbGl6YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvYysrbG9jYWxlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjggIFN0YW5kYXJkIGxvY2FsZSBjYXRlZ29yaWVzLgorLy8KKworLy8gV3JpdHRlbiBieSBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKworI2lmbmRlZiBfR0xJQkNYWF9DWFhfTE9DQUxFX0gKKyNkZWZpbmUgX0dMSUJDWFhfQ1hYX0xPQ0FMRV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Y2xvY2FsZT4KKworI2RlZmluZSBfR0xJQkNYWF9DX0xPQ0FMRV9HTlUgMQorCisjZGVmaW5lIF9HTElCQ1hYX05VTV9DQVRFR09SSUVTIDYKKworI2lmIF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+IDIpCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgZXh0ZXJuICJDIiBfX3R5cGVvZih1c2Vsb2NhbGUpIF9fdXNlbG9jYWxlOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHR5cGVkZWYgX19sb2NhbGVfdAkJX19jX2xvY2FsZTsKKworICAvLyBDb252ZXJ0IG51bWVyaWMgdmFsdWUgb2YgdHlwZSBkb3VibGUgYW5kIGxvbmcgZG91YmxlIHRvIHN0cmluZyBhbmQKKyAgLy8gcmV0dXJuIGxlbmd0aCBvZiBzdHJpbmcuICBJZiB2c25wcmludGYgaXMgYXZhaWxhYmxlIHVzZSBpdCwgb3RoZXJ3aXNlCisgIC8vIGZhbGwgYmFjayB0byB0aGUgdW5zYWZlIHZzcHJpbnRmIHdoaWNoLCBpbiBnZW5lcmFsLCBjYW4gYmUgZGFuZ2Vyb3VzCisgIC8vIGFuZCBzaG91bGQgYmUgYXZvaWRlZC4KKyAgaW5saW5lIGludAorICBfX2NvbnZlcnRfZnJvbV92KGNvbnN0IF9fY19sb2NhbGUmIF9fY2xvYyBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpLAorCQkgICBjaGFyKiBfX291dCwKKwkJICAgY29uc3QgaW50IF9fc2l6ZSBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpLAorCQkgICBjb25zdCBjaGFyKiBfX2ZtdCwgLi4uKQorICB7CisjaWYgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID4gMikKKyAgICBfX2NfbG9jYWxlIF9fb2xkID0gX19nbnVfY3h4OjpfX3VzZWxvY2FsZShfX2Nsb2MpOworI2Vsc2UKKyAgICBjaGFyKiBfX29sZCA9IHN0ZDo6c2V0bG9jYWxlKExDX05VTUVSSUMsIDApOworICAgIGNoYXIqIF9fc2F2ID0gMDsKKyAgICBpZiAoX19idWlsdGluX3N0cmNtcChfX29sZCwgIkMiKSkKKyAgICAgIHsKKwljb25zdCBzaXplX3QgX19sZW4gPSBfX2J1aWx0aW5fc3RybGVuKF9fb2xkKSArIDE7CisJX19zYXYgPSBuZXcgY2hhcltfX2xlbl07CisJX19idWlsdGluX21lbWNweShfX3NhdiwgX19vbGQsIF9fbGVuKTsKKwlzdGQ6OnNldGxvY2FsZShMQ19OVU1FUklDLCAiQyIpOworICAgICAgfQorI2VuZGlmCisKKyAgICBfX2J1aWx0aW5fdmFfbGlzdCBfX2FyZ3M7CisgICAgX19idWlsdGluX3ZhX3N0YXJ0KF9fYXJncywgX19mbXQpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OQorICAgIGNvbnN0IGludCBfX3JldCA9IF9fYnVpbHRpbl92c25wcmludGYoX19vdXQsIF9fc2l6ZSwgX19mbXQsIF9fYXJncyk7CisjZWxzZQorICAgIGNvbnN0IGludCBfX3JldCA9IF9fYnVpbHRpbl92c3ByaW50ZihfX291dCwgX19mbXQsIF9fYXJncyk7CisjZW5kaWYKKworICAgIF9fYnVpbHRpbl92YV9lbmQoX19hcmdzKTsKKworI2lmIF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+IDIpCisgICAgX19nbnVfY3h4OjpfX3VzZWxvY2FsZShfX29sZCk7CisjZWxzZQorICAgIGlmIChfX3NhdikKKyAgICAgIHsKKwlzdGQ6OnNldGxvY2FsZShMQ19OVU1FUklDLCBfX3Nhdik7CisJZGVsZXRlIFtdIF9fc2F2OworICAgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIF9fcmV0OworICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2NwdV9kZWZpbmVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2NwdV9kZWZpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4MWQzZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvY3B1X2RlZmluZXMuaApAQCAtMCwwICsxLDMzIEBACisvLyBTcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgZ2VuZXJpYyBwbGF0Zm9ybXMgIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2NwdV9kZWZpbmVzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3Nmd2R9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9DUFVfREVGSU5FUworI2RlZmluZSBfR0xJQkNYWF9DUFVfREVGSU5FUyAxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jdHlwZV9iYXNlLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2N0eXBlX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDhlOTc4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jdHlwZV9iYXNlLmgKQEAgLTAsMCArMSw2MyBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvY3R5cGVfYmFzZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4xICBMb2NhbGVzCisvLworCisvLyBJbmZvcm1hdGlvbiBhcyBnbGVhbmVkIGZyb20gL3Vzci9pbmNsdWRlL2N0eXBlLmgKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vLyBAYnJpZWYgIEJhc2UgY2xhc3MgZm9yIGN0eXBlLgorICBzdHJ1Y3QgY3R5cGVfYmFzZQorICB7CisgICAgLy8gTm9uLXN0YW5kYXJkIHR5cGVkZWZzLgorICAgIHR5cGVkZWYgY29uc3QgaW50KiAJCV9fdG9fdHlwZTsKKworICAgIC8vIE5COiBPZmZzZXRzIGludG8gY3R5cGU8Y2hhcj46Ol9NX3RhYmxlIGZvcmNlIGEgcGFydGljdWxhciBzaXplCisgICAgLy8gb24gdGhlIG1hc2sgdHlwZS4gQmVjYXVzZSBvZiB0aGlzLCB3ZSBkb24ndCB1c2UgYW4gZW51bS4KKyAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IAltYXNrOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHVwcGVyICAgIAk9IF9JU3VwcGVyOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGxvd2VyIAk9IF9JU2xvd2VyOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGFscGhhIAk9IF9JU2FscGhhOworICAgIHN0YXRpYyBjb25zdCBtYXNrIGRpZ2l0IAk9IF9JU2RpZ2l0OworICAgIHN0YXRpYyBjb25zdCBtYXNrIHhkaWdpdCAJPSBfSVN4ZGlnaXQ7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgc3BhY2UgCT0gX0lTc3BhY2U7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgcHJpbnQgCT0gX0lTcHJpbnQ7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgZ3JhcGggCT0gX0lTYWxwaGEgfCBfSVNkaWdpdCB8IF9JU3B1bmN0OworICAgIHN0YXRpYyBjb25zdCBtYXNrIGNudHJsIAk9IF9JU2NudHJsOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHB1bmN0IAk9IF9JU3B1bmN0OworICAgIHN0YXRpYyBjb25zdCBtYXNrIGFsbnVtIAk9IF9JU2FscGhhIHwgX0lTZGlnaXQ7CisgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvY3R5cGVfaW5saW5lLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2N0eXBlX2lubGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NjMxN2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2N0eXBlX2lubGluZS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vIExvY2FsZSBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2N0eXBlX2lubGluZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4xICBMb2NhbGVzCisvLworCisvLyBjdHlwZSBiaXRzIHRvIGJlIGlubGluZWQgZ28gaGVyZS4gTm9uLWlubGluYWJsZSAoaWUgdmlydHVhbCBkb18qKQorLy8gZnVuY3Rpb25zIGdvIGluIGN0eXBlLmNjCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICBib29sCisgIGN0eXBlPGNoYXI+OjoKKyAgaXMobWFzayBfX20sIGNoYXIgX19jKSBjb25zdAorICB7IHJldHVybiBfTV90YWJsZVtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihfX2MpXSAmIF9fbTsgfQorCisgIGNvbnN0IGNoYXIqCisgIGN0eXBlPGNoYXI+OjoKKyAgaXMoY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCwgbWFzayogX192ZWMpIGNvbnN0CisgIHsKKyAgICB3aGlsZSAoX19sb3cgPCBfX2hpZ2gpCisgICAgICAqX192ZWMrKyA9IF9NX3RhYmxlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCpfX2xvdysrKV07CisgICAgcmV0dXJuIF9faGlnaDsKKyAgfQorCisgIGNvbnN0IGNoYXIqCisgIGN0eXBlPGNoYXI+OjoKKyAgc2Nhbl9pcyhtYXNrIF9fbSwgY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3QKKyAgeworICAgIHdoaWxlIChfX2xvdyA8IF9faGlnaAorCSAgICYmICEoX01fdGFibGVbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKl9fbG93KV0gJiBfX20pKQorICAgICAgKytfX2xvdzsKKyAgICByZXR1cm4gX19sb3c7CisgIH0KKworICBjb25zdCBjaGFyKgorICBjdHlwZTxjaGFyPjo6CisgIHNjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoKSBjb25zdAorICB7CisgICAgd2hpbGUgKF9fbG93IDwgX19oaWdoCisJICAgJiYgKF9NX3RhYmxlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCpfX2xvdyldICYgX19tKSAhPSAwKQorICAgICAgKytfX2xvdzsKKyAgICByZXR1cm4gX19sb3c7CisgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jeHhhYmlfdHdlYWtzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2N4eGFiaV90d2Vha3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTg5NTM5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jeHhhYmlfdHdlYWtzLmgKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29udHJvbCB2YXJpb3VzIHRhcmdldCBzcGVjaWZpYyBBQkkgdHdlYWtzLiAgR2VuZXJpYyB2ZXJzaW9uLgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jeHhhYmlfdHdlYWtzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtjeHhhYmkuaH0KKyAqLworCisjaWZuZGVmIF9DWFhBQklfVFdFQUtTX0gKKyNkZWZpbmUgX0NYWEFCSV9UV0VBS1NfSCAxCisKKyNpZmRlZiBfX2NwbHVzcGx1cworbmFtZXNwYWNlIF9fY3h4YWJpdjEKK3sKKyAgZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmCisKKyAgLy8gVGhlIGdlbmVyaWMgQUJJIHVzZXMgdGhlIGZpcnN0IGJ5dGUgb2YgYSA2NC1iaXQgZ3VhcmQgdmFyaWFibGUuCisjZGVmaW5lIF9HTElCQ1hYX0dVQVJEX1RFU1QoeCkgKCooY2hhciAqKSAoeCkgIT0gMCkKKyNkZWZpbmUgX0dMSUJDWFhfR1VBUkRfU0VUKHgpICooY2hhciAqKSAoeCkgPSAxCisjZGVmaW5lIF9HTElCQ1hYX0dVQVJEX0JJVCBfX2d1YXJkX3Rlc3RfYml0ICgwLCAxKQorI2RlZmluZSBfR0xJQkNYWF9HVUFSRF9QRU5ESU5HX0JJVCBfX2d1YXJkX3Rlc3RfYml0ICgxLCAxKQorI2RlZmluZSBfR0xJQkNYWF9HVUFSRF9XQUlUSU5HX0JJVCBfX2d1YXJkX3Rlc3RfYml0ICgyLCAxKQorICBfX2V4dGVuc2lvbl9fIHR5cGVkZWYgaW50IF9fZ3VhcmQgX19hdHRyaWJ1dGVfXygobW9kZSAoX19ESV9fKSkpOworCisgIC8vIF9fY3hhX3ZlY19jdG9yIGhhcyB2b2lkIHJldHVybiB0eXBlLgorICB0eXBlZGVmIHZvaWQgX19jeGFfdmVjX2N0b3JfcmV0dXJuX3R5cGU7CisjZGVmaW5lIF9HTElCQ1hYX0NYQV9WRUNfQ1RPUl9SRVRVUk4oeCkgcmV0dXJuCisgIC8vIENvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgZG8gbm90IHJldHVybiBhIHZhbHVlLgorICB0eXBlZGVmIHZvaWQgX19jeGFfY2R0b3JfcmV0dXJuX3R5cGU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICB9Cit9IC8vIG5hbWVzcGFjZSBfX2N4eGFiaXYxCisjZW5kaWYKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9lcnJvcl9jb25zdGFudHMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvZXJyb3JfY29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2ZDg4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvZXJyb3JfY29uc3RhbnRzLmgKQEAgLTAsMCArMSwxNzggQEAKKy8vIFNwZWNpZmljIGRlZmluaXRpb25zIGZvciBnZW5lcmljIHBsYXRmb3JtcyAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvZXJyb3JfY29uc3RhbnRzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtzeXN0ZW1fZXJyb3J9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9FUlJPUl9DT05TVEFOVFMKKyNkZWZpbmUgX0dMSUJDWFhfRVJST1JfQ09OU1RBTlRTIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Y2Vycm5vPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgZW51bSBjbGFzcyBlcnJjCisgICAgeworICAgICAgYWRkcmVzc19mYW1pbHlfbm90X3N1cHBvcnRlZCA9IAkJRUFGTk9TVVBQT1JULAorICAgICAgYWRkcmVzc19pbl91c2UgPSAJCQkJRUFERFJJTlVTRSwKKyAgICAgIGFkZHJlc3Nfbm90X2F2YWlsYWJsZSA9IAkJCUVBRERSTk9UQVZBSUwsCisgICAgICBhbHJlYWR5X2Nvbm5lY3RlZCA9IAkJCUVJU0NPTk4sCisgICAgICBhcmd1bWVudF9saXN0X3Rvb19sb25nID0gCQkJRTJCSUcsCisgICAgICBhcmd1bWVudF9vdXRfb2ZfZG9tYWluID0gCQkJRURPTSwKKyAgICAgIGJhZF9hZGRyZXNzID0gCQkJCUVGQVVMVCwKKyAgICAgIGJhZF9maWxlX2Rlc2NyaXB0b3IgPSAJCQlFQkFERiwKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRUJBRE1TRworICAgICAgYmFkX21lc3NhZ2UgPSAJCQkJRUJBRE1TRywKKyNlbmRpZgorCisgICAgICBicm9rZW5fcGlwZSA9IAkJCQlFUElQRSwKKyAgICAgIGNvbm5lY3Rpb25fYWJvcnRlZCA9IAkJCUVDT05OQUJPUlRFRCwKKyAgICAgIGNvbm5lY3Rpb25fYWxyZWFkeV9pbl9wcm9ncmVzcyA9IAkJRUFMUkVBRFksCisgICAgICBjb25uZWN0aW9uX3JlZnVzZWQgPSAJCQlFQ09OTlJFRlVTRUQsCisgICAgICBjb25uZWN0aW9uX3Jlc2V0ID0gCQkJRUNPTk5SRVNFVCwKKyAgICAgIGNyb3NzX2RldmljZV9saW5rID0gCQkJRVhERVYsCisgICAgICBkZXN0aW5hdGlvbl9hZGRyZXNzX3JlcXVpcmVkID0gCQlFREVTVEFERFJSRVEsCisgICAgICBkZXZpY2Vfb3JfcmVzb3VyY2VfYnVzeSA9IAkJRUJVU1ksCisgICAgICBkaXJlY3Rvcnlfbm90X2VtcHR5ID0gCQkJRU5PVEVNUFRZLAorICAgICAgZXhlY3V0YWJsZV9mb3JtYXRfZXJyb3IgPSAJCUVOT0VYRUMsCisgICAgICBmaWxlX2V4aXN0cyA9IAkgICAgICAgCQkJRUVYSVNULAorICAgICAgZmlsZV90b29fbGFyZ2UgPSAJCQkJRUZCSUcsCisgICAgICBmaWxlbmFtZV90b29fbG9uZyA9IAkJCUVOQU1FVE9PTE9ORywKKyAgICAgIGZ1bmN0aW9uX25vdF9zdXBwb3J0ZWQgPSAJCQlFTk9TWVMsCisgICAgICBob3N0X3VucmVhY2hhYmxlID0gCQkJRUhPU1RVTlJFQUNILAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FSURSTQorICAgICAgaWRlbnRpZmllcl9yZW1vdmVkID0gCQkJRUlEUk0sCisjZW5kaWYKKworICAgICAgaWxsZWdhbF9ieXRlX3NlcXVlbmNlID0gCQkJRUlMU0VRLAorICAgICAgaW5hcHByb3ByaWF0ZV9pb19jb250cm9sX29wZXJhdGlvbiA9IAlFTk9UVFksCisgICAgICBpbnRlcnJ1cHRlZCA9IAkJCQlFSU5UUiwKKyAgICAgIGludmFsaWRfYXJndW1lbnQgPSAJCQlFSU5WQUwsCisgICAgICBpbnZhbGlkX3NlZWsgPSAJCQkJRVNQSVBFLAorICAgICAgaW9fZXJyb3IgPSAJCQkJRUlPLAorICAgICAgaXNfYV9kaXJlY3RvcnkgPSAJCQkJRUlTRElSLAorICAgICAgbWVzc2FnZV9zaXplID0gCQkJCUVNU0dTSVpFLAorICAgICAgbmV0d29ya19kb3duID0gCQkJCUVORVRET1dOLAorICAgICAgbmV0d29ya19yZXNldCA9IAkJCQlFTkVUUkVTRVQsCisgICAgICBuZXR3b3JrX3VucmVhY2hhYmxlID0gCQkJRU5FVFVOUkVBQ0gsCisgICAgICBub19idWZmZXJfc3BhY2UgPSAJCQlFTk9CVUZTLAorICAgICAgbm9fY2hpbGRfcHJvY2VzcyA9IAkJCUVDSElMRCwKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU5PTElOSworICAgICAgbm9fbGluayA9IAkJCQlFTk9MSU5LLAorI2VuZGlmCisKKyAgICAgIG5vX2xvY2tfYXZhaWxhYmxlID0gCQkJRU5PTENLLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FTk9EQVRBCisgICAgICBub19tZXNzYWdlX2F2YWlsYWJsZSA9IAkJCUVOT0RBVEEsIAorI2VuZGlmCisKKyAgICAgIG5vX21lc3NhZ2UgPSAJCQkJRU5PTVNHLCAKKyAgICAgIG5vX3Byb3RvY29sX29wdGlvbiA9IAkJCUVOT1BST1RPT1BULAorICAgICAgbm9fc3BhY2Vfb25fZGV2aWNlID0gCQkJRU5PU1BDLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FTk9TUgorICAgICAgbm9fc3RyZWFtX3Jlc291cmNlcyA9IAkJCUVOT1NSLAorI2VuZGlmCisKKyAgICAgIG5vX3N1Y2hfZGV2aWNlX29yX2FkZHJlc3MgPSAJCUVOWElPLAorICAgICAgbm9fc3VjaF9kZXZpY2UgPSAJCQkJRU5PREVWLAorICAgICAgbm9fc3VjaF9maWxlX29yX2RpcmVjdG9yeSA9IAkJRU5PRU5ULAorICAgICAgbm9fc3VjaF9wcm9jZXNzID0gCQkJRVNSQ0gsCisgICAgICBub3RfYV9kaXJlY3RvcnkgPSAJCQlFTk9URElSLAorICAgICAgbm90X2Ffc29ja2V0ID0gCQkJCUVOT1RTT0NLLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FTk9TVFIKKyAgICAgIG5vdF9hX3N0cmVhbSA9IAkJCQlFTk9TVFIsCisjZW5kaWYKKworICAgICAgbm90X2Nvbm5lY3RlZCA9IAkJCQlFTk9UQ09OTiwKKyAgICAgIG5vdF9lbm91Z2hfbWVtb3J5ID0gCQkJRU5PTUVNLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FTk9UU1VQCisgICAgICBub3Rfc3VwcG9ydGVkID0gCQkJCUVOT1RTVVAsCisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRUNBTkNFTEVECisgICAgICBvcGVyYXRpb25fY2FuY2VsZWQgPSAJCQlFQ0FOQ0VMRUQsCisjZW5kaWYKKworICAgICAgb3BlcmF0aW9uX2luX3Byb2dyZXNzID0gCQkJRUlOUFJPR1JFU1MsCisgICAgICBvcGVyYXRpb25fbm90X3Blcm1pdHRlZCA9IAkJRVBFUk0sCisgICAgICBvcGVyYXRpb25fbm90X3N1cHBvcnRlZCA9IAkJRU9QTk9UU1VQUCwKKyAgICAgIG9wZXJhdGlvbl93b3VsZF9ibG9jayA9IAkJCUVXT1VMREJMT0NLLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FT1dORVJERUFECisgICAgICBvd25lcl9kZWFkID0gCQkJCUVPV05FUkRFQUQsCisjZW5kaWYKKworICAgICAgcGVybWlzc2lvbl9kZW5pZWQgPSAJCQlFQUNDRVMsCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VQUk9UTworICAgICAgcHJvdG9jb2xfZXJyb3IgPSAJCQkJRVBST1RPLAorI2VuZGlmCisKKyAgICAgIHByb3RvY29sX25vdF9zdXBwb3J0ZWQgPSAJCQlFUFJPVE9OT1NVUFBPUlQsCisgICAgICByZWFkX29ubHlfZmlsZV9zeXN0ZW0gPSAJCQlFUk9GUywKKyAgICAgIHJlc291cmNlX2RlYWRsb2NrX3dvdWxkX29jY3VyID0gCQlFREVBRExLLAorICAgICAgcmVzb3VyY2VfdW5hdmFpbGFibGVfdHJ5X2FnYWluID0gCQlFQUdBSU4sCisgICAgICByZXN1bHRfb3V0X29mX3JhbmdlID0gCQkJRVJBTkdFLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FTk9UUkVDT1ZFUkFCTEUKKyAgICAgIHN0YXRlX25vdF9yZWNvdmVyYWJsZSA9IAkJCUVOT1RSRUNPVkVSQUJMRSwKKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FVElNRQorICAgICAgc3RyZWFtX3RpbWVvdXQgPSAJCQkJRVRJTUUsCisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRVRYVEJTWQorICAgICAgdGV4dF9maWxlX2J1c3kgPSAJCQkJRVRYVEJTWSwKKyNlbmRpZgorCisgICAgICB0aW1lZF9vdXQgPSAJCQkJRVRJTUVET1VULAorICAgICAgdG9vX21hbnlfZmlsZXNfb3Blbl9pbl9zeXN0ZW0gPSAJCUVORklMRSwKKyAgICAgIHRvb19tYW55X2ZpbGVzX29wZW4gPSAJCQlFTUZJTEUsCisgICAgICB0b29fbWFueV9saW5rcyA9IAkJCQlFTUxJTkssCisgICAgICB0b29fbWFueV9zeW1ib2xpY19saW5rX2xldmVscyA9IAkJRUxPT1AsCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VPVkVSRkxPVworICAgICAgdmFsdWVfdG9vX2xhcmdlID0gCQkJRU9WRVJGTE9XLAorI2VuZGlmCisKKyAgICAgIHdyb25nX3Byb3RvY29sX3R5cGUgPSAJCQlFUFJPVE9UWVBFCisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvZXh0YysrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2V4dGMrKy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTllZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2V4dGMrKy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vIEMrKyBpbmNsdWRlcyB1c2VkIGZvciBwcmVjb21waWxpbmcgZXh0ZW5zaW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0YysrLmgKKyAqICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGZpbGUgZm9yIGEgcHJlY29tcGlsZWQgaGVhZGVyLgorICovCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyNpbmNsdWRlIDxiaXRzL3N0ZHRyMWMrKy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxleHQvYWxnb3JpdGhtPgorI2luY2x1ZGUgPGV4dC9hcnJheV9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvYXRvbWljaXR5Lmg+CisjaW5jbHVkZSA8ZXh0L2JpdG1hcF9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvY2FzdC5oPgorI2luY2x1ZGUgPGV4dC9jb25jdXJyZW5jZS5oPgorI2luY2x1ZGUgPGV4dC9kZWJ1Z19hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvZXh0cHRyX2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGV4dC9mdW5jdGlvbmFsPgorI2luY2x1ZGUgPGV4dC9pdGVyYXRvcj4KKyNpbmNsdWRlIDxleHQvbWFsbG9jX2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGV4dC9tZW1vcnk+CisjaW5jbHVkZSA8ZXh0L210X2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGV4dC9uZXdfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L251bWVyaWM+CisjaW5jbHVkZSA8ZXh0L3BvZF9jaGFyX3RyYWl0cy5oPgorI2luY2x1ZGUgPGV4dC9wb2ludGVyLmg+CisjaW5jbHVkZSA8ZXh0L3Bvb2xfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L3JiX3RyZWU+CisjaW5jbHVkZSA8ZXh0L3JvcGU+CisjaW5jbHVkZSA8ZXh0L3NsaXN0PgorI2luY2x1ZGUgPGV4dC9zdGRpb19maWxlYnVmLmg+CisjaW5jbHVkZSA8ZXh0L3N0ZGlvX3N5bmNfZmlsZWJ1Zi5oPgorI2luY2x1ZGUgPGV4dC90aHJvd19hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvdHlwZWxpc3QuaD4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvdnN0cmluZy5oPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9wcmlvcml0eV9xdWV1ZS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2V4Y2VwdGlvbi5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2hhc2hfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvbGlzdF91cGRhdGVfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90cmllX3BvbGljeS5ocHA+CisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0lDT05WCisgI2luY2x1ZGUgPGV4dC9jb2RlY3Z0X3NwZWNpYWxpemF0aW9ucy5oPgorICNpbmNsdWRlIDxleHQvZW5jX2ZpbGVidWYuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9ndGhyLWRlZmF1bHQuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvZ3Roci1kZWZhdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3MWIxOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvZ3Roci1kZWZhdWx0LmgKQEAgLTAsMCArMSw4ODkgQEAKKy8qIFRocmVhZHMgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgbGliZ2NjMiBhbmQgbGlib2JqYy4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9HTElCQ1hYX0dDQ19HVEhSX1BPU0lYX0gKKyNkZWZpbmUgX0dMSUJDWFhfR0NDX0dUSFJfUE9TSVhfSAorCisvKiBQT1NJWCB0aHJlYWRzIHNwZWNpZmljIGRlZmluaXRpb25zLgorICAgRWFzeSwgc2luY2UgdGhlIGludGVyZmFjZSBpcyBqdXN0IG9uZS10by1vbmUgbWFwcGluZy4gICovCisKKyNkZWZpbmUgX19HVEhSRUFEUyAxCisjZGVmaW5lIF9fR1RIUkVBRFNfQ1hYMFggMQorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaWYgKChkZWZpbmVkKF9MSUJPQkpDKSB8fCBkZWZpbmVkKF9MSUJPQkpDX1dFQUspKSBcCisgICAgIHx8ICFkZWZpbmVkKF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0spKQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaWYgZGVmaW5lZChfUE9TSVhfVElNRU9VVFMpICYmIF9QT1NJWF9USU1FT1VUUyA+PSAwCisjICBkZWZpbmUgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSyAxCisjIGVsc2UKKyMgIGRlZmluZSBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLIDAKKyMgZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHB0aHJlYWRfdCBfX2d0aHJlYWRfdDsKK3R5cGVkZWYgcHRocmVhZF9rZXlfdCBfX2d0aHJlYWRfa2V5X3Q7Cit0eXBlZGVmIHB0aHJlYWRfb25jZV90IF9fZ3RocmVhZF9vbmNlX3Q7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBfX2d0aHJlYWRfbXV0ZXhfdDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdDsKK3R5cGVkZWYgcHRocmVhZF9jb25kX3QgX19ndGhyZWFkX2NvbmRfdDsKK3R5cGVkZWYgc3RydWN0IHRpbWVzcGVjIF9fZ3RocmVhZF90aW1lX3Q7CisKKy8qIFBPU0lYIGxpa2UgY29uZGl0aW9uYWwgdmFyaWFibGVzIGFyZSBzdXBwb3J0ZWQuICBQbGVhc2UgbG9vayBhdCBjb21tZW50cworICAgaW4gZ3Roci5oIGZvciBkZXRhaWxzLiAqLworI2RlZmluZSBfX0dUSFJFQURfSEFTX0NPTkQJMQorCisjZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIKKyNkZWZpbmUgX19HVEhSRUFEX01VVEVYX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX211dGV4X2luaXRfZnVuY3Rpb24KKyNkZWZpbmUgX19HVEhSRUFEX09OQ0VfSU5JVCBQVEhSRUFEX09OQ0VfSU5JVAorI2lmIGRlZmluZWQoUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVIpCisjZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVCBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUgorI2VsaWYgZGVmaW5lZChQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkKKyNkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QCisjZWxzZQorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9pbml0X2Z1bmN0aW9uCisjZW5kaWYKKyNkZWZpbmUgX19HVEhSRUFEX0NPTkRfSU5JVCBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVIKKyNkZWZpbmUgX19HVEhSRUFEX1RJTUVfSU5JVCB7MCwwfQorCisjaWZkZWYgX0dUSFJFQURfVVNFX01VVEVYX0lOSVRfRlVOQworIyB1bmRlZiBfX0dUSFJFQURfTVVURVhfSU5JVAorI2VuZGlmCisjaWZkZWYgX0dUSFJFQURfVVNFX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkMKKyMgdW5kZWYgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUCisjIHVuZGVmIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTgorIyBkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfaW5pdF9mdW5jdGlvbgorI2VuZGlmCisjaWZkZWYgX0dUSFJFQURfVVNFX0NPTkRfSU5JVF9GVU5DCisjIHVuZGVmIF9fR1RIUkVBRF9DT05EX0lOSVQKKyMgZGVmaW5lIF9fR1RIUkVBRF9DT05EX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX2NvbmRfaW5pdF9mdW5jdGlvbgorI2VuZGlmCisKKyNpZiBfX0dYWF9XRUFLX18gJiYgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSworIyBpZm5kZWYgX19ndGhyd19wcmFnbWEKKyMgIGRlZmluZSBfX2d0aHJ3X3ByYWdtYShwcmFnbWEpCisjIGVuZGlmCisjIGRlZmluZSBfX2d0aHJ3MihuYW1lLG5hbWUyLHR5cGUpIFwKKyAgc3RhdGljIF9fdHlwZW9mKHR5cGUpIG5hbWUgX19hdHRyaWJ1dGVfXyAoKF9fd2Vha3JlZl9fKCNuYW1lMikpKTsgXAorICBfX2d0aHJ3X3ByYWdtYSh3ZWFrIHR5cGUpCisjIGRlZmluZSBfX2d0aHJ3XyhuYW1lKSBfX2d0aHJ3XyAjIyBuYW1lCisjZWxzZQorIyBkZWZpbmUgX19ndGhydzIobmFtZSxuYW1lMix0eXBlKQorIyBkZWZpbmUgX19ndGhyd18obmFtZSkgbmFtZQorI2VuZGlmCisKKy8qIFR5cGljYWxseSwgX19ndGhyd19mb28gaXMgYSB3ZWFrIHJlZmVyZW5jZSB0byBzeW1ib2wgZm9vLiAgKi8KKyNkZWZpbmUgX19ndGhydyhuYW1lKSBfX2d0aHJ3MihfX2d0aHJ3XyAjIyBuYW1lLG5hbWUsbmFtZSkKKworX19ndGhydyhwdGhyZWFkX29uY2UpCitfX2d0aHJ3KHB0aHJlYWRfZ2V0c3BlY2lmaWMpCitfX2d0aHJ3KHB0aHJlYWRfc2V0c3BlY2lmaWMpCisKK19fZ3RocncocHRocmVhZF9jcmVhdGUpCitfX2d0aHJ3KHB0aHJlYWRfam9pbikKK19fZ3RocncocHRocmVhZF9lcXVhbCkKK19fZ3RocncocHRocmVhZF9zZWxmKQorX19ndGhydyhwdGhyZWFkX2RldGFjaCkKKyNpZm5kZWYgX19CSU9OSUNfXworX19ndGhydyhwdGhyZWFkX2NhbmNlbCkKKyNlbmRpZgorX19ndGhydyhzY2hlZF95aWVsZCkKKworX19ndGhydyhwdGhyZWFkX211dGV4X2xvY2spCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaykKKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKQorI2VuZGlmCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfdW5sb2NrKQorX19ndGhydyhwdGhyZWFkX211dGV4X2luaXQpCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkKKworX19ndGhydyhwdGhyZWFkX2NvbmRfaW5pdCkKK19fZ3RocncocHRocmVhZF9jb25kX2Jyb2FkY2FzdCkKK19fZ3RocncocHRocmVhZF9jb25kX3NpZ25hbCkKK19fZ3RocncocHRocmVhZF9jb25kX3dhaXQpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF90aW1lZHdhaXQpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9kZXN0cm95KQorCitfX2d0aHJ3KHB0aHJlYWRfa2V5X2NyZWF0ZSkKK19fZ3RocncocHRocmVhZF9rZXlfZGVsZXRlKQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9pbml0KQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KQorCisKKyNpZiBkZWZpbmVkKF9MSUJPQkpDKSB8fCBkZWZpbmVkKF9MSUJPQkpDX1dFQUspCisvKiBPYmplY3RpdmUtQy4gICovCitfX2d0aHJ3KHB0aHJlYWRfZXhpdCkKKyNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORworI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworX19ndGhydyhzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KQorX19ndGhydyhzY2hlZF9nZXRfcHJpb3JpdHlfbWluKQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HICovCitfX2d0aHJ3KHB0aHJlYWRfYXR0cl9kZXN0cm95KQorX19ndGhydyhwdGhyZWFkX2F0dHJfaW5pdCkKK19fZ3RocncocHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKQorI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworX19ndGhydyhwdGhyZWFkX2dldHNjaGVkcGFyYW0pCitfX2d0aHJ3KHB0aHJlYWRfc2V0c2NoZWRwYXJhbSkKKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfTElCT0JKQyB8fCBfTElCT0JKQ19XRUFLICovCisKKyNpZiBfX0dYWF9XRUFLX18gJiYgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSworCisvKiBPbiBTb2xhcmlzIDIuNiB1cCB0byA5LCB0aGUgbGliYyBleHBvc2VzIGEgUE9TSVggdGhyZWFkcyBpbnRlcmZhY2UgZXZlbiBpZgorICAgLXB0aHJlYWRzIGlzIG5vdCBzcGVjaWZpZWQuICBUaGUgZnVuY3Rpb25zIGFyZSBkdW1taWVzIGFuZCBtb3N0IHJldHVybiBhbgorICAgZXJyb3IgdmFsdWUuICBIb3dldmVyIHB0aHJlYWRfb25jZSByZXR1cm5zIDAgd2l0aG91dCBpbnZva2luZyB0aGUgcm91dGluZQorICAgaXQgaXMgcGFzc2VkIHNvIHdlIGNhbm5vdCBwcmV0ZW5kIHRoYXQgdGhlIGludGVyZmFjZSBpcyBhY3RpdmUgaWYgLXB0aHJlYWRzCisgICBpcyBub3Qgc3BlY2lmaWVkLiAgT24gU29sYXJpcyAyLjUuMSwgdGhlIGludGVyZmFjZSBpcyBub3QgZXhwb3NlZCBhdCBhbGwgc28KKyAgIHdlIG5lZWQgdG8gcGxheSB0aGUgdXN1YWwgZ2FtZSB3aXRoIHdlYWsgc3ltYm9scy4gIE9uIFNvbGFyaXMgMTAgYW5kIHVwLCBhCisgICB3b3JraW5nIGludGVyZmFjZSBpcyBhbHdheXMgZXhwb3NlZC4gIE9uIEZyZWVCU0QgNiBhbmQgbGF0ZXIsIGxpYmMgYWxzbworICAgZXhwb3NlcyBhIGR1bW15IFBPU0lYIHRocmVhZHMgaW50ZXJmYWNlLCBzaW1pbGFyIHRvIHdoYXQgU29sYXJpcyAyLjYgdXAKKyAgIHRvIDkgZG9lcy4gIEZyZWVCU0QgPj0gNzAwMDE0IGV2ZW4gcHJvdmlkZXMgYSBwdGhyZWFkX2NhbmNlbCBzdHViIGluIGxpYmMsCisgICB3aGljaCBtZWFucyB0aGUgYWx0ZXJuYXRlIF9fZ3RocmVhZF9hY3RpdmVfcCBiZWxvdyBjYW5ub3QgYmUgdXNlZCB0aGVyZS4gICovCisKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCAoZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfX3N2cjRfXykpCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgX19ndGhyZWFkX2FjdGl2ZSA9IC0xOworCitzdGF0aWMgdm9pZAorX19ndGhyZWFkX3RyaWdnZXIgKHZvaWQpCit7CisgIF9fZ3RocmVhZF9hY3RpdmUgPSAxOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICBzdGF0aWMgcHRocmVhZF9tdXRleF90IF9fZ3RocmVhZF9hY3RpdmVfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworICBzdGF0aWMgcHRocmVhZF9vbmNlX3QgX19ndGhyZWFkX2FjdGl2ZV9vbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CisKKyAgLyogQXZvaWQgcmVhZGluZyBfX2d0aHJlYWRfYWN0aXZlIHR3aWNlIG9uIHRoZSBtYWluIGNvZGUgcGF0aC4gICovCisgIGludCBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA9IF9fZ3RocmVhZF9hY3RpdmU7CisKKyAgLyogVGhpcyB0ZXN0IGlzIG5vdCBwcm90ZWN0ZWQgdG8gYXZvaWQgdGFraW5nIGEgbG9jayBvbiB0aGUgbWFpbiBjb2RlCisgICAgIHBhdGggc28gZXZlcnkgdXBkYXRlIG9mIF9fZ3RocmVhZF9hY3RpdmUgaW4gYSB0aHJlYWRlZCBwcm9ncmFtIG11c3QKKyAgICAgYmUgYXRvbWljIHdpdGggcmVnYXJkIHRvIHRoZSByZXN1bHQgb2YgdGhlIHRlc3QuICAqLworICBpZiAoX19idWlsdGluX2V4cGVjdCAoX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPCAwLCAwKSkKKyAgICB7CisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9vbmNlKSkKKwl7CisJICAvKiBJZiB0aGlzIHJlYWxseSBpcyBhIHRocmVhZGVkIHByb2dyYW0sIHRoZW4gd2UgbXVzdCBlbnN1cmUgdGhhdAorCSAgICAgX19ndGhyZWFkX2FjdGl2ZSBoYXMgYmVlbiBzZXQgdG8gMSBiZWZvcmUgZXhpdGluZyB0aGlzIGJsb2NrLiAgKi8KKwkgIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKCZfX2d0aHJlYWRfYWN0aXZlX211dGV4KTsKKwkgIF9fZ3RocndfKHB0aHJlYWRfb25jZSkgKCZfX2d0aHJlYWRfYWN0aXZlX29uY2UsIF9fZ3RocmVhZF90cmlnZ2VyKTsKKwkgIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoJl9fZ3RocmVhZF9hY3RpdmVfbXV0ZXgpOworCX0KKworICAgICAgLyogTWFrZSBzdXJlIHdlJ2xsIG5ldmVyIGVudGVyIHRoaXMgYmxvY2sgYWdhaW4uICAqLworICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmUgPCAwKQorCV9fZ3RocmVhZF9hY3RpdmUgPSAwOworCisgICAgICBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA9IF9fZ3RocmVhZF9hY3RpdmU7CisgICAgfQorCisgIHJldHVybiBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSAhPSAwOworfQorCisjZWxzZSAvKiBuZWl0aGVyIEZyZWVCU0Qgbm9yIFNvbGFyaXMgKi8KKworLyogRm9yIGEgcHJvZ3JhbSB0byBiZSBtdWx0aS10aHJlYWRlZCB0aGUgb25seSB0aGluZyB0aGF0IGl0IGNlcnRhaW5seSBtdXN0CisgICBiZSB1c2luZyBpcyBwdGhyZWFkX2NyZWF0ZS4gIEhvd2V2ZXIsIHRoZXJlIG1heSBiZSBvdGhlciBsaWJyYXJpZXMgdGhhdAorICAgaW50ZXJjZXB0IHB0aHJlYWRfY3JlYXRlIHdpdGggdGhlaXIgb3duIGRlZmluaXRpb25zIHRvIHdyYXAgcHRocmVhZHMKKyAgIGZ1bmN0aW9uYWxpdHkgZm9yIHNvbWUgcHVycG9zZS4gIEluIHRob3NlIGNhc2VzLCBwdGhyZWFkX2NyZWF0ZSBiZWluZworICAgZGVmaW5lZCBtaWdodCBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IGxpYnB0aHJlYWQgaXMgYWN0dWFsbHkgbGlua2VkCisgICBpbi4KKworICAgRm9yIHRoZSBHTlUgQyBsaWJyYXJ5LCB3ZSBjYW4gdXNlIGEga25vd24gaW50ZXJuYWwgbmFtZS4gIFRoaXMgaXMgYWx3YXlzCisgICBhdmFpbGFibGUgaW4gdGhlIEFCSSwgYnV0IG5vIG90aGVyIGxpYnJhcnkgd291bGQgZGVmaW5lIGl0LiAgVGhhdCBpcworICAgaWRlYWwsIHNpbmNlIGFueSBwdWJsaWMgcHRocmVhZCBmdW5jdGlvbiBtaWdodCBiZSBpbnRlcmNlcHRlZCBqdXN0IGFzCisgICBwdGhyZWFkX2NyZWF0ZSBtaWdodCBiZS4gIF9fcHRocmVhZF9rZXlfY3JlYXRlIGlzIGFuICJpbnRlcm5hbCIKKyAgIGltcGxlbWVudGF0aW9uIHN5bWJvbCwgYnV0IGl0IGlzIHBhcnQgb2YgdGhlIHB1YmxpYyBleHBvcnRlZCBBQkkuICBBbHNvLAorICAgaXQncyBhbW9uZyB0aGUgc3ltYm9scyB0aGF0IHRoZSBzdGF0aWMgbGlicHRocmVhZC5hIGFsd2F5cyBsaW5rcyBpbgorICAgd2hlbmV2ZXIgcHRocmVhZF9jcmVhdGUgaXMgdXNlZCwgc28gdGhlcmUgaXMgbm8gZGFuZ2VyIG9mIGEgZmFsc2UKKyAgIG5lZ2F0aXZlIHJlc3VsdCBpbiBhbnkgc3RhdGljYWxseS1saW5rZWQsIG11bHRpLXRocmVhZGVkIHByb2dyYW0uCisKKyAgIEZvciBvdGhlcnMsIHdlIGNob29zZSBwdGhyZWFkX2NhbmNlbCBhcyBhIGZ1bmN0aW9uIHRoYXQgc2VlbXMgdW5saWtlbHkKKyAgIHRvIGJlIHJlZGVmaW5lZCBieSBhbiBpbnRlcmNlcHRvciBsaWJyYXJ5LiAgVGhlIGJpb25pYyAoQW5kcm9pZCkgQworICAgbGlicmFyeSBkb2VzIG5vdCBwcm92aWRlIHB0aHJlYWRfY2FuY2VsLCBzbyB3ZSBkbyB1c2UgcHRocmVhZF9jcmVhdGUKKyAgIHRoZXJlIChhbmQgaW50ZXJjZXB0b3IgbGlicmFyaWVzIGxvc2UpLiAgKi8KKworI2lmZGVmIF9fR0xJQkNfXworX19ndGhydzIoX19ndGhyd18oX19wdGhyZWFkX2tleV9jcmVhdGUpLAorCSBfX3B0aHJlYWRfa2V5X2NyZWF0ZSwKKwkgcHRocmVhZF9rZXlfY3JlYXRlKQorIyBkZWZpbmUgR1RIUl9BQ1RJVkVfUFJPWFkJX19ndGhyd18oX19wdGhyZWFkX2tleV9jcmVhdGUpCisjZWxpZiBkZWZpbmVkIChfX0JJT05JQ19fKQorIyBkZWZpbmUgR1RIUl9BQ1RJVkVfUFJPWFkJX19ndGhyd18ocHRocmVhZF9jcmVhdGUpCisjZWxzZQorIyBkZWZpbmUgR1RIUl9BQ1RJVkVfUFJPWFkJX19ndGhyd18ocHRocmVhZF9jYW5jZWwpCisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgc3RhdGljIHZvaWQgKmNvbnN0IF9fZ3RocmVhZF9hY3RpdmVfcHRyCisgICAgPSBfX2V4dGVuc2lvbl9fICh2b2lkICopICZHVEhSX0FDVElWRV9QUk9YWTsKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfcHRyICE9IDA7Cit9CisKKyNlbmRpZiAvKiBGcmVlQlNEIG9yIFNvbGFyaXMgKi8KKworI2Vsc2UgLyogbm90IF9fR1hYX1dFQUtfXyAqLworCisvKiBTaW1pbGFyIHRvIFNvbGFyaXMsIEhQLVVYIDExIGZvciBQQS1SSVNDIHByb3ZpZGVzIHN0dWJzIGZvciBwdGhyZWFkCisgICBjYWxscyBpbiBzaGFyZWQgZmxhdm9ycyBvZiB0aGUgSFAtVVggQyBsaWJyYXJ5LiAgTW9zdCBvZiB0aGUgc3R1YnMKKyAgIGhhdmUgbm8gZnVuY3Rpb25hbGl0eS4gIFRoZSBkZXRhaWxzIGFyZSBkZXNjcmliZWQgaW4gdGhlICJsaWJjIGN1bXVsYXRpdmUKKyAgIHBhdGNoIiBmb3IgZWFjaCBzdWJ2ZXJzaW9uIG9mIEhQLVVYIDExLiAgVGhlcmUgYXJlIHR3byBzcGVjaWFsIGludGVyZmFjZXMKKyAgIHByb3ZpZGVkIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB0byBhIHNoYXJlZCBwdGhyZWFkCisgICBsaWJyYXJ5IG9yIG5vdC4gIEhvd2V2ZXIsIHRoZXNlIGludGVyZmFjZXMgYXJlbid0IGF2YWlsYWJsZSBpbiBlYXJseQorICAgbGlicHRocmVhZCBsaWJyYXJpZXMuICBXZSBhbHNvIG5lZWQgYSB0ZXN0IHRoYXQgd29ya3MgZm9yIGFyY2hpdmUKKyAgIGxpYnJhcmllcy4gIFdlIGNhbid0IHVzZSBwdGhyZWFkX29uY2UgYXMgc29tZSBsaWJjIHZlcnNpb25zIGNhbGwgdGhlCisgICBpbml0IGZ1bmN0aW9uLiAgV2UgYWxzbyBjYW4ndCB1c2UgcHRocmVhZF9jcmVhdGUgb3IgcHRocmVhZF9hdHRyX2luaXQKKyAgIGFzIHRoZXNlIGNyZWF0ZSBhIHRocmVhZCBhbmQgdGhlcmVieSBwcmV2ZW50IGNoYW5naW5nIHRoZSBkZWZhdWx0IHN0YWNrCisgICBzaXplLiAgVGhlIGZ1bmN0aW9uIHB0aHJlYWRfZGVmYXVsdF9zdGFja3NpemVfbnAgaXMgYXZhaWxhYmxlIGluIGJvdGgKKyAgIHRoZSBhcmNoaXZlIGFuZCBzaGFyZWQgdmVyc2lvbnMgb2YgbGlicHRocmVhZC4gICBJdCBjYW4gYmUgdXNlZCB0bworICAgZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHB0aHJlYWQgc3RhY2sgc2l6ZS4gIFRoZXJlIGlzIGEgc3R1YiBpbiBzb21lCisgICBzaGFyZWQgbGliYyB2ZXJzaW9ucyB3aGljaCByZXR1cm5zIGEgemVybyBzaXplIGlmIHB0aHJlYWRzIGFyZSBub3QKKyAgIGFjdGl2ZS4gIFdlIHByb3ZpZGUgYW4gZXF1aXZhbGVudCBzdHViIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBsaWJjCisgICBkb2Vzbid0IHByb3ZpZGUgb25lLiAgKi8KKworI2lmIGRlZmluZWQoX19ocHBhX18pICYmIGRlZmluZWQoX19ocHV4X18pCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgX19ndGhyZWFkX2FjdGl2ZSA9IC0xOworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICAvKiBBdm9pZCByZWFkaW5nIF9fZ3RocmVhZF9hY3RpdmUgdHdpY2Ugb24gdGhlIG1haW4gY29kZSBwYXRoLiAgKi8KKyAgaW50IF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgc2l6ZV90IF9fczsKKworICBpZiAoX19idWlsdGluX2V4cGVjdCAoX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPCAwLCAwKSkKKyAgICB7CisgICAgICBwdGhyZWFkX2RlZmF1bHRfc3RhY2tzaXplX25wICgwLCAmX19zKTsKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmUgPSBfX3MgPyAxIDogMDsKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgICB9CisKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlICE9IDA7Cit9CisKKyNlbHNlIC8qIG5vdCBocHBhLWhwdXggKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBocHBhLWhwdXggKi8KKworI2VuZGlmIC8qIF9fR1hYX1dFQUtfXyAqLworCisjaWZkZWYgX0xJQk9CSkMKKworLyogVGhpcyBpcyB0aGUgY29uZmlnLmggZmlsZSBpbiBsaWJvYmpjLyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZkZWYgSEFWRV9TQ0hFRF9ICisjIGluY2x1ZGUgPHNjaGVkLmg+CisjZW5kaWYKKworLyogS2V5IHN0cnVjdHVyZSBmb3IgbWFpbnRhaW5pbmcgdGhyZWFkIHNwZWNpZmljIHN0b3JhZ2UgKi8KK3N0YXRpYyBwdGhyZWFkX2tleV90IF9vYmpjX3RocmVhZF9zdG9yYWdlOworc3RhdGljIHB0aHJlYWRfYXR0cl90IF9vYmpjX3RocmVhZF9hdHRyaWJzOworCisvKiBUaHJlYWQgbG9jYWwgc3RvcmFnZSBmb3IgYSBzaW5nbGUgdGhyZWFkICovCitzdGF0aWMgdm9pZCAqdGhyZWFkX2xvY2FsX3N0b3JhZ2UgPSBOVUxMOworCisvKiBCYWNrZW5kIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworCisvKiBJbml0aWFsaXplIHRoZSB0aHJlYWRzIHN1YnN5c3RlbS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfaW5pdF90aHJlYWRfc3lzdGVtICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIHRocmVhZCBzdG9yYWdlIGtleS4gICovCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9rZXlfY3JlYXRlKSAoJl9vYmpjX3RocmVhZF9zdG9yYWdlLCBOVUxMKSA9PSAwKQorCXsKKwkgIC8qIFRoZSBub3JtYWwgZGVmYXVsdCBkZXRhY2ggc3RhdGUgZm9yIHRocmVhZHMgaXMKKwkgICAqIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHdoaWNoIGNhdXNlcyB0aHJlYWRzIHRvIG5vdCBkaWUKKwkgICAqIHdoZW4geW91IHRoaW5rIHRoZXkgc2hvdWxkLiAgKi8KKwkgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfaW5pdCkgKCZfb2JqY190aHJlYWRfYXR0cmlicykgPT0gMAorCSAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSkgKCZfb2JqY190aHJlYWRfYXR0cmlicywKKwkJCQkJICAgICAgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpID09IDApCisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgcmV0dXJuIC0xOworfQorCisvKiBDbG9zZSB0aGUgdGhyZWFkcyBzdWJzeXN0ZW0uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2Nsb3NlX3RocmVhZF9zeXN0ZW0gKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfa2V5X2RlbGV0ZSkgKF9vYmpjX3RocmVhZF9zdG9yYWdlKSA9PSAwCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfZGVzdHJveSkgKCZfb2JqY190aHJlYWRfYXR0cmlicykgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gLTE7Cit9CisKKy8qIEJhY2tlbmQgdGhyZWFkIGZ1bmN0aW9ucyAqLworCisvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIG9mIGV4ZWN1dGlvbi4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9kZXRhY2ggKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCit7CisgIG9iamNfdGhyZWFkX3QgdGhyZWFkX2lkOworICBwdGhyZWFkX3QgbmV3X3RocmVhZF9oYW5kbGU7CisKKyAgaWYgKCFfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCEoX19ndGhyd18ocHRocmVhZF9jcmVhdGUpICgmbmV3X3RocmVhZF9oYW5kbGUsICZfb2JqY190aHJlYWRfYXR0cmlicywKKwkJCQkgICh2b2lkICopIGZ1bmMsIGFyZykpKQorICAgIHRocmVhZF9pZCA9IChvYmpjX3RocmVhZF90KSBuZXdfdGhyZWFkX2hhbmRsZTsKKyAgZWxzZQorICAgIHRocmVhZF9pZCA9IE5VTEw7CisKKyAgcmV0dXJuIHRocmVhZF9pZDsKK30KKworLyogU2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X3ByaW9yaXR5IChpbnQgcHJpb3JpdHkpCit7CisgIGlmICghX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHsKKyNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORworI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworICAgICAgcHRocmVhZF90IHRocmVhZF9pZCA9IF9fZ3RocndfKHB0aHJlYWRfc2VsZikgKCk7CisgICAgICBpbnQgcG9saWN5OworICAgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtczsKKyAgICAgIGludCBwcmlvcml0eV9taW4sIHByaW9yaXR5X21heDsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSkgKHRocmVhZF9pZCwgJnBvbGljeSwgJnBhcmFtcykgPT0gMCkKKwl7CisJICBpZiAoKHByaW9yaXR5X21heCA9IF9fZ3RocndfKHNjaGVkX2dldF9wcmlvcml0eV9tYXgpIChwb2xpY3kpKSA9PSAtMSkKKwkgICAgcmV0dXJuIC0xOworCisJICBpZiAoKHByaW9yaXR5X21pbiA9IF9fZ3RocndfKHNjaGVkX2dldF9wcmlvcml0eV9taW4pIChwb2xpY3kpKSA9PSAtMSkKKwkgICAgcmV0dXJuIC0xOworCisJICBpZiAocHJpb3JpdHkgPiBwcmlvcml0eV9tYXgpCisJICAgIHByaW9yaXR5ID0gcHJpb3JpdHlfbWF4OworCSAgZWxzZSBpZiAocHJpb3JpdHkgPCBwcmlvcml0eV9taW4pCisJICAgIHByaW9yaXR5ID0gcHJpb3JpdHlfbWluOworCSAgcGFyYW1zLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHk7CisKKwkgIC8qCisJICAgKiBUaGUgc29sYXJpcyA3IGFuZCBzZXZlcmFsIG90aGVyIG1hbiBwYWdlcyBpbmNvcnJlY3RseSBzdGF0ZSB0aGF0CisJICAgKiB0aGlzIHNob3VsZCBiZSBhIHBvaW50ZXIgdG8gcG9saWN5IGJ1dCBwdGhyZWFkLmggaXMgdW5pdmVyc2FsbHkKKwkgICAqIGF0IG9kZHMgd2l0aCB0aGlzLgorCSAgICovCisJICBpZiAoX19ndGhyd18ocHRocmVhZF9zZXRzY2hlZHBhcmFtKSAodGhyZWFkX2lkLCBwb2xpY3ksICZwYXJhbXMpID09IDApCisJICAgIHJldHVybiAwOworCX0KKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORyAqLworICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZ2V0X3ByaW9yaXR5ICh2b2lkKQoreworI2lmZGVmIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaW50IHBvbGljeTsKKyAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbXM7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2dldHNjaGVkcGFyYW0pIChfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpLCAmcG9saWN5LCAmcGFyYW1zKSA9PSAwKQorCXJldHVybiBwYXJhbXMuc2NoZWRfcHJpb3JpdHk7CisgICAgICBlbHNlCisJcmV0dXJuIC0xOworICAgIH0KKyAgZWxzZQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisgICAgcmV0dXJuIE9CSkNfVEhSRUFEX0lOVEVSQUNUSVZFX1BSSU9SSVRZOworfQorCisvKiBZaWVsZCBvdXIgcHJvY2VzcyB0aW1lIHRvIGFub3RoZXIgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ndGhyZWFkX29iamNfdGhyZWFkX3lpZWxkICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIF9fZ3RocndfKHNjaGVkX3lpZWxkKSAoKTsKK30KKworLyogVGVybWluYXRlIHRoZSBjdXJyZW50IHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX2V4aXQgKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgLyogZXhpdCB0aGUgdGhyZWFkICovCisgICAgX19ndGhyd18ocHRocmVhZF9leGl0KSAoJl9fb2JqY190aHJlYWRfZXhpdF9zdGF0dXMpOworCisgIC8qIEZhaWxlZCBpZiB3ZSByZWFjaGVkIGhlcmUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBSZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgd2hpY2ggdW5pcXVlbHkgZGVzY3JpYmVzIGEgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgb2JqY190aHJlYWRfdAorX19ndGhyZWFkX29iamNfdGhyZWFkX2lkICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiAob2JqY190aHJlYWRfdCkgX19ndGhyd18ocHRocmVhZF9zZWxmKSAoKTsKKyAgZWxzZQorICAgIHJldHVybiAob2JqY190aHJlYWRfdCkgMTsKK30KKworLyogU2V0cyB0aGUgdGhyZWFkJ3MgbG9jYWwgc3RvcmFnZSBwb2ludGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X2RhdGEgKHZvaWQgKnZhbHVlKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NldHNwZWNpZmljKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UsIHZhbHVlKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHRocmVhZF9sb2NhbF9zdG9yYWdlID0gdmFsdWU7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIFJldHVybnMgdGhlIHRocmVhZCdzIGxvY2FsIHN0b3JhZ2UgcG9pbnRlci4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgKgorX19ndGhyZWFkX29iamNfdGhyZWFkX2dldF9kYXRhICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2dldHNwZWNpZmljKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UpOworICBlbHNlCisgICAgcmV0dXJuIHRocmVhZF9sb2NhbF9zdG9yYWdlOworfQorCisvKiBCYWNrZW5kIG11dGV4IGZ1bmN0aW9ucyAqLworCisvKiBBbGxvY2F0ZSBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9hbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIG11dGV4LT5iYWNrZW5kID0gb2JqY19tYWxsb2MgKHNpemVvZiAocHRocmVhZF9tdXRleF90KSk7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2luaXQpICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kLCBOVUxMKSkKKwl7CisJICBvYmpjX2ZyZWUgKG11dGV4LT5iYWNrZW5kKTsKKwkgIG11dGV4LT5iYWNrZW5kID0gTlVMTDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2RlYWxsb2NhdGUgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBpbnQgY291bnQ7CisKKyAgICAgIC8qCisgICAgICAgKiBQb3NpeCBUaHJlYWRzIHNwZWNpZmljYWxseSByZXF1aXJlIHRoYXQgdGhlIHRocmVhZCBiZSB1bmxvY2tlZAorICAgICAgICogZm9yIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkgdG8gd29yay4KKyAgICAgICAqLworCisgICAgICBkbworCXsKKwkgIGNvdW50ID0gX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKTsKKwkgIGlmIChjb3VudCA8IDApCisJICAgIHJldHVybiAtMTsKKwl9CisgICAgICB3aGlsZSAoY291bnQpOworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9tdXRleF9kZXN0cm95KSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkpCisJcmV0dXJuIC0xOworCisgICAgICBvYmpjX2ZyZWUgKG11dGV4LT5iYWNrZW5kKTsKKyAgICAgIG11dGV4LT5iYWNrZW5kID0gTlVMTDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBHcmFiIGEgbG9jayBvbiBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9sb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpICE9IDApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogVHJ5IHRvIGdyYWIgYSBsb2NrIG9uIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X3RyeWxvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9tdXRleF90cnlsb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBVbmxvY2sgdGhlIG11dGV4ICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfdW5sb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBCYWNrZW5kIGNvbmRpdGlvbiBtdXRleCBmdW5jdGlvbnMgKi8KKworLyogQWxsb2NhdGUgYSBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9hbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgY29uZGl0aW9uLT5iYWNrZW5kID0gb2JqY19tYWxsb2MgKHNpemVvZiAocHRocmVhZF9jb25kX3QpKTsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfY29uZF9pbml0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCwgTlVMTCkpCisJeworCSAgb2JqY19mcmVlIChjb25kaXRpb24tPmJhY2tlbmQpOworCSAgY29uZGl0aW9uLT5iYWNrZW5kID0gTlVMTDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fZGVhbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfY29uZF9kZXN0cm95KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCkpCisJcmV0dXJuIC0xOworCisgICAgICBvYmpjX2ZyZWUgKGNvbmRpdGlvbi0+YmFja2VuZCk7CisgICAgICBjb25kaXRpb24tPmJhY2tlbmQgPSBOVUxMOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl93YWl0IChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiwgb2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfd2FpdCkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQsCisJCQkgICAgICAocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBXYWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9icm9hZGNhc3QgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogV2FrZSB1cCBvbmUgdGhyZWFkIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9zaWduYWwgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfc2lnbmFsKSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UgLyogX0xJQk9CSkMgKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jcmVhdGUgKF9fZ3RocmVhZF90ICpfX3RocmVhZGlkLCB2b2lkICooKl9fZnVuYykgKHZvaWQqKSwKKwkJICB2b2lkICpfX2FyZ3MpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NyZWF0ZSkgKF9fdGhyZWFkaWQsIE5VTEwsIF9fZnVuYywgX19hcmdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9qb2luIChfX2d0aHJlYWRfdCBfX3RocmVhZGlkLCB2b2lkICoqX192YWx1ZV9wdHIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2pvaW4pIChfX3RocmVhZGlkLCBfX3ZhbHVlX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfZGV0YWNoIChfX2d0aHJlYWRfdCBfX3RocmVhZGlkKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9kZXRhY2gpIChfX3RocmVhZGlkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9lcXVhbCAoX19ndGhyZWFkX3QgX190MSwgX19ndGhyZWFkX3QgX190MikKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZXF1YWwpIChfX3QxLCBfX3QyKTsKK30KKworc3RhdGljIGlubGluZSBfX2d0aHJlYWRfdAorX19ndGhyZWFkX3NlbGYgKHZvaWQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3lpZWxkICh2b2lkKQoreworICByZXR1cm4gX19ndGhyd18oc2NoZWRfeWllbGQpICgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29uY2UgKF9fZ3RocmVhZF9vbmNlX3QgKl9fb25jZSwgdm9pZCAoKl9fZnVuYykgKHZvaWQpKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX29uY2UpIChfX29uY2UsIF9fZnVuYyk7CisgIGVsc2UKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfa2V5X2NyZWF0ZSAoX19ndGhyZWFkX2tleV90ICpfX2tleSwgdm9pZCAoKl9fZHRvcikgKHZvaWQgKikpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9jcmVhdGUpIChfX2tleSwgX19kdG9yKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9rZXlfZGVsZXRlIChfX2d0aHJlYWRfa2V5X3QgX19rZXkpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9kZWxldGUpIChfX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfX2d0aHJlYWRfZ2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZ2V0c3BlY2lmaWMpIChfX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfc2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSwgY29uc3Qgdm9pZCAqX19wdHIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NldHNwZWNpZmljKSAoX19rZXksIF9fcHRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2d0aHJlYWRfbXV0ZXhfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgX19ndGhyd18ocHRocmVhZF9tdXRleF9pbml0KSAoX19tdXRleCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfbG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaykgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3RpbWVkbG9jaykgKF9fbXV0ZXgsIF9fYWJzX3RpbWVvdXQpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3VubG9jaykgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiAhZGVmaW5lZCggUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlApIFwKKyAgfHwgZGVmaW5lZChfR1RIUkVBRF9VU0VfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQykKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2luaXRfZnVuY3Rpb24gKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBwdGhyZWFkX211dGV4YXR0cl90IF9fYXR0cjsKKyAgICAgIGludCBfX3I7CisKKyAgICAgIF9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQpICgmX19hdHRyKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpICgmX19hdHRyLAorCQkJCQkJICAgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUpOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleF9pbml0KSAoX19tdXRleCwgJl9fYXR0cik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KSAoJl9fYXR0cik7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfbG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X2xvY2sgKF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdHJ5bG9jayAoX19tdXRleCk7Cit9CisKKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90aW1lZGxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCwKKwkJCQkgICAgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKl9fYWJzX3RpbWVvdXQpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdGltZWRsb2NrIChfX211dGV4LCBfX2Fic190aW1lb3V0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19tdXRleCk7Cit9CisKKyNpZmRlZiBfR1RIUkVBRF9VU0VfQ09ORF9JTklUX0ZVTkMKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ndGhyZWFkX2NvbmRfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIF9fZ3RocndfKHB0aHJlYWRfY29uZF9pbml0KSAoX19jb25kLCBOVUxMKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfYnJvYWRjYXN0IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KSAoX19jb25kKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3NpZ25hbCAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3NpZ25hbCkgKF9fY29uZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF93YWl0IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQsIF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3dhaXQpIChfX2NvbmQsIF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfdGltZWR3YWl0IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQsIF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4LAorCQkJICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3RpbWVkd2FpdCkgKF9fY29uZCwgX19tdXRleCwgX19hYnNfdGltZW91dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF93YWl0X3JlY3Vyc2l2ZSAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kLAorCQkJICAgICAgIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9jb25kX3dhaXQgKF9fY29uZCwgX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF9kZXN0cm95IChfX2d0aHJlYWRfY29uZF90KiBfX2NvbmQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfZGVzdHJveSkgKF9fY29uZCk7Cit9CisKKyNlbmRpZiAvKiBfTElCT0JKQyAqLworCisjZW5kaWYgLyogISBfR0xJQkNYWF9HQ0NfR1RIUl9QT1NJWF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2d0aHItcG9zaXguaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvZ3Roci1wb3NpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzFiMTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2d0aHItcG9zaXguaApAQCAtMCwwICsxLDg4OSBAQAorLyogVGhyZWFkcyBjb21wYXRpYmlsaXR5IHJvdXRpbmVzIGZvciBsaWJnY2MyIGFuZCBsaWJvYmpjLiAgKi8KKy8qIENvbXBpbGUgdGhpcyBvbmUgd2l0aCBnY2MuICAqLworLyogQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0dMSUJDWFhfR0NDX0dUSFJfUE9TSVhfSAorI2RlZmluZSBfR0xJQkNYWF9HQ0NfR1RIUl9QT1NJWF9ICisKKy8qIFBPU0lYIHRocmVhZHMgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisgICBFYXN5LCBzaW5jZSB0aGUgaW50ZXJmYWNlIGlzIGp1c3Qgb25lLXRvLW9uZSBtYXBwaW5nLiAgKi8KKworI2RlZmluZSBfX0dUSFJFQURTIDEKKyNkZWZpbmUgX19HVEhSRUFEU19DWFgwWCAxCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpZiAoKGRlZmluZWQoX0xJQk9CSkMpIHx8IGRlZmluZWQoX0xJQk9CSkNfV0VBSykpIFwKKyAgICAgfHwgIWRlZmluZWQoX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSykpCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpZiBkZWZpbmVkKF9QT1NJWF9USU1FT1VUUykgJiYgX1BPU0lYX1RJTUVPVVRTID49IDAKKyMgIGRlZmluZSBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLIDEKKyMgZWxzZQorIyAgZGVmaW5lIF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0sgMAorIyBlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgcHRocmVhZF90IF9fZ3RocmVhZF90OwordHlwZWRlZiBwdGhyZWFkX2tleV90IF9fZ3RocmVhZF9rZXlfdDsKK3R5cGVkZWYgcHRocmVhZF9vbmNlX3QgX19ndGhyZWFkX29uY2VfdDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IF9fZ3RocmVhZF9tdXRleF90OwordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90OwordHlwZWRlZiBwdGhyZWFkX2NvbmRfdCBfX2d0aHJlYWRfY29uZF90OwordHlwZWRlZiBzdHJ1Y3QgdGltZXNwZWMgX19ndGhyZWFkX3RpbWVfdDsKKworLyogUE9TSVggbGlrZSBjb25kaXRpb25hbCB2YXJpYWJsZXMgYXJlIHN1cHBvcnRlZC4gIFBsZWFzZSBsb29rIGF0IGNvbW1lbnRzCisgICBpbiBndGhyLmggZm9yIGRldGFpbHMuICovCisjZGVmaW5lIF9fR1RIUkVBRF9IQVNfQ09ORAkxCisKKyNkZWZpbmUgX19HVEhSRUFEX01VVEVYX0lOSVQgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgorI2RlZmluZSBfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTiBfX2d0aHJlYWRfbXV0ZXhfaW5pdF9mdW5jdGlvbgorI2RlZmluZSBfX0dUSFJFQURfT05DRV9JTklUIFBUSFJFQURfT05DRV9JTklUCisjaWYgZGVmaW5lZChQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUikKKyNkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSCisjZWxpZiBkZWZpbmVkKFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKQorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKKyNlbHNlCisjZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTiBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2luaXRfZnVuY3Rpb24KKyNlbmRpZgorI2RlZmluZSBfX0dUSFJFQURfQ09ORF9JTklUIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUgorI2RlZmluZSBfX0dUSFJFQURfVElNRV9JTklUIHswLDB9CisKKyNpZmRlZiBfR1RIUkVBRF9VU0VfTVVURVhfSU5JVF9GVU5DCisjIHVuZGVmIF9fR1RIUkVBRF9NVVRFWF9JTklUCisjZW5kaWYKKyNpZmRlZiBfR1RIUkVBRF9VU0VfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQworIyB1bmRlZiBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQKKyMgdW5kZWYgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OCisjIGRlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9pbml0X2Z1bmN0aW9uCisjZW5kaWYKKyNpZmRlZiBfR1RIUkVBRF9VU0VfQ09ORF9JTklUX0ZVTkMKKyMgdW5kZWYgX19HVEhSRUFEX0NPTkRfSU5JVAorIyBkZWZpbmUgX19HVEhSRUFEX0NPTkRfSU5JVF9GVU5DVElPTiBfX2d0aHJlYWRfY29uZF9pbml0X2Z1bmN0aW9uCisjZW5kaWYKKworI2lmIF9fR1hYX1dFQUtfXyAmJiBfR0xJQkNYWF9HVEhSRUFEX1VTRV9XRUFLCisjIGlmbmRlZiBfX2d0aHJ3X3ByYWdtYQorIyAgZGVmaW5lIF9fZ3RocndfcHJhZ21hKHByYWdtYSkKKyMgZW5kaWYKKyMgZGVmaW5lIF9fZ3RocncyKG5hbWUsbmFtZTIsdHlwZSkgXAorICBzdGF0aWMgX190eXBlb2YodHlwZSkgbmFtZSBfX2F0dHJpYnV0ZV9fICgoX193ZWFrcmVmX18oI25hbWUyKSkpOyBcCisgIF9fZ3RocndfcHJhZ21hKHdlYWsgdHlwZSkKKyMgZGVmaW5lIF9fZ3RocndfKG5hbWUpIF9fZ3RocndfICMjIG5hbWUKKyNlbHNlCisjIGRlZmluZSBfX2d0aHJ3MihuYW1lLG5hbWUyLHR5cGUpCisjIGRlZmluZSBfX2d0aHJ3XyhuYW1lKSBuYW1lCisjZW5kaWYKKworLyogVHlwaWNhbGx5LCBfX2d0aHJ3X2ZvbyBpcyBhIHdlYWsgcmVmZXJlbmNlIHRvIHN5bWJvbCBmb28uICAqLworI2RlZmluZSBfX2d0aHJ3KG5hbWUpIF9fZ3RocncyKF9fZ3RocndfICMjIG5hbWUsbmFtZSxuYW1lKQorCitfX2d0aHJ3KHB0aHJlYWRfb25jZSkKK19fZ3RocncocHRocmVhZF9nZXRzcGVjaWZpYykKK19fZ3RocncocHRocmVhZF9zZXRzcGVjaWZpYykKKworX19ndGhydyhwdGhyZWFkX2NyZWF0ZSkKK19fZ3RocncocHRocmVhZF9qb2luKQorX19ndGhydyhwdGhyZWFkX2VxdWFsKQorX19ndGhydyhwdGhyZWFkX3NlbGYpCitfX2d0aHJ3KHB0aHJlYWRfZGV0YWNoKQorI2lmbmRlZiBfX0JJT05JQ19fCitfX2d0aHJ3KHB0aHJlYWRfY2FuY2VsKQorI2VuZGlmCitfX2d0aHJ3KHNjaGVkX3lpZWxkKQorCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfbG9jaykKK19fZ3RocncocHRocmVhZF9tdXRleF90cnlsb2NrKQorI2lmIF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0sKK19fZ3RocncocHRocmVhZF9tdXRleF90aW1lZGxvY2spCisjZW5kaWYKK19fZ3RocncocHRocmVhZF9tdXRleF91bmxvY2spCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfaW5pdCkKK19fZ3RocncocHRocmVhZF9tdXRleF9kZXN0cm95KQorCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9pbml0KQorX19ndGhydyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KQorX19ndGhydyhwdGhyZWFkX2NvbmRfc2lnbmFsKQorX19ndGhydyhwdGhyZWFkX2NvbmRfd2FpdCkKK19fZ3RocncocHRocmVhZF9jb25kX3RpbWVkd2FpdCkKK19fZ3RocncocHRocmVhZF9jb25kX2Rlc3Ryb3kpCisKK19fZ3RocncocHRocmVhZF9rZXlfY3JlYXRlKQorX19ndGhydyhwdGhyZWFkX2tleV9kZWxldGUpCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQpCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpCisKKworI2lmIGRlZmluZWQoX0xJQk9CSkMpIHx8IGRlZmluZWQoX0xJQk9CSkNfV0VBSykKKy8qIE9iamVjdGl2ZS1DLiAgKi8KK19fZ3RocncocHRocmVhZF9leGl0KQorI2lmZGVmIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCitfX2d0aHJ3KHNjaGVkX2dldF9wcmlvcml0eV9tYXgpCitfX2d0aHJ3KHNjaGVkX2dldF9wcmlvcml0eV9taW4pCisjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisjZW5kaWYgLyogX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KK19fZ3RocncocHRocmVhZF9hdHRyX2Rlc3Ryb3kpCitfX2d0aHJ3KHB0aHJlYWRfYXR0cl9pbml0KQorX19ndGhydyhwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUpCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCitfX2d0aHJ3KHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSkKK19fZ3RocncocHRocmVhZF9zZXRzY2hlZHBhcmFtKQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9MSUJPQkpDIHx8IF9MSUJPQkpDX1dFQUsgKi8KKworI2lmIF9fR1hYX1dFQUtfXyAmJiBfR0xJQkNYWF9HVEhSRUFEX1VTRV9XRUFLCisKKy8qIE9uIFNvbGFyaXMgMi42IHVwIHRvIDksIHRoZSBsaWJjIGV4cG9zZXMgYSBQT1NJWCB0aHJlYWRzIGludGVyZmFjZSBldmVuIGlmCisgICAtcHRocmVhZHMgaXMgbm90IHNwZWNpZmllZC4gIFRoZSBmdW5jdGlvbnMgYXJlIGR1bW1pZXMgYW5kIG1vc3QgcmV0dXJuIGFuCisgICBlcnJvciB2YWx1ZS4gIEhvd2V2ZXIgcHRocmVhZF9vbmNlIHJldHVybnMgMCB3aXRob3V0IGludm9raW5nIHRoZSByb3V0aW5lCisgICBpdCBpcyBwYXNzZWQgc28gd2UgY2Fubm90IHByZXRlbmQgdGhhdCB0aGUgaW50ZXJmYWNlIGlzIGFjdGl2ZSBpZiAtcHRocmVhZHMKKyAgIGlzIG5vdCBzcGVjaWZpZWQuICBPbiBTb2xhcmlzIDIuNS4xLCB0aGUgaW50ZXJmYWNlIGlzIG5vdCBleHBvc2VkIGF0IGFsbCBzbworICAgd2UgbmVlZCB0byBwbGF5IHRoZSB1c3VhbCBnYW1lIHdpdGggd2VhayBzeW1ib2xzLiAgT24gU29sYXJpcyAxMCBhbmQgdXAsIGEKKyAgIHdvcmtpbmcgaW50ZXJmYWNlIGlzIGFsd2F5cyBleHBvc2VkLiAgT24gRnJlZUJTRCA2IGFuZCBsYXRlciwgbGliYyBhbHNvCisgICBleHBvc2VzIGEgZHVtbXkgUE9TSVggdGhyZWFkcyBpbnRlcmZhY2UsIHNpbWlsYXIgdG8gd2hhdCBTb2xhcmlzIDIuNiB1cAorICAgdG8gOSBkb2VzLiAgRnJlZUJTRCA+PSA3MDAwMTQgZXZlbiBwcm92aWRlcyBhIHB0aHJlYWRfY2FuY2VsIHN0dWIgaW4gbGliYywKKyAgIHdoaWNoIG1lYW5zIHRoZSBhbHRlcm5hdGUgX19ndGhyZWFkX2FjdGl2ZV9wIGJlbG93IGNhbm5vdCBiZSB1c2VkIHRoZXJlLiAgKi8KKworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IChkZWZpbmVkKF9fc3VuKSAmJiBkZWZpbmVkKF9fc3ZyNF9fKSkKKworc3RhdGljIHZvbGF0aWxlIGludCBfX2d0aHJlYWRfYWN0aXZlID0gLTE7CisKK3N0YXRpYyB2b2lkCitfX2d0aHJlYWRfdHJpZ2dlciAodm9pZCkKK3sKKyAgX19ndGhyZWFkX2FjdGl2ZSA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfYWN0aXZlX3AgKHZvaWQpCit7CisgIHN0YXRpYyBwdGhyZWFkX211dGV4X3QgX19ndGhyZWFkX2FjdGl2ZV9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCBfX2d0aHJlYWRfYWN0aXZlX29uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKworICAvKiBBdm9pZCByZWFkaW5nIF9fZ3RocmVhZF9hY3RpdmUgdHdpY2Ugb24gdGhlIG1haW4gY29kZSBwYXRoLiAgKi8KKyAgaW50IF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKworICAvKiBUaGlzIHRlc3QgaXMgbm90IHByb3RlY3RlZCB0byBhdm9pZCB0YWtpbmcgYSBsb2NrIG9uIHRoZSBtYWluIGNvZGUKKyAgICAgcGF0aCBzbyBldmVyeSB1cGRhdGUgb2YgX19ndGhyZWFkX2FjdGl2ZSBpbiBhIHRocmVhZGVkIHByb2dyYW0gbXVzdAorICAgICBiZSBhdG9taWMgd2l0aCByZWdhcmQgdG8gdGhlIHJlc3VsdCBvZiB0aGUgdGVzdC4gICovCisgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA8IDAsIDApKQorICAgIHsKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX29uY2UpKQorCXsKKwkgIC8qIElmIHRoaXMgcmVhbGx5IGlzIGEgdGhyZWFkZWQgcHJvZ3JhbSwgdGhlbiB3ZSBtdXN0IGVuc3VyZSB0aGF0CisJICAgICBfX2d0aHJlYWRfYWN0aXZlIGhhcyBiZWVuIHNldCB0byAxIGJlZm9yZSBleGl0aW5nIHRoaXMgYmxvY2suICAqLworCSAgX19ndGhyd18ocHRocmVhZF9tdXRleF9sb2NrKSAoJl9fZ3RocmVhZF9hY3RpdmVfbXV0ZXgpOworCSAgX19ndGhyd18ocHRocmVhZF9vbmNlKSAoJl9fZ3RocmVhZF9hY3RpdmVfb25jZSwgX19ndGhyZWFkX3RyaWdnZXIpOworCSAgX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spICgmX19ndGhyZWFkX2FjdGl2ZV9tdXRleCk7CisJfQorCisgICAgICAvKiBNYWtlIHN1cmUgd2UnbGwgbmV2ZXIgZW50ZXIgdGhpcyBibG9jayBhZ2Fpbi4gICovCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZSA8IDApCisJX19ndGhyZWFkX2FjdGl2ZSA9IDA7CisKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgICB9CisKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlICE9IDA7Cit9CisKKyNlbHNlIC8qIG5laXRoZXIgRnJlZUJTRCBub3IgU29sYXJpcyAqLworCisvKiBGb3IgYSBwcm9ncmFtIHRvIGJlIG11bHRpLXRocmVhZGVkIHRoZSBvbmx5IHRoaW5nIHRoYXQgaXQgY2VydGFpbmx5IG11c3QKKyAgIGJlIHVzaW5nIGlzIHB0aHJlYWRfY3JlYXRlLiAgSG93ZXZlciwgdGhlcmUgbWF5IGJlIG90aGVyIGxpYnJhcmllcyB0aGF0CisgICBpbnRlcmNlcHQgcHRocmVhZF9jcmVhdGUgd2l0aCB0aGVpciBvd24gZGVmaW5pdGlvbnMgdG8gd3JhcCBwdGhyZWFkcworICAgZnVuY3Rpb25hbGl0eSBmb3Igc29tZSBwdXJwb3NlLiAgSW4gdGhvc2UgY2FzZXMsIHB0aHJlYWRfY3JlYXRlIGJlaW5nCisgICBkZWZpbmVkIG1pZ2h0IG5vdCBuZWNlc3NhcmlseSBtZWFuIHRoYXQgbGlicHRocmVhZCBpcyBhY3R1YWxseSBsaW5rZWQKKyAgIGluLgorCisgICBGb3IgdGhlIEdOVSBDIGxpYnJhcnksIHdlIGNhbiB1c2UgYSBrbm93biBpbnRlcm5hbCBuYW1lLiAgVGhpcyBpcyBhbHdheXMKKyAgIGF2YWlsYWJsZSBpbiB0aGUgQUJJLCBidXQgbm8gb3RoZXIgbGlicmFyeSB3b3VsZCBkZWZpbmUgaXQuICBUaGF0IGlzCisgICBpZGVhbCwgc2luY2UgYW55IHB1YmxpYyBwdGhyZWFkIGZ1bmN0aW9uIG1pZ2h0IGJlIGludGVyY2VwdGVkIGp1c3QgYXMKKyAgIHB0aHJlYWRfY3JlYXRlIG1pZ2h0IGJlLiAgX19wdGhyZWFkX2tleV9jcmVhdGUgaXMgYW4gImludGVybmFsIgorICAgaW1wbGVtZW50YXRpb24gc3ltYm9sLCBidXQgaXQgaXMgcGFydCBvZiB0aGUgcHVibGljIGV4cG9ydGVkIEFCSS4gIEFsc28sCisgICBpdCdzIGFtb25nIHRoZSBzeW1ib2xzIHRoYXQgdGhlIHN0YXRpYyBsaWJwdGhyZWFkLmEgYWx3YXlzIGxpbmtzIGluCisgICB3aGVuZXZlciBwdGhyZWFkX2NyZWF0ZSBpcyB1c2VkLCBzbyB0aGVyZSBpcyBubyBkYW5nZXIgb2YgYSBmYWxzZQorICAgbmVnYXRpdmUgcmVzdWx0IGluIGFueSBzdGF0aWNhbGx5LWxpbmtlZCwgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbS4KKworICAgRm9yIG90aGVycywgd2UgY2hvb3NlIHB0aHJlYWRfY2FuY2VsIGFzIGEgZnVuY3Rpb24gdGhhdCBzZWVtcyB1bmxpa2VseQorICAgdG8gYmUgcmVkZWZpbmVkIGJ5IGFuIGludGVyY2VwdG9yIGxpYnJhcnkuICBUaGUgYmlvbmljIChBbmRyb2lkKSBDCisgICBsaWJyYXJ5IGRvZXMgbm90IHByb3ZpZGUgcHRocmVhZF9jYW5jZWwsIHNvIHdlIGRvIHVzZSBwdGhyZWFkX2NyZWF0ZQorICAgdGhlcmUgKGFuZCBpbnRlcmNlcHRvciBsaWJyYXJpZXMgbG9zZSkuICAqLworCisjaWZkZWYgX19HTElCQ19fCitfX2d0aHJ3MihfX2d0aHJ3XyhfX3B0aHJlYWRfa2V5X2NyZWF0ZSksCisJIF9fcHRocmVhZF9rZXlfY3JlYXRlLAorCSBwdGhyZWFkX2tleV9jcmVhdGUpCisjIGRlZmluZSBHVEhSX0FDVElWRV9QUk9YWQlfX2d0aHJ3XyhfX3B0aHJlYWRfa2V5X2NyZWF0ZSkKKyNlbGlmIGRlZmluZWQgKF9fQklPTklDX18pCisjIGRlZmluZSBHVEhSX0FDVElWRV9QUk9YWQlfX2d0aHJ3XyhwdGhyZWFkX2NyZWF0ZSkKKyNlbHNlCisjIGRlZmluZSBHVEhSX0FDVElWRV9QUk9YWQlfX2d0aHJ3XyhwdGhyZWFkX2NhbmNlbCkKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICBzdGF0aWMgdm9pZCAqY29uc3QgX19ndGhyZWFkX2FjdGl2ZV9wdHIKKyAgICA9IF9fZXh0ZW5zaW9uX18gKHZvaWQgKikgJkdUSFJfQUNUSVZFX1BST1hZOworICByZXR1cm4gX19ndGhyZWFkX2FjdGl2ZV9wdHIgIT0gMDsKK30KKworI2VuZGlmIC8qIEZyZWVCU0Qgb3IgU29sYXJpcyAqLworCisjZWxzZSAvKiBub3QgX19HWFhfV0VBS19fICovCisKKy8qIFNpbWlsYXIgdG8gU29sYXJpcywgSFAtVVggMTEgZm9yIFBBLVJJU0MgcHJvdmlkZXMgc3R1YnMgZm9yIHB0aHJlYWQKKyAgIGNhbGxzIGluIHNoYXJlZCBmbGF2b3JzIG9mIHRoZSBIUC1VWCBDIGxpYnJhcnkuICBNb3N0IG9mIHRoZSBzdHVicworICAgaGF2ZSBubyBmdW5jdGlvbmFsaXR5LiAgVGhlIGRldGFpbHMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgImxpYmMgY3VtdWxhdGl2ZQorICAgcGF0Y2giIGZvciBlYWNoIHN1YnZlcnNpb24gb2YgSFAtVVggMTEuICBUaGVyZSBhcmUgdHdvIHNwZWNpYWwgaW50ZXJmYWNlcworICAgcHJvdmlkZWQgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gYXBwbGljYXRpb24gaXMgbGlua2VkIHRvIGEgc2hhcmVkIHB0aHJlYWQKKyAgIGxpYnJhcnkgb3Igbm90LiAgSG93ZXZlciwgdGhlc2UgaW50ZXJmYWNlcyBhcmVuJ3QgYXZhaWxhYmxlIGluIGVhcmx5CisgICBsaWJwdGhyZWFkIGxpYnJhcmllcy4gIFdlIGFsc28gbmVlZCBhIHRlc3QgdGhhdCB3b3JrcyBmb3IgYXJjaGl2ZQorICAgbGlicmFyaWVzLiAgV2UgY2FuJ3QgdXNlIHB0aHJlYWRfb25jZSBhcyBzb21lIGxpYmMgdmVyc2lvbnMgY2FsbCB0aGUKKyAgIGluaXQgZnVuY3Rpb24uICBXZSBhbHNvIGNhbid0IHVzZSBwdGhyZWFkX2NyZWF0ZSBvciBwdGhyZWFkX2F0dHJfaW5pdAorICAgYXMgdGhlc2UgY3JlYXRlIGEgdGhyZWFkIGFuZCB0aGVyZWJ5IHByZXZlbnQgY2hhbmdpbmcgdGhlIGRlZmF1bHQgc3RhY2sKKyAgIHNpemUuICBUaGUgZnVuY3Rpb24gcHRocmVhZF9kZWZhdWx0X3N0YWNrc2l6ZV9ucCBpcyBhdmFpbGFibGUgaW4gYm90aAorICAgdGhlIGFyY2hpdmUgYW5kIHNoYXJlZCB2ZXJzaW9ucyBvZiBsaWJwdGhyZWFkLiAgIEl0IGNhbiBiZSB1c2VkIHRvCisgICBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgcHRocmVhZCBzdGFjayBzaXplLiAgVGhlcmUgaXMgYSBzdHViIGluIHNvbWUKKyAgIHNoYXJlZCBsaWJjIHZlcnNpb25zIHdoaWNoIHJldHVybnMgYSB6ZXJvIHNpemUgaWYgcHRocmVhZHMgYXJlIG5vdAorICAgYWN0aXZlLiAgV2UgcHJvdmlkZSBhbiBlcXVpdmFsZW50IHN0dWIgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIGxpYmMKKyAgIGRvZXNuJ3QgcHJvdmlkZSBvbmUuICAqLworCisjaWYgZGVmaW5lZChfX2hwcGFfXykgJiYgZGVmaW5lZChfX2hwdXhfXykKKworc3RhdGljIHZvbGF0aWxlIGludCBfX2d0aHJlYWRfYWN0aXZlID0gLTE7CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfYWN0aXZlX3AgKHZvaWQpCit7CisgIC8qIEF2b2lkIHJlYWRpbmcgX19ndGhyZWFkX2FjdGl2ZSB0d2ljZSBvbiB0aGUgbWFpbiBjb2RlIHBhdGguICAqLworICBpbnQgX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPSBfX2d0aHJlYWRfYWN0aXZlOworICBzaXplX3QgX19zOworCisgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA8IDAsIDApKQorICAgIHsKKyAgICAgIHB0aHJlYWRfZGVmYXVsdF9zdGFja3NpemVfbnAgKDAsICZfX3MpOworICAgICAgX19ndGhyZWFkX2FjdGl2ZSA9IF9fcyA/IDEgOiAwOworICAgICAgX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPSBfX2d0aHJlYWRfYWN0aXZlOworICAgIH0KKworICByZXR1cm4gX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgIT0gMDsKK30KKworI2Vsc2UgLyogbm90IGhwcGEtaHB1eCAqLworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICByZXR1cm4gMTsKK30KKworI2VuZGlmIC8qIGhwcGEtaHB1eCAqLworCisjZW5kaWYgLyogX19HWFhfV0VBS19fICovCisKKyNpZmRlZiBfTElCT0JKQworCisvKiBUaGlzIGlzIHRoZSBjb25maWcuaCBmaWxlIGluIGxpYm9iamMvICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBIQVZFX1NDSEVEX0gKKyMgaW5jbHVkZSA8c2NoZWQuaD4KKyNlbmRpZgorCisvKiBLZXkgc3RydWN0dXJlIGZvciBtYWludGFpbmluZyB0aHJlYWQgc3BlY2lmaWMgc3RvcmFnZSAqLworc3RhdGljIHB0aHJlYWRfa2V5X3QgX29iamNfdGhyZWFkX3N0b3JhZ2U7CitzdGF0aWMgcHRocmVhZF9hdHRyX3QgX29iamNfdGhyZWFkX2F0dHJpYnM7CisKKy8qIFRocmVhZCBsb2NhbCBzdG9yYWdlIGZvciBhIHNpbmdsZSB0aHJlYWQgKi8KK3N0YXRpYyB2b2lkICp0aHJlYWRfbG9jYWxfc3RvcmFnZSA9IE5VTEw7CisKKy8qIEJhY2tlbmQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICovCisKKy8qIEluaXRpYWxpemUgdGhlIHRocmVhZHMgc3Vic3lzdGVtLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19pbml0X3RocmVhZF9zeXN0ZW0gKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgdGhyZWFkIHN0b3JhZ2Uga2V5LiAgKi8KKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2tleV9jcmVhdGUpICgmX29iamNfdGhyZWFkX3N0b3JhZ2UsIE5VTEwpID09IDApCisJeworCSAgLyogVGhlIG5vcm1hbCBkZWZhdWx0IGRldGFjaCBzdGF0ZSBmb3IgdGhyZWFkcyBpcworCSAgICogUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgd2hpY2ggY2F1c2VzIHRocmVhZHMgdG8gbm90IGRpZQorCSAgICogd2hlbiB5b3UgdGhpbmsgdGhleSBzaG91bGQuICAqLworCSAgaWYgKF9fZ3RocndfKHB0aHJlYWRfYXR0cl9pbml0KSAoJl9vYmpjX3RocmVhZF9hdHRyaWJzKSA9PSAwCisJICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKSAoJl9vYmpjX3RocmVhZF9hdHRyaWJzLAorCQkJCQkgICAgICBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCkgPT0gMCkKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICByZXR1cm4gLTE7Cit9CisKKy8qIENsb3NlIHRoZSB0aHJlYWRzIHN1YnN5c3RlbS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY2xvc2VfdGhyZWFkX3N5c3RlbSAodm9pZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9rZXlfZGVsZXRlKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UpID09IDAKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfYXR0cl9kZXN0cm95KSAoJl9vYmpjX3RocmVhZF9hdHRyaWJzKSA9PSAwKQorICAgIHJldHVybiAwOworCisgIHJldHVybiAtMTsKK30KKworLyogQmFja2VuZCB0aHJlYWQgZnVuY3Rpb25zICovCisKKy8qIENyZWF0ZSBhIG5ldyB0aHJlYWQgb2YgZXhlY3V0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgb2JqY190aHJlYWRfdAorX19ndGhyZWFkX29iamNfdGhyZWFkX2RldGFjaCAodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKyAgb2JqY190aHJlYWRfdCB0aHJlYWRfaWQ7CisgIHB0aHJlYWRfdCBuZXdfdGhyZWFkX2hhbmRsZTsKKworICBpZiAoIV9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIShfX2d0aHJ3XyhwdGhyZWFkX2NyZWF0ZSkgKCZuZXdfdGhyZWFkX2hhbmRsZSwgJl9vYmpjX3RocmVhZF9hdHRyaWJzLAorCQkJCSAgKHZvaWQgKikgZnVuYywgYXJnKSkpCisgICAgdGhyZWFkX2lkID0gKG9iamNfdGhyZWFkX3QpIG5ld190aHJlYWRfaGFuZGxlOworICBlbHNlCisgICAgdGhyZWFkX2lkID0gTlVMTDsKKworICByZXR1cm4gdGhyZWFkX2lkOworfQorCisvKiBTZXQgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgcHJpb3JpdHkuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9zZXRfcHJpb3JpdHkgKGludCBwcmlvcml0eSkKK3sKKyAgaWYgKCFfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIC0xOworICBlbHNlCisgICAgeworI2lmZGVmIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCisgICAgICBwdGhyZWFkX3QgdGhyZWFkX2lkID0gX19ndGhyd18ocHRocmVhZF9zZWxmKSAoKTsKKyAgICAgIGludCBwb2xpY3k7CisgICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW1zOworICAgICAgaW50IHByaW9yaXR5X21pbiwgcHJpb3JpdHlfbWF4OworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9nZXRzY2hlZHBhcmFtKSAodGhyZWFkX2lkLCAmcG9saWN5LCAmcGFyYW1zKSA9PSAwKQorCXsKKwkgIGlmICgocHJpb3JpdHlfbWF4ID0gX19ndGhyd18oc2NoZWRfZ2V0X3ByaW9yaXR5X21heCkgKHBvbGljeSkpID09IC0xKQorCSAgICByZXR1cm4gLTE7CisKKwkgIGlmICgocHJpb3JpdHlfbWluID0gX19ndGhyd18oc2NoZWRfZ2V0X3ByaW9yaXR5X21pbikgKHBvbGljeSkpID09IC0xKQorCSAgICByZXR1cm4gLTE7CisKKwkgIGlmIChwcmlvcml0eSA+IHByaW9yaXR5X21heCkKKwkgICAgcHJpb3JpdHkgPSBwcmlvcml0eV9tYXg7CisJICBlbHNlIGlmIChwcmlvcml0eSA8IHByaW9yaXR5X21pbikKKwkgICAgcHJpb3JpdHkgPSBwcmlvcml0eV9taW47CisJICBwYXJhbXMuc2NoZWRfcHJpb3JpdHkgPSBwcmlvcml0eTsKKworCSAgLyoKKwkgICAqIFRoZSBzb2xhcmlzIDcgYW5kIHNldmVyYWwgb3RoZXIgbWFuIHBhZ2VzIGluY29ycmVjdGx5IHN0YXRlIHRoYXQKKwkgICAqIHRoaXMgc2hvdWxkIGJlIGEgcG9pbnRlciB0byBwb2xpY3kgYnV0IHB0aHJlYWQuaCBpcyB1bml2ZXJzYWxseQorCSAgICogYXQgb2RkcyB3aXRoIHRoaXMuCisJICAgKi8KKwkgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX3NldHNjaGVkcGFyYW0pICh0aHJlYWRfaWQsIHBvbGljeSwgJnBhcmFtcykgPT0gMCkKKwkgICAgcmV0dXJuIDA7CisJfQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkJ3MgcHJpb3JpdHkuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9nZXRfcHJpb3JpdHkgKHZvaWQpCit7CisjaWZkZWYgX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyNpZmRlZiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBpbnQgcG9saWN5OworICAgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtczsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSkgKF9fZ3RocndfKHB0aHJlYWRfc2VsZikgKCksICZwb2xpY3ksICZwYXJhbXMpID09IDApCisJcmV0dXJuIHBhcmFtcy5zY2hlZF9wcmlvcml0eTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gLTE7CisgICAgfQorICBlbHNlCisjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisjZW5kaWYgLyogX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyAgICByZXR1cm4gT0JKQ19USFJFQURfSU5URVJBQ1RJVkVfUFJJT1JJVFk7Cit9CisKKy8qIFlpZWxkIG91ciBwcm9jZXNzIHRpbWUgdG8gYW5vdGhlciB0aHJlYWQuICAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2d0aHJlYWRfb2JqY190aHJlYWRfeWllbGQgKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgX19ndGhyd18oc2NoZWRfeWllbGQpICgpOworfQorCisvKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZXhpdCAodm9pZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICAvKiBleGl0IHRoZSB0aHJlYWQgKi8KKyAgICBfX2d0aHJ3XyhwdGhyZWFkX2V4aXQpICgmX19vYmpjX3RocmVhZF9leGl0X3N0YXR1cyk7CisKKyAgLyogRmFpbGVkIGlmIHdlIHJlYWNoZWQgaGVyZSAqLworICByZXR1cm4gLTE7Cit9CisKKy8qIFJldHVybnMgYW4gaW50ZWdlciB2YWx1ZSB3aGljaCB1bmlxdWVseSBkZXNjcmliZXMgYSB0aHJlYWQuICAqLworc3RhdGljIGlubGluZSBvYmpjX3RocmVhZF90CitfX2d0aHJlYWRfb2JqY190aHJlYWRfaWQgKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIChvYmpjX3RocmVhZF90KSBfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpOworICBlbHNlCisgICAgcmV0dXJuIChvYmpjX3RocmVhZF90KSAxOworfQorCisvKiBTZXRzIHRoZSB0aHJlYWQncyBsb2NhbCBzdG9yYWdlIHBvaW50ZXIuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9zZXRfZGF0YSAodm9pZCAqdmFsdWUpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfc2V0c3BlY2lmaWMpIChfb2JqY190aHJlYWRfc3RvcmFnZSwgdmFsdWUpOworICBlbHNlCisgICAgeworICAgICAgdGhyZWFkX2xvY2FsX3N0b3JhZ2UgPSB2YWx1ZTsKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogUmV0dXJucyB0aGUgdGhyZWFkJ3MgbG9jYWwgc3RvcmFnZSBwb2ludGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfX2d0aHJlYWRfb2JqY190aHJlYWRfZ2V0X2RhdGEgKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZ2V0c3BlY2lmaWMpIChfb2JqY190aHJlYWRfc3RvcmFnZSk7CisgIGVsc2UKKyAgICByZXR1cm4gdGhyZWFkX2xvY2FsX3N0b3JhZ2U7Cit9CisKKy8qIEJhY2tlbmQgbXV0ZXggZnVuY3Rpb25zICovCisKKy8qIEFsbG9jYXRlIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2FsbG9jYXRlIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgbXV0ZXgtPmJhY2tlbmQgPSBvYmpjX21hbGxvYyAoc2l6ZW9mIChwdGhyZWFkX211dGV4X3QpKTsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfaW5pdCkgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQsIE5VTEwpKQorCXsKKwkgIG9iamNfZnJlZSAobXV0ZXgtPmJhY2tlbmQpOworCSAgbXV0ZXgtPmJhY2tlbmQgPSBOVUxMOworCSAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlYWxsb2NhdGUgYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfZGVhbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIGludCBjb3VudDsKKworICAgICAgLyoKKyAgICAgICAqIFBvc2l4IFRocmVhZHMgc3BlY2lmaWNhbGx5IHJlcXVpcmUgdGhhdCB0aGUgdGhyZWFkIGJlIHVubG9ja2VkCisgICAgICAgKiBmb3IgX19ndGhyd18ocHRocmVhZF9tdXRleF9kZXN0cm95KSB0byB3b3JrLgorICAgICAgICovCisKKyAgICAgIGRvCisJeworCSAgY291bnQgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3VubG9jaykgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpOworCSAgaWYgKGNvdW50IDwgMCkKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICAgIHdoaWxlIChjb3VudCk7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2Rlc3Ryb3kpICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKSkKKwlyZXR1cm4gLTE7CisKKyAgICAgIG9iamNfZnJlZSAobXV0ZXgtPmJhY2tlbmQpOworICAgICAgbXV0ZXgtPmJhY2tlbmQgPSBOVUxMOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEdyYWIgYSBsb2NrIG9uIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2xvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9tdXRleF9sb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBUcnkgdG8gZ3JhYiBhIGxvY2sgb24gYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfdHJ5bG9jayAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3RyeWxvY2spICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKSAhPSAwKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFVubG9jayB0aGUgbXV0ZXggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF91bmxvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKSAhPSAwKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEJhY2tlbmQgY29uZGl0aW9uIG11dGV4IGZ1bmN0aW9ucyAqLworCisvKiBBbGxvY2F0ZSBhIGNvbmRpdGlvbi4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX2FsbG9jYXRlIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbikKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBjb25kaXRpb24tPmJhY2tlbmQgPSBvYmpjX21hbGxvYyAoc2l6ZW9mIChwdGhyZWFkX2NvbmRfdCkpOworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9jb25kX2luaXQpICgocHRocmVhZF9jb25kX3QgKikgY29uZGl0aW9uLT5iYWNrZW5kLCBOVUxMKSkKKwl7CisJICBvYmpjX2ZyZWUgKGNvbmRpdGlvbi0+YmFja2VuZCk7CisJICBjb25kaXRpb24tPmJhY2tlbmQgPSBOVUxMOworCSAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlYWxsb2NhdGUgYSBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9kZWFsbG9jYXRlIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbikKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9jb25kX2Rlc3Ryb3kpICgocHRocmVhZF9jb25kX3QgKikgY29uZGl0aW9uLT5iYWNrZW5kKSkKKwlyZXR1cm4gLTE7CisKKyAgICAgIG9iamNfZnJlZSAoY29uZGl0aW9uLT5iYWNrZW5kKTsKKyAgICAgIGNvbmRpdGlvbi0+YmFja2VuZCA9IE5VTEw7CisgICAgfQorICByZXR1cm4gMDsKK30KKworLyogV2FpdCBvbiB0aGUgY29uZGl0aW9uICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX3dhaXQgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uLCBvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF93YWl0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCwKKwkJCSAgICAgIChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFdha2UgdXAgYWxsIHRocmVhZHMgd2FpdGluZyBvbiB0aGlzIGNvbmRpdGlvbi4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX2Jyb2FkY2FzdCAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF9icm9hZGNhc3QpICgocHRocmVhZF9jb25kX3QgKikgY29uZGl0aW9uLT5iYWNrZW5kKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBXYWtlIHVwIG9uZSB0aHJlYWQgd2FpdGluZyBvbiB0aGlzIGNvbmRpdGlvbi4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX3NpZ25hbCAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF9zaWduYWwpICgocHRocmVhZF9jb25kX3QgKikgY29uZGl0aW9uLT5iYWNrZW5kKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisjZWxzZSAvKiBfTElCT0JKQyAqLworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NyZWF0ZSAoX19ndGhyZWFkX3QgKl9fdGhyZWFkaWQsIHZvaWQgKigqX19mdW5jKSAodm9pZCopLAorCQkgIHZvaWQgKl9fYXJncykKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY3JlYXRlKSAoX190aHJlYWRpZCwgTlVMTCwgX19mdW5jLCBfX2FyZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2pvaW4gKF9fZ3RocmVhZF90IF9fdGhyZWFkaWQsIHZvaWQgKipfX3ZhbHVlX3B0cikKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfam9pbikgKF9fdGhyZWFkaWQsIF9fdmFsdWVfcHRyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9kZXRhY2ggKF9fZ3RocmVhZF90IF9fdGhyZWFkaWQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2RldGFjaCkgKF9fdGhyZWFkaWQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2VxdWFsIChfX2d0aHJlYWRfdCBfX3QxLCBfX2d0aHJlYWRfdCBfX3QyKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9lcXVhbCkgKF9fdDEsIF9fdDIpOworfQorCitzdGF0aWMgaW5saW5lIF9fZ3RocmVhZF90CitfX2d0aHJlYWRfc2VsZiAodm9pZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfc2VsZikgKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfeWllbGQgKHZvaWQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhzY2hlZF95aWVsZCkgKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb25jZSAoX19ndGhyZWFkX29uY2VfdCAqX19vbmNlLCB2b2lkICgqX19mdW5jKSAodm9pZCkpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfb25jZSkgKF9fb25jZSwgX19mdW5jKTsKKyAgZWxzZQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9rZXlfY3JlYXRlIChfX2d0aHJlYWRfa2V5X3QgKl9fa2V5LCB2b2lkICgqX19kdG9yKSAodm9pZCAqKSkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfa2V5X2NyZWF0ZSkgKF9fa2V5LCBfX2R0b3IpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2tleV9kZWxldGUgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfa2V5X2RlbGV0ZSkgKF9fa2V5KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICoKK19fZ3RocmVhZF9nZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90IF9fa2V5KQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9nZXRzcGVjaWZpYykgKF9fa2V5KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9zZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90IF9fa2V5LCBjb25zdCB2b2lkICpfX3B0cikKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfc2V0c3BlY2lmaWMpIChfX2tleSwgX19wdHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fZ3RocmVhZF9tdXRleF9pbml0X2Z1bmN0aW9uIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2luaXQpIChfX211dGV4LCBOVUxMKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF9kZXN0cm95KSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF9sb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF90cnlsb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2lmIF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0sKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdGltZWRsb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCwKKwkJCSAgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKl9fYWJzX3RpbWVvdXQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKSAoX19tdXRleCwgX19hYnNfdGltZW91dCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3VubG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2lmICFkZWZpbmVkKCBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkgXAorICB8fCBkZWZpbmVkKF9HVEhSRUFEX1VTRV9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DKQorc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgX19hdHRyOworICAgICAgaW50IF9fcjsKKworICAgICAgX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleGF0dHJfaW5pdCkgKCZfX2F0dHIpOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSkgKCZfX2F0dHIsCisJCQkJCQkgICBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2luaXQpIChfX211dGV4LCAmX19hdHRyKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpICgmX19hdHRyKTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfbG9jayAoX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RyeWxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF90cnlsb2NrIChfX211dGV4KTsKK30KKworI2lmIF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0sKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4LAorCQkJCSAgICAgY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqX19hYnNfdGltZW91dCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF90aW1lZGxvY2sgKF9fbXV0ZXgsIF9fYWJzX3RpbWVvdXQpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3VubG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X3VubG9jayAoX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2Rlc3Ryb3kgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF9kZXN0cm95IChfX211dGV4KTsKK30KKworI2lmZGVmIF9HVEhSRUFEX1VTRV9DT05EX0lOSVRfRlVOQworc3RhdGljIGlubGluZSB2b2lkCitfX2d0aHJlYWRfY29uZF9pbml0X2Z1bmN0aW9uIChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgX19ndGhyd18ocHRocmVhZF9jb25kX2luaXQpIChfX2NvbmQsIE5VTEwpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF9icm9hZGNhc3QgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF9icm9hZGNhc3QpIChfX2NvbmQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfc2lnbmFsIChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfc2lnbmFsKSAoX19jb25kKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3dhaXQgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCwgX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfd2FpdCkgKF9fY29uZCwgX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF90aW1lZHdhaXQgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCwgX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKl9fYWJzX3RpbWVvdXQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfdGltZWR3YWl0KSAoX19jb25kLCBfX211dGV4LCBfX2Fic190aW1lb3V0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3dhaXRfcmVjdXJzaXZlIChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQsCisJCQkgICAgICAgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX2NvbmRfd2FpdCAoX19jb25kLCBfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX2Rlc3Ryb3kgKF9fZ3RocmVhZF9jb25kX3QqIF9fY29uZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF9kZXN0cm95KSAoX19jb25kKTsKK30KKworI2VuZGlmIC8qIF9MSUJPQkpDICovCisKKyNlbmRpZiAvKiAhIF9HTElCQ1hYX0dDQ19HVEhSX1BPU0lYX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvZ3Roci1zaW5nbGUuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvZ3Roci1zaW5nbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWU1NzVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9ndGhyLXNpbmdsZS5oCkBAIC0wLDAgKzEsMjk4IEBACisvKiBUaHJlYWRzIGNvbXBhdGliaWxpdHkgcm91dGluZXMgZm9yIGxpYmdjYzIgYW5kIGxpYm9iamMuICAqLworLyogQ29tcGlsZSB0aGlzIG9uZSB3aXRoIGdjYy4gICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9HQ0NfR1RIUl9TSU5HTEVfSAorI2RlZmluZSBfR0xJQkNYWF9HQ0NfR1RIUl9TSU5HTEVfSAorCisvKiBKdXN0IHByb3ZpZGUgY29tcGF0aWJpbGl0eSBmb3IgbXV0ZXggaGFuZGxpbmcuICAqLworCit0eXBlZGVmIGludCBfX2d0aHJlYWRfa2V5X3Q7Cit0eXBlZGVmIGludCBfX2d0aHJlYWRfb25jZV90OwordHlwZWRlZiBpbnQgX19ndGhyZWFkX211dGV4X3Q7Cit0eXBlZGVmIGludCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3Q7CisKKyNkZWZpbmUgX19HVEhSRUFEX09OQ0VfSU5JVCAwCisjZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUIDAKKyNkZWZpbmUgX19HVEhSRUFEX01VVEVYX0lOSVRfRlVOQ1RJT04obXgpCisjZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVCAwCisKKyNkZWZpbmUgX0dMSUJDWFhfVU5VU0VEIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisKKyNpZmRlZiBfTElCT0JKQworCisvKiBUaHJlYWQgbG9jYWwgc3RvcmFnZSBmb3IgYSBzaW5nbGUgdGhyZWFkICovCitzdGF0aWMgdm9pZCAqdGhyZWFkX2xvY2FsX3N0b3JhZ2UgPSBOVUxMOworCisvKiBCYWNrZW5kIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworCisvKiBJbml0aWFsaXplIHRoZSB0aHJlYWRzIHN1YnN5c3RlbS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfaW5pdF90aHJlYWRfc3lzdGVtICh2b2lkKQoreworICAvKiBObyB0aHJlYWQgc3VwcG9ydCBhdmFpbGFibGUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBDbG9zZSB0aGUgdGhyZWFkcyBzdWJzeXN0ZW0uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2Nsb3NlX3RocmVhZF9zeXN0ZW0gKHZvaWQpCit7CisgIC8qIE5vIHRocmVhZCBzdXBwb3J0IGF2YWlsYWJsZSAqLworICByZXR1cm4gLTE7Cit9CisKKy8qIEJhY2tlbmQgdGhyZWFkIGZ1bmN0aW9ucyAqLworCisvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIG9mIGV4ZWN1dGlvbi4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9kZXRhY2ggKHZvaWQgKCogZnVuYykodm9pZCAqKSwgdm9pZCAqIGFyZyBfR0xJQkNYWF9VTlVTRUQpCit7CisgIC8qIE5vIHRocmVhZCBzdXBwb3J0IGF2YWlsYWJsZSAqLworICByZXR1cm4gTlVMTDsKK30KKworLyogU2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X3ByaW9yaXR5IChpbnQgcHJpb3JpdHkgX0dMSUJDWFhfVU5VU0VEKQoreworICAvKiBObyB0aHJlYWQgc3VwcG9ydCBhdmFpbGFibGUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkJ3MgcHJpb3JpdHkuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9nZXRfcHJpb3JpdHkgKHZvaWQpCit7CisgIHJldHVybiBPQkpDX1RIUkVBRF9JTlRFUkFDVElWRV9QUklPUklUWTsKK30KKworLyogWWllbGQgb3VyIHByb2Nlc3MgdGltZSB0byBhbm90aGVyIHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF95aWVsZCAodm9pZCkKK3sKKyAgcmV0dXJuOworfQorCisvKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZXhpdCAodm9pZCkKK3sKKyAgLyogTm8gdGhyZWFkIHN1cHBvcnQgYXZhaWxhYmxlICovCisgIC8qIFNob3VsZCB3ZSByZWFsbHkgZXhpdCB0aGUgcHJvZ3JhbSAqLworICAvKiBleGl0ICgmX19vYmpjX3RocmVhZF9leGl0X3N0YXR1cyk7ICovCisgIHJldHVybiAtMTsKK30KKworLyogUmV0dXJucyBhbiBpbnRlZ2VyIHZhbHVlIHdoaWNoIHVuaXF1ZWx5IGRlc2NyaWJlcyBhIHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9pZCAodm9pZCkKK3sKKyAgLyogTm8gdGhyZWFkIHN1cHBvcnQsIHVzZSAxLiAgKi8KKyAgcmV0dXJuIChvYmpjX3RocmVhZF90KSAxOworfQorCisvKiBTZXRzIHRoZSB0aHJlYWQncyBsb2NhbCBzdG9yYWdlIHBvaW50ZXIuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9zZXRfZGF0YSAodm9pZCAqdmFsdWUpCit7CisgIHRocmVhZF9sb2NhbF9zdG9yYWdlID0gdmFsdWU7CisgIHJldHVybiAwOworfQorCisvKiBSZXR1cm5zIHRoZSB0aHJlYWQncyBsb2NhbCBzdG9yYWdlIHBvaW50ZXIuICAqLworc3RhdGljIGlubGluZSB2b2lkICoKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9nZXRfZGF0YSAodm9pZCkKK3sKKyAgcmV0dXJuIHRocmVhZF9sb2NhbF9zdG9yYWdlOworfQorCisvKiBCYWNrZW5kIG11dGV4IGZ1bmN0aW9ucyAqLworCisvKiBBbGxvY2F0ZSBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9hbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlYWxsb2NhdGUgYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfZGVhbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEdyYWIgYSBsb2NrIG9uIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2xvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIC8qIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSB0aHJlYWQsIHNvIHdlIGFsd2F5cyBnZXQgdGhlIGxvY2sgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRyeSB0byBncmFiIGEgbG9jayBvbiBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF90cnlsb2NrIChvYmpjX211dGV4X3QgbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICAvKiBUaGVyZSBjYW4gb25seSBiZSBvbmUgdGhyZWFkLCBzbyB3ZSBhbHdheXMgZ2V0IHRoZSBsb2NrICovCisgIHJldHVybiAwOworfQorCisvKiBVbmxvY2sgdGhlIG11dGV4ICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfdW5sb2NrIChvYmpjX211dGV4X3QgbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworLyogQmFja2VuZCBjb25kaXRpb24gbXV0ZXggZnVuY3Rpb25zICovCisKKy8qIEFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fYWxsb2NhdGUgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uIF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlYWxsb2NhdGUgYSBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9kZWFsbG9jYXRlIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBXYWl0IG9uIHRoZSBjb25kaXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fd2FpdCAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24gX0dMSUJDWFhfVU5VU0VELAorCQkJICAgICAgIG9iamNfbXV0ZXhfdCBtdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBXYWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9icm9hZGNhc3QgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uIF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFdha2UgdXAgb25lIHRocmVhZCB3YWl0aW5nIG9uIHRoaXMgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fc2lnbmFsIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisjZWxzZSAvKiBfTElCT0JKQyAqLworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vbmNlIChfX2d0aHJlYWRfb25jZV90ICpfX29uY2UgX0dMSUJDWFhfVU5VU0VELCB2b2lkICgqX19mdW5jKSAodm9pZCkgX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX0dMSUJDWFhfVU5VU0VECitfX2d0aHJlYWRfa2V5X2NyZWF0ZSAoX19ndGhyZWFkX2tleV90ICpfX2tleSBfR0xJQkNYWF9VTlVTRUQsIHZvaWQgKCpfX2Z1bmMpICh2b2lkICopIF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX0dMSUJDWFhfVU5VU0VECitfX2d0aHJlYWRfa2V5X2RlbGV0ZSAoX19ndGhyZWFkX2tleV90IF9fa2V5IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfX2d0aHJlYWRfZ2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3NldHNwZWNpZmljIChfX2d0aHJlYWRfa2V5X3QgX19rZXkgX0dMSUJDWFhfVU5VU0VELCBjb25zdCB2b2lkICpfX3YgX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X2xvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2xvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF9sb2NrIChfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X3RyeWxvY2sgKF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19tdXRleCk7Cit9CisKKyNlbmRpZiAvKiBfTElCT0JKQyAqLworCisjdW5kZWYgX0dMSUJDWFhfVU5VU0VECisKKyNlbmRpZiAvKiAhIF9HTElCQ1hYX0dDQ19HVEhSX1NJTkdMRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2d0aHIuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvZ3Roci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzM5NGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2d0aHIuaApAQCAtMCwwICsxLDE1NCBAQAorLyogVGhyZWFkcyBjb21wYXRpYmlsaXR5IHJvdXRpbmVzIGZvciBsaWJnY2MyLiAgKi8KKy8qIENvbXBpbGUgdGhpcyBvbmUgd2l0aCBnY2MuICAqLworLyogQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0dMSUJDWFhfR0NDX0dUSFJfSAorI2RlZmluZSBfR0xJQkNYWF9HQ0NfR1RIUl9ICisKKyNpZm5kZWYgX0dMSUJDWFhfSElERV9FWFBPUlRTCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKyNlbmRpZgorCisvKiBJZiB0aGlzIGZpbGUgaXMgY29tcGlsZWQgd2l0aCB0aHJlYWRzIHN1cHBvcnQsIGl0IG11c3QKKyAgICAgICAjZGVmaW5lIF9fR1RIUkVBRFMgMQorICAgdG8gaW5kaWNhdGUgdGhhdCB0aHJlYWRzIHN1cHBvcnQgaXMgcHJlc2VudC4gIEFsc28gaXQgaGFzIGRlZmluZQorICAgZnVuY3Rpb24KKyAgICAgaW50IF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgdGhhdCByZXR1cm5zIDEgaWYgdGhyZWFkIHN5c3RlbSBpcyBhY3RpdmUsIDAgaWYgbm90LgorCisgICBUaGUgdGhyZWFkcyBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgdGhlIGZvbGxvd2luZyB0eXBlczoKKyAgICAgX19ndGhyZWFkX2tleV90CisgICAgIF9fZ3RocmVhZF9vbmNlX3QKKyAgICAgX19ndGhyZWFkX211dGV4X3QKKyAgICAgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90CisKKyAgIFRoZSB0aHJlYWRzIGludGVyZmFjZSBtdXN0IGRlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvczoKKworICAgICBfX0dUSFJFQURfT05DRV9JTklUCisgICAgIAkJdG8gaW5pdGlhbGl6ZSBfX2d0aHJlYWRfb25jZV90CisgICAgIF9fR1RIUkVBRF9NVVRFWF9JTklUCisgICAgIAkJdG8gaW5pdGlhbGl6ZSBfX2d0aHJlYWRfbXV0ZXhfdCB0byBnZXQgYSBmYXN0CisJCW5vbi1yZWN1cnNpdmUgbXV0ZXguCisgICAgIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OCisJCXRvIGluaXRpYWxpemUgX19ndGhyZWFkX211dGV4X3QgdG8gZ2V0IGEgZmFzdAorCQlub24tcmVjdXJzaXZlIG11dGV4LgorCQlEZWZpbmUgdGhpcyB0byBhIGZ1bmN0aW9uIHdoaWNoIGxvb2tzIGxpa2UgdGhpczoKKwkJICB2b2lkIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OIChfX2d0aHJlYWRfbXV0ZXhfdCAqKQorICAgICAJCVNvbWUgc3lzdGVtcyBjYW4ndCBpbml0aWFsaXplIGEgbXV0ZXggd2l0aG91dCBhCisJCWZ1bmN0aW9uIGNhbGwuICBEb24ndCBkZWZpbmUgX19HVEhSRUFEX01VVEVYX0lOSVQgaW4gdGhpcyBjYXNlLgorICAgICBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQKKyAgICAgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OCisgICAgIAkJYXMgYWJvdmUsIGJ1dCBmb3IgYSByZWN1cnNpdmUgbXV0ZXguCisKKyAgIFRoZSB0aHJlYWRzIGludGVyZmFjZSBtdXN0IGRlZmluZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBmdW5jdGlvbnM6CisKKyAgICAgaW50IF9fZ3RocmVhZF9vbmNlIChfX2d0aHJlYWRfb25jZV90ICpvbmNlLCB2b2lkICgqZnVuYykgKCkpCisKKyAgICAgaW50IF9fZ3RocmVhZF9rZXlfY3JlYXRlIChfX2d0aHJlYWRfa2V5X3QgKmtleXAsIHZvaWQgKCpkdG9yKSAodm9pZCAqKSkKKyAgICAgaW50IF9fZ3RocmVhZF9rZXlfZGVsZXRlIChfX2d0aHJlYWRfa2V5X3Qga2V5KQorCisgICAgIHZvaWQgKl9fZ3RocmVhZF9nZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90IGtleSkKKyAgICAgaW50IF9fZ3RocmVhZF9zZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90IGtleSwgY29uc3Qgdm9pZCAqcHRyKQorCisgICAgIGludCBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX211dGV4X3QgKm11dGV4KTsKKyAgICAgaW50IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICptdXRleCk7CisKKyAgICAgaW50IF9fZ3RocmVhZF9tdXRleF9sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpOworICAgICBpbnQgX19ndGhyZWFkX211dGV4X3RyeWxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICptdXRleCk7CisgICAgIGludCBfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpOworCisgICAgIGludCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2xvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqbXV0ZXgpOworICAgICBpbnQgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm11dGV4KTsKKyAgICAgaW50IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm11dGV4KTsKKworICAgVGhlIGZvbGxvd2luZyBhcmUgc3VwcG9ydGVkIGluIFBPU0lYIHRocmVhZHMgb25seS4gVGhleSBhcmUgcmVxdWlyZWQgdG8KKyAgIGZpeCBhIGRlYWRsb2NrIGluIHN0YXRpYyBpbml0aWFsaXphdGlvbiBpbnNpZGUgbGlic3VwYysrLiBUaGUgaGVhZGVyIGZpbGUKKyAgIGd0aHItcG9zaXguaCBkZWZpbmVzIGEgc3ltYm9sIF9fR1RIUkVBRF9IQVNfQ09ORCB0byBzaWduaWZ5IHRoYXQgdGhlc2UgZXh0cmEKKyAgIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQuCisKKyAgIFR5cGVzOgorICAgICBfX2d0aHJlYWRfY29uZF90CisKKyAgIE1hY3JvczoKKyAgICAgX19HVEhSRUFEX0NPTkRfSU5JVAorICAgICBfX0dUSFJFQURfQ09ORF9JTklUX0ZVTkNUSU9OCisKKyAgIEludGVyZmFjZToKKyAgICAgaW50IF9fZ3RocmVhZF9jb25kX2Jyb2FkY2FzdCAoX19ndGhyZWFkX2NvbmRfdCAqY29uZCk7CisgICAgIGludCBfX2d0aHJlYWRfY29uZF93YWl0IChfX2d0aHJlYWRfY29uZF90ICpjb25kLCBfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpOworICAgICBpbnQgX19ndGhyZWFkX2NvbmRfd2FpdF9yZWN1cnNpdmUgKF9fZ3RocmVhZF9jb25kX3QgKmNvbmQsCisJCQkJCV9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqbXV0ZXgpOworCisgICBBbGwgZnVuY3Rpb25zIHJldHVybmluZyBpbnQgc2hvdWxkIHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgdGhlIGVycm9yCisgICBudW1iZXIuICBJZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIC0xIGlzIHJldHVybmVkLgorCisgICBJZiB0aGUgZm9sbG93aW5nIGFyZSBhbHNvIGRlZmluZWQsIHlvdSBzaG91bGQKKyAgICAgI2RlZmluZSBfX0dUSFJFQURTX0NYWDBYIDEKKyAgIHRvIGVuYWJsZSB0aGUgYysrMHggdGhyZWFkIGxpYnJhcnkuCisKKyAgIFR5cGVzOgorICAgICBfX2d0aHJlYWRfdAorICAgICBfX2d0aHJlYWRfdGltZV90CisKKyAgIEludGVyZmFjZToKKyAgICAgaW50IF9fZ3RocmVhZF9jcmVhdGUgKF9fZ3RocmVhZF90ICp0aHJlYWQsIHZvaWQgKigqZnVuYykgKHZvaWQqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZ3MpOworICAgICBpbnQgX19ndGhyZWFkX2pvaW4gKF9fZ3RocmVhZF90IHRocmVhZCwgdm9pZCAqKnZhbHVlX3B0cik7CisgICAgIGludCBfX2d0aHJlYWRfZGV0YWNoIChfX2d0aHJlYWRfdCB0aHJlYWQpOworICAgICBpbnQgX19ndGhyZWFkX2VxdWFsIChfX2d0aHJlYWRfdCB0MSwgX19ndGhyZWFkX3QgdDIpOworICAgICBfX2d0aHJlYWRfdCBfX2d0aHJlYWRfc2VsZiAodm9pZCk7CisgICAgIGludCBfX2d0aHJlYWRfeWllbGQgKHZvaWQpOworCisgICAgIGludCBfX2d0aHJlYWRfbXV0ZXhfdGltZWRsb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKmFic190aW1lb3V0KTsKKyAgICAgaW50IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdGltZWRsb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICphYnNfdGltZSk7CisKKyAgICAgaW50IF9fZ3RocmVhZF9jb25kX3NpZ25hbCAoX19ndGhyZWFkX2NvbmRfdCAqY29uZCk7CisgICAgIGludCBfX2d0aHJlYWRfY29uZF90aW1lZHdhaXQgKF9fZ3RocmVhZF9jb25kX3QgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ3RocmVhZF9tdXRleF90ICptdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqYWJzX3RpbWVvdXQpOworCisqLworCisjaWYgX19HWFhfV0VBS19fCisvKiBUaGUgcGUtY29mZiB3ZWFrIHN1cHBvcnQgaXNuJ3QgZnVsbHkgY29tcGF0aWJsZSB0byBFTEYncyB3ZWFrLgorICAgRm9yIHN0YXRpYyBsaWJyYXJpZXMgaXQgbWlnaHQgd291bGQgd29yaywgYnV0IGFzIHdlIG5lZWQgdG8gZGVhbAorICAgd2l0aCBzaGFyZWQgdmVyc2lvbnMgdG9vLCB3ZSBkaXNhYmxlIGl0IGZvciBtaW5ndy10YXJnZXRzLiAgKi8KKyNpZmRlZiBfX01JTkdXMzJfXworI3VuZGVmIF9HTElCQ1hYX0dUSFJFQURfVVNFX1dFQUsKKyNkZWZpbmUgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSyAwCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9HVEhSRUFEX1VTRV9XRUFLCisjZGVmaW5lIF9HTElCQ1hYX0dUSFJFQURfVVNFX1dFQUsgMQorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxiaXRzL2d0aHItZGVmYXVsdC5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0hJREVfRVhQT1JUUworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwb3AKKyNlbmRpZgorCisjZW5kaWYgLyogISBfR0xJQkNYWF9HQ0NfR1RIUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL21lc3NhZ2VzX21lbWJlcnMuaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvbWVzc2FnZXNfbWVtYmVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDdlNDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL21lc3NhZ2VzX21lbWJlcnMuaApAQCAtMCwwICsxLDEzMCBAQAorLy8gc3RkOjptZXNzYWdlcyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCBHTlUgdmVyc2lvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9tZXNzYWdlc19tZW1iZXJzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjIuNy4xLjIgIG1lc3NhZ2VzIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKworI2luY2x1ZGUgPGxpYmludGwuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIE5vbi12aXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICAgbWVzc2FnZXM8X0NoYXJUPjo6bWVzc2FnZXMoc2l6ZV90IF9fcmVmcykKKyAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9jX2xvY2FsZV9tZXNzYWdlcyhfU19nZXRfY19sb2NhbGUoKSksIAorICAgICAgIF9NX25hbWVfbWVzc2FnZXMoX1NfZ2V0X2NfbmFtZSgpKQorICAgICB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgIG1lc3NhZ2VzPF9DaGFyVD46Om1lc3NhZ2VzKF9fY19sb2NhbGUgX19jbG9jLCBjb25zdCBjaGFyKiBfX3MsIAorCQkJCXNpemVfdCBfX3JlZnMpIAorICAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2NfbG9jYWxlX21lc3NhZ2VzKDApLCBfTV9uYW1lX21lc3NhZ2VzKDApCisgICAgIHsKKyAgICAgICBpZiAoX19idWlsdGluX3N0cmNtcChfX3MsIF9TX2dldF9jX25hbWUoKSkgIT0gMCkKKwkgeworCSAgIGNvbnN0IHNpemVfdCBfX2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4oX19zKSArIDE7CisJICAgY2hhciogX190bXAgPSBuZXcgY2hhcltfX2xlbl07CisJICAgX19idWlsdGluX21lbWNweShfX3RtcCwgX19zLCBfX2xlbik7CisJICAgX01fbmFtZV9tZXNzYWdlcyA9IF9fdG1wOworCSB9CisgICAgICAgZWxzZQorCSBfTV9uYW1lX21lc3NhZ2VzID0gX1NfZ2V0X2NfbmFtZSgpOworCisgICAgICAgLy8gTGFzdCB0byBhdm9pZCBsZWFraW5nIG1lbW9yeSBpZiBuZXcgdGhyb3dzLgorICAgICAgIF9NX2NfbG9jYWxlX21lc3NhZ2VzID0gX1NfY2xvbmVfY19sb2NhbGUoX19jbG9jKTsKKyAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBtZXNzYWdlczxfQ2hhclQ+OjpjYXRhbG9nIAorICAgIG1lc3NhZ2VzPF9DaGFyVD46Om9wZW4oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXI+JiBfX3MsIGNvbnN0IGxvY2FsZSYgX19sb2MsIAorCQkJICAgY29uc3QgY2hhciogX19kaXIpIGNvbnN0CisgICAgeyAKKyAgICAgIGJpbmR0ZXh0ZG9tYWluKF9fcy5jX3N0cigpLCBfX2Rpcik7CisgICAgICByZXR1cm4gdGhpcy0+ZG9fb3BlbihfX3MsIF9fbG9jKTsgCisgICAgfQorCisgIC8vIFZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIG1lc3NhZ2VzPF9DaGFyVD46On5tZXNzYWdlcygpCisgICAgeyAKKyAgICAgIGlmIChfTV9uYW1lX21lc3NhZ2VzICE9IF9TX2dldF9jX25hbWUoKSkKKwlkZWxldGUgW10gX01fbmFtZV9tZXNzYWdlczsKKyAgICAgIF9TX2Rlc3Ryb3lfY19sb2NhbGUoX01fY19sb2NhbGVfbWVzc2FnZXMpOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIG1lc3NhZ2VzPF9DaGFyVD46OmNhdGFsb2cgCisgICAgbWVzc2FnZXM8X0NoYXJUPjo6ZG9fb3Blbihjb25zdCBiYXNpY19zdHJpbmc8Y2hhcj4mIF9fcywgCisJCQkgICAgICBjb25zdCBsb2NhbGUmKSBjb25zdAorICAgIHsgCisgICAgICAvLyBObyBlcnJvciBjaGVja2luZyBpcyBkb25lLCBhc3N1bWUgdGhlIGNhdGFsb2cgZXhpc3RzIGFuZCBjYW4KKyAgICAgIC8vIGJlIHVzZWQuCisgICAgICB0ZXh0ZG9tYWluKF9fcy5jX3N0cigpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgdm9pZCAgICAKKyAgICBtZXNzYWdlczxfQ2hhclQ+Ojpkb19jbG9zZShjYXRhbG9nKSBjb25zdCAKKyAgICB7IH0KKworICAgLy8gbWVzc2FnZXNfYnluYW1lCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgIG1lc3NhZ2VzX2J5bmFtZTxfQ2hhclQ+OjptZXNzYWdlc19ieW5hbWUoY29uc3QgY2hhciogX19zLCBzaXplX3QgX19yZWZzKQorICAgICA6IG1lc3NhZ2VzPF9DaGFyVD4oX19yZWZzKSAKKyAgICAgeyAKKyAgICAgICBpZiAodGhpcy0+X01fbmFtZV9tZXNzYWdlcyAhPSBsb2NhbGU6OmZhY2V0OjpfU19nZXRfY19uYW1lKCkpCisJIHsKKwkgICBkZWxldGUgW10gdGhpcy0+X01fbmFtZV9tZXNzYWdlczsKKwkgICBpZiAoX19idWlsdGluX3N0cmNtcChfX3MsIGxvY2FsZTo6ZmFjZXQ6Ol9TX2dldF9jX25hbWUoKSkgIT0gMCkKKwkgICAgIHsKKwkgICAgICAgY29uc3Qgc2l6ZV90IF9fbGVuID0gX19idWlsdGluX3N0cmxlbihfX3MpICsgMTsKKwkgICAgICAgY2hhciogX190bXAgPSBuZXcgY2hhcltfX2xlbl07CisJICAgICAgIF9fYnVpbHRpbl9tZW1jcHkoX190bXAsIF9fcywgX19sZW4pOworCSAgICAgICB0aGlzLT5fTV9uYW1lX21lc3NhZ2VzID0gX190bXA7CisJICAgICB9CisJICAgZWxzZQorCSAgICAgdGhpcy0+X01fbmFtZV9tZXNzYWdlcyA9IGxvY2FsZTo6ZmFjZXQ6Ol9TX2dldF9jX25hbWUoKTsKKwkgfQorCisgICAgICAgaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19zLCAiQyIpICE9IDAKKwkgICAmJiBfX2J1aWx0aW5fc3RyY21wKF9fcywgIlBPU0lYIikgIT0gMCkKKwkgeworCSAgIHRoaXMtPl9TX2Rlc3Ryb3lfY19sb2NhbGUodGhpcy0+X01fY19sb2NhbGVfbWVzc2FnZXMpOworCSAgIHRoaXMtPl9TX2NyZWF0ZV9jX2xvY2FsZSh0aGlzLT5fTV9jX2xvY2FsZV9tZXNzYWdlcywgX19zKTsgCisJIH0KKyAgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL29wdF9yYW5kb20uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvb3B0X3JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNjdiNTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL29wdF9yYW5kb20uaApAQCAtMCwwICsxLDIxOSBAQAorLy8gT3B0aW1pemF0aW9ucyBmb3IgcmFuZG9tIG51bWJlciBmdW5jdGlvbnMsIHg4NiB2ZXJzaW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL29wdF9yYW5kb20uaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3JhbmRvbX0KKyAqLworCisjaWZuZGVmIF9CSVRTX09QVF9SQU5ET01fSAorI2RlZmluZSBfQklUU19PUFRfUkFORE9NX0ggMQorCisjaW5jbHVkZSA8eDg2aW50cmluLmg+CisKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworI2lmZGVmIF9fU1NFM19fCisgIHRlbXBsYXRlPD4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIG5vcm1hbF9kaXN0cmlidXRpb248ZG91YmxlPjo6CisgICAgICBfX2dlbmVyYXRlKHR5cGVuYW1lIG5vcm1hbF9kaXN0cmlidXRpb248ZG91YmxlPjo6cmVzdWx0X3R5cGUqIF9fZiwKKwkJIHR5cGVuYW1lIG5vcm1hbF9kaXN0cmlidXRpb248ZG91YmxlPjo6cmVzdWx0X3R5cGUqIF9fdCwKKwkJIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCXR5cGVkZWYgdWludDY0X3QgX191Y3R5cGU7CisKKwlpZiAoX19mID09IF9fdCkKKwkgIHJldHVybjsKKworCWlmIChfTV9zYXZlZF9hdmFpbGFibGUpCisJICB7CisJICAgIF9NX3NhdmVkX2F2YWlsYWJsZSA9IGZhbHNlOworCSAgICAqX19mKysgPSBfTV9zYXZlZCAqIF9fcGFyYW0uc3RkZGV2KCkgKyBfX3BhcmFtLm1lYW4oKTsKKworCSAgICBpZiAoX19mID09IF9fdCkKKwkgICAgICByZXR1cm47CisJICB9CisKKwljb25zdGV4cHIgdWludDY0X3QgX19tYXNrdmFsID0gMHhmZmZmZmZmZmZmZmZmdWxsOworCXN0YXRpYyBjb25zdCBfX20xMjhpIF9fbWFzayA9IF9tbV9zZXQxX2VwaTY0eChfX21hc2t2YWwpOworCXN0YXRpYyBjb25zdCBfX20xMjhpIF9fdHdvID0gX21tX3NldDFfZXBpNjR4KDB4NDAwMDAwMDAwMDAwMDAwMHVsbCk7CisJc3RhdGljIGNvbnN0IF9fbTEyOGQgX190aHJlZSA9IF9tbV9zZXQxX3BkKDMuMCk7CisJY29uc3QgX19tMTI4ZCBfX2F2ID0gX21tX3NldDFfcGQoX19wYXJhbS5tZWFuKCkpOworCisJY29uc3QgX191Y3R5cGUgX191cm5nbWluID0gX191cm5nLm1pbigpOworCWNvbnN0IF9fdWN0eXBlIF9fdXJuZ21heCA9IF9fdXJuZy5tYXgoKTsKKwljb25zdCBfX3VjdHlwZSBfX3VybmdyYW5nZSA9IF9fdXJuZ21heCAtIF9fdXJuZ21pbjsKKwljb25zdCBfX3VjdHlwZSBfX3Vlcm5ncmFuZ2UgPSBfX3VybmdyYW5nZSArIDE7CisKKwl3aGlsZSAoX19mICsgMSA8IF9fdCkKKwkgIHsKKwkgICAgZG91YmxlIF9fbGU7CisJICAgIF9fbTEyOGQgX194OworCSAgICBkbworCSAgICAgIHsKKyAgICAgICAgICAgICAgICB1bmlvbgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fbTEyOGkgX19pOworICAgICAgICAgICAgICAgICAgX19tMTI4ZCBfX2Q7CisJCX0gX192OworCisJCWlmIChfX3VybmdyYW5nZSA+IF9fbWFza3ZhbCkKKwkJICB7CisJCSAgICBpZiAoX19kZXRhaWw6Ol9Qb3dlcl9vZl8yKF9fdWVybmdyYW5nZSkpCisJCSAgICAgIF9fdi5fX2kgPSBfbW1fYW5kX3NpMTI4KF9tbV9zZXRfZXBpNjR4KF9fdXJuZygpLAorCQkJCQkJCSAgICAgX191cm5nKCkpLAorCQkJCQkgICAgICBfX21hc2spOworCQkgICAgZWxzZQorCQkgICAgICB7CisJCQljb25zdCBfX3VjdHlwZSBfX3VlcmFuZ2UgPSBfX21hc2t2YWwgKyAxOworCQkJY29uc3QgX191Y3R5cGUgX19zY2FsaW5nID0gX191cm5ncmFuZ2UgLyBfX3VlcmFuZ2U7CisJCQljb25zdCBfX3VjdHlwZSBfX3Bhc3QgPSBfX3VlcmFuZ2UgKiBfX3NjYWxpbmc7CisJCQl1aW50NjRfdCBfX3YxOworCQkJZG8KKwkJCSAgX192MSA9IF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbjsKKwkJCXdoaWxlIChfX3YxID49IF9fcGFzdCk7CisJCQlfX3YxIC89IF9fc2NhbGluZzsKKwkJCXVpbnQ2NF90IF9fdjI7CisJCQlkbworCQkJICBfX3YyID0gX191Y3R5cGUoX191cm5nKCkpIC0gX191cm5nbWluOworCQkJd2hpbGUgKF9fdjIgPj0gX19wYXN0KTsKKwkJCV9fdjIgLz0gX19zY2FsaW5nOworCisJCQlfX3YuX19pID0gX21tX3NldF9lcGk2NHgoX192MSwgX192Mik7CisJCSAgICAgIH0KKwkJICB9CisJCWVsc2UgaWYgKF9fdXJuZ3JhbmdlID09IF9fbWFza3ZhbCkKKwkJICBfX3YuX19pID0gX21tX3NldF9lcGk2NHgoX191cm5nKCksIF9fdXJuZygpKTsKKwkJZWxzZSBpZiAoKF9fdXJuZ3JhbmdlICsgMikgKiBfX3VybmdyYW5nZSA+PSBfX21hc2t2YWwKKwkJCSAmJiBfX2RldGFpbDo6X1Bvd2VyX29mXzIoX191ZXJuZ3JhbmdlKSkKKwkJICB7CisJCSAgICB1aW50NjRfdCBfX3YxID0gX191cm5nKCkgKiBfX3Vlcm5ncmFuZ2UgKyBfX3VybmcoKTsKKwkJICAgIHVpbnQ2NF90IF9fdjIgPSBfX3VybmcoKSAqIF9fdWVybmdyYW5nZSArIF9fdXJuZygpOworCisJCSAgICBfX3YuX19pID0gX21tX2FuZF9zaTEyOChfbW1fc2V0X2VwaTY0eChfX3YxLCBfX3YyKSwKKwkJCQkJICAgIF9fbWFzayk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgc2l6ZV90IF9fbnJuZyA9IDI7CisJCSAgICBfX3VjdHlwZSBfX2hpZ2ggPSBfX21hc2t2YWwgLyBfX3Vlcm5ncmFuZ2UgLyBfX3Vlcm5ncmFuZ2U7CisJCSAgICB3aGlsZSAoX19oaWdoID4gX191ZXJuZ3JhbmdlKQorCQkgICAgICB7CisJCQkrK19fbnJuZzsKKwkJCV9faGlnaCAvPSBfX3Vlcm5ncmFuZ2U7CisJCSAgICAgIH0KKwkJICAgIGNvbnN0IF9fdWN0eXBlIF9faGlnaHJhbmdlID0gX19oaWdoICsgMTsKKwkJICAgIGNvbnN0IF9fdWN0eXBlIF9fc2NhbGluZyA9IF9fdXJuZ3JhbmdlIC8gX19oaWdocmFuZ2U7CisJCSAgICBjb25zdCBfX3VjdHlwZSBfX3Bhc3QgPSBfX2hpZ2hyYW5nZSAqIF9fc2NhbGluZzsKKwkJICAgIF9fdWN0eXBlIF9fdG1wOworCisJCSAgICB1aW50NjRfdCBfX3YxOworCQkgICAgZG8KKwkJICAgICAgeworCQkJZG8KKwkJCSAgX190bXAgPSBfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW47CisJCQl3aGlsZSAoX190bXAgPj0gX19wYXN0KTsKKwkJCV9fdjEgPSBfX3RtcCAvIF9fc2NhbGluZzsKKwkJCWZvciAoc2l6ZV90IF9fY250ID0gMDsgX19jbnQgPCBfX25ybmc7ICsrX19jbnQpCisJCQkgIHsKKwkJCSAgICBfX3RtcCA9IF9fdjE7CisJCQkgICAgX192MSAqPSBfX3Vlcm5ncmFuZ2U7CisJCQkgICAgX192MSArPSBfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW47CisJCQkgIH0KKwkJICAgICAgfQorCQkgICAgd2hpbGUgKF9fdjEgPiBfX21hc2t2YWwgfHwgX192MSA8IF9fdG1wKTsKKworCQkgICAgdWludDY0X3QgX192MjsKKwkJICAgIGRvCisJCSAgICAgIHsKKwkJCWRvCisJCQkgIF9fdG1wID0gX191Y3R5cGUoX191cm5nKCkpIC0gX191cm5nbWluOworCQkJd2hpbGUgKF9fdG1wID49IF9fcGFzdCk7CisJCQlfX3YyID0gX190bXAgLyBfX3NjYWxpbmc7CisJCQlmb3IgKHNpemVfdCBfX2NudCA9IDA7IF9fY250IDwgX19ucm5nOyArK19fY250KQorCQkJICB7CisJCQkgICAgX190bXAgPSBfX3YyOworCQkJICAgIF9fdjIgKj0gX191ZXJuZ3JhbmdlOworCQkJICAgIF9fdjIgKz0gX191Y3R5cGUoX191cm5nKCkpIC0gX191cm5nbWluOworCQkJICB9CisJCSAgICAgIH0KKwkJICAgIHdoaWxlIChfX3YyID4gX19tYXNrdmFsIHx8IF9fdjIgPCBfX3RtcCk7CisJCSAgICAKKwkJICAgIF9fdi5fX2kgPSBfbW1fc2V0X2VwaTY0eChfX3YxLCBfX3YyKTsKKwkJICB9CisKKwkJX192Ll9faSA9IF9tbV9vcl9zaTEyOChfX3YuX19pLCBfX3R3byk7CisJCV9feCA9IF9tbV9zdWJfcGQoX192Ll9fZCwgX190aHJlZSk7CisJCV9fbTEyOGQgX19tID0gX21tX211bF9wZChfX3gsIF9feCk7CisJCV9fbGUgPSBfbW1fY3Z0c2RfZjY0KF9tbV9oYWRkX3BkIChfX20sIF9fbSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoX19sZSA9PSAwLjAgfHwgX19sZSA+PSAxLjApOworCisgICAgICAgICAgICBkb3VibGUgX19tdWx0ID0gKHN0ZDo6c3FydCgtMi4wICogc3RkOjpsb2coX19sZSkgLyBfX2xlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIF9fcGFyYW0uc3RkZGV2KCkpOworCisgICAgICAgICAgICBfX3ggPSBfbW1fYWRkX3BkKF9tbV9tdWxfcGQoX194LCBfbW1fc2V0MV9wZChfX211bHQpKSwgX19hdik7CisKKyAgICAgICAgICAgIF9tbV9zdG9yZXVfcGQoX19mLCBfX3gpOworICAgICAgICAgICAgX19mICs9IDI7CisgICAgICAgICAgfQorCisgICAgICAgIGlmIChfX2YgIT0gX190KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdF90eXBlIF9feCwgX195LCBfX3IyOworCisgICAgICAgICAgICBfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorICAgICAgICAgICAgICBfX2F1cm5nKF9fdXJuZyk7CisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3ggPSByZXN1bHRfdHlwZSgyLjApICogX19hdXJuZygpIC0gMS4wOworICAgICAgICAgICAgICAgIF9feSA9IHJlc3VsdF90eXBlKDIuMCkgKiBfX2F1cm5nKCkgLSAxLjA7CisgICAgICAgICAgICAgICAgX19yMiA9IF9feCAqIF9feCArIF9feSAqIF9feTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKF9fcjIgPiAxLjAgfHwgX19yMiA9PSAwLjApOworCisgICAgICAgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX211bHQgPSBzdGQ6OnNxcnQoLTIgKiBzdGQ6OmxvZyhfX3IyKSAvIF9fcjIpOworICAgICAgICAgICAgX01fc2F2ZWQgPSBfX3ggKiBfX211bHQ7CisgICAgICAgICAgICBfTV9zYXZlZF9hdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgKl9fZiA9IF9feSAqIF9fbXVsdCAqIF9fcGFyYW0uc3RkZGV2KCkgKyBfX3BhcmFtLm1lYW4oKTsKKyAgICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKworI2VuZGlmIC8vIF9CSVRTX09QVF9SQU5ET01fSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9vc19kZWZpbmVzLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL29zX2RlZmluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWU0MDc1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9vc19kZWZpbmVzLmgKQEAgLTAsMCArMSw0OCBAQAorLy8gU3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIEdOVS9MaW51eCAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvb3NfZGVmaW5lcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zZndkfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfT1NfREVGSU5FUworI2RlZmluZSBfR0xJQkNYWF9PU19ERUZJTkVTIDEKKworLy8gU3lzdGVtLXNwZWNpZmljICNkZWZpbmUsIHR5cGVkZWZzLCBjb3JyZWN0aW9ucywgZXRjLCBnbyBoZXJlLiAgVGhpcworLy8gZmlsZSB3aWxsIGNvbWUgYmVmb3JlIGFsbCBvdGhlcnMuCisKKy8vIFRoaXMga2VlcHMgaXNhbnVtLCBldCBhbCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQgYXMgbWFjcm9zLgorI2RlZmluZSBfX05PX0NUWVBFIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8vIFByb3ZpZGUgYSBkZWNsYXJhdGlvbiBmb3IgdGhlIHBvc3NpYmx5IGRlcHJlY2F0ZWQgZ2V0cyBmdW5jdGlvbiwgYXMKKy8vIGdsaWJjIDIuMTUgYW5kIGxhdGVyIGRvZXMgbm90IGRlY2xhcmUgZ2V0cyBmb3IgSVNPIEMxMSB3aGVuCisvLyBfX0dOVV9TT1VSQ0UgaXMgZGVmaW5lZC4KKyNpZiBfX0dMSUJDX1BSRVJFUSgyLDE1KSAmJiBkZWZpbmVkKF9HTlVfU09VUkNFKQorIyB1bmRlZiBfR0xJQkNYWF9IQVZFX0dFVFMKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvc3RkYysrLmggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL3N0ZGMrKy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NTM3N2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL3N0ZGMrKy5oCkBAIC0wLDAgKzEsMTE3IEBACisvLyBDKysgaW5jbHVkZXMgdXNlZCBmb3IgcHJlY29tcGlsaW5nIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBzdGRjKysuaAorICogIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZmlsZSBmb3IgYSBwcmVjb21waWxlZCBoZWFkZXIuCisgKi8KKworLy8gMTcuNC4xLjIgSGVhZGVycworCisvLyBDCisjaWZuZGVmIF9HTElCQ1hYX05PX0FTU0VSVAorI2luY2x1ZGUgPGNhc3NlcnQ+CisjZW5kaWYKKyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPGNmbG9hdD4KKyNpbmNsdWRlIDxjaXNvNjQ2PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y2xvY2FsZT4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxjc2V0am1wPgorI2luY2x1ZGUgPGNzaWduYWw+CisjaW5jbHVkZSA8Y3N0ZGFyZz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y3RpbWU+CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8Y2NvbXBsZXg+CisjaW5jbHVkZSA8Y2ZlbnY+CisjaW5jbHVkZSA8Y2ludHR5cGVzPgorI2luY2x1ZGUgPGNzdGRhbGlnbj4KKyNpbmNsdWRlIDxjc3RkYm9vbD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGN0Z21hdGg+CisjaW5jbHVkZSA8Y3djaGFyPgorI2luY2x1ZGUgPGN3Y3R5cGU+CisjZW5kaWYKKworLy8gQysrCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxjb21wbGV4PgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3M+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGlzdHJlYW0+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3RyZWFtYnVmPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZhbGFycmF5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxmb3J3YXJkX2xpc3Q+CisjaW5jbHVkZSA8ZnV0dXJlPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8cmFuZG9tPgorI2luY2x1ZGUgPHJhdGlvPgorI2luY2x1ZGUgPHJlZ2V4PgorI2luY2x1ZGUgPHNjb3BlZF9hbGxvY2F0b3I+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx0eXBlaW5kZXg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL3N0ZHRyMWMrKy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9zdGR0cjFjKysuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmJmMTM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9zdGR0cjFjKysuaApAQCAtMCwwICsxLDUzIEBACisvLyBDKysgaW5jbHVkZXMgdXNlZCBmb3IgcHJlY29tcGlsaW5nIFRSMSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgc3RkdHIxYysrLmgKKyAqICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGZpbGUgZm9yIGEgcHJlY29tcGlsZWQgaGVhZGVyLgorICovCisKKyNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgorCisjaW5jbHVkZSA8dHIxL2FycmF5PgorI2luY2x1ZGUgPHRyMS9jY3R5cGU+CisjaW5jbHVkZSA8dHIxL2NmZW52PgorI2luY2x1ZGUgPHRyMS9jZmxvYXQ+CisjaW5jbHVkZSA8dHIxL2NpbnR0eXBlcz4KKyNpbmNsdWRlIDx0cjEvY2xpbWl0cz4KKyNpbmNsdWRlIDx0cjEvY21hdGg+CisjaW5jbHVkZSA8dHIxL2NvbXBsZXg+CisjaW5jbHVkZSA8dHIxL2NzdGRhcmc+CisjaW5jbHVkZSA8dHIxL2NzdGRib29sPgorI2luY2x1ZGUgPHRyMS9jc3RkaW50PgorI2luY2x1ZGUgPHRyMS9jc3RkaW8+CisjaW5jbHVkZSA8dHIxL2NzdGRsaWI+CisjaW5jbHVkZSA8dHIxL2N0Z21hdGg+CisjaW5jbHVkZSA8dHIxL2N0aW1lPgorI2luY2x1ZGUgPHRyMS9jd2NoYXI+CisjaW5jbHVkZSA8dHIxL2N3Y3R5cGU+CisjaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+CisjaW5jbHVkZSA8dHIxL3JhbmRvbT4KKyNpbmNsdWRlIDx0cjEvdHVwbGU+CisjaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dHIxL3V0aWxpdHk+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL3RpbWVfbWVtYmVycy5oIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy90aW1lX21lbWJlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2IzY2MyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy90aW1lX21lbWJlcnMuaApAQCAtMCwwICsxLDg5IEBACisvLyBzdGQ6OnRpbWVfZ2V0LCBzdGQ6OnRpbWVfcHV0IGltcGxlbWVudGF0aW9uLCBHTlUgdmVyc2lvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy90aW1lX21lbWJlcnMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xvY2FsZX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMi41LjEuMiAtIHRpbWVfZ2V0IGZ1bmN0aW9ucworLy8gSVNPIEMrKyAxNDg4MjogMjIuMi41LjMuMiAtIHRpbWVfcHV0IGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfX3RpbWVwdW5jdDxfQ2hhclQ+OjpfX3RpbWVwdW5jdChzaXplX3QgX19yZWZzKSAKKyAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2RhdGEoMCksIF9NX2NfbG9jYWxlX3RpbWVwdW5jdCgwKSwgCisgICAgICBfTV9uYW1lX3RpbWVwdW5jdChfU19nZXRfY19uYW1lKCkpCisgICAgeyBfTV9pbml0aWFsaXplX3RpbWVwdW5jdCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIF9fdGltZXB1bmN0PF9DaGFyVD46Ol9fdGltZXB1bmN0KF9fY2FjaGVfdHlwZSogX19jYWNoZSwgc2l6ZV90IF9fcmVmcykgCisgICAgOiBmYWNldChfX3JlZnMpLCBfTV9kYXRhKF9fY2FjaGUpLCBfTV9jX2xvY2FsZV90aW1lcHVuY3QoMCksIAorICAgICAgX01fbmFtZV90aW1lcHVuY3QoX1NfZ2V0X2NfbmFtZSgpKQorICAgIHsgX01faW5pdGlhbGl6ZV90aW1lcHVuY3QoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfX3RpbWVwdW5jdDxfQ2hhclQ+OjpfX3RpbWVwdW5jdChfX2NfbG9jYWxlIF9fY2xvYywgY29uc3QgY2hhciogX19zLAorCQkJCSAgICAgc2l6ZV90IF9fcmVmcykgCisgICAgOiBmYWNldChfX3JlZnMpLCBfTV9kYXRhKDApLCBfTV9jX2xvY2FsZV90aW1lcHVuY3QoMCksIAorICAgICAgX01fbmFtZV90aW1lcHVuY3QoMCkKKyAgICB7CisgICAgICBpZiAoX19idWlsdGluX3N0cmNtcChfX3MsIF9TX2dldF9jX25hbWUoKSkgIT0gMCkKKwl7CisJICBjb25zdCBzaXplX3QgX19sZW4gPSBfX2J1aWx0aW5fc3RybGVuKF9fcykgKyAxOworCSAgY2hhciogX190bXAgPSBuZXcgY2hhcltfX2xlbl07CisJICBfX2J1aWx0aW5fbWVtY3B5KF9fdG1wLCBfX3MsIF9fbGVuKTsKKwkgIF9NX25hbWVfdGltZXB1bmN0ID0gX190bXA7CisJfQorICAgICAgZWxzZQorCV9NX25hbWVfdGltZXB1bmN0ID0gX1NfZ2V0X2NfbmFtZSgpOworCisgICAgICBfX3RyeQorCXsgX01faW5pdGlhbGl6ZV90aW1lcHVuY3QoX19jbG9jKTsgfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgaWYgKF9NX25hbWVfdGltZXB1bmN0ICE9IF9TX2dldF9jX25hbWUoKSkKKwkgICAgZGVsZXRlIFtdIF9NX25hbWVfdGltZXB1bmN0OworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgX190aW1lcHVuY3Q8X0NoYXJUPjo6fl9fdGltZXB1bmN0KCkKKyAgICB7IAorICAgICAgaWYgKF9NX25hbWVfdGltZXB1bmN0ICE9IF9TX2dldF9jX25hbWUoKSkKKwlkZWxldGUgW10gX01fbmFtZV90aW1lcHVuY3Q7CisgICAgICBkZWxldGUgX01fZGF0YTsgCisgICAgICBfU19kZXN0cm95X2NfbG9jYWxlKF9NX2NfbG9jYWxlX3RpbWVwdW5jdCk7IAorICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvZXh0L29wdF9yYW5kb20uaCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2V4dC9vcHRfcmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3NWIwNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2V4dC9vcHRfcmFuZG9tLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8vIE9wdGltaXphdGlvbnMgZm9yIHJhbmRvbSBudW1iZXIgZXh0ZW5zaW9ucywgeDg2IHZlcnNpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9yYW5kb20udGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXh0L3JhbmRvbX0KKyAqLworCisjaWZuZGVmIF9FWFRfT1BUX1JBTkRPTV9ICisjZGVmaW5lIF9FWFRfT1BUX1JBTkRPTV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KKworI2lmZGVmIF9fU1NFMl9fCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICBuYW1lc3BhY2UgeworCisgICAgdGVtcGxhdGU8c2l6ZV90IF9fc2wxLCBzaXplX3QgX19zbDIsIHNpemVfdCBfX3NyMSwgc2l6ZV90IF9fc3IyLAorCSAgICAgdWludDMyX3QgX19tc2sxLCB1aW50MzJfdCBfX21zazIsIHVpbnQzMl90IF9fbXNrMywgdWludDMyX3QgX19tc2s0PgorICAgICAgaW5saW5lIF9fbTEyOGkgX19zc2UyX3JlY3Vyc2lvbihfX20xMjhpIF9fYSwgX19tMTI4aSBfX2IsCisJCQkJICAgICAgX19tMTI4aSBfX2MsIF9fbTEyOGkgX19kKQorICAgICAgeworCV9fbTEyOGkgX195ID0gX21tX3NybGlfZXBpMzIoX19iLCBfX3NyMSk7CisJX19tMTI4aSBfX3ogPSBfbW1fc3JsaV9zaTEyOChfX2MsIF9fc3IyKTsKKwlfX20xMjhpIF9fdiA9IF9tbV9zbGxpX2VwaTMyKF9fZCwgX19zbDEpOworCV9feiA9IF9tbV94b3Jfc2kxMjgoX196LCBfX2EpOworCV9feiA9IF9tbV94b3Jfc2kxMjgoX196LCBfX3YpOworCV9fbTEyOGkgX194ID0gX21tX3NsbGlfc2kxMjgoX19hLCBfX3NsMik7CisJX195ID0gX21tX2FuZF9zaTEyOChfX3ksIF9tbV9zZXRfZXBpMzIoX19tc2s0LCBfX21zazMsIF9fbXNrMiwgX19tc2sxKSk7CisJX196ID0gX21tX3hvcl9zaTEyOChfX3osIF9feCk7CisJcmV0dXJuIF9tbV94b3Jfc2kxMjgoX196LCBfX3kpOworICAgICAgfQorCisgIH0KKworCisjZGVmaW5lIF9HTElCQ1hYX09QVF9IQVZFX1JBTkRPTV9TRk1UX0dFTl9SRUFECTEKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX19tLAorCSAgIHNpemVfdCBfX3BvczEsIHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLAorCSAgIHNpemVfdCBfX3NyMSwgc2l6ZV90IF9fc3IyLAorCSAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLAorCSAgIHVpbnQzMl90IF9fbXNrMywgdWludDMyX3QgX19tc2s0LAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MSwgdWludDMyX3QgX19wYXJpdHkyLAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MywgdWludDMyX3QgX19wYXJpdHk0PgorICAgIHZvaWQgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX19tLAorCQkJCQkgICBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCQkJCQkgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJCQkJCSAgIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsCisJCQkJCSAgIF9fcGFyaXR5ND46OgorICAgIF9NX2dlbl9yYW5kKHZvaWQpCisgICAgeworICAgICAgX19tMTI4aSBfX3IxID0gX21tX2xvYWRfc2kxMjgoJl9NX3N0YXRlW19NX25zdGF0ZSAtIDJdKTsKKyAgICAgIF9fbTEyOGkgX19yMiA9IF9tbV9sb2FkX3NpMTI4KCZfTV9zdGF0ZVtfTV9uc3RhdGUgLSAxXSk7CisKKyAgICAgIHNpemVfdCBfX2k7CisgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9NX25zdGF0ZSAtIF9fcG9zMTsgKytfX2kpCisJeworCSAgX19tMTI4aSBfX3IgPSBfX3NzZTJfcmVjdXJzaW9uPF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCQkJCQkgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0PgorCSAgICAoX01fc3RhdGVbX19pXSwgX01fc3RhdGVbX19pICsgX19wb3MxXSwgX19yMSwgX19yMik7CisJICBfbW1fc3RvcmVfc2kxMjgoJl9NX3N0YXRlW19faV0sIF9fcik7CisJICBfX3IxID0gX19yMjsKKwkgIF9fcjIgPSBfX3I7CisJfQorICAgICAgZm9yICg7IF9faSA8IF9NX25zdGF0ZTsgKytfX2kpCisJeworCSAgX19tMTI4aSBfX3IgPSBfX3NzZTJfcmVjdXJzaW9uPF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCQkJCQkgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0PgorCSAgICAoX01fc3RhdGVbX19pXSwgX01fc3RhdGVbX19pICsgX19wb3MxIC0gX01fbnN0YXRlXSwgX19yMSwgX19yMik7CisJICBfbW1fc3RvcmVfc2kxMjgoJl9NX3N0YXRlW19faV0sIF9fcik7CisJICBfX3IxID0gX19yMjsKKwkgIF9fcjIgPSBfX3I7CisJfQorCisgICAgICBfTV9wb3MgPSAwOworICAgIH0KKworCisjZGVmaW5lIF9HTElCQ1hYX09QVF9IQVZFX1JBTkRPTV9TRk1UX09QRVJBVE9SRVFVQUwJMQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX20sCisJICAgc2l6ZV90IF9fcG9zMSwgc2l6ZV90IF9fc2wxLCBzaXplX3QgX19zbDIsCisJICAgc2l6ZV90IF9fc3IxLCBzaXplX3QgX19zcjIsCisJICAgdWludDMyX3QgX19tc2sxLCB1aW50MzJfdCBfX21zazIsCisJICAgdWludDMyX3QgX19tc2szLCB1aW50MzJfdCBfX21zazQsCisJICAgdWludDMyX3QgX19wYXJpdHkxLCB1aW50MzJfdCBfX3Bhcml0eTIsCisJICAgdWludDMyX3QgX19wYXJpdHkzLCB1aW50MzJfdCBfX3Bhcml0eTQ+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX19nbnVfY3h4OjpzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLAorCSAgICAgICBfX20sIF9fcG9zMSwgX19zbDEsIF9fc2wyLCBfX3NyMSwgX19zcjIsCisJICAgICAgIF9fbXNrMSwgX19tc2syLCBfX21zazMsIF9fbXNrNCwKKwkgICAgICAgX19wYXJpdHkxLCBfX3Bhcml0eTIsIF9fcGFyaXR5MywgX19wYXJpdHk0PiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6c2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwKKwkgICAgICAgX19tLCBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCSAgICAgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJICAgICAgIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsIF9fcGFyaXR5ND4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fbTEyOGkgX19yZXMgPSBfbW1fY21wZXFfZXBpOChfX2xocy5fTV9zdGF0ZVswXSwgX19yaHMuX01fc3RhdGVbMF0pOworICAgICAgZm9yIChzaXplX3QgX19pID0gMTsgX19pIDwgX19saHMuX01fbnN0YXRlOyArK19faSkKKwlfX3JlcyA9IF9tbV9hbmRfc2kxMjgoX19yZXMsIF9tbV9jbXBlcV9lcGk4KF9fbGhzLl9NX3N0YXRlW19faV0sCisJCQkJCQkgICAgX19yaHMuX01fc3RhdGVbX19pXSkpOworICAgICAgcmV0dXJuIChfbW1fbW92ZW1hc2tfZXBpOChfX3JlcykgPT0gMHhmZmZmCisJICAgICAgJiYgX19saHMuX01fcG9zID09IF9fcmhzLl9NX3Bvcyk7CisgICAgfQorCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9fU1NFMl9fCisKKyNlbmRpZiAvLyBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXworCisjZW5kaWYgLy8gX0VYVF9PUFRfUkFORE9NX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1YzhkYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54CkBAIC0wLDAgKzEsMjI2IEBACisvKiBEZWZhdWx0IGxpbmtlciBzY3JpcHQsIGZvciBub3JtYWwgZXhlY3V0YWJsZXMgKi8KKy8qIE1vZGlmaWVkIGZvciBBbmRyb2lkLiAgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLXg4Ni02NCIsICJlbGYzMi14ODYtNjQiLAorCSAgICAgICJlbGYzMi14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4NjQtMzIpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHg0MDAwMDApOyAuID0gMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlmdW5jICAgICA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gMzIgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhibiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54Ym4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhZDI1OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54Ym4KQEAgLTAsMCArMSwyMjMgQEAKKy8qIFNjcmlwdCBmb3IgLU46IG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZTsgZG9uJ3QgYWxpZ24gZGF0YSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzIteDg2LTY0IiwgImVsZjMyLXg4Ni02NCIsCisJICAgICAgImVsZjMyLXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong2NC0zMikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDQwMDAwMCk7IC4gPSAweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyAucmVsYS5kYXRhLnJlbC5yby4qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaWZ1bmMgICAgIDogeyAqKC5yZWxhLmlmdW5jKSB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSAuOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyAzMiAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZTRhYjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueGMKQEAgLTAsMCArMSwyMjcgQEAKKy8qIFNjcmlwdCBmb3IgLXogY29tYnJlbG9jOiBjb21iaW5lIGFuZCBzb3J0IHJlbG9jIHNlY3Rpb25zICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi14ODYtNjQiLCAiZWxmMzIteDg2LTY0IiwKKwkgICAgICAiZWxmMzIteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDY0LTMyKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlmdW5jKQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54ZCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzU5NGE0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhkCkBAIC0wLDAgKzEsMjI1IEBACisvKiBTY3JpcHQgZm9yIGxkIC1waWU6IGxpbmsgcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzIteDg2LTY0IiwgImVsZjMyLXg4Ni02NCIsCisJICAgICAgImVsZjMyLXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong2NC0zMikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAwKTsgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlmdW5jICAgICA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gMzIgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhkYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54ZGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxNzg0ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54ZGMKQEAgLTAsMCArMSwyMjcgQEAKKy8qIFNjcmlwdCBmb3IgLXBpZSAteiBjb21icmVsb2M6IHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUsIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzIteDg2LTY0IiwgImVsZjMyLXg4Ni02NCIsCisJICAgICAgImVsZjMyLXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong2NC0zMikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAwKTsgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgICooLnJlbGEuaWZ1bmMpCisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gMzIgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhkdyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54ZHcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiODJiMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54ZHcKQEAgLTAsMCArMSwyMjYgQEAKKy8qIFNjcmlwdCBmb3IgLXBpZSAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlLCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLXg4Ni02NCIsICJlbGYzMi14ODYtNjQiLAorCSAgICAgICJlbGYzMi14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4NjQtMzIpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMCk7IC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlmdW5jKQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54biBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmUwZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhuCkBAIC0wLDAgKzEsMjI1IEBACisvKiBTY3JpcHQgZm9yIC1uOiBtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2UgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLXg4Ni02NCIsICJlbGYzMi14ODYtNjQiLAorCSAgICAgICJlbGYzMi14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4NjQtMzIpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHg0MDAwMDApOyAuID0gMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlmdW5jICAgICA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gMzIgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhyIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNGRjYjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueHIKQEAgLTAsMCArMSwxNTQgQEAKKy8qIFNjcmlwdCBmb3IgbGQgLXI6IGxpbmsgd2l0aG91dCByZWxvY2F0aW9uICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi14ODYtNjQiLCAiZWxmMzIteDg2LTY0IiwKKwkgICAgICAiZWxmMzIteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDY0LTMyKQorIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcworICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZworICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAorICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLmludGVycCAgICAgICAwIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgIDAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAwIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgIDAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgIDAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gIDAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kIDA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAwOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAwIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAwIDogeyAqKC5yZWxhLnRleHQpIH0KKyAgLnJlbGEuZmluaSAgICAwIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAwIDogeyAqKC5yZWxhLnJvZGF0YSkgfQorICAucmVsYS5kYXRhLnJlbC5ybyAwIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvKSB9CisgIC5yZWxhLmRhdGEgICAgMCA6IHsgKigucmVsYS5kYXRhKSB9CisgIC5yZWxhLnRkYXRhCTAgOiB7ICooLnJlbGEudGRhdGEpIH0KKyAgLnJlbGEudGJzcwkwIDogeyAqKC5yZWxhLnRic3MpIH0KKyAgLnJlbGEuY3RvcnMgICAwIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgMCA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgIDAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgMCA6IHsgKigucmVsYS5ic3MpIH0KKyAgLnJlbGEubGRhdGEgICAwIDogeyAqKC5yZWxhLmxkYXRhKSB9CisgIC5yZWxhLmxic3MgICAgMCA6IHsgKigucmVsYS5sYnNzKSB9CisgIC5yZWxhLmxyb2RhdGEgMCA6IHsgKigucmVsYS5scm9kYXRhKSB9CisgIC5yZWxhLmlmdW5jICAgMCA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgIDAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAwIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAwIDoKKyAgeworICAgICooLnRleHQgLnN0dWIpCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgLnJvZGF0YSAgICAgICAwIDogeyAqKC5yb2RhdGEpIH0KKyAgLnJvZGF0YTEgICAgICAwIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgMCA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJMCA6IHsgKigudGRhdGEpIH0KKyAgLnRic3MJCTAgOiB7ICooLnRic3MpIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAwIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5qY3IgICAgICAgICAgMCA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZHluYW1pYyAgICAgIDAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAwIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLmdvdC5wbHQgICAgICAwIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAwIDoKKyAgeworICAgICooLmRhdGEpCisgIH0KKyAgLmRhdGExICAgICAgICAwIDogeyAqKC5kYXRhMSkgfQorICAuYnNzICAgICAgICAgIDAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgIH0KKyAgLmxic3MgMCA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MpCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLmxyb2RhdGEgMCAgOgorICB7CisgICAgKigubHJvZGF0YSkKKyAgfQorICAubGRhdGEgMCAgOgorICB7CisgICAgKigubGRhdGEpCisgIH0KKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhzIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTgwODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueHMKQEAgLTAsMCArMSwyMTYgQEAKKy8qIFNjcmlwdCBmb3IgbGQgLS1zaGFyZWQ6IGxpbmsgc2hhcmVkIGxpYnJhcnkgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLXg4Ni02NCIsICJlbGYzMi14ODYtNjQiLAorCSAgICAgICJlbGYzMi14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4NjQtMzIpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlmdW5jICAgICA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54c2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueHNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzAwOTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueHNjCkBAIC0wLDAgKzEsMjE5IEBACisvKiBTY3JpcHQgZm9yIC0tc2hhcmVkIC16IGNvbWJyZWxvYzogc2hhcmVkIGxpYnJhcnksIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworLyogTW9kaWZpZWQgZm9yIEFuZHJvaWQuICAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzIteDg2LTY0IiwgImVsZjMyLXg4Ni02NCIsCisJICAgICAgImVsZjMyLXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong2NC0zMikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgKigucmVsYS5pZnVuYykKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gMzIgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhzdyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54c3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkNjExYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54c3cKQEAgLTAsMCArMSwyMTcgQEAKKy8qIFNjcmlwdCBmb3IgLS1zaGFyZWQgLXogY29tYnJlbG9jIC16IG5vdyAteiByZWxybzogc2hhcmVkIGxpYnJhcnksIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzIteDg2LTY0IiwgImVsZjMyLXg4Ni02NCIsCisJICAgICAgImVsZjMyLXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong2NC0zMikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgKigucmVsYS5pZnVuYykKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmlnb3QucGx0KSAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDAsIC4pOworICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gMzIgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0Lnh1IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0Lnh1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzhjYzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueHUKQEAgLTAsMCArMSwxNTUgQEAKKy8qIFNjcmlwdCBmb3IgbGQgLVVyOiBsaW5rIHcvb3V0IHJlbG9jYXRpb24sIGRvIGNyZWF0ZSBjb25zdHJ1Y3RvcnMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLXg4Ni02NCIsICJlbGYzMi14ODYtNjQiLAorCSAgICAgICJlbGYzMi14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4NjQtMzIpCisgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCisgIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCisgIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCisgIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuaW50ZXJwICAgICAgIDAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgMCA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgIDAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgMCA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgMCA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgMCA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgMDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yIDA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgIDAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgIDAgOiB7ICooLnJlbGEudGV4dCkgfQorICAucmVsYS5maW5pICAgIDAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgIDAgOiB7ICooLnJlbGEucm9kYXRhKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvIDAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8pIH0KKyAgLnJlbGEuZGF0YSAgICAwIDogeyAqKC5yZWxhLmRhdGEpIH0KKyAgLnJlbGEudGRhdGEJMCA6IHsgKigucmVsYS50ZGF0YSkgfQorICAucmVsYS50YnNzCTAgOiB7ICooLnJlbGEudGJzcykgfQorICAucmVsYS5jdG9ycyAgIDAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAwIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgMCA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAwIDogeyAqKC5yZWxhLmJzcykgfQorICAucmVsYS5sZGF0YSAgIDAgOiB7ICooLnJlbGEubGRhdGEpIH0KKyAgLnJlbGEubGJzcyAgICAwIDogeyAqKC5yZWxhLmxic3MpIH0KKyAgLnJlbGEubHJvZGF0YSAwIDogeyAqKC5yZWxhLmxyb2RhdGEpIH0KKyAgLnJlbGEuaWZ1bmMgICAwIDogeyAqKC5yZWxhLmlmdW5jKSB9CisgIC5yZWxhLnBsdCAgICAgMCA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgIDAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgIDAgOgorICB7CisgICAgKigudGV4dCAuc3R1YikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICAucm9kYXRhICAgICAgIDAgOiB7ICooLnJvZGF0YSkgfQorICAucm9kYXRhMSAgICAgIDAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzIDAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkwIDogeyAqKC50ZGF0YSkgfQorICAudGJzcwkJMCA6IHsgKigudGJzcykgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgIDAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmpjciAgICAgICAgICAwIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5keW5hbWljICAgICAgMCA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgIDAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgIDAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgIDAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgIDAgOiB7ICooLmRhdGExKSB9CisgIC5ic3MgICAgICAgICAgMCA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgfQorICAubGJzcyAwIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcykKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAubHJvZGF0YSAwICA6CisgIHsKKyAgICAqKC5scm9kYXRhKQorICB9CisgIC5sZGF0YSAwICA6CisgIHsKKyAgICAqKC5sZGF0YSkKKyAgfQorICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueHcgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueHcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRkM2I1NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54dwpAQCAtMCwwICsxLDIyNiBAQAorLyogU2NyaXB0IGZvciAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBjb21iaW5lIGFuZCBzb3J0IHJlbG9jIHNlY3Rpb25zICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi14ODYtNjQiLCAiZWxmMzIteDg2LTY0IiwKKwkgICAgICAiZWxmMzIteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDY0LTMyKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlmdW5jKQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTM1MjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54CkBAIC0wLDAgKzEsMjA4IEBACisvKiBEZWZhdWx0IGxpbmtlciBzY3JpcHQsIGZvciBub3JtYWwgZXhlY3V0YWJsZXMgKi8KKy8qIE1vZGlmaWVkIGZvciBBbmRyb2lkLiAgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDA4MDQ4MDAwKTsgLiA9IDB4MDgwNDgwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5pbml0ICAgICAgIDogeyAqKC5yZWwuaW5pdCkgfQorICAucmVsLnRleHQgICAgICAgOiB7ICooLnJlbC50ZXh0IC5yZWwudGV4dC4qIC5yZWwuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsLmZpbmkgICAgICAgOiB7ICooLnJlbC5maW5pKSB9CisgIC5yZWwucm9kYXRhICAgICA6IHsgKigucmVsLnJvZGF0YSAucmVsLnJvZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbC5kYXRhLnJlbC5ybyAucmVsLmRhdGEucmVsLnJvLiogLnJlbC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsLmRhdGEgICAgICAgOiB7ICooLnJlbC5kYXRhIC5yZWwuZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsLnRkYXRhCSAgOiB7ICooLnJlbC50ZGF0YSAucmVsLnRkYXRhLiogLnJlbC5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsLnRic3MJICA6IHsgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsLmN0b3JzICAgICAgOiB7ICooLnJlbC5jdG9ycykgfQorICAucmVsLmR0b3JzICAgICAgOiB7ICooLnJlbC5kdG9ycykgfQorICAucmVsLmdvdCAgICAgICAgOiB7ICooLnJlbC5nb3QpIH0KKyAgLnJlbC5ic3MgICAgICAgIDogeyAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWwuaWZ1bmMgICAgICA6IHsgKigucmVsLmlmdW5jKSB9CisgIC5yZWwucGx0ICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWwuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDEyID8gMTIgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueGJuIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueGJuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMDdlNGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54Ym4KQEAgLTAsMCArMSwyMDUgQEAKKy8qIFNjcmlwdCBmb3IgLU46IG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZTsgZG9uJ3QgYWxpZ24gZGF0YSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4MDgwNDgwMDApOyAuID0gMHgwODA0ODAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmluaXQgICAgICAgOiB7ICooLnJlbC5pbml0KSB9CisgIC5yZWwudGV4dCAgICAgICA6IHsgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWwuZmluaSAgICAgICA6IHsgKigucmVsLmZpbmkpIH0KKyAgLnJlbC5yb2RhdGEgICAgIDogeyAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWwuZGF0YS5yZWwucm8gICA6IHsgKigucmVsLmRhdGEucmVsLnJvIC5yZWwuZGF0YS5yZWwucm8uKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWwuZGF0YSAgICAgICA6IHsgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWwudGRhdGEJICA6IHsgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWwudGJzcwkgIDogeyAqKC5yZWwudGJzcyAucmVsLnRic3MuKiAucmVsLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWwuY3RvcnMgICAgICA6IHsgKigucmVsLmN0b3JzKSB9CisgIC5yZWwuZHRvcnMgICAgICA6IHsgKigucmVsLmR0b3JzKSB9CisgIC5yZWwuZ290ICAgICAgICA6IHsgKigucmVsLmdvdCkgfQorICAucmVsLmJzcyAgICAgICAgOiB7ICooLnJlbC5ic3MgLnJlbC5ic3MuKiAucmVsLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbC5pZnVuYyAgICAgIDogeyAqKC5yZWwuaWZ1bmMpIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbC5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gLjsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueGMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjUxMDk0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueGMKQEAgLTAsMCArMSwyMTAgQEAKKy8qIFNjcmlwdCBmb3IgLXogY29tYnJlbG9jOiBjb21iaW5lIGFuZCBzb3J0IHJlbG9jIHNlY3Rpb25zICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLAorCSAgICAgICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHgwODA0ODAwMCk7IC4gPSAweDA4MDQ4MDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWwuZHluICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLmluaXQpCisgICAgICAqKC5yZWwudGV4dCAucmVsLnRleHQuKiAucmVsLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWwuZmluaSkKKyAgICAgICooLnJlbC5yb2RhdGEgLnJlbC5yb2RhdGEuKiAucmVsLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWwuZGF0YS5yZWwucm8gLnJlbC5kYXRhLnJlbC5yby4qIC5yZWwuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopCisgICAgICAqKC5yZWwuZGF0YSAucmVsLmRhdGEuKiAucmVsLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWwudGRhdGEgLnJlbC50ZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWwudGJzcyAucmVsLnRic3MuKiAucmVsLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsLmN0b3JzKQorICAgICAgKigucmVsLmR0b3JzKQorICAgICAgKigucmVsLmdvdCkKKyAgICAgICooLnJlbC5ic3MgLnJlbC5ic3MuKiAucmVsLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWwuaWZ1bmMpCisgICAgfQorICAucmVsLnBsdCAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAxMiA/IDEyIDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhkIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4NzA4MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhkCkBAIC0wLDAgKzEsMjA3IEBACisvKiBTY3JpcHQgZm9yIGxkIC1waWU6IGxpbmsgcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDApOyAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmluaXQgICAgICAgOiB7ICooLnJlbC5pbml0KSB9CisgIC5yZWwudGV4dCAgICAgICA6IHsgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWwuZmluaSAgICAgICA6IHsgKigucmVsLmZpbmkpIH0KKyAgLnJlbC5yb2RhdGEgICAgIDogeyAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWwuZGF0YS5yZWwucm8gICA6IHsgKigucmVsLmRhdGEucmVsLnJvIC5yZWwuZGF0YS5yZWwucm8uKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWwuZGF0YSAgICAgICA6IHsgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWwudGRhdGEJICA6IHsgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWwudGJzcwkgIDogeyAqKC5yZWwudGJzcyAucmVsLnRic3MuKiAucmVsLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWwuY3RvcnMgICAgICA6IHsgKigucmVsLmN0b3JzKSB9CisgIC5yZWwuZHRvcnMgICAgICA6IHsgKigucmVsLmR0b3JzKSB9CisgIC5yZWwuZ290ICAgICAgICA6IHsgKigucmVsLmdvdCkgfQorICAucmVsLmJzcyAgICAgICAgOiB7ICooLnJlbC5ic3MgLnJlbC5ic3MuKiAucmVsLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbC5pZnVuYyAgICAgIDogeyAqKC5yZWwuaWZ1bmMpIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbC5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMTIgPyAxMiA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54ZGMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54ZGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxMzBhMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhkYwpAQCAtMCwwICsxLDIxMCBAQAorLyogU2NyaXB0IGZvciAtcGllIC16IGNvbWJyZWxvYzogcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLAorCSAgICAgICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMCk7IC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWwuZHluICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLmluaXQpCisgICAgICAqKC5yZWwudGV4dCAucmVsLnRleHQuKiAucmVsLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWwuZmluaSkKKyAgICAgICooLnJlbC5yb2RhdGEgLnJlbC5yb2RhdGEuKiAucmVsLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWwuZGF0YS5yZWwucm8gLnJlbC5kYXRhLnJlbC5yby4qIC5yZWwuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopCisgICAgICAqKC5yZWwuZGF0YSAucmVsLmRhdGEuKiAucmVsLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWwudGRhdGEgLnJlbC50ZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWwudGJzcyAucmVsLnRic3MuKiAucmVsLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsLmN0b3JzKQorICAgICAgKigucmVsLmR0b3JzKQorICAgICAgKigucmVsLmdvdCkKKyAgICAgICooLnJlbC5ic3MgLnJlbC5ic3MuKiAucmVsLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWwuaWZ1bmMpCisgICAgfQorICAucmVsLnBsdCAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAxMiA/IDEyIDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhkdyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhkdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2I5NGFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueGR3CkBAIC0wLDAgKzEsMjA5IEBACisvKiBTY3JpcHQgZm9yIC1waWUgLXogY29tYnJlbG9jIC16IG5vdyAteiByZWxybzogcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLAorCSAgICAgICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMCk7IC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWwuZHluICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLmluaXQpCisgICAgICAqKC5yZWwudGV4dCAucmVsLnRleHQuKiAucmVsLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWwuZmluaSkKKyAgICAgICooLnJlbC5yb2RhdGEgLnJlbC5yb2RhdGEuKiAucmVsLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWwuZGF0YS5yZWwucm8gLnJlbC5kYXRhLnJlbC5yby4qIC5yZWwuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopCisgICAgICAqKC5yZWwuZGF0YSAucmVsLmRhdGEuKiAucmVsLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWwudGRhdGEgLnJlbC50ZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWwudGJzcyAucmVsLnRic3MuKiAucmVsLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsLmN0b3JzKQorICAgICAgKigucmVsLmR0b3JzKQorICAgICAgKigucmVsLmdvdCkKKyAgICAgICooLnJlbC5ic3MgLnJlbC5ic3MuKiAucmVsLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWwuaWZ1bmMpCisgICAgfQorICAucmVsLnBsdCAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguaWdvdC5wbHQpICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMCwgLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhuIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxYzhiOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhuCkBAIC0wLDAgKzEsMjA3IEBACisvKiBTY3JpcHQgZm9yIC1uOiBtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2UgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDA4MDQ4MDAwKTsgLiA9IDB4MDgwNDgwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5pbml0ICAgICAgIDogeyAqKC5yZWwuaW5pdCkgfQorICAucmVsLnRleHQgICAgICAgOiB7ICooLnJlbC50ZXh0IC5yZWwudGV4dC4qIC5yZWwuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsLmZpbmkgICAgICAgOiB7ICooLnJlbC5maW5pKSB9CisgIC5yZWwucm9kYXRhICAgICA6IHsgKigucmVsLnJvZGF0YSAucmVsLnJvZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbC5kYXRhLnJlbC5ybyAucmVsLmRhdGEucmVsLnJvLiogLnJlbC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsLmRhdGEgICAgICAgOiB7ICooLnJlbC5kYXRhIC5yZWwuZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsLnRkYXRhCSAgOiB7ICooLnJlbC50ZGF0YSAucmVsLnRkYXRhLiogLnJlbC5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsLnRic3MJICA6IHsgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsLmN0b3JzICAgICAgOiB7ICooLnJlbC5jdG9ycykgfQorICAucmVsLmR0b3JzICAgICAgOiB7ICooLnJlbC5kdG9ycykgfQorICAucmVsLmdvdCAgICAgICAgOiB7ICooLnJlbC5nb3QpIH0KKyAgLnJlbC5ic3MgICAgICAgIDogeyAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWwuaWZ1bmMgICAgICA6IHsgKigucmVsLmlmdW5jKSB9CisgIC5yZWwucGx0ICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWwuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDEyID8gMTIgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHIgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjBlOTYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHIKQEAgLTAsMCArMSwxMzcgQEAKKy8qIFNjcmlwdCBmb3IgbGQgLXI6IGxpbmsgd2l0aG91dCByZWxvY2F0aW9uICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLAorCSAgICAgICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCisgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCisgIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCisgIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCisgIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuaW50ZXJwICAgICAgIDAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgMCA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgIDAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgMCA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgMCA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgMCA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgMDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yIDA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmluaXQgICAgIDAgOiB7ICooLnJlbC5pbml0KSB9CisgIC5yZWwudGV4dCAgICAgMCA6IHsgKigucmVsLnRleHQpIH0KKyAgLnJlbC5maW5pICAgICAwIDogeyAqKC5yZWwuZmluaSkgfQorICAucmVsLnJvZGF0YSAgIDAgOiB7ICooLnJlbC5yb2RhdGEpIH0KKyAgLnJlbC5kYXRhLnJlbC5ybyAwIDogeyAqKC5yZWwuZGF0YS5yZWwucm8pIH0KKyAgLnJlbC5kYXRhICAgICAwIDogeyAqKC5yZWwuZGF0YSkgfQorICAucmVsLnRkYXRhCTAgOiB7ICooLnJlbC50ZGF0YSkgfQorICAucmVsLnRic3MJMCA6IHsgKigucmVsLnRic3MpIH0KKyAgLnJlbC5jdG9ycyAgICAwIDogeyAqKC5yZWwuY3RvcnMpIH0KKyAgLnJlbC5kdG9ycyAgICAwIDogeyAqKC5yZWwuZHRvcnMpIH0KKyAgLnJlbC5nb3QgICAgICAwIDogeyAqKC5yZWwuZ290KSB9CisgIC5yZWwuYnNzICAgICAgMCA6IHsgKigucmVsLmJzcykgfQorICAucmVsLmlmdW5jICAgIDAgOiB7ICooLnJlbC5pZnVuYykgfQorICAucmVsLnBsdCAgICAgIDAgOgorICAgIHsKKyAgICAgICooLnJlbC5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgIDAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgIDAgOgorICB7CisgICAgKigudGV4dCAuc3R1YikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICAucm9kYXRhICAgICAgIDAgOiB7ICooLnJvZGF0YSkgfQorICAucm9kYXRhMSAgICAgIDAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzIDAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkwIDogeyAqKC50ZGF0YSkgfQorICAudGJzcwkJMCA6IHsgKigudGJzcykgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgIDAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmpjciAgICAgICAgICAwIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5keW5hbWljICAgICAgMCA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgIDAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgIDAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgIDAgOgorICB7CisgICAgKiguZGF0YSkKKyAgfQorICAuZGF0YTEgICAgICAgIDAgOiB7ICooLmRhdGExKSB9CisgIC5ic3MgICAgICAgICAgMCA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgfQorICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54cyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZjQ0MGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54cwpAQCAtMCwwICsxLDE5OCBAQAorLyogU2NyaXB0IGZvciBsZCAtLXNoYXJlZDogbGluayBzaGFyZWQgbGlicmFyeSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWwuaW5pdCAgICAgICA6IHsgKigucmVsLmluaXQpIH0KKyAgLnJlbC50ZXh0ICAgICAgIDogeyAqKC5yZWwudGV4dCAucmVsLnRleHQuKiAucmVsLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbC5maW5pICAgICAgIDogeyAqKC5yZWwuZmluaSkgfQorICAucmVsLnJvZGF0YSAgICAgOiB7ICooLnJlbC5yb2RhdGEgLnJlbC5yb2RhdGEuKiAucmVsLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbC5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWwuZGF0YS5yZWwucm8gLnJlbC5kYXRhLnJlbC5yby4qIC5yZWwuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbC5kYXRhICAgICAgIDogeyAqKC5yZWwuZGF0YSAucmVsLmRhdGEuKiAucmVsLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbC50ZGF0YQkgIDogeyAqKC5yZWwudGRhdGEgLnJlbC50ZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbC50YnNzCSAgOiB7ICooLnJlbC50YnNzIC5yZWwudGJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbC5jdG9ycyAgICAgIDogeyAqKC5yZWwuY3RvcnMpIH0KKyAgLnJlbC5kdG9ycyAgICAgIDogeyAqKC5yZWwuZHRvcnMpIH0KKyAgLnJlbC5nb3QgICAgICAgIDogeyAqKC5yZWwuZ290KSB9CisgIC5yZWwuYnNzICAgICAgICA6IHsgKigucmVsLmJzcyAucmVsLmJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsLmlmdW5jICAgICAgOiB7ICooLnJlbC5pZnVuYykgfQorICAucmVsLnBsdCAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5wbHQpCisgICAgICAqKC5yZWwuaXBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAxMiA/IDEyIDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhzYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjZkZGFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHNjCkBAIC0wLDAgKzEsMjAyIEBACisvKiBTY3JpcHQgZm9yIC0tc2hhcmVkIC16IGNvbWJyZWxvYzogc2hhcmVkIGxpYnJhcnksIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworLyogTW9kaWZpZWQgZm9yIEFuZHJvaWQuICAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWwuZHluICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLmluaXQpCisgICAgICAqKC5yZWwudGV4dCAucmVsLnRleHQuKiAucmVsLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWwuZmluaSkKKyAgICAgICooLnJlbC5yb2RhdGEgLnJlbC5yb2RhdGEuKiAucmVsLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWwuZGF0YS5yZWwucm8gLnJlbC5kYXRhLnJlbC5yby4qIC5yZWwuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopCisgICAgICAqKC5yZWwuZGF0YSAucmVsLmRhdGEuKiAucmVsLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWwudGRhdGEgLnJlbC50ZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWwudGJzcyAucmVsLnRic3MuKiAucmVsLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsLmN0b3JzKQorICAgICAgKigucmVsLmR0b3JzKQorICAgICAgKigucmVsLmdvdCkKKyAgICAgICooLnJlbC5ic3MgLnJlbC5ic3MuKiAucmVsLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWwuaWZ1bmMpCisgICAgfQorICAucmVsLnBsdCAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5wbHQpCisgICAgICAqKC5yZWwuaXBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAxMiA/IDEyIDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhzdyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhzdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTcyNjlkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHN3CkBAIC0wLDAgKzEsMjAwIEBACisvKiBTY3JpcHQgZm9yIC0tc2hhcmVkIC16IGNvbWJyZWxvYyAteiBub3cgLXogcmVscm86IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmR5biAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5pbml0KQorICAgICAgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsLmZpbmkpCisgICAgICAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsLmRhdGEucmVsLnJvIC5yZWwuZGF0YS5yZWwucm8uKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKQorICAgICAgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbC5jdG9ycykKKyAgICAgICooLnJlbC5kdG9ycykKKyAgICAgICooLnJlbC5nb3QpCisgICAgICAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsLmlmdW5jKQorICAgIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgKigucmVsLmlwbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmlnb3QucGx0KSAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDAsIC4pOworICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54dSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2Lnh1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYjVmMmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54dQpAQCAtMCwwICsxLDEzOCBAQAorLyogU2NyaXB0IGZvciBsZCAtVXI6IGxpbmsgdy9vdXQgcmVsb2NhdGlvbiwgZG8gY3JlYXRlIGNvbnN0cnVjdG9ycyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcworICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZworICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAorICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLmludGVycCAgICAgICAwIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgIDAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAwIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgIDAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgIDAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gIDAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kIDA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAwOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5pbml0ICAgICAwIDogeyAqKC5yZWwuaW5pdCkgfQorICAucmVsLnRleHQgICAgIDAgOiB7ICooLnJlbC50ZXh0KSB9CisgIC5yZWwuZmluaSAgICAgMCA6IHsgKigucmVsLmZpbmkpIH0KKyAgLnJlbC5yb2RhdGEgICAwIDogeyAqKC5yZWwucm9kYXRhKSB9CisgIC5yZWwuZGF0YS5yZWwucm8gMCA6IHsgKigucmVsLmRhdGEucmVsLnJvKSB9CisgIC5yZWwuZGF0YSAgICAgMCA6IHsgKigucmVsLmRhdGEpIH0KKyAgLnJlbC50ZGF0YQkwIDogeyAqKC5yZWwudGRhdGEpIH0KKyAgLnJlbC50YnNzCTAgOiB7ICooLnJlbC50YnNzKSB9CisgIC5yZWwuY3RvcnMgICAgMCA6IHsgKigucmVsLmN0b3JzKSB9CisgIC5yZWwuZHRvcnMgICAgMCA6IHsgKigucmVsLmR0b3JzKSB9CisgIC5yZWwuZ290ICAgICAgMCA6IHsgKigucmVsLmdvdCkgfQorICAucmVsLmJzcyAgICAgIDAgOiB7ICooLnJlbC5ic3MpIH0KKyAgLnJlbC5pZnVuYyAgICAwIDogeyAqKC5yZWwuaWZ1bmMpIH0KKyAgLnJlbC5wbHQgICAgICAwIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAwIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAwIDoKKyAgeworICAgICooLnRleHQgLnN0dWIpCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgLnJvZGF0YSAgICAgICAwIDogeyAqKC5yb2RhdGEpIH0KKyAgLnJvZGF0YTEgICAgICAwIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgMCA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJMCA6IHsgKigudGRhdGEpIH0KKyAgLnRic3MJCTAgOiB7ICooLnRic3MpIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAwIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5qY3IgICAgICAgICAgMCA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZHluYW1pYyAgICAgIDAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAwIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLmdvdC5wbHQgICAgICAwIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAwIDoKKyAgeworICAgICooLmRhdGEpCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAwIDogeyAqKC5kYXRhMSkgfQorICAuYnNzICAgICAgICAgIDAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgIH0KKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHcgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54dwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTlhNmY2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHcKQEAgLTAsMCArMSwyMDkgQEAKKy8qIFNjcmlwdCBmb3IgLXogY29tYnJlbG9jIC16IG5vdyAteiByZWxybzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4MDgwNDgwMDApOyAuID0gMHgwODA0ODAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmR5biAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5pbml0KQorICAgICAgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsLmZpbmkpCisgICAgICAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsLmRhdGEucmVsLnJvIC5yZWwuZGF0YS5yZWwucm8uKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKQorICAgICAgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbC5jdG9ycykKKyAgICAgICooLnJlbC5kdG9ycykKKyAgICAgICooLnJlbC5nb3QpCisgICAgICAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsLmlmdW5jKQorICAgIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbC5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmlnb3QucGx0KSAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDAsIC4pOworICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjc0ZjQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueApAQCAtMCwwICsxLDIyOSBAQAorLyogRGVmYXVsdCBsaW5rZXIgc2NyaXB0LCBmb3Igbm9ybWFsIGV4ZWN1dGFibGVzICovCisvKiBNb2RpZmllZCBmb3IgQW5kcm9pZC4gICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1rMW9tIiwgImVsZjY0LWsxb20iLAorCSAgICAgICJlbGY2NC1rMW9tIikKK09VVFBVVF9BUkNIKGsxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHg0MDAwMDApOyAuID0gMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlwbHQgICAgICA6CisgICAgeworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueGJuIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueGJuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZTMyZmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54Ym4KQEAgLTAsMCArMSwyMjYgQEAKKy8qIFNjcmlwdCBmb3IgLU46IG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZTsgZG9uJ3QgYWxpZ24gZGF0YSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtazFvbSIsICJlbGY2NC1rMW9tIiwKKwkgICAgICAiZWxmNjQtazFvbSIpCitPVVRQVVRfQVJDSChrMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvIC5yZWxhLmRhdGEucmVsLnJvLiogLnJlbGEuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbGEuZGF0YSAgICAgIDogeyAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbGEudGRhdGEJICA6IHsgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWxhLnRic3MJICA6IHsgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsYS5jdG9ycyAgICAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAgIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgICA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAgIDogeyAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWxhLmxkYXRhICAgICA6IHsgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopIH0KKyAgLnJlbGEubGJzcyAgICAgIDogeyAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKSB9CisgIC5yZWxhLmxyb2RhdGEgICA6IHsgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikgfQorICAucmVsYS5pcGx0ICAgICAgOgorICAgIHsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gLjsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0Y2QzNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhjCkBAIC0wLDAgKzEsMjI5IEBACisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtazFvbSIsICJlbGY2NC1rMW9tIiwKKwkgICAgICAiZWxmNjQtazFvbSIpCitPVVRQVVRfQVJDSChrMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9zdGFydCA9IC4pOworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54ZCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NjU2NDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54ZApAQCAtMCwwICsxLDIyOCBAQAorLyogU2NyaXB0IGZvciBsZCAtcGllOiBsaW5rIHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWsxb20iLCAiZWxmNjQtazFvbSIsCisJICAgICAgImVsZjY0LWsxb20iKQorT1VUUFVUX0FSQ0goazFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAwKTsgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlwbHQgICAgICA6CisgICAgeworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueGRjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueGRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMDNkZDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54ZGMKQEAgLTAsMCArMSwyMjkgQEAKKy8qIFNjcmlwdCBmb3IgLXBpZSAteiBjb21icmVsb2M6IHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUsIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtazFvbSIsICJlbGY2NC1rMW9tIiwKKwkgICAgICAiZWxmNjQtazFvbSIpCitPVVRQVVRfQVJDSChrMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDApOyAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueGR3IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueGR3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYzg3NTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54ZHcKQEAgLTAsMCArMSwyMjggQEAKKy8qIFNjcmlwdCBmb3IgLXBpZSAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlLCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWsxb20iLCAiZWxmNjQtazFvbSIsCisJICAgICAgImVsZjY0LWsxb20iKQorT1VUUFVUX0FSQ0goazFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAwKTsgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9lbmQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhuIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFkNzM0MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhuCkBAIC0wLDAgKzEsMjI4IEBACisvKiBTY3JpcHQgZm9yIC1uOiBtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2UgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWsxb20iLCAiZWxmNjQtazFvbSIsCisJICAgICAgImVsZjY0LWsxb20iKQorT1VUUFVUX0FSQ0goazFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDQwMDAwMCk7IC4gPSAweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyAucmVsYS5kYXRhLnJlbC5yby4qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaXBsdCAgICAgIDoKKyAgICB7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54ciBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNWVkODcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54cgpAQCAtMCwwICsxLDE1OCBAQAorLyogU2NyaXB0IGZvciBsZCAtcjogbGluayB3aXRob3V0IHJlbG9jYXRpb24gKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWsxb20iLCAiZWxmNjQtazFvbSIsCisJICAgICAgImVsZjY0LWsxb20iKQorT1VUUFVUX0FSQ0goazFvbSkKKyAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKKyAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKKyAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKKyAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC5pbnRlcnAgICAgICAgMCA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAwIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgMCA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAwIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAwIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAwIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAwOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgMDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgMCA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgMCA6IHsgKigucmVsYS50ZXh0KSB9CisgIC5yZWxhLmZpbmkgICAgMCA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgMCA6IHsgKigucmVsYS5yb2RhdGEpIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gMCA6IHsgKigucmVsYS5kYXRhLnJlbC5ybykgfQorICAucmVsYS5kYXRhICAgIDAgOiB7ICooLnJlbGEuZGF0YSkgfQorICAucmVsYS50ZGF0YQkwIDogeyAqKC5yZWxhLnRkYXRhKSB9CisgIC5yZWxhLnRic3MJMCA6IHsgKigucmVsYS50YnNzKSB9CisgIC5yZWxhLmN0b3JzICAgMCA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgIDAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAwIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgIDAgOiB7ICooLnJlbGEuYnNzKSB9CisgIC5yZWxhLmxkYXRhICAgMCA6IHsgKigucmVsYS5sZGF0YSkgfQorICAucmVsYS5sYnNzICAgIDAgOiB7ICooLnJlbGEubGJzcykgfQorICAucmVsYS5scm9kYXRhIDAgOiB7ICooLnJlbGEubHJvZGF0YSkgfQorICAucmVsYS5pcGx0ICAgIDAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgMCA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgIDAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgIDAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAwIDoKKyAgeworICAgICooLnRleHQgLnN0dWIpCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgLnJvZGF0YSAgICAgICAwIDogeyAqKC5yb2RhdGEpIH0KKyAgLnJvZGF0YTEgICAgICAwIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgMCA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJMCA6IHsgKigudGRhdGEpIH0KKyAgLnRic3MJCTAgOiB7ICooLnRic3MpIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAwIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5qY3IgICAgICAgICAgMCA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZHluYW1pYyAgICAgIDAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAwIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLmdvdC5wbHQgICAgICAwIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAwIDoKKyAgeworICAgICooLmRhdGEpCisgIH0KKyAgLmRhdGExICAgICAgICAwIDogeyAqKC5kYXRhMSkgfQorICAuYnNzICAgICAgICAgIDAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgIH0KKyAgLmxic3MgMCA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MpCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLmxyb2RhdGEgMCAgOgorICB7CisgICAgKigubHJvZGF0YSkKKyAgfQorICAubGRhdGEgMCAgOgorICB7CisgICAgKigubGRhdGEpCisgIH0KKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTkyZjVmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHMKQEAgLTAsMCArMSwyMTkgQEAKKy8qIFNjcmlwdCBmb3IgbGQgLS1zaGFyZWQ6IGxpbmsgc2hhcmVkIGxpYnJhcnkgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWsxb20iLCAiZWxmNjQtazFvbSIsCisJICAgICAgImVsZjY0LWsxb20iKQorT1VUUFVUX0FSQ0goazFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyAucmVsYS5kYXRhLnJlbC5yby4qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaXBsdCAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNmU1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54c2MKQEAgLTAsMCArMSwyMTkgQEAKKy8qIFNjcmlwdCBmb3IgLS1zaGFyZWQgLXogY29tYnJlbG9jOiBzaGFyZWQgbGlicmFyeSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCisvKiBNb2RpZmllZCBmb3IgQW5kcm9pZC4gICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1rMW9tIiwgImVsZjY0LWsxb20iLAorCSAgICAgICJlbGY2NC1rMW9tIikKK09VVFBVVF9BUkNIKGsxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54c3cgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54c3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmM2RmNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhzdwpAQCAtMCwwICsxLDIxNyBAQAorLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBzaGFyZWQgbGlicmFyeSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1rMW9tIiwgImVsZjY0LWsxb20iLAorCSAgICAgICJlbGY2NC1rMW9tIikKK09VVFBVVF9BUkNIKGsxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguaWdvdC5wbHQpICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMCwgLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54dSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnh1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYmVjNzEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54dQpAQCAtMCwwICsxLDE1OSBAQAorLyogU2NyaXB0IGZvciBsZCAtVXI6IGxpbmsgdy9vdXQgcmVsb2NhdGlvbiwgZG8gY3JlYXRlIGNvbnN0cnVjdG9ycyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtazFvbSIsICJlbGY2NC1rMW9tIiwKKwkgICAgICAiZWxmNjQtazFvbSIpCitPVVRQVVRfQVJDSChrMW9tKQorIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcworICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZworICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAorICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLmludGVycCAgICAgICAwIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgIDAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAwIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgIDAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgIDAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gIDAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kIDA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAwOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAwIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAwIDogeyAqKC5yZWxhLnRleHQpIH0KKyAgLnJlbGEuZmluaSAgICAwIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAwIDogeyAqKC5yZWxhLnJvZGF0YSkgfQorICAucmVsYS5kYXRhLnJlbC5ybyAwIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvKSB9CisgIC5yZWxhLmRhdGEgICAgMCA6IHsgKigucmVsYS5kYXRhKSB9CisgIC5yZWxhLnRkYXRhCTAgOiB7ICooLnJlbGEudGRhdGEpIH0KKyAgLnJlbGEudGJzcwkwIDogeyAqKC5yZWxhLnRic3MpIH0KKyAgLnJlbGEuY3RvcnMgICAwIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgMCA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgIDAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgMCA6IHsgKigucmVsYS5ic3MpIH0KKyAgLnJlbGEubGRhdGEgICAwIDogeyAqKC5yZWxhLmxkYXRhKSB9CisgIC5yZWxhLmxic3MgICAgMCA6IHsgKigucmVsYS5sYnNzKSB9CisgIC5yZWxhLmxyb2RhdGEgMCA6IHsgKigucmVsYS5scm9kYXRhKSB9CisgIC5yZWxhLmlwbHQgICAgMCA6CisgICAgeworICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAwIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgMCA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgMCA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgIDAgOgorICB7CisgICAgKigudGV4dCAuc3R1YikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICAucm9kYXRhICAgICAgIDAgOiB7ICooLnJvZGF0YSkgfQorICAucm9kYXRhMSAgICAgIDAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzIDAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkwIDogeyAqKC50ZGF0YSkgfQorICAudGJzcwkJMCA6IHsgKigudGJzcykgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgIDAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmpjciAgICAgICAgICAwIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5keW5hbWljICAgICAgMCA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgIDAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgIDAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgIDAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgIDAgOiB7ICooLmRhdGExKSB9CisgIC5ic3MgICAgICAgICAgMCA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgfQorICAubGJzcyAwIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcykKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAubHJvZGF0YSAwICA6CisgIHsKKyAgICAqKC5scm9kYXRhKQorICB9CisgIC5sZGF0YSAwICA6CisgIHsKKyAgICAqKC5sZGF0YSkKKyAgfQorICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54dyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnh3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZmY5NmEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54dwpAQCAtMCwwICsxLDIyOCBAQAorLyogU2NyaXB0IGZvciAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBjb21iaW5lIGFuZCBzb3J0IHJlbG9jIHNlY3Rpb25zICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1rMW9tIiwgImVsZjY0LWsxb20iLAorCSAgICAgICJlbGY2NC1rMW9tIikKK09VVFBVVF9BUkNIKGsxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHg0MDAwMDApOyAuID0gMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9lbmQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnggYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MjAzMTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54CkBAIC0wLDAgKzEsMjI5IEBACisvKiBEZWZhdWx0IGxpbmtlciBzY3JpcHQsIGZvciBub3JtYWwgZXhlY3V0YWJsZXMgKi8KKy8qIE1vZGlmaWVkIGZvciBBbmRyb2lkLiAgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWwxb20iLCAiZWxmNjQtbDFvbSIsCisJICAgICAgImVsZjY0LWwxb20iKQorT1VUUFVUX0FSQ0gobDFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDQwMDAwMCk7IC4gPSAweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyAucmVsYS5kYXRhLnJlbC5yby4qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaXBsdCAgICAgIDoKKyAgICB7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54Ym4gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54Ym4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmNDlkMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhibgpAQCAtMCwwICsxLDIyNiBAQAorLyogU2NyaXB0IGZvciAtTjogbWl4IHRleHQgYW5kIGRhdGEgb24gc2FtZSBwYWdlOyBkb24ndCBhbGlnbiBkYXRhICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1sMW9tIiwgImVsZjY0LWwxb20iLAorCSAgICAgICJlbGY2NC1sMW9tIikKK09VVFBVVF9BUkNIKGwxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHg0MDAwMDApOyAuID0gMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlwbHQgICAgICA6CisgICAgeworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSAuOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDQ2ZDNhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGMKQEAgLTAsMCArMSwyMjkgQEAKKy8qIFNjcmlwdCBmb3IgLXogY29tYnJlbG9jOiBjb21iaW5lIGFuZCBzb3J0IHJlbG9jIHNlY3Rpb25zICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1sMW9tIiwgImVsZjY0LWwxb20iLAorCSAgICAgICJlbGY2NC1sMW9tIikKK09VVFBVVF9BUkNIKGwxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHg0MDAwMDApOyAuID0gMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9lbmQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhkIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcyOWM3ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhkCkBAIC0wLDAgKzEsMjI4IEBACisvKiBTY3JpcHQgZm9yIGxkIC1waWU6IGxpbmsgcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDApOyAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyAucmVsYS5kYXRhLnJlbC5yby4qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaXBsdCAgICAgIDoKKyAgICB7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54ZGMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54ZGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRhZjM3YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhkYwpAQCAtMCwwICsxLDIyOSBAQAorLyogU2NyaXB0IGZvciAtcGllIC16IGNvbWJyZWxvYzogcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1sMW9tIiwgImVsZjY0LWwxb20iLAorCSAgICAgICJlbGY2NC1sMW9tIikKK09VVFBVVF9BUkNIKGwxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMCk7IC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9zdGFydCA9IC4pOworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54ZHcgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54ZHcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlZDE1ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhkdwpAQCAtMCwwICsxLDIyOCBAQAorLyogU2NyaXB0IGZvciAtcGllIC16IGNvbWJyZWxvYyAteiBub3cgLXogcmVscm86IHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUsIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDApOyAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmlnb3QucGx0KSAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDAsIC4pOworICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueG4gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjQzZmQwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueG4KQEAgLTAsMCArMSwyMjggQEAKKy8qIFNjcmlwdCBmb3IgLW46IG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvIC5yZWxhLmRhdGEucmVsLnJvLiogLnJlbGEuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbGEuZGF0YSAgICAgIDogeyAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbGEudGRhdGEJICA6IHsgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWxhLnRic3MJICA6IHsgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsYS5jdG9ycyAgICAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAgIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgICA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAgIDogeyAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWxhLmxkYXRhICAgICA6IHsgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopIH0KKyAgLnJlbGEubGJzcyAgICAgIDogeyAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKSB9CisgIC5yZWxhLmxyb2RhdGEgICA6IHsgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikgfQorICAucmVsYS5pcGx0ICAgICAgOgorICAgIHsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhyIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkNWVhYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhyCkBAIC0wLDAgKzEsMTU4IEBACisvKiBTY3JpcHQgZm9yIGxkIC1yOiBsaW5rIHdpdGhvdXQgcmVsb2NhdGlvbiAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcworICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZworICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAorICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLmludGVycCAgICAgICAwIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgIDAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAwIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgIDAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgIDAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gIDAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kIDA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAwOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAwIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAwIDogeyAqKC5yZWxhLnRleHQpIH0KKyAgLnJlbGEuZmluaSAgICAwIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAwIDogeyAqKC5yZWxhLnJvZGF0YSkgfQorICAucmVsYS5kYXRhLnJlbC5ybyAwIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvKSB9CisgIC5yZWxhLmRhdGEgICAgMCA6IHsgKigucmVsYS5kYXRhKSB9CisgIC5yZWxhLnRkYXRhCTAgOiB7ICooLnJlbGEudGRhdGEpIH0KKyAgLnJlbGEudGJzcwkwIDogeyAqKC5yZWxhLnRic3MpIH0KKyAgLnJlbGEuY3RvcnMgICAwIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgMCA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgIDAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgMCA6IHsgKigucmVsYS5ic3MpIH0KKyAgLnJlbGEubGRhdGEgICAwIDogeyAqKC5yZWxhLmxkYXRhKSB9CisgIC5yZWxhLmxic3MgICAgMCA6IHsgKigucmVsYS5sYnNzKSB9CisgIC5yZWxhLmxyb2RhdGEgMCA6IHsgKigucmVsYS5scm9kYXRhKSB9CisgIC5yZWxhLmlwbHQgICAgMCA6CisgICAgeworICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAwIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgMCA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgMCA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgIDAgOgorICB7CisgICAgKigudGV4dCAuc3R1YikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICAucm9kYXRhICAgICAgIDAgOiB7ICooLnJvZGF0YSkgfQorICAucm9kYXRhMSAgICAgIDAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzIDAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkwIDogeyAqKC50ZGF0YSkgfQorICAudGJzcwkJMCA6IHsgKigudGJzcykgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgIDAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmpjciAgICAgICAgICAwIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5keW5hbWljICAgICAgMCA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgIDAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgIDAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgIDAgOgorICB7CisgICAgKiguZGF0YSkKKyAgfQorICAuZGF0YTEgICAgICAgIDAgOiB7ICooLmRhdGExKSB9CisgIC5ic3MgICAgICAgICAgMCA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgfQorICAubGJzcyAwIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcykKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAubHJvZGF0YSAwICA6CisgIHsKKyAgICAqKC5scm9kYXRhKQorICB9CisgIC5sZGF0YSAwICA6CisgIHsKKyAgICAqKC5sZGF0YSkKKyAgfQorICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54cyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNTlkNDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54cwpAQCAtMCwwICsxLDIxOSBAQAorLyogU2NyaXB0IGZvciBsZCAtLXNoYXJlZDogbGluayBzaGFyZWQgbGlicmFyeSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvIC5yZWxhLmRhdGEucmVsLnJvLiogLnJlbGEuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbGEuZGF0YSAgICAgIDogeyAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbGEudGRhdGEJICA6IHsgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWxhLnRic3MJICA6IHsgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsYS5jdG9ycyAgICAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAgIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgICA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAgIDogeyAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWxhLmxkYXRhICAgICA6IHsgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopIH0KKyAgLnJlbGEubGJzcyAgICAgIDogeyAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKSB9CisgIC5yZWxhLmxyb2RhdGEgICA6IHsgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikgfQorICAucmVsYS5pcGx0ICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54c2MgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54c2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiZGMxMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhzYwpAQCAtMCwwICsxLDIxOSBAQAorLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2M6IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KKy8qIE1vZGlmaWVkIGZvciBBbmRyb2lkLiAgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWwxb20iLCAiZWxmNjQtbDFvbSIsCisJICAgICAgImVsZjY0LWwxb20iKQorT1VUUFVUX0FSQ0gobDFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhzdyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhzdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDg1NmRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueHN3CkBAIC0wLDAgKzEsMjE3IEBACisvKiBTY3JpcHQgZm9yIC0tc2hhcmVkIC16IGNvbWJyZWxvYyAteiBub3cgLXogcmVscm86IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWwxb20iLCAiZWxmNjQtbDFvbSIsCisJICAgICAgImVsZjY0LWwxb20iKQorT1VUUFVUX0FSQ0gobDFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnh1IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueHUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzZGZiZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnh1CkBAIC0wLDAgKzEsMTU5IEBACisvKiBTY3JpcHQgZm9yIGxkIC1VcjogbGluayB3L291dCByZWxvY2F0aW9uLCBkbyBjcmVhdGUgY29uc3RydWN0b3JzICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1sMW9tIiwgImVsZjY0LWwxb20iLAorCSAgICAgICJlbGY2NC1sMW9tIikKK09VVFBVVF9BUkNIKGwxb20pCisgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCisgIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCisgIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCisgIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuaW50ZXJwICAgICAgIDAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgMCA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgIDAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgMCA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgMCA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgMCA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgMDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yIDA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgIDAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgIDAgOiB7ICooLnJlbGEudGV4dCkgfQorICAucmVsYS5maW5pICAgIDAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgIDAgOiB7ICooLnJlbGEucm9kYXRhKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvIDAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8pIH0KKyAgLnJlbGEuZGF0YSAgICAwIDogeyAqKC5yZWxhLmRhdGEpIH0KKyAgLnJlbGEudGRhdGEJMCA6IHsgKigucmVsYS50ZGF0YSkgfQorICAucmVsYS50YnNzCTAgOiB7ICooLnJlbGEudGJzcykgfQorICAucmVsYS5jdG9ycyAgIDAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAwIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgMCA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAwIDogeyAqKC5yZWxhLmJzcykgfQorICAucmVsYS5sZGF0YSAgIDAgOiB7ICooLnJlbGEubGRhdGEpIH0KKyAgLnJlbGEubGJzcyAgICAwIDogeyAqKC5yZWxhLmxic3MpIH0KKyAgLnJlbGEubHJvZGF0YSAwIDogeyAqKC5yZWxhLmxyb2RhdGEpIH0KKyAgLnJlbGEuaXBsdCAgICAwIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgfQorICAucmVsYS5wbHQgICAgIDAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAwIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAwIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgMCA6CisgIHsKKyAgICAqKC50ZXh0IC5zdHViKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIC5yb2RhdGEgICAgICAgMCA6IHsgKigucm9kYXRhKSB9CisgIC5yb2RhdGExICAgICAgMCA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzIDAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgMCA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCTAgOiB7ICooLnRkYXRhKSB9CisgIC50YnNzCQkwIDogeyAqKC50YnNzKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgMCA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuamNyICAgICAgICAgIDAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmR5bmFtaWMgICAgICAwIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgMCA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC5nb3QucGx0ICAgICAgMCA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgMCA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgMCA6IHsgKiguZGF0YTEpIH0KKyAgLmJzcyAgICAgICAgICAwIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICB9CisgIC5sYnNzIDAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC5scm9kYXRhIDAgIDoKKyAgeworICAgICooLmxyb2RhdGEpCisgIH0KKyAgLmxkYXRhIDAgIDoKKyAgeworICAgICooLmxkYXRhKQorICB9CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnh3IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueHcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxNTFhNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnh3CkBAIC0wLDAgKzEsMjI4IEBACisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYyAteiBub3cgLXogcmVscm86IGNvbWJpbmUgYW5kIHNvcnQgcmVsb2Mgc2VjdGlvbnMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWwxb20iLCAiZWxmNjQtbDFvbSIsCisJICAgICAgImVsZjY0LWwxb20iKQorT1VUUFVUX0FSQ0gobDFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDQwMDAwMCk7IC4gPSAweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmlnb3QucGx0KSAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDAsIC4pOworICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjFmYjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LngKQEAgLTAsMCArMSwyMjYgQEAKKy8qIERlZmF1bHQgbGlua2VyIHNjcmlwdCwgZm9yIG5vcm1hbCBleGVjdXRhYmxlcyAqLworLyogTW9kaWZpZWQgZm9yIEFuZHJvaWQuICAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsCisJICAgICAgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDQwMDAwMCk7IC4gPSAweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyAucmVsYS5kYXRhLnJlbC5yby4qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaWZ1bmMgICAgIDogeyAqKC5yZWxhLmlmdW5jKSB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54Ym4gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhibgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGY4ZTlmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54Ym4KQEAgLTAsMCArMSwyMjMgQEAKKy8qIFNjcmlwdCBmb3IgLU46IG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZTsgZG9uJ3QgYWxpZ24gZGF0YSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsCisJICAgICAgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDQwMDAwMCk7IC4gPSAweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyAucmVsYS5kYXRhLnJlbC5yby4qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaWZ1bmMgICAgIDogeyAqKC5yZWxhLmlmdW5jKSB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSAuOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54YyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU4NmFkOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueGMKQEAgLTAsMCArMSwyMjcgQEAKKy8qIFNjcmlwdCBmb3IgLXogY29tYnJlbG9jOiBjb21iaW5lIGFuZCBzb3J0IHJlbG9jIHNlY3Rpb25zICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IiwKKwkgICAgICAiZWxmNjQteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlmdW5jKQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhkIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjE1MzkwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54ZApAQCAtMCwwICsxLDIyNSBAQAorLyogU2NyaXB0IGZvciBsZCAtcGllOiBsaW5rIHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMCk7IC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvIC5yZWxhLmRhdGEucmVsLnJvLiogLnJlbGEuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbGEuZGF0YSAgICAgIDogeyAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbGEudGRhdGEJICA6IHsgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWxhLnRic3MJICA6IHsgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsYS5jdG9ycyAgICAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAgIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgICA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAgIDogeyAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWxhLmxkYXRhICAgICA6IHsgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopIH0KKyAgLnJlbGEubGJzcyAgICAgIDogeyAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKSB9CisgIC5yZWxhLmxyb2RhdGEgICA6IHsgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikgfQorICAucmVsYS5pZnVuYyAgICAgOiB7ICooLnJlbGEuaWZ1bmMpIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhkYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueGRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZTgyNjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhkYwpAQCAtMCwwICsxLDIyNyBAQAorLyogU2NyaXB0IGZvciAtcGllIC16IGNvbWJyZWxvYzogcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IiwKKwkgICAgICAiZWxmNjQteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDApOyAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgKigucmVsYS5pZnVuYykKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54ZHcgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhkdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQ0NmFmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54ZHcKQEAgLTAsMCArMSwyMjYgQEAKKy8qIFNjcmlwdCBmb3IgLXBpZSAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlLCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMCk7IC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlmdW5jKQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguaWdvdC5wbHQpICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMCwgLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhuIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI3YTRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54bgpAQCAtMCwwICsxLDIyNSBAQAorLyogU2NyaXB0IGZvciAtbjogbWl4IHRleHQgYW5kIGRhdGEgb24gc2FtZSBwYWdlICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IiwKKwkgICAgICAiZWxmNjQteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvIC5yZWxhLmRhdGEucmVsLnJvLiogLnJlbGEuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbGEuZGF0YSAgICAgIDogeyAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbGEudGRhdGEJICA6IHsgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWxhLnRic3MJICA6IHsgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsYS5jdG9ycyAgICAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAgIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgICA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAgIDogeyAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWxhLmxkYXRhICAgICA6IHsgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopIH0KKyAgLnJlbGEubGJzcyAgICAgIDogeyAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKSB9CisgIC5yZWxhLmxyb2RhdGEgICA6IHsgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikgfQorICAucmVsYS5pZnVuYyAgICAgOiB7ICooLnJlbGEuaWZ1bmMpIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhyIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQwODUzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54cgpAQCAtMCwwICsxLDE1NCBAQAorLyogU2NyaXB0IGZvciBsZCAtcjogbGluayB3aXRob3V0IHJlbG9jYXRpb24gKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCisgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCisgIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCisgIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCisgIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuaW50ZXJwICAgICAgIDAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgMCA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgIDAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgMCA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgMCA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgMCA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgMDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yIDA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgIDAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgIDAgOiB7ICooLnJlbGEudGV4dCkgfQorICAucmVsYS5maW5pICAgIDAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgIDAgOiB7ICooLnJlbGEucm9kYXRhKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvIDAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8pIH0KKyAgLnJlbGEuZGF0YSAgICAwIDogeyAqKC5yZWxhLmRhdGEpIH0KKyAgLnJlbGEudGRhdGEJMCA6IHsgKigucmVsYS50ZGF0YSkgfQorICAucmVsYS50YnNzCTAgOiB7ICooLnJlbGEudGJzcykgfQorICAucmVsYS5jdG9ycyAgIDAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAwIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgMCA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAwIDogeyAqKC5yZWxhLmJzcykgfQorICAucmVsYS5sZGF0YSAgIDAgOiB7ICooLnJlbGEubGRhdGEpIH0KKyAgLnJlbGEubGJzcyAgICAwIDogeyAqKC5yZWxhLmxic3MpIH0KKyAgLnJlbGEubHJvZGF0YSAwIDogeyAqKC5yZWxhLmxyb2RhdGEpIH0KKyAgLnJlbGEuaWZ1bmMgICAwIDogeyAqKC5yZWxhLmlmdW5jKSB9CisgIC5yZWxhLnBsdCAgICAgMCA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgIDAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgIDAgOgorICB7CisgICAgKigudGV4dCAuc3R1YikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICAucm9kYXRhICAgICAgIDAgOiB7ICooLnJvZGF0YSkgfQorICAucm9kYXRhMSAgICAgIDAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzIDAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkwIDogeyAqKC50ZGF0YSkgfQorICAudGJzcwkJMCA6IHsgKigudGJzcykgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgIDAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmpjciAgICAgICAgICAwIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5keW5hbWljICAgICAgMCA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgIDAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgIDAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgIDAgOgorICB7CisgICAgKiguZGF0YSkKKyAgfQorICAuZGF0YTEgICAgICAgIDAgOiB7ICooLmRhdGExKSB9CisgIC5ic3MgICAgICAgICAgMCA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgfQorICAubGJzcyAwIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcykKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAubHJvZGF0YSAwICA6CisgIHsKKyAgICAqKC5scm9kYXRhKQorICB9CisgIC5sZGF0YSAwICA6CisgIHsKKyAgICAqKC5sZGF0YSkKKyAgfQorICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhzIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODc5Yjg1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54cwpAQCAtMCwwICsxLDIxNiBAQAorLyogU2NyaXB0IGZvciBsZCAtLXNoYXJlZDogbGluayBzaGFyZWQgbGlicmFyeSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsCisJICAgICAgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyAucmVsYS5kYXRhLnJlbC5yby4qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaWZ1bmMgICAgIDogeyAqKC5yZWxhLmlmdW5jKSB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHNjIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54c2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3MDBlNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHNjCkBAIC0wLDAgKzEsMjE5IEBACisvKiBTY3JpcHQgZm9yIC0tc2hhcmVkIC16IGNvbWJyZWxvYzogc2hhcmVkIGxpYnJhcnksIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworLyogTW9kaWZpZWQgZm9yIEFuZHJvaWQuICAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsCisJICAgICAgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgKigucmVsYS5pZnVuYykKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHN3IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54c3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViZDVkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHN3CkBAIC0wLDAgKzEsMjE3IEBACisvKiBTY3JpcHQgZm9yIC0tc2hhcmVkIC16IGNvbWJyZWxvYyAteiBub3cgLXogcmVscm86IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgICooLnJlbGEuaWZ1bmMpCisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguaWdvdC5wbHQpICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMCwgLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0Lnh1IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54dQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDUyOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54dQpAQCAtMCwwICsxLDE1NSBAQAorLyogU2NyaXB0IGZvciBsZCAtVXI6IGxpbmsgdy9vdXQgcmVsb2NhdGlvbiwgZG8gY3JlYXRlIGNvbnN0cnVjdG9ycyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsCisJICAgICAgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKKyAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKKyAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKKyAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKKyAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC5pbnRlcnAgICAgICAgMCA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAwIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgMCA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAwIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAwIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAwIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAwOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgMDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgMCA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgMCA6IHsgKigucmVsYS50ZXh0KSB9CisgIC5yZWxhLmZpbmkgICAgMCA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgMCA6IHsgKigucmVsYS5yb2RhdGEpIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gMCA6IHsgKigucmVsYS5kYXRhLnJlbC5ybykgfQorICAucmVsYS5kYXRhICAgIDAgOiB7ICooLnJlbGEuZGF0YSkgfQorICAucmVsYS50ZGF0YQkwIDogeyAqKC5yZWxhLnRkYXRhKSB9CisgIC5yZWxhLnRic3MJMCA6IHsgKigucmVsYS50YnNzKSB9CisgIC5yZWxhLmN0b3JzICAgMCA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgIDAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAwIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgIDAgOiB7ICooLnJlbGEuYnNzKSB9CisgIC5yZWxhLmxkYXRhICAgMCA6IHsgKigucmVsYS5sZGF0YSkgfQorICAucmVsYS5sYnNzICAgIDAgOiB7ICooLnJlbGEubGJzcykgfQorICAucmVsYS5scm9kYXRhIDAgOiB7ICooLnJlbGEubHJvZGF0YSkgfQorICAucmVsYS5pZnVuYyAgIDAgOiB7ICooLnJlbGEuaWZ1bmMpIH0KKyAgLnJlbGEucGx0ICAgICAwIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgMCA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgMCA6CisgIHsKKyAgICAqKC50ZXh0IC5zdHViKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIC5yb2RhdGEgICAgICAgMCA6IHsgKigucm9kYXRhKSB9CisgIC5yb2RhdGExICAgICAgMCA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzIDAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgMCA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCTAgOiB7ICooLnRkYXRhKSB9CisgIC50YnNzCQkwIDogeyAqKC50YnNzKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgMCA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuamNyICAgICAgICAgIDAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmR5bmFtaWMgICAgICAwIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgMCA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC5nb3QucGx0ICAgICAgMCA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgMCA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgMCA6IHsgKiguZGF0YTEpIH0KKyAgLmJzcyAgICAgICAgICAwIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICB9CisgIC5sYnNzIDAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC5scm9kYXRhIDAgIDoKKyAgeworICAgICooLmxyb2RhdGEpCisgIH0KKyAgLmxkYXRhIDAgIDoKKyAgeworICAgICooLmxkYXRhKQorICB9CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHcgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0Lnh3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzZlNTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0Lnh3CkBAIC0wLDAgKzEsMjI2IEBACisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYyAteiBub3cgLXogcmVscm86IGNvbWJpbmUgYW5kIHNvcnQgcmVsb2Mgc2VjdGlvbnMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHg0MDAwMDApOyAuID0gMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgICooLnJlbGEuaWZ1bmMpCisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4LngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiYzVhMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54CkBAIC0wLDAgKzEsNDcgQEAKKy8qIERlZmF1bHQgbGlua2VyIHNjcmlwdCwgZm9yIG5vcm1hbCBleGVjdXRhYmxlcyAqLworLyogTW9kaWZpZWQgZm9yIEFuZHJvaWQuICAqLworT1VUUFVUX0ZPUk1BVCgiYS5vdXQtaTM4Ni1saW51eCIsICJhLm91dC1pMzg2LWxpbnV4IiwKKwkgICAgICAiYS5vdXQtaTM4Ni1saW51eCIpCitPVVRQVVRfQVJDSChpMzg2KQorUFJPVklERSAoX19zdGFjayA9IDApOworU0VDVElPTlMKK3sKKyAgLiA9IDB4MTAyMDsKKyAgLnRleHQgOgorICB7CisgICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCisgICAgKigudGV4dCkKKyAgICAvKiBUaGUgbmV4dCBzaXggc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICBUaGUgb3JkZXIKKyAgICAgICBpcyBpbXBvcnRhbnQuICAqLworICAgICooLmR5bnJlbCkKKyAgICAqKC5oYXNoKQorICAgICooLmR5bnN5bSkKKyAgICAqKC5keW5zdHIpCisgICAgKigucnVsZXMpCisgICAgKigubmVlZCkKKyAgICBfZXRleHQgPSAuOworICAgIF9fZXRleHQgPSAuOworICB9CisgIC4gPSBBTElHTigweDEwMDApOworICAuZGF0YSA6CisgIHsKKyAgICAvKiBUaGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICAqLworICAgICooLmR5bmFtaWMpCisgICAgKiguZ290KQorICAgICooLnBsdCkKKyAgICAqKC5kYXRhKQorICAgICooLmxpbnV4LWR5bmFtaWMpIC8qIEZvciBMaW51eCBkeW5hbWljIGxpbmtpbmcuICAqLworICAgIENPTlNUUlVDVE9SUworICAgIF9lZGF0YSAgPSAgLjsKKyAgICBfX2VkYXRhICA9ICAuOworICB9CisgIC5ic3MgOgorICB7CisgICAgX19ic3Nfc3RhcnQgPSAuOworICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAuID0gQUxJR04oNCk7CisgICBfZW5kID0gLiA7CisgICBfX2VuZCA9IC4gOworICB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueGJuIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4LnhibgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWIxZTkxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4LnhibgpAQCAtMCwwICsxLDQ2IEBACisvKiBTY3JpcHQgZm9yIC1OOiBtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2U7IGRvbid0IGFsaWduIGRhdGEgKi8KK09VVFBVVF9GT1JNQVQoImEub3V0LWkzODYtbGludXgiLCAiYS5vdXQtaTM4Ni1saW51eCIsCisJICAgICAgImEub3V0LWkzODYtbGludXgiKQorT1VUUFVUX0FSQ0goaTM4NikKK1BST1ZJREUgKF9fc3RhY2sgPSAwKTsKK1NFQ1RJT05TCit7CisgIC4gPSAwOworICAudGV4dCA6CisgIHsKKyAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKKyAgICAqKC50ZXh0KQorICAgIC8qIFRoZSBuZXh0IHNpeCBzZWN0aW9ucyBhcmUgZm9yIFN1bk9TIGR5bmFtaWMgbGlua2luZy4gIFRoZSBvcmRlcgorICAgICAgIGlzIGltcG9ydGFudC4gICovCisgICAgKiguZHlucmVsKQorICAgICooLmhhc2gpCisgICAgKiguZHluc3ltKQorICAgICooLmR5bnN0cikKKyAgICAqKC5ydWxlcykKKyAgICAqKC5uZWVkKQorICAgIF9ldGV4dCA9IC47CisgICAgX19ldGV4dCA9IC47CisgIH0KKyAgLiA9IC47CisgIC5kYXRhIDoKKyAgeworICAgIC8qIFRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyBhcmUgZm9yIFN1bk9TIGR5bmFtaWMgbGlua2luZy4gICovCisgICAgKiguZHluYW1pYykKKyAgICAqKC5nb3QpCisgICAgKigucGx0KQorICAgICooLmRhdGEpCisgICAgKigubGludXgtZHluYW1pYykgLyogRm9yIExpbnV4IGR5bmFtaWMgbGlua2luZy4gICovCisgICAgQ09OU1RSVUNUT1JTCisgICAgX2VkYXRhICA9ICAuOworICAgIF9fZWRhdGEgID0gIC47CisgIH0KKyAgLmJzcyA6CisgIHsKKyAgICBfX2Jzc19zdGFydCA9IC47CisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC4gPSBBTElHTig0KTsKKyAgIF9lbmQgPSAuIDsKKyAgIF9fZW5kID0gLiA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54biBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTg1NjU2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4LnhuCkBAIC0wLDAgKzEsNDYgQEAKKy8qIFNjcmlwdCBmb3IgLW46IG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZSAqLworT1VUUFVUX0ZPUk1BVCgiYS5vdXQtaTM4Ni1saW51eCIsICJhLm91dC1pMzg2LWxpbnV4IiwKKwkgICAgICAiYS5vdXQtaTM4Ni1saW51eCIpCitPVVRQVVRfQVJDSChpMzg2KQorUFJPVklERSAoX19zdGFjayA9IDApOworU0VDVElPTlMKK3sKKyAgLiA9IDA7CisgIC50ZXh0IDoKKyAgeworICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUworICAgICooLnRleHQpCisgICAgLyogVGhlIG5leHQgc2l4IHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgVGhlIG9yZGVyCisgICAgICAgaXMgaW1wb3J0YW50LiAgKi8KKyAgICAqKC5keW5yZWwpCisgICAgKiguaGFzaCkKKyAgICAqKC5keW5zeW0pCisgICAgKiguZHluc3RyKQorICAgICooLnJ1bGVzKQorICAgICooLm5lZWQpCisgICAgX2V0ZXh0ID0gLjsKKyAgICBfX2V0ZXh0ID0gLjsKKyAgfQorICAuID0gQUxJR04oMHgxMDAwKTsKKyAgLmRhdGEgOgorICB7CisgICAgLyogVGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgICAqKC5keW5hbWljKQorICAgICooLmdvdCkKKyAgICAqKC5wbHQpCisgICAgKiguZGF0YSkKKyAgICAqKC5saW51eC1keW5hbWljKSAvKiBGb3IgTGludXggZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgICBDT05TVFJVQ1RPUlMKKyAgICBfZWRhdGEgID0gIC47CisgICAgX19lZGF0YSAgPSAgLjsKKyAgfQorICAuYnNzIDoKKyAgeworICAgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLiA9IEFMSUdOKDQpOworICAgX2VuZCA9IC4gOworICAgX19lbmQgPSAuIDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4LnhyIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4LnhyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMzNmMjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueHIKQEAgLTAsMCArMSwzNyBAQAorLyogU2NyaXB0IGZvciBsZCAtcjogbGluayB3aXRob3V0IHJlbG9jYXRpb24gKi8KK09VVFBVVF9GT1JNQVQoImEub3V0LWkzODYtbGludXgiLCAiYS5vdXQtaTM4Ni1saW51eCIsCisJICAgICAgImEub3V0LWkzODYtbGludXgiKQorT1VUUFVUX0FSQ0goaTM4NikKK1NFQ1RJT05TCit7CisgIC50ZXh0IDoKKyAgeworICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUworICAgICooLnRleHQpCisgICAgLyogVGhlIG5leHQgc2l4IHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgVGhlIG9yZGVyCisgICAgICAgaXMgaW1wb3J0YW50LiAgKi8KKyAgICAqKC5keW5yZWwpCisgICAgKiguaGFzaCkKKyAgICAqKC5keW5zeW0pCisgICAgKiguZHluc3RyKQorICAgICooLnJ1bGVzKQorICAgICooLm5lZWQpCisgIH0KKyAgLmRhdGEgOgorICB7CisgICAgLyogVGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgICAqKC5keW5hbWljKQorICAgICooLmdvdCkKKyAgICAqKC5wbHQpCisgICAgKiguZGF0YSkKKyAgICAqKC5saW51eC1keW5hbWljKSAvKiBGb3IgTGludXggZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgfQorICAuYnNzIDoKKyAgeworICAgOworICAgKiguYnNzKQorICAgKihDT01NT04pCisgICA7CisgICA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54dSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54dQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ3MTAwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4Lnh1CkBAIC0wLDAgKzEsMzggQEAKKy8qIFNjcmlwdCBmb3IgbGQgLVVyOiBsaW5rIHcvb3V0IHJlbG9jYXRpb24sIGRvIGNyZWF0ZSBjb25zdHJ1Y3RvcnMgKi8KK09VVFBVVF9GT1JNQVQoImEub3V0LWkzODYtbGludXgiLCAiYS5vdXQtaTM4Ni1saW51eCIsCisJICAgICAgImEub3V0LWkzODYtbGludXgiKQorT1VUUFVUX0FSQ0goaTM4NikKK1NFQ1RJT05TCit7CisgIC50ZXh0IDoKKyAgeworICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUworICAgICooLnRleHQpCisgICAgLyogVGhlIG5leHQgc2l4IHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgVGhlIG9yZGVyCisgICAgICAgaXMgaW1wb3J0YW50LiAgKi8KKyAgICAqKC5keW5yZWwpCisgICAgKiguaGFzaCkKKyAgICAqKC5keW5zeW0pCisgICAgKiguZHluc3RyKQorICAgICooLnJ1bGVzKQorICAgICooLm5lZWQpCisgIH0KKyAgLmRhdGEgOgorICB7CisgICAgLyogVGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgICAqKC5keW5hbWljKQorICAgICooLmdvdCkKKyAgICAqKC5wbHQpCisgICAgKiguZGF0YSkKKyAgICAqKC5saW51eC1keW5hbWljKSAvKiBGb3IgTGludXggZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICAuYnNzIDoKKyAgeworICAgOworICAgKiguYnNzKQorICAgKihDT01NT04pCisgICA7CisgICA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJhc2FuLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGliYXNhbi5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMGYyZTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGliYXNhbi5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJhc2FuLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmFzYW4uc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMGNhOTc3MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJhc2FuLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmFzYW4uc28uMC4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGliYXNhbi5zby4wIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmFzYW4uc28uMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4wY2E5NzcxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmFzYW4uc28uMApAQCAtMCwwICsxIEBACitsaWJhc2FuLnNvLjAuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmFzYW4uc28uMC4wLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGliYXNhbi5zby4wLjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZDc4ZWI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmFzYW4uc28uMC4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmFzYW5fcHJlaW5pdC5vIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmFzYW5fcHJlaW5pdC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzRkNDMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGliYXNhbl9wcmVpbml0Lm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmF0b21pYy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmF0b21pYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MTEzNGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGliYXRvbWljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmF0b21pYy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJhdG9taWMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uM2Y4NDFkNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJhdG9taWMuc28KQEAgLTAsMCArMSBAQAorbGliYXRvbWljLnNvLjEuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmF0b21pYy5zby4xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmF0b21pYy5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjNmODQxZDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGliYXRvbWljLnNvLjEKQEAgLTAsMCArMSBAQAorbGliYXRvbWljLnNvLjEuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmF0b21pYy5zby4xLjAuMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJhdG9taWMuc28uMS4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGRhNGRjNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJhdG9taWMuc28uMS4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmdjY19zLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmdjY19zLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjgzMDMzZjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGliZ2NjX3Muc28KQEAgLTAsMCArMSBAQAorbGliZ2NjX3Muc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJnY2Nfcy5zby4xIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmdjY19zLnNvLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmYjY1NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJnY2Nfcy5zby4xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJpdG0uYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJpdG0uYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGU2YjQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYml0bS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJpdG0uc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGliaXRtLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmNkOWQ2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGliaXRtLnNvCkBAIC0wLDAgKzEgQEAKK2xpYml0bS5zby4xLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJpdG0uc28uMSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJpdG0uc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jZDlkNmQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYml0bS5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYml0bS5zby4xLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJpdG0uc28uMS4wLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGliaXRtLnNvLjEuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzNmRjNGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGliaXRtLnNvLjEuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJpdG0uc3BlYyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJpdG0uc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTFlMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYml0bS5zcGVjCkBAIC0wLDAgKzEsMyBAQAorIyBUaGlzIHNwZWMgZmlsZSBpcyByZWFkIGJ5IGdjYyB3aGVuIGxpbmtpbmcuICBJdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCisjIHN0YW5kYXJkIGxpYnJhcmllcyB3ZSBuZWVkIGluIG9yZGVyIHRvIGxpbmsgd2l0aCAtZmdudS10bQorKmxpbmtfaXRtOiAtbGl0bSAle3N0YXRpYzogfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnNzcC5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnNzcC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZGUwM2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGlic3NwLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnNzcC5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJzc3Auc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjc2NTA4NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJzc3Auc28KQEAgLTAsMCArMSBAQAorbGlic3NwLnNvLjAuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnNzcC5zby4wIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnNzcC5zby4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY3NjUwODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGlic3NwLnNvLjAKQEAgLTAsMCArMSBAQAorbGlic3NwLnNvLjAuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnNzcC5zby4wLjAuMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJzc3Auc28uMC4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTNiNjIwMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJzc3Auc28uMC4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnNzcF9ub25zaGFyZWQuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJzc3Bfbm9uc2hhcmVkLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBlNzZlMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJzc3Bfbm9uc2hhcmVkLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnN0ZGMrKy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnN0ZGMrKy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjkwMGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGlic3RkYysrLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnN0ZGMrKy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJzdGRjKysuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNGYyY2EyZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJzdGRjKysuc28KQEAgLTAsMCArMSBAQAorbGlic3RkYysrLnNvLjYuMC4xOQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJzdGRjKysuc28uNiBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJzdGRjKysuc28uNgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40ZjJjYTJmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnN0ZGMrKy5zby42CkBAIC0wLDAgKzEgQEAKK2xpYnN0ZGMrKy5zby42LjAuMTkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGlic3RkYysrLnNvLjYuMC4xOSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJzdGRjKysuc28uNi4wLjE5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg2Y2Q0NjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGlic3RkYysrLnNvLjYuMC4xOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGlic3RkYysrLnNvLjYuMC4xOS1nZGIucHkgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGlic3RkYysrLnNvLjYuMC4xOS1nZGIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkYjk0YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJzdGRjKysuc28uNi4wLjE5LWdkYi5weQpAQCAtMCwwICsxLDYwIEBACisjIC0qLSBweXRob24gLSotCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitpbXBvcnQgc3lzCitpbXBvcnQgZ2RiCitpbXBvcnQgb3MKK2ltcG9ydCBvcy5wYXRoCisKK3B5dGhvbmRpciA9ICcvdXNyL2xvY2FsL2dvb2dsZS9ob21lL2NoaC93b3JrZGlyL3ByZWNpc2U3LzEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00Ljgvc2hhcmUvZ2NjLTQuOC9weXRob24nCitsaWJkaXIgPSAnL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9jaGgvd29ya2Rpci9wcmVjaXNlNy8xL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIvLi4vbGliMzInCisKKyMgVGhpcyBmaWxlIG1pZ2h0IGJlIGxvYWRlZCB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQgb2JqZmlsZS4gIFRoaXMKKyMgY2FuIGhhcHBlbiBpZiB0aGUgdXNlciBsb2FkcyBpdCBtYW51YWxseS4gIEluIHRoaXMgY2FzZSB3ZSBkb24ndAorIyB1cGRhdGUgc3lzLnBhdGg7IGluc3RlYWQgd2UganVzdCBob3BlIHRoZSB1c2VyIG1hbmFnZWQgdG8gZG8gdGhhdAorIyBiZWZvcmVoYW5kLgoraWYgZ2RiLmN1cnJlbnRfb2JqZmlsZSAoKSBpcyBub3QgTm9uZToKKyAgICAjIFVwZGF0ZSBtb2R1bGUgcGF0aC4gIFdlIHdhbnQgdG8gZmluZCB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tIGxpYmRpcgorICAgICMgdG8gcHl0aG9uZGlyLCBhbmQgdGhlbiB3ZSB3YW50IHRvIGFwcGx5IHRoYXQgcmVsYXRpdmUgcGF0aCB0byB0aGUKKyAgICAjIGRpcmVjdG9yeSBob2xkaW5nIHRoZSBvYmpmaWxlIHdpdGggd2hpY2ggdGhpcyBmaWxlIGlzIGFzc29jaWF0ZWQuCisgICAgIyBUaGlzIHByZXNlcnZlcyByZWxvY2F0YWJpbGl0eSBvZiB0aGUgZ2NjIHRyZWUuCisKKyAgICAjIERvIGEgc2ltcGxlIG5vcm1hbGl6YXRpb24gdGhhdCByZW1vdmVzIGR1cGxpY2F0ZSBzZXBhcmF0b3JzLgorICAgIHB5dGhvbmRpciA9IG9zLnBhdGgubm9ybXBhdGggKHB5dGhvbmRpcikKKyAgICBsaWJkaXIgPSBvcy5wYXRoLm5vcm1wYXRoIChsaWJkaXIpCisKKyAgICBwcmVmaXggPSBvcy5wYXRoLmNvbW1vbnByZWZpeCAoW2xpYmRpciwgcHl0aG9uZGlyXSkKKyAgICAjIEluIHNvbWUgYml6YXJyZSBjb25maWd1cmF0aW9uIHdlIG1pZ2h0IGhhdmUgZm91bmQgYSBtYXRjaCBpbiB0aGUKKyAgICAjIG1pZGRsZSBvZiBhIGRpcmVjdG9yeSBuYW1lLgorICAgIGlmIHByZWZpeFstMV0gIT0gJy8nOgorICAgICAgICBwcmVmaXggPSBvcy5wYXRoLmRpcm5hbWUgKHByZWZpeCkgKyAnLycKKworICAgICMgU3RyaXAgb2ZmIHRoZSBwcmVmaXguCisgICAgcHl0aG9uZGlyID0gcHl0aG9uZGlyW2xlbiAocHJlZml4KTpdCisgICAgbGliZGlyID0gbGliZGlyW2xlbiAocHJlZml4KTpdCisKKyAgICAjIENvbXB1dGUgdGhlICIuLiJzIG5lZWRlZCB0byBnZXQgZnJvbSBsaWJkaXIgdG8gdGhlIHByZWZpeC4KKyAgICBkb3Rkb3RzID0gKCcuLicgKyBvcy5zZXApICogbGVuIChsaWJkaXIuc3BsaXQgKG9zLnNlcCkpCisKKyAgICBvYmpmaWxlID0gZ2RiLmN1cnJlbnRfb2JqZmlsZSAoKS5maWxlbmFtZQorICAgIGRpcl8gPSBvcy5wYXRoLmpvaW4gKG9zLnBhdGguZGlybmFtZSAob2JqZmlsZSksIGRvdGRvdHMsIHB5dGhvbmRpcikKKworICAgIGlmIG5vdCBkaXJfIGluIHN5cy5wYXRoOgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgZGlyXykKKworIyBMb2FkIHRoZSBwcmV0dHktcHJpbnRlcnMuCitmcm9tIGxpYnN0ZGN4eC52Ni5wcmludGVycyBpbXBvcnQgcmVnaXN0ZXJfbGlic3RkY3h4X3ByaW50ZXJzCityZWdpc3Rlcl9saWJzdGRjeHhfcHJpbnRlcnMgKGdkYi5jdXJyZW50X29iamZpbGUgKCkpCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGlic3VwYysrLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliMzIvbGlic3VwYysrLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQyYjhlNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWIzMi9saWJzdXBjKysuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliYXNhbi5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmFzYW4uYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzRiYTRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmFzYW4uYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliYXNhbi5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJhc2FuLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjBjYTk3NzEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliYXNhbi5zbwpAQCAtMCwwICsxIEBACitsaWJhc2FuLnNvLjAuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmFzYW4uc28uMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJhc2FuLnNvLjAKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMGNhOTc3MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJhc2FuLnNvLjAKQEAgLTAsMCArMSBAQAorbGliYXNhbi5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJhc2FuLnNvLjAuMC4wIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmFzYW4uc28uMC4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTQ0Mjc5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJhc2FuLnNvLjAuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJhc2FuX3ByZWluaXQubyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJhc2FuX3ByZWluaXQubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGNhMzRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmFzYW5fcHJlaW5pdC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJhdG9taWMuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJhdG9taWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDYyZDBhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmF0b21pYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJhdG9taWMuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliYXRvbWljLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjNmODQxZDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliYXRvbWljLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmF0b21pYy5zby4xLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJhdG9taWMuc28uMSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJhdG9taWMuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zZjg0MWQ2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmF0b21pYy5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmF0b21pYy5zby4xLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJhdG9taWMuc28uMS4wLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliYXRvbWljLnNvLjEuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ0MWYwZjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliYXRvbWljLnNvLjEuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJnY2Nfcy5zbyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJnY2Nfcy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44MzAzM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmdjY19zLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmdjY19zLnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliZ2NjX3Muc28uMSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJnY2Nfcy5zby4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MWMwMWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliZ2NjX3Muc28uMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliaXRtLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliaXRtLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3YzY3ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJpdG0uYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliaXRtLnNvIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYml0bS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jZDlkNmQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYml0bS5zbwpAQCAtMCwwICsxIEBACitsaWJpdG0uc28uMS4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliaXRtLnNvLjEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliaXRtLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uY2Q5ZDZkMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJpdG0uc28uMQpAQCAtMCwwICsxIEBACitsaWJpdG0uc28uMS4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliaXRtLnNvLjEuMC4wIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYml0bS5zby4xLjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYmZhYzE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYml0bS5zby4xLjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliaXRtLnNwZWMgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGliaXRtLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxZTBkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJpdG0uc3BlYwpAQCAtMCwwICsxLDMgQEAKKyMgVGhpcyBzcGVjIGZpbGUgaXMgcmVhZCBieSBnY2Mgd2hlbiBsaW5raW5nLiAgSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQorIyBzdGFuZGFyZCBsaWJyYXJpZXMgd2UgbmVlZCBpbiBvcmRlciB0byBsaW5rIHdpdGggLWZnbnUtdG0KKypsaW5rX2l0bTogLWxpdG0gJXtzdGF0aWM6IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJzc3AuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJzc3AuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGVjZjllCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnNzcC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJzc3Auc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY3NjUwODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnNzcC5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJzc3Auc28uMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJzc3Auc28uMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42NzY1MDg0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnNzcC5zby4wCkBAIC0wLDAgKzEgQEAKK2xpYnNzcC5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJzc3Auc28uMC4wLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLnNvLjAuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE1NDkzMjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLnNvLjAuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJzc3Bfbm9uc2hhcmVkLmEgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlic3NwX25vbnNoYXJlZC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NGY5OWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlic3NwX25vbnNoYXJlZC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysuYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTYzOTFmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysuc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjRmMmNhMmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnN0ZGMrKy5zby42LjAuMTkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvLjYgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNGYyY2EyZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysuc28uNgpAQCAtMCwwICsxIEBACitsaWJzdGRjKysuc28uNi4wLjE5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zby42LjAuMTkgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvLjYuMC4xOQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNmUzOTkzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zby42LjAuMTkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zby42LjAuMTktZ2RiLnB5IGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zby42LjAuMTktZ2RiLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyN2NmY2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvLjYuMC4xOS1nZGIucHkKQEAgLTAsMCArMSw2MCBAQAorIyAtKi0gcHl0aG9uIC0qLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworaW1wb3J0IHN5cworaW1wb3J0IGdkYgoraW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAorCitweXRob25kaXIgPSAnL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9jaGgvd29ya2Rpci9wcmVjaXNlNy8xL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3NoYXJlL2djYy00LjgvcHl0aG9uJworbGliZGlyID0gJy91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvY2hoL3dvcmtkaXIvcHJlY2lzZTcvMS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliLy4uL2xpYjY0JworCisjIFRoaXMgZmlsZSBtaWdodCBiZSBsb2FkZWQgd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50IG9iamZpbGUuICBUaGlzCisjIGNhbiBoYXBwZW4gaWYgdGhlIHVzZXIgbG9hZHMgaXQgbWFudWFsbHkuICBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3QKKyMgdXBkYXRlIHN5cy5wYXRoOyBpbnN0ZWFkIHdlIGp1c3QgaG9wZSB0aGUgdXNlciBtYW5hZ2VkIHRvIGRvIHRoYXQKKyMgYmVmb3JlaGFuZC4KK2lmIGdkYi5jdXJyZW50X29iamZpbGUgKCkgaXMgbm90IE5vbmU6CisgICAgIyBVcGRhdGUgbW9kdWxlIHBhdGguICBXZSB3YW50IHRvIGZpbmQgdGhlIHJlbGF0aXZlIHBhdGggZnJvbSBsaWJkaXIKKyAgICAjIHRvIHB5dGhvbmRpciwgYW5kIHRoZW4gd2Ugd2FudCB0byBhcHBseSB0aGF0IHJlbGF0aXZlIHBhdGggdG8gdGhlCisgICAgIyBkaXJlY3RvcnkgaG9sZGluZyB0aGUgb2JqZmlsZSB3aXRoIHdoaWNoIHRoaXMgZmlsZSBpcyBhc3NvY2lhdGVkLgorICAgICMgVGhpcyBwcmVzZXJ2ZXMgcmVsb2NhdGFiaWxpdHkgb2YgdGhlIGdjYyB0cmVlLgorCisgICAgIyBEbyBhIHNpbXBsZSBub3JtYWxpemF0aW9uIHRoYXQgcmVtb3ZlcyBkdXBsaWNhdGUgc2VwYXJhdG9ycy4KKyAgICBweXRob25kaXIgPSBvcy5wYXRoLm5vcm1wYXRoIChweXRob25kaXIpCisgICAgbGliZGlyID0gb3MucGF0aC5ub3JtcGF0aCAobGliZGlyKQorCisgICAgcHJlZml4ID0gb3MucGF0aC5jb21tb25wcmVmaXggKFtsaWJkaXIsIHB5dGhvbmRpcl0pCisgICAgIyBJbiBzb21lIGJpemFycmUgY29uZmlndXJhdGlvbiB3ZSBtaWdodCBoYXZlIGZvdW5kIGEgbWF0Y2ggaW4gdGhlCisgICAgIyBtaWRkbGUgb2YgYSBkaXJlY3RvcnkgbmFtZS4KKyAgICBpZiBwcmVmaXhbLTFdICE9ICcvJzoKKyAgICAgICAgcHJlZml4ID0gb3MucGF0aC5kaXJuYW1lIChwcmVmaXgpICsgJy8nCisKKyAgICAjIFN0cmlwIG9mZiB0aGUgcHJlZml4LgorICAgIHB5dGhvbmRpciA9IHB5dGhvbmRpcltsZW4gKHByZWZpeCk6XQorICAgIGxpYmRpciA9IGxpYmRpcltsZW4gKHByZWZpeCk6XQorCisgICAgIyBDb21wdXRlIHRoZSAiLi4icyBuZWVkZWQgdG8gZ2V0IGZyb20gbGliZGlyIHRvIHRoZSBwcmVmaXguCisgICAgZG90ZG90cyA9ICgnLi4nICsgb3Muc2VwKSAqIGxlbiAobGliZGlyLnNwbGl0IChvcy5zZXApKQorCisgICAgb2JqZmlsZSA9IGdkYi5jdXJyZW50X29iamZpbGUgKCkuZmlsZW5hbWUKKyAgICBkaXJfID0gb3MucGF0aC5qb2luIChvcy5wYXRoLmRpcm5hbWUgKG9iamZpbGUpLCBkb3Rkb3RzLCBweXRob25kaXIpCisKKyAgICBpZiBub3QgZGlyXyBpbiBzeXMucGF0aDoKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGRpcl8pCisKKyMgTG9hZCB0aGUgcHJldHR5LXByaW50ZXJzLgorZnJvbSBsaWJzdGRjeHgudjYucHJpbnRlcnMgaW1wb3J0IHJlZ2lzdGVyX2xpYnN0ZGN4eF9wcmludGVycworcmVnaXN0ZXJfbGlic3RkY3h4X3ByaW50ZXJzIChnZGIuY3VycmVudF9vYmpmaWxlICgpKQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN1cGMrKy5hIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN1cGMrKy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YmEyYWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlic3VwYysrLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnRzYW4uYSBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJ0c2FuLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2MjkyNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJ0c2FuLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnRzYW4uc28gYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlidHNhbi5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43ZTgxNTM4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnRzYW4uc28KQEAgLTAsMCArMSBAQAorbGlidHNhbi5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJ0c2FuLnNvLjAgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlidHNhbi5zby4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjdlODE1MzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlidHNhbi5zby4wCkBAIC0wLDAgKzEgQEAKK2xpYnRzYW4uc28uMC4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlidHNhbi5zby4wLjAuMCBiL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3g4Nl82NC1saW51eC9saWI2NC9saWJ0c2FuLnNvLjAuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI3ZTgxNWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliNjQvbGlidHNhbi5zby4wLjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCg==